diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..f180e35 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,478 @@ +# CI workflows + +CI is where the properties that cannot be checked on one laptop get checked: a second architecture, a +hostile locale, and the corpus sweep. That is why there is more here than a single build job. + +> **Retracted, and worth keeping as a caution.** The first version of this file opened *"There is no +> JDK and no Maven on the machine these workflows were authored on, so CI is the only place this +> project is verified at all."* **That was wrong** — Temurin 21 and Maven 3.9.16 are installed, and +> Gradle-managed JDKs were there all along, in a directory the original survey did not check. Several +> design decisions below were made under the false belief and are flagged where they were. Anything +> here that says "could not be confirmed locally" should be read as a claim about a specific past +> moment, not a standing fact — check before trusting it. + +Five workflows: + +- **`ci.yaml`** — the normal build. Fast enough for every push. +- **`conformance.yaml`** — the PROJ 9.8.1 corpus sweep and the vendoring guarantee. Kept separate so + the corpus never sits in the path of a normal build. +- **`determinism.yaml`** — the cross-architecture bit-identity proof. Separate from `ci.yaml`'s + `determinism` job, which checks only that the suite still *passes* per environment; this one + compares raw-bit output between architectures. It is also **the only workflow here whose Java side + has actually been executed** — see the bottom of this file. +- **`golden.yaml`** — the golden-master behavioural regression sweep. Added 2026-08-01. +- **`bench.yaml`** — Tiers 1 and 2 of the performance gate. Added 2026-08-01. + +> **Why the last two were added, and what their absence had cost.** `golden` and `benchmark` are +> absent from the root pom's default `` — deliberately, so `mvn install` stays fast and +> `core` stays dependency-free — and until 2026-08-01 **no workflow passed `-Pgolden` or `-Pbench` +> either**. The consequences were not theoretical: +> +> * The tree's only behavioural change detector ran **only when a human typed the command**. +> * `golden/pom.xml` states a signal — *"if a change to core breaks the default-profile compile of +> `golden/src/main`, that is a signal, not an inconvenience"* — that **could not fire, because +> nothing in CI compiled `golden/src/main`**. +> * `benchmark/pom.xml` calls its Tier 1 and Tier 2 checks *"blocking PR gates"*. **No job invoked +> `GateChecker`.** +> +> Both new jobs were **blocking and red** when added, on real findings, and that was the intended +> state. **`bench` / `gate` is now GREEN** — the baselines were captured and committed, and the job +> was re-run to confirm it (see below). `golden` is still red on its triage backlog, which is what +> it is for. See "Jobs expected to fail today" below. Neither may be made `continue-on-error` — +> `golden/README.md` says so explicitly, and the reason generalises: a `status: pending` rule or an +> unpinned-but-named threshold is visible in the diff and self-correcting, while a +> `continue-on-error` job is invisible and fails never. + +## Jobs + +| Workflow | Job | Blocking? | Trigger | What it proves | Expected runtime | +|---|---|---|---|---|---| +| `ci.yaml` | `build-and-test` (JDK 17, 21) | **blocking** — 21 green, **17 fails today** | push, PR | All seven reactor modules compile and their fast tests pass on both supported JDKs. This is the gate. | ~4–8 min per leg | +| `ci.yaml` | `jdk-ea` | advisory | push, PR | The next JDK line (27-ea) still accepts `8` and the felix bundle plugin still works. Early warning, months ahead of anyone using that JDK. | ~5 min | +| `ci.yaml` | `jdk8-runtime` | advisory | push, PR | Jars built on JDK 21 actually *run* on a real JDK 8, and every emitted class file is class-file major version 52. Keeps `8` from being an unverified promise. | ~5 min | +| `ci.yaml` | `determinism` — `en_US/UTF-8/UTC/x64` | **blocking** | push, PR | `core` passes in the reference environment. | ~3 min | +| `ci.yaml` | `determinism` — `tr_TR/UTF-8/Europe-Istanbul/x64` | advisory — **fails today** | push, PR | No result depends on the default `Locale`. Currently red, see below. | ~3 min | +| `ci.yaml` | `determinism` — `de_DE/ISO-8859-1/Asia-Kolkata/x64` | advisory | push, PR | No result depends on the default charset, decimal separator, or a half-hour UTC offset. | ~3 min | +| `ci.yaml` | `determinism` — `en_US/UTF-8/UTC/arm64` | advisory | push, PR | Cross-architecture *smoke*: `core`'s suite still passes on AArch64. **Superseded for the `StrictMath` claim** by `determinism.yaml`, which compares bits rather than pass/fail. | ~4 min | +| `determinism.yaml` | `bits` (6 legs: x86-64 × aarch64, JDK 11/17/21) | **blocking** | push, PR | Each leg asserts the committed 54,265-result raw-bit golden for `StrictMath` and `FastStrictTrig`. Six green legs = six architecture/JDK combinations produced identical bits. | ~3–5 min per leg | +| `determinism.yaml` | `cross-arch` | **blocking** | push, PR | (a) every leg reported; (b) **at least one leg shows `Math` diverging** from the golden — the non-vacuity check, which cannot be made inside a leg; (c) reports the NaN-payload carve-out across architectures. | ~1 min | +| `conformance.yaml` | `corpus` | **blocking** — green today | push, PR | `mvn -Pconformance -pl conformance -am verify` with `-Dtest='…conformance.**.*Test'`: the full vendored gie/GIGS sweep (**7,441 / 7,900**, `regressed 0`), diffed against the checked-in expected-outcome manifest. Catches any pass→fail regression. | sweep itself **0.7 s**, whole reactor **8 s** warm; the 90-min timeout is all cold cache, untuned | +| `conformance.yaml` | `vendored-corpus-matches-upstream` | **blocking** | push, PR | The vendored corpus is byte-for-byte what PROJ `9.8.1` (`f08fa86…`) produces: manifest verified with `shasum -a 256 -c`, `sync-upstream.sh` re-run against a real PROJ checkout, then `git diff --exit-code`. | ~4–6 min (a full PROJ clone dominates) | +| `conformance.yaml` | `upstream-drift` | advisory | weekly cron (Mon 04:17 UTC), `workflow_dispatch` | What syncing from PROJ **`master`** instead of the pin would change. A news feed, so upstream corpus changes are known before re-pin time. Never fails the build. | ~4–6 min | +| `golden.yaml` | `golden` | **blocking** — **fails today** | push, PR, `workflow_dispatch` | `mvn -Pgolden -pl golden -am verify`: generate 53,430 rows from the working tree, merge-join against `baseline/1.4.3`, apply `rules.yaml`. Fails on any `UNEXPLAINED` row, `DEAD_RULE`, `PENDING_RULE_FIRED`, `EXPIRED_RULE` or `COUNT_MISMATCH`. | ~20 s of sweep on top of the reactor build | +| `bench.yaml` | `gate` | **blocking** — **green today** | push, PR, `workflow_dispatch` | `run-gate.sh --quick --require-baseline`: Tier 1 allocation bytes/op and Tier 2 deterministic transcendental call counts, over **245 arms** in 10 shards, **245 gated, 0 EXCLUDED**. | **21.4 min** measured for `--quick` (Temurin 21 / aarch64, in the container, 2026-08-03; was 15.8 min at 181 arms); a full run is ~90 min. Still never timed on a runner | + +## Jobs expected to fail today, and why + +> **Every figure in this section was re-derived on 2026-08-02 by running the job's exact command**, +> not carried forward. Four of them had gone stale — the corpus totals, the golden rule count, the +> whole `bench` entry, and the absence of `build-and-test`. Numbers here are true once; re-measure +> before quoting. + +- **~~`build-and-test` / the JDK 17 leg~~ — FIXED 2026-08-02. The three tests now SKIP, with the + reason printed, and a skip is reported as a skip.** Re-measured in the container on 2026-08-03: + `mvn -B clean install` exits **0** with javadoc enabled, all seven reactor modules, **2,320 tests + and 0 failures, 4 skipped** (`core` **1,917** / 3 skipped, `conformance` 345 / 1 skipped, `db` 52, + `geoapi` 6, `grids-us-legacy` 0), in 223 surefire report files. + + The finding as recorded was: the JDK **17** leg failed on three `core` tests that have nothing to + do with the build — `FastStrictTrigAllocationTest.directCallsAllocateNothing`, + `FastStrictTrigAllocationTest.strictMathAllocationTiersWithArgumentMagnitude` and + `Clenshaw6AllocationTest.theStrictMathFormStillAllocates`. All three were **non-vacuity premise + assertions**: they exist to prove `FastStrictTrig` is buying something, by requiring + `StrictMath.sin/cos/tan` to allocate. On JDK 17 they measure **0.0 B/op**, so the premise check + fired. Reproduced 5×: Corretto 17.0.20 failed 3/3 twice; Corretto 21.0.12, Corretto 25.0.4 and + Temurin 21.0.11 all passed 10/10 — a **JDK property, not a vendor difference and not a flake**. + + **What changed, and one detail that matters for anyone re-reading the tests.** The guard is + `requirePureJavaStrictMath` (`FastStrictTrigAllocationTest:165-175`) and the equivalent inline + block at `Clenshaw6AllocationTest:232-242`. **It probes the capability, not the version** — it + asks whether this JVM's `StrictMath.sin/cos/tan` are the pure-Java `FdLibm` port or native JNI, + and reports which, the vm name, the version, the arch, and whether `java.lang.FdLibm$Sin` exists. + So a future JDK that moves the boundary again is handled without an edit. The reason goes to + **stdout as well as into the `Assume`**, deliberately, so it is visible in a build log and not + only in the surefire XML. + + **The premise assertion was split, not weakened.** `directCallsAllocateNothing` — the first of the + three names above — is now **unconditional and green on every JDK**, because `FastStrictTrig`'s own + 0 B/op is a fact about `FastStrictTrig`. Only the arms that require `StrictMath` to allocate skip: + `strictMathAllocatesWhereItsImplementationIsPureJava`, `strictMathAllocationTiersWithArgumentMagnitude` + and `Clenshaw6AllocationTest.theStrictMathFormStillAllocates`. The guard is **nativeness, not the + measurement**, which is the part that keeps it able to fail: a pure-Java `StrictMath` that stopped + allocating would still be caught. It is *not* the db javadoc failure below, which is also fixed. +- **`build-and-test`, the db javadoc failure — fixed 2026-08-02, recorded because it was invisible + for a long time.** `mvn clean install` failed in `neoproj4j-db` with + `error: No source files for package org.locationtech.proj4j.db.gen`. `db/pom.xml` declares an + `Automatic-Module-Name`, which puts maven-javadoc-plugin into module mode (`--module-path` with + the module's own jar, plus `--patch-module`), while the *same* pom's jar plugin excludes + `org/locationtech/proj4j/db/gen/**`. The module's package set is read from that jar, so `gen` is + not in it — but the plugin's generated `packages` file still listed it. **It needed both + settings**: an A/B/C showed unmodified → exit 1, without the jar exclude → exit 0, without + `Automatic-Module-Name` → exit 0. Fixed by scoping javadoc instead of dropping either, with + `org.locationtech.proj4j.db.gen` — the same pattern + `geoapi/pom.xml` already uses for `…geoapi.spi`. This was structurally unreachable until the + reactor first got as far as `db`, which is why it appears only now. +- **`determinism` / `tr_TR`.** `core/src/main/java/org/locationtech/proj4j/io/Proj4FileReader.java:41` + calls `authorityCode.toLowerCase()` with no `Locale`. Under `tr_TR` the Turkish casing rule maps + `I` to dotless `ı`, so `"ESRI"` becomes `"esrı"`, the resource `proj4/nad/esri` is never found, and + all 2,954 ESRI codes are unreachable. The leg is `continue-on-error: true` so it is a + green-when-fixed signal rather than a permanent red. **Remove `advisory: true` from that matrix + entry when the `toLowerCase(Locale.ROOT)` fix lands.** +- **`conformance` / `corpus`** is no longer in this list. The job's exact command has been run + locally and is green — **7,441 / 7,900 genuine passes with `regressed 0`**, re-measured + 2026-08-02 (it read 7,378 / 7,895 on 2026-08-01; both the numerator and the denominator have + moved, so quote the pair, never one of them). It has been shown to go red both on an injected + regression and on an absent baseline. See the section at the end of this file. The *YAML* has + still never executed on a runner; treat the first run as its first test. +- **`jdk-ea`** goes yellow rather than red whenever Adoptium has no `27-ea` build. That is the + correct outcome for an advisory signal; bump the version each time a JDK GAs. + +- **`golden` / `golden`.** Still red, on **2,291 `UNEXPLAINED` rows**. Re-measured 2026-08-03 in the + container by running the job's exact command (exit 1): + + ``` + 12,012 UNCHANGED · 41,418 CHANGED · 0 ADDED · 0 REMOVED · 39,127 INTENDED · 2,291 UNEXPLAINED + ``` + + **The headline has now held at 2,291 across three readings while the line underneath it moved + twice**, and that is the reusable point, not a coincidence: + + | date | UNCHANGED | CHANGED | INTENDED | UNEXPLAINED | + |---|---:|---:|---:|---:| + | 2026-08-01 | 12,023 | 41,407 | 39,116 | **2,291** | + | 2026-08-02 | 12,014 | 41,416 | 39,125 | **2,291** | + | 2026-08-03 | 12,012 | 41,418 | 39,127 | **2,291** | + + Each time, rows moved from UNCHANGED into CHANGED and were **all** absorbed by rules. The last two + are `LambertAzimuthalEqualAreaProjection`'s `Math.hypot` → `MathHelpers.norm2` conversion, claimed + by the new rule `NUM-LAEA-HYPOT-TO-NORM2` with `expected_rows: 2` and both keys **enumerated** — + `proj4-epsg.csv:00619` (EPSG:4326→2163) and `proj4-epsg.csv:01495` (EPSG:4326→3409). **A stable + headline is not a stable measurement — check the whole line.** + + That the rule was needed at all was surfaced by the count pinning, not by a human: those 2 rows + landed inside `NUM-KARNEY-LATITUDE-CORE`'s territory and tripped `COUNT_MISMATCH` at 19,326 against + its pin of 19,324. **That is the naturally occurring positive control for `expected_rows` pinning**, + and a globbed rule would have absorbed them in silence. + + The backlog is other streams' changes that no rule has claimed yet, and it belongs to those streams, + not to this workflow. `golden/README.md`'s triage sections break it down by owner. **No + `COUNT_MISMATCH`, no `DEAD_RULE`, no `EXPIRED_RULE`, no `PENDING_RULE_FIRED`** in the same run, and + `GoldenRulesTest` is 14/14 green. There are now **42 rules**, not the 41 this file said a day ago + nor the 38 `golden/README.md` said before that; all 42 are `status: active` and all 42 have a pinned + integer `expected_rows` — counted two ways, `grep -c '^ - id:'` and a YAML parse, which agree, and + the gate prints `rules.yaml: 42/42 rules carry a pinned expected_rows` as a third. The nine `TBD` + tokens left in `rules.yaml` are all inside comments recording why something is *not* TBD. The job + goes green when the backlog is claimed, one rule at a time. + +- **`bench` / `gate` is no longer in this list — it is GREEN.** Re-derived 2026-08-03 in the container + (`./docker/run.sh bench`, which runs the job's exact command): + **`GATE PASSED (0 warning(s))`, exit 0, 0 breaches, 245 gated, 0 EXCLUDED, 245 arms**, with the + non-vacuity line `245 of 245 arms carry an allocation measurement`, in **21 m 23 s**. + + **`181 arms` was right on 2026-08-02 and is now wrong by 64.** `BulkTransformBenchmark` moved out of + `org.locationtech.proj4j.benchmark.staged` and `run-gate.sh` stopped passing `-e '\.staged\.'`, so + the bulk API — the one the consumer is actually told to use — is measured for the first time; its 56 + non-`loopOfSinglePoint` arms are gated at a hard **0 B/op**, `required: true, ratchetable: false`. + + **`9 CrsParseBenchmark arms are reported but not gated (tier1Gated: false)` is also now wrong.** No + rule in the file carries `tier1Gated` at all. See `benchmark/README.md`'s Coverage section for the + whole arc — the exclusion was written with an exit condition, the condition was met by + `io/InitFileCache`, and the three fields were deleted together. + + What this file said before that — *"187 of the gate's thresholds are `TBD`, 29 in + `allocation-baseline.json` (with an empty `ratchets` block) and 158 in `op-counts.json`"* — was + **stale in every part, including the paths**. Both baselines are captured, committed and live at + `benchmark/src/main/resources/baseline/`. Re-counted 2026-08-03 by walking the JSON: + + | | rules / pairs | `ratchets` | `TBD` leaves | + |---|---|---|---| + | `allocation-baseline.json` | 25 rules | **171** | **2** | + | `op-counts.json` | 8 pairs / 160 leaves | — | **0** | + + The 2 remaining `TBD`s are not unpinned thresholds: both are a `targetBytesPerOp` on a rule whose + `maxBytesPerOp` is a real number — `transform-cache-miss` (1136) and `crs-parse` (4112) — i.e. the + *policy* column is open while the *ratchet* column gates. `--require-baseline` therefore has nothing + left to reject, which is why the job is green rather than merely quiet. + + **Wiring `--require-baseline` in before the capture rather than after was the right call** and is + worth keeping on the record: a green job over 187 unpinned thresholds measures nothing and says + it passed, which is the exact failure this workflow was added to end. Re-record with: + + ```bash + cd benchmark && ./run-gate.sh --record # then commit both baseline JSON files + ``` + + **Ratchet portability is still unproven and the first runner execution is its test.** The capture + was taken on Temurin 21 / aarch64 / macOS and confirmed green there today; this job runs Temurin + 21 / x86-64 / Linux. `gc.alloc.rate.norm` is a property of the bytecode and both use compressed + oops, so they *should* agree — but the gate's slack is deliberately tight (`max(0.5 B, 0.1%)`). + If that run fails by small deltas across many arms, that is a portability finding; re-record on + this architecture. Do not widen the slack and do not raise a ratchet. + + > **A local trap that costs 20 minutes and looks like a broken gate.** `run-gate.sh` dies with + > `Unable to find the resource: /META-INF/BenchmarkList` if the benchmarks jar was built on + > **JDK 23 or newer**, because javac no longer runs annotation processors found on the classpath + > by default and JMH's generator is exactly that. Nothing is wrong with the gate — build with the + > JDK the workflow pins (21). Seen here with Maven running on Homebrew OpenJDK 26. + +## Design notes worth not rediscovering + +**No JDK 8 in the build matrix.** The root pom sets `8`. `--release` is a javac 9+ +flag, so JDK 8 cannot run this build at all. Bytecode-level Java 8 compatibility is proven by +`jdk8-runtime` instead: compile on a modern JDK, fork the *test* JVM onto a real JDK 8 with surefire's +`-Djvm=…`, then sweep every class file through JDK 8's `javap`. + +**No JDK 11 leg.** Not added, because it could not be confirmed. Every plugin pinned in the root pom +is nominally JDK 11 compatible, but there is no JDK on the authoring machine to check with, and a +matrix leg asserting an untested claim is worse than no leg. Add it once someone has watched it pass. + +**The `adopt` → `temurin` change.** AdoptOpenJDK was renamed Eclipse Temurin in 2021; `adopt` is +deprecated in `setup-java` and resolves to an archive that receives no new releases. Same vendor, +still shipping. + +**The cache-scrub step is load-bearing and must stay last.** `actions/cache` saves `~/.m2/repository` +in a post-job step that runs after every step in the job. Without the scrub, a locally-built neoproj4j +snapshot would be baked into the cache and could silently satisfy a later run's inter-module +dependencies — a run could then "pass" against stale jars from an earlier commit. It was inherited +from the original `ci.yaml`; the only change is `if: always()`, so a *failed* build also scrubs +instead of leaving a poisoned cache behind. + +**Determinism is applied via `argLine`, not `systemPropertyVariables`.** `user.language`, +`user.country` and `user.timezone` are read during JVM startup. Surefire's `systemPropertyVariables` +are applied with `System.setProperty` inside an already-running fork, which is too late to move +`Locale.getDefault()`. They have to be on the forked JVM's command line, which is what `-DargLine` +does. (`conformance/pom.xml` currently pins them via `systemPropertyVariables`; that is worth a look +by whoever owns that pom.) `MAVEN_OPTS` covers the Maven JVM and `LANG`/`LC_ALL`/`TZ` the OS default — +with a tolerated `locale-gen` step, because the Ubuntu images generate only `C.UTF-8` and +`en_US.UTF-8` and `LC_ALL=tr_TR.UTF-8` would otherwise silently fall back to `C`. + +**What `ci.yaml`'s `determinism` job does *not* prove.** It runs the same suite under different +environments and checks it still passes. It does not diff numeric output between legs. What it +establishes is that no result depends on the ambient environment, which is the failure mode that has +actually bitten here. The numeric comparison is **`determinism.yaml`'s** job, added later; the two are +complementary and neither replaces the other. + +**Why `determinism.yaml`'s non-vacuity check lives in the cross-leg job and not in the test.** The +obvious design is to fail a leg when `Math` and `StrictMath` agree too closely, on the reasoning that +a golden both satisfy cannot distinguish them. Measured on four JDKs, that reasoning is right about the +matrix and wrong about any single JVM: on **Temurin 11 / AArch64, `Math` and `StrictMath` are +bit-identical on all 54,265 probes — 0.00%, every function** — while the *same JDK* on x86-64 diverges +on 2.95% and Temurin 21/AArch64 on 0.55%. An in-leg assertion would therefore have shipped a +permanently red JDK 11 arm64 leg for a non-defect, and a permanently red gate is a disabled gate. + +That same-JDK x86-64-versus-AArch64 pair is also the finding: it demonstrates directly that HotSpot's +`Math` intrinsics are architecture-dependent, which is the premise the whole `StrictMath` policy rests +on and which had never been demonstrated for this project. + +**`failIfNoSpecifiedTests` is deliberately `false` in `determinism.yaml`, which looks backwards.** +Setting it `true` fails on `neoproj4j-epsg`, which `-am` builds and which has no test sources at all +(verified: *"No tests matching pattern … were executed!"* on project `neoproj4j-epsg`). The guard moved to +an explicit assertion on the count of tests in `core`'s own surefire XML, which is strictly stronger — +it catches a rename, a package move, *and* a test silently dropped from a class. + +**`fetch-depth: 0` on the pinned PROJ checkout is required.** `sync-upstream.sh` resolves the pin by +*name* — `git rev-parse --verify 9.8.1^{commit}`, then `git archive 9.8.1 test/gie`. A shallow clone +can leave the tag object absent locally, and the script dies with `revision '9.8.1' does not exist`. +The `upstream-drift` job uses `fetch-depth: 1` because `actions/checkout` creates a local `master` +branch, so no tag has to resolve there. + +**`git add --intent-to-add` before `git diff --exit-code`.** A plain `git diff` sees only +modifications and deletions; a file *added* upstream would be untracked and the check would pass +straight over it. `--intent-to-add` makes additions visible to the diff. + +**Syncing from master needs the script's pin rewritten.** `PROJ_REV`/`PROJ_REV_SHA` in +`sync-upstream.sh` are plain assignments, not env-overridable, and the script always extracts from +`$PROJ_REV`. Pointing it at a master checkout is not enough — it would re-vendor 9.8.1 from the tag +that checkout also fetched. `upstream-drift` therefore rewrites those two lines in a sibling copy of +the script (sibling because `SCRIPT_DIR` comes from `BASH_SOURCE` and decides where files land). That +copy is deleted before the diff. A master sync is also *expected* to abort on the script's +`tinshift_gpkg*.gie` guard, since those files exist only on master — the abort happens after the +corpus directories have been replaced, so the diff is still the drift report. + +## What has and has not been validated + +Validated: YAML parses (`ruby -ryaml`), action versions pinned to `actions/*` at `@v4`, no +third-party actions, artifact names unique across every matrix, matrix expressions and +`continue-on-error` values well-formed, and the shell in `conformance.yaml` written against a close +reading of `conformance/sync-upstream.sh` (its `$1`/`$PROJ_DIR` override, its `BASH_SOURCE`-derived +`SCRIPT_DIR`, its pin check, its `tinshift_gpkg` guard, and the three comment lines in +`gie-manifest.sha256` that would otherwise make `shasum -c` exit 1). + +**`conformance.yaml`'s `corpus` job is now a second exception, on both its Maven and its shell +side.** Its two steps were extracted from this YAML by `yaml.safe_load` and executed verbatim +against a scratch `-Dmaven.repo.local`, under all three controls tabulated at the end of this file. +The other two jobs in that file remain unexecuted. + +**`determinism.yaml` is the exception, and only on its Java side.** The tests it runs were executed +locally on five JDK/instruction-set combinations before the YAML was written: + +| JDK | `os.arch` | `StrictMath.sin` | result | +|---|---|---|---| +| Temurin 8.0.502 | `x86_64` | native (JNI fdlibm) | 54,265 pass | +| Temurin 11.0.32 | `x86_64` | native (JNI fdlibm) | 54,265 pass | +| Temurin 11.0.32 | `aarch64` | native (JNI fdlibm) | 54,265 pass | +| Temurin 21.0.11 | `aarch64` | pure Java `FdLibm` | 54,265 pass | +| OpenJDK 26.0.2 | `aarch64` | pure Java `FdLibm` | 54,265 pass | + +271,325 `StrictMath` and 221,970 `FastStrictTrig` raw-bit comparisons, **zero value mismatches**, +across two instruction sets and both `StrictMath` implementations. The two-phase Maven invocation and +the surefire-count guard were also run locally. The **YAML itself has still never executed.** + +**Executed locally on 2026-08-02, so no longer in the unvalidated set:** + +* **`ci.yaml` / `build-and-test`'s only command**, `mvn -B clean install`, on three JDKs. Exit 0 on + Temurin 21.0.11 and on Homebrew OpenJDK 26.0.2; exit 1 on Corretto 17.0.20 for the three `core` + allocation-premise tests described above. +* **`ci.yaml` / `jdk8-runtime`'s bytecode sweep**, extracted from the YAML by `yaml.safe_load` and + run against the real built tree inside `eclipse-temurin:8-jdk` with a **real Temurin 8.0.492** — + 1,082 class files, all class-file major 52. Four controls; see the section below, one of which + found the check was asserting nothing. +* **`determinism.yaml`'s test-count guard**, extracted the same way and run under five controls + against real surefire output. See the section above. +* **`conformance.yaml` / `corpus`**, **`golden.yaml` / `golden`** and **`bench.yaml` / `gate`** — + each job's exact Maven / script invocation, run to completion, with the numbers quoted in this + file taken from those runs and nowhere else. + +**Still not validated: any of it running as YAML.** No workflow, job or step here has executed on a +runner. Treat the first CI run as the first test of the files themselves. + +--- + +## `determinism.yaml` and the aarch64 legs + +`determinism.yaml` compares raw bit patterns **between architectures**, so its `cross-arch` job is +only meaningful if both an x86-64 and an aarch64 leg actually ran. GitHub-hosted arm64 runners are +free for public repositories on github.com, which is the condition this repository meets. + +**If the three `ubuntu-24.04-arm` legs ever stop allocating, the `cross-arch` job degenerates into +comparing x86-64 against itself while still reporting green.** That is the failure this project keeps +getting bitten by, so the legs fail loudly rather than skipping. Do not quietly delete them: either +restore an arm64 runner, or remove them and record that the cross-architecture claim has been lost. +`ci.yaml`'s `en_US/UTF-8/UTC/arm64` determinism leg has the same dependency. + +### The test-count guard: an exact count that went stale twice, now a floor + +**`EXPECTED_TESTS` is gone. The guard now asserts `DET_FLOOR_TESTS=22` and prints drift.** + +The history is the argument. The constant was **9**, counting `StrictMathGoldenTableTest` (6) plus +`NanBitPatternTest` (3) — the two classes `determinism.yaml`'s header discusses — but the job's +`-Dtest='org.locationtech.proj4j.determinism.*Test'` also matches `NoJdkAngleConversionTest`, in +the same package, worth 6 more. It was corrected to **15** on 2026-08-01. By 2026-08-02 +`NoAmbientLocaleInCoreTest` had joined the same package with 7 more, so the true count is **22** +and the exact-count guard **would have gone red on its first ever run, for the second time, on a +bookkeeping error**. Measured, not counted from a brief: that exact Maven invocation on Temurin 21 +reports `Tests run: 22, Failures: 0, Errors: 0, Skipped: 0` across four surefire XMLs +(6 + 3 + 7 + 6), cross-checked against 22 `@Test` methods in the package's sources. + +Twice is a pattern, and the pattern is structural: the constant is coupled to a package that other +streams legitimately grow, and the stream that grows it has no reason to be looking at this +workflow. So the guard is now a **floor plus a printed drift**, the same shape `docker/run.sh`'s +`check_determinism` already used — *"the floor still makes 'a container that ran nothing' +impossible, which is the property that matters"*. Keep the two constants in step. + +What is given up is noticing a rise, and that is emitted as a `::notice::` on every run rather than +swallowed. What is kept is noticing a **drop**, because the floor *is* the current count. + +Verified against real surefire output, five ways: + +| control | result | +|---|---| +| unmodified: the real 4-class output | exit **0**, `ran=22`, no drift notice | +| **injected violation** — delete `NoAmbientLocaleInCoreTest`'s XML, i.e. exactly the 15 the old guard pinned | exit **1**, `only 15 determinism tests ran; the floor is 22` | +| empty `surefire-reports/` — the vacuous-green case the guard exists for | exit **1**, `expected at least 2 determinism surefire reports, found 0` | +| **drift** — a fabricated 5-test class added to the package | exit **0**, with `::notice::…drifted UP: 27 ran, floor is 22 (+5)` | +| a skip injected into one XML | exit **1**, `1 determinism tests were skipped` | + +> **One real bug found by running the empty case.** With `set -euo pipefail`, the old +> `xml=$(ls … | wc -l)` made `ls` fail when the glob matched nothing, `pipefail` propagated it, and +> `set -e` killed the script **on the assignment** — exit 1 with not one word printed, in precisely +> the case this guard exists to explain. It is now `xml=$(…) || xml=0`, which suppresses `set -e` +> and lets the message out. The third control above is what surfaced it. + +### What was checked and holds + +Run locally on Temurin 21 / aarch64 against the real emitted tables, so the `cross-arch` job's +parsers are no longer assumptions: + +* Both filenames the `cross-arch` job globs for are produced at + `-Dproj4j.determinism.outDir`: `math-divergence.tsv` and `nan-patterns.tsv`. +* The job's `awk -F'\t' '$1=="TOTAL"{print $2}'` reads the real file correctly: `d=298`, + `t=54265`. +* **Assertion 2, the non-vacuity check, would pass**: 298 of 54,265 `Math` results differ from the + `StrictMath` golden on this leg — 0.55%, matching the figure recorded for Temurin 21 / aarch64. + +## `conformance.yaml`'s `corpus` job — reported here, fixed 2026-08-01 + +`corpus` used to run `mvn -B -ntp -Pconformance -pl conformance -am verify`. `-am` builds `core`, +whose suite currently has one expected failure (`MetaCRSTest`), so the reactor stopped in `core` and +**the corpus sweep never ran**. Measured before the fix: + +``` +Proj4J ........................ FAILURE [ 25.736 s] +Proj4J PROJ Conformance Suite . SKIPPED +``` + +*(Quoted verbatim. The pom `` is now `neoProj4J`, so the same failure prints `neoProj4J …` +today; the transcript is left unedited because it is a measurement, not an example. +`docker/run.sh:370`, which greps reactor output for that name, **was** updated.)* + +The section that stood here said the fix was being left alone because it could not be verified. It +now can: the baseline is on disk, so the job was fixed with `golden.yaml`'s `-Dtest=` narrowing plus +`-Dsurefire.failIfNoSpecifiedTests=false` — **not** `-Dmaven.test.failure.ignore=true`, which forces +exit 0 and would ignore the gate's own failure — and all three controls were run locally against the +exact YAML text: + +| control | result | +|---|---| +| unmodified | exit 0, `7378/7895 genuine passes`, `diff.regressed = 0` — **re-run 2026-08-02: exit 0, `7441/7900 genuine passes`, `regressed 0`** | +| one manifest row removed | exit 1, naming `gie/4D-API_cs2cs-style.gie#11:0@c4fe674b` as `REGRESSED` | +| baseline file absent | exit 1, naming *"CONFORMANCE BASELINE INCOMPLETE … NOTHING HAS REGRESSED"* | + +**One trap discovered doing it, and it is the opposite of an optimisation.** Copying golden's +pattern verbatim — `org.locationtech.proj4j.conformance.*Test` — matches **nothing**, because every +conformance test lives in a sub-package and surefire's single `*` does not cross a package +separator. Measured: `No tests to run.` followed by **`BUILD SUCCESS`**. The `**` is required, and +the job's non-vacuity step exists to catch exactly that shape of green. + +## `ci.yaml`'s `jdk8-runtime` job — two defects, fixed 2026-08-02 + +The job is `continue-on-error: true`, so anything that goes wrong inside it is invisible by +construction. Two things had. + +**1. The bytecode assertion carried no `if:`, so it never ran after a failure.** GitHub skips a step +whose predecessor failed unless it says otherwise. The `8` promise therefore went +unchecked on exactly the runs where checking it was most informative, while the job reported +success. Fixed with `if: always()`. + +**2. The assertion asserted nothing — and this was only found because fixing (1) called for a +positive control.** The step swept every class through `javap -p` and relied on the claim, written +in its own comment, that *"JDK 8's javap refuses anything with a class file major version above +52"*. **It does not.** Measured against a real Temurin 8.0.492 in `eclipse-temurin:8-jdk`: + +| input | `javap -p` (JDK 8) | +|---|---| +| a real major-52 class from `core/target/classes` | disassembles, exit **0** | +| a major-65 class (`javac --release 21`) | disassembles, exit **0** | +| a major-68 class (`javac --release 24`) | disassembles, exit **0** | + +`javap` is a disassembler, not a verifier; it has no maximum-version check. **Making a vacuous check +run reliably would have been strictly worse than leaving it skipped**, because it would then look +like a kept promise. The step now reads the `u2 major_version` at byte offset 6 of each class file +directly — no JDK needed — and keeps `javap` only as a weaker second leg proving JDK 8's class-file +reader can parse the constant pool (which does catch post-8 constant-pool tags). + +Four controls, the step extracted from the YAML by `yaml.safe_load` and run verbatim: + +| control | result | +|---|---| +| the **real built tree**, real Temurin 8 javap, in a container | exit **0** — `All 1082 class files are class-file major version 52` | +| **injected violation**: one major-65 class dropped into `core/target/classes` | exit **1**, naming the file and its version. *The pre-fix step passed this.* | +| nothing built | exit **1**, `no class files found - nothing was verified` | +| **the prune is load-bearing**: same real tree, `-not -path './benchmark/*'` removed | exit **1** on **175** `benchmark/target/classes` files at major 61 | + +**On the scoping, since it was asked whether it is cheap: it is one `-not -path`, and it is not +hypothetical on this workspace right now.** `benchmark/pom.xml` sets `17` +deliberately (never published, so no consumer can be broken), and 175 of its class files are major +61 and present in the tree today from an earlier `-Pbench` run. `-pl core -am` never builds them on +a clean GitHub-hosted runner, so the prune changes nothing there — it matters on a self-hosted or +reused workspace, and only `benchmark` is pruned. Every module that ships stays in scope. diff --git a/.github/workflows/bench.yaml b/.github/workflows/bench.yaml new file mode 100644 index 0000000..95794bd --- /dev/null +++ b/.github/workflows/bench.yaml @@ -0,0 +1,189 @@ +name: Performance Gate + +# TIERS 1 AND 2 OF THE PERFORMANCE REGRESSION GATE. +# +# benchmark/pom.xml calls these "blocking PR gates". Until this file existed, NO JOB ANYWHERE +# INVOKED GateChecker - the module is not in the root pom's default (deliberately: a +# plain build must neither compile it nor download JMH, so `core` stays dependency-free) and no +# workflow passed `-Pbench`. The description was accurate about intent and false about fact. +# +# WHAT IS AND IS NOT GATED, TODAY. This matters more than usual here, because the honest answer is +# "almost nothing", and saying so is the point of adding the job. +# +# Tier 1 (allocation, bytes/op). 29 of the rules in +# benchmark/src/main/resources/baseline/allocation-baseline.json carry `maxBytesPerOp: "TBD"` +# and the `ratchets` block is empty. A TBD is a WARNING by default, so as shipped the tier +# observes and passes. Exactly two rules carry a real number and can reject today: +# `math-dispatch-intrinsic-zero-allocation` (0, ratchetable:false - the harness's own canary) +# and `math-dispatch-strictmath` (64). `required: true` is also already load-bearing on every +# rule: a renamed or excluded benchmark fails the gate even while every threshold is TBD. +# +# Tier 2 (deterministic transcendental call counts). Every one of the 158 entries in +# op-counts.json is TBD. The tier measures, prints and passes. +# +# SO THIS JOB PASSES `--require-baseline`, AND IS THEREFORE RED TODAY. That flag turns each TBD +# from a warning into a failure. allocation-baseline.json's own note already nominates it - +# "Pass --require-baseline to turn those warnings into failures once the baseline is real - that +# is the flag CI should use after capture" - and the choice made here is to wire it in BEFORE the +# capture rather than after. The reasoning: a green job over 187 unpinned thresholds is a +# decoration, and a decoration is what this workflow exists to replace. Red-and-naming-the-gap is +# a true statement about the gate's state; green is not. The job turns green the moment a capture +# is recorded and committed: +# +# cd benchmark && ./run-gate.sh --record # then commit both baseline JSON files +# +# FIRST RUN ALSO TESTS SOMETHING NOBODY HAS CHECKED: RATCHET PORTABILITY. The capture in flight is +# being taken on Temurin 21 / aarch64 / macOS; this job runs Temurin 21 / x86-64 / Linux. +# gc.alloc.rate.norm is a property of the bytecode and both platforms use compressed oops, so the +# numbers SHOULD be identical - but "should" is not evidence, and the gate's slack is deliberately +# tight (max(0.5 B, 0.1%)). If the first post-capture run fails by small deltas on many arms, that +# is a portability finding, and the fix is to re-record on this architecture with a +# workflow_dispatch job - NOT to widen the slack and not to raise a ratchet. +# +# WHY NO TIER 3 (absolute ns/op). Deliberate and documented in GateChecker's javadoc and +# reference/performance.md: JMH on shared CI runners varies +/-20-40% - no CPU pinning, no turbo +# control, noisy neighbours - and a gate with that false-positive rate gets muted, then ignored, +# then deleted. Timing belongs on a nightly job on dedicated hardware, alerting only on a >10% +# regression sustained across three nights. Do not add a timing assertion here. +# +# VERIFICATION STATUS. GateChecker's Tier 1 comparison was exercised locally on Temurin 21 +# against the committed allocation-baseline.json: a fixture with an injected 62.4 B/op on +# MathDispatchBenchmark.math produced "ALLOCATION REGRESSION ... delta +62.4 B/op" naming the +# benchmark and the rule, while the otherwise-identical clean fixture did not. run-gate.sh's +# argument plumbing for --require-baseline was verified with a stubbed `java`. The YAML itself has +# never executed. + +on: + push: + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + # --------------------------------------------------------------------------- + # BLOCKING. Build the shaded benchmarks jar, run the live benchmarks with the allocation + # profiler, then check Tiers 1 and 2. + gate: + name: Allocation and op-count gate (blocking) + runs-on: ubuntu-latest + # UNMEASURED. A full JMH run of this module takes about 90 minutes on a laptop; --quick drops + # to 1 fork and 2+3 one-second iterations, which should be well under 15 minutes, but no one + # has timed it on a runner. Generous rather than tuned; tighten once there is a number. + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + # benchmark/pom.xml compiles at 17, deliberately newer than core's 8, + # because this module is never published. 21 is what the baselines are captured on. + java-version: '21' + + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-bench-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven-bench- + ${{ runner.os }}-maven- + + # -Pbench is what adds benchmark to the root pom; -pl benchmark alone + # cannot resolve it. -am brings neoproj4j, neoproj4j-epsg and neoproj4j-grids-us-legacy, all three of + # which must be inside the shaded jar - grids-us-legacy is not optional, see the long note in + # benchmark/pom.xml about NAD27_TO_NAD83 silently degrading to a near-identity without it. + # + # -DskipTests: benchmark/pom.xml already sets skipTests, but -am builds core, whose suite has + # one expected failure (MetaCRSTest) that would stop the reactor before the jar is built. + # core's tests are ci.yaml's business, not this job's. + - name: Build the shaded benchmarks jar + run: | + mvn -B -ntp -Pbench -pl benchmark -am package \ + -DskipTests \ + -Dmaven.javadoc.skip=true \ + -Dmaven.source.skip=true + + # The gate's own plumbing, before it is trusted to judge anything else. Cheap, and it is the + # difference between "the gate passed" and "the gate ran". + # NB: a literal block scalar, not a plain one with a backslash. YAML folds a plain multi-line + # scalar's newline into a space, so `... \ org...` reaches the shell as + # `... \ org...` - a backslash-escaped SPACE, not a line continuation - and the command dies + # on an unparseable argument. Every other multi-line `run:` in this repository's workflows + # uses `run: |` for the same reason. + - name: GateChecker self-test + run: | + java -cp benchmark/target/benchmarks.jar \ + org.locationtech.proj4j.benchmark.gate.GateChecker --self-test + + # run-gate.sh rather than an inline command, on purpose: the JMH exclusion, the profiler and + # the output format are all load-bearing and would drift if duplicated here. + # -prof gc produces gc.alloc.rate.norm. WITHOUT IT TIER 1 SILENTLY CHECKS NOTHING. + # (there is no -e any more. It used to exclude ...benchmark.staged, whose @Setup failed + # because the bulk API did not exist. It does now, the staged package is deleted, and + # BulkTransformBenchmark is gated like everything else - which it was NOT while excluded: + # the bulk-zero-allocation rule matched nothing for the whole of that period.) + # --quick 1 fork, 2 warmup + 3 measurement iterations at 1 s. Legitimate for + # Tier 1 because bytes/op is a bytecode property that converges + # immediately; it would NOT be legitimate for timing, which is why this + # job does not do timing. + # --require-baseline a TBD threshold is a failure. See the header. + - name: Run the gate + run: | + cd benchmark + ./run-gate.sh --quick --require-baseline + + # NON-VACUITY. `-prof gc` failing to attach, or the -e exclusion accidentally matching + # everything, both produce a run in which Tier 1 examines zero measurements - and the tier + # would then have nothing to complain about. Runs even on failure, because a gate that + # failed for the wrong reason still has to be caught. + # + # awk and shell arithmetic, never `bc`: bc is not guaranteed present on every runner image, + # and a gate that dies on a missing utility is indistinguishable from a gate that fails. + - name: Assert the run actually measured something + if: always() + run: | + set -euo pipefail + json=benchmark/target/jmh-result.json + [ -f "$json" ] || { + echo "::error::no $json - JMH did not produce a result file, so Tier 1 examined nothing." + exit 1; } + + # One line per benchmark record. grep -c on the key, not a JSON parser: jq is present on + # GitHub runners today but this check must not acquire a dependency to stay true. + arms=$(grep -c '"benchmark"' "$json" || true) + alloc=$(grep -c 'gc.alloc.rate.norm' "$json" || true) + echo "JMH arms: $arms arms carrying gc.alloc.rate.norm: $alloc" + [ "${arms:-0}" -ge 20 ] || { + echo "::error::only ${arms:-0} benchmark arms in the result; expected at least 20." + echo "::error::Benchmarks were excluded, renamed, or failed in @Setup. Tier 1 cannot" + echo "::error::gate what was not run - and GateChecker's `required` flag only catches" + echo "::error::the rules that expect a specific one." + exit 1; } + [ "${alloc:-0}" -ge 20 ] || { + echo "::error::${alloc:-0} arms carry gc.alloc.rate.norm. The -prof gc profiler did not" + echo "::error::attach. Tier 1 warns per benchmark in that case rather than failing, so" + echo "::error::the whole tier would have measured NOTHING while reporting success." + exit 1; } + echo "Non-vacuity satisfied: $alloc of $arms arms carry an allocation measurement." + + - name: Upload the JMH result and gate output + if: always() + uses: actions/upload-artifact@v4 + with: + name: bench-gate + path: | + benchmark/target/jmh-result.json + benchmark/src/main/resources/baseline/*.json + if-no-files-found: error + retention-days: 14 + + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7724a2a..590f24b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,23 +1,422 @@ name: CI +# The normal build. Everything here is fast enough to run on every push; the heavy +# PROJ conformance corpus sweep lives in conformance.yaml so it cannot slow this down. +# +# Blocking vs advisory is stated per job below and summarised in +# .github/workflows/README.md. A job marked advisory uses `continue-on-error: true` +# and must never be the reason a merge is held up. +# +# NOTE ON VERIFICATION: none of THIS file has been executed. The claim it used to carry - +# that there is no JDK and no Maven on the authoring machine - was RETRACTED: Temurin 21 and +# Maven 3.9.16 are installed, and Gradle-managed JDKs were present all along in a directory +# the original survey never checked. Temurin 8 and 11 have since been added too. So "it could +# not be checked locally" is no longer a reason for anything here; where a comment below gives +# it as one, that comment is describing a past moment and should be re-checked before being +# trusted. See .github/workflows/determinism.yaml, whose Java side HAS been run locally on +# five JDK/architecture combinations. + on: [push, pull_request] +# Superseded pushes should not queue behind each other. Cancel the in-flight run for the +# same ref; a PR that gets three pushes in a minute costs one build, not three. +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + jobs: + # --------------------------------------------------------------------------- + # BLOCKING. The gate. Compiles all four modules (core, epsg, geoapi, conformance) + # and runs their fast tests. `mvn clean install` on the conformance module compiles + # it and runs only its unit tests - the corpus sweep is behind the `conformance` + # profile, so this job stays cheap. If this is red, nothing else matters. + # + # WHY NO JDK 8 LEG: the root pom sets 8 on maven-compiler-plugin. + # `--release` is a javac 9+ flag; JDK 8 cannot honour it and the build would fail at + # the first module. Java 8 *bytecode* compatibility is therefore proven differently - + # see the jdk8-runtime job below, which builds on a modern JDK and runs the tests on a + # real JDK 8. + # + # WHY NO JDK 11 LEG HERE, and what is now known. Partly superseded. What has been + # verified locally on Temurin 11.0.32 (both aarch64 and x86-64) is that core's classes and + # test classes, compiled with --release 8, LOAD AND RUN correctly there - the determinism + # suite passes on both. What has NOT been verified is that `mvn clean install` itself + # completes on JDK 11: the plugins pinned in the root pom (compiler 3.11.0, surefire 3.1.0, + # javadoc 3.5.0, jar 3.4.1, felix maven-bundle-plugin 5.1.8) are all nominally JDK 11 + # compatible, and "nominally" is still not evidence. determinism.yaml DOES run a JDK 11 + # build leg, so the first run of that workflow answers this question - if its JDK 11 legs go + # green, add the leg here and delete this comment. build-and-test: + name: Build (JDK ${{ matrix.java }}) + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + java: ['17', '21'] + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + # Changed from 'adopt' to 'temurin'. AdoptOpenJDK was renamed Eclipse Temurin in + # 2021; 'adopt' is deprecated in setup-java and resolves to an archive that gets + # no new releases. 'temurin' is the same vendor, still shipping. + distribution: 'temurin' + java-version: ${{ matrix.java }} + + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + # The JDK suffix was added when this became a matrix: two legs saving the same + # key race each other and one loses with a "cache already exists" warning. + # restore-keys still falls back to any Linux Maven cache, so a new leg is not + # cold-started. + key: ${{ runner.os }}-maven-jdk${{ matrix.java }}-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven-jdk${{ matrix.java }}- + ${{ runner.os }}-maven- + + - name: Build with Maven + run: mvn -B -ntp clean install + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-reports-jdk${{ matrix.java }} + path: '**/target/surefire-reports/**' + if-no-files-found: warn + retention-days: 7 + + # PRESERVED FROM THE ORIGINAL ci.yaml, deliberately, and it must stay last. + # actions/cache saves ~/.m2/repository in its post-job step, which runs after every + # step here. If a locally-built proj4j snapshot were left in the local repository it + # would be baked into the cache and silently satisfy the next run's inter-module + # dependencies - a later run could then "pass" against stale jars from an earlier + # commit. Scrubbing before the post step keeps the cache to third-party deps only. + # + # The only change: `if: always()`, so a failed build also scrubs. Previously a build + # failure left whatever had been installed to poison the saved cache. + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" + + # --------------------------------------------------------------------------- + # ADVISORY. Early warning from the next JDK. Two things it is actually watching for: + # 1. 8. javac has marked source/target 8 obsolete and it is + # scheduled for removal; when a JDK finally drops it, this job goes red months + # before that JDK is one anybody uses, which is exactly the notice we want. + # 2. felix maven-bundle-plugin / bnd, historically the first thing to break on a new + # class file version. + # Never blocking: EA builds move, and setup-java may not have the requested EA at all. + jdk-ea: + name: Build (JDK EA, advisory) + runs-on: ubuntu-latest + timeout-minutes: 30 + continue-on-error: true + steps: + - uses: actions/checkout@v4 + + - name: Set up early-access JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + # 27 is the current early-access line (26 GA'd 2026-03). Bump this each time a + # JDK GAs. If Adoptium has no EA build for it yet the job goes yellow, which is + # the correct outcome for an advisory signal. + java-version: '27-ea' + + - name: Build with Maven + run: mvn -B -ntp clean install + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-reports-jdk-ea + path: '**/target/surefire-reports/**' + if-no-files-found: warn + retention-days: 7 + + # --------------------------------------------------------------------------- + # ADVISORY. Java 8 is a stated support target, and 8 is a compiler + # promise that nothing verifies at runtime. This job keeps the promise honest: build the + # jars on a modern JDK (required - see the no-JDK-8-leg note above), then fork the test + # JVM onto a real JDK 8 via surefire's `jvm` parameter and run core's suite there. + # + # It catches what review misses: a post-8 API that compiles fine under --release 8 only + # because it exists in the target's API surface via a different path, and anything + # loaded reflectively. Advisory because dual-JDK toolchain setups are flaky and Java 8 + # support is not worth blocking a merge on runner weather. + jdk8-runtime: + name: Java 8 runtime compatibility (advisory) runs-on: ubuntu-latest + timeout-minutes: 30 + continue-on-error: true steps: - uses: actions/checkout@v4 + + - name: Set up JDK 8 and JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + # Both are installed; JAVA_HOME points at the last one listed (21), which is what + # Maven and javac use. setup-java also exports JAVA_HOME_8_X64 for the other. + java-version: | + 8 + 21 + + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-jdk8rt-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + # -pl core -am builds the root pom, epsg (core test-depends on neoproj4j-epsg) and core. + # `package` so the bundle plugin actually produces the jars; javadoc/source jars are + # skipped because they prove nothing here and cost a minute. + # -Djvm sets maven-surefire-plugin's `jvm` parameter: the forked test JVM is real + # JDK 8, while compilation stays on 21. + - name: Build on JDK 21, run core tests on JDK 8 + run: | + set -euo pipefail + test -x "$JAVA_HOME_8_X64/bin/java" || { + echo "JDK 8 not present at JAVA_HOME_8_X64=$JAVA_HOME_8_X64"; exit 1; } + "$JAVA_HOME_8_X64/bin/java" -version + mvn -B -ntp -pl core -am package \ + -Dmaven.javadoc.skip=true \ + -Dmaven.source.skip=true \ + -Djvm="$JAVA_HOME_8_X64/bin/java" + + # Surefire only exercises the classes the tests touch. This sweeps EVERY emitted class file + # and asserts its class-file major version is 52, which is what 8 + # promises - so an accidentally-newer class is caught even if no test ever loads it. + # + # TWO DEFECTS WERE FIXED HERE ON 2026-08-02, AND THE SECOND ONE IS THE INTERESTING ONE. + # + # 1. `if: always()` WAS MISSING. Without it this step is skipped whenever the step above + # fails - and because the whole job carries `continue-on-error: true`, the job then + # reports SUCCESS having verified nothing at all. A test failure under JDK 8 does not + # stop the bytecode level from being a separate, checkable fact, and the two failures are + # independently informative. If the build failed so early that no classes were emitted, + # the `count -gt 0` guard below turns that into a loud error rather than a vacuous pass. + # + # 2. THE ASSERTION ITSELF DID NOT ASSERT ANYTHING. This step used to run every class through + # `javap -p` and rely on the comment's claim that "JDK 8's javap refuses anything with a + # class file major version above 52". IT DOES NOT. Measured against a real Temurin + # 8.0.492 (`docker run eclipse-temurin:8-jdk`), javap 8 cheerfully disassembles a major-65 + # (Java 21) class AND a major-68 (Java 24) class and exits 0 in both cases. javap is a + # disassembler, not a verifier; it has no maximum-version check. So the step named + # "Assert every class file is Java 8 bytecode" could not detect a class that was not. + # Making a vacuous check run reliably (fix 1) without fixing this would have been strictly + # worse than leaving it skipped, because it would then look like a kept promise. + # The check now reads bytes 6-7 of each class file - the u2 major_version of the class + # file format, which is unambiguous and needs no JDK at all. javap is kept as a second, + # weaker leg: it proves JDK 8 tooling can actually parse the constant pool, which does + # catch post-8 constant-pool tags (CONSTANT_Dynamic and friends). + - name: Assert every class file is Java 8 bytecode (major version 52) + if: always() + run: | + set -euo pipefail + # Every module's output, not a hardcoded list: epsg has no .java sources at all, + # so naming epsg/target/classes explicitly would make find exit 1. + # + # `benchmark` is pruned, and only benchmark. benchmark/pom.xml sets 17 + # DELIBERATELY - it is never published, so no consumer can be broken by its bytecode + # level - and its classes are class-file major 61. `-pl core -am` never builds it on a + # clean GitHub-hosted runner, so today this prune changes nothing; it matters the moment + # this job runs in a reused or shared workspace (a self-hosted runner, a local + # docker/run.sh, or anyone who ran `mvn -Pbench` first), where a stale + # benchmark/target/classes would fail the sweep for a non-defect and teach people to + # ignore it. Every module that SHIPS - core, epsg, geoapi, grids-us-legacy, db - plus + # golden and conformance, all inherit the root pom's 8 and stay in + # scope. If a META-INF/versions multi-release tree is ever added, this needs revisiting. + find . -path '*/target/classes/*' -name '*.class' -not -path './benchmark/*' -print0 \ + > /tmp/j8-classes.nul + count=$(tr -dc '\0' < /tmp/j8-classes.nul | wc -c | tr -d ' ') + echo "class files: $count" + [ "$count" -gt 0 ] || { + echo "::error::no class files found - nothing was verified. Either the build step above" + echo "::error::failed before emitting any classes, or the sweep's path filter is wrong." + echo "::error::A sweep of zero files is not a pass." + exit 1; } + + # THE REAL ASSERTION. u2 at offset 6 is major_version; 52 is Java 8. + bad=0 + shown=0 + while IFS= read -r -d '' f; do + # shellcheck disable=SC2046 + set -- $(od -An -N2 -j6 -tu1 "$f") + v=$(( $1 * 256 + $2 )) + if [ "$v" -ne 52 ]; then + bad=$((bad + 1)) + if [ "$shown" -lt 20 ]; then + echo "::error file=$f::class file major version $v, expected 52 (Java 8)" + shown=$((shown + 1)) + fi + fi + done < /tmp/j8-classes.nul + [ "$bad" -eq 0 ] || { + echo "::error::$bad of $count class files are not Java 8 bytecode. 8" + echo "::error::in the root pom is a promise to downstream consumers; this is it being" + echo "::error::broken. Do not relax this check - fix the module that emitted them, or" + echo "::error::prune it here with a comment saying why it is allowed to ship newer." + exit 1; } + echo "All $count class files are class-file major version 52." + + # Second, weaker leg. javap does NOT enforce the version (measured - see the comment + # above), so this can never be the assertion. What it does prove is that JDK 8's own + # class-file reader can parse every constant pool we emit. + xargs -0 -r "$JAVA_HOME_8_X64/bin/javap" -p < /tmp/j8-classes.nul >/dev/null + echo "All $count class files also parse under JDK 8 javap." + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-reports-jdk8-runtime + path: '**/target/surefire-reports/**' + if-no-files-found: warn + retention-days: 7 + + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" + + # --------------------------------------------------------------------------- + # MIXED - see `advisory` per matrix leg. The consumer requires bit-for-bit identical + # results across executors, so the test suite has to survive a hostile default Locale, + # charset and timezone, and ideally a different CPU architecture. + # + # HONEST SCOPE: this runs the same suite under different environments and checks it + # still passes. It does not diff numeric output between legs. What it does prove is that no + # result depends on the ambient environment, which is the failure mode that has actually + # bitten here. + # + # THE CROSS-LEG NUMERIC COMPARISON NOW EXISTS, in .github/workflows/determinism.yaml, which + # asserts a committed 54,265-result raw-bit golden on six architecture/JDK legs and then + # checks across legs. The two jobs are complementary and neither replaces the other: this one + # varies the ambient environment on one architecture, that one varies the architecture with + # the environment held fixed. The arm64 leg below is retained as a cheap smoke test, but the + # StrictMath claim is determinism.yaml's to prove, not this job's. + # + # HOW THE ENVIRONMENT IS APPLIED: user.language/user.country/user.timezone are read + # during JVM startup, so passing them as surefire is too late - + # those are set with System.setProperty inside an already-running fork and do not move + # Locale.getDefault(). They must be on the forked JVM's command line, which is what + # -DargLine does. MAVEN_OPTS covers the Maven JVM itself and LANG/LC_ALL the OS default. + determinism: + name: Determinism - ${{ matrix.label }}${{ matrix.advisory && ' (advisory)' || '' }} + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + continue-on-error: ${{ matrix.advisory }} + strategy: + fail-fast: false + matrix: + include: + # The reference environment. Blocking: if core cannot pass here, nothing else + # in this matrix means anything. + - label: en_US / UTF-8 / UTC / x64 + os: ubuntu-latest + language: en + country: US + timezone: UTC + encoding: UTF-8 + advisory: false + + # EXPECTED TO FAIL TODAY. Defect: core/src/main/java/org/locationtech/proj4j/io/ + # Proj4FileReader.java:41 calls authorityCode.toLowerCase() with no Locale. Under + # tr_TR the Turkish casing rule maps 'I' to dotless 'i', so "ESRI" lowercases to + # "esrı" and the lookup for the resource proj4/nad/esri never resolves - + # all 2,954 ESRI codes become unreachable. Advisory on purpose: this is a + # green-when-fixed signal, not a permanent red. Delete continue-on-error from + # this leg the moment the toLowerCase(Locale.ROOT) fix lands. + - label: tr_TR / UTF-8 / Europe-Istanbul / x64 + os: ubuntu-latest + language: tr + country: TR + timezone: Europe/Istanbul + encoding: UTF-8 + advisory: true + + # Decimal comma, non-Latin-1-safe round trips, half-hour UTC offset. Cheap, and + # it covers the formatting side of parameter handling that tr_TR does not. + - label: de_DE / ISO-8859-1 / Asia-Kolkata / x64 + os: ubuntu-latest + language: de + country: DE + timezone: Asia/Kolkata + encoding: ISO-8859-1 + advisory: true + + # Cross-architecture smoke test: a different FPU and a different JIT backend, and + # core's suite still passes. It does NOT compare bits - determinism.yaml does that, + # and it is blocking there. Kept advisory here because GitHub-hosted arm64 runners + # do not resolve on a private fork, and a leg that fails to allocate should degrade + # to yellow in the ordinary build rather than block anyone. + - label: en_US / UTF-8 / UTC / arm64 + os: ubuntu-24.04-arm + language: en + country: US + timezone: UTC + encoding: UTF-8 + advisory: true + env: + LANG: ${{ matrix.language }}_${{ matrix.country }}.UTF-8 + LC_ALL: ${{ matrix.language }}_${{ matrix.country }}.UTF-8 + TZ: ${{ matrix.timezone }} + MAVEN_OPTS: >- + -Duser.language=${{ matrix.language }} + -Duser.country=${{ matrix.country }} + -Duser.timezone=${{ matrix.timezone }} + -Dfile.encoding=${{ matrix.encoding }} + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: - distribution: 'adopt' + distribution: 'temurin' java-version: '21' + - uses: actions/cache@v4 with: path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: ${{ runner.os }}-maven- - - name: Build with Maven - run: mvn clean install - - name: Remove proj4j artifacts from cache - run: rm -rf $HOME/.m2/repository/org/locationtech/proj4j + # runner.arch is in the key because the arm64 leg would otherwise share a cache + # entry with the x64 legs. + key: ${{ runner.os }}-${{ runner.arch }}-maven-det-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-${{ runner.arch }}-maven- + + # The Ubuntu runner images generate only C.UTF-8 and en_US.UTF-8, so LANG/LC_ALL for + # tr_TR or de_DE would otherwise point at a locale glibc does not have - every perl + # and git call then warns and falls back to C, which quietly weakens this leg. The + # Java-level override on argLine is the part that actually matters, so a failure here + # is reported and tolerated rather than failing the leg. + - name: Generate the locale for this leg + run: sudo locale-gen "$LANG" || echo "locale-gen $LANG failed; OS default stays C" + + - name: Run core tests under ${{ matrix.label }} + run: | + mvn -B -ntp -pl core -am test \ + -DargLine="-Duser.language=${{ matrix.language }} -Duser.country=${{ matrix.country }} -Duser.timezone=${{ matrix.timezone }} -Dfile.encoding=${{ matrix.encoding }}" + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + # Artifact names must be unique across a matrix and cannot contain '/'. + name: surefire-reports-determinism-${{ matrix.language }}_${{ matrix.country }}-${{ runner.arch }} + path: '**/target/surefire-reports/**' + if-no-files-found: warn + retention-days: 7 + + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" diff --git a/.github/workflows/conformance.yaml b/.github/workflows/conformance.yaml new file mode 100644 index 0000000..c5ec8c6 --- /dev/null +++ b/.github/workflows/conformance.yaml @@ -0,0 +1,481 @@ +name: Conformance + +# PROJ's own conformance corpus, vendored from rev 9.8.1, run against proj4j - plus the +# guarantee that what is vendored really is what upstream produces. +# +# Separate from ci.yaml on purpose: the corpus sweep is thousands of assertions and must +# not sit in the path of a normal build. Blocking vs advisory is stated per job and +# summarised in .github/workflows/README.md. +# +# VERIFICATION STATUS (corpus job, 2026-08-01). The Maven invocation below - flags and all - +# was run locally on Temurin 21 against a scratch -Dmaven.repo.local, and three controls were +# executed against it: +# +# 1. unmodified -> exit 0, "7378/7895 genuine passes", diff.regressed 0 +# 2. one manifest row removed -> exit 1, naming the assertion key as REGRESSED +# 3. baseline file absent -> exit 1, naming the ABSENT BASELINE as the cause, not a +# regression count +# +# The previous note here read "not executed locally - there is no JDK and no Maven on the +# authoring machine", and the command it guarded could not have produced a conformance +# number at all - see the corpus job's comment. The other two jobs in this file are still +# unexecuted; treat their first run as their first test. + +on: + push: + pull_request: + schedule: + # Mondays 04:17 UTC. Off the hour deliberately - the top of the hour is when every + # cron on GitHub fires at once and scheduled runs get delayed. + - cron: '17 4 * * 1' + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +env: + # Single source of truth for the pin, mirroring conformance/sync-upstream.sh. If these + # disagree with the script the script wins and the job fails loudly - which is the point. + PROJ_REV: '9.8.1' + PROJ_REV_SHA: 'f08fa86c478c4bbbf003b1ec751dd84aa6eca486' + +jobs: + # --------------------------------------------------------------------------- + # BLOCKING. The conformance number. `mvn -Pconformance verify` flips + # gie.corpus.skip to false and runs the full corpus sweep, diffing the observed + # outcomes against the checked-in expected-outcome manifest. A regression - any + # assertion that used to pass and now does not - fails this job. + # + # -pl conformance -am builds root + core + epsg + conformance only; geoapi, db and + # grids-us-legacy are not on the conformance module's dependency path and there is no + # reason to pay for them here. + # + # THIS JOB NEVER RAN THE SWEEP UNTIL 2026-08-01, AND THE REASON IS WORTH KEEPING. + # The command was a bare `mvn -B -ntp -Pconformance -pl conformance -am verify`. `-am` + # also builds `core`, whose suite carries one expected MetaCRSTest failure, so the + # reactor stopped there and the conformance module was reported SKIPPED - measured: + # + # Proj4J ........................ FAILURE [ 25.736 s] + # Proj4J PROJ Conformance Suite . SKIPPED + # + # (Quoted verbatim from that run. The pom `` has since become `neoProj4J`, so the same + # failure would print `neoProj4J ...` today - the transcript is left unedited because it is a + # measurement, not an example.) + # + # A blocking job that has never executed its gate is not a control. golden.yaml had + # already solved exactly this and the fix is copied from it - see the flag notes below. + # + # MEASURED RUNTIME: ~5 s for the sweep once core is compiled, on an M-series laptop with + # a warm scratch repo. The 90-minute budget is therefore wildly generous; it is left + # alone until there is a number from a real runner, because a cold Maven cache and a + # from-scratch core compile are the whole cost here, not the corpus. + corpus: + name: Corpus sweep (blocking) + if: github.event_name != 'schedule' + runs-on: ubuntu-latest + timeout-minutes: 90 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-conformance-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- + + # EVERY FLAG HERE IS LOAD-BEARING, and two of them are here to STOP this job passing + # without measuring anything. + # + # -Pconformance + # Flips gie.corpus.skip to false. Without it GieConformanceTest emits a single + # ABORTED container ("disabled by -Dgie.corpus.skip=true") and surefire reports + # it as a skip, i.e. as success. The guard step below catches that specifically. + # + # -pl conformance -am + # -am is required: `-pl conformance` alone cannot resolve neoproj4j / neoproj4j-epsg + # from a fresh checkout. + # + # -Dtest='org.locationtech.proj4j.conformance.**.*Test' + # This is what gets past core's expected MetaCRSTest failure. NOT + # -Dmaven.test.failure.ignore=true: that flag forces exit 0, so it would also + # ignore THE GATE'S OWN FAILURE and turn this job green while the corpus is + # red. Narrowing gets past core without disarming anything - core simply runs + # no tests in this job. + # + # THE DOUBLE STAR IS NOT COSMETIC. golden.yaml writes + # `org.locationtech.proj4j.golden.*Test` and that works there only because + # every golden test sits directly in one package. EVERY conformance test lives + # in a SUB-package (bridge/, manifest/, parse/, report/, runner/), and surefire's + # single `*` does not cross a package separator. Measured: the single-star + # pattern here produces "No tests to run." followed by BUILD SUCCESS - a + # perfectly green job that swept nothing. Do not "simplify" this to match + # golden.yaml. + # + # -Dsurefire.failIfNoSpecifiedTests=false + # Required, and it looks backwards. With -Dtest=, surefire fails a module in + # which nothing matches - and -am builds neoproj4j-epsg, which has NO test sources + # at all, so the strict setting fails there and the sweep never runs. Same trap, + # same flag, as golden.yaml and determinism.yaml. The "something actually ran" + # guarantee is not lost; it moves to the next step, where it is asserted against + # the sweep's own surefire XML and the committed baseline, and is far stronger. + - name: Run the PROJ conformance corpus + run: | + mvn -B -ntp -Pconformance -pl conformance -am verify \ + -Dtest='org.locationtech.proj4j.conformance.**.*Test' \ + -Dsurefire.failIfNoSpecifiedTests=false \ + -Dmaven.javadoc.skip=true + + # NON-VACUITY. Everything above can succeed while measuring nothing, and this step is + # where each of those ways is ruled out. It runs on `if: always()` because a gate that + # failed for the WRONG reason still has to be caught - and because when the baseline is + # absent the step above fails and this step is what says so in plain words. + # + # Deliberately awk and shell arithmetic, never `bc`: bc is not guaranteed present on + # every runner image, and a gate that dies on a missing utility is indistinguishable + # from a gate that fails. + - name: Assert the sweep actually swept + if: always() + run: | + set -uo pipefail + reports=conformance/target/surefire-reports + xml="$reports/TEST-org.locationtech.proj4j.conformance.runner.GieConformanceTest.xml" + summary=conformance/target/conformance/summary.tsv + index=conformance/src/test/resources/gie-corpus-index.tsv + manifest=conformance/src/test/resources/gie-expected-failures.tsv + + fail() { echo "::error::$*"; exit 1; } + attr() { grep -o "$1=\"[0-9]*\"" "$2" | head -1 | sed 's/[^0-9]//g'; } + tsv() { awk -v k="$1" -F'\t' '$1 == k {print $2; found = 1} END {if (!found) print "MISSING"}' "$2"; } + rows() { grep -cv '^#' "$1"; } + + # (0) The baseline is a precondition, and its absence is a DIFFERENT failure from a + # regression. Named here too so the distinction survives into the job log even + # though the harness itself already refuses to run without it. + [ -f "$manifest" ] || fail "ABSENT BASELINE: $manifest is missing. The gate cannot run \ + without it and its absence is not a regression - restore the file, do NOT regenerate." + [ -f "$index" ] || fail "ABSENT BASELINE: $index is missing. Same as above." + + # (1) The sweep's own report must exist. If -Pconformance did not take, or -Dtest + # matched nothing, there is no report at all. + [ -f "$xml" ] || { + echo "::error::no surefire report for GieConformanceTest at $xml" + echo "::error::The sweep did not run. Either -Pconformance was ineffective, or the" + echo "::error::-Dtest pattern matched nothing - note the ** is required, see above." + ls -R "$reports" 2>/dev/null || true + exit 1; } + + ran=$(attr tests "$xml"); skipped=$(attr skipped "$xml") + echo "GieConformanceTest: tests=$ran skipped=$skipped" + + # (2) It must have SWEPT, not aborted. The skip path emits exactly one aborted + # container, so `tests=1` is the tell. Skips are never passes. + [ "${ran:-0}" -ge 7900 ] || fail "GieConformanceTest reported only ${ran:-0} tests. \ + The corpus is 7,923 assertions plus per-file leak checks and the gate container; a \ + count of 1 means the sweep was skipped by gie.corpus.skip and nothing was measured." + + # (3) Nothing OUTSIDE the sweep may be skipped. GieConformanceTest legitimately + # reports STILL_FAILING assertions as aborted, so its own skips are expected and + # are cross-checked against the manifest at (5). Everywhere else - the cross-tab + # false-positive control, the lexer census, the manifest round trips - an Assume + # that starts firing would hide a real loss of coverage. BridgeVerdictCrossTabTest + # in particular Assume-s itself out when the corpus is not vendored. + others=$(ls "$reports"/TEST-*.xml | grep -v GieConformanceTest) + otherskips=$(printf '%s\n' "$others" | tr '\n' '\0' \ + | xargs -0 grep -ho 'skipped="[0-9]*"' 2>/dev/null \ + | sed 's/[^0-9]//g' | awk '{n += $1} END {print n + 0}') + classes=$(printf '%s\n' "$others" | grep -c .) + echo "other conformance test classes: $classes with $otherskips skips" + [ "$otherskips" -eq 0 ] || fail "$otherskips conformance tests outside the sweep were \ + SKIPPED. Skips are never passes - find out which Assume fired." + [ "$classes" -ge 25 ] || fail "only $classes conformance test classes ran (expected 26 \ + or more besides the sweep). Tests were dropped, renamed out of the -Dtest pattern, or \ + not compiled." + + # (4) The sweep must have covered the same key set as the baseline it is diffed + # against. A truncated sweep - a corpus directory missing from the jar, a lexer + # failure swallowing a file - would otherwise produce a small run, a small diff and + # a quiet pass. Compared against the committed index rather than a hardcoded + # number, so a deliberate re-vendor updates both sides at once. + [ -f "$summary" ] || fail "no $summary; the sweep produced no machine summary." + evaluated=$(tsv conformance.evaluated "$summary") + notrun=$(tsv conformance.notrun "$summary") + keys=$(rows "$index") + echo "assertions evaluated=$evaluated baseline index keys=$keys notrun=$notrun" + [ "$evaluated" = "$keys" ] || fail "the sweep evaluated $evaluated assertions but the \ + committed index has $keys keys. The run did not cover the same corpus, so the diff \ + below it is not comparable. Do NOT regenerate the baseline to absorb this - find out \ + which assertions went missing." + [ "$notrun" = "0" ] || fail "$notrun assertions were never run." + + # (5) The sweep's own skips are exactly the manifest's STILL_FAILING rows - no more. + # This is what stops the aborted-assertion mechanism from quietly absorbing a + # growing population: every skip must be a row someone wrote down. + stillfailing=$(tsv diff.still_failing "$summary") + manifestrows=$(($(rows "$manifest") - 1)) # minus the column header + echo "sweep skips=$skipped still_failing=$stillfailing manifest rows=$manifestrows" + [ "$skipped" = "$stillfailing" ] || fail "the sweep aborted $skipped assertions but the \ + diff calls only $stillfailing of them STILL_FAILING." + [ "$stillfailing" -le "$manifestrows" ] || fail "$stillfailing STILL_FAILING assertions \ + against a manifest of only $manifestrows rows." + + # (6) The headline, and the three build-failing classifications restated by name. The + # Maven step has already failed if any of these is non-zero; repeating them here + # puts the reason in one line instead of in a stack trace. + for k in diff.regressed diff.unexpected_pass diff.disappeared; do + v=$(tsv "$k" "$summary") + echo "$k = $v" + [ "$v" = "0" ] || fail "$k = $v. See the conformance-report artifact for the keys." + done + echo "Non-vacuity satisfied: $evaluated assertions swept against a $keys-key baseline." + head -1 conformance/target/conformance/report.txt + + - name: Upload conformance report + if: always() + uses: actions/upload-artifact@v4 + with: + name: conformance-report + # Settled 2026-08-01: GieConformanceTest writes report.txt, summary.tsv, + # differences.txt and expect-failures.tsv into conformance/target/conformance/. + # differences.txt is the one that matters on a failure - it names every REGRESSED + # key with its expected and observed outcome. The surefire XML is kept because a + # per-assertion failure message is not in the report. + path: | + conformance/target/conformance/** + conformance/target/surefire-reports/** + conformance/src/test/resources/gie-manifest.sha256 + if-no-files-found: warn + retention-days: 30 + + - name: Summary + if: always() + run: | + { + echo "## PROJ conformance corpus" + echo "" + if [ -f conformance/target/conformance/report.txt ]; then + echo '```' + head -12 conformance/target/conformance/report.txt + echo '```' + else + echo "No report was produced. Either the sweep did not run, or the checked-in" + echo "baseline (\`gie-expected-failures.tsv\` + \`gie-corpus-index.tsv\`) is absent -" + echo "which is a hard failure by design and is **not** a regression." + fi + echo "" + if [ -s conformance/target/conformance/differences.txt ]; then + echo '```' + head -60 conformance/target/conformance/differences.txt + echo '```' + fi + echo "" + echo "The headline is \`genuine / (corpus - vacuous)\`. A REGRESSED row is an" + echo "assertion that used to pass and does not any more. It is never fixed by" + echo "regenerating the baseline: \`-Dgie.regenerate=true\` exists to record a" + echo "deliberate re-vendor, not to absorb a delta." + } >> "$GITHUB_STEP_SUMMARY" + + # Same reason as ci.yaml: scrub before actions/cache's post step saves the cache, so + # a locally-built proj4j snapshot cannot be baked in and silently satisfy a later run. + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" + + # --------------------------------------------------------------------------- + # BLOCKING. Proves the vendored corpus in this repo is byte-for-byte what the pinned + # upstream rev produces. Without this, "vendored from PROJ 9.8.1" is a claim in a + # comment; a hand-edit to a .gie file - or a well-meant fix to an expected value - + # would be invisible, and the conformance number would be measured against a corpus + # nobody can reproduce. + # + # Three independent checks: + # 1. shasum -c against the committed manifest: the working tree matches its own manifest. + # 2. re-run sync-upstream.sh from a real PROJ checkout, then git diff --exit-code: + # the working tree matches upstream. + # 3. shasum -c again after the sync: the regenerated manifest is self-consistent. + vendored-corpus-matches-upstream: + name: Vendored corpus matches pinned PROJ (blocking) + if: github.event_name != 'schedule' + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Check out proj4j + uses: actions/checkout@v4 + with: + path: proj4j + + - name: Check out PROJ at the pinned rev + uses: actions/checkout@v4 + with: + repository: OSGeo/PROJ + ref: ${{ env.PROJ_REV }} + path: PROJ + # fetch-depth: 0 is required, not cosmetic. sync-upstream.sh resolves the pin by + # NAME - `git rev-parse --verify 9.8.1^{commit}` - and then extracts with + # `git archive 9.8.1 test/gie`. A shallow clone can leave the tag object absent + # locally, in which case rev-parse fails and the script dies with + # "revision '9.8.1' does not exist". + fetch-depth: 0 + + - name: Confirm the checked-out PROJ rev is the pinned SHA + run: | + set -euo pipefail + actual="$(git -C PROJ rev-parse --verify "${PROJ_REV}^{commit}")" + echo "PROJ ${PROJ_REV} -> $actual" + if [ "$actual" != "$PROJ_REV_SHA" ]; then + echo "::error::PROJ ${PROJ_REV} resolves to $actual, expected $PROJ_REV_SHA" + exit 1 + fi + + # Comment lines are stripped first: the manifest carries a three-line header, and + # GNU sha256sum treats unparsable lines as an error ("WARNING: N lines are improperly + # formatted", exit 1). Reading from stdin also makes the check independent of which + # SHA-256 tool wrote the file. + - name: Verify the committed manifest against the committed corpus + working-directory: proj4j/conformance/src/test/resources + run: | + set -euo pipefail + grep -cv '^#' gie-manifest.sha256 + grep -v '^#' gie-manifest.sha256 | shasum -a 256 -c - + + # PROJ_DIR is passed as $1, the script's documented override + # (PROJ_DIR="${1:-${PROJ_DIR:-$PROJ_DIR_DEFAULT}}"); the default points at a local + # path that does not exist on a runner. SCRIPT_DIR is derived from BASH_SOURCE, so + # the script writes into the proj4j checkout regardless of the working directory. + - name: Re-vendor from the pinned PROJ + run: ./proj4j/conformance/sync-upstream.sh "$GITHUB_WORKSPACE/PROJ" + + # --intent-to-add makes untracked files visible to `git diff`, so a file that + # upstream ADDED is caught too - a plain `git diff --exit-code` only sees + # modifications and deletions and would pass straight over a new .gie file. + - name: Assert no drift from the pinned upstream + working-directory: proj4j + run: | + set -euo pipefail + git add --intent-to-add -- conformance/src/test/resources + if ! git diff --exit-code -- conformance/src/test/resources; then + echo "::error::conformance/src/test/resources differs from what PROJ ${PROJ_REV} produces. Re-run conformance/sync-upstream.sh and commit the result." + git diff --stat -- conformance/src/test/resources + exit 1 + fi + echo "Vendored corpus is identical to PROJ ${PROJ_REV} (${PROJ_REV_SHA})." + + - name: Verify the regenerated manifest + working-directory: proj4j/conformance/src/test/resources + run: | + set -euo pipefail + grep -v '^#' gie-manifest.sha256 | shasum -a 256 -c - + + - name: Capture the drift diff on failure + if: failure() + working-directory: proj4j + run: git diff -- conformance/src/test/resources > "$RUNNER_TEMP/corpus-drift.diff" || true + + - name: Upload the drift diff + if: failure() + uses: actions/upload-artifact@v4 + with: + name: corpus-drift-pinned + path: ${{ runner.temp }}/corpus-drift.diff + if-no-files-found: warn + retention-days: 14 + + # --------------------------------------------------------------------------- + # ADVISORY, SCHEDULED WEEKLY. Syncs from PROJ master instead of the pin and reports what + # would change. This is a news feed, not a gate: it tells us upstream touched the corpus + # while there is still time to react, instead of at re-pin time when it is a surprise + # in the middle of other work. It must never fail the build. + # + # Two things this job knows about the script that a reader should not have to rediscover: + # * PROJ_REV / PROJ_REV_SHA are plain assignments, not env-overridable, and the script + # ALWAYS extracts from $PROJ_REV. Pointing it at a master checkout is not enough - it + # would happily re-vendor 9.8.1 from the tag that checkout also fetched. So the + # variables are rewritten in a sibling copy of the script, kept next to the original + # because SCRIPT_DIR comes from BASH_SOURCE and decides where the files land. + # * The script dies if tinshift_gpkg*.gie appear, and they exist on master. So a master + # sync is EXPECTED to abort at step [1/4]. That abort is itself the drift report - + # the corpus directories have already been replaced by then, so the diff is + # meaningful either way. + upstream-drift: + name: Upstream corpus drift vs PROJ master (advisory) + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + timeout-minutes: 30 + continue-on-error: true + steps: + - name: Check out proj4j + uses: actions/checkout@v4 + with: + path: proj4j + + - name: Check out PROJ master + uses: actions/checkout@v4 + with: + repository: OSGeo/PROJ + ref: master + path: PROJ + # Depth 1 is enough here: actions/checkout creates a local `master` branch at the + # fetched commit, so `git rev-parse master` and `git archive master` both work, + # and no tag needs to resolve. Cheaper than the full clone the pinned job needs. + fetch-depth: 1 + + - name: Sync from master and report drift + continue-on-error: true + run: | + set -uo pipefail + master_sha="$(git -C PROJ rev-parse --verify 'master^{commit}')" + echo "PROJ master = $master_sha" + + cp proj4j/conformance/sync-upstream.sh proj4j/conformance/sync-upstream.master.sh + sed -i \ + -e "s|^PROJ_REV=.*|PROJ_REV=master|" \ + -e "s|^PROJ_REV_SHA=.*|PROJ_REV_SHA=${master_sha}|" \ + proj4j/conformance/sync-upstream.master.sh + + # Expected to exit non-zero on the tinshift_gpkg guard - see the job comment. + ./proj4j/conformance/sync-upstream.master.sh "$GITHUB_WORKSPACE/PROJ" || true + rm -f proj4j/conformance/sync-upstream.master.sh + + cd proj4j + git add --intent-to-add -- conformance/src/test/resources + { + echo "## Corpus drift: PROJ master vs pinned ${PROJ_REV}" + echo + echo "- pinned rev: \`${PROJ_REV}\` (\`${PROJ_REV_SHA}\`)" + echo "- master: \`${master_sha}\`" + echo + if git diff --quiet -- conformance/src/test/resources; then + echo "No drift. The corpus on master is identical to the pin." + else + echo '```' + git --no-pager diff --stat -- conformance/src/test/resources + echo '```' + fi + } >> "$GITHUB_STEP_SUMMARY" + + git --no-pager diff -- conformance/src/test/resources \ + > "$RUNNER_TEMP/corpus-drift-master.diff" || true + + # Put the checkout back, so nothing downstream sees a mutated tree. + git reset -- conformance/src/test/resources + git checkout -- conformance/src/test/resources + git clean -fdq -- conformance/src/test/resources + + - name: Upload the master drift diff + if: always() + uses: actions/upload-artifact@v4 + with: + name: corpus-drift-master + path: ${{ runner.temp }}/corpus-drift-master.diff + if-no-files-found: warn + retention-days: 30 diff --git a/.github/workflows/determinism.yaml b/.github/workflows/determinism.yaml new file mode 100644 index 0000000..43db2fa --- /dev/null +++ b/.github/workflows/determinism.yaml @@ -0,0 +1,427 @@ +name: Determinism + +# THE CROSS-ARCHITECTURE PROOF. +# +# proj4j's headline non-functional guarantee is that a coordinate transform produces the same bits on +# every JVM and every architecture, because a downstream Spark consumer caches one CoordinateTransform +# and shares it across executors that may not be on the same hardware. The guarantee is implemented by +# routing every transcendental through StrictMath, or through util/FastStrictTrig which is a +# bit-identical allocation-free transcription of the JDK's FdLibm kernels. +# +# It is also not only about reproducibility. At `+proj=adams_ws2 +ellps=WGS84` and `(179.999, 0)` the +# map's conditioning amplifies a last-bit difference in `sin` by ~3e8, so `Math.sin` misses +# adams_ws2.gie:2139 by 27.8 mm against a 1 mm tolerance while `StrictMath.sin` hits it at 0.35 mm. +# Neither is more accurate - the exact value sits between them - so what is being preserved is +# fidelity to the fdlibm-equivalent `sin` that generated PROJ's expected values. The policy decides a +# conformance verdict, not just a determinism property. +# +# WHY THIS WORKFLOW EXISTS SEPARATELY FROM ci.yaml's `determinism` job. That job runs the same suite +# under a hostile Locale, charset and timezone, and it has an arm64 leg - but it only checks that the +# suite still PASSES. It does not compare numeric output between legs, and its own comment says so. +# This workflow does the comparison. That is the difference between asserting the guarantee and +# proving it. +# +# VERIFICATION STATUS. Unlike everything else in .github/, the Java side of this has been run. +# StrictMathGoldenTableTest and NanBitPatternTest were executed locally on five JDK/ISA combinations +# before this file was written: +# +# Temurin 8.0.502 x86-64 StrictMath.sin native (JNI fdlibm) 54,265 pass +# Temurin 11.0.32 x86-64 StrictMath.sin native (JNI fdlibm) 54,265 pass +# Temurin 11.0.32 aarch64 StrictMath.sin native (JNI fdlibm) 54,265 pass +# Temurin 21.0.11 aarch64 StrictMath.sin pure Java (FdLibm) 54,265 pass +# OpenJDK 26.0.2 aarch64 StrictMath.sin pure Java (FdLibm) 54,265 pass +# +# 271,325 StrictMath and 221,970 FastStrictTrig raw-bit comparisons, zero value mismatches, across +# two instruction sets and both StrictMath implementations. The YAML itself has never executed. + +on: + push: + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + # --------------------------------------------------------------------------- + # BLOCKING. Run the determinism suite on each (architecture, JDK) pair and upload the tables it + # emits. Each leg independently asserts the committed golden, so a single leg going red is already + # a real finding; the cross-leg job below adds what a single leg cannot see. + # + # WHY BOTH JDK 11 AND 17/21 LEGS, when ci.yaml's build job only does 17 and 21: JDK **21** rewrote + # StrictMath.sin/cos/tan from JNI-into-compiled-fdlibm to pure Java. Those are different + # implementations in different languages reached by different mechanisms, so a pass on 21 is not + # evidence about 11. Verified locally that 11 passes - do not drop the leg on the assumption that + # it must, because the migration was not even uniform within a release: on 11, StrictMath.pow and + # StrictMath.exp are already pure Java while sin, cos, tan and log are still native. + # + # CORRECTED 2026-08-03: this comment said "JDK 17 rewrote StrictMath". THE BOUNDARY IS 21, NOT 17, + # and that matters here because this comment is the stated reason the matrix has both an 11 and a + # 17/21 leg. Proved three ways on Temurin 17.0.20 vs 21.0.11, aarch64: Modifier.isNative( + # StrictMath.sin) true/false; java.lang.FdLibm$Sin ClassNotFound/loadable; jimage 5/23 FdLibm + # classes. So JDK 17 sits on the NATIVE side, with 8 and 11 - which means the matrix as written + # covers both implementations, but for a different reason than the one given, and the 17 leg is + # not the "pure Java" arm anyone reading this would assume. The same false premise nearly shipped + # an MR-JAR whose META-INF/versions/17 would have put JDK 17 on the slow path. + # + # JDK 8 is deliberately absent from this matrix even though it passed locally. --release 8 is a + # javac 9+ flag, so JDK 8 cannot run the build at all; ci.yaml's jdk8-runtime job is the right place + # for Java 8 evidence and it forks only the test JVM. Java 8 also carries a determinism hazard of + # its own that has nothing to do with StrictMath - see the toRadians note in the cross-arch job. + bits: + name: ${{ matrix.arch }} / JDK ${{ matrix.java }} + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + include: + - { os: ubuntu-latest, arch: x86-64, java: '11' } + - { os: ubuntu-latest, arch: x86-64, java: '17' } + - { os: ubuntu-latest, arch: x86-64, java: '21' } + # These three legs depend on GitHub-hosted arm64 runners, which are free for PUBLIC + # repositories on github.com. That is the condition this repository meets, so they should + # allocate. They would not on a private repository, and they cannot on GitHub Enterprise + # Server at all, which has no hosted-runner fleet -- there `ubuntu-24.04-arm` resolves only + # if someone registers an arm64 self-hosted runner carrying that label. + # If they ever fail to allocate, that is a LOUD failure rather than a silent skip, which is + # the correct behaviour: a silently-absent aarch64 leg would leave the determinism claim + # unproven while the workflow looked green, and the `cross-arch` job below would then be + # comparing x86-64 against itself. Do not "fix" that by deleting the legs quietly -- either + # restore an arm64 runner, or remove them and record the loss of the cross-arch claim. + - { os: ubuntu-24.04-arm, arch: aarch64, java: '11' } + - { os: ubuntu-24.04-arm, arch: aarch64, java: '17' } + - { os: ubuntu-24.04-arm, arch: aarch64, java: '21' } + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: ${{ matrix.java }} + + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + # runner.arch is in the key: without it the arm64 legs would share a cache entry with the + # x64 legs and race each other for the save. + key: ${{ runner.os }}-${{ runner.arch }}-maven-det-jdk${{ matrix.java }}-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-${{ runner.arch }}-maven-det- + ${{ runner.os }}-${{ runner.arch }}-maven- + + # Record what actually ran. `os.arch` from the JVM rather than the runner label, because the + # label is what we asked for and os.arch is what we got - and a determinism claim attributed to + # the wrong architecture is worse than no claim. + - name: Report the JVM under test + run: | + set -euo pipefail + java -version + cat > /tmp/Arch.java <<'EOF' + public class Arch { + public static void main(String[] a) throws Exception { + System.out.println("os.arch=" + System.getProperty("os.arch")); + System.out.println("java.version=" + System.getProperty("java.version")); + java.lang.reflect.Method m = StrictMath.class.getDeclaredMethod("sin", double.class); + System.out.println("StrictMath.sin native=" + + java.lang.reflect.Modifier.isNative(m.getModifiers())); + } + } + EOF + javac -d /tmp /tmp/Arch.java && java -cp /tmp Arch + + # -Dtest= narrows to the determinism package. The rest of core's suite runs in ci.yaml; running + # it again here would triple this workflow's cost while adding nothing, because what this + # workflow contributes is the CROSS-LEG comparison of the emitted tables, not another pass/fail. + # + # WHY failIfNoSpecifiedTests IS *FALSE* HERE, WHICH LOOKS BACKWARDS. The flag exists for exactly + # the failure mode this workflow must not have - a rename or package move makes surefire match + # nothing, report success, and turn the whole thing into a decoration that can never fail. But + # setting it true does not work: `-am` also builds neoproj4j-epsg, which has no test sources at + # all, so the strict flag fails *there* and the determinism tests never run. Verified by running + # it: "No tests matching pattern ... were executed!" on project neoproj4j-epsg. + # + # So the guard moves to the next step and gets stronger in the process: instead of "at least one + # test ran somewhere", assert the exact number of tests in core's own surefire XML. That catches + # a rename, a package move, AND a test being silently dropped from a class - which the flag would + # not have caught. + - name: Run the determinism suite + run: | + mvn -B -ntp -pl core -am test \ + -Dtest='org.locationtech.proj4j.determinism.*Test' \ + -Dsurefire.failIfNoSpecifiedTests=false \ + -Dmaven.javadoc.skip=true \ + -DargLine="-Dproj4j.determinism.outDir=${{ github.workspace }}/core/target/determinism" + + # The real "something was actually measured" guard: a FLOOR on the test count, plus a printed + # drift when the true count has moved above it. Running nothing still fails; adding a test + # never does. + # + # WHY A FLOOR AND NOT AN EXACT COUNT - THIS CONSTANT HAS NOW BEEN STALE TWICE, AND BOTH TIMES + # IT WOULD HAVE FAILED THE JOB ON A BOOKKEEPING ERROR RATHER THAN A DEFECT. + # + # 9 -> 15 (2026-08-01). 9 was StrictMathGoldenTableTest (6) + NanBitPatternTest (3), the two + # classes this file's header talks about. But `-Dtest='...determinism.*Test'` also + # matches NoJdkAngleConversionTest, which lives in the same package and adds 6. + # 15 -> 22 (2026-08-02). NoAmbientLocaleInCoreTest joined the same package and adds 7. + # Measured, not counted from a brief: this exact Maven invocation on Temurin 21 / + # aarch64 reports "Tests run: 22, Failures: 0, Errors: 0, Skipped: 0" across four + # surefire XMLs (6 + 3 + 7 + 6), cross-checked against 22 `@Test` methods in the + # package's sources. + # + # An exact count makes every unrelated test addition a red build in a workflow the author of + # that test has no reason to be looking at, and the second occurrence is the one that settles + # it: the pattern is not "someone forgot", it is that the constant is coupled to a package + # that other streams legitimately grow. What the exact count bought - noticing a DROP from 22 + # to 15 - is what the floor still buys, because the floor IS 22. What it gives up is noticing + # a rise, and that is printed as a ::notice:: on every run instead of swallowed, so it cannot + # go unrecorded. This is deliberately the same shape as docker/run.sh's check_determinism, + # which asserts DET_FLOOR_TESTS and separately reports the drift; keep the two in step. + # + # RAISE THE FLOOR when tests are added on purpose. It is a ratchet, not a ceiling. + - name: Assert the determinism tests actually ran + run: | + set -euo pipefail + # Floor, not an exact count. Measured 2026-08-02; raise it when tests are added. + DET_FLOOR_TESTS=22 + # `|| xml=0` is required, not defensive. With `set -euo pipefail`, a bare + # `xml=$(ls ... | wc -l)` where the glob matches nothing makes `ls` fail, pipefail + # propagates it, and `set -e` kills the script on the ASSIGNMENT - exit 1 with not one + # word of explanation, in the exact case this guard exists to explain. Putting the + # assignment in an AND-OR list suppresses `set -e` and lets the message below print. + # Verified by running the step against an empty surefire-reports directory. + xml=$(ls core/target/surefire-reports/TEST-org.locationtech.proj4j.determinism.*.xml 2>/dev/null | wc -l | tr -d ' ') || xml=0 + [ "$xml" -ge 2 ] || { + echo "::error::expected at least 2 determinism surefire reports, found $xml." + echo "::error::The tests did not run. A workflow that runs no assertions is not a pass." + exit 1; } + # awk rather than `bc`: bc is not guaranteed present on every runner image, and a gate + # that dies on a missing utility is indistinguishable from a gate that fails. + sum() { + grep -ho "$1=\"[0-9]*\"" core/target/surefire-reports/TEST-org.locationtech.proj4j.determinism.*.xml \ + | sed "s/[^0-9]//g" | awk '{n += $1} END {print n + 0}' + } + ran=$(sum tests) + fail=$(sum failures) + err=$(sum errors) + skip=$(sum skipped) + echo "determinism tests: ran=$ran failures=$fail errors=$err skipped=$skip across $xml classes" + ls core/target/surefire-reports/TEST-org.locationtech.proj4j.determinism.*.xml \ + | sed 's|.*TEST-| |; s|\.xml$||' + [ "$ran" -ge "$DET_FLOOR_TESTS" ] || { + echo "::error::only $ran determinism tests ran; the floor is $DET_FLOOR_TESTS." + echo "::error::Either the tests did not run, or they were renamed out of the -Dtest" + echo "::error::pattern, or a test was dropped from a class. A run that makes no" + echo "::error::assertions is not a pass. If tests were removed on purpose, lower" + echo "::error::DET_FLOOR_TESTS in this workflow in the same commit." + exit 1; } + # Drift is reported, never fatal. A test added to this package by another stream must not + # turn this job red - but it must not go unnoticed either. + if [ "$ran" -gt "$DET_FLOOR_TESTS" ]; then + echo "::notice::determinism test count has drifted UP: $ran ran, floor is" \ + "$DET_FLOOR_TESTS (+$((ran - DET_FLOOR_TESTS))). Not a failure. Raise" \ + "DET_FLOOR_TESTS in .github/workflows/determinism.yaml so the floor keeps" \ + "tracking reality, and update docker/run.sh's DET_FLOOR_TESTS with it." + fi + # Skips are never passes - the same rule the conformance harness enforces. + [ "$skip" -eq 0 ] || { echo "::error::$skip determinism tests were skipped"; exit 1; } + [ "$fail" -eq 0 ] && [ "$err" -eq 0 ] || { echo "::error::determinism tests failed"; exit 1; } + + # The emitted tables are the payload. Each leg writes its own Math-divergence tally and its own + # NaN bit patterns; neither can be checked from inside one leg. + - name: Upload the determinism tables + if: always() + uses: actions/upload-artifact@v4 + with: + name: determinism-${{ matrix.arch }}-jdk${{ matrix.java }} + path: core/target/determinism/** + if-no-files-found: error + retention-days: 14 + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-determinism-${{ matrix.arch }}-jdk${{ matrix.java }} + path: '**/target/surefire-reports/**' + if-no-files-found: warn + retention-days: 7 + + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" + + # --------------------------------------------------------------------------- + # BLOCKING. The assertions that no single leg can make. + # + # Three of them, and they are not interchangeable: + # + # 1. EVERY LEG PASSED. The committed golden is the same file on every leg, so six green legs mean + # six architecture/JDK combinations produced identical StrictMath bits. That is the guarantee. + # Enforced by `needs` plus an explicit check on the artifact set, because `needs` alone would + # also be satisfied if a leg's test silently matched nothing. + # + # 2. AT LEAST ONE LEG SHOWS Math DIVERGING from that golden. This is the non-vacuity check, and it + # CANNOT be made inside a leg. Measured locally: on Temurin 11/aarch64 Math and StrictMath are + # bit-identical on all 54,265 probes - 0.00% divergence, every function - while the same JDK on + # x86-64 diverges on 2.95% and Temurin 21/aarch64 on 0.55%. So an in-leg assertion that "Math + # must differ" would have shipped a permanently red JDK 11 arm64 leg for a non-defect, and a + # permanently red gate is a disabled gate. Asserting it across the matrix puts the check where + # it is actually true. + # + # That same-JDK x86-64-vs-aarch64 pair is worth naming as the finding it is: it is a direct + # demonstration that HotSpot's Math intrinsics are architecture-dependent, which is the premise + # the entire StrictMath policy rests on and which had never been demonstrated for this project. + # + # 3. THE NaN CARVE-OUT IS REPORTED, NOT ASSERTED AWAY. NaN sign and payload are + # architecture-dependent: with the JDK held at Temurin 11.0.32 and only the ISA varied, + # `Inf - Inf`, `Inf * 0.0`, `Inf / Inf` and `sqrt(-1)` are 0xfff8000000000000 on x86-64 and + # 0x7ff8000000000000 on AArch64. This job prints the difference rather than failing on it, + # because the JLS specifies only that those expressions yield *a* NaN. It matters concretely: + # the fail-closed sentinel policy writes NaN to every ordinate of a failed point, so error rows + # in any golden table are exactly the rows that cannot be raw-bit compared across + # architectures. + cross-arch: + name: Cross-architecture comparison + runs-on: ubuntu-latest + needs: bits + timeout-minutes: 10 + steps: + - uses: actions/download-artifact@v4 + with: + pattern: determinism-* + path: tables + + - name: Show every leg's tables + run: | + set -euo pipefail + find tables -type f | sort + for f in $(find tables -name '*.tsv' | sort); do + echo "::group::$f"; cat "$f"; echo "::endgroup::" + done + + - name: Assert every expected leg reported + run: | + set -euo pipefail + missing=0 + for leg in x86-64-jdk11 x86-64-jdk17 x86-64-jdk21 \ + aarch64-jdk11 aarch64-jdk17 aarch64-jdk21; do + if [ ! -f "tables/determinism-$leg/math-divergence.tsv" ]; then + echo "::error::leg $leg produced no math-divergence.tsv" + missing=1 + fi + if [ ! -f "tables/determinism-$leg/nan-patterns.tsv" ]; then + echo "::error::leg $leg produced no nan-patterns.tsv" + missing=1 + fi + done + [ "$missing" -eq 0 ] || { + echo "::error::at least one leg did not report. A leg that runs no assertions is not a" + echo "::error::pass - the whole point of this workflow is that all six agree, so a" + echo "::error::missing leg leaves the guarantee unproven." + exit 1; } + echo "All six legs reported." + + # Assertion 2. The measurement is per leg; the conclusion is per matrix. + - name: Assert Math diverges on at least one leg (non-vacuity) + run: | + set -euo pipefail + any=0 + echo "leg Math rows differing from the StrictMath golden" + for f in $(find tables -name 'math-divergence.tsv' | sort); do + leg=$(basename "$(dirname "$f")") + # The TOTAL row is 'TOTALdifferingtotal-' + d=$(awk -F'\t' '$1=="TOTAL"{print $2}' "$f") + t=$(awk -F'\t' '$1=="TOTAL"{print $3}' "$f") + printf ' %-30s %s / %s\n' "$leg" "$d" "$t" + [ "${d:-0}" -gt 0 ] && any=1 + done + [ "$any" -eq 1 ] || { + echo "::error::Math agreed with the StrictMath golden on EVERY leg. The golden therefore" + echo "::error::cannot distinguish the two implementations anywhere in this matrix, so" + echo "::error::passing it proves nothing about the StrictMath policy. Either HotSpot" + echo "::error::stopped intrinsifying sin/cos/tan/exp/log/pow entirely - in which case the" + echo "::error::policy is temporarily free and that should be recorded as the reason - or" + echo "::error::the probe set has drifted somewhere that no longer exercises the" + echo "::error::difference. Do not relax this check to make it pass." + exit 1; } + echo "Non-vacuity satisfied: at least one leg shows Math departing from the golden." + + # Assertion 2b, the sharper form. Same JDK, different ISA. This is the pair that demonstrates + # architecture dependence directly rather than by inference, so it is worth its own step and its + # own output even though the previous step already passed. + - name: Report Math divergence per architecture at a fixed JDK + run: | + set -euo pipefail + for jdk in 11 17 21; do + x="tables/determinism-x86-64-jdk$jdk/math-divergence.tsv" + a="tables/determinism-aarch64-jdk$jdk/math-divergence.tsv" + [ -f "$x" ] && [ -f "$a" ] || continue + dx=$(awk -F'\t' '$1=="TOTAL"{print $2}' "$x") + da=$(awk -F'\t' '$1=="TOTAL"{print $2}' "$a") + echo "JDK $jdk: Math differs from the golden on $dx rows (x86-64) vs $da rows (aarch64)" + if [ "$dx" != "$da" ]; then + echo " -> the SAME JDK diverges by a DIFFERENT amount on the two architectures." + echo " This is the premise of the StrictMath policy, demonstrated rather than" + echo " assumed. Measured locally on Temurin 11.0.32: 1599 vs 0." + fi + done + + # Assertion 1, made explicit. The golden is one committed file; if two legs both passed against + # it, they produced the same bits. Diffing the emitted tables adds nothing for StrictMath - but + # it is the only way to see the NaN divergence, which is deliberately not a failure. + - name: Report the NaN carve-out across architectures + run: | + set -euo pipefail + x="tables/determinism-x86-64-jdk21/nan-patterns.tsv" + a="tables/determinism-aarch64-jdk21/nan-patterns.tsv" + if [ -f "$x" ] && [ -f "$a" ]; then + echo "NaN bit patterns, x86-64 vs aarch64 on JDK 21:" + # Drop the header lines that legitimately differ (javaVersion, osArch) before diffing. + diff <(grep -vE '^(javaVersion|osArch|#)' "$x") \ + <(grep -vE '^(javaVersion|osArch|#)' "$a") && { + echo " identical on this pair." + } || { + echo "" + echo " The differences above are EXPECTED and are NOT a failure. x86-64's default NaN" + echo " has the sign bit set; AArch64's does not, and the JLS specifies only that these" + echo " expressions yield *a* NaN. Recorded so the boundary of the bit-for-bit" + echo " guarantee is visible: every FINITE result is identical across architectures," + echo " NaN payloads are not, and the fail-closed sentinel writes NaN - so error rows" + echo " in a golden table cannot be raw-bit compared across architectures." + } + else + echo "JDK 21 pair not both present; nothing to compare." + fi + + - name: Summary + run: | + { + echo "## Determinism" + echo "" + echo "The committed golden (\`strictmath-golden.tsv\`, 54,265 results across 19" + echo "functions) was asserted independently by every leg below. Six green legs mean six" + echo "architecture/JDK combinations produced **identical raw bits** for every" + echo "\`StrictMath\` and \`FastStrictTrig\` result." + echo "" + echo "| leg | Math rows differing from the golden |" + echo "|---|---|" + for f in $(find tables -name 'math-divergence.tsv' | sort); do + leg=$(basename "$(dirname "$f")") + d=$(awk -F'\t' '$1=="TOTAL"{print $2}' "$f") + t=$(awk -F'\t' '$1=="TOTAL"{print $3}' "$f") + echo "| \`${leg#determinism-}\` | $d / $t |" + done + echo "" + echo "A leg showing 0 is not a defect - it means \`Math\` and \`StrictMath\` happen to" + echo "agree there. Non-vacuity is a property of the matrix: at least one leg must" + echo "diverge, and that is asserted above rather than inside any leg." + echo "" + echo "**Known carve-out:** NaN sign and payload are architecture-dependent and outside" + echo "the bit-for-bit guarantee. Finite results and signed zero are inside it." + } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/golden.yaml b/.github/workflows/golden.yaml new file mode 100644 index 0000000..63b5d3d --- /dev/null +++ b/.github/workflows/golden.yaml @@ -0,0 +1,240 @@ +name: Golden Master + +# THE BEHAVIOURAL CHANGE DETECTOR. +# +# `golden` answers exactly one question - "did we change proj4j's behaviour in a way we did not +# mean to?" - over 53,430 rows covering 9,013 registry CRS plus a synthetic parameter matrix and +# the MetaCRS CSVs. Every row that differs from the pinned 1.4.3 baseline must be claimed by +# exactly one rule in golden/rules.yaml, with an exact row count, a reason and an expiry, or the +# build fails. See golden/README.md. +# +# WHY THIS FILE EXISTS. Until it did, the gate ran ONLY when a human typed the command. The +# module is not in the root pom's default - that is deliberate, so `mvn install` stays +# fast and `core` stays dependency-free - and no workflow passed `-Pgolden`, so nothing in CI +# compiled golden/src/main either. That is worse than it sounds: golden/pom.xml states a signal +# it could not send, namely "if a change to core breaks the default-profile compile of +# golden/src/main, that is a signal, not an inconvenience". Nothing compiled it, so nothing could +# fire. This job restores both properties: the compile happens, and the sweep runs. +# +# THIS JOB IS RED TODAY, AND THAT IS THE CORRECT OUTCOME. Measured 2026-08-01 on a frozen +# snapshot of the working tree: +# +# 12,023 UNCHANGED · 41,407 CHANGED · 0 ADDED · 0 REMOVED · 39,116 INTENDED · 2,291 UNEXPLAINED +# +# The 2,291 are the triage backlog - other streams' in-flight changes that have not yet been +# claimed by a rule - not a defect in this module and not a reason to soften the job. See +# golden/README.md's triage sections for the breakdown and the owners. +# +# DO NOT ADD `continue-on-error` TO GET PAST THEM. golden/README.md says so directly, and the +# reason is that the alternative is strictly better: a `status: pending` rule is visible in the +# diff, must match exactly zero rows, and fails loudly the moment it matches one. A +# continue-on-error job is invisible in the diff and fails never. A gate that reports success +# because it cannot see is the exact failure this file was written to end. +# +# VERIFICATION STATUS. The Maven invocation below - flags and all - was run locally on Temurin 21 +# against a frozen /tmp snapshot, and was shown BOTH to fail on the real backlog and to fail with +# a COUNT_MISMATCH naming the rule when a pinned `expected_rows` was altered by one. The YAML +# itself has not executed; treat the first run as its first test. + +on: + push: + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + # --------------------------------------------------------------------------- + # BLOCKING. Generate the table from the working tree, merge-join it against + # golden/baseline/1.4.3, apply golden/rules.yaml, and fail on any UNEXPLAINED row, DEAD_RULE, + # PENDING_RULE_FIRED, EXPIRED_RULE or COUNT_MISMATCH. + golden: + name: Golden master (behavioural regression, blocking) + runs-on: ubuntu-latest + # The sweep itself is ~20 s once core is built; the budget is almost entirely the reactor + # build and a cold Maven cache. Generous rather than tuned - tighten it once there is a + # measured number from a real run. + timeout-minutes: 45 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + + - uses: actions/cache@v4 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-golden-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven-golden- + ${{ runner.os }}-maven- + + # EVERY FLAG HERE IS LOAD-BEARING. Removing any one of them either breaks the run or, + # worse, makes it pass without measuring anything. + # + # -Pgolden + # Does TWO separate things and both are required. (a) The root pom's `golden` profile + # is what adds golden; without it `-pl golden` cannot even resolve + # the module. (b) It flips golden.skip to false. Without (b) GoldenMasterTest + # Assume-s itself out and surefire reports it SKIPPED - a green job that swept nothing. + # The guard step below exists for exactly that failure mode. + # + # -pl golden -am + # -am is required: `-pl golden` alone cannot resolve neoproj4j / neoproj4j-epsg from the + # reactor. geoapi, db, grids-us-legacy and conformance are not on golden's dependency + # path and are not built. + # + # -Dtest='org.locationtech.proj4j.golden.*Test' + # NOT an optimisation - it is what keeps the job honest. `-am` also builds `core`, + # whose suite currently has one expected failure (MetaCRSTest). Without narrowing, the + # reactor stops in `core` and golden never runs, so the usual workaround is + # `-Dmaven.test.failure.ignore=true` - and THAT FLAG WOULD ALSO IGNORE THE GATE'S OWN + # FAILURE, turning this job green while the gate is red. The local diagnostic command + # in golden/README.md uses it deliberately, because there the goal is to read the + # report; here the goal is to fail. Narrowing gets both: core's red test is never + # run in this job, and golden's failures stay fatal. + # + # -Dsurefire.failIfNoSpecifiedTests=false + # Required, and it looks backwards. With `-Dtest=`, surefire fails a module in which + # nothing matches - and `-am` builds neoproj4j-epsg, which has NO test sources at all, so + # the strict setting fails there and golden never runs. This is a known trap in this + # repository; determinism.yaml carries the same flag for the same reason. The + # "something actually ran" guarantee is not lost, it moves to the next step, where it + # is asserted on golden's own surefire XML and is strictly stronger. + - name: Run the golden gate + run: | + mvn -B -ntp -Pgolden -pl golden -am verify \ + -Dtest='org.locationtech.proj4j.golden.*Test' \ + -Dsurefire.failIfNoSpecifiedTests=false \ + -Dmaven.javadoc.skip=true + + # NON-VACUITY. Everything above can succeed while measuring nothing, in three distinct ways, + # and each has its own check here. This step runs even when the gate failed (`if: always()`) + # because a failing gate that failed for the WRONG reason still has to be caught. + # + # Deliberately awk and shell arithmetic, never `bc`: bc is not guaranteed present on every + # runner image, and a gate that dies on a missing utility is indistinguishable from a gate + # that fails. + - name: Assert the sweep actually swept + if: always() + run: | + set -euo pipefail + xml=golden/target/surefire-reports/TEST-org.locationtech.proj4j.golden.GoldenMasterTest.xml + + # (1) The gate test must exist. If -Pgolden did not take, the module is not even in the + # reactor and there is no report at all. + [ -f "$xml" ] || { + echo "::error::no surefire report for GoldenMasterTest at $xml" + echo "::error::The gate did not run. -Pgolden is what adds the module AND flips" + echo "::error::golden.skip; a job that runs no assertions is not a pass." + ls -R golden/target/surefire-reports 2>/dev/null || true + exit 1; } + + attr() { grep -o "$1=\"[0-9]*\"" "$2" | head -1 | sed 's/[^0-9]//g'; } + ran=$(attr tests "$xml"); skipped=$(attr skipped "$xml") + echo "GoldenMasterTest: tests=$ran skipped=$skipped" + + # (2) It must have RUN, not been skipped. GoldenMasterTest opens with + # Assume.assumeFalse(golden.skip), so a missing or ineffective -Pgolden shows up + # here as a skip - and surefire reports a skip as success. Skips are never passes. + [ "${ran:-0}" -eq 1 ] || { + echo "::error::expected exactly 1 GoldenMasterTest, found ${ran:-0}"; exit 1; } + [ "${skipped:-0}" -eq 0 ] || { + echo "::error::GoldenMasterTest was SKIPPED. That means golden.skip was still true, so" + echo "::error::no table was generated and nothing was compared. Skips are never passes." + exit 1; } + + # (3) The generated table must be the same size as the baseline it is diffed against. + # A truncated sweep - an OOM in generation, a dictionary that failed to load, a + # resource missing from the jar - would otherwise produce a small table, a small + # diff, and a quiet pass. Comparing against the committed baseline rather than a + # hardcoded number means a deliberate change to probes.tsv / pairs.tsv updates both + # sides at once and this check keeps working. + got=$(wc -l < golden/target/golden/golden.tsv) + want=$(wc -l < golden/baseline/1.4.3/golden.tsv) + echo "golden.tsv rows (incl. header): generated=$got baseline=$want" + [ "$got" -eq "$want" ] || { + echo "::error::the generated table has $got lines but the baseline has $want." + echo "::error::A row-count mismatch means the sweep did not cover the same input set," + echo "::error::so the diff below it is not comparable. Do not re-pin to make this" + echo "::error::agree - find out which inputs went missing." + exit 1; } + + # (4) Every golden test must have run and none may be skipped. rules.yaml schema + # validation, the probe derivation and the merge-join self-tests all live here and + # an Assume creeping into any of them would hide it. + sum() { + grep -ho "$1=\"[0-9]*\"" golden/target/surefire-reports/TEST-org.locationtech.proj4j.golden.*.xml \ + | sed 's/[^0-9]//g' | awk '{n += $1} END {print n + 0}' + } + total=$(sum tests); totalskip=$(sum skipped) + echo "golden module: tests=$total skipped=$totalskip" + [ "$total" -ge 40 ] || { + echo "::error::only $total tests ran in the golden module; expected at least 40." + echo "::error::Tests were dropped, renamed out of the -Dtest pattern, or not compiled." + exit 1; } + [ "$totalskip" -eq 0 ] || { + echo "::error::$totalskip golden tests were skipped. Skips are never passes."; exit 1; } + + echo "Non-vacuity satisfied: the gate ran, over the full $want-line table, with no skips." + + # THE POINT OF THE JOB IS THIS ARTEFACT. When the gate fails, the per-row verdict file is the + # answer - it names, for every changed row, the rule that claimed it or the rules that + # declined it and why. `if-no-files-found: error` because an absent report after a run is + # itself a finding. + - name: Upload the golden report + if: always() + uses: actions/upload-artifact@v4 + with: + name: golden-report + path: | + golden/target/golden/golden-report.tsv + golden/target/golden/golden-summary.txt + golden/target/golden/golden-messages.tsv + golden/target/golden/golden.tsv + if-no-files-found: error + retention-days: 14 + + - name: Upload surefire reports + if: always() + uses: actions/upload-artifact@v4 + with: + name: surefire-reports-golden + path: '**/target/surefire-reports/**' + if-no-files-found: warn + retention-days: 7 + + - name: Summary + if: always() + run: | + { + echo "## Golden master" + echo "" + if [ -f golden/target/golden/golden-summary.txt ]; then + echo '```' + cat golden/target/golden/golden-summary.txt + echo '```' + fi + echo "" + echo "Full per-row verdicts are in the \`golden-report.tsv\` artifact. A failing row is" + echo "either UNEXPLAINED (no rule claimed it) or claimed by a rule whose" + echo "\`expected_rows\` no longer matches. Neither is fixed by editing the baseline or" + echo "widening a rule - see \`golden/README.md\`, \"Policy: gie always wins\"." + } >> "$GITHUB_STEP_SUMMARY" + + # Must stay last. actions/cache saves ~/.m2/repository in a post-job step that runs after + # every step here; without the scrub a locally-built proj4j snapshot would be baked into the + # cache and could silently satisfy a later run's inter-module dependencies, letting a run + # "pass" against stale jars from an earlier commit. `if: always()` so a failed build - which + # is the expected state of this job today - also scrubs. + - name: Remove neoproj4j artifacts from cache + if: always() + run: rm -rf "$HOME/.m2/repository/io/github/emilevictor/neoproj4j" diff --git a/.gitignore b/.gitignore index 296d5d6..3fa8c98 100755 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ _SUCCESS tags .vscode .metals + +# Claude Code agent worktrees and local session state +.claude/ diff --git a/.mvn/jgitver.config.xml b/.mvn/jgitver.config.xml index 987ccd0..eee4d23 100644 --- a/.mvn/jgitver.config.xml +++ b/.mvn/jgitver.config.xml @@ -5,4 +5,8 @@ true false true + + main,master \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index ffb254a..f6132ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,352 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +Work towards PROJ 9.8.1 parity, staged as an additive **1.5.0** and a behaviour-changing **2.0.0**. +**Every measured behaviour change, with its magnitude, is in [RELEASE-NOTES.md](RELEASE-NOTES.md)** — +this file lists what changed, that file tells you how far your coordinates move. Read it before +upgrading. + +### Breaking — read these first + +These change the answer, or the reported error, for existing callers. + +- **An out-of-grid `+nadgrids` point is refused instead of echoed back.** `Grid.shift`'s no-table + `else` branch returned the input coordinate unchanged while reporting success; it now raises + `CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID)`. **1,995 golden-master rows change** — + `REG` 1,673 · `CSV` 148 · `PAIR` 144 · `SYN` 30 — of which **1,949 had reported `OK` in 1.4.3** and + **202 were bit-identical to 1.4.3**, so the behaviour-diffing gate could not see them at all. Layer + nuance, verified with `PROJ_DEBUG=2`: at the *operator* level PROJ errors too, but at the *CRS* level + with `proj.db` it selects a **declared ballpark**, so proj4j is now stricter than PROJ on **131 known + rows** (all `+datum=NAD27`, measured by cross-tabbing all 4,280 `proj4-epsg.csv` rows against + `cs2cs` 9.8.1). In the other direction: **zero rows** where proj4j answers and PROJ refuses +- **`ErrorCause` for an unreadable or missing grid changed** from `INVALID_PARAM_VALUE` (`Group.CRS`) + to **`MISSING_GRID` (`Group.OPERATION`)**. Anyone matching on the old cause must update. Failing to + read a file is a statement about proj4j's readers, not about the definition, so + `PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID` (errno 1029) also carries `rejectedByProj = false`. A + new **`PipelineErrorCode.INVALID_INIT_KEY`, errno 1027**, took the `+init=` population and still + reports `ErrorCause.INVALID_PARAM_VALUE` — upstream's `get_init_string` (`9.8.1:src/init.cpp`) uses + 1027, not 1029, for all three of its failure paths +- **`tmerc` defaults to Poder/Engsager** — **0.83 mm at 6° from the central meridian, 4 m at 20°, + kilometres beyond 45°**, claiming **14,038 golden-master rows**. `+approx` / `+algo=evenden_snyder` + are the documented escape; spheres keep Evenden/Snyder automatically +- **The Karney auxiliary-latitude core** (`9.8.1:src/latitudes.cpp`, plus rewritten `mlfn` / `phi2` / + `tsfn`) is wired into `tmerc poly laea cea aea etmerc stere`. **19,336 golden-master rows move, every + one of them below 1 µm.** The error it removes is larger than the movement: `authlat` was **1.58 mm + at latitude 20.8°** against a 0.1 mm tolerance class, which is what moved `laea`, `aea` and `cea` +- **A 2D datum shift no longer invents a height.** `EPSG:4326 → EPSG:27700` at (−2.0, 53.0) with no + input Z returned `z = −49.84606796130538`; it now returns **`NaN`**, single-point and bulk alike. + Explicit `0.0` and explicit `100.0` are **bit-identical to before**, and x/y are bit-identical in + every case +- **Axis order is configurable and defaults to `AxisOrderPolicy.LEGACY`**, i.e. longitude-first, i.e. + exactly 1.4.3. Adopting authority order is a **silent** breaking change that is **invisible near + (0, 0)** — plausible in the Gulf of Guinea, a thrown `INVALID_COORDINATE` at San Francisco, and a + confidently wrong answer hundreds of kilometres out at (45, 30). See RELEASE-NOTES.md +- **`Proj4jException` no longer captures a Java stack trace by default.** `fillInStackTrace()` returns + `this` unless `-Dproj4j.exceptions.stackTraces=true` is set at startup or + `Proj4jException.setStackTraceCaptureEnabled(true)` is called. **Nothing a caller can act on + programmatically is lost** — the exception *type*, `cause()`'s `ErrorCause`, `getMessage()` (which + for the grid and domain refusals names the grids, the coordinate in degrees and the failing + predicate) and `getCause()` all survive; what is lost is the Java call site. It is **not** a shared + preallocated instance: every throw still constructs a fresh object with its own message, so two + threads refusing two different coordinates get two different accurate messages. **Why:** in this + library an exception is frequently the *answer*, not a bug report — `COORDINATE_OUTSIDE_GRID` fires + once per point outside the declared coverage — and the frame walk was measured at **1,440 B/op and + 585 ns per refusal** by `GridShiftBenchmark.noGridHit`, against a dispatch path the same benchmark + prices in tens of nanoseconds. The arm now reads **576 B/op**. If you log proj4j stack traces, set + the flag +- **The vertical-grid file ceiling dropped from a hardcoded 512 MiB to 128 MiB**, unifying it with + `Grid`'s under one knob, `-Dproj4j.grids.maxFileBytes`. Raise it if you ship a geoid model larger + than that; the largest grid PROJ publishes is three orders of magnitude below it. GeoTIFF keeps a + separate *decoded*-heap budget, `-Dproj4j.grids.maxDecodedBytes`, defaulting to 4× the file ceiling, + because DEFLATE means file length is not an upper bound on decoded size +- **`GridCache`'s byte budget is now process-wide rather than per instance.** Two caches previously + each received the full `-Dproj4j.grids.cacheBytes` budget, so the real ceiling was double the + configured one + +### Added +- **Public API facade** `org.locationtech.proj4j.api` — `Proj`, `Crs`, `CrsOperation`, `ProjContext`, + policy enums, and immutable `AreaOfUse` / `Accuracy` / `GridInfo` / `DatabaseInfo` / + `ProjectionInfo`. Zero runtime dependencies. Additive: the legacy types are **not** deprecated and + `createTransform` output is bit-identical +- **Introspection that declines to guess.** `Proj.databaseVersion()` returns `Optional.empty()` + rather than naming a version the dictionaries do not stamp; `availableGrids()` is probe-verified and + reported separately from `declaredGrids()`; `axisOrder()` is paired with + `isAxisOrderAuthoritative()`; `version()` is read from the JAR manifest, never a constant +- **Bulk transform API** — `BulkCoordinateTransform`, four signatures, interleaved and + struct-of-arrays, with a per-point status byte array and a documented zero-allocation contract +- **Pipeline engine** `org.locationtech.proj4j.pipeline`, and with it GIGS conformance at + **1,170 / 1,170** +- **WKT2 / WKT1-OGC / WKT1-ESRI and PROJJSON** readers and writers +- **Grid resolution SPI** `org.locationtech.proj4j.resource`, replacing a resolver that searched the + working directory first — both a determinism hazard and, on untrusted input, an arbitrary-file-open + primitive. PROJ puts the working directory last +- **Byte-bounded grid cache** `datum/GridCache`, LRU, default 64 MiB + (`-Dproj4j.grids.cacheBytes`), with no lock held across I/O +- **GTX vertical grid reader** (`datum/VerticalGrid`) and NTv2 multi-subgrid support +- **GeoTIFF grid reader** — `datum/tiff/**` plus `datum/GeoTiffGrid`, **zero dependencies** (DEFLATE is + `java.util.zip.Inflater`). Classic TIFF and BigTIFF, both endiannesses, strips and tiles, predictors + 1/2/3. Verified **bit-identical to `cct` 9.8.1 to 12 decimals** on all 35 vendored fixtures, both + subgrid hierarchies, all seven real US grids, and the real `us_nga_egm96_15.tif` and + `us_nga_egm08_25.tif`. Every unsupported feature is **rejected by name**, including a short DEFLATE + stream — which previously left the block tail zero, i.e. a geoid reading exactly 0 m +- **`util/FastStrictTrig`** — an allocation-free, pure-Java transcription of the JDK's + `FdLibm.Sin/Cos/Tan`, verified bit-identical to `StrictMath` over 221,970 raw-bit comparisons on + five JDK/architecture combinations. **Faster than `StrictMath` on every JDK tested**, by 3.97× on + Java 8 — which is why no multi-release JAR is needed +- **Conformance harness** for PROJ's own `gie` corpus and the IOGP GIGS suite: 7,923 assertions across + 42 files, with a checked-in expected-outcome manifest (`gie-expected-failures.tsv`, 545 rows, and + `gie-corpus-index.tsv`, 7,923 keys) so a pass→fail regression fails the build. Current verdict + against the full index: `regressed 0, unexpected passes 0, new 0, disappeared 0` +- **Golden-master behaviour-diffing gate** (`golden/`) over 53,430 rows against a frozen 1.4.3 + baseline, with `golden/rules.yaml` requiring every changed row to be claimed by a rule that names a + mechanism and pins an exact row count. **42 of 42 rules are pinned**, and a rule that matches the + wrong number of rows fails the build rather than silently absorbing another rule's rows +- **Allocation and operation-count gate** (`benchmark/`), **245 arms, 245 gated, 0 excluded**, with a + recorded baseline of 25 rules and 171 per-benchmark ratchets +- **`ProjContext.parseMode` / `withParseMode` / `Builder.parseMode`**, exposing + `Proj4Parser.ParseMode.STRICT` through the `Proj` facade. **The default is unchanged + (`PROJ_COMPATIBLE`)** and must stay so — PROJ has no allow-list, and `builtins.gie` feeds a literal + `unknown_keyword`. `STRICT` changes exactly two things, enumerated from source: a key outside + `Proj4Keyword.supportedParameters()` raises `UnsupportedParameterException` naming the key, and an + unresolvable `+units` raises `InvalidValueException` (by default `Units.findUnits` substitutes + metres for anything unknown and never returns null, so `+units=bananas` is otherwise a working CRS + in metres). **Duplicate-key precedence is *not* gated** — `+lon_0=11 +lon_0=22` yields 11.0 in both + modes, and neither reports the duplicate. Across the full shipped dictionary, 9,013 definitions: + 8,969 parse in both modes, 43 are refused in both, **exactly one parses by default and is refused + under `STRICT` — `world:malay`, for `rot_conv`** (dropped by PROJ in 4.8.0), and none goes the other + way +- **Explicit `serialVersionUID` on 188 `Serializable` types** in `core`, including `Projection` and + its 167 subclasses, plus `readResolve` on `AxisOrder`. Every value is `serialver` output against the + pre-change classes, so **existing serialised forms stay readable**; none was invented. A test fails + the build if a `Serializable` type in `core/src/main` lacks one. **Known gap, not fixed here:** a UID + does not make a class serialisable, and **9 of the 151 registered projections still throw + `NotSerializableException`** outright — pinned and enumerated by class, not globbed: + `AdamsWorldInASquareIIProjection`, `AlaskaModifiedStereographicProjection`, + `EquidistantAzimuthalProjection`, `LeeOblatedStereographicProjection`, + `MillerOblatedStereographicProjection`, `ModifiedStereographic48Projection`, + `ModifiedStereographic50Projection`, `PeirceQuincuncialProjection`, `SpilhausProjection`, with the + other 142 serialising cleanly as the non-vacuity control. They hold a `geodesic.Geodesic`, a + `util.Complex` or an anonymous `Forward2D`, none of which is `Serializable`. Separately and worse, + **`+proj=geocent` serialises cold and stops serialising after its first transform**, because + `GeocentProjection$Cached` is built lazily — a driver that broadcasts a warm CRS fails where one + that broadcasts a cold one does not. This fires on the Spark driver at first broadcast, which is a + harder failure than the `InvalidClassException` the UID sweep addresses +- **Depth limits on the untrusted-text parsers.** `io/wkt/**` and `io/projjson/**` cap nesting at + `MAX_DEPTH = 64` syntactic / `MAX_CRS_DEPTH = 24` semantic, throwing in-family rather than letting a + `StackOverflowError` — an `Error`, which nothing in `core/src/main` catches — escape to the caller. + Measured against all 5,671 shipped EPSG WKT1 definitions, the deepest real document is **7 read, 8 + written, 3 nested CRSs**, so the caps are 8× real data +- **Integer-overflow guards in every binary grid reader** — `CTABLEV2`, `NTV1`, `NTV2`, + `datum/tiff/**` and `db/PjdxFile` now compute extents in `long` and check the product against the + actual file or section length before allocating, via the new `datum/GridExtents`. Refusals are a + named `GridFormatException`, not an `OutOfMemoryError` and not a `java.lang.Error` +- **`io/InitFileCache`** — each `+init=` dictionary is parsed **once** into + `Map>` plus a reverse index, byte-bounded + (`-Dproj4j.initFiles.cacheBytes`, default 32 MiB), LRU. `createFromName` allocation falls + **16× / 1,394× / 6,971×** depending on where the code sits in the file; the 200× position-dependent + ramp is gone. `golden.tsv` is **byte-identical across all 53,430 rows** with the cache on and off +- **Determinism test suite** `org.locationtech.proj4j.determinism` — a committed table of 54,265 + raw-bit `StrictMath` results, plus `.github/workflows/determinism.yaml`, a six-leg + x86-64 × AArch64 matrix that compares bits across architectures rather than only checking that + tests pass +- **Many projections**, including the `adams` family, `guyou`, `peirce_q`, `spilhaus`, `mod_ster`, the + interrupted family and `ups` + +### Fixed + +Numerical core, all measured against PROJ 9.8.1 — the four helpers behind the auxiliary-latitude +change listed under Breaking, whose combined effect is **19,336 golden-master rows, all below 1 µm**: +- `authlat` — **1.58 mm at latitude 20.8° → 0.7 nm**, against a 0.1 mm tolerance class. Moves `laea`, + `aea`, `cea`, `eqearth`, `nzmg` +- `mlfn` — **4,920 nm at latitude 72.6° → under 1 nm** (50 nm tolerance class) +- `phi2` — **4,145 nm at latitude 2.8° → 2.1 nm** +- `tsfn` — returned `0.9999999999999999` at φ=0 where the answer is exactly `1.0`, against a + `tolerance 0 m` assertion + +Silent wrong answers: +- **NTv1 reader: data offset 176 instead of 192, *and* the latitude/longitude shift components + transposed — ~13 m on every NTv1 shift ever computed.** Neither error alone nor the pair moved a + result far enough to look like a bug +- **NAD27 → NAD83 in CONUS: 95.573 m at San Francisco.** The code half is fixed — the parser called + `setGrids(null)` on the *static* `Datum.NAD27` singleton, destroying the grid list process-wide. + **The data half is a packaging question that is still open**: `proj4j-epsg` ships `ntv1_can.dat` and + nothing else, so `conus` reaches a released build only through `proj4j-grids-us-legacy`. See + *Pending* below +- **NTv2**: "only 1 subfile supported" silently used subgrid 1 for the whole file, and interpolation + read the captured *parent* table after descending into a child. A point in Alberta got no shift at + all while the transform reported success +- **Grid-edge clamp in `nad_intr`, `1e-11` → `1e-4`** — the old value was 10⁷× too tight, so points + PROJ shifts were returned unchanged +- **Grid containment tolerance `1e-4` → `1e-5`** (`REL_TOLERANCE_HGRIDSHIFT`) — proj4j accepted and + **extrapolated** 2e-5° outside `conus`'s south edge where PROJ reports a transformation error +- **Antimeridian grid extents** were unhandled: `us_noaa_alaska.tif` declares `west = -194°`, so its + whole western half was unreachable +- **The inverse grid-shift loop declared success when only one ordinate had converged** — `&&` where + PROJ tests the squared 2-norm — and on exhaustion returned the input unchanged. It now throws + `ConvergenceFailureException` (`ErrorCause.NUMERICAL_FAILURE`) +- **`+rf` and `+f` setters were exactly transposed.** `world:palestine` round-tripped to latitude + −3.3e205° +- **`GeocentProjection` read its destination coordinate instead of its source, in both directions** — + it could not produce a correct answer for any input, and had no test +- **`ObliqueMercatorProjection`**: `+alpha` without `+gamma` got **zero rotation** (215,218 m E / + 303,073 m N), and `u_0` used `cos(Gamma)` where upstream uses `cos(alpha)` (2,532 m E on RSO Borneo) +- **`CoordinateReferenceSystem.createGeographic()` dropped `+pm`** — 187,739 m of easting, affecting + all 94 `+pm=` definitions +- **`AzimuthalProjection` defaulted `lat_0`/`lon_0` to 45°/45°** where PROJ defaults 0/0, so every + azimuthal projection string omitting them was silently oblique +- **`MercatorProjection` never read `+lat_ts`** — 1.3 million metres of error +- **`CassiniProjection`** wrote 17 instance fields inside `project()`, making it unsafe to share + across threads, and its forward and inverse were not mutual inverses (68 mm at 3°, growing as `lon⁴`) +- **`AlbersProjection`'s spherical inverse took `asin(rho/dd)`** — the radius rather than `sin φ` — + an 89.96° error +- **Six per-projection inverse bugs were one bug**: a 2006 C→Java conversion turned "mutate the + argument then read it" into "write the output struct then read the original parameter" — + `aea`, `collg`, `fahey`, `bonne`, `bipc`, `SimpleConicProjection` and its seven subclasses +- **`ProjectionMath.asin`/`acos` did not clamp NaN** — `Math.abs(NaN) > 1.` is `false`, so NaN passed + straight through +- **`+proj=aitoff` had no inverse at all** and fell through to an ungated base-class identity; `wintri` + discarded `+lat_1`, making the *forward* off by 40,590 m +- **`Ellipsoid.SPHERE`** was the GRS80 authalic radius, not PROJ's Normal Sphere — **0.41 m at 222 km** +- **`Ellipsoid.AIRY`** carried a rounded `b` instead of the exact inverse flattening — 0.76 mm +- **Datum corrections**: `carthage` was bound to the wrong ellipsoid — upstream is `clrk80ign` — + worth **20.45 mm N** at EPSG:22391 Tunis; `OSGB36` now carries `9.8.1:src/datums.cpp`'s values + rather than EPSG:1314's, **3.085 mm E** and ~3.5 mm max across GB; and `potsdam` declares its + `BETA2007.gsb` grid alongside the Helmert, because upstream's live definition is the grid and + dropping the Helmert instead would have been a **74.9 m E / 127.7 m N** regression where the grid is + absent +- **`+vunits=m` was unknown to the parser**, so it rejected the whole definition — one defect that + made 144 dictionary rows fail and moved 964 golden-master rows when fixed + +Determinism and locale: +- **`io/Proj4FileReader` called `toLowerCase()` with no locale.** Under `tr_TR`, `"ESRI"` becomes + `"esrı"` — **all 2,954 ESRI codes were unreachable in a Turkish-locale JVM** +- `ProjCoordinate.DECIMAL_FORMAT`, `units/Unit` and `units/AngleFormat` used the default locale +- `ProjCoordinate.equals`/`hashCode` ignored `z`, silently making every coordinate comparison 2D +- `datum/AxisOrder` deserialised to a new instance, breaking `== AxisOrder.ENU` + +### Changed +- **Failures are no longer expressed as plausible coordinates.** `aasin`/`aacos` throw rather than + clamping, and a domain guard matching PROJ's (`|λ| > 10` **radians**, pole latitudes clamped within + `1e-12` rad) rejects genuinely out-of-domain input. A `[-180, 180]` rejection would be *stricter* + than PROJ and is deliberately not what this does +- **Forward-only projections no longer return the input as if it were lon/lat.** They throw. + **13 projections × 5 probes = 65 golden-master rows** today — `airy august boggs denoy larr lask + nicol rpoly tcc wag7 adams_hemi adams_ws1 guyou` — plus a separate 40 rows in projections added this + release. When the rule was written it claimed **90 rows, of which 75 had reported `OK` in 1.4.3**; + that 75 is the measurement that proves this was a fix rather than a new restriction, and the other + 15 had been `InvalidValueException: Unknown projection`. The set shrank to 65 because five names — + `lagrng`, `aitoff`, `hammer`, `nsper`, `wintri` — turned out to have an inverse **upstream**, which + they now have here too. + **The gate does not key on `hasInverse()`**: that declaration is wrong in both directions + (`KrovakProjection` and `NewZealandMapGridProjection` implement `projectInverse` without declaring + it, `LandsatProjection` declares it while overriding nothing), and a `hasInverse()`-keyed gate + rejected **EPSG:2065, EPSG:5514 and EPSG:27200 — three working CRS**. The shipped gate looks for a + declared `projectInverse(double, double, ProjCoordinate)` in the class hierarchy instead +- `adjlon` replaces `normalizeLongitude`, fixing a potential hang and a dateline sign flip +- Old numerical helpers in `ProjectionMath` are deprecated, not removed + +### Conformance + +- **PROJ 9.8.1 gie corpus: 7,378 / 7,895 — 93.5 %**, up from a **1,066 / 6,845 — 15.6 %** baseline. + **At least 29 of the 42 active corpus files are at 100 %.** Remainder: 515 failing, 2 skipped +- **The denominator excludes vacuous rows, and says so.** The corpus holds **7,923** assertions + (6,962 `expect` + 961 `roundtrip`, counted with a port of gie's own lexer, not with `grep`). **28 + are vacuous `expect failure` rows** — proj4j could not construct the operation at all, so "both + failed" is evidence about neither engine — and they are excluded from **numerator and denominator + alike** rather than banked as passes, giving 7,895. **2 skips are reported separately and are never + passes.** 94 out-of-block lines in `DHDN_ETRS89.gie` are reported as excluded. Note that the two + percentages sit on different denominators on purpose: the baseline's 6,845 is smaller because far + more rows were vacuous then, so the measured population grew by 1,050 assertions as well as the + ratio improving +- **GIGS: 1,170 / 1,170 — 100 %**, all 20 files +- **Zero rows in the 4,280-row MetaCRS corpus where proj4j and PROJ 9.8.1 both produce a coordinate + and the coordinates differ.** The ~1,195 apparent regressions against 1.4.3 are a stale reference + file: 775 `tmerc` rows agree with `cs2cs` 9.8.1, 280 are refused by both engines, 28 `cass`, 24 + `tmerc`+`+datum=` and 3 `eqc` agree + +### Known limitations + +Operator families that are **not implemented**. Each is a refusal, not a silent omission. + +- **The DGGS group — `airocean`, `s2`, `isea`** — absent from `Registry`, together **188 failing + assertions in `builtins.gie`** (92 / 56 / 40) and declined on ratio +- **`+proj=helmert` as a user-facing operator.** It exists only as the hidden static + `+exact +convention=position_vector` helper the `cs2cs` emulation builds. Exposing a subset would + silently ignore `convention=coordinate_frame`, `transpose` and seven time-dependent rates, all of + which the corpus exercises. Costs 3 assertions in `GDA.gie` and 1 in `4D-API_cs2cs-style.gie` +- **`gridshift` (the unified operator) and `defmodel`** — both need the GeoTIFF reader wired into the + pipeline layer; the reader itself ships +- **`+proj=deformation +grids=`**, the single-file three-channel form. The two-grid form works +- **`nkg`** — 33 assertions; needs `PROJ:PROJString` pipelines plus a transformed time dimension, not + more data +- **The time dimension is not transformed** — no `+proj=unitconvert +t_in`, no `+proj=set +t`. But + `+t_epoch` / `+t_final` on `hgridshift` / `vgridshift` **are** honoured, so a time-*gated* grid + shift behaves as upstream's does +- **NADCON is deliberately not implemented.** It is not a 9.8.1 format: `grids.cpp` dispatches on + NTv1, CTABLE V2, NTv2 and TIFF, and the `us_noaa_nadcon5_*` grids are NADCON 5 data *in GeoTIFF* + +Other boundaries: + +- **Vertical and height support is thinly evidenced.** GTX and GeoTIFF readers ship, but **only 356 of + 7,923 corpus assertions — 4.5 % — score a third ordinate at all** (194 pass, 160 fail, 2 skip); for + the other 5,419 coordinate expects `gie.cpp` zeroes the third ordinate on both sides, so z + contributes exactly zero to the deviation. For a height through the *datum* stage specifically the + corpus reaches **8 assertions and none passes**. Test your own heights +- **The legacy path has no `proj.db`.** `+datum=OSGB36` differs from PROJ by **1.784 m** (PROJ picks + OSTN15), `nzgd49` by **2.248 m**. This is a **data-vintage gap, not an arithmetic defect** — given + the same parameter strings the two engines agree. A pure-Java zero-dependency reader for a + transcoded 9.8.1 database exists (`proj4j-db`, Phase 1), but operation *selection* is not yet wired + through it +- **The shipped EPSG dictionary is v9.2-era (2017)** against PROJ 9.8.1's v12.029 +- **NaN sign and payload are architecture-dependent and outside the bit-for-bit determinism + guarantee.** Finite results and signed zero are inside it. Measured: `Inf - Inf` is + `0xfff8000000000000` on x86-64 and `0x7ff8000000000000` on AArch64 with the JDK held fixed + +### Gate status, stated honestly + +*Re-measured 2026-08-03 in the pinned container (Temurin 21.0.11 / aarch64).* + +- **ci** — **green**: whole 7-module reactor, `BUILD SUCCESS` with javadoc, **2,320 tests / 0 failures + / 4 skipped** (`core` 1,917 · `conformance` 345 · `db` 52 · `geoapi` 6). The `MetaCRSTest` + expectation that used to make this red no longer applies +- **conformance** — live and CI-wired, **green** against a committed 7,923-key index, **7,441 / 7,900** +- **golden** — live, blocking, and **RED on 2,291 UNEXPLAINED rows** of 53,430 + (12,012 UNCHANGED · 41,418 CHANGED · 0 ADDED · 0 REMOVED · 39,127 INTENDED), down from 18,168 → + 3,304 → 2,291 over two triage passes, with **42 of 42** rules pinned. **Red is the intended state**: + the gate fails on any changed row that no rule claims with a named mechanism and a pinned count, so + those 2,291 are changes somebody must *explain*, not changes somebody must *undo* +- **allocation** — **0 breaches, 245 gated, 0 EXCLUDED, 245/245 arms**. The claim that + `gc.alloc.rate.norm` does not flake was **false for 11 of 181 arms** at the time: two independent + runs agreed to within 0.0001 B/op on 170 arms, while the 11 `CrsParseBenchmark` arms above 1 KB/op + drifted by up to 0.121 %. That was resolved first by ungating that rule's nine arms — a stated + reduction in coverage — and then, properly, by **removing the cause**: `io/InitFileCache` made the + arm fixed-shape, it rejoined Tier 1, and **there are no exclusions today**. Separately, + `BulkTransformBenchmark` left the `staged` package, so the bulk API is gated for the first time, + at a hard 0 B/op across 56 arms +- **determinism** — runs per leg, **22** tests, 0 failures, 0 skips (the workflow's exact-count guard + became a floor, `DET_FLOOR_TESTS=22`, and reports upward drift as a notice) +- **bench** — baseline re-captured 2026-08-02: **171 per-benchmark ratchets, all enforced**, 25 rules, + 8 CRS pairs × 20 operations pinned +- **No CI run backs any figure in this file.** The workflow files are committed; everything above was + measured locally + +### Pending — in flight, not in this build + +- **⏳ `conus` folded into `proj4j-epsg`.** Verified: `epsg/src/main/resources/proj4/nad/` currently + ships `ntv1_can.dat` and no other grid, whose footprint is 40°N–84°N, 142°W–44°W. `9.8.1:data/tests/conus` + is 264,424 B of CTABLE V2, a format `datum/CTABLEV2.java` already reads. Until it lands, a released + build needs `proj4j-grids-us-legacy` (1,192,986 B jar, `conus` + `alaska`) on the classpath. **No + `proj4j-epsg` artifact size is quoted anywhere in these notes on purpose** — the figure recorded in + the project's own packaging notes was measured today as 7,603,235 B against a long-standing claim of + 2,518,313 B +- **⏳ Relaxing `ClasspathResourceResolver.isSafeName`** to permit interior path segments while still + rejecting a leading `/` or `\`, spaces, and any `.` / `..` / empty segment. The corpus writes + `+file=tests/…` and `+grids=tests/…`, which PROJ resolves by appending the token to a search + directory; proj4j can currently reach **no** `tests/…` file, and roughly **100 assertions** sit + behind that one rule, concentrated in `gridshift`, `geotiff_grids`, `defmodel` and `tinshift`. **No + revised conformance figure is quoted for it here**, and none should be until it is measured on a + quiesced tree + ## [1.4.3] - 2026-06-02 ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9a0e1d9..7fb9975 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,29 +1,32 @@ -# Contributing to Proj4j +# Contributing to neoProj4J -The Proj4j project is always excited to accept contributions from the community. This document +The neoProj4J project is always excited to accept contributions from the community. This document contains some guidelines to help users and developers contribute to the project. +neoProj4J is a fork of [locationtech/proj4j](https://github.com/locationtech/proj4j); see the +[README](README.md) for what that means. Contributions to this fork go here. Please do not file +issues about this fork with the upstream project, which is not responsible for it. + - [Code Style](#code) - [Issues and Bugs](#bugs) - - [Discussion Forum](#discuss) + - [Discussion](#discuss) - [Submitting Patches](#patches) ## Code Style -Proj4j adheres to (as much as possible) the +neoProj4J adheres to (as much as possible) the [Google Java Style](https://google.github.io/styleguide/javaguide.html) conventions. If a patch or commit deviates from these guidelines a reviewer will likely ask for it to be reformatted. ## Issues, Bugs, and Feature Requests -Proj4j utilizes Github for issue tracking. Bugs, issues, and feature requests should be -filed [here](https://github.com/locationtech/proj4j/issues). +Bugs, issues, and feature requests should be filed on this repository's issue tracker. -## Discussion Forum +## Discussion -Often communication can be carried out through comments on an issue or pull request directly but -for larger discussions that are more general in nature it is recommended that the project -[mailing list](https://locationtech.org/mailman/listinfo/proj4j-dev) be used. +Communication is carried out through comments on an issue or pull request directly. For larger +discussions that are more general in nature, open an issue describing what you have in mind before +you start writing code. ## Submitting Patches @@ -35,27 +38,25 @@ This [guide](http://people.redhat.com/rjones/how-to-supply-code-to-open-source-p some useful guidelines for contributing to open source projects in general. Below are some additionally stressed points. -### Send email first +### Open an issue first -It is never a bad idea to email the mailing list with thoughts about a change you intend to make -before you make it. This allows the committers to weigh in with thoughts and suggestions that will -help you make the change and ultimately ensure your successful contribution to the project. +It is never a bad idea to open an issue with thoughts about a change you intend to make before you +make it. This allows the maintainers to weigh in with thoughts and suggestions that will help you +make the change and ultimately ensure your successful contribution to the project. -### Sign off on commits, and filing a CLA +### Sign off on commits -Non-committers submitting patches to Proj4j must use the "-s" (sign-off) flag when making -commits with git. This flag indicates that the author verifies the change is (too the best knowledge +Non-committers submitting patches to neoProj4J must use the "-s" (sign-off) flag when making +commits with git. This flag indicates that the author verifies the change is (to the best knowledge of the author) in good standing and consistent with the open source license of the project, and that -if he/she has permission from their employer to contribute the code (if applicable). +he/she has permission from their employer to contribute the code (if applicable). It is an assertion +of the [Developer Certificate of Origin](https://developercertificate.org/). The following is an example of a commit with the sign-off flag. git commit -s -m "the commit message" Once a developer has been elevated to project committer status the sign-off flag is no longer required. -Additionally, a one-time event is to [submit a a CLA](https://projects.eclipse.org/user/sign/cla) -"Contributor License Agreement". It's simple and fast to do. - ### One patch per one bug/feature Avoid submitting patches that mix together multiple features and/or bug fixes into a single changeset. @@ -70,8 +71,8 @@ whitespace or other formatting changes a reviewer will ask for them to be remove ### Viewing the entire project history -(Optional) We recommended that developers do this step to be able to view the -pre-LocationTech history of the project. This can be achieved with the following -command after the repository has been cloned: +This repository carries the history of the upstream project, including the history from before +upstream moved to the Eclipse Foundation. That earlier history is not an ancestor of the current +branch; it is reachable from the `_old/eclipse_initial` tag: - git fetch origin refs/replace/*:refs/replace/* + git log _old/eclipse_initial diff --git a/HOWTORELEASE.txt b/HOWTORELEASE.txt index f25c25e..adede18 100644 --- a/HOWTORELEASE.txt +++ b/HOWTORELEASE.txt @@ -1,111 +1,105 @@ -Steps for Making a Proj4J Release +Releasing neoProj4J ============================================================================== -:Author: Grigory Pomadchin -:Contact: https://github.com/pomadchin -:Date: 11/28/2022 +Coordinates +------------------------------------------------------------------------------ + + groupId io.github.emilevictor.neoproj4j + artifacts neoproj4j (core) + neoproj4j-epsg (EPSG/ESRI dictionaries - required at runtime) + neoproj4j-geoapi (optional GeoAPI wrapper) + neoproj4j-db (optional PROJ authority database) + neoproj4j-grids-us-legacy (optional CTABLE V2 grids: conus, alaska) + neoproj4j-modules (the parent pom - required) + + NOT published: conformance, golden, benchmark, benchmark-ab. Each sets its own + maven.deploy.skip=true. Every published module states maven.deploy.skip=false + explicitly rather than inheriting it -- inheritance is what previously made + `mvn deploy` publish zero artifacts while reporting success. + + +The version comes from the git tag, not from pom.xml +------------------------------------------------------------------------------ + +pom.xml says 1.3.1-SNAPSHOT. That literal is DEAD in a normal build: the jgitver +Maven extension (.mvn/extensions.xml, .mvn/jgitver.config.xml) rewrites it from git. + + HEAD is exactly an annotated tag vX.Y.Z -> X.Y.Z + anything else -> X.Y.(Z+1)-SNAPSHOT, with the branch + name included unless the branch is + listed in nonQualifierBranches -This document describes the process to releasing a new version of Proj4J. +So: TAG FIRST, THEN DEPLOY. There is no other way to get a clean release version. -General Notes + git tag -a v2.0.0 -m "neoProj4J 2.0.0" + +Ask the build what it resolved rather than assuming: + + mvn -B help:evaluate -Dexpression=project.version -DforceStdout -q + +Traps: + - `-Djgitver.skip=true` makes the dead 1.3.1-SNAPSHOT literal live. It is required + when building against a non-default -Dmaven.repo.local, and must NEVER be combined + with `deploy`. + - No CI checkout fetches tags (all fetch-depth: 1, no fetch-tags), so jgitver cannot + see any tag in CI. Fix that before adding a release job. + + +Publishing to Maven Central ------------------------------------------------------------------------------ -1) Proj4J project release - What you need: - - (new) an account on central (https://central.sonatype.com/publishing/deployments) - - (old) an account on sonatype (https://issues.sonatype.org/secure/Signup!default.jspa) - - configured ~/.m2/settings.xml file (a simple example below): - - - - - - - - - sonatype_snapshots - ... - ... - - - sonatype_releases - ... - ... - - - ossrh - ... - ... - - - central - ... - ... - - - - - - - - - selected signing key i.e. in the each module pom.xml via the gpg configuration tags: - - org.apache.maven.plugins - maven-gpg-plugin - 3.0.1 - - - sign-artifacts - verify - - sign - - - KEYID - passphrase - - - - - - Cheat sheet: - - All commands are can be described via the following template: - mvn -P{eclipse | central} {-Dmaven.test.skip=true | } {-pl | } {install, deploy, ...} {-Dmaven.install.skip={false|true}} - - The description of the Sonatype publish process: - - Snaphots: - Versioning: - - Release versions are derived from the latest (not lightweight) tag version and the branch name if applicable. Each tag should start with v, - i.e. v2.3.0. The snapshot tag happens on commits that follow the tag, and contain git commit hash. - Snapshot can be published without PGP sign, it is published to a snapshot repo and allows immediate snaphot updates. - Publish to a local repo: - - mvn -Pcentral -Dmaven.test.skip=true install - Publish to sonatype: - - mvn -Pcentral -Dmaven.test.skip=true deploy - Publish to eclipse: - - mvn -Peclipse -Dmaven.test.skip=true deploy - - - Releases: - Versioning: - - Release versions are derived from the latest (not lightweight) tag version. Each tag should start with v, - i.e. v2.3.0. - Snapshot can not be published without PGP signature, verify that you have up to date GPG keys set. - Publish to a local repo: - - mvn -Pcentral -Dmaven.test.skip=true install - Publish to sonatype: - - mvn -Pcentral -Dmaven.test.skip=true deploy - Publish to eclipse: - - mvn -Peclipse -Dmaven.test.skip=true deploy - Staging means a special repository in a pre released condition. - - Go into staging repos panel: https://oss.sonatype.org/#stagingRepositories (log in using sonatype user / pwd) - - Filter by the package name (proj4j) and select matching staging repo - - Press Close button on the top of the table with repos. It runs packages - validation and closes staging repo in a successful case - - After successful close press the Release button - Summary: - - Run mvn -Pcentral -Dmaven.test.skip=true deploy to publish everything to sonatype - - Go to sonatype panel https://oss.sonatype.org/#stagingRepositories and release jars - - Await ~10 minutes to have jars published to maven central +Prerequisites, in the order they will block you: + + 1. A Central Portal account: https://central.sonatype.com + 2. Namespace ownership of io.github.emilevictor, proved by the GitHub account + `emilevictor`. This is why the groupId is shaped that way -- an io.github. + namespace is verified by the matching GitHub account and needs no DNS record. + 3. A published GPG key. Central rejects unsigned artifacts. maven-gpg-plugin is wired + into the `central` profile; note its is empty, so the key is taken + from the environment. + 4. ~/.m2/settings.xml with a whose matches central-publishing-maven-plugin's + . Use a Central Portal user token, not an account password. + +Then: + + mvn -Pcentral -DskipTests deploy + +The `central` profile carries central-publishing-maven-plugin and maven-gpg-plugin. +Sources and javadoc jars are produced unconditionally, so that part needs no flags. + +NOT YET DONE FROM THIS TREE. gpg signing has never run here and no artifact has ever +been pushed to Central from this repository. Treat the first release as untested, and +verify the staged deployment in the Portal UI before releasing it. + + +Installing locally (for a downstream consumer to test against) +------------------------------------------------------------------------------ + +A plain `mvn install` reports BUILD SUCCESS and installs almost nothing. The root pom +sets maven.install.skip=true and only db/ and grids-us-legacy/ override it, so the +reactor succeeds and ~/.m2 ends up without the core artifact or the parent pom. + +-Dmaven.install.skip=false fixes that and then fails on conformance/, which has no +src/main and therefore attaches no jar. Exclude it: + + mvn -B -DskipTests -Dmaven.javadoc.skip=true -Dgpg.skip=true \ + -Dmaven.install.skip=false -pl '!conformance' install + +That installs the parent pom plus all five published modules, each with a -sources jar. + + +Build environment +------------------------------------------------------------------------------ + + - Root modules target 8; the benchmark modules target 17. + - JDK 8 cannot run this build at all (--release is a javac 9+ flag). Java 8 bytecode + compatibility is proven by a separate jdk8-runtime CI job. + - Build with JDK 21. Nothing enforces this, and JDK 23+ silently stops running + classpath annotation processors, which leaves the JMH harness with no + META-INF/BenchmarkList and makes benchmark/run-gate.sh look broken for no visible + reason. + +Before tagging a release, the four gates should be green: + + ./docker/run.sh # ci + conformance + golden + determinism + ./docker/run.sh bench # opt-in, ~20 min diff --git a/LICENSE b/LICENSE index 9528fae..1842230 100644 --- a/LICENSE +++ b/LICENSE @@ -43,3 +43,8 @@ DEALINGS IN THE SOFTWARE. Proj4J EPSG module contains resource files released under the EPSG database distribution license. For more details see LICENSE.EPSG file in the root of this repository. + +Proj4J EPSG module also contains the `conus` datum-shift grid, redistributed verbatim from PROJ +9.8.1 (`data/tests/conus`) under PROJ's MIT license. The same license covers the `conus` and +`alaska` grids in the Proj4J Grids US Legacy module. For more details see LICENSE.PROJ file in the +root of this repository. diff --git a/LICENSE.PROJ b/LICENSE.PROJ new file mode 100644 index 0000000..cebb61e --- /dev/null +++ b/LICENSE.PROJ @@ -0,0 +1,62 @@ +PROJ license -- applies to the datum-shift grid redistributed by this project. + +Covered file: + + epsg/src/main/resources/proj4/nad/conus + packaged in the proj4j-epsg artifact as /proj4/nad/conus + + grids-us-legacy/src/main/resources/proj4j-data/grids/conus + grids-us-legacy/src/main/resources/proj4j-data/grids/alaska + packaged in the proj4j-grids-us-legacy artifact as /proj4j-data/grids/{conus,alaska} + +Provenance: + + Upstream PROJ + Tag 9.8.1 = f08fa86c478c4bbbf003b1ec751dd84aa6eca486 + Upstream path data/tests/conus blob 44b4900f3168a5b87794f41d201d03d5aea0b964 + data/tests/alaska blob bb6be2ffbd55cb96416fd77cc07845f832883549 + +The files are byte-identical to the upstream blobs; reproduce with +'git -C cat-file blob '. SHA-256 of conus is +504d184f9a9f6e6c6b76df753346fd236b74772f52a8a5c90d8a43d3651d274d. + +PROJ's COPYING at tag 9.8.1 follows verbatim. It states that data files are +covered by the same MIT terms as the source, so that license is reproduced here +in full and travels with the redistributed grids. + +================================================================================ + + +All source, data files and other contents of the PROJ package are +available under the following terms. Note that the PROJ 4.3 and earlier +was "public domain" as is common with US government work, but apparently +this is not a well defined legal term in many countries. Frank Warmerdam placed +everything under the following MIT style license because he believed it is +effectively the same as public domain, allowing anyone to use the code as +they wish, including making proprietary derivatives. + +Initial PROJ 4.3 public domain code was put as Frank Warmerdam as copyright +holder, but he didn't mean to imply he did the work. Essentially all work was +done by Gerald Evenden. + +Copyright information can be found in source files. + + -------------- + + 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. diff --git a/README.md b/README.md index 008e271..2ba8202 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,42 @@ -# Proj4J [![GitHub Action Status](https://github.com/locationtech/proj4j/workflows/CI/badge.svg)](https://github.com/locationtech/proj4j/actions) [![Maven Central](https://img.shields.io/maven-central/v/org.locationtech.proj4j/proj4j)](https://search.maven.org/search?q=g:org.locationtech.proj4j%20AND%20a:proj4j) +# neoProj4J -Proj4J is a Java library for converting coordinates between different geospatial coordinate reference systems. + + +neoProj4J is a Java library for converting coordinates between different geospatial coordinate reference systems. It is designed to be compatible with `proj.4` parameters and derives some of its implementation from the `proj.4` sources. -Proj4J is a project in the [LocationTech](http://www.locationtech.org) working group of the Eclipse Foundation. +## About this fork + +neoProj4J is a fork of [Proj4J](https://github.com/locationtech/proj4j), taken from upstream release +`v1.4.3` (commit [`7362c85`](https://github.com/locationtech/proj4j/commit/7362c85e34b37cf133e2cbc0a4d3d049b166a720)). + +Upstream Proj4J is licensed under the Apache License 2.0 and is a project of the LocationTech working group +of the Eclipse Foundation. All of that work, and the `proj.4` and JMapProjLib work it in turn builds on, +remains the property of its authors; this fork preserves the Apache 2.0 licence and every copyright and +attribution notice unchanged, and is indebted to the people who wrote them. -![LocationTech](locationtech_mark.png) +neoProj4J is an independent fork. It is **not** a LocationTech or Eclipse Foundation project, is not +affiliated with or endorsed by either, and upstream is not responsible for it. Please report issues with +this fork here, not to the upstream project. + +How it differs: neoProj4J targets parity with [PROJ](https://proj.org/) 9.8.1 — projections, parameter +parsing, datum and grid handling, and a `+proj=pipeline` engine — validated against PROJ's own `gie` and the +OGP GIGS conformance suites. ## User Guide -Proj4J artifacts are available on maven central. + **!Important!** As of `1.2.2` version, `proj4-core` contains no EPSG Licensed files. -In order to make proj4j properly operate, it makes sense to consider `proj4-epsg` dependency usage. +In order to make neoProj4J properly operate, it makes sense to consider the `proj4-epsg` dependency usage. + +### Using neoProj4J with Maven -### Using Proj4J with Maven + -To include Proj4J in a Maven project, add a dependency block like the following: +To include neoProj4J in a Maven project, add a dependency block like the following: ```xml {latest version} @@ -27,11 +47,11 @@ To include Proj4J in a Maven project, add a dependency block like the following: ${proj4j.version} ``` -where `{latest version}` refers to the version indicated by the badge above. +where `{latest version}` refers to the latest released version. #### Proj4j EPSG -`Proj4J-EPSG` module distributes a portion of the EPSG dataset. This artifact is released the [EPSG database distribution license](https://raw.githubusercontent.com/locationtech/proj4j/master/LICENSE.EPSG). +`Proj4J-EPSG` module distributes a portion of the EPSG dataset. This artifact is released the [EPSG database distribution license](LICENSE.EPSG). It also redistributes PROJ 9.8.1's `conus` datum-shift grid verbatim under [PROJ's MIT license](LICENSE.PROJ), which is what makes NAD27 transforms shift correctly across the conterminous United States with only `proj4j` and `proj4j-epsg` on the classpath. To include `Proj4J-EPSG` in a Maven project, add a dependency block like the following: ```xml @@ -44,11 +64,11 @@ To include `Proj4J-EPSG` in a Maven project, add a dependency block like the fol ${proj4j.version} ``` -where `{latest version}` refers to the version indicated by the badge above. +where `{latest version}` refers to the latest released version. #### Using Proj4j with GeoAPI -`Proj4j-GeoAPI` module provides wrappers for using Proj4J behind [GeoAPI](https://www.geoapi.org/) interfaces. +`Proj4j-GeoAPI` module provides wrappers for using neoProj4J behind [GeoAPI](https://www.geoapi.org/) interfaces. GeoAPI is a set of Java interfaces derived from OGC/ISO standards for using different implementations of metadata and referencing services through a standard API. To include the module in a Maven project, add a dependency block like the following: @@ -62,34 +82,36 @@ To include the module in a Maven project, add a dependency block like the follow ${proj4j.version} ``` -where `{latest version}` refers to the version indicated by the badge above. +where `{latest version}` refers to the latest released version. Usage examples are available on the [GeoAPI site](https://www.geoapi.org/java/examples/usage.html). -### Using Proj4J with Gradle +### Using neoProj4J with Gradle + + -To include Proj4J in a Gradle project, add a dependency block like the following: +To include neoProj4J in a Gradle project, add a dependency block like the following: ``` dependencies { implementation 'org.locationtech.proj4j:proj4j:{latest version}' } ``` -where `{latest version}` refers to the version indicated by the badge above. +where `{latest version}` refers to the latest released version. #### Proj4j EPSG -`Proj4J-EPSG` module distributes a portion of the EPSG dataset. This artifact is released the [EPSG database distribution license](https://raw.githubusercontent.com/locationtech/proj4j/master/LICENSE.EPSG). +`Proj4J-EPSG` module distributes a portion of the EPSG dataset. This artifact is released the [EPSG database distribution license](LICENSE.EPSG). It also redistributes PROJ 9.8.1's `conus` datum-shift grid verbatim under [PROJ's MIT license](LICENSE.PROJ), which is what makes NAD27 transforms shift correctly across the conterminous United States with only `proj4j` and `proj4j-epsg` on the classpath. To include `Proj4J-EPSG` in a Gradle project, add the following line to the dependency block: ``` implementation 'org.locationtech.proj4j:proj4j-epsg:{latest version}' ``` -where `{latest version}` refers to the version indicated by the badge above. +where `{latest version}` refers to the latest released version. #### Using Proj4j with GeoAPI -`Proj4j-GeoAPI` module provides wrappers for using Proj4J behind [GeoAPI](https://www.geoapi.org/) interfaces. +`Proj4j-GeoAPI` module provides wrappers for using neoProj4J behind [GeoAPI](https://www.geoapi.org/) interfaces. GeoAPI is a set of Java interfaces derived from OGC/ISO standards for using different implementations of metadata and referencing services through a standard API. To include the module in a Gradle project, add the following line to the dependency block: @@ -97,12 +119,12 @@ To include the module in a Gradle project, add the following line to the depende ``` implementation 'org.locationtech.proj4j:proj4j-geoapi:{latest version}' ``` -where `{latest version}` refers to the version indicated by the badge above. +where `{latest version}` refers to the latest released version. Usage examples are available on the [GeoAPI site](https://www.geoapi.org/java/examples/usage.html). ### Basic Usage -The following examples give a quick intro on how to use Proj4J in common +The following examples give a quick intro on how to use neoProj4J in common use cases. #### Transforming coordinates from WGS84 to UTM @@ -147,4 +169,4 @@ For more details see [HOWTORELEASE.txt](./HOWTORELEASE.txt). ## Contributing -If you are interested in contributing to Proj4J please read the [**Contributing Guide**](CONTRIBUTING.md). +If you are interested in contributing to neoProj4J please read the [**Contributing Guide**](CONTRIBUTING.md). diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md new file mode 100644 index 0000000..50b6866 --- /dev/null +++ b/RELEASE-NOTES.md @@ -0,0 +1,711 @@ +# proj4j release notes — 1.5.0 and 2.0.0 + +**Status: draft, for review. Nothing here is released.** Version numbers, dates and the split between +the two releases are proposals. Figures are measured unless labelled otherwise; where a number is an +estimate or is still pending it says so, because on this project laundering an estimate into a fact +has cost real rework. + +Two releases, and the split is the whole point: + +| | | +|---|---| +| **1.5.0** | **Additive.** New API alongside the old, new correctness *available* but the legacy path unchanged where it can be. Upgrade should be a version bump. | +| **2.0.0** | **The engine flip.** The corrected numerical core, the corrected defaults, and fail-closed error semantics become the behaviour of the existing API. Upgrade requires reading this document. | + +The reason for two releases rather than one is that most of what follows changes *numbers*, and a +library that silently moves someone's coordinates is worse than one that makes them opt in. If you +only read one section, read [Compatibility](#compatibility-what-moves-and-by-how-much). + +**Where the numbers come from.** Every figure below was measured locally, most of them on a frozen +snapshot with an A/B against an otherwise identical tree. The CI workflow files are committed, but +**nothing here should be read as a green CI run** — see +[The gates](#the-gates-what-is-enforced-and-what-is-red). + +--- + +## Compatibility: what moves, and by how much + +Every row is **measured**. The magnitude is the point — "improved accuracy" is not a release note, it +is a way of not telling you that your output changed by four metres. + +The first six items **change the answer for existing callers**, so they lead. Everything after them is +a correction that moves values without changing the shape of the API. + +### 1. An out-of-grid `+nadgrids` point is now refused instead of echoed back + +`Grid.shift`'s no-table `else` branch returned the **input coordinate unchanged while reporting +success**. It now raises `CrsTransformException` with `ErrorCause.COORDINATE_OUTSIDE_GRID` — the cause +its own comment already named. + +| measure | value | +|---|---:| +| golden-master rows that change | **1,995** — `REG` 1,673 · `CSV` 148 · `PAIR` 144 · `SYN` 30 | +| of those, reported `OK` in 1.4.3 | **1,949** | +| the remaining 46 | 34 `IllegalStateException`, 8 `UnsupportedParameterException`, 2 `InvalidValueException`, 2 `NumberFormatException` | +| of the 1,995, **bit-identical to 1.4.3** beforehand | **202** | + +**Read the 202 twice.** For those rows the fail-open was so faithful that a behaviour-diffing gate saw +no change at all — 1.4.3 and the fixed tree produced the same bytes, because the defect was to return +the input and the input does not change. A defect that has always been present produces nothing to +diff. That is the sharpest argument on record that a change-detecting gate cannot be the only net. + +The change is not merely "an exception where a number used to be": the number was **wrong**. The 40 +witness rows that motivated the fix all probe latitude exactly `40.000000` — the southern edge of +`ntv1_can.dat`, the only NAD27 grid `proj4j-epsg` ships. The forward finds the point inside the box +and shifts it *south* of 40°N, out of the box; the `else` branch then returned it unchanged, so the +inverse leg never ran. `epsg:26721` probe 2 moved `fx` by −92.756 m and `ix` by +0.001090° ≈ 93.1 m — +the residue *equals* the forward shift, which is what proves the inverse was not running rather than +failing to converge. + +**These points do not round-trip after the fix, and they must not.** PROJ 9.8.1 does not round-trip +them either — verified with `cct`, not inferred: `-I +proj=hgridshift +grids=ntv1_can.dat` at +(−49.928932188, 40.0) lands at 39.9999534467, and the forward on *that* point answers +`TRANSFORMATION ERROR (Coordinate to transform falls outside grid)`. + +#### The layer nuance, and where proj4j is now stricter than PROJ + +**Quote the layer with the claim.** Verified with `PROJ_DEBUG=2`: + +- At the **operator** level (`+proj=hgridshift`) PROJ 9.8.1 **errors** — that is the measurement above. +- At the **CRS** level *with `proj.db`*, `cs2cs +datum=NAD27` at an out-of-area point selects + **"Ballpark geographic offset"**: a **declared** no-op, not a silent one. + +proj4j's legacy path has no such operation factory and **is** the operator path, so erroring is +faithful to the layer proj4j occupies. Both statements are true at once. + +The consequence is measurable. Cross-tabbed over **all 4,280** rows of `proj4-epsg.csv`, proj4j against +`cs2cs` 9.8.1 on the dictionary strings on both sides: + +| | PROJ answers | PROJ refuses (`* * inf`) | +|---|---:|---:| +| **proj4j answers** | 3,869 | 0 | +| **proj4j throws** | **131** | 280 | + +**Not one row where proj4j returns a coordinate and PROJ refuses.** The residual risk is the mirror +image: **131 rows where proj4j throws `COORDINATE_OUTSIDE_GRID` and PROJ 9.8.1 answers.** All 131 carry +`+datum=NAD27`, and all 131 are PROJ selecting the declared ballpark described above. That zero is a +measurement, not a blind instrument: short-circuiting the new `throw` in a scratch copy flips exactly +131 rows back to answering. + +The **`@`-optional** wart is untouched, with a negative control proving the scope: 17 `datum=potsdam` +rows did **not** move, because `BETA2007.gsb` is absent, the grid list resolves *empty*, and an empty +list is correctly a no-op. *"The grid file is not there"* stays silent; only *"outside a grid that +loaded"* errors. + +**What to do about it** depends on an unresolved packaging question — see +[Pending, not done](#pending-not-done-two-changes-in-flight). + +### 2. `ErrorCause` for an unreadable or missing grid changed — update any code matching on it + +If you match on `ErrorCause`, this is a source-compatible but **behaviour-visible** break. + +| | was | is | +|---|---|---| +| a `+grids=` / `+xy_grids=` / `+file=` value proj4j cannot find, read or parse | `ErrorCause.INVALID_PARAM_VALUE` (`Group.CRS`) | **`ErrorCause.MISSING_GRID`** (`Group.OPERATION`) | +| a malformed or unresolvable `+init=:
` | folded into the same `INVALID_PARAM_VALUE` | **new `PipelineErrorCode.INVALID_INIT_KEY`**, errno **1027**, still surfacing `ErrorCause.INVALID_PARAM_VALUE` | + +The reasoning is that the two are statements about different things. `PipelineErrorCode +.FILE_NOT_FOUND_OR_INVALID` (errno 1029) carries `rejectedByProj = false`, because **proj4j failing to +read a file is a statement about proj4j's readers, not about your definition** — the `+grids=` value +you wrote may be perfectly valid and simply unreadable here. Reporting that as an invalid parameter +turned a capability gap into apparent conformance. An unresolvable `+init=` key, by contrast, really is +a bad *parameter value*, and upstream agrees: `get_init_string` (`9.8.1:src/init.cpp:105,119,134`) sets +`PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE` — **1027, not 1029** — for all three of its failure paths. + +`INVALID_INIT_KEY` is kept distinct from `ILLEGAL_ARG_VALUE` so a caller can tell an unresolvable init +key from a bad `+order` or unit id without parsing the message, even though both report the same errno +and the same `ErrorCause`. + +### 3. `tmerc` defaults to Poder/Engsager + +| change | movement | escape hatch | +|---|---|---| +| **`tmerc` default algorithm** → Poder/Engsager | **0.83 mm at 6° from the central meridian; 4 m at 20°; kilometres beyond 45°** | `+approx`, or `+algo=evenden_snyder`. Spheres keep Evenden/Snyder automatically — no flag needed. | + +**This is the widest-reaching numerical change in the release.** It claims **14,038** golden-master rows +on its own — nearly every projected CRS in the corpus moves by a fraction of a millimetre. + +It is small in the zone a Transverse Mercator is *supposed* to be used in and unbounded outside it, +which means the users who see metres are the ones already outside the intended domain, and who are +therefore least likely to be watching. `+approx` reproduces 1.4.3. + +Two independent corroborations that this is the algorithm change and not something hiding behind it: + +- The rule was pinned **predictively** rather than by listing rows. Bucketing every `tmerc` probe by + distance from *its own* `lon_0` gives a median movement of **2.53e-4 m at 5–10°**, against **37 m at + 0–5°** and **120 m at 60–65°**. The latter two are impossible for series truncation — they are the + NADCON shift — and the band `1e-6 .. 1e-2 m` separates the two populations completely. Per-column + maxima across the whole set: `fx` 3.5 mm, `ix` 1.2e-6°. +- `MetaCRSTest`'s reference file (`proj4-epsg.csv`) says in its own header that it was *"auto-generated + from proj.4 epsg database"* — **its series is what 9.8.1 now spells `+approx`.** Canonical row + `4326→2000`: the file's `9413505.328467` is `cs2cs 9.8.1 +approx` **exactly**, and the new + `9523653.022922916` is `cs2cs 9.8.1` **exactly**. + +### 4. The auxiliary-latitude core is PROJ 9.4–9.6's, and it moves `laea` / `aea` / `cea` + +`9.8.1:src/latitudes.cpp` plus the rewritten `mlfn.cpp` / `phi2.cpp` / `tsfn.cpp` are now wired into +`tmerc poly laea cea aea etmerc stere`. + +**Measured movement: 19,336 golden-master rows, every one of them below 1 µm** (the rule's magnitude +band is `0 .. 1e-6` in raw column units, and the measured distribution is bimodal with an empty valley +between 1e-5 and 1e-3, so the band separates this change from everything else cleanly). + +The *error being removed* is larger than the movement, because the old helpers were wrong in a way that +partially cancelled downstream. Measured against 9.8.1 on GRS80: + +| helper | 1.4.3 | now | gie tolerance class | +|---|---|---|---| +| `authlat` (authalic latitude) | **1.58 mm at latitude 20.8°** | 0.7 nm | 0.1 mm | +| `mlfn` | 4,920 nm at latitude 72.6° | < 1 nm | 50 nm | +| `phi2` | 4,145 nm at latitude 2.8° | 2.1 nm | 50 nm | +| `tsfn` | `0.9999999999999999` at φ=0 | exactly `1.0` | **0 m** | + +`authlat` is the one that matters for this item: 16× its own tolerance class, and it is what moves +`laea`, `aea`, `cea`, `eqearth` and `nzmg`. There is no escape hatch, because the old value was simply +wrong. + +> **This rule is still marked provisional in the golden gate.** It is pinned at 19,336 so that a change +> to its size becomes an event rather than a silence, but ~19,000 rows of sub-micron drift is the +> easiest place in the suite for an unrelated change to hide, and the numerical-core owner is expected +> to replace it with a per-section band. + +### 5. A 2D datum shift no longer invents a height + +If you call the two-argument `ProjCoordinate` constructor — i.e. you have no Z — a datum shift used to +hand you back a fabricated one. + +`EPSG:4326 → EPSG:27700` at (−2.0, 53.0): + +| input z | before | after | +|---|---|---| +| `NaN` (2-arg constructor), single point | **`−49.84606796130538`** | **`NaN`** | +| `NaN`, bulk `transform3D` | **`−49.84606796130538`** | **`NaN`** | +| explicit `0.0` | `−49.84606796130538` | **unchanged** | +| explicit `100.0` | `50.15598100144416` | **unchanged** | + +**x and y are bit-identical in every case.** If you pass an explicit height — including an explicit +`0.0` — nothing about your output changes. Only the "I never supplied a Z" case changes, and it changes +from a plausible-looking ellipsoidal height to `NaN`, which is what "you did not give me one" means. + +If you were reading `.z` off a 2D transform and treating it as data, it was never data. + +### 6. Axis order — read this even if nothing else applies to you + +**`AxisOrderPolicy.LEGACY` is the default. It means longitude-first, which is exactly 1.4.3.** Nothing +changes unless you opt in. + +**Opting in to authority order is a silent breaking change, and it is invisible near (0, 0).** `EPSG:4326` +is officially latitude-first. If you switch to `AxisOrderPolicy.AUTHORITY`, every call site that passes +`(lon, lat)` starts passing `(lat, lon)`, and: + +- near the origin — the Gulf of Guinea — the two are numerically similar and the output looks plausible; +- at San Francisco, `(-122.4, 37.8)` under `AUTHORITY` is an invalid latitude and **throws**, which is + the good case; +- at, say, `(45, 30)` both orders are valid coordinates and you get a **confidently wrong answer** + hundreds of kilometres away, with no error. + +So: **do not flip this flag globally and run your tests near the equator.** Verified in both +directions — `EPSG:4326 → EPSG:3857` at `(-122.4, 37.8)` under `LEGACY` and `(37.8, -122.4)` under +`AUTHORITY` agree **bit-for-bit**, and feeding `AUTHORITY` the legacy order at San Francisco throws +`INVALID_COORDINATE` rather than guessing. + +--- + +### Other projection, ellipsoid and datum changes + +| change | movement | escape hatch | +|---|---|---| +| **`Ellipsoid.SPHERE` corrected** | **0.41 m at 222 km** | pass an explicit `+R=` if you depended on the old value | +| **`Ellipsoid.AIRY` corrected** | **0.76 mm** | none | +| **`carthage` datum** — was bound to the wrong ellipsoid | **20.45 mm N** at EPSG:22391 Tunis | none | +| **`OSGB36` datum** — now `9.8.1:src/datums.cpp`'s values rather than EPSG:1314's rounded ones | **3.085 mm E**, ~3.5 mm max across GB | pass an explicit `+towgs84=` | +| **`potsdam` datum** now declares its grid | changes results where `BETA2007.gsb` is present | omit the grid to keep the Helmert-only path | +| **`MercatorProjection` now reads `+lat_ts`** | **1.3 million metres** on `EPSG:3388` | none — Mercator variant B did not previously exist | +| **`AzimuthalProjection` defaults `lat_0`/`lon_0` to 0/0**, matching PROJ, not 45°/45° | every azimuthal proj-string omitting them was silently oblique | state `+lat_0`/`+lon_0` explicitly | +| **`CoordinateReferenceSystem.createGeographic()` no longer drops `+pm`** | **187,739 m** of easting, across all 94 `+pm=` definitions | none | +| **`ObliqueMercatorProjection`**: `+alpha` without `+gamma` got zero rotation; `u_0` used `cos(Gamma)` where upstream uses `cos(alpha)` | 215,218 m E / 303,073 m N, and 2,532 m E on RSO Borneo | none | + +Notes on two of these, because the size is misleading in both directions: + +- **`Ellipsoid.SPHERE` was the GRS80 *authalic* radius**, not a normal sphere. It is now PROJ's Normal + Sphere. If you were using `Ellipsoid.SPHERE` as a stand-in for "roughly the Earth" the change is + immaterial; if you were using it to reproduce a specific pipeline, it is 0.41 m. +- **`Ellipsoid.AIRY` had a rounded `b`** where the definition gives an exact inverse flattening. 0.76 mm + is below most tolerances and above a few. + +### Errors where there used to be values + +**This is the second most likely thing to break your build, and it is deliberate.** A failure expressed +as a plausible coordinate is worse than an exception, because nothing downstream can tell it apart from +an answer. + +| change | what it means for you | +|---|---| +| **`aasin`/`aacos` throw** instead of clamping silently | an ill-conditioned intermediate now surfaces instead of producing a finite wrong answer | +| **Domain guard** on input coordinates | matches PROJ: rejects `\|λ\| > 10` **radians** (≈ ±573°) and *wraps* everything inside that; latitude within `1e-12` rad of a pole is *clamped*, not rejected. **A `[-180, 180]` rejection would be stricter than PROJ and is not what this does** — passing 200° still works. | +| **Forward-only projections stopped returning the input as if it were lon/lat.** They throw. | **13 projections × 5 probes = 65 golden rows** today: `airy august boggs denoy larr lask nicol rpoly tcc wag7 adams_hemi adams_ws1 guyou`. A separate rule covers 40 more rows in projections newly added this release. | + +**The measurement that made the case, kept because it is what proves this was a fix rather than a new +restriction.** When the rule was first written it claimed **90 rows, of which 75 had been reported `OK` +in 1.4.3.** Those 75 were silently wrong answers and are now errors. The other 15 had been +`InvalidValueException: Unknown projection` — never wrong, merely absent. + +The row set is now **65, not 90, and the shrinkage is itself the good news**: five names left the list — +`lagrng`, `aitoff`, `hammer`, `nsper`, `wintri` — every one of them because **upstream turned out to +have an inverse that 1.4.3 lacked** (`aitoff.cpp:200-201`, which is the shared setup for both `aitoff` +and `wintri`; `hammer.cpp:86-87`; `nsper.cpp:167-168`; `lagrng.cpp:101-102`). They are now invertible +here too. + +> **The gate does *not* key on `hasInverse()`**, and that detail matters if you were relying on it. +> `hasInverse()` is a hand-maintained declaration that was **read nowhere in `core/src/main` before +> 1.5.0**, and it is wrong in both directions: `KrovakProjection` and `NewZealandMapGridProjection` +> implement `projectInverse` without declaring it, while `LandsatProjection` declares it while +> overriding nothing. A `hasInverse()`-keyed gate rejected **EPSG:2065, EPSG:5514 and EPSG:27200 — +> three working CRS**. The shipped gate interrogates the class hierarchy for a declared +> `projectInverse(double, double, ProjCoordinate)` instead, and those three still work. + +If your code has `try { inverse } catch { }` or treats a finite result as success, that code was +relying on the old behaviour. The 1.5.0 → 2.0.0 gap exists so you can find out which. + +### Grid handling + +| change | movement | +|---|---| +| **NTv1 reader**: data began at offset **192, not 176**, *and* the latitude/longitude shift components were **transposed** | **~13 m on every NTv1 shift ever computed.** 8 m E + 10 m N at Chicago | +| **NTv2 multi-subgrid**: "only 1 subfile supported" silently used subgrid 1 for the whole file, and interpolation read the captured **parent** table after descending into a child | a point in Alberta got **no shift at all** from `ntv2_0.gsb` while the transform reported success | +| **Grid-edge clamp in `nad_intr`**: `1e-11` → `1e-4` | the old value was **10⁷× too tight**; points PROJ shifts were returned unchanged | +| **Containment tolerance**: `1e-4` → `1e-5` (`REL_TOLERANCE_HGRIDSHIFT`) | proj4j accepted and **extrapolated** 2e-5° outside `conus`'s south edge where PROJ reports a transformation error | +| **Antimeridian extents** now handled | `us_noaa_alaska.tif` declares `west = -194°`, so its whole western half was unreachable | +| **Inverse grid shift** declared success when only *one* ordinate had converged (`&&` where PROJ tests the squared 2-norm), and on exhaustion returned the input unchanged | now throws `ConvergenceFailureException` (`ErrorCause.NUMERICAL_FAILURE`) | +| **NAD27 → NAD83 in CONUS** | **95.573 m at San Francisco.** Two independent causes, both fixed in code: a parser bug that destroyed the grid list on a static singleton, and the absence of the `conus` grid. **The second half is a packaging question that is still open — see [Pending, not done](#pending-not-done-two-changes-in-flight).** | + +Neither NTv1 error alone, nor the pair together, moved a result far enough to look like a bug. That is +why it survived. **If you have stored coordinates computed through an NTv1 grid, they are wrong by +about 13 m**, and recomputing them is a data migration, not a library upgrade. + +**One deliberate divergence from PROJ is kept**, and it is worth distinguishing from the fail-open in §1 +above, because the distinction is exactly why one was fixed and the other was not. `Grid.shift` falls +through to the *next* grid when interpolation fails, where PROJ commits to the first containing grid and +reports outside-grid. The fall-through can only ever return a value that **some grid the caller listed** +actually produced; the `else` branch **invented** one. Reaching the fall-through requires `resX > 9·resY`, +so it is pinned by a purpose-built 10°×0.1° CTABLE V2 fixture plus a plain grid, each alone as its own +control. + +--- + +## Conformance: 15.6 % → 93.5 %, and what the denominator excludes + +| | | +|---|---| +| **gie corpus** | **7,378 / 7,895 genuine passes — 93.5 %** | +| **baseline (1.4.3-era harness)** | **1,066 / 6,845 — 15.6 %** | +| **GIGS** | **1,170 / 1,170 — 100 %**, all 20 files | +| complete files | **at least 29 of the 42** active corpus files are at 100 % | +| the rest | 515 failing · 2 skipped · 28 vacuous · 94 excluded (out of block) | + +**The denominator is not the corpus size, and this is the honest part of the number.** The corpus holds +**7,923 assertions** across 42 active files — 6,962 `expect` plus 961 `roundtrip` — counted with a port +of gie's own lexer rather than with `grep`, because `grep '^expect'` models neither block boundaries nor +left-trimming. From that: + +- **28 rows are *vacuous* `expect failure` rows and are excluded from both numerator and denominator.** + A vacuous row is one where proj4j could not construct the operation *at all*: PROJ built it and + rejected the coordinate, proj4j failed to build it, both "failed", and a naive harness scores a pass. + **That is failure-to-implement counting as conformance**, and it is excluded rather than banked. + 7,923 − 28 = **7,895**. +- **2 skips are reported separately and are never passes.** +- **94 out-of-block lines** in `DHDN_ETRS89.gie` (which closes `` at line 161 of 375) are + reported as `94 excluded (out of block)`, not as "not run". + +**What this means for reading the two percentages together.** The baseline denominator is 6,845, not +7,895, because far more rows were vacuous then — proj4j could not build the operation for most of the +`adams` family, `guyou`, `peirce_q` and `spilhaus`. So the ratio improved **and** the measured +population grew by 1,050 assertions. Both halves are progress; neither is visible in the percentage +alone. Under-counting is visible in the report; over-counting would not be, which is why the rule +resolves ambiguity to vacuous. + +### Zero disagreements with PROJ 9.8.1 on the MetaCRS corpus + +The strongest single piece of correctness evidence the project has produced. `MetaCRSTest`'s reference +file, `proj4-epsg.csv`, reports ~1,195 "regressions" against 1.4.3. Triaged row by row against +`cs2cs` 9.8.1 on the dictionary strings, with the target parameter strings verified byte-identical +between the two trees so that every one is a pure algorithm change and not a parse change: + +| rows | cluster | vs `cs2cs` 9.8.1 | +|---:|---|---| +| 775 | `tmerc` | **agrees** | +| 280 | `tmerc` | **both refuse the point** (`cs2cs` prints `* * inf`) | +| 28 | `cass` | agrees | +| 24 | `tmerc` + `+datum=` | agrees | +| 22 | `tmerc`/`cass` + `NAD27`/`potsdam` | PROJ refuses, proj4j answers *(pre-existing; superseded by the fail-closed work in §1)* | +| 3 | `eqc` | agrees | +| **0** | — | **proj4j disagrees numerically** | + +**Across all 4,280 rows of the corpus there is not one where proj4j and PROJ 9.8.1 both produce a +coordinate and the coordinates differ.** The reference file is stale, not the library — and regenerating +it is legitimate here precisely because `cs2cs` 9.8.1 is an independent oracle that agrees bit-for-bit. +Re-pinning it from proj4j's own output would make it circular and self-confirming forever, and is not +what will be done. + +## The gates: what is enforced, and what is red + +Five regimes now gate this work, and **one** of them is **red on purpose**. Reading a red gate as a +defect would be exactly backwards: they were all green once for the same reason a scan that cannot fail +always passes. *(This said "four regimes … two of them red"; `ci` is a fifth, and it went green when +`proj4-epsg.csv` was regenerated, so `golden` is the only intentional red left.)* + +*Every figure below re-measured 2026-08-03 in the pinned container (Temurin 21.0.11 / aarch64).* + +| gate | state | figure | +|---|---|---| +| **ci** | **green** | whole 7-module reactor, `BUILD SUCCESS` with javadoc, **2,320 tests / 0 failures / 4 skipped** in 223 report files (`core` 1,917 · `conformance` 345 · `db` 52 · `geoapi` 6) | +| **conformance** | **live, CI-wired, green** | baseline pair committed — `gie-expected-failures.tsv` (545 rows) and `gie-corpus-index.tsv` (**7,923 keys**). **7,441 / 7,900**, verdict `regressed 0, unexpected passes 0, new 0, disappeared 0` against the full index | +| **golden** | **live, blocking, RED** | **12,012 UNCHANGED · 41,418 CHANGED · 0 ADDED · 0 REMOVED · 39,127 INTENDED · 2,291 UNEXPLAINED** over 53,430 rows; **42 of 42** rules pinned with `expected_rows` (was 38, then 41) | +| **allocation** | **live, green** | **0 breaches**; **245 gated, 0 EXCLUDED**, 245 / 245 arms, Tier 2 green. Was `172 gated / 9 excluded / 181 arms`: `BulkTransformBenchmark` joined the gate (+64) and `crs-parse` rejoined Tier 1 (−9 exclusions) | +| **determinism** | **runs per leg, green** | **22** tests, 0 failures, 0 skips (was 15; the count is a floor, and the workflow now reports upward drift as a notice rather than failing) | +| **bench** | baseline captured 2026-08-02 | **171 per-benchmark ratchets, all enforced, none reported-only**; 25 rules; 8 CRS pairs × 20 operations pinned; 2 remaining `TBD`s are `targetBytesPerOp` policy cells on rules whose ratchet is a real number | + +**Why golden being red is the intended state.** The gate exits non-zero on any `UNEXPLAINED` row: a row +whose behaviour changed and for which no rule in `golden/rules.yaml` claims responsibility with a stated +mechanism and a pinned row count. 2,291 rows are in that state, down from **18,168 → 3,304 → 2,291** over +two triage passes. Every one of them is a change somebody must *explain*, not a change somebody must +*undo*, and the largest blocks are known: the reserved `proj4-epsg.csv` re-pin, `tmerc` rows probed +thousands of kilometres outside their own zones where both series are meaningless, and a handful of +`cass` / `omerc` / `merc` clusters. Turning the gate green by relaxing it would discard the only +instrument that has caught a silent behaviour change on this project — twice. + +**Two honesty notes about the instruments themselves**, because a gate that cannot fail is worse than no +gate: + +- **`gc.alloc.rate.norm` does flake, and it was previously claimed not to.** Two independent 16-minute + runs in separate JVMs agreed to within 0.0001 B/op on **170 of the 181 arms**. The exception was + real: the 11 `CrsParseBenchmark` arms above 1 KB/op drifted run-to-run by up to **0.121 %**, enough + for two of them to fail the 0.1 % gate on an *unmodified* tree. That was resolved first by marking + the `crs-parse` rule's nine arms `tier1Gated: false` — measured and reported every run, but not + blocking — rather than by widening `ALLOC_RELATIVE_SLACK`, which would have weakened all 181 arms to + accommodate nine. **The exclusion was written with an exit condition and the exit condition was met:** + `io/InitFileCache` removed the per-call dictionary re-scan that made the arm's allocation + data-dependent, the numbers fell to 2,480 / 2,872 / 1,136 B/op, and `tier1Gated`, + `exclusionArmCount` and `exclusionReason` were deleted together. **There are no exclusions today — + `245 gated, 0 EXCLUDED`** — and `ALLOC_RELATIVE_SLACK` was never widened. The two arms that remain + bimodal vary by exactly 56 bytes and **only downward** across 21 forks, and are pinned at their + maximum, which is safe because the gate fails only on exceeding. +- **The workflow files are committed but no CI run backs any figure here.** Everything above was + measured locally. Do not read a green badge into this document. + +--- + +## Determinism: the guarantee, and its one exception + +proj4j targets **bit-for-bit identical results across JVMs and CPU architectures**, because the +motivating consumer caches one `CoordinateTransform` and shares it across Spark executors that are not +guaranteed to be on the same hardware. Implemented by routing every transcendental through +`StrictMath` — whose results are *specified to a bit*, unlike `Math`, which is specified to 1–2 ulp and +which HotSpot substitutes per architecture. + +**This is not only a reproducibility policy; it decides a conformance verdict.** At +`+proj=adams_ws2 +ellps=WGS84` and `(179.999, 0)` the map's conditioning amplifies a last-bit +difference in `sin` by ~3×10⁸: + +``` +Math.sin(lam/2) x = 16686159.3838 m misses a 1 mm bar by 27.8 mm +StrictMath.sin(lam/2) x = 16686159.3563 m hits it, 0.35 mm +exact (60 digits) x = 16686159.3639 m <- sits BETWEEN the two +``` + +**Neither function is more accurate.** What is being preserved is *fidelity* to the fdlibm-equivalent +`sin` that generated PROJ's expected values. + +### What is now verified rather than asserted + +Until this release the guarantee was a design intention. It is now a test — `StrictMathGoldenTableTest`, +a committed table of **54,265 raw-bit results across 19 functions** — run on five JDK and instruction-set +combinations: + +| JDK | `os.arch` | `StrictMath.sin` implementation | result | +|---|---|---|---| +| Temurin 8.0.502 | `x86_64` | native, JNI into compiled fdlibm | 54,265 pass | +| Temurin 11.0.32 | `x86_64` | native, JNI into compiled fdlibm | 54,265 pass | +| Temurin 11.0.32 | `aarch64` | native, JNI into compiled fdlibm | 54,265 pass | +| Temurin 21.0.11 | `aarch64` | pure Java `FdLibm` | 54,265 pass | +| OpenJDK 26.0.2 | `aarch64` | pure Java `FdLibm` | 54,265 pass | + +**271,325 `StrictMath` and 221,970 `FastStrictTrig` raw-bit comparisons, zero value mismatches**, across +two instruction sets and both `StrictMath` implementations — **JDK 21** rewrote `StrictMath.sin/cos/tan` +from JNI into pure Java, so 8, 11 and 17 exercise a genuinely different code path and a pass on 21 is not +evidence about them. The table above spans that boundary in both directions, which is what makes the +guarantee empirical rather than inferred. JDK 17 is on the *native* side, alongside 8 and 11 +(`Modifier.isNative(StrictMath.sin)` is `true` on Corretto and Temurin 17.0.20, and +`java.lang.FdLibm$Sin` does not exist in a JDK 17 image). + +That the assertion is not vacuous is established two ways. `util/FastStrictTrig` is an independent +~800-line transcription of the JDK's `FdLibm` kernels and it matches the same table — which cannot +happen if the table is meaningless. And `Math` demonstrably departs from it: on Temurin 21/AArch64, +`Math.sin` differs on 2.14% of probes and `Math.cos` on 1.89%. + +### The exception, stated plainly + +> **NaN sign and payload are architecture-dependent and are NOT covered by the bit-for-bit guarantee. +> Every finite result is. Signed zero is.** + +Measured with the JDK held fixed at Temurin 11.0.32 and only the instruction set varied: + +| expression | x86-64 | AArch64 | +|---|---|---| +| `Inf - Inf`, `Inf * 0.0`, `Inf / Inf`, `sqrt(-1)` | `0xfff8000000000000` | `0x7ff8000000000000` | +| `0.0 / 0.0`, `Double.NaN` | `0x7ff8000000000000` | `0x7ff8000000000000` | + +x86-64's default NaN has the sign bit set; AArch64's does not, and the JLS specifies only that these +expressions yield *a* NaN. **This matters concretely**, because the fail-closed sentinel policy writes +`NaN` to every output ordinate of a failed point — so error rows are exactly the rows that cannot be +compared on raw bits across architectures. If you checksum or raw-bit-compare transform output, +normalise NaN first. `Double.isNaN` is unaffected; so is every tolerance comparison; so is the +`gie` metric, which maps NaN-on-both-sides to zero distance. + +--- + +## Capability boundary — what proj4j does not do + +Stated as a boundary rather than buried in a footnote, because the consumer for this work explicitly +values legibility over coverage, and because a release note that lists only capabilities is an +advertisement. + +### Operator families that are not implemented + +Each is a **refusal**, not a silent omission: proj4j reports `PROJECTION_NOT_IMPLEMENTED` rather than +producing something. + +- **The DGGS group — `airocean`, `s2`, `isea`.** Verified absent from `Registry`. Together they account + for **188 failing assertions in `builtins.gie`** (`airocean` 92, `s2` 56, `isea` 40) — the three + largest single blocks left in the corpus, and all three are **declined on ratio**: they are + discrete-global-grid systems whose implementation cost is disproportionate to any consumer need on + record. If you need them, use PROJ. +- **`+proj=helmert` as a user-facing operator.** It exists only as the hidden static + `+exact +convention=position_vector` helper the `cs2cs` emulation builds. Deliberately not exposed, + because the user-facing operator additionally carries `convention=coordinate_frame`, `transpose` and + seven time-dependent rates — **all of which appear in the corpus** — and shipping a subset would + silently ignore a token PROJ acts on. Costs 3 assertions in `GDA.gie` and 1 in `4D-API_cs2cs-style.gie`. +- **`gridshift` (the unified operator) and `defmodel`.** Both need the GeoTIFF grid reader wired into + the pipeline layer; the reader itself exists (below). +- **`+proj=deformation +grids=`** — the single-file three-channel Geodetic TIFF Grid form. The two-grid + form (`+xy_grids=` / `+z_grids=`) works. +- **`nkg`** — 33 assertions. Unblocked in *data* terms but not in operators: the transformations are + concatenations whose "method name" is itself a PROJ pipeline (`PROJ:PROJString`), needing + `deformation` plus a transformed time dimension. +- **The time dimension is not transformed.** No `+proj=unitconvert +t_in`, no `+proj=set +t`. Note the + distinction: `+t_epoch` / `+t_final` on `hgridshift` and `vgridshift` **are** honoured, so a + time-*gated* grid shift behaves as upstream's does; it is time as a transformed *ordinate* that is + absent. + +Implemented and often assumed otherwise: `longlat` (and its three aliases), `geocent`, `unitconvert`, +`axisswap`, `cart`, `vgridshift`, `hgridshift`, `deformation` (two-grid), `tinshift`, `affine`, `push`, +`pop`, `set`, and every projection in `Registry`. + +### Vertical and height support is thinly evidenced, and you should know how thinly + +A **GTX vertical grid reader** and a **GeoTIFF grid reader** both ship (the latter verified bit-identical +to `cct` 9.8.1 to 12 decimals across 35 vendored fixtures, both subgrid hierarchies, all seven real US +grids, and the real `us_nga_egm96_15.tif` and `us_nga_egm08_25.tif`). But the *conformance evidence* for +heights is much weaker than the headline suggests, and the honest figures are: + +- **Only 356 of 7,923 corpus assertions — 4.5 % — score a third ordinate at all** (225 with three + numbers, 131 with four): **194 pass, 160 fail, 2 skip.** For the other 5,419 coordinate expects, + `gie.cpp:1117` zeroes the third ordinate on both sides, so **z contributes exactly zero to the + deviation regardless of what the operation writes.** That is upstream's masking, not proj4j's + insulation. +- All 961 roundtrips carry z unmasked and 878 pass — but a roundtrip only asserts that z returns where + it started, which **any pass-through satisfies trivially**. +- **For a height through the *datum* stage specifically, the corpus evidence is essentially none.** + `BasicCoordinateTransform` is reachable from the whole corpus through exactly one route, and + `crs_src`/`crs_dst` appear in only two files — **8 assertions, 6 of them with 3-D expects, and none + passes** (4 fail, 2 skip). + +So: treat 3-D and vertical transforms as **supported but lightly covered**, and test your own heights. +The invented-height fix in §5 above is covered by a dedicated unit test, not by the corpus. + +### Database vintage and operation selection + +- **The legacy path has no `proj.db`.** PROJ 9.x resolves `+datum=` and operation search through it; + proj4j's legacy path resolves against the shipped PROJ.4-style dictionaries. Concretely: + `+datum=OSGB36` in PROJ picks OSTN15, **1.784 m** from the legacy Helmert proj4j applies; `nzgd49` is + **2.248 m**. This is a **data-vintage gap, not an arithmetic defect** — on the parameter strings each + engine is actually given, the two agree. +- **A pure-Java, zero-dependency reader for a transcoded 9.8.1 database exists** (`proj4j-db`, Phase 1), + but wiring operation *selection* through it is not complete, so the numbers above still describe the + default path. When it does land it changes an answer that is currently correct-by-accident: the facade + throws `BALLPARK_REJECTED` for `EPSG:4267 → EPSG:4269`, which is right without the database and + **wrong with it** — the authority publishes **nine** transformations for that pair, from 0.15 m to + 2.0 m accuracy, and not one is ballpark. +- **The shipped EPSG dictionary is v9.2-era (2017), against PROJ 9.8.1's v12.029.** The dictionary + carries no version stamp, so **`Proj.databaseVersion()` returns `Optional.empty()` rather than + guessing a version.** The prose lives in `DatabaseInfo.vintageNote()`. This is the pattern throughout + the new introspection API: it declines to answer rather than answer plausibly. + - `availableGrids()` is probe-verified and `declaredGrids()` is separate, so a grid that is declared + but unreachable is *reported* rather than omitted. + - `axisOrder()` is paired with `isAxisOrderAuthoritative()`, so an inference is never presented as an + authority statement. + - `version()` is read from the JAR manifest and says `unknown (no jar manifest on this classpath)` + from exploded classes, rather than a compiled-in constant that can lie. + - `Crs.toWkt(WKT1_*)` **throws** rather than emitting lossy WKT1. +- **NADCON is deliberately not implemented, and will not be.** It is not a PROJ 9.8.1 format: + `grids.cpp`'s `HorizontalShiftGridSet::open` dispatches on exactly four things — NTv1, CTABLE V2, + NTv2 and TIFF — and the `us_noaa_nadcon5_*` grids are NADCON 5 data *in GeoTIFF*, read by the TIFF + path. Writing a NADCON reader would be a divergence from the target revision, not parity with it. + +--- + +## Pending, not done: two changes in flight + +**Neither of the following is in this build.** They are listed here so that nobody reads their absence +as a decision, and so that no figure below is quoted before it exists. + +> ### ⏳ PLACEHOLDER — `conus` in `proj4j-epsg` +> +> **Status: in flight, not landed.** Verified today: `epsg/src/main/resources/proj4/nad/` ships +> `ntv1_can.dat` and no other grid. +> +> `Datum.NAD27` requests `@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat`. Only `ntv1_can.dat` ships, and its +> footprint is **40°N–84°N, 142°W–44°W** — Canada. So in a default deployment San Francisco (37.8°N) and +> Kansas (39.0°N) are *south* of every grid proj4j has, and with the §1 fix in place they now raise +> `COORDINATE_OUTSIDE_GRID` rather than silently returning the input. Everything in CONUS *north* of 40°N +> — Chicago 41.9, Boston 42.4, Minneapolis 45.0, Seattle 47.6 — is inside the box and is interpolated +> from a Canada-authoritative grid. +> +> `9.8.1:data/tests/conus` is **264,424 bytes** of CTABLE V2, a format `datum/CTABLEV2.java` already +> reads, so folding it in costs zero new parsing code. Today it is available only through the separate +> `proj4j-grids-us-legacy` artifact (**1,192,986 B** as a jar, `conus` + `alaska`, resources only) and, +> at *test* scope, to `core`. +> +> **This section will state the artifact contents and a measured size when the change lands. No +> `proj4j-epsg` size is quoted here on purpose** — the figure that stood in the project's own packaging +> notes was measured today as **7,603,235 B** against a long-recorded 2,518,313 B, a 3× error, and it is +> exactly the kind of number that goes straight into release material. + +> ### ⏳ PLACEHOLDER — relaxing `ClasspathResourceResolver.isSafeName` +> +> **Status: in flight, not landed. No conformance figure is quoted for it, and none should be until it +> is measured on a quiesced tree.** +> +> The resolver rejects any resource name containing `/`. The corpus writes +> `+file=tests/tinshift_simplified_kkj_etrs.json`, `+grids=tests/us_noaa_nadcon5_*.tif` and +> `+xy_grids=tests/nkgrf03vel_realigned_xy_extract.ct2`; PROJ resolves these by appending the whole +> token to a search directory. So proj4j can currently reach **no** `tests/…` file, and roughly **100 +> assertions** sit behind that one rule — concentrated in `gridshift`, `geotiff_grids`, `defmodel` and +> `tinshift`. **No GeoTIFF reader unlocks them on its own**; the reader is already done and verified. +> +> The guard is a security boundary — CRS strings are untrusted per-row input — so relaxing it is a +> deliberate decision, not a cleanup. The proposed change permits interior path segments while +> continuing to reject a leading `/` or `\`, spaces, and any `.` / `..` / empty segment. + +--- + +## Java baseline: staying on 8, and the multi-release JAR is **not** needed + +The plan of record was **Java 11 plus a multi-release JAR with `META-INF/versions/17`**, on the +reasoning that `StrictMath` on Java 8 is a JNI call per transcendental while JDK 17 rewrote it into pure +Java, and that this is what makes the determinism guarantee affordable. **That premise is false: the +pure-Java rewrite of `StrictMath.sin/cos/tan` is JDK 21, not 17.** + +**Recommendation: keep `8`, drop the MR-JAR.** The pom currently targets 8; no change is +proposed. The recommendation is unchanged by the correction above, but **one of its two original reasons +is not**, so both are restated here. + +**The logical one, as originally written, does not survive.** It ran: *a multi-release JAR can only +change behaviour on a newer runtime — `META-INF/versions/17` is never read by a Java 8 or 11 JVM — but +JNI `StrictMath` is slow only on 8 and 11, so the MR-JAR was aimed at the only JDKs that do not have the +problem.* **JNI `StrictMath` is slow on 8, 11 *and 17*.** `META-INF/versions/17` would therefore have +been read by exactly one runtime that *does* have the problem: the MR-JAR was aimed **one release early +at the boundary**, not at JDKs lacking the problem. Worse, it would have been actively wrong there — +switching JDK 17 onto "plain `StrictMath`, it is pure Java here" means switching it onto the JNI path. +So the logical argument now cuts the same way for a different reason: the MR-JAR would have shipped a +slow path to the one JDK it reached. + +**The measured reason is the one that decides it, and it is unaffected.** `util/FastStrictTrig` — a pure-Java, +allocation-free transcription of `FdLibm.Sin/Cos/Tan`, compiled to Java 8 bytecode, and verified +bit-identical to `StrictMath` on all five combinations above — is faster than `StrictMath` on *every* +JDK, by the largest margin precisely where the MR-JAR was supposed to help: + +| JDK / arch | `StrictMath` | `FastStrictTrig` | `Math` | `FastStrictTrig` vs `StrictMath` | +|---|---|---|---|---| +| 8 / x86-64 (JNI) | 29.83 ns | **7.51 ns** | 30.63 ns | **3.97×** | +| 11 / x86-64 (JNI) | 10.13 ns | **7.03 ns** | 4.53 ns | 1.44× | +| 11 / aarch64 (JNI) | 18.31 ns | **3.80 ns** | 34.62 ns | **4.82×** | +| 21 / aarch64 (pure Java) | 6.56 ns | **3.71 ns** | 2.39 ns | 1.77× | + +> **Measurement caveat, because these numbers will be quoted.** Not JMH: best-of-5 after 3 warm-up +> rounds, 8 M calls per measurement, one JVM per row, single-threaded, `sin` + `cos` over ±π. The +> **within-row ratios** are the trustworthy part. **Cross-row comparisons between architectures are +> confounded** — the x86-64 rows ran under Rosetta 2 on Apple silicon, so their absolute times are not +> native x86-64 times. Nothing in the verdict depends on a cross-row comparison. + +So the determinism tax is **~1.55× against `Math`** on JDK 21 with `FastStrictTrig`, not the 1.5–3× +that was priced in — and it is **allocation-free**, where `StrictMath.sin` costs ~62 B/op on JDK 21 and +later (a `double[]` carrier that escape analysis does not remove; on 8 through 17 it is native JNI and +allocates nothing, so the figure there is a structural 0). On JDK 11/AArch64 the policy is better than +free: `FastStrictTrig` is 9× faster than `Math` there, because `Math.sin` has no useful intrinsic on +that combination. + +**What this buys the release:** the recorded risk *"MR-JAR × OSGi interaction is fiddly — `Multi-Release: true` +in the bnd instructions, versioned classes excluded from `Export-Package`. Budget for it; test the +bundle"* is **removed, not mitigated.** There is no second class-file version, so there is nothing for +bnd to double-export. One source root, one bytecode level, one artifact. + +### One prerequisite for keeping Java 8, and it is still open + +**`Math.toRadians` is not bit-stable across the Java 8 / 9 boundary.** Java 8 computes +`angdeg / 180.0 * PI`; Java 9 changed it to a multiply by a precomputed constant. Measured over the 721 +whole degrees in [−360, 360]: + +| comparison | Java 8 | Java 11 | Java 21 | +|---|---|---|---| +| `Math.toRadians(d)` vs `d * ProjectionMath.DTR` | **182 of 721 differ (25.2%)** | 0 | 0 | +| `d * DTR` vs PROJ's `PJ_TORAD` (`d * M_PI / 180.0`) | 186 of 721 | 186 | 186 | + +proj4j uses **both** idioms — `ProjectionMath.DTR` on the projection path and `Math.toRadians` in 137 +places across 42 files. On Java 11+ the two agree exactly. **On Java 8 they disagree by 1 ulp on a +quarter of whole-degree inputs.** Most of the 137 sites are exception messages and bound +initialisation, where 1 ulp is harmless, but they have not been individually audited and at least a few +(`RobinsonProjection` lines 99 and 162, inside the inverse; the geodesic package; the grid-shift +operators) are result-bearing. + +**This is a Java-8-only internal inconsistency, and it is cheap to remove: never call +`Math.toRadians`/`Math.toDegrees` in `core/src/main`, use the explicit constant.** Doing so makes the +Java 8 baseline sound and is a smaller change than raising the floor. **It remains a release blocker for +the determinism claim on Java 8, and it is not yet done** — the audit of which of the 137 sites are +result-bearing is outstanding. + +The last-ulp difference from PROJ's own `PJ_TORAD` in the third row is separate, pre-existing, +JDK-independent, and already documented in `gie/GieComparator`. It is not a defect: 1 ulp of a radian +is ~2 pm, eight orders inside the tightest corpus tolerance. + +--- + +## Upgrade guidance + +**To 1.5.0.** Should be a version bump. The new `org.locationtech.proj4j.api` facade is additive, has +zero runtime dependencies, and the legacy types are **not** deprecated. Verified: `EPSG:4267 → 4269` +still transforms through the legacy factory, and `createTransform` output is bit-identical. + +**To 2.0.0**, in order: + +1. **If you use `+nadgrids` or `+datum=NAD27` anywhere near the edge of your grid coverage**, expect + `COORDINATE_OUTSIDE_GRID` where you previously got the input coordinate back. 1,949 golden-master + rows that reported `OK` now raise. Decide whether you need the grid shipped (see the `conus` + placeholder) or whether refusing is the right answer for your data. +2. **If you match on `ErrorCause`**, an unreadable or missing grid is now `MISSING_GRID` + (`Group.OPERATION`), not `INVALID_PARAM_VALUE` (`Group.CRS`). +3. **Find every place you swallow an exception or treat a finite result as success.** The + forward-only-inverse change alone moved 75 rows that had reported `OK`. +4. **If you use `tmerc`, `utm`, or anything derived from them beyond ~10° from the central meridian**, + decide between the corrected default and `+approx`. Measure; do not assume the zone you are in. +5. **If you have stored coordinates computed through an NTv1 grid**, they are wrong by ~13 m. +6. **If you read `.z` off a transform you fed only x and y**, it is now `NaN`. It was never data. +7. **If you use `Ellipsoid.SPHERE`**, check whether you meant the authalic radius. +8. **Leave `AxisOrderPolicy` on `LEGACY`** unless you have a specific reason, and if you change it, test + away from the equator. +9. **If you raw-bit-compare or checksum output**, normalise NaN first. + +## Acknowledgements + +The gie and GIGS conformance corpora are vendored from PROJ 9.8.1 and from the IOGP's Geospatial +Integrity of Geoscience Software project. Licences and notices: `conformance/NOTICE-gie.md`. diff --git a/about.md b/about.md deleted file mode 100644 index fc89089..0000000 --- a/about.md +++ /dev/null @@ -1,17 +0,0 @@ -## About This Content - -February 6, 2017 - -### License - -The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise indicated below, the -Content is provided to you under the terms and conditions of the Apache License, Version 2.0. A copy of the Apache -License, Version 2.0 is available at -[http://www.apache.org/licenses/LICENSE-2.0.txt](http://www.apache.org/licenses/LICENSE-2.0.txt) - -If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another -party ("Redistributor") and different terms and conditions may apply to your use of any object code in the Content. -Check the Redistributor’s license that was provided with the Content. If no such license exists, contact the -Redistributor. Unless otherwise indicated below, the terms and conditions of the Apache License, Version 2.0 still apply -to any source code in the Content and such source code may be obtained at -[http://www.eclipse.org](http://www.eclipse.org). diff --git a/benchmark-ab/RESULTS.md b/benchmark-ab/RESULTS.md new file mode 100644 index 0000000..8fe2ae1 --- /dev/null +++ b/benchmark-ab/RESULTS.md @@ -0,0 +1,184 @@ +# neoProj4J vs. upstream proj4j 1.4.3 — head-to-head JMH results + +Measured 2026-08-04. **Read the caveats before the ratios**: three of these arms run a *different +algorithm* on the two sides, so a larger ns/op there is a change of work, not a regression. + +## What was compared + +| | baseline arm | fork arm | +|---|---|---| +| coordinates | `org.locationtech.proj4j:proj4j{,-epsg}:1.4.3` (Maven Central) | `io.github.emilevictor.neoproj4j:neoproj4j{,-epsg}:1.4.4-develop-SNAPSHOT` | +| jar | `benchmarks-ab-baseline.jar`, 4,360,124 B | `benchmarks-ab-fork.jar`, 5,247,496 B | +| sha256 | `b24d7528cee66bc446a172135fbcdfa9af3f207542c58c93b2beff78190a129b` | `fe423537c7632269fd8a767d6d939abfb8d8cd343f420c1f38d955a899a77372` | +| build | `mvn -Pbench-ab,bench-ab-baseline -pl benchmark-ab package` (no `-am`) | `mvn -Pbench-ab -pl benchmark-ab -am package` | + +Both jars were built **from `mvn clean`**, so `[INFO] Compiling 1 source file` appears in each log: +the single benchmark source really does compile against both libraries, unchanged. Both contain a +generated `META-INF/BenchmarkList` of 2,005 B — JDK 21 was used for both builds, so the JMH +annotation processor ran. + +### Proof the two jars are different builds + +- `org/locationtech/proj4j/pipeline/Pipeline.class`: **present in the fork jar, absent from the + baseline jar.** +- Different sizes and different sha256, above. + +### Proof they enumerate the same arms + +`java -jar -l` and `java -jar -lp` are **byte-identical between the two jars**: the same +3 benchmark methods, each over the same 7-constant `pair` param, i.e. 21 arms on each side. The +comparison script additionally asserts the two JSON result files carry identical `(arm, param)` key +sets before it prints anything. + +### Configuration + +`-f 2 -wi 5 -i 5 -w 1s -r 1s`, plus the class's own `-XX:+UseSerialGC`. JMH 1.37, JDK 21.0.11 +Temurin, macOS 26.6 on an Apple M5 Max (18 cores). **This is a laptop, and the `Error` column is +JMH's 99.9 % confidence half-width** — every claim below is qualified by whether the two intervals +overlap. + +## Per-arm results + +| arm | pair | baseline 1.4.3 ns/op | fork ns/op | ratio fork/base | intervals overlap? | +|---|---|---:|---:|---:|:--| +| `createCrs` | WGS84_TO_WGS84 | 152,724 ± 18,637 | 196.3 ± 3.64 | 0.0013× | fork faster | +| `createCrs` | WGS84_TO_WEBMERCATOR | 2,382,138 ± 287,605 | 565.6 ± 14.38 | 0.00024× | fork faster | +| `createCrs` | WGS84_TO_UTM33N | 10,000,488 ± 6,637,570 | 567.6 ± 9.19 | 0.000057× | fork faster | +| `createCrs` | UTM33N_TO_WEBMERCATOR | 2,151,858 ± 86,067 | 568.5 ± 13.58 | 0.00026× | fork faster | +| `createCrs` | WGS84_TO_OSGB36 | 4,805,471 ± 590,288 | 714.7 ± 23.17 | 0.00015× | fork faster | +| `createCrs` | WGS84_TO_ALBERS_CONUS | 2,674,811 ± 228,189 | 573.1 ± 46.76 | 0.00021× | fork faster | +| `createCrs` | WGS84_TO_GEOCENTRIC | 6,755,528 ± 2,080,277 | 241.7 ± 5.90 | 0.000036× | fork faster | +| `createTransform` | WGS84_TO_WGS84 | 4.40 ± 0.53 | 11.75 ± 0.24 | 2.67× | **fork slower** | +| `createTransform` | WGS84_TO_WEBMERCATOR | 14.96 ± 0.55 | 17.09 ± 0.34 | 1.14× | **fork slower** | +| `createTransform` | WGS84_TO_UTM33N | 4.17 ± 0.15 | 11.89 ± 0.07 | 2.85× | **fork slower** | +| `createTransform` | UTM33N_TO_WEBMERCATOR | 14.97 ± 0.78 | 16.97 ± 0.51 | 1.13× | **fork slower** | +| `createTransform` | WGS84_TO_OSGB36 | 14.61 ± 0.42 | 18.37 ± 0.14 | 1.26× | **fork slower** | +| `createTransform` | WGS84_TO_ALBERS_CONUS | 13.32 ± 1.43 | 23.21 ± 1.57 | 1.74× | **fork slower** | +| `createTransform` | WGS84_TO_GEOCENTRIC | 4.01 ± 0.03 | 11.93 ± 0.18 | 2.97× | **fork slower** | +| `transform` | WGS84_TO_WGS84 | 5.01 ± 0.34 | 7.37 ± 0.26 | 1.47× | **fork slower** | +| `transform` | WGS84_TO_WEBMERCATOR | 34.42 ± 5.54 | 38.53 ± 1.09 | 1.12× | **OVERLAP — no difference shown** | +| `transform` | WGS84_TO_UTM33N | 79.35 ± 4.06 | 48.02 ± 1.39 | 0.61× | fork faster | +| `transform` | UTM33N_TO_WEBMERCATOR | 88.43 ± 3.07 | 77.82 ± 3.34 | 0.88× | fork faster | +| `transform` | WGS84_TO_OSGB36 | 93.56 ± 4.37 | 160.5 ± 9.03 | 1.72× | **fork slower** | +| `transform` | WGS84_TO_ALBERS_CONUS | 27.93 ± 0.75 | 30.98 ± 0.45 | 1.11× | **fork slower** | +| `transform` | WGS84_TO_GEOCENTRIC | 11.57 ± 0.30 | 15.97 ± 0.50 | 1.38× | **fork slower** | + +Exactly **one** of the 21 arms has overlapping intervals (`transform` / `WGS84_TO_WEBMERCATOR`); the +other 20 are separated. That is a property of the arms, not a licence to read every separation as +meaningful — see the size of the effects below. + +## Which arms did different work + +Run on both sides, same seven pairs, same sample points, comparing the transformed output: + +| pair | baseline vs. fork output | +|---|---| +| WGS84_TO_WGS84 | **bit-identical** | +| WGS84_TO_WEBMERCATOR | **bit-identical** | +| WGS84_TO_UTM33N | **bit-identical** | +| UTM33N_TO_WEBMERCATOR | **bit-identical** | +| WGS84_TO_OSGB36 | **differs**: 400096.8276301568 → 400096.83056893136 easting (≈ 2.9 mm), ≈ 0.9 mm northing, ≈ 3 mm height | +| WGS84_TO_ALBERS_CONUS | **differs**: 1774910.113646205 → 1774910.1136462037 northing (2 ulp) | +| WGS84_TO_GEOCENTRIC | **bit-identical** | + +This is the discriminator the ratio table cannot supply on its own. Four of the seven pairs produce +identical doubles on both sides, so on those the fork is doing the *same arithmetic* and any timing +difference is an implementation difference. Two pairs produce different doubles, and both are the +changed-algorithm cases. + +## Summary + +**`createCrs` — the fork is 3 to 4 orders of magnitude faster, and this is the only large effect +here.** 1.4.3's `CRSFactory.createFromName` calls `Proj4FileReader.getParameters` → +`readParametersFromFile`, which does `getResourceAsStream("proj4/nad/epsg")` and `StreamTokenizer`s +the dictionary **from the top, on every single call** (`Proj4FileReader.java:35-55` in the 1.4.3 +sources jar). There is no cache anywhere on that path in 1.4.3 — the `CRSCache` type does not exist +in that release. The cost therefore scales with where the code sits in the 995-entry file, which is +exactly what the baseline column shows: `EPSG:4326` 153 µs, `EPSG:3857` 2.4 ms, `EPSG:27700` 4.8 ms, +`EPSG:4978` 6.8 ms, `EPSG:32633` 10 ms. The fork keeps a parsed dictionary in `InitFileCache` +(`Proj4FileReader.java:120-140`), so a lookup is a map hit plus an array clone, and the residual +196–715 ns is `createFromParameters` re-parsing the proj-string and constructing the `Projection` — +the fork does **not** memoise the finished `CoordinateReferenceSystem` on this path either. +**Caveat on the baseline numbers specifically**: they are I/O- and GC-dominated and their error bars +are correspondingly awful (`WGS84_TO_UTM33N` is ±6.6 ms on a 10 ms score, i.e. ±66 %). The direction +is not in doubt at four orders of magnitude, but do not quote the individual baseline millisecond +figures as precise. + +**`transform` / `WGS84_TO_UTM33N` — the fork is 39 % faster (79.4 → 48.0 ns) on bit-identical +output.** 1.4.3 mapped `+proj=utm` to `ExtendedTransverseMercatorProjection` directly +(`Registry.java:274`); the fork maps both `utm` and `tmerc` to `TransverseMercatorProjection` +(`Registry.java:448,499`), which holds Poder/Engsager as an `exact` delegate. So both sides run the +same kernel — hence the identical doubles — and the fork runs it without 1.4.3's two `new double[1]` +out-params and its non-intrinsified `Math.hypot` calls. This is the cleanest genuine win in the +table: same algorithm, same result, less work. `UTM33N_TO_WEBMERCATOR` (0.88×, also bit-identical) +is the same effect on the inverse. + +### Arms where the fork is slower + +**Changed-algorithm cases — slower is expected, and the output table proves the work differs:** + +- **`transform` / `WGS84_TO_OSGB36`, 1.72× (93.6 → 160.5 ns).** `EPSG:27700` is `+proj=tmerc`. + 1.4.3 registered `tmerc` to the cheap truncated Evenden/Snyder series while reserving the + Poder/Engsager kernel for `etmerc`/`utm`; the fork makes Poder/Engsager the default for `tmerc` + too, matching PROJ 9.8.1. The 2.9 mm easting change is that switch, and the fork's value is the + accurate one (Poder/Engsager is ~1 nm inside 150° of the central meridian, the truncated series is + not). **The largest single slowdown in the table is therefore a correctness change, not a + regression.** Note this arm also carries a 7-parameter Helmert, so the +67 ns is *not* purely the + tmerc switch and these three arms cannot decompose it further; an `etmerc`-vs-`tmerc` arm on the + same datum would be needed to separate the two. +- **`transform` / `WGS84_TO_ALBERS_CONUS`, 1.11× (27.9 → 31.0 ns).** `aea` is in the set where + Karney auxiliary latitudes are now wired in. The 2 ulp northing change is that. A 3 ns cost for + replacing an iterative `authlat` with a series is a small price and the effect size is barely + above the noise floor. + +**Not changed-algorithm cases — these are real per-call overhead the fork added, on identical +arithmetic, and should be treated as regressions:** + +- **`transform` / `WGS84_TO_WGS84`, 1.47× (5.01 → 7.37 ns, +2.4 ns).** This pair is nothing but the + transform envelope — no projection, identity datum. Bit-identical output. The fork has added + roughly 2.4 ns of fixed cost to *every* `transform` call, and because it is a floor it is present + inside every other arm in this table. +- **`transform` / `WGS84_TO_GEOCENTRIC`, 1.38× (11.6 → 16.0 ns, +4.4 ns).** Bit-identical output, + and `geocent` is not in the Karney or Poder/Engsager sets. About 2.4 ns of this is the envelope + above; the remaining ~2 ns is unexplained by anything in this measurement. +- **`transform` / `WGS84_TO_WEBMERCATOR`, 1.12× nominal — but the intervals OVERLAP** + (34.42 ± 5.54 vs 38.53 ± 1.09). No difference is demonstrated on this arm and it must not be + reported as one. The wide baseline error is the tell; a longer run would be needed to say + anything. +- **`createTransform`, all seven pairs, 1.13×–2.97×.** Every pair is separated, so the effect is + real, but the absolute numbers are 4–23 ns against a `createCrs` cost of hundreds of nanoseconds + to milliseconds — this arm is ~2 % of the cost of getting to the point where you can call it, and + the fork's absolute worst case is 23 ns. The largest *ratios* (2.7×–3.0×) are all on pairs where + 1.4.3 scored ~4 ns while its own other pairs scored ~15 ns; that 4-vs-15 split inside a single + library's own results is unexplained and smells of a JIT/escape-analysis artefact, so the 2.9× + ratios in particular should not be quoted without it. + +### What this measurement does not cover + +- **No grid-shifted pair.** `benchmark/`'s `NAD27_TO_NAD83` was deliberately omitted: this module has + no grids dependency because upstream 1.4.3 publishes no `proj4j-grids-us-legacy` to swap to. NADCON + interpolation cost is therefore unmeasured here; `benchmark/`'s Tier 1/Tier 2 gates cover it + fork-side only. +- **No allocation figures**, no bulk-API comparison (`BulkCoordinateTransform` does not exist at + 1.4.3), and nothing else needing fork-only API. Those stay in `benchmark/`. +- **`createCrs` measures a warm process**, one code repeatedly. It does not measure first-call cost, + where the fork must populate `InitFileCache` and 1.4.3 need not. + +## Reproducing + +``` +export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home # JDK 21, not 23+ +mvn -B -ntp -Pbench-ab -pl benchmark-ab clean +mvn -B -ntp -Pbench-ab,bench-ab-baseline -pl benchmark-ab package -DskipTests # no -am +cp benchmark-ab/target/benchmarks-ab-baseline.jar /tmp/ +mvn -B -ntp -Pbench-ab -pl benchmark-ab clean +mvn -B -ntp -Pbench-ab -pl benchmark-ab -am package -DskipTests +java -jar benchmarks-ab-baseline.jar -f 2 -wi 5 -i 5 -w 1s -r 1s -rf json -rff baseline.json +java -jar benchmarks-ab-fork.jar -f 2 -wi 5 -i 5 -w 1s -r 1s -rf json -rff fork.json +``` + +**JDK 21 is not optional.** On JDK 23+ javac silently stops running classpath annotation processors, +JMH emits no `META-INF/BenchmarkList`, and the jar reports zero benchmarks with no other symptom. + +The two `clean`s are not optional either: without them the second build reuses the first's +`target/classes` and you never learn whether the sources compile against the other library. diff --git a/benchmark-ab/pom.xml b/benchmark-ab/pom.xml new file mode 100644 index 0000000..19fc0df --- /dev/null +++ b/benchmark-ab/pom.xml @@ -0,0 +1,185 @@ + + + 4.0.0 + + + io.github.emilevictor.neoproj4j + neoproj4j-modules + 1.3.1-SNAPSHOT + + + neoproj4j-benchmark-ab + jar + neoProj4J A/B benchmark + Head-to-head JMH comparison of this fork against released upstream proj4j 1.4.3. + + + + + true + true + true + true + true + + 1.37 + + + io.github.emilevictor.neoproj4j + neoproj4j + neoproj4j-epsg + ${project.version} + + benchmarks-ab-fork + + + + + ${ab.proj4j.groupId} + ${ab.proj4j.core.artifactId} + ${ab.proj4j.version} + + + + ${ab.proj4j.groupId} + ${ab.proj4j.epsg.artifactId} + ${ab.proj4j.version} + + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + 17 + true + UTF-8 + + -Xlint:-processing + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + + make-ab-benchmarks-jar + package + + shade + + + ${ab.jar.name} + false + + + + org.openjdk.jmh.Main + + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + META-INF/MANIFEST.MF + module-info.class + META-INF/versions/*/module-info.class + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + + + + + bench-ab-baseline + + org.locationtech.proj4j + proj4j + proj4j-epsg + 1.4.3 + benchmarks-ab-baseline + + + + diff --git a/benchmark-ab/src/main/java/org/locationtech/proj4j/benchmark/ab/AbBenchmark.java b/benchmark-ab/src/main/java/org/locationtech/proj4j/benchmark/ab/AbBenchmark.java new file mode 100644 index 0000000..37ac810 --- /dev/null +++ b/benchmark-ab/src/main/java/org/locationtech/proj4j/benchmark/ab/AbBenchmark.java @@ -0,0 +1,219 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.ab; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * The whole of the A/B module. Three arms covering the three things a consumer of proj4j + * actually spends time in, parameterised over seven CRS pairs, using only API that exists in both + * this fork and released {@code org.locationtech.proj4j:proj4j:1.4.3}. + * + *

Everything here is deliberately dull. The interesting benchmarks - allocation profiling, the + * bulk API, grid-shift interpolation - all need fork-only types or a grids artifact that has no + * 1.4.3 counterpart, so they stay in {@code benchmark/}. This class exists so that a number from + * the fork and a number from 1.4.3 are comparable at all, and that requires the same source file to + * compile against both. If a change here stops compiling under {@code -Pbench-ab-baseline}, the + * benchmark is wrong, not the profile. + * + *

Why these seven pairs and not {@code benchmark/}'s eight. They are the same EPSG codes + * as {@code org.locationtech.proj4j.benchmark.CrsPair}, minus {@code NAD27_TO_NAD83}. That pair + * needs a reachable NADCON grid; this module has no grids dependency because there is no + * {@code proj4j-grids-us-legacy} at 1.4.3 to swap to, and with no grid the fork's fail-closed API + * throws rather than quietly returning an unshifted coordinate. An arm that throws on one side of an + * A/B is worse than an absent arm, because JMH reports it as an error with no usable number and the + * two runs stop enumerating the same set. + * + *

Reading the results. The fork changed algorithms, not only implementations: + * {@code tmerc} now defaults to Poder/Engsager rather than the truncated series, and Karney + * auxiliary-latitude machinery is wired into {@code tmerc poly laea cea aea etmerc stere}. The + * {@code UTM33N} and {@code ALBERS_CONUS} arms therefore do different work on the two sides, + * and a larger ns/op there is not on its own a regression. Report per arm; a single blended figure + * over this class would be meaningless. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class AbBenchmark { + + /** + * The seven pairs, as a nested enum so that a bare {@code @Param} expands to all of them and the + * two builds cannot drift into enumerating different arms. + * + *

Codes and sample points are copied verbatim from + * {@code org.locationtech.proj4j.benchmark.CrsPair} so that a figure here can be placed + * alongside a Tier 1/Tier 2 figure from {@code benchmark/} without re-deriving anything. The + * per-pair rationale lives there; only what differs is repeated here. + */ + public enum Pair { + + /** The floor: transform envelope only, no projection and an identity datum shift. */ + WGS84_TO_WGS84("EPSG:4326", "EPSG:4326", 8.5, 47.4, 100.0), + + /** Cheapest real projection - spherical {@code merc}, no datum shift. */ + WGS84_TO_WEBMERCATOR("EPSG:4326", "EPSG:3857", 8.5, 47.4, 100.0), + + /** {@code +proj=utm}. One of the two arms whose algorithm differs between the sides. */ + WGS84_TO_UTM33N("EPSG:4326", "EPSG:32633", 15.0, 47.4, 100.0), + + /** Projected to projected, same datum: inverse then forward, no datum work. Input is metres. */ + UTM33N_TO_WEBMERCATOR("EPSG:32633", "EPSG:3857", 500000.0, 5250000.0, 100.0), + + /** OSGB36 - a real 7-parameter Helmert, so a full geocentric round trip. */ + WGS84_TO_OSGB36("EPSG:4326", "EPSG:27700", -2.0, 52.0, 100.0), + + /** Albers. The other changed-algorithm arm: iterative {@code authlat} vs a Clenshaw series. */ + WGS84_TO_ALBERS_CONUS("EPSG:4326", "EPSG:5070", -96.0, 39.0, 100.0), + + /** {@code +proj=geocent}. */ + WGS84_TO_GEOCENTRIC("EPSG:4326", "EPSG:4978", 8.5, 47.4, 100.0); + + private final String sourceCode; + private final String targetCode; + private final double x; + private final double y; + private final double z; + + Pair(String sourceCode, String targetCode, double x, double y, double z) { + this.sourceCode = sourceCode; + this.targetCode = targetCode; + this.x = x; + this.y = y; + this.z = z; + } + + public String sourceCode() { + return sourceCode; + } + + public String targetCode() { + return targetCode; + } + + public double x() { + return x; + } + + public double y() { + return y; + } + + public double z() { + return z; + } + } + + /** Bare {@code @Param}: JMH expands this to all seven {@link Pair} constants. */ + @Param + public Pair pair; + + /** + * Fresh per trial, not per invocation. {@code CRSFactory} holds a process-wide {@code CRSCache} + * in both versions, so {@link #createCrs} measures a warm cache lookup either way; constructing + * a new factory per call would only add an object allocation on top of the same lookup. + */ + private CRSFactory crsFactory; + private CoordinateTransformFactory transformFactory; + + private CoordinateReferenceSystem source; + private CoordinateReferenceSystem target; + private CoordinateTransform transform; + + private double x; + private double y; + private double z; + + /** Reused across calls, as a consumer reuses one output coordinate per geometry. */ + private ProjCoordinate out; + + @Setup(Level.Trial) + public void setUp() { + crsFactory = new CRSFactory(); + transformFactory = new CoordinateTransformFactory(); + + source = crsFactory.createFromName(pair.sourceCode()); + target = crsFactory.createFromName(pair.targetCode()); + transform = transformFactory.createTransform(source, target); + + x = pair.x(); + y = pair.y(); + z = pair.z(); + out = new ProjCoordinate(); + + // Fail fast here rather than in a measurement iteration: a throwing benchmark reports as a + // JMH error with no usable number, and an exception on the hot path would be measuring + // fillInStackTrace instead of the transform. + transform.transform(new ProjCoordinate(x, y, z), out); + } + + /** + * CRS resolution by EPSG code - what a consumer pays once per distinct code, and the arm most + * sensitive to how the registry is indexed and cached. + * + *

The target code, not the source: five of the seven pairs share {@code EPSG:4326} as + * their source, so measuring that would collapse most of the parameterisation into one number. + */ + @Benchmark + public CoordinateReferenceSystem createCrs() { + return crsFactory.createFromName(pair.targetCode()); + } + + /** + * Transform construction from two already-resolved CRSs: datum comparison, projection wiring, + * and whatever plan the implementation builds up front. Paid once per source/target combination. + */ + @Benchmark + public CoordinateTransform createTransform() { + return transformFactory.createTransform(source, target); + } + + /** + * The hot path. One point through a transform built in {@link #setUp}, in the shape a + * consumer runs it: a fresh input coordinate per vertex, one output coordinate reused for the + * whole geometry. + * + *

The input allocation is deliberate and is not noise to be optimised away - it is the single + * largest allocation on the consumer's per-vertex path, and a version that reused the input + * would measure a shape nobody runs. Returning {@code out} rather than taking a + * {@code Blackhole} keeps the measurement free of the sink's own cost. + */ + @Benchmark + public ProjCoordinate transform() { + ProjCoordinate in = new ProjCoordinate(x, y, z); + return transform.transform(in, out); + } +} diff --git a/benchmark/README.md b/benchmark/README.md new file mode 100644 index 0000000..519445e --- /dev/null +++ b/benchmark/README.md @@ -0,0 +1,799 @@ +# `proj4j-benchmark` — JMH harness and the three-tier regression gate + +**Never published. Not in the root pom's default ``.** It is added only by the `bench` +profile, so `mvn clean install` neither builds this module nor downloads JMH, and `core` stays +dependency-free. + +--- + +## Build and run + +The module targets `17` while `core` targets 8. That is deliberate and is +permitted *precisely because this module is never published* — no downstream consumer can be broken +by its bytecode level, and it is not in the default reactor, so it cannot raise the floor for anyone. +Do not copy that `` into `core`, `epsg` or `geoapi`. + +```bash +export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home +export PATH="$JAVA_HOME/bin:$PATH" + +# From the repository root, once the bench profile is wired into the root pom: +mvn -Pbench -pl benchmark -am package + +# Or, without the profile, build core+epsg into the local repo first and then this module alone: +mvn -Dmaven.install.skip=false -DskipTests -pl core,epsg -am install +mvn -f benchmark/pom.xml package +``` + +Either way the artifact is `benchmark/target/benchmarks.jar` — a shaded uber-jar with +`org.openjdk.jmh.Main` as its `Main-Class`. + +**Always use an isolated local repository when building concurrently with other work.** Parallel +Maven runs in this repository have truncated the `epsg` jar mid-read and produced 34 spurious +repo-wide failures: + +```bash +mvn -B -Dmaven.repo.local=/tmp/m2-bench ... +``` + +A benign jgitver `[ERROR] file doesn't exist: …jar` line appears even on success. Judge by +`BUILD SUCCESS`. + +### Running benchmarks + +```bash +cd benchmark + +# The canonical gate run: live benchmarks only, with the allocation profiler. +./run-gate.sh + +# One class. +java -jar target/benchmarks.jar SinglePointTransformBenchmark -prof gc + +# One CRS pair, all classes that take the pair parameter. +java -jar target/benchmarks.jar -p pair=WGS84_TO_UTM33N + +# List what exists. +java -jar target/benchmarks.jar -l +``` + +`java -jar target/benchmarks.jar -h` is JMH's own help, and it is the reference for every flag. + +--- + +## Live — nothing is staged any more + +**Live today** — 96 benchmark methods across ten classes, all measuring shipped code: + +| class | what it measures | +|---|---| +| `SinglePointTransformBenchmark` | **the regression baseline** — one `transform` in the exact shape the consumer uses (fresh `ProjCoordinate` in, one reused out), over all 8 CRS pairs | +| `EtmercBenchmark` | `etmerc` vs `tmerc`, forward and inverse, across the 3° seam (Δλ = 0 / 1.5 / **3** / 6 / 20) | +| `SolverBenchmark` | head-to-head legacy vs Karney-core for every `numerics.md` row that has both implementations, at 4 latitudes | +| `MathDispatchBenchmark` | `Math` vs `StrictMath` for all 15 relevant functions, plus four `hypot` variants — **see the architecture caveat below** | +| `CrsParseBenchmark` | CRS creation at the init file's first / middle / last entry | +| `TransformCacheBenchmark` | cache hit vs miss, and object-key vs string-pair-key lookup | +| `GridShiftBenchmark` | real NTv1 interpolation, the iterative inverse, and the dispatch-only floor | +| `ConcurrentThroughputBenchmark` | 1/2/4/8/16 threads through **one shared** transform | +| `AllocationBenchmark` | the Tier 1 subject — one method per allocation hot spot | +| `BulkTransformBenchmark` | the bulk API's four shapes, plus a same-fork single-point loop as the control | + +**The `staged` package is gone.** `org.locationtech.proj4j.benchmark.staged` held +`BulkTransformBenchmark`, a hand-written reflective bridge (`StagedApis`) and a copy of the bulk +interface, all so the benchmark could compile before `core` grew +`org.locationtech.proj4j.BulkCoordinateTransform`. `core` has it — `BasicCoordinateTransform` +implements it — so the bridge is deleted, the benchmark is an ordinary member of +`org.locationtech.proj4j.benchmark`, and `run-gate.sh` no longer passes `-e '\.staged\.'`. + +That exclusion was not free while it stood: **the bulk path had no allocation ratchets at all.** +The rule `bulk-zero-allocation` matched nothing, was marked `required: false`, and GateChecker +duly reported `rule matched nothing, and is marked not required (staged benchmark)` on every run +— so the "a bulk method allocates zero bytes per point" contract was enforced by a javadoc +sentence. It is now `required: true`, `ratchetable: false`, pinned hard at 0. + +`BulkTransformBenchmark`'s `loopOfSinglePoint` control lives in this class rather than in +`SinglePointTransformBenchmark` because the claim being tested is a **ratio**, batch ops/s over +loop ops/s, and it is only meaningful when both arms run **in the same JMH fork**, so that machine +speed, turbo state and noisy neighbours cancel. A control measured in a different fork on a +different day answers a different question. + +`VectorApiBenchmark`, which `reference/performance.md` also lists, is **not** here. The Vector API +still requires `--add-modules` at *runtime* and prints a warning, which is unacceptable in a library +shipped into someone else's Spark executor; `performance.md` defers it, and a benchmark for a +deferred, opt-in-artifact-only idea would be the only thing in this module that could not inform a +decision. Add it if and when a separate opt-in artifact is on the table. + +--- + +## What each tier gates, and why timing is not a PR gate + +### Tier 1 — allocation. Blocking on every PR. **This is the primary gate.** + +`-prof gc`'s `gc.alloc.rate.norm` is **bytes per operation**: bytes allocated divided by operations +performed. It is a property of the **bytecode**, not of the machine. The same jar reports the same +number on a laptop, on a shared CI runner, and in a container under memory pressure, because none of +those change how many objects a method constructs. + +**It does not flake — for arms with a fixed object graph, which was 170 of the 181 arms when that was +measured, to within 0.0001 B/op across two independent JVMs.** The eleven that were not are now +fixed-shape too: **all 245 arms are gated as of 2026-08-03, `0 EXCLUDED`.** The two `CrsParseBenchmark` +arms that remain bimodal vary by **exactly 56 bytes and only downward** across 21 forks, and are pinned +at their maximum — which is safe precisely because the gate fails only on *exceeding*. See +[Coverage — what Tier 1 does *not* gate](#coverage--what-tier-1-does-not-gate), which is still the +first thing to read before quoting a Tier 1 pass as evidence about `CrsParseBenchmark`, and which now +documents the closure rather than the exclusion. + +It also catches exactly the regression class that matters here — a reintroduced `new double[1]` +out-param, a `List` iterator on a per-point path, a boxing `Objects.hash` on the cache-lookup path. +Those are invisible to a timing gate at this signal-to-noise ratio and lethal at 100,000 vertices +per geometry. + +The policy targets, from `reference/performance.md`: + +- **every bulk method `== 0`** — non-negotiable and not ratchetable. With a non-null `status` array, + zero allocation per point is how the error taxonomy is delivered at no per-point cost. +- **single-point `<= 40 B/op`** — exactly one `ProjCoordinate` (12-byte header + three doubles, + padded to 40 under compressed oops), which is the caller's, not proj4j's. +- **`GridShiftBenchmark.inverseShift == 0`** — the sharpest target in the library. That path is + measured at *up to 49 allocations per vertex*, i.e. 4.9 M objects for one 100 k-vertex geometry. + +### Coverage — what Tier 1 does *not* gate + +> **THERE ARE NO EXCLUSIONS TODAY. `allocation-baseline.json` contains no rule carrying +> `tier1Gated: false`.** This whole section describes an exclusion that existed from 2026-08-01 to +> 2026-08-02 and was **closed by fixing its subject**, exactly as its own exit condition required. It is +> kept, unabridged, because the arc is the useful part: an exclusion is a **dated loan against a named +> fix**, and this is what repaying one looks like. +> +> **What changed.** `io/InitFileCache` parses each init file once. `createFromName` went +> **39,616 → 2,480** (`EARLY`), **4,002,132 → 2,872** (`MIDDLE`), **7,919,424 → 1,136** (`LATE`) — 16× / +> 1,394× / 6,971× — which puts it *below* `createFromParameters`, the parse-only control. That control +> is **unchanged to the byte** (3,360 / 4,112 / 1,920), which is how we know only the init-file path +> moved. `tier1Gated`, `exclusionArmCount` and `exclusionReason` were deleted together and the nine +> arms were re-pinned from **21 independent forks**. +> +> **Why the arm is gateable now and was not before, measured.** Seven of the nine arms are +> single-valued across all 21 forks. Two — `createFromName` `LATE` and `MIDDLE` — are **bimodal by +> exactly 56 bytes and only downward** (1136 ×19, 1080 ×2). One-sidedness is what makes the 1.1 B slack +> safe, because the gate fails only on exceeding; each arm is pinned at its observed maximum, which is +> also its mode. Shown rejecting: **+56 B rejected** naming the arm, **+1.2 B rejected**. Shown +> accepting: **1080, the real low mode, accepted**. And the coverage restoration as a 2×2 on one frozen +> input — an 8 MB/op regression, i.e. a total reversion of the fix, draws **0 detections against the old +> baseline and 1 against the new**. + +**[HISTORICAL] Nothing ratchets `CrsParseBenchmark`'s allocation. A regression in `createFromName`, +`createFromParameters` or `readEpsgFromParameters` is REPORTED, NOT BLOCKED.** All nine of its arms +(3 methods × 3 positions) carry `tier1Gated: false` in `allocation-baseline.json`. **This is a real +reduction in coverage**, and it is written here, in the rule's own `exclusionReason`, and in the +gate's output on every run — including passing ones — precisely so that it cannot be mistaken for a +gate that still gates. + +**Why.** The measured claim underneath Tier 1 is that `gc.alloc.rate.norm` does not flake. It flakes +here, and the honest negative control showed **2 breaches out of 181** on an unmodified tree because +of it. The full profile does not help (spread **0.162 % quick vs 0.175 % full**, three runs each), +which strengthens the `--quick` decision rather than weakening it. + +**The width of the exclusion is measured, not assumed.** Diffing two 181-arm runs of the *unmodified* +tree arm by arm, **exactly 2 arms exceed the gate's allowance of `max(0.5 B, 0.1 %)`, and both are +`CrsParseBenchmark`:** + +| arm | run A | run B | allowance | verdict | +|---|---:|---:|---:|---| +| `CrsParseBenchmark.readEpsgFromParameters[LATE]` | 216697.484 | 212818.292 | 216.7 | **breach, −1.837 %** | +| `CrsParseBenchmark.createFromName[EARLY]` | 39680.073 | 39632.073 | 39.7 | **breach, −0.121 %** | +| `TransformCacheBenchmark.crsCacheMissEquivalent` | 204936.745 | 204888.741 | 204.9 | inside, 0.0234 % | +| `GridShiftBenchmark.noGridHit` | 1440.003 | 1440.003 | 1.4 | bit-exact | +| every other arm | | | | inside | + +Two corrections to the note this decision was written from, both of which matter: + +- **"11 of 181 arms flake" conflates two sets.** Eleven arms allocate **more than 1 KB/op** — the 9 + `CrsParseBenchmark` arms plus `crsCacheMissEquivalent` and `noGridHit`. The two non-`CrsParse` ones + do **not** flake (0.0234 % and exactly 0), so **kilobyte-scale allocation is not by itself the + predictor**; re-scanning a file per call is. Those two stay gated, and should. +- **The drift is larger than the 0.121 % on record**: `readEpsgFromParameters[LATE]` moved + **−1.837 %**, fifteen times that. Downward, so it never breached — but any per-arm slack wide + enough to absorb it would have had to be ~2 %, i.e. **~4 KB of headroom on that arm**, which is a + further argument against the slack option. + +The exclusion is **three arms broader than strictly necessary**: `createFromParameters[EARLY|MIDDLE| +LATE]` (3360 / 4112 / 1920 B/op) read **bit-identical across all three runs** and have never flaked. +They are excluded because the exclusion is per rule and the rule is per class. Narrowing `match` to +the two flaking methods would recover them — and would then need `exclusionArmCount` dropped to 6. + +**The justification is what the arm measures, not that it is inconvenient.** Its 200× +`EARLY`→`LATE` spread — **39 KB → 4.0 MB → 7.9 MB** — *is* `Proj4FileReader`'s per-call re-scan of +the 888 KB init file. That is the finding, not a regression signal. Tier 1's premise is a **fixed +object graph**; an arm whose subject is data-dependent allocation never satisfied it. + +**Rejected alternatives**, recorded so this is not relitigated: + +| option | verdict | +|---|---| +| a **per-arm slack** | works, but introduces a second tolerance concept whose only user is the arm that misbehaves | +| **accept 2 standing breaches** | **worst.** A gate with known permanent failures *"gets muted, then ignored, then deleted — historically within about a month"* — this file's own words about Tier 3 | +| **exclude, report, and fix the defect** | chosen | + +**The correct long-term fix is to make the arm gateable, not to gate it loosely.** Parse each init +file once into a `Map`; allocation then becomes small and fixed-shape, the spread +vanishes, and **the arm rejoins Tier 1 on its own terms** — delete `tier1Gated`, +`exclusionArmCount` and the `exclusionReason` at that point. **The exclusion is a concession to a +defect, not a judgement that the arm is unimportant.** + +> **↑ THAT PARAGRAPH IS THE EXIT CONDITION, AND IT WAS MET ON 2026-08-02.** `io/InitFileCache` does +> exactly what it describes, the three fields were deleted together, and the arms are gated again. The +> `Locale.ROOT` subtlety it does not mention, and which nearly made the cache return the wrong CRS: the +> **authority** is folded with `Locale.ROOT` while the **code inside the file** is matched with +> case-sensitive `String.equals`, so the cache is two levels and nothing flatter. Folding the code makes +> `world:PALESTINE` start resolving. Both mutations were run — folding the code fails 3 tests naming +> `world:CH1903` and `world:india-I…IVB`; not folding the authority fails 11 with +> `Unable to access CRS file: proj4/nad/EPSG`, a hard failure rather than a wrong CRS. + +**What is *not* given up:** + +- `required` stays `true` — a renamed or deleted `CrsParseBenchmark` still **fails** the gate. +- `--record` still ratchets all nine arms, and every run prints each one with its observed value, + the recorded reference, and the delta in bytes and per cent. +- **`exclusionArmCount: 9` is pinned by hand.** If the `match` pattern ever covers a different number + of arms, the gate **fails** with `EXCLUSION SCOPE CHANGED`. An exclusion that over-matches is + exactly how a gate quietly stops working, so its blast radius is a checked number, not a comment. +- Exclusion is per **rule**, not per measurement: an arm matched by an excluded rule *and* by a gated + rule is still gated by the gated one. + +`GateChecker` **exits 2** if a rule sets `tier1Gated: false` without both an `exclusionReason` and an +`exclusionArmCount`. + +### The one thing Tier 1 is structurally incapable of catching: a reintroduced `pow` + +`StrictMath.pow` is **96 B/op interpreted and 0 B/op JIT-warm** — C2 folds the constant array +elements. **Escape analysis is not the mechanism**: with EA disabled, `sin` correctly goes 32 → 72 +B/op while `pow` stays at 0. So `MathDispatchBenchmark.strictPow`'s ratchet of 0 is a correct reading +of a blind instrument, and **widening it would not help** — there is no byte count to widen towards. + +**The instrument that does catch a reintroduced `pow` is Tier 2's `pow` counter, pinned at `0` across +all 8 CRS pairs in `op-counts.json.`** It counts call sites reached, as an integer, so no JIT +transformation can fold it away. If a review proposes relaxing the Tier 1 `pow` arm, the answer is +that Tier 2 already owns that regression. + +### Tier 2 — deterministic operation counts. Blocking on every PR. + +A test-only `CountingMath` / `CountingStrictMath` facade tallies +`sin cos tan pow exp log atan atan2 sqrt hypot` (plus `asin acos log10 sinh cosh log1p cbrt expm1 +tanh`, which are equally deterministic and free to count) for **one** transform per CRS pair, and +the result is compared exactly against `src/main/resources/baseline/op-counts.json`. + +Two runs on two architectures produce identical numbers, or one of them has a bug. So it is safe to +block on, it catches *algorithmic* regressions precisely — a Newton loop that gained a trip, a +closed form that reverted to an iteration, a `pow` reintroduced where an `exp` was — and, unlike a +timing, **it explains them**. "`pow` went from 0 to 5" names the cause; "12% slower" names nothing. + +**The facade is reached without a single line of instrumentation in `core`.** +`CountingClassLoader` rewrites the string `"java/lang/Math"` in the constant pool of every +`org.locationtech.proj4j` class it loads. That is the entire transformation: no constant-pool entry +is added or removed, so every `CONSTANT_Class_info`, `CONSTANT_Methodref_info` and `invokestatic` +index is untouched. A facade that lived in `core` would put a counter increment on the hot path of a +published library, which is the kind of thing the rest of `performance.md` exists to prevent. See +`counting/CountingClassLoader.java` for the format details and the one documented false-positive +case. + +Verified working on this tree: **152 core classes instrumented, 101 `Math`/`StrictMath` references +redirected**. The recorder *refuses to return a result* if either count is zero — a rewrite that +silently did nothing would make Tier 2 pass forever while measuring nothing, and that is the only +failure mode of this design that would be dangerous rather than merely loud. + +**Where timing is used at all**, the candidate and a fixed reference run in the **same JMH fork** and +the gate is on the **ratio**, so machine speed cancels. That is why `SolverBenchmark` keeps its +`legacy*` arms next to its `karney*` arms and why `BulkTransformBenchmark` keeps +`loopOfSinglePoint`. Suggested bound: ±15%, 3 forks, Student-t on JMH's reported `scoreError`. + +### Tier 3 — absolute ns/op. Nightly, dedicated runner. **NEVER a PR gate.** + +JMH on shared CI runners varies **±20–40%**. No CPU pinning, no turbo control, noisy neighbours, and +a scheduler that will migrate a fork mid-iteration. **A gate with a 20–40% false-positive rate gets +muted, then ignored, then deleted — historically within about a month — and its absence is then +invisible.** That is a worse outcome than having no timing gate at all, because the team believes it +has one. + +So timing lives on a nightly job on a dedicated self-hosted runner: pinned CPU, turbo disabled, +`performance` governor. It **alerts** (it does not fail a PR) and only on a **>10% regression +sustained across three consecutive nights**, which filters single-night noise. + +`GateChecker` deliberately implements Tiers 1 and 2 only. If you find yourself adding an ns/op +assertion to it, that is the decision this section exists to prevent you from relitigating by +accident. + +--- + +## The `MathDispatchBenchmark` caveat — read this before quoting any number from it + +**`MathDispatchBenchmark` must be run on both x86-64 and AArch64 to be meaningful.** + +The entire `StrictMath` question is about **cross-architecture divergence**. HotSpot ships +`@IntrinsicCandidate` implementations of `sin cos tan log log10 exp pow` on both architectures, and +they differ from each other and from fdlibm. That divergence is the reason +`reference/numerics.md` mandates `StrictMath` for those seven despite a 1.5–3× cost, and it is the +reason the cost is worth paying: the consumer requires **bit-for-bit determinism across executors +and JVMs**, and a Spark cluster is not guaranteed homogeneous. + +A single-architecture run tells you the *local* tax and says **nothing** about the thing the policy +is for. A result from one architecture presented as "the cost of `StrictMath`" is a **wrong answer**, +not an incomplete one. + +### A measured finding this benchmark already produced + +**On Temurin 21.0.11, `StrictMath.sin`, `StrictMath.cos` and `StrictMath.tan` each allocate +32 B/op — one `double[2]`.** `Math.sin` allocates nothing (it is an intrinsic). + +**JDK 21's** pure-Java `FdLibm` rewrite allocates the argument-reduction scratch array inside +`FdLibm.Sin/Cos/Tan.compute`, and escape analysis does not eliminate it. *(This said **JDK 17** and it +is wrong: `StrictMath.sin/cos/tan` are still `native` JNI calls into compiled fdlibm on 17 — +`Modifier.isNative` is true on Corretto **and** Temurin 17.0.20, and `java.lang.FdLibm$Sin` is absent +from a JDK 17 image entirely, 5 `FdLibm` nested classes on 17 against 23 on 21. The boundary is +**per-function**: on 17 `log` is also still native while `pow`/`exp` are already pure Java. Getting +this wrong nearly shipped an MR-JAR that would have pushed JDK 17 onto the slow path — see +`reference/performance.md`, "The Java baseline".)* Confirmed independently of JMH via +`ThreadMXBean.getThreadAllocatedBytes` over 5×10⁶ calls: + +| call | B/op | +|---|---| +| `Math.sin` | 0.00 | +| `StrictMath.sin` | 32.41 | +| `StrictMath.cos` | 32.00 | +| `StrictMath.tan` | 32.00 | +| `StrictMath.exp` / `log` / `atan` / `asin` / `log1p` / `sinh` / `hypot` / `pow` | 0.00 | + +**This bears directly on `reference/numerics.md` row 13.** That row prices the `StrictMath` policy as +"−1.5–3× on the 7 intrinsics" — a *time* cost. It does not mention allocation, and the allocation is +arguably the larger problem for this consumer: a UTM transform makes roughly four `sin` and four +`cos` calls per point, so ~256 B/point, i.e. **~25 MB of garbage for one 100,000-vertex geometry**, +inside a Spark executor. Time cost is linear and predictable; garbage at that rate is young-GC +pressure across every task on the executor. + +It does not invalidate row 13 — determinism is still a hard requirement — but it changes the +mitigation. `numerics.md`'s sine/cosine-*preserving* APIs (`MeridianArc.mlfn(phi, sphi, cphi)`, +`ConformalLat.tsfnSinCos`, `AuthalicLat.forward(phi, sinphi, cosphi)`, `Clenshaw6.convert(zeta, s, c)`) +go from a micro-optimisation to the primary defence, because each avoided `sin`/`cos` now saves 32 B +as well as 100-odd ns. `exp`/`log`/`pow` are unaffected, so the policy is only expensive for three of +the seven. + +The `math-dispatch-strictmath` rule pins this at a ratchet of 64 (the `strictSinCos` arm calls two of +them) with a target of 0, so a JDK that fixes `FdLibm`'s scratch array tightens it automatically +rather than the finding being quietly forgotten. + +Two secondary points from the same file: + +- The `asin acos atan atan2 sinh cosh log1p` arms should measure as **equal** to their `Math` + counterparts, because `Math` already delegates to `StrictMath` for them. They are benchmarked + anyway so that the day HotSpot gains an intrinsic for one of them shows up as a measurement rather + than as a stale claim in a document. +- `hypot`: the policy says use **neither**. Four arms (`mathHypot`, `strictHypot`, + `sqrtOfSumOfSquares`, `mathHelpersNorm2`) plus `mathSqrt` as the denominator, so the "10–30× a + `sqrt`" claim is measured rather than asserted. + +--- + +## Running the gate + +```bash +cd benchmark + +# Full run + both blocking tiers. This is what CI does. +./run-gate.sh --quick --require-baseline + +# Reduced-iteration run. Legitimate for Tier 1, NOT for timing. +./run-gate.sh --quick + +# Tier 2 alone — no JMH run needed, takes about a second. Good as a pre-commit hook. +./run-gate.sh --tier2-only + +# Exercise the harness's own plumbing (JSON round trip, bytecode rewrite). +./run-gate.sh --self-test + +# Retry only the shards that did not complete; reuse the ones that did. +./run-gate.sh --quick --resume + +# Extra JMH arguments go after a literal `--`. +./run-gate.sh --quick -- -bm avgt +``` + +Exit codes: **0** pass, **1** breach, **2** usage or I/O error. A breach prints the offending +benchmark, the before and after figures, the delta, the policy target, and the `why` recorded on the +rule. + +`--require-baseline` turns "this baseline entry is `TBD`" from a warning into a failure. **CI passes +it**, now that the baselines are real. + +### An unknown option is a hard error + +`run-gate.sh` used to append anything it did not recognise to the **JMH** command line rather than +to `GateChecker`'s. Seven `GateChecker` options were silently swallowed that way — `--skip-tier1`, +`--skip-tier2`, `--alloc-baseline`, `--op-counts`, `--baseline-dir`, `--commit`, `--self-test` — and +`--record --tier2-only` took a branch that dropped the forwarded options entirely, so +`--require-baseline` was ignored on that path specifically. Every option now has an explicit case +and anything else exits 2. Extra JMH arguments must come after a literal `--`. + +### Sharding, and the two ways a JMH run loses its results + +`run-gate.sh` runs **one JMH invocation per benchmark class**, each writing its own +`target/jmh-.json`, then concatenates the arrays into `target/jmh-result.json`. This is not +an optimisation. Both of the following were measured on JMH 1.37, not assumed: + +| failure | what JMH does | what you see | +|---|---|---| +| the JMH **parent** dies (OOM killer, CI cancellation, a tool timeout, `^C`) | the `-rff` file was **truncated at startup** and is only written at the end | a **zero-byte** result file, and `set -euo pipefail` kills the script before `GateChecker` runs | +| a **forked VM** dies (SIGKILL, JVM crash, OOM in the fork) | prints ``, **continues**, writes a well-formed file, **exits 0** | *nothing.* The dead benchmark is simply absent | + +The second is the dangerous one, and `-foe` does not help — it governs whether a benchmark +*exception* is fatal, not whether the forked VM died. So every shard's record count is checked +against JMH's own `-lp` arm enumeration (**245 arms across 10 classes** as of 2026-08-03; the run +prints `==> 10 shards, one JMH invocation per benchmark class, 245 arms expected`). A shard that comes +back short is reported, `--record` is refused, and `--resume` re-runs only the shards that are missing. +Demonstrated by SIGKILLing a forked VM mid-run: `!!! shard GridShiftBenchmark FAILED: exit 0, 3/4 +arms`, the other shards intact, and `--resume` re-running that one class alone. + +### The gate reads the baseline from **inside the jar** + +`GateChecker` falls back to the classpath resource `/baseline/*.json` — the copy in +`benchmarks.jar`. `--record` writes to `src/main/resources/baseline/`. **After a `--record` those +two disagree until the module is rebuilt.** This is not hypothetical: the first negative control for +the 2026-08-01 capture recorded a full baseline, re-ran the gate immediately, and got 298 +"baseline is `TBD`" failures — sixteen minutes of measurement checked against the pre-capture copy +still sitting in the jar, with output that looked like a legitimate result. CI never sees it, +because there the jar is built from source in the same job. + +`run-gate.sh` now **exits 2** if either baseline source file is newer than the jar, and tells you to +rebuild or to pass `--alloc-baseline` / `--op-counts` explicitly. + +--- + +## Baseline state — read this first + +**CAPTURED 2026-08-01. Both baseline files are real; nothing in them was fabricated.** + +| | | +|---|---| +| machine | Apple **M5 Max**, 18 cores, 64 GiB, macOS 26.6 | +| JDK | Temurin **21.0.11+10-LTS**, `aarch64` | +| tree | `7362c85` **plus 265 modified tracked files and an untracked `benchmark/`**; `core/src`+`benchmark/src` sha256 `5f38f507d407b992` | +| profile | `./run-gate.sh --quick --record` (`-f 1 -wi 2 -i 3 -w 1s -r 1s`), 181 arms, 15 min 49 s | +| result | **162 per-benchmark ratchets** — 153 enforced, **9 reported-only** (`CrsParseBenchmark`, see Coverage) — 22 rule ceilings, **8 CRS pairs × 19 ops all pinned** | + +**RE-CAPTURED SINCE, AND THE ROW ABOVE IS THE 2026-08-01 CAPTURE, KEPT FOR THE PROVENANCE ARGUMENT +BELOW.** `allocation-baseline.json`'s own `capturedAt` now reads +`8f0fbd81bf53f95bd3c824a18a65f673c7ae2635+uncommitted`, `2026-08-02T16:21:38Z`, JDK 21.0.11+10-LTS / +aarch64 / Mac OS X, and the file holds **25 rules and 171 per-benchmark ratchets, all enforced, none +reported-only**; `op-counts.json` holds **8 pairs × 20 leaves = 160**, no `TBD`. Verified independently +in the container on 2026-08-03: `0 breaches; 245 gated, 0 EXCLUDED; 245 arms`, 21 m 23 s. + +**One provenance caveat, and it is the same class of defect this table exists to prevent.** +`GateChecker.gitCommit()` is a bare `git rev-parse HEAD` and does **not** mark a dirty tree. The +`+uncommitted` suffix above was **hand-added**; `op-counts.json` and any future `--record` will stamp a +clean-looking sha over a dirty tree. Until that is fixed, read `capturedAt.commit` as "at least this +sha", never as "this tree". + +The `capturedAt.commit` field deliberately does **not** read as a bare sha. `HEAD` does not contain +this module at all, so a bare `7362c85` would say the baseline came from a tree that cannot produce +it. The recorded string names the sha, the dirty count and a content hash of the sources. + +**How portable are these numbers?** `gc.alloc.rate.norm` is bytes per operation, a property of the +bytecode — and that is now measured rather than asserted. Two independent 16-minute runs, separate +JVMs: **170 of the 181 arms agreed to within 0.0001 B/op**. The exception is real and is recorded +below. The Tier 2 counts are integers from a deterministic single transform and should be identical +on any JVM; if they are not, *that* is the finding (see the file's own `_doc`). Absolute ns/op is +**not** stored in either file and is not gated, deliberately — see `GateChecker`'s javadoc. + +> **[2026-08-01 → 2026-08-02] The one place `gc.alloc.rate.norm` did flake, measured — RESOLVED first +> by an exclusion, then by removing its cause. The exclusion no longer exists; everything below is the +> record of it, and the mutation controls at the end are still the model to copy.** +> +> The 11 `CrsParseBenchmark` arms that allocate more than 1 KB/op drift run to run +> by up to **0.121 %** — `createFromName[EARLY]` read 39632.073 then 39680.073 B/op. +> `GateChecker.ALLOC_RELATIVE_SLACK` is **0.001** (0.1 %), so two of those arms failed the gate on an +> *unmodified* tree. Every arm at or below 1 KB/op was exact. +> +> `ALLOC_RELATIVE_SLACK` is **unchanged at 0.001**; widening a tolerance would have weakened all 181 +> arms to accommodate 9. Instead the `crs-parse` rule carries `tier1Gated: false`: its nine arms are +> measured, recorded and reported on every run but **no longer block**. +> +> **The before/after is on identical input, and that detail is load-bearing.** Re-running the +> benchmarks and getting a green gate proves nothing here — a fresh 16-minute negative control after +> the change did read 0 breaches, but so does the *pre-change* configuration against that same fresh +> data, because those arms happened to land within slack that run. The controlled comparison holds +> the measurement fixed: +> +> | JMH result file | pre-change config | with the exclusion | +> |---|---|---| +> | run of 2026-08-01 11:12 | **2 breaches** | **0** | +> | fresh negative control | 0 | 0 | +> +> Read +> [Coverage — what Tier 1 does *not* gate](#coverage--what-tier-1-does-not-gate) for the cost, which +> is that `createFromName`'s allocation is now ungated. + +The baseline numbers themselves were **not re-captured** for that change — the edit is policy +metadata only, and re-recording would have discarded a measurement whose portability is established +in order to reproduce it. `capturedAt.amendment` in `allocation-baseline.json` says so, and +disappears on the next real `--record`. + +The rule *structure* was already load-bearing before capture, and still is — a `required` rule that +matches no benchmark **fails**, so a renamed or accidentally-excluded benchmark cannot silently +un-gate itself. + +

The pre-capture note, kept for the register + +> Both baseline files are checked in with explicit `TBD` markers. No numbers have been fabricated. +> Six streams are concurrently rewriting proj4j's hot paths, so any number captured now would be +> attributed to the wrong commit and would be stale within hours. A fabricated number is +> indistinguishable from a measured one in review, which is exactly the failure these files exist to +> prevent. Until they are populated the gate **warns** on every `TBD` and **passes**. + +
+ +### The two-column design in `allocation-baseline.json` + +Each rule carries two numbers, and the difference is the point: + +- `targetBytesPerOp` — the **policy**. What `reference/performance.md` says the number should be once + the work has landed. **Never edit this to make a build green.** +- `maxBytesPerOp` — the **ratchet**. What the number actually is today. The gate fails on exceeding + *this*. It may only ever go down. + +Asserting the target outright today would leave `master` permanently red, and a permanently red gate +is a disabled gate. The ratchet gives a monotone approach to the target with no window in which a +regression slips through, and the gap between the two columns is a legible, reviewable to-do list. +When an observation comes in comfortably below the ratchet, the gate says so and tells you to tighten +it. + +Three flags modify a rule: + +- **`ratchetable: false`** marks a rule as *normative rather than empirical*, and `--record` will not + widen it. Used for the bulk contract (zero allocation per point is the contract, not an + observation) and for the `Math`-intrinsic canary (a nonzero reading there means the *measurement* + is broken, so widening it would hide a broken harness). +- **`required`** defaults to `true`: a rule that matches no benchmark **fails**. This is what stops a + renamed or accidentally-excluded benchmark from silently un-gating itself, which is the way + long-lived gates usually die. +- **`tier1Gated: false`** makes a rule **reported but not blocking**, and it is **a reduction in + coverage** — see [Coverage — what Tier 1 does *not* gate](#coverage--what-tier-1-does-not-gate). + It requires `exclusionReason` (prose in this file, not in a commit message) and + `exclusionArmCount` (the pinned blast radius); `GateChecker` exits 2 without them, and fails the + gate if the arm count moves. **There are no users today** — `crs-parse` was the only one and it + rejoined Tier 1 on 2026-08-02 when `io/InitFileCache` removed its subject. The mechanism is intact + and its self-tests are green; the *user* was removed, not the feature. The bar for a second one is + *"the arm's subject is data-dependent allocation, so it never satisfied Tier 1's + fixed-object-graph premise"* — not *"the arm is inconvenient"* — and it must carry its own exit + condition, as `crs-parse` did. + +### Per-benchmark ratchets + +The `ratchets` block at the end of the file holds ceilings keyed by +`SimpleClass.method[param=value]`, and it takes **precedence** over the matching rule's +`maxBytesPerOp`. + +Both exist because a rule's single number spans every arm it matches, and some rules legitimately +cover arms two orders of magnitude apart. `CrsParseBenchmark.createFromName` **used to measure +39 KB/op at `EARLY`, 4.0 MB at `MIDDLE` and 7.9 MB at `LATE`** — a ~200× ramp, which was not noise +but the whole finding: `Proj4FileReader` re-tokenised the 888 KB init file linearly on every call, so +allocation was proportional to the code's position in it. A single rule ceiling set by `LATE` would +leave `EARLY` completely ungated at 1/200th of the limit. Per-key ratchets gate every arm at its own +figure while the rule keeps the policy, the `why` and the class-level cap. + +**Those three numbers are now 2,480 / 2,872 / 1,136 B/op** (`io/InitFileCache`, 2026-08-02) and the +ramp is gone — but **the design argument is not retired with it**, because the ratchets are still +per-arm and the arms still differ: `createFromParameters` runs 3,360 / 4,112 / 1,920 while +`createFromName` runs 2,480 / 2,872 / 1,136, and one ceiling over both would leave the smaller ones +loose by a factor of three. + +`--record` does not write per-key entries for `ratchetable: false` rules, because a per-key entry +would override a normative ceiling. + +**It does still write them for `tier1Gated: false` rules** — which today is none. When `crs-parse` +carried the flag, the per-key number was the *reference the drift was reported against*, not a +ceiling anything failed on. The gate prints, per arm and per run, +` B/op recorded , delta +x.x (+y.yyy%)`, whether the rule is gated or not. + +--- + +## Adding a benchmark + +1. **Put it in `org.locationtech.proj4j.benchmark`.** There is no longer a staging package: the + one class that needed it now measures a real interface, and the exclusion that hid it also hid + it from the gate. If you need a benchmark for an API that does not exist yet, land the API + first — an excluded benchmark is an ungated one, and `bulk-zero-allocation` spent its whole + staged life reporting `matched nothing`. Never invent an API in a benchmark and never leave the + module uncompilable. + +2. **Copy the annotation block** from an existing class: + `@BenchmarkMode`, `@OutputTimeUnit`, `@State(Scope.Benchmark)`, + `@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"})`, `@Warmup(5, 1s)`, `@Measurement(5, 1s)`. + The serial collector is not an optimisation — it makes `gc.alloc.rate.norm` bit-stable run to run, + which is what a blocking gate needs. + +3. **Parameterise over CRS pairs with a bare `@Param public CrsPair pair;`.** JMH expands that to all + eight constants. Do not hard-code EPSG codes: a new pair should extend every parameterised + benchmark and the Tier 2 baseline with one edit to `CrsPair`. + +4. **Return the result; do not take a `Blackhole`** unless you genuinely produce more than one value. + JMH treats a returned reference as consumed, and a `Blackhole` adds its own small, + version-dependent cost to numbers that Tier 1 compares against a checked-in byte count. + +5. **Never allocate in the measured method unless the shape being measured allocates.** If it does, + say so in the javadoc and add a rule for it. `SinglePointTransformBenchmark.transform` is the + worked example: it allocates on purpose because that is the consumer's shape, and its rule targets + 40 rather than 0 for exactly that reason. + +6. **Add a rule to `allocation-baseline.json`** with an `id`, a `match` regex, a + `targetBytesPerOp`, `maxBytesPerOp: "TBD"`, and a `why` explaining *which specific regression* + the rule is a tripwire for. A rule without a `why` is a rule nobody will dare delete when it stops + being relevant. `match` is applied to `SimpleClassName.method[param=value,...]` and to the fully + qualified name. + + Keep a rule's arms **comparable**, or rely on per-key ratchets to do the gating. One rule over + arms that differ by 200× has a ceiling that only constrains the worst arm; the per-key ratchets + cover that, but the rule's `maxBytesPerOp` then means very little and its `why` should say so. + +7. **Refresh the ratchet** on a quiet tree, and say in the commit message what changed and why. + +8. If the benchmark inspects an intended-but-absent API, **name the blocking work in the javadoc**, + not just in a commit message. + +### Adding a counted operation + +Add the constant to `OpCounters.Op` (at the end, so baseline diffs stay readable), then add the +delegating method to **both** `CountingMath` and `CountingStrictMath`. The two facades exist +separately so that a `StrictMath` call site keeps `StrictMath`'s exact result: delegating a +`StrictMath.log1p` to `Math.log1p` can differ by an ulp, and an ulp inside one of core's fixed-point +iterations changes the **trip count** — which is the thing Tier 2 measures. + +If someone adds a call to a `java.lang.Math` method that the facades do not declare, the Tier 2 run +fails with a `NoSuchMethodError` naming it. That is loud, it only happens in the gate, never in +production, and the fix is one delegating method. + +--- + +## Refreshing a baseline + +```bash +cd benchmark +mvn -f pom.xml package # or the -Pbench form from the root + +# Full run with the allocation profiler. +java -jar target/benchmarks.jar -prof gc -rf json -rff /tmp/jmh.json + +# Rewrite BOTH baselines from this run, stamping the commit, date, JDK and architecture. +java -cp target/benchmarks.jar \ + org.locationtech.proj4j.benchmark.gate.GateChecker --record /tmp/jmh.json + +# Tier 2 only (fast; no JMH run needed). +java -cp target/benchmarks.jar \ + org.locationtech.proj4j.benchmark.gate.GateChecker --record --skip-tier1 +``` + +`--record` writes to `src/main/resources/baseline/` by default; use `--baseline-dir` to point +elsewhere. It fills `capturedAt` from `git rev-parse HEAD` and the running JVM, so a refreshed +baseline always says which tree and which architecture it came from — without that, a differing +number cannot be told apart from a different starting point. + +**Refresh on a quiet tree, not mid-churn**, and review the diff. Both files are pretty-printed one +entry per line specifically so that the diff is readable: a Tier 2 refresh should be a small number +of changed integers, and if it is not, something larger happened than the commit claims. + +**A falling op count is the expected, correct outcome** of a `reference/numerics.md` rewrite — +closed forms replacing Newton loops. Say so in the commit message. **A rising count is an extra +iteration, a reintroduced `pow`, or a lost fast path**, and it is not noise: there is no noise in +this measurement. + +--- + +## CI wiring + +> **DONE, 2026-08-01. The job exists: `.github/workflows/bench.yaml`.** Until then this module's pom +> called Tiers 1 and 2 *"blocking PR gates"* while **no job anywhere invoked `GateChecker`** — the +> statement was accurate about intent and false about fact. +> +> **Three differences from the snippet below, each deliberate:** +> +> 1. **`./run-gate.sh --quick --require-baseline`, not two hand-written `java` invocations.** The +> `-prof gc` and `-rf json` are both load-bearing — *"WITHOUT +> `-prof gc` TIER 1 SILENTLY CHECKS NOTHING"* — and duplicating them in YAML is how they drift +> apart. The script is the single definition. +> 2. **`--require-baseline` is on. Before the capture that made the job red on 176 unpinned +> thresholds** — 24 in `allocation-baseline.json` (22 `maxBytesPerOp` + 2 `targetBytesPerOp`) and +> 152 in `op-counts.json`, which the gate reported as **298 breaches** because a single TBD rule +> ceiling covers many arms. (The figure previously quoted here, *"187 = 29 + 158"*, counted raw +> `TBD` strings including the two `capturedAt` blocks and two lines of prose.) Without the flag +> every one of them warns and passes: a green job over 176 unpinned thresholds measures nothing +> and reports success, which is the failure this workflow was added to end. **Captured +> 2026-08-01; all 176 are now real.** +> 3. **A non-vacuity step.** If `-prof gc` fails to attach, or the `-e` exclusion matches too much, +> Tier 1 examines zero measurements and has nothing to complain about. The job asserts at least +> 20 arms in `jmh-result.json` and at least 20 carrying `gc.alloc.rate.norm`. +> +> `run-gate.sh` also gained an explicit `--require-baseline` case, and since 2026-08-01 an unknown +> option is a **hard error** rather than a pass-through to JMH — see "An unknown option is a hard +> error" above for the seven options that were silently swallowed. +> +> **Proof the Tier 1 comparison can reject**, run on Temurin 21 against the committed +> `allocation-baseline.json`: a fixture with `62.4 B/op` injected into `MathDispatchBenchmark.math` +> — the shape of swapping a `FastStrictTrig` call back to `StrictMath` — produced +> `ALLOCATION REGRESSION … delta +62.4 B/op` naming the benchmark and the rule +> (`math-dispatch-intrinsic-zero-allocation`, the normative 0 that `--record` may not widen), while +> the otherwise-identical clean fixture reported `0.000 B/op, at target (0)`. +> +> **Superseded by a whole-library control, 2026-08-01, now that the baseline is real.** With +> `Clenshaw6.convert`'s `FastStrictTrig.sin/cos` swapped to `StrictMath.sin/cos` in a `/tmp` rsync +> copy — a one-line change to a real call site, not an injected fixture — **both tiers fire +> independently** against the recorded baseline. Re-run after the `crs-parse` exclusion landed: +> +> - **25 allocation regressions**, and **every single delta is exactly `+64.0 B/op`** — one +> `StrictMath.sin` plus one `StrictMath.cos`, 32 B each, on `EtmercBenchmark` (10 forward arms), +> `ConcurrentThroughputBenchmark` (all 5), `SinglePointTransformBenchmark` (UTM33N and OSGB36, +> both `transform` and `transformReusedInput`), `SolverBenchmark` (`karneyInvMlfn` and +> `karneyAuthalicInverse` at 70° and 89.9°) and two `AllocationBenchmark` arms. +> `transform[pair=WGS84_TO_UTM33N]` reads **40 → 104.000**, reproducing this repository's stale +> `104` figure exactly, as an artefact of the very allocation that was removed. +> - **4 op-count changes**, `sin` and `cos` each `+1` per transform on `WGS84_TO_UTM33N` (2 → 3) and +> `WGS84_TO_OSGB36` (4 → 5). Tier 2 needs no JMH run and would have caught this alone. +> - **And the coverage loss shows up in the same run, which is the point of still printing it.** The +> nine excluded `CrsParseBenchmark` arms moved by **+72 to +120 B/op** — a real regression of the +> same +64 shape — and were **reported, not blocked**. Before the exclusion those would have been +> breaches. That is the cost, visible in the gate's own output rather than inferred. +> +> The claim that only two Tier 1 rules could reject anything was true of the all-`TBD` state and is +> no longer true: **171 enforced per-benchmark ratchets are live** (153 when this was written, before +> the bulk arms rejoined and `crs-parse` was re-gated). Nothing is reported-only any more, so the +> "coverage loss shows up in the same run" bullet above describes a state that no longer exists — +> those nine arms would now be **breaches**, which is what it said should eventually happen. +> +> **Exclusion-specific controls**, because an exclusion that over-matches is how a gate quietly stops +> working. Against the negative-control result file, one arm's `gc.alloc.rate.norm` mutated at a time: +> +> | injected | expected | got | +> |---|---|---| +> | `AllocationBenchmark.webMercatorForward` 0 → 999 | reject | **exit 1**, names the arm | +> | `SinglePointTransformBenchmark.transform[WGS84_TO_UTM33N]` 40 → 104 | reject | **exit 1** | +> | `TransformCacheBenchmark.crsCacheMissEquivalent` 204937 → +0.5 % (a 200 KB arm) | reject | **exit 1** — size is not what is excluded | +> | `CrsParseBenchmark.createFromName[EARLY]` 39632 → 999999 | pass, reported | **exit 0**, printed as `delta +960367.0 (+2423.211%)` | +> | `crs-parse`'s `match` widened to cover `AllocationBenchmark` too | reject | **exit 1**, `EXCLUSION SCOPE CHANGED … declared 9, matched 17` — *and* the injected `webMercatorForward` regression still rejected by its own rule, so two independent defences | +> | `tier1Gated: false` with `exclusionReason` removed | usage error | **exit 2** | +> | `tier1Gated: false` with `exclusionArmCount` removed | usage error | **exit 2** | + +The original snippet, kept for the record: + +```yaml + performance-gate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: { distribution: temurin, java-version: '21' } + - name: Build + run: mvn -B -Pbench -pl benchmark -am -DskipTests package + # Tier 2 alone: about a second, no JMH run. Cheap enough to run on every push. + - name: Tier 2 - operation counts + run: | + java -cp benchmark/target/benchmarks.jar \ + org.locationtech.proj4j.benchmark.gate.GateChecker --skip-tier1 + # Tier 1 needs a real JMH run. Reduced iteration counts are fine: gc.alloc.rate.norm is a + # property of the bytecode, so it converges almost immediately. Do NOT reduce iterations for + # a Tier 3 timing run - that is what makes timing runs unreliable in the first place. + - name: Tier 1 - allocation + run: | + java -jar benchmark/target/benchmarks.jar \ + -f 1 -wi 2 -i 3 -w 1s -r 1s -prof gc -rf json -rff jmh-result.json + java -cp benchmark/target/benchmarks.jar \ + org.locationtech.proj4j.benchmark.gate.GateChecker jmh-result.json --skip-tier2 +``` + +Tier 3 is a separate scheduled workflow on a self-hosted runner and must not be attached to +`pull_request`. The `MathDispatchBenchmark` caveat means the nightly matrix should include an +**AArch64** leg as well as x86-64 — that is also the only leg that *proves* the `StrictMath` claim +rather than asserting it. + +--- + +## Root pom wiring + +This module is added by a profile, never to the default ``. The exact snippet is in this +module's git history and in the task report; it consists of a `benchmark` inside a +`bench` profile's ``. diff --git a/benchmark/pom.xml b/benchmark/pom.xml new file mode 100644 index 0000000..46cb1c6 --- /dev/null +++ b/benchmark/pom.xml @@ -0,0 +1,201 @@ + + + 4.0.0 + + + io.github.emilevictor.neoproj4j + neoproj4j-modules + 1.3.1-SNAPSHOT + + + neoproj4j-benchmark + jar + neoProj4J JMH Benchmarks and Regression Gate + + JMH benchmark harness and the three-tier performance regression gate. + + This module is NOT PUBLISHED and is NOT in the root pom's default <modules> list. It is + activated only by `-Pbench`, so a plain `mvn clean install` neither builds it nor downloads + JMH. That is deliberate: `core` must remain dependency-free, and JMH lives only here. + + Tier 1 (allocation bytes/op) and Tier 2 (deterministic transcendental-call counts) are + blocking PR gates and are implemented by + org.locationtech.proj4j.benchmark.gate.GateChecker. Tier 3 (absolute ns/op) is nightly-only + and deliberately NOT a PR gate - see README.md for the reasoning. + + + + + true + true + true + true + true + + 1.37 + benchmarks + + + + + io.github.emilevictor.neoproj4j + neoproj4j + ${project.version} + + + + io.github.emilevictor.neoproj4j + neoproj4j-epsg + ${project.version} + + + + io.github.emilevictor.neoproj4j + neoproj4j-grids-us-legacy + ${project.version} + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + 17 + true + UTF-8 + + + -Xlint:-processing + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + + make-benchmarks-jar + package + + shade + + + ${shade.outputFile} + + false + + + + org.openjdk.jmh.Main + + + + + + + + *:* + + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + META-INF/MANIFEST.MF + + module-info.class + META-INF/versions/*/module-info.class + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + diff --git a/benchmark/run-gate.sh b/benchmark/run-gate.sh new file mode 100755 index 0000000..8ce2ccb --- /dev/null +++ b/benchmark/run-gate.sh @@ -0,0 +1,344 @@ +#!/usr/bin/env bash +# +# The canonical gate invocation: run the live benchmarks with the allocation profiler, then check +# Tiers 1 and 2. Exit 0 = pass, 1 = breach, 2 = usage or I/O error. +# +# The exclusion, the profiler and the JSON format are all load-bearing, which is why this exists as a +# script rather than as three lines in a README that drift apart: +# +# -prof gc produces gc.alloc.rate.norm. WITHOUT IT TIER 1 SILENTLY CHECKS NOTHING - the +# gate warns per benchmark, but a warning is not a failure. +# -rf json the only format GateChecker reads. +# +# THE `-e '\.staged\.'` EXCLUSION IS GONE, AND ITS ABSENCE IS LOAD-BEARING. It excluded +# BulkTransformBenchmark, whose @Setup used to throw because org.locationtech.proj4j +# .BulkCoordinateTransform did not exist. It does now, the benchmark is an ordinary member of +# ...benchmark, and the staged package has been deleted. While the exclusion stood, THE BULK PATH - +# the API the consumer is being pointed at for per-row work - HAD NO ALLOCATION RATCHETS AT ALL, and +# its "zero bytes per point" contract was a sentence in a javadoc. Do not reintroduce an -e that +# matches a benchmark class: an excluded benchmark is an ungated one, and GateChecker can only +# report it if the rule is `required`. +# +# Usage: +# ./run-gate.sh full run, both tiers +# ./run-gate.sh --quick reduced iterations; fine for Tier 1, NOT for timing +# ./run-gate.sh --tier2-only no JMH run at all; about a second +# ./run-gate.sh --record refresh the baselines from this run +# ./run-gate.sh --require-baseline a TBD baseline entry is a FAILURE, not a warning +# ./run-gate.sh --resume reuse shard result files that already look complete +# ./run-gate.sh --no-shard one monolithic JMH invocation (the old, fragile behaviour) +# ./run-gate.sh -- append anything else to the JMH invocation +# +# GateChecker options are forwarded explicitly: --skip-tier1, --skip-tier2, --require-baseline, +# --alloc-baseline

, --op-counts

, --baseline-dir

, --commit , --self-test. +# +# EVERY OPTION NEEDS AN EXPLICIT CASE BELOW, AND AN UNKNOWN ONE IS A HARD ERROR. This script used to +# append anything it did not recognise to the JMH command line, which meant `--require-baseline`, +# `--skip-tier1`, `--skip-tier2`, `--alloc-baseline`, `--op-counts`, `--baseline-dir`, `--commit` and +# `--self-test` were all handed to JMH instead of to GateChecker. JMH rejects them, so the gate never +# ran at all - or, worse, they were silently dropped and the gate ran WEAKER than the caller asked +# for. CI passes --require-baseline, because an unpinned threshold that silently warns is exactly the +# shape of gate this repository is trying to stop shipping - see allocation-baseline.json's own note: +# "Pass --require-baseline to turn those warnings into failures once the baseline is real - that is +# the flag CI should use after capture." An instrument that cannot fail is worthless; an instrument +# that silently discards the flag that makes it strict is worse, because it reports success. +# +# TIER 1 GATES EVERYTHING IT MEASURES TODAY, AND THE OUTPUT SAYS SO EITHER WAY. +# +# As of 2026-08-02 NO rule in allocation-baseline.json carries `tier1Gated: false`, and a run prints +# "245 gated, 0 EXCLUDED". The exclusion machinery is intact and self-tested; it simply has no user. +# +# THE HISTORY, BECAUSE THE SHAPE OF IT IS THE REUSABLE PART. The `crs-parse` rule carried +# `tier1Gated: false` from 2026-08-01, so nine CrsParseBenchmark arms were measured, recorded and +# printed but DID NOT BLOCK - a real reduction in coverage, stated in the gate's own output on every +# run (section "Tier 1 coverage exclusions", plus a suffix on the GATE PASSED / GATE FAILED line), in +# the rule's `exclusionReason`, and in README.md under "Coverage - what Tier 1 does not gate". +# Reason: those arms flaked by up to 0.121% against a 0.001 slack because their subject WAS +# data-dependent allocation - the 200x EARLY->LATE spread was Proj4FileReader's per-call re-scan, +# i.e. the finding - so they never satisfied Tier 1's fixed-object-graph premise. +# +# The exclusion was written with its own exit condition: "fix the re-scan and the arms rejoin Tier 1 +# on their own terms." io/InitFileCache did exactly that on 2026-08-02, createFromName fell to +# 2480/2872/1136 B/op, and tier1Gated + exclusionArmCount + exclusionReason were deleted together in +# the same change. AN EXCLUSION IS A DATED LOAN AGAINST A NAMED FIX, NOT A TOLERANCE. If a second one +# is ever added, give it a repayment clause too. +# +# SHARDING BY BENCHMARK CLASS, AND WHY IT IS NOT AN OPTIMISATION. +# +# JMH TRUNCATES the -rff file AT STARTUP and writes its content ONLY AT THE END. Both halves were +# measured on JMH 1.37, not assumed, and they give TWO DISTINCT failure modes that a single -rff +# conflates: +# +# (1) The JMH PARENT process dies - OOM killer, a CI job cancellation, an agent's tool timeout, +# ^C. The file it truncated at startup is all that is left: ZERO BYTES. `set -euo pipefail` +# then kills this script before GateChecker ever runs. Ninety minutes of measurement, no +# measurement. This is exactly the artefact the previous capture attempt left behind. +# +# (2) A FORKED VM dies - SIGKILL, a JVM crash, an OOM inside the fork. This one does NOT zero the +# file, and it is the more dangerous of the two: JMH prints +# ``, CONTINUES with the next benchmark, writes a +# perfectly well-formed result file, AND EXITS 0. The dead benchmark is simply gone. No +# non-zero exit, no empty file, no warning. `-foe` does not help - it governs whether a +# benchmark EXCEPTION is fatal and says nothing about the forked VM dying. +# +# So: one JMH invocation per benchmark class, each with its own -rff, concatenated at the end +# (GateChecker reads a plain array, so the merge is a concat). That bounds (1) to a single class, +# with the completed shards still on disk and --resume re-running only what is missing. And because +# (2) is silent, every shard's record count is checked against JMH's own `-lp` arm enumeration - see +# compute_shard_expectations below. Correctness is unaffected by the split: JMH already runs each +# benchmark in its own forked VM, so splitting the invocation changes nothing a measurement can +# observe. +# +set -euo pipefail + +cd "$(dirname "$0")" + +JAR=target/benchmarks.jar +RESULT=${GATE_JMH_RESULT:-target/jmh-result.json} +GATE_MAIN=org.locationtech.proj4j.benchmark.gate.GateChecker + +QUICK=0 +TIER2_ONLY=0 +RECORD=0 +RESUME=0 +SHARD=1 +SELF_TEST=0 +GATE_OPTS=() +EXTRA=() + +die() { + echo "run-gate.sh: $*" >&2 + exit 2 +} + +need_value() { + # $1 = option name, $2 = remaining arg count + [[ $2 -ge 2 ]] || die "$1 needs a value" +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --quick) QUICK=1; shift ;; + --tier2-only) TIER2_ONLY=1; shift ;; + --record) RECORD=1; shift ;; + --resume) RESUME=1; shift ;; + --no-shard) SHARD=0; shift ;; + # ---- forwarded verbatim to GateChecker ------------------------------------------------- + --require-baseline|--skip-tier1|--skip-tier2) + GATE_OPTS+=("$1"); shift ;; + --alloc-baseline|--op-counts|--baseline-dir|--commit) + need_value "$1" $#; GATE_OPTS+=("$1" "$2"); shift 2 ;; + --self-test) SELF_TEST=1; shift ;; + # 3,33 is the header block down to the "--self-test." line. Deleting the staged exclusion + # lengthened that block; the range has to follow it or --help silently truncates. + -h|--help) sed -n '3,33p' "$0" | sed 's/^#\{1,\} \{0,1\}//'; exit 0 ;; + --) shift; EXTRA=("$@"); break ;; + *) die "unknown option '$1'. + Extra JMH arguments must come after a literal --, e.g. ./run-gate.sh --quick -- -bm avgt. + GateChecker options need an explicit case in this script; silently forwarding them to JMH + (or silently dropping them) is how a gate stops gating." ;; + esac +done + +if [[ ! -f "$JAR" ]]; then + echo "run-gate.sh: $JAR not found. Build it first:" >&2 + echo " mvn -B -Dmaven.repo.local=/tmp/m2-bench -f pom.xml package" >&2 + echo "or, from the repository root, with the bench profile:" >&2 + echo " mvn -B -Pbench -pl benchmark -am package" >&2 + exit 2 +fi + +if [[ $SELF_TEST -eq 1 ]]; then + exec java -cp "$JAR" "$GATE_MAIN" --self-test +fi + +# THE GATE READS THE BASELINE FROM INSIDE THE JAR, NOT FROM src/main/resources. +# GateChecker.readText falls back to the classpath resource /baseline/*.json, which is the copy +# maven-resources-plugin put in benchmarks.jar at build time. `--record` writes to +# src/main/resources/baseline/. Those are two different files, and after a --record they disagree +# until the module is rebuilt. +# +# This is not hypothetical: the first attempt at the negative control for this capture recorded a +# full baseline, immediately re-ran the gate, and got 298 "baseline is TBD" failures - the gate had +# silently read the pre-capture TBD copy still sitting in the jar. Sixteen minutes of measurement +# checked against the wrong file, and the output looked like a legitimate result. In CI the two +# always agree because the jar is built from source in the same job, so this can only ever bite +# locally, which is exactly where it is hardest to notice. +# +# Hard error rather than a warning: a gate that reports a verdict against a baseline it did not +# read is worse than no gate. Passing --alloc-baseline / --op-counts explicitly is the escape hatch, +# because then the on-disk file IS what gets read. +if [[ $RECORD -eq 0 ]]; then + baseline_override=0 + for o in ${GATE_OPTS+"${GATE_OPTS[@]}"}; do + case "$o" in --alloc-baseline|--op-counts) baseline_override=1 ;; esac + done + if [[ $baseline_override -eq 0 ]]; then + for src in src/main/resources/baseline/allocation-baseline.json \ + src/main/resources/baseline/op-counts.json; do + if [[ -f "$src" && "$src" -nt "$JAR" ]]; then + die "$src is newer than $JAR. + The gate reads the baseline COMPILED INTO the jar, so this run would check against a stale copy + and report a verdict you did not ask for. Rebuild first: + mvn -B -Pbench -pl benchmark -am -DskipTests package + or point the gate at the files on disk explicitly: + ./run-gate.sh --alloc-baseline $src --op-counts src/main/resources/baseline/op-counts.json" + fi + done + fi +fi + +if [[ $TIER2_ONLY -eq 1 ]]; then + if [[ $RECORD -eq 1 ]]; then + # --record used to take this branch WITHOUT ${GATE_OPTS[@]}, so `--record --tier2-only + # --baseline-dir /tmp/x` silently wrote to the default directory. Forward them here too. + exec java -cp "$JAR" "$GATE_MAIN" --record --skip-tier1 ${GATE_OPTS+"${GATE_OPTS[@]}"} + fi + exec java -cp "$JAR" "$GATE_MAIN" --skip-tier1 ${GATE_OPTS+"${GATE_OPTS[@]}"} +fi + +JMH_ARGS=(-prof gc -rf json) +if [[ $QUICK -eq 1 ]]; then + # Reduced iterations are legitimate for Tier 1 because gc.alloc.rate.norm is a property of the + # bytecode and converges almost immediately. They are NOT legitimate for a Tier 3 timing run; + # short runs are a large part of why timing on shared hardware is unreliable. + JMH_ARGS+=(-f 1 -wi 2 -i 3 -w 1s -r 1s) +fi +if [[ ${#EXTRA[@]} -gt 0 ]]; then + JMH_ARGS+=("${EXTRA[@]}") +fi + +# Emits the inner body of a JSON array file, outer brackets removed, so several can be concatenated. +strip_brackets() { + awk '{ buf = buf $0 "\n" } + END { sub(/^[ \t\r\n]*\[/, "", buf); sub(/\][ \t\r\n]*$/, "", buf); printf "%s", buf }' "$1" +} + +# Expected benchmark-arm count per class, from JMH's own `-lp` listing: one line per @Benchmark +# method, followed by one line per @Param naming its values, so the arm count for a method is the +# product of its parameters' cardinalities. +# +# THIS IS NOT BELT-AND-BRACES, IT IS THE ONLY THING THAT SEES THE FAILURE. Measured, not assumed: +# SIGKILL a JMH forked VM mid-run and JMH 1.37 prints ``, +# CARRIES ON, writes its -rff file at the end, AND EXITS 0. The dead benchmark is simply absent from +# the results. Nothing downstream notices: an exit-code check passes, a "file is non-empty" check +# passes, and GateChecker's own `rule matched no benchmark` guard only fires when an ENTIRE CLASS is +# missing - it iterates the measurements it was given, so one vanished arm is silently ungated. The +# demonstration run lost GridShiftBenchmark.forwardShift exactly this way: 3 records where 4 were +# expected, exit 0, no warning anywhere. So a shard is complete only when its record count MATCHES. +SHARD_EXPECT=target/.shard-arm-counts + +compute_shard_expectations() { + java -jar "$JAR" -lp 2>/dev/null | awk ' + function flush() { if (cls != "") counts[cls] += n } + /^org\./ { flush(); line = $0; sub(/\.[^.]*$/, "", line); cls = line; n = 1; next } + /param .*=/ { s = $0; sub(/^[^{]*\{/, "", s); sub(/\}.*$/, "", s); n *= split(s, a, ","); next } + END { flush(); for (c in counts) print c "\t" counts[c] } + ' | sort > "$SHARD_EXPECT" + [[ -s "$SHARD_EXPECT" ]] || die "could not enumerate benchmark arms with '$JAR -lp'." +} + +expected_arms() { + awk -F'\t' -v c="$1" '$1 == c { print $2 }' "$SHARD_EXPECT" +} + +records_in() { + [[ -s "$1" ]] || { echo 0; return; } + grep -c '"benchmark"' "$1" || true +} + +# $1 = shard result file, $2 = fully qualified benchmark class. +shard_complete() { + local want + want=$(expected_arms "$2") + [[ -n "$want" ]] || return 1 + [[ "$(records_in "$1")" == "$want" ]] +} + +if [[ $SHARD -eq 0 ]]; then + echo "==> java -jar $JAR ${JMH_ARGS[*]} -rff $RESULT (unsharded: a fork death loses everything)" + java -jar "$JAR" "${JMH_ARGS[@]}" -rff "$RESULT" +else + # No `mapfile`: macOS ships bash 3.2 and this script has to run there as well as on CI. + CLASSES=() + while IFS= read -r line; do + [[ -n "$line" ]] && CLASSES+=("$line") + done < <(java -jar "$JAR" -l | tail -n +2 | sed 's/\.[^.]*$//' | sort -u) + [[ ${#CLASSES[@]} -gt 0 ]] || die "no benchmarks listed by '$JAR -l'. Is the jar built?" + + compute_shard_expectations + TOTAL_ARMS=$(awk -F'\t' '{s += $2} END {print s + 0}' "$SHARD_EXPECT") + echo "==> ${#CLASSES[@]} shards, one JMH invocation per benchmark class, $TOTAL_ARMS arms expected" + + SHARD_FILES=() + FAILED_SHARDS=() + SKIPPED_SHARDS=() + i=0 + for fqcn in "${CLASSES[@]}"; do + i=$((i + 1)) + simple=${fqcn##*.} + out="target/jmh-${simple}.json" + SHARD_FILES+=("$out") + want=$(expected_arms "$fqcn") + if [[ $RESUME -eq 1 ]] && shard_complete "$out" "$fqcn"; then + echo "--> [$i/${#CLASSES[@]}] $simple: reusing $out, $want/$want arms (--resume)" + SKIPPED_SHARDS+=("$simple") + continue + fi + rm -f "$out" + selector="^$(printf '%s' "$fqcn" | sed 's/\./\\./g')\\." + echo "--> [$i/${#CLASSES[@]}] $simple -> $out ($want arms)" + set +e + java -jar "$JAR" "${JMH_ARGS[@]}" -rff "$out" "$selector" + rc=$? + set -e + if [[ $rc -ne 0 ]] || ! shard_complete "$out" "$fqcn"; then + echo "!!! shard $simple FAILED: exit $rc, $(records_in "$out")/$want arms in $out" >&2 + echo " Continuing; the other shards are unaffected - that is the point of sharding." >&2 + FAILED_SHARDS+=("$simple") + fi + done + + : > "$RESULT" + { + printf '[\n' + first=1 + for f in "${SHARD_FILES[@]}"; do + # Stream each shard straight through; do NOT capture it in a shell variable. macOS ships + # bash 3.2, whose ${var//pattern/} is quadratic - running it over one 331 KB shard hung the + # merge for over five minutes with no output at all. + # + # A shard that failed its arm-count check is still merged if it holds anything, so the gate + # sees every measurement that DID survive; the failure is reported separately and blocks + # --record. Dropping it here would turn a partial loss into a whole-class loss. + [[ -s "$f" ]] || continue + grep -q '"benchmark"' "$f" || continue + [[ $first -eq 1 ]] || printf ',\n' + first=0 + strip_brackets "$f" + done + printf '\n]\n' + } > "$RESULT" + echo "==> merged $(records_in "$RESULT")/$TOTAL_ARMS benchmark records into $RESULT" + + if [[ ${#FAILED_SHARDS[@]} -gt 0 ]]; then + echo >&2 + echo "run-gate.sh: ${#FAILED_SHARDS[@]} incomplete shard(s): ${FAILED_SHARDS[*]}" >&2 + echo " Re-run with --resume to retry only those; the completed shards are on disk and will" >&2 + echo " be reused, so the cost of the failure is one class, not the whole run." >&2 + if [[ $RECORD -eq 1 ]]; then + # Recording from a partial run would write a baseline with arms silently missing, and an + # absent ratchet reads as "not measured yet" rather than as "the run was broken". That is + # precisely how a fabricated-looking baseline gets committed. Refuse. + die "refusing to --record from a partial run. Re-run with --resume until every shard is complete." + fi + echo " The gate will now run against what DID survive. A wholly missing class fails as" >&2 + echo " 'rule matched no benchmark'; a missing ARM would otherwise be invisible, which is why" >&2 + echo " the arm-count check above exists." >&2 + fi +fi + +if [[ $RECORD -eq 1 ]]; then + exec java -cp "$JAR" "$GATE_MAIN" --record "$RESULT" ${GATE_OPTS+"${GATE_OPTS[@]}"} +fi +exec java -cp "$JAR" "$GATE_MAIN" "$RESULT" ${GATE_OPTS+"${GATE_OPTS[@]}"} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/AllocationBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/AllocationBenchmark.java new file mode 100644 index 0000000..c770e93 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/AllocationBenchmark.java @@ -0,0 +1,230 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.ProjCoordinate; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * The Tier 1 subject. One method per known or historical allocation hot spot, each with a + * pinned {@code gc.alloc.rate.norm} entry in {@code baseline/allocation-baseline.json}. + * + *

These methods exist to be gated, not to be fast. Their ns/op numbers are close to + * meaningless in isolation - what matters is that {@code -prof gc} reports a byte count that is a + * property of the bytecode and therefore does not flake on a shared CI runner. Each method names + * the specific regression it is a tripwire for; if a method here stops corresponding to a real + * hazard, delete it rather than leaving a baseline entry that nothing can violate. + * + *

Every method reuses its output coordinate, so a nonzero reading is proj4j's allocation and + * not the caller's. That is the opposite convention to {@link SinglePointTransformBenchmark}, which + * deliberately includes the caller's {@code ProjCoordinate}; the two together separate the two + * sources. + * + *

Run with a serial collector. {@code gc.alloc.rate.norm} is derived from thread + * allocation counters and is collector-independent, but TLAB sizing under a concurrent collector + * adds sampling jitter to the profiler's own bookkeeping. {@code -XX:+UseSerialGC} in + * {@code jvmArgsAppend} makes the number bit-stable run to run, which is what a blocking gate + * needs. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 1, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class AllocationBenchmark { + + private CoordinateTransform identity; + private CoordinateTransform webMercator; + private CoordinateTransform utm33n; + private CoordinateTransform utmToWebMercator; + private CoordinateTransform geocentric; + private CoordinateTransform osgb36; + private CoordinateTransform nadGridShift; + + private CoordinateReferenceSystem wgs84; + private CoordinateReferenceSystem utm33nCrs; + + private ProjCoordinate in; + private ProjCoordinate inUtm; + private ProjCoordinate inNad; + private ProjCoordinate out; + + @Setup(Level.Trial) + public void setUp() { + identity = CrsPair.WGS84_TO_WGS84.createTransform(); + webMercator = CrsPair.WGS84_TO_WEBMERCATOR.createTransform(); + utm33n = CrsPair.WGS84_TO_UTM33N.createTransform(); + utmToWebMercator = CrsPair.UTM33N_TO_WEBMERCATOR.createTransform(); + geocentric = CrsPair.WGS84_TO_GEOCENTRIC.createTransform(); + osgb36 = CrsPair.WGS84_TO_OSGB36.createTransform(); + nadGridShift = CrsPair.NAD27_TO_NAD83.createTransform(); + + CRSFactory crsFactory = new CRSFactory(); + wgs84 = crsFactory.createFromName("EPSG:4326"); + utm33nCrs = crsFactory.createFromName("EPSG:32633"); + + in = new ProjCoordinate(15.0, 47.4, 100.0); + inUtm = new ProjCoordinate(500000.0, 5250000.0, 100.0); + // gridShiftDispatch needs the NAD27 pair's own sample point. Sharing `in` fed 15E 47.4N - + // Austria - into a NAD27 -> NAD83 grid shift, which its javadoc never claimed and which no + // North American grid covers. It was silently a no-op until the fail-closed API turned it + // into "grid shift: (14.999999999999998, 47.4) is outside every grid of + // [conus, alaska, ntv1_can.dat]" and killed the arm. + inNad = new ProjCoordinate( + CrsPair.NAD27_TO_NAD83.x(), CrsPair.NAD27_TO_NAD83.y(), CrsPair.NAD27_TO_NAD83.z()); + out = new ProjCoordinate(); + } + + /** + * The envelope. Target 0 B/op: {@code BasicCoordinateTransform.transform} on an identity pair + * writes into {@code tgt} and touches nothing else. + * + *

A nonzero reading here means the envelope itself started allocating - a lambda + * capture, an autoboxed key, a stream. That is the cheapest possible regression to fix and the + * most expensive to notice any other way. + */ + @Benchmark + public ProjCoordinate identityEnvelope() { + return identity.transform(in, out); + } + + /** Cheapest real projection. Target 0 B/op. */ + @Benchmark + public ProjCoordinate webMercatorForward() { + return webMercator.transform(in, out); + } + + /** + * The etmerc scratch-array tripwire. Target reached: the ratchet is 0 B/op. + * + *

Two things this javadoc used to say are no longer true, and both are recorded because a + * tripwire whose stated subject has moved is a tripwire nobody re-reads. It read: + * "Tripwire for {@code ExtendedTransverseMercatorProjection}'s two {@code new double[1]} + * out-params per {@code project} and per {@code projectInverse} ({@code :114-115}, + * {@code :157-158}). Target 0 B/op once those become fields or locals; the ratchet records + * whatever it is today." + * + *

    + *
  1. The {@code double[1]} out-params are gone. What is left is one + * {@code final double[2] dC} per direction ({@code :262}, {@code :314}), which C2 scalar + * replaces — this arm and + * {@code SinglePointTransformBenchmark.transformReusedInput[WGS84_TO_UTM33N]} both ratchet + * at 0. + *
  2. This arm no longer names its class correctly. The fixture is + * {@code EPSG:32633} = {@code +proj=utm +zone=33}, and {@code Registry:499} binds + * {@code utm} to {@code TransverseMercatorProjection}, not to the extended class. etmerc + * still runs — {@code TransverseMercatorProjection} holds an + * {@code ExtendedTransverseMercatorProjection exact} ({@code :137}) and defaults to + * {@code Algorithm.PODER_ENGSAGER} ({@code :140}) — but through a delegate. A + * regression that moved {@code utm} onto {@code +approx} would change what this arm + * measures without changing its name. + *
+ * + *

Kept as a tripwire, not deleted: 0 is the contract now, and a reintroduced per-call array + * on either side of the delegation shows up here first. + */ + @Benchmark + public ProjCoordinate utmOutParamArrays() { + return utm33n.transform(in, out); + } + + /** + * The geocentric-converter tripwire. Target reached: the ratchet is 0 B/op. + * + *

This javadoc used to read "Tripwire for {@code GeocentProjection.java:10,17}, which + * constructs a new {@code GeocentricConverter} per call. Target 0 B/op once the + * converter is hoisted to a final field." It is fixed, and not in the way the note + * proposed — a plain {@code final} field would have been wrong, because + * {@code Projection.setEllipsoid} can change the ellipsoid after construction. What landed is + * {@code private volatile Cached cached} keyed on the ellipsoid + * ({@code GeocentProjection.java:145-165}), where {@code Cached} is immutable and the write is + * idempotent: two threads may each build an equivalent converter and one wins, and neither can + * observe a partially built one. It is the single remaining self-field write anywhere on the + * projection hot path. + */ + @Benchmark + public ProjCoordinate geocentricConverterPerCall() { + return geocentric.transform(in, out); + } + + /** + * The 7-parameter Helmert path, which round-trips through {@code cart} forward and inverse. + * Target 0 B/op. This is also where a reintroduced intermediate coordinate object would show + * up, because the datum step is the one place the envelope legitimately needs scratch space. + */ + @Benchmark + public ProjCoordinate helmertCartRoundTrip() { + return osgb36.transform(in, out); + } + + /** + * Tripwire for the {@code Grid.shift} iterator. {@code Grid.java:89} does + * {@code for (Grid g : grids)} over a {@code List} field, and escape analysis will not reliably + * remove that iterator allocation - {@code reference/performance.md} calls for a {@code Grid[]}. + * Target 0 B/op. + * + *

This runs the {@link CrsPair#NAD27_TO_NAD83} sample point, 96W 39N, which is inside CTABLE + * V2 {@code conus}, so it covers the iterator and the interpolation. It used to be + * documented as dispatch-only on the grounds that the point was outside {@code ntv1_can.dat}; + * two things changed - {@code grids-us-legacy} vendored {@code conus}, and this arm was in fact + * passing the shared {@code in} field (15E 47.4N, Austria) rather than the NAD27 point at all. + * {@link GridShiftBenchmark#noGridHit()} is where dispatch is isolated from interpolation. + */ + @Benchmark + public ProjCoordinate gridShiftDispatch() { + return nadGridShift.transform(inNad, out); + } + + /** + * The transform-cache lookup path. Target 0 B/op. + * + *

Guards a fix that has already landed: {@code Projection.hashCode} used to call + * {@code Objects.hash}, which allocates an {@code Object[18]} and boxes twelve doubles on every + * cache lookup, and is now a manual 31-chain. {@code PrimeMeridian.hashCode} still does + * {@code new Double(offsetFromGreenwich).hashCode()} ({@code PrimeMeridian.java:92-93}), so + * expect a small nonzero reading until that is also fixed - the ratchet records it and will not + * let it grow. + */ + @Benchmark + public int crsHashCode() { + return wgs84.hashCode() + utm33nCrs.hashCode(); + } + + /** + * Projected-to-projected, no datum work: an inverse and a forward projection back to back. + * Target 0 B/op. Input is a UTM 33N easting/northing, not degrees. + */ + @Benchmark + public ProjCoordinate projToProj() { + return utmToWebMercator.transform(inUtm, out); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/BulkTransformBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/BulkTransformBenchmark.java new file mode 100644 index 0000000..6429fd8 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/BulkTransformBenchmark.java @@ -0,0 +1,263 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.BulkCoordinateTransform; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.ProjCoordinate; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OperationsPerInvocation; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * The bulk API, and the single-point loop it is meant to replace, measured in the same fork. + * + *

Formerly staged, now live. This class used to sit in {@code ...benchmark.staged} and + * reach the bulk methods through a reflective bridge, because + * {@link org.locationtech.proj4j.BulkCoordinateTransform} did not exist. It does; the bridge and + * the whole staged package are gone, the import is the real interface, and {@code run-gate.sh} no + * longer passes {@code -e '\.staged\.'}. The consequence is the point of the change: the bulk + * path had no allocation ratchets at all while it was excluded, so the contract that a bulk + * method allocates zero bytes per point was normative and unmeasured. It is now gated. + * + *

Why the control lives in this class

+ * + *

{@link #loopOfSinglePoint} is the method that proves any batch win is real. It needs no + * bulk API - it only calls today's {@code CoordinateTransform} - but it belongs here rather than in + * {@code SinglePointTransformBenchmark} because the claim being tested is a ratio: batch + * ops/s divided by loop ops/s, measured in the same JMH fork, so that machine speed, turbo + * state and noisy neighbours cancel. A control measured in a different fork on a different day + * answers a different question. + * + *

What the arms are for

+ * + *

{@code reference/performance.md} attributes the estimated 2-4x to four separable mechanisms, and + * the arms are arranged to attribute the measured win to them rather than reporting one aggregate: + *

    + *
  • {@link #loopOfSinglePoint} vs {@link #interleaved2DInPlace} - hoisting loop invariants and + * megamorphic-to-monomorphic dispatch, together. This is the headline ratio.
  • + *
  • {@link #interleaved2DInPlace} vs {@link #structOfArrays} - memory layout alone. Same work, + * same invariant hoisting, different array shape. {@code performance.md} calls SoA "the + * vectorisation-friendly shape and the fastest variant" and estimates 5-15% at 1e5 points; this + * pair is where that estimate becomes a measurement.
  • + *
  • {@link #interleaved2DInPlace} vs {@link #interleaved3DInPlace} - the cost of carrying a + * height, which for the Helmert pairs is not free.
  • + *
  • {@link #interleaved2DSrcToDst} vs {@link #interleaved2DInPlace} - whether aliasing + * {@code src == dst} is actually cheaper, or whether the in-place variant just forces a + * read-modify-write the separate-array form avoids.
  • + *
  • {@link #interleaved2DNullStatus} vs {@link #interleaved2DInPlace} - the cost of the status + * array. The contract says a non-null status must be zero allocation, so this pair + * should differ by one byte store per point and nothing else. If it differs by more, the status + * write is not on the fast path it is supposed to be on.
  • + *
  • {@link #nonUnitStride} - a stride of 4 over a buffer that also carries M and a flag, which is + * the shape a real geometry library hands over. Confirms the loop does not silently depend on + * {@code stride == 2}.
  • + *
+ * + *

{@code @OperationsPerInvocation} normalises every arm to per-point, which is what makes + * the ratios directly readable and what makes {@code gc.alloc.rate.norm} come out as + * bytes per point. Tier 1 asserts every bulk method at 0 B/op; without this annotation + * the assertion would be "0 bytes per batch", which is the same thing only by luck. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@OperationsPerInvocation(BulkTransformBenchmark.NUM_POINTS) +public class BulkTransformBenchmark { + + /** + * The consumer's shape: "up to 100,000 {@code transform} calls for one geometry". 100,000 points + * of interleaved XY is 1.6 MB, which is past L2 on most runners and therefore includes the memory + * behaviour that the layout arms exist to measure. A batch small enough to sit in L1 would report + * a layout win of zero. + */ + public static final int NUM_POINTS = 100_000; + + @Param + public CrsPair pair; + + private CoordinateTransform singlePoint; + private BulkCoordinateTransform bulk; + + /** Interleaved XY, stride 2. */ + private double[] xy; + /** Interleaved XYZ, stride 3. */ + private double[] xyz; + /** Interleaved XY with two extra ordinates per point, stride 4. */ + private double[] xyStride4; + /** Destination for the src-to-dst arm. */ + private double[] xyDst; + + /** Struct-of-arrays. */ + private double[] xs; + private double[] ys; + private double[] zs; + + /** Caller-owned, reused. Never reallocated - that is the contract. */ + private byte[] status; + + /** For the control only. */ + private ProjCoordinate in; + private ProjCoordinate out; + + @Setup(Level.Trial) + public void setUp() { + singlePoint = pair.createTransform(); + // A cast, not a reflective bridge: BasicCoordinateTransform implements the interface. The + // check is kept so that a factory returning some other CoordinateTransform fails in + // @Setup, which JMH reports as an error with the message attached, rather than inside a + // measured method where it would be reported as a timing of fillInStackTrace. + if (!(singlePoint instanceof BulkCoordinateTransform)) { + throw new IllegalStateException(pair + ": " + singlePoint.getClass().getName() + + " does not implement BulkCoordinateTransform, so the bulk arms would measure" + + " nothing."); + } + bulk = (BulkCoordinateTransform) singlePoint; + + xy = new double[NUM_POINTS * 2]; + xyz = new double[NUM_POINTS * 3]; + xyStride4 = new double[NUM_POINTS * 4]; + xyDst = new double[NUM_POINTS * 2]; + xs = new double[NUM_POINTS]; + ys = new double[NUM_POINTS]; + zs = new double[NUM_POINTS]; + status = new byte[NUM_POINTS]; + + in = new ProjCoordinate(); + out = new ProjCoordinate(); + + fill(); + } + + /** + * Refills the buffers before each measured invocation. + * + *

Necessary because the in-place arms overwrite their input, and transforming already-projected + * coordinates would either measure a different regime or fail. {@code Level.Invocation} setup has + * a documented accuracy cost in JMH, which is exactly why {@code NUM_POINTS} is 100,000: the fill + * is a linear pass over memory the transform is about to walk anyway, so it is a small fraction of + * a batch this size. Do not reduce {@code NUM_POINTS} without moving the fill. + */ + @Setup(Level.Invocation) + public void fill() { + // A small deterministic spread rather than one repeated point: a single value would let the + // branch predictor and any future per-point cache see an unrealistically easy input, and for + // the iterative-inverse pairs it would fix the trip count at one value. + final double baseX = pair.x(); + final double baseY = pair.y(); + final double spreadX = pair.sourceCode().equals("EPSG:32633") ? 100.0 : 1.0e-3; + final double spreadY = pair.sourceCode().equals("EPSG:32633") ? 100.0 : 1.0e-3; + for (int i = 0; i < NUM_POINTS; i++) { + double px = baseX + ((i % 101) - 50) * spreadX; + double py = baseY + ((i % 97) - 48) * spreadY; + double pz = pair.z(); + xy[2 * i] = px; + xy[2 * i + 1] = py; + xyz[3 * i] = px; + xyz[3 * i + 1] = py; + xyz[3 * i + 2] = pz; + xyStride4[4 * i] = px; + xyStride4[4 * i + 1] = py; + xyStride4[4 * i + 2] = i; // an M ordinate the transform must not touch + xyStride4[4 * i + 3] = 0.0; // a flag the transform must not touch + xs[i] = px; + ys[i] = py; + zs[i] = pz; + } + } + + /** + * The control. N calls to today's single-point API over the same buffer, so the batch arms + * are compared against the thing they are meant to replace, in the same fork. + * + *

Reuses one input and one output coordinate, so this arm measures proj4j's per-call cost with + * the caller's allocation removed. The caller's allocation is measured separately by + * {@code SinglePointTransformBenchmark}; adding it here would fold two effects into the ratio. + */ + @Benchmark + public double loopOfSinglePoint() { + double sink = 0.0; + for (int i = 0; i < NUM_POINTS; i++) { + in.setValue(xy[2 * i], xy[2 * i + 1]); + singlePoint.transform(in, out); + xy[2 * i] = out.x; + xy[2 * i + 1] = out.y; + sink += out.x; + } + return sink; + } + + /** The headline arm: interleaved, in place, stride 2, status recorded. */ + @Benchmark + public int interleaved2DInPlace() { + return bulk.transform2D(xy, 0, NUM_POINTS, 2, status); + } + + /** Fail-fast variant. Isolates the cost of the status byte store. */ + @Benchmark + public int interleaved2DNullStatus() { + return bulk.transform2D(xy, 0, NUM_POINTS, 2, null); + } + + /** Stride 3, carrying a real height through the datum step. */ + @Benchmark + public int interleaved3DInPlace() { + return bulk.transform3D(xyz, 0, NUM_POINTS, 3, status); + } + + /** Separate source and destination, both stride 2. */ + @Benchmark + public int interleaved2DSrcToDst() { + return bulk.transform2D(xy, 0, 2, xyDst, 0, 2, NUM_POINTS, status); + } + + /** + * Stride 4 over a buffer carrying M and a flag. Confirms the loop honours the stride and does not + * clobber the untouched ordinates - correctness that gate D asserts, measured here because a + * stride-agnostic loop and a stride-2-specialised one have very different memory behaviour. + */ + @Benchmark + public int nonUnitStride() { + return bulk.transform2D(xyStride4, 0, NUM_POINTS, 4, status); + } + + /** Struct-of-arrays: the layout arm. */ + @Benchmark + public int structOfArrays() { + return bulk.transform(xs, ys, zs, 0, NUM_POINTS, status); + } + + /** SoA with no height, which is the common 2D case and should be strictly cheaper. */ + @Benchmark + public int structOfArraysNoZ() { + return bulk.transform(xs, ys, null, 0, NUM_POINTS, status); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/ConcurrentThroughputBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/ConcurrentThroughputBenchmark.java new file mode 100644 index 0000000..87acccb --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/ConcurrentThroughputBenchmark.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.ProjCoordinate; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Threads; +import org.openjdk.jmh.annotations.Warmup; + +/** + * The consumer's actual model: N threads through one shared + * {@code CoordinateTransform}, cached once per executor. + * + *

{@code @State(Scope.Benchmark)} on {@link Shared} is the whole point of the file - one + * transform instance for every thread. {@code Scope.Thread} would make this a boring linear-scaling + * benchmark and would measure a model nobody runs. + * + *

A note on the annotation. {@code reference/performance.md} writes + * {@code @Threads({1,2,4,8,16})}, but {@code org.openjdk.jmh.annotations.Threads} declares + * {@code int value()}, not {@code int[]} - JMH has no thread-count sweep annotation, and {@code -t} + * takes one value per run. The intent is realised here as five methods with identical bodies and + * different {@code @Threads}, which produces the whole sweep in a single JMH invocation and one JSON + * file, which is what the gate consumes. The alternative - five separate runs with {@code -t} - would + * put each point in a different fork and make the scaling curve incomparable. + * + *

This benchmark cannot prove thread safety and must not be read as doing so. Sharing a + * transform across threads is unsafe today for two reasons + * ({@code reference/performance.md}, "Thread safety: the verdict"): {@code CassiniProjection} writes + * 17 instance fields inside {@code project()}/{@code projectInverse()} and reads them back 1-4 lines + * later, and {@code Proj4Parser.java:53} mutates the global static {@code Datum} singletons. The + * Cassini failure mode is finite, plausible, wrong coordinates, which no throughput number + * will ever reveal. Correctness is {@code SharedTransformConcurrencyTest}'s job - bitwise identity + * against a single-threaded recording, because a tolerance assertion would pass through a torn + * double. This file only answers "does it scale". + * + *

Scaling is expected to be near-linear once the invariant re-derivation is hoisted, because + * nothing on the path is synchronised. Two things would show up as sub-linear scaling and are worth + * looking for: {@code Grid.fromNadGrids} running entirely inside a global + * {@code synchronized (Grid.class)} around blocking I/O ({@code Grid.java:318}) - only on a cold + * path, but a cold path a Spark stage hits on every executor at once - and false sharing on the + * non-final {@code srcGeoConv}/{@code tgtGeoConv} fields. + * + *

Uses {@code Mode.Throughput}, not {@code AverageTime}: with contention the question is + * aggregate ops/s, and an average latency across contending threads hides whether the total went up. + */ +@BenchmarkMode(Mode.Throughput) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class ConcurrentThroughputBenchmark { + + /** + * The pair to sweep. Deliberately not a {@code @Param} over all eight: five thread counts + * times eight pairs times three forks is 120 forks, which is a nightly-only cost and this class + * is in the default set. UTM is chosen because it is the most expensive projection and the one + * with per-call allocation, so it is where allocation-induced scaling loss would appear first. + * For a full sweep, run this class alone with {@code -p} overrides. + */ + private static final CrsPair PAIR = CrsPair.WGS84_TO_UTM33N; + + /** + * One transform for all threads. {@code Scope.Benchmark} is load-bearing; do not change it + * to {@code Scope.Thread} to "fix" a flaky result - a flaky result here is a finding. + */ + @State(Scope.Benchmark) + public static class Shared { + CoordinateTransform transform; + double x; + double y; + double z; + + @Setup(Level.Trial) + public void setUp() { + transform = PAIR.createTransform(); + x = PAIR.x(); + y = PAIR.y(); + z = PAIR.z(); + } + } + + /** + * Per-thread scratch. The output coordinate must not be shared: two threads writing one + * {@code ProjCoordinate} would tear it, and the benchmark would be measuring a data race rather + * than the transform. + */ + @State(Scope.Thread) + public static class PerThread { + ProjCoordinate in; + ProjCoordinate out; + + @Setup(Level.Trial) + public void setUp() { + in = new ProjCoordinate(); + out = new ProjCoordinate(); + } + } + + private static ProjCoordinate run(Shared shared, PerThread local) { + local.in.setValue(shared.x, shared.y, shared.z); + return shared.transform.transform(local.in, local.out); + } + + @Benchmark + @Threads(1) + public ProjCoordinate threads01(Shared shared, PerThread local) { + return run(shared, local); + } + + @Benchmark + @Threads(2) + public ProjCoordinate threads02(Shared shared, PerThread local) { + return run(shared, local); + } + + @Benchmark + @Threads(4) + public ProjCoordinate threads04(Shared shared, PerThread local) { + return run(shared, local); + } + + @Benchmark + @Threads(8) + public ProjCoordinate threads08(Shared shared, PerThread local) { + return run(shared, local); + } + + @Benchmark + @Threads(16) + public ProjCoordinate threads16(Shared shared, PerThread local) { + return run(shared, local); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/CrsPair.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/CrsPair.java new file mode 100644 index 0000000..10d83d3 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/CrsPair.java @@ -0,0 +1,167 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; + +/** + * The eight representative CRS pairs, as one enum so that every benchmark and the Tier 2 gate + * cover exactly the same set. + * + *

Written as a single {@code @Param} enum on purpose. JMH expands a bare {@code @Param} on an + * enum-typed field to all of its constants, so adding a ninth pair here extends every + * parameterised benchmark and the op-count baseline at once, with no other edit. If the pairs were + * eight string literals per benchmark they would drift apart within a release. + * + *

Each pair is here because it exercises a distinct cost mechanism, not for coverage. + * The sample point is pinned per pair because the Tier 2 op counts are only deterministic for a + * fixed input - iterative inverses take a data-dependent number of trips, which is the whole + * reason {@code reference/numerics.md} insists on fixed iteration counts. + * + * @see reference/performance.md "The 8 representative CRS pairs" + */ +public enum CrsPair { + + /** + * The floor. Nothing but the {@code BasicCoordinateTransform} envelope: {@code setValue}, six + * {@code AxisOrder} enum dispatches, two prime-meridian calls, an identity datum transform. + * Whatever this costs is the per-call overhead every other pair also pays, so it is the + * denominator for reading all the others. + */ + WGS84_TO_WGS84("EPSG:4326", "EPSG:4326", 8.5, 47.4, 100.0), + + /** Web Mercator. The cheapest real projection: spherical {@code merc}, no datum shift. */ + WGS84_TO_WEBMERCATOR("EPSG:4326", "EPSG:3857", 8.5, 47.4, 100.0), + + /** + * UTM zone 33N - proj4j's most expensive projection. + * {@code Registry.java:274} maps {@code +proj=utm} to {@code ExtendedTransverseMercatorProjection}, + * which allocates two {@code new double[1]} out-params per call and invokes the + * non-intrinsified {@code Math.hypot} twice. Sample longitude is the zone's central meridian + * region so the series converges normally rather than in its degraded far-from-CM regime. + */ + WGS84_TO_UTM33N("EPSG:4326", "EPSG:32633", 15.0, 47.4, 100.0), + + /** + * Projected to projected, same datum. Exercises the inverse-then-forward pair with no datum + * work at all, and is the pair a {@code ProjToProjSameDatumKernel} would have to beat. + * Input is an easting/northing in metres, not degrees. + */ + UTM33N_TO_WEBMERCATOR("EPSG:32633", "EPSG:3857", 500000.0, 5250000.0, 100.0), + + /** + * OSGB36. A genuine 7-parameter Helmert, which means a full {@code cart} forward and inverse + * round trip through geocentric coordinates. Also the invented-height case: the Helmert + * consumes {@code z}, so a 2D caller's absent height is silently treated as a real one. + */ + WGS84_TO_OSGB36("EPSG:4326", "EPSG:27700", -2.0, 52.0, 100.0), + + /** + * NAD27 to NAD83, the grid-shift pair. 96W 39N is in Kansas, inside CTABLE V2 {@code conus}. + * + *

This measures a real NADCON interpolation: extent test, cell index, four-corner + * bilinear blend, through the full {@code BasicCoordinateTransform} envelope. The shift is + * about 23 m of longitude - {@code (-96, 39)} goes to + * {@code (-96.00026791361263, 39.000000955367376)}. + * + *

Superseded description, kept because it explains a live trap. This pair used to be + * documented here as a near-no-op that "pays the full grid dispatch and then falls out because + * 96W 39N is outside the Canadian grid", with a measured residual of 9.2e-10 deg. That was true + * when {@code ntv1_can.dat} was the only grid that shipped and {@code @conus} resolved to + * nothing. Two things changed since: the {@code grids-us-legacy} module vendored {@code conus}, + * and the fail-closed API turned the fall-through into a {@code CrsTransformException}. The + * combination is why {@code benchmark/pom.xml} must depend on {@code proj4j-grids-us-legacy} - + * without it this pair does not measure a cheap dispatch, it throws, and it takes all of Tier 2 + * down with it. + * + *

Grid-shift overhead without interpolation is still measured, by + * {@link GridShiftBenchmark#noGridHit()}, which queries an explicitly-loaded + * {@code ntv1_can.dat} list directly rather than going through CRS resolution. + */ + NAD27_TO_NAD83("EPSG:4267", "EPSG:4269", -96.0, 39.0, 100.0), + + /** + * Albers Equal Area CONUS. The iterative inverse: {@code authlat}/{@code qsfn} today, an + * {@code AuthalicLat} Clenshaw series after {@code reference/numerics.md} row 4. This is the + * pair whose op counts should drop sharply when that lands - a Tier 2 baseline refresh + * with a smaller count is the expected, correct outcome, not a breach. + */ + WGS84_TO_ALBERS_CONUS("EPSG:4326", "EPSG:5070", -96.0, 39.0, 100.0), + + /** + * Geocentric target. {@code +proj=geocent}, where {@code GeocentProjection} constructs a + * new {@code GeocentricConverter} per call, so this is the pair Tier 1 watches for the + * allocation fix. + */ + WGS84_TO_GEOCENTRIC("EPSG:4326", "EPSG:4978", 8.5, 47.4, 100.0); + + private final String sourceCode; + private final String targetCode; + private final double x; + private final double y; + private final double z; + + CrsPair(String sourceCode, String targetCode, double x, double y, double z) { + this.sourceCode = sourceCode; + this.targetCode = targetCode; + this.x = x; + this.y = y; + this.z = z; + } + + public String sourceCode() { + return sourceCode; + } + + public String targetCode() { + return targetCode; + } + + /** Sample easting or longitude, in the source CRS's own units. */ + public double x() { + return x; + } + + /** Sample northing or latitude, in the source CRS's own units. */ + public double y() { + return y; + } + + /** Sample height in metres. Never NaN, so the Helmert pairs exercise a real {@code z}. */ + public double z() { + return z; + } + + /** {@code "EPSG:4326 -> EPSG:32633"}, for gate messages. */ + public String describe() { + return sourceCode + " -> " + targetCode; + } + + /** + * Builds the transform with fresh factories. Deliberately not cached in a static: a benchmark + * that shares one transform across parameterisations would also share whatever per-transform + * state a future kernel caches, and that would quietly change what is being measured. + */ + public CoordinateTransform createTransform() { + CRSFactory crsFactory = new CRSFactory(); + CoordinateTransformFactory transformFactory = new CoordinateTransformFactory(); + return transformFactory.createTransform( + crsFactory.createFromName(sourceCode), + crsFactory.createFromName(targetCode)); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/CrsParseBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/CrsParseBenchmark.java new file mode 100644 index 0000000..a23ed63 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/CrsParseBenchmark.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * CRS creation cost, parameterised by position in the init file. + * + *

This is not an arbitrary parameterisation. {@code Proj4FileReader.readParametersFromFile} + * ({@code :35-56}) opens the classpath resource and linearly tokenises the 888 KB + * {@code proj4/nad/epsg} file with a {@code StreamTokenizer} on every single call + * ({@code :76-90}), allocating per entry scanned. So the cost of creating a CRS is a function of how + * far down the file its code happens to sit, and a benchmark that only measured + * {@code EPSG:4326} - which sits at line 498 of 11,731, in the first 4% - would report roughly a + * twentieth of the worst case and would be blind to the entire problem. + * + *

The three parameter values are the file's actual first, middle and last entries, measured on + * the checked-in {@code epsg} file (5,755 entries, 11,731 lines): + *

    + *
  • {@code EARLY} - {@code EPSG:3819}, line 2, the very first entry.
  • + *
  • {@code MIDDLE} - {@code EPSG:5937}, line 5,855, entry 2,878 of 5,755.
  • + *
  • {@code LATE} - {@code EPSG:9054}, line 11,732, the very last entry.
  • + *
+ * The expected shape is a near-linear ramp from EARLY to LATE. If the ramp flattens, the fix + * landed - parsing each init file once into a {@code Map} (~5,755 entries at + * ~120 B, about 1 MB) is what {@code reference/performance.md} prescribes. Keep these three + * parameters afterwards: the flat ramp is the evidence. + * + *

If the {@code epsg} file is regenerated the line numbers above move. The codes are still valid + * subjects, but re-derive the positions before quoting them, and update this comment - a stale + * position claim here is worse than none. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class CrsParseBenchmark { + + /** Where in the 888 KB init file the code sits. */ + public enum FilePosition { + /** First entry, line 2. */ + EARLY("EPSG:3819"), + /** Entry 2,878 of 5,755, line 5,855. */ + MIDDLE("EPSG:5937"), + /** Last entry, line 11,732. */ + LATE("EPSG:9054"); + + private final String code; + + FilePosition(String code) { + this.code = code; + } + + public String code() { + return code; + } + } + + @Param + public FilePosition position; + + private CRSFactory crsFactory; + private String code; + private String paramString; + + @Setup(Level.Trial) + public void setUp() { + crsFactory = new CRSFactory(); + code = position.code(); + // Fail fast if a regenerated epsg file dropped one of these codes, rather than reporting an + // exception-throwing benchmark as a timing. + CoordinateReferenceSystem crs = crsFactory.createFromName(code); + if (crs == null) { + throw new IllegalStateException("No such CRS in the init file: " + code + + " - the epsg resource was regenerated; re-pick the EARLY/MIDDLE/LATE codes."); + } + paramString = crs.getParameterString(); + } + + /** + * The full cost a consumer pays on a cache miss: linear scan of the init file, tokenise, parse, + * instantiate the projection, resolve the datum. + * + *

Note that {@code CRSFactory}'s {@code Registry} and {@code Proj4FileReader} are static, so + * sharing one factory instance across invocations is not a caching artefact - there is no cache + * at this layer at all. That is the finding. + */ + @Benchmark + public CoordinateReferenceSystem createFromName() { + return crsFactory.createFromName(code); + } + + /** + * Parse only, no file scan: the same {@code Proj4Parser} work with the init-file lookup already + * done. {@code createFromName} minus this is the file-scan cost, which is the part the + * {@code Map} fix removes. + */ + @Benchmark + public CoordinateReferenceSystem createFromParameters() { + return crsFactory.createFromParameters(code, paramString); + } + + /** + * The reverse lookup, {@code readEpsgCodeFromFile} ({@code :123-141}), which always scans the + * whole file regardless of where the answer is - so unlike {@code createFromName} this one + * should be flat across the three parameters, and its cost is the ceiling the forward lookup + * approaches as codes move later in the file. + */ + @Benchmark + public String readEpsgFromParameters() throws java.io.IOException { + return crsFactory.readEpsgFromParameters(paramString); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/EtmercBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/EtmercBenchmark.java new file mode 100644 index 0000000..1f7f024 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/EtmercBenchmark.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.Projection; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * Isolates the transverse-Mercator algorithm decision, with no {@code BasicCoordinateTransform} + * envelope and no datum work. + * + *

Two algorithms are registered ({@code Registry.java:348-349,355}) and both are reachable from + * shipped EPSG codes: + *

    + *
  • {@code +proj=etmerc} / {@code +proj=utm} - {@code ExtendedTransverseMercatorProjection}, + * the Poder/Engsager analogue. Allocates two {@code new double[1]} out-params per call and + * calls the non-intrinsified {@code Math.hypot} twice; {@code reference/performance.md} names + * it proj4j's most expensive projection.
  • + *
  • {@code +proj=tmerc} - {@code TransverseMercatorProjection}, the Evenden/Snyder series, + * cheaper and less accurate, and carrying three confirmed coefficient defects + * ({@code reference/numerics.md} rows 1-4 of the E/S list).
  • + *
+ * + *

Parameterised across the 3-degree seam. The E/S series degrades with distance from the + * central meridian; {@code builtins.gie:7466,7472} disables a round-trip for + * {@code +algo=evenden_snyder} at 6 degrees, and upstream's own accuracy note puts the Poder/Engsager + * advantage at 0.9 mm at 6 degrees growing without bound beyond 20. The parameter is + * {@code deltaLonDeg}, the offset from the central meridian, sampled at 0 / 1.5 / 3 / 6 / 20. + * Cost is expected to be flat in {@code deltaLonDeg} for both algorithms - if it is not, some + * iteration count is data-dependent, which is itself a finding and a determinism hazard. + * + *

Uses the public {@code projectRadians}/{@code inverseProjectRadians} entry points rather than + * the protected {@code project(double,double,ProjCoordinate)}. That includes the central-meridian + * subtraction, {@code totalScale} and the false origin, which is the shape a kernel would actually + * call, and it avoids widening proj4j's public surface just to benchmark it. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class EtmercBenchmark { + + /** + * Offset from the central meridian in degrees. 3 is the seam UTM zones are drawn around; 6 is + * where upstream stops asserting E/S round-trip stability; 20 is where the E/S error is + * unbounded. + */ + @Param({"0.0", "1.5", "3.0", "6.0", "20.0"}) + public double deltaLonDeg; + + /** Central meridian of UTM zone 33N, so the geometry matches {@link CrsPair#WGS84_TO_UTM33N}. */ + private static final double CENTRAL_MERIDIAN_DEG = 15.0; + private static final double LAT_DEG = 47.4; + + private Projection etmerc; + private Projection tmerc; + + private ProjCoordinate geoIn; + private ProjCoordinate projInEtmerc; + private ProjCoordinate projInTmerc; + private ProjCoordinate out; + + @Setup(Level.Trial) + public void setUp() { + CRSFactory crsFactory = new CRSFactory(); + String common = " +lat_0=0 +lon_0=" + CENTRAL_MERIDIAN_DEG + + " +k=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 +units=m"; + etmerc = crsFactory.createFromParameters("etmerc", "+proj=etmerc" + common).getProjection(); + tmerc = crsFactory.createFromParameters("tmerc", "+proj=tmerc" + common).getProjection(); + + // projectRadians expects radians and, for these projections, absolute longitude - the + // central meridian subtraction happens inside. + geoIn = new ProjCoordinate( + Math.toRadians(CENTRAL_MERIDIAN_DEG + deltaLonDeg), Math.toRadians(LAT_DEG)); + out = new ProjCoordinate(); + + // Seed each inverse with that algorithm's own forward output, so the inverse is solving a + // point that is exactly on its own image. Seeding both from one algorithm would make the + // slower one iterate over a residual the other introduced. + projInEtmerc = new ProjCoordinate(); + etmerc.projectRadians(geoIn, projInEtmerc); + projInTmerc = new ProjCoordinate(); + tmerc.projectRadians(geoIn, projInTmerc); + } + + @Benchmark + public ProjCoordinate etmercForward() { + return etmerc.projectRadians(geoIn, out); + } + + @Benchmark + public ProjCoordinate etmercInverse() { + return etmerc.inverseProjectRadians(projInEtmerc, out); + } + + @Benchmark + public ProjCoordinate tmercForward() { + return tmerc.projectRadians(geoIn, out); + } + + @Benchmark + public ProjCoordinate tmercInverse() { + return tmerc.inverseProjectRadians(projInTmerc, out); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/GridShiftBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/GridShiftBenchmark.java new file mode 100644 index 0000000..ca4bb96 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/GridShiftBenchmark.java @@ -0,0 +1,218 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * Datum grid shift: the dispatch overhead, the real NTv1 interpolation, and the iterative inverse. + * + *

The state of the world, measured, because it determines what these numbers mean. Only + * one grid ships: {@code proj4/nad/ntv1_can.dat} (1.06 MB, Canada). {@code Datum.NAD27} is declared + * with {@code Grid.fromNadGrids("@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat")} and the three optional + * {@code @} entries resolve to nothing, so NAD27 is typed {@code TYPE_GRIDSHIFT} carrying exactly + * one grid. Consequences: + *

    + *
  • At a CONUS point (96W 39N) the shift is a near-no-op: the full dispatch runs - list + * iterator, per-grid extent test, {@code nad_cvt} entry - and then falls out because the point + * is outside the Canadian grid. Measured residual 9.2e-10 deg, the identity to 0.1 mm. That is + * {@link #noGridHit}, and it is what {@link CrsPair#NAD27_TO_NAD83} measures too.
  • + *
  • At a Canadian point (75W 45N) the grid does apply: measured shift + * (-4.68e-05, -3.63e-04) deg, about 40 m. That is {@link #forwardShift} and + * {@link #inverseShift}, and it is the only real grid interpolation available in this + * repository today.
  • + *
+ * So {@code noGridHit} is the overhead floor and {@code forwardShift} minus it is the interpolation. + * Do not quote {@code noGridHit} as the cost of a grid shift. When real CONUS grids ship, add + * a NAD27-to-NAD83 CONUS arm and this comment becomes wrong - fix it then. + * + *

Tier 1 pins {@link #inverseShift} at 0 B/op, and it is the sharpest allocation target in + * the library: {@code performance.md} measures the inverse grid-shift path at up to 49 + * allocations per vertex, which is 4.9 million objects for one 100,000-vertex geometry. Two + * distinct causes, both fixable without touching the arithmetic: {@code Grid.shift} iterating a + * {@code List} field with a for-each ({@code Grid.java:89}), and {@code nad_cvt}/{@code nad_intr} + * returning fresh {@code PolarCoordinate} objects per trip of a {@code MAX_TRY = 9} loop. + * + *

{@link #inverseShift} is also the only arm here whose cost is genuinely data-dependent: the + * inverse is a fixed-point iteration bounded at {@code MAX_TRY = 9} with {@code TOL = 1e-12}, so its + * trip count varies with the local gradient of the shift field. The sample point is pinned for that + * reason. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class GridShiftBenchmark { + + /** Inside {@code ntv1_can.dat}: Ottawa-ish. Verified to produce a ~40 m shift. */ + private static final double IN_GRID_LON_DEG = -75.0; + private static final double IN_GRID_LAT_DEG = 45.0; + + /** Outside {@code ntv1_can.dat}: Kansas. Verified to fall through as the identity. */ + private static final double OUT_OF_GRID_LON_DEG = -96.0; + private static final double OUT_OF_GRID_LAT_DEG = 39.0; + + private List grids; + + private CoordinateTransform nad27ToNad83; + private ProjCoordinate outOfGridIn; + private ProjCoordinate transformOut; + + /** + * {@code Grid.shift} mutates its argument in place, so each invocation must start from a fresh + * value. Writing the two doubles into a reused coordinate is the cheapest way to do that and + * keeps the arm at zero caller-side allocation, which Tier 1 depends on. + */ + private ProjCoordinate scratch; + + private double inGridLonRad; + private double inGridLatRad; + private double outOfGridLonRad; + private double outOfGridLatRad; + + @Setup(Level.Trial) + public void setUp() throws IOException { + // Not "@ntv1_can.dat": the leading @ makes the grid optional, and an optional grid that + // fails to load yields an empty list and a silently-identity benchmark. Loading it as + // mandatory means a packaging regression fails setup instead of quietly measuring nothing. + grids = Grid.fromNadGrids("ntv1_can.dat"); + if (grids == null || grids.isEmpty()) { + throw new IllegalStateException( + "ntv1_can.dat did not load; proj4j-epsg is missing from the runtime classpath."); + } + + inGridLonRad = Math.toRadians(IN_GRID_LON_DEG); + inGridLatRad = Math.toRadians(IN_GRID_LAT_DEG); + outOfGridLonRad = Math.toRadians(OUT_OF_GRID_LON_DEG); + outOfGridLatRad = Math.toRadians(OUT_OF_GRID_LAT_DEG); + + scratch = new ProjCoordinate(); + + nad27ToNad83 = CrsPair.NAD27_TO_NAD83.createTransform(); + outOfGridIn = new ProjCoordinate(OUT_OF_GRID_LON_DEG, OUT_OF_GRID_LAT_DEG, 0.0); + transformOut = new ProjCoordinate(); + + // Assert the two regimes really are the two regimes, so a data change cannot turn this file + // into two copies of the same measurement without anyone noticing. + scratch.setValue(inGridLonRad, inGridLatRad); + Grid.shift(grids, false, scratch); + if (Math.abs(scratch.x - inGridLonRad) < 1e-12) { + throw new IllegalStateException("forwardShift's sample point no longer hits the grid."); + } + // The miss regime is now asserted by the throw, not by an unchanged coordinate. Grid.shift + // fails closed (Grid.java:518 -> outsideGrid), so a point outside every grid raises + // CrsTransformException instead of falling through as a silent identity. Asserting the throw + // is strictly the stronger check: the old form passed both when the point missed the grid + // AND when the grid failed to load and the shift was vacuous. + scratch.setValue(outOfGridLonRad, outOfGridLatRad); + try { + Grid.shift(grids, false, scratch); + throw new IllegalStateException("noGridHit's sample point is now inside the grid."); + } catch (CrsTransformException expected) { + // Correct: 96W 39N is outside ntv1_can.dat. + } + } + + /** Real NTv1 bilinear interpolation: extent test, cell index, four-corner blend. */ + @Benchmark + public ProjCoordinate forwardShift() { + scratch.setValue(inGridLonRad, inGridLatRad); + Grid.shift(grids, false, scratch); + return scratch; + } + + /** + * The fixed-point inverse, {@code MAX_TRY = 9} / {@code TOL = 1e-12}. Tier 1 pins this arm at + * 0 B/op. + */ + @Benchmark + public ProjCoordinate inverseShift() { + scratch.setValue(inGridLonRad, inGridLatRad); + Grid.shift(grids, true, scratch); + return scratch; + } + + /** + * The dispatch path with no interpolation: extent test, iterator, and then the miss. + * + *

Under the fail-closed API this arm measures the THROW, not a cheap fall-through, and + * that reframes what its number means. It used to be the floor - dispatch overhead and nothing + * else. {@code Grid.shift} now raises {@code CrsTransformException} on a miss (correctly: a + * failure must never be expressed as a plausible coordinate), so what is timed here is dispatch + * plus exception construction, and {@code reference/performance.md} prices a + * {@code fillInStackTrace} at 1-10 microseconds - two to three orders above the dispatch + * it was meant to isolate. + * + *

That makes this the direct measurement of performance.md's sharpest rule ("No exceptions on + * the hot path"), and the number to watch when {@code Proj4jException.fillInStackTrace} is + * overridden to return {@code this}. Its Tier 1 rule still carries {@code targetBytesPerOp: + * 0}, which is now the target for the errno-style rewrite rather than a description of the + * current path; expect the ratchet to sit far above it until that lands. + */ + @Benchmark + public ProjCoordinate noGridHit() { + scratch.setValue(outOfGridLonRad, outOfGridLatRad); + try { + Grid.shift(grids, false, scratch); + } catch (CrsTransformException expected) { + // The measured path. See the javadoc: this is now an exception benchmark. + } + return scratch; + } + + /** + * The full public API over the same 96W 39N point, so the {@code BasicCoordinateTransform} + * envelope and CRS-driven grid resolution are included. + * + *

This arm is no longer a no-hit path. It was, while {@code ntv1_can.dat} was the only + * grid on the classpath; now that {@code benchmark/pom.xml} pulls in + * {@code proj4j-grids-us-legacy}, 96W 39N resolves into CTABLE V2 {@code conus} and this does a + * real NADCON interpolation. {@link #noGridHit()} is the arm that still isolates dispatch + * without interpolation - it queries an explicitly-loaded {@code ntv1_can.dat} list, which 96W + * 39N really is outside of, and {@link #setUp()} asserts that. + * + *

So the gap between this and {@link #forwardShift} is the envelope plus CRS-driven grid + * resolution, and it is where {@code Datum.isEqual}'s latent {@code Arrays.equals(cvs)} over + * every grid node would appear - that comparison is masked today only because + * {@code setGrids(null)} empties the list on some paths, so fixing {@code Proj4Parser:53} is + * expected to make this arm blow up. If it does, intern the resolved grid list so the + * comparison short-circuits on identity. + */ + @Benchmark + public ProjCoordinate transformThroughEnvelope() { + return nad27ToNad83.transform(outOfGridIn, transformOut); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/MathDispatchBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/MathDispatchBenchmark.java new file mode 100644 index 0000000..25bb704 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/MathDispatchBenchmark.java @@ -0,0 +1,177 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.util.MathHelpers; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * Quantifies the cost of {@code reference/numerics.md}'s {@code Math} vs {@code StrictMath} policy. + * This benchmark exists solely to put a number on row 13 of that file's ranked-changes table, + * which is the one change whose speed effect is a deliberate loss: + * + *

13 | {@code StrictMath} policy + {@code strictfp} | none | -1.5-3x on the 7 + * intrinsics | yes, <= 1 ulp - but this is what delivers determinism
+ * + *

THE CAVEAT THAT MAKES OR BREAKS THIS BENCHMARK: it must be run on both x86-64 and AArch64. + * The entire {@code StrictMath} question is about cross-architecture divergence. HotSpot ships + * {@code @IntrinsicCandidate} implementations of {@code sin cos tan log log10 exp pow} on both + * architectures, and they differ from each other and from fdlibm. A single-architecture run of this + * file tells you the local tax and says nothing about the thing the policy is for. A result + * from one architecture presented as "the cost of StrictMath" is a wrong answer, not an incomplete + * one. + * + *

Three groups, matching the policy table exactly: + *

    + *
  • Intrinsified - {@code sin cos tan exp log log10 pow}. These are the ones that + * actually vary and the ones the policy switches to {@code StrictMath}. The + * {@code strict*}/{@code math*} pair is the tax.
  • + *
  • Free today - {@code asin acos atan atan2 sinh cosh log1p}. {@code Math} already + * delegates to {@code StrictMath} for these, so the pair should measure as equal. If it does + * not, HotSpot has gained an intrinsic and the policy's "free today" claim has expired - + * which is precisely why these arms are here and not assumed.
  • + *
  • hypot - the policy says use neither, because all core operands are bounded and + * {@code sqrt(x*x + y*y)} is both faster and more accurate in that range. Four arms so the + * claim is measured, not asserted.
  • + *
+ * + *

Inputs come from fields, never from constants: a constant argument lets the JIT constant-fold + * the whole call and the benchmark measures nothing. They are also deliberately not-quite-round + * values, because some libm implementations special-case exact multiples of pi/2. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class MathDispatchBenchmark { + + /** A mid-range latitude in radians; not a multiple of pi/2. */ + private double angle; + /** In (-1, 1), so asin/acos/atanh are all in domain. */ + private double unit; + /** Positive and not 1.0, so log/log10 are not trivially zero. */ + private double positive; + /** A small exponent argument, as in the tsfn/phi2 rewrites. */ + private double exponent; + private double hypotX; + private double hypotY; + + @Setup(Level.Trial) + public void setUp() { + angle = 0.8273456; + unit = 0.7364512; + positive = 1.4356721; + exponent = 0.3129847; + hypotX = 0.6134527; + hypotY = 0.7896431; + } + + // ============================================================================================ + // Group 1: intrinsified on x86-64 and AArch64. This is the tax the policy chooses to pay. + // ============================================================================================ + + @Benchmark public double mathSin() { return Math.sin(angle); } + @Benchmark public double strictSin() { return StrictMath.sin(angle); } + + @Benchmark public double mathCos() { return Math.cos(angle); } + @Benchmark public double strictCos() { return StrictMath.cos(angle); } + + @Benchmark public double mathTan() { return Math.tan(angle); } + @Benchmark public double strictTan() { return StrictMath.tan(angle); } + + @Benchmark public double mathExp() { return Math.exp(exponent); } + @Benchmark public double strictExp() { return StrictMath.exp(exponent); } + + @Benchmark public double mathLog() { return Math.log(positive); } + @Benchmark public double strictLog() { return StrictMath.log(positive); } + + @Benchmark public double mathLog10() { return Math.log10(positive); } + @Benchmark public double strictLog10() { return StrictMath.log10(positive); } + + @Benchmark public double mathPow() { return Math.pow(positive, exponent); } + @Benchmark public double strictPow() { return StrictMath.pow(positive, exponent); } + + /** + * The combined case, because {@code sin} and {@code cos} of the same argument are what every + * projection actually needs. On some platforms HotSpot fuses the pair; if the {@code strict} + * arm's ratio here is worse than the ratio of the individual arms, that fusion is what the + * policy is giving up, and that is a distinct cost from two independent calls. + */ + @Benchmark public double mathSinCos() { return Math.sin(angle) + Math.cos(angle); } + @Benchmark public double strictSinCos() { return StrictMath.sin(angle) + StrictMath.cos(angle); } + + // ============================================================================================ + // Group 2: no intrinsic today, so Math already delegates to StrictMath. These arms should + // measure as equal. They are here to detect the day that stops being true. + // ============================================================================================ + + @Benchmark public double mathAsin() { return Math.asin(unit); } + @Benchmark public double strictAsin() { return StrictMath.asin(unit); } + + @Benchmark public double mathAcos() { return Math.acos(unit); } + @Benchmark public double strictAcos() { return StrictMath.acos(unit); } + + @Benchmark public double mathAtan() { return Math.atan(unit); } + @Benchmark public double strictAtan() { return StrictMath.atan(unit); } + + @Benchmark public double mathAtan2() { return Math.atan2(hypotY, hypotX); } + @Benchmark public double strictAtan2() { return StrictMath.atan2(hypotY, hypotX); } + + @Benchmark public double mathSinh() { return Math.sinh(unit); } + @Benchmark public double strictSinh() { return StrictMath.sinh(unit); } + + @Benchmark public double mathCosh() { return Math.cosh(unit); } + @Benchmark public double strictCosh() { return StrictMath.cosh(unit); } + + @Benchmark public double mathLog1p() { return Math.log1p(unit); } + @Benchmark public double strictLog1p() { return StrictMath.log1p(unit); } + + // ============================================================================================ + // Group 3: hypot. The policy says use neither. Four arms so the 10-30x claim is measured. + // ============================================================================================ + + @Benchmark public double mathHypot() { return Math.hypot(hypotX, hypotY); } + @Benchmark public double strictHypot() { return StrictMath.hypot(hypotX, hypotY); } + + /** What the policy prescribes at every core site. */ + @Benchmark public double sqrtOfSumOfSquares() { + return Math.sqrt(hypotX * hypotX + hypotY * hypotY); + } + + /** The named helper core actually calls, so the number is attributable to a real call site. */ + @Benchmark public double mathHelpersNorm2() { + return MathHelpers.norm2(hypotX, hypotY); + } + + /** {@code Math.sqrt} alone, as the denominator for the "hypot is 10-30x a sqrt" claim. */ + @Benchmark public double mathSqrt() { + return Math.sqrt(positive); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/SinglePointTransformBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/SinglePointTransformBenchmark.java new file mode 100644 index 0000000..45dcbb7 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/SinglePointTransformBenchmark.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.ProjCoordinate; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * The regression baseline. One {@code CoordinateTransform.transform} call in the exact shape + * the consumer uses. + * + *

"Exact shape" is load-bearing and is why {@link #transform} allocates. The consumer runs + * per-vertex inside a Spark executor: a fresh {@link ProjCoordinate} is constructed for each + * vertex read out of the geometry, and one output coordinate is reused across the whole geometry. + * A benchmark that reused the input too would measure a shape nobody runs and would report 0 B/op, + * hiding the single largest allocation on the path. + * + *

So the Tier 1 expectation for this class is {@code <= 40 B/op}: exactly one + * {@code ProjCoordinate} (12-byte header + three doubles, padded to 40 under compressed oops) and + * nothing else. Anything above 40 is proj4j allocating internally - the two {@code new double[1]} + * out-params in {@code ExtendedTransverseMercatorProjection}, the per-call + * {@code GeocentricConverter} in {@code GeocentProjection}, a {@code Grid.shift} iterator. That is + * the regression class Tier 1 exists to catch, and the reason the gate ratchets rather than + * asserting 40 outright today. + * + *

{@link #transformReusedInput} is the control: identical work, no per-call allocation. The + * difference between the two is the consumer's coordinate-object tax, and it is worth knowing + * separately from proj4j's own. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class SinglePointTransformBenchmark { + + /** Bare {@code @Param}: JMH expands this to all eight {@link CrsPair} constants. */ + @Param + public CrsPair pair; + + private CoordinateTransform transform; + private double x; + private double y; + private double z; + + /** Reused across calls, as the consumer reuses one output coordinate per geometry. */ + private ProjCoordinate out; + + /** Reused input, for the {@link #transformReusedInput} control only. */ + private ProjCoordinate reusedIn; + + @Setup(Level.Trial) + public void setUp() { + transform = pair.createTransform(); + x = pair.x(); + y = pair.y(); + z = pair.z(); + out = new ProjCoordinate(); + reusedIn = new ProjCoordinate(x, y, z); + + // Fail fast, in setup rather than in a measurement iteration: a throwing benchmark reports + // as a JMH error with no usable diagnostic, and an exception on the hot path would be + // measuring fillInStackTrace (1-10 us) instead of the transform. + transform.transform(reusedIn, out); + } + + /** + * The gated shape. Fresh input, reused output. + * + *

Returning {@code out} rather than consuming it with a {@code Blackhole} is intentional: + * JMH treats a returned reference as consumed, and a {@code Blackhole} parameter would add its + * own (small, but nonzero and version-dependent) cost to a number that Tier 1 compares against + * a checked-in byte count. + */ + @Benchmark + public ProjCoordinate transform() { + ProjCoordinate in = new ProjCoordinate(x, y, z); + return transform.transform(in, out); + } + + /** Control: the same transform with no caller-side allocation at all. */ + @Benchmark + public ProjCoordinate transformReusedInput() { + return transform.transform(reusedIn, out); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/SolverBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/SolverBenchmark.java new file mode 100644 index 0000000..ae46fc3 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/SolverBenchmark.java @@ -0,0 +1,270 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.AuthalicLat; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.EllipticIntegral; +import org.locationtech.proj4j.util.GenericInverse2D; +import org.locationtech.proj4j.util.MathHelpers; +import org.locationtech.proj4j.util.MeridianArc; +import org.locationtech.proj4j.util.ProjectionMath; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * Head-to-head for every row of {@code reference/numerics.md}'s ranked-changes table that has both + * an old and a new implementation in the tree. + * + *

The pairing is the point. Each {@code legacy*} method calls the {@code @Deprecated} routine in + * {@code ProjectionMath}; each {@code karney*} method calls the {@code AuxLat}/{@code Clenshaw6} + * replacement. Both arms run in the same JMH fork, which is exactly the Tier 2 discipline: + * an absolute ns/op on a shared runner is worth little, but the ratio of two methods measured + * in one fork cancels machine speed, turbo state and noisy neighbours. + * + *

The legacy routines are deprecated, not deleted, precisely so this comparison can exist. When + * the last caller of one of them is gone, keep the {@code legacy*} arm here and add a comment - the + * ratio is the evidence for a claim in the skill, and deleting the baseline arm makes the claim + * unverifiable. + * + *

Parameterised over latitude because several of these are ill-conditioned in a specific regime: + * {@code tsfn} loses relative precision near the pole, {@code phi2}'s {@code pow}-bearing loop trip + * count grows with eccentricity times latitude, and the authalic inverse is worst near 90 degrees. + * A single mid-latitude sample would report the easy case for all of them. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class SolverBenchmark { + + /** Latitude in degrees. 89.9 is the near-pole regime where several of these degrade. */ + @Param({"0.0", "45.0", "70.0", "89.9"}) + public double latDeg; + + /** WGS84 / GRS80 eccentricity squared. */ + private static final double ES = 0.00669437999014133; + + private double phi; + private double sinPhi; + private double cosPhi; + private double e; + private double oneEs; + + // --- legacy state ----------------------------------------------------------------------- + private double[] en; + private double[] apa; + private double legacyArcLength; + private double legacyTs; + private double legacyBeta; + + // --- Karney-core state ------------------------------------------------------------------ + private MeridianArc meridianArc; + private AuthalicLat authalicLat; + private double karneyArcLength; + private double karneyTs; + private double karneyBeta; + + private ProjCoordinate solverOut; + private GenericInverse2D.Forward2D sinusoidalForward; + private double solverTargetX; + private double solverTargetY; + + @Setup(Level.Trial) + public void setUp() { + phi = Math.toRadians(latDeg); + sinPhi = Math.sin(phi); + cosPhi = Math.cos(phi); + e = Math.sqrt(ES); + oneEs = 1.0 - ES; + + en = ProjectionMath.enfn(ES); + apa = ProjectionMath.authset(ES); + legacyArcLength = ProjectionMath.mlfn(phi, sinPhi, cosPhi, en); + legacyTs = ProjectionMath.tsfn(phi, sinPhi, e); + legacyBeta = Math.asin(ProjectionMath.qsfn(sinPhi, e, oneEs) / ProjectionMath.qsfn(1.0, e, oneEs)); + + meridianArc = MeridianArc.fromEs(ES); + authalicLat = new AuthalicLat(ES); + karneyArcLength = meridianArc.mlfn(phi, sinPhi, cosPhi); + karneyTs = ConformalLat.tsfn(phi, sinPhi, e); + karneyBeta = authalicLat.forward(phi, sinPhi, cosPhi); + + // A sinusoidal forward map is the cheapest non-trivial 2D map that GenericInverse2D can + // actually invert, so the measurement is dominated by the solver's own iteration and + // finite-difference machinery rather than by the map. + sinusoidalForward = (lam, p, dst) -> dst.setValue(lam * Math.cos(p), p); + solverOut = new ProjCoordinate(); + solverTargetX = Math.toRadians(10.0) * Math.cos(phi); + solverTargetY = phi; + } + + // ============================================================================================ + // numerics.md row 2: MeridianArc replaces enfn/mlfn/inv_mlfn. + // Forward: series vs series, expect near parity. Inverse: closed form vs a 10-step Newton loop + // that calls sin, cos, mlfn and sqrt per trip, so expect the largest ratio in this class. + // ============================================================================================ + + @Benchmark + public double legacyMlfn() { + return ProjectionMath.mlfn(phi, sinPhi, cosPhi, en); + } + + @Benchmark + public double karneyMlfn() { + return meridianArc.mlfn(phi, sinPhi, cosPhi); + } + + @Benchmark + public double legacyInvMlfn() { + return ProjectionMath.inv_mlfn(legacyArcLength, ES, en); + } + + @Benchmark + public double karneyInvMlfn() { + return meridianArc.invMlfn(karneyArcLength); + } + + // ============================================================================================ + // numerics.md row 3: ConformalLat.phi2 replaces ProjectionMath.phi2. + // Legacy is a pow-bearing fixed-point loop; the replacement is at most two sqrt/sinh steps. + // ============================================================================================ + + @Benchmark + public double legacyPhi2() { + return ProjectionMath.phi2(legacyTs, e); + } + + @Benchmark + public double karneyPhi2() { + return ConformalLat.phi2(karneyTs, e); + } + + // ============================================================================================ + // numerics.md row 5: tsfn rewrite. tan + pow becomes exp + log1p. + // ============================================================================================ + + @Benchmark + public double legacyTsfn() { + return ProjectionMath.tsfn(phi, sinPhi, e); + } + + @Benchmark + public double karneyTsfn() { + return ConformalLat.tsfn(phi, sinPhi, e); + } + + /** The sine/cosine-preserving form, which avoids recomputing what the caller already has. */ + @Benchmark + public double karneyTsfnSinCos() { + return ConformalLat.tsfnSinCos(sinPhi, cosPhi, e); + } + + // ============================================================================================ + // numerics.md row 4: AuthalicLat replaces authset/authlat. The largest visible accuracy delta + // in the whole table (up to 1.6 mm on laea/aea/cea/eqearth/nzmg), so the speed result matters + // less here than knowing it is not a regression. + // ============================================================================================ + + @Benchmark + public double legacyQsfn() { + return ProjectionMath.qsfn(sinPhi, e, oneEs); + } + + @Benchmark + public double karneyAuthalicForward() { + return authalicLat.forward(phi, sinPhi, cosPhi); + } + + @Benchmark + public double legacyAuthlat() { + return ProjectionMath.authlat(legacyBeta, apa); + } + + @Benchmark + public double karneyAuthalicInverse() { + return authalicLat.inverse(karneyBeta); + } + + // ============================================================================================ + // numerics.md row 14: purge Math.hypot. Kept here as well as in MathDispatchBenchmark because + // MathHelpers.norm2 is the specific replacement core calls, and its cost relative to the + // solvers above is what decides whether row 14 is worth doing at a given site. + // ============================================================================================ + + @Benchmark + public double mathHypot() { + return Math.hypot(sinPhi, cosPhi); + } + + @Benchmark + public double mathHelpersNorm2() { + return MathHelpers.norm2(sinPhi, cosPhi); + } + + @Benchmark + public double mathHelpersAsinh() { + return MathHelpers.asinh(sinPhi); + } + + @Benchmark + public double mathHelpersAtanh() { + // atanh's domain is (-1, 1); sinPhi reaches 1.0 exactly only at 90 deg, which is not sampled. + return MathHelpers.atanh(sinPhi * 0.9); + } + + // ============================================================================================ + // Single-arm subjects: no legacy counterpart exists, so these establish a first baseline. + // ============================================================================================ + + /** + * {@code adams.cpp}'s {@code ell_int_5} Chebyshev series. Ported verbatim, including its 0.42 m + * error, because the ~3,400 gie values for the Adams family were generated by it - see the + * skill's non-negotiable 7. Measured so that a future "improvement" shows up as a cost as well + * as a conformance break. + */ + @Benchmark + public double ellipticIntegralEllInt5() { + return EllipticIntegral.ellInt5(phi); + } + + /** + * {@code generic_inverse.cpp}'s Newton solver with finite-difference Jacobian refresh. Reached + * by the whole Adams family, {@code wink2} and {@code cass}. Bounded at 15 iterations, so its + * worst case is bounded - but it is roughly two orders of magnitude above a closed-form inverse + * and that ratio is what justifies never putting it on a hot path. + */ + @Benchmark + public ProjCoordinate genericInverse2D() { + return GenericInverse2D.solve(solverTargetX, solverTargetY, sinusoidalForward, + 0.0, 0.0, 1e-10, solverOut); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/TransformCacheBenchmark.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/TransformCacheBenchmark.java new file mode 100644 index 0000000..e48fb48 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/TransformCacheBenchmark.java @@ -0,0 +1,228 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark; + +import java.util.concurrent.TimeUnit; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.util.CRSCache; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.Warmup; + +/** + * The caching layer: what a hit costs, what a miss costs, and what the two candidate cache keys + * cost. + * + *

The consumer caches one {@code CoordinateTransform} and shares it across executor threads, so + * in steady state it is on the hit path essentially always. The numbers that matter are therefore + * the ratio of hit to miss (which is how much the cache is worth) and the absolute + * cost of the key comparison (which is pure overhead on every hit). + * + *

{@code reference/performance.md} prescribes keying the transform cache on the canonical + * string pair rather than on CRS object equality, for two reasons: {@code String.hashCode} is + * cached in the object so a repeat lookup is a field read, and it sidesteps the + * {@code Projection.equals}/{@code hashCode} defects entirely. {@link #objectKeyLookup} and + * {@link #stringPairKeyLookup} are the head-to-head for that decision, run in the same fork so the + * ratio is meaningful. + * + *

Two things are deliberately not benchmarked, and the reasons are the findings: + *

    + *
  1. An unbounded miss stream. {@code util/CRSCache} was an unbounded + * {@code ConcurrentHashMap} keyed on user-supplied strings, so a benchmark that fed it a + * distinct key per invocation would grow the map until the fork died. That is exactly the OOM + * vector {@code performance.md} identifies for untrusted per-row input; a benchmark that + * demonstrates it by crashing is not a benchmark, and the fix is a correctness change, not a + * performance one. The bound landed in Stage D - access-ordered LRU, default 1,024 + * entries per key space via {@code -Dproj4j.crsCache.maxEntries} (note: not the + * {@code proj4j.crsCacheSize} the old text here proposed) - so an eviction-pressure arm is + * now possible and is the obvious next addition.
  2. + *
  3. A failing lookup. THE OLD TEXT HERE WAS WRONG AND IS CORRECTED. It said + * {@code CRSCache} "memoises {@code null} on {@code IOException}", making the second lookup of + * a transiently failed code "a fast wrong answer". It did not memoise anything. + * {@code ConcurrentHashMap.computeIfAbsent} installs no mapping when its function + * returns {@code null}, so every failing lookup re-ran the entire 888 KB dictionary scan, for + * ever - the opposite defect from the one described, and the claim was wrong in the direction + * that makes a defect sound handled. Today: an {@code IOException} is still not memoised, a + * successful {@code null} is, and construction failures are removed from the map and + * rethrown.
  4. + *
+ * + *

There is no transform-level cache in proj4j today - {@code CoordinateTransformFactory} + * constructs a new {@code BasicCoordinateTransform} on every call. {@link #createTransformUncached} + * is what a transform cache would eliminate, and is the target for the {@code TransformCache.get} + * that {@code performance.md}'s serialisation design already assumes exists. + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 3, jvmArgsAppend = {"-XX:+UseSerialGC"}) +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +public class TransformCacheBenchmark { + + private static final String SRC = "EPSG:4326"; + private static final String TGT = "EPSG:32633"; + + private CRSCache crsCache; + private CRSFactory crsFactory; + private CoordinateTransformFactory transformFactory; + + private CoordinateReferenceSystem src; + private CoordinateReferenceSystem tgt; + + /** A structurally equal but distinct instance, so equality cannot short-circuit on identity. */ + private CoordinateReferenceSystem srcCopy; + private CoordinateReferenceSystem tgtCopy; + + private java.util.Map stringKeyedCache; + private java.util.Map objectKeyedCache; + private String stringKey; + private CrsKey objectKey; + + @Setup(Level.Trial) + public void setUp() { + crsFactory = new CRSFactory(); + transformFactory = new CoordinateTransformFactory(); + crsCache = new CRSCache(); + + src = crsFactory.createFromName(SRC); + tgt = crsFactory.createFromName(TGT); + srcCopy = crsFactory.createFromName(SRC); + tgtCopy = crsFactory.createFromName(TGT); + + // Warm the CRS cache so cacheHit really is a hit. + crsCache.createFromName(SRC); + crsCache.createFromName(TGT); + + CoordinateTransform transform = transformFactory.createTransform(src, tgt); + + stringKey = SRC + '|' + TGT; + stringKeyedCache = new java.util.HashMap<>(); + stringKeyedCache.put(stringKey, transform); + + objectKey = new CrsKey(src, tgt); + objectKeyedCache = new java.util.HashMap<>(); + objectKeyedCache.put(objectKey, transform); + } + + /** Steady state: the cache hit the consumer is on essentially always. */ + @Benchmark + public CoordinateReferenceSystem crsCacheHit() { + return crsCache.createFromName(SRC); + } + + /** + * The miss, i.e. the full 888 KB init-file scan and parse. The ratio against + * {@link #crsCacheHit} is what the CRS cache is worth; {@code performance.md} estimates + * 10-1000x, and this is where that number comes from. + */ + @Benchmark + public CoordinateReferenceSystem crsCacheMissEquivalent() { + return crsFactory.createFromName(SRC); + } + + /** What a transform cache would remove. There is no such cache today. */ + @Benchmark + public CoordinateTransform createTransformUncached() { + return transformFactory.createTransform(src, tgt); + } + + /** + * Object-keyed lookup: a {@code hashCode} over both CRSs' projections, datums and ellipsoids + * followed by a full {@code equals}. Uses the distinct-but-equal copies so the comparison cannot + * exit on reference identity - which is the realistic case, because a caller who had the + * identical instances would already have the transform. + */ + @Benchmark + public CoordinateTransform objectKeyLookup() { + return objectKeyedCache.get(new CrsKey(srcCopy, tgtCopy)); + } + + /** + * String-pair-keyed lookup, as prescribed. {@code String.hashCode} is memoised in the object, so + * a repeat lookup on the same key is a field read plus a length-prefixed compare. + */ + @Benchmark + public CoordinateTransform stringPairKeyLookup() { + return stringKeyedCache.get(stringKey); + } + + /** + * The key construction cost alone, separated out because in the string design the key is built + * once per geometry and in the object design it is the CRS pair the caller already holds. + */ + @Benchmark + public String buildStringKey() { + return SRC + '|' + TGT; + } + + /** Isolates {@code CoordinateReferenceSystem.hashCode}, which descends into the projection. */ + @Benchmark + public int crsHashCode() { + return src.hashCode() * 31 + tgt.hashCode(); + } + + /** Isolates {@code CoordinateReferenceSystem.equals} on distinct-but-equal instances. */ + @Benchmark + public boolean crsEquals() { + return src.equals(srcCopy) && tgt.equals(tgtCopy); + } + + /** + * A cache key over a CRS pair, kept here rather than in core: this is the shape being evaluated, + * not the shape being shipped. + */ + private static final class CrsKey { + private final CoordinateReferenceSystem source; + private final CoordinateReferenceSystem target; + private final int hash; + + CrsKey(CoordinateReferenceSystem source, CoordinateReferenceSystem target) { + this.source = source; + this.target = target; + this.hash = source.hashCode() * 31 + target.hashCode(); + } + + @Override + public int hashCode() { + return hash; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CrsKey)) { + return false; + } + CrsKey other = (CrsKey) o; + return source.equals(other.source) && target.equals(other.target); + } + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingClassLoader.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingClassLoader.java new file mode 100644 index 0000000..e08565b --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingClassLoader.java @@ -0,0 +1,267 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.counting; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Loads {@code org.locationtech.proj4j} classes with {@code java.lang.Math} and + * {@code java.lang.StrictMath} call sites redirected to {@link CountingMath} and + * {@link CountingStrictMath}, so Tier 2 can count transcendentals per transform without a single + * line of instrumentation in {@code core}. + * + *

Why a class loader, and not the obvious alternatives

+ *
    + *
  • A facade in {@code core} would put a counter increment on the hot path of a published + * library. Non-starter, and {@code reference/performance.md} says "test-only" for this reason.
  • + *
  • A {@code java.lang.instrument} agent or an ASM transformer would work, but adds a + * bytecode-library dependency and an agent-attach step to a gate that has to run on every PR.
  • + *
  • Source-level counting (a script that greps for {@code Math.} calls) counts call + * sites, not calls. The interesting regressions are extra iterations, which no + * static count can see.
  • + *
+ * + *

How the rewrite works, and why it is safe

+ * + *

A class file's constant pool contains the referenced class names as {@code CONSTANT_Utf8_info} + * entries. Replacing {@code "java/lang/Math"} with this module's counting class's internal name is the + * entire transformation: the {@code CONSTANT_Class_info} that points at it, the + * {@code CONSTANT_Methodref_info} that points at that, and every {@code invokestatic} index in the + * bytecode are all unchanged, because no constant pool entry is added or removed. + * + *

Changing a UTF8 entry's length is safe too, which is what makes this a dozen lines rather + * than a hundred. Nothing in a class file stores an absolute offset - every structure is either + * length-prefixed or fixed-width, and the constant pool is not nested inside any attribute, so no + * {@code attribute_length} covers it. Attributes reference the pool only by 2-byte index, and those + * indices do not move. So the replacement name does not need to be padded to fourteen characters. + * + *

The one false-positive case, stated so nobody has to find it the hard way: a UTF8 entry is + * a UTF8 entry, so a class containing the string literal {@code "java/lang/Math"} would have + * that literal rewritten too. No class in {@code core} does, it would be harmless if one did (the + * string is only ever used in a message), and detecting the difference would require parsing the whole + * pool graph to see which entries are reachable from a {@code CONSTANT_Class_info}. Not worth it; + * documented instead. + * + *

Loader topology

+ * + *

Child-first for {@code org.locationtech.proj4j.*}, except + * {@code org.locationtech.proj4j.benchmark.*}, which is delegated to the parent. That exception is + * load-bearing: it means there is exactly one copy of {@link OpCounters}, owned by the parent, + * so the recorder can read the tallies as ordinary static state instead of reflecting into a second + * copy of the class. + * + *

Consequences the caller has to live with: + *

    + *
  • Core classes loaded here are not assignable to the same-named classes on the app class + * path. {@link OpCountRecorder} therefore drives them reflectively. That cost is paid once per + * transform in a run that performs one transform per CRS pair, so it is irrelevant.
  • + *
  • Resources are not overridden, so {@code proj4/nad/epsg} and {@code ntv1_can.dat} resolve + * through the parent as usual and the init files are found normally.
  • + *
  • {@code core}'s static singletons ({@code Registry}, the {@code Datum} constants) are + * re-initialised in this loader. Class initialisation calls transcendentals - the {@code Datum} + * and {@code Ellipsoid} constants alone do - so {@link OpCountRecorder} performs a throwaway + * transform before resetting the counters. Without that, the first pair measured would carry all + * of static init and the counts would depend on enum declaration order.
  • + *
+ */ +public final class CountingClassLoader extends ClassLoader { + + private static final String MATH = "java/lang/Math"; + private static final String STRICT_MATH = "java/lang/StrictMath"; + + private static final String COUNTING_MATH = internalName(CountingMath.class); + private static final String COUNTING_STRICT_MATH = internalName(CountingStrictMath.class); + + /** Loaded child-first and rewritten. */ + private static final String REWRITE_PREFIX = "org.locationtech.proj4j."; + + /** + * Delegated to the parent even though it matches {@link #REWRITE_PREFIX}. Keeps {@link OpCounters} + * a singleton and keeps the benchmark and gate classes on one side of the loader boundary. + */ + private static final String DELEGATE_PREFIX = "org.locationtech.proj4j.benchmark."; + + private int rewrittenClasses; + private int rewrittenReferences; + + public CountingClassLoader(ClassLoader parent) { + super(parent); + } + + /** Uses this class's own loader as the parent, which is the normal case. */ + public static CountingClassLoader create() { + return new CountingClassLoader(CountingClassLoader.class.getClassLoader()); + } + + /** How many {@code core} classes were defined by this loader. Zero means the rewrite did nothing. */ + public int rewrittenClasses() { + return rewrittenClasses; + } + + /** How many {@code Math}/{@code StrictMath} constant-pool references were redirected. */ + public int rewrittenReferences() { + return rewrittenReferences; + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + synchronized (getClassLoadingLock(name)) { + Class loaded = findLoadedClass(name); + if (loaded == null && shouldRewrite(name)) { + byte[] original = readClassBytes(name); + if (original != null) { + byte[] rewritten = rewriteConstantPool(original); + loaded = defineClass(name, rewritten, 0, rewritten.length); + rewrittenClasses++; + } + } + if (loaded == null) { + loaded = super.loadClass(name, false); + } + if (resolve) { + resolveClass(loaded); + } + return loaded; + } + } + + private static boolean shouldRewrite(String name) { + return name.startsWith(REWRITE_PREFIX) && !name.startsWith(DELEGATE_PREFIX); + } + + private byte[] readClassBytes(String name) { + String resource = name.replace('.', '/') + ".class"; + // Read through the parent's resource path rather than defining from our own URLs: the parent + // already has core and epsg on its class path, and reading a resource does not cause the parent + // to *define* the class, which is the thing that would defeat child-first loading. + try (InputStream in = getParent().getResourceAsStream(resource)) { + if (in == null) { + return null; + } + ByteArrayOutputStream buffer = new ByteArrayOutputStream(16384); + byte[] chunk = new byte[8192]; + int read; + while ((read = in.read(chunk)) != -1) { + buffer.write(chunk, 0, read); + } + return buffer.toByteArray(); + } catch (IOException e) { + throw new IllegalStateException("Could not read " + resource, e); + } + } + + /** + * Walks the constant pool and rewrites the two class-name UTF8 entries. + * + *

Only the pool is parsed; everything after it is copied verbatim. Long and Double entries + * occupy two pool slots, which is the one asymmetry in the format and the classic way to get this + * loop wrong. + */ + byte[] rewriteConstantPool(byte[] cf) { + if (cf.length < 10 || u4(cf, 0) != 0xCAFEBABEL) { + throw new IllegalArgumentException("Not a class file"); + } + final int poolCount = u2(cf, 8); + + ByteArrayOutputStream out = new ByteArrayOutputStream(cf.length + 64); + out.write(cf, 0, 10); + + int p = 10; + for (int index = 1; index < poolCount; index++) { + final int tag = cf[p] & 0xFF; + switch (tag) { + case 1: { // CONSTANT_Utf8 + int len = u2(cf, p + 1); + String text = new String(cf, p + 3, len, java.nio.charset.StandardCharsets.UTF_8); + String replacement = replacementFor(text); + if (replacement != null) { + byte[] bytes = replacement.getBytes(java.nio.charset.StandardCharsets.UTF_8); + out.write(1); + out.write(bytes.length >>> 8); + out.write(bytes.length & 0xFF); + out.write(bytes, 0, bytes.length); + rewrittenReferences++; + } else { + out.write(cf, p, 3 + len); + } + p += 3 + len; + break; + } + case 7: // Class + case 8: // String + case 16: // MethodType + case 19: // Module + case 20: // Package + out.write(cf, p, 3); + p += 3; + break; + case 15: // MethodHandle + out.write(cf, p, 4); + p += 4; + break; + case 3: // Integer + case 4: // Float + case 9: // Fieldref + case 10: // Methodref + case 11: // InterfaceMethodref + case 12: // NameAndType + case 17: // Dynamic + case 18: // InvokeDynamic + out.write(cf, p, 5); + p += 5; + break; + case 5: // Long + case 6: // Double + out.write(cf, p, 9); + p += 9; + index++; // occupies two pool slots + break; + default: + throw new IllegalStateException("Unknown constant pool tag " + tag + + " at entry " + index + "; this JDK's class file format is newer than " + + "CountingClassLoader knows about. Add the tag's width above."); + } + } + + out.write(cf, p, cf.length - p); + return out.toByteArray(); + } + + private static String replacementFor(String utf8) { + if (MATH.equals(utf8)) { + return COUNTING_MATH; + } + if (STRICT_MATH.equals(utf8)) { + return COUNTING_STRICT_MATH; + } + return null; + } + + private static String internalName(Class c) { + return c.getName().replace('.', '/'); + } + + private static int u2(byte[] b, int off) { + return ((b[off] & 0xFF) << 8) | (b[off + 1] & 0xFF); + } + + private static long u4(byte[] b, int off) { + return ((long) (b[off] & 0xFF) << 24) | ((b[off + 1] & 0xFF) << 16) + | ((b[off + 2] & 0xFF) << 8) | (b[off + 3] & 0xFF); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingMath.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingMath.java new file mode 100644 index 0000000..0819b08 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingMath.java @@ -0,0 +1,226 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.counting; + +import org.locationtech.proj4j.benchmark.counting.OpCounters.Op; + +/** + * A drop-in stand-in for {@code java.lang.Math} that tallies transcendental calls, used only by + * {@link CountingClassLoader}. + * + *

How this is reached. {@link CountingClassLoader} rewrites the string + * {@code "java/lang/Math"} in the constant pool of every {@code org.locationtech.proj4j} class it + * loads into this class's internal name. Nothing in {@code core} references this file, at compile time + * or otherwise - which is the whole point. {@code reference/performance.md} calls for a + * test-only facade, and a facade that lived in {@code core} would put a counter increment on + * the hot path of a published library, which is exactly the kind of thing the rest of that document + * exists to prevent. + * + *

Every method here must have the same name and descriptor as the {@code java.lang.Math} method + * it stands in for, because the rewrite changes only the class name; the {@code NameAndType} + * entries are untouched. So the surface below is the union of what {@code core} calls today plus a + * margin. If someone adds a call to a {@code Math} method that is not here, the counting run fails + * with a {@code NoSuchMethodError} naming it - loudly, only in the gate, and never in production. The + * fix is one delegating method here. + * + *

Values are delegated faithfully to {@code java.lang.Math}, and that matters more than it + * looks: several core routines are fixed-point iterations whose trip count depends on the value + * returned, so a facade that quietly substituted {@code StrictMath} would change the counts it is + * supposed to be measuring. {@link CountingStrictMath} exists as a separate class for the same reason, + * so that a {@code StrictMath} call site is still counted and still evaluated by + * {@code StrictMath}. + * + *

Timings taken under the counting loader are meaningless. Routing {@code Math.sin} through + * a static forwarder defeats the {@code @IntrinsicCandidate} substitution, so an instrumented run is + * several times slower than the real thing. Tier 2 measures counts, Tier 1 and Tier 3 measure the + * uninstrumented code. Never quote a number from an instrumented run as a timing. + */ +public final class CountingMath { + + public static final double PI = Math.PI; + public static final double E = Math.E; + + private CountingMath() { + } + + // ============================================================================================ + // Counted: the ten from reference/performance.md. + // ============================================================================================ + + public static double sin(double a) { + OpCounters.bump(Op.SIN); + return Math.sin(a); + } + + public static double cos(double a) { + OpCounters.bump(Op.COS); + return Math.cos(a); + } + + public static double tan(double a) { + OpCounters.bump(Op.TAN); + return Math.tan(a); + } + + public static double pow(double a, double b) { + OpCounters.bump(Op.POW); + return Math.pow(a, b); + } + + public static double exp(double a) { + OpCounters.bump(Op.EXP); + return Math.exp(a); + } + + public static double log(double a) { + OpCounters.bump(Op.LOG); + return Math.log(a); + } + + public static double atan(double a) { + OpCounters.bump(Op.ATAN); + return Math.atan(a); + } + + public static double atan2(double y, double x) { + OpCounters.bump(Op.ATAN2); + return Math.atan2(y, x); + } + + public static double sqrt(double a) { + OpCounters.bump(Op.SQRT); + return Math.sqrt(a); + } + + public static double hypot(double x, double y) { + OpCounters.bump(Op.HYPOT); + return Math.hypot(x, y); + } + + // ============================================================================================ + // Counted: the extras. + // ============================================================================================ + + public static double asin(double a) { + OpCounters.bump(Op.ASIN); + return Math.asin(a); + } + + public static double acos(double a) { + OpCounters.bump(Op.ACOS); + return Math.acos(a); + } + + public static double log10(double a) { + OpCounters.bump(Op.LOG10); + return Math.log10(a); + } + + public static double sinh(double a) { + OpCounters.bump(Op.SINH); + return Math.sinh(a); + } + + public static double cosh(double a) { + OpCounters.bump(Op.COSH); + return Math.cosh(a); + } + + public static double log1p(double a) { + OpCounters.bump(Op.LOG1P); + return Math.log1p(a); + } + + public static double cbrt(double a) { + OpCounters.bump(Op.CBRT); + return Math.cbrt(a); + } + + public static double expm1(double a) { + OpCounters.bump(Op.EXPM1); + return Math.expm1(a); + } + + public static double tanh(double a) { + OpCounters.bump(Op.TANH); + return Math.tanh(a); + } + + // ============================================================================================ + // Uncounted pass-throughs. Exact operations (guaranteed bit-reproducible per + // reference/numerics.md) plus the handful of integer helpers, present only so that a class that + // also calls one of these still links after the rewrite. + // ============================================================================================ + + public static double abs(double a) { return Math.abs(a); } + public static float abs(float a) { return Math.abs(a); } + public static int abs(int a) { return Math.abs(a); } + public static long abs(long a) { return Math.abs(a); } + + public static double max(double a, double b) { return Math.max(a, b); } + public static float max(float a, float b) { return Math.max(a, b); } + public static int max(int a, int b) { return Math.max(a, b); } + public static long max(long a, long b) { return Math.max(a, b); } + + public static double min(double a, double b) { return Math.min(a, b); } + public static float min(float a, float b) { return Math.min(a, b); } + public static int min(int a, int b) { return Math.min(a, b); } + public static long min(long a, long b) { return Math.min(a, b); } + + public static double floor(double a) { return Math.floor(a); } + public static double ceil(double a) { return Math.ceil(a); } + public static double rint(double a) { return Math.rint(a); } + public static long round(double a) { return Math.round(a); } + public static int round(float a) { return Math.round(a); } + + public static double copySign(double magnitude, double sign) { return Math.copySign(magnitude, sign); } + public static float copySign(float magnitude, float sign) { return Math.copySign(magnitude, sign); } + public static double signum(double d) { return Math.signum(d); } + public static float signum(float f) { return Math.signum(f); } + + public static double toRadians(double angdeg) { return Math.toRadians(angdeg); } + public static double toDegrees(double angrad) { return Math.toDegrees(angrad); } + + public static double IEEEremainder(double f1, double f2) { return Math.IEEEremainder(f1, f2); } + + public static double ulp(double d) { return Math.ulp(d); } + public static float ulp(float f) { return Math.ulp(f); } + public static double nextUp(double d) { return Math.nextUp(d); } + public static double nextDown(double d) { return Math.nextDown(d); } + public static double nextAfter(double start, double direction) { return Math.nextAfter(start, direction); } + public static double scalb(double d, int scaleFactor) { return Math.scalb(d, scaleFactor); } + public static int getExponent(double d) { return Math.getExponent(d); } + + public static int floorDiv(int x, int y) { return Math.floorDiv(x, y); } + public static int floorMod(int x, int y) { return Math.floorMod(x, y); } + public static long floorDiv(long x, long y) { return Math.floorDiv(x, y); } + public static long floorMod(long x, long y) { return Math.floorMod(x, y); } + public static int toIntExact(long value) { return Math.toIntExact(value); } + public static int addExact(int x, int y) { return Math.addExact(x, y); } + public static int subtractExact(int x, int y) { return Math.subtractExact(x, y); } + public static int multiplyExact(int x, int y) { return Math.multiplyExact(x, y); } + + /** + * Present for linkage only. {@code reference/numerics.md} says do not use + * {@code Math.fma} - on hardware without FMA it falls back to a {@code BigDecimal} path, and + * it changes results via single rounding, which collides with the determinism requirement. If the + * counting run ever reports a call reaching this method, that is a defect in {@code core}, not in + * the gate. + */ + public static double fma(double a, double b, double c) { return Math.fma(a, b, c); } + + public static double random() { return Math.random(); } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingStrictMath.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingStrictMath.java new file mode 100644 index 0000000..4c4c39e --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/CountingStrictMath.java @@ -0,0 +1,209 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.counting; + +import org.locationtech.proj4j.benchmark.counting.OpCounters.Op; + +/** + * The {@code java.lang.StrictMath} counterpart of {@link CountingMath}: same counters, but values + * delegated to {@code StrictMath} so a {@code StrictMath} call site keeps its exact result. + * + *

Why this is a separate class and not a flag on {@link CountingMath}. The rewrite replaces + * a class name in the constant pool, so by the time the call happens there is no way to know + * which of the two the source wrote. Mapping both to one facade would force a single delegation + * target, and delegating a {@code StrictMath.log1p} call to {@code Math.log1p} can change the result + * by an ulp. That sounds harmless until it lands in one of core's fixed-point iterations, where an ulp + * changes the trip count - and a trip count is exactly what Tier 2 measures. Two facades keeps + * the instrumented run's arithmetic bit-identical to the uninstrumented run's, which is the only way + * the counts describe the real code. + * + *

The counted methods delegate to {@code StrictMath}. The uncounted ones delegate to + * {@code Math}, deliberately: {@code abs}, {@code floor}, {@code ceil}, {@code rint}, + * {@code copySign}, {@code max}, {@code min} and {@code sqrt} are exactly-rounded and therefore + * bit-identical between the two ({@code reference/numerics.md}, "Guaranteed bit-reproducible + * everywhere"), and routing them through {@code Math} avoids depending on which JDK version added + * which {@code StrictMath} overload. + * + *

{@code sqrt} is an exception to that rule: it is exact, so its value is delegated to + * {@code Math}, but it is still counted, because a change in the number of square roots per + * transform is an algorithmic change worth catching. + */ +public final class CountingStrictMath { + + public static final double PI = StrictMath.PI; + public static final double E = StrictMath.E; + + private CountingStrictMath() { + } + + // ============================================================================================ + // Counted. Values from StrictMath, so the instrumented run is bit-identical to the real one. + // ============================================================================================ + + public static double sin(double a) { + OpCounters.bump(Op.SIN); + return StrictMath.sin(a); + } + + public static double cos(double a) { + OpCounters.bump(Op.COS); + return StrictMath.cos(a); + } + + public static double tan(double a) { + OpCounters.bump(Op.TAN); + return StrictMath.tan(a); + } + + public static double pow(double a, double b) { + OpCounters.bump(Op.POW); + return StrictMath.pow(a, b); + } + + public static double exp(double a) { + OpCounters.bump(Op.EXP); + return StrictMath.exp(a); + } + + public static double log(double a) { + OpCounters.bump(Op.LOG); + return StrictMath.log(a); + } + + public static double atan(double a) { + OpCounters.bump(Op.ATAN); + return StrictMath.atan(a); + } + + public static double atan2(double y, double x) { + OpCounters.bump(Op.ATAN2); + return StrictMath.atan2(y, x); + } + + /** Exact, so the value comes from {@code Math}; counted because the call count still matters. */ + public static double sqrt(double a) { + OpCounters.bump(Op.SQRT); + return Math.sqrt(a); + } + + public static double hypot(double x, double y) { + OpCounters.bump(Op.HYPOT); + return StrictMath.hypot(x, y); + } + + public static double asin(double a) { + OpCounters.bump(Op.ASIN); + return StrictMath.asin(a); + } + + public static double acos(double a) { + OpCounters.bump(Op.ACOS); + return StrictMath.acos(a); + } + + public static double log10(double a) { + OpCounters.bump(Op.LOG10); + return StrictMath.log10(a); + } + + public static double sinh(double a) { + OpCounters.bump(Op.SINH); + return StrictMath.sinh(a); + } + + public static double cosh(double a) { + OpCounters.bump(Op.COSH); + return StrictMath.cosh(a); + } + + public static double log1p(double a) { + OpCounters.bump(Op.LOG1P); + return StrictMath.log1p(a); + } + + public static double cbrt(double a) { + OpCounters.bump(Op.CBRT); + return StrictMath.cbrt(a); + } + + public static double expm1(double a) { + OpCounters.bump(Op.EXPM1); + return StrictMath.expm1(a); + } + + public static double tanh(double a) { + OpCounters.bump(Op.TANH); + return StrictMath.tanh(a); + } + + // ============================================================================================ + // Uncounted pass-throughs, via Math: exact in both, and version-independent. + // ============================================================================================ + + public static double abs(double a) { return Math.abs(a); } + public static float abs(float a) { return Math.abs(a); } + public static int abs(int a) { return Math.abs(a); } + public static long abs(long a) { return Math.abs(a); } + + public static double max(double a, double b) { return Math.max(a, b); } + public static float max(float a, float b) { return Math.max(a, b); } + public static int max(int a, int b) { return Math.max(a, b); } + public static long max(long a, long b) { return Math.max(a, b); } + + public static double min(double a, double b) { return Math.min(a, b); } + public static float min(float a, float b) { return Math.min(a, b); } + public static int min(int a, int b) { return Math.min(a, b); } + public static long min(long a, long b) { return Math.min(a, b); } + + public static double floor(double a) { return Math.floor(a); } + public static double ceil(double a) { return Math.ceil(a); } + public static double rint(double a) { return Math.rint(a); } + public static long round(double a) { return Math.round(a); } + public static int round(float a) { return Math.round(a); } + + public static double copySign(double magnitude, double sign) { return Math.copySign(magnitude, sign); } + public static float copySign(float magnitude, float sign) { return Math.copySign(magnitude, sign); } + public static double signum(double d) { return Math.signum(d); } + public static float signum(float f) { return Math.signum(f); } + + /** {@code StrictMath.toRadians}/{@code toDegrees} are plain multiplies; identical to {@code Math}. */ + public static double toRadians(double angdeg) { return Math.toRadians(angdeg); } + public static double toDegrees(double angrad) { return Math.toDegrees(angrad); } + + public static double IEEEremainder(double f1, double f2) { return StrictMath.IEEEremainder(f1, f2); } + + public static double ulp(double d) { return Math.ulp(d); } + public static float ulp(float f) { return Math.ulp(f); } + public static double nextUp(double d) { return Math.nextUp(d); } + public static double nextDown(double d) { return Math.nextDown(d); } + public static double nextAfter(double start, double direction) { return Math.nextAfter(start, direction); } + public static double scalb(double d, int scaleFactor) { return Math.scalb(d, scaleFactor); } + public static int getExponent(double d) { return Math.getExponent(d); } + + public static int floorDiv(int x, int y) { return Math.floorDiv(x, y); } + public static int floorMod(int x, int y) { return Math.floorMod(x, y); } + public static long floorDiv(long x, long y) { return Math.floorDiv(x, y); } + public static long floorMod(long x, long y) { return Math.floorMod(x, y); } + public static int toIntExact(long value) { return Math.toIntExact(value); } + public static int addExact(int x, int y) { return Math.addExact(x, y); } + public static int subtractExact(int x, int y) { return Math.subtractExact(x, y); } + public static int multiplyExact(int x, int y) { return Math.multiplyExact(x, y); } + + /** See {@link CountingMath#fma}: present for linkage only; core must not call it. */ + public static double fma(double a, double b, double c) { return Math.fma(a, b, c); } + + public static double random() { return StrictMath.random(); } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/OpCountRecorder.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/OpCountRecorder.java new file mode 100644 index 0000000..ed113c9 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/OpCountRecorder.java @@ -0,0 +1,155 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.counting; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.locationtech.proj4j.benchmark.CrsPair; + +/** + * Runs one transform per {@link CrsPair} under {@link CountingClassLoader} and returns the + * transcendental tallies. This is the measurement half of Tier 2; the comparison half is + * {@code GateChecker}. + * + *

Determinism, which is the entire value proposition. One transform, one pinned input point, + * counters zeroed immediately before. Nothing here samples, times, or averages, so two runs on two + * machines produce byte-identical output or one of them has a bug. That is what makes Tier 2 safe to + * block a PR on when Tier 3 is not. + * + *

Three specific things are done to keep it that way: + *

    + *
  1. One loader for the whole run. A fresh loader per pair would re-run {@code core}'s static + * initialisers each time and charge them to whichever pair went first.
  2. + *
  3. A throwaway transform before every measurement. Absorbs class initialisation, the + * init-file scan, grid loading and any first-call lazy work. Without it the counts would depend + * on enum declaration order, which is an absurd thing for a gate to depend on.
  4. + *
  5. The transform is built before the counters are reset. CRS construction calls + * transcendentals (ellipsoid derivation, {@code initialize()}); those are per-transform, not + * per-point, and folding them in would mask a per-point regression behind a large constant.
  6. + *
+ */ +public final class OpCountRecorder { + + private OpCountRecorder() { + } + + /** Per-pair tallies, insertion-ordered by {@link CrsPair} declaration order. */ + public static final class Result { + private final Map countsByPair; + private final int rewrittenClasses; + private final int rewrittenReferences; + + Result(Map countsByPair, int rewrittenClasses, int rewrittenReferences) { + this.countsByPair = countsByPair; + this.rewrittenClasses = rewrittenClasses; + this.rewrittenReferences = rewrittenReferences; + } + + /** Keyed by {@link CrsPair#name()}; values indexed by {@link OpCounters.Op#ordinal()}. */ + public Map countsByPair() { + return countsByPair; + } + + public int rewrittenClasses() { + return rewrittenClasses; + } + + public int rewrittenReferences() { + return rewrittenReferences; + } + + public long total() { + long sum = 0; + for (long[] counts : countsByPair.values()) { + for (long c : counts) { + sum += c; + } + } + return sum; + } + } + + public static Result recordAll() { + CountingClassLoader loader = CountingClassLoader.create(); + Map byPair = new LinkedHashMap<>(); + + try { + Class crsFactoryClass = loader.loadClass("org.locationtech.proj4j.CRSFactory"); + Class transformFactoryClass = + loader.loadClass("org.locationtech.proj4j.CoordinateTransformFactory"); + Class crsClass = loader.loadClass("org.locationtech.proj4j.CoordinateReferenceSystem"); + Class transformClass = loader.loadClass("org.locationtech.proj4j.CoordinateTransform"); + Class coordClass = loader.loadClass("org.locationtech.proj4j.ProjCoordinate"); + + Object crsFactory = crsFactoryClass.getDeclaredConstructor().newInstance(); + Object transformFactory = transformFactoryClass.getDeclaredConstructor().newInstance(); + + Method createFromName = crsFactoryClass.getMethod("createFromName", String.class); + Method createTransform = + transformFactoryClass.getMethod("createTransform", crsClass, crsClass); + Method transform = transformClass.getMethod("transform", coordClass, coordClass); + Constructor coordCtor = + coordClass.getConstructor(double.class, double.class, double.class); + Constructor emptyCoordCtor = coordClass.getConstructor(); + + for (CrsPair pair : CrsPair.values()) { + Object source = createFromName.invoke(crsFactory, pair.sourceCode()); + Object target = createFromName.invoke(crsFactory, pair.targetCode()); + Object ct = createTransform.invoke(transformFactory, source, target); + + Object in = coordCtor.newInstance(pair.x(), pair.y(), pair.z()); + Object out = emptyCoordCtor.newInstance(); + + // Throwaway: absorbs static init, the init-file scan and any first-call lazy work. + transform.invoke(ct, in, out); + + OpCounters.reset(); + transform.invoke(ct, in, out); + byPair.put(pair.name(), OpCounters.snapshot()); + } + } catch (ReflectiveOperationException e) { + throw new IllegalStateException( + "Tier 2 could not drive core through the counting class loader. If this is a " + + "NoSuchMethodException on a java.lang.Math method, add a delegating method of " + + "that exact name and descriptor to CountingMath (and CountingStrictMath) - see " + + "their class comments.", e); + } + + Result result = new Result(byPair, loader.rewrittenClasses(), loader.rewrittenReferences()); + + // The dangerous failure mode is a rewrite that silently did nothing: every count would be + // zero, every comparison would trivially match, and Tier 2 would pass forever while measuring + // nothing. Refuse to return such a result. + if (result.rewrittenReferences() == 0) { + throw new IllegalStateException( + "CountingClassLoader redirected 0 Math/StrictMath references across " + + result.rewrittenClasses() + " classes. The bytecode rewrite is not taking " + + "effect, so Tier 2 is measuring nothing. Check that core is on the classpath as " + + "class files or a jar readable through the parent loader."); + } + if (result.total() == 0) { + throw new IllegalStateException( + "CountingClassLoader redirected " + result.rewrittenReferences() + + " references but recorded 0 calls across all " + CrsPair.values().length + + " pairs. Either core no longer calls Math on the transform path (implausible) or " + + "the transform is being resolved from the parent loader."); + } + return result; + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/OpCounters.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/OpCounters.java new file mode 100644 index 0000000..ca4d21b --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/counting/OpCounters.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.counting; + +/** + * The tally behind Tier 2. A flat {@code long[]} indexed by {@link Op#ordinal()}. + * + *

Plain (non-{@code volatile}, non-atomic) counters, on purpose. The counting run is + * single-threaded by construction - {@link OpCountRecorder} performs exactly one transform between a + * reset and a snapshot - and an {@code AtomicLong} per operation would add a contended CAS to every + * transcendental, which would not change the counts but would make the instrumented run slow enough + * that people stop running it. Never call this from a multi-threaded benchmark; the numbers + * would be lossy and Tier 2 would flake, which is precisely the property it exists not to have. + */ +public final class OpCounters { + + /** + * The counted operations. + * + *

The first ten are the set {@code reference/performance.md} names for Tier 2: + * {@code sin/cos/tan/pow/exp/log/atan/atan2/sqrt/hypot}. The rest are counted as well because + * they are equally deterministic and cost nothing extra to tally, and because two of them matter + * for specific rows of {@code reference/numerics.md}: {@code log1p} and {@code sinh} are what the + * {@code tsfn} and {@code ConformalLat} rewrites trade {@code pow} and {@code tan} for, so a + * gate that counted only the ten would see the saving and not the cost. + * + *

Ordinal order is the wire format. {@code baseline/op-counts.json} is keyed by name, + * not position, so inserting a constant in the middle is safe for the JSON - but do it at the end + * anyway, so that a diff of the baseline file stays readable. + */ + public enum Op { + // The ten named in reference/performance.md. + SIN, COS, TAN, POW, EXP, LOG, ATAN, ATAN2, SQRT, HYPOT, + // Equally deterministic, and load-bearing for the numerics.md rewrites. + ASIN, ACOS, LOG10, SINH, COSH, LOG1P, CBRT, EXPM1, TANH; + + static final Op[] VALUES = values(); + } + + static final long[] COUNTS = new long[Op.VALUES.length]; + + private OpCounters() { + } + + static void bump(Op op) { + COUNTS[op.ordinal()]++; + } + + /** Zeroes every counter. Call immediately before the single transform being measured. */ + public static void reset() { + java.util.Arrays.fill(COUNTS, 0L); + } + + /** A defensive copy of the current tallies, indexed by {@link Op#ordinal()}. */ + public static long[] snapshot() { + return COUNTS.clone(); + } + + public static long get(Op op) { + return COUNTS[op.ordinal()]; + } + + /** Sum of all counters. Used to detect a silently ineffective bytecode rewrite. */ + public static long total() { + long sum = 0; + for (long c : COUNTS) { + sum += c; + } + return sum; + } + + public static int opCount() { + return Op.VALUES.length; + } + + public static Op op(int ordinal) { + return Op.VALUES[ordinal]; + } + + /** Lower-case name, which is the key used in {@code baseline/op-counts.json}. */ + public static String key(Op op) { + return op.name().toLowerCase(java.util.Locale.ROOT); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/gate/GateChecker.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/gate/GateChecker.java new file mode 100644 index 0000000..577215d --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/gate/GateChecker.java @@ -0,0 +1,985 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.gate; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TreeMap; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +import org.locationtech.proj4j.benchmark.CrsPair; +import org.locationtech.proj4j.benchmark.counting.OpCountRecorder; +import org.locationtech.proj4j.benchmark.counting.OpCounters; + +/** + * The blocking performance gate: Tier 1 (allocation bytes per operation) and Tier 2 (deterministic + * transcendental-call counts). Exits non-zero on breach with a message naming the offending benchmark + * and the before/after figures. + * + *

Why these two tiers block and ns/op does not

+ * + *

Tier 1 - allocation. {@code -prof gc}'s {@code gc.alloc.rate.norm} is bytes per operation: + * total bytes allocated divided by operations performed. It is a property of the bytecode, not + * of the machine. The same jar reports the same number on a laptop, a shared CI runner and a container + * under memory pressure, because none of those change how many objects a method constructs. It does + * not flake, so it is safe to block on, and it catches precisely the regressions that matter here: + * a reintroduced {@code new double[1]} out-param, a {@code List} iterator on a per-point path, a boxing + * {@code Objects.hash} on the cache-lookup path. + * + *

Tier 2 - operation counts. Fully deterministic: one transform, one pinned input, integer + * counters. Two runs on two architectures agree exactly or one has a bug. It catches algorithmic + * regressions - a Newton loop that gained a trip, a closed form that reverted to an iteration, a + * {@code pow} reintroduced where an {@code exp} was - and, unlike a timing, it explains them: + * "{@code pow} went from 0 to 5" points at the cause, where "12% slower" points at nothing. It is also + * the only tier that can distinguish "the machine was busy" from "the algorithm changed". + * + *

Tier 3 - absolute ns/op - is deliberately not implemented here, and that is a design decision, + * not an omission. JMH on shared CI runners varies plus or minus 20-40%: no CPU pinning, no + * turbo control, noisy neighbours, and a scheduler that will move a fork mid-iteration. A gate with a + * 20-40% false-positive rate gets muted, then ignored, then deleted - historically within about a + * month - and its absence is then invisible. So timing lives on a nightly job on a dedicated runner + * (pinned CPU, turbo off, {@code performance} governor) and alerts only on a >10% regression + * sustained across three consecutive nights, which filters single-night noise. Where timing is used + * for a decision rather than an alert, the candidate and a fixed reference are run in the same JMH + * fork and the ratio is what is compared, so machine speed cancels - that is why + * {@code SolverBenchmark} and {@code BulkTransformBenchmark} keep their control arms in the same class. + * + *

The ratchet

+ * + *

Each Tier 1 rule carries two numbers. {@code targetBytesPerOp} is the policy: what the + * number should be once {@code reference/performance.md}'s work has landed (0 for every bulk method, 40 + * for single-point, 0 for {@code GridShiftBenchmark.inverseShift}). {@code maxBytesPerOp} is the + * ratchet: what it actually is today. The gate fails on exceeding the ratchet, warns + * while the ratchet is above the target, and reports when an observation comes in low enough that the + * ratchet can be tightened. + * + *

Asserting the target outright today would leave the gate red on {@code master}, and a permanently + * red gate is a disabled gate. Asserting only the ratchet gives a monotone approach to the target with + * no window in which a regression can slip through. The gap between the two columns is also a + * legible, reviewable to-do list. + * + *

Tier 1 exclusions: {@code tier1Gated: false}

+ * + *

An exclusion is a reduction in coverage, and this class is written so that it cannot read as a + * silent weakening. A rule with {@code "tier1Gated": false} still matches, still fails if it matches + * nothing (so a rename cannot un-gate it), and its arms are still measured, still recorded by + * {@code --record} and still printed on every run with their delta against the recorded figure - but a + * breach is reported, not blocked. The report says exactly that, in those words, in its own + * section and again in the final verdict line, on passing runs as well as failing ones. + * + *

Two things are mandatory on an excluded rule, and their absence is a hard error rather than a + * warning: + * + *

    + *
  • {@code exclusionReason} - prose in the baseline file saying what stops being gated and why. + * A commit message is not a substitute; nobody reads it a year later.
  • + *
  • {@code exclusionArmCount} - the number of arms the exclusion is expected to cover. If the + * pattern starts matching more (or fewer) arms than declared, the gate fails. An + * exclusion that over-matches is precisely how a gate quietly stops working, and pinning the + * count is the same device that caught a golden rule claiming 270 rows when it explained 95.
  • + *
+ * + *

Exclusion is per rule, not per measurement: an arm matched by an excluded rule and by + * some other, gated rule is still gated by that other rule. Two rules on one benchmark is an existing, + * deliberate pattern here (see {@code gridshift-dispatch-zero} and {@code allocation-gridshift-dispatch}), + * so the exclusion cannot be used to launder an arm out of a gate it also belongs to. + * + *

There are no exclusions today. No rule in {@code allocation-baseline.json} carries + * {@code tier1Gated: false}, and a run reports {@code 245 gated, 0 EXCLUDED}. This javadoc used to say + * "the only current exclusion is {@code crs-parse}"; that rule rejoined Tier 1 on 2026-08-02 + * when {@code io/InitFileCache} removed the per-call dictionary re-scan that made its allocation + * data-dependent, and {@code tier1Gated}, {@code exclusionArmCount} and {@code exclusionReason} were + * deleted from it together. The machinery above is therefore live and self-tested but unused — the + * user was removed, not the feature. The whole arc is in the "Coverage" section of + * {@code benchmark/README.md}, and the rule to carry forward is that an exclusion must be written with + * its own repayment condition, as that one was. + */ +public final class GateChecker { + + private static final String DEFAULT_ALLOC_BASELINE = "/baseline/allocation-baseline.json"; + private static final String DEFAULT_OP_COUNTS = "/baseline/op-counts.json"; + private static final String DEFAULT_BASELINE_DIR = "src/main/resources/baseline"; + + /** The sentinel for "not captured yet". */ + private static final String TBD = "TBD"; + + /** + * Slack on the allocation comparison. {@code gc.alloc.rate.norm} is a ratio of two sampled totals, + * so a genuinely non-allocating method sometimes reports 1e-4 rather than 0. Half a byte is three + * decimal orders below the 16-byte minimum object header, so no real allocation can hide under it. + */ + private static final double ALLOC_ABSOLUTE_SLACK_BYTES = 0.5; + + /** Proportional slack, for large ratchets where the sampling error scales. */ + private static final double ALLOC_RELATIVE_SLACK = 0.001; + + private final List failures = new ArrayList<>(); + private final List warnings = new ArrayList<>(); + private final List notes = new ArrayList<>(); + + /** + * Per-rule banners for Tier 1 exclusions, and the per-arm figures underneath them. Kept separate + * from {@link #notes} on purpose: a note is a passing observation, whereas every line here is a + * measurement that nothing is gating, and that has to be legible at a glance rather than + * buried in 160 lines of "at target". + */ + private final List exclusionBanners = new ArrayList<>(); + private final List exclusionRows = new ArrayList<>(); + private int excludedArms; + + public static void main(String[] args) { + try { + System.exit(new GateChecker().run(args)); + } catch (UsageException e) { + System.err.println("gate: " + e.getMessage()); + System.err.println(); + printUsage(System.err); + System.exit(2); + } catch (Exception e) { + System.err.println("gate: internal error"); + e.printStackTrace(System.err); + System.exit(2); + } + } + + int run(String[] args) throws IOException { + Options options = Options.parse(args); + if (options.help) { + printUsage(System.out); + return 0; + } + if (options.selfTest) { + return selfTest(); + } + + if (options.record) { + return record(options); + } + + System.out.println("proj4j performance gate"); + System.out.println("======================="); + + if (!options.skipTier1) { + checkAllocation(options); + } else { + notes.add("Tier 1 skipped by --skip-tier1."); + } + + if (!options.skipTier2) { + checkOpCounts(options); + } else { + notes.add("Tier 2 skipped by --skip-tier2."); + } + + return report(); + } + + // ============================================================================================ + // Tier 1 + // ============================================================================================ + + private void checkAllocation(Options options) throws IOException { + System.out.println(); + System.out.println("Tier 1 - allocation (bytes/op, blocking)"); + System.out.println("---------------------------------------"); + + if (options.jmhResult == null) { + failures.add("Tier 1 needs a JMH result file. Run the benchmarks with " + + "`-prof gc -rf json -rff jmh-result.json` and pass that file, or pass " + + "--skip-tier1 if this invocation is Tier 2 only."); + return; + } + + List measurements = readJmhResults(options.jmhResult); + System.out.println(" " + measurements.size() + " benchmark results from " + options.jmhResult); + + Map baseline = Json.asObject( + Json.parse(readText(options.allocBaseline, DEFAULT_ALLOC_BASELINE)), + "allocation baseline"); + List rules = Json.asArray(baseline.get("rules"), "allocation baseline: rules"); + + // Per-measurement ceilings, keyed by "SimpleClass.method[param=value]". A rule's + // maxBytesPerOp is a single number over every arm it matches, and some rules legitimately + // cover arms that differ by two orders of magnitude - CrsParseBenchmark's EARLY and LATE + // parameters differ by ~37x precisely because that spread is the finding. A single ceiling + // set by the worst arm would leave the cheap arms ungated. So the per-key ratchet is the + // primary ceiling where one exists, and the rule's number is the fallback and the class-level + // cap. + Map ratchets = baseline.get("ratchets") instanceof Map + ? Json.asObject(baseline.get("ratchets"), "allocation baseline: ratchets") + : Map.of(); + + int checked = 0; + for (Object ruleObject : rules) { + Map rule = Json.asObject(ruleObject, "allocation rule"); + String id = Json.asString(rule.get("id"), "allocation rule: id"); + Pattern pattern = compile(Json.asString(rule.get("match"), "rule " + id + ": match"), id); + boolean required = !Boolean.FALSE.equals(rule.get("required")); + + List matches = new ArrayList<>(); + for (Measurement m : measurements) { + if (pattern.matcher(m.shortKey).find() || pattern.matcher(m.fqn).find()) { + matches.add(m); + } + } + + if (matches.isEmpty()) { + if (required) { + // A renamed or deleted benchmark must not silently un-gate itself. This is the + // failure mode that makes long-lived gates quietly stop gating. + failures.add("rule '" + id + "' matched no benchmark in the JMH results. Either " + + "the benchmark was renamed (update the rule's `match`) or it was not " + + "run (check the run command's -e exclusions). Pattern: " + + pattern.pattern()); + } else { + notes.add("rule '" + id + "' matched nothing, and is marked not required " + + "(staged benchmark)."); + } + continue; + } + + Double ruleCeiling = number(rule.get("maxBytesPerOp")); + Double target = number(rule.get("targetBytesPerOp")); + + // ---- Tier 1 exclusion ------------------------------------------------------------- + // `tier1Gated: false` means this rule's arms are MEASURED, RECORDED and REPORTED but a + // breach does not block. It exists for arms whose subject IS data-dependent allocation, + // which never satisfied Tier 1's fixed-object-graph premise - see the rule's own + // exclusionReason. Two mandatory companions, both hard errors when missing, because an + // undocumented or unbounded exclusion is worse than no exclusion at all. + boolean tier1Gated = !Boolean.FALSE.equals(rule.get("tier1Gated")); + long declaredExclusionArms = -1; + if (!tier1Gated) { + String reason = rule.get("exclusionReason") == null ? null + : Json.asString(rule.get("exclusionReason"), + "rule " + id + ": exclusionReason"); + if (reason == null || reason.trim().isEmpty()) { + throw new UsageException("rule '" + id + "' sets tier1Gated=false but carries no " + + "`exclusionReason`. An exclusion is a REDUCTION IN COVERAGE and may not " + + "be silent: say in the baseline file what stops being gated and why, " + + "where the next reader will find it."); + } + Double declared = number(rule.get("exclusionArmCount")); + if (declared == null) { + throw new UsageException("rule '" + id + "' sets tier1Gated=false but carries no " + + "`exclusionArmCount`. The count is pinned by hand so the exclusion " + + "cannot silently widen - an exclusion that over-matches is exactly how " + + "a gate quietly stops working. Set it to the number of arms this rule " + + "is meant to cover."); + } + declaredExclusionArms = (long) (double) declared; + excludedArms += matches.size(); + exclusionBanners.add("rule '" + id + "' is EXCLUDED from Tier 1 ratcheting " + + "(tier1Gated=false): " + matches.size() + " arm(s) below are REPORTED, " + + "NOT BLOCKED. A regression in any of them will not fail this gate."); + for (String line : wrap(reason, 96)) { + exclusionBanners.add(" " + line); + } + if (matches.size() != declaredExclusionArms) { + // Over-matching is the dangerous direction (a real regression elsewhere gets + // swallowed); under-matching means an arm vanished. Both are a broken exclusion. + StringBuilder names = new StringBuilder(); + for (Measurement m : matches) { + names.append("\n ").append(m.shortKey); + } + failures.add("EXCLUSION SCOPE CHANGED rule '" + id + "'\n" + + " declared: exclusionArmCount = " + declaredExclusionArms + "\n" + + " matched: " + matches.size() + " arm(s)" + names + "\n" + + " An excluded rule is not gated, so if its pattern spreads it " + + "takes other benchmarks\n" + + " out of Tier 1 with it, silently. Either narrow `match`, or " + + "bump `exclusionArmCount`\n" + + " deliberately and say in the commit message which arms stopped " + + "being gated."); + } + } + + for (Measurement m : matches) { + checked++; + if (m.allocBytesPerOp == null) { + warnings.add(m.shortKey + ": no gc.alloc.rate.norm in the results. Tier 1 cannot " + + "check it. Add `-prof gc` to the run command."); + continue; + } + double observed = m.allocBytesPerOp; + + Double perKey = ratchets.containsKey(m.shortKey) + ? number(ratchets.get(m.shortKey)) : null; + Double ratchet = perKey != null ? perKey : ruleCeiling; + String ratchetSource = perKey != null ? "per-benchmark ratchet" : "rule ceiling"; + + if (!tier1Gated) { + // Keep reporting the numbers as information. The recorded figure and the drift + // from it are the whole point of still measuring the arm; printing only the + // observation would turn the exclusion into an omission. + String against; + if (ratchet == null) { + against = "no recorded reference (" + TBD + ")"; + } else if (ratchet == 0.0) { + against = String.format(Locale.ROOT, "recorded %s, delta %+.1f", + fmt(ratchet), observed - ratchet); + } else { + against = String.format(Locale.ROOT, "recorded %s, delta %+.1f (%+.3f%%)", + fmt(ratchet), observed - ratchet, + 100.0 * (observed - ratchet) / ratchet); + } + exclusionRows.add(String.format(Locale.ROOT, "%-58s %14s B/op %s", + m.shortKey, fmt(observed), against)); + continue; + } + + if (ratchet == null) { + String message = m.shortKey + ": rule '" + id + "' has maxBytesPerOp = " + TBD + + "; observed " + fmt(observed) + " B/op. Populate the baseline with " + + "`--record` (see benchmark/README.md, \"Refreshing a baseline\")."; + if (options.requireBaseline) { + failures.add(message); + } else { + warnings.add(message); + } + continue; + } + + double allowance = ratchet + + Math.max(ALLOC_ABSOLUTE_SLACK_BYTES, ratchet * ALLOC_RELATIVE_SLACK); + if (observed > allowance) { + failures.add(String.format(Locale.ROOT, + "ALLOCATION REGRESSION %s%n" + + " rule: %s%n" + + " before: %s B/op (checked-in %s)%n" + + " after: %s B/op (this run)%n" + + " delta: %+.1f B/op%n" + + " target: %s B/op%n" + + " why it matters: %s", + m.shortKey, id, fmt(ratchet), ratchetSource, + fmt(observed), observed - ratchet, + target == null ? TBD : fmt(target), + rule.containsKey("why") + ? Json.asString(rule.get("why"), "rule " + id + ": why") + : "(no `why` recorded on this rule - add one)")); + } else if (target != null && observed <= target + ALLOC_ABSOLUTE_SLACK_BYTES) { + notes.add(m.shortKey + ": " + fmt(observed) + " B/op, at target (" + + fmt(target) + ")."); + } else if (ratchet > 0 && observed < ratchet * 0.95) { + notes.add(m.shortKey + ": " + fmt(observed) + " B/op, below the ratchet of " + + fmt(ratchet) + ". Tighten it with `--record` so the improvement is " + + "locked in."); + } + } + } + System.out.println(" " + checked + " measurement(s) matched a rule"); + System.out.println(" " + (checked - excludedArms) + " gated, " + excludedArms + + " EXCLUDED from ratcheting (reported, not blocked - see below)"); + } + + // ============================================================================================ + // Tier 2 + // ============================================================================================ + + private void checkOpCounts(Options options) throws IOException { + System.out.println(); + System.out.println("Tier 2 - transcendental call counts (blocking)"); + System.out.println("---------------------------------------------"); + + Map baseline = Json.asObject( + Json.parse(readText(options.opCounts, DEFAULT_OP_COUNTS)), "op-count baseline"); + Map expectedPairs = + Json.asObject(baseline.get("pairs"), "op-count baseline: pairs"); + + OpCountRecorder.Result observed = OpCountRecorder.recordAll(); + System.out.println(" instrumented " + observed.rewrittenClasses() + " core classes, " + + observed.rewrittenReferences() + " Math/StrictMath references redirected"); + System.out.println(" " + observed.countsByPair().size() + " CRS pairs measured"); + + for (Map.Entry entry : observed.countsByPair().entrySet()) { + String pairName = entry.getKey(); + long[] counts = entry.getValue(); + + Object expectedObject = expectedPairs.get(pairName); + if (expectedObject == null) { + warnings.add("CRS pair " + pairName + " has no entry in the op-count baseline. It was " + + "added to CrsPair without a baseline refresh; run `--record`. Observed: " + + describeCounts(counts)); + continue; + } + Map expected = Json.asObject(expectedObject, "op counts for " + pairName); + + for (int i = 0; i < OpCounters.opCount(); i++) { + OpCounters.Op op = OpCounters.op(i); + String key = OpCounters.key(op); + if (!expected.containsKey(key)) { + // Absent means "not pinned for this pair". Tolerated so that adding an Op does not + // invalidate every pair at once, but reported so it does not stay absent. + if (counts[i] != 0) { + warnings.add(pairName + '.' + key + ": not pinned in the baseline, observed " + + counts[i] + ". Run `--record`."); + } + continue; + } + Double pinned = number(expected.get(key)); + if (pinned == null) { + String message = pairName + '.' + key + ": baseline is " + TBD + ", observed " + + counts[i] + ". Run `--record` to pin it."; + if (options.requireBaseline) { + failures.add(message); + } else { + warnings.add(message); + } + continue; + } + long expectedCount = (long) (double) pinned; + if (expectedCount != counts[i]) { + failures.add(String.format(Locale.ROOT, + "OPERATION COUNT CHANGED %s [%s]%n" + + " call: %s%n" + + " before: %d per transform (checked-in baseline)%n" + + " after: %d per transform (this run)%n" + + " delta: %+d%n" + + " This is deterministic, so it is a real algorithmic change, not " + + "noise.%n" + + " If it is intended (e.g. a numerics.md rewrite landed), refresh " + + "with `--record`%n" + + " and say so in the commit message. If it is not, an iteration " + + "count changed.", + pairName, CrsPair.valueOf(pairName).describe(), key, + expectedCount, counts[i], counts[i] - expectedCount)); + } + } + } + + for (String pairName : expectedPairs.keySet()) { + if (pairName.startsWith("_")) { + continue; + } + if (!observed.countsByPair().containsKey(pairName)) { + failures.add("CRS pair " + pairName + " is in the op-count baseline but was not " + + "measured. It was removed from CrsPair without updating the baseline; " + + "either restore it or run `--record`."); + } + } + } + + private static String describeCounts(long[] counts) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < counts.length; i++) { + if (counts[i] == 0) { + continue; + } + if (sb.length() > 0) { + sb.append(", "); + } + sb.append(OpCounters.key(OpCounters.op(i))).append('=').append(counts[i]); + } + return sb.length() == 0 ? "(all zero)" : sb.toString(); + } + + // ============================================================================================ + // Baseline refresh + // ============================================================================================ + + private int record(Options options) throws IOException { + Path dir = Paths.get(options.baselineDir); + if (!Files.isDirectory(dir)) { + throw new UsageException("--record needs a writable baseline directory; " + dir + + " is not one. Run from the benchmark/ module directory, or pass " + + "--baseline-dir."); + } + Map capturedAt = capturedAt(options); + + System.out.println("Refreshing baselines in " + dir.toAbsolutePath()); + System.out.println(" captured at: " + capturedAt); + + // ---- op counts ------------------------------------------------------------------------- + OpCountRecorder.Result observed = OpCountRecorder.recordAll(); + Map opDoc = new LinkedHashMap<>(); + opDoc.put("_format", 1.0); + opDoc.put("_doc", List.of( + "Tier 2 baseline: transcendental calls per single transform, per CRS pair.", + "Fully deterministic - one transform of the pinned sample point in CrsPair.", + "Regenerate with: java -cp target/benchmarks.jar " + + "org.locationtech.proj4j.benchmark.gate.GateChecker --record", + "A count that DROPS is the expected outcome of a numerics.md rewrite; say so in the " + + "commit message.", + "A count that RISES is an extra iteration or a reintroduced transcendental.")); + opDoc.put("capturedAt", capturedAt); + Map pairs = new LinkedHashMap<>(); + for (Map.Entry e : observed.countsByPair().entrySet()) { + Map ops = new LinkedHashMap<>(); + ops.put("_crs", CrsPair.valueOf(e.getKey()).describe()); + for (int i = 0; i < OpCounters.opCount(); i++) { + ops.put(OpCounters.key(OpCounters.op(i)), (double) e.getValue()[i]); + } + pairs.put(e.getKey(), ops); + } + opDoc.put("pairs", pairs); + Path opPath = dir.resolve("op-counts.json"); + Files.write(opPath, Json.write(opDoc).getBytes(StandardCharsets.UTF_8)); + System.out.println(" wrote " + opPath + " (" + pairs.size() + " pairs, " + + observed.rewrittenReferences() + " references instrumented)"); + + // ---- allocation ------------------------------------------------------------------------ + if (options.jmhResult == null) { + System.out.println(" allocation-baseline.json NOT refreshed: no JMH result supplied."); + System.out.println(" Re-run with a `-prof gc -rf json` result file to ratchet Tier 1."); + return 0; + } + List measurements = readJmhResults(options.jmhResult); + Map existing = Json.asObject( + Json.parse(readText(options.allocBaseline, DEFAULT_ALLOC_BASELINE)), + "allocation baseline"); + List rules = Json.asArray(existing.get("rules"), "allocation baseline: rules"); + + Map ratchets = new TreeMap<>(); + for (Object ruleObject : rules) { + Map rule = Json.asObject(ruleObject, "allocation rule"); + String id = Json.asString(rule.get("id"), "allocation rule: id"); + Pattern pattern = compile(Json.asString(rule.get("match"), "rule " + id + ": match"), id); + boolean ratchetable = !Boolean.FALSE.equals(rule.get("ratchetable")); + boolean tier1Gated = !Boolean.FALSE.equals(rule.get("tier1Gated")); + double worst = -1.0; + for (Measurement m : measurements) { + if (m.allocBytesPerOp == null) { + continue; + } + if (pattern.matcher(m.shortKey).find() || pattern.matcher(m.fqn).find()) { + worst = Math.max(worst, m.allocBytesPerOp); + if (ratchetable) { + // Per-benchmark ratchet, so a rule spanning arms that differ by orders of + // magnitude still gates each arm at its own figure. Deliberately NOT written + // for non-ratchetable rules: a per-key entry there would override the + // normative rule ceiling and silently widen it, which is the one thing that + // flag exists to prevent. + ratchets.put(m.shortKey, Math.max(0.0, Math.rint(m.allocBytesPerOp))); + } + } + } + if (worst < 0) { + System.out.println(" rule '" + id + "': no measurement, left as-is"); + continue; + } + if (!ratchetable) { + // Some rules are normative, not empirical: every bulk method must be 0 because the + // contract says so, and the Math-intrinsic canary must be 0 because a nonzero reading + // means the measurement itself is broken. Letting --record widen those would silently + // convert an assertion into an observation, which is how a gate stops gating. + System.out.println(" rule '" + id + "': ratchetable=false, left at " + + fmt(number(rule.get("maxBytesPerOp"))) + " (observed " + fmt(worst) + ")"); + continue; + } + // Round to the NEAREST whole byte, not up. A ratchet with a fractional part reads as + // spurious precision, and rounding up would add a byte of headroom on every refresh - over + // a few refreshes that becomes real slack. Rounding down is safe because the comparison + // carries at least ALLOC_ABSOLUTE_SLACK_BYTES of tolerance, which is three decimal orders + // below the 16-byte minimum object header, so no real allocation can hide in it. + double ratchet = Math.max(0.0, Math.rint(worst)); + Object before = rule.get("maxBytesPerOp"); + rule.put("maxBytesPerOp", ratchet); + System.out.println(" rule '" + id + "': maxBytesPerOp " + + (before instanceof String ? TBD : fmt(number(before))) + " -> " + fmt(ratchet) + + " (observed " + fmt(worst) + ")" + // The numbers ARE still recorded for an excluded rule - that is what keeps them + // reportable - so say plainly here that recording them does not gate them. + // Otherwise a --record log reads as if every rule it lists is enforced. + + (tier1Gated ? "" + : " [tier1Gated=false: RECORDED FOR REPORTING ONLY, NOT ENFORCED]")); + } + + Object previousRatchets = existing.get("ratchets"); + if (previousRatchets instanceof Map) { + // Preserve any leading _note in the ratchets block, which is the only prose in it. + for (Map.Entry e + : Json.asObject(previousRatchets, "ratchets").entrySet()) { + if (e.getKey().startsWith("_")) { + ratchets.put(e.getKey(), e.getValue()); + } + } + } + existing.put("capturedAt", capturedAt); + existing.put("ratchets", ratchets); + Path allocPath = dir.resolve("allocation-baseline.json"); + Files.write(allocPath, Json.write(existing).getBytes(StandardCharsets.UTF_8)); + System.out.println(" wrote " + allocPath + " (" + ratchets.size() + + " per-benchmark ratchets)"); + return 0; + } + + private static Map capturedAt(Options options) { + Map m = new LinkedHashMap<>(); + m.put("commit", options.commit != null ? options.commit : gitCommit()); + m.put("date", java.time.Instant.now().toString()); + m.put("jdk", System.getProperty("java.vm.version", "unknown")); + m.put("arch", System.getProperty("os.arch", "unknown")); + m.put("os", System.getProperty("os.name", "unknown")); + return m; + } + + /** + * Best-effort commit id. A baseline that does not say which tree it came from is not reviewable - + * you cannot tell whether a differing number is a regression or a different starting point. + */ + private static String gitCommit() { + try { + Process p = new ProcessBuilder("git", "rev-parse", "HEAD") + .redirectErrorStream(true).start(); + String out = new String(p.getInputStream().readAllBytes(), StandardCharsets.UTF_8).trim(); + return p.waitFor() == 0 && !out.isEmpty() ? out : "unknown"; + } catch (IOException | InterruptedException e) { + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + return "unknown"; + } + } + + // ============================================================================================ + // JMH result reading + // ============================================================================================ + + /** One JMH benchmark result, reduced to what the gate uses. */ + private static final class Measurement { + final String fqn; + /** {@code SimpleClass.method[param=value]}, which is what baseline rules match against. */ + final String shortKey; + final Double allocBytesPerOp; + final Double primaryScore; + final String primaryUnit; + + Measurement(String fqn, String shortKey, Double allocBytesPerOp, + Double primaryScore, String primaryUnit) { + this.fqn = fqn; + this.shortKey = shortKey; + this.allocBytesPerOp = allocBytesPerOp; + this.primaryScore = primaryScore; + this.primaryUnit = primaryUnit; + } + } + + private List readJmhResults(String path) throws IOException { + String text = Files.readString(Paths.get(path), StandardCharsets.UTF_8); + List array = Json.asArray(Json.parse(text), "JMH result file " + path); + List out = new ArrayList<>(array.size()); + for (Object element : array) { + Map record = Json.asObject(element, "JMH result element"); + String fqn = Json.asString(record.get("benchmark"), "JMH result: benchmark"); + + StringBuilder shortKey = new StringBuilder(); + int lastDot = fqn.lastIndexOf('.'); + int secondLastDot = lastDot < 0 ? -1 : fqn.lastIndexOf('.', lastDot - 1); + shortKey.append(secondLastDot < 0 ? fqn : fqn.substring(secondLastDot + 1)); + + Object paramsObject = record.get("params"); + if (paramsObject instanceof Map) { + Map params = Json.asObject(paramsObject, "JMH result: params"); + if (!params.isEmpty()) { + shortKey.append('['); + boolean first = true; + for (Map.Entry e : new TreeMap<>(params).entrySet()) { + if (!first) { + shortKey.append(','); + } + first = false; + shortKey.append(e.getKey()).append('=').append(e.getValue()); + } + shortKey.append(']'); + } + } + + Double alloc = null; + Object secondary = record.get("secondaryMetrics"); + if (secondary instanceof Map) { + for (Map.Entry e + : Json.asObject(secondary, "JMH result: secondaryMetrics").entrySet()) { + // JMH prefixes profiler metrics with a middle dot (U+00B7). Match on the suffix so + // the gate does not depend on that character surviving an encoding round trip. + if (e.getKey().endsWith("gc.alloc.rate.norm")) { + alloc = number(Json.asObject(e.getValue(), "gc.alloc.rate.norm").get("score")); + } + } + } + + Double score = null; + String unit = null; + Object primary = record.get("primaryMetric"); + if (primary instanceof Map) { + Map pm = Json.asObject(primary, "JMH result: primaryMetric"); + score = number(pm.get("score")); + Object u = pm.get("scoreUnit"); + unit = u instanceof String ? (String) u : null; + } + + out.add(new Measurement(fqn, shortKey.toString(), alloc, score, unit)); + } + return out; + } + + // ============================================================================================ + // Self test + // ============================================================================================ + + /** + * A dependency-free smoke test, so the harness's own plumbing is exercised without adding a test + * framework to the reactor. Checks the two things whose silent failure would make the gate pass + * vacuously: the JSON round trip, and that the bytecode rewrite is actually redirecting calls. + */ + private int selfTest() { + int problems = 0; + + Object parsed = Json.parse("{\"a\":[1,2.5,true,null,\"x\\n\"],\"b\":{\"c\":-3e2}}"); + String written = Json.write(parsed); + if (!Json.write(Json.parse(written)).equals(written)) { + System.err.println("SELF TEST FAILED: JSON write/parse/write is not stable"); + problems++; + } else { + System.out.println("ok JSON round trip is stable"); + } + + try { + OpCountRecorder.Result r = OpCountRecorder.recordAll(); + System.out.println("ok bytecode rewrite active: " + r.rewrittenClasses() + + " classes, " + r.rewrittenReferences() + " references, " + + r.total() + " calls across " + r.countsByPair().size() + " pairs"); + for (Map.Entry e : r.countsByPair().entrySet()) { + System.out.println(" " + e.getKey() + ": " + describeCounts(e.getValue())); + } + } catch (RuntimeException e) { + System.err.println("SELF TEST FAILED: " + e.getMessage()); + problems++; + } + + return problems == 0 ? 0 : 1; + } + + // ============================================================================================ + // Reporting and plumbing + // ============================================================================================ + + private int report() { + System.out.println(); + if (!exclusionBanners.isEmpty()) { + // Printed FIRST, above the notes, and on passing runs as well as failing ones. The + // coverage this gate does not have is more important to see than the coverage it does. + System.out.println("Tier 1 coverage exclusions - REPORTED, NOT GATED"); + System.out.println("------------------------------------------------"); + exclusionBanners.forEach(b -> System.out.println(" " + b)); + System.out.println(); + exclusionRows.forEach(r -> System.out.println(" i " + r)); + System.out.println(); + } + if (!notes.isEmpty()) { + System.out.println("Notes"); + System.out.println("-----"); + notes.forEach(n -> System.out.println(" - " + n)); + System.out.println(); + } + if (!warnings.isEmpty()) { + System.out.println("Warnings (not blocking)"); + System.out.println("-----------------------"); + warnings.forEach(w -> System.out.println(" ! " + w)); + System.out.println(); + } + if (failures.isEmpty()) { + System.out.println("GATE PASSED (" + warnings.size() + " warning(s))" + excludedSuffix()); + return 0; + } + System.out.println("Failures (blocking)"); + System.out.println("-------------------"); + for (String f : failures) { + System.out.println(" X " + f); + System.out.println(); + } + System.out.println("GATE FAILED (" + failures.size() + " breach(es))" + excludedSuffix()); + return 1; + } + + /** + * A pass is not a clean bill of health while anything is excluded, so the verdict line says so + * itself. Someone skimming CI output reads one line; that line has to carry the caveat. + */ + private String excludedSuffix() { + if (excludedArms == 0) { + return ""; + } + return " - " + excludedArms + " arm(s) NOT GATED, reported only " + + "(see \"Tier 1 coverage exclusions\" above)"; + } + + /** + * Greedy word wrap. The {@code exclusionReason} is deliberately long - it is the whole argument + * for a coverage reduction - and an unwrapped paragraph in terminal output gets skipped, which + * would defeat the point of printing it every run. + */ + private static List wrap(String text, int width) { + List lines = new ArrayList<>(); + StringBuilder line = new StringBuilder(); + for (String word : text.trim().split("\\s+")) { + if (line.length() > 0 && line.length() + 1 + word.length() > width) { + lines.add(line.toString()); + line.setLength(0); + } + if (line.length() > 0) { + line.append(' '); + } + line.append(word); + } + if (line.length() > 0) { + lines.add(line.toString()); + } + return lines; + } + + private static Pattern compile(String regex, String ruleId) { + try { + return Pattern.compile(regex); + } catch (PatternSyntaxException e) { + throw new UsageException("rule '" + ruleId + "' has an invalid `match` regex: " + + e.getMessage()); + } + } + + /** {@code null} for the {@code "TBD"} sentinel, so unpinned entries are unambiguous. */ + private static Double number(Object o) { + if (o == null) { + return null; + } + if (o instanceof Number) { + return ((Number) o).doubleValue(); + } + if (o instanceof String) { + String s = ((String) o).trim(); + if (s.isEmpty() || TBD.equalsIgnoreCase(s)) { + return null; + } + try { + return Double.valueOf(s); + } catch (NumberFormatException e) { + throw new UsageException("expected a number or \"" + TBD + "\", got \"" + s + '"'); + } + } + throw new UsageException("expected a number, got " + o.getClass().getSimpleName()); + } + + private static String fmt(Double d) { + if (d == null) { + return TBD; + } + return d == Math.rint(d) ? String.valueOf((long) (double) d) + : String.format(Locale.ROOT, "%.3f", d); + } + + /** Reads an override path if given, otherwise the checked-in classpath resource. */ + private static String readText(String overridePath, String classpathResource) throws IOException { + if (overridePath != null) { + return Files.readString(Paths.get(overridePath), StandardCharsets.UTF_8); + } + try (InputStream in = GateChecker.class.getResourceAsStream(classpathResource)) { + if (in == null) { + throw new UsageException("baseline resource " + classpathResource + + " is not on the classpath, and no override path was given."); + } + return new String(in.readAllBytes(), StandardCharsets.UTF_8); + } + } + + private static final class Options { + String jmhResult; + String allocBaseline; + String opCounts; + String baselineDir = DEFAULT_BASELINE_DIR; + String commit; + boolean skipTier1; + boolean skipTier2; + boolean requireBaseline; + boolean record; + boolean selfTest; + boolean help; + + static Options parse(String[] args) { + Options o = new Options(); + for (int i = 0; i < args.length; i++) { + String a = args[i]; + switch (a) { + case "-h": case "--help": o.help = true; break; + case "--self-test": o.selfTest = true; break; + case "--skip-tier1": o.skipTier1 = true; break; + case "--skip-tier2": o.skipTier2 = true; break; + case "--require-baseline": o.requireBaseline = true; break; + case "--record": o.record = true; break; + case "--jmh": o.jmhResult = value(args, ++i, a); break; + case "--alloc-baseline": o.allocBaseline = value(args, ++i, a); break; + case "--op-counts": o.opCounts = value(args, ++i, a); break; + case "--baseline-dir": o.baselineDir = value(args, ++i, a); break; + case "--commit": o.commit = value(args, ++i, a); break; + default: + if (a.startsWith("-")) { + throw new UsageException("unknown option " + a); + } + if (o.jmhResult != null) { + throw new UsageException("more than one JMH result file given: " + + o.jmhResult + " and " + a); + } + o.jmhResult = a; + } + } + return o; + } + + private static String value(String[] args, int i, String option) { + if (i >= args.length) { + throw new UsageException(option + " needs a value"); + } + return args[i]; + } + } + + private static final class UsageException extends RuntimeException { + private static final long serialVersionUID = 1L; + + UsageException(String message) { + super(message); + } + } + + private static void printUsage(java.io.PrintStream out) { + out.println("Usage: GateChecker [] [options]"); + out.println(); + out.println("Tiers 1 and 2 of the performance gate. Exit 0 = pass, 1 = breach, 2 = usage."); + out.println(); + out.println(" JMH output from `-prof gc -rf json -rff `."); + out.println(" --jmh Same, as a named option."); + out.println(" --alloc-baseline

Override /baseline/allocation-baseline.json."); + out.println(" --op-counts

Override /baseline/op-counts.json."); + out.println(" --skip-tier1 Skip the allocation check (no JMH run needed)."); + out.println(" --skip-tier2 Skip the op-count check."); + out.println(" --require-baseline Treat a TBD baseline entry as a failure, not a warning."); + out.println(" --record Rewrite the baselines from this run."); + out.println(" --baseline-dir

Where --record writes. Default: " + DEFAULT_BASELINE_DIR); + out.println(" --commit Record this commit in capturedAt; default `git rev-parse`."); + out.println(" --self-test Exercise the gate's own plumbing and exit."); + out.println(); + out.println("Tier 3 (absolute ns/op) is deliberately not implemented here. See this class's"); + out.println("javadoc and benchmark/README.md for why timing is never a PR gate."); + } +} diff --git a/benchmark/src/main/java/org/locationtech/proj4j/benchmark/gate/Json.java b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/gate/Json.java new file mode 100644 index 0000000..efc3261 --- /dev/null +++ b/benchmark/src/main/java/org/locationtech/proj4j/benchmark/gate/Json.java @@ -0,0 +1,386 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.benchmark.gate; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * A minimal JSON reader and writer, sufficient for JMH's result format and for the checked-in + * baselines. + * + *

Why hand-rolled rather than Jackson. The gate has to run in CI on every PR, so its own + * dependency footprint is a liability: a JSON library here means a download, a shaded copy in + * {@code benchmarks.jar}, and a CVE feed to watch for a tool that reads two files this repository + * produces itself. JMH's output uses objects, arrays, strings and numbers and nothing else. The parser + * below is about 120 lines and is strict enough to fail loudly on anything it does not understand, + * which is the property that matters - a lenient parser that silently returns null for a malformed + * baseline would turn a gate breach into a pass. + * + *

Numbers are always {@code Double}. That is fine for byte counts and ns/op, and it is fine for the + * op counts, which are small integers: a {@code double} is exact for every integer below 2^53 and no + * transform performs 9 quadrillion sines. The writer emits integral doubles without a decimal point so + * that {@code op-counts.json} diffs as {@code "sin": 8} rather than {@code "sin": 8.0}. + */ +final class Json { + + private final String src; + private int pos; + + private Json(String src) { + this.src = src; + } + + // ============================================================================================ + // Reading + // ============================================================================================ + + /** @return a {@code Map}, {@code List}, {@code String}, {@code Double}, {@code Boolean} or {@code null} */ + static Object parse(String text) { + Json p = new Json(text); + p.skipWhitespace(); + Object value = p.readValue(); + p.skipWhitespace(); + if (p.pos != p.src.length()) { + throw p.error("trailing content after the top-level value"); + } + return value; + } + + private Object readValue() { + if (pos >= src.length()) { + throw error("unexpected end of input"); + } + char c = src.charAt(pos); + switch (c) { + case '{': return readObject(); + case '[': return readArray(); + case '"': return readString(); + case 't': expect("true"); return Boolean.TRUE; + case 'f': expect("false"); return Boolean.FALSE; + case 'n': expect("null"); return null; + default: + if (c == '-' || (c >= '0' && c <= '9')) { + return readNumber(); + } + throw error("unexpected character '" + c + "'"); + } + } + + private Map readObject() { + Map map = new LinkedHashMap<>(); + pos++; // '{' + skipWhitespace(); + if (peek() == '}') { + pos++; + return map; + } + while (true) { + skipWhitespace(); + if (peek() != '"') { + throw error("expected a quoted object key"); + } + String key = readString(); + skipWhitespace(); + if (peek() != ':') { + throw error("expected ':' after key \"" + key + "\""); + } + pos++; + skipWhitespace(); + map.put(key, readValue()); + skipWhitespace(); + char c = peek(); + if (c == ',') { + pos++; + continue; + } + if (c == '}') { + pos++; + return map; + } + throw error("expected ',' or '}' in object"); + } + } + + private List readArray() { + List list = new ArrayList<>(); + pos++; // '[' + skipWhitespace(); + if (peek() == ']') { + pos++; + return list; + } + while (true) { + skipWhitespace(); + list.add(readValue()); + skipWhitespace(); + char c = peek(); + if (c == ',') { + pos++; + continue; + } + if (c == ']') { + pos++; + return list; + } + throw error("expected ',' or ']' in array"); + } + } + + private String readString() { + pos++; // opening quote + StringBuilder sb = new StringBuilder(); + while (true) { + if (pos >= src.length()) { + throw error("unterminated string"); + } + char c = src.charAt(pos++); + if (c == '"') { + return sb.toString(); + } + if (c != '\\') { + sb.append(c); + continue; + } + char esc = src.charAt(pos++); + switch (esc) { + case '"': sb.append('"'); break; + case '\\': sb.append('\\'); break; + case '/': sb.append('/'); break; + case 'b': sb.append('\b'); break; + case 'f': sb.append('\f'); break; + case 'n': sb.append('\n'); break; + case 'r': sb.append('\r'); break; + case 't': sb.append('\t'); break; + case 'u': + sb.append((char) Integer.parseInt(src.substring(pos, pos + 4), 16)); + pos += 4; + break; + default: + throw error("unknown escape '\\" + esc + "'"); + } + } + } + + private Double readNumber() { + int start = pos; + if (peek() == '-') { + pos++; + } + while (pos < src.length()) { + char c = src.charAt(pos); + if ((c >= '0' && c <= '9') || c == '.' || c == 'e' || c == 'E' || c == '+' || c == '-') { + pos++; + } else { + break; + } + } + String text = src.substring(start, pos); + try { + return Double.valueOf(text); + } catch (NumberFormatException e) { + throw error("malformed number '" + text + "'"); + } + } + + private char peek() { + if (pos >= src.length()) { + throw error("unexpected end of input"); + } + return src.charAt(pos); + } + + private void expect(String literal) { + if (!src.startsWith(literal, pos)) { + throw error("expected '" + literal + "'"); + } + pos += literal.length(); + } + + private void skipWhitespace() { + while (pos < src.length()) { + char c = src.charAt(pos); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { + pos++; + } else { + break; + } + } + } + + private IllegalArgumentException error(String message) { + int line = 1; + for (int i = 0; i < Math.min(pos, src.length()); i++) { + if (src.charAt(i) == '\n') { + line++; + } + } + return new IllegalArgumentException("Malformed JSON at line " + line + ": " + message); + } + + // ============================================================================================ + // Convenience accessors. Each names the offending key on failure, because these are used against + // hand-edited baseline files where a typo is the likely error. + // ============================================================================================ + + @SuppressWarnings("unchecked") + static Map asObject(Object o, String what) { + if (!(o instanceof Map)) { + throw new IllegalArgumentException(what + ": expected a JSON object, got " + + (o == null ? "null" : o.getClass().getSimpleName())); + } + return (Map) o; + } + + @SuppressWarnings("unchecked") + static List asArray(Object o, String what) { + if (!(o instanceof List)) { + throw new IllegalArgumentException(what + ": expected a JSON array, got " + + (o == null ? "null" : o.getClass().getSimpleName())); + } + return (List) o; + } + + static String asString(Object o, String what) { + if (!(o instanceof String)) { + throw new IllegalArgumentException(what + ": expected a string, got " + + (o == null ? "null" : o.getClass().getSimpleName())); + } + return (String) o; + } + + // ============================================================================================ + // Writing. Deliberately pretty-printed with one entry per line: the baselines are reviewed as + // diffs, and a compact single-line JSON would make every refresh an unreadable one-line change. + // ============================================================================================ + + static String write(Object value) { + StringBuilder sb = new StringBuilder(4096); + writeValue(sb, value, 0); + sb.append('\n'); + return sb.toString(); + } + + private static void writeValue(StringBuilder sb, Object value, int depth) { + if (value == null) { + sb.append("null"); + } else if (value instanceof Map) { + writeObject(sb, Json.asObject(value, "value"), depth); + } else if (value instanceof List) { + writeArray(sb, Json.asArray(value, "value"), depth); + } else if (value instanceof String) { + writeString(sb, (String) value); + } else if (value instanceof Boolean) { + sb.append(value); + } else if (value instanceof Number) { + writeNumber(sb, ((Number) value).doubleValue()); + } else { + throw new IllegalArgumentException("Cannot serialise " + value.getClass()); + } + } + + private static void writeObject(StringBuilder sb, Map map, int depth) { + if (map.isEmpty()) { + sb.append("{}"); + return; + } + sb.append("{\n"); + int i = 0; + for (Map.Entry e : map.entrySet()) { + indent(sb, depth + 1); + writeString(sb, e.getKey()); + sb.append(": "); + writeValue(sb, e.getValue(), depth + 1); + if (++i < map.size()) { + sb.append(','); + } + sb.append('\n'); + } + indent(sb, depth); + sb.append('}'); + } + + private static void writeArray(StringBuilder sb, List list, int depth) { + if (list.isEmpty()) { + sb.append("[]"); + return; + } + // A flat array of scalars stays on one line; anything containing an object or array goes + // vertical. Keeps "why" prose arrays readable without exploding a list of numbers. + boolean scalarsOnly = list.stream().noneMatch(v -> v instanceof Map || v instanceof List); + boolean shortEnough = scalarsOnly && list.size() <= 8 + && list.stream().noneMatch(v -> v instanceof String && ((String) v).length() > 24); + if (shortEnough) { + sb.append('['); + for (int i = 0; i < list.size(); i++) { + if (i > 0) { + sb.append(", "); + } + writeValue(sb, list.get(i), depth); + } + sb.append(']'); + return; + } + sb.append("[\n"); + for (int i = 0; i < list.size(); i++) { + indent(sb, depth + 1); + writeValue(sb, list.get(i), depth + 1); + if (i < list.size() - 1) { + sb.append(','); + } + sb.append('\n'); + } + indent(sb, depth); + sb.append(']'); + } + + private static void writeNumber(StringBuilder sb, double d) { + if (d == Math.rint(d) && !Double.isInfinite(d) && Math.abs(d) < 1e15) { + sb.append((long) d); + } else { + sb.append(d); + } + } + + private static void writeString(StringBuilder sb, String s) { + sb.append('"'); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '"': sb.append("\\\""); break; + case '\\': sb.append("\\\\"); break; + case '\n': sb.append("\\n"); break; + case '\r': sb.append("\\r"); break; + case '\t': sb.append("\\t"); break; + default: + if (c < 0x20) { + sb.append(String.format("\\u%04x", (int) c)); + } else { + sb.append(c); + } + } + } + sb.append('"'); + } + + private static void indent(StringBuilder sb, int depth) { + for (int i = 0; i < depth; i++) { + sb.append(" "); + } + } +} diff --git a/benchmark/src/main/resources/baseline/allocation-baseline.json b/benchmark/src/main/resources/baseline/allocation-baseline.json new file mode 100644 index 0000000..1efddb4 --- /dev/null +++ b/benchmark/src/main/resources/baseline/allocation-baseline.json @@ -0,0 +1,464 @@ +{ + "_format": 1, + "_doc": [ + "TIER 1 BASELINE - allocation, bytes per operation, blocking on every PR.", + "", + "The measurement is JMH's `-prof gc` secondary metric `gc.alloc.rate.norm`: bytes allocated", + "divided by operations performed. It is a property of the BYTECODE, not of the machine, so it", + "reads the same on a laptop and on a shared CI runner. That is why this tier can block a PR", + "while absolute ns/op cannot.", + "", + "TWO COLUMNS, AND THE DIFFERENCE MATTERS:", + " targetBytesPerOp - the POLICY. What reference/performance.md says the number should be once", + " the optimisation work has landed. Never edit this to make a build green.", + " maxBytesPerOp - the RATCHET. What the number actually is today. The gate fails on", + " exceeding THIS. Refresh it with --record; it may only ever go down.", + "", + "Asserting the target outright today would leave master permanently red, and a permanently red", + "gate is a disabled gate. The ratchet gives a monotone approach to the target with no window in", + "which a regression slips through, and the gap between the two columns is a reviewable to-do", + "list.", + "", + "The `ratchets` block at the end of this file holds PER-BENCHMARK ceilings and takes precedence", + "over a rule's maxBytesPerOp. See its own _note for why both exist.", + "", + "`ratchetable: false` marks a rule as NORMATIVE rather than empirical - --record will not widen", + "it. Used for the bulk contract (zero allocation per point is the contract, not an observation)", + "and for the Math-intrinsic canary (a nonzero reading there means the measurement is broken).", + "", + "`tier1Gated: false` marks a rule as REPORTED BUT NOT BLOCKING. THIS IS A REDUCTION IN COVERAGE.", + "It is spelled out here, in the rule's own `exclusionReason`, in the gate's output on every run", + "(including passing ones) and in benchmark/README.md, because an exclusion that lives only in a", + "commit message is a silent weakening. An excluded rule is still `required`, so a rename still", + "fails; --record still ratchets it; every run still prints its arms and their drift; and its", + "`exclusionArmCount` is pinned by hand, so if the pattern starts matching more arms the gate", + "FAILS rather than quietly un-gating them. Both `exclusionReason` and `exclusionArmCount` are", + "mandatory when tier1Gated is false - GateChecker exits 2 if either is missing.", + "", + "THERE ARE NO EXCLUSIONS TODAY. `crs-parse` was the only one and it REJOINED TIER 1 when the", + "init-file cache landed - every rule in this file now blocks. The bar for adding a new exclusion", + "is 'the arm's subject is data-dependent allocation, so it never satisfied Tier 1's", + "fixed-object-graph premise', not 'the arm is inconvenient'; and note that crs-parse met that bar", + "honestly and STILL came back, because the right response to an ungateable arm is to fix what", + "makes it ungateable. Read that rule's `why` before writing a new exclusionReason.", + "", + "`match` is a Java regex applied to `SimpleClassName.method[param=value,...]` and to the fully", + "qualified benchmark name. `required` defaults to true: a rule that matches nothing FAILS, so a", + "renamed benchmark cannot silently un-gate itself.", + "", + "REFRESH: cd benchmark", + " java -jar target/benchmarks.jar -prof gc -rf json -rff /tmp/jmh.json", + " java -cp target/benchmarks.jar \\", + " org.locationtech.proj4j.benchmark.gate.GateChecker --record /tmp/jmh.json" + ], + "capturedAt": { + "commit": "8f0fbd81bf53f95bd3c824a18a65f673c7ae2635+uncommitted (GateChecker stamps `git rev-parse HEAD` and does NOT mark a dirty tree; this capture was taken with rounds 1-3 of the hardening plan uncommitted in the working tree, so the bare sha would name a tree that does not contain the code measured)", + "date": "2026-08-02T16:21:38.424204Z", + "jdk": "21.0.11+10-LTS", + "arch": "aarch64", + "os": "Mac OS X" + }, + "rules": [ + { + "id": "single-point-transform", + "match": "^SinglePointTransformBenchmark\\.transform\\[", + "targetBytesPerOp": 40, + "maxBytesPerOp": 40, + "required": true, + "why": "Exactly one ProjCoordinate: 12-byte header plus three doubles, padded to 40 under compressed oops. This benchmark allocates its input on purpose, because that is the shape the consumer uses. Anything above 40 is proj4j allocating internally - the two new double[1] out-params in ExtendedTransverseMercatorProjection, the per-call GeocentricConverter in GeocentProjection, or a Grid.shift iterator. 136 -> 40 B/op on 2026-08-03. NAD27_TO_NAD83 was the one arm above 40, and the extra 96 was Grid.shift's allocation. Every arm is now exactly the caller's own ProjCoordinate, which is what this rule's target has always said it should be." + }, + { + "id": "single-point-reused-input", + "match": "^SinglePointTransformBenchmark\\.transformReusedInput", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The control: same work, no caller-side allocation. Any nonzero reading is entirely proj4j's own allocation, so this is the cleanest attribution of the two. 96 -> 0 B/op on 2026-08-03. The one nonzero arm was NAD27_TO_NAD83 and all of it was Grid.shift; see gridshift-inverse-zero." + }, + { + "id": "bulk-zero-allocation", + "match": "^BulkTransformBenchmark\\.(?!loopOfSinglePoint)", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "ratchetable": false, + "why": "LIVE AS OF THIS CAPTURE, AND IT WAS NOT BEFORE. This rule matched nothing while BulkTransformBenchmark sat in ...benchmark.staged and run-gate.sh passed -e '\\.staged\\.', so the bulk API - the one the consumer is told to use for per-row work - shipped with ZERO allocation coverage and a contract that existed only in prose. org.locationtech.proj4j.BulkCoordinateTransform now exists, the staged package is deleted, the exclusion is gone, and required is true. The contract is normative and admits no ratchet: with a non-null status array a bulk method must allocate ZERO bytes per point, because that is how the error taxonomy is delivered at no per-point cost. NEVER ratchet this above 0 - ratchetable is false so --record cannot do it by accident either." + }, + { + "id": "bulk-loop-control", + "match": "^BulkTransformBenchmark\\.loopOfSinglePoint", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The control arm. It reuses one input and one output coordinate, so its allocation is proj4j's per-call allocation multiplied by the batch size and divided out again by @OperationsPerInvocation - i.e. the same per-point figure as single-point-reused-input. IF THE TWO DISAGREE, ONE OF THEM IS MEASURING SOMETHING ELSE, and that cross-check is the reason this arm is gated rather than merely reported. It legitimately allocates whatever the single-point path allocates, so the ratchet is the whole value and there is no zero target." + }, + { + "id": "gridshift-inverse-zero", + "match": "^GridShiftBenchmark\\.inverseShift", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The sharpest allocation target in the library. performance.md measures the inverse grid-shift path at UP TO 49 ALLOCATIONS PER VERTEX - 4.9 million objects for one 100,000-vertex geometry. Two causes, both fixable without touching the arithmetic: Grid.shift iterating a List field with a for-each (Grid.java:89, needs to be a Grid[]), and nad_cvt/nad_intr returning fresh PolarCoordinate objects per trip of a MAX_TRY=9 loop. DONE, AND MEASURED: 160 -> 0 B/op on 2026-08-03. Both named causes are gone. Grid.shift no longer allocates an Iterator (indexed loop, plus a Grid[] overload the bulk path uses), and nad_cvt/nad_intr no longer return fresh PolarCoordinates - every intermediate is a local double and the caller's own ProjCoordinate is the scratch. The arithmetic is statement-for-statement unchanged; conformance held at 7,441/7,900 regressed 0 and golden's UNEXPLAINED count did not move. Grid.shift's zero is now also asserted outside JMH, by datum.GridShiftRewriteTest#theShiftPathAllocatesNothing, which measures 200,000 shifts with ThreadMXBean and carries a positive control that the meter sees 200,000 PolarCoordinates." + }, + { + "id": "gridshift-forward-zero", + "match": "^GridShiftBenchmark\\.forwardShift", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Real NTv1 bilinear interpolation. Same iterator and PolarCoordinate causes as the inverse, without the MAX_TRY multiplier. DONE: 96 -> 0 B/op on 2026-08-03, same change as gridshift-inverse-zero." + }, + { + "id": "gridshift-dispatch-zero", + "match": "^GridShiftBenchmark\\.noGridHit", + "targetBytesPerOp": 0, + "maxBytesPerOp": 576, + "required": true, + "why": "The extent test and iterator only, no interpolation. This is the arm that isolates the Grid.shift for-each iterator, because nothing else on this path should allocate at all. 1440 -> 576 B/op on 2026-08-03. The 864 that went is Throwable.fillInStackTrace: Proj4jException now overrides it to return `this` unless -Dproj4j.exceptions.stackTraces=true. THE REMAINING 576 IS THE MESSAGE, not the exception - outsideGrid builds a StringBuilder, two Double.toString results and the grid-name list, on a path that fires once per point outside the declared coverage. That is the next target here, and it needs a lazy or preformatted message rather than another flag. The target of 0 stays." + }, + { + "id": "gridshift-envelope", + "match": "^GridShiftBenchmark\\.transformThroughEnvelope", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The full public API over the no-hit path. Expected to BLOW UP when Proj4Parser:53 is fixed: that fix stops setGrids(null) from emptying the grid list, which un-masks Datum.isEqual descending to Arrays.equals(cvs) over every grid node (Datum.java:203 -> Grid.java:191). If this rule fires right after that fix, the remedy is to intern the resolved grid list so the comparison short-circuits on reference identity - not to widen the ratchet. 96 -> 0 B/op on 2026-08-03. The predicted blow-up never came: Datum.isEqual's identity short-circuits and GridCache interning kept the O(grid size) Arrays.equals off this path, and the remaining 96 B was Grid.shift's own allocation, now removed." + }, + { + "id": "allocation-identity-envelope", + "match": "^AllocationBenchmark\\.identityEnvelope", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "BasicCoordinateTransform's envelope with no projection work at all. A nonzero reading means the envelope itself started allocating - a lambda capture, an autoboxed key, a stream (note BasicCoordinateTransform.java:19 imports an unused DoubleStream). Cheapest possible regression to fix, most expensive to notice any other way." + }, + { + "id": "allocation-webmercator", + "match": "^AllocationBenchmark\\.webMercatorForward", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Cheapest real projection. Spherical merc has no reason to allocate." + }, + { + "id": "allocation-utm-outparams", + "match": "^AllocationBenchmark\\.utmOutParamArrays", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Tripwire for ExtendedTransverseMercatorProjection's two `new double[1]` out-params per project and per projectInverse (:114-115, :157-158). +proj=utm is proj4j's most expensive projection and this is its most gratuitous cost. Target 0 once the arrays become fields or locals." + }, + { + "id": "allocation-geocentric-converter", + "match": "^AllocationBenchmark\\.geocentricConverterPerCall", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Tripwire for GeocentProjection.java:10,17, which constructs a NEW GeocentricConverter on every call. Target 0 once it is a final field." + }, + { + "id": "allocation-helmert-cart", + "match": "^AllocationBenchmark\\.helmertCartRoundTrip", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The 7-parameter Helmert path, which round-trips through cart forward and inverse. The datum step is the one place the envelope legitimately needs scratch space, so it is where a reintroduced intermediate coordinate object would appear." + }, + { + "id": "allocation-gridshift-dispatch", + "match": "^AllocationBenchmark\\.gridShiftDispatch", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Same Grid.shift iterator as gridshift-dispatch-zero, reached through the public API. Two rules on one cause is deliberate: if only one fires, the difference localises the allocation to the envelope or to Grid.shift." + }, + { + "id": "allocation-crs-hashcode", + "match": "^AllocationBenchmark\\.crsHashCode", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The transform-cache lookup path. Guards a fix that has already landed - Projection.hashCode used to call Objects.hash, which allocates an Object[18] and boxes twelve doubles on every lookup, and is now a manual 31-chain. PrimeMeridian.hashCode still does `new Double(offsetFromGreenwich).hashCode()` (PrimeMeridian.java:92-93), so expect a small nonzero reading until that is fixed too. CORRECTION, MEASURED 2026-08-03: THE 160 WAS NOT PrimeMeridian. The sentence above predicted 'a small nonzero reading until that is fixed too'; PrimeMeridian.hashCode was fixed (new Double(x).hashCode() -> Double.hashCode(x)) and this arm did not move by one byte, because C2's escape analysis was already eliminating that box. Localised with ThreadMXBean.getThreadAllocatedBytes over 2e6 warm calls: PrimeMeridian.hashCode 0 B/op, Projection.hashCode 56, Projection.getUnits().hashCode() 56, one CoordinateReferenceSystem.hashCode 80, the benchmark body (two CRSs) 160. So the whole 160 was two Objects.hash calls - units.Unit.hashCode's Object[3]-plus-Double-box (56 each) and CoordinateReferenceSystem.hashCode's Object[2] (24 each). Both are now manual 31-chains seeded with 1, which is what Objects.hash is SPECIFIED to compute, so every hash value is bit-identical and no HashMap anywhere reorders - verified over 2e6 random 2-arg and 3-arg cases with a deliberately off-by-one chain as the control. 160 -> 0." + }, + { + "id": "allocation-proj-to-proj", + "match": "^AllocationBenchmark\\.projToProj", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "An inverse and a forward projection back to back with no datum work - the shape a ProjToProjSameDatumKernel would have to beat." + }, + { + "id": "etmerc-zero-allocation", + "match": "^EtmercBenchmark\\.", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "A projection's project/projectInverse has no reason to allocate. Today etmerc does (the double[1] out-params); tmerc should already be at 0, so a single ratchet across both arms will be set by etmerc and will tighten sharply when the out-params go." + }, + { + "id": "solver-zero-allocation", + "match": "^SolverBenchmark\\.(?!genericInverse2D)", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Every scalar solver - legacy and Karney-core alike - must be allocation-free. MeridianArc, ConformalLat and AuthalicLat hold their coefficients in final fields and their methods return doubles, so a nonzero reading means a coefficient array is being rebuilt per call, which would also be a large timing regression." + }, + { + "id": "generic-inverse-2d", + "match": "^SolverBenchmark\\.genericInverse2D", + "targetBytesPerOp": 80, + "maxBytesPerOp": 0, + "required": true, + "why": "GenericInverse2D.solve allocates two scratch ProjCoordinates per call (40 B each) - deliberately, per its own comment: allocating inside the loop would cost 45 short-lived objects per inverse. 80 is therefore the correct target, not 0. It is also the reason this solver must never appear on a bulk path; a kernel would hoist the scratch out." + }, + { + "id": "math-dispatch-intrinsic-zero-allocation", + "match": "^MathDispatchBenchmark\\.(math|sqrtOfSumOfSquares)", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "ratchetable": false, + "why": "Pure java.lang.Math calls on primitives, plus the sqrt(x*x+y*y) arm. These cannot legitimately be nonzero, which makes this rule the harness's own canary: if it fires, the -prof gc measurement itself is broken (a JMH upgrade, a JVM that stopped scalar-replacing) and NO Tier 1 number in the run should be trusted. Hard 0, never ratchet." + }, + { + "id": "math-dispatch-strictmath", + "match": "^MathDispatchBenchmark\\.strict", + "targetBytesPerOp": 0, + "maxBytesPerOp": 64, + "required": true, + "why": "TIER 1 CANNOT CATCH A REINTRODUCED pow, AND MUST NOT BE WIDENED TO TRY. StrictMath.pow is 96 B/op interpreted and 0 B/op JIT-warm - C2 folds the constant array elements, and escape analysis is NOT the mechanism (with EA off, sin correctly goes 32 -> 72 while pow stays 0). So strictPow's ratchet of 0 is a correct observation of a figure that is structurally blind, not a threshold to relax. THE INSTRUMENT THAT DOES CATCH A REINTRODUCED pow IS TIER 2's pow COUNTER, pinned at 0 across all 8 CRS pairs in op-counts.json: it is an integer count of call sites reached, not a byte total, so no JIT transformation can fold it away. If a review ever proposes raising this ratchet to accommodate pow, the answer is that Tier 2 already owns that regression. MEASURED FINDING, not a placeholder. On Temurin 21.0.11 (aarch64), StrictMath.sin, StrictMath.cos and StrictMath.tan each allocate 32 B/op - one double[2] - because JDK 17's pure-Java FdLibm rewrite allocates the argument-reduction scratch array in Sin/Cos/Tan.compute and escape analysis does not eliminate it. Confirmed independently of JMH via ThreadMXBean.getThreadAllocatedBytes over 5e6 calls: Math.sin 0.00, StrictMath.sin 32.41, StrictMath.cos 32.00, StrictMath.tan 32.00, and 0.00 for StrictMath exp/log/atan/asin/log1p/sinh/hypot/pow. The strictSinCos arm calls two of them and so reads 64. THIS MATTERS FOR reference/numerics.md ROW 13: adopting StrictMath for sin/cos/tan costs 32 B of garbage per call as well as the documented 1.5-3x time, and a UTM transform makes about four sin and four cos calls per point - roughly 256 B/point, i.e. ~25 MB of garbage for one 100,000-vertex geometry. The ratchet is 64 so the finding is pinned rather than hidden; the target stays 0 because a JDK that fixes FdLibm's scratch array should tighten it." + }, + { + "id": "concurrent-throughput-zero-allocation", + "match": "^ConcurrentThroughputBenchmark\\.", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "Per-thread coordinates are allocated in @Setup, so the measured path allocates nothing. Allocation here would be worse than elsewhere: with 16 threads it becomes TLAB pressure and shows up as sub-linear scaling that looks like a lock." + }, + { + "id": "transform-cache-hit-zero-allocation", + "match": "^TransformCacheBenchmark\\.(crsCacheHit|stringPairKeyLookup|crsHashCode|crsEquals)", + "targetBytesPerOp": 0, + "maxBytesPerOp": 0, + "required": true, + "why": "The steady-state path the consumer is on essentially always: a hit on a warm cache. A key comparison that allocates is pure overhead on every geometry. 160 -> 0 B/op on 2026-08-03, same three sites as allocation-crs-hashcode; read that rule's note for why the previously suspected cause was not the cause." + }, + { + "id": "transform-cache-miss", + "match": "^TransformCacheBenchmark\\.(crsCacheMissEquivalent|createTransformUncached|objectKeyLookup|buildStringKey)", + "targetBytesPerOp": "TBD", + "maxBytesPerOp": 1136, + "required": true, + "why": "These legitimately allocate - a miss constructs a CRS, and buildStringKey constructs a String. There is no zero target; the ratchet is the whole value. It should fall sharply when the init file is parsed once into a Map instead of being re-tokenised per call. MEASURED MOVEMENT, 2026-08-03, and it goes BOTH WAYS in one capture. crsCacheMissEquivalent fell 204,937 -> 1,136 B/op (-99.4%), which is io.InitFileCache doing exactly what this text predicted. createTransformUncached ROSE 104 -> 112, +8, and that +8 is bought deliberately: BasicCoordinateTransform gained two reference fields, srcGrids and tgtGrids, so that the bulk path resolves each datum's grid list ONCE per transform instead of on every point. Datum.gridList() is two volatile reads for the two spec-backed singletons (NAD27, potsdam), i.e. two acquire loads in the innermost loop of a batch. Eight bytes per transform CONSTRUCTION against two fences per POINT is the trade, and constructions are cached while points are not. If this arm ever rises again without a per-point justification of that shape, it is a regression." + }, + { + "id": "crs-parse", + "match": "^CrsParseBenchmark\\.", + "targetBytesPerOp": "TBD", + "maxBytesPerOp": 4112, + "required": true, + "why": "REJOINED TIER 1. This rule carried tier1Gated:false because Proj4FileReader re-opened and re-tokenised the 888 KB proj4/nad/epsg dictionary on EVERY call, so its allocation was a function of where in the file the code sat - a 200x EARLY-to-LATE spread of 39,632 / 4,002,108 / 7,919,398 B/op that drifted run to run by up to 0.121%, i.e. ~9,600 B against a slack of ~7,900. That is data-dependent allocation, which never satisfied Tier 1's fixed-object-graph premise. io.InitFileCache now parses each dictionary once, and the old exclusionReason named exactly this as the condition for the rule to come back: 'allocation becomes small and fixed-shape, the EARLY/MIDDLE/LATE spread vanishes, and this rule rejoins Tier 1 on its own terms - delete tier1Gated, exclusionArmCount and this text when it does.' Done, and here is the evidence rather than the assertion. MEASURED, 21 INDEPENDENT FORKS PER ARM (one 12-fork run plus three 3-fork runs at the gate's own -f 3 -wi 5 -i 5 settings, all from ONE frozen jar): seven of the nine arms report a SINGLE value across all 21 forks, and within a fork every iteration is identical. The two that vary - createFromName[LATE] 1136 x19 / 1080 x2, createFromName[MIDDLE] 2872 x20 / 2816 x1 - vary by exactly 56 bytes and ONLY DOWNWARD, one object that a given JVM sometimes does not allocate. That direction is what makes the arm gateable: GateChecker fails on observed > ratchet + slack, so a fork that allocates LESS cannot trip it, and the ratchets below are pinned at each arm's observed MAXIMUM, which is also its mode. Contrast the pre-fix behaviour, where the drift was upward and 1.2x the slack. IF THIS ARM EVER FAILS BY EXACTLY 56 B/op, suspect a new JVM taking the other branch before suspecting proj4j; anything else is a real regression. The EARLY-to-LATE spread is gone (2480 / 2872 / 1136 for createFromName), so the ramp that used to be the diagnostic is now itself the evidence the fix holds - keep all three parameters. No zero target is possible; the ratchet is the whole value. Note createFromParameters is the parse-only control and is UNCHANGED to the byte by the cache - 3360 / 4112 / 1920 before and after - which is how we know the cache touched only the init-file path." + } + ], + "ratchets": { + "AllocationBenchmark.crsHashCode": 0, + "AllocationBenchmark.geocentricConverterPerCall": 0, + "AllocationBenchmark.gridShiftDispatch": 0, + "AllocationBenchmark.helmertCartRoundTrip": 0, + "AllocationBenchmark.identityEnvelope": 0, + "AllocationBenchmark.projToProj": 0, + "AllocationBenchmark.utmOutParamArrays": 0, + "AllocationBenchmark.webMercatorForward": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=NAD27_TO_NAD83]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=UTM33N_TO_WEBMERCATOR]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=WGS84_TO_ALBERS_CONUS]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=WGS84_TO_GEOCENTRIC]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=WGS84_TO_OSGB36]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=WGS84_TO_UTM33N]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=WGS84_TO_WEBMERCATOR]": 0, + "BulkTransformBenchmark.loopOfSinglePoint[pair=WGS84_TO_WGS84]": 0, + "ConcurrentThroughputBenchmark.threads01": 0, + "ConcurrentThroughputBenchmark.threads02": 0, + "ConcurrentThroughputBenchmark.threads04": 0, + "ConcurrentThroughputBenchmark.threads08": 0, + "ConcurrentThroughputBenchmark.threads16": 0, + "CrsParseBenchmark.createFromName[position=EARLY]": 2480, + "CrsParseBenchmark.createFromName[position=LATE]": 1136, + "CrsParseBenchmark.createFromName[position=MIDDLE]": 2872, + "CrsParseBenchmark.createFromParameters[position=EARLY]": 3360, + "CrsParseBenchmark.createFromParameters[position=LATE]": 1920, + "CrsParseBenchmark.createFromParameters[position=MIDDLE]": 4112, + "CrsParseBenchmark.readEpsgFromParameters[position=EARLY]": 1080, + "CrsParseBenchmark.readEpsgFromParameters[position=LATE]": 984, + "CrsParseBenchmark.readEpsgFromParameters[position=MIDDLE]": 1464, + "EtmercBenchmark.etmercForward[deltaLonDeg=0.0]": 0, + "EtmercBenchmark.etmercForward[deltaLonDeg=1.5]": 0, + "EtmercBenchmark.etmercForward[deltaLonDeg=20.0]": 0, + "EtmercBenchmark.etmercForward[deltaLonDeg=3.0]": 0, + "EtmercBenchmark.etmercForward[deltaLonDeg=6.0]": 0, + "EtmercBenchmark.etmercInverse[deltaLonDeg=0.0]": 0, + "EtmercBenchmark.etmercInverse[deltaLonDeg=1.5]": 0, + "EtmercBenchmark.etmercInverse[deltaLonDeg=20.0]": 0, + "EtmercBenchmark.etmercInverse[deltaLonDeg=3.0]": 0, + "EtmercBenchmark.etmercInverse[deltaLonDeg=6.0]": 0, + "EtmercBenchmark.tmercForward[deltaLonDeg=0.0]": 0, + "EtmercBenchmark.tmercForward[deltaLonDeg=1.5]": 0, + "EtmercBenchmark.tmercForward[deltaLonDeg=20.0]": 0, + "EtmercBenchmark.tmercForward[deltaLonDeg=3.0]": 0, + "EtmercBenchmark.tmercForward[deltaLonDeg=6.0]": 0, + "EtmercBenchmark.tmercInverse[deltaLonDeg=0.0]": 0, + "EtmercBenchmark.tmercInverse[deltaLonDeg=1.5]": 0, + "EtmercBenchmark.tmercInverse[deltaLonDeg=20.0]": 0, + "EtmercBenchmark.tmercInverse[deltaLonDeg=3.0]": 0, + "EtmercBenchmark.tmercInverse[deltaLonDeg=6.0]": 0, + "GridShiftBenchmark.forwardShift": 0, + "GridShiftBenchmark.inverseShift": 0, + "GridShiftBenchmark.noGridHit": 576, + "GridShiftBenchmark.transformThroughEnvelope": 0, + "MathDispatchBenchmark.strictAcos": 0, + "MathDispatchBenchmark.strictAsin": 0, + "MathDispatchBenchmark.strictAtan": 0, + "MathDispatchBenchmark.strictAtan2": 0, + "MathDispatchBenchmark.strictCos": 32, + "MathDispatchBenchmark.strictCosh": 0, + "MathDispatchBenchmark.strictExp": 0, + "MathDispatchBenchmark.strictHypot": 0, + "MathDispatchBenchmark.strictLog": 0, + "MathDispatchBenchmark.strictLog10": 0, + "MathDispatchBenchmark.strictLog1p": 0, + "MathDispatchBenchmark.strictPow": 0, + "MathDispatchBenchmark.strictSin": 32, + "MathDispatchBenchmark.strictSinCos": 64, + "MathDispatchBenchmark.strictSinh": 0, + "MathDispatchBenchmark.strictTan": 32, + "SinglePointTransformBenchmark.transformReusedInput[pair=NAD27_TO_NAD83]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=UTM33N_TO_WEBMERCATOR]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=WGS84_TO_ALBERS_CONUS]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=WGS84_TO_GEOCENTRIC]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=WGS84_TO_OSGB36]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=WGS84_TO_UTM33N]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=WGS84_TO_WEBMERCATOR]": 0, + "SinglePointTransformBenchmark.transformReusedInput[pair=WGS84_TO_WGS84]": 0, + "SinglePointTransformBenchmark.transform[pair=NAD27_TO_NAD83]": 40, + "SinglePointTransformBenchmark.transform[pair=UTM33N_TO_WEBMERCATOR]": 40, + "SinglePointTransformBenchmark.transform[pair=WGS84_TO_ALBERS_CONUS]": 40, + "SinglePointTransformBenchmark.transform[pair=WGS84_TO_GEOCENTRIC]": 40, + "SinglePointTransformBenchmark.transform[pair=WGS84_TO_OSGB36]": 40, + "SinglePointTransformBenchmark.transform[pair=WGS84_TO_UTM33N]": 40, + "SinglePointTransformBenchmark.transform[pair=WGS84_TO_WEBMERCATOR]": 40, + "SinglePointTransformBenchmark.transform[pair=WGS84_TO_WGS84]": 40, + "SolverBenchmark.ellipticIntegralEllInt5[latDeg=0.0]": 0, + "SolverBenchmark.ellipticIntegralEllInt5[latDeg=45.0]": 0, + "SolverBenchmark.ellipticIntegralEllInt5[latDeg=70.0]": 0, + "SolverBenchmark.ellipticIntegralEllInt5[latDeg=89.9]": 0, + "SolverBenchmark.genericInverse2D[latDeg=0.0]": 0, + "SolverBenchmark.genericInverse2D[latDeg=45.0]": 0, + "SolverBenchmark.genericInverse2D[latDeg=70.0]": 0, + "SolverBenchmark.genericInverse2D[latDeg=89.9]": 0, + "SolverBenchmark.karneyAuthalicForward[latDeg=0.0]": 0, + "SolverBenchmark.karneyAuthalicForward[latDeg=45.0]": 0, + "SolverBenchmark.karneyAuthalicForward[latDeg=70.0]": 0, + "SolverBenchmark.karneyAuthalicForward[latDeg=89.9]": 0, + "SolverBenchmark.karneyAuthalicInverse[latDeg=0.0]": 0, + "SolverBenchmark.karneyAuthalicInverse[latDeg=45.0]": 0, + "SolverBenchmark.karneyAuthalicInverse[latDeg=70.0]": 0, + "SolverBenchmark.karneyAuthalicInverse[latDeg=89.9]": 0, + "SolverBenchmark.karneyInvMlfn[latDeg=0.0]": 0, + "SolverBenchmark.karneyInvMlfn[latDeg=45.0]": 0, + "SolverBenchmark.karneyInvMlfn[latDeg=70.0]": 0, + "SolverBenchmark.karneyInvMlfn[latDeg=89.9]": 0, + "SolverBenchmark.karneyMlfn[latDeg=0.0]": 0, + "SolverBenchmark.karneyMlfn[latDeg=45.0]": 0, + "SolverBenchmark.karneyMlfn[latDeg=70.0]": 0, + "SolverBenchmark.karneyMlfn[latDeg=89.9]": 0, + "SolverBenchmark.karneyPhi2[latDeg=0.0]": 0, + "SolverBenchmark.karneyPhi2[latDeg=45.0]": 0, + "SolverBenchmark.karneyPhi2[latDeg=70.0]": 0, + "SolverBenchmark.karneyPhi2[latDeg=89.9]": 0, + "SolverBenchmark.karneyTsfnSinCos[latDeg=0.0]": 0, + "SolverBenchmark.karneyTsfnSinCos[latDeg=45.0]": 0, + "SolverBenchmark.karneyTsfnSinCos[latDeg=70.0]": 0, + "SolverBenchmark.karneyTsfnSinCos[latDeg=89.9]": 0, + "SolverBenchmark.karneyTsfn[latDeg=0.0]": 0, + "SolverBenchmark.karneyTsfn[latDeg=45.0]": 0, + "SolverBenchmark.karneyTsfn[latDeg=70.0]": 0, + "SolverBenchmark.karneyTsfn[latDeg=89.9]": 0, + "SolverBenchmark.legacyAuthlat[latDeg=0.0]": 0, + "SolverBenchmark.legacyAuthlat[latDeg=45.0]": 0, + "SolverBenchmark.legacyAuthlat[latDeg=70.0]": 0, + "SolverBenchmark.legacyAuthlat[latDeg=89.9]": 0, + "SolverBenchmark.legacyInvMlfn[latDeg=0.0]": 0, + "SolverBenchmark.legacyInvMlfn[latDeg=45.0]": 0, + "SolverBenchmark.legacyInvMlfn[latDeg=70.0]": 0, + "SolverBenchmark.legacyInvMlfn[latDeg=89.9]": 0, + "SolverBenchmark.legacyMlfn[latDeg=0.0]": 0, + "SolverBenchmark.legacyMlfn[latDeg=45.0]": 0, + "SolverBenchmark.legacyMlfn[latDeg=70.0]": 0, + "SolverBenchmark.legacyMlfn[latDeg=89.9]": 0, + "SolverBenchmark.legacyPhi2[latDeg=0.0]": 0, + "SolverBenchmark.legacyPhi2[latDeg=45.0]": 0, + "SolverBenchmark.legacyPhi2[latDeg=70.0]": 0, + "SolverBenchmark.legacyPhi2[latDeg=89.9]": 0, + "SolverBenchmark.legacyQsfn[latDeg=0.0]": 0, + "SolverBenchmark.legacyQsfn[latDeg=45.0]": 0, + "SolverBenchmark.legacyQsfn[latDeg=70.0]": 0, + "SolverBenchmark.legacyQsfn[latDeg=89.9]": 0, + "SolverBenchmark.legacyTsfn[latDeg=0.0]": 0, + "SolverBenchmark.legacyTsfn[latDeg=45.0]": 0, + "SolverBenchmark.legacyTsfn[latDeg=70.0]": 0, + "SolverBenchmark.legacyTsfn[latDeg=89.9]": 0, + "SolverBenchmark.mathHelpersAsinh[latDeg=0.0]": 0, + "SolverBenchmark.mathHelpersAsinh[latDeg=45.0]": 0, + "SolverBenchmark.mathHelpersAsinh[latDeg=70.0]": 0, + "SolverBenchmark.mathHelpersAsinh[latDeg=89.9]": 0, + "SolverBenchmark.mathHelpersAtanh[latDeg=0.0]": 0, + "SolverBenchmark.mathHelpersAtanh[latDeg=45.0]": 0, + "SolverBenchmark.mathHelpersAtanh[latDeg=70.0]": 0, + "SolverBenchmark.mathHelpersAtanh[latDeg=89.9]": 0, + "SolverBenchmark.mathHelpersNorm2[latDeg=0.0]": 0, + "SolverBenchmark.mathHelpersNorm2[latDeg=45.0]": 0, + "SolverBenchmark.mathHelpersNorm2[latDeg=70.0]": 0, + "SolverBenchmark.mathHelpersNorm2[latDeg=89.9]": 0, + "SolverBenchmark.mathHypot[latDeg=0.0]": 0, + "SolverBenchmark.mathHypot[latDeg=45.0]": 0, + "SolverBenchmark.mathHypot[latDeg=70.0]": 0, + "SolverBenchmark.mathHypot[latDeg=89.9]": 0, + "TransformCacheBenchmark.buildStringKey": 0, + "TransformCacheBenchmark.createTransformUncached": 112, + "TransformCacheBenchmark.crsCacheHit": 0, + "TransformCacheBenchmark.crsCacheMissEquivalent": 1136, + "TransformCacheBenchmark.crsEquals": 0, + "TransformCacheBenchmark.crsHashCode": 0, + "TransformCacheBenchmark.objectKeyLookup": 24, + "TransformCacheBenchmark.stringPairKeyLookup": 0, + "_note": [ + "PER-BENCHMARK RATCHETS. Populated by --record, keyed by SimpleClass.method[param=value].", + "These are the PRIMARY ceiling: where a key appears here, the gate compares against it and", + "the matching rule's maxBytesPerOp becomes a fallback for keys that are absent.", + "", + "Why both: a rule's single number spans every arm it matches, and some rules legitimately", + "cover arms two orders of magnitude apart. CrsParseBenchmark's EARLY and LATE parameters used", + "to differ by about 200x BECAUSE THAT SPREAD WAS THE FINDING - the init file was re-scanned", + "linearly per call - so a single ceiling set by LATE would have left EARLY completely ungated.", + "Per-key ratchets gate every arm at its own figure while the rule keeps the policy, the `why`", + "and the class-level cap. The spread is gone now, and the per-key ratchets are what make its", + "absence enforceable rather than merely observed.", + "", + "Not written for rules marked ratchetable:false - a per-key entry there would override a", + "normative ceiling, which is the one thing that flag exists to prevent.", + "", + "THE NINE CrsParseBenchmark ENTRIES BELOW ARE NOW ENFORCED. They were reported-only while their", + "rule carried tier1Gated:false; that exclusion is gone and every entry in this block is a", + "ceiling the gate fails on. The nine were re-measured by hand rather than by --record, over 21", + "independent forks per arm, and each is pinned at its arm's observed MAXIMUM - see the crs-parse", + "rule's `why` for why the maximum is the right choice for the two arms that are not", + "single-valued.", + "", + "Captured 2026-08-01 on Apple M5 Max / Temurin 21.0.11 aarch64: 181/181 arms, 162 per-benchmark", + "ratchets, plus 25 rules. The nine CrsParseBenchmark ratchets were re-measured 2026-08-02 on the", + "same JDK and architecture after the init-file cache landed; all 162 are now enforced." + ] + } +} diff --git a/benchmark/src/main/resources/baseline/op-counts.json b/benchmark/src/main/resources/baseline/op-counts.json new file mode 100644 index 0000000..7582626 --- /dev/null +++ b/benchmark/src/main/resources/baseline/op-counts.json @@ -0,0 +1,195 @@ +{ + "_format": 1, + "_doc": [ + "Tier 2 baseline: transcendental calls per single transform, per CRS pair.", + "Fully deterministic - one transform of the pinned sample point in CrsPair.", + "Regenerate with: java -cp target/benchmarks.jar org.locationtech.proj4j.benchmark.gate.GateChecker --record", + "A count that DROPS is the expected outcome of a numerics.md rewrite; say so in the commit message.", + "A count that RISES is an extra iteration or a reintroduced transcendental." + ], + "capturedAt": { + "commit": "8f0fbd81bf53f95bd3c824a18a65f673c7ae2635", + "date": "2026-08-02T16:21:38.424204Z", + "jdk": "21.0.11+10-LTS", + "arch": "aarch64", + "os": "Mac OS X" + }, + "pairs": { + "WGS84_TO_WGS84": { + "_crs": "EPSG:4326 -> EPSG:4326", + "sin": 0, + "cos": 0, + "tan": 0, + "pow": 0, + "exp": 0, + "log": 0, + "atan": 0, + "atan2": 0, + "sqrt": 0, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 0, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "WGS84_TO_WEBMERCATOR": { + "_crs": "EPSG:4326 -> EPSG:3857", + "sin": 0, + "cos": 0, + "tan": 1, + "pow": 0, + "exp": 0, + "log": 1, + "atan": 0, + "atan2": 0, + "sqrt": 1, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 0, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "WGS84_TO_UTM33N": { + "_crs": "EPSG:4326 -> EPSG:32633", + "sin": 2, + "cos": 2, + "tan": 0, + "pow": 0, + "exp": 0, + "log": 0, + "atan": 0, + "atan2": 1, + "sqrt": 2, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 1, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "UTM33N_TO_WEBMERCATOR": { + "_crs": "EPSG:32633 -> EPSG:3857", + "sin": 2, + "cos": 2, + "tan": 1, + "pow": 0, + "exp": 1, + "log": 1, + "atan": 0, + "atan2": 2, + "sqrt": 3, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 1, + "cosh": 0, + "log1p": 0, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "WGS84_TO_OSGB36": { + "_crs": "EPSG:4326 -> EPSG:27700", + "sin": 4, + "cos": 4, + "tan": 0, + "pow": 0, + "exp": 0, + "log": 0, + "atan": 1, + "atan2": 2, + "sqrt": 10, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 1, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "NAD27_TO_NAD83": { + "_crs": "EPSG:4267 -> EPSG:4269", + "sin": 2, + "cos": 2, + "tan": 0, + "pow": 0, + "exp": 0, + "log": 0, + "atan": 1, + "atan2": 1, + "sqrt": 8, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 0, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "WGS84_TO_ALBERS_CONUS": { + "_crs": "EPSG:4326 -> EPSG:5070", + "sin": 2, + "cos": 1, + "tan": 0, + "pow": 0, + "exp": 0, + "log": 0, + "atan": 0, + "atan2": 0, + "sqrt": 1, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 1, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + }, + "WGS84_TO_GEOCENTRIC": { + "_crs": "EPSG:4326 -> EPSG:4978", + "sin": 2, + "cos": 2, + "tan": 0, + "pow": 0, + "exp": 0, + "log": 0, + "atan": 0, + "atan2": 0, + "sqrt": 1, + "hypot": 0, + "asin": 0, + "acos": 0, + "log10": 0, + "sinh": 0, + "cosh": 0, + "log1p": 0, + "cbrt": 0, + "expm1": 0, + "tanh": 0 + } + } +} diff --git a/conformance/pom.xml b/conformance/pom.xml new file mode 100644 index 0000000..48a74ad --- /dev/null +++ b/conformance/pom.xml @@ -0,0 +1,124 @@ + + + 4.0.0 + + + io.github.emilevictor.neoproj4j + neoproj4j-modules + 1.3.1-SNAPSHOT + + + neoproj4j-conformance + jar + neoProj4J PROJ Conformance Suite + + Runs PROJ's own gie and GIGS conformance corpora, vendored from PROJ 9.8.1, against neoProj4J. + + This module is NOT PUBLISHED. It exists only to produce a conformance number and to gate + regressions. The vendored corpus carries third-party licence obligations - see + src/test/resources/NOTICE-gie.md, which is a licence requirement and not documentation. + + The corpus is re-synced by conformance/sync-upstream.sh, which is pinned to a single PROJ rev. + + + + + true + true + true + true + true + + 5.10.2 + 1.10.2 + + + true + + + + + io.github.emilevictor.neoproj4j + neoproj4j + ${project.version} + + + io.github.emilevictor.neoproj4j + neoproj4j-epsg + ${project.version} + test + + + + + org.junit.jupiter + junit-jupiter + ${junit.jupiter.version} + test + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + true + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + YES + + + ${gie.corpus.skip} + + + -Duser.language=en -Duser.country=US -Duser.timezone=UTC -Dfile.encoding=UTF-8 + + + + + + + + + conformance + + false + + + + diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/BridgeVerdictCrossTabTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/BridgeVerdictCrossTabTest.java new file mode 100644 index 0000000..4137b87 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/BridgeVerdictCrossTabTest.java @@ -0,0 +1,378 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.net.URL; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.conformance.parse.GieCommand; +import org.locationtech.proj4j.conformance.parse.GieFile; +import org.locationtech.proj4j.conformance.parse.GieLexer; +import org.locationtech.proj4j.conformance.parse.GieVerb; + +/** + * The false-positive control for {@link GieFailureKind#INVALID_DEFINITION}. + * + *

{@code INVALID_DEFINITION} is the one bridge verdict that can manufacture a + * false pass: {@code ExpectedFailureVerdict.ofConstructionFailure} promotes it + * to {@code PASS_EXPECTED_FAILURE} on any row that is not a {@code coord_transfm*} / + * {@code no_inverse_op} assertion. Every other verdict can only understate progress. + * + *

The corpus itself supplies the control. Cross-tabulate each {@code operation}'s + * bridge verdict against what the corpus asserts about it: + * + *

+ *                              INVALID_DEFINITION   NOT_IMPLEMENTED   executable
+ *   followed by expect failure          n                 n               n
+ *   followed by a coordinate         MUST BE 0            n               n
+ * 
+ * + *

An operation the bridge calls {@code INVALID_DEFINITION} that the corpus + * follows with a coordinate assertion is a proven false positive — PROJ + * demonstrably built that operation and produced numbers from it, so "PROJ 9.8.1 + * would reject this too" is false. That is the bottom-left cell, and it must read 0. + * + *

An operation counts as "followed by a coordinate" if any of its + * assertions is a coordinate {@code expect} or a {@code roundtrip}; only operations + * whose every assertion is an {@code expect failure} land in the top row. That is the + * sensitive direction for the control: a single coordinate anywhere in the block is + * enough to convict. + * + *

{@link #crossTabDetectsAnInjectedFalsePositive()} is the positive control + * required by the skill's non-negotiable 5c — a verification without one is a claim, + * not a measurement. It re-runs the same tabulation with a mutant verdict function + * that calls a handful of demonstrably-valid operators invalid, and asserts the + * bottom-left cell becomes non-zero. Without it, a tabulation that silently counted + * nothing would report the same clean 0. + */ +class BridgeVerdictCrossTabTest { + + // ------------------------------------------------------------ resolution + + private static Path corpusDir(String name) { + try { + URL u = BridgeVerdictCrossTabTest.class.getResource("/" + name); + if (u != null && "file".equals(u.getProtocol())) { + Path p = Paths.get(u.toURI()); + if (Files.isDirectory(p)) { + return p; + } + } + } catch (Exception ignored) { + // fall through to the source tree + } + for (String prefix : new String[] {"src/test/resources", "conformance/src/test/resources"}) { + Path p = Paths.get(prefix).resolve(name); + if (Files.isDirectory(p)) { + return p; + } + } + return null; + } + + private static List activeGieFiles() throws IOException { + List out = new ArrayList(); + for (String dir : new String[] {"gie", "gigs"}) { + Path d = corpusDir(dir); + if (d == null) { + continue; + } + DirectoryStream s = Files.newDirectoryStream(d, "*.gie"); + try { + for (Path p : s) { + out.add(p); + } + } finally { + s.close(); + } + } + Collections.sort(out); + return out; + } + + // --------------------------------------------------------- the tabulation + + /** How the bridge classified one operation. {@code null} kind means executable. */ + private interface Verdict { + GieFailure classify(String args); + } + + /** One {@code operation} block and what the corpus asserts about it. */ + private static final class Block { + final String where; + final String args; + final GieFailureKind kind; + final String reason; + final List errnos = new ArrayList(); + int coordinateAssertions; + int failureAssertions; + + Block(String where, String args, GieFailure failure) { + this.where = where; + this.args = args; + this.kind = failure == null ? null : failure.kind(); + this.reason = failure == null ? "" : failure.message(); + } + + boolean followedByCoordinate() { + return coordinateAssertions > 0; + } + + boolean hasAssertions() { + return coordinateAssertions + failureAssertions > 0; + } + } + + private static List tabulate(List files, Verdict verdict) throws IOException { + List blocks = new ArrayList(); + for (Path f : files) { + GieFile parsed = GieLexer.lex(f); + Block current = null; + String pendingSrc = null; + String pendingDst = null; + for (GieCommand c : parsed.commands()) { + switch (c.verb()) { + case OPERATION: + current = new Block(f.getFileName() + ":" + c.line(), c.args(), + verdict.classify(c.args())); + blocks.add(current); + pendingSrc = null; + pendingDst = null; + break; + case CRS_SRC: + case CRS_DST: + // A completed crs_src+crs_dst pair opens a block of its own, exactly as + // `operation` does (gie.cpp:719-736), and gie then clears both back to "". + if (c.verb() == GieVerb.CRS_SRC) { + pendingSrc = c.args(); + } else { + pendingDst = c.args(); + } + if (pendingSrc != null && pendingDst != null) { + // Tracked so their assertions are not misattributed to the preceding + // `operation`; the pairs themselves are reported separately. + current = null; + pendingSrc = null; + pendingDst = null; + } + break; + case EXPECT: + if (current != null) { + if (isExpectFailure(c.args())) { + current.failureAssertions++; + current.errnos.add(errnoOf(c.args())); + } else { + current.coordinateAssertions++; + } + } + break; + case ROUNDTRIP: + if (current != null) { + current.coordinateAssertions++; + } + break; + default: + break; + } + } + } + return blocks; + } + + /** gie's own test: {@code expect}'s argument starts with the 7 characters "failure". */ + private static boolean isExpectFailure(String args) { + return args != null && args.startsWith("failure"); + } + + /** The errno constant an {@code expect failure} row names, or {@code "-"}. */ + private static String errnoOf(String args) { + String[] tok = args.trim().split("\\s+"); + if (tok.length >= 3 && tok[1].startsWith("errno")) { + return tok[2]; + } + return "-"; + } + + private static int[][] cells(List blocks) { + // [row][col]; row 0 = expect failure, row 1 = coordinate. + // col 0 = INVALID_DEFINITION, col 1 = NOT_IMPLEMENTED, col 2 = executable. + int[][] t = new int[2][3]; + for (Block b : blocks) { + if (!b.hasAssertions()) { + continue; + } + int row = b.followedByCoordinate() ? 1 : 0; + int col; + if (b.kind == null) { + col = 2; + } else if (b.kind == GieFailureKind.INVALID_DEFINITION) { + col = 0; + } else { + col = 1; + } + t[row][col]++; + } + return t; + } + + private static String render(int[][] t) { + StringBuilder r = new StringBuilder(); + r.append(String.format("%-30s %20s %18s %12s%n", "", "INVALID_DEFINITION", + "NOT_IMPLEMENTED", "executable")); + r.append(String.format("%-30s %20d %18d %12d%n", "followed by expect failure", + Integer.valueOf(t[0][0]), Integer.valueOf(t[0][1]), Integer.valueOf(t[0][2]))); + r.append(String.format("%-30s %20d %18d %12d%n", "followed by a coordinate", + Integer.valueOf(t[1][0]), Integer.valueOf(t[1][1]), Integer.valueOf(t[1][2]))); + return r.toString(); + } + + // ---------------------------------------------------------------- the test + + @Test + @DisplayName("no INVALID_DEFINITION operation is followed by a coordinate assertion") + void crossTabHasNoFalsePositives() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), "corpus not vendored yet"); + + final GieOperationFactory factory = new Proj4jGieOperationFactory(); + List blocks; + PrintStream savedErr = System.err; + ByteArrayOutputStream captured = new ByteArrayOutputStream(); + try { + System.setErr(new PrintStream(captured, true, "UTF-8")); + blocks = tabulate(files, new Verdict() { + @Override + public GieFailure classify(String args) { + GieOperation o = factory.create(args); + return o.isUsable() ? null : o.failure(); + } + }); + } finally { + System.setErr(savedErr); + } + + int[][] t = cells(blocks); + StringBuilder r = new StringBuilder("\n=== bridge verdict x corpus assertion ===\n"); + r.append(render(t)); + + // The evidence, spelled out, for whichever cell is non-zero. + List falsePositives = new ArrayList(); + for (Block b : blocks) { + if (b.kind == GieFailureKind.INVALID_DEFINITION && b.followedByCoordinate()) { + falsePositives.add(b); + } + } + if (!falsePositives.isEmpty()) { + r.append("\n PROVEN FALSE POSITIVES (PROJ produced coordinates for these):\n"); + for (Block b : falsePositives) { + r.append(" ").append(b.where).append(" ").append(b.args).append('\n'); + r.append(" reason: ").append(b.reason).append('\n'); + } + } + + // The recoverable population: expect-failure rows the bridge cannot speak to. + Map notImplByProj = new TreeMap(); + Map exampleByProj = new TreeMap(); + int notImplRows = 0; + for (Block b : blocks) { + if (b.kind == GieFailureKind.NOT_IMPLEMENTED && !b.followedByCoordinate() + && b.hasAssertions()) { + String name = GieProjArgs.parse(b.args).peek("proj"); + String key = name == null ? "(none)" : name; + Integer cur = notImplByProj.get(key); + notImplByProj.put(key, Integer.valueOf(cur == null ? 1 : cur.intValue() + 1)); + if (!exampleByProj.containsKey(key)) { + exampleByProj.put(key, b.where + " " + b.args); + } + notImplRows += b.failureAssertions; + } + } + r.append("\n NOT_IMPLEMENTED operations whose every assertion is `expect failure`,\n"); + r.append(" by +proj (").append(notImplRows).append(" assertion rows):\n"); + List> sorted = + new ArrayList>(notImplByProj.entrySet()); + Collections.sort(sorted, new Comparator>() { + @Override + public int compare(Map.Entry a, Map.Entry b) { + int c = b.getValue().compareTo(a.getValue()); + return c != 0 ? c : a.getKey().compareTo(b.getKey()); + } + }); + for (Map.Entry e : sorted) { + r.append(String.format(" %-14s %3d %s%n", e.getKey(), e.getValue(), + exampleByProj.get(e.getKey()))); + } + r.append("\n ...in full:\n"); + for (Block b : blocks) { + if (b.kind == GieFailureKind.NOT_IMPLEMENTED && !b.followedByCoordinate() + && b.hasAssertions()) { + r.append(String.format(" %-28s %-42s %s%n", b.where, b.errnos, b.args)); + } + } + System.out.print(r); + + assertEquals(0, t[1][0], + "PROVEN FALSE POSITIVES: the bridge called these definitions invalid, but the " + + "corpus asserts PROJ produced coordinates from them.\n" + r); + } + + /** + * Positive control. The clean 0 above is only meaningful if this tabulation can + * report a non-zero. A mutant verdict function calls three operators that the + * corpus exercises with real coordinates {@code INVALID_DEFINITION}; the + * bottom-left cell must light up. + */ + @Test + @DisplayName("positive control: the cross-tab detects an injected false positive") + void crossTabDetectsAnInjectedFalsePositive() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), "corpus not vendored yet"); + + List blocks = tabulate(files, new Verdict() { + @Override + public GieFailure classify(String args) { + String name = GieProjArgs.parse(args).peek("proj"); + if ("merc".equals(name) || "utm".equals(name) || "aea".equals(name)) { + return GieFailures.invalidDefinition("injected false positive for +proj=" + name); + } + return null; + } + }); + + int[][] t = cells(blocks); + assertTrue(t[1][0] > 0, + "the cross-tab failed to detect a deliberately injected false positive, so its " + + "clean result on the real bridge means nothing:\n" + render(t)); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/CrsToCrsOperation.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/CrsToCrsOperation.java new file mode 100644 index 0000000..fc122e1 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/CrsToCrsOperation.java @@ -0,0 +1,208 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * A gie {@code crs_src} + {@code crs_dst} pair, run through proj4j's + * {@code CoordinateTransformFactory}. + * + *

Units are degrees, not radians, on a geographic side. PROJ builds + * these operations with {@code proj_create_crs_to_crs}, whose pipeline ends in a + * {@code +proj=unitconvert} to {@code Degree} for a geographic CRS — one of only + * two places {@link GieIoUnits#DEGREES} arises in the whole library + * ({@code unitconvert.cpp:491-493,514-516}). proj4j's + * {@code BasicCoordinateTransform} happens to agree: it takes and returns degrees + * for a geographic CRS. So no conversion happens here either. + * + *

Both directions are supported by building the transform twice, once each way, + * because {@code CoordinateTransform} has no inverse method. + * + *

How little of the corpus reaches this class

+ * + *

{@code crs_src}/{@code crs_dst} appear in exactly two corpus files, + * {@code epsg_no_grid.gie} (7 pairs, 6 assertions) and {@code epsg_grid.gie} + * (3 pairs, 2 assertions). Measured by counting invocations over a full sweep: + * {@link #transform} is entered 3 times in the whole 7,923-assertion run, for + * two distinct CRS pairs, and reaches the bottom of the method once. All 8 of + * those assertions currently score FAIL (6) or SKIP (2) — none is a pass, so + * no figure in the headline depends on anything this class decides. That is also why + * this class is the only route from the corpus into + * {@code BasicCoordinateTransform}: every other operation goes to + * {@code SingleProjectionOperation} or {@code PipelineGieOperation}, neither of which + * touches {@code CoordinateTransform}. + */ +final class CrsToCrsOperation implements GieOperation { + + private final String source; + private final String target; + private final CoordinateTransform forward; + private final CoordinateTransform inverse; + private final GieIoUnits left; + private final GieIoUnits right; + + private GieFailure lastFailure; + + CrsToCrsOperation(String source, String target, CoordinateTransform forward, + CoordinateTransform inverse, GieIoUnits left, GieIoUnits right) { + this.source = source; + this.target = target; + this.forward = forward; + this.inverse = inverse; + this.left = left; + this.right = right; + } + + @Override + public boolean isUsable() { + return true; + } + + @Override + public GieFailure failure() { + return null; + } + + @Override + public GieIoUnits leftUnits() { + return left; + } + + @Override + public GieIoUnits rightUnits() { + return right; + } + + @Override + public boolean isInverted() { + // A crs_src/crs_dst pair is never built with +inv; gie's `direction` + // command is what reverses it, and that arrives as the `dir` argument. + return false; + } + + @Override + public boolean crsDstIsLatLonOrYX() { + // See GieOperation#crsDstIsLatLonOrYX. This is the case where the + // limitation actually costs assertions: EPSG:2393 ("Finland YKJ Northing, + // Easting") and the other latitude-first targets in epsg_no_grid.gie need + // the swap, and proj4j exposes no axis metadata to detect them with. + return false; + } + + @Override + public GieFailure lastFailure() { + return lastFailure; + } + + @Override + public double[] transform(double[] in, GieDirection dir) { + lastFailure = null; + if (in == null || in.length < 2) { + lastFailure = GieFailures.of(GieFailureKind.INVALID_COORD, + "a coordinate needs at least two ordinates"); + return null; + } + CoordinateTransform ct = dir == GieDirection.FORWARD ? forward : inverse; + if (ct == null) { + lastFailure = GieFailures.of(GieFailureKind.NO_INVERSE, + "no transform available from " + target + " back to " + source); + return null; + } + double x = in[0]; + double y = in[1]; + // Defaulting an absent height to 0 is FAITHFUL, not a papering-over. gie's parse_coord + // opens with `PJ_COORD a = proj_coord(0, 0, 0, 0)` (9.8.1:src/apps/gie.cpp:820) and only + // then overwrites v[0..dimensions_given-1]; accept() stores that whole 4D value in T.a + // (:878) and the transform is handed `ci` derived from it unmasked (:1107, :1114). + // dimensions_given is consulted only on the way OUT (:1115-1117) and for the temporal + // check. So PROJ's kernel receives z = 0 for a two-number `accept`, exactly as this does; + // .gie has no syntax for an ABSENT height, only for a zero one. That is an expressive + // limit of the corpus, and it is why core's absent-height sentinel (a NaN src.z, see + // BasicCoordinateTransform's noHeightIn) is unreachable from here -- correctly. + // + // In practice the ternary never takes its else branch: GieRunner always passes + // GieCoord.toArray(), which is length 4 and zero-initialised (GieCoordParser.java:58), + // mirroring proj_coord(0,0,0,0). Kept for the contract. + double z = in.length > 2 ? in[2] : 0.0; + double t = in.length > 3 ? in[3] : 0.0; + + ProjCoordinate src = new ProjCoordinate(x, y, z); + ProjCoordinate dst = new ProjCoordinate(); + dst.x = Double.NaN; + dst.y = Double.NaN; + dst.z = Double.NaN; + try { + ct.transform(src, dst); + } catch (Throwable e) { + GieFailure f = Proj4jGieOperationFactory.mapTransformThrowable(e); + if (f == null) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } + throw (Error) e; + } + lastFailure = f; + return null; + } + if (isBad(dst.x, x) || isBad(dst.y, y)) { + lastFailure = GieFailures.of(GieFailureKind.NUMERICAL, + "non-finite result (" + dst.x + ", " + dst.y + ") from " + source + + " to " + target); + return null; + } + // Report the z the transform actually produced. This used to be + // `Double.isNaN(dst.z) ? z : dst.z`, and SingleProjectionOperation still carries that + // expression -- correctly, for a reason that does not hold here. + // + // There, dst.z is poisoned to NaN and a 2D Projection never writes it, so the poison + // survives and "NaN" genuinely means "the operator produced no height"; substituting the + // input is then the right answer, and removing it was MEASURED to cost 5 assertions in + // builtins.gie's `+proj=geocent +ellps=GRS80` block, off by the radius of the Earth. + // + // Here the poison cannot survive: BasicCoordinateTransform's first act is + // `tgt.setValue(src)` (ProjCoordinate.java:172-176 copies z), so dst.z is always written. + // A NaN coming out of a CRS->CRS transform is therefore never "untouched" -- it is either + // a computed non-finite, or core's absent-height sentinel, and neither may be reported as + // the caller's input. That is non-negotiable 3 inside the measuring instrument. + // + // Deliberately NOT escalated to a NUMERICAL failure the way x and y are above: gie masks + // the third ordinate when the *expect* line gives fewer than three numbers + // (9.8.1:src/apps/gie.cpp:1117), so for a 2D expect a NaN z is discarded by the comparator + // and the row still passes. GieComparator reproduces that masking. Failing here instead + // would make the harness stricter than the corpus, which manufactures failures. + // + // Measured at this tree state: zero assertions change outcome either way -- see the + // liveness note on transform() above. + return new double[] {dst.x, dst.y, dst.z, t}; + } + + private static boolean isBad(double out, double in) { + if (!Double.isNaN(out) && !Double.isInfinite(out)) { + return false; + } + return !(Double.isNaN(out) && Double.isNaN(in)); + } + + @Override + public String toString() { + return "CrsToCrsOperation[" + source + " -> " + target + ", left=" + left + + ", right=" + right + "]"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieCorpusClassificationTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieCorpusClassificationTest.java new file mode 100644 index 0000000..255eb03 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieCorpusClassificationTest.java @@ -0,0 +1,292 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.net.URL; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.conformance.parse.GieCommand; +import org.locationtech.proj4j.conformance.parse.GieFile; +import org.locationtech.proj4j.conformance.parse.GieLexer; +import org.locationtech.proj4j.conformance.parse.GieVerb; + +/** + * Runs the bridge over every {@code operation} and {@code crs_src}/{@code crs_dst} + * pair in the vendored corpus and prints the census. + * + *

This is the most useful single number the bridge can produce: how many of the + * corpus's operations are executable versus classified, and — for the + * classified ones — the exact reason, aggregated. Without it, "the bridge is an + * honest boundary" is an assertion rather than a measurement. + * + *

Deliberately not gated behind {@code gie.corpus.skip}: it constructs + * operations but transforms no coordinates, so it costs a couple of seconds, and a + * silent collapse in executability is exactly the regression this module exists to + * catch. + */ +class GieCorpusClassificationTest { + + // ------------------------------------------------------------ resolution + + private static Path corpusDir(String name) { + try { + URL u = GieCorpusClassificationTest.class.getResource("/" + name); + if (u != null && "file".equals(u.getProtocol())) { + Path p = Paths.get(u.toURI()); + if (Files.isDirectory(p)) { + return p; + } + } + } catch (Exception ignored) { + // fall through to the source tree + } + for (String prefix : new String[] {"src/test/resources", "conformance/src/test/resources"}) { + Path p = Paths.get(prefix).resolve(name); + if (Files.isDirectory(p)) { + return p; + } + } + return null; + } + + private static List activeGieFiles() throws IOException { + List out = new ArrayList(); + for (String dir : new String[] {"gie", "gigs"}) { + Path d = corpusDir(dir); + if (d == null) { + continue; + } + // "*.gie" already excludes the quarantined "*.gie.failing". + DirectoryStream s = Files.newDirectoryStream(d, "*.gie"); + try { + for (Path p : s) { + out.add(p); + } + } finally { + s.close(); + } + } + Collections.sort(out); + return out; + } + + // ------------------------------------------------------------- the sweep + + @Test + @DisplayName("classify every operation in the 42 active corpus files and print the census") + void classifyWholeCorpus() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), + "corpus not vendored under src/test/resources/{gie,gigs} yet"); + + GieOperationFactory factory = new Proj4jGieOperationFactory(); + + int operations = 0; + int usable = 0; + Map byKind = new EnumMap(GieFailureKind.class); + for (GieFailureKind k : GieFailureKind.values()) { + byKind.put(k, Integer.valueOf(0)); + } + Map reasons = new TreeMap(); + Map usableByProj = new TreeMap(); + Map perFile = new LinkedHashMap(); + + // Registry.getProjection prints a stack trace for the three abstract + // registrations; the probe suppresses that, and this assertion proves it. + PrintStream savedErr = System.err; + ByteArrayOutputStream captured = new ByteArrayOutputStream(); + try { + System.setErr(new PrintStream(captured, true, "UTF-8")); + + for (Path f : files) { + GieFile parsed = GieLexer.lex(f); + int[] counts = new int[2]; + perFile.put(f.getFileName().toString(), counts); + for (GieCommand c : parsed.commands(GieVerb.OPERATION)) { + operations++; + GieOperation o = factory.create(c.args()); + assertNotNull(o, f + ":" + c.line() + " produced no GieOperation"); + if (o.isUsable()) { + usable++; + counts[0]++; + String name = GieProjArgs.parse(c.args()).peek("proj"); + bump(usableByProj, name == null ? "(none)" : name); + } else { + counts[1]++; + GieFailure fail = o.failure(); + assertNotNull(fail, f + ":" + c.line() + " unusable without a failure"); + byKind.put(fail.kind(), + Integer.valueOf(byKind.get(fail.kind()).intValue() + 1)); + bump(reasons, fail.kind() + " | " + summarise(fail.message())); + } + } + } + } finally { + System.setErr(savedErr); + } + + String leaked = captured.toString("UTF-8"); + assertEquals("", leaked, + "the sweep leaked output to stderr; Registry's abstract-registration stack " + + "traces must stay suppressed:\n" + leaked); + + // ------------------------------------------------------------ report + StringBuilder r = new StringBuilder(); + r.append("\n=== gie corpus operation census (").append(files.size()) + .append(" active files) ===\n"); + r.append(String.format(" operations %5d%n", Integer.valueOf(operations))); + r.append(String.format(" executable %5d (%.1f%%)%n", Integer.valueOf(usable), + Double.valueOf(100.0 * usable / Math.max(1, operations)))); + r.append(String.format(" classified %5d%n", + Integer.valueOf(operations - usable))); + for (GieFailureKind k : GieFailureKind.values()) { + int n = byKind.get(k).intValue(); + if (n > 0) { + r.append(String.format(" %-20s %5d%n", k, Integer.valueOf(n))); + } + } + + r.append("\n executable operations by +proj=:\n"); + for (Map.Entry e : sortedByCountDesc(usableByProj)) { + r.append(String.format(" %-14s %4d%n", e.getKey(), e.getValue())); + } + + r.append("\n top classification reasons:\n"); + int shown = 0; + for (Map.Entry e : sortedByCountDesc(reasons)) { + if (shown++ >= 30) { + break; + } + r.append(String.format(" %4d %s%n", e.getValue(), e.getKey())); + } + + r.append("\n per-file executable/classified:\n"); + for (Map.Entry e : perFile.entrySet()) { + r.append(String.format(" %-24s %4d / %4d%n", e.getKey(), + Integer.valueOf(e.getValue()[0]), Integer.valueOf(e.getValue()[1]))); + } + System.out.print(r); + + // Invariants, not vanity numbers. These are the shape of the answer, and + // they are the thing that breaks if the bridge silently regresses. + assertEquals(780, operations, + "the active corpus has 780 `operation` commands (measured by GieCorpusLexTest)"); + assertTrue(usable >= 150, + "only " + usable + " of " + operations + " operations are executable; the bridge " + + "has regressed or core has. Census:\n" + r); + assertTrue(byKind.get(GieFailureKind.NOT_IMPLEMENTED).intValue() > 0); + assertTrue(byKind.get(GieFailureKind.INVALID_DEFINITION).intValue() > 0, + "no operation classified INVALID_DEFINITION - the split that makes " + + "`expect failure` rows meaningful has stopped working"); + } + + @Test + @DisplayName("classify every crs_src/crs_dst pair") + void classifyCrsPairs() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), "corpus not vendored yet"); + + GieOperationFactory factory = new Proj4jGieOperationFactory(); + StringBuilder r = new StringBuilder("\n=== gie corpus crs_src/crs_dst census ===\n"); + int pairs = 0; + int usable = 0; + for (Path f : files) { + GieFile parsed = GieLexer.lex(f); + List src = parsed.commands(GieVerb.CRS_SRC); + List dst = parsed.commands(GieVerb.CRS_DST); + int n = Math.min(src.size(), dst.size()); + for (int i = 0; i < n; i++) { + pairs++; + String s = firstToken(src.get(i).args()); + String d = firstToken(dst.get(i).args()); + GieOperation o = factory.createCrsToCrs(s, d); + assertNotNull(o); + if (o.isUsable()) { + usable++; + r.append(String.format(" OK %-12s -> %-12s left=%s right=%s%n", s, d, + o.leftUnits(), o.rightUnits())); + } else { + r.append(String.format(" %-5s %-12s -> %-12s %s%n", o.failure().kind(), s, d, + summarise(o.failure().message()))); + } + } + } + r.append(String.format(" %d pairs, %d executable%n", Integer.valueOf(pairs), + Integer.valueOf(usable))); + System.out.print(r); + assertEquals(8, pairs, "the active corpus has 8 crs_src/crs_dst pairs"); + } + + /** + * A {@code crs_src} argument is a single token; anything after it is a trailing + * comment the lexer already stripped, but a defensive split costs nothing. + */ + private static String firstToken(String args) { + if (args == null) { + return null; + } + String t = args.trim(); + int sp = t.indexOf(' '); + return sp < 0 ? t : t.substring(0, sp); + } + + private static void bump(Map m, String key) { + Integer cur = m.get(key); + m.put(key, Integer.valueOf(cur == null ? 1 : cur.intValue() + 1)); + } + + /** Collapse a message to its distinguishing head, so counts aggregate usefully. */ + private static String summarise(String message) { + String m = message == null ? "" : message; + int colon = m.indexOf(':'); + String head = colon > 0 ? m.substring(0, colon) : m; + return head.length() > 90 ? head.substring(0, 90) : head; + } + + private static List> sortedByCountDesc(Map m) { + List> out = + new ArrayList>(m.entrySet()); + Collections.sort(out, new Comparator>() { + @Override + public int compare(Map.Entry a, Map.Entry b) { + int c = b.getValue().compareTo(a.getValue()); + return c != 0 ? c : a.getKey().compareTo(b.getKey()); + } + }); + return out; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailure.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailure.java new file mode 100644 index 0000000..4ec1bd8 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailure.java @@ -0,0 +1,41 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +/** + * A classified reason the bridge produced no coordinate. + * + *

Implementations are immutable and safe to share. Obtain instances from + * {@link GieFailures}. + */ +public interface GieFailure { + + /** The classification. Never {@code null}. */ + GieFailureKind kind(); + + /** + * A human-readable explanation, intended to appear in a conformance report + * verbatim. Never {@code null}, never empty, and should name the offending + * token or value so a reader can act on it without re-running anything. + */ + String message(); + + /** + * The originating exception, or {@code null} when the failure was decided by + * the bridge's own classification rather than caught from proj4j. + */ + Throwable cause(); +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailureKind.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailureKind.java new file mode 100644 index 0000000..a065693 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailureKind.java @@ -0,0 +1,95 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +/** + * Why the bridge could not produce a coordinate. + * + *

The whole point of this taxonomy is that the conformance number must + * distinguish "we computed the wrong answer" from "we have not + * implemented this". A run that silently lumps the two together is + * worthless: it neither measures parity nor tracks progress. + * + *

The single most important boundary is between {@link #INVALID_DEFINITION} + * and {@link #NOT_IMPLEMENTED}, because gie's {@code expect failure} rows + * assert that PROJ itself rejects something: + * + *

+ * {@link #INVALID_DEFINITION} is a statement about PROJ. It means PROJ + * 9.8.1 would also have refused this definition — an unknown {@code +proj}, + * {@code +ellps}, {@code +datum}, {@code +units} or {@code +pm}, a + * {@code |lat_0| > 90}, a non-positive {@code +k}/{@code +k_0}/{@code +to_meter}, + * a malformed {@code +axis}, an out-of-range eccentricity, a {@code +towgs84} + * that is neither 3 nor 7 values, a {@code +no_defs} with no ellipsoid at all. + *

+ * {@link #NOT_IMPLEMENTED} is a statement about proj4j. The definition is + * legal PROJ; we simply lack the operator, the parameter, or the value grammar. + *

+ * When both apply, PROJ's verdict wins — because that is what the corpus + * asserts. + *
+ * + * @see GieFailure + */ +public enum GieFailureKind { + + /** + * proj4j has no implementation of this operation, parameter or value form. + * The definition itself is legal PROJ 9.8.1. This is the conservative + * default: anything the bridge is not certain it can execute faithfully + * lands here, because a wrong number that looks like a pass is the worst + * outcome available. + */ + NOT_IMPLEMENTED, + + /** + * PROJ 9.8.1 would reject this definition too. Some {@code expect failure} + * rows in the corpus assert exactly this, so it must not be conflated with + * {@link #NOT_IMPLEMENTED}. + */ + INVALID_DEFINITION, + + /** + * The input coordinate is outside the operation's area of validity — a + * projection-specific rejection, distinct from {@link #INVALID_COORD}. + */ + COORD_OUT_OF_DOMAIN, + + /** + * The host-level pre-check rejected the coordinate before any projection + * formula ran: {@code |phi| - pi/2 > 1e-12} or {@code |lam| > 10} radians + * ({@code 9.8.1:src/fwd.cpp:56-70}, {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD} + * = 2049). 244 of the corpus's {@code expect failure} assertions come from + * this check and from no projection's own logic. + */ + INVALID_COORD, + + /** The operation has no inverse. */ + NO_INVERSE, + + /** + * The computation produced a non-finite or non-convergent result. Includes + * the case where proj4j returns {@code NaN}/{@code Infinity} silently + * instead of raising — see {@link GieOperation#transform}. + */ + NUMERICAL, + + /** A required grid file is absent. */ + MISSING_GRID, + + /** Anything not covered above; always accompanied by a message. */ + OTHER +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailures.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailures.java new file mode 100644 index 0000000..ca8d560 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieFailures.java @@ -0,0 +1,85 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +/** + * Factories for {@link GieFailure}. The only implementation is immutable. + */ +public final class GieFailures { + + private GieFailures() { + } + + /** A failure with no originating exception. */ + public static GieFailure of(GieFailureKind kind, String message) { + return new Immutable(kind, message, null); + } + + /** A failure carrying the exception it was derived from. */ + public static GieFailure of(GieFailureKind kind, String message, Throwable cause) { + return new Immutable(kind, message, cause); + } + + /** Shorthand for the conservative default. */ + public static GieFailure notImplemented(String message) { + return of(GieFailureKind.NOT_IMPLEMENTED, message); + } + + /** Shorthand for "PROJ 9.8.1 would reject this too". */ + public static GieFailure invalidDefinition(String message) { + return of(GieFailureKind.INVALID_DEFINITION, message); + } + + private static final class Immutable implements GieFailure { + + private final GieFailureKind kind; + private final String message; + private final Throwable cause; + + Immutable(GieFailureKind kind, String message, Throwable cause) { + if (kind == null) { + throw new IllegalArgumentException("kind"); + } + if (message == null || message.isEmpty()) { + throw new IllegalArgumentException("message must be non-empty"); + } + this.kind = kind; + this.message = message; + this.cause = cause; + } + + @Override + public GieFailureKind kind() { + return kind; + } + + @Override + public String message() { + return message; + } + + @Override + public Throwable cause() { + return cause; + } + + @Override + public String toString() { + return kind + ": " + message + + (cause == null ? "" : " [" + cause.getClass().getSimpleName() + "]"); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieOperation.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieOperation.java new file mode 100644 index 0000000..309cb54 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieOperation.java @@ -0,0 +1,132 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * One gie {@code operation} (or {@code crs_src}/{@code crs_dst} pair), reduced + * to what a corpus runner needs: can it run, in what units, and what does it + * produce. + * + *

Instances are not thread-safe. {@link #transform} mutates + * {@link #lastFailure()}, and the underlying proj4j {@code Projection} objects + * are mutable (and, for {@code +proj=cass}, mutated on the hot path). Create one + * per runner thread. + * + *

Everything here is radians-and-metres, never degrees. The runner owns + * the degree conversion that {@code gie}'s {@code torad_coord}/{@code todeg_coord} + * perform; this interface does not repeat it. Feeding degrees into + * {@link #transform} on a {@link GieIoUnits#RADIANS} side produces silent + * nonsense. + */ +public interface GieOperation { + + /** + * {@code true} when {@link #transform} may be called. When {@code false}, + * {@link #failure()} says why not and {@link #transform} always returns + * {@code null}. + */ + boolean isUsable(); + + /** + * The construction-time classification, or {@code null} when + * {@link #isUsable()}. + */ + GieFailure failure(); + + /** + * PROJ's {@code P->left} — the declared unit domain of the operation's + * left-hand (angular, for a projection) side, before + * {@link GieIoUnits#folded() folding} and before the {@code +inv} + * swap. Feed it, {@link #rightUnits()} and {@link #isInverted()} to + * {@link GieIoUnits#outputUnits} to pick the comparison metric. + * + *

For every {@code PROJ_HEAD} projection this is + * {@link GieIoUnits#RADIANS} ({@code proj_internal.h:882-883}). For + * {@code +proj=longlat} it is {@code RADIANS} on both sides. + * + *

An unusable operation still reports units, so a runner can format a + * report without branching; treat them as unspecified in that case. + */ + GieIoUnits leftUnits(); + + /** + * PROJ's {@code P->right}. For every {@code PROJ_HEAD} projection this is + * {@link GieIoUnits#CLASSIC}, which {@link GieIoUnits#folded() folds} to + * {@link GieIoUnits#PROJECTED} and therefore selects the Euclidean metric. + * That single fact is why every forward projection row in the corpus is + * compared in metres and every {@code direction inverse} row geodesically. + */ + GieIoUnits rightUnits(); + + /** + * {@code P->inverted}: {@code +inv} appeared in the definition. Two + * independent consequences, both already handled here — the unit sides swap + * (see {@link GieIoUnits#pjLeft}), and {@link #transform} runs the opposite + * of the requested direction ({@code proj_trans} negates {@code dir} when + * {@code P->inverted}). + */ + boolean isInverted(); + + /** + * gie's {@code T.crs_dst_is_lat_lon_or_y_x}, which triggers the ordinate + * swap in the {@code DEGREES} branch of the comparator. + * + *

Known limitation: this always returns {@code false}. proj4j + * carries no axis-order metadata on a {@code CoordinateReferenceSystem} — + * {@code Projection.axes} defaults to {@code AxisOrder.ENU} and is only ever + * populated from an explicit {@code +axis=}, never from the EPSG database, so + * there is nothing to read. The cost is confined to the handful of + * {@code epsg_no_grid.gie} rows whose target CRS is latitude-first (e.g. + * {@code EPSG:2393}, "Finland YKJ Northing, Easting"); those will be reported + * as failures with a deviation of roughly one degree of arc rather than as + * skips. Fixing it needs axis metadata in the EPSG module, which is out of + * this bridge's scope. + */ + boolean crsDstIsLatLonOrYX(); + + /** + * Run the operation on one coordinate. + * + * @param in {@code {x, y, z, t}}; shorter arrays are zero-extended. On a + * {@link GieIoUnits#RADIANS} side, {@code x} is longitude in + * radians and {@code y} is latitude in radians. + * @param dir the direction as written on the gie {@code direction} line. + * {@code +inv} is applied on top of this, not instead of it. + * @return a fresh 4-element array, or {@code null} if this point failed — in + * which case {@link #lastFailure()} is set. Never returns a + * partially-valid coordinate: a failure is never expressed as a + * plausible number. + * + *

A non-finite output is a {@link GieFailureKind#NUMERICAL} + * failure, because proj4j returns {@code NaN} silently in 62 + * enumerated places. The one carve-out is PROJ's documented + * "when given NaNs, return NaNs" behaviour + * ({@code more_builtins.gie:791}): if the corresponding input + * ordinate was itself {@code NaN}, a {@code NaN} output is a + * result and is returned, so the comparator's + * NaN-both-sides branch can fire. Infinities are always failures. + */ + double[] transform(double[] in, GieDirection dir); + + /** + * The failure from the most recent {@link #transform} call, or {@code null} + * if that call succeeded. Undefined before the first call. + */ + GieFailure lastFailure(); +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieOperationFactory.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieOperationFactory.java new file mode 100644 index 0000000..573424d --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieOperationFactory.java @@ -0,0 +1,53 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +/** + * Turns a gie corpus operation definition into something proj4j can execute — or + * into a precise statement of why it cannot. + * + *

Never throws. Both methods always return a {@link GieOperation}; an + * unusable one carries a {@link GieFailure}. A runner that has to wrap these + * calls in {@code try/catch} would be turning classified information back into + * noise. + * + * @see Proj4jGieOperationFactory + */ +public interface GieOperationFactory { + + /** + * Build an operation from the arguments of a gie {@code operation} command. + * + * @param args the {@code operation} line's arguments, already through + * {@code pj_chomp}/{@code pj_shrink} (so {@code +} prefixes and + * redundant whitespace are gone) — though a raw + * {@code "+proj=merc +ellps=GRS80"} is accepted too. May be + * {@code null} or empty, which yields an unusable operation. + * @return never {@code null}. + */ + GieOperation create(String args); + + /** + * Build an operation from a completed gie {@code crs_src} + {@code crs_dst} + * pair. + * + * @param sourceCrs the {@code crs_src} argument: an authority code such as + * {@code "EPSG:4258"}, or a full proj string. + * @param targetCrs the {@code crs_dst} argument, same forms. + * @return never {@code null}. + */ + GieOperation createCrsToCrs(String sourceCrs, String targetCrs); +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieProjArgs.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieProjArgs.java new file mode 100644 index 0000000..0387d07 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieProjArgs.java @@ -0,0 +1,505 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.locationtech.proj4j.parser.Proj4Keyword; + +/** + * A lenient, PROJ-faithful reading of a proj-string, wrapping — never modifying — + * proj4j's {@code Proj4Parser} and {@code Proj4Keyword}. + * + *

This exists because PROJ has no allow-list. {@code init.cpp} retains + * every {@code +key} verbatim in a {@code paralist} and recognition is + * pull-based via {@code pj_param}; a token nobody asks for keeps + * {@code used == 0} and has no effect. There is no enumeration of valid keys + * anywhere in PROJ. proj4j's {@code Proj4Keyword.supportedParameters()} is a + * fixed 35-key allow-list (36 counting {@code +proj} itself as special) whose + * violation is a hard {@code UnsupportedParameterException} — see + * {@link #allowListSize()} for the measured value — stricter than PROJ, and + * therefore unable to pass the corpus. {@code builtins.gie}'s non-strict block + * feeds a literal {@code unknown_keyword} and expects it ignored. + * + *

Three PROJ semantics are reproduced exactly, and all three differ from what + * {@code Proj4Parser} does today: + * + *

    + *
  1. First-match-wins. {@code pj_param_exists} ({@code src/param.cpp}) + * walks the list front-to-back and returns the first match, which is + * why {@code +init=}/{@code +datum=} expansions are appended and can + * be shadowed by user tokens. {@code Proj4Parser} builds a {@code HashMap} + * and so keeps the last occurrence — inverted. See + * {@link #find(String)}.
  2. + *
  3. Lookup stops at the first {@code step} token ({@code param.cpp:72-105}) + * unless the key sought is {@code step}. This is the entire mechanism + * that scopes a pipeline step's parameters. See {@link #steps()}.
  4. + *
  5. Prefix matching is {@code '='}- or end-terminated, so key {@code a} + * must never match {@code axis}. Tokenising up front gives this for free.
  6. + *
+ * + *

Order is preserved throughout, and {@link GieToken#used()} mirrors PROJ's + * only piece of parameter bookkeeping so {@link #unusedKeys()} can reproduce + * {@code pj_pr_list}. + * + *

This class never throws on a definition. Tokenising is total. + * Rejection is a separate, later, deliberate act — see + * {@link Proj4jGieOperationFactory}. Keeping the two apart is what lets an + * unknown key be ignored by the parser while still forcing the operation + * to be reported {@link GieFailureKind#NOT_IMPLEMENTED} rather than silently + * mis-executed. + */ +public final class GieProjArgs { + + private final String raw; + private final List tokens; + private final boolean implicitEllipsoid; + + private GieProjArgs(String raw, List tokens, boolean implicitEllipsoid) { + this.raw = raw; + this.tokens = tokens; + this.implicitEllipsoid = implicitEllipsoid; + } + + // ------------------------------------------------------------ construction + + /** + * Tokenise a definition. + * + * @param args the definition, normally already through {@code pj_chomp} and + * {@code pj_shrink} (which strip comments, collapse whitespace, + * drop whitespace-preceded {@code '+'} and {@code ';'}, and make + * {@code '='} and {@code ','} greedy). A raw string with + * {@code '+'} prefixes is accepted too, so hand-written test + * fixtures and corpus input can share one entry point. + * {@code null} is treated as empty. + * @return never {@code null}. + */ + public static GieProjArgs parse(String args) { + String in = args == null ? "" : args; + List out = new ArrayList(); + int n = in.length(); + int i = 0; + int index = 0; + while (i < n) { + while (i < n && isSeparator(in.charAt(i))) { + i++; + } + if (i >= n) { + break; + } + int start = i; + while (i < n && !isSeparator(in.charAt(i))) { + i++; + } + String tok = in.substring(start, i); + // pj_shrink drops a whitespace-preceded '+', but accept it anyway. + while (tok.startsWith("+")) { + tok = tok.substring(1); + } + // A trailing backslash is gie's line-continuation marker; the lexer + // strips it, but a hand-written fixture may not have. + while (tok.endsWith("\\")) { + tok = tok.substring(0, tok.length() - 1); + } + if (tok.isEmpty()) { + continue; + } + int eq = tok.indexOf('='); + if (eq < 0) { + out.add(new GieToken(tok, null, false, index++)); + } else { + out.add(new GieToken(tok.substring(0, eq), tok.substring(eq + 1), true, index++)); + } + } + return new GieProjArgs(in, out, false); + } + + private static boolean isSeparator(char c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == 11 || c == ';'; + } + + // ------------------------------------------------------------------ basics + + /** The definition as handed in. */ + public String raw() { + return raw; + } + + /** + * The {@code paralist}, in order, duplicates included. The list is + * unmodifiable; the tokens themselves carry a mutable {@code used} flag. + */ + public List tokens() { + return Collections.unmodifiableList(tokens); + } + + /** Number of tokens. */ + public int size() { + return tokens.size(); + } + + /** Whether there are no tokens at all. */ + public boolean isEmpty() { + return tokens.isEmpty(); + } + + /** The number of keys proj4j's {@code Proj4Keyword} will accept. */ + public static int allowListSize() { + return Proj4Keyword.supportedParameters().size(); + } + + // ------------------------------------------------------------- pj_param(3) + + /** + * {@code pj_param_exists}: the first token whose key equals {@code key}, + * scanning front-to-back and stopping at the first {@code step} token + * unless {@code key} is itself {@code "step"}. + * + *

Does not set {@code used} — see {@link #value(String)}. + * + * @return the token, or {@code null}. + */ + public GieToken find(String key) { + boolean seekingStep = "step".equals(key); + for (int i = 0; i < tokens.size(); i++) { + GieToken t = tokens.get(i); + if (!seekingStep && t.isStep()) { + return null; + } + if (t.key().equals(key)) { + return t; + } + } + return null; + } + + /** {@link #find(String)} without marking, i.e. a pure query. */ + public String peek(String key) { + GieToken t = find(key); + return t == null ? null : t.value(); + } + + /** + * {@link #find(String)} and mark the token {@code used}, as every successful + * {@code pj_param} lookup does. + * + * @return the value, {@code null} if absent or if the token had no + * {@code '='}. Use {@link #exists(String)} to tell those apart. + */ + public String value(String key) { + GieToken t = find(key); + if (t == null) { + return null; + } + t.markUsed(); + return t.value(); + } + + /** {@code pj_param} type {@code 't'}: presence test. Marks the token used. */ + public boolean exists(String key) { + GieToken t = find(key); + if (t == null) { + return false; + } + t.markUsed(); + return true; + } + + /** Presence test that does not mark. */ + public boolean contains(String key) { + return find(key) != null; + } + + // ------------------------------------------------------------------- steps + + /** + * {@code true} when this is a pipeline: either the (globally scoped) + * {@code +proj} is {@code pipeline}, or a {@code +step} token is present. + * Both are checked because the corpus contains multi-step strings whose head + * says {@code pipeline} and because a stray {@code +step} alone would still + * scope every later lookup away. + */ + public boolean isPipeline() { + return "pipeline".equals(peek("proj")) || stepCount() > 1; + } + + /** 1 for a plain definition; 1 + the number of {@code +step} tokens otherwise. */ + public int stepCount() { + int steps = 0; + for (int i = 0; i < tokens.size(); i++) { + if (tokens.get(i).isStep()) { + steps++; + } + } + return steps + 1; + } + + /** + * Split on {@code +step}. + * + *

Element 0 is the global scope — everything before the first + * {@code step}, which is where {@code +proj=pipeline} and any pipeline-wide + * {@code +ellps} live. Elements 1..n are the steps themselves, each ending at + * the next {@code step}, so {@link #find(String)} on one of them naturally + * honours PROJ's step scoping. + * + *

The {@code step} token itself is dropped from each slice. Global + * parameter inheritance into steps is deliberately not modelled: + * every multi-step operation is classified + * {@link GieFailureKind#NOT_IMPLEMENTED} today, and guessing at inheritance + * would be exactly the kind of plausible-but-wrong behaviour this bridge + * exists to avoid. + */ + public List steps() { + List out = new ArrayList(); + List current = new ArrayList(); + for (int i = 0; i < tokens.size(); i++) { + GieToken t = tokens.get(i); + if (t.isStep()) { + out.add(new GieProjArgs(raw, current, implicitEllipsoid)); + current = new ArrayList(); + } else { + current.add(t); + } + } + out.add(new GieProjArgs(raw, current, implicitEllipsoid)); + return out; + } + + // ------------------------------------------------------------- bookkeeping + + /** Every key in order, duplicates included. */ + public List keys() { + List out = new ArrayList(tokens.size()); + for (int i = 0; i < tokens.size(); i++) { + out.add(tokens.get(i).key()); + } + return out; + } + + /** Keys appearing more than once, in first-occurrence order. */ + public List duplicateKeys() { + Set seen = new HashSet(); + Set dup = new HashSet(); + List out = new ArrayList(); + for (int i = 0; i < tokens.size(); i++) { + String k = tokens.get(i).key(); + if (!seen.add(k) && dup.add(k)) { + out.add(k); + } + } + return out; + } + + /** Tokens no lookup has matched. */ + public List unused() { + List out = new ArrayList(); + for (int i = 0; i < tokens.size(); i++) { + if (!tokens.get(i).used()) { + out.add(tokens.get(i)); + } + } + return out; + } + + /** {@link #unused()} reduced to keys. */ + public List unusedKeys() { + List u = unused(); + List out = new ArrayList(u.size()); + for (int i = 0; i < u.size(); i++) { + out.add(u.get(i).key()); + } + return out; + } + + /** + * {@code pj_pr_list()}'s unused-parameter report ({@code src/pr_list.cpp}), + * which is what {@code proj -v} emits. It is not a warning through + * PROJ's logging API and is unreachable from {@code proj_create}, so nothing + * in the corpus asserts on it; it is here because an unused-token list is the + * only honest way to show what a lenient parser silently absorbed. + * + * @return the report, or {@code null} when every token was used. + */ + public String prList() { + List u = unused(); + if (u.isEmpty()) { + return null; + } + StringBuilder sb = new StringBuilder("#--- following specified but NOT used"); + for (int i = 0; i < u.size(); i++) { + sb.append('\n').append(u.get(i).text()); + } + return sb.toString(); + } + + // -------------------------------------------------------- proj4j interop + + /** Keys outside {@code Proj4Keyword.supportedParameters()}, in order, deduplicated. */ + public List keysOutsideAllowList() { + List out = new ArrayList(); + Set seen = new HashSet(); + for (int i = 0; i < tokens.size(); i++) { + GieToken t = tokens.get(i); + if (t.isStep()) { + break; + } + if (!Proj4Keyword.isSupported(t.key()) && seen.add(t.key())) { + out.add(t.key()); + } + } + return out; + } + + /** + * The first occurrence of every key, in order — PROJ's view of the + * definition, and the opposite of what {@code Proj4Parser}'s {@code HashMap} + * would produce from the same string. + */ + public Map firstOccurrences() { + Map out = new LinkedHashMap(); + for (int i = 0; i < tokens.size(); i++) { + GieToken t = tokens.get(i); + if (t.isStep()) { + break; + } + if (!out.containsKey(t.key())) { + out.put(t.key(), t.value()); + } + } + return out; + } + + /** + * The definition reduced to what {@code Proj4Parser} can be handed without + * throwing: allow-listed keys only, first occurrence only, in order, + * up to the first {@code step}. + * + *

Filtering here rather than letting {@code Proj4Keyword.checkUnsupported} + * throw is what makes an unknown key ignored, as PROJ ignores it. + * Dropping a token is not free, though: if PROJ would have acted on it, the + * operation must be reported {@link GieFailureKind#NOT_IMPLEMENTED} rather + * than executed without it. That decision belongs to + * {@link Proj4jGieOperationFactory}; this method only prepares the input. + * + *

Feeding the first occurrence only is what fixes the {@code HashMap} + * inversion: {@code Proj4Parser} would otherwise keep the last. + */ + public String[] toProj4Args() { + Map first = firstOccurrences(); + List out = new ArrayList(); + for (Map.Entry e : first.entrySet()) { + if (!Proj4Keyword.isSupported(e.getKey())) { + continue; + } + out.add(e.getValue() == null ? "+" + e.getKey() : "+" + e.getKey() + "=" + e.getValue()); + } + return out.toArray(new String[out.size()]); + } + + // ----------------------------------------------- the implicit +ellps=GRS80 + + /** + * PROJ's implicit {@code +ellps=GRS80} rule ({@code 9.8.1:src/init.cpp:317-360}). + * GRS80 is appended to the end of the paralist — so it is shadowed by + * any user token, per first-match-wins — unless any of: + * + *

    + *
  • {@code +no_defs} is present;
  • + *
  • there is no {@code +proj}, or its token is shorter than 6 characters + * (i.e. {@code proj=} with an empty value), or it is {@code pipeline};
  • + *
  • any of {@code +datum +ellps +a +b +rf +f +e +es} is present.
  • + *
+ * + *

Note it is not suppressed by {@code +R}: {@code +proj=merc +R=1} + * does get GRS80 appended, and {@code +R} then overrules it in + * {@code ell_set.cpp}. + * + *

Verified against the installed PROJ 9.8.1: {@code proj +proj=merc} on + * {@code 2 1} gives {@code 222638.981586547 110579.965218250}, identical to + * {@code +proj=merc +ellps=GRS80} and different from + * {@code +ellps=WGS84} ({@code …218250} vs {@code …221896}). Without this + * rule, {@code DatumParameters} defaults {@code a} and {@code es} to + * {@code NaN} and every such operation returns {@code NaN} — which would be + * scored as a numerical defect rather than as the parser gap it is. + */ + public boolean impliesGrs80() { + if (contains("no_defs")) { + return false; + } + GieToken proj = find("proj"); + if (proj == null || proj.text().length() - 1 < 6 || "pipeline".equals(proj.value())) { + return false; + } + String[] shape = {"datum", "ellps", "a", "b", "rf", "f", "e", "es"}; + for (int i = 0; i < shape.length; i++) { + if (contains(shape[i])) { + return false; + } + } + return true; + } + + /** + * Whether the definition gives the ellipsoid a size at all — {@code +ellps}, + * {@code +datum}, {@code +a}, {@code +b} or {@code +R}. With {@code +no_defs} + * and none of these, PROJ 9.8.1 fails the definition outright: + * {@code "pj_init_ctx: Must specify ellipsoid or sphere"} (error 1026), + * confirmed by running {@code proj +proj=merc +no_defs}. + */ + public boolean hasEllipsoidSize() { + return contains("ellps") || contains("datum") || contains("a") + || contains("b") || contains("R"); + } + + /** + * This definition with PROJ's implicit {@code +ellps=GRS80} appended when + * {@link #impliesGrs80()}, otherwise {@code this}. Appending, not prepending, + * matters: a user token must shadow it. + */ + public GieProjArgs withImplicitDefaults() { + if (!impliesGrs80()) { + return this; + } + List copy = new ArrayList(tokens); + copy.add(new GieToken("ellps", "GRS80", true, tokens.size())); + return new GieProjArgs(raw, copy, true); + } + + /** Whether {@link #withImplicitDefaults()} added the {@code ellps=GRS80} token. */ + public boolean implicitEllipsoidAppended() { + return implicitEllipsoid; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < tokens.size(); i++) { + if (i > 0) { + sb.append(' '); + } + sb.append(tokens.get(i).text()); + } + return sb.toString(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieProjArgsTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieProjArgsTest.java new file mode 100644 index 0000000..a51c569 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieProjArgsTest.java @@ -0,0 +1,312 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.conformance.parse.PjText; + +class GieProjArgsTest { + + // ------------------------------------------------------ tokenisation + + @Test + @DisplayName("tokenises a pj_shrink-normalised string and preserves order") + void tokenisesShrunkString() { + // What GieLexer hands the runner: no '+' prefixes, single spaces. + String shrunk = PjText.shrink("+proj=merc +ellps=GRS80 +lat_ts=0"); + assertEquals("proj=merc ellps=GRS80 lat_ts=0", shrunk); + + GieProjArgs a = GieProjArgs.parse(shrunk); + assertEquals(Arrays.asList("proj", "ellps", "lat_ts"), a.keys()); + assertEquals("merc", a.peek("proj")); + assertEquals("GRS80", a.peek("ellps")); + assertEquals("0", a.peek("lat_ts")); + } + + @Test + @DisplayName("accepts a raw '+'-prefixed string too, so fixtures and corpus share one entry point") + void tokenisesRawString() { + GieProjArgs a = GieProjArgs.parse("+proj=merc +ellps=GRS80"); + assertEquals(Arrays.asList("proj", "ellps"), a.keys()); + } + + @Test + @DisplayName("a flag token has no value, and 'key=' has an empty one - they are distinguishable") + void flagVersusEmptyValue() { + GieProjArgs a = GieProjArgs.parse("proj=utm south zone="); + assertFalse(a.find("south").hasValue()); + assertNull(a.find("south").value()); + assertTrue(a.find("zone").hasValue()); + assertEquals("", a.find("zone").value()); + } + + @Test + @DisplayName("prefix matching is exact: key 'a' never matches 'axis'") + void prefixMatchingIsExact() { + GieProjArgs a = GieProjArgs.parse("proj=merc axis=enu"); + assertNull(a.find("a")); + assertNotNull(a.find("axis")); + } + + // ------------------------------------------- first-occurrence-wins + + @Test + @DisplayName("a duplicated key keeps the FIRST occurrence, as pj_param_exists does") + void firstOccurrenceWins() { + // PROJ walks the paralist front-to-back and returns the first match, which + // is why +init=/+datum= expansions are appended and can be shadowed. + // Proj4Parser's original HashMap kept the LAST occurrence - exactly + // inverted. + GieProjArgs a = GieProjArgs.parse("proj=merc lat_0=10 lat_0=20 lat_0=30"); + assertEquals("10", a.peek("lat_0")); + assertEquals(Arrays.asList("lat_0"), a.duplicateKeys()); + assertEquals(4, a.size(), "every duplicate is retained, not collapsed"); + } + + @Test + @DisplayName("toProj4Args feeds Proj4Parser the first occurrence only") + void toProj4ArgsUsesFirstOccurrence() { + GieProjArgs a = GieProjArgs.parse("proj=merc lat_0=10 lat_0=20"); + assertEquals(Arrays.asList("+proj=merc", "+lat_0=10"), Arrays.asList(a.toProj4Args())); + } + + // ------------------------------------------------------ step scoping + + @Test + @DisplayName("+step splits the definition and lookup stops at the first step") + void stepSplittingAndScoping() { + GieProjArgs a = GieProjArgs.parse( + "proj=pipeline ellps=GRS80 step proj=axisswap order=2,1 step proj=merc lat_0=45"); + + assertTrue(a.isPipeline()); + assertEquals(3, a.stepCount(), "global head plus two steps"); + + // pj_param_exists stops at the first `step` token unless the key sought is + // `step` (param.cpp:72-105). So the globally scoped +proj is `pipeline`, + // and lat_0 - which lives in step 2 - is invisible from the global scope. + assertEquals("pipeline", a.peek("proj")); + assertEquals("GRS80", a.peek("ellps")); + assertNull(a.peek("lat_0"), "lookup must not see past the first step"); + assertNull(a.peek("order")); + + List steps = a.steps(); + assertEquals(3, steps.size()); + assertEquals("pipeline", steps.get(0).peek("proj")); + assertEquals("axisswap", steps.get(1).peek("proj")); + assertEquals("2,1", steps.get(1).peek("order")); + assertEquals("merc", steps.get(2).peek("proj")); + assertEquals("45", steps.get(2).peek("lat_0")); + assertNull(steps.get(2).peek("order"), "step 2 must not see step 1's parameters"); + } + + @Test + @DisplayName("a bare '+step' first token scopes away the global +proj, as in more_builtins.gie:232") + void leadingStepHidesGlobalProj() { + GieProjArgs a = GieProjArgs.parse("step proj=pipeline step proj=merc"); + assertNull(a.peek("proj"), "the first token is `step`, so no +proj is globally visible"); + assertEquals(3, a.stepCount()); + assertEquals("pipeline", a.steps().get(1).peek("proj")); + } + + // ----------------------------------------------- unknown keys, `used` + + @Test + @DisplayName("an unknown key is retained and ignored, never fatal") + void unknownKeyIsIgnoredNotFatal() { + // PROJ never errors on an unrecognised +key: init.cpp retains every token + // and recognition is pull-based, so anything nobody asks for keeps + // used == 0 and has no effect. + // `approx` and `algo` used to be on the outside of the allow-list and are + // asserted here no longer: core now registers and dispatches both + // (Proj4Keyword:315,323 - tmerc/utm's escape back to the Evenden/Snyder series), + // so this pin was inverted rather than relaxed. The invariant under test is + // unchanged: a key core does not know is retained in the paralist, never marked + // used, and filtered out before Proj4Parser can throw on it. + GieProjArgs a = GieProjArgs.parse("proj=merc ellps=GRS80 approx algo=auto totally_made_up=7"); + + assertEquals(5, a.size(), "unknown tokens are retained verbatim"); + assertEquals("auto", a.peek("algo")); + assertEquals(Arrays.asList("totally_made_up"), a.keysOutsideAllowList()); + + // ...and the unknown one is filtered out before Proj4Parser sees it, so its + // allow-list cannot throw. + List forParser = Arrays.asList(a.toProj4Args()); + assertEquals(Arrays.asList("+proj=merc", "+ellps=GRS80", "+approx", "+algo=auto"), + forParser); + } + + @Test + @DisplayName("builtins.gie's literal `unknown_keyword` is tokenised, retained and ignored") + void builtinsUnknownKeyword() { + // builtins.gie's non-strict block (line 23) contains a bare + // `unknown_keyword` line and expects it ignored. At the command level that + // is the lexer's business; here we assert the parameter level behaves the + // same way, because the two must not disagree: the token survives, it is + // never used, and nothing throws. + GieProjArgs a = GieProjArgs.parse("proj=aea ellps=GRS80 lat_1=0 lat_2=2 unknown_keyword"); + + assertEquals(5, a.size()); + GieToken t = a.find("unknown_keyword"); + assertNotNull(t, "the token must be retained, as PROJ's paralist retains it"); + assertFalse(t.hasValue()); + assertFalse(t.used()); + assertEquals(Arrays.asList("unknown_keyword"), a.keysOutsideAllowList()); + assertFalse(Arrays.asList(a.toProj4Args()).contains("+unknown_keyword")); + } + + @Test + @DisplayName("prList is null only when every token was looked up") + void prListNullWhenAllUsed() { + GieProjArgs a = GieProjArgs.parse("proj=merc ellps=GRS80"); + assertNotNull(a.prList(), "nothing looked up yet, so both tokens are unused"); + a.value("proj"); + a.value("ellps"); + assertNull(a.prList()); + } + + @Test + @DisplayName("prList lists exactly the tokens nobody looked up") + void prListReportsUnused() { + GieProjArgs a = GieProjArgs.parse("proj=merc ellps=GRS80 nonsense=1"); + a.value("proj"); + a.value("ellps"); + assertEquals(Arrays.asList("nonsense"), a.unusedKeys()); + String report = a.prList(); + assertNotNull(report); + assertTrue(report.startsWith("#--- following specified but NOT used"), report); + assertTrue(report.contains("+nonsense=1"), report); + } + + @Test + @DisplayName("peek does not mark, value and exists do") + void markingSemantics() { + GieProjArgs a = GieProjArgs.parse("proj=merc south"); + a.peek("proj"); + assertFalse(a.find("proj").used()); + a.value("proj"); + assertTrue(a.find("proj").used()); + assertFalse(a.find("south").used()); + assertTrue(a.exists("south")); + assertTrue(a.find("south").used()); + } + + // ------------------------------------------ the implicit +ellps=GRS80 + + @Test + @DisplayName("PROJ appends +ellps=GRS80 when nothing else gives a shape") + void implicitGrs80() { + // Verified against the installed PROJ 9.8.1: `proj +proj=merc` on "2 1" + // gives 222638.981586547 110579.965218250, identical to +ellps=GRS80 and + // different from +ellps=WGS84. + assertTrue(GieProjArgs.parse("proj=merc").impliesGrs80()); + GieProjArgs effective = GieProjArgs.parse("proj=merc").withImplicitDefaults(); + assertTrue(effective.implicitEllipsoidAppended()); + assertEquals("GRS80", effective.peek("ellps")); + } + + @Test + @DisplayName("the implicit ellipsoid is APPENDED, so a user token still shadows it") + void implicitGrs80IsAppended() { + GieProjArgs a = GieProjArgs.parse("proj=merc").withImplicitDefaults(); + // The appended token is last, so first-match-wins keeps a user value. + GieProjArgs withUser = GieProjArgs.parse("proj=merc ellps=intl"); + assertFalse(withUser.impliesGrs80()); + assertEquals("intl", withUser.peek("ellps")); + assertEquals("+proj=merc +ellps=GRS80", a.toString()); + } + + @Test + @DisplayName("+no_defs, or any shape parameter, suppresses the implicit ellipsoid") + void implicitGrs80Suppressed() { + assertFalse(GieProjArgs.parse("proj=merc no_defs").impliesGrs80()); + String[] shapes = {"ellps=intl", "datum=WGS84", "a=6400000", "b=6300000", + "rf=300", "f=0.003", "e=0.08", "es=0.006"}; + for (int i = 0; i < shapes.length; i++) { + assertFalse(GieProjArgs.parse("proj=merc " + shapes[i]).impliesGrs80(), + shapes[i] + " must suppress the implicit +ellps=GRS80"); + } + } + + @Test + @DisplayName("+R does NOT suppress the implicit ellipsoid - it overrules it later") + void radiusDoesNotSuppress() { + // init.cpp's suppression list is datum ellps a b rf f e es. +R is absent + // from it, so GRS80 is appended and then ell_set.cpp's +R branch + // short-circuits it. + assertTrue(GieProjArgs.parse("proj=merc R=6400000").impliesGrs80()); + } + + @Test + @DisplayName("an empty or pipeline +proj suppresses the implicit ellipsoid") + void emptyOrPipelineProjSuppresses() { + assertFalse(GieProjArgs.parse("proj=").impliesGrs80(), + "\"proj=\" is 5 characters, below init.cpp's strlen < 6 bar"); + assertFalse(GieProjArgs.parse("proj=pipeline step proj=merc").impliesGrs80()); + assertFalse(GieProjArgs.parse("ellps=GRS80").impliesGrs80(), "no +proj at all"); + } + + @Test + @DisplayName("hasEllipsoidSize sees the five size-bearing keys") + void hasEllipsoidSize() { + assertTrue(GieProjArgs.parse("proj=merc ellps=intl").hasEllipsoidSize()); + assertTrue(GieProjArgs.parse("proj=merc datum=WGS84").hasEllipsoidSize()); + assertTrue(GieProjArgs.parse("proj=merc a=1").hasEllipsoidSize()); + assertTrue(GieProjArgs.parse("proj=merc b=1").hasEllipsoidSize()); + assertTrue(GieProjArgs.parse("proj=merc R=1").hasEllipsoidSize()); + assertFalse(GieProjArgs.parse("proj=merc rf=300").hasEllipsoidSize()); + } + + // ----------------------------------------------------------- edge cases + + @Test + @DisplayName("null, empty and whitespace-only definitions tokenise to nothing") + void degenerateInput() { + assertTrue(GieProjArgs.parse(null).isEmpty()); + assertTrue(GieProjArgs.parse("").isEmpty()); + assertTrue(GieProjArgs.parse(" \t ").isEmpty()); + } + + @Test + @DisplayName("a value containing '=' keeps everything after the first one") + void valueMayContainEquals() { + GieProjArgs a = GieProjArgs.parse("proj=horner fwd_c=1=2"); + assertEquals("1=2", a.peek("fwd_c")); + } + + @Test + @DisplayName("a trailing continuation backslash is dropped") + void continuationBackslashDropped() { + GieProjArgs a = GieProjArgs.parse("proj=pipeline \\ step proj=merc"); + assertEquals(Arrays.asList("proj", "step", "proj"), a.keys()); + } + + @Test + @DisplayName("';' separates tokens, as pj_shrink treats it") + void semicolonSeparates() { + GieProjArgs a = GieProjArgs.parse("proj=merc;ellps=GRS80"); + assertEquals(Arrays.asList("proj", "ellps"), a.keys()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieToken.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieToken.java new file mode 100644 index 0000000..ae4f749 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/GieToken.java @@ -0,0 +1,91 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +/** + * One entry of PROJ's {@code paralist} ({@code 9.8.1:src/init.cpp}): a key, an + * optional value, its position in the definition, and the {@code used} flag. + * + *

{@code used} is the only bookkeeping PROJ's parameter machinery has. Every + * successful {@code pj_param} lookup sets it, and it is what + * {@code pj_pr_list()} ({@code src/pr_list.cpp}) reports as + * {@code "#--- following specified but NOT used"}. It is deliberately mutable + * here for the same reason. + */ +public final class GieToken { + + private final String key; + private final String value; + private final boolean hasValue; + private final int index; + private boolean used; + + GieToken(String key, String value, boolean hasValue, int index) { + this.key = key; + this.value = value; + this.hasValue = hasValue; + this.index = index; + } + + /** The part before the first {@code '='}, with any leading {@code '+'} stripped. */ + public String key() { + return key; + } + + /** + * The part after the first {@code '='}, or {@code null} for a flag-style token + * such as {@code inv} or {@code step}. An empty string means the definition + * literally said {@code key=}. + */ + public String value() { + return value; + } + + /** Whether an {@code '='} was present at all. */ + public boolean hasValue() { + return hasValue; + } + + /** Zero-based position in the definition, duplicates included. */ + public int index() { + return index; + } + + /** The pipeline step separator, {@code +step}. */ + public boolean isStep() { + return "step".equals(key); + } + + /** Whether any lookup has matched this token. */ + public boolean used() { + return used; + } + + /** Set the {@code used} flag, as a successful {@code pj_param} does. */ + public void markUsed() { + this.used = true; + } + + /** The token as it would be written in a proj string, {@code '+'} included. */ + public String text() { + return hasValue ? "+" + key + "=" + value : "+" + key; + } + + @Override + public String toString() { + return text() + (used ? "" : " (unused)"); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineGieOperation.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineGieOperation.java new file mode 100644 index 0000000..d7c453f --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineGieOperation.java @@ -0,0 +1,165 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.pipeline.Pipeline; + +/** + * A gie {@code operation} that resolved to a {@code +proj=pipeline}. + * + *

The i/o units are the whole reason this class is not two lines

+ * + *

{@link Pipeline} already computes {@code P->left} and {@code P->right} the way + * {@code 9.8.1:src/pipeline.cpp:631-636} does — {@code pj_left} of the first step and + * {@code pj_right} of the last, folded, and honouring each step's {@code +inv}. This + * class passes them straight through, and reports {@link #isInverted()} as + * {@code false}, because a pipeline's own {@code P->inverted} is always 0: the + * {@code +inv} tokens in a pipeline belong to its steps and have already + * been accounted for inside {@code left()} and {@code right()}. Reporting + * {@code isInverted() == true} here would swap the two sides a second time and hand + * the comparator the wrong metric — which does not fail loudly, it just inflates or + * deflates every deviation in the file by a factor of about 111,319. + * + *

Failure handling

+ * + *

{@code null} is returned for a coordinate the pipeline refused, which the + * runner turns into PROJ's all-{@code HUGE_VAL} error coordinate. A non-finite + * output ordinate is treated as a failure rather than as a result, with PROJ's one + * documented carve-out: if the corresponding input ordinate was + * {@code NaN}, a {@code NaN} output is a result, so the comparator's + * NaN-on-both-sides branch can fire. + * + *

Unlike {@link SingleProjectionOperation} this checks {@code z} as well as + * {@code x} and {@code y}, because a pipeline can produce a meaningful third + * ordinate: {@code gigs/5201.gie} is 60 geographic/geocentric conversions whose + * expected values include an ellipsoidal height, and a silent {@code NaN} there + * would be scored as a coordinate rather than as the numerical failure it is. + * + *

Not thread-safe: the underlying proj4j {@code Projection} objects are mutable. + */ +final class PipelineGieOperation implements GieOperation { + + private final String definition; + private final Pipeline pipeline; + + private GieFailure lastFailure; + + PipelineGieOperation(String definition, Pipeline pipeline) { + this.definition = definition; + this.pipeline = pipeline; + } + + /** The assembled pipeline, for tests and reports. */ + Pipeline pipeline() { + return pipeline; + } + + @Override + public boolean isUsable() { + return true; + } + + @Override + public GieFailure failure() { + return null; + } + + @Override + public GieIoUnits leftUnits() { + return pipeline.left(); + } + + @Override + public GieIoUnits rightUnits() { + return pipeline.right(); + } + + @Override + public boolean isInverted() { + // See the class comment: a pipeline's P->inverted is always 0. + return false; + } + + @Override + public boolean crsDstIsLatLonOrYX() { + // See GieOperation#crsDstIsLatLonOrYX: proj4j has no axis metadata, and a + // pipeline is not opened by a crs_src/crs_dst pair in any case. + return false; + } + + @Override + public GieFailure lastFailure() { + return lastFailure; + } + + @Override + public double[] transform(double[] in, GieDirection dir) { + lastFailure = null; + if (in == null || in.length < 2) { + lastFailure = GieFailures.of(GieFailureKind.INVALID_COORD, + "a coordinate needs at least two ordinates"); + return null; + } + double[] out; + try { + out = dir == GieDirection.FORWARD ? pipeline.forward(in) : pipeline.inverse(in); + } catch (Throwable e) { + GieFailure f = Proj4jGieOperationFactory.mapTransformThrowable(e); + if (f == null) { + // Not ours to swallow (OutOfMemoryError and friends). + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } + throw (Error) e; + } + lastFailure = f; + return null; + } + + GieFailure nf = nonFinite(out[0], in[0], "x"); + if (nf == null) { + nf = nonFinite(out[1], in[1], "y"); + } + if (nf == null) { + nf = nonFinite(out[2], in.length > 2 ? in[2] : 0.0, "z"); + } + if (nf != null) { + lastFailure = nf; + return null; + } + return out; + } + + private GieFailure nonFinite(double out, double in, String which) { + if (!Double.isNaN(out) && !Double.isInfinite(out)) { + return null; + } + if (Double.isNaN(out) && Double.isNaN(in)) { + return null; + } + return GieFailures.of(GieFailureKind.NUMERICAL, + "non-finite " + which + " = " + out + " from finite input " + in + + " (" + definition + ")"); + } + + @Override + public String toString() { + return "PipelineGieOperation[" + definition + ", left=" + pipeline.left() + + ", right=" + pipeline.right() + ", " + pipeline.steps().size() + " steps]"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineGieOperationTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineGieOperationTest.java new file mode 100644 index 0000000..a911df1 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineGieOperationTest.java @@ -0,0 +1,176 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * The pipeline half of the bridge: that {@code GieOperationFactory.create} returns a + * usable operation for a {@code +proj=pipeline}, that its i/o units are the ones the + * comparator needs, and that the failure classification still distinguishes + * "upstream rejects this too" from "we have not implemented it". + */ +class PipelineGieOperationTest { + + private final GieOperationFactory factory = new Proj4jGieOperationFactory(); + + private static double rad(double degrees) { + return degrees * Math.PI / 180.0; + } + + // ---------------------------------------------------------------- usable + + @Test + @DisplayName("gigs/5208.gie's pipeline is executable and correct") + void aGigsPipelineIsExecutable() { + GieOperation op = factory.create("+proj=pipeline" + + " +step +init=epsg:4275 +inv" + + " +step +init=epsg:4807"); + assertTrue(op.isUsable(), () -> "not usable: " + op.failure()); + assertNull(op.failure()); + + double[] out = op.transform(new double[] {rad(5), rad(58), 0, 0}, GieDirection.FORWARD); + assertNotNull(out, () -> "transform failed: " + op.lastFailure()); + assertNull(op.lastFailure()); + assertEquals(2.66277083, Math.toDegrees(out[0]), 1e-8); + assertEquals(58.0, Math.toDegrees(out[1]), 1e-8); + } + + /** + * The units the gie comparator branches on. A pipeline's own {@code P->inverted} + * is always 0 — the {@code +inv} tokens belong to its steps and are already + * folded into {@code left()} and {@code right()} — so reporting + * {@code isInverted() == true} here would swap the two sides a second time and + * silently change the metric by a factor of about 111,319. + */ + @Test + @DisplayName("io units come from the pipeline, and isInverted is always false") + void reportsThePipelinesOwnIoUnits() { + GieOperation angularToProjected = factory.create("+proj=pipeline" + + " +step +init=epsg:4326 +inv" + + " +step +init=epsg:32631"); + assertEquals(GieIoUnits.RADIANS, angularToProjected.leftUnits()); + assertEquals(GieIoUnits.PROJECTED, angularToProjected.rightUnits()); + assertFalse(angularToProjected.isInverted()); + + GieOperation projectedToAngular = factory.create("+proj=pipeline" + + " +step +init=epsg:32631 +inv" + + " +step +init=epsg:4326"); + assertEquals(GieIoUnits.PROJECTED, projectedToAngular.leftUnits()); + assertEquals(GieIoUnits.RADIANS, projectedToAngular.rightUnits()); + assertFalse(projectedToAngular.isInverted()); + + // gigs/5201.gie: the left-hand side is cartesian, not angular, so the runner + // must NOT convert the accepted coordinate from degrees. + GieOperation geocentric = factory.create("+proj=pipeline" + + " +step +init=epsg:4978 +inv" + + " +step +init=epsg:4326"); + assertEquals(GieIoUnits.CARTESIAN, geocentric.leftUnits()); + assertEquals(GieIoUnits.RADIANS, geocentric.rightUnits()); + } + + /** + * {@code gigs/5102.2.gie}'s reverse pipeline. {@code grad} normalises to + * {@code "Grad"}, so the right-hand side stays {@link GieIoUnits#WHATEVER} and the + * comparator uses its Euclidean branch on grad values against a tolerance written + * in metres. Faithful reproduction, not a defect to fix. + */ + @Test + @DisplayName("a trailing +xy_out=grad leaves the right-hand side WHATEVER") + void gradLeavesTheUnitDomainUnraised() { + GieOperation op = factory.create("+proj=pipeline" + + " +step +init=epsg:27572 +inv" + + " +step +init=epsg:4807" + + " +step +proj=unitconvert +xy_in=rad +xy_out=grad"); + assertTrue(op.isUsable(), () -> "not usable: " + op.failure()); + assertEquals(GieIoUnits.PROJECTED, op.leftUnits()); + assertEquals(GieIoUnits.WHATEVER, op.rightUnits()); + } + + @Test + @DisplayName("a bare +init= is executable too") + void aBareLegacyInitIsExecutable() { + GieOperation op = factory.create("+init=epsg:32631"); + assertTrue(op.isUsable(), () -> "not usable: " + op.failure()); + double[] out = op.transform(new double[] {rad(3), rad(0), 0, 0}, GieDirection.FORWARD); + assertNotNull(out, () -> "transform failed: " + op.lastFailure()); + assertEquals(500000.0, out[0], 1e-3); + } + + // ------------------------------------------------------- classification + + @Test + @DisplayName("a nested pipeline is INVALID_DEFINITION, because PROJ rejects it too") + void aNestedPipelineIsInvalidUpstream() { + GieOperation op = factory.create("+proj=pipeline +step +proj=pipeline +step +proj=noop"); + assertFalse(op.isUsable()); + assertEquals(GieFailureKind.INVALID_DEFINITION, op.failure().kind()); + } + + /** + * An operator PROJ has and proj4j does not must be {@code NOT_IMPLEMENTED}, never + * {@code INVALID_DEFINITION}: an {@code expect failure} row satisfied by our own + * capability gap demonstrates nothing, which is the distinction the whole bridge + * is shaped around. + */ + @Test + @DisplayName("an unimplemented operator step is NOT_IMPLEMENTED, not INVALID_DEFINITION") + void anUnimplementedStepIsOurGapNotUpstreams() { + GieOperation op = factory.create( + "+proj=pipeline +step +proj=cart +ellps=GRS80 +step +proj=helmert +x=1"); + assertFalse(op.isUsable()); + assertEquals(GieFailureKind.NOT_IMPLEMENTED, op.failure().kind()); + } + + @Test + @DisplayName("an unknown +init= section is a file error, not a silent success") + void anUnknownInitSectionFailsClosed() { + GieOperation op = factory.create("+proj=pipeline +step +init=epsg:999999999"); + assertFalse(op.isUsable()); + assertNotNull(op.failure()); + } + + @Test + @DisplayName("the factory never throws, whatever it is fed") + void theFactoryNeverThrows() { + for (String definition : new String[] { + "+proj=pipeline", + "+step", + "+proj=pipeline +step", + "+proj=pipeline +step +proj=", + "+proj=pipeline +step +proj=axisswap", + "+proj=pipeline +step +proj=axisswap +order=1,1", + "+proj=pipeline +step +proj=unitconvert +xy_in=furlong +xy_out=m", + "+init=", + "+init=nosuchfile:1", + }) { + GieOperation op = factory.create(definition); + assertNotNull(op, definition); + if (!op.isUsable()) { + assertNotNull(op.failure(), definition + " unusable without a failure"); + } + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineKindTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineKindTest.java new file mode 100644 index 0000000..07639ef --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/PipelineKindTest.java @@ -0,0 +1,235 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.EnumMap; +import java.util.Map; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.pipeline.PipelineDefinitionException; +import org.locationtech.proj4j.pipeline.PipelineErrorCode; + +/** + * The re-keying control for {@code Proj4jGieOperationFactory.pipelineKind}. + * + *

What changed and why

+ * + *

{@code pipelineKind} used to key its one special case on enum identity — + * {@code p.code() == PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID} — and it now keys on the + * cause, {@code p.code().errorCause() == ErrorCause.MISSING_GRID}. The bridge should + * reflect core's taxonomy rather than name a constant that can be renamed out from under it, + * which is exactly what nearly happened: core's enum was split, {@code FILE_NOT_FOUND_OR_INVALID} + * kept its name but changed its meaning ({@code rejectedByProj} {@code true} → {@code false}, + * cause {@code INVALID_PARAM_VALUE} → {@code MISSING_GRID}), and the {@code +init=} population + * moved to the new {@code INVALID_INIT_KEY}. + * + *

The special case is load-bearing, and this file pins that

+ * + *

It is tempting to read the branch as redundant. It is not. Because + * {@code FILE_NOT_FOUND_OR_INVALID.isRejectedByProj()} is now {@code false}, deleting the branch + * does not fall through to {@code INVALID_DEFINITION} — it falls through to + * {@code NOT_IMPLEMENTED}, which {@code ExpectedFailureVerdict} never scores as genuine. + * Measured against the live gate on 2026-08-01, deletion cost 7 assertions + * (7378/7895 → 7371/7888, 7 {@code REGRESSED}, vacuous 28 → 35): {@code tinshift.gie#1:0} and + * {@code #2:0}, {@code deformation.gie#6:0}/{@code #7:0}/{@code #8:0}, + * {@code geotiff_grids.gie#38:0} and {@code more_builtins.gie#25:0}. + * + *

Non-vacuity

+ * + *

Per the skill's non-negotiable 5c, an equivalence assertion that ranges over nothing reports + * the same clean pass as one that ranges over everything, so + * {@link #theEquivalenceSweepCanActuallyFail()} re-runs the identical comparison against a mutant + * legacy function and requires it to disagree. Each test that sweeps the enum also asserts what it + * covered, not merely that it found no counterexample. + */ +class PipelineKindTest { + + /** + * The implementation as it stood before the re-keying, written out so the two can be compared + * over every enum constant rather than over the one the change was motivated by. + */ + private static GieFailureKind legacyConstantIdentityKind(PipelineErrorCode code) { + if (code == PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID) { + return GieFailureKind.MISSING_GRID; + } + return code.isRejectedByProj() + ? GieFailureKind.INVALID_DEFINITION + : GieFailureKind.NOT_IMPLEMENTED; + } + + /** What {@code pipelineKind} would return with the special case deleted altogether. */ + private static GieFailureKind fallbackOnly(PipelineErrorCode code) { + return code.isRejectedByProj() + ? GieFailureKind.INVALID_DEFINITION + : GieFailureKind.NOT_IMPLEMENTED; + } + + /** + * The production path, exercised end to end: the same {@code mapPipelineThrowable} the factory + * calls from {@code createFromPipelineEngine}. Reaching {@code pipelineKind} through it rather + * than by reflection means a change to the dispatch above it is caught too. + */ + private static GieFailureKind productionKind(PipelineErrorCode code) { + GieFailure f = Proj4jGieOperationFactory.mapPipelineThrowable( + new PipelineDefinitionException(code, "synthetic: " + code)); + assertNotNull(f, "mapPipelineThrowable must never ask for a PipelineDefinitionException" + + " to be rethrown"); + return f.kind(); + } + + // ------------------------------------------------------ what core declares today + + @Test + @DisplayName("FILE_NOT_FOUND_OR_INVALID: errno 1029, MISSING_GRID, and NOT rejected by PROJ") + void fileNotFoundIsNotAnUpstreamRejection() { + PipelineErrorCode c = PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID; + assertEquals(1029, c.projErrno(), + "PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID is 1029 (9.8.1:src/proj.h)"); + assertEquals(ErrorCause.MISSING_GRID, c.errorCause(), + "the cause this bridge now keys on"); + assertFalse(c.isRejectedByProj(), + "proj4j failing to READ a file is a statement about proj4j's readers, not about" + + " the definition. If this ever goes back to true, the fallback below" + + " changes meaning and pipelineKind must be re-read, not just re-run."); + } + + @Test + @DisplayName("INVALID_INIT_KEY took the +init= population: errno 1027, INVALID_PARAM_VALUE") + void invalidInitKeyCarriesTheInitPopulation() { + PipelineErrorCode c = PipelineErrorCode.INVALID_INIT_KEY; + // get_init_string sets PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE at 9.8.1:src/init.cpp:105 + // ("Missing colon in +init"), :119 ("Cannot open %s") and :134 ("Invalid content for %s"). + assertEquals(1027, c.projErrno(), "9.8.1:src/init.cpp:105,119,134 - not 1029"); + assertEquals(ErrorCause.INVALID_PARAM_VALUE, c.errorCause()); + assertTrue(c.isRejectedByProj(), "an unresolvable +init= key really is an upstream refusal"); + assertNotEquals(ErrorCause.MISSING_GRID, c.errorCause(), + "if the init population ever acquired the MISSING_GRID cause, the re-keyed check" + + " would silently start calling those rows MISSING_GRID"); + } + + // -------------------------------------------------- the re-keying is behaviour-neutral + + @Test + @DisplayName("re-keying on ErrorCause.MISSING_GRID agrees with the old constant-identity check" + + " over every PipelineErrorCode") + void rekeyingIsBehaviourNeutralOverTheWholeEnum() { + PipelineErrorCode[] all = PipelineErrorCode.values(); + assertTrue(all.length >= 8, + "the sweep must range over the real enum; found only " + all.length + " constants"); + + Map produced = new EnumMap(GieFailureKind.class); + for (PipelineErrorCode code : all) { + GieFailureKind actual = productionKind(code); + assertEquals(legacyConstantIdentityKind(code), actual, + "the re-keyed check disagrees with the constant-identity check on " + code + + " (errno " + code.projErrno() + ", cause " + code.errorCause() + + ", rejectedByProj " + code.isRejectedByProj() + ").\n" + + "If this fires because core gave a SECOND code the MISSING_GRID" + + " cause, the re-keying is doing its job and the change is intended:" + + " delete the legacy arm, re-run the gate, and record the new" + + " headline. Do not 'fix' it by going back to enum identity."); + Integer n = produced.get(actual); + produced.put(actual, Integer.valueOf(n == null ? 1 : n.intValue() + 1)); + } + + // Coverage, not just absence of a counterexample: the sweep must have exercised all three + // outcomes, or an agreement between two functions that only ever return one value would + // look identical to this. + assertTrue(produced.containsKey(GieFailureKind.MISSING_GRID), + "no code produced MISSING_GRID, so the branch under test was never taken: " + produced); + assertTrue(produced.containsKey(GieFailureKind.INVALID_DEFINITION), + "no code produced INVALID_DEFINITION: " + produced); + assertTrue(produced.containsKey(GieFailureKind.NOT_IMPLEMENTED), + "no code produced NOT_IMPLEMENTED: " + produced); + } + + @Test + @DisplayName("positive control: the equivalence sweep can actually report a disagreement") + void theEquivalenceSweepCanActuallyFail() { + // Identical comparison, one deliberately wrong arm: key the special case on WRONG_SYNTAX + // instead of the file code. If the sweep above is capable of detecting anything, this must + // find at least two disagreements - WRONG_SYNTAX itself and FILE_NOT_FOUND_OR_INVALID. + int disagreements = 0; + for (PipelineErrorCode code : PipelineErrorCode.values()) { + GieFailureKind mutant = code == PipelineErrorCode.WRONG_SYNTAX + ? GieFailureKind.MISSING_GRID + : fallbackOnly(code); + if (mutant != productionKind(code)) { + disagreements++; + } + } + assertTrue(disagreements >= 2, + "the comparison used by rekeyingIsBehaviourNeutralOverTheWholeEnum detected only " + + disagreements + " disagreements against a knowingly-wrong mapping, so its" + + " clean result means nothing"); + } + + // ------------------------------------------------------- the branch is load-bearing + + @Test + @DisplayName("deleting the special case yields NOT_IMPLEMENTED, not INVALID_DEFINITION") + void theSpecialCaseIsNotRedundant() { + PipelineErrorCode c = PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID; + assertEquals(GieFailureKind.MISSING_GRID, productionKind(c), + "with the branch, the file code is MISSING_GRID"); + assertEquals(GieFailureKind.NOT_IMPLEMENTED, fallbackOnly(c), + "without it, the fallback reads rejectedByProj=false and answers NOT_IMPLEMENTED." + + " ExpectedFailureVerdict never scores NOT_IMPLEMENTED as genuine, so the" + + " seven errno-named invalid_op_file_not_found_or_invalid passes are lost" + + " - measured 2026-08-01 as 7378/7895 -> 7371/7888."); + assertNotEquals(productionKind(c), fallbackOnly(c), + "if these ever agree, the branch really has become redundant and may be deleted -" + + " but re-measure the gate before believing it"); + } + + // ----------------------------------------------------------- end to end, via the corpus + + @Test + @DisplayName("tinshift.gie:19 (+file=proj.ini) reaches MISSING_GRID through the real factory") + void tinshiftProjIniIsMissingGrid() { + // gie/tinshift.gie:19 + // operation +proj=tinshift +file=proj.ini + // expect failure errno invalid_op_file_not_found_or_invalid + // This is the witness quoted in pipelineKind's javadoc: it is a genuine pass only because + // the bridge answers MISSING_GRID and the row names that errno. + GieOperation o = new Proj4jGieOperationFactory().create("proj=tinshift file=proj.ini"); + assertFalse(o.isUsable(), "proj4j has no tinshift JSON reader, so this cannot be built"); + assertNotNull(o.failure()); + assertEquals(GieFailureKind.MISSING_GRID, o.failure().kind(), + "actual message: " + o.failure().message()); + } + + @Test + @DisplayName("discrimination: a missing required argument is still INVALID_DEFINITION") + void aMissingArgumentIsStillAnUpstreamRejection() { + // gie/tinshift.gie:11 - `operation +proj=tinshift` with no +file, which PROJ itself + // refuses (invalid_op_missing_arg). If this came back MISSING_GRID too, the classifier + // would not be discriminating and the test above would prove nothing. + GieOperation o = new Proj4jGieOperationFactory().create("proj=tinshift"); + assertFalse(o.isUsable()); + assertNotNull(o.failure()); + assertEquals(GieFailureKind.INVALID_DEFINITION, o.failure().kind(), + "actual message: " + o.failure().message()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jCapabilities.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jCapabilities.java new file mode 100644 index 0000000..d109125 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jCapabilities.java @@ -0,0 +1,685 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.ExtendedTransverseMercatorProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; +import org.locationtech.proj4j.units.Angle; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * What the bridge is willing to assert proj4j actually does with a + * parameter, on the single-projection {@code operation} path. + * + *

Why this is a hand-maintained table and not a read of + * {@code Proj4Keyword.supportedParameters()}. That allow-list answers "will + * {@code Proj4Parser} refuse this key?", which is a different question from "will + * proj4j act on it?". Three keys are in the allow-list and are read by the parser + * yet have no effect on {@code Projection.projectRadians}: + * + *

    + *
  • {@code +axis} — {@code Projection.axes} is only ever consulted by + * {@code BasicCoordinateTransform.java:152,177}, i.e. the CRS-to-CRS path. + * A bare {@code operation +proj=X +axis=neu} stores the order and then + * projects as though it were {@code enu}. PROJ, by contrast, inserts a real + * {@code +proj=axisswap} step ({@code create.cpp} + * {@code cs2cs_emulation_setup}).
  • + *
  • {@code +pm} — likewise, only {@code BasicCoordinateTransform.java:160,170} + * reads {@code Projection.primeMeridian}.
  • + *
  • {@code +zone} — applied only when the projection is a + * {@code TransverseMercatorProjection} or + * {@code ExtendedTransverseMercatorProjection}; silently dropped otherwise.
  • + *
+ * + *

Trusting the allow-list would therefore silently mis-execute those, which is + * the one outcome that must never happen: a wrong number that looks like a pass. + * So the trust relation is inverted — the bridge enumerates what it vouches for, + * and everything else is {@link GieFailureKind#NOT_IMPLEMENTED}, whether + * the allow-list contains it or not. + * + *

{@code Proj4jCapabilitiesTest} asserts that every key in + * {@code Proj4Keyword.supportedParameters()} appears in exactly one of the three + * sets below. That test is the tripwire: when someone widens core's allow-list, + * it fails and forces a decision here rather than letting an unclassified key + * flow through. + */ +final class Proj4jCapabilities { + + private Proj4jCapabilities() { + } + + /** + * Keys proj4j reads and applies to the projection regardless of their value. + * + *

The ellipsoid group ({@code ellps a b es e rf f R} and the eight + * spherification keys) mirrors {@code Proj4Parser.parseEllipsoid}, which + * follows {@code ell_set.cpp:80-133} step for step: {@code +R} short-circuits, + * then {@code +ellps} seeds, then {@code +a} resizes, then the first present + * of {@code rf f es e b} reshapes, then the first present of the + * {@code R_*} family spherifies. + * + *

The adams-family group is here rather than in {@link #CONDITIONAL} + * because the set of proj4j classes that apply each key is exactly the set of + * PROJ operators that read it. {@code Proj4Parser} dispatches + * {@code +shape}/{@code +scrollx}/{@code +scrolly} on + * {@code PeirceQuincuncialProjection} and {@code +azi}/{@code +rot} on + * {@code SpilhausProjection}, matching {@code adams.cpp:405-453} and + * {@code spilhaus.cpp:133-136}, so no {@code +proj=}/value combination diverges + * the way {@code +zone} does. {@code +scrollx} off {@code +shape=horizontal} is + * ignored by both, unvalidated by both. + * + *

{@code +azi} was the one drift risk, and it has been resolved by widening the + * dispatch rather than by weakening this table. Upstream reads it in four operators: + * {@code spilhaus} ({@code spilhaus.cpp:133}), {@code tpers} ({@code nsper.cpp:196}), + * {@code labrd} ({@code labrd.cpp:117}) and {@code isea} ({@code isea.cpp:1024}). It used + * to reach {@code SpilhausProjection} alone, which was sound only for as long as none of + * the other three was registered - and {@code labrd} had already been registered, so it + * was silently unsound. No corpus row exercises {@code labrd +azi}, which is exactly why + * it survived. {@code Proj4Parser} now dispatches {@code +azi} to + * {@code SpilhausProjection}, {@code TiltedPerspectiveProjection} and + * {@code LabordeProjection} - every registered reader - so the two sets coincide again. + * {@code isea} is unported, so its {@code +proj=} name is refused long before + * {@code +azi} could matter. + * + *

The standing rule, which now has a precedent in both directions: never register a + * {@code +proj=} name in {@code Registry} without checking every key its upstream operator + * reads against {@code Proj4Parser}'s dispatch. A missing name is + * {@link GieFailureKind#NOT_IMPLEMENTED}, which is honest; a registered name with a + * dropped parameter is a plausible wrong map. {@code tpers} was deliberately held out of + * {@code Registry} for a stage for exactly this reason. + */ + static final Set HONOURED = set( + // operator selection + "proj", + // ellipsoid: size, shape, spherification + "ellps", "a", "b", "es", "e", "rf", "f", "R", + "R_A", "R_V", "R_a", "R_g", "R_h", "R_lat_a", "R_lat_g", "R_C", + // coordinate frame + "lat_0", "lon_0", "lat_1", "lat_2", "lat_ts", "x_0", "y_0", "k", "k_0", + // operator parameters proj4j's Projection base carries + "alpha", "lonc", "gamma", "no_uoff", "h", "south", + // peirce_q arrangement, and spilhaus's oblique framing + "shape", "scrollx", "scrolly", "azi", "rot", + // +tilt, tpers's rotation of the image plane out of the tangent plane + // (nsper.cpp:186). tpers is registered as of this change, and +azi is now + // dispatched per class to all three REGISTERED readers - spilhaus, tpers and + // labrd - which is what made registering it safe, and which is why +azi can + // stay here rather than moving to CONDITIONAL. isea is still unported, so its + // +proj= name is refused before +azi could matter. + "tilt", + // +over. Global in PROJ (init.cpp:601, "bover"): fwd_prepare skips both of its + // adjlon calls (fwd.cpp:82-83, :109-111) and inv_finalize skips its one + // (inv.cpp:115-116). Proj4Parser dispatches it to Projection.setOver, and both + // of Projection's forward funnels as well as inverseProjectRadians branch on + // it, so there is no +proj=/value combination where it is silently dropped. + "over", + // +W and +M. +W is read by BOTH lagrng (lagrng.cpp:79-85, default 2) and hammer + // (hammer.cpp:63-70, default .5); +M by hammer alone (:72-79, default 1). + // Proj4Parser dispatches to both classes, which is the whole set of readers. + // Registering +W for lagrng only was MEASURED to break builtins.gie:2596, + // "+proj=hammer +a=6400000 +W=1", whose expect-failure row at (-180, 0) started + // returning a plausible -18101933.598 from the dropped W. Capital W and M; +M is + // NOT the lower-case +m of gn_sinu. + "W", "M", + // airy's two parameters, and airy's alone (airy.cpp:119-120). +no_cut is a 'b' + // sigil, +lat_b an 'r'. + "no_cut", "lat_b", + // aeqd's Guam variant and cass's Vanua Levu variant. Both are read upstream + // inside the `es != 0` arm only, and both classes reproduce that placement, so + // on a declared sphere each is consumed and ignored exactly as upstream does. + // NOTE +hyperbolic is pj_param_exists, NOT the 'b' sigil (cass.cpp:127), so + // +hyperbolic=f is TRUE - which is why it appears in neither ANGLE_KEYS nor + // DOUBLE_KEYS and why Proj4Parser tests it with containsKey. + "guam", "hyperbolic", + // +lsat, the Landsat vehicle number (som.cpp:307). An 'i' sigil like +path. + "lsat", + // +path, MOVED here from CONDITIONAL. Upstream som.cpp reads "ipath" for + // misrsom (:287) and lsat (:318); Proj4Parser now dispatches it to BOTH + // MisrSpaceObliqueMercatorProjection and LandsatProjection, and + // LandsatProjection no longer hard-codes 120, so the set of classes that apply + // it is exactly the set of operators that read it. The conditionalFailure() + // branch for it is therefore gone. + "path", + // col_urban's reference height; omerc's two-point form and its off-switch + // synonym. Upstream accepts +no_off OR +no_uoff (omerc.cpp:139-143) - proj4j + // had only the latter, so a definition using the documented spelling was + // silently ignored rather than rejected. urm5 also reads +n. + // + // +m and +q are now dispatched and appear below. They were deliberately withheld + // for one stage while core's Proj4Keyword did not dispatch them, because claiming + // to honour a key we ignore is the dangerous direction: the bridge would classify + // a +m= operation as executable and it would return a plausible wrong answer + // instead of NOT_IMPLEMENTED. The sequencing rule that follows from it: add a key + // to BOTH sides in one change, and if it must be split, add it to + // supportedParameters() FIRST and to this table SECOND. + "h_0", "lon_1", "lon_2", "no_off", "n", + // +no_rot, added in the SAME change as its Proj4Keyword registration and its + // Proj4Parser dispatch. It could not be registered before that: `rot` was a + // private field written unconditionally inside initialize(), which runs twice, + // so a setter's value was discarded on the second pass. Registering it inert + // would have made the bridge call builtins.gie:5246/:5269 executable and they + // would have returned a ROTATED answer where PROJ returns an unrotated one. + "no_rot", + // som's three orbital parameters; ob_tran's child selector and its ten pole + // parameters; gn_sinu's +m and urm5's +q. + "inc_angle", "ps_rev", "asc_lon", + "o_proj", "o_alpha", "o_lon_c", "o_lat_c", "o_lat_p", "o_lon_p", + "o_lon_1", "o_lat_1", "o_lon_2", "o_lat_2", + "m", "q", + // tmerc's algorithm selection. PROJ 9.8.1 ships Poder/Engsager as the built-in + // algorithm and proj4j now matches, so these two are the documented escape back + // to the Evenden/Snyder series - without them there is no way to ask for the + // previous behaviour, and the movement is unbounded far from the central + // meridian (0.83 mm at 6 deg, 4 m at 20 deg, kilometres beyond 45 deg). + // +approx is read with pj_param's 'b' sigil, so "+approx=f" means false rather + // than being a bare presence flag; +algo is a string whose invalid values the + // setter rejects with INVALID_PARAM_VALUE, as upstream does. + "approx", "algo", + // linear scaling of the projected side + "units", "to_meter"); + + /** + * Keys with no numeric effect in PROJ either, so dropping them is free. + * + *

{@code +no_defs} is subtler than it looks and is not a + * strictness switch: its only effect in {@code init.cpp:327} is suppressing + * the implicit {@code +ellps=GRS80}. It is inert here because + * {@link GieProjArgs#impliesGrs80()} already models that suppression, and + * {@link ProjDefinitionValidator} already reports the resulting + * "no ellipsoid at all" case as {@link GieFailureKind#INVALID_DEFINITION}. + */ + static final Set INERT = set("title", "wktext", "no_defs", "inv", + // +geoid_crs is not read by pj_init at all: only the CRS parser honours it, and + // only when +geoidgrids is also present (io.cpp:12750-12800 force-marks it used). + // To an `operation` it is an inert token upstream too, so dropping it is free. + "geoid_crs"); + + /** + * Keys whose value decides whether proj4j's behaviour matches PROJ's. See + * {@link #conditionalFailure}. + */ + static final Set CONDITIONAL = set( + "axis", "pm", "zone", "towgs84", "datum", "nadgrids", + // +path is no longer here: see HONOURED. It moved in the same change that gave + // LandsatProjection setLandsat/setPath and removed its hard-coded path = 120. + // The vertical axis. proj4j reads all four in the pipeline layer + // (pipeline/Cs2csOperator, pipeline/PipelineFactory) and never on the + // single-projection operation path, so each is safe only at its identity value. + "geoidgrids", "vunits", "vto_meter", "z_0", "multiplier", + // +geoc is not in Proj4Keyword's allow-list at all, so it is not one of the + // keys Proj4jCapabilitiesTest's sweep can reach - it is classified here + // because the bridge still has to decide what to do with it, and because the + // answer is now "route it": pipeline/Cs2csOperator implements + // pj_geocentric_latitude, Projection.projectRadians does not. + "geoc"); + + /** Every key the bridge has a considered opinion about. */ + static Set classified() { + Set all = new LinkedHashSet(); + all.addAll(HONOURED); + all.addAll(INERT); + all.addAll(CONDITIONAL); + return Collections.unmodifiableSet(all); + } + + // ------------------------------------------------- the cs2cs-emulation route + + /** + * The {@link #CONDITIONAL} keys that are {@link #conditionalFailure}s on the + * single-projection path only because that path is the wrong path: PROJ + * turns each of them into a hidden sub-operation + * ({@code create.cpp cs2cs_emulation_setup}, plus the {@code vto_meter}/{@code z0} + * lines of {@code fwd_finalize}/{@code inv_prepare}), and + * {@code pipeline.Cs2csOperator} builds every one of them. + * + *

Deliberately not here: {@code zone}, which is ordinary parser dispatch and + * not emulation at all, and {@code multiplier}, which belongs to + * the {@code vgridshift}/{@code deformation} operators rather than to a projection. + */ + private static final Set EMULATION_KEYS = set( + "axis", "pm", "towgs84", "datum", "nadgrids", + "geoidgrids", "vunits", "vto_meter", "z_0", "geoc"); + + /** + * Whether this definition needs the hidden helper steps, and therefore belongs to + * the pipeline engine rather than to {@code CRSFactory}. + * + *

Why this is a routing question and not a capability question

+ * + *

Every key in {@link #EMULATION_KEYS} is implemented — in + * {@code pipeline.Cs2csOperator}, which is where PROJ implements it too. What was + * missing was a way to reach it: the bridge routed only + * {@code +proj=pipeline}, {@code +init=} and the seven bare pipeline-only operators + * to that engine, so a plain legacy proj-string such as + * {@code proj=latlong datum=potsdam ellps=bessel} went to the single-projection path + * and was correctly, but unnecessarily, reported {@code NOT_IMPLEMENTED}. That is + * the same defect that had {@code axisswap.gie} at 2/27 with a complete + * {@code AxisSwapOperator}, and it accounted for every one of + * {@code DHDN_ETRS89.gie}'s 64 assertions. + * + *

The test is asked per token, at its value, by delegating to + * {@link #conditionalFailure}: an inert value ({@code +axis=enu}, + * {@code +towgs84=0,0,0}, {@code +datum=WGS84}, {@code +vunits=m}) does not divert + * anything, so a definition that used to take the single-projection path and pass + * still takes it. Only definitions that were failing can change route. + * + *

Routing here is safe in the one direction that matters: {@code Cs2csOperator} + * builds its projection with the same {@code Proj4Parser} on the same token list, so + * it honours everything the single-projection path honours and refuses everything it + * refuses — the emulation steps are strictly additional. + * + *

It is not safe on its own, and that is why + * {@code Proj4jGieOperationFactory} still runs the token check before routing. + * {@code Cs2csOperator} constructs its {@code Proj4Parser} in + * {@code ParseMode.PROJ_COMPATIBLE}, which retains and ignores a key outside + * the allow-list rather than refusing it. So rerouting a definition that also carries + * a key proj4j drops would execute it and return a plausible wrong answer instead of + * an honest refusal. + * + * @param a the definition + * @return whether to route it to the pipeline engine + */ + /** + * @param key a parameter name + * @return whether {@code pipeline.Cs2csOperator} rather than + * {@code Projection.projectRadians} is where this key takes effect + */ + static boolean isEmulationKey(String key) { + return EMULATION_KEYS.contains(key); + } + + static boolean requiresCs2csEmulation(GieProjArgs a) { + List tokens = a.tokens(); + for (int i = 0; i < tokens.size(); i++) { + GieToken t = tokens.get(i); + if (!EMULATION_KEYS.contains(t.key())) { + continue; + } + // peek semantics: this is a routing decision, so it must not mark the token + // used and thereby change what pr_list() reports. + if (conditionalFailure(t.key(), t.value(), null) != null) { + return true; + } + } + return false; + } + + // ---------------------------------------------------- conditional rules + + /** + * Whether a conditionally-honoured key, at this value and on this projection, + * would make proj4j diverge from PROJ. + * + * @param key one of {@link #CONDITIONAL}. + * @param value the token's value, possibly {@code null}. + * @param projection the already-constructed projection, or {@code null} if it + * is not available yet. + * @return a {@link GieFailureKind#NOT_IMPLEMENTED} failure, or {@code null} if + * this key is safe to pass through. + */ + static GieFailure conditionalFailure(String key, String value, Projection projection) { + if ("axis".equals(key)) { + // PROJ only inserts an axisswap step when the order is not "enu" + // (create.cpp: `if (p && (0 != strcmp("enu", p->param)))`). + if (!"enu".equals(value)) { + return GieFailures.notImplemented( + "+axis=" + value + ": proj4j stores the axis order but applies it only in " + + "BasicCoordinateTransform, never in Projection.projectRadians, " + + "so a single-projection operation would silently ignore it " + + "(PROJ inserts a +proj=axisswap step)"); + } + return null; + } + if ("pm".equals(key)) { + if (value == null) { + return GieFailures.notImplemented("+pm with no value"); + } + if ("greenwich".equals(value)) { + return null; + } + Double rad = ProjDefinitionValidator.projAngleRadians(value); + if (rad != null && rad.doubleValue() == 0.0) { + return null; + } + return GieFailures.notImplemented( + "+pm=" + value + ": proj4j applies the prime meridian only in " + + "BasicCoordinateTransform, not in Projection.projectRadians"); + } + if ("zone".equals(key)) { + if (projection instanceof TransverseMercatorProjection + || projection instanceof ExtendedTransverseMercatorProjection) { + return null; + } + return GieFailures.notImplemented( + "+zone=" + value + " on +proj=" + + (projection == null ? "?" : projection.getName()) + + ": Proj4Parser applies +zone only to the two transverse Mercator " + + "classes and silently drops it otherwise"); + } + if ("towgs84".equals(key)) { + // A null Helmert is ignored by PROJ too. A non-null one makes PROJ + // insert +proj=helmert plus a cart round-trip; proj4j's operation + // path does neither. + if (isNullHelmert(value)) { + return null; + } + return GieFailures.notImplemented( + "+towgs84=" + value + ": PROJ inserts a +proj=helmert step " + + "(create.cpp cs2cs_emulation_setup); proj4j applies the datum shift " + + "only in BasicCoordinateTransform"); + } + if ("datum".equals(key)) { + // datum_set.cpp appends the datum's own defn to the paralist, so + // +datum is only inert when that defn is a null towgs84. + if ("WGS84".equals(value) || "NAD83".equals(value)) { + return null; + } + if ("NAD27".equals(value)) { + return GieFailures.notImplemented( + "+datum=NAD27 expands to +nadgrids=@conus,@alaska,@ntv2_0.gsb," + + "@ntv1_can.dat, which PROJ turns into a +proj=hgridshift step"); + } + return GieFailures.notImplemented( + "+datum=" + value + " expands to a non-null +towgs84, which PROJ turns into " + + "a +proj=helmert step"); + } + if ("geoidgrids".equals(key)) { + return GieFailures.notImplemented( + "+geoidgrids=" + value + ": PROJ turns this into a +proj=vgridshift step " + + "(create.cpp:88-105); proj4j builds it in Cs2csOperator, which the " + + "single-projection operation path does not go through"); + } + if ("multiplier".equals(key)) { + return GieFailures.notImplemented( + "+multiplier=" + value + ": read upstream by vgridshift and deformation, " + + "neither of which is a Registry projection here"); + } + if ("vunits".equals(key)) { + // The vertical unit is inert only when it is metres, i.e. the same as the default. + if ("m".equals(value)) { + return null; + } + return GieFailures.notImplemented( + "+vunits=" + value + ": proj4j scales the vertical axis only in " + + "Cs2csOperator, not in Projection.projectRadians"); + } + if ("vto_meter".equals(key)) { + Double v = ProjDefinitionValidator.projDouble(value); + if (v != null && v.doubleValue() == 1.0) { + return null; + } + return GieFailures.notImplemented( + "+vto_meter=" + value + ": proj4j scales the vertical axis only in " + + "Cs2csOperator, not in Projection.projectRadians"); + } + if ("z_0".equals(key)) { + Double v = ProjDefinitionValidator.projDouble(value); + if (v != null && v.doubleValue() == 0.0) { + return null; + } + return GieFailures.notImplemented( + "+z_0=" + value + ": proj4j offsets the vertical axis only in " + + "Cs2csOperator, not in Projection.projectRadians"); + } + if ("nadgrids".equals(key)) { + return GieFailures.notImplemented( + "+nadgrids=" + value + ": PROJ turns this into a +proj=hgridshift step " + + "(create.cpp cs2cs_emulation_setup); proj4j builds it in " + + "Cs2csOperator, which the single-projection operation path does " + + "not go through"); + } + if ("geoc".equals(key)) { + // Read with pj_param's 'b' sigil, so +geoc=F really is off and inert. + if (!ProjDefinitionValidator.projBooleanValue(value)) { + return null; + } + return GieFailures.notImplemented( + "+geoc: geocentric latitude is applied by fwd_prepare/inv_finalize " + + "(fwd.cpp:80-81, inv.cpp:139-140), which proj4j implements in " + + "Cs2csOperator and not in Projection.projectRadians"); + } + throw new IllegalArgumentException("not a conditional key: " + key); + } + + /** Whether a {@code +towgs84} list is all zeros, which PROJ ignores. */ + static boolean isNullHelmert(String value) { + if (value == null) { + return false; + } + String[] parts = value.split(",", -1); + if (parts.length != 3 && parts.length != 7) { + return false; + } + for (int i = 0; i < parts.length; i++) { + Double d = ProjDefinitionValidator.projDouble(parts[i]); + if (d == null || d.doubleValue() != 0.0) { + return false; + } + } + return true; + } + + // -------------------------------------------------------- value grammar + + /** + * The keys PROJ reads with {@code pj_param} type {@code 'r'}, i.e. as an angle + * converted to radians by {@code dmstor}. {@code +alpha}, {@code +lonc} and + * {@code +gamma} are on this list: the docs are silent but {@code init.cpp} + * and the {@code omerc}/{@code ocea} setups read them as angles. + * {@code +azi} and {@code +rot} likewise — {@code spilhaus.cpp:133-136} builds + * both accessors with an {@code "r"} prefix. + */ + static final Set ANGLE_KEYS = set( + "lat_0", "lon_0", "lat_1", "lat_2", "lat_ts", "alpha", "lonc", "gamma", + "R_lat_a", "R_lat_g", "azi", "rot", + // tpers reads +tilt and +azi with the "r" sigil (nsper.cpp:186-187), and airy + // reads +lat_b with it (airy.cpp:120). + "tilt", "lat_b", + // som reads +inc_angle and +asc_lon with the "r" sigil (som.cpp:250,259), and every + // one of ob_tran's nine angular parameters likewise (ob_tran.cpp:230-281). + "inc_angle", "asc_lon", + "o_alpha", "o_lon_c", "o_lat_c", "o_lat_p", "o_lon_p", + "o_lon_1", "o_lat_1", "o_lon_2", "o_lat_2", + // omerc's two-point form: the latitudes were reachable via +lat_1/+lat_2 but + // the longitudes had no keyword at all, so only half the form could be given. + "lon_1", "lon_2"); + + /** The keys PROJ reads with {@code pj_param} type {@code 'd'}. */ + static final Set DOUBLE_KEYS = set( + "x_0", "y_0", "k", "k_0", "a", "b", "es", "e", "rf", "f", "R", "h", + "scrollx", "scrolly", + // som's period of revolution; gn_sinu's and urm5's shape parameters; col_urban's + // reference height. All plain 'd' sigils upstream. + "ps_rev", "m", "n", "q", "h_0", + // lagrng's and hammer's +W and hammer's +M: presence is tested with 't' and the + // value then read with 'd' (lagrng.cpp:79-80, hammer.cpp:63-73), so both are + // plain doubles and NOT angles. + "W", "M"); + + /** + * Whether proj4j's value grammar can represent this value the way PROJ reads + * it. + * + *

PROJ's grammar is strictly wider: {@code pj_atof} is C {@code strtod} + * and stops at the first invalid character rather than failing, angles accept + * DMS with {@code '}/{@code "}, a {@code d}/{@code D}/degree-sign suffix, an + * {@code r}/{@code R} radian suffix and a trailing cardinal, and + * {@code +to_meter} accepts a {@code num/den} ratio. Any value proj4j reads + * differently is a silent wrong answer, so it is reported + * {@link GieFailureKind#NOT_IMPLEMENTED} instead. + * + *

This mirrors {@code Proj4Parser}'s private {@code parseAngle}/ + * {@code parseDouble} rather than calling them, since they are not visible. + * The mirror is six lines and it fails closed: if core widens its + * grammar and this lags, the result is a conservative + * {@code NOT_IMPLEMENTED}, never a wrong pass. + * + * @return a failure, or {@code null} when the two grammars agree. + */ + static GieFailure valueGrammarFailure(String key, String value) { + if (value == null) { + return null; + } + if ("to_meter".equals(key) && value.indexOf('/') >= 0) { + return GieFailures.notImplemented( + "+to_meter=" + value + ": PROJ accepts a num/den ratio, proj4j does not"); + } + if (ANGLE_KEYS.contains(key)) { + Double proj = ProjDefinitionValidator.projAngleRadians(value); + if (proj == null) { + return null; + } + Double ours = proj4jAngleRadians(value); + if (ours == null) { + return GieFailures.notImplemented( + "+" + key + "=" + value + ": PROJ reads " + proj + + " rad, proj4j cannot parse it"); + } + if (!closeEnough(proj.doubleValue(), ours.doubleValue())) { + return GieFailures.notImplemented( + "+" + key + "=" + value + ": PROJ reads " + proj + + " rad, proj4j reads " + ours + " rad"); + } + return null; + } + if (DOUBLE_KEYS.contains(key) || "to_meter".equals(key)) { + Double proj = ProjDefinitionValidator.projDouble(value); + if (proj == null) { + return null; + } + Double ours = proj4jDouble(value); + if (ours == null) { + return GieFailures.notImplemented( + "+" + key + "=" + value + ": PROJ reads " + proj + + ", proj4j cannot parse it"); + } + if (!closeEnough(proj.doubleValue(), ours.doubleValue())) { + return GieFailures.notImplemented( + "+" + key + "=" + value + ": PROJ reads " + proj + + ", proj4j reads " + ours); + } + } + return null; + } + + /** + * A mirror of {@code Proj4Parser.parseAngle}: {@code Angle.parse} plus the + * {@code r}/{@code R} radian suffix. + * + * @return radians, or {@code null} if proj4j would throw. + */ + static Double proj4jAngleRadians(String s) { + try { + int length = s.length(); + if (length > 1) { + char last = s.charAt(length - 1); + if (last == 'r' || last == 'R') { + return Double.valueOf(Double.parseDouble(s.substring(0, length - 1))); + } + } + return Double.valueOf(Angle.parse(s) * ProjectionMath.DTR); + } catch (RuntimeException e) { + return null; + } + } + + /** A mirror of {@code Proj4Parser.parseDouble}. */ + static Double proj4jDouble(String s) { + try { + return Double.valueOf(Double.parseDouble(s.trim())); + } catch (RuntimeException e) { + return null; + } + } + + /** + * Agreement to 1e-12 relative. Loose enough to absorb the up-to-1-ULP + * difference between {@code Math.toRadians} (which computes + * {@code deg / 180 * PI}) and PROJ's {@code deg * M_PI / 180}, tight enough + * that any real grammar divergence — DMS, a radian suffix, a ratio, a + * cardinal — is orders of magnitude larger. + */ + static boolean closeEnough(double a, double b) { + if (a == b) { + return true; + } + if (Double.isNaN(a) && Double.isNaN(b)) { + return true; + } + double scale = Math.max(Math.abs(a), Math.abs(b)); + return Math.abs(a - b) <= 1e-12 * Math.max(1.0, scale); + } + + // ----------------------------------------------------- Registry probing + + private static final Map RESOLVABLE = new ConcurrentHashMap(); + private static final Object STDERR_LOCK = new Object(); + + /** + * Whether {@code Registry.getProjection(name)} yields a usable projection. + * + *

Three names — {@code alsk}, {@code apian} and {@code bacon} — are + * registered against the abstract {@code Projection} class, so + * {@code Registry.getProjection} catches the {@code InstantiationException}, + * prints a stack trace to {@code System.err} and returns {@code null} + * ({@code Registry.java:124-142}). Left alone that is 3 stack traces per + * corpus sweep for something we already know and have classified, which + * makes a conformance run look broken. + * + *

So the probe swaps {@code System.err} for a sink. That mutates a JVM + * global, so it is done under a lock, once per name, and the answer is cached + * — at most three suppressions per JVM no matter how large the corpus. + */ + static boolean resolvable(Registry registry, String name) { + if (name == null) { + return false; + } + Boolean cached = RESOLVABLE.get(name); + if (cached != null) { + return cached.booleanValue(); + } + boolean ok; + synchronized (STDERR_LOCK) { + PrintStream saved = System.err; + try { + System.setErr(new PrintStream(new ByteArrayOutputStream(), true)); + ok = registry.getProjection(name) != null; + } catch (RuntimeException e) { + ok = false; + } finally { + System.setErr(saved); + } + } + RESOLVABLE.put(name, Boolean.valueOf(ok)); + return ok; + } + + private static Set set(String... values) { + return Collections.unmodifiableSet(new LinkedHashSet(Arrays.asList(values))); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jCapabilitiesTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jCapabilitiesTest.java new file mode 100644 index 0000000..999ae88 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jCapabilitiesTest.java @@ -0,0 +1,148 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.parser.Proj4Keyword; + +class Proj4jCapabilitiesTest { + + /** + * The drift tripwire. The bridge deliberately does not trust + * {@code Proj4Keyword.supportedParameters()} to mean "proj4j acts on this" — + * three keys in that list are read and then ignored on the single-projection + * path. So it keeps its own three-way classification, and this test fails the + * moment core's allow-list grows a key the bridge has no opinion about. + * + *

If you are reading this because the test failed: put the new key in + * {@link Proj4jCapabilities#HONOURED} (proj4j applies it), + * {@link Proj4jCapabilities#INERT} (no numeric effect) or + * {@link Proj4jCapabilities#CONDITIONAL} (the value decides) and extend + * {@link Proj4jCapabilities#conditionalFailure} if you chose the third. Do not + * "fix" it by deleting the assertion: an unclassified key flows straight + * through and produces a wrong number that looks like a pass. + */ + @Test + @DisplayName("every key in core's allow-list is classified by the bridge") + void allowListIsFullyClassified() { + List unclassified = new ArrayList(); + Iterator it = Proj4Keyword.supportedParameters().iterator(); + while (it.hasNext()) { + String key = (String) it.next(); + if (!Proj4jCapabilities.classified().contains(key)) { + unclassified.add(key); + } + } + Collections.sort(unclassified); + assertEquals(Collections.emptyList(), unclassified, + "core's Proj4Keyword allow-list has grown keys the bridge does not classify. " + + "Add each to Proj4jCapabilities.HONOURED, INERT or CONDITIONAL - see " + + "this test's javadoc. Allow-list size is now " + + Proj4Keyword.supportedParameters().size() + "."); + } + + @Test + @DisplayName("the three sets are disjoint") + void setsAreDisjoint() { + for (String k : Proj4jCapabilities.HONOURED) { + assertTrue(!Proj4jCapabilities.INERT.contains(k) + && !Proj4jCapabilities.CONDITIONAL.contains(k), k + " is in two sets"); + } + for (String k : Proj4jCapabilities.INERT) { + assertTrue(!Proj4jCapabilities.CONDITIONAL.contains(k), k + " is in two sets"); + } + } + + @Test + @DisplayName("the conditional rules encode PROJ's cs2cs_emulation_setup triggers") + void conditionalRules() { + // +axis: PROJ inserts an axisswap step only when the order is not "enu". + assertNull(Proj4jCapabilities.conditionalFailure("axis", "enu", null)); + assertNotNull(Proj4jCapabilities.conditionalFailure("axis", "neu", null)); + + // +pm: only Greenwich, by name or by angle, is a no-op. + assertNull(Proj4jCapabilities.conditionalFailure("pm", "greenwich", null)); + assertNull(Proj4jCapabilities.conditionalFailure("pm", "0", null)); + assertNotNull(Proj4jCapabilities.conditionalFailure("pm", "ferro", null)); + + // +towgs84: PROJ ignores an all-zero Helmert. + assertNull(Proj4jCapabilities.conditionalFailure("towgs84", "0,0,0", null)); + assertNull(Proj4jCapabilities.conditionalFailure("towgs84", "0,0,0,0,0,0,0", null)); + assertNotNull(Proj4jCapabilities.conditionalFailure("towgs84", "1,2,3", null)); + + // +datum: inert only when its own defn is a null towgs84. + assertNull(Proj4jCapabilities.conditionalFailure("datum", "WGS84", null)); + assertNull(Proj4jCapabilities.conditionalFailure("datum", "NAD83", null)); + assertNotNull(Proj4jCapabilities.conditionalFailure("datum", "NAD27", null)); + assertNotNull(Proj4jCapabilities.conditionalFailure("datum", "potsdam", null)); + + // +nadgrids: always a hgridshift step upstream. + assertNotNull(Proj4jCapabilities.conditionalFailure("nadgrids", "@conus", null)); + } + + @Test + @DisplayName("isNullHelmert accepts only well-formed all-zero lists") + void nullHelmert() { + assertTrue(Proj4jCapabilities.isNullHelmert("0,0,0")); + assertTrue(Proj4jCapabilities.isNullHelmert("0.0,0,-0.0")); + assertTrue(!Proj4jCapabilities.isNullHelmert("0,0")); + assertTrue(!Proj4jCapabilities.isNullHelmert("0,0,1")); + assertTrue(!Proj4jCapabilities.isNullHelmert(null)); + } + + @Test + @DisplayName("the value-grammar check catches every form PROJ has and proj4j lacks") + void valueGrammar() { + // Agreement: plain decimals and DMS that Angle.parse also understands. + assertNull(Proj4jCapabilities.valueGrammarFailure("lat_0", "45")); + assertNull(Proj4jCapabilities.valueGrammarFailure("lat_0", "-45.5")); + assertNull(Proj4jCapabilities.valueGrammarFailure("x_0", "500000")); + assertNull(Proj4jCapabilities.valueGrammarFailure("x_0", "1e5")); + assertNull(Proj4jCapabilities.valueGrammarFailure("k_0", "0.9996")); + assertNull(Proj4jCapabilities.valueGrammarFailure("lat_0", null)); + + // Divergence: a num/den ratio, which only +to_meter accepts. + assertNotNull(Proj4jCapabilities.valueGrammarFailure("to_meter", "1/0.3048")); + + // strtod stops at the first invalid character; Double.parseDouble throws. + assertNotNull(Proj4jCapabilities.valueGrammarFailure("x_0", "500000junk")); + } + + @Test + @DisplayName("the 1e-12 bar absorbs the toRadians ULP difference but nothing larger") + void closeEnoughBar() { + double deg = 55.0; + // PROJ computes deg * M_PI / 180; the JDK computes deg / 180 * PI. Up to 1 + // ULP apart, and 1 ULP of a radian is about 1.4e-9 m on the ellipsoid - + // exactly the threshold of the corpus's 16 nanometre-tolerance rows. + assertTrue(Proj4jCapabilities.closeEnough(deg * Math.PI / 180.0, Math.toRadians(deg))); + // A radian-versus-degree confusion is 57x, nowhere near the bar. + assertTrue(!Proj4jCapabilities.closeEnough(1.0, Math.toRadians(1.0))); + assertTrue(Proj4jCapabilities.closeEnough(Double.NaN, Double.NaN)); + assertTrue(!Proj4jCapabilities.closeEnough(0.0, 1e-6)); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jGieOperationFactory.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jGieOperationFactory.java new file mode 100644 index 0000000..2a1f6e1 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jGieOperationFactory.java @@ -0,0 +1,803 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.pipeline.PipelineDefinitionException; +import org.locationtech.proj4j.pipeline.PipelineErrorCode; +import org.locationtech.proj4j.pipeline.PipelineFactory; +import org.locationtech.proj4j.resource.ClasspathResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; +import org.locationtech.proj4j.proj.Projection; + +/** + * The bridge from a gie operation definition to something proj4j can execute. + * + *

What this is for

+ * + *

The gie corpus feeds proj4j operation strings that proj4j mostly cannot run: + * 75 of its 780 {@code operation} commands are {@code +proj=pipeline}, another 340 + * name an operator outside proj4j's 93-entry {@code Registry}, and the parameter + * vocabulary is far wider than proj4j's allow-list. So this factory's job is + * not to make everything work. It is to be an honest, precise boundary: for + * each operation, either produce something executable, or say exactly why not, so + * that the conformance number distinguishes "we got the wrong answer" from "we have + * not implemented this". + * + *

The classification rule

+ * + *
+ * {@link GieFailureKind#INVALID_DEFINITION} is decided only by + * {@link ProjDefinitionValidator}, from PROJ 9.8.1's own name tables and + * validation rules — never from a proj4j exception or its message. It + * means "upstream would reject this too", which is what a gie + * {@code expect failure} row asserts. + *

+ * Any exception proj4j raises that the validator did not predict proves only + * that proj4j is stricter or narrower than PROJ, so it is + * {@link GieFailureKind#NOT_IMPLEMENTED} — or + * {@link GieFailureKind#MISSING_GRID}/{@link GieFailureKind#NUMERICAL} when the + * exception type itself is more specific. In particular + * {@code UnsupportedParameterException} is always + * {@code NOT_IMPLEMENTED}: PROJ has no allow-list at all, so refusing a key can + * never be a statement about the definition. + *

+ * PROJ's verdict wins. The validator runs first, so a definition that is + * both invalid upstream and unimplemented here is reported + * {@code INVALID_DEFINITION}. + *
+ * + *

Two consequences worth stating explicitly, because they are the reason the + * rule is shaped this way: + * + *

    + *
  • An unknown {@code +proj=} name is not automatically + * {@code NOT_IMPLEMENTED}. It is checked against + * {@link ProjTables#OPERATORS}, PROJ's own 186-entry list: unknown to PROJ + * means {@code INVALID_DEFINITION}, known to PROJ but missing from + * {@code Registry} means {@code NOT_IMPLEMENTED}. Without that table the + * distinction is not decidable and {@code expect failure} rows become + * meaningless.
  • + *
  • Dropping a token is never free. {@link GieProjArgs#toProj4Args()} filters the + * definition down to what {@code Proj4Parser} accepts so that an unknown key is + * ignored rather than fatal, exactly as PROJ ignores it — but if PROJ + * would have acted on the dropped token, this factory reports + * {@code NOT_IMPLEMENTED} rather than executing without it. See + * {@link Proj4jCapabilities}, which inverts the trust relation: the bridge + * enumerates what it vouches for and everything else fails closed.
  • + *
+ * + *

Never throws

+ * + *

Both factory methods always return a {@link GieOperation}. Besides + * {@code Proj4jException}, four non-{@code Proj4jException} escapes are caught and + * mapped — see {@link #mapConstructionThrowable}. + */ +public final class Proj4jGieOperationFactory implements GieOperationFactory { + + private final CRSFactory crsFactory; + private final CoordinateTransformFactory transformFactory; + private final Registry registry; + private final PipelineFactory pipelineFactory; + + /** + * Makes the vendored {@code src/test/resources/proj-data/} tree visible to core's + * deterministic resolver chain, at a priority ahead of the two built-in prefixes. + * + *

Without this, no {@code +grids=}, {@code +xy_grids=}, {@code +z_grids=}, + * {@code +geoidgrids=} or {@code +nadgrids=} token in the corpus can resolve at all: + * core searches {@code classpath:proj4j-data/grids/} and {@code classpath:proj4/nad/} + * and, deliberately, never the working directory, while + * {@link org.locationtech.proj4j.conformance.runner.GieGridAvailability.OnClasspath} + * already answers {@code require_grid} from {@code /proj-data/}. The two were + * disagreeing: the runner said the grid was present and core could not find it. + * + *

Registered once per classloader, in a static initialiser rather than the + * constructor, because {@code ResourceResolvers.addResolver} appends and a second call + * would put a duplicate in the chain. + */ + static { + ResourceResolvers.addResolver(new ClasspathResourceResolver( + Proj4jGieOperationFactory.class.getClassLoader(), "proj-data", null, 10)); + } + + public Proj4jGieOperationFactory() { + this.crsFactory = new CRSFactory(); + this.transformFactory = new CoordinateTransformFactory(); + this.registry = crsFactory.getRegistry(); + this.pipelineFactory = new PipelineFactory(registry); + } + + // ------------------------------------------------------------- operation + + @Override + public GieOperation create(String args) { + GieProjArgs a; + try { + a = GieProjArgs.parse(args); + } catch (RuntimeException e) { + // GieProjArgs.parse is total, so this is unreachable; it is here + // because "the factory never throws" must be true unconditionally. + return new UnusableOperation(GieFailures.of(GieFailureKind.OTHER, + "could not tokenise the definition: " + args, e)); + } + if (a.isEmpty()) { + return new UnusableOperation( + GieFailures.invalidDefinition("empty operation definition")); + } + + // 0. Not a proj-string at all. proj_create() also accepts an authority + // code, an OGC URN, WKT and PROJJSON, resolving them through proj.db - + // nkg.gie's 26 operations are all + // "urn:ogc:def:coordinateOperation:NKG::...". Those are perfectly valid + // upstream, so they are a database gap in proj4j and must not be + // mistaken for a malformed definition. + GieFailure identifier = databaseIdentifierFailure(a); + if (identifier != null) { + return new UnusableOperation(identifier); + } + + // 1. PROJ's own verdict first, so INVALID_DEFINITION wins over any + // proj4j gap that would also apply. + // + // Skipped for a bare (non-pipeline) `+init=`, and only for that case: + // validateProjName would report a missing `+proj`, which is wrong - + // `+init=` supplies one through the expansion, and PROJ accepts it. The + // validator is still the authority for a pipeline, where it checks + // structure and whether each step names an operator PROJ knows at all; + // PipelineFactory cannot make that last call, since "unknown to PROJ" + // and "unimplemented here" are indistinguishable from inside proj4j. + boolean legacyInit = a.contains("init"); + // A bare `+proj=` - `+proj=axisswap order=2,1`, + // `+proj=unitconvert xy_in=m xy_out=dm`, `+proj=hgridshift grids=...` - is a + // complete PROJ operation with neither `+step` nor `+init=`, and it belongs to the + // pipeline engine: those operators live there, not in Registry. Routing only + // pipelines and `+init=` here left axisswap.gie at 2/27 and unitconvert.gie at + // 0/16 with both operators complete and passing their own unit tests, and reported + // them as "+proj=X is a PROJ operator but Registry does not resolve it". + boolean bareOperator = PipelineFactory.handlesOperator(a.peek("proj")); + // A plain legacy proj-string carrying `+towgs84`, `+datum=`, `+nadgrids`, + // `+geoidgrids`, `+axis`, `+pm` or a vertical unit is a cs2cs-style operation, + // and PROJ runs it through exactly the same cs2cs_emulation_setup it runs an + // `+init=` through. It therefore belongs to the pipeline engine too, and routing + // it here rather than to CRSFactory is what unlocks it - see + // Proj4jCapabilities.requiresCs2csEmulation for why this is a routing decision + // and not a widening of what the bridge vouches for. + boolean cs2csEmulation = Proj4jCapabilities.requiresCs2csEmulation(a); + if (a.isPipeline() || !legacyInit) { + GieFailure upstream = ProjDefinitionValidator.validate(a); + if (upstream != null) { + return new UnusableOperation(upstream); + } + } + + // 2. Pipelines, legacy `+init=` definitions, bare pipeline-only operators, and + // anything carrying a cs2cs-emulation key go to the pipeline engine. It + // expands `+init=` out of the PROJ.4 init dictionaries under + // `use_proj4_init_rules` semantics - the only semantics available here, + // since there is no proj.db - and builds the hidden cs2cs-emulation steps + // that make `+towgs84`, `+nadgrids`, `+geoidgrids`, `+pm` and `+axis` mean + // anything. + if (a.isPipeline() || legacyInit || bareOperator) { + return createFromPipelineEngine(args); + } + if (cs2csEmulation) { + // Rerouting must not smuggle a token past the token-level check. + // Cs2csOperator parses with Proj4Parser in PROJ_COMPATIBLE mode, which + // *retains and ignores* a key outside the allow-list rather than refusing + // it - so without this gate a definition combining `+towgs84` with a key + // proj4j silently drops would be executed and would answer plausibly and + // wrongly, which is the one outcome the classification contract exists to + // prevent. Every non-emulation token must therefore still be vouched for; + // only the emulation keys are exempted, and only because the engine we are + // routing to is where they are implemented. + // `+zone` and `+path` still need a projection to judge, and the pipeline + // engine does not hand one back - so it is resolved from the `+proj=` name + // alone, which is all the two rules ask (`instanceof` on the two transverse + // Mercator classes, and on misrsom). A name Registry cannot resolve leaves + // it null, and the rule then refuses, which is the fail-closed direction. + Projection byName = registry.getProjection(a.peek("proj")); + List conditionals = new ArrayList(); + GieFailure gap = classifyTokens(a, conditionals, true); + if (gap != null) { + return new UnusableOperation(gap); + } + for (int i = 0; i < conditionals.size(); i++) { + GieToken t = conditionals.get(i); + GieFailure f = Proj4jCapabilities.conditionalFailure(t.key(), t.value(), byName); + if (f != null) { + return new UnusableOperation(f); + } + } + return createFromPipelineEngine(args); + } + + String projName = a.peek("proj"); + if (!Proj4jCapabilities.resolvable(registry, projName)) { + return new UnusableOperation(GieFailures.notImplemented( + "+proj=" + projName + " is a PROJ 9.8.1 operator but proj4j's Registry " + + "does not resolve it (it is either unregistered or, like alsk, " + + "apian and bacon, registered against the abstract Projection " + + "class, in which case Registry.getProjection returns null)")); + } + + // 3. Token-level gaps: anything the bridge does not vouch for. + List conditionals = new ArrayList(); + GieFailure tokenGap = classifyTokens(a, conditionals, false); + if (tokenGap != null) { + return new UnusableOperation(tokenGap); + } + + // 4. Build it. The implicit +ellps=GRS80 is appended per + // init.cpp:317-360; without it DatumParameters leaves a and es at NaN + // and every ellipsoid-less operation would return NaN, which would be + // scored as a numerical defect rather than the parser gap it is. + GieProjArgs effective = a.withImplicitDefaults(); + String[] proj4Args = effective.toProj4Args(); + CoordinateReferenceSystem crs; + try { + crs = crsFactory.createFromParameters(null, proj4Args); + } catch (Throwable e) { + GieFailure f = mapConstructionThrowable(e); + if (f == null) { + rethrow(e); + } + return new UnusableOperation(f); + } + if (crs == null || crs.getProjection() == null) { + return new UnusableOperation(GieFailures.notImplemented( + "CRSFactory produced no projection for " + effective)); + } + Projection projection = crs.getProjection(); + + // 5. Conditional keys whose verdict needs the constructed projection + // (+zone is applied only to the two transverse Mercator classes). + for (int i = 0; i < conditionals.size(); i++) { + GieToken t = conditionals.get(i); + GieFailure f = Proj4jCapabilities.conditionalFailure(t.key(), t.value(), projection); + if (f != null) { + return new UnusableOperation(f); + } + } + + boolean angular = ProjTables.ANGULAR_BOTH_SIDES.contains(projName); + GieIoUnits left = GieIoUnits.RADIANS; + GieIoUnits right = angular ? GieIoUnits.RADIANS : GieIoUnits.CLASSIC; + boolean inverted = invertedFlag(a); + + return new SingleProjectionOperation(effective.toString(), projection, left, right, + inverted, angular); + } + + // ------------------------------------------------------------ the pipeline + + /** + * Build a {@code +proj=pipeline} (or a legacy {@code +init=} operation, which + * PROJ treats as a one-step pipeline because {@code pj_init} runs the same + * {@code cs2cs_emulation_setup} either way). + * + * @param args the definition as written in the corpus + * @return an executable operation, or an {@link UnusableOperation} saying why not + */ + private GieOperation createFromPipelineEngine(String args) { + try { + return new PipelineGieOperation(args, pipelineFactory.create(args)); + } catch (Throwable e) { + GieFailure f = mapPipelineThrowable(e); + if (f == null) { + rethrow(e); + } + return new UnusableOperation(f); + } + } + + /** + * Classify a pipeline construction failure. + * + *

{@link PipelineDefinitionException} is the only throwable that can say + * whether upstream would have rejected the definition, and it is + * therefore checked before the generic {@code Proj4jException} mapping — which + * would otherwise report every pipeline rejection as + * {@link GieFailureKind#NOT_IMPLEMENTED} and lose the distinction an + * {@code expect failure} row depends on. + * + * @return the failure, or {@code null} if the throwable must be rethrown + */ + static GieFailure mapPipelineThrowable(Throwable e) { + if (e instanceof PipelineDefinitionException) { + PipelineDefinitionException p = (PipelineDefinitionException) e; + return GieFailures.of(pipelineKind(p), "pipeline: " + describe(e), e); + } + return mapConstructionThrowable(e); + } + + /** + * Which {@link GieFailureKind} a pipeline rejection is, given its + * {@link PipelineErrorCode}. + * + *

A code whose {@link ErrorCause} is {@link ErrorCause#MISSING_GRID} is + * {@link GieFailureKind#MISSING_GRID}, not {@link GieFailureKind#NOT_IMPLEMENTED}. + * The check keys on the cause rather than on a constant's identity so that the + * bridge reflects core's taxonomy instead of naming a constant that can be renamed out + * from under it — which is exactly what happened once already, when the enum was split + * and {@code FILE_NOT_FOUND_OR_INVALID} kept its name while changing its meaning. The + * classification here is the one {@link BridgeVerdictCrossTabTest} keeps honest; its + * bottom-left cell is measured at 0 and must stay there. + * + *

What core declares today

+ * + *

{@code FILE_NOT_FOUND_OR_INVALID} models + * {@code PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID} (1029) and is declared + * {@code rejectedByProj = false} with {@link ErrorCause#MISSING_GRID} + * ({@code core/.../pipeline/PipelineErrorCode.java:86}). It no longer carries the + * {@code +init=} population: an {@code +init=:

} key that cannot be + * resolved is {@code INVALID_INIT_KEY}, errno 1027 per + * {@code 9.8.1:src/init.cpp:105,119,134}, with {@link ErrorCause#INVALID_PARAM_VALUE} + * and {@code rejectedByProj = true}. + * + *

This branch is therefore load-bearing, not redundant. Because + * {@code rejectedByProj} is now {@code false}, deleting it does not fall through to + * {@code INVALID_DEFINITION} — it falls through to {@code NOT_IMPLEMENTED}, which + * {@code ExpectedFailureVerdict} never scores as genuine, so the errno-named passes + * are lost. Measured against the live gate on 2026-08-01: removing the branch turns + * 7 assertions from {@code PASS} into {@code VACUOUS_EXPECTED_FAILURE}, taking the + * headline from {@code 7378/7895} to {@code 7371/7888} and failing the build with 7 + * {@code REGRESSED}. The seven are {@code tinshift.gie#1:0} and {@code #2:0} — the + * {@code +file=i_do_not_exist} and {@code +file=proj.ini} operations at + * {@code tinshift.gie:14} and {@code :18}, whose assertions are the two + * {@code expect failure errno invalid_op_file_not_found_or_invalid} rows at {@code :15} + * and {@code :19} — plus {@code deformation.gie#6:0}/{@code #7:0}/{@code #8:0}, + * {@code geotiff_grids.gie#38:0} and {@code more_builtins.gie#25:0}. Every one of them + * names {@code errno invalid_op_file_not_found_or_invalid}, which is exactly the errno + * {@code ExpectedFailureVerdict} requires before it will score a {@code MISSING_GRID} + * genuine. So this is a re-keying, not a candidate for removal. + * + *

Why {@code MISSING_GRID} rather than {@code INVALID_DEFINITION}

+ * + *

The engine raises this code when a grid or JSON file cannot be read, + * and there the claim "PROJ 9.8.1 would reject this too" is simply false: the corpus + * follows {@code +proj=hgridshift +grids=tests/test_hgrid.tif} + * (geotiff_grids.gie:206) with {@code expect 5.875 55.375 0}, and the file is + * vendored under {@code src/test/resources/proj-data/tests/}. PROJ reads it; proj4j + * has no GeoTIFF reader. Thirteen more {@code .tif} {@code hgridshift} operations, + * two {@code .gsb} ones, five {@code tinshift} {@code .json} ones and one + * {@code deformation} {@code .ct2} one are the same story. + * + *

The bridge cannot tell "unreadable here" from "genuinely absent" from inside — + * but it does not have to, because {@code ExpectedFailureVerdict} already resolves + * exactly this ambiguity from the corpus side: {@code MISSING_GRID} is a genuine + * pass under {@code invalid_op_file_not_found_or_invalid} and vacuous under anything + * else. So {@code tinshift.gie:19} stays a pass, while the bare + * {@code expect failure} rows in the blocks above are not passes. That is the honest + * direction: it lowers the headline. + * + * @param p a pipeline construction failure + * @return the kind; never {@code null} + */ + private static GieFailureKind pipelineKind(PipelineDefinitionException p) { + // code() is documented never-null and the constructor dereferences it, so no guard here. + if (p.code().errorCause() == ErrorCause.MISSING_GRID) { + return GieFailureKind.MISSING_GRID; + } + return p.isRejectedByProj() + ? GieFailureKind.INVALID_DEFINITION + : GieFailureKind.NOT_IMPLEMENTED; + } + + /** + * WKT and PROJJSON openers, plus the authority/URN forms. + * {@code proj_create()} dispatches on these before it ever reaches + * {@code pj_init}, so a definition in one of these shapes is a + * database gap in proj4j, not a malformed definition. + */ + private static final String[] WKT_KEYWORDS = { + "PROJCS", "GEOGCS", "GEOCCS", "VERT_CS", "COMPD_CS", "LOCAL_CS", "FITTED_CS", + "PROJCRS", "GEOGCRS", "GEODCRS", "GEODETICCRS", "VERTCRS", "COMPOUNDCRS", + "BOUNDCRS", "ENGCRS", "PARAMETRICCRS", "TIMECRS", "DERIVEDPROJCRS", + "COORDINATEOPERATION", "CONCATENATEDOPERATION", "COORDINATEMETADATA" + }; + + /** + * @return a {@link GieFailureKind#NOT_IMPLEMENTED} failure when the definition + * is an authority code, an OGC URN, WKT or PROJJSON rather than a + * proj-string; {@code null} when it is a proj-string (or unrecognisable, + * in which case {@link ProjDefinitionValidator} gets to call it invalid). + */ + private static GieFailure databaseIdentifierFailure(GieProjArgs a) { + String raw = a.raw().trim(); + if (raw.startsWith("{")) { + return GieFailures.notImplemented( + "PROJJSON definition: PROJ resolves this through its own JSON reader, " + + "which proj4j has no equivalent of"); + } + int paren = raw.indexOf('['); + if (paren > 0) { + String head = raw.substring(0, paren).trim().toUpperCase(); + for (int i = 0; i < WKT_KEYWORDS.length; i++) { + if (head.equals(WKT_KEYWORDS[i])) { + return GieFailures.notImplemented( + "WKT definition (" + head + "): proj4j's CRSFactory reads no WKT"); + } + } + } + // A single token with a ':' and no '=': "EPSG:4326", or an OGC URN such as + // "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_DK". + if (a.size() == 1) { + GieToken t = a.tokens().get(0); + if (!t.hasValue() && t.key().indexOf(':') >= 0) { + return GieFailures.notImplemented( + "\"" + t.key() + "\" is an authority code or OGC URN, which " + + "proj_create() resolves through proj.db; proj4j has no " + + "operation database"); + } + } + return null; + } + + /** + * {@code +inv}, read with {@code pj_param} type {@code 'b'} so that + * {@code +inv=F} correctly means "not inverted". + */ + private static boolean invertedFlag(GieProjArgs a) { + GieToken t = a.find("inv"); + if (t == null) { + return false; + } + t.markUsed(); + return ProjDefinitionValidator.projBooleanValue(t.value()); + } + + /** + * Walk the definition's tokens and report the first that proj4j cannot honour. + * + *

Conditional keys are collected rather than judged, because some of them + * ({@code +zone}) need the constructed projection. + * + * @param forEmulationRoute when {@code true} the cs2cs-emulation keys are exempted, + * because the definition is on its way to the pipeline + * engine, which implements them. Everything else is judged + * exactly as on the single-projection path — including + * {@code +zone} and {@code +path}, whose verdict is + * {@code Proj4Parser}'s dispatch table and is therefore the + * same on both paths. + */ + private GieFailure classifyTokens(GieProjArgs a, List conditionals, + boolean forEmulationRoute) { + List tokens = a.tokens(); + for (int i = 0; i < tokens.size(); i++) { + GieToken t = tokens.get(i); + String key = t.key(); + + if (Proj4jCapabilities.INERT.contains(key)) { + t.markUsed(); + continue; + } + if (forEmulationRoute && Proj4jCapabilities.isEmulationKey(key)) { + continue; + } + if (Proj4jCapabilities.CONDITIONAL.contains(key)) { + t.markUsed(); + if ("zone".equals(key) || "path".equals(key)) { + // The two conditionals whose verdict needs the constructed + // projection: Proj4Parser applies +zone to the two transverse + // Mercator classes and no others, and +path to misrsom and + // nothing else (upstream som.cpp reads it for lsat too). + conditionals.add(t); + } else { + // Judged now, before construction, so that the reported reason + // is the primary one. Otherwise + // `+proj=latlong +nadgrids=ntf_r93.gsb` would be reported + // MISSING_GRID (Grid.fromNadGrids failing on a file we do not + // ship) when the real reason is that PROJ turns +nadgrids into + // a +proj=hgridshift step that proj4j's operation path has no + // notion of - a missing file would be the least of it. + GieFailure f = Proj4jCapabilities.conditionalFailure(key, t.value(), null); + if (f != null) { + return f; + } + } + continue; + } + if (!Proj4jCapabilities.HONOURED.contains(key)) { + return GieFailures.notImplemented( + "+" + key + (t.hasValue() ? "=" + t.value() : "") + + ": proj4j does not implement this parameter, and PROJ 9.8.1 " + + "would have acted on it, so executing without it would " + + "produce a wrong answer rather than a skip"); + } + t.markUsed(); + + // A boolean key whose value says false: Proj4Parser tests + // Map.containsKey, so it would switch the feature ON. + if (contains(ProjDefinitionValidator.BOOLEAN_KEYS, key) + && !ProjDefinitionValidator.projBooleanValue(t.value())) { + return GieFailures.notImplemented( + "+" + key + "=" + t.value() + " is PROJ-false, but Proj4Parser tests " + + "Map.containsKey and would enable the feature"); + } + + GieFailure grammar = Proj4jCapabilities.valueGrammarFailure(key, t.value()); + if (grammar != null) { + return grammar; + } + + if ("units".equals(key) && !ProjTables.proj4jResolvesUnit(t.value())) { + return GieFailures.notImplemented( + "+units=" + t.value() + " is a PROJ unit id that proj4j's Units table " + + "does not carry; Units.findUnits silently returns METRES for " + + "it, which would scale the result wrongly"); + } + } + return null; + } + + private static boolean contains(String[] haystack, String needle) { + for (int i = 0; i < haystack.length; i++) { + if (haystack[i].equals(needle)) { + return true; + } + } + return false; + } + + // ------------------------------------------------------- crs_src/crs_dst + + @Override + public GieOperation createCrsToCrs(String sourceCrs, String targetCrs) { + if (sourceCrs == null || sourceCrs.trim().isEmpty() + || targetCrs == null || targetCrs.trim().isEmpty()) { + return new UnusableOperation(GieFailures.invalidDefinition( + "crs_src/crs_dst pair is incomplete: " + sourceCrs + " -> " + targetCrs)); + } + String src = sourceCrs.trim(); + String dst = targetCrs.trim(); + + CoordinateReferenceSystem source; + CoordinateReferenceSystem target; + try { + source = createCrs(src); + } catch (Throwable e) { + GieFailure f = mapConstructionThrowable(e); + if (f == null) { + rethrow(e); + } + return new UnusableOperation(prefix(f, "crs_src " + src + ": ")); + } + try { + target = createCrs(dst); + } catch (Throwable e) { + GieFailure f = mapConstructionThrowable(e); + if (f == null) { + rethrow(e); + } + return new UnusableOperation(prefix(f, "crs_dst " + dst + ": ")); + } + if (source == null || target == null) { + return new UnusableOperation(GieFailures.notImplemented( + "proj4j resolved no CRS for " + (source == null ? src : dst))); + } + + CoordinateTransform forward; + CoordinateTransform inverse; + try { + forward = transformFactory.createTransform(source, target); + inverse = transformFactory.createTransform(target, source); + } catch (Throwable e) { + GieFailure f = mapConstructionThrowable(e); + if (f == null) { + rethrow(e); + } + return new UnusableOperation(prefix(f, src + " -> " + dst + ": ")); + } + + // proj_create_crs_to_crs ends a geographic side in a +proj=unitconvert to + // Degree, so that side's io units are DEGREES; a projected side is + // PROJECTED. proj4j's BasicCoordinateTransform matches: it takes and + // returns degrees for a geographic CRS. + GieIoUnits left = crsUnits(source); + GieIoUnits right = crsUnits(target); + return new CrsToCrsOperation(src, dst, forward, inverse, left, right); + } + + private CoordinateReferenceSystem createCrs(String spec) { + if (spec.startsWith("+") || spec.startsWith("proj=")) { + GieProjArgs a = GieProjArgs.parse(spec); + return crsFactory.createFromParameters(null, a.withImplicitDefaults().toProj4Args()); + } + return crsFactory.createFromName(spec); + } + + private static GieIoUnits crsUnits(CoordinateReferenceSystem crs) { + Projection p = crs.getProjection(); + if (p != null && ProjTables.ANGULAR_BOTH_SIDES.contains(p.getName())) { + return GieIoUnits.DEGREES; + } + return GieIoUnits.PROJECTED; + } + + private static GieFailure prefix(GieFailure f, String text) { + return GieFailures.of(f.kind(), text + f.message(), f.cause()); + } + + // ------------------------------------------------------ exception mapping + + /** + * Map a construction-time throwable to a failure kind. + * + *

{@code Proj4jException} is a {@code RuntimeException}, so + * {@code catch (Proj4jException)} is not enough: four routes escape it + * entirely, all confirmed in 1.4.3 and all reachable from corpus input. + * + *

    + *
  1. {@code NoSuchElementException}this branch is now dead and is kept + * only as a backstop. {@code Projection.setSouthernHemisphere} and + * {@code setHeightOfOrbit} used to throw a bare, message-less + * {@code NoSuchElementException} — unchecked, and not a + * {@code Proj4jException}, so it escaped every {@code catch (Proj4jException)} in + * the library. A behavioural sweep found 50 rows doing exactly that, in the 1.4.3 + * baseline and in the then-current build; because it was unchanged since + * 1.4.3, the differential golden regime could not see it at all. They now throw + * {@code UnsupportedParameterException}, handled above. Retained because a + * regression here must not go back to being invisible → + * {@link GieFailureKind#NOT_IMPLEMENTED}.
  2. + *
  3. a bare {@code new Error()} — {@code AxisOrder.fromString} throws + * it when {@code +axis} is not exactly 3 characters. Only an exactly- + * {@code java.lang.Error} instance is caught; a real + * {@code OutOfMemoryError} or {@code StackOverflowError} must never be + * swallowed, so anything else is rethrown.
  4. + *
  5. {@code IllegalStateException} — {@code GeocentricConverter} + * ({@code :122-125}) → {@link GieFailureKind#NUMERICAL}.
  6. + *
  7. {@code NumberFormatException} — historically raw from + * {@code Double.parseDouble}. proj4j now wraps most of these in + * {@code InvalidValueException}, but the mapping stays because + * {@code Integer.parseInt} on {@code +zone} and + * {@code PrimeMeridian.forName} can still surface it. PROJ's + * {@code pj_atof} never fails on garbage, so a parse failure is a + * narrower value grammar, not a bad definition → + * {@link GieFailureKind#NOT_IMPLEMENTED}.
  8. + *
+ * + * @return the failure, or {@code null} if the throwable must be rethrown. + */ + static GieFailure mapConstructionThrowable(Throwable e) { + if (e instanceof UnsupportedParameterException) { + // PROJ has no allow-list and never errors on an unrecognised key, so this can + // never be a statement about the definition - only about proj4j. That much is + // safe to assert. The *mechanism* is not: this exception now has at least three + // distinct sources, and all of them default to PROJECTION_NOT_IMPLEMENTED, so + // cause() cannot discriminate: + // + // Proj4Keyword:258 - the keyword allow-list rejected the key + // Projection:1018,:1035, - +south / +h reached a projection that does not + // :1140,:1168 override the setter (e.g. +proj=nsper +h=..., where + // PROJ *does* read +h, so ignoring it would return a + // plausible wrong coordinate from a default orbit) + // Registry:162,:170 - a name registered but deliberately not implemented + // + // This message used to hard-code the allow-list explanation, which became wrong + // for the Projection cases when they stopped throwing a bare + // NoSuchElementException. Misreporting the reason is the specific defect the + // error taxonomy exists to fix, so state only what is known and let the + // exception's own message supply the mechanism. + return GieFailures.of(GieFailureKind.NOT_IMPLEMENTED, + "proj4j refused a definition PROJ accepts (a proj4j gap, not a bad " + + "definition): " + e.getMessage(), e); + } + if (e instanceof ConvergenceFailureException) { + return GieFailures.of(GieFailureKind.NUMERICAL, describe(e), e); + } + if (e instanceof Proj4jException) { + String m = e.getMessage() == null ? "" : e.getMessage(); + if (m.startsWith("Unknown nadgrid")) { + return GieFailures.of(GieFailureKind.MISSING_GRID, describe(e), e); + } + // Everything else: the validator already established that PROJ + // accepts this definition, so proj4j refusing it is a gap. + return GieFailures.of(GieFailureKind.NOT_IMPLEMENTED, describe(e), e); + } + if (e instanceof NoSuchElementException) { + return GieFailures.of(GieFailureKind.NOT_IMPLEMENTED, + "proj4j's Projection base throws NoSuchElementException for this parameter " + + "(setSouthernHemisphere/setHeightOfOrbit are not overridden by " + + "this projection)", e); + } + if (e instanceof IllegalStateException) { + return GieFailures.of(GieFailureKind.NUMERICAL, describe(e), e); + } + if (e instanceof NumberFormatException) { + return GieFailures.of(GieFailureKind.NOT_IMPLEMENTED, + "proj4j's value grammar is narrower than PROJ's pj_atof: " + describe(e), e); + } + if (e instanceof IllegalArgumentException) { + // AxisOrder.Axis.fromChar for a character outside "ewnsud"; the + // validator normally catches that first. + return GieFailures.of(GieFailureKind.OTHER, describe(e), e); + } + if (e != null && e.getClass() == Error.class) { + return GieFailures.of(GieFailureKind.OTHER, + "proj4j threw a bare java.lang.Error (AxisOrder.fromString does this for an " + + "+axis value that is not exactly 3 characters)", e); + } + if (e instanceof RuntimeException) { + return GieFailures.of(GieFailureKind.OTHER, describe(e), e); + } + return null; + } + + /** + * Map a per-point throwable. Same routes as + * {@link #mapConstructionThrowable}, but a {@code ProjectionException} at this + * point means the coordinate was rejected, not the definition. + * + * @return the failure, or {@code null} if the throwable must be rethrown. + */ + static GieFailure mapTransformThrowable(Throwable e) { + if (e instanceof ConvergenceFailureException) { + return GieFailures.of(GieFailureKind.NUMERICAL, describe(e), e); + } + if (e instanceof ProjectionException) { + return GieFailures.of(GieFailureKind.COORD_OUT_OF_DOMAIN, describe(e), e); + } + if (e instanceof IllegalStateException) { + // GeocentricConverter.java:122-125 + return GieFailures.of(GieFailureKind.NUMERICAL, describe(e), e); + } + if (e instanceof InvalidValueException) { + // By this point the definition has already been built, so an + // InvalidValueException is about the coordinate, not the definition - + // e.g. ProjectionMath.normalizeLongitude rejecting a non-finite + // longitude. Note PROJ does NOT reject a NaN longitude: fwd_prepare + // tests for HUGE_VAL and its range checks are false for NaN, so NaN + // flows through and comes back out. This is therefore a real behaviour + // difference and the row should fail, not be skipped. + return GieFailures.of(GieFailureKind.INVALID_COORD, describe(e), e); + } + if (e instanceof Proj4jException) { + return GieFailures.of(GieFailureKind.OTHER, describe(e), e); + } + return mapConstructionThrowable(e); + } + + private static String describe(Throwable e) { + String m = e.getMessage(); + return e.getClass().getSimpleName() + (m == null || m.isEmpty() ? "" : ": " + m); + } + + private static void rethrow(Throwable e) { + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } + if (e instanceof Error) { + throw (Error) e; + } + throw new IllegalStateException("checked exception from proj4j", e); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jGieOperationFactoryTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jGieOperationFactoryTest.java new file mode 100644 index 0000000..1f00dc3 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/Proj4jGieOperationFactoryTest.java @@ -0,0 +1,712 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +class Proj4jGieOperationFactoryTest { + + /** PROJ's {@code PJ_TORAD}: {@code deg * M_PI / 180}, not {@code Math.toRadians}. */ + private static double toRad(double deg) { + return deg * Math.PI / 180.0; + } + + private GieOperationFactory factory; + + @BeforeEach + void setUp() { + factory = new Proj4jGieOperationFactory(); + } + + private GieOperation op(String args) { + return factory.create(args); + } + + private static void assertKind(GieFailureKind expected, GieOperation o) { + assertFalse(o.isUsable(), "expected unusable, got a usable operation: " + o); + assertNotNull(o.failure()); + assertEquals(expected, o.failure().kind(), + "wrong classification; message was: " + o.failure().message()); + } + + // ================================================== executing a real one + + @Test + @DisplayName("+proj=merc +ellps=GRS80 executes and matches builtins.gie:4262 to 50 nm") + void mercMatchesCorpusExpectation() { + // builtins.gie:4262 + // operation +proj=merc +ellps=GRS80 + // tolerance 50 nm + // accept 2 1 + // expect 222638.981586547 110579.965218249 + GieOperation o = op("proj=merc ellps=GRS80"); + assertTrue(o.isUsable(), o.failure() == null ? "" : o.failure().message()); + + // Every PROJ_HEAD projection is left=RADIANS, right=CLASSIC, which folds to + // PROJECTED - which is why this forward row is compared in metres. + assertEquals(GieIoUnits.RADIANS, o.leftUnits()); + assertEquals(GieIoUnits.CLASSIC, o.rightUnits()); + assertEquals(GieIoUnits.PROJECTED, + GieIoUnits.outputUnits(o.leftUnits(), o.rightUnits(), o.isInverted(), + GieDirection.FORWARD)); + + double[] out = o.transform(new double[] {toRad(2), toRad(1), 0, 0}, GieDirection.FORWARD); + assertNotNull(out, "merc must not fail on (2, 1)"); + double tolerance = 50e-9; + assertEquals(222638.981586547, out[0], tolerance); + assertEquals(110579.965218249, out[1], tolerance); + + // The inverse of the same row: right=CLASSIC means the input is metres. + double[] back = o.transform(new double[] {222638.981586547, 110579.965218249, 0, 0}, + GieDirection.INVERSE); + assertNotNull(back); + assertEquals(toRad(2), back[0], 1e-12); + assertEquals(toRad(1), back[1], 1e-12); + } + + @Test + @DisplayName("an ellipsoid-less operation still uses GRS80, per init.cpp's implicit append") + void implicitEllipsoidIsApplied() { + // Without the implicit +ellps=GRS80, DatumParameters leaves a and es NaN and + // this would come back as a NUMERICAL failure - scoring a parser gap as a + // numerical defect. + GieOperation bare = op("proj=merc"); + assertTrue(bare.isUsable(), bare.failure() == null ? "" : bare.failure().message()); + double[] out = bare.transform(new double[] {toRad(2), toRad(1), 0, 0}, + GieDirection.FORWARD); + assertNotNull(out, "the implicit ellipsoid must make this executable"); + assertEquals(222638.981586547, out[0], 50e-9); + assertEquals(110579.965218250, out[1], 50e-9); + } + + @Test + @DisplayName("+inv swaps both the unit sides and the direction actually run") + void inverseFlagSwapsBoth() { + GieOperation plain = op("proj=merc ellps=GRS80"); + GieOperation inv = op("proj=merc ellps=GRS80 inv"); + assertTrue(inv.isUsable()); + assertTrue(inv.isInverted()); + + // pj_right(P) with P->inverted reads P->left, i.e. RADIANS, so a forward run + // of an inverted operation is compared geodesically. + assertEquals(GieIoUnits.RADIANS, + GieIoUnits.outputUnits(inv.leftUnits(), inv.rightUnits(), true, + GieDirection.FORWARD)); + + // ...and proj_trans negates the direction, so "forward" on +inv actually + // runs the inverse. + double[] viaInv = inv.transform(new double[] {222638.981586547, 110579.965218249, 0, 0}, + GieDirection.FORWARD); + double[] viaPlain = plain.transform( + new double[] {222638.981586547, 110579.965218249, 0, 0}, GieDirection.INVERSE); + assertNotNull(viaInv); + assertNotNull(viaPlain); + assertEquals(viaPlain[0], viaInv[0], 0.0); + assertEquals(viaPlain[1], viaInv[1], 0.0); + } + + @Test + @DisplayName("+proj=longlat is RADIANS on both sides and does not emit degrees") + void longlatIsRadiansBothSides() { + GieOperation o = op("proj=longlat ellps=GRS80"); + assertTrue(o.isUsable(), o.failure() == null ? "" : o.failure().message()); + assertEquals(GieIoUnits.RADIANS, o.leftUnits()); + assertEquals(GieIoUnits.RADIANS, o.rightUnits()); + + double[] out = o.transform(new double[] {toRad(12), toRad(55), 0, 0}, GieDirection.FORWARD); + assertNotNull(out); + // LongLatProjection installs Units.DEGREES, so projectRadians would have + // returned degrees; the bridge converts back because PROJ's longlat is + // RADIANS on the right. + assertEquals(toRad(12), out[0], 1e-15); + assertEquals(toRad(55), out[1], 1e-15); + } + + // ============================================ the host-level fwd guard + + @Test + @DisplayName("|phi| beyond pi/2 + 1e-12 is INVALID_COORD, from fwd.cpp and not from merc") + void latitudeOverRangeIsInvalidCoord() { + GieOperation o = op("proj=merc ellps=GRS80"); + assertNull(o.transform(new double[] {0, toRad(91), 0, 0}, GieDirection.FORWARD)); + assertEquals(GieFailureKind.INVALID_COORD, o.lastFailure().kind()); + } + + @Test + @DisplayName("latitude within PJ_EPS_LAT of the pole is clamped, not rejected") + void latitudeWithinEpsilonIsClamped() { + GieOperation o = op("proj=laea ellps=GRS80"); + double[] out = o.transform(new double[] {0, Math.PI / 2 + 5e-13, 0, 0}, + GieDirection.FORWARD); + assertNotNull(out, "1e-12 rad of slop is clamped by fwd_prepare, not an error"); + } + + @Test + @DisplayName("longitude is bounded at 10 radians, not at 180 degrees") + void longitudeBoundIsTenRadians() { + GieOperation o = op("proj=merc ellps=GRS80"); + // 200 degrees is legal in PROJ - the bound is |lambda| > 10 rad (~573 deg). + assertNotNull(o.transform(new double[] {toRad(200), 0, 0, 0}, GieDirection.FORWARD), + "200 degrees must not be rejected; a [-180,180] check is stricter than PROJ"); + assertNull(o.transform(new double[] {11.0, 0, 0, 0}, GieDirection.FORWARD)); + assertEquals(GieFailureKind.INVALID_COORD, o.lastFailure().kind()); + } + + @Test + @DisplayName("NaN in, NaN out is a result, not a NUMERICAL failure") + void nanInNanOutIsAResult() { + // PROJ's documented behaviour: fwd_prepare tests for HUGE_VAL, not NaN, and + // its two range checks are both false for NaN, so a NaN coordinate flows + // through the projection and comes back out. more_builtins.gie:791 asserts + // exactly that. The bridge must therefore return the NaN rather than call it + // a numerical defect, or the comparator's NaN-both-sides branch (which + // scores d = 0) can never fire. + // + // Deliberately NOT the corpus row's own +proj=laea +lat_0=90: in proj4j + // today that combination returns (0.0, 0.0) from an all-NaN input - a + // failure dressed up as the false easting and northing. That is a core + // defect, outside this bridge's scope, and it must surface as a FAIL against + // the corpus's `expect NaN NaN NaN NaN` rather than be papered over here. + GieOperation o = op("proj=merc ellps=GRS80"); + assertTrue(o.isUsable(), o.failure() == null ? "" : o.failure().message()); + double[] out = o.transform(new double[] {Double.NaN, Double.NaN, Double.NaN, Double.NaN}, + GieDirection.FORWARD); + assertNotNull(out, "a NaN input must be allowed to produce a NaN output"); + assertTrue(Double.isNaN(out[0])); + assertTrue(Double.isNaN(out[1])); + assertNull(o.lastFailure()); + } + + @Test + @DisplayName("more_builtins.gie:791's own row is classified, not silently mis-answered") + void corpusNanRowWithLonZero() { + // The corpus row itself carries +lon_0=-150, and proj4j's + // ProjectionMath.normalizeLongitude - which projectRadians only calls when + // lon_0 != 0 - now rejects a non-finite longitude outright. PROJ does not. + // So this is a genuine behaviour difference; what matters here is that it + // surfaces as a classified per-point failure rather than as a plausible + // coordinate. + GieOperation o = op("proj=laea lat_0=90 lon_0=-150 datum=WGS84 units=m"); + assertTrue(o.isUsable(), o.failure() == null ? "" : o.failure().message()); + double[] out = o.transform(new double[] {Double.NaN, Double.NaN, Double.NaN, Double.NaN}, + GieDirection.FORWARD); + if (out == null) { + assertEquals(GieFailureKind.INVALID_COORD, o.lastFailure().kind(), + o.lastFailure().message()); + } else { + assertTrue(Double.isNaN(out[0])); + } + } + + @Test + @DisplayName("a NaN produced from finite input IS a NUMERICAL failure") + void nanFromFiniteInputIsNumerical() { + // The 62 enumerated sites where proj4j returns NaN silently. Any projection + // reachable here will do; what is asserted is the shape of the outcome, not + // which projection exhibits it. + GieOperation o = op("proj=merc ellps=GRS80"); + double[] out = o.transform(new double[] {0, 0, 0, 0}, GieDirection.FORWARD); + assertNotNull(out, "the control case must succeed"); + // Feed the inverse a value no Mercator northing can produce. + GieOperation stere = op("proj=stere ellps=GRS80 lat_0=90"); + double[] bad = stere.transform(new double[] {1e300, 1e300, 0, 0}, GieDirection.INVERSE); + if (bad == null) { + assertNotNull(stere.lastFailure()); + assertTrue(stere.lastFailure().kind() == GieFailureKind.NUMERICAL + || stere.lastFailure().kind() == GieFailureKind.COORD_OUT_OF_DOMAIN, + "got " + stere.lastFailure()); + } + } + + // ================================== INVALID_DEFINITION: PROJ's verdict + + @Test + @DisplayName("builtins.gie:3637 `+proj=laea +ellps=GRS80 +lat_0=91` is INVALID_DEFINITION") + void corpusLatZeroNinetyOneIsInvalidDefinition() { + // The corpus asserts `expect failure errno invalid_op_illegal_arg_value`. + // PROJ rejects |lat_0| > 90 in init.cpp, so this is a statement about the + // definition, not about proj4j. + GieOperation o = op("proj=laea ellps=GRS80 lat_0=91"); + assertKind(GieFailureKind.INVALID_DEFINITION, o); + assertTrue(o.failure().message().contains("lat_0"), o.failure().message()); + } + + @Test + @DisplayName("more_builtins.gie:821 `+proj=aeqd +R=1 +lat_0=91` is INVALID_DEFINITION") + void corpusAeqdLatZeroNinetyOneIsInvalidDefinition() { + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=aeqd R=1 lat_0=91")); + } + + @Test + @DisplayName("more_builtins.gie:227 nested pipeline is INVALID_DEFINITION, not NOT_IMPLEMENTED") + void corpusNestedPipelineIsInvalidDefinition() { + // `expect failure pjd_err_malformed_pipeline`. A pipeline we cannot run is + // NOT_IMPLEMENTED, but a pipeline PROJ itself rejects is + // INVALID_DEFINITION - and PROJ's verdict wins. + GieOperation o = op("proj=pipeline step proj=pipeline step proj=merc"); + assertKind(GieFailureKind.INVALID_DEFINITION, o); + assertTrue(o.failure().message().contains("nested pipeline"), o.failure().message()); + } + + @Test + @DisplayName("more_builtins.gie:235 `+proj=pipeline` with no steps is INVALID_DEFINITION") + void corpusEmptyPipelineIsInvalidDefinition() { + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=pipeline")); + } + + @Test + @DisplayName("an operator PROJ itself does not know is INVALID_DEFINITION") + void unknownToProjIsInvalidDefinition() { + // The decidability that makes `expect failure` meaningful: unknown to + // PROJ's own 186-name table means upstream errors too. + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=not_a_projection")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("ellps=GRS80")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=")); + } + + @Test + @DisplayName("bad values of recognised keys are INVALID_DEFINITION") + void badValuesAreInvalidDefinition() { + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 k_0=0")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 k=-1")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 units=furlong")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 to_meter=0")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 axis=en")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 axis=enq")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=nonexistent")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc datum=nonexistent")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc a=6400000 es=1.5")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc a=6400000 rf=-1")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 towgs84=1,2")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 zone=32a")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc ellps=GRS80 south=maybe")); + // +no_defs with nothing to size the ellipsoid: verified against the + // installed 9.8.1, which fails with "Must specify ellipsoid or sphere". + assertKind(GieFailureKind.INVALID_DEFINITION, op("proj=merc no_defs")); + } + + @Test + @DisplayName("+ellps plus a shape parameter is NOT rejected - PROJ treats it as a modifier") + void ellpsPlusShapeIsNotAContradiction() { + // ell_set.cpp's own comment: later shape and size parameters are taken into + // account as modifiers for the built-in definition. Rejecting this would be + // stricter than PROJ. + GieOperation o = op("proj=merc ellps=GRS80 rf=300"); + if (!o.isUsable()) { + assertEquals(GieFailureKind.NOT_IMPLEMENTED, o.failure().kind(), + "may be unimplemented, but must never be INVALID_DEFINITION: " + + o.failure().message()); + } + } + + // ==================================== NOT_IMPLEMENTED: proj4j's gaps + + @Test + @DisplayName("+proj=pipeline is executed, not classified") + void pipelineIsExecutable() { + // 75 of the corpus's 780 operations, plus every GIGS file. This assertion + // used to read NOT_IMPLEMENTED; org.locationtech.proj4j.pipeline is why it + // no longer does. See PipelineGieOperationTest for the behavioural coverage. + GieOperation o = op("proj=pipeline step proj=axisswap order=2,1 step proj=merc ellps=GRS80"); + assertTrue(o.isUsable(), () -> "expected usable, got " + o.failure()); + // axisswap declares WHATEVER on both sides and adopts its neighbour's units. + assertEquals(GieIoUnits.RADIANS, o.leftUnits()); + assertEquals(GieIoUnits.PROJECTED, o.rightUnits()); + } + + @Test + @DisplayName("more_builtins.gie:535's implicit pipeline is executed") + void implicitPipelineIsExecutable() { + // `+step +proj=latlong +ellps=WGS84` has no global +proj, and would fail + // pj_init outright, because pj_param_exists stops at the first `step`. But + // proj_create routes a proj-string through PROJStringParser, which reads a + // lone +step as a one-step pipeline - and the corpus asserts a real + // coordinate for it (expect -64.737589 17.546000). Classifying it at all + // would make an operation PROJ runs look like one PROJ cannot, which is the + // exact failure mode that renders `expect failure` rows meaningless. + GieOperation o = op("step proj=latlong ellps=WGS84"); + assertTrue(o.isUsable(), () -> "expected usable, got " + o.failure()); + assertEquals(GieIoUnits.RADIANS, o.leftUnits()); + assertEquals(GieIoUnits.RADIANS, o.rightUnits()); + } + + @Test + @DisplayName("+nadgrids now routes to the hgridshift helper instead of being refused") + void nadgridsRoutesToTheHiddenHgridshift() { + // 4D-API_cs2cs-style.gie:58, and the inverse of what this test used to assert. + // The old reason was correct and is worth keeping on the record: left to + // construction the failure came back MISSING_GRID from Grid.fromNadGrids, which + // was true but secondary, because even with the grid present the + // single-projection path applies no shift at all - PROJ implements +nadgrids as + // an inserted +proj=hgridshift step. pipeline/Cs2csOperator now builds that step, + // and Proj4jCapabilities.requiresCs2csEmulation routes the definition to it. + GieOperation o = op("proj=latlong nadgrids=ntf_r93.gsb ellps=GRS80"); + assertTrue(o.isUsable(), () -> "expected usable, got " + o.failure()); + assertEquals(GieIoUnits.RADIANS, o.leftUnits()); + assertEquals(GieIoUnits.RADIANS, o.rightUnits()); + } + + @Test + @DisplayName("a required +nadgrids that does not resolve is still fatal, and says so") + void aRequiredMissingNadgridIsStillRefused() { + // Non-negotiable: routing must not turn a missing grid into a silent no-op that + // reports success. Only an @-prefixed token may be skipped, and that is PROJ's + // own behaviour. + GieOperation o = op("proj=latlong nadgrids=nosuchgrid.gsb ellps=GRS80"); + assertFalse(o.isUsable(), () -> "a required missing grid must not be executable"); + assertTrue(o.failure().message().contains("nosuchgrid.gsb"), o.failure().message()); + } + + @Test + @DisplayName("a PROJ operator absent from proj4j's Registry is NOT_IMPLEMENTED") + void unregisteredOperatorIsNotImplemented() { + // INVERTED for three of these. axisswap, unitconvert and cart are conversions that + // live in the pipeline engine, not in Registry, and the factory now routes a BARE + // `+proj=` there. Before that, axisswap.gie sat at 2/27 and + // unitconvert.gie at 0/16 with BOTH operators complete and passing their own unit + // tests - every failure was the routing, not the operator. Asserting + // NOT_IMPLEMENTED here would re-pin that. + assertTrue(op("proj=axisswap axis=neu").isUsable(), "axisswap routes to the pipeline engine"); + assertTrue(op("proj=unitconvert xy_in=m xy_out=km").isUsable(), "unitconvert likewise"); + assertTrue(op("proj=cart ellps=GRS80").isUsable(), "cart likewise"); + assertKind(GieFailureKind.NOT_IMPLEMENTED, op("proj=helmert x=1")); + } + + @Test + @DisplayName("alsk/apian/bacon are NOT_IMPLEMENTED and print nothing to stderr") + void abstractRegistrationsAreSilentlyNotImplemented() throws UnsupportedEncodingException { + // Registry registers these three against the ABSTRACT Projection class, so + // Registry.getProjection catches the InstantiationException, prints a stack + // trace to System.err and returns null. Three stack traces per corpus sweep + // makes a conformance run look broken, so the probe suppresses them. + PrintStream saved = System.err; + ByteArrayOutputStream captured = new ByteArrayOutputStream(); + try { + System.setErr(new PrintStream(captured, true, "UTF-8")); + // INVERTED. All three were bound to the ABSTRACT Projection class and were + // therefore uninstantiable; alsk alone was 16 silently-wrong builtins.gie + // assertions. apian/bacon are now real implementations (bacon.cpp) and alsk + // came with the mod_ster port, so they must RESOLVE. The stderr assertion + // below is the part still worth keeping: Registry must never print. + String[] names = {"alsk", "apian", "bacon"}; + for (int i = 0; i < names.length; i++) { + GieOperation o = factory.create("proj=" + names[i]); + assertTrue(o.isUsable(), names[i] + " is implemented now and must resolve"); + } + } finally { + System.setErr(saved); + } + assertEquals("", captured.toString("UTF-8"), + "probing an abstract registration must not leak a stack trace to stderr"); + } + + @Test + @DisplayName("a parameter PROJ acts on but proj4j has no notion of is NOT_IMPLEMENTED" + + " (+lon_wrap); +approx, +geoidgrids, +W and +over are no longer such parameters") + void unimplementedParameterIsNotImplemented() { + // INVERTED. +approx selects tmerc's Evenden/Snyder series (builtins.gie:7245), and + // it is now registered, dispatched and honoured - it HAS to be, because PROJ 9.8.1 + // ships Poder/Engsager as the default and proj4j now matches, so +approx is the + // only way to ask for the previous behaviour. The movement it guards is unbounded: + // 0.83 mm at 6 deg from the central meridian, 4 m at 20 deg, kilometres beyond 45. + GieOperation approx = op("proj=tmerc a=6400000 rf=1e12 k=0.9 lat_0=40 approx"); + assertTrue(approx.isUsable(), "+approx is honoured now"); + + // INVERTED, and the check that justifies it is the one the standing rule names: + // registering a key with no dispatch is the dangerous direction, so the question is not + // "is +W in HONOURED" but "does Proj4Parser reach every operator that reads it". + // Enumerated at the source rather than from the docs - + // git grep -nE '"[a-z]W"' 9.8.1 -- src/ + // - and upstream reads +W in exactly two places: hammer.cpp:63-64 and lagrng.cpp:79-80. + // (A grep for '"W"' returns ZERO: PROJ spells the key with a pj_param sigil, "tW"/"dW".) + // Proj4Parser.java:467-476 dispatches to LagrangeProjection.setW AND + // HammerProjection.setW, and Registry.java:355,377 registers both classes - so the set of + // registered readers equals the set of upstream readers, with nothing dropped. + // + // On +proj=merc specifically, neither PROJ nor proj4j reads +W at all, so the two agree + // by doing the same nothing. That is an honest usable operation, not a silent gap. + assertTrue(op("proj=merc ellps=GRS80 W=2").isUsable(), + "+W is registered AND dispatched to both of its upstream readers now"); + // INVERTED. +geoidgrids now becomes a real auto-inserted +proj=vgridshift step + // (4D-API_cs2cs-style.gie:104), built where create.cpp:88-105 builds it, with the + // GTX reader behind it verified against cct 9.8.1 at 14 points to 12 decimals. + assertTrue(op("proj=longlat geoidgrids=egm96_15.gtx axis=neu ellps=GRS80").isUsable(), + "+geoidgrids is an auto-inserted vgridshift step now"); + // INVERTED, judged on its own evidence and not swept along with +W above. +over is + // global in PROJ - init.cpp:601 reads "bover" into P->over, and the flag is consumed at + // exactly three sites, all of them a suppressed adjlon: fwd.cpp:84-85 and :111-112, and + // inv.cpp:116-117. proj4j now covers all three: Proj4Parser.java:278-279 dispatches to + // Projection.setOver, Projection.java:443 guards the forward wrap (proj4j has one forward + // funnel where fwd_prepare has two) and Projection.java:678 guards the inverse one. Base + // class, base funnels - so it is honoured for every projection, as upstream's is. + assertTrue(op("proj=merc ellps=GRS80 over").isUsable(), + "+over is dispatched to Projection.setOver and guards both funnels now"); + // STILL CORRECT, and left alone. +lon_wrap is NOT in HONOURED, and PROJ genuinely acts + // on it (fwd.cpp:165, adjlon(lam - P->long_wrap_center)) where proj4j has no notion of a + // wrap centre at all. Honest NOT_IMPLEMENTED. + assertKind(GieFailureKind.NOT_IMPLEMENTED, op("proj=merc ellps=GRS80 lon_wrap=0")); + } + + @Test + @DisplayName("a parameter proj4j accepts but silently ignores is NOT_IMPLEMENTED, never executed") + void acceptedButIgnoredParametersAreNotImplemented() { + // +zone on a projection that is not a transverse Mercator: Proj4Parser drops it, + // PROJ acts on it, and no rerouting helps because the gap is the dispatch table + // and not the path. This is the case the rule exists for. + assertKind(GieFailureKind.NOT_IMPLEMENTED, op("proj=merc ellps=GRS80 zone=32")); + } + + @Test + @DisplayName("+axis and +pm are no longer refused: they route to the emulation helpers") + void emulationKeysRouteRatherThanRefuse() { + // Both used to be asserted NOT_IMPLEMENTED here, and the reason given was right: + // they are in Proj4Keyword's allow-list and are read by Proj4Parser, yet have no + // effect on Projection.projectRadians, so executing on that path would have + // produced a wrong number that looks like a pass. The fix was not to execute them + // there but to send them somewhere that implements them - PROJ turns each into a + // hidden sub-operation (+proj=axisswap, and from_greenwich in fwd_prepare), and + // pipeline/Cs2csOperator builds both. + assertTrue(op("proj=merc ellps=GRS80 axis=neu").isUsable()); + // builtins.gie:3351 - krovak with the Ferro prime meridian. + assertTrue(op("proj=krovak lat_0=49.5 lon_0=42.5 k=0.9999 x_0=0 y_0=0 ellps=bessel " + + "pm=ferro").isUsable()); + } + + @Test + @DisplayName("+axis=enu and +pm=greenwich are honoured, because they are the defaults") + void identityValuedConditionalsAreHonoured() { + assertTrue(op("proj=merc ellps=GRS80 axis=enu").isUsable()); + assertTrue(op("proj=merc ellps=GRS80 pm=greenwich").isUsable()); + assertTrue(op("proj=merc ellps=GRS80 pm=0").isUsable()); + } + + @Test + @DisplayName("+zone IS honoured on utm and tmerc") + void zoneHonouredOnTransverseMercator() { + assertTrue(op("proj=utm zone=32 ellps=GRS80").isUsable()); + assertTrue(op("proj=tmerc zone=32 ellps=GRS80").isUsable()); + } + + @Test + @DisplayName("a datum shift is inert when null and routed to the helper when not") + void datumShiftsAreRoutedRatherThanRefused() { + // A null shift stays on the single-projection path, which is the whole point of + // asking conditionalFailure per token *at its value*: no definition that used to + // pass can change route. + assertTrue(op("proj=merc ellps=GRS80 towgs84=0,0,0").isUsable()); + assertTrue(op("proj=merc datum=WGS84").isUsable()); + assertTrue(op("proj=merc datum=NAD83").isUsable()); + // A real shift is now built rather than refused - a Helmert plus the cart round + // trip for +towgs84, an hgridshift for the two grid-shift datums and for an + // explicit +nadgrids. + assertTrue(op("proj=merc ellps=GRS80 towgs84=1,2,3").isUsable()); + assertTrue(op("proj=merc datum=NAD27").isUsable()); + assertTrue(op("proj=merc datum=potsdam").isUsable()); + assertTrue(op("proj=merc ellps=GRS80 nadgrids=@conus").isUsable()); + // An unknown datum is still an error, and it is PROJ's error too + // ("Unknown value for datum", datum_set.cpp:76). + assertFalse(op("proj=merc datum=nosuchdatum").isUsable()); + } + + @Test + @DisplayName("rerouting does not smuggle an unhonoured token past the token check") + void anUnhonouredTokenStillFailsOnTheEmulationRoute() { + // Cs2csOperator parses in ParseMode.PROJ_COMPATIBLE, which retains and IGNORES a + // key outside the allow-list rather than refusing it. So the token check has to + // run before routing, or a definition combining an emulation key with a key + // proj4j drops would be executed and answer plausibly and wrongly. + assertKind(GieFailureKind.NOT_IMPLEMENTED, + op("proj=merc ellps=GRS80 towgs84=1,2,3 no_such_key=1")); + // ...and the projection-dependent conditionals are still judged: +zone on merc is + // dropped by Proj4Parser on both paths. + assertKind(GieFailureKind.NOT_IMPLEMENTED, + op("proj=merc ellps=GRS80 towgs84=1,2,3 zone=32")); + } + + @Test + @DisplayName("a value grammar PROJ has and proj4j lacks is NOT_IMPLEMENTED, not a wrong answer") + void narrowerValueGrammarIsNotImplemented() { + // PROJ's +to_meter accepts a num/den ratio; proj4j's Double.parseDouble + // would read "1/0.3048" as 1 and scale the whole projection by 1 metre per + // unit instead of 3.28. + GieOperation ratio = op("proj=merc ellps=GRS80 to_meter=1/0.3048"); + assertKind(GieFailureKind.NOT_IMPLEMENTED, ratio); + assertTrue(ratio.failure().message().contains("ratio"), ratio.failure().message()); + } + + @Test + @DisplayName("a PROJ unit id proj4j's Units table lacks is NOT_IMPLEMENTED, not silently metres") + void unresolvableUnitIsNotImplemented() { + // Units.findUnits returns METRES for ANY unknown name rather than null, so a + // PROJ unit id proj4j's table lacks would silently scale by 1 instead of + // failing - e.g. +units=fath would be out by 1.8288x, which looks like a + // pass on a loose-tolerance row. + // INVERTED. All seven missing linear units (fath ch link us-ch ind-yd ind-ft ind-ch) + // were added to core's Units table, so these now resolve. The DANGER the comment + // above describes is still real and still worth guarding - Units.findUnits returns + // METRES for any unknown name - which is why ProjTablesTest now asserts proj4j + // resolves all 21 linear ids PROJ accepts, and why the +units gap check is retained + // rather than deleted: PROJ gaining a unit must surface as a classified gap, never + // as a silent 1x scale. + assertTrue(op("proj=merc ellps=GRS80 units=fath").isUsable(), "fath resolves now"); + assertTrue(op("proj=merc ellps=GRS80 units=ind-yd").isUsable(), "ind-yd resolves now"); + assertTrue(op("proj=merc ellps=GRS80 units=link").isUsable(), "link resolves now"); + // ...but the ones it really has are fine. + assertTrue(op("proj=merc ellps=GRS80 units=m").isUsable()); + assertTrue(op("proj=merc ellps=GRS80 units=us-ft").isUsable()); + assertTrue(op("proj=merc ellps=GRS80 units=km").isUsable()); + } + + @Test + @DisplayName("nkg.gie's OGC URN operations are NOT_IMPLEMENTED, not malformed") + void ogcUrnIsNotImplemented() { + // All 26 operations in nkg.gie are OGC URNs. proj_create() resolves them + // through proj.db, so they are perfectly valid upstream and must not be + // classified INVALID_DEFINITION - that would make an `expect failure` row + // pass for entirely the wrong reason. + GieOperation o = op("urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_DK"); + assertKind(GieFailureKind.NOT_IMPLEMENTED, o); + assertTrue(o.failure().message().contains("proj.db"), o.failure().message()); + assertKind(GieFailureKind.NOT_IMPLEMENTED, op("EPSG:4326")); + assertKind(GieFailureKind.NOT_IMPLEMENTED, + op("PROJCRS[\"foo\",BASEGEOGCRS[\"bar\"]]")); + } + + @Test + @DisplayName("ellipsoid.gie:73-76 - a bare word and an empty definition ARE malformed") + void bogusDefinitionsAreInvalidDefinition() { + // Both carry `expect failure` in the corpus, and neither is a database + // identifier - so unlike the URNs above, INVALID_DEFINITION is right. + assertKind(GieFailureKind.INVALID_DEFINITION, op("cobra")); + assertKind(GieFailureKind.INVALID_DEFINITION, op("")); + // 4D-API_cs2cs-style.gie:539, `errno invalid_op_wrong_syntax` + assertKind(GieFailureKind.INVALID_DEFINITION, + op("this is a bogus CRS meant to trigger a syntax error in proj_create()")); + } + + @Test + @DisplayName("a PROJ-false boolean is NOT_IMPLEMENTED, because containsKey would enable it") + void projFalseBooleanIsNotImplemented() { + GieOperation o = op("proj=utm zone=32 ellps=GRS80 south=F"); + assertKind(GieFailureKind.NOT_IMPLEMENTED, o); + assertTrue(o.failure().message().contains("containsKey"), o.failure().message()); + } + + @Test + @DisplayName("+south on a projection that does not implement it is NOT_IMPLEMENTED, not an escape") + void southOnUnsupportedProjectionIsCaught() { + // Projection.setSouthernHemisphere throws NoSuchElementException, which is + // not a Proj4jException and would otherwise escape the runner entirely. + GieOperation o = op("proj=merc ellps=GRS80 south"); + if (!o.isUsable()) { + assertEquals(GieFailureKind.NOT_IMPLEMENTED, o.failure().kind(), + o.failure().message()); + } + } + + // ============================================================ contract + + @Test + @DisplayName("the factory never throws, whatever it is handed") + void factoryNeverThrows() { + String[] hostile = { + null, "", " ", "=", "==", "+", "++", "proj", "proj=", "=merc", + "proj=merc lat_0=", "proj=merc lat_0=abc", "proj=merc a=", + "proj=merc towgs84=", "proj=merc axis=", "step", "step step", + "proj=merc ", "proj=merc ellps=", "proj=merc units=", + "proj=merc pm=", "proj=merc zone=", "proj=merc R=", + }; + for (int i = 0; i < hostile.length; i++) { + GieOperation o = factory.create(hostile[i]); + assertNotNull(o, "create(" + hostile[i] + ") returned null"); + if (!o.isUsable()) { + assertNotNull(o.failure(), "unusable without a failure: " + hostile[i]); + assertNotNull(o.failure().message()); + assertFalse(o.failure().message().isEmpty()); + } + } + } + + @Test + @DisplayName("an unusable operation's transform always returns null, never a coordinate") + void unusableTransformReturnsNull() { + // `+proj=pipeline` with no `+step` at all: malformed upstream too, so this + // stays unusable now that ordinary pipelines execute. + GieOperation o = op("proj=pipeline"); + assertFalse(o.isUsable()); + assertNull(o.transform(new double[] {0, 0, 0, 0}, GieDirection.FORWARD)); + assertNull(o.transform(new double[] {0, 0, 0, 0}, GieDirection.INVERSE)); + assertNotNull(o.lastFailure()); + } + + @Test + @DisplayName("crsDstIsLatLonOrYX is the documented false, on both operation kinds") + void crsDstIsLatLonOrYXIsAlwaysFalse() { + assertFalse(op("proj=merc ellps=GRS80").crsDstIsLatLonOrYX()); + assertFalse(factory.createCrsToCrs("EPSG:4326", "EPSG:3857").crsDstIsLatLonOrYX()); + } + + // ====================================================== crs_src/crs_dst + + @Test + @DisplayName("a crs_src/crs_dst pair reports DEGREES on a geographic side") + void crsToCrsUnits() { + GieOperation o = factory.createCrsToCrs("EPSG:4326", "EPSG:3857"); + if (o.isUsable()) { + assertEquals(GieIoUnits.DEGREES, o.leftUnits(), + "proj_create_crs_to_crs ends a geographic side in a unitconvert to Degree"); + assertEquals(GieIoUnits.PROJECTED, o.rightUnits()); + } + } + + @Test + @DisplayName("epsg_no_grid.gie:12 EPSG:4258 -> EPSG:25832 either runs or is classified") + void crsToCrsCorpusPair() { + GieOperation o = factory.createCrsToCrs("EPSG:4258", "EPSG:25832"); + if (o.isUsable()) { + double[] out = o.transform(new double[] {12, 55, 0, 0}, GieDirection.FORWARD); + assertNotNull(out); + assertTrue(out[0] > 600000 && out[0] < 800000, "easting was " + out[0]); + assertTrue(out[1] > 6000000 && out[1] < 6200000, "northing was " + out[1]); + } else { + assertNotNull(o.failure().message()); + } + } + + @Test + @DisplayName("an incomplete or unresolvable crs pair is classified, not thrown") + void crsToCrsDegenerate() { + assertKind(GieFailureKind.INVALID_DEFINITION, factory.createCrsToCrs(null, "EPSG:4326")); + assertKind(GieFailureKind.INVALID_DEFINITION, factory.createCrsToCrs("EPSG:4326", "")); + GieOperation o = factory.createCrsToCrs("EPSG:999999", "EPSG:4326"); + assertFalse(o.isUsable()); + assertNotNull(o.failure().message()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjDefinitionValidator.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjDefinitionValidator.java new file mode 100644 index 0000000..a868bb9 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjDefinitionValidator.java @@ -0,0 +1,550 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import java.util.List; + +import org.locationtech.proj4j.conformance.parse.ProjDmsToR; +import org.locationtech.proj4j.conformance.parse.ProjStrtod; + +/** + * Decides whether PROJ 9.8.1 itself would reject a definition. + * + *

This class is the load-bearing half of the {@link GieFailureKind#INVALID_DEFINITION} + * versus {@link GieFailureKind#NOT_IMPLEMENTED} split. It knows nothing about + * proj4j's capabilities and must not: its only question is "does upstream error + * here?", because that is what gie's {@code expect failure} rows assert. + * + *

The checks are the complete set reachable from PROJ's global parsing + * ({@code src/init.cpp}, {@code src/param.cpp}, {@code src/ell_set.cpp}, + * {@code src/datum_set.cpp}, {@code src/pipeline.cpp}): + * + *

    + *
  • missing, empty or unknown {@code +proj}; nested pipelines;
  • + *
  • {@code |lat_0| > 90}; {@code k}/{@code k_0 <= 0};
  • + *
  • unknown {@code +units}/{@code +vunits}; {@code to_meter}/{@code vto_meter} + * non-positive or with a zero denominator;
  • + *
  • unknown or unparseable {@code +pm};
  • + *
  • {@code +axis} not exactly 3 characters, or containing a character outside + * {@code ewnsud};
  • + *
  • {@code |lon_wrap| >= 20*pi} or NaN;
  • + *
  • unknown {@code +datum}; unknown {@code +ellps};
  • + *
  • ellipsoid errors: {@code a <= 0}, {@code rf <= 0}, {@code f < 0}, + * {@code es}/{@code e} outside {@code [0,1)}, {@code b <= 0};
  • + *
  • {@code +towgs84} with a count other than 3 or 7;
  • + *
  • {@code pj_param} type {@code i} on a value containing a non-digit, and type + * {@code b} on anything but empty/{@code t}/{@code T}/{@code f}/{@code F};
  • + *
  • {@code +no_defs} with no ellipsoid size at all — verified against the + * installed 9.8.1: {@code proj +proj=merc +no_defs} fails with + * {@code "Must specify ellipsoid or sphere"} (error 1026);
  • + *
  • a resolved flattening outside {@code [0,1)}, which {@code ellps_shape}'s own + * bounds do not catch — {@code +f=1}, {@code +rf=0.5} and {@code +a=1 +b=2} all + * pass it and are rejected by {@code pj_calc_ellipsoid_params} + * ({@code ell_set.cpp:598-600}) instead.
  • + *
+ * + *

Beyond global parsing, {@link ProjOperatorSetup} adds the per-operator + * construction guards — {@code lcc}'s parallels, {@code helmert}'s + * {@code +convention}, {@code nsper}'s {@code +h}, and eighteen more — each + * transcribed from that operator's own setup function at rev {@code 9.8.1} and each + * probed against the installed binary in both directions. + * + *

Two things this deliberately does not do, because both would be + * stricter than PROJ and would wrongly convert passes into + * {@code INVALID_DEFINITION}: + * + *

    + *
  1. It does not treat {@code +ellps} plus a shape parameter as a contradiction. + * {@code ell_set.cpp}'s own comment says later shape and size parameters are + * deliberately modifiers for a built-in ellipsoid, citing + * {@code +ellps=xxx +a=1} as the intended use. So {@code +ellps=GRS80 +rf=300} + * is valid and yields {@code f = 1/300}.
  2. + *
  3. It does not reject longitudes outside {@code [-180,180]}. PROJ's bound is + * {@code |lambda| > 10} radians, about +/-573 degrees, and anything + * inside is wrapped.
  4. + *
+ */ +final class ProjDefinitionValidator { + + private static final double HALF_PI = Math.PI / 2.0; + private static final double LON_WRAP_LIMIT = 10.0 * 2.0 * Math.PI; + private static final String AXIS_CHARS = "ewnsud"; + + private ProjDefinitionValidator() { + } + + /** + * @return an {@link GieFailureKind#INVALID_DEFINITION} failure if PROJ 9.8.1 + * would reject {@code a}, otherwise {@code null}. + */ + static GieFailure validate(GieProjArgs a) { + GieFailure f; + if (a.isPipeline()) { + // Structure is the ONLY thing checked for a pipeline, and in + // particular {@link #validateProjName} is deliberately not run. + // + // A definition may begin with a bare `+step` and have no global + // `+proj` at all - more_builtins.gie:535 is + // `+step +proj=latlong +ellps=WGS84`, and the corpus asserts a real + // coordinate for it, not a failure. Confirmed against the installed + // 9.8.1: `projinfo "+step +proj=latlong +ellps=WGS84"` resolves it to + // `+proj=latlong +ellps=WGS84`. So an implicit pipeline is valid + // upstream and must be reported NOT_IMPLEMENTED (we have no pipeline + // engine), never INVALID_DEFINITION. + // + // The per-step operator parameters are also left alone: they belong to + // operators we have not implemented, so validating them would be + // inventing upstream behaviour rather than reproducing it. + return validatePipelineStructure(a); + } + f = validateProjName(a); + if (f != null) { + return f; + } + f = validateEllipsoid(a); + if (f != null) { + return f; + } + f = validateFrame(a); + if (f != null) { + return f; + } + f = validateDatum(a); + if (f != null) { + return f; + } + return ProjOperatorSetup.validate(a); + } + + // ---------------------------------------------------------------- +proj + + private static GieFailure validateProjName(GieProjArgs a) { + GieToken proj = a.find("proj"); + if (proj == null) { + return GieFailures.invalidDefinition( + "no +proj: PROJ 9.8.1 fails with \"Missing argument\" (proj_errno 1026)"); + } + String name = proj.value(); + if (name == null || name.isEmpty()) { + return GieFailures.invalidDefinition("+proj= is empty"); + } + if (!ProjTables.isProjOperator(name)) { + return GieFailures.invalidDefinition( + "+proj=" + name + " is not one of PROJ 9.8.1's " + ProjTables.OPERATORS.size() + + " operators, so PROJ rejects this definition too"); + } + return null; + } + + private static GieFailure validatePipelineStructure(GieProjArgs a) { + List steps = a.steps(); + if (steps.size() < 2) { + // more_builtins.gie:235 - "operation proj=pipeline" alone, which + // gie asserts fails with pjd_err_malformed_pipeline. + return GieFailures.invalidDefinition( + "+proj=pipeline with no +step: PROJ 9.8.1 reports a malformed pipeline"); + } + // steps.get(0) is the global scope, which carries +proj=pipeline itself. + for (int i = 1; i < steps.size(); i++) { + GieProjArgs step = steps.get(i); + String name = step.peek("proj"); + if (name == null) { + if (step.contains("init")) { + // +init= expands to a whole definition; PROJ accepts it. + continue; + } + return GieFailures.invalidDefinition( + "pipeline step " + i + " has no +proj"); + } + if ("pipeline".equals(name)) { + return GieFailures.invalidDefinition( + "nested pipeline at step " + i + ": PROJ 9.8.1 rejects this"); + } + if (!ProjTables.isProjOperator(name)) { + return GieFailures.invalidDefinition( + "pipeline step " + i + " uses +proj=" + name + + ", not a PROJ 9.8.1 operator"); + } + } + return null; + } + + // ------------------------------------------------------------- ellipsoid + + private static GieFailure validateEllipsoid(GieProjArgs a) { + String ellps = a.peek("ellps"); + if (ellps != null && !ProjTables.ELLIPSOIDS.contains(ellps)) { + return GieFailures.invalidDefinition( + "+ellps=" + ellps + " is not one of PROJ 9.8.1's " + + ProjTables.ELLIPSOIDS.size() + " built-in ellipsoids"); + } + + // +R short-circuits every shape and spherification parameter + // (ell_set.cpp:92-133), so nothing after it can be invalid. + if (a.contains("R")) { + Double r = projDouble(a.peek("R")); + if (r != null && !(r.doubleValue() > 0)) { + return GieFailures.invalidDefinition("+R=" + a.peek("R") + " must be > 0"); + } + return null; + } + + if (a.contains("a")) { + Double v = projDouble(a.peek("a")); + if (v != null && !(v.doubleValue() > 0)) { + return GieFailures.invalidDefinition("+a=" + a.peek("a") + " must be > 0"); + } + } + if (!a.hasEllipsoidSize() && !a.impliesGrs80()) { + return GieFailures.invalidDefinition( + "+no_defs with no +ellps/+datum/+a/+b/+R: PROJ 9.8.1 fails with " + + "\"pj_init_ctx: Must specify ellipsoid or sphere\" (error 1026)"); + } + + // ellps_shape(): the FIRST present of rf, f, es, e, b wins. + // + // Each branch checks ellps_shape's own bound AND the flattening bound that + // pj_calc_ellipsoid_params applies afterwards to whatever shape came out: + // + // if (!(P->f >= 0.0 && P->f < 1.0)) { "Invalid eccentricity" } + // -- ell_set.cpp:598-600 + // + // ellps_shape only rejects `rf <= 0`, `f < 0` and `b <= 0`, so `+f=1`, + // `+rf=0.5` and `+a=1 +b=2` all get through it and are caught there instead. + // Verified against the installed 9.8.1 in both directions: `+proj=merc +a=1 + // +f=1`, `+rf=1`, `+rf=0.5` and `+b=2` are refused, while `+f=0.5`, + // `+rf=1.0000001`, `+b=1` and `+b=0.5` are accepted. (`proj` surfaces it as + // pj_init_ctx's "Must specify ellipsoid or sphere", because pj_ellipsoid + // returns non-zero; the rejection is the same one.) + if (a.contains("rf")) { + Double v = projDouble(a.peek("rf")); + if (v != null && !(v.doubleValue() > 0)) { + return GieFailures.invalidDefinition("+rf=" + a.peek("rf") + " must be > 0"); + } + if (v != null && !isProjFlattening(1.0 / v.doubleValue())) { + return GieFailures.invalidDefinition( + "+rf=" + a.peek("rf") + " gives f = " + (1.0 / v.doubleValue()) + + ", outside [0,1): \"Invalid eccentricity\""); + } + } else if (a.contains("f")) { + Double v = projDouble(a.peek("f")); + if (v != null && v.doubleValue() < 0) { + return GieFailures.invalidDefinition("+f=" + a.peek("f") + " must be >= 0"); + } + if (v != null && !isProjFlattening(v.doubleValue())) { + return GieFailures.invalidDefinition( + "+f=" + a.peek("f") + " is outside [0,1): \"Invalid eccentricity\""); + } + } else if (a.contains("es")) { + Double v = projDouble(a.peek("es")); + if (v != null && (v.doubleValue() < 0 || v.doubleValue() >= 1 || v.isNaN())) { + return GieFailures.invalidDefinition( + "+es=" + a.peek("es") + " is outside [0,1): \"Invalid eccentricity\""); + } + } else if (a.contains("e")) { + Double v = projDouble(a.peek("e")); + if (v != null && (v.doubleValue() < 0 || v.doubleValue() >= 1 || v.isNaN())) { + return GieFailures.invalidDefinition( + "+e=" + a.peek("e") + " is outside [0,1): \"Invalid eccentricity\""); + } + } else if (a.contains("b")) { + Double v = projDouble(a.peek("b")); + if (v != null && !(v.doubleValue() > 0)) { + return GieFailures.invalidDefinition("+b=" + a.peek("b") + " must be > 0"); + } + // f = (a - b) / a, so b > a is a negative flattening. + Double major = projDouble(a.peek("a")); + if (v != null && major != null && major.doubleValue() > 0 + && !isProjFlattening( + (major.doubleValue() - v.doubleValue()) / major.doubleValue())) { + return GieFailures.invalidDefinition( + "+b=" + a.peek("b") + " with +a=" + a.peek("a") + + " gives a flattening outside [0,1): \"Invalid eccentricity\""); + } + } + + // R_lat_a / R_lat_g require |lat| <= pi/2 (ell_set.cpp:356-467). + String[] latSpher = {"R_lat_a", "R_lat_g"}; + for (int i = 0; i < latSpher.length; i++) { + String v = a.peek(latSpher[i]); + if (v != null) { + Double rad = projAngleRadians(v); + if (rad != null && Math.abs(rad.doubleValue()) > HALF_PI) { + return GieFailures.invalidDefinition( + "+" + latSpher[i] + "=" + v + " exceeds 90 degrees"); + } + } + } + return null; + } + + // --------------------------------------------------------- frame params + + private static GieFailure validateFrame(GieProjArgs a) { + String latZero = a.peek("lat_0"); + if (latZero != null) { + Double rad = projAngleRadians(latZero); + if (rad != null && Math.abs(rad.doubleValue()) > HALF_PI) { + return GieFailures.invalidDefinition( + "+lat_0=" + latZero + " exceeds 90 degrees " + + "(PROJ: \"Invalid value for lat_0\")"); + } + } + + // k is read first, then k_0, so k_0 wins; both are validated. + String[] scaleKeys = {"k", "k_0"}; + for (int i = 0; i < scaleKeys.length; i++) { + String v = a.peek(scaleKeys[i]); + if (v != null) { + Double d = projDouble(v); + if (d != null && !(d.doubleValue() > 0)) { + return GieFailures.invalidDefinition( + "+" + scaleKeys[i] + "=" + v + " must be > 0"); + } + } + } + + String[] unitKeys = {"units", "vunits"}; + for (int i = 0; i < unitKeys.length; i++) { + String v = a.peek(unitKeys[i]); + if (v != null && !ProjTables.UNITS.contains(v)) { + return GieFailures.invalidDefinition( + "+" + unitKeys[i] + "=" + v + " is not one of PROJ 9.8.1's " + + ProjTables.UNITS.size() + " unit ids"); + } + } + + String[] toMeterKeys = {"to_meter", "vto_meter"}; + for (int i = 0; i < toMeterKeys.length; i++) { + String v = a.peek(toMeterKeys[i]); + if (v != null) { + Double d = projRatio(v); + if (d == null) { + return GieFailures.invalidDefinition( + "+" + toMeterKeys[i] + "=" + v + " has a zero denominator"); + } + if (!(d.doubleValue() > 0)) { + return GieFailures.invalidDefinition( + "+" + toMeterKeys[i] + "=" + v + " must be > 0"); + } + } + } + + String pm = a.peek("pm"); + if (pm != null && !ProjTables.PRIME_MERIDIANS.contains(pm)) { + ProjDmsToR.Result r = ProjDmsToR.dmstor(pm); + if (r.end == 0) { + return GieFailures.invalidDefinition( + "+pm=" + pm + " is neither a named meridian nor a parseable angle"); + } + } + + String axis = a.peek("axis"); + if (axis != null) { + if (axis.length() != 3) { + return GieFailures.invalidDefinition( + "+axis=" + axis + " must be exactly 3 characters"); + } + for (int i = 0; i < 3; i++) { + if (AXIS_CHARS.indexOf(axis.charAt(i)) < 0) { + return GieFailures.invalidDefinition( + "+axis=" + axis + " contains '" + axis.charAt(i) + + "', outside \"ewnsud\""); + } + } + } + + String lonWrap = a.peek("lon_wrap"); + if (lonWrap != null) { + Double rad = projAngleRadians(lonWrap); + if (rad != null && !(Math.abs(rad.doubleValue()) < LON_WRAP_LIMIT)) { + return GieFailures.invalidDefinition( + "+lon_wrap=" + lonWrap + " is NaN or at least 20*pi radians"); + } + } + + String zone = a.peek("zone"); + if (zone != null && !isAllDigits(zone)) { + return GieFailures.invalidDefinition( + "+zone=" + zone + " contains a non-digit; PROJ's pj_param type 'i' " + + "raises PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE"); + } + + for (int i = 0; i < BOOLEAN_KEYS.length; i++) { + GieToken t = a.find(BOOLEAN_KEYS[i]); + if (t != null && !isProjBoolean(t.value())) { + return GieFailures.invalidDefinition( + "+" + BOOLEAN_KEYS[i] + "=" + t.value() + + " is not a PROJ boolean (empty, t, T, f or F)"); + } + } + return null; + } + + private static GieFailure validateDatum(GieProjArgs a) { + String datum = a.peek("datum"); + if (datum != null && !ProjTables.DATUMS.contains(datum)) { + return GieFailures.invalidDefinition( + "+datum=" + datum + " is not one of PROJ 9.8.1's " + + ProjTables.DATUMS.size() + " built-in datums"); + } + String towgs84 = a.peek("towgs84"); + if (towgs84 != null) { + int n = towgs84.split(",", -1).length; + if (n != 3 && n != 7) { + return GieFailures.invalidDefinition( + "+towgs84 has " + n + " values; PROJ accepts 3 or 7"); + } + } + return null; + } + + // --------------------------------------------------- PROJ value grammar + + /** + * The keys PROJ reads with {@code pj_param} type {@code 'b'}. A value other + * than empty, {@code t}, {@code T}, {@code f} or {@code F} is a hard error; + * {@code f}/{@code F} means false, which proj4j cannot express + * because {@code Proj4Parser} tests {@code Map.containsKey}. + */ + static final String[] BOOLEAN_KEYS = { + "south", "no_uoff", "no_off", "no_defs", "wktext", "over", "geoc", "no_rot", + "no_cut", "guam", "hyperbolic", "czech", "approx", "exact", "inv", + "R_A", "R_V", "R_a", "R_g", "R_h" + }; + + /** {@code pj_param} type {@code 'b'} acceptance. */ + static boolean isProjBoolean(String v) { + if (v == null || v.isEmpty()) { + return true; + } + return "t".equals(v) || "T".equals(v) || "f".equals(v) || "F".equals(v); + } + + /** {@code pj_param} type {@code 'b'} value. */ + static boolean projBooleanValue(String v) { + return !("f".equals(v) || "F".equals(v)); + } + + /** + * {@code pj_calc_ellipsoid_params}' flattening bound + * ({@code 9.8.1:src/ell_set.cpp:598-600}): {@code f >= 0.0 && f < 1.0}, written + * that way so {@code NaN} fails. + */ + static boolean isProjFlattening(double f) { + return f >= 0.0 && f < 1.0; + } + + /** + * {@code pj_param} type {@code 'r'} with PROJ's own default-on-absent: 0 radians + * when the key is missing, and 0 when it is present but unparseable, because + * {@code dmstor_ctx} returns 0 in that case. + * + * @param dflt what PROJ substitutes when the operator explicitly tests + * {@code pj_param("t").i} first; pass 0 for the plain + * {@code pj_param("r").f} idiom + */ + static double radians(GieProjArgs a, String key, double dflt) { + GieToken t = a.find(key); + if (t == null) { + return dflt; + } + Double r = projAngleRadians(t.value()); + return r == null ? 0.0 : r.doubleValue(); + } + + /** {@code pj_param} type {@code 'd'} with a default-on-absent. */ + static double number(GieProjArgs a, String key, double dflt) { + GieToken t = a.find(key); + if (t == null) { + return dflt; + } + Double d = projDouble(t.value()); + return d == null ? 0.0 : d.doubleValue(); + } + + static boolean isAllDigits(String s) { + if (s == null || s.isEmpty()) { + return false; + } + for (int i = 0; i < s.length(); i++) { + if (!Character.isDigit(s.charAt(i))) { + return false; + } + } + return true; + } + + /** + * {@code pj_param} type {@code 'd'} — {@code pj_atof}, i.e. C locale + * {@code strtod}. Trailing garbage is silently ignored, exactly as in C. + * + * @return the value, or {@code null} if nothing numeric was there at all. + */ + static Double projDouble(String v) { + if (v == null) { + return null; + } + ProjStrtod.Result r = ProjStrtod.strtod(v); + if (r.end == 0) { + return null; + } + return Double.valueOf(r.value); + } + + /** + * {@code pj_param} type {@code 'r'} — {@code dmstor_ctx}, which yields + * radians. Handles decimal degrees, the {@code d}/{@code D}/degree-sign + * suffix, the {@code r}/{@code R} radian suffix, DMS with {@code '} and + * {@code "}, and a trailing cardinal ({@code e}/{@code n} positive, + * {@code w}/{@code s} negative). + * + * @return radians, or {@code null} if nothing was parseable. + */ + static Double projAngleRadians(String v) { + if (v == null) { + return null; + } + ProjDmsToR.Result r = ProjDmsToR.dmstor(v); + if (r.end == 0) { + return null; + } + return Double.valueOf(r.radians); + } + + /** + * {@code +to_meter}/{@code +vto_meter}, which accept a {@code num/den} ratio + * as well as a plain double ({@code init.cpp}). + * + * @return the value; {@code null} means a zero denominator, which PROJ treats + * as an error. + */ + static Double projRatio(String v) { + if (v == null) { + return null; + } + int slash = v.indexOf('/'); + if (slash < 0) { + return projDouble(v); + } + Double num = projDouble(v.substring(0, slash)); + Double den = projDouble(v.substring(slash + 1)); + if (num == null || den == null || den.doubleValue() == 0.0) { + return null; + } + return Double.valueOf(num.doubleValue() / den.doubleValue()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjOperatorSetup.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjOperatorSetup.java new file mode 100644 index 0000000..f4d2075 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjOperatorSetup.java @@ -0,0 +1,795 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.locationtech.proj4j.conformance.bridge.ProjDefinitionValidator.number; +import static org.locationtech.proj4j.conformance.bridge.ProjDefinitionValidator.projDouble; +import static org.locationtech.proj4j.conformance.bridge.ProjDefinitionValidator.radians; + +/** + * Per-operator setup validation, transcribed from PROJ 9.8.1's own + * {@code PJ_PROJECTION} / {@code PJ_TRANSFORMATION} / {@code PJ_CONVERSION} bodies. + * + *

Why this is not circular

+ * + *

{@link ProjDefinitionValidator}'s contract is "return {@code INVALID_DEFINITION} + * if PROJ 9.8.1 would reject this", and it is the only thing allowed to + * decide that, precisely so the decision never rests on the {@code expect failure} + * row being scored. This class extends it the legitimate way: each method is a + * transcription of one operator's construction-time guards, taken from the source + * at rev {@code 9.8.1}, with the file and line cited on every check. + * + *

Two disciplines keep that honest, and both are visible in the code: + * + *

    + *
  1. Whole setup functions are transcribed, not the guards the corpus happens to + * hit. {@link #isea} rejects a bad {@code +orient} and {@link #urm5} rejects a + * missing {@code +n}, and no corpus row exercises either; {@code omerc}'s + * five lat guards are all here though the corpus reaches three. A check that only + * exists because a row needs it would stand out.
  2. + *
  3. Every check was probed against the installed {@code proj 9.8.1} binary in + * both directions — a firing case and a near-miss that must still be accepted. + * Those probes are recorded in {@link ProjOperatorSetupTest} as executable + * assertions, so the model cannot drift from the oracle silently.
  4. + *
+ * + *

Where a guard needs the resolved ellipsoid, {@link #shape} answers only when the + * definition determines it without a named {@code +ellps}/{@code +datum}, an + * {@code +init=} or a spherification flag, and returns {@code null} otherwise. Every + * dependent check is then skipped. That is deliberately fail-open: a skipped check + * costs an assertion, and a wrong one manufactures a false pass. + */ +final class ProjOperatorSetup { + + /** {@code lcc.cpp:10}, {@code aea.cpp:35}, {@code eqdc.cpp:25}. */ + private static final double EPS10 = 1.e-10; + + /** {@code omerc.cpp:43}. */ + private static final double OMERC_TOL = 1.e-7; + + /** {@code omerc.cpp:44}. */ + private static final double OMERC_EPS = 1.e-10; + + /** {@code aasincos.cpp:8} — {@code aasin} only raises above this. */ + private static final double ONE_TOL = 1.00000000000001; + + /** {@code lagrng.cpp:10}. */ + private static final double LAGRNG_TOL = 1.e-10; + + /** {@code nsper.cpp:159} — {@code pn1 = h / a} must be in {@code ]0, 1e10]}. */ + private static final double NSPER_MAX_PN1 = 1.e10; + + /** {@code krovak.cpp:293} — 49d30'N, used when {@code +lat_0} is absent. */ + private static final double KROVAK_DEFAULT_PHI0 = 0.863937979737193; + + private static final double HALF_PI = Math.PI / 2.0; + private static final double FORT_PI = Math.PI / 4.0; + + /** {@code ellps.cpp}: {@code {"GRS80", "a=6378137.0", "rf=298.257222101"}}. */ + private static final double GRS80_A = 6378137.0; + private static final double GRS80_RF = 298.257222101; + + /** + * {@code ell_set.cpp:352-353} — the spherification flags. Any of them replaces the + * ellipsoid with a derived sphere, so {@link #shape} declines rather than model it. + */ + private static final String[] SPHERIFICATION_KEYS = { + "R_A", "R_V", "R_a", "R_g", "R_h", "R_lat_a", "R_lat_g", "R_C" + }; + + private ProjOperatorSetup() { + } + + /** + * @param a a non-pipeline definition whose {@code +proj} names a PROJ 9.8.1 + * operator and whose global parameters have already been validated + * @return an {@code INVALID_DEFINITION} failure if this operator's setup function + * would reject it, otherwise {@code null} + */ + static GieFailure validate(GieProjArgs a) { + String name = a.peek("proj"); + if (name == null) { + return null; + } + if ("lcc".equals(name)) { + return lcc(a); + } + if ("aea".equals(name) || "leac".equals(name)) { + return aea(a, "leac".equals(name)); + } + if ("eqdc".equals(name)) { + return eqdc(a); + } + if ("omerc".equals(name)) { + return omerc(a); + } + if ("lagrng".equals(name)) { + return lagrng(a); + } + if ("krovak".equals(name) || "mod_krovak".equals(name)) { + return krovak(a); + } + if ("labrd".equals(name)) { + return labrd(a); + } + if ("nsper".equals(name) || "tpers".equals(name)) { + return nsper(a); + } + if ("urm5".equals(name)) { + return urm5(a); + } + if ("s2".equals(name)) { + return s2(a); + } + if ("isea".equals(name)) { + return isea(a); + } + if ("ob_tran".equals(name)) { + return obTran(a); + } + if ("topocentric".equals(name)) { + return topocentric(a); + } + if ("helmert".equals(name)) { + return helmert(a); + } + if ("molobadekas".equals(name)) { + return molobadekas(a); + } + if ("molodensky".equals(name)) { + return molodensky(a); + } + if ("defmodel".equals(name)) { + return defmodel(a); + } + if ("gridshift".equals(name)) { + return gridshift(a); + } + if ("ups".equals(name)) { + return ups(a); + } + if ("utm".equals(name)) { + return utm(a); + } + if ("sterea".equals(name)) { + return sterea(a); + } + return null; + } + + // --------------------------------------------------------------- conics + + /** + * {@code lcc.cpp:88-113}. {@code lat_2} defaults to {@code lat_1} rather than to + * zero, which is why {@code +proj=lcc +ellps=GRS80} with no parallels at all is + * rejected: both are 0 and the sum guard fires. + * + *

The two eccentricity guards further down ({@code :123-141}, {@code n == 0} on + * a secant cone) need {@code pj_msfn}/{@code pj_tsfn} and are not ported; + * {@code builtins.gie:3862} and {@code :3869} stay unmeasured because of it. + */ + private static GieFailure lcc(GieProjArgs a) { + double phi1 = radians(a, "lat_1", 0.0); + double phi2 = a.contains("lat_2") ? radians(a, "lat_2", 0.0) : phi1; + + if (Math.abs(phi1 + phi2) < EPS10) { + return invalid("lcc", "|lat_1 + lat_2| should be > 0 (lcc.cpp:97-100)"); + } + if (Math.abs(Math.cos(phi1)) < EPS10 || Math.abs(phi1) >= HALF_PI) { + return invalid("lcc", "|lat_1| should be < 90 degrees (lcc.cpp:105-109)"); + } + if (Math.abs(Math.cos(phi2)) < EPS10 || Math.abs(phi2) >= HALF_PI) { + return invalid("lcc", "|lat_2| should be < 90 degrees (lcc.cpp:110-114)"); + } + return null; + } + + /** + * {@code aea.cpp:130-147}, shared by {@code aea} and {@code leac} through + * {@code setup()}. {@code leac} substitutes its own parallels at + * {@code aea.cpp:222-223}: {@code phi2} comes from {@code +lat_1} and {@code phi1} + * is a pole chosen by {@code +south}, so {@code +lat_2} is ignored entirely. + * + *

Note the bound is {@code > 90} here, not {@code >= 90} as in {@code lcc} — + * {@code leac} depends on {@code |phi1| == 90} being legal. + */ + private static GieFailure aea(GieProjArgs a, boolean leac) { + double phi1; + double phi2; + if (leac) { + phi2 = radians(a, "lat_1", 0.0); + boolean south = a.contains("south") + && ProjDefinitionValidator.projBooleanValue(a.peek("south")); + phi1 = south ? -HALF_PI : HALF_PI; + } else { + phi1 = radians(a, "lat_1", 0.0); + phi2 = radians(a, "lat_2", 0.0); + } + String op = leac ? "leac" : "aea"; + if (Math.abs(phi1) > HALF_PI) { + return invalid(op, "|lat_1| should be <= 90 degrees (aea.cpp:127-131)"); + } + if (Math.abs(phi2) > HALF_PI) { + return invalid(op, "|lat_2| should be <= 90 degrees (aea.cpp:132-136)"); + } + if (Math.abs(phi1 + phi2) < EPS10) { + return invalid(op, "|lat_1 + lat_2| should be > 0 (aea.cpp:137-141)"); + } + return null; + } + + /** + * {@code eqdc.cpp:85-101}. The spherical {@code n == 0} guard at {@code :137-143} + * and the {@code ml1 == ml2} guard at {@code :119-124} need {@code pj_mlfn} and + * are not ported, so {@code builtins.gie:1865} stays unmeasured. + */ + private static GieFailure eqdc(GieProjArgs a) { + double phi1 = radians(a, "lat_1", 0.0); + double phi2 = radians(a, "lat_2", 0.0); + if (Math.abs(phi1) > HALF_PI) { + return invalid("eqdc", "|lat_1| should be <= 90 degrees (eqdc.cpp:85-89)"); + } + if (Math.abs(phi2) > HALF_PI) { + return invalid("eqdc", "|lat_2| should be <= 90 degrees (eqdc.cpp:91-95)"); + } + if (Math.abs(phi1 + phi2) < EPS10) { + return invalid("eqdc", "|lat_1 + lat_2| should be > 0 (eqdc.cpp:96-100)"); + } + return null; + } + + /** + * {@code omerc.cpp:132-195} and {@code :224-248}. Two disjoint parameterisations: + * {@code +alpha}/{@code +gamma} with {@code +lonc}, or the two-point + * {@code +lat_1}/{@code +lon_1}/{@code +lat_2}/{@code +lon_2} form. The + * {@code |lat_0| < 90} guard belongs to both. + * + *

The {@code +gamma}-without-{@code +alpha} limit is the interesting one. PROJ + * computes {@code alpha_c = aasin(D * sin(gamma))} and then tests + * {@code proj_errno} ({@code :232-239}), which {@code aasin} sets only when + * the argument exceeds {@code ONE_TOL} ({@code aasincos.cpp:14-19}). So the limit + * is {@code |D sin(gamma)| > 1.00000000000001}, and the slack matters: on a sphere + * with {@code +lat_0=10} the limit is exactly {@code gamma = 80}, where + * {@code D sin(gamma)} rounds to within an ulp of 1 and must not raise. + * The {@code +alpha} branch at {@code :227-230} calls {@code aasin} too but never + * checks the errno, so there is no guard there. + * + *

Confirmed against the oracle, including the case the corpus gets wrong: + * {@code builtins.gie:5335} labels {@code +R=6400000 +rf=300 +gamma=80.01} "# OK", + * but {@code +R} overrules every shape parameter ({@code ell_set.cpp:90-98}) so it + * is a sphere, and {@code proj 9.8.1} rejects it with "|gamma| should be <= + * 80.000000". That block asserts nothing, so the comment was never checked. + */ + private static GieFailure omerc(GieProjArgs a) { + boolean alp = a.contains("alpha"); + boolean gam = a.contains("gamma"); + double phi0 = radians(a, "lat_0", 0.0); + + if (!alp && !gam) { + double phi1 = radians(a, "lat_1", 0.0); + double phi2 = radians(a, "lat_2", 0.0); + if (Math.abs(phi1) > HALF_PI - OMERC_TOL) { + return invalid("omerc", "|lat_1| should be < 90 degrees (omerc.cpp:157-162)"); + } + if (Math.abs(phi2) > HALF_PI - OMERC_TOL) { + return invalid("omerc", "|lat_2| should be < 90 degrees (omerc.cpp:164-169)"); + } + if (Math.abs(phi1 - phi2) <= OMERC_TOL) { + return invalid("omerc", + "lat_1 should be different from lat_2 (omerc.cpp:171-177)"); + } + if (Math.abs(phi1) <= OMERC_TOL) { + return invalid("omerc", + "lat_1 should be different from 0 (omerc.cpp:179-185)"); + } + } + if (Math.abs(Math.abs(phi0) - HALF_PI) <= OMERC_TOL) { + return invalid("omerc", "|lat_0| should be < 90 degrees " + + "(omerc.cpp:187-192 in the two-point branch, :243-248 otherwise)"); + } + if (gam && !alp) { + double[] ell = shape(a); + if (ell != null) { + double es = ell[1]; + double gamma = radians(a, "gamma", 0.0); + double d = omercD(es, phi0); + if (Math.abs(d * Math.sin(gamma)) > ONE_TOL) { + return invalid("omerc", "given lat_0, |gamma| should be <= " + + Math.toDegrees(Math.asin(1.0 / d)) + + " degrees (omerc.cpp:231-239 via aasin)"); + } + } + } + return null; + } + + /** {@code omerc.cpp:199-221} — {@code D}, which is what bounds {@code +gamma}. */ + private static double omercD(double es, double phi0) { + double oneEs = 1.0 - es; + double com = Math.sqrt(oneEs); + if (Math.abs(phi0) <= OMERC_EPS) { + return 1.0; + } + double sinph0 = Math.sin(phi0); + double cosph0 = Math.cos(phi0); + double con = 1.0 - es * sinph0 * sinph0; + double b = cosph0 * cosph0; + b = Math.sqrt(1.0 + es * b * b / oneEs); + return b * com / (cosph0 * Math.sqrt(con)); + } + + // ------------------------------------------------- single-guard operators + + /** {@code lagrng.cpp:79-95}. {@code +W} defaults to 2, so it is not required. */ + private static GieFailure lagrng(GieProjArgs a) { + double w = number(a, "W", 2.0); + if (w <= 0) { + return invalid("lagrng", "W should be > 0 (lagrng.cpp:83-86)"); + } + double sinPhi1 = Math.sin(radians(a, "lat_1", 0.0)); + if (Math.abs(Math.abs(sinPhi1) - 1.0) < LAGRNG_TOL) { + return invalid("lagrng", "|lat_1| should be < 90 degrees (lagrng.cpp:90-95)"); + } + return null; + } + + /** + * {@code krovak.cpp:317-322}, reached from both {@code krovak} and + * {@code mod_krovak} through {@code krovak_setup}. The test is an exact + * {@code == 0.0} on {@code tan(lat_0/2 + pi/4)}, and {@code +lat_0} defaults to + * 49d30'N ({@code :292-293}) rather than to 0 — so a bare {@code +proj=krovak} is + * fine and only {@code +lat_0=-90} degenerates. + */ + private static GieFailure krovak(GieProjArgs a) { + double phi0 = radians(a, "lat_0", KROVAK_DEFAULT_PHI0); + if (Math.tan(phi0 / 2.0 + FORT_PI) == 0.0) { + return invalid("krovak", + "lat_0 + PI/4 should be different from 0 (krovak.cpp:317-322)"); + } + return null; + } + + /** {@code labrd.cpp:111-115}. {@code +lat_0} defaults to 0, which is the reject. */ + private static GieFailure labrd(GieProjArgs a) { + if (radians(a, "lat_0", 0.0) == 0.0) { + return invalid("labrd", + "lat_0 should be different from 0 (labrd.cpp:111-115)"); + } + return null; + } + + /** + * {@code nsper.cpp:147,158-162}, shared with {@code tpers}. {@code +h} defaults to + * 0, so it is effectively required. {@code pn1 = h / a}: the lower bound needs no + * ellipsoid because {@code a > 0} is already established, the upper bound does. + */ + private static GieFailure nsper(GieProjArgs a) { + double h = number(a, "h", 0.0); + if (h <= 0) { + return invalid("nsper", "h / a must be > 0 (nsper.cpp:158-162)"); + } + double[] ell = shape(a); + if (ell != null && h / ell[0] > NSPER_MAX_PN1) { + return invalid("nsper", "h / a must be <= 1e10 (nsper.cpp:158-162)"); + } + return null; + } + + /** {@code urm5.cpp:37-57}. */ + private static GieFailure urm5(GieProjArgs a) { + if (!a.contains("n")) { + return invalid("urm5", "missing parameter n (urm5.cpp:37-40)"); + } + double n = number(a, "n", 0.0); + if (n <= 0.0 || n > 1.0) { + return invalid("urm5", "n should be in ]0,1] (urm5.cpp:42-47)"); + } + double t = n * Math.sin(radians(a, "alpha", 0.0)); + if (Math.sqrt(1.0 - t * t) == 0.0) { + return invalid("urm5", + "n * sin(|alpha|) should be < 1 (urm5.cpp:52-58)"); + } + return null; + } + + /** {@code s2.cpp:77-81, 417-427}. */ + private static GieFailure s2(GieProjArgs a) { + return oneOf(a, "s2", "UVtoST", + new String[] {"linear", "quadratic", "tangent", "none"}, "s2.cpp:417-427"); + } + + /** + * {@code isea.cpp:1008-1020} and {@code :1039-1050}. Neither guard is reached by + * any corpus row — {@code builtins.gie:3152} uses the legal {@code +mode=hex} and + * fails at transform time, which is not this class's business. They are here + * because the setup function is what is being transcribed. + */ + private static GieFailure isea(GieProjArgs a) { + GieFailure f = oneOf(a, "isea", "orient", new String[] {"isea", "pole"}, + "isea.cpp:1008-1020"); + if (f != null) { + return f; + } + return oneOf(a, "isea", "mode", new String[] {"plane", "di", "dd", "hex"}, + "isea.cpp:1039-1050"); + } + + /** + * {@code ob_tran.cpp:189-206}, with {@code ob_tran_target_params} at {@code :138-168}. + * + *

Three distinct rejections, in PROJ's order. Note that {@code +o_proj} written + * with no {@code '='} still satisfies the first: {@code pj_param("so_proj").s} + * points at the terminating NUL, which is non-null. It is the rewrite in + * {@code ob_tran_target_params} that then finds no {@code proj=} to hand to + * {@code pj_create_argv_internal}, so it fails as "unknown" rather than "missing". + * + *

Only the first {@code o_proj} token is modelled, which is what + * {@code pj_param} reads. A definition repeating the key — {@code +o_proj=moll + * +o_proj=ob_tran} — is rejected upstream for reasons the rewrite loop makes + * genuinely hard to predict, and is left alone; see + * {@code ProjOperatorSetupTest.UNMODELLED}. Under-counting there is free, and no + * corpus row does it. + */ + private static GieFailure obTran(GieProjArgs a) { + GieToken t = a.find("o_proj"); + if (t == null) { + return invalid("ob_tran", "missing parameter o_proj (ob_tran.cpp:189-192)"); + } + String target = t.value(); + // ob_tran_target_params rewrites `o_proj=xxx` to `proj=xxx` and bails out + // entirely when that yields `proj=ob_tran` - the recursion guard. + if ("ob_tran".equals(target)) { + return invalid("ob_tran", + "o_proj=ob_tran would recurse (ob_tran.cpp:164-168, :195-200)"); + } + // Anything pj_create_argv_internal cannot build is "unknown": no name at all, + // a name PROJ does not have, or `pipeline`, which has no steps to run here. + if (target == null || target.isEmpty() || "pipeline".equals(target) + || !ProjTables.isProjOperator(target)) { + return invalid("ob_tran", "+o_proj=" + (target == null ? "" : target) + + " does not name a projection to rotate (ob_tran.cpp:204-207)"); + } + return null; + } + + /** {@code topocentric.cpp:92-116}. Purely a presence algebra over six keys. */ + private static GieFailure topocentric(GieProjArgs a) { + boolean hasX0 = a.contains("X_0"); + boolean hasY0 = a.contains("Y_0"); + boolean hasZ0 = a.contains("Z_0"); + boolean hasLon0 = a.contains("lon_0"); + boolean hasLat0 = a.contains("lat_0"); + boolean hasH0 = a.contains("h_0"); + if (!hasX0 && !hasLon0) { + return invalid("topocentric", "missing X_0 or lon_0 (topocentric.cpp:98-101)"); + } + if ((hasX0 || hasY0 || hasZ0) && (hasLon0 || hasLat0 || hasH0)) { + return invalid("topocentric", + "(X_0,Y_0,Z_0) and (lon_0,lat_0,h_0) are mutually exclusive " + + "(topocentric.cpp:102-107)"); + } + if (hasX0 && (!hasY0 || !hasZ0)) { + return invalid("topocentric", "missing Y_0 and/or Z_0 (topocentric.cpp:108-111)"); + } + if (hasLon0 && !hasLat0) { + return invalid("topocentric", "missing lat_0 (topocentric.cpp:112-116)"); + } + return null; + } + + /** + * {@code helmert.cpp:581-585} plus {@code read_convention} at {@code :517-551}. + * + *

{@code +convention} is required exactly when a rotation is present, and + * "present" means non-zero after {@code :663-666} compares all six of + * {@code rx ry rz drx dry drz} — verified: {@code +rx=0} is accepted and + * {@code +drx=1} is not. {@code +towgs84} feeds the same three rotation slots + * through {@code pj_datum_set} ({@code :590-604}), and then may only be combined + * with {@code convention=position_vector} ({@code :542-548}). + */ + private static GieFailure helmert(GieProjArgs a) { + if (a.contains("transpose")) { + return invalid("helmert", + "the 'transpose' argument is no longer valid (helmert.cpp:581-585)"); + } + return convention(a, "helmert", hasRotation(a)); + } + + /** + * {@code helmert.cpp:699-723}. {@code molobadekas} never assigns + * {@code Q->no_rotation}, so the calloc'd zero leaves {@code read_convention}'s + * {@code !Q->no_rotation} permanently true: {@code +convention} is + * unconditionally required, even for a bare {@code +proj=molobadekas}. + * Confirmed against the oracle in both directions. + */ + private static GieFailure molobadekas(GieProjArgs a) { + return convention(a, "molobadekas", true); + } + + /** {@code helmert.cpp:517-551}, shared by {@code helmert} and {@code molobadekas}. */ + private static GieFailure convention(GieProjArgs a, String op, boolean required) { + if (!required) { + return null; + } + GieToken t = a.find("convention"); + if (t == null) { + return invalid(op, "missing 'convention' argument (helmert.cpp:523-528)"); + } + String v = t.value(); + boolean positionVector = "position_vector".equals(v); + if (!positionVector && !"coordinate_frame".equals(v)) { + return invalid(op, "invalid value for 'convention' (helmert.cpp:529-538)"); + } + if (a.contains("towgs84") && !positionVector) { + return invalid(op, "towgs84 should only be used with " + + "convention=position_vector (helmert.cpp:542-548)"); + } + return null; + } + + /** {@code helmert.cpp:663-666}, including the {@code towgs84} feed at {@code :590-604}. */ + private static boolean hasRotation(GieProjArgs a) { + String[] keys = {"rx", "ry", "rz", "drx", "dry", "drz"}; + for (int i = 0; i < keys.length; i++) { + if (number(a, keys[i], 0.0) != 0.0) { + return true; + } + } + String towgs84 = a.peek("towgs84"); + if (towgs84 != null) { + String[] parts = towgs84.split(",", -1); + for (int i = 3; i < parts.length && i < 6; i++) { + Double d = projDouble(parts[i]); + if (d != null && d.doubleValue() != 0.0) { + return true; + } + } + } + return false; + } + + /** {@code molodensky.cpp:321-349}: five required translation/ellipsoid deltas. */ + private static GieFailure molodensky(GieProjArgs a) { + String[] required = {"dx", "dy", "dz", "da", "df"}; + for (int i = 0; i < required.length; i++) { + if (!a.contains(required[i])) { + return invalid("molodensky", + "missing " + required[i] + " (molodensky.cpp:321-349)"); + } + } + return null; + } + + /** {@code defmodel.cpp:402-406}. */ + private static GieFailure defmodel(GieProjArgs a) { + if (!a.contains("model")) { + return invalid("defmodel", "+model= should be specified (defmodel.cpp:402-406)"); + } + return null; + } + + /** + * {@code gridshift.cpp:913-916} and {@code :955-965}. + * + *

The {@code +interpolation} guard sits after the grid is opened, so the local + * oracle cannot reach it — every probe stops at "could not find required grid(s)" + * because PROJ's data path here has no {@code tests/} tree. The guard itself is + * unambiguous in the source, and it is transcribed alongside the {@code +grids} + * one, which the oracle does confirm. + */ + private static GieFailure gridshift(GieProjArgs a) { + if (!a.contains("grids")) { + return invalid("gridshift", "+grids parameter missing (gridshift.cpp:913-916)"); + } + return oneOf(a, "gridshift", "interpolation", + new String[] {"bilinear", "biquadratic"}, "gridshift.cpp:955-965"); + } + + // -------------------------------------------------- ellipsoid-dependent + + /** {@code stere.cpp:318-323}: {@code ups} has no spherical formulation. */ + private static GieFailure ups(GieProjArgs a) { + double[] ell = shape(a); + if (ell != null && ell[1] == 0.0) { + return invalid("ups", + "only the ellipsoidal formulation is supported (stere.cpp:318-323)"); + } + return null; + } + + /** {@code tmerc.cpp:632-653}. */ + private static GieFailure utm(GieProjArgs a) { + double[] ell = shape(a); + if (ell != null && ell[1] == 0.0) { + return invalid("utm", + "eccentricity should not be zero (tmerc.cpp:632-636)"); + } + if (a.contains("zone")) { + Double z = projDouble(a.peek("zone")); + if (z != null && !(z.doubleValue() > 0 && z.doubleValue() <= 60)) { + return invalid("utm", "zone must be in [1,60] (tmerc.cpp:644-653)"); + } + } + return null; + } + + /** + * {@code sterea.cpp:104-106} through {@code pj_gauss_ini} at + * {@code gauss.cpp:49-78}, which is {@code sterea}'s only caller in the whole of + * 9.8.1. Two {@code nullptr} returns, both surfacing as {@code PROJ_ERR_OTHER}: + * {@code C == 0}, and — the one the corpus reaches — {@code srat} underflowing to + * zero, because {@code ratexp} grows without bound as {@code es} approaches 1. + * With {@code +a=9999 +b=.9 +lat_0=73} the exponent is about 475 and the base + * about 0.0223, so {@code pow} returns 0. + */ + private static GieFailure sterea(GieProjArgs a) { + double[] ell = shape(a); + if (ell == null) { + return null; + } + double es = ell[1]; + double e = Math.sqrt(es); + double phi0 = radians(a, "lat_0", 0.0); + double sphi = Math.sin(phi0); + double cphi = Math.cos(phi0); + cphi *= cphi; + double c = Math.sqrt(1.0 + es * cphi * cphi / (1.0 - es)); + if (c == 0.0) { + return invalid("sterea", "pj_gauss_ini: C == 0 (gauss.cpp:61-65)"); + } + double ratexp = 0.5 * c * e; + double esinp = e * sphi; + double srat = Math.pow((1.0 - esinp) / (1.0 + esinp), ratexp); + if (srat == 0.0) { + return invalid("sterea", + "pj_gauss_ini: srat underflows to 0 with ratexp = " + ratexp + + " (gauss.cpp:66-71)"); + } + return null; + } + + // ------------------------------------------------------------- helpers + + /** + * {@code pj_param} type {@code 's'} against a fixed value set. + * + * @return a failure when the key is present with a value outside {@code allowed}; + * {@code null} when absent, since every one of these has a default + */ + private static GieFailure oneOf(GieProjArgs a, String op, String key, String[] allowed, + String where) { + GieToken t = a.find(key); + if (t == null) { + return null; + } + String v = t.value(); + for (int i = 0; i < allowed.length; i++) { + if (allowed[i].equals(v)) { + return null; + } + } + StringBuilder list = new StringBuilder(); + for (int i = 0; i < allowed.length; i++) { + list.append(i == 0 ? "" : ", ").append(allowed[i]); + } + return invalid(op, "+" + key + "=" + v + " is not one of " + list + " (" + where + ")"); + } + + /** + * The {@code a} and {@code es} that {@code ell_set.cpp} would resolve, or + * {@code null} when this class declines to say. + * + *

It declines whenever a named {@code +ellps} or {@code +datum}, an + * {@code +init=}, or any spherification flag is in play, because reproducing those + * faithfully means porting all 657 lines of {@code ell_set.cpp} plus the 46-entry + * {@code ellps.cpp} table — a second, competing model of parameter resolution + * living in test scope. Every caller treats {@code null} as "skip this check", + * which costs assertions and cannot manufacture a pass. + * + *

What it does model, verbatim: {@code +R} short-circuiting everything + * ({@code :90-98}), {@code ellps_size} ({@code :199-238}), {@code ellps_shape}'s + * first-match-wins over {@code rf f es e b} ({@code :242-345}), and the implicit + * {@code +ellps=GRS80} that {@code init.cpp:362} appends when the definition names + * no size or shape at all. + * + * @return {@code {a, es}}, or {@code null} + */ + static double[] shape(GieProjArgs a) { + if (a.contains("ellps") || a.contains("datum") || a.contains("init")) { + return null; + } + for (int i = 0; i < SPHERIFICATION_KEYS.length; i++) { + if (a.contains(SPHERIFICATION_KEYS[i])) { + return null; + } + } + if (a.contains("R")) { + Double r = projDouble(a.peek("R")); + return r == null || !(r.doubleValue() > 0) + ? null : new double[] {r.doubleValue(), 0.0}; + } + + boolean hasShapeKey = a.contains("rf") || a.contains("f") || a.contains("es") + || a.contains("e") || a.contains("b"); + Double major = a.contains("a") ? projDouble(a.peek("a")) : null; + if (major == null) { + if (hasShapeKey || a.contains("no_defs")) { + // ellps_size: "Major axis not given". Left to the existing + // hasEllipsoidSize()/impliesGrs80() checks rather than duplicated here. + return null; + } + double f = 1.0 / GRS80_RF; + return new double[] {GRS80_A, 2 * f - f * f}; + } + if (!(major.doubleValue() > 0)) { + return null; + } + double size = major.doubleValue(); + + double es; + if (a.contains("rf")) { + Double v = projDouble(a.peek("rf")); + if (v == null || !(v.doubleValue() > 0)) { + return null; + } + double f = 1.0 / v.doubleValue(); + es = 2 * f - f * f; + } else if (a.contains("f")) { + Double v = projDouble(a.peek("f")); + if (v == null || v.doubleValue() < 0) { + return null; + } + double f = v.doubleValue(); + es = 2 * f - f * f; + } else if (a.contains("es")) { + Double v = projDouble(a.peek("es")); + if (v == null) { + return null; + } + es = v.doubleValue(); + } else if (a.contains("e")) { + Double v = projDouble(a.peek("e")); + if (v == null) { + return null; + } + es = v.doubleValue() * v.doubleValue(); + } else if (a.contains("b")) { + Double v = projDouble(a.peek("b")); + if (v == null || !(v.doubleValue() > 0)) { + return null; + } + if (v.doubleValue() == size) { + es = 0.0; + } else { + double f = (size - v.doubleValue()) / size; + es = 2 * f - f * f; + } + } else { + es = 0.0; + } + if (!(es >= 0.0) || es >= 1.0) { + // Already an INVALID_DEFINITION by the global ellipsoid checks; declining + // here keeps this method's contract to "a shape PROJ would have built". + return null; + } + return new double[] {size, es}; + } + + private static GieFailure invalid(String op, String why) { + return GieFailures.invalidDefinition("+proj=" + op + ": " + why + + " - PROJ 9.8.1's own setup function rejects this definition"); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjOperatorSetupTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjOperatorSetupTest.java new file mode 100644 index 0000000..b7d1311 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjOperatorSetupTest.java @@ -0,0 +1,307 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * The oracle transcript for {@link ProjOperatorSetup}. + * + *

Every row below was run through the installed {@code proj 9.8.1} binary + * (Rel. 9.8.1, April 10th 2026 — the same rev the corpus is vendored from) as + * {@code echo "0 0" | proj }, and the {@code REJECT}/{@code ACCEPT} + * column is what it printed. The test asserts that + * {@link ProjDefinitionValidator#validate} agrees. + * + *

The ACCEPT rows are the point. A validator that returned + * {@code INVALID_DEFINITION} for everything would satisfy every REJECT row and be + * worthless — worse than worthless, since {@code INVALID_DEFINITION} is the only + * verdict that can manufacture a false pass. So each guard is paired with a + * near-miss that must still be accepted: {@code +rf=1} rejects but + * {@code +rf=1.0000001} accepts; {@code lagrng +W=0} rejects but a bare + * {@code lagrng} accepts because {@code +W} defaults to 2; {@code helmert +drx=1} + * rejects but {@code +rx=0} accepts. + * + *

{@link #theOracleTranscriptExercisesBothVerdicts()} enforces that balance so + * the transcript cannot decay into a one-sided list. + */ +class ProjOperatorSetupTest { + + /** One oracle observation: a definition and whether {@code proj 9.8.1} refused it. */ + private static final class Row { + final String def; + final boolean rejected; + final String note; + + Row(String def, boolean rejected, String note) { + this.def = def; + this.rejected = rejected; + this.note = note; + } + } + + private static Row reject(String def, String note) { + return new Row(def, true, note); + } + + private static Row accept(String def, String note) { + return new Row(def, false, note); + } + + /** + * Definitions whose verdict this validator is expected to reproduce. + * + *

Deliberately excluded: definitions PROJ rejects for a reason + * {@link ProjOperatorSetup} does not model (the {@code lcc}/{@code eqdc} + * eccentricity guards, which need {@code pj_msfn}/{@code pj_mlfn}). Those are + * listed in {@link #UNMODELLED} instead, so the gap is on the record rather than + * silently absent. + */ + private static final Row[] ORACLE = { + // ---- ell_set.cpp / pj_calc_ellipsoid_params: f must be in [0,1) + reject("proj=merc a=1 f=1", "f=1 is not < 1"), + reject("proj=merc a=1 f=2", "f=2 is not < 1"), + reject("proj=utm zone=32 ellps=GRS80 f=1", "the +f modifier still bounds f"), + reject("proj=merc a=1 rf=1", "rf=1 gives f=1"), + reject("proj=merc a=1 rf=0.5", "rf<1 gives f>1"), + reject("proj=merc a=1 b=2", "b>a gives a negative flattening"), + accept("proj=merc a=1 f=0.5", "f in range"), + accept("proj=merc a=1 rf=1.0000001", "just inside: f<1"), + accept("proj=merc a=1 rf=300", "ordinary"), + accept("proj=merc a=1 b=1", "b==a is a sphere"), + accept("proj=merc a=1 b=0.5", "b= 90"), + reject("proj=lcc ellps=GRS80 lat_1=90 lat_2=0", "|lat_1| >= 90"), + reject("proj=lcc ellps=GRS80 lat_1=90 lat_2=90", "lat_1 guard wins"), + reject("proj=lcc ellps=sphere lat_1=91", "lat_2 defaults to lat_1"), + reject("proj=lcc ellps=sphere lat_2=91", "|lat_2| >= 90"), + reject("proj=lcc ellps=GRS80 lat_1=1 lat_2=-1", "|lat_1+lat_2| == 0"), + reject("proj=lcc ellps=GRS80", "both parallels default to 0"), + accept("proj=lcc ellps=GRS80 lat_1=30 lat_2=45", "ordinary secant"), + accept("proj=lcc ellps=GRS80 lat_1=0.5 lat_2=2", "corpus row builtins.gie:3833"), + + // ---- aea / leac / eqdc + reject("proj=aea R=6400000 lat_1=1 lat_2=-1", "|lat_1+lat_2| == 0"), + reject("proj=aea ellps=GRS80 lat_1=900", "|lat_1| > 90"), + reject("proj=aea ellps=GRS80 lat_2=900", "|lat_2| > 90"), + reject("proj=aea", "both parallels default to 0"), + accept("proj=aea ellps=GRS80 lat_1=0 lat_2=2", "sum is 2 degrees"), + reject("proj=eqdc R=6400000 lat_1=1 lat_2=-1", "|lat_1+lat_2| == 0"), + reject("proj=eqdc R=6400000 lat_1=91", "|lat_1| > 90"), + reject("proj=eqdc R=6400000 lat_2=91", "|lat_2| > 90"), + reject("proj=eqdc R=1 lat_1=1e-9", "1e-9 degrees is 1.7e-11 rad, under EPS10"), + accept("proj=eqdc ellps=GRS80 lat_1=0.5 lat_2=2", "ordinary"), + accept("proj=leac ellps=GRS80 lat_1=0 lat_2=2", "leac takes phi1 from the pole"), + accept("proj=leac R=6400000 lat_1=0 lat_2=2", "and ignores lat_2"), + + // ---- omerc + reject("proj=omerc R=1 alpha=0 lat_0=90", "|lat_0| >= 90 in the alpha branch"), + reject("proj=omerc lat_1=91", "|lat_1| > 90 - TOL"), + reject("proj=omerc lat_2=91", "|lat_2| > 90 - TOL"), + reject("proj=omerc", "lat_1 == lat_2 == 0"), + reject("proj=omerc ellps=GRS80 lat_1=0 lat_2=2", "lat_1 must differ from 0"), + reject("proj=omerc ellps=GRS80 lat_1=1 lat_2=1", "lat_1 must differ from lat_2"), + reject("proj=omerc ellps=GRS80 lat_1=30 lat_2=40 lat_0=90", "|lat_0| >= 90"), + accept("proj=omerc R=1 alpha=0 lat_0=45", "alpha branch, lat_0 in range"), + accept("proj=omerc R=1 lat_0=1 lat_1=2 no_rot", "corpus row builtins.gie:5269"), + accept("proj=omerc a=6400000 lat_0=45 lat_1=45 lat_2=45.00001 lon_1=0 lon_2=1e-5", + "|lat_1-lat_2| is 1.7e-7 rad, just OVER TOL=1e-7"), + accept("proj=omerc ellps=GRS80 lat_1=0.5 lat_2=2", "corpus row builtins.gie:5223"), + + // ---- omerc: the +gamma limit, which is where D matters + accept("proj=omerc lat_0=10 R=6400000 gamma=80", + "exactly at the spherical limit; aasin's ONE_TOL slack must absorb it"), + reject("proj=omerc lat_0=10 R=6400000 gamma=80.0000001", "1e-7 degrees over"), + reject("proj=omerc lat_0=10 R=6400000 rf=300 gamma=80.01", + "+R makes it spherical, so the limit is still 80 - the corpus's " + + "'# OK' comment on builtins.gie:5335 is wrong and unasserted"), + reject("proj=omerc lat_0=10 a=6400000 rf=300 gamma=80.1", + "ellipsoidal limit is 80.031684"), + accept("proj=omerc lat_0=10 a=6400000 rf=300 gamma=80.01", + "under the ellipsoidal limit, unlike the +R form above"), + + // ---- lagrng / krovak / labrd + reject("proj=lagrng R=1 W=-1", "W must be > 0"), + reject("proj=lagrng R=1 W=0", "W must be > 0"), + reject("proj=lagrng R=1 lat_1=90.00001", "|sin(lat_1)| within TOL of 1"), + accept("proj=lagrng R=1 W=0.5", "W in range"), + accept("proj=lagrng R=1", "+W defaults to 2, so it is not required"), + accept("proj=lagrng R=1 lat_1=89", "well inside"), + reject("proj=krovak lat_0=-90", "tan(lat_0/2 + pi/4) == 0"), + reject("proj=mod_krovak lat_0=-90", "shares krovak_setup"), + accept("proj=krovak", "+lat_0 defaults to 49d30'N, not to 0"), + accept("proj=krovak lat_0=49.5", "the default, written out"), + reject("proj=labrd ellps=GRS80 lat_0=0", "lat_0 must differ from 0"), + reject("proj=labrd ellps=GRS80", "+lat_0 defaults to 0"), + accept("proj=labrd ellps=GRS80 lat_0=-18.9", "Madagascar"), + + // ---- nsper / tpers + reject("proj=nsper R=1 h=0", "pn1 = h/a must be > 0"), + reject("proj=nsper R=1 h=-5", "negative height"), + reject("proj=nsper R=1", "+h defaults to 0"), + reject("proj=nsper R=1 h=1e11", "pn1 > 1e10"), + accept("proj=nsper R=1 h=1e10", "exactly at the upper bound"), + accept("proj=nsper R=1 h=10", "ordinary"), + reject("proj=tpers R=1 h=0", "tpers shares nsper_setup"), + accept("proj=tpers R=1 h=10", "ordinary"), + + // ---- urm5 / s2 / isea + reject("proj=urm5 a=6400000", "+n is required"), + reject("proj=urm5 a=6400000 n=0", "n must be in ]0,1]"), + reject("proj=urm5 a=6400000 n=1.5", "n must be in ]0,1]"), + reject("proj=urm5 a=6400000 n=1 alpha=90", "n*sin(alpha) == 1"), + accept("proj=urm5 a=6400000 n=0.5", "ordinary"), + reject("proj=s2 ellps=WGS84 lat_0=0 lon_0=0 UVtoST=invalid", "not in the map"), + accept("proj=s2 ellps=WGS84 lat_0=0 lon_0=0 UVtoST=linear", "in the map"), + accept("proj=s2 ellps=WGS84 lat_0=0 lon_0=0", "defaults to quadratic"), + reject("proj=isea mode=nope", "no corpus row reaches this guard"), + reject("proj=isea orient=nope", "nor this one"), + accept("proj=isea mode=hex", "corpus row builtins.gie:3152 - legal at setup"), + accept("proj=isea orient=pole", "legal"), + + // ---- ob_tran + reject("proj=ob_tran R=6400000", "+o_proj missing"), + reject("proj=ob_tran R=6400000 o_proj=ob_tran", "recursion guard"), + reject("proj=ob_tran R=6400000 o_proj", + "bare +o_proj passes the null check, then names nothing to build"), + reject("proj=ob_tran R=6400000 o_proj=", "same, written with an empty value"), + reject("proj=ob_tran R=6400000 o_proj=nosuchthing", "unknown target operator"), + reject("proj=ob_tran R=6400000 o_proj=pipeline", "a pipeline with no steps"), + accept("proj=ob_tran R=6400000 o_proj=moll o_lat_p=45 o_lon_p=0", "ordinary"), + + // ---- topocentric + reject("proj=topocentric ellps=WGS84", "neither X_0 nor lon_0"), + reject("proj=topocentric ellps=WGS84 X_0=0 Y_0=0", "Z_0 missing"), + reject("proj=topocentric ellps=WGS84 lon_0=0", "lat_0 missing"), + reject("proj=topocentric ellps=WGS84 X_0=0 lon_0=0", "mutually exclusive"), + accept("proj=topocentric ellps=WGS84 X_0=0 Y_0=0 Z_0=0", "geocentric origin"), + accept("proj=topocentric ellps=WGS84 lon_0=0 lat_0=0", "geographic origin"), + + // ---- helmert / molobadekas / molodensky + reject("proj=helmert rx=1", "rotation without a convention"), + reject("proj=helmert drx=1", "a rate of rotation counts too"), + reject("proj=helmert rx=1 convention=foo", "not a known convention"), + reject("proj=helmert rx=1 convention=1", "nor this"), + reject("proj=helmert towgs84=1,2,3,4,5,6,7 convention=coordinate_frame", + "towgs84 is position_vector by history"), + reject("proj=helmert transpose", "the obsolete flag is a hard error"), + accept("proj=helmert towgs84=1,2,3,4,5,6,7 convention=position_vector", "legal"), + accept("proj=helmert rx=1 convention=position_vector", "legal"), + accept("proj=helmert rx=0", "a zero rotation is no rotation"), + accept("proj=helmert x=1", "translation only"), + accept("proj=helmert", "the identity is legal"), + reject("proj=molobadekas", "convention is unconditionally required here"), + accept("proj=molobadekas convention=position_vector", "legal"), + reject("proj=molodensky a=6378160 rf=298.25", "dx missing"), + reject("proj=molodensky a=6378160 rf=298.25 dx=0", "dy missing"), + accept("proj=molodensky a=6378160 rf=298.25 dx=0 dy=0 dz=0 da=0 df=0", "complete"), + + // ---- defmodel / gridshift + reject("proj=defmodel", "+model= required"), + reject("proj=gridshift", "+grids required"), + + // ---- ups / utm / sterea + reject("proj=ups a=6400000", "no spherical formulation"), + accept("proj=ups ellps=GRS80", "ellipsoidal"), + reject("proj=utm a=6400000 zone=30", "eccentricity must not be zero"), + reject("proj=utm R=6400000 zone=30", "same, via +R"), + accept("proj=utm ellps=GRS80 zone=30", "ordinary"), + reject("proj=sterea a=9999 b=.9 lat_0=73", "pj_gauss_ini srat underflows"), + accept("proj=sterea a=9999 b=.9 lat_0=0", "sin(lat_0)=0 makes srat 1"), + accept("proj=sterea ellps=GRS80 lat_0=52", "ordinary"), + }; + + /** + * Definitions {@code proj 9.8.1} rejects that {@link ProjOperatorSetup} + * deliberately does not, because the guard needs {@code pj_msfn}, + * {@code pj_tsfn} or {@code pj_mlfn}. Asserting they come back valid pins the + * boundary: if someone ports those guards, this list must shrink in the same + * commit, and if the validator starts rejecting them by accident, this catches it. + */ + private static final String[] UNMODELLED = { + // Need pj_msfn / pj_tsfn / pj_mlfn to evaluate an `n == 0` secant-cone + // degeneracy at an eccentricity indistinguishable from 1. + "proj=lcc a=9999999 b=.9 lat_2=1", + "proj=eqdc a=9999999 b=.9 lat_2=1", + "proj=eqdc lat_1=1 ellps=GRS80 b=.1", + "proj=omerc lat_1=0.8 a=6400000 b=.4", + // A repeated +o_proj: ob_tran_target_params rewrites every occurrence and + // the resulting failure is not the one the rewrite loop reads as though it + // should be. proj 9.8.1 rejects this with omerc's lat_1/lat_2 message, + // which is not predictable from ob_tran.cpp alone. + "proj=ob_tran R=6400000 o_proj=moll o_proj=ob_tran", + }; + + @Test + @DisplayName("the validator reproduces proj 9.8.1's verdict on every probed definition") + void validatorAgreesWithTheOracle() { + List wrong = new ArrayList(); + for (Row r : ORACLE) { + GieFailure f = ProjDefinitionValidator.validate(GieProjArgs.parse(r.def)); + boolean saysInvalid = f != null; + if (saysInvalid != r.rejected) { + wrong.add(String.format("%-70s oracle=%s validator=%s (%s)%s", + r.def, r.rejected ? "REJECT" : "ACCEPT", + saysInvalid ? "REJECT" : "ACCEPT", r.note, + f == null ? "" : "\n " + f.message())); + } + } + assertTrue(wrong.isEmpty(), + "the validator disagrees with proj 9.8.1 on " + wrong.size() + " of " + + ORACLE.length + " probed definitions:\n " + + String.join("\n ", wrong)); + } + + @Test + @DisplayName("the transcript asserts both verdicts, so it cannot be satisfied by a stub") + void theOracleTranscriptExercisesBothVerdicts() { + int rejects = 0; + int accepts = 0; + for (Row r : ORACLE) { + if (r.rejected) { + rejects++; + } else { + accepts++; + } + } + assertTrue(accepts >= 30, "only " + accepts + " ACCEPT rows; a validator that " + + "refused everything would pass a REJECT-only transcript"); + assertTrue(rejects >= 30, "only " + rejects + " REJECT rows"); + assertEquals(ORACLE.length, rejects + accepts); + } + + @Test + @DisplayName("guards needing pj_msfn/pj_tsfn/pj_mlfn are honestly reported as not modelled") + void unmodelledGuardsStayValid() { + for (String def : UNMODELLED) { + GieFailure f = ProjDefinitionValidator.validate(GieProjArgs.parse(def)); + assertEquals(null, f, def + " is now classified INVALID_DEFINITION. proj 9.8.1 " + + "does reject it, but on an eccentricity guard this class does not " + + "model - so either the guard was ported (update this list) or the " + + "rejection is coming from somewhere it should not."); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjTables.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjTables.java new file mode 100644 index 0000000..0a00005 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjTables.java @@ -0,0 +1,167 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * PROJ 9.8.1's own name tables, vendored verbatim. + * + *

Why these exist. Without them, "proj4j rejected this name" is + * ambiguous: it could mean the definition is bad (which some {@code expect failure} + * rows assert) or that proj4j's table is smaller than PROJ's (which is a gap). The + * distinction is not guessable, and getting it wrong makes + * {@link GieFailureKind#INVALID_DEFINITION} meaningless. With these tables it is + * decidable by lookup: + * + *

    + *
  • name absent from PROJ's table → PROJ errors too → + * {@link GieFailureKind#INVALID_DEFINITION};
  • + *
  • name present in PROJ's table but not resolvable by proj4j → + * {@link GieFailureKind#NOT_IMPLEMENTED}.
  • + *
+ * + *

Extracted at rev {@code 9.8.1} = + * {@code f08fa86c478c4bbbf003b1ec751dd84aa6eca486} with + * {@code git -C /Volumes/git/PROJ show 9.8.1:}. Counts are asserted by + * {@code ProjTablesTest} so a silent transcription slip cannot pass. + */ +public final class ProjTables { + + private ProjTables() { + } + + /** + * All 186 operator names {@code +proj=} accepts, from + * {@code src/pj_list.h}'s {@code PROJ_HEAD(...)} entries. proj4j's + * {@code Registry} maps 93 of them. + */ + public static final Set OPERATORS = set( + "adams_hemi", "adams_ws1", "adams_ws2", "aea", "aeqd", "affine", "airocean", "airy", + "aitoff", "alsk", "apian", "august", "axisswap", "bacon", "bertin1953", "bipc", + "boggs", "bonne", "calcofi", "cart", "cass", "cc", "ccon", "cea", "chamb", + "col_urban", "collg", "comill", "crast", "defmodel", "deformation", "denoy", + "eck1", "eck2", "eck3", "eck4", "eck5", "eck6", "eqc", "eqdc", "eqearth", "etmerc", + "euler", "fahey", "fouc", "fouc_s", "gall", "geoc", "geocent", "geogoffset", "geos", + "gins8", "gn_sinu", "gnom", "goode", "gridshift", "gs48", "gs50", "gstmerc", "guyou", + "hammer", "hatano", "healpix", "helmert", "hgridshift", "horner", "igh", "igh_o", + "imoll", "imoll_o", "imw_p", "isea", "kav5", "kav7", "krovak", "labrd", "laea", + "lagrng", "larr", "lask", "latlon", "latlong", "lcc", "lcca", "leac", "lee_os", + "longlat", "lonlat", "loxim", "lsat", "mbt_fps", "mbt_s", "mbtfpp", "mbtfpq", + "mbtfps", "merc", "mil_os", "mill", "misrsom", "mod_krovak", "moll", "molobadekas", + "molodensky", "murd1", "murd2", "murd3", "natearth", "natearth2", "nell", "nell_h", + "nicol", "noop", "nsper", "nzmg", "ob_tran", "ocea", "oea", "omerc", "ortel", + "ortho", "patterson", "pconic", "peirce_q", "pipeline", "poly", "pop", "push", + "putp1", "putp2", "putp3", "putp3p", "putp4p", "putp5", "putp5p", "putp6", "putp6p", + "qsc", "qua_aut", "rhealpix", "robin", "rouss", "rpoly", "s2", "sch", "set", "sinu", + "som", "somerc", "spilhaus", "stere", "sterea", "tcc", "tcea", "times", "tinshift", + "tissot", "tmerc", "tobmerc", "topocentric", "tpeqd", "tpers", "unitconvert", "ups", + "urm5", "urmfps", "utm", "vandg", "vandg2", "vandg3", "vandg4", "vertoffset", + "vgridshift", "vitk1", "wag1", "wag2", "wag3", "wag4", "wag5", "wag6", "wag7", + "webmerc", "weren", "wink1", "wink2", "wintri", "xyzgridshift"); + + /** + * The 46 built-in ellipsoid ids, from {@code src/ellps.cpp}. proj4j's + * {@code Registry} carries 44 of these plus none of its own beyond + * {@code NAD27}/{@code NAD83}, which PROJ does not have as ellipsoid names. + */ + public static final Set ELLIPSOIDS = set( + "airy", "andrae", "APL4.9", "aust_SA", "bess_nam", "bessel", "clrk66", "clrk80", + "clrk80ign", "CPM", "danish", "delmbr", "engelis", "evrst30", "evrst48", "evrst56", + "evrst69", "evrstSS", "fschr60", "fschr60m", "fschr68", "GRS67", "GRS80", "GSK2011", + "helmert", "hough", "IAU76", "intl", "kaula", "krass", "lerch", "MERIT", "mod_airy", + "mprts", "new_intl", "NWL9D", "plessis", "PZ90", "SEasia", "SGS85", "sphere", + "walbeck", "WGS60", "WGS66", "WGS72", "WGS84"); + + /** + * The 10 built-in datum ids, from {@code src/datums.cpp}. proj4j's + * {@code Registry} carries exactly the same ten, so an unknown {@code +datum} + * is unambiguously an {@link GieFailureKind#INVALID_DEFINITION}. + */ + public static final Set DATUMS = set( + "WGS84", "GGRS87", "NAD83", "NAD27", "potsdam", "carthage", "hermannskogel", + "ire65", "nzgd49", "OSGB36"); + + /** + * The 21 unit ids {@code +units}/{@code +vunits} accept, from + * {@code src/units.cpp}. Anything else is an error in PROJ + * ({@code "unknown units"}). + * + *

Corrected from 24. This set previously included {@code rad}, {@code deg} and + * {@code grad}, on the reasoning that {@code units.cpp} lists them. It does, but + * {@code +units} resolves against {@code pj_list_linear_units()} only, so all three + * are {@code "Invalid value for units"} upstream — verified against PROJ 9.8.1, not inferred + * from the table they appear in. They are angular units, reachable through {@code +xy_in}/ + * {@code +xy_out} on {@code unitconvert}, never through {@code +units}. + * + *

proj4j's {@code Units.findUnits} is a trap here: it returns + * {@link org.locationtech.proj4j.units.Units#METRES} for any + * unrecognised name, so {@code +units=cm} silently became metres. The seven linear units it + * omitted ({@code fath ch link us-ch ind-yd ind-ft ind-ch}) have since been added, so + * {@link #proj4jResolvesUnit(String)} now resolves all 21. + */ + public static final Set UNITS = set( + "km", "m", "dm", "cm", "mm", "kmi", "in", "ft", "yd", "mi", "fath", "ch", "link", + "us-in", "us-ft", "us-yd", "us-ch", "us-mi", "ind-yd", "ind-ft", "ind-ch"); + + /** + * The 14 named prime meridians, from {@code pj_prime_meridians} in + * {@code src/datums.cpp}. Anything else must parse as a DMS or decimal angle, or + * PROJ errors. + */ + public static final Set PRIME_MERIDIANS = set( + "greenwich", "lisbon", "paris", "bogota", "madrid", "rome", "bern", "jakarta", + "ferro", "brussels", "stockholm", "athens", "oslo", "copenhagen"); + + /** + * The operators whose {@code pj_io_units} are {@code RADIANS} on both + * sides, so a forward run is compared geodesically rather than in metres. + * Every other {@code PROJ_HEAD} projection defaults to + * {@code left = RADIANS, right = CLASSIC} ({@code proj_internal.h:882-883}). + */ + public static final Set ANGULAR_BOTH_SIDES = set( + "longlat", "latlong", "lonlat", "latlon"); + + /** Whether {@code name} is an operator PROJ 9.8.1 knows. */ + public static boolean isProjOperator(String name) { + return name != null && OPERATORS.contains(name); + } + + /** + * Whether proj4j's {@code Units} table really resolves {@code id}, as opposed + * to silently substituting metres. {@code Units.findUnits} returns + * {@code METRES} rather than {@code null} for an unknown name, so presence has + * to be established by checking that the returned unit actually answers to the + * name asked for. + */ + public static boolean proj4jResolvesUnit(String id) { + if (id == null) { + return false; + } + org.locationtech.proj4j.units.Unit u = org.locationtech.proj4j.units.Units.findUnits(id); + if (u == null) { + return false; + } + return id.equals(u.abbreviation) || id.equals(u.name) || id.equals(u.plural); + } + + private static Set set(String... values) { + return Collections.unmodifiableSet(new LinkedHashSet(Arrays.asList(values))); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjTablesTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjTablesTest.java new file mode 100644 index 0000000..da6ef1c --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/ProjTablesTest.java @@ -0,0 +1,161 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.Registry; + +class ProjTablesTest { + + /** + * Table sizes, pinned. A vendored table that has quietly lost an entry is worse + * than no table: it would silently reclassify a legal definition as + * {@link GieFailureKind#INVALID_DEFINITION} and make an {@code expect failure} + * row pass for the wrong reason. + */ + @Test + @DisplayName("the vendored PROJ 9.8.1 tables have their measured sizes") + void tableSizes() { + assertEquals(186, ProjTables.OPERATORS.size(), + "PROJ_HEAD entries in 9.8.1:src/pj_list.h"); + assertEquals(46, ProjTables.ELLIPSOIDS.size(), "9.8.1:src/ellps.cpp"); + assertEquals(10, ProjTables.DATUMS.size(), "9.8.1:src/datums.cpp"); + // 21, not 24: rad/deg/grad appear in units.cpp but +units resolves against + // pj_list_linear_units() only, so all three are "Invalid value for units" upstream. + // Verified against PROJ 9.8.1 rather than inferred from the table they sit in. + assertEquals(21, ProjTables.UNITS.size(), "9.8.1:src/units.cpp, linear units only"); + assertEquals(14, ProjTables.PRIME_MERIDIANS.size(), "9.8.1:src/datums.cpp pj_prime_meridians"); + } + + @Test + @DisplayName("spot checks against upstream, including the names only 9.x has") + void spotChecks() { + assertTrue(ProjTables.isProjOperator("pipeline")); + assertTrue(ProjTables.isProjOperator("spilhaus"), "added in 9.x"); + assertTrue(ProjTables.isProjOperator("s2"), "added in 9.x"); + assertTrue(ProjTables.isProjOperator("mod_krovak")); + assertTrue(ProjTables.isProjOperator("etmerc"), "live operator with no doc page"); + assertTrue(ProjTables.isProjOperator("geocent"), "live operator with no doc page"); + assertFalse(ProjTables.isProjOperator("not_a_projection")); + assertFalse(ProjTables.isProjOperator(null)); + + assertTrue(ProjTables.ELLIPSOIDS.contains("GSK2011"), "9.x addition"); + assertTrue(ProjTables.ELLIPSOIDS.contains("danish")); + assertFalse(ProjTables.ELLIPSOIDS.contains("NAD83"), + "NAD83 is a proj4j-only ellipsoid alias; PROJ has it only as a datum"); + assertTrue(ProjTables.DATUMS.contains("NAD83")); + } + + @Test + @DisplayName("proj4j resolves 93 of PROJ's 186 operators") + void registryCoverage() { + Registry registry = new Registry(); + List resolvable = new ArrayList(); + List missing = new ArrayList(); + for (String name : ProjTables.OPERATORS) { + if (Proj4jCapabilities.resolvable(registry, name)) { + resolvable.add(name); + } else { + missing.add(name); + } + } + System.out.println("PROJ 9.8.1 operators resolvable by proj4j's Registry: " + + resolvable.size() + " of " + ProjTables.OPERATORS.size()); + System.out.println(" missing (" + missing.size() + "): " + missing); + assertTrue(resolvable.size() >= 80, + "only " + resolvable.size() + " operators resolve; expected around 90"); + // Was: all three of alsk/apian/bacon were registered against the ABSTRACT Projection + // class, whose project() is the identity - so they returned lon/lat as though it were + // projected metres. alsk alone was 16 silently-wrong builtins.gie assertions. + // + // apian and bacon are now real implementations (bacon.cpp, shared base), so they must + // resolve. Asserting they do NOT would re-pin the defect. + assertTrue(resolvable.contains("apian"), "apian is implemented now"); + assertTrue(resolvable.contains("bacon"), "bacon is implemented now"); + // alsk resolves too, as of the mod_ster port: Registry now binds it to + // AlaskaModifiedStereographicProjection. It spent one stage failing closed with an + // honest "registered but not implemented" message - which was already an improvement + // on the original false "Unknown projection: alsk" - and is now implemented. + assertTrue(resolvable.contains("alsk"), "alsk is implemented now (mod_ster ported)"); + } + + @Test + @DisplayName("Units.findUnits' metres fallback is detected, not trusted") + void unitResolutionDetectsTheMetresFallback() { + assertTrue(ProjTables.proj4jResolvesUnit("m")); + assertTrue(ProjTables.proj4jResolvesUnit("km")); + assertTrue(ProjTables.proj4jResolvesUnit("us-ft")); + // findUnits returns METRES rather than null for anything it does not know, + // so absence has to be detected by asking whether the unit it handed back + // actually answers to the name requested. + assertFalse(ProjTables.proj4jResolvesUnit("furlong")); + assertFalse(ProjTables.proj4jResolvesUnit(null)); + // Was: assertFalse(..."ind-yd"..., "proj4j has no Indian units"). It has them now - + // fath, ch, link, us-ch, ind-yd, ind-ft and ind-ch were all added to core's Units + // table, where every one of them had previously resolved silently to METRES. + assertTrue(ProjTables.proj4jResolvesUnit("ind-yd"), "the Indian units were added"); + + // The gap has closed: proj4j now resolves all 21 linear unit ids +units accepts. + // This assertion is inverted from what it was. It used to say "if proj4j now + // resolves every PROJ unit, delete the +units gap check in + // Proj4jGieOperationFactory.classifyTokens rather than leaving dead code" - i.e. it + // was written to fire exactly once, on the day the gap closed, and be replaced. + // That day is today. + // + // The gap check is retained deliberately rather than deleted, because UNITS is a + // fact about PROJ and could grow: PROJ adding a unit must show up as a classified + // gap, not as a silent metres fallback. Units.findUnits() returns METRES for ANY + // unrecognised name, so the fallback is still live and still dangerous - which is + // why proj4jResolvesUnit asks whether the returned unit answers to the requested + // name rather than trusting a non-null result. + List unresolvable = new ArrayList(); + for (String id : ProjTables.UNITS) { + if (!ProjTables.proj4jResolvesUnit(id)) { + unresolvable.add(id); + } + } + assertEquals(Collections.emptyList(), unresolvable, + "proj4j should resolve all " + ProjTables.UNITS.size() + " linear unit ids " + + "+units accepts. If PROJ has gained one, add it to core's Units " + + "table - do NOT let it fall back to METRES."); + } + + @Test + @DisplayName("every ellipsoid PROJ has is either in proj4j's Registry or knowably absent") + void ellipsoidCoverage() { + Registry registry = new Registry(); + List missing = new ArrayList(); + for (String name : ProjTables.ELLIPSOIDS) { + if (registry.getEllipsoid(name) == null) { + missing.add(name); + } + } + System.out.println("PROJ ellipsoids absent from proj4j's Registry (" + + missing.size() + "): " + missing); + // This is a report, not a bar: the point is that the gap is enumerable, so + // an unknown +ellps can be classified rather than guessed at. + assertTrue(missing.size() < ProjTables.ELLIPSOIDS.size()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/SingleProjectionOperation.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/SingleProjectionOperation.java new file mode 100644 index 0000000..6d053cc --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/SingleProjectionOperation.java @@ -0,0 +1,277 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * A gie {@code operation} that resolved to exactly one proj4j + * {@link Projection}. + * + *

Radians in, radians out on the angular side. Forward runs go through + * {@code Projection.projectRadians}, inverse runs through + * {@code Projection.inverseProjectRadians}. The runner owns the degree conversion + * that gie's {@code torad_coord}/{@code todeg_coord} perform, so nothing here + * converts degrees. + * + *

Two pieces of PROJ's host layer are reproduced here, because they + * decide pass versus fail and proj4j has no equivalent: + * + *

    + *
  1. {@code fwd_prepare}'s angular pre-check ({@code 9.8.1:src/fwd.cpp:40-80}), + * gated on {@code INPUT_UNITS == PJ_IO_UNITS_RADIANS} — which for a + * projection means the forward direction only, since {@code inv.cpp} defines + * {@code INPUT_UNITS} as {@code P->right} and that is {@code CLASSIC}. It + * rejects {@code |phi| - pi/2 > 1e-12} and {@code |lambda| > 10} radians with + * {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD}, then clamps + * {@code phi} into {@code [-pi/2, pi/2]}. 244 of the corpus's + * {@code expect failure} assertions come from this check and from no + * projection's own logic, so omitting it would turn 244 correct failures + * into wrong answers. Note the bound is 10 radians (about +/-573 + * degrees), not 180 degrees — rejecting +/-180 would be stricter than PROJ.
  2. + *
  3. A non-finite result is a failure, not a coordinate. proj4j returns + * {@code NaN} silently in dozens of places, and the whole point of the + * exercise is that a failure must never be expressed as a plausible number. + * The one carve-out is PROJ's documented "when given NaNs, return NaNs" + * ({@code more_builtins.gie:791}): if the corresponding input ordinate was + * itself {@code NaN}, the {@code NaN} output is returned so the comparator's + * NaN-both-sides branch can fire. Infinities are always failures.
  4. + *
+ * + *

Not thread-safe: proj4j's {@code Projection} objects are mutable, and + * {@code +proj=cass} writes 17 instance fields on the hot path. + */ +final class SingleProjectionOperation implements GieOperation { + + /** {@code PJ_EPS_LAT}, in radians. */ + static final double EPS_LAT = 1e-12; + + /** {@code M_HALFPI}. */ + static final double HALF_PI = Math.PI / 2.0; + + /** {@code fwd_prepare}'s longitude bound, in radians. */ + static final double MAX_LAM = 10.0; + + private final String definition; + private final Projection projection; + private final GieIoUnits left; + private final GieIoUnits right; + private final boolean inverted; + /** + * Whether proj4j's projection speaks degrees on its non-angular side, which is + * true exactly for the {@code longlat} family: {@code LongLatProjection} + * installs {@code Units.DEGREES}, so {@code projectRadians} multiplies its + * output by {@code RTD} and {@code inverseProjectRadians} expects degrees in. + * PROJ's {@code longlat} is {@code RADIANS} on both sides, so the extra + * conversion has to be undone. + */ + private final boolean degreeSided; + + private GieFailure lastFailure; + + SingleProjectionOperation(String definition, Projection projection, GieIoUnits left, + GieIoUnits right, boolean inverted, boolean degreeSided) { + this.definition = definition; + this.projection = projection; + this.left = left; + this.right = right; + this.inverted = inverted; + this.degreeSided = degreeSided; + } + + /** The proj4j projection, for tests and reports. */ + Projection projection() { + return projection; + } + + @Override + public boolean isUsable() { + return true; + } + + @Override + public GieFailure failure() { + return null; + } + + @Override + public GieIoUnits leftUnits() { + return left; + } + + @Override + public GieIoUnits rightUnits() { + return right; + } + + @Override + public boolean isInverted() { + return inverted; + } + + @Override + public boolean crsDstIsLatLonOrYX() { + // See GieOperation#crsDstIsLatLonOrYX: proj4j has no axis metadata. + return false; + } + + @Override + public GieFailure lastFailure() { + return lastFailure; + } + + @Override + public double[] transform(double[] in, GieDirection dir) { + lastFailure = null; + if (in == null || in.length < 2) { + lastFailure = GieFailures.of(GieFailureKind.INVALID_COORD, + "a coordinate needs at least two ordinates"); + return null; + } + // proj_trans() negates the direction when P->inverted (src/trans.cpp). + GieDirection eff = inverted ? dir.opposite() : dir; + + double x = in[0]; + double y = in[1]; + double z = in.length > 2 ? in[2] : 0.0; + double t = in.length > 3 ? in[3] : 0.0; + + // fwd.cpp defines INPUT_UNITS as P->left; inv.cpp as P->right. The check + // is on the raw enum value, so CLASSIC never triggers it. + GieIoUnits inputUnits = eff == GieDirection.FORWARD ? left : right; + if (eff == GieDirection.FORWARD && inputUnits == GieIoUnits.RADIANS) { + if (x == Double.POSITIVE_INFINITY || y == Double.POSITIVE_INFINITY + || z == Double.POSITIVE_INFINITY) { + lastFailure = GieFailures.of(GieFailureKind.INVALID_COORD, + "HUGE_VAL ordinate: fwd_prepare returns proj_coord_error()"); + return null; + } + if (Math.abs(y) - HALF_PI > EPS_LAT) { + lastFailure = GieFailures.of(GieFailureKind.INVALID_COORD, + "Invalid latitude: |phi| - pi/2 = " + (Math.abs(y) - HALF_PI) + + " rad exceeds PJ_EPS_LAT (fwd.cpp:62)"); + return null; + } + if (x > MAX_LAM || x < -MAX_LAM) { + lastFailure = GieFailures.of(GieFailureKind.INVALID_COORD, + "Invalid longitude: " + x + " rad is outside +/-10 (fwd.cpp:68)"); + return null; + } + // Clamp latitude into [-pi/2, pi/2] (fwd.cpp:75-78). + if (y > HALF_PI) { + y = HALF_PI; + } else if (y < -HALF_PI) { + y = -HALF_PI; + } + } + + ProjCoordinate src = new ProjCoordinate(x, y, z); + ProjCoordinate dst = new ProjCoordinate(); + // Poison the destination so a projection that never writes it cannot pass + // the input through as a plausible result. + dst.x = Double.NaN; + dst.y = Double.NaN; + dst.z = Double.NaN; + + try { + if (eff == GieDirection.FORWARD) { + projection.projectRadians(src, dst); + if (degreeSided) { + // LongLatProjection emitted degrees; PROJ's longlat is RADIANS. + dst.x *= ProjectionMath.DTR; + dst.y *= ProjectionMath.DTR; + } + } else { + if (degreeSided) { + src.x *= ProjectionMath.RTD; + src.y *= ProjectionMath.RTD; + } + projection.inverseProjectRadians(src, dst); + } + } catch (Throwable e) { + GieFailure f = Proj4jGieOperationFactory.mapTransformThrowable(e); + if (f == null) { + // Not ours to swallow (OutOfMemoryError and friends). + if (e instanceof RuntimeException) { + throw (RuntimeException) e; + } + throw (Error) e; + } + lastFailure = f; + return null; + } + + double ox = dst.x; + double oy = dst.y; + + // z: use what the operation WROTE if it wrote anything, else pass the input + // through. The two cases are distinguishable only because dst.z was poisoned to + // NaN above - a 2D operator leaves that poison in place, a 3D one overwrites it. + // + // This used to be an unconditional `double oz = z;`, with the comment "proj4j is + // 2D: z and t pass through untouched, as PROJ's own 2D operators do." That was + // true when written and is not any more: `GeocentProjection` is 3D-native, + // `vgridshift` writes a geoid-corrected height, and `CartConversion` is a full + // 3D port. Substituting the *input* z for a 3D operator's output silently + // converts honest skips into wrong answers - measured at 6.35-6.38e6 m on the + // `more_builtins.gie` cart block, which is the radius of the Earth, i.e. the + // difference between a geocentric Z and a height above the ellipsoid. + // + // A 3D operator that genuinely emits a NaN z from finite input falls back to + // pass-through here rather than reporting NaN. That is a numerical failure the + // finiteness postcondition should already have caught upstream of this point, so + // it is not silently absorbed; if it ever shows up, fix it there, not here. + double oz = Double.isNaN(dst.z) ? z : dst.z; + double ot = t; + + GieFailure nf = nonFinite(ox, x, "x"); + if (nf == null) { + nf = nonFinite(oy, y, "y"); + } + if (nf != null) { + lastFailure = nf; + return null; + } + return new double[] {ox, oy, oz, ot}; + } + + /** + * A non-finite output ordinate is a {@link GieFailureKind#NUMERICAL} failure, + * unless the matching input ordinate was itself {@code NaN} — PROJ's + * documented "when given NaNs, return NaNs". + */ + private GieFailure nonFinite(double out, double in, String which) { + if (!Double.isNaN(out) && !Double.isInfinite(out)) { + return null; + } + if (Double.isNaN(out) && Double.isNaN(in)) { + return null; + } + return GieFailures.of(GieFailureKind.NUMERICAL, + "non-finite " + which + " = " + out + " from finite input " + in + + " (" + definition + ")"); + } + + @Override + public String toString() { + return "SingleProjectionOperation[" + definition + ", left=" + left + ", right=" + right + + (inverted ? ", inverted" : "") + "]"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/UnusableOperation.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/UnusableOperation.java new file mode 100644 index 0000000..a62779c --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/bridge/UnusableOperation.java @@ -0,0 +1,89 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.bridge; + +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * An operation the bridge classified rather than built. {@link #transform} always + * returns {@code null} and reports the same construction failure, so a runner that + * calls it anyway cannot mistake the outcome for a coordinate. + */ +final class UnusableOperation implements GieOperation { + + private final GieFailure failure; + private final GieIoUnits left; + private final GieIoUnits right; + + UnusableOperation(GieFailure failure) { + this(failure, GieIoUnits.RADIANS, GieIoUnits.CLASSIC); + } + + UnusableOperation(GieFailure failure, GieIoUnits left, GieIoUnits right) { + if (failure == null) { + throw new IllegalArgumentException("an unusable operation must carry a failure"); + } + this.failure = failure; + this.left = left; + this.right = right; + } + + @Override + public boolean isUsable() { + return false; + } + + @Override + public GieFailure failure() { + return failure; + } + + @Override + public GieIoUnits leftUnits() { + return left; + } + + @Override + public GieIoUnits rightUnits() { + return right; + } + + @Override + public boolean isInverted() { + return false; + } + + @Override + public boolean crsDstIsLatLonOrYX() { + return false; + } + + @Override + public double[] transform(double[] in, GieDirection dir) { + return null; + } + + @Override + public GieFailure lastFailure() { + return failure; + } + + @Override + public String toString() { + return "UnusableOperation[" + failure + "]"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionKey.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionKey.java new file mode 100644 index 0000000..c9575e4 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionKey.java @@ -0,0 +1,364 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A stable, human-readable identity for one {@code .gie} assertion. + * + *

Rendered form

+ * + *
+ *   gie/builtins.gie#137:4@3f9c1ab0
+ *   <corpus-relative path> '#' <operation-block index> ':' <assertion index> '@' <content hash>
+ * 
+ * + *

Why this composite, and not something simpler

+ * + *

The expected-outcome manifest is keyed per assertion and must survive two very different kinds + * of change: our code improving over ~14 stages, and upstream's corpus being + * re-vendored at a future PROJ revision. Each of the obvious single-field keys fails one of those: + * + *

    + *
  • File + line number is the most natural key and the worst one. Inserting a + * single test at the top of {@code builtins.gie} — upstream does this constantly — renumbers + * every one of the 2,185 expectations below it, so a re-vendor turns the whole file over as + * "removed" plus "added" and the baseline is destroyed. Line numbers are also not even stable + * within one file version, because a {@code \}-continued {@code operation} spans several + * physical lines.
  • + *
  • File + global ordinal (the n-th assertion in the file) is stable + * against reflow but not against insertion: adding one assertion shifts every later ordinal by + * one, and each shifted entry silently re-points at a different assertion. That is the + * dangerous failure mode — the manifest still parses, still matches, and now excuses the wrong + * test.
  • + *
  • A content hash alone is stable against both, but is not unique: the corpus + * repeats identical {@code expect} lines under different operations, and {@code builtins.gie} + * contains whole repeated accept/expect pairs. It also sorts randomly, so a regenerated + * manifest produces an unreadable diff.
  • + *
+ * + *

The composite takes the useful property from each: + * + *

    + *
  1. Corpus-relative path ({@code gie/builtins.gie}, {@code gigs/5110.gie.failing}). + * Groups the manifest by file, which is how humans and the per-file report read it.
  2. + *
  3. Operation-block index, 0-based, incremented by each {@code operation} verb + * and by each completed {@code crs_src}+{@code crs_dst} pair — the two things that + * {@code gie.cpp} treats as starting a new test object and that reset {@code direction}, + * {@code tolerance}, {@code ignore} and {@code skip_test}. Blocking by the thing that resets + * state means an edit inside one block cannot renumber another.
  4. + *
  5. Assertion index within the block, 0-based over {@code expect} and + * {@code roundtrip} in source order. Blocks are small (the GIGS files have exactly three, most + * {@code builtins.gie} blocks have a handful of assertions), so the blast radius of an + * insertion is one block, not one file.
  6. + *
  7. An 8-hex-digit content hash of the normalised assertion text + * together with the normalised operation definition. This is the anti-silent-repoint + * guard: if upstream edits either the coordinate being asserted or the projection definition it + * is asserted against, the hash changes, so the old key vanishes and a new one appears. The + * diff then reports {@code DISAPPEARED} + {@code NEW} — loud, reviewable — instead of quietly + * carrying an expected-failure excuse over to an assertion nobody has ever run. The operation + * text is included because {@code expect 1 2} is meaningless without it; two blocks can hold + * byte-identical assertions that mean entirely different things.
  8. + *
+ * + *

8 hex digits (32 bits of SHA-1) is deliberately short: it has to be readable in a TSV line and + * typed into a {@code grep}. Collisions only matter within one (path, block, index) triple, + * where there is exactly one assertion, so the hash is a change-detector rather than a discriminator + * and 32 bits is ample. SHA-1 is used as a content fingerprint, never for security. + * + *

Normalisation

+ * + *

{@link #normalise(String)} implements a deliberately self-contained approximation of + * {@code pj_chomp} + {@code pj_shrink} ({@code 9.8.1:src/internal.cpp:153,192}): strip {@code #} + * comments, join {@code \} continuations, drop {@code +} and {@code ;}, collapse whitespace, and make + * {@code ,} and {@code =} greedy. It intentionally does not call into the {@code .gie} lexer. + * Assertion identity must change when upstream text changes and at no other time; if it were + * computed by the lexer, every refinement of our own parser would silently rewrite every key in the + * manifest and destroy the baseline. The cost of the duplication is that identity is insensitive to + * lexer-level distinctions (a purely cosmetic upstream reflow keeps its key) — which is exactly the + * behaviour wanted. + * + *

Ordering

+ * + *

The natural order is (path, block index, assertion index, hash): source order within a file, + * files alphabetically. A regenerated manifest therefore always lists the same assertion in the same + * place, so regeneration produces a minimal, reviewable diff. + * + *

Instances are immutable and safe to use as map and set keys. + */ +public final class AssertionKey implements Comparable { + + /** Digest used for {@link #contentHash(String, String)}. A fingerprint, not a security control. */ + public static final String CONTENT_HASH_ALGORITHM = "SHA-1"; + + /** Number of hex digits retained from the digest. */ + public static final int CONTENT_HASH_LENGTH = 8; + + private static final Pattern CONTENT_HASH_PATTERN = Pattern.compile("[0-9a-f]{" + CONTENT_HASH_LENGTH + "}"); + private static final Pattern WHITESPACE_RUN = Pattern.compile("\\s+"); + private static final Pattern GREEDY_PUNCTUATION = Pattern.compile("\\s*([,=])\\s*"); + private static final Pattern RENDERED = Pattern.compile("^(.+)#(\\d+):(\\d+)@([0-9a-f]{" + CONTENT_HASH_LENGTH + "})$"); + private static final char HASH_FIELD_SEPARATOR = 0x1f; + private static final String UTF_8 = "UTF-8"; + + private final String filePath; + private final int operationBlockIndex; + private final int assertionIndex; + private final String contentHash; + + private AssertionKey(String filePath, int operationBlockIndex, int assertionIndex, String contentHash) { + this.filePath = filePath; + this.operationBlockIndex = operationBlockIndex; + this.assertionIndex = assertionIndex; + this.contentHash = contentHash; + } + + /** + * Creates a key from an already-computed content hash. + * + * @param filePath corpus-relative path, e.g. {@code gie/builtins.gie}; may not be empty and may + * not contain {@code '#'}, a tab or a newline (the first would break {@link #parse(String)}, + * the others the TSV manifest) + * @param operationBlockIndex 0-based index of the enclosing operation block, non-negative + * @param assertionIndex 0-based index of the assertion within that block, non-negative + * @param contentHash exactly {@value #CONTENT_HASH_LENGTH} lower-case hex digits + * @return the key + * @throws IllegalArgumentException if any component is malformed + */ + public static AssertionKey of(String filePath, int operationBlockIndex, int assertionIndex, String contentHash) { + if (filePath == null || filePath.isEmpty()) { + throw new IllegalArgumentException("file path must not be empty"); + } + if (filePath.indexOf('#') >= 0 || filePath.indexOf('\t') >= 0 || filePath.indexOf('\n') >= 0) { + throw new IllegalArgumentException("file path must not contain '#', a tab or a newline: \"" + filePath + "\""); + } + if (operationBlockIndex < 0) { + throw new IllegalArgumentException("operation block index must be >= 0, was " + operationBlockIndex); + } + if (assertionIndex < 0) { + throw new IllegalArgumentException("assertion index must be >= 0, was " + assertionIndex); + } + if (contentHash == null || !CONTENT_HASH_PATTERN.matcher(contentHash).matches()) { + throw new IllegalArgumentException( + "content hash must be " + CONTENT_HASH_LENGTH + " lower-case hex digits, was \"" + contentHash + "\""); + } + return new AssertionKey(filePath, operationBlockIndex, assertionIndex, contentHash); + } + + /** + * Creates a key, computing the content hash from the assertion and its operation definition. + * + * @param filePath corpus-relative path + * @param operationBlockIndex 0-based operation-block index + * @param assertionIndex 0-based assertion index within the block + * @param operationDefinition the raw text of the governing {@code operation} (or the + * {@code crs_src}/{@code crs_dst} pair rendered as {@code " -> "}); may be + * {@code null} when no operation was in force + * @param assertionText the raw text of the {@code expect}/{@code roundtrip} line, conventionally + * including its verb and, for {@code expect}, the preceding {@code accept} — whatever the + * caller passes must be consistent across runs + * @return the key + */ + public static AssertionKey compute( + String filePath, + int operationBlockIndex, + int assertionIndex, + String operationDefinition, + String assertionText) { + return of(filePath, operationBlockIndex, assertionIndex, contentHash(operationDefinition, assertionText)); + } + + /** + * Computes the short content fingerprint of an assertion in the context of its operation. + * + * @param operationDefinition operation text, may be {@code null} + * @param assertionText assertion text, may be {@code null} + * @return {@value #CONTENT_HASH_LENGTH} lower-case hex digits + */ + public static String contentHash(String operationDefinition, String assertionText) { + MessageDigest digest; + try { + digest = MessageDigest.getInstance(CONTENT_HASH_ALGORITHM); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException(CONTENT_HASH_ALGORITHM + " is required by every JRE", e); + } + digest.update(utf8(normalise(operationDefinition))); + digest.update((byte) HASH_FIELD_SEPARATOR); + digest.update(utf8(normalise(assertionText))); + byte[] full = digest.digest(); + StringBuilder hex = new StringBuilder(CONTENT_HASH_LENGTH); + for (int i = 0; hex.length() < CONTENT_HASH_LENGTH; i++) { + int b = full[i] & 0xff; + hex.append(Character.forDigit(b >>> 4, 16)); + hex.append(Character.forDigit(b & 0x0f, 16)); + } + return hex.substring(0, CONTENT_HASH_LENGTH); + } + + /** + * Normalises {@code .gie} source text for hashing: a self-contained approximation of + * {@code pj_chomp} + {@code pj_shrink}. + * + *

Strips {@code #} comments, drops a trailing {@code \} continuation marker and joins lines + * with a single space, removes {@code +} and {@code ;}, collapses whitespace runs, removes + * whitespace around {@code ,} and {@code =}, and trims. Case is preserved: an upstream case change + * is a real change. + * + * @param text raw text, may be {@code null} + * @return the normalised form, never {@code null} + */ + public static String normalise(String text) { + if (text == null) { + return ""; + } + StringBuilder joined = new StringBuilder(text.length()); + String[] lines = text.split("\n", -1); + for (int i = 0; i < lines.length; i++) { + String line = lines[i].replace('\r', ' ').replace('\t', ' '); + int comment = line.indexOf('#'); + if (comment >= 0) { + line = line.substring(0, comment); + } + int end = line.length(); + while (end > 0 && line.charAt(end - 1) == ' ') { + end--; + } + line = line.substring(0, end); + if (line.endsWith("\\")) { + line = line.substring(0, line.length() - 1); + } + if (joined.length() > 0) { + joined.append(' '); + } + joined.append(line); + } + String shrunk = joined.toString().replace("+", "").replace(";", ""); + shrunk = WHITESPACE_RUN.matcher(shrunk).replaceAll(" "); + shrunk = GREEDY_PUNCTUATION.matcher(shrunk).replaceAll("$1"); + return shrunk.trim(); + } + + /** + * Parses the rendered form produced by {@link #toString()}. Strict: anything that does not match + * {@code #:@<8 hex>} is rejected. + * + * @param rendered the rendered key + * @return the parsed key + * @throws IllegalArgumentException if {@code rendered} is not a well-formed key + */ + public static AssertionKey parse(String rendered) { + if (rendered == null) { + throw new IllegalArgumentException("assertion key must not be null"); + } + Matcher matcher = RENDERED.matcher(rendered); + if (!matcher.matches()) { + throw new IllegalArgumentException( + "malformed assertion key (expected #:@<8 hex digits>): \"" + rendered + "\""); + } + int block; + int index; + try { + block = Integer.parseInt(matcher.group(2)); + index = Integer.parseInt(matcher.group(3)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("assertion key has out-of-range indices: \"" + rendered + "\"", e); + } + return of(matcher.group(1), block, index, matcher.group(4)); + } + + /** @return the corpus-relative file path, e.g. {@code gie/builtins.gie}. */ + public String filePath() { + return filePath; + } + + /** @return 0-based index of the operation block within the file. */ + public int operationBlockIndex() { + return operationBlockIndex; + } + + /** @return 0-based index of the assertion within its operation block. */ + public int assertionIndex() { + return assertionIndex; + } + + /** @return the {@value #CONTENT_HASH_LENGTH}-hex-digit content fingerprint. */ + public String contentHash() { + return contentHash; + } + + /** + * Total order: path, then operation block, then assertion index, then hash. This is source order + * within a file and alphabetical order across files, which is what makes a regenerated manifest + * diff minimally. + */ + @Override + public int compareTo(AssertionKey other) { + int byPath = filePath.compareTo(other.filePath); + if (byPath != 0) { + return byPath; + } + if (operationBlockIndex != other.operationBlockIndex) { + return operationBlockIndex < other.operationBlockIndex ? -1 : 1; + } + if (assertionIndex != other.assertionIndex) { + return assertionIndex < other.assertionIndex ? -1 : 1; + } + return contentHash.compareTo(other.contentHash); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof AssertionKey)) { + return false; + } + AssertionKey other = (AssertionKey) o; + return operationBlockIndex == other.operationBlockIndex + && assertionIndex == other.assertionIndex + && filePath.equals(other.filePath) + && contentHash.equals(other.contentHash); + } + + @Override + public int hashCode() { + int result = filePath.hashCode(); + result = 31 * result + operationBlockIndex; + result = 31 * result + assertionIndex; + result = 31 * result + contentHash.hashCode(); + return result; + } + + /** @return the rendered form, round-trippable through {@link #parse(String)}. */ + @Override + public String toString() { + return filePath + '#' + operationBlockIndex + ':' + assertionIndex + '@' + contentHash; + } + + private static byte[] utf8(String s) { + try { + return s.getBytes(UTF_8); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException("UTF-8 is required by every JRE", e); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionKeyTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionKeyTest.java new file mode 100644 index 0000000..8b4519a --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionKeyTest.java @@ -0,0 +1,225 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Test; + +class AssertionKeyTest { + + private static final String OPERATION = "+proj=utm +zone=32 +ellps=GRS80"; + private static final String ASSERTION = "accept 12 55; expect 691875.632 6098907.825"; + + @Test + void roundTripsThroughToStringAndParse() { + AssertionKey key = AssertionKey.of("gie/builtins.gie", 137, 4, "3f9c1ab0"); + assertEquals("gie/builtins.gie#137:4@3f9c1ab0", key.toString()); + AssertionKey reparsed = AssertionKey.parse(key.toString()); + assertEquals(key, reparsed); + assertEquals(key.hashCode(), reparsed.hashCode()); + assertEquals(key.toString(), reparsed.toString()); + } + + @Test + void roundTripsAComputedKey() { + AssertionKey key = AssertionKey.compute("gigs/5110.gie.failing", 2, 0, OPERATION, ASSERTION); + assertEquals(key, AssertionKey.parse(key.toString())); + } + + @Test + void roundTripsAPathContainingDotsDashesAndSpaces() { + AssertionKey key = AssertionKey.of("gie/dir with space/5101.4-jhs.gie.failing", 0, 0, "00000000"); + assertEquals(key, AssertionKey.parse(key.toString())); + assertEquals("gie/dir with space/5101.4-jhs.gie.failing", AssertionKey.parse(key.toString()).filePath()); + } + + @Test + void exposesItsComponents() { + AssertionKey key = AssertionKey.parse("gie/more_builtins.gie#75:11@deadbeef"); + assertEquals("gie/more_builtins.gie", key.filePath()); + assertEquals(75, key.operationBlockIndex()); + assertEquals(11, key.assertionIndex()); + assertEquals("deadbeef", key.contentHash()); + } + + @Test + void rejectsMalformedRenderings() { + String[] malformed = { + "gie/builtins.gie#0:0", // no hash + "gie/builtins.gie#0:0@abcd", // short hash + "gie/builtins.gie#0:0@ABCDEF01", // upper-case hash + "gie/builtins.gie#0:0@zzzzzzzz", // non-hex hash + "gie/builtins.gie#:0@abcdef01", // no block index + "gie/builtins.gie#0:@abcdef01", // no assertion index + "gie/builtins.gie#-1:0@abcdef01", // negative block index + "gie/builtins.gie#0.5:0@abcdef01", // non-integer block index + "#0:0@abcdef01", // no path + "gie/builtins.gie@abcdef01", // no separators + "gie/builtins.gie#0:0@abcdef01 ", // trailing space + "", + null, + }; + for (int i = 0; i < malformed.length; i++) { + final String rendered = malformed[i]; + assertThrows( + IllegalArgumentException.class, + () -> AssertionKey.parse(rendered), + "expected rejection of \"" + rendered + "\""); + } + } + + @Test + void rejectsMalformedComponents() { + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of("", 0, 0, "abcdef01")); + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of(null, 0, 0, "abcdef01")); + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of("a#b", 0, 0, "abcdef01")); + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of("a\tb", 0, 0, "abcdef01")); + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of("gie/x.gie", -1, 0, "abcdef01")); + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of("gie/x.gie", 0, -1, "abcdef01")); + assertThrows(IllegalArgumentException.class, () -> AssertionKey.of("gie/x.gie", 0, 0, "abcdefg1")); + } + + @Test + void ordersByPathThenBlockThenAssertionIndex() { + AssertionKey a = AssertionKey.of("gie/adams_ws1.gie", 0, 0, "00000001"); + AssertionKey b = AssertionKey.of("gie/builtins.gie", 0, 0, "00000002"); + AssertionKey c = AssertionKey.of("gie/builtins.gie", 0, 1, "00000003"); + AssertionKey d = AssertionKey.of("gie/builtins.gie", 2, 0, "00000004"); + AssertionKey e = AssertionKey.of("gigs/5110.gie.failing", 0, 0, "00000005"); + + List shuffled = new ArrayList(Arrays.asList(d, b, e, a, c)); + Collections.sort(shuffled); + assertEquals(Arrays.asList(a, b, c, d, e), shuffled); + } + + @Test + void ordersNumericallyNotLexicographicallyOnIndices() { + AssertionKey nine = AssertionKey.of("gie/builtins.gie", 9, 0, "00000001"); + AssertionKey ten = AssertionKey.of("gie/builtins.gie", 10, 0, "00000002"); + assertTrue(nine.compareTo(ten) < 0, "block 9 must sort before block 10, not after"); + AssertionKey a9 = AssertionKey.of("gie/builtins.gie", 0, 9, "00000001"); + AssertionKey a10 = AssertionKey.of("gie/builtins.gie", 0, 10, "00000002"); + assertTrue(a9.compareTo(a10) < 0, "assertion 9 must sort before assertion 10"); + } + + @Test + void orderIsATotalOrderConsistentWithEquals() { + AssertionKey a = AssertionKey.of("gie/builtins.gie", 1, 2, "0000000a"); + AssertionKey b = AssertionKey.of("gie/builtins.gie", 1, 2, "0000000b"); + AssertionKey aAgain = AssertionKey.of("gie/builtins.gie", 1, 2, "0000000a"); + assertEquals(0, a.compareTo(aAgain)); + assertEquals(a, aAgain); + assertTrue(a.compareTo(b) < 0); + assertTrue(b.compareTo(a) > 0); + assertNotEquals(a, b); + } + + @Test + void equalityConsidersEveryComponent() { + AssertionKey base = AssertionKey.of("gie/builtins.gie", 1, 2, "0000000a"); + assertNotEquals(base, AssertionKey.of("gie/other.gie", 1, 2, "0000000a")); + assertNotEquals(base, AssertionKey.of("gie/builtins.gie", 9, 2, "0000000a")); + assertNotEquals(base, AssertionKey.of("gie/builtins.gie", 1, 9, "0000000a")); + assertNotEquals(base, AssertionKey.of("gie/builtins.gie", 1, 2, "0000000b")); + assertNotEquals(base, "not a key"); + assertSame(base, base); + } + + @Test + void hashIsEightLowerCaseHexDigits() { + String hash = AssertionKey.contentHash(OPERATION, ASSERTION); + assertEquals(8, hash.length()); + assertTrue(hash.matches("[0-9a-f]{8}"), "hash was \"" + hash + "\""); + } + + @Test + void hashIsStableAcrossCalls() { + assertEquals(AssertionKey.contentHash(OPERATION, ASSERTION), AssertionKey.contentHash(OPERATION, ASSERTION)); + } + + @Test + void hashChangesWhenTheAssertionTextChanges() { + String edited = "accept 12 55; expect 691875.632 6098907.826"; + assertNotEquals(AssertionKey.contentHash(OPERATION, ASSERTION), AssertionKey.contentHash(OPERATION, edited)); + } + + @Test + void hashChangesWhenTheOperationDefinitionChanges() { + String edited = "+proj=utm +zone=33 +ellps=GRS80"; + assertNotEquals(AssertionKey.contentHash(OPERATION, ASSERTION), AssertionKey.contentHash(edited, ASSERTION)); + } + + @Test + void hashDistinguishesIdenticalAssertionsUnderDifferentOperations() { + AssertionKey underUtm32 = AssertionKey.compute("gie/builtins.gie", 0, 0, "+proj=utm +zone=32", ASSERTION); + AssertionKey underUtm33 = AssertionKey.compute("gie/builtins.gie", 0, 0, "+proj=utm +zone=33", ASSERTION); + assertNotEquals(underUtm32, underUtm33); + } + + @Test + void hashIsNotConfusedByFieldConcatenation() { + // "ab" + "c" must not hash the same as "a" + "bc". + assertNotEquals(AssertionKey.contentHash("ab", "c"), AssertionKey.contentHash("a", "bc")); + } + + @Test + void hashToleratesNullText() { + assertEquals(8, AssertionKey.contentHash(null, null).length()); + assertEquals(AssertionKey.contentHash(null, null), AssertionKey.contentHash("", "")); + } + + @Test + void normalisationCollapsesWhitespaceAndDropsPlusAndSemicolon() { + assertEquals("proj=aea ellps=GRS80", AssertionKey.normalise(" +proj=aea +ellps=GRS80 ")); + assertEquals("proj=aea ellps=GRS80", AssertionKey.normalise("proj = aea\tellps =\tGRS80")); + assertEquals("accept 12 55 expect 1 2", AssertionKey.normalise("accept 12 55; expect 1 2")); + } + + @Test + void normalisationStripsCommentsAndJoinsContinuations() { + String continued = "operation +proj=pipeline \\ # turn off dual datum shift\n +step +proj=utm +zone=32"; + assertEquals("operation proj=pipeline step proj=utm zone=32", AssertionKey.normalise(continued)); + } + + @Test + void normalisationMakesCommaGreedy() { + assertEquals("towgs84=0,0,0", AssertionKey.normalise("+towgs84 = 0 , 0 , 0")); + } + + @Test + void normalisationPreservesCaseBecauseAnUpstreamCaseChangeIsARealChange() { + assertNotEquals(AssertionKey.normalise("proj=UTM"), AssertionKey.normalise("proj=utm")); + } + + @Test + void cosmeticReflowDoesNotChangeTheKey() { + String original = "operation +proj=utm +zone=32 +ellps=GRS80"; + String reflowed = "operation +proj=utm \\\n +zone=32 +ellps=GRS80 # unchanged"; + assertEquals( + AssertionKey.compute("gie/builtins.gie", 0, 0, original, ASSERTION), + AssertionKey.compute("gie/builtins.gie", 0, 0, reflowed, ASSERTION)); + } + +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionOutcome.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionOutcome.java new file mode 100644 index 0000000..4852bec --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/AssertionOutcome.java @@ -0,0 +1,204 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * The outcome of evaluating a single {@code .gie} assertion ({@code expect} or {@code roundtrip}). + * + *

There are exactly four outcomes, and neither {@link #SKIP} nor + * {@link #VACUOUS_EXPECTED_FAILURE} is ever counted as a {@link #PASS}. Upstream + * {@code gie} exits with the number of failures and silently drops skips from the tally; that is + * adequate for a CLI exit code but useless as a progress metric, because a corpus that skips + * everything would report a clean run. Every tally in this package therefore reports the four as + * four separate numbers, and the headline metric counts only {@link #PASS} — over a denominator + * from which {@link #VACUOUS_EXPECTED_FAILURE} has been removed, because those assertions measured + * nothing at all. + * + *

Sources of {@link #SKIP}, per {@code 9.8.1:src/apps/gie.cpp}: + *

    + *
  • {@code require_grid } ({@code gie.cpp:566}) — when the named grid cannot be + * resolved, {@code skip_test} is set and every subsequent {@code expect} in the block + * becomes a skip, until the next {@code operation} or completed {@code crs_src}+{@code crs_dst} + * pair. Five uses in the corpus.
  • + *
  • {@code ignore } ({@code gie.cpp:561}) — when the operation's {@code errno} + * equals the ignored constant, the assertion is skipped. This check runs before the + * failure-expectation check in {@code expect}. Zero uses in the 9.8.1 corpus (superseded by + * {@code require_grid}), but the verb exists and must be honoured.
  • + *
+ * + *

A skipped assertion is neither evidence of correctness nor evidence of a defect: it is evidence + * that the run was not able to make a judgement. Folding it into either bucket falsifies the metric. + * The same is true, for a different reason, of {@link #VACUOUS_EXPECTED_FAILURE}. + */ +public enum AssertionOutcome { + + /** The observed coordinate (or failure) matched the expectation within tolerance. */ + PASS, + + /** + * The assertion was evaluated and did not match. Includes "failed to fail": an + * {@code expect failure} whose operation unexpectedly succeeded. + */ + FAIL, + + /** + * The assertion could not be evaluated — a missing grid ({@code require_grid}) or an ignored + * {@code errno} ({@code ignore}). Never a pass. + */ + SKIP, + + /** + * An {@code expect failure} row that "passed" without demonstrating anything: upstream {@code gie} + * would score it a success, but proj4j failed for a reason unrelated to what the row asserts. + * Never a pass, never a failure, and excluded from both sides of the headline ratio. + * + *

Why this outcome has to exist

+ * + *

{@code expect} accepts a failed transform as success iff the operation could not be created or + * the transform returned {@code HUGE_VAL} ({@code gie.cpp:1052-1072}). It cannot tell why + * either happened. So when proj4j has no implementation of a projection at all, every + * {@code expect failure} row in that projection's file "passes": PROJ built the operation and then + * rejected the coordinate as out-of-domain, proj4j never built the operation, both "failed", and the + * assertion is scored a success. {@code gie/adams_hemi.gie} is 388 rows of exactly this. Counting + * them is failure-to-implement being reported as conformance — the same falsification as + * counting a {@link #SKIP} as a {@link #PASS}, which is why the two live in the same enum with the + * same rule. + * + *

The classification rule

+ * + *

An {@code expect failure} row splits three ways. When the operation was created and + * the coordinate was rejected, proj4j and PROJ agreed about the domain and the row is a real + * {@link #PASS}. When the transform succeeded, the row is a real {@link #FAIL} ("failed to fail"). + * When the operation could not be created, the verdict depends on whether the row + * is asking for a definition to be rejected or for a coordinate to be rejected: + * + *

    + *
  • The corpus named a {@code coord_transfm*} or {@code no_inverse_op} errno. + * Those errnos can only be raised after {@code proj_create} succeeded, so the row asserts + * that PROJ built the operation. A construction failure here is + * {@code VACUOUS_EXPECTED_FAILURE} whatever proj4j calls it — including + * {@link org.locationtech.proj4j.conformance.bridge.GieFailureKind#INVALID_DEFINITION}, whose + * contract is "PROJ would reject this too" and which the corpus has just contradicted. This + * is how "an {@code INVALID_DEFINITION} that PROJ would in fact have accepted" is detected: + * by the corpus, not by asking the bridge to grade its own homework.
  • + *
  • Otherwise — an {@code invalid_op*} errno, an unrecognised errno name, or no errno at all — + * the row is (or may be) asking for the definition itself to be refused, and the verdict is + * proj4j's own classification: + *
      + *
    • {@code INVALID_DEFINITION} → {@link #PASS}. The bridge's documented claim is that + * PROJ 9.8.1 would refuse this definition too, so refusing it is the + * conformance being asserted. {@code gie/ellipsoid.gie}'s + * {@code expect failure errno invalid_op_illegal_arg_value} rows are the canonical case + * and they are real passes.
    • + *
    • {@code MISSING_GRID} → {@link #PASS} only under + * {@code invalid_op_file_not_found_or_invalid}, where the row asserts that PROJ could + * not find or read the file either. Otherwise vacuous.
    • + *
    • {@code NOT_IMPLEMENTED}, or anything else, → {@code VACUOUS_EXPECTED_FAILURE}. + * {@code NOT_IMPLEMENTED} is by definition a statement about proj4j's gaps rather than + * about the definition: a projection we cannot construct at all would "reject" every + * definition of it, valid ones included, so nothing has been demonstrated.
    • + *
    + *
  • + *
+ * + *

The boundary is drawn conservatively on purpose. Where a row's intent is ambiguous the outcome + * is vacuous, because an assertion wrongly called vacuous understates progress and is visible in + * the report, whereas one wrongly called a pass inflates the headline and is invisible. + * + *

One residual is known and deliberately left alone, because it is what upstream {@code gie} + * scores: a row that names an {@code invalid_op*} errno, where proj4j accepted the + * definition PROJ rejects and then happened to fail on the coordinate, is recorded as a + * {@link #PASS}. proj4j is laxer than PROJ there; the row is nonetheless a genuine coordinate-level + * agreement about that coordinate, and it is not a construction failure, which is what this + * classification is about. + * + *

Which files this reclassifies

+ * + *

Measured over the 9.8.1 corpus, the reclassified rows are concentrated in the files whose + * projection or operator proj4j does not implement at all — {@code gie/adams_hemi.gie} (388), + * {@code gie/guyou.gie} (386), {@code gie/peirce_q.gie} (80), {@code gie/adams_ws1.gie} and + * {@code gie/adams_ws2.gie} (57 each), and the pipeline-, grid- and deformation-dependent files + * {@code axisswap}, {@code defmodel}, {@code deformation}, {@code geotiff_grids}, {@code gridshift}, + * {@code tinshift}, {@code unitconvert} and {@code 4D-API_cs2cs-style}. {@code gie/ellipsoid.gie} + * is the file that most clearly does not reclassify: its rows exist to have a definition + * refused, proj4j refuses them as {@code INVALID_DEFINITION}, and they stay passes. See + * {@code target/conformance/expect-failures.tsv} for the per-file split as measured by the run in + * hand rather than as remembered here. + * + * @see org.locationtech.proj4j.conformance.runner.ExpectedFailureVerdict + */ + VACUOUS_EXPECTED_FAILURE; + + /** + * @return {@code true} only for {@link #PASS}; provided so callers cannot fumble the skip and + * vacuity rules + */ + public boolean isPass() { + return this == PASS; + } + + /** + * @return {@code true} for {@link #FAIL}, {@link #SKIP} and {@link #VACUOUS_EXPECTED_FAILURE} — + * i.e. "did not pass" + */ + public boolean isNotPass() { + return this != PASS; + } + + /** + * Whether this outcome represents a judgement about proj4j's conformance at all. + * + *

{@link #SKIP} and {@link #VACUOUS_EXPECTED_FAILURE} are both unmeasured, but they are not + * interchangeable and are always tallied apart: a skip declined to run, whereas a vacuous + * expected-failure ran and produced an answer that happens to carry no information. + * + * @return {@code false} for {@link #SKIP} and {@link #VACUOUS_EXPECTED_FAILURE} + */ + public boolean isMeasured() { + return this == PASS || this == FAIL; + } + + /** @return {@code true} only for {@link #VACUOUS_EXPECTED_FAILURE}. */ + public boolean isVacuous() { + return this == VACUOUS_EXPECTED_FAILURE; + } + + /** + * Parses an outcome name, strictly and case-sensitively. + * + * @param text the token, expected to be exactly {@code PASS}, {@code FAIL}, {@code SKIP} or + * {@code VACUOUS_EXPECTED_FAILURE} + * @return the outcome + * @throws IllegalArgumentException if the token is not one of the four names + */ + public static AssertionOutcome parse(String text) { + if (PASS.name().equals(text)) { + return PASS; + } + if (FAIL.name().equals(text)) { + return FAIL; + } + if (SKIP.name().equals(text)) { + return SKIP; + } + if (VACUOUS_EXPECTED_FAILURE.name().equals(text)) { + return VACUOUS_EXPECTED_FAILURE; + } + throw new IllegalArgumentException( + "not an assertion outcome (expected PASS, FAIL, SKIP or VACUOUS_EXPECTED_FAILURE): \"" + + text + "\""); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/BaselineRequirement.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/BaselineRequirement.java new file mode 100644 index 0000000..5d09f83 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/BaselineRequirement.java @@ -0,0 +1,196 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * The gate's precondition: a baseline must exist before a run can be compared against one. + * + *

The failure this exists to prevent

+ * + *

{@link ExpectedOutcomeManifest#empty()} and {@link CorpusIndex#empty()} are legitimate values — + * they mean "nothing is excused" and "the corpus was empty last time". Handing them to + * {@link ConformanceDiff} when the baseline files are simply absent is not legitimate, and it + * produces the worst possible outcome: with an empty index no observed key is + * {@code known}, so every assertion in the corpus classifies as {@link DiffClassification#NEW}; + * {@code NEW} does not fail the build; {@link DiffClassification#REGRESSED}, + * {@link DiffClassification#UNEXPECTED_PASS} and {@link DiffClassification#DISAPPEARED} are all + * necessarily zero; and {@code mvn -Pconformance verify} reports success however many assertions + * failed. + * + *

That is a green gate produced by an instrument that cannot see. It is indistinguishable, from the + * outside, from a gate that examined 7,923 assertions and approved of all of them. + * + *

What this class does and does not change

+ * + *

{@code NEW} remains non-build-failing: a genuinely new assertion — a re-vendor, or an upstream + * edit that changes a content hash — should be held to the "must pass" default and reported, not + * treated as a break. What must be distinguishable is "the entire corpus is new" from + * "there is no baseline". Those two produce identical diffs, so the distinction cannot live in + * the diff; it has to be made before the comparison, from the presence of the files. That is all this + * class is. + * + *

The diagnostics are deliberately not phrased as a count of regressions. A missing + * baseline reported as "5830 REGRESSED" sends the reader hunting for a regression that did not happen. + * Nothing regressed; the comparison never took place. + * + *

Every method is a pure function of its arguments, so the guard is unit-testable without a + * filesystem — and, more to the point, so it can be shown to fail on demand. A precondition + * check that has never been observed to fire is a claim, not a check. + */ +public final class BaselineRequirement { + + /** The checked-in baseline of non-passing assertions, relative to {@code src/test/resources}. */ + public static final String MANIFEST_FILE = "gie-expected-failures.tsv"; + + /** The checked-in corpus index, which must always travel with the manifest. */ + public static final String CORPUS_INDEX_FILE = "gie-corpus-index.tsv"; + + /** The one command that produces both files. */ + public static final String REGENERATE_COMMAND = "mvn -Pconformance verify -Dgie.regenerate=true"; + + private static final String NEWLINE = "\n"; + + private BaselineRequirement() {} + + /** + * Diagnoses the presence of the two baseline files. + * + * @param manifestPresent whether {@value #MANIFEST_FILE} was found + * @param indexPresent whether {@value #CORPUS_INDEX_FILE} was found + * @param searchedIn where the search looked, for the message; may be {@code null} + * @return {@code ""} if both files are present, otherwise the diagnostic + */ + public static String diagnosePresence(boolean manifestPresent, boolean indexPresent, String searchedIn) { + if (manifestPresent && indexPresent) { + return ""; + } + StringBuilder out = new StringBuilder(1024); + if (!manifestPresent && !indexPresent) { + out.append("CONFORMANCE BASELINE MISSING: neither ") + .append(MANIFEST_FILE) + .append(" nor ") + .append(CORPUS_INDEX_FILE) + .append(" was found.") + .append(NEWLINE); + } else { + String missing = manifestPresent ? CORPUS_INDEX_FILE : MANIFEST_FILE; + String present = manifestPresent ? MANIFEST_FILE : CORPUS_INDEX_FILE; + out.append("CONFORMANCE BASELINE INCOMPLETE: ") + .append(missing) + .append(" was not found, but ") + .append(present) + .append(" was.") + .append(NEWLINE) + .append("The two files are one baseline and must always travel together: the manifest") + .append(" records only the non-passing minority, so without the index a passing key's") + .append(" absence is not evidence of anything and the diff invents NEW/DISAPPEARED") + .append(" entries out of nothing.") + .append(NEWLINE); + } + appendWhereAndWhy(out, searchedIn); + return out.toString(); + } + + /** + * Diagnoses a baseline that is present but covers nothing — a truncated, hand-emptied or + * wrong-corpus index file. Its effect is identical to an absent one: every observed assertion is + * {@code NEW} and the gate cannot fail. + * + * @param indexKeyCount how many keys the loaded {@link CorpusIndex} holds + * @param observedAssertions how many assertions the run actually evaluated + * @param searchedIn where the baseline was read from, for the message; may be {@code null} + * @return {@code ""} if the index covers something or the run observed nothing, otherwise the + * diagnostic + */ + public static String diagnoseCoverage(int indexKeyCount, int observedAssertions, String searchedIn) { + if (indexKeyCount > 0 || observedAssertions <= 0) { + return ""; + } + StringBuilder out = new StringBuilder(1024); + out.append("CONFORMANCE BASELINE EMPTY: ") + .append(CORPUS_INDEX_FILE) + .append(" was found but holds 0 assertion keys, while this run evaluated ") + .append(observedAssertions) + .append(".") + .append(NEWLINE) + .append("An index that covers nothing gates nothing: it has exactly the effect of having no") + .append(" baseline at all.") + .append(NEWLINE); + appendWhereAndWhy(out, searchedIn); + return out.toString(); + } + + /** + * @param manifestPresent whether {@value #MANIFEST_FILE} was found + * @param indexPresent whether {@value #CORPUS_INDEX_FILE} was found + * @param searchedIn where the search looked, for the message; may be {@code null} + * @throws MissingBaselineException if either file is absent + */ + public static void requirePresence(boolean manifestPresent, boolean indexPresent, String searchedIn) { + String diagnostic = diagnosePresence(manifestPresent, indexPresent, searchedIn); + if (!diagnostic.isEmpty()) { + throw new MissingBaselineException(diagnostic); + } + } + + /** + * @param indexKeyCount how many keys the loaded {@link CorpusIndex} holds + * @param observedAssertions how many assertions the run evaluated + * @param searchedIn where the baseline was read from, for the message; may be {@code null} + * @throws MissingBaselineException if the index covers nothing while the run observed something + */ + public static void requireCoverage(int indexKeyCount, int observedAssertions, String searchedIn) { + String diagnostic = diagnoseCoverage(indexKeyCount, observedAssertions, searchedIn); + if (!diagnostic.isEmpty()) { + throw new MissingBaselineException(diagnostic); + } + } + + private static void appendWhereAndWhy(StringBuilder out, String searchedIn) { + if (searchedIn != null && !searchedIn.trim().isEmpty()) { + out.append("Searched: ").append(searchedIn).append(NEWLINE); + } + out.append(NEWLINE) + .append("NOTHING HAS REGRESSED. This is not a conformance failure and no assertion is being") + .append(" reported as broken: the comparison never happened. Without a baseline every") + .append(" observed assertion classifies as NEW, NEW does not fail the build, and REGRESSED,") + .append(" UNEXPECTED_PASS and DISAPPEARED are all necessarily zero -- so this build would") + .append(" otherwise have reported SUCCESS no matter how many assertions failed.") + .append(NEWLINE) + .append(NEWLINE) + .append("Generate the baseline (writes both files; commit them in the same commit):") + .append(NEWLINE) + .append(" ") + .append(REGENERATE_COMMAND) + .append(NEWLINE); + } + + /** + * Thrown when the gate is asked to compare a run against a baseline that is absent or empty. + * + *

An {@link IllegalStateException} rather than an {@code AssertionError}, because it is not an + * assertion about proj4j's conformance: it is a statement that conformance was not measured. + */ + public static final class MissingBaselineException extends IllegalStateException { + + private static final long serialVersionUID = 1L; + + /** @param message the diagnostic */ + public MissingBaselineException(String message) { + super(message); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/BaselineRequirementTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/BaselineRequirementTest.java new file mode 100644 index 0000000..8b1044f --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/BaselineRequirementTest.java @@ -0,0 +1,171 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; + +/** + * The guard, exercised in both directions. + * + *

{@link #anAbsentBaselineIsIndistinguishableFromAnAllNewCorpusInTheDiff()} is the reason the guard + * exists and is written first: it demonstrates, through {@link ConformanceDiff} itself, that a run with + * no baseline produces a diff that does not fail the build however many assertions failed. Everything + * else here is the check that catches that state before the diff is reached. + */ +class BaselineRequirementTest { + + private static final String SEARCHED = "/tmp/example/src/test/resources"; + + // ------------------------------------------------------- what an absent baseline does to the diff + + @Test + void anAbsentBaselineIsIndistinguishableFromAnAllNewCorpusInTheDiff() { + // Six assertions, five of them failing. With no manifest and no index this is a green build. + ObservedRun.Builder builder = ObservedRun.builder(); + List keys = new ArrayList(); + for (int i = 0; i < 6; i++) { + AssertionKey key = AssertionKey.of("gie/builtins.gie", 0, i, String.format("%08x", i + 1)); + keys.add(key); + builder.record(key, i == 0 ? AssertionOutcome.PASS : AssertionOutcome.FAIL, "3400 km off"); + } + ObservedRun run = builder.build(); + + DiffResult withoutBaseline = + ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.empty()); + assertEquals(6, withoutBaseline.count(DiffClassification.NEW)); + assertEquals(0, withoutBaseline.count(DiffClassification.REGRESSED)); + assertFalse( + withoutBaseline.shouldFailBuild(), + "this is the defect: five failing assertions and the gate is green"); + + // The same run against a baseline that knows those keys is five regressions. Nothing about the + // run changed; only whether there was anything to compare it to. + DiffResult withBaseline = + ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.of(keys)); + assertEquals(5, withBaseline.count(DiffClassification.REGRESSED)); + assertTrue(withBaseline.shouldFailBuild()); + + // And the guard fires on precisely the first case and not the second. + assertFalse(BaselineRequirement.diagnosePresence(false, false, SEARCHED).isEmpty()); + assertEquals("", BaselineRequirement.diagnosePresence(true, true, SEARCHED)); + } + + // ------------------------------------------------------------------------------------ presence + + @Test + void bothFilesPresentIsTheOnlyCleanState() { + assertEquals("", BaselineRequirement.diagnosePresence(true, true, SEARCHED)); + BaselineRequirement.requirePresence(true, true, SEARCHED); + } + + @Test + void bothFilesAbsentIsAHardFailureNamingBothFiles() { + BaselineRequirement.MissingBaselineException thrown = assertThrows( + BaselineRequirement.MissingBaselineException.class, + () -> BaselineRequirement.requirePresence(false, false, SEARCHED)); + String message = thrown.getMessage(); + assertTrue(message.contains(BaselineRequirement.MANIFEST_FILE), message); + assertTrue(message.contains(BaselineRequirement.CORPUS_INDEX_FILE), message); + assertTrue(message.contains(SEARCHED), message); + assertTrue(message.contains(BaselineRequirement.REGENERATE_COMMAND), message); + } + + @Test + void theDiagnosticSaysNothingRegressedBecauseNothingDid() { + // A missing baseline reported as "5830 REGRESSED" sends the reader hunting for a regression + // that did not happen. The message must name the real cause. + String message = BaselineRequirement.diagnosePresence(false, false, SEARCHED); + assertTrue(message.contains("BASELINE MISSING"), message); + assertTrue(message.contains("NOTHING HAS REGRESSED"), message); + assertFalse(message.contains("REGRESSED assertions"), message); + assertTrue(message.contains("SUCCESS no matter how many assertions failed"), message); + } + + @Test + void oneFileWithoutTheOtherIsAlsoAHardFailureAndSaysWhichIsMissing() { + String indexMissing = BaselineRequirement.diagnosePresence(true, false, SEARCHED); + assertTrue(indexMissing.contains("BASELINE INCOMPLETE"), indexMissing); + assertTrue( + indexMissing.contains(BaselineRequirement.CORPUS_INDEX_FILE + " was not found"), + indexMissing); + assertTrue(indexMissing.contains("travel together"), indexMissing); + + String manifestMissing = BaselineRequirement.diagnosePresence(false, true, SEARCHED); + assertTrue( + manifestMissing.contains(BaselineRequirement.MANIFEST_FILE + " was not found"), + manifestMissing); + + assertThrows( + BaselineRequirement.MissingBaselineException.class, + () -> BaselineRequirement.requirePresence(true, false, SEARCHED)); + assertThrows( + BaselineRequirement.MissingBaselineException.class, + () -> BaselineRequirement.requirePresence(false, true, SEARCHED)); + } + + @Test + void aNullSearchPathIsToleratedAndOmitted() { + String message = BaselineRequirement.diagnosePresence(false, false, null); + assertFalse(message.contains("Searched:"), message); + assertTrue(message.contains(BaselineRequirement.REGENERATE_COMMAND), message); + } + + // ------------------------------------------------------------------------------------ coverage + + @Test + void anIndexThatCoversNothingIsTreatedAsNoBaselineAtAll() { + BaselineRequirement.MissingBaselineException thrown = assertThrows( + BaselineRequirement.MissingBaselineException.class, + () -> BaselineRequirement.requireCoverage(0, 7923, SEARCHED)); + String message = thrown.getMessage(); + assertTrue(message.contains("BASELINE EMPTY"), message); + assertTrue(message.contains("7923"), message); + assertTrue(message.contains("NOTHING HAS REGRESSED"), message); + } + + @Test + void anIndexWithKeysPasses() { + assertEquals("", BaselineRequirement.diagnoseCoverage(7923, 7923, SEARCHED)); + BaselineRequirement.requireCoverage(1, 7923, SEARCHED); + } + + @Test + void anEmptyRunIsNotACoverageFailure() { + // Nothing observed means nothing to gate; the empty-index complaint would be noise, and the + // absent-file check has already run by this point. + assertEquals("", BaselineRequirement.diagnoseCoverage(0, 0, SEARCHED)); + } + + // ---------------------------------------------------------------- the guard's own file names + + @Test + void theFileNamesAreTheOnesTheRegeneratorWrites() { + assertEquals( + Arrays.asList("gie-expected-failures.tsv", "gie-corpus-index.tsv"), + Arrays.asList(BaselineRequirement.MANIFEST_FILE, BaselineRequirement.CORPUS_INDEX_FILE)); + assertTrue( + BaselineRequirement.REGENERATE_COMMAND.contains(ManifestRegenerator.REGENERATE_PROPERTY), + BaselineRequirement.REGENERATE_COMMAND); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ConformanceDiff.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ConformanceDiff.java new file mode 100644 index 0000000..32f5ecf --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ConformanceDiff.java @@ -0,0 +1,160 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * Classifies an {@link ObservedRun} against an {@link ExpectedOutcomeManifest}. + * + *

The classification table, with {@code -} meaning "not present": + * + *

+ *   expected \ observed |  PASS             FAIL             SKIP             VACUOUS          -
+ *   --------------------+-----------------------------------------------------------------------------
+ *   PASS  (absent)      |  UNCHANGED        REGRESSED        REGRESSED        REGRESSED        DISAPPEARED
+ *   FAIL                |  UNEXPECTED_PASS  STILL_FAILING    STILL_FAILING    STILL_FAILING    DISAPPEARED
+ *   SKIP                |  UNEXPECTED_PASS  STILL_FAILING    STILL_FAILING    STILL_FAILING    DISAPPEARED
+ *   VACUOUS             |  UNEXPECTED_PASS  STILL_FAILING    STILL_FAILING    STILL_FAILING    DISAPPEARED
+ *   not in corpus index |  NEW              NEW              NEW              NEW              (n/a)
+ * 
+ * + *

{@code UNCHANGED} therefore means "passed, as it should"; {@code STILL_FAILING} is the count of + * remaining known work, and is the number that must fall each stage. + * + *

Two cells deserve a note. Expected {@code PASS} + observed {@code SKIP} is a + * {@code REGRESSED}, not a benign skip: an assertion that used to be evaluated and now declines to be + * is a loss of coverage, and if skips were tolerated here a missing grid could quietly retire a + * hundred passing assertions. Expected {@code FAIL} + observed {@code SKIP} (and the reverse) is + * {@code STILL_FAILING}, since neither is a pass and neither is a loss relative to the baseline; those + * keys are separately visible via {@link DiffResult#outcomeChangedKeys()}. + * + *

The {@code VACUOUS} row is the one to get right

+ * + *

{@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE} means the assertion was never measured. When an + * implementation lands — {@code adams_hemi} being the worked example, 388 rows of it — every one of + * those rows flips to a genuine pass or a genuine failure. Neither flip may be + * {@code REGRESSED}, because nothing has got worse: something has started being measured. So + * the row reads {@code UNEXPECTED_PASS} for a genuine pass (bank the win, regenerate) and + * {@code STILL_FAILING} for a genuine failure (known work, and the honest denominator has just grown by + * one). That is progress being counted for the first time, and the diff says so. + * + *

The reverse direction, expected {@code PASS} + observed {@code VACUOUS}, is + * {@code REGRESSED}, and deliberately: an assertion that used to demonstrate something and now + * demonstrates nothing has lost coverage exactly as a new skip would have. + * + *

The "corpus the manifest was built from" is supplied as a {@link CorpusIndex}. Without it, + * {@code NEW} cannot be distinguished from {@code UNCHANGED} — the manifest holds only non-passes, so + * a passing key's absence from it is not evidence of anything. + */ +public final class ConformanceDiff { + + private ConformanceDiff() {} + + /** + * @param expected the manifest + * @param observed the run + * @param baseline the corpus the manifest was generated against + * @return the classified diff + */ + public static DiffResult compare(ExpectedOutcomeManifest expected, ObservedRun observed, CorpusIndex baseline) { + return compare(expected, observed, baseline.keys()); + } + + /** + * Compares without a corpus index, treating the union of the manifest's keys and the run's keys as + * the baseline. + * + *

This is the convenience form for unit tests and ad-hoc runs. It can never report + * {@link DiffClassification#NEW} or {@link DiffClassification#DISAPPEARED} for a passing assertion, + * because there is nothing to have disappeared from. Real gate runs should pass the index. + * + * @param expected the manifest + * @param observed the run + * @return the classified diff + */ + public static DiffResult compare(ExpectedOutcomeManifest expected, ObservedRun observed) { + SortedSet baseline = new TreeSet(); + baseline.addAll(expected.keys()); + baseline.addAll(observed.keys()); + return compare(expected, observed, baseline); + } + + /** + * @param expected the manifest + * @param observed the run + * @param baselineKeys every key that existed when the manifest was generated + * @return the classified diff + */ + public static DiffResult compare( + ExpectedOutcomeManifest expected, ObservedRun observed, Collection baselineKeys) { + if (expected == null || observed == null || baselineKeys == null) { + throw new IllegalArgumentException("manifest, run and baseline are all required"); + } + + SortedSet known = new TreeSet(baselineKeys); + // A manifest entry is itself evidence that the key was known at generation time, even if the + // index is stale or absent; otherwise a manifest-only key would be misreported as NEW. + known.addAll(expected.keys()); + + SortedSet everyKey = new TreeSet(known); + everyKey.addAll(observed.keys()); + + List entries = new ArrayList(everyKey.size()); + for (AssertionKey key : everyKey) { + AssertionOutcome expectedOutcome = expected.expectedOutcome(key); + AssertionOutcome observedOutcome = observed.outcome(key); + String reason = expected.reason(key); + ObservedAssertion observation = observed.get(key); + String detail = observation == null ? "" : observation.detail(); + + DiffClassification classification; + if (observedOutcome == null) { + classification = DiffClassification.DISAPPEARED; + } else if (!known.contains(key)) { + classification = DiffClassification.NEW; + } else if (expectedOutcome == AssertionOutcome.PASS) { + classification = observedOutcome == AssertionOutcome.PASS + ? DiffClassification.UNCHANGED + : DiffClassification.REGRESSED; + } else if (expectedOutcome == AssertionOutcome.VACUOUS_EXPECTED_FAILURE) { + // Spelled out rather than left to the fall-through below, because the property being + // asserted is that this can never be REGRESSED: an assertion that was measuring + // nothing cannot have got worse. See the class comment. + classification = observedOutcome == AssertionOutcome.PASS + ? DiffClassification.UNEXPECTED_PASS + : DiffClassification.STILL_FAILING; + } else if (observedOutcome == AssertionOutcome.PASS) { + classification = DiffClassification.UNEXPECTED_PASS; + } else { + classification = DiffClassification.STILL_FAILING; + } + + entries.add(DiffEntry.of(key, classification, expectedOutcome, observedOutcome, reason, detail)); + } + + return new DiffResult( + entries, + observed.count(AssertionOutcome.PASS), + observed.count(AssertionOutcome.FAIL), + observed.count(AssertionOutcome.SKIP), + observed.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ConformanceDiffTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ConformanceDiffTest.java new file mode 100644 index 0000000..94dd100 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ConformanceDiffTest.java @@ -0,0 +1,349 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Test; + +class ConformanceDiffTest { + + private static final AssertionKey PASSING = AssertionKey.of("gie/builtins.gie", 0, 0, "00000001"); + private static final AssertionKey FAILING = AssertionKey.of("gie/builtins.gie", 0, 1, "00000002"); + private static final AssertionKey SKIPPING = AssertionKey.of("gie/epsg_grid.gie", 0, 0, "00000003"); + + private static ExpectedOutcomeManifest manifest(ManifestEntry... entries) { + return ExpectedOutcomeManifest.of(Arrays.asList(entries)); + } + + private static ManifestEntry expectFail(AssertionKey key, String reason) { + return ManifestEntry.of(key, AssertionOutcome.FAIL, reason); + } + + private static ManifestEntry expectSkip(AssertionKey key, String reason) { + return ManifestEntry.of(key, AssertionOutcome.SKIP, reason); + } + + private static ManifestEntry expectVacuous(AssertionKey key, String reason) { + return ManifestEntry.of(key, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, reason); + } + + private static ObservedRun run(AssertionKey key, AssertionOutcome outcome) { + return ObservedRun.builder().record(key, outcome).build(); + } + + private static DiffEntry only(DiffResult diff, DiffClassification classification) { + List entries = diff.entries(classification); + assertEquals(1, entries.size(), "expected exactly one " + classification + " in " + diff); + return entries.get(0); + } + + // ------------------------------------------------------------------------------ classification + + @Test + void expectedPassAndPassedIsUnchanged() { + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run(PASSING, AssertionOutcome.PASS)); + assertEquals(1, diff.count(DiffClassification.UNCHANGED)); + assertEquals(AssertionOutcome.PASS, only(diff, DiffClassification.UNCHANGED).expected()); + assertFalse(diff.shouldFailBuild()); + } + + @Test + void expectedPassButFailedIsARegression() { + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run(PASSING, AssertionOutcome.FAIL)); + assertEquals(1, diff.count(DiffClassification.REGRESSED)); + assertEquals(PASSING, only(diff, DiffClassification.REGRESSED).key()); + assertTrue(diff.shouldFailBuild()); + assertTrue(diff.failureSummary().contains("REGRESSED"), diff.failureSummary()); + } + + @Test + void expectedPassButSkippedIsAlsoARegressionBecauseASkipIsNotAPass() { + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run(PASSING, AssertionOutcome.SKIP)); + assertEquals(1, diff.count(DiffClassification.REGRESSED)); + assertEquals(AssertionOutcome.SKIP, only(diff, DiffClassification.REGRESSED).observed()); + assertTrue(diff.shouldFailBuild()); + } + + @Test + void expectedFailAndFailedIsStillFailing() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectFail(FAILING, "laea inverse drift")), run(FAILING, AssertionOutcome.FAIL)); + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + assertEquals("laea inverse drift", only(diff, DiffClassification.STILL_FAILING).reason()); + assertFalse(diff.shouldFailBuild()); + assertEquals(0, diff.outcomeChangedKeys().size()); + } + + // ---------------------------------------------------------- vacuous -> measured is never a regression + + @Test + void aVacuousAssertionThatStartsPassingIsNotARegression() { + // The adams_hemi transition: 388 rows that measured nothing begin measuring something. Whichever + // way they land, the one thing they must not be called is REGRESSED. + DiffResult diff = ConformanceDiff.compare( + manifest(expectVacuous(FAILING, "adams_hemi is not implemented, so nothing was measured")), + run(FAILING, AssertionOutcome.PASS)); + + assertEquals(0, diff.count(DiffClassification.REGRESSED), + "measuring something for the first time is not a regression"); + assertEquals(1, diff.count(DiffClassification.UNEXPECTED_PASS)); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, + only(diff, DiffClassification.UNEXPECTED_PASS).expected()); + // It does stop the build, as every UNEXPECTED_PASS does, so that the win is banked in the + // manifest rather than left as a stale "unmeasured" claim. + assertTrue(diff.shouldFailBuild()); + assertTrue(diff.failureSummary().contains("UNEXPECTED_PASS"), diff.failureSummary()); + } + + @Test + void aVacuousAssertionThatStartsFailingIsNotARegressionEither() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectVacuous(FAILING, "no implementation, so unmeasured")), + run(FAILING, AssertionOutcome.FAIL)); + + assertEquals(0, diff.count(DiffClassification.REGRESSED)); + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + assertFalse(diff.shouldFailBuild(), + "an unmeasured assertion becoming a measured failure is progress, not a break"); + assertEquals(1, diff.outcomeChangedKeys().size(), + "the change of flavour is still worth surfacing"); + } + + @Test + void aVacuousAssertionThatStaysVacuousIsStillFailing() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectVacuous(FAILING, "still no implementation")), + run(FAILING, AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + assertEquals(0, diff.outcomeChangedKeys().size()); + assertFalse(diff.shouldFailBuild()); + assertEquals(1, diff.vacuous()); + } + + @Test + void anAssertionThatUsedToPassAndIsNowVacuousIsARegression() { + // The other direction, and it must break: an assertion that demonstrated something and now + // demonstrates nothing has lost coverage exactly as a new skip would have. + DiffResult diff = ConformanceDiff.compare( + ExpectedOutcomeManifest.empty(), run(PASSING, AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + + assertEquals(1, diff.count(DiffClassification.REGRESSED)); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, + only(diff, DiffClassification.REGRESSED).observed()); + assertTrue(diff.shouldFailBuild()); + } + + @Test + void expectedSkipAndSkippedIsStillFailing() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectSkip(SKIPPING, "require_grid")), run(SKIPPING, AssertionOutcome.SKIP)); + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + assertFalse(diff.shouldFailBuild()); + } + + @Test + void expectedFailButSkippedIsStillFailingAndFlaggedAsAnOutcomeChange() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectFail(SKIPPING, "was a real failure")), run(SKIPPING, AssertionOutcome.SKIP)); + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + assertEquals(Collections.singleton(SKIPPING), diff.outcomeChangedKeys()); + assertFalse(diff.shouldFailBuild(), "a FAIL becoming a SKIP is a provisioning change, not a regression"); + } + + @Test + void expectedFailButPassedIsAnUnexpectedPassAndFailsTheBuild() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectFail(FAILING, "no inverse yet")), run(FAILING, AssertionOutcome.PASS)); + assertEquals(1, diff.count(DiffClassification.UNEXPECTED_PASS)); + DiffEntry entry = only(diff, DiffClassification.UNEXPECTED_PASS); + assertEquals(AssertionOutcome.FAIL, entry.expected()); + assertEquals(AssertionOutcome.PASS, entry.observed()); + assertEquals("no inverse yet", entry.reason()); + assertTrue(diff.shouldFailBuild(), "a landed fix must force the manifest to be updated"); + assertTrue(diff.failureSummary().contains("UNEXPECTED_PASS"), diff.failureSummary()); + } + + @Test + void expectedSkipButPassedIsAlsoAnUnexpectedPass() { + DiffResult diff = ConformanceDiff.compare( + manifest(expectSkip(SKIPPING, "grid missing")), run(SKIPPING, AssertionOutcome.PASS)); + assertEquals(1, diff.count(DiffClassification.UNEXPECTED_PASS)); + assertTrue(diff.shouldFailBuild()); + } + + @Test + void anObservedKeyOutsideTheBaselineIsNew() { + AssertionKey added = AssertionKey.of("gie/builtins.gie", 400, 0, "0000beef"); + DiffResult diff = ConformanceDiff.compare( + ExpectedOutcomeManifest.empty(), + run(added, AssertionOutcome.PASS), + CorpusIndex.of(Collections.singletonList(PASSING))); + assertEquals(1, diff.count(DiffClassification.NEW)); + assertEquals(added, only(diff, DiffClassification.NEW).key()); + assertEquals(1, diff.count(DiffClassification.DISAPPEARED), "the baseline key was not observed"); + } + + @Test + void aNewAssertionDoesNotByItselfFailTheBuild() { + AssertionKey added = AssertionKey.of("gie/builtins.gie", 400, 0, "0000beef"); + DiffResult diff = ConformanceDiff.compare( + ExpectedOutcomeManifest.empty(), run(added, AssertionOutcome.PASS), CorpusIndex.empty()); + assertEquals(1, diff.count(DiffClassification.NEW)); + assertFalse(diff.shouldFailBuild()); + } + + @Test + void aNewAssertionThatFailsIsStillNewAndStillDoesNotFailTheBuild() { + // Pins what DiffClassification.NEW's javadoc now says. The classification is decided before the + // expected outcome is consulted, so an unknown key that fails is NEW, not REGRESSED. The + // javadoc used to claim the opposite and nothing tested it -- which also means that when EVERY + // key is NEW (an absent or empty baseline) the gate cannot fail at all. See BaselineRequirement. + AssertionKey added = AssertionKey.of("gie/builtins.gie", 400, 0, "0000beef"); + DiffResult diff = ConformanceDiff.compare( + ExpectedOutcomeManifest.empty(), run(added, AssertionOutcome.FAIL), CorpusIndex.empty()); + assertEquals(1, diff.count(DiffClassification.NEW)); + assertEquals(0, diff.count(DiffClassification.REGRESSED)); + assertFalse(diff.shouldFailBuild()); + } + + @Test + void aBaselineKeyThatWasNotObservedHasDisappearedAndFailsTheBuild() { + DiffResult diff = ConformanceDiff.compare( + ExpectedOutcomeManifest.empty(), + ObservedRun.empty(), + CorpusIndex.of(Collections.singletonList(PASSING))); + assertEquals(1, diff.count(DiffClassification.DISAPPEARED)); + DiffEntry entry = only(diff, DiffClassification.DISAPPEARED); + assertEquals(PASSING, entry.key()); + assertNull(entry.observed(), "a disappeared assertion has no outcome; null is not SKIP"); + assertTrue(diff.shouldFailBuild()); + assertTrue(diff.failureSummary().contains("DISAPPEARED"), diff.failureSummary()); + } + + @Test + void aManifestEntryThatMatchesNothingHasDisappearedEvenWithoutABaseline() { + DiffResult diff = + ConformanceDiff.compare(manifest(expectFail(FAILING, "stale entry")), ObservedRun.empty()); + assertEquals(1, diff.count(DiffClassification.DISAPPEARED)); + assertEquals(0, diff.count(DiffClassification.NEW), "a manifest key is by definition not new"); + assertTrue(diff.shouldFailBuild()); + } + + @Test + void everyClassificationIsCountedInOneRun() { + AssertionKey unchanged = AssertionKey.of("gie/a.gie", 0, 0, "00000001"); + AssertionKey regressed = AssertionKey.of("gie/a.gie", 0, 1, "00000002"); + AssertionKey unexpectedPass = AssertionKey.of("gie/a.gie", 0, 2, "00000003"); + AssertionKey stillFailing = AssertionKey.of("gie/a.gie", 0, 3, "00000004"); + AssertionKey disappeared = AssertionKey.of("gie/a.gie", 0, 4, "00000005"); + AssertionKey fresh = AssertionKey.of("gie/a.gie", 0, 5, "00000006"); + + ExpectedOutcomeManifest expected = manifest( + expectFail(unexpectedPass, "fixed by the pipeline engine"), expectFail(stillFailing, "adams series")); + ObservedRun observed = ObservedRun.builder() + .record(unchanged, AssertionOutcome.PASS) + .record(regressed, AssertionOutcome.FAIL, "12.4 m off") + .record(unexpectedPass, AssertionOutcome.PASS) + .record(stillFailing, AssertionOutcome.FAIL, "0.42 m off") + .record(fresh, AssertionOutcome.PASS) + .build(); + CorpusIndex baseline = + CorpusIndex.of(Arrays.asList(unchanged, regressed, unexpectedPass, stillFailing, disappeared)); + + DiffResult diff = ConformanceDiff.compare(expected, observed, baseline); + + assertEquals(1, diff.count(DiffClassification.UNCHANGED)); + assertEquals(1, diff.count(DiffClassification.REGRESSED)); + assertEquals(1, diff.count(DiffClassification.UNEXPECTED_PASS)); + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + assertEquals(1, diff.count(DiffClassification.NEW)); + assertEquals(1, diff.count(DiffClassification.DISAPPEARED)); + assertEquals(6, diff.total()); + assertEquals(3, diff.passing()); + assertEquals(2, diff.failing()); + assertEquals(0, diff.skipped()); + assertTrue(diff.shouldFailBuild()); + assertEquals("12.4 m off", only(diff, DiffClassification.REGRESSED).detail()); + } + + @Test + void countsCoverEveryClassificationIncludingZeroes() { + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), ObservedRun.empty()); + assertEquals(DiffClassification.values().length, diff.counts().size()); + for (DiffClassification classification : DiffClassification.values()) { + assertEquals(Integer.valueOf(0), diff.counts().get(classification)); + } + assertFalse(diff.shouldFailBuild()); + assertEquals("", diff.failureSummary()); + } + + @Test + void entriesAreReturnedInCanonicalKeyOrder() { + AssertionKey first = AssertionKey.of("gie/a.gie", 0, 0, "00000001"); + AssertionKey second = AssertionKey.of("gie/a.gie", 2, 0, "00000002"); + AssertionKey third = AssertionKey.of("gie/b.gie", 0, 0, "00000003"); + ObservedRun observed = ObservedRun.builder() + .record(third, AssertionOutcome.PASS) + .record(first, AssertionOutcome.PASS) + .record(second, AssertionOutcome.FAIL) + .build(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), observed); + List order = new ArrayList(); + for (DiffEntry entry : diff.entries()) { + order.add(entry.key()); + } + assertEquals(Arrays.asList(first, second, third), order); + } + + @Test + void skipsAreCountedSeparatelyFromPasses() { + ObservedRun observed = ObservedRun.builder() + .record(PASSING, AssertionOutcome.PASS) + .record(SKIPPING, AssertionOutcome.SKIP) + .build(); + DiffResult diff = ConformanceDiff.compare( + manifest(expectSkip(SKIPPING, "require_grid us_nga_egm08_25.tif")), observed); + assertEquals(1, diff.passing()); + assertEquals(1, diff.skipped()); + assertEquals(0, diff.failing()); + } + + @Test + void classificationsDeclareTheirOwnBuildImpact() { + assertFalse(DiffClassification.UNCHANGED.failsBuild()); + assertTrue(DiffClassification.REGRESSED.failsBuild()); + assertTrue(DiffClassification.UNEXPECTED_PASS.failsBuild()); + assertFalse(DiffClassification.STILL_FAILING.failsBuild()); + assertFalse(DiffClassification.NEW.failsBuild()); + assertTrue(DiffClassification.DISAPPEARED.failsBuild()); + } + + @Test + void keysAccessorReturnsTheOffendingKeys() { + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run(PASSING, AssertionOutcome.FAIL)); + assertEquals(Collections.singleton(PASSING), diff.keys(DiffClassification.REGRESSED)); + assertTrue(diff.keys(DiffClassification.UNCHANGED).isEmpty()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/CorpusIndex.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/CorpusIndex.java new file mode 100644 index 0000000..6ccfb55 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/CorpusIndex.java @@ -0,0 +1,215 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Collections; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * The set of assertion keys the manifest was generated against: one key per line, canonical order. + * + *

The manifest itself records only non-passes, so it cannot answer "did this assertion exist last + * time?". That question is what separates {@code NEW} from {@code UNCHANGED} and, more importantly, + * {@code DISAPPEARED} from "nothing to see here". The index is therefore written alongside the + * manifest by {@link ManifestRegenerator} and read back by {@link ConformanceDiff}. + * + *

It is a large file (~8,000 lines) and it is meant to be: it is a re-vendor tripwire. If + * upstream changes a single {@code operation} definition, the affected keys change hash and the index + * diff shows exactly which assertions moved. Nothing else in the system can detect that. + * + *

Format: {@code #} comments and blank lines are ignored; every other line is one rendered + * {@link AssertionKey}. Parsing is strict, for the same reason as the manifest. + * + *

Immutable. + */ +public final class CorpusIndex { + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final String NEWLINE = "\n"; + private static final String[] PREAMBLE = { + "# proj4j gie/GIGS conformance - corpus index.", + "#", + "# Every assertion key present when the sibling manifest was generated, one per line, in", + "# canonical order. Used to tell NEW assertions from UNCHANGED ones and to detect keys that", + "# have DISAPPEARED (an upstream edit, or a lexer change that alters block/assertion indices).", + "#", + "# Regenerate together with the manifest:", + "# mvn -Pconformance verify -Dgie.regenerate=true", + }; + + private final SortedSet keys; + + private CorpusIndex(SortedSet keys) { + this.keys = keys; + } + + /** @return an index containing no keys — every observed assertion will be {@code NEW}. */ + public static CorpusIndex empty() { + return new CorpusIndex(new TreeSet()); + } + + /** + * @param keys the keys, in any order + * @return the index + */ + public static CorpusIndex of(Collection keys) { + return new CorpusIndex(new TreeSet(keys)); + } + + /** + * @param run a run whose key set defines the corpus + * @return the index + */ + public static CorpusIndex ofRun(ObservedRun run) { + return of(run.keys()); + } + + /** + * @param path the index file, UTF-8 + * @return the index + * @throws IOException if the file cannot be read + * @throws ManifestFormatException if a line is not a well-formed key + */ + public static CorpusIndex load(Path path) throws IOException { + Reader reader = new InputStreamReader(Files.newInputStream(path), UTF_8); + try { + return load(reader, path.toString()); + } finally { + reader.close(); + } + } + + /** + * @param reader the index text; not closed by this method + * @return the index + * @throws IOException if reading fails + * @throws ManifestFormatException if a line is not a well-formed key + */ + public static CorpusIndex load(Reader reader) throws IOException { + return load(reader, ""); + } + + /** + * @param reader the index text; not closed by this method + * @param source description used in error messages + * @return the index + * @throws IOException if reading fails + * @throws ManifestFormatException if a line is not a well-formed key + */ + public static CorpusIndex load(Reader reader, String source) throws IOException { + BufferedReader lines = new BufferedReader(reader); + SortedSet parsed = new TreeSet(); + int lineNumber = 0; + String line; + while ((line = lines.readLine()) != null) { + lineNumber++; + if (line.endsWith("\r")) { + line = line.substring(0, line.length() - 1); + } + if (line.trim().isEmpty() || line.charAt(0) == '#') { + continue; + } + AssertionKey key; + try { + key = AssertionKey.parse(line); + } catch (IllegalArgumentException e) { + throw new ManifestFormatException(source, lineNumber, line, e.getMessage(), e); + } + if (!parsed.add(key)) { + throw new ManifestFormatException(source, lineNumber, line, "duplicate key"); + } + } + return new CorpusIndex(parsed); + } + + /** @return the keys, in canonical order. */ + public SortedSet keys() { + return Collections.unmodifiableSortedSet(keys); + } + + /** @return {@code true} if the key was present when the manifest was generated. */ + public boolean contains(AssertionKey key) { + return keys.contains(key); + } + + /** @return the number of keys. */ + public int size() { + return keys.size(); + } + + /** @return {@code true} when the index holds no keys. */ + public boolean isEmpty() { + return keys.isEmpty(); + } + + /** + * Renders the index. A pure function, so it is testable without a filesystem. + * + * @return the full file content + */ + public String render() { + StringBuilder out = new StringBuilder(256 + 48 * keys.size()); + for (int i = 0; i < PREAMBLE.length; i++) { + out.append(PREAMBLE[i]).append(NEWLINE); + } + for (AssertionKey key : keys) { + out.append(key.toString()).append(NEWLINE); + } + return out.toString(); + } + + /** + * @param writer destination; flushed but not closed + * @throws IOException if writing fails + */ + public void store(Writer writer) throws IOException { + writer.write(render()); + writer.flush(); + } + + /** + * @param path destination file, UTF-8; parent directories are created if needed + * @throws IOException if writing fails + */ + public void store(Path path) throws IOException { + Path parent = path.getParent(); + if (parent != null) { + Files.createDirectories(parent); + } + Writer writer = new OutputStreamWriter(Files.newOutputStream(path), UTF_8); + try { + store(writer); + } finally { + writer.close(); + } + } + + @Override + public String toString() { + return "CorpusIndex[" + keys.size() + " assertions]"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/CorpusIndexTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/CorpusIndexTest.java new file mode 100644 index 0000000..4d0f9b4 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/CorpusIndexTest.java @@ -0,0 +1,90 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; + +class CorpusIndexTest { + + private static final AssertionKey A = AssertionKey.of("gie/adams_ws1.gie", 0, 0, "00000001"); + private static final AssertionKey B = AssertionKey.of("gie/builtins.gie", 3, 1, "00000002"); + private static final AssertionKey C = AssertionKey.of("gigs/5110.gie.failing", 2, 0, "00000003"); + + @Test + void roundTripsThroughItsRenderedForm() throws IOException { + CorpusIndex index = CorpusIndex.of(Arrays.asList(C, A, B)); + CorpusIndex reloaded = CorpusIndex.load(new StringReader(index.render())); + assertEquals(index.keys(), reloaded.keys()); + assertEquals(index.render(), reloaded.render()); + } + + @Test + void rendersInCanonicalOrder() { + List lines = new ArrayList(); + for (String line : CorpusIndex.of(Arrays.asList(C, B, A)).render().split("\n")) { + if (!line.startsWith("#") && !line.isEmpty()) { + lines.add(line); + } + } + assertEquals(Arrays.asList(A.toString(), B.toString(), C.toString()), lines); + } + + @Test + void isBuiltFromARunIncludingPassingAssertions() { + ObservedRun run = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL) + .record(C, AssertionOutcome.SKIP) + .build(); + CorpusIndex index = CorpusIndex.ofRun(run); + assertEquals(3, index.size()); + assertTrue(index.contains(A)); + assertTrue(index.contains(B)); + assertTrue(index.contains(C)); + } + + @Test + void failsLoudlyOnAMalformedLine() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, + () -> CorpusIndex.load(new StringReader("# c\n" + A + "\nnot-a-key\n"), "index.tsv")); + assertEquals(3, e.lineNumber()); + assertEquals("index.tsv", e.source()); + } + + @Test + void failsOnADuplicateKey() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, () -> CorpusIndex.load(new StringReader(A + "\n" + A + "\n"))); + assertEquals(2, e.lineNumber()); + assertTrue(e.getMessage().contains("duplicate"), e.getMessage()); + } + + @Test + void anEmptyIndexHoldsNothing() throws IOException { + assertTrue(CorpusIndex.empty().isEmpty()); + assertTrue(CorpusIndex.load(new StringReader("# only comments\n\n")).isEmpty()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffClassification.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffClassification.java new file mode 100644 index 0000000..0e0e4d8 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffClassification.java @@ -0,0 +1,88 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * How one assertion's observed outcome relates to its recorded expectation. + * + *

Three of the six break the build — see {@link #failsBuild()} and + * {@link DiffResult#shouldFailBuild()}. + */ +public enum DiffClassification { + + /** Expected to pass and passed. The goal state for all 7,923 evaluated assertions. */ + UNCHANGED(false), + + /** + * Expected {@link AssertionOutcome#PASS}, observed {@link AssertionOutcome#FAIL} or + * {@link AssertionOutcome#SKIP}. A regression: work that was correct is no longer correct, or a + * resource that was available no longer is. Always breaks the build. + */ + REGRESSED(true), + + /** + * Expected a non-pass, observed {@link AssertionOutcome#PASS}. Breaks the build on purpose + * — see {@link DiffResult#shouldFailBuild()}. + */ + UNEXPECTED_PASS(true), + + /** + * Expected a non-pass and got one. The count of remaining known work — the number that must fall + * each stage. Does not break the build. Includes the case where the flavour of non-pass changed + * (FAIL to SKIP or back); those keys are additionally reported by + * {@link DiffResult#outcomeChangedKeys()}. + */ + STILL_FAILING(false), + + /** + * Observed, but absent from the corpus index the manifest was generated against. A brand-new + * assertion, or an existing one whose content hash changed because upstream edited it. Does not + * break the build: there is no baseline for the key, so there is nothing it can be said to have + * regressed from. + * + *

Read that literally. {@link ConformanceDiff} tests this case before + * it consults the expected outcome, so a new assertion that fails is {@code NEW}, not + * {@code REGRESSED} — it is reported and counted, and the build stays green until the baseline is + * regenerated, after which the key is in the index and any later failure is a genuine + * {@code REGRESSED}. (An earlier version of this comment claimed the opposite, that a failing new + * assertion "will show up as REGRESSED instead". It does not, and no test asserted that it did.) + * + *

The consequence worth knowing: if every key is {@code NEW}, nothing is being gated at + * all. That is what an absent or empty baseline looks like from inside the diff, and it is why + * {@link BaselineRequirement} refuses to let the gate run without one, rather than this + * classification being made build-failing. + */ + NEW(false), + + /** + * Present in the corpus index or the manifest, but not observed. Always breaks the build, because + * an assertion that silently stops running is indistinguishable from one that silently stops + * being checked — and a manifest entry that matches nothing is dead weight that overstates the + * remaining work. + */ + DISAPPEARED(true); + + private final boolean failsBuild; + + DiffClassification(boolean failsBuild) { + this.failsBuild = failsBuild; + } + + /** @return {@code true} if the presence of any assertion in this class must fail the build. */ + public boolean failsBuild() { + return failsBuild; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffEntry.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffEntry.java new file mode 100644 index 0000000..de0fdb6 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffEntry.java @@ -0,0 +1,150 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * One assertion's place in the diff: its key, how it was classified, what was expected, what happened, + * and the manifest's reason text. + * + *

Self-contained on purpose — the report renderers take a {@link DiffResult} and nothing else, so + * they stay pure functions of their argument. + * + *

Immutable. + */ +public final class DiffEntry implements Comparable { + + private final AssertionKey key; + private final DiffClassification classification; + private final AssertionOutcome expected; + private final AssertionOutcome observed; + private final String reason; + private final String detail; + + private DiffEntry( + AssertionKey key, + DiffClassification classification, + AssertionOutcome expected, + AssertionOutcome observed, + String reason, + String detail) { + this.key = key; + this.classification = classification; + this.expected = expected; + this.observed = observed; + this.reason = reason; + this.detail = detail; + } + + /** + * @param key the assertion + * @param classification how it relates to the manifest + * @param expected the expectation ({@link AssertionOutcome#PASS} when the key is absent from the + * manifest) + * @param observed the observed outcome, or {@code null} when the assertion did not run + * @param reason the manifest's reason text, {@code ""} when there is none + * @param detail the run's one-line detail, {@code ""} when there is none + * @return the entry + */ + public static DiffEntry of( + AssertionKey key, + DiffClassification classification, + AssertionOutcome expected, + AssertionOutcome observed, + String reason, + String detail) { + if (key == null || classification == null || expected == null) { + throw new IllegalArgumentException("key, classification and expected outcome are required"); + } + return new DiffEntry( + key, classification, expected, observed, reason == null ? "" : reason, detail == null ? "" : detail); + } + + /** @return the assertion identity. */ + public AssertionKey key() { + return key; + } + + /** @return the classification. */ + public DiffClassification classification() { + return classification; + } + + /** @return the expected outcome; {@link AssertionOutcome#PASS} when the manifest is silent. */ + public AssertionOutcome expected() { + return expected; + } + + /** + * @return the observed outcome, or {@code null} for {@link DiffClassification#DISAPPEARED}. Never + * conflate {@code null} with {@link AssertionOutcome#SKIP}: a skip was evaluated and declined, + * a {@code null} was never reached at all. + */ + public AssertionOutcome observed() { + return observed; + } + + /** @return the manifest's reason text; possibly empty, never {@code null}. */ + public String reason() { + return reason; + } + + /** @return the run's one-line detail; possibly empty, never {@code null}. */ + public String detail() { + return detail; + } + + /** @return {@code true} when this entry alone is enough to fail the build. */ + public boolean failsBuild() { + return classification.failsBuild(); + } + + @Override + public int compareTo(DiffEntry other) { + return key.compareTo(other.key); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof DiffEntry)) { + return false; + } + DiffEntry other = (DiffEntry) o; + return key.equals(other.key) + && classification == other.classification + && expected == other.expected + && observed == other.observed + && reason.equals(other.reason) + && detail.equals(other.detail); + } + + @Override + public int hashCode() { + int result = key.hashCode(); + result = 31 * result + classification.hashCode(); + result = 31 * result + expected.hashCode(); + result = 31 * result + (observed == null ? 0 : observed.hashCode()); + result = 31 * result + reason.hashCode(); + return 31 * result + detail.hashCode(); + } + + @Override + public String toString() { + return classification + " " + key + " expected=" + expected + " observed=" + (observed == null ? "-" : observed); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffResult.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffResult.java new file mode 100644 index 0000000..4cf465f --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/DiffResult.java @@ -0,0 +1,215 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; + +/** + * The classified comparison of a run against the manifest: counts per {@link DiffClassification}, the + * offending keys, and the build verdict. + * + *

Immutable; produced by {@link ConformanceDiff}. + */ +public final class DiffResult { + + private final List entries; + private final Map> byClassification; + private final int passing; + private final int failing; + private final int skipped; + private final int vacuous; + + DiffResult(List entries, int passing, int failing, int skipped, int vacuous) { + List sorted = new ArrayList(entries); + Collections.sort(sorted); + this.entries = Collections.unmodifiableList(sorted); + Map> grouped = + new EnumMap>(DiffClassification.class); + for (DiffClassification classification : DiffClassification.values()) { + grouped.put(classification, new ArrayList()); + } + for (DiffEntry entry : this.entries) { + grouped.get(entry.classification()).add(entry); + } + for (DiffClassification classification : DiffClassification.values()) { + grouped.put(classification, Collections.unmodifiableList(grouped.get(classification))); + } + this.byClassification = Collections.unmodifiableMap(grouped); + this.passing = passing; + this.failing = failing; + this.skipped = skipped; + this.vacuous = vacuous; + } + + /** @return every entry, in canonical key order. */ + public List entries() { + return entries; + } + + /** + * @param classification the class of interest + * @return the entries in that class, in canonical key order + */ + public List entries(DiffClassification classification) { + return byClassification.get(classification); + } + + /** + * @param classification the class of interest + * @return the keys in that class, in canonical order + */ + public SortedSet keys(DiffClassification classification) { + SortedSet selected = new TreeSet(); + for (DiffEntry entry : byClassification.get(classification)) { + selected.add(entry.key()); + } + return Collections.unmodifiableSortedSet(selected); + } + + /** + * @param classification the class of interest + * @return how many assertions fell into it + */ + public int count(DiffClassification classification) { + return byClassification.get(classification).size(); + } + + /** @return counts for every classification, including zeroes, in declaration order. */ + public Map counts() { + Map result = + new EnumMap(DiffClassification.class); + for (DiffClassification classification : DiffClassification.values()) { + result.put(classification, Integer.valueOf(count(classification))); + } + return Collections.unmodifiableMap(result); + } + + /** @return the number of assertions classified. */ + public int total() { + return entries.size(); + } + + /** @return observed passes. */ + public int passing() { + return passing; + } + + /** @return observed failures. */ + public int failing() { + return failing; + } + + /** @return observed skips. Reported separately from passes, always. */ + public int skipped() { + return skipped; + } + + /** + * @return observed {@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE}s. Reported separately from + * both passes and failures, always, and excluded from the headline's denominator + */ + public int vacuous() { + return vacuous; + } + + /** + * Keys that are {@link DiffClassification#STILL_FAILING} but whose kind of non-pass + * changed — expected {@code FAIL}, observed {@code SKIP}, or the reverse. + * + *

Informational, not build-failing. A FAIL becoming a SKIP is almost always a grid or resource + * availability change rather than progress or regression, and treating it as either would be + * misleading. It is surfaced so that a run in a differently-provisioned environment is visible + * rather than invisible. + * + * @return the keys, in canonical order + */ + public SortedSet outcomeChangedKeys() { + SortedSet changed = new TreeSet(); + for (DiffEntry entry : byClassification.get(DiffClassification.STILL_FAILING)) { + if (entry.observed() != null && entry.observed() != entry.expected()) { + changed.add(entry.key()); + } + } + return Collections.unmodifiableSortedSet(changed); + } + + /** + * The build verdict: {@code true} if there is any {@link DiffClassification#REGRESSED}, + * {@link DiffClassification#UNEXPECTED_PASS} or {@link DiffClassification#DISAPPEARED} assertion. + * + *

Why {@code REGRESSED} fails is obvious: something that worked no longer + * works. + * + *

Why {@code UNEXPECTED_PASS} fails is the part that gets argued about, so it + * is worth stating plainly. An assertion that starts passing is good news, and the build stops + * anyway — because the manifest is not a list of excuses, it is a claim about the state of the + * world, and the claim has just become false. If a landed fix does not force the manifest to be + * updated then: + *

    + *
  • the baseline silently overstates the remaining work, so the headline metric + * and the burn-down both lie, and the next stage is planned against fiction;
  • + *
  • the entry keeps excusing that assertion forever, so if the fix is later reverted or eroded + * by an unrelated change, the re-failure is expected and nobody is told — a + * regression that can never be detected again;
  • + *
  • nobody notices that the fix landed, which is exactly the moment the reason text should be + * deleted and the win recorded.
  • + *
+ * The fix is one command ({@code -Dgie.regenerate=true}) and the resulting diff — lines removed + * from the manifest — is the most useful review artefact this whole apparatus produces. + * + *

Why {@code DISAPPEARED} fails: an assertion that stops running has stopped + * being checked. Whether that is a lexer regression, a re-vendor, or a stale manifest entry, it + * needs a human. {@link DiffClassification#NEW} does not fail, because a new assertion is already + * held to the "must pass" default. + * + * @return {@code true} if the build should fail + */ + public boolean shouldFailBuild() { + for (DiffClassification classification : DiffClassification.values()) { + if (classification.failsBuild() && count(classification) > 0) { + return true; + } + } + return false; + } + + /** @return a one-line summary of why the build failed, or {@code ""} if it should not. */ + public String failureSummary() { + if (!shouldFailBuild()) { + return ""; + } + StringBuilder out = new StringBuilder("conformance gate failed:"); + boolean first = true; + for (DiffClassification classification : DiffClassification.values()) { + if (classification.failsBuild() && count(classification) > 0) { + out.append(first ? " " : ", ").append(count(classification)).append(' ').append(classification); + first = false; + } + } + return out.toString(); + } + + @Override + public String toString() { + return "DiffResult" + counts(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ExpectedOutcomeManifest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ExpectedOutcomeManifest.java new file mode 100644 index 0000000..d375936 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ExpectedOutcomeManifest.java @@ -0,0 +1,360 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * The expected-outcome manifest: the set of conformance assertions that are known not to + * pass yet, with a reason for each. + * + *

Format: TSV

+ * + *
+ * # proj4j gie/GIGS conformance - expected-outcome manifest
+ * key	expected	reason
+ * gigs/5110.gie.failing#2:0@0c1f77ad	FAIL	laea ellipsoidal inverse: roundtrip 1000 drift, 105 mm at lat 70
+ * 
+ * + *

Three columns separated by a single tab: the {@link AssertionKey}, the expected outcome + * ({@code FAIL}, {@code SKIP} or {@code VACUOUS_EXPECTED_FAILURE}), and free text. Lines beginning with + * {@code #} are comments; a literal {@code keyexpectedreason} header line is accepted as the + * first non-comment line. + * + *

{@code VACUOUS_EXPECTED_FAILURE} is recorded distinctly from {@code PASS}, which + * is the whole reason it is in the file: implementing a projection flips its vacuous rows to genuine + * passes or genuine failures, and that must read as progress being measured for the first time rather + * than as a regression. Had they been banked as passes, the same event would have looked like several + * hundred regressions. See {@link ConformanceDiff}. + * + *

TSV rather than YAML or JSON, deliberately: + *

    + *
  • No dependency. The conformance module gets JUnit and nothing else; a parser + * for a three-column line format is twenty lines and cannot drift from a spec.
  • + *
  • One line per fact. A file that will hold thousands of entries and shrink by a + * few hundred per stage has to diff cleanly. Nested YAML re-indents; JSON moves commas and + * braces around; a line-oriented file shows exactly the entries that changed.
  • + *
  • Stable order. Combined with {@link AssertionKey}'s total order, regeneration + * is idempotent: identical input produces a byte-identical file.
  • + *
  • Grep- and sort-able. {@code grep 'gie/builtins' manifest.tsv | wc -l} is a + * legitimate and frequently wanted query. Tabs, not spaces, so reasons may contain spaces.
  • + *
+ * + *

Absent key means "expected to pass"

+ * + *

{@link #expectedOutcome(AssertionKey)} returns {@link AssertionOutcome#PASS} for any key it does + * not hold. The manifest therefore records only the non-passing minority. Three consequences, + * all wanted: + * + *

    + *
  1. The file shrinks as the project succeeds. A manifest that lists all 7,923 + * assertions would be roughly constant in size no matter how much work landed; one that lists + * only the remaining failures is a burn-down chart that lives in version control. The right + * incentive is for this file to get smaller.
  2. + *
  3. A newly-appearing assertion defaults to "must pass". When a re-vendor adds + * tests, or when a key changes because upstream edited an operation, the new key is not in the + * manifest and so is held to the strict standard. Failing loudly on new work is correct; the + * alternative, defaulting to "excused", would let a re-vendor quietly widen the baseline.
  4. + *
  5. A {@code PASS} row is a parse error ({@link ManifestEntry#of}), because it + * would be a redundant statement whose only possible effect is confusion about whether absent + * keys are covered.
  6. + *
+ * + *

Immutable. Build with {@link #of(Collection)}, read with {@link #expectedOutcome(AssertionKey)}, + * write with {@link #store(Writer)}. + */ +public final class ExpectedOutcomeManifest { + + /** The optional column-header line. */ + public static final String HEADER = "key\texpected\treason"; + + /** The comment preamble written by {@link #store(Writer)}. */ + private static final String[] PREAMBLE = { + "# proj4j gie/GIGS conformance - expected-outcome manifest.", + "#", + "# One line per assertion that is NOT expected to pass. A key that is absent from this file", + "# is expected to PASS; there are no PASS rows. Columns are tab-separated:", + "#", + "# #:@ ", + "#", + "# VACUOUS_EXPECTED_FAILURE is an `expect failure` row that gie would score a pass but which", + "# measured nothing: the operation could not be created for a reason unrelated to what the row", + "# asserts. It is neither a pass nor a failure, and it is excluded from both sides of the", + "# headline ratio.", + "#", + "# Regenerate (never hand-sort; the writer emits the canonical order):", + "# mvn -Pconformance verify -Dgie.regenerate=true", + "#", + "# Hand-written reasons are preserved across regeneration for entries whose outcome is", + "# unchanged, so it is worth explaining WHY, not just THAT, an assertion fails.", + }; + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final String NEWLINE = "\n"; + + private final SortedMap entries; + + private ExpectedOutcomeManifest(SortedMap entries) { + this.entries = entries; + } + + /** @return an empty manifest — i.e. "every assertion must pass". */ + public static ExpectedOutcomeManifest empty() { + return new ExpectedOutcomeManifest(new TreeMap()); + } + + /** + * @param entries the expected non-pass outcomes; order is irrelevant, duplicates by key are + * rejected + * @return the manifest + * @throws IllegalArgumentException if two entries share a key + */ + public static ExpectedOutcomeManifest of(Collection entries) { + SortedMap map = new TreeMap(); + for (ManifestEntry entry : entries) { + ManifestEntry previous = map.put(entry.key(), entry); + if (previous != null) { + throw new IllegalArgumentException("duplicate manifest key: " + entry.key()); + } + } + return new ExpectedOutcomeManifest(map); + } + + /** + * Loads a manifest from a file. A missing file is not tolerated here; callers that want + * "empty if absent" should check {@link Files#exists} explicitly, so that a mistyped path can + * never be mistaken for a clean baseline. + * + * @param path the manifest file, UTF-8 + * @return the manifest + * @throws IOException if the file cannot be read + * @throws ManifestFormatException if any line is malformed + */ + public static ExpectedOutcomeManifest load(Path path) throws IOException { + Reader reader = new InputStreamReader(Files.newInputStream(path), UTF_8); + try { + return load(reader, path.toString()); + } finally { + reader.close(); + } + } + + /** + * @param reader the manifest text; not closed by this method + * @return the manifest + * @throws IOException if reading fails + * @throws ManifestFormatException if any line is malformed + */ + public static ExpectedOutcomeManifest load(Reader reader) throws IOException { + return load(reader, ""); + } + + /** + * @param reader the manifest text; not closed by this method + * @param source a description used in error messages, typically a path + * @return the manifest + * @throws IOException if reading fails + * @throws ManifestFormatException if any line is malformed + */ + public static ExpectedOutcomeManifest load(Reader reader, String source) throws IOException { + BufferedReader lines = new BufferedReader(reader); + SortedMap map = new TreeMap(); + Map firstSeenAt = new LinkedHashMap(); + int lineNumber = 0; + String line; + while ((line = lines.readLine()) != null) { + lineNumber++; + if (line.endsWith("\r")) { + line = line.substring(0, line.length() - 1); + } + if (line.trim().isEmpty() || line.charAt(0) == '#') { + continue; + } + if (HEADER.equals(line)) { + if (map.isEmpty()) { + continue; + } + throw new ManifestFormatException(source, lineNumber, line, "header line appears after data rows"); + } + String[] columns = line.split("\t", -1); + if (columns.length != 3) { + throw new ManifestFormatException( + source, + lineNumber, + line, + "expected exactly 3 tab-separated columns (key, expected, reason) but found " + columns.length); + } + AssertionKey key; + try { + key = AssertionKey.parse(columns[0]); + } catch (IllegalArgumentException e) { + throw new ManifestFormatException(source, lineNumber, line, "column 1: " + e.getMessage(), e); + } + AssertionOutcome outcome; + try { + outcome = AssertionOutcome.parse(columns[1]); + } catch (IllegalArgumentException e) { + throw new ManifestFormatException(source, lineNumber, line, "column 2: " + e.getMessage(), e); + } + if (outcome == AssertionOutcome.PASS) { + throw new ManifestFormatException( + source, + lineNumber, + line, + "column 2: PASS must not be recorded - the manifest holds only non-PASS " + + "expectations, and an absent key already means \"expected to pass\""); + } + ManifestEntry entry; + try { + entry = ManifestEntry.of(key, outcome, columns[2]); + } catch (IllegalArgumentException e) { + throw new ManifestFormatException(source, lineNumber, line, e.getMessage(), e); + } + Integer previousLine = firstSeenAt.put(key, Integer.valueOf(lineNumber)); + if (previousLine != null) { + throw new ManifestFormatException( + source, lineNumber, line, "duplicate key, first seen on line " + previousLine); + } + map.put(key, entry); + } + return new ExpectedOutcomeManifest(map); + } + + /** + * The expectation for an assertion. + * + * @param key the assertion + * @return the recorded non-pass outcome, or {@link AssertionOutcome#PASS} if the key is absent + */ + public AssertionOutcome expectedOutcome(AssertionKey key) { + ManifestEntry entry = entries.get(key); + return entry == null ? AssertionOutcome.PASS : entry.expectedOutcome(); + } + + /** + * @param key the assertion + * @return the recorded reason, or {@code ""} if the key is absent + */ + public String reason(AssertionKey key) { + ManifestEntry entry = entries.get(key); + return entry == null ? "" : entry.reason(); + } + + /** + * @param key the assertion + * @return the entry, or {@code null} if the key is absent (i.e. expected to pass) + */ + public ManifestEntry entry(AssertionKey key) { + return entries.get(key); + } + + /** @return {@code true} if a non-pass expectation is recorded for {@code key}. */ + public boolean contains(AssertionKey key) { + return entries.containsKey(key); + } + + /** @return the recorded keys, in canonical order. */ + public SortedSet keys() { + return Collections.unmodifiableSortedSet(new TreeSet(entries.keySet())); + } + + /** @return the entries, in canonical order. */ + public List entries() { + return Collections.unmodifiableList(new ArrayList(entries.values())); + } + + /** @return the number of recorded non-pass expectations. */ + public int size() { + return entries.size(); + } + + /** @return {@code true} when nothing is excused — the end state. */ + public boolean isEmpty() { + return entries.isEmpty(); + } + + /** + * Renders the manifest exactly as {@link #store(Writer)} would write it. A pure function, so the + * format is unit-testable without a filesystem. + * + * @return the full file content, {@code \n}-terminated lines + */ + public String render() { + StringBuilder out = new StringBuilder(256 + 96 * entries.size()); + for (int i = 0; i < PREAMBLE.length; i++) { + out.append(PREAMBLE[i]).append(NEWLINE); + } + out.append(HEADER).append(NEWLINE); + for (ManifestEntry entry : entries.values()) { + out.append(entry.toTsvLine()).append(NEWLINE); + } + return out.toString(); + } + + /** + * Writes the manifest in canonical order, so that regenerating an unchanged run rewrites the file + * byte for byte. + * + * @param writer destination; flushed but not closed + * @throws IOException if writing fails + */ + public void store(Writer writer) throws IOException { + writer.write(render()); + writer.flush(); + } + + /** + * @param path destination file, UTF-8; parent directories are created if needed + * @throws IOException if writing fails + */ + public void store(Path path) throws IOException { + Path parent = path.getParent(); + if (parent != null) { + Files.createDirectories(parent); + } + Writer writer = new java.io.OutputStreamWriter(Files.newOutputStream(path), UTF_8); + try { + store(writer); + } finally { + writer.close(); + } + } + + @Override + public String toString() { + StringWriter out = new StringWriter(); + out.write("ExpectedOutcomeManifest[" + entries.size() + " non-pass expectations]"); + return out.toString(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ExpectedOutcomeManifestTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ExpectedOutcomeManifestTest.java new file mode 100644 index 0000000..27dd2c0 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ExpectedOutcomeManifestTest.java @@ -0,0 +1,278 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class ExpectedOutcomeManifestTest { + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + + private static AssertionKey key(String path, int block, int index, String hash) { + return AssertionKey.of(path, block, index, hash); + } + + private static ExpectedOutcomeManifest load(String text) throws IOException { + return ExpectedOutcomeManifest.load(new StringReader(text)); + } + + // ---------------------------------------------------------------- absent key defaults to PASS + + @Test + void anAbsentKeyIsExpectedToPass() { + ExpectedOutcomeManifest manifest = ExpectedOutcomeManifest.empty(); + assertEquals(AssertionOutcome.PASS, manifest.expectedOutcome(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertEquals("", manifest.reason(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertNull(manifest.entry(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertFalse(manifest.contains(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertTrue(manifest.isEmpty()); + assertEquals(0, manifest.size()); + } + + @Test + void anAbsentKeyIsExpectedToPassEvenWhenOtherKeysInTheSameFileAreListed() throws IOException { + ExpectedOutcomeManifest manifest = + load("gie/builtins.gie#0:0@abcdef01\tFAIL\tsomething\n"); + assertEquals(AssertionOutcome.FAIL, manifest.expectedOutcome(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertEquals(AssertionOutcome.PASS, manifest.expectedOutcome(key("gie/builtins.gie", 0, 1, "abcdef02"))); + } + + @Test + void aPassEntryCannotEvenBeConstructed() { + assertThrows( + IllegalArgumentException.class, + () -> ManifestEntry.of(key("gie/builtins.gie", 0, 0, "abcdef01"), AssertionOutcome.PASS, "no")); + } + + // ------------------------------------------------------------------------------ strict parsing + + @Test + void parsesAWellFormedManifest() throws IOException { + String text = "# a comment\n" + + "\n" + + ExpectedOutcomeManifest.HEADER + "\n" + + "gie/builtins.gie#0:0@abcdef01\tFAIL\tno inverse yet\n" + + "gie/epsg_grid.gie#0:0@abcdef02\tSKIP\trequire_grid us_nga_egm08_25.tif\n"; + ExpectedOutcomeManifest manifest = load(text); + assertEquals(2, manifest.size()); + assertEquals(AssertionOutcome.FAIL, manifest.expectedOutcome(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertEquals("no inverse yet", manifest.reason(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertEquals(AssertionOutcome.SKIP, manifest.expectedOutcome(key("gie/epsg_grid.gie", 0, 0, "abcdef02"))); + } + + @Test + void toleratesAnEmptyReasonColumn() throws IOException { + ExpectedOutcomeManifest manifest = load("gie/builtins.gie#0:0@abcdef01\tFAIL\t\n"); + assertEquals("", manifest.reason(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertEquals(1, manifest.size()); + } + + @Test + void toleratesCarriageReturnsAndBlankLines() throws IOException { + ExpectedOutcomeManifest manifest = + load("\r\n# c\r\ngie/builtins.gie#0:0@abcdef01\tFAIL\twhy\r\n \n"); + assertEquals(1, manifest.size()); + assertEquals("why", manifest.reason(key("gie/builtins.gie", 0, 0, "abcdef01"))); + } + + @Test + void failsOnTooFewColumnsAndNamesTheLine() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, + () -> load("# c\ngie/builtins.gie#0:0@abcdef01\tFAIL\tok\ngie/builtins.gie#0:1@abcdef02\tFAIL\n")); + assertEquals(3, e.lineNumber()); + assertTrue(e.getMessage().contains("3 tab-separated columns"), e.getMessage()); + assertTrue(e.getMessage().contains("found 2"), e.getMessage()); + } + + @Test + void failsOnTooManyColumns() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, + () -> load("gie/builtins.gie#0:0@abcdef01\tFAIL\treason\textra\n")); + assertEquals(1, e.lineNumber()); + assertTrue(e.getMessage().contains("found 4"), e.getMessage()); + } + + @Test + void failsOnAMalformedKey() { + ManifestFormatException e = + assertThrows(ManifestFormatException.class, () -> load("gie/builtins.gie#0:0@ab\tFAIL\treason\n")); + assertEquals(1, e.lineNumber()); + assertTrue(e.getMessage().contains("column 1"), e.getMessage()); + } + + @Test + void failsOnAnUnknownOutcome() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, () -> load("gie/builtins.gie#0:0@abcdef01\tXFAIL\treason\n")); + assertEquals(1, e.lineNumber()); + assertTrue(e.getMessage().contains("column 2"), e.getMessage()); + } + + @Test + void failsOnALowerCaseOutcome() { + assertThrows( + ManifestFormatException.class, () -> load("gie/builtins.gie#0:0@abcdef01\tfail\treason\n")); + } + + @Test + void failsOnAPassRowAndSaysWhy() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, () -> load("gie/builtins.gie#0:0@abcdef01\tPASS\tredundant\n")); + assertEquals(1, e.lineNumber()); + assertTrue(e.getMessage().contains("PASS must not be recorded"), e.getMessage()); + } + + @Test + void failsOnADuplicateKeyAndPointsAtTheFirstOccurrence() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, + () -> load("gie/builtins.gie#0:0@abcdef01\tFAIL\tone\n" + + "# noise\n" + + "gie/builtins.gie#0:0@abcdef01\tFAIL\ttwo\n")); + assertEquals(3, e.lineNumber()); + assertTrue(e.getMessage().contains("first seen on line 1"), e.getMessage()); + } + + @Test + void failsOnAHeaderAfterData() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, + () -> load("gie/builtins.gie#0:0@abcdef01\tFAIL\tone\n" + ExpectedOutcomeManifest.HEADER + "\n")); + assertEquals(2, e.lineNumber()); + assertTrue(e.getMessage().contains("header line appears after data"), e.getMessage()); + } + + @Test + void reportsTheSourceNameInTheMessage() { + ManifestFormatException e = assertThrows( + ManifestFormatException.class, + () -> ExpectedOutcomeManifest.load(new StringReader("garbage\n"), "the-manifest.tsv")); + assertEquals("the-manifest.tsv", e.source()); + assertTrue(e.getMessage().startsWith("the-manifest.tsv:1:"), e.getMessage()); + assertEquals("garbage", e.line()); + } + + @Test + void rejectsATabInAReasonAtConstructionTime() { + assertThrows( + IllegalArgumentException.class, + () -> ManifestEntry.of(key("gie/x.gie", 0, 0, "abcdef01"), AssertionOutcome.FAIL, "a\tb")); + assertThrows( + IllegalArgumentException.class, + () -> ManifestEntry.of(key("gie/x.gie", 0, 0, "abcdef01"), AssertionOutcome.FAIL, "a\nb")); + } + + @Test + void rejectsDuplicateKeysWhenBuiltInMemory() { + ManifestEntry one = ManifestEntry.of(key("gie/x.gie", 0, 0, "abcdef01"), AssertionOutcome.FAIL, "one"); + ManifestEntry two = ManifestEntry.of(key("gie/x.gie", 0, 0, "abcdef01"), AssertionOutcome.SKIP, "two"); + assertThrows(IllegalArgumentException.class, () -> ExpectedOutcomeManifest.of(Arrays.asList(one, two))); + } + + // ---------------------------------------------------------------------------- stable rendering + + @Test + void storesInCanonicalOrderRegardlessOfInsertionOrder() throws IOException { + List entries = new ArrayList(); + entries.add(ManifestEntry.of(key("gigs/5110.gie.failing", 2, 0, "0000000c"), AssertionOutcome.FAIL, "laea")); + entries.add(ManifestEntry.of(key("gie/builtins.gie", 10, 0, "0000000b"), AssertionOutcome.FAIL, "b")); + entries.add(ManifestEntry.of(key("gie/builtins.gie", 2, 0, "0000000a"), AssertionOutcome.SKIP, "a")); + + StringWriter out = new StringWriter(); + ExpectedOutcomeManifest.of(entries).store(out); + List dataLines = dataLines(out.toString()); + assertEquals( + Arrays.asList( + "gie/builtins.gie#2:0@0000000a\tSKIP\ta", + "gie/builtins.gie#10:0@0000000b\tFAIL\tb", + "gigs/5110.gie.failing#2:0@0000000c\tFAIL\tlaea"), + dataLines); + } + + @Test + void renderCarriesTheHeaderAndTheRegenerationCommand() { + String rendered = ExpectedOutcomeManifest.empty().render(); + assertTrue(rendered.contains(ExpectedOutcomeManifest.HEADER), rendered); + assertTrue(rendered.contains("-Dgie.regenerate=true"), rendered); + assertTrue(rendered.contains("absent"), "the preamble must state the absent-key default"); + } + + @Test + void renderingIsIdempotentSoRegenerationDiffsMinimally() throws IOException { + ExpectedOutcomeManifest manifest = ExpectedOutcomeManifest.of(Arrays.asList( + ManifestEntry.of(key("gie/builtins.gie", 0, 0, "abcdef01"), AssertionOutcome.FAIL, "one"), + ManifestEntry.of(key("gie/epsg_grid.gie", 1, 0, "abcdef02"), AssertionOutcome.SKIP, "two"))); + String once = manifest.render(); + String twice = load(once).render(); + assertEquals(once, twice); + assertEquals(once, load(twice).render()); + } + + @Test + void roundTripsThroughAFile(@TempDir Path dir) throws IOException { + Path file = dir.resolve("nested/expected-failures.tsv"); + ExpectedOutcomeManifest manifest = ExpectedOutcomeManifest.of(Arrays.asList( + ManifestEntry.of(key("gie/builtins.gie", 0, 0, "abcdef01"), AssertionOutcome.FAIL, "unicode: ±0.42 m"), + ManifestEntry.of(key("gie/epsg_grid.gie", 1, 0, "abcdef02"), AssertionOutcome.SKIP, "grid"))); + manifest.store(file); + + assertTrue(Files.exists(file)); + ExpectedOutcomeManifest reloaded = ExpectedOutcomeManifest.load(file); + assertEquals(manifest.entries(), reloaded.entries()); + assertEquals("unicode: ±0.42 m", reloaded.reason(key("gie/builtins.gie", 0, 0, "abcdef01"))); + assertTrue(new String(Files.readAllBytes(file), UTF_8).endsWith("\n")); + } + + @Test + void entriesAndKeysAreExposedInCanonicalOrder() { + ExpectedOutcomeManifest manifest = ExpectedOutcomeManifest.of(Arrays.asList( + ManifestEntry.of(key("gie/b.gie", 0, 0, "abcdef02"), AssertionOutcome.FAIL, "b"), + ManifestEntry.of(key("gie/a.gie", 0, 0, "abcdef01"), AssertionOutcome.FAIL, "a"))); + assertEquals( + Arrays.asList(key("gie/a.gie", 0, 0, "abcdef01"), key("gie/b.gie", 0, 0, "abcdef02")), + new ArrayList(manifest.keys())); + assertEquals("a", manifest.entries().get(0).reason()); + } + + private static List dataLines(String rendered) { + List lines = new ArrayList(); + for (String line : rendered.split("\n", -1)) { + if (line.isEmpty() || line.startsWith("#") || line.equals(ExpectedOutcomeManifest.HEADER)) { + continue; + } + lines.add(line); + } + return lines; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestEntry.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestEntry.java new file mode 100644 index 0000000..5b3752a --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestEntry.java @@ -0,0 +1,131 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * One line of the expected-outcome manifest: an assertion that is not expected to pass, the + * outcome expected of it, and a human explanation. + * + *

The expected outcome may never be {@link AssertionOutcome#PASS} — see + * {@link ExpectedOutcomeManifest} for why the manifest records only non-passes. + * + *

The reason is free text, but may not contain a tab or a newline, because the manifest is + * line-oriented TSV. It is the field that survives regeneration + * ({@link ManifestRegenerator}), so it is worth writing properly: "syntax artefact, no {@code \} + * continuation, {@code +step} swallowed as a comment" is useful; "fails" is not. + * + *

Immutable. + */ +public final class ManifestEntry implements Comparable { + + private final AssertionKey key; + private final AssertionOutcome expectedOutcome; + private final String reason; + + private ManifestEntry(AssertionKey key, AssertionOutcome expectedOutcome, String reason) { + this.key = key; + this.expectedOutcome = expectedOutcome; + this.reason = reason; + } + + /** + * @param key the assertion this entry excuses + * @param expectedOutcome {@link AssertionOutcome#FAIL}, {@link AssertionOutcome#SKIP} or + * {@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE} + * @param reason free text, may be empty but not {@code null}, and may not contain a tab or newline + * @return the entry + * @throws IllegalArgumentException if the outcome is {@code PASS} or the reason is not TSV-safe + */ + public static ManifestEntry of(AssertionKey key, AssertionOutcome expectedOutcome, String reason) { + if (key == null) { + throw new IllegalArgumentException("key must not be null"); + } + if (expectedOutcome == null) { + throw new IllegalArgumentException("expected outcome must not be null"); + } + if (expectedOutcome == AssertionOutcome.PASS) { + throw new IllegalArgumentException( + "the manifest records only non-PASS expectations; an absent key already means " + + "\"expected to pass\" (offending key: " + key + ")"); + } + if (reason == null) { + throw new IllegalArgumentException("reason must not be null (use \"\" for none)"); + } + if (reason.indexOf('\t') >= 0 || reason.indexOf('\n') >= 0 || reason.indexOf('\r') >= 0) { + throw new IllegalArgumentException( + "reason must not contain a tab or newline (the manifest is TSV): \"" + reason + "\""); + } + return new ManifestEntry(key, expectedOutcome, reason); + } + + /** @return the assertion identity. */ + public AssertionKey key() { + return key; + } + + /** @return the expected non-pass outcome. */ + public AssertionOutcome expectedOutcome() { + return expectedOutcome; + } + + /** @return the human explanation; possibly empty, never {@code null}. */ + public String reason() { + return reason; + } + + /** @return a copy of this entry with a different reason. */ + public ManifestEntry withReason(String newReason) { + return of(key, expectedOutcome, newReason); + } + + /** @return the TSV line for this entry, without a line terminator. */ + public String toTsvLine() { + return key + "\t" + expectedOutcome.name() + "\t" + reason; + } + + /** Ordered by {@link AssertionKey}'s total order, then outcome, then reason. */ + @Override + public int compareTo(ManifestEntry other) { + int byKey = key.compareTo(other.key); + if (byKey != 0) { + return byKey; + } + int byOutcome = expectedOutcome.compareTo(other.expectedOutcome); + return byOutcome != 0 ? byOutcome : reason.compareTo(other.reason); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ManifestEntry)) { + return false; + } + ManifestEntry other = (ManifestEntry) o; + return key.equals(other.key) && expectedOutcome == other.expectedOutcome && reason.equals(other.reason); + } + + @Override + public int hashCode() { + return (31 * key.hashCode() + expectedOutcome.hashCode()) * 31 + reason.hashCode(); + } + + @Override + public String toString() { + return toTsvLine(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestFormatException.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestFormatException.java new file mode 100644 index 0000000..e9b3e31 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestFormatException.java @@ -0,0 +1,76 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * Thrown when a manifest or corpus-index file is malformed. + * + *

Parsing is strict and fails on the first bad line rather than skipping it. A manifest that + * silently drops a line it cannot understand is worse than no manifest: the dropped entry defaults to + * "expected to pass", so a typo in a key would turn a known failure into a build-breaking regression + * — or, in the other direction, hide one. The offending {@linkplain #lineNumber() line number} and + * {@linkplain #line() text} are always reported so the fix is a one-line edit. + */ +public final class ManifestFormatException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private final String source; + private final int lineNumber; + private final String line; + + /** + * @param source a description of where the text came from, e.g. a path, or {@code ""} + * @param lineNumber 1-based line number of the offending line + * @param line the offending line, verbatim + * @param problem what is wrong with it + */ + public ManifestFormatException(String source, int lineNumber, String line, String problem) { + super(source + ":" + lineNumber + ": " + problem + " [line was: \"" + line + "\"]"); + this.source = source; + this.lineNumber = lineNumber; + this.line = line; + } + + /** + * @param source a description of where the text came from + * @param lineNumber 1-based line number of the offending line + * @param line the offending line, verbatim + * @param problem what is wrong with it + * @param cause the underlying failure + */ + public ManifestFormatException(String source, int lineNumber, String line, String problem, Throwable cause) { + super(source + ":" + lineNumber + ": " + problem + " [line was: \"" + line + "\"]", cause); + this.source = source; + this.lineNumber = lineNumber; + this.line = line; + } + + /** @return description of the origin of the malformed text. */ + public String source() { + return source; + } + + /** @return 1-based line number of the malformed line. */ + public int lineNumber() { + return lineNumber; + } + + /** @return the malformed line, verbatim. */ + public String line() { + return line; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestRegenerator.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestRegenerator.java new file mode 100644 index 0000000..ce7364e --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestRegenerator.java @@ -0,0 +1,161 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +/** + * Rewrites the expected-outcome manifest from an observed run. + * + *

Invocation

+ * + *

The gate and the regenerator are the same run; only the last step differs. Intended usage: + * + *

+ *   mvn -Pconformance verify                          # gate: fails on REGRESSED / UNEXPECTED_PASS / DISAPPEARED
+ *   mvn -Pconformance verify -Dgie.regenerate=true    # accept the current state as the new baseline
+ * 
+ * + *

{@link #isRegenerationRequested()} reads the {@value #REGENERATE_PROPERTY} system property, which + * the surefire/failsafe execution is expected to forward. No {@code pom.xml} is touched by this + * class; wiring the profile is a separate concern. + * + *

Regeneration writes two files: the manifest itself and the sibling {@link CorpusIndex}, which + * records every key that existed at generation time. Both must be regenerated together, or the next + * diff will report phantom {@code NEW}/{@code DISAPPEARED} entries. + * + *

Reason preservation

+ * + *

The single most valuable content in the manifest is the hand-written {@code reason} column — "no + * {@code \} continuation, {@code +step} swallowed as a comment: syntax artefact, not maths" is the + * difference between a five-minute triage and a five-hour one. Regeneration therefore + * carries the previous reason over whenever the key's expected outcome is unchanged. + * A reason is only replaced when the outcome itself changed (FAIL becoming SKIP, say), because the old + * text then describes something that is no longer true. + * + *

For genuinely new entries the reason is seeded from the run's + * {@linkplain ObservedAssertion#detail() detail} — the measured deviation or the missing grid — and + * left empty if there is none. Empty reasons are legal and are the natural TODO list. + * + *

Vacuous rows are banked as vacuous

+ * + *

Everything that is not a {@link AssertionOutcome#PASS} gets an entry, so a + * {@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE} is written to the manifest under its own name + * rather than either omitted (which would silently claim it passes) or downgraded to {@code FAIL} + * (which would claim it was measured). That is what makes the later transition legible: when the + * missing implementation lands, the diff shows those keys as {@code UNEXPECTED_PASS} or + * {@code STILL_FAILING}, never as {@code REGRESSED}. + */ +public final class ManifestRegenerator { + + /** System property that switches a gate run into a regeneration run. */ + public static final String REGENERATE_PROPERTY = "gie.regenerate"; + + private ManifestRegenerator() {} + + /** @return {@code true} if {@code -Dgie.regenerate=true} was passed. */ + public static boolean isRegenerationRequested() { + return Boolean.parseBoolean(System.getProperty(REGENERATE_PROPERTY, "false")); + } + + /** + * Builds the manifest that describes {@code observed}, preserving reasons from {@code previous}. + * + *

Every non-passing assertion in the run gets an entry; every passing one gets none, so entries + * for assertions that have started passing simply vanish — that deletion is the record of + * progress, and it is what makes the regeneration diff worth reading. Entries in {@code previous} + * whose key is not in the run are dropped too: a manifest entry that matches nothing is dead + * weight. (The gate reports those as {@link DiffClassification#DISAPPEARED} before anyone gets to + * regenerate, so the drop is never silent.) + * + * @param previous the manifest being replaced; use {@link ExpectedOutcomeManifest#empty()} for a + * first generation + * @param observed the run + * @return the new manifest + */ + public static ExpectedOutcomeManifest regenerate(ExpectedOutcomeManifest previous, ObservedRun observed) { + if (previous == null || observed == null) { + throw new IllegalArgumentException("previous manifest and observed run are both required"); + } + List entries = new ArrayList(); + for (ObservedAssertion assertion : observed.assertions()) { + if (assertion.outcome() == AssertionOutcome.PASS) { + continue; + } + ManifestEntry existing = previous.entry(assertion.key()); + String reason; + if (existing != null && existing.expectedOutcome() == assertion.outcome()) { + reason = existing.reason(); + } else { + reason = assertion.detail(); + } + entries.add(ManifestEntry.of(assertion.key(), assertion.outcome(), reason)); + } + return ExpectedOutcomeManifest.of(entries); + } + + /** + * Loads the manifest at {@code manifestPath} (or starts empty if it does not exist), regenerates it + * from {@code observed}, and writes both the manifest and the corpus index. + * + * @param manifestPath the manifest file + * @param corpusIndexPath the corpus index file; {@code null} to skip writing it + * @param observed the run + * @return the manifest that was written + * @throws IOException if reading or writing fails + * @throws ManifestFormatException if the existing manifest is malformed — a broken baseline is + * never silently overwritten, because the reasons in it are unrecoverable once lost + */ + public static ExpectedOutcomeManifest regenerateInPlace(Path manifestPath, Path corpusIndexPath, ObservedRun observed) + throws IOException { + ExpectedOutcomeManifest previous = + Files.exists(manifestPath) ? ExpectedOutcomeManifest.load(manifestPath) : ExpectedOutcomeManifest.empty(); + ExpectedOutcomeManifest regenerated = regenerate(previous, observed); + regenerated.store(manifestPath); + if (corpusIndexPath != null) { + CorpusIndex.ofRun(observed).store(corpusIndexPath); + } + return regenerated; + } + + /** + * Describes what a regeneration would change, for logging before it happens. + * + * @param previous the manifest being replaced + * @param regenerated the manifest produced by {@link #regenerate} + * @return a one-line summary, e.g. {@code "manifest: 1204 -> 1189 entries (17 removed, 2 added)"} + */ + public static String describeChange(ExpectedOutcomeManifest previous, ExpectedOutcomeManifest regenerated) { + int removed = 0; + for (AssertionKey key : previous.keys()) { + if (!regenerated.contains(key)) { + removed++; + } + } + int added = 0; + for (AssertionKey key : regenerated.keys()) { + if (!previous.contains(key)) { + added++; + } + } + return "manifest: " + previous.size() + " -> " + regenerated.size() + " entries (" + removed + " removed, " + + added + " added)"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestRegeneratorTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestRegeneratorTest.java new file mode 100644 index 0000000..672b1e7 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ManifestRegeneratorTest.java @@ -0,0 +1,273 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class ManifestRegeneratorTest { + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + + private static final AssertionKey A = AssertionKey.of("gie/builtins.gie", 0, 0, "00000001"); + private static final AssertionKey B = AssertionKey.of("gie/builtins.gie", 0, 1, "00000002"); + private static final AssertionKey C = AssertionKey.of("gigs/5110.gie.failing", 2, 0, "00000003"); + + private static final String HAND_WRITTEN = + "syntax artefact: no trailing \" \\\" continuation, +step swallowed as a comment"; + + private static ExpectedOutcomeManifest manifest(ManifestEntry... entries) { + return ExpectedOutcomeManifest.of(Arrays.asList(entries)); + } + + @Test + void banksAVacuousExpectedFailureAsVacuousRatherThanAsAPassOrAFailure() { + ObservedRun observed = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "VACUOUS: adams_hemi is not implemented") + .build(); + + ExpectedOutcomeManifest regenerated = + ManifestRegenerator.regenerate(ExpectedOutcomeManifest.empty(), observed); + + // Omitting it would claim it passes; writing FAIL would claim it was measured. Neither is true, + // and both would make the eventual implementation read as a regression. + assertEquals(1, regenerated.size(), "the pass is absent by convention, the vacuity is present"); + assertFalse(regenerated.contains(A)); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, regenerated.expectedOutcome(B)); + assertEquals("VACUOUS: adams_hemi is not implemented", regenerated.reason(B)); + assertTrue(regenerated.render().contains("\tVACUOUS_EXPECTED_FAILURE\t"), regenerated.render()); + } + + @Test + void aBankedVacuityThatBecomesMeasuredIsNotARegressionOnTheNextRun() { + // The full round trip: bank a vacuous row, then observe the run after the implementation lands. + ExpectedOutcomeManifest banked = ManifestRegenerator.regenerate( + ExpectedOutcomeManifest.empty(), + ObservedRun.builder() + .record(A, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "no implementation") + .record(B, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "no implementation") + .build()); + + ObservedRun afterTheFix = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL, "0.42 m off") + .build(); + DiffResult diff = ConformanceDiff.compare(banked, afterTheFix, CorpusIndex.ofRun(afterTheFix)); + + assertEquals(0, diff.count(DiffClassification.REGRESSED), + "implementing the missing operator must never read as a regression"); + assertEquals(1, diff.count(DiffClassification.UNEXPECTED_PASS)); + assertEquals(1, diff.count(DiffClassification.STILL_FAILING)); + } + + @Test + void preservesAHandWrittenReasonWhenTheOutcomeIsUnchanged() { + ExpectedOutcomeManifest previous = manifest(ManifestEntry.of(C, AssertionOutcome.FAIL, HAND_WRITTEN)); + ObservedRun observed = + ObservedRun.builder().record(C, AssertionOutcome.FAIL, "1312 mm off at lat 30").build(); + + ExpectedOutcomeManifest regenerated = ManifestRegenerator.regenerate(previous, observed); + + assertEquals(HAND_WRITTEN, regenerated.reason(C), "the run's detail must not clobber a triaged reason"); + assertEquals(AssertionOutcome.FAIL, regenerated.expectedOutcome(C)); + } + + @Test + void replacesTheReasonWhenTheOutcomeChanged() { + ExpectedOutcomeManifest previous = manifest(ManifestEntry.of(C, AssertionOutcome.FAIL, HAND_WRITTEN)); + ObservedRun observed = ObservedRun.builder() + .record(C, AssertionOutcome.SKIP, "require_grid fr_ign_RAF20.tif not resolvable") + .build(); + + ExpectedOutcomeManifest regenerated = ManifestRegenerator.regenerate(previous, observed); + + assertEquals(AssertionOutcome.SKIP, regenerated.expectedOutcome(C)); + assertEquals("require_grid fr_ign_RAF20.tif not resolvable", regenerated.reason(C)); + } + + @Test + void seedsANewEntryFromTheRunDetail() { + ObservedRun observed = + ObservedRun.builder().record(A, AssertionOutcome.FAIL, "0.42 m off (adams ell_int_5)").build(); + ExpectedOutcomeManifest regenerated = + ManifestRegenerator.regenerate(ExpectedOutcomeManifest.empty(), observed); + assertEquals("0.42 m off (adams ell_int_5)", regenerated.reason(A)); + } + + @Test + void leavesTheReasonEmptyWhenTheRunHasNoDetail() { + ObservedRun observed = ObservedRun.builder().record(A, AssertionOutcome.FAIL).build(); + assertEquals("", ManifestRegenerator.regenerate(ExpectedOutcomeManifest.empty(), observed).reason(A)); + } + + @Test + void dropsEntriesForAssertionsThatNowPass() { + ExpectedOutcomeManifest previous = manifest( + ManifestEntry.of(A, AssertionOutcome.FAIL, "was failing"), + ManifestEntry.of(B, AssertionOutcome.FAIL, HAND_WRITTEN)); + ObservedRun observed = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL, "still off") + .build(); + + ExpectedOutcomeManifest regenerated = ManifestRegenerator.regenerate(previous, observed); + + assertEquals(1, regenerated.size()); + assertFalse(regenerated.contains(A), "a passing assertion must vanish from the manifest"); + assertEquals(HAND_WRITTEN, regenerated.reason(B)); + } + + @Test + void dropsEntriesWhoseKeyIsNoLongerObserved() { + ExpectedOutcomeManifest previous = manifest(ManifestEntry.of(A, AssertionOutcome.FAIL, "upstream edited this")); + ObservedRun observed = ObservedRun.builder().record(B, AssertionOutcome.FAIL, "new key").build(); + + ExpectedOutcomeManifest regenerated = ManifestRegenerator.regenerate(previous, observed); + + assertEquals(1, regenerated.size()); + assertFalse(regenerated.contains(A)); + assertTrue(regenerated.contains(B)); + } + + @Test + void aRegeneratedManifestPassesItsOwnGate() { + ObservedRun observed = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL, "off by 0.42 m") + .record(C, AssertionOutcome.SKIP, "require_grid") + .build(); + ExpectedOutcomeManifest regenerated = + ManifestRegenerator.regenerate(ExpectedOutcomeManifest.empty(), observed); + DiffResult diff = ConformanceDiff.compare(regenerated, observed, CorpusIndex.ofRun(observed)); + assertFalse(diff.shouldFailBuild(), diff.failureSummary()); + assertEquals(1, diff.count(DiffClassification.UNCHANGED)); + assertEquals(2, diff.count(DiffClassification.STILL_FAILING)); + } + + @Test + void regenerationIsIdempotent() { + ObservedRun observed = ObservedRun.builder() + .record(A, AssertionOutcome.FAIL, "detail") + .record(C, AssertionOutcome.SKIP, "grid") + .build(); + ExpectedOutcomeManifest once = ManifestRegenerator.regenerate(ExpectedOutcomeManifest.empty(), observed); + ExpectedOutcomeManifest twice = ManifestRegenerator.regenerate(once, observed); + assertEquals(once.render(), twice.render()); + } + + @Test + void reasonsSurviveAFullFileRoundTrip(@TempDir Path dir) throws IOException { + Path manifestPath = dir.resolve("expected-failures.tsv"); + Path indexPath = dir.resolve("corpus-index.tsv"); + manifest(ManifestEntry.of(C, AssertionOutcome.FAIL, HAND_WRITTEN)).store(manifestPath); + + ObservedRun observed = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(C, AssertionOutcome.FAIL, "1312 mm off at lat 30") + .build(); + ExpectedOutcomeManifest written = ManifestRegenerator.regenerateInPlace(manifestPath, indexPath, observed); + + assertEquals(HAND_WRITTEN, written.reason(C)); + assertEquals(HAND_WRITTEN, ExpectedOutcomeManifest.load(manifestPath).reason(C)); + assertTrue(new String(Files.readAllBytes(manifestPath), UTF_8).contains(HAND_WRITTEN)); + + CorpusIndex index = CorpusIndex.load(indexPath); + assertEquals(2, index.size()); + assertTrue(index.contains(A), "the index must record passing keys too, or they look NEW next time"); + assertTrue(index.contains(C)); + } + + @Test + void generatesFromScratchWhenNoManifestExists(@TempDir Path dir) throws IOException { + Path manifestPath = dir.resolve("sub/expected-failures.tsv"); + ObservedRun observed = ObservedRun.builder().record(A, AssertionOutcome.FAIL, "first run").build(); + + ExpectedOutcomeManifest written = ManifestRegenerator.regenerateInPlace(manifestPath, null, observed); + + assertEquals(1, written.size()); + assertTrue(Files.exists(manifestPath)); + assertEquals("first run", ExpectedOutcomeManifest.load(manifestPath).reason(A)); + } + + @Test + void refusesToOverwriteAMalformedManifest(@TempDir Path dir) throws IOException { + Path manifestPath = dir.resolve("expected-failures.tsv"); + Files.write(manifestPath, "this is not a manifest\n".getBytes(UTF_8)); + ObservedRun observed = ObservedRun.builder().record(A, AssertionOutcome.FAIL, "x").build(); + + assertThrows( + ManifestFormatException.class, + () -> ManifestRegenerator.regenerateInPlace(manifestPath, null, observed)); + assertEquals("this is not a manifest\n", new String(Files.readAllBytes(manifestPath), UTF_8)); + } + + @Test + void describesWhatChanged() { + ExpectedOutcomeManifest previous = manifest( + ManifestEntry.of(A, AssertionOutcome.FAIL, "fixed soon"), + ManifestEntry.of(B, AssertionOutcome.FAIL, "still broken")); + ObservedRun observed = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL, "still broken") + .record(C, AssertionOutcome.FAIL, "newly failing") + .build(); + ExpectedOutcomeManifest regenerated = ManifestRegenerator.regenerate(previous, observed); + assertEquals("manifest: 2 -> 2 entries (1 removed, 1 added)", ManifestRegenerator.describeChange(previous, regenerated)); + } + + @Test + void regenerationIsRequestedOnlyByTheDocumentedProperty() { + assertEquals("gie.regenerate", ManifestRegenerator.REGENERATE_PROPERTY); + String saved = System.getProperty(ManifestRegenerator.REGENERATE_PROPERTY); + try { + System.clearProperty(ManifestRegenerator.REGENERATE_PROPERTY); + assertFalse( + ManifestRegenerator.isRegenerationRequested(), + "absent property must not rewrite the baseline: mvn -Pconformance verify is a gate"); + System.setProperty(ManifestRegenerator.REGENERATE_PROPERTY, "false"); + assertFalse(ManifestRegenerator.isRegenerationRequested()); + System.setProperty(ManifestRegenerator.REGENERATE_PROPERTY, "true"); + assertTrue(ManifestRegenerator.isRegenerationRequested()); + } finally { + if (saved == null) { + System.clearProperty(ManifestRegenerator.REGENERATE_PROPERTY); + } else { + System.setProperty(ManifestRegenerator.REGENERATE_PROPERTY, saved); + } + } + } + + @Test + void rejectsNullArguments() { + assertThrows( + IllegalArgumentException.class, + () -> ManifestRegenerator.regenerate(null, ObservedRun.empty())); + assertThrows( + IllegalArgumentException.class, + () -> ManifestRegenerator.regenerate(ExpectedOutcomeManifest.empty(), null)); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedAssertion.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedAssertion.java new file mode 100644 index 0000000..f264975 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedAssertion.java @@ -0,0 +1,136 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +/** + * What actually happened to one assertion in one run: its identity, its outcome, and an optional + * one-line detail (the measured deviation, the {@code errno} mismatch, the name of the missing grid). + * + *

The detail is free text and is used for two things: it appears in the report next to a + * regression, and it seeds the {@code reason} column when {@link ManifestRegenerator} first records a + * newly-failing assertion. Tabs and newlines are collapsed to spaces on construction so that it can + * always be written to the TSV manifest. + * + *

Immutable. + */ +public final class ObservedAssertion implements Comparable { + + private final AssertionKey key; + private final AssertionOutcome outcome; + private final String detail; + + private ObservedAssertion(AssertionKey key, AssertionOutcome outcome, String detail) { + this.key = key; + this.outcome = outcome; + this.detail = detail; + } + + /** + * @param key the assertion + * @param outcome what happened + * @return an observation with no detail + */ + public static ObservedAssertion of(AssertionKey key, AssertionOutcome outcome) { + return of(key, outcome, ""); + } + + /** + * @param key the assertion + * @param outcome what happened + * @param detail one-line explanation; {@code null} is treated as empty, and tabs/newlines are + * collapsed to single spaces + * @return the observation + */ + public static ObservedAssertion of(AssertionKey key, AssertionOutcome outcome, String detail) { + if (key == null) { + throw new IllegalArgumentException("key must not be null"); + } + if (outcome == null) { + throw new IllegalArgumentException("outcome must not be null"); + } + return new ObservedAssertion(key, outcome, flatten(detail)); + } + + /** + * Collapses a possibly multi-line message into one TSV-safe line. + * + * @param text the raw detail, may be {@code null} + * @return a single-line, tab-free string, never {@code null} + */ + public static String flatten(String text) { + if (text == null) { + return ""; + } + String flattened = text.replace('\t', ' ').replace('\r', ' ').replace('\n', ' '); + StringBuilder collapsed = new StringBuilder(flattened.length()); + boolean lastWasSpace = false; + for (int i = 0; i < flattened.length(); i++) { + char c = flattened.charAt(i); + if (c == ' ') { + if (!lastWasSpace) { + collapsed.append(' '); + } + lastWasSpace = true; + } else { + collapsed.append(c); + lastWasSpace = false; + } + } + return collapsed.toString().trim(); + } + + /** @return the assertion identity. */ + public AssertionKey key() { + return key; + } + + /** @return the observed outcome. */ + public AssertionOutcome outcome() { + return outcome; + } + + /** @return the one-line detail; possibly empty, never {@code null}. */ + public String detail() { + return detail; + } + + @Override + public int compareTo(ObservedAssertion other) { + return key.compareTo(other.key); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ObservedAssertion)) { + return false; + } + ObservedAssertion other = (ObservedAssertion) o; + return key.equals(other.key) && outcome == other.outcome && detail.equals(other.detail); + } + + @Override + public int hashCode() { + return (31 * key.hashCode() + outcome.hashCode()) * 31 + detail.hashCode(); + } + + @Override + public String toString() { + return key + " " + outcome + (detail.isEmpty() ? "" : " (" + detail + ")"); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedRun.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedRun.java new file mode 100644 index 0000000..a3a3a20 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedRun.java @@ -0,0 +1,210 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * The result of one execution of the conformance corpus: every assertion that was evaluated, with its + * outcome. + * + *

This is the runner's output and the input to {@link ConformanceDiff}, + * {@link ManifestRegenerator} and the report. It deliberately knows nothing about how assertions are + * executed, so both live runs and hand-built fixtures can be diffed and rendered by the same code. + * + *

Tallies are kept as three independent counts. There is no "not failing" count, because + * {@link AssertionOutcome#SKIP} is not a pass. + * + *

Immutable; build with {@link #builder()}. + */ +public final class ObservedRun { + + private final SortedMap assertions; + private final Map counts; + + private ObservedRun(SortedMap assertions) { + this.assertions = assertions; + Map tally = new EnumMap(AssertionOutcome.class); + for (AssertionOutcome outcome : AssertionOutcome.values()) { + tally.put(outcome, Integer.valueOf(0)); + } + for (ObservedAssertion observed : assertions.values()) { + tally.put(observed.outcome(), Integer.valueOf(tally.get(observed.outcome()).intValue() + 1)); + } + this.counts = Collections.unmodifiableMap(tally); + } + + /** @return a new builder. */ + public static Builder builder() { + return new Builder(); + } + + /** @return an empty run. */ + public static ObservedRun empty() { + return new ObservedRun(new TreeMap()); + } + + /** + * @param key the assertion + * @return the observation, or {@code null} if the assertion was not part of this run + */ + public ObservedAssertion get(AssertionKey key) { + return assertions.get(key); + } + + /** + * @param key the assertion + * @return the observed outcome, or {@code null} if the assertion was not part of this run. + * {@code null} is not "pass": an assertion that did not run has no outcome, and the diff + * reports it as {@code DISAPPEARED}. + */ + public AssertionOutcome outcome(AssertionKey key) { + ObservedAssertion observed = assertions.get(key); + return observed == null ? null : observed.outcome(); + } + + /** @return {@code true} if the assertion was evaluated in this run. */ + public boolean contains(AssertionKey key) { + return assertions.containsKey(key); + } + + /** @return the observed keys, in canonical order. */ + public SortedSet keys() { + return Collections.unmodifiableSortedSet(new TreeSet(assertions.keySet())); + } + + /** @return the observations, in canonical order. */ + public List assertions() { + return Collections.unmodifiableList(new ArrayList(assertions.values())); + } + + /** + * @param outcome the outcome to count + * @return how many assertions had that outcome + */ + public int count(AssertionOutcome outcome) { + return counts.get(outcome).intValue(); + } + + /** @return the number of assertions evaluated (passes + failures + skips). */ + public int total() { + return assertions.size(); + } + + /** @return the corpus-relative file paths seen in this run, alphabetically. */ + public SortedSet filePaths() { + SortedSet paths = new TreeSet(); + for (AssertionKey key : assertions.keySet()) { + paths.add(key.filePath()); + } + return Collections.unmodifiableSortedSet(paths); + } + + /** + * @param filePath a corpus-relative path + * @return the observations for that file, in canonical order + */ + public List assertionsIn(String filePath) { + List selected = new ArrayList(); + for (ObservedAssertion observed : assertions.values()) { + if (observed.key().filePath().equals(filePath)) { + selected.add(observed); + } + } + return Collections.unmodifiableList(selected); + } + + /** + * @param filePath a corpus-relative path + * @param outcome the outcome to count + * @return how many assertions in that file had that outcome + */ + public int countIn(String filePath, AssertionOutcome outcome) { + int n = 0; + for (ObservedAssertion observed : assertions.values()) { + if (observed.outcome() == outcome && observed.key().filePath().equals(filePath)) { + n++; + } + } + return n; + } + + @Override + public String toString() { + return "ObservedRun[" + count(AssertionOutcome.PASS) + " pass, " + count(AssertionOutcome.FAIL) + " fail, " + + count(AssertionOutcome.SKIP) + " skip]"; + } + + /** Accumulates observations. Not thread-safe; a run is assembled by one thread. */ + public static final class Builder { + + private final SortedMap assertions = + new TreeMap(); + + private Builder() {} + + /** + * @param key the assertion + * @param outcome what happened + * @return this builder + * @throws IllegalArgumentException if the key was already recorded + */ + public Builder record(AssertionKey key, AssertionOutcome outcome) { + return record(ObservedAssertion.of(key, outcome)); + } + + /** + * @param key the assertion + * @param outcome what happened + * @param detail one-line explanation + * @return this builder + * @throws IllegalArgumentException if the key was already recorded + */ + public Builder record(AssertionKey key, AssertionOutcome outcome, String detail) { + return record(ObservedAssertion.of(key, outcome, detail)); + } + + /** + * @param observed the observation + * @return this builder + * @throws IllegalArgumentException if the key was already recorded — a duplicate key means the + * key scheme has collided or the runner double-counted, and either way the tally would be + * wrong + */ + public Builder record(ObservedAssertion observed) { + ObservedAssertion previous = assertions.put(observed.key(), observed); + if (previous != null) { + throw new IllegalArgumentException( + "assertion recorded twice in one run: " + observed.key() + " (was " + previous.outcome() + + ", now " + observed.outcome() + ")"); + } + return this; + } + + /** @return the immutable run. */ + public ObservedRun build() { + return new ObservedRun(new TreeMap(assertions)); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedRunTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedRunTest.java new file mode 100644 index 0000000..72e7db3 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/ObservedRunTest.java @@ -0,0 +1,167 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.ArrayList; +import org.junit.jupiter.api.Test; + +class ObservedRunTest { + + private static final AssertionKey A = AssertionKey.of("gie/builtins.gie", 0, 0, "00000001"); + private static final AssertionKey B = AssertionKey.of("gie/builtins.gie", 0, 1, "00000002"); + private static final AssertionKey C = AssertionKey.of("gigs/5110.gie.failing", 2, 0, "00000003"); + + @Test + void tabulatesTheThreeOutcomesIndependently() { + ObservedRun run = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL) + .record(C, AssertionOutcome.SKIP) + .build(); + assertEquals(1, run.count(AssertionOutcome.PASS)); + assertEquals(1, run.count(AssertionOutcome.FAIL)); + assertEquals(1, run.count(AssertionOutcome.SKIP)); + assertEquals(3, run.total()); + } + + @Test + void aSkipIsNeverAPass() { + ObservedRun run = ObservedRun.builder().record(C, AssertionOutcome.SKIP).build(); + assertEquals(0, run.count(AssertionOutcome.PASS)); + assertEquals(1, run.count(AssertionOutcome.SKIP)); + assertFalse(AssertionOutcome.SKIP.isPass()); + assertTrue(AssertionOutcome.SKIP.isNotPass()); + assertTrue(AssertionOutcome.PASS.isPass()); + assertTrue(AssertionOutcome.FAIL.isNotPass()); + } + + @Test + void anUnobservedKeyHasNoOutcomeRatherThanAPass() { + ObservedRun run = ObservedRun.builder().record(A, AssertionOutcome.PASS).build(); + assertNull(run.outcome(B)); + assertNull(run.get(B)); + assertFalse(run.contains(B)); + } + + @Test + void rejectsTheSameAssertionTwice() { + ObservedRun.Builder builder = ObservedRun.builder().record(A, AssertionOutcome.PASS); + assertThrows(IllegalArgumentException.class, () -> builder.record(A, AssertionOutcome.FAIL)); + } + + @Test + void groupsByFile() { + ObservedRun run = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.FAIL) + .record(C, AssertionOutcome.SKIP) + .build(); + assertEquals( + Arrays.asList("gie/builtins.gie", "gigs/5110.gie.failing"), + new ArrayList(run.filePaths())); + assertEquals(2, run.assertionsIn("gie/builtins.gie").size()); + assertEquals(1, run.countIn("gie/builtins.gie", AssertionOutcome.PASS)); + assertEquals(1, run.countIn("gie/builtins.gie", AssertionOutcome.FAIL)); + assertEquals(0, run.countIn("gie/builtins.gie", AssertionOutcome.SKIP)); + assertEquals(1, run.countIn("gigs/5110.gie.failing", AssertionOutcome.SKIP)); + } + + @Test + void ordersAssertionsCanonically() { + ObservedRun run = ObservedRun.builder() + .record(C, AssertionOutcome.SKIP) + .record(B, AssertionOutcome.FAIL) + .record(A, AssertionOutcome.PASS) + .build(); + assertEquals(Arrays.asList(A, B, C), new ArrayList(run.keys())); + assertEquals(A, run.assertions().get(0).key()); + } + + @Test + void flattensMultiLineDetailSoItIsAlwaysTsvSafe() { + ObservedAssertion observed = + ObservedAssertion.of(A, AssertionOutcome.FAIL, "expected 1 2\n\tgot 3 4 (deviation 12.4 m)"); + assertEquals("expected 1 2 got 3 4 (deviation 12.4 m)", observed.detail()); + assertEquals("", ObservedAssertion.of(A, AssertionOutcome.PASS, null).detail()); + } + + @Test + void rejectsNullKeyOrOutcome() { + assertThrows(IllegalArgumentException.class, () -> ObservedAssertion.of(null, AssertionOutcome.PASS)); + assertThrows(IllegalArgumentException.class, () -> ObservedAssertion.of(A, null)); + } + + @Test + void outcomeNamesParseStrictly() { + assertEquals(AssertionOutcome.PASS, AssertionOutcome.parse("PASS")); + assertEquals(AssertionOutcome.FAIL, AssertionOutcome.parse("FAIL")); + assertEquals(AssertionOutcome.SKIP, AssertionOutcome.parse("SKIP")); + assertEquals( + AssertionOutcome.VACUOUS_EXPECTED_FAILURE, + AssertionOutcome.parse("VACUOUS_EXPECTED_FAILURE")); + assertThrows(IllegalArgumentException.class, () -> AssertionOutcome.parse("pass")); + assertThrows(IllegalArgumentException.class, () -> AssertionOutcome.parse("IGNORED")); + assertThrows(IllegalArgumentException.class, () -> AssertionOutcome.parse("VACUOUS")); + assertThrows(IllegalArgumentException.class, () -> AssertionOutcome.parse(null)); + } + + @Test + void aVacuousExpectedFailureIsNeitherAPassNorAMeasurement() { + AssertionOutcome vacuous = AssertionOutcome.VACUOUS_EXPECTED_FAILURE; + assertFalse(vacuous.isPass(), "gie would score this a pass; we do not"); + assertTrue(vacuous.isNotPass()); + assertFalse(vacuous.isMeasured(), "the whole point: no judgement was made"); + assertTrue(vacuous.isVacuous()); + + // Nothing else is vacuous, and the two measured outcomes are exactly PASS and FAIL. + assertFalse(AssertionOutcome.SKIP.isVacuous(), "a skip and a vacuity are different problems"); + assertFalse(AssertionOutcome.SKIP.isMeasured()); + assertTrue(AssertionOutcome.PASS.isMeasured()); + assertTrue(AssertionOutcome.FAIL.isMeasured()); + } + + @Test + void aVacuousExpectedFailureIsTalliedInItsOwnBucket() { + ObservedRun run = ObservedRun.builder() + .record(A, AssertionOutcome.PASS) + .record(B, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "VACUOUS: adams_hemi not implemented") + .record(C, AssertionOutcome.VACUOUS_EXPECTED_FAILURE) + .build(); + + assertEquals(1, run.count(AssertionOutcome.PASS)); + assertEquals(0, run.count(AssertionOutcome.FAIL)); + assertEquals(0, run.count(AssertionOutcome.SKIP)); + assertEquals(2, run.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + assertEquals(3, run.total()); + } + + @Test + void aVacuousExpectedFailureIsRecordedInTheManifestUnderItsOwnName() { + // Requirement: distinct from PASS, so that implementing the missing operator reads as progress + // rather than as several hundred regressions. Also has to survive a round trip through the TSV. + ManifestEntry entry = + ManifestEntry.of(B, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "adams_hemi is absent"); + assertEquals(B + "\tVACUOUS_EXPECTED_FAILURE\tadams_hemi is absent", entry.toTsvLine()); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, entry.expectedOutcome()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/SeedManifestFixtureTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/SeedManifestFixtureTest.java new file mode 100644 index 0000000..2e125b4 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/manifest/SeedManifestFixtureTest.java @@ -0,0 +1,215 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.manifest; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; +import org.junit.jupiter.api.Test; + +/** + * Exercises the checked-in fixtures under {@code manifest-fixtures/}. These are illustrative files + * with fabricated content hashes — the real manifest is generated — but they pin the format and prove + * the parser accepts what the README documents and rejects what it forbids. + */ +class SeedManifestFixtureTest { + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final String SEED = "/manifest-fixtures/expected-failures.seed.tsv"; + private static final String INDEX = "/manifest-fixtures/corpus-index.seed.tsv"; + + private static Reader open(String resource) { + InputStream in = SeedManifestFixtureTest.class.getResourceAsStream(resource); + assertNotNull(in, "missing test resource " + resource); + return new InputStreamReader(in, UTF_8); + } + + private static ExpectedOutcomeManifest loadSeed() throws IOException { + Reader reader = open(SEED); + try { + return ExpectedOutcomeManifest.load(reader, SEED); + } finally { + reader.close(); + } + } + + @Test + void theSeedManifestParses() throws IOException { + ExpectedOutcomeManifest seed = loadSeed(); + assertEquals(28, seed.size()); + } + + @Test + void theSeedCoversAllTenQuarantinedGigsFiles() throws IOException { + SortedSet failingFiles = new TreeSet(); + for (ManifestEntry entry : loadSeed().entries()) { + if (entry.key().filePath().endsWith(".gie.failing")) { + failingFiles.add(entry.key().filePath()); + } + } + assertEquals( + new TreeSet(java.util.Arrays.asList( + "gigs/5101.4-jhs.gie.failing", + "gigs/5105.1.gie.failing", + "gigs/5110.gie.failing", + "gigs/5111.2.gie.failing", + "gigs/5203.1.gie.failing", + "gigs/5204.1.gie.failing", + "gigs/5205.1.gie.failing", + "gigs/5206.gie.failing", + "gigs/5207.1.gie.failing", + "gigs/5207.2.gie.failing")), + failingFiles); + } + + @Test + void everySeedEntryCarriesAReason() throws IOException { + for (ManifestEntry entry : loadSeed().entries()) { + assertFalse(entry.reason().isEmpty(), "no reason recorded for " + entry.key()); + assertTrue(entry.reason().length() > 20, "reason too thin for " + entry.key() + ": " + entry.reason()); + } + } + + @Test + void theNineSyntaxArtefactFilesSayTheyAreNotMathsFailures() throws IOException { + SortedSet syntaxFiles = new TreeSet(); + for (ManifestEntry entry : loadSeed().entries()) { + if (entry.reason().contains("syntax artefact")) { + syntaxFiles.add(entry.key().filePath()); + } + } + assertEquals(9, syntaxFiles.size(), "nine of the ten fail for the missing-continuation reason: " + syntaxFiles); + assertFalse(syntaxFiles.contains("gigs/5110.gie.failing"), "5110 is the genuine one, not a syntax artefact"); + } + + @Test + void the5110EntriesNameTheRealRootCause() throws IOException { + List entries = new ArrayList(); + for (ManifestEntry entry : loadSeed().entries()) { + if (entry.key().filePath().equals("gigs/5110.gie.failing")) { + entries.add(entry); + } + } + assertEquals(3, entries.size()); + StringBuilder reasons = new StringBuilder(); + for (ManifestEntry entry : entries) { + reasons.append(entry.reason()).append('\n'); + } + String text = reasons.toString(); + assertTrue(text.contains("laea"), text); + assertTrue(text.contains("roundtrip 1000"), text); + assertTrue(text.contains("0.006"), text); + assertTrue(text.contains("83c91dd2"), "cite the upstream commit that records the numbers"); + } + + @Test + void theSeedUsesSkipOnlyForRequireGrid() throws IOException { + for (ManifestEntry entry : loadSeed().entries()) { + if (entry.expectedOutcome() == AssertionOutcome.SKIP) { + assertTrue(entry.reason().contains("require_grid"), entry.toTsvLine()); + } + } + } + + @Test + void theSeedIsAlreadyInCanonicalOrderSoRegenerationWouldNotReshuffleIt() throws IOException { + List asWritten = new ArrayList(); + BufferedReader reader = new BufferedReader(open(SEED)); + try { + String line; + while ((line = reader.readLine()) != null) { + if (line.isEmpty() || line.startsWith("#") || line.equals(ExpectedOutcomeManifest.HEADER)) { + continue; + } + asWritten.add(AssertionKey.parse(line.split("\t", -1)[0])); + } + } finally { + reader.close(); + } + List sorted = new ArrayList(asWritten); + Collections.sort(sorted); + assertEquals(sorted, asWritten); + } + + @Test + void theSeedIndexIsASupersetOfTheSeedManifest() throws IOException { + ExpectedOutcomeManifest seed = loadSeed(); + Reader reader = open(INDEX); + CorpusIndex index; + try { + index = CorpusIndex.load(reader, INDEX); + } finally { + reader.close(); + } + for (AssertionKey key : seed.keys()) { + assertTrue(index.contains(key), "index is missing " + key); + } + assertEquals(seed.size() + 2, index.size(), "the index also holds the two passing example keys"); + } + + @Test + void theSeedManifestAndIndexAgreeSoTheGateIsQuietWhenNothingChanges() throws IOException { + ExpectedOutcomeManifest seed = loadSeed(); + Reader reader = open(INDEX); + CorpusIndex index; + try { + index = CorpusIndex.load(reader, INDEX); + } finally { + reader.close(); + } + ObservedRun.Builder run = ObservedRun.builder(); + for (AssertionKey key : index.keys()) { + run.record(key, seed.expectedOutcome(key)); + } + DiffResult diff = ConformanceDiff.compare(seed, run.build(), index); + assertFalse(diff.shouldFailBuild(), diff.failureSummary()); + assertEquals(2, diff.count(DiffClassification.UNCHANGED)); + assertEquals(28, diff.count(DiffClassification.STILL_FAILING)); + } + + @Test + void theMalformedFixturesAreAllRejectedWithTheRightLineNumber() { + assertEquals(4, expectRejection("/manifest-fixtures/malformed-missing-column.tsv")); + assertEquals(4, expectRejection("/manifest-fixtures/malformed-pass-row.tsv")); + assertEquals(4, expectRejection("/manifest-fixtures/malformed-bad-key.tsv")); + } + + private static int expectRejection(final String resource) { + ManifestFormatException e = assertThrows(ManifestFormatException.class, () -> { + Reader reader = open(resource); + try { + ExpectedOutcomeManifest.load(reader, resource); + } finally { + reader.close(); + } + }); + return e.lineNumber(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCommand.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCommand.java new file mode 100644 index 0000000..f59a6f5 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCommand.java @@ -0,0 +1,85 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +/** + * One assembled {@code .gie} command: a verb plus its normalised argument + * string. Immutable. + * + *

{@link #line()} is the 1-based number of the line the verb appeared on, + * not the last line of a continuation. It is what a failure report + * should quote, and it is the stable identity of an assertion across corpus + * re-syncs. (Note that gie's own {@code F->lineno} ends up holding the + * last line of a strict-mode continuation; {@link #lastLine()} + * carries that value for diagnostic parity.) + */ +public final class GieCommand { + + private final GieVerb verb; + private final String args; + private final int line; + private final int lastLine; + private final String raw; + + public GieCommand(GieVerb verb, String args, int line, int lastLine, String raw) { + if (verb == null) { + throw new IllegalArgumentException("verb"); + } + this.verb = verb; + this.args = args == null ? "" : args; + this.line = line; + this.lastLine = lastLine; + this.raw = raw == null ? "" : raw; + } + + /** The verb this line resolved to under prefix matching. */ + public GieVerb verb() { + return verb; + } + + /** + * The assembled argument string after {@code pj_chomp} + {@code pj_shrink}: + * continuation lines joined, comments gone, whitespace collapsed, + * {@code '+'} and {@code ';'} removed, {@code ','} and {@code '='} greedy. + * Never {@code null}; empty when the verb takes no arguments. + */ + public String args() { + return args; + } + + /** 1-based source line of the verb's first line. */ + public int line() { + return line; + } + + /** 1-based source line of the command's last physical line. */ + public int lastLine() { + return lastLine; + } + + /** + * The raw, unassembled source text of every physical line that contributed + * to this command, joined with {@code '\n'}. For diagnostics only. + */ + public String raw() { + return raw; + } + + @Override + public String toString() { + return line + ": " + verb.token() + (args.isEmpty() ? "" : " " + args); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoord.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoord.java new file mode 100644 index 0000000..8e67b20 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoord.java @@ -0,0 +1,123 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import java.util.Arrays; + +/** + * A coordinate as written on an {@code accept} or {@code expect} line: up to + * four ordinates plus the count actually present in the text. Immutable. + * + *

{@link #dimensionsGiven()} is not cosmetic — the comparator uses it to + * decide how many ordinates to compare, so a 2D {@code expect} against a 4D + * result must not be judged on z or t. + * + *

An {@link #isError() error} coordinate is what {@code proj_coord_error()} + * returns: all four ordinates {@code HUGE_VAL}. It means "this line did not + * contain two parseable numbers", and it must never be confused with a + * successfully parsed coordinate. + */ +public final class GieCoord { + + /** C {@code HUGE_VAL}. */ + public static final double HUGE_VAL = Double.POSITIVE_INFINITY; + + private final double[] v; + private final int dimensionsGiven; + private final boolean error; + + GieCoord(double[] v, int dimensionsGiven, boolean error) { + this.v = new double[] {v[0], v[1], v[2], v[3]}; + this.dimensionsGiven = dimensionsGiven; + this.error = error; + } + + /** {@code proj_coord_error()}: all four ordinates {@code HUGE_VAL}. */ + static GieCoord error(int dimensionsGiven) { + return new GieCoord(new double[] {HUGE_VAL, HUGE_VAL, HUGE_VAL, HUGE_VAL}, + dimensionsGiven, true); + } + + /** Ordinate {@code i}, {@code 0 <= i < 4}. */ + public double v(int i) { + return v[i]; + } + + public double x() { + return v[0]; + } + + public double y() { + return v[1]; + } + + public double z() { + return v[2]; + } + + public double t() { + return v[3]; + } + + /** A defensive copy of all four ordinates. */ + public double[] toArray() { + return new double[] {v[0], v[1], v[2], v[3]}; + } + + /** How many numbers the source line actually carried, 0 to 4. */ + public int dimensionsGiven() { + return dimensionsGiven; + } + + /** True when fewer than two numbers parsed. */ + public boolean isError() { + return error; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof GieCoord)) { + return false; + } + GieCoord other = (GieCoord) o; + return dimensionsGiven == other.dimensionsGiven + && error == other.error + && Arrays.equals(v, other.v); + } + + @Override + public int hashCode() { + return Arrays.hashCode(v) * 31 + dimensionsGiven + (error ? 1 : 0); + } + + @Override + public String toString() { + if (error) { + return "GieCoord[error]"; + } + StringBuilder sb = new StringBuilder("GieCoord["); + for (int i = 0; i < dimensionsGiven; i++) { + if (i > 0) { + sb.append(", "); + } + sb.append(v[i]); + } + return sb.append(']').toString(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoordParser.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoordParser.java new file mode 100644 index 0000000..40e0c3a --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoordParser.java @@ -0,0 +1,108 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.locationtech.proj4j.conformance.parse.PjText.charAt; +import static org.locationtech.proj4j.conformance.parse.PjText.isSpace; + +/** + * Port of {@code parse_coord} ({@code 9.8.1:src/apps/gie.cpp:811-870}): read up + * to four doubles from an {@code accept}/{@code expect} argument string. + * + *

Three behaviours here are easy to miss and each one silently changes + * results if dropped: + * + *

    + *
  1. The literal token {@code HUGE_VAL} is a valid component, used by + * {@code deformation.gie} and {@code defmodel.gie} to mean "no time + * given".
  2. + *
  3. The DMS fallback. {@link ProjStrtod} reads + * {@code 83d10'W} as plain {@code 83} and stops on the {@code d}. When + * the plain parse halts on a non-space character, gie re-parses with + * {@code proj_dmstor} and prefers the DMS reading only when + * {@code d != dms && |d| < |dms| < |d| + 1} — i.e. when the extra + * minutes and seconds add up to less than a whole degree, which is + * exactly the signature of a DMS literal. The separate + * {@code d == dms && endp != dmsendp} clause exists because + * {@code -81d00'00.000} parses to the same number under both but only + * {@code proj_dmstor} reports the right end position.
  4. + *
  5. Fewer than two numbers is an error coordinate, not a partial + * one. Two or three is fine and {@code dimensionsGiven} records it.
  6. + *
+ */ +public final class GieCoordParser { + + private static final String HUGE_VAL_TOKEN = "HUGE_VAL"; + + private GieCoordParser() { + } + + /** Parse the argument text of an {@code accept} or {@code expect} command. */ + public static GieCoord parseCoord(String args) { + if (args == null) { + return GieCoord.error(0); + } + double[] v = new double[] {0, 0, 0, 0}; + int dimensionsGiven = 0; + int prev = 0; + + for (int i = 0; i < 4; i++) { + double d; + int endp; + + while (charAt(args, prev) != '\0' && isSpace(charAt(args, prev))) { + ++prev; + } + + if (args.startsWith(HUGE_VAL_TOKEN, prev)) { + d = GieCoord.HUGE_VAL; + endp = prev + HUGE_VAL_TOKEN.length(); + } else { + ProjStrtod.Result r = ProjStrtod.strtod(args, prev); + d = r.value; + endp = r.end; + } + + if (!Double.isNaN(d) && charAt(args, endp) != '\0' && !isSpace(charAt(args, endp))) { + ProjDmsToR.Result dr = ProjDmsToR.dmstor(args, prev); + double dms = Math.toDegrees(dr.radians); + int dmsendp = dr.end; + if (d != dms && Math.abs(d) < Math.abs(dms) && Math.abs(dms) < Math.abs(d) + 1) { + d = dms; + endp = dmsendp; + } + /* A number like -81d00'00.000 will be parsed correctly by both + * proj_strtod and proj_dmstor but only the latter will return + * the correct end-pointer. */ + if (d == dms && endp != dmsendp) { + endp = dmsendp; + } + } + + /* Break out if there were no more numerals */ + if (prev == endp) { + return i > 1 ? new GieCoord(v, dimensionsGiven, false) + : GieCoord.error(dimensionsGiven); + } + + v[i] = d; + prev = endp; + dimensionsGiven++; + } + + return new GieCoord(v, dimensionsGiven, false); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoordParserTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoordParserTest.java new file mode 100644 index 0000000..942176f --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCoordParserTest.java @@ -0,0 +1,151 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GieCoordParserTest { + + private static final double EPS = 1e-12; + + @Test + @DisplayName("dimensionsGiven is 2, 3 or 4 as the line dictates") + void dimensionsGiven() { + assertEquals(2, GieCoordParser.parseCoord("1 2").dimensionsGiven()); + assertEquals(3, GieCoordParser.parseCoord("1 2 3").dimensionsGiven()); + assertEquals(4, GieCoordParser.parseCoord("1 2 3 4").dimensionsGiven()); + // Whitespace has already been collapsed by pj_shrink, but be robust. + assertEquals(3, GieCoordParser.parseCoord(" 1 2 3 ").dimensionsGiven()); + } + + @Test + @DisplayName("a fifth number is ignored: at most four are read") + void atMostFour() { + GieCoord c = GieCoordParser.parseCoord("1 2 3 4 5"); + assertEquals(4, c.dimensionsGiven()); + assertEquals(4.0, c.t()); + } + + @Test + @DisplayName("unparsed ordinates are zero, not garbage") + void unparsedOrdinatesAreZero() { + GieCoord c = GieCoordParser.parseCoord("12 55"); + assertEquals(12.0, c.x()); + assertEquals(55.0, c.y()); + assertEquals(0.0, c.z()); + assertEquals(0.0, c.t()); + } + + @Test + @DisplayName("fewer than two numbers is an error coordinate, all HUGE_VAL") + void fewerThanTwoIsAnError() { + for (String s : new String[] {"", "1", " ", "abc", "1 abc"}) { + GieCoord c = GieCoordParser.parseCoord(s); + assertTrue(c.isError(), "expected an error coordinate for [" + s + "]"); + assertEquals(GieCoord.HUGE_VAL, c.x()); + assertEquals(GieCoord.HUGE_VAL, c.y()); + assertEquals(GieCoord.HUGE_VAL, c.z()); + assertEquals(GieCoord.HUGE_VAL, c.t()); + } + } + + @Test + @DisplayName("trailing junk after two good numbers is not an error") + void trailingJunkIsTolerated() { + // The real case: builtins.gie's non-strict block leaves the word + // `unknown_keyword` appended to an expect line. + GieCoord c = GieCoordParser.parseCoord( + "222571.608757106 110653.326743030 unknown_keyword"); + assertFalse(c.isError()); + assertEquals(2, c.dimensionsGiven()); + assertEquals(222571.608757106, c.x()); + assertEquals(110653.326743030, c.y()); + } + + @Test + @DisplayName("the literal token HUGE_VAL is a valid component") + void hugeValToken() { + GieCoord c = GieCoordParser.parseCoord("HUGE_VAL 1 2 HUGE_VAL"); + assertFalse(c.isError()); + assertEquals(4, c.dimensionsGiven()); + assertEquals(GieCoord.HUGE_VAL, c.x()); + assertEquals(1.0, c.y()); + assertEquals(2.0, c.z()); + assertEquals(GieCoord.HUGE_VAL, c.t()); + + // deformation.gie / defmodel.gie use it in the time slot. + GieCoord t = GieCoordParser.parseCoord("2 49 0 HUGE_VAL"); + assertEquals(4, t.dimensionsGiven()); + assertEquals(GieCoord.HUGE_VAL, t.t()); + } + + @Test + @DisplayName("underscore-separated digits parse as one number") + void underscoreDigits() { + GieCoord c = GieCoordParser.parseCoord("6_098_907.825_05 1_000"); + assertEquals(2, c.dimensionsGiven()); + assertEquals(6098907.82505, c.x()); + assertEquals(1000.0, c.y()); + } + + @Test + @DisplayName("DMS components fall back to proj_dmstor") + void dmsFallback() { + GieCoord a = GieCoordParser.parseCoord("83d10'W 43d45'N"); + assertEquals(2, a.dimensionsGiven()); + assertEquals(-(83 + 10 / 60.0), a.x(), EPS); + assertEquals(43 + 45 / 60.0, a.y(), EPS); + + GieCoord b = GieCoordParser.parseCoord("-64d43'75.34 79d58'00.000\"W"); + assertEquals(2, b.dimensionsGiven()); + assertEquals(-(64 + 43 / 60.0 + 75.34 / 3600.0), b.x(), EPS); + assertEquals(-(79 + 58 / 60.0), b.y(), EPS); + } + + @Test + @DisplayName("the DMS reading is only preferred when |d| < |dms| < |d| + 1") + void dmsFallbackIsGuarded() { + // -81d00'00.000: both parsers agree on -81, so the plain value stands, + // but the end pointer must come from proj_dmstor or the next component + // would start mid-token. + GieCoord c = GieCoordParser.parseCoord("-81d00'00.000 42"); + assertFalse(c.isError()); + assertEquals(2, c.dimensionsGiven()); + assertEquals(-81.0, c.x(), EPS); + assertEquals(42.0, c.y()); + } + + @Test + @DisplayName("large projected coordinates are not mangled by the DMS retry") + void projectedCoordinatesSurvive() { + // 1501000.0 must stay 1501000.0; a blanket radians round-trip would + // give 1501000.000000000233. + GieCoord c = GieCoordParser.parseCoord("1501000.0 6098907.825"); + assertEquals(1501000.0, c.x()); + assertEquals(6098907.825, c.y()); + } + + @Test + @DisplayName("a null argument string yields an error coordinate, not an exception") + void nullIsAnError() { + assertTrue(GieCoordParser.parseCoord(null).isError()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCorpusLexTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCorpusLexTest.java new file mode 100644 index 0000000..5701b19 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieCorpusLexTest.java @@ -0,0 +1,333 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import java.io.IOException; +import java.net.URL; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** + * The real self-check: lex all 42 active corpus files and account for every + * command. A lexer that passes hand-written fixtures but drops a hundred + * assertions on {@code builtins.gie} is no use, so the counts below are pinned + * as a regression fence. + * + *

These numbers correct the skill's corpus table. Measured + * against {@code 9.8.1} they are: + * + *

+ *   operation             780   (skill said 775; a column-0-only grep gives 774)
+ *   crs_src / crs_dst     8 / 8 (8 pairs)
+ *   use_proj4_init_rules   23   (skill said 24, "all in test/gigs" - 3 are in test/gie)
+ *   accept               7288
+ *   expect               6962   (skill said 7056)
+ *   of which failure     1187   (skill's headline said 811; its own column sums to 1187)
+ *   roundtrip             961   (agrees)
+ *   direction             283   (skill said 284)
+ *   tolerance            1634
+ *   require_grid            3   (skill said 5)
+ *   banner verbose ignore echo skip   0 each (agrees)
+ * 
+ * + *

The {@code expect} gap is entirely {@code DHDN_ETRS89.gie}: 94 of its 158 + * {@code accept}/{@code expect} pairs sit after {@code } + * (source lines 162-375), under a heading that says "Tests for GK system zones + * to UTM32/33 not implemented yet". gie never reads them. The {@code operation} + * gap is {@code peirce_q.gie}, which indents 6 of its 10 {@code operation} + * lines by one space; {@code pj_chomp} left-trims before the verb test, so they + * are commands. + * + *

So the headline metric is 6,962 + 961 = 7,923 assertions, + * not 8,017. + * + *

Deliberately not gated behind the module's {@code gie.corpus.skip} + * property. That flag exists to keep the expensive part out of a plain build — + * the part that creates operations and transforms coordinates. This test only + * splits strings, so it costs milliseconds and should always run. + */ +class GieCorpusLexTest { + + /** Expected command counts over the 42 active files, at PROJ 9.8.1. */ + private static final Map EXPECTED = new EnumMap(GieVerb.class); + + static { + EXPECTED.put(GieVerb.OPEN_GIE, 0); + EXPECTED.put(GieVerb.OPERATION, 780); + EXPECTED.put(GieVerb.CRS_SRC, 8); + EXPECTED.put(GieVerb.CRS_DST, 8); + EXPECTED.put(GieVerb.USE_PROJ4_INIT_RULES, 23); + EXPECTED.put(GieVerb.ACCEPT, 7288); + EXPECTED.put(GieVerb.EXPECT, 6962); + EXPECTED.put(GieVerb.ROUNDTRIP, 961); + EXPECTED.put(GieVerb.BANNER, 0); + EXPECTED.put(GieVerb.VERBOSE, 0); + EXPECTED.put(GieVerb.DIRECTION, 283); + EXPECTED.put(GieVerb.TOLERANCE, 1634); + EXPECTED.put(GieVerb.IGNORE, 0); + EXPECTED.put(GieVerb.REQUIRE_GRID, 3); + EXPECTED.put(GieVerb.ECHO, 0); + EXPECTED.put(GieVerb.SKIP, 0); + EXPECTED.put(GieVerb.CLOSE_GIE, 0); + EXPECTED.put(GieVerb.OPEN_GIE_STRICT, 0); + EXPECTED.put(GieVerb.CLOSE_GIE_STRICT, 42); + } + + private static final int EXPECTED_FILES = 42; + private static final int EXPECTED_EXPECT_FAILURE = 1187; + + // ------------------------------------------------------------ resolution + + /** + * Locate a vendored corpus directory, preferring the test classpath and + * falling back to the source tree so this works whether or not the + * resources have been copied yet. + */ + private static Path corpusDir(String name) { + try { + URL u = GieCorpusLexTest.class.getResource("/" + name); + if (u != null && "file".equals(u.getProtocol())) { + Path p = Paths.get(u.toURI()); + if (Files.isDirectory(p)) { + return p; + } + } + } catch (Exception ignored) { + // fall through to the source tree + } + for (String prefix : new String[] {"src/test/resources", "conformance/src/test/resources"}) { + Path p = Paths.get(prefix).resolve(name); + if (Files.isDirectory(p)) { + return p; + } + } + return null; + } + + private static List activeGieFiles() throws IOException { + List out = new ArrayList(); + for (String dir : new String[] {"gie", "gigs"}) { + Path d = corpusDir(dir); + if (d == null) { + continue; + } + DirectoryStream s = Files.newDirectoryStream(d, "*.gie"); + try { + for (Path p : s) { + // "*.gie" already excludes the quarantined "*.gie.failing". + out.add(p); + } + } finally { + s.close(); + } + } + Collections.sort(out); + return out; + } + + // ----------------------------------------------------------------- tests + + @Test + @DisplayName("every one of the 42 active corpus files lexes with zero fatal errors") + void wholeCorpusLexesCleanly() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), + "corpus not vendored under src/test/resources/{gie,gigs} yet"); + assertEquals(EXPECTED_FILES, files.size(), + "wrong number of active .gie files: " + files); + + Map total = new EnumMap(GieVerb.class); + for (GieVerb v : GieVerb.values()) { + total.put(v, 0); + } + int expectFailure = 0; + List failures = new ArrayList(); + + for (Path f : files) { + GieFile parsed; + try { + parsed = GieLexer.lex(f); + } catch (GieSyntaxException e) { + failures.add(e.getMessage()); + continue; + } + assertTrue(parsed.size() > 0, f + " lexed to nothing"); + for (Map.Entry e : parsed.verbCounts().entrySet()) { + total.put(e.getKey(), total.get(e.getKey()) + e.getValue()); + } + for (GieCommand c : parsed.commands(GieVerb.EXPECT)) { + if (c.args().startsWith("failure")) { + expectFailure++; + } + } + } + + assertEquals(Collections.emptyList(), failures, + "fatal lexing errors in the active corpus"); + + StringBuilder report = new StringBuilder("per-verb command counts over " + + files.size() + " active .gie files:\n"); + for (GieVerb v : GieVerb.values()) { + report.append(String.format(" %-22s %6d%n", v.token(), total.get(v))); + } + report.append(String.format(" %-22s %6d%n", "(expect failure)", expectFailure)); + report.append(String.format(" %-22s %6d%n", "(assertions)", + total.get(GieVerb.EXPECT) + total.get(GieVerb.ROUNDTRIP))); + System.out.print(report); + + for (GieVerb v : GieVerb.values()) { + assertEquals(EXPECTED.get(v).intValue(), total.get(v).intValue(), + "command count for '" + v.token() + "'\n" + report); + } + assertEquals(EXPECTED_EXPECT_FAILURE, expectFailure, "expect failure count\n" + report); + } + + @Test + @DisplayName("the headline assertion count is expect + roundtrip = 7,923") + void headlineAssertionCount() { + assertEquals(7923, + EXPECTED.get(GieVerb.EXPECT) + EXPECTED.get(GieVerb.ROUNDTRIP)); + } + + @Test + @DisplayName("every command carries a plausible 1-based line number") + void lineNumbersAreSane() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), "corpus not vendored yet"); + for (Path f : files) { + int lineCount = Files.readAllLines(f, GieLexer.GIE_CHARSET).size(); + GieFile parsed = GieLexer.lex(f); + int previous = 0; + for (GieCommand c : parsed.commands()) { + assertTrue(c.line() >= 1, f + ": non-positive line " + c); + assertTrue(c.line() <= lineCount, f + ": line past EOF " + c); + assertTrue(c.lastLine() >= c.line(), f + ": lastLine before line " + c); + assertTrue(c.line() > previous, + f + ": line numbers not strictly increasing at " + c); + previous = c.line(); + } + } + } + + @Test + @DisplayName("DHDN_ETRS89 has 64 assertions in its block, not the 158 lines in the file") + void dhdnOutOfBlockLinesAreNotAssertions() throws IOException { + Path d = corpusDir("gie"); + assumeTrue(d != null, "corpus not vendored yet"); + Path f = d.resolve("DHDN_ETRS89.gie"); + assumeTrue(Files.isRegularFile(f), "DHDN_ETRS89.gie not vendored"); + + GieFile parsed = GieLexer.lex(f); + assertEquals(64, parsed.commands(GieVerb.ACCEPT).size()); + assertEquals(64, parsed.commands(GieVerb.EXPECT).size()); + // Everything it lexed is inside the block, which ends at 161. + for (GieCommand c : parsed.commands()) { + assertTrue(c.line() <= 161, + "command outside the gie block was lexed: " + c); + } + } + + @Test + @DisplayName("peirce_q has 10 operations, six of them indented") + void peirceQIndentedOperations() throws IOException { + Path d = corpusDir("gie"); + assumeTrue(d != null, "corpus not vendored yet"); + Path f = d.resolve("peirce_q.gie"); + assumeTrue(Files.isRegularFile(f), "peirce_q.gie not vendored"); + + GieFile parsed = GieLexer.lex(f); + List ops = parsed.commands(GieVerb.OPERATION); + assertEquals(10, ops.size()); + int indented = 0; + for (GieCommand c : ops) { + if (c.raw().startsWith(" ")) { + indented++; + } + } + assertEquals(6, indented, "six of the ten operation lines are indented"); + } + + @Test + @DisplayName("builtins.gie has both a non-strict and a strict block") + void builtinsHasBothModes() throws IOException { + Path d = corpusDir("gie"); + assumeTrue(d != null, "corpus not vendored yet"); + Path f = d.resolve("builtins.gie"); + assumeTrue(Files.isRegularFile(f), "builtins.gie not vendored"); + + GieFile parsed = GieLexer.lex(f); + assertEquals(369, parsed.commands(GieVerb.OPERATION).size()); + assertEquals(2185, parsed.commands(GieVerb.EXPECT).size()); + assertEquals(2147, parsed.commands(GieVerb.ACCEPT).size()); + assertEquals(359, parsed.commands(GieVerb.ROUNDTRIP).size()); + // Exactly one ; the non-strict block's is consumed + // by the lexer and never surfaces as a command. + assertEquals(1, parsed.commands(GieVerb.CLOSE_GIE_STRICT).size()); + assertEquals(0, parsed.commands(GieVerb.CLOSE_GIE).size()); + + // The first command comes from the non-strict block and is assembled + // from two physical lines without any ' \' continuation marker. + GieCommand first = parsed.commands().get(0); + assertEquals(GieVerb.OPERATION, first.verb()); + assertEquals("proj=aea ellps=GRS80 lat_1=0 lat_2=2", first.args()); + assertEquals(17, first.line()); + assertEquals(18, first.lastLine()); + } + + @Test + @DisplayName("every accept and expect line parses to a usable coordinate") + void everyCoordinateParses() throws IOException { + List files = activeGieFiles(); + assumeTrue(!files.isEmpty(), "corpus not vendored yet"); + int coords = 0; + List bad = new ArrayList(); + for (Path f : files) { + GieFile parsed = GieLexer.lex(f); + for (GieCommand c : parsed.commands()) { + if (c.verb() != GieVerb.ACCEPT && c.verb() != GieVerb.EXPECT) { + continue; + } + if (c.verb() == GieVerb.EXPECT && c.args().startsWith("failure")) { + continue; // not a coordinate at all + } + coords++; + GieCoord coord = GieCoordParser.parseCoord(c.args()); + if (coord.isError() || coord.dimensionsGiven() < 2) { + bad.add(f.getFileName() + ":" + c.line() + " " + c.verb().token() + + " [" + c.args() + "]"); + } + } + } + assertEquals(Collections.emptyList(), bad, + "coordinates that failed to parse"); + // 7288 accept + (6962 - 1187) expect + assertEquals(7288 + 6962 - 1187, coords); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieFile.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieFile.java new file mode 100644 index 0000000..df49e65 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieFile.java @@ -0,0 +1,78 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * A lexed {@code .gie} file: its source path and the ordered commands gie + * would have dispatched. Immutable. + */ +public final class GieFile { + + private final String source; + private final List commands; + + public GieFile(String source, List commands) { + this.source = source; + this.commands = Collections.unmodifiableList( + new ArrayList(commands == null ? Collections.emptyList() : commands)); + } + + /** Where this came from — a file path, or a synthetic name for a string. */ + public String source() { + return source; + } + + /** The commands, in dispatch order. Unmodifiable. */ + public List commands() { + return commands; + } + + public int size() { + return commands.size(); + } + + /** All commands with the given verb, in order. */ + public List commands(GieVerb verb) { + List out = new ArrayList(); + for (GieCommand c : commands) { + if (c.verb() == verb) { + out.add(c); + } + } + return Collections.unmodifiableList(out); + } + + /** Count of commands per verb. Verbs with no occurrences are absent. */ + public Map verbCounts() { + Map counts = new EnumMap(GieVerb.class); + for (GieCommand c : commands) { + Integer n = counts.get(c.verb()); + counts.put(c.verb(), n == null ? 1 : n + 1); + } + return counts; + } + + @Override + public String toString() { + return source + " (" + commands.size() + " commands)"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieLexer.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieLexer.java new file mode 100644 index 0000000..a13e6c2 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieLexer.java @@ -0,0 +1,364 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ByteArrayOutputStream; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +/** + * The {@code .gie} lexer — a transliteration of the {@code ffio} state machine + * in {@code 9.8.1:src/apps/gie.cpp} ({@code get_inp}, {@code skip_to_next_tag}, + * {@code step_into_gie_block}, {@code nextline}, {@code at_tag}, + * {@code at_decorative_element}, {@code append_args}). + * + *

The two modes

+ * + *

Strict ({@code } … {@code }, + * used by 43 of 44 corpus files): every line must be blank, decorative, or + * start with a verb — otherwise the whole file aborts. Comment lines survive + * because {@code pj_chomp} deletes {@code #} to end-of-line before the verb + * test, leaving a blank. Continuation is explicit: a line whose shrunken form + * ends in a backslash pulls in the next line. + * + *

Non-strict ({@code } … {@code }, only + * {@code builtins.gie}): text outside the block is ignored entirely, and a + * verb's arguments run on across lines, joined with a single space, until the + * next verb or a decorative element. An unrecognised bare word inside the + * block is therefore not an error — it is argument text. + * + *

Encoding

+ * + *

Files are decoded as ISO-8859-1, deliberately. The C is byte-oriented, + * and the DMS parser distinguishes the two UTF-8 bytes of U+00B0 from the + * single-byte 0xB0 degree sign. Latin-1 is the decoding that makes one Java + * {@code char} equal one C {@code char}, so behaviour matches byte for byte. + * All {@code .gie} argument text is ASCII; only comments are ever otherwise. + */ +public final class GieLexer { + + /** Byte-transparent decoding; see the class comment. */ + public static final Charset GIE_CHARSET = Charset.forName("ISO-8859-1"); + + // ---------------------------------------------------------------- input + + private final String source; + private final List lines; + /** + * Emulates the C FILE end-of-file indicator. {@code fgets} sets it both + * when it returns NULL and when it consumes a final line that has no + * trailing newline — and in the latter case {@code nextline()} discards + * that line. Reproduced so a file lacking a final newline behaves here + * exactly as it does under gie. + */ + private final boolean endsWithNewline; + + // ------------------------------------------------------------ ffio state + + private String nextArgs = ""; + private String nextRaw = ""; + private String args = ""; + private GieVerb tag; + private int cursor; + private int lineno; + private int nextLineno; + private int level; + private boolean strictMode; + private boolean eof; + private boolean abandoned; + + /** First and last physical line, and raw text, of the command being built. */ + private int commandFirstLine; + private int commandLastLine; + private final List rawParts = new ArrayList(); + + private GieLexer(String source, String content) { + this.source = source; + this.lines = new ArrayList(); + int start = 0; + for (int k = 0; k < content.length(); k++) { + if (content.charAt(k) == '\n') { + lines.add(content.substring(start, k)); + start = k + 1; + } + } + if (start < content.length()) { + lines.add(content.substring(start)); + this.endsWithNewline = false; + } else { + this.endsWithNewline = true; + } + } + + // ------------------------------------------------------------ public API + + /** Lex {@code content} as if it were the file named {@code source}. */ + public static GieFile lex(String source, String content) { + return new GieLexer(source, content).run(); + } + + /** Lex a {@code .gie} file from disk. */ + public static GieFile lex(Path path) throws IOException { + byte[] bytes = Files.readAllBytes(path); + return lex(path.toString(), new String(bytes, GIE_CHARSET)); + } + + /** Lex a {@code .gie} file from a classpath stream. Does not close it. */ + public static GieFile lex(String source, InputStream in) throws IOException { + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + byte[] chunk = new byte[8192]; + int n; + while ((n = in.read(chunk)) > 0) { + buf.write(chunk, 0, n); + } + return lex(source, new String(buf.toByteArray(), GIE_CHARSET)); + } + + // ---------------------------------------------------------------- driver + + private GieFile run() { + List commands = new ArrayList(); + while (getInp()) { + commands.add(new GieCommand(tag, args, commandFirstLine, commandLastLine, joinRaw())); + if (tag == GieVerb.SKIP) { + /* gie.cpp:1223 skip(): sets T.skip, which makes nextline() + * fail forever, and forces level=2 to silence the missing + * '' complaint. dispatch() then returns SKIP and + * process_file() bails out immediately. */ + abandoned = true; + level = 2; + break; + } + } + + /* gie.cpp:466-474, process_file() epilogue. */ + if (level == 0) { + throw new GieSyntaxException(source, 0, "Missing '' cmnd"); + } + if (level % 2 != 0) { + throw new GieSyntaxException(source, 0, + strictMode ? "Missing '' cmnd" : "Missing '' cmnd"); + } + return new GieFile(source, commands); + } + + // ------------------------------------------------------------- ffio port + + /** Port of {@code nextline()}. */ + private boolean nextline() { + nextArgs = ""; + nextRaw = ""; + if (abandoned) { + return false; + } + if (cursor >= lines.size()) { + eof = true; + return false; + } + String raw = lines.get(cursor++); + if (cursor == lines.size() && !endsWithNewline) { + /* fgets consumed the last line and hit EOF in doing so. */ + eof = true; + return false; + } + nextRaw = raw; + nextArgs = PjText.chomp(raw); + nextLineno++; + return true; + } + + /** + * Port of {@code at_decorative_element()}: the first five characters are + * all identical. Not "starts with dashes" — {@code aaaaa} is decorative + * and {@code -=-=-} is not. Shorter lines fail because {@code c[4]} is + * then the NUL terminator. + */ + private boolean atDecorativeElement() { + return isDecorativeElement(nextArgs); + } + + /** Exposed for tests; same rule as {@code at_decorative_element()}. */ + public static boolean isDecorativeElement(String line) { + if (line == null || line.isEmpty()) { + return false; + } + char c0 = line.charAt(0); + for (int i = 1; i < 5; i++) { + if (PjText.charAt(line, i) != c0) { + return false; + } + } + return true; + } + + private GieVerb atTag() { + return GieVerb.matchPrefix(nextArgs); + } + + private boolean atEndDelimiter() { + return atDecorativeElement() || atTag() != null; + } + + /** Port of {@code step_into_gie_block()}. */ + private boolean stepIntoGieBlock() { + if (level % 2 != 0) { + return true; /* already inside */ + } + while (!nextArgs.startsWith(GieVerb.OPEN_GIE.token()) + && !nextArgs.startsWith(GieVerb.OPEN_GIE_STRICT.token())) { + if (!nextline()) { + return false; + } + } + level++; + if (nextArgs.startsWith(GieVerb.OPEN_GIE_STRICT.token())) { + /* Deliberate "failure": the caller unwinds to get_inp(), which + * sees strict_mode and re-enters down the strict path. */ + strictMode = true; + return false; + } + /* We're ready at the start - now step into the block */ + return nextline(); + } + + /** + * Port of {@code skip_to_next_tag()}. The C recurses after each + * {@code }; this is the same walk written as a loop. + */ + private boolean skipToNextTag() { + while (true) { + if (!stepIntoGieBlock()) { + return false; + } + GieVerb c = atTag(); + while (c == null) { + if (!nextline()) { + return false; + } + c = atTag(); + } + if (c == GieVerb.CLOSE_GIE) { + level++; + if (eof) { + return false; + } + args = ""; + continue; /* locate the next block and retry */ + } + lineno = nextLineno; + return true; + } + } + + /** + * Port of {@code append_args()}. Always inserts a separating space, and + * strips a leading verb token if the appended line happens to start with + * one — which for continuation lines is a real (if never-exercised) + * behaviour of the C, not an accident of this port. + */ + private void appendArgs() { + GieVerb lineTag = atTag(); + int skipChars = lineTag == null ? 0 : lineTag.token().length(); + if (rawParts.isEmpty()) { + commandFirstLine = nextLineno; + } + commandLastLine = nextLineno; + rawParts.add(nextRaw); + args = args + " " + nextArgs.substring(skipChars); + nextArgs = ""; + nextRaw = ""; + } + + /** Port of {@code get_inp()}, the primary command reader. */ + private boolean getInp() { + args = ""; + rawParts.clear(); + commandFirstLine = 0; + + // Special parsing in strict_mode: + // - All non-comment/decoration lines must start with a valid tag + // - Commands split on several lines should be terminated with " \" + if (strictMode) { + while (nextline()) { + lineno = nextLineno; + if (nextArgs.isEmpty() || atDecorativeElement()) { + continue; + } + tag = atTag(); + if (tag == null) { + throw new GieSyntaxException(source, lineno, + "unsupported command: " + nextArgs); + } + + appendArgs(); + args = PjText.shrink(args); + while (!args.isEmpty() && args.charAt(args.length() - 1) == '\\') { + args = args.substring(0, args.length() - 1); + if (!nextline()) { + return false; + } + lineno = nextLineno; + appendArgs(); + args = PjText.shrink(args); + } + if (tag == GieVerb.CLOSE_GIE_STRICT) { + level++; + strictMode = false; + } + return true; + } + return false; + } + + if (!skipToNextTag()) { + // If we just entered , re-enter to read the first command + if (strictMode) { + return getInp(); + } + return false; + } + tag = atTag(); + if (tag == null) { + return false; + } + + do { + appendArgs(); + if (!nextline()) { + return false; + } + } while (!atEndDelimiter()); + + args = PjText.shrink(args); + return true; + } + + private String joinRaw() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < rawParts.size(); i++) { + if (i > 0) { + sb.append('\n'); + } + sb.append(rawParts.get(i)); + } + return sb.toString(); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieLexerTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieLexerTest.java new file mode 100644 index 0000000..52c0625 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieLexerTest.java @@ -0,0 +1,236 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GieLexerTest { + + private static GieFile fixture(String name) throws IOException { + InputStream in = GieLexerTest.class.getResourceAsStream("/parse-fixtures/" + name); + assertNotNull(in, "missing fixture /parse-fixtures/" + name); + try { + return GieLexer.lex(name, in); + } finally { + in.close(); + } + } + + // ------------------------------------------------- decorative elements + + @Test + @DisplayName("a decorative element is five IDENTICAL chars, whatever they are") + void decorativeElementIsFiveIdenticalChars() { + assertTrue(GieLexer.isDecorativeElement("-----")); + assertTrue(GieLexer.isDecorativeElement("=====")); + assertTrue(GieLexer.isDecorativeElement("#####")); + assertTrue(GieLexer.isDecorativeElement("*****")); + assertTrue(GieLexer.isDecorativeElement("aaaaa")); + // longer runs are fine; only the first five characters are examined + assertTrue(GieLexer.isDecorativeElement( + "-------------------------------------------------------------")); + assertTrue(GieLexer.isDecorativeElement("====== not a comment")); + } + + @Test + @DisplayName("it is not 'starts with dashes': mixed or short runs are not decorative") + void nonDecorativeElements() { + assertFalse(GieLexer.isDecorativeElement("----x")); + assertFalse(GieLexer.isDecorativeElement("--")); + assertFalse(GieLexer.isDecorativeElement("----")); + assertFalse(GieLexer.isDecorativeElement("-=-=-")); + assertFalse(GieLexer.isDecorativeElement("-")); + assertFalse(GieLexer.isDecorativeElement("")); + assertFalse(GieLexer.isDecorativeElement(null)); + } + + // ------------------------------------------------------------- strict + + @Test + @DisplayName("strict mode: ' \\' assembles a multi-line operation") + void strictContinuationAssembles() throws IOException { + GieFile f = fixture("strict-continuation.gie"); + List ops = f.commands(GieVerb.OPERATION); + assertEquals(1, ops.size()); + GieCommand op = ops.get(0); + assertEquals("proj=pipeline step init=epsg:4313 inv step init=epsg:31370", op.args()); + // Reported line is the verb's FIRST line, even though the command ends on line 9. + assertEquals(7, op.line()); + assertEquals(9, op.lastLine()); + assertEquals(3, op.raw().split("\n").length); + } + + @Test + @DisplayName("strict mode: blanks, comments and decorative elements are skipped") + void strictSkipsNoise() throws IOException { + GieFile f = fixture("strict-continuation.gie"); + assertEquals(7, f.size()); + assertEquals(GieVerb.USE_PROJ4_INIT_RULES, f.commands().get(0).verb()); + assertEquals("true", f.commands().get(0).args()); + assertEquals(GieVerb.CLOSE_GIE_STRICT, f.commands().get(6).verb()); + } + + @Test + @DisplayName("strict mode: an indented verb is still a verb, because chomp left-trims") + void strictAcceptsIndentedVerbs() throws IOException { + GieFile f = fixture("strict-continuation.gie"); + List dir = f.commands(GieVerb.DIRECTION); + assertEquals(1, dir.size()); + assertEquals("inverse", dir.get(0).args()); + assertEquals(13, dir.get(0).line()); + } + + @Test + @DisplayName("strict mode: a non-verb, non-comment, non-decorative line is fatal") + void strictRejectsUnknownLine() { + GieSyntaxException e = assertThrows(GieSyntaxException.class, + () -> fixture("strict-bad-line.gie")); + assertEquals(4, e.line()); + assertTrue(e.getMessage().contains("unsupported command"), e.getMessage()); + assertTrue(e.getMessage().contains("unknown_keyword"), e.getMessage()); + } + + @Test + @DisplayName("strict mode: 'tolerance 0.03 m' keeps both value and unit") + void strictShrinksIrregularWhitespace() throws IOException { + GieFile f = fixture("strict-continuation.gie"); + assertEquals("0.03 m", f.commands(GieVerb.TOLERANCE).get(0).args()); + } + + // --------------------------------------------------------- non-strict + + @Test + @DisplayName("non-strict: text outside the block is ignored entirely") + void nonStrictIgnoresOutsideText() throws IOException { + GieFile f = fixture("nonstrict-terminators.gie"); + // Four commands only; the leading prose (which begins with the word + // "expect") and the trailing prose (which contains "accept 9 9") are + // outside the block and never seen. + assertEquals(4, f.size()); + assertEquals(0, f.commands(GieVerb.CLOSE_GIE).size()); + assertEquals(0, f.commands(GieVerb.OPEN_GIE).size()); + } + + @Test + @DisplayName("non-strict: continuation ends at the next verb") + void nonStrictContinuationEndsAtNextVerb() throws IOException { + GieFile f = fixture("nonstrict-terminators.gie"); + GieCommand op = f.commands(GieVerb.OPERATION).get(0); + // Two physical lines joined with a single space, stopping at `tolerance`. + assertEquals("proj=aea ellps=GRS80 lat_1=0 lat_2=2", op.args()); + assertEquals(6, op.line()); + assertEquals(7, op.lastLine()); + assertEquals("0.1 mm", f.commands(GieVerb.TOLERANCE).get(0).args()); + } + + @Test + @DisplayName("non-strict: continuation ends at a decorative element") + void nonStrictContinuationEndsAtDecorativeElement() throws IOException { + GieFile f = fixture("nonstrict-terminators.gie"); + GieCommand expect = f.commands(GieVerb.EXPECT).get(0); + // The '=====' on the following line terminates it, so none of the prose + // after the decorative element is swallowed. + assertEquals("222571.608757106 110653.326743030", expect.args()); + assertEquals(10, expect.line()); + assertEquals(10, expect.lastLine()); + } + + @Test + @DisplayName("non-strict: a bare unknown keyword is argument text, not an error") + void nonStrictToleratesUnknownKeyword() throws IOException { + // builtins.gie relies on exactly this: its block ends with a bare + // `unknown_keyword` line, which becomes trailing junk on the preceding + // `expect` and is then ignored by parse_coord. + GieFile f = fixture("nonstrict-unknown-keyword.gie"); + assertEquals(3, f.size()); + GieCommand expect = f.commands(GieVerb.EXPECT).get(0); + assertEquals("222571.608757106 110653.326743030 unknown_keyword", expect.args()); + + GieCoord c = GieCoordParser.parseCoord(expect.args()); + assertFalse(c.isError()); + assertEquals(2, c.dimensionsGiven()); + assertEquals(222571.608757106, c.x()); + assertEquals(110653.326743030, c.y()); + } + + // -------------------------------------------------------------- blocks + + @Test + @DisplayName("multiple blocks per file, mixed modes, prose between them") + void multipleBlocks() throws IOException { + GieFile f = fixture("two-blocks.gie"); + assertEquals(7, f.size()); + assertEquals(2, f.commands(GieVerb.OPERATION).size()); + assertEquals("proj=merc", f.commands(GieVerb.OPERATION).get(0).args()); + assertEquals("proj=utm zone=32", f.commands(GieVerb.OPERATION).get(1).args()); + // 'tolerance 1 km' sits between the blocks and must not be picked up. + assertEquals(0, f.commands(GieVerb.TOLERANCE).size()); + assertEquals(1, f.commands(GieVerb.CLOSE_GIE_STRICT).size()); + } + + @Test + @DisplayName("an odd delimiter count at EOF is fatal: Missing ''") + void missingCloseIsFatal() { + GieSyntaxException e = assertThrows(GieSyntaxException.class, + () -> fixture("missing-close.gie")); + assertTrue(e.getMessage().contains("Missing ''"), e.getMessage()); + } + + @Test + @DisplayName("an unterminated strict block names '' instead") + void missingStrictCloseIsFatal() { + GieSyntaxException e = assertThrows(GieSyntaxException.class, + () -> GieLexer.lex("t.gie", "\noperation +proj=merc\n")); + assertTrue(e.getMessage().contains("Missing ''"), e.getMessage()); + } + + @Test + @DisplayName("a file with no block at all is fatal: Missing ''") + void missingOpenIsFatal() { + GieSyntaxException e = assertThrows(GieSyntaxException.class, + () -> GieLexer.lex("t.gie", "operation +proj=merc\naccept 1 2\n")); + assertTrue(e.getMessage().contains("Missing ''"), e.getMessage()); + } + + @Test + @DisplayName("prefix matching means 'operationfoo' lexes as operation with args 'foo'") + void prefixMatchingInTheLexer() { + GieFile f = GieLexer.lex("t.gie", "\noperationfoo bar\n\n"); + assertEquals(2, f.size()); + assertEquals(GieVerb.OPERATION, f.commands().get(0).verb()); + assertEquals("foo bar", f.commands().get(0).args()); + } + + @Test + @DisplayName("the 'skip' verb abandons the rest of the file without a missing-tag error") + void skipAbandonsFile() { + GieFile f = GieLexer.lex("t.gie", + "\noperation +proj=merc\nskip\naccept 1 2\n"); + assertEquals(2, f.size()); + assertEquals(GieVerb.SKIP, f.commands().get(1).verb()); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieSyntaxException.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieSyntaxException.java new file mode 100644 index 0000000..b5aadaf --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieSyntaxException.java @@ -0,0 +1,56 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +/** + * A fatal, file-level {@code .gie} lexing error — the two cases where + * gie abandons the whole file rather than recording an assertion failure: + * + *

    + *
  • strict mode met a line that is not blank, not decorative, not a + * comment, and does not begin with a verb + * ({@code "unsupported command line N"}, {@code gie.cpp:1607});
  • + *
  • the block-delimiter count is odd or zero at EOF + * ({@code "Missing ''"}, {@code gie.cpp:466-474}).
  • + *
+ * + *

Anything a lexer could plausibly "recover" from is not an error + * here: an unknown bare word inside a non-strict {@code } block is + * swallowed as continuation text, which {@code builtins.gie} depends on. + */ +public final class GieSyntaxException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private final String source; + private final int line; + + public GieSyntaxException(String source, int line, String message) { + super(source + (line > 0 ? ":" + line : "") + ": " + message); + this.source = source; + this.line = line; + } + + /** The file the error was found in. */ + public String source() { + return source; + } + + /** 1-based offending line, or 0 when the error is about the file as a whole. */ + public int line() { + return line; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieVerb.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieVerb.java new file mode 100644 index 0000000..dc7468b --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieVerb.java @@ -0,0 +1,90 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +/** + * The 19 {@code .gie} command verbs, in the exact order of the + * {@code gie_tags[]} array at {@code 9.8.1:src/apps/gie.cpp:158-178}. + * + *

Declaration order is load bearing. {@code at_tag()} + * matches with {@code strncmp(line, tag, strlen(tag))} — an unanchored prefix + * test at column 0 — and returns the first array entry that matches. + * So {@code operationfoo} is an {@code operation} command whose arguments are + * {@code foo}, and reordering these constants could change which verb a line + * resolves to. Do not sort them. + */ +public enum GieVerb { + + OPEN_GIE(""), + OPERATION("operation"), + CRS_SRC("crs_src"), + CRS_DST("crs_dst"), + USE_PROJ4_INIT_RULES("use_proj4_init_rules"), + ACCEPT("accept"), + EXPECT("expect"), + ROUNDTRIP("roundtrip"), + BANNER("banner"), + VERBOSE("verbose"), + DIRECTION("direction"), + TOLERANCE("tolerance"), + IGNORE("ignore"), + REQUIRE_GRID("require_grid"), + ECHO("echo"), + SKIP("skip"), + CLOSE_GIE(""), + OPEN_GIE_STRICT(""), + CLOSE_GIE_STRICT(""); + + private static final GieVerb[] IN_TAG_ORDER = values(); + + private final String token; + + GieVerb(String token) { + this.token = token; + } + + /** The literal text matched at column 0, e.g. {@code "require_grid"}. */ + public String token() { + return token; + } + + /** + * Port of {@code at_tag()}: the first verb, in declared order, whose token + * is a prefix of {@code line}, or {@code null} if the line opens no + * command. {@code line} is expected to have already been through + * {@link PjText#chomp}, as {@code nextline()} does in the C. + */ + public static GieVerb matchPrefix(String line) { + if (line == null) { + return null; + } + for (GieVerb v : IN_TAG_ORDER) { + if (line.startsWith(v.token)) { + return v; + } + } + return null; + } + + /** + * True for the four block-delimiter pseudo-verbs, which structure the file + * rather than assert anything. + */ + public boolean isBlockDelimiter() { + return this == OPEN_GIE || this == CLOSE_GIE + || this == OPEN_GIE_STRICT || this == CLOSE_GIE_STRICT; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieVerbTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieVerbTest.java new file mode 100644 index 0000000..5979545 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/GieVerbTest.java @@ -0,0 +1,75 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GieVerbTest { + + @Test + @DisplayName("there are exactly 19 verbs, in gie.cpp:158-178 array order") + void nineteenVerbsInTagOrder() { + assertEquals(19, GieVerb.values().length); + + List tokens = new ArrayList(); + for (GieVerb v : GieVerb.values()) { + tokens.add(v.token()); + } + assertEquals(Arrays.asList( + "", "operation", "crs_src", "crs_dst", "use_proj4_init_rules", + "accept", "expect", "roundtrip", "banner", "verbose", "direction", + "tolerance", "ignore", "require_grid", "echo", "skip", "", + "", ""), tokens); + } + + @Test + @DisplayName("matching is strncmp prefix matching, so 'operationfoo' is an operation") + void prefixMatching() { + assertEquals(GieVerb.OPERATION, GieVerb.matchPrefix("operationfoo")); + assertEquals(GieVerb.OPERATION, GieVerb.matchPrefix("operation +proj=merc")); + assertEquals(GieVerb.EXPECT, GieVerb.matchPrefix("expectfailure")); + assertEquals(GieVerb.REQUIRE_GRID, GieVerb.matchPrefix("require_grid BETA2007.gsb")); + } + + @Test + @DisplayName("a non-verb line matches nothing") + void nonVerbsDoNotMatch() { + assertNull(GieVerb.matchPrefix("unknown_keyword")); + assertNull(GieVerb.matchPrefix("")); + assertNull(GieVerb.matchPrefix("+step +init=epsg:31370")); + assertNull(GieVerb.matchPrefix("-----")); + // Prefix matching is anchored: a verb in the middle of a line is not one. + assertNull(GieVerb.matchPrefix(" operation +proj=merc")); + assertNull(GieVerb.matchPrefix("the operation failed")); + } + + @Test + @DisplayName("the strict and non-strict delimiters are distinguished, not confused") + void delimitersAreDistinct() { + assertEquals(GieVerb.OPEN_GIE, GieVerb.matchPrefix("")); + assertEquals(GieVerb.CLOSE_GIE, GieVerb.matchPrefix("")); + assertEquals(GieVerb.OPEN_GIE_STRICT, GieVerb.matchPrefix("")); + assertEquals(GieVerb.CLOSE_GIE_STRICT, GieVerb.matchPrefix("")); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/PjText.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/PjText.java new file mode 100644 index 0000000..1f5d7c0 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/PjText.java @@ -0,0 +1,198 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +/** + * Faithful Java ports of PROJ's {@code pj_chomp} and {@code pj_shrink} text + * normalisers, from {@code 9.8.1:src/internal.cpp} lines 153 and 192. + * + *

These two functions define what a {@code .gie} argument string + * means. Getting them wrong silently changes + * {@code +proj=aea +lat_1=0} into something else, so this is a + * character-for-character transliteration of the C rather than a rewrite. + * + *

The C operates on {@code char*} buffers in place; the Java operates on + * {@link String}. Wherever the C reads one past the logical end of the buffer + * (which is always legal there because of the NUL terminator) the Java uses + * {@link #charAt(String, int)}, which returns {@code '\0'} out of range. + */ +public final class PjText { + + private PjText() { + } + + /** C {@code isspace} in the {@code "C"} locale. */ + public static boolean isSpace(char c) { + return c == ' ' || c == '\t' || c == '\n' || c == 0x0B || c == '\f' || c == '\r'; + } + + /** C {@code isdigit} in the {@code "C"} locale. */ + public static boolean isDigit(char c) { + return c >= '0' && c <= '9'; + } + + /** C {@code isgraph} in the {@code "C"} locale: printable, not space. */ + public static boolean isGraph(char c) { + return c > 0x20 && c < 0x7F; + } + + /** + * NUL-terminated-buffer indexing: returns {@code '\0'} rather than throwing + * when {@code i} is outside {@code s}. This mirrors reading {@code c[i]} in + * C where {@code c} is NUL terminated. + */ + public static char charAt(String s, int i) { + return (i >= 0 && i < s.length()) ? s.charAt(i) : '\0'; + } + + /** + * Port of {@code pj_chomp}: strip pre- and postfix whitespace; an inline + * {@code '#'} comment counts as whitespace, so everything from the first + * {@code '#'} onwards is discarded. {@code ';'} is treated as whitespace + * at both ends. + */ + public static String chomp(String c) { + if (c == null) { + return null; + } + int comment = c.indexOf('#'); + if (comment >= 0) { + c = c.substring(0, comment); + } + int n = c.length(); + if (n == 0) { + return c; + } + + /* Eliminate postfix whitespace: for (i = n-1; (i > 0) && ...; i--) */ + int end = n; + for (int i = n - 1; i > 0 && (isSpace(c.charAt(i)) || ';' == c.charAt(i)); i--) { + end = i; + } + + /* Find start of non-whitespace */ + int start = 0; + while (start < end && (';' == c.charAt(start) || isSpace(c.charAt(start)))) { + start++; + } + + return c.substring(start, end); + } + + /** + * Port of {@code pj_shrink}: "Collapse repeated whitespace. Remove + * {@code '+'} and {@code ';'}. Make {@code ','} and {@code '='} greedy, + * consuming their surrounding whitespace." Calls {@link #chomp} first, as + * the C does. + * + *

A {@code '+'} is only removed when it opens a token, so the {@code +} + * in {@code 1.23e+08} survives. Double-quoted strings opened immediately + * after an {@code '='} are copied verbatim in the first pass, with + * {@code ""} escaping a quote. Note that the second pass (the greedy + * {@code ','}/{@code '='} pass) is not string aware in the C + * either; that is reproduced here. + */ + public static String shrink(String in) { + if (in == null) { + return null; + } + String chomped = chomp(in); + int n = chomped.length(); + if (n == 0) { + return chomped; + } + + char[] c = chomped.toCharArray(); + + /* First collapse repeated whitespace (including +/;) */ + int i = 0; + boolean ws = false; + boolean inString = false; + for (int j = 0; j < n; j++) { + + if (inString) { + if (c[j] == '"' && charAt(c, j + 1, n) == '"') { + c[i++] = c[j]; + j++; + } else if (c[j] == '"') { + inString = false; + } + c[i++] = c[j]; + continue; + } + + /* Eliminate prefix '+', only if preceded by whitespace */ + /* (i.e. keep it in 1.23e+08) */ + if (i > 0 && '+' == c[j] && ws) { + c[j] = ' '; + } + if (i == 0 && '+' == c[j]) { + c[j] = ' '; + } + + /* Detect a string beginning after '=' */ + if (c[j] == '"' && i > 0 && c[i - 1] == '=') { + inString = true; + ws = false; + c[i++] = c[j]; + continue; + } + + if (isSpace(c[j]) || ';' == c[j]) { + if (!ws && i > 0) { + c[i++] = ' '; + } + ws = true; + continue; + } else { + ws = false; + c[i++] = c[j]; + } + } + n = i; + + /* Then make ',' and '=' greedy */ + i = 0; + for (int j = 0; j < n; j++) { + if (i == 0) { + c[i++] = c[j]; + continue; + } + + /* Skip space before '='/',' */ + if ('=' == c[j] || ',' == c[j]) { + if (c[i - 1] == ' ') { + c[i - 1] = c[j]; + } else { + c[i++] = c[j]; + } + continue; + } + + if (' ' == c[j] && ('=' == c[i - 1] || ',' == c[i - 1])) { + continue; + } + + c[i++] = c[j]; + } + + return new String(c, 0, i); + } + + private static char charAt(char[] c, int i, int n) { + return (i >= 0 && i < n) ? c[i] : '\0'; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/PjTextTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/PjTextTest.java new file mode 100644 index 0000000..02b44cf --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/PjTextTest.java @@ -0,0 +1,115 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PjTextTest { + + // ------------------------------------------------------------- pj_chomp + + @Test + @DisplayName("chomp strips an inline # comment, and everything after it") + void chompStripsComments() { + assertEquals("expect 1 2", PjText.chomp("expect 1 2 # DE_DHDN_Lat-Lon")); + assertEquals("", PjText.chomp("# a whole-line comment")); + assertEquals("", PjText.chomp("#####")); + } + + @Test + @DisplayName("chomp trims whitespace and ';' at both ends") + void chompTrimsBothEnds() { + assertEquals("a b", PjText.chomp(" a b \t\r\n")); + assertEquals("a b", PjText.chomp(";;a b;;")); + assertEquals("", PjText.chomp(" ")); + assertEquals("", PjText.chomp(";")); + assertEquals("", PjText.chomp("")); + } + + @Test + @DisplayName("chomp left-trims, so an indented verb still starts at column 0") + void chompEnablesIndentedVerbs() { + // peirce_q.gie really does indent 6 of its 10 `operation` lines by one + // space, and gie accepts them, because nextline() chomps before at_tag(). + assertEquals("operation +proj=peirce_q +R=6370997 +shape=diamond", + PjText.chomp(" operation +proj=peirce_q +R=6370997 +shape=diamond")); + } + + @Test + @DisplayName("chomp keeps a trailing backslash, so ' \\' continuation survives") + void chompKeepsTrailingBackslash() { + String chomped = PjText.chomp("operation +proj=pipeline \\ # turn off dual datum shift"); + assertEquals("operation +proj=pipeline \\", chomped); + assertEquals('\\', chomped.charAt(chomped.length() - 1)); + } + + // ------------------------------------------------------------ pj_shrink + + @Test + @DisplayName("'+' prefixes are optional: both spellings normalise identically") + void plusPrefixesAreOptional() { + String withPlus = PjText.shrink("+proj=aea +ellps=GRS80"); + String withoutPlus = PjText.shrink("proj=aea ellps=GRS80"); + assertEquals("proj=aea ellps=GRS80", withPlus); + assertEquals(withPlus, withoutPlus); + } + + @Test + @DisplayName("shrink keeps the '+' inside an exponent") + void shrinkKeepsExponentSign() { + assertEquals("1.23e+08", PjText.shrink("1.23e+08")); + assertEquals("expect 1.23e+08 2", PjText.shrink("expect 1.23e+08 2")); + } + + @Test + @DisplayName("shrink strips a trailing comment and collapses repeated whitespace") + void shrinkStripsCommentAndCollapsesWhitespace() { + assertEquals("expect 1 2", PjText.shrink("expect 1 2 # comment")); + assertEquals("tolerance 0.01 m", PjText.shrink("tolerance 0.01 m")); + } + + @Test + @DisplayName("',' and '=' are greedy, eating the whitespace around them") + void commaAndEqualsAreGreedy() { + assertEquals("a,b", PjText.shrink("a , b")); + assertEquals("x=1", PjText.shrink("x = 1")); + assertEquals("towgs84=0,0,0", PjText.shrink("+towgs84 = 0 , 0 , 0")); + } + + @Test + @DisplayName("shrink removes ';' as whitespace") + void shrinkRemovesSemicolons() { + assertEquals("a b", PjText.shrink("a;b")); + } + + @Test + @DisplayName("a double-quoted string after '=' is copied verbatim, '\"\"' escaping a quote") + void shrinkRespectsQuotedStrings() { + assertEquals("name=\"a b\"", PjText.shrink("+name=\"a b\"")); + assertEquals("name=\"say \"\"hi\"\"\"", PjText.shrink("+name=\"say \"\"hi\"\"\"")); + } + + @Test + @DisplayName("shrink of empty / all-whitespace input is empty") + void shrinkOfEmpty() { + assertEquals("", PjText.shrink("")); + assertEquals("", PjText.shrink(" ")); + assertEquals("", PjText.shrink("# only a comment")); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjDmsToR.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjDmsToR.java new file mode 100644 index 0000000..51c456e --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjDmsToR.java @@ -0,0 +1,270 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.locationtech.proj4j.conformance.parse.PjText.charAt; +import static org.locationtech.proj4j.conformance.parse.PjText.isDigit; +import static org.locationtech.proj4j.conformance.parse.PjText.isGraph; +import static org.locationtech.proj4j.conformance.parse.PjText.isSpace; + +/** + * Port of {@code dmstor_ctx} from {@code 9.8.1:src/dmstor.cpp}, reached from + * gie as {@code proj_dmstor} ({@code src/coordinates.cpp:103}). + * + *

Converts a degrees/minutes/seconds string to radians. + * Handles the corpus forms {@code 83d10'W}, {@code 43d45'N}, + * {@code -64d43'75.34} and {@code 79d58'00.000"W}, plus a trailing {@code r} + * for a value already in radians. + * + *

Note that this routine does not use {@link ProjStrtod} — it uses + * its own private helper that truncates the string at the first {@code d} or + * {@code D} and calls the platform {@code strtod}. That means underscores are + * not accepted in DMS literals, which is upstream's behaviour and the + * reason {@code parse_coord} tries both parsers. The C comment in + * {@code gie.cpp} calls this out as a wart to be fixed "when projects.h is + * removed"; until then, faithfulness beats tidiness. + */ +public final class ProjDmsToR { + + private static final String SYM = "NnEeSsWw"; + + private static final double DEG_TO_RAD = 0.017453292519943296; + + /** {@code vm[]}: degrees, minutes, seconds, as radians per unit. */ + private static final double[] VM = { + DEG_TO_RAD, .0002908882086657216, .0000048481368110953599 + }; + + /** Bytes of U+00B0 DEGREE SIGN in UTF-8, treated one byte at a time. */ + private static final char DEG_SIGN1 = 0x00C2; + private static final char DEG_SIGN2 = 0x00B0; + + private static final int MAX_WORK = 64; + + private ProjDmsToR() { + } + + /** The {@code (radians, endptr)} pair that C returns by side effect. */ + public static final class Result { + /** Value in radians; {@code HUGE_VAL} on a malformed unit sequence. */ + public final double radians; + /** Index just past the consumed text. */ + public final int end; + + Result(double radians, int end) { + this.radians = radians; + this.end = end; + } + + @Override + public String toString() { + return radians + "@" + end; + } + } + + public static Result dmstor(String is) { + return dmstor(is, 0); + } + + /** Parse a DMS literal starting at index {@code from}. */ + public static Result dmstor(String is, int from) { + if (is == null) { + return new Result(Double.POSITIVE_INFINITY, from); + } + /* rs is set to the *original* pointer before whitespace is skipped, so + * every early error return reports "consumed nothing". */ + final int origin = from; + + int p = from; + while (isSpace(charAt(is, p))) { + p++; + } + final int isStart = p; + + /* + * Copy characters into work until we hit a non-printable character or + * run out of space in the buffer. Make a special exception for the + * bytes of the Degree Sign in UTF-8. + */ + StringBuilder workBuf = new StringBuilder(); + int n = MAX_WORK; + while (true) { + char c = charAt(is, p); + if (!(isGraph(c) || c == DEG_SIGN1 || c == DEG_SIGN2)) { + break; + } + if (--n == 0) { + break; + } + workBuf.append(c); + p++; + } + final String work = workBuf.toString(); + + int s = 0; + int sign = 1; + char signCh = charAt(work, s); + if (signCh == '+' || signCh == '-') { + if (signCh == '-') { + sign = -1; + } + s++; + } + + double v = 0.; + for (int nl = 0; nl < 3; nl = n + 1) { + char c0 = charAt(work, s); + if (!(isDigit(c0) || c0 == '.')) { + break; + } + InnerStrtod.Num r = InnerStrtod.parse(work, s); + double tv = r.value; + if (tv == Double.POSITIVE_INFINITY) { + return new Result(tv, origin); + } + s = r.end; + int adv = 1; + + char cs = charAt(work, s); + if (cs == 'D' || cs == 'd' || cs == DEG_SIGN2) { + /* \xb0 as a single-byte degree symbol */ + n = 0; + } else if (cs == '\'') { + n = 1; + } else if (cs == '"') { + n = 2; + } else if (cs == DEG_SIGN1 && charAt(work, s + 1) == DEG_SIGN2) { + /* degree symbol in UTF-8 */ + n = 0; + adv = 2; + } else if (cs == 'r' || cs == 'R') { + if (nl != 0) { + /* PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE */ + return new Result(Double.POSITIVE_INFINITY, origin); + } + ++s; + v = tv; + n = 4; + continue; + } else { + v += tv * VM[nl]; + n = 4; + continue; + } + + if (n < nl) { + /* units out of order, e.g. 12'34d */ + return new Result(Double.POSITIVE_INFINITY, origin); + } + v += tv * VM[n]; + s += adv; + } + + /* postfix sign */ + char post = charAt(work, s); + if (post != '\0') { + int idx = SYM.indexOf(post); + if (idx >= 0) { + sign = idx >= 4 ? -1 : 1; + ++s; + } + } + if (sign == -1) { + v = -v; + } + return new Result(v, isStart + s); + } + + /** + * The file-static {@code proj_strtod} inside {@code dmstor.cpp} — not the + * underscore-aware {@link ProjStrtod}. It NUL-terminates the buffer at the + * first {@code d}/{@code D} so the platform {@code strtod} cannot read the + * Fortran-style {@code D} exponent, then parses plain C decimal syntax. + */ + static final class InnerStrtod { + + static final class Num { + final double value; + final int end; + + Num(double value, int end) { + this.value = value; + this.end = end; + } + } + + private InnerStrtod() { + } + + static Num parse(String s, int from) { + int limit = s.length(); + for (int cp = from; cp < s.length(); cp++) { + char c = s.charAt(cp); + if (c == 'd' || c == 'D') { + limit = cp; + break; + } + } + return cStrtod(s, from, limit); + } + + /** Plain C {@code strtod} over {@code s[from, limit)}, "C" locale. */ + static Num cStrtod(String s, int from, int limit) { + int p = from; + while (p < limit && isSpace(s.charAt(p))) { + p++; + } + int mantissaStart = p; + if (p < limit && (s.charAt(p) == '+' || s.charAt(p) == '-')) { + p++; + } + int intStart = p; + while (p < limit && isDigit(s.charAt(p))) { + p++; + } + int intEnd = p; + int fracStart = p; + int fracEnd = p; + if (p < limit && s.charAt(p) == '.') { + p++; + fracStart = p; + while (p < limit && isDigit(s.charAt(p))) { + p++; + } + fracEnd = p; + } + if (intEnd == intStart && fracEnd == fracStart) { + /* no conversion performed: endptr := nptr */ + return new Num(0.0, from); + } + int end = p; + if (p < limit && (s.charAt(p) == 'e' || s.charAt(p) == 'E')) { + int q = p + 1; + if (q < limit && (s.charAt(q) == '+' || s.charAt(q) == '-')) { + q++; + } + if (q < limit && isDigit(s.charAt(q))) { + while (q < limit && isDigit(s.charAt(q))) { + q++; + } + end = q; + } + } + double value = Double.parseDouble(s.substring(mantissaStart, end)); + return new Num(value, end); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjDmsToRTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjDmsToRTest.java new file mode 100644 index 0000000..9671a1f --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjDmsToRTest.java @@ -0,0 +1,97 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ProjDmsToRTest { + + private static final double EPS = 1e-12; + + private static double degrees(String s) { + return Math.toDegrees(ProjDmsToR.dmstor(s).radians); + } + + @Test + @DisplayName("a trailing hemisphere letter sets the sign: W and S are negative") + void hemisphereLetters() { + assertEquals(-(83 + 10 / 60.0), degrees("83d10'W"), EPS); + assertEquals(43 + 45 / 60.0, degrees("43d45'N"), EPS); + assertEquals(-(79 + 58 / 60.0), degrees("79d58'00.000\"W"), EPS); + assertEquals(12.5, degrees("12d30'E"), EPS); + assertEquals(-12.5, degrees("12d30'S"), EPS); + } + + @Test + @DisplayName("a leading sign works, and seconds may exceed 60") + void leadingSignAndOversizeSeconds() { + // -64d43'75.34 : the corpus really does write 75.34 seconds. + assertEquals(-(64 + 43 / 60.0 + 75.34 / 3600.0), degrees("-64d43'75.34"), EPS); + } + + @Test + @DisplayName("the end position covers the whole DMS token") + void endPosition() { + assertEquals(7, ProjDmsToR.dmstor("83d10'W").end); + assertEquals(7, ProjDmsToR.dmstor("43d45'N").end); + assertEquals(12, ProjDmsToR.dmstor("-64d43'75.34").end); + assertEquals(14, ProjDmsToR.dmstor("79d58'00.000\"W").end); + // -81d00'00.000 parses to -81 under both parsers, but only this one + // reports the correct end - which is why parse_coord has a special case. + assertEquals(13, ProjDmsToR.dmstor("-81d00'00.000").end); + assertEquals(-81.0, degrees("-81d00'00.000"), EPS); + } + + @Test + @DisplayName("parsing stops at the first non-printable character") + void stopsAtWhitespace() { + ProjDmsToR.Result r = ProjDmsToR.dmstor("83d10'W 43d45'N"); + assertEquals(7, r.end); + assertEquals(-(83 + 10 / 60.0), Math.toDegrees(r.radians), EPS); + } + + @Test + @DisplayName("leading whitespace is skipped but counted in the end position") + void leadingWhitespace() { + ProjDmsToR.Result r = ProjDmsToR.dmstor(" 43d45'N"); + assertEquals(10, r.end); + assertEquals(43.75, Math.toDegrees(r.radians), EPS); + } + + @Test + @DisplayName("a trailing 'r' means the value is already in radians") + void radiansSuffix() { + assertEquals(0.5, ProjDmsToR.dmstor("0.5r").radians, EPS); + } + + @Test + @DisplayName("units out of order is an error: HUGE_VAL, consuming nothing") + void unitsOutOfOrder() { + ProjDmsToR.Result r = ProjDmsToR.dmstor("12'34d"); + assertEquals(Double.POSITIVE_INFINITY, r.radians); + assertEquals(0, r.end); + } + + @Test + @DisplayName("a plain decimal is read as degrees") + void plainDegrees() { + assertEquals(53.5, degrees("53.5"), EPS); + assertEquals(-7.25, degrees("-7.25"), EPS); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjStrtod.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjStrtod.java new file mode 100644 index 0000000..8face33 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjStrtod.java @@ -0,0 +1,304 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.locationtech.proj4j.conformance.parse.PjText.charAt; +import static org.locationtech.proj4j.conformance.parse.PjText.isDigit; +import static org.locationtech.proj4j.conformance.parse.PjText.isSpace; + +/** + * Port of {@code proj_strtod} from {@code 9.8.1:src/apps/proj_strtod.cpp}. + * + *

Two things make this not-{@link Double#parseDouble}: + * + *

    + *
  • Underscores are ignored anywhere in a numeric literal, + * so {@code 6_098_907.825_05} is {@code 6098907.82505}. The corpus uses + * this to break up ten-significant-digit northings.
  • + *
  • {@code '.'} is hardcoded as the decimal separator. + * PROJ behaves as if {@code LC_ALL=C} always. Nothing here may reach for + * {@code NumberFormat} or {@code DecimalFormat}, which would make the + * conformance result depend on the JVM's default locale.
  • + *
+ * + *

The accumulate-then-scale strategy (build an integer mantissa, then apply + * a power of ten) is upstream's, and it is reproduced rather than improved: + * a "better" parse would disagree with gie's expected values in the last + * ulps. + */ +public final class ProjStrtod { + + /** C {@code EINVAL}. */ + public static final int EINVAL = 22; + /** C {@code ERANGE}. */ + public static final int ERANGE = 34; + + /* C : these really are binary radix exponents, and upstream + * really does compare them against a decimal exponent. Ported as-is. */ + private static final int DBL_MIN_EXP = -1021; + private static final int DBL_MAX_EXP = 1024; + + private ProjStrtod() { + } + + /** The {@code (double, endptr, errno)} triple that C returns by side effect. */ + public static final class Result { + /** Parsed value. */ + public final double value; + /** Index just past the consumed text; equals the start when nothing parsed. */ + public final int end; + /** 0, {@link #EINVAL} or {@link #ERANGE}. */ + public final int errno; + + Result(double value, int end, int errno) { + this.value = value; + this.end = end; + this.errno = errno; + } + + @Override + public String toString() { + return value + "@" + end + (errno == 0 ? "" : " errno=" + errno); + } + } + + /** Parse a number at the start of {@code s}. */ + public static Result strtod(String s) { + return strtod(s, 0); + } + + /** Parse a number starting at index {@code from} of {@code s}. */ + public static Result strtod(String s, int from) { + if (s == null) { + return new Result(Double.POSITIVE_INFINITY, from, 0); + } + final int str = from; + double number = 0; + double integralPart; + int exponent = 0; + boolean fractionIsNonzero = false; + int sign = 0; + int p = from; + int n; + int numDigitsTotal = 0; + int numDigitsAfterComma = 0; + int numPrefixedZeros = 0; + + /* First skip leading whitespace */ + while (isSpace(charAt(s, p))) { + p++; + } + + /* Empty string? */ + if (charAt(s, p) == '\0') { + return new Result(0, str, 0); + } + + /* NaN */ + if (ciStartsWith(s, p, "NaN")) { + return new Result(Double.NaN, p + 3, 0); + } + + /* non-numeric? */ + if ("0123456789+-._".indexOf(charAt(s, p)) < 0) { + return new Result(0, str, 0); + } + + /* Then handle optional prefixed sign and skip prefix zeros */ + char c = charAt(s, p); + if (c == '-') { + sign = -1; + p++; + } else if (c == '+') { + sign = 1; + p++; + } else if (!(isDigit(c) || '_' == c || '.' == c)) { + return new Result(0, str, 0); + } + + /* stray sign, as in "+/-"? */ + if (0 != sign + && ("0123456789._".indexOf(charAt(s, p)) < 0 || '\0' == charAt(s, p))) { + return new Result(0, str, 0); + } + + /* skip prefixed zeros before '.' */ + while ('0' == charAt(s, p) || '_' == charAt(s, p)) { + p++; + } + + /* zero? */ + if ('\0' == charAt(s, p) || "0123456789eE.".indexOf(charAt(s, p)) < 0 + || isSpace(charAt(s, p))) { + return new Result(sign == -1 ? -number : number, p, 0); + } + + /* Now expect a (potentially zero-length) string of digits */ + while (isDigit(charAt(s, p)) || '_' == charAt(s, p)) { + if ('_' == charAt(s, p)) { + p++; + continue; + } + number = number * 10. + (charAt(s, p) - '0'); + p++; + numDigitsTotal++; + } + integralPart = number; + + /* Done? */ + if ('\0' == charAt(s, p)) { + return new Result(sign == -1 ? -number : number, p, 0); + } + + /* Do we have a fractional part? */ + if ('.' == charAt(s, p)) { + p++; + + /* keep on skipping prefixed zeros (i.e. allow writing 1e-20 */ + /* as 0.00000000000000000001 without losing precision) */ + if (0 == integralPart) { + while ('0' == charAt(s, p) || '_' == charAt(s, p)) { + if ('0' == charAt(s, p)) { + numPrefixedZeros++; + } + p++; + } + } + + /* if the next character is nonnumeric, we have reached the end */ + if ('\0' == charAt(s, p) || "_0123456789eE+-".indexOf(charAt(s, p)) < 0) { + return new Result(sign == -1 ? -number : number, p, 0); + } + + while (isDigit(charAt(s, p)) || '_' == charAt(s, p)) { + /* Don't let pathologically long fractions destroy precision */ + if ('_' == charAt(s, p) || numDigitsTotal > 17) { + p++; + continue; + } + number = number * 10. + (charAt(s, p) - '0'); + if (charAt(s, p) != '0') { + fractionIsNonzero = true; + } + p++; + numDigitsTotal++; + numDigitsAfterComma++; + } + + /* Avoid having long zero-tails (4321.000...000) destroy precision */ + if (fractionIsNonzero) { + exponent = -(numDigitsAfterComma + numPrefixedZeros); + } else { + number = integralPart; + } + } /* end of fractional part */ + + /* non-digit */ + if (0 == numDigitsTotal) { + return new Result(Double.POSITIVE_INFINITY, p, EINVAL); + } + + if (sign == -1) { + number = -number; + } + + /* Do we have an exponent part? */ + while (charAt(s, p) == 'e' || charAt(s, p) == 'E') { + p++; + + /* Just a stray "e", as in 100elephants? */ + if ('\0' == charAt(s, p) || "0123456789+-_".indexOf(charAt(s, p)) < 0) { + p--; + break; + } + + while ('_' == charAt(s, p)) { + p++; + } + /* Does it have a sign? */ + sign = 0; + if ('-' == charAt(s, p)) { + sign = -1; + p++; + } else if ('+' == charAt(s, p)) { + sign = 1; + p++; + } else if (!isDigit(charAt(s, p))) { + return new Result(Double.POSITIVE_INFINITY, p, 0); + } + + /* Go on and read the exponent */ + n = 0; + while (isDigit(charAt(s, p)) || '_' == charAt(s, p)) { + if ('_' == charAt(s, p)) { + p++; + continue; + } + n = n * 10 + (charAt(s, p) - '0'); + p++; + } + + if (-1 == sign) { + n = -n; + } + exponent += n; + break; + } + + if (exponent < DBL_MIN_EXP || exponent > DBL_MAX_EXP) { + return new Result(Double.POSITIVE_INFINITY, p, ERANGE); + } + + /* on some platforms pow() is very slow - so don't call it if exponent + * is close to 0 */ + if (0 == exponent) { + return new Result(number, p, 0); + } + if (Math.abs(exponent) < 20) { + double ex = 1; + int absexp = exponent < 0 ? -exponent : exponent; + while (absexp-- > 0) { + ex *= 10; + } + number = exponent < 0 ? number / ex : number * ex; + } else { + number *= Math.pow(10.0, (double) exponent); + } + return new Result(number, p, 0); + } + + /** Convenience: value only, as {@code proj_atof} does. */ + public static double atof(String s) { + return strtod(s, 0).value; + } + + /** ASCII case-insensitive prefix test, matching PROJ's {@code ci_starts_with}. */ + private static boolean ciStartsWith(String s, int from, String prefix) { + if (from + prefix.length() > s.length()) { + return false; + } + for (int i = 0; i < prefix.length(); i++) { + if (lower(s.charAt(from + i)) != lower(prefix.charAt(i))) { + return false; + } + } + return true; + } + + private static char lower(char c) { + return (c >= 'A' && c <= 'Z') ? (char) (c + 32) : c; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjStrtodTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjStrtodTest.java new file mode 100644 index 0000000..ba04a85 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/parse/ProjStrtodTest.java @@ -0,0 +1,133 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.parse; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Locale; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ProjStrtodTest { + + @Test + @DisplayName("underscores are ignored anywhere in a numeric literal") + void underscoresAreIgnored() { + ProjStrtod.Result r = ProjStrtod.strtod("6_098_907.825_05"); + assertEquals(6098907.82505, r.value); + assertEquals(16, r.end); + + assertEquals(1000.0, ProjStrtod.atof("1_000")); + assertEquals(1.0, ProjStrtod.atof("1_______")); + assertEquals(123456789.101112, ProjStrtod.atof("__123_456_789_._10_11_12")); + assertEquals(-0.01, ProjStrtod.atof("-1e__-_2__rest")); + } + + @Test + @DisplayName("'.' is the decimal separator regardless of the default locale") + void decimalSeparatorIsLocaleIndependent() { + Locale saved = Locale.getDefault(); + try { + // GERMANY writes 0,1 for one tenth. A NumberFormat-based parser + // would silently change answers here; this one must not. + Locale.setDefault(Locale.GERMANY); + assertEquals(0.1, ProjStrtod.atof("0.1")); + assertEquals(6098907.82505, ProjStrtod.atof("6_098_907.825_05")); + // A comma is a terminator, not a decimal point. + ProjStrtod.Result r = ProjStrtod.strtod("0,1"); + assertEquals(0.0, r.value); + assertEquals(1, r.end); + } finally { + Locale.setDefault(saved); + } + } + + @Test + @DisplayName("plain decimals round-trip bit-exactly against the Java literal") + void plainDecimalsAreExact() { + assertEquals(222571.608757106, ProjStrtod.atof("222571.608757106")); + assertEquals(110653.326743030, ProjStrtod.atof("110653.326743030")); + assertEquals(1335833.88951928, ProjStrtod.atof("1335833.88951928")); + assertEquals(7326837.71424703, ProjStrtod.atof("7326837.71424703")); + assertEquals(691875.632, ProjStrtod.atof("691875.632")); + } + + @Test + @DisplayName("exponents, with or without a sign and with underscores") + void exponents() { + assertEquals(1000.0, ProjStrtod.atof("1e3")); + assertEquals(1.23e8, ProjStrtod.atof("1.23e+08")); + assertEquals(-1e-7, ProjStrtod.atof("-0.00001e-2")); + assertEquals(2.77777777778e-07, ProjStrtod.atof("2.77777777778e-07")); + } + + @Test + @DisplayName("the end position is where parsing stopped, not the end of the string") + void endPosition() { + assertEquals(3, ProjStrtod.strtod("100elephants").end); + assertEquals(100.0, ProjStrtod.strtod("100elephants").value); + assertEquals(1, ProjStrtod.strtod("0 66").end); + assertEquals(1, ProjStrtod.strtod("1 ").end); + } + + @Test + @DisplayName("nothing parseable leaves the end position at the start") + void nothingParsed() { + assertEquals(0, ProjStrtod.strtod("abc").end); + assertEquals(0.0, ProjStrtod.strtod("abc").value); + assertEquals(0, ProjStrtod.strtod("").end); + assertEquals(0, ProjStrtod.strtod("+").end); + assertEquals(0, ProjStrtod.strtod("-").end); + // ... but from a non-zero offset it is that offset, not 0 + assertEquals(4, ProjStrtod.strtod("1 2 abc", 4).end); + } + + @Test + @DisplayName("NaN is recognised case-insensitively") + void nan() { + assertTrue(Double.isNaN(ProjStrtod.strtod("NaN").value)); + assertTrue(Double.isNaN(ProjStrtod.strtod("nan").value)); + assertEquals(3, ProjStrtod.strtod("NaN").end); + } + + @Test + @DisplayName("a decimal exponent out of range sets ERANGE and returns HUGE_VAL") + void overflowSetsErange() { + ProjStrtod.Result r = ProjStrtod.strtod("1e9999"); + assertEquals(Double.POSITIVE_INFINITY, r.value); + assertEquals(ProjStrtod.ERANGE, r.errno); + } + + @Test + @DisplayName("signed zero is preserved") + void signedZero() { + assertEquals(Double.doubleToLongBits(-0.0), + Double.doubleToLongBits(ProjStrtod.atof("-0 "))); + assertEquals(Double.doubleToLongBits(0.0), + Double.doubleToLongBits(ProjStrtod.atof("0 "))); + } + + @Test + @DisplayName("degenerate but legal forms: '0.' and '.5'") + void degenerateForms() { + assertEquals(0.0, ProjStrtod.atof("0.")); + assertEquals(2, ProjStrtod.strtod("0.").end); + assertEquals(0.5, ProjStrtod.atof(".5")); + assertEquals(2, ProjStrtod.strtod(".5").end); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/report/ConformanceReport.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/report/ConformanceReport.java new file mode 100644 index 0000000..426601c --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/report/ConformanceReport.java @@ -0,0 +1,468 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.report; + +import java.util.List; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.manifest.DiffClassification; +import org.locationtech.proj4j.conformance.manifest.DiffEntry; +import org.locationtech.proj4j.conformance.manifest.DiffResult; +import org.locationtech.proj4j.conformance.manifest.ObservedRun; + +/** + * Renders a conformance run as text. + * + *

Every method is a pure function of its arguments returning a {@link String}: no filesystem, no + * clock, no logger, no {@code System.out}. That is what makes the exact wording of the headline — the + * number this project is judged by — unit-testable, and it lets the caller decide whether the output + * goes to the console, a file, or a CI annotation. + * + *

Line endings are always {@code \n}, never {@code System.lineSeparator()}, so a report committed + * or uploaded from one machine compares byte-for-byte with one from another. + * + *

Skips and vacuous expected failures are printed as their own numbers, everywhere. + * There is no rendering in this class in which either is added to the pass count or omitted from the + * headline; see {@link AssertionOutcome}. + */ +public final class ConformanceReport { + + /** + * The number of assertions {@code gie} actually evaluates in the corpus at PROJ 9.8.1: 6,962 + * {@code expect} + 961 {@code roundtrip} = 7,923, across 42 active files. + * + *

Passed explicitly to every renderer so a partial run (one file, one tier) can still report + * against the real total rather than against itself — a run of one file that passes everything is + * not 100% conformant. + * + *

Corrected from 8,017. That figure counted {@code DHDN_ETRS89.gie}'s 94 + * out-of-block {@code expect} lines, which sit after {@code } under a heading reading + * "Tests for GK system zones to UTM32/33 not implemented yet". {@code gie} never reads them, the + * lexer never emits them, and so the old denominator produced a report that said + * {@code 2093/8017 … 94 not run} — an inconsistency in a single line of output, and an + * understatement of the percentage by counting assertions that cannot be attempted. They are + * reported instead as {@link #EXCLUDED_OUT_OF_BLOCK}, which is a separate fact rather than a + * missing one. + */ + public static final int TOTAL_ASSERTIONS = 7923; + + /** + * The 94 {@code expect} lines in {@code gie/DHDN_ETRS89.gie} that lie outside its + * {@code } block (which closes at line 161 of 375) and are therefore never evaluated by + * anything, upstream included. + * + *

Reported as an explicit line rather than dropped, so that the difference between this + * denominator and the {@code grep -c '^expect'} count of 8,017 is visible in the output instead of + * having to be rediscovered. + */ + public static final int EXCLUDED_OUT_OF_BLOCK = 94; + + private static final String NEWLINE = "\n"; + private static final String[] FILE_TABLE_HEADERS = {"file", "pass", "fail", "skip", "vacuous", "total"}; + + private ConformanceReport() {} + + /** + * The one-line headline, e.g. + * {@code "906/6736 genuine passes (5828 failing, 2 skipped); 1187 vacuous expect failure = UNMEASURED, excluded from both numerator and denominator; 94 excluded (out of block)"}. + * + *

What the ratio is

+ * + *

Genuine passes over assertions that are not vacuous. Both halves matter. The + * numerator counts only {@link AssertionOutcome#PASS}, so a skip and a vacuous expected failure are + * excluded from it. The denominator is {@code corpusSize} minus the vacuous count, so a vacuous + * assertion is not scored as remaining work either — it is not work, it is an unknown. Folding it + * into the denominator would make the percentage rise as soon as an implementation landed and + * turned an unknown into a known failure, which is backwards. + * + *

The vacuous count is then stated separately and labelled {@code UNMEASURED}, in the same line, + * so that no reader can quote the ratio without also seeing how much of the corpus it declines to + * speak for. {@code ; N not run} and {@code ; N excluded (out of block)} are appended for the same + * reason: "not run", "not evaluable", "failed" and "unmeasured" are four different problems with + * four different owners. + * + * @param run the observed run + * @param corpusSize the total the run is judged against, normally {@link #TOTAL_ASSERTIONS} + * @param excludedOutOfBlock assertions upstream never evaluates, normally + * {@link #EXCLUDED_OUT_OF_BLOCK}; pass 0 for a synthetic run + * @return the headline + */ + public static String headline(ObservedRun run, int corpusSize, int excludedOutOfBlock) { + int pass = run.count(AssertionOutcome.PASS); + int fail = run.count(AssertionOutcome.FAIL); + int skip = run.count(AssertionOutcome.SKIP); + int vacuous = run.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE); + StringBuilder out = new StringBuilder(160); + out.append(pass) + .append('/') + .append(measuredDenominator(run, corpusSize)) + .append(" genuine passes (") + .append(fail) + .append(" failing, ") + .append(skip) + .append(" skipped)"); + if (vacuous > 0) { + out.append("; ") + .append(vacuous) + .append(" vacuous expect failure = UNMEASURED, excluded from both numerator and denominator"); + } + int notRun = corpusSize - run.total(); + if (notRun > 0) { + out.append("; ").append(notRun).append(" not run"); + } + if (excludedOutOfBlock > 0) { + out.append("; ").append(excludedOutOfBlock).append(" excluded (out of block)"); + } + return out.toString(); + } + + /** + * @param run the observed run + * @param corpusSize the total the run is judged against + * @return {@link #headline(ObservedRun, int, int)} with no out-of-block exclusions, for synthetic + * runs that are not the real corpus + */ + public static String headline(ObservedRun run, int corpusSize) { + return headline(run, corpusSize, 0); + } + + /** + * @param run the observed run + * @return the headline against the real corpus: {@link #TOTAL_ASSERTIONS} and + * {@link #EXCLUDED_OUT_OF_BLOCK} + */ + public static String headline(ObservedRun run) { + return headline(run, TOTAL_ASSERTIONS, EXCLUDED_OUT_OF_BLOCK); + } + + /** + * The denominator of the headline ratio: the assertions this run is entitled to be judged on. + * + * @param run the observed run + * @param corpusSize the total the run is judged against + * @return {@code corpusSize} less the vacuous count, never negative + */ + public static int measuredDenominator(ObservedRun run, int corpusSize) { + return Math.max(0, corpusSize - run.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + } + + /** + * A per-file breakdown, one row per corpus file, files alphabetically. + * + *

The {@code vacuous} column is the point of this table: it is where + * {@code gie/adams_hemi.gie 0 703 0 388} is legible as "388 rows that look like passes and are not", + * and where the old rendering said {@code 388 0} and read as a success. + * + * @param run the observed run + * @return an aligned plain-text table, ending in a newline; the header row only, if the run is + * empty + */ + public static String perFileTable(ObservedRun run) { + int fileWidth = FILE_TABLE_HEADERS[0].length(); + for (String path : run.filePaths()) { + fileWidth = Math.max(fileWidth, path.length()); + } + int numberWidth = 7; + StringBuilder out = new StringBuilder(128 + 64 * run.filePaths().size()); + appendRow(out, fileWidth, numberWidth, FILE_TABLE_HEADERS); + appendRule(out, fileWidth, numberWidth); + int totalPass = 0; + int totalFail = 0; + int totalSkip = 0; + int totalVacuous = 0; + for (String path : run.filePaths()) { + int pass = run.countIn(path, AssertionOutcome.PASS); + int fail = run.countIn(path, AssertionOutcome.FAIL); + int skip = run.countIn(path, AssertionOutcome.SKIP); + int vacuous = run.countIn(path, AssertionOutcome.VACUOUS_EXPECTED_FAILURE); + totalPass += pass; + totalFail += fail; + totalSkip += skip; + totalVacuous += vacuous; + appendRow( + out, + fileWidth, + numberWidth, + new String[] { + path, + Integer.toString(pass), + Integer.toString(fail), + Integer.toString(skip), + Integer.toString(vacuous), + Integer.toString(pass + fail + skip + vacuous), + }); + } + if (!run.filePaths().isEmpty()) { + appendRule(out, fileWidth, numberWidth); + appendRow( + out, + fileWidth, + numberWidth, + new String[] { + "TOTAL", + Integer.toString(totalPass), + Integer.toString(totalFail), + Integer.toString(totalSkip), + Integer.toString(totalVacuous), + Integer.toString(totalPass + totalFail + totalSkip + totalVacuous), + }); + } + return out.toString(); + } + + /** + * The build-relevant detail: every regression, every unexpected pass, every disappearance, with its + * key and its reason. + * + * @param diff the classified diff + * @return the detail sections; {@code "No regressions, unexpected passes or disappearances.\n"} + * when there is nothing to report + */ + public static String differences(DiffResult diff) { + StringBuilder out = new StringBuilder(256); + boolean any = false; + any |= appendSection( + out, + diff, + DiffClassification.REGRESSED, + "REGRESSED (was expected to pass, did not)"); + any |= appendSection( + out, + diff, + DiffClassification.UNEXPECTED_PASS, + "UNEXPECTED PASS (manifest says this still fails - regenerate to bank the win)"); + any |= appendSection( + out, + diff, + DiffClassification.DISAPPEARED, + "DISAPPEARED (known assertion was not executed)"); + if (!any) { + out.append("No regressions, unexpected passes or disappearances.").append(NEWLINE); + } + return out.toString(); + } + + /** + * A machine-readable summary for CI artifact upload: two tab-separated columns, {@code metric} and + * {@code value}, one metric per line. No JSON library, no properties escaping rules, no ordering + * surprises — {@code cut -f2} works, and so does {@code diff}. + * + *

Per-file rows are emitted as {@code file..} so a CI dashboard can chart any + * single file without re-parsing the human table. + * + * @param run the observed run + * @param diff the classified diff + * @param corpusSize the total the run is judged against, normally {@link #TOTAL_ASSERTIONS} + * @param excludedOutOfBlock assertions upstream never evaluates, normally + * {@link #EXCLUDED_OUT_OF_BLOCK} + * @return the summary text + */ + public static String machineSummary( + ObservedRun run, DiffResult diff, int corpusSize, int excludedOutOfBlock) { + StringBuilder out = new StringBuilder(512); + appendMetric(out, "conformance.corpus", corpusSize); + appendMetric(out, "conformance.evaluated", run.total()); + // The headline ratio, as two metrics, so a dashboard cannot reconstruct it wrongly. + appendMetric(out, "conformance.pass", run.count(AssertionOutcome.PASS)); + appendMetric(out, "conformance.measured_denominator", measuredDenominator(run, corpusSize)); + appendMetric(out, "conformance.fail", run.count(AssertionOutcome.FAIL)); + appendMetric(out, "conformance.skip", run.count(AssertionOutcome.SKIP)); + appendMetric(out, "conformance.vacuous", run.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + appendMetric(out, "conformance.notrun", Math.max(0, corpusSize - run.total())); + appendMetric(out, "conformance.excluded_out_of_block", excludedOutOfBlock); + for (DiffClassification classification : DiffClassification.values()) { + appendMetric(out, "diff." + classification.name().toLowerCase(java.util.Locale.ROOT), diff.count(classification)); + } + appendMetric(out, "diff.outcome_changed", diff.outcomeChangedKeys().size()); + out.append("build.shouldFail").append('\t').append(diff.shouldFailBuild()).append(NEWLINE); + for (String path : run.filePaths()) { + appendMetric(out, "file." + path + ".pass", run.countIn(path, AssertionOutcome.PASS)); + appendMetric(out, "file." + path + ".fail", run.countIn(path, AssertionOutcome.FAIL)); + appendMetric(out, "file." + path + ".skip", run.countIn(path, AssertionOutcome.SKIP)); + appendMetric( + out, + "file." + path + ".vacuous", + run.countIn(path, AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + } + return out.toString(); + } + + /** + * @param run the observed run + * @param diff the classified diff + * @param corpusSize the total the run is judged against + * @return {@link #machineSummary(ObservedRun, DiffResult, int, int)} with no out-of-block exclusions + */ + public static String machineSummary(ObservedRun run, DiffResult diff, int corpusSize) { + return machineSummary(run, diff, corpusSize, 0); + } + + /** + * The full human report: headline, the four-category tally, diff counts, per-file table, then the + * detail sections. + * + * @param run the observed run + * @param diff the classified diff + * @param corpusSize the total the run is judged against, normally {@link #TOTAL_ASSERTIONS} + * @param excludedOutOfBlock assertions upstream never evaluates, normally + * {@link #EXCLUDED_OUT_OF_BLOCK} + * @return the report text + */ + public static String render( + ObservedRun run, DiffResult diff, int corpusSize, int excludedOutOfBlock) { + StringBuilder out = new StringBuilder(1024); + out.append(headline(run, corpusSize, excludedOutOfBlock)).append(NEWLINE); + out.append(NEWLINE); + out.append(categories(run, corpusSize, excludedOutOfBlock)); + out.append(NEWLINE); + out.append("unchanged ") + .append(diff.count(DiffClassification.UNCHANGED)) + .append(", still failing ") + .append(diff.count(DiffClassification.STILL_FAILING)) + .append(", regressed ") + .append(diff.count(DiffClassification.REGRESSED)) + .append(", unexpected passes ") + .append(diff.count(DiffClassification.UNEXPECTED_PASS)) + .append(", new ") + .append(diff.count(DiffClassification.NEW)) + .append(", disappeared ") + .append(diff.count(DiffClassification.DISAPPEARED)) + .append(NEWLINE); + out.append(NEWLINE); + out.append(perFileTable(run)); + out.append(NEWLINE); + out.append(differences(diff)); + if (diff.shouldFailBuild()) { + out.append(NEWLINE).append(diff.failureSummary()).append(NEWLINE); + } + return out.toString(); + } + + /** + * @param run the observed run + * @param diff the classified diff + * @param corpusSize the total the run is judged against + * @return {@link #render(ObservedRun, DiffResult, int, int)} with no out-of-block exclusions + */ + public static String render(ObservedRun run, DiffResult diff, int corpusSize) { + return render(run, diff, corpusSize, 0); + } + + /** + * The four categories, one per line, with the arithmetic of the headline spelled out underneath so + * that nobody has to trust the ratio in the first line. + * + *

Written as an aligned block rather than a single line because the vacuous row needs a sentence + * next to it. A number whose meaning has to be explained and is not explained where it is printed + * will be misquoted; this one already has been. + * + * @param run the observed run + * @param corpusSize the total the run is judged against + * @param excludedOutOfBlock assertions upstream never evaluates + * @return the block, ending in a newline + */ + public static String categories(ObservedRun run, int corpusSize, int excludedOutOfBlock) { + int pass = run.count(AssertionOutcome.PASS); + int fail = run.count(AssertionOutcome.FAIL); + int skip = run.count(AssertionOutcome.SKIP); + int vacuous = run.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE); + StringBuilder out = new StringBuilder(512); + appendCategory(out, "PASS", pass, "genuine agreement with PROJ - the numerator"); + appendCategory(out, "FAIL", fail, "measured disagreement - the remaining work"); + appendCategory(out, "SKIP", skip, "declined to run (require_grid / ignore) - NOT a pass"); + appendCategory( + out, + "VACUOUS", + vacuous, + "UNMEASURED: `expect failure` rows that gie would score as passes but which" + + " demonstrate nothing, because the operation could not be created for an" + + " unrelated reason. Counted as neither a pass nor a failure."); + appendCategory(out, "EXCLUDED", excludedOutOfBlock, "out of block: never evaluated, upstream included"); + out.append(" denominator = ") + .append(corpusSize) + .append(" corpus - ") + .append(vacuous) + .append(" vacuous = ") + .append(measuredDenominator(run, corpusSize)) + .append(NEWLINE); + return out.toString(); + } + + private static void appendCategory(StringBuilder out, String name, int count, String note) { + out.append(" "); + padRight(out, name, 10); + padLeft(out, Integer.toString(count), 6); + out.append(" ").append(note).append(NEWLINE); + } + + private static boolean appendSection( + StringBuilder out, DiffResult diff, DiffClassification classification, String title) { + List entries = diff.entries(classification); + if (entries.isEmpty()) { + return false; + } + if (out.length() > 0) { + out.append(NEWLINE); + } + out.append(title).append(" - ").append(entries.size()).append(NEWLINE); + for (DiffEntry entry : entries) { + out.append(" ").append(entry.key()); + out.append(" expected=").append(entry.expected()); + out.append(" observed=").append(entry.observed() == null ? "NOT-RUN" : entry.observed().name()); + if (!entry.reason().isEmpty()) { + out.append(NEWLINE).append(" reason: ").append(entry.reason()); + } + if (!entry.detail().isEmpty()) { + out.append(NEWLINE).append(" detail: ").append(entry.detail()); + } + out.append(NEWLINE); + } + return true; + } + + private static void appendMetric(StringBuilder out, String name, int value) { + out.append(name).append('\t').append(value).append(NEWLINE); + } + + private static void appendRow(StringBuilder out, int fileWidth, int numberWidth, String[] cells) { + padRight(out, cells[0], fileWidth); + for (int i = 1; i < cells.length; i++) { + padLeft(out, cells[i], numberWidth + 2); + } + out.append(NEWLINE); + } + + private static void appendRule(StringBuilder out, int fileWidth, int numberWidth) { + int width = fileWidth + (FILE_TABLE_HEADERS.length - 1) * (numberWidth + 2); + for (int i = 0; i < width; i++) { + out.append('-'); + } + out.append(NEWLINE); + } + + private static void padRight(StringBuilder out, String text, int width) { + out.append(text); + for (int i = text.length(); i < width; i++) { + out.append(' '); + } + } + + private static void padLeft(StringBuilder out, String text, int width) { + for (int i = text.length(); i < width; i++) { + out.append(' '); + } + out.append(text); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/report/ConformanceReportTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/report/ConformanceReportTest.java new file mode 100644 index 0000000..0e0bd36 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/report/ConformanceReportTest.java @@ -0,0 +1,358 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.report; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.conformance.manifest.AssertionKey; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.manifest.ConformanceDiff; +import org.locationtech.proj4j.conformance.manifest.CorpusIndex; +import org.locationtech.proj4j.conformance.manifest.DiffResult; +import org.locationtech.proj4j.conformance.manifest.ExpectedOutcomeManifest; +import org.locationtech.proj4j.conformance.manifest.ManifestEntry; +import org.locationtech.proj4j.conformance.manifest.ObservedRun; + +class ConformanceReportTest { + + private static final AssertionKey PASS_1 = AssertionKey.of("gie/builtins.gie", 0, 0, "00000001"); + private static final AssertionKey PASS_2 = AssertionKey.of("gie/builtins.gie", 0, 1, "00000002"); + private static final AssertionKey FAIL_1 = AssertionKey.of("gie/builtins.gie", 1, 0, "00000003"); + private static final AssertionKey SKIP_1 = AssertionKey.of("gie/epsg_grid.gie", 0, 0, "00000004"); + private static final AssertionKey LAEA = AssertionKey.of("gigs/5110.gie.failing", 2, 0, "00000005"); + private static final AssertionKey VACUOUS_1 = AssertionKey.of("gie/adams_hemi.gie", 0, 0, "00000006"); + private static final AssertionKey VACUOUS_2 = AssertionKey.of("gie/adams_hemi.gie", 0, 1, "00000007"); + + private static ObservedRun sampleRun() { + return ObservedRun.builder() + .record(PASS_1, AssertionOutcome.PASS) + .record(PASS_2, AssertionOutcome.PASS) + .record(FAIL_1, AssertionOutcome.FAIL, "deviation 12.4 m") + .record(SKIP_1, AssertionOutcome.SKIP, "require_grid us_nga_egm08_25.tif") + .record(LAEA, AssertionOutcome.FAIL, "1312 mm at lat 30") + .build(); + } + + /** {@link #sampleRun()} plus two vacuous expected failures, i.e. adams_hemi in miniature. */ + private static ObservedRun runWithVacuous() { + return ObservedRun.builder() + .record(PASS_1, AssertionOutcome.PASS) + .record(PASS_2, AssertionOutcome.PASS) + .record(FAIL_1, AssertionOutcome.FAIL, "deviation 12.4 m") + .record(SKIP_1, AssertionOutcome.SKIP, "require_grid us_nga_egm08_25.tif") + .record(LAEA, AssertionOutcome.FAIL, "1312 mm at lat 30") + .record(VACUOUS_1, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "VACUOUS: adams_hemi absent") + .record(VACUOUS_2, AssertionOutcome.VACUOUS_EXPECTED_FAILURE, "VACUOUS: adams_hemi absent") + .build(); + } + + // ----------------------------------------------------------------------------------- headline + + @Test + void headlineReportsSkipsSeparatelyFromPasses() { + String headline = ConformanceReport.headline(sampleRun(), 5); + assertEquals("2/5 genuine passes (2 failing, 1 skipped)", headline); + } + + @Test + void headlineNeverFoldsASkipIntoThePassCount() { + ObservedRun allSkipped = ObservedRun.builder() + .record(PASS_1, AssertionOutcome.SKIP) + .record(PASS_2, AssertionOutcome.SKIP) + .build(); + String headline = ConformanceReport.headline(allSkipped, 2); + assertEquals("0/2 genuine passes (0 failing, 2 skipped)", headline); + assertFalse(headline.startsWith("2/2"), "a corpus that skips everything is not a conformant corpus"); + } + + @Test + void headlineExcludesVacuousFromBothTheNumeratorAndTheDenominator() { + // 7 assertions: 2 pass, 2 fail, 1 skip, 2 vacuous. The honest ratio is 2/5, not 4/7 and not 2/7. + String headline = ConformanceReport.headline(runWithVacuous(), 7); + + assertTrue(headline.startsWith("2/5 genuine passes (2 failing, 1 skipped)"), headline); + assertFalse(headline.startsWith("4/"), "a vacuous expected failure is never a pass"); + assertFalse(headline.startsWith("2/7"), "nor is it remaining work; it is not in the denominator"); + assertTrue( + headline.contains("2 vacuous expect failure = UNMEASURED, excluded from both numerator and denominator"), + headline); + assertEquals(5, ConformanceReport.measuredDenominator(runWithVacuous(), 7)); + } + + @Test + void headlineSaysNothingAboutVacuityWhenThereIsNone() { + assertFalse(ConformanceReport.headline(sampleRun(), 5).contains("vacuous")); + } + + @Test + void headlineNamesTheAssertionsThatWereNotRunAtAll() { + assertEquals( + "2/7923 genuine passes (2 failing, 1 skipped); 7918 not run", + ConformanceReport.headline(sampleRun(), ConformanceReport.TOTAL_ASSERTIONS)); + } + + @Test + void theDenominatorIsWhatGieActuallyEvaluatesAndTheRestIsNamed() { + // 7,923 = 6,962 expect + 961 roundtrip. The 94 out-of-block lines of DHDN_ETRS89.gie are not + // "not run": gie never reads them, so they are reported as excluded rather than as missing. + assertEquals(7923, ConformanceReport.TOTAL_ASSERTIONS); + assertEquals(94, ConformanceReport.EXCLUDED_OUT_OF_BLOCK); + assertEquals(8017, ConformanceReport.TOTAL_ASSERTIONS + ConformanceReport.EXCLUDED_OUT_OF_BLOCK, + "together they account for every `expect` line a grep would have counted"); + + String headline = ConformanceReport.headline(sampleRun()); + assertTrue(headline.contains("/7923 genuine passes"), headline); + assertTrue(headline.endsWith("; 94 excluded (out of block)"), headline); + } + + @Test + void headlineOfAnEmptyRunIsNotAPass() { + assertEquals( + "0/7923 genuine passes (0 failing, 0 skipped); 7923 not run; 94 excluded (out of block)", + ConformanceReport.headline(ObservedRun.empty())); + } + + // ------------------------------------------------------------------------------ per-file table + + @Test + void perFileTableBreaksDownEveryFileWithSkipsInTheirOwnColumn() { + String table = ConformanceReport.perFileTable(sampleRun()); + String[] lines = table.split("\n"); + assertTrue(lines[0].startsWith("file"), lines[0]); + assertTrue(lines[0].contains("pass") && lines[0].contains("fail") && lines[0].contains("skip"), lines[0]); + assertTrue(lines[0].contains("vacuous"), lines[0]); + + Map rows = rowsByFirstToken(table); + assertEquals("gie/builtins.gie 2 1 0 0 3", rows.get("gie/builtins.gie")); + assertEquals("gie/epsg_grid.gie 0 0 1 0 1", rows.get("gie/epsg_grid.gie")); + assertEquals("gigs/5110.gie.failing 0 1 0 0 1", rows.get("gigs/5110.gie.failing")); + assertEquals("TOTAL 2 2 1 0 5", rows.get("TOTAL")); + } + + @Test + void perFileTableShowsGenuineAndVacuousSideBySide() { + // The row this table exists for. Before the split it read "gie/adams_hemi.gie 2 0 0 2" and + // looked like a file that passes everything. + Map rows = rowsByFirstToken(ConformanceReport.perFileTable(runWithVacuous())); + assertEquals("gie/adams_hemi.gie 0 0 0 2 2", rows.get("gie/adams_hemi.gie")); + assertEquals("TOTAL 2 2 1 2 7", rows.get("TOTAL")); + } + + @Test + void perFileTableOfAnEmptyRunIsJustTheHeader() { + String table = ConformanceReport.perFileTable(ObservedRun.empty()); + assertTrue(table.startsWith("file"), table); + assertFalse(table.contains("TOTAL"), table); + } + + @Test + void perFileTableIsDeterministicAndUsesUnixLineEndings() { + String once = ConformanceReport.perFileTable(sampleRun()); + assertEquals(once, ConformanceReport.perFileTable(sampleRun())); + assertFalse(once.contains("\r"), "line endings must be \\n so reports compare across machines"); + } + + // -------------------------------------------------------------------------------- differences + + @Test + void differencesListRegressionsWithKeysAndReasons() { + ExpectedOutcomeManifest manifest = ExpectedOutcomeManifest.of(Arrays.asList( + ManifestEntry.of(LAEA, AssertionOutcome.FAIL, "laea ellipsoidal inverse drift"), + ManifestEntry.of(SKIP_1, AssertionOutcome.SKIP, "require_grid, tier R4"))); + // FAIL_1 is not in the manifest, so it was expected to pass: a regression. + DiffResult diff = ConformanceDiff.compare(manifest, sampleRun(), CorpusIndex.ofRun(sampleRun())); + + String text = ConformanceReport.differences(diff); + assertTrue(text.contains("REGRESSED"), text); + assertTrue(text.contains(FAIL_1.toString()), text); + assertTrue(text.contains("deviation 12.4 m"), "the run detail belongs next to the regression"); + assertFalse(text.contains(LAEA.toString()), "a still-failing assertion is not a regression"); + } + + @Test + void differencesListUnexpectedPassesWithTheirReasonSoTheReasonCanBeDeleted() { + ExpectedOutcomeManifest manifest = ExpectedOutcomeManifest.of(Arrays.asList( + ManifestEntry.of(PASS_1, AssertionOutcome.FAIL, "laea ellipsoidal inverse, commit 83c91dd2"))); + ObservedRun run = ObservedRun.builder().record(PASS_1, AssertionOutcome.PASS).build(); + DiffResult diff = ConformanceDiff.compare(manifest, run, CorpusIndex.ofRun(run)); + + String text = ConformanceReport.differences(diff); + assertTrue(text.contains("UNEXPECTED PASS"), text); + assertTrue(text.contains(PASS_1.toString()), text); + assertTrue(text.contains("laea ellipsoidal inverse, commit 83c91dd2"), text); + assertTrue(text.contains("regenerate"), "tell the reader how to fix it"); + } + + @Test + void differencesListDisappearedAssertionsAsNotRun() { + DiffResult diff = ConformanceDiff.compare( + ExpectedOutcomeManifest.empty(), + ObservedRun.empty(), + CorpusIndex.of(Arrays.asList(PASS_1))); + String text = ConformanceReport.differences(diff); + assertTrue(text.contains("DISAPPEARED"), text); + assertTrue(text.contains("NOT-RUN"), text); + } + + @Test + void differencesSayNothingIsWrongWhenNothingIsWrong() { + ObservedRun run = ObservedRun.builder().record(PASS_1, AssertionOutcome.PASS).build(); + DiffResult diff = + ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + assertEquals("No regressions, unexpected passes or disappearances.\n", ConformanceReport.differences(diff)); + } + + // ----------------------------------------------------------------------------- machine summary + + @Test + void machineSummaryIsTabSeparatedAndKeepsSkipsSeparate() { + ObservedRun run = sampleRun(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + Map metrics = metrics(ConformanceReport.machineSummary(run, diff, 7923, 94)); + + assertEquals("7923", metrics.get("conformance.corpus")); + assertEquals("5", metrics.get("conformance.evaluated")); + assertEquals("2", metrics.get("conformance.pass")); + assertEquals("2", metrics.get("conformance.fail")); + assertEquals("1", metrics.get("conformance.skip")); + assertEquals("0", metrics.get("conformance.vacuous")); + assertEquals("7918", metrics.get("conformance.notrun")); + assertEquals("94", metrics.get("conformance.excluded_out_of_block")); + assertEquals("2", metrics.get("diff.unchanged")); + assertEquals("3", metrics.get("diff.regressed")); + assertEquals("0", metrics.get("diff.unexpected_pass")); + assertEquals("0", metrics.get("diff.disappeared")); + assertEquals("true", metrics.get("build.shouldFail")); + assertEquals("2", metrics.get("file.gie/builtins.gie.pass")); + assertEquals("1", metrics.get("file.gie/epsg_grid.gie.skip")); + assertEquals("0", metrics.get("file.gie/builtins.gie.vacuous")); + } + + @Test + void machineSummaryPublishesTheRatioAsTwoMetricsSoItCannotBeRebuiltWrongly() { + ObservedRun run = runWithVacuous(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + Map metrics = metrics(ConformanceReport.machineSummary(run, diff, 7, 94)); + + assertEquals("2", metrics.get("conformance.pass")); + assertEquals("5", metrics.get("conformance.measured_denominator")); + assertEquals("2", metrics.get("conformance.vacuous")); + assertEquals("7", metrics.get("conformance.corpus")); + assertEquals("2", metrics.get("file.gie/adams_hemi.gie.vacuous")); + assertEquals("0", metrics.get("file.gie/adams_hemi.gie.pass")); + } + + @Test + void machineSummaryReportsAQuietBuildAsSuch() { + ObservedRun run = ObservedRun.builder().record(PASS_1, AssertionOutcome.PASS).build(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + assertEquals("false", metrics(ConformanceReport.machineSummary(run, diff, 1)).get("build.shouldFail")); + } + + @Test + void machineSummaryHasExactlyTwoColumnsOnEveryLine() { + ObservedRun run = runWithVacuous(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + String summary = ConformanceReport.machineSummary(run, diff, 7923, 94); + for (String line : summary.split("\n")) { + if (line.isEmpty()) { + continue; + } + assertEquals(2, line.split("\t", -1).length, "not two columns: \"" + line + "\""); + } + } + + // ------------------------------------------------------------------------------- full render + + @Test + void fullReportLeadsWithTheHeadlineAndEndsWithTheVerdict() { + ObservedRun run = sampleRun(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + String report = ConformanceReport.render(run, diff, 7923, 94); + + assertTrue(report.startsWith("2/7923 genuine passes (2 failing, 1 skipped)"), report); + assertTrue(report.contains("still failing 0"), report); + assertTrue(report.contains("regressed 3"), report); + assertTrue(report.contains("gie/builtins.gie"), report); + assertTrue(report.contains("REGRESSED"), report); + assertTrue(report.trim().endsWith("conformance gate failed: 3 REGRESSED"), report); + } + + @Test + void fullReportSpellsOutAllFourCategoriesAndTheDenominatorArithmetic() { + ObservedRun run = runWithVacuous(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + String report = ConformanceReport.render(run, diff, 7, 94); + + assertTrue(report.contains("PASS"), report); + assertTrue(report.contains("FAIL"), report); + assertTrue(report.contains("SKIP"), report); + assertTrue(report.contains("VACUOUS"), report); + assertTrue(report.contains("EXCLUDED"), report); + assertTrue(report.contains("UNMEASURED"), report); + assertTrue(report.contains("denominator = 7 corpus - 2 vacuous = 5"), report); + } + + @Test + void categoriesNeverAddVacuityToPassesOrFailures() { + Map rows = rowsByFirstToken(ConformanceReport.categories(runWithVacuous(), 7, 94)); + assertTrue(rows.get("PASS").startsWith("PASS 2 "), rows.get("PASS")); + assertTrue(rows.get("FAIL").startsWith("FAIL 2 "), rows.get("FAIL")); + assertTrue(rows.get("SKIP").startsWith("SKIP 1 "), rows.get("SKIP")); + assertTrue(rows.get("VACUOUS").startsWith("VACUOUS 2 "), rows.get("VACUOUS")); + assertTrue(rows.get("EXCLUDED").startsWith("EXCLUDED 94 "), rows.get("EXCLUDED")); + assertTrue(rows.get("VACUOUS").contains("UNMEASURED"), rows.get("VACUOUS")); + } + + @Test + void fullReportIsAPureFunction() { + ObservedRun run = runWithVacuous(); + DiffResult diff = ConformanceDiff.compare(ExpectedOutcomeManifest.empty(), run, CorpusIndex.ofRun(run)); + assertEquals( + ConformanceReport.render(run, diff, 7923, 94), ConformanceReport.render(run, diff, 7923, 94)); + } + + private static Map metrics(String summary) { + Map parsed = new LinkedHashMap(); + for (String line : summary.split("\n")) { + if (line.isEmpty()) { + continue; + } + String[] columns = line.split("\t", -1); + parsed.put(columns[0], columns[1]); + } + return parsed; + } + + /** Collapses each table row to single-spaced tokens, keyed by its first token. */ + private static Map rowsByFirstToken(String table) { + Map rows = new LinkedHashMap(); + for (String line : table.split("\n")) { + String collapsed = line.trim().replaceAll("\\s+", " "); + if (collapsed.isEmpty() || collapsed.startsWith("-")) { + continue; + } + rows.put(collapsed.split(" ")[0], collapsed); + } + return rows; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/ExpectedFailureVerdict.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/ExpectedFailureVerdict.java new file mode 100644 index 0000000..4236068 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/ExpectedFailureVerdict.java @@ -0,0 +1,162 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import org.locationtech.proj4j.conformance.bridge.GieFailureKind; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; + +/** + * The three-way split of an {@code expect failure} row. + * + *

Upstream {@code gie} has a two-way split: the transform failed (success) or it did not + * ({@code "failed to fail"}). Two-way is not enough to measure anything, because "the transform + * failed" includes "there was no transform" — see {@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE}, + * which carries the full statement of the problem and of the rule this enum implements. + * + *

The rule, as code reads it

+ * + *

{@link #ofTransformFailure} and {@link #ofFailureToFail} are constants: a rejected coordinate is + * always genuine, and a transform that succeeded is always a failure. The whole decision lives in + * {@link #ofConstructionFailure}, which asks two questions in this order: + * + *

    + *
  1. Does the row assert that PROJ got as far as a coordinate? A + * {@code coord_transfm*} or {@code no_inverse_op} errno can only be raised after + * {@code proj_create} returned an object, so it does. proj4j did not get that far, so nothing + * was compared: {@link #VACUOUS_EXPECTED_FAILURE}, regardless of how the bridge classified its + * own failure. 794 of the corpus's errno expectations are + * {@code coord_transfm_outside_projection_domain} alone, and they are the whole + * {@code adams_hemi}/{@code guyou}/{@code peirce_q} population.
  2. + *
  3. Otherwise, does proj4j claim the definition is bad? + * {@link GieFailureKind#INVALID_DEFINITION} means, by its own documented contract, "PROJ 9.8.1 + * would refuse this too" — which is exactly what such a row asserts, so it is a genuine + * {@link #PASS_EXPECTED_FAILURE}. {@link GieFailureKind#MISSING_GRID} is genuine only under + * {@code invalid_op_file_not_found_or_invalid}. {@link GieFailureKind#NOT_IMPLEMENTED} is never + * genuine: it is a statement about proj4j, not about the definition.
  4. + *
+ * + *

The asymmetry between the two questions is deliberate. Question 1 lets the corpus + * overrule the bridge, because the corpus is upstream's own record of what PROJ does and the bridge's + * {@code INVALID_DEFINITION} is a claim the bridge makes about PROJ. Question 2 does not let the + * corpus promote a {@code NOT_IMPLEMENTED} into a pass, because "we cannot build this at all" refuses + * valid and invalid definitions alike and so cannot be evidence about either. + */ +public enum ExpectedFailureVerdict { + + /** + * A genuine demonstration of conformance: proj4j failed for the reason the row is about. Recorded + * as {@link AssertionOutcome#PASS} and counted in the headline. + */ + PASS_EXPECTED_FAILURE(AssertionOutcome.PASS), + + /** + * The row scored a success without measuring anything. Recorded as + * {@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE} and excluded from both the numerator and the + * denominator of the headline. + */ + VACUOUS_EXPECTED_FAILURE(AssertionOutcome.VACUOUS_EXPECTED_FAILURE), + + /** "Failed to fail": the operation was created and the transform returned a coordinate. */ + FAIL(AssertionOutcome.FAIL); + + /** The canonical errno prefix shared by every errno PROJ can only raise post-construction. */ + private static final String COORD_TRANSFM_PREFIX = "coord_transfm"; + + /** The one errno that is raised while building an operation from a grid file. */ + private static final String FILE_NOT_FOUND = "invalid_op_file_not_found_or_invalid"; + + /** Raised by {@code proj_trans}, not by {@code proj_create}: the object exists, the inverse does not. */ + private static final String NO_INVERSE = "no_inverse_op"; + + private final AssertionOutcome outcome; + + ExpectedFailureVerdict(AssertionOutcome outcome) { + this.outcome = outcome; + } + + /** @return how this verdict is tallied and recorded in the manifest. */ + public AssertionOutcome outcome() { + return outcome; + } + + /** @return {@code true} for {@link #VACUOUS_EXPECTED_FAILURE}. */ + public boolean isVacuous() { + return this == VACUOUS_EXPECTED_FAILURE; + } + + /** + * The verdict when the operation was created and the transform rejected the coordinate. + * + * @return {@link #PASS_EXPECTED_FAILURE}, always — proj4j and PROJ agreed about the domain, which + * is the conformance the row asserts + */ + public static ExpectedFailureVerdict ofTransformFailure() { + return PASS_EXPECTED_FAILURE; + } + + /** + * The verdict when the operation was created and the transform returned a coordinate. + * + * @return {@link #FAIL}, always + */ + public static ExpectedFailureVerdict ofFailureToFail() { + return FAIL; + } + + /** + * The verdict when the operation could not be created. + * + * @param canonicalErrno the errno the row named, already resolved through + * {@code errno_from_err_const}'s prefix match; {@code null} for a bare {@code expect failure} + * or for a name PROJ itself would not have recognised (which upstream degenerates to 9999, an + * errno no operation can report, so it carries no information either way) + * @param kind why the bridge could not build the operation; {@code null} when there was no + * operation to build at all, which is vacuous by the same argument + * @return the verdict + */ + public static ExpectedFailureVerdict ofConstructionFailure(String canonicalErrno, GieFailureKind kind) { + if (kind == null) { + return VACUOUS_EXPECTED_FAILURE; + } + if (assertsProjBuiltTheOperation(canonicalErrno)) { + return VACUOUS_EXPECTED_FAILURE; + } + switch (kind) { + case INVALID_DEFINITION: + return PASS_EXPECTED_FAILURE; + case MISSING_GRID: + return FILE_NOT_FOUND.equals(canonicalErrno) + ? PASS_EXPECTED_FAILURE + : VACUOUS_EXPECTED_FAILURE; + default: + // NOT_IMPLEMENTED, and every coordinate-level kind, which cannot honestly arise at + // construction time and is therefore not evidence about a definition either. + return VACUOUS_EXPECTED_FAILURE; + } + } + + /** + * Whether the errno the row named is one PROJ can only report from {@code proj_trans} — i.e. the row + * is a statement that {@code proj_create} succeeded. + * + * @param canonicalErrno a canonical errno name, or {@code null} + * @return {@code true} if the row asserts a built operation + */ + static boolean assertsProjBuiltTheOperation(String canonicalErrno) { + return canonicalErrno != null + && (canonicalErrno.startsWith(COORD_TRANSFM_PREFIX) || canonicalErrno.equals(NO_INVERSE)); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/FakeGieOperationFactory.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/FakeGieOperationFactory.java new file mode 100644 index 0000000..6ad7ca4 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/FakeGieOperationFactory.java @@ -0,0 +1,275 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.locationtech.proj4j.conformance.bridge.GieFailure; +import org.locationtech.proj4j.conformance.bridge.GieFailureKind; +import org.locationtech.proj4j.conformance.bridge.GieOperation; +import org.locationtech.proj4j.conformance.bridge.GieOperationFactory; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * A test double for {@link GieOperationFactory} with arithmetic simple enough to compute the expected + * outcome of a fixture by hand. + * + *

The definition language

+ * + *

An argument string is usable iff its first token is {@code fake}. Anything else fails to be + * created, which is how a fixture exercises {@code expect failure} against a broken definition. + * Recognised parameters: + * + * + * + * + * + * + * + * + * + * + * + * + *
Fake operation parameters
parametereffect
{@code shift=}forward adds {@code d} to x and y; inverse subtracts it
{@code lossy=}forward is {@code 2v + e}, inverse is {@code v / 2}, on x and y
{@code fail=always}every transform fails
{@code fail=always kind=}the kind that failing transform reports; defaults to {@link GieFailureKind#COORD_OUT_OF_DOMAIN}
{@code kind=}on an unusable definition, the kind the construction failure reports; defaults to {@link GieFailureKind#INVALID_DEFINITION}
{@code left=}, {@code right=}{@code P->left} / {@code P->right}; both default to {@link GieIoUnits#WHATEVER}
{@code inv}{@code P->inverted}
{@code latlon}{@code crs_dst_is_lat_lon_or_y_x}
+ * + *

{@code kind=} is what lets a fixture tell the two halves of the vacuity rule apart: a definition + * that fails as {@link GieFailureKind#INVALID_DEFINITION} is proj4j agreeing with PROJ that the + * definition is bad, whereas one that fails as {@link GieFailureKind#NOT_IMPLEMENTED} is proj4j not + * having the operator at all. gie scores both as passes; only one of them is one. See + * {@link ExpectedFailureVerdict}. + * + *

Both unit sides default to {@link GieIoUnits#WHATEVER} rather than to PROJ's + * {@code RADIANS}/{@code CLASSIC}, so a fixture's deviations are plain Euclidean distances in the + * coordinates' own units and can be checked with arithmetic instead of a geodesic solution. A fixture + * that wants the angular branch says {@code left=RADIANS} explicitly. + * + *

The call log

+ * + *

Every {@link GieOperation#transform} is appended to {@link #calls()} as {@code F} or {@code I}. + * That is what makes {@code proj_roundtrip}'s phasing directly assertable: the correct sequence for + * {@code n} trips in the forward direction is {@code F} followed by {@code n-1} repetitions of + * {@code IF} and then a final {@code I} — {@code n} of each, alternating, starting forward and ending + * inverse. + */ +final class FakeGieOperationFactory implements GieOperationFactory { + + private final List calls = new ArrayList(); + private final List created = new ArrayList(); + + @Override + public GieOperation create(String args) { + created.add(args); + return new Fake(args); + } + + @Override + public GieOperation createCrsToCrs(String sourceCrs, String targetCrs) { + String args = sourceCrs + " -> " + targetCrs; + created.add(args); + return new Fake(args); + } + + /** @return the transform log, {@code "F"} for forward and {@code "I"} for inverse. */ + List calls() { + return Collections.unmodifiableList(calls); + } + + /** @return the transform log as one string, e.g. {@code "FIFIFI"}. */ + String callSequence() { + StringBuilder out = new StringBuilder(calls.size()); + for (int i = 0; i < calls.size(); i++) { + out.append(calls.get(i)); + } + return out.toString(); + } + + /** @return every definition the runner asked for, in order. */ + List created() { + return Collections.unmodifiableList(created); + } + + /** Forgets the log. */ + void reset() { + calls.clear(); + created.clear(); + } + + /** The single failure type used throughout. */ + private static final class Failure implements GieFailure { + + private final GieFailureKind kind; + private final String message; + + Failure(GieFailureKind kind, String message) { + this.kind = kind; + this.message = message; + } + + @Override + public GieFailureKind kind() { + return kind; + } + + @Override + public String message() { + return message; + } + + @Override + public Throwable cause() { + return null; + } + } + + private final class Fake implements GieOperation { + + private final boolean usable; + private final GieFailure creationFailure; + private final double shift; + private final double lossy; + private final boolean alwaysFails; + private final GieFailureKind failureKind; + private final GieIoUnits left; + private final GieIoUnits right; + private final boolean inverted; + private final boolean latLon; + private GieFailure lastFailure; + + Fake(String args) { + String text = args == null ? "" : args; + this.usable = text.equals("fake") || text.startsWith("fake "); + this.failureKind = kind(token(text, "kind")); + this.creationFailure = usable + ? null + : new Failure( + failureKind == null ? GieFailureKind.INVALID_DEFINITION : failureKind, + "not a fake definition: \"" + text + "\""); + this.shift = number(text, "shift", 0); + this.lossy = number(text, "lossy", 0); + this.alwaysFails = "always".equals(token(text, "fail")); + this.left = units(token(text, "left")); + this.right = units(token(text, "right")); + this.inverted = hasFlag(text, "inv"); + this.latLon = hasFlag(text, "latlon"); + } + + @Override + public boolean isUsable() { + return usable; + } + + @Override + public GieFailure failure() { + return creationFailure; + } + + @Override + public GieIoUnits leftUnits() { + return left; + } + + @Override + public GieIoUnits rightUnits() { + return right; + } + + @Override + public boolean isInverted() { + return inverted; + } + + @Override + public boolean crsDstIsLatLonOrYX() { + return latLon; + } + + @Override + public double[] transform(double[] in, GieDirection dir) { + calls.add(dir == GieDirection.FORWARD ? "F" : "I"); + if (alwaysFails) { + lastFailure = new Failure( + failureKind == null ? GieFailureKind.COORD_OUT_OF_DOMAIN : failureKind, + "fail=always"); + return null; + } + lastFailure = null; + double[] out = in.clone(); + for (int i = 0; i < 2; i++) { + if (dir == GieDirection.FORWARD) { + out[i] = lossy == 0 ? out[i] + shift : 2 * out[i] + lossy; + } else { + out[i] = lossy == 0 ? out[i] - shift : out[i] / 2; + } + } + return out; + } + + @Override + public GieFailure lastFailure() { + return lastFailure; + } + } + + private static GieFailureKind kind(String name) { + if (name == null || name.isEmpty()) { + return null; + } + return GieFailureKind.valueOf(name); + } + + private static GieIoUnits units(String name) { + if (name == null || name.isEmpty()) { + return GieIoUnits.WHATEVER; + } + return GieIoUnits.valueOf(name); + } + + private static boolean hasFlag(String args, String flag) { + String[] tokens = args.split(" "); + for (int i = 0; i < tokens.length; i++) { + if (tokens[i].equals(flag)) { + return true; + } + } + return false; + } + + private static String token(String args, String key) { + String needle = key + "="; + String[] tokens = args.split(" "); + for (int i = 0; i < tokens.length; i++) { + if (tokens[i].startsWith(needle)) { + return tokens[i].substring(needle.length()); + } + } + return null; + } + + private static double number(String args, String key, double fallback) { + String raw = token(args, key); + if (raw == null || raw.isEmpty()) { + return fallback; + } + try { + return Double.parseDouble(raw); + } catch (NumberFormatException e) { + return fallback; + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieAssertionResult.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieAssertionResult.java new file mode 100644 index 0000000..6f5a0c1 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieAssertionResult.java @@ -0,0 +1,173 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import org.locationtech.proj4j.conformance.manifest.AssertionKey; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.manifest.ObservedAssertion; +import org.locationtech.proj4j.conformance.parse.GieVerb; + +/** + * One evaluated {@code expect} or {@code roundtrip}: its key, its outcome, and enough context to + * diagnose it without opening the corpus file. + * + *

Distinct from {@link ObservedAssertion} on purpose. That type is the diffable record — key, + * outcome, one line of detail — and is deliberately ignorant of {@code .gie} syntax. This one carries + * the source line, the verb and the governing operation definition, which is what a JUnit display + * name needs and what nobody wants serialised into the manifest. + * + *

Immutable. + */ +public final class GieAssertionResult { + + /** How much of an operation definition a display name shows before eliding. */ + static final int OPERATION_DISPLAY_LIMIT = 90; + + private final AssertionKey key; + private final AssertionOutcome outcome; + private final String detail; + private final GieVerb verb; + private final String assertionArgs; + private final String operation; + private final int line; + private final ExpectedFailureVerdict expectedFailureVerdict; + + GieAssertionResult( + AssertionKey key, + AssertionOutcome outcome, + String detail, + GieVerb verb, + String assertionArgs, + String operation, + int line, + ExpectedFailureVerdict expectedFailureVerdict) { + if (key == null || outcome == null || verb == null) { + throw new IllegalArgumentException("key, outcome and verb are all required"); + } + if (expectedFailureVerdict != null && expectedFailureVerdict.outcome() != outcome) { + throw new IllegalArgumentException( + "verdict " + expectedFailureVerdict + " does not tally as " + outcome); + } + if (outcome == AssertionOutcome.VACUOUS_EXPECTED_FAILURE && expectedFailureVerdict == null) { + throw new IllegalArgumentException( + "a VACUOUS_EXPECTED_FAILURE can only arise from an `expect failure` row, so it must" + + " carry the verdict that produced it: " + key); + } + this.key = key; + this.outcome = outcome; + this.detail = ObservedAssertion.flatten(detail == null ? "" : detail); + this.verb = verb; + this.assertionArgs = assertionArgs == null ? "" : assertionArgs; + this.operation = operation == null ? "" : operation; + this.line = line; + this.expectedFailureVerdict = expectedFailureVerdict; + } + + /** @return the manifest key. */ + public AssertionKey key() { + return key; + } + + /** @return PASS, FAIL, SKIP or VACUOUS_EXPECTED_FAILURE. */ + public AssertionOutcome outcome() { + return outcome; + } + + /** + * The three-way verdict, for an {@code expect failure} row only. + * + *

Carried alongside the outcome rather than derived from it, because + * {@link ExpectedFailureVerdict#PASS_EXPECTED_FAILURE} and an ordinary coordinate comparison are + * both {@link AssertionOutcome#PASS} and a report has to be able to say how many of the corpus's + * 1,187 {@code expect failure} rows are genuinely passing rather than merely counted. + * + * @return the verdict, or {@code null} if this assertion was not an {@code expect failure} + */ + public ExpectedFailureVerdict expectedFailureVerdict() { + return expectedFailureVerdict; + } + + /** @return {@code true} if this was an {@code expect failure} row. */ + public boolean isExpectedFailureRow() { + return expectedFailureVerdict != null; + } + + /** @return a one-line explanation; {@code ""} for an unremarkable pass. */ + public String detail() { + return detail; + } + + /** @return {@link GieVerb#EXPECT} or {@link GieVerb#ROUNDTRIP}. */ + public GieVerb verb() { + return verb; + } + + /** @return the assertion's normalised argument text, e.g. {@code "failure errno invalid_op"}. */ + public String assertionArgs() { + return assertionArgs; + } + + /** @return the governing operation definition, normalised; {@code ""} if there was none. */ + public String operation() { + return operation; + } + + /** @return the 1-based source line of the assertion's verb. */ + public int line() { + return line; + } + + /** @return the diffable record for {@link org.locationtech.proj4j.conformance.manifest.ObservedRun}. */ + public ObservedAssertion observed() { + return ObservedAssertion.of(key, outcome, detail); + } + + /** + * A JUnit display name: {@code file:block:index} — the coordinates a manifest entry is keyed by — + * then the source line, the assertion as written, and the operation it is asserted against. + * + * @return the display name + */ + public String displayName() { + StringBuilder out = new StringBuilder(160); + out.append(key.filePath()) + .append(':') + .append(key.operationBlockIndex()) + .append(':') + .append(key.assertionIndex()) + .append(" (line ") + .append(line) + .append(") ") + .append(verb.token()); + if (!assertionArgs.isEmpty()) { + out.append(' ').append(assertionArgs); + } + out.append(" <- ").append(elide(operation, OPERATION_DISPLAY_LIMIT)); + return out.toString(); + } + + private static String elide(String text, int limit) { + if (text.length() <= limit) { + return text; + } + return text.substring(0, limit - 3) + "..."; + } + + @Override + public String toString() { + return outcome + " " + displayName() + (detail.isEmpty() ? "" : " -- " + detail); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieConformanceTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieConformanceTest.java new file mode 100644 index 0000000..369e707 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieConformanceTest.java @@ -0,0 +1,631 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.DynamicContainer; +import org.junit.jupiter.api.DynamicNode; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.TestFactory; +import org.junit.jupiter.api.function.Executable; +import org.locationtech.proj4j.conformance.bridge.GieFailure; +import org.locationtech.proj4j.conformance.bridge.GieFailureKind; +import org.locationtech.proj4j.conformance.bridge.GieOperation; +import org.locationtech.proj4j.conformance.bridge.GieOperationFactory; +import org.locationtech.proj4j.conformance.manifest.AssertionKey; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.manifest.BaselineRequirement; +import org.locationtech.proj4j.conformance.manifest.ConformanceDiff; +import org.locationtech.proj4j.conformance.manifest.CorpusIndex; +import org.locationtech.proj4j.conformance.manifest.DiffClassification; +import org.locationtech.proj4j.conformance.manifest.DiffEntry; +import org.locationtech.proj4j.conformance.manifest.DiffResult; +import org.locationtech.proj4j.conformance.manifest.ExpectedOutcomeManifest; +import org.locationtech.proj4j.conformance.manifest.ManifestRegenerator; +import org.locationtech.proj4j.conformance.manifest.ObservedRun; +import org.locationtech.proj4j.conformance.parse.GieFile; +import org.locationtech.proj4j.conformance.parse.GieLexer; +import org.locationtech.proj4j.conformance.report.ConformanceReport; + +/** + * The conformance sweep: runs every active {@code .gie} file, diffs the result against the checked-in + * expected-outcome manifest, and fails iff {@link DiffResult#shouldFailBuild()}. + * + *

Invocation

+ * + *
+ *   mvn install                                       # skipped: one aborted container, milliseconds
+ *   mvn -Pconformance verify                          # the gate
+ *   mvn -Pconformance verify -Dgie.regenerate=true    # accept the current state as the baseline
+ * 
+ * + *

The sweep is gated on {@code -Dgie.corpus.skip}, which {@code conformance/pom.xml} sets to + * {@code true} for a plain build and to {@code false} in the {@code conformance} profile. When skipped + * this factory emits a single aborted container rather than nothing at all, so "the corpus did not run" + * is visible in the surefire report instead of being indistinguishable from "the corpus is empty". + * + *

The baseline is a precondition, not an option

+ * + *

When the sweep runs and regeneration was not requested, both baseline files must exist or the run + * is a hard failure — see {@link BaselineRequirement}. They used to be optional: an absent manifest + * printed a line and became {@link ExpectedOutcomeManifest#empty()}, an absent index became + * {@link CorpusIndex#empty()}, and the consequence was that every one of the corpus's assertions + * classified as {@code NEW}, which does not fail the build. {@code REGRESSED}, + * {@code UNEXPECTED_PASS} and {@code DISAPPEARED} were then all necessarily zero and + * {@code mvn -Pconformance verify} passed regardless of how many assertions failed. A gate + * that reports success because it cannot see is worse than no gate, because it is quoted. + * + *

Why one dynamic test per assertion

+ * + *

7,923 assertions cannot be modelled as static {@code @Test} methods, and a single aggregate + * assertion would report "3,412 failures" with no way to see which. Each dynamic test is named + * {@code file:block:index} — the exact coordinates of a manifest key — plus the source line, the + * assertion as written, and the operation it is asserted against, so a CI failure is actionable + * without a local reproduction. + * + *

Only build-failing classifications actually fail. A {@code STILL_FAILING} assertion is + * aborted, i.e. reported as skipped, carrying its manifest reason: it must not count as a + * JUnit pass, because the manifest's whole purpose is to say it is not passing yet. Likewise an + * observed {@link AssertionOutcome#SKIP} or {@link AssertionOutcome#VACUOUS_EXPECTED_FAILURE} is + * aborted, never passed — see {@link AssertionOutcome}. A vacuous assertion is the one JUnit would + * most readily have shown green: upstream {@code gie} scores it a success, and there is nothing in the + * assertion itself to say otherwise. + * + *

Wiring the operation factory

+ * + *

The runner needs a {@link GieOperationFactory}. It is resolved, in order, from + * {@code -Dgie.operation.factory=}, then from a short list of conventional bridge class names, + * and finally from {@link UnavailableGieOperationFactory} — which is announced loudly, because a sweep + * against it produces no number worth quoting. + */ +class GieConformanceTest { + + /** Set to {@code true} by {@code conformance/pom.xml} for a plain build. */ + static final String SKIP_PROPERTY = "gie.corpus.skip"; + + /** Names a {@link GieOperationFactory} implementation with a public no-argument constructor. */ + static final String FACTORY_PROPERTY = "gie.operation.factory"; + + /** Where the human report, the machine summary and the diff are written. */ + static final Path OUTPUT_DIRECTORY = Paths.get("target", "conformance"); + + /** The checked-in baseline, relative to {@code src/test/resources}. */ + static final String MANIFEST_FILE = BaselineRequirement.MANIFEST_FILE; + + /** The checked-in corpus index, which must be regenerated with the manifest. */ + static final String CORPUS_INDEX_FILE = BaselineRequirement.CORPUS_INDEX_FILE; + + /** + * Conventional bridge factory names, tried in order. The bridge package is written independently + * of this class; naming it here rather than importing it keeps the two changes decoupled. + * + *

A name that does not resolve, or resolves to something that is not a + * {@link GieOperationFactory}, is skipped rather than reported: the list is a convention, not a + * contract, and the fallback announces itself loudly enough that a silently-unwired run cannot be + * mistaken for a real one. + */ + private static final String[] CANDIDATE_FACTORIES = { + "org.locationtech.proj4j.conformance.bridge.Proj4jGieOperationFactory", + "org.locationtech.proj4j.conformance.bridge.GieOperationFactories", + "org.locationtech.proj4j.conformance.bridge.DefaultGieOperationFactory", + }; + + private static final Charset UTF_8 = Charset.forName("UTF-8"); + + @TestFactory + List gieAndGigsCorpus() throws IOException { + if (isSkipRequested()) { + return Collections.singletonList((DynamicNode) DynamicContainer.dynamicContainer( + "gie/GIGS corpus sweep (not run)", + Collections.singletonList(DynamicTest.dynamicTest( + "disabled by -D" + SKIP_PROPERTY + "=true; use `mvn -Pconformance verify`", + new Executable() { + @Override + public void execute() { + Assumptions.abort("corpus sweep disabled by -D" + SKIP_PROPERTY + "=true"); + } + })))); + } + + // Checked before the sweep rather than after it: a run with no baseline cannot be gated, the + // remedy is a different command, and there is no reason to spend the sweep to say so. The + // regeneration path is exempt -- it is what creates the files. + if (!ManifestRegenerator.isRegenerationRequested()) { + final String diagnostic = BaselineRequirement.diagnosePresence( + resource(MANIFEST_FILE) != null, resource(CORPUS_INDEX_FILE) != null, searchedIn()); + if (!diagnostic.isEmpty()) { + System.out.println(); + System.out.print(diagnostic); + System.out.println(); + return Collections.singletonList((DynamicNode) DynamicTest.dynamicTest( + "conformance baseline is absent: nothing was gated", new Executable() { + @Override + public void execute() { + throw new AssertionError(diagnostic); + } + })); + } + } + + GieOperationFactory factory = resolveFactory(); + GieRunner runner = GieRunner.using(factory, GieGridAvailability.OnClasspath.INSTANCE); + + List files = GieCorpus.activeFiles(); + if (files.isEmpty()) { + return Collections.singletonList((DynamicNode) DynamicTest.dynamicTest( + "corpus not vendored under src/test/resources/{gie,gigs}", new Executable() { + @Override + public void execute() { + Assumptions.abort("no .gie files found; run conformance/sync-upstream.sh"); + } + })); + } + + List fileResults = new ArrayList(files.size()); + ObservedRun.Builder builder = ObservedRun.builder(); + int lexFailures = 0; + StringBuilder lexErrors = new StringBuilder(); + for (int i = 0; i < files.size(); i++) { + GieCorpus.Entry entry = files.get(i); + GieFileResult result; + try { + GieFile lexed = GieLexer.lex(entry.file()); + result = runner.run(entry.corpusPath(), lexed); + } catch (RuntimeException e) { + lexFailures++; + lexErrors.append(entry.corpusPath()).append(": ").append(e).append('\n'); + continue; + } + fileResults.add(result); + result.recordInto(builder); + } + ObservedRun run = builder.build(); + + if (ManifestRegenerator.isRegenerationRequested()) { + return regenerate(run, fileResults, factory); + } + + ExpectedOutcomeManifest manifest = loadManifest(); + CorpusIndex index = loadCorpusIndex(); + // An index that was found but covers nothing gates nothing, for exactly the reason an absent + // one does: every observed key would be NEW. + BaselineRequirement.requireCoverage(index.size(), run.total(), searchedIn()); + DiffResult diff = ConformanceDiff.compare(manifest, run, index); + + String report = ConformanceReport.render( + run, diff, ConformanceReport.TOTAL_ASSERTIONS, ConformanceReport.EXCLUDED_OUT_OF_BLOCK); + String expectFailures = expectFailureTable(fileResults); + System.out.println(); + System.out.println("=== gie/GIGS conformance ==="); + System.out.println("operation factory: " + factory); + System.out.println("files: " + fileResults.size() + " of " + files.size() + + (lexFailures > 0 ? " (" + lexFailures + " failed to lex)" : "")); + System.out.println(); + System.out.print(report); + System.out.println(); + System.out.print(expectFailures); + if (lexFailures > 0) { + System.out.println(); + System.out.println("LEXER FAILURES"); + System.out.print(lexErrors); + } + System.out.println(); + + write("report.txt", report); + write("summary.tsv", ConformanceReport.machineSummary( + run, diff, ConformanceReport.TOTAL_ASSERTIONS, ConformanceReport.EXCLUDED_OUT_OF_BLOCK)); + write("differences.txt", ConformanceReport.differences(diff)); + write("expect-failures.tsv", expectFailures); + + return nodes(fileResults, run, diff, lexFailures, lexErrors.toString()); + } + + // ------------------------------------------------------------------------------ expect failure split + + /** + * The three-way split of every {@code expect failure} row, per file, as TSV. + * + *

This is the table that answers "is the headline honest": {@code genuine} rows are real + * conformance, {@code vacuous} rows are the {@code adams_hemi} trap, and {@code fail} rows are + * "failed to fail". A file whose {@code vacuous} count equals its whole {@code expect failure} + * population has demonstrated nothing about that projection. + * + *

Rendered here rather than in {@code report/} because it is derived from + * {@link GieAssertionResult#expectedFailureVerdict()}, which is runner state deliberately kept out + * of {@link ObservedRun} — the diffable record carries outcomes, not the reasoning behind them. + */ + static String expectFailureTable(List fileResults) { + StringBuilder out = new StringBuilder(512); + out.append("# expect failure rows, split three ways. genuine = PASS_EXPECTED_FAILURE" + + " (operation built, coordinate or definition rejected as the row asserts);" + + " vacuous = VACUOUS_EXPECTED_FAILURE (operation could not be built, nothing" + + " demonstrated, excluded from the headline); fail = failed to fail.\n"); + out.append("file\texpect_failure_rows\tgenuine\tvacuous\tfail\n"); + int totalRows = 0; + int totalGenuine = 0; + int totalVacuous = 0; + int totalFail = 0; + for (int i = 0; i < fileResults.size(); i++) { + GieFileResult file = fileResults.get(i); + int rows = file.expectedFailureRows(); + if (rows == 0) { + continue; + } + int genuine = file.count(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE); + int vacuous = file.count(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE); + int failed = file.count(ExpectedFailureVerdict.FAIL); + totalRows += rows; + totalGenuine += genuine; + totalVacuous += vacuous; + totalFail += failed; + out.append(file.filePath()) + .append('\t') + .append(rows) + .append('\t') + .append(genuine) + .append('\t') + .append(vacuous) + .append('\t') + .append(failed) + .append('\n'); + } + out.append("TOTAL\t") + .append(totalRows) + .append('\t') + .append(totalGenuine) + .append('\t') + .append(totalVacuous) + .append('\t') + .append(totalFail) + .append('\n'); + return out.toString(); + } + + // ------------------------------------------------------------------------------------ dynamic nodes + + private static List nodes( + List fileResults, + ObservedRun run, + DiffResult diff, + final int lexFailures, + final String lexErrors) { + Map byKey = new LinkedHashMap(); + List entries = diff.entries(); + for (int i = 0; i < entries.size(); i++) { + byKey.put(entries.get(i).key(), entries.get(i)); + } + + List out = new ArrayList(fileResults.size() + 1); + for (int i = 0; i < fileResults.size(); i++) { + GieFileResult file = fileResults.get(i); + List tests = new ArrayList(file.total()); + List assertions = file.assertions(); + for (int j = 0; j < assertions.size(); j++) { + tests.add(assertionTest(assertions.get(j), byKey.get(assertions.get(j).key()))); + } + tests.add(leakCheck(file)); + out.add(DynamicContainer.dynamicContainer(file.summary(), tests)); + } + out.add(gate(run, diff, lexFailures, lexErrors)); + return out; + } + + private static DynamicTest assertionTest(final GieAssertionResult assertion, final DiffEntry entry) { + return DynamicTest.dynamicTest(assertion.displayName(), new Executable() { + @Override + public void execute() { + if (entry == null) { + // The diff covers the union of the manifest, the index and the run, so a key that + // was observed cannot be missing from it. If it ever is, the key scheme has + // collided and every count is suspect. + throw new AssertionError("assertion is absent from the diff: " + assertion.key()); + } + if (entry.failsBuild()) { + throw new AssertionError(entry.classification() + ": " + assertion.detail() + + (entry.reason().isEmpty() ? "" : " | manifest reason: " + entry.reason())); + } + if (assertion.outcome() == AssertionOutcome.PASS) { + return; + } + // Not a pass and not build-failing: known work, an unmeasured assertion, or a brand-new + // one. Aborted, so that JUnit never records it as a pass -- which for a + // VACUOUS_EXPECTED_FAILURE is the whole point, since gie would have. + Assumptions.abort(entry.classification() + " (" + assertion.outcome() + "): " + + (entry.reason().isEmpty() ? assertion.detail() : entry.reason())); + } + }); + } + + private static DynamicTest leakCheck(final GieFileResult file) { + return DynamicTest.dynamicTest( + file.filePath() + " :: crs_dst_is_lat_lon_or_y_x does not leak into a plain operation", + new Executable() { + @Override + public void execute() { + if (file.leakedCrsDstFlagAssertions() != 0) { + throw new AssertionError(file.leakedCrsDstFlagAssertions() + + " assertions in " + file.filePath() + " were measured with the" + + " lat/lon swap still set from an earlier crs_src/crs_dst pair." + + " gie leaks that flag on purpose; no 9.8.1 file mixes the styles," + + " so this is either a re-vendor or a lexer defect. The swap turns" + + " a 55.8 km deviation into a 110.6 km one, so the resulting" + + " failures will look like a projection bug and are not."); + } + } + }); + } + + private static DynamicContainer gate( + final ObservedRun run, + final DiffResult diff, + final int lexFailures, + final String lexErrors) { + List tests = new ArrayList(5); + tests.add(DynamicTest.dynamicTest( + ConformanceReport.headline(run), new Executable() { + @Override + public void execute() { + // The headline is the artefact; there is nothing to assert about it beyond its + // having been produced. Failures are asserted by the classification tests. + } + })); + tests.add(classificationTest(diff, DiffClassification.REGRESSED)); + tests.add(classificationTest(diff, DiffClassification.UNEXPECTED_PASS)); + tests.add(classificationTest(diff, DiffClassification.DISAPPEARED)); + tests.add(DynamicTest.dynamicTest("every corpus file lexes", new Executable() { + @Override + public void execute() { + if (lexFailures > 0) { + throw new AssertionError(lexFailures + " corpus file(s) failed to lex:\n" + lexErrors); + } + } + })); + tests.add(DynamicTest.dynamicTest("conformance gate", new Executable() { + @Override + public void execute() { + if (diff.shouldFailBuild()) { + throw new AssertionError(diff.failureSummary() + + "\n\n" + ConformanceReport.differences(diff) + + "\nFull report: " + OUTPUT_DIRECTORY.resolve("report.txt").toAbsolutePath()); + } + } + })); + return DynamicContainer.dynamicContainer("conformance gate", tests); + } + + private static DynamicTest classificationTest( + final DiffResult diff, final DiffClassification classification) { + return DynamicTest.dynamicTest("no " + classification + " assertions", new Executable() { + @Override + public void execute() { + int n = diff.count(classification); + if (n > 0) { + StringBuilder message = new StringBuilder(); + message.append(n).append(' ').append(classification).append(":\n"); + List entries = diff.entries(classification); + int shown = Math.min(entries.size(), 40); + for (int i = 0; i < shown; i++) { + message.append(" ").append(entries.get(i)).append('\n'); + } + if (shown < entries.size()) { + message.append(" ... ").append(entries.size() - shown).append(" more\n"); + } + throw new AssertionError(message.toString()); + } + } + }); + } + + // ------------------------------------------------------------------------------------ regeneration + + private static List regenerate( + final ObservedRun run, List fileResults, GieOperationFactory factory) + throws IOException { + Path resources = resourcesDirectory(); + if (resources == null) { + throw new IOException("cannot locate src/test/resources to write the manifest into"); + } + final Path manifestPath = resources.resolve(MANIFEST_FILE); + final Path indexPath = resources.resolve(CORPUS_INDEX_FILE); + + ExpectedOutcomeManifest previous = + Files.exists(manifestPath) ? ExpectedOutcomeManifest.load(manifestPath) : ExpectedOutcomeManifest.empty(); + // Both files are written together: the manifest holds only non-passes, so without the index a + // passing key's absence is not evidence of anything and the next diff invents NEW/DISAPPEARED + // entries out of nothing. Commit them together too. + final ExpectedOutcomeManifest regenerated = + ManifestRegenerator.regenerateInPlace(manifestPath, indexPath, run); + + String report = ConformanceReport.render( + run, + ConformanceDiff.compare(previous, run, CorpusIndex.ofRun(run)), + ConformanceReport.TOTAL_ASSERTIONS, + ConformanceReport.EXCLUDED_OUT_OF_BLOCK); + write("report.txt", report); + write("summary.tsv", ConformanceReport.machineSummary( + run, + ConformanceDiff.compare(regenerated, run, CorpusIndex.ofRun(run)), + ConformanceReport.TOTAL_ASSERTIONS, + ConformanceReport.EXCLUDED_OUT_OF_BLOCK)); + write("expect-failures.tsv", expectFailureTable(fileResults)); + + final String change = ManifestRegenerator.describeChange(previous, regenerated); + System.out.println(); + System.out.println("=== gie/GIGS conformance: REGENERATED ==="); + System.out.println("operation factory: " + factory); + System.out.println(ConformanceReport.headline(run)); + System.out.println(change); + System.out.println("wrote " + manifestPath.toAbsolutePath()); + System.out.println("wrote " + indexPath.toAbsolutePath() + " (" + run.total() + " keys)"); + System.out.println("Commit both files together."); + System.out.println(); + System.out.print(ConformanceReport.perFileTable(run)); + System.out.println(); + + List out = new ArrayList(2); + out.add(DynamicTest.dynamicTest( + "regenerated: " + ConformanceReport.headline(run) + + "; " + change, + new Executable() { + @Override + public void execute() { + // Regeneration is not a gate; it succeeds if it wrote the files. + if (!Files.exists(manifestPath) || !Files.exists(indexPath)) { + throw new AssertionError("regeneration did not write both files"); + } + } + })); + out.add(DynamicTest.dynamicTest( + "regeneration is not a gate: " + fileResults.size() + " files swept", + new Executable() { + @Override + public void execute() { + Assumptions.abort("-Dgie.regenerate=true was passed, so nothing was gated"); + } + })); + return out; + } + + // ------------------------------------------------------------------------------------ resources + + static boolean isSkipRequested() { + return Boolean.parseBoolean(System.getProperty(SKIP_PROPERTY, "true")); + } + + /** + * @return the checked-in manifest + * @throws BaselineRequirement.MissingBaselineException if either baseline file is absent + */ + private static ExpectedOutcomeManifest loadManifest() throws IOException { + Path onDisk = resource(MANIFEST_FILE); + // Re-checked here, not only at the top of the sweep, so that a future caller of this method + // cannot reintroduce the silent-empty-baseline path by skipping the early check. + BaselineRequirement.requirePresence(onDisk != null, resource(CORPUS_INDEX_FILE) != null, searchedIn()); + return ExpectedOutcomeManifest.load(onDisk); + } + + /** + * @return the checked-in corpus index + * @throws BaselineRequirement.MissingBaselineException if either baseline file is absent + */ + private static CorpusIndex loadCorpusIndex() throws IOException { + Path onDisk = resource(CORPUS_INDEX_FILE); + BaselineRequirement.requirePresence(resource(MANIFEST_FILE) != null, onDisk != null, searchedIn()); + return CorpusIndex.load(onDisk); + } + + /** @return where {@link #resource(String)} looks, for a diagnostic message. */ + private static String searchedIn() { + Path resources = resourcesDirectory(); + return "the test classpath, and " + + (resources == null + ? "no src/test/resources directory relative to " + Paths.get("").toAbsolutePath() + : resources.toAbsolutePath().toString()); + } + + /** The file on the test classpath, or in the source tree, or {@code null}. */ + private static Path resource(String name) { + try { + java.net.URL url = GieConformanceTest.class.getResource("/" + name); + if (url != null && "file".equals(url.getProtocol())) { + Path p = Paths.get(url.toURI()); + if (Files.isRegularFile(p)) { + return p; + } + } + } catch (RuntimeException ignored) { + // fall through + } catch (java.net.URISyntaxException ignored) { + // fall through + } + Path resources = resourcesDirectory(); + if (resources != null && Files.isRegularFile(resources.resolve(name))) { + return resources.resolve(name); + } + return null; + } + + private static Path resourcesDirectory() { + String[] candidates = {"src/test/resources", "conformance/src/test/resources"}; + for (int i = 0; i < candidates.length; i++) { + Path p = Paths.get(candidates[i]); + if (Files.isDirectory(p)) { + return p; + } + } + return null; + } + + private static void write(String name, String content) throws IOException { + Files.createDirectories(OUTPUT_DIRECTORY); + Files.write(OUTPUT_DIRECTORY.resolve(name), content.getBytes(UTF_8)); + } + + // ------------------------------------------------------------------------------------ factory + + private static GieOperationFactory resolveFactory() { + String named = System.getProperty(FACTORY_PROPERTY); + if (named != null && !named.trim().isEmpty()) { + GieOperationFactory f = instantiate(named.trim()); + if (f == null) { + throw new IllegalStateException( + "-D" + FACTORY_PROPERTY + "=" + named + " could not be instantiated"); + } + return f; + } + for (int i = 0; i < CANDIDATE_FACTORIES.length; i++) { + GieOperationFactory f = instantiate(CANDIDATE_FACTORIES[i]); + if (f != null) { + return f; + } + } + System.out.println(); + System.out.println("############################################################"); + System.out.println("# No GieOperationFactory is wired. #"); + System.out.println("# The sweep will run the state machine but create nothing, #"); + System.out.println("# so the resulting number is NOT a conformance number. #"); + System.out.println("# Wire one with -D" + FACTORY_PROPERTY + "=. #"); + System.out.println("############################################################"); + System.out.println(); + return UnavailableGieOperationFactory.INSTANCE; + } + + private static GieOperationFactory instantiate(String className) { + try { + Class type = Class.forName(className); + if (!GieOperationFactory.class.isAssignableFrom(type)) { + return null; + } + return (GieOperationFactory) type.getDeclaredConstructor().newInstance(); + } catch (ClassNotFoundException e) { + return null; + } catch (ReflectiveOperationException e) { + return null; + } catch (RuntimeException e) { + return null; + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieCorpus.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieCorpus.java new file mode 100644 index 0000000..79b4a12 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieCorpus.java @@ -0,0 +1,150 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import java.io.IOException; +import java.net.URL; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * Locates the vendored corpus: {@code gie/*.gie} and {@code gigs/*.gie} on the test classpath. + * + *

{@code *.gie.failing} is excluded

+ * + *

Ten GIGS files are quarantined upstream with a {@code .failing} suffix and are not part of the + * 8,017-assertion metric. The glob {@code *.gie} excludes them by construction rather than by a + * filter, so there is no predicate to get backwards. Nine of the ten fail for a lexical reason + * (missing {@code \} continuations, so their {@code +step} lines are swallowed as comments) and one, + * {@code 5110}, is a genuine numerical failure; none of that is this class's problem, but running them + * would inflate the denominator with tests upstream itself does not run. + * + *

Note that {@code gigs/5101.4-jhs-etmerc.gie} is not quarantined and must stay in the + * active set even though {@code gigs/5101.4-jhs.gie.failing} is. + * + *

Stateless; not instantiable. + */ +public final class GieCorpus { + + /** The two corpus directories, in the order the report lists them. */ + public static final String[] DIRECTORIES = {"gie", "gigs"}; + + private GieCorpus() { + throw new AssertionError("no instances"); + } + + /** + * One corpus file: its {@code gie/builtins.gie}-style relative path and where it actually is. + * + *

Immutable. + */ + public static final class Entry { + + private final String corpusPath; + private final Path file; + + Entry(String corpusPath, Path file) { + this.corpusPath = corpusPath; + this.file = file; + } + + /** @return the corpus-relative path used in every {@link org.locationtech.proj4j.conformance.manifest.AssertionKey}. */ + public String corpusPath() { + return corpusPath; + } + + /** @return the file on disk. */ + public Path file() { + return file; + } + + @Override + public String toString() { + return corpusPath; + } + } + + /** + * Every active corpus file, ordered by corpus path. + * + * @return the entries; empty if the corpus has not been vendored + * @throws IOException if a directory cannot be listed + */ + public static List activeFiles() throws IOException { + List out = new ArrayList(); + for (int i = 0; i < DIRECTORIES.length; i++) { + String name = DIRECTORIES[i]; + Path dir = directory(name); + if (dir == null) { + continue; + } + DirectoryStream stream = Files.newDirectoryStream(dir, "*.gie"); + try { + for (Path p : stream) { + // "*.gie" already excludes the quarantined "*.gie.failing". + out.add(new Entry(name + "/" + p.getFileName().toString(), p)); + } + } finally { + stream.close(); + } + } + Collections.sort(out, new Comparator() { + @Override + public int compare(Entry a, Entry b) { + return a.corpusPath.compareTo(b.corpusPath); + } + }); + return out; + } + + /** + * Resolves one corpus directory, preferring the test classpath and falling back to the source + * tree so this works from an IDE that has not copied resources and from either working directory + * Maven might use. + * + * @param name {@code "gie"} or {@code "gigs"} + * @return the directory, or {@code null} if it is nowhere to be found + */ + public static Path directory(String name) { + try { + URL url = GieCorpus.class.getResource("/" + name); + if (url != null && "file".equals(url.getProtocol())) { + Path p = Paths.get(url.toURI()); + if (Files.isDirectory(p)) { + return p; + } + } + } catch (RuntimeException ignored) { + // fall through to the source tree + } catch (java.net.URISyntaxException ignored) { + // fall through to the source tree + } + String[] prefixes = {"src/test/resources", "conformance/src/test/resources"}; + for (int i = 0; i < prefixes.length; i++) { + Path p = Paths.get(prefixes[i]).resolve(name); + if (Files.isDirectory(p)) { + return p; + } + } + return null; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieEllipsoidResolver.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieEllipsoidResolver.java new file mode 100644 index 0000000..e4b38c2 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieEllipsoidResolver.java @@ -0,0 +1,258 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.gie.GieComparator; + +/** + * Picks the ellipsoid gie's {@code proj_lpz_dist} would measure on, from an operation's argument + * string. + * + *

Why the runner has to do this at all

+ * + *

{@code proj_lp_dist} calls {@code geod_inverse(P->geod, ...)}, and {@code P->geod} was + * initialised from {@code P->a} and {@code P->f} — so the metric depends on the operation's own + * ellipsoid. Two defaults are in play and they are not the same one + * ({@code reference/gie-comparator.md}, trap 4): + * + *

    + *
  • a bare {@code operation +proj=X} naming no ellipsoid gets WGS84 + * ({@code 9.8.1:src/init.cpp:576-581});
  • + *
  • a {@code +proj=pipeline} with no global {@code +ellps} gets GRS80 + * ({@code 9.8.1:src/pipeline.cpp:338-351}).
  • + *
+ * + *

How much precision this actually needs

+ * + *

Less than it looks. The comparator measures the geodesic distance between two coordinates that + * are, in a passing test, millimetres apart; to first order that distance is proportional to the + * ellipsoid's local radius of curvature, so an error in {@code a} or {@code f} is a + * relative error in the deviation, not an additive one. Confusing GRS80 with WGS84 (a + * flattening difference of 2e-8 relative) perturbs a 1 mm deviation by about 2e-8 mm. Even + * confusing WGS84 with Clarke 1866 — a 0.5% difference in {@code a} — perturbs it by 0.5%, which + * changes no verdict in a corpus whose tightest tolerance is 10 nm against deviations that are + * either ~0 or grossly over. + * + *

That is why this class reads the argument text rather than asking proj4j to parse it: full + * fidelity to {@code pj_ellipsoid}'s first-match-wins and modifier rules + * ({@code reference/param-semantics.md}) buys nothing here, while a second implementation of those + * rules living in test scope would be a liability. What is reproduced is the part that is not a + * relative error, namely which default applies, and explicit shape parameters, which are + * the cases the corpus uses on purpose ({@code gie/ellipsoid.gie} is built out of them). + * + *

Stateless; not instantiable. + */ +public final class GieEllipsoidResolver { + + /** {@code +proj=pipeline} with no global ellipsoid: GRS80. */ + private static final GieComparator PIPELINE_DEFAULT = GieComparator.grs80(); + + /** Everything else with no ellipsoid: WGS84. */ + private static final GieComparator PLAIN_DEFAULT = GieComparator.wgs84(); + + private GieEllipsoidResolver() { + throw new AssertionError("no instances"); + } + + /** + * @param args a {@code pj_shrink}-normalised operation argument string, e.g. + * {@code "proj=merc a=6400000 rf=297"}; may be {@code null} or empty + * @return the comparator to measure this operation's angular deviations with; never + * {@code null} + */ + public static GieComparator comparatorFor(String args) { + String globals = globalParameters(args); + boolean pipeline = isPipeline(globals); + + Double r = value(globals, "R"); + if (r != null && r > 0) { + // +R makes a sphere; f = 0 exactly. + return GieComparator.forEllipsoid(r.doubleValue(), 0.0); + } + + Ellipsoid named = named(globals); + + Double a = value(globals, "a"); + double equatorRadius; + if (a != null && a > 0) { + equatorRadius = a.doubleValue(); + } else if (named != null) { + equatorRadius = named.getEquatorRadius(); + } else { + equatorRadius = 6378137.0; + } + + Double f = flattening(globals); + if (f == null && named != null) { + // Ellipsoid keeps a and b, not a and rf, so recovering f costs a sqrt. Immaterial: see + // the class comment on relative error. + f = Double.valueOf(1.0 - named.getB() / named.getEquatorRadius()); + } + + if (f == null && (a == null || a <= 0)) { + // Nothing said about the shape at all: take the whole default, with its exact + // flattening literal rather than one reconstructed from a pole radius. + return pipeline ? PIPELINE_DEFAULT : PLAIN_DEFAULT; + } + if (f == null) { + // +a alone: PROJ leaves the flattening at the default's. + f = Double.valueOf(pipeline ? 1.0 / 298.257222101 : 1.0 / 298.257223563); + } + + // gie/ellipsoid.gie exists to be rejected: it contains "+a=-1", "+R=0", "+a=1 +es=-1" and + // "+R_a +a=2 +f=2". PROJ refuses each of them, so the operation will not be created and no + // geodesic will ever be asked for — but GeographicLib validates in its constructor + // ("Polar semi-axis is not positive" for f >= 1), so building one eagerly would abort the whole + // file and lose its 40 legitimate assertions along with the 4 broken ones. Fall back instead. + GieComparator fallback = pipeline ? PIPELINE_DEFAULT : PLAIN_DEFAULT; + if (!isFinite(equatorRadius) || equatorRadius <= 0 + || !isFinite(f.doubleValue()) || f.doubleValue() >= 1) { + return fallback; + } + try { + return GieComparator.forEllipsoid(equatorRadius, f.doubleValue()); + } catch (RuntimeException e) { + // Belt and braces: GeographicLib's validation is not fully documented, and a corpus + // re-vendor must never be able to turn a bad ellipsoid into a lost file. + return fallback; + } + } + + /** + * The tokens before the first {@code step}, which for a pipeline are its global parameters and + * for anything else are the whole definition. + * + * @param args a shrunken argument string, may be {@code null} + * @return the leading globals, space separated; never {@code null} + */ + static String globalParameters(String args) { + if (args == null) { + return ""; + } + StringBuilder out = new StringBuilder(args.length()); + int i = 0; + int n = args.length(); + while (i < n) { + while (i < n && args.charAt(i) == ' ') { + i++; + } + int start = i; + while (i < n && args.charAt(i) != ' ') { + i++; + } + if (start == i) { + break; + } + String token = args.substring(start, i); + if ("step".equals(token)) { + break; + } + if (out.length() > 0) { + out.append(' '); + } + out.append(token); + } + return out.toString(); + } + + private static boolean isPipeline(String globals) { + return "pipeline".equals(text(globals, "proj")); + } + + private static Ellipsoid named(String globals) { + String name = text(globals, "ellps"); + if (name == null) { + return null; + } + for (int i = 0; i < Ellipsoid.ellipsoids.length; i++) { + if (name.equals(Ellipsoid.ellipsoids[i].getShortName())) { + return Ellipsoid.ellipsoids[i]; + } + } + return null; + } + + /** {@code rf}, {@code f}, {@code b}, {@code es} and {@code e}, in that precedence. */ + private static Double flattening(String globals) { + Double rf = value(globals, "rf"); + if (rf != null && rf.doubleValue() != 0) { + return Double.valueOf(1.0 / rf.doubleValue()); + } + Double f = value(globals, "f"); + if (f != null) { + return f; + } + Double b = value(globals, "b"); + Double a = value(globals, "a"); + if (b != null && a != null && a.doubleValue() != 0) { + return Double.valueOf(1.0 - b.doubleValue() / a.doubleValue()); + } + Double es = value(globals, "es"); + if (es != null && es.doubleValue() <= 1) { + return Double.valueOf(1.0 - Math.sqrt(1.0 - es.doubleValue())); + } + Double e = value(globals, "e"); + if (e != null && Math.abs(e.doubleValue()) <= 1) { + double esq = e.doubleValue() * e.doubleValue(); + return Double.valueOf(1.0 - Math.sqrt(1.0 - esq)); + } + return null; + } + + /** + * The value of the first {@code key=value} token whose key is {@code key}. First match wins, + * as in {@code pj_param}. + */ + static String text(String globals, String key) { + String needle = key + "="; + int i = 0; + int n = globals.length(); + while (i < n) { + while (i < n && globals.charAt(i) == ' ') { + i++; + } + int start = i; + while (i < n && globals.charAt(i) != ' ') { + i++; + } + if (start == i) { + break; + } + if (globals.startsWith(needle, start)) { + return globals.substring(start + needle.length(), i); + } + } + return null; + } + + private static Double value(String globals, String key) { + String raw = text(globals, key); + if (raw == null || raw.isEmpty()) { + return null; + } + try { + return Double.valueOf(Double.parseDouble(raw)); + } catch (NumberFormatException e) { + return null; + } + } + + /** {@code Double.isFinite} is Java 8, but spelled out here for clarity at the call sites. */ + private static boolean isFinite(double v) { + return !Double.isNaN(v) && !Double.isInfinite(v); + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieFileResult.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieFileResult.java new file mode 100644 index 0000000..ebaac46 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieFileResult.java @@ -0,0 +1,152 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.manifest.ObservedRun; + +/** + * Everything one {@code .gie} file produced: its assertions in source order, plus the two + * file-level facts that are not assertions. + * + *

Immutable. + */ +public final class GieFileResult { + + private final String filePath; + private final List assertions; + private final int operationBlocks; + private final int leakedCrsDstFlagAssertions; + + GieFileResult( + String filePath, + List assertions, + int operationBlocks, + int leakedCrsDstFlagAssertions) { + this.filePath = filePath; + this.assertions = + Collections.unmodifiableList(new ArrayList(assertions)); + this.operationBlocks = operationBlocks; + this.leakedCrsDstFlagAssertions = leakedCrsDstFlagAssertions; + } + + /** @return the corpus-relative path, e.g. {@code gie/builtins.gie}. */ + public String filePath() { + return filePath; + } + + /** @return the assertions, in source order. Unmodifiable. */ + public List assertions() { + return assertions; + } + + /** @return how many operation blocks the file opened. */ + public int operationBlocks() { + return operationBlocks; + } + + /** + * How many assertions were evaluated under a plain {@code operation} while + * {@code crs_dst_is_lat_lon_or_y_x} was still set from an earlier {@code crs_src}/{@code crs_dst} + * pair. + * + *

gie does not reset that flag in {@code operation()} ({@code gie.cpp:627-660}), so it leaks — + * and the metric it perturbs is a lat/lon axis swap, which silently turns a 55.8 km deviation into + * a 110.6 km one. No file in the 9.8.1 corpus mixes the two styles, so this should always be + * zero; it is counted rather than assumed, because if it ever stops being zero the resulting + * failures would look like a projection defect. + * + * @return the count, expected to be 0 + */ + public int leakedCrsDstFlagAssertions() { + return leakedCrsDstFlagAssertions; + } + + /** + * @param outcome the outcome to count + * @return how many assertions had it + */ + public int count(AssertionOutcome outcome) { + int n = 0; + for (int i = 0; i < assertions.size(); i++) { + if (assertions.get(i).outcome() == outcome) { + n++; + } + } + return n; + } + + /** + * @param verdict the {@code expect failure} verdict to count + * @return how many of this file's {@code expect failure} rows got it + */ + public int count(ExpectedFailureVerdict verdict) { + int n = 0; + for (int i = 0; i < assertions.size(); i++) { + if (assertions.get(i).expectedFailureVerdict() == verdict) { + n++; + } + } + return n; + } + + /** @return how many of this file's assertions were {@code expect failure} rows. */ + public int expectedFailureRows() { + int n = 0; + for (int i = 0; i < assertions.size(); i++) { + if (assertions.get(i).isExpectedFailureRow()) { + n++; + } + } + return n; + } + + /** @return the number of assertions evaluated. */ + public int total() { + return assertions.size(); + } + + /** + * Adds every assertion to a run under construction. + * + * @param builder the accumulator + * @return {@code builder} + */ + public ObservedRun.Builder recordInto(ObservedRun.Builder builder) { + for (int i = 0; i < assertions.size(); i++) { + builder.record(assertions.get(i).observed()); + } + return builder; + } + + /** + * @return {@code "gie/x.gie: 12 pass, 1 fail, 0 skip, 0 vacuous"} — four numbers, always, because a + * summary that hides the vacuous count is the defect this class exists to have fixed + */ + public String summary() { + return filePath + ": " + count(AssertionOutcome.PASS) + " pass, " + count(AssertionOutcome.FAIL) + + " fail, " + count(AssertionOutcome.SKIP) + " skip, " + + count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE) + " vacuous"; + } + + @Override + public String toString() { + return "GieFileResult[" + summary() + "]"; + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieGridAvailability.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieGridAvailability.java new file mode 100644 index 0000000..1919490 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieGridAvailability.java @@ -0,0 +1,113 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +/** + * Answers gie's {@code require_grid} question: is this grid file resolvable? + * + *

This is the Java stand-in for {@code proj_grid_info(filename)} plus the + * {@code PROJ_NETWORK=ON} fallback at {@code 9.8.1:src/apps/gie.cpp:566-593}. The network branch is + * deliberately not reproduced: the conformance module is hermetic (see the surefire + * configuration in {@code conformance/pom.xml}) and a run whose outcome depended on CDN reachability + * would not be a baseline. A grid we do not ship is therefore missing, and the assertions that need + * it become {@link org.locationtech.proj4j.conformance.manifest.AssertionOutcome#SKIP} — never + * passes. + * + *

Three of the corpus's {@code require_grid} uses are live at 9.8.1: {@code BETA2007.gsb} + * (vendored under {@code proj-data/}, so always present) and the two GeoTIFF grids + * {@code us_nga_egm08_25.tif} and {@code fr_ign_RAF20.tif} (not vendored, so always skipped). + */ +public interface GieGridAvailability { + + /** + * @param gridFilename the argument of a {@code require_grid} verb, e.g. {@code BETA2007.gsb} + * @return {@code true} if the grid can be resolved + */ + boolean isAvailable(String gridFilename); + + /** + * Resolves grids against the vendored {@code proj-data/} directory on the test classpath. + * + *

Stateless and immutable, so a single instance is safe to share. + */ + final class OnClasspath implements GieGridAvailability { + + /** Where {@code conformance/sync-upstream.sh} puts the vendored grids. */ + public static final String RESOURCE_PREFIX = "/proj-data/"; + + /** The shared instance. */ + public static final OnClasspath INSTANCE = new OnClasspath(); + + private OnClasspath() {} + + @Override + public boolean isAvailable(String gridFilename) { + if (gridFilename == null) { + return false; + } + String name = gridFilename.trim(); + if (name.isEmpty()) { + return false; + } + // proj_grid_info() takes a bare filename and searches PROJ_LIB; there is no notion of a + // path here, so a slash would be a corpus bug rather than something to resolve. + return OnClasspath.class.getResource(RESOURCE_PREFIX + name) != null; + } + + @Override + public String toString() { + return "GieGridAvailability.OnClasspath[" + RESOURCE_PREFIX + "]"; + } + } + + /** Every grid is missing — every {@code require_grid} block skips. For tests. */ + final class NoneAvailable implements GieGridAvailability { + + /** The shared instance. */ + public static final NoneAvailable INSTANCE = new NoneAvailable(); + + private NoneAvailable() {} + + @Override + public boolean isAvailable(String gridFilename) { + return false; + } + + @Override + public String toString() { + return "GieGridAvailability.NoneAvailable"; + } + } + + /** Every grid is present — nothing skips. For tests. */ + final class AllAvailable implements GieGridAvailability { + + /** The shared instance. */ + public static final AllAvailable INSTANCE = new AllAvailable(); + + private AllAvailable() {} + + @Override + public boolean isAvailable(String gridFilename) { + return true; + } + + @Override + public String toString() { + return "GieGridAvailability.AllAvailable"; + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieRunner.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieRunner.java new file mode 100644 index 0000000..df4682a --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieRunner.java @@ -0,0 +1,957 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import org.locationtech.proj4j.conformance.bridge.GieFailure; +import org.locationtech.proj4j.conformance.bridge.GieFailureKind; +import org.locationtech.proj4j.conformance.bridge.GieOperation; +import org.locationtech.proj4j.conformance.bridge.GieOperationFactory; +import org.locationtech.proj4j.conformance.manifest.AssertionKey; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.parse.GieCommand; +import org.locationtech.proj4j.conformance.parse.GieCoord; +import org.locationtech.proj4j.conformance.parse.GieCoordParser; +import org.locationtech.proj4j.conformance.parse.GieFile; +import org.locationtech.proj4j.conformance.parse.GieVerb; +import org.locationtech.proj4j.conformance.parse.ProjStrtod; +import org.locationtech.proj4j.gie.GieComparator; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.gie.GieTolerance; + +/** + * Executes a lexed {@code .gie} file: the state machine of {@code 9.8.1:src/apps/gie.cpp}'s + * {@code dispatch()} and its verb handlers, emitting one {@link GieAssertionResult} per + * {@code expect} and {@code roundtrip}. + * + *

The lexer ({@code parse/}) decides what the commands are; the comparator + * ({@code org.locationtech.proj4j.gie}) decides whether a coordinate is close enough; the + * bridge decides what a definition means. This class owns only the state machine that joins + * them, which is nonetheless where most of gie's surprises live. + * + *

The state, and what resets it

+ * + *

Per operation block, reset by {@code operation()} ({@code gie.cpp:646-651}) and by + * {@code crs_to_crs_operation()} ({@code gie.cpp:731-736}), which are the same five lines: + * + *

    + *
  • {@code direction} → forward
  • + *
  • {@code tolerance} → {@code tolerance("0.5 mm")}, i.e. {@code 5e-4} m
  • + *
  • {@code ignore} → nothing (the C sets 9999, an errno that cannot occur)
  • + *
  • {@code skip_test} → 0
  • + *
+ * + *

Between {@code accept}/{@code expect} pairs inside a block, {@code direction} and + * {@code tolerance} are therefore sticky: one {@code tolerance 1 cm} governs every + * assertion until the next {@code operation}. + * + *

Two pieces of state that are deliberately not reset per operation

+ * + *

The accepted coordinate. {@code operation()} does not touch {@code T.a}. That + * looks like an oversight and is load bearing: 121 assertions in the 9.8.1 corpus are evaluated with + * no {@code accept} in their own block, and two of those are real coordinate comparisons rather than + * {@code expect failure} — {@code gie/epsg_no_grid.gie:29}, where the {@code accept} precedes the + * {@code crs_dst} that opens the block, and {@code gie/more_builtins.gie:469}, a {@code roundtrip 1} + * written above its own {@code accept}. Clearing the coordinate would silently break both. It is + * therefore carried across block boundaries here too, exactly as the C does. + * + *

{@code crs_dst_is_lat_lon_or_y_x}. Also untouched by {@code operation()}, so it + * leaks out of a {@code crs_src}/{@code crs_dst} block into any following plain {@code operation}. No + * 9.8.1 file mixes the styles; {@link GieFileResult#leakedCrsDstFlagAssertions()} counts it rather + * than assuming it. + * + *

{@code require_grid} and the skip cascade

+ * + *

{@code dispatch()} ({@code gie.cpp:1234-1273}) tests {@code skip_test} after + * {@code operation}, {@code crs_src} and {@code crs_dst} but before everything else: + * + *

+ * if (T.skip_test) {
+ *     if (0 == strcmp(cmnd, "expect")) return another_skip();
+ *     return 0;
+ * }
+ * 
+ * + *

So a missing grid turns every subsequent {@code expect} into a SKIP and drops every other + * verb — including {@code accept}, {@code tolerance}, {@code direction} and, notably, + * {@code roundtrip}, which is silently discarded rather than skipped. Both details are reproduced. + * + *

{@code expect failure errno }

+ * + *

Every named errno degenerates to a bare {@code expect failure}. The C resolves the name through + * a table of {@code PROJ_ERR_*} constants and falls back to {@code 9999} for anything unrecognised + * ({@code gie.cpp:1329}); legacy names still in the corpus, such as {@code pjd_err_axis} in + * {@code axisswap.gie}, already hit that fallback upstream. proj4j's error taxonomy + * ({@link GieFailureKind}) is coarser than PROJ's 17 constants, so insisting on an identity match + * would manufacture failures for transforms that failed correctly for an adjacently-named reason — + * 794 of the corpus's errno expectations are {@code coord_transfm_outside_projection_domain} alone. + * The errno name is retained in the result detail for triage. + * + *

It is not, however, used for nothing else. The errno family — + * {@code invalid_op*} versus {@code coord_transfm*} — is the only reliable record of whether the row + * asserts that PROJ refused a definition or refused a coordinate, and that + * distinction decides whether a construction failure here is a genuine pass or a vacuous one. See + * {@link ExpectedFailureVerdict}. Family, never identity: the identity match is still refused, for + * the reason above. + * + *

Thread safety

+ * + *

A {@code GieRunner} is immutable; all mutable state lives in a {@link Walk} created per + * {@link #run}. Whether two runs may proceed concurrently depends on the + * {@link GieOperationFactory}, not on this class. + */ +public final class GieRunner { + + /** + * {@code T.tolerance = 5e-4} from {@code main()} ({@code gie.cpp:284}), and what every + * {@code operation} resets to. + */ + public static final double DEFAULT_TOLERANCE = GieTolerance.DEFAULT_TOLERANCE; + + /** {@code roundtrip} with no argument. */ + public static final int DEFAULT_ROUNDTRIPS = 100; + + /** {@code proj_roundtrip}'s accepted range for {@code n} ({@code gie.cpp:906}). */ + public static final int MIN_ROUNDTRIPS = 1; + + /** @see #MIN_ROUNDTRIPS */ + public static final int MAX_ROUNDTRIPS = 1000000; + + /** {@code torad_coord}'s default axis string ({@code gie.cpp:786}). */ + static final String DEFAULT_AXIS = "enut"; + + /** The letters {@code torad_coord}/{@code todeg_coord} convert ({@code gie.cpp:792}). */ + private static final String ANGULAR_AXIS_LETTERS = "news"; + + private static final double HUGE_VAL = GieCoord.HUGE_VAL; + + private final GieOperationFactory factory; + private final GieGridAvailability grids; + + private GieRunner(GieOperationFactory factory, GieGridAvailability grids) { + if (factory == null) { + throw new IllegalArgumentException("factory"); + } + this.factory = factory; + this.grids = grids == null ? GieGridAvailability.NoneAvailable.INSTANCE : grids; + } + + /** + * @param factory resolves {@code operation} and {@code crs_src}/{@code crs_dst} definitions + * @param grids answers {@code require_grid} + * @return a runner + */ + public static GieRunner using(GieOperationFactory factory, GieGridAvailability grids) { + return new GieRunner(factory, grids); + } + + /** + * A runner that resolves grids against the vendored {@code proj-data/} directory. + * + * @param factory resolves definitions + * @return a runner + */ + public static GieRunner using(GieOperationFactory factory) { + return new GieRunner(factory, GieGridAvailability.OnClasspath.INSTANCE); + } + + /** + * Walks one file. + * + * @param corpusPath the corpus-relative path used in every {@link AssertionKey}, e.g. + * {@code gie/builtins.gie} + * @param file the lexed file + * @return its assertions, in source order + */ + public GieFileResult run(String corpusPath, GieFile file) { + if (corpusPath == null || corpusPath.isEmpty()) { + throw new IllegalArgumentException("corpusPath"); + } + if (file == null) { + throw new IllegalArgumentException("file"); + } + return new Walk(corpusPath, file).go(); + } + + // ------------------------------------------------------------------------------ the state machine + + /** One pass over one file. Not reusable, not shared. */ + private final class Walk { + + private final String corpusPath; + private final GieFile file; + private final List results = new ArrayList(); + + // ---- file-scope + + /** gie's {@code T.op_id}, less one: the 0-based operation block index of an AssertionKey. */ + private int blockIndex = -1; + + private int assertionIndex; + private int blocks; + private int leakedCrsDstFlag; + + /** Sticky across operations: applied to the next {@code operation}. */ + private boolean useProj4InitRules; + + /** Sticky across operations by omission, not by design. See the class comment. */ + private boolean crsDstIsLatLonOrYX; + + /** + * Sticky across operations by omission: {@code operation()} never clears {@code T.a}. + * + *

Initialised to {@code proj_coord_error()} — gie's {@code T} is {@code memset} to zero, so + * an {@code expect} before any {@code accept} reads {@code (0,0,0,0)} rather than an error + * coordinate. Parsing the empty string is the supported way to obtain the error coordinate; the + * distinction is invisible to the corpus, every file of which accepts before it expects. + */ + private GieCoord accepted = GieCoordParser.parseCoord(""); + + /** Raw source text of the {@code accept} in force, for the assertion content hash. */ + private String acceptedRaw = ""; + + private String crsSrcArgs = ""; + private String crsDstArgs = ""; + private String crsSrcRaw = ""; + private String crsDstRaw = ""; + + // ---- operation-scope + + private GieOperation operation; + private String operationArgs = ""; + private String operationRaw = ""; + private String axisSpec; + private GieComparator comparator = GieComparator.wgs84(); + private GieDirection direction = GieDirection.FORWARD; + private double tolerance = DEFAULT_TOLERANCE; + private String ignoreErrno; + private String errnoName; + private boolean skipTest; + + /** True when the block was opened by a {@code crs_src}/{@code crs_dst} pair. */ + private boolean crsToCrsBlock; + + Walk(String corpusPath, GieFile file) { + this.corpusPath = corpusPath; + this.file = file; + } + + GieFileResult go() { + List commands = file.commands(); + for (int i = 0; i < commands.size(); i++) { + dispatch(commands.get(i)); + } + return new GieFileResult(corpusPath, results, blocks, leakedCrsDstFlag); + } + + /** Port of {@code dispatch()}, including the order of its three pre-skip_test cases. */ + private void dispatch(GieCommand command) { + switch (command.verb()) { + case OPERATION: + operation(command); + return; + case CRS_SRC: + crsSrcArgs = command.args(); + crsSrcRaw = command.raw(); + maybeCrsToCrs(); + return; + case CRS_DST: + crsDstArgs = command.args(); + crsDstRaw = command.raw(); + maybeCrsToCrs(); + return; + default: + break; + } + + if (skipTest) { + // gie.cpp:1243-1247. Only `expect` is even counted; every other verb, roundtrip + // included, is dropped without trace until the next operation. + if (command.verb() == GieVerb.EXPECT) { + record(command, AssertionOutcome.SKIP, "skipped: require_grid could not resolve a grid"); + } + return; + } + + switch (command.verb()) { + case ACCEPT: + accepted = GieCoordParser.parseCoord(command.args()); + acceptedRaw = command.raw(); + return; + case EXPECT: + expect(command); + return; + case ROUNDTRIP: + roundtrip(command); + return; + case DIRECTION: + direction(command.args()); + return; + case TOLERANCE: + tolerance = GieTolerance.tolerance(command.args()); + return; + case IGNORE: + ignoreErrno = Errno.canonical(GieTolerance.column(command.args(), 1)); + return; + case REQUIRE_GRID: + requireGrid(command.args()); + return; + case USE_PROJ4_INIT_RULES: + // gie.cpp:556 -- an exact string compare, so "TRUE" is false. + useProj4InitRules = "true".equals(command.args()); + return; + default: + // banner, verbose, echo, skip and the four block delimiters change no state that + // affects an outcome. `skip` has already stopped the lexer. + return; + } + } + + // ------------------------------------------------------------------------------ verbs + + /** Port of {@code operation()} ({@code gie.cpp:627-660}). */ + private void operation(GieCommand command) { + beginBlock(); + crsToCrsBlock = false; + operationArgs = command.args(); + operationRaw = command.raw(); + axisSpec = GieEllipsoidResolver.text(operationArgs, "axis"); + comparator = GieEllipsoidResolver.comparatorFor(operationArgs); + operation = factory.create(operationArgs); + // Creation failure is NOT reported here: gie defers it to expect() so that + // `expect failure` can succeed. gie.cpp:657-658 says so in as many words. + errnoName = creationErrno(operation); + } + + /** Port of {@code crs_src()}/{@code crs_dst()} ({@code gie.cpp:761-782}). */ + private void maybeCrsToCrs() { + if (crsSrcArgs.isEmpty() || crsDstArgs.isEmpty()) { + return; + } + beginBlock(); + crsToCrsBlock = true; + operationArgs = crsSrcArgs + " -> " + crsDstArgs; + operationRaw = crsSrcRaw + "\n" + crsDstRaw; + axisSpec = null; + // A crs_to_crs pipeline has no argument text to read an ellipsoid out of; PROJ builds it + // from the CRS definitions and it ends up on GRS80 unless the CRSs say otherwise. + comparator = GieComparator.grs80(); + operation = factory.createCrsToCrs(crsSrcArgs, crsDstArgs); + crsDstIsLatLonOrYX = operation.crsDstIsLatLonOrYX(); + errnoName = creationErrno(operation); + // gie.cpp:754-755: each pair is consumed, so every test needs a fresh one. + crsSrcArgs = ""; + crsDstArgs = ""; + crsSrcRaw = ""; + crsDstRaw = ""; + } + + /** The five reset lines shared by {@code operation()} and {@code crs_to_crs_operation()}. */ + private void beginBlock() { + blockIndex++; + blocks++; + assertionIndex = 0; + skipTest = false; + direction = GieDirection.FORWARD; + tolerance = GieTolerance.tolerance("0.5 mm"); + ignoreErrno = null; + // NB: `accepted` and `crsDstIsLatLonOrYX` are deliberately untouched. See the class + // comment; removing this comment and "tidying" them into the reset breaks 2 assertions + // outright and changes the metric of any file that mixes crs_src with operation. + } + + /** Port of {@code direction()} ({@code gie.cpp:595-616}): only the first non-space char counts. */ + private void direction(String args) { + int i = 0; + while (i < args.length() && isSpace(args.charAt(i))) { + i++; + } + char c = i < args.length() ? args.charAt(i) : '\0'; + switch (c) { + case 'F': + case 'f': + direction = GieDirection.FORWARD; + return; + case 'I': + case 'i': + case 'R': + case 'r': + direction = GieDirection.INVERSE; + return; + default: + // The C returns 1, which process_file ignores; the direction is left as it was. + return; + } + } + + /** Port of {@code require_grid()} ({@code gie.cpp:566-593}). May be repeated. */ + private void requireGrid(String args) { + String filename = GieTolerance.column(args, 1); + if (!grids.isAvailable(filename)) { + skipTest = true; + } + } + + /** Port of {@code expect()} ({@code gie.cpp:1009-1191}). */ + private void expect(GieCommand command) { + String args = command.args(); + + // gie.cpp:1018-1025: strncmp(args, "failure", 7), then column(args,2) against "errno". + boolean expectFailure = args.startsWith("failure"); + String namedErrno = null; + if (expectFailure && GieTolerance.column(args, 2).startsWith("errno")) { + namedErrno = firstToken(GieTolerance.column(args, 3)); + } + + // gie.cpp:1027-1028 -- the ignore test runs first, ahead of even the null-P check. + if (ignoreMatches()) { + recordSkip(command, "ignored errno " + errnoName); + return; + } + + if (operation == null || !operation.isUsable()) { + if (expectFailure) { + // The three-way split. gie stops at "the operation is null, so the failure was + // expected, so this is a success"; that is where 1,187 rows of the corpus turn + // failure-to-implement into apparent conformance. See ExpectedFailureVerdict. + ExpectedFailureVerdict verdict = ExpectedFailureVerdict.ofConstructionFailure( + Errno.canonical(namedErrno), creationKind()); + recordExpectedFailure( + command, + verdict, + verdict.isVacuous() + ? "VACUOUS: the operation could not be created, so no conformance was" + + " demonstrated -- gie would have scored this a pass" + + errnoSuffix(namedErrno) + creationSuffix() + : "the definition was rejected, as expected" + + errnoSuffix(namedErrno) + creationSuffix()); + } else { + recordFail(command, "operation could not be created: " + creationMessage()); + } + return; + } + + if (expectFailure) { + // gie.cpp:1052-1072. Reset, transform, and accept HUGE_VAL as the success signal. + errnoName = null; + double[] ci = inputCoord(); + double[] co = transform(ci, direction); + if (co[0] == HUGE_VAL) { + // The operation existed and the coordinate was refused: proj4j agreed with PROJ + // about the domain, which is the one thing an `expect failure` row can prove. + recordExpectedFailure( + command, + ExpectedFailureVerdict.ofTransformFailure(), + "the coordinate was rejected, as expected" + errnoSuffix(namedErrno) + + transformSuffix()); + } else { + recordExpectedFailure( + command, + ExpectedFailureVerdict.ofFailureToFail(), + "failed to fail: got " + show(co, 2) + errnoSuffix(namedErrno)); + } + return; + } + + GieCoord expected = GieCoordParser.parseCoord(args); + if (expected.x() == HUGE_VAL) { + // gie.cpp:1096-1098, expect_message_cannot_parse. Note this also catches a literal + // leading HUGE_VAL, exactly as the C does. + recordFail(command, "too few args: cannot parse an expected coordinate from \"" + args + "\""); + return; + } + + GieIoUnits outUnits = outputUnits(direction); + boolean angularOut = outUnits == GieIoUnits.RADIANS; + + double[] ce = angularOut ? toradCoord(expected.toArray(), direction) : expected.toArray(); + double[] ci = inputCoord(); + double[] co = transform(ci, direction); + + if (crsDstIsLatLonOrYX && !crsToCrsBlock) { + leakedCrsDstFlag++; + } + + GieComparator.Result result = comparator.compare( + outUnits, crsDstIsLatLonOrYX, ce, co, expected.dimensionsGiven(), tolerance); + + if (result.passed()) { + recordPass(command, ""); + return; + } + double[] shown = angularOut ? todegCoord(co, direction) : co; + if (!result.withinTolerance()) { + recordFail(command, "deviation " + mm(result.deviation()) + " mm, tolerance " + + mm(tolerance) + " mm, metric " + result.metric() + + "; got " + show(shown, expected.dimensionsGiven()) + + transformSuffix()); + } else { + recordFail(command, "time deviation " + fmt(result.temporalDeviation()) + + " year, maximum " + fmt(GieComparator.TEMPORAL_THRESHOLD_IN_YEAR) + + " year; got " + show(shown, 4)); + } + } + + /** Port of {@code roundtrip()} ({@code gie.cpp:886-1006}). */ + private void roundtrip(GieCommand command) { + String args = command.args(); + + if (operation == null || !operation.isUsable()) { + // gie.cpp:896-901: for roundtrip the ignore test lives inside the null-P branch. + if (ignoreMatches()) { + recordSkip(command, "ignored errno " + errnoName); + } else { + recordFail(command, "operation could not be created: " + creationMessage()); + } + return; + } + + ProjStrtod.Result n = ProjStrtod.strtod(args, 0); + int ntrips; + if (n.end == 0) { + ntrips = DEFAULT_ROUNDTRIPS; + } else if (n.value < MIN_ROUNDTRIPS || n.value > MAX_ROUNDTRIPS) { + recordFail(command, "invalid number of roundtrips: " + fmt(n.value)); + return; + } else { + ntrips = (int) n.value; + } + + double d = GieTolerance.strtodScaled(args.substring(n.end), 1); + if (d == HUGE_VAL) { + d = tolerance; + } + + double[] coo = inputCoord(); + double r = projRoundtrip(ntrips, coo); + + if ((Double.isNaN(r) && Double.isNaN(d)) || r <= d) { + recordPass(command, ""); + } else { + recordFail(command, "roundtrip deviation " + mm(r) + " mm, expected " + mm(d) + + " mm over " + ntrips + " trips" + transformSuffix()); + } + } + + /** + * Port of {@code proj_roundtrip()} ({@code 9.8.1:src/trans.cpp:591-629}). + * + *

The half-step phasing is the whole point and is copied literally: one step forward, then + * {@code n-1} full inverse/forward cycles taken out of phase, then one step back. It + * is not {@code n} pairs of {@code (fwd, inv)}, and the difference shows up as a factor of + * roughly {@code n} in the residual. + * + *

The residual metric branches on {@code proj_angular_}{@code input} — the + * comment in the C is "checking for angular *input* since we do a roundtrip, and end where we + * begin". There is no degrees branch: a {@code DEGREES} input side lands in the Euclidean + * case, which is correct because both operands are then in degrees. + */ + private double projRoundtrip(int n, double[] coord) { + double[] org = coord.clone(); + + // In the first half-step, we generate the output value. + double[] t = transform(org, direction); + + // Now n-1 full steps in the opposite direction: we are out of phase due to the half step + // already taken. + for (int i = 0; i < n - 1; i++) { + t = transform(transform(t, direction.opposite()), direction); + } + + // Finally, the last half-step. + t = transform(t, direction.opposite()); + + // If we start with any NaN, we expect all NaN as output. + if (hasNans(org) && allNans(t)) { + return 0.0; + } + + if (inputUnits(direction) == GieIoUnits.RADIANS) { + return comparator.lpzDist(org, t); + } + return GieComparator.xyzDist(org, t); + } + + // ------------------------------------------------------------------------------ plumbing + + /** {@code ci = proj_angular_input(P, dir) ? torad_coord(P, dir, T.a) : T.a}. */ + private double[] inputCoord() { + double[] a = accepted.toArray(); + return inputUnits(direction) == GieIoUnits.RADIANS ? toradCoord(a, direction) : a; + } + + private GieIoUnits outputUnits(GieDirection dir) { + return GieIoUnits.outputUnits( + operation.leftUnits(), operation.rightUnits(), operation.isInverted(), dir); + } + + /** + * {@code proj_*_input(P, dir)}, which {@code coordinates.cpp:52-93} defines as + * {@code *_output(P, opposite(dir))}. + */ + private GieIoUnits inputUnits(GieDirection dir) { + return outputUnits(dir.opposite()); + } + + /** + * {@code proj_trans}, with {@code proj_coord_error()} substituted for the bridge's + * {@code null}. PROJ signals a failed transform by returning all-{@code HUGE_VAL}, and + * {@code expect}'s success test for {@code expect failure} is literally + * {@code co.xyz.x == HUGE_VAL}, so the substitution is not a convenience — it is the contract. + */ + private double[] transform(double[] in, GieDirection dir) { + double[] out = operation.transform(in, dir); + if (out == null || out.length != 4) { + GieFailure failure = operation.lastFailure(); + if (failure != null) { + errnoName = Errno.of(failure); + } + return new double[] {HUGE_VAL, HUGE_VAL, HUGE_VAL, HUGE_VAL}; + } + GieFailure failure = operation.lastFailure(); + if (failure != null) { + errnoName = Errno.of(failure); + } + return out; + } + + /** + * Port of {@code torad_coord()} ({@code gie.cpp:785-796}). + * + *

The default axis string is {@code "enut"}, so by default only {@code v[0]} and + * {@code v[1]} convert. A {@code +axis} override is honoured only in the inverse + * direction, because {@code +axis} describes the projected side, which is an + * inverse's input. {@code todeg_coord} has the mirror-image asymmetry. + * + *

Never exercised by the active 9.8.1 corpus: the angular {@code +axis} blocks in + * {@code 4D-API_cs2cs-style.gie} have their assertions commented out and + * {@code axisswap.gie}'s are {@code WHATEVER}-unit. Implemented for fidelity. + */ + private double[] toradCoord(double[] a, GieDirection dir) { + return convertAxes(a, dir == GieDirection.INVERSE, true); + } + + /** Port of {@code todeg_coord()} ({@code gie.cpp:798-809}). */ + private double[] todegCoord(double[] a, GieDirection dir) { + return convertAxes(a, dir == GieDirection.FORWARD, false); + } + + private double[] convertAxes(double[] a, boolean honourAxisOverride, boolean toRadians) { + String axis = DEFAULT_AXIS; + if (axisSpec != null && !axisSpec.isEmpty() && honourAxisOverride) { + axis = axisSpec; + } + double[] out = a.clone(); + int n = Math.min(axis.length(), 4); + for (int i = 0; i < n; i++) { + if (ANGULAR_AXIS_LETTERS.indexOf(axis.charAt(i)) >= 0) { + out[i] = toRadians ? toRad(out[i]) : Math.toDegrees(out[i]); + } + } + return out; + } + + // ------------------------------------------------------------------------------ errno + + private boolean ignoreMatches() { + return ignoreErrno != null && ignoreErrno.equals(errnoName); + } + + private String creationErrno(GieOperation op) { + if (op == null) { + return null; + } + return op.isUsable() ? null : Errno.of(op.failure()); + } + + /** + * The bridge's classification of the construction failure in force, or {@code null} when there + * is no operation at all — which {@link ExpectedFailureVerdict} treats as vacuous, since an + * {@code expect failure} evaluated before any {@code operation} demonstrates nothing. + */ + private GieFailureKind creationKind() { + if (operation == null) { + return null; + } + GieFailure failure = operation.failure(); + return failure == null ? null : failure.kind(); + } + + private String creationMessage() { + if (operation == null) { + return "no operation in force"; + } + GieFailure failure = operation.failure(); + if (failure == null) { + return "unknown reason"; + } + return failure.kind() + ": " + failure.message(); + } + + private String creationSuffix() { + if (operation == null) { + return ""; + } + GieFailure failure = operation.failure(); + return failure == null ? "" : " (" + failure.kind() + ": " + failure.message() + ")"; + } + + private String transformSuffix() { + if (operation == null) { + return ""; + } + GieFailure failure = operation.lastFailure(); + return failure == null ? "" : " (" + failure.kind() + ": " + failure.message() + ")"; + } + + // ------------------------------------------------------------------------------ recording + + private void recordPass(GieCommand command, String detail) { + record(command, AssertionOutcome.PASS, detail); + errnoName = null; // another_success() -> proj_errno_reset(T.P) + } + + private void recordFail(GieCommand command, String detail) { + record(command, AssertionOutcome.FAIL, detail); + errnoName = null; // another_failure() -> proj_errno_reset(T.P) + } + + /** another_skip() does not reset the errno, so neither does this. */ + private void recordSkip(GieCommand command, String detail) { + record(command, AssertionOutcome.SKIP, detail); + } + + /** + * Records an {@code expect failure} row together with the verdict that produced its outcome, so + * that a report can say how many of the corpus's 1,187 such rows are genuine without having to + * re-derive it from the detail text. + * + *

The errno is reset for all three verdicts: upstream reaches {@code another_success()} for + * two of them and {@code another_failure()} for the third, and both call + * {@code proj_errno_reset}. + */ + private void recordExpectedFailure( + GieCommand command, ExpectedFailureVerdict verdict, String detail) { + record(command, verdict.outcome(), detail, verdict); + errnoName = null; + } + + private void record(GieCommand command, AssertionOutcome outcome, String detail) { + record(command, outcome, detail, null); + } + + private void record( + GieCommand command, + AssertionOutcome outcome, + String detail, + ExpectedFailureVerdict verdict) { + int block = blockIndex < 0 ? 0 : blockIndex; + String assertionText = assertionText(command); + AssertionKey key = + AssertionKey.compute(corpusPath, block, assertionIndex, operationRaw, assertionText); + results.add(new GieAssertionResult( + key, + outcome, + detail, + command.verb(), + command.args(), + operationArgs, + command.line(), + verdict)); + assertionIndex++; + } + + /** + * The text an {@link AssertionKey}'s content hash is taken over: the {@code accept} that is in + * force followed by the assertion itself, both as they appear in the corpus file. + * + *

Raw source text rather than lexer output, deliberately — {@link AssertionKey#normalise} + * exists so that identity tracks upstream edits and nothing else. Keying off the lexer's + * normalised form would make every future refinement of our own parser rewrite every key in + * the manifest. + */ + private String assertionText(GieCommand command) { + return acceptedRaw.isEmpty() ? command.raw() : acceptedRaw + "\n" + command.raw(); + } + } + + // ---------------------------------------------------------------------------------- statics + + /** + * {@code PJ_TORAD(deg)} = {@code deg * M_PI / 180.0}. + * + *

Not {@link Math#toRadians}, which associates as {@code deg / 180.0 * PI} and differs by up + * to 1 ULP — about 1.4e-9 m on the ellipsoid, which is exactly the threshold of the corpus's 16 + * {@code nm}-tolerance rows. ({@code PJ_TODEG} is bit-identical to + * {@link Math#toDegrees}, so that direction uses the JDK.) + */ + static double toRad(double deg) { + return deg * Math.PI / 180.0; + } + + /** + * The bracketed note a detail line carries when the corpus named an errno. It records that the + * name was not matched, and whether PROJ itself would have recognised it, so that a + * triage never has to wonder whether the runner tried and failed or never tried. + */ + private static String errnoSuffix(String namedErrno) { + if (namedErrno == null || namedErrno.isEmpty()) { + return ""; + } + return Errno.canonical(namedErrno) == null + ? " [errno " + namedErrno + ": not a PROJ error constant even upstream (9999), so a bare failure]" + : " [errno " + namedErrno + ": not matched; every named errno degenerates, see GieRunner]"; + } + + private static boolean hasNans(double[] v) { + return Double.isNaN(v[0]) || Double.isNaN(v[1]) || Double.isNaN(v[2]) || Double.isNaN(v[3]); + } + + private static boolean allNans(double[] v) { + return Double.isNaN(v[0]) && Double.isNaN(v[1]) && Double.isNaN(v[2]) && Double.isNaN(v[3]); + } + + private static boolean isSpace(char c) { + return c == ' ' || c == '\t' || c == '\n' || c == 0x0b || c == '\f' || c == '\r'; + } + + private static String firstToken(String s) { + int i = 0; + while (i < s.length() && isSpace(s.charAt(i))) { + i++; + } + int start = i; + while (i < s.length() && !isSpace(s.charAt(i))) { + i++; + } + return s.substring(start, i); + } + + private static String fmt(double v) { + return String.format(Locale.ROOT, "%.6f", Double.valueOf(v)); + } + + private static String mm(double metres) { + if (Double.isNaN(metres) || Double.isInfinite(metres)) { + return String.valueOf(metres); + } + return String.format(Locale.ROOT, "%.6f", Double.valueOf(1000 * metres)); + } + + private static String show(double[] v, int dimensions) { + StringBuilder out = new StringBuilder(48); + int n = Math.max(2, Math.min(4, dimensions)); + for (int i = 0; i < n; i++) { + if (i > 0) { + out.append(' '); + } + out.append(String.format(Locale.ROOT, "%.9f", Double.valueOf(v[i]))); + } + return out.toString(); + } + + /** + * The {@code err_const} names of {@code gie.cpp:1284-1303}, used for {@code ignore} matching and + * for saying in a detail line whether an {@code expect failure errno } named something + * PROJ itself would have recognised. + * + *

Names only. The numeric {@code PROJ_ERR_*} values are deliberately absent: nothing here may + * turn into an identity test against a proj4j failure, for the reason set out in + * {@link GieRunner}'s class comment. + */ + static final class Errno { + + private static final String[] NAMES = { + "invalid_op", + "invalid_op_wrong_syntax", + "invalid_op_missing_arg", + "invalid_op_illegal_arg_value", + "invalid_op_mutually_exclusive_args", + "invalid_op_file_not_found_or_invalid", + "coord_transfm", + "coord_transfm_invalid_coord", + "coord_transfm_outside_projection_domain", + "coord_transfm_no_operation", + "coord_transfm_outside_grid", + "coord_transfm_grid_at_nodata", + "coord_transfm_missing_time", + "other", + "api_misuse", + "no_inverse_op", + "network_error", + }; + + private Errno() {} + + /** + * Port of {@code errno_from_err_const()}'s name resolution ({@code gie.cpp:1329-1348}): + * lower-case the input, then prefix-match the table in declared order. + * + * @param name a name as written in the corpus + * @return the canonical name, or {@code null} where the C would have fallen back to 9999 — + * an errno that no operation can report, so "matches nothing" + */ + static String canonical(String name) { + if (name == null) { + return null; + } + String needle = name.trim().toLowerCase(Locale.ROOT); + if (needle.isEmpty()) { + return null; + } + for (int i = 0; i < NAMES.length; i++) { + if (NAMES[i].startsWith(needle)) { + return NAMES[i]; + } + } + return null; + } + + /** + * The nearest {@code err_const} name for one of our failures. Used only by {@code ignore}, + * which has zero uses in the 9.8.1 corpus but is a real verb. + * + * @param failure the failure, may be {@code null} + * @return a canonical name, or {@code null} when there is no failure + */ + static String of(GieFailure failure) { + if (failure == null) { + return null; + } + switch (failure.kind()) { + case NOT_IMPLEMENTED: + return "invalid_op"; + case INVALID_DEFINITION: + return "invalid_op_illegal_arg_value"; + case COORD_OUT_OF_DOMAIN: + return "coord_transfm_outside_projection_domain"; + case INVALID_COORD: + return "coord_transfm_invalid_coord"; + case NO_INVERSE: + return "no_inverse_op"; + case NUMERICAL: + return "coord_transfm"; + case MISSING_GRID: + return "invalid_op_file_not_found_or_invalid"; + default: + return "other"; + } + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieRunnerTest.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieRunnerTest.java new file mode 100644 index 0000000..1b616bf --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/GieRunnerTest.java @@ -0,0 +1,688 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.locationtech.proj4j.conformance.bridge.GieFailureKind; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.manifest.ObservedRun; +import org.locationtech.proj4j.conformance.parse.GieFile; +import org.locationtech.proj4j.conformance.parse.GieLexer; +import org.locationtech.proj4j.conformance.parse.GieVerb; + +/** + * The state machine, exercised against small synthetic fixtures and a fake operation whose arithmetic + * is simple enough to predict by hand. + * + *

These are tests of {@code gie.cpp}'s bookkeeping, not of any projection: every behaviour asserted + * here is one that, if got wrong, silently changes thousands of corpus outcomes without producing an + * error anywhere. + */ +class GieRunnerTest { + + private final FakeGieOperationFactory factory = new FakeGieOperationFactory(); + + private GieFileResult run(String fixture) throws IOException { + return run(fixture, GieGridAvailability.NoneAvailable.INSTANCE); + } + + private GieFileResult run(String fixture, GieGridAvailability grids) throws IOException { + String resource = "/runner-fixtures/" + fixture; + InputStream in = GieRunnerTest.class.getResourceAsStream(resource); + assertNotNull(in, "missing fixture " + resource); + try { + GieFile lexed = GieLexer.lex(resource, in); + return GieRunner.using(factory, grids).run("runner-fixtures/" + fixture, lexed); + } finally { + in.close(); + } + } + + private static List outcomes(GieFileResult result) { + List out = new ArrayList(); + for (GieAssertionResult a : result.assertions()) { + out.add(a.outcome()); + } + return out; + } + + // ------------------------------------------------------------------------------ reset & stickiness + + @Test + @DisplayName("tolerance and direction are sticky within a block and reset by the next operation") + void toleranceAndDirectionResetPerOperation() throws IOException { + GieFileResult result = run("reset.gie"); + + assertEquals(4, result.operationBlocks()); + assertEquals(5, result.total()); + + // Block 0: `tolerance 100 m` + `direction inverse`. The fake shifts by 10, so an inverse + // transform of (1,2) yields (-9,-8) against an expected (1,2): a deviation of hypot(10,10) = + // 14.14, comfortably inside 100 m. Both pairs pass, which is the stickiness claim: the second + // accept/expect has no tolerance or direction of its own. + assertEquals(AssertionOutcome.PASS, result.assertions().get(0).outcome(), "block 0, first pair"); + assertEquals(AssertionOutcome.PASS, result.assertions().get(1).outcome(), + "block 0, second pair: tolerance and direction must still be in force"); + assertEquals(0, result.assertions().get(0).key().operationBlockIndex()); + assertEquals(0, result.assertions().get(0).key().assertionIndex()); + assertEquals(1, result.assertions().get(1).key().assertionIndex()); + + // Block 1: the identical deviation, now judged against the 0.5 mm default and computed in the + // forward direction. If either had leaked this would pass. + GieAssertionResult afterReset = result.assertions().get(2); + assertEquals(AssertionOutcome.FAIL, afterReset.outcome(), + "operation() must reset tolerance to 0.5 mm and direction to forward"); + assertEquals(1, afterReset.key().operationBlockIndex()); + assertEquals(0, afterReset.key().assertionIndex(), "the assertion index resets per block"); + assertTrue(afterReset.detail().contains("tolerance 0.500000 mm"), + "the detail should quote the reset tolerance, was: " + afterReset.detail()); + } + + @Test + @DisplayName("direction resets to forward on a new operation") + void directionResetsPerOperation() throws IOException { + GieFileResult result = run("reset.gie"); + GieAssertionResult afterReset = result.assertions().get(3); + + // Block 2 restores a 1 m tolerance but says nothing about the direction, and expects the + // FORWARD answer. A leaked `direction inverse` would be 28.28 m out and fail. + assertEquals(2, afterReset.key().operationBlockIndex()); + assertEquals(AssertionOutcome.PASS, afterReset.outcome(), + "operation() must reset the direction to forward"); + } + + @Test + @DisplayName("the accepted coordinate survives an operation boundary, as gie's does") + void acceptIsNotResetByOperation() throws IOException { + GieFileResult result = run("reset.gie"); + GieAssertionResult leaked = result.assertions().get(4); + + // Block 2 has no `accept` of its own. gie's operation() resets direction, tolerance, ignore and + // skip_test -- and never touches T.a. 121 assertions in the 9.8.1 corpus depend on that, two of + // them real coordinate comparisons (gie/epsg_no_grid.gie:29 and gie/more_builtins.gie:469), so + // "tidying" the accept into the reset would break them with no diagnostic. + assertEquals(3, leaked.key().operationBlockIndex()); + assertEquals(AssertionOutcome.PASS, leaked.outcome(), + "block 3 must reuse block 2's accept of (1,2) and match its own expect of (1,2)"); + } + + @Test + @DisplayName("each operation opens a new key block and restarts the assertion index") + void blockAndAssertionIndicesAreDerivedFromTheResetPoints() throws IOException { + GieFileResult result = run("reset.gie"); + assertEquals("[0:0, 0:1, 1:0, 2:0, 3:0]", indices(result)); + } + + private static String indices(GieFileResult result) { + StringBuilder out = new StringBuilder("["); + for (int i = 0; i < result.assertions().size(); i++) { + if (i > 0) { + out.append(", "); + } + out.append(result.assertions().get(i).key().operationBlockIndex()) + .append(':') + .append(result.assertions().get(i).key().assertionIndex()); + } + return out.append(']').toString(); + } + + // ------------------------------------------------------------------------------ require_grid + + @Test + @DisplayName("a missing require_grid skips every later expect and silently drops every other verb") + void requireGridCascadesSkips() throws IOException { + GieFileResult result = run("require-grid.gie", GieGridAvailability.NoneAvailable.INSTANCE); + + // Two expects become SKIP; the `roundtrip 5` between them produces NOTHING AT ALL, because + // dispatch() returns 0 for every verb but `expect` while skip_test is set. That asymmetry is + // upstream's and is why the corpus's roundtrip count and its skip count do not add up. + assertEquals(3, result.total(), "2 skipped expects + 1 passing expect; the roundtrip is dropped"); + assertEquals( + java.util.Arrays.asList(AssertionOutcome.SKIP, AssertionOutcome.SKIP, AssertionOutcome.PASS), + outcomes(result)); + for (GieAssertionResult a : result.assertions()) { + assertEquals(GieVerb.EXPECT, a.verb(), "the dropped verb must not appear as an assertion"); + } + assertEquals(1, result.count(AssertionOutcome.PASS)); + assertEquals(2, result.count(AssertionOutcome.SKIP)); + assertEquals(0, result.count(AssertionOutcome.FAIL)); + } + + @Test + @DisplayName("the skip cascade ends at the next operation") + void requireGridCascadeEndsAtTheNextOperation() throws IOException { + GieFileResult result = run("require-grid.gie", GieGridAvailability.NoneAvailable.INSTANCE); + GieAssertionResult afterCascade = result.assertions().get(2); + assertEquals(1, afterCascade.key().operationBlockIndex()); + assertEquals(AssertionOutcome.PASS, afterCascade.outcome()); + } + + @Test + @DisplayName("a present grid skips nothing") + void requireGridPassesWhenTheGridIsThere() throws IOException { + GieFileResult result = run("require-grid.gie", GieGridAvailability.AllAvailable.INSTANCE); + assertEquals(0, result.count(AssertionOutcome.SKIP)); + // With nothing dropped the roundtrip runs too, so there are four assertions rather than three. + assertEquals(4, result.total()); + } + + @Test + @DisplayName("a skip is never counted as a pass") + void skipsAreNeverPasses() throws IOException { + GieFileResult result = run("require-grid.gie", GieGridAvailability.NoneAvailable.INSTANCE); + ObservedRun run = result.recordInto(ObservedRun.builder()).build(); + + assertEquals(1, run.count(AssertionOutcome.PASS)); + assertEquals(2, run.count(AssertionOutcome.SKIP)); + assertEquals(3, run.total()); + // The one number that must never absorb the other two. + assertFalse(run.count(AssertionOutcome.PASS) == run.total(), + "passes must not include skips"); + } + + @Test + @DisplayName("the vendored BETA2007.gsb resolves and the GeoTIFF grids do not") + void classpathGridAvailabilityMatchesWhatIsVendored() { + GieGridAvailability grids = GieGridAvailability.OnClasspath.INSTANCE; + assertTrue(grids.isAvailable("BETA2007.gsb"), "BETA2007.gsb is vendored under proj-data/"); + assertFalse(grids.isAvailable("us_nga_egm08_25.tif")); + assertFalse(grids.isAvailable("fr_ign_RAF20.tif")); + assertFalse(grids.isAvailable("")); + assertFalse(grids.isAvailable(null)); + } + + // ------------------------------------------------------------------------------ expect failure + + @Test + @DisplayName("expect failure: all four combinations of expectation and outcome") + void expectFailureInAllFourCombinations() throws IOException { + GieFileResult result = run("expect-failure.gie"); + + assertEquals(7, result.total()); + List a = result.assertions(); + + // 1. creation failed, failure expected -> success. + assertEquals(AssertionOutcome.PASS, a.get(0).outcome(), "creation failed as expected"); + // 2. creation failed, a coordinate expected -> a true failure. NB the operation itself being + // uncreatable is not an error at `operation` time; the verdict is deferred to here. + assertEquals(AssertionOutcome.FAIL, a.get(1).outcome(), "uncreatable operation, coordinate expected"); + assertTrue(a.get(1).detail().contains("could not be created"), a.get(1).detail()); + // 3. creation worked, transform failed, failure expected -> success. + assertEquals(AssertionOutcome.PASS, a.get(2).outcome(), "transform failed as expected"); + // 4. creation worked, transform worked, failure expected -> "failed to fail". + assertEquals(AssertionOutcome.FAIL, a.get(3).outcome(), "failed to fail must be a failure"); + assertTrue(a.get(3).detail().contains("failed to fail"), a.get(3).detail()); + // 5. control: a plain comparison still works in the same file. + assertEquals(AssertionOutcome.PASS, a.get(4).outcome()); + } + + @Test + @DisplayName("every named errno degenerates to a bare expect failure, recognised or not") + void namedErrnosDegenerate() throws IOException { + GieFileResult result = run("expect-failure.gie"); + GieAssertionResult realName = result.assertions().get(5); + GieAssertionResult legacyName = result.assertions().get(6); + + assertEquals(AssertionOutcome.PASS, realName.outcome()); + assertEquals(AssertionOutcome.PASS, legacyName.outcome()); + assertTrue(realName.detail().contains("coord_transfm_invalid_coord"), + "the errno should be recorded for triage: " + realName.detail()); + assertTrue(legacyName.detail().contains("9999"), + "a name PROJ itself cannot resolve should say so: " + legacyName.detail()); + } + + // -------------------------------------------------------------------- expect failure: the three-way split + + private static List verdicts(GieFileResult result) { + List out = new ArrayList(); + for (GieAssertionResult a : result.assertions()) { + out.add(a.expectedFailureVerdict()); + } + return out; + } + + @Test + @DisplayName("a rejected COORDINATE against a built operation is a genuine pass") + void expectFailureIsGenuineWhenTheOperationExistsAndTheCoordinateIsRefused() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + GieAssertionResult a = result.assertions().get(0); + + assertEquals(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, a.expectedFailureVerdict()); + assertEquals(AssertionOutcome.PASS, a.outcome()); + assertTrue(a.detail().contains("coordinate was rejected"), a.detail()); + } + + @Test + @DisplayName("an operation that could not be created because it is NOT_IMPLEMENTED is VACUOUS") + void expectFailureIsVacuousWhenTheOperationIsNotImplemented() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + GieAssertionResult a = result.assertions().get(1); + + // This is gie/adams_hemi.gie in miniature: gie scores it a pass, proj4j has demonstrated + // nothing, and folding it into the headline is failure-to-implement reported as conformance. + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, a.expectedFailureVerdict()); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, a.outcome()); + assertFalse(a.outcome().isPass(), "a vacuous expected failure is never a pass"); + assertFalse(a.outcome().isMeasured(), "nor is it a measurement"); + assertTrue(a.detail().startsWith("VACUOUS"), a.detail()); + } + + @Test + @DisplayName("a transform that succeeds under expect failure is still a FAIL") + void expectFailureThatSucceedsIsAFail() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + GieAssertionResult a = result.assertions().get(2); + + assertEquals(ExpectedFailureVerdict.FAIL, a.expectedFailureVerdict()); + assertEquals(AssertionOutcome.FAIL, a.outcome()); + assertTrue(a.detail().contains("failed to fail"), a.detail()); + } + + @Test + @DisplayName("an errno that asks for the DEFINITION to be refused makes a construction failure genuine") + void aRefusedDefinitionUnderAnInvalidOpErrnoIsGenuine() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + GieAssertionResult a = result.assertions().get(3); + + // gie/ellipsoid.gie is 15 rows of exactly this and they are real: the row exists in order to + // have `+a=-1` (and friends) refused, and proj4j refuses it as INVALID_DEFINITION, whose + // documented contract is "PROJ 9.8.1 would refuse this too". + assertEquals(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, a.expectedFailureVerdict()); + assertEquals(AssertionOutcome.PASS, a.outcome()); + assertTrue(a.detail().contains("definition was rejected"), a.detail()); + } + + @Test + @DisplayName("a coord_transfm errno overrules an INVALID_DEFINITION: the corpus says PROJ built it") + void aCoordTransfmErrnoMakesEvenAnInvalidDefinitionVacuous() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + GieAssertionResult a = result.assertions().get(4); + + // PROJ can only raise coord_transfm_* after proj_create returned an object, so the row asserts + // that the definition was ACCEPTED and the coordinate refused. proj4j rejecting the definition + // therefore contradicts INVALID_DEFINITION's own contract, and the corpus is the authority. + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, a.expectedFailureVerdict()); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, a.outcome()); + } + + @Test + @DisplayName("NOT_IMPLEMENTED is vacuous even under an errno that wants the definition refused") + void notImplementedIsNeverPromotedByAnErrnoName() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + GieAssertionResult a = result.assertions().get(5); + + // An operator we cannot build at all refuses valid and invalid definitions alike, so refusing + // this one is not evidence about either. + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, a.expectedFailureVerdict()); + } + + @Test + @DisplayName("a missing grid is genuine only when the row says PROJ could not find the file either") + void missingGridIsGenuineOnlyUnderTheFileNotFoundErrno() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + + assertEquals(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, + result.assertions().get(6).expectedFailureVerdict(), + "errno invalid_op_file_not_found_or_invalid: PROJ failed to build it too"); + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + result.assertions().get(7).expectedFailureVerdict(), + "a bare expect failure over a grid we simply do not ship measures nothing"); + } + + @Test + @DisplayName("the whole fixture: 8 rows, 3 genuine, 4 vacuous, 1 fail -- gie would have said 7 passes") + void theThreeWaySplitTalliedOverTheWholeFixture() throws IOException { + GieFileResult result = run("expect-failure-vacuity.gie"); + + assertEquals(8, result.total()); + assertEquals(8, result.expectedFailureRows(), "every row in the fixture is an expect failure"); + assertEquals( + java.util.Arrays.asList( + ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, + ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.FAIL, + ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, + ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, + ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE), + verdicts(result)); + + assertEquals(3, result.count(AssertionOutcome.PASS)); + assertEquals(1, result.count(AssertionOutcome.FAIL)); + assertEquals(0, result.count(AssertionOutcome.SKIP)); + assertEquals(4, result.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + // Upstream's tally for the same file: 7 successes and 1 failure. That gap is the defect. + assertFalse(result.count(AssertionOutcome.PASS) == 7, + "4 of gie's 7 successes here demonstrate nothing and must not be counted"); + assertTrue(result.summary().endsWith("3 pass, 1 fail, 0 skip, 4 vacuous"), result.summary()); + } + + @Test + @DisplayName("a vacuous row is recorded distinctly in the observed run, not as a pass") + void aVacuousRowSurvivesIntoTheObservedRunAsItsOwnOutcome() throws IOException { + ObservedRun run = run("expect-failure-vacuity.gie").recordInto(ObservedRun.builder()).build(); + + assertEquals(3, run.count(AssertionOutcome.PASS)); + assertEquals(4, run.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE)); + assertEquals(8, run.total()); + } + + @Test + @DisplayName("the classification rule, stated as a table") + void theClassificationRuleIsATableAndThisIsIt() { + // Rows the corpus says PROJ BUILT: coord_transfm* and no_inverse_op. Nothing survives them. + for (String errno : new String[] { + "coord_transfm", + "coord_transfm_invalid_coord", + "coord_transfm_outside_projection_domain", + "coord_transfm_outside_grid", + "no_inverse_op", + }) { + assertTrue(ExpectedFailureVerdict.assertsProjBuiltTheOperation(errno), errno); + for (GieFailureKind kind : GieFailureKind.values()) { + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.ofConstructionFailure(errno, kind), + errno + " + " + kind); + } + } + + // Rows that are (or may be) asking for a DEFINITION to be refused: the bridge's kind decides. + for (String errno : new String[] {null, "invalid_op", "invalid_op_illegal_arg_value", "other"}) { + assertFalse(ExpectedFailureVerdict.assertsProjBuiltTheOperation(errno), String.valueOf(errno)); + assertEquals(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, + ExpectedFailureVerdict.ofConstructionFailure(errno, GieFailureKind.INVALID_DEFINITION), + "INVALID_DEFINITION means PROJ would refuse this too: " + errno); + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.ofConstructionFailure(errno, GieFailureKind.NOT_IMPLEMENTED), + "NOT_IMPLEMENTED is a statement about proj4j, not about the definition: " + errno); + } + + // MISSING_GRID is genuine only under the one errno that means "PROJ could not read it either". + assertEquals(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, + ExpectedFailureVerdict.ofConstructionFailure( + "invalid_op_file_not_found_or_invalid", GieFailureKind.MISSING_GRID)); + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.ofConstructionFailure(null, GieFailureKind.MISSING_GRID)); + + // No operation at all: vacuous, by the same argument. + assertEquals(ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.ofConstructionFailure("invalid_op", null)); + + // And the two constants. + assertEquals(ExpectedFailureVerdict.PASS_EXPECTED_FAILURE, ExpectedFailureVerdict.ofTransformFailure()); + assertEquals(ExpectedFailureVerdict.FAIL, ExpectedFailureVerdict.ofFailureToFail()); + assertEquals(AssertionOutcome.VACUOUS_EXPECTED_FAILURE, + ExpectedFailureVerdict.VACUOUS_EXPECTED_FAILURE.outcome()); + assertEquals(AssertionOutcome.PASS, ExpectedFailureVerdict.PASS_EXPECTED_FAILURE.outcome()); + } + + @Test + @DisplayName("errno name resolution is a lower-cased prefix match, 9999 on no match") + void errnoNamesResolveLikeTheC() { + assertEquals("invalid_op", GieRunner.Errno.canonical("invalid_op")); + assertEquals("invalid_op", GieRunner.Errno.canonical("INVALID_OP")); + // A prefix resolves to the first table entry it matches, in declaration order. + assertEquals("coord_transfm", GieRunner.Errno.canonical("coord_transfm")); + assertEquals("coord_transfm_outside_grid", GieRunner.Errno.canonical("coord_transfm_outside_g")); + // The legacy names still in the corpus prefix-match nothing, which upstream turns into 9999. + assertEquals(null, GieRunner.Errno.canonical("pjd_err_axis")); + assertEquals(null, GieRunner.Errno.canonical("pjd_err_malformed_pipeline")); + assertEquals(null, GieRunner.Errno.canonical("pjd_err_dont_skip")); + assertEquals(null, GieRunner.Errno.canonical("")); + assertEquals(null, GieRunner.Errno.canonical(null)); + } + + // ------------------------------------------------------------------------------ roundtrip + + @Test + @DisplayName("roundtrip reproduces proj_roundtrip's half-step phasing") + void roundtripPhasing() throws IOException { + GieFileResult result = run("roundtrip.gie"); + List a = result.assertions(); + assertEquals(6, result.total()); + + // 7.07 mm residual: too big for 1 mm, small enough for 1 m. + assertEquals(AssertionOutcome.FAIL, a.get(0).outcome(), "5 trips at 1 mm must fail"); + assertEquals(AssertionOutcome.PASS, a.get(1).outcome(), "5 trips at 1 m must pass"); + + // The bracket. lossy = 0.002 gives 0.001 per inverse-of-forward cycle, so five trips leave + // 0.005 in each of x and y and hypot(0.005, 0.005) = 7.0710678 mm. Round-tripping in the wrong + // order would leave 14.14 mm and fail both; doing a single cycle would leave 1.41 mm and pass + // both. + assertEquals(AssertionOutcome.FAIL, a.get(2).outcome(), "the residual must exceed 7 mm"); + assertEquals(AssertionOutcome.PASS, a.get(3).outcome(), "the residual must be under 8 mm"); + assertTrue(a.get(2).detail().contains("7.07"), + "the measured residual should be reported: " + a.get(2).detail()); + } + + @Test + @DisplayName("the phasing is forward, then n-1 inverse/forward pairs, then inverse") + void roundtripCallSequence() throws IOException { + factory.reset(); + String resource = "/runner-fixtures/roundtrip-one-block.gie"; + // Build the single-block source inline rather than as a file: the assertion here is about the + // exact call sequence, and mixing several blocks into one log would obscure it. + String source = "\n" + + "operation fake lossy=0.002\n" + + "accept 1000 2000\n" + + "roundtrip 4 1 m\n" + + "\n"; + GieFile lexed = GieLexer.lex(resource, source); + GieFileResult result = GieRunner.using(factory, GieGridAvailability.NoneAvailable.INSTANCE) + .run("runner-fixtures/roundtrip-one-block.gie", lexed); + + assertEquals(1, result.total()); + // proj_roundtrip: one half-step forward, then (n-1) full (inverse, forward) cycles taken out of + // phase, then one half-step back. For n = 4 that is F IF IF IF I -- four of each, alternating, + // opening forward and closing inverse. Any other shape is a different function. + assertEquals("FIFIFIFI", factory.callSequence()); + } + + @Test + @DisplayName("roundtrip with no argument means 100 trips") + void roundtripDefaultsToOneHundredTrips() throws IOException { + factory.reset(); + String source = "\n" + + "operation fake lossy=0.002\n" + + "accept 1000 2000\n" + + "tolerance 1 m\n" + + "roundtrip\n" + + "\n"; + GieFile lexed = GieLexer.lex("inline", source); + GieFileResult result = GieRunner.using(factory, GieGridAvailability.NoneAvailable.INSTANCE) + .run("runner-fixtures/inline.gie", lexed); + + assertEquals(1, result.total()); + assertEquals(AssertionOutcome.PASS, result.assertions().get(0).outcome()); + assertEquals(200, factory.callSequence().length(), "100 trips means 100 forward and 100 inverse"); + } + + @Test + @DisplayName("the roundtrip residual metric is chosen by angular INPUT, not output") + void roundtripMetricFollowsAngularInput() throws IOException { + GieFileResult result = run("roundtrip.gie"); + GieAssertionResult angular = result.assertions().get(5); + + // Identical arithmetic to the passing Euclidean case, but with a RADIANS left-hand side the same + // 0.005 residual is 0.005 radians and proj_lpz_dist turns it into tens of kilometres. Selecting + // the metric from the output side instead would have measured a bare 0.00707 and passed. + assertEquals(AssertionOutcome.FAIL, angular.outcome()); + assertTrue(angular.detail().contains("roundtrip deviation"), angular.detail()); + } + + @Test + @DisplayName("roundtrip against an uncreatable operation is a failure, not a skip") + void roundtripWithoutAnOperationFails() throws IOException { + String source = "\n" + + "operation not-a-fake\n" + + "accept 1 2\n" + + "roundtrip 3\n" + + "\n"; + GieFileResult result = GieRunner.using(factory, GieGridAvailability.NoneAvailable.INSTANCE) + .run("runner-fixtures/inline.gie", GieLexer.lex("inline", source)); + assertEquals(1, result.total()); + assertEquals(AssertionOutcome.FAIL, result.assertions().get(0).outcome()); + } + + @Test + @DisplayName("an out-of-range trip count is a failure, not an exception") + void roundtripRejectsAnImpossibleTripCount() throws IOException { + String source = "\n" + + "operation fake shift=0\n" + + "accept 1 2\n" + + "roundtrip 0\n" + + "roundtrip 2000000\n" + + "\n"; + GieFileResult result = GieRunner.using(factory, GieGridAvailability.NoneAvailable.INSTANCE) + .run("runner-fixtures/inline.gie", GieLexer.lex("inline", source)); + assertEquals(2, result.total()); + assertEquals(AssertionOutcome.FAIL, result.assertions().get(0).outcome()); + assertEquals(AssertionOutcome.FAIL, result.assertions().get(1).outcome()); + assertTrue(result.assertions().get(0).detail().contains("invalid number of roundtrips"), + result.assertions().get(0).detail()); + } + + // ------------------------------------------------------------------------------ misc + + @Test + @DisplayName("direction only inspects the first non-space character") + void directionParsesLikeTheC() throws IOException { + // gie.cpp:595-616 switches on *endp after skipping whitespace: F/f forward, I/i/R/r inverse, + // anything else an error that leaves the direction alone. "reverse" is therefore inverse, and + // "forwards" is forward. + String source = "\n" + + "operation fake shift=10\n" + + "direction reverse\n" + + "accept 1 2\n" + + "expect -9 -8\n" + + "direction forwards\n" + + "accept 1 2\n" + + "expect 11 12\n" + + "direction sideways\n" + + "accept 1 2\n" + + "expect 11 12\n" + + "\n"; + GieFileResult result = GieRunner.using(factory, GieGridAvailability.NoneAvailable.INSTANCE) + .run("runner-fixtures/inline.gie", GieLexer.lex("inline", source)); + assertEquals( + java.util.Arrays.asList(AssertionOutcome.PASS, AssertionOutcome.PASS, AssertionOutcome.PASS), + outcomes(result), + "reverse -> inverse, forwards -> forward, sideways -> unchanged"); + } + + @Test + @DisplayName("a display name carries file:block:index, the line, the assertion and the operation") + void displayNamesAreDiagnosable() throws IOException { + GieFileResult result = run("reset.gie"); + String name = result.assertions().get(2).displayName(); + assertTrue(name.startsWith("runner-fixtures/reset.gie:1:0 "), name); + assertTrue(name.contains("expect 3 4"), name); + assertTrue(name.contains("fake shift=10"), name); + } + + @Test + @DisplayName("no fixture leaks crs_dst_is_lat_lon_or_y_x into a plain operation") + void theLatLonFlagDoesNotLeak() throws IOException { + assertEquals(0, run("reset.gie").leakedCrsDstFlagAssertions()); + assertEquals(0, run("roundtrip.gie").leakedCrsDstFlagAssertions()); + } + + @Test + @DisplayName("a completed crs_src + crs_dst pair opens a block and is then consumed") + void crsSrcAndCrsDstPairsOpenBlocks() throws IOException { + // gie.cpp:754-755 clears both after firing, so the second pair needs both verbs again. The + // third crs_dst below therefore does NOT open a block on its own. + String source = "\n" + + "crs_src EPSG:4326\n" + + "crs_dst EPSG:25832\n" + + "accept 1 2\n" + + "expect 1 2\n" + + "crs_dst EPSG:25833\n" + + "expect 1 2\n" + + "\n"; + GieFileResult result = GieRunner.using(factory, GieGridAvailability.NoneAvailable.INSTANCE) + .run("runner-fixtures/inline.gie", GieLexer.lex("inline", source)); + assertEquals(1, result.operationBlocks()); + assertEquals(2, result.total()); + assertEquals(0, result.assertions().get(0).key().operationBlockIndex()); + assertEquals(0, result.assertions().get(1).key().operationBlockIndex(), + "the lone crs_dst must not open a new block"); + assertEquals(1, result.assertions().get(1).key().assertionIndex()); + } + + @Test + @DisplayName("the ellipsoid resolver distinguishes the two no-ellipsoid defaults") + void ellipsoidDefaultsDifferBetweenPipelineAndProjection() { + assertEquals(1.0 / 298.257223563, + GieEllipsoidResolver.comparatorFor("proj=merc").geodesic().Flattening(), + 0.0, + "a bare projection gets WGS84"); + assertEquals(1.0 / 298.257222101, + GieEllipsoidResolver.comparatorFor("proj=pipeline step proj=merc").geodesic().Flattening(), + 0.0, + "a pipeline with no global ellipsoid gets GRS80"); + assertEquals(6400000.0, + GieEllipsoidResolver.comparatorFor("proj=merc a=6400000 rf=297") + .geodesic() + .EquatorialRadius(), + 0.0); + assertEquals(1.0 / 297.0, + GieEllipsoidResolver.comparatorFor("proj=merc a=6400000 rf=297").geodesic().Flattening(), + 0.0); + assertEquals(0.0, + GieEllipsoidResolver.comparatorFor("proj=merc R=6400000").geodesic().Flattening(), + 0.0, + "+R is a sphere"); + // A parameter that belongs to a step must not be mistaken for a global one. + assertEquals(1.0 / 298.257222101, + GieEllipsoidResolver.comparatorFor("proj=pipeline step proj=merc ellps=clrk66") + .geodesic() + .Flattening(), + 0.0); + } + + @Test + @DisplayName("a deliberately invalid ellipsoid falls back instead of aborting the file") + void ellipsoidResolverSurvivesTheDefinitionsThatExistToBeRejected() { + // Every one of these is a real operation in gie/ellipsoid.gie, written to be refused. Before + // this guard existed, "+R_a +a=2 +f=2" made GeographicLib throw from its constructor and the + // whole file -- 40 valid assertions included -- was reported as a lexer failure. + String[] rejected = { + "proj=merc a=-1", + "proj=merc R=0", + "proj=merc a=1 es=-1", + "proj=merc R_a a=2 f=2", + "proj=merc a=2 f=1", + "proj=merc ellps=GRS80000000000", + "proj=merc a=NaN rf=NaN", + }; + for (String args : rejected) { + assertNotNull(GieEllipsoidResolver.comparatorFor(args).geodesic(), + "no comparator for \"" + args + "\""); + } + } +} diff --git a/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/UnavailableGieOperationFactory.java b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/UnavailableGieOperationFactory.java new file mode 100644 index 0000000..e593955 --- /dev/null +++ b/conformance/src/test/java/org/locationtech/proj4j/conformance/runner/UnavailableGieOperationFactory.java @@ -0,0 +1,125 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.conformance.runner; + +import org.locationtech.proj4j.conformance.bridge.GieFailure; +import org.locationtech.proj4j.conformance.bridge.GieFailureKind; +import org.locationtech.proj4j.conformance.bridge.GieOperation; +import org.locationtech.proj4j.conformance.bridge.GieOperationFactory; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * A factory that creates nothing: every definition fails with {@link GieFailureKind#NOT_IMPLEMENTED}. + * + *

This exists so that the state machine and its wiring can be exercised end to end before the + * proj4j bridge is available. A sweep run against it produces no conformance number worth + * quoting — the only assertions that pass are the 1,187 {@code expect failure} lines, which + * pass for the wrong reason (nothing was built, so nothing could succeed). {@link GieConformanceTest} + * says so on stdout when it falls back to this. + * + *

It is not a "null object" used to paper over a missing dependency at runtime: production code has + * no dependency to paper over, because this module produces no artifact. + */ +public final class UnavailableGieOperationFactory implements GieOperationFactory { + + /** The shared instance. */ + public static final UnavailableGieOperationFactory INSTANCE = new UnavailableGieOperationFactory(); + + /** Public for reflective construction via the {@code gie.operation.factory} property. */ + public UnavailableGieOperationFactory() {} + + @Override + public GieOperation create(String args) { + return new Unusable("no GieOperationFactory is wired: cannot create \"" + args + "\""); + } + + @Override + public GieOperation createCrsToCrs(String sourceCrs, String targetCrs) { + return new Unusable( + "no GieOperationFactory is wired: cannot create " + sourceCrs + " -> " + targetCrs); + } + + @Override + public String toString() { + return "UnavailableGieOperationFactory"; + } + + /** An operation that was never built. */ + private static final class Unusable implements GieOperation, GieFailure { + + private final String message; + + Unusable(String message) { + this.message = message; + } + + @Override + public boolean isUsable() { + return false; + } + + @Override + public GieFailure failure() { + return this; + } + + @Override + public GieIoUnits leftUnits() { + return GieIoUnits.RADIANS; + } + + @Override + public GieIoUnits rightUnits() { + return GieIoUnits.CLASSIC; + } + + @Override + public boolean isInverted() { + return false; + } + + @Override + public boolean crsDstIsLatLonOrYX() { + return false; + } + + @Override + public double[] transform(double[] in, GieDirection dir) { + return null; + } + + @Override + public GieFailure lastFailure() { + return this; + } + + @Override + public GieFailureKind kind() { + return GieFailureKind.NOT_IMPLEMENTED; + } + + @Override + public String message() { + return message; + } + + @Override + public Throwable cause() { + return null; + } + } +} diff --git a/conformance/src/test/resources/NOTICE-gie.md b/conformance/src/test/resources/NOTICE-gie.md new file mode 100644 index 0000000..d8c2d9e --- /dev/null +++ b/conformance/src/test/resources/NOTICE-gie.md @@ -0,0 +1,247 @@ +# NOTICE — third-party material vendored into `conformance/src/test/resources` + +**This file is a licence obligation, not documentation.** Two of the three bodies of vendored +material carry conditions that bind anyone who redistributes them: PROJ's MIT/X11 notice must +travel with the copies, and the IOGP GIGS copyright requires both that the source be acknowledged +and that *every subsequent recipient be informed of its terms*. Shipping the files without this +file does not satisfy either. If these resources end up inside a published artifact, this notice +(or its content) must go with them. + +Nothing in `gie/`, `gigs/` or `proj-data/` is authored here. Every byte is a verbatim copy of +[PROJ](https://proj.org) at tag **9.8.1** (`f08fa86c478c4bbbf003b1ec751dd84aa6eca486`, 2026-04-10), +extracted by `conformance/sync-upstream.sh`. `gie-manifest.sha256` records the SHA-256 of every +vendored file so that local modification is detectable; re-running the sync script regenerates it. + +| directory | upstream origin | files | +|---|---|---| +| `gie/` | `9.8.1:test/gie/` | 22 | +| `gigs/` | `9.8.1:test/gigs/` | 20 `.gie` + 10 `.gie.failing` | +| `proj-data/` | `9.8.1:data/` — the `for_tests` whitelist built by `data/CMakeLists.txt` | 96 (82 under `tests/`, plus promoted copies) | + +`test/gie/tinshift_gpkg.gie` and `test/gie/tinshift_gpkg_network.gie` are **not** vendored: they do +not exist at 9.8.1, having been added to PROJ `master` afterwards. + +--- + +## 1. PROJ — `gie/**`, and the PROJ-authored parts of `proj-data/**` + +`gie/**` is derived from PROJ 9.8.1 `test/gie`. The `.gie` files are unmodified except that the +directory has been flattened from `test/gie/` to `gie/`. The `proj-data/**` tree reproduces the +`for_tests` directory that `9.8.1:data/CMakeLists.txt` assembles at configure time, including its +two renames (`tests/egm96_15_downsampled.gtx` → `egm96_15.gtx`, `tests/ntv2_0_downsampled.gsb` → +`ntv2_0.gsb`) and the deliberately awkward `dir with space/myconus` fixture. + +PROJ is MIT/X11 licensed, which is compatible with proj4j's Apache-2.0. The following is +`9.8.1:COPYING` reproduced in full. Note its first sentence: it covers **data files**, not only +source. + +> All source, data files and other contents of the PROJ package are +> available under the following terms. Note that the PROJ 4.3 and earlier +> was "public domain" as is common with US government work, but apparently +> this is not a well defined legal term in many countries. Frank Warmerdam placed +> everything under the following MIT style license because he believed it is +> effectively the same as public domain, allowing anyone to use the code as +> they wish, including making proprietary derivatives. +> +> Initial PROJ 4.3 public domain code was put as Frank Warmerdam as copyright +> holder, but he didn't mean to imply he did the work. Essentially all work was +> done by Gerald Evenden. +> +> Copyright information can be found in source files. +> +> -------------- +> +> 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. + +Section 3 below qualifies this for the subset of `proj-data/**` that PROJ itself redistributes from +third parties. + +--- + +## 2. IOGP GIGS — `gigs/**` + +**All 30 files in `gigs/` are derived from the IOGP Geospatial Integrity of Geoscience Software +(GIGS) test dataset and are subject to the notice reproduced below.** This matters more than for +the PROJ material, because: + +- the `.gie` files themselves **carry no licence header** — nothing in `gigs/*.gie` tells a reader + that IOGP material is involved; +- the notice that once accompanied them, `test/gigs/TESTNOTES.md`, **was deleted from PROJ + upstream**. It survives only in history, at commit `7b87c520`. + +So this section is the only place the obligation is recorded. It must not be dropped. + +The two blocks below are reproduced verbatim from +`git show 7b87c520:test/gigs/TESTNOTES.md` (Micah Cochran, 2016-05-24), which in turn reproduces +them from the IOGP publication. In that file the preamble reads *"The disclaimer and copyright +**only** applies to JSON files that originate from GIGS tests, which is a reformatting material +provided by the International Association of Oil & Gas Producers."* — the `.gie` files here are +machine translations of exactly those JSON files (see the chain of custody below), so the notice +carries over to them unchanged. + +### Disclaimer + +> Whilst every effort has been made to ensure the accuracy of the information contained in this publication, +> neither the OGP nor any of its members past present or future warrants its accuracy or will, regardless +> of its or their negligence, assume liability for any foreseeable or unforeseeable use made thereof, which +> liability is hereby excluded. Consequently, such use is at the recipient’s own risk on the basis that any use +> by the recipient constitutes agreement to the terms of this disclaimer. The recipient is obliged to inform +> any subsequent recipient of such terms. +> +> This document may provide guidance supplemental to the requirements of local legislation. Nothing +> herein, however, is intended to replace, amend, supersede or otherwise depart from such requirements. In +> the event of any conflict or contradiction between the provisions of this document and local legislation, +> applicable laws shall prevail. + +### Copyright notice + +> The contents of these pages are © The International Association of Oil & Gas Producers. Permission +> is given to reproduce this report in whole or in part provided (i) that the copyright of OGP and (ii) +> the source are acknowledged. All other rights are reserved.” Any other use requires the prior written +> permission of the OGP. +> +> These Terms and Conditions shall be governed by and construed in accordance with the laws of +> England and Wales. Disputes arising here from shall be exclusively subject to the jurisdiction of the +> courts of England and Wales. + +### What that requires of us + +1. **Acknowledge the copyright and the source.** The copyright is the International Association of + Oil & Gas Producers (IOGP, formerly OGP). The source is the IOGP GIGS test dataset, series 5100 + (conversions) and 5200 (transformations), from *GIGS Test Dataset v2.0* (2011), reached via PROJ + as described below. Background: (the URL in the original notice, + `http://www.iogp.org/Geomatics#2521115-gigs`, is dead). +2. **Inform subsequent recipients of the terms.** The disclaimer text says so explicitly: *"The + recipient is obliged to inform any subsequent recipient of such terms."* That is a transitive + obligation — it does not stop at us. Any artifact that carries `gigs/**` must carry this notice + too. + +### Chain of custody + +The `.gie` files are several transformations removed from the IOGP publication. Each step is a +commit in the PROJ repository: + +| step | what | commit / date | +|---|---|---| +| 1 | **IOGP GIGS Test Dataset v2.0** published | 2011 | +| 2 | Reformatted into JSON, with a Python test driver and `TESTNOTES.md` carrying the notice above | `7b87c520`, Micah Cochran, 2016-05-24 | +| 3 | `json → gie` conversion script added | `a053ad0e`, Kristian Evers, 2017-10-24 | +| 4 | JSON auto-translated to `.gie` and registered as CMake tests | `4cf424f1`, Kristian Evers, 2017-12-11 | +| 5 | Tolerances corrected — GIGS states an infinity norm on angular coordinates in arc-seconds, `gie` needs a linear metre distance, so the values were converted (and in places `+towgs84` overridden to stop roundtrip drift) | `0770483f`, Kristian Evers, 2018-01-31 | +| 6 | Consistently-failing subset quarantined behind a filename suffix | `c75d1879`, Kristian Evers, 2018-02-02 and `ab2d175b`, Thomas Knudsen, 2018-02-12 | + +Step 6 is why ten files here end in `.gie.failing` rather than `.gie`. The suffix is upstream's; it +is preserved verbatim. Those ten are: `5101.4-jhs`, `5105.1`, `5110`, `5111.2`, `5203.1`, `5204.1`, +`5205.1`, `5206`, `5207.1`, `5207.2`. + +Because of steps 3–5 the numeric expectations in `gigs/**` are **PROJ's rendering** of the GIGS +dataset, not the IOGP publication's own numbers. Agreement with these files is agreement with PROJ. +It is evidence of GIGS conformance, but it is not a GIGS certification, and nothing here should be +described as one. + +--- + +## 3. `proj-data/**` — grids, dictionaries and fixtures + +All of it is checked into the PROJ source repository and is therefore covered by the PROJ MIT/X11 +notice in section 1, which extends to "data files and other contents of the PROJ package". That is +the operative licence for our redistribution. The per-source detail below is recorded because PROJ +redistributes several of these files from national mapping agencies under those agencies' own +terms, and because attribution is owed regardless of the umbrella licence. + +### What is here + +| group | files | origin | +|---|---|---| +| Init dictionaries and runtime config | `nad27`, `nad83`, `GL27`, `ITRF2000`, `proj.ini` | `9.8.1:data/`, authored by the PROJ project (`GL27` carries an SCCS ID dating it to 1993-08-25) | +| Grids promoted to the `proj-data/` root | `alaska`, `BETA2007.gsb`, `conus`, `MD`, `ntf_r93.gsb`, `ntv1_can.dat`, plus the renamed `egm96_15.gtx` and `ntv2_0.gsb` | `9.8.1:data/tests/`; copies of the same eight files also remain under `proj-data/tests/` | +| The awkward-path fixture | `dir with space/myconus` | a byte-identical copy of `conus`; upstream creates it for `test_cs2cs_datumfile`, and the space in the directory name is the point of the fixture | +| Format fixtures | the remaining 74 files under `proj-data/tests/` — GeoTIFF, GTX, CT2, NTv2 and JSON variants | `9.8.1:data/tests/` | + +### Provenance of the eight grids + +All eight arrived in `data/tests/` in a single commit, `a9bc6e5f` (Even Rouault, 2020-02-26, +*"Make tests independent of proj-datumgrid"*, fixing PROJ issue #1984). Its message states that +`BETA2007.gsb`, `MD`, `alaska`, `conus`, `ntf_r93.gsb` and `ntv1_can.dat` were **copied from the +`proj-datumgrid` package**, and that `egm96_15_downsampled.gtx` and `ntv2_0_downsampled.gsb` are +**downsampled/subsetted versions** of the production `egm96_15.gtx` and `ntv2_0.gsb` created for +testing. They are reduced-fidelity test fixtures; they are not the production grids and must not be +used as such, notwithstanding the names they are copied to. + +Underlying sources, by grid: + +| file | underlying source | +|---|---| +| `ntv1_can.dat`, `ntv2_0.gsb` | Natural Resources Canada (NTv1 / NTv2) | +| `BETA2007.gsb` | AdV, Germany (embedded header: `SYSTEM_F DHDN90`, `SYSTEM_T ETRS89`) | +| `ntf_r93.gsb` | IGN France (embedded header: `IGN07_01`, `SYSTEM_F NTF`, `SYSTEM_T RGF93`) | +| `egm96_15.gtx` | NGA EGM96 geoid | +| `conus`, `alaska`, `MD` | NOAA/NGS NADCON NAD27→NAD83 grids, converted to PROJ's CTABLE V2 format (verified: each begins with the ASCII bytes `CTABLE V2.0`) | + +### Licence status — verified versus assumed + +**Verified.** The GeoTIFF fixtures under `proj-data/tests/` carry machine-readable licence strings +in their embedded GDAL metadata. Reading them directly out of the vendored files gives: + +| statement found in the file | files | +|---|---| +| `Derived from work by NOAA. Public Domain` | `us_noaa_geoid06_ak_subset_at_antimeridian.tif`, `us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif`, `us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif`, `us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif` | +| `Derived from work by NGA. Public Domain` | `egm96_15_uncompressed_truncated.tif` | +| `Derived from work by IGN France. Open License` (Etalab Licence Ouverte) | `fr_ign_RAGTBT2016.tif`, `subset_of_gr3df97a.tif` | +| `Derived from work by Natural Resources Canada. Open Government Licence - Canada` | `test_hgrid_with_subgrid.tif`, `test_hgrid_with_subgrid_no_grid_name.tif` | +| `The Nordic Geodetic Commission. Creative Commons Attribution 4.0` | `nkgrf03vel_realigned_extract.tif`, `nkgrf03vel_realigned_extract_tiled_256x256.tif` | +| `Land Information New Zealand (2013): Released under Creative Commons Attribution 4.0 International` | `simple_model_polar.tif`, `simple_model_wrap_east.tif`, `simple_model_wrap_west.tif`, `test_3d_grid_projected.tif` | + +**Verified.** `proj.db`'s `grid_alternatives` table has an `open_license BOOLEAN` column +(`9.8.1:data/sql/proj_db_table_defs.sql:905`). A CHECK constraint at line 915 makes it structurally +impossible for a row to point at `https://cdn.proj.org/` unless `direct_download = 1` **and** +`open_license = 1`. So `open_license = 1` on a CDN row is PROJ's assertion that the *PROJ-data +CDN copy* of that grid may be freely redistributed. Querying `9.8.1:data/sql/grid_alternatives.sql` +for the grids we vendor: `NTv1_0.gsb`, `NTv2_0.gsb`, `BETA2007.gsb`, `rgf93_ntf.gsb` and `WW15MGH.GRD` +(EGM96) all appear with `open_license = 1`. `conus`, `alaska` and `MD` have **no** row under those +names — the modern NADCON equivalents are separate `us_noaa_*` entries. + +**Assumed, not verified.** That `open_license = 1` transfers to the *in-tree* copies here. It is a +statement about the CDN-hosted PROJ-data artifact, and the in-tree files are older-format, +reduced-fidelity copies from `proj-datumgrid`. What we actually rely on is section 1: these files +are checked into the PROJ repository, whose `COPYING` covers "data files and other contents of the +PROJ package". + +**Assumed, not verified.** Licence terms for the untagged binary grids — `alaska`, `conus`, `MD`, +`ntv1_can.dat`, `ntf_r93.gsb`, `BETA2007.gsb`, `egm96_15.gtx`, `ntv2_0.gsb` — beyond the agency +attributions above. Unlike the GeoTIFFs, these legacy formats carry no embedded licence field, and +`proj-datumgrid` was retired, so no per-file statement was located at 9.8.1. + +**Out of scope.** `proj.db` itself is *not* vendored here. Upstream generates it from +`data/sql/*.sql` at build time and copies it into `for_tests/`; it is not a checked-in artifact. +Note for whoever ships it later: it aggregates EPSG, ESRI, IGNF, IAU and NKG content under +different terms, and proj4j's existing `LICENSE.EPSG` covers only the EPSG portion. + +--- + +## Refreshing + +```sh +conformance/sync-upstream.sh [/path/to/PROJ] # default /Volumes/git/PROJ +``` + +The script fails loudly if `9.8.1^{commit}` in the given checkout is not +`f08fa86c478c4bbbf003b1ec751dd84aa6eca486`. Re-pinning to a different PROJ release means editing +`PROJ_REV`/`PROJ_REV_SHA` at the top of the script — and re-checking this notice, since a new +release can change what third-party data is in `data/tests/`. diff --git a/conformance/src/test/resources/gie-corpus-index.tsv b/conformance/src/test/resources/gie-corpus-index.tsv new file mode 100644 index 0000000..a6ba87f --- /dev/null +++ b/conformance/src/test/resources/gie-corpus-index.tsv @@ -0,0 +1,7931 @@ +# proj4j gie/GIGS conformance - corpus index. +# +# Every assertion key present when the sibling manifest was generated, one per line, in +# canonical order. Used to tell NEW assertions from UNCHANGED ones and to detect keys that +# have DISAPPEARED (an upstream edit, or a lexer change that alters block/assertion indices). +# +# Regenerate together with the manifest: +# mvn -Pconformance verify -Dgie.regenerate=true +gie/4D-API_cs2cs-style.gie#1:0@3716bfc2 +gie/4D-API_cs2cs-style.gie#2:0@a010e212 +gie/4D-API_cs2cs-style.gie#2:1@6015f8b5 +gie/4D-API_cs2cs-style.gie#3:0@ff584077 +gie/4D-API_cs2cs-style.gie#3:1@a1d2ae2d +gie/4D-API_cs2cs-style.gie#4:0@b45eb6e5 +gie/4D-API_cs2cs-style.gie#4:1@c620bd92 +gie/4D-API_cs2cs-style.gie#7:0@b45eb6e5 +gie/4D-API_cs2cs-style.gie#7:1@c620bd92 +gie/4D-API_cs2cs-style.gie#9:0@8f9849db +gie/4D-API_cs2cs-style.gie#10:0@b5f79397 +gie/4D-API_cs2cs-style.gie#11:0@c4fe674b +gie/4D-API_cs2cs-style.gie#12:0@60434073 +gie/4D-API_cs2cs-style.gie#12:1@343e4045 +gie/4D-API_cs2cs-style.gie#12:2@772f7f37 +gie/4D-API_cs2cs-style.gie#13:0@21b62c02 +gie/4D-API_cs2cs-style.gie#13:1@bf6ac0e3 +gie/4D-API_cs2cs-style.gie#14:0@189cf13c +gie/4D-API_cs2cs-style.gie#14:1@5e23135b +gie/4D-API_cs2cs-style.gie#15:0@090fc34a +gie/4D-API_cs2cs-style.gie#15:1@25fd1fa4 +gie/4D-API_cs2cs-style.gie#16:0@3635dc3c +gie/4D-API_cs2cs-style.gie#17:0@0c494891 +gie/4D-API_cs2cs-style.gie#18:0@e28e7860 +gie/4D-API_cs2cs-style.gie#19:0@339a194e +gie/4D-API_cs2cs-style.gie#20:0@b50a8dd9 +gie/4D-API_cs2cs-style.gie#21:0@1cc96d1e +gie/4D-API_cs2cs-style.gie#22:0@b08545c7 +gie/4D-API_cs2cs-style.gie#23:0@7ae0edfa +gie/4D-API_cs2cs-style.gie#24:0@7550b671 +gie/4D-API_cs2cs-style.gie#24:1@5b31d6e7 +gie/4D-API_cs2cs-style.gie#25:0@3552f3d0 +gie/4D-API_cs2cs-style.gie#25:1@f5174d2b +gie/4D-API_cs2cs-style.gie#26:0@b049d182 +gie/4D-API_cs2cs-style.gie#27:0@96c45c1f +gie/4D-API_cs2cs-style.gie#28:0@ba6b07e5 +gie/4D-API_cs2cs-style.gie#29:0@743c6b8f +gie/4D-API_cs2cs-style.gie#30:0@f0beb2c1 +gie/4D-API_cs2cs-style.gie#30:1@2123af5c +gie/4D-API_cs2cs-style.gie#31:0@f44d0e2a +gie/4D-API_cs2cs-style.gie#32:0@e3d0d3fd +gie/4D-API_cs2cs-style.gie#33:0@794633e5 +gie/4D-API_cs2cs-style.gie#33:1@56d019ba +gie/4D-API_cs2cs-style.gie#34:0@1b5f179b +gie/4D-API_cs2cs-style.gie#34:1@37ae8fa3 +gie/4D-API_cs2cs-style.gie#35:0@0d397a9e +gie/4D-API_cs2cs-style.gie#35:1@de8d9d68 +gie/4D-API_cs2cs-style.gie#36:0@a0bc7eb9 +gie/4D-API_cs2cs-style.gie#36:1@2fa8eaa4 +gie/4D-API_cs2cs-style.gie#37:0@7935c79c +gie/4D-API_cs2cs-style.gie#38:0@69f7d826 +gie/4D-API_cs2cs-style.gie#38:1@1bf2d9fe +gie/4D-API_cs2cs-style.gie#39:0@872cd0b2 +gie/4D-API_cs2cs-style.gie#39:1@16c5983b +gie/4D-API_cs2cs-style.gie#40:0@04ee99d2 +gie/4D-API_cs2cs-style.gie#40:1@c0df76a7 +gie/4D-API_cs2cs-style.gie#41:0@3c0a7083 +gie/4D-API_cs2cs-style.gie#41:1@76209d4e +gie/4D-API_cs2cs-style.gie#42:0@2c3e623e +gie/4D-API_cs2cs-style.gie#42:1@ca4d6dfb +gie/4D-API_cs2cs-style.gie#43:0@249b37de +gie/4D-API_cs2cs-style.gie#43:1@bc6c9baf +gie/4D-API_cs2cs-style.gie#44:0@e7bf9a24 +gie/4D-API_cs2cs-style.gie#44:1@5fe09107 +gie/4D-API_cs2cs-style.gie#45:0@826c679e +gie/4D-API_cs2cs-style.gie#46:0@842d30ee +gie/4D-API_cs2cs-style.gie#46:1@fafd4b98 +gie/4D-API_cs2cs-style.gie#47:0@aede0191 +gie/4D-API_cs2cs-style.gie#47:1@fa15e287 +gie/4D-API_cs2cs-style.gie#48:0@5d9d4d54 +gie/4D-API_cs2cs-style.gie#48:1@2ddd8eac +gie/4D-API_cs2cs-style.gie#49:0@ab930055 +gie/4D-API_cs2cs-style.gie#49:1@f75dfd76 +gie/4D-API_cs2cs-style.gie#50:0@86ee2491 +gie/4D-API_cs2cs-style.gie#51:0@144b90a3 +gie/4D-API_cs2cs-style.gie#51:1@a31fab8a +gie/4D-API_cs2cs-style.gie#52:0@ce936ed3 +gie/4D-API_cs2cs-style.gie#53:0@ce936ed3 +gie/DHDN_ETRS89.gie#0:0@66ca3c8b +gie/DHDN_ETRS89.gie#0:1@d674a693 +gie/DHDN_ETRS89.gie#0:2@e28b5ed1 +gie/DHDN_ETRS89.gie#0:3@af073114 +gie/DHDN_ETRS89.gie#0:4@4ff2e940 +gie/DHDN_ETRS89.gie#0:5@bb7519c6 +gie/DHDN_ETRS89.gie#0:6@3ca985bd +gie/DHDN_ETRS89.gie#0:7@dfb40a98 +gie/DHDN_ETRS89.gie#0:8@952d18b4 +gie/DHDN_ETRS89.gie#0:9@e3ae7258 +gie/DHDN_ETRS89.gie#0:10@f40c3168 +gie/DHDN_ETRS89.gie#0:11@ca61a330 +gie/DHDN_ETRS89.gie#0:12@c213fa18 +gie/DHDN_ETRS89.gie#0:13@92aa5e80 +gie/DHDN_ETRS89.gie#0:14@dc6cd148 +gie/DHDN_ETRS89.gie#0:15@48640bd5 +gie/DHDN_ETRS89.gie#0:16@a1efc87c +gie/DHDN_ETRS89.gie#0:17@f94209d5 +gie/DHDN_ETRS89.gie#0:18@4f8161ac +gie/DHDN_ETRS89.gie#0:19@0c8f81ae +gie/DHDN_ETRS89.gie#0:20@695769b3 +gie/DHDN_ETRS89.gie#0:21@e113447f +gie/DHDN_ETRS89.gie#0:22@5830ee2a +gie/DHDN_ETRS89.gie#0:23@b6c1cfd7 +gie/DHDN_ETRS89.gie#0:24@d32523e3 +gie/DHDN_ETRS89.gie#0:25@f494f9cf +gie/DHDN_ETRS89.gie#0:26@575028ed +gie/DHDN_ETRS89.gie#0:27@d71db28c +gie/DHDN_ETRS89.gie#0:28@17b56dba +gie/DHDN_ETRS89.gie#0:29@8929ba3b +gie/DHDN_ETRS89.gie#0:30@b54887ec +gie/DHDN_ETRS89.gie#0:31@91d22702 +gie/DHDN_ETRS89.gie#1:0@4b3e9286 +gie/DHDN_ETRS89.gie#1:1@8bb324a8 +gie/DHDN_ETRS89.gie#1:2@a02d6171 +gie/DHDN_ETRS89.gie#1:3@55da39c6 +gie/DHDN_ETRS89.gie#1:4@5095bd4d +gie/DHDN_ETRS89.gie#1:5@40729548 +gie/DHDN_ETRS89.gie#1:6@9f62c80d +gie/DHDN_ETRS89.gie#1:7@1f3c7306 +gie/DHDN_ETRS89.gie#1:8@437e58c6 +gie/DHDN_ETRS89.gie#1:9@03adca0c +gie/DHDN_ETRS89.gie#1:10@d2e4842c +gie/DHDN_ETRS89.gie#1:11@9d89835f +gie/DHDN_ETRS89.gie#1:12@0d1db8b4 +gie/DHDN_ETRS89.gie#1:13@5f3c86a7 +gie/DHDN_ETRS89.gie#1:14@fd0ef1b4 +gie/DHDN_ETRS89.gie#1:15@8b718f9a +gie/DHDN_ETRS89.gie#1:16@7dd7a6a7 +gie/DHDN_ETRS89.gie#1:17@b3b2e283 +gie/DHDN_ETRS89.gie#1:18@e5965ba0 +gie/DHDN_ETRS89.gie#1:19@db4731fe +gie/DHDN_ETRS89.gie#1:20@9e55f9e2 +gie/DHDN_ETRS89.gie#1:21@67ec22cc +gie/DHDN_ETRS89.gie#1:22@bcc04734 +gie/DHDN_ETRS89.gie#1:23@2567dda2 +gie/DHDN_ETRS89.gie#1:24@54c0ce0e +gie/DHDN_ETRS89.gie#1:25@39fedc26 +gie/DHDN_ETRS89.gie#1:26@7988193b +gie/DHDN_ETRS89.gie#1:27@9be33e1e +gie/DHDN_ETRS89.gie#1:28@9585e5cf +gie/DHDN_ETRS89.gie#1:29@3fc9da36 +gie/DHDN_ETRS89.gie#1:30@c23a4ead +gie/DHDN_ETRS89.gie#1:31@ed27eb9d +gie/GDA.gie#0:0@c10ad0bb +gie/GDA.gie#1:0@36924017 +gie/GDA.gie#2:0@8d8e0d4d +gie/adams_hemi.gie#0:0@b576624f +gie/adams_hemi.gie#0:1@edbfc247 +gie/adams_hemi.gie#0:2@da9ad2fa +gie/adams_hemi.gie#0:3@efe210d5 +gie/adams_hemi.gie#0:4@919786d1 +gie/adams_hemi.gie#0:5@d06e8d6d +gie/adams_hemi.gie#0:6@803caacb +gie/adams_hemi.gie#0:7@04984547 +gie/adams_hemi.gie#0:8@ef64899b +gie/adams_hemi.gie#0:9@f568cd7e +gie/adams_hemi.gie#0:10@c88b0863 +gie/adams_hemi.gie#0:11@2896b5cd +gie/adams_hemi.gie#0:12@7db8a426 +gie/adams_hemi.gie#0:13@ba8aef6c +gie/adams_hemi.gie#0:14@09801d9d +gie/adams_hemi.gie#0:15@b82e24c2 +gie/adams_hemi.gie#0:16@bcdca1af +gie/adams_hemi.gie#0:17@a1f35f4b +gie/adams_hemi.gie#0:18@6f06a62b +gie/adams_hemi.gie#0:19@38c3eae1 +gie/adams_hemi.gie#0:20@759b37e6 +gie/adams_hemi.gie#0:21@d8ebad42 +gie/adams_hemi.gie#0:22@5ae3be5b +gie/adams_hemi.gie#0:23@84e31549 +gie/adams_hemi.gie#0:24@964fdcf0 +gie/adams_hemi.gie#0:25@150251b5 +gie/adams_hemi.gie#0:26@68a753cf +gie/adams_hemi.gie#0:27@7de7767e +gie/adams_hemi.gie#0:28@b6a5d9e4 +gie/adams_hemi.gie#0:29@d2425291 +gie/adams_hemi.gie#0:30@44d7f67d +gie/adams_hemi.gie#0:31@78cd347a +gie/adams_hemi.gie#0:32@2ec5e56b +gie/adams_hemi.gie#0:33@1ad2ea18 +gie/adams_hemi.gie#0:34@228ce220 +gie/adams_hemi.gie#0:35@126756b6 +gie/adams_hemi.gie#0:36@491a6614 +gie/adams_hemi.gie#0:37@b0ac87ba +gie/adams_hemi.gie#0:38@5f03500d +gie/adams_hemi.gie#0:39@cd299870 +gie/adams_hemi.gie#0:40@ff7b9e86 +gie/adams_hemi.gie#0:41@b4b8beaa +gie/adams_hemi.gie#0:42@9cf4dffb +gie/adams_hemi.gie#0:43@588796fd +gie/adams_hemi.gie#0:44@9f248bbc +gie/adams_hemi.gie#0:45@43c0f478 +gie/adams_hemi.gie#0:46@14d0c985 +gie/adams_hemi.gie#0:47@81d7f418 +gie/adams_hemi.gie#0:48@a2af2212 +gie/adams_hemi.gie#0:49@fdd8714f +gie/adams_hemi.gie#0:50@7ad7d459 +gie/adams_hemi.gie#0:51@ea5710da +gie/adams_hemi.gie#0:52@e587a1b8 +gie/adams_hemi.gie#0:53@5eb5eb7c +gie/adams_hemi.gie#0:54@2efd0a30 +gie/adams_hemi.gie#0:55@4d157a74 +gie/adams_hemi.gie#0:56@f4cb793d +gie/adams_hemi.gie#0:57@68293db6 +gie/adams_hemi.gie#0:58@c051238d +gie/adams_hemi.gie#0:59@b1eac275 +gie/adams_hemi.gie#0:60@1e7f0f24 +gie/adams_hemi.gie#0:61@8750b988 +gie/adams_hemi.gie#0:62@31cf3ee7 +gie/adams_hemi.gie#0:63@15d1d09b +gie/adams_hemi.gie#0:64@55f11d12 +gie/adams_hemi.gie#0:65@7389aca2 +gie/adams_hemi.gie#0:66@26c80870 +gie/adams_hemi.gie#0:67@7c0187f1 +gie/adams_hemi.gie#0:68@35c9ea73 +gie/adams_hemi.gie#0:69@9e3c0698 +gie/adams_hemi.gie#0:70@4a03ca08 +gie/adams_hemi.gie#0:71@0e60636f +gie/adams_hemi.gie#0:72@f14b9a46 +gie/adams_hemi.gie#0:73@ec62ad64 +gie/adams_hemi.gie#0:74@2a802f7e +gie/adams_hemi.gie#0:75@9fdec622 +gie/adams_hemi.gie#0:76@27ccb897 +gie/adams_hemi.gie#0:77@d8503326 +gie/adams_hemi.gie#0:78@fab9b4d9 +gie/adams_hemi.gie#0:79@eb1791fa +gie/adams_hemi.gie#0:80@29c71c6d +gie/adams_hemi.gie#0:81@ac351630 +gie/adams_hemi.gie#0:82@30a6db52 +gie/adams_hemi.gie#0:83@ec7cd04b +gie/adams_hemi.gie#0:84@1e10f0a2 +gie/adams_hemi.gie#0:85@a6b8e9bb +gie/adams_hemi.gie#0:86@1229109e +gie/adams_hemi.gie#0:87@bf92449e +gie/adams_hemi.gie#0:88@19227462 +gie/adams_hemi.gie#0:89@112f9210 +gie/adams_hemi.gie#0:90@51e5c9e7 +gie/adams_hemi.gie#0:91@305eadac +gie/adams_hemi.gie#0:92@730f90c6 +gie/adams_hemi.gie#0:93@806ff962 +gie/adams_hemi.gie#0:94@de447510 +gie/adams_hemi.gie#0:95@c109dd1d +gie/adams_hemi.gie#0:96@0bd4d6ce +gie/adams_hemi.gie#0:97@41fe9af4 +gie/adams_hemi.gie#0:98@b0d1a518 +gie/adams_hemi.gie#0:99@46782366 +gie/adams_hemi.gie#0:100@7e1a89cb +gie/adams_hemi.gie#0:101@b751c22f +gie/adams_hemi.gie#0:102@b0b4fbdb +gie/adams_hemi.gie#0:103@f84f818d +gie/adams_hemi.gie#0:104@8f848566 +gie/adams_hemi.gie#0:105@ac7b656e +gie/adams_hemi.gie#0:106@a32db327 +gie/adams_hemi.gie#0:107@56528435 +gie/adams_hemi.gie#0:108@7f737f69 +gie/adams_hemi.gie#0:109@a7d0d56e +gie/adams_hemi.gie#0:110@a5d3df3b +gie/adams_hemi.gie#0:111@8e68d8fb +gie/adams_hemi.gie#0:112@788ff862 +gie/adams_hemi.gie#0:113@0f300c26 +gie/adams_hemi.gie#0:114@830fc6be +gie/adams_hemi.gie#0:115@c3b4b8c3 +gie/adams_hemi.gie#0:116@58b54cbd +gie/adams_hemi.gie#0:117@8ebc928a +gie/adams_hemi.gie#0:118@c20f9d02 +gie/adams_hemi.gie#0:119@fc3ac35a +gie/adams_hemi.gie#0:120@10987189 +gie/adams_hemi.gie#0:121@4af89e42 +gie/adams_hemi.gie#0:122@15143fd4 +gie/adams_hemi.gie#0:123@c792957f +gie/adams_hemi.gie#0:124@f0e4f1c5 +gie/adams_hemi.gie#0:125@682419a7 +gie/adams_hemi.gie#0:126@80ad9993 +gie/adams_hemi.gie#0:127@a87e5ba6 +gie/adams_hemi.gie#0:128@bd77c1ef +gie/adams_hemi.gie#0:129@e9f3d1b2 +gie/adams_hemi.gie#0:130@a8177cce +gie/adams_hemi.gie#0:131@a515d6d9 +gie/adams_hemi.gie#0:132@f02e6a94 +gie/adams_hemi.gie#0:133@77d7b18a +gie/adams_hemi.gie#0:134@b48399c2 +gie/adams_hemi.gie#0:135@54000827 +gie/adams_hemi.gie#0:136@3b509f65 +gie/adams_hemi.gie#0:137@60701461 +gie/adams_hemi.gie#0:138@307cdb5b +gie/adams_hemi.gie#0:139@4c45bda6 +gie/adams_hemi.gie#0:140@1cccb977 +gie/adams_hemi.gie#0:141@3ccf1981 +gie/adams_hemi.gie#0:142@30c84e6e +gie/adams_hemi.gie#0:143@642276e6 +gie/adams_hemi.gie#0:144@22f13aa8 +gie/adams_hemi.gie#0:145@3d925121 +gie/adams_hemi.gie#0:146@342fbb70 +gie/adams_hemi.gie#0:147@2f9bfa21 +gie/adams_hemi.gie#0:148@f5917821 +gie/adams_hemi.gie#0:149@6ec1d758 +gie/adams_hemi.gie#0:150@858040ee +gie/adams_hemi.gie#0:151@0eb5b405 +gie/adams_hemi.gie#0:152@d5d44899 +gie/adams_hemi.gie#0:153@fa1ac635 +gie/adams_hemi.gie#0:154@80f142dd +gie/adams_hemi.gie#0:155@31c75037 +gie/adams_hemi.gie#0:156@56eda924 +gie/adams_hemi.gie#0:157@6d5a02ef +gie/adams_hemi.gie#0:158@47d9290f +gie/adams_hemi.gie#0:159@8068acc8 +gie/adams_hemi.gie#0:160@01a0ffb8 +gie/adams_hemi.gie#0:161@a2b6779e +gie/adams_hemi.gie#0:162@e625108c +gie/adams_hemi.gie#0:163@bd5aee9b +gie/adams_hemi.gie#0:164@c0259cf4 +gie/adams_hemi.gie#0:165@240d742d +gie/adams_hemi.gie#0:166@2ff7b3f3 +gie/adams_hemi.gie#0:167@13fe5063 +gie/adams_hemi.gie#0:168@d0053f80 +gie/adams_hemi.gie#0:169@abdaf914 +gie/adams_hemi.gie#0:170@a33bc24f +gie/adams_hemi.gie#0:171@87a61d7d +gie/adams_hemi.gie#0:172@10aa72ba +gie/adams_hemi.gie#0:173@a5f23913 +gie/adams_hemi.gie#0:174@ad36d2bc +gie/adams_hemi.gie#0:175@07c9eddd +gie/adams_hemi.gie#0:176@285379ea +gie/adams_hemi.gie#0:177@fc1896a1 +gie/adams_hemi.gie#0:178@2eb557b5 +gie/adams_hemi.gie#0:179@e14707de +gie/adams_hemi.gie#0:180@e53c0584 +gie/adams_hemi.gie#0:181@01d283e9 +gie/adams_hemi.gie#0:182@78142112 +gie/adams_hemi.gie#0:183@67b51565 +gie/adams_hemi.gie#0:184@9f6c591c +gie/adams_hemi.gie#0:185@72fe3498 +gie/adams_hemi.gie#0:186@c6843d11 +gie/adams_hemi.gie#0:187@5ae289f4 +gie/adams_hemi.gie#0:188@2c6e94a1 +gie/adams_hemi.gie#0:189@48655860 +gie/adams_hemi.gie#0:190@bff1eb95 +gie/adams_hemi.gie#0:191@1ba0cbdc +gie/adams_hemi.gie#0:192@8dd8db9d +gie/adams_hemi.gie#0:193@79ab4cdc +gie/adams_hemi.gie#0:194@db064067 +gie/adams_hemi.gie#0:195@e1050567 +gie/adams_hemi.gie#0:196@940f7cb4 +gie/adams_hemi.gie#0:197@415e7155 +gie/adams_hemi.gie#0:198@7852dc14 +gie/adams_hemi.gie#0:199@7a3cfbe8 +gie/adams_hemi.gie#0:200@282bb745 +gie/adams_hemi.gie#0:201@9567c2f6 +gie/adams_hemi.gie#0:202@69d77add +gie/adams_hemi.gie#0:203@764c65a4 +gie/adams_hemi.gie#0:204@faa12d23 +gie/adams_hemi.gie#0:205@c5b916da +gie/adams_hemi.gie#0:206@faacc538 +gie/adams_hemi.gie#0:207@8f3a92c9 +gie/adams_hemi.gie#0:208@037bc980 +gie/adams_hemi.gie#0:209@1511ac2e +gie/adams_hemi.gie#0:210@1dedb0df +gie/adams_hemi.gie#0:211@f5d443cd +gie/adams_hemi.gie#0:212@84850549 +gie/adams_hemi.gie#0:213@50ad3143 +gie/adams_hemi.gie#0:214@ef1884cc +gie/adams_hemi.gie#0:215@3250e336 +gie/adams_hemi.gie#0:216@b4f4e00a +gie/adams_hemi.gie#0:217@5184dbd6 +gie/adams_hemi.gie#0:218@b9b1cb25 +gie/adams_hemi.gie#0:219@6d28d6dc +gie/adams_hemi.gie#0:220@960c4193 +gie/adams_hemi.gie#0:221@e64da259 +gie/adams_hemi.gie#0:222@63c62750 +gie/adams_hemi.gie#0:223@8ca10fec +gie/adams_hemi.gie#0:224@3aeaab2c +gie/adams_hemi.gie#0:225@f3634c08 +gie/adams_hemi.gie#0:226@44a0ac0c +gie/adams_hemi.gie#0:227@ad3dcfde +gie/adams_hemi.gie#0:228@0ef06bf1 +gie/adams_hemi.gie#0:229@ffd22467 +gie/adams_hemi.gie#0:230@01154be3 +gie/adams_hemi.gie#0:231@0656323f +gie/adams_hemi.gie#0:232@1de78e89 +gie/adams_hemi.gie#0:233@c7d02c31 +gie/adams_hemi.gie#0:234@179a21f1 +gie/adams_hemi.gie#0:235@221f4790 +gie/adams_hemi.gie#0:236@e97f67f4 +gie/adams_hemi.gie#0:237@fa6d756f +gie/adams_hemi.gie#0:238@cbde51ce +gie/adams_hemi.gie#0:239@8a6eee23 +gie/adams_hemi.gie#0:240@83eda85f +gie/adams_hemi.gie#0:241@cbabf99b +gie/adams_hemi.gie#0:242@ec158eaa +gie/adams_hemi.gie#0:243@2477c5a4 +gie/adams_hemi.gie#0:244@b4648aa1 +gie/adams_hemi.gie#0:245@62f2c445 +gie/adams_hemi.gie#0:246@e4d90318 +gie/adams_hemi.gie#0:247@e38e6cff +gie/adams_hemi.gie#0:248@85a3c6aa +gie/adams_hemi.gie#0:249@b98aa8d6 +gie/adams_hemi.gie#0:250@0212cf8d +gie/adams_hemi.gie#0:251@8f4a5868 +gie/adams_hemi.gie#0:252@4730fd10 +gie/adams_hemi.gie#0:253@fd622e93 +gie/adams_hemi.gie#0:254@c6532750 +gie/adams_hemi.gie#0:255@cc68b6e7 +gie/adams_hemi.gie#0:256@694ffdbd +gie/adams_hemi.gie#0:257@f214f244 +gie/adams_hemi.gie#0:258@e9e060d8 +gie/adams_hemi.gie#0:259@4791d012 +gie/adams_hemi.gie#0:260@c3b038b3 +gie/adams_hemi.gie#0:261@0b5de9fb +gie/adams_hemi.gie#0:262@f4e022f2 +gie/adams_hemi.gie#0:263@db114c6f +gie/adams_hemi.gie#0:264@45f79379 +gie/adams_hemi.gie#0:265@f563824a +gie/adams_hemi.gie#0:266@e71c4992 +gie/adams_hemi.gie#0:267@6983ed0d +gie/adams_hemi.gie#0:268@9068b3ee +gie/adams_hemi.gie#0:269@96fe0f23 +gie/adams_hemi.gie#0:270@2253352c +gie/adams_hemi.gie#0:271@b78496e8 +gie/adams_hemi.gie#0:272@c997aa69 +gie/adams_hemi.gie#0:273@a6d8c0d7 +gie/adams_hemi.gie#0:274@5fb5372c +gie/adams_hemi.gie#0:275@8604f50f +gie/adams_hemi.gie#0:276@84034914 +gie/adams_hemi.gie#0:277@895f175f +gie/adams_hemi.gie#0:278@7b0b8922 +gie/adams_hemi.gie#0:279@fc921822 +gie/adams_hemi.gie#0:280@776be9a7 +gie/adams_hemi.gie#0:281@db92fcc9 +gie/adams_hemi.gie#0:282@f064466c +gie/adams_hemi.gie#0:283@664bc03b +gie/adams_hemi.gie#0:284@77324006 +gie/adams_hemi.gie#0:285@7ac19037 +gie/adams_hemi.gie#0:286@cd30672b +gie/adams_hemi.gie#0:287@65f765d3 +gie/adams_hemi.gie#0:288@f889ecb2 +gie/adams_hemi.gie#0:289@1d9e4676 +gie/adams_hemi.gie#0:290@05a2e7c2 +gie/adams_hemi.gie#0:291@cbab7999 +gie/adams_hemi.gie#0:292@1c1f6b6f +gie/adams_hemi.gie#0:293@2d75ddd0 +gie/adams_hemi.gie#0:294@a3043aa0 +gie/adams_hemi.gie#0:295@8da2cd0f +gie/adams_hemi.gie#0:296@449a7279 +gie/adams_hemi.gie#0:297@15a4a415 +gie/adams_hemi.gie#0:298@7fb6a8a4 +gie/adams_hemi.gie#0:299@798f66f7 +gie/adams_hemi.gie#0:300@7500d3ed +gie/adams_hemi.gie#0:301@7cd8b173 +gie/adams_hemi.gie#0:302@bcf56ccf +gie/adams_hemi.gie#0:303@68964007 +gie/adams_hemi.gie#0:304@af1fe0af +gie/adams_hemi.gie#0:305@92512968 +gie/adams_hemi.gie#0:306@c4df6406 +gie/adams_hemi.gie#0:307@f3ea082c +gie/adams_hemi.gie#0:308@f644b3b1 +gie/adams_hemi.gie#0:309@8dc7f1d4 +gie/adams_hemi.gie#0:310@1bea525a +gie/adams_hemi.gie#0:311@20c6ede8 +gie/adams_hemi.gie#0:312@7f1f5352 +gie/adams_hemi.gie#0:313@5a9cadad +gie/adams_hemi.gie#0:314@80c9a453 +gie/adams_hemi.gie#0:315@8ca655d9 +gie/adams_hemi.gie#0:316@c0f3da22 +gie/adams_hemi.gie#0:317@fbe656c3 +gie/adams_hemi.gie#0:318@1ada69ed +gie/adams_hemi.gie#0:319@449bc9a8 +gie/adams_hemi.gie#0:320@adb3e948 +gie/adams_hemi.gie#0:321@86276c88 +gie/adams_hemi.gie#0:322@689f36b2 +gie/adams_hemi.gie#0:323@998d8c5f +gie/adams_hemi.gie#0:324@112e7b28 +gie/adams_hemi.gie#0:325@22717e0b +gie/adams_hemi.gie#0:326@2f3cfdc3 +gie/adams_hemi.gie#0:327@fda8e5ff +gie/adams_hemi.gie#0:328@665eb42b +gie/adams_hemi.gie#0:329@5739cfa9 +gie/adams_hemi.gie#0:330@25878406 +gie/adams_hemi.gie#0:331@8672cb1a +gie/adams_hemi.gie#0:332@a24fe0a6 +gie/adams_hemi.gie#0:333@75050881 +gie/adams_hemi.gie#0:334@c764d2ff +gie/adams_hemi.gie#0:335@d9dee284 +gie/adams_hemi.gie#0:336@3eb771e0 +gie/adams_hemi.gie#0:337@d373b7f3 +gie/adams_hemi.gie#0:338@b33ea67c +gie/adams_hemi.gie#0:339@1e91741d +gie/adams_hemi.gie#0:340@11d37519 +gie/adams_hemi.gie#0:341@0fcd1273 +gie/adams_hemi.gie#0:342@1f4f47c4 +gie/adams_hemi.gie#0:343@f511cfd6 +gie/adams_hemi.gie#0:344@316b290a +gie/adams_hemi.gie#0:345@d2bf1cf2 +gie/adams_hemi.gie#0:346@b89c5f25 +gie/adams_hemi.gie#0:347@4770514c +gie/adams_hemi.gie#0:348@ee8576c8 +gie/adams_hemi.gie#0:349@03871395 +gie/adams_hemi.gie#0:350@442bc485 +gie/adams_hemi.gie#0:351@4200e6a9 +gie/adams_hemi.gie#0:352@a23be4d5 +gie/adams_hemi.gie#0:353@f5e88807 +gie/adams_hemi.gie#0:354@60fbc19a +gie/adams_hemi.gie#0:355@244d15e7 +gie/adams_hemi.gie#0:356@459e6d27 +gie/adams_hemi.gie#0:357@65464658 +gie/adams_hemi.gie#0:358@3f48da52 +gie/adams_hemi.gie#0:359@69712101 +gie/adams_hemi.gie#0:360@cb8d06d7 +gie/adams_hemi.gie#0:361@1615c26a +gie/adams_hemi.gie#0:362@c14d794c +gie/adams_hemi.gie#0:363@61f5fa50 +gie/adams_hemi.gie#0:364@ebb81d02 +gie/adams_hemi.gie#0:365@a2f9618a +gie/adams_hemi.gie#0:366@170ee2ab +gie/adams_hemi.gie#0:367@e7fe1159 +gie/adams_hemi.gie#0:368@a40b69ee +gie/adams_hemi.gie#0:369@9c7637e7 +gie/adams_hemi.gie#0:370@36aa7103 +gie/adams_hemi.gie#0:371@bc997b50 +gie/adams_hemi.gie#0:372@176c947b +gie/adams_hemi.gie#0:373@d1acb7a1 +gie/adams_hemi.gie#0:374@680440d4 +gie/adams_hemi.gie#0:375@c9021eeb +gie/adams_hemi.gie#0:376@9d9137a3 +gie/adams_hemi.gie#0:377@dc7a4250 +gie/adams_hemi.gie#0:378@750f345d +gie/adams_hemi.gie#0:379@9ab6172b +gie/adams_hemi.gie#0:380@7f553b79 +gie/adams_hemi.gie#0:381@811be3c0 +gie/adams_hemi.gie#0:382@23d3087e +gie/adams_hemi.gie#0:383@a3303223 +gie/adams_hemi.gie#0:384@2e2634f9 +gie/adams_hemi.gie#0:385@6e4bb89a +gie/adams_hemi.gie#0:386@c91f422b +gie/adams_hemi.gie#0:387@70ac0c82 +gie/adams_hemi.gie#0:388@5ecfadd9 +gie/adams_hemi.gie#0:389@8040ccf6 +gie/adams_hemi.gie#0:390@d618df8c +gie/adams_hemi.gie#0:391@5d4bac92 +gie/adams_hemi.gie#0:392@ebf2978c +gie/adams_hemi.gie#0:393@358afe0a +gie/adams_hemi.gie#0:394@13fc5083 +gie/adams_hemi.gie#0:395@d63af595 +gie/adams_hemi.gie#0:396@12d9481c +gie/adams_hemi.gie#0:397@a9264a92 +gie/adams_hemi.gie#0:398@4fd6022c +gie/adams_hemi.gie#0:399@b2e234c2 +gie/adams_hemi.gie#0:400@307ef29d +gie/adams_hemi.gie#0:401@6afb6755 +gie/adams_hemi.gie#0:402@f3452e4f +gie/adams_hemi.gie#0:403@b511a5d5 +gie/adams_hemi.gie#0:404@0a0d09b2 +gie/adams_hemi.gie#0:405@0d1b6758 +gie/adams_hemi.gie#0:406@88c1964a +gie/adams_hemi.gie#0:407@75baf8be +gie/adams_hemi.gie#0:408@7a877c4a +gie/adams_hemi.gie#0:409@23e54d0e +gie/adams_hemi.gie#0:410@e3c735be +gie/adams_hemi.gie#0:411@99c5fb7e +gie/adams_hemi.gie#0:412@c2c444f2 +gie/adams_hemi.gie#0:413@bf01d2a6 +gie/adams_hemi.gie#0:414@a7dd04d6 +gie/adams_hemi.gie#0:415@0198a32e +gie/adams_hemi.gie#0:416@e8d468d1 +gie/adams_hemi.gie#0:417@7acaec7c +gie/adams_hemi.gie#0:418@0afa1479 +gie/adams_hemi.gie#0:419@a96d8e46 +gie/adams_hemi.gie#0:420@3a14a356 +gie/adams_hemi.gie#0:421@e3d8ebe5 +gie/adams_hemi.gie#0:422@2cf3c15b +gie/adams_hemi.gie#0:423@8da7ce0b +gie/adams_hemi.gie#0:424@f0c9b8e5 +gie/adams_hemi.gie#0:425@5c80ae9e +gie/adams_hemi.gie#0:426@97dda304 +gie/adams_hemi.gie#0:427@1cd0d2ca +gie/adams_hemi.gie#0:428@cfb83a54 +gie/adams_hemi.gie#0:429@1e1bd61e +gie/adams_hemi.gie#0:430@0d276d9c +gie/adams_hemi.gie#0:431@cf1f0b47 +gie/adams_hemi.gie#0:432@515a3d7a +gie/adams_hemi.gie#0:433@d67f0eec +gie/adams_hemi.gie#0:434@33d48ec8 +gie/adams_hemi.gie#0:435@a72fb88a +gie/adams_hemi.gie#0:436@aeda0dac +gie/adams_hemi.gie#0:437@c07dbd77 +gie/adams_hemi.gie#0:438@d63c0b1c +gie/adams_hemi.gie#0:439@222745f7 +gie/adams_hemi.gie#0:440@f4fe8404 +gie/adams_hemi.gie#0:441@e3976a31 +gie/adams_hemi.gie#0:442@53de9935 +gie/adams_hemi.gie#0:443@3ee77cc3 +gie/adams_hemi.gie#0:444@204c2cdd +gie/adams_hemi.gie#0:445@c22929e7 +gie/adams_hemi.gie#0:446@9faa3ab0 +gie/adams_hemi.gie#0:447@e71abdbe +gie/adams_hemi.gie#0:448@99e7f752 +gie/adams_hemi.gie#0:449@88db8cc8 +gie/adams_hemi.gie#0:450@74a7361c +gie/adams_hemi.gie#0:451@da5610ee +gie/adams_hemi.gie#0:452@d0c819d7 +gie/adams_hemi.gie#0:453@044b35cb +gie/adams_hemi.gie#0:454@64270fdf +gie/adams_hemi.gie#0:455@22ea60cf +gie/adams_hemi.gie#0:456@f4682f3b +gie/adams_hemi.gie#0:457@77e171ab +gie/adams_hemi.gie#0:458@76e8da08 +gie/adams_hemi.gie#0:459@adb54171 +gie/adams_hemi.gie#0:460@123053e1 +gie/adams_hemi.gie#0:461@bff53d09 +gie/adams_hemi.gie#0:462@f54ecc82 +gie/adams_hemi.gie#0:463@023a8ed7 +gie/adams_hemi.gie#0:464@188fa16e +gie/adams_hemi.gie#0:465@8ce38b9f +gie/adams_hemi.gie#0:466@da845840 +gie/adams_hemi.gie#0:467@42f4e583 +gie/adams_hemi.gie#0:468@5b9b117c +gie/adams_hemi.gie#0:469@deb22597 +gie/adams_hemi.gie#0:470@952f43f1 +gie/adams_hemi.gie#0:471@3c45e729 +gie/adams_hemi.gie#0:472@b2581aec +gie/adams_hemi.gie#0:473@49f6e3b8 +gie/adams_hemi.gie#0:474@74b34023 +gie/adams_hemi.gie#0:475@2df7acc8 +gie/adams_hemi.gie#0:476@b7a2e4ef +gie/adams_hemi.gie#0:477@457ff49b +gie/adams_hemi.gie#0:478@d368c5df +gie/adams_hemi.gie#0:479@c8ba1b88 +gie/adams_hemi.gie#0:480@b2182592 +gie/adams_hemi.gie#0:481@5a6931d1 +gie/adams_hemi.gie#0:482@101f2df0 +gie/adams_hemi.gie#0:483@2f418a50 +gie/adams_hemi.gie#0:484@606a8d28 +gie/adams_hemi.gie#0:485@292f3b1b +gie/adams_hemi.gie#0:486@d3fa3e23 +gie/adams_hemi.gie#0:487@af0c7561 +gie/adams_hemi.gie#0:488@d4861aac +gie/adams_hemi.gie#0:489@53c66c21 +gie/adams_hemi.gie#0:490@02c2e17c +gie/adams_hemi.gie#0:491@5652f0c7 +gie/adams_hemi.gie#0:492@86ee1d52 +gie/adams_hemi.gie#0:493@db0d59ba +gie/adams_hemi.gie#0:494@22622e8a +gie/adams_hemi.gie#0:495@893fb5f2 +gie/adams_hemi.gie#0:496@ecaaae9e +gie/adams_hemi.gie#0:497@78e997a3 +gie/adams_hemi.gie#0:498@e00a20a0 +gie/adams_hemi.gie#0:499@d1b88058 +gie/adams_hemi.gie#0:500@2b28f909 +gie/adams_hemi.gie#0:501@e5221585 +gie/adams_hemi.gie#0:502@f70db427 +gie/adams_hemi.gie#0:503@cc0affa2 +gie/adams_hemi.gie#0:504@cfb7951d +gie/adams_hemi.gie#0:505@21c1ce25 +gie/adams_hemi.gie#0:506@61931e93 +gie/adams_hemi.gie#0:507@4b90149c +gie/adams_hemi.gie#0:508@173ca839 +gie/adams_hemi.gie#0:509@f10eedbf +gie/adams_hemi.gie#0:510@d4877d84 +gie/adams_hemi.gie#0:511@2ba97c23 +gie/adams_hemi.gie#0:512@c2ba45a7 +gie/adams_hemi.gie#0:513@2112a32a +gie/adams_hemi.gie#0:514@d2bfa77a +gie/adams_hemi.gie#0:515@6a632b5f +gie/adams_hemi.gie#0:516@21237e21 +gie/adams_hemi.gie#0:517@b9e8454c +gie/adams_hemi.gie#0:518@9a92a1de +gie/adams_hemi.gie#0:519@362b322e +gie/adams_hemi.gie#0:520@a058b194 +gie/adams_hemi.gie#0:521@b791e20d +gie/adams_hemi.gie#0:522@26fc91c4 +gie/adams_hemi.gie#0:523@902c2878 +gie/adams_hemi.gie#0:524@7fba7fdd +gie/adams_hemi.gie#0:525@4d8c9f94 +gie/adams_hemi.gie#0:526@fb290b54 +gie/adams_hemi.gie#0:527@43083c8e +gie/adams_hemi.gie#0:528@109aa983 +gie/adams_hemi.gie#0:529@55bcfbc9 +gie/adams_hemi.gie#0:530@7b3ce7fe +gie/adams_hemi.gie#0:531@f713cb6e +gie/adams_hemi.gie#0:532@6fdd83ac +gie/adams_hemi.gie#0:533@16cbbb49 +gie/adams_hemi.gie#0:534@52eeda09 +gie/adams_hemi.gie#0:535@b0081e34 +gie/adams_hemi.gie#0:536@747dd039 +gie/adams_hemi.gie#0:537@61d8eed7 +gie/adams_hemi.gie#0:538@3a22a30b +gie/adams_hemi.gie#0:539@bee2aeef +gie/adams_hemi.gie#0:540@90450dff +gie/adams_hemi.gie#0:541@65c760e6 +gie/adams_hemi.gie#0:542@fc23c1bd +gie/adams_hemi.gie#0:543@1fc48569 +gie/adams_hemi.gie#0:544@21a39412 +gie/adams_hemi.gie#0:545@93f5dab4 +gie/adams_hemi.gie#0:546@01b4263a +gie/adams_hemi.gie#0:547@6d1284dd +gie/adams_hemi.gie#0:548@7685d7fd +gie/adams_hemi.gie#0:549@2da0b2c9 +gie/adams_hemi.gie#0:550@edba51b8 +gie/adams_hemi.gie#0:551@faf2f3c9 +gie/adams_hemi.gie#0:552@d41c5ca7 +gie/adams_hemi.gie#0:553@c64e30c5 +gie/adams_hemi.gie#0:554@ee2d178c +gie/adams_hemi.gie#0:555@887d2be8 +gie/adams_hemi.gie#0:556@997e170d +gie/adams_hemi.gie#0:557@835f7a7a +gie/adams_hemi.gie#0:558@7af95c66 +gie/adams_hemi.gie#0:559@d1890de9 +gie/adams_hemi.gie#0:560@2031e325 +gie/adams_hemi.gie#0:561@9e4cda94 +gie/adams_hemi.gie#0:562@ee510d8f +gie/adams_hemi.gie#0:563@559fc406 +gie/adams_hemi.gie#0:564@27bae736 +gie/adams_hemi.gie#0:565@20ff3940 +gie/adams_hemi.gie#0:566@cf09af22 +gie/adams_hemi.gie#0:567@c5640a62 +gie/adams_hemi.gie#0:568@fc052045 +gie/adams_hemi.gie#0:569@5452eb02 +gie/adams_hemi.gie#0:570@fa0bdd57 +gie/adams_hemi.gie#0:571@798b79a3 +gie/adams_hemi.gie#0:572@ae2ac924 +gie/adams_hemi.gie#0:573@c8e6a250 +gie/adams_hemi.gie#0:574@f39f8173 +gie/adams_hemi.gie#0:575@dc048c36 +gie/adams_hemi.gie#0:576@f60565d7 +gie/adams_hemi.gie#0:577@f27afead +gie/adams_hemi.gie#0:578@89ca165a +gie/adams_hemi.gie#0:579@4f4faecd +gie/adams_hemi.gie#0:580@cc2440b3 +gie/adams_hemi.gie#0:581@e0a397e8 +gie/adams_hemi.gie#0:582@315a8d1c +gie/adams_hemi.gie#0:583@fef408a4 +gie/adams_hemi.gie#0:584@1eaa2cc1 +gie/adams_hemi.gie#0:585@ac8457c0 +gie/adams_hemi.gie#0:586@958d236e +gie/adams_hemi.gie#0:587@5eb27792 +gie/adams_hemi.gie#0:588@99f66df1 +gie/adams_hemi.gie#0:589@56e34d56 +gie/adams_hemi.gie#0:590@57639643 +gie/adams_hemi.gie#0:591@b06c6373 +gie/adams_hemi.gie#0:592@eddc074f +gie/adams_hemi.gie#0:593@15028ec0 +gie/adams_hemi.gie#0:594@91f1816a +gie/adams_hemi.gie#0:595@703adbac +gie/adams_hemi.gie#0:596@21e90290 +gie/adams_hemi.gie#0:597@68d52ad4 +gie/adams_hemi.gie#0:598@6c6ff99a +gie/adams_hemi.gie#0:599@e816a000 +gie/adams_hemi.gie#0:600@be7903ea +gie/adams_hemi.gie#0:601@4a597784 +gie/adams_hemi.gie#0:602@cc42ea74 +gie/adams_hemi.gie#0:603@a34d70d4 +gie/adams_hemi.gie#0:604@d75462a9 +gie/adams_hemi.gie#0:605@62ffe36a +gie/adams_hemi.gie#0:606@5f71a692 +gie/adams_hemi.gie#0:607@b1cfee09 +gie/adams_hemi.gie#0:608@53e9b273 +gie/adams_hemi.gie#0:609@c66300c8 +gie/adams_hemi.gie#0:610@21ac8665 +gie/adams_hemi.gie#0:611@6fe34f1a +gie/adams_hemi.gie#0:612@fd33f220 +gie/adams_hemi.gie#0:613@57791b3b +gie/adams_hemi.gie#0:614@08e2cfe4 +gie/adams_hemi.gie#0:615@193b5bc3 +gie/adams_hemi.gie#0:616@756bf62e +gie/adams_hemi.gie#0:617@c98ec77a +gie/adams_hemi.gie#0:618@5598b044 +gie/adams_hemi.gie#0:619@1a0887f7 +gie/adams_hemi.gie#0:620@0042e539 +gie/adams_hemi.gie#0:621@136f3aed +gie/adams_hemi.gie#0:622@8d492d9b +gie/adams_hemi.gie#0:623@d66ae465 +gie/adams_hemi.gie#0:624@52b7a520 +gie/adams_hemi.gie#0:625@2989557b +gie/adams_hemi.gie#0:626@4a8d1135 +gie/adams_hemi.gie#0:627@4dcd6045 +gie/adams_hemi.gie#0:628@4914560a +gie/adams_hemi.gie#0:629@0841cee6 +gie/adams_hemi.gie#0:630@d7d5fc15 +gie/adams_hemi.gie#0:631@089c37a9 +gie/adams_hemi.gie#0:632@3679e29f +gie/adams_hemi.gie#0:633@35bc2937 +gie/adams_hemi.gie#0:634@5ccbb87d +gie/adams_hemi.gie#0:635@3dc94168 +gie/adams_hemi.gie#0:636@9155068c +gie/adams_hemi.gie#0:637@71b0a651 +gie/adams_hemi.gie#0:638@15a1a0e2 +gie/adams_hemi.gie#0:639@b6d6329b +gie/adams_hemi.gie#0:640@a025d44e +gie/adams_hemi.gie#0:641@75929671 +gie/adams_hemi.gie#0:642@f9346e07 +gie/adams_hemi.gie#0:643@01d8b853 +gie/adams_hemi.gie#0:644@1286167d +gie/adams_hemi.gie#0:645@f04e7cc8 +gie/adams_hemi.gie#0:646@287032d4 +gie/adams_hemi.gie#0:647@748df9c1 +gie/adams_hemi.gie#0:648@058e8cf4 +gie/adams_hemi.gie#0:649@ac127090 +gie/adams_hemi.gie#0:650@18cd9d69 +gie/adams_hemi.gie#0:651@253fdb9f +gie/adams_hemi.gie#0:652@6d6a35c6 +gie/adams_hemi.gie#0:653@08ada05f +gie/adams_hemi.gie#0:654@82f7b071 +gie/adams_hemi.gie#0:655@235af31e +gie/adams_hemi.gie#0:656@febfda19 +gie/adams_hemi.gie#0:657@171bd262 +gie/adams_hemi.gie#0:658@3a102127 +gie/adams_hemi.gie#0:659@f43bb1cf +gie/adams_hemi.gie#0:660@3ee2bd9a +gie/adams_hemi.gie#0:661@86595bea +gie/adams_hemi.gie#0:662@a5d0ea76 +gie/adams_hemi.gie#0:663@cbdaaf06 +gie/adams_hemi.gie#0:664@dd2762b2 +gie/adams_hemi.gie#0:665@54126425 +gie/adams_hemi.gie#0:666@a43a7f45 +gie/adams_hemi.gie#0:667@4893170f +gie/adams_hemi.gie#0:668@29c2af2a +gie/adams_hemi.gie#0:669@9e96ca29 +gie/adams_hemi.gie#0:670@6e64952f +gie/adams_hemi.gie#0:671@eb9fb499 +gie/adams_hemi.gie#0:672@5650cf54 +gie/adams_hemi.gie#0:673@a8dcaaa8 +gie/adams_hemi.gie#0:674@600ea595 +gie/adams_hemi.gie#0:675@cd5ba9b1 +gie/adams_hemi.gie#0:676@f064401e +gie/adams_hemi.gie#0:677@815f13be +gie/adams_hemi.gie#0:678@d4260c49 +gie/adams_hemi.gie#0:679@510630e6 +gie/adams_hemi.gie#0:680@a9d22e55 +gie/adams_hemi.gie#0:681@ec7e79ff +gie/adams_hemi.gie#0:682@aa066286 +gie/adams_hemi.gie#0:683@c0e85304 +gie/adams_hemi.gie#0:684@634ab750 +gie/adams_hemi.gie#0:685@d260bc40 +gie/adams_hemi.gie#0:686@d99c2815 +gie/adams_hemi.gie#0:687@d66a84af +gie/adams_hemi.gie#0:688@9600cbf4 +gie/adams_hemi.gie#0:689@46fd60c7 +gie/adams_hemi.gie#0:690@fc92bb76 +gie/adams_hemi.gie#0:691@b2f32eba +gie/adams_hemi.gie#0:692@e44cf9f1 +gie/adams_hemi.gie#0:693@b6ef8390 +gie/adams_hemi.gie#0:694@529d77bc +gie/adams_hemi.gie#0:695@b1cbae80 +gie/adams_hemi.gie#0:696@a3898e2a +gie/adams_hemi.gie#0:697@dfb547cf +gie/adams_hemi.gie#0:698@0ca10504 +gie/adams_hemi.gie#0:699@13f41316 +gie/adams_hemi.gie#0:700@477e7921 +gie/adams_hemi.gie#0:701@ea70d50c +gie/adams_hemi.gie#0:702@22feef42 +gie/adams_ws1.gie#0:0@39ce5b7c +gie/adams_ws1.gie#0:1@4e52fb17 +gie/adams_ws1.gie#0:2@a3556563 +gie/adams_ws1.gie#0:3@0bee5676 +gie/adams_ws1.gie#0:4@2ddf8adf +gie/adams_ws1.gie#0:5@5050b84f +gie/adams_ws1.gie#0:6@98e4c63f +gie/adams_ws1.gie#0:7@c3ba038e +gie/adams_ws1.gie#0:8@32ac62db +gie/adams_ws1.gie#0:9@35ae21c4 +gie/adams_ws1.gie#0:10@421f6850 +gie/adams_ws1.gie#0:11@8c14b64e +gie/adams_ws1.gie#0:12@f4a120da +gie/adams_ws1.gie#0:13@79f11ff5 +gie/adams_ws1.gie#0:14@99027802 +gie/adams_ws1.gie#0:15@15841765 +gie/adams_ws1.gie#0:16@52bb2798 +gie/adams_ws1.gie#0:17@55c09d5b +gie/adams_ws1.gie#0:18@c50801f4 +gie/adams_ws1.gie#0:19@0a992499 +gie/adams_ws1.gie#0:20@eebf05c8 +gie/adams_ws1.gie#0:21@533a85d2 +gie/adams_ws1.gie#0:22@6cb82897 +gie/adams_ws1.gie#0:23@f9fce05f +gie/adams_ws1.gie#0:24@622debce +gie/adams_ws1.gie#0:25@26c97790 +gie/adams_ws1.gie#0:26@53cdec10 +gie/adams_ws1.gie#0:27@88a94e12 +gie/adams_ws1.gie#0:28@2c445085 +gie/adams_ws1.gie#0:29@03d689c6 +gie/adams_ws1.gie#0:30@7930e6cf +gie/adams_ws1.gie#0:31@c3a5ab20 +gie/adams_ws1.gie#0:32@57d909e1 +gie/adams_ws1.gie#0:33@d5b7ef21 +gie/adams_ws1.gie#0:34@5ce78f5b +gie/adams_ws1.gie#0:35@4f10fb76 +gie/adams_ws1.gie#0:36@05267b13 +gie/adams_ws1.gie#0:37@6dfd506e +gie/adams_ws1.gie#0:38@b8596223 +gie/adams_ws1.gie#0:39@e7f4e699 +gie/adams_ws1.gie#0:40@2badc1ff +gie/adams_ws1.gie#0:41@9248a42e +gie/adams_ws1.gie#0:42@463b233c +gie/adams_ws1.gie#0:43@fadaef11 +gie/adams_ws1.gie#0:44@309bf9a7 +gie/adams_ws1.gie#0:45@f60d1993 +gie/adams_ws1.gie#0:46@0c835ddb +gie/adams_ws1.gie#0:47@07869954 +gie/adams_ws1.gie#0:48@2d71bf50 +gie/adams_ws1.gie#0:49@01981f54 +gie/adams_ws1.gie#0:50@3ae0e79d +gie/adams_ws1.gie#0:51@2eb44f4d +gie/adams_ws1.gie#0:52@4af0f924 +gie/adams_ws1.gie#0:53@60a65cc2 +gie/adams_ws1.gie#0:54@578e1b15 +gie/adams_ws1.gie#0:55@1b977372 +gie/adams_ws1.gie#0:56@86422f1d +gie/adams_ws1.gie#0:57@16b6a5b4 +gie/adams_ws1.gie#0:58@489dc1bf +gie/adams_ws1.gie#0:59@e0eb3cf2 +gie/adams_ws1.gie#0:60@5dfb8d95 +gie/adams_ws1.gie#0:61@71b1a712 +gie/adams_ws1.gie#0:62@f0e50d5d +gie/adams_ws1.gie#0:63@a038a880 +gie/adams_ws1.gie#0:64@ca359c6b +gie/adams_ws1.gie#0:65@bdc445a1 +gie/adams_ws1.gie#0:66@ec813d15 +gie/adams_ws1.gie#0:67@fba63c72 +gie/adams_ws1.gie#0:68@17469295 +gie/adams_ws1.gie#0:69@35ab10be +gie/adams_ws1.gie#0:70@569b6047 +gie/adams_ws1.gie#0:71@2ab824a2 +gie/adams_ws1.gie#0:72@f53ca936 +gie/adams_ws1.gie#0:73@5df6dc3b +gie/adams_ws1.gie#0:74@74da054e +gie/adams_ws1.gie#0:75@96937ee2 +gie/adams_ws1.gie#0:76@2d86f8e1 +gie/adams_ws1.gie#0:77@67bda49c +gie/adams_ws1.gie#0:78@13222bfc +gie/adams_ws1.gie#0:79@d4df8089 +gie/adams_ws1.gie#0:80@8be58213 +gie/adams_ws1.gie#0:81@a5398ea5 +gie/adams_ws1.gie#0:82@89cd630d +gie/adams_ws1.gie#0:83@b144781a +gie/adams_ws1.gie#0:84@b283cf6b +gie/adams_ws1.gie#0:85@b95e4dab +gie/adams_ws1.gie#0:86@234975d9 +gie/adams_ws1.gie#0:87@dfc6b219 +gie/adams_ws1.gie#0:88@ec5dd4f2 +gie/adams_ws1.gie#0:89@80360bba +gie/adams_ws1.gie#0:90@54030f7b +gie/adams_ws1.gie#0:91@694cfdae +gie/adams_ws1.gie#0:92@b81e4a80 +gie/adams_ws1.gie#0:93@3d418af2 +gie/adams_ws1.gie#0:94@0d9f7246 +gie/adams_ws1.gie#0:95@2595aa28 +gie/adams_ws1.gie#0:96@9f6c6920 +gie/adams_ws1.gie#0:97@8283cdc4 +gie/adams_ws1.gie#0:98@2553e5a9 +gie/adams_ws1.gie#0:99@e6b4261b +gie/adams_ws1.gie#0:100@e4539e42 +gie/adams_ws1.gie#0:101@8d869a0e +gie/adams_ws1.gie#0:102@e9b83578 +gie/adams_ws1.gie#0:103@fdb18cf7 +gie/adams_ws1.gie#0:104@43e6ee9b +gie/adams_ws1.gie#0:105@63df9dc4 +gie/adams_ws1.gie#0:106@b630ac53 +gie/adams_ws1.gie#0:107@8333af4d +gie/adams_ws1.gie#0:108@c34b26a1 +gie/adams_ws1.gie#0:109@bfbf13cf +gie/adams_ws1.gie#0:110@515083d5 +gie/adams_ws1.gie#0:111@6d9b5d43 +gie/adams_ws1.gie#0:112@516161e9 +gie/adams_ws1.gie#0:113@5a4f4d0b +gie/adams_ws1.gie#0:114@b10a4e71 +gie/adams_ws1.gie#0:115@1ab15dd6 +gie/adams_ws1.gie#0:116@ab8ef2bb +gie/adams_ws1.gie#0:117@268847fe +gie/adams_ws1.gie#0:118@947d3b68 +gie/adams_ws1.gie#0:119@3cd9d851 +gie/adams_ws1.gie#0:120@0c679f8c +gie/adams_ws1.gie#0:121@cbfd0099 +gie/adams_ws1.gie#0:122@71ced78c +gie/adams_ws1.gie#0:123@d02ff32f +gie/adams_ws1.gie#0:124@4f23edf7 +gie/adams_ws1.gie#0:125@2048ff54 +gie/adams_ws1.gie#0:126@9d06a7c6 +gie/adams_ws1.gie#0:127@1e25648b +gie/adams_ws1.gie#0:128@b1aee023 +gie/adams_ws1.gie#0:129@6f474265 +gie/adams_ws1.gie#0:130@d1424459 +gie/adams_ws1.gie#0:131@146f3901 +gie/adams_ws1.gie#0:132@588e1119 +gie/adams_ws1.gie#0:133@71afe224 +gie/adams_ws1.gie#0:134@da36584c +gie/adams_ws1.gie#0:135@f9b28ea5 +gie/adams_ws1.gie#0:136@9e9a9cb6 +gie/adams_ws1.gie#0:137@6ff9c648 +gie/adams_ws1.gie#0:138@4615903c +gie/adams_ws1.gie#0:139@3e9975ca +gie/adams_ws1.gie#0:140@15966601 +gie/adams_ws1.gie#0:141@411bb5b2 +gie/adams_ws1.gie#0:142@d67db987 +gie/adams_ws1.gie#0:143@7fc16d8b +gie/adams_ws1.gie#0:144@caf1970b +gie/adams_ws1.gie#0:145@f0cfafbe +gie/adams_ws1.gie#0:146@a3407380 +gie/adams_ws1.gie#0:147@fa071a4c +gie/adams_ws1.gie#0:148@609451c2 +gie/adams_ws1.gie#0:149@3a2c629a +gie/adams_ws1.gie#0:150@564c06fb +gie/adams_ws1.gie#0:151@b48e1be1 +gie/adams_ws1.gie#0:152@c9846944 +gie/adams_ws1.gie#0:153@1f025fac +gie/adams_ws1.gie#0:154@24af4435 +gie/adams_ws1.gie#0:155@1c0cc327 +gie/adams_ws1.gie#0:156@672da50e +gie/adams_ws1.gie#0:157@d1c7d881 +gie/adams_ws1.gie#0:158@5692e240 +gie/adams_ws1.gie#0:159@2c39f84b +gie/adams_ws1.gie#0:160@85e7939e +gie/adams_ws1.gie#0:161@515eca00 +gie/adams_ws1.gie#0:162@38815bf0 +gie/adams_ws1.gie#0:163@a480d45e +gie/adams_ws1.gie#0:164@430d7906 +gie/adams_ws1.gie#0:165@4b710dd4 +gie/adams_ws1.gie#0:166@bdd7bbd0 +gie/adams_ws1.gie#0:167@aa19a71f +gie/adams_ws1.gie#0:168@48d77915 +gie/adams_ws1.gie#0:169@2e7abbe9 +gie/adams_ws1.gie#0:170@71c754db +gie/adams_ws1.gie#0:171@b5d4dca2 +gie/adams_ws1.gie#0:172@15285ecc +gie/adams_ws1.gie#0:173@97bf5c1f +gie/adams_ws1.gie#0:174@c8e2f99e +gie/adams_ws1.gie#0:175@1715b9f8 +gie/adams_ws1.gie#0:176@fe09a3be +gie/adams_ws1.gie#0:177@aeffab5d +gie/adams_ws1.gie#0:178@2f217598 +gie/adams_ws1.gie#0:179@aff4ac08 +gie/adams_ws1.gie#0:180@00ed088b +gie/adams_ws1.gie#0:181@bdbd6ad5 +gie/adams_ws1.gie#0:182@54f554af +gie/adams_ws1.gie#0:183@5f957bdb +gie/adams_ws1.gie#0:184@a85f64bf +gie/adams_ws1.gie#0:185@23b4cf81 +gie/adams_ws1.gie#0:186@f9fb9f8c +gie/adams_ws1.gie#0:187@59a7aa5c +gie/adams_ws1.gie#0:188@d983ab91 +gie/adams_ws1.gie#0:189@7635959b +gie/adams_ws1.gie#0:190@85cb77fb +gie/adams_ws1.gie#0:191@92ce31aa +gie/adams_ws1.gie#0:192@89ea1223 +gie/adams_ws1.gie#0:193@0830746e +gie/adams_ws1.gie#0:194@ec51fb0d +gie/adams_ws1.gie#0:195@4a130c2d +gie/adams_ws1.gie#0:196@18f9c1d7 +gie/adams_ws1.gie#0:197@585fed43 +gie/adams_ws1.gie#0:198@c9aa0901 +gie/adams_ws1.gie#0:199@6c289992 +gie/adams_ws1.gie#0:200@b5283a33 +gie/adams_ws1.gie#0:201@f11699a4 +gie/adams_ws1.gie#0:202@64c747a8 +gie/adams_ws1.gie#0:203@07953f7d +gie/adams_ws1.gie#0:204@2f872c80 +gie/adams_ws1.gie#0:205@5a29813e +gie/adams_ws1.gie#0:206@f1bc6ad6 +gie/adams_ws1.gie#0:207@7d9d308e +gie/adams_ws1.gie#0:208@69172efa +gie/adams_ws1.gie#0:209@e9d280a7 +gie/adams_ws1.gie#0:210@c9f9f20c +gie/adams_ws1.gie#0:211@c137c6c6 +gie/adams_ws1.gie#0:212@84c64e92 +gie/adams_ws1.gie#0:213@5cb338b8 +gie/adams_ws1.gie#0:214@3becc8b4 +gie/adams_ws1.gie#0:215@1a42fafa +gie/adams_ws1.gie#0:216@127ba9ae +gie/adams_ws1.gie#0:217@b1125192 +gie/adams_ws1.gie#0:218@2081ba09 +gie/adams_ws1.gie#0:219@81c90114 +gie/adams_ws1.gie#0:220@e5982ff3 +gie/adams_ws1.gie#0:221@daadd590 +gie/adams_ws1.gie#0:222@4c815aa5 +gie/adams_ws1.gie#0:223@599a9589 +gie/adams_ws1.gie#0:224@2ea12465 +gie/adams_ws1.gie#0:225@c264be8c +gie/adams_ws1.gie#0:226@dd530b1c +gie/adams_ws1.gie#0:227@ac620fa5 +gie/adams_ws1.gie#0:228@31081962 +gie/adams_ws1.gie#0:229@45266118 +gie/adams_ws1.gie#0:230@9f0d2515 +gie/adams_ws1.gie#0:231@718d8d9f +gie/adams_ws1.gie#0:232@1eeb28b4 +gie/adams_ws1.gie#0:233@3f47f170 +gie/adams_ws1.gie#0:234@c50d94f1 +gie/adams_ws1.gie#0:235@c6f3b9eb +gie/adams_ws1.gie#0:236@7a1f5fa9 +gie/adams_ws1.gie#0:237@0fa27190 +gie/adams_ws1.gie#0:238@17d544a9 +gie/adams_ws1.gie#0:239@9ab86fd5 +gie/adams_ws1.gie#0:240@55b7b045 +gie/adams_ws1.gie#0:241@faeaa48d +gie/adams_ws1.gie#0:242@0a62a1a5 +gie/adams_ws1.gie#0:243@838aa413 +gie/adams_ws1.gie#0:244@f783e1b1 +gie/adams_ws1.gie#0:245@88c83487 +gie/adams_ws1.gie#0:246@02cb7a44 +gie/adams_ws1.gie#0:247@62d89787 +gie/adams_ws1.gie#0:248@5adc1884 +gie/adams_ws1.gie#0:249@a0b4f005 +gie/adams_ws1.gie#0:250@aaf31954 +gie/adams_ws1.gie#0:251@e0b1ee57 +gie/adams_ws1.gie#0:252@800957f7 +gie/adams_ws1.gie#0:253@b20b9a3e +gie/adams_ws1.gie#0:254@8911d5e9 +gie/adams_ws1.gie#0:255@c4bdb2c5 +gie/adams_ws1.gie#0:256@cbfb5a54 +gie/adams_ws1.gie#0:257@863cad5c +gie/adams_ws1.gie#0:258@e924b2e1 +gie/adams_ws1.gie#0:259@41915bbf +gie/adams_ws1.gie#0:260@6ea00e01 +gie/adams_ws1.gie#0:261@7a75d471 +gie/adams_ws1.gie#0:262@c96f1791 +gie/adams_ws1.gie#0:263@40d6905a +gie/adams_ws1.gie#0:264@bfcb5011 +gie/adams_ws1.gie#0:265@a9c6a957 +gie/adams_ws1.gie#0:266@74c9f66b +gie/adams_ws1.gie#0:267@d16d84fe +gie/adams_ws1.gie#0:268@16eaa6ac +gie/adams_ws1.gie#0:269@2dc24537 +gie/adams_ws1.gie#0:270@00409e11 +gie/adams_ws1.gie#0:271@9c317bc4 +gie/adams_ws1.gie#0:272@2f2bfe88 +gie/adams_ws1.gie#0:273@e89dd791 +gie/adams_ws1.gie#0:274@2fc781c7 +gie/adams_ws1.gie#0:275@7df3742c +gie/adams_ws1.gie#0:276@39d65dc9 +gie/adams_ws1.gie#0:277@7820da9d +gie/adams_ws1.gie#0:278@af0a50e6 +gie/adams_ws1.gie#0:279@b41b5548 +gie/adams_ws1.gie#0:280@e6193050 +gie/adams_ws1.gie#0:281@467af5dd +gie/adams_ws1.gie#0:282@65480309 +gie/adams_ws1.gie#0:283@979964d9 +gie/adams_ws1.gie#0:284@122195d2 +gie/adams_ws1.gie#0:285@ebb26919 +gie/adams_ws1.gie#0:286@cba3858e +gie/adams_ws1.gie#0:287@c18c0d40 +gie/adams_ws1.gie#0:288@63437d3f +gie/adams_ws1.gie#0:289@13ce4c62 +gie/adams_ws1.gie#0:290@93595019 +gie/adams_ws1.gie#0:291@d9ecc02a +gie/adams_ws1.gie#0:292@44e19b4a +gie/adams_ws1.gie#0:293@b313e011 +gie/adams_ws1.gie#0:294@e92efb18 +gie/adams_ws1.gie#0:295@d9a0575e +gie/adams_ws1.gie#0:296@756b39c1 +gie/adams_ws1.gie#0:297@444d11b3 +gie/adams_ws1.gie#0:298@aa5fbb46 +gie/adams_ws1.gie#0:299@41d96796 +gie/adams_ws1.gie#0:300@ad9e6389 +gie/adams_ws1.gie#0:301@f46e1529 +gie/adams_ws1.gie#0:302@c2a184b1 +gie/adams_ws1.gie#0:303@4cc95601 +gie/adams_ws1.gie#0:304@ab00fb73 +gie/adams_ws1.gie#0:305@604a5251 +gie/adams_ws1.gie#0:306@bfa196b5 +gie/adams_ws1.gie#0:307@eb5145e7 +gie/adams_ws1.gie#0:308@567474ab +gie/adams_ws1.gie#0:309@799e1d54 +gie/adams_ws1.gie#0:310@b89fc8a7 +gie/adams_ws1.gie#0:311@9c77a100 +gie/adams_ws1.gie#0:312@5b90ba85 +gie/adams_ws1.gie#0:313@32350b0f +gie/adams_ws1.gie#0:314@e5082abd +gie/adams_ws1.gie#0:315@c44fa370 +gie/adams_ws1.gie#0:316@56338b39 +gie/adams_ws1.gie#0:317@f212efa4 +gie/adams_ws1.gie#0:318@1e6d5f7d +gie/adams_ws1.gie#0:319@b9673e56 +gie/adams_ws1.gie#0:320@8f41bfc2 +gie/adams_ws1.gie#0:321@4f076799 +gie/adams_ws1.gie#0:322@a500ef96 +gie/adams_ws1.gie#0:323@e057a7b1 +gie/adams_ws1.gie#0:324@4b4740c0 +gie/adams_ws1.gie#0:325@7d1289a4 +gie/adams_ws1.gie#0:326@80600dd2 +gie/adams_ws1.gie#0:327@ef030516 +gie/adams_ws1.gie#0:328@46144695 +gie/adams_ws1.gie#0:329@2cb43400 +gie/adams_ws1.gie#0:330@c762bb6e +gie/adams_ws1.gie#0:331@4658e2f0 +gie/adams_ws1.gie#0:332@c61fb2b5 +gie/adams_ws1.gie#0:333@693ddbac +gie/adams_ws1.gie#0:334@7e10681c +gie/adams_ws1.gie#0:335@d98d622b +gie/adams_ws1.gie#0:336@14c70d91 +gie/adams_ws1.gie#0:337@b4f3964f +gie/adams_ws1.gie#0:338@010b69a1 +gie/adams_ws1.gie#0:339@693e25d7 +gie/adams_ws1.gie#0:340@9ff3873f +gie/adams_ws1.gie#0:341@466f0e3f +gie/adams_ws1.gie#0:342@4ebbd8c9 +gie/adams_ws1.gie#0:343@91464560 +gie/adams_ws1.gie#0:344@e7b5e258 +gie/adams_ws1.gie#0:345@ad15f51d +gie/adams_ws1.gie#0:346@79bbf4d2 +gie/adams_ws1.gie#0:347@875fe25e +gie/adams_ws1.gie#0:348@0d076f70 +gie/adams_ws1.gie#0:349@381e9489 +gie/adams_ws1.gie#0:350@50fd5cfa +gie/adams_ws1.gie#0:351@9ba23532 +gie/adams_ws1.gie#0:352@0763995e +gie/adams_ws1.gie#0:353@a29314e4 +gie/adams_ws1.gie#0:354@3417286e +gie/adams_ws1.gie#0:355@e6aa747b +gie/adams_ws1.gie#0:356@87cd2b4f +gie/adams_ws1.gie#0:357@b8d513e3 +gie/adams_ws1.gie#0:358@f34db19a +gie/adams_ws1.gie#0:359@15c6eeb0 +gie/adams_ws1.gie#0:360@0d677b4c +gie/adams_ws1.gie#0:361@3a83b086 +gie/adams_ws1.gie#0:362@ba07c6c4 +gie/adams_ws1.gie#0:363@9b8742ec +gie/adams_ws1.gie#0:364@636b7981 +gie/adams_ws1.gie#0:365@6b1c2f6d +gie/adams_ws1.gie#0:366@f5f31da6 +gie/adams_ws1.gie#0:367@e9af9645 +gie/adams_ws1.gie#0:368@555a47b3 +gie/adams_ws1.gie#0:369@fb5e6bc0 +gie/adams_ws1.gie#0:370@3837f780 +gie/adams_ws1.gie#0:371@48cddc26 +gie/adams_ws1.gie#0:372@84529a7a +gie/adams_ws1.gie#0:373@6f0ba93e +gie/adams_ws1.gie#0:374@55a0bced +gie/adams_ws1.gie#0:375@7a7729b9 +gie/adams_ws1.gie#0:376@1ffd8058 +gie/adams_ws1.gie#0:377@b565bb7c +gie/adams_ws1.gie#0:378@694f4abd +gie/adams_ws1.gie#0:379@caaa2f5a +gie/adams_ws1.gie#0:380@2a385e6f +gie/adams_ws1.gie#0:381@78896c82 +gie/adams_ws1.gie#0:382@e8e54826 +gie/adams_ws1.gie#0:383@9c630bf2 +gie/adams_ws1.gie#0:384@5cc30231 +gie/adams_ws1.gie#0:385@f0ec9a5e +gie/adams_ws1.gie#0:386@ab4d00c9 +gie/adams_ws1.gie#0:387@13a96135 +gie/adams_ws1.gie#0:388@27c1c28e +gie/adams_ws1.gie#0:389@921e5b80 +gie/adams_ws1.gie#0:390@74d97ea1 +gie/adams_ws1.gie#0:391@e0daccf8 +gie/adams_ws1.gie#0:392@c2392e63 +gie/adams_ws1.gie#0:393@69bdeee3 +gie/adams_ws1.gie#0:394@a3ece261 +gie/adams_ws1.gie#0:395@3c1e322c +gie/adams_ws1.gie#0:396@cdb92f18 +gie/adams_ws1.gie#0:397@0d3a754c +gie/adams_ws1.gie#0:398@01480a3d +gie/adams_ws1.gie#0:399@05458219 +gie/adams_ws1.gie#0:400@c235e1b1 +gie/adams_ws1.gie#0:401@0e7e2338 +gie/adams_ws1.gie#0:402@4633af2c +gie/adams_ws1.gie#0:403@6b1233d0 +gie/adams_ws1.gie#0:404@d94c45bb +gie/adams_ws1.gie#0:405@f85309ca +gie/adams_ws1.gie#0:406@2620f484 +gie/adams_ws1.gie#0:407@cde2458d +gie/adams_ws1.gie#0:408@d2066a74 +gie/adams_ws1.gie#0:409@fca871a4 +gie/adams_ws1.gie#0:410@af40d29f +gie/adams_ws1.gie#0:411@9384c331 +gie/adams_ws1.gie#0:412@a4af8fe5 +gie/adams_ws1.gie#0:413@4f9468ca +gie/adams_ws1.gie#0:414@705ff24f +gie/adams_ws1.gie#0:415@cd49db1d +gie/adams_ws1.gie#0:416@4313598c +gie/adams_ws1.gie#0:417@fda674df +gie/adams_ws1.gie#0:418@6ce14146 +gie/adams_ws1.gie#0:419@382c92d6 +gie/adams_ws1.gie#0:420@7fad654b +gie/adams_ws1.gie#0:421@83332cc0 +gie/adams_ws1.gie#0:422@ca8e99a7 +gie/adams_ws1.gie#0:423@f3ba2c93 +gie/adams_ws1.gie#0:424@2d1762cd +gie/adams_ws1.gie#0:425@a9bfc788 +gie/adams_ws1.gie#0:426@55c33678 +gie/adams_ws1.gie#0:427@96127bb9 +gie/adams_ws1.gie#0:428@59a89926 +gie/adams_ws1.gie#0:429@5bf5bd89 +gie/adams_ws1.gie#0:430@63e374c6 +gie/adams_ws1.gie#0:431@ccd1d980 +gie/adams_ws1.gie#0:432@b24dbe6b +gie/adams_ws1.gie#0:433@c6c171bd +gie/adams_ws1.gie#0:434@5b091560 +gie/adams_ws1.gie#0:435@f7065c17 +gie/adams_ws1.gie#0:436@4238f8f4 +gie/adams_ws1.gie#0:437@1cdfb926 +gie/adams_ws1.gie#0:438@64dad4a6 +gie/adams_ws1.gie#0:439@eae4c2b2 +gie/adams_ws1.gie#0:440@7a2ca67c +gie/adams_ws1.gie#0:441@77935b2d +gie/adams_ws1.gie#0:442@596a2897 +gie/adams_ws1.gie#0:443@31268556 +gie/adams_ws1.gie#0:444@117db3b4 +gie/adams_ws1.gie#0:445@7c9e5b88 +gie/adams_ws1.gie#0:446@adb6d77c +gie/adams_ws1.gie#0:447@77057f84 +gie/adams_ws1.gie#0:448@d523d147 +gie/adams_ws1.gie#0:449@fbbf71d9 +gie/adams_ws1.gie#0:450@049d6159 +gie/adams_ws1.gie#0:451@e3fe7b40 +gie/adams_ws1.gie#0:452@624ae85c +gie/adams_ws1.gie#0:453@63e1baa5 +gie/adams_ws1.gie#0:454@f167e6c0 +gie/adams_ws1.gie#0:455@ce8423b8 +gie/adams_ws1.gie#0:456@909ebb73 +gie/adams_ws1.gie#0:457@10cfbfb8 +gie/adams_ws1.gie#0:458@8af7bfa0 +gie/adams_ws1.gie#0:459@65b041eb +gie/adams_ws1.gie#0:460@8f92c8e0 +gie/adams_ws1.gie#0:461@a944315f +gie/adams_ws1.gie#0:462@5716c65b +gie/adams_ws1.gie#0:463@ed926e05 +gie/adams_ws1.gie#0:464@cf537314 +gie/adams_ws1.gie#0:465@ba2b84a3 +gie/adams_ws1.gie#0:466@c9e797db +gie/adams_ws1.gie#0:467@e2429644 +gie/adams_ws1.gie#0:468@e6d5878b +gie/adams_ws1.gie#0:469@4b919941 +gie/adams_ws1.gie#0:470@4e6eb6c0 +gie/adams_ws1.gie#0:471@626d5066 +gie/adams_ws1.gie#0:472@1c4cccc1 +gie/adams_ws1.gie#0:473@9c3c106a +gie/adams_ws1.gie#0:474@423fa1c1 +gie/adams_ws1.gie#0:475@9a8e2121 +gie/adams_ws1.gie#0:476@950e3527 +gie/adams_ws1.gie#0:477@3e6c8bfa +gie/adams_ws1.gie#0:478@84d08d54 +gie/adams_ws1.gie#0:479@99cf0ccc +gie/adams_ws1.gie#0:480@e1be9d41 +gie/adams_ws1.gie#0:481@09c9378e +gie/adams_ws1.gie#0:482@f02a06c5 +gie/adams_ws1.gie#0:483@920ee2f9 +gie/adams_ws1.gie#0:484@301a0386 +gie/adams_ws1.gie#0:485@bbc366c6 +gie/adams_ws1.gie#0:486@44765e6b +gie/adams_ws1.gie#0:487@d79c8521 +gie/adams_ws1.gie#0:488@e24241e5 +gie/adams_ws1.gie#0:489@bcfabb65 +gie/adams_ws1.gie#0:490@122c4c0e +gie/adams_ws1.gie#0:491@f5f02047 +gie/adams_ws1.gie#0:492@6ef1b842 +gie/adams_ws1.gie#0:493@fcec59b1 +gie/adams_ws1.gie#0:494@82836f92 +gie/adams_ws1.gie#0:495@cb502ca8 +gie/adams_ws1.gie#0:496@3496b3f2 +gie/adams_ws1.gie#0:497@8c697850 +gie/adams_ws1.gie#0:498@a4d51ad8 +gie/adams_ws1.gie#0:499@9785dbf9 +gie/adams_ws1.gie#0:500@01878a16 +gie/adams_ws1.gie#0:501@c50ccfc3 +gie/adams_ws1.gie#0:502@74c97378 +gie/adams_ws1.gie#0:503@9a563432 +gie/adams_ws1.gie#0:504@b85df35c +gie/adams_ws1.gie#0:505@98b576be +gie/adams_ws1.gie#0:506@55f1b566 +gie/adams_ws1.gie#0:507@acf0fc47 +gie/adams_ws1.gie#0:508@48244cc4 +gie/adams_ws1.gie#0:509@dc8f7bc1 +gie/adams_ws1.gie#0:510@23f9ab4e +gie/adams_ws1.gie#0:511@94132658 +gie/adams_ws1.gie#0:512@a1c64423 +gie/adams_ws1.gie#0:513@48bd68ae +gie/adams_ws1.gie#0:514@d673f1fb +gie/adams_ws1.gie#0:515@a91f3757 +gie/adams_ws1.gie#0:516@a4ba1e61 +gie/adams_ws1.gie#0:517@8785ec19 +gie/adams_ws1.gie#0:518@6fdab604 +gie/adams_ws1.gie#0:519@c7901a2c +gie/adams_ws1.gie#0:520@a16936da +gie/adams_ws1.gie#0:521@20684242 +gie/adams_ws1.gie#0:522@2121c570 +gie/adams_ws1.gie#0:523@221d2e89 +gie/adams_ws1.gie#0:524@c6311b4a +gie/adams_ws1.gie#0:525@3ef2e17b +gie/adams_ws1.gie#0:526@a80a28eb +gie/adams_ws1.gie#0:527@0d5d0dba +gie/adams_ws1.gie#0:528@c73f0976 +gie/adams_ws1.gie#0:529@fd0e7bb9 +gie/adams_ws1.gie#0:530@d72b9d28 +gie/adams_ws1.gie#0:531@fe0f0639 +gie/adams_ws1.gie#0:532@1a8e3dbe +gie/adams_ws1.gie#0:533@f148f2c5 +gie/adams_ws1.gie#0:534@831d6415 +gie/adams_ws1.gie#0:535@9087b08c +gie/adams_ws1.gie#0:536@11e1b0cd +gie/adams_ws1.gie#0:537@a6449753 +gie/adams_ws1.gie#0:538@68bd5ae9 +gie/adams_ws1.gie#0:539@af524d86 +gie/adams_ws1.gie#0:540@9334b5d4 +gie/adams_ws1.gie#0:541@02a182a0 +gie/adams_ws1.gie#0:542@1066a6ad +gie/adams_ws1.gie#0:543@ae77a215 +gie/adams_ws1.gie#0:544@e3803d2b +gie/adams_ws1.gie#0:545@fa770591 +gie/adams_ws1.gie#0:546@4c92d192 +gie/adams_ws1.gie#0:547@b9ba572f +gie/adams_ws1.gie#0:548@621f7bfc +gie/adams_ws1.gie#0:549@a9db15d9 +gie/adams_ws1.gie#0:550@3874d4ce +gie/adams_ws1.gie#0:551@f3750fbc +gie/adams_ws1.gie#0:552@ff8a6a56 +gie/adams_ws1.gie#0:553@d789eb00 +gie/adams_ws1.gie#0:554@1638de11 +gie/adams_ws1.gie#0:555@24b6c98a +gie/adams_ws1.gie#0:556@18e0a44a +gie/adams_ws1.gie#0:557@acac80cf +gie/adams_ws1.gie#0:558@2ef0bc7d +gie/adams_ws1.gie#0:559@e50abc14 +gie/adams_ws1.gie#0:560@91f5b673 +gie/adams_ws1.gie#0:561@1b643352 +gie/adams_ws1.gie#0:562@7e8c4675 +gie/adams_ws1.gie#0:563@e1e67569 +gie/adams_ws1.gie#0:564@d192a784 +gie/adams_ws1.gie#0:565@f536a727 +gie/adams_ws1.gie#0:566@14113d59 +gie/adams_ws1.gie#0:567@cea9f06f +gie/adams_ws1.gie#0:568@d27788f2 +gie/adams_ws1.gie#0:569@9f564cc3 +gie/adams_ws1.gie#0:570@307822d5 +gie/adams_ws1.gie#0:571@3911e0b3 +gie/adams_ws1.gie#0:572@d62fc494 +gie/adams_ws1.gie#0:573@36a9754b +gie/adams_ws1.gie#0:574@af53cfbd +gie/adams_ws1.gie#0:575@4a4015f7 +gie/adams_ws1.gie#0:576@4d89c4eb +gie/adams_ws1.gie#0:577@0916e311 +gie/adams_ws1.gie#0:578@83c304e2 +gie/adams_ws1.gie#0:579@4bfde374 +gie/adams_ws1.gie#0:580@9b0256a3 +gie/adams_ws1.gie#0:581@fd510f79 +gie/adams_ws1.gie#0:582@ad9e823c +gie/adams_ws1.gie#0:583@fb8d304d +gie/adams_ws1.gie#0:584@76a7a986 +gie/adams_ws1.gie#0:585@7e6610c6 +gie/adams_ws1.gie#0:586@672bb5ba +gie/adams_ws1.gie#0:587@0a823a08 +gie/adams_ws1.gie#0:588@0eeaccfe +gie/adams_ws1.gie#0:589@b9efa32a +gie/adams_ws1.gie#0:590@7613f6e2 +gie/adams_ws1.gie#0:591@4b9e6257 +gie/adams_ws1.gie#0:592@cbb2680e +gie/adams_ws1.gie#0:593@bea918be +gie/adams_ws1.gie#0:594@2993856b +gie/adams_ws1.gie#0:595@ab2815f3 +gie/adams_ws1.gie#0:596@817d58cf +gie/adams_ws1.gie#0:597@5bc2b5ae +gie/adams_ws1.gie#0:598@42a8e576 +gie/adams_ws1.gie#0:599@6ed45043 +gie/adams_ws1.gie#0:600@688e6bdf +gie/adams_ws1.gie#0:601@bc11d562 +gie/adams_ws1.gie#0:602@5b3bc7fa +gie/adams_ws1.gie#0:603@6ef0c06d +gie/adams_ws1.gie#0:604@7da71e36 +gie/adams_ws1.gie#0:605@2ecf716c +gie/adams_ws1.gie#0:606@d8e70ff6 +gie/adams_ws1.gie#0:607@a2ccf578 +gie/adams_ws1.gie#0:608@0c4faf1e +gie/adams_ws1.gie#0:609@fd4d3566 +gie/adams_ws1.gie#0:610@77b373c3 +gie/adams_ws1.gie#0:611@0efa52ec +gie/adams_ws1.gie#0:612@8bbd346c +gie/adams_ws1.gie#0:613@f2db257a +gie/adams_ws1.gie#0:614@87579bbf +gie/adams_ws1.gie#0:615@118fd845 +gie/adams_ws1.gie#0:616@7d42f93b +gie/adams_ws1.gie#0:617@e3b6a6d7 +gie/adams_ws1.gie#0:618@3034a446 +gie/adams_ws1.gie#0:619@501fb15a +gie/adams_ws1.gie#0:620@395bb1db +gie/adams_ws1.gie#0:621@47087ec6 +gie/adams_ws1.gie#0:622@2e74ea32 +gie/adams_ws1.gie#0:623@95974901 +gie/adams_ws1.gie#0:624@9ecf73b4 +gie/adams_ws1.gie#0:625@d9e2120f +gie/adams_ws1.gie#0:626@83ead9c7 +gie/adams_ws1.gie#0:627@1ad2a37b +gie/adams_ws1.gie#0:628@292e0262 +gie/adams_ws1.gie#0:629@52cb142d +gie/adams_ws1.gie#0:630@dfe66781 +gie/adams_ws1.gie#0:631@af5aa0f1 +gie/adams_ws1.gie#0:632@7678e590 +gie/adams_ws1.gie#0:633@9194e885 +gie/adams_ws1.gie#0:634@4ece9e00 +gie/adams_ws1.gie#0:635@2ae59e65 +gie/adams_ws1.gie#0:636@5f2221c9 +gie/adams_ws1.gie#0:637@860c3327 +gie/adams_ws1.gie#0:638@c1ed597d +gie/adams_ws1.gie#0:639@a6a993eb +gie/adams_ws1.gie#0:640@602d3b5a +gie/adams_ws1.gie#0:641@9777ce47 +gie/adams_ws1.gie#0:642@64c7d756 +gie/adams_ws1.gie#0:643@78e96f60 +gie/adams_ws1.gie#0:644@e8f61825 +gie/adams_ws1.gie#0:645@49ea4349 +gie/adams_ws1.gie#0:646@46d55da9 +gie/adams_ws1.gie#0:647@44d5f533 +gie/adams_ws1.gie#0:648@220e3419 +gie/adams_ws1.gie#0:649@ae04b579 +gie/adams_ws1.gie#0:650@ff443261 +gie/adams_ws1.gie#0:651@ad8c7b25 +gie/adams_ws1.gie#0:652@2cbbc916 +gie/adams_ws1.gie#0:653@9a9d1e5a +gie/adams_ws1.gie#0:654@90449a40 +gie/adams_ws1.gie#0:655@afead2b5 +gie/adams_ws1.gie#0:656@78cb88ce +gie/adams_ws1.gie#0:657@6894759a +gie/adams_ws1.gie#0:658@508a51b5 +gie/adams_ws1.gie#0:659@6e63e515 +gie/adams_ws1.gie#0:660@eeb987a9 +gie/adams_ws1.gie#0:661@5a78067f +gie/adams_ws1.gie#0:662@a35d24c7 +gie/adams_ws1.gie#0:663@1bc2c6fb +gie/adams_ws1.gie#0:664@f4f260b8 +gie/adams_ws1.gie#0:665@212d153c +gie/adams_ws1.gie#0:666@27f7fdf6 +gie/adams_ws1.gie#0:667@7c8b87ff +gie/adams_ws1.gie#0:668@ff17c46f +gie/adams_ws1.gie#0:669@88fa5d03 +gie/adams_ws1.gie#0:670@dd08a759 +gie/adams_ws1.gie#0:671@07da7f10 +gie/adams_ws1.gie#0:672@2d2d357c +gie/adams_ws1.gie#0:673@062a1349 +gie/adams_ws1.gie#0:674@d7f84331 +gie/adams_ws1.gie#0:675@c442df51 +gie/adams_ws1.gie#0:676@2b23baf2 +gie/adams_ws1.gie#0:677@d85051c8 +gie/adams_ws1.gie#0:678@38e49857 +gie/adams_ws1.gie#0:679@6823ccce +gie/adams_ws1.gie#0:680@267728fe +gie/adams_ws1.gie#0:681@b0659dfa +gie/adams_ws1.gie#0:682@05fc7ec2 +gie/adams_ws1.gie#0:683@f65d26dc +gie/adams_ws1.gie#0:684@2ca38f3e +gie/adams_ws1.gie#0:685@f8dceed0 +gie/adams_ws1.gie#0:686@60552245 +gie/adams_ws1.gie#0:687@f7cda651 +gie/adams_ws1.gie#0:688@0d443fdc +gie/adams_ws1.gie#0:689@99989288 +gie/adams_ws1.gie#0:690@3cacd710 +gie/adams_ws1.gie#0:691@aa1ae3a2 +gie/adams_ws1.gie#0:692@65ec6d38 +gie/adams_ws1.gie#0:693@ac51a76e +gie/adams_ws1.gie#0:694@9312bbf4 +gie/adams_ws1.gie#0:695@3136fe79 +gie/adams_ws1.gie#0:696@01a75e79 +gie/adams_ws1.gie#0:697@bdf28422 +gie/adams_ws1.gie#0:698@05e3fb57 +gie/adams_ws1.gie#0:699@5247529d +gie/adams_ws1.gie#0:700@9a783f21 +gie/adams_ws1.gie#0:701@b4145879 +gie/adams_ws1.gie#0:702@ec7882f8 +gie/adams_ws2.gie#0:0@35b0d0f4 +gie/adams_ws2.gie#0:1@e185d449 +gie/adams_ws2.gie#0:2@96fe01a0 +gie/adams_ws2.gie#0:3@701b5af4 +gie/adams_ws2.gie#0:4@2e585f1c +gie/adams_ws2.gie#0:5@54c8a496 +gie/adams_ws2.gie#0:6@cbffc5f1 +gie/adams_ws2.gie#0:7@19f9290c +gie/adams_ws2.gie#0:8@f0640250 +gie/adams_ws2.gie#0:9@2fae3aac +gie/adams_ws2.gie#0:10@c3550ee7 +gie/adams_ws2.gie#0:11@eaffbf50 +gie/adams_ws2.gie#0:12@90e92986 +gie/adams_ws2.gie#0:13@2604fdfa +gie/adams_ws2.gie#0:14@c0b2e51a +gie/adams_ws2.gie#0:15@894996c6 +gie/adams_ws2.gie#0:16@d6f21cea +gie/adams_ws2.gie#0:17@503f52fc +gie/adams_ws2.gie#0:18@59be5973 +gie/adams_ws2.gie#0:19@386531d0 +gie/adams_ws2.gie#0:20@0907a6a9 +gie/adams_ws2.gie#0:21@d4e04bc8 +gie/adams_ws2.gie#0:22@4cc158e4 +gie/adams_ws2.gie#0:23@bd02b264 +gie/adams_ws2.gie#0:24@cbded0a6 +gie/adams_ws2.gie#0:25@82d89e48 +gie/adams_ws2.gie#0:26@34ee5b14 +gie/adams_ws2.gie#0:27@61881cd9 +gie/adams_ws2.gie#0:28@4195365b +gie/adams_ws2.gie#0:29@5c819138 +gie/adams_ws2.gie#0:30@5278fbe5 +gie/adams_ws2.gie#0:31@f2ec8322 +gie/adams_ws2.gie#0:32@5e04cb4d +gie/adams_ws2.gie#0:33@2e70bf06 +gie/adams_ws2.gie#0:34@61ea1259 +gie/adams_ws2.gie#0:35@5611d899 +gie/adams_ws2.gie#0:36@ab891b17 +gie/adams_ws2.gie#0:37@5623fd8c +gie/adams_ws2.gie#0:38@b66c5ae4 +gie/adams_ws2.gie#0:39@70d9cdae +gie/adams_ws2.gie#0:40@c2850445 +gie/adams_ws2.gie#0:41@9d8fe3df +gie/adams_ws2.gie#0:42@d5784c44 +gie/adams_ws2.gie#0:43@04129bbb +gie/adams_ws2.gie#0:44@fce91548 +gie/adams_ws2.gie#0:45@02f77a64 +gie/adams_ws2.gie#0:46@089d3067 +gie/adams_ws2.gie#0:47@57c54db7 +gie/adams_ws2.gie#0:48@2c87a2d3 +gie/adams_ws2.gie#0:49@73b7f5d0 +gie/adams_ws2.gie#0:50@70314f25 +gie/adams_ws2.gie#0:51@63e212b4 +gie/adams_ws2.gie#0:52@1372475e +gie/adams_ws2.gie#0:53@f94babbd +gie/adams_ws2.gie#0:54@6b9c090f +gie/adams_ws2.gie#0:55@111c7fe7 +gie/adams_ws2.gie#0:56@34f8e779 +gie/adams_ws2.gie#0:57@db5c310c +gie/adams_ws2.gie#0:58@77a33fe3 +gie/adams_ws2.gie#0:59@7ff9637a +gie/adams_ws2.gie#0:60@37e5b4f8 +gie/adams_ws2.gie#0:61@89cba2b1 +gie/adams_ws2.gie#0:62@1b6eacd8 +gie/adams_ws2.gie#0:63@3126ec1c +gie/adams_ws2.gie#0:64@952b0ac7 +gie/adams_ws2.gie#0:65@ae067533 +gie/adams_ws2.gie#0:66@00da999d +gie/adams_ws2.gie#0:67@7f6c8de8 +gie/adams_ws2.gie#0:68@1603b73b +gie/adams_ws2.gie#0:69@5b0b4d7c +gie/adams_ws2.gie#0:70@c0fa1aa2 +gie/adams_ws2.gie#0:71@fa9fc47a +gie/adams_ws2.gie#0:72@8d3fe5bd +gie/adams_ws2.gie#0:73@43861d54 +gie/adams_ws2.gie#0:74@b613ded2 +gie/adams_ws2.gie#0:75@7743fe2e +gie/adams_ws2.gie#0:76@a702e101 +gie/adams_ws2.gie#0:77@09abc093 +gie/adams_ws2.gie#0:78@ba56c77e +gie/adams_ws2.gie#0:79@36518eed +gie/adams_ws2.gie#0:80@29cfbca0 +gie/adams_ws2.gie#0:81@35ca8d51 +gie/adams_ws2.gie#0:82@b74cd1a2 +gie/adams_ws2.gie#0:83@cf6eb034 +gie/adams_ws2.gie#0:84@6868bfcf +gie/adams_ws2.gie#0:85@f768578f +gie/adams_ws2.gie#0:86@70b5e24d +gie/adams_ws2.gie#0:87@a336edeb +gie/adams_ws2.gie#0:88@2d2bf8ce +gie/adams_ws2.gie#0:89@025fac07 +gie/adams_ws2.gie#0:90@e616e6f7 +gie/adams_ws2.gie#0:91@5ec88545 +gie/adams_ws2.gie#0:92@eecc3611 +gie/adams_ws2.gie#0:93@67b87057 +gie/adams_ws2.gie#0:94@2a9add9f +gie/adams_ws2.gie#0:95@f3f700b8 +gie/adams_ws2.gie#0:96@cb869822 +gie/adams_ws2.gie#0:97@abbdcceb +gie/adams_ws2.gie#0:98@b1aa2493 +gie/adams_ws2.gie#0:99@6ffbf719 +gie/adams_ws2.gie#0:100@c232aeb1 +gie/adams_ws2.gie#0:101@d39955f9 +gie/adams_ws2.gie#0:102@ce84936a +gie/adams_ws2.gie#0:103@6c215054 +gie/adams_ws2.gie#0:104@3090ff0d +gie/adams_ws2.gie#0:105@ec817282 +gie/adams_ws2.gie#0:106@bb190f4e +gie/adams_ws2.gie#0:107@4ad4cd34 +gie/adams_ws2.gie#0:108@a6481dc1 +gie/adams_ws2.gie#0:109@097ffeff +gie/adams_ws2.gie#0:110@2ca474d7 +gie/adams_ws2.gie#0:111@aa63c047 +gie/adams_ws2.gie#0:112@c4f7fda1 +gie/adams_ws2.gie#0:113@05d2027b +gie/adams_ws2.gie#0:114@df222d61 +gie/adams_ws2.gie#0:115@d4c3dd41 +gie/adams_ws2.gie#0:116@fd36b4b8 +gie/adams_ws2.gie#0:117@98fc5418 +gie/adams_ws2.gie#0:118@f26f63d4 +gie/adams_ws2.gie#0:119@7fb85070 +gie/adams_ws2.gie#0:120@fda3cb32 +gie/adams_ws2.gie#0:121@2152140d +gie/adams_ws2.gie#0:122@acbc61cb +gie/adams_ws2.gie#0:123@2c5685c9 +gie/adams_ws2.gie#0:124@191d1f8d +gie/adams_ws2.gie#0:125@cecb9eb4 +gie/adams_ws2.gie#0:126@1ae12fcb +gie/adams_ws2.gie#0:127@77dcbe09 +gie/adams_ws2.gie#0:128@699cb63b +gie/adams_ws2.gie#0:129@ea574534 +gie/adams_ws2.gie#0:130@b00f3e3b +gie/adams_ws2.gie#0:131@a98d3d23 +gie/adams_ws2.gie#0:132@9aa5da93 +gie/adams_ws2.gie#0:133@04170433 +gie/adams_ws2.gie#0:134@9d37130c +gie/adams_ws2.gie#0:135@0fba0491 +gie/adams_ws2.gie#0:136@51f17be2 +gie/adams_ws2.gie#0:137@a8996a1e +gie/adams_ws2.gie#0:138@13bd2be5 +gie/adams_ws2.gie#0:139@b8a64f39 +gie/adams_ws2.gie#0:140@08cf7183 +gie/adams_ws2.gie#0:141@4308dd2e +gie/adams_ws2.gie#0:142@a708d294 +gie/adams_ws2.gie#0:143@466f8f84 +gie/adams_ws2.gie#0:144@3c31bef8 +gie/adams_ws2.gie#0:145@3eae780b +gie/adams_ws2.gie#0:146@825a457a +gie/adams_ws2.gie#0:147@a1763a89 +gie/adams_ws2.gie#0:148@14cbc9eb +gie/adams_ws2.gie#0:149@88ecebab +gie/adams_ws2.gie#0:150@3e2b80d3 +gie/adams_ws2.gie#0:151@6b317b0e +gie/adams_ws2.gie#0:152@fdc3acc1 +gie/adams_ws2.gie#0:153@623baabb +gie/adams_ws2.gie#0:154@3f602db8 +gie/adams_ws2.gie#0:155@fb512729 +gie/adams_ws2.gie#0:156@db14b7ef +gie/adams_ws2.gie#0:157@9235313b +gie/adams_ws2.gie#0:158@c44f9e43 +gie/adams_ws2.gie#0:159@580af70b +gie/adams_ws2.gie#0:160@caddcf17 +gie/adams_ws2.gie#0:161@17479aae +gie/adams_ws2.gie#0:162@e8764f17 +gie/adams_ws2.gie#0:163@1f80a6b6 +gie/adams_ws2.gie#0:164@5cd1f33a +gie/adams_ws2.gie#0:165@46181fe0 +gie/adams_ws2.gie#0:166@1637f883 +gie/adams_ws2.gie#0:167@fdc3475a +gie/adams_ws2.gie#0:168@3bbea696 +gie/adams_ws2.gie#0:169@fadb0991 +gie/adams_ws2.gie#0:170@07d2356e +gie/adams_ws2.gie#0:171@cc8d0976 +gie/adams_ws2.gie#0:172@9c1ae008 +gie/adams_ws2.gie#0:173@7178e500 +gie/adams_ws2.gie#0:174@583c6f2d +gie/adams_ws2.gie#0:175@8470d6e4 +gie/adams_ws2.gie#0:176@96c6a3d6 +gie/adams_ws2.gie#0:177@e944866d +gie/adams_ws2.gie#0:178@02f8962a +gie/adams_ws2.gie#0:179@a0f98a86 +gie/adams_ws2.gie#0:180@e13b106d +gie/adams_ws2.gie#0:181@68f68e0a +gie/adams_ws2.gie#0:182@0017452f +gie/adams_ws2.gie#0:183@12c36f11 +gie/adams_ws2.gie#0:184@48c47e07 +gie/adams_ws2.gie#0:185@13a93014 +gie/adams_ws2.gie#0:186@8bb83776 +gie/adams_ws2.gie#0:187@8b0c02c5 +gie/adams_ws2.gie#0:188@c645ac0c +gie/adams_ws2.gie#0:189@b89e2e25 +gie/adams_ws2.gie#0:190@dcb2bf85 +gie/adams_ws2.gie#0:191@17147215 +gie/adams_ws2.gie#0:192@e94a8a66 +gie/adams_ws2.gie#0:193@ad4a9efc +gie/adams_ws2.gie#0:194@87affa30 +gie/adams_ws2.gie#0:195@f8fc37a2 +gie/adams_ws2.gie#0:196@89ab0ae4 +gie/adams_ws2.gie#0:197@a6a98372 +gie/adams_ws2.gie#0:198@c61ef9bc +gie/adams_ws2.gie#0:199@c324bcac +gie/adams_ws2.gie#0:200@a64e3942 +gie/adams_ws2.gie#0:201@360e2535 +gie/adams_ws2.gie#0:202@058f4383 +gie/adams_ws2.gie#0:203@66eb1ab7 +gie/adams_ws2.gie#0:204@7c5a6127 +gie/adams_ws2.gie#0:205@1388959f +gie/adams_ws2.gie#0:206@c60184ee +gie/adams_ws2.gie#0:207@7dfbdd40 +gie/adams_ws2.gie#0:208@974663db +gie/adams_ws2.gie#0:209@11809ca7 +gie/adams_ws2.gie#0:210@e03ed681 +gie/adams_ws2.gie#0:211@73234071 +gie/adams_ws2.gie#0:212@abc3c577 +gie/adams_ws2.gie#0:213@e0624495 +gie/adams_ws2.gie#0:214@a8d361a9 +gie/adams_ws2.gie#0:215@819c4d82 +gie/adams_ws2.gie#0:216@7013cfa9 +gie/adams_ws2.gie#0:217@24b98975 +gie/adams_ws2.gie#0:218@06b177c1 +gie/adams_ws2.gie#0:219@0badfe26 +gie/adams_ws2.gie#0:220@ec2dc8dd +gie/adams_ws2.gie#0:221@ba736eb9 +gie/adams_ws2.gie#0:222@b4f06e43 +gie/adams_ws2.gie#0:223@3f5f02f6 +gie/adams_ws2.gie#0:224@8b99d031 +gie/adams_ws2.gie#0:225@b5fe4e4b +gie/adams_ws2.gie#0:226@51430008 +gie/adams_ws2.gie#0:227@51ec7fee +gie/adams_ws2.gie#0:228@4e7a413a +gie/adams_ws2.gie#0:229@77501efb +gie/adams_ws2.gie#0:230@1a03802d +gie/adams_ws2.gie#0:231@83dd694c +gie/adams_ws2.gie#0:232@6aa09ed0 +gie/adams_ws2.gie#0:233@db15a029 +gie/adams_ws2.gie#0:234@90e3540d +gie/adams_ws2.gie#0:235@de0018b4 +gie/adams_ws2.gie#0:236@bdf8849c +gie/adams_ws2.gie#0:237@ec893266 +gie/adams_ws2.gie#0:238@9690fc76 +gie/adams_ws2.gie#0:239@26a7ed31 +gie/adams_ws2.gie#0:240@05fed2ed +gie/adams_ws2.gie#0:241@c77e26a1 +gie/adams_ws2.gie#0:242@a7a2aea7 +gie/adams_ws2.gie#0:243@71a4db94 +gie/adams_ws2.gie#0:244@a1e5c518 +gie/adams_ws2.gie#0:245@4ab9f030 +gie/adams_ws2.gie#0:246@343e2ee6 +gie/adams_ws2.gie#0:247@88ea61d4 +gie/adams_ws2.gie#0:248@8f9d1473 +gie/adams_ws2.gie#0:249@0b33bdd9 +gie/adams_ws2.gie#0:250@c5ff71f1 +gie/adams_ws2.gie#0:251@f27577b3 +gie/adams_ws2.gie#0:252@25cfb767 +gie/adams_ws2.gie#0:253@720e3553 +gie/adams_ws2.gie#0:254@98422849 +gie/adams_ws2.gie#0:255@3c3c25d4 +gie/adams_ws2.gie#0:256@7e952ea2 +gie/adams_ws2.gie#0:257@1c892d26 +gie/adams_ws2.gie#0:258@d141ef94 +gie/adams_ws2.gie#0:259@9e2e9c34 +gie/adams_ws2.gie#0:260@98992358 +gie/adams_ws2.gie#0:261@67435750 +gie/adams_ws2.gie#0:262@1227b395 +gie/adams_ws2.gie#0:263@e229ff2e +gie/adams_ws2.gie#0:264@e33e5990 +gie/adams_ws2.gie#0:265@ff67ab04 +gie/adams_ws2.gie#0:266@be023da4 +gie/adams_ws2.gie#0:267@33f20e1f +gie/adams_ws2.gie#0:268@71eff718 +gie/adams_ws2.gie#0:269@6cc58d04 +gie/adams_ws2.gie#0:270@ff992e3c +gie/adams_ws2.gie#0:271@40f8b306 +gie/adams_ws2.gie#0:272@af43f002 +gie/adams_ws2.gie#0:273@2683ddf2 +gie/adams_ws2.gie#0:274@0c0fa49b +gie/adams_ws2.gie#0:275@e526814b +gie/adams_ws2.gie#0:276@cf28c3b9 +gie/adams_ws2.gie#0:277@48a03120 +gie/adams_ws2.gie#0:278@cb43dd30 +gie/adams_ws2.gie#0:279@e1a669e5 +gie/adams_ws2.gie#0:280@05a750ae +gie/adams_ws2.gie#0:281@21245b91 +gie/adams_ws2.gie#0:282@37fe7d9f +gie/adams_ws2.gie#0:283@943b1798 +gie/adams_ws2.gie#0:284@b50683b8 +gie/adams_ws2.gie#0:285@34ec0c89 +gie/adams_ws2.gie#0:286@206b2cd5 +gie/adams_ws2.gie#0:287@053437db +gie/adams_ws2.gie#0:288@b9a3e32d +gie/adams_ws2.gie#0:289@b6aa272a +gie/adams_ws2.gie#0:290@970aea1a +gie/adams_ws2.gie#0:291@2f93b5f1 +gie/adams_ws2.gie#0:292@c45cd166 +gie/adams_ws2.gie#0:293@76779d01 +gie/adams_ws2.gie#0:294@372cfbc1 +gie/adams_ws2.gie#0:295@dae2cc6b +gie/adams_ws2.gie#0:296@87eead0b +gie/adams_ws2.gie#0:297@7e2588e5 +gie/adams_ws2.gie#0:298@088955b5 +gie/adams_ws2.gie#0:299@60c80dfb +gie/adams_ws2.gie#0:300@9c73b1f9 +gie/adams_ws2.gie#0:301@9ecf7660 +gie/adams_ws2.gie#0:302@c8cfd5a6 +gie/adams_ws2.gie#0:303@56c15d25 +gie/adams_ws2.gie#0:304@e07fe97f +gie/adams_ws2.gie#0:305@9b8e953d +gie/adams_ws2.gie#0:306@38b93bed +gie/adams_ws2.gie#0:307@0bb20da2 +gie/adams_ws2.gie#0:308@c2e83c3f +gie/adams_ws2.gie#0:309@2f553ead +gie/adams_ws2.gie#0:310@c4d42405 +gie/adams_ws2.gie#0:311@533de288 +gie/adams_ws2.gie#0:312@f56e953a +gie/adams_ws2.gie#0:313@2ca93533 +gie/adams_ws2.gie#0:314@39c0f09a +gie/adams_ws2.gie#0:315@57811b83 +gie/adams_ws2.gie#0:316@e365413e +gie/adams_ws2.gie#0:317@81690e03 +gie/adams_ws2.gie#0:318@470831dc +gie/adams_ws2.gie#0:319@6ebc6a63 +gie/adams_ws2.gie#0:320@d6c4ac82 +gie/adams_ws2.gie#0:321@7176c165 +gie/adams_ws2.gie#0:322@af8ce573 +gie/adams_ws2.gie#0:323@471d28eb +gie/adams_ws2.gie#0:324@5b3a6e55 +gie/adams_ws2.gie#0:325@f7e52442 +gie/adams_ws2.gie#0:326@e90c920b +gie/adams_ws2.gie#0:327@46bc6a23 +gie/adams_ws2.gie#0:328@7159f979 +gie/adams_ws2.gie#0:329@3494f754 +gie/adams_ws2.gie#0:330@d12f6a84 +gie/adams_ws2.gie#0:331@e8d2229e +gie/adams_ws2.gie#0:332@63737059 +gie/adams_ws2.gie#0:333@a86648d1 +gie/adams_ws2.gie#0:334@274bc584 +gie/adams_ws2.gie#0:335@2e4ad4da +gie/adams_ws2.gie#0:336@c2f48e40 +gie/adams_ws2.gie#0:337@b142d3d0 +gie/adams_ws2.gie#0:338@2dfd28c1 +gie/adams_ws2.gie#0:339@24dcc0ff +gie/adams_ws2.gie#0:340@f7208e8d +gie/adams_ws2.gie#0:341@636368a5 +gie/adams_ws2.gie#0:342@3e350e8d +gie/adams_ws2.gie#0:343@a299c20f +gie/adams_ws2.gie#0:344@42bfca32 +gie/adams_ws2.gie#0:345@5a90da09 +gie/adams_ws2.gie#0:346@ac3086bd +gie/adams_ws2.gie#0:347@ca066984 +gie/adams_ws2.gie#0:348@a7a79ac8 +gie/adams_ws2.gie#0:349@d4dc309b +gie/adams_ws2.gie#0:350@60711711 +gie/adams_ws2.gie#0:351@42a85b84 +gie/adams_ws2.gie#0:352@a22f2307 +gie/adams_ws2.gie#0:353@d5db3383 +gie/adams_ws2.gie#0:354@af832827 +gie/adams_ws2.gie#0:355@e7202793 +gie/adams_ws2.gie#0:356@bd28d347 +gie/adams_ws2.gie#0:357@068c4ee2 +gie/adams_ws2.gie#0:358@eecf38b6 +gie/adams_ws2.gie#0:359@e063d268 +gie/adams_ws2.gie#0:360@73eec472 +gie/adams_ws2.gie#0:361@09da14cc +gie/adams_ws2.gie#0:362@9df90a31 +gie/adams_ws2.gie#0:363@616ba952 +gie/adams_ws2.gie#0:364@d3cf9e22 +gie/adams_ws2.gie#0:365@6d86cf2b +gie/adams_ws2.gie#0:366@e4548606 +gie/adams_ws2.gie#0:367@a7cfb24a +gie/adams_ws2.gie#0:368@6aab267a +gie/adams_ws2.gie#0:369@2b62acd4 +gie/adams_ws2.gie#0:370@b964bac3 +gie/adams_ws2.gie#0:371@d0912dc8 +gie/adams_ws2.gie#0:372@b3333981 +gie/adams_ws2.gie#0:373@74406aab +gie/adams_ws2.gie#0:374@a3a97788 +gie/adams_ws2.gie#0:375@203363ef +gie/adams_ws2.gie#0:376@9c2ad9fd +gie/adams_ws2.gie#0:377@960d4bca +gie/adams_ws2.gie#0:378@4bfec988 +gie/adams_ws2.gie#0:379@2137a1ee +gie/adams_ws2.gie#0:380@3c54733c +gie/adams_ws2.gie#0:381@ebcc07cb +gie/adams_ws2.gie#0:382@4f07f8e8 +gie/adams_ws2.gie#0:383@8fd92f33 +gie/adams_ws2.gie#0:384@e78c81b3 +gie/adams_ws2.gie#0:385@a55ecb5d +gie/adams_ws2.gie#0:386@0b29c26d +gie/adams_ws2.gie#0:387@a23ff9cf +gie/adams_ws2.gie#0:388@2c24baa9 +gie/adams_ws2.gie#0:389@103c4498 +gie/adams_ws2.gie#0:390@4bc61a52 +gie/adams_ws2.gie#0:391@6e2a0c9e +gie/adams_ws2.gie#0:392@245f75dc +gie/adams_ws2.gie#0:393@ac9aaeab +gie/adams_ws2.gie#0:394@833702d4 +gie/adams_ws2.gie#0:395@6965052b +gie/adams_ws2.gie#0:396@ab3f6b62 +gie/adams_ws2.gie#0:397@601b65bb +gie/adams_ws2.gie#0:398@a2b43e0c +gie/adams_ws2.gie#0:399@84efe5b6 +gie/adams_ws2.gie#0:400@1f324c40 +gie/adams_ws2.gie#0:401@239cdd69 +gie/adams_ws2.gie#0:402@3ff93dd9 +gie/adams_ws2.gie#0:403@33276745 +gie/adams_ws2.gie#0:404@38f1a1b0 +gie/adams_ws2.gie#0:405@5b43f1ab +gie/adams_ws2.gie#0:406@044844c5 +gie/adams_ws2.gie#0:407@5097ecfb +gie/adams_ws2.gie#0:408@8dacb639 +gie/adams_ws2.gie#0:409@a4c6ee23 +gie/adams_ws2.gie#0:410@c379fe97 +gie/adams_ws2.gie#0:411@a9084da3 +gie/adams_ws2.gie#0:412@1127279f +gie/adams_ws2.gie#0:413@ef425ff6 +gie/adams_ws2.gie#0:414@40e7ce5d +gie/adams_ws2.gie#0:415@48deb566 +gie/adams_ws2.gie#0:416@0ad63e9b +gie/adams_ws2.gie#0:417@5042d531 +gie/adams_ws2.gie#0:418@d4528fb6 +gie/adams_ws2.gie#0:419@3320a5ee +gie/adams_ws2.gie#0:420@d019afc1 +gie/adams_ws2.gie#0:421@2cc6b7a4 +gie/adams_ws2.gie#0:422@1895cf70 +gie/adams_ws2.gie#0:423@96631462 +gie/adams_ws2.gie#0:424@1bda9b3f +gie/adams_ws2.gie#0:425@1a047192 +gie/adams_ws2.gie#0:426@ed85063a +gie/adams_ws2.gie#0:427@70768679 +gie/adams_ws2.gie#0:428@4236c636 +gie/adams_ws2.gie#0:429@71ece3f1 +gie/adams_ws2.gie#0:430@10e4870c +gie/adams_ws2.gie#0:431@6eb1bfcb +gie/adams_ws2.gie#0:432@23711189 +gie/adams_ws2.gie#0:433@02d9c2db +gie/adams_ws2.gie#0:434@a96ecef2 +gie/adams_ws2.gie#0:435@6a626ffe +gie/adams_ws2.gie#0:436@5fd9a9a7 +gie/adams_ws2.gie#0:437@2a9527fc +gie/adams_ws2.gie#0:438@09bedf47 +gie/adams_ws2.gie#0:439@f07e6a18 +gie/adams_ws2.gie#0:440@4aa0477e +gie/adams_ws2.gie#0:441@528acdd7 +gie/adams_ws2.gie#0:442@0d6c6e58 +gie/adams_ws2.gie#0:443@d859ffcd +gie/adams_ws2.gie#0:444@10449e04 +gie/adams_ws2.gie#0:445@78135516 +gie/adams_ws2.gie#0:446@1322fb55 +gie/adams_ws2.gie#0:447@0945721e +gie/adams_ws2.gie#0:448@d3da26a2 +gie/adams_ws2.gie#0:449@9aff5be4 +gie/adams_ws2.gie#0:450@7f9b5070 +gie/adams_ws2.gie#0:451@6e1599e6 +gie/adams_ws2.gie#0:452@e22f0412 +gie/adams_ws2.gie#0:453@ab14ee40 +gie/adams_ws2.gie#0:454@f65745b4 +gie/adams_ws2.gie#0:455@fa340605 +gie/adams_ws2.gie#0:456@5681dc90 +gie/adams_ws2.gie#0:457@63f402d6 +gie/adams_ws2.gie#0:458@5c594257 +gie/adams_ws2.gie#0:459@ecc40ce1 +gie/adams_ws2.gie#0:460@c9d22683 +gie/adams_ws2.gie#0:461@deeb0b29 +gie/adams_ws2.gie#0:462@ee715da0 +gie/adams_ws2.gie#0:463@30cd68c4 +gie/adams_ws2.gie#0:464@91e98395 +gie/adams_ws2.gie#0:465@fd1ec09d +gie/adams_ws2.gie#0:466@0ce4b423 +gie/adams_ws2.gie#0:467@43ebf961 +gie/adams_ws2.gie#0:468@9fbac634 +gie/adams_ws2.gie#0:469@953fc65a +gie/adams_ws2.gie#0:470@e98ac409 +gie/adams_ws2.gie#0:471@e2c89e3c +gie/adams_ws2.gie#0:472@b4b588d8 +gie/adams_ws2.gie#0:473@34b75cda +gie/adams_ws2.gie#0:474@f9554be0 +gie/adams_ws2.gie#0:475@9a311ffd +gie/adams_ws2.gie#0:476@bddfd996 +gie/adams_ws2.gie#0:477@e5403f10 +gie/adams_ws2.gie#0:478@402d75d0 +gie/adams_ws2.gie#0:479@0e46587f +gie/adams_ws2.gie#0:480@981bc245 +gie/adams_ws2.gie#0:481@bcaed3b8 +gie/adams_ws2.gie#0:482@ee52ae84 +gie/adams_ws2.gie#0:483@97f9796e +gie/adams_ws2.gie#0:484@c0024a19 +gie/adams_ws2.gie#0:485@f935b87d +gie/adams_ws2.gie#0:486@f3f95191 +gie/adams_ws2.gie#0:487@93aac630 +gie/adams_ws2.gie#0:488@54fdb824 +gie/adams_ws2.gie#0:489@e9206e90 +gie/adams_ws2.gie#0:490@731c4a3b +gie/adams_ws2.gie#0:491@6283a70a +gie/adams_ws2.gie#0:492@c28f5248 +gie/adams_ws2.gie#0:493@998c119a +gie/adams_ws2.gie#0:494@bbf0481d +gie/adams_ws2.gie#0:495@5a8c8dee +gie/adams_ws2.gie#0:496@7a371f5e +gie/adams_ws2.gie#0:497@16fa0092 +gie/adams_ws2.gie#0:498@65adb9a8 +gie/adams_ws2.gie#0:499@832555c0 +gie/adams_ws2.gie#0:500@4e6f91cd +gie/adams_ws2.gie#0:501@34874a4d +gie/adams_ws2.gie#0:502@c8fe96f8 +gie/adams_ws2.gie#0:503@eb9600f9 +gie/adams_ws2.gie#0:504@aa124714 +gie/adams_ws2.gie#0:505@be9a8bbe +gie/adams_ws2.gie#0:506@1d845e1b +gie/adams_ws2.gie#0:507@29ed544b +gie/adams_ws2.gie#0:508@cf947b21 +gie/adams_ws2.gie#0:509@cf2b76b6 +gie/adams_ws2.gie#0:510@27559132 +gie/adams_ws2.gie#0:511@6f8c38e7 +gie/adams_ws2.gie#0:512@6e80f8ed +gie/adams_ws2.gie#0:513@d350fe62 +gie/adams_ws2.gie#0:514@4b516615 +gie/adams_ws2.gie#0:515@4bd8d1a8 +gie/adams_ws2.gie#0:516@67e2229c +gie/adams_ws2.gie#0:517@fcc52b52 +gie/adams_ws2.gie#0:518@22339b6d +gie/adams_ws2.gie#0:519@3da59135 +gie/adams_ws2.gie#0:520@454ccd4f +gie/adams_ws2.gie#0:521@9b86dfaf +gie/adams_ws2.gie#0:522@08b1fd0d +gie/adams_ws2.gie#0:523@9c206cbf +gie/adams_ws2.gie#0:524@0bd811d8 +gie/adams_ws2.gie#0:525@83a3916a +gie/adams_ws2.gie#0:526@31cbbb94 +gie/adams_ws2.gie#0:527@b25c4486 +gie/adams_ws2.gie#0:528@10631360 +gie/adams_ws2.gie#0:529@c6910413 +gie/adams_ws2.gie#0:530@4a81a54c +gie/adams_ws2.gie#0:531@47c1c942 +gie/adams_ws2.gie#0:532@d20891b2 +gie/adams_ws2.gie#0:533@33be2ce7 +gie/adams_ws2.gie#0:534@e351872c +gie/adams_ws2.gie#0:535@677fed6a +gie/adams_ws2.gie#0:536@023587a7 +gie/adams_ws2.gie#0:537@e5fe9428 +gie/adams_ws2.gie#0:538@b28c0d6c +gie/adams_ws2.gie#0:539@2bcfd149 +gie/adams_ws2.gie#0:540@6227f60c +gie/adams_ws2.gie#0:541@2ef6847f +gie/adams_ws2.gie#0:542@e51645c7 +gie/adams_ws2.gie#0:543@53835f38 +gie/adams_ws2.gie#0:544@0daab90c +gie/adams_ws2.gie#0:545@19de5aa5 +gie/adams_ws2.gie#0:546@19d3479d +gie/adams_ws2.gie#0:547@34d9072e +gie/adams_ws2.gie#0:548@fbc7131a +gie/adams_ws2.gie#0:549@e0fcf8bb +gie/adams_ws2.gie#0:550@3580d40a +gie/adams_ws2.gie#0:551@2d6d1fff +gie/adams_ws2.gie#0:552@f5fa7e64 +gie/adams_ws2.gie#0:553@9033fb2e +gie/adams_ws2.gie#0:554@768202d3 +gie/adams_ws2.gie#0:555@3f1d6497 +gie/adams_ws2.gie#0:556@77b2adba +gie/adams_ws2.gie#0:557@7dc4b7a2 +gie/adams_ws2.gie#0:558@2e061fb5 +gie/adams_ws2.gie#0:559@5f1befde +gie/adams_ws2.gie#0:560@9401e251 +gie/adams_ws2.gie#0:561@ec8a53bf +gie/adams_ws2.gie#0:562@0a91df52 +gie/adams_ws2.gie#0:563@e5b59957 +gie/adams_ws2.gie#0:564@fcc1c9f8 +gie/adams_ws2.gie#0:565@165ac119 +gie/adams_ws2.gie#0:566@6c99fc9d +gie/adams_ws2.gie#0:567@ff6ea0d6 +gie/adams_ws2.gie#0:568@85a4288d +gie/adams_ws2.gie#0:569@96103db1 +gie/adams_ws2.gie#0:570@448eee04 +gie/adams_ws2.gie#0:571@eb3e0742 +gie/adams_ws2.gie#0:572@84bacd31 +gie/adams_ws2.gie#0:573@319bf198 +gie/adams_ws2.gie#0:574@f2d79bc2 +gie/adams_ws2.gie#0:575@d2e39ef1 +gie/adams_ws2.gie#0:576@89b01db0 +gie/adams_ws2.gie#0:577@ebcd3eb1 +gie/adams_ws2.gie#0:578@922ea670 +gie/adams_ws2.gie#0:579@90a14b85 +gie/adams_ws2.gie#0:580@4ac89db2 +gie/adams_ws2.gie#0:581@168b8a9d +gie/adams_ws2.gie#0:582@048446d6 +gie/adams_ws2.gie#0:583@ec9fc304 +gie/adams_ws2.gie#0:584@e2c7d171 +gie/adams_ws2.gie#0:585@7a35959c +gie/adams_ws2.gie#0:586@2415a9c8 +gie/adams_ws2.gie#0:587@195203c9 +gie/adams_ws2.gie#0:588@07fc78fa +gie/adams_ws2.gie#0:589@b2eb3327 +gie/adams_ws2.gie#0:590@28be27d3 +gie/adams_ws2.gie#0:591@bc213d22 +gie/adams_ws2.gie#0:592@475171dc +gie/adams_ws2.gie#0:593@89556fa1 +gie/adams_ws2.gie#0:594@dd9297bb +gie/adams_ws2.gie#0:595@b7e46fc2 +gie/adams_ws2.gie#0:596@885e8f2d +gie/adams_ws2.gie#0:597@39c06f30 +gie/adams_ws2.gie#0:598@8d241f51 +gie/adams_ws2.gie#0:599@ced99cdb +gie/adams_ws2.gie#0:600@e23485a6 +gie/adams_ws2.gie#0:601@a991604e +gie/adams_ws2.gie#0:602@b6be58b6 +gie/adams_ws2.gie#0:603@5acc0fdd +gie/adams_ws2.gie#0:604@00bf70bf +gie/adams_ws2.gie#0:605@07514f22 +gie/adams_ws2.gie#0:606@149ff891 +gie/adams_ws2.gie#0:607@c64f140d +gie/adams_ws2.gie#0:608@0b1c43a1 +gie/adams_ws2.gie#0:609@ef9ad074 +gie/adams_ws2.gie#0:610@56a41619 +gie/adams_ws2.gie#0:611@c17b2ca6 +gie/adams_ws2.gie#0:612@a944a027 +gie/adams_ws2.gie#0:613@c3efd705 +gie/adams_ws2.gie#0:614@09f93989 +gie/adams_ws2.gie#0:615@6eae7c4a +gie/adams_ws2.gie#0:616@14c14c35 +gie/adams_ws2.gie#0:617@9c82152b +gie/adams_ws2.gie#0:618@fd4f62cf +gie/adams_ws2.gie#0:619@6e4d96fa +gie/adams_ws2.gie#0:620@bd67592f +gie/adams_ws2.gie#0:621@0235adc4 +gie/adams_ws2.gie#0:622@5602eefc +gie/adams_ws2.gie#0:623@758f35e6 +gie/adams_ws2.gie#0:624@c9db5b56 +gie/adams_ws2.gie#0:625@f1c44669 +gie/adams_ws2.gie#0:626@970381a3 +gie/adams_ws2.gie#0:627@68579581 +gie/adams_ws2.gie#0:628@fab33fe9 +gie/adams_ws2.gie#0:629@a67ee872 +gie/adams_ws2.gie#0:630@47b69cf5 +gie/adams_ws2.gie#0:631@c799c2cb +gie/adams_ws2.gie#0:632@20acc722 +gie/adams_ws2.gie#0:633@7912a032 +gie/adams_ws2.gie#0:634@b730c984 +gie/adams_ws2.gie#0:635@d99a44b4 +gie/adams_ws2.gie#0:636@6869767b +gie/adams_ws2.gie#0:637@6227d8b3 +gie/adams_ws2.gie#0:638@5640e540 +gie/adams_ws2.gie#0:639@79ef09a9 +gie/adams_ws2.gie#0:640@ba979716 +gie/adams_ws2.gie#0:641@0c24d19c +gie/adams_ws2.gie#0:642@873f07d8 +gie/adams_ws2.gie#0:643@8b5e89c0 +gie/adams_ws2.gie#0:644@3fed166e +gie/adams_ws2.gie#0:645@e2b33a43 +gie/adams_ws2.gie#0:646@9a591ef5 +gie/adams_ws2.gie#0:647@1ec97ea1 +gie/adams_ws2.gie#0:648@00394524 +gie/adams_ws2.gie#0:649@0e6c3901 +gie/adams_ws2.gie#0:650@9f478f0b +gie/adams_ws2.gie#0:651@27c70d8b +gie/adams_ws2.gie#0:652@ece78cdd +gie/adams_ws2.gie#0:653@679243b0 +gie/adams_ws2.gie#0:654@e0ea878a +gie/adams_ws2.gie#0:655@3f3a7d55 +gie/adams_ws2.gie#0:656@d767ff81 +gie/adams_ws2.gie#0:657@9cbfa8ea +gie/adams_ws2.gie#0:658@4adff74a +gie/adams_ws2.gie#0:659@74a50c25 +gie/adams_ws2.gie#0:660@df1bd776 +gie/adams_ws2.gie#0:661@b375eb3b +gie/adams_ws2.gie#0:662@cecab1e4 +gie/adams_ws2.gie#0:663@52631fe4 +gie/adams_ws2.gie#0:664@e7481cbe +gie/adams_ws2.gie#0:665@5362f1c6 +gie/adams_ws2.gie#0:666@7552cc6d +gie/adams_ws2.gie#0:667@a781908e +gie/adams_ws2.gie#0:668@f23a7021 +gie/adams_ws2.gie#0:669@464b5161 +gie/adams_ws2.gie#0:670@6c34c485 +gie/adams_ws2.gie#0:671@2ff918b9 +gie/adams_ws2.gie#0:672@ca4fbc2b +gie/adams_ws2.gie#0:673@910048f3 +gie/adams_ws2.gie#0:674@dac15894 +gie/adams_ws2.gie#0:675@48357466 +gie/adams_ws2.gie#0:676@065dcc7c +gie/adams_ws2.gie#0:677@1fc8a46b +gie/adams_ws2.gie#0:678@04ad0cbd +gie/adams_ws2.gie#0:679@83e6eae6 +gie/adams_ws2.gie#0:680@18387287 +gie/adams_ws2.gie#0:681@16a9ef50 +gie/adams_ws2.gie#0:682@0a088411 +gie/adams_ws2.gie#0:683@14c5847c +gie/adams_ws2.gie#0:684@f5cd58b5 +gie/adams_ws2.gie#0:685@2927bab6 +gie/adams_ws2.gie#0:686@01d6732a +gie/adams_ws2.gie#0:687@dcc68b00 +gie/adams_ws2.gie#0:688@9f44c50b +gie/adams_ws2.gie#0:689@710962a0 +gie/adams_ws2.gie#0:690@ddc10f60 +gie/adams_ws2.gie#0:691@7ed6bb51 +gie/adams_ws2.gie#0:692@284cf0db +gie/adams_ws2.gie#0:693@864c0f2c +gie/adams_ws2.gie#0:694@1acca31c +gie/adams_ws2.gie#0:695@db0e2c48 +gie/adams_ws2.gie#0:696@d91d2e69 +gie/adams_ws2.gie#0:697@87a4bcdc +gie/adams_ws2.gie#0:698@25f9f061 +gie/adams_ws2.gie#0:699@97d8b989 +gie/adams_ws2.gie#0:700@632150d7 +gie/adams_ws2.gie#0:701@d8d68fc5 +gie/adams_ws2.gie#0:702@169d1f95 +gie/adams_ws2.gie#1:0@4aeb75cf +gie/adams_ws2.gie#1:1@dd969eef +gie/adams_ws2.gie#1:2@9c877b27 +gie/adams_ws2.gie#1:3@a331bacf +gie/adams_ws2.gie#1:4@28583869 +gie/adams_ws2.gie#1:5@a98ce696 +gie/adams_ws2.gie#1:6@c412cef3 +gie/adams_ws2.gie#1:7@09b20904 +gie/adams_ws2.gie#1:8@b179962e +gie/adams_ws2.gie#1:9@b6bb3f59 +gie/adams_ws2.gie#1:10@a2d51b92 +gie/adams_ws2.gie#1:11@50b1a825 +gie/adams_ws2.gie#1:12@2bfb429a +gie/adams_ws2.gie#1:13@79606bb5 +gie/adams_ws2.gie#1:14@4f68d65e +gie/adams_ws2.gie#1:15@787b1243 +gie/adams_ws2.gie#1:16@35ee49a7 +gie/adams_ws2.gie#1:17@0015071e +gie/adams_ws2.gie#1:18@c9bc19fc +gie/axisswap.gie#0:0@11cbe4bd +gie/axisswap.gie#0:1@176fd576 +gie/axisswap.gie#1:0@270d1f76 +gie/axisswap.gie#1:1@9db9468a +gie/axisswap.gie#2:0@31b60ceb +gie/axisswap.gie#2:1@dcb3172c +gie/axisswap.gie#3:0@e6683c99 +gie/axisswap.gie#3:1@3eac3b20 +gie/axisswap.gie#4:0@cf79a663 +gie/axisswap.gie#4:1@ef224546 +gie/axisswap.gie#5:0@ea3777c3 +gie/axisswap.gie#5:1@43c45cf8 +gie/axisswap.gie#6:0@5701105b +gie/axisswap.gie#6:1@be08cf36 +gie/axisswap.gie#7:0@fc728da0 +gie/axisswap.gie#7:1@7cadfc03 +gie/axisswap.gie#8:0@2ffc11c8 +gie/axisswap.gie#9:0@db34c624 +gie/axisswap.gie#10:0@918d816e +gie/axisswap.gie#11:0@304e64b3 +gie/axisswap.gie#12:0@98d8c2a8 +gie/axisswap.gie#13:0@ed842c88 +gie/axisswap.gie#14:0@37e91b35 +gie/axisswap.gie#15:0@680e3f10 +gie/axisswap.gie#16:0@f798fdb0 +gie/axisswap.gie#17:0@239f582d +gie/axisswap.gie#18:0@21c68384 +gie/builtins.gie#0:0@94b73af1 +gie/builtins.gie#1:0@1d4f945d +gie/builtins.gie#1:1@4c0bf56f +gie/builtins.gie#1:2@426ae7e6 +gie/builtins.gie#1:3@aae9c754 +gie/builtins.gie#1:4@7760ce44 +gie/builtins.gie#1:5@71c8d9fb +gie/builtins.gie#1:6@6cb4a32a +gie/builtins.gie#1:7@799a9b84 +gie/builtins.gie#1:8@bee69b6c +gie/builtins.gie#1:9@cfe38d8f +gie/builtins.gie#2:0@ddb50951 +gie/builtins.gie#2:1@13ecb8c6 +gie/builtins.gie#2:2@49cc2b81 +gie/builtins.gie#2:3@56b80400 +gie/builtins.gie#2:4@2035b7a6 +gie/builtins.gie#2:5@f8b21d64 +gie/builtins.gie#2:6@f1ef0142 +gie/builtins.gie#2:7@49bd9ce4 +gie/builtins.gie#3:0@3b24f7ff +gie/builtins.gie#4:0@baca4349 +gie/builtins.gie#5:0@b1b78ed6 +gie/builtins.gie#6:0@c3795207 +gie/builtins.gie#7:0@a74e35cc +gie/builtins.gie#7:1@7b809a9a +gie/builtins.gie#7:2@0720213c +gie/builtins.gie#7:3@eeadd42c +gie/builtins.gie#7:4@43a3af26 +gie/builtins.gie#7:5@32646ab9 +gie/builtins.gie#7:6@42754c41 +gie/builtins.gie#7:7@26d40f86 +gie/builtins.gie#7:8@249572ee +gie/builtins.gie#7:9@2d4bad0c +gie/builtins.gie#7:10@3932d8cf +gie/builtins.gie#7:11@dd702c46 +gie/builtins.gie#7:12@fdd63698 +gie/builtins.gie#8:0@7f8fb68a +gie/builtins.gie#8:1@0e03cfa8 +gie/builtins.gie#8:2@42827be4 +gie/builtins.gie#8:3@bf5a04b0 +gie/builtins.gie#8:4@bb46d7cd +gie/builtins.gie#8:5@20a54670 +gie/builtins.gie#8:6@bb46d7cd +gie/builtins.gie#8:7@20a54670 +gie/builtins.gie#8:8@1581ada9 +gie/builtins.gie#8:9@53a9a9b6 +gie/builtins.gie#9:0@da381e9f +gie/builtins.gie#9:1@5278e984 +gie/builtins.gie#9:2@e878aebc +gie/builtins.gie#9:3@577ebbbf +gie/builtins.gie#10:0@c67384c4 +gie/builtins.gie#10:1@7aae0944 +gie/builtins.gie#10:2@822e7550 +gie/builtins.gie#10:3@4ddb8153 +gie/builtins.gie#11:0@0fea9e43 +gie/builtins.gie#11:1@d5bc5aee +gie/builtins.gie#11:2@25e30712 +gie/builtins.gie#12:0@b913b364 +gie/builtins.gie#12:1@e3aef484 +gie/builtins.gie#12:2@61d3a0e9 +gie/builtins.gie#13:0@4dc5cad5 +gie/builtins.gie#13:1@f8a10c9b +gie/builtins.gie#13:2@2874d08d +gie/builtins.gie#13:3@c6ac7204 +gie/builtins.gie#13:4@38636e35 +gie/builtins.gie#13:5@e2e2e1b5 +gie/builtins.gie#13:6@83738ba6 +gie/builtins.gie#13:7@53fded36 +gie/builtins.gie#14:0@018ef550 +gie/builtins.gie#14:1@1da0e1e0 +gie/builtins.gie#14:2@1ddf5f99 +gie/builtins.gie#14:3@e3a646d2 +gie/builtins.gie#14:4@23abe0b2 +gie/builtins.gie#14:5@daa37658 +gie/builtins.gie#14:6@53255eaa +gie/builtins.gie#14:7@755e1982 +gie/builtins.gie#15:0@9b6651b2 +gie/builtins.gie#15:1@6d8174ba +gie/builtins.gie#15:2@c504e3ca +gie/builtins.gie#15:3@8ac3f639 +gie/builtins.gie#15:4@af19dd8a +gie/builtins.gie#15:5@a9ce12c2 +gie/builtins.gie#15:6@3135e7ec +gie/builtins.gie#15:7@9a0f2526 +gie/builtins.gie#15:8@87eab388 +gie/builtins.gie#15:9@aef55870 +gie/builtins.gie#15:10@50ea4169 +gie/builtins.gie#15:11@8fe7add8 +gie/builtins.gie#15:12@65c00378 +gie/builtins.gie#16:0@776707f7 +gie/builtins.gie#16:1@763ef78f +gie/builtins.gie#16:2@f54cf18d +gie/builtins.gie#16:3@44ab0b7e +gie/builtins.gie#16:4@23782a49 +gie/builtins.gie#16:5@fb2d3b97 +gie/builtins.gie#16:6@d0b60d51 +gie/builtins.gie#16:7@fd402b8c +gie/builtins.gie#16:8@b1ab1957 +gie/builtins.gie#16:9@d807539c +gie/builtins.gie#16:10@851b0682 +gie/builtins.gie#17:0@bfc4ff3f +gie/builtins.gie#17:1@b8a7aed2 +gie/builtins.gie#17:2@35e276d9 +gie/builtins.gie#17:3@027dc381 +gie/builtins.gie#17:4@d18a2538 +gie/builtins.gie#17:5@b85281e7 +gie/builtins.gie#17:6@ead7ca3c +gie/builtins.gie#17:7@eec6920b +gie/builtins.gie#17:8@540e74ba +gie/builtins.gie#17:9@b0de72f7 +gie/builtins.gie#17:10@34fa0fa1 +gie/builtins.gie#18:0@ca647f0f +gie/builtins.gie#18:1@c0d63bc2 +gie/builtins.gie#18:2@08fca87e +gie/builtins.gie#18:3@32b10e97 +gie/builtins.gie#18:4@ead6ea22 +gie/builtins.gie#18:5@ad5dcdcd +gie/builtins.gie#18:6@4cf0860f +gie/builtins.gie#18:7@911ed9dd +gie/builtins.gie#18:8@ee549241 +gie/builtins.gie#18:9@30a3d97b +gie/builtins.gie#18:10@4003d2bd +gie/builtins.gie#18:11@404b76bf +gie/builtins.gie#19:0@bdb2d03c +gie/builtins.gie#19:1@7224318a +gie/builtins.gie#19:2@66e90cbf +gie/builtins.gie#19:3@a0525b0a +gie/builtins.gie#20:0@17e1909b +gie/builtins.gie#20:1@14507319 +gie/builtins.gie#20:2@106a8509 +gie/builtins.gie#21:0@4513af58 +gie/builtins.gie#21:1@862441fc +gie/builtins.gie#21:2@e4ec482d +gie/builtins.gie#22:0@97ace279 +gie/builtins.gie#22:1@c598c87e +gie/builtins.gie#22:2@bcd1014e +gie/builtins.gie#23:0@35b125f4 +gie/builtins.gie#24:0@349164c8 +gie/builtins.gie#25:0@a29eccf3 +gie/builtins.gie#25:1@9db106bd +gie/builtins.gie#26:0@9f73f1d7 +gie/builtins.gie#27:0@7b67695c +gie/builtins.gie#27:1@de8dd674 +gie/builtins.gie#27:2@628be9ff +gie/builtins.gie#27:3@814f3016 +gie/builtins.gie#27:4@79020095 +gie/builtins.gie#27:5@d68700a2 +gie/builtins.gie#27:6@c4e72a3c +gie/builtins.gie#27:7@3d310768 +gie/builtins.gie#28:0@882cf73d +gie/builtins.gie#28:1@67de1606 +gie/builtins.gie#28:2@3b9fe55c +gie/builtins.gie#28:3@cc10cf51 +gie/builtins.gie#28:4@593626a9 +gie/builtins.gie#28:5@0ed72f93 +gie/builtins.gie#28:6@f127ab3e +gie/builtins.gie#28:7@19f671ee +gie/builtins.gie#29:0@d3cd3445 +gie/builtins.gie#29:1@7fcc2ba9 +gie/builtins.gie#29:2@430b7e1e +gie/builtins.gie#29:3@1ecdec74 +gie/builtins.gie#29:4@1bd36a4f +gie/builtins.gie#29:5@6bb829ba +gie/builtins.gie#29:6@ca26a2fc +gie/builtins.gie#29:7@d51b0a36 +gie/builtins.gie#30:0@fa459d5d +gie/builtins.gie#30:1@9d91f51e +gie/builtins.gie#30:2@f1ea508b +gie/builtins.gie#30:3@9d7a4187 +gie/builtins.gie#31:0@2b4ed71f +gie/builtins.gie#31:1@80bfad4e +gie/builtins.gie#31:2@97323b07 +gie/builtins.gie#31:3@7064b336 +gie/builtins.gie#32:0@bf29218f +gie/builtins.gie#32:1@b97dadcd +gie/builtins.gie#32:2@bf5774c3 +gie/builtins.gie#32:3@75f88181 +gie/builtins.gie#33:0@bac21b0a +gie/builtins.gie#33:1@8b8fac86 +gie/builtins.gie#33:2@5b29a7f0 +gie/builtins.gie#33:3@e894e2c1 +gie/builtins.gie#33:4@68b135b5 +gie/builtins.gie#33:5@0342127c +gie/builtins.gie#33:6@459a8521 +gie/builtins.gie#33:7@eea87359 +gie/builtins.gie#34:0@82ba27b9 +gie/builtins.gie#34:1@f81df485 +gie/builtins.gie#34:2@c59a8665 +gie/builtins.gie#34:3@be1c4ecb +gie/builtins.gie#34:4@0988693d +gie/builtins.gie#34:5@8791fff8 +gie/builtins.gie#34:6@97a670bc +gie/builtins.gie#34:7@2b95b31c +gie/builtins.gie#35:0@3937477d +gie/builtins.gie#35:1@1975f151 +gie/builtins.gie#35:2@abf1af52 +gie/builtins.gie#35:3@2e9b335a +gie/builtins.gie#36:0@15a7a526 +gie/builtins.gie#36:1@761b80fd +gie/builtins.gie#36:2@e5712c58 +gie/builtins.gie#36:3@55eac064 +gie/builtins.gie#36:4@c155bca2 +gie/builtins.gie#36:5@7ce11e79 +gie/builtins.gie#36:6@3b30cacf +gie/builtins.gie#36:7@ebf8c41c +gie/builtins.gie#37:0@9ccfc719 +gie/builtins.gie#37:1@0d86fc44 +gie/builtins.gie#37:2@4d0c2bc3 +gie/builtins.gie#37:3@e4be3c06 +gie/builtins.gie#38:0@5e82e5d1 +gie/builtins.gie#38:1@fc309c81 +gie/builtins.gie#39:0@f77c9b74 +gie/builtins.gie#39:1@c5b3f6d3 +gie/builtins.gie#40:0@f09a75ad +gie/builtins.gie#40:1@27d3259c +gie/builtins.gie#40:2@b1b8852a +gie/builtins.gie#40:3@be46b7c6 +gie/builtins.gie#40:4@b1235039 +gie/builtins.gie#40:5@b11b44be +gie/builtins.gie#40:6@34690874 +gie/builtins.gie#40:7@f9220913 +gie/builtins.gie#41:0@8e2e945c +gie/builtins.gie#41:1@bce638d8 +gie/builtins.gie#41:2@27927a47 +gie/builtins.gie#41:3@8b96f360 +gie/builtins.gie#42:0@c925fc6a +gie/builtins.gie#42:1@57a02d1b +gie/builtins.gie#43:0@a1c048c9 +gie/builtins.gie#43:1@7f6c5b2e +gie/builtins.gie#44:0@0589b91b +gie/builtins.gie#44:1@e1d50a3d +gie/builtins.gie#44:2@74937550 +gie/builtins.gie#44:3@5b80dc1c +gie/builtins.gie#44:4@ebeb7b2f +gie/builtins.gie#44:5@64169c42 +gie/builtins.gie#44:6@adb6d58a +gie/builtins.gie#44:7@1f6546c6 +gie/builtins.gie#45:0@31d9d59e +gie/builtins.gie#45:1@9a776b91 +gie/builtins.gie#45:2@ca04df82 +gie/builtins.gie#45:3@892afcdb +gie/builtins.gie#45:4@d93cfc0c +gie/builtins.gie#45:5@2d2b89ad +gie/builtins.gie#45:6@566815ad +gie/builtins.gie#45:7@386c5871 +gie/builtins.gie#46:0@a6b2c802 +gie/builtins.gie#46:1@2abc773c +gie/builtins.gie#47:0@f95b2c6a +gie/builtins.gie#47:1@27e08059 +gie/builtins.gie#48:0@7e0eb287 +gie/builtins.gie#48:1@1a3e18aa +gie/builtins.gie#49:0@89c073ae +gie/builtins.gie#49:1@7a14967c +gie/builtins.gie#49:2@0f597aa6 +gie/builtins.gie#49:3@e3772df2 +gie/builtins.gie#49:4@536875bc +gie/builtins.gie#49:5@09779e74 +gie/builtins.gie#49:6@213a792b +gie/builtins.gie#49:7@0190c6cd +gie/builtins.gie#49:8@7cd7a620 +gie/builtins.gie#50:0@dca693a5 +gie/builtins.gie#50:1@d7108cd0 +gie/builtins.gie#50:2@02ce92f4 +gie/builtins.gie#50:3@4e5cccff +gie/builtins.gie#50:4@c5dd2642 +gie/builtins.gie#50:5@f4dad08a +gie/builtins.gie#50:6@d16f55c4 +gie/builtins.gie#50:7@89dce150 +gie/builtins.gie#51:0@cb711fe9 +gie/builtins.gie#51:1@38d79e1b +gie/builtins.gie#52:0@9f89a67e +gie/builtins.gie#52:1@22fb2913 +gie/builtins.gie#53:0@7f3cfc6e +gie/builtins.gie#53:1@173750d4 +gie/builtins.gie#54:0@cbd1584f +gie/builtins.gie#54:1@7e432cb9 +gie/builtins.gie#54:2@1beafd68 +gie/builtins.gie#54:3@9bf67b00 +gie/builtins.gie#54:4@47f59e5a +gie/builtins.gie#54:5@1d7dfe46 +gie/builtins.gie#54:6@83ddff6b +gie/builtins.gie#54:7@101b2cf9 +gie/builtins.gie#54:8@210a4fcd +gie/builtins.gie#55:0@57d7286b +gie/builtins.gie#55:1@a93e78c5 +gie/builtins.gie#55:2@7e50c0b3 +gie/builtins.gie#55:3@bf6b3cff +gie/builtins.gie#55:4@0184f4a8 +gie/builtins.gie#55:5@d4a5a302 +gie/builtins.gie#55:6@8874e54e +gie/builtins.gie#55:7@4e8a43b2 +gie/builtins.gie#56:0@153f913d +gie/builtins.gie#56:1@fdf6d815 +gie/builtins.gie#56:2@ecbeeede +gie/builtins.gie#56:3@1f47dc43 +gie/builtins.gie#56:4@9a5e30e7 +gie/builtins.gie#56:5@af987aec +gie/builtins.gie#56:6@b66cde62 +gie/builtins.gie#56:7@08479fae +gie/builtins.gie#56:8@053ff6a1 +gie/builtins.gie#56:9@5ea836bf +gie/builtins.gie#57:0@b82da7f2 +gie/builtins.gie#57:1@3de9b2bf +gie/builtins.gie#57:2@0e78f6d6 +gie/builtins.gie#57:3@f2a4387d +gie/builtins.gie#57:4@8db78042 +gie/builtins.gie#57:5@a0ec78b6 +gie/builtins.gie#57:6@88058ee1 +gie/builtins.gie#57:7@7fe0e58b +gie/builtins.gie#58:0@f39ff2c7 +gie/builtins.gie#58:1@8dcd8cdb +gie/builtins.gie#58:2@e0b52f33 +gie/builtins.gie#58:3@ad827f95 +gie/builtins.gie#59:0@83d61087 +gie/builtins.gie#59:1@f3eba7a3 +gie/builtins.gie#59:2@c4355c7c +gie/builtins.gie#59:3@1be90c65 +gie/builtins.gie#59:4@d950b2c4 +gie/builtins.gie#59:5@16afda21 +gie/builtins.gie#59:6@2602c195 +gie/builtins.gie#59:7@e1faa6fd +gie/builtins.gie#60:0@58cf40e3 +gie/builtins.gie#60:1@98e5d2f5 +gie/builtins.gie#60:2@0fe09f0e +gie/builtins.gie#60:3@206af8a9 +gie/builtins.gie#60:4@809e48ac +gie/builtins.gie#60:5@01090458 +gie/builtins.gie#60:6@151fc582 +gie/builtins.gie#60:7@94486ebf +gie/builtins.gie#61:0@21e0b370 +gie/builtins.gie#61:1@59a87007 +gie/builtins.gie#61:2@e60fd5cc +gie/builtins.gie#61:3@0608f858 +gie/builtins.gie#61:4@bdc40f58 +gie/builtins.gie#61:5@9c627c95 +gie/builtins.gie#61:6@0b001914 +gie/builtins.gie#61:7@385f7954 +gie/builtins.gie#62:0@95ac1883 +gie/builtins.gie#62:1@f4e2686a +gie/builtins.gie#62:2@9d6c1ca3 +gie/builtins.gie#62:3@cfd7484a +gie/builtins.gie#63:0@b16ec002 +gie/builtins.gie#63:1@ac5e8d27 +gie/builtins.gie#63:2@7f79bab2 +gie/builtins.gie#63:3@112a9544 +gie/builtins.gie#63:4@fb1e85ee +gie/builtins.gie#63:5@f844e2e3 +gie/builtins.gie#63:6@e28925bc +gie/builtins.gie#63:7@5b100965 +gie/builtins.gie#63:8@32f3ec5c +gie/builtins.gie#63:9@0cdc7725 +gie/builtins.gie#63:10@1fa7219c +gie/builtins.gie#63:11@cb7ed245 +gie/builtins.gie#63:12@87840ab8 +gie/builtins.gie#63:13@6b544771 +gie/builtins.gie#63:14@8517344e +gie/builtins.gie#63:15@86f9dc06 +gie/builtins.gie#63:16@9b9309fe +gie/builtins.gie#63:17@d9c82926 +gie/builtins.gie#63:18@349ac54c +gie/builtins.gie#63:19@9c27ed45 +gie/builtins.gie#63:20@9e94583c +gie/builtins.gie#63:21@659603e1 +gie/builtins.gie#63:22@24a11ffe +gie/builtins.gie#63:23@6527d587 +gie/builtins.gie#63:24@2bd2321e +gie/builtins.gie#63:25@1a89fce2 +gie/builtins.gie#63:26@925787a0 +gie/builtins.gie#63:27@9e4880b5 +gie/builtins.gie#63:28@ee63c8aa +gie/builtins.gie#63:29@05f40968 +gie/builtins.gie#63:30@29eb270c +gie/builtins.gie#63:31@983c2853 +gie/builtins.gie#63:32@c9d110c8 +gie/builtins.gie#63:33@78f612a7 +gie/builtins.gie#63:34@4cea0741 +gie/builtins.gie#63:35@c660ea7a +gie/builtins.gie#63:36@953bd980 +gie/builtins.gie#63:37@ec9b393c +gie/builtins.gie#63:38@690792d1 +gie/builtins.gie#63:39@07aed053 +gie/builtins.gie#63:40@4c96f7c1 +gie/builtins.gie#63:41@bae4d28e +gie/builtins.gie#63:42@0feed023 +gie/builtins.gie#63:43@95139823 +gie/builtins.gie#63:44@d44fb456 +gie/builtins.gie#63:45@0f1d8882 +gie/builtins.gie#63:46@f37f0bcf +gie/builtins.gie#64:0@c1992dc3 +gie/builtins.gie#64:1@95926a08 +gie/builtins.gie#64:2@10791eff +gie/builtins.gie#64:3@ecbe3f95 +gie/builtins.gie#64:4@5fc9dc3b +gie/builtins.gie#64:5@1544bc70 +gie/builtins.gie#64:6@eb2d8835 +gie/builtins.gie#64:7@b4d72ef4 +gie/builtins.gie#64:8@81e3bcc0 +gie/builtins.gie#64:9@4b562f5f +gie/builtins.gie#64:10@7d064c0f +gie/builtins.gie#64:11@0fe91d14 +gie/builtins.gie#64:12@97c8c674 +gie/builtins.gie#64:13@39614319 +gie/builtins.gie#64:14@aa2250c4 +gie/builtins.gie#64:15@10d3c1c1 +gie/builtins.gie#64:16@4967888a +gie/builtins.gie#64:17@4c895d78 +gie/builtins.gie#64:18@5b5ee374 +gie/builtins.gie#64:19@d5f5769f +gie/builtins.gie#64:20@a6f85992 +gie/builtins.gie#64:21@fde6419f +gie/builtins.gie#64:22@f14363e5 +gie/builtins.gie#64:23@de19a2a2 +gie/builtins.gie#64:24@f9606891 +gie/builtins.gie#64:25@ba8a1e8b +gie/builtins.gie#64:26@4b84b2dc +gie/builtins.gie#64:27@5778c9de +gie/builtins.gie#64:28@da43940d +gie/builtins.gie#64:29@45f22dd1 +gie/builtins.gie#64:30@6cfd7283 +gie/builtins.gie#64:31@b5673dd8 +gie/builtins.gie#64:32@cc97d089 +gie/builtins.gie#64:33@726ac9e8 +gie/builtins.gie#64:34@0cb04626 +gie/builtins.gie#64:35@7e277ea6 +gie/builtins.gie#64:36@b55c46ed +gie/builtins.gie#64:37@d08b3b4d +gie/builtins.gie#64:38@97f1f317 +gie/builtins.gie#64:39@9475ea18 +gie/builtins.gie#64:40@790e171c +gie/builtins.gie#64:41@d9bd0bc5 +gie/builtins.gie#64:42@3ee5a21b +gie/builtins.gie#64:43@7bd78c9f +gie/builtins.gie#64:44@bc26f031 +gie/builtins.gie#64:45@2260fc74 +gie/builtins.gie#64:46@812a1e80 +gie/builtins.gie#65:0@a18f5186 +gie/builtins.gie#65:1@e404b242 +gie/builtins.gie#65:2@2e752dc8 +gie/builtins.gie#65:3@828c8dd0 +gie/builtins.gie#65:4@c3c3d5f8 +gie/builtins.gie#65:5@1afc2ec4 +gie/builtins.gie#65:6@b5f0a286 +gie/builtins.gie#65:7@14aecf56 +gie/builtins.gie#66:0@1ee7c45a +gie/builtins.gie#66:1@7ded1b41 +gie/builtins.gie#66:2@b28eceeb +gie/builtins.gie#66:3@6912e354 +gie/builtins.gie#66:4@80b0ab9a +gie/builtins.gie#66:5@3d3517f6 +gie/builtins.gie#66:6@a31dc14a +gie/builtins.gie#66:7@94185ae9 +gie/builtins.gie#67:0@ce5e5837 +gie/builtins.gie#67:1@136d1a68 +gie/builtins.gie#67:2@b655669c +gie/builtins.gie#67:3@612e7a3c +gie/builtins.gie#67:4@378ae36b +gie/builtins.gie#67:5@36b915d7 +gie/builtins.gie#67:6@a9c8d545 +gie/builtins.gie#67:7@96996fd8 +gie/builtins.gie#68:0@ca33c3b9 +gie/builtins.gie#68:1@48db3fb8 +gie/builtins.gie#68:2@6effe1fd +gie/builtins.gie#68:3@7e7e8d42 +gie/builtins.gie#68:4@1254873e +gie/builtins.gie#68:5@23e2735e +gie/builtins.gie#68:6@9cd80d57 +gie/builtins.gie#68:7@2214ba49 +gie/builtins.gie#68:8@743b69a5 +gie/builtins.gie#68:9@3acea643 +gie/builtins.gie#68:10@7dd5ba02 +gie/builtins.gie#68:11@4ff45f09 +gie/builtins.gie#68:12@d9d56591 +gie/builtins.gie#68:13@1aac753a +gie/builtins.gie#68:14@d3862455 +gie/builtins.gie#68:15@49cb3f6a +gie/builtins.gie#68:16@562fca37 +gie/builtins.gie#68:17@76acba30 +gie/builtins.gie#68:18@e8491f18 +gie/builtins.gie#68:19@be89713d +gie/builtins.gie#68:20@60be0dee +gie/builtins.gie#68:21@0baf5302 +gie/builtins.gie#68:22@61273acb +gie/builtins.gie#68:23@bfbb16db +gie/builtins.gie#68:24@4c81f4bc +gie/builtins.gie#68:25@b8090592 +gie/builtins.gie#68:26@8852bfc8 +gie/builtins.gie#68:27@83037e42 +gie/builtins.gie#69:0@0dc61a20 +gie/builtins.gie#69:1@111d589d +gie/builtins.gie#69:2@173b0093 +gie/builtins.gie#69:3@d3cf3ddf +gie/builtins.gie#69:4@165be63b +gie/builtins.gie#69:5@177d815e +gie/builtins.gie#69:6@9cf66d22 +gie/builtins.gie#69:7@12860475 +gie/builtins.gie#70:0@69a71dda +gie/builtins.gie#70:1@158fb9ee +gie/builtins.gie#70:2@e9de6790 +gie/builtins.gie#70:3@5509cc51 +gie/builtins.gie#70:4@0d17c404 +gie/builtins.gie#70:5@94cadec3 +gie/builtins.gie#70:6@3bb50c64 +gie/builtins.gie#70:7@96d7c5f1 +gie/builtins.gie#71:0@19addee2 +gie/builtins.gie#71:1@93aa4644 +gie/builtins.gie#71:2@0c2d75e1 +gie/builtins.gie#71:3@7e4a6387 +gie/builtins.gie#71:4@baa36039 +gie/builtins.gie#71:5@f99403e2 +gie/builtins.gie#71:6@7e4ce021 +gie/builtins.gie#71:7@af20aa25 +gie/builtins.gie#72:0@8ce7f35e +gie/builtins.gie#72:1@a5a3f34c +gie/builtins.gie#73:0@94aec433 +gie/builtins.gie#73:1@1f22480a +gie/builtins.gie#74:0@ed8ba02f +gie/builtins.gie#74:1@1b6342fd +gie/builtins.gie#74:2@3126fec4 +gie/builtins.gie#74:3@24dd84b8 +gie/builtins.gie#74:4@cd8ce9e1 +gie/builtins.gie#74:5@7dc09990 +gie/builtins.gie#74:6@128c8664 +gie/builtins.gie#74:7@8f19cc04 +gie/builtins.gie#74:8@3b51c0c8 +gie/builtins.gie#74:9@6e590248 +gie/builtins.gie#75:0@2508e6d0 +gie/builtins.gie#75:1@68ab61eb +gie/builtins.gie#75:2@ef0b706c +gie/builtins.gie#75:3@c05e73de +gie/builtins.gie#75:4@1bfac661 +gie/builtins.gie#75:5@0feab6e8 +gie/builtins.gie#76:0@5b744a59 +gie/builtins.gie#76:1@cd15c043 +gie/builtins.gie#76:2@2bfe5484 +gie/builtins.gie#76:3@1a467afe +gie/builtins.gie#76:4@a6d4d0be +gie/builtins.gie#76:5@2feb65cb +gie/builtins.gie#77:0@80db10e5 +gie/builtins.gie#77:1@3d875b6c +gie/builtins.gie#77:2@4866e736 +gie/builtins.gie#77:3@4c3f9817 +gie/builtins.gie#77:4@895252cb +gie/builtins.gie#77:5@d6ece070 +gie/builtins.gie#77:6@5de7197d +gie/builtins.gie#77:7@79055575 +gie/builtins.gie#78:0@af6310d4 +gie/builtins.gie#78:1@340d8e23 +gie/builtins.gie#78:2@34ac9d4b +gie/builtins.gie#78:3@593e0a0f +gie/builtins.gie#78:4@9cce7037 +gie/builtins.gie#78:5@ff3f5701 +gie/builtins.gie#78:6@ad66e177 +gie/builtins.gie#78:7@329db973 +gie/builtins.gie#79:0@8fbb1b18 +gie/builtins.gie#80:0@095626e0 +gie/builtins.gie#81:0@03e73043 +gie/builtins.gie#82:0@0a943ae1 +gie/builtins.gie#83:0@24233bde +gie/builtins.gie#84:0@3b67a0d2 +gie/builtins.gie#85:0@cfe527c7 +gie/builtins.gie#85:1@f8703b3d +gie/builtins.gie#85:2@0468b0bd +gie/builtins.gie#85:3@84c33c70 +gie/builtins.gie#85:4@aa55b3a9 +gie/builtins.gie#85:5@2e8ca1a0 +gie/builtins.gie#85:6@5899e9da +gie/builtins.gie#85:7@ea7d8fe8 +gie/builtins.gie#86:0@e378fc2d +gie/builtins.gie#86:1@40355351 +gie/builtins.gie#86:2@9ce305eb +gie/builtins.gie#86:3@5d8d82ea +gie/builtins.gie#86:4@7cf646ca +gie/builtins.gie#86:5@da3fff8a +gie/builtins.gie#86:6@04f38890 +gie/builtins.gie#86:7@65ed7297 +gie/builtins.gie#87:0@acdb87f1 +gie/builtins.gie#87:1@aa0480ca +gie/builtins.gie#87:2@2f36501d +gie/builtins.gie#87:3@9d1a8a9f +gie/builtins.gie#87:4@d4817c62 +gie/builtins.gie#87:5@87d13d7f +gie/builtins.gie#87:6@cc8ef080 +gie/builtins.gie#87:7@337d1953 +gie/builtins.gie#87:8@0e77b372 +gie/builtins.gie#87:9@4ee9e678 +gie/builtins.gie#87:10@6016ffd7 +gie/builtins.gie#87:11@fb5e2d34 +gie/builtins.gie#88:0@297efe3d +gie/builtins.gie#88:1@1bfafa50 +gie/builtins.gie#88:2@a725edb6 +gie/builtins.gie#88:3@ed17b178 +gie/builtins.gie#88:4@0f700843 +gie/builtins.gie#88:5@b95a9e99 +gie/builtins.gie#88:6@ff3045d5 +gie/builtins.gie#88:7@008a2479 +gie/builtins.gie#89:0@2681726a +gie/builtins.gie#89:1@6fa3065c +gie/builtins.gie#89:2@462316cd +gie/builtins.gie#89:3@682de169 +gie/builtins.gie#89:4@7a91feed +gie/builtins.gie#89:5@f6894438 +gie/builtins.gie#89:6@ec24769c +gie/builtins.gie#89:7@0516c282 +gie/builtins.gie#90:0@a3aa2188 +gie/builtins.gie#90:1@40668e07 +gie/builtins.gie#90:2@bfc927d5 +gie/builtins.gie#90:3@6255383b +gie/builtins.gie#90:4@55c3ee58 +gie/builtins.gie#90:5@0a522fe2 +gie/builtins.gie#90:6@1d5a3b6a +gie/builtins.gie#90:7@b0ac8c4c +gie/builtins.gie#91:0@a84e0055 +gie/builtins.gie#91:1@c7827b71 +gie/builtins.gie#91:2@a5e6c2e7 +gie/builtins.gie#91:3@90ebbd93 +gie/builtins.gie#91:4@b4800167 +gie/builtins.gie#91:5@b3df62d5 +gie/builtins.gie#91:6@7adb6042 +gie/builtins.gie#91:7@8b877d5e +gie/builtins.gie#92:0@fe7c5ad0 +gie/builtins.gie#92:1@588bc4de +gie/builtins.gie#92:2@c8713679 +gie/builtins.gie#92:3@11156801 +gie/builtins.gie#92:4@c6231c47 +gie/builtins.gie#92:5@9dae3f87 +gie/builtins.gie#92:6@5ccbd551 +gie/builtins.gie#92:7@9f5669e3 +gie/builtins.gie#93:0@95c69d7a +gie/builtins.gie#93:1@e3a57d9f +gie/builtins.gie#93:2@b78bfe03 +gie/builtins.gie#93:3@774b6156 +gie/builtins.gie#93:4@262aac0a +gie/builtins.gie#95:0@15bba71d +gie/builtins.gie#95:1@b3ffa78c +gie/builtins.gie#95:2@9482acba +gie/builtins.gie#95:3@cd8a7dce +gie/builtins.gie#95:4@5e1fcb54 +gie/builtins.gie#95:5@cd786dac +gie/builtins.gie#95:6@930d6503 +gie/builtins.gie#95:7@e698c274 +gie/builtins.gie#96:0@164f91ff +gie/builtins.gie#96:1@bf6e5c26 +gie/builtins.gie#96:2@667ffc4c +gie/builtins.gie#96:3@1bd0fc63 +gie/builtins.gie#96:4@0c4a0374 +gie/builtins.gie#96:5@c64640e6 +gie/builtins.gie#96:6@5358e9eb +gie/builtins.gie#96:7@6c2d012a +gie/builtins.gie#97:0@bdd00ad4 +gie/builtins.gie#98:0@e6acbfe7 +gie/builtins.gie#99:0@3f55558b +gie/builtins.gie#99:1@dab0cef9 +gie/builtins.gie#99:2@5b02d8ae +gie/builtins.gie#99:3@64f763e4 +gie/builtins.gie#100:0@89b36c92 +gie/builtins.gie#100:1@66f47199 +gie/builtins.gie#100:2@9e58a210 +gie/builtins.gie#100:3@ce7a1104 +gie/builtins.gie#100:4@0a80c444 +gie/builtins.gie#100:5@5fd4c5d3 +gie/builtins.gie#100:6@c15e656f +gie/builtins.gie#100:7@c051f8da +gie/builtins.gie#101:0@8e786abc +gie/builtins.gie#101:1@8e0c9432 +gie/builtins.gie#101:2@d9ec8c6c +gie/builtins.gie#101:3@2fc762f4 +gie/builtins.gie#101:4@a0929a0d +gie/builtins.gie#101:5@418d3417 +gie/builtins.gie#101:6@c7af21ce +gie/builtins.gie#101:7@678dcdec +gie/builtins.gie#101:8@7ad8e5b7 +gie/builtins.gie#101:9@b737f4e4 +gie/builtins.gie#101:10@c43c5547 +gie/builtins.gie#101:11@f1a2f003 +gie/builtins.gie#101:12@e6bbd6c5 +gie/builtins.gie#101:13@6feed40d +gie/builtins.gie#101:14@4a65eeb1 +gie/builtins.gie#101:15@92aa0cc1 +gie/builtins.gie#101:16@ea91f6bb +gie/builtins.gie#101:17@72c3ce01 +gie/builtins.gie#101:18@07287288 +gie/builtins.gie#101:19@36793968 +gie/builtins.gie#101:20@7567e6c1 +gie/builtins.gie#101:21@62934f37 +gie/builtins.gie#102:0@fb24a57b +gie/builtins.gie#102:1@01308780 +gie/builtins.gie#102:2@6a81f9c1 +gie/builtins.gie#102:3@a005db9d +gie/builtins.gie#102:4@e2909f60 +gie/builtins.gie#102:5@7944a7d1 +gie/builtins.gie#102:6@feebb7d1 +gie/builtins.gie#102:7@b18c681a +gie/builtins.gie#102:8@c9dbc4a4 +gie/builtins.gie#102:9@d0347ca2 +gie/builtins.gie#102:10@1393638b +gie/builtins.gie#102:11@d57c7dba +gie/builtins.gie#102:12@b8cf9672 +gie/builtins.gie#102:13@0a5e049e +gie/builtins.gie#102:14@e0791f6a +gie/builtins.gie#102:15@eea997df +gie/builtins.gie#102:16@65d32a50 +gie/builtins.gie#102:17@b85b1aac +gie/builtins.gie#102:18@49ff7239 +gie/builtins.gie#102:19@35f1a48e +gie/builtins.gie#102:20@8354bacb +gie/builtins.gie#102:21@8bc94e46 +gie/builtins.gie#102:22@bf97bc25 +gie/builtins.gie#102:23@82c9998c +gie/builtins.gie#103:0@a92b959b +gie/builtins.gie#103:1@be158cac +gie/builtins.gie#103:2@a6b2a874 +gie/builtins.gie#103:3@1bb4bf90 +gie/builtins.gie#103:4@e2db3e17 +gie/builtins.gie#103:5@72181497 +gie/builtins.gie#104:0@9cdc2510 +gie/builtins.gie#104:1@e984aa4a +gie/builtins.gie#104:2@7b00bb4a +gie/builtins.gie#104:3@9fac453f +gie/builtins.gie#104:4@8be37b0a +gie/builtins.gie#104:5@98f9d2f2 +gie/builtins.gie#104:6@ab28174e +gie/builtins.gie#104:7@c36ee794 +gie/builtins.gie#104:8@451682b2 +gie/builtins.gie#104:9@66ced143 +gie/builtins.gie#105:0@683fbd8f +gie/builtins.gie#105:1@10e0334d +gie/builtins.gie#105:2@83d47a73 +gie/builtins.gie#105:3@ab117119 +gie/builtins.gie#105:4@9bb78efc +gie/builtins.gie#105:5@cdab7898 +gie/builtins.gie#106:0@1e952ca5 +gie/builtins.gie#106:1@512f3434 +gie/builtins.gie#106:2@0f5e1799 +gie/builtins.gie#106:3@7aa15a62 +gie/builtins.gie#106:4@b8c48c03 +gie/builtins.gie#106:5@296c5e2f +gie/builtins.gie#106:6@a9355dc1 +gie/builtins.gie#106:7@c5e815b5 +gie/builtins.gie#106:8@3dfdc3fc +gie/builtins.gie#106:9@112bea35 +gie/builtins.gie#107:0@cf77eef5 +gie/builtins.gie#107:1@809c14c7 +gie/builtins.gie#107:2@b120e169 +gie/builtins.gie#107:3@326e39c1 +gie/builtins.gie#107:4@88b0b943 +gie/builtins.gie#107:5@94b8ebc5 +gie/builtins.gie#107:6@657dff4b +gie/builtins.gie#108:0@3ba2d28f +gie/builtins.gie#108:1@74fc001a +gie/builtins.gie#108:2@9d506481 +gie/builtins.gie#108:3@30d8a5e3 +gie/builtins.gie#108:4@f66bfd3f +gie/builtins.gie#108:5@9c0d445d +gie/builtins.gie#108:6@0eb3d266 +gie/builtins.gie#108:7@f0f2fb76 +gie/builtins.gie#108:8@cadbe303 +gie/builtins.gie#109:0@a05861a3 +gie/builtins.gie#109:1@2b3b9e5d +gie/builtins.gie#109:2@d9448a29 +gie/builtins.gie#109:3@37ae35d8 +gie/builtins.gie#109:4@abdc9292 +gie/builtins.gie#109:5@069c70c1 +gie/builtins.gie#109:6@26d314e7 +gie/builtins.gie#109:7@99af9d62 +gie/builtins.gie#110:0@93cbb718 +gie/builtins.gie#110:1@28fba19e +gie/builtins.gie#110:2@8ff6689d +gie/builtins.gie#110:3@87a658ac +gie/builtins.gie#110:4@f0be7ccc +gie/builtins.gie#110:5@73702f90 +gie/builtins.gie#110:6@026efd38 +gie/builtins.gie#110:7@ca05fb4a +gie/builtins.gie#111:0@6a7307d4 +gie/builtins.gie#111:1@feb79b8f +gie/builtins.gie#111:2@9c317473 +gie/builtins.gie#111:3@50a2e408 +gie/builtins.gie#111:4@89463768 +gie/builtins.gie#111:5@49bfada0 +gie/builtins.gie#111:6@9d58a070 +gie/builtins.gie#111:7@bf92ab19 +gie/builtins.gie#112:0@f06b9e1b +gie/builtins.gie#112:1@b655a0b7 +gie/builtins.gie#112:2@8679d4d9 +gie/builtins.gie#112:3@bb934f9e +gie/builtins.gie#112:4@b066ef2c +gie/builtins.gie#112:5@5af3c45f +gie/builtins.gie#112:6@a7aeeb0f +gie/builtins.gie#112:7@73c4de65 +gie/builtins.gie#113:0@4728b1de +gie/builtins.gie#113:1@4849d3e6 +gie/builtins.gie#113:2@57be9324 +gie/builtins.gie#113:3@6fd19903 +gie/builtins.gie#113:4@1668e607 +gie/builtins.gie#113:5@a04f0641 +gie/builtins.gie#113:6@86bc748a +gie/builtins.gie#113:7@f921586c +gie/builtins.gie#114:0@7f7920c5 +gie/builtins.gie#115:0@cfd4ade9 +gie/builtins.gie#115:1@de30f72c +gie/builtins.gie#115:2@2fe3c8c5 +gie/builtins.gie#115:3@e3c0cc03 +gie/builtins.gie#115:4@d922ec4a +gie/builtins.gie#115:5@89c77230 +gie/builtins.gie#115:6@c03f0056 +gie/builtins.gie#115:7@d732ec2b +gie/builtins.gie#116:0@f95d4033 +gie/builtins.gie#116:1@57033d06 +gie/builtins.gie#116:2@3ecfe39b +gie/builtins.gie#116:3@9b997c1a +gie/builtins.gie#116:4@5236022c +gie/builtins.gie#116:5@447aac68 +gie/builtins.gie#116:6@758db1c6 +gie/builtins.gie#116:7@5d52bf32 +gie/builtins.gie#117:0@eeb95c72 +gie/builtins.gie#117:1@d20ccf7a +gie/builtins.gie#117:2@beabae87 +gie/builtins.gie#117:3@567a60c9 +gie/builtins.gie#117:4@2eaf46aa +gie/builtins.gie#117:5@b219272a +gie/builtins.gie#117:6@1d5e964b +gie/builtins.gie#117:7@f7a8453f +gie/builtins.gie#118:0@b0232f9a +gie/builtins.gie#118:1@e7a61c9f +gie/builtins.gie#118:2@5104fc63 +gie/builtins.gie#118:3@e72ef38b +gie/builtins.gie#118:4@e893cbfa +gie/builtins.gie#118:5@35ce2fac +gie/builtins.gie#118:6@0a63ba8d +gie/builtins.gie#118:7@f92df050 +gie/builtins.gie#119:0@bbff9b05 +gie/builtins.gie#119:1@8a567d1f +gie/builtins.gie#119:2@fdba5679 +gie/builtins.gie#119:3@8dbeb78c +gie/builtins.gie#119:4@849f74d7 +gie/builtins.gie#119:5@943984de +gie/builtins.gie#119:6@e9c0ad24 +gie/builtins.gie#119:7@4d277ccb +gie/builtins.gie#120:0@dd35df3f +gie/builtins.gie#120:1@f1e5a565 +gie/builtins.gie#120:2@a9c8f7c1 +gie/builtins.gie#120:3@3267264d +gie/builtins.gie#120:4@5331efe9 +gie/builtins.gie#120:5@4685f369 +gie/builtins.gie#120:6@38f7aa8a +gie/builtins.gie#120:7@00e63b1b +gie/builtins.gie#121:0@adb4cb99 +gie/builtins.gie#121:1@fe056969 +gie/builtins.gie#121:2@e8a0b211 +gie/builtins.gie#121:3@7ae2ae31 +gie/builtins.gie#121:4@27208892 +gie/builtins.gie#121:5@45cdffc1 +gie/builtins.gie#122:0@25b650e5 +gie/builtins.gie#122:1@56df2303 +gie/builtins.gie#122:2@5ce3da6a +gie/builtins.gie#122:3@4ad0b934 +gie/builtins.gie#122:4@52ab5dc2 +gie/builtins.gie#122:5@568cb035 +gie/builtins.gie#122:6@f37ebe81 +gie/builtins.gie#122:7@69da46c8 +gie/builtins.gie#122:8@2b03257d +gie/builtins.gie#122:9@1b59be39 +gie/builtins.gie#122:10@97e42305 +gie/builtins.gie#122:11@7d18169f +gie/builtins.gie#122:12@df98b152 +gie/builtins.gie#122:13@7507d8c0 +gie/builtins.gie#122:14@61a54ab0 +gie/builtins.gie#122:15@0227be2a +gie/builtins.gie#122:16@fdd2d576 +gie/builtins.gie#122:17@08e985e1 +gie/builtins.gie#122:18@cb02b93e +gie/builtins.gie#122:19@2b165d78 +gie/builtins.gie#122:20@f79ae8ff +gie/builtins.gie#122:21@0b16cad6 +gie/builtins.gie#122:22@609c47a7 +gie/builtins.gie#122:23@70ad811a +gie/builtins.gie#122:24@36e5443f +gie/builtins.gie#122:25@dc975811 +gie/builtins.gie#122:26@80184efa +gie/builtins.gie#122:27@3b11487d +gie/builtins.gie#122:28@a13ed830 +gie/builtins.gie#122:29@f6f0a0f1 +gie/builtins.gie#122:30@ffa3d2ed +gie/builtins.gie#122:31@17c81ca2 +gie/builtins.gie#122:32@d38dcbf6 +gie/builtins.gie#122:33@d62c4628 +gie/builtins.gie#122:34@c47aaf80 +gie/builtins.gie#122:35@38ad6349 +gie/builtins.gie#123:0@e2524289 +gie/builtins.gie#123:1@519f194a +gie/builtins.gie#123:2@f2785915 +gie/builtins.gie#123:3@04dfbcb7 +gie/builtins.gie#123:4@8ea17a04 +gie/builtins.gie#123:5@b59ff71f +gie/builtins.gie#123:6@6be3a963 +gie/builtins.gie#123:7@e4a92870 +gie/builtins.gie#123:8@27cea0c5 +gie/builtins.gie#123:9@f5bff598 +gie/builtins.gie#123:10@61be268a +gie/builtins.gie#123:11@68c584ae +gie/builtins.gie#123:12@7237b7d2 +gie/builtins.gie#123:13@8fc4479a +gie/builtins.gie#123:14@50de0f52 +gie/builtins.gie#123:15@21f87b86 +gie/builtins.gie#123:16@be52c09a +gie/builtins.gie#123:17@3338c4b1 +gie/builtins.gie#123:18@845b277f +gie/builtins.gie#123:19@e804c588 +gie/builtins.gie#123:20@e44cb1fd +gie/builtins.gie#123:21@df4d20ac +gie/builtins.gie#123:22@e5a425ab +gie/builtins.gie#123:23@3c2ff86d +gie/builtins.gie#123:24@46bb236a +gie/builtins.gie#123:25@80a8783e +gie/builtins.gie#123:26@5730adac +gie/builtins.gie#123:27@b44cbf2d +gie/builtins.gie#123:28@a20a29f5 +gie/builtins.gie#123:29@9f6a635a +gie/builtins.gie#123:30@b7d6b769 +gie/builtins.gie#123:31@7cd70de1 +gie/builtins.gie#123:32@e19e468f +gie/builtins.gie#123:33@207db06e +gie/builtins.gie#123:34@9bbd1701 +gie/builtins.gie#123:35@a79c581b +gie/builtins.gie#123:36@55b5ec81 +gie/builtins.gie#123:37@aa1c26e7 +gie/builtins.gie#123:38@fd495c17 +gie/builtins.gie#123:39@d3325c30 +gie/builtins.gie#123:40@14b1faac +gie/builtins.gie#123:41@cf441ba2 +gie/builtins.gie#124:0@bfc6f13e +gie/builtins.gie#124:1@43cd2bac +gie/builtins.gie#124:2@f35ffd05 +gie/builtins.gie#124:3@507022b4 +gie/builtins.gie#124:4@45515970 +gie/builtins.gie#124:5@737ad759 +gie/builtins.gie#124:6@5781f94e +gie/builtins.gie#124:7@385755e5 +gie/builtins.gie#124:8@34b76c73 +gie/builtins.gie#124:9@4b734159 +gie/builtins.gie#124:10@7a0a93af +gie/builtins.gie#124:11@2743366a +gie/builtins.gie#124:12@7621a86c +gie/builtins.gie#124:13@45563559 +gie/builtins.gie#124:14@bb72b79c +gie/builtins.gie#124:15@a169fb6e +gie/builtins.gie#124:16@ab3050e5 +gie/builtins.gie#124:17@f0147662 +gie/builtins.gie#124:18@5982a4a5 +gie/builtins.gie#124:19@408845cf +gie/builtins.gie#124:20@8f1a91fb +gie/builtins.gie#124:21@30b8dad7 +gie/builtins.gie#124:22@a2d39590 +gie/builtins.gie#124:23@9e7f9d1d +gie/builtins.gie#124:24@e74f7235 +gie/builtins.gie#124:25@837249f6 +gie/builtins.gie#124:26@36ca20ae +gie/builtins.gie#124:27@55c90a69 +gie/builtins.gie#124:28@ba160c3f +gie/builtins.gie#124:29@24ab0d04 +gie/builtins.gie#124:30@e1fbb56b +gie/builtins.gie#124:31@80e05eab +gie/builtins.gie#124:32@c5a43e03 +gie/builtins.gie#124:33@708f07d0 +gie/builtins.gie#124:34@27edb228 +gie/builtins.gie#124:35@5f8d0f22 +gie/builtins.gie#124:36@9b6b17dc +gie/builtins.gie#124:37@ab2aa019 +gie/builtins.gie#124:38@56bb0275 +gie/builtins.gie#124:39@831cb68f +gie/builtins.gie#125:0@42621427 +gie/builtins.gie#125:1@5d00228e +gie/builtins.gie#125:2@ae178c29 +gie/builtins.gie#125:3@873ccc6b +gie/builtins.gie#125:4@736cfeb9 +gie/builtins.gie#125:5@125e0242 +gie/builtins.gie#125:6@8cb85f81 +gie/builtins.gie#125:7@fc55f61b +gie/builtins.gie#125:8@7a0d26b8 +gie/builtins.gie#125:9@a3376c3b +gie/builtins.gie#125:10@c9e3f1f8 +gie/builtins.gie#125:11@1e1103fb +gie/builtins.gie#125:12@e98c0bef +gie/builtins.gie#125:13@6477492e +gie/builtins.gie#125:14@5851d209 +gie/builtins.gie#125:15@7abec04f +gie/builtins.gie#125:16@b0324c46 +gie/builtins.gie#125:17@c5e914bc +gie/builtins.gie#125:18@3700ffe0 +gie/builtins.gie#125:19@20b73ecd +gie/builtins.gie#125:20@5ef7e3f2 +gie/builtins.gie#125:21@9754c580 +gie/builtins.gie#125:22@bc37f02a +gie/builtins.gie#125:23@707ede17 +gie/builtins.gie#125:24@f7dbd695 +gie/builtins.gie#125:25@4105d42e +gie/builtins.gie#125:26@4c055cf9 +gie/builtins.gie#125:27@ff527956 +gie/builtins.gie#125:28@d2287a16 +gie/builtins.gie#125:29@6a86cc62 +gie/builtins.gie#125:30@3b551fdf +gie/builtins.gie#125:31@5fbb682f +gie/builtins.gie#125:32@af276526 +gie/builtins.gie#125:33@0bd80b6e +gie/builtins.gie#125:34@53e2d0de +gie/builtins.gie#125:35@62806d89 +gie/builtins.gie#125:36@fc1c9fb4 +gie/builtins.gie#125:37@234cf42b +gie/builtins.gie#125:38@3dc91a19 +gie/builtins.gie#125:39@ec10e733 +gie/builtins.gie#126:0@3e027711 +gie/builtins.gie#126:1@74875356 +gie/builtins.gie#126:2@ad524fcd +gie/builtins.gie#126:3@d9b40aa8 +gie/builtins.gie#126:4@bac0780e +gie/builtins.gie#126:5@b9d91c0a +gie/builtins.gie#126:6@7c35b601 +gie/builtins.gie#126:7@2dcaae7c +gie/builtins.gie#127:0@3df0ca13 +gie/builtins.gie#127:1@a0ffeaa1 +gie/builtins.gie#127:2@24ec43df +gie/builtins.gie#127:3@3df0ca13 +gie/builtins.gie#127:4@06c1b334 +gie/builtins.gie#127:5@e20c2e0a +gie/builtins.gie#128:0@dd363b32 +gie/builtins.gie#128:1@7d8e4a53 +gie/builtins.gie#128:2@886db76b +gie/builtins.gie#128:3@4149f812 +gie/builtins.gie#128:4@4462b6b4 +gie/builtins.gie#128:5@d22b68bf +gie/builtins.gie#128:6@077e5228 +gie/builtins.gie#128:7@a27579db +gie/builtins.gie#129:0@84010aec +gie/builtins.gie#130:0@e82b139a +gie/builtins.gie#130:1@aa165aed +gie/builtins.gie#130:2@8549e64f +gie/builtins.gie#130:3@0e8d1ae9 +gie/builtins.gie#130:4@38830122 +gie/builtins.gie#130:5@5e31dbae +gie/builtins.gie#130:6@fe6cfc92 +gie/builtins.gie#130:7@aea17a76 +gie/builtins.gie#130:8@bbb341ec +gie/builtins.gie#130:9@b472ea5e +gie/builtins.gie#130:10@ab7c97e4 +gie/builtins.gie#130:11@a35365b7 +gie/builtins.gie#130:12@0ad2c25a +gie/builtins.gie#130:13@c9a92c86 +gie/builtins.gie#130:14@54b38533 +gie/builtins.gie#130:15@53b859f2 +gie/builtins.gie#131:0@00abcd4c +gie/builtins.gie#131:1@e5ec748f +gie/builtins.gie#131:2@62f8bb20 +gie/builtins.gie#131:3@17794ecc +gie/builtins.gie#131:4@b7387d24 +gie/builtins.gie#131:5@b124fa6e +gie/builtins.gie#131:6@8a5f4dd0 +gie/builtins.gie#131:7@4de4b152 +gie/builtins.gie#131:8@9bd2398c +gie/builtins.gie#131:9@bfb9980a +gie/builtins.gie#131:10@560b424f +gie/builtins.gie#131:11@d32f5ff9 +gie/builtins.gie#131:12@d1aa10c0 +gie/builtins.gie#131:13@c41fb295 +gie/builtins.gie#131:14@b18104fe +gie/builtins.gie#131:15@0deda4e4 +gie/builtins.gie#132:0@5b449f5d +gie/builtins.gie#132:1@c2ec5475 +gie/builtins.gie#132:2@5f84bf7f +gie/builtins.gie#132:3@2d8925eb +gie/builtins.gie#132:4@349fb713 +gie/builtins.gie#132:5@2b9f453f +gie/builtins.gie#132:6@3ae7da8a +gie/builtins.gie#132:7@b8fe69ea +gie/builtins.gie#133:0@afe0dd45 +gie/builtins.gie#133:1@5dc4b081 +gie/builtins.gie#133:2@dce28d2b +gie/builtins.gie#133:3@9465e9d8 +gie/builtins.gie#133:4@733d72ec +gie/builtins.gie#133:5@3f1fdc33 +gie/builtins.gie#133:6@19ddfff5 +gie/builtins.gie#133:7@6947012a +gie/builtins.gie#134:0@8ccbce08 +gie/builtins.gie#134:1@a6a8f4ca +gie/builtins.gie#134:2@c93dc597 +gie/builtins.gie#134:3@5be36b00 +gie/builtins.gie#134:4@7bad26bc +gie/builtins.gie#134:5@ed6b4f67 +gie/builtins.gie#134:6@e5f0471c +gie/builtins.gie#134:7@fd3df555 +gie/builtins.gie#135:0@681dfba4 +gie/builtins.gie#135:1@a88673fd +gie/builtins.gie#135:2@2319e3cc +gie/builtins.gie#135:3@22e88d6c +gie/builtins.gie#135:4@7fc9c125 +gie/builtins.gie#135:5@53017446 +gie/builtins.gie#135:6@9b3d93ce +gie/builtins.gie#135:7@80270ab8 +gie/builtins.gie#135:8@bdb17fce +gie/builtins.gie#135:9@72821edf +gie/builtins.gie#136:0@ae72f015 +gie/builtins.gie#137:0@a4fae68e +gie/builtins.gie#137:1@4dbebced +gie/builtins.gie#138:0@f1a3d35e +gie/builtins.gie#138:1@8d686371 +gie/builtins.gie#139:0@3d4e555d +gie/builtins.gie#139:1@f5d12407 +gie/builtins.gie#140:0@32f31dfe +gie/builtins.gie#140:1@a3172e70 +gie/builtins.gie#141:0@fcc60ce3 +gie/builtins.gie#141:1@2c6fe47c +gie/builtins.gie#141:2@d2412df8 +gie/builtins.gie#141:3@9ead9526 +gie/builtins.gie#141:4@55914e2f +gie/builtins.gie#141:5@7c042717 +gie/builtins.gie#141:6@719e03fd +gie/builtins.gie#141:7@fc4451a5 +gie/builtins.gie#142:0@f9876261 +gie/builtins.gie#143:0@27c055a7 +gie/builtins.gie#143:1@6ce88482 +gie/builtins.gie#143:2@8ef85db9 +gie/builtins.gie#143:3@a0c53cfa +gie/builtins.gie#143:4@7ef39bfc +gie/builtins.gie#143:5@84bc6655 +gie/builtins.gie#143:6@13bf4157 +gie/builtins.gie#143:7@345530e3 +gie/builtins.gie#143:8@6ee85df1 +gie/builtins.gie#143:9@9705829a +gie/builtins.gie#143:10@d339daed +gie/builtins.gie#143:11@c19c34b8 +gie/builtins.gie#144:0@00946b03 +gie/builtins.gie#144:1@da7b5139 +gie/builtins.gie#144:2@ba707bcb +gie/builtins.gie#144:3@620fdeb0 +gie/builtins.gie#144:4@82dbcf89 +gie/builtins.gie#144:5@e07b37c5 +gie/builtins.gie#144:6@98b64510 +gie/builtins.gie#144:7@160bd98c +gie/builtins.gie#144:8@8af0a0ca +gie/builtins.gie#145:0@876db8d5 +gie/builtins.gie#145:1@49a9c16f +gie/builtins.gie#145:2@4e28f2a2 +gie/builtins.gie#145:3@1bfad855 +gie/builtins.gie#145:4@b6e5f8fa +gie/builtins.gie#145:5@1eb840dd +gie/builtins.gie#145:6@17b60b8f +gie/builtins.gie#146:0@c999c60c +gie/builtins.gie#146:1@ebc34961 +gie/builtins.gie#146:2@02bba9c2 +gie/builtins.gie#146:3@721b2f3a +gie/builtins.gie#146:4@52aad96b +gie/builtins.gie#146:5@3e76f724 +gie/builtins.gie#146:6@28b75cce +gie/builtins.gie#147:0@44dafa05 +gie/builtins.gie#147:1@c025c17a +gie/builtins.gie#147:2@ce6f0c48 +gie/builtins.gie#147:3@7823ee23 +gie/builtins.gie#147:4@94beca07 +gie/builtins.gie#147:5@d152726d +gie/builtins.gie#148:0@a166e4cf +gie/builtins.gie#148:1@e4a16827 +gie/builtins.gie#148:2@409c6e38 +gie/builtins.gie#148:3@0baaab4c +gie/builtins.gie#148:4@eea41b41 +gie/builtins.gie#148:5@cdfd8b5b +gie/builtins.gie#148:6@93d0544c +gie/builtins.gie#149:0@9a9c96a5 +gie/builtins.gie#149:1@99ab5320 +gie/builtins.gie#149:2@c86eb729 +gie/builtins.gie#149:3@8214138e +gie/builtins.gie#149:4@259723ee +gie/builtins.gie#149:5@a823ab82 +gie/builtins.gie#150:0@b99c7541 +gie/builtins.gie#150:1@47ee7c23 +gie/builtins.gie#150:2@912519a2 +gie/builtins.gie#150:3@6ced7200 +gie/builtins.gie#150:4@64945a19 +gie/builtins.gie#150:5@fa22dbf0 +gie/builtins.gie#151:0@36f8cb35 +gie/builtins.gie#152:0@57d6cc2c +gie/builtins.gie#152:1@ef4eda15 +gie/builtins.gie#152:2@e4a537a8 +gie/builtins.gie#152:3@cca61be1 +gie/builtins.gie#152:4@550ee6aa +gie/builtins.gie#152:5@2d079e76 +gie/builtins.gie#152:6@d8905639 +gie/builtins.gie#152:7@1c975785 +gie/builtins.gie#152:8@f0381364 +gie/builtins.gie#152:9@f05985ef +gie/builtins.gie#153:0@c23cdbe8 +gie/builtins.gie#154:0@80ba95f9 +gie/builtins.gie#155:0@6d224090 +gie/builtins.gie#156:0@62f36159 +gie/builtins.gie#156:1@077cbdc5 +gie/builtins.gie#157:0@5fde619d +gie/builtins.gie#157:1@bb376585 +gie/builtins.gie#158:0@22f85e46 +gie/builtins.gie#158:1@8bfab701 +gie/builtins.gie#158:2@15f0966a +gie/builtins.gie#158:3@cb564e80 +gie/builtins.gie#159:0@1c4438e9 +gie/builtins.gie#159:1@b7ae193d +gie/builtins.gie#159:2@45686b92 +gie/builtins.gie#159:3@58676030 +gie/builtins.gie#160:0@39ed7c5d +gie/builtins.gie#160:1@c1c85845 +gie/builtins.gie#160:2@da1a75b8 +gie/builtins.gie#160:3@0a2bf917 +gie/builtins.gie#160:4@e593f327 +gie/builtins.gie#160:5@167937a5 +gie/builtins.gie#160:6@fcf948df +gie/builtins.gie#160:7@5135771f +gie/builtins.gie#161:0@8be1e6a2 +gie/builtins.gie#161:1@0c9090b0 +gie/builtins.gie#161:2@9d210ea5 +gie/builtins.gie#161:3@6d54df7c +gie/builtins.gie#161:4@e6c6830b +gie/builtins.gie#161:5@6090e15f +gie/builtins.gie#161:6@0f16d223 +gie/builtins.gie#161:7@d487a534 +gie/builtins.gie#162:0@7957f1d7 +gie/builtins.gie#162:1@42db77f8 +gie/builtins.gie#163:0@d0509ee0 +gie/builtins.gie#163:1@b3c6f926 +gie/builtins.gie#163:2@cfe7d90b +gie/builtins.gie#163:3@b3c6f926 +gie/builtins.gie#164:0@23405773 +gie/builtins.gie#164:1@3f061154 +gie/builtins.gie#164:2@3a23f8bc +gie/builtins.gie#164:3@0f8c3eea +gie/builtins.gie#165:0@51c0c911 +gie/builtins.gie#165:1@ff5deee0 +gie/builtins.gie#165:2@8e164bd3 +gie/builtins.gie#165:3@dd533fc8 +gie/builtins.gie#165:4@adc56d03 +gie/builtins.gie#166:0@05fa0b5b +gie/builtins.gie#167:0@12a0e1f6 +gie/builtins.gie#168:0@9d556615 +gie/builtins.gie#169:0@8b90b223 +gie/builtins.gie#170:0@63e24447 +gie/builtins.gie#171:0@b5302b42 +gie/builtins.gie#172:0@06778427 +gie/builtins.gie#173:0@9f49bd65 +gie/builtins.gie#174:0@02e37b95 +gie/builtins.gie#175:0@c273284b +gie/builtins.gie#175:1@7ba9f8b4 +gie/builtins.gie#175:2@c0fbf28e +gie/builtins.gie#175:3@88774491 +gie/builtins.gie#175:4@6d353bbc +gie/builtins.gie#175:5@fdb14b59 +gie/builtins.gie#175:6@58e63339 +gie/builtins.gie#175:7@267808f0 +gie/builtins.gie#176:0@3ca7d804 +gie/builtins.gie#176:1@45e7e790 +gie/builtins.gie#176:2@d3127b1a +gie/builtins.gie#176:3@312789f1 +gie/builtins.gie#176:4@612715eb +gie/builtins.gie#176:5@0bbd9e21 +gie/builtins.gie#176:6@beabff32 +gie/builtins.gie#176:7@bda20d17 +gie/builtins.gie#177:0@64916873 +gie/builtins.gie#177:1@00e3e526 +gie/builtins.gie#177:2@fa055ba6 +gie/builtins.gie#177:3@f462d466 +gie/builtins.gie#177:4@a1a1e239 +gie/builtins.gie#177:5@a7300813 +gie/builtins.gie#177:6@726fadbe +gie/builtins.gie#177:7@fd18cc07 +gie/builtins.gie#178:0@a48508cf +gie/builtins.gie#178:1@8ae2d17b +gie/builtins.gie#178:2@c43be7b7 +gie/builtins.gie#178:3@6b32f257 +gie/builtins.gie#178:4@d78da8ec +gie/builtins.gie#178:5@dfdebc42 +gie/builtins.gie#178:6@2b27967e +gie/builtins.gie#178:7@6568c1c2 +gie/builtins.gie#179:0@9afedcdd +gie/builtins.gie#179:1@82002fec +gie/builtins.gie#179:2@0f55f692 +gie/builtins.gie#179:3@ea94b491 +gie/builtins.gie#179:4@a3c9bf5b +gie/builtins.gie#179:5@1162d6aa +gie/builtins.gie#179:6@ef843042 +gie/builtins.gie#179:7@00f92b9a +gie/builtins.gie#180:0@592a42f6 +gie/builtins.gie#180:1@74d10842 +gie/builtins.gie#180:2@c090a4a6 +gie/builtins.gie#180:3@0dd8b3a8 +gie/builtins.gie#180:4@32154e6d +gie/builtins.gie#180:5@519b6820 +gie/builtins.gie#180:6@830b3922 +gie/builtins.gie#180:7@c06f3b68 +gie/builtins.gie#181:0@bc9a2087 +gie/builtins.gie#182:0@1d46838a +gie/builtins.gie#182:1@1c2a3b6d +gie/builtins.gie#182:2@0069e8b4 +gie/builtins.gie#182:3@bca3f700 +gie/builtins.gie#182:4@a13d3d94 +gie/builtins.gie#182:5@e4155652 +gie/builtins.gie#182:6@499897b9 +gie/builtins.gie#182:7@25daf277 +gie/builtins.gie#183:0@c65adbb7 +gie/builtins.gie#183:1@73879f8b +gie/builtins.gie#183:2@9d64ab7a +gie/builtins.gie#183:3@75c64b3e +gie/builtins.gie#183:4@72daea61 +gie/builtins.gie#183:5@23c6bb1c +gie/builtins.gie#183:6@c57878fe +gie/builtins.gie#183:7@a7bd75c3 +gie/builtins.gie#184:0@b5166bf1 +gie/builtins.gie#184:1@c490014e +gie/builtins.gie#184:2@e921d0a2 +gie/builtins.gie#184:3@bb61eb01 +gie/builtins.gie#184:4@125aaf63 +gie/builtins.gie#184:5@85a2ce60 +gie/builtins.gie#184:6@e11d570c +gie/builtins.gie#184:7@f7fb6fba +gie/builtins.gie#185:0@56c20fd2 +gie/builtins.gie#185:1@eda4b2ef +gie/builtins.gie#185:2@6c79f4c3 +gie/builtins.gie#185:3@50192008 +gie/builtins.gie#185:4@c26b7ada +gie/builtins.gie#185:5@dabbe00c +gie/builtins.gie#185:6@019f2a2c +gie/builtins.gie#185:7@04430463 +gie/builtins.gie#186:0@8b8b8461 +gie/builtins.gie#186:1@986c5dc9 +gie/builtins.gie#186:2@3c40e2f0 +gie/builtins.gie#186:3@115e11ec +gie/builtins.gie#186:4@e76a7235 +gie/builtins.gie#186:5@fe2f9b27 +gie/builtins.gie#186:6@925c723f +gie/builtins.gie#186:7@6d89f269 +gie/builtins.gie#187:0@90e90b63 +gie/builtins.gie#187:1@22cf367d +gie/builtins.gie#187:2@b6b0a250 +gie/builtins.gie#187:3@cad708e8 +gie/builtins.gie#187:4@10448574 +gie/builtins.gie#187:5@4fdc7be0 +gie/builtins.gie#187:6@e7387040 +gie/builtins.gie#187:7@09b1c284 +gie/builtins.gie#188:0@1fedf632 +gie/builtins.gie#188:1@2871bebf +gie/builtins.gie#188:2@c62c787a +gie/builtins.gie#188:3@447f68e9 +gie/builtins.gie#188:4@be907686 +gie/builtins.gie#188:5@d32287b5 +gie/builtins.gie#188:6@7fd9f249 +gie/builtins.gie#188:7@1fedf632 +gie/builtins.gie#188:8@43061a11 +gie/builtins.gie#188:9@dfb21a5b +gie/builtins.gie#188:10@86c42ebd +gie/builtins.gie#188:11@7dca49cc +gie/builtins.gie#188:12@8f17ab5d +gie/builtins.gie#188:13@96b6b3cc +gie/builtins.gie#188:14@2f45eaba +gie/builtins.gie#188:15@fa0281b6 +gie/builtins.gie#189:0@2895e17d +gie/builtins.gie#189:1@12ed2516 +gie/builtins.gie#189:2@5f74b066 +gie/builtins.gie#189:3@134ae156 +gie/builtins.gie#189:4@d110fb02 +gie/builtins.gie#189:5@2895e17d +gie/builtins.gie#189:6@881ff102 +gie/builtins.gie#189:7@c32c3d1d +gie/builtins.gie#189:8@6d4ffae6 +gie/builtins.gie#189:9@70b7dda8 +gie/builtins.gie#190:0@20440fb1 +gie/builtins.gie#190:1@e901cd72 +gie/builtins.gie#191:0@9ad860a8 +gie/builtins.gie#192:0@003ddfb5 +gie/builtins.gie#193:0@5f1dbc8a +gie/builtins.gie#193:1@63be9e3a +gie/builtins.gie#193:2@e24d461c +gie/builtins.gie#193:3@c1f0d797 +gie/builtins.gie#193:4@d9ea37ef +gie/builtins.gie#193:5@d80f79f1 +gie/builtins.gie#193:6@92743fdf +gie/builtins.gie#193:7@1ed1244c +gie/builtins.gie#194:0@427f09be +gie/builtins.gie#194:1@ccdd2e16 +gie/builtins.gie#194:2@4b627bd2 +gie/builtins.gie#194:3@8220b45c +gie/builtins.gie#194:4@e4db3ddc +gie/builtins.gie#194:5@ea49740e +gie/builtins.gie#194:6@d5186079 +gie/builtins.gie#194:7@dd2c8803 +gie/builtins.gie#195:0@7cd8e488 +gie/builtins.gie#195:1@99285718 +gie/builtins.gie#195:2@465eeb76 +gie/builtins.gie#195:3@805fa8fe +gie/builtins.gie#195:4@34b02f9c +gie/builtins.gie#195:5@8ef2ecbb +gie/builtins.gie#195:6@9f75757d +gie/builtins.gie#195:7@f9102098 +gie/builtins.gie#196:0@9d1c893f +gie/builtins.gie#196:1@b898f3b9 +gie/builtins.gie#196:2@3717cf87 +gie/builtins.gie#196:3@bc5fc5cf +gie/builtins.gie#196:4@8159d23a +gie/builtins.gie#196:5@fc1d0feb +gie/builtins.gie#196:6@6b29ae26 +gie/builtins.gie#196:7@e9dfc762 +gie/builtins.gie#197:0@0a02c632 +gie/builtins.gie#197:1@abb61c9b +gie/builtins.gie#197:2@7c1b0007 +gie/builtins.gie#197:3@3536fb94 +gie/builtins.gie#197:4@ecd6128f +gie/builtins.gie#197:5@a3b60143 +gie/builtins.gie#197:6@7652714e +gie/builtins.gie#197:7@8790fb3f +gie/builtins.gie#198:0@81083e71 +gie/builtins.gie#198:1@047714ab +gie/builtins.gie#198:2@d75729ce +gie/builtins.gie#198:3@fd87b0af +gie/builtins.gie#198:4@36f7ca4d +gie/builtins.gie#198:5@bbd4ee08 +gie/builtins.gie#198:6@0da1a2f7 +gie/builtins.gie#198:7@7b96a27d +gie/builtins.gie#199:0@f7ccd422 +gie/builtins.gie#199:1@4c8eae46 +gie/builtins.gie#199:2@798d38ff +gie/builtins.gie#199:3@3051f0bd +gie/builtins.gie#199:4@cad86ad7 +gie/builtins.gie#199:5@67d599f1 +gie/builtins.gie#199:6@669c6e57 +gie/builtins.gie#199:7@f4b39e0f +gie/builtins.gie#200:0@c7983096 +gie/builtins.gie#200:1@5efe8d57 +gie/builtins.gie#200:2@9a1cfcc5 +gie/builtins.gie#200:3@6ded9061 +gie/builtins.gie#200:4@dd4e1273 +gie/builtins.gie#200:5@bcf13cb8 +gie/builtins.gie#200:6@880d4eca +gie/builtins.gie#200:7@0bb34a4c +gie/builtins.gie#201:0@3bad2f1f +gie/builtins.gie#201:1@7e2ce2ab +gie/builtins.gie#201:2@c9acff06 +gie/builtins.gie#201:3@a0a15431 +gie/builtins.gie#201:4@d8972f37 +gie/builtins.gie#201:5@48adeb8b +gie/builtins.gie#201:6@3dad095e +gie/builtins.gie#201:7@e7d5f897 +gie/builtins.gie#201:8@610e2706 +gie/builtins.gie#201:9@1e90c4e5 +gie/builtins.gie#201:10@212af185 +gie/builtins.gie#201:11@7333fcb9 +gie/builtins.gie#201:12@0bf3b060 +gie/builtins.gie#201:13@3495e47f +gie/builtins.gie#201:14@287c4ee6 +gie/builtins.gie#201:15@336e898a +gie/builtins.gie#201:16@0ffaa062 +gie/builtins.gie#201:17@660eef9c +gie/builtins.gie#201:18@8e952a8b +gie/builtins.gie#201:19@0b30f7d5 +gie/builtins.gie#202:0@176d0580 +gie/builtins.gie#202:1@39911b13 +gie/builtins.gie#202:2@74daad72 +gie/builtins.gie#202:3@d1a339cc +gie/builtins.gie#202:4@9edce58b +gie/builtins.gie#202:5@e9f53db6 +gie/builtins.gie#202:6@a5af37b1 +gie/builtins.gie#202:7@88af28b8 +gie/builtins.gie#203:0@8d1d9d38 +gie/builtins.gie#203:1@5c7f62f1 +gie/builtins.gie#203:2@1ecd112a +gie/builtins.gie#203:3@53f7cbf2 +gie/builtins.gie#203:4@9912933a +gie/builtins.gie#203:5@ab559e1f +gie/builtins.gie#203:6@fd34d9a8 +gie/builtins.gie#203:7@35bf6617 +gie/builtins.gie#204:0@e513025f +gie/builtins.gie#204:1@cc4f1971 +gie/builtins.gie#204:2@5979a5e4 +gie/builtins.gie#204:3@1973e661 +gie/builtins.gie#204:4@6175a973 +gie/builtins.gie#204:5@f3473111 +gie/builtins.gie#204:6@d6495423 +gie/builtins.gie#204:7@ea7950b5 +gie/builtins.gie#205:0@17631704 +gie/builtins.gie#205:1@6e2b72d7 +gie/builtins.gie#205:2@6b4af757 +gie/builtins.gie#205:3@0cd00345 +gie/builtins.gie#205:4@8c56c4ea +gie/builtins.gie#205:5@efa3a568 +gie/builtins.gie#205:6@fae563e8 +gie/builtins.gie#205:7@6eab2446 +gie/builtins.gie#206:0@9464f9b6 +gie/builtins.gie#206:1@dc684d0b +gie/builtins.gie#206:2@ef13a8c1 +gie/builtins.gie#206:3@66635e63 +gie/builtins.gie#206:4@f9b6786f +gie/builtins.gie#206:5@f9b8fb9b +gie/builtins.gie#206:6@2810f496 +gie/builtins.gie#206:7@f85b1930 +gie/builtins.gie#207:0@b6f77466 +gie/builtins.gie#207:1@20355157 +gie/builtins.gie#207:2@592217a3 +gie/builtins.gie#207:3@20c6268b +gie/builtins.gie#207:4@c33c4f7d +gie/builtins.gie#207:5@3319ab29 +gie/builtins.gie#207:6@07153804 +gie/builtins.gie#207:7@1f5f35ce +gie/builtins.gie#208:0@ac8bba76 +gie/builtins.gie#208:1@1f1e6bc7 +gie/builtins.gie#208:2@e13ec7b9 +gie/builtins.gie#208:3@21f22a13 +gie/builtins.gie#208:4@7b353c66 +gie/builtins.gie#208:5@0dd19942 +gie/builtins.gie#208:6@4fc846b2 +gie/builtins.gie#208:7@dec51c17 +gie/builtins.gie#209:0@e2371aaa +gie/builtins.gie#209:1@3de610bd +gie/builtins.gie#209:2@b0f460a2 +gie/builtins.gie#209:3@d7a3ea9a +gie/builtins.gie#209:4@a3eb4e40 +gie/builtins.gie#209:5@b0466863 +gie/builtins.gie#209:6@d2822db6 +gie/builtins.gie#209:7@9107851c +gie/builtins.gie#210:0@3a53e3b2 +gie/builtins.gie#210:1@165ba6b5 +gie/builtins.gie#210:2@5470fa22 +gie/builtins.gie#210:3@9eed295f +gie/builtins.gie#210:4@4b344468 +gie/builtins.gie#210:5@cc9dcf31 +gie/builtins.gie#210:6@78847947 +gie/builtins.gie#210:7@24f7ca5b +gie/builtins.gie#211:0@f4ad963a +gie/builtins.gie#211:1@90c0574f +gie/builtins.gie#211:2@20b614f8 +gie/builtins.gie#211:3@c6d45b8a +gie/builtins.gie#211:4@e8adefbb +gie/builtins.gie#211:5@135807b4 +gie/builtins.gie#211:6@a718327c +gie/builtins.gie#211:7@8efe8393 +gie/builtins.gie#212:0@e96d4c7e +gie/builtins.gie#212:1@65dc2f0f +gie/builtins.gie#212:2@6d957203 +gie/builtins.gie#212:3@ec8b0d12 +gie/builtins.gie#213:0@3a2fb3f2 +gie/builtins.gie#213:1@4ec9b48c +gie/builtins.gie#213:2@360cfbc2 +gie/builtins.gie#213:3@eb33205e +gie/builtins.gie#213:4@7c0fe43f +gie/builtins.gie#213:5@772c7a98 +gie/builtins.gie#213:6@33e80958 +gie/builtins.gie#213:7@ef443d1c +gie/builtins.gie#214:0@c90f55dd +gie/builtins.gie#214:1@f4276ab9 +gie/builtins.gie#214:2@190720d3 +gie/builtins.gie#214:3@a6753df1 +gie/builtins.gie#214:4@599e41b3 +gie/builtins.gie#214:5@8e88c23f +gie/builtins.gie#215:0@36378cb8 +gie/builtins.gie#215:1@912fe179 +gie/builtins.gie#215:2@5e274438 +gie/builtins.gie#215:3@81e2cbc6 +gie/builtins.gie#216:0@8f7d4686 +gie/builtins.gie#216:1@0d09e593 +gie/builtins.gie#216:2@f63bb73c +gie/builtins.gie#216:3@42b38490 +gie/builtins.gie#216:4@33faf79a +gie/builtins.gie#217:0@ad23d999 +gie/builtins.gie#218:0@5569e1ae +gie/builtins.gie#219:0@8928156e +gie/builtins.gie#219:1@9059ab2e +gie/builtins.gie#219:2@595cdc36 +gie/builtins.gie#219:3@063fb610 +gie/builtins.gie#219:4@2b333530 +gie/builtins.gie#219:5@2c702d6b +gie/builtins.gie#219:6@349dc401 +gie/builtins.gie#219:7@104ffb93 +gie/builtins.gie#220:0@e46ac180 +gie/builtins.gie#220:1@04cecf5f +gie/builtins.gie#220:2@0832a754 +gie/builtins.gie#220:3@88ac50c2 +gie/builtins.gie#220:4@e253bb26 +gie/builtins.gie#220:5@757ad855 +gie/builtins.gie#220:6@4e85ddf4 +gie/builtins.gie#220:7@8268cb9e +gie/builtins.gie#221:0@2d90bcf0 +gie/builtins.gie#222:0@474c53ca +gie/builtins.gie#222:1@e6f9de4c +gie/builtins.gie#222:2@78611e74 +gie/builtins.gie#222:3@8b2448ee +gie/builtins.gie#222:4@bd1d47fd +gie/builtins.gie#222:5@41a819b2 +gie/builtins.gie#222:6@7949ee7a +gie/builtins.gie#222:7@6c277e7c +gie/builtins.gie#223:0@d20850f4 +gie/builtins.gie#224:0@671ea6ed +gie/builtins.gie#225:0@ee5db811 +gie/builtins.gie#226:0@3652ef3a +gie/builtins.gie#227:0@e2a662a8 +gie/builtins.gie#228:0@2455eea9 +gie/builtins.gie#229:0@d3595ad0 +gie/builtins.gie#230:0@5b3473fd +gie/builtins.gie#231:0@a5c49f5d +gie/builtins.gie#232:0@16346244 +gie/builtins.gie#233:0@98f8d1cd +gie/builtins.gie#233:1@45c3c065 +gie/builtins.gie#233:2@39e896d7 +gie/builtins.gie#233:3@faeed9ab +gie/builtins.gie#233:4@592bf10e +gie/builtins.gie#233:5@c79e2f4f +gie/builtins.gie#233:6@981794d3 +gie/builtins.gie#233:7@771fb848 +gie/builtins.gie#234:0@99e2ccf0 +gie/builtins.gie#234:1@def9e29f +gie/builtins.gie#234:2@590e9925 +gie/builtins.gie#234:3@87cfda2e +gie/builtins.gie#234:4@6245a67c +gie/builtins.gie#234:5@b9a05555 +gie/builtins.gie#234:6@eb075898 +gie/builtins.gie#234:7@bf42b472 +gie/builtins.gie#235:0@c9d7aa81 +gie/builtins.gie#235:1@897faa93 +gie/builtins.gie#235:2@a960f043 +gie/builtins.gie#235:3@48e64aab +gie/builtins.gie#235:4@f42d3e80 +gie/builtins.gie#235:5@10507218 +gie/builtins.gie#235:6@88980bc7 +gie/builtins.gie#235:7@a02aa6c0 +gie/builtins.gie#236:0@4695a758 +gie/builtins.gie#237:0@a203b4e3 +gie/builtins.gie#238:0@d07a3bb4 +gie/builtins.gie#239:0@e9e9a29e +gie/builtins.gie#241:0@977273dd +gie/builtins.gie#242:0@a783301b +gie/builtins.gie#243:0@6062cb35 +gie/builtins.gie#245:0@d162717b +gie/builtins.gie#247:0@16417f92 +gie/builtins.gie#248:0@5f00b86d +gie/builtins.gie#248:1@c8ba3611 +gie/builtins.gie#248:2@7c42258e +gie/builtins.gie#248:3@60613e1b +gie/builtins.gie#249:0@d1595a7c +gie/builtins.gie#249:1@ac3303c5 +gie/builtins.gie#249:2@e959a12e +gie/builtins.gie#249:3@61429c88 +gie/builtins.gie#249:4@57f68aa0 +gie/builtins.gie#249:5@14d3358d +gie/builtins.gie#249:6@004dcc0a +gie/builtins.gie#249:7@5565a5b7 +gie/builtins.gie#249:8@617de152 +gie/builtins.gie#249:9@c3b3cb63 +gie/builtins.gie#249:10@1652d794 +gie/builtins.gie#249:11@7e31a94f +gie/builtins.gie#249:12@28c73df4 +gie/builtins.gie#249:13@3767244c +gie/builtins.gie#249:14@17a6f626 +gie/builtins.gie#249:15@afb306b0 +gie/builtins.gie#249:16@ee953da2 +gie/builtins.gie#249:17@d7f36d3c +gie/builtins.gie#249:18@9278aeaf +gie/builtins.gie#249:19@c017ccdd +gie/builtins.gie#249:20@2be62aa7 +gie/builtins.gie#249:21@ce6e79ad +gie/builtins.gie#249:22@1c533e87 +gie/builtins.gie#249:23@88a4c8d7 +gie/builtins.gie#249:24@e619436f +gie/builtins.gie#249:25@bdcf2dac +gie/builtins.gie#250:0@81143fca +gie/builtins.gie#250:1@63880da4 +gie/builtins.gie#250:2@f17a66bb +gie/builtins.gie#250:3@ec9d500a +gie/builtins.gie#250:4@736a435a +gie/builtins.gie#250:5@0d10c09e +gie/builtins.gie#250:6@5caac516 +gie/builtins.gie#250:7@82a5c53d +gie/builtins.gie#250:8@9beb1d0c +gie/builtins.gie#250:9@4d54770a +gie/builtins.gie#250:10@b2708727 +gie/builtins.gie#250:11@84cc3170 +gie/builtins.gie#250:12@7dd63157 +gie/builtins.gie#250:13@26edc22b +gie/builtins.gie#251:0@9a71119e +gie/builtins.gie#251:1@31e7b823 +gie/builtins.gie#251:2@fdae456c +gie/builtins.gie#251:3@cae803f8 +gie/builtins.gie#251:4@64aa168f +gie/builtins.gie#251:5@6909c980 +gie/builtins.gie#251:6@1fdf84bc +gie/builtins.gie#251:7@f628072d +gie/builtins.gie#251:8@84f0764f +gie/builtins.gie#251:9@443614a3 +gie/builtins.gie#251:10@81412b73 +gie/builtins.gie#251:11@61b0cd29 +gie/builtins.gie#251:12@c2dc5328 +gie/builtins.gie#252:0@52e42fc1 +gie/builtins.gie#252:1@acbe9522 +gie/builtins.gie#252:2@0147a4f1 +gie/builtins.gie#252:3@3d1b49af +gie/builtins.gie#252:4@edafbf25 +gie/builtins.gie#252:5@b3ede564 +gie/builtins.gie#252:6@a24a2016 +gie/builtins.gie#252:7@a0874f49 +gie/builtins.gie#252:8@d63f645e +gie/builtins.gie#252:9@26520628 +gie/builtins.gie#252:10@5dc56f30 +gie/builtins.gie#252:11@181e9fd0 +gie/builtins.gie#252:12@948dff72 +gie/builtins.gie#252:13@eb36d263 +gie/builtins.gie#253:0@e88cb6cb +gie/builtins.gie#253:1@5cc4b9f4 +gie/builtins.gie#254:0@08e91117 +gie/builtins.gie#254:1@e244de50 +gie/builtins.gie#254:2@4b7f666b +gie/builtins.gie#254:3@12c780d2 +gie/builtins.gie#254:4@5528ceb5 +gie/builtins.gie#254:5@6071a01e +gie/builtins.gie#254:6@56135d5c +gie/builtins.gie#254:7@abf23488 +gie/builtins.gie#254:8@262d7b11 +gie/builtins.gie#254:9@282544e4 +gie/builtins.gie#254:10@d0898a4a +gie/builtins.gie#254:11@9c9e3317 +gie/builtins.gie#254:12@569e8f70 +gie/builtins.gie#254:13@7ca96bd6 +gie/builtins.gie#255:0@07d61af2 +gie/builtins.gie#255:1@7182555d +gie/builtins.gie#255:2@a8b3b182 +gie/builtins.gie#255:3@1ab8b13f +gie/builtins.gie#255:4@9a4b2a49 +gie/builtins.gie#255:5@73d5046f +gie/builtins.gie#256:0@52487e54 +gie/builtins.gie#256:1@6f82fd35 +gie/builtins.gie#256:2@b824d8fb +gie/builtins.gie#256:3@620cf86b +gie/builtins.gie#256:4@a4f38a2f +gie/builtins.gie#256:5@4175beb0 +gie/builtins.gie#257:0@3902851c +gie/builtins.gie#257:1@d5ccfd59 +gie/builtins.gie#257:2@59992f62 +gie/builtins.gie#257:3@40b06d07 +gie/builtins.gie#257:4@4d9f6e7e +gie/builtins.gie#257:5@b491a1b0 +gie/builtins.gie#257:6@3d1cc174 +gie/builtins.gie#257:7@4b6ae9bc +gie/builtins.gie#257:8@b9387114 +gie/builtins.gie#257:9@033d4a14 +gie/builtins.gie#257:10@dac10d6b +gie/builtins.gie#257:11@3ae3618a +gie/builtins.gie#257:12@d35cef8a +gie/builtins.gie#257:13@58223cb2 +gie/builtins.gie#257:14@d89af0d9 +gie/builtins.gie#257:15@a7188e1c +gie/builtins.gie#257:16@8942f100 +gie/builtins.gie#257:17@a9b60ce8 +gie/builtins.gie#257:18@b1ccb06c +gie/builtins.gie#257:19@4b16820a +gie/builtins.gie#257:20@77f4540a +gie/builtins.gie#257:21@920f92a3 +gie/builtins.gie#257:22@9eda73de +gie/builtins.gie#257:23@36b01b9b +gie/builtins.gie#257:24@26a7bf8f +gie/builtins.gie#257:25@80860534 +gie/builtins.gie#257:26@65d65436 +gie/builtins.gie#257:27@7bef382a +gie/builtins.gie#257:28@c6517311 +gie/builtins.gie#257:29@9e811a8f +gie/builtins.gie#257:30@d4c4fcab +gie/builtins.gie#258:0@9b056094 +gie/builtins.gie#258:1@298f15e5 +gie/builtins.gie#258:2@eb582c80 +gie/builtins.gie#258:3@fc001de2 +gie/builtins.gie#258:4@0b6df6b2 +gie/builtins.gie#258:5@812aafec +gie/builtins.gie#258:6@89bc9b8d +gie/builtins.gie#258:7@5eb7f7d0 +gie/builtins.gie#258:8@d78ae0dd +gie/builtins.gie#258:9@6acd6f57 +gie/builtins.gie#259:0@22dca88f +gie/builtins.gie#259:1@003af577 +gie/builtins.gie#259:2@023dc617 +gie/builtins.gie#259:3@723724d6 +gie/builtins.gie#259:4@026b6585 +gie/builtins.gie#259:5@b82ef43a +gie/builtins.gie#259:6@cd3ac599 +gie/builtins.gie#259:7@139dc08b +gie/builtins.gie#260:0@110fc6ca +gie/builtins.gie#260:1@49cff9b4 +gie/builtins.gie#261:0@19d952a3 +gie/builtins.gie#261:1@f303f773 +gie/builtins.gie#262:0@b8a6659e +gie/builtins.gie#262:1@f792754b +gie/builtins.gie#262:2@b3d0631b +gie/builtins.gie#262:3@6de4ed86 +gie/builtins.gie#262:4@79b098e8 +gie/builtins.gie#262:5@5b0cdb47 +gie/builtins.gie#262:6@5b75a998 +gie/builtins.gie#262:7@820467d0 +gie/builtins.gie#263:0@e8be701e +gie/builtins.gie#263:1@53c90f49 +gie/builtins.gie#263:2@3273f489 +gie/builtins.gie#263:3@e9d73370 +gie/builtins.gie#263:4@24932fde +gie/builtins.gie#263:5@c87761c7 +gie/builtins.gie#263:6@b1db04cc +gie/builtins.gie#263:7@65852658 +gie/builtins.gie#264:0@e9bf89c1 +gie/builtins.gie#264:1@7b91381e +gie/builtins.gie#264:2@520c15b5 +gie/builtins.gie#264:3@97efaf04 +gie/builtins.gie#264:4@0b2cc5ad +gie/builtins.gie#264:5@f8f2ad15 +gie/builtins.gie#264:6@c9033aa9 +gie/builtins.gie#264:7@f9ad0a06 +gie/builtins.gie#265:0@294af8cc +gie/builtins.gie#265:1@bf0dd1a1 +gie/builtins.gie#265:2@7a60f50a +gie/builtins.gie#265:3@8d330a66 +gie/builtins.gie#265:4@2ecca8dc +gie/builtins.gie#265:5@53f7a516 +gie/builtins.gie#265:6@fa150ca4 +gie/builtins.gie#265:7@bff4cdb4 +gie/builtins.gie#266:0@e65b922b +gie/builtins.gie#266:1@e83ffc52 +gie/builtins.gie#266:2@d4b81087 +gie/builtins.gie#266:3@6690b542 +gie/builtins.gie#266:4@c6ba83a0 +gie/builtins.gie#266:5@dc809613 +gie/builtins.gie#266:6@6d734fb5 +gie/builtins.gie#266:7@3d3ea4f7 +gie/builtins.gie#267:0@4d5b1f4c +gie/builtins.gie#267:1@b19026f0 +gie/builtins.gie#267:2@f04a8fb6 +gie/builtins.gie#267:3@a0757a43 +gie/builtins.gie#267:4@669da315 +gie/builtins.gie#267:5@f6609b30 +gie/builtins.gie#267:6@e247477a +gie/builtins.gie#267:7@ecca66b1 +gie/builtins.gie#268:0@aff67b3b +gie/builtins.gie#268:1@c23ab6ad +gie/builtins.gie#268:2@d9a24d67 +gie/builtins.gie#268:3@63fc2dbd +gie/builtins.gie#268:4@c165c37f +gie/builtins.gie#268:5@bf993eff +gie/builtins.gie#268:6@5fe776c5 +gie/builtins.gie#268:7@5896b463 +gie/builtins.gie#269:0@43ccf4e8 +gie/builtins.gie#269:1@5c894691 +gie/builtins.gie#269:2@23d36b72 +gie/builtins.gie#269:3@0830f4d4 +gie/builtins.gie#269:4@f571122a +gie/builtins.gie#269:5@9b4be962 +gie/builtins.gie#269:6@932d60a3 +gie/builtins.gie#269:7@36775a2d +gie/builtins.gie#270:0@b5d5a03a +gie/builtins.gie#270:1@42d1b161 +gie/builtins.gie#270:2@8ab09f0a +gie/builtins.gie#270:3@c128b7f6 +gie/builtins.gie#270:4@354b1c07 +gie/builtins.gie#270:5@b4d50160 +gie/builtins.gie#270:6@cd709c2c +gie/builtins.gie#270:7@47667839 +gie/builtins.gie#271:0@5a2952a1 +gie/builtins.gie#271:1@a985ebbf +gie/builtins.gie#271:2@30c870c3 +gie/builtins.gie#271:3@aadc102e +gie/builtins.gie#271:4@00d09e72 +gie/builtins.gie#271:5@3d393846 +gie/builtins.gie#271:6@577682df +gie/builtins.gie#271:7@07e85dd6 +gie/builtins.gie#272:0@10940c20 +gie/builtins.gie#272:1@b6c73c66 +gie/builtins.gie#272:2@558cd39a +gie/builtins.gie#272:3@b74586e3 +gie/builtins.gie#272:4@a604142a +gie/builtins.gie#272:5@ca2f8485 +gie/builtins.gie#272:6@a3957406 +gie/builtins.gie#272:7@b09e6e7a +gie/builtins.gie#273:0@7cb9799b +gie/builtins.gie#273:1@66be1f8d +gie/builtins.gie#273:2@7155bbcc +gie/builtins.gie#273:3@9e949058 +gie/builtins.gie#273:4@16140a7a +gie/builtins.gie#273:5@c4b0d794 +gie/builtins.gie#273:6@f96981c3 +gie/builtins.gie#273:7@a27795dd +gie/builtins.gie#274:0@8aa3b14d +gie/builtins.gie#274:1@3de7856c +gie/builtins.gie#274:2@48cd2d9a +gie/builtins.gie#274:3@da4d6762 +gie/builtins.gie#274:4@2c7db452 +gie/builtins.gie#274:5@509ad52e +gie/builtins.gie#274:6@714c97f7 +gie/builtins.gie#274:7@343ce130 +gie/builtins.gie#275:0@497f48e8 +gie/builtins.gie#275:1@6bd9c9f0 +gie/builtins.gie#275:2@9f0ecb7a +gie/builtins.gie#275:3@fdfbcbf7 +gie/builtins.gie#275:4@e7063e2e +gie/builtins.gie#275:5@30e6041a +gie/builtins.gie#275:6@950f482c +gie/builtins.gie#275:7@7a902eef +gie/builtins.gie#276:0@5ebc4c7c +gie/builtins.gie#276:1@a65f1da5 +gie/builtins.gie#276:2@8bc3b1d1 +gie/builtins.gie#276:3@3cb998c4 +gie/builtins.gie#276:4@a7e561f0 +gie/builtins.gie#276:5@44610618 +gie/builtins.gie#276:6@b97af5e8 +gie/builtins.gie#276:7@4f0c7800 +gie/builtins.gie#277:0@598eca91 +gie/builtins.gie#277:1@1261a5c1 +gie/builtins.gie#277:2@eaa5412a +gie/builtins.gie#277:3@d8fcb429 +gie/builtins.gie#277:4@e1d48ca2 +gie/builtins.gie#277:5@49f475f9 +gie/builtins.gie#277:6@cb42dee0 +gie/builtins.gie#277:7@adee4a30 +gie/builtins.gie#278:0@4ef6e197 +gie/builtins.gie#278:1@5db5a245 +gie/builtins.gie#278:2@c4be0d5f +gie/builtins.gie#278:3@9389c11a +gie/builtins.gie#278:4@76abddec +gie/builtins.gie#278:5@4442cfee +gie/builtins.gie#278:6@f0c71a43 +gie/builtins.gie#278:7@c13a208b +gie/builtins.gie#279:0@766d6fc9 +gie/builtins.gie#279:1@5ef999ea +gie/builtins.gie#279:2@82499513 +gie/builtins.gie#279:3@be96c1a2 +gie/builtins.gie#279:4@88326355 +gie/builtins.gie#279:5@5e3470f2 +gie/builtins.gie#279:6@f3ab7ccd +gie/builtins.gie#279:7@c7ee11f5 +gie/builtins.gie#280:0@98cfe6f1 +gie/builtins.gie#280:1@543fe02b +gie/builtins.gie#280:2@2b73f0eb +gie/builtins.gie#280:3@727b0c26 +gie/builtins.gie#280:4@c9efa2c6 +gie/builtins.gie#280:5@18c105eb +gie/builtins.gie#280:6@243d8d96 +gie/builtins.gie#280:7@176d191a +gie/builtins.gie#280:8@1e39e273 +gie/builtins.gie#280:9@f8c0ed95 +gie/builtins.gie#280:10@61fbc76e +gie/builtins.gie#280:11@84091297 +gie/builtins.gie#280:12@87383335 +gie/builtins.gie#280:13@e7382339 +gie/builtins.gie#280:14@adff2f7e +gie/builtins.gie#280:15@5f3eb1c7 +gie/builtins.gie#280:16@221ccf49 +gie/builtins.gie#281:0@60152d88 +gie/builtins.gie#281:1@709078ba +gie/builtins.gie#281:2@d66bc3e4 +gie/builtins.gie#281:3@33de264e +gie/builtins.gie#281:4@f6fe38f1 +gie/builtins.gie#281:5@ddd0228d +gie/builtins.gie#281:6@6a8e83b9 +gie/builtins.gie#281:7@95cab06a +gie/builtins.gie#282:0@f8eca216 +gie/builtins.gie#282:1@11ad4fb9 +gie/builtins.gie#282:2@1883f730 +gie/builtins.gie#282:3@eb128b2b +gie/builtins.gie#283:0@c28a827e +gie/builtins.gie#283:1@52030359 +gie/builtins.gie#283:2@2fca9854 +gie/builtins.gie#283:3@47f196bb +gie/builtins.gie#283:4@1328d4ea +gie/builtins.gie#283:5@7deb5824 +gie/builtins.gie#283:6@4611300f +gie/builtins.gie#283:7@dafba763 +gie/builtins.gie#283:8@019c20b8 +gie/builtins.gie#283:9@d9b6ea1b +gie/builtins.gie#283:10@5d683727 +gie/builtins.gie#283:11@ba69b579 +gie/builtins.gie#283:12@6177333d +gie/builtins.gie#283:13@d1e27fd2 +gie/builtins.gie#283:14@848dcd5b +gie/builtins.gie#283:15@82c6eb9b +gie/builtins.gie#283:16@13d694bc +gie/builtins.gie#283:17@2d17c5b7 +gie/builtins.gie#283:18@ab5b9d5c +gie/builtins.gie#283:19@7191e96a +gie/builtins.gie#283:20@536e80b3 +gie/builtins.gie#283:21@13fe6e5a +gie/builtins.gie#283:22@b63aec8b +gie/builtins.gie#283:23@a0200c13 +gie/builtins.gie#283:24@8f716b00 +gie/builtins.gie#283:25@80a61358 +gie/builtins.gie#284:0@2bf03730 +gie/builtins.gie#284:1@ac44dc05 +gie/builtins.gie#284:2@bb891546 +gie/builtins.gie#284:3@f851a1a9 +gie/builtins.gie#284:4@dddf3742 +gie/builtins.gie#284:5@22781274 +gie/builtins.gie#285:0@8feb5dd7 +gie/builtins.gie#285:1@2f6f3a5a +gie/builtins.gie#285:2@66a33d8b +gie/builtins.gie#285:3@5ffd746d +gie/builtins.gie#285:4@2a43ff19 +gie/builtins.gie#285:5@99793125 +gie/builtins.gie#286:0@dc40a529 +gie/builtins.gie#286:1@ba51da4e +gie/builtins.gie#286:2@881a480c +gie/builtins.gie#286:3@e31c801c +gie/builtins.gie#286:4@cff40f4d +gie/builtins.gie#286:5@b33f0081 +gie/builtins.gie#287:0@b58609b4 +gie/builtins.gie#287:1@856dc935 +gie/builtins.gie#287:2@a8767ea3 +gie/builtins.gie#287:3@5ac03cdf +gie/builtins.gie#287:4@63a87342 +gie/builtins.gie#287:5@26acfcc9 +gie/builtins.gie#288:0@60a7109e +gie/builtins.gie#288:1@450edc80 +gie/builtins.gie#288:2@b5eeecd6 +gie/builtins.gie#288:3@b13c03b2 +gie/builtins.gie#288:4@c60be884 +gie/builtins.gie#288:5@e824c903 +gie/builtins.gie#289:0@d2bf77e5 +gie/builtins.gie#290:0@95634c69 +gie/builtins.gie#290:1@32a9906b +gie/builtins.gie#290:2@cdcf1b61 +gie/builtins.gie#290:3@b6678fe5 +gie/builtins.gie#290:4@40ae1f8c +gie/builtins.gie#290:5@5ddb3dd0 +gie/builtins.gie#290:6@7f7e79eb +gie/builtins.gie#290:7@79252fb9 +gie/builtins.gie#291:0@856287b8 +gie/builtins.gie#291:1@ada1fe2d +gie/builtins.gie#291:2@4f8b8090 +gie/builtins.gie#291:3@adc25ad1 +gie/builtins.gie#291:4@47f05e29 +gie/builtins.gie#291:5@bed5dc74 +gie/builtins.gie#291:6@98da1cd3 +gie/builtins.gie#291:7@dab419c3 +gie/builtins.gie#292:0@6024d215 +gie/builtins.gie#292:1@fe24cfc0 +gie/builtins.gie#292:2@c2db82b0 +gie/builtins.gie#292:3@cf36fe44 +gie/builtins.gie#292:4@5cb66043 +gie/builtins.gie#292:5@aff4c7dc +gie/builtins.gie#292:6@6623776a +gie/builtins.gie#292:7@ddc653ff +gie/builtins.gie#293:0@d640ab6d +gie/builtins.gie#293:1@3e9480b3 +gie/builtins.gie#293:2@daaa6425 +gie/builtins.gie#293:3@e45a67bd +gie/builtins.gie#293:4@aa07b70a +gie/builtins.gie#293:5@68d16be5 +gie/builtins.gie#293:6@5b4b4d89 +gie/builtins.gie#293:7@1969bf61 +gie/builtins.gie#294:0@cd960bb5 +gie/builtins.gie#294:1@8856bcf9 +gie/builtins.gie#294:2@97dc094b +gie/builtins.gie#294:3@dcc70356 +gie/builtins.gie#294:4@cfe52769 +gie/builtins.gie#294:5@04361bfe +gie/builtins.gie#294:6@d30311ff +gie/builtins.gie#294:7@878735da +gie/builtins.gie#295:0@1f12226c +gie/builtins.gie#295:1@85de50b5 +gie/builtins.gie#295:2@98fba296 +gie/builtins.gie#295:3@920bf630 +gie/builtins.gie#295:4@5e4a34a0 +gie/builtins.gie#295:5@97914019 +gie/builtins.gie#295:6@93f64d47 +gie/builtins.gie#295:7@3e004c81 +gie/builtins.gie#296:0@03746598 +gie/builtins.gie#296:1@1dfd2734 +gie/builtins.gie#296:2@1e2f9589 +gie/builtins.gie#296:3@ce261e98 +gie/builtins.gie#297:0@4e69ef34 +gie/builtins.gie#297:1@d513879c +gie/builtins.gie#297:2@7ea51811 +gie/builtins.gie#297:3@46700fba +gie/builtins.gie#298:0@408608b5 +gie/builtins.gie#298:1@5dac5036 +gie/builtins.gie#298:2@d171784d +gie/builtins.gie#298:3@aecc7c1a +gie/builtins.gie#299:0@fd9b75b4 +gie/builtins.gie#299:1@3dd4109b +gie/builtins.gie#299:2@369a3d1e +gie/builtins.gie#299:3@cf5c0275 +gie/builtins.gie#300:0@e42d2b75 +gie/builtins.gie#300:1@fbba2f2d +gie/builtins.gie#300:2@939b6f18 +gie/builtins.gie#300:3@a7050b3a +gie/builtins.gie#301:0@6b53f039 +gie/builtins.gie#301:1@a71f1a3f +gie/builtins.gie#301:2@eb835503 +gie/builtins.gie#301:3@aab2b300 +gie/builtins.gie#301:4@a7186a3a +gie/builtins.gie#301:5@5e37d4f8 +gie/builtins.gie#301:6@614df39f +gie/builtins.gie#301:7@5910ba5a +gie/builtins.gie#302:0@44607c77 +gie/builtins.gie#302:1@df2b6572 +gie/builtins.gie#302:2@776f0a68 +gie/builtins.gie#302:3@d2f9238d +gie/builtins.gie#302:4@cec13310 +gie/builtins.gie#302:5@ba3c4966 +gie/builtins.gie#302:6@8fcb5274 +gie/builtins.gie#302:7@c66b8eac +gie/builtins.gie#302:8@8c64352e +gie/builtins.gie#303:0@df1a7a99 +gie/builtins.gie#303:1@025365e2 +gie/builtins.gie#303:2@da2cd393 +gie/builtins.gie#303:3@33fd1b92 +gie/builtins.gie#304:0@df376300 +gie/builtins.gie#304:1@408b7f69 +gie/builtins.gie#304:2@b42d6af7 +gie/builtins.gie#304:3@31ff0787 +gie/builtins.gie#305:0@5da7a7ef +gie/builtins.gie#305:1@1c8257d0 +gie/builtins.gie#305:2@8f83e5ed +gie/builtins.gie#305:3@ee2c48c7 +gie/builtins.gie#306:0@bc865e37 +gie/builtins.gie#306:1@de2f4928 +gie/builtins.gie#306:2@9f85f86c +gie/builtins.gie#306:3@5d287a63 +gie/builtins.gie#307:0@144f6287 +gie/builtins.gie#308:0@ccc8f605 +gie/builtins.gie#308:1@9b173f81 +gie/builtins.gie#308:2@f608ed52 +gie/builtins.gie#308:3@43882fea +gie/builtins.gie#308:4@3f74cb17 +gie/builtins.gie#308:5@3121aac8 +gie/builtins.gie#308:6@82235ac1 +gie/builtins.gie#308:7@5bfa47f8 +gie/builtins.gie#309:0@aebb93c0 +gie/builtins.gie#309:1@df6ce276 +gie/builtins.gie#309:2@c8eebeba +gie/builtins.gie#309:3@cfa4498b +gie/builtins.gie#310:0@ed8eb76e +gie/builtins.gie#310:1@d600b814 +gie/builtins.gie#310:2@59495c82 +gie/builtins.gie#310:3@ee7870d9 +gie/builtins.gie#310:4@d8e69051 +gie/builtins.gie#310:5@9933f3e4 +gie/builtins.gie#310:6@8f07821d +gie/builtins.gie#310:7@13128d5c +gie/builtins.gie#311:0@3106fa4f +gie/builtins.gie#311:1@349bf548 +gie/builtins.gie#311:2@c5083028 +gie/builtins.gie#311:3@c89c921d +gie/builtins.gie#311:4@eb7db719 +gie/builtins.gie#311:5@3106fa4f +gie/builtins.gie#311:6@dbb1410a +gie/builtins.gie#311:7@7f776995 +gie/builtins.gie#311:8@c31b84b1 +gie/builtins.gie#311:9@a7bf6dda +gie/builtins.gie#312:0@68c4d38d +gie/builtins.gie#312:1@545d8336 +gie/builtins.gie#312:2@69912a26 +gie/builtins.gie#312:3@836e8c14 +gie/builtins.gie#312:4@1466d2c2 +gie/builtins.gie#312:5@d8d8d384 +gie/builtins.gie#312:6@90987cde +gie/builtins.gie#312:7@d5f530f5 +gie/builtins.gie#313:0@0a9ff2d0 +gie/builtins.gie#313:1@2cd5b270 +gie/builtins.gie#313:2@05b834ca +gie/builtins.gie#313:3@fdb4bf69 +gie/builtins.gie#313:4@220864d1 +gie/builtins.gie#313:5@79a6844e +gie/builtins.gie#313:6@c817615d +gie/builtins.gie#313:7@6f035399 +gie/builtins.gie#314:0@f69b6a19 +gie/builtins.gie#314:1@13040c69 +gie/builtins.gie#314:2@84dbf8b6 +gie/builtins.gie#314:3@1b6ad75b +gie/builtins.gie#314:4@1b1b5bc5 +gie/builtins.gie#314:5@5d699aad +gie/builtins.gie#314:6@f662a05e +gie/builtins.gie#314:7@404f7cbf +gie/builtins.gie#314:8@677736bc +gie/builtins.gie#314:9@197b6546 +gie/builtins.gie#314:10@88eb4dae +gie/builtins.gie#314:11@7d89f2f3 +gie/builtins.gie#315:0@9fcdabf9 +gie/builtins.gie#315:1@9d644f9f +gie/builtins.gie#315:2@5d1fb941 +gie/builtins.gie#315:3@796ff4c8 +gie/builtins.gie#315:4@8ba3cc1e +gie/builtins.gie#315:5@a3597e41 +gie/builtins.gie#315:6@6dfe1d6c +gie/builtins.gie#315:7@cc1a7cdb +gie/builtins.gie#315:8@b66b875b +gie/builtins.gie#315:9@312e5fab +gie/builtins.gie#315:10@2138fba5 +gie/builtins.gie#315:11@63dd413a +gie/builtins.gie#315:12@eda12e2f +gie/builtins.gie#315:13@e4d5f54a +gie/builtins.gie#315:14@9b3aa125 +gie/builtins.gie#315:15@01ccd8b2 +gie/builtins.gie#315:16@c1a75d98 +gie/builtins.gie#315:17@2e5d6092 +gie/builtins.gie#315:18@fbbc2f3d +gie/builtins.gie#315:19@4bc46f77 +gie/builtins.gie#315:20@5458b111 +gie/builtins.gie#315:21@246f7e25 +gie/builtins.gie#315:22@02ed8944 +gie/builtins.gie#315:23@fc5d7eb8 +gie/builtins.gie#315:24@098f0806 +gie/builtins.gie#315:25@39690ee5 +gie/builtins.gie#315:26@8a101434 +gie/builtins.gie#315:27@a67ddf91 +gie/builtins.gie#315:28@c672cbc2 +gie/builtins.gie#315:29@74c14154 +gie/builtins.gie#315:30@3167c338 +gie/builtins.gie#315:31@9cfc2b74 +gie/builtins.gie#315:32@f6a1be20 +gie/builtins.gie#315:33@20f9b116 +gie/builtins.gie#315:34@031373d3 +gie/builtins.gie#315:35@a4317660 +gie/builtins.gie#315:36@b7f8c2a3 +gie/builtins.gie#315:37@25005e59 +gie/builtins.gie#315:38@0919b869 +gie/builtins.gie#315:39@d2bfae95 +gie/builtins.gie#315:40@58b5ab07 +gie/builtins.gie#315:41@8d64221c +gie/builtins.gie#316:0@614c81a6 +gie/builtins.gie#316:1@9652417a +gie/builtins.gie#316:2@39d22209 +gie/builtins.gie#316:3@61302fb5 +gie/builtins.gie#316:4@46e6927f +gie/builtins.gie#316:5@d7085bfc +gie/builtins.gie#316:6@6736f22e +gie/builtins.gie#316:7@3fd46353 +gie/builtins.gie#317:0@3956e1df +gie/builtins.gie#317:1@dc24416f +gie/builtins.gie#317:2@99dc44db +gie/builtins.gie#317:3@627a03fb +gie/builtins.gie#317:4@6defe86f +gie/builtins.gie#317:5@2319b665 +gie/builtins.gie#317:6@1fb6719d +gie/builtins.gie#317:7@91908970 +gie/builtins.gie#317:8@323eb154 +gie/builtins.gie#317:9@33d758ba +gie/builtins.gie#317:10@adf34ee5 +gie/builtins.gie#317:11@9afa826b +gie/builtins.gie#318:0@90f94ab0 +gie/builtins.gie#318:1@fb79d4f5 +gie/builtins.gie#318:2@9b149bf1 +gie/builtins.gie#318:3@5a5e1b81 +gie/builtins.gie#318:4@5c3cd9a7 +gie/builtins.gie#318:5@5bc1237d +gie/builtins.gie#318:6@0e2cd5b8 +gie/builtins.gie#318:7@a08d4c2d +gie/builtins.gie#318:8@6dee4b05 +gie/builtins.gie#318:9@cf59d2d0 +gie/builtins.gie#318:10@08de4290 +gie/builtins.gie#318:11@fbe86ff6 +gie/builtins.gie#319:0@95e80f19 +gie/builtins.gie#319:1@9e51c0e1 +gie/builtins.gie#319:2@9524ba1a +gie/builtins.gie#319:3@fe3bb5b6 +gie/builtins.gie#319:4@c1b1fb48 +gie/builtins.gie#319:5@889d0ec8 +gie/builtins.gie#319:6@4adcc4ae +gie/builtins.gie#319:7@a79d42ac +gie/builtins.gie#319:8@26e59bd5 +gie/builtins.gie#319:9@1b2a6cb4 +gie/builtins.gie#319:10@475307d1 +gie/builtins.gie#319:11@1e0c0257 +gie/builtins.gie#320:0@a1084e2b +gie/builtins.gie#320:1@b71b96fd +gie/builtins.gie#320:2@7f582ab3 +gie/builtins.gie#320:3@96221c4d +gie/builtins.gie#320:4@1a1e7bd3 +gie/builtins.gie#320:5@8554c133 +gie/builtins.gie#320:6@cf969349 +gie/builtins.gie#320:7@86a1d768 +gie/builtins.gie#320:8@9f932b55 +gie/builtins.gie#320:9@300ac440 +gie/builtins.gie#320:10@ae0f0733 +gie/builtins.gie#320:11@40c4cdff +gie/builtins.gie#321:0@c705857d +gie/builtins.gie#322:0@09c065e8 +gie/builtins.gie#322:1@d1adf6d1 +gie/builtins.gie#322:2@18456cac +gie/builtins.gie#322:3@abfb2961 +gie/builtins.gie#322:4@fd0860b4 +gie/builtins.gie#322:5@b0aa9826 +gie/builtins.gie#322:6@cc8498dd +gie/builtins.gie#322:7@5b3657fe +gie/builtins.gie#322:8@3d57d2aa +gie/builtins.gie#322:9@cbfadd01 +gie/builtins.gie#322:10@cd8c0757 +gie/builtins.gie#322:11@03d900c7 +gie/builtins.gie#323:0@213a1760 +gie/builtins.gie#323:1@a58706bc +gie/builtins.gie#323:2@9f6124cd +gie/builtins.gie#323:3@c0f5681c +gie/builtins.gie#323:4@eb76d4ff +gie/builtins.gie#323:5@523258ad +gie/builtins.gie#323:6@e9b03dac +gie/builtins.gie#323:7@b491762a +gie/builtins.gie#323:8@473ef956 +gie/builtins.gie#323:9@56d3677a +gie/builtins.gie#323:10@eba79143 +gie/builtins.gie#323:11@b6c73313 +gie/builtins.gie#324:0@8a7a7039 +gie/builtins.gie#324:1@a2c9c485 +gie/builtins.gie#324:2@998c1b0e +gie/builtins.gie#324:3@d6b8646a +gie/builtins.gie#324:4@97ed9bab +gie/builtins.gie#324:5@2cb883eb +gie/builtins.gie#324:6@a2d8267c +gie/builtins.gie#324:7@2a944d69 +gie/builtins.gie#324:8@07d505ec +gie/builtins.gie#324:9@148fd017 +gie/builtins.gie#325:0@50390dc9 +gie/builtins.gie#325:1@43231436 +gie/builtins.gie#325:2@ec077728 +gie/builtins.gie#325:3@af43d8f3 +gie/builtins.gie#325:4@a8b3f491 +gie/builtins.gie#325:5@a60bf527 +gie/builtins.gie#325:6@d9732232 +gie/builtins.gie#325:7@ba6a3872 +gie/builtins.gie#325:8@60f3496e +gie/builtins.gie#325:9@1e90b9c6 +gie/builtins.gie#325:10@3f6f6dbe +gie/builtins.gie#325:11@b34c4ad7 +gie/builtins.gie#325:12@77f738e0 +gie/builtins.gie#325:13@a3d636d3 +gie/builtins.gie#325:14@e4ae5e57 +gie/builtins.gie#325:15@1e1a09a6 +gie/builtins.gie#326:0@317bcc47 +gie/builtins.gie#327:0@cdeba25a +gie/builtins.gie#327:1@0398a75e +gie/builtins.gie#328:0@07857c21 +gie/builtins.gie#328:1@2dd64b7c +gie/builtins.gie#328:2@1b6b8c56 +gie/builtins.gie#328:3@c6e7a4a2 +gie/builtins.gie#328:4@a6a397d3 +gie/builtins.gie#328:5@4ef4ca76 +gie/builtins.gie#328:6@0bd4f05e +gie/builtins.gie#328:7@00f87c04 +gie/builtins.gie#329:0@6cac9621 +gie/builtins.gie#329:1@7ce0aa63 +gie/builtins.gie#329:2@23dbb0ec +gie/builtins.gie#329:3@09e142f7 +gie/builtins.gie#329:4@59e307a9 +gie/builtins.gie#329:5@eb2d8966 +gie/builtins.gie#329:6@80451b3b +gie/builtins.gie#329:7@e4f27c21 +gie/builtins.gie#330:0@4a6e1705 +gie/builtins.gie#331:0@ee430ae2 +gie/builtins.gie#331:1@97f662c3 +gie/builtins.gie#331:2@a81e9c17 +gie/builtins.gie#331:3@afed49c5 +gie/builtins.gie#331:4@ad116791 +gie/builtins.gie#331:5@35b5d3c8 +gie/builtins.gie#331:6@becb997c +gie/builtins.gie#331:7@a05f021a +gie/builtins.gie#331:8@1a55c285 +gie/builtins.gie#332:0@69b027f7 +gie/builtins.gie#332:1@cb218e76 +gie/builtins.gie#332:2@0ccc132c +gie/builtins.gie#332:3@c633fde4 +gie/builtins.gie#332:4@cbb8cfad +gie/builtins.gie#332:5@d1e35ef3 +gie/builtins.gie#332:6@2f97698c +gie/builtins.gie#332:7@43c531dd +gie/builtins.gie#333:0@adf1d83b +gie/builtins.gie#333:1@c04ba70f +gie/builtins.gie#333:2@9023050d +gie/builtins.gie#333:3@c38ff74a +gie/builtins.gie#333:4@14ef5785 +gie/builtins.gie#333:5@7ee1b2e0 +gie/builtins.gie#333:6@0b401e8b +gie/builtins.gie#333:7@df53ac60 +gie/builtins.gie#334:0@e91371b7 +gie/builtins.gie#335:0@2d16c246 +gie/builtins.gie#335:1@e09a14ca +gie/builtins.gie#335:2@c04f6c5e +gie/builtins.gie#335:3@dff24be9 +gie/builtins.gie#336:0@825d721c +gie/builtins.gie#337:0@af876265 +gie/builtins.gie#337:1@5a99dfe4 +gie/builtins.gie#337:2@9188080d +gie/builtins.gie#337:3@d9f21081 +gie/builtins.gie#337:4@abef9a8d +gie/builtins.gie#337:5@8ffa3198 +gie/builtins.gie#337:6@536b6293 +gie/builtins.gie#337:7@fd795256 +gie/builtins.gie#338:0@88681add +gie/builtins.gie#338:1@e07512e7 +gie/builtins.gie#338:2@b5754d9a +gie/builtins.gie#338:3@b4359f1e +gie/builtins.gie#338:4@0f856130 +gie/builtins.gie#338:5@19e41e92 +gie/builtins.gie#338:6@8265bfda +gie/builtins.gie#338:7@282afffe +gie/builtins.gie#339:0@c15934bd +gie/builtins.gie#340:0@cae29196 +gie/builtins.gie#341:0@6f10f3c4 +gie/builtins.gie#342:0@07656e02 +gie/builtins.gie#343:0@93f28cd2 +gie/builtins.gie#343:1@797411e2 +gie/builtins.gie#343:2@688104f7 +gie/builtins.gie#343:3@e125e7ff +gie/builtins.gie#343:4@97e3a40e +gie/builtins.gie#343:5@7a0edcad +gie/builtins.gie#343:6@985df2b6 +gie/builtins.gie#343:7@afec6aac +gie/builtins.gie#343:8@7d5c0179 +gie/builtins.gie#343:9@3643245f +gie/builtins.gie#344:0@aa9f7439 +gie/builtins.gie#345:0@e915bad2 +gie/builtins.gie#345:1@7d60ebd3 +gie/builtins.gie#345:2@01a49af5 +gie/builtins.gie#345:3@006450fd +gie/builtins.gie#345:4@42018bdb +gie/builtins.gie#345:5@57f68227 +gie/builtins.gie#345:6@03b2e7d2 +gie/builtins.gie#345:7@1a531aea +gie/builtins.gie#345:8@6b0fa3d6 +gie/builtins.gie#345:9@cf8005f5 +gie/builtins.gie#345:10@71011021 +gie/builtins.gie#345:11@3acea89e +gie/builtins.gie#346:0@8f45c8d4 +gie/builtins.gie#346:1@dd4b284f +gie/builtins.gie#346:2@e4ed62db +gie/builtins.gie#346:3@3d8725a6 +gie/builtins.gie#347:0@d65488aa +gie/builtins.gie#347:1@01d0b72e +gie/builtins.gie#347:2@7ccdcdf5 +gie/builtins.gie#347:3@a648b19c +gie/builtins.gie#348:0@4831c8ce +gie/builtins.gie#348:1@829b529b +gie/builtins.gie#348:2@0bce23d8 +gie/builtins.gie#348:3@5d26fb78 +gie/builtins.gie#349:0@923f16aa +gie/builtins.gie#349:1@c332e71b +gie/builtins.gie#349:2@198f42f6 +gie/builtins.gie#349:3@f54697fc +gie/builtins.gie#349:4@36ea6cf2 +gie/builtins.gie#349:5@400bcc6a +gie/builtins.gie#349:6@b6868963 +gie/builtins.gie#349:7@968a0d36 +gie/builtins.gie#350:0@385b15aa +gie/builtins.gie#350:1@461b17b4 +gie/builtins.gie#350:2@e4976deb +gie/builtins.gie#350:3@e2f267f0 +gie/builtins.gie#350:4@360c1347 +gie/builtins.gie#350:5@4b254663 +gie/builtins.gie#350:6@f5a702c4 +gie/builtins.gie#350:7@801143c4 +gie/builtins.gie#351:0@b3b04f1d +gie/builtins.gie#351:1@a60a3087 +gie/builtins.gie#351:2@8d2e3547 +gie/builtins.gie#351:3@1192e6e4 +gie/builtins.gie#351:4@2485176c +gie/builtins.gie#351:5@2f52ac0c +gie/builtins.gie#351:6@13695e6a +gie/builtins.gie#351:7@d08b1c4a +gie/builtins.gie#352:0@9d4f77ef +gie/builtins.gie#352:1@c5706274 +gie/builtins.gie#352:2@c0ceabbc +gie/builtins.gie#352:3@83905932 +gie/builtins.gie#352:4@2ef8c8a8 +gie/builtins.gie#352:5@e36580f0 +gie/builtins.gie#352:6@c3080ff6 +gie/builtins.gie#352:7@bf180dd9 +gie/builtins.gie#353:0@995eabd7 +gie/builtins.gie#353:1@22379f0f +gie/builtins.gie#353:2@4c76b01c +gie/builtins.gie#353:3@bfb8f1de +gie/builtins.gie#353:4@de9b8a44 +gie/builtins.gie#353:5@f5080b9a +gie/builtins.gie#353:6@f6e63677 +gie/builtins.gie#353:7@4e669602 +gie/builtins.gie#354:0@abf1f91f +gie/builtins.gie#354:1@aa899ff6 +gie/builtins.gie#354:2@6de14126 +gie/builtins.gie#354:3@4c8ac8c1 +gie/builtins.gie#354:4@8dc33ae6 +gie/builtins.gie#354:5@c610c63c +gie/builtins.gie#354:6@dc3dfb3d +gie/builtins.gie#354:7@2643db9d +gie/builtins.gie#355:0@3be378dc +gie/builtins.gie#355:1@77ebe670 +gie/builtins.gie#355:2@868955ac +gie/builtins.gie#355:3@04375b75 +gie/builtins.gie#355:4@2a277311 +gie/builtins.gie#355:5@3ecd12f0 +gie/builtins.gie#355:6@572b2580 +gie/builtins.gie#355:7@7044985d +gie/builtins.gie#356:0@3a718449 +gie/builtins.gie#356:1@0dd1effc +gie/builtins.gie#356:2@157df47b +gie/builtins.gie#356:3@102ab7d2 +gie/builtins.gie#356:4@a051cd28 +gie/builtins.gie#356:5@b55e0f0c +gie/builtins.gie#356:6@7fe03ed1 +gie/builtins.gie#356:7@dc2a7553 +gie/builtins.gie#357:0@398f12e6 +gie/builtins.gie#357:1@11a1126a +gie/builtins.gie#357:2@0ea5a88a +gie/builtins.gie#357:3@20ebf467 +gie/builtins.gie#358:0@d004b2da +gie/builtins.gie#358:1@f977290d +gie/builtins.gie#358:2@db85c737 +gie/builtins.gie#358:3@61bbec89 +gie/builtins.gie#358:4@8ce684e0 +gie/builtins.gie#358:5@ed7b2983 +gie/builtins.gie#358:6@da4cca99 +gie/builtins.gie#358:7@d83ce1d8 +gie/builtins.gie#359:0@a9ad9027 +gie/builtins.gie#359:1@a0473a0a +gie/builtins.gie#359:2@6bcca4d6 +gie/builtins.gie#359:3@7ae7b396 +gie/builtins.gie#359:4@4cf4453e +gie/builtins.gie#359:5@f5475da0 +gie/builtins.gie#359:6@4345a0d3 +gie/builtins.gie#359:7@72607e95 +gie/builtins.gie#360:0@eb926b4a +gie/builtins.gie#360:1@7c98d6ca +gie/builtins.gie#360:2@89c0cd38 +gie/builtins.gie#360:3@a4f50133 +gie/builtins.gie#360:4@cb3aad0c +gie/builtins.gie#360:5@fcd4b99f +gie/builtins.gie#360:6@db6b638a +gie/builtins.gie#360:7@55535f91 +gie/builtins.gie#360:8@10402718 +gie/builtins.gie#360:9@52c0e335 +gie/builtins.gie#360:10@17e0b3e1 +gie/builtins.gie#360:11@d5e6734e +gie/builtins.gie#360:12@0d3af258 +gie/builtins.gie#360:13@02a64eff +gie/builtins.gie#360:14@3d1c23bc +gie/builtins.gie#361:0@ba8a1868 +gie/builtins.gie#361:1@32b8bc73 +gie/builtins.gie#361:2@99648328 +gie/builtins.gie#361:3@0f5c6793 +gie/builtins.gie#361:4@86428fd6 +gie/builtins.gie#361:5@7da8034b +gie/builtins.gie#361:6@f3074236 +gie/builtins.gie#361:7@8044083f +gie/builtins.gie#362:0@81c1cf15 +gie/builtins.gie#362:1@9ad6f138 +gie/builtins.gie#363:0@4f53bdc2 +gie/builtins.gie#363:1@4a9aeb0b +gie/builtins.gie#364:0@3c8b342c +gie/builtins.gie#364:1@368ebb48 +gie/builtins.gie#365:0@82225e44 +gie/builtins.gie#366:0@cc09be43 +gie/builtins.gie#367:0@e240be24 +gie/builtins.gie#368:0@c413074b +gie/defmodel.gie#0:0@659600fd +gie/defmodel.gie#1:0@58314b89 +gie/defmodel.gie#2:0@643e1c10 +gie/defmodel.gie#3:0@b9497f02 +gie/defmodel.gie#4:0@b9497f02 +gie/defmodel.gie#5:0@10a4b3ef +gie/defmodel.gie#5:1@e39fb79f +gie/defmodel.gie#6:0@f3fc4b4e +gie/defmodel.gie#6:1@c551eea0 +gie/defmodel.gie#7:0@39d4f918 +gie/defmodel.gie#7:1@6fe3da2d +gie/defmodel.gie#8:0@3f09b2ad +gie/defmodel.gie#8:1@fbb9eef3 +gie/defmodel.gie#9:0@59fa8eb9 +gie/defmodel.gie#9:1@4373b71f +gie/defmodel.gie#9:2@5b66d91c +gie/defmodel.gie#9:3@339fb19c +gie/defmodel.gie#9:4@23fba272 +gie/defmodel.gie#9:5@652f4baf +gie/defmodel.gie#9:6@cb7a7b7a +gie/defmodel.gie#9:7@0dc311ff +gie/defmodel.gie#9:8@f14637b5 +gie/defmodel.gie#9:9@577f5eab +gie/defmodel.gie#10:0@2010e5d0 +gie/defmodel.gie#10:1@41ef1d49 +gie/defmodel.gie#11:0@bfd26650 +gie/defmodel.gie#11:1@f010c0a6 +gie/defmodel.gie#12:0@ab753264 +gie/defmodel.gie#13:0@01d7b392 +gie/defmodel.gie#14:0@22e977d6 +gie/defmodel.gie#15:0@be46bfc0 +gie/defmodel.gie#15:1@e2595268 +gie/defmodel.gie#15:2@2e363056 +gie/defmodel.gie#15:3@7172fcc1 +gie/deformation.gie#0:0@63830baf +gie/deformation.gie#0:1@d329f634 +gie/deformation.gie#1:0@54eb84fd +gie/deformation.gie#1:1@38c259a1 +gie/deformation.gie#2:0@5168eacb +gie/deformation.gie#2:1@f1c4534a +gie/deformation.gie#2:2@5612d3bb +gie/deformation.gie#2:3@5612d3bb +gie/deformation.gie#3:0@71d43f5c +gie/deformation.gie#3:1@4651d449 +gie/deformation.gie#3:2@03036398 +gie/deformation.gie#3:3@03036398 +gie/deformation.gie#4:0@47483dc4 +gie/deformation.gie#5:0@b498d8c4 +gie/deformation.gie#6:0@595c294e +gie/deformation.gie#7:0@ccb636d9 +gie/deformation.gie#8:0@f7806628 +gie/deformation.gie#9:0@35953b3d +gie/deformation.gie#9:1@5f0fa624 +gie/deformation.gie#9:2@23685ff4 +gie/deformation.gie#9:3@6665d130 +gie/deformation.gie#9:4@f88ce2d2 +gie/deformation.gie#9:5@f244bbea +gie/deformation.gie#9:6@3bce64ff +gie/deformation.gie#9:7@56943f9d +gie/deformation.gie#10:0@ea408503 +gie/deformation.gie#10:1@729e09c8 +gie/deformation.gie#10:2@315a829d +gie/deformation.gie#10:3@471d44f8 +gie/deformation.gie#10:4@75bc640f +gie/deformation.gie#10:5@3111ba9b +gie/deformation.gie#11:0@ce32a619 +gie/deformation.gie#11:1@be9f5487 +gie/deformation.gie#11:2@3ad0579a +gie/deformation.gie#11:3@967bfec7 +gie/deformation.gie#11:4@3ad0579a +gie/deformation.gie#11:5@967bfec7 +gie/deformation.gie#12:0@5c1b78ab +gie/deformation.gie#12:1@f0b3df25 +gie/deformation.gie#12:2@80c8d57f +gie/deformation.gie#12:3@8695dfc6 +gie/deformation.gie#12:4@5f81ead8 +gie/deformation.gie#12:5@251c41ae +gie/ellipsoid.gie#0:0@94ff0f0c +gie/ellipsoid.gie#0:1@eeb7ca1a +gie/ellipsoid.gie#1:0@d2dc4974 +gie/ellipsoid.gie#1:1@800f5e46 +gie/ellipsoid.gie#2:0@a24d5f8c +gie/ellipsoid.gie#2:1@80817cd6 +gie/ellipsoid.gie#3:0@b12c61d8 +gie/ellipsoid.gie#4:0@a98076da +gie/ellipsoid.gie#5:0@9f23c9b2 +gie/ellipsoid.gie#6:0@811a5882 +gie/ellipsoid.gie#7:0@a92d2a0e +gie/ellipsoid.gie#8:0@e134c7ae +gie/ellipsoid.gie#9:0@e6e29a08 +gie/ellipsoid.gie#10:0@b9bf6073 +gie/ellipsoid.gie#11:0@ccf91b7f +gie/ellipsoid.gie#12:0@52c177d7 +gie/ellipsoid.gie#13:0@be7408b8 +gie/ellipsoid.gie#14:0@0bbfe32a +gie/ellipsoid.gie#15:0@459324fd +gie/ellipsoid.gie#16:0@5e8355ae +gie/ellipsoid.gie#17:0@a1b3ee17 +gie/ellipsoid.gie#18:0@779e93d7 +gie/ellipsoid.gie#19:0@5f40be10 +gie/ellipsoid.gie#19:1@5ccebb5a +gie/ellipsoid.gie#20:0@a29a5679 +gie/ellipsoid.gie#21:0@1910c75e +gie/ellipsoid.gie#22:0@772736f0 +gie/ellipsoid.gie#23:0@0cfb1a62 +gie/ellipsoid.gie#24:0@d5351ff1 +gie/ellipsoid.gie#25:0@3bf7c7d8 +gie/ellipsoid.gie#26:0@84201bb4 +gie/ellipsoid.gie#27:0@d2a39b75 +gie/ellipsoid.gie#28:0@b945d313 +gie/ellipsoid.gie#29:0@3e1402eb +gie/ellipsoid.gie#30:0@d2a39b75 +gie/ellipsoid.gie#31:0@be862920 +gie/ellipsoid.gie#32:0@2a30faae +gie/epsg_grid.gie#0:0@e71a0ce9 +gie/epsg_grid.gie#1:0@66d05acf +gie/epsg_no_grid.gie#0:0@41eee723 +gie/epsg_no_grid.gie#1:0@54f3bf86 +gie/epsg_no_grid.gie#2:0@54f3bf86 +gie/epsg_no_grid.gie#3:0@757b94e6 +gie/epsg_no_grid.gie#4:0@9ab22feb +gie/epsg_no_grid.gie#5:0@e8e8d26c +gie/geotiff_grids.gie#0:0@a103c2bb +gie/geotiff_grids.gie#1:0@d335f85f +gie/geotiff_grids.gie#2:0@a15455b8 +gie/geotiff_grids.gie#3:0@03ed2249 +gie/geotiff_grids.gie#4:0@6929c92c +gie/geotiff_grids.gie#5:0@31a57314 +gie/geotiff_grids.gie#6:0@55dc871c +gie/geotiff_grids.gie#7:0@a2b67c3a +gie/geotiff_grids.gie#8:0@511284f6 +gie/geotiff_grids.gie#9:0@9213fa0a +gie/geotiff_grids.gie#10:0@3f24aa92 +gie/geotiff_grids.gie#11:0@0d6a9d3c +gie/geotiff_grids.gie#12:0@2a63000f +gie/geotiff_grids.gie#13:0@4f0a0357 +gie/geotiff_grids.gie#14:0@fe2f54a5 +gie/geotiff_grids.gie#15:0@9b797f70 +gie/geotiff_grids.gie#16:0@34925ab2 +gie/geotiff_grids.gie#17:0@4fa50c56 +gie/geotiff_grids.gie#17:1@8a1a09d7 +gie/geotiff_grids.gie#18:0@bccdb606 +gie/geotiff_grids.gie#19:0@8da31234 +gie/geotiff_grids.gie#20:0@5956dc56 +gie/geotiff_grids.gie#21:0@bf069add +gie/geotiff_grids.gie#22:0@840cd06e +gie/geotiff_grids.gie#22:1@1372bfee +gie/geotiff_grids.gie#22:2@c4ba352c +gie/geotiff_grids.gie#22:3@68a401dd +gie/geotiff_grids.gie#22:4@1a2ff884 +gie/geotiff_grids.gie#22:5@fa5aa773 +gie/geotiff_grids.gie#22:6@b2e174a2 +gie/geotiff_grids.gie#22:7@3c2af931 +gie/geotiff_grids.gie#22:8@4cfbf300 +gie/geotiff_grids.gie#22:9@80487e65 +gie/geotiff_grids.gie#23:0@006956a4 +gie/geotiff_grids.gie#24:0@9700d9e6 +gie/geotiff_grids.gie#25:0@180681b5 +gie/geotiff_grids.gie#26:0@d5bbb938 +gie/geotiff_grids.gie#27:0@196de424 +gie/geotiff_grids.gie#28:0@0bbf4fa7 +gie/geotiff_grids.gie#29:0@0d9148e2 +gie/geotiff_grids.gie#30:0@9a7507ae +gie/geotiff_grids.gie#31:0@27ca9130 +gie/geotiff_grids.gie#32:0@9c5e172b +gie/geotiff_grids.gie#33:0@dcdbc252 +gie/geotiff_grids.gie#34:0@bff25d51 +gie/geotiff_grids.gie#34:1@9c953c9f +gie/geotiff_grids.gie#35:0@db30aa81 +gie/geotiff_grids.gie#35:1@791422f0 +gie/geotiff_grids.gie#38:0@f9340374 +gie/geotiff_grids.gie#39:0@5eccd76c +gie/geotiff_grids.gie#39:1@a77bfb98 +gie/gridshift.gie#0:0@b368bf99 +gie/gridshift.gie#0:1@9c83fce3 +gie/gridshift.gie#0:2@3e753fa2 +gie/gridshift.gie#0:3@b32a6f49 +gie/gridshift.gie#0:4@5a3ab249 +gie/gridshift.gie#1:0@58b2e3f0 +gie/gridshift.gie#1:1@533e48c5 +gie/gridshift.gie#1:2@917caf60 +gie/gridshift.gie#1:3@2828846d +gie/gridshift.gie#2:0@b25b8bab +gie/gridshift.gie#2:1@7383d126 +gie/gridshift.gie#2:2@9d9f7749 +gie/gridshift.gie#2:3@54393782 +gie/gridshift.gie#2:4@d3eb3594 +gie/gridshift.gie#2:5@0423af86 +gie/gridshift.gie#2:6@09662880 +gie/gridshift.gie#2:7@753af8ea +gie/gridshift.gie#2:8@ed59e7fb +gie/gridshift.gie#2:9@33ceb017 +gie/gridshift.gie#2:10@aecd16f9 +gie/gridshift.gie#2:11@833d426f +gie/gridshift.gie#2:12@87ee6a12 +gie/gridshift.gie#2:13@69845b35 +gie/gridshift.gie#2:14@f8ae42e9 +gie/gridshift.gie#2:15@743b54a1 +gie/gridshift.gie#2:16@53f1b91b +gie/gridshift.gie#3:0@5d8a8008 +gie/gridshift.gie#4:0@7b762bfb +gie/gridshift.gie#4:1@194a63c3 +gie/gridshift.gie#4:2@fe18ca45 +gie/gridshift.gie#4:3@d2394076 +gie/gridshift.gie#4:4@31512fc5 +gie/gridshift.gie#4:5@602e4003 +gie/gridshift.gie#4:6@644a50e6 +gie/gridshift.gie#4:7@4b5cf4c9 +gie/gridshift.gie#4:8@c1257c82 +gie/gridshift.gie#5:0@df306039 +gie/gridshift.gie#5:1@3edcd7e7 +gie/gridshift.gie#5:2@3df0e129 +gie/gridshift.gie#5:3@8eb6f939 +gie/gridshift.gie#6:0@708469df +gie/gridshift.gie#6:1@598b523c +gie/gridshift.gie#6:2@c9d88c65 +gie/gridshift.gie#6:3@8fed33a0 +gie/gridshift.gie#7:0@3d36d665 +gie/gridshift.gie#7:1@556c4642 +gie/gridshift.gie#8:0@6a618544 +gie/gridshift.gie#8:1@fe5ef91f +gie/gridshift.gie#9:0@d5103581 +gie/gridshift.gie#9:1@7ec97e04 +gie/gridshift.gie#10:0@4898d8fb +gie/gridshift.gie#11:0@8071677f +gie/gridshift.gie#11:1@586f0c6a +gie/gridshift.gie#12:0@fc0531d2 +gie/gridshift.gie#12:1@0638e3ee +gie/gridshift.gie#13:0@bcb8594d +gie/gridshift.gie#14:0@d22cf042 +gie/gridshift.gie#15:0@936db53e +gie/gridshift.gie#16:0@b830a045 +gie/guyou.gie#0:0@4d9035e1 +gie/guyou.gie#0:1@c3ef9e63 +gie/guyou.gie#0:2@c5d8ecb5 +gie/guyou.gie#0:3@05c8aa3c +gie/guyou.gie#0:4@0aa30d46 +gie/guyou.gie#0:5@bdaf9d42 +gie/guyou.gie#0:6@138604ae +gie/guyou.gie#0:7@347c4c1a +gie/guyou.gie#0:8@1e06184f +gie/guyou.gie#0:9@e21b1300 +gie/guyou.gie#0:10@31091a63 +gie/guyou.gie#0:11@5f281b59 +gie/guyou.gie#0:12@2c7b95a1 +gie/guyou.gie#0:13@2adb2d34 +gie/guyou.gie#0:14@de808d32 +gie/guyou.gie#0:15@a0c1e8be +gie/guyou.gie#0:16@bf2ade6a +gie/guyou.gie#0:17@03dd4a1d +gie/guyou.gie#0:18@a8ea51e3 +gie/guyou.gie#0:19@545b8d84 +gie/guyou.gie#0:20@c77b3228 +gie/guyou.gie#0:21@9235c8f3 +gie/guyou.gie#0:22@b77e5013 +gie/guyou.gie#0:23@4e9c7f84 +gie/guyou.gie#0:24@2b6bdd40 +gie/guyou.gie#0:25@f7e852f4 +gie/guyou.gie#0:26@7e042f91 +gie/guyou.gie#0:27@e9c6457c +gie/guyou.gie#0:28@7b248c56 +gie/guyou.gie#0:29@436bc9dc +gie/guyou.gie#0:30@be0c8f77 +gie/guyou.gie#0:31@7e15065c +gie/guyou.gie#0:32@94f9ef88 +gie/guyou.gie#0:33@8ede6a4a +gie/guyou.gie#0:34@9fa49450 +gie/guyou.gie#0:35@0c75c305 +gie/guyou.gie#0:36@dcba4866 +gie/guyou.gie#0:37@40517172 +gie/guyou.gie#0:38@3a6c617c +gie/guyou.gie#0:39@f6e92cda +gie/guyou.gie#0:40@0e499b0c +gie/guyou.gie#0:41@07e55ece +gie/guyou.gie#0:42@5e9bdfef +gie/guyou.gie#0:43@c023d39f +gie/guyou.gie#0:44@5bc2ff9c +gie/guyou.gie#0:45@0dbc372d +gie/guyou.gie#0:46@786b8888 +gie/guyou.gie#0:47@72d5c934 +gie/guyou.gie#0:48@1184c4b9 +gie/guyou.gie#0:49@48d4b49f +gie/guyou.gie#0:50@50e15fa3 +gie/guyou.gie#0:51@4405f97c +gie/guyou.gie#0:52@c3dff712 +gie/guyou.gie#0:53@cf3a5c8d +gie/guyou.gie#0:54@12457c53 +gie/guyou.gie#0:55@6c8c3478 +gie/guyou.gie#0:56@39ac7087 +gie/guyou.gie#0:57@13860c9a +gie/guyou.gie#0:58@8237db77 +gie/guyou.gie#0:59@ede33e75 +gie/guyou.gie#0:60@16cbf6e5 +gie/guyou.gie#0:61@f5de942d +gie/guyou.gie#0:62@35b82b9b +gie/guyou.gie#0:63@5b833a2d +gie/guyou.gie#0:64@edeace5d +gie/guyou.gie#0:65@2707059a +gie/guyou.gie#0:66@658d526c +gie/guyou.gie#0:67@bf2de774 +gie/guyou.gie#0:68@a371816f +gie/guyou.gie#0:69@fad50fe8 +gie/guyou.gie#0:70@4410f4ec +gie/guyou.gie#0:71@f6311000 +gie/guyou.gie#0:72@c837a1b9 +gie/guyou.gie#0:73@4898b40b +gie/guyou.gie#0:74@0b7c3d76 +gie/guyou.gie#0:75@03c374e7 +gie/guyou.gie#0:76@8e1b123e +gie/guyou.gie#0:77@86e1ae38 +gie/guyou.gie#0:78@cac5615e +gie/guyou.gie#0:79@d36cb989 +gie/guyou.gie#0:80@44baae8a +gie/guyou.gie#0:81@eaee0527 +gie/guyou.gie#0:82@f4db7879 +gie/guyou.gie#0:83@3df8302b +gie/guyou.gie#0:84@8f35c40b +gie/guyou.gie#0:85@949af717 +gie/guyou.gie#0:86@93e766cd +gie/guyou.gie#0:87@2070ed86 +gie/guyou.gie#0:88@10e3e6f4 +gie/guyou.gie#0:89@50806ede +gie/guyou.gie#0:90@7cb3b58c +gie/guyou.gie#0:91@165b1788 +gie/guyou.gie#0:92@6ae30339 +gie/guyou.gie#0:93@78841118 +gie/guyou.gie#0:94@74da1d1c +gie/guyou.gie#0:95@42c35643 +gie/guyou.gie#0:96@c12599d4 +gie/guyou.gie#0:97@a0f36238 +gie/guyou.gie#0:98@33679294 +gie/guyou.gie#0:99@fc03dc5d +gie/guyou.gie#0:100@df2e2f8b +gie/guyou.gie#0:101@07d3a2b0 +gie/guyou.gie#0:102@d3018d28 +gie/guyou.gie#0:103@fdd68700 +gie/guyou.gie#0:104@bcc8f5c2 +gie/guyou.gie#0:105@f3b872eb +gie/guyou.gie#0:106@76c093f4 +gie/guyou.gie#0:107@eec78192 +gie/guyou.gie#0:108@2d71585f +gie/guyou.gie#0:109@677a3db1 +gie/guyou.gie#0:110@6d7fc272 +gie/guyou.gie#0:111@ef96dd6a +gie/guyou.gie#0:112@41a3fb5c +gie/guyou.gie#0:113@3d4f7fc2 +gie/guyou.gie#0:114@f123d490 +gie/guyou.gie#0:115@283b8fad +gie/guyou.gie#0:116@1d4970e3 +gie/guyou.gie#0:117@b6ecbe54 +gie/guyou.gie#0:118@fa866b49 +gie/guyou.gie#0:119@9c5e715b +gie/guyou.gie#0:120@f46daf84 +gie/guyou.gie#0:121@a9ccf6e2 +gie/guyou.gie#0:122@5ae661c8 +gie/guyou.gie#0:123@c052bcbb +gie/guyou.gie#0:124@efec5ef1 +gie/guyou.gie#0:125@f77e4f91 +gie/guyou.gie#0:126@48902f52 +gie/guyou.gie#0:127@e230e934 +gie/guyou.gie#0:128@606a524a +gie/guyou.gie#0:129@c36623df +gie/guyou.gie#0:130@192a6093 +gie/guyou.gie#0:131@1f7a5b4b +gie/guyou.gie#0:132@86279a6e +gie/guyou.gie#0:133@65c510dc +gie/guyou.gie#0:134@8e193e8e +gie/guyou.gie#0:135@77514041 +gie/guyou.gie#0:136@c954edd9 +gie/guyou.gie#0:137@913dc4ea +gie/guyou.gie#0:138@b2dfcb37 +gie/guyou.gie#0:139@0d29ffd5 +gie/guyou.gie#0:140@86119cc8 +gie/guyou.gie#0:141@fcf5ab3b +gie/guyou.gie#0:142@c71923ea +gie/guyou.gie#0:143@b7ead787 +gie/guyou.gie#0:144@291e08fc +gie/guyou.gie#0:145@2ac38985 +gie/guyou.gie#0:146@f2f4a024 +gie/guyou.gie#0:147@a2f81102 +gie/guyou.gie#0:148@f704c59e +gie/guyou.gie#0:149@3eb3a9d7 +gie/guyou.gie#0:150@e5dbf15b +gie/guyou.gie#0:151@f039cc73 +gie/guyou.gie#0:152@9c0b0118 +gie/guyou.gie#0:153@7b1b7b66 +gie/guyou.gie#0:154@af4ed828 +gie/guyou.gie#0:155@c91cf1a3 +gie/guyou.gie#0:156@89d7b04d +gie/guyou.gie#0:157@80e15851 +gie/guyou.gie#0:158@f448c699 +gie/guyou.gie#0:159@0544f7d2 +gie/guyou.gie#0:160@890e1fb7 +gie/guyou.gie#0:161@82ebaa1f +gie/guyou.gie#0:162@070ec58f +gie/guyou.gie#0:163@05bdc63d +gie/guyou.gie#0:164@b279350b +gie/guyou.gie#0:165@ebce3532 +gie/guyou.gie#0:166@6b6e2b90 +gie/guyou.gie#0:167@857de8a6 +gie/guyou.gie#0:168@238e96b3 +gie/guyou.gie#0:169@1ebb7e41 +gie/guyou.gie#0:170@b62540a9 +gie/guyou.gie#0:171@5ee5eb0a +gie/guyou.gie#0:172@c0e468ab +gie/guyou.gie#0:173@2255adb9 +gie/guyou.gie#0:174@977dafdc +gie/guyou.gie#0:175@827c5cdf +gie/guyou.gie#0:176@64407122 +gie/guyou.gie#0:177@34084b2d +gie/guyou.gie#0:178@e0a9840e +gie/guyou.gie#0:179@bed16253 +gie/guyou.gie#0:180@e4373358 +gie/guyou.gie#0:181@dc3147be +gie/guyou.gie#0:182@249dd2ec +gie/guyou.gie#0:183@80d509bf +gie/guyou.gie#0:184@1ebc206c +gie/guyou.gie#0:185@122e1863 +gie/guyou.gie#0:186@9a6df0af +gie/guyou.gie#0:187@302bce53 +gie/guyou.gie#0:188@731761ea +gie/guyou.gie#0:189@3e9a8366 +gie/guyou.gie#0:190@a81507a2 +gie/guyou.gie#0:191@0557f0b6 +gie/guyou.gie#0:192@c371fad0 +gie/guyou.gie#0:193@2c0bcdcd +gie/guyou.gie#0:194@72335855 +gie/guyou.gie#0:195@b92a766d +gie/guyou.gie#0:196@98f93598 +gie/guyou.gie#0:197@01fe2c6a +gie/guyou.gie#0:198@9a85ddc6 +gie/guyou.gie#0:199@bd94200e +gie/guyou.gie#0:200@9bd253d9 +gie/guyou.gie#0:201@cfc5ce2a +gie/guyou.gie#0:202@49c10275 +gie/guyou.gie#0:203@4229a88d +gie/guyou.gie#0:204@a58802c9 +gie/guyou.gie#0:205@0257af8a +gie/guyou.gie#0:206@0151e994 +gie/guyou.gie#0:207@fb492f9e +gie/guyou.gie#0:208@9ef2f5c0 +gie/guyou.gie#0:209@b12c6669 +gie/guyou.gie#0:210@f1198499 +gie/guyou.gie#0:211@70cd6535 +gie/guyou.gie#0:212@c200aeb5 +gie/guyou.gie#0:213@9123e458 +gie/guyou.gie#0:214@5c1d4b69 +gie/guyou.gie#0:215@edfedeac +gie/guyou.gie#0:216@32291765 +gie/guyou.gie#0:217@4ab3ad28 +gie/guyou.gie#0:218@27435feb +gie/guyou.gie#0:219@ddb91740 +gie/guyou.gie#0:220@9555c74a +gie/guyou.gie#0:221@5fd7b3d9 +gie/guyou.gie#0:222@eba59bb4 +gie/guyou.gie#0:223@be034c18 +gie/guyou.gie#0:224@4cfa0793 +gie/guyou.gie#0:225@f6346211 +gie/guyou.gie#0:226@fae637b4 +gie/guyou.gie#0:227@276f0b44 +gie/guyou.gie#0:228@e46225da +gie/guyou.gie#0:229@e84ef3ee +gie/guyou.gie#0:230@d765962b +gie/guyou.gie#0:231@e19712f8 +gie/guyou.gie#0:232@6c4bd792 +gie/guyou.gie#0:233@07e77bf2 +gie/guyou.gie#0:234@4f5e3e1c +gie/guyou.gie#0:235@1ada8256 +gie/guyou.gie#0:236@4e15e1c3 +gie/guyou.gie#0:237@f1e2269f +gie/guyou.gie#0:238@f4299f41 +gie/guyou.gie#0:239@46163f8b +gie/guyou.gie#0:240@1082b797 +gie/guyou.gie#0:241@ac31bb1b +gie/guyou.gie#0:242@d946ce88 +gie/guyou.gie#0:243@92071126 +gie/guyou.gie#0:244@d6176490 +gie/guyou.gie#0:245@7e6be3b2 +gie/guyou.gie#0:246@9935c43e +gie/guyou.gie#0:247@08a33fdf +gie/guyou.gie#0:248@da25b997 +gie/guyou.gie#0:249@ea9fd96c +gie/guyou.gie#0:250@9ff7f490 +gie/guyou.gie#0:251@9bc954df +gie/guyou.gie#0:252@cff0afdd +gie/guyou.gie#0:253@372a152e +gie/guyou.gie#0:254@d7d1350c +gie/guyou.gie#0:255@78a25a24 +gie/guyou.gie#0:256@b1c196ff +gie/guyou.gie#0:257@2e1c99d3 +gie/guyou.gie#0:258@406f7d00 +gie/guyou.gie#0:259@7cf78596 +gie/guyou.gie#0:260@c23fe0d1 +gie/guyou.gie#0:261@e5a69a06 +gie/guyou.gie#0:262@56376ba1 +gie/guyou.gie#0:263@8d7da777 +gie/guyou.gie#0:264@f1987678 +gie/guyou.gie#0:265@21ebcbc6 +gie/guyou.gie#0:266@5fa0ae6b +gie/guyou.gie#0:267@f40b2dce +gie/guyou.gie#0:268@11a3de3e +gie/guyou.gie#0:269@f8c6bdb1 +gie/guyou.gie#0:270@c35fa415 +gie/guyou.gie#0:271@7db91ede +gie/guyou.gie#0:272@8c258533 +gie/guyou.gie#0:273@7858537b +gie/guyou.gie#0:274@5e54180d +gie/guyou.gie#0:275@681d3a32 +gie/guyou.gie#0:276@eb05a0bd +gie/guyou.gie#0:277@783ddafe +gie/guyou.gie#0:278@7541bceb +gie/guyou.gie#0:279@9fbcfa2f +gie/guyou.gie#0:280@fbda9592 +gie/guyou.gie#0:281@73c2dfc2 +gie/guyou.gie#0:282@b6a901cf +gie/guyou.gie#0:283@f9a9ac31 +gie/guyou.gie#0:284@37943d0f +gie/guyou.gie#0:285@709a6e4a +gie/guyou.gie#0:286@e5729524 +gie/guyou.gie#0:287@7d4753bd +gie/guyou.gie#0:288@4a6a7ce9 +gie/guyou.gie#0:289@9bc550d7 +gie/guyou.gie#0:290@70f7c187 +gie/guyou.gie#0:291@ecbf22bf +gie/guyou.gie#0:292@c472325d +gie/guyou.gie#0:293@9025f0e9 +gie/guyou.gie#0:294@d17521f9 +gie/guyou.gie#0:295@b1437825 +gie/guyou.gie#0:296@5d8f7617 +gie/guyou.gie#0:297@9b6a0bc5 +gie/guyou.gie#0:298@8a5768a6 +gie/guyou.gie#0:299@ee7d7e73 +gie/guyou.gie#0:300@05a40218 +gie/guyou.gie#0:301@046074ca +gie/guyou.gie#0:302@ce4a7015 +gie/guyou.gie#0:303@571bc272 +gie/guyou.gie#0:304@a2dc2f8a +gie/guyou.gie#0:305@2582ef90 +gie/guyou.gie#0:306@28de5077 +gie/guyou.gie#0:307@85311987 +gie/guyou.gie#0:308@9715e1cb +gie/guyou.gie#0:309@b196289c +gie/guyou.gie#0:310@0aa7932e +gie/guyou.gie#0:311@5e55d10a +gie/guyou.gie#0:312@e258d495 +gie/guyou.gie#0:313@fc99e1a4 +gie/guyou.gie#0:314@586d70ed +gie/guyou.gie#0:315@e86d567e +gie/guyou.gie#0:316@c9ca11db +gie/guyou.gie#0:317@6228397e +gie/guyou.gie#0:318@bb4548df +gie/guyou.gie#0:319@8e387739 +gie/guyou.gie#0:320@bb300daa +gie/guyou.gie#0:321@1ee0399e +gie/guyou.gie#0:322@c9787e3a +gie/guyou.gie#0:323@ab30f60c +gie/guyou.gie#0:324@b01b54b5 +gie/guyou.gie#0:325@9490f7bb +gie/guyou.gie#0:326@f86de396 +gie/guyou.gie#0:327@df2c3ba7 +gie/guyou.gie#0:328@7b776a08 +gie/guyou.gie#0:329@fe8f5a8a +gie/guyou.gie#0:330@098ab8e1 +gie/guyou.gie#0:331@a9fbc2c2 +gie/guyou.gie#0:332@93e0191d +gie/guyou.gie#0:333@474f10af +gie/guyou.gie#0:334@7811286f +gie/guyou.gie#0:335@640e3cbb +gie/guyou.gie#0:336@aae9e6da +gie/guyou.gie#0:337@1d1f16b9 +gie/guyou.gie#0:338@81769896 +gie/guyou.gie#0:339@994d14f3 +gie/guyou.gie#0:340@669020f0 +gie/guyou.gie#0:341@295043a9 +gie/guyou.gie#0:342@91542703 +gie/guyou.gie#0:343@d0d7f381 +gie/guyou.gie#0:344@a63658c0 +gie/guyou.gie#0:345@f45eb6fc +gie/guyou.gie#0:346@27353855 +gie/guyou.gie#0:347@3fe4b6e6 +gie/guyou.gie#0:348@2d685f88 +gie/guyou.gie#0:349@19363860 +gie/guyou.gie#0:350@31c97249 +gie/guyou.gie#0:351@ce2d003b +gie/guyou.gie#0:352@4038f577 +gie/guyou.gie#0:353@b2f2c0f8 +gie/guyou.gie#0:354@9de00e06 +gie/guyou.gie#0:355@4d4594d9 +gie/guyou.gie#0:356@197e7b24 +gie/guyou.gie#0:357@7d3aaef3 +gie/guyou.gie#0:358@f9e2faa9 +gie/guyou.gie#0:359@2123628b +gie/guyou.gie#0:360@b00ca5ea +gie/guyou.gie#0:361@64f54f2a +gie/guyou.gie#0:362@9b18c8bf +gie/guyou.gie#0:363@bd7e3e92 +gie/guyou.gie#0:364@16414318 +gie/guyou.gie#0:365@30e7168c +gie/guyou.gie#0:366@017a90bb +gie/guyou.gie#0:367@08a83ae8 +gie/guyou.gie#0:368@9244798e +gie/guyou.gie#0:369@fc3dc9b1 +gie/guyou.gie#0:370@3e1534df +gie/guyou.gie#0:371@50d00a1f +gie/guyou.gie#0:372@1c930b19 +gie/guyou.gie#0:373@1371c73d +gie/guyou.gie#0:374@37d26fd0 +gie/guyou.gie#0:375@478531b9 +gie/guyou.gie#0:376@4b8afd58 +gie/guyou.gie#0:377@0e5b154e +gie/guyou.gie#0:378@ebf0d0e0 +gie/guyou.gie#0:379@b351c845 +gie/guyou.gie#0:380@ffda0673 +gie/guyou.gie#0:381@dda6aab9 +gie/guyou.gie#0:382@51f08c0b +gie/guyou.gie#0:383@3603023a +gie/guyou.gie#0:384@d4689203 +gie/guyou.gie#0:385@69d9a59c +gie/guyou.gie#0:386@c6458cd0 +gie/guyou.gie#0:387@d5a2d215 +gie/guyou.gie#0:388@9b187b49 +gie/guyou.gie#0:389@e8272ac7 +gie/guyou.gie#0:390@3c01d9d7 +gie/guyou.gie#0:391@753acf1f +gie/guyou.gie#0:392@aaebb089 +gie/guyou.gie#0:393@13d760e2 +gie/guyou.gie#0:394@e4446ef0 +gie/guyou.gie#0:395@70639fc5 +gie/guyou.gie#0:396@98471517 +gie/guyou.gie#0:397@9245394f +gie/guyou.gie#0:398@e4a85b26 +gie/guyou.gie#0:399@d46452c7 +gie/guyou.gie#0:400@fc86add0 +gie/guyou.gie#0:401@48207980 +gie/guyou.gie#0:402@42b714c1 +gie/guyou.gie#0:403@6e15bdf8 +gie/guyou.gie#0:404@a4eae924 +gie/guyou.gie#0:405@558771ce +gie/guyou.gie#0:406@8400ce7e +gie/guyou.gie#0:407@097c511a +gie/guyou.gie#0:408@845ea5bc +gie/guyou.gie#0:409@fe03c17a +gie/guyou.gie#0:410@c9179490 +gie/guyou.gie#0:411@4cdd5b78 +gie/guyou.gie#0:412@9c03465b +gie/guyou.gie#0:413@c26cc9d0 +gie/guyou.gie#0:414@7c39f76c +gie/guyou.gie#0:415@b4adb2a7 +gie/guyou.gie#0:416@75895095 +gie/guyou.gie#0:417@2342bcb4 +gie/guyou.gie#0:418@a24ab7bf +gie/guyou.gie#0:419@5ea4a818 +gie/guyou.gie#0:420@a76b4b65 +gie/guyou.gie#0:421@f74fbe53 +gie/guyou.gie#0:422@83ae134b +gie/guyou.gie#0:423@56223e29 +gie/guyou.gie#0:424@842d3c21 +gie/guyou.gie#0:425@c0a1c068 +gie/guyou.gie#0:426@05b7f699 +gie/guyou.gie#0:427@6c59f84c +gie/guyou.gie#0:428@43f62211 +gie/guyou.gie#0:429@feed0003 +gie/guyou.gie#0:430@16784a9f +gie/guyou.gie#0:431@5f67c7c8 +gie/guyou.gie#0:432@296b52cc +gie/guyou.gie#0:433@12095804 +gie/guyou.gie#0:434@2088e929 +gie/guyou.gie#0:435@7b553384 +gie/guyou.gie#0:436@1d815c60 +gie/guyou.gie#0:437@06c6cd86 +gie/guyou.gie#0:438@f50fbb10 +gie/guyou.gie#0:439@2f51c5e0 +gie/guyou.gie#0:440@34cb50d6 +gie/guyou.gie#0:441@7e8b5852 +gie/guyou.gie#0:442@df0399b6 +gie/guyou.gie#0:443@f79d16d8 +gie/guyou.gie#0:444@ee5611c6 +gie/guyou.gie#0:445@7d219358 +gie/guyou.gie#0:446@bb2877c5 +gie/guyou.gie#0:447@9c30dd18 +gie/guyou.gie#0:448@2bca5247 +gie/guyou.gie#0:449@03fef2cd +gie/guyou.gie#0:450@d167b5f6 +gie/guyou.gie#0:451@23b10c80 +gie/guyou.gie#0:452@b6ba6ac1 +gie/guyou.gie#0:453@fd17a8d1 +gie/guyou.gie#0:454@87ff8c91 +gie/guyou.gie#0:455@2d706a3c +gie/guyou.gie#0:456@848bd300 +gie/guyou.gie#0:457@a94563c7 +gie/guyou.gie#0:458@42087eaa +gie/guyou.gie#0:459@d6d344e2 +gie/guyou.gie#0:460@fbea6729 +gie/guyou.gie#0:461@c4f151cd +gie/guyou.gie#0:462@5a4dbd8b +gie/guyou.gie#0:463@d80e0c4d +gie/guyou.gie#0:464@3d6b2e4a +gie/guyou.gie#0:465@509843a2 +gie/guyou.gie#0:466@8699ba11 +gie/guyou.gie#0:467@839e3498 +gie/guyou.gie#0:468@8eb1aada +gie/guyou.gie#0:469@6a52e784 +gie/guyou.gie#0:470@32e5c09a +gie/guyou.gie#0:471@2fdcdf3a +gie/guyou.gie#0:472@d138fe5c +gie/guyou.gie#0:473@e69cc606 +gie/guyou.gie#0:474@b7b262f9 +gie/guyou.gie#0:475@a61cb258 +gie/guyou.gie#0:476@1efef143 +gie/guyou.gie#0:477@372c6123 +gie/guyou.gie#0:478@35d0cede +gie/guyou.gie#0:479@162b8378 +gie/guyou.gie#0:480@6d61090d +gie/guyou.gie#0:481@261134fd +gie/guyou.gie#0:482@97b9fc8b +gie/guyou.gie#0:483@fe765976 +gie/guyou.gie#0:484@513ccce8 +gie/guyou.gie#0:485@791bdea2 +gie/guyou.gie#0:486@025d2127 +gie/guyou.gie#0:487@2047b05d +gie/guyou.gie#0:488@510cd436 +gie/guyou.gie#0:489@eac0efbd +gie/guyou.gie#0:490@8b3a745b +gie/guyou.gie#0:491@24724175 +gie/guyou.gie#0:492@34534db4 +gie/guyou.gie#0:493@25ec5b57 +gie/guyou.gie#0:494@08c83f21 +gie/guyou.gie#0:495@206d0177 +gie/guyou.gie#0:496@6a047129 +gie/guyou.gie#0:497@fd856585 +gie/guyou.gie#0:498@35065a74 +gie/guyou.gie#0:499@0435d0b2 +gie/guyou.gie#0:500@9e6b5e2a +gie/guyou.gie#0:501@135369b2 +gie/guyou.gie#0:502@5f1cc27b +gie/guyou.gie#0:503@eb94633f +gie/guyou.gie#0:504@989b2fd0 +gie/guyou.gie#0:505@a166136c +gie/guyou.gie#0:506@f7da39aa +gie/guyou.gie#0:507@912ca506 +gie/guyou.gie#0:508@9a2807d0 +gie/guyou.gie#0:509@6ff75368 +gie/guyou.gie#0:510@6a1bbeb1 +gie/guyou.gie#0:511@fd021feb +gie/guyou.gie#0:512@a8e4b9f9 +gie/guyou.gie#0:513@c46c63a0 +gie/guyou.gie#0:514@7b92cdee +gie/guyou.gie#0:515@b73071b6 +gie/guyou.gie#0:516@2aa42bdb +gie/guyou.gie#0:517@c44cdafd +gie/guyou.gie#0:518@33b207ec +gie/guyou.gie#0:519@1379e134 +gie/guyou.gie#0:520@9b866a9c +gie/guyou.gie#0:521@d92016b9 +gie/guyou.gie#0:522@b61cb567 +gie/guyou.gie#0:523@2ace1d18 +gie/guyou.gie#0:524@ddd194a3 +gie/guyou.gie#0:525@8c516acb +gie/guyou.gie#0:526@4144258e +gie/guyou.gie#0:527@6a1e6481 +gie/guyou.gie#0:528@ff633b86 +gie/guyou.gie#0:529@f58b025c +gie/guyou.gie#0:530@5bf5d271 +gie/guyou.gie#0:531@727462a6 +gie/guyou.gie#0:532@9d1a360f +gie/guyou.gie#0:533@55935a45 +gie/guyou.gie#0:534@9f9a995d +gie/guyou.gie#0:535@d06411ed +gie/guyou.gie#0:536@2732a09e +gie/guyou.gie#0:537@e3a4cc9f +gie/guyou.gie#0:538@62813abe +gie/guyou.gie#0:539@99d9d410 +gie/guyou.gie#0:540@37398328 +gie/guyou.gie#0:541@dbc87428 +gie/guyou.gie#0:542@4c2059c1 +gie/guyou.gie#0:543@c74cdfca +gie/guyou.gie#0:544@b9276823 +gie/guyou.gie#0:545@61dee3a8 +gie/guyou.gie#0:546@d861e02d +gie/guyou.gie#0:547@011eea84 +gie/guyou.gie#0:548@51877016 +gie/guyou.gie#0:549@86164973 +gie/guyou.gie#0:550@5de99109 +gie/guyou.gie#0:551@e6d73f23 +gie/guyou.gie#0:552@324b96c8 +gie/guyou.gie#0:553@1f5026ac +gie/guyou.gie#0:554@735777af +gie/guyou.gie#0:555@dc72ca3b +gie/guyou.gie#0:556@4e0012d8 +gie/guyou.gie#0:557@63e4354c +gie/guyou.gie#0:558@a878a4fe +gie/guyou.gie#0:559@d8390b18 +gie/guyou.gie#0:560@7b6b0f57 +gie/guyou.gie#0:561@cb6e9af5 +gie/guyou.gie#0:562@95a66468 +gie/guyou.gie#0:563@8b4e5b84 +gie/guyou.gie#0:564@44107e43 +gie/guyou.gie#0:565@875e4173 +gie/guyou.gie#0:566@31d0413c +gie/guyou.gie#0:567@5f8ad398 +gie/guyou.gie#0:568@f79acff6 +gie/guyou.gie#0:569@734781c0 +gie/guyou.gie#0:570@dd9e9a58 +gie/guyou.gie#0:571@d4714048 +gie/guyou.gie#0:572@99edfee5 +gie/guyou.gie#0:573@4a25da0f +gie/guyou.gie#0:574@8d316ad6 +gie/guyou.gie#0:575@426841f6 +gie/guyou.gie#0:576@cc1ba8fe +gie/guyou.gie#0:577@e327ad33 +gie/guyou.gie#0:578@ecd9736e +gie/guyou.gie#0:579@13f38d1b +gie/guyou.gie#0:580@8b00fee5 +gie/guyou.gie#0:581@ffacd45e +gie/guyou.gie#0:582@f2e3c065 +gie/guyou.gie#0:583@bd36a0bb +gie/guyou.gie#0:584@1a8f5cf7 +gie/guyou.gie#0:585@3fe60d61 +gie/guyou.gie#0:586@7c37b5fd +gie/guyou.gie#0:587@34f2e423 +gie/guyou.gie#0:588@816b9f1c +gie/guyou.gie#0:589@29a5c88b +gie/guyou.gie#0:590@47ffa8b4 +gie/guyou.gie#0:591@16aca684 +gie/guyou.gie#0:592@7632773b +gie/guyou.gie#0:593@16d9e80c +gie/guyou.gie#0:594@1f4d10ca +gie/guyou.gie#0:595@195b9c00 +gie/guyou.gie#0:596@7b9192dd +gie/guyou.gie#0:597@1eaf51d9 +gie/guyou.gie#0:598@e82bcdf5 +gie/guyou.gie#0:599@f60f93ce +gie/guyou.gie#0:600@4632993e +gie/guyou.gie#0:601@e1960093 +gie/guyou.gie#0:602@d4bc53cc +gie/guyou.gie#0:603@eda146e4 +gie/guyou.gie#0:604@c5a94e35 +gie/guyou.gie#0:605@d141da78 +gie/guyou.gie#0:606@552be7c1 +gie/guyou.gie#0:607@52cef4c1 +gie/guyou.gie#0:608@70f7688c +gie/guyou.gie#0:609@4a8363fe +gie/guyou.gie#0:610@82cedb5c +gie/guyou.gie#0:611@0b096143 +gie/guyou.gie#0:612@b8671145 +gie/guyou.gie#0:613@1c87732c +gie/guyou.gie#0:614@fda4ffa2 +gie/guyou.gie#0:615@ebd21dde +gie/guyou.gie#0:616@a38ef07e +gie/guyou.gie#0:617@c62bb819 +gie/guyou.gie#0:618@58da22cc +gie/guyou.gie#0:619@6f97978d +gie/guyou.gie#0:620@8a43abfa +gie/guyou.gie#0:621@c33330fe +gie/guyou.gie#0:622@d9b23ecd +gie/guyou.gie#0:623@06a623e1 +gie/guyou.gie#0:624@6883b88c +gie/guyou.gie#0:625@24164141 +gie/guyou.gie#0:626@d6bdbe92 +gie/guyou.gie#0:627@cd2e793b +gie/guyou.gie#0:628@1f9fa852 +gie/guyou.gie#0:629@2767017f +gie/guyou.gie#0:630@66d452b0 +gie/guyou.gie#0:631@d7fe4d9d +gie/guyou.gie#0:632@8fd7efb9 +gie/guyou.gie#0:633@0043718e +gie/guyou.gie#0:634@2035f04e +gie/guyou.gie#0:635@9eff9a5c +gie/guyou.gie#0:636@09bb3432 +gie/guyou.gie#0:637@7dcaa995 +gie/guyou.gie#0:638@bf447c93 +gie/guyou.gie#0:639@66b0cdb7 +gie/guyou.gie#0:640@e5507158 +gie/guyou.gie#0:641@33e9a59c +gie/guyou.gie#0:642@8736680b +gie/guyou.gie#0:643@531f8320 +gie/guyou.gie#0:644@9181282d +gie/guyou.gie#0:645@26b812e8 +gie/guyou.gie#0:646@a04575cd +gie/guyou.gie#0:647@4ef5caaa +gie/guyou.gie#0:648@a5bc36d1 +gie/guyou.gie#0:649@1ea526b3 +gie/guyou.gie#0:650@8549d959 +gie/guyou.gie#0:651@03610548 +gie/guyou.gie#0:652@c91ee961 +gie/guyou.gie#0:653@4bb0aa16 +gie/guyou.gie#0:654@85036d32 +gie/guyou.gie#0:655@aaf5d624 +gie/guyou.gie#0:656@1676bfce +gie/guyou.gie#0:657@049f048e +gie/guyou.gie#0:658@651f9c40 +gie/guyou.gie#0:659@c1cd6156 +gie/guyou.gie#0:660@cfc84888 +gie/guyou.gie#0:661@6b133cb7 +gie/guyou.gie#0:662@24f91861 +gie/guyou.gie#0:663@914175e5 +gie/guyou.gie#0:664@c0de0738 +gie/guyou.gie#0:665@37de6ffc +gie/guyou.gie#0:666@959b6476 +gie/guyou.gie#0:667@02119806 +gie/guyou.gie#0:668@b459ab60 +gie/guyou.gie#0:669@620a26df +gie/guyou.gie#0:670@74df0f0f +gie/guyou.gie#0:671@5e2888c4 +gie/guyou.gie#0:672@f0dfa3ed +gie/guyou.gie#0:673@251fb5f5 +gie/guyou.gie#0:674@4b460d11 +gie/guyou.gie#0:675@8b276df5 +gie/guyou.gie#0:676@dd27a068 +gie/guyou.gie#0:677@c0d9d798 +gie/guyou.gie#0:678@6894ab55 +gie/guyou.gie#0:679@ca0849f5 +gie/guyou.gie#0:680@4429366d +gie/guyou.gie#0:681@903ed8e9 +gie/guyou.gie#0:682@ed60726f +gie/guyou.gie#0:683@3dd5bfdb +gie/guyou.gie#0:684@cde19176 +gie/guyou.gie#0:685@e681c629 +gie/guyou.gie#0:686@84917584 +gie/guyou.gie#0:687@d2310337 +gie/guyou.gie#0:688@9deb10bb +gie/guyou.gie#0:689@9610d657 +gie/guyou.gie#0:690@d35c008a +gie/guyou.gie#0:691@fcb1ae5b +gie/guyou.gie#0:692@822dc890 +gie/guyou.gie#0:693@32116cb0 +gie/guyou.gie#0:694@2babf061 +gie/guyou.gie#0:695@9d2aa3bf +gie/guyou.gie#0:696@294f2082 +gie/guyou.gie#0:697@1293a852 +gie/guyou.gie#0:698@a65a4e52 +gie/guyou.gie#0:699@182c933a +gie/guyou.gie#0:700@e395978d +gie/guyou.gie#0:701@6464fa54 +gie/guyou.gie#0:702@c23000ef +gie/guyou.gie#1:0@3fa23c5c +gie/guyou.gie#1:1@96b0368f +gie/more_builtins.gie#0:0@580e8508 +gie/more_builtins.gie#0:1@1a7505e6 +gie/more_builtins.gie#1:0@0f92fd3e +gie/more_builtins.gie#1:1@0a805ccf +gie/more_builtins.gie#2:0@6da5c845 +gie/more_builtins.gie#2:1@eea539d9 +gie/more_builtins.gie#3:0@8a6e28b0 +gie/more_builtins.gie#3:1@b1b89e38 +gie/more_builtins.gie#4:0@6ce1288e +gie/more_builtins.gie#5:0@c4a79b77 +gie/more_builtins.gie#6:0@fe290782 +gie/more_builtins.gie#6:1@d8b57fb3 +gie/more_builtins.gie#6:2@fffe4b49 +gie/more_builtins.gie#6:3@a9d803a0 +gie/more_builtins.gie#6:4@2c2a02ed +gie/more_builtins.gie#6:5@a51b4fba +gie/more_builtins.gie#6:6@cac23817 +gie/more_builtins.gie#6:7@73bf0fab +gie/more_builtins.gie#6:8@2bfb4b44 +gie/more_builtins.gie#7:0@174c0a51 +gie/more_builtins.gie#7:1@174c0a51 +gie/more_builtins.gie#8:0@52982133 +gie/more_builtins.gie#8:1@52982133 +gie/more_builtins.gie#9:0@892e107a +gie/more_builtins.gie#9:1@892e107a +gie/more_builtins.gie#10:0@3566f22d +gie/more_builtins.gie#10:1@3566f22d +gie/more_builtins.gie#11:0@a3c5c9e6 +gie/more_builtins.gie#11:1@6f4105e0 +gie/more_builtins.gie#12:0@f88db287 +gie/more_builtins.gie#12:1@af2e65ef +gie/more_builtins.gie#13:0@758e1316 +gie/more_builtins.gie#14:0@93db1eb5 +gie/more_builtins.gie#15:0@7fe6b96b +gie/more_builtins.gie#16:0@c868400e +gie/more_builtins.gie#17:0@7ae0edfa +gie/more_builtins.gie#18:0@8894ef55 +gie/more_builtins.gie#19:0@d7455890 +gie/more_builtins.gie#20:0@2f7711eb +gie/more_builtins.gie#20:1@84581e76 +gie/more_builtins.gie#20:2@b769e98a +gie/more_builtins.gie#20:3@d03d2dae +gie/more_builtins.gie#20:4@64bc8da0 +gie/more_builtins.gie#20:5@ec4d7cb9 +gie/more_builtins.gie#20:6@46e6f5b3 +gie/more_builtins.gie#20:7@c645d14d +gie/more_builtins.gie#21:0@c182e6bf +gie/more_builtins.gie#22:0@b0cfed7b +gie/more_builtins.gie#23:0@ab88c92a +gie/more_builtins.gie#24:0@cd74e481 +gie/more_builtins.gie#24:1@c6f1bfd8 +gie/more_builtins.gie#25:0@65aabf43 +gie/more_builtins.gie#26:0@13d7590c +gie/more_builtins.gie#27:0@e9ae5218 +gie/more_builtins.gie#27:1@a2cd9744 +gie/more_builtins.gie#28:0@8d6e00b5 +gie/more_builtins.gie#29:0@440fb720 +gie/more_builtins.gie#30:0@582b18d9 +gie/more_builtins.gie#31:0@54c9153a +gie/more_builtins.gie#32:0@bfdd296d +gie/more_builtins.gie#32:1@d619235e +gie/more_builtins.gie#33:0@02885b06 +gie/more_builtins.gie#34:0@4f43d251 +gie/more_builtins.gie#35:0@3581bc95 +gie/more_builtins.gie#36:0@bd381b24 +gie/more_builtins.gie#37:0@0cf545b9 +gie/more_builtins.gie#38:0@83134cd1 +gie/more_builtins.gie#39:0@a4189ae5 +gie/more_builtins.gie#40:0@ae9bc90d +gie/more_builtins.gie#40:1@aa887449 +gie/more_builtins.gie#41:0@78c588dd +gie/more_builtins.gie#42:0@d0725fca +gie/more_builtins.gie#42:1@48860d17 +gie/more_builtins.gie#42:2@be28dbdb +gie/more_builtins.gie#42:3@8ade7fdb +gie/more_builtins.gie#42:4@856aa66f +gie/more_builtins.gie#43:0@2af514a0 +gie/more_builtins.gie#43:1@d27e4170 +gie/more_builtins.gie#44:0@4698d7ad +gie/more_builtins.gie#45:0@2312e13b +gie/more_builtins.gie#46:0@be35f7ba +gie/more_builtins.gie#47:0@e129e62a +gie/more_builtins.gie#48:0@abaf17bc +gie/more_builtins.gie#48:1@68a6ffb2 +gie/more_builtins.gie#48:2@7d06098a +gie/more_builtins.gie#48:3@b7bee898 +gie/more_builtins.gie#48:4@6013b53a +gie/more_builtins.gie#48:5@0796ac1d +gie/more_builtins.gie#49:0@4b35a99d +gie/more_builtins.gie#49:1@91676636 +gie/more_builtins.gie#50:0@c41ca624 +gie/more_builtins.gie#50:1@686b9450 +gie/more_builtins.gie#50:2@1ff551c9 +gie/more_builtins.gie#50:3@0d64dfbc +gie/more_builtins.gie#50:4@fb9592cd +gie/more_builtins.gie#50:5@263d8ddf +gie/more_builtins.gie#50:6@10cf4dd9 +gie/more_builtins.gie#50:7@428d9840 +gie/more_builtins.gie#50:8@b293a7dc +gie/more_builtins.gie#50:9@7712f99b +gie/more_builtins.gie#50:10@c41ca624 +gie/more_builtins.gie#50:11@7cfd2664 +gie/more_builtins.gie#50:12@86a72721 +gie/more_builtins.gie#50:13@6b420a45 +gie/more_builtins.gie#51:0@d71a5221 +gie/more_builtins.gie#51:1@b157f93a +gie/more_builtins.gie#51:2@dd65faa0 +gie/more_builtins.gie#51:3@6bd68f4a +gie/more_builtins.gie#51:4@a727a003 +gie/more_builtins.gie#51:5@d0481429 +gie/more_builtins.gie#51:6@e81c2780 +gie/more_builtins.gie#51:7@89e9aa20 +gie/more_builtins.gie#51:8@b993f6e6 +gie/more_builtins.gie#51:9@61796f6a +gie/more_builtins.gie#51:10@d71a5221 +gie/more_builtins.gie#51:11@f5bcc0e0 +gie/more_builtins.gie#51:12@fe20d6b9 +gie/more_builtins.gie#51:13@c7b30413 +gie/more_builtins.gie#52:0@cd36ce5a +gie/more_builtins.gie#52:1@1a059ef4 +gie/more_builtins.gie#52:2@731e60f3 +gie/more_builtins.gie#53:0@045ab01a +gie/more_builtins.gie#53:1@cfb4de04 +gie/more_builtins.gie#54:0@44d548ba +gie/more_builtins.gie#54:1@26b30c70 +gie/more_builtins.gie#54:2@936cb02d +gie/more_builtins.gie#54:3@a168a129 +gie/more_builtins.gie#54:4@ecccc3fc +gie/more_builtins.gie#54:5@86178e68 +gie/more_builtins.gie#55:0@c9dd0c24 +gie/more_builtins.gie#55:1@4bbedf33 +gie/more_builtins.gie#56:0@3497c0e5 +gie/more_builtins.gie#56:1@ffec0199 +gie/more_builtins.gie#56:2@c7d0a994 +gie/more_builtins.gie#56:3@29319f7e +gie/more_builtins.gie#56:4@ab17e861 +gie/more_builtins.gie#56:5@1c8f46f7 +gie/more_builtins.gie#57:0@948fa8d1 +gie/more_builtins.gie#58:0@c84f4698 +gie/more_builtins.gie#59:0@4fc173d6 +gie/more_builtins.gie#60:0@d53780eb +gie/more_builtins.gie#60:1@a5497a80 +gie/more_builtins.gie#61:0@fa90e3a2 +gie/more_builtins.gie#61:1@dce3b47e +gie/more_builtins.gie#62:0@4851bba3 +gie/more_builtins.gie#62:1@f9925fc6 +gie/more_builtins.gie#62:2@f4ff92e3 +gie/more_builtins.gie#63:0@203724ae +gie/more_builtins.gie#64:0@4b5bd637 +gie/more_builtins.gie#64:1@fca1b350 +gie/more_builtins.gie#64:2@5e80cd2b +gie/more_builtins.gie#64:3@8b12ab84 +gie/more_builtins.gie#64:4@ea8fedfc +gie/more_builtins.gie#64:5@a958d2ef +gie/more_builtins.gie#64:6@04083559 +gie/more_builtins.gie#64:7@5c592c07 +gie/more_builtins.gie#64:8@872b8cb7 +gie/more_builtins.gie#64:9@582aed33 +gie/more_builtins.gie#64:10@e82fb3fc +gie/more_builtins.gie#64:11@e1ccd536 +gie/more_builtins.gie#64:12@4b8f01b0 +gie/more_builtins.gie#64:13@c28b3897 +gie/more_builtins.gie#64:14@82d39e16 +gie/more_builtins.gie#64:15@ac9f11fc +gie/more_builtins.gie#64:16@6e26fcfb +gie/more_builtins.gie#64:17@41aafa0b +gie/more_builtins.gie#65:0@ccbc70e2 +gie/more_builtins.gie#66:0@06484e4c +gie/more_builtins.gie#67:0@3d5578f0 +gie/more_builtins.gie#67:1@dec1159e +gie/more_builtins.gie#68:0@764f679b +gie/more_builtins.gie#68:1@a3be99ac +gie/more_builtins.gie#69:0@c13a81b8 +gie/more_builtins.gie#69:1@9404b0cc +gie/more_builtins.gie#70:0@7d0727e2 +gie/more_builtins.gie#70:1@e6592888 +gie/more_builtins.gie#71:0@74b4cc92 +gie/more_builtins.gie#71:1@644a92af +gie/more_builtins.gie#72:0@754dd033 +gie/more_builtins.gie#72:1@76f9b422 +gie/more_builtins.gie#73:0@9dc37b01 +gie/more_builtins.gie#73:1@96381e20 +gie/more_builtins.gie#74:0@ad000cc1 +gie/nkg.gie#0:0@ad78e806 +gie/nkg.gie#1:0@fb856f5e +gie/nkg.gie#2:0@22e3be31 +gie/nkg.gie#3:0@936a2f93 +gie/nkg.gie#3:1@466c4eac +gie/nkg.gie#4:0@2a230122 +gie/nkg.gie#4:1@4feb1a36 +gie/nkg.gie#5:0@9ea86a0f +gie/nkg.gie#5:1@c4cfa820 +gie/nkg.gie#6:0@6ce6a297 +gie/nkg.gie#7:0@5e4d3539 +gie/nkg.gie#8:0@8d18b1d3 +gie/nkg.gie#9:0@d8f12f18 +gie/nkg.gie#10:0@f100e836 +gie/nkg.gie#11:0@0d3949ea +gie/nkg.gie#12:0@6885dab1 +gie/nkg.gie#13:0@45ac5f2b +gie/nkg.gie#14:0@5aa23c23 +gie/nkg.gie#15:0@a6b304e5 +gie/nkg.gie#16:0@41ebfd6b +gie/nkg.gie#17:0@86ec21d9 +gie/nkg.gie#18:0@baa0f9bd +gie/nkg.gie#19:0@d5d90900 +gie/nkg.gie#20:0@0024b67d +gie/nkg.gie#21:0@18a712cf +gie/nkg.gie#22:0@31969039 +gie/nkg.gie#22:1@074f8a62 +gie/nkg.gie#22:2@f950cd19 +gie/nkg.gie#23:0@297eefc3 +gie/nkg.gie#24:0@5c55317a +gie/nkg.gie#25:0@6d4aa67c +gie/nkg.gie#25:1@840d8821 +gie/nkg.gie#25:2@869fdcd9 +gie/peirce_q.gie#0:0@dc99e98d +gie/peirce_q.gie#0:1@cb25308f +gie/peirce_q.gie#0:2@a7a54ba8 +gie/peirce_q.gie#0:3@93279659 +gie/peirce_q.gie#0:4@47d54c13 +gie/peirce_q.gie#0:5@7920dccf +gie/peirce_q.gie#0:6@fc82cac8 +gie/peirce_q.gie#0:7@6ddb519b +gie/peirce_q.gie#0:8@dd302f9b +gie/peirce_q.gie#0:9@42b3569f +gie/peirce_q.gie#0:10@62770b39 +gie/peirce_q.gie#0:11@7cf75590 +gie/peirce_q.gie#0:12@b398ec12 +gie/peirce_q.gie#0:13@93bf0b0b +gie/peirce_q.gie#0:14@9f87f96f +gie/peirce_q.gie#0:15@7a3a0fc2 +gie/peirce_q.gie#0:16@d2607e44 +gie/peirce_q.gie#0:17@f5a59386 +gie/peirce_q.gie#0:18@b905a69c +gie/peirce_q.gie#0:19@ee416a25 +gie/peirce_q.gie#0:20@82c4065b +gie/peirce_q.gie#0:21@b04b0749 +gie/peirce_q.gie#0:22@10c69372 +gie/peirce_q.gie#0:23@49127ca3 +gie/peirce_q.gie#0:24@b2691832 +gie/peirce_q.gie#0:25@30602c8a +gie/peirce_q.gie#0:26@c77bc003 +gie/peirce_q.gie#0:27@c6d8af3d +gie/peirce_q.gie#0:28@b324eac0 +gie/peirce_q.gie#0:29@a45d9642 +gie/peirce_q.gie#0:30@1c2ee3c1 +gie/peirce_q.gie#0:31@405e2646 +gie/peirce_q.gie#0:32@ce506244 +gie/peirce_q.gie#0:33@f805f049 +gie/peirce_q.gie#0:34@c7cb918b +gie/peirce_q.gie#0:35@b9320eb4 +gie/peirce_q.gie#0:36@56a14853 +gie/peirce_q.gie#0:37@40f2e7d5 +gie/peirce_q.gie#0:38@2548ea02 +gie/peirce_q.gie#0:39@6a758539 +gie/peirce_q.gie#0:40@2e93770e +gie/peirce_q.gie#0:41@29a638cd +gie/peirce_q.gie#0:42@e6611e1f +gie/peirce_q.gie#0:43@d04d1241 +gie/peirce_q.gie#0:44@a83140dd +gie/peirce_q.gie#0:45@e63060c7 +gie/peirce_q.gie#0:46@b9fe3696 +gie/peirce_q.gie#0:47@ae43f55b +gie/peirce_q.gie#0:48@fefa2235 +gie/peirce_q.gie#0:49@ab730764 +gie/peirce_q.gie#0:50@71d1d89c +gie/peirce_q.gie#0:51@2b9533ff +gie/peirce_q.gie#0:52@43f9a4de +gie/peirce_q.gie#0:53@741707b6 +gie/peirce_q.gie#0:54@23ae49be +gie/peirce_q.gie#0:55@f5558543 +gie/peirce_q.gie#0:56@4bc7a75b +gie/peirce_q.gie#0:57@5b0c9101 +gie/peirce_q.gie#0:58@162a95b5 +gie/peirce_q.gie#1:0@7e177faa +gie/peirce_q.gie#1:1@c4cbcd7e +gie/peirce_q.gie#1:2@a59ef4aa +gie/peirce_q.gie#1:3@bec87434 +gie/peirce_q.gie#1:4@5238c5fd +gie/peirce_q.gie#1:5@04eac69d +gie/peirce_q.gie#1:6@f9e1e9f2 +gie/peirce_q.gie#1:7@185dc408 +gie/peirce_q.gie#1:8@d82652c8 +gie/peirce_q.gie#1:9@d8bae54e +gie/peirce_q.gie#1:10@73cb5e69 +gie/peirce_q.gie#1:11@71ac1915 +gie/peirce_q.gie#1:12@936b0aaa +gie/peirce_q.gie#1:13@6ffe2bfe +gie/peirce_q.gie#1:14@e3ac55b4 +gie/peirce_q.gie#1:15@136bfad9 +gie/peirce_q.gie#1:16@8451a473 +gie/peirce_q.gie#1:17@42cc5384 +gie/peirce_q.gie#1:18@236fd03f +gie/peirce_q.gie#1:19@9b793ad8 +gie/peirce_q.gie#1:20@12be9de8 +gie/peirce_q.gie#1:21@1cf07778 +gie/peirce_q.gie#1:22@c14a6691 +gie/peirce_q.gie#1:23@6090e0df +gie/peirce_q.gie#1:24@a11f36b9 +gie/peirce_q.gie#1:25@2c8c0242 +gie/peirce_q.gie#1:26@1a83baf8 +gie/peirce_q.gie#1:27@467e1519 +gie/peirce_q.gie#1:28@3f3e88fa +gie/peirce_q.gie#1:29@947161bd +gie/peirce_q.gie#1:30@dbb69c9b +gie/peirce_q.gie#1:31@e47e9c03 +gie/peirce_q.gie#1:32@dccee750 +gie/peirce_q.gie#1:33@7cfe6b19 +gie/peirce_q.gie#1:34@59761ab4 +gie/peirce_q.gie#1:35@2fbad1f3 +gie/peirce_q.gie#1:36@02aa60d3 +gie/peirce_q.gie#1:37@4e9645b1 +gie/peirce_q.gie#1:38@540dcb32 +gie/peirce_q.gie#1:39@1e3e1a2f +gie/peirce_q.gie#1:40@ab29f437 +gie/peirce_q.gie#1:41@1a74594d +gie/peirce_q.gie#1:42@96cf8ffa +gie/peirce_q.gie#1:43@03bea283 +gie/peirce_q.gie#1:44@ee7648d6 +gie/peirce_q.gie#1:45@afd0704a +gie/peirce_q.gie#1:46@7dd13341 +gie/peirce_q.gie#1:47@e5889d1d +gie/peirce_q.gie#1:48@0f9950f1 +gie/peirce_q.gie#1:49@392a2031 +gie/peirce_q.gie#1:50@a6d9c1f9 +gie/peirce_q.gie#1:51@11d86f12 +gie/peirce_q.gie#1:52@5ece0d84 +gie/peirce_q.gie#1:53@c50a53d9 +gie/peirce_q.gie#1:54@5b4da560 +gie/peirce_q.gie#1:55@1fabfb85 +gie/peirce_q.gie#1:56@cdc92eae +gie/peirce_q.gie#1:57@cad3ff2b +gie/peirce_q.gie#1:58@af26b647 +gie/peirce_q.gie#2:0@ece94d24 +gie/peirce_q.gie#2:1@8d40b07c +gie/peirce_q.gie#2:2@4db0c18f +gie/peirce_q.gie#2:3@df99e7b0 +gie/peirce_q.gie#2:4@c6e1b48e +gie/peirce_q.gie#2:5@9c7d1d84 +gie/peirce_q.gie#2:6@46a17f6e +gie/peirce_q.gie#2:7@97048a63 +gie/peirce_q.gie#2:8@af7e0a75 +gie/peirce_q.gie#2:9@a182788a +gie/peirce_q.gie#2:10@06114bd9 +gie/peirce_q.gie#2:11@25a9b088 +gie/peirce_q.gie#2:12@e7f16d0b +gie/peirce_q.gie#2:13@0c3769e9 +gie/peirce_q.gie#2:14@24098ab9 +gie/peirce_q.gie#2:15@12ce2eb3 +gie/peirce_q.gie#2:16@a12bc8ad +gie/peirce_q.gie#2:17@d626d9d8 +gie/peirce_q.gie#2:18@733bbe97 +gie/peirce_q.gie#2:19@c6cb274d +gie/peirce_q.gie#2:20@4045f4e7 +gie/peirce_q.gie#2:21@e73acca1 +gie/peirce_q.gie#2:22@7c02943c +gie/peirce_q.gie#2:23@937a378f +gie/peirce_q.gie#2:24@7b985edc +gie/peirce_q.gie#2:25@27adaf0d +gie/peirce_q.gie#2:26@b7d0410f +gie/peirce_q.gie#2:27@d9071896 +gie/peirce_q.gie#2:28@fd199655 +gie/peirce_q.gie#2:29@eb26265a +gie/peirce_q.gie#2:30@597c9006 +gie/peirce_q.gie#2:31@46974af9 +gie/peirce_q.gie#2:32@c7c46ef5 +gie/peirce_q.gie#2:33@429759d0 +gie/peirce_q.gie#2:34@c4dff845 +gie/peirce_q.gie#2:35@c453c738 +gie/peirce_q.gie#2:36@3ef7c6e0 +gie/peirce_q.gie#2:37@a7a27a5b +gie/peirce_q.gie#2:38@b2452516 +gie/peirce_q.gie#2:39@f53ab450 +gie/peirce_q.gie#2:40@552e123d +gie/peirce_q.gie#2:41@1e411315 +gie/peirce_q.gie#2:42@e9b4b1df +gie/peirce_q.gie#2:43@4cb485f3 +gie/peirce_q.gie#2:44@e569a8d5 +gie/peirce_q.gie#2:45@f97c0195 +gie/peirce_q.gie#2:46@f59bc578 +gie/peirce_q.gie#2:47@a9969327 +gie/peirce_q.gie#2:48@ed1378a6 +gie/peirce_q.gie#2:49@be340afb +gie/peirce_q.gie#2:50@94c3f828 +gie/peirce_q.gie#2:51@1f0de7cf +gie/peirce_q.gie#2:52@44ffbb55 +gie/peirce_q.gie#2:53@a8251e11 +gie/peirce_q.gie#2:54@e8c71047 +gie/peirce_q.gie#2:55@25b1cb10 +gie/peirce_q.gie#2:56@ee5ed76f +gie/peirce_q.gie#2:57@23b4007c +gie/peirce_q.gie#2:58@89c7a2c4 +gie/peirce_q.gie#3:0@3249acd3 +gie/peirce_q.gie#3:1@775812e0 +gie/peirce_q.gie#3:2@743d792e +gie/peirce_q.gie#3:3@f7296980 +gie/peirce_q.gie#3:4@26292b8c +gie/peirce_q.gie#3:5@af0a48a0 +gie/peirce_q.gie#3:6@52ff57a8 +gie/peirce_q.gie#3:7@06996c51 +gie/peirce_q.gie#3:8@9fb5f856 +gie/peirce_q.gie#3:9@ee6725c1 +gie/peirce_q.gie#3:10@3f972813 +gie/peirce_q.gie#3:11@658d6cab +gie/peirce_q.gie#3:12@d0048615 +gie/peirce_q.gie#3:13@4b21fc4e +gie/peirce_q.gie#3:14@3bb71001 +gie/peirce_q.gie#3:15@65fd0438 +gie/peirce_q.gie#3:16@23d29e96 +gie/peirce_q.gie#3:17@bb78f3f9 +gie/peirce_q.gie#3:18@0c66a7ab +gie/peirce_q.gie#3:19@919a172b +gie/peirce_q.gie#3:20@25569d81 +gie/peirce_q.gie#3:21@fa9b9b5b +gie/peirce_q.gie#3:22@2cad07fa +gie/peirce_q.gie#3:23@4aec6be1 +gie/peirce_q.gie#3:24@6531d082 +gie/peirce_q.gie#3:25@d9ab252c +gie/peirce_q.gie#3:26@86519f14 +gie/peirce_q.gie#3:27@0818d22c +gie/peirce_q.gie#3:28@f0693125 +gie/peirce_q.gie#3:29@17476d9c +gie/peirce_q.gie#3:30@68d7b20b +gie/peirce_q.gie#3:31@2721e998 +gie/peirce_q.gie#3:32@9c3b628c +gie/peirce_q.gie#3:33@f53fce5e +gie/peirce_q.gie#3:34@c15efa3e +gie/peirce_q.gie#3:35@47f3736c +gie/peirce_q.gie#3:36@863dbd4b +gie/peirce_q.gie#3:37@5a4e1fa9 +gie/peirce_q.gie#3:38@f4c04d55 +gie/peirce_q.gie#3:39@831e3068 +gie/peirce_q.gie#3:40@3b9d433c +gie/peirce_q.gie#3:41@352413d8 +gie/peirce_q.gie#3:42@a0837dd7 +gie/peirce_q.gie#3:43@30285670 +gie/peirce_q.gie#3:44@37546b7e +gie/peirce_q.gie#3:45@cdd618b8 +gie/peirce_q.gie#3:46@71174737 +gie/peirce_q.gie#3:47@e865697f +gie/peirce_q.gie#3:48@6f48c83c +gie/peirce_q.gie#3:49@c7e8bad5 +gie/peirce_q.gie#3:50@49c1ec3e +gie/peirce_q.gie#3:51@1cd9ee0e +gie/peirce_q.gie#3:52@fa0e065d +gie/peirce_q.gie#3:53@0c44b153 +gie/peirce_q.gie#3:54@f13a637b +gie/peirce_q.gie#3:55@d85e30ed +gie/peirce_q.gie#3:56@5b3b3f3e +gie/peirce_q.gie#3:57@3b94b6b0 +gie/peirce_q.gie#3:58@ea1323eb +gie/peirce_q.gie#4:0@7e858dbf +gie/peirce_q.gie#4:1@29bdd040 +gie/peirce_q.gie#4:2@80044dd4 +gie/peirce_q.gie#4:3@069abb1c +gie/peirce_q.gie#4:4@50104b23 +gie/peirce_q.gie#4:5@0997e110 +gie/peirce_q.gie#4:6@58c6a744 +gie/peirce_q.gie#4:7@7fdd3832 +gie/peirce_q.gie#4:8@38f70f91 +gie/peirce_q.gie#4:9@2e94eb5e +gie/peirce_q.gie#4:10@66e8562f +gie/peirce_q.gie#4:11@f0c716e2 +gie/peirce_q.gie#4:12@31550352 +gie/peirce_q.gie#4:13@16d78149 +gie/peirce_q.gie#4:14@b194423f +gie/peirce_q.gie#4:15@726407ed +gie/peirce_q.gie#4:16@2cbc9444 +gie/peirce_q.gie#4:17@6988fd5a +gie/peirce_q.gie#4:18@82db38bc +gie/peirce_q.gie#4:19@0edc5ab6 +gie/peirce_q.gie#4:20@77169180 +gie/peirce_q.gie#4:21@a3e01e56 +gie/peirce_q.gie#4:22@976c0640 +gie/peirce_q.gie#4:23@cb15ec79 +gie/peirce_q.gie#4:24@615976d1 +gie/peirce_q.gie#4:25@3ce7fdeb +gie/peirce_q.gie#4:26@6dcac1df +gie/peirce_q.gie#4:27@40b356be +gie/peirce_q.gie#4:28@3c25ae98 +gie/peirce_q.gie#4:29@1648cad1 +gie/peirce_q.gie#4:30@109fd64a +gie/peirce_q.gie#4:31@45780393 +gie/peirce_q.gie#4:32@5a459a54 +gie/peirce_q.gie#4:33@11dd9f38 +gie/peirce_q.gie#4:34@59e36dd5 +gie/peirce_q.gie#4:35@dd2e82aa +gie/peirce_q.gie#4:36@ba7ddb15 +gie/peirce_q.gie#4:37@ec6c8c69 +gie/peirce_q.gie#4:38@46b67e7f +gie/peirce_q.gie#4:39@501a528b +gie/peirce_q.gie#4:40@04e957e0 +gie/peirce_q.gie#4:41@880a2761 +gie/peirce_q.gie#4:42@0726809f +gie/peirce_q.gie#4:43@75edc144 +gie/peirce_q.gie#4:44@94136fbb +gie/peirce_q.gie#4:45@cd78c3e8 +gie/peirce_q.gie#4:46@17466cd3 +gie/peirce_q.gie#4:47@ff5a241e +gie/peirce_q.gie#4:48@a0f65958 +gie/peirce_q.gie#4:49@f448fc28 +gie/peirce_q.gie#4:50@9bfb7a94 +gie/peirce_q.gie#4:51@d6f60836 +gie/peirce_q.gie#4:52@110403ae +gie/peirce_q.gie#4:53@86da9a4d +gie/peirce_q.gie#4:54@a1a40e6d +gie/peirce_q.gie#4:55@321bf98a +gie/peirce_q.gie#4:56@fb69737b +gie/peirce_q.gie#4:57@0bb830b8 +gie/peirce_q.gie#4:58@402ac2a2 +gie/peirce_q.gie#5:0@010c7193 +gie/peirce_q.gie#5:1@29f0df6f +gie/peirce_q.gie#5:2@25adb8eb +gie/peirce_q.gie#5:3@7c13799a +gie/peirce_q.gie#5:4@c87a23a1 +gie/peirce_q.gie#5:5@0f33c07e +gie/peirce_q.gie#5:6@df43c401 +gie/peirce_q.gie#5:7@51b8017b +gie/peirce_q.gie#5:8@5da8674e +gie/peirce_q.gie#5:9@6dea4d68 +gie/peirce_q.gie#5:10@916649a7 +gie/peirce_q.gie#5:11@0ff4bcdf +gie/peirce_q.gie#5:12@228ba746 +gie/peirce_q.gie#5:13@538d1dbc +gie/peirce_q.gie#5:14@8d2571f2 +gie/peirce_q.gie#5:15@affee8e8 +gie/peirce_q.gie#5:16@a1dd1977 +gie/peirce_q.gie#5:17@c441ad9b +gie/peirce_q.gie#5:18@16d66c46 +gie/peirce_q.gie#5:19@ba30f771 +gie/peirce_q.gie#5:20@6d004a96 +gie/peirce_q.gie#5:21@a8c2e765 +gie/peirce_q.gie#5:22@bf4b71bd +gie/peirce_q.gie#5:23@f85be75d +gie/peirce_q.gie#5:24@227e8b2e +gie/peirce_q.gie#5:25@addf751c +gie/peirce_q.gie#5:26@5e16b448 +gie/peirce_q.gie#5:27@80627e51 +gie/peirce_q.gie#5:28@d4b515b7 +gie/peirce_q.gie#5:29@d3eee362 +gie/peirce_q.gie#5:30@de9c0b02 +gie/peirce_q.gie#5:31@de311af0 +gie/peirce_q.gie#5:32@fcb39719 +gie/peirce_q.gie#5:33@3416593c +gie/peirce_q.gie#5:34@90755d6d +gie/peirce_q.gie#5:35@53ab24cd +gie/peirce_q.gie#5:36@8d7596bc +gie/peirce_q.gie#5:37@d7919591 +gie/peirce_q.gie#5:38@cdb9ec8c +gie/peirce_q.gie#5:39@8584e29a +gie/peirce_q.gie#5:40@8aae4e8b +gie/peirce_q.gie#5:41@a1e02ebb +gie/peirce_q.gie#5:42@089f8ea3 +gie/peirce_q.gie#5:43@36077c83 +gie/peirce_q.gie#5:44@09507baf +gie/peirce_q.gie#5:45@20f65f9a +gie/peirce_q.gie#5:46@d0def41c +gie/peirce_q.gie#5:47@391cabdf +gie/peirce_q.gie#5:48@4588094c +gie/peirce_q.gie#5:49@db632e43 +gie/peirce_q.gie#5:50@e70ec7b9 +gie/peirce_q.gie#5:51@ea5cfa3e +gie/peirce_q.gie#5:52@9705a7d0 +gie/peirce_q.gie#5:53@e52fb1c0 +gie/peirce_q.gie#5:54@87665ab1 +gie/peirce_q.gie#5:55@4de6d4ae +gie/peirce_q.gie#5:56@8d48dd23 +gie/peirce_q.gie#5:57@d1b3ef6a +gie/peirce_q.gie#5:58@2fb9ffd8 +gie/peirce_q.gie#6:0@699bfc2c +gie/peirce_q.gie#6:1@869cf744 +gie/peirce_q.gie#6:2@e91bbf75 +gie/peirce_q.gie#6:3@a58abda5 +gie/peirce_q.gie#6:4@97391b20 +gie/peirce_q.gie#6:5@044577fc +gie/peirce_q.gie#6:6@d8c0572b +gie/peirce_q.gie#6:7@72207985 +gie/peirce_q.gie#6:8@ae88777a +gie/peirce_q.gie#6:9@e0d3db84 +gie/peirce_q.gie#6:10@ef3c3b41 +gie/peirce_q.gie#6:11@d04482cb +gie/peirce_q.gie#6:12@e7c96d5e +gie/peirce_q.gie#6:13@e773db1a +gie/peirce_q.gie#6:14@9db2aa51 +gie/peirce_q.gie#6:15@7f0e51ef +gie/peirce_q.gie#6:16@32c9c885 +gie/peirce_q.gie#6:17@3b143eab +gie/peirce_q.gie#6:18@3fbf0908 +gie/peirce_q.gie#6:19@24aa045b +gie/peirce_q.gie#6:20@be4186bc +gie/peirce_q.gie#6:21@f9c0915f +gie/peirce_q.gie#6:22@e2590f3f +gie/peirce_q.gie#6:23@3ec785ad +gie/peirce_q.gie#6:24@faf81f20 +gie/peirce_q.gie#6:25@15bfb049 +gie/peirce_q.gie#6:26@1e87f726 +gie/peirce_q.gie#6:27@a56b9703 +gie/peirce_q.gie#6:28@c7c501a0 +gie/peirce_q.gie#6:29@78e01402 +gie/peirce_q.gie#6:30@f856210c +gie/peirce_q.gie#6:31@d8bc4825 +gie/peirce_q.gie#6:32@46859388 +gie/peirce_q.gie#6:33@eb0dada7 +gie/peirce_q.gie#6:34@88400523 +gie/peirce_q.gie#6:35@b3e4029c +gie/peirce_q.gie#6:36@c62d9dff +gie/peirce_q.gie#6:37@ac5f8d1c +gie/peirce_q.gie#6:38@14177450 +gie/peirce_q.gie#6:39@1ae1aa58 +gie/peirce_q.gie#6:40@cc0a733a +gie/peirce_q.gie#6:41@e997dd91 +gie/peirce_q.gie#6:42@2f05ca20 +gie/peirce_q.gie#6:43@89c884ea +gie/peirce_q.gie#6:44@7ff12ded +gie/peirce_q.gie#6:45@1608da8b +gie/peirce_q.gie#6:46@9fe49537 +gie/peirce_q.gie#6:47@9b45e2a3 +gie/peirce_q.gie#6:48@b6040598 +gie/peirce_q.gie#6:49@af7e2410 +gie/peirce_q.gie#6:50@904b8ca6 +gie/peirce_q.gie#6:51@f19084fb +gie/peirce_q.gie#6:52@d9ed1ca8 +gie/peirce_q.gie#6:53@1e07cddd +gie/peirce_q.gie#6:54@f37407d6 +gie/peirce_q.gie#6:55@82b6a0a8 +gie/peirce_q.gie#6:56@493f616d +gie/peirce_q.gie#6:57@e6466d67 +gie/peirce_q.gie#6:58@85dc6332 +gie/peirce_q.gie#7:0@46dbf9c0 +gie/peirce_q.gie#7:1@1eacfd9d +gie/peirce_q.gie#7:2@fffb41ae +gie/peirce_q.gie#7:3@62ad5673 +gie/peirce_q.gie#7:4@5d5016d8 +gie/peirce_q.gie#7:5@e65595b6 +gie/peirce_q.gie#7:6@6000f25f +gie/peirce_q.gie#7:7@1b7bed36 +gie/peirce_q.gie#7:8@aeecf780 +gie/peirce_q.gie#7:9@c080d9de +gie/peirce_q.gie#7:10@76fd05d6 +gie/peirce_q.gie#7:11@15e67cfc +gie/peirce_q.gie#7:12@31f297d5 +gie/peirce_q.gie#7:13@562f50c3 +gie/peirce_q.gie#7:14@c4f5c411 +gie/peirce_q.gie#7:15@641543c0 +gie/peirce_q.gie#7:16@6a84eef4 +gie/peirce_q.gie#7:17@64cbf8b8 +gie/peirce_q.gie#7:18@5d2f3855 +gie/peirce_q.gie#7:19@8f9f380d +gie/peirce_q.gie#7:20@7835356c +gie/peirce_q.gie#7:21@b3b9db2d +gie/peirce_q.gie#7:22@0b47c2eb +gie/peirce_q.gie#7:23@ea35831c +gie/peirce_q.gie#7:24@71470811 +gie/peirce_q.gie#7:25@4d5ba380 +gie/peirce_q.gie#7:26@0df62b7a +gie/peirce_q.gie#7:27@78201385 +gie/peirce_q.gie#7:28@a592ba46 +gie/peirce_q.gie#7:29@b028a995 +gie/peirce_q.gie#7:30@a8c66ee1 +gie/peirce_q.gie#7:31@da9cd0b4 +gie/peirce_q.gie#7:32@9a4e9e99 +gie/peirce_q.gie#7:33@13dc4bb9 +gie/peirce_q.gie#7:34@1990e26f +gie/peirce_q.gie#7:35@56ff49cd +gie/peirce_q.gie#7:36@ab92b42e +gie/peirce_q.gie#7:37@8310cae2 +gie/peirce_q.gie#7:38@af693e93 +gie/peirce_q.gie#7:39@14568560 +gie/peirce_q.gie#7:40@f375a23e +gie/peirce_q.gie#7:41@99651b4e +gie/peirce_q.gie#7:42@5ebaf45b +gie/peirce_q.gie#7:43@1d56fe33 +gie/peirce_q.gie#7:44@3f63ca6b +gie/peirce_q.gie#7:45@427ceaed +gie/peirce_q.gie#7:46@b2196367 +gie/peirce_q.gie#7:47@b0d46c8b +gie/peirce_q.gie#7:48@b8fe2502 +gie/peirce_q.gie#7:49@0c934401 +gie/peirce_q.gie#7:50@b3aac215 +gie/peirce_q.gie#7:51@0b8ace4c +gie/peirce_q.gie#7:52@05cfe855 +gie/peirce_q.gie#7:53@c2e36419 +gie/peirce_q.gie#7:54@95ce5998 +gie/peirce_q.gie#7:55@337a1cd2 +gie/peirce_q.gie#7:56@518048cc +gie/peirce_q.gie#7:57@e53c67ac +gie/peirce_q.gie#7:58@669badad +gie/peirce_q.gie#8:0@03554af9 +gie/peirce_q.gie#8:1@78ff7a44 +gie/peirce_q.gie#8:2@47c393c6 +gie/peirce_q.gie#8:3@83c64fda +gie/peirce_q.gie#8:4@ee4a7aab +gie/peirce_q.gie#8:5@80a87c06 +gie/peirce_q.gie#8:6@ce4e60a4 +gie/peirce_q.gie#8:7@3729ef45 +gie/peirce_q.gie#8:8@607eb524 +gie/peirce_q.gie#8:9@aadb52ea +gie/peirce_q.gie#8:10@bac61166 +gie/peirce_q.gie#8:11@226fe168 +gie/peirce_q.gie#8:12@360b93ab +gie/peirce_q.gie#8:13@90b249f2 +gie/peirce_q.gie#8:14@e451d8ba +gie/peirce_q.gie#8:15@44fe03f1 +gie/peirce_q.gie#8:16@bc1636ea +gie/peirce_q.gie#8:17@d44b6402 +gie/peirce_q.gie#8:18@3db49881 +gie/peirce_q.gie#8:19@f0d3c2b4 +gie/peirce_q.gie#8:20@67e4c2da +gie/peirce_q.gie#8:21@44455854 +gie/peirce_q.gie#8:22@b8f740bb +gie/peirce_q.gie#8:23@df47b8e6 +gie/peirce_q.gie#8:24@f005bfa7 +gie/peirce_q.gie#8:25@1898cfa6 +gie/peirce_q.gie#8:26@0949d545 +gie/peirce_q.gie#8:27@83adf4ca +gie/peirce_q.gie#8:28@a3ab2051 +gie/peirce_q.gie#8:29@693f8f37 +gie/peirce_q.gie#8:30@203c761a +gie/peirce_q.gie#8:31@3d05c305 +gie/peirce_q.gie#8:32@98a2bdc3 +gie/peirce_q.gie#8:33@720e2ee4 +gie/peirce_q.gie#8:34@b696b1a0 +gie/peirce_q.gie#8:35@5417e986 +gie/peirce_q.gie#8:36@1e572405 +gie/peirce_q.gie#8:37@a1284b56 +gie/peirce_q.gie#8:38@b3b48b9c +gie/peirce_q.gie#8:39@70741bf8 +gie/peirce_q.gie#8:40@5228666b +gie/peirce_q.gie#8:41@fe9e0d58 +gie/peirce_q.gie#8:42@5372134f +gie/peirce_q.gie#8:43@3d9f5f04 +gie/peirce_q.gie#8:44@f3bf9bae +gie/peirce_q.gie#8:45@c454ad46 +gie/peirce_q.gie#8:46@ee6218ee +gie/peirce_q.gie#8:47@2e97ffe8 +gie/peirce_q.gie#8:48@c1136036 +gie/peirce_q.gie#8:49@07895576 +gie/peirce_q.gie#8:50@b3489bcf +gie/peirce_q.gie#8:51@9bc498f0 +gie/peirce_q.gie#8:52@7261a982 +gie/peirce_q.gie#8:53@b5cb75e0 +gie/peirce_q.gie#8:54@4634f976 +gie/peirce_q.gie#8:55@92bbc609 +gie/peirce_q.gie#8:56@e33801b7 +gie/peirce_q.gie#8:57@62c8637a +gie/peirce_q.gie#8:58@f34edd37 +gie/peirce_q.gie#8:59@e1ec1a95 +gie/peirce_q.gie#8:60@84f91d1e +gie/peirce_q.gie#8:61@d82ba838 +gie/peirce_q.gie#8:62@b34e44f5 +gie/peirce_q.gie#9:0@5f4afae7 +gie/peirce_q.gie#9:1@3fb73a0e +gie/peirce_q.gie#9:2@b0838a70 +gie/peirce_q.gie#9:3@bfd14f03 +gie/peirce_q.gie#9:4@4f307142 +gie/peirce_q.gie#9:5@ba8ab658 +gie/peirce_q.gie#9:6@d10f0f5a +gie/peirce_q.gie#9:7@766d19c6 +gie/peirce_q.gie#9:8@2647c6f9 +gie/peirce_q.gie#9:9@d981c6a5 +gie/peirce_q.gie#9:10@842419dd +gie/peirce_q.gie#9:11@acffab58 +gie/peirce_q.gie#9:12@3bdf3407 +gie/peirce_q.gie#9:13@1c9f51b4 +gie/peirce_q.gie#9:14@41e2a741 +gie/peirce_q.gie#9:15@e88dbb9e +gie/peirce_q.gie#9:16@fb5df23f +gie/peirce_q.gie#9:17@bfe7f4ee +gie/peirce_q.gie#9:18@341f82f8 +gie/peirce_q.gie#9:19@bee21f77 +gie/peirce_q.gie#9:20@a1e0c13b +gie/peirce_q.gie#9:21@9bb4cef6 +gie/peirce_q.gie#9:22@7432d97e +gie/peirce_q.gie#9:23@9dabda92 +gie/peirce_q.gie#9:24@20b13438 +gie/peirce_q.gie#9:25@53205275 +gie/peirce_q.gie#9:26@decf0004 +gie/peirce_q.gie#9:27@bdf18d38 +gie/peirce_q.gie#9:28@c4a0d7a6 +gie/peirce_q.gie#9:29@fbcca054 +gie/peirce_q.gie#9:30@5a42feac +gie/peirce_q.gie#9:31@f198a063 +gie/peirce_q.gie#9:32@197ae83e +gie/peirce_q.gie#9:33@c0a28e2a +gie/peirce_q.gie#9:34@59ff34bb +gie/peirce_q.gie#9:35@c8ce37af +gie/peirce_q.gie#9:36@3c239042 +gie/peirce_q.gie#9:37@d29f2d1c +gie/peirce_q.gie#9:38@23132c66 +gie/peirce_q.gie#9:39@2865a715 +gie/peirce_q.gie#9:40@cf87882c +gie/peirce_q.gie#9:41@9c3f3011 +gie/peirce_q.gie#9:42@ea229ee8 +gie/peirce_q.gie#9:43@00875a8e +gie/peirce_q.gie#9:44@4edca601 +gie/peirce_q.gie#9:45@cecda5d4 +gie/peirce_q.gie#9:46@c5bd7226 +gie/peirce_q.gie#9:47@2c7298dd +gie/peirce_q.gie#9:48@de6e8f15 +gie/peirce_q.gie#9:49@b7755ee0 +gie/peirce_q.gie#9:50@3ebab0d5 +gie/peirce_q.gie#9:51@f7df77f4 +gie/peirce_q.gie#9:52@ef5b04bd +gie/peirce_q.gie#9:53@b7198bb7 +gie/peirce_q.gie#9:54@8675ad79 +gie/peirce_q.gie#9:55@d08b4c58 +gie/peirce_q.gie#9:56@2c78201d +gie/spilhaus.gie#0:0@8f2283f5 +gie/spilhaus.gie#0:1@81c04c9b +gie/spilhaus.gie#0:2@06b0ba65 +gie/spilhaus.gie#0:3@005b9f6d +gie/spilhaus.gie#0:4@ceecec39 +gie/spilhaus.gie#0:5@cf7559ec +gie/spilhaus.gie#0:6@4f08437e +gie/spilhaus.gie#0:7@c3fca9b5 +gie/spilhaus.gie#0:8@b60ad867 +gie/spilhaus.gie#0:9@0f51bab9 +gie/spilhaus.gie#0:10@335af071 +gie/spilhaus.gie#0:11@1233738a +gie/spilhaus.gie#0:12@3215774b +gie/spilhaus.gie#0:13@206538f0 +gie/spilhaus.gie#0:14@0e3c5142 +gie/spilhaus.gie#0:15@d7d7b53f +gie/spilhaus.gie#0:16@fdd628ac +gie/spilhaus.gie#0:17@fed9a89e +gie/spilhaus.gie#0:18@a646f673 +gie/spilhaus.gie#0:19@a813bd0b +gie/spilhaus.gie#0:20@c6d3e1bd +gie/spilhaus.gie#0:21@babf0862 +gie/spilhaus.gie#0:22@5243a391 +gie/spilhaus.gie#0:23@9f45c6a7 +gie/spilhaus.gie#0:24@c3901f42 +gie/spilhaus.gie#0:25@a5ce1807 +gie/spilhaus.gie#0:26@2c29d45d +gie/spilhaus.gie#0:27@a0648107 +gie/spilhaus.gie#0:28@0f19ee7f +gie/spilhaus.gie#0:29@4d852737 +gie/spilhaus.gie#0:30@ccb2ed40 +gie/spilhaus.gie#0:31@24f1a241 +gie/spilhaus.gie#0:32@cdcaa75c +gie/spilhaus.gie#0:33@17bd8a4d +gie/spilhaus.gie#0:34@4572e939 +gie/spilhaus.gie#0:35@5f67be87 +gie/spilhaus.gie#0:36@59e7a791 +gie/spilhaus.gie#0:37@e17ee402 +gie/spilhaus.gie#0:38@19b68fc6 +gie/spilhaus.gie#0:39@7edd4e71 +gie/spilhaus.gie#0:40@26f19821 +gie/spilhaus.gie#0:41@9e383a8a +gie/spilhaus.gie#0:42@3bea249a +gie/spilhaus.gie#0:43@cdda5e6b +gie/spilhaus.gie#0:44@b969efe8 +gie/spilhaus.gie#0:45@078dec85 +gie/spilhaus.gie#0:46@b3fb55fe +gie/spilhaus.gie#0:47@22487f15 +gie/spilhaus.gie#0:48@c4774313 +gie/spilhaus.gie#1:0@af2bf25a +gie/spilhaus.gie#1:1@f74378d5 +gie/spilhaus.gie#1:2@be2773d8 +gie/spilhaus.gie#1:3@07630dce +gie/spilhaus.gie#1:4@62688f19 +gie/spilhaus.gie#1:5@e7c4cdf4 +gie/spilhaus.gie#1:6@1b35d8f0 +gie/spilhaus.gie#1:7@5c938d55 +gie/spilhaus.gie#1:8@44bd45ea +gie/spilhaus.gie#1:9@c53db262 +gie/spilhaus.gie#1:10@42e4b2ba +gie/spilhaus.gie#1:11@604394c6 +gie/spilhaus.gie#1:12@35aa8e94 +gie/spilhaus.gie#1:13@754061e5 +gie/spilhaus.gie#1:14@b0136e31 +gie/spilhaus.gie#1:15@c10762db +gie/spilhaus.gie#1:16@b7a85403 +gie/spilhaus.gie#1:17@f75e161d +gie/spilhaus.gie#1:18@9d047fbb +gie/spilhaus.gie#1:19@1822812a +gie/spilhaus.gie#1:20@fa5f382d +gie/spilhaus.gie#1:21@3cf3fc11 +gie/spilhaus.gie#1:22@90ff175c +gie/spilhaus.gie#1:23@76228aef +gie/spilhaus.gie#1:24@6393aaa7 +gie/spilhaus.gie#1:25@d83437ae +gie/spilhaus.gie#1:26@f1b3ca99 +gie/spilhaus.gie#1:27@89c77f5b +gie/spilhaus.gie#1:28@435bfed4 +gie/spilhaus.gie#1:29@a5127aab +gie/spilhaus.gie#1:30@df42334d +gie/spilhaus.gie#1:31@59ebec93 +gie/spilhaus.gie#1:32@f080a1a9 +gie/spilhaus.gie#1:33@eba845b1 +gie/spilhaus.gie#1:34@d55f5d86 +gie/spilhaus.gie#1:35@ded6fe07 +gie/spilhaus.gie#1:36@20f56da5 +gie/spilhaus.gie#1:37@0f2caa75 +gie/spilhaus.gie#1:38@9b001f14 +gie/spilhaus.gie#1:39@36f0748c +gie/spilhaus.gie#1:40@d8886a2f +gie/spilhaus.gie#1:41@94ac94f1 +gie/spilhaus.gie#1:42@608d47e9 +gie/spilhaus.gie#1:43@49e95333 +gie/spilhaus.gie#1:44@c22d4f7b +gie/spilhaus.gie#1:45@a85fbcca +gie/spilhaus.gie#1:46@04399771 +gie/spilhaus.gie#1:47@ea75fcff +gie/spilhaus.gie#2:0@52339237 +gie/spilhaus.gie#2:1@b44b37c8 +gie/spilhaus.gie#2:2@f96393db +gie/spilhaus.gie#2:3@e7be15c3 +gie/spilhaus.gie#2:4@51e3263a +gie/spilhaus.gie#2:5@31ef6ffd +gie/spilhaus.gie#2:6@da987d6c +gie/spilhaus.gie#2:7@a4a94973 +gie/spilhaus.gie#2:8@13ee2c62 +gie/spilhaus.gie#2:9@fdf46278 +gie/spilhaus.gie#2:10@8d3b7fa1 +gie/spilhaus.gie#2:11@79f7e4fe +gie/spilhaus.gie#2:12@d97b51fb +gie/spilhaus.gie#2:13@5f5d2a8a +gie/spilhaus.gie#2:14@66cd9488 +gie/spilhaus.gie#2:15@0be8e011 +gie/spilhaus.gie#3:0@633a449d +gie/spilhaus.gie#3:1@02b002c8 +gie/spilhaus.gie#4:0@02e93eb0 +gie/spilhaus.gie#4:1@19df1373 +gie/spilhaus.gie#5:0@fd4a4ea1 +gie/spilhaus.gie#5:1@f1449204 +gie/spilhaus.gie#6:0@ca6f4e02 +gie/spilhaus.gie#6:1@1ebcfeb4 +gie/spilhaus.gie#7:0@750676a9 +gie/spilhaus.gie#7:1@7fa5486d +gie/spilhaus.gie#8:0@2809c29a +gie/spilhaus.gie#8:1@37f8d6f5 +gie/spilhaus.gie#9:0@256d2db5 +gie/spilhaus.gie#9:1@41a1b261 +gie/spilhaus.gie#10:0@8f176bd2 +gie/spilhaus.gie#10:1@d80197ee +gie/spilhaus.gie#11:0@b076d2e4 +gie/spilhaus.gie#11:1@3f87e7c7 +gie/spilhaus.gie#12:0@36cf3e89 +gie/spilhaus.gie#12:1@c5c46695 +gie/tinshift.gie#0:0@ff7976a4 +gie/tinshift.gie#1:0@e5b994e1 +gie/tinshift.gie#2:0@dfd65cdb +gie/tinshift.gie#3:0@dc0d1174 +gie/tinshift.gie#3:1@020ebab2 +gie/tinshift.gie#3:2@a0e5436e +gie/tinshift.gie#3:3@a0e5436e +gie/tinshift.gie#4:0@8b0f0bf3 +gie/tinshift.gie#4:1@65e47077 +gie/tinshift.gie#5:0@8bad1164 +gie/tinshift.gie#5:1@c4aeef96 +gie/tinshift.gie#6:0@9337548a +gie/tinshift.gie#6:1@0633e3b7 +gie/tinshift.gie#7:0@30c72530 +gie/tinshift.gie#7:1@a778f3b1 +gie/unitconvert.gie#0:0@7bcc76e3 +gie/unitconvert.gie#1:0@11ae20dd +gie/unitconvert.gie#2:0@f81c644c +gie/unitconvert.gie#3:0@f6935d7f +gie/unitconvert.gie#4:0@addd5d90 +gie/unitconvert.gie#5:0@1a0e2d4e +gie/unitconvert.gie#6:0@dec9dd59 +gie/unitconvert.gie#7:0@202a2188 +gie/unitconvert.gie#8:0@b22773ed +gie/unitconvert.gie#9:0@f7b56365 +gie/unitconvert.gie#10:0@198b1dad +gie/unitconvert.gie#11:0@80db6582 +gie/unitconvert.gie#12:0@ad8847b5 +gie/unitconvert.gie#13:0@41e34a45 +gie/unitconvert.gie#14:0@a702a7b6 +gie/unitconvert.gie#15:0@265a36f5 +gigs/5101.1-jhs.gie#0:0@7a60e4a1 +gigs/5101.1-jhs.gie#0:1@3d19936f +gigs/5101.1-jhs.gie#0:2@116e4de6 +gigs/5101.1-jhs.gie#0:3@b19f0133 +gigs/5101.1-jhs.gie#0:4@8e7323bb +gigs/5101.1-jhs.gie#0:5@5741cad7 +gigs/5101.1-jhs.gie#0:6@f735f3d2 +gigs/5101.1-jhs.gie#0:7@32b506f2 +gigs/5101.1-jhs.gie#0:8@64dde390 +gigs/5101.1-jhs.gie#0:9@30632a09 +gigs/5101.1-jhs.gie#0:10@bbe6dfc4 +gigs/5101.1-jhs.gie#0:11@d4dbd67d +gigs/5101.1-jhs.gie#0:12@43bee699 +gigs/5101.1-jhs.gie#0:13@2bceff49 +gigs/5101.1-jhs.gie#0:14@df5c0c7d +gigs/5101.1-jhs.gie#0:15@524b94ad +gigs/5101.1-jhs.gie#0:16@58e6ee8d +gigs/5101.1-jhs.gie#0:17@164972fa +gigs/5101.1-jhs.gie#0:18@90654dd9 +gigs/5101.1-jhs.gie#0:19@c9ac393a +gigs/5101.1-jhs.gie#0:20@dac13b36 +gigs/5101.1-jhs.gie#0:21@eadd6d56 +gigs/5101.1-jhs.gie#0:22@614425e0 +gigs/5101.1-jhs.gie#0:23@8f6f8318 +gigs/5101.1-jhs.gie#0:24@569be2a1 +gigs/5101.1-jhs.gie#0:25@2ec3e87d +gigs/5101.1-jhs.gie#0:26@5d58bbcf +gigs/5101.1-jhs.gie#0:27@6147a3e7 +gigs/5101.1-jhs.gie#0:28@8c16ecdc +gigs/5101.1-jhs.gie#0:29@1fc7d66f +gigs/5101.1-jhs.gie#0:30@3a8c7178 +gigs/5101.1-jhs.gie#0:31@2ec3e87d +gigs/5101.1-jhs.gie#0:32@a8ebbcc8 +gigs/5101.1-jhs.gie#0:33@6854bdce +gigs/5101.1-jhs.gie#0:34@158182a7 +gigs/5101.1-jhs.gie#0:35@73a19809 +gigs/5101.1-jhs.gie#0:36@c25f923a +gigs/5101.1-jhs.gie#0:37@66166be8 +gigs/5101.1-jhs.gie#0:38@34476470 +gigs/5101.1-jhs.gie#0:39@5741cad7 +gigs/5101.1-jhs.gie#0:40@50ce551b +gigs/5101.1-jhs.gie#0:41@a0261b4e +gigs/5101.1-jhs.gie#0:42@b3ecbc9d +gigs/5101.1-jhs.gie#0:43@98689c62 +gigs/5101.1-jhs.gie#0:44@14f81955 +gigs/5101.1-jhs.gie#0:45@eadd6d56 +gigs/5101.1-jhs.gie#0:46@15ca6df1 +gigs/5101.1-jhs.gie#0:47@8c8a7136 +gigs/5101.1-jhs.gie#0:48@d4dbd67d +gigs/5101.1-jhs.gie#0:49@9c6519ad +gigs/5101.1-jhs.gie#0:50@139ef2ad +gigs/5101.1-jhs.gie#0:51@262a41a6 +gigs/5101.1-jhs.gie#0:52@49254da9 +gigs/5101.1-jhs.gie#0:53@3d62f7f6 +gigs/5101.1-jhs.gie#0:54@8e2361ea +gigs/5101.1-jhs.gie#0:55@7a96b818 +gigs/5101.1-jhs.gie#0:56@69a243d8 +gigs/5101.1-jhs.gie#0:57@28408c7c +gigs/5101.1-jhs.gie#0:58@8763f441 +gigs/5101.1-jhs.gie#1:0@459ba786 +gigs/5101.1-jhs.gie#1:1@71cfe6b0 +gigs/5101.1-jhs.gie#1:2@b0c1b156 +gigs/5101.1-jhs.gie#1:3@e89a1967 +gigs/5101.1-jhs.gie#1:4@7fcbb7c4 +gigs/5101.1-jhs.gie#1:5@2a9d2918 +gigs/5101.1-jhs.gie#1:6@fe4af7c6 +gigs/5101.1-jhs.gie#1:7@8b5f8f5b +gigs/5101.1-jhs.gie#1:8@9d858b70 +gigs/5101.1-jhs.gie#1:9@0fb8d628 +gigs/5101.1-jhs.gie#1:10@3324f8ac +gigs/5101.1-jhs.gie#1:11@0b162de4 +gigs/5101.1-jhs.gie#1:12@036ff77f +gigs/5101.1-jhs.gie#1:13@8f77861a +gigs/5101.1-jhs.gie#1:14@eb754881 +gigs/5101.1-jhs.gie#1:15@ee64aee2 +gigs/5101.1-jhs.gie#1:16@aecb79d2 +gigs/5101.1-jhs.gie#1:17@32da576b +gigs/5101.1-jhs.gie#1:18@f99f913f +gigs/5101.1-jhs.gie#1:19@913ef329 +gigs/5101.1-jhs.gie#1:20@0a79dbb4 +gigs/5101.1-jhs.gie#1:21@b157d60a +gigs/5101.1-jhs.gie#1:22@5fb7b634 +gigs/5101.1-jhs.gie#1:23@c634a35d +gigs/5101.1-jhs.gie#1:24@5fb673f4 +gigs/5101.1-jhs.gie#1:25@75a200f1 +gigs/5101.1-jhs.gie#1:26@8f545145 +gigs/5101.1-jhs.gie#1:27@8435fae0 +gigs/5101.1-jhs.gie#1:28@d432eae4 +gigs/5101.1-jhs.gie#1:29@febf235a +gigs/5101.1-jhs.gie#1:30@2c2a73a4 +gigs/5101.1-jhs.gie#1:31@75a200f1 +gigs/5101.1-jhs.gie#1:32@2b04c68c +gigs/5101.1-jhs.gie#1:33@39f1ccfd +gigs/5101.1-jhs.gie#1:34@d64ea963 +gigs/5101.1-jhs.gie#1:35@dc7ecc83 +gigs/5101.1-jhs.gie#1:36@01345e65 +gigs/5101.1-jhs.gie#1:37@b4183c45 +gigs/5101.1-jhs.gie#1:38@bfa23562 +gigs/5101.1-jhs.gie#1:39@2a9d2918 +gigs/5101.1-jhs.gie#1:40@06c74e80 +gigs/5101.1-jhs.gie#1:41@b1be83ad +gigs/5101.1-jhs.gie#1:42@e2f583a8 +gigs/5101.1-jhs.gie#1:43@714a995c +gigs/5101.1-jhs.gie#1:44@f1a0b0d1 +gigs/5101.1-jhs.gie#1:45@b157d60a +gigs/5101.1-jhs.gie#1:46@87b3a80c +gigs/5101.1-jhs.gie#1:47@45caa58c +gigs/5101.1-jhs.gie#1:48@0b162de4 +gigs/5101.1-jhs.gie#1:49@20ffbc30 +gigs/5101.1-jhs.gie#1:50@376ba21a +gigs/5101.1-jhs.gie#1:51@08a01f68 +gigs/5101.1-jhs.gie#1:52@10af2930 +gigs/5101.1-jhs.gie#1:53@656adcce +gigs/5101.1-jhs.gie#1:54@c1b76d10 +gigs/5101.1-jhs.gie#1:55@d34d4740 +gigs/5101.1-jhs.gie#1:56@8a78af2d +gigs/5101.1-jhs.gie#1:57@349a78ad +gigs/5101.1-jhs.gie#1:58@de6b7a70 +gigs/5101.1-jhs.gie#2:0@366488a6 +gigs/5101.1-jhs.gie#2:1@0cab6f6d +gigs/5101.1-jhs.gie#2:2@19db1742 +gigs/5101.1-jhs.gie#2:3@85e4281d +gigs/5101.1-jhs.gie#2:4@f01d3bd2 +gigs/5101.1-jhs.gie#2:5@121deff2 +gigs/5101.1-jhs.gie#2:6@d96bdf2e +gigs/5101.1-jhs.gie#2:7@5342aaf6 +gigs/5101.1-jhs.gie#2:8@d7ba0fa8 +gigs/5101.1-jhs.gie#2:9@62d25db5 +gigs/5101.1-jhs.gie#2:10@53680c93 +gigs/5101.1-jhs.gie#2:11@7bbc6870 +gigs/5101.1-jhs.gie#2:12@f255259c +gigs/5101.1-jhs.gie#2:13@2aa7f39c +gigs/5101.1-jhs.gie#2:14@1238f1e3 +gigs/5101.1-jhs.gie#2:15@c348e677 +gigs/5101.1-jhs.gie#2:16@613504f2 +gigs/5101.1-jhs.gie#2:17@97aea497 +gigs/5101.1-jhs.gie#2:18@eb9368c2 +gigs/5101.1-jhs.gie#2:19@8c956b6c +gigs/5101.1-jhs.gie#2:20@383113a6 +gigs/5101.1-jhs.gie#2:21@b475f36d +gigs/5101.1-jhs.gie#2:22@b2122720 +gigs/5101.1-jhs.gie#2:23@9dc90dc4 +gigs/5101.1-jhs.gie#2:24@3c6178b7 +gigs/5101.1-jhs.gie#2:25@c9524b06 +gigs/5101.1-jhs.gie#2:26@90c705a4 +gigs/5101.1-jhs.gie#2:27@dab14b2c +gigs/5101.1-jhs.gie#2:28@95366657 +gigs/5101.1-jhs.gie#2:29@8e8bdfc6 +gigs/5101.1-jhs.gie#2:30@c390c068 +gigs/5101.1-jhs.gie#2:31@c9524b06 +gigs/5101.1-jhs.gie#2:32@cb2dbf29 +gigs/5101.1-jhs.gie#2:33@2fc6ac02 +gigs/5101.1-jhs.gie#2:34@c348e677 +gigs/5101.1-jhs.gie#2:35@bbfb0331 +gigs/5101.1-jhs.gie#2:36@7ddc5cab +gigs/5101.1-jhs.gie#2:37@9b4ecc14 +gigs/5101.1-jhs.gie#2:38@3bfddd82 +gigs/5101.1-jhs.gie#2:39@121deff2 +gigs/5101.1-jhs.gie#2:40@23f2025a +gigs/5101.1-jhs.gie#2:41@e99de1d9 +gigs/5101.1-jhs.gie#2:42@8dfe851e +gigs/5101.1-jhs.gie#2:43@475934e1 +gigs/5101.1-jhs.gie#2:44@c965d444 +gigs/5101.1-jhs.gie#2:45@b475f36d +gigs/5101.1-jhs.gie#2:46@3f6f687a +gigs/5101.1-jhs.gie#2:47@4d1d1231 +gigs/5101.1-jhs.gie#2:48@7bbc6870 +gigs/5101.1-jhs.gie#2:49@1d356aa1 +gigs/5101.1-jhs.gie#2:50@6cbba2dd +gigs/5101.1-jhs.gie#2:51@2b4bcb7f +gigs/5101.1-jhs.gie#2:52@23d6735f +gigs/5101.1-jhs.gie#2:53@a68ffabd +gigs/5101.1-jhs.gie#2:54@b996ae0b +gigs/5101.1-jhs.gie#2:55@9e49e65b +gigs/5101.1-jhs.gie#2:56@428fba4e +gigs/5101.1-jhs.gie#2:57@079ff75c +gigs/5101.1-jhs.gie#2:58@e947e242 +gigs/5101.2-jhs.gie#0:0@2e6a3526 +gigs/5101.2-jhs.gie#0:1@73d98dfa +gigs/5101.2-jhs.gie#0:2@599dc2ee +gigs/5101.2-jhs.gie#0:3@1be18c9e +gigs/5101.2-jhs.gie#0:4@c409479d +gigs/5101.2-jhs.gie#0:5@cb4ec885 +gigs/5101.2-jhs.gie#0:6@91892687 +gigs/5101.2-jhs.gie#0:7@009471bc +gigs/5101.2-jhs.gie#0:8@bdde2fc2 +gigs/5101.2-jhs.gie#0:9@064c3faa +gigs/5101.2-jhs.gie#0:10@4878b2ea +gigs/5101.2-jhs.gie#0:11@594b770d +gigs/5101.2-jhs.gie#0:12@73d98dfa +gigs/5101.2-jhs.gie#0:13@80b59dab +gigs/5101.2-jhs.gie#0:14@1aca960e +gigs/5101.2-jhs.gie#0:15@0814f642 +gigs/5101.2-jhs.gie#0:16@250455eb +gigs/5101.2-jhs.gie#0:17@5f641122 +gigs/5101.2-jhs.gie#0:18@1871c88f +gigs/5101.2-jhs.gie#0:19@8095d494 +gigs/5101.2-jhs.gie#0:20@8f43a2e9 +gigs/5101.2-jhs.gie#0:21@9110df27 +gigs/5101.2-jhs.gie#0:22@13a8c393 +gigs/5101.2-jhs.gie#1:0@c2239ed4 +gigs/5101.2-jhs.gie#1:1@7a8e11bf +gigs/5101.2-jhs.gie#1:2@32c3065c +gigs/5101.2-jhs.gie#1:3@d31ce162 +gigs/5101.2-jhs.gie#1:4@e0e0059e +gigs/5101.2-jhs.gie#1:5@12ca3b47 +gigs/5101.2-jhs.gie#1:6@969c8185 +gigs/5101.2-jhs.gie#1:7@c89bd893 +gigs/5101.2-jhs.gie#1:8@75f499e2 +gigs/5101.2-jhs.gie#1:9@e65c9ee8 +gigs/5101.2-jhs.gie#1:10@bddefa59 +gigs/5101.2-jhs.gie#1:11@72ce9a31 +gigs/5101.2-jhs.gie#1:12@7a8e11bf +gigs/5101.2-jhs.gie#1:13@80f05c64 +gigs/5101.2-jhs.gie#1:14@134fe434 +gigs/5101.2-jhs.gie#1:15@c7e91822 +gigs/5101.2-jhs.gie#1:16@a3a65477 +gigs/5101.2-jhs.gie#1:17@8937aa91 +gigs/5101.2-jhs.gie#1:18@d6e7e3c6 +gigs/5101.2-jhs.gie#1:19@fc56fa7d +gigs/5101.2-jhs.gie#1:20@0b9fcfb6 +gigs/5101.2-jhs.gie#1:21@bf256f5e +gigs/5101.2-jhs.gie#1:22@259f7038 +gigs/5101.2-jhs.gie#2:0@cee0d5d5 +gigs/5101.2-jhs.gie#2:1@e1867690 +gigs/5101.2-jhs.gie#2:2@f38410a5 +gigs/5101.2-jhs.gie#2:3@754074a2 +gigs/5101.2-jhs.gie#2:4@407adec8 +gigs/5101.2-jhs.gie#2:5@4a5160be +gigs/5101.2-jhs.gie#2:6@a54a30a0 +gigs/5101.2-jhs.gie#2:7@26fd8ddb +gigs/5101.2-jhs.gie#2:8@e029453e +gigs/5101.2-jhs.gie#2:9@dca76a72 +gigs/5101.2-jhs.gie#2:10@0b112476 +gigs/5101.2-jhs.gie#2:11@7251009a +gigs/5101.2-jhs.gie#2:12@e1867690 +gigs/5101.2-jhs.gie#2:13@1024cf43 +gigs/5101.2-jhs.gie#2:14@f0017f3e +gigs/5101.2-jhs.gie#2:15@04ce9789 +gigs/5101.2-jhs.gie#2:16@662e9283 +gigs/5101.2-jhs.gie#2:17@9d114dda +gigs/5101.2-jhs.gie#2:18@ae1a4fd5 +gigs/5101.2-jhs.gie#2:19@5e4f2ab3 +gigs/5101.2-jhs.gie#2:20@2ac5a8c3 +gigs/5101.2-jhs.gie#2:21@7280aa05 +gigs/5101.2-jhs.gie#2:22@15bbdf26 +gigs/5101.3-jhs.gie#0:0@bcd53bbe +gigs/5101.3-jhs.gie#0:1@61ce8234 +gigs/5101.3-jhs.gie#0:2@88091345 +gigs/5101.3-jhs.gie#0:3@b022a4c5 +gigs/5101.3-jhs.gie#0:4@599d2e33 +gigs/5101.3-jhs.gie#0:5@8c4fa495 +gigs/5101.3-jhs.gie#0:6@a84f660d +gigs/5101.3-jhs.gie#0:7@2e834587 +gigs/5101.3-jhs.gie#0:8@194d6485 +gigs/5101.3-jhs.gie#0:9@965e919c +gigs/5101.3-jhs.gie#0:10@3e17ce04 +gigs/5101.3-jhs.gie#0:11@6e495786 +gigs/5101.3-jhs.gie#0:12@31fc7891 +gigs/5101.3-jhs.gie#0:13@b54c538c +gigs/5101.3-jhs.gie#0:14@44901191 +gigs/5101.3-jhs.gie#0:15@35d05ca8 +gigs/5101.3-jhs.gie#0:16@c98d254f +gigs/5101.3-jhs.gie#0:17@5fb74bba +gigs/5101.3-jhs.gie#0:18@f735f024 +gigs/5101.3-jhs.gie#0:19@2e834587 +gigs/5101.3-jhs.gie#0:20@166df6c6 +gigs/5101.3-jhs.gie#0:21@5aa00c80 +gigs/5101.3-jhs.gie#0:22@0af1c039 +gigs/5101.3-jhs.gie#1:0@7852e084 +gigs/5101.3-jhs.gie#1:1@91d7253e +gigs/5101.3-jhs.gie#1:2@00baa843 +gigs/5101.3-jhs.gie#1:3@266f6dd7 +gigs/5101.3-jhs.gie#1:4@2cb0fb0b +gigs/5101.3-jhs.gie#1:5@edd828c3 +gigs/5101.3-jhs.gie#1:6@0ef8797f +gigs/5101.3-jhs.gie#1:7@b945f41b +gigs/5101.3-jhs.gie#1:8@9b070b8b +gigs/5101.3-jhs.gie#1:9@552a5992 +gigs/5101.3-jhs.gie#1:10@edcdb8f8 +gigs/5101.3-jhs.gie#1:11@9c9fb265 +gigs/5101.3-jhs.gie#1:12@6145f346 +gigs/5101.3-jhs.gie#1:13@a355e96b +gigs/5101.3-jhs.gie#1:14@946081fc +gigs/5101.3-jhs.gie#1:15@d425d3e7 +gigs/5101.3-jhs.gie#1:16@ba53fd6d +gigs/5101.3-jhs.gie#1:17@94cd4d23 +gigs/5101.3-jhs.gie#1:18@e526c715 +gigs/5101.3-jhs.gie#1:19@b945f41b +gigs/5101.3-jhs.gie#1:20@3069ef32 +gigs/5101.3-jhs.gie#1:21@99638c6e +gigs/5101.3-jhs.gie#1:22@5a6f2e81 +gigs/5101.3-jhs.gie#2:0@4c6194b5 +gigs/5101.3-jhs.gie#2:1@5915ff54 +gigs/5101.3-jhs.gie#2:2@0b0d3288 +gigs/5101.3-jhs.gie#2:3@ea2df930 +gigs/5101.3-jhs.gie#2:4@70ebeca9 +gigs/5101.3-jhs.gie#2:5@752336a5 +gigs/5101.3-jhs.gie#2:6@b6c80323 +gigs/5101.3-jhs.gie#2:7@0a9d3243 +gigs/5101.3-jhs.gie#2:8@8d1a2c3a +gigs/5101.3-jhs.gie#2:9@642ced99 +gigs/5101.3-jhs.gie#2:10@4d2b3bb9 +gigs/5101.3-jhs.gie#2:11@4c4c214c +gigs/5101.3-jhs.gie#2:12@4dfa0485 +gigs/5101.3-jhs.gie#2:13@aceea1db +gigs/5101.3-jhs.gie#2:14@efdb6254 +gigs/5101.3-jhs.gie#2:15@1bb4f597 +gigs/5101.3-jhs.gie#2:16@9029efbc +gigs/5101.3-jhs.gie#2:17@d93c2dfa +gigs/5101.3-jhs.gie#2:18@a714396c +gigs/5101.3-jhs.gie#2:19@0a9d3243 +gigs/5101.3-jhs.gie#2:20@4f4da560 +gigs/5101.3-jhs.gie#2:21@e796b327 +gigs/5101.3-jhs.gie#2:22@94550365 +gigs/5101.4-jhs-etmerc.gie#0:0@bac3c741 +gigs/5101.4-jhs-etmerc.gie#0:1@fa581623 +gigs/5101.4-jhs-etmerc.gie#0:2@4a7a3306 +gigs/5101.4-jhs-etmerc.gie#0:3@d5ccb443 +gigs/5101.4-jhs-etmerc.gie#0:4@9527bdc3 +gigs/5101.4-jhs-etmerc.gie#0:5@035bb145 +gigs/5101.4-jhs-etmerc.gie#0:6@55d7198d +gigs/5101.4-jhs-etmerc.gie#0:7@1a88c022 +gigs/5101.4-jhs-etmerc.gie#0:8@4905d491 +gigs/5101.4-jhs-etmerc.gie#0:9@088884c9 +gigs/5101.4-jhs-etmerc.gie#0:10@ec03b0c4 +gigs/5101.4-jhs-etmerc.gie#0:11@d51d599d +gigs/5101.4-jhs-etmerc.gie#0:12@3a929e2e +gigs/5101.4-jhs-etmerc.gie#0:13@2a8b8928 +gigs/5101.4-jhs-etmerc.gie#0:14@48852c05 +gigs/5101.4-jhs-etmerc.gie#0:15@ed6f10d7 +gigs/5101.4-jhs-etmerc.gie#0:16@cf6ee704 +gigs/5101.4-jhs-etmerc.gie#0:17@379e9f05 +gigs/5101.4-jhs-etmerc.gie#0:18@6bb2cc95 +gigs/5101.4-jhs-etmerc.gie#0:19@c5ffa4e1 +gigs/5101.4-jhs-etmerc.gie#0:20@ea3eb3f6 +gigs/5101.4-jhs-etmerc.gie#0:21@ebf34173 +gigs/5101.4-jhs-etmerc.gie#0:22@7a0fa29c +gigs/5101.4-jhs-etmerc.gie#1:0@64c81ee1 +gigs/5101.4-jhs-etmerc.gie#1:1@11739ed6 +gigs/5101.4-jhs-etmerc.gie#1:2@5e5d563f +gigs/5101.4-jhs-etmerc.gie#1:3@4bf03f10 +gigs/5101.4-jhs-etmerc.gie#1:4@0f546945 +gigs/5101.4-jhs-etmerc.gie#1:5@aac7006c +gigs/5101.4-jhs-etmerc.gie#1:6@87244d86 +gigs/5101.4-jhs-etmerc.gie#1:7@232466d7 +gigs/5101.4-jhs-etmerc.gie#1:8@d4c461dd +gigs/5101.4-jhs-etmerc.gie#1:9@940a90f3 +gigs/5101.4-jhs-etmerc.gie#1:10@aff83f63 +gigs/5101.4-jhs-etmerc.gie#1:11@da3133d1 +gigs/5101.4-jhs-etmerc.gie#1:12@d1979468 +gigs/5101.4-jhs-etmerc.gie#1:13@668e3573 +gigs/5101.4-jhs-etmerc.gie#1:14@f6cf0891 +gigs/5101.4-jhs-etmerc.gie#1:15@c4ca0621 +gigs/5101.4-jhs-etmerc.gie#1:16@fa487ff2 +gigs/5101.4-jhs-etmerc.gie#1:17@f9eb8071 +gigs/5101.4-jhs-etmerc.gie#1:18@34f60132 +gigs/5101.4-jhs-etmerc.gie#1:19@c043abba +gigs/5101.4-jhs-etmerc.gie#1:20@9d9c34d9 +gigs/5101.4-jhs-etmerc.gie#1:21@b54616d5 +gigs/5101.4-jhs-etmerc.gie#1:22@6bcc9037 +gigs/5101.4-jhs-etmerc.gie#2:0@391c6429 +gigs/5101.4-jhs-etmerc.gie#2:1@972c790a +gigs/5101.4-jhs-etmerc.gie#2:2@4dc40bb1 +gigs/5101.4-jhs-etmerc.gie#2:3@720d4bbb +gigs/5101.4-jhs-etmerc.gie#2:4@30ee4565 +gigs/5101.4-jhs-etmerc.gie#2:5@72d54587 +gigs/5101.4-jhs-etmerc.gie#2:6@efe1b35d +gigs/5101.4-jhs-etmerc.gie#2:7@b5a6feb6 +gigs/5101.4-jhs-etmerc.gie#2:8@e7c7fb98 +gigs/5101.4-jhs-etmerc.gie#2:9@ac269c0b +gigs/5101.4-jhs-etmerc.gie#2:10@ecce0c67 +gigs/5101.4-jhs-etmerc.gie#2:11@bd2618e3 +gigs/5101.4-jhs-etmerc.gie#2:12@68ef2b8e +gigs/5101.4-jhs-etmerc.gie#2:13@6c3ab259 +gigs/5101.4-jhs-etmerc.gie#2:14@61281fd0 +gigs/5101.4-jhs-etmerc.gie#2:15@59fc07d6 +gigs/5101.4-jhs-etmerc.gie#2:16@b39daaf9 +gigs/5101.4-jhs-etmerc.gie#2:17@faadc709 +gigs/5101.4-jhs-etmerc.gie#2:18@afa65183 +gigs/5101.4-jhs-etmerc.gie#2:19@d6812227 +gigs/5101.4-jhs-etmerc.gie#2:20@b9c13249 +gigs/5101.4-jhs-etmerc.gie#2:21@90c07ed9 +gigs/5101.4-jhs-etmerc.gie#2:22@49d90313 +gigs/5102.1.gie#0:0@93ec8f5b +gigs/5102.1.gie#0:1@68dc9a2a +gigs/5102.1.gie#0:2@ed446d7e +gigs/5102.1.gie#0:3@ef8679d6 +gigs/5102.1.gie#0:4@e4b6cc98 +gigs/5102.1.gie#0:5@1bc3d800 +gigs/5102.1.gie#0:6@1406c9c7 +gigs/5102.1.gie#0:7@0811e91b +gigs/5102.1.gie#0:8@84cee983 +gigs/5102.1.gie#0:9@ab4d133f +gigs/5102.1.gie#0:10@2ee44a6c +gigs/5102.1.gie#0:11@a51f32cf +gigs/5102.1.gie#0:12@1bc3d800 +gigs/5102.1.gie#0:13@faa50341 +gigs/5102.1.gie#0:14@c421eb32 +gigs/5102.1.gie#0:15@f0a9263d +gigs/5102.1.gie#0:16@aafdc09f +gigs/5102.1.gie#0:17@a08ec095 +gigs/5102.1.gie#0:18@59d9864f +gigs/5102.1.gie#1:0@92d34437 +gigs/5102.1.gie#1:1@0f9a1d2d +gigs/5102.1.gie#1:2@80996020 +gigs/5102.1.gie#1:3@111e0b60 +gigs/5102.1.gie#1:4@5c848d65 +gigs/5102.1.gie#1:5@6577e22a +gigs/5102.1.gie#1:6@ec92a40f +gigs/5102.1.gie#1:7@d5523b61 +gigs/5102.1.gie#1:8@25429ab0 +gigs/5102.1.gie#1:9@70ab9560 +gigs/5102.1.gie#1:10@acceddb2 +gigs/5102.1.gie#1:11@4cdbe250 +gigs/5102.1.gie#1:12@6577e22a +gigs/5102.1.gie#1:13@fdbded64 +gigs/5102.1.gie#1:14@51c8bc67 +gigs/5102.1.gie#1:15@2c1e1d6a +gigs/5102.1.gie#1:16@5f5536d2 +gigs/5102.1.gie#1:17@e8bee1fb +gigs/5102.1.gie#1:18@78dd19ab +gigs/5102.1.gie#2:0@d5e6c302 +gigs/5102.1.gie#2:1@e97a525f +gigs/5102.1.gie#2:2@21d51521 +gigs/5102.1.gie#2:3@c2aea8d7 +gigs/5102.1.gie#2:4@ab9a4b01 +gigs/5102.1.gie#2:5@69b87137 +gigs/5102.1.gie#2:6@bf5e3091 +gigs/5102.1.gie#2:7@1333a32f +gigs/5102.1.gie#2:8@62e35192 +gigs/5102.1.gie#2:9@3d4c72b3 +gigs/5102.1.gie#2:10@abea1069 +gigs/5102.1.gie#2:11@4a88307a +gigs/5102.1.gie#2:12@69b87137 +gigs/5102.1.gie#2:13@74ae048b +gigs/5102.1.gie#2:14@9524179a +gigs/5102.1.gie#2:15@8c06edd0 +gigs/5102.1.gie#2:16@62628a7a +gigs/5102.1.gie#2:17@315691b0 +gigs/5102.1.gie#2:18@8ceae0ad +gigs/5102.2.gie#0:0@864140a5 +gigs/5102.2.gie#0:1@fdb38c3a +gigs/5102.2.gie#0:2@78192e60 +gigs/5102.2.gie#0:3@a9fb8869 +gigs/5102.2.gie#0:4@01e80621 +gigs/5102.2.gie#0:5@1372ebaa +gigs/5102.2.gie#0:6@8bb869f3 +gigs/5102.2.gie#0:7@04ef7285 +gigs/5102.2.gie#0:8@b859bc88 +gigs/5102.2.gie#0:9@b43002ac +gigs/5102.2.gie#0:10@ca2c648b +gigs/5102.2.gie#0:11@f8303615 +gigs/5102.2.gie#0:12@1372ebaa +gigs/5102.2.gie#0:13@4a5f0f0e +gigs/5102.2.gie#0:14@7dd8c8ce +gigs/5102.2.gie#0:15@1c9934ea +gigs/5102.2.gie#0:16@edc3e160 +gigs/5102.2.gie#0:17@157744e3 +gigs/5102.2.gie#0:18@982d08d0 +gigs/5102.2.gie#1:0@6b70036c +gigs/5102.2.gie#1:1@597024a1 +gigs/5102.2.gie#1:2@dd8b28eb +gigs/5102.2.gie#1:3@cfa8350e +gigs/5102.2.gie#1:4@67dfcfa9 +gigs/5102.2.gie#1:5@fad69c8a +gigs/5102.2.gie#1:6@a5307985 +gigs/5102.2.gie#1:7@ba5fba01 +gigs/5102.2.gie#1:8@67c2b96a +gigs/5102.2.gie#1:9@d164c424 +gigs/5102.2.gie#1:10@c9508fa6 +gigs/5102.2.gie#1:11@17effabb +gigs/5102.2.gie#1:12@fad69c8a +gigs/5102.2.gie#1:13@36c5acb5 +gigs/5102.2.gie#1:14@3a6b7b7b +gigs/5102.2.gie#1:15@d3b0d76f +gigs/5102.2.gie#1:16@5aa7f98a +gigs/5102.2.gie#1:17@51a65300 +gigs/5102.2.gie#1:18@2d53629b +gigs/5102.2.gie#2:0@e2373f50 +gigs/5102.2.gie#2:1@220bcf96 +gigs/5102.2.gie#2:2@82faef35 +gigs/5102.2.gie#2:3@ee8a760e +gigs/5102.2.gie#2:4@0cf595a3 +gigs/5102.2.gie#2:5@e0bfd58d +gigs/5102.2.gie#2:6@bbd1569b +gigs/5102.2.gie#2:7@30b7801a +gigs/5102.2.gie#2:8@773f7205 +gigs/5102.2.gie#2:9@9a00e54e +gigs/5102.2.gie#2:10@0f18e239 +gigs/5102.2.gie#2:11@f686d9cb +gigs/5102.2.gie#2:12@e0bfd58d +gigs/5102.2.gie#2:13@34474ac5 +gigs/5102.2.gie#2:14@2fe229b2 +gigs/5102.2.gie#2:15@683dbacc +gigs/5102.2.gie#2:16@7845af54 +gigs/5102.2.gie#2:17@67aae2ca +gigs/5102.2.gie#2:18@71d301da +gigs/5103.1.gie#0:0@6778b0d0 +gigs/5103.1.gie#0:1@b7df377e +gigs/5103.1.gie#0:2@c99d59b7 +gigs/5103.1.gie#0:3@58b8393a +gigs/5103.1.gie#0:4@e36edae7 +gigs/5103.1.gie#0:5@16e741f5 +gigs/5103.1.gie#0:6@dba0abb9 +gigs/5103.1.gie#0:7@db632296 +gigs/5103.1.gie#0:8@06be7389 +gigs/5103.1.gie#0:9@8292a632 +gigs/5103.1.gie#0:10@01ae488d +gigs/5103.1.gie#0:11@8d3a0c60 +gigs/5103.1.gie#0:12@a4cb4478 +gigs/5103.1.gie#0:13@16e741f5 +gigs/5103.1.gie#0:14@9b85b103 +gigs/5103.1.gie#0:15@0b1378a5 +gigs/5103.1.gie#0:16@836d81b0 +gigs/5103.1.gie#0:17@ecbdef5a +gigs/5103.1.gie#0:18@76d512ac +gigs/5103.1.gie#0:19@aceb9018 +gigs/5103.1.gie#1:0@79841f99 +gigs/5103.1.gie#1:1@ed061599 +gigs/5103.1.gie#1:2@afdbb9f6 +gigs/5103.1.gie#1:3@ca63cc15 +gigs/5103.1.gie#1:4@f55dd5fd +gigs/5103.1.gie#1:5@cae85e02 +gigs/5103.1.gie#1:6@03c3aa59 +gigs/5103.1.gie#1:7@eb962d64 +gigs/5103.1.gie#1:8@8a1776b3 +gigs/5103.1.gie#1:9@ff10f152 +gigs/5103.1.gie#1:10@f053c86e +gigs/5103.1.gie#1:11@b612f3fe +gigs/5103.1.gie#1:12@17fef2b9 +gigs/5103.1.gie#1:13@cae85e02 +gigs/5103.1.gie#1:14@354e0206 +gigs/5103.1.gie#1:15@8c13f2e6 +gigs/5103.1.gie#1:16@c6da7332 +gigs/5103.1.gie#1:17@6dfe2e2e +gigs/5103.1.gie#1:18@41aaa5a6 +gigs/5103.1.gie#1:19@2599bf5a +gigs/5103.1.gie#2:0@9bbe8a29 +gigs/5103.1.gie#2:1@79bc80f6 +gigs/5103.1.gie#2:2@bcc2d6ff +gigs/5103.1.gie#2:3@979a6c43 +gigs/5103.1.gie#2:4@68848b96 +gigs/5103.1.gie#2:5@0575f371 +gigs/5103.1.gie#2:6@1350b260 +gigs/5103.1.gie#2:7@1f59d6fb +gigs/5103.1.gie#2:8@34e21c14 +gigs/5103.1.gie#2:9@4e7d8c9f +gigs/5103.1.gie#2:10@30c26c0b +gigs/5103.1.gie#2:11@1c2d683b +gigs/5103.1.gie#2:12@f4e2028d +gigs/5103.1.gie#2:13@0575f371 +gigs/5103.1.gie#2:14@9e90d5e4 +gigs/5103.1.gie#2:15@c1490002 +gigs/5103.1.gie#2:16@ca0d6f50 +gigs/5103.1.gie#2:17@08ba7a60 +gigs/5103.1.gie#2:18@ae45205d +gigs/5103.1.gie#2:19@d884621e +gigs/5103.2.gie#0:0@6dc01f9b +gigs/5103.2.gie#0:1@68e9dfbd +gigs/5103.2.gie#0:2@bd8a72f7 +gigs/5103.2.gie#0:3@33d5a2bd +gigs/5103.2.gie#0:4@14e483fb +gigs/5103.2.gie#0:5@14e483fb +gigs/5103.2.gie#0:6@683c6da0 +gigs/5103.2.gie#0:7@e180f062 +gigs/5103.2.gie#0:8@068d8990 +gigs/5103.2.gie#0:9@973d1aad +gigs/5103.2.gie#1:0@467950f8 +gigs/5103.2.gie#1:1@5f4273de +gigs/5103.2.gie#1:2@84906a60 +gigs/5103.2.gie#1:3@3a16bdec +gigs/5103.2.gie#1:4@a6c6ef3b +gigs/5103.2.gie#1:5@a6c6ef3b +gigs/5103.2.gie#1:6@a97de82f +gigs/5103.2.gie#1:7@d935def5 +gigs/5103.2.gie#1:8@7ae0e8bf +gigs/5103.2.gie#1:9@00f6e999 +gigs/5103.2.gie#2:0@592138e4 +gigs/5103.2.gie#2:1@08a697d7 +gigs/5103.2.gie#2:2@cd842f12 +gigs/5103.2.gie#2:3@1bba25c7 +gigs/5103.2.gie#2:4@aeb931b4 +gigs/5103.2.gie#2:5@aeb931b4 +gigs/5103.2.gie#2:6@afdd13f9 +gigs/5103.2.gie#2:7@35e7f551 +gigs/5103.2.gie#2:8@96d9ff1e +gigs/5103.2.gie#2:9@4c9d9af0 +gigs/5103.3.gie#0:0@3340537c +gigs/5103.3.gie#0:1@42aa46be +gigs/5103.3.gie#0:2@4164945d +gigs/5103.3.gie#0:3@5ca6237c +gigs/5103.3.gie#0:4@d057c2c7 +gigs/5103.3.gie#0:5@d057c2c7 +gigs/5103.3.gie#0:6@ff625887 +gigs/5103.3.gie#0:7@b65b95df +gigs/5103.3.gie#0:8@edf01b21 +gigs/5103.3.gie#0:9@fe12306b +gigs/5103.3.gie#1:0@c3f47998 +gigs/5103.3.gie#1:1@7e9eab51 +gigs/5103.3.gie#1:2@53cde38e +gigs/5103.3.gie#1:3@1a5d37f7 +gigs/5103.3.gie#1:4@9e6f046a +gigs/5103.3.gie#1:5@9e6f046a +gigs/5103.3.gie#1:6@d56c4221 +gigs/5103.3.gie#1:7@3b841598 +gigs/5103.3.gie#1:8@98e2f988 +gigs/5103.3.gie#1:9@598bb16d +gigs/5103.3.gie#2:0@768bcb7c +gigs/5103.3.gie#2:1@f4c8276d +gigs/5103.3.gie#2:2@25593341 +gigs/5103.3.gie#2:3@b358ce99 +gigs/5103.3.gie#2:4@7bb735b8 +gigs/5103.3.gie#2:5@7bb735b8 +gigs/5103.3.gie#2:6@dd6e10e2 +gigs/5103.3.gie#2:7@3be9d357 +gigs/5103.3.gie#2:8@e1dd1d33 +gigs/5103.3.gie#2:9@4a51399d +gigs/5104.gie#0:0@b8bd3c98 +gigs/5104.gie#0:1@8ec15f3f +gigs/5104.gie#0:2@5dc7d1a9 +gigs/5104.gie#0:3@8a10574e +gigs/5104.gie#0:4@1b90b114 +gigs/5104.gie#0:5@19a58b47 +gigs/5104.gie#0:6@ef972cc7 +gigs/5104.gie#0:7@fc69147f +gigs/5104.gie#0:8@e4bf9c7b +gigs/5104.gie#0:9@e86d3b87 +gigs/5104.gie#0:10@5f6ab9fb +gigs/5104.gie#0:11@bbd7e508 +gigs/5104.gie#0:12@92851584 +gigs/5104.gie#0:13@19a58b47 +gigs/5104.gie#0:14@b6e054ee +gigs/5104.gie#0:15@233c46ef +gigs/5104.gie#0:16@b1fa42e7 +gigs/5104.gie#0:17@c9660ba1 +gigs/5104.gie#0:18@ed91c653 +gigs/5104.gie#0:19@c95840ff +gigs/5104.gie#1:0@0a8ed65c +gigs/5104.gie#1:1@50b0517b +gigs/5104.gie#1:2@c9266c65 +gigs/5104.gie#1:3@039d71d4 +gigs/5104.gie#1:4@692eb84a +gigs/5104.gie#1:5@ff13dc1c +gigs/5104.gie#1:6@554d4085 +gigs/5104.gie#1:7@1a15787d +gigs/5104.gie#1:8@59702177 +gigs/5104.gie#1:9@a20e331c +gigs/5104.gie#1:10@c3ea02e8 +gigs/5104.gie#1:11@0e945b30 +gigs/5104.gie#1:12@82bb2c9b +gigs/5104.gie#1:13@ff13dc1c +gigs/5104.gie#1:14@38fe57ef +gigs/5104.gie#1:15@6abf278f +gigs/5104.gie#1:16@2d4f6e37 +gigs/5104.gie#1:17@ddea5afd +gigs/5104.gie#1:18@204f6dfd +gigs/5104.gie#1:19@6873cbe1 +gigs/5104.gie#2:0@b5732a47 +gigs/5104.gie#2:1@62c647e1 +gigs/5104.gie#2:2@ab183cb4 +gigs/5104.gie#2:3@1c99f8a8 +gigs/5104.gie#2:4@635c7ea5 +gigs/5104.gie#2:5@9582ef31 +gigs/5104.gie#2:6@214782ea +gigs/5104.gie#2:7@af235fb9 +gigs/5104.gie#2:8@c820fb9c +gigs/5104.gie#2:9@8de6a3f8 +gigs/5104.gie#2:10@1cadfe95 +gigs/5104.gie#2:11@73ec96a3 +gigs/5104.gie#2:12@2b590f19 +gigs/5104.gie#2:13@9582ef31 +gigs/5104.gie#2:14@60afdf7e +gigs/5104.gie#2:15@9438aeab +gigs/5104.gie#2:16@77208434 +gigs/5104.gie#2:17@05f1ac29 +gigs/5104.gie#2:18@bbb11280 +gigs/5104.gie#2:19@525bd0ff +gigs/5105.2.gie#0:0@f4e74249 +gigs/5105.2.gie#0:1@eb900b80 +gigs/5105.2.gie#0:2@627e982c +gigs/5105.2.gie#0:3@232f29f1 +gigs/5105.2.gie#0:4@352c2678 +gigs/5105.2.gie#0:5@5a60976b +gigs/5105.2.gie#0:6@11834a7a +gigs/5105.2.gie#0:7@f83bdfaa +gigs/5105.2.gie#0:8@fd7d7d02 +gigs/5105.2.gie#0:9@352c2678 +gigs/5105.2.gie#0:10@d1e235b9 +gigs/5105.2.gie#0:11@87534b3b +gigs/5105.2.gie#1:0@3d506e37 +gigs/5105.2.gie#1:1@54822051 +gigs/5105.2.gie#1:2@34ee0504 +gigs/5105.2.gie#1:3@15230621 +gigs/5105.2.gie#1:4@b1c11dad +gigs/5105.2.gie#1:5@0f6f0017 +gigs/5105.2.gie#1:6@9a3c35d3 +gigs/5105.2.gie#1:7@1287df1a +gigs/5105.2.gie#1:8@c61d918f +gigs/5105.2.gie#1:9@b1c11dad +gigs/5105.2.gie#1:10@bf51cd62 +gigs/5105.2.gie#1:11@fa4ae4ed +gigs/5105.2.gie#2:0@533c70c2 +gigs/5105.2.gie#2:1@2478efc0 +gigs/5105.2.gie#2:2@25651561 +gigs/5105.2.gie#2:3@979bf487 +gigs/5105.2.gie#2:4@38a9cea7 +gigs/5105.2.gie#2:5@d3dcc3f4 +gigs/5105.2.gie#2:6@2a2e0c3f +gigs/5105.2.gie#2:7@be6111b6 +gigs/5105.2.gie#2:8@32d42c2a +gigs/5105.2.gie#2:9@38a9cea7 +gigs/5105.2.gie#2:10@0966b814 +gigs/5105.2.gie#2:11@2d445b9c +gigs/5106.gie#0:0@481be48e +gigs/5106.gie#0:1@ac78adae +gigs/5106.gie#0:2@a7c99879 +gigs/5106.gie#0:3@86a1a816 +gigs/5106.gie#0:4@8cfc5189 +gigs/5106.gie#0:5@d9d3cfb5 +gigs/5106.gie#0:6@40cb49e3 +gigs/5106.gie#0:7@aac58a07 +gigs/5106.gie#0:8@2f40ba69 +gigs/5106.gie#0:9@3889b1ce +gigs/5106.gie#0:10@5614ea7b +gigs/5106.gie#0:11@5ec44946 +gigs/5106.gie#0:12@e0a93078 +gigs/5106.gie#0:13@06afe6ee +gigs/5106.gie#0:14@619b3e8b +gigs/5106.gie#0:15@b54df26b +gigs/5106.gie#0:16@feb383ec +gigs/5106.gie#0:17@2828473d +gigs/5106.gie#0:18@7ecba0fe +gigs/5106.gie#0:19@d9d3cfb5 +gigs/5106.gie#0:20@b08f00d7 +gigs/5106.gie#0:21@69818138 +gigs/5106.gie#0:22@f1aacef5 +gigs/5106.gie#1:0@54422353 +gigs/5106.gie#1:1@bb8cce8c +gigs/5106.gie#1:2@25b0f01c +gigs/5106.gie#1:3@c4cef52c +gigs/5106.gie#1:4@ea6e48f1 +gigs/5106.gie#1:5@3764beb8 +gigs/5106.gie#1:6@96688296 +gigs/5106.gie#1:7@db6b2605 +gigs/5106.gie#1:8@1070d630 +gigs/5106.gie#1:9@e9dce727 +gigs/5106.gie#1:10@5b7ee2e6 +gigs/5106.gie#1:11@ff6020aa +gigs/5106.gie#1:12@8c04ea13 +gigs/5106.gie#1:13@5c68a5f0 +gigs/5106.gie#1:14@2ea90ff9 +gigs/5106.gie#1:15@7bd7605e +gigs/5106.gie#1:16@f6f31c0a +gigs/5106.gie#1:17@3e9ae5f6 +gigs/5106.gie#1:18@ad7e20f6 +gigs/5106.gie#1:19@3764beb8 +gigs/5106.gie#1:20@c19a5058 +gigs/5106.gie#1:21@fcc89c8f +gigs/5106.gie#1:22@f9efa3d5 +gigs/5106.gie#2:0@51f47db5 +gigs/5106.gie#2:1@e627ed15 +gigs/5106.gie#2:2@cd482fcd +gigs/5106.gie#2:3@3b18d794 +gigs/5106.gie#2:4@8c690847 +gigs/5106.gie#2:5@3563a262 +gigs/5106.gie#2:6@79dcfa4c +gigs/5106.gie#2:7@68b930ef +gigs/5106.gie#2:8@f7fecf75 +gigs/5106.gie#2:9@5c4d704e +gigs/5106.gie#2:10@4c90a65e +gigs/5106.gie#2:11@1359c2ff +gigs/5106.gie#2:12@51d12686 +gigs/5106.gie#2:13@654767d5 +gigs/5106.gie#2:14@4da81457 +gigs/5106.gie#2:15@c4f9ec29 +gigs/5106.gie#2:16@3bb455be +gigs/5106.gie#2:17@8df133e1 +gigs/5106.gie#2:18@0b413b3d +gigs/5106.gie#2:19@3563a262 +gigs/5106.gie#2:20@cc9b92d7 +gigs/5106.gie#2:21@9f58d038 +gigs/5106.gie#2:22@2862c750 +gigs/5107.gie#0:0@ae1f040c +gigs/5107.gie#0:1@45b15454 +gigs/5107.gie#0:2@f85adffc +gigs/5107.gie#0:3@9db3da83 +gigs/5107.gie#0:4@aa19d18b +gigs/5107.gie#0:5@a87c8d67 +gigs/5107.gie#0:6@72983b0c +gigs/5107.gie#0:7@99c728e6 +gigs/5107.gie#0:8@19b41003 +gigs/5107.gie#0:9@8673b348 +gigs/5107.gie#0:10@2cb23a66 +gigs/5107.gie#0:11@72983b0c +gigs/5107.gie#0:12@52167616 +gigs/5107.gie#1:0@52f31b9a +gigs/5107.gie#1:1@85540875 +gigs/5107.gie#1:2@a9a02c44 +gigs/5107.gie#1:3@6bb05ccd +gigs/5107.gie#1:4@841518a3 +gigs/5107.gie#1:5@82e4d91a +gigs/5107.gie#1:6@940af608 +gigs/5107.gie#1:7@e7782449 +gigs/5107.gie#1:8@68f02c9b +gigs/5107.gie#1:9@8078ef7c +gigs/5107.gie#1:10@953bee4e +gigs/5107.gie#1:11@940af608 +gigs/5107.gie#1:12@5525db69 +gigs/5107.gie#2:0@ea148488 +gigs/5107.gie#2:1@6a0abd94 +gigs/5107.gie#2:2@48a7ec2b +gigs/5107.gie#2:3@497911e5 +gigs/5107.gie#2:4@f9fedb17 +gigs/5107.gie#2:5@47186a60 +gigs/5107.gie#2:6@42977c23 +gigs/5107.gie#2:7@5b8759be +gigs/5107.gie#2:8@222bf031 +gigs/5107.gie#2:9@9c0b3d31 +gigs/5107.gie#2:10@f664d14b +gigs/5107.gie#2:11@42977c23 +gigs/5107.gie#2:12@def0d435 +gigs/5108.gie#0:0@caeefa52 +gigs/5108.gie#0:1@01299541 +gigs/5108.gie#0:2@85fb8a39 +gigs/5108.gie#0:3@89ba88d9 +gigs/5108.gie#0:4@6318b328 +gigs/5108.gie#0:5@d2604b55 +gigs/5108.gie#0:6@3aa09ed2 +gigs/5108.gie#0:7@fce3c3d9 +gigs/5108.gie#0:8@b4ed2b8f +gigs/5108.gie#0:9@ee1c65b0 +gigs/5108.gie#0:10@8e07629e +gigs/5108.gie#0:11@ad96ef1f +gigs/5108.gie#0:12@de1a50a6 +gigs/5108.gie#0:13@548fb4f2 +gigs/5108.gie#0:14@d2604b55 +gigs/5108.gie#0:15@d5f2bb79 +gigs/5108.gie#0:16@001e15a1 +gigs/5108.gie#1:0@3feb4612 +gigs/5108.gie#1:1@9b6cf909 +gigs/5108.gie#1:2@b37ec09b +gigs/5108.gie#1:3@595fd433 +gigs/5108.gie#1:4@1cd8251f +gigs/5108.gie#1:5@5d323540 +gigs/5108.gie#1:6@11bfcc04 +gigs/5108.gie#1:7@1d59a4e1 +gigs/5108.gie#1:8@c81be760 +gigs/5108.gie#1:9@bc104e9e +gigs/5108.gie#1:10@512b1c4c +gigs/5108.gie#1:11@c52627df +gigs/5108.gie#1:12@1446fcaa +gigs/5108.gie#1:13@f84931ab +gigs/5108.gie#1:14@5d323540 +gigs/5108.gie#1:15@1ffb957d +gigs/5108.gie#1:16@fbd86cf9 +gigs/5108.gie#2:0@5308ead3 +gigs/5108.gie#2:1@04e3d997 +gigs/5108.gie#2:2@686e7c43 +gigs/5108.gie#2:3@217b0293 +gigs/5108.gie#2:4@f4027a30 +gigs/5108.gie#2:5@4ca299dc +gigs/5108.gie#2:6@fce8cd55 +gigs/5108.gie#2:7@d4d081ce +gigs/5108.gie#2:8@50ec646f +gigs/5108.gie#2:9@d2fac9f4 +gigs/5108.gie#2:10@ad79acb2 +gigs/5108.gie#2:11@b2bfda56 +gigs/5108.gie#2:12@8623b03e +gigs/5108.gie#2:13@2b67eb05 +gigs/5108.gie#2:14@4ca299dc +gigs/5108.gie#2:15@2bec979c +gigs/5108.gie#2:16@f0ee5757 +gigs/5109.gie#0:0@d79356b3 +gigs/5109.gie#0:1@4acfac99 +gigs/5109.gie#0:2@0b81da57 +gigs/5109.gie#0:3@9f797154 +gigs/5109.gie#0:4@836f569f +gigs/5109.gie#0:5@266c35c8 +gigs/5109.gie#0:6@5227f1a8 +gigs/5109.gie#0:7@b4fe44a0 +gigs/5109.gie#0:8@9a11d343 +gigs/5109.gie#0:9@266c35c8 +gigs/5109.gie#0:10@78e4113e +gigs/5109.gie#0:11@b0e3f5aa +gigs/5109.gie#0:12@ad52ea34 +gigs/5109.gie#1:0@6de98ff7 +gigs/5109.gie#1:1@0ae45ede +gigs/5109.gie#1:2@271d90c3 +gigs/5109.gie#1:3@43180fd2 +gigs/5109.gie#1:4@9e90da0d +gigs/5109.gie#1:5@75070fd1 +gigs/5109.gie#1:6@4278d3c8 +gigs/5109.gie#1:7@e77f6202 +gigs/5109.gie#1:8@aa63b9ae +gigs/5109.gie#1:9@75070fd1 +gigs/5109.gie#1:10@2916e3d5 +gigs/5109.gie#1:11@1de6d9cf +gigs/5109.gie#1:12@53464628 +gigs/5109.gie#2:0@d0fc0954 +gigs/5109.gie#2:1@c134935d +gigs/5109.gie#2:2@6288d6d9 +gigs/5109.gie#2:3@d5bed725 +gigs/5109.gie#2:4@4286eaf9 +gigs/5109.gie#2:5@9761c6b1 +gigs/5109.gie#2:6@58cffe11 +gigs/5109.gie#2:7@82014bb3 +gigs/5109.gie#2:8@4083ade5 +gigs/5109.gie#2:9@9761c6b1 +gigs/5109.gie#2:10@831aac0f +gigs/5109.gie#2:11@18d26870 +gigs/5109.gie#2:12@d3c40605 +gigs/5111.1.gie#0:0@f2048302 +gigs/5111.1.gie#0:1@1181613a +gigs/5111.1.gie#0:2@d885880d +gigs/5111.1.gie#0:3@e4ca4ceb +gigs/5111.1.gie#0:4@a22d9bb7 +gigs/5111.1.gie#0:5@376a5f23 +gigs/5111.1.gie#0:6@dd6da846 +gigs/5111.1.gie#0:7@4a12caa1 +gigs/5111.1.gie#0:8@7e9432a5 +gigs/5111.1.gie#0:9@615f98e9 +gigs/5111.1.gie#0:10@97a9c0b3 +gigs/5111.1.gie#0:11@ffafdaee +gigs/5111.1.gie#0:12@af1bd83d +gigs/5111.1.gie#0:13@225a1305 +gigs/5111.1.gie#0:14@e1e9a262 +gigs/5111.1.gie#0:15@2fff1959 +gigs/5111.1.gie#0:16@98f99e51 +gigs/5111.1.gie#0:17@26bef685 +gigs/5111.1.gie#0:18@b53278c3 +gigs/5111.1.gie#0:19@181e727c +gigs/5111.1.gie#0:20@661336ac +gigs/5111.1.gie#0:21@5c6b17ff +gigs/5111.1.gie#0:22@68bb8c82 +gigs/5111.1.gie#0:23@d13dae6f +gigs/5111.1.gie#0:24@674d1a35 +gigs/5111.1.gie#0:25@461a7659 +gigs/5111.1.gie#0:26@73369c70 +gigs/5111.1.gie#0:27@ffafdaee +gigs/5111.1.gie#0:28@74bc98c4 +gigs/5111.1.gie#0:29@21594c79 +gigs/5111.1.gie#0:30@09d61fd5 +gigs/5111.1.gie#0:31@d7320c22 +gigs/5111.1.gie#0:32@4b22c652 +gigs/5111.1.gie#0:33@15de77f8 +gigs/5111.1.gie#0:34@019ea72f +gigs/5111.1.gie#1:0@11bb481b +gigs/5111.1.gie#1:1@9e8e5535 +gigs/5111.1.gie#1:2@44232acc +gigs/5111.1.gie#1:3@61732178 +gigs/5111.1.gie#1:4@a0851c5c +gigs/5111.1.gie#1:5@163b1d2a +gigs/5111.1.gie#1:6@f3360b45 +gigs/5111.1.gie#1:7@8347eea0 +gigs/5111.1.gie#1:8@c4e04ab8 +gigs/5111.1.gie#1:9@1044b707 +gigs/5111.1.gie#1:10@d3746faa +gigs/5111.1.gie#1:11@45033199 +gigs/5111.1.gie#1:12@5c795e27 +gigs/5111.1.gie#1:13@227351e1 +gigs/5111.1.gie#1:14@9c9589e8 +gigs/5111.1.gie#1:15@a2e3575b +gigs/5111.1.gie#1:16@cf80931a +gigs/5111.1.gie#1:17@e36a8b09 +gigs/5111.1.gie#1:18@03e27ead +gigs/5111.1.gie#1:19@61357cf5 +gigs/5111.1.gie#1:20@f5bc3a42 +gigs/5111.1.gie#1:21@898aab34 +gigs/5111.1.gie#1:22@32f9037e +gigs/5111.1.gie#1:23@06b9ff4e +gigs/5111.1.gie#1:24@6f2351c0 +gigs/5111.1.gie#1:25@b90c9454 +gigs/5111.1.gie#1:26@68b86106 +gigs/5111.1.gie#1:27@45033199 +gigs/5111.1.gie#1:28@615c7dd1 +gigs/5111.1.gie#1:29@cdacd471 +gigs/5111.1.gie#1:30@1e927887 +gigs/5111.1.gie#1:31@96e2f41f +gigs/5111.1.gie#1:32@5cc5a8b5 +gigs/5111.1.gie#1:33@bec10258 +gigs/5111.1.gie#1:34@19f9dbe4 +gigs/5111.1.gie#2:0@267d4957 +gigs/5111.1.gie#2:1@8e2f165a +gigs/5111.1.gie#2:2@a1fbd69d +gigs/5111.1.gie#2:3@28265c83 +gigs/5111.1.gie#2:4@74389d86 +gigs/5111.1.gie#2:5@c79f5dcf +gigs/5111.1.gie#2:6@9c198218 +gigs/5111.1.gie#2:7@95bea0e1 +gigs/5111.1.gie#2:8@b87bcc5b +gigs/5111.1.gie#2:9@ea23cffe +gigs/5111.1.gie#2:10@bc436529 +gigs/5111.1.gie#2:11@7b212a97 +gigs/5111.1.gie#2:12@3f297d6a +gigs/5111.1.gie#2:13@38f1d139 +gigs/5111.1.gie#2:14@40c69427 +gigs/5111.1.gie#2:15@cb8d141c +gigs/5111.1.gie#2:16@a8c62669 +gigs/5111.1.gie#2:17@4a19608a +gigs/5111.1.gie#2:18@fe8eb0a7 +gigs/5111.1.gie#2:19@c58d4c82 +gigs/5111.1.gie#2:20@8ca3041f +gigs/5111.1.gie#2:21@44353a53 +gigs/5111.1.gie#2:22@82a8f7ab +gigs/5111.1.gie#2:23@0533c5bf +gigs/5111.1.gie#2:24@0f1f3c11 +gigs/5111.1.gie#2:25@1105f709 +gigs/5111.1.gie#2:26@46cdaddd +gigs/5111.1.gie#2:27@7b212a97 +gigs/5111.1.gie#2:28@b8bf9ce5 +gigs/5111.1.gie#2:29@ab090eb6 +gigs/5111.1.gie#2:30@b4e0aa22 +gigs/5111.1.gie#2:31@924bdd59 +gigs/5111.1.gie#2:32@12ee68fb +gigs/5111.1.gie#2:33@b95ac003 +gigs/5111.1.gie#2:34@19eea595 +gigs/5112.gie#0:0@f67ed188 +gigs/5112.gie#0:1@cec2127a +gigs/5112.gie#0:2@8f61c4d6 +gigs/5112.gie#0:3@768eccf1 +gigs/5112.gie#0:4@cf9472a1 +gigs/5112.gie#1:0@93c730ad +gigs/5112.gie#1:1@bd985589 +gigs/5112.gie#1:2@0792f3b4 +gigs/5112.gie#1:3@6c96314f +gigs/5112.gie#1:4@8cc83d09 +gigs/5112.gie#2:0@31f427bf +gigs/5112.gie#2:1@fa64408a +gigs/5112.gie#2:2@73c8c097 +gigs/5112.gie#2:3@538aa807 +gigs/5112.gie#2:4@7438cb7c +gigs/5113.gie#0:0@ce6f6454 +gigs/5113.gie#0:1@bab54b07 +gigs/5113.gie#0:2@8e87d130 +gigs/5113.gie#0:3@506aa02c +gigs/5113.gie#0:4@506aa02c +gigs/5113.gie#1:0@9168d0b2 +gigs/5113.gie#1:1@4534fff0 +gigs/5113.gie#1:2@eb2c43b8 +gigs/5113.gie#1:3@70d9c64e +gigs/5113.gie#1:4@70d9c64e +gigs/5113.gie#2:0@510dfc62 +gigs/5113.gie#2:1@8d51bdb9 +gigs/5113.gie#2:2@1d05223b +gigs/5113.gie#2:3@195ebd66 +gigs/5113.gie#2:4@195ebd66 +gigs/5201.gie#0:0@13c162f0 +gigs/5201.gie#0:1@c6d3444d +gigs/5201.gie#0:2@16827c65 +gigs/5201.gie#0:3@e1896114 +gigs/5201.gie#0:4@02fbcf59 +gigs/5201.gie#0:5@8d6a3863 +gigs/5201.gie#0:6@185e6f34 +gigs/5201.gie#0:7@1bb0a25e +gigs/5201.gie#0:8@ece60f9b +gigs/5201.gie#0:9@422974b2 +gigs/5201.gie#0:10@fe5d7a9e +gigs/5201.gie#0:11@da73b2bb +gigs/5201.gie#0:12@28201b3b +gigs/5201.gie#0:13@530e052e +gigs/5201.gie#0:14@3ba43f7c +gigs/5201.gie#0:15@be31cef8 +gigs/5201.gie#0:16@1d54b31d +gigs/5201.gie#0:17@bdfa0fdc +gigs/5201.gie#0:18@8e03ab3e +gigs/5201.gie#0:19@f169c2b3 +gigs/5201.gie#0:20@0af385dc +gigs/5201.gie#0:21@974016a5 +gigs/5201.gie#0:22@94b010ea +gigs/5201.gie#0:23@492d7f43 +gigs/5201.gie#0:24@48a90a98 +gigs/5201.gie#0:25@d7038f38 +gigs/5201.gie#0:26@3ce4b21d +gigs/5201.gie#1:0@dfb6f585 +gigs/5201.gie#1:1@5a2e1383 +gigs/5201.gie#1:2@df268a44 +gigs/5201.gie#1:3@3056f61e +gigs/5201.gie#1:4@e01e0853 +gigs/5201.gie#1:5@67c83a63 +gigs/5201.gie#1:6@c7fe5267 +gigs/5201.gie#1:7@d0458f52 +gigs/5201.gie#1:8@99b55998 +gigs/5201.gie#1:9@3ffdc257 +gigs/5201.gie#1:10@168301b9 +gigs/5201.gie#1:11@6505d22f +gigs/5201.gie#1:12@c4a00b38 +gigs/5201.gie#1:13@23496066 +gigs/5201.gie#1:14@de862c7a +gigs/5201.gie#1:15@af5cceeb +gigs/5201.gie#1:16@a0ae4450 +gigs/5201.gie#1:17@a90e651a +gigs/5201.gie#1:18@638466f6 +gigs/5201.gie#1:19@ef41f8f0 +gigs/5201.gie#1:20@e899dbaa +gigs/5201.gie#1:21@e0550e2c +gigs/5201.gie#1:22@5bf0af5c +gigs/5201.gie#1:23@f9218e0b +gigs/5201.gie#1:24@f89fe629 +gigs/5201.gie#1:25@584ec3a2 +gigs/5201.gie#1:26@01672a21 +gigs/5201.gie#2:0@6d29f9fe +gigs/5201.gie#2:1@9e3fc980 +gigs/5201.gie#2:2@7e271879 +gigs/5201.gie#2:3@1cc3ce88 +gigs/5201.gie#2:4@d5971b7a +gigs/5201.gie#2:5@1a86ea68 +gigs/5201.gie#2:6@5a8d48ac +gigs/5201.gie#2:7@b4ee343c +gigs/5201.gie#2:8@893d0c1b +gigs/5201.gie#2:9@a4d94bea +gigs/5201.gie#2:10@7fa6562a +gigs/5201.gie#2:11@6825643b +gigs/5201.gie#2:12@cce8334e +gigs/5201.gie#2:13@c01896ee +gigs/5201.gie#2:14@d3685717 +gigs/5201.gie#2:15@335ba3ca +gigs/5201.gie#2:16@90bee54b +gigs/5201.gie#2:17@1cb067a4 +gigs/5201.gie#2:18@9bb2314a +gigs/5201.gie#2:19@159ffe6e +gigs/5201.gie#2:20@dd15ace9 +gigs/5201.gie#2:21@8422fff2 +gigs/5201.gie#2:22@539cb48a +gigs/5201.gie#2:23@98fb8d23 +gigs/5201.gie#2:24@3f728350 +gigs/5201.gie#2:25@153b1436 +gigs/5201.gie#2:26@a395737a +gigs/5208.gie#0:0@5cb0b48e +gigs/5208.gie#0:1@d503f86c +gigs/5208.gie#0:2@60e51748 +gigs/5208.gie#0:3@54221d1f +gigs/5208.gie#0:4@9f5ad6c5 +gigs/5208.gie#0:5@746251d3 +gigs/5208.gie#0:6@0b7e1e87 +gigs/5208.gie#0:7@6964333b +gigs/5208.gie#0:8@3047045b +gigs/5208.gie#0:9@82135324 +gigs/5208.gie#0:10@897d9cdd +gigs/5208.gie#0:11@031b38bf +gigs/5208.gie#0:12@7b4ee9ee +gigs/5208.gie#0:13@c9d8a832 +gigs/5208.gie#1:0@438e2457 +gigs/5208.gie#1:1@4d916206 +gigs/5208.gie#1:2@ac08c826 +gigs/5208.gie#1:3@4d199a4a +gigs/5208.gie#1:4@8a900576 +gigs/5208.gie#1:5@39c9269e +gigs/5208.gie#1:6@f42e1fb7 +gigs/5208.gie#1:7@805167a1 +gigs/5208.gie#1:8@e14f3361 +gigs/5208.gie#1:9@726ed1f3 +gigs/5208.gie#1:10@29bdde5d +gigs/5208.gie#1:11@48aee619 +gigs/5208.gie#1:12@2fb973de +gigs/5208.gie#1:13@1efd7aef +gigs/5208.gie#2:0@fce063b2 +gigs/5208.gie#2:1@aafa47a3 +gigs/5208.gie#2:2@baa211f5 +gigs/5208.gie#2:3@0e471116 +gigs/5208.gie#2:4@412455df +gigs/5208.gie#2:5@c0eb2a6f +gigs/5208.gie#2:6@de7e8538 +gigs/5208.gie#2:7@24c74425 +gigs/5208.gie#2:8@e11d6fb3 +gigs/5208.gie#2:9@6d6207a3 +gigs/5208.gie#2:10@c95b3561 +gigs/5208.gie#2:11@42d52c04 +gigs/5208.gie#2:12@2d790114 +gigs/5208.gie#2:13@fdeaa028 diff --git a/conformance/src/test/resources/gie-expected-failures.tsv b/conformance/src/test/resources/gie-expected-failures.tsv new file mode 100644 index 0000000..1facdc9 --- /dev/null +++ b/conformance/src/test/resources/gie-expected-failures.tsv @@ -0,0 +1,500 @@ +# proj4j gie/GIGS conformance - expected-outcome manifest. +# +# One line per assertion that is NOT expected to pass. A key that is absent from this file +# is expected to PASS; there are no PASS rows. Columns are tab-separated: +# +# #:@ +# +# VACUOUS_EXPECTED_FAILURE is an `expect failure` row that gie would score a pass but which +# measured nothing: the operation could not be created for a reason unrelated to what the row +# asserts. It is neither a pass nor a failure, and it is excluded from both sides of the +# headline ratio. +# +# Regenerate (never hand-sort; the writer emits the canonical order): +# mvn -Pconformance verify -Dgie.regenerate=true +# +# Hand-written reasons are preserved across regeneration for entries whose outcome is +# unchanged, so it is worth explaining WHY, not just THAT, an assertion fails. +key expected reason +gie/4D-API_cs2cs-style.gie#11:0@c4fe674b FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: helmert +gie/4D-API_cs2cs-style.gie#19:0@339a194e VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass (NOT_IMPLEMENTED: InvalidValueException: Unknown projection: helmert) +gie/4D-API_cs2cs-style.gie#38:0@69f7d826 FAIL operation could not be created: NOT_IMPLEMENTED: CrsTransformException: +grids=tests/test_nodata.gtx,null: Unknown vertical grid: tests/test_nodata.gtx. Resolution chain was chain[cached(classpath:proj-data/), cached(classpath:proj4j-data/grids/), cached(classpath:proj4/nad/)]; the working directory is deliberately not searched. +gie/4D-API_cs2cs-style.gie#38:1@1bf2d9fe FAIL operation could not be created: NOT_IMPLEMENTED: CrsTransformException: +grids=tests/test_nodata.gtx,null: Unknown vertical grid: tests/test_nodata.gtx. Resolution chain was chain[cached(classpath:proj-data/), cached(classpath:proj4j-data/grids/), cached(classpath:proj4/nad/)]; the working directory is deliberately not searched. +gie/4D-API_cs2cs-style.gie#41:0@3c0a7083 FAIL deviation 999000.000000 mm, tolerance 0.500000 mm, metric EUCLIDEAN_METRES; got 0.000000000 1000.000000000 0.000000000 +gie/GDA.gie#0:0@c10ad0bb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/GDA.gie#1:0@36924017 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: helmert +gie/GDA.gie#2:0@8d8e0d4d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#58:0@f39ff2c7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=chamb is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#58:1@8dcd8cdb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=chamb is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#58:2@e0b52f33 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=chamb is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#58:3@ad827f95 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=chamb is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:0@b16ec002 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:1@ac5e8d27 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:2@7f79bab2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:3@112a9544 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:4@fb1e85ee FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:5@f844e2e3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:6@e28925bc FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:7@5b100965 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:8@32f3ec5c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:9@0cdc7725 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:10@1fa7219c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:11@cb7ed245 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:12@87840ab8 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:13@6b544771 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:14@8517344e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:15@86f9dc06 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:16@9b9309fe FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:17@d9c82926 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:18@349ac54c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:19@9c27ed45 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:20@9e94583c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:21@659603e1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:22@24a11ffe FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:23@6527d587 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:24@2bd2321e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:25@1a89fce2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:26@925787a0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:27@9e4880b5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:28@ee63c8aa FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:29@05f40968 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:30@29eb270c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:31@983c2853 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:32@c9d110c8 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:33@78f612a7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:34@4cea0741 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:35@c660ea7a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:36@953bd980 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:37@ec9b393c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:38@690792d1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:39@07aed053 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:40@4c96f7c1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:41@bae4d28e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:42@0feed023 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:43@95139823 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:44@d44fb456 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:45@0f1d8882 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#63:46@f37f0bcf VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass (NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/builtins.gie#64:0@c1992dc3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:1@95926a08 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:2@10791eff FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:3@ecbe3f95 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:4@5fc9dc3b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:5@1544bc70 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:6@eb2d8835 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:7@b4d72ef4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:8@81e3bcc0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:9@4b562f5f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:10@7d064c0f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:11@0fe91d14 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:12@97c8c674 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:13@39614319 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:14@aa2250c4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:15@10d3c1c1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:16@4967888a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:17@4c895d78 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:18@5b5ee374 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:19@d5f5769f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:20@a6f85992 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:21@fde6419f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:22@f14363e5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:23@de19a2a2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:24@f9606891 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:25@ba8a1e8b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:26@4b84b2dc FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:27@5778c9de FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:28@da43940d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:29@45f22dd1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:30@6cfd7283 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:31@b5673dd8 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:32@cc97d089 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:33@726ac9e8 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:34@0cb04626 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:35@7e277ea6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:36@b55c46ed FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:37@d08b3b4d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:38@97f1f317 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:39@9475ea18 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:40@790e171c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:41@d9bd0bc5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:42@3ee5a21b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:43@7bd78c9f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:44@bc26f031 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:45@2260fc74 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#64:46@812a1e80 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass (NOT_IMPLEMENTED: +proj=airocean is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/builtins.gie#84:0@3b67a0d2 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_illegal_arg_value: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: InvalidValueException: Invalid value for eccentricity: the cone constant evaluates to 0) +gie/builtins.gie#116:0@f95d4033 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:1@57033d06 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:2@3ecfe39b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:3@9b997c1a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:4@5236022c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:5@447aac68 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:6@758db1c6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#116:7@5d52bf32 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:0@eeb95c72 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:1@d20ccf7a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:2@beabae87 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:3@567a60c9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:4@2eaf46aa FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:5@b219272a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:6@1d5e964b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#117:7@f7a8453f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:0@b0232f9a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:1@e7a61c9f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:2@5104fc63 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:3@e72ef38b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:4@e893cbfa FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:5@35ce2fac FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:6@0a63ba8d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#118:7@f92df050 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:0@bbff9b05 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:1@8a567d1f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:2@fdba5679 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:3@8dbeb78c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:4@849f74d7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:5@943984de FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:6@e9c0ad24 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#119:7@4d277ccb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:0@dd35df3f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:1@f1e5a565 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:2@a9c8f7c1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:3@3267264d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:4@5331efe9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:5@4685f369 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:6@38f7aa8a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#120:7@00e63b1b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#121:0@adb4cb99 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#121:1@fe056969 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#121:2@e8a0b211 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#121:3@7ae2ae31 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#121:4@27208892 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#121:5@45cdffc1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rhealpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:0@dd363b32 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:1@7d8e4a53 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:2@886db76b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:3@4149f812 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:4@4462b6b4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:5@d22b68bf FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:6@077e5228 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#128:7@a27579db FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#129:0@84010aec VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass (NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/builtins.gie#130:0@e82b139a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:1@aa165aed FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:2@8549e64f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:3@0e8d1ae9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:4@38830122 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:5@5e31dbae FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:6@fe6cfc92 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:7@aea17a76 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:8@bbb341ec FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:9@b472ea5e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:10@ab7c97e4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:11@a35365b7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:12@0ad2c25a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:13@c9a92c86 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:14@54b38533 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#130:15@53b859f2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:0@00abcd4c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:1@e5ec748f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:2@62f8bb20 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:3@17794ecc FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:4@b7387d24 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:5@b124fa6e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:6@8a5f4dd0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:7@4de4b152 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:8@9bd2398c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:9@bfb9980a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:10@560b424f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:11@d32f5ff9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:12@d1aa10c0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:13@c41fb295 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:14@b18104fe FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#131:15@0deda4e4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=isea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#135:5@53017446 FAIL deviation 21.942407 mm, tolerance 0.100000 mm, metric GEODESIC_FROM_RADIANS; got 24.836219260 59.758404029 +gie/builtins.gie#135:6@9b3d93ce FAIL deviation 21.931533 mm, tolerance 0.100000 mm, metric GEODESIC_FROM_RADIANS; got 24.836315838 59.756888342 +gie/builtins.gie#135:7@80270ab8 FAIL deviation 21.958791 mm, tolerance 0.100000 mm, metric GEODESIC_FROM_RADIANS; got 24.830447406 59.758404029 +gie/builtins.gie#135:8@bdb17fce FAIL deviation 21.948465 mm, tolerance 0.100000 mm, metric GEODESIC_FROM_RADIANS; got 24.830350829 59.756888342 +gie/builtins.gie#137:1@4dbebced FAIL roundtrip deviation Infinity mm, expected 11.000000 mm over 1 trips (INVALID_COORD: PipelineDefinitionException: pipeline is not invertible: proj=krovak lat_0=49.5 lon_0=42.5 k=0.9999 x_0=0 y_0=0 ellps=bessel pm=ferro) +gie/builtins.gie#138:0@f1a3d35e FAIL operation could not be created: NOT_IMPLEMENTED: +czech: proj4j does not implement this parameter, and PROJ 9.8.1 would have acted on it, so executing without it would produce a wrong answer rather than a skip +gie/builtins.gie#138:1@8d686371 FAIL operation could not be created: NOT_IMPLEMENTED: +czech: proj4j does not implement this parameter, and PROJ 9.8.1 would have acted on it, so executing without it would produce a wrong answer rather than a skip +gie/builtins.gie#139:0@3d4e555d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=mod_krovak is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#139:1@f5d12407 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=mod_krovak is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#140:0@32f31dfe FAIL operation could not be created: NOT_IMPLEMENTED: +proj=mod_krovak is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#140:1@a3172e70 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=mod_krovak is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#166:0@05fa0b5b VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_illegal_arg_value: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: InvalidValueException: Invalid value for eccentricity) +gie/builtins.gie#167:0@12a0e1f6 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass (NOT_IMPLEMENTED: +lat_1=2D32: PROJ reads 0.04421500771718968 rad, proj4j cannot parse it) +gie/builtins.gie#233:0@98f8d1cd FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:1@45c3c065 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:2@39e896d7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:3@faeed9ab FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:4@592bf10e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:5@c79e2f4f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:6@981794d3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#233:7@771fb848 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=oea is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#241:0@977273dd VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_illegal_arg_value: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: InvalidValueException: Invalid value for eccentricity: it is so close to 1 that the two-point centre line is undefined) +gie/builtins.gie#278:0@4ef6e197 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:1@5db5a245 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:2@c4be0d5f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:3@9389c11a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:4@76abddec FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:5@4442cfee FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:6@f0c71a43 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#278:7@c13a208b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:0@766d6fc9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:1@5ef999ea FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:2@82499513 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:3@be96c1a2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:4@88326355 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:5@5e3470f2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:6@f3ab7ccd FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#279:7@c7ee11f5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=qsc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:0@60152d88 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:1@709078ba FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:2@d66bc3e4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:3@33de264e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:4@f6fe38f1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:5@ddd0228d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:6@6a8e83b9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#281:7@95cab06a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=rouss is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:0@c28a827e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:1@52030359 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:2@2fca9854 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:3@47f196bb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:4@1328d4ea FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:5@7deb5824 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:6@4611300f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:7@dafba763 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:8@019c20b8 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:9@d9b6ea1b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:10@5d683727 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:11@ba69b579 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:12@6177333d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:13@d1e27fd2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:14@848dcd5b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:15@82c6eb9b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:16@13d694bc FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:17@2d17c5b7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:18@ab5b9d5c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:19@7191e96a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:20@536e80b3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:21@13fe6e5a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:22@b63aec8b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:23@a0200c13 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:24@8f716b00 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#283:25@80a61358 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#284:0@2bf03730 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#284:1@ac44dc05 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#284:2@bb891546 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#284:3@f851a1a9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#284:4@dddf3742 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#284:5@22781274 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#285:0@8feb5dd7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#285:1@2f6f3a5a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#285:2@66a33d8b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#285:3@5ffd746d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#285:4@2a43ff19 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#285:5@99793125 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#286:0@dc40a529 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#286:1@ba51da4e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#286:2@881a480c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#286:3@e31c801c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#286:4@cff40f4d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#286:5@b33f0081 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#287:0@b58609b4 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#287:1@856dc935 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#287:2@a8767ea3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#287:3@5ac03cdf FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#287:4@63a87342 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#287:5@26acfcc9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#288:0@60a7109e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#288:1@450edc80 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#288:2@b5eeecd6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#288:3@b13c03b2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#288:4@c60be884 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#288:5@e824c903 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=s2 is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#343:5@7a0edcad FAIL deviation 37098329228.794975 mm, tolerance 0.250000 mm, metric EUCLIDEAN_METRES; got 18549167.501994960 7731306.740598573 +gie/builtins.gie#345:5@57f68227 FAIL roundtrip deviation 22107737.995200 mm, expected 0.350000 mm over 10 trips +gie/builtins.gie#345:7@1a531aea FAIL roundtrip deviation 22107737.995200 mm, expected 0.350000 mm over 10 trips +gie/builtins.gie#345:9@cf8005f5 FAIL roundtrip deviation 22107737.995200 mm, expected 0.350000 mm over 10 trips +gie/builtins.gie#345:11@3acea89e FAIL roundtrip deviation 22107737.995200 mm, expected 0.350000 mm over 10 trips +gie/builtins.gie#363:0@4f53bdc2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=topocentric is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#363:1@4a9aeb0b FAIL operation could not be created: NOT_IMPLEMENTED: +proj=topocentric is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/builtins.gie#364:0@3c8b342c FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: topocentric +gie/builtins.gie#364:1@368ebb48 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: topocentric +gie/defmodel.gie#1:0@58314b89 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/defmodel.gie#2:0@643e1c10 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/defmodel.gie#3:0@b9497f02 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno coord_transfm_missing_time: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/defmodel.gie#4:0@b9497f02 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno coord_transfm_missing_time: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/defmodel.gie#5:0@10a4b3ef FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#5:1@e39fb79f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#6:0@f3fc4b4e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#6:1@c551eea0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#7:0@39d4f918 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#7:1@6fe3da2d FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#8:0@3f09b2ad FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#8:1@fbb9eef3 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:0@59fa8eb9 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:1@4373b71f FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:2@5b66d91c FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:3@339fb19c FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:4@23fba272 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:5@652f4baf FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:6@cb7a7b7a FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:7@0dc311ff FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:8@f14637b5 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#9:9@577f5eab FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#10:0@2010e5d0 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#10:1@41ef1d49 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: defmodel +gie/defmodel.gie#11:0@bfd26650 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#11:1@f010c0a6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#12:0@ab753264 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#13:0@01d7b392 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#14:0@22e977d6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#15:0@be46bfc0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#15:1@e2595268 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#15:2@2e363056 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/defmodel.gie#15:3@7172fcc1 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=defmodel is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/deformation.gie#1:0@54eb84fd FAIL operation could not be created: NOT_IMPLEMENTED: pipeline: PipelineDefinitionException: +proj=deformation +grids=tests/nkgrf03vel_realigned_extract.tif: the single-file form is a three-channel Geodetic TIFF Grid, and proj4j has no GeoTIFF grid reader. Use the historical +xy_grids= (CTable2/NTv1/NTv2) and +z_grids= (GTX) pair. +gie/deformation.gie#1:1@38c259a1 FAIL operation could not be created: NOT_IMPLEMENTED: pipeline: PipelineDefinitionException: +proj=deformation +grids=tests/nkgrf03vel_realigned_extract.tif: the single-file form is a three-channel Geodetic TIFF Grid, and proj4j has no GeoTIFF grid reader. Use the historical +xy_grids= (CTable2/NTv1/NTv2) and +z_grids= (GTX) pair. +gie/ellipsoid.gie#19:0@5f40be10 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/ellipsoid.gie#19:1@5ccebb5a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=healpix is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/epsg_grid.gie#0:0@e71a0ce9 SKIP skipped: require_grid could not resolve a grid +gie/epsg_grid.gie#1:0@66d05acf SKIP skipped: require_grid could not resolve a grid +gie/epsg_no_grid.gie#0:0@41eee723 FAIL deviation 6839554274.657462 mm, tolerance 0.100000 mm, metric EUCLIDEAN_METRES; got 6080642.112967498 1886936.969134057 +gie/epsg_no_grid.gie#1:0@54f3bf86 FAIL operation could not be created: NOT_IMPLEMENTED: crs_src EPSG:4979: UnknownAuthorityCodeException: EPSG:4979 +gie/epsg_no_grid.gie#2:0@54f3bf86 FAIL operation could not be created: NOT_IMPLEMENTED: crs_src EPSG:4979: UnknownAuthorityCodeException: EPSG:4979 +gie/epsg_no_grid.gie#3:0@757b94e6 FAIL operation could not be created: NOT_IMPLEMENTED: crs_src EPSG:7843: UnknownAuthorityCodeException: EPSG:7843 +gie/epsg_no_grid.gie#4:0@9ab22feb FAIL operation could not be created: NOT_IMPLEMENTED: crs_src EPSG:7843: UnknownAuthorityCodeException: EPSG:7843 +gie/epsg_no_grid.gie#5:0@e8e8d26c FAIL deviation 342373401.005551 mm, tolerance 0.100000 mm, metric EUCLIDEAN_METRES; got 6973614.297453476 3218179.823477198 +gie/geotiff_grids.gie#20:0@5956dc56 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: CrsTransformException: +grids=tests/test_vgrid_invalid_channel_type.tif: Unknown vertical grid: tests/test_vgrid_invalid_channel_type.tif. Resolution chain was chain[cached(classpath:proj-data/), cached(classpath:proj4j-data/grids/), cached(classpath:proj4/nad/)]; the working directory is deliberately not searched.) +gie/geotiff_grids.gie#21:0@bf069add VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: CrsTransformException: +grids=tests/test_vgrid_unsupported_byte.tif: Unknown vertical grid: tests/test_vgrid_unsupported_byte.tif. Resolution chain was chain[cached(classpath:proj-data/), cached(classpath:proj4j-data/grids/), cached(classpath:proj4/nad/)]; the working directory is deliberately not searched.) +gie/geotiff_grids.gie#39:0@5eccd76c FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: xyzgridshift +gie/geotiff_grids.gie#39:1@a77bfb98 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: xyzgridshift +gie/gridshift.gie#0:0@b368bf99 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno coord_transfm_outside_grid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/gridshift.gie#0:1@9c83fce3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#0:2@3e753fa2 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#0:3@b32a6f49 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#0:4@5a3ab249 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#1:0@58b2e3f0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#1:1@533e48c5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#1:2@917caf60 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#1:3@2828846d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:0@b25b8bab FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:1@7383d126 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:2@9d9f7749 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:3@54393782 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:4@d3eb3594 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:5@0423af86 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:6@09662880 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:7@753af8ea FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:8@ed59e7fb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:9@33ceb017 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:10@aecd16f9 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno coord_transfm_outside_grid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/gridshift.gie#2:11@833d426f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:12@87ee6a12 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:13@69845b35 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:14@f8ae42e9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#2:15@743b54a1 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno coord_transfm_outside_grid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/gridshift.gie#2:16@53f1b91b VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno coord_transfm_outside_grid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/gridshift.gie#3:0@5d8a8008 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:0@7b762bfb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:1@194a63c3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:2@fe18ca45 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:3@d2394076 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:4@31512fc5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:5@602e4003 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:6@644a50e6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:7@4b5cf4c9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#4:8@c1257c82 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#5:0@df306039 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#5:1@3edcd7e7 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#5:2@3df0e129 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#5:3@8eb6f939 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#6:0@708469df FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#6:1@598b523c FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#6:2@c9d88c65 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#6:3@8fed33a0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#7:0@3d36d665 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#7:1@556c4642 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#8:0@6a618544 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#8:1@fe5ef91f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#9:0@d5103581 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#9:1@7ec97e04 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#10:0@4898d8fb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#11:0@8071677f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#11:1@586f0c6a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/gridshift.gie#12:0@fc0531d2 FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: gridshift +gie/gridshift.gie#12:1@0638e3ee FAIL operation could not be created: NOT_IMPLEMENTED: InvalidValueException: Unknown projection: gridshift +gie/gridshift.gie#15:0@936db53e VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/gridshift.gie#16:0@b830a045 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: +proj=gridshift is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null)) +gie/more_builtins.gie#1:0@0f92fd3e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molodensky is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#1:1@0a805ccf FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molodensky is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#2:0@6da5c845 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molodensky is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#2:1@eea539d9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molodensky is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#3:0@8a6e28b0 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molodensky is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#3:1@b1b89e38 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molodensky is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#22:0@b0cfed7b VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno invalid_op_file_not_found_or_invalid: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: CrsTransformException: +grids=nonexistinggrid.gtx: Unknown vertical grid: nonexistinggrid.gtx. Resolution chain was chain[cached(classpath:proj-data/), cached(classpath:proj4j-data/grids/), cached(classpath:proj4/nad/)]; the working directory is deliberately not searched.) +gie/more_builtins.gie#28:0@8d6e00b5 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#29:0@440fb720 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#30:0@582b18d9 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#31:0@54c9153a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#32:0@bfdd296d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#32:1@d619235e FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#33:0@02885b06 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=helmert is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#39:0@a4189ae5 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno no_inverse_op: not matched; every named errno degenerates, see GieRunner] (NOT_IMPLEMENTED: InvalidValueException: Unknown projection: helmert) +gie/more_builtins.gie#40:0@ae9bc90d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molobadekas is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#40:1@aa887449 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=molobadekas is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#42:0@d0725fca FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geoc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#42:1@48860d17 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geoc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#42:2@be28dbdb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geoc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#42:3@8ade7fdb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geoc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#42:4@856aa66f FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geoc is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#47:0@e129e62a FAIL operation could not be created: NOT_IMPLEMENTED: +to_meter=2.0/0.2: PROJ accepts a num/den ratio, proj4j does not +gie/more_builtins.gie#53:0@045ab01a FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#53:1@cfb4de04 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#54:0@44d548ba FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#54:1@26b30c70 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#54:2@936cb02d FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#54:3@a168a129 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#54:4@ecccc3fc FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#54:5@86178e68 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=geogoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#59:0@4fc173d6 FAIL operation could not be created: NOT_IMPLEMENTED: +lon_wrap=180: proj4j does not implement this parameter, and PROJ 9.8.1 would have acted on it, so executing without it would produce a wrong answer rather than a skip +gie/more_builtins.gie#60:0@d53780eb FAIL operation could not be created: NOT_IMPLEMENTED: +proj=vertoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#60:1@a5497a80 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=vertoffset is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#62:0@4851bba3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=noop is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#62:1@f9925fc6 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=noop is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#62:2@f4ff92e3 FAIL operation could not be created: NOT_IMPLEMENTED: +proj=noop is a PROJ 9.8.1 operator but proj4j's Registry does not resolve it (it is either unregistered or, like alsk, apian and bacon, registered against the abstract Projection class, in which case Registry.getProjection returns null) +gie/more_builtins.gie#74:0@ad000cc1 VACUOUS_EXPECTED_FAILURE VACUOUS: the operation could not be created, so no conformance was demonstrated -- gie would have scored this a pass [errno no_inverse_op: not matched; every named errno degenerates, see GieRunner] (INVALID_DEFINITION: pipeline: PipelineDefinitionException: pipeline: inverse operation for step 1 (affine xoff=0.0 yoff=0.0 zoff=0.0 (singular: no inverse) +inv +omit_inv) is not available) +gie/nkg.gie#0:0@ad78e806 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_NKG_ETRF00" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#1:0@fb856f5e FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_DK" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#2:0@22e3be31 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_DK" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#3:0@936a2f93 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_DK" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#3:1@466c4eac FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_DK" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#4:0@2a230122 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NKG_ETRF14" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#4:1@4feb1a36 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NKG_ETRF14" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#5:0@9ea86a0f FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF14_TO_DK" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#5:1@c4cfa820 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF14_TO_DK" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#6:0@6ce6a297 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_EE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#7:0@5e4d3539 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_EE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#8:0@8d18b1d3 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_EE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#9:0@d8f12f18 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_FI" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#10:0@f100e836 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_FI_EUREF-FIN" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#11:0@0d3949ea FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_FI" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#12:0@6885dab1 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_FI" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#13:0@45ac5f2b FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_FI_EUREF-FIN" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#14:0@5aa23c23 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_LV" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#15:0@a6b304e5 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_LV" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#16:0@41ebfd6b FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_LV" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#17:0@86ec21d9 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_LT" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#18:0@baa0f9bd FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_LT" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#19:0@d5d90900 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_LT" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#20:0@0024b67d FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_NO" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#21:0@18a712cf FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_NO" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#22:0@31969039 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NO" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#22:1@074f8a62 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NO" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#22:2@f950cd19 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NO" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#23:0@297eefc3 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_SE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#24:0@5c55317a FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_SE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#25:0@6d4aa67c FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_SE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#25:1@840d8821 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_SE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database +gie/nkg.gie#25:2@869fdcd9 FAIL operation could not be created: NOT_IMPLEMENTED: "urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_SE" is an authority code or OGC URN, which proj_create() resolves through proj.db; proj4j has no operation database diff --git a/conformance/src/test/resources/gie-manifest.sha256 b/conformance/src/test/resources/gie-manifest.sha256 new file mode 100644 index 0000000..059a5c1 --- /dev/null +++ b/conformance/src/test/resources/gie-manifest.sha256 @@ -0,0 +1,151 @@ +# SHA-256 of every file vendored from PROJ 9.8.1 (f08fa86c478c4bbbf003b1ec751dd84aa6eca486) +# Generated by conformance/sync-upstream.sh. Do not edit by hand. +# Paths are relative to conformance/src/test/resources/. +f8dadc37e66aa93522db69adab57512dae389a8a9f950d78b17eeb7a7a170e52 gie/4D-API_cs2cs-style.gie +8d36a85bfe863726a44a3b794e6e74cf31365b1531921029d0692c8e160484a8 gie/DHDN_ETRS89.gie +f668775e81337cd9edb1ef12e8ee1dae1ddd523cc97488529f9ad30d01e12554 gie/GDA.gie +7aa0a221bce6c9c9c59efa76ba970ecc3b1871c043c595d5d7793c9b878ce1c7 gie/adams_hemi.gie +f9239e34461efc5aff3c61ee2b66be58e7ec8b5b071f7bc5b735f1dccc7bbccb gie/adams_ws1.gie +c27a04e904c170f7c28ee788baae1cf296ae5bb5549df77bc80a8145d86e4ae3 gie/adams_ws2.gie +548e2840680743f50c33f7bed1c2e7fac021d323e9da37afcb8cab321299cae8 gie/axisswap.gie +42dc4e6c7350fad4319bb1d05759b63e880f98488a79664d434325d20bc5f6c0 gie/builtins.gie +fda8a079bb8dfed6e9ea8ee59a920956124f0aa2340d1690f2325a7b92afab7a gie/defmodel.gie +146ceccd1b52a729140747477f655601967a974a0a00f719177db99cc4125b6b gie/deformation.gie +872ba0642e60e768747b4f05c698aebe9dfd2592373e1819569939d0a20bbcc7 gie/ellipsoid.gie +84a9f66348653591a11e8530ee53d00b35172b5579030b9ba23a549d2e95dfda gie/epsg_grid.gie +acec30144b59cdda117572957deb9b3118b764edf429570c305af2e94bc0571b gie/epsg_no_grid.gie +761098390fba31baf6bd3a0b407e3dbea84d0539a3d9773119c8e91dca796767 gie/geotiff_grids.gie +30b05da575096cd87ea7fd7abe59917657723c198ec5c9d3d11d9a9cfb10ba61 gie/gridshift.gie +369632eb538a99d441416ccd7e67aa2fbb2a3495ba289768546f5f2ff65a7a5b gie/guyou.gie +dfeba186a32cabbbd0d0b920afc7599a97dfda7292f9c6cab2b12254f7d00436 gie/more_builtins.gie +4656e0aeb7210f47d6fa07e4aeef900cf2f7b0d5e01871215dcbe81a216d9ba6 gie/nkg.gie +6f2042ebde75b99aadcc7e855f7df352de4f716f224ca4c8981c0dac6cd3956d gie/peirce_q.gie +97fba8885c2ecf0cdee8a0be7ef7d6cbb89398e06e29a271fc2753364160e441 gie/spilhaus.gie +40b30865b41e45b18420c61924f1e3acbf68257669c172370ec7b5be44b50f65 gie/tinshift.gie +9bfd7234dcbcf89fda5e1d14f9dc2868d4b0bafa5b57949a5563db8ee0c8edb6 gie/unitconvert.gie +d8b846785f7296b645930965f6a98b7db281aa4886932e394ef74e5113a25f93 gigs/5101.1-jhs.gie +7adbc5f7d917e9aa59d8f9c7e8f461ad5b6f5a44dc2bf1d12d4335c92526090e gigs/5101.2-jhs.gie +d704934c063a0d0faf048fb3326fe0b1a5735cad6aba1327e8072a54b6514713 gigs/5101.3-jhs.gie +da58fb5a83b89738e63b85eb3ff05386655911134d09986abc6df6573b38690b gigs/5101.4-jhs-etmerc.gie +3d8ae7b438ee9d422dfe92ee8b4b6108d6cc1cb6dbbe2aabe9fd0f911c52064a gigs/5101.4-jhs.gie.failing +fc22845f91bd0b38118c63557cce8a06514150f37098e16e1f70a3dbb027df15 gigs/5102.1.gie +8781dc93eac659fcad3fb050cb5ec233b6b5917a73cfcf110b7445b2ffff2462 gigs/5102.2.gie +26da64cab464e14094c703c6dac5fab7105c4ef1a248e641fa72e0aa975ed3ec gigs/5103.1.gie +4fc4bde33ffac310eac6d72ff90ec6e0bc8f1bdff76d534666cbf9f8faa91cdb gigs/5103.2.gie +91c602b453fe13eb58a51328aaa7f181e98565b22ba102339f3d845efb4e8122 gigs/5103.3.gie +34b76e01ef82c1949a82f1e17f1d02adbb145b33a310c7153d745635327333dd gigs/5104.gie +6f7d921793d18b47fb2e504a649f9c32e447caefee46d27a1ad89c1887853290 gigs/5105.1.gie.failing +65711cbeecbf19a256710becef2901a71348cd75f1b83c9370082344600a4fa7 gigs/5105.2.gie +c177e2c21fcc6753e719d321943cc782eccce138f7c7ee17881bf606d51d12c9 gigs/5106.gie +3fbac9f4b0cb06077e8fc78927a407d33861f6ccd027f19eb564cf29133fd3ba gigs/5107.gie +7087fe4e25b3b4563ab919d8c5936eca9c9e9705586e430c96fe9befb07b43ed gigs/5108.gie +7f636b46eece70a5f915312182d076a6b5393840155210cf6a4803f976536085 gigs/5109.gie +d76c6dd16962b84549b06d0c77a77648b129d3c50d6f80ea409bbe9fc1400e99 gigs/5110.gie.failing +178677034c878f6f376e9a845cf0719ebd6ef9de20210666c5e7e3b9e270a268 gigs/5111.1.gie +029005a8096875660fd9498dd53e864eda59725fb7c64dede689ce6709725360 gigs/5111.2.gie.failing +6fab5883ae4d8b44905675b5a15ac94125b47f9113378a4defd35796ce76389c gigs/5112.gie +2ac643229efc28a2aa0b9ce220300922e91f372ae1700014def7151ade143b64 gigs/5113.gie +3ef6e51f56ba943e7bf9ffdb58f1c6c2f942d9d0b7b33ce8664bdc7dc99b9d52 gigs/5201.gie +16a85cf50cd78ca6be9feb279ed5ada63e62588db8792d2b5f007d63a8c21da2 gigs/5203.1.gie.failing +1aa876a40d602578efa3faba765e76b3f3416ec76f403895c07c12e4cf9b9453 gigs/5204.1.gie.failing +3e807277682433fdd0043c10c973c22cd6b1308f6eb2b82c5c7d7f085356ccba gigs/5205.1.gie.failing +5f70022ad555eaa75a777e11416aba6fd094730d137c0b9f3af83d3e3d3042e7 gigs/5206.gie.failing +a4d64b2f07b7ac305bedb79601a3e1af2a4beaf72d4cbd3d8393a00f21e9cd0d gigs/5207.1.gie.failing +be474652320cf5d235f0d324c763b11241c85c9554fd9ccd145dba71d4c4c0e0 gigs/5207.2.gie.failing +6cacd13226f379a57b4bd2dd639d2d3a6f2de3035bd285ca5bca839824ab0679 gigs/5208.gie +6588e7b5fcca7dfad848085b7b621bf4b2e73866a0af3c459daa955deaacc3da proj-data/BETA2007.gsb +85375e6315d6f644e4577dadf3c5f157528ad15b715c99b287bddab23d44193d proj-data/GL27 +5225c3b3367a37021e639cfd5bd1521d2bd5d00cbc474cd6b3b3827615a4fe72 proj-data/ITRF2000 +ffc2ae69c38e085ba1f4333cc451e1ba7d596f9168093b459e7d349ac7714531 proj-data/MD +556f12c1c576ac61604f7995b45edef2c6eb8900dff92c798bc09ba6eeb50f30 proj-data/alaska +504d184f9a9f6e6c6b76df753346fd236b74772f52a8a5c90d8a43d3651d274d proj-data/conus +504d184f9a9f6e6c6b76df753346fd236b74772f52a8a5c90d8a43d3651d274d proj-data/dir with space/myconus +d04f9af2e817e1b4db3a244f6c2fcfbb1b191e6c8ef470fc687cf1fb6f374e39 proj-data/egm96_15.gtx +0bc231922461ac758922c6a7251e96d7e53e656608b1b4f06b7848fa8fc25520 proj-data/nad27 +9a6260c8680abe5216ca8fe985998fababc121b0032879a821d75cae3411dc96 proj-data/nad83 +08734dadf9158ceeee3590120a26710f4abcdacb7ecde2782370b1919fc19db2 proj-data/ntf_r93.gsb +f27846eca0787c239e69c4c3be6aaf9deef1279e5fefbd9cad25848994e3745a proj-data/ntv1_can.dat +adf5357f48a3cc8374b89ed5e1ed6bc9b361f1b5e839e5a741fd47946777d027 proj-data/ntv2_0.gsb +b95ebf0d007339244483d65d571cd887a51806e2bd2c1ab7f47b897d25320d65 proj-data/proj.ini +6588e7b5fcca7dfad848085b7b621bf4b2e73866a0af3c459daa955deaacc3da proj-data/tests/BETA2007.gsb +ffc2ae69c38e085ba1f4333cc451e1ba7d596f9168093b459e7d349ac7714531 proj-data/tests/MD +556f12c1c576ac61604f7995b45edef2c6eb8900dff92c798bc09ba6eeb50f30 proj-data/tests/alaska +504d184f9a9f6e6c6b76df753346fd236b74772f52a8a5c90d8a43d3651d274d proj-data/tests/conus +d04f9af2e817e1b4db3a244f6c2fcfbb1b191e6c8ef470fc687cf1fb6f374e39 proj-data/tests/egm96_15_downsampled.gtx +e1de817a45e0fbcb478f8a940bcf21ee789ffc0a73cdad306b40df05b870d35a proj-data/tests/egm96_15_uncompressed_truncated.tif +5984c1565e9a65b88d5608c7bd3cdbf39f7f13c84b453e1984feab56384d1baa proj-data/tests/fr_ign_RAGTBT2016.tif +516f686a50b884a45250882eb9ba48e87a717309c16441885a2107f11799cc81 proj-data/tests/nkgrf03vel_realigned_extract.tif +f232c7fa265a0231c4ef07192893ed2e496da02cb39208c57e53391e7b4d06e6 proj-data/tests/nkgrf03vel_realigned_extract_tiled_256x256.tif +78cb8c753553cdc5287be73d2a7fa429546a0e0f9057229dcc9141517123893b proj-data/tests/nkgrf03vel_realigned_xy_extract.ct2 +ab830eab6d81ed7a00dc7116268ee01fa50896ec2a569f96e117f280e223ad6f proj-data/tests/nkgrf03vel_realigned_z_extract.gtx +08734dadf9158ceeee3590120a26710f4abcdacb7ecde2782370b1919fc19db2 proj-data/tests/ntf_r93.gsb +f27846eca0787c239e69c4c3be6aaf9deef1279e5fefbd9cad25848994e3745a proj-data/tests/ntv1_can.dat +adf5357f48a3cc8374b89ed5e1ed6bc9b361f1b5e839e5a741fd47946777d027 proj-data/tests/ntv2_0_downsampled.gsb +8db7a31ad0f3153475186335e4599fa08f0bfbe7e32dbae0bb58cbc5bb4ff293 proj-data/tests/simple_model_degree_3d.json +8112e3a86f36153074289e6113f71f47bed5dd1e0069ae523f0a0275e95cfd57 proj-data/tests/simple_model_degree_3d_grid.tif +37a9279fc68be2dbf4cc477dcab2cca18a94b39863de951145f4132118489401 proj-data/tests/simple_model_degree_horizontal.json +5a1a3245a220887096f2c2c0993e7d54f97ba5e9d84c67b2caf168f92035c2ae proj-data/tests/simple_model_metre_3d.json +87371b469e14a7b715d99ff8b5e1fd65d0fa1f9325def029c9d339b35214a7ac proj-data/tests/simple_model_metre_3d_geocentric.json +c769a3c4a3c6bfa707333049fbea2001dfa4b9fd9a332a923e40ff6ffc044078 proj-data/tests/simple_model_metre_3d_grid.tif +d6e4e794924306a2a0abda299679a1c30069ae05c8dfcb669a56da5e32dd4d86 proj-data/tests/simple_model_metre_horizontal.json +a4e7b1dd2f82f1bdbae00b4356716745edda7df6408bee739f5dd509cbcf15cd proj-data/tests/simple_model_metre_vertical.json +b0071ccd366edf3acb026b61830a6d6d1a241cca425c3271e323768f265e9a0f proj-data/tests/simple_model_metre_vertical_grid.tif +22516189a6d5646eaebb253280f2c3e9e5aa70db7059b872fa29b52b96a54114 proj-data/tests/simple_model_polar.json +cc7ef07652adcc333631d063121fda4d802c22be7ee18ce675c33333bd85564e proj-data/tests/simple_model_polar.tif +be6f1104e088689bb7676f4ca216b1c131a47ed6a4b90493fb23688c8d880145 proj-data/tests/simple_model_projected.json +ceb96f3b23df40afecf156dbdc7a2f1334a0667f3294ab2737cd281ff8f80e85 proj-data/tests/simple_model_wrap_east.json +e5a85f9bb88469934715e4cc1c79279a0e3382588e6d8fb3e7f5eadeaa151b8d proj-data/tests/simple_model_wrap_east.tif +8307d334fa58dac8fe363700b4d2a3467edaf9884004c8a39a1870f0c5eda198 proj-data/tests/simple_model_wrap_west.json +925b92ece7c54d1ee1428775567edde4a72bf0a67a7f48935dbf5209d4aebf5a proj-data/tests/simple_model_wrap_west.tif +e503665e33f19d2f5394fbaf7670c40971471695db81bba7552a8c43de2e2353 proj-data/tests/subset_of_gr3df97a.tif +d6a371b892f6a9265e7aa9e585357ba72b8e932f752bc4ed4490f90e35c1edc7 proj-data/tests/test_3d_grid_projected.tif +ea07142108a526863d82e4c829d7f2898ed1c71511e5ec474e488850cc74fbdc proj-data/tests/test_gridshift_projected.tif +da8b51010ca0ed774ab718b8b5367242491c3c76e73659bbb653fa069cac0f51 proj-data/tests/test_hgrid.tif +ecf003c4f9452144c6394d2d2b098f8a249ca06c6b9e4e8a67334c1bdcdc7915 proj-data/tests/test_hgrid_big_endian.gsb +b52ed85b7e0f1a9e7e54182882f641bb67823bd9700e799dc4d42104ef5d1e0b proj-data/tests/test_hgrid_degree.tif +f0ff8c871116e0028d091f4deb4fed26edec6e519df948b91aa6cfd54a7b33db proj-data/tests/test_hgrid_extra_ifd_with_other_info.tif +32553c6c770fadb392e2607aeef91a9c320fd5bddc01fe778c0f23001524860b proj-data/tests/test_hgrid_little_endian.gsb +95a29e0d3f2dc1b81febb082c764d799d528627333ed2db6c88a683016b46b27 proj-data/tests/test_hgrid_lon_shift_first.tif +25584e7a2e31e24163bdb242de216632ca0874e44e83b77c5c9c93e809b2d4e8 proj-data/tests/test_hgrid_positive_west.tif +34267c105e77fc7aad7bf73fefe236b002c0df5dfbabf04b1b16d047c2e2b52e proj-data/tests/test_hgrid_radian.tif +2acea51124c4c15b1faff61fa88a6c89cfb0f38c7d7b0e98d6afc30016d555e5 proj-data/tests/test_hgrid_separate.tif +4d31d43fdc38abc6321d77b21812c23a90aeea69ddd3482a2a81906896beae02 proj-data/tests/test_hgrid_strip.tif +8ba7e11f4341b23b9b92b611b5623b2cc2da3d317b0c238a9b0b06a21bf57091 proj-data/tests/test_hgrid_tiled.tif +ac2b2db755f8ff90c8bbebeda85e135386378c9a936b4610b987123cf960c1ff proj-data/tests/test_hgrid_tiled_separate.tif +420b716ac9e077b5fb3e0395c684afe09cd81e3cd9eaf19a4841f18278614480 proj-data/tests/test_hgrid_with_overview.tif +34764736a483a96f9762d238640f8ef712c1970b9cdaca6a875a9f86cca7b877 proj-data/tests/test_hgrid_with_subgrid.tif +ff8b40f3a1ab574e0b9e4a538144f81e235cad62a9ebc9127185853d7294ab53 proj-data/tests/test_hgrid_with_subgrid_no_grid_name.tif +0db46a29e11368a10bde261f28a9145cf6abf5ac23d64b0799d124d7c2b3d3af proj-data/tests/test_hgrid_with_two_level_of_subgrids_no_grid_name.tif +46b6adc1e47f9f5516ca6eaee9dede57ccd3edb89a93555cbca972d3b2cfe698 proj-data/tests/test_hydroid_height.tif +0e4aafe35c425fa0651dac2531ace71daec5e4d0026ed31a93982b9f71af2bb6 proj-data/tests/test_nodata.gtx +9c3cd3077b049d56033cf013be47adc9443f88bf6656aad798e2d0f97572e525 proj-data/tests/test_vgrid_bigendian.tif +9d7e32efa8896743495206d999e4ef894fe870b5935b8879bf24629d980b7f1e proj-data/tests/test_vgrid_bigendian_bigtiff.tif +93c2e2dfab4ce5e223bc5e809a3a013693e0f6ed1158b6decd83927b7f47787f proj-data/tests/test_vgrid_bigtiff.tif +9c5f270150b4b18cb5ea0062133407ed7a0e822e9573e734f7bb48f2b4ab6741 proj-data/tests/test_vgrid_bottomup_with_matrix.tif +eaab7fb3ff118ddf3a2d624ce062b62b13832683496527a3e0c63ef3c7c80712 proj-data/tests/test_vgrid_bottomup_with_scale.tif +7ac1c98525b1e14e99973681682d0c29f498c369e01ad4a0c0c1f5bb1989eba5 proj-data/tests/test_vgrid_deflate.tif +06213949c378323f759afd79cf6f3b1905a283030c8eb142f93f5a31c2350dba proj-data/tests/test_vgrid_deflate_floatingpointpredictor.tif +1620e77207190e0c5ff37cf14751ce8bb38643b5d125a12d349f63bc9335ff52 proj-data/tests/test_vgrid_float64.tif +80029139e2b6796625f64a360f0b656fff9e83b4f9b9d37cc9f3667b522c1b00 proj-data/tests/test_vgrid_in_second_channel.tif +111256399bb05e5e8093563f76ab97f495da6919574eb6ad8b5d211982e927d5 proj-data/tests/test_vgrid_int16.tif +da471d8bbc33a8628d83a3445f2fdd39766a90e09e4af81a8032664e4d61ba3b proj-data/tests/test_vgrid_int32.tif +a0115321ea0f011803ac3214769baae7cc840213a7243e1a5ef7c17969a1dfec proj-data/tests/test_vgrid_invalid_channel_type.tif +43754e797794663bdf977ac81e6cb0b6248f76e7574e8caa8177d2d13f288d90 proj-data/tests/test_vgrid_nodata.tif +9c184492fe90eaff5581b621fd76b46de499371e1b0b72e82f173f5f95227840 proj-data/tests/test_vgrid_pixelisarea.tif +e705233b3d27f3df32163c0ec39f310c1390c0aad67427f638c3a7eaf748b13f proj-data/tests/test_vgrid_pixelispoint.tif +5e3568fa61d7fd9e80055d69da9c25b5795ac3517151ab6df1a47df892485c92 proj-data/tests/test_vgrid_single_strip_truncated.tif +40d525cb640d8ae71ca3b831fc4c9fce14d6341ccc8bc8be0ab1698cc69ff11f proj-data/tests/test_vgrid_uint16.tif +d90a40dfcfeef957b2f71bd08e711bbc6a57ddcbe0f27b84043706ff7bbdac24 proj-data/tests/test_vgrid_uint16_with_scale_offset.tif +ab0bc9dbbe9bfd3c52fc50789e8184bf40da921e6524f306eaa7b6e9436bad09 proj-data/tests/test_vgrid_uint32.tif +c9a5dfdb66151617bb9766c3e83c5e8f7f357036e25b33b3ca5540447a183d5c proj-data/tests/test_vgrid_unsupported_byte.tif +c3de78e99ae5d3c7f4891eeaf4191165c7d2017c51ade53befe90dc33d6e212d proj-data/tests/test_vgrid_with_overview.tif +76a44727f8a8fe0d34baaba4605062c7cdc25ad4c57e27c6b94b76c7eaa962e8 proj-data/tests/test_vgrid_with_subgrid.tif +64d5b122c77d921aefa8e28f2dd1090f804e28f65ebe824fdd1130e7972681b3 proj-data/tests/tinshift_crs_implicit.json +6b9c3096950be990c95273b0a23f1ff4ac91b084c043b565f2ea87d8360c3666 proj-data/tests/tinshift_fallback_nearest_centroid.json +0e2bd5b911655aeb8d3aef1dc468b4cba5e34836bfd11778e1a95ef54709653f proj-data/tests/tinshift_fallback_nearest_side.json +220a3eadc80f24aacbed30e6a3e86a8c9def0f1424763f9409461238ec0e4cd4 proj-data/tests/tinshift_simplified_kkj_etrs.json +732822e707428a22df2a847fc6d7095d13cdbfb4ef415cceed496a9a1c8982af proj-data/tests/tinshift_simplified_n60_n2000.json +10b25d2e7589ed57ccce033a1a8e3fd08f3386547826ac51ae7c30b140fe6b51 proj-data/tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif +76be03b6f9b5b60027312d18704b1a94aeb1ced6fa7ec6dbf1b5874d7e9cefae proj-data/tests/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif +d311b0f11b4b2dbbd133430c980d323498e00382ca715c9465fbb196b7f6576a proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif +4d3cebadcc92369b48a3ce6c1855bcbd7bff71d82340cc129bbcacaceb6cb4c0 proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif diff --git a/conformance/src/test/resources/gie/4D-API_cs2cs-style.gie b/conformance/src/test/resources/gie/4D-API_cs2cs-style.gie new file mode 100644 index 0000000..1b0c154 --- /dev/null +++ b/conformance/src/test/resources/gie/4D-API_cs2cs-style.gie @@ -0,0 +1,560 @@ + +------------------------------------------------------------------------------- +=============================================================================== + +Test the 4D API handling of cs2cs style transformation options. + +These tests are mostly based on the same material as those in +more_builtins.gie, since we are testing the same kinds of things, +but provided through a different interface. + +=============================================================================== + + + + +------------------------------------------------------------------------------- +# Test the handling of the +towgs84 parameter. +------------------------------------------------------------------------------- +# (additional tests of the towgs84 handling can be found in DHDN_ETRS89.gie) +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# This example is from Lotti Jivall: "Simplified transformations from +# ITRF2008/IGS08 to ETRS89 for maritime applications" (see also more_builtins.gie) +------------------------------------------------------------------------------- +operation proj=geocent \ + towgs84 = 0.676780, 0.654950, -0.528270, \ + -0.022742, 0.012667, 0.022704, \ + -0.01070 +------------------------------------------------------------------------------- +tolerance 1 um + +direction inverse + +# Broken test. FIXME +#accept 3565285.00000000 855949.00000000 5201383.00000000 +#expect 3565285.41342351 855948.67986759 5201382.72939791 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# This example is a random point, transformed from ED50 to ETRS89 using KMStrans2. +------------------------------------------------------------------------------- +operation proj=latlong ellps=intl \ + towgs84 = -081.07030, -089.36030, -115.75260, \ + 000.48488, 000.02436, 000.41321, -0.540645 +------------------------------------------------------------------------------- +tolerance 25 mm + +accept 16.82 55.17 61.0 +expect 16.8210462130 55.1705688946 29.0317 +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +operation proj=latlong nadgrids=ntf_r93.gsb ellps=GRS80 +------------------------------------------------------------------------------- +# This functionality is also tested in more_builtins.gie +------------------------------------------------------------------------------- +tolerance 1 mm +accept 2.25 46.5 +expect 2.250704350387 46.500051597273 +direction inverse +accept 2.250704350387 46.500051597273 +expect 2.25 46.5 +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +operation proj=latlong geoidgrids=egm96_15.gtx ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 15 cm # lax tolerance due to widespread bad egm96 file + +accept 12.5 55.5 0 +expect 12.5 55.5 -36.3941 + +direction inverse + +accept 12.5 55.5 -36.3941 +expect 12.5 55.5 0 +------------------------------------------------------------------------------- +operation proj=merc geoidgrids=egm96_15.gtx ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 12.5 55.5 0 +expect 1391493.63492 7424275.19462 -36.3941 +direction inverse +accept 1391493.63492 7424275.19462 -36.3941 +expect 12.5 55.5 0 +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +# Same as the two above, but also do axis swapping. +------------------------------------------------------------------------------- +# NOTE: A number of the tests below are commented out. The actually do the +# right thing, but the gie distance computation is not yet able to cope +# with "unusual" axis orders +------------------------------------------------------------------------------- +operation proj=latlong geoidgrids=egm96_15.gtx axis=neu ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 15 cm # lax tolerance due to widely distributed, bad egm96 file +# Broken test. FIXME +#accept 12.5 55.5 0 +#expect 55.5 12.5 -36.3941 +#direction inverse +#accept 55.5 12.5 -36.3941 +#expect 12.5 55.5 0 +------------------------------------------------------------------------------- +operation proj=latlong geoidgrids=egm96_15.gtx axis=dne ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 15 cm # lax tolerance due to widely distributed, bad egm96 file +# accept 12.5 55.5 0 +# expect 36.3941 55.5 12.5 +# direction inverse +# accept 36.3941 55.5 12.5 +# expect 12.5 55.5 0 +------------------------------------------------------------------------------- +operation proj=merc geoidgrids=egm96_15.gtx ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 12.5 55.5 0 +expect 1391493.63492 7424275.19462 -36.3941 +direction inverse +accept 1391493.63492 7424275.19462 -36.3941 +expect 12.5 55.5 0 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Some more complex axis swapping. +------------------------------------------------------------------------------- +operation proj=latlong geoidgrids=egm96_15.gtx axis=nue ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 15 cm # lax tolerance due to widely distributed, bad egm96 file +# Broken test. FIXME +#accept 12.5 55.5 0 +#expect 55.5 -36.3941 12.5 +# direction inverse +# accept 55.5 -36.3941 12.5 +# expect 12.5 55.5 0 +------------------------------------------------------------------------------- +operation proj=merc geoidgrids=egm96_15.gtx axis=sue ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 15 cm +accept 12.5 55.5 0 +expect -7424275.1946 -36.3941 1391493.6349 0.0000 +# direction inverse +# accept -7424275.1946 -36.3941 1391493.6349 0.0000 +# expect 12.5 55.5 0 +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +# A test case from a comment by Github user c0nk +------------------------------------------------------------------------------- +operation proj=somerc \ + lat_0=46.95240555555556 lon_0=7.439583333333333 k_0=1 \ + x_0=2600000 y_0=1200000 ellps=bessel \ + towgs84=674.374,15.056,405.346 +------------------------------------------------------------------------------- +tolerance 20 cm +accept 7.438632495 46.951082877 +expect 2600000.0 1200000.0 +------------------------------------------------------------------------------- +# Same test, but now implemented as a pipeline. This is for testing a nasty bug, +# where, at the end of pipeline creation, a false warning about missing ellps was +# left behind from the creation of the Helmert step (now repaired in pj_init). +------------------------------------------------------------------------------- +operation proj=pipeline \ + step proj=cart ellps=WGS84 \ + step proj=helmert x=674.37400 y=15.05600 z=405.34600 inv \ + step proj=cart ellps=bessel inv \ + step proj=somerc lat_0=46.95240555555556 lon_0=7.439583333333333 \ + k_0=1 x_0=2600000 y_0=1200000 ellps=bessel units=m +------------------------------------------------------------------------------- +tolerance 20 cm +accept 7.438632495 46.951082877 0 +expect 2600000.0 1200000.0 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Make sure that transient errors are returned correctly. +------------------------------------------------------------------------------- +operation +proj=geos +lon_0=0.00 +lat_0=0.00 +a=6378169.00 +b=6356583.80 +h=35785831.0 +------------------------------------------------------------------------------- +accept 85.05493299 46.5261074 +expect failure + +accept 85.05493299 46.5261074 0 +expect failure + +accept 85.05493299 46.5261074 0 0 +expect failure + +------------------------------------------------------------------------------- +# Test that Google's Web Mercator works as intended (see #834 for details). +------------------------------------------------------------------------------- +use_proj4_init_rules true +operation proj=pipeline step init=epsg:26915 inv step init=epsg:3857 +------------------------------------------------------------------------------- +tolerance 20 cm +accept 487147.594520173 4934316.46263998 +expect -10370728.80 5552839.74 + +accept 487147.594520173 4934316.46263998 0 +expect -10370728.80 5552839.74 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test Google's Web Mercator with +proj=webmerc +ellps=WGS84 +------------------------------------------------------------------------------- +use_proj4_init_rules true +operation proj=pipeline step init=epsg:26915 inv step proj=webmerc datum=WGS84 +------------------------------------------------------------------------------- +tolerance 20 cm +accept 487147.594520173 4934316.46263998 +expect -10370728.80 5552839.74 + +accept 487147.594520173 4934316.46263998 0 +expect -10370728.80 5552839.74 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Web Mercator test data from EPSG Guidance Note 7-2, p. 44. +------------------------------------------------------------------------------- +operation proj=webmerc +ellps=WGS84 +tolerance 1 cm + +accept -100.33333333 24.46358028 +expect -11169055.58 2810000.00 + +accept -100.33333333 24.38178694 +expect -11169055.58 2800000.00 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test that +datum parameters are handled correctly in pipelines. +# See #872 for details. +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=longlat +datum=GGRS87 +inv \ + +step +proj=longlat +datum=WGS84 +------------------------------------------------------------------------------- +tolerance 20 cm +accept 23.7275 37.9838 0 +expect 23.729194873180 37.986398897578 31.289740102 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Test that +towgs84=0,0,0 parameter is handled as still implying cart +# transformation +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=utm +zone=11 +ellps=clrk66 +towgs84=0,0,0 +inv \ + +step +proj=utm +zone=11 +datum=WGS84 + +------------------------------------------------------------------------------- +tolerance 20 cm +accept 440720 3751320 0 +expect 440719.958709357 3751294.2109841 -4.44340920541435 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test that pipelines with unit mismatch between steps can't be constructed. +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=merc \ + +step +proj=merc +expect failure pjd_err_malformed_pipeline + +operation +proj=pipeline \ + +step +proj=latlong \ + +step +proj=merc \ + +step +proj=helmert +x=200 +y=100 +expect failure pjd_err_malformed_pipeline + +operation +proj=pipeline \ + +step +proj=merc +ellps=WGS84 \ + +step +proj=unitconvert +xy_in=m +xy_out=km +accept 12 56 +expect 1335.8339 7522.963 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test invalid pipelines +------------------------------------------------------------------------------- +# proj= before first step +operation +proj=pipeline +proj=merc +step +inv +proj=merc +expect failure pjd_err_malformed_pipeline + +# o_proj= before first step +operation +proj=pipeline +o_proj=merc +step +proj=ob_tran +expect failure pjd_err_malformed_pipeline + +# nested pipeline +operation +proj=pipeline +step +proj=pipeline +step +proj=merc +expect failure pjd_err_malformed_pipeline + +------------------------------------------------------------------------------- +# Test Pipeline Coordinate Stack +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=push +v_1 \ + +step +proj=utm +zone=32 \ + +step +proj=utm +zone=33 +inv \ + +step +proj=pop +v_1 + +accept 12 56 0 2020 +expect 12 56 0 2020 +roundtrip 10 + +operation +proj=pipeline \ + +step +proj=latlon \ # dummy step + +step +proj=push +v_1 \ + +step +proj=utm +zone=32 \ + +step +proj=utm +zone=33 +inv \ + +step +proj=pop +v_1 \ + +step +proj=affine # dummy step + +accept 12 56 0 2020 +expect 12 56 0 2020 +roundtrip 10 + +# push value to stack without popping it again +operation +proj=pipeline \ + +step +proj=push +v_1 \ + +step +proj=utm +zone=32 \ + +step +proj=utm +zone=33 +inv + +accept 12 56 0 2020 +expect 18 56 0 2020 + +# test that multiple pushes and pops works +operation +proj=pipeline \ + +step +proj=push +v_1 \ + +step +proj=utm +zone=32 \ + +step +proj=push +v_1 \ + +step +proj=utm +zone=33 +inv \ + +step +proj=utm +zone=34 \ + +step +proj=pop +v_1 \ + +step +proj=utm +zone=32 +inv \ + +step +proj=pop +v_1 + +accept 12 56 0 2020 +expect 12 56 0 2020 + +# pop from empty stack +operation +proj=pipeline \ + +step +proj=utm +zone=32 \ + +step +proj=utm +zone=33 +inv \ + +step +proj=pop +v_1 + +accept 12 56 0 2020 +expect 18 56 0 2020 + +operation +proj=pipeline \ + +step +proj=push +v_2 \ + +step +inv +proj=eqearth \ + +step +proj=laea \ + +step +proj=pop +v_2 + +accept 900000 6000000 0 2020 +expect 896633.0226 6000000 0 2020 + +# Datum shift in cartesian space but keeping the height +# (simulates a datum-shift with affin since ISO19111 code +# currently obfuscates proj-strings using cart/helmert/invcart) +operation +proj=pipeline +ellps=GRS80 \ + +step +proj=push +v_3 \ + +step +proj=cart \ + +step +proj=affine +xoff=1000 +yoff=2000 +xoff=3000 \ + +step +proj=cart +inv \ + +step +proj=pop +v_3 +tolerance 50 cm + +accept 12 56 0 +expect 12.0280112877 55.9896187413 0 +roundtrip 1 + +operation +proj=push +v_3 +accept 12 56 0 0 +expect 12 56 0 0 + +operation +proj=pop +v_3 +accept 12 56 0 0 +expect 12 56 0 0 + +------------------------------------------------------------------------------- +# Test Pipeline +omit_inv +------------------------------------------------------------------------------- + +operation +proj=pipeline +step +proj=affine +xoff=1 +yoff=1 +omit_inv + +accept 2 49 0 0 +expect 3 50 0 0 + +direction inverse +accept 2 49 0 0 +expect 2 49 0 0 + + +operation +proj=pipeline +step +inv +proj=affine +xoff=1 +yoff=1 +omit_inv + +accept 2 49 0 0 +expect 1 48 0 0 + +direction inverse +accept 2 49 0 0 +expect 2 49 0 0 + +------------------------------------------------------------------------------- +# Test Pipeline +omit_fwd +------------------------------------------------------------------------------- + +operation +proj=pipeline +step +proj=affine +xoff=1 +yoff=1 +omit_fwd + +accept 2 49 0 0 +expect 2 49 0 0 + +direction inverse +accept 2 49 0 0 +expect 1 48 0 0 + + +operation +proj=pipeline +step +inv +proj=affine +xoff=1 +yoff=1 +omit_fwd + +accept 2 49 0 0 +expect 2 49 0 0 + +direction inverse +accept 2 49 0 0 +expect 3 50 0 0 + +------------------------------------------------------------------------------- +# Test bugfix of https://github.com/OSGeo/proj.4/issues/1002 +# (do not interpolate nodata values) +------------------------------------------------------------------------------- +operation +proj=latlong +ellps=WGS84 +geoidgrids=tests/test_nodata.gtx +------------------------------------------------------------------------------- +accept 4.05 52.1 0 +expect 4.05 52.1 -10 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test null grid with vgridshift +------------------------------------------------------------------------------- +operation proj=vgridshift grids=tests/test_nodata.gtx,null ellps=GRS80 +------------------------------------------------------------------------------- +accept 4.05 52.1 0 +expect 4.05 52.1 -10 + +# Outside validity area of test_nodata.gtx. Fallback on null +accept 4.05 -52.1 0 +expect 4.05 -52.1 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test bug fix of https://github.com/OSGeo/proj.4/issues/1025. +# Using geocent in the new API with a custom ellipsoid should return coordinates +# that correspond to that particular ellipsoid and not WGS84 as demonstrated in +# the bug report. +------------------------------------------------------------------------------- +operation +proj=pipeline +step \ + +proj=longlat +a=3396190 +b=3376200 +inv +step \ + +proj=geocent +a=3396190 +b=3376200 +lon_0=0 +units=m +accept 0.0 0.0 0.0 +expect 3396190.0 0.0 0.0 +roundtrip 1 + +operation +proj=geocent +a=3396190 +b=3376200 +lon_0=0 +units=m +accept 0.0 0.0 0.00 +expect 3396190.0 0.0 0.0 +roundtrip 1 + + +------------------------------------------------------------------------------- +# Check that geocent and cart take into account to_meter (#1053) +------------------------------------------------------------------------------- + +operation +proj=geocent +a=1000 +b=1000 +to_meter=1000 +accept 90 0 0 +expect 0 1 0 +roundtrip 1 + +operation +proj=cart +a=1000 +b=1000 +to_meter=1000 +accept 90 0 0 +expect 0 1 0 +roundtrip 1 + +------------------------------------------------------------------------------- +# Check that vunits / vto_meter is honored +------------------------------------------------------------------------------- + +operation +proj=longlat +a=1 +b=1 +vto_meter=1000 +accept 0 0 1000 +expect 0 0 1 +roundtrip 1 + +operation +proj=longlat +a=1 +b=1 +vto_meter=2000/2 +accept 0 0 1000 +expect 0 0 1 +roundtrip 1 + +operation +proj=longlat +a=1 +b=1 +vto_meter=1/0 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=longlat +a=1 +b=1 +vto_meter=1000 +geoc +accept 0 0 1000 +expect 0 0 1 +roundtrip 1 + +operation +proj=longlat +a=1 +b=1 +vunits=km +accept 0 0 1000 +expect 0 0 1 +roundtrip 1 + +operation +proj=merc +a=1 +b=1 +vto_meter=1000 +accept 0 0 1000 +expect 0 0 1 +roundtrip 1 + +operation +proj=merc +a=1 +b=1 +vunits=km +accept 0 0 1000 +expect 0 0 1 +roundtrip 1 + +------------------------------------------------------------------------------- +# Check that proj_create() returns a syntax error when an exception is caught +# in the creation of a PJ object. +------------------------------------------------------------------------------- +operation this is a bogus CRS meant to trigger a syntax error in proj_create() +expect failure errno invalid_op_wrong_syntax + +------------------------------------------------------------------------------- +# Test proj=set +------------------------------------------------------------------------------- + +operation +proj=set +accept 1 2 3 4 +expect 1 2 3 4 +roundtrip 1 + +operation +proj=set +v_1=10 +v_2=20 +v_3=30 +v_4=40 +accept 1 2 3 4 +expect 10 20 30 40 + +operation +proj=set +v_1=10 +v_2=20 +v_3=30 +v_4=40 +direction inverse +accept 1 2 3 4 +expect 10 20 30 40 + + diff --git a/conformance/src/test/resources/gie/DHDN_ETRS89.gie b/conformance/src/test/resources/gie/DHDN_ETRS89.gie new file mode 100644 index 0000000..0e88ad5 --- /dev/null +++ b/conformance/src/test/resources/gie/DHDN_ETRS89.gie @@ -0,0 +1,375 @@ + + +------------------------------------------------------------------------------- +operation proj=latlong datum=potsdam ellps=bessel +------------------------------------------------------------------------------- +#DE_DHDN (BeTA, 2007) to ETRS89 using NTv2 grid. epsg:15948 +------------------------------------------------------------------------------- + +tolerance 1 mm +accept 7.482506019176 53.498461143331 # ETRS89_Lat-Lon +expect 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon + +direction inverse + +accept 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon +expect 7.482506019176 53.498461143331 # ETRS89_Lat-Lon +accept 10.333333333333 48.833333333333 # DE_DHDN_Lat-Lon +expect 10.332117283303 48.832327188640 # ETRS89_Lat-Lon +accept 8.000000000000 50.083333333333 # DE_DHDN_Lat-Lon +expect 7.999097344043 50.082172046476 # ETRS89_Lat-Lon +accept 10.016666666667 51.033333333333 # DE_DHDN_Lat-Lon +expect 10.015460839103 51.032075951188 # ETRS89_Lat-Lon +accept 10.466666666667 54.333333333333 # DE_DHDN_Lat-Lon +expect 10.465373788153 54.331696254077 # ETRS89_Lat-Lon +accept 10.750000000000 53.583333333333 # DE_DHDN_Lat-Lon +expect 10.748659705929 53.581781243436 # ETRS89_Lat-Lon +accept 10.016666666667 53.500000000000 # DE_DHDN_Lat-Lon +expect 10.015444367463 53.498457503620 # ETRS89_Lat-Lon +accept 11.000000000000 53.466666666667 # DE_DHDN_Lat-Lon +expect 10.998619309575 53.465127257963 # ETRS89_Lat-Lon +accept 13.466666666667 53.766666666667 # DE_DHDN_Lat-Lon +expect 13.464877774631 53.765109112396 # ETRS89_Lat-Lon +accept 10.983333333333 52.766666666667 # DE_DHDN_Lat-Lon +expect 10.981965431979 52.765211787713 # ETRS89_Lat-Lon +accept 13.000000000000 51.783333333333 # DE_DHDN_Lat-Lon +expect 12.998336654827 51.782006921265 # ETRS89_Lat-Lon +accept 10.466666666667 52.500000000000 # DE_DHDN_Lat-Lon +expect 10.465380298337 52.498573633365 # ETRS89_Lat-Lon +accept 10.550000000000 51.466666666667 # DE_DHDN_Lat-Lon +expect 10.548711467380 51.465361979987 # ETRS89_Lat-Lon +accept 10.450000000000 50.583333333333 # DE_DHDN_Lat-Lon +expect 10.448735275612 50.582129474187 # ETRS89_Lat-Lon +accept 10.416666666667 49.666666666667 # DE_DHDN_Lat-Lon +expect 10.415423634267 49.665566047661 # ETRS89_Lat-Lon +accept 10.550000000000 47.750000000000 # DE_DHDN_Lat-Lon +expect 10.548775945187 47.749120260296 # ETRS89_Lat-Lon +accept 13.450000000000 50.666666666667 # DE_DHDN_Lat-Lon +expect 13.448283429558 50.665476385913 # ETRS89_Lat-Lon +accept 13.550000000000 51.333333333333 # DE_DHDN_Lat-Lon +expect 13.548264242652 51.332063317958 # ETRS89_Lat-Lon +accept 13.566666666667 52.050000000000 # DE_DHDN_Lat-Lon +expect 13.564906713066 52.048646469731 # ETRS89_Lat-Lon +accept 13.433333333333 53.166666666667 # DE_DHDN_Lat-Lon +expect 13.431569610583 53.165185284138 # ETRS89_Lat-Lon +accept 13.466666666667 52.483333333333 # DE_DHDN_Lat-Lon +expect 13.464913254978 52.481930297429 # ETRS89_Lat-Lon +accept 13.133333333333 49.066666666667 # DE_DHDN_Lat-Lon +expect 13.131706947050 49.065661709281 # ETRS89_Lat-Lon +accept 8.666666666667 53.116666666667 # DE_DHDN_Lat-Lon +expect 8.665654272188 53.115169791635 # ETRS89_Lat-Lon +accept 12.950000000000 47.650000000000 # DE_DHDN_Lat-Lon +expect 12.948437185277 47.649155713893 # ETRS89_Lat-Lon +accept 8.500000000000 54.716666666667 # DE_DHDN_Lat-Lon +expect 8.499027339833 54.714992333813 # ETRS89_Lat-Lon +accept 7.483333333333 51.983333333333 # DE_DHDN_Lat-Lon +expect 7.482494584516 51.981965147975 # ETRS89_Lat-Lon +accept 7.516666666667 51.016666666667 # DE_DHDN_Lat-Lon +expect 7.515823996992 51.015402184493 # ETRS89_Lat-Lon +accept 7.466666666667 50.500000000000 # DE_DHDN_Lat-Lon +expect 7.465834308888 50.498791390585 # ETRS89_Lat-Lon +accept 7.533333333333 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.532503616986 49.332250779407 # ETRS89_Lat-Lon +accept 7.250000000000 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.249209260581 49.332249456364 # ETRS89_Lat-Lon +accept 7.533333333333 47.666666666667 # DE_DHDN_Lat-Lon +expect 7.532530252396 47.665765608135 # ETRS89_Lat-Lon +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +operation proj=latlong \ + towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 ellps=bessel +------------------------------------------------------------------------------- +# DE_DHDN to ETRS89 using deprecated 7 parameter Helmert transform. The results +# agree at the 3 m level. +------------------------------------------------------------------------------- + +require_grid BETA2007.gsb +tolerance 3 m + +accept 7.482506019176 53.498461143331 # ETRS89_Lat-Lon +expect 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon + +direction inverse + +accept 7.483333333333 53.500000000000 # DE_DHDN_Lat-Lon +expect 7.482506019176 53.498461143331 # ETRS89_Lat-Lon + +accept 10.333333333333 48.833333333333 # DE_DHDN_Lat-Lon +expect 10.332117283303 48.832327188640 # ETRS89_Lat-Lon +accept 8.000000000000 50.083333333333 # DE_DHDN_Lat-Lon +expect 7.999097344043 50.082172046476 # ETRS89_Lat-Lon +accept 10.016666666667 51.033333333333 # DE_DHDN_Lat-Lon +expect 10.015460839103 51.032075951188 # ETRS89_Lat-Lon +accept 10.466666666667 54.333333333333 # DE_DHDN_Lat-Lon +expect 10.465373788153 54.331696254077 # ETRS89_Lat-Lon +accept 10.750000000000 53.583333333333 # DE_DHDN_Lat-Lon +expect 10.748659705929 53.581781243436 # ETRS89_Lat-Lon +accept 10.016666666667 53.500000000000 # DE_DHDN_Lat-Lon +expect 10.015444367463 53.498457503620 # ETRS89_Lat-Lon +accept 11.000000000000 53.466666666667 # DE_DHDN_Lat-Lon +expect 10.998619309575 53.465127257963 # ETRS89_Lat-Lon +accept 13.466666666667 53.766666666667 # DE_DHDN_Lat-Lon +expect 13.464877774631 53.765109112396 # ETRS89_Lat-Lon +accept 10.983333333333 52.766666666667 # DE_DHDN_Lat-Lon +expect 10.981965431979 52.765211787713 # ETRS89_Lat-Lon +accept 13.000000000000 51.783333333333 # DE_DHDN_Lat-Lon +expect 12.998336654827 51.782006921265 # ETRS89_Lat-Lon +accept 10.466666666667 52.500000000000 # DE_DHDN_Lat-Lon +expect 10.465380298337 52.498573633365 # ETRS89_Lat-Lon +accept 10.550000000000 51.466666666667 # DE_DHDN_Lat-Lon +expect 10.548711467380 51.465361979987 # ETRS89_Lat-Lon +accept 10.450000000000 50.583333333333 # DE_DHDN_Lat-Lon +expect 10.448735275612 50.582129474187 # ETRS89_Lat-Lon +accept 10.416666666667 49.666666666667 # DE_DHDN_Lat-Lon +expect 10.415423634267 49.665566047661 # ETRS89_Lat-Lon +accept 10.550000000000 47.750000000000 # DE_DHDN_Lat-Lon +expect 10.548775945187 47.749120260296 # ETRS89_Lat-Lon +accept 13.450000000000 50.666666666667 # DE_DHDN_Lat-Lon +expect 13.448283429558 50.665476385913 # ETRS89_Lat-Lon +accept 13.550000000000 51.333333333333 # DE_DHDN_Lat-Lon +expect 13.548264242652 51.332063317958 # ETRS89_Lat-Lon +accept 13.566666666667 52.050000000000 # DE_DHDN_Lat-Lon +expect 13.564906713066 52.048646469731 # ETRS89_Lat-Lon +accept 13.433333333333 53.166666666667 # DE_DHDN_Lat-Lon +expect 13.431569610583 53.165185284138 # ETRS89_Lat-Lon +accept 13.466666666667 52.483333333333 # DE_DHDN_Lat-Lon +expect 13.464913254978 52.481930297429 # ETRS89_Lat-Lon +accept 13.133333333333 49.066666666667 # DE_DHDN_Lat-Lon +expect 13.131706947050 49.065661709281 # ETRS89_Lat-Lon +accept 8.666666666667 53.116666666667 # DE_DHDN_Lat-Lon +expect 8.665654272188 53.115169791635 # ETRS89_Lat-Lon +accept 12.950000000000 47.650000000000 # DE_DHDN_Lat-Lon +expect 12.948437185277 47.649155713893 # ETRS89_Lat-Lon +accept 8.500000000000 54.716666666667 # DE_DHDN_Lat-Lon +expect 8.499027339833 54.714992333813 # ETRS89_Lat-Lon +accept 7.483333333333 51.983333333333 # DE_DHDN_Lat-Lon +expect 7.482494584516 51.981965147975 # ETRS89_Lat-Lon +accept 7.516666666667 51.016666666667 # DE_DHDN_Lat-Lon +expect 7.515823996992 51.015402184493 # ETRS89_Lat-Lon +accept 7.466666666667 50.500000000000 # DE_DHDN_Lat-Lon +expect 7.465834308888 50.498791390585 # ETRS89_Lat-Lon +accept 7.533333333333 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.532503616986 49.332250779407 # ETRS89_Lat-Lon +accept 7.250000000000 49.333333333333 # DE_DHDN_Lat-Lon +expect 7.249209260581 49.332249456364 # ETRS89_Lat-Lon +accept 7.533333333333 47.666666666667 # DE_DHDN_Lat-Lon +expect 7.532530252396 47.665765608135 # ETRS89_Lat-Lon +------------------------------------------------------------------------------- + + + + + + + + + + + +------------------------------------------------------------------------------- +The numerical material in this file is based on the contents of the +BKG test data file over at http://crs.bkg.bund.de/crseu/crs/descrtrans/BeTA/BETA2007testdaten.csv + +The conversion was carried out as follows: + +set insertkey=gawk 'BEGIN {FS=","}; {print $3","$0} +set reformat=gawk 'BEGIN {FS=","}; {print "accept " $6 " " $5 " # " $4 "\nexpect " $9 " " $8 " # " $7}' +cat BETA2007testdaten.csv | %insertkey% | sort | %reformat% >DHDN_ETRS89.gie +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +Tests for GK system zones to UTM32/33 not implemented yet +------------------------------------------------------------------------------- +accept 2598417.333192 5930677.980308 # DE_DHDN_3GK2 +expect 399340.601863 5928794.177992 # ETRS89_UTM32 +accept 2643120.946052 5551463.861308 # DE_DHDN_3GK2 +expect 428391.209209 5548246.766868 # ETRS89_UTM32 +accept 2678509.791823 5890320.494547 # DE_DHDN_3GK2 +expect 477621.722498 5885134.566909 # ETRS89_UTM32 +accept 2661073.960381 6067930.993896 # DE_DHDN_3GK2 +expect 467726.896146 6063191.974102 # ETRS89_UTM32 +accept 2601895.024514 5761935.671777 # DE_DHDN_3GK2 +expect 395783.496871 5760119.715259 # ETRS89_UTM32 +accept 2606412.760026 5654454.411797 # DE_DHDN_3GK2 +expect 395892.865206 5652585.895428 # ETRS89_UTM32 +accept 2604044.332230 5596917.811668 # DE_DHDN_3GK2 +expect 391195.030128 5595215.127880 # ETRS89_UTM32 +accept 2611430.565041 5467270.623504 # DE_DHDN_3GK2 +expect 393381.121595 5465427.351346 # ETRS89_UTM32 +accept 2590840.678885 5466891.206854 # DE_DHDN_3GK2 +expect 372799.647928 5465865.755414 # ETRS89_UTM32 +accept 2615145.447136 5281966.148083 # DE_DHDN_3GK2 +expect 389829.267589 5280195.601333 # ETRS89_UTM32 +accept 3399371.190396 5930724.531323 # DE_DHDN_3GK3 +expect 399340.601862 5928794.177992 # ETRS89_UTM32 +accept 3597874.421966 5411397.512092 # DE_DHDN_3GK3 +expect 597759.898637 5409672.239612 # ETRS89_UTM32 +accept 3428437.612810 5550026.645035 # DE_DHDN_3GK3 +expect 428391.209209 5548246.766869 # ETRS89_UTM32 +accept 3571307.006323 5655705.338031 # DE_DHDN_3GK3 +expect 571204.563344 5653882.476948 # ETRS89_UTM32 +accept 3595392.782000 6023387.959898 # DE_DHDN_3GK3 +expect 595286.044398 6021417.376973 # ETRS89_UTM32 +accept 3615881.001454 5940351.727710 # DE_DHDN_3GK3 +expect 615764.364007 5938413.819150 # ETRS89_UTM32 +accept 3615881.001454 5940351.727710 # DE_DHDN_3GK3 +expect 218617.111391 5945399.220269 # ETRS89_UTM33 +accept 3567455.742115 5930134.904864 # DE_DHDN_3GK3 +expect 567358.390548 5928201.976543 # ETRS89_UTM32 +accept 3632798.076882 5927807.051283 # DE_DHDN_3GK3 +expect 632674.379672 5925873.747901 # ETRS89_UTM32 +accept 3632798.076882 5927807.051283 # DE_DHDN_3GK3 +expect 234423.486615 5931470.592457 # ETRS89_UTM33 +accept 3633848.721200 5849896.198513 # DE_DHDN_3GK3 +expect 633723.734075 5847994.536970 # ETRS89_UTM32 +accept 3633848.721200 5849896.198513 # DE_DHDN_3GK3 +expect 228947.171966 5853725.067987 # ETRS89_UTM33 +accept 3599586.686397 5819391.659845 # DE_DHDN_3GK3 +expect 599474.934168 5817502.626999 # ETRS89_UTM32 +accept 3607695.214682 5704557.217497 # DE_DHDN_3GK3 +expect 607578.857121 5702714.405562 # ETRS89_UTM32 +accept 3607695.214682 5704557.217497 # DE_DHDN_3GK3 +expect 190859.292094 5710978.842070 # ETRS89_UTM33 +accept 3602680.921862 5606162.921133 # DE_DHDN_3GK3 +expect 602565.455313 5604359.618990 # ETRS89_UTM32 +accept 3602680.921862 5606162.921133 # DE_DHDN_3GK3 +expect 177845.139712 5613251.897383 # ETRS89_UTM33 +accept 3602255.364740 5504172.212483 # DE_DHDN_3GK3 +expect 602139.527314 5502409.680191 # ETRS89_UTM32 +accept 3602255.364740 5504172.212483 # DE_DHDN_3GK3 +expect 169220.450101 5511545.700292 # ETRS89_UTM33 +accept 3616211.566778 5291255.078896 # DE_DHDN_3GK3 +expect 616089.408439 5289578.131826 # ETRS89_UTM32 +accept 3616211.566778 5291255.078896 # DE_DHDN_3GK3 +expect 166384.067958 5298018.237122 # ETRS89_UTM33 +accept 3477684.063162 5887048.676718 # DE_DHDN_3GK3 +expect 477621.722499 5885134.566914 # ETRS89_UTM32 +accept 3467781.947036 6065176.417740 # DE_DHDN_3GK3 +expect 467726.896147 6063191.974105 # ETRS89_UTM32 +accept 3395815.326925 5761982.907482 # DE_DHDN_3GK3 +expect 395783.496872 5760119.715259 # ETRS89_UTM32 +accept 3395925.872234 5654406.808724 # DE_DHDN_3GK3 +expect 395892.865206 5652585.895428 # ETRS89_UTM32 +accept 3391226.589718 5597013.366086 # DE_DHDN_3GK3 +expect 391195.030128 5595215.127881 # ETRS89_UTM32 +accept 3393414.080125 5467174.397245 # DE_DHDN_3GK3 +expect 393381.121595 5465427.351346 # ETRS89_UTM32 +accept 3372824.499428 5467612.907301 # DE_DHDN_3GK3 +expect 372799.647928 5465865.755413 # ETRS89_UTM32 +accept 3389860.774004 5281869.239226 # DE_DHDN_3GK3 +expect 389829.267590 5280195.601333 # ETRS89_UTM32 +accept 4377657.794741 5411879.839992 # DE_DHDN_3GK4 +expect 597759.898636 5409672.239612 # ETRS89_UTM32 +accept 4360897.154310 5657085.679344 # DE_DHDN_3GK4 +expect 571204.563343 5653882.476947 # ETRS89_UTM32 +accept 4400271.505998 6023480.198072 # DE_DHDN_3GK4 +expect 595286.044399 6021417.376972 # ETRS89_UTM32 +accept 4417225.999425 5939654.081375 # DE_DHDN_3GK4 +expect 615764.364007 5938413.819151 # ETRS89_UTM32 +accept 4417225.999425 5939654.081375 # DE_DHDN_3GK4 +expect 218617.111391 5945399.220269 # ETRS89_UTM33 +accept 4368411.664264 5931484.902370 # DE_DHDN_3GK4 +expect 567358.390548 5928201.976543 # ETRS89_UTM32 +accept 4433598.021986 5926410.006980 # DE_DHDN_3GK4 +expect 632674.379671 5925873.747901 # ETRS89_UTM32 +accept 4433598.021986 5926410.006980 # DE_DHDN_3GK4 +expect 234423.486614 5931470.592457 # ETRS89_UTM33 +accept 4596699.814954 5960328.296681 # DE_DHDN_3GK4 +expect 794226.051532 5966642.993890 # ETRS89_UTM32 +accept 4596699.814954 5960328.296681 # DE_DHDN_3GK4 +expect 398811.452821 5958481.617326 # ETRS89_UTM33 +accept 4431385.771953 5848536.122437 # DE_DHDN_3GK4 +expect 633723.734074 5847994.536971 # ETRS89_UTM32 +accept 4431385.771953 5848536.122437 # DE_DHDN_3GK4 +expect 228947.171966 5853725.067987 # ETRS89_UTM33 +accept 4568999.833703 5739119.060681 # DE_DHDN_3GK4 +expect 775766.817929 5744357.999264 # ETRS89_UTM32 +accept 4568999.833703 5739119.060681 # DE_DHDN_3GK4 +expect 361924.813552 5738688.111797 # ETRS89_UTM33 +accept 4395886.918912 5819485.694352 # DE_DHDN_3GK4 +expect 599474.934169 5817502.626999 # ETRS89_UTM32 +accept 4399252.521454 5704414.901133 # DE_DHDN_3GK4 +expect 607578.857121 5702714.405563 # ETRS89_UTM32 +accept 4399252.521454 5704414.901133 # DE_DHDN_3GK4 +expect 190859.292094 5710978.842070 # ETRS89_UTM33 +accept 4390237.957560 5606306.171667 # DE_DHDN_3GK4 +expect 602565.455313 5604359.618990 # ETRS89_UTM32 +accept 4390237.957560 5606306.171667 # DE_DHDN_3GK4 +expect 177845.139712 5613251.897384 # ETRS89_UTM33 +accept 4385715.060070 5504412.338975 # DE_DHDN_3GK4 +expect 602139.527314 5502409.680191 # ETRS89_UTM32 +accept 4385715.060070 5504412.338975 # DE_DHDN_3GK4 +expect 169220.450101 5511545.700292 # ETRS89_UTM33 +accept 4391285.796869 5291109.755123 # DE_DHDN_3GK4 +expect 616089.408439 5289578.131827 # ETRS89_UTM32 +accept 4391285.796869 5291109.755123 # DE_DHDN_3GK4 +expect 166384.067958 5298018.237122 # ETRS89_UTM33 +accept 4602499.566145 5615431.379860 # DE_DHDN_3GK4 +expect 814311.364242 5622071.326313 # ETRS89_UTM32 +accept 4602499.566145 5615431.379860 # DE_DHDN_3GK4 +expect 390338.211462 5613774.353256 # ETRS89_UTM33 +accept 4608008.855658 5689725.987089 # DE_DHDN_3GK4 +expect 816793.461724 5696579.298817 # ETRS89_UTM32 +accept 4608008.855658 5689725.987089 # DE_DHDN_3GK4 +expect 398863.493307 5687753.129020 # ETRS89_UTM33 +accept 4607459.254388 5769472.054323 # DE_DHDN_3GK4 +expect 812962.846098 5776288.882564 # ETRS89_UTM32 +accept 4607459.254388 5769472.054323 # DE_DHDN_3GK4 +expect 401589.388273 5767420.751372 # ETRS89_UTM33 +accept 4595844.509596 5893520.178529 # DE_DHDN_3GK4 +expect 796184.889876 5899821.806119 # ETRS89_UTM32 +accept 4595844.509596 5893520.178529 # DE_DHDN_3GK4 +expect 395147.893839 5891795.036022 # ETRS89_UTM33 +accept 4599624.347102 5817537.418158 # DE_DHDN_3GK4 +expect 803137.012417 5824018.671556 # ETRS89_UTM32 +accept 4599624.347102 5817537.418158 # DE_DHDN_3GK4 +expect 395754.092849 5815749.835902 # ETRS89_UTM33 +accept 4582806.457775 5437104.667215 # DE_DHDN_3GK4 +expect 801769.133341 5442981.626260 # ETRS89_UTM32 +accept 4582806.457775 5437104.667215 # DE_DHDN_3GK4 +expect 363531.446507 5436436.282581 # ETRS89_UTM33 +accept 4571363.304563 5279411.440581 # DE_DHDN_3GK4 +expect 796505.582915 5284862.664428 # ETRS89_UTM32 +accept 4571363.304563 5279411.440581 # DE_DHDN_3GK4 +expect 345930.907036 5279345.459526 # ETRS89_UTM33 +accept 5398905.047545 5960421.130827 # DE_DHDN_3GK5 +expect 794226.051532 5966642.993889 # ETRS89_UTM32 +accept 5398905.047545 5960421.130827 # DE_DHDN_3GK5 +expect 398811.452821 5958481.617326 # ETRS89_UTM33 +accept 5362005.247500 5740538.568445 # DE_DHDN_3GK5 +expect 775766.817929 5744357.999262 # ETRS89_UTM32 +accept 5362005.247500 5740538.568445 # DE_DHDN_3GK5 +expect 361924.813551 5738688.111796 # ETRS89_UTM33 +accept 5390431.824773 5615574.548074 # DE_DHDN_3GK5 +expect 814311.364241 5622071.326313 # ETRS89_UTM32 +accept 5390431.824773 5615574.548074 # DE_DHDN_3GK5 +expect 390338.211462 5613774.353256 # ETRS89_UTM33 +accept 5398959.121385 5689583.521018 # DE_DHDN_3GK5 +expect 816793.461724 5696579.298817 # ETRS89_UTM32 +accept 5398959.121385 5689583.521018 # DE_DHDN_3GK5 +expect 398863.493307 5687753.129020 # ETRS89_UTM33 +accept 5401685.729154 5769283.220752 # DE_DHDN_3GK5 +expect 812962.846098 5776288.882564 # ETRS89_UTM32 +accept 5401685.729154 5769283.220752 # DE_DHDN_3GK5 +expect 401589.388272 5767420.751372 # ETRS89_UTM33 +accept 5395240.318989 5893707.029636 # DE_DHDN_3GK5 +expect 796184.889876 5899821.806119 # ETRS89_UTM32 +accept 5395240.318989 5893707.029636 # DE_DHDN_3GK5 +expect 395147.893840 5891795.036022 # ETRS89_UTM33 +accept 5395847.545864 5817631.467237 # DE_DHDN_3GK5 +expect 803137.012417 5824018.671556 # ETRS89_UTM32 +accept 5395847.545864 5817631.467237 # DE_DHDN_3GK5 +expect 395754.092849 5815749.835902 # ETRS89_UTM33 +accept 5363615.032963 5438164.610427 # DE_DHDN_3GK5 +expect 801769.133341 5442981.626260 # ETRS89_UTM32 +accept 5363615.032963 5438164.610427 # DE_DHDN_3GK5 +expect 363531.446506 5436436.282581 # ETRS89_UTM33 +accept 5346007.854521 5281010.564511 # DE_DHDN_3GK5 +expect 796505.582915 5284862.664427 # ETRS89_UTM32 +accept 5346007.854521 5281010.564511 # DE_DHDN_3GK5 +expect 345930.907036 5279345.459525 # ETRS89_UTM33 +------------------------------------------------------------------------------- diff --git a/conformance/src/test/resources/gie/GDA.gie b/conformance/src/test/resources/gie/GDA.gie new file mode 100644 index 0000000..a21b37e --- /dev/null +++ b/conformance/src/test/resources/gie/GDA.gie @@ -0,0 +1,77 @@ +----------------------------------------------------------------------------------- +Australian datum transformations +----------------------------------------------------------------------------------- +Based on material from: + +Intergovernmental Committee on Surveying and Mapping (ICSM) +Permanent Committee on Geodesy (PCG): + +Geocentric Datum of Australia 2020 Technical Manual +Version 1.0, 25 July 2017 + +Which is distributed under Creative Commons CC-BY 4.0 + +These tests will probably be useful as a template for an AU setup file, defining +transformations for Australian systems, but I'm reluctant to provide such a file +myself - it probably should come from official AU sources. + +Thomas Knudsen, thokn@sdfe.dk, 2017-11-27 +----------------------------------------------------------------------------------- + + + +----------------------------------------------------------------------------------- +# GDA94 to GDA2020 +----------------------------------------------------------------------------------- +# Just the Helmert transformation, to verify that we are within 100 um +----------------------------------------------------------------------------------- +operation proj=helmert \ + convention=coordinate_frame \ + x = 0.06155 rx = -0.0394924 \ + y = -0.01087 ry = -0.0327221 \ + z = -0.04019 rz = -0.0328979 s = -0.009994 + +----------------------------------------------------------------------------------- +tolerance 75 um +accept -4052051.7643 4212836.2017 -2545106.0245 +expect -4052052.7379 4212835.9897 -2545104.5898 +------------------------------------------------------------------------------- + + +----------------------------------------------------------------------------------- +# GDA94 to GDA2020 +----------------------------------------------------------------------------------- +# All the way from geographic-to-cartesian-and-back-to-geographic +----------------------------------------------------------------------------------- +operation proj = pipeline ellps=GRS80; \ + step proj = cart; \ + step proj = helmert \ + convention=coordinate_frame \ + x = 0.06155; rx = -0.0394924; \ + y = -0.01087; ry = -0.0327221; \ + z = -0.04019; rz = -0.0328979; s = -0.009994; \ + step proj = cart inv; +----------------------------------------------------------------------------------- +tolerance 2 mm +accept 133.88551329 -23.67012389 603.3466 0 # Alice Springs GDA94 +expect 133.8855216 -23.67011014 603.2489 0 # Alice Springs GDA2020 +------------------------------------------------------------------------------- + + +----------------------------------------------------------------------------------- +# ITRF2014@2018 to GDA2020 - Test point ALIC (Alice Springs) +----------------------------------------------------------------------------------- +# Just the Helmert transformation, to verify that we are within 100 um +----------------------------------------------------------------------------------- +operation proj = helmert exact convention=coordinate_frame \ + x = 0 rx = 0 dx = 0 drx = 0.00150379 \ + y = 0 ry = 0 dy = 0 dry = 0.00118346 \ + z = 0 rz = 0 dz = 0 drz = 0.00120716 \ + s = 0 ds = 0 t_epoch=2020.0 +----------------------------------------------------------------------------------- +tolerance 40 um +accept -4052052.6588 4212835.9938 -2545104.6946 2018.0 # ITRF2014@2018.0 +expect -4052052.7373 4212835.9835 -2545104.5867 # GDA2020 +----------------------------------------------------------------------------------- + + diff --git a/conformance/src/test/resources/gie/adams_hemi.gie b/conformance/src/test/resources/gie/adams_hemi.gie new file mode 100644 index 0000000..9d23b93 --- /dev/null +++ b/conformance/src/test/resources/gie/adams_hemi.gie @@ -0,0 +1,2120 @@ + +------------------------------------------------------------ +# This gie file was automatically generated using libproject +#where the adams_hemi code was adapted from +------------------------------------------------------------ + +------------------------------------------------------------ +operation +proj=adams_hemi +R=6370997 +tolerance 1 mm +------------------------------------------------------------ +accept -179.0512914938 -90.1445918836 +expect failure errno coord_transfm_invalid_coord + +accept -169.5842217825 -89.1738195765 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.8126151474 -88.9303357409 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.8486678837 -88.7598088570 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.3978823413 -88.5424937255 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.4584139907 -88.3017941113 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.6382190434 -88.1579367749 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.1571755829 -87.4911657719 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.4449870732 -87.1707570236 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.9433443609 -87.0825895518 +expect -2032451.307 -14670658.595 + +accept -79.1196204797 -86.6146886067 +expect -1972952.703 -14316663.749 + +accept -69.9188804603 -86.0423885378 +expect -1919210.763 -13959619.296 + +accept -59.2140342623 -85.2062438921 +expect -1821078.174 -13499207.260 + +accept -49.3771402997 -84.6064875075 +expect -1632786.696 -13151268.681 + +accept -39.7523563839 -84.2227887345 +expect -1375189.719 -12898281.230 + +accept -29.1378956446 -84.1916000473 +expect -1019955.835 -12777203.156 + +accept -19.8973002908 -83.3255313811 +expect -750646.386 -12420097.177 + +accept -9.0586917767 -82.5740757930 +expect -361764.270 -12130784.486 + +accept 0.6658150243 -81.6306426596 +expect 28245.397 -11833545.201 + +accept 10.3916472934 -81.3826632020 +expect 446703.237 -11781755.067 + +accept 20.1494345130 -81.0829408522 +expect 877880.087 -11752832.089 + +accept 30.9020031853 -80.1029516039 +expect 1408756.445 -11595274.577 + +accept 40.6784961632 -79.5385879087 +expect 1890606.237 -11591903.266 + +accept 50.0047749416 -79.2557693956 +expect 2331531.206 -11694280.098 + +accept 60.6444819104 -78.7437592966 +expect 2853286.437 -11817317.500 + +accept 70.0847779691 -77.7507873749 +expect 3388704.151 -11865524.800 + +accept 80.5231675121 -77.0660588617 +expect 3923735.969 -12068158.388 + +accept 90.0066580543 -76.6161050638 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.5350349572 -76.3746207928 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.7544963160 -76.2761103137 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.0734970456 -75.8866598636 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.5824490023 -75.8761529489 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.8041765005 -75.3058724059 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.3183273801 -74.4580538960 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.0892519416 -73.7178034782 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.3366715442 -72.7342346131 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.6302993811 -72.6551561090 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.1498353863 -79.8617775679 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.6126454375 -78.9973036997 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5376706591 -78.3099466224 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.7206409942 -77.9762123582 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.5308439004 -77.1568269429 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.5655598613 -76.3111768828 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.7726048543 -75.3290637518 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.6962230001 -74.3833782562 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.6722260401 -73.9288741111 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.0043085338 -73.3335214021 +expect -4844180.674 -11775270.656 + +accept -79.1663300454 -72.4399400853 +expect -4517737.562 -11230872.680 + +accept -69.4926078623 -71.8461023317 +expect -4102914.567 -10768468.225 + +accept -59.2657055315 -71.2092093538 +expect -3613458.773 -10316718.559 + +accept -49.8213060755 -70.4770080858 +expect -3129758.562 -9913931.998 + +accept -39.4219744153 -70.0556232602 +expect -2525390.621 -9588638.786 + +accept -29.2292837281 -69.7843638102 +expect -1896816.371 -9350212.714 + +accept -19.3122799108 -68.8398158747 +expect -1286419.314 -9045554.926 + +accept -9.6128015323 -68.4874678083 +expect -646826.577 -8904263.293 + +accept 0.2782436804 -67.7652217315 +expect 19032.119 -8747432.621 + +accept 10.0150948909 -66.8884770151 +expect 697224.743 -8618447.314 + +accept 20.3145279457 -66.3089232102 +expect 1427884.878 -8604766.655 + +accept 30.1158431277 -65.8422273022 +expect 2129234.668 -8665589.397 + +accept 40.3813237731 -65.2868591410 +expect 2871280.128 -8782328.275 + +accept 50.3256474182 -64.5263189423 +expect 3606565.288 -8925940.412 + +accept 60.0397335630 -64.2204936386 +expect 4289216.964 -9202136.643 + +accept 70.8347119838 -64.2006837236 +expect 4994689.905 -9631301.887 + +accept 80.1994904845 -64.1621304539 +expect 5574892.739 -10059995.184 + +accept 90.4107676644 -63.6583206132 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.7435829266 -62.9292855324 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.6722999581 -62.8950940661 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.8104324458 -62.4946649855 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.0315355771 -61.8657176607 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.7842333846 -61.7278379595 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.5202047210 -61.0467237730 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.7596965102 -60.2885251988 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1658638654 -60.0997063537 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.2502374139 -59.7318603713 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.9256771826 -69.2161805164 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.2003519382 -68.5724302106 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5787597594 -67.9857475830 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.8429607974 -67.2794853256 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.5406690392 -67.1131557084 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7848559822 -66.2388824806 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.1305416029 -65.8739932573 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.5840686978 -65.1388713461 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.0639263051 -65.0873010186 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.1823111373 -64.6956687932 +expect -6023804.986 -10592902.952 + +accept -79.1164233302 -64.2716519504 +expect -5497921.434 -10022147.140 + +accept -69.2574458208 -63.9075720894 +expect -4922828.801 -9520562.405 + +accept -59.8783718706 -63.9038815291 +expect -4304901.029 -9147659.032 + +accept -49.7289524443 -63.8500661196 +expect -3612059.924 -8800325.048 + +accept -39.1403094008 -63.8422040109 +expect -2862966.181 -8516003.259 + +accept -29.1777068994 -63.1667304050 +expect -2169833.127 -8203288.513 + +accept -19.2977455865 -63.0553679417 +expect -1441725.328 -8043555.407 + +accept -9.9255569976 -62.9647601040 +expect -743731.598 -7948394.774 + +accept 0.1796078505 -62.5085487744 +expect 13569.082 -7844710.542 + +accept 10.1904676971 -61.9758669545 +expect 776353.440 -7788440.095 + +accept 20.6226352769 -61.7448218808 +expect 1574820.972 -7846337.019 + +accept 30.2475627489 -61.1393337334 +expect 2327457.261 -7896980.364 + +accept 40.5688849715 -60.3721116419 +expect 3149169.433 -8001812.738 + +accept 50.3372781690 -60.3371608659 +expect 3889524.441 -8275997.858 + +accept 60.0304323790 -60.0341705989 +expect 4627914.366 -8575277.072 + +accept 70.8357778632 -59.4751248220 +expect 5450054.504 -8962420.257 + +accept 80.4614530617 -58.9769415123 +expect 6157836.688 -9386832.221 + +accept 90.1145386062 -58.4070158299 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.7207579758 -58.0174867644 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5210303471 -57.2190055708 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.6967482820 -56.4709263993 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.0815389060 -55.4932687347 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.1058922487 -54.7233777967 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.7972249220 -54.0392541094 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.4001197642 -53.4894321537 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.7522870277 -52.8073510172 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.9552557119 -51.9628267761 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.8457680307 -59.7627027888 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.9866964666 -59.3961476674 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.7470584020 -58.4027994525 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.6934351691 -57.7899236032 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.8251656458 -57.1675573730 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7548669173 -56.7627741202 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.8194582121 -56.1851853006 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.9910713909 -55.2204505294 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.5100607596 -54.5311736441 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.8644038896 -53.9245170355 +expect -7342928.224 -9343992.584 + +accept -79.9635057664 -53.6948723497 +expect -6667476.192 -8689307.261 + +accept -69.9915897328 -53.5080881233 +expect -5920106.317 -8113696.635 + +accept -59.9878237924 -53.1347486229 +expect -5137251.168 -7595504.352 + +accept -49.6910260363 -52.6201247567 +expect -4300887.397 -7131351.272 + +accept -39.7880824067 -52.5359539692 +expect -3452174.116 -6823690.285 + +accept -29.2778055547 -51.6296886545 +expect -2568030.082 -6461876.918 + +accept -19.4306837146 -51.1069811525 +expect -1713350.228 -6239079.500 + +accept -9.3856113762 -50.6351985324 +expect -831338.016 -6085131.749 + +accept 0.8939490530 -50.4873507691 +expect 79288.786 -6038354.630 + +accept 10.1840000169 -50.4621600892 +expect 903758.620 -6065670.749 + +accept 20.0863846360 -50.3906053109 +expect 1785191.886 -6146622.254 + +accept 30.3281308173 -49.6297449138 +expect 2720752.037 -6201183.856 + +accept 40.5225439155 -49.1883193839 +expect 3657308.119 -6373152.042 + +accept 50.0774176880 -48.8514336226 +expect 4539427.520 -6619769.484 + +accept 60.4611757563 -48.8337125195 +expect 5475204.679 -7027995.280 + +accept 70.0359400468 -48.6327927027 +expect 6332662.310 -7473372.039 + +accept 80.9191136756 -48.5703968561 +expect 7251379.374 -8116860.291 + +accept 90.3784337844 -48.2622816670 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.0644440138 -47.5531771971 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.4395693884 -47.1020565364 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.8787420308 -46.5648775386 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.8192016133 -45.7254461234 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6056889736 -45.1737240013 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.1175388463 -44.6690953878 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.6179845473 -44.6641530409 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.3909883495 -43.8609446159 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.3536945715 -43.4346766235 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.6728016921 -49.7927741248 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8899091213 -49.5948095572 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.7193834386 -48.9692766397 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3161804706 -48.3900540417 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.3059860307 -47.5443099911 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.2607005772 -47.3426945690 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.0464442962 -46.3637609990 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3006137776 -46.2470536112 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.1086587357 -45.3788313212 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.6418391342 -44.9558227898 +expect -8329227.919 -8319528.025 + +accept -79.5922401709 -44.0666175390 +expect -7575608.504 -7475396.243 + +accept -69.7678517742 -43.8414369161 +expect -6693103.012 -6832178.393 + +accept -59.9773741961 -43.6178971244 +expect -5769594.561 -6303851.937 + +accept -49.0224540140 -42.7382586843 +expect -4742402.857 -5752204.163 + +accept -39.0799820528 -42.4267915714 +expect -3774284.368 -5417401.690 + +accept -29.7065845030 -42.3050919341 +expect -2859905.278 -5199352.562 + +accept -19.4093864480 -41.7132409855 +expect -1870549.029 -4971910.558 + +accept -9.5019946065 -41.0671902488 +expect -918157.515 -4807120.737 + +accept 0.7256633705 -40.8863960679 +expect 70159.362 -4759033.602 + +accept 10.1160300689 -40.8493938089 +expect 979223.286 -4782540.672 + +accept 20.7134315844 -40.8364519203 +expect 2011034.581 -4873376.186 + +accept 30.5509837736 -40.3124354704 +expect 2991370.345 -4953502.965 + +accept 40.6811168119 -39.4330828245 +expect 4036041.984 -5061633.604 + +accept 50.5408477188 -39.0992426534 +expect 5062748.637 -5317244.256 + +accept 60.8602526703 -38.6119802236 +expect 6165904.838 -5673423.296 + +accept 70.8028881731 -37.7864477876 +expect 7266962.017 -6097356.033 + +accept 80.6995146991 -37.6252342058 +expect 8295075.544 -6755019.382 + +accept 90.0888221682 -36.9847575823 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.7780137471 -36.6711774624 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5677826175 -36.0072187827 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.4571639125 -35.5987514678 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.4994689409 -35.0078880309 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.4973246226 -34.7603698284 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.2185553402 -33.7827115000 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.0049830768 -33.6576606654 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1113538332 -32.7218296414 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.0413323536 -32.6458132046 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.7614880705 -39.3083971924 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.2195161001 -38.8120777840 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.8162149104 -38.0579151517 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.1975646236 -38.0219346503 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.4875552064 -37.4333640809 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.3174577073 -37.3101077795 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.3659376731 -37.0018039210 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.4951561921 -36.7266176768 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.0146344791 -36.1766584469 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.4535006021 -35.4158065520 +expect -9377248.574 -7225961.706 + +accept -79.0387416065 -34.4648659946 +expect -8422693.344 -6224371.305 + +accept -69.2215350809 -34.3740808096 +expect -7350614.857 -5544861.367 + +accept -59.2745531980 -33.8274972528 +expect -6265513.674 -4955207.335 + +accept -49.7169986740 -32.9249999485 +expect -5234261.572 -4467029.348 + +accept -39.3938152675 -32.5464412753 +expect -4109883.252 -4132559.187 + +accept -29.3299550856 -32.1522584471 +expect -3038342.418 -3890348.809 + +accept -19.7672186473 -31.5562360216 +expect -2040849.804 -3696547.750 + +accept -9.6757428807 -31.5381986939 +expect -994652.380 -3622557.798 + +accept 0.9267949652 -30.8907292201 +expect 95467.453 -3522841.136 + +accept 10.2711979528 -30.1415999097 +expect 1063857.348 -3456961.986 + +accept 20.3037759043 -30.0366136211 +expect 2114356.936 -3516056.014 + +accept 30.7604872284 -29.7526562583 +expect 3235403.228 -3612623.593 + +accept 40.6115143350 -28.8411062530 +expect 4342408.974 -3683312.580 + +accept 50.4426160267 -28.7604876417 +expect 5473507.294 -3935831.832 + +accept 60.0667408454 -28.0150409892 +expect 6658598.640 -4193291.049 + +accept 70.8986641601 -27.4846012044 +expect 8045113.983 -4691740.858 + +accept 80.7902728211 -26.9566814760 +expect 9340735.895 -5359874.908 + +accept 90.7774660604 -26.3781900961 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.9677349413 -25.6947295847 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.4045415377 -24.8858012124 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.9106581244 -24.6760450197 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1070741983 -24.3713625355 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.5983717849 -23.4696540641 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.9695044815 -23.2859623288 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.2904693231 -22.4177486612 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.9786886104 -22.3889418243 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.4135817841 -21.4141834167 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.1529257481 -29.4728615966 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.2570543721 -28.7440325834 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.4124846191 -27.8743740104 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.9984258738 -27.2290510016 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.4767743694 -27.0546870326 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.5641039139 -26.6837015309 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.3705764793 -25.8611684419 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.5378587803 -25.4624789903 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.3734787689 -24.9304945684 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3465946697 -24.1700440971 +expect -10704395.428 -5847361.236 + +accept -79.7404033820 -23.7748908886 +expect -9513574.581 -4810463.511 + +accept -69.8876497415 -23.5742092130 +expect -8180418.594 -4058430.736 + +accept -59.3891167783 -23.0862162961 +expect -6800548.565 -3472782.360 + +accept -49.0962705404 -23.0040787983 +expect -5498406.531 -3127392.477 + +accept -39.5604939819 -22.8514526819 +expect -4357597.539 -2896084.387 + +accept -29.6190870010 -22.2716044223 +expect -3224919.475 -2674683.087 + +accept -19.2436583074 -22.1221079553 +expect -2074925.707 -2558243.836 + +accept -9.3541697716 -21.2322237727 +expect -1006009.651 -2403546.370 + +accept 0.3565245677 -20.3671378180 +expect 38384.574 -2289133.435 + +accept 10.4893794068 -19.6098192847 +expect 1134672.480 -2219784.886 + +accept 20.1245536415 -19.4921243712 +expect 2191535.285 -2254510.891 + +accept 30.7062162966 -19.3927174348 +expect 3384477.986 -2336722.926 + +accept 40.8666533485 -18.6123732185 +expect 4592279.592 -2378596.017 + +accept 50.0951841039 -17.9250502345 +expect 5759194.930 -2468249.825 + +accept 60.3777794968 -17.5681367463 +expect 7155127.802 -2710926.594 + +accept 70.7020153713 -16.8114869486 +expect 8722490.928 -3052901.356 + +accept 80.8671865869 -16.2424776439 +expect 10422654.067 -3712280.432 + +accept 90.2461291404 -15.5645924718 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.9711143384 -14.9057684714 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5061775944 -13.9999376124 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.6646869394 -13.8762395278 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.4786384854 -13.6641917166 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.4992250881 -12.7990197875 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.0366235813 -12.4696803942 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.5278707110 -12.2720940753 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.3484529579 -12.2138862792 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.2280212650 -11.3213090122 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.9887698836 -19.8434403334 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.6164294546 -19.0221825561 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5308654294 -18.1879041212 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.8050966059 -17.4019446265 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.1612469827 -16.6625595025 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.4619391187 -16.4594418864 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.8383311004 -16.1675065524 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3335459376 -15.6868347454 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.7976668059 -15.6854972046 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.7267294244 -14.8632370454 +expect -12053401.390 -4568307.176 + +accept -79.1896256706 -14.3035788003 +expect -10318651.920 -3211294.118 + +accept -69.8238721868 -13.6606252292 +expect -8752793.203 -2483025.217 + +accept -59.9341884732 -13.0163995934 +expect -7239853.279 -2016848.066 + +accept -49.2718060884 -12.0872143872 +expect -5769460.920 -1657984.518 + +accept -39.0612457278 -11.2146109871 +expect -4471191.256 -1415302.828 + +accept -29.7861799219 -10.9508322090 +expect -3354764.734 -1309138.609 + +accept -19.4145569922 -10.5133139512 +expect -2160417.521 -1206521.486 + +accept -9.5198292959 -9.7964336368 +expect -1053132.786 -1099465.773 + +accept 0.8412200908 -8.9185740153 +expect 92973.787 -993763.563 + +accept 10.4291884083 -8.3013059591 +expect 1156683.321 -932334.794 + +accept 20.1434736553 -7.4540137611 +expect 2253230.418 -856389.581 + +accept 30.9337103769 -7.4330940402 +expect 3510477.410 -893006.725 + +accept 40.1244867612 -6.5706097227 +expect 4641586.907 -835473.434 + +accept 50.1188628580 -6.0246021551 +expect 5960644.364 -835727.421 + +accept 60.8442179646 -5.0882786722 +expect 7543977.493 -808597.717 + +accept 70.9106152137 -5.0040354490 +expect 9276405.717 -966062.038 + +accept 80.6138637845 -4.9732504580 +expect 11379290.973 -1327935.989 + +accept 90.6032354861 -4.1370495786 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.1644532030 -3.7428216159 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.6488410247 -3.6483998900 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.4200133401 -3.5679026480 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.4611248753 -2.8417810196 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.5117693002 -2.1994039429 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.8812291858 -1.4289441365 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.7607399916 -1.4071810906 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.8773135555 -1.0552787291 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.0261501820 -0.4477561568 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.6651296552 -9.8752237332 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8040567331 -9.5090347854 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.2369236977 -8.7812050100 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.4668694945 -8.7411685014 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.4921425087 -8.4838585832 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.0489643890 -8.3165131291 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2267713387 -8.2419396541 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.8259504273 -7.2718622518 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9614377002 -7.1037710855 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.8090238071 -6.4232987368 +expect -13640751.484 -2974873.944 + +accept -79.3641569088 -6.0589975081 +expect -11010026.860 -1514839.115 + +accept -69.4104381605 -5.3415079971 +expect -8989236.834 -994787.772 + +accept -59.1035311505 -4.7601449911 +expect -7276854.155 -737312.363 + +accept -49.7514136971 -4.1714583763 +expect -5923537.462 -576783.461 + +accept -39.2161406618 -3.9369832151 +expect -4539636.330 -497351.785 + +accept -29.7503799768 -2.9883217265 +expect -3383505.746 -356659.413 + +accept -19.3042659436 -2.0693367961 +expect -2166506.455 -236875.349 + +accept -9.8550183317 -1.1339666688 +expect -1098434.101 -127035.957 + +accept 0.3698643768 -0.7850645975 +expect 41125.238 -87297.441 + +accept 10.5309879356 -0.2442969095 +expect 1174302.709 -27396.310 + +accept 20.3483686169 0.5355680008 +expect 2286903.911 61502.678 + +accept 30.9157771281 1.5084105801 +expect 3524936.009 181088.864 + +accept 40.8345369145 1.9690445225 +expect 4750388.872 251710.802 + +accept 50.0083884196 2.0400972654 +expect 5968514.060 282935.766 + +accept 60.5564326069 2.5146830998 +expect 7522513.981 398583.466 + +accept 70.0242529688 2.6387476779 +expect 9150344.687 501095.492 + +accept 80.6476764259 3.6310845229 +expect 11462634.636 984489.812 + +accept 90.5849650699 4.1063917523 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.6238525596 4.1230600723 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.6594697851 5.0495381196 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.0930076215 5.2661796574 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.5000547754 5.3939702157 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.4751452989 5.8876297478 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.7452375246 6.3021488806 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.1359677924 6.9173640629 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.0302177328 7.6378853558 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.8170157951 8.3472735471 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.1943150364 0.7596010223 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.6391212860 1.0795717122 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.2152700578 1.5596096157 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3566080854 2.3935395760 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.6411690265 2.8792042895 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.0884027419 3.3736512451 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.6412398776 3.5609941446 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.8410023851 4.3613065976 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.5554211656 5.1657533479 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3773565828 5.9157121060 +expect -13652078.995 2749284.275 + +accept -79.5182008966 5.9890761386 +expect -11050370.051 1507839.328 + +accept -69.5064826337 6.4698255786 +expect -8978882.758 1203806.785 + +accept -59.5169821631 7.3693412472 +expect -7304721.114 1145373.248 + +accept -49.9241519045 7.8049591034 +expect -5916373.828 1079808.719 + +accept -39.3530693426 7.8141712724 +expect -4536367.181 988115.206 + +accept -29.0573163195 8.4892787230 +expect -3282841.554 1010642.286 + +accept -19.3808304987 8.6780787506 +expect -2162785.190 995072.997 + +accept -9.7889836306 9.1980318083 +expect -1084005.841 1032425.841 + +accept 0.7401919089 9.6999375489 +expect 81716.177 1081216.951 + +accept 10.2922798343 10.2080075121 +expect 1138278.757 1147216.412 + +accept 20.8409423708 11.0731980134 +expect 2320143.899 1276786.428 + +accept 30.8315703906 11.4319423563 +expect 3474811.307 1373967.408 + +accept 40.8302365060 12.2114488494 +expect 4680441.778 1560453.893 + +accept 50.8938950488 12.4827231183 +expect 5980086.590 1739463.351 + +accept 60.1452074812 12.8049940379 +expect 7276948.599 1990687.541 + +accept 70.4026750861 13.0768132535 +expect 8877755.135 2411628.800 + +accept 80.2140199400 13.5624272700 +expect 10571534.837 3165721.762 + +accept 90.4576635954 13.9718076506 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.6449925924 14.8800104945 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.2075367326 15.0521133300 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.4913041985 15.0889224537 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1088876084 15.6744717063 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6091054692 15.9789322360 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.8827038395 16.1118935785 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.8584892232 16.9655055987 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.7081605352 17.1424915281 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.4875952646 17.7286920734 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.2192819040 10.8569245931 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.0657035958 11.2213297367 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.1659774291 11.5431930234 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.9545173238 12.5029285949 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.3117413904 12.6753804804 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.3194639426 13.3306225335 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.8562785026 13.8682936931 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.1061461002 14.0130001331 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.6079217864 14.7921669533 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3223757109 14.9467935082 +expect -11977848.908 4521084.682 + +accept -79.5614292778 15.5269071903 +expect -10271311.258 3464674.481 + +accept -69.5919903841 16.3857419518 +expect -8573212.789 2923178.600 + +accept -59.6477980679 16.9839343080 +expect -7073184.422 2599846.459 + +accept -49.1834673639 17.2588986357 +expect -5657105.754 2357772.162 + +accept -39.8262428613 17.9830247197 +expect -4476942.024 2281920.882 + +accept -29.2381466616 18.7499060636 +expect -3223466.080 2243030.787 + +accept -19.1786678435 19.0226677902 +expect -2090004.567 2193284.527 + +accept -9.6334690404 19.4761386210 +expect -1042142.311 2201616.494 + +accept 0.6321060114 20.3870396192 +expect 68050.548 2291463.687 + +accept 10.9421661895 20.4924024395 +expect 1180518.031 2323367.738 + +accept 20.4864473342 21.0164763452 +expect 2220079.189 2436668.067 + +accept 30.1291797254 21.2284428591 +expect 3296035.229 2553633.126 + +accept 40.6200421317 21.5203653800 +expect 4508950.471 2745825.410 + +accept 50.6582942940 21.9446471796 +expect 5723200.728 3026932.927 + +accept 60.9730121398 22.4243870208 +expect 7038314.007 3442040.060 + +accept 70.2091499688 22.5967062068 +expect 8288776.818 3931269.871 + +accept 80.7948402736 23.3693033859 +expect 9696270.644 4844753.993 + +accept 90.9423588456 23.9305098127 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.5427479545 24.6568371578 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.6483359564 25.2988879331 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.6254581560 25.7897168715 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.6198305384 26.5579713234 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.5223099495 27.4665102983 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.1770507578 27.9150551786 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.8757513817 28.5236724280 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.8877826460 29.0924417375 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.6425321330 29.5764205068 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.9444701529 20.8756448666 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.6232517758 21.6942653703 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5830169036 22.4130383475 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.4619550763 22.6339632787 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.7058201004 23.2553831478 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7766004320 23.8189681109 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.3228272091 24.7032636217 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.5551540716 24.7745254301 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9135718461 25.5385802763 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.1841069049 26.2083957447 +expect -10431143.612 6091127.422 + +accept -79.7910279462 26.6431680702 +expect -9245823.651 5229352.217 + +accept -69.8818215995 27.1405016091 +expect -7939848.940 4579107.633 + +accept -59.7043872074 27.3432782139 +expect -6646772.640 4084211.760 + +accept -49.0682511760 28.2506774891 +expect -5330443.447 3825676.830 + +accept -39.4506559191 29.1409725672 +expect -4204573.962 3696283.632 + +accept -29.9015556332 29.7574405692 +expect -3142385.818 3600000.101 + +accept -19.0693346875 30.4852506297 +expect -1979564.068 3559098.611 + +accept -9.6233626432 30.8903459176 +expect -992683.054 3544093.220 + +accept 0.8232394368 31.3744079922 +expect 84584.215 3580932.776 + +accept 10.4236001839 31.4267077934 +expect 1072418.207 3612634.442 + +accept 20.9980760459 31.8605558626 +expect 2165806.548 3746351.172 + +accept 30.8255462270 32.3520551790 +expect 3193447.531 3939445.335 + +accept 40.8324168382 32.9127578763 +expect 4256012.184 4213848.131 + +accept 50.0837143989 33.6950660037 +expect 5244572.185 4581526.452 + +accept 60.4197804189 34.0559290352 +expect 6381932.867 5038103.593 + +accept 70.4867056300 34.8824703453 +expect 7453835.177 5690136.852 + +accept 80.9991967787 34.8943272959 +expect 8589604.803 6432883.803 + +accept 90.5925677009 35.3510670805 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.0148954666 36.2711932097 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.4283207815 36.6017613088 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.6777960225 37.3666811945 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.2891249681 37.8530786142 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.8212942434 38.5395736955 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.7430926180 38.7113483726 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.9509577553 39.6821505727 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.3061167023 40.4192356875 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.9886935244 41.3233715669 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.3343647471 30.6447124879 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.9318029695 30.8088173910 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9351347433 31.4030041187 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.1603401895 31.7370508292 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.8411358400 31.9883214220 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.6487283950 32.2540792459 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.3377596938 32.5474903700 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.4052121056 32.6499740509 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9645719240 33.2634048792 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3430796801 33.3255757200 +expect -9605176.890 6972552.471 + +accept -79.6121040164 33.9110503188 +expect -8536182.225 6196716.591 + +accept -69.4414539606 34.6980659140 +expect -7351641.813 5601824.874 + +accept -59.4871790876 35.1364758272 +expect -6218131.412 5141950.349 + +accept -49.8946468200 36.1100227223 +expect -5124886.495 4896415.322 + +accept -39.8692181364 36.8503178238 +expect -4035583.381 4702140.850 + +accept -29.1761644239 37.2204561349 +expect -2922531.225 4529762.914 + +accept -19.7409728105 37.3611622287 +expect -1965561.511 4418245.538 + +accept -9.2203420334 38.0828885726 +expect -910444.166 4426682.810 + +accept 0.6679908400 38.2706333082 +expect 65814.006 4427674.481 + +accept 10.6257647236 39.2684671305 +expect 1040789.082 4583898.094 + +accept 20.2366080925 40.1629979305 +expect 1974657.219 4780940.306 + +accept 30.5069203139 40.3074104493 +expect 2987108.844 4952040.049 + +accept 40.7821801102 41.0561850499 +expect 3990538.047 5279018.731 + +accept 50.9837826453 42.0495032526 +expect 4969682.427 5728168.352 + +accept 60.0140580662 42.5571623885 +expect 5839203.037 6163270.290 + +accept 70.7254208788 42.7772722042 +expect 6868275.710 6748247.633 + +accept 80.6903986951 43.0741360152 +expect 7768806.954 7429525.503 + +accept 90.6634321726 43.5837411887 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.8304968356 44.3478015738 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.2734219112 44.4218804789 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.7981801963 44.9674252843 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.6206535666 45.4286113875 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.3730391283 46.0714239353 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.9426457881 46.5091534230 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.6115790352 47.4101077572 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.3277640796 48.0638373590 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.8477425796 48.8442357472 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.2598149320 40.1705017627 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.6056153255 40.1727881259 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.3396275493 41.0355246248 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3430287138 41.0573932198 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.3972998819 41.0866734660 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.2347342883 41.3220478306 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.9384666450 41.9087201484 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.1765297705 42.5137977627 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.7425660165 43.1240737964 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3631524858 43.6013437171 +expect -8456598.089 8145902.918 + +accept -79.1184854139 44.4465168591 +expect -7497596.784 7490230.178 + +accept -69.3713987852 45.2639704879 +expect -6544218.717 6996093.996 + +accept -59.4171409115 45.4132014431 +expect -5602984.158 6519916.313 + +accept -49.3100677093 45.7526223682 +expect -4626331.424 6169411.113 + +accept -39.3187102974 46.6936897182 +expect -3644320.114 5998514.674 + +accept -29.9742251826 46.9036255354 +expect -2766108.322 5819685.981 + +accept -19.2850914312 47.8240485822 +expect -1759883.555 5782937.269 + +accept -9.4670802435 48.1827130036 +expect -859898.761 5747174.232 + +accept 0.9511694165 49.1770930435 +expect 85514.729 5856972.276 + +accept 10.9297395133 49.6986510413 +expect 977791.001 5964314.135 + +accept 20.6644197363 50.6277034455 +expect 1831934.709 6186995.533 + +accept 30.1619319357 50.8191455831 +expect 2670361.605 6364198.402 + +accept 40.7545399266 51.8106566282 +expect 3567452.494 6746371.295 + +accept 50.2966459346 52.3403869111 +expect 4368473.680 7112624.685 + +accept 60.8853952926 52.6411504842 +expect 5247040.469 7565966.065 + +accept 70.9660756955 53.5899082901 +expect 5989886.277 8174678.498 + +accept 80.1015409967 53.6234824949 +expect 6684866.077 8688618.853 + +accept 90.9390534980 54.4032676618 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.2275975816 54.6540829630 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.2799875321 55.5050863665 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.5746083149 55.8365526658 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.5493283922 55.8603600954 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.1036826064 56.0703761781 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.2683487285 56.7530037053 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.2871251380 57.2145257183 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1375706366 57.2304506879 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.2551410057 57.5449642224 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.4163113130 50.3425538005 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.9733110986 50.4458299488 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.7576358296 50.9581504113 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3417213155 51.6042289093 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.0195163151 51.8452436385 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.9037457234 52.0925641350 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.8773360504 52.9710431510 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3390467545 53.2106639106 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.5444768748 53.6966176349 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.1508332331 54.2933793206 +expect -7253089.374 9338825.070 + +accept -79.5075548350 54.5417649044 +expect -6548869.079 8768667.084 + +accept -69.4795328221 54.7159059038 +expect -5776149.289 8249326.048 + +accept -59.0478968386 55.5204260857 +expect -4890946.145 7889320.902 + +accept -49.1881407070 56.1072337490 +expect -4060119.862 7613040.252 + +accept -39.4101841829 56.8828347097 +expect -3227458.953 7444966.031 + +accept -29.4613810419 57.5239937456 +expect -2395806.485 7324970.138 + +accept -19.1085034175 58.4436055844 +expect -1535705.803 7310415.489 + +accept -9.9177724571 59.0951662260 +expect -790135.180 7330448.667 + +accept 0.8275131479 59.4326708329 +expect 65618.406 7353747.937 + +accept 10.2968451911 60.3586661957 +expect 804903.589 7530433.615 + +accept 20.4902700839 60.9790884371 +expect 1584299.446 7722395.231 + +accept 30.8639040743 61.2280864786 +expect 2370997.263 7922432.098 + +accept 40.0936831128 61.5458193623 +expect 3052952.372 8172497.353 + +accept 50.1049528540 62.3327697572 +expect 3741270.462 8574038.080 + +accept 60.0465199812 62.7356240065 +expect 4412884.709 8976470.296 + +accept 70.2410137014 63.2120813131 +expect 5054093.961 9462122.654 + +accept 80.2667195466 63.4462194528 +expect 5659364.075 9965995.331 + +accept 90.1958404963 64.0831209279 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.5787966151 64.7750993019 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5253826702 65.0311314831 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.1812962078 65.3475412110 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.6287227669 65.6970336106 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.0181654960 66.0623612621 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.7856466511 66.3591210923 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.9724593003 66.6162174492 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.0946608724 66.6386212957 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.4742461481 67.2758505348 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.3409209668 60.7971917835 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8189576120 61.1637771517 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5389911401 61.2887975834 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.8226015684 61.6437737052 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.2361655032 62.2457658007 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.4677006422 63.0421916813 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2765495979 63.0575080285 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.6674914716 63.2917945558 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.7670971881 63.3834861911 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.8162159435 64.1409584458 +expect -6128005.443 10556995.120 + +accept -79.1187835657 64.5588989031 +expect -5465931.391 10061962.599 + +accept -69.5357774042 64.7792984398 +expect -4855109.193 9660585.643 + +accept -59.4761740671 64.8974706901 +expect -4194775.341 9286417.697 + +accept -49.9280128167 65.6204314486 +expect -3502178.047 9090538.544 + +accept -39.3823903629 65.9211509100 +expect -2766684.454 8864998.247 + +accept -29.7679870260 66.9026625522 +expect -2059983.349 8842303.129 + +accept -19.9897475317 67.3766053532 +expect -1374622.796 8788777.482 + +accept -9.9442064094 68.2526920687 +expect -672566.109 8863134.950 + +accept 0.7509772840 69.1829974388 +expect 49780.475 9007858.113 + +accept 10.6585809296 69.8835157088 +expect 694405.780 9169808.493 + +accept 20.3911658798 70.0037343002 +expect 1321293.723 9273335.219 + +accept 30.6722125463 70.6594377768 +expect 1946504.130 9536648.767 + +accept 40.6299540574 71.5624775878 +expect 2501652.005 9893454.187 + +accept 50.8721494614 71.8337784376 +expect 3079786.371 10187475.653 + +accept 60.0291284696 71.8501773949 +expect 3593103.464 10453205.799 + +accept 70.8431571594 72.0862933562 +expect 4145342.784 10857384.689 + +accept 80.1791569395 72.7183017021 +expect 4529430.842 11315638.668 + +accept 90.8791736411 72.9059905421 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.0478827489 73.6259975169 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.4087249466 74.2803681973 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.3401612468 74.8365621394 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1826062634 75.5694271641 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.9483568214 75.9187393924 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.4892277622 76.6692051191 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.6382868956 77.4573927636 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.7717121538 77.8061856572 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.3573673565 78.0660690876 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.6675977383 70.0957203052 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.7405185971 70.8584256587 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5167125707 71.8322204655 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.0042143904 72.1158106531 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.0329602286 72.2542294354 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7801336775 73.2077231869 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.3119539671 73.8550759705 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.4758176356 74.3266149256 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.6607202273 75.0169362990 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.4753530769 75.9617981968 +expect -4457168.999 12206697.987 + +accept -79.5887435008 76.2786099898 +expect -4003489.308 11893940.766 + +accept -69.5002491752 76.5782690095 +expect -3522337.539 11617780.097 + +accept -59.6915787173 77.1315486475 +expect -3007598.216 11449732.407 + +accept -49.4552848899 77.1769236310 +expect -2520444.564 11214194.197 + +accept -39.2403833701 77.8832488521 +expect -1964697.049 11174495.756 + +accept -29.4506836219 78.3637643336 +expect -1456404.136 11143594.629 + +accept -19.5010832381 78.4638811594 +expect -965580.048 11064519.470 + +accept -9.5727750302 79.0649065844 +expect -463128.369 11154178.989 + +accept 0.3501026786 79.9268552980 +expect 16280.988 11359716.588 + +accept 10.8083498797 80.7734576072 +expect 480582.301 11612067.445 + +accept 20.8098672542 81.2830486223 +expect 896200.874 11813880.882 + +accept 30.3588816681 81.4543384377 +expect 1287049.335 11952125.248 + +accept 40.8217587675 82.0376694327 +expect 1655654.948 12249255.684 + +accept 50.5425294111 82.6836589307 +expect 1943629.387 12583714.312 + +accept 60.1931997991 83.6237398675 +expect 2131995.937 13024459.333 + +accept 70.6113860432 84.0910108055 +expect 2365890.947 13363173.126 + +accept 80.9787521274 84.9230149078 +expect 2463890.570 13818835.453 + +accept 90.9143604315 85.3871192550 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.4734880731 86.0042464514 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.9680822795 86.3859461851 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.8622100732 87.2340544489 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.2558456040 87.3620502284 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.2081210889 87.9608446770 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.4963196965 88.3752399281 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.1141812758 89.1315428504 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.8037412086 89.6150717843 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.1602592915 90.5979873573 +expect failure errno coord_transfm_invalid_coord + +accept -179.4988010038 80.2382292021 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.7323895837 80.2920174872 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9503807693 80.8196927273 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.0925061081 81.4663152862 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.5716369758 82.4286410234 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.8787197288 82.8456226975 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.4793423714 83.5516191256 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.2664761985 84.4756117750 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.3415573570 85.3222226381 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.5621686999 86.1477384313 +expect -2328002.776 14359252.241 + +accept -79.7459074624 86.3337679988 +expect -2066809.293 14230691.128 + +accept -69.5924016054 86.7873849130 +expect -1721998.690 14226866.593 + +accept -59.3424378796 87.4693622383 +expect -1325649.584 14378063.176 + +accept -49.4008006097 87.4815472674 +expect -1116300.148 14277850.382 + +accept -39.0859175285 87.8616846009 +expect -823391.287 14385214.623 + +accept -29.4922393933 88.2891416248 +expect -560419.081 14575750.266 + +accept -19.1948975670 88.7931017780 +expect -308317.578 14881668.127 + +accept -9.7223365758 89.3832521756 +expect -112026.906 15387878.248 + +accept 0.6641448256 90.0106423220 +expect failure errno coord_transfm_invalid_coord + +accept 10.1860723801 90.3688642972 +expect failure errno coord_transfm_invalid_coord + +accept 20.9490167192 90.7173958262 +expect failure errno coord_transfm_invalid_coord + +accept 30.5649867370 90.9925163187 +expect failure errno coord_transfm_invalid_coord + +accept 40.4458702150 91.4734308311 +expect failure errno coord_transfm_invalid_coord + +accept 50.5856921606 91.9158720484 +expect failure errno coord_transfm_invalid_coord + +accept 60.1363202035 92.2767051552 +expect failure errno coord_transfm_invalid_coord + +accept 70.0710227099 93.2758942081 +expect failure errno coord_transfm_invalid_coord + +accept 80.2222434482 93.6733349750 +expect failure errno coord_transfm_invalid_coord + +accept 90.0483434140 94.4740404396 +expect failure errno coord_transfm_invalid_coord + +accept 100.6823676393 95.0641687155 +expect failure errno coord_transfm_invalid_coord + +accept 110.6403276588 95.6156935259 +expect failure errno coord_transfm_invalid_coord + +accept 120.2581625576 96.0431766104 +expect failure errno coord_transfm_invalid_coord + +accept 130.4609264126 96.4854267472 +expect failure errno coord_transfm_invalid_coord + +accept 140.6441294534 96.7262713213 +expect failure errno coord_transfm_invalid_coord + +accept 150.3252472008 97.1420609214 +expect failure errno coord_transfm_invalid_coord + +accept 160.7668616164 97.4790143988 +expect failure errno coord_transfm_invalid_coord + +accept 170.7465062128 97.6550567817 +expect failure errno coord_transfm_invalid_coord + +accept 180.7542323137 98.2872938097 +expect failure errno coord_transfm_invalid_coord + +accept -179.4933532172 89.0462961156 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8505428520 89.8903183246 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.6997771019 89.9583403191 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.2613507188 90.8395350848 +expect failure errno coord_transfm_invalid_coord + +accept -139.1842997548 91.1573946186 +expect failure errno coord_transfm_invalid_coord + +accept -129.6568991775 91.9446769249 +expect failure errno coord_transfm_invalid_coord + +accept -119.3115606256 92.6597043587 +expect failure errno coord_transfm_invalid_coord + +accept -109.6274703609 93.6500222571 +expect failure errno coord_transfm_invalid_coord + +accept -99.3955363318 93.6790731121 +expect failure errno coord_transfm_invalid_coord + +accept -89.4902277654 93.7101118679 +expect failure errno coord_transfm_invalid_coord + +accept -79.2055095189 93.8973426839 +expect failure errno coord_transfm_invalid_coord + +accept -69.2694919752 94.5715889948 +expect failure errno coord_transfm_invalid_coord + +accept -59.2096313695 94.8767204910 +expect failure errno coord_transfm_invalid_coord + +accept -49.3346426547 95.7619370286 +expect failure errno coord_transfm_invalid_coord + +accept -39.2940192313 95.9177686800 +expect failure errno coord_transfm_invalid_coord + +accept -29.1265263906 96.4025342806 +expect failure errno coord_transfm_invalid_coord + +accept -19.8149677195 96.5067828223 +expect failure errno coord_transfm_invalid_coord + +accept -9.2806942519 96.8402148749 +expect failure errno coord_transfm_invalid_coord + +accept 0.9337491530 97.5569468760 +expect failure errno coord_transfm_invalid_coord + +accept 10.2800898790 97.9514714385 +expect failure errno coord_transfm_invalid_coord + +accept 20.9290209494 98.9284832763 +expect failure errno coord_transfm_invalid_coord + +accept 30.3939457169 99.5719752144 +expect failure errno coord_transfm_invalid_coord + +accept 40.6958590705 100.0328567981 +expect failure errno coord_transfm_invalid_coord + +accept 50.1473239826 100.6776574030 +expect failure errno coord_transfm_invalid_coord + +accept 60.6429472168 100.7044060498 +expect failure errno coord_transfm_invalid_coord + +accept 70.8017862719 101.2635238404 +expect failure errno coord_transfm_invalid_coord + +accept 80.3144473172 101.9663622692 +expect failure errno coord_transfm_invalid_coord + +accept 90.7459660200 102.3134423218 +expect failure errno coord_transfm_invalid_coord + +accept 100.1161002435 103.1947683448 +expect failure errno coord_transfm_invalid_coord + +accept 110.1928396624 104.0579352787 +expect failure errno coord_transfm_invalid_coord + +accept 120.2928981698 104.8100792607 +expect failure errno coord_transfm_invalid_coord + +accept 130.4257286255 105.4176918707 +expect failure errno coord_transfm_invalid_coord + +accept 140.8110132830 105.4248870814 +expect failure errno coord_transfm_invalid_coord + +accept 150.8802025406 106.2350153626 +expect failure errno coord_transfm_invalid_coord + +accept 160.3540927190 106.6211948814 +expect failure errno coord_transfm_invalid_coord + +accept 170.1006211763 106.7429949781 +expect failure errno coord_transfm_invalid_coord + +accept 180.9080349563 107.0582862622 +expect failure errno coord_transfm_invalid_coord + + diff --git a/conformance/src/test/resources/gie/adams_ws1.gie b/conformance/src/test/resources/gie/adams_ws1.gie new file mode 100644 index 0000000..3593fe1 --- /dev/null +++ b/conformance/src/test/resources/gie/adams_ws1.gie @@ -0,0 +1,2121 @@ + + +------------------------------------------------------------ +# This gie file was automatically generated using libproject +# where the adams_ws1 code was adapted from +------------------------------------------------------------ + +------------------------------------------------------------ +operation +proj=adams_ws1 +R=6370997 +tolerance 1 mm +------------------------------------------------------------ +accept -179.5170670673 -90.3642618405 +expect failure errno coord_transfm_invalid_coord + +accept -169.6193301609 -90.0089826784 +expect failure errno coord_transfm_invalid_coord + +accept -159.5146913398 -89.9552061084 +expect -350717.162 -11748881.092 + +accept -149.6430387202 -89.4598171312 +expect -1198165.030 -11484132.922 + +accept -139.3420792457 -88.5689205573 +expect -1900383.673 -11089869.954 + +accept -129.5512190326 -88.2843232228 +expect -2002093.387 -10839580.396 + +accept -119.5849519031 -87.8113050000 +expect -2149637.897 -10510603.217 + +accept -109.8164701029 -87.6292839331 +expect -2103837.772 -10270387.260 + +accept -99.0070325468 -87.4860856350 +expect -1996207.278 -10030480.328 + +accept -89.8710202810 -87.0734859278 +expect -1978905.833 -9725415.443 + +accept -79.9177626050 -86.8409810985 +expect -1848776.887 -9483178.045 + +accept -69.6832972131 -86.4913255195 +expect -1709649.451 -9206995.664 + +accept -59.5324497291 -86.3836989068 +expect -1493076.994 -9040595.732 + +accept -49.7885614755 -86.1711430633 +expect -1288297.308 -8857404.772 + +accept -39.2736625770 -85.9311099723 +expect -1048159.783 -8676577.940 + +accept -29.9883661697 -85.1267277663 +expect -864602.075 -8328578.049 + +accept -19.7354612657 -84.2995572008 +expect -606385.822 -8009717.908 + +accept -9.8320712389 -83.8158727667 +expect -311874.893 -7833551.758 + +accept 0.1529149340 -83.6786769068 +expect 4891.700 -7783359.345 + +accept 10.8075764102 -83.0220228165 +expect 358525.175 -7610748.071 + +accept 20.2756666263 -82.4050031966 +expect 693297.426 -7478128.281 + +accept 30.5717416484 -82.1078093242 +expect 1059291.615 -7458462.299 + +accept 40.0217776423 -81.4996688835 +expect 1423231.064 -7381432.285 + +accept 50.4439084395 -80.9178750042 +expect 1835831.195 -7348906.778 + +accept 60.2928202530 -80.8948879488 +expect 2195784.908 -7466766.931 + +accept 70.1422375374 -79.9793295792 +expect 2644125.293 -7411053.135 + +accept 80.0281082734 -79.9307378831 +expect 3023172.557 -7577579.052 + +accept 90.1359566782 -79.0548748136 +expect 3514571.202 -7604717.836 + +accept 100.9983207780 -78.4899667014 +expect 4020295.243 -7757494.376 + +accept 110.7127101938 -77.8772548871 +expect 4506704.120 -7915020.711 + +accept 120.9499015457 -77.6414595729 +expect 4975451.712 -8212762.236 + +accept 130.7914974914 -77.0932634434 +expect 5498089.726 -8493219.908 + +accept 140.6080188527 -77.0119938017 +expect 5942639.654 -8934467.649 + +accept 150.6995918182 -76.9369794197 +expect 6388836.279 -9482287.585 + +accept 160.9763179459 -76.4102449261 +expect 6955592.369 -10093789.725 + +accept 170.5761545704 -76.3749705670 +expect 7276212.519 -10898661.639 + +accept 180.4778073139 -75.5923496826 +expect -7735120.306 -11759677.243 + +accept -179.9594024463 -79.1850172406 +expect -6267808.862 -11809346.696 + +accept -169.3792405914 -78.6847392352 +expect -6375466.776 -11010285.716 + +accept -159.3418105960 -77.9452575038 +expect -6399742.566 -10210740.446 + +accept -149.6506452375 -77.3145139162 +expect -6244446.337 -9487525.415 + +accept -139.5282281225 -76.8064299491 +expect -5941042.263 -8840534.760 + +accept -129.3590935485 -75.8784716103 +expect -5652577.184 -8195427.069 + +accept -119.3829013254 -75.5762740726 +expect -5225585.846 -7754976.336 + +accept -109.0050595456 -74.8490162848 +expect -4822333.815 -7284106.174 + +accept -99.6562286237 -73.8531237046 +expect -4472856.920 -6851420.623 + +accept -89.4153824527 -73.5246290838 +expect -4008400.544 -6558443.533 + +accept -79.6133647306 -73.1453487971 +expect -3570120.993 -6303696.366 + +accept -69.6398208021 -72.3341230538 +expect -3146057.888 -6010826.112 + +accept -59.8706106341 -71.3971340090 +expect -2728166.758 -5736410.313 + +accept -49.3205605438 -70.7335340397 +expect -2256529.742 -5524593.729 + +accept -39.3411926381 -70.6365159073 +expect -1795311.675 -5424479.920 + +accept -29.5083854002 -70.4758592857 +expect -1345403.678 -5337336.817 + +accept -19.0279013677 -70.0084283415 +expect -870594.276 -5225973.870 + +accept -9.2887899729 -69.7394095461 +expect -425827.654 -5164538.802 + +accept 0.8271647968 -69.2722085113 +expect 38107.829 -5095338.557 + +accept 10.4036887646 -68.3592860451 +expect 484296.312 -4988000.264 + +accept 20.2060343192 -68.2238727038 +expect 943249.674 -4997881.278 + +accept 30.5698496420 -67.8806308159 +expect 1435688.678 -5002119.817 + +accept 40.1495377913 -67.4553827915 +expect 1899965.927 -5010162.059 + +accept 50.3602778968 -67.0362523329 +expect 2404182.204 -5042085.202 + +accept 60.9974900881 -66.4077946779 +expect 2947890.396 -5072684.473 + +accept 70.9319955374 -65.8210021247 +expect 3471665.520 -5121479.201 + +accept 80.4863012420 -65.1950301635 +expect 3994821.648 -5179465.208 + +accept 90.6983519178 -64.8794465969 +expect 4561938.454 -5308162.118 + +accept 100.9396101906 -64.2819828297 +expect 5168400.393 -5424158.734 + +accept 110.3740821515 -63.7921797585 +expect 5753378.431 -5559987.662 + +accept 120.9952802105 -63.1814589291 +expect 6456367.698 -5728557.242 + +accept 130.5262638944 -62.9745552631 +expect 7113536.253 -5951928.183 + +accept 140.8208531113 -62.1723630793 +expect 7922447.639 -6121121.677 + +accept 150.0998916715 -61.6016244915 +expect 8715442.276 -6298866.943 + +accept 160.9286198483 -61.2084726717 +expect 9734201.834 -6531135.754 + +accept 170.5710819967 -60.6197664775 +expect 10759563.471 -6612968.425 + +accept 180.0430694902 -60.0407055339 +expect -11807509.426 -6558808.816 + +accept -179.5390947423 -69.0648460645 +expect -11698244.368 -9734562.708 + +accept -169.1901512061 -68.4729959428 +expect -9950971.024 -8797882.041 + +accept -159.9508405867 -68.3071525125 +expect -8958082.142 -8161514.970 + +accept -149.8939906743 -67.9903394603 +expect -8122002.603 -7560968.287 + +accept -139.3084750889 -67.6932300903 +expect -7358441.192 -7046235.673 + +accept -129.4903340896 -66.9738174802 +expect -6754279.469 -6566632.394 + +accept -119.3732549373 -66.1666702364 +expect -6167465.568 -6131803.466 + +accept -109.9122840717 -65.4626199327 +expect -5635053.049 -5784623.911 + +accept -99.0894792417 -64.9328397796 +expect -5031244.298 -5474194.879 + +accept -89.0379071438 -63.9724755049 +expect -4506394.832 -5162764.903 + +accept -79.8512236201 -63.1650388913 +expect -4030262.713 -4918826.251 + +accept -69.0024968791 -62.7959282508 +expect -3459473.930 -4731573.132 + +accept -59.6285901198 -62.7061946763 +expect -2970786.932 -4617341.636 + +accept -49.7082574527 -62.1571694174 +expect -2471206.184 -4465370.277 + +accept -39.4924979763 -61.7459110848 +expect -1958931.958 -4346771.831 + +accept -29.6363032106 -61.6957692779 +expect -1464984.333 -4287075.197 + +accept -19.5739110331 -61.6019886294 +expect -965552.532 -4238215.163 + +accept -9.6576498976 -61.0164571209 +expect -477467.663 -4155301.252 + +accept 0.9700961170 -60.1204628592 +expect 48205.814 -4057834.175 + +accept 10.7639703855 -59.1654390696 +expect 538264.315 -3972144.031 + +accept 20.0541166979 -58.2221709542 +expect 1009809.314 -3901769.484 + +accept 30.8822551157 -57.4323767288 +expect 1566666.238 -3866147.789 + +accept 40.9150221936 -56.7476936019 +expect 2091877.250 -3852786.699 + +accept 50.0130584672 -56.6268047719 +expect 2571289.842 -3900890.372 + +accept 60.1810460294 -56.5806776760 +expect 3115889.942 -3978273.297 + +accept 70.0095293626 -56.4903844848 +expect 3655288.464 -4064302.468 + +accept 80.2965290229 -56.4254295515 +expect 4235148.992 -4174494.751 + +accept 90.0684823849 -55.5094217862 +expect 4825173.693 -4205785.231 + +accept 100.2589575221 -54.7080863095 +expect 5463679.888 -4267283.094 + +accept 110.9472297773 -54.0819702617 +expect 6161497.112 -4367866.466 + +accept 120.8869363890 -53.8315420800 +expect 6836546.011 -4509924.510 + +accept 130.9603256931 -53.6395383232 +expect 7559494.803 -4670554.878 + +accept 140.1257246691 -53.4446807335 +expect 8259667.150 -4816997.141 + +accept 150.2071621174 -52.9722495199 +expect 9089603.867 -4934074.676 + +accept 160.6088986258 -52.1795359483 +expect 10009756.247 -4978006.469 + +accept 170.2183758483 -51.5758826477 +expect 10895284.078 -4985209.390 + +accept 180.3089859974 -51.2476311235 +expect -11783292.311 -4970550.366 + +accept -179.3405213764 -59.1949594465 +expect -11740654.113 -6374577.500 + +accept -169.0421166099 -59.1562784619 +expect -10642169.105 -6280796.295 + +accept -159.3788558458 -58.9714540198 +expect -9692814.995 -6062325.471 + +accept -149.0662979992 -58.4548170890 +expect -8795516.955 -5733211.410 + +accept -139.3706367143 -58.1144715199 +expect -8025985.315 -5449082.903 + +accept -129.1106150079 -57.8422608500 +expect -7273101.480 -5175957.712 + +accept -119.2867946872 -57.5287479364 +expect -6602894.857 -4927624.634 + +accept -109.8617968496 -56.9893254243 +expect -6002387.156 -4682302.572 + +accept -99.4159322812 -56.2424930053 +expect -5370022.362 -4421472.280 + +accept -89.1699101036 -56.1663221081 +expect -4755991.161 -4262687.067 + +accept -79.7513340456 -55.7410486547 +expect -4218798.697 -4097773.078 + +accept -69.3859719372 -55.4898494102 +expect -3639082.164 -3958567.253 + +accept -59.6570132581 -54.5322069534 +expect -3118583.817 -3776942.947 + +accept -49.1598655048 -54.4599218486 +expect -2552713.105 -3691062.494 + +accept -39.1574191031 -54.3046314680 +expect -2023877.704 -3616745.668 + +accept -29.6721934217 -53.6562199308 +expect -1531972.573 -3515412.233 + +accept -19.8662059139 -53.4687850046 +expect -1023531.105 -3467209.179 + +accept -9.5466027093 -53.0271646961 +expect -491871.463 -3409466.748 + +accept 0.5571469345 -53.0212050870 +expect 28691.149 -3403138.420 + +accept 10.2150991679 -52.8267091529 +expect 526790.549 -3393151.184 + +accept 20.9184560187 -52.1945236902 +expect 1083680.938 -3360440.100 + +accept 30.4122790805 -51.8430079370 +expect 1582353.162 -3361293.005 + +accept 40.9466629257 -51.6378144374 +expect 2141968.613 -3391259.162 + +accept 50.9012994718 -51.6157642742 +expect 2677989.259 -3447645.551 + +accept 60.2635223516 -50.8239592102 +expect 3201005.434 -3444708.197 + +accept 70.3461813446 -50.7667566814 +expect 3768769.080 -3523960.462 + +accept 80.9078900718 -50.1766356883 +expect 4389398.947 -3573130.194 + +accept 90.1074711799 -49.9117875315 +expect 4944447.058 -3649776.255 + +accept 100.1252105382 -48.9204454031 +expect 5584999.550 -3676552.405 + +accept 110.8672357396 -48.1515257195 +expect 6298134.023 -3741552.205 + +accept 120.3694000933 -47.4449038605 +expect 6960325.242 -3800735.139 + +accept 130.4622216350 -47.1679496656 +expect 7689059.250 -3914199.981 + +accept 140.5086830302 -47.1237216006 +expect 8449190.695 -4050734.799 + +accept 150.1476683134 -46.3595419843 +expect 9231198.383 -4086961.656 + +accept 160.2556473416 -46.2916624279 +expect 10076699.984 -4186410.441 + +accept 170.8522091884 -46.1574282136 +expect 10999670.471 -4243488.850 + +accept 180.2570720688 -46.0614416637 +expect -11789409.557 -4252598.873 + +accept -179.4511464235 -49.1459116777 +expect -11761990.229 -4665890.121 + +accept -169.9257769945 -49.0470611950 +expect -10894262.669 -4621088.416 + +accept -159.9907938476 -48.8074825653 +expect -10017224.172 -4504606.959 + +accept -149.4585690847 -48.4774901965 +expect -9135164.524 -4334099.962 + +accept -139.2453966436 -47.8692552329 +expect -8335827.552 -4118376.932 + +accept -129.9085174848 -46.8854494051 +expect -7654250.412 -3875947.564 + +accept -119.8893057705 -46.5651334714 +expect -6944562.132 -3704152.951 + +accept -109.0958379349 -45.7583483056 +expect -6225548.239 -3485487.807 + +accept -99.2790124089 -45.4028322295 +expect -5592633.486 -3337133.510 + +accept -89.5363705206 -44.7944152576 +expect -4990785.214 -3180396.161 + +accept -79.5060440658 -44.5224968249 +expect -4385934.870 -3064005.444 + +accept -69.4515180819 -43.5521936119 +expect -3804302.240 -2904123.456 + +accept -59.1288687363 -42.8251932286 +expect -3217542.420 -2777920.839 + +accept -49.5480487278 -42.2232882391 +expect -2682493.692 -2679394.683 + +accept -39.1528197403 -42.0524649460 +expect -2108296.850 -2621044.912 + +accept -29.4378045622 -41.1418430583 +expect -1582000.485 -2522351.315 + +accept -19.7178288379 -40.6492312711 +expect -1057685.973 -2464591.380 + +accept -9.4090896450 -40.5893893271 +expect -503836.212 -2446387.785 + +accept 0.9610981916 -39.6877677601 +expect 51540.292 -2379140.432 + +accept 10.9883708721 -39.3404897159 +expect 590154.416 -2360351.587 + +accept 20.8051789783 -39.1539543744 +expect 1120024.260 -2361313.374 + +accept 30.4192741493 -38.5008875049 +expect 1644931.536 -2337542.552 + +accept 40.3869890035 -37.5480251892 +expect 2197952.841 -2301604.532 + +accept 50.8557015620 -37.0223436721 +expect 2787383.069 -2305516.111 + +accept 60.6790393928 -36.1726044193 +expect 3354525.829 -2291237.179 + +accept 70.2878480471 -35.4333317594 +expect 3922441.096 -2289959.081 + +accept 80.5852221343 -34.7195179750 +expect 4547835.373 -2300447.284 + +accept 90.8953318146 -34.0606127868 +expect 5194014.701 -2320692.817 + +accept 100.1645347304 -33.2806968649 +expect 5796224.654 -2327994.783 + +accept 110.9256034679 -32.3021983595 +expect 6521787.796 -2332216.561 + +accept 120.5411285918 -31.9198181206 +expect 7190613.992 -2375521.402 + +accept 130.2284841486 -31.5333210976 +expect 7889339.253 -2417443.002 + +accept 140.4220823477 -30.6970967059 +expect 8655106.833 -2418067.478 + +accept 150.9227263702 -30.4375246674 +expect 9466130.022 -2460197.858 + +accept 160.0295580243 -29.5659253879 +expect 10191991.350 -2424567.041 + +accept 170.6808093605 -29.1021932503 +expect 11052824.977 -2413781.540 + +accept 180.1099977864 -29.0325047616 +expect -11803327.121 -2416468.990 + +accept -179.6225370823 -39.8953975091 +expect -11780081.121 -3517460.085 + +accept -169.6109651378 -39.4882092166 +expect -10930063.239 -3453245.362 + +accept -159.1192163384 -39.1718824306 +expect -10057200.020 -3364669.762 + +accept -149.1119232566 -38.9176058199 +expect -9251011.551 -3261533.260 + +accept -139.5731057891 -38.9121786221 +expect -8508507.983 -3173185.997 + +accept -129.7628486402 -38.0200948217 +expect -7786640.589 -2991489.483 + +accept -119.7677289390 -37.8134438608 +expect -7073265.858 -2874240.367 + +accept -109.1746441433 -36.9333699237 +expect -6356287.199 -2698249.042 + +accept -99.9602516727 -36.5407037317 +expect -5751426.148 -2585442.621 + +accept -89.8203767870 -35.5930072217 +expect -5112766.564 -2430581.015 + +accept -79.3526596151 -35.2401507154 +expect -4468536.158 -2331237.714 + +accept -69.9140939731 -34.4711213307 +expect -3906901.211 -2218161.925 + +accept -59.5564783999 -33.9615774789 +expect -3302614.749 -2129304.529 + +accept -49.4856159772 -33.3921969402 +expect -2727641.771 -2047863.180 + +accept -39.5601849133 -33.2219810003 +expect -2168968.599 -2003059.820 + +accept -29.6206503521 -32.2387656553 +expect -1619499.618 -1912794.298 + +accept -19.8260643144 -31.2411754077 +expect -1082312.059 -1831061.273 + +accept -9.6980379834 -31.1493347964 +expect -528492.040 -1814844.632 + +accept 0.1021998532 -30.2109056883 +expect 5573.607 -1752134.034 + +accept 10.1241618952 -30.0590713215 +expect 552610.811 -1745957.315 + +accept 20.7210235248 -29.1582457860 +expect 1134768.700 -1699801.253 + +accept 30.8569113997 -28.5816818553 +expect 1696753.177 -1680040.760 + +accept 40.8690942845 -28.2388918529 +expect 2258557.806 -1680827.372 + +accept 50.7976512101 -28.0352374493 +expect 2824229.726 -1696198.158 + +accept 60.6880476492 -27.3593892155 +expect 3400671.784 -1686010.997 + +accept 70.3971704737 -26.5193483221 +expect 3980673.819 -1668358.964 + +accept 80.7537743358 -25.6284840207 +expect 4616331.727 -1653268.127 + +accept 90.9008404807 -25.6193405937 +expect 5253601.247 -1701776.097 + +accept 100.6019282805 -25.1073764643 +expect 5885059.255 -1715983.750 + +accept 110.2074536086 -24.7371256820 +expect 6529985.921 -1741419.588 + +accept 120.8735021013 -24.6200753121 +expect 7269663.058 -1792634.308 + +accept 130.3337268181 -24.1982546793 +expect 7950714.246 -1812019.053 + +accept 140.0292803756 -24.1036603231 +expect 8668942.211 -1854994.840 + +accept 150.2932445511 -23.9158664525 +expect 9452746.490 -1886388.628 + +accept 160.0080010509 -23.0912677563 +expect 10215210.151 -1850466.772 + +accept 170.5235832568 -22.1201165276 +expect 11053033.448 -1789486.248 + +accept 180.6560052356 -22.0885409872 +expect -11759672.392 -1793318.350 + +accept -179.4804785664 -29.6306479674 +expect -11769827.502 -2472486.935 + +accept -169.5969137916 -29.4470720507 +expect -10963965.497 -2443636.516 + +accept -159.7905342089 -29.3575038499 +expect -10173853.235 -2404475.146 + +accept -149.0451837035 -29.3191918216 +expect -9326864.232 -2349131.811 + +accept -139.2634124047 -29.2174079662 +expect -8578812.250 -2281416.940 + +accept -129.4780322813 -29.1095444632 +expect -7854782.176 -2207222.010 + +accept -119.0212234055 -28.1534517213 +expect -7115133.213 -2058739.607 + +accept -109.3989071392 -27.9851170141 +expect -6453382.370 -1982663.067 + +accept -99.1605926399 -27.3804651341 +expect -5776201.695 -1874182.968 + +accept -89.1612152313 -27.3765954441 +expect -5132743.215 -1817444.101 + +accept -79.5274133946 -26.6685619062 +expect -4535248.349 -1719079.927 + +accept -69.2474535764 -26.1885685364 +expect -3913186.952 -1641486.835 + +accept -59.9970146255 -26.1431540924 +expect -3365047.885 -1603639.182 + +accept -49.7059448492 -25.7380450818 +expect -2769264.371 -1544962.373 + +accept -39.1015835447 -24.9244904554 +expect -2167463.036 -1467333.079 + +accept -29.0839025659 -24.0290019262 +expect -1606736.238 -1393727.229 + +accept -19.0559621671 -23.5834403073 +expect -1050009.512 -1354116.104 + +accept -9.4796954418 -22.7008051540 +expect -521897.404 -1294226.360 + +accept 0.8467653094 -22.2437237249 +expect 46612.070 -1264810.191 + +accept 10.1002957100 -21.4069947198 +expect 556780.318 -1217517.853 + +accept 20.6390095332 -21.0427895850 +expect 1140438.287 -1203323.480 + +accept 30.9472401536 -20.1902202762 +expect 1717070.228 -1164328.832 + +accept 40.6934322431 -20.0098914684 +expect 2268176.645 -1168727.630 + +accept 50.7817131415 -19.2822125520 +expect 2848736.826 -1144124.118 + +accept 60.5453409920 -18.5217559886 +expect 3421842.893 -1119498.292 + +accept 70.9306917526 -17.5496804837 +expect 4046179.805 -1085105.639 + +accept 80.9437168988 -16.8999064340 +expect 4663411.774 -1071645.011 + +accept 90.2760894813 -16.3256791261 +expect 5254544.808 -1062173.444 + +accept 100.3952892244 -15.3687880606 +expect 5915778.505 -1029396.074 + +accept 110.8716860238 -15.1135676547 +expect 6620486.296 -1045435.781 + +accept 120.2754329194 -14.7635849177 +expect 7273908.238 -1050938.104 + +accept 130.9205644215 -13.8870075430 +expect 8038711.991 -1019018.441 + +accept 140.5279151075 -13.8598832588 +expect 8747404.377 -1043857.108 + +accept 150.1724830315 -13.4001676763 +expect 9478091.722 -1031350.442 + +accept 160.7119668695 -12.8946537206 +expect 10293471.165 -1010309.510 + +accept 170.7445455520 -12.4806498073 +expect 11080986.451 -987879.955 + +accept 180.0860875981 -12.0984902614 +expect -11805496.888 -960233.297 + +accept -179.3916734336 -19.7014586301 +expect -11763712.607 -1588768.200 + +accept -169.6454904074 -19.4996536478 +expect -10986824.032 -1564928.001 + +accept -159.3116700662 -18.9771320814 +expect -10172088.280 -1502117.477 + +accept -149.2431319392 -18.5239809302 +expect -9392904.689 -1437107.722 + +accept -139.9543854131 -18.2509646291 +expect -8690226.526 -1383821.794 + +accept -129.7568071343 -17.3990196444 +expect -7942027.033 -1280164.910 + +accept -119.1614046516 -16.8619769504 +expect -7188040.064 -1200364.046 + +accept -109.2977430033 -16.3891311149 +expect -6508726.059 -1130383.184 + +accept -99.9990872016 -15.4549241428 +expect -5889334.034 -1034038.536 + +accept -89.1925625691 -14.8368103445 +expect -5189840.029 -960130.042 + +accept -79.0808010606 -14.6385640035 +expect -4553964.924 -920479.551 + +accept -69.2443866324 -14.1456687273 +expect -3952562.317 -866676.412 + +accept -59.0066198816 -13.5814519067 +expect -3341600.979 -812246.810 + +accept -49.6855331551 -13.0942516406 +expect -2796564.477 -768323.810 + +accept -39.1133813450 -12.2378694514 +expect -2189428.295 -705006.114 + +accept -29.7742120709 -11.7887487551 +expect -1660234.233 -670669.573 + +accept -19.9711155501 -11.6767395032 +expect -1110226.679 -658130.627 + +accept -9.9497447301 -11.3258048935 +expect -552158.854 -634498.402 + +accept 0.5509033260 -11.1626324486 +expect 30555.312 -624081.026 + +accept 10.5660459562 -10.2780961917 +expect 586666.653 -575356.975 + +accept 20.2035769485 -9.2879705389 +expect 1124313.735 -522411.222 + +accept 30.1804649932 -8.9615586081 +expect 1685072.306 -508721.741 + +accept 40.7493880077 -8.5624561325 +expect 2286291.364 -492777.586 + +accept 50.2789516772 -8.3745080127 +expect 2836608.706 -489680.573 + +accept 60.8385203257 -8.2963597858 +expect 3457824.160 -495534.087 + +accept 70.9443512805 -8.0934149371 +expect 4066101.521 -494895.161 + +accept 80.2007278148 -7.3297477878 +expect 4637580.892 -458880.962 + +accept 90.2330138853 -6.3835404074 +expect 5273690.558 -410871.266 + +accept 100.0849613278 -5.7704772952 +expect 5916391.051 -382372.515 + +accept 110.4993556234 -5.2096342892 +expect 6616996.779 -356342.641 + +accept 120.8300166158 -4.8886947314 +expect 7334310.897 -345088.331 + +accept 130.0108888901 -4.6741162050 +expect 7990761.455 -338928.560 + +accept 140.0244639639 -4.5796883247 +expect 8726333.645 -341133.044 + +accept 150.2062193251 -3.8424983415 +expect 9493863.039 -292863.578 + +accept 160.9138221527 -3.6801453162 +expect 10317707.231 -285699.001 + +accept 170.8709639263 -3.0673481366 +expect 11095020.712 -240557.828 + +accept 180.1668965748 -2.1055585251 +expect -11799179.686 -165599.448 + +accept -179.1485401294 -9.0050262787 +expect -11745147.622 -711689.062 + +accept -169.6824431551 -8.1575200565 +expect -11000115.042 -641511.177 + +accept -159.6715880943 -7.6221099815 +expect -10218824.936 -592292.988 + +accept -149.3051183917 -7.4397903953 +expect -9422033.576 -567343.940 + +accept -139.2134827169 -6.9710994505 +expect -8663402.254 -519006.901 + +accept -129.2596978253 -6.6939068551 +expect -7934011.410 -484946.005 + +accept -119.6918931722 -6.2610035871 +expect -7252563.925 -440785.572 + +accept -109.4245072379 -5.7027048567 +expect -6543136.053 -388878.776 + +accept -99.0230201699 -5.3407381847 +expect -5846751.038 -352675.119 + +accept -89.3070231490 -5.1039965720 +expect -5215688.995 -327406.437 + +accept -79.7971543944 -4.4916537572 +expect -4615264.044 -280462.038 + +accept -69.3324157511 -3.9437385342 +expect -3971856.878 -239654.016 + +accept -59.5648134684 -3.8977574735 +expect -3385627.891 -231608.529 + +accept -49.0877260741 -3.6480235522 +expect -2770346.534 -212306.063 + +accept -39.8261302552 -3.1309666481 +expect -2236162.052 -179431.131 + +accept -29.9044251723 -2.1430339033 +expect -1671913.963 -121205.794 + +accept -19.0798027396 -1.2466271084 +expect -1063209.017 -69795.001 + +accept -9.7521679387 -1.0322328827 +expect -542511.865 -57496.172 + +accept 0.9430496675 -0.6908437587 +expect 52430.968 -38410.610 + +accept 10.9467094331 -0.6297633697 +expect 609067.346 -35093.759 + +accept 20.4348082857 0.1325785640 +expect 1139135.679 7429.710 + +accept 30.7578824509 0.9786091010 +expect 1720312.179 55393.172 + +accept 40.1304133943 1.3184899313 +expect 2253938.856 75567.836 + +accept 50.6339926465 1.7803646722 +expect 2860936.487 103859.561 + +accept 60.7806464601 1.9656672403 +expect 3458637.676 117050.207 + +accept 70.1424618467 2.0349290359 +expect 4021938.226 123840.505 + +accept 80.3515740385 2.0389166997 +expect 4651228.515 127409.428 + +accept 90.5030006919 2.6127341537 +expect 5294231.959 168032.745 + +accept 100.0361988664 2.7788325854 +expect 5915751.683 183883.148 + +accept 110.4290203898 3.4171783192 +expect 6613830.450 233508.030 + +accept 120.0868391150 4.1107421068 +expect 7282720.013 289418.148 + +accept 130.8358443481 4.7269030447 +expect 8050540.773 343566.765 + +accept 140.4771116425 4.7459157253 +expect 8759896.875 353947.419 + +accept 150.6050881294 4.8179867316 +expect 9523608.686 367693.374 + +accept 160.2822850737 4.8901762814 +expect 10268142.143 379540.358 + +accept 170.8847288206 5.6488167761 +expect 11095489.666 443644.671 + +accept 180.4963027772 6.1617137742 +expect -11773225.028 485642.177 + +accept -179.7711795627 0.4973936135 +expect -11794312.860 39108.932 + +accept -169.1314097124 1.1380806183 +expect -10958975.952 89092.114 + +accept -159.9956088875 1.3785514183 +expect -10247153.847 106804.510 + +accept -149.5081205584 1.7169216947 +expect -9441654.288 130579.933 + +accept -139.3350755264 2.6978007803 +expect -8676365.930 200450.001 + +accept -129.9999093970 3.1714349364 +expect -7991182.579 229813.581 + +accept -119.2025789331 3.1937958085 +expect -7221314.251 224181.555 + +accept -109.2754065272 3.9790540663 +expect -6534751.689 270991.754 + +accept -99.2176596815 4.4421245388 +expect -5860471.809 293385.606 + +accept -89.3282286284 4.7715139132 +expect -5217353.706 306050.669 + +accept -79.7812956950 5.1451934064 +expect -4613741.333 321348.393 + +accept -69.9603490759 5.4631533571 +expect -4008936.444 332711.261 + +accept -59.2124036536 5.9473211127 +expect -3363430.499 353449.079 + +accept -49.1946821277 6.3240504109 +expect -2775155.416 368554.729 + +accept -39.5188729974 7.1419837480 +expect -2216820.895 409863.534 + +accept -29.1883557585 7.8744650207 +expect -1629648.240 446150.067 + +accept -19.1594428055 8.7442679237 +expect -1066133.170 491231.789 + +accept -9.5636574635 9.2026796862 +expect -531158.530 514475.669 + +accept 0.0205997186 9.2921681107 +expect 1143.393 518613.658 + +accept 10.6474003585 9.3325749918 +expect 591403.379 522011.049 + +accept 20.0440697721 9.7920834357 +expect 1115183.582 550935.839 + +accept 30.1210940174 10.3126985648 +expect 1680869.076 586066.073 + +accept 40.9703333564 10.5122361845 +expect 2297293.386 606203.052 + +accept 50.1242819935 10.7592956093 +expect 2825113.486 630238.088 + +accept 60.5237375468 11.0581832240 +expect 3435579.925 661638.044 + +accept 70.0186459905 11.8235504151 +expect 4004121.295 723779.234 + +accept 80.3592940251 12.0855798348 +expect 4639465.013 760177.897 + +accept 90.5376970710 12.9622135342 +expect 5281027.214 840054.684 + +accept 100.6214357026 12.9800321873 +expect 5937912.442 867143.481 + +accept 110.6668058012 13.4013916345 +expect 6611924.171 924135.479 + +accept 120.8660619260 13.6620144115 +expect 7319051.165 972687.117 + +accept 130.0979222590 14.6001907539 +expect 7976726.161 1070012.208 + +accept 140.4720834014 14.9027374310 +expect 8740255.766 1124185.971 + +accept 150.7487344905 15.7591910245 +expect 9516541.903 1219443.082 + +accept 160.7309215820 16.6928847546 +expect 10288334.979 1317274.424 + +accept 170.7171183093 17.1256054857 +expect 11074727.024 1367681.457 + +accept 180.0522042065 17.7180717900 +expect -11808147.730 1421784.637 + +accept -179.7714315704 10.4228351993 +expect -11794256.988 825223.859 + +accept -169.5070586751 10.6771709914 +expect -10984834.587 842079.978 + +accept -159.4580308434 11.3886412993 +expect -10198009.570 888630.633 + +accept -149.0300160729 12.0779530345 +expect -9393645.594 925474.868 + +accept -139.9457181785 13.0366592822 +expect -8706116.490 979150.471 + +accept -129.2494581925 13.4021731716 +expect -7918892.896 978007.743 + +accept -119.6924991127 13.6081016459 +expect -7236591.544 965299.698 + +accept -109.9549521935 14.0589477898 +expect -6561371.199 968205.406 + +accept -99.7560216207 14.8951827161 +expect -5875106.633 995021.878 + +accept -89.4929629341 14.9878946198 +expect -5208590.397 970965.202 + +accept -79.7718646359 15.7860515996 +expect -4593786.261 996113.294 + +accept -69.1787032576 16.1396339481 +expect -3943904.709 991435.170 + +accept -59.5415515235 16.9323624559 +expect -3366393.956 1018559.978 + +accept -49.4027735513 17.7467818790 +expect -2772187.794 1047604.534 + +accept -39.4592345235 18.6907045458 +expect -2200328.007 1087110.348 + +accept -29.3138791949 19.4420397181 +expect -1626432.141 1117581.487 + +accept -19.0263697499 20.4143066442 +expect -1051476.817 1164568.814 + +accept -9.3715816928 21.0493545179 +expect -516728.380 1196014.238 + +accept 0.8183051284 21.2475093875 +expect 45086.676 1205740.085 + +accept 10.2436153128 21.9004386412 +expect 564436.455 1246884.830 + +accept 20.9411485051 22.8923059091 +expect 1155233.946 1314342.262 + +accept 30.8909786046 23.0333873010 +expect 1709465.640 1335784.571 + +accept 40.6622924750 23.1458260628 +expect 2259937.246 1360334.792 + +accept 50.2165426895 23.2813833636 +expect 2805957.899 1390914.743 + +accept 60.2763462023 24.1180873989 +expect 3388956.040 1473204.648 + +accept 70.9671286324 24.5104273631 +expect 4023912.266 1536627.432 + +accept 80.1106583316 25.2622593363 +expect 4578414.346 1625284.387 + +accept 90.1352434237 25.7041000035 +expect 5204358.499 1703872.872 + +accept 100.7659799608 26.3884977784 +expect 5887972.662 1810511.107 + +accept 110.3627285832 26.5971550981 +expect 6528536.584 1882676.289 + +accept 120.5747336187 27.3361344725 +expect 7230359.893 2003955.277 + +accept 130.0334936740 27.5388791002 +expect 7906998.039 2080891.049 + +accept 140.6618802190 27.9206554725 +expect 8693452.038 2178619.988 + +accept 150.8057175364 28.8815698894 +expect 9466666.514 2319595.955 + +accept 160.9794787031 29.3286919896 +expect 10269064.515 2406494.682 + +accept 170.8635008015 30.0881534347 +expect 11065436.193 2506392.939 + +accept 180.7801778816 30.7919429173 +expect -11748279.400 2582524.107 + +accept -179.3089746696 20.7349232283 +expect -11757005.796 1676812.324 + +accept -169.3508199207 21.5333791040 +expect -10960347.629 1737356.209 + +accept -159.4055152547 22.3252032326 +expect -10170125.304 1783292.652 + +accept -149.8454884475 22.4734039129 +expect -9424453.386 1763417.112 + +accept -139.3941906099 23.1082873232 +expect -8626570.035 1770372.898 + +accept -129.6731808706 24.0100345748 +expect -7903751.181 1793442.280 + +accept -119.5653357447 24.9154429650 +expect -7175704.391 1808079.370 + +accept -109.4049571753 25.6530253182 +expect -6469736.987 1805594.553 + +accept -99.2573928302 26.1761469511 +expect -5790274.499 1786445.122 + +accept -89.1936009216 26.8478033007 +expect -5137966.077 1779983.008 + +accept -79.9319952951 27.0219083563 +expect -4558285.962 1745405.889 + +accept -69.7891755607 27.9650852011 +expect -3937249.698 1763328.521 + +accept -59.9224508827 28.7378521521 +expect -3349925.184 1774568.738 + +accept -49.2934775668 29.7032670105 +expect -2731923.368 1800437.192 + +accept -39.7585640043 30.6226892016 +expect -2188798.477 1831989.503 + +accept -29.7786441638 31.0043819908 +expect -1631282.400 1832903.391 + +accept -19.9767642691 31.2638249380 +expect -1090543.436 1832723.009 + +accept -9.4508778589 31.3720263871 +expect -514837.245 1828891.334 + +accept 0.9277524134 31.4797046691 +expect 50503.011 1832688.099 + +accept 10.8523072346 31.6410734176 +expect 591047.237 1847096.134 + +accept 20.9701082341 32.0077728355 +expect 1143775.602 1882087.570 + +accept 30.4584904014 32.2524388516 +expect 1665803.096 1915504.146 + +accept 40.6480244298 32.2809624159 +expect 2233201.781 1943617.167 + +accept 50.8580656871 32.6668467052 +expect 2809043.442 2003759.375 + +accept 60.0108771272 33.5702558206 +expect 3331147.200 2104097.315 + +accept 70.5034398056 33.6252927324 +expect 3947557.082 2160701.818 + +accept 80.8803135822 34.2081349569 +expect 4569870.780 2264387.101 + +accept 90.6363798105 35.0454420959 +expect 5169067.110 2394326.391 + +accept 100.7095824201 35.0925204648 +expect 5814871.525 2475230.813 + +accept 110.4928526153 35.3747862433 +expect 6462291.225 2579639.068 + +accept 120.4119184030 36.0949196788 +expect 7138879.871 2729237.832 + +accept 130.3776922680 36.6637391210 +expect 7848033.791 2872450.680 + +accept 140.7776214259 37.0211653163 +expect 8622838.330 3001065.131 + +accept 150.9988070526 37.4312106652 +expect 9416320.865 3126629.034 + +accept 160.1799904005 37.7026348392 +expect 10156009.588 3217300.330 + +accept 170.7924717408 38.0391644104 +expect 11035694.135 3300682.151 + +accept 180.2988991065 38.8552843618 +expect -11786931.659 3402926.729 + +accept -179.1544921899 30.5865766668 +expect -11742964.963 2562920.940 + +accept -169.3849428190 30.6760590330 +expect -10943452.496 2558666.832 + +accept -159.4339156279 30.6775291474 +expect -10138949.929 2524905.799 + +accept -149.5559422097 31.4197140165 +expect -9352568.633 2541799.021 + +accept -139.0897465732 32.2480021869 +expect -8541501.925 2546249.903 + +accept -129.2432705270 33.1672095397 +expect -7802297.946 2550865.482 + +accept -119.6591996700 33.2608566981 +expect -7115874.023 2480432.270 + +accept -109.9331600482 33.2921667980 +expect -6445294.904 2404312.074 + +accept -99.3485704747 34.1878235263 +expect -5734796.733 2392907.698 + +accept -89.8642843810 35.1664811803 +expect -5119362.394 2398013.740 + +accept -79.2554014378 36.1141613383 +expect -4455555.225 2396032.770 + +accept -69.1149563301 37.0376191064 +expect -3841378.648 2400749.345 + +accept -59.1032039467 37.4528523762 +expect -3255415.569 2375467.923 + +accept -49.2271359812 37.5837083768 +expect -2692342.061 2338370.137 + +accept -39.6916503252 37.7843555404 +expect -2158326.616 2315768.979 + +accept -29.8938804478 38.4387691365 +expect -1616406.889 2331809.199 + +accept -19.6362961239 39.2643368046 +expect -1056535.053 2366905.008 + +accept -9.4374584268 39.5396992359 +expect -506540.235 2372796.930 + +accept 0.3678100982 40.0842150295 +expect 19706.992 2406799.601 + +accept 10.7782532604 40.3498890996 +expect 577565.478 2430780.292 + +accept 20.3511128947 41.0134441926 +expect 1090910.801 2491722.447 + +accept 30.4333653857 41.5670977874 +expect 1634463.912 2555980.666 + +accept 40.6127074692 41.8606872838 +expect 2189539.048 2612578.512 + +accept 50.1387387629 41.9862708713 +expect 2717075.610 2664468.878 + +accept 60.0313937859 42.2155826206 +expect 3273928.502 2736271.447 + +accept 70.3375377370 42.9334405924 +expect 3862149.979 2861074.643 + +accept 80.5122630521 43.3972517538 +expect 4459635.506 2979024.926 + +accept 90.2998133187 44.2542302837 +expect 5045422.749 3141116.429 + +accept 100.0647551775 44.4815518568 +expect 5657295.328 3262535.857 + +accept 110.6066455294 44.8720342864 +expect 6341643.269 3419834.403 + +accept 120.1724623585 45.4033516879 +expect 6986444.476 3591181.437 + +accept 130.7707977218 46.0009809664 +expect 7735330.463 3793501.018 + +accept 140.0357246677 46.4664188350 +expect 8425607.646 3969868.107 + +accept 150.3890392442 46.5461497362 +expect 9247658.444 4111964.848 + +accept 160.9163061323 46.7398186016 +expect 10127353.584 4248204.315 + +accept 170.1397977064 47.5954473956 +expect 10925947.772 4426508.240 + +accept 180.2351988738 48.0474540668 +expect -11790980.142 4514546.436 + +accept -179.6179355770 40.1429577199 +expect -11779642.671 3545074.378 + +accept -169.3994668623 40.9727631907 +expect -10904739.639 3617207.971 + +accept -159.0744411429 41.2851805506 +expect -10034213.428 3592885.528 + +accept -149.8423978548 41.7994923976 +expect -9274861.042 3569932.623 + +accept -139.3764020016 42.6414085288 +expect -8441459.370 3548024.189 + +accept -129.8834678056 43.3974758995 +expect -7717279.673 3512850.000 + +accept -119.2273385573 43.9271323417 +expect -6946608.719 3434404.081 + +accept -109.0271864056 44.8644031164 +expect -6236376.125 3400177.924 + +accept -99.2759252254 45.1195335801 +expect -5596913.783 3311405.157 + +accept -89.6168562261 45.3669011811 +expect -4987642.638 3231158.191 + +accept -79.1400549649 45.8028162130 +expect -4348106.593 3168953.470 + +accept -69.1272034531 45.8946112129 +expect -3760612.414 3092810.191 + +accept -59.5914817326 46.6423497334 +expect -3209252.229 3085015.399 + +accept -49.7829967571 47.4970577378 +expect -2655798.711 3093450.893 + +accept -39.2258939434 48.1273210284 +expect -2076130.612 3090330.169 + +accept -29.0459159714 48.7731368364 +expect -1527463.826 3102071.708 + +accept -19.4563259884 49.0147747663 +expect -1019421.009 3094379.980 + +accept -9.2974861965 49.6391756401 +expect -485234.163 3127485.443 + +accept 0.8002954696 50.4949000479 +expect 41618.406 3191862.866 + +accept 10.5449464536 50.7566160438 +expect 548218.021 3220010.469 + +accept 20.2148839237 51.7062683926 +expect 1049059.717 3317338.698 + +accept 30.3826788909 51.7914032104 +expect 1581115.436 3356787.020 + +accept 40.4566276504 52.4962620813 +expect 2108580.613 3463100.568 + +accept 50.7914497367 53.3942556548 +expect 2652555.049 3604990.575 + +accept 60.6693710568 53.6277898414 +expect 3186853.012 3700944.562 + +accept 70.8983905024 54.4541071246 +expect 3741818.938 3872995.556 + +accept 80.0921298391 54.7777207304 +expect 4258319.040 4004738.180 + +accept 90.8264889463 55.1332494774 +expect 4879297.684 4176785.355 + +accept 100.4617594180 55.2946750932 +expect 5460672.139 4333801.395 + +accept 110.3843836904 56.2425900762 +expect 6060244.396 4604234.950 + +accept 120.9357632899 56.9127950267 +expect 6737581.209 4883511.960 + +accept 130.5662521586 57.0909748951 +expect 7408708.016 5106858.830 + +accept 140.5130223329 57.4425849230 +expect 8144289.862 5377321.687 + +accept 150.1055981470 58.0701974311 +expect 8901145.374 5695571.850 + +accept 160.5298175128 58.2923369725 +expect 9829016.530 5963428.705 + +accept 170.7716226761 58.3931749475 +expect 10840592.637 6151742.796 + +accept 180.3673574365 58.5523508398 +expect -11773057.974 6240881.263 + +accept -179.1819571823 50.5244358587 +expect -11736162.165 4863184.254 + +accept -169.7451954874 51.1460877943 +expect -10856391.238 4918273.752 + +accept -159.2560731724 51.1659719222 +expect -9910743.214 4816238.037 + +accept -149.9672222696 51.3661570651 +expect -9112154.958 4711683.179 + +accept -139.8591282059 52.1411020613 +expect -8277768.355 4644021.152 + +accept -129.7970972042 52.4993373959 +expect -7508721.894 4510492.172 + +accept -119.8747965281 52.7309515249 +expect -6798679.387 4365407.674 + +accept -109.1716302230 53.6677897735 +expect -6057181.907 4293188.653 + +accept -99.0064373966 53.8072556867 +expect -5408756.759 4153094.469 + +accept -89.2833040728 54.6106266193 +expect -4799568.155 4102012.106 + +accept -79.5985918526 55.1027737429 +expect -4223329.559 4031502.907 + +accept -69.2277148796 55.7622851795 +expect -3625399.148 3983778.291 + +accept -59.7190082964 55.9016291208 +expect -3101569.537 3908067.342 + +accept -49.8523842515 55.9381520101 +expect -2571672.615 3833924.898 + +accept -39.0306006434 56.2379702434 +expect -1998881.092 3793906.979 + +accept -29.4386358660 56.7861006916 +expect -1497679.518 3798815.953 + +accept -19.4990519776 57.6029946160 +expect -985017.408 3841130.737 + +accept -9.7556385919 58.2846118408 +expect -490207.195 3885471.247 + +accept 0.2410422753 58.3298871859 +expect 12102.460 3882913.235 + +accept 10.5236020030 58.9487998679 +expect 526883.142 3950657.847 + +accept 20.5151795661 59.2605128471 +expect 1027091.833 4004099.328 + +accept 30.5940481955 60.2189305606 +expect 1527348.143 4138882.981 + +accept 40.7900054843 61.1999722752 +expect 2031933.355 4297245.113 + +accept 50.5958144484 62.0053970071 +expect 2519299.307 4456118.987 + +accept 60.8762100151 62.4317915615 +expect 3041726.936 4599170.199 + +accept 70.4775836656 63.4288167842 +expect 3520271.382 4823700.333 + +accept 80.4849589897 63.7092243462 +expect 4046810.715 4994145.001 + +accept 90.9223489138 64.1528226880 +expect 4604230.542 5218233.343 + +accept 100.8413924261 65.0793496826 +expect 5124544.719 5529805.227 + +accept 110.4292321534 65.5632643921 +expect 5660125.988 5811449.898 + +accept 120.3403456476 66.5295382674 +expect 6202409.500 6215253.879 + +accept 130.8994551518 67.0090839235 +expect 6844751.778 6619354.810 + +accept 140.8028440361 67.1546072874 +expect 7520909.896 7003616.860 + +accept 150.1461657011 67.4794680766 +expect 8205195.583 7463336.596 + +accept 160.1948043463 67.9727812220 +expect 9033005.154 8088126.442 + +accept 170.2236262055 68.9001498060 +expect 10002490.427 9028299.844 + +accept 180.4510871253 69.6301310123 +expect -11672105.068 10174167.501 + +accept -179.6928502294 60.7606385646 +expect -11777314.779 6722857.577 + +accept -169.1226136208 61.3072659363 +expect -10577772.207 6741718.347 + +accept -159.3917581951 61.6554659753 +expect -9558954.738 6580581.575 + +accept -149.9215059659 62.2899028506 +expect -8655627.202 6419091.419 + +accept -139.4229348418 63.2282931041 +expect -7745441.279 6255362.342 + +accept -129.6145782219 63.6056278696 +expect -7010285.489 6024060.105 + +accept -119.4455633048 63.7880033811 +expect -6321410.142 5777303.154 + +accept -109.2885142234 64.7874725222 +expect -5635268.808 5674008.141 + +accept -99.8106343476 65.7546653268 +expect -5032017.479 5601114.476 + +accept -89.7332690529 65.9905292469 +expect -4461000.004 5437610.544 + +accept -79.7061602957 66.5799499364 +expect -3900842.013 5346675.577 + +accept -69.8078719866 67.2349525670 +expect -3366364.151 5288124.095 + +accept -59.9278061065 67.4707153106 +expect -2863723.058 5195929.041 + +accept -49.6499709362 68.0783549484 +expect -2344265.721 5168345.324 + +accept -39.7785355635 68.6589802179 +expect -1858546.630 5161258.347 + +accept -29.2733130411 69.2346381936 +expect -1354425.808 5169177.366 + +accept -19.7520445226 69.7447199105 +expect -906653.264 5193341.582 + +accept -9.4546150406 70.4233082073 +expect -429913.564 5256559.645 + +accept 0.4048610966 70.6236052708 +expect 18357.153 5275509.126 + +accept 10.1670362925 70.8976936786 +expect 459603.254 5322872.830 + +accept 20.8647562320 71.3607521955 +expect 938809.251 5419110.193 + +accept 30.9620313275 72.3532797491 +expect 1376843.290 5613329.925 + +accept 40.2436883822 72.6448737185 +expect 1786361.071 5722579.786 + +accept 50.0800145195 72.7023402174 +expect 2228603.224 5821470.902 + +accept 60.8106370898 73.3031896004 +expect 2692182.927 6039226.272 + +accept 70.6025437547 73.5707955278 +expect 3126302.133 6221575.805 + +accept 80.4428196695 74.5629968499 +expect 3514896.350 6555403.995 + +accept 90.9705345155 75.3895826260 +expect 3928491.141 6916551.843 + +accept 100.7042769293 76.1944062131 +expect 4287723.041 7301533.036 + +accept 110.6051178518 77.0216158345 +expect 4624306.800 7743103.312 + +accept 120.5528704261 77.5805939292 +expect 4968887.256 8186300.038 + +accept 130.0043694164 78.1214527556 +expect 5261992.760 8661662.569 + +accept 140.4219455785 78.5676823388 +expect 5567546.429 9220412.007 + +accept 150.9607701203 78.6584076186 +expect 5913255.760 9797358.275 + +accept 160.8565770466 78.9854274121 +expect 6094257.816 10453353.669 + +accept 170.4873432082 79.5034695093 +expect 6085224.011 11149120.017 + +accept 180.3649630983 79.8293737054 +expect -6018407.263 11787437.041 + +accept -179.3073985765 70.8163938435 +expect -10817280.529 11465490.561 + +accept -169.9897278030 71.2934701929 +expect -9276875.736 9863919.805 + +accept -159.2365467427 71.8590802946 +expect -8184178.135 9023921.272 + +accept -149.5868788879 72.5692211678 +expect -7360942.175 8539328.713 + +accept -139.1323352132 73.1055180323 +expect -6629486.281 8091534.479 + +accept -129.7742695161 73.8196458860 +expect -6000140.533 7815451.358 + +accept -119.7041959034 74.7579440452 +expect -5353400.778 7611475.920 + +accept -109.7008776088 75.3901899809 +expect -4792518.394 7404785.570 + +accept -99.2314898828 75.9111536135 +expect -4252036.425 7210319.564 + +accept -89.5888146775 76.2792517885 +expect -3785659.112 7048200.366 + +accept -79.3077687162 76.5665040629 +expect -3313318.429 6890921.119 + +accept -69.4337987883 76.6621432071 +expect -2883922.823 6737102.185 + +accept -59.0261934568 76.9594965901 +expect -2426688.222 6640668.630 + +accept -49.3115987100 77.8323229554 +expect -1979275.955 6688559.534 + +accept -39.4459740795 78.6210665264 +expect -1547696.694 6747296.835 + +accept -29.2899383303 78.8023227358 +expect -1142238.026 6708292.313 + +accept -19.1326451258 79.5725050055 +expect -728892.599 6814228.120 + +accept -9.5853469917 80.5460704598 +expect -353566.181 6996661.780 + +accept 0.8129663669 80.7466782310 +expect 29772.656 7032318.930 + +accept 10.8102522601 81.0089111161 +expect 392092.798 7104986.336 + +accept 20.8020824140 81.8177026408 +expect 730326.797 7332200.488 + +accept 30.3227561837 81.8668144912 +expect 1061996.648 7396680.294 + +accept 40.1192116699 82.5591024355 +expect 1359653.273 7647195.746 + +accept 50.7225485024 83.3689210619 +expect 1642887.530 7969766.384 + +accept 60.1580162716 83.8192679216 +expect 1890049.083 8210844.252 + +accept 70.1731315267 84.1714314114 +expect 2143235.010 8455663.246 + +accept 80.1231823107 85.0909307831 +expect 2259322.517 8893244.179 + +accept 90.1299725257 85.3982223970 +expect 2445628.938 9170008.600 + +accept 100.9345367116 86.3293017336 +expect 2430413.592 9671881.713 + +accept 110.8967536886 86.5596667511 +expect 2542278.654 9949902.835 + +accept 120.1922834115 86.7776311985 +expect 2614369.629 10217813.641 + +accept 130.8551063009 87.2011682062 +expect 2577941.936 10571347.314 + +accept 140.5883122989 87.9808140533 +expect 2273302.478 10967527.442 + +accept 150.7238822230 88.4956617003 +expect 2017487.009 11270794.839 + +accept 160.6971562328 89.4208328233 +expect 1268680.941 11594325.039 + +accept 170.3991577317 90.3170479552 +expect failure errno coord_transfm_invalid_coord + +accept 180.5908903286 90.7796418583 +expect failure errno coord_transfm_invalid_coord + +accept -179.6672737749 80.9670130376 +expect -5579975.368 11792148.700 + +accept -169.9437203572 81.8738988668 +expect -5187300.642 11262109.091 + +accept -159.3629518885 82.2036176232 +expect -4941095.530 10742757.395 + +accept -149.7114004837 82.3010483165 +expect -4738960.212 10299021.779 + +accept -139.8871282560 82.3318724399 +expect -4514031.774 9880652.443 + +accept -129.1103803259 83.1345581099 +expect -4013186.362 9627836.752 + +accept -119.1303161403 83.9704390214 +expect -3530043.701 9489966.226 + +accept -109.5992779696 84.5102002899 +expect -3148868.130 9358019.001 + +accept -99.5340303810 84.8783360216 +expect -2804982.087 9214341.492 + +accept -89.9555755860 85.8080149104 +expect -2340101.503 9294021.159 + +accept -79.4199716924 86.1128031464 +expect -2020424.674 9213221.394 + +accept -69.1379478051 86.2852242994 +expect -1740870.664 9123538.176 + +accept -59.4862558744 86.8907264218 +expect -1395372.231 9240228.437 + +accept -49.7224425586 87.3050907988 +expect -1102476.832 9323956.320 + +accept -39.0166782385 88.0295172740 +expect -756214.155 9606239.667 + +accept -29.9931677373 88.8762393331 +expect -449807.586 10100826.611 + +accept -19.5461864449 89.0119403988 +expect -277206.486 10175661.602 + +accept -9.5857052257 89.5105564736 +expect -97172.766 10643561.020 + +accept 0.2546693029 89.8300875130 +expect 1535.284 11119443.552 + +accept 10.1878191712 89.8306694493 +expect 61235.456 11123325.873 + +accept 20.3202271141 90.0891258483 +expect failure errno coord_transfm_invalid_coord + +accept 30.4076531874 90.1655009485 +expect failure errno coord_transfm_invalid_coord + +accept 40.4697816170 90.3073014721 +expect failure errno coord_transfm_invalid_coord + +accept 50.0046280736 90.9081150272 +expect failure errno coord_transfm_invalid_coord + +accept 60.2882853272 91.3234973005 +expect failure errno coord_transfm_invalid_coord + +accept 70.1983790734 92.0487871293 +expect failure errno coord_transfm_invalid_coord + +accept 80.2016298087 92.7883781050 +expect failure errno coord_transfm_invalid_coord + +accept 90.1380649347 93.4193661081 +expect failure errno coord_transfm_invalid_coord + +accept 100.9727810821 94.0036131508 +expect failure errno coord_transfm_invalid_coord + +accept 110.2124518442 94.5588879261 +expect failure errno coord_transfm_invalid_coord + +accept 120.9027437830 95.4070516655 +expect failure errno coord_transfm_invalid_coord + +accept 130.4370128971 95.6659394457 +expect failure errno coord_transfm_invalid_coord + +accept 140.5025123065 95.8655824422 +expect failure errno coord_transfm_invalid_coord + +accept 150.4051276696 96.5597126498 +expect failure errno coord_transfm_invalid_coord + +accept 160.6794810904 97.5509003421 +expect failure errno coord_transfm_invalid_coord + +accept 170.0804614782 97.7962770171 +expect failure errno coord_transfm_invalid_coord + +accept 180.7350988655 97.9297507566 +expect failure errno coord_transfm_invalid_coord + +accept -179.6509243766 89.9594690425 +expect -339016.824 11811270.987 + +accept -169.1462360158 90.2259103522 +expect failure errno coord_transfm_invalid_coord + +accept -159.1237371257 91.0966186475 +expect failure errno coord_transfm_invalid_coord + +accept -149.3864893992 92.0018593591 +expect failure errno coord_transfm_invalid_coord + +accept -139.8836795793 92.7310580140 +expect failure errno coord_transfm_invalid_coord + +accept -129.2447556879 93.0874941458 +expect failure errno coord_transfm_invalid_coord + +accept -119.5691328385 94.0016439421 +expect failure errno coord_transfm_invalid_coord + +accept -109.5375733271 94.6275672079 +expect failure errno coord_transfm_invalid_coord + +accept -99.6767551820 94.9362396518 +expect failure errno coord_transfm_invalid_coord + +accept -89.0765267674 95.5300020136 +expect failure errno coord_transfm_invalid_coord + +accept -79.7404375474 95.8979843707 +expect failure errno coord_transfm_invalid_coord + +accept -69.2186423862 96.1670313079 +expect failure errno coord_transfm_invalid_coord + +accept -59.3116550382 97.0176191327 +expect failure errno coord_transfm_invalid_coord + +accept -49.2194140278 97.9598960425 +expect failure errno coord_transfm_invalid_coord + +accept -39.4423952109 97.9675789614 +expect failure errno coord_transfm_invalid_coord + +accept -29.2846350035 98.7361321642 +expect failure errno coord_transfm_invalid_coord + +accept -19.5599253582 98.8248133304 +expect failure errno coord_transfm_invalid_coord + +accept -9.7751102831 99.2905137713 +expect failure errno coord_transfm_invalid_coord + +accept 0.4459912613 99.9348079001 +expect failure errno coord_transfm_invalid_coord + +accept 10.2556901904 100.0679369696 +expect failure errno coord_transfm_invalid_coord + +accept 20.2129499464 100.4339484435 +expect failure errno coord_transfm_invalid_coord + +accept 30.5120716507 100.8173987820 +expect failure errno coord_transfm_invalid_coord + +accept 40.9186217475 101.3362169174 +expect failure errno coord_transfm_invalid_coord + +accept 50.4499309674 101.7519777648 +expect failure errno coord_transfm_invalid_coord + +accept 60.9618169609 101.9681616248 +expect failure errno coord_transfm_invalid_coord + +accept 70.5136938969 102.7263743079 +expect failure errno coord_transfm_invalid_coord + +accept 80.1112365376 103.4930742925 +expect failure errno coord_transfm_invalid_coord + +accept 90.0656487088 104.2687818917 +expect failure errno coord_transfm_invalid_coord + +accept 100.4737302350 105.1672304167 +expect failure errno coord_transfm_invalid_coord + +accept 110.0826941374 105.9578331609 +expect failure errno coord_transfm_invalid_coord + +accept 120.5038465053 106.4653112353 +expect failure errno coord_transfm_invalid_coord + +accept 130.1946022249 107.2836000330 +expect failure errno coord_transfm_invalid_coord + +accept 140.1612060920 108.2561565502 +expect failure errno coord_transfm_invalid_coord + +accept 150.8381796528 108.3785139275 +expect failure errno coord_transfm_invalid_coord + +accept 160.5344804952 109.2381208530 +expect failure errno coord_transfm_invalid_coord + +accept 170.6816130052 110.0255190870 +expect failure errno coord_transfm_invalid_coord + +accept 180.9197969760 110.0988929845 +expect failure errno coord_transfm_invalid_coord + + diff --git a/conformance/src/test/resources/gie/adams_ws2.gie b/conformance/src/test/resources/gie/adams_ws2.gie new file mode 100644 index 0000000..8ba0475 --- /dev/null +++ b/conformance/src/test/resources/gie/adams_ws2.gie @@ -0,0 +1,2177 @@ + + +------------------------------------------------------------ +# This gie file was initially generated from "random" test points +# got by using libproject where the adams_ws2 code was adapted from +# It can be edited. +------------------------------------------------------------ + +------------------------------------------------------------ +operation +proj=adams_ws2 +R=6370997 +tolerance 1 mm +------------------------------------------------------------ +accept -179.7092450238 -90.0290393775 +expect failure errno coord_transfm_invalid_coord + +accept -169.9316998581 -89.6983443874 +expect -2757243.603 -13694037.516 + +accept -159.9839735761 -89.3853376439 +expect -3135302.955 -12966682.177 + +accept -149.0127901515 -88.4812940559 +expect -3702020.595 -11830322.541 + +accept -139.1470666283 -87.4944214849 +expect -3951802.110 -10998803.477 + +accept -129.1647510809 -86.6732359620 +expect -3966830.515 -10396244.146 + +accept -119.8872640416 -86.0311019572 +expect -3870042.307 -9946966.226 + +accept -109.1071943611 -85.4385747937 +expect -3666639.936 -9527264.855 + +accept -99.1726204643 -85.1105131986 +expect -3405494.414 -9249877.167 + +accept -89.9699823716 -84.7014602402 +expect -3161293.332 -8969222.654 + +accept -79.0142432052 -84.6183360959 +expect -2796763.716 -8803380.868 + +accept -69.3746588999 -83.8694127295 +expect -2538194.969 -8434335.838 + +accept -59.1116247628 -83.4382281692 +expect -2201397.875 -8194239.985 + +accept -49.9832824786 -82.7776695863 +expect -1905027.516 -7914064.933 + +accept -39.2446354074 -82.2684783422 +expect -1520355.973 -7692624.558 + +accept -29.1591843717 -81.2712614892 +expect -1160852.682 -7367506.867 + +accept -19.7518374124 -80.8288036882 +expect -795019.539 -7219158.095 + +accept -9.9255150926 -80.7634661276 +expect -400180.112 -7180839.863 + +accept 0.1884288619 -80.2758766316 +expect 7681.127 -7053424.532 + +accept 10.3463227493 -79.3698907818 +expect 429721.976 -6850344.331 + +accept 20.5976448498 -78.7037640543 +expect 866348.961 -6727849.736 + +accept 30.3082205513 -78.5268124103 +expect 1278848.718 -6727598.466 + +accept 40.4562460745 -78.1491297266 +expect 1718510.989 -6703423.050 + +accept 50.9458720501 -77.1822355756 +expect 2199782.851 -6583628.613 + +accept 60.7726090586 -77.0349803149 +expect 2630476.462 -6641198.553 + +accept 70.5081156610 -76.3842150797 +expect 3083737.575 -6619890.177 + +accept 80.2365671846 -75.4841051853 +expect 3557787.939 -6575918.481 + +accept 90.5217667884 -74.7807003525 +expect 4055523.822 -6599908.601 + +accept 100.8213322615 -74.0327498320 +expect 4564995.375 -6643366.399 + +accept 110.5063711430 -73.2571688604 +expect 5056479.354 -6698955.863 + +accept 120.3163752614 -72.4393741465 +expect 5563998.804 -6778747.641 + +accept 130.6066962791 -72.2383125997 +expect 6050103.198 -6992464.809 + +accept 140.9842139999 -72.0604912080 +expect 6533723.092 -7241474.496 + +accept 150.7407483672 -71.8220094179 +expect 6988261.604 -7493795.727 + +accept 160.2333513818 -71.3988285471 +expect 7442114.989 -7741103.770 + +accept 170.2174368056 -70.4342119870 +expect 7967287.710 -7968253.770 + +accept 180.4880362185 -69.4423545276 +expect -8459022.028 -8206959.559 + +accept -179.6765866679 -79.9829089371 +expect -6985694.074 -9698942.155 + +accept -169.3697449847 -79.1533653138 +expect -6788658.846 -9227367.628 + +accept -159.3398127142 -78.6158200646 +expect -6518830.741 -8830410.965 + +accept -149.2529018703 -77.9038978934 +expect -6242199.759 -8415628.859 + +accept -139.1270212047 -77.3123241499 +expect -5919170.448 -8040244.161 + +accept -129.9719878520 -77.1799395743 +expect -5563633.984 -7792039.926 + +accept -119.8002013346 -76.4574860662 +expect -5211249.405 -7431807.092 + +accept -109.5059723182 -75.7415088186 +expect -4829803.114 -7094468.982 + +accept -99.6093198617 -75.2549327376 +expect -4430664.339 -6828988.008 + +accept -89.7930338075 -74.9639973582 +expect -4012235.208 -6620268.234 + +accept -79.4586895446 -74.2118180651 +expect -3586854.329 -6347250.691 + +accept -69.3436462673 -74.1262304089 +expect -3131838.678 -6210695.025 + +accept -59.8993905791 -73.3233934105 +expect -2730484.498 -5982995.653 + +accept -49.7522174506 -73.2363687589 +expect -2268190.621 -5882547.028 + +accept -39.2685447989 -72.6142200904 +expect -1801294.844 -5714042.490 + +accept -29.0364706467 -72.5237014490 +expect -1332211.352 -5647707.712 + +accept -19.8296434180 -72.1886326428 +expect -912551.389 -5563488.488 + +accept -9.8077325645 -71.7629261845 +expect -453152.448 -5478207.867 + +accept 0.4315853824 -71.5575178388 +expect 19979.237 -5441012.049 + +accept 10.8411958509 -70.9073113064 +expect 505138.396 -5355652.524 + +accept 20.7152781983 -70.1134571802 +expect 972838.442 -5266833.183 + +accept 30.0599851854 -69.8795545612 +expect 1415773.291 -5269134.697 + +accept 40.5438377621 -69.1450433006 +expect 1924403.608 -5223807.773 + +accept 50.0307069046 -68.4333233270 +expect 2392850.994 -5193157.214 + +accept 60.5578535026 -67.8341598034 +expect 2917014.530 -5202936.346 + +accept 70.5486167487 -67.0039300601 +expect 3429776.377 -5197720.065 + +accept 80.6104642107 -66.2045341279 +expect 3955430.510 -5217814.475 + +accept 90.2841546043 -65.8422559530 +expect 4456136.396 -5308137.385 + +accept 100.1453713101 -65.8321633336 +expect 4958133.076 -5466790.857 + +accept 110.3255223842 -65.6999143010 +expect 5484630.668 -5641098.630 + +accept 120.2695614591 -65.4373463883 +expect 6008718.351 -5822579.879 + +accept 130.1617028260 -64.7707999563 +expect 6557379.569 -5983944.031 + +accept 140.4485877356 -64.1566350257 +expect 7128044.250 -6198238.582 + +accept 150.3105224098 -63.5579868289 +expect 7676672.874 -6441225.256 + +accept 160.5091429791 -62.6650596939 +expect 8262531.987 -6705693.227 + +accept 170.8981621301 -61.7219845816 +expect 8855010.278 -7022513.736 + +accept 180.3558199030 -61.1527410473 +expect -9320622.179 -7351806.789 + +accept -179.1949344790 -69.7752745189 +expect -8408251.537 -8232691.330 + +accept -169.9844730348 -68.9207602047 +expect -8120078.404 -7775444.464 + +accept -159.6630800816 -68.8474900484 +expect -7673728.921 -7392368.231 + +accept -149.1514601079 -68.2067669189 +expect -7247339.088 -6962408.917 + +accept -139.0879724776 -67.2990645502 +expect -6835622.742 -6542934.347 + +accept -129.7364301888 -67.0709630928 +expect -6389191.557 -6259081.373 + +accept -119.2525297571 -66.7130216826 +expect -5885127.012 -5959615.515 + +accept -109.9942126502 -65.9323791506 +expect -5456298.788 -5663479.323 + +accept -99.3718189580 -65.0050609815 +expect -4952897.215 -5351531.121 + +accept -89.2126537463 -64.8003181492 +expect -4438651.521 -5164919.484 + +accept -79.9699918529 -64.7417604712 +expect -3968262.754 -5031339.112 + +accept -69.2852704168 -64.0719899001 +expect -3442756.784 -4828682.323 + +accept -59.7713311869 -63.5883281794 +expect -2971057.023 -4681634.618 + +accept -49.4591068015 -63.3603315571 +expect -2455101.158 -4574825.541 + +accept -39.9221210763 -62.7166029149 +expect -1985110.513 -4444066.132 + +accept -29.4033816775 -62.2459162224 +expect -1463165.847 -4343593.454 + +accept -19.4562997110 -62.1057544781 +expect -967613.655 -4296313.938 + +accept -9.6356219787 -61.1466320407 +expect -481338.112 -4176929.015 + +accept 0.6588822473 -60.1858259817 +expect 33069.831 -4072773.374 + +accept 10.9123408994 -59.3942535459 +expect 550076.991 -4001105.274 + +accept 20.9249231576 -58.4264590285 +expect 1060832.702 -3926177.072 + +accept 30.8182477174 -57.5436346739 +expect 1571551.690 -3873152.034 + +accept 40.8062160819 -57.3120408186 +expect 2088248.634 -3896213.274 + +accept 50.5783407631 -57.2502847616 +expect 2597056.641 -3948016.223 + +accept 60.3795380424 -57.2275967096 +expect 3112185.488 -4018270.594 + +accept 70.5341633320 -56.6610699237 +expect 3662178.471 -4054556.527 + +accept 80.2621021518 -56.0832576961 +expect 4200156.553 -4102899.263 + +accept 90.9924788950 -55.3105280599 +expect 4810349.300 -4164560.690 + +accept 100.1850294843 -54.9771464696 +expect 5337043.742 -4270248.554 + +accept 110.2445797630 -54.0658285398 +expect 5943289.082 -4356935.761 + +accept 120.6069857779 -53.3088500534 +expect 6579954.717 -4496181.899 + +accept 130.2789945294 -52.8143911635 +expect 7180795.395 -4682156.275 + +accept 140.3311899960 -52.3084536190 +expect 7816505.414 -4918688.318 + +accept 150.9519295109 -52.0098336142 +expect 8481836.319 -5247130.328 + +accept 160.6630418532 -51.6702008173 +expect 9089733.809 -5596578.481 + +accept 170.5027767145 -51.5189598167 +expect 9675637.514 -6026539.807 + +accept 180.8758506742 -51.2201444439 +expect -10177185.136 -6434755.421 + +accept -179.8411044403 -59.9393178899 +expect -9443976.994 -7246273.236 + +accept -169.3270885266 -59.1985019770 +expect -8995948.520 -6701742.553 + +accept -159.0120452761 -59.1242618883 +expect -8464180.924 -6272112.895 + +accept -149.5670531797 -58.7286202895 +expect -7979472.299 -5884420.870 + +accept -139.0970719139 -58.1489537744 +expect -7430300.432 -5483894.856 + +accept -129.1196020868 -57.2913818657 +expect -6907494.210 -5112397.388 + +accept -119.7410720497 -56.9161549702 +expect -6387194.447 -4845091.157 + +accept -109.7214510325 -55.9267756586 +expect -5851170.964 -4534131.372 + +accept -99.1928708683 -55.4401681713 +expect -5267711.955 -4300230.895 + +accept -89.2702698097 -55.2997481025 +expect -4714550.947 -4139814.556 + +accept -79.4864123616 -54.8136229276 +expect -4183440.927 -3971202.629 + +accept -69.3453324893 -54.6311145369 +expect -3632724.847 -3848910.729 + +accept -59.8339416819 -53.6386169191 +expect -3133296.168 -3676377.089 + +accept -49.3010973212 -52.9141596041 +expect -2577599.457 -3539651.763 + +accept -39.8985039869 -52.8539647879 +expect -2079543.627 -3483996.852 + +accept -29.3961250522 -52.3417298211 +expect -1530564.484 -3397269.368 + +accept -19.5014059179 -51.3773597952 +expect -1016792.801 -3288257.869 + +accept -9.9116288496 -50.4755131648 +expect -517724.688 -3198035.336 + +accept 0.9743282127 -49.9184212313 +expect 50962.745 -3147322.949 + +accept 10.6508090388 -49.0463066485 +expect 558876.345 -3082894.951 + +accept 20.2170315032 -48.8012100804 +expect 1063007.281 -3078773.024 + +accept 30.9229311437 -48.2225550224 +expect 1632723.266 -3061426.633 + +accept 40.7489150310 -47.7931114403 +expect 2161132.006 -3064760.741 + +accept 50.9882474140 -47.6183917612 +expect 2717126.369 -3102179.138 + +accept 60.4951083293 -46.6454001087 +expect 3249189.082 -3083060.891 + +accept 70.9554669962 -45.9763718998 +expect 3843598.409 -3108377.147 + +accept 80.8848766764 -45.7846392844 +expect 4415566.167 -3184255.726 + +accept 90.7402232455 -45.6088952189 +expect 4996535.515 -3278794.703 + +accept 100.8696089733 -45.3585308636 +expect 5610895.632 -3392002.899 + +accept 110.9170212513 -44.9478951297 +expect 6242312.338 -3516148.140 + +accept 120.9353901019 -44.7761977319 +expect 6885637.054 -3692702.792 + +accept 130.5310034140 -44.6491174665 +expect 7518026.186 -3902292.936 + +accept 140.4911819383 -44.5558487119 +expect 8188523.026 -4170828.177 + +accept 150.4583065377 -44.0055960197 +expect 8893017.639 -4454795.754 + +accept 160.9810806536 -43.8499619826 +expect 9618889.130 -4871178.683 + +accept 170.9230729547 -43.0316016948 +expect 10335543.716 -5284759.370 + +accept 180.3381763034 -42.9767512080 +expect -10889181.304 -5775308.758 + +accept -179.6530173733 -49.3872071390 +expect -10359694.674 -6307512.780 + +accept -169.2223492311 -49.3351161906 +expect -9766541.338 -5765269.396 + +accept -159.0508327192 -48.4914027020 +expect -9200440.534 -5224400.981 + +accept -149.1969312324 -48.3204060368 +expect -8581410.142 -4822470.693 + +accept -139.4509254495 -48.2401083822 +expect -7956818.463 -4491703.439 + +accept -129.3953824841 -47.8590661722 +expect -7326697.432 -4175808.479 + +accept -119.8005497638 -46.8591030615 +expect -6750164.464 -3860038.014 + +accept -109.6371217071 -46.1165362624 +expect -6133381.272 -3598151.680 + +accept -99.7572070447 -45.2128579221 +expect -5546071.645 -3363379.628 + +accept -89.9756152550 -44.7940088251 +expect -4964897.006 -3200898.955 + +accept -79.8767538149 -44.0954679134 +expect -4380500.181 -3035551.265 + +accept -69.7070595303 -43.9155165619 +expect -3796215.985 -2932502.304 + +accept -59.4162002941 -43.4002905582 +expect -3219205.574 -2819636.846 + +accept -49.0092629276 -43.1455519878 +expect -2642338.036 -2741942.445 + +accept -39.2149367905 -43.1396428570 +expect -2105326.203 -2698721.256 + +accept -29.1962960438 -42.8806359633 +expect -1563179.016 -2646665.138 + +accept -19.9520584705 -41.9858293563 +expect -1068083.171 -2560330.542 + +accept -9.1048749080 -41.9710426109 +expect -486662.244 -2545041.394 + +accept 0.7345999991 -41.2273949585 +expect 39313.660 -2488176.296 + +accept 10.3358537029 -40.3051838201 +expect 554536.579 -2427518.000 + +accept 20.9085122254 -40.0048024560 +expect 1124375.953 -2420626.128 + +accept 30.8006774663 -39.6693852781 +expect 1661863.596 -2419220.994 + +accept 40.8129777308 -39.2404566099 +expect 2212297.195 -2420473.575 + +accept 50.5680928423 -38.6381409742 +expect 2757518.213 -2417613.121 + +accept 60.1150468046 -38.1919404446 +expect 3299910.135 -2434340.337 + +accept 70.2009887167 -37.7503319244 +expect 3885091.635 -2465277.945 + +accept 80.9433725042 -37.6092654477 +expect 4521685.524 -2537447.427 + +accept 90.5450445832 -36.8932371421 +expect 5114490.299 -2572080.702 + +accept 100.2810830549 -36.2548338054 +expect 5735525.829 -2629983.784 + +accept 110.9555828878 -35.3701130040 +expect 6448221.387 -2701332.745 + +accept 120.1071621348 -34.4239368091 +expect 7092033.959 -2769933.898 + +accept 130.3959151631 -33.5728740994 +expect 7849212.306 -2898252.702 + +accept 140.3966149747 -33.1007607627 +expect 8616443.259 -3102144.372 + +accept 150.7804103414 -32.1498899431 +expect 9474137.117 -3341084.536 + +accept 160.1294242200 -31.8677972120 +expect 10255119.633 -3696347.819 + +accept 170.4926366887 -31.4760758031 +expect 11130499.187 -4208944.238 + +accept 180.0855468805 -30.6845915110 +expect -11924104.915 -4768423.647 + +accept -179.7273734266 -39.1658927524 +expect -11204917.679 -5465459.947 + +accept -169.0184062476 -39.0055263654 +expect -10493158.815 -4820337.657 + +accept -159.3652618381 -38.5207051121 +expect -9823706.550 -4298001.622 + +accept -149.2442235779 -37.7437811442 +expect -9109090.826 -3817330.153 + +accept -139.7582139899 -37.0859345868 +expect -8430885.041 -3451397.102 + +accept -129.6848433059 -36.3175720184 +expect -7723246.989 -3125416.425 + +accept -119.9915203582 -35.8537888060 +expect -7052847.569 -2889355.259 + +accept -109.3741418826 -35.0916931594 +expect -6347630.931 -2655717.550 + +accept -99.4860284168 -34.9974460643 +expect -5702866.657 -2521419.373 + +accept -89.2610432155 -34.3775651948 +expect -5064932.880 -2367691.750 + +accept -79.8980045489 -33.8084333270 +expect -4496443.808 -2246842.786 + +accept -69.7744908122 -33.0535274429 +expect -3897431.224 -2124030.733 + +accept -59.1741793523 -33.0245833220 +expect -3279277.127 -2064611.925 + +accept -49.3252940718 -32.7520928002 +expect -2718021.990 -2003727.901 + +accept -39.9837216743 -32.6820581131 +expect -2193100.779 -1967477.081 + +accept -29.6634260976 -32.4559533116 +expect -1621044.860 -1926376.015 + +accept -19.0425557421 -31.6151992048 +expect -1038939.460 -1853758.302 + +accept -9.3464940981 -30.7676922872 +expect -509764.792 -1790359.701 + +accept 0.2271197201 -29.8880719395 +expect 12396.124 -1731908.926 + +accept 10.3155486517 -29.7265492803 +expect 563481.490 -1725116.999 + +accept 20.1839066538 -29.2623085092 +expect 1105114.379 -1705401.818 + +accept 30.7346251189 -29.0674505554 +expect 1688443.872 -1710201.130 + +accept 40.3481516035 -28.9492608062 +expect 2225766.274 -1724893.934 + +accept 50.0990389861 -28.2777777134 +expect 2780666.281 -1710825.486 + +accept 60.6952552496 -28.1677069370 +expect 3393248.667 -1743873.889 + +accept 70.5261359994 -27.5835336013 +expect 3977728.481 -1751038.589 + +accept 80.1654103496 -27.3421123535 +expect 4564865.482 -1789330.795 + +accept 90.0545702452 -26.7993470554 +expect 5189164.780 -1818900.217 + +accept 100.4846205812 -26.3321377541 +expect 5873417.372 -1871564.464 + +accept 110.1454350755 -25.9649549970 +expect 6535803.844 -1941828.510 + +accept 120.7008393450 -25.1526201253 +expect 7304855.220 -2009386.765 + +accept 130.2389402517 -24.5243234665 +expect 8043003.839 -2105873.386 + +accept 140.5571385114 -23.6272475940 +expect 8905477.819 -2232473.683 + +accept 150.7016104068 -22.6662177106 +expect 9831511.358 -2411871.251 + +accept 160.2968564724 -22.4382538673 +expect 10756906.363 -2747796.799 + +accept 170.0748311294 -22.3860117924 +expect 11733461.723 -3272290.561 + +accept 180.6506603946 -22.3728965349 +expect -12617064.805 -3974167.403 + +accept -179.6121212366 -29.7691402382 +expect -11979921.495 -4667118.695 + +accept -169.7119531770 -29.2443283665 +expect -11222154.909 -3947901.934 + +accept -159.9169552740 -28.8913170762 +expect -10396184.341 -3393588.505 + +accept -149.4387461093 -28.3593158878 +expect -9515015.598 -2929955.771 + +accept -139.1669991056 -27.7889137233 +expect -8680487.806 -2582510.633 + +accept -129.3433138149 -27.6725871069 +expect -7909885.992 -2361735.805 + +accept -119.4082102166 -27.0902195884 +expect -7179377.517 -2149357.741 + +accept -109.1270697537 -26.4319377776 +expect -6459215.181 -1966619.626 + +accept -99.5563015601 -26.1428020328 +expect -5813582.857 -1849104.872 + +accept -89.7150051747 -25.6767220293 +expect -5176646.600 -1736438.788 + +accept -79.8755275705 -25.5910332550 +expect -4558775.834 -1666806.999 + +accept -69.2123495570 -25.4383454527 +expect -3910739.366 -1600921.909 + +accept -59.5658576308 -24.9358234812 +expect -3341553.359 -1527967.578 + +accept -49.6169420229 -24.6444229699 +expect -2765720.514 -1476703.148 + +accept -39.6482793765 -24.5549160001 +expect -2198313.929 -1445718.653 + +accept -29.9777355053 -24.4560828087 +expect -1655580.275 -1421139.862 + +accept -19.1713792157 -23.8256788800 +expect -1056119.979 -1368757.459 + +accept -9.7201400616 -22.9994139064 +expect -535034.881 -1312183.508 + +accept 0.5529890539 -22.3142121451 +expect 30441.381 -1269018.253 + +accept 10.1921781407 -21.7066906983 +expect 561728.285 -1235326.876 + +accept 20.3795548881 -21.4584354172 +expect 1125554.829 -1227765.197 + +accept 30.9486641454 -20.5179662552 +expect 1716375.316 -1183995.648 + +accept 40.8135756255 -19.5974702869 +expect 2275225.833 -1144577.227 + +accept 50.6799989922 -19.0578134683 +expect 2842703.974 -1132076.757 + +accept 60.3954481899 -18.9092744312 +expect 3411747.962 -1147888.925 + +accept 70.4453750849 -18.1833498293 +expect 4016856.952 -1133502.787 + +accept 80.7669954500 -18.0082544937 +expect 4655570.265 -1161429.470 + +accept 90.3894774181 -17.1937702409 +expect 5275686.661 -1150673.533 + +accept 100.6108192539 -16.6801050032 +expect 5961256.060 -1170474.059 + +accept 110.0973977891 -16.5576038471 +expect 6627078.423 -1224759.106 + +accept 120.1744128824 -16.1385356593 +expect 7378167.388 -1276012.928 + +accept 130.9958002425 -15.9988390562 +expect 8242075.942 -1381187.077 + +accept 140.7561364481 -15.5140276310 +expect 9095834.646 -1478681.653 + +accept 150.6609169826 -14.6810594541 +expect 10062376.739 -1592616.483 + +accept 160.4729986277 -13.9641207869 +expect 11146505.848 -1801865.434 + +accept 170.2580177319 -13.4019318955 +expect 12380828.321 -2216425.290 + +accept 180.9723789714 -13.2206420941 +expect -13517837.926 -2963599.665 + +accept -179.3731911762 -19.9754368483 +expect -12847531.905 -3741083.544 + +accept -169.7161399275 -19.5104972567 +expect -11896617.727 -2931048.939 + +accept -159.8730648764 -19.1040998843 +expect -10868152.967 -2367829.374 + +accept -149.7374470773 -18.6126354884 +expect -9867014.825 -1975013.098 + +accept -139.9375452903 -17.7675516184 +expect -8981245.860 -1675376.283 + +accept -129.7815708228 -17.6801059141 +expect -8119555.541 -1510161.646 + +accept -119.9989025368 -16.8565473881 +expect -7357650.403 -1331626.610 + +accept -109.4668005307 -16.5581522944 +expect -6581807.300 -1220164.823 + +accept -99.7153754334 -15.6910883516 +expect -5906017.650 -1094954.342 + +accept -89.4547033980 -15.0712716331 +expect -5224831.274 -1002148.542 + +accept -79.7184992899 -14.3419936196 +expect -4603946.126 -917271.900 + +accept -69.1303448651 -14.1075269728 +expect -3949591.288 -871282.018 + +accept -59.3174344116 -13.5400304440 +expect -3361462.250 -813740.055 + +accept -49.5741035561 -13.3755321856 +expect -2789994.364 -786454.715 + +accept -39.3784173894 -12.8080837456 +expect -2203910.826 -739131.430 + +accept -29.0461086285 -11.9729370492 +expect -1619004.622 -680848.917 + +accept -19.4469305321 -11.4082175114 +expect -1081054.702 -642575.882 + +accept -9.8174680795 -10.9835914719 +expect -544889.181 -615082.754 + +accept 0.5832005675 -10.8244025391 +expect 32351.518 -604970.269 + +accept 10.1821355116 -10.3112442518 +expect 565312.650 -577140.866 + +accept 20.2673282337 -9.6748015367 +expect 1127704.663 -544392.415 + +accept 30.6144784184 -9.1704395398 +expect 1709477.558 -521063.652 + +accept 40.9538042404 -8.8387995357 +expect 2298042.701 -509435.004 + +accept 50.3542282310 -8.5281632402 +expect 2841826.819 -499951.327 + +accept 60.3333585361 -8.0618147294 +expect 3430944.123 -483342.239 + +accept 70.6491293618 -7.1912559947 +expect 4056498.671 -443543.575 + +accept 80.6385279900 -6.8438270481 +expect 4680976.678 -436529.709 + +accept 90.2779063923 -5.9477536652 +expect 5306879.206 -394211.155 + +accept 100.1664295698 -5.3498071015 +expect 5976711.329 -371637.191 + +accept 110.7526797683 -5.0501900022 +expect 6732766.131 -372725.699 + +accept 120.9395236376 -4.1674482190 +expect 7511218.339 -330114.528 + +accept 130.9122756981 -3.3925202280 +expect 8335031.912 -292646.657 + +accept 140.8622591730 -2.6308107403 +expect 9239878.756 -252678.754 + +accept 150.8989218927 -2.4542899296 +expect 10271402.485 -272075.289 + +accept 160.6447981803 -1.8622854664 +expect 11459900.021 -252282.512 + +accept 170.0641946050 -1.8083280762 +expect 12937298.765 -340309.531 + +accept 180.2204067090 -0.9025887443 +expect -15802698.304 -708580.364 + +accept -179.6574960805 -9.4004926352 +expect -14071690.323 -2539687.191 + +accept -169.9633593449 -9.3485472828 +expect -12600921.441 -1621732.042 + +accept -159.8318959140 -9.0791301932 +expect -11229195.403 -1182926.612 + +accept -149.3318176481 -8.2240809358 +expect -10048132.890 -884380.748 + +accept -139.7502220731 -8.1745353165 +expect -9100377.717 -773484.631 + +accept -129.6865020082 -7.4201521250 +expect -8212868.503 -632791.243 + +accept -119.8341799056 -7.3634864983 +expect -7413306.708 -578750.081 + +accept -109.3372260355 -6.6955324842 +expect -6624672.935 -490071.015 + +accept -99.2316583050 -6.5126588093 +expect -5909647.259 -450435.980 + +accept -89.1084063299 -5.8865293624 +expect -5229890.468 -388173.334 + +accept -79.5816448608 -4.9451058817 +expect -4616528.397 -313937.264 + +accept -69.7454406840 -4.1892409654 +expect -4004251.255 -257320.628 + +accept -59.1123214226 -3.4679775330 +expect -3362108.879 -206832.813 + +accept -49.6901763540 -2.4894793557 +expect -2807061.182 -145333.833 + +accept -39.7692356409 -2.0816660918 +expect -2233545.578 -119370.078 + +accept -29.1740796470 -2.0439733787 +expect -1630731.974 -115537.821 + +accept -19.4550859282 -1.5656815613 +expect -1084212.955 -87689.967 + +accept -9.7922127612 -1.0233548058 +expect -544742.779 -57002.643 + +accept 0.9474400360 -0.4509174844 +expect 52675.338 -25070.513 + +accept 10.5907531926 0.4791919877 +expect 589235.938 26699.153 + +accept 20.4649033892 1.2637472104 +expect 1140802.061 70831.592 + +accept 30.7336324422 1.4750458750 +expect 1719011.039 83523.161 + +accept 40.5647880296 1.7200843296 +expect 2279244.812 98755.090 + +accept 50.0975358484 2.4206654883 +expect 2830862.498 141431.370 + +accept 60.5029363117 2.7469759008 +expect 3445462.137 164373.737 + +accept 70.2466016765 3.0425721977 +expect 4035802.541 187111.823 + +accept 80.9459783007 3.1839332730 +expect 4704897.806 203036.380 + +accept 90.5736386070 3.8575317925 +expect 5329437.218 255822.534 + +accept 100.2061055405 4.6282142532 +expect 5980767.943 321504.886 + +accept 110.3986145890 5.0514461622 +expect 6706729.320 371990.508 + +accept 120.2464205180 5.7344268609 +expect 7451933.549 451953.904 + +accept 130.8487160288 6.0228137911 +expect 8319391.922 519216.608 + +accept 140.7982222585 6.8874824898 +expect 9210050.487 660196.582 + +accept 150.4954910508 7.7970420656 +expect 10177774.848 854370.803 + +accept 160.4294052652 8.2748648014 +expect 11325245.938 1096444.978 + +accept 170.1405366440 9.1299598915 +expect 12640596.907 1598916.038 + +accept 180.3816637148 9.5293212197 +expect -14048784.308 2552595.319 + +accept -179.7984994410 0.1294010891 +expect -16146197.188 164013.021 + +accept -169.9075691637 0.6099770177 +expect -12921454.488 114297.725 + +accept -159.8158750237 0.7517410096 +expect -11353744.941 99828.675 + +accept -149.2779203136 0.9860535478 +expect -10098753.673 106507.361 + +accept -139.0081254157 1.7045245488 +expect -9066221.814 160142.630 + +accept -129.4952290080 2.3401856085 +expect -8216193.058 199202.767 + +accept -119.6801874031 2.7438994101 +expect -7415046.859 215250.709 + +accept -109.8061814794 3.3602853603 +expect -6666538.461 246453.448 + +accept -99.4072778605 4.2027372999 +expect -5926167.742 290710.723 + +accept -89.4794192866 4.3761667210 +expect -5256523.244 288879.125 + +accept -79.0507721337 5.0765421386 +expect -4582771.048 321680.244 + +accept -69.6180300324 6.0161102274 +expect -3994695.190 369666.719 + +accept -59.1757895169 6.6698983501 +expect -3363484.198 398396.059 + +accept -49.5137470044 7.3709595382 +expect -2793929.460 431038.915 + +accept -39.8808038489 7.5057731743 +expect -2237570.835 431453.557 + +accept -29.1954492510 7.5302153709 +expect -1630244.834 426646.570 + +accept -19.1423038522 7.9594801079 +expect -1065438.676 446891.077 + +accept -9.1680642851 8.1530010191 +expect -509342.190 455357.512 + +accept 0.1739948339 8.7651393303 +expect 9659.433 488991.424 + +accept 10.6214035743 9.0690282061 +expect 590010.824 507153.456 + +accept 20.6145954060 9.2785749606 +expect 1147299.618 522064.856 + +accept 30.7022010899 9.4344357510 +expect 1714266.145 536235.946 + +accept 40.6920436024 9.6859857008 +expect 2282298.409 558407.819 + +accept 50.0779641219 10.4703837993 +expect 2823489.061 614432.905 + +accept 60.7862954507 10.8675657776 +expect 3453869.707 653748.275 + +accept 70.7316745409 11.5482616810 +expect 4053689.320 714785.183 + +accept 80.5969392822 11.6377813068 +expect 4667778.775 744691.155 + +accept 90.7414911957 12.5339468232 +expect 5319510.529 835981.260 + +accept 100.1954199623 13.4045312190 +expect 5951099.489 935712.315 + +accept 110.4203894507 14.1556288162 +expect 6667631.291 1047159.283 + +accept 120.0358650247 14.9021123434 +expect 7379023.541 1176295.202 + +accept 130.5020570647 15.6380412243 +expect 8205734.023 1344014.139 + +accept 140.0437745429 16.3999265763 +expect 9015988.290 1549714.704 + +accept 150.1545875606 17.2596103884 +expect 9945182.384 1847801.749 + +accept 160.8486565585 17.2719148256 +expect 11052859.415 2202730.719 + +accept 170.5318144721 17.4322460420 +expect 12132375.221 2742993.334 + +accept 180.3687704920 18.1343689010 +expect -13055638.227 3577371.152 + +accept -179.0206911010 10.9105813395 +expect -13789973.226 2666800.487 + +accept -169.3809207620 11.7944347582 +expect -12368824.571 1941584.924 + +accept -159.6203666385 12.0516777085 +expect -11114668.475 1542870.752 + +accept -149.3198962805 12.6359180213 +expect -9971639.315 1349414.366 + +accept -139.5233350739 13.5860975895 +expect -9014835.165 1278723.421 + +accept -129.7243722634 14.3491243406 +expect -8156662.238 1224564.849 + +accept -119.1501250857 14.5216128511 +expect -7314420.668 1138694.060 + +accept -109.0371133259 15.0539906817 +expect -6561854.668 1105088.504 + +accept -99.9179969843 15.7258631745 +expect -5919649.304 1098546.238 + +accept -89.9773066160 16.3601816158 +expect -5252963.299 1091861.766 + +accept -79.9963611264 16.9875171909 +expect -4611500.971 1091043.258 + +accept -69.8357048214 17.5002106365 +expect -3982187.532 1087834.694 + +accept -59.7680108732 18.2166379428 +expect -3376669.886 1102916.942 + +accept -49.6200663069 18.3027049517 +expect -2783116.693 1083573.630 + +accept -39.6880697045 18.9352023262 +expect -2212450.852 1102685.583 + +accept -29.7767726581 19.4447171460 +expect -1652161.342 1118356.380 + +accept -19.4001109678 19.4907667291 +expect -1073007.877 1110251.090 + +accept -9.2283971215 19.7074346080 +expect -509423.729 1116879.960 + +accept 0.4114648584 20.3715526988 +expect 22689.511 1154092.449 + +accept 10.2069053765 20.5961272596 +expect 563089.088 1169589.074 + +accept 20.2755153863 21.5012785791 +expect 1119736.801 1230222.492 + +accept 30.7133762328 21.6331993543 +expect 1701464.196 1250677.021 + +accept 40.8056510679 21.9458705640 +expect 2269913.206 1287337.418 + +accept 50.1343812652 22.7322724754 +expect 2801331.228 1358020.376 + +accept 60.8279717815 23.6042650645 +expect 3421001.843 1446782.481 + +accept 70.8396198168 23.6161521840 +expect 4017785.556 1487799.299 + +accept 80.0150193753 24.3176168344 +expect 4575413.559 1580619.042 + +accept 90.0092672617 25.2892002351 +expect 5198545.082 1711055.973 + +accept 100.9112248813 25.3488952172 +expect 5911825.956 1802460.981 + +accept 110.6217357170 26.3130477559 +expect 6564636.348 1974281.767 + +accept 120.8513137656 27.2915307690 +expect 7281361.160 2187092.016 + +accept 130.4863483330 27.3717431335 +expect 8004199.764 2357290.762 + +accept 140.8500841767 27.7063050682 +expect 8819787.218 2617012.258 + +accept 150.1012624908 28.3597926319 +expect 9571394.994 2952268.869 + +accept 160.6866246900 28.7569504248 +expect 10470505.204 3415900.295 + +accept 170.4254637193 28.9327804979 +expect 11304554.466 3961238.714 + +accept 180.5169825410 29.4454995234 +expect -11997898.864 4629333.323 + +accept -179.9618334794 20.6361252181 +expect -12837832.007 3860315.017 + +accept -169.0544424157 21.5377240973 +expect -11689194.203 3115133.126 + +accept -159.5209982370 22.3343317585 +expect -10685600.977 2702674.102 + +accept -149.4879824588 23.0136475051 +expect -9708605.390 2409089.845 + +accept -139.0901904339 23.0833518677 +expect -8794463.480 2149634.537 + +accept -129.5571592628 23.7534110208 +expect -8003843.252 2027714.928 + +accept -119.3172537231 24.1047564008 +expect -7218181.243 1905508.759 + +accept -109.6905533732 24.4734381465 +expect -6521952.824 1821700.764 + +accept -99.8910561910 25.1938730946 +expect -5845160.963 1781991.443 + +accept -89.4462296168 25.8863398753 +expect -5157803.362 1749387.629 + +accept -79.8103593109 26.1645676522 +expect -4550997.853 1705809.308 + +accept -69.6977621502 26.6287263876 +expect -3933504.408 1682619.842 + +accept -59.8282049770 27.3537990267 +expect -3346444.748 1686544.376 + +accept -49.1454058737 27.7787492517 +expect -2728032.304 1675388.053 + +accept -39.3139281426 28.6345630085 +expect -2168591.423 1702020.943 + +accept -29.4615301172 29.5694962171 +expect -1616690.922 1739665.855 + +accept -19.8075997700 29.9373943713 +expect -1083433.316 1747604.085 + +accept -9.6080286962 30.8618954465 +expect -523974.378 1796510.976 + +accept 0.2364142241 31.2844282188 +expect 12878.465 1820358.353 + +accept 10.8007276009 32.1455048270 +expect 588003.896 1879462.172 + +accept 20.9914890120 32.9845571828 +expect 1143393.118 1945198.869 + +accept 30.5649011670 33.3185372073 +expect 1668534.713 1985021.750 + +accept 40.9928890043 33.9545285454 +expect 2244749.779 2055570.711 + +accept 50.5960695735 34.5487194112 +expect 2781374.579 2130923.541 + +accept 60.7989209340 34.6635486089 +expect 3363023.887 2186540.557 + +accept 70.4270746519 35.2029582655 +expect 3919596.726 2281175.829 + +accept 80.5548872020 35.6698817700 +expect 4518398.282 2388864.639 + +accept 90.4057879600 36.1979951235 +expect 5114553.759 2517121.960 + +accept 100.9114892728 36.5847249808 +expect 5770875.600 2663935.228 + +accept 110.7309087130 37.4367897060 +expect 6394670.813 2868606.494 + +accept 120.3064304930 38.2603562874 +expect 7018617.432 3101989.836 + +accept 130.7451971478 39.2489093279 +expect 7711939.115 3412678.003 + +accept 140.5750239477 39.4115866274 +expect 8403813.025 3690760.565 + +accept 150.9679439696 39.5896177639 +expect 9149846.161 4055027.485 + +accept 160.6524332599 40.0167951770 +expect 9830011.049 4497209.502 + +accept 170.4722281589 40.1946244182 +expect 10510426.457 5006824.562 + +accept 180.6722342584 40.4624940717 +expect -11073707.514 5547471.043 + +accept -179.2831936865 30.3756797354 +expect -11903513.624 4695492.667 + +accept -169.3418436736 30.6105366204 +expect -11096888.315 4057764.336 + +accept -159.1006283258 31.5893799475 +expect -10184786.130 3622256.417 + +accept -149.1140289956 31.8719516081 +expect -9350613.109 3255936.184 + +accept -139.6996779260 31.9484140590 +expect -8599676.794 2977225.067 + +accept -129.5556705121 32.3449943633 +expect -7818577.975 2772332.434 + +accept -119.9724472555 32.9392845832 +expect -7113428.652 2642433.850 + +accept -109.7343311582 33.1372998541 +expect -6404617.901 2502642.905 + +accept -99.9994915413 33.6225969013 +expect -5754979.598 2420019.593 + +accept -89.2957244981 34.5626482766 +expect -5064999.094 2381966.292 + +accept -79.0486888283 34.5979570645 +expect -4437892.568 2298043.032 + +accept -69.3692667775 34.8321767388 +expect -3860329.808 2247797.371 + +accept -59.5430097857 35.6428903265 +expect -3284552.144 2248836.044 + +accept -49.1028389556 36.0212581738 +expect -2689697.467 2226461.965 + +accept -39.5707710224 36.0991805410 +expect -2157256.671 2196683.027 + +accept -29.2950741715 36.7864032717 +expect -1588948.254 2214928.423 + +accept -19.8971059232 37.5191207820 +expect -1075080.881 2246281.883 + +accept -9.1855199225 38.0327790292 +expect -495017.437 2268788.188 + +accept 0.3119584346 38.1079667572 +expect 16801.964 2270513.428 + +accept 10.9783425364 38.7495700245 +expect 590921.384 2319580.204 + +accept 20.7896762683 39.3106928548 +expect 1119567.208 2371677.736 + +accept 30.1643265779 40.2243862141 +expect 1625278.990 2456916.428 + +accept 40.5328985021 41.0696713596 +expect 2188008.492 2551119.506 + +accept 50.2300300588 41.3865813447 +expect 2721620.789 2616277.410 + +accept 60.6521695116 42.3133443814 +expect 3298047.285 2744030.130 + +accept 70.7309222598 43.1274592749 +expect 3863356.586 2878383.982 + +accept 80.8866702938 43.7702855800 +expect 4443854.438 3018951.902 + +accept 90.5499599785 44.5851564761 +expect 5002600.615 3190179.530 + +accept 100.5821513570 44.6219279790 +expect 5608351.970 3324185.783 + +accept 110.0283698987 45.0603376392 +expect 6183798.502 3510751.426 + +accept 120.9059581322 45.6167638758 +expect 6858556.379 3768914.576 + +accept 130.8382094225 46.2623868954 +expect 7479609.418 4061298.725 + +accept 140.3050870951 46.3222134245 +expect 8098901.115 4333302.419 + +accept 150.7692866141 46.9256636829 +expect 8759282.574 4745456.067 + +accept 160.6423483126 47.3983214513 +expect 9371550.773 5189253.049 + +accept 170.3660263984 48.1704941243 +expect 9921744.591 5715878.904 + +accept 180.1728485128 48.3869676380 +expect -10452810.767 6233145.886 + +accept -179.3366303542 40.5764857623 +expect -11064985.137 5557446.981 + +accept -169.9016120813 40.9858722485 +expect -10415017.640 5046984.188 + +accept -159.8421069000 41.3352033138 +expect -9693683.857 4584354.161 + +accept -149.9878180879 41.8238911228 +expect -8970272.939 4230268.129 + +accept -139.8603273594 42.3826076660 +expect -8236029.698 3946841.156 + +accept -129.0166066782 42.7333243644 +expect -7482247.804 3687948.837 + +accept -119.3388991582 43.6373394362 +expect -6814813.949 3556870.147 + +accept -109.3805129308 43.9116610208 +expect -6170341.281 3398585.005 + +accept -99.7947564839 44.3361622416 +expect -5565812.101 3288505.423 + +accept -89.9466466666 45.2719659306 +expect -4955176.241 3240762.956 + +accept -79.0227489515 46.1464400004 +expect -4302718.131 3195776.905 + +accept -69.8148943004 46.5943287210 +expect -3771570.667 3149477.147 + +accept -59.7413792811 47.1807640935 +expect -3202028.794 3121345.514 + +accept -49.8815279751 47.1898937016 +expect -2660293.312 3061471.431 + +accept -39.6116669497 47.2588276162 +expect -2103308.236 3017259.465 + +accept -29.2023113842 48.0824833396 +expect -1541812.718 3044777.159 + +accept -19.5149453395 48.6918139540 +expect -1026306.480 3068551.199 + +accept -9.6336458263 49.0434719530 +expect -505461.907 3081586.975 + +accept 0.4543975995 49.7836456546 +expect 23777.504 3136347.935 + +accept 10.9700141403 50.3323164289 +expect 573327.428 3187475.308 + +accept 20.2945040946 50.5294422839 +expect 1061285.060 3219471.341 + +accept 30.9938167603 50.9444135429 +expect 1622296.392 3284285.467 + +accept 40.8850179873 51.0892523800 +expect 2145326.320 3336819.857 + +accept 50.8160896333 51.7186327718 +expect 2670455.247 3444230.679 + +accept 60.5975018363 51.7472739987 +expect 3198356.358 3513374.312 + +accept 70.9211780937 52.2961472542 +expect 3755656.007 3649240.500 + +accept 80.4886876286 52.4940883205 +expect 4283198.775 3765359.201 + +accept 90.6063621158 52.8917619975 +expect 4845216.723 3926850.931 + +accept 100.0213726456 53.0072065012 +expect 5381474.017 4075643.010 + +accept 110.7666710262 53.1761320615 +expect 6002387.050 4279156.043 + +accept 120.4133749558 53.6140202991 +expect 6556934.536 4522304.309 + +accept 130.4689014096 54.3464457214 +expect 7124048.584 4841940.061 + +accept 140.1319502152 55.1999540459 +expect 7653482.073 5205936.544 + +accept 150.0406833955 55.2259750645 +expect 8231914.631 5536917.537 + +accept 160.6632656727 55.6152942863 +expect 8813145.718 5981687.838 + +accept 170.1022885868 55.6436461375 +expect 9328803.345 6391660.249 + +accept 180.5533384236 56.5237207562 +expect -9735738.829 6914894.208 + +accept -179.2247622429 50.9111169957 +expect -10208607.447 6413665.425 + +accept -169.7924972767 51.7536923319 +expect -9617111.948 6014189.958 + +accept -159.6893113052 52.2420602240 +expect -8992940.568 5611018.295 + +accept -149.2250378095 52.6608417101 +expect -8338627.076 5249471.462 + +accept -139.5235597836 52.6880191938 +expect -7748063.996 4931880.210 + +accept -129.8722920081 52.7891165561 +expect -7157279.641 4668965.541 + +accept -119.6585401358 53.3027824621 +expect -6523737.589 4474430.220 + +accept -109.4717350642 53.5457403772 +expect -5914835.972 4290989.912 + +accept -99.3049585904 53.8711625087 +expect -5317309.229 4147683.328 + +accept -89.1067456005 53.9601597136 +expect -4736479.726 4008096.136 + +accept -79.6629562504 54.6547978698 +expect -4196286.812 3958062.567 + +accept -69.8279241005 55.2371531832 +expect -3648862.266 3910629.370 + +accept -59.9635334446 55.6192322641 +expect -3113545.379 3860627.969 + +accept -49.9264269173 56.5572332986 +expect -2571251.312 3877332.211 + +accept -39.0317197762 56.9105729373 +expect -2000116.599 3848938.560 + +accept -29.8485414955 57.1405754683 +expect -1524573.629 3831116.411 + +accept -19.7173893031 57.8895638096 +expect -1001946.186 3871323.208 + +accept -9.5284598326 58.3169856731 +expect -482748.075 3893995.092 + +accept 0.5519708680 59.1698787655 +expect 27843.757 3971499.805 + +accept 10.3102576934 59.9070126591 +expect 518383.957 4051426.264 + +accept 20.2471682871 60.1178484569 +expect 1017884.749 4092029.150 + +accept 30.7186291790 60.9667316568 +expect 1539950.301 4213756.217 + +accept 40.5361666024 61.0726031598 +expect 2035176.439 4271402.857 + +accept 50.1593218026 61.5209991783 +expect 2518306.294 4378497.037 + +accept 60.6426706803 61.6933237333 +expect 3051461.747 4479017.707 + +accept 70.0635629430 62.5101492783 +expect 3519070.146 4659116.189 + +accept 80.7525125683 62.7158368686 +expect 4066565.729 4805766.003 + +accept 90.3486210746 63.2666959744 +expect 4549151.501 5000629.808 + +accept 100.3103261370 63.6630728713 +expect 5055042.336 5206928.884 + +accept 110.4333486366 64.5625075877 +expect 5544588.666 5503654.246 + +accept 120.2948792100 65.1058556815 +expect 6028251.873 5782340.030 + +accept 130.5927832047 65.6748652993 +expect 6522940.319 6105850.437 + +accept 140.6012624076 66.3132526636 +expect 6983093.737 6463380.696 + +accept 150.8560042350 67.2695080089 +expect 7407700.123 6899834.886 + +accept 160.4312759692 67.7825785445 +expect 7809736.690 7288594.640 + +accept 170.6182278472 67.8589725624 +expect 8257493.223 7675010.400 + +accept 180.6346540849 67.9886371340 +expect -8615169.523 8037735.613 + +accept -179.3862724658 60.0765397412 +expect -9409858.860 7237943.395 + +accept -169.8319368721 60.7048897911 +expect -8892462.330 6874089.420 + +accept -159.7586035106 60.8099423764 +expect -8373658.128 6477781.193 + +accept -149.4451039042 60.8141416010 +expect -7830654.586 6105061.877 + +accept -139.0047357806 61.2863951253 +expect -7238746.216 5824802.025 + +accept -129.8203349111 61.6531963428 +expect -6721103.700 5609206.409 + +accept -119.9476298931 62.1392105751 +expect -6163537.132 5422258.227 + +accept -109.5579719203 62.6892094638 +expect -5582691.055 5264366.147 + +accept -99.2658471038 63.6397776749 +expect -5001335.481 5186237.501 + +accept -89.3190408834 64.2596249008 +expect -4462613.903 5101850.571 + +accept -79.8712042695 64.9388669541 +expect -3957350.660 5053673.793 + +accept -69.5143458832 64.9984151350 +expect -3431555.358 4940124.081 + +accept -59.7549744076 65.5198053592 +expect -2930531.346 4907235.702 + +accept -49.4522584709 65.6036762180 +expect -2417789.843 4834516.760 + +accept -39.6862901889 66.0522555435 +expect -1930302.252 4825742.348 + +accept -29.0676277333 66.9411073706 +expect -1402365.485 4882358.630 + +accept -19.2947838600 67.6760455583 +expect -924758.269 4940769.295 + +accept -9.8908486233 68.4759462496 +expect -470791.969 5023788.451 + +accept 0.7684849115 68.4820083161 +expect 36570.245 5017696.478 + +accept 10.9619070788 69.1271846096 +expect 518988.202 5110914.008 + +accept 20.8669367778 69.4597522731 +expect 985678.393 5178041.292 + +accept 30.9015874823 70.2228485919 +expect 1450977.848 5320350.646 + +accept 40.3644592677 70.4447947660 +expect 1893313.797 5401286.949 + +accept 50.4426463863 70.9370001765 +expect 2357733.911 5540352.544 + +accept 60.8571701571 71.2042128565 +expect 2840863.185 5668499.100 + +accept 70.2207367933 71.7513035300 +expect 3263071.274 5846454.476 + +accept 80.9197701425 72.2949102709 +expect 3742012.412 6060269.554 + +accept 90.9968622399 72.8817626201 +expect 4182037.591 6296350.257 + +accept 100.6140322356 73.0673811891 +expect 4615350.939 6484139.751 + +accept 110.0937440863 73.5055307300 +expect 5020529.626 6730333.834 + +accept 120.1366082758 74.4237054204 +expect 5401515.154 7088596.371 + +accept 130.7310123929 74.8225035758 +expect 5829427.956 7399976.843 + +accept 140.7557697839 75.3904414554 +expect 6198183.044 7749882.172 + +accept 150.8261707368 75.4797965998 +expect 6601790.754 8045032.409 + +accept 160.3617186765 76.0800713976 +expect 6904851.750 8427523.609 + +accept 170.3723095047 76.9487430385 +expect 7160097.253 8883978.785 + +accept 180.8353501206 77.0774046082 +expect -7451033.788 9196865.430 + +accept -179.7332624578 70.4393887237 +expect -8352576.455 8331537.300 + +accept -169.3475485875 71.1990434220 +expect -7846291.115 8032842.415 + +accept -159.2878573247 71.7560324305 +expect -7364104.304 7757743.784 + +accept -149.0633836490 72.7063403889 +expect -6827251.647 7569191.962 + +accept -139.6942131577 73.5163807564 +expect -6341247.119 7423166.084 + +accept -129.8134586050 73.9643420027 +expect -5867435.003 7238589.421 + +accept -119.5111667574 74.4925642590 +expect -5368260.354 7086271.451 + +accept -109.3071655658 74.6108323823 +expect -4906478.988 6896010.407 + +accept -99.5978241183 75.1275985390 +expect -4438705.543 6806711.516 + +accept -89.2137798701 75.6445071712 +expect -3946153.966 6730726.096 + +accept -79.1346028255 76.0354738901 +expect -3479800.008 6660516.066 + +accept -69.0638837521 76.5148306463 +expect -3014377.593 6628057.905 + +accept -59.1693658687 77.4423799967 +expect -2543880.527 6705578.610 + +accept -49.4634180765 78.1864565763 +expect -2099555.264 6773693.535 + +accept -39.8508153072 78.5203765703 +expect -1681563.114 6777405.489 + +accept -29.6114412219 78.7797877191 +expect -1243660.143 6778541.162 + +accept -19.1867860823 79.6454776348 +expect -792468.866 6932699.289 + +accept -9.9582630982 80.1780113525 +expect -406784.347 7037337.973 + +accept 0.8045877956 80.9823584569 +expect 32275.315 7229013.962 + +accept 10.6198537389 81.4079136814 +expect 421565.709 7348340.200 + +accept 20.7119981828 82.2150056342 +expect 804489.400 7594469.330 + +accept 30.3505244935 82.6478465607 +expect 1163485.615 7757650.909 + +accept 40.8655993799 82.9850228503 +expect 1548903.569 7915659.478 + +accept 50.7222864861 83.6349635667 +expect 1878353.123 8190395.486 + +accept 60.9484292190 84.1578297365 +expect 2209073.061 8452785.649 + +accept 70.9281849579 84.2418711822 +expect 2556434.364 8578888.109 + +accept 80.6700039410 84.7042458603 +expect 2843072.410 8854459.520 + +accept 90.2195191862 85.4123304310 +expect 3062193.052 9248148.617 + +accept 100.8308186795 86.2993989176 +expect 3233512.836 9778762.722 + +accept 110.2610774864 87.2488149984 +expect 3271018.801 10404221.588 + +accept 120.0282638556 87.9552070544 +expect 3287869.350 10991486.485 + +accept 130.8896115077 88.8068669405 +expect 3109942.957 11856621.688 + +accept 140.8963110473 89.7228156694 +expect 2304894.417 13439579.058 + +accept 150.4318097094 90.4391164019 +expect failure errno coord_transfm_invalid_coord + +accept 160.7127363327 90.6605815936 +expect failure errno coord_transfm_invalid_coord + +accept 170.7492804294 90.8176634524 +expect failure errno coord_transfm_invalid_coord + +accept 180.4583398460 90.9109976584 +expect failure errno coord_transfm_invalid_coord + +accept -179.7591323884 80.4424115493 +expect -6903393.952 9786682.886 + +accept -169.8822070628 80.7500588713 +expect -6531575.755 9548129.356 + +accept -159.9945746863 80.9496010459 +expect -6169272.314 9309595.559 + +accept -149.9417464353 81.4902616414 +expect -5735389.987 9165799.932 + +accept -139.6978190662 82.2239127957 +expect -5260169.587 9097892.645 + +accept -129.3012716885 83.0429415409 +expect -4766013.283 9092128.730 + +accept -119.1898998617 83.3279294780 +expect -4372133.574 8977351.665 + +accept -109.9862107641 83.5308131176 +expect -4021828.937 8875471.473 + +accept -99.5860433196 84.1789855873 +expect -3565728.493 8919632.792 + +accept -89.2677089488 84.1934914271 +expect -3206581.559 8779174.807 + +accept -79.3268775666 84.9722014413 +expect -2762678.704 8940646.845 + +accept -69.8212102616 85.0076410054 +expect -2434287.034 8852607.599 + +accept -59.3204702001 85.5856170742 +expect -2014364.675 8995544.515 + +accept -49.6961911803 86.4721128657 +expect -1603812.213 9344086.957 + +accept -39.6159279805 86.7872101641 +expect -1252848.694 9454262.547 + +accept -29.6502801920 87.1555761043 +expect -912288.029 9626048.356 + +accept -19.4496938483 87.5951755895 +expect -575538.601 9883989.014 + +accept -9.7937838350 88.5280609570 +expect -257529.241 10651674.770 + +accept 0.9510780379 88.6715513574 +expect 24396.904 10799028.318 + +accept 10.4788996031 89.0882607425 +expect 245024.182 11333021.357 + +accept 20.0454282778 89.3798616914 +expect 425823.124 11838688.204 + +accept 30.8762585995 89.9894216623 +expect 237234.260 14954822.615 + +accept 40.2272544657 90.2854737833 +expect failure errno coord_transfm_invalid_coord + +accept 50.3342208278 90.6201781373 +expect failure errno coord_transfm_invalid_coord + +accept 60.0620171885 91.1323497706 +expect failure errno coord_transfm_invalid_coord + +accept 70.7871678571 91.2021231110 +expect failure errno coord_transfm_invalid_coord + +accept 80.7237355733 91.8207335323 +expect failure errno coord_transfm_invalid_coord + +accept 90.5359055804 91.8495346522 +expect failure errno coord_transfm_invalid_coord + +accept 100.2370378259 92.3201685216 +expect failure errno coord_transfm_invalid_coord + +accept 110.7018248262 92.7082390660 +expect failure errno coord_transfm_invalid_coord + +accept 120.4791498907 92.8320642395 +expect failure errno coord_transfm_invalid_coord + +accept 130.7292413039 93.7863129954 +expect failure errno coord_transfm_invalid_coord + +accept 140.1002623482 94.2304861566 +expect failure errno coord_transfm_invalid_coord + +accept 150.7401582820 94.4002034978 +expect failure errno coord_transfm_invalid_coord + +accept 160.9690930362 95.0432445572 +expect failure errno coord_transfm_invalid_coord + +accept 170.5238000008 95.9332496636 +expect failure errno coord_transfm_invalid_coord + +accept 180.5593997844 96.9295538910 +expect failure errno coord_transfm_invalid_coord + +accept -179.2788799656 89.7588830795 +expect -2720982.745 13966946.704 + +accept -169.2920835775 90.4241930348 +expect failure errno coord_transfm_invalid_coord + +accept -159.9895526197 91.4107597532 +expect failure errno coord_transfm_invalid_coord + +accept -149.2463523987 92.1662912669 +expect failure errno coord_transfm_invalid_coord + +accept -139.5441662785 93.0270602663 +expect failure errno coord_transfm_invalid_coord + +accept -129.2489121030 93.8575161591 +expect failure errno coord_transfm_invalid_coord + +accept -119.2218964968 94.3245277139 +expect failure errno coord_transfm_invalid_coord + +accept -109.6391371233 94.8605218216 +expect failure errno coord_transfm_invalid_coord + +accept -99.7022656135 95.4188372117 +expect failure errno coord_transfm_invalid_coord + +accept -89.9236110047 96.1459344102 +expect failure errno coord_transfm_invalid_coord + +accept -79.3053114467 96.4284727639 +expect failure errno coord_transfm_invalid_coord + +accept -69.9403123372 97.1204524330 +expect failure errno coord_transfm_invalid_coord + +accept -59.8919954903 98.0976036625 +expect failure errno coord_transfm_invalid_coord + +accept -49.4360361183 99.0132534146 +expect failure errno coord_transfm_invalid_coord + +accept -39.1296215520 99.7082663882 +expect failure errno coord_transfm_invalid_coord + +accept -29.7429317093 100.3804719805 +expect failure errno coord_transfm_invalid_coord + +accept -19.9518617483 100.7090523427 +expect failure errno coord_transfm_invalid_coord + +accept -9.8094666546 100.7731576636 +expect failure errno coord_transfm_invalid_coord + +accept 0.6789399156 101.1890038152 +expect failure errno coord_transfm_invalid_coord + +accept 10.3002789517 101.6303167682 +expect failure errno coord_transfm_invalid_coord + +accept 20.3122591998 101.9746447499 +expect failure errno coord_transfm_invalid_coord + +accept 30.8403181671 102.1868812356 +expect failure errno coord_transfm_invalid_coord + +accept 40.5913833272 102.9224326125 +expect failure errno coord_transfm_invalid_coord + +accept 50.4094599185 103.4226263618 +expect failure errno coord_transfm_invalid_coord + +accept 60.2807542048 103.6337815648 +expect failure errno coord_transfm_invalid_coord + +accept 70.1179652096 103.9375646519 +expect failure errno coord_transfm_invalid_coord + +accept 80.0709906538 104.9002368302 +expect failure errno coord_transfm_invalid_coord + +accept 90.4905546467 104.9051484801 +expect failure errno coord_transfm_invalid_coord + +accept 100.8677613905 105.1778053719 +expect failure errno coord_transfm_invalid_coord + +accept 110.7875504667 106.1651152124 +expect failure errno coord_transfm_invalid_coord + +accept 120.3531685812 106.2777498204 +expect failure errno coord_transfm_invalid_coord + +accept 130.5786379336 106.8735960149 +expect failure errno coord_transfm_invalid_coord + +accept 140.2390732913 107.1035922681 +expect failure errno coord_transfm_invalid_coord + +accept 150.2230766093 107.9665006223 +expect failure errno coord_transfm_invalid_coord + +accept 160.0106199737 108.8731447468 +expect failure errno coord_transfm_invalid_coord + +accept 170.2666681817 109.4591245928 +expect failure errno coord_transfm_invalid_coord + +accept 180.2003062924 109.9750225424 +expect failure errno coord_transfm_invalid_coord + +------------------------------------------------------------------------------- +# Test inverse +------------------------------------------------------------------------------- +operation +proj=adams_ws2 +ellps=WGS84 +------------------------------------------------------------------------------- +direction forward +tolerance 1 mm + +accept 0 0 +expect 0 0 +roundtrip 1 + +accept 40 60 +expect 2021909.611 4162291.966 +roundtrip 1 + +accept 179.999 0 +expect 16686159.356 0.000 +roundtrip 1 + +accept -179.999 0 +expect -16686159.356 0.000 +roundtrip 1 + +accept 0 89.999 +expect 0 15743336.122 +roundtrip 1 + +accept 0 -89.999 +expect 0 -15743336.122 +roundtrip 1 + +# Results a bit different on x86 +tolerance 3 mm +accept 179.999 89.999 +expect 693320.704 16030515.906 +roundtrip 1 + +accept 179.999 -89.999 +expect 693320.702 -16030515.904 +roundtrip 1 + +accept -179.999 89.999 +expect -693320.702 16030515.904 +roundtrip 1 + +# This test fails with "roundtrip deviation: inf mm, expected: 3.000000 mm" on MacOS 13 x64 / clang 16.0.6 +#accept -179.999 -89.999 +#expect -693320.704 -16030515.906 +#roundtrip 1 + +direction inverse +accept 0.000005801264 16722285.492330472916 +expect failure errno coord_transfm_outside_projection_domain + + diff --git a/conformance/src/test/resources/gie/axisswap.gie b/conformance/src/test/resources/gie/axisswap.gie new file mode 100644 index 0000000..86ad6de --- /dev/null +++ b/conformance/src/test/resources/gie/axisswap.gie @@ -0,0 +1,109 @@ +------------------------------------------------------------------------------- + Tests for the axisswap operation +------------------------------------------------------------------------------- + + + +operation proj=axisswap order=1,2,3,4 +tolerance 0.000001 m +accept 1 2 3 4 +expect 1 2 3 4 +roundtrip 100 + +operation proj=axisswap order=4,3,2,1 +tolerance 0.000001 m +accept 1 2 3 4 +expect 4 3 2 1 +roundtrip 100 + +operation proj=axisswap order=-1,-2,-3,-4 +tolerance 0.000001 m +accept 1 2 3 4 +expect -1 -2 -3 -4 +roundtrip 100 + +operation proj=axisswap order=1,2,-3,4 +tolerance 0.000001 m +accept 1 2 3 4 +expect 1 2 -3 4 +roundtrip 100 + +operation proj=axisswap order=-1,2,3,4 +tolerance 0.000001 m +accept 1 2 3 4 +expect -1 2 3 4 +roundtrip 100 + +operation proj=axisswap order=1,2,3,-4 +tolerance 0.000001 m +accept 1 2 3 4 +expect 1 2 3 -4 +roundtrip 100 + +operation proj=axisswap order=-2,1 +tolerance 0.000001 m +accept 1 2 3 4 +expect -2 1 3 4 +roundtrip 100 + +operation proj=axisswap order=3,-2,1 +tolerance 0.000001 m +accept 1 2 3 4 +expect 3 -2 1 4 +roundtrip 100 + +operation proj=axisswap axis=neu +tolerance 0 m +accept 1 2 3 +expect 2 1 3 + +# when using the +axis parameter we specify the order of the INPUT coordinate, +# as opposed to +order which relates to the OUTPUT coordinate. Here we test +# that n(1), u(2) and e(3) are swapped correctly to enu ordering. +operation proj=axisswap axis=nue +tolerance 0 m +accept 1 2 3 +expect 2 3 1 + +operation proj=axisswap axis=swd +tolerance 0.000001 m +accept 1 2 3 4 +expect -2 -1 -3 4 + +operation proj=pipeline \ + step proj=latlong +ellps=WGS84 \ + step proj=axisswap \ + order=1,2,3,4 + +tolerance 0.00001 m +accept 12 55 0 0 +expect 12 55 0 0 + +operation proj=pipeline \ + step proj=latlong +ellps=WGS84 \ + step proj=axisswap \ + order=-2,-1,3,4 + +tolerance 0.00001 m +accept 12 55 0 0 +expect -55 -12 0 0 + +operation proj=axisswap order=1,2,3,4 axis=enu +expect failure pjd_err_axis + +operation proj=axisswap +expect failure pjd_err_axis + +operation proj=axisswap order=1,2,1,4 +expect failure pjd_err_axis + +operation proj=axisswap order=2,3 +expect failure pjd_err_axis + +operation proj=axisswap order=2,3,4 +expect failure pjd_err_axis + +operation proj=axisswap order=1,2,3,5 +expect failure pjd_err_axis + + diff --git a/conformance/src/test/resources/gie/builtins.gie b/conformance/src/test/resources/gie/builtins.gie new file mode 100644 index 0000000..886bd0e --- /dev/null +++ b/conformance/src/test/resources/gie/builtins.gie @@ -0,0 +1,8352 @@ +=============================================================================== + +Test material, mostly converted from selftest entries in PJ_xxx.c + +Most of this material was autogenerated, and does not attempt to exercise +corner cases etc. + +See more_builtins.gie for some test cases with a more human touch. + +=============================================================================== + + +# First test non strict gie + + + +operation +proj=aea + +ellps=GRS80 +lat_1=0 +lat_2=2 +tolerance 0.1 mm +accept 2 1 +expect 222571.608757106 110653.326743030 + +unknown_keyword + + + + + + +=============================================================================== +# Albers Equal Area +# Conic Sph&Ell +# lat_1= lat_2= +=============================================================================== +------------------------------------------------------------------------------- +operation +proj=aea +ellps=GRS80 +lat_1=0 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222571.608757106 110653.326743030 +accept 2 -1 +expect 222706.306508391 -110484.267144400 +accept -2 1 +expect -222571.608757106 110653.326743030 +accept -2 -1 +expect -222706.306508391 -110484.267144400 +accept 150 50 +expect 16468399.3582 5275043.9815 + +direction inverse +accept 200 100 +expect 0.001796631 0.000904369 +accept 200 -100 +expect 0.001796630 -0.000904370 +accept -200 100 +expect -0.001796631 0.000904369 +accept -200 -100 +expect -0.001796630 -0.000904370 +accept 16468399.3582 5275043.9815 +expect 150 50 + +------------------------------------------------------------------------------- +operation +proj=aea +R=6400000 +lat_1=0 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223334.085170885 111780.431884472 +accept 2 -1 +expect 223470.154991687 -111610.339430990 +accept -2 1 +expect -223334.085170885 111780.431884472 +accept -2 -1 +expect -223470.154991687 -111610.339430990 + +direction inverse +accept 200 100 +expect 0.001790494 0.000895246 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790494 0.000895246 +accept -200 -100 +expect -0.001790493 -0.000895247 + +operation +proj=aea +ellps=GRS80 +lat_1=900 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=aea +ellps=GRS80 +lat_2=900 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=aea +R=6400000 +lat_1=1 +lat_2=-1 +expect failure errno invalid_op_illegal_arg_value + +------------------------------------------------------------------------------- +operation +proj=aea +a=9999999 +b=.9 +lat_2=1 +------------------------------------------------------------------------- +expect failure errno invalid_op_illegal_arg_value + +=============================================================================== +# Azimuthal Equidistant +# Azi, Sph&Ell +# lat_0 guam +=============================================================================== + +------------------------------------------------------------------------------- +# Test equatorial aspect of the spherical azimuthal equidistant. Test data from +# Snyder pp. 196-197, table 30. +------------------------------------------------------------------------------- +operation +proj=aeqd +R=1 +lat_0=0 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 0 +roundtrip 100 +accept 0 90 +expect 0 1.57080 +roundtrip 100 +accept 10 80 +expect 0.04281 1.39829 +roundtrip 100 +accept 40 30 +expect 0.62896 0.56493 +roundtrip 100 +accept 90 0 +expect 1.57080 0 +roundtrip 100 +accept 90 90 +expect 0 1.57080 +roundtrip 100 + +# point opposite projection center is undefined +accept 180 0 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +# Test equatorial aspect of the ellipsoidal azimuthal equidistant. Test data from +# Snyder pp. 196-197, table 30. +------------------------------------------------------------------------------- +operation +proj=aeqd +ellps=GRS80 +lat_0=0 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 90 +expect 0 10001965.7292 +roundtrip 100 +accept 0 0 +expect 0 0 +roundtrip 100 +accept 90 0 +expect 10_018_754.1714 0 +roundtrip 100 +accept 90 0 +expect 10_018_754.1714 0 +roundtrip 100 +accept 45 45 +expect 3_860_398.3783 5_430_089.0490 +roundtrip 100 + + +# Test oblique aeqd with point very close lon_0, lat_0, on a perfect sphere +operation +proj=aeqd +a=6371008.771415 +b=6371008.771415 +lat_0=30.2345 +lon_0=-120.2345 +tolerance 1 mm +accept -120.234501 30.234501 +expect -0.096 0.111 +roundtrip 1 + +accept -120.2345 30.2345 +expect 0.000 0.000 +roundtrip 1 + +# Same on an ellipsoid very close to the sphere +operation +proj=aeqd +a=6371008.771415 +b=6371008.771414 +lat_0=30.2345 +lon_0=-120.2345 +tolerance 1 mm +accept -120.234501 30.234501 +expect -0.096 0.111 +roundtrip 1 + +accept -120.2345 30.2345 +expect 0.000 0.000 +roundtrip 1 + +------------------------------------------------------------------------------- +# Test the Modified Azimuthal Equidistant / EPSG 9832. Test data from the EPSG +# Guidance Note 7 part 2, April 2018, p. 85 +------------------------------------------------------------------------------- +operation +proj=aeqd +ellps=clrk66 +lat_0=9.546708325068591 +lon_0=138.1687444500492 +x_0=40000.00 +y_0=60000.00 +------------------------------------------------------------------------------- +tolerance 1 cm +accept 138.19303001104092 9.596525859439623 +expect 42665.90 65509.82 +roundtrip 100 + +direction inverse +accept 42665.90 65509.82 +expect 138.19303001104092 9.596525859439623 + +------------------------------------------------------------------------------- +# Test the azimuthal equidistant modified for Guam. Test data from the EPSG +# Guidance Note 7 part 2, September 2016, p. 85 +------------------------------------------------------------------------------- +operation +proj=aeqd +guam +ellps=clrk66 +x_0=50000.00 +y_0=50000.00 \ + +lon_0=144.74875069444445 +lat_0=13.47246633333333 +------------------------------------------------------------------------------- +tolerance 1 cm +accept 144.635331291666660 13.33903846111111 +expect 37712.48 35242.00 +roundtrip 100 + +direction inverse +accept 37712.48 35242.00 +expect 144.635331291666660 13.33903846111111 + +------------------------------------------------------------------------------- +# Test northern polar aspect of the ellipsoidal azimuthal equidistant. Test data +# from Snyder p. 198, table 31. +------------------------------------------------------------------------------- +operation +proj=aeqd +ellps=intl +lat_0=90 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept 0 90 +expect 0 0 +roundtrip 100 +accept 0 85 +expect 0 -558_485.4 +roundtrip 100 +accept 0 80 +expect 0 -1_116_885.2 +roundtrip 100 +accept 0 70 +expect 0 -2_233_100.9 +roundtrip 100 + +------------------------------------------------------------------------------- +# Test southern polar aspect of the ellipsoidal azimuthal equidistant. Test data +# from Snyder p. 198, table 31. +------------------------------------------------------------------------------- +operation +proj=aeqd +ellps=intl +lat_0=-90 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept 0 -90 +expect 0 0 +roundtrip 100 +accept 0 -85 +expect 0 558_485.4 +roundtrip 100 +accept 0 -80 +expect 0 1_116_885.2 +roundtrip 100 +accept 0 -70 +expect 0 2_233_100.9 +roundtrip 100 + +------------------------------------------------------------------------------- +# Test northern polar aspect of the spherical azimuthal equidistant. +------------------------------------------------------------------------------- +operation +proj=aeqd +R=1 +lat_0=90 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept 0 0 +expect 0 -1.5708 +roundtrip 100 +accept 0 90 +expect 0 0 +roundtrip 100 +accept 90 90 +expect 0 0 +roundtrip 100 +accept 90 0 +expect 1.5708 0 +roundtrip 100 +accept 45 45 +expect 0.5554 -0.5554 +roundtrip 100 + +#point opposite of projection center is undefined +accept 0 -90 +expect failure errno coord_transfm_outside_projection_domain + +direction inverse +accept 0 5 +expect failure errno coord_transfm_outside_projection_domain + +accept 0 3.14159265359 +expect 180 -90 + +------------------------------------------------------------------------------- +# Test sourthnern polar aspect of the spherical azimuthal equidistant. +------------------------------------------------------------------------------- +operation +proj=aeqd +R=1 +lat_0=-90 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept 0 0 +expect 0 1.5708 +roundtrip 100 +accept 0 -90 +expect 0 0 +roundtrip 100 +accept 90 -90 +expect 0 0 +roundtrip 100 +accept 90 0 +expect 1.5708 0 +roundtrip 100 +accept 45 -45 +expect 0.5554 0.5554 +roundtrip 100 + +#point opposite of projection center is undefined +accept 0 90 +expect failure errno coord_transfm_outside_projection_domain + + +------------------------------------------------------------------------------- +# Test oblique aspect of the spherical azimuthal equidistant. +------------------------------------------------------------------------------- +operation +proj=aeqd +R=1 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept 0 0 +expect 0.0000 -0.7854 +roundtrip 100 +accept 0 45 +expect 0.0000 0.0000 +roundtrip 100 +accept 0 90 +expect 0.0000 0.7854 +roundtrip 100 +accept 90 0 +expect 1.5708 -0.0000 +roundtrip 100 +accept 90 45 +expect 0.8550 0.6046 +#roundtrip 100 # roundtrip performs badly for this test on some platforms +accept 90 90 +expect 0.0000 0.7854 +roundtrip 100 + +------------------------------------------------------------------------------- +# Test oblique aspect of the ellipsoidal azimuthal equidistant. +------------------------------------------------------------------------------- +operation +proj=aeqd +ellps=GRS80 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept 0 0 +expect 0.0000 -4984944.3779 +roundtrip 100 +accept 0 45 +expect 0.0000 0.0000 +roundtrip 100 +accept 0 90 +expect 0.0000 5017021.3514 +roundtrip 100 +accept 90 0 +expect 10010351.5666 26393.3781 +roundtrip 100 +accept 90 45 +expect 5461910.9128 3863514.7047 +roundtrip 100 +accept 90 90 +expect 0.0000 5017021.3514 +roundtrip 100 + +=============================================================================== +# Airy +# Misc Sph, no inv. +# no_cut lat_b= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=airy +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 189109.886908621 94583.752387504 +accept 2 -1 +expect 189109.886908621 -94583.752387504 +accept -2 1 +expect -189109.886908621 94583.752387504 +accept -2 -1 +expect -189109.886908621 -94583.752387504 + +------------------------------------------------------------------------------- +# Test north polar aspect +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +lat_0=90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 -1.3863 +accept 0 90 +expect 0 0 +accept 0 -90 +expect failure errno coord_transfm_outside_projection_domain + + +------------------------------------------------------------------------------- +# Test south polar aspect +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +lat_0=-90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 1.3863 +accept 0 -90 +expect 0 0 +accept 0 90 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +# Test oblique aspect +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +lon_0=45 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 45 45 +expect 0 0 +accept 0 0 +expect -0.7336 -0.5187 +accept -45 -45 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +# Test that coordinates on the opposing hemisphere are projected when using +# +no_cut. +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +lat_0=-90 +no_cut +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 10 +expect 0 1.5677 + + +------------------------------------------------------------------------------- +# Test the +lat_b parameter +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +lat_b=89.99999999 # check tolerance +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 0 +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +lat_b=30 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 0 +accept 25 25 +expect 0.3821 0.4216 + +------------------------------------------------------------------------------- +operation +proj=airy +R=1 +no_cut +------------------------------------------------------------------------------- +accept -180 0 +expect failure errno coord_transfm_outside_projection_domain + +=============================================================================== +# Aitoff +# Misc Sph +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=aitoff +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223379.458811696 111706.742883853 +accept 2 -1 +expect 223379.458811696 -111706.742883853 +accept -2 1 +expect -223379.458811696 111706.742883853 +accept -2 -1 +expect -223379.458811696 -111706.742883853 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Mod. Stereographic of Alaska +# Azi(mod) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=alsk +ellps=clrk66 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -160.000000000 55.000000000 +expect -513253.146950842 -968928.031867943 +accept -160.000000000 70.000000000 +expect -305001.133897637 687494.464958651 +accept -145.000000000 70.000000000 +expect 266454.305088600 683423.477493031 +accept -145.000000000 60.000000000 +expect 389141.322439244 -423913.251230397 + +direction inverse +accept -500000.000000000 -950000.000000000 +expect -159.830804303 55.183195262 +accept -305000.000000000 700000.000000000 +expect -160.042203156 70.111086864 +accept 250000.000000000 700000.000000000 +expect -145.381043551 70.163900908 +accept 400000.000000000 -400000.000000000 +expect -144.758985461 60.202929201 + +------------------------------------------------------------------------------- +operation +proj=alsk +R=6370997 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -160.000000000 55.000000000 +expect -511510.319410844 -967150.991676078 +accept -160.000000000 70.000000000 +expect -303744.771290369 685439.745941123 +accept -145.000000000 70.000000000 +expect 265354.974019663 681386.892874573 +accept -145.000000000 60.000000000 +expect 387711.995394027 -422980.685505463 + +direction inverse +accept -500000.000000000 -950000.000000000 +expect -159.854014458 55.165653849 +accept -305000.000000000 700000.000000000 +expect -160.082332372 70.128307618 +accept 250000.000000000 700000.000000000 +expect -145.347827407 70.181566919 +accept 400000.000000000 -400000.000000000 +expect -144.734239827 60.193564733 + + +=============================================================================== +# Apian Globular I +# Misc Sph, no inv. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=apian +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223374.577355253 111701.072127637 +accept 2 -1 +expect 223374.577355253 -111701.072127637 +accept -2 1 +expect -223374.577355253 111701.072127637 +accept -2 -1 +expect -223374.577355253 -111701.072127637 + + +=============================================================================== +# August Epicycloidal +# Misc Sph, no inv. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=august +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223404.978180972 111722.340289763 +accept 2 -1 +expect 223404.978180972 -111722.340289763 +accept -2 1 +expect -223404.978180972 111722.340289763 +accept -2 -1 +expect -223404.978180972 -111722.340289763 + + +=============================================================================== +# Bacon Globular +# Misc Sph, no inv. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=bacon +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223334.132555965 175450.725922666 +accept 2 -1 +expect 223334.132555965 -175450.725922666 +accept -2 1 +expect -223334.132555965 175450.725922666 +accept -2 -1 +expect -223334.132555965 -175450.725922666 + + +=============================================================================== +# Bipolar conic of western hemisphere +# Conic Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=bipc +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 2452160.217725756 -14548450.759654747 +accept 2 -1 +expect 2447915.213725341 -14763427.212798730 +accept -2 1 +expect 2021695.522934909 -14540413.695283702 +accept -2 -1 +expect 2018090.503004699 -14755620.651414108 + +direction inverse +accept 200 100 +expect -73.038700285 17.248118466 +accept 200 -100 +expect -73.037303739 17.249414978 +accept -200 100 +expect -73.035893173 17.245536403 +accept -200 -100 +expect -73.034496627 17.246832896 + +------------------------------------------------------------------------------- +operation +proj=bipc +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 2460565.740974965 -14598319.989330800 +accept 2 -1 +expect 2456306.185935200 -14814033.339502094 +accept -2 1 +expect 2028625.497819099 -14590255.375482792 +accept -2 -1 +expect 2025008.120589143 -14806200.018759441 + +direction inverse +accept 200 100 +expect -73.038693105 17.248116270 +accept 200 -100 +expect -73.037301330 17.249408353 +accept -200 100 +expect -73.035895582 17.245543028 +accept -200 -100 +expect -73.034503807 17.246835092 + + +=============================================================================== +# Boggs Eumorphic +# PCyl., no inv., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=boggs +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 211949.700808182 117720.998305411 +accept 2 -1 +expect 211949.700808182 -117720.998305411 +accept -2 1 +expect -211949.700808182 117720.998305411 +accept -2 -1 +expect -211949.700808182 -117720.998305411 + + +=============================================================================== +# Bonne (Werner lat_1=90) +# Conic Sph&Ell +# lat_1= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=bonne +ellps=GRS80 +lat_1=0.5 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222605.296097157 55321.139565495 +accept 2 -1 +expect 222605.296099239 -165827.647799052 +accept -2 1 +expect -222605.296097157 55321.139565495 +accept -2 -1 +expect -222605.296099239 -165827.647799052 + +direction inverse +accept 200 100 +expect 0.001796699 0.500904369 +accept 200 -100 +expect 0.001796698 0.499095631 +accept -200 100 +expect -0.001796699 0.500904369 +accept -200 -100 +expect -0.001796698 0.499095631 + +------------------------------------------------------------------------------- +operation +proj=bonne +ellps=GRS80 +lat_1=-0.5 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222605.2961 165827.6478 +roundtrip 1 + +accept 2 -1 +expect 222605.2961 -55321.1396 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=bonne +ellps=GRS80 +lat_1=90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 90 +expect 0 0 + +direction inverse +accept 0 0 +expect 0 90 + +------------------------------------------------------------------------------- +operation +proj=bonne +ellps=GRS80 +lat_1=-90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 -90 +expect 0 0 + +direction inverse +accept 0 0 +expect 0 -90 + +------------------------------------------------------------------------------- +operation +proj=bonne +R=6400000 +lat_1=0.5 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223368.115572528 55884.555246394 +accept 2 -1 +expect 223368.115574632 -167517.599369694 +accept -2 1 +expect -223368.115572528 55884.555246394 +accept -2 -1 +expect -223368.115574632 -167517.599369694 + +direction inverse +accept 200 100 +expect 0.001790562 0.500895246 +accept 200 -100 +expect 0.001790561 0.499104753 +accept -200 100 +expect -0.001790562 0.500895246 +accept -200 -100 +expect -0.001790561 0.499104753 + +------------------------------------------------------------------------------- +operation +proj=bonne +R=6400000 +lat_1=-0.5 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223368.1156 167517.5994 +roundtrip 1 + +accept 2 -1 +expect 223368.1156 -55884.5552 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=bonne +R=6400000 +lat_1=90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 90 +expect 0 0 + +direction inverse +accept 0 0 +expect 0 90 + +------------------------------------------------------------------------------- +operation +proj=bonne +R=6400000 +lat_1=-90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 -90 +expect 0 0 + +direction inverse +accept 0 0 +expect 0 -90 + +=============================================================================== +# Cal Coop Ocean Fish Invest Lines/Stations +# Cyl, Sph&Ell +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=calcofi +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 508.444872150 -1171.764860418 +accept 2 -1 +expect 514.999168152 -1145.821981468 +accept -2 1 +expect 500.685384125 -1131.445377920 +accept -2 -1 +expect 507.369719137 -1106.178201483 + +direction inverse +accept 200 100 +expect -110.363307925 12.032056976 +accept 200 -100 +expect -98.455008863 18.698723643 +accept -200 100 +expect -207.447024504 81.314089279 +accept -200 -100 +expect -62.486322854 87.980755945 + +------------------------------------------------------------------------------- +operation +proj=calcofi +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 507.090507488 -1164.727375198 +accept 2 -1 +expect 513.686136375 -1138.999268217 +accept -2 1 +expect 499.336261476 -1124.435130997 +accept -2 -1 +expect 506.060570393 -1099.375665067 + +direction inverse +accept 200 100 +expect -110.305190410 12.032056976 +accept 200 -100 +expect -98.322360950 18.698723643 +accept -200 100 +expect -207.544906814 81.314089279 +accept -200 -100 +expect -62.576950372 87.980755945 + +operation +proj=calcofi +lon_0=50 +ellps=WGS84 +accept 10 50 +expect 303.525850 -1576.974388 +roundtrip 100 + +operation +proj=calcofi +ellps=GRS80 +lon_0=50 +accept 10 50 +expect 303.525850 -1576.974388 +roundtrip 100 + +operation +proj=calcofi +R=400 +lon_0=50 +x_0=10000 +y_0=500000 +accept 10 50 +expect 301.769827 -1567.849822 +roundtrip 100 + + +=============================================================================== +# Cassini +# Cyl, Sph&Ell +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=cass +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222605.285776991 110642.229253999 +roundtrip 1 +accept 2 -1 +expect 222605.285776991 -110642.229253999 +accept -2 1 +expect -222605.285776991 110642.229253999 +accept -2 -1 +expect -222605.285776991 -110642.229253999 + +direction inverse +accept 200 100 +expect 0.001796631 0.000904369 +accept 200 -100 +expect 0.001796631 -0.000904369 +accept -200 100 +expect -0.001796631 0.000904369 +accept -200 -100 +expect -0.001796631 -0.000904369 + +------------------------------------------------------------------------------- +operation +proj=cass +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223368.105203484 111769.145040586 +accept 2 -1 +expect 223368.105203484 -111769.145040586 +accept -2 1 +expect -223368.105203484 111769.145040586 +accept -2 -1 +expect -223368.105203484 -111769.145040586 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + +------------------------------------------------------------------------------- +# test point from EPSG Guidance Note 7.2 +operation +proj=cass +lat_0=10.4416666666667 +lon_0=-61.3333333333333 \ + +x_0=86501.46392052 +y_0=65379.0134283 \ + +a=6378293.64520876 +b=6356617.98767984 +to_meter=0.201166195164 +------------------------------------------------------------------------------- + +tolerance 0.1 mm +accept -62 10 +expect 66644.94040882 82536.21873655 +roundtrip 1 + +------------------------------------------------------------------------------- +# Hyperbolic variant: test point from EPSG Guidance Note 7.2 +operation +proj=cass +hyperbolic +a=6378306.376305601 +rf=293.466307 \ + +lat_0=-16.25 +lon_0=179.33333333333333 +to_meter=20.1168 \ + +x_0=251727.9155424 +y_0=334519.953768 +------------------------------------------------------------------------------- + +tolerance 0.1 mm +accept 179.99433652777776 -16.841456527777776 +expect 16015.28901692 13369.66005367 +roundtrip 1 + + +------------------------------------------------------------------------------- +# Scenario of https://github.com/OSGeo/PROJ/issues/4385 +------------------------------------------------------------------------------- +operation +proj=cass +lat_0=50.6177 +lon_0=-1.19725 +x_0=500000 +y_0=100000 +ellps=airy +units=m + +tolerance 0.1 mm +direction inverse + +accept 300000 100000 +expect -4.022094267169 50.583438725252 + +accept 500000 100000 +expect -1.19725 50.6177 + +=============================================================================== +# Central Conic +# Sph +# lat_1 +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=pipeline +R=6390000 \ + +step +proj=ccon +lat_1=52 +lat_0=52 +lon_0=19 +x_0=330000 +y_0=-350000 \ + +step +proj=axisswap +order=1,-2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 24 55 +expect 650031.54109413219363 4106.1617770643609028 +accept 15 49 +expect 37074.189007307473069 676826.23559270039774 +accept 24 49 +expect 696053.36061617843913 672294.56795827199940 +accept 19 52 +expect 330000.00000000000000 350000.00000000000000 + +direction inverse +accept 0 0 +expect 13.840227318521004431 55.030403993648806391 +accept 0 700000 +expect 14.514453594615022781 48.773847834747808675 +accept 700000 0 +expect 24.782707184271129766 55.003515505218481835 +accept 700000 700000 +expect 24.027610763560529927 48.750476070495021286 +accept 330000 350000 +expect 19.000000000000000000 52.000000000000000000 + + +=============================================================================== +# Central Cylindrical +# Cyl, Sph +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=cc +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 111712.415540593 +accept 2 -1 +expect 223402.144255274 -111712.415540593 +accept -2 1 +expect -223402.144255274 111712.415540593 +accept -2 -1 +expect -223402.144255274 -111712.415540593 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Equal Area Cylindrical +# Cyl, Sph&Ell +# lat_ts= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=cea +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222638.981586547 110568.812396267 +accept 2 -1 +expect 222638.981586547 -110568.812396266 +accept -2 1 +expect -222638.981586547 110568.812396267 +accept -2 -1 +expect -222638.981586547 -110568.812396266 +accept 150 50 +expect 16697923.6190 4865983.5552 + +direction inverse +accept 200 100 +expect 0.001796631 0.000904369 +accept 200 -100 +expect 0.001796631 -0.000904369 +accept -200 100 +expect -0.001796631 0.000904369 +accept -200 -100 +expect -0.001796631 -0.000904369 +accept 16697923.6190 4865983.5552 +expect 150 50 + +------------------------------------------------------------------------------- +operation +proj=cea +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 111695.401198614 +accept 2 -1 +expect 223402.144255274 -111695.401198614 +accept -2 1 +expect -223402.144255274 111695.401198614 +accept -2 -1 +expect -223402.144255274 -111695.401198614 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Chamberlin Trimetric +# Misc Sph, no inv. +# lat_1= lon_1= lat_2= lon_2= lat_3= lon_3= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=chamb +R=6400000 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 2.5 mm +accept 2 1 +expect -27864.779586801 -223364.324593274 +accept 2 -1 +expect -251312.283053493 -223402.145526208 +accept -2 1 +expect -27864.785649105 223364.327328827 +accept -2 -1 +expect -251312.289116443 223402.142197287 + + +=============================================================================== +# Collignon +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=collg +a=6400000 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 249872.921577930 99423.174788460 +accept 2 -1 +expect 254272.532301245 -98559.307760743 +accept -2 1 +expect -249872.921577930 99423.174788460 +accept -2 -1 +expect -254272.532301245 -98559.307760743 + +direction inverse +accept 200 100 +expect 0.001586797 0.001010173 +accept 200 -100 +expect 0.001586769 -0.001010182 +accept -200 100 +expect -0.001586797 0.001010173 +accept -200 -100 +expect -0.001586769 -0.001010182 + + +=============================================================================== +# Compact Miller +# Cyl., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=comill +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 110611.859089459 +accept 2 -1 +expect 223402.144255274 -110611.859089459 +accept -2 1 +expect -223402.144255274 110611.859089459 +accept -2 -1 +expect -223402.144255274 -110611.859089459 + +direction inverse +accept 200 100 +expect 0.001790493 0.000904107 +accept 200 -100 +expect 0.001790493 -0.000904107 +accept -200 100 +expect -0.001790493 0.000904107 +accept -200 -100 +expect -0.001790493 -0.000904107 + + +=============================================================================== +# Craster Parabolic (Putnins P4) +# PCyl., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=crast +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 218280.142056781 114306.045604280 +accept 2 -1 +expect 218280.142056781 -114306.045604280 +accept -2 1 +expect -218280.142056781 114306.045604280 +accept -2 -1 +expect -218280.142056781 -114306.045604280 + +direction inverse +accept 200 100 +expect 0.001832259 0.000874839 +accept 200 -100 +expect 0.001832259 -0.000874839 +accept -200 100 +expect -0.001832259 0.000874839 +accept -200 -100 +expect -0.001832259 -0.000874839 + + +=============================================================================== +# Denoyer Semi-Elliptical +# PCyl., no inv., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=denoy +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223377.422876954 111701.072127637 +accept 2 -1 +expect 223377.422876954 -111701.072127637 +accept -2 1 +expect -223377.422876954 111701.072127637 +accept -2 -1 +expect -223377.422876954 -111701.072127637 + + +=============================================================================== +# Airocean +# Sph., Ellps. +# (Each of the 23 faces tested separately around their center, inverse included) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=airocean +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 23 28 +expect 13572113.73386754 23493648.55327798 +accept 71 46 +expect 9714915.991790695 23488176.361173604 +accept 147 75 +expect 7723484.49359606 20087141.837650128 +accept -77 61 +expect 9679376.816000767 16802749.593532257 +accept -26 35 +expect 15458567.83864155 20091165.592037637 +accept 29 -13 +expect 15471813.400558881 26802282.415074058 +accept 71 -25 +expect 9737210.823606653 30219178.19260869 +accept 97 10 +expect 7670302.042847798 26816601.848991044 +accept 169 35 +expect 3883710.702444233 20135415.72144515 +accept -151 13 +expect 3859776.9744116343 13387384.422000753 +accept -109 24 +expect 7674343.074326526 13366009.083146008 +accept -84 -9 +expect 9673007.441581018 10144952.26955531 +accept -42 -4 +expect 13562062.520622183 10107761.706502315 +accept -11 -34 +expect 13627060.52678455 3383645.5697278716 +accept 155 -35 +expect 1873264.8705730252 30211340.763352156 +accept -158 -28 +expect 1871227.8450291778 10115901.323020123 +accept -109 -46 +expect 7708744.672461299 6722251.06988263 +accept -36 -75 +expect 9665810.798055789 3381177.9821538515 +accept 98 -49 +expect 4806946.337586326 33007546.454859577 +accept 114 -72 +expect 7708905.600709579 1101689.019137724 +accept 143 -9 +expect 3219027.0687154396 27948068.75709961 +accept 123 7 +expect 5239165.493429321 26821978.017945066 +accept 147 16 +expect 2635947.740851659 22373572.978527334 + +direction inverse +accept 13600000 23500000 +expect 22.77346472511832 27.745464601997153 +accept 9700000 23500000 +expect 71.26673004703193 45.89205035111361 +accept 7700000 20100000 +expect 146.99339940860168 74.69909794660227 +accept 9700000 16800000 +expect -76.55528563752168 60.90966578454296 +accept 15500000 20100000 +expect -26.125789701735282 34.531335035632864 +accept 15500000 26800000 +expect 28.72566754254401 -13.176397846758185 +accept 9700000 30200000 +expect 71.49135806675328 -24.84162689595362 +accept 7700000 26800000 +expect 96.67476470896398 10.214265110489109 +accept 3900000 20100000 +expect 169.4467058181239 35.245717462371594 +accept 3900000 13400000 +expect -150.6222299120939 13.304599775998279 +accept 7700000 13400000 +expect -108.74281284723317 24.422067806064522 +accept 9700000 10100000 +expect -83.65325201216521 -9.486900253798344 +accept 13600000 10100000 +expect -41.56143010477453 -4.013493146314863 +accept 13600000 3400000 +expect -11.279582965366556 -34.27261608163502 +accept 1900000 30200000 +expect 154.64715194333021 -34.84574824559832 +accept 1900000 10100000 +expect -157.58387651437764 -28.052389289696965 +accept 7700000 6700000 +expect -109.19369493541197 -46.23421830648926 +accept 9700000 3400000 +expect -35.93009713541779 -74.56175824137314 +accept 4800000 33000000 +expect 98.172013849367 -49.00298561868703 +accept 7700000 1100000 +expect 114.26109340373671 -71.94195405675616 +accept 3200000 27900000 +expect 143.30076636407907 -8.522097079186306 +accept 5200000 26800000 +expect 123.44730422061694 7.179239072128023 +accept 2600000 22400000 +expect 146.8547812565557 15.542304306692937 +accept 0 0 +expect failure + + +------------------------------------------------------------------------------- +operation +proj=airocean +orient=horizontal +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 23 28 +expect 13391387.087562159 13572113.73386754 +accept 71 46 +expect 13396859.279666536 9714915.991790695 +accept 147 75 +expect 16797893.80319001 7723484.49359606 +accept -77 61 +expect 20082286.04730788 9679376.816000767 +accept -26 35 +expect 16793870.048802502 15458567.83864155 +accept 29 -13 +expect 10082753.22576608 15471813.400558881 +accept 71 -25 +expect 6665857.448231446 9737210.823606653 +accept 97 10 +expect 10068433.791849095 7670302.042847798 +accept 169 35 +expect 16749619.919394989 3883710.702444233 +accept -151 13 +expect 23497651.218839385 3859776.9744116343 +accept -109 24 +expect 23519026.557694133 7674343.074326526 +accept -84 -9 +expect 26740083.371284828 9673007.441581018 +accept -42 -4 +expect 26777273.934337825 13562062.520622183 +accept -11 -34 +expect 33501390.07111227 13627060.52678455 +accept 155 -35 +expect 6673694.877487984 1873264.8705730252 +accept -158 -28 +expect 26769134.317820016 1871227.8450291778 +accept -109 -46 +expect 30162784.570957504 7708744.672461299 +accept -36 -75 +expect 33503857.658686288 9665810.798055789 +accept 98 -49 +expect 3877489.1859805635 4806946.337586326 +accept 114 -72 +expect 35783346.62170241 7708905.600709579 +accept 143 -9 +expect 8936966.883740531 3219027.0687154396 +accept 123 7 +expect 10063057.622895071 5239165.493429321 +accept 147 16 +expect 14511462.662312808 2635947.740851659 + +direction inverse +accept 13400000 13600000 +expect 22.653513921934305 27.877587719075937 +accept 13400000 9700000 +expect 71.23213038171733 46.05944622180928 +accept 16800000 7700000 +expect 147.55671447322464 74.77832986646499 +accept 20100000 9700000 +expect -76.64598925873727 60.747020624548 +accept 16800000 15500000 +expect -26.3124065099563 34.601485830443536 +accept 10100000 15500000 +expect 28.619135182474427 -13.042018999526977 +accept 6700000 9700000 +expect 71.5162610671907 -24.673252485600123 +accept 10100000 7700000 +expect 96.68789658312737 10.383985604100156 +accept 16800000 3900000 +expect 169.65090726985764 35.27199233196341 +accept 23500000 3900000 +expect -150.55720908958426 13.14679150488858 +accept 23500000 7700000 +expect -108.71768234825969 24.253726008211544 +accept 26800000 9700000 +expect -83.64031642722364 -9.65664821408901 +accept 26800000 13600000 +expect -41.53248336979641 -4.181271680064457 +accept 33500000 13600000 +expect -11.077997959623605 -34.30009883727707 +accept 6700000 1900000 +expect 154.6653022651957 -34.676851253860285 +accept 26800000 1900000 +expect -157.5153533577128 -28.210938432335496 +accept 30200000 7700000 +expect -109.22990606962236 -46.40145478927908 +accept 33500000 9700000 +expect -35.386955975332214 -74.64821453762985 +accept 3900000 4800000 +expect 98.362008540559 -48.89629332838504 +accept 35800000 7700000 +expect 114.04215001020711 -71.79634907735154 +accept 9000000 3200000 +expect 143.33006363443351 -8.36301544647104 +accept 10100000 5200000 +expect 123.47123951316074 7.342196526699235 +accept 14500000 2600000 +expect 147.01335056698537 15.59184037944909 +accept 0 0 +expect failure + +=============================================================================== +# Eckert I +# PCyl., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eck1 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 204680.888202951 102912.178426065 +accept 2 -1 +expect 204680.888202951 -102912.178426065 +accept -2 1 +expect -204680.888202951 102912.178426065 +accept -2 -1 +expect -204680.888202951 -102912.178426065 + +direction inverse +accept 200 100 +expect 0.001943415 0.000971702 +accept 200 -100 +expect 0.001943415 -0.000971702 +accept -200 100 +expect -0.001943415 0.000971702 +accept -200 -100 +expect -0.001943415 -0.000971702 + + +=============================================================================== +# Eckert II +# PCyl. Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eck2 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 204472.870907960 121633.734975242 +accept 2 -1 +expect 204472.870907960 -121633.734975242 +accept -2 1 +expect -204472.870907960 121633.734975242 +accept -2 -1 +expect -204472.870907960 -121633.734975242 + +direction inverse +accept 200 100 +expect 0.001943415 0.000824804 +accept 200 -100 +expect 0.001943415 -0.000824804 +accept -200 100 +expect -0.001943415 0.000824804 +accept -200 -100 +expect -0.001943415 -0.000824804 + + +=============================================================================== +# Eckert III +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eck3 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 188652.015721538 94328.919337031 +accept 2 -1 +expect 188652.015721538 -94328.919337031 +accept -2 1 +expect -188652.015721538 94328.919337031 +accept -2 -1 +expect -188652.015721538 -94328.919337031 + +direction inverse +accept 200 100 +expect 0.002120241 0.001060120 +accept 200 -100 +expect 0.002120241 -0.001060120 +accept -200 100 +expect -0.002120241 0.001060120 +accept -200 -100 +expect -0.002120241 -0.001060120 + + +=============================================================================== +# Eckert IV +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eck4 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 188646.389356416 132268.540174065 +accept 2 -1 +expect 188646.389356416 -132268.540174065 +accept -2 1 +expect -188646.389356416 132268.540174065 +accept -2 -1 +expect -188646.389356416 -132268.540174065 + +accept -180 90 +expect -8489602.7403 8489602.7403 + +accept 180 90 +expect 8489602.7403 8489602.7403 + +accept -180 0 +expect -16979205.4807 0 + +accept 180 0 +expect 16979205.4807 0 + +accept -180 -90 +expect -8489602.7403 -8489602.7403 + +accept 180 -90 +expect 8489602.7403 -8489602.7403 + +direction inverse +accept 200 100 +expect 0.002120241 0.000756015 +accept 200 -100 +expect 0.002120241 -0.000756015 +accept -200 100 +expect -0.002120241 0.000756015 +accept -200 -100 +expect -0.002120241 -0.000756015 + +accept -8489602.74033281 8489602.74033281 +expect -180 90 + +accept -8489602.75 8489602.74033281 +expect failure errno coord_transfm_outside_projection_domain + +accept 8489602.74033281 8489602.74033281 +expect 180 90 + +accept 8489602.75 8489602.74033281 +expect failure errno coord_transfm_outside_projection_domain + +accept 0 8489602.75 +expect failure errno coord_transfm_outside_projection_domain + +accept -16979205.4807 0 +expect -180 0 + +accept -16979205.49 0 +expect failure errno coord_transfm_outside_projection_domain + +accept 16979205.4807 0 +expect 180 0 + +accept 16979205.49 0 +expect failure errno coord_transfm_outside_projection_domain + +accept -8489602.74033281 -8489602.74033281 +expect -180 -90 + +accept -8489602.75 -8489602.74033281 +expect failure errno coord_transfm_outside_projection_domain + +accept 8489602.74033281 -8489602.74033281 +expect 180 -90 + +accept 8489602.75 -8489602.74033281 +expect failure errno coord_transfm_outside_projection_domain + +accept 0 -8489602.75 +expect failure errno coord_transfm_outside_projection_domain + +=============================================================================== +# Eckert V +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eck5 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 197031.392134061 98523.198847227 +accept 2 -1 +expect 197031.392134061 -98523.198847227 +accept -2 1 +expect -197031.392134061 98523.198847227 +accept -2 -1 +expect -197031.392134061 -98523.198847227 + +direction inverse +accept 200 100 +expect 0.002029979 0.001014989 +accept 200 -100 +expect 0.002029979 -0.001014989 +accept -200 100 +expect -0.002029979 0.001014989 +accept -200 -100 +expect -0.002029979 -0.001014989 + + +=============================================================================== +# Eckert VI +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eck6 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 197021.605628992 126640.420733174 +accept 2 -1 +expect 197021.605628992 -126640.420733174 +accept -2 1 +expect -197021.605628992 126640.420733174 +accept -2 -1 +expect -197021.605628992 -126640.420733174 + +direction inverse +accept 200 100 +expect 0.002029979 0.000789630 +accept 200 -100 +expect 0.002029979 -0.000789630 +accept -200 100 +expect -0.002029979 0.000789630 +accept -200 -100 +expect -0.002029979 -0.000789630 + + +=============================================================================== +# Equidistant Cylindrical (Plate Carree) +# Cyl, Sph&Ell +# lat_ts=[, lat_0=0] +=============================================================================== + +------------------------------------------------------------------------------- +# Spherical case +operation +proj=eqc +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 111701.072127637 +accept 2 -1 +expect 223402.144255274 -111701.072127637 +accept -2 1 +expect -223402.144255274 111701.072127637 +accept -2 -1 +expect -223402.144255274 -111701.072127637 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + +------------------------------------------------------------------------------- +# Ellipsoidal case (EPSG:1028) +# Test values from IOGP Guidance Note 7-2, Section 3.2.5 +# WGS84 ellipsoid: a=6378137, 1/f=298.257223563 +# Standard parallel: 0° (lat_ts=0) +# Input: lat=55°, lon=10° +# Expected: E=1113194.91, N=6097230.31 +operation +proj=eqc +ellps=WGS84 +lat_ts=0 +------------------------------------------------------------------------------- +tolerance 0.01 m +accept 10 55 +expect 1113194.91 6097230.31 + +direction inverse +accept 1113194.91 6097230.31 +expect 10 55 + +------------------------------------------------------------------------------- +# Ellipsoidal case - high latitude test +# WGS84 ellipsoid +# Input: lat=71.9993230521°, lon=-143.9999611505° +# Expected: +# E=-16030002.350, N=7992053.817 +operation +proj=eqc +ellps=WGS84 +lat_ts=0 +------------------------------------------------------------------------------- +tolerance 0.1 m +accept -143.9999611505 71.9993230521 +expect -16030002.350 7992053.817 + +direction inverse +accept -16030002.350 7992053.817 +expect -143.9999611505 71.9993230521 + +------------------------------------------------------------------------------- +# Ellipsoidal case - Edge cases +# WGS84 ellipsoid, lat_ts=0 +# Tests for origin, hemispheres, date line, near-pole +operation +proj=eqc +ellps=WGS84 +lat_ts=0 +------------------------------------------------------------------------------- +tolerance 0.001 m + +# Origin (0, 0) +accept 0 0 +expect 0.0 0.0 + +# Southern hemisphere (10, -45) +accept 10 -45 +expect 1113194.90793 -4984944.37798 + +# Date line (180, 30) +accept 180 30 +expect 20037508.34279 3320113.39794 + +# Near north pole (0, 89) +accept 0 89 +expect 0.0 9890271.86440 + +# San Francisco (-122.4194, 37.7749) +accept -122.4194 37.7749 +expect -13627665.27122 4182513.19136 + +direction inverse +# Inverse tests for edge cases +accept 0.0 0.0 +expect 0 0 + +accept 1113194.90793 -4984944.37798 +expect 10 -45 + +accept 20037508.34279 3320113.39794 +expect 180 30 + +accept 0.0 9890271.86440 +expect 0 89 + +accept -13627665.27122 4182513.19136 +expect -122.4194 37.7749 + +------------------------------------------------------------------------------- +# Ellipsoidal case with non-zero standard parallel (lat_ts=45) +# WGS84 ellipsoid +# Tests the ν₁ cos(φ₁) scaling factor for easting +operation +proj=eqc +ellps=WGS84 +lat_ts=45 +------------------------------------------------------------------------------- +tolerance 0.01 m + +# Paris region (2, 49) +accept 2 49 +expect 157693.670 5429627.632 + +# Origin (0, 0) - northing should still be 0 +accept 0 0 +expect 0.0 0.0 + +# High latitude (10, 70) +accept 10 70 +expect 788468.351 7768980.728 + +direction inverse +accept 157693.670 5429627.632 +expect 2 49 + +accept 0.0 0.0 +expect 0 0 + +accept 788468.351 7768980.728 +expect 10 70 + +------------------------------------------------------------------------------- +# Ellipsoidal case with lat_ts=30 and lat_0=45 (non-zero origin) +# Tests meridional arc offset M₀ +operation +proj=eqc +ellps=WGS84 +lat_ts=30 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.01 m + +# At the origin latitude, northing should be 0 +accept 0 45 +expect 0.0 0.0 + +# Above origin +accept 0 60 +expect 0.0 1669128.442 + +# Below origin +accept 0 30 +expect 0.0 -1664830.980 + +direction inverse +accept 0.0 0.0 +expect 0 45 + +accept 0.0 1669128.442 +expect 0 60 + +accept 0.0 -1664830.980 +expect 0 30 + + +=============================================================================== +# Equidistant Conic +# Conic, Sph&Ell +# lat_1= lat_2= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=eqdc +ellps=GRS80 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222588.440269286 110659.134907347 +accept 2 -1 +expect 222756.836702042 -110489.578087221 +accept -2 1 +expect -222588.440269286 110659.134907347 +accept -2 -1 +expect -222756.836702042 -110489.578087221 + +direction inverse +accept 200 100 +expect 0.001796359 0.000904369 +accept 200 -100 +expect 0.001796358 -0.000904370 +accept -200 100 +expect -0.001796359 0.000904369 +accept -200 -100 +expect -0.001796358 -0.000904370 + +------------------------------------------------------------------------------- +operation +proj=eqdc +R=6400000 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223351.088175114 111786.108747174 +accept 2 -1 +expect 223521.200266735 -111615.970741241 +accept -2 1 +expect -223351.088175114 111786.108747174 +accept -2 -1 +expect -223521.200266735 -111615.970741241 + +direction inverse +accept 200 100 +expect 0.001790221 0.000895246 +accept 200 -100 +expect 0.001790220 -0.000895247 +accept -200 100 +expect -0.001790221 0.000895246 +accept -200 -100 +expect -0.001790220 -0.000895247 + +operation +proj=eqdc +a=9999999 +b=.9 +lat_2=1 +expect failure + +operation +proj=eqdc +R=6400000 +lat_1=1 +lat_2=-1 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=eqdc +R=6400000 +lat_1=91 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=eqdc +R=6400000 +lat_2=91 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=eqdc +R=1 +lat_1=1e-9 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=eqdc +lat_1=1 +ellps=GRS80 +b=.1 +expect failure errno invalid_op_illegal_arg_value + +=============================================================================== +# Euler +# Conic, Sph +# lat_1= and lat_2= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=euler +ellps=GRS80 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222597.634659108 111404.240549919 +accept 2 -1 +expect 222767.165631876 -111234.676491018 +accept -2 1 +expect -222597.634659108 111404.240549919 +accept -2 -1 +expect -222767.165631876 -111234.676491018 + +direction inverse +accept 200 100 +expect 0.001796281 0.000898315 +accept 200 -100 +expect 0.001796279 -0.000898316 +accept -200 100 +expect -0.001796281 0.000898315 +accept -200 -100 +expect -0.001796279 -0.000898316 + +------------------------------------------------------------------------------- +operation +proj=euler +a=6400000 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223360.655598694 111786.112389791 +accept 2 -1 +expect 223530.767690316 -111615.967098624 +accept -2 1 +expect -223360.655598694 111786.112389791 +accept -2 -1 +expect -223530.767690316 -111615.967098624 + +direction inverse +accept 200 100 +expect 0.001790144 0.000895246 +accept 200 -100 +expect 0.001790143 -0.000895247 +accept -200 100 +expect -0.001790144 0.000895246 +accept -200 -100 +expect -0.001790143 -0.000895247 + + +=============================================================================== +# Extended Transverse Mercator +# Cyl, Sph +# lat_ts=(0) +# lat_0=(0) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=etmerc +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 50 nm +accept 2 1 +expect 222650.796797586 110642.229411933 +accept 2 -1 +expect 222650.796797586 -110642.229411933 +accept -2 1 +expect -222650.796797586 110642.229411933 +accept -2 -1 +expect -222650.796797586 -110642.229411933 +# near pole +accept 30 89.9999 +expect 5.584698978 10001956.056248082 +# 3900 km from central meridian +accept 44.69 35.37 +expect 4168136.489446198 4985511.302287407 + +direction inverse +accept 200 100 +expect 0.00179663056816 0.00090436947663 +accept 200 -100 +expect 0.00179663056816 -0.00090436947663 +accept -200 100 +expect -0.00179663056816 0.00090436947663 +accept -200 -100 +expect -0.00179663056816 -0.00090436947663 +# near pole +accept 6 1.0001e7 +expect 0.35596960759234 89.99135362646302 +# 3900 km from central meridian +accept 4168136.489446198 4985511.302287407 +expect 44.69 35.37 + +=============================================================================== +# Fahey +# Pcyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=fahey +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 182993.344649124 101603.193569884 +accept 2 -1 +expect 182993.344649124 -101603.193569884 +accept -2 1 +expect -182993.344649124 101603.193569884 +accept -2 -1 +expect -182993.344649124 -101603.193569884 + +direction inverse +accept 200 100 +expect 0.002185789 0.000984246 +accept 200 -100 +expect 0.002185789 -0.000984246 +accept -200 100 +expect -0.002185789 0.000984246 +accept -200 -100 +expect -0.002185789 -0.000984246 + + +=============================================================================== +# Foucaut +# PCyl., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=fouc +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222588.120675892 111322.316700694 +accept 2 -1 +expect 222588.120675892 -111322.316700694 +accept -2 1 +expect -222588.120675892 111322.316700694 +accept -2 -1 +expect -222588.120675892 -111322.316700694 + +direction inverse +accept 200 100 +expect 0.001796631 0.000898315 +accept 200 -100 +expect 0.001796631 -0.000898315 +accept -200 100 +expect -0.001796631 0.000898315 +accept -200 -100 +expect -0.001796631 -0.000898315 + +------------------------------------------------------------------------------- +operation +proj=fouc +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223351.109003414 111703.907721713 +accept 2 -1 +expect 223351.109003414 -111703.907721713 +accept -2 1 +expect -223351.109003414 111703.907721713 +accept -2 -1 +expect -223351.109003414 -111703.907721713 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Foucaut Sinusoidal +# PCyl., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=fouc_s +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 111695.401198614 +accept 2 -1 +expect 223402.144255274 -111695.401198614 +accept -2 1 +expect -223402.144255274 111695.401198614 +accept -2 -1 +expect -223402.144255274 -111695.401198614 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Gall (Gall Stereographic) +# Cyl, Sph +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=gall +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 157969.171134520 95345.249178386 +accept 2 -1 +expect 157969.171134520 -95345.249178386 +accept -2 1 +expect -157969.171134520 95345.249178386 +accept -2 -1 +expect -157969.171134520 -95345.249178386 + +direction inverse +accept 200 100 +expect 0.002532140 0.001048847 +accept 200 -100 +expect 0.002532140 -0.001048847 +accept -200 100 +expect -0.002532140 0.001048847 +accept -200 -100 +expect -0.002532140 -0.001048847 + + +=============================================================================== +# Geocentric + +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=geocent +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 0 +expect 6373287.27950247 222560.09599219 110568.77482092 +accept 2 -1 0 +expect 6373287.27950247 222560.09599219 -110568.77482092 +accept -2 1 0 +expect 6373287.27950247 -222560.09599219 110568.77482092 +accept -2 -1 0 +expect 6373287.27950247 -222560.09599219 -110568.77482092 + +direction inverse +accept 6373287.27950247 222560.09599219 110568.77482092 +expect 2 1 0 + +------------------------------------------------------------------------------- +operation +proj=geocent +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm + + +=============================================================================== +# Geostationary Satellite View +# Azi, Sph&Ell +# h= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=geos +ellps=GRS80 +h=35785831 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222527.070365800 110551.303413329 +accept 2 -1 +expect 222527.070365800 -110551.303413329 +accept -2 1 +expect -222527.070365800 110551.303413329 +accept -2 -1 +expect -222527.070365800 -110551.303413329 + +direction inverse +accept 200 100 +expect 0.001796631 0.000904369 +accept 200 -100 +expect 0.001796631 -0.000904369 +accept -200 100 +expect -0.001796631 0.000904369 +accept -200 -100 +expect -0.001796631 -0.000904369 + +------------------------------------------------------------------------------- +operation +proj=geos +R=6400000 +h=35785831 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223289.457635795 111677.657456537 +accept 2 -1 +expect 223289.457635795 -111677.657456537 +accept -2 1 +expect -223289.457635795 111677.657456537 +accept -2 -1 +expect -223289.457635795 -111677.657456537 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + +------------------------------------------------------------------------------- +operation +proj=geos +R=1 +h=0 +------------------------------------------------------------------------------- +expect failure errno invalid_op_illegal_arg_value + +------------------------------------------------------------------------------- +operation +proj=geos +R=1 +h=1e11 +------------------------------------------------------------------------------- +expect failure errno invalid_op_illegal_arg_value + + + +=============================================================================== +# Ginsburg VIII (TsNIIGAiK) +# PCyl, Sph., no inv. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=gins8 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 194350.250939590 111703.907635335 +accept 2 -1 +expect 194350.250939590 -111703.907635335 +accept -2 1 +expect -194350.250939590 111703.907635335 +accept -2 -1 +expect -194350.250939590 -111703.907635335 + + +=============================================================================== +# General Sinusoidal Series +# PCyl, Sph. +# m= n= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=gn_sinu +a=6400000 +m=1 +n=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223385.132504696 111698.236447187 +accept 2 -1 +expect 223385.132504696 -111698.236447187 +accept -2 1 +expect -223385.132504696 111698.236447187 +accept -2 -1 +expect -223385.132504696 -111698.236447187 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Gnomonic +# Azi, Sph*Ell +=============================================================================== + +------------------------------------------------------------------------------- +# Test material from Snyder p. 168, table 26. Repeat tests with ellispoid of +# flattening 1/200. +# Tests the equatorial aspect of the projection. +------------------------------------------------------------------------------- +operation +proj=gnom +R=1 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 0 +roundtrip 100 +accept 10 80 +expect 0.1763 5.7588 +roundtrip 100 +accept 20 70 +expect 0.3640 2.9238 +roundtrip 100 +accept 30 60 +expect 0.5774 2.0000 +roundtrip 100 +accept 40 50 +expect 0.8391 1.5557 +roundtrip 100 +accept 50 40 +expect 1.1918 1.3054 +roundtrip 100 +accept 60 30 +expect 1.7321 1.1547 +roundtrip 100 +accept 70 20 +expect 2.7475 1.0642 +roundtrip 100 +accept 80 10 +expect 5.6713 1.0154 +roundtrip 100 +accept 80 80 +expect 5.6713 32.6596 +roundtrip 100 +accept 0 90 +expect failure errno coord_transfm_outside_projection_domain + +# test that extreme northings are mapped to the sphere +direction inverse +accept 0 1e8 +expect 0 90 + +------------------------------------------------------------------------------- +operation +proj=gnom +a=1 +rf=200 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 0 +roundtrip 100 +accept 10 80 +expect 0.1763 5.7232 +roundtrip 100 +accept 20 70 +expect 0.3641 2.9037 +roundtrip 100 +accept 30 60 +expect 0.5778 1.9861 +roundtrip 100 +accept 40 50 +expect 0.8405 1.5459 +roundtrip 100 +accept 50 40 +expect 1.1958 1.2994 +roundtrip 100 +accept 60 30 +expect 1.7435 1.1534 +roundtrip 100 +accept 70 20 +expect 2.7852 1.0711 +roundtrip 100 +accept 80 10 +expect 5.8813 1.0465 +roundtrip 100 +accept 80 80 +expect 5.7134 32.7298 +roundtrip 100 +accept 0 89.99 +expect 0 5700.9222 +roundtrip 100 +accept 180 89.99 +expect failure errno coord_transfm_outside_projection_domain + +# test that extreme northings are mapped to the sphere +direction inverse +accept 0 1e8 +expect 0 90 + +------------------------------------------------------------------------------- +# Test the northern polar aspect of the gnonomic projection +------------------------------------------------------------------------------- +operation +proj=gnom +R=1 +lat_0=90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 90 +expect 0 0 +roundtrip 100 +accept 45 45 +expect 0.7071 -0.7071 +roundtrip 100 +accept 0 0 +expect failure errno coord_transfm_outside_projection_domain +accept 90 0 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +operation +proj=gnom +a=1 +rf=200 +lat_0=90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 90 +expect 0 0 +roundtrip 100 +accept 45 45 +expect 0.7079 -0.7079 +roundtrip 100 +accept 0 0 +expect 0 -127.4835 +roundtrip 100 +accept 90 0 +expect 127.4835 0 +roundtrip 100 +accept 0 -0.5 +expect failure errno coord_transfm_outside_projection_domain +accept 90 -0.5 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +# Test the southern polar aspect of the gnonomic projection +------------------------------------------------------------------------------- +operation +proj=gnom +R=1 +lat_0=-90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 -90 +expect 0 0 +roundtrip 100 +accept 45 -45 +expect 0.7071 0.7071 +roundtrip 100 +accept 0 0 +expect failure errno coord_transfm_outside_projection_domain +accept 90 0 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +operation +proj=gnom +a=1 +rf=200 +lat_0=-90 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 -90 +expect 0 0 +roundtrip 100 +accept 45 -45 +expect 0.7079 0.7079 +roundtrip 100 +accept 0 0 +expect 0 127.4835 +roundtrip 100 +accept 90 0 +expect 127.4835 0 +roundtrip 100 +accept 0 0.5 +expect failure errno coord_transfm_outside_projection_domain +accept 90 0.5 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +# Test the oblique aspect of the gnonomic projection +------------------------------------------------------------------------------- +operation +proj=gnom +R=1 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 45 +expect 0 0 +roundtrip 100 +accept 0 0 +expect 0 -1 +roundtrip 100 +accept 0 90 +expect 0 1 +roundtrip 100 +accept 0 -45 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +operation +proj=gnom +a=1 +rf=200 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 45 +expect 0 0 +roundtrip 100 +accept 0 0 +expect 0 -0.9897 +roundtrip 100 +accept 0 90 +expect 0 1.0025 +roundtrip 100 +accept 0 -45 +expect 0 -154.8623 +roundtrip 100 +accept 0 -45.5 +expect failure errno coord_transfm_outside_projection_domain +=============================================================================== +# Goode Homolosine +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=goode +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223368.119026632 111701.072127637 +accept 2 -1 +expect 223368.119026632 -111701.072127637 +accept -2 1 +expect -223368.119026632 111701.072127637 +accept -2 -1 +expect -223368.119026632 -111701.072127637 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +=============================================================================== +# Mod. Stereographic of 48 U.S. +# Azi(mod) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=gs48 +R=6370997 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -119.000000000 40.000000000 +expect -1923908.446529346 355874.658944479 +accept -70.000000000 64.000000000 +expect 1354020.375109298 3040846.007866525 +accept -80.000000000 25.000000000 +expect 1625139.160484320 -1413614.894029108 +accept -95.000000000 35.000000000 +expect 90241.658071458 -439595.048485902 + +direction inverse +accept -1923000.000000000 355000.000000000 +expect -118.987112613 39.994449789 +accept 1354000.000000000 3040000.000000000 +expect -70.005208999 63.993387836 +accept 1625000.000000000 -1413000.000000000 +expect -80.000346610 25.005602547 +accept 90000.000000000 -439000.000000000 +expect -95.002606473 35.005424705 + + +=============================================================================== +# Mod. Stereographic of 50 U.S. +# Azi(mod) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=gs50 +ellps=clrk66 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -160.000000000 65.000000000 +expect -1874628.537740233 2660907.942291015 +accept -130.000000000 45.000000000 +expect -771831.518853336 48465.166491305 +accept -65.000000000 45.000000000 +expect 4030931.833981509 1323687.864777399 +accept -80.000000000 36.000000000 +expect 3450764.261536101 -175619.041820732 + +# For some reason, does not fail on MacOSX +#accept 60 -45 +#expect failure errno coord_transfm_outside_projection_domain + +direction inverse +accept -1800000.000000000 2600000.000000000 +expect -157.989285000 64.851559610 +accept -800000.000000000 500000.000000000 +expect -131.171390467 49.084969746 +accept 4000000.000000000 1300000.000000000 +expect -65.491568685 44.992837924 +accept 3900000.000000000 -170000.000000000 +expect -75.550660091 34.191114076 + +------------------------------------------------------------------------------- +operation +proj=gs50 +R=6370997 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -160.000000000 65.000000000 +expect -1867268.253460009 2656506.230401823 +accept -130.000000000 45.000000000 +expect -769572.189672994 48324.312440864 +accept -65.000000000 45.000000000 +expect 4019393.068680791 1320191.309350289 +accept -80.000000000 36.000000000 +expect 3442685.615172346 -178760.423489429 + +direction inverse +accept -1800000.000000000 2600000.000000000 +expect -158.163295045 64.854288365 +accept -800000.000000000 500000.000000000 +expect -131.206816960 49.082915351 +accept 4000000.000000000 1300000.000000000 +expect -65.348945221 44.957292682 +accept 3900000.000000000 -170000.000000000 +expect -75.446820242 34.185406226 + + +=============================================================================== +# Hammer & Eckert-Greifendorff +# Misc Sph, +# W= M= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=hammer +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223373.788703241 111703.907397767 +accept 2 -1 +expect 223373.788703241 -111703.907397767 +accept -2 1 +expect -223373.788703241 111703.907397767 +accept -2 -1 +expect -223373.788703241 -111703.907397767 + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + + +------------------------------------------------------------------------------- +operation +proj=hammer +a=6400000 +W=1 +------------------------------------------------------------------------------- +accept -180 0 +expect failure errno coord_transfm_outside_projection_domain + +=============================================================================== +# Hatano Asymmetrical Equal Area +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=hatano +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 189878.878946528 131409.802440626 +accept 2 -1 +expect 189881.081952445 -131409.142276074 +accept -2 1 +expect -189878.878946528 131409.802440626 +accept -2 -1 +expect -189881.081952445 -131409.142276074 + +direction inverse +accept 200 100 +expect 0.002106462 0.000760957 +accept 200 -100 +expect 0.002106462 -0.000760958 +accept -200 100 +expect -0.002106462 0.000760957 +accept -200 -100 +expect -0.002106462 -0.000760958 + + +=============================================================================== +# HEALPix +# Sph., Ellps. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=healpix +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222390.103949239 130406.588664482 +accept 2 -1 +expect 222390.103949239 -130406.588664481 +accept -2 1 +expect -222390.103949239 130406.588664482 +accept -2 -1 +expect -222390.103949239 -130406.588664481 + +direction inverse +accept 200 100 +expect 0.001798641 0.000766795 +accept 200 -100 +expect 0.001798641 -0.000766795 +accept -200 100 +expect -0.001798641 0.000766795 +accept -200 -100 +expect -0.001798641 -0.000766795 + +------------------------------------------------------------------------------- +operation +proj=healpix +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 131588.044441999 +accept 2 -1 +expect 223402.144255274 -131588.044441999 +accept -2 1 +expect -223402.144255274 131588.044441999 +accept -2 -1 +expect -223402.144255274 -131588.044441999 + +direction inverse +accept 200 100 +expect 0.001790493 0.000759909 +accept 200 -100 +expect 0.001790493 -0.000759909 +accept -200 100 +expect -0.001790493 0.000759909 +accept -200 -100 +expect -0.001790493 -0.000759909 + +------------------------------------------------------------------------------- +operation +proj=healpix +R=6400000 +lat_1=0.5 +lat_2=2 +rot_xy=42 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 254069.735470912856 -51696.237925639456 +accept 2 -1 +expect 77970.559536809917 -247274.186569161975 +accept -2 1 +expect -77970.559536809917 247274.186569161975 +accept -2 -1 +expect -254069.735470912856 51696.237925639456 + +direction inverse +accept 254069.735470912856 -51696.237925639456 +expect 2 1 +accept 77970.559536809917 -247274.186569161975 +expect 2 -1 +accept -77970.559536809917 247274.186569161975 +expect -2 1 +accept -254069.735470912856 51696.237925639456 +expect -2 -1 + + +=============================================================================== +# rHEALPix +# Sph., Ellps. +# north_square= south_square= +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=rhealpix +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222390.103949239 130406.588664482 +accept 2 -1 +expect 222390.103949239 -130406.588664481 +accept -2 1 +expect -222390.103949239 130406.588664482 +accept -2 -1 +expect -222390.103949239 -130406.588664481 + +direction inverse +accept 200 100 +expect 0.001798641 0.000766795 +accept 200 -100 +expect 0.001798641 -0.000766795 +accept -200 100 +expect -0.001798641 0.000766795 +accept -200 -100 +expect -0.001798641 -0.000766795 + +------------------------------------------------------------------------------- +operation +proj=rhealpix +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223402.144255274 131588.044441999 +accept 2 -1 +expect 223402.144255274 -131588.044441999 +accept -2 1 +expect -223402.144255274 131588.044441999 +accept -2 -1 +expect -223402.144255274 -131588.044441999 + +direction inverse +accept 200 100 +expect 0.001790493 0.000759909 +accept 200 -100 +expect 0.001790493 -0.000759909 +accept -200 100 +expect -0.001790493 0.000759909 +accept -200 -100 +expect -0.001790493 -0.000759909 + +------------------------------------------------------------------------------- +operation +proj=rhealpix +south_square=2 +north_square=3 +ellps=WGS84 +------------------------------------------------------------------------------- +tolerance 1 m +accept 45 50 +expect 10806592 10007554 +accept 45 -50 +expect 5003777 -5802815 +accept 135 50 +expect 15011332 5802815 + +direction inverse +accept 10806592 10007554 +expect 45 50 +accept 5003777 -5802815 +expect 45 -50 +accept 15011332 5802815 +expect 135 50 + + +=============================================================================== +# Interrupted Goode Homolosine +# PCyl, Sph. +# (Each of the 12 sub-projections tested separately) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=igh +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223878.497456271 111701.072127637 +roundtrip 1 +accept 2 -1 +expect 223708.371313058 -111701.072127637 +roundtrip 1 +accept -2 1 +expect -222857.740596992 111701.072127637 +roundtrip 1 +accept -2 -1 +expect -223027.866740205 -111701.072127637 +roundtrip 1 + +accept -100.0 22.0 +expect -11170107.212763708 2457423.5868080168 +roundtrip 1 +accept -30.0 22.0 +expect -2863013.673043605 2457423.586808016 +roundtrip 1 +accept -100.0 67.0 +expect -11170107.212763708 7205942.523056464 +roundtrip 1 +accept -30.0 67.0 +expect 17045.719482862 7205942.523056464 +roundtrip 1 +accept -160.0 -22.0 +expect -17872171.540421933 -2457423.586808016 +roundtrip 1 +accept -60.0 -22.0 +expect -6702064.327658225 -2457423.586808016 +roundtrip 1 +accept 20.0 -22.0 +expect 2234021.442552742 -2457423.586808016 +roundtrip 1 +accept 140.0 -22.0 +expect 15638150.097869191 -2457423.586808016 +roundtrip 1 +accept -160.0 -67.0 +expect -17872171.540421933 -7205942.523056464 +roundtrip 1 +accept -60.0 -67.0 +expect -6702064.327658225 -7205942.523056464 +roundtrip 1 +accept 20.0 -67.0 +expect 2234021.442552742 -7205942.523056464 +roundtrip 1 +accept 140.0 -67.0 +expect 15638150.097869191 -7205942.523056464 +roundtrip 1 + +direction inverse +accept 200 100 +expect 0.001790489 0.000895247 +accept 200 -100 +expect 0.001790491 -0.000895247 +accept -200 100 +expect -0.001790497 0.000895247 +accept -200 -100 +expect -0.001790496 -0.000895247 + +=============================================================================== +# Interrupted Goode Homolosine Ocean View +# PCyl, Sph. +# (Each of the 12 sub-projections tested separately) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=igh_o +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223197.992883418 111701.072127637 +roundtrip 1 +accept 2 -1 +expect 223708.371313058 -111701.072127637 +roundtrip 1 +accept -2 1 +expect -223538.245169845 111701.072127637 +roundtrip 1 +accept -2 -1 +expect -223027.866740205 -111701.072127637 +roundtrip 1 + +accept -140.0 22.0 +expect -15638150.097869192 2457423.586808016 +roundtrip 1 +accept 170.0 70.0 +expect 16560870.317293623 7463176.386461447 +roundtrip 1 +accept -10.0 22.0 +expect -1117010.721276371 2457423.586808016 +roundtrip 1 +accept 130.0 22.0 +expect 14521139.376592822 2457423.586808016 +roundtrip 1 +accept -170.0 70.0 +expect -17167948.303394791 7463176.386461447 +roundtrip 1 +accept -140.0 67.0 +expect -15638150.097869191 7205942.523056464 +roundtrip 1 +accept -10.0 67.0 +expect -1117010.721276371 7205942.523056464 +roundtrip 1 +accept 130.0 67.0 +expect 14521139.376592822 7205942.523056464 +roundtrip 1 +accept -110.0 -22.0 +expect -12287117.934040081 -2457423.586808016 +roundtrip 1 +accept 20.0 -22.0 +expect 2234021.442552742 -2457423.586808016 +roundtrip 1 +accept 150.0 -22.0 +expect 16755160.819145568 -2457423.586808016 +roundtrip 1 +accept -110.0 -67.0 +expect -12287117.934040081 -7205942.523056464 +roundtrip 1 +accept 20.0 -67.0 +expect 2234021.442552742 -7205942.523056464 +roundtrip 1 +accept 95.0 -67.0 +expect 13699006.578494834 -7205942.523056464 +roundtrip 1 +accept 150.0 -67.0 +expect 16755160.819145564 -7205942.523056464 +roundtrip 1 + +direction inverse +accept 200 100 +expect 0.001790494 0.000895247 +accept 200 -100 +expect 0.001790491 -0.000895247 +accept -200 100 +expect -0.001790492 0.000895247 +accept -200 -100 +expect -0.001790496 -0.000895247 + +=============================================================================== +# Interrupted Mollweide +# PCyl, Sph. +# (Each of the 6 sub-projections tested separately) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=imoll +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect -912080.283811148372 124066.283433859542 +roundtrip 1 +accept 2 -1 +expect -912174.768289615284 -124066.283433859542 +roundtrip 1 +accept -2 1 +expect -1314307.681094774744 124066.283433859542 +roundtrip 1 +accept -2 -1 +expect -1314402.165573241888 -124066.283433859542 +roundtrip 1 +accept -39.99 0.1 +expect -5135117.0707450127 12406.8672748194 +roundtrip 1 +accept -40.01 0.1 +expect -5137140.6776947584 12406.8672748194 +roundtrip 1 +accept -99.99 -0.1 +expect -11169097.7713819221 -12406.8672748194 +roundtrip 1 +accept -100.01 -0.1 +expect -11171118.5438199658 -12406.8672748194 +roundtrip 1 +accept -19.99 -0.1 +expect -3123793.9498816459 -12406.8672748194 +roundtrip 1 +accept -20.01 -0.1 +expect -3125812.8326452221 -12406.8672748194 +roundtrip 1 +accept 79.99 -0.1 +expect 6930815.0545556545 -12406.8672748194 +roundtrip 1 +accept 80.01 -0.1 +expect 6932837.7166681662 -12406.8672748194 +roundtrip 1 + +accept -100.0 22.0 +expect -11170107.212763708085 2703699.326638640370 +roundtrip 1 +accept -30.0 22.0 +expect -3854960.906400005333 2703699.326638640370 +roundtrip 1 +accept -160.0 -22.0 +expect -17204085.078888915479 -2703699.326638640370 +roundtrip 1 +accept -60.0 -22.0 +expect -7147455.302013571374 -2703699.326638640370 +roundtrip 1 +accept 20.0 -22.0 +expect 897848.519486704026 -2703699.326638640370 +roundtrip 1 +accept 140.0 -22.0 +expect 12965804.251737114042 -2703699.326638640370 +roundtrip 1 + +direction inverse +accept 200 100 +expect 11.074062190626 0.000806005080 +accept 200 -100 +expect 11.074062191236 -0.000806005080 +accept -200 100 +expect 11.070084714982 0.000806005080 +accept -200 -100 +expect 11.070084715592 -0.000806005080 + +=============================================================================== +# Interrupted Mollweide Ocean View +# PCyl, Sph. +# (Each of the 6 sub-projections tested separately) +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=imoll_o +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect -1357849.196080365917 124066.283433859542 +roundtrip 1 +accept 2 -1 +expect -1357565.742644961691 -124066.283433859542 +roundtrip 1 +accept -2 1 +expect -1760076.593363992404 124066.283433859542 +roundtrip 1 +accept -2 -1 +expect -1759793.139928588411 -124066.283433859542 +roundtrip 1 +accept -89.99 0.1 +expect -10608821.9887007959 12406.8672748194 +roundtrip 1 +accept -90.01 0.1 +expect -10610845.5956505425 12406.8672748194 +roundtrip 1 +accept 59.99 0.1 +expect 4474097.1799880061 12406.8672748194 +roundtrip 1 +accept 60.01 0.1 +expect 4476121.7317749839 12406.8672748194 +roundtrip 1 +accept -59.99 -0.1 +expect -7591833.0556381932 -12406.8672748194 +roundtrip 1 +accept -60.01 -0.1 +expect -7593856.6625879407 -12406.8672748194 +roundtrip 1 +accept 89.99 -0.1 +expect 7491086.1130506080 -12406.8672748194 +roundtrip 1 +accept 90.01 -0.1 +expect 7493109.7200003546 -12406.8672748194 +roundtrip 1 + +accept -140.0 22.0 +expect -15638150.097869191319 2703699.326638640370 +roundtrip 1 +accept -10.0 22.0 +expect -2564531.387931245379 2703699.326638640370 +roundtrip 1 +accept 130.0 22.0 +expect 11514750.299694234505 2703699.326638640370 +roundtrip 1 +accept -110.0 -22.0 +expect -12621161.164806591347 -2703699.326638640370 +roundtrip 1 +accept 20.0 -22.0 +expect 452457.545131357736 -2703699.326638640370 +roundtrip 1 +accept 150.0 -22.0 +expect 13526076.255069304258 -2703699.326638640370 +roundtrip 1 + +direction inverse +accept 200 100 +expect 15.502891574921 0.000806005080 +accept 200 -100 +expect 15.502891573090 -0.000806005080 +accept -200 100 +expect 15.498914099277 0.000806005080 +accept -200 -100 +expect 15.498914097446 -0.000806005080 + +=============================================================================== +# International Map of the World Polyconic +# Mod. Polyconic, Ell +# lat_1= and lat_2= [lon_1=] +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=imw_p +ellps=GRS80 +lat_1=0.5 +lat_2=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222588.441139376 55321.128653810 +accept 2 -1 +expect 222756.906377687 -165827.584288324 +accept -2 1 +expect -222588.441139376 55321.128653810 +accept -2 -1 +expect -222756.906377687 -165827.584288324 + +direction inverse +accept 200 100 +expect 0.001796699 0.500904924 +accept 200 -100 +expect 0.001796698 0.499095076 +accept -200 100 +expect -0.001796699 0.500904924 +accept -200 -100 +expect -0.001796698 0.499095076 + +------------------------------------------------------------------------------- +operation +proj=imw_p +ellps=GRS80 +lat_1=0 +lat_2=10 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 0 +expect 0 0 +accept 0.000000000000 0.000904928485 +expect 0 100 +accept 0.000898315284 0.000000000000 +expect 100 0 + +direction inverse +accept 0 0 +expect 0 0 +accept 0 100 +expect 0.000000000000 0.000904928485 +accept 100 0 +expect 0.000898315284 0.000000000000 + + +=============================================================================== +# Icosahedral Snyder Equal Area +# Sph +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=isea +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.2 mm +accept 2 1 +expect -1097074.948153475765139 3442909.309747453313321 +roundtrip 1 + +accept 2 -1 +expect -1097074.948149705072865 3233611.728292400948703 +roundtrip 1 + +accept -2 1 +expect -1575486.353775786235929 3442168.342736063525081 +roundtrip 1 + +accept -2 -1 +expect -1575486.353772019501776 3234352.695310209877789 +roundtrip 1 + +operation +proj=isea +mode=hex +resolution=31 +accept 0 0 +expect failure + +------------------------------------------------------------------------------- +operation +proj=isea +R=6371007.18091875 +------------------------------------------------------------------------------- +tolerance 0.2 mm + +accept -168.75 58.282525588539 +expect -19186144.870842020958662 3323137.771944524254650 +roundtrip 1 + +accept 11.25 58.282525588539 +expect -15348915.896747918799520 9969413.315350906923413 +roundtrip 1 + +accept -110 54 +expect -15321401.505530973896384 3338358.859094056300819 +roundtrip 1 + +accept -75 45 +expect -12774358.709073608741164 4373188.646695702336729 +roundtrip 1 + +accept 2 49 +expect -642252.939347098814324 8796229.009143760427833 +roundtrip 1 + +accept 0 0 +expect -1331454.074623266700655 3323137.771634854841977 +roundtrip 1 + +accept 90 0 +expect 8564460.639100870117545 593869.297485541785136 +roundtrip 1 + +accept 0 45 +expect -837334.699958428042009 8323409.759132191538811 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=isea +R=6371007.18091875 +orient=pole +------------------------------------------------------------------------------- +tolerance 0.2 mm + +accept -168.75 58.282525588539 +expect -16702163.549901897087693 6386395.630649688653648 +roundtrip 1 + +accept 11.25 58.282525588539 +expect 619648.646531744743697 6212947.536539182066917 +roundtrip 1 + +accept -110 54 +expect -13285649.857057726010680 6149501.348902118392289 +roundtrip 1 + +accept -75 45 +expect -7921366.529368571005762 4728387.055336073972285 +roundtrip 1 + +accept 2 49 +expect 152616.434999307675753 5152048.791301283054054 +roundtrip 1 + +accept 0 0 +expect 0 -195097.133640714135254 +roundtrip 1 + +accept 90 0 +expect 9593072.435467451811 0 +roundtrip 1 + +accept 0 45 +expect 0 4726854.770339427515864 +roundtrip 1 + +=============================================================================== +# Kavrayskiy V +# PCyl., Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=kav5 +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 200360.905308829 123685.082476998 +accept 2 -1 +expect 200360.905308829 -123685.082476998 +accept -2 1 +expect -200360.905308829 123685.082476998 +accept -2 -1 +expect -200360.905308829 -123685.082476998 + +direction inverse +accept 200 100 +expect 0.001996259 0.000808483 +accept 200 -100 +expect 0.001996259 -0.000808483 +accept -200 100 +expect -0.001996259 0.000808483 +accept -200 -100 +expect -0.001996259 -0.000808483 + +------------------------------------------------------------------------------- +operation +proj=kav5 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 201047.703110878 124109.050629171 +accept 2 -1 +expect 201047.703110878 -124109.050629171 +accept -2 1 +expect -201047.703110878 124109.050629171 +accept -2 -1 +expect -201047.703110878 -124109.050629171 + +direction inverse +accept 200 100 +expect 0.001989440 0.000805721 +accept 200 -100 +expect 0.001989440 -0.000805721 +accept -200 100 +expect -0.001989440 0.000805721 +accept -200 -100 +expect -0.001989440 -0.000805721 + + +=============================================================================== +# Kavrayskiy VII +# PCyl, Sph. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=kav7 +a=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 193462.974943729 111701.072127637 +accept 2 -1 +expect 193462.974943729 -111701.072127637 +accept -2 1 +expect -193462.974943729 111701.072127637 +accept -2 -1 +expect -193462.974943729 -111701.072127637 + +direction inverse +accept 200 100 +expect 0.002067483 0.000895247 +accept 200 -100 +expect 0.002067483 -0.000895247 +accept -200 100 +expect -0.002067483 0.000895247 +accept -200 -100 +expect -0.002067483 -0.000895247 + + +=============================================================================== +# Krovak +# PCyl., Ellps. +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=krovak +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect -3196535.232563641 -6617878.867551444 +accept 2 -1 +expect -3260035.440552109 -6898873.614878031 +accept -2 1 +expect -3756305.328869175 -6478142.561571511 +accept -2 -1 +expect -3831703.658501982 -6759107.170155395 +accept 24.833333333333 59.757598563058 +expect 0 0 + +direction inverse +accept 200 100 +expect 24.836218919 59.758403933 +accept 200 -100 +expect 24.836315485 59.756888426 +accept -200 100 +expect 24.830447748 59.758403933 +accept -200 -100 +expect 24.830351182 59.756888426 +accept 0 0 +expect 24.833333333333 59.757598563058 + +------------------------------------------------------------------------------- +operation +proj=krovak +lat_0=-90 +------------------------------------------------------------------------------- +expect failure errno invalid_op_illegal_arg_value + + +# Test point from EPSG Guidance Note 7-2 +------------------------------------------------------------------------------- +operation +proj=krovak +lat_0=49.5 +lon_0=42.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +------------------------------------------------------------------------------- +tolerance 1.1 cm +# 16°50'59.179"E, 50°12'32.442"N +accept 16.849771944444445 50.20901166666667 +expect -568991.00 -1050538.64 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=krovak +lat_0=49.5 +lon_0=42.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +czech +------------------------------------------------------------------------------- +tolerance 1.1 cm +# 16°50'59.179"E, 50°12'32.442"N +accept 16.849771944444445 50.20901166666667 +expect 568991.00 1050538.64 +roundtrip 1 + +=============================================================================== +# Krovak Modified +# PCyl., Ellps. +=============================================================================== + +# Test point from EPSG Guidance Note 7-2 +# Note: all longitudes below are east of Ferro +------------------------------------------------------------------------------- +operation +proj=mod_krovak +lat_0=49.5 +lon_0=42.5 +k=0.9999 +x_0=5000000 +y_0=5000000 +ellps=bessel +------------------------------------------------------------------------------- +tolerance 1 cm +# 34°30'59.179"E of Ferro, 50°12'32.442"N +accept 34.51643861111111 50.20901166666667 +expect -5568990.91 -6050538.71 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=mod_krovak +lat_0=49.5 +lon_0=42.5 +k=0.9999 +x_0=5000000 +y_0=5000000 +ellps=bessel +czech +------------------------------------------------------------------------------- +tolerance 1 cm +accept 34.51643861111111 50.20901166666667 +expect 5568990.91 6050538.71 +roundtrip 1 + +=============================================================================== +# Laborde +# Cyl, Sph +# Special for Madagascar +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=labrd +ellps=GRS80 +lon_0=0.5 +lat_0=2 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 166973.166090228 -110536.912730266 +accept 2 -1 +expect 166973.168287157 -331761.993650884 +accept -2 1 +expect -278345.500519976 -110469.032642032 +accept -2 -1 +expect -278345.504185270 -331829.870790275 + +direction inverse +accept 200 100 +expect 0.501797719 2.000904357 +accept 200 -100 +expect 0.501797717 1.999095641 +accept -200 100 +expect 0.498202281 2.000904357 +accept -200 -100 +expect 0.498202283 1.999095641 + +------------------------------------------------------------------------------- +operation +proj=labrd +ellps=GRS80 +lat_0=0 +accept 0 0 +expect failure errno invalid_op_illegal_arg_value + +=============================================================================== +# Lambert Azimuthal Equal Area +# Azi, Sph&Ell +=============================================================================== + +------------------------------------------------------------------------------- +operation +proj=laea +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 222602.471450095 110589.827224410 +accept 2 -1 +expect 222602.471450095 -110589.827224409 +accept -2 1 +expect -222602.471450095 110589.827224410 +accept -2 -1 +expect -222602.471450095 -110589.827224409 +accept 150 50 +expect 4372597.1888 10352365.4614 + +accept 180 0 +expect failure errno coord_transfm_outside_projection_domain + +direction inverse +accept 200 100 +expect 0.001796631 0.000904369 +accept 200 -100 +expect 0.001796631 -0.000904369 +accept -200 100 +expect -0.001796631 0.000904369 +accept -200 -100 +expect -0.001796631 -0.000904369 +accept 4372597.1888 10352365.4614 +expect 150 50 + +accept 13000000 0 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +operation +proj=laea +R=6400000 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 2 1 +expect 223365.281370125 111716.668072916 +accept 2 -1 +expect 223365.281370125 -111716.668072916 +accept -2 1 +expect -223365.281370125 111716.668072916 +accept -2 -1 +expect -223365.281370125 -111716.668072916 + +accept 180 0 +expect failure errno coord_transfm_outside_projection_domain + +direction inverse +accept 200 100 +expect 0.001790493 0.000895247 +accept 200 -100 +expect 0.001790493 -0.000895247 +accept -200 100 +expect -0.001790493 0.000895247 +accept -200 -100 +expect -0.001790493 -0.000895247 + +------------------------------------------------------------------------------- +# Test oblique aspect of the spherical form +------------------------------------------------------------------------------- +operation +proj=laea +R=1 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 45 +expect 0 0 +accept 0 0 +expect 0 -0.7654 +accept 0 90 +expect 0 0.7654 +accept 0 -45 +expect 0 -1.4142 +accept 45 45 +expect 0.5194 0.1521 + +tolerance 0.1 mm +accept 45 45 +roundtrip 100 + +# error when waaay outside the sphere +direction inverse +accept 0 10 +expect failure errno coord_transfm_outside_projection_domain + +------------------------------------------------------------------------------- +# Test oblique aspect of the ellipsoidal form +------------------------------------------------------------------------------- +operation +proj=laea +ellps=GRS80 +lat_0=45 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 0 45 +expect 0 0 +accept 0 0 +expect 0 -4860248.8602 +accept 0 -45 +expect 0 -8984728.0442 +accept 45 45 +expect 3318800.8682 968788.2336 + +# Passes 0.1 mm except on i386. Cf https://github.com/OSGeo/PROJ/pull/4441#issuecomment-2744141103 +tolerance 50 mm +accept 0 90 +expect 0 4886594.2207 + +tolerance 10 cm +accept 45 45 +roundtrip 100 + +# test rho diff --git a/conformance/src/test/resources/gie/defmodel.gie b/conformance/src/test/resources/gie/defmodel.gie new file mode 100644 index 0000000..64f3cd7 --- /dev/null +++ b/conformance/src/test/resources/gie/defmodel.gie @@ -0,0 +1,134 @@ + +------------------------------------------------------------------------------- +=============================================================================== +Test +proj=defmodel +=============================================================================== + + + +# Missing +model +operation +proj=defmodel +expect failure errno invalid_op_missing_arg + +# +model doesn't point to an existing file +operation +proj=defmodel +model=i_do_not_exist +expect failure errno invalid_op_file_not_found_or_invalid + +# Not a JSON file +operation +proj=defmodel +model=proj.ini +expect failure errno invalid_op_file_not_found_or_invalid + +# Missing time +operation +proj=defmodel +model=tests/simple_model_degree_horizontal.json +accept 2 49 30 HUGE_VAL +expect failure errno coord_transfm_missing_time + +operation +proj=defmodel +model=tests/simple_model_degree_horizontal.json +direction inverse +accept 2 49 30 HUGE_VAL +expect failure errno coord_transfm_missing_time + +# Horizontal deformation with horizontal unit = degree +operation +proj=defmodel +model=tests/simple_model_degree_horizontal.json +tolerance 0.1 mm +accept 2 49 30 2020 +expect 3 51 30 2020 +roundtrip 1 + +# 3D deformation with horizontal unit = degree +operation +proj=defmodel +model=tests/simple_model_degree_3d.json +tolerance 0.1 mm +accept 2 49 30 2020 +expect 3 51 33 2020 +roundtrip 1 + +# Horizontal deformation with horizontal unit = metre +operation +proj=pipeline +step +inv +proj=merc +step +proj=defmodel +model=tests/simple_model_metre_horizontal.json +step +proj=merc +tolerance 0.1 mm +accept 10 20 30 2020 +expect 11 22 30 2020 +roundtrip 1 + +# 3D deformation with horizontal unit = metre +operation +proj=pipeline +step +inv +proj=merc +step +proj=defmodel +model=tests/simple_model_metre_3d.json +step +proj=merc +tolerance 0.1 mm +accept 10 20 30 2020 +expect 11 22 33 2020 +roundtrip 1 + +# 3D deformation with horizontal unit = metre and a projeced grid +operation +proj=pipeline +step +proj=defmodel +model=tests/simple_model_projected.json +tolerance 0.1 mm + +accept 1500200.0 5400400.0 30 2020 +expect 1500200.588 5400399.722 30.6084 2020 +roundtrip 1 + +# South-west corner +accept 1500000.0 5400000.0 30 2020 +expect 1500000.4 5399999.8 30.84 2020 +roundtrip 1 + +# South-east corner +accept 1501000.0 5400000.0 30 2020 +expect 1501000.5 5399999.75 30.75 2020 +roundtrip 1 + +# North-west corner +accept 1500000.0 5401000.0 30 2020 +expect 1500000.8 5400999.6 30.36 2020 +roundtrip 1 + +# North-east corner +accept 1501000.0 5401000.0 30 2020 +expect 1501001.0 5400999.7 30 2020 +roundtrip 1 + +# Test geocentric addition of components +operation +proj=pipeline +step +inv +proj=merc +step +proj=defmodel +model=tests/simple_model_metre_3d_geocentric.json +step +proj=merc +tolerance 0.1 mm +accept 10 20 30 2020 +expect 11 22 33 2020 +roundtrip 1 + +# Vertical deformation with vertical unit = metre +operation +proj=defmodel +model=tests/simple_model_metre_vertical.json +tolerance 0.1 mm +accept 2 49 30 2020 +expect 2 49 33 2020 +roundtrip 1 + +# Adjust for 360 degree longitude offsets +operation +proj=defmodel +model=tests/simple_model_metre_vertical.json +tolerance 0.1 mm + +accept 362 49 30 2020 +expect 2 49 33 2020 + +operation +proj=defmodel +model=tests/simple_model_wrap_east.json + +accept 165.9 -37.3 10 2020 +expect 165.9 -37.3 10.4525 2020 + +operation +proj=defmodel +model=tests/simple_model_wrap_west.json + +accept 165.9 -37.3 10 2020 +expect 165.9 -37.3 10.4525 2020 + +# Test geocentric bilinear interpolation method +operation +proj=defmodel +model=tests/simple_model_polar.json +tolerance 0.1 mm + +accept 20 -90 15 2020 +expect 27.4743245365 -89.9999747721 18.0000 2020 + +accept 120 -90 15 2020 +expect 27.4737934098 -89.9999747718 18.0000 2020 + +accept 235 -89.5 15 2020 +expect -124.9986638571 -89.5000223708 17.3750 2020 + +accept 45 -89.5 15 2020 +expect 44.9991295392 -89.4999759438 18.5469 2020 + + diff --git a/conformance/src/test/resources/gie/deformation.gie b/conformance/src/test/resources/gie/deformation.gie new file mode 100644 index 0000000..b03a330 --- /dev/null +++ b/conformance/src/test/resources/gie/deformation.gie @@ -0,0 +1,176 @@ +=============================================================================== +Test for the deformation operation - Kinematic Gridshifting + +For all the deformation tests the alaska and egm96_15.gtx grids are used even +though they are not parts of a deformation model, they are in the proper format +and for testing purposes it doesn't really matter all that much... + +The input coordinate is located at long=60, lam=-160 - somewhere in Alaska. + +=============================================================================== + + + +------------------------------------------------------------------------------- +# Test with an extract of nkgrf03vel_realigned with ctable2+gtx +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=cart +ellps=GRS80 \ + +step +proj=deformation \ + +xy_grids=tests/nkgrf03vel_realigned_xy_extract.ct2 \ + +z_grids=tests/nkgrf03vel_realigned_z_extract.gtx +ellps=GRS80 +dt=1 \ + +step +proj=cart +ellps=GRS80 +inv +------------------------------------------------------------------------------- +tolerance 0.05 mm +accept 21.5 63 0 +expect 21.5000000049 62.9999999937 0.0083 +roundtrip 5 + +------------------------------------------------------------------------------- +# Test with an extract of nkgrf03vel_realigned with GeoTIFF +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=cart +ellps=GRS80 \ + +step +proj=deformation \ + +grids=tests/nkgrf03vel_realigned_extract.tif +ellps=GRS80 +dt=1 \ + +step +proj=cart +ellps=GRS80 +inv +------------------------------------------------------------------------------- +tolerance 0.05 mm +accept 21.5 63 0 +expect 21.5000000049 62.9999999937 0.0083 +roundtrip 5 + +------------------------------------------------------------------------------- +# Test the +dt parameter +------------------------------------------------------------------------------- +operation +proj=deformation +xy_grids=alaska +z_grids=egm96_15.gtx \ + +ellps=GRS80 +dt=16.0 # 2016.0 - 2000.0 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept -3004295.5882503074 -1093474.1690603832 5500477.1338251457 +expect -3004295.7000 -1093474.2097 5500477.3397 +roundtrip 5 + +# Test that errors are reported for coordinates outside the grid. +# Here we test 120W 40N which is well outside the alaska grid. +accept -2446353.8001 -4237209.0750 4077985.572 +expect failure errno coord_transfm_outside_grid +accept -2446353.8001 -4237209.0750 4077985.572 +expect failure errno coord_transfm_outside_grid + + +------------------------------------------------------------------------------- +# Test using both horizontal and vertical grids +------------------------------------------------------------------------------- +operation +proj=deformation \ + +xy_grids=alaska +z_grids=egm96_15.gtx +t_epoch=2016.0 +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 0.1 mm +direction inverse +accept -3004295.5882503074 -1093474.1690603832 5500477.1338251457 2000.0 +expect -3004295.7000 -1093474.2097 5500477.3397 2000.0 +roundtrip 5 + +# Missing time +direction forward +accept -3004295.5882503074 -1093474.1690603832 5500477.1338251457 HUGE_VAL +expect failure errno coord_transfm_missing_time + +direction inverse +accept -3004295.5882503074 -1093474.1690603832 5500477.1338251457 HUGE_VAL +expect failure errno coord_transfm_missing_time + +------------------------------------------------------------------------------- +operation proj=deformation xy_grids=alaska +dt=1.0 ellps=GRS80 +expect failure errno invalid_op_missing_arg + +operation proj=deformation z_grids=egm96_15.gtx +dt=1.0 ellps=GRS80 +expect failure errno invalid_op_missing_arg + +operation proj=deformation xy_grids=nonexisting z_grids=egm96_15.gtx \ + +dt=1.0 ellps=GRS80 +expect failure errno invalid_op_file_not_found_or_invalid + +operation proj=deformation xy_grids=alaska z_grids=nonexisting \ + +dt=1.0 ellps=GRS80 +expect failure errno invalid_op_file_not_found_or_invalid + +operation proj=deformation xy_grids=alaska z_grids=nonexisting ellps=GRS80 +expect failure errno invalid_op_file_not_found_or_invalid + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=egm96_15.gtx +t_epoch=2010.0 +t_final=2018.0 +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept 12 56 0.0 2000.0 +expect 12 56 -36.9960 2000.0 +roundtrip 100 + +accept 12 56 0.0 2011.0 +expect 12 56 0.0 2011.0 +roundtrip 100 + +accept 12 56 0.0 2019.0 +expect 12 56 0.0 2019.0 +roundtrip 100 + +accept 12 56 0.0 +expect 12 56 -36.9960 +roundtrip 100 + + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=egm96_15.gtx +t_epoch=2010.0 +t_final=now +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept 12 56 0.0 2000.0 +expect 12 56 -36.9960 2000.0 +roundtrip 100 + +accept 12 56 0.0 2011.0 +expect 12 56 0.0 2011.0 +roundtrip 1000 + +accept 12 56 0.0 3011.0 +expect 12 56 0.0 3011.0 +roundtrip 100 + + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=alaska +t_epoch=2010.0 +t_final=2018.0 +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept -147.0 64.0 0.0 2000.0 +expect -147.0023233121 63.9995792119 0.0 2000.0 +roundtrip 100 + +accept -147.0 64.0 0.0 2011.0 +expect -147.0 64.0 0.0 2011.0 +roundtrip 100 + +accept -147.0 64.0 0.0 2011.0 +expect -147.0 64.0 0.0 2011.0 +roundtrip 100 + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=alaska +t_epoch=2010.0 +t_final=now +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept -147.0 64.0 0.0 2000.0 +expect -147.0023233121 63.9995792119 0.0 2000.0 +roundtrip 100 + +accept -147.0 64.0 0.0 2011.0 +expect -147.0 64.0 0.0 2011.0 +roundtrip 100 + +accept -147.0 64.0 0.0 3011.0 +expect -147.0 64.0 0.0 3011.0 +roundtrip 100 + + + diff --git a/conformance/src/test/resources/gie/ellipsoid.gie b/conformance/src/test/resources/gie/ellipsoid.gie new file mode 100644 index 0000000..ea0e326 --- /dev/null +++ b/conformance/src/test/resources/gie/ellipsoid.gie @@ -0,0 +1,188 @@ +=============================================================================== + +Test pj_ellipsoid, the reimplementation of pj_ell_set + +=============================================================================== + + + + +------------------------------------------------------------------------------- +# First a spherical example +------------------------------------------------------------------------------- +operation proj=merc R=6400000 +------------------------------------------------------------------------------- +tolerance 10 nm +accept 1 2 +expect 111701.0721276371 223447.5262032605 + +accept 12 55 +expect 1340412.8655316452 7387101.1430967357 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Then an explicitly defined ellipsoidal example +------------------------------------------------------------------------------- +operation proj=merc a=6400000 rf=297 +------------------------------------------------------------------------------- +tolerance 10 nm +accept 1 2 +expect 111701.0721276371 221945.9681832088 + +accept 12 55 +expect 1340412.8655316452 7351803.9151705895 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Then try using a built in ellipsoid +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 10 nm +accept 1 2 +expect 111319.4907932736 221194.0771604237 + +accept 12 55 +expect 1335833.8895192828 7326837.7148738774 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Then try to fail deliberately +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80000000000 +expect failure errno invalid_op_illegal_arg_value +operation proj=merc +a=-1 +expect failure errno invalid_op_illegal_arg_value + +operation proj=merc +accept 0 0 +expect 0 0 + +operation proj=merc +a=1 +es=-1 +expect failure errno invalid_op_illegal_arg_value + +operation proj=merc +R=0 +expect failure errno invalid_op_illegal_arg_value + +operation +proj=merc +R_a +a=2 +f=2 +expect failure errno invalid_op_illegal_arg_value + +operation +expect failure +operation cobra +expect failure +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Finally test the spherification functionality +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_A +tolerance 10 nm +accept 12 55 +expect 1334340.6237297705 7353636.6296552019 +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_V +tolerance 10 nm +accept 12 55 +expect 1334339.2852675652 7353629.2533042720 +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_a +tolerance 10 nm +accept 12 55 +expect 1333594.4904527504 7349524.6413825499 +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_g +tolerance 10 nm +accept 12 55 +expect 1333592.6102291327 7349514.2793497816 +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_h +tolerance 10 nm +accept 12 55 +expect 1333590.7300081658 7349503.9173316229 +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_lat_a=60 +tolerance 10 nm +accept 12 55 +expect 1338073.7436268919 7374210.0924803326 +------------------------------------------------------------------------------- +operation proj=merc ellps=GRS80 R_lat_g=60 +tolerance 10 nm +accept 12 55 +expect 1338073.2696101593 7374207.4801437631 +------------------------------------------------------------------------------- + +operation proj=merc a=1E77 R_lat_a=90 b=1 +expect failure + +------------------------------------------------------------------------------- +# This one from testvarious failed at first version of the pull request +------------------------------------------------------------------------------- +operation proj=healpix a=1 lon_0=0 ellps=WGS84 +------------------------------------------------------------------------------- +accept 0 41.937853904844985 +expect 0 0.78452 +accept -90 0 +expect -1.56904 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Shape parameters +------------------------------------------------------------------------------- +operation proj=utm zone=32 ellps=GRS80 rf=0 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 ellps=GRS80 e=-0.5 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 ellps=GRS80 e=1 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 ellps=GRS80 es=1 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 a=1 es=1.1 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 ellps=GRS80 b=0 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 ellps=GRS80 f=1 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm zone=32 ellps=GRS80 b=6000000 +accept 12 55 +expect 699293.0880 5674591.5295 + +operation proj=utm zone=32 ellps=GRS80 rf=300 +accept 12 55 +expect 691873.1212 6099054.9661 + +operation proj=utm zone=32 ellps=GRS80 f=0.00333333333333 +accept 12 55 +expect 691873.1212 6099054.9661 + +operation proj=utm zone=32 ellps=GRS80 b=6000000 +accept 12 55 +expect 699293.0880 5674591.5295 + +operation proj=utm zone=32 a=6400000 b=6000000 +accept 12 55 +expect 700416.5900 5669475.8884 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test that flattening can be set to zero +------------------------------------------------------------------------------- +operation proj=merc +a=1.0 +f=0.0 +------------------------------------------------------------------------------- +accept 12 56 +expect 0.20944 1.18505 +------------------------------------------------------------------------------- + + + diff --git a/conformance/src/test/resources/gie/epsg_grid.gie b/conformance/src/test/resources/gie/epsg_grid.gie new file mode 100644 index 0000000..1ae6fc2 --- /dev/null +++ b/conformance/src/test/resources/gie/epsg_grid.gie @@ -0,0 +1,32 @@ +### This file must contain only (crs_src, crs_dst) tuples where the best transformation +### DOES involve the use a grid/json/etc. resource file +### Otherwise use epsg_no_grid.gie + + + +################################### +#### Generic / worldwide scope #### +################################### + +# Test EGM2008 grid +crs_src EPSG:4979 # WGS 84 geographic 3D +crs_dst EPSG:9518 # WGS 84 + EGM2008 +tolerance 0.1 mm +require_grid us_nga_egm08_25.tif + +accept 55.0 12.0 10.0 +expect 55.0 12.0 -27.8257 + +################ +#### FRANCE #### +################ + +crs_src EPSG:9785 # RGF93 v2b + NGF-IGN69 height +crs_dst EPSG:9781 # RGF93 v2b geographic 3D +tolerance 0.1 mm +require_grid fr_ign_RAF20.tif + +accept 43.6109 3.8761 0.0 +expect 43.6109 3.8761 49.6904 + + diff --git a/conformance/src/test/resources/gie/epsg_no_grid.gie b/conformance/src/test/resources/gie/epsg_no_grid.gie new file mode 100644 index 0000000..cfd22a8 --- /dev/null +++ b/conformance/src/test/resources/gie/epsg_no_grid.gie @@ -0,0 +1,61 @@ +### This file must contain only (crs_src, crs_dst) tuples where the best transformation +### does NOT involve the use a grid/json/etc. resource file +### Otherwise use epsg_grid.gie + + + +################################### +#### Generic / worldwide scope #### +################################### + +# ETRS89 -> ETRS89/UTM32 +crs_src EPSG:4258 +crs_dst EPSG:25832 +tolerance 0.1 mm +accept 55.0 12.0 +expect 691875.6321 6098907.8250 + +# WGS 84 geographic 3D -> WGS 84 geocentric +crs_src EPSG:4979 +crs_dst EPSG:4978 +tolerance 0.1 mm +accept 55.0 12.0 10.0 +expect 3586475.2672 762328.8513 5201391.7147 + +# WGS 84 geocentric -> WGS 84 geographic 3D +crs_src EPSG:4979 +crs_dst EPSG:4978 +tolerance 0.1 mm +expect 3586475.2672 762328.8513 5201391.7147 +accept 55.0 12.0 10.0 + +################### +#### AUSTRALIA #### +################### + +# GDA2020 -> ITRF2014, using EPSG:8049 "ITRF2014 to GDA2020 (1)" 15-parameter Helmert with 2020.0 central epoch +crs_src EPSG:7843 # GDA2020 +crs_dst EPSG:7912 # ITRF2014 +tolerance 0.1 mm +accept -33.8623 151.2077 0.0 2020.0 +expect -33.8623 151.2077 0.0 2020.0 + +crs_src EPSG:7843 # GDA2020 +crs_dst EPSG:7912 # ITRF2014 +tolerance 0.1 mm +accept -33.8623 151.2077 0.0 2026.0 +expect -33.862297056 151.207701181 -0.00101 2026.0 + +################### +###### FINLAND #### +################### + +# Test northing, easting output (actually more a gie test itself, than a EPSG one) +crs_src EPSG:4123 # Finland KKJ +crs_dst EPSG:2393 # Finland YKJ Northing, Easting + +tolerance 0.1 mm +accept 60.1699 24.9384 +expect 6674944.7742 3385559.8151 + + diff --git a/conformance/src/test/resources/gie/geotiff_grids.gie b/conformance/src/test/resources/gie/geotiff_grids.gie new file mode 100644 index 0000000..f222c2a --- /dev/null +++ b/conformance/src/test/resources/gie/geotiff_grids.gie @@ -0,0 +1,364 @@ + +------------------------------------------------------------------------------- +=============================================================================== +Test GeoTIFF grids +=============================================================================== + + + +# Those first tests using +proj=vgridshift only test the capability of reading +# correctly a value from various formulations of GeoTIFF file, hence only the +# forward path is tested (reverse path is tested in other files) + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_pixelispoint.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_pixelisarea.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_deflate.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_deflate_floatingpointpredictor.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_uint16.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_uint16_with_scale_offset.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_int16.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_int32.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_uint32.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_float64.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +# The overview should be ignored +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_with_overview.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_in_second_channel.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_bigtiff.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_bigendian.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_bigendian_bigtiff.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_bottomup_with_scale.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_bottomup_with_matrix.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_with_subgrid.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.5 52.5 0 +expect 4.5 52.5 11.5 + +# In subgrid +accept 5.5 53.5 0 +expect 5.5 53.5 110.0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_nodata.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 4.05 52.1 0 +expect 4.05 52.1 10 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_hydroid_height.tif +multiplier=1 +------------------------------------------------------------------------------- +accept 2 49 0 +expect 2 49 44.643493652 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_invalid_channel_type.tif +multiplier=1 +------------------------------------------------------------------------------- +expect failure errno invalid_op_file_not_found_or_invalid +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_vgrid_unsupported_byte.tif +multiplier=1 +------------------------------------------------------------------------------- +expect failure errno invalid_op_file_not_found_or_invalid +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif +multiplier=1 +------------------------------------------------------------------------------- +tolerance 1 mm + +accept 179.99 54.5 0 +expect 179.99 54.5 -2.2226 + +accept -179.99 54.5 0 +expect -179.99 54.5 -2.3488 + +accept 179.999999 54.5 0 +expect 179.999999 54.5 -2.2872 + +accept -179.999999 54.5 0 +expect -179.999999 54.5 -2.2872 + +accept 179.8 54.5 0 +expect 179.8 54.5 -0.7011 + +accept 179.799 54.5 0 +expect failure errno coord_transfm_outside_grid + +accept 180.1833333 54.5 0 +expect -179.8166667 54.5 -3.1933 + +accept -179.8166667 54.5 0 +expect -179.8166667 54.5 -3.1933 + +accept 180.184 54.5 0 +expect failure errno coord_transfm_outside_grid + +accept -179.816 54.5 0 +expect failure errno coord_transfm_outside_grid + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_separate.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_strip.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_tiled.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_tiled_separate.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_positive_west.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_lon_shift_first.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_radian.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_degree.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +# The overview should be ignored +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_with_overview.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_extra_ifd_with_other_info.tif +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +# Subset of NTv2_0.gsb +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_with_subgrid.tif +------------------------------------------------------------------------------- +# In subgrid ALbanff, of parent CAwest +accept -115.5416667 51.1666667 0 +expect -115.5427092888 51.1666899972 0 + +# In subgrid ONtronto, of parent CAeast +accept -80.5041667 44.5458333 0 +expect -80.50401615833 44.5458827236 0 +------------------------------------------------------------------------------- + +# Subset of NTv2_0.gsb +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_with_subgrid_no_grid_name.tif +------------------------------------------------------------------------------- +# In subgrid ALbanff, of parent CAwest +accept -115.5416667 51.1666667 0 +expect -115.5427092888 51.1666899972 0 + +# In subgrid ONtronto, of parent CAeast +accept -80.5041667 44.5458333 0 +expect -80.50401615833 44.5458827236 0 +------------------------------------------------------------------------------- + +# Check a nested grid of a nested grid only based on spatial extent analysis +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_with_two_level_of_subgrids_no_grid_name.tif +------------------------------------------------------------------------------- +accept -45.0 22.5 +accept -44.9983333334 22.5013888889 + +# Check a nested grid of a nested grid only based on spatial extent analysis +------------------------------------------------------------------------------- +operation +proj=vgridshift +grids=tests/test_hgrid_with_two_level_of_subgrids_no_grid_name.tif +multiplier=1 +------------------------------------------------------------------------------- +accept -45.0 22.5 0 +accept -45.0 22.5 5 + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_vgrid.tif +------------------------------------------------------------------------------- +expect failure errno invalid_op_file_not_found_or_invalid +------------------------------------------------------------------------------- + + +# IGNF:LAMBE to IGNF:LAMB93 using xyzgridshift operation +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +inv +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 \ + +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=clrk80ign +pm=paris \ + +step +proj=push +v_3 \ + +step +proj=cart +ellps=clrk80ign \ + +step +proj=xyzgridshift +grids=tests/subset_of_gr3df97a.tif +grid_ref=output_crs +ellps=GRS80 \ + +step +proj=cart +ellps=GRS80 +inv \ + +step +proj=pop +v_3 \ + +step +proj=lcc +lat_0=46.5 +lon_0=3 +lat_1=49 +lat_2=44 \ + +x_0=700000 +y_0=6600000 +ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 1 mm + +accept 814149.529 1887019.768 0 +expect 860690.804 6319036.849 0 +# If using ntf_r93.gsb, one gets: 860690.805 6319036.850 + +roundtrip 1 +------------------------------------------------------------------------------- + + + diff --git a/conformance/src/test/resources/gie/gridshift.gie b/conformance/src/test/resources/gie/gridshift.gie new file mode 100644 index 0000000..98cf065 --- /dev/null +++ b/conformance/src/test/resources/gie/gridshift.gie @@ -0,0 +1,295 @@ + +------------------------------------------------------------------------------- +=============================================================================== +Test generalized shift grid method +=============================================================================== + + + +----------------------------- +# Classic lat-lon shift grids +----------------------------- + +# Subset of NTv2_0.gsb +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/test_hgrid_with_subgrid.tif +------------------------------------------------------------------------------- + +accept 179.799 54.5 0 +expect failure errno coord_transfm_outside_grid + +# In subgrid ALbanff, of parent CAwest +accept -115.5416667 51.1666667 0 +expect -115.5427092888 51.1666899972 0 +roundtrip 1 + +# In subgrid ONtronto, of parent CAeast +accept -80.5041667 44.5458333 0 +expect -80.50401615833 44.5458827236 0 +roundtrip 1 +------------------------------------------------------------------------------- + +# Subset of NTv2_0.gsb +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/test_hgrid_with_subgrid_no_grid_name.tif +------------------------------------------------------------------------------- + +# In subgrid ALbanff, of parent CAwest +accept -115.5416667 51.1666667 0 +expect -115.5427092888 51.1666899972 0 +roundtrip 1 + +# In subgrid ONtronto, of parent CAeast +accept -80.5041667 44.5458333 0 +expect -80.50401615833 44.5458827236 0 +roundtrip 1 +------------------------------------------------------------------------------- + + + +-------------------- +# Classic geoidgrids +-------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif +------------------------------------------------------------------------------- +tolerance 1 mm + +accept 179.99 54.5 0 +expect 179.99 54.5 -2.2226 +roundtrip 1 + +accept -179.99 54.5 0 +expect -179.99 54.5 -2.3488 +roundtrip 1 + +accept 179.999999 54.5 0 +expect 179.999999 54.5 -2.2872 +roundtrip 1 + +accept -179.999999 54.5 0 +expect -179.999999 54.5 -2.2872 +roundtrip 1 + +accept 179.8 54.5 0 +expect 179.8 54.5 -0.7011 +roundtrip 1 + +accept 179.799 54.5 0 +expect failure errno coord_transfm_outside_grid + +accept 180.1833333 54.5 0 +expect -179.8166667 54.5 -3.1933 +roundtrip 1 + +accept -179.8166667 54.5 0 +expect -179.8166667 54.5 -3.1933 +roundtrip 1 + +accept 180.184 54.5 0 +expect failure errno coord_transfm_outside_grid + +accept -179.816 54.5 0 +expect failure errno coord_transfm_outside_grid + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/test_hydroid_height.tif +------------------------------------------------------------------------------- +accept 2 49 0 +expect 2 49 44.643493652 +------------------------------------------------------------------------------- + + +---------------------------------------------------------------------- +# Geographic 3D offsets with quadratic interpolation (defined in file) +---------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif +------------------------------------------------------------------------------- +tolerance 1 mm + +# Test point from https://www.ngs.noaa.gov/NCAT, exactly at one grid node + +accept -95.5000000000 37.0000000000 10.000 +expect -95.4999998219 37.0000000147 9.984 +roundtrip 1 + +# Test point from https://www.ngs.noaa.gov/NCAT +# specifically selected to be close to the middle of a pixel + +accept -95.4916666666 37.0083333333 10.000 +expect -95.4916664889 37.0083333484 9.984 +roundtrip 1 + +# Test point from https://www.ngs.noaa.gov/NCAT +# specifically selected to be close to the middle of a pixel (but +# other side of previous test point) + +accept -95.4916666667 37.0083333334 10.000 +expect -95.4916664890 37.0083333485 9.984 +roundtrip 1 + +# Test point at north-east of truncated grid + +accept -95.416667 37.083333 0.000 +expect -95.4166668251 37.0833330159 -0.0157 + +# Test point at south-west of truncated grid + +accept -95.58333 36.91667 0.000 +expect -95.5833298166 36.9166700108 -0.0157 +roundtrip 1 + + + +---------------------------------------------------------------------- +# Geographic 3D offsets, but split in one grid with horizontal offset and +# another one with ellipsoidal height offset, with quadratic interpolation (defined in file) +---------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif +------------------------------------------------------------------------------- +tolerance 1 mm + +# Test point from https://www.ngs.noaa.gov/NCAT, exactly at one grid node + +accept -158.0 61.5 10.000 +expect -157.9999996115 61.499999564 9.987 +roundtrip 1 + +# Test point from https://www.ngs.noaa.gov/NCAT + +accept -158.1 61.51 10.000 +expect -158.0999996011 61.5099995458 9.987 +roundtrip 1 + + +---------------------------------------------------------------------- +# Combine 2 above type of grids +---------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif,tests/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif +------------------------------------------------------------------------------- +tolerance 1 mm + +# Test point from https://www.ngs.noaa.gov/NCAT, exactly at one grid node + +accept -95.5000000000 37.0000000000 10.000 +expect -95.4999998219 37.0000000147 9.984 +roundtrip 1 + +# Test point from https://www.ngs.noaa.gov/NCAT, exactly at one grid node + +accept -158.0 61.5 10.000 +expect -157.9999996115 61.499999564 9.987 +roundtrip 1 + + +---------------------------------------------------------------------- +# Test +no_z_transform +---------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif +no_z_transform +------------------------------------------------------------------------------- +tolerance 1 mm + +accept -95.5000000000 37.0000000000 10.000 +expect -95.4999998219 37.0000000147 10.000 +roundtrip 1 + +------------------------------ +# Test bilinear vs biquadratic +------------------------------ + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif +interpolation=biquadratic +------------------------------------------------------------------------------- +tolerance 0.005 mm + +accept -95.4916666666 37.0083333333 10.000 +expect -95.49166648893 37.00833334837 9.984340 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif +interpolation=bilinear +------------------------------------------------------------------------------- +tolerance 0.001 mm + +accept -95.4916666666 37.0083333333 10.000 +expect -95.49166648893 37.00833334838 9.984341 +roundtrip 1 + +---------------------------------------------------------------------------------------------------------------------- +# Test case with inverse biquadratic convergence where we are around a location where the interpolation window changes +---------------------------------------------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif +interpolation=biquadratic +------------------------------------------------------------------------------- +direction inverse +tolerance 0.005 mm + +accept -122.4250009683 37.8286740788 +expect -122.4249999391 37.8286728006 + +---------------------------------------------------------------------- +# Test a grid referenced in a projected CRS, with an additional constant offset +---------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/test_gridshift_projected.tif +------------------------------------------------------------------------------- + +tolerance 0.5 mm + +accept -598000.000 -1160020.000 0.000 +expect -5597999.885 -6160019.978 0.000 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=krovak +lat_0=49.5 +lon_0=24.8333333333333 +alpha=30.2881397527778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel \ + +step +proj=gridshift +grids=tests/test_gridshift_projected.tif \ + +step +inv +proj=mod_krovak +lat_0=49.5 +lon_0=24.8333333333333 +alpha=30.2881397222222 +k=0.9999 +x_0=5000000 +y_0=5000000 +ellps=bessel +------------------------------------------------------------------------------- + +tolerance 0.5 mm + +accept 16.610452439 49.202425040 0.000 +expect 16.610455233 49.202425034 0.000 +roundtrip 1 + +------------- +# Error cases +------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif +interpolation=invalid +------------------------------------------------------------------------------- +expect failure errno invalid_op_illegal_arg_value +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +------------------------------------------------------------------------------- +expect failure errno invalid_op_missing_arg +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/test_vgrid_unsupported_byte.tif +------------------------------------------------------------------------------- +expect failure errno invalid_op_file_not_found_or_invalid +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=gridshift +grids=tests/i_do_not_exist.tif +------------------------------------------------------------------------------- +expect failure errno invalid_op_file_not_found_or_invalid +------------------------------------------------------------------------------- + + diff --git a/conformance/src/test/resources/gie/guyou.gie b/conformance/src/test/resources/gie/guyou.gie new file mode 100644 index 0000000..2ed2ab4 --- /dev/null +++ b/conformance/src/test/resources/gie/guyou.gie @@ -0,0 +1,2133 @@ + +------------------------------------------------------------ +# This gie file was automatically generated using libproject +# where the guyou code was adapted from +------------------------------------------------------------ + +------------------------------------------------------------ +operation +proj=guyou +R=6370997 +tolerance 1 mm +------------------------------------------------------------ +accept -179.2338274749 -90.7265739758 +expect failure errno coord_transfm_invalid_coord + +accept -169.3015609686 -90.0683270041 +expect failure errno coord_transfm_invalid_coord + +accept -159.4420546811 -89.5695551279 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.0045856345 -89.3536369188 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.7153960960 -88.6283945950 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.2286632319 -88.1551228787 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.6286953558 -87.5083524092 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3328522812 -86.7510648640 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.1598524965 -86.5788079857 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3858632536 -85.7390309668 +expect -671252.534 -11805089.168 + +accept -79.5087279110 -85.6235707551 +expect -677891.869 -11686402.401 + +accept -69.4424228202 -84.9021341881 +expect -751854.643 -11529210.346 + +accept -59.8852518498 -84.8051735959 +expect -707106.316 -11400468.436 + +accept -49.2060555595 -84.5394950727 +expect -649513.005 -11249221.343 + +accept -39.5503275201 -84.2989454792 +expect -569372.760 -11119412.618 + +accept -29.3360829537 -83.5760929301 +expect -492270.211 -10930876.977 + +accept -19.3394041666 -83.2992154597 +expect -346317.029 -10818825.415 + +accept -9.2056484989 -82.3824201970 +expect -189497.900 -10632767.439 + +accept 0.1120336125 -81.7746272088 +expect 2495.102 -10523224.283 + +accept 10.5665512094 -81.6687644685 +expect 237086.343 -10527998.139 + +accept 20.1722250768 -81.3102866550 +expect 465363.960 -10531084.361 + +accept 30.5265377635 -80.9100945160 +expect 718603.642 -10578303.571 + +accept 40.4565955888 -79.9253199265 +expect 1020024.277 -10597524.229 + +accept 50.1397967283 -79.1591500985 +expect 1304571.493 -10703166.350 + +accept 60.7532284194 -78.3809992723 +expect 1600003.385 -10897309.840 + +accept 70.7513325682 -77.7277296032 +expect 1840823.214 -11154024.272 + +accept 80.2085188693 -77.6809008485 +expect 1936586.409 -11469925.164 + +accept 90.8009658259 -76.9680414794 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.6742326194 -76.5942100817 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5209403479 -75.7585741711 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.5896919383 -74.7649093703 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.7851397036 -73.8582467239 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.7197125638 -72.9106110624 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.4163065521 -72.4059990981 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.4383759680 -71.9757412863 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.5708534042 -71.9525642223 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.2751947006 -71.5923171899 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.7095201992 -79.9687467646 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.0436424710 -79.2424043855 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.2911675882 -78.8917009107 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.2815042820 -78.0224816760 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.5027225646 -77.9987560452 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.2026665027 -77.1138023157 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.6161746714 -76.2954327600 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.9384914753 -75.7674050764 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.2183181307 -75.3730011624 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.2190150125 -74.7701795551 +expect -2454071.146 -11777557.324 + +accept -79.9068086129 -74.7070663318 +expect -2420802.270 -11364639.564 + +accept -69.8146319687 -74.4419812746 +expect -2332536.533 -10920591.181 + +accept -59.6461988138 -73.5860650374 +expect -2238931.921 -10443654.878 + +accept -49.5451009633 -73.4954549764 +expect -1957322.263 -10070951.521 + +accept -39.9329751143 -72.8013395667 +expect -1694139.274 -9695298.489 + +accept -29.5097310678 -72.3497881968 +expect -1313051.961 -9382518.879 + +accept -19.9921230083 -71.8366964443 +expect -925602.320 -9142855.035 + +accept -9.2490763384 -71.0229026677 +expect -448842.813 -8910142.058 + +accept 0.7720814716 -70.5972765500 +expect 38276.499 -8815699.571 + +accept 10.0262635630 -70.0895817655 +expect 507116.076 -8777330.134 + +accept 20.7479812506 -69.9032152988 +expect 1049893.591 -8874298.589 + +accept 30.3631890384 -69.4998925877 +expect 1545301.219 -9005805.601 + +accept 40.5162040333 -69.3056454098 +expect 2041397.015 -9262605.098 + +accept 50.6243675940 -68.6167358219 +expect 2562297.663 -9551642.297 + +accept 60.0486043403 -67.6600969757 +expect 3069614.536 -9891241.853 + +accept 70.4774261179 -66.9833418981 +expect 3532980.732 -10438619.729 + +accept 80.8997122704 -66.2858473379 +expect 3898590.190 -11120572.688 + +accept 90.1834036836 -65.9440561722 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.1984006355 -65.8229326488 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.0486236854 -65.7960345782 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.0510835725 -65.5190096678 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.0896340570 -64.7428784330 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.3678752942 -64.2229928140 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.9150615805 -63.6990548356 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.7280406636 -63.2384418688 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.9183869916 -62.3774990742 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.5619551786 -61.8063907044 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.5943789042 -69.9992085183 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.2134281484 -69.9776667645 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.4518981501 -69.3934026425 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3420413989 -68.4537518490 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.1131932532 -67.9826718761 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7785737569 -67.0804523760 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.8160590971 -66.1963102135 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.4603476745 -65.8550220266 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.0748524068 -64.9756976432 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.9206313411 -64.7601702734 +expect -4268828.098 -11805632.912 + +accept -79.4513980949 -64.0272106872 +expect -4293419.464 -10904353.202 + +accept -69.0843325805 -63.4870607362 +expect -4057816.546 -10051354.989 + +accept -59.7650575505 -63.4512934361 +expect -3634811.426 -9423524.250 + +accept -49.8561841911 -63.1756677100 +expect -3130112.256 -8850654.578 + +accept -39.7345386469 -62.7259798066 +expect -2564843.692 -8361549.352 + +accept -29.4900121781 -62.6544841838 +expect -1922148.138 -8030239.835 + +accept -19.6711096687 -62.5940745250 +expect -1289744.456 -7810760.172 + +accept -9.2778801891 -62.3661044165 +expect -613541.964 -7649920.107 + +accept 0.6845208231 -61.4547664483 +expect 46410.846 -7484124.735 + +accept 10.3009385171 -60.8552091241 +expect 708981.245 -7444183.153 + +accept 20.9408599577 -60.7500016629 +expect 1443253.248 -7573067.407 + +accept 30.2033715333 -60.0297971335 +expect 2116701.190 -7683450.314 + +accept 40.1756048990 -59.0918222414 +expect 2877171.027 -7881749.372 + +accept 50.6849086093 -58.5125230628 +expect 3670248.004 -8282000.517 + +accept 60.3342813246 -57.7415828952 +expect 4433950.014 -8770184.848 + +accept 70.3874078634 -56.9198966570 +expect 5230934.598 -9486837.736 + +accept 80.0904535261 -56.6354279372 +expect 5822685.735 -10504356.087 + +accept 90.6634211024 -56.5251359813 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.1452342443 -55.8401169432 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.6864799856 -55.5116401637 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.3347823427 -55.2601958124 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.5134926951 -55.0238926067 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.3265242174 -54.4313834318 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.3685976599 -54.1552793246 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.9436711470 -53.1842316256 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.4034003030 -52.8621841373 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.0812683568 -52.6818511960 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.2224188803 -59.7295306861 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.4132895133 -59.2803345438 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.2336212919 -58.3674875157 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.6086565801 -57.6885943847 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.4537382278 -57.2767531329 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.8015642819 -57.0799116685 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.7728590554 -56.2047588377 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.7735055519 -55.4019628150 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.4371631073 -55.2867551270 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.8854290226 -55.2220077227 +expect -6418775.726 -11794916.199 + +accept -79.1497539952 -54.3143207583 +expect -6295512.226 -10173525.949 + +accept -69.3905433066 -53.3718201615 +expect -5756144.839 -8936634.008 + +accept -59.2835867353 -53.2932693342 +expect -4907385.858 -8087491.004 + +accept -49.4130759901 -52.3805314789 +expect -4141087.186 -7360481.030 + +accept -39.8824125488 -52.1928991404 +expect -3328366.078 -6910061.242 + +accept -29.4030406405 -51.2671252739 +expect -2475693.404 -6448925.355 + +accept -19.4382561500 -50.9645531478 +expect -1635897.800 -6198331.601 + +accept -9.1883916217 -50.6933815720 +expect -773969.285 -6040410.862 + +accept 0.9421744209 -50.4553454248 +expect 79572.416 -5974811.404 + +accept 10.2598469192 -50.3729595701 +expect 868653.957 -6006249.038 + +accept 20.5264309044 -49.7736213847 +expect 1760454.588 -6056357.985 + +accept 30.1563304273 -49.0546876336 +expect 2631434.958 -6165824.779 + +accept 40.6791957468 -48.4680700697 +expect 3620466.862 -6416267.044 + +accept 50.4781583451 -48.0216578802 +expect 4589763.311 -6780810.836 + +accept 60.0996876001 -47.2258755796 +expect 5649013.583 -7224720.556 + +accept 70.5609958631 -47.1401905695 +expect 6849278.900 -8064195.707 + +accept 80.4369996020 -46.9794332723 +expect 8182405.160 -9269149.720 + +accept 90.9151039880 -46.9029866463 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.4373534616 -46.3943619602 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.2842129880 -46.0308507793 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.6486866778 -45.8054277747 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.9364857762 -44.8554259969 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6165699073 -43.9676693909 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.9528142413 -43.4405627423 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.5641245537 -42.8137396224 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.0938980656 -42.4864250646 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.3769971687 -41.5989802375 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.6808058361 -49.7903016746 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.7237623059 -49.1268921477 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.4102418582 -48.8849591656 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.2254953136 -48.1844242863 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.6041758915 -48.1179744801 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.3754143228 -47.1336832541 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.9746970079 -46.6736994965 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.7581919902 -46.0366124472 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.3823846098 -45.2381613350 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.0277852820 -44.5174266340 +expect -11094288.600 -10444365.724 + +accept -79.1875075496 -44.2312628392 +expect -8556831.915 -8448188.432 + +accept -69.3884076627 -43.7260948924 +expect -7143035.210 -7330162.787 + +accept -59.0994244861 -42.9591919136 +expect -5919312.756 -6474855.414 + +accept -49.2684633342 -42.4441379846 +expect -4837843.073 -5897052.170 + +accept -39.8960036873 -42.3148188142 +expect -3850941.078 -5525083.810 + +accept -29.6345258809 -41.8794443052 +expect -2831674.368 -5185997.953 + +accept -19.0064372737 -41.6217897025 +expect -1802198.153 -4961332.000 + +accept -9.6098419837 -41.1640449046 +expect -910539.796 -4807542.914 + +accept 0.3859851257 -40.6879294032 +expect 36674.106 -4715715.978 + +accept 10.6732390311 -40.2577682910 +expect 1020571.561 -4700734.253 + +accept 20.4749360982 -39.4261884171 +expect 1985510.706 -4700304.672 + +accept 30.7185540788 -39.1851869067 +expect 3019577.777 -4853020.985 + +accept 40.6403024621 -38.8583130891 +expect 4072800.273 -5067567.533 + +accept 50.3930386020 -38.6899841653 +expect 5171620.590 -5386102.158 + +accept 60.7920764042 -38.4864124906 +expect 6459723.244 -5832754.996 + +accept 70.9818120585 -38.2419029781 +expect 7920365.597 -6384561.316 + +accept 80.3791490145 -38.1923095026 +expect 9574134.022 -7007709.059 + +accept 90.5297378114 -37.5687159826 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.5373276614 -37.4573903187 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.0551604465 -36.8785291472 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.5920897044 -36.3504262236 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1692367892 -36.3071095311 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.0034604349 -35.8053875550 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.9162515055 -35.0369229256 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.4006102901 -34.7824559736 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.8020614665 -34.6367632672 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.1238278697 -34.5735242626 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.3392011550 -39.0089519711 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.9896135260 -38.7758352491 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9464206150 -38.3643075290 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.8580885141 -38.2565849818 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.0005407033 -37.8175552179 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.9744744916 -36.9749101428 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.4953757022 -36.8251466679 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.8732055905 -36.2644266473 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.2563126423 -35.6283177384 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.2720021301 -34.8337636531 +expect -11652944.582 -6432012.406 + +accept -79.9152588062 -34.3347175023 +expect -9740630.763 -6049660.979 + +accept -69.0059405699 -34.0306344677 +expect -7905352.539 -5468386.167 + +accept -59.9476909228 -33.2328890516 +expect -6646979.903 -4929914.448 + +accept -49.4912957918 -32.6555467192 +expect -5330421.040 -4465548.182 + +accept -39.4661117786 -32.0831702107 +expect -4167577.289 -4109295.788 + +accept -29.8207115548 -31.3399185713 +expect -3111531.284 -3817143.482 + +accept -19.8496271346 -31.2738366265 +expect -2047137.004 -3670990.375 + +accept -9.6527246528 -30.5326610745 +expect -992826.938 -3500250.586 + +accept 0.5995552142 -29.7920841190 +expect 61796.178 -3387838.259 + +accept 10.8411608718 -29.0671095836 +expect 1125114.712 -3331112.646 + +accept 20.3367215658 -28.5199148717 +expect 2132236.809 -3339194.703 + +accept 30.2505986215 -28.1864696949 +expect 3217328.415 -3423954.421 + +accept 40.5431469837 -27.9403197244 +expect 4399349.482 -3578155.060 + +accept 50.7509056230 -27.8467488939 +expect 5649446.347 -3807241.841 + +accept 60.6370271381 -27.3001909011 +expect 6983544.451 -4006532.475 + +accept 70.8220482203 -26.5371650435 +expect 8516309.152 -4185254.482 + +accept 80.2959404087 -25.8737294352 +expect 10093881.725 -4297066.952 + +accept 90.1903848581 -25.5035070096 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.5725497895 -24.6749860350 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.0757522922 -23.8621044004 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.4910038636 -23.3154304481 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.4609905705 -22.3944602016 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6308884892 -22.1941484220 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.0358167607 -21.7789499055 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.5878069076 -21.7481812197 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.4050593367 -20.8432353205 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.6001699300 -20.8118177919 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.3361000782 -29.8463222037 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8999068245 -28.9429338477 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.7592377898 -28.1615925042 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.9913638701 -28.0372332017 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.2301202473 -27.0565876723 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.1268966632 -26.9865340393 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2460222852 -26.3197565889 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.2062914741 -26.1682287226 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9045914125 -25.7799438486 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.4037956256 -25.6991927518 +expect -11705355.483 -4359448.179 + +accept -79.8043265456 -25.1818797146 +expect -10024094.636 -4156724.889 + +accept -69.7140423873 -24.8449696747 +expect -8395540.010 -3863379.945 + +accept -59.0016643714 -23.9868520946 +expect -6856108.329 -3450250.183 + +accept -49.1644096637 -23.9073140300 +expect -5551692.748 -3211628.519 + +accept -39.4087456167 -23.3838764285 +expect -4359255.995 -2956380.419 + +accept -29.5780322984 -22.5310742645 +expect -3226303.975 -2709281.660 + +accept -19.4970507012 -21.7271569228 +expect -2106709.007 -2516125.488 + +accept -9.2309552615 -21.1686043260 +expect -992105.870 -2396128.627 + +accept 0.8151388636 -20.3765117338 +expect 87667.538 -2289827.020 + +accept 10.7150561883 -20.1052727537 +expect 1156777.413 -2278355.080 + +accept 20.3899871763 -20.0634670217 +expect 2218350.011 -2325602.798 + +accept 30.0598555833 -19.6984569649 +expect 3315266.258 -2366374.830 + +accept 40.9334924529 -18.8831525011 +expect 4616943.129 -2395016.592 + +accept 50.3705152580 -17.9548619999 +expect 5824857.949 -2409796.249 + +accept 60.7629076148 -17.7461797647 +expect 7240990.735 -2550212.531 + +accept 70.5049492221 -17.5449804169 +expect 8675560.230 -2678367.876 + +accept 80.3956836685 -17.4271102390 +expect 10234009.562 -2784279.451 + +accept 90.6808556357 -16.9481935094 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.3669156655 -16.2433923188 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.3790328662 -15.6932515137 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.0882522480 -15.6441029970 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.9326190128 -15.1072978015 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.4297399110 -14.7647959439 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.6670621082 -14.1800360544 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.3083279810 -13.5438931052 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.8801051896 -12.6909069291 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.9127621133 -11.7358777998 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.9634704329 -19.2242789077 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.1616383718 -18.5021923570 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.5989242161 -17.7569846767 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.7658699571 -17.6838689314 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.2283007229 -17.1203530837 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.9856069274 -16.5121558117 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.7066160149 -15.8271303941 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.0808307002 -15.7236132624 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.7051569128 -15.2351555878 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.3984343202 -14.2830109769 +expect -11714485.527 -2294583.435 + +accept -79.3161212354 -13.6551887362 +expect -10093909.091 -2148649.820 + +accept -69.3369852179 -13.5338940098 +expect -8554065.078 -2033627.111 + +accept -59.8017669014 -12.9486645585 +expect -7176185.386 -1835041.574 + +accept -49.8326118713 -12.2344952465 +expect -5830239.587 -1625964.636 + +accept -39.8183008451 -11.3212564171 +expect -4563020.124 -1417370.862 + +accept -29.4511324259 -11.1046029410 +expect -3315770.257 -1321269.119 + +accept -19.3421368019 -10.5209818176 +expect -2152759.066 -1206758.050 + +accept -9.7794195765 -10.4434857815 +expect -1080920.071 -1172971.439 + +accept 0.8324676722 -10.2027272199 +expect 91827.144 -1137551.112 + +accept 10.3172409138 -9.5930872101 +expect 1142198.103 -1077875.142 + +accept 20.7373198297 -8.6767624883 +expect 2317698.619 -998481.282 + +accept 30.8106039881 -8.1660651538 +expect 3491268.014 -975920.697 + +accept 40.2140519607 -7.4699626803 +expect 4637259.093 -935187.118 + +accept 50.8253614228 -6.9240926089 +expect 6003942.796 -922291.065 + +accept 60.3499171589 -6.7875741453 +expect 7307879.342 -959056.886 + +accept 70.7538618658 -6.4717900189 +expect 8823316.944 -969586.196 + +accept 80.1896127919 -6.1835665729 +expect 10268415.013 -962009.778 + +accept 90.2901075635 -5.6342271039 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.1017071129 -4.7732910406 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.6453720127 -4.6247740358 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.7065181706 -4.2131506322 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.0549243427 -3.6680122287 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.9588650575 -3.4693258990 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.3128054514 -2.8622073994 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.6250791828 -2.1132082532 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1249865639 -1.7779699685 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.4636820369 -1.0447468723 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.0903238876 -9.3809572676 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8021514554 -8.8200596604 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.6897632216 -8.8151211116 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3642571872 -7.9578518334 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.1869613409 -7.1376473645 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.8103143949 -6.6533639455 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.0042762894 -6.5424897944 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3222469320 -6.2626405858 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.2447484897 -5.4322064514 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.6583934020 -4.8520491055 +expect -11758391.270 -764820.107 + +accept -79.0822097483 -4.4980133305 +expect -10100660.047 -696260.990 + +accept -69.2589747329 -4.0562562622 +expect -8610130.179 -601975.105 + +accept -59.2607881882 -3.2433764780 +expect -7170184.717 -454392.257 + +accept -49.3268655448 -2.9707739252 +expect -5821746.865 -391509.219 + +accept -39.9159421567 -2.4973268139 +expect -4617029.524 -311670.569 + +accept -29.1976699326 -1.6650273067 +expect -3316547.033 -197263.637 + +accept -19.0027434133 -1.1195085022 +expect -2132221.527 -127924.555 + +accept -9.1234117067 -0.6240596549 +expect -1016591.323 -69833.247 + +accept 0.4677460038 0.2151624258 +expect 52011.067 23925.387 + +accept 10.7004848538 0.3165167866 +expect 1193291.206 35502.455 + +accept 20.1052099885 0.6126391439 +expect 2258534.300 70229.157 + +accept 30.3541137581 0.7990141229 +expect 3454411.853 95128.412 + +accept 40.7710878998 0.9567675855 +expect 4725772.464 119944.290 + +accept 50.7725952624 1.4294037508 +expect 6015746.643 189992.540 + +accept 60.5997615005 1.6613265138 +expect 7361750.248 234549.877 + +accept 70.4466727438 1.9824185118 +expect 8791561.281 295710.236 + +accept 80.4040420231 2.1516254056 +expect 10309233.052 333889.458 + +accept 90.0745563464 2.5008083079 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.1323994743 3.4798778581 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.7633392793 3.6524418056 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.4935453458 3.8138602324 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1832453461 4.1827817395 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6879708211 4.3228601350 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.2872780471 5.0096390922 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.4567844437 5.3289862640 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1798195714 5.7690110660 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.6237066153 6.6873727446 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.1879408995 0.2925675717 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8193242429 0.5456299185 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.6143094365 0.8491614798 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.1327424918 1.5360082778 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.9118046279 2.2304783506 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.0707848713 3.1774300866 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.0155367869 3.7108516861 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.7138958240 4.2367325538 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.7626123411 4.9489248449 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.0617378460 5.0261998535 +expect -11664192.229 792317.110 + +accept -79.6065498494 5.4925196315 +expect -10179589.971 852372.934 + +accept -69.7109936494 5.4974120433 +expect -8672018.782 818565.715 + +accept -59.3987361622 6.4168117979 +expect -7176296.816 901167.992 + +accept -49.6550438823 6.6122077057 +expect -5850898.508 874299.311 + +accept -39.5175223106 6.6442757043 +expect -4554622.398 828384.475 + +accept -29.9263368298 7.1910087068 +expect -3390376.767 855728.094 + +accept -19.6951353173 7.2342593616 +expect -2202778.650 829386.822 + +accept -9.3597241491 7.7249502728 +expect -1038303.808 866022.563 + +accept 0.9926766371 7.7430181007 +expect 109876.645 862359.585 + +accept 10.4808252097 7.8032784791 +expect 1163217.791 876306.606 + +accept 20.2149078300 8.7141462778 +expect 2257974.529 1001202.962 + +accept 30.6115985045 8.7806411209 +expect 3464879.027 1048739.004 + +accept 40.9406024668 9.0709137304 +expect 4718612.849 1141091.327 + +accept 50.2246468449 9.2715613620 +expect 5908642.815 1232215.612 + +accept 60.6212081762 10.1366134196 +expect 7321174.335 1439008.711 + +accept 70.0896353531 11.0850079977 +expect 8692101.993 1665083.891 + +accept 80.6785108917 11.6138802990 +expect 10322728.590 1826238.813 + +accept 90.9684446145 11.7088334392 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.8216260873 12.6522648050 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.9341322494 12.8091489452 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.9598573820 12.9840580805 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1838852888 13.9674113487 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.0163435591 14.2583869011 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.3440941987 15.1977215509 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.6373902313 15.9779535702 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.7489315029 16.0224553269 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.4315909707 16.2341190017 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.9613846400 10.9181102314 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.2464750707 11.2011582425 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.3961353214 12.0814824633 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.9176675016 12.1332225594 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.0300120770 12.7448426145 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.1479377942 13.2115900349 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.6509465671 13.5121287506 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3485953585 13.9838806488 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.8025484668 14.3000196702 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.6183447418 14.3419323455 +expect -11750225.007 2304558.947 + +accept -79.3692412058 14.8824779140 +expect -10092517.831 2350135.174 + +accept -69.8245239316 15.4247668791 +expect -8603644.646 2333402.982 + +accept -59.9411333586 16.1857250660 +expect -7151141.941 2307064.350 + +accept -49.5439751158 16.6663945754 +expect -5737011.937 2221425.397 + +accept -39.8565220229 16.7491842544 +expect -4513398.389 2106838.116 + +accept -29.0387587694 16.7636024414 +expect -3226356.467 1999372.842 + +accept -19.3072208645 17.5503784835 +expect -2114944.499 2022939.979 + +accept -9.7495596439 18.3236674818 +expect -1058075.992 2069782.832 + +accept 0.3372939259 19.1939757716 +expect 36418.336 2154300.403 + +accept 10.4541089513 19.4557925775 +expect 1130896.269 2202407.957 + +accept 20.3450540441 19.6776140317 +expect 2216235.240 2279684.922 + +accept 30.5262355523 20.1057317982 +expect 3364502.237 2421313.756 + +accept 40.6436957307 20.6888876489 +expect 4554114.195 2625171.436 + +accept 50.8390922621 21.5842676384 +expect 5818691.558 2921121.736 + +accept 60.4025168492 21.7910320981 +expect 7107138.574 3149887.076 + +accept 70.7863531388 22.4913165287 +expect 8622256.722 3492000.228 + +accept 80.2433369822 23.0164275848 +expect 10137749.549 3763259.969 + +accept 90.9377687408 23.1511733038 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.5407405945 23.7761284488 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.0059145808 24.0087396721 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.0839708022 24.8505061022 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.5684827033 25.5457759639 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.2735017629 25.7841586919 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.4960718541 26.4511385776 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.5086557650 26.5248940712 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1010951379 26.6437577891 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.4667032708 27.5171288037 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.2332673731 20.5208357556 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.9852102849 20.6884242583 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.0918834805 20.7807287727 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3554284700 21.5195488802 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.0517203599 22.3228377599 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7889045882 22.9579802676 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2864956877 23.1541372478 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.1249371549 23.9554652672 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.7886236408 24.2156608317 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.8158531726 24.4254617574 +expect -11779801.464 4109615.321 + +accept -79.1765040759 24.4730100405 +expect -9932163.575 4013012.232 + +accept -69.4905958240 25.3275320515 +expect -8347069.306 3939510.329 + +accept -59.3321746682 25.8062815391 +expect -6849836.851 3736718.987 + +accept -49.4529549960 26.7200008826 +expect -5517196.147 3613456.872 + +accept -39.1868721751 27.3024639669 +expect -4254482.013 3466079.063 + +accept -29.6354019373 27.4373224654 +expect -3161470.540 3320471.268 + +accept -19.1695661946 28.3567542308 +expect -2009357.470 3307900.622 + +accept -9.9833263319 28.6603499308 +expect -1037944.407 3278172.915 + +accept 0.5787958629 28.7930766257 +expect 59988.867 3269432.632 + +accept 10.1908900667 29.4473999043 +expect 1055041.336 3373090.240 + +accept 20.4711672585 29.9558795250 +expect 2129353.829 3515969.801 + +accept 30.8531334707 30.4060992834 +expect 3242994.151 3715442.228 + +accept 40.4755923878 31.2284502498 +expect 4307211.258 4017976.832 + +accept 50.0364462297 31.8692054690 +expect 5426487.569 4368373.509 + +accept 60.5819735012 32.1294434320 +expect 6785271.674 4776262.501 + +accept 70.8279928055 32.4558417273 +expect 8275156.713 5258027.307 + +accept 80.8754092571 33.4499285913 +expect 9965465.329 5886025.407 + +accept 90.9417476435 34.2241428842 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.8763555867 34.9730810876 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.3824336404 35.8924849218 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.3907138338 36.0772654252 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.2213236652 36.3411661168 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6643127929 37.0777875387 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.5696707234 38.0028546554 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.7330142926 38.8399381962 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.7575452122 39.6058463190 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.9074447347 39.7506383769 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.8967233384 30.5573004598 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.4186924041 30.7925389719 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.3550554816 31.7173298465 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3340973772 32.5661389704 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.8793305042 33.1451975000 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.0718020283 34.1077930148 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.3765659597 34.6652275838 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.7130644703 34.6829381126 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.5574458139 35.6024191831 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.7509673047 36.5904991465 +expect -11753853.356 6923417.921 + +accept -79.5569260283 36.6832637281 +expect -9529017.479 6583316.301 + +accept -69.4216766587 36.7592109391 +expect -7793705.647 6002236.199 + +accept -59.8993383836 36.9575776083 +expect -6439637.617 5535272.788 + +accept -49.2671447978 37.9494837339 +expect -5077618.232 5232434.984 + +accept -39.6598693615 38.9483055378 +expect -3963735.765 5050631.148 + +accept -29.7093809090 39.1622288957 +expect -2917074.123 4828275.833 + +accept -19.9357360497 39.2854809247 +expect -1934827.091 4674852.040 + +accept -9.5411208555 39.4087263276 +expect -919053.532 4586404.063 + +accept 0.8211876318 39.4440823975 +expect 78929.176 4560557.981 + +accept 10.4970331716 40.3224517995 +expect 1003036.028 4707596.187 + +accept 20.6917357286 40.5466917960 +expect 1985755.247 4847003.414 + +accept 30.0757101328 40.6533776922 +expect 2912090.233 5033105.330 + +accept 40.4799159627 40.9888819952 +expect 3968966.207 5358999.089 + +accept 50.8203716780 41.3416456225 +expect 5074769.526 5800574.001 + +accept 60.6789776888 42.2933132797 +expect 6163689.909 6459786.753 + +accept 70.4598227375 42.9662236851 +expect 7378970.615 7275378.446 + +accept 80.5212319721 43.4298814980 +expect 8945156.756 8415826.102 + +accept 90.6029060873 44.3367368198 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.2968163089 44.7347899226 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5453757907 45.2325884903 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.7132187645 46.1810408682 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.6036848279 46.5953112427 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.8567165951 47.1100600825 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.2452206431 47.5590007593 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.4264735249 47.6243197261 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.1158223427 47.9911994181 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.2100320112 48.9423016681 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.5621188253 40.3822966969 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.0785389235 40.7397870392 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9453288766 41.0637989828 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.0072837113 41.2595851413 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.3677527689 41.6743754043 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.1116359654 41.9054883189 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2367048985 42.7084205060 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.9662473469 42.7707453425 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.5437449083 43.0239640060 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.4757325990 43.2756199739 +expect -11568961.170 9589089.555 + +accept -79.0930156514 43.3605739941 +expect -8689821.361 8221563.160 + +accept -69.6623710654 43.7575713592 +expect -7176557.127 7359145.048 + +accept -59.8551383188 44.0946182610 +expect -5913531.749 6705033.126 + +accept -49.6085838009 44.4913127126 +expect -4748242.269 6215794.411 + +accept -39.1320462959 45.2007809057 +expect -3641766.743 5902607.826 + +accept -29.9547583046 46.1598354389 +expect -2721962.231 5767450.222 + +accept -19.6901625335 47.0694221597 +expect -1753442.745 5682225.919 + +accept -9.5530275863 47.7859862485 +expect -838921.885 5658994.019 + +accept 0.0222239630 47.9106126700 +expect 1945.836 5639486.547 + +accept 10.3786030568 48.2669975286 +expect 905735.036 5728642.671 + +accept 20.3163155558 49.0365488340 +expect 1761298.591 5954059.585 + +accept 30.0523609099 49.2604161517 +expect 2613977.300 6191207.840 + +accept 40.2733019916 49.6471765112 +expect 3515610.607 6567126.763 + +accept 50.6235974778 49.9195971337 +expect 4454811.565 7067214.001 + +accept 60.0640817595 50.7570760574 +expect 5269948.907 7769377.867 + +accept 70.2894928952 51.6926294743 +expect 6110607.979 8783958.836 + +accept 80.7661690288 51.9879378395 +expect 6957594.499 10145750.592 + +accept 90.2760527960 52.6279152662 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.4470132582 53.2519801847 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.1282829759 53.4607562483 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.5033443580 53.9989335755 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.6561885293 54.6823982531 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.8127091472 54.7255186711 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.0054753699 55.4459165788 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.8312787949 56.2470115579 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.4614439985 57.0241073917 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.7047485406 57.6022388310 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.1586219943 50.1365490236 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.1490260788 50.5023613434 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9535088204 50.9035428509 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.0803324654 51.7753015653 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.7669273536 52.0799612604 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.3599142098 52.6974765371 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.6940989810 52.7976100393 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.7805542206 53.6394720461 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9951721199 54.3490528856 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.4965032257 55.2735286995 +expect -6404341.484 11736182.738 + +accept -79.2351509797 56.0182014529 +expect -5919230.308 10347709.180 + +accept -69.2279142296 57.0024522025 +expect -5142475.359 9389304.843 + +accept -59.7270769476 57.4201565369 +expect -4433291.933 8686026.154 + +accept -49.4089463064 57.7914752628 +expect -3650409.699 8117631.819 + +accept -39.6433533072 58.1804486015 +expect -2906321.369 7735544.810 + +accept -29.8165100218 58.5388210940 +expect -2168952.954 7465348.952 + +accept -19.0157349252 58.9403079367 +expect -1370812.070 7285860.519 + +accept -9.1047501907 59.4124031484 +expect -649264.745 7231297.403 + +accept 0.8510548344 60.1631637832 +expect 59614.314 7301680.904 + +accept 10.7118819188 60.6049338062 +expect 741931.784 7412559.974 + +accept 20.4398525342 61.3600300433 +expect 1386377.568 7649843.890 + +accept 30.3017880976 62.2930069600 +expect 1995284.860 8001431.858 + +accept 40.2742910491 62.4260882546 +expect 2622736.428 8340981.454 + +accept 50.1679836632 63.3416128275 +expect 3130090.680 8886842.807 + +accept 60.1315518295 64.0854342654 +expect 3566294.596 9516574.314 + +accept 70.2671672611 64.9885817623 +expect 3854824.970 10266355.614 + +accept 80.0566574740 65.2466871256 +expect 4076741.126 11011949.460 + +accept 90.0598623933 65.7380193724 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.2499385302 65.8274446207 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.0091445253 66.5841928232 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.1938557094 67.3045114589 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.1756983494 67.6825233842 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.0774508004 68.5260112188 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.3642244888 69.0087889372 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.0390197585 69.5064813197 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.9882511230 69.9663419458 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.7855662108 70.7558001565 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.8630282894 60.2684905661 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.8774561096 60.7063957678 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.1639611249 61.1269337981 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.0814548820 61.9063878006 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.0476545160 62.7911475081 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.8276916999 62.8515546512 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.9464541970 63.7277849393 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.6864148265 63.9317823343 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.4184495170 64.2249537529 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.6146334566 64.3967878406 +expect -4340586.273 11779220.401 + +accept -79.8288741622 64.8985190713 +expect -4137365.737 10977840.319 + +accept -69.3484116496 65.6222831765 +expect -3718954.598 10255930.505 + +accept -59.0699348251 66.3652733965 +expect -3206977.816 9703730.126 + +accept -49.7020758778 66.6389497206 +expect -2744067.651 9275193.520 + +accept -39.0292679218 66.7793834162 +expect -2190174.896 8881394.899 + +accept -29.9077443640 67.3270538543 +expect -1664513.475 8692728.991 + +accept -19.0042693882 67.9048158312 +expect -1045199.569 8559031.056 + +accept -9.5338704651 68.3771424633 +expect -517496.904 8521368.334 + +accept 0.2238591227 69.2477228904 +expect 11757.034 8614778.137 + +accept 10.2978890619 69.7426835928 +expect 528603.064 8728166.019 + +accept 20.2917095900 70.1793788385 +expect 1014867.798 8907115.689 + +accept 30.9719421826 70.5868181503 +expect 1499411.306 9170515.903 + +accept 40.5524514587 71.5715697583 +expect 1833434.912 9555789.645 + +accept 50.3484489213 71.8505547121 +expect 2175943.593 9913399.521 + +accept 60.1086300862 72.0684099625 +expect 2460956.915 10322590.056 + +accept 70.6228216997 73.0662960367 +expect 2561247.727 10868246.628 + +accept 80.5645741906 73.7542661119 +expect 2585249.402 11363593.076 + +accept 90.6177784757 74.6865930919 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.2695381559 74.9397012116 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.3724185381 75.3340827987 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.0440856622 75.6509550283 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.4765915697 75.8794035471 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.8273607225 76.0863350217 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.7446122566 76.4130503173 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.9066279973 77.2046671411 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.7039755420 77.5254695021 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.7301487821 78.3643690894 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.8424303971 70.7640164273 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.3071682617 71.3534426809 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9256766432 72.0788134529 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.4389257633 72.9048071827 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.4466193836 73.7144086150 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.4240513471 74.3140345936 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2324314226 75.1789245938 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.4080456874 75.9740320316 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9624349535 76.7254677659 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.8454838458 77.0914030368 +expect -2065538.883 11806583.302 + +accept -79.3200173559 77.5923156814 +expect -1944930.535 11436411.248 + +accept -69.2214782512 77.6455638940 +expect -1833901.665 11099482.695 + +accept -59.3345608489 77.6726989114 +expect -1672461.604 10796813.087 + +accept -49.4571426800 77.9149250146 +expect -1437767.183 10554465.582 + +accept -39.0382734207 78.6675565544 +expect -1110318.758 10416013.135 + +accept -29.1097584433 78.7699850319 +expect -845013.962 10265588.005 + +accept -19.0735922396 78.8979558943 +expect -558786.152 10166121.532 + +accept -9.0280312502 79.8097469605 +expect -246483.187 10236709.513 + +accept 0.5580111982 79.8802703269 +expect 15185.199 10229124.254 + +accept 10.8112184284 80.0989872186 +expect 286673.574 10288907.138 + +accept 20.1411665329 80.3961610028 +expect 512145.694 10396401.075 + +accept 30.8632607000 81.0343489380 +expect 716121.219 10599328.302 + +accept 40.5566028935 81.1124451300 +expect 903295.715 10744008.638 + +accept 50.8831926047 81.3748819436 +expect 1050654.228 10948141.605 + +accept 60.0527293155 81.6666268419 +expect 1137426.454 11149953.262 + +accept 70.4854280716 82.6250504715 +expect 1097137.468 11420195.697 + +accept 80.6482540792 83.6156947131 +expect 994412.198 11647508.801 + +accept 90.5789951029 84.1124942551 +expect failure errno coord_transfm_outside_projection_domain + +accept 100.9443622402 84.2131541284 +expect failure errno coord_transfm_outside_projection_domain + +accept 110.5781783058 84.7127066970 +expect failure errno coord_transfm_outside_projection_domain + +accept 120.6025664533 85.5661224284 +expect failure errno coord_transfm_outside_projection_domain + +accept 130.0976840056 86.3318417998 +expect failure errno coord_transfm_outside_projection_domain + +accept 140.6428111911 86.3329325553 +expect failure errno coord_transfm_outside_projection_domain + +accept 150.5251209004 86.5841388479 +expect failure errno coord_transfm_outside_projection_domain + +accept 160.4225603060 86.8828039057 +expect failure errno coord_transfm_outside_projection_domain + +accept 170.2581319411 87.4171568183 +expect failure errno coord_transfm_outside_projection_domain + +accept 180.2641439484 88.1608036446 +expect failure errno coord_transfm_outside_projection_domain + +accept -179.8401984185 80.4164439367 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.6918872432 81.0641431423 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.9211815920 81.7949103274 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.6075138921 82.1028453149 +expect failure errno coord_transfm_outside_projection_domain + +accept -139.7372920424 82.6385276754 +expect failure errno coord_transfm_outside_projection_domain + +accept -129.7998353504 83.1090136759 +expect failure errno coord_transfm_outside_projection_domain + +accept -119.2572393635 83.4744235117 +expect failure errno coord_transfm_outside_projection_domain + +accept -109.3246360912 84.2608342272 +expect failure errno coord_transfm_outside_projection_domain + +accept -99.9601976700 84.4677069243 +expect failure errno coord_transfm_outside_projection_domain + +accept -89.7505869053 85.0897168462 +expect -774050.983 11808922.435 + +accept -79.8910338348 85.9672408001 +expect -625258.031 11700550.054 + +accept -69.1554779909 86.8865771916 +expect -457830.975 11637725.026 + +accept -59.6158025559 87.0075919956 +expect -406020.652 11573918.187 + +accept -49.5091296711 87.2889393354 +expect -324158.396 11535225.643 + +accept -39.6799799687 87.3973978464 +expect -261177.241 11497165.712 + +accept -29.0273299961 87.9089486985 +expect -159462.940 11524757.163 + +accept -19.1380418786 88.8203526189 +expect -60802.011 11637057.505 + +accept -9.0084093906 88.8893310433 +expect -27340.998 11639811.223 + +accept 0.0213854656 89.1326873925 +expect 50.899 11675921.557 + +accept 10.6007672189 89.4603893825 +expect 15609.535 11728897.894 + +accept 20.8972133561 90.3008662748 +expect failure errno coord_transfm_invalid_coord + +accept 30.3236847010 90.9360697392 +expect failure errno coord_transfm_invalid_coord + +accept 40.5211596030 91.7425546179 +expect failure errno coord_transfm_invalid_coord + +accept 50.9530657025 92.7167872262 +expect failure errno coord_transfm_invalid_coord + +accept 60.2966089164 93.5518747322 +expect failure errno coord_transfm_invalid_coord + +accept 70.7058277145 93.9478756274 +expect failure errno coord_transfm_invalid_coord + +accept 80.2842419408 94.5029189079 +expect failure errno coord_transfm_invalid_coord + +accept 90.7046514943 94.5870657217 +expect failure errno coord_transfm_invalid_coord + +accept 100.5757828394 94.7544968060 +expect failure errno coord_transfm_invalid_coord + +accept 110.0784957493 95.6326996288 +expect failure errno coord_transfm_invalid_coord + +accept 120.4420696450 95.7426558832 +expect failure errno coord_transfm_invalid_coord + +accept 130.0586467430 96.7026620164 +expect failure errno coord_transfm_invalid_coord + +accept 140.4982918026 97.2453640881 +expect failure errno coord_transfm_invalid_coord + +accept 150.5137836610 97.2825819689 +expect failure errno coord_transfm_invalid_coord + +accept 160.8117951323 97.8473653755 +expect failure errno coord_transfm_invalid_coord + +accept 170.3402740510 98.3587698302 +expect failure errno coord_transfm_invalid_coord + +accept 180.9378053935 98.8743871260 +expect failure errno coord_transfm_invalid_coord + +accept -179.1153600127 89.6136396944 +expect failure errno coord_transfm_outside_projection_domain + +accept -169.2261536485 89.9072554901 +expect failure errno coord_transfm_outside_projection_domain + +accept -159.1164133392 89.9075872145 +expect failure errno coord_transfm_outside_projection_domain + +accept -149.3960866375 90.6652890542 +expect failure errno coord_transfm_invalid_coord + +accept -139.1720109722 91.2726639403 +expect failure errno coord_transfm_invalid_coord + +accept -129.0729383513 91.6124307897 +expect failure errno coord_transfm_invalid_coord + +accept -119.9896731679 92.3534538297 +expect failure errno coord_transfm_invalid_coord + +accept -109.8793121665 92.7446796075 +expect failure errno coord_transfm_invalid_coord + +accept -99.4084806305 92.8846710223 +expect failure errno coord_transfm_invalid_coord + +accept -89.0674703286 93.0281709121 +expect failure errno coord_transfm_invalid_coord + +accept -79.1149414160 93.4632295476 +expect failure errno coord_transfm_invalid_coord + +accept -69.5261517902 94.2811379653 +expect failure errno coord_transfm_invalid_coord + +accept -59.0417407292 95.2403005497 +expect failure errno coord_transfm_invalid_coord + +accept -49.3488539326 95.3977809221 +expect failure errno coord_transfm_invalid_coord + +accept -39.5548627592 96.1026759897 +expect failure errno coord_transfm_invalid_coord + +accept -29.0476034815 96.4820442045 +expect failure errno coord_transfm_invalid_coord + +accept -19.8278954645 96.7461121139 +expect failure errno coord_transfm_invalid_coord + +accept -9.5488366916 97.4860281314 +expect failure errno coord_transfm_invalid_coord + +accept 0.2307496667 97.5054708483 +expect failure errno coord_transfm_invalid_coord + +accept 10.6032378382 97.7247157965 +expect failure errno coord_transfm_invalid_coord + +accept 20.8959156966 98.0573474237 +expect failure errno coord_transfm_invalid_coord + +accept 30.7104889319 98.5114024172 +expect failure errno coord_transfm_invalid_coord + +accept 40.1762654017 98.8114138429 +expect failure errno coord_transfm_invalid_coord + +accept 50.8420835837 99.5737438963 +expect failure errno coord_transfm_invalid_coord + +accept 60.4391516649 99.6023781174 +expect failure errno coord_transfm_invalid_coord + +accept 70.3833096116 99.8129052911 +expect failure errno coord_transfm_invalid_coord + +accept 80.6796681432 100.7784977140 +expect failure errno coord_transfm_invalid_coord + +accept 90.8893235311 100.9639616716 +expect failure errno coord_transfm_invalid_coord + +accept 100.8499388037 101.2529844461 +expect failure errno coord_transfm_invalid_coord + +accept 110.5488903609 101.9706798836 +expect failure errno coord_transfm_invalid_coord + +accept 120.1208651509 102.2817021553 +expect failure errno coord_transfm_invalid_coord + +accept 130.1003249085 102.6010355936 +expect failure errno coord_transfm_invalid_coord + +accept 140.8624898562 102.6311753718 +expect failure errno coord_transfm_invalid_coord + +accept 150.3852952852 103.0749738073 +expect failure errno coord_transfm_invalid_coord + +accept 160.7214099599 103.8391207142 +expect failure errno coord_transfm_invalid_coord + +accept 170.6439119665 104.6357199780 +expect failure errno coord_transfm_invalid_coord + +accept 180.2173889904 105.2754168153 +expect failure errno coord_transfm_invalid_coord +------------------------------------------------------------ + +------------------------------------------------------------ +operation +proj=guyou +R=1 +tolerance 1 mm +------------------------------------------------------------ + +accept 0 90 +expect 0 1.85407 + +accept 0 -90 +expect 0 -1.85407 +------------------------------------------------------------ + + diff --git a/conformance/src/test/resources/gie/more_builtins.gie b/conformance/src/test/resources/gie/more_builtins.gie new file mode 100644 index 0000000..69d01c1 --- /dev/null +++ b/conformance/src/test/resources/gie/more_builtins.gie @@ -0,0 +1,1045 @@ +=============================================================================== + +Various test material, mostly converted from selftest entries in PJ_xxx.c + +Contrary to the material in builtins.gie, this material is handwritten and +intends to exercise corner cases. + +=============================================================================== + + + + +------------------------------------------------------------------------------- +# Two ob_tran tests from data/testvarious +------------------------------------------------------------------------------- +operation +proj=ob_tran +o_proj=moll +R=6378137.0 +o_lon_p=0 +o_lat_p=0 +lon_0=180 +------------------------------------------------------------------------------- +tolerance 1 mm +direction inverse + +accept 300000 400000 +expect -42.7562158333 85.5911341667 + +direction forward + +accept 10 20 +expect -1384841.18787 7581707.88240 +------------------------------------------------------------------------------- + + + + + +------------------------------------------------------------------------------- +# Two tests from PJ_molodensky.c +------------------------------------------------------------------------------- +operation proj=molodensky a=6378160 rf=298.25 \ + da=-23 df=-8.120449e-8 dx=-134 dy=-48 dz=149 \ + abridged +------------------------------------------------------------------------------- +tolerance 2 m + +accept 144.9667 -37.8 50 0 +expect 144.968 -37.79848 46.378 0 + +roundtrip 100 1 m +------------------------------------------------------------------------------- +# Same thing once more, but this time unabridged +------------------------------------------------------------------------------- +operation proj=molodensky a=6378160 rf=298.25 \ + da=-23 df=-8.120449e-8 dx=-134 dy=-48 dz=149 +------------------------------------------------------------------------------- +tolerance 2 m + +accept 144.9667 -37.8 50 0 +expect 144.968 -37.79848 46.378 0 + +roundtrip 100 1 m +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +# Molodensky with all 0 parameters +------------------------------------------------------------------------------- +operation proj=molodensky a=6378160 rf=298.25 \ + da=0 df=0 dx=0 dy=0 dz=0 +------------------------------------------------------------------------------- +tolerance 1 mm + +accept 144.9667 -37.8 50 0 +expect 144.9667 -37.8 50 0 + +roundtrip 1 +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +# Test error cases of molodensky +------------------------------------------------------------------------------- +# No arguments +operation proj=molodensky a=6378160 rf=298.25 +expect failure errno invalid_op_missing_arg + +# Missing arguments +operation proj=molodensky a=6378160 rf=298.25 dx=0 +expect failure errno invalid_op_missing_arg + + +------------------------------------------------------------------------------- +# Tests for PJ_bertin1953.c +------------------------------------------------------------------------------- +operation proj=bertin1953 +R=1 +------------------------------------------------------------------------------- +accept 0 0 +expect -0.260206554508 -0.685226058142 + +accept 16.5 42 +expect 0.0 0.0 + +accept -180 90 +expect 0.0 0.813473286152 + +accept 0 90 +expect 0.0 0.813473286152 + +accept 10 -35 +expect -0.138495501548 -1.221408328101 + +accept -70 -35 +expect -1.504967424950 -0.522846035499 + +accept 80 7 +expect 0.929377425352 -0.215443296201 + +accept 128 35 +expect 0.920230566844 0.713170409026 + +accept 170 -41 +expect 2.162845830414 -0.046534568425 + +------------------------------------------------------------------------------- + + + + + +------------------------------------------------------------------------------- +# Some tests from PJ_pipeline.c +------------------------------------------------------------------------------- +# Forward-reverse geo->utm->geo (4D functions) +------------------------------------------------------------------------------- +operation proj=pipeline zone=32 step \ + proj=utm ellps=GRS80 step \ + proj=utm ellps=GRS80 inv +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept 12 55 0 0 +expect 12 55 0 0 + +# Now the inverse direction (still same result: the pipeline is symmetrical) + +direction inverse +expect 12 55 0 0 +------------------------------------------------------------------------------- +# And now the back-to-back situation utm->geo->utm (4D functions) +------------------------------------------------------------------------------- +operation proj=pipeline zone=32 ellps=GRS80 step \ + proj=utm inv step \ + proj=utm +------------------------------------------------------------------------------- +accept 691875.63214 6098907.82501 0 0 +expect 691875.63214 6098907.82501 0 0 +direction inverse +expect 691875.63214 6098907.82501 0 0 +------------------------------------------------------------------------------- +# Forward-reverse geo->utm->geo (3D functions) +------------------------------------------------------------------------------- +operation proj=pipeline zone=32 step \ + proj=utm ellps=GRS80 step \ + proj=utm ellps=GRS80 inv +------------------------------------------------------------------------------- +tolerance 0.1 mm + +accept 12 55 0 +expect 12 55 0 + +# Now the inverse direction (still same result: the pipeline is symmetrical) + +direction inverse +expect 12 55 0 +------------------------------------------------------------------------------- +# And now the back-to-back situation utm->geo->utm (3D functions) +------------------------------------------------------------------------------- +operation proj=pipeline zone=32 ellps=GRS80 step \ + proj=utm inv step \ + proj=utm +------------------------------------------------------------------------------- +accept 691875.63214 6098907.82501 0 +expect 691875.63214 6098907.82501 0 +direction inverse +expect 691875.63214 6098907.82501 0 +------------------------------------------------------------------------------- +# Test a corner case: A rather pointless one-step pipeline geo->utm +------------------------------------------------------------------------------- +operation proj=pipeline step proj=utm zone=32 ellps=GRS80 +------------------------------------------------------------------------------- +accept 12 55 0 0 +expect 691875.63214 6098907.82501 0 0 +direction inverse +accept 691875.63214 6098907.82501 0 0 +expect 12 55 0 0 +------------------------------------------------------------------------------- +# Finally test a pipeline with more than one init step +------------------------------------------------------------------------------- +use_proj4_init_rules true +operation proj=pipeline \ + step init=epsg:25832 inv \ + step init=epsg:25833 \ + step init=epsg:25833 inv \ + step init=epsg:25832 +------------------------------------------------------------------------------- +accept 691875.63214 6098907.82501 0 0 +expect 691875.63214 6098907.82501 0 0 +direction inverse +accept 12 55 0 0 +expect 12 55 0 0 +------------------------------------------------------------------------------- +# Test a few inversion scenarios (urm5 has no inverse operation) +------------------------------------------------------------------------------- +operation proj=pipeline step \ + proj=urm5 n=0.5 inv +expect failure pjd_err_malformed_pipeline + +operation proj=pipeline inv step \ + proj=urm5 n=0.5 +expect failure pjd_err_malformed_pipeline + +operation proj=pipeline inv step \ + proj=urm5 n=0.5 ellps=WGS84 inv +accept 12 56 +expect 1215663.2814182492 5452209.5424045017 + +operation proj=pipeline step \ + proj=urm5 ellps=WGS84 n=0.5 +accept 12 56 +expect 1215663.2814182492 5452209.5424045017 +------------------------------------------------------------------------------- +# Test various failing scenarios. +------------------------------------------------------------------------------- +operation proj=pipeline step \ + proj=pipeline step \ + proj=merc +expect failure pjd_err_malformed_pipeline + +operation step proj=pipeline step proj=merc +expect failure pjd_err_malformed_pipeline + +operation proj=pipeline +expect failure pjd_err_malformed_pipeline + + +------------------------------------------------------------------------------- +# Some tests from PJ_vgridshift.c +------------------------------------------------------------------------------- +operation proj=vgridshift grids=egm96_15.gtx ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 1 cm +accept 12.5 55.5 0 0 +expect 12.5 55.5 -36.394090697 0 + +accept -180.1 0 0 +expect -180.1 0 -20.835222268 + +accept 179.9 0 0 +expect 179.9 0 -20.835222268 + +accept 180 0 0 +expect 180 0 -20.756538510 + +accept 540 0 0 +expect 540 0 -20.756538510 + +accept -180 0 0 +expect -180 0 -20.756538510 + +accept -540 0 0 +expect -540 0 -20.756538510 + +roundtrip 100 1 nm +------------------------------------------------------------------------------- +# Fail on purpose: +grids parameter is mandatory +operation proj=vgridshift +expect failure errno invalid_op_missing_arg + +# Fail on purpose: open non-existing grid +operation proj=vgridshift grids=nonexistinggrid.gtx +expect failure errno invalid_op_file_not_found_or_invalid +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation proj=vgridshift grids=egm96_15.gtx ellps=GRS80 multiplier=0.1 +tolerance 15 cm +accept 12.5 55.5 0 0 +expect 12.5 55.5 3.6021305084228516 0 + +------------------------------------------------------------------------------- +# Some tests from PJ_hgridshift.c +------------------------------------------------------------------------------- +operation proj=hgridshift +grids=ntf_r93.gsb ellps=GRS80 +------------------------------------------------------------------------------- +tolerance 1 mm +accept 2.250704350387 46.500051597273 +expect 2.25 46.5 +direction inverse +accept 2.25 46.5 +expect 2.250704350387 46.500051597273 +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +# Fail on purpose: open non-existing grid: +operation proj=hgridshift grids=@nonexistinggrid.gsb,anothernonexistinggrid.gsb +expect failure errno invalid_op_file_not_found_or_invalid + +# Fail on purpose: +grids parameter is mandatory: +operation proj=hgridshift +expect failure errno invalid_op_missing_arg +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +# Tests for LCC 2SP Michigan (from PJ_lcc.c) +------------------------------------------------------------------------------- +# This test is taken from EPSG guidance note 7-2 (version 54, August 2018, +# page 25) +------------------------------------------------------------------------------- +operation +proj=lcc +ellps=clrk66 +lat_1=44d11'N +lat_2=45d42'N +x_0=609601.2192 +lon_0=84d20'W +lat_0=43d19'N +k_0=1.0000382 +units=us-ft +------------------------------------------------------------------------------- +tolerance 5 mm +accept 83d10'W 43d45'N +expect 2308335.75 160210.48 + +direction inverse +accept 2308335.75 160210.48 +expect 83d10'W 43d45'N +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# A number of tests from PJ_helmert.c +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# This example is from Lotti Jivall: "Simplified transformations from +# ITRF2008/IGS08 to ETRS89 for maritime applications" +------------------------------------------------------------------------------- +operation proj=helmert convention=coordinate_frame \ + x=0.67678 y=0.65495 z=-0.52827 \ + rx=-0.022742 ry=0.012667 rz=0.022704 s=-0.01070 +------------------------------------------------------------------------------- +tolerance 1 um +accept 3565285.00000000 855949.00000000 5201383.00000000 +expect 3565285.41342351 855948.67986759 5201382.72939791 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# This example is a random point, transformed from ED50 to ETRS89 using KMStrans2 +------------------------------------------------------------------------------- +operation proj=helmert exact convention=coordinate_frame \ + x=-081.0703 rx=-0.48488 \ + y=-089.3603 ry=-0.02436 \ + z=-115.7526 rz=-0.41321 s=-0.540645 +------------------------------------------------------------------------------- +tolerance 1 um +accept 3494994.30120000 1056601.97250000 5212382.16660000 +expect 3494909.84026368 1056506.78938633 5212265.66699761 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# This example is a coordinate from the geodetic observatory in Onsala, +# Sweden transformed from ITRF2000 @ 2017.0 to ITRF93 @ 2017.0. + +# The test coordinate was transformed using GNSStrans, using transformation +# parameters published by ITRF: ftp://itrf.ensg.ign.fr/pub/itrf/ITRF.TP +------------------------------------------------------------------------------- +operation proj=helmert convention=position_vector \ + x = 0.0127 dx = -0.0029 rx = -0.00039 drx = -0.00011 \ + y = 0.0065 dy = -0.0002 ry = 0.00080 dry = -0.00019 \ + z = -0.0209 dz = -0.0006 rz = -0.00114 drz = 0.00007 \ + s = 0.00195 ds = 0.00001 t_epoch = 1988.0 +------------------------------------------------------------------------------- +tolerance 0.03 mm +accept 3370658.37800 711877.31400 5349787.08600 2017.0 # ITRF2000@2017.0 +expect 3370658.18890 711877.42370 5349787.12430 2017.0 # ITRF93@2017.0 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# This example is from "A mathematical relationship between NAD27 and NAD83 (91) +# State Plane coordinates in Southeastern Wisconsin": +# http://www.sewrpc.org/SEWRPCFiles/Publications/TechRep/tr-034-Mathematical-Relationship-Between-NAD27-and-NAD83-91-State-Plane-Coordinates-Southeastern-Wisconsin.pdf + +# The test data is taken from p. 29. Here we are using point 203 and converting it +# from NAD27 (ft) -> NAD83 (m). The paper reports a difference of 0.0014 m from +# measured to computed coordinates, hence the test tolerance is set accordingly. +------------------------------------------------------------------------------- +operation proj=helmert \ + x=-9597.3572 y=.6112 \ + s=0.304794780637 theta=-1.244048 +------------------------------------------------------------------------------- +tolerance 1 mm +accept 2546506.957 542256.609 0 +expect 766563.675 165282.277 0 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Finally test the 4D-capabilities of the proj.h API, especially that the +# rotation matrix is updated when necessary. + +# Test coordinates from GNSStrans. +------------------------------------------------------------------------------- +operation proj=helmert convention=position_vector \ + x = 0.01270 dx =-0.0029 rx =-0.00039 drx =-0.00011 \ + y = 0.00650 dy =-0.0002 ry = 0.00080 dry =-0.00019 \ + z =-0.0209 dz =-0.0006 rz =-0.00114 drz = 0.00007 \ + s = 0.00195 ds = 0.00001 \ + t_epoch=1988.0 +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 3370658.378 711877.314 5349787.086 2017.0 +expect 3370658.18890 711877.42370 5349787.12430 2017.0 +accept 3370658.378 711877.314 5349787.086 2018.0 +expect 3370658.18087 711877.42750 5349787.12648 2018.0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test case of https://github.com/OSGeo/PROJ/issues/2333 +------------------------------------------------------------------------------- +operation +proj=helmert +x=-0.0019 +y=-0.0017 +z=-0.0105 +s=0.00134 \ + +dx=0.0001 +dy=0.0001 +dz=-0.0018 +ds=0.00008 +t_epoch=2000.0 \ + +convention=position_vector +------------------------------------------------------------------------------- +tolerance 0.1 mm +accept 3513638.1938 778956.4525 5248216.4690 2008.75 +expect 3513638.1999 778956.4533 5248216.4535 2008.75 +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Test error cases of helmert +------------------------------------------------------------------------------- +# A rotational term implies an explicit convention to be specified +operation proj=helmert rx=1 +expect failure errno invalid_op_missing_arg + +operation proj=helmert rx=1 convention=foo +expect failure errno invalid_op_illegal_arg_value + +operation proj=helmert rx=1 convention=1 +expect failure errno invalid_op_illegal_arg_value + +# towgs84 in helmert context should always be position_vector +operation proj=helmert towgs84=1,2,3,4,5,6,7 convention=coordinate_frame +expect failure errno invalid_op_illegal_arg_value + +# Transpose no longer accepted +operation proj=helmert transpose +expect failure errno invalid_op_illegal_arg_value + +# Use of 2D Helmert interface with 3D Helmert setup +operation +proj=ob_tran +o_proj=helmert +o_lat_p=0 +direction inverse +accept 0 0 +expect failure errno no_inverse_op + +------------------------------------------------------------------------------- +# Molodensky-Badekas from IOGP Guidance 7.2, Transformation from La Canoa to REGVEN +# between geographic 2D coordinate reference systems (EPSG Dataset transformation code 1771). +# Here just taking the Cartesian step of the transformation. +------------------------------------------------------------------------------- +operation proj=molobadekas convention=coordinate_frame \ + x=-270.933 y=115.599 z=-360.226 rx=-5.266 ry=-1.238 rz=2.381 \ + s=-5.109 px=2464351.59 py=-5783466.61 pz=974809.81 +------------------------------------------------------------------------------- +tolerance 1 cm +roundtrip 1 +accept 2550408.96 -5749912.26 1054891.11 +expect 2550138.45 -5749799.87 1054530.82 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test error cases of molobadekas +------------------------------------------------------------------------------- + +# Missing convention +operation proj=molobadekas +expect failure errno invalid_op_missing_arg + + +------------------------------------------------------------------------------- +# geocentric latitude +------------------------------------------------------------------------------- +operation proj=geoc ellps=GRS80 +accept 12 55 0 0 +expect 12 54.818973308324573 0 0 +roundtrip 1000 + +accept 12 90 0 0 +expect 12 90 0 0 + +accept 12 -90 0 0 +expect 12 -90 0 0 + +accept 12 89.99999999999 0 0 +expect 12 89.999999999989996 0 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# geocentric latitude using old +geoc flag +------------------------------------------------------------------------------- +operation proj=pipeline step proj=longlat ellps=GRS80 geoc inv +accept 12 55 0 0 +expect 12 54.818973308324573 0 0 +roundtrip 1 +------------------------------------------------------------------------------- + + + +------------------------------------------------------------------------------- +# some less used options +------------------------------------------------------------------------------- +operation proj=utm ellps=GRS80 zone=32 to_meter=0 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm ellps=GRS80 zone=32 to_meter=10 +accept 12 55 +expect 69187.5632 609890.7825 + +operation proj=utm ellps=GRS80 zone=32 to_meter=1/0 +expect failure errno invalid_op_illegal_arg_value + +operation proj=utm ellps=GRS80 zone=32 to_meter=2.0/0.2 +accept 12 55 +expect 69187.5632 609890.7825 + +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test that gie can read DMS style coordinates as well as coordinates where _ +# is used as a thousands separator. +------------------------------------------------------------------------------- +operation +step +proj=latlong +ellps=WGS84 +------------------------------------------------------------------------------- +tolerance 1 m + +accept -64d43'75.34 17d32'45.6 +expect -64.737589 17.546000 + +accept 164d43'75.34 17d32'45.6 +expect 164.737589 17.546000 + +accept 164d43'75.34 17d32'45.6 +expect 164d43'75.34 17d32'45.6 + +accept 164d43'75.34W 17d32'45.6S +expect -164.737589 -17.546000 + +accept 90d00'00.00 0d00'00.00 +expect 90.0 0.0 + +accept 0d00'00.00 0d00'00.00 +expect 0.0 0.0 + + + +operation +proj=pipeline \ + +step +proj=latlong +datum=NAD27 +inv \ + +step +units=us-ft +init=nad27:3901 +tolerance 1 mm + +accept -80d32'30.000 34d32'30.000 0.0 +expect 2_138_028.224 561_330.721 0.0 + +accept -81d00'00.000 34d32'30.000 0.0 +expect 2_000_000.000 561_019.077 0.0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Some tests from PJ_eqearth.c +------------------------------------------------------------------------------- +operation +proj=eqearth +ellps=WGS84 +------------------------------------------------------------------------------- +direction forward +tolerance 1cm + +accept 0 0 +expect 0 0 + +accept -180 90 +expect -10216474.79 8392927.6 + +accept 0 90 +expect 0 8392927.6 + +accept 180 90 +expect 10216474.79 8392927.6 + +accept 180 45 +expect 14792474.75 5466867.76 + +accept 180 0 +expect 17243959.06 0 + +accept -70 -31.2 +expect -6241081.64 -3907019.16 + + +direction inverse + +accept -6241081.64 -3907019.16 +expect -70 -31.2 + +accept 17243959.06 0 +expect 180 0 + +accept 14792474.75 5466867.76 +expect 180 45 + +accept 0 0 +expect 0 0 + +accept -10216474.79 8392927.6 +expect -180 90 + +accept 0 8392927.6 +expect 0 90 + +accept 10216474.79 8392927.6 +expect 180 90 + + +operation +proj=eqearth +R=6378137 +direction forward +tolerance 1cm + +accept 0 0 +expect 0 0 + +accept -180 90 +expect -10227908.09 8402320.16 + +accept 0 90 +expect 0.00 8402320.16 + +accept 180 90 +expect 10227908.09 8402320.16 + +accept 180 45 +expect 14795421.79 5486671.72 + +accept 180 0 +expect 17263256.84 0.00 + +accept -70 -31.2 +expect -6244707.88 -3924893.29 + +direction inverse + +accept -6244707.88 -3924893.29 +expect -70 -31.2 + +accept 17263256.84 0.00 +expect 180 0 + +accept 14795421.79 5486671.72 +expect 180 45 + +accept 0 0 +expect 0 0 + +accept -10227908.09 8402320.16 +expect -180 90 + +accept 0.00 8402320.16 +expect 0 90 + +accept 10227908.09 8402320.16 +expect 180 90 + +operation +proj=eqearth +R=1 +direction inverse + +# coordinate in valid region +accept 0 -1.3 +expect 0 -82.318 + +# coordinate on edge +accept 0 -1.3173627591574 +expect 0 -90 + +# coordinate outside valid region, should be clamped +accept 0 -1.4 +expect 0 -90 + +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +# Test for PJ_affine +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +operation +proj=geogoffset +------------------------------------------------------------------------------- +direction forward +tolerance 1mm + +accept 10 20 +expect 10 20 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=geogoffset +dlon=3600 +dlat=-3600 +dh=3 +------------------------------------------------------------------------------- +direction forward +tolerance 1mm + +accept 10 20 +expect 11 19 +roundtrip 1 + +accept 10 20 30 +expect 11 19 33 +roundtrip 1 + +accept 10 20 30 40 +expect 11 19 33 40 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=affine +------------------------------------------------------------------------------- +direction forward +tolerance 1mm + +accept 10 20 30 40 +expect 10 20 30 40 +roundtrip 1 + +------------------------------------------------------------------------------- +operation +proj=affine +xoff=1 +yoff=2 +zoff=3 +toff=4 +s11=11 +s12=12 +s13=13 +s21=21 +s22=22 +s23=23 +s31=-31 +s32=32 +s33=33 +tscale=34 +------------------------------------------------------------------------------- +direction forward +tolerance 1mm + +accept 2 49 10 100 +expect 741.0000 1352.0000 1839.0000 3404.0000 +roundtrip 1 + +accept 2 49 10 +expect 741.0000 1352.0000 1839.0000 +roundtrip 1 + +accept 2 49 +expect 611.0000 1122.0000 +roundtrip 1 + +------------------------------------------------------------------------------- +# Non invertible +operation +proj=affine +s11=0 +s22=0 +s23=0 +------------------------------------------------------------------------------- +direction reverse +accept 0 0 0 0 +expect failure + +------------------------------------------------------------------------------- +# Non invertible +operation +proj=affine +tscale=0 +------------------------------------------------------------------------------- +direction reverse +accept 0 0 0 0 +expect failure + +------------------------------------------------------------------------------- +# Test lon_wrap +operation +proj=longlat +ellps=WGS84 +lon_wrap=180 +------------------------------------------------------------------------------- +direction forward +accept -1 10 0 +expect 359 10 0 + +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +# Test for vertoffset (Vertical Offset And Slope) +# Test point for EPSG Guidance note 7.2 +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +operation +proj=vertoffset +lat_0=46.9166666666666666 +lon_0=8.183333333333334 +dh=-0.245 +slope_lat=-0.210 +slope_lon=-0.032 +ellps=GRS80 +------------------------------------------------------------------------------- +direction forward +tolerance 1mm + +accept 9.666666666666666 47.333333333333336 473.000 +expect 9.666666666666666 47.333333333333336 472.690 +roundtrip 1 + +------------------------------------------------------------------------------- +# Test NaN handling +# When given NaNs, return NaNs +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +operation +proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84 +units=m +------------------------------------------------------------------------------- +direction forward +tolerance 0 + +accept NaN NaN NaN NaN +expect NaN NaN NaN NaN +roundtrip 1 + +------------------------------------------------------------------------------- +# No-op +------------------------------------------------------------------------------- +operation +proj=noop +direction forward +accept 25 25 +expect 25 25 + +accept 25 25 25 +expect 25 25 25 + +accept 25 25 25 25 +expect 25 25 25 25 +------------------------------------------------------------------------------- + + +# Test invalid lat_0 +operation +proj=aeqd +R=1 +lat_0=91 +expect failure errno invalid_op_illegal_arg_value + +------------------------------------------------------------------------------- +# cart +------------------------------------------------------------------------------- + +operation +proj=cart +ellps=GRS80 +tolerance 0.001mm + +accept 0 0 0 +expect 6378137 0 0 + +accept 0 90 0 +expect 0 0 6356752.314140347 + +accept 0 -90 0 +expect 0 0 -6356752.314140347 + +accept 90 0 0 +expect 0 6378137 0 + +accept -90 0 0 +expect 0 -6378137 0 + +accept 180 0 0 +expect -6378137 0 0 + +accept -180 0 0 +expect -6378137 0 0 + +# Center of Earth ! +accept 0 0 -6378137 +expect 0 0 0 + +accept 0 90 -6356752.314140347 +expect 0 0 0 + +direction inverse + +accept 6378137 0 0 +expect 0 0 0 + +accept 0 0 6356752.314140347 +expect 0 90 0 + +accept 0 0 -6356752.314140347 +expect 0 -90 0 + +accept 0 6378137 0 +expect 90 0 0 + +accept 0 -6378137 0 +expect -90 0 0 + +accept -6378137 0 0 +expect 180 0 0 + +# Center of Earth ! +accept 0 0 0 +expect 0 90 -6356752.314140356 + +accept 0 0 1e-6 +expect 0 90 -6356752.314139356 + +accept 0 0 -1e-6 +expect 0 -90 -6356752.314139356 + + +------------------------------------------------------------------------------- +# Test handling of endianness of NTv2 grids +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_little_endian.gsb +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +operation +proj=hgridshift +grids=tests/test_hgrid_big_endian.gsb +------------------------------------------------------------------------------- +tolerance 2 mm +accept 4.5 52.5 0 +expect 5.875 55.375 0 +------------------------------------------------------------------------------- + +=============================================================================== +# Tests for testing that +omit_fwd, +omit_inv and +inv work together like they +# should. +# +# +omit_fwd specifies that a step should be omitted when running forwards. +# +# +omit_inv specifies that a step should be omitted when running backwards. +# +# +inv specifies that a step should be inverted. The forward path would do +# inverse operation and inverse path would do forward operation. +# +# | | invertible step | non-invertible step | +# | flags | forward path | inverse path | forward path | inverse path | +# | -------------- | ------------ | ------------ | ------------ | ------------ | +# | +omit_fwd | omit | inv | omit | runtime err | +# | +omit_fwd +inv | omit | fwd | omit | fwd | +# | +omit_inv | fwd | omit | fwd | omit | +# | +omit_inv +inv | inv | omit | pipeline creation error | +# +# From the table we can see that invertible steps should work pretty much all +# the time. Non-invertible steps on the other hand make either the forward path +# or inverse path undefined depending on which flags the step has. +# +# A non-invertible step is for example an affine transformation where we cannot +# calculate the inverse of the matrix. +=============================================================================== + +------------------------------------------------------------------------------- +# Test that +omit_fwd, +omit_inv and +inv work correctly with an invertible step. +------------------------------------------------------------------------------- + +# Test that forward path does nothing and inverse path does inverse transformation + +operation proj=pipeline step proj=affine s11=2 omit_fwd + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect 0.5 2 3 + +# Test that forward path does nothing and inverse path does forward transformation + +operation proj=pipeline step proj=affine s11=2 omit_fwd inv + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect 2 2 3 + +# Test that forward path does forward transformation and inverse path does nothing + +operation proj=pipeline step proj=affine s11=2 omit_inv + +direction forward +accept 1 2 3 +expect 2 2 3 + +direction inverse +accept 1 2 3 +expect 1 2 3 + +# Test that forward path does inverse transformation and inverse path does nothing + +operation proj=pipeline step proj=affine s11=2 omit_inv inv + +direction forward +accept 1 2 3 +expect 0.5 2 3 + +direction inverse +accept 1 2 3 +expect 1 2 3 + +------------------------------------------------------------------------------- +# Test that +omit_fwd, +omit_inv and +inv work correctly with a non-invertible step. +------------------------------------------------------------------------------- + +# Test that forward path does nothing and inverse path is not defined. +# +# The affine transformation is not invertible so this pipeline cannot be executed in +# reverse. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_fwd + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect failure errno no_inverse_op + +# Test that forward path does nothing and inverse path does forward transformation. +# +# The affine transformation does not have an inverse, but inv specifies that the +# step should be done in inverse order relative to our pipeline direction. When +# we execute the pipeline in reverse, we should call the forward transformation of +# the step which is defined so the pipeline should be valid in reverse. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_fwd inv + +direction forward +accept 1 2 3 +expect 1 2 3 + +direction inverse +accept 1 2 3 +expect 6 0 0 + +# Test that the forward path does forward transformation and inverse path does nothing. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_inv + +direction forward +accept 1 2 3 +expect 6 0 0 + +direction inverse +accept 1 2 3 +expect 1 2 3 + +# Test that the forward path is not defined +# +# When going through the forward path, inv specifies that we should execute the +# step in reverse. Because the affine transformation does not have an inverse, +# this means that the forward path does not exist. + +operation proj=pipeline step proj=affine s11=1 s12=1 s13=1 s22=0 s33=0 omit_inv inv +expect failure errno no_inverse_op + + diff --git a/conformance/src/test/resources/gie/nkg.gie b/conformance/src/test/resources/gie/nkg.gie new file mode 100644 index 0000000..1a5429e --- /dev/null +++ b/conformance/src/test/resources/gie/nkg.gie @@ -0,0 +1,270 @@ + + +# ------------------------------------------------------------------------------- +# NKG +# ------------------------------------------------------------------------------- +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_NKG_ETRF00 +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9311 948983.7980 5201383.2227 2020.5 + + +#------------------------------------------------------------------------------- +# DENMARK +#------------------------------------------------------------------------------- + +# 2008 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_DK +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9362 948983.7825 5201383.2292 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_DK +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.3829 948984.2188 5201383.5296 2020.5 + + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_DK +tolerance 0.1 mm + +# BUDD +accept 3513638.0964 778956.5470 5248216.5248 2015.0 +expect 3513638.5607 778956.1875 5248216.2477 2015.0 + +#ESBC +accept 3582104.8458 532590.0946 5232755.0863 2015.0 +expect 3582105.2916 532589.7310 5232754.8057 2015.0 + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NKG_ETRF14 +tolerance 0.1 mm + +# BUDD +accept 3513638.0964 778956.5470 5248216.5248 2015.0 +expect 3513638.5071 778956.1528 5248216.2870 2015.0 + +# ESBC +accept 3582104.8458 532590.0946 5232755.0863 2015.0 +expect 3582105.2401 532589.6950 5232754.8507 2015.0 + +operation urn:ogc:def:coordinateOperation:NKG::ETRF14_TO_DK +tolerance 0.1 mm + +# BUDD +accept 3513638.5071 778956.1528 5248216.2870 2015.0 +expect 3513638.5607 778956.1875 5248216.2477 2015.0 + +# ESBC +accept 3582105.2401 532589.6950 5232754.8507 2015.0 +expect 3582105.2916 532589.7310 5232754.8057 2015.0 + +# ------------------------------------------------------------------------------- +# ESTONIA +# ------------------------------------------------------------------------------- + +# 2008 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_EE +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9395 948983.8006 5201383.2242 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_EE +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.3862 948984.2370 5201383.5246 2020.5 + + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_EE +tolerance 0.1 mm + +# AJOE +accept 2922027.7409 1516183.8589 5444680.6502 2015.0 +expect 2922028.2730 1516183.5457 5444680.4094 2015.0 + +# ------------------------------------------------------------------------------- +# FINLAND +# ------------------------------------------------------------------------------- + +# 2008 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_FI +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9522 948983.7911 5201383.2230 2020.5 + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_FI_EUREF-FIN +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9522 948983.7911 5201383.2230 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_FI +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.3989 948984.2274 5201383.5235 2020.5 + + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_FI +tolerance 0.1 mm + +# DEGE +accept 2994012.0569 1112559.9272 5502272.0863 2015.0 +expect 2994012.5170 1112559.5902 5502271.7683 2015.0 + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_FI_EUREF-FIN +tolerance 0.1 mm + +# DEGE +accept 2994012.0569 1112559.9272 5502272.0863 2015.0 +expect 2994012.5170 1112559.5902 5502271.7683 2015.0 + + +# ------------------------------------------------------------------------------- +# LATVIA +# ------------------------------------------------------------------------------- + +# 2008 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_LV +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9806 948983.8606 5201383.3118 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_LV +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.4273 948984.2970 5201383.6122 2020.5 + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_LV +tolerance 0.1 mm + +# BAUS +accept 3226814.4746 1449250.4615 5289639.6134 2015.0 +expect 3226814.9950 1449250.1841 5289639.3779 2015.0 + + +# ------------------------------------------------------------------------------- +# LITHUANIA +# ------------------------------------------------------------------------------- + +# 2008 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_LT +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9358 948983.8042 5201383.2294 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_LT +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.3826 948984.2405 5201383.5299 2020.5 + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_LT +tolerance 0.1 mm + +# VLNS +accept 3343600.4221 1580417.8797 5179337.3696 2015.0 +expect 3343600.9945 1580417.5661 5179337.1637 2015.0 + + +# ------------------------------------------------------------------------------- +# NORWAY +# ------------------------------------------------------------------------------- + +# 2008 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_NO +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9204 948983.8049 5201383.2054 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_NO +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.3671 948984.2412 5201383.5058 2020.5 + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_NO +tolerance 0.1 mm + +# STAS +accept 3275753.4135 321111.2481 5445042.2134 2020.0 +expect 3275753.9094 321110.8626 5445041.8818 2020.0 + +# BOD3 +accept 2391773.9918 615615.1837 5860966.1279 2020.0 +expect 2391774.5481 615614.9063 5860965.8185 2020.0 + +# KAUS +accept 2107888.9134 895603.4769 5933242.6269 2020.0 +expect 2107889.5014 895603.2055 5933242.3208 2020.0 + + +# ------------------------------------------------------------------------------- +# SWEDEN +# ------------------------------------------------------------------------------- + + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2000_TO_SE +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.9223 948983.7912 5201383.2025 2020.5 + + +operation urn:ogc:def:coordinateOperation:NKG::ETRF00_TO_SE +tolerance 1 mm + +accept 3541657.3778 948984.2343 5201383.5231 2020.5 +expect 3541657.3690 948984.2275 5201383.5030 2020.5 + +# 2020 Transformations + +operation urn:ogc:def:coordinateOperation:NKG::ITRF2014_TO_SE +tolerance 0.1 mm + +# ARJ0 +accept 2441774.9791 799268.3078 5818729.4941 2015.0 +expect 2441775.4338 799268.0336 5818729.1635 2015.0 + +# BOD3 +accept 2391774.0738 615615.1324 5860966.0796 2015.0 +expect 2391774.5409 615614.8770 5860965.8078 2015.0 + +# KIR0 +accept 2248123.0276 865686.7906 5886425.8928 2015.0 +expect 2248123.5028 865686.5301 5886425.5928 2015.0 + + diff --git a/conformance/src/test/resources/gie/peirce_q.gie b/conformance/src/test/resources/gie/peirce_q.gie new file mode 100644 index 0000000..0fac30e --- /dev/null +++ b/conformance/src/test/resources/gie/peirce_q.gie @@ -0,0 +1,1334 @@ + +------------------------------------------------------------ +# This gie file was originally automatically generated using libproject +# from where the peirce_q code was adapted +------------------------------------------------------------ + +------------------------------------------------------------ +# These test values were selected from 60 points +# based on the from the original libproj test. Note that +# Peirce_q distances include considerable distortion away +# from axes, a feature of the projection to allow +# tessellation but means that there is no uniform scale +# across the coordinate space, so tolerance can be high. +------------------------------------------------------------ + +------------------------------------------------------------ +operation +proj=peirce_q +R=6370997 +shape=square +tolerance 10 mm +------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect -16684778.66 16659858.26 +accept -139.6233037328 -87.8821294926 +expect -16686136.62 16470363.98 +accept -119.6070748182 -86.3003323104 +expect -16595886.22 -16308355.92 +accept -99.5789095738 -85.2121814625 +expect -16396383.18 -16271023.42 +accept -79.2799350968 -83.8692118030 +expect -16141287.47 -16320788.59 +accept -59.1007316490 -82.6429522913 +expect -15910611.60 -16505541.92 +accept -39.7694988813 -81.1240616181 +expect 15720298.10 -16614965.01 +accept -19.4219986373 -80.4596653260 +expect 15746034.38 -16246050.72 +accept 0.0372192405 -79.1830001774 +expect 15852642.31 -15851534.09 +accept 10.8072116146 -78.5286202425 +expect 15985877.10 -15646515.07 +accept 30.6949420481 -77.5251356225 +expect 16361000.46 -15355648.15 +accept 50.8838172783 -77.2075414406 +expect 16558682.76 15284231.71 +accept 70.9123606882 -75.6020670736 +expect 16001764.31 15257501.18 +accept 90.9423960847 -75.1187688922 +expect 15509280.35 15547980.96 +accept 110.1071594840 -74.5087602471 +expect 15133049.74 15975564.05 +accept 130.0104641839 -73.3709657282 +expect 14849947.11 16543126.46 +accept 150.5931126765 -73.1105693985 +expect -14882991.09 16196524.65 +accept 170.3454770498 -72.3687427114 +expect -15093352.82 15561916.35 +accept -179.4283603569 -79.2780817976 +expect -15868107.22 15851237.11 +accept -159.6140419013 -78.9064235928 +expect -16189722.98 15580148.89 +accept -139.5485387788 -78.1437071317 +expect -16600189.56 15386190.03 +accept -119.3040589991 -77.1517896758 +expect -16316973.21 -15323941.76 +accept -99.1733290138 -76.2249333909 +expect -15804208.98 -15457233.95 +accept -79.5627247417 -75.2438944725 +expect -15346437.66 -15769094.64 +accept -59.2065888779 -74.4787205556 +expect -15021689.81 -16278889.61 +accept -39.4027491539 -73.6693258790 +expect 14885488.22 -16526762.78 +accept -19.3829588944 -72.8068670782 +expect 14968262.72 -15872213.73 +accept 0.5951648774 -71.1110965727 +expect 15222108.42 -15190983.68 +accept 10.0089578122 -71.1061903043 +expect 15489314.77 -14968374.05 +accept 30.2470524798 -69.7155529444 +expect 16124447.67 -14500816.44 +accept 50.0855077954 -69.3112248587 +expect 16498844.48 14388231.66 +accept 70.3496352985 -68.4437853274 +expect 15666358.72 14513249.85 +accept 90.4893702644 -66.7652070914 +expect 14837383.82 14868997.15 +accept 110.3952984186 -65.8768496172 +expect 14229937.28 15571030.23 +accept 130.3231133025 -64.8242212878 +expect 13868599.66 16472840.15 +accept 150.8384853690 -63.8483921906 +expect -13857834.28 15896552.84 +accept 170.7991687984 -62.8345530934 +expect -14209244.97 14904320.39 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect -1542258.49 1501537.48 +accept -159.9563893280 71.5181717183 +expect -1879442.18 874815.08 +accept -139.1100287608 72.5807306253 +expect -1947072.52 139940.96 +accept -119.6844932150 73.8160145972 +expect -1747316.08 -478587.18 +accept -99.2835557046 74.0204664516 +expect -1452001.59 -1044052.58 +accept -79.7589672970 75.0775591038 +expect -951397.60 -1370919.39 +accept -59.3247479059 76.5851745566 +expect -370785.20 -1451930.29 +accept -39.7902268868 77.0657936158 +expect 131161.56 -1438411.11 +accept -19.7666667754 78.0413206451 +expect 568957.13 -1207234.94 +accept 0.2731990430 79.0490755914 +expect 867766.11 -859530.19 +accept 10.9115419099 79.7152157770 +expect 949655.50 -642692.40 +accept 30.7420972758 80.5901686038 +expect 1016382.12 -258281.56 +accept 50.1425480782 81.1493341375 +expect 982144.24 88390.48 +accept 70.9517084975 81.7646094071 +expect 824812.58 401430.41 +accept 90.1847984189 82.9573597164 +expect 552645.55 556222.02 +accept 110.4406311958 83.6703375043 +expect 292833.81 640803.17 +accept 130.8429657164 84.7838043163 +expect 42074.56 578888.43 +accept 150.8488588999 85.8764976286 +expect -125274.18 441272.71 +accept 170.3972098164 87.6222109978 +expect -153172.25 215556.52 + + ------------------------------------------------------------ + operation +proj=peirce_q +R=6370997 +shape=diamond + tolerance 10 mm + ------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect -17621.38 23578218.89 +accept -139.6233037328 -87.8821294926 +expect -152574.30 23445186.42 +accept -119.6070748182 -86.3003323104 +expect -23266812.75 203314.63 +accept -99.5789095738 -85.2121814625 +expect -23099344.73 88642.74 +accept -79.2799350968 -83.8692118030 +expect -22954154.12 -126926.46 +accept -59.1007316490 -82.6429522913 +expect -22921681.97 -420679.26 +accept -39.7694988813 -81.1240616181 +expect -632625.04 -22864483.82 +accept -19.4219986373 -80.4596653260 +expect -353564.94 -22621820.31 +accept 0.0372192405 -79.1830001774 +expect 783.63 -22418238.13 +accept 10.8072116146 -78.5286202425 +expect 239965.19 -22367479.01 +accept 30.6949420481 -77.5251356225 +expect 710891.44 -22427057.31 +accept 50.8838172783 -77.2075414406 +expect 22516340.76 -901172.98 +accept 70.9123606882 -75.6020670736 +expect 22103638.61 -526273.50 +accept 90.9423960847 -75.1187688922 +expect 21960800.08 27365.47 +accept 110.1071594840 -74.5087602471 +expect 21997111.76 595747.59 +accept 130.0104641839 -73.3709657282 +expect 22198255.20 1197258.60 +accept 150.5931126765 -73.1105693985 +expect 928808.49 21976536.34 +accept 170.3454770498 -72.3687427114 +expect 331324.45 21676548.71 +accept -179.4283603569 -79.2780817976 +expect -11928.97 22428963.47 +accept -159.6140419013 -78.9064235928 +expect -431033.97 22464691.83 +accept -139.5485387788 -78.1437071317 +expect -858427.30 22617785.91 +accept -119.3040589991 -77.1517896758 +expect -22373505.54 702179.27 +accept -99.1733290138 -76.2249333909 +expect -22105178.28 245348.39 +accept -79.5627247417 -75.2438944725 +expect -22002003.89 -298863.61 +accept -59.2065888779 -74.4787205556 +expect -22132851.96 -888974.50 +accept -39.4027491539 -73.6693258790 +expect -1160556.37 -22211815.70 +accept -19.3829588944 -72.8068670782 +expect -639189.89 -21807510.03 +accept 0.5951648774 -71.1110965727 +expect 22008.52 -21505303.66 +accept 10.0089578122 -71.1061903043 +expect 368360.71 -21536838.30 +accept 30.2470524798 -69.7155529444 +expect 1148080.66 -21655331.93 +accept 50.0855077954 -69.3112248587 +expect 21840460.99 -1492428.63 +accept 70.3496352985 -68.4437853274 +expect 21340205.88 -815371.10 +accept 90.4893702644 -66.7652070914 +expect 21005583.43 22354.00 +accept 110.3952984186 -65.8768496172 +expect 21072466.21 948295.92 +accept 130.3231133025 -64.8242212878 +expect 21454637.84 1841476.11 +accept 150.8384853690 -63.8483921906 +expect 1441591.72 21039528.90 +accept 170.7991687984 -62.8345530934 +expect 491492.54 20586399.49 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect -28794.10 2152288.77 +accept -159.9563893280 71.5181717183 +expect -710378.63 1947553.99 +accept -139.1100287608 72.5807306253 +expect -1277834.99 1475741.38 +accept -119.6844932150 73.8160145972 +expect -1573951.28 897126.81 +accept -99.2835557046 74.0204664516 +expect -1764976.83 288463.51 +accept -79.7589672970 75.0775591038 +expect -1642126.09 -296646.71 +accept -59.3247479059 76.5851745566 +expect -1288854.48 -764485.02 +accept -39.7902268868 77.0657936158 +expect -924365.02 -1109855.48 +accept -19.7666667754 78.0413206451 +expect -451330.57 -1255957.46 +accept 0.2731990430 79.0490755914 +expect 5823.67 -1221382.92 +accept 10.9115419099 79.7152157770 +expect 217055.69 -1125960.00 +accept 30.7420972758 80.5901686038 +expect 536058.05 -901323.33 +accept 50.1425480782 81.1493341375 +expect 756982.36 -631979.34 +accept 70.9517084975 81.7646094071 +expect 867084.74 -299376.41 +accept 90.1847984189 82.9573597164 +expect 784087.78 2528.94 +accept 110.4406311958 83.6703375043 +expect 660181.04 246051.50 +accept 130.8429657164 84.7838043163 +expect 439087.14 379584.73 +accept 150.8488588999 85.8764976286 +expect 223444.70 400609.15 +accept 170.3972098164 87.6222109978 +expect 44112.34 260730.62 + +------------------------------------------------------------ +operation +proj=peirce_q +R=6370997 +shape=horizontal +tolerance 10 mm +------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect 11829925.59 46389.53 +accept -139.6233037328 -87.8821294926 +expect 11964878.50 179422.00 +accept -119.6070748182 -86.3003323104 +expect 12170099.87 203314.63 +accept -99.5789095738 -85.2121814625 +expect 12337567.89 88642.74 +accept -79.2799350968 -83.8692118030 +expect 12482758.50 -126926.46 +accept -59.1007316490 -82.6429522913 +expect 12515230.65 -420679.26 +accept -39.7694988813 -81.1240616181 +expect 12444929.25 -760124.60 +accept -19.4219986373 -80.4596653260 +expect 12165869.15 -1002788.10 +accept 0.0372192405 -79.1830001774 +expect 11811520.58 -1206370.29 +accept 10.8072116146 -78.5286202425 +expect 11572339.01 -1257129.40 +accept 30.6949420481 -77.5251356225 +expect 11101412.77 -1197551.10 +accept 50.8838172783 -77.2075414406 +expect 10704036.55 -901172.98 +accept 70.9123606882 -75.6020670736 +expect 10291334.40 -526273.50 +accept 90.9423960847 -75.1187688922 +expect 10148495.87 27365.47 +accept 110.1071594840 -74.5087602471 +expect 10184807.56 595747.59 +accept 130.0104641839 -73.3709657282 +expect 10385951.00 1197258.60 +accept 150.5931126765 -73.1105693985 +expect 10883495.72 1648072.07 +accept 170.3454770498 -72.3687427114 +expect 11480979.75 1948059.70 +accept -179.4283603569 -79.2780817976 +expect 11824233.18 1195644.94 +accept -159.6140419013 -78.9064235928 +expect 12243338.18 1159916.58 +accept -139.5485387788 -78.1437071317 +expect 12670731.51 1006822.50 +accept -119.3040589991 -77.1517896758 +expect 13063407.08 702179.27 +accept -99.1733290138 -76.2249333909 +expect 13331734.34 245348.39 +accept -79.5627247417 -75.2438944725 +expect 13434908.73 -298863.61 +accept -59.2065888779 -74.4787205556 +expect 13304060.66 -888974.50 +accept -39.4027491539 -73.6693258790 +expect 12972860.58 -1412792.72 +accept -19.3829588944 -72.8068670782 +expect 12451494.09 -1817098.38 +accept 0.5951648774 -71.1110965727 +expect 11790295.69 -2119304.75 +accept 10.0089578122 -71.1061903043 +expect 11443943.49 -2087770.11 +accept 30.2470524798 -69.7155529444 +expect 10664223.55 -1969276.48 +accept 50.0855077954 -69.3112248587 +expect 10028156.79 -1492428.63 +accept 70.3496352985 -68.4437853274 +expect 9527901.67 -815371.10 +accept 90.4893702644 -66.7652070914 +expect 9193279.23 22354.00 +accept 110.3952984186 -65.8768496172 +expect 9260162.01 948295.92 +accept 130.3231133025 -64.8242212878 +expect 9642333.63 1841476.11 +accept 150.8384853690 -63.8483921906 +expect 10370712.49 2585079.51 +accept 170.7991687984 -62.8345530934 +expect 11320811.66 3038208.93 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect -11841098.31 2152288.77 +accept -159.9563893280 71.5181717183 +expect -12522682.84 1947553.99 +accept -139.1100287608 72.5807306253 +expect -13090139.19 1475741.38 +accept -119.6844932150 73.8160145972 +expect -13386255.49 897126.81 +accept -99.2835557046 74.0204664516 +expect -13577281.04 288463.51 +accept -79.7589672970 75.0775591038 +expect -13454430.30 -296646.71 +accept -59.3247479059 76.5851745566 +expect -13101158.69 -764485.02 +accept -39.7902268868 77.0657936158 +expect -12736669.23 -1109855.48 +accept -19.7666667754 78.0413206451 +expect -12263634.78 -1255957.46 +accept 0.2731990430 79.0490755914 +expect -11806480.53 -1221382.92 +accept 10.9115419099 79.7152157770 +expect -11595248.52 -1125960.00 +accept 30.7420972758 80.5901686038 +expect -11276246.16 -901323.33 +accept 50.1425480782 81.1493341375 +expect -11055321.85 -631979.34 +accept 70.9517084975 81.7646094071 +expect -10945219.47 -299376.41 +accept 90.1847984189 82.9573597164 +expect -11028216.43 2528.94 +accept 110.4406311958 83.6703375043 +expect -11152123.17 246051.50 +accept 130.8429657164 84.7838043163 +expect -11373217.07 379584.73 +accept 150.8488588999 85.8764976286 +expect -11588859.50 400609.15 +accept 170.3972098164 87.6222109978 +expect -11768191.87 260730.62 + + ------------------------------------------------------------ + operation +proj=peirce_q +R=6370997 +shape=horizontal +scrollx=0.75 + tolerance 10 mm + ------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect 17621.38 46389.53 +accept -139.6233037328 -87.8821294926 +expect 152574.30 179422.00 +accept -119.6070748182 -86.3003323104 +expect 357795.67 203314.63 +accept -99.5789095738 -85.2121814625 +expect 525263.69 88642.74 +accept -79.2799350968 -83.8692118030 +expect 670454.30 -126926.46 +accept -59.1007316490 -82.6429522913 +expect 702926.44 -420679.26 +accept -39.7694988813 -81.1240616181 +expect 632625.04 -760124.60 +accept -19.4219986373 -80.4596653260 +expect 353564.94 -1002788.10 +accept 0.0372192405 -79.1830001774 +expect -783.63 -1206370.29 +accept 10.8072116146 -78.5286202425 +expect -239965.19 -1257129.40 +accept 30.6949420481 -77.5251356225 +expect -710891.44 -1197551.10 +accept 50.8838172783 -77.2075414406 +expect -1108267.66 -901172.98 +accept 70.9123606882 -75.6020670736 +expect -1520969.81 -526273.50 +accept 90.9423960847 -75.1187688922 +expect -1663808.33 27365.47 +accept 110.1071594840 -74.5087602471 +expect -1627496.65 595747.59 +accept 130.0104641839 -73.3709657282 +expect -1426353.21 1197258.60 +accept 150.5931126765 -73.1105693985 +expect -928808.49 1648072.07 +accept 170.3454770498 -72.3687427114 +expect -331324.45 1948059.70 +accept -179.4283603569 -79.2780817976 +expect 11928.97 1195644.94 +accept -159.6140419013 -78.9064235928 +expect 431033.97 1159916.58 +accept -139.5485387788 -78.1437071317 +expect 858427.30 1006822.50 +accept -119.3040589991 -77.1517896758 +expect 1251102.88 702179.27 +accept -99.1733290138 -76.2249333909 +expect 1519430.13 245348.39 +accept -79.5627247417 -75.2438944725 +expect 1622604.52 -298863.61 +accept -59.2065888779 -74.4787205556 +expect 1491756.45 -888974.50 +accept -39.4027491539 -73.6693258790 +expect 1160556.37 -1412792.72 +accept -19.3829588944 -72.8068670782 +expect 639189.89 -1817098.38 +accept 0.5951648774 -71.1110965727 +expect -22008.52 -2119304.75 +accept 10.0089578122 -71.1061903043 +expect -368360.71 -2087770.11 +accept 30.2470524798 -69.7155529444 +expect -1148080.66 -1969276.48 +accept 50.0855077954 -69.3112248587 +expect -1784147.42 -1492428.63 +accept 70.3496352985 -68.4437853274 +expect -2284402.54 -815371.10 +accept 90.4893702644 -66.7652070914 +expect -2619024.98 22354.00 +accept 110.3952984186 -65.8768496172 +expect -2552142.20 948295.92 +accept 130.3231133025 -64.8242212878 +expect -2169970.58 1841476.11 +accept 150.8384853690 -63.8483921906 +expect -1441591.72 2585079.51 +accept 170.7991687984 -62.8345530934 +expect -491492.54 3038208.93 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect 23595814.31 2152288.77 +accept -159.9563893280 71.5181717183 +expect 22914229.78 1947553.99 +accept -139.1100287608 72.5807306253 +expect 22346773.43 1475741.38 +accept -119.6844932150 73.8160145972 +expect 22050657.13 897126.81 +accept -99.2835557046 74.0204664516 +expect 21859631.58 288463.51 +accept -79.7589672970 75.0775591038 +expect 21982482.33 -296646.71 +accept -59.3247479059 76.5851745566 +expect 22335753.93 -764485.02 +accept -39.7902268868 77.0657936158 +expect 22700243.39 -1109855.48 +accept -19.7666667754 78.0413206451 +expect 23173277.84 -1255957.46 +accept 0.2731990430 79.0490755914 +expect -23618784.74 -1221382.92 +accept 10.9115419099 79.7152157770 +expect -23407552.72 -1125960.00 +accept 30.7420972758 80.5901686038 +expect -23088550.36 -901323.33 +accept 50.1425480782 81.1493341375 +expect -22867626.05 -631979.34 +accept 70.9517084975 81.7646094071 +expect -22757523.68 -299376.41 +accept 90.1847984189 82.9573597164 +expect -22840520.64 2528.94 +accept 110.4406311958 83.6703375043 +expect -22964427.38 246051.50 +accept 130.8429657164 84.7838043163 +expect -23185521.28 379584.73 +accept 150.8488588999 85.8764976286 +expect -23401163.71 400609.15 +accept 170.3972098164 87.6222109978 +expect -23580496.07 260730.62 + + ------------------------------------------------------------ + operation +proj=peirce_q +R=6370997 +shape=vertical + tolerance 10 mm + ------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect -17621.38 11765914.68 +accept -139.6233037328 -87.8821294926 +expect -152574.30 11632882.21 +accept -119.6070748182 -86.3003323104 +expect -357795.67 11608989.58 +accept -99.5789095738 -85.2121814625 +expect -525263.69 11723661.47 +accept -79.2799350968 -83.8692118030 +expect -670454.30 11939230.67 +accept -59.1007316490 -82.6429522913 +expect -702926.44 12232983.46 +accept -39.7694988813 -81.1240616181 +expect -632625.04 12572428.81 +accept -19.4219986373 -80.4596653260 +expect -353564.94 12815092.31 +accept 0.0372192405 -79.1830001774 +expect 783.63 13018674.49 +accept 10.8072116146 -78.5286202425 +expect 239965.19 13069433.61 +accept 30.6949420481 -77.5251356225 +expect 710891.44 13009855.31 +accept 50.8838172783 -77.2075414406 +expect 1108267.66 12713477.19 +accept 70.9123606882 -75.6020670736 +expect 1520969.81 12338577.71 +accept 90.9423960847 -75.1187688922 +expect 1663808.33 11784938.74 +accept 110.1071594840 -74.5087602471 +expect 1627496.65 11216556.62 +accept 130.0104641839 -73.3709657282 +expect 1426353.21 10615045.61 +accept 150.5931126765 -73.1105693985 +expect 928808.49 10164232.13 +accept 170.3454770498 -72.3687427114 +expect 331324.45 9864244.50 +accept -179.4283603569 -79.2780817976 +expect -11928.97 10616659.27 +accept -159.6140419013 -78.9064235928 +expect -431033.97 10652387.63 +accept -139.5485387788 -78.1437071317 +expect -858427.30 10805481.70 +accept -119.3040589991 -77.1517896758 +expect -1251102.88 11110124.94 +accept -99.1733290138 -76.2249333909 +expect -1519430.13 11566955.81 +accept -79.5627247417 -75.2438944725 +expect -1622604.52 12111167.82 +accept -59.2065888779 -74.4787205556 +expect -1491756.45 12701278.71 +accept -39.4027491539 -73.6693258790 +expect -1160556.37 13225096.92 +accept -19.3829588944 -72.8068670782 +expect -639189.89 13629402.59 +accept 0.5951648774 -71.1110965727 +expect 22008.52 13931608.96 +accept 10.0089578122 -71.1061903043 +expect 368360.71 13900074.32 +accept 30.2470524798 -69.7155529444 +expect 1148080.66 13781580.69 +accept 50.0855077954 -69.3112248587 +expect 1784147.42 13304732.84 +accept 70.3496352985 -68.4437853274 +expect 2284402.54 12627675.31 +accept 90.4893702644 -66.7652070914 +expect 2619024.98 11789950.21 +accept 110.3952984186 -65.8768496172 +expect 2552142.20 10864008.28 +accept 130.3231133025 -64.8242212878 +expect 2169970.58 9970828.10 +accept 150.8384853690 -63.8483921906 +expect 1441591.72 9227224.69 +accept 170.7991687984 -62.8345530934 +expect 491492.54 8774095.28 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect -28794.10 -9660015.44 +accept -159.9563893280 71.5181717183 +expect -710378.63 -9864750.22 +accept -139.1100287608 72.5807306253 +expect -1277834.99 -10336562.82 +accept -119.6844932150 73.8160145972 +expect -1573951.28 -10915177.40 +accept -99.2835557046 74.0204664516 +expect -1764976.83 -11523840.70 +accept -79.7589672970 75.0775591038 +expect -1642126.09 -12108950.91 +accept -59.3247479059 76.5851745566 +expect -1288854.48 -12576789.23 +accept -39.7902268868 77.0657936158 +expect -924365.02 -12922159.68 +accept -19.7666667754 78.0413206451 +expect -451330.57 -13068261.66 +accept 0.2731990430 79.0490755914 +expect 5823.67 -13033687.13 +accept 10.9115419099 79.7152157770 +expect 217055.69 -12938264.21 +accept 30.7420972758 80.5901686038 +expect 536058.05 -12713627.54 +accept 50.1425480782 81.1493341375 +expect 756982.36 -12444283.55 +accept 70.9517084975 81.7646094071 +expect 867084.74 -12111680.61 +accept 90.1847984189 82.9573597164 +expect 784087.78 -11809775.26 +accept 110.4406311958 83.6703375043 +expect 660181.04 -11566252.71 +accept 130.8429657164 84.7838043163 +expect 439087.14 -11432719.48 +accept 150.8488588999 85.8764976286 +expect 223444.70 -11411695.05 +accept 170.3972098164 87.6222109978 +expect 44112.34 -11551573.59 + + ------------------------------------------------------------ + operation +proj=peirce_q +R=6370997 +shape=vertical +scrolly=-0.25 + tolerance 10 mm + ------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect -17621.38 -46389.53 +accept -139.6233037328 -87.8821294926 +expect -152574.30 -179422.00 +accept -119.6070748182 -86.3003323104 +expect -357795.67 -203314.63 +accept -99.5789095738 -85.2121814625 +expect -525263.69 -88642.74 +accept -79.2799350968 -83.8692118030 +expect -670454.30 126926.46 +accept -59.1007316490 -82.6429522913 +expect -702926.44 420679.26 +accept -39.7694988813 -81.1240616181 +expect -632625.04 760124.60 +accept -19.4219986373 -80.4596653260 +expect -353564.94 1002788.10 +accept 0.0372192405 -79.1830001774 +expect 783.63 1206370.29 +accept 10.8072116146 -78.5286202425 +expect 239965.19 1257129.40 +accept 30.6949420481 -77.5251356225 +expect 710891.44 1197551.10 +accept 50.8838172783 -77.2075414406 +expect 1108267.66 901172.98 +accept 70.9123606882 -75.6020670736 +expect 1520969.81 526273.50 +accept 90.9423960847 -75.1187688922 +expect 1663808.33 -27365.47 +accept 110.1071594840 -74.5087602471 +expect 1627496.65 -595747.59 +accept 130.0104641839 -73.3709657282 +expect 1426353.21 -1197258.60 +accept 150.5931126765 -73.1105693985 +expect 928808.49 -1648072.07 +accept 170.3454770498 -72.3687427114 +expect 331324.45 -1948059.70 +accept -179.4283603569 -79.2780817976 +expect -11928.97 -1195644.94 +accept -159.6140419013 -78.9064235928 +expect -431033.97 -1159916.58 +accept -139.5485387788 -78.1437071317 +expect -858427.30 -1006822.50 +accept -119.3040589991 -77.1517896758 +expect -1251102.88 -702179.27 +accept -99.1733290138 -76.2249333909 +expect -1519430.13 -245348.39 +accept -79.5627247417 -75.2438944725 +expect -1622604.52 298863.61 +accept -59.2065888779 -74.4787205556 +expect -1491756.45 888974.50 +accept -39.4027491539 -73.6693258790 +expect -1160556.37 1412792.72 +accept -19.3829588944 -72.8068670782 +expect -639189.89 1817098.38 +accept 0.5951648774 -71.1110965727 +expect 22008.52 2119304.75 +accept 10.0089578122 -71.1061903043 +expect 368360.71 2087770.11 +accept 30.2470524798 -69.7155529444 +expect 1148080.66 1969276.48 +accept 50.0855077954 -69.3112248587 +expect 1784147.42 1492428.63 +accept 70.3496352985 -68.4437853274 +expect 2284402.54 815371.10 +accept 90.4893702644 -66.7652070914 +expect 2619024.98 -22354.00 +accept 110.3952984186 -65.8768496172 +expect 2552142.20 -948295.92 +accept 130.3231133025 -64.8242212878 +expect 2169970.58 -1841476.11 +accept 150.8384853690 -63.8483921906 +expect 1441591.72 -2585079.51 +accept 170.7991687984 -62.8345530934 +expect 491492.54 -3038208.93 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect -28794.10 -21472319.64 +accept -159.9563893280 71.5181717183 +expect -710378.63 -21677054.43 +accept -139.1100287608 72.5807306253 +expect -1277834.99 -22148867.03 +accept -119.6844932150 73.8160145972 +expect -1573951.28 -22727481.60 +accept -99.2835557046 74.0204664516 +expect -1764976.83 -23336144.90 +accept -79.7589672970 75.0775591038 +expect -1642126.09 23327961.71 +accept -59.3247479059 76.5851745566 +expect -1288854.48 22860123.39 +accept -39.7902268868 77.0657936158 +expect -924365.02 22514752.94 +accept -19.7666667754 78.0413206451 +expect -451330.57 22368650.96 +accept 0.2731990430 79.0490755914 +expect 5823.67 22403225.49 +accept 10.9115419099 79.7152157770 +expect 217055.69 22498648.41 +accept 30.7420972758 80.5901686038 +expect 536058.05 22723285.08 +accept 50.1425480782 81.1493341375 +expect 756982.36 22992629.07 +accept 70.9517084975 81.7646094071 +expect 867084.74 23325232.01 +accept 90.1847984189 82.9573597164 +expect 784087.78 -23622079.47 +accept 110.4406311958 83.6703375043 +expect 660181.04 -23378556.92 +accept 130.8429657164 84.7838043163 +expect 439087.14 -23245023.69 +accept 150.8488588999 85.8764976286 +expect 223444.70 -23223999.26 +accept 170.3972098164 87.6222109978 +expect 44112.34 -23363877.80 + + ------------------------------------------------------------ + operation +proj=peirce_q +R=6370997 +shape=nhemisphere + tolerance 10 mm + ------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect failure errno coord_transfm_outside_projection_domain +accept -139.6233037328 -87.8821294926 +expect failure errno coord_transfm_outside_projection_domain +accept -119.6070748182 -86.3003323104 +expect failure errno coord_transfm_outside_projection_domain +accept -99.5789095738 -85.2121814625 +expect failure errno coord_transfm_outside_projection_domain +accept -79.2799350968 -83.8692118030 +expect failure errno coord_transfm_outside_projection_domain +accept -59.1007316490 -82.6429522913 +expect failure errno coord_transfm_outside_projection_domain +accept -39.7694988813 -81.1240616181 +expect failure errno coord_transfm_outside_projection_domain +accept -19.4219986373 -80.4596653260 +expect failure errno coord_transfm_outside_projection_domain +accept 0.0372192405 -79.1830001774 +expect failure errno coord_transfm_outside_projection_domain +accept 10.8072116146 -78.5286202425 +expect failure errno coord_transfm_outside_projection_domain +accept 30.6949420481 -77.5251356225 +expect failure errno coord_transfm_outside_projection_domain +accept 50.8838172783 -77.2075414406 +expect failure errno coord_transfm_outside_projection_domain +accept 70.9123606882 -75.6020670736 +expect failure errno coord_transfm_outside_projection_domain +accept 90.9423960847 -75.1187688922 +expect failure errno coord_transfm_outside_projection_domain +accept 110.1071594840 -74.5087602471 +expect failure errno coord_transfm_outside_projection_domain +accept 130.0104641839 -73.3709657282 +expect failure errno coord_transfm_outside_projection_domain +accept 150.5931126765 -73.1105693985 +expect failure errno coord_transfm_outside_projection_domain +accept 170.3454770498 -72.3687427114 +expect failure errno coord_transfm_outside_projection_domain +accept -179.4283603569 -79.2780817976 +expect failure errno coord_transfm_outside_projection_domain +accept -159.6140419013 -78.9064235928 +expect failure errno coord_transfm_outside_projection_domain +accept -139.5485387788 -78.1437071317 +expect failure errno coord_transfm_outside_projection_domain +accept -119.3040589991 -77.1517896758 +expect failure errno coord_transfm_outside_projection_domain +accept -99.1733290138 -76.2249333909 +expect failure errno coord_transfm_outside_projection_domain +accept -79.5627247417 -75.2438944725 +expect failure errno coord_transfm_outside_projection_domain +accept -59.2065888779 -74.4787205556 +expect failure errno coord_transfm_outside_projection_domain +accept -39.4027491539 -73.6693258790 +expect failure errno coord_transfm_outside_projection_domain +accept -19.3829588944 -72.8068670782 +expect failure errno coord_transfm_outside_projection_domain +accept 0.5951648774 -71.1110965727 +expect failure errno coord_transfm_outside_projection_domain +accept 10.0089578122 -71.1061903043 +expect failure errno coord_transfm_outside_projection_domain +accept 30.2470524798 -69.7155529444 +expect failure errno coord_transfm_outside_projection_domain +accept 50.0855077954 -69.3112248587 +expect failure errno coord_transfm_outside_projection_domain +accept 70.3496352985 -68.4437853274 +expect failure errno coord_transfm_outside_projection_domain +accept 90.4893702644 -66.7652070914 +expect failure errno coord_transfm_outside_projection_domain +accept 110.3952984186 -65.8768496172 +expect failure errno coord_transfm_outside_projection_domain +accept 130.3231133025 -64.8242212878 +expect failure errno coord_transfm_outside_projection_domain +accept 150.8384853690 -63.8483921906 +expect failure errno coord_transfm_outside_projection_domain +accept 170.7991687984 -62.8345530934 +expect failure errno coord_transfm_outside_projection_domain +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect -28794.10 2152288.77 +accept -159.9563893280 71.5181717183 +expect -710378.63 1947553.99 +accept -139.1100287608 72.5807306253 +expect -1277834.99 1475741.38 +accept -119.6844932150 73.8160145972 +expect -1573951.28 897126.81 +accept -99.2835557046 74.0204664516 +expect -1764976.83 288463.51 +accept -79.7589672970 75.0775591038 +expect -1642126.09 -296646.71 +accept -59.3247479059 76.5851745566 +expect -1288854.48 -764485.02 +accept -39.7902268868 77.0657936158 +expect -924365.02 -1109855.48 +accept -19.7666667754 78.0413206451 +expect -451330.57 -1255957.46 +accept 0.2731990430 79.0490755914 +expect 5823.67 -1221382.92 +accept 10.9115419099 79.7152157770 +expect 217055.69 -1125960.00 +accept 30.7420972758 80.5901686038 +expect 536058.05 -901323.33 +accept 50.1425480782 81.1493341375 +expect 756982.36 -631979.34 +accept 70.9517084975 81.7646094071 +expect 867084.74 -299376.41 +accept 90.1847984189 82.9573597164 +expect 784087.78 2528.94 +accept 110.4406311958 83.6703375043 +expect 660181.04 246051.50 +accept 130.8429657164 84.7838043163 +expect 439087.14 379584.73 +accept 150.8488588999 85.8764976286 +expect 223444.70 400609.15 +accept 170.3972098164 87.6222109978 +expect 44112.34 260730.62 + + ------------------------------------------------------------ + operation +proj=peirce_q +R=6370997 +shape=shemisphere + tolerance 10 mm + ------------------------------------------------------------ + +accept -179.6126302052 -90.2440064745 +expect failure errno coord_transfm_invalid_coord +accept -159.2003712209 -89.5537263306 +expect -17621.38 46389.53 +accept -139.6233037328 -87.8821294926 +expect -152574.30 179422.00 +accept -119.6070748182 -86.3003323104 +expect -357795.67 203314.63 +accept -99.5789095738 -85.2121814625 +expect -525263.69 88642.74 +accept -79.2799350968 -83.8692118030 +expect -670454.30 -126926.46 +accept -59.1007316490 -82.6429522913 +expect -702926.44 -420679.26 +accept -39.7694988813 -81.1240616181 +expect -632625.04 -760124.60 +accept -19.4219986373 -80.4596653260 +expect -353564.94 -1002788.10 +accept 0.0372192405 -79.1830001774 +expect 783.63 -1206370.29 +accept 10.8072116146 -78.5286202425 +expect 239965.19 -1257129.40 +accept 30.6949420481 -77.5251356225 +expect 710891.44 -1197551.10 +accept 50.8838172783 -77.2075414406 +expect 1108267.66 -901172.98 +accept 70.9123606882 -75.6020670736 +expect 1520969.81 -526273.50 +accept 90.9423960847 -75.1187688922 +expect 1663808.33 27365.47 +accept 110.1071594840 -74.5087602471 +expect 1627496.65 595747.59 +accept 130.0104641839 -73.3709657282 +expect 1426353.21 1197258.60 +accept 150.5931126765 -73.1105693985 +expect 928808.49 1648072.07 +accept 170.3454770498 -72.3687427114 +expect 331324.45 1948059.70 +accept -179.4283603569 -79.2780817976 +expect -11928.97 1195644.94 +accept -159.6140419013 -78.9064235928 +expect -431033.97 1159916.58 +accept -139.5485387788 -78.1437071317 +expect -858427.30 1006822.50 +accept -119.3040589991 -77.1517896758 +expect -1251102.88 702179.27 +accept -99.1733290138 -76.2249333909 +expect -1519430.13 245348.39 +accept -79.5627247417 -75.2438944725 +expect -1622604.52 -298863.61 +accept -59.2065888779 -74.4787205556 +expect -1491756.45 -888974.50 +accept -39.4027491539 -73.6693258790 +expect -1160556.37 -1412792.72 +accept -19.3829588944 -72.8068670782 +expect -639189.89 -1817098.38 +accept 0.5951648774 -71.1110965727 +expect 22008.52 -2119304.75 +accept 10.0089578122 -71.1061903043 +expect 368360.71 -2087770.11 +accept 30.2470524798 -69.7155529444 +expect 1148080.66 -1969276.48 +accept 50.0855077954 -69.3112248587 +expect 1784147.42 -1492428.63 +accept 70.3496352985 -68.4437853274 +expect 2284402.54 -815371.10 +accept 90.4893702644 -66.7652070914 +expect 2619024.98 22354.00 +accept 110.3952984186 -65.8768496172 +expect 2552142.20 948295.92 +accept 130.3231133025 -64.8242212878 +expect 2169970.58 1841476.11 +accept 150.8384853690 -63.8483921906 +expect 1441591.72 2585079.51 +accept 170.7991687984 -62.8345530934 +expect 491492.54 3038208.93 +accept 170.6832502669 -105.0174505020 +expect failure errno coord_transfm_invalid_coord +accept 180.7137917600 105.8174218935 +expect failure errno coord_transfm_invalid_coord +accept -179.2332724818 70.8217746040 +expect failure errno coord_transfm_outside_projection_domain +accept -159.9563893280 71.5181717183 +expect failure errno coord_transfm_outside_projection_domain +accept -139.1100287608 72.5807306253 +expect failure errno coord_transfm_outside_projection_domain +accept -119.6844932150 73.8160145972 +expect failure errno coord_transfm_outside_projection_domain +accept -99.2835557046 74.0204664516 +expect failure errno coord_transfm_outside_projection_domain +accept -79.7589672970 75.0775591038 +expect failure errno coord_transfm_outside_projection_domain +accept -59.3247479059 76.5851745566 +expect failure errno coord_transfm_outside_projection_domain +accept -39.7902268868 77.0657936158 +expect failure errno coord_transfm_outside_projection_domain +accept -19.7666667754 78.0413206451 +expect failure errno coord_transfm_outside_projection_domain +accept 0.2731990430 79.0490755914 +expect failure errno coord_transfm_outside_projection_domain +accept 10.9115419099 79.7152157770 +expect failure errno coord_transfm_outside_projection_domain +accept 30.7420972758 80.5901686038 +expect failure errno coord_transfm_outside_projection_domain +accept 50.1425480782 81.1493341375 +expect failure errno coord_transfm_outside_projection_domain +accept 70.9517084975 81.7646094071 +expect failure errno coord_transfm_outside_projection_domain +accept 90.1847984189 82.9573597164 +expect failure errno coord_transfm_outside_projection_domain +accept 110.4406311958 83.6703375043 +expect failure errno coord_transfm_outside_projection_domain +accept 130.8429657164 84.7838043163 +expect failure errno coord_transfm_outside_projection_domain +accept 150.8488588999 85.8764976286 +expect failure errno coord_transfm_outside_projection_domain +accept 170.3972098164 87.6222109978 +expect failure errno coord_transfm_outside_projection_domain + +# Test inverse +------------------------------------------------------------ +operation +proj=peirce_q +shape=square +------------------------------------------------------------ + +#tolerance 1 mm +# has to bump to this for i386 +tolerance 150 mm + +accept 0 90 +expect 0 0 +roundtrip 1 + +accept 0 0 +expect 8361921.234827487729 -8361921.234827487729 +roundtrip 1 + +accept 0 -90 +expect 16723842.303160080686 -16723842.303160080686 +#tolerance 2 mm +roundtrip 1 +#tolerance 1 mm + +accept 0 45 +expect 3725360.212758612353 -3725360.212758612353 +roundtrip 1 + +accept 0 -45 +expect 12998482.090401465073 -12998482.090401465073 +roundtrip 1 + +accept 45 0 +tolerance 200 mm +expect 16723842.564696932212 -0.095041956369 +roundtrip 1 +tolerance 150 mm + +accept -45 0 +expect 0 -16723842.469654975459 +#roundtrip 1 + +accept 90 0 +expect 8361921.329869444482 8361921.329869444482 +roundtrip 1 + +accept -90 0 +expect -8361921.234827487729 -8361921.234827487729 +roundtrip 1 + +accept 135 0 +expect 0.095041956369 16723842.564696932212 +roundtrip 1 + +accept -135 0 +expect -16723842.430287310854 -0.039367665210 +#roundtrip 1 + +accept 179.99 0 +expect -8360808.039828131907 8363034.429826845415 +#roundtrip 1 + +accept -179.99 0 +expect -8363034.429826845415 8360808.039828131907 +#roundtrip 1 + +accept 45 45 +expect 5299570.257319082506 0 +roundtrip 1 + +accept -45 45 +expect 0 -5299570.257319079712 +roundtrip 1 + +accept 90 45 +expect 3725360.212758610491 3725360.212758610491 +roundtrip 1 + +accept -90 45 +expect -3725360.212758613285 -3725360.212758613285 +roundtrip 1 + +accept 135 45 +expect 0 5299570.257319079712 +roundtrip 1 + +accept -135 45 +expect -5299570.257319079712 0 +#roundtrip 1 + +accept 179.99 45 +expect -3724717.456456150394 3726002.863303491380 +roundtrip 1 + +accept -179.99 45 +expect -3726002.863303492777 3724717.456456151791 +roundtrip 1 + +accept 45 -45 +expect 16723842.303160080686 11424272.045840997249 +roundtrip 1 + +accept -45 -45 +expect 11424272.045840999112 -16723842.303160080686 +roundtrip 1 + +accept 90 -45 +expect 12998482.090401468799 12998482.090401468799 +roundtrip 1 + +accept -90 -45 +expect -12998482.090401465073 -12998482.090401465073 +roundtrip 1 + +accept 135 -45 +expect -11424272.045840999112 16723842.303160080686 +roundtrip 1 + +accept -135 -45 +expect -16723842.303160080686 -11424272.045840999112 +roundtrip 1 + +accept 179.99 -45 +expect -12997839.439856586978 12999124.846703927964 +roundtrip 1 + +accept -179.99 -45 +expect -12999124.846703927964 12997839.439856585115 +roundtrip 1 + +accept 45 -89.999 +expect 16723842.303160080686 16723730.983657168224 +#roundtrip 1 + +accept -45 -89.999 +expect 16723730.983657168224 -16723842.303160080686 +#roundtrip 1 + +accept 90 -89.999 +expect 16723763.588384689763 16723763.588384689763 +roundtrip 1 + +accept -90 -89.999 +expect -16723763.588384689763 -16723763.588384689763 +roundtrip 1 + +accept 135 -89.999 +expect -16723730.983657168224 16723842.303160080686 +#roundtrip 1 + +accept -135 -89.999 +expect -16723842.303160080686 -16723730.983657168224 +#roundtrip 1 + +accept 179.99 -89.999 +expect -16723763.588384689763 16723763.588384689763 +#roundtrip 1 + +accept -179.99 -89.999 +expect -16723763.588384689763 16723763.588384689763 +#roundtrip 1 + +# Test inverse +------------------------------------------------------------ +operation +proj=peirce_q +shape=diamond +------------------------------------------------------------ + +#tolerance 1 mm +# has to bump to this for i386 +tolerance 150 mm + +accept 0 90 +expect 0 0 +roundtrip 1 + +accept 0 -90 +#tolerance 10 mm +expect 0 -23651084.600117880851 +roundtrip 1 +#tolerance 1 mm + +accept 0 45 +expect 0 -5268454.937608348206 +roundtrip 1 + +accept 0 -45 +expect 0 -18382629.662509534508 +roundtrip 1 + +accept 45 0 +tolerance 200 mm +expect 11825542.417788611725 -11825542.552198234946 +roundtrip 1 +tolerance 150 mm + +accept -45 0 +expect -11825542.417788611725 -11825542.417788611725 +roundtrip 1 + +accept 90 0 +expect 11825542.552198234946 0.000000000000 +roundtrip 1 + +accept -90 0 +expect -11825542.417788611725 0.000000000000 +#tolerance 20 mm +#roundtrip 1 +#tolerance 1 mm + +accept 135 0 +expect 11825542.552198234946 11825542.417788611725 +roundtrip 1 + +accept -135 0 +expect -11825542.417788611725 11825542.362114325166 +roundtrip 1 + +accept 179.99 0 +expect 1574.295465656175 11825542.417788611725 +#tolerance 200 mm +#roundtrip 1 +#tolerance 1 mm + +accept -179.99 0 +expect -1574.295465656175 11825542.417788611725 +#tolerance 30 mm +#roundtrip 1 +#tolerance 1 mm + +accept 45 45 +expect 3747362.066324858926 -3747362.066324859392 +roundtrip 1 + +accept -45 45 +expect -3747362.066324857529 -3747362.066324857995 +roundtrip 1 + +accept 90 45 +expect 5268454.937608345412 0.000000000000 +#roundtrip 1 + +accept -90 45 +expect -5268454.937608350068 0.000000000000 +#roundtrip 1 + +accept 135 45 +expect 3747362.066324858926 3747362.066324857995 +roundtrip 1 + +accept -135 45 +expect -3747362.066324857529 3747362.066324857529 +roundtrip 1 + +accept 179.99 45 +expect 908.919898338959 5268454.862826444209 +roundtrip 1 + +accept -179.99 45 +expect -908.919898338959 5268454.862826446071 +roundtrip 1 + +accept 45 -45 +expect 19903722.533793020993 -3747362.066324859392 +roundtrip 1 + +accept -45 -45 +expect -3747362.066324857529 -19903722.533793020993 +roundtrip 1 + +accept 90 -45 +expect 18382629.662509534508 0.000000000000 +roundtrip 1 + +accept -90 -45 +expect -18382629.662509530783 0.000000000000 +#tolerance 3 mm +#roundtrip 1 +#tolerance 1 mm + +accept 135 -45 +expect 3747362.066324858926 19903722.533793020993 +roundtrip 1 + +accept -135 -45 +expect -19903722.533793020993 3747362.066324857529 +roundtrip 1 + +accept 179.99 -45 +expect 908.919898338959 18382629.737291436642 +#roundtrip 1 + +accept -179.99 -45 +expect -908.919898338959 18382629.737291432917 +roundtrip 1 + +accept 45 -89.999 +expect 23651005.885342493653 -78.714775386137 +#roundtrip 1 + +accept -45 -89.999 +expect -78.714775386137 -23651005.885342493653 +#roundtrip 1 + +accept 90 -89.999 +expect 23650973.280614964664 0.000000000000 +#roundtrip 1 + +accept -90 -89.999 +expect -23650973.280614964664 0.000000000000 +#roundtrip 1 + +accept 135 -89.999 +expect 78.714775386137 23651005.885342493653 +#roundtrip 1 + +accept -135 -89.999 +expect -23651005.885342493653 78.714775386137 +#roundtrip 1 + +accept 179.99 -89.999 +expect 0.000000000000 23650973.280614964664 +#roundtrip 1 + +accept -179.99 -89.999 +expect 0.000000000000 23650973.280614964664 +#roundtrip 1 + + diff --git a/conformance/src/test/resources/gie/spilhaus.gie b/conformance/src/test/resources/gie/spilhaus.gie new file mode 100644 index 0000000..5c2c439 --- /dev/null +++ b/conformance/src/test/resources/gie/spilhaus.gie @@ -0,0 +1,449 @@ + + +------------------------------------------------------------ +# Roundtrips over the whole globe +------------------------------------------------------------ +operation +proj=spilhaus +tolerance 1.5 mm + +accept -20.1 74.1 +roundtrip 10 + +tolerance 10 mm + +accept -170.0000 -80.0000 +roundtrip 10 + +accept -170.0000 -50.0000 +roundtrip 10 + +accept -170.0000 -20.0000 +roundtrip 10 + +accept -170.0000 10.0000 +roundtrip 10 + +accept -170.0000 40.0000 +roundtrip 10 + +accept -170.0000 70.0000 +roundtrip 10 + +accept -121.0000 -80.0000 +roundtrip 10 + +accept -121.0000 -50.0000 +roundtrip 10 + +accept -121.0000 -20.0000 +roundtrip 10 + +accept -121.0000 10.0000 +roundtrip 10 + +accept -121.0000 40.0000 +roundtrip 10 + +accept -121.0000 70.0000 +roundtrip 10 + +accept -72.0000 -80.0000 +roundtrip 10 + +accept -72.0000 -50.0000 +roundtrip 10 + +accept -72.0000 -20.0000 +roundtrip 10 + +accept -72.0000 10.0000 +roundtrip 10 + +accept -72.0000 40.0000 +roundtrip 10 + +accept -72.0000 70.0000 +roundtrip 10 + +accept -23.0000 -80.0000 +roundtrip 10 + +accept -23.0000 -50.0000 +roundtrip 10 + +accept -23.0000 -20.0000 +roundtrip 10 + +accept -23.0000 10.0000 +roundtrip 10 + +accept -23.0000 40.0000 +roundtrip 10 + +accept -23.0000 70.0000 +roundtrip 10 + +accept 26.0000 -80.0000 +roundtrip 10 + +accept 26.0000 -50.0000 +roundtrip 10 + +accept 26.0000 -20.0000 +roundtrip 10 + +accept 26.0000 10.0000 +roundtrip 10 + +accept 26.0000 40.0000 +roundtrip 10 + +accept 26.0000 70.0000 +roundtrip 10 + +accept 75.0000 -80.0000 +roundtrip 10 + +accept 75.0000 -50.0000 +roundtrip 10 + +accept 75.0000 -20.0000 +roundtrip 10 + +accept 75.0000 10.0000 +roundtrip 10 + +accept 75.0000 40.0000 +roundtrip 10 + +accept 75.0000 70.0000 +roundtrip 10 + +accept 124.0000 -80.0000 +roundtrip 10 + +accept 124.0000 -50.0000 +roundtrip 10 + +accept 124.0000 -20.0000 +roundtrip 10 + +accept 124.0000 10.0000 +roundtrip 10 + +accept 124.0000 40.0000 +roundtrip 10 + +accept 124.0000 70.0000 +roundtrip 10 + +accept 173.0000 -80.0000 +roundtrip 10 + +accept 173.0000 -50.0000 +roundtrip 10 + +accept 173.0000 -20.0000 +roundtrip 10 + +accept 173.0000 10.0000 +roundtrip 10 + +accept 173.0000 40.0000 +roundtrip 10 + +accept 173.0000 70.0000 +roundtrip 10 + +------------------------------------------------------------ +# This gie part was initially generated with a python library +# provided in the issue #1851, correcting the applying a factor +# due to the conformal latitude (explained in the issue). +# It can be edited. +------------------------------------------------------------ +operation +proj=spilhaus +tolerance 1 mm +------------------------------------------------------------ +accept -170.0000 -80.0000 +expect 437478.9752 -2678050.3019 + +accept -170.0000 -50.0000 +expect 2186914.6725 -3372185.4149 + +accept -170.0000 -20.0000 +expect 4059707.8321 -3830282.4180 + +accept -170.0000 10.0000 +expect 6210065.9010 -4208321.1110 + +accept -170.0000 40.0000 +expect 8929858.8196 -4592610.8117 + +accept -170.0000 70.0000 +expect -4757306.7162 11243170.7712 + +accept -121.0000 -80.0000 +expect 9363.8168 -3012575.4761 + +accept -121.0000 -50.0000 +expect 861573.2313 -5086159.8537 + +accept -121.0000 -20.0000 +expect 2601135.1803 -6940740.0711 + +accept -121.0000 10.0000 +expect 5016978.6482 -8304150.6170 + +accept -121.0000 40.0000 +expect 8632125.8964 -9423801.4294 + +accept -121.0000 70.0000 +expect -6555705.6060 10246990.6251 + +accept -72.0000 -80.0000 +expect -551816.0501 -2880353.7707 + +accept -72.0000 -50.0000 +expect -2313351.2791 -5115437.4974 + +accept -72.0000 -20.0000 +expect -1486391.8298 -11562191.5568 + +accept -72.0000 10.0000 +expect -10414594.4936 2712423.6966 + +accept -72.0000 40.0000 +expect -9084246.6998 5766099.6436 + +accept -72.0000 70.0000 +expect -6598697.0383 8193941.7590 + +accept -23.0000 -80.0000 +expect -780311.9008 -2349988.7659 + +accept -23.0000 -50.0000 +expect -3008092.3663 -1795023.1904 + +accept -23.0000 -20.0000 +expect -4925434.4371 14366.0251 + +accept -23.0000 10.0000 +expect -5706896.4172 2337607.2418 + +accept -23.0000 40.0000 +expect -5776514.0258 4647657.5555 + +accept -23.0000 70.0000 +expect -5300606.7236 7143600.3698 + +accept 26.0000 -80.0000 +expect -524250.2015 -1871449.2525 + +accept 26.0000 -50.0000 +expect -1461547.3198 -290174.5921 + +accept 26.0000 -20.0000 +expect -2077751.7222 1349250.8096 + +accept 26.0000 10.0000 +expect -2553361.5158 3054667.1747 + +accept 26.0000 40.0000 +expect -3067668.6963 4947317.2297 + +accept 26.0000 70.0000 +expect -3829081.3051 7195256.6513 + +accept 75.0000 -80.0000 +expect -30320.7348 -1747777.5703 + +accept 75.0000 -50.0000 +expect 283794.2879 -63915.9519 + +accept 75.0000 -20.0000 +expect 570564.7027 1640770.3960 + +accept 75.0000 10.0000 +expect 613441.1718 3718159.4411 + +accept 75.0000 40.0000 +expect -339352.8544 6281442.7842 + +accept 75.0000 70.0000 +expect -2680263.1124 8214231.7220 + +accept 124.0000 -80.0000 +expect 391373.4223 -2010028.8376 + +accept 124.0000 -50.0000 +expect 1778858.7692 -974740.5396 + +accept 124.0000 -20.0000 +expect 3251942.8279 194105.3840 + +accept 124.0000 10.0000 +expect 5502810.9250 1869559.2284 + +accept 124.0000 40.0000 +expect 11560747.4458 1351438.2908 + +accept 124.0000 70.0000 +expect -2631686.3455 9979887.6971 + +accept 173.0000 -80.0000 +expect 497943.3567 -2503256.4284 + +accept 173.0000 -50.0000 +expect 2305199.5165 -2711772.3441 + +accept 173.0000 -20.0000 +expect 4178078.2257 -2771571.4407 + +accept 173.0000 10.0000 +expect 6367897.0128 -2860121.0611 + +accept 173.0000 40.0000 +expect 9145287.0568 -3248602.9252 + +accept 173.0000 70.0000 +expect -4081581.4885 11169069.7425 + +------------------------------------------------------------ +# This gie part was got from ESRI computations +# provided in the issue #1851 +# It can be edited. +------------------------------------------------------------ +operation +proj=spilhaus +k_0=1.4142135623730951 +tolerance 0.9 m +------------------------------------- +accept 14.47226253 -84.71287749 +expect -546875 -3046875 + +accept 84.55256518 -37.93882855 +expect 1171875 703125 + +accept -66.58783346 27.86168989 +expect -13046875 6171875 + +accept 12.77715082 51.22645041 +expect -5546875 7890625 + +accept 114.35091069 28.44647901 +expect 10703125 10234375 + +accept -58.76182587 -12.11844904 +expect -13046875 -703125 + +accept 141.57916998 16.05031911 +expect 9765625 78125 + +accept -64.1956924 -30.60226899 +expect -11796875 -10859375 + +accept -83.61985956 -31.09509756 +expect -1796875 -11796875 + +accept -118.96768373 14.44661994 +expect 7578125 -12265625 + +accept -145.850344 50.26449114 +expect 14296875 -9296875 + +accept -116.22716741 44.95066182 +expect 13515625 -14609375 + +accept -112.96622187 49.30990506 +expect 15859375 -16484375 + +accept 114.98472216 29.97596772 +expect 14453125 14453125 + +accept -112.21827126 50.16610427 +expect -15546875 15703125 + +accept -64.99929833 -30.00238885 +expect -15390625 -15546875 + +------------------------------------------------------------ +# Stable for default parameters +------------------------------------------------------------ +operation +proj=spilhaus +rot=45 +k_0=1 +lat_0=-49.56371678 +lon_0=66.94970198 +azi=40.17823482 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3733410.0118 -9320.8573 +roundtrip 1 + +------------------------------------------------------------ +# Sentitive to input parameters +------------------------------------------------------------ +operation +proj=spilhaus +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3733410.0118 -9320.8573 +roundtrip 1 +------------------------------------------------------------ +operation +proj=spilhaus +lon_0=10.1 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 4343770.7991 -3701935.6242 +roundtrip 1 +------------------------------------------------------------ +operation +proj=spilhaus +lat_0=30.1 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3637341.2895 -2571368.8666 +roundtrip 1 +------------------------------------------------------------ +operation +proj=spilhaus +azi=9.1 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3061806.4542 -1678791.7428 +roundtrip 1 +------------------------------------------------------------ +operation +proj=spilhaus +rot=40.1 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3720561.6630 309609.603620 +roundtrip 1 +------------------------------------------------------------ +operation +proj=spilhaus +k_0=0.9 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3360069.0106 -8388.7716 +roundtrip 1 + +------------------------------------------------------------ +# Sphere +------------------------------------------------------------ +operation +proj=spilhaus +R=6378137 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 3737644.5177 -7049.7883 +roundtrip 1 + +------------------------------------------------------------ +# vs Adams WS2 +------------------------------------------------------------ +operation +proj=adams_ws2 +R=6378137 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 8199312.0391 -1392652.9172 +roundtrip 1 +------------------------------------------------------------ +operation +proj=spilhaus +R=6378137 +lon_0=0 +lat_0=0 +azi=0 +rot=0 +tolerance 1 mm +------------------------------------------------------------ +accept 130.4 -16.2 +expect 8199312.0391 -1392652.9172 +roundtrip 1 + + diff --git a/conformance/src/test/resources/gie/tinshift.gie b/conformance/src/test/resources/gie/tinshift.gie new file mode 100644 index 0000000..8500953 --- /dev/null +++ b/conformance/src/test/resources/gie/tinshift.gie @@ -0,0 +1,62 @@ + +------------------------------------------------------------------------------- +=============================================================================== +Test +proj=tinshift +=============================================================================== + + + +# Missing +file +operation +proj=tinshift +expect failure errno invalid_op_missing_arg + +# +file doesn't point to an existing file +operation +proj=tinshift +file=i_do_not_exist +expect failure errno invalid_op_file_not_found_or_invalid + +# Not a JSON file +operation +proj=tinshift +file=proj.ini +expect failure errno invalid_op_file_not_found_or_invalid + + +# Tests on a file without explicit CRS +operation +proj=tinshift +file=tests/tinshift_crs_implicit.json +accept 2 49 +expect 2.1 49.1 +roundtrip 1 + +accept 0 0 +expect failure + +direction inverse +accept 0 0 +expect failure + + +# Tests on a file with explicit CRS +operation +proj=tinshift +file=tests/tinshift_simplified_kkj_etrs.json +tolerance 0.1 mm +# Verified with https://kartta.paikkatietoikkuna.fi/?lang=en with EPSG:2393 to EPSG:3067 +accept 3210000.0000 6700000.0000 +expect 209948.3217 6697187.0009 +roundtrip 1 + +operation +proj=tinshift +file=tests/tinshift_simplified_n60_n2000.json +tolerance 0.1 mm +accept 3210000.0000 6700000.0000 10.0 +expect 3210000.0000 6700000.0000 10.2886 +roundtrip 1 + +# Test fallback strategy nearest_side +operation +proj=tinshift +file=tests/tinshift_fallback_nearest_side.json +accept 2 3 +expect 4 6 +roundtrip 1 + +# Test fallback strategy nearest_centroid +operation +proj=tinshift +file=tests/tinshift_fallback_nearest_centroid.json +accept 3 0 +expect 3 0 +roundtrip 1 + + diff --git a/conformance/src/test/resources/gie/unitconvert.gie b/conformance/src/test/resources/gie/unitconvert.gie new file mode 100644 index 0000000..9c7a9e4 --- /dev/null +++ b/conformance/src/test/resources/gie/unitconvert.gie @@ -0,0 +1,70 @@ +------------------------------------------------------------------------------- + Tests for the unitconvert operation +------------------------------------------------------------------------------- + + + +operation proj=unitconvert xy_in=m xy_out=dm z_in=cm z_out=mm +tolerance 0.1 +accept 55.25 23.23 45.5 +expect 552.5 232.3 455.0 + +operation proj=unitconvert +xy_in=m +xy_out=m +z_in=m +z_out=m +tolerance 0.1 +accept 12.3 45.6 7.89 +expect 12.3 45.6 7.89 + +operation proj=unitconvert xy_in=dm xy_out=dm +tolerance 0.1 +accept 1 1 1 1 +expect 1 1 1 1 + + +operation proj=unitconvert xy_in=2.0 xy_out=4.0 +tolerance 0.1 +accept 1 1 1 1 +expect 0.5 0.5 1 1 + +operation proj=unitconvert xy_in=deg xy_out=rad +tolerance 0.0000001 +accept 1 1 1 1 +expect 1 1 1 1 # gie does a rad->deg conversion behind the scenes + +operation proj=unitconvert xy_in=grad xy_out=deg +tolerance 0.000000000001 +accept 50 50 1 1 +expect 45 45 1 1 + +operation proj=unitconvert xy_in=m xy_out=rad +accept 1 1 1 1 +expect failure + +operation proj=unitconvert z_in=rad z_out=m +accept 1 1 1 1 +expect failure + +operation proj=unitconvert xy_in=0 +expect failure + +operation proj=unitconvert xy_out=0 +expect failure + +operation proj=unitconvert xy_in=1e400 +expect failure + +operation proj=unitconvert xy_out=1e400 +expect failure + +operation proj=unitconvert z_in=0 +expect failure + +operation proj=unitconvert z_out=0 +expect failure + +operation proj=unitconvert z_in=1e400 +expect failure + +operation proj=unitconvert z_out=1e400 +expect failure + + diff --git a/conformance/src/test/resources/gigs/5101.1-jhs.gie b/conformance/src/test/resources/gigs/5101.1-jhs.gie new file mode 100644 index 0000000..e3fcff6 --- /dev/null +++ b/conformance/src/test/resources/gigs/5101.1-jhs.gie @@ -0,0 +1,734 @@ +-------------------------------------------------------------------------------- + +Test 5101 (part 1), Transverse Mercator, v2-0_2011-06-28, recommended JHS formula + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4326 +inv \ + +step +proj=etmerc +lat_0=49 +lon_0=-2 +k_0=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=WGS84 +units=m +no_def +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 3 80 +expect 496813.178 3358297.326 + +tolerance 0.03 m +accept 2.9999999 60 +expect 678711.584 1134498.83 + +tolerance 0.03 m +accept 3 49 +expect 765648.501 -87944.74 + +tolerance 0.03 m +accept 3.0000001 40 +expect 826893.845 -1087710.121 + +tolerance 0.03 m +accept 3 20 +expect 923539.353 -3308151.625 + +tolerance 0.03 m +accept 3 0 +expect 957087.829 -5527462.686 + +tolerance 0.03 m +accept 3 -20 +expect 923539.353 -7746773.748 + +tolerance 0.03 m +accept 3 -40 +expect 826893.845 -9967215.251 + +tolerance 0.03 m +accept 3 -60 +expect 678711.584 -12189424.202 + +tolerance 0.03 m +accept 3 -80 +expect 496813.178 -14413222.698 + +tolerance 0.03 m +accept -2 80 +expect 400000 3354134.429 + +tolerance 0.03 m +accept -2 60 +expect 400000 1123956.966 + +tolerance 0.03 m +accept -2 49 +expect 400000 -100000 + +tolerance 0.03 m +accept -2 40 +expect 400000 -1099699.834 + +tolerance 0.03 m +accept -2 20 +expect 400000 -3315978.565 + +tolerance 0.03 m +accept -2 0 +expect 400000 -5527462.686 + +tolerance 0.03 m +accept -2 -20 +expect 400000 -7738946.807 + +tolerance 0.03 m +accept -2 -40 +expect 400000 -9955225.538 + +tolerance 0.03 m +accept -2 -60 +expect 400000 -12178882.338 + +tolerance 0.03 m +accept -2 -80 +expect 400000 -14409059.801 + +tolerance 0.03 m +accept -5 80 +expect 341867.711 3355633.571 + +tolerance 0.03 m +accept -5 60 +expect 232704.966 1127751.264 + +tolerance 0.03 m +accept -5 49 +expect 180586.02 -95662.911 + +tolerance 0.03 m +accept -5 40 +expect 143900.026 -1095387.991 + +tolerance 0.03 m +accept -5 20 +expect 86073.28 -3313165.843 + +tolerance 0.03 m +accept -5 0 +expect 66021.018 -5527462.686 + +tolerance 0.03 m +accept -5 -20 +expect 86073.28 -7741759.529 + +tolerance 0.03 m +accept -5 -40 +expect 143900.026 -9959537.381 + +tolerance 0.03 m +accept -5 -60 +expect 232704.966 -12182676.637 + +tolerance 0.03 m +accept -5 -80 +expect 341867.711 -14410558.943 + +tolerance 0.03 m +accept -7.5559037 49.7661327 +expect 0 0 + +tolerance 0.03 m +accept -5 0 +expect 66021.018 -5527462.686 + +tolerance 0.03 m +accept -4 0 +expect 177404.277 -5527462.686 + +tolerance 0.03 m +accept -3 0 +expect 288719.208 -5527462.686 + +tolerance 0.03 m +accept -2 0 +expect 400000.0 -5527462.686 + +tolerance 0.03 m +accept -1 0 +expect 511280.792 -5527462.686 + +tolerance 0.03 m +accept 0 0 +expect 622595.723 -5527462.686 + +tolerance 0.03 m +accept 1 0 +expect 733978.982 -5527462.686 + +tolerance 0.03 m +accept 2 0 +expect 845464.865 -5527462.686 + +tolerance 0.03 m +accept 3 0 +expect 957087.829 -5527462.686 + +tolerance 0.03 m +accept 4 0 +expect 1068882.539 -5527462.686 + +tolerance 0.03 m +accept 5 0 +expect 1180883.933 -5527462.686 + +tolerance 0.03 m +accept 6 0 +expect 1293127.266 -5527462.686 + +tolerance 0.03 m +accept 7 0 +expect 1405648.179 -5527462.686 + +tolerance 0.03 m +accept 8 0 +expect 1518482.747 -5527462.686 + +tolerance 0.03 m +accept -5 60 +expect 232704.966 1127751.264 + +tolerance 0.03 m +accept -4 60 +expect 288455.816 1125643.213 + +tolerance 0.03 m +accept -3 60 +expect 344223.662 1124378.512 + +tolerance 0.03 m +accept -2 60 +expect 400000 1123956.966 + +tolerance 0.03 m +accept -1 60 +expect 455776.338 1124378.512 + +tolerance 0.03 m +accept 0 60 +expect 511544.184 1125643.213 + +tolerance 0.03 m +accept 1 60 +expect 567295.034 1127751.264 + +tolerance 0.03 m +accept 2 60 +expect 623020.357 1130702.987 + +tolerance 0.03 m +accept 3 60 +expect 678711.584 1134498.83 + +tolerance 0.03 m +accept 4.0 60.0 +expect 734360.093 1139139.367 + +tolerance 0.03 m +accept 5.0 60.0 +expect 789957.197 1144625.296 + +tolerance 0.03 m +accept 6.0 60.0 +expect 845494.132 1150957.434 + +tolerance 0.03 m +accept 7.0 60.0 +expect 900962.042 1158136.713 + +tolerance 0.03 m +accept 8.0 60.0 +expect 956351.967 1166164.18 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=etmerc +lat_0=49 +lon_0=-2 +k_0=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=WGS84 +units=m +no_def +inv \ + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 496813.178 3358297.326 +expect 3 80 + +tolerance 0.03 m +accept 678711.584 1134498.83 +expect 2.9999999 60 + +tolerance 0.03 m +accept 765648.501 -87944.74 +expect 3 49 + +tolerance 0.03 m +accept 826893.845 -1087710.121 +expect 3.0000001 40 + +tolerance 0.03 m +accept 923539.353 -3308151.625 +expect 3 20 + +tolerance 0.03 m +accept 957087.829 -5527462.686 +expect 3 0 + +tolerance 0.03 m +accept 923539.353 -7746773.748 +expect 3 -20 + +tolerance 0.03 m +accept 826893.845 -9967215.251 +expect 3 -40 + +tolerance 0.03 m +accept 678711.584 -12189424.202 +expect 3 -60 + +tolerance 0.03 m +accept 496813.178 -14413222.698 +expect 3 -80 + +tolerance 0.03 m +accept 400000 3354134.429 +expect -2 80 + +tolerance 0.03 m +accept 400000 1123956.966 +expect -2 60 + +tolerance 0.03 m +accept 400000 -100000 +expect -2 49 + +tolerance 0.03 m +accept 400000 -1099699.834 +expect -2 40 + +tolerance 0.03 m +accept 400000 -3315978.565 +expect -2 20 + +tolerance 0.03 m +accept 400000 -5527462.686 +expect -2 0 + +tolerance 0.03 m +accept 400000 -7738946.807 +expect -2 -20 + +tolerance 0.03 m +accept 400000 -9955225.538 +expect -2 -40 + +tolerance 0.03 m +accept 400000 -12178882.338 +expect -2 -60 + +tolerance 0.03 m +accept 400000 -14409059.801 +expect -2 -80 + +tolerance 0.03 m +accept 341867.711 3355633.571 +expect -5 80 + +tolerance 0.03 m +accept 232704.966 1127751.264 +expect -5 60 + +tolerance 0.03 m +accept 180586.02 -95662.911 +expect -5 49 + +tolerance 0.03 m +accept 143900.026 -1095387.991 +expect -5 40 + +tolerance 0.03 m +accept 86073.28 -3313165.843 +expect -5 20 + +tolerance 0.03 m +accept 66021.018 -5527462.686 +expect -5 0 + +tolerance 0.03 m +accept 86073.28 -7741759.529 +expect -5 -20 + +tolerance 0.03 m +accept 143900.026 -9959537.381 +expect -5 -40 + +tolerance 0.03 m +accept 232704.966 -12182676.637 +expect -5 -60 + +tolerance 0.03 m +accept 341867.711 -14410558.943 +expect -5 -80 + +tolerance 0.03 m +accept 0 0 +expect -7.5559037 49.7661327 + +tolerance 0.03 m +accept 66021.018 -5527462.686 +expect -5 0 + +tolerance 0.03 m +accept 177404.277 -5527462.686 +expect -4 0 + +tolerance 0.03 m +accept 288719.208 -5527462.686 +expect -3 0 + +tolerance 0.03 m +accept 400000.0 -5527462.686 +expect -2 0 + +tolerance 0.03 m +accept 511280.792 -5527462.686 +expect -1 0 + +tolerance 0.03 m +accept 622595.723 -5527462.686 +expect 0 0 + +tolerance 0.03 m +accept 733978.982 -5527462.686 +expect 1 0 + +tolerance 0.03 m +accept 845464.865 -5527462.686 +expect 2 0 + +tolerance 0.03 m +accept 957087.829 -5527462.686 +expect 3 0 + +tolerance 0.03 m +accept 1068882.539 -5527462.686 +expect 4 0 + +tolerance 0.03 m +accept 1180883.933 -5527462.686 +expect 5 0 + +tolerance 0.03 m +accept 1293127.266 -5527462.686 +expect 6 0 + +tolerance 0.03 m +accept 1405648.179 -5527462.686 +expect 7 0 + +tolerance 0.03 m +accept 1518482.747 -5527462.686 +expect 8 0 + +tolerance 0.03 m +accept 232704.966 1127751.264 +expect -5 60 + +tolerance 0.03 m +accept 288455.816 1125643.213 +expect -4 60 + +tolerance 0.03 m +accept 344223.662 1124378.512 +expect -3 60 + +tolerance 0.03 m +accept 400000 1123956.966 +expect -2 60 + +tolerance 0.03 m +accept 455776.338 1124378.512 +expect -1 60 + +tolerance 0.03 m +accept 511544.184 1125643.213 +expect 0 60 + +tolerance 0.03 m +accept 567295.034 1127751.264 +expect 1 60 + +tolerance 0.03 m +accept 623020.357 1130702.987 +expect 2 60 + +tolerance 0.03 m +accept 678711.584 1134498.83 +expect 3 60 + +tolerance 0.03 m +accept 734360.093 1139139.367 +expect 4.0 60.0 + +tolerance 0.03 m +accept 789957.197 1144625.296 +expect 5.0 60.0 + +tolerance 0.03 m +accept 845494.132 1150957.434 +expect 6.0 60.0 + +tolerance 0.03 m +accept 900962.042 1158136.713 +expect 7.0 60.0 + +tolerance 0.03 m +accept 956351.967 1166164.18 +expect 8.0 60.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4326 +inv \ + +step +proj=etmerc +lat_0=49 +lon_0=-2 +k_0=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=WGS84 +units=m +no_def +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 3 80 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9999999 60 +roundtrip 1000 + +tolerance 0.006 m +accept 3 49 +roundtrip 1000 + +tolerance 0.006 m +accept 3.0000001 40 +roundtrip 1000 + +tolerance 0.006 m +accept 3 20 +roundtrip 1000 + +tolerance 0.006 m +accept 3 0 +roundtrip 1000 + +tolerance 0.006 m +accept 3 -20 +roundtrip 1000 + +tolerance 0.006 m +accept 3 -40 +roundtrip 1000 + +tolerance 0.006 m +accept 3 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 3 -80 +roundtrip 1000 + +tolerance 0.006 m +accept -2 80 +roundtrip 1000 + +tolerance 0.006 m +accept -2 60 +roundtrip 1000 + +tolerance 0.006 m +accept -2 49 +roundtrip 1000 + +tolerance 0.006 m +accept -2 40 +roundtrip 1000 + +tolerance 0.006 m +accept -2 20 +roundtrip 1000 + +tolerance 0.006 m +accept -2 0 +roundtrip 1000 + +tolerance 0.006 m +accept -2 -20 +roundtrip 1000 + +tolerance 0.006 m +accept -2 -40 +roundtrip 1000 + +tolerance 0.006 m +accept -2 -60 +roundtrip 1000 + +tolerance 0.006 m +accept -2 -80 +roundtrip 1000 + +tolerance 0.006 m +accept -5 80 +roundtrip 1000 + +tolerance 0.006 m +accept -5 60 +roundtrip 1000 + +tolerance 0.006 m +accept -5 49 +roundtrip 1000 + +tolerance 0.006 m +accept -5 40 +roundtrip 1000 + +tolerance 0.006 m +accept -5 20 +roundtrip 1000 + +tolerance 0.006 m +accept -5 0 +roundtrip 1000 + +tolerance 0.006 m +accept -5 -20 +roundtrip 1000 + +tolerance 0.006 m +accept -5 -40 +roundtrip 1000 + +tolerance 0.006 m +accept -5 -60 +roundtrip 1000 + +tolerance 0.006 m +accept -5 -80 +roundtrip 1000 + +tolerance 0.006 m +accept -7.5559037 49.7661327 +roundtrip 1000 + +tolerance 0.006 m +accept -5 0 +roundtrip 1000 + +tolerance 0.006 m +accept -4 0 +roundtrip 1000 + +tolerance 0.006 m +accept -3 0 +roundtrip 1000 + +tolerance 0.006 m +accept -2 0 +roundtrip 1000 + +tolerance 0.006 m +accept -1 0 +roundtrip 1000 + +tolerance 0.006 m +accept 0 0 +roundtrip 1000 + +tolerance 0.006 m +accept 1 0 +roundtrip 1000 + +tolerance 0.006 m +accept 2 0 +roundtrip 1000 + +tolerance 0.006 m +accept 3 0 +roundtrip 1000 + +tolerance 0.006 m +accept 4 0 +roundtrip 1000 + +tolerance 0.006 m +accept 5 0 +roundtrip 1000 + +tolerance 0.006 m +accept 6 0 +roundtrip 1000 + +tolerance 0.006 m +accept 7 0 +roundtrip 1000 + +tolerance 0.006 m +accept 8 0 +roundtrip 1000 + +tolerance 0.006 m +accept -5 60 +roundtrip 1000 + +tolerance 0.006 m +accept -4 60 +roundtrip 1000 + +tolerance 0.006 m +accept -3 60 +roundtrip 1000 + +tolerance 0.006 m +accept -2 60 +roundtrip 1000 + +tolerance 0.006 m +accept -1 60 +roundtrip 1000 + +tolerance 0.006 m +accept 0 60 +roundtrip 1000 + +tolerance 0.006 m +accept 1 60 +roundtrip 1000 + +tolerance 0.006 m +accept 2 60 +roundtrip 1000 + +tolerance 0.006 m +accept 3 60 +roundtrip 1000 + +tolerance 0.006 m +accept 4.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 5.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 6.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 7.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 8.0 60.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5101.2-jhs.gie b/conformance/src/test/resources/gigs/5101.2-jhs.gie new file mode 100644 index 0000000..76c72b6 --- /dev/null +++ b/conformance/src/test/resources/gigs/5101.2-jhs.gie @@ -0,0 +1,302 @@ +-------------------------------------------------------------------------------- + +Test 5101 (part 2), Transverse Mercator, v2-0_2011-06-28, recommended JHS formula + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4326 +inv \ + +step +init=epsg:32631 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept -2.0 80.0 +expect 403186.945 8885748.708 + +tolerance 0.03 m +accept -2.0 60.0 +expect 221288.77 6661953.041 + +tolerance 0.03 m +accept -2.0 40.0 +expect 73106.698 4439746.917 + +tolerance 0.03 m +accept -2.0 20.0 +expect -23538.687 2219308.238 + +tolerance 0.03 m +accept -2.0 0.0 +expect -57087.12 0.0 + +tolerance 0.03 m +accept -2.0 -20.0 +expect -23538.687 -2219308.238 + +tolerance 0.03 m +accept -2.0 -40.0 +expect 73106.698 -4439746.917 + +tolerance 0.03 m +accept -2.0 -60.0 +expect 221288.77 -6661953.041 + +tolerance 0.03 m +accept -2.0 -80.0 +expect 403186.945 -8885748.708 + +tolerance 0.03 m +accept -5.0 60.0 +expect 54506.435 6678411.623 + +tolerance 0.03 m +accept -4.0 60.0 +expect 110043.299 6672079.494 + +tolerance 0.03 m +accept -3.0 60.0 +expect 165640.332 6666593.572 + +tolerance 0.03 m +accept -2.0 60.0 +expect 221288.77 6661953.041 + +tolerance 0.03 m +accept -1.0 60.0 +expect 276979.926 6658157.202 + +tolerance 0.03 m +accept 0.0 60.0 +expect 332705.179 6655205.484 + +tolerance 0.03 m +accept 1.0 60.0 +expect 388455.958 6653097.435 + +tolerance 0.03 m +accept 2.0 60.0 +expect 444223.733 6651832.735 + +tolerance 0.03 m +accept 3.0 60.0 +expect 500000.0 6651411.19 + +tolerance 0.03 m +accept 4.0 60.0 +expect 555776.267 6651832.735 + +tolerance 0.03 m +accept 5.0 60.0 +expect 611544.042 6653097.435 + +tolerance 0.03 m +accept 6.0 60.0 +expect 667294.821 6655205.484 + +tolerance 0.03 m +accept 7.0 60.0 +expect 723020.074 6658157.202 + +tolerance 0.03 m +accept 8.0 60.0 +expect 778711.23 6661953.041 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:32631 +inv \ + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 403186.945 8885748.708 +expect -2.0 80.0 + +tolerance 0.03 m +accept 221288.77 6661953.041 +expect -2.0 60.0 + +tolerance 0.03 m +accept 73106.698 4439746.917 +expect -2.0 40.0 + +tolerance 0.03 m +accept -23538.687 2219308.238 +expect -2.0 20.0 + +tolerance 0.03 m +accept -57087.12 0.0 +expect -2.0 0.0 + +tolerance 0.03 m +accept -23538.687 -2219308.238 +expect -2.0 -20.0 + +tolerance 0.03 m +accept 73106.698 -4439746.917 +expect -2.0 -40.0 + +tolerance 0.03 m +accept 221288.77 -6661953.041 +expect -2.0 -60.0 + +tolerance 0.03 m +accept 403186.945 -8885748.708 +expect -2.0 -80.0 + +tolerance 0.03 m +accept 54506.435 6678411.623 +expect -5.0 60.0 + +tolerance 0.03 m +accept 110043.299 6672079.494 +expect -4.0 60.0 + +tolerance 0.03 m +accept 165640.332 6666593.572 +expect -3.0 60.0 + +tolerance 0.03 m +accept 221288.77 6661953.041 +expect -2.0 60.0 + +tolerance 0.03 m +accept 276979.926 6658157.202 +expect -1.0 60.0 + +tolerance 0.03 m +accept 332705.179 6655205.484 +expect 0.0 60.0 + +tolerance 0.03 m +accept 388455.958 6653097.435 +expect 1.0 60.0 + +tolerance 0.03 m +accept 444223.733 6651832.735 +expect 2.0 60.0 + +tolerance 0.03 m +accept 500000.0 6651411.19 +expect 3.0 60.0 + +tolerance 0.03 m +accept 555776.267 6651832.735 +expect 4.0 60.0 + +tolerance 0.03 m +accept 611544.042 6653097.435 +expect 5.0 60.0 + +tolerance 0.03 m +accept 667294.821 6655205.484 +expect 6.0 60.0 + +tolerance 0.03 m +accept 723020.074 6658157.202 +expect 7.0 60.0 + +tolerance 0.03 m +accept 778711.23 6661953.041 +expect 8.0 60.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4326 +inv \ + +step +init=epsg:32631 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -2.0 80.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 40.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 20.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 0.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 -20.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 -40.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 -60.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 -80.0 +roundtrip 1000 + +tolerance 0.006 m +accept -5.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept -4.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept -3.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept -2.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept -1.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 0.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 1.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 2.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 3.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 4.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 5.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 6.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 7.0 60.0 +roundtrip 1000 + +tolerance 0.006 m +accept 8.0 60.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5101.3-jhs.gie b/conformance/src/test/resources/gigs/5101.3-jhs.gie new file mode 100644 index 0000000..f343459 --- /dev/null +++ b/conformance/src/test/resources/gigs/5101.3-jhs.gie @@ -0,0 +1,302 @@ +-------------------------------------------------------------------------------- + +Test 5101 (part 3), Transverse Mercator, v2-0_2011-06-28, recommended JHS formula + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4283 +inv \ + +step +init=epsg:28354 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 146 80 +expect 596813.055 18885748.71 + +tolerance 0.03 m +accept 146 60 +expect 778711.23 16661953.04 + +tolerance 0.03 m +accept 146 40 +expect 926893.302 14439746.92 + +tolerance 0.03 m +accept 146 20 +expect 1023538.687 12219308.24 + +tolerance 0.03 m +accept 146 0 +expect 1057087.12 10000000.0 + +tolerance 0.03 m +accept 146 -20 +expect 1023538.687 7780691.762 + +tolerance 0.03 m +accept 146 -40 +expect 926893.302 5560253.083 + +tolerance 0.03 m +accept 146 -60 +expect 778711.23 3338046.96 + +tolerance 0.03 m +accept 146 -80 +expect 596813.055 1114251.292 + +tolerance 0.03 m +accept 136 -60 +expect 221288.77 3338046.96 + +tolerance 0.03 m +accept 137 -60 +expect 276979.926 3341842.798 + +tolerance 0.03 m +accept 138 -60 +expect 332705.179 3344794.516 + +tolerance 0.03 m +accept 139 -60 +expect 388455.958 3346902.565 + +tolerance 0.03 m +accept 140 -60 +expect 444223.733 3348167.265 + +tolerance 0.03 m +accept 141 -60 +expect 500000.0 3348588.81 + +tolerance 0.03 m +accept 142 -60 +expect 555776.267 3348167.265 + +tolerance 0.03 m +accept 143 -60 +expect 611544.042 3346902.565 + +tolerance 0.03 m +accept 144 -60 +expect 667294.821 3344794.516 + +tolerance 0.03 m +accept 145 -60 +expect 723020.074 3341842.798 + +tolerance 0.03 m +accept 146 -60 +expect 778711.23 3338046.96 + +tolerance 0.03 m +accept 147 -60 +expect 834359.668 3333406.428 + +tolerance 0.03 m +accept 148 -60 +expect 889956.701 3327920.506 + +tolerance 0.03 m +accept 149 -60 +expect 945493.565 3321588.377 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:28354 +inv \ + +step +init=epsg:4283 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 596813.055 18885748.71 +expect 146 80 + +tolerance 0.03 m +accept 778711.23 16661953.04 +expect 146 60 + +tolerance 0.03 m +accept 926893.302 14439746.92 +expect 146 40 + +tolerance 0.03 m +accept 1023538.687 12219308.24 +expect 146 20 + +tolerance 0.03 m +accept 1057087.12 10000000.0 +expect 146 0 + +tolerance 0.03 m +accept 1023538.687 7780691.762 +expect 146 -20 + +tolerance 0.03 m +accept 926893.302 5560253.083 +expect 146 -40 + +tolerance 0.03 m +accept 778711.23 3338046.96 +expect 146 -60 + +tolerance 0.03 m +accept 596813.055 1114251.292 +expect 146 -80 + +tolerance 0.03 m +accept 221288.77 3338046.96 +expect 136 -60 + +tolerance 0.03 m +accept 276979.926 3341842.798 +expect 137 -60 + +tolerance 0.03 m +accept 332705.179 3344794.516 +expect 138 -60 + +tolerance 0.03 m +accept 388455.958 3346902.565 +expect 139 -60 + +tolerance 0.03 m +accept 444223.733 3348167.265 +expect 140 -60 + +tolerance 0.03 m +accept 500000.0 3348588.81 +expect 141 -60 + +tolerance 0.03 m +accept 555776.267 3348167.265 +expect 142 -60 + +tolerance 0.03 m +accept 611544.042 3346902.565 +expect 143 -60 + +tolerance 0.03 m +accept 667294.821 3344794.516 +expect 144 -60 + +tolerance 0.03 m +accept 723020.074 3341842.798 +expect 145 -60 + +tolerance 0.03 m +accept 778711.23 3338046.96 +expect 146 -60 + +tolerance 0.03 m +accept 834359.668 3333406.428 +expect 147 -60 + +tolerance 0.03 m +accept 889956.701 3327920.506 +expect 148 -60 + +tolerance 0.03 m +accept 945493.565 3321588.377 +expect 149 -60 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4283 +inv \ + +step +init=epsg:28354 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 146 80 +roundtrip 1000 + +tolerance 0.006 m +accept 146 60 +roundtrip 1000 + +tolerance 0.006 m +accept 146 40 +roundtrip 1000 + +tolerance 0.006 m +accept 146 20 +roundtrip 1000 + +tolerance 0.006 m +accept 146 0 +roundtrip 1000 + +tolerance 0.006 m +accept 146 -20 +roundtrip 1000 + +tolerance 0.006 m +accept 146 -40 +roundtrip 1000 + +tolerance 0.006 m +accept 146 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 146 -80 +roundtrip 1000 + +tolerance 0.006 m +accept 136 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 137 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 138 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 139 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 140 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 141 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 142 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 143 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 144 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 145 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 146 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 147 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 148 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 149 -60 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5101.4-jhs-etmerc.gie b/conformance/src/test/resources/gigs/5101.4-jhs-etmerc.gie new file mode 100644 index 0000000..a50905d --- /dev/null +++ b/conformance/src/test/resources/gigs/5101.4-jhs-etmerc.gie @@ -0,0 +1,302 @@ +-------------------------------------------------------------------------------- + +Test 5101 (part 4), Transverse Mercator, v2-0_2011-06-28, recommended JHS formula + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4190 +inv \ + +step +proj=etmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept -63.9993433 80.0002644 +expect 5422500.0 18889800.0 + +tolerance 0.03 m +accept -63.9998472 60.0001191 +expect 5276900.0 16662800.0 + +tolerance 0.03 m +accept -63.9997361 40.0003081 +expect 5158399.999 14439199.99 + +tolerance 0.03 m +accept -64.0004605 19.9996448 +expect 5081100.0 12219300.0 + +tolerance 0.03 m +accept -63.9996186 0.0003092 +expect 5054400.005 10002000.0 + +tolerance 0.03 m +accept -64.0004675 -19.9999283 +expect 5081100.017 7784599.993 + +tolerance 0.03 m +accept -63.9997001 -39.9996924 +expect 5158400.0 5564800.0 + +tolerance 0.03 m +accept -63.9998814 -60.0004008 +expect 5276899.994 3341099.995 + +tolerance 0.03 m +accept -63.9991006 -79.9996521 +expect 5422500.0 1114200.0 + +tolerance 0.03 m +accept -70.0002089 -40.000215 +expect 4645300.113 5524200.123 + +tolerance 0.03 m +accept -69.0001441 -40.0002935 +expect 4730900.0 5533400.0 + +tolerance 0.03 m +accept -67.9995333 -39.9996136 +expect 4816500.043 5541700.028 + +tolerance 0.03 m +accept -66.9998073 -39.9999313 +expect 4902000.0 5548900.0 + +tolerance 0.03 m +accept -65.9996522 -39.9995894 +expect 4987500.009 5555200.001 + +tolerance 0.03 m +accept -64.9992796 -40.000411 +expect 5073000.0 5560400.0 + +tolerance 0.03 m +accept -63.9997 -39.9996925 +expect 5158400.01 5564799.987 + +tolerance 0.03 m +accept -62.9999842 -40.0002087 +expect 5243800.0 5568100.0 + +tolerance 0.03 m +accept -62.0000778 -40.0001803 +expect 5329199.995 5570500.009 + +tolerance 0.03 m +accept -61.0000574 -39.9996182 +expect 5414600.0 5572000.0 + +tolerance 0.03 m +accept -60.0 -40.0003306 +expect 5500000.0 5572399.996 + +tolerance 0.03 m +accept -58.9999426 -39.9996182 +expect 5585400.0 5572000.0 + +tolerance 0.03 m +accept -57.9999222 -40.0001803 +expect 5670800.005 5570500.009 + +tolerance 0.03 m +accept -57.0000158 -40.0002087 +expect 5756200.0 5568100.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=etmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +inv \ + +step +init=epsg:4190 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 5422500.0 18889800.0 +expect -63.9993433 80.0002644 + +tolerance 0.03 m +accept 5276900.0 16662800.0 +expect -63.9998472 60.0001191 + +tolerance 0.03 m +accept 5158399.999 14439199.99 +expect -63.9997361 40.0003081 + +tolerance 0.03 m +accept 5081100.0 12219300.0 +expect -64.0004605 19.9996448 + +tolerance 0.03 m +accept 5054400.005 10002000.0 +expect -63.9996186 0.0003092 + +tolerance 0.03 m +accept 5081100.017 7784599.993 +expect -64.0004675 -19.9999283 + +tolerance 0.03 m +accept 5158400.0 5564800.0 +expect -63.9997001 -39.9996924 + +tolerance 0.03 m +accept 5276899.994 3341099.995 +expect -63.9998814 -60.0004008 + +tolerance 0.03 m +accept 5422500.0 1114200.0 +expect -63.9991006 -79.9996521 + +tolerance 0.03 m +accept 4645300.113 5524200.123 +expect -70.0002089 -40.000215 + +tolerance 0.03 m +accept 4730900.0 5533400.0 +expect -69.0001441 -40.0002935 + +tolerance 0.03 m +accept 4816500.043 5541700.028 +expect -67.9995333 -39.9996136 + +tolerance 0.03 m +accept 4902000.0 5548900.0 +expect -66.9998073 -39.9999313 + +tolerance 0.03 m +accept 4987500.009 5555200.001 +expect -65.9996522 -39.9995894 + +tolerance 0.03 m +accept 5073000.0 5560400.0 +expect -64.9992796 -40.000411 + +tolerance 0.03 m +accept 5158400.01 5564799.987 +expect -63.9997 -39.9996925 + +tolerance 0.03 m +accept 5243800.0 5568100.0 +expect -62.9999842 -40.0002087 + +tolerance 0.03 m +accept 5329199.995 5570500.009 +expect -62.0000778 -40.0001803 + +tolerance 0.03 m +accept 5414600.0 5572000.0 +expect -61.0000574 -39.9996182 + +tolerance 0.03 m +accept 5500000.0 5572399.996 +expect -60.0 -40.0003306 + +tolerance 0.03 m +accept 5585400.0 5572000.0 +expect -58.9999426 -39.9996182 + +tolerance 0.03 m +accept 5670800.005 5570500.009 +expect -57.9999222 -40.0001803 + +tolerance 0.03 m +accept 5756200.0 5568100.0 +expect -57.0000158 -40.0002087 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4190 +inv \ + +step +proj=etmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -63.9993433 80.0002644 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9998472 60.0001191 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9997361 40.0003081 +roundtrip 1000 + +tolerance 0.006 m +accept -64.0004605 19.9996448 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9996186 0.0003092 +roundtrip 1000 + +tolerance 0.006 m +accept -64.0004675 -19.9999283 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9997001 -39.9996924 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9998814 -60.0004008 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9991006 -79.9996521 +roundtrip 1000 + +tolerance 0.006 m +accept -70.0002089 -40.000215 +roundtrip 1000 + +tolerance 0.006 m +accept -69.0001441 -40.0002935 +roundtrip 1000 + +tolerance 0.006 m +accept -67.9995333 -39.9996136 +roundtrip 1000 + +tolerance 0.006 m +accept -66.9998073 -39.9999313 +roundtrip 1000 + +tolerance 0.006 m +accept -65.9996522 -39.9995894 +roundtrip 1000 + +tolerance 0.006 m +accept -64.9992796 -40.000411 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9997 -39.9996925 +roundtrip 1000 + +tolerance 0.006 m +accept -62.9999842 -40.0002087 +roundtrip 1000 + +tolerance 0.006 m +accept -62.0000778 -40.0001803 +roundtrip 1000 + +tolerance 0.006 m +accept -61.0000574 -39.9996182 +roundtrip 1000 + +tolerance 0.006 m +accept -60.0 -40.0003306 +roundtrip 1000 + +tolerance 0.006 m +accept -58.9999426 -39.9996182 +roundtrip 1000 + +tolerance 0.006 m +accept -57.9999222 -40.0001803 +roundtrip 1000 + +tolerance 0.006 m +accept -57.0000158 -40.0002087 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5101.4-jhs.gie.failing b/conformance/src/test/resources/gigs/5101.4-jhs.gie.failing new file mode 100644 index 0000000..615bf60 --- /dev/null +++ b/conformance/src/test/resources/gigs/5101.4-jhs.gie.failing @@ -0,0 +1,300 @@ +-------------------------------------------------------------------------------- + +Test 5101 (part 4), Transverse Mercator, v2-0_2011-06-28, recommended JHS formula + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4190 +inv + +step +init=epsg:22175 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept -63.9993433 80.0002644 +expect 5422500.0 18889800.0 + +tolerance 0.03 m +accept -63.9998472 60.0001191 +expect 5276900.0 16662800.0 + +tolerance 0.03 m +accept -63.9997361 40.0003081 +expect 5158399.999 14439199.99 + +tolerance 0.03 m +accept -64.0004605 19.9996448 +expect 5081100.0 12219300.0 + +tolerance 0.03 m +accept -63.9996186 0.0003092 +expect 5054400.005 10002000.0 + +tolerance 0.03 m +accept -64.0004675 -19.9999283 +expect 5081100.017 7784599.993 + +tolerance 0.03 m +accept -63.9997001 -39.9996924 +expect 5158400.0 5564800.0 + +tolerance 0.03 m +accept -63.9998814 -60.0004008 +expect 5276899.994 3341099.995 + +tolerance 0.03 m +accept -63.9991006 -79.9996521 +expect 5422500.0 1114200.0 + +tolerance 0.03 m +accept -70.0002089 -40.000215 +expect 4645300.113 5524200.123 + +tolerance 0.03 m +accept -69.0001441 -40.0002935 +expect 4730900.0 5533400.0 + +tolerance 0.03 m +accept -67.9995333 -39.9996136 +expect 4816500.043 5541700.028 + +tolerance 0.03 m +accept -66.9998073 -39.9999313 +expect 4902000.0 5548900.0 + +tolerance 0.03 m +accept -65.9996522 -39.9995894 +expect 4987500.009 5555200.001 + +tolerance 0.03 m +accept -64.9992796 -40.000411 +expect 5073000.0 5560400.0 + +tolerance 0.03 m +accept -63.9997 -39.9996925 +expect 5158400.01 5564799.987 + +tolerance 0.03 m +accept -62.9999842 -40.0002087 +expect 5243800.0 5568100.0 + +tolerance 0.03 m +accept -62.0000778 -40.0001803 +expect 5329199.995 5570500.009 + +tolerance 0.03 m +accept -61.0000574 -39.9996182 +expect 5414600.0 5572000.0 + +tolerance 0.03 m +accept -60 -40.0003306 +expect 5500000.0 5572399.996 + +tolerance 0.03 m +accept -58.9999426 -39.9996182 +expect 5585400.0 5572000.0 + +tolerance 0.03 m +accept -57.9999222 -40.0001803 +expect 5670800.005 5570500.009 + +tolerance 0.03 m +accept -57.0000158 -40.0002087 +expect 5756200.0 5568100.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:22175 +inv + +step +init=epsg:4190 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 5422500.0 18889800.0 +expect -63.9993433 80.0002644 + +tolerance 0.03 m +accept 5276900.0 16662800.0 +expect -63.9998472 60.0001191 + +tolerance 0.03 m +accept 5158399.999 14439199.99 +expect -63.9997361 40.0003081 + +tolerance 0.03 m +accept 5081100.0 12219300.0 +expect -64.0004605 19.9996448 + +tolerance 0.03 m +accept 5054400.005 10002000.0 +expect -63.9996186 0.0003092 + +tolerance 0.03 m +accept 5081100.017 7784599.993 +expect -64.0004675 -19.9999283 + +tolerance 0.03 m +accept 5158400.0 5564800.0 +expect -63.9997001 -39.9996924 + +tolerance 0.03 m +accept 5276899.994 3341099.995 +expect -63.9998814 -60.0004008 + +tolerance 0.03 m +accept 5422500.0 1114200.0 +expect -63.9991006 -79.9996521 + +tolerance 0.03 m +accept 4645300.113 5524200.123 +expect -70.0002089 -40.000215 + +tolerance 0.03 m +accept 4730900.0 5533400.0 +expect -69.0001441 -40.0002935 + +tolerance 0.03 m +accept 4816500.043 5541700.028 +expect -67.9995333 -39.9996136 + +tolerance 0.03 m +accept 4902000.0 5548900.0 +expect -66.9998073 -39.9999313 + +tolerance 0.03 m +accept 4987500.009 5555200.001 +expect -65.9996522 -39.9995894 + +tolerance 0.03 m +accept 5073000.0 5560400.0 +expect -64.9992796 -40.000411 + +tolerance 0.03 m +accept 5158400.01 5564799.987 +expect -63.9997 -39.9996925 + +tolerance 0.03 m +accept 5243800.0 5568100.0 +expect -62.9999842 -40.0002087 + +tolerance 0.03 m +accept 5329199.995 5570500.009 +expect -62.0000778 -40.0001803 + +tolerance 0.03 m +accept 5414600.0 5572000.0 +expect -61.0000574 -39.9996182 + +tolerance 0.03 m +accept 5500000.0 5572399.996 +expect -60 -40.0003306 + +tolerance 0.03 m +accept 5585400.0 5572000.0 +expect -58.9999426 -39.9996182 + +tolerance 0.03 m +accept 5670800.005 5570500.009 +expect -57.9999222 -40.0001803 + +tolerance 0.03 m +accept 5756200.0 5568100.0 +expect -57.0000158 -40.0002087 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4190 +inv + +step +init=epsg:22175 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -63.9993433 80.0002644 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9998472 60.0001191 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9997361 40.0003081 +roundtrip 1000 + +tolerance 0.006 m +accept -64.0004605 19.9996448 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9996186 0.0003092 +roundtrip 1000 + +tolerance 0.006 m +accept -64.0004675 -19.9999283 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9997001 -39.9996924 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9998814 -60.0004008 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9991006 -79.9996521 +roundtrip 1000 + +tolerance 0.006 m +accept -70.0002089 -40.000215 +roundtrip 1000 + +tolerance 0.006 m +accept -69.0001441 -40.0002935 +roundtrip 1000 + +tolerance 0.006 m +accept -67.9995333 -39.9996136 +roundtrip 1000 + +tolerance 0.006 m +accept -66.9998073 -39.9999313 +roundtrip 1000 + +tolerance 0.006 m +accept -65.9996522 -39.9995894 +roundtrip 1000 + +tolerance 0.006 m +accept -64.9992796 -40.000411 +roundtrip 1000 + +tolerance 0.006 m +accept -63.9997 -39.9996925 +roundtrip 1000 + +tolerance 0.006 m +accept -62.9999842 -40.0002087 +roundtrip 1000 + +tolerance 0.006 m +accept -62.0000778 -40.0001803 +roundtrip 1000 + +tolerance 0.006 m +accept -61.0000574 -39.9996182 +roundtrip 1000 + +tolerance 0.006 m +accept -60 -40.0003306 +roundtrip 1000 + +tolerance 0.006 m +accept -58.9999426 -39.9996182 +roundtrip 1000 + +tolerance 0.006 m +accept -57.9999222 -40.0001803 +roundtrip 1000 + +tolerance 0.006 m +accept -57.0000158 -40.0002087 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5102.1.gie b/conformance/src/test/resources/gigs/5102.1.gie new file mode 100644 index 0000000..3d9de74 --- /dev/null +++ b/conformance/src/test/resources/gigs/5102.1.gie @@ -0,0 +1,254 @@ +-------------------------------------------------------------------------------- + +Test 5102, Lambert Conic Conformal (1SP), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4230 +inv \ + +step +init=epsg:2192 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 5 58 +expect 760722.92 3457368.68 + +tolerance 0.03 m +accept 5 57 +expect 764566.844 3343948.93 + +tolerance 0.03 m +accept 5 56 +expect 768396.683 3230944.812 + +tolerance 0.03 m +accept 5 55 +expect 772213.973 3118310.947 + +tolerance 0.03 m +accept 5 54 +expect 776020.189 3006003.839 + +tolerance 0.03 m +accept 5 53 +expect 779816.748 2893981.68 + +tolerance 0.03 m +accept 4 51 +expect 717027.292 2668695.784 + +tolerance 0.03 m +accept 4 50 +expect 719385.249 2557252.841 + +tolerance 0.03 m +accept 4 49 +expect 721740.43 2445941.161 + +tolerance 0.03 m +accept 4 46.8 +expect 726915.752 2201342.519 + +tolerance 0.03 m +accept 3 53 +expect 644764.905 2891124.195 + +tolerance 0.03 m +accept 4 53 +expect 712299.916 2892123.369 + +tolerance 0.03 m +accept 5 53 +expect 779816.748 2893981.68 + +tolerance 0.03 m +accept 6 53 +expect 847304.473 2896698.827 + +tolerance 0.03 m +accept 7 53 +expect 914752.168 2900274.371 + +tolerance 0.03 m +accept 8 53 +expect 982148.913 2904707.734 + +tolerance 0.03 m +accept 9 53 +expect 1049483.8 2909998.196 + +tolerance 0.03 m +accept 10 53 +expect 1116745.929 2916144.902 + +tolerance 0.03 m +accept 11 53 +expect 1183924.412 2923146.858 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:2192 +inv \ + +step +init=epsg:4230 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 760722.92 3457368.68 +expect 5 58 + +tolerance 0.03 m +accept 764566.844 3343948.93 +expect 5 57 + +tolerance 0.03 m +accept 768396.683 3230944.812 +expect 5 56 + +tolerance 0.03 m +accept 772213.973 3118310.947 +expect 5 55 + +tolerance 0.03 m +accept 776020.189 3006003.839 +expect 5 54 + +tolerance 0.03 m +accept 779816.748 2893981.68 +expect 5 53 + +tolerance 0.03 m +accept 717027.292 2668695.784 +expect 4 51 + +tolerance 0.03 m +accept 719385.249 2557252.841 +expect 4 50 + +tolerance 0.03 m +accept 721740.43 2445941.161 +expect 4 49 + +tolerance 0.03 m +accept 726915.752 2201342.519 +expect 4 46.8 + +tolerance 0.03 m +accept 644764.905 2891124.195 +expect 3 53 + +tolerance 0.03 m +accept 712299.916 2892123.369 +expect 4 53 + +tolerance 0.03 m +accept 779816.748 2893981.68 +expect 5 53 + +tolerance 0.03 m +accept 847304.473 2896698.827 +expect 6 53 + +tolerance 0.03 m +accept 914752.168 2900274.371 +expect 7 53 + +tolerance 0.03 m +accept 982148.913 2904707.734 +expect 8 53 + +tolerance 0.03 m +accept 1049483.8 2909998.196 +expect 9 53 + +tolerance 0.03 m +accept 1116745.929 2916144.902 +expect 10 53 + +tolerance 0.03 m +accept 1183924.412 2923146.858 +expect 11 53 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4230 +inv \ + +step +init=epsg:2192 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 5 58 +roundtrip 1000 + +tolerance 0.006 m +accept 5 57 +roundtrip 1000 + +tolerance 0.006 m +accept 5 56 +roundtrip 1000 + +tolerance 0.006 m +accept 5 55 +roundtrip 1000 + +tolerance 0.006 m +accept 5 54 +roundtrip 1000 + +tolerance 0.006 m +accept 5 53 +roundtrip 1000 + +tolerance 0.006 m +accept 4 51 +roundtrip 1000 + +tolerance 0.006 m +accept 4 50 +roundtrip 1000 + +tolerance 0.006 m +accept 4 49 +roundtrip 1000 + +tolerance 0.006 m +accept 4 46.8 +roundtrip 1000 + +tolerance 0.006 m +accept 3 53 +roundtrip 1000 + +tolerance 0.006 m +accept 4 53 +roundtrip 1000 + +tolerance 0.006 m +accept 5 53 +roundtrip 1000 + +tolerance 0.006 m +accept 6 53 +roundtrip 1000 + +tolerance 0.006 m +accept 7 53 +roundtrip 1000 + +tolerance 0.006 m +accept 8 53 +roundtrip 1000 + +tolerance 0.006 m +accept 9 53 +roundtrip 1000 + +tolerance 0.006 m +accept 10 53 +roundtrip 1000 + +tolerance 0.006 m +accept 11 53 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5102.2.gie b/conformance/src/test/resources/gigs/5102.2.gie new file mode 100644 index 0000000..d41280e --- /dev/null +++ b/conformance/src/test/resources/gigs/5102.2.gie @@ -0,0 +1,266 @@ +-------------------------------------------------------------------------------- + +Test 5102 (part 2), Lambert Conic Conformal (1SP), v2-0_2011-06-28. +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +# We need to add this grad->rad step as +init=epsg:4807 assumes +# degrees (if front operation), or radians (if non-front), as this was the case +# in PROJ < 6 era +# Note: "cs2cs EPSG:4807 EPSG:27572" does the right job. +operation +proj=pipeline \ + +step +proj=unitconvert +xy_in=grad +xy_out=rad \ + +step +init=epsg:4807 +inv \ + +step +init=epsg:27572 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 2.9586342556 64.4444444444 +expect 760724.023 3457334.864 + +tolerance 0.03 m +accept 2.9586342556 63.3333333333 +expect 764567.882 3343917.044 + +tolerance 0.03 m +accept 2.9586342556 62.2222222222 +expect 768397.648 3230915.06 + +tolerance 0.03 m +accept 2.9586342556 61.1111111111 +expect 772214.859 3118283.535 + +tolerance 0.03 m +accept 2.9586342556 60 +expect 776020.989 3005978.979 + +tolerance 0.03 m +accept 2.9586342556 58.8888888889 +expect 779817.454 2893959.584 + +tolerance 0.03 m +accept 1.8475231444 56.6666666667 +expect 717027.602 2668679.866 + +tolerance 0.03 m +accept 1.8475231444 55.5555555556 +expect 719385.487 2557240.347 + +tolerance 0.03 m +accept 1.8475231444 54.4444444444 +expect 721740.59 2445932.319 + +tolerance 0.03 m +accept 1.8475231444 52 +expect 726915.726 2201342.51839 + +tolerance 0.03 m +accept 0.7364120333 58.8888888889 +expect 644765.081 2891102.088 + +tolerance 0.03 m +accept 1.8475231444 58.8888888889 +expect 712300.356 2892101.266 + +tolerance 0.03 m +accept 2.9586342556 58.8888888889 +expect 779817.454 2893959.584 + +tolerance 0.03 m +accept 4.0697453667 58.8888888889 +expect 847305.444 2896676.742 + +tolerance 0.03 m +accept 5.1808564778 58.8888888889 +expect 914753.403 2900252.301 + +tolerance 0.03 m +accept 6.2919675889 58.8888888889 +expect 982150.413 2904685.68 + +tolerance 0.03 m +accept 7.4030787 58.8888888889 +expect 1049485.565 2909976.163 + +tolerance 0.03 m +accept 8.5141898111 58.8888888889 +expect 1116747.958 2916122.894 + +tolerance 0.03 m +accept 9.6253009222 58.8888888889 +expect 1183926.705 2923124.876 + +-------------------------------------------------------------------------------- +# We need to add this rad->grad step as +init=epsg:4807 assumes +# degrees (if last operation), or radians (if non-last), as this was the case +# in PROJ < 6 era +operation +proj=pipeline \ + +step +init=epsg:27572 +inv \ + +step +init=epsg:4807 \ + +step +proj=unitconvert +xy_in=rad +xy_out=grad +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 760724.023 3457334.864 +expect 2.9586342556 64.4444444444 + +tolerance 0.03 m +accept 764567.882 3343917.044 +expect 2.9586342556 63.3333333333 + +tolerance 0.03 m +accept 768397.648 3230915.06 +expect 2.9586342556 62.2222222222 + +tolerance 0.03 m +accept 772214.859 3118283.535 +expect 2.9586342556 61.1111111111 + +tolerance 0.03 m +accept 776020.989 3005978.979 +expect 2.9586342556 60 + +tolerance 0.03 m +accept 779817.454 2893959.584 +expect 2.9586342556 58.8888888889 + +tolerance 0.03 m +accept 717027.602 2668679.866 +expect 1.8475231444 56.6666666667 + +tolerance 0.03 m +accept 719385.487 2557240.347 +expect 1.8475231444 55.5555555556 + +tolerance 0.03 m +accept 721740.59 2445932.319 +expect 1.8475231444 54.4444444444 + +tolerance 0.03 m +accept 726915.726 2201342.51839 +expect 1.8475231444 52 + +tolerance 0.03 m +accept 644765.081 2891102.088 +expect 0.7364120333 58.8888888889 + +tolerance 0.03 m +accept 712300.356 2892101.266 +expect 1.8475231444 58.8888888889 + +tolerance 0.03 m +accept 779817.454 2893959.584 +expect 2.9586342556 58.8888888889 + +tolerance 0.03 m +accept 847305.444 2896676.742 +expect 4.0697453667 58.8888888889 + +tolerance 0.03 m +accept 914753.403 2900252.301 +expect 5.1808564778 58.8888888889 + +tolerance 0.03 m +accept 982150.413 2904685.68 +expect 6.2919675889 58.8888888889 + +tolerance 0.03 m +accept 1049485.565 2909976.163 +expect 7.4030787 58.8888888889 + +tolerance 0.03 m +accept 1116747.958 2916122.894 +expect 8.5141898111 58.8888888889 + +tolerance 0.03 m +accept 1183926.705 2923124.876 +expect 9.6253009222 58.8888888889 + +-------------------------------------------------------------------------------- +# We need to add this grad->rad step as +init=epsg:4807 assumes +# degrees (if front operation), or radians (if non-front), as this was the case +# in PROJ < 6 era +operation +proj=pipeline \ + +step +proj=unitconvert +xy_in=grad +xy_out=rad \ + +step +init=epsg:4807 +inv \ + +step +init=epsg:27572 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 2.9586342556 64.4444444444 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9586342556 63.3333333333 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9586342556 62.2222222222 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9586342556 61.1111111111 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9586342556 60 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9586342556 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 1.8475231444 56.6666666667 +roundtrip 1000 + +tolerance 0.006 m +accept 1.8475231444 55.5555555556 +roundtrip 1000 + +tolerance 0.006 m +accept 1.8475231444 54.4444444444 +roundtrip 1000 + +tolerance 0.006 m +accept 1.8475231444 52 +roundtrip 1000 + +tolerance 0.006 m +accept 0.7364120333 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 1.8475231444 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 2.9586342556 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 4.0697453667 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 5.1808564778 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 6.2919675889 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 7.4030787 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 8.5141898111 58.8888888889 +roundtrip 1000 + +tolerance 0.006 m +accept 9.6253009222 58.8888888889 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5103.1.gie b/conformance/src/test/resources/gigs/5103.1.gie new file mode 100644 index 0000000..b194e2e --- /dev/null +++ b/conformance/src/test/resources/gigs/5103.1.gie @@ -0,0 +1,213 @@ +-------------------------------------------------------------------------------- + +Test 5103 (part 1), Lambert Conic Conformal (2SP), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4313 +inv \ + +step +init=epsg:31370 + +tolerance 30 mm +-------------------------------------------------------------------------------- +accept 5 58 +expect 187742.7 969521.653 + +accept 5 57 +expect 188698.877 857277.135 + +accept 5 56 +expect 189652.853 745291.184 + +accept 5 55 +expect 190604.967 633523.672 + +accept 5 54 +expect 191555.55 521935.9 + +accept 5 53 +expect 192504.921 410490.433 + +accept 5.3876389 52.1561606 +expect 219843.841 316827.604 + +accept 4 51 +expect 124202.936 187756.876 + +accept 4 50 +expect 123652.406 76521.628 + +accept 4 49 +expect 123101.889 -34711.068 + +accept 3.3137281 47.9752611 +expect 71254.553 -148236.592 + +accept 3 53 +expect 58108.966 411155.591 + +accept 4 53 +expect 125304.704 410370.504 + +accept 5 53 +expect 192504.921 410490.433 + +accept 6 53 +expect 259697.429 411515.356 + +accept 7 53 +expect 326870.04 413445.087 + +accept 8 53 +expect 394010.571 416279.276 + +accept 9 53 +expect 461106.844 420017.408 + +accept 10 53 +expect 528146.69 424658.807 + +accept 11 53 +expect 595117.95 430202.63 + + +-------------------------------------------------------------------------------- +operation proj=pipeline \ + step init=epsg:31370 inv \ + step init=epsg:4313 + +tolerance 30 mm +-------------------------------------------------------------------------------- +accept 187742.7 969521.653 +expect 5 58 + +accept 188698.877 857277.135 +expect 5 57 + +accept 189652.853 745291.184 +expect 5 56 + +accept 190604.967 633523.672 +expect 5 55 + +accept 191555.55 521935.9 +expect 5 54 + +accept 192504.921 410490.433 +expect 5 53 + +accept 219843.841 316827.604 +expect 5.3876389 52.1561606 + +accept 124202.936 187756.876 +expect 4 51 + +accept 123652.406 76521.628 +expect 4 50 + +accept 123101.889 -34711.068 +expect 4 49 + +accept 71254.553 -148236.592 +expect 3.3137281 47.9752611 + +accept 58108.966 411155.591 +expect 3 53 + +accept 125304.704 410370.504 +expect 4 53 + +accept 192504.921 410490.433 +expect 5 53 + +accept 259697.429 411515.356 +expect 6 53 + +accept 326870.04 413445.087 +expect 7 53 + +accept 394010.571 416279.276 +expect 8 53 + +accept 461106.844 420017.408 +expect 9 53 + +accept 528146.69 424658.807 +expect 10 53 + +accept 595117.95 430202.63 +expect 11 53 + +-------------------------------------------------------------------------------- +operation +proj=pipeline towgs84=0,0,0 \ # turn off dual datum shift + +step +init=epsg:4313 +inv \ + +step +init=epsg:31370 + +tolerance 6 mm +-------------------------------------------------------------------------------- +accept 5 58 +roundtrip 1000 + +accept 5 57 +roundtrip 1000 + +accept 5 56 +roundtrip 1000 + +accept 5 55 +roundtrip 1000 + +accept 5 54 +roundtrip 1000 + +accept 5 53 +roundtrip 1000 + +accept 5.3876389 52.1561606 +roundtrip 1000 + +accept 4 51 +roundtrip 1000 + +accept 4 50 +roundtrip 1000 + +accept 4 49 +roundtrip 1000 + +accept 3.3137281 47.9752611 +roundtrip 1000 + +accept 3 53 +roundtrip 1000 + +accept 4 53 +roundtrip 1000 + +accept 5 53 +roundtrip 1000 + +accept 6 53 +roundtrip 1000 + +accept 7 53 +roundtrip 1000 + +accept 8 53 +roundtrip 1000 + +accept 9 53 +roundtrip 1000 + +accept 10 53 +roundtrip 1000 + +accept 11 53 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5103.2.gie b/conformance/src/test/resources/gigs/5103.2.gie new file mode 100644 index 0000000..4419a6c --- /dev/null +++ b/conformance/src/test/resources/gigs/5103.2.gie @@ -0,0 +1,146 @@ +-------------------------------------------------------------------------------- + +Test 5103 (part 2), Lambert Conic Conformal (2SP), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4152 +inv \ + +step +init=epsg:2921 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept -110 49 +expect 2003937.27 6452491.7 + +tolerance 0.03 m +accept -110 47 +expect 2016621.93 5717728.61 + +tolerance 0.03 m +accept -110 45 +expect 2029255.57 4985920.56 + +tolerance 0.03 m +accept -110 43 +expect 2041855.08 4256089.74 + +tolerance 0.03 m +accept -110 41 +expect 2054436.57 3527302.73 + +tolerance 0.03 m +accept -110 41 +expect 2054436.57 3527302.73 + +tolerance 0.03 m +accept -108 41 +expect 2606245.52 3543182.55 + +tolerance 0.03 m +accept -106 41 +expect 3157542.86 3571757.39 + +tolerance 0.03 m +accept -104 41 +expect 3708036.57 3613012.12 + +tolerance 0.03 m +accept -102 41 +expect 4257435.06 3666924.89 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:2921 +inv \ + +step +init=epsg:4152 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 2003937.27 6452491.7 +expect -110 49 + +tolerance 0.03 m +accept 2016621.93 5717728.61 +expect -110 47 + +tolerance 0.03 m +accept 2029255.57 4985920.56 +expect -110 45 + +tolerance 0.03 m +accept 2041855.08 4256089.74 +expect -110 43 + +tolerance 0.03 m +accept 2054436.57 3527302.73 +expect -110 41 + +tolerance 0.03 m +accept 2054436.57 3527302.73 +expect -110 41 + +tolerance 0.03 m +accept 2606245.52 3543182.55 +expect -108 41 + +tolerance 0.03 m +accept 3157542.86 3571757.39 +expect -106 41 + +tolerance 0.03 m +accept 3708036.57 3613012.12 +expect -104 41 + +tolerance 0.03 m +accept 4257435.06 3666924.89 +expect -102 41 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4152 +inv \ + +step +init=epsg:2921 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -110 49 +roundtrip 1000 + +tolerance 0.006 m +accept -110 47 +roundtrip 1000 + +tolerance 0.006 m +accept -110 45 +roundtrip 1000 + +tolerance 0.006 m +accept -110 43 +roundtrip 1000 + +tolerance 0.006 m +accept -110 41 +roundtrip 1000 + +tolerance 0.006 m +accept -110 41 +roundtrip 1000 + +tolerance 0.006 m +accept -108 41 +roundtrip 1000 + +tolerance 0.006 m +accept -106 41 +roundtrip 1000 + +tolerance 0.006 m +accept -104 41 +roundtrip 1000 + +tolerance 0.006 m +accept -102 41 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5103.3.gie b/conformance/src/test/resources/gigs/5103.3.gie new file mode 100644 index 0000000..e73ede4 --- /dev/null +++ b/conformance/src/test/resources/gigs/5103.3.gie @@ -0,0 +1,146 @@ +-------------------------------------------------------------------------------- + +Test 5103 (part 3), Lambert Conic Conformal (2SP), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4152 +inv \ + +step +init=epsg:3568 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept -110 49 +expect 2003933.27 6452478.8 + +tolerance 0.03 m +accept -110 47 +expect 2016617.9 5717717.18 + +tolerance 0.03 m +accept -110 45 +expect 2029251.51 4985910.59 + +tolerance 0.03 m +accept -110 43 +expect 2041851.0 4256081.23 + +tolerance 0.03 m +accept -110 41 +expect 2054432.46 3527295.67 + +tolerance 0.03 m +accept -110 41 +expect 2054432.46 3527295.67 + +tolerance 0.03 m +accept -108 41 +expect 2606240.3 3543175.46 + +tolerance 0.03 m +accept -106 41 +expect 3157536.54 3571750.25 + +tolerance 0.03 m +accept -104 41 +expect 3708029.16 3613004.9 + +tolerance 0.03 m +accept -102 41 +expect 4257426.54 3666917.56 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:3568 +inv \ + +step +init=epsg:4152 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 2003933.27 6452478.8 +expect -110 49 + +tolerance 0.03 m +accept 2016617.9 5717717.18 +expect -110 47 + +tolerance 0.03 m +accept 2029251.51 4985910.59 +expect -110 45 + +tolerance 0.03 m +accept 2041851.0 4256081.23 +expect -110 43 + +tolerance 0.03 m +accept 2054432.46 3527295.67 +expect -110 41 + +tolerance 0.03 m +accept 2054432.46 3527295.67 +expect -110 41 + +tolerance 0.03 m +accept 2606240.3 3543175.46 +expect -108 41 + +tolerance 0.03 m +accept 3157536.54 3571750.25 +expect -106 41 + +tolerance 0.03 m +accept 3708029.16 3613004.9 +expect -104 41 + +tolerance 0.03 m +accept 4257426.54 3666917.56 +expect -102 41 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4152 +inv \ + +step +init=epsg:3568 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -110 49 +roundtrip 1000 + +tolerance 0.006 m +accept -110 47 +roundtrip 1000 + +tolerance 0.006 m +accept -110 45 +roundtrip 1000 + +tolerance 0.006 m +accept -110 43 +roundtrip 1000 + +tolerance 0.006 m +accept -110 41 +roundtrip 1000 + +tolerance 0.006 m +accept -110 41 +roundtrip 1000 + +tolerance 0.006 m +accept -108 41 +roundtrip 1000 + +tolerance 0.006 m +accept -106 41 +roundtrip 1000 + +tolerance 0.006 m +accept -104 41 +roundtrip 1000 + +tolerance 0.006 m +accept -102 41 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5104.gie b/conformance/src/test/resources/gigs/5104.gie new file mode 100644 index 0000000..b2a4241 --- /dev/null +++ b/conformance/src/test/resources/gigs/5104.gie @@ -0,0 +1,266 @@ +-------------------------------------------------------------------------------- + +Test 5104, Oblique stereographic, v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4289 +inv \ + +step +init=epsg:28992 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 5 58 +expect 132023.27 1114054.87 + +tolerance 0.05 m +accept 5 57 +expect 131405.466 1002468.081 + +tolerance 0.05 m +accept 5 56 +expect 130792.264 890981.281 + +tolerance 0.05 m +accept 5 55 +expect 130183.56 779577.7 + +tolerance 0.05 m +accept 5 54 +expect 129579.26 668240.58 + +tolerance 0.05 m +accept 5 53 +expect 128979.26 556953.19 + +tolerance 0.05 m +accept 5.38763888889 52.1561605556 +expect 155000 463000 + +tolerance 0.05 m +accept 4 51 +expect 57605.946 335312.662 + +tolerance 0.05 m +accept 4 50 +expect 55502.306 224086.514 + +tolerance 0.05 m +accept 4.0 49.0 +expect 53412.76 112842.73 + +tolerance 0.05 m +accept 3.31372805556 47.9752611111 +expect 0 0 + +tolerance 0.05 m +accept 3 53 +expect -5253.06 559535.55 + +tolerance 0.05 m +accept 4 53 +expect 61856.78 557779.12 + +tolerance 0.05 m +accept 5 53 +expect 128979.26 556953.19 + +tolerance 0.05 m +accept 6 53 +expect 196105.28 557057.74 + +tolerance 0.05 m +accept 7 53 +expect 263225.72 558092.77 + +tolerance 0.05 m +accept 8 53 +expect 330331.46 560058.31 + +tolerance 0.05 m +accept 9 53 +expect 397413.385 562954.436 + +tolerance 0.05 m +accept 10 53 +expect 464462.35 566781.24 + +tolerance 0.05 m +accept 11 53 +expect 531469.2 571538.84 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:28992 +inv \ + +step +init=epsg:4289 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 132023.27 1114054.87 +expect 5 58 + +tolerance 0.05 m +accept 131405.466 1002468.081 +expect 5 57 + +tolerance 0.05 m +accept 130792.264 890981.281 +expect 5 56 + +tolerance 0.05 m +accept 130183.56 779577.7 +expect 5 55 + +tolerance 0.05 m +accept 129579.26 668240.58 +expect 5 54 + +tolerance 0.05 m +accept 128979.26 556953.19 +expect 5 53 + +tolerance 0.05 m +accept 155000 463000 +expect 5.38763888889 52.1561605556 + +tolerance 0.05 m +accept 57605.946 335312.662 +expect 4 51 + +tolerance 0.05 m +accept 55502.306 224086.514 +expect 4 50 + +tolerance 0.05 m +accept 53412.76 112842.73 +expect 4.0 49.0 + +tolerance 0.05 m +accept 0 0 +expect 3.31372805556 47.9752611111 + +tolerance 0.05 m +accept -5253.06 559535.55 +expect 3 53 + +tolerance 0.05 m +accept 61856.78 557779.12 +expect 4 53 + +tolerance 0.05 m +accept 128979.26 556953.19 +expect 5 53 + +tolerance 0.05 m +accept 196105.28 557057.74 +expect 6 53 + +tolerance 0.05 m +accept 263225.72 558092.77 +expect 7 53 + +tolerance 0.05 m +accept 330331.46 560058.31 +expect 8 53 + +tolerance 0.05 m +accept 397413.385 562954.436 +expect 9 53 + +tolerance 0.05 m +accept 464462.35 566781.24 +expect 10 53 + +tolerance 0.05 m +accept 531469.2 571538.84 +expect 11 53 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4289 +inv \ + +step +init=epsg:28992 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 5 58 +roundtrip 1000 + +tolerance 0.006 m +accept 5 57 +roundtrip 1000 + +tolerance 0.006 m +accept 5 56 +roundtrip 1000 + +tolerance 0.006 m +accept 5 55 +roundtrip 1000 + +tolerance 0.006 m +accept 5 54 +roundtrip 1000 + +tolerance 0.006 m +accept 5 53 +roundtrip 1000 + +tolerance 0.006 m +accept 5.38763888889 52.1561605556 +roundtrip 1000 + +tolerance 0.006 m +accept 4 51 +roundtrip 1000 + +tolerance 0.006 m +accept 4 50 +roundtrip 1000 + +tolerance 0.006 m +accept 4.0 49.0 +roundtrip 1000 + +tolerance 0.006 m +accept 3.31372805556 47.9752611111 +roundtrip 1000 + +tolerance 0.006 m +accept 3 53 +roundtrip 1000 + +tolerance 0.006 m +accept 4 53 +roundtrip 1000 + +tolerance 0.006 m +accept 5 53 +roundtrip 1000 + +tolerance 0.006 m +accept 6 53 +roundtrip 1000 + +tolerance 0.006 m +accept 7 53 +roundtrip 1000 + +tolerance 0.006 m +accept 8 53 +roundtrip 1000 + +tolerance 0.006 m +accept 9 53 +roundtrip 1000 + +tolerance 0.006 m +accept 10 53 +roundtrip 1000 + +tolerance 0.006 m +accept 11 53 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5105.1.gie.failing b/conformance/src/test/resources/gigs/5105.1.gie.failing new file mode 100644 index 0000000..881d080 --- /dev/null +++ b/conformance/src/test/resources/gigs/5105.1.gie.failing @@ -0,0 +1,300 @@ +-------------------------------------------------------------------------------- + +Test 5105 (part 1), Oblique Mercator (variant B), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4742 +inv + +step +proj=somerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +no_uoff +gamma=53.13010236111111 +ellps=GRS80 +units=m +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 117 12 +expect 807919.14 1329535.33 + +tolerance 0.05 m +accept 117 10 +expect 808784.98 1107678.47 + +tolerance 0.05 m +accept 117 9 +expect 809334.18 996918.21 + +tolerance 0.05 m +accept 117 8 +expect 809939.3 886240.18 + +tolerance 0.05 m +accept 116.8465522 6.8784583 +expect 793704.63 762081.05 + +tolerance 0.05 m +accept 117 6 +expect 811253.3 665041.27 + +tolerance 0.05 m +accept 117 5 +expect 811930.35 554475.63 + +tolerance 0.05 m +accept 117 4 +expect 812599.58 443902.71 + +tolerance 0.05 m +accept 115 4 +expect 590521.15 442890.86 + +tolerance 0.05 m +accept 117 3 +expect 813245.13 333300.13 + +tolerance 0.05 m +accept 117 2 +expect 813851.07 222645.51 + +tolerance 0.05 m +accept 117.0 1.0 +expect 814401.38 111916.45 + +tolerance 0.05 m +accept 109.6858208 -0.0001733 +expect 0 0 + +tolerance 0.05 m +accept 123 6 +expect 1475669.28 673118.57 + +tolerance 0.05 m +accept 122 6 +expect 1364854.86 671146.25 + +tolerance 0.05 m +accept 121 6 +expect 1254086.17 669446.25 + +tolerance 0.05 m +accept 120.0 6.0 +expect 1143352.6 668002.07 + +tolerance 0.05 m +accept 119.0 6.0 +expect 1032643.31 666797.35 + +tolerance 0.05 m +accept 118.0 6.0 +expect 921947.29 665815.82 + +tolerance 0.05 m +accept 117.0 6.0 +expect 811253.3 665041.27 + +tolerance 0.05 m +accept 116.0 6.0 +expect 700549.97 664457.59 + +tolerance 0.05 m +accept 115.0 6.0 +expect 589825.71 664048.72 + +tolerance 0.05 m +accept 114 6 +expect 479068.802 663798.63 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +proj=somerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +no_uoff +gamma=53.13010236111111 +ellps=GRS80 +units=m +inv + +step +init=epsg:4742 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 807919.14 1329535.33 +expect 117 12 + +tolerance 0.05 m +accept 808784.98 1107678.47 +expect 117 10 + +tolerance 0.05 m +accept 809334.18 996918.21 +expect 117 9 + +tolerance 0.05 m +accept 809939.3 886240.18 +expect 117 8 + +tolerance 0.05 m +accept 793704.63 762081.05 +expect 116.8465522 6.8784583 + +tolerance 0.05 m +accept 811253.3 665041.27 +expect 117 6 + +tolerance 0.05 m +accept 811930.35 554475.63 +expect 117 5 + +tolerance 0.05 m +accept 812599.58 443902.71 +expect 117 4 + +tolerance 0.05 m +accept 590521.15 442890.86 +expect 115 4 + +tolerance 0.05 m +accept 813245.13 333300.13 +expect 117 3 + +tolerance 0.05 m +accept 813851.07 222645.51 +expect 117 2 + +tolerance 0.05 m +accept 814401.38 111916.45 +expect 117.0 1.0 + +tolerance 0.05 m +accept 0 0 +expect 109.6858208 -0.0001733 + +tolerance 0.05 m +accept 1475669.28 673118.57 +expect 123 6 + +tolerance 0.05 m +accept 1364854.86 671146.25 +expect 122 6 + +tolerance 0.05 m +accept 1254086.17 669446.25 +expect 121 6 + +tolerance 0.05 m +accept 1143352.6 668002.07 +expect 120.0 6.0 + +tolerance 0.05 m +accept 1032643.31 666797.35 +expect 119.0 6.0 + +tolerance 0.05 m +accept 921947.29 665815.82 +expect 118.0 6.0 + +tolerance 0.05 m +accept 811253.3 665041.27 +expect 117.0 6.0 + +tolerance 0.05 m +accept 700549.97 664457.59 +expect 116.0 6.0 + +tolerance 0.05 m +accept 589825.71 664048.72 +expect 115.0 6.0 + +tolerance 0.05 m +accept 479068.802 663798.63 +expect 114 6 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4742 +inv + +step +proj=somerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +no_uoff +gamma=53.13010236111111 +ellps=GRS80 +units=m +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 117 12 +roundtrip 1000 + +tolerance 0.006 m +accept 117 10 +roundtrip 1000 + +tolerance 0.006 m +accept 117 9 +roundtrip 1000 + +tolerance 0.006 m +accept 117 8 +roundtrip 1000 + +tolerance 0.006 m +accept 116.8465522 6.8784583 +roundtrip 1000 + +tolerance 0.006 m +accept 117 6 +roundtrip 1000 + +tolerance 0.006 m +accept 117 5 +roundtrip 1000 + +tolerance 0.006 m +accept 117 4 +roundtrip 1000 + +tolerance 0.006 m +accept 115 4 +roundtrip 1000 + +tolerance 0.006 m +accept 117 3 +roundtrip 1000 + +tolerance 0.006 m +accept 117 2 +roundtrip 1000 + +tolerance 0.006 m +accept 117.0 1.0 +roundtrip 1000 + +tolerance 0.006 m +accept 109.6858208 -0.0001733 +roundtrip 1000 + +tolerance 0.006 m +accept 123 6 +roundtrip 1000 + +tolerance 0.006 m +accept 122 6 +roundtrip 1000 + +tolerance 0.006 m +accept 121 6 +roundtrip 1000 + +tolerance 0.006 m +accept 120.0 6.0 +roundtrip 1000 + +tolerance 0.006 m +accept 119.0 6.0 +roundtrip 1000 + +tolerance 0.006 m +accept 118.0 6.0 +roundtrip 1000 + +tolerance 0.006 m +accept 117.0 6.0 +roundtrip 1000 + +tolerance 0.006 m +accept 116.0 6.0 +roundtrip 1000 + +tolerance 0.006 m +accept 115.0 6.0 +roundtrip 1000 + +tolerance 0.006 m +accept 114 6 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5105.2.gie b/conformance/src/test/resources/gigs/5105.2.gie new file mode 100644 index 0000000..d24c739 --- /dev/null +++ b/conformance/src/test/resources/gigs/5105.2.gie @@ -0,0 +1,170 @@ +-------------------------------------------------------------------------------- + +Test 5105 (part 2), Oblique Mercator (variant B), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4237 +inv \ + +step +init=epsg:23700 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 16 48.5 +expect 424714.235 355124.6 + +tolerance 0.05 m +accept 17.2 48.0 +expect 512056.188 296756.716 + +tolerance 0.05 m +accept 17.5826505556 47.6361347222 +expect 539847.765 255701.086 + +tolerance 0.05 m +accept 19.0485716667 47.1443936111 +expect 650000 200000 + +tolerance 0.05 m +accept 19.2234294444 46.8756683333 +expect 663329.053 170142.318 + +tolerance 0.05 m +accept 20.1357405556 46.3703011111 +expect 733651.455 114532.099 + +tolerance 0.05 m +accept 21.4 45.7 +expect 833148.855 42191.482 + +tolerance 0.05 m +accept 22.3 49.3 +expect 886565.935 444656.613 + +tolerance 0.05 m +accept 21.2941986111 48.4899747222 +expect 815999.993 351999.998 + +tolerance 0.05 m +accept 19.2234294444 46.8756683333 +expect 663329.053 170142.318 + +tolerance 0.05 m +accept 17.6191536111 46.0687463889 +expect 539403.958 81440.103 + +tolerance 0.05 m +accept 16.36 45.5 +expect 439836.709 20816.456 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:23700 +inv \ + +step +init=epsg:4237 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 424714.235 355124.6 +expect 16 48.5 + +tolerance 0.05 m +accept 512056.188 296756.716 +expect 17.2 48.0 + +tolerance 0.05 m +accept 539847.765 255701.086 +expect 17.5826505556 47.6361347222 + +tolerance 0.05 m +accept 650000 200000 +expect 19.0485716667 47.1443936111 + +tolerance 0.05 m +accept 663329.053 170142.318 +expect 19.2234294444 46.8756683333 + +tolerance 0.05 m +accept 733651.455 114532.099 +expect 20.1357405556 46.3703011111 + +tolerance 0.05 m +accept 833148.855 42191.482 +expect 21.4 45.7 + +tolerance 0.05 m +accept 886565.935 444656.613 +expect 22.3 49.3 + +tolerance 0.05 m +accept 815999.993 351999.998 +expect 21.2941986111 48.4899747222 + +tolerance 0.05 m +accept 663329.053 170142.318 +expect 19.2234294444 46.8756683333 + +tolerance 0.05 m +accept 539403.958 81440.103 +expect 17.6191536111 46.0687463889 + +tolerance 0.05 m +accept 439836.709 20816.456 +expect 16.36 45.5 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4237 +inv \ + +step +init=epsg:23700 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 16 48.5 +roundtrip 1000 + +tolerance 0.006 m +accept 17.2 48.0 +roundtrip 1000 + +tolerance 0.006 m +accept 17.5826505556 47.6361347222 +roundtrip 1000 + +tolerance 0.006 m +accept 19.0485716667 47.1443936111 +roundtrip 1000 + +tolerance 0.006 m +accept 19.2234294444 46.8756683333 +roundtrip 1000 + +tolerance 0.006 m +accept 20.1357405556 46.3703011111 +roundtrip 1000 + +tolerance 0.006 m +accept 21.4 45.7 +roundtrip 1000 + +tolerance 0.006 m +accept 22.3 49.3 +roundtrip 1000 + +tolerance 0.006 m +accept 21.2941986111 48.4899747222 +roundtrip 1000 + +tolerance 0.006 m +accept 19.2234294444 46.8756683333 +roundtrip 1000 + +tolerance 0.006 m +accept 17.6191536111 46.0687463889 +roundtrip 1000 + +tolerance 0.006 m +accept 16.36 45.5 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5106.gie b/conformance/src/test/resources/gigs/5106.gie new file mode 100644 index 0000000..fd23b10 --- /dev/null +++ b/conformance/src/test/resources/gigs/5106.gie @@ -0,0 +1,302 @@ +-------------------------------------------------------------------------------- + +Test 5106, Hotine Oblique Mercator (variant A), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4742 +inv \ + +step +init=epsg:3376 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 117 12 +expect 807919.144 1329535.334 + +tolerance 0.05 m +accept 117 10 +expect 808784.981 1107678.473 + +tolerance 0.05 m +accept 117 9 +expect 809334.177 996918.212 + +tolerance 0.05 m +accept 117 8 +expect 809939.302 886240.183 + +tolerance 0.05 m +accept 116.846552222 6.87845833333 +expect 793704.631 762081.047 + +tolerance 0.05 m +accept 117 6 +expect 811253.303 665041.265 + +tolerance 0.05 m +accept 117 5 +expect 811930.345 554475.627 + +tolerance 0.05 m +accept 117 4 +expect 812599.582 443902.706 + +tolerance 0.05 m +accept 115 4 +expect 590521.147 442890.861 + +tolerance 0.05 m +accept 117 3 +expect 813245.133 333300.13 + +tolerance 0.05 m +accept 117 2 +expect 813851.067 222645.511 + +tolerance 0.05 m +accept 117 1 +expect 814401.375 111916.452 + +tolerance 0.05 m +accept 109.685820833 -0.000173333333333 +expect 0 0 + +tolerance 0.05 m +accept 123 6 +expect 1475669.281 673118.573 + +tolerance 0.05 m +accept 122 6 +expect 1364854.862 671146.254 + +tolerance 0.05 m +accept 121 6 +expect 1254086.173 669446.249 + +tolerance 0.05 m +accept 120 6 +expect 1143352.598 668002.074 + +tolerance 0.05 m +accept 119 6 +expect 1032643.312 666797.354 + +tolerance 0.05 m +accept 118 6 +expect 921947.286 665815.815 + +tolerance 0.05 m +accept 117 6 +expect 811253.303 665041.265 + +tolerance 0.05 m +accept 116 6 +expect 700549.965 664457.586 + +tolerance 0.05 m +accept 115 6 +expect 589825.706 664048.715 + +tolerance 0.05 m +accept 114 6 +expect 479068.802 663798.63 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:3376 +inv \ + +step +init=epsg:4742 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 807919.144 1329535.334 +expect 117 12 + +tolerance 0.05 m +accept 808784.981 1107678.473 +expect 117 10 + +tolerance 0.05 m +accept 809334.177 996918.212 +expect 117 9 + +tolerance 0.05 m +accept 809939.302 886240.183 +expect 117 8 + +tolerance 0.05 m +accept 793704.631 762081.047 +expect 116.846552222 6.87845833333 + +tolerance 0.05 m +accept 811253.303 665041.265 +expect 117 6 + +tolerance 0.05 m +accept 811930.345 554475.627 +expect 117 5 + +tolerance 0.05 m +accept 812599.582 443902.706 +expect 117 4 + +tolerance 0.05 m +accept 590521.147 442890.861 +expect 115 4 + +tolerance 0.05 m +accept 813245.133 333300.13 +expect 117 3 + +tolerance 0.05 m +accept 813851.067 222645.511 +expect 117 2 + +tolerance 0.05 m +accept 814401.375 111916.452 +expect 117 1 + +tolerance 0.05 m +accept 0 0 +expect 109.685820833 -0.000173333333333 + +tolerance 0.05 m +accept 1475669.281 673118.573 +expect 123 6 + +tolerance 0.05 m +accept 1364854.862 671146.254 +expect 122 6 + +tolerance 0.05 m +accept 1254086.173 669446.249 +expect 121 6 + +tolerance 0.05 m +accept 1143352.598 668002.074 +expect 120 6 + +tolerance 0.05 m +accept 1032643.312 666797.354 +expect 119 6 + +tolerance 0.05 m +accept 921947.286 665815.815 +expect 118 6 + +tolerance 0.05 m +accept 811253.303 665041.265 +expect 117 6 + +tolerance 0.05 m +accept 700549.965 664457.586 +expect 116 6 + +tolerance 0.05 m +accept 589825.706 664048.715 +expect 115 6 + +tolerance 0.05 m +accept 479068.802 663798.63 +expect 114 6 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4742 +inv \ + +step +init=epsg:3376 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 117 12 +roundtrip 1000 + +tolerance 0.006 m +accept 117 10 +roundtrip 1000 + +tolerance 0.006 m +accept 117 9 +roundtrip 1000 + +tolerance 0.006 m +accept 117 8 +roundtrip 1000 + +tolerance 0.006 m +accept 116.846552222 6.87845833333 +roundtrip 1000 + +tolerance 0.006 m +accept 117 6 +roundtrip 1000 + +tolerance 0.006 m +accept 117 5 +roundtrip 1000 + +tolerance 0.006 m +accept 117 4 +roundtrip 1000 + +tolerance 0.006 m +accept 115 4 +roundtrip 1000 + +tolerance 0.006 m +accept 117 3 +roundtrip 1000 + +tolerance 0.006 m +accept 117 2 +roundtrip 1000 + +tolerance 0.006 m +accept 117 1 +roundtrip 1000 + +tolerance 0.006 m +accept 109.685820833 -0.000173333333333 +roundtrip 1000 + +tolerance 0.006 m +accept 123 6 +roundtrip 1000 + +tolerance 0.006 m +accept 122 6 +roundtrip 1000 + +tolerance 0.006 m +accept 121 6 +roundtrip 1000 + +tolerance 0.006 m +accept 120 6 +roundtrip 1000 + +tolerance 0.006 m +accept 119 6 +roundtrip 1000 + +tolerance 0.006 m +accept 118 6 +roundtrip 1000 + +tolerance 0.006 m +accept 117 6 +roundtrip 1000 + +tolerance 0.006 m +accept 116 6 +roundtrip 1000 + +tolerance 0.006 m +accept 115 6 +roundtrip 1000 + +tolerance 0.006 m +accept 114 6 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5107.gie b/conformance/src/test/resources/gigs/5107.gie new file mode 100644 index 0000000..917b801 --- /dev/null +++ b/conformance/src/test/resources/gigs/5107.gie @@ -0,0 +1,182 @@ +-------------------------------------------------------------------------------- + +Test 5107, American Polyconic, v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4674 +inv \ + +step +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept -54 0 +expect 5000000.0 10000000.0 + +tolerance 0.05 m +accept -45 6 +expect 5996378.70982 10671650.0559 + +tolerance 0.05 m +accept -45 0 +expect 6001875.41714 10000000.0 + +tolerance 0.05 m +accept -45 -6 +expect 5996378.70982 9328349.94408 + +tolerance 0.05 m +accept -41 -13 +expect 6409689.58688 8526306.26193 + +tolerance 0.05 m +accept -38 -20 +expect 6671808.91963 7707735.72988 + +tolerance 0.05 m +accept -37 -24 +expect 6725584.49173 7240461.99578 + +tolerance 0.05 m +accept -36 -30 +expect 6729619.73995 6543762.57644 + +tolerance 0.05 m +accept -57 -30 +expect 4710574.22344 6676097.81117 + +tolerance 0.05 m +accept -54 -29.3674766667 +expect 5000000.0 6750000.0 + +tolerance 0.05 m +accept -47 -27.5 +expect 5691318.14689 6937461.05067 + +tolerance 0.05 m +accept -37 -24 +expect 6725584.49173 7240461.99578 + +tolerance 0.05 m +accept -30 -22.5 +expect 7458947.70133 7313327.31691 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +inv \ + +step +init=epsg:4674 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 5000000.0 10000000.0 +expect -54 0 + +tolerance 0.05 m +accept 5996378.70982 10671650.0559 +expect -45 6 + +tolerance 0.05 m +accept 6001875.41714 10000000.0 +expect -45 0 + +tolerance 0.05 m +accept 5996378.70982 9328349.94408 +expect -45 -6 + +tolerance 0.05 m +accept 6409689.58688 8526306.26193 +expect -41 -13 + +tolerance 0.05 m +accept 6671808.91963 7707735.72988 +expect -38 -20 + +tolerance 0.05 m +accept 6725584.49173 7240461.99578 +expect -37 -24 + +tolerance 0.05 m +accept 6729619.73995 6543762.57644 +expect -36 -30 + +tolerance 0.05 m +accept 4710574.22344 6676097.81117 +expect -57 -30 + +tolerance 0.05 m +accept 5000000.0 6750000.0 +expect -54 -29.3674766667 + +tolerance 0.05 m +accept 5691318.14689 6937461.05067 +expect -47 -27.5 + +tolerance 0.05 m +accept 6725584.49173 7240461.99578 +expect -37 -24 + +tolerance 0.05 m +accept 7458947.70133 7313327.31691 +expect -30 -22.5 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4674 +inv \ + +step +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -54 0 +roundtrip 1000 + +tolerance 0.006 m +accept -45 6 +roundtrip 1000 + +tolerance 0.006 m +accept -45 0 +roundtrip 1000 + +tolerance 0.006 m +accept -45 -6 +roundtrip 1000 + +tolerance 0.006 m +accept -41 -13 +roundtrip 1000 + +tolerance 0.006 m +accept -38 -20 +roundtrip 1000 + +tolerance 0.006 m +accept -37 -24 +roundtrip 1000 + +tolerance 0.006 m +accept -36 -30 +roundtrip 1000 + +tolerance 0.006 m +accept -57 -30 +roundtrip 1000 + +tolerance 0.006 m +accept -54 -29.3674766667 +roundtrip 1000 + +tolerance 0.006 m +accept -47 -27.5 +roundtrip 1000 + +tolerance 0.006 m +accept -37 -24 +roundtrip 1000 + +tolerance 0.006 m +accept -30 -22.5 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5108.gie b/conformance/src/test/resources/gigs/5108.gie new file mode 100644 index 0000000..2abdfc9 --- /dev/null +++ b/conformance/src/test/resources/gigs/5108.gie @@ -0,0 +1,236 @@ +-------------------------------------------------------------------------------- + +Test 5108, Cassini-Soldner, v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +# GDM2000 +# <4742> +proj=longlat +ellps=GRS80 <> + +# GDM2000 / Johor Grid +# <3377> +proj=cass +lat_0=2.121679744444445 +lon_0=103.4279362361111 +x_0=-14810.562 +y_0=8758.32 +ellps=GRS80 +units=m <> + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4742 +inv \ + +step +init=epsg:3377 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 106 10 +expect 267186.017 881108.902 + +tolerance 0.05 m +accept 106 9 +expect 268006.024 770398.186 + +tolerance 0.05 m +accept 106 8 +expect 268740.351 659692.254 + +tolerance 0.05 m +accept 106 7 +expect 269388.786 548990.588 + +tolerance 0.05 m +accept 106 6 +expect 269951.141 438292.666 + +tolerance 0.05 m +accept 106 5 +expect 270427.255 327597.962 + +tolerance 0.05 m +accept 106 4 +expect 270816.99 216905.945 + +tolerance 0.05 m +accept 106 3 +expect 271120.234 106216.081 + +tolerance 0.05 m +accept 103.561065778 2.0424676812 +expect 0 0 + +tolerance 0.05 m +accept 103.64025984 1.82776484381 +expect 8813.252 -23740.095 + +tolerance 0.05 m +accept 106 1 +expect 271466.923 -115159.332 + +tolerance 0.05 m +accept 109 5 +expect 603116.703 329668.599 + +tolerance 0.05 m +accept 108 5 +expect 492221.308 328807.336 + +tolerance 0.05 m +accept 107 5 +expect 381324.74 328117.472 + +tolerance 0.05 m +accept 106 5 +expect 270427.255 327597.962 + +tolerance 0.05 m +accept 105 5 +expect 159529.111 327248.012 + +tolerance 0.05 m +accept 104 5 +expect 48630.563 327067.097 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:3377 +inv \ + +step +init=epsg:4742 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 267186.017 881108.902 +expect 106 10 + +tolerance 0.05 m +accept 268006.024 770398.186 +expect 106 9 + +tolerance 0.05 m +accept 268740.351 659692.254 +expect 106 8 + +tolerance 0.05 m +accept 269388.786 548990.588 +expect 106 7 + +tolerance 0.05 m +accept 269951.141 438292.666 +expect 106 6 + +tolerance 0.05 m +accept 270427.255 327597.962 +expect 106 5 + +tolerance 0.05 m +accept 270816.99 216905.945 +expect 106 4 + +tolerance 0.05 m +accept 271120.234 106216.081 +expect 106 3 + +tolerance 0.05 m +accept 0 0 +expect 103.561065778 2.0424676812 + +tolerance 0.05 m +accept 8813.252 -23740.095 +expect 103.64025984 1.82776484381 + +tolerance 0.05 m +accept 271466.923 -115159.332 +expect 106 1 + +tolerance 0.05 m +accept 603116.703 329668.599 +expect 109 5 + +tolerance 0.05 m +accept 492221.308 328807.336 +expect 108 5 + +tolerance 0.05 m +accept 381324.74 328117.472 +expect 107 5 + +tolerance 0.05 m +accept 270427.255 327597.962 +expect 106 5 + +tolerance 0.05 m +accept 159529.111 327248.012 +expect 105 5 + +tolerance 0.05 m +accept 48630.563 327067.097 +expect 104 5 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4742 +inv \ + +step +init=epsg:3377 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 106 10 +roundtrip 1000 + +tolerance 0.006 m +accept 106 9 +roundtrip 1000 + +tolerance 0.006 m +accept 106 8 +roundtrip 1000 + +tolerance 0.006 m +accept 106 7 +roundtrip 1000 + +tolerance 0.006 m +accept 106 6 +roundtrip 1000 + +tolerance 0.006 m +accept 106 5 +roundtrip 1000 + +tolerance 0.006 m +accept 106 4 +roundtrip 1000 + +tolerance 0.006 m +accept 106 3 +roundtrip 1000 + +tolerance 0.006 m +accept 103.561065778 2.0424676812 +roundtrip 1000 + +tolerance 0.006 m +accept 103.64025984 1.82776484381 +roundtrip 1000 + +tolerance 0.006 m +accept 106 1 +roundtrip 1000 + +tolerance 0.006 m +accept 109 5 +roundtrip 1000 + +tolerance 0.006 m +accept 108 5 +roundtrip 1000 + +tolerance 0.006 m +accept 107 5 +roundtrip 1000 + +tolerance 0.006 m +accept 106 5 +roundtrip 1000 + +tolerance 0.006 m +accept 105 5 +roundtrip 1000 + +tolerance 0.006 m +accept 104 5 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5109.gie b/conformance/src/test/resources/gigs/5109.gie new file mode 100644 index 0000000..457c903 --- /dev/null +++ b/conformance/src/test/resources/gigs/5109.gie @@ -0,0 +1,182 @@ +-------------------------------------------------------------------------------- + +Test 5109, Albers Equal Area, v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4283 +inv \ + +step +init=epsg:3577 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 132 0 +expect 0 0 + +tolerance 0.05 m +accept 132 -27 +expect 0 -2926820.89 + +tolerance 0.05 m +accept 140 0 +expect 966973.98 -30285.6 + +tolerance 0.05 m +accept 140 -20 +expect 832799.36 -2170181.93 + +tolerance 0.05 m +accept 140 -40 +expect 693250.21 -4395794.49 + +tolerance 0.05 m +accept 140 -60 +expect 567313.29 -6404311.16 + +tolerance 0.05 m +accept 140 -80 +expect 486878.674 -7687130.029 + +tolerance 0.05 m +accept 120 -60 +expect -850274.75 -6426505.13 + +tolerance 0.05 m +accept 130 -60 +expect -141915.26 -6387653.78 + +tolerance 0.05 m +accept 140 -60 +expect 567313.29 -6404311.16 + +tolerance 0.05 m +accept 150 -60 +expect 1273067.747 -6476375.276 + +tolerance 0.05 m +accept 160 -60 +expect 1971026.26 -6603404.82 + +tolerance 0.05 m +accept 170 -60 +expect 2656914.716 -6784621.89 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:3577 +inv \ + +step +init=epsg:4283 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 0 0 +expect 132 0 + +tolerance 0.05 m +accept 0 -2926820.89 +expect 132 -27 + +tolerance 0.05 m +accept 966973.98 -30285.6 +expect 140 0 + +tolerance 0.05 m +accept 832799.36 -2170181.93 +expect 140 -20 + +tolerance 0.05 m +accept 693250.21 -4395794.49 +expect 140 -40 + +tolerance 0.05 m +accept 567313.29 -6404311.16 +expect 140 -60 + +tolerance 0.05 m +accept 486878.674 -7687130.029 +expect 140 -80 + +tolerance 0.05 m +accept -850274.75 -6426505.13 +expect 120 -60 + +tolerance 0.05 m +accept -141915.26 -6387653.78 +expect 130 -60 + +tolerance 0.05 m +accept 567313.29 -6404311.16 +expect 140 -60 + +tolerance 0.05 m +accept 1273067.747 -6476375.276 +expect 150 -60 + +tolerance 0.05 m +accept 1971026.26 -6603404.82 +expect 160 -60 + +tolerance 0.05 m +accept 2656914.716 -6784621.89 +expect 170 -60 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4283 +inv \ + +step +init=epsg:3577 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 132 0 +roundtrip 1000 + +tolerance 0.006 m +accept 132 -27 +roundtrip 1000 + +tolerance 0.006 m +accept 140 0 +roundtrip 1000 + +tolerance 0.006 m +accept 140 -20 +roundtrip 1000 + +tolerance 0.006 m +accept 140 -40 +roundtrip 1000 + +tolerance 0.006 m +accept 140 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 140 -80 +roundtrip 1000 + +tolerance 0.006 m +accept 120 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 130 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 140 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 150 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 160 -60 +roundtrip 1000 + +tolerance 0.006 m +accept 170 -60 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5110.gie.failing b/conformance/src/test/resources/gigs/5110.gie.failing new file mode 100644 index 0000000..bd1b845 --- /dev/null +++ b/conformance/src/test/resources/gigs/5110.gie.failing @@ -0,0 +1,158 @@ +-------------------------------------------------------------------------------- + +Test 5110, Lambert Azimuthal Equal Area, v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4258 +inv \ + +step +init=epsg:3035 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 5 70 +expect 4127824.65822 5214090.649 + +tolerance 0.05 m +accept 5 60 +expect 4041548.13 4109791.66 + +tolerance 0.05 m +accept 5 50 +expect 3962799.45 2999718.853 + +tolerance 0.05 m +accept 5 40 +expect 3892127.02 1892578.962 + +tolerance 0.05 m +accept 5 30 +expect 3830117.9 796781.677 + +tolerance 0.05 m +accept 10 52 +expect 4321000.0 3210000.0 + +tolerance 0.05 m +accept 0.0 50.0 +expect 3606514.43 3036305.967 + +tolerance 0.05 m +accept 3.0 50.0 +expect 3819948.288 3011432.894 + +tolerance 0.05 m +accept 5.0 50.0 +expect 3962799.451 2999718.853 + +tolerance 0.05 m +accept 8.0 50.0 +expect 4177612.521 2989464.315 + +tolerance 0.05 m +accept 10.0 50.0 +expect 4321000.0 2987510.567 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:3035 +inv \ + +step +init=epsg:4258 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 4127824.65822 5214090.649 +expect 5 70 + +tolerance 0.05 m +accept 4041548.13 4109791.66 +expect 5 60 + +tolerance 0.05 m +accept 3962799.45 2999718.853 +expect 5 50 + +tolerance 0.05 m +accept 3892127.02 1892578.962 +expect 5 40 + +tolerance 0.05 m +accept 3830117.9 796781.677 +expect 5 30 + +tolerance 0.05 m +accept 4321000.0 3210000.0 +expect 10 52 + +tolerance 0.05 m +accept 3606514.43 3036305.967 +expect 0.0 50.0 + +tolerance 0.05 m +accept 3819948.288 3011432.894 +expect 3.0 50.0 + +tolerance 0.05 m +accept 3962799.451 2999718.853 +expect 5.0 50.0 + +tolerance 0.05 m +accept 4177612.521 2989464.315 +expect 8.0 50.0 + +tolerance 0.05 m +accept 4321000.0 2987510.567 +expect 10.0 50.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4258 +inv \ + +step +init=epsg:3035 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 5 70 +roundtrip 1000 + +tolerance 0.006 m +accept 5 60 +roundtrip 1000 + +tolerance 0.006 m +accept 5 50 +roundtrip 1000 + +tolerance 0.006 m +accept 5 40 +roundtrip 1000 + +tolerance 0.006 m +accept 5 30 +roundtrip 1000 + +tolerance 0.006 m +accept 10 52 +roundtrip 1000 + +tolerance 0.006 m +accept 0.0 50.0 +roundtrip 1000 + +tolerance 0.006 m +accept 3.0 50.0 +roundtrip 1000 + +tolerance 0.006 m +accept 5.0 50.0 +roundtrip 1000 + +tolerance 0.006 m +accept 8.0 50.0 +roundtrip 1000 + +tolerance 0.006 m +accept 10.0 50.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5111.1.gie b/conformance/src/test/resources/gigs/5111.1.gie new file mode 100644 index 0000000..09cc4c0 --- /dev/null +++ b/conformance/src/test/resources/gigs/5111.1.gie @@ -0,0 +1,452 @@ +-------------------------------------------------------------------------------- + +Test 5111 (part 1), Mercator (variant A), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + +# Batavia +<4211> +proj=longlat +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 <> +# Batavia / NEIEZ +<3001> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-377,681,-50,0,0,0,0 +units=m <> + + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline towgs84=0,0,0 \ + +step +init=epsg:4211 +inv \ + +step +init=epsg:3001 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 100.0876483 77.6534822 +expect 2800000.0 15000000.0 + +tolerance 0.055 m +accept 100.0876483 73.1442856 +expect 2800000.0 13000000.0 + +tolerance 0.05 m +accept 100.0876483 67.0518325 +expect 2800000.0 11000000.0 + +tolerance 0.05 m +accept 100.0876483 58.9140458 +expect 2800000.0 9000000.0 + +tolerance 0.05 m +accept 100.0876483 48.2638981 +expect 2800000.0 7000000.0 + +tolerance 0.05 m +accept 100.0876483 34.8029044 +expect 2800000.0 5000000.0 + +tolerance 0.05 m +accept 100.0876483 18.7048581 +expect 2800000.0 3000000.0 + +tolerance 0.05 m +accept 100.0876483 0.9071392 +expect 2800000.0 1000000.0 + +tolerance 0.05 m +accept 110.0 0.0 +expect 3900000.0 900000.0 + +tolerance 0.05 m +accept 100.0876483 -0.9071392 +expect 2800000.0 800000.0 + +tolerance 0.05 m +accept 100.0876483 -1.8140483 +expect 2800000.0 700000.0 + +tolerance 0.05 m +accept 100.0876483 -2.0 +expect 2800000.0 679490.65 + +tolerance 0.05 m +accept 100.0876483 -3.6262553 +expect 2800000.0 500000.0 + +tolerance 0.05 m +accept 100.0876483 -4.531095 +expect 2800000.0 400000.0 + +tolerance 0.05 m +accept 100.0876483 -5.4347892 +expect 2800000.0 300000.0 + +tolerance 0.05 m +accept 100.0876483 -6.3371111 +expect 2800000.0 200000.0 + +tolerance 0.05 m +accept 100.0876483 -7.2378372 +expect 2800000.0 100000.0 + +tolerance 0.05 m +accept 74.8562083 -8.136745 +expect 0.0 0.0 + +tolerance 0.05 m +accept -71.0 -2.0 +expect 23764105.84 679490.65 + +tolerance 0.05 m +accept -90.0 -2.0 +expect 21655625.33 679490.65 + +tolerance 0.05 m +accept -120.0 -2.0 +expect 18326445.58 679490.65 + +tolerance 0.05 m +accept -150.0 -2.0 +expect 14997265.83 679490.65 + +tolerance 0.05 m +accept 180.0 -2.0 +expect 11668086.08 679490.65 + +tolerance 0.05 m +accept 150.0 -2.0 +expect 8338906.33 679490.65 + +tolerance 0.05 m +accept 120.0 -2.0 +expect 5009726.58 679490.65 + +tolerance 0.05 m +accept 110.0 -2.0 +expect 3900000.0 679490.65 + +tolerance 0.05 m +accept 106.8077194 -2.0 +expect 3545744.14 679490.65 + +tolerance 0.05 m +accept 100.0876483 -2.0 +expect 2800000.0 679490.65 + +tolerance 0.05 m +accept 90.0 -2.0 +expect 1680546.83 679490.65 + +tolerance 0.05 m +accept 60.0 -2.0 +expect -1648632.92 679490.65 + +tolerance 0.05 m +accept 30.0 -2.0 +expect -4977812.67 679490.65 + +tolerance 0.05 m +accept 0.0 -2.0 +expect -8306992.42 679490.65 + +tolerance 0.05 m +accept -30.0 -2.0 +expect -11636172.17 679490.65 + +tolerance 0.05 m +accept -60.0 -2.0 +expect -14965351.92 679490.65 + +tolerance 0.05 m +accept -69.0 -2.0 +expect -15964105.84 679490.65 + +-------------------------------------------------------------------------------- +operation +proj=pipeline towgs84=0,0,0 \ + +step +init=epsg:3001 +inv \ + +step +init=epsg:4211 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 2800000.0 15000000.0 +expect 100.0876483 77.6534822 + +tolerance 0.05 m +accept 2800000.0 13000000.0 +expect 100.0876483 73.1442856 + +tolerance 0.05 m +accept 2800000.0 11000000.0 +expect 100.0876483 67.0518325 + +tolerance 0.05 m +accept 2800000.0 9000000.0 +expect 100.0876483 58.9140458 + +tolerance 0.05 m +accept 2800000.0 7000000.0 +expect 100.0876483 48.2638981 + +tolerance 0.05 m +accept 2800000.0 5000000.0 +expect 100.0876483 34.8029044 + +tolerance 0.05 m +accept 2800000.0 3000000.0 +expect 100.0876483 18.7048581 + +tolerance 0.05 m +accept 2800000.0 1000000.0 +expect 100.0876483 0.9071392 + +tolerance 0.05 m +accept 3900000.0 900000.0 +expect 110.0 0.0 + +tolerance 0.05 m +accept 2800000.0 800000.0 +expect 100.0876483 -0.9071392 + +tolerance 0.05 m +accept 2800000.0 700000.0 +expect 100.0876483 -1.8140483 + +tolerance 0.05 m +accept 2800000.0 679490.65 +expect 100.0876483 -2.0 + +tolerance 0.05 m +accept 2800000.0 500000.0 +expect 100.0876483 -3.6262553 + +tolerance 0.05 m +accept 2800000.0 400000.0 +expect 100.0876483 -4.531095 + +tolerance 0.05 m +accept 2800000.0 300000.0 +expect 100.0876483 -5.4347892 + +tolerance 0.05 m +accept 2800000.0 200000.0 +expect 100.0876483 -6.3371111 + +tolerance 0.05 m +accept 2800000.0 100000.0 +expect 100.0876483 -7.2378372 + +tolerance 0.05 m +accept 0.0 0.0 +expect 74.8562083 -8.136745 + +tolerance 0.05 m +accept 23764105.84 679490.65 +expect -71.0 -2.0 + +tolerance 0.05 m +accept 21655625.33 679490.65 +expect -90.0 -2.0 + +tolerance 0.05 m +accept 18326445.58 679490.65 +expect -120.0 -2.0 + +tolerance 0.05 m +accept 14997265.83 679490.65 +expect -150.0 -2.0 + +tolerance 0.05 m +accept 11668086.08 679490.65 +expect 180.0 -2.0 + +tolerance 0.05 m +accept 8338906.33 679490.65 +expect 150.0 -2.0 + +tolerance 0.05 m +accept 5009726.58 679490.65 +expect 120.0 -2.0 + +tolerance 0.05 m +accept 3900000.0 679490.65 +expect 110.0 -2.0 + +tolerance 0.05 m +accept 3545744.14 679490.65 +expect 106.8077194 -2.0 + +tolerance 0.05 m +accept 2800000.0 679490.65 +expect 100.0876483 -2.0 + +tolerance 0.05 m +accept 1680546.83 679490.65 +expect 90.0 -2.0 + +tolerance 0.05 m +accept -1648632.92 679490.65 +expect 60.0 -2.0 + +tolerance 0.05 m +accept -4977812.67 679490.65 +expect 30.0 -2.0 + +tolerance 0.05 m +accept -8306992.42 679490.65 +expect 0.0 -2.0 + +tolerance 0.05 m +accept -11636172.17 679490.65 +expect -30.0 -2.0 + +tolerance 0.05 m +accept -14965351.92 679490.65 +expect -60.0 -2.0 + +tolerance 0.05 m +accept -15964105.84 679490.65 +expect -69.0 -2.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline towgs84=0,0,0 \ + +step +init=epsg:4211 +inv \ + +step +init=epsg:3001 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 100.0876483 77.6534822 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 73.1442856 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 67.0518325 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 58.9140458 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 48.2638981 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 34.8029044 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 18.7048581 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 0.9071392 +roundtrip 1000 + +tolerance 0.006 m +accept 110.0 0.0 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -0.9071392 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -1.8140483 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -3.6262553 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -4.531095 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -5.4347892 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -6.3371111 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -7.2378372 +roundtrip 1000 + +tolerance 0.006 m +accept 74.8562083 -8.136745 +roundtrip 1000 + +tolerance 0.006 m +accept -71.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -90.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -120.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -150.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 180.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 150.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 120.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 110.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 106.8077194 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 100.0876483 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 90.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 60.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 30.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 0.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -30.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -60.0 -2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -69.0 -2.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5111.2.gie.failing b/conformance/src/test/resources/gigs/5111.2.gie.failing new file mode 100644 index 0000000..815efb9 --- /dev/null +++ b/conformance/src/test/resources/gigs/5111.2.gie.failing @@ -0,0 +1,444 @@ +-------------------------------------------------------------------------------- + +Test 5111 (part 2), Mercator (variant A), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4813 +inv + +step +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept -6.7200711 77.6534822 +expect 2800000.0 15000000.0 + +tolerance 0.05 m +accept -6.7200711 73.1442856 +expect 2800000.0 13000000.0 + +tolerance 0.05 m +accept -6.7200711 67.0518325 +expect 2800000.0 11000000.0 + +tolerance 0.05 m +accept -6.7200711 58.9140458 +expect 2800000.0 9000000.0 + +tolerance 0.05 m +accept -6.7200711 48.2638981 +expect 2800000.0 7000000.0 + +tolerance 0.05 m +accept -6.7200711 34.8029044 +expect 2800000.0 5000000.0 + +tolerance 0.05 m +accept -6.7200711 18.7048581 +expect 2800000.0 3000000.0 + +tolerance 0.05 m +accept -6.7200711 0.9071392 +expect 2800000.0 1000000.0 + +tolerance 0.05 m +accept 3.1922806 0.0 +expect 3900000.0 900000.0 + +tolerance 0.05 m +accept -6.7200711 0.9071392 +expect 2800000.0 800000.0 + +tolerance 0.05 m +accept -6.7200711 1.8140483 +expect 2800000.0 700000.0 + +tolerance 0.05 m +accept -6.7200711 2.0 +expect 2800000.0 679490.65 + +tolerance 0.05 m +accept -6.7200711 3.6262553 +expect 2800000.0 500000.0 + +tolerance 0.05 m +accept -6.7200711 4.531095 +expect 2800000.0 400000.0 + +tolerance 0.05 m +accept -6.7200711 5.4347892 +expect 2800000.0 300000.0 + +tolerance 0.05 m +accept -6.7200711 6.3371111 +expect 2800000.0 200000.0 + +tolerance 0.05 m +accept -6.7200711 7.2378372 +expect 2800000.0 100000.0 + +tolerance 0.05 m +accept -31.9515111 8.136745 +expect 0.0 0.0 + +tolerance 0.05 m +accept -177.8077194 2.0 +expect 23764105.84 679490.65 + +tolerance 0.05 m +accept 163.1922806 2.0 +expect 21655625.33 679490.65 + +tolerance 0.05 m +accept 133.1922806 2.0 +expect 18326445.58 679490.65 + +tolerance 0.05 m +accept 103.1922806 2.0 +expect 14997265.83 679490.65 + +tolerance 0.05 m +accept 73.1922806 2.0 +expect 11668086.08 679490.65 + +tolerance 0.05 m +accept 43.1922806 2.0 +expect 8338906.33 679490.65 + +tolerance 0.05 m +accept 13.1922806 2.0 +expect 5009726.58 679490.65 + +tolerance 0.05 m +accept 3.1922806 2.0 +expect 3900000.0 679490.65 + +tolerance 0.05 m +accept 0.0 2.0 +expect 3545744.14 679490.65 + +tolerance 0.05 m +accept -6.7200711 2.0 +expect 2800000.0 679490.65 + +tolerance 0.05 m +accept -16.8077194 2.0 +expect 1680546.83 679490.65 + +tolerance 0.05 m +accept -46.8077194 2.0 +expect -1648632.92 679490.65 + +tolerance 0.05 m +accept -76.8077194 2.0 +expect -4977812.67 679490.65 + +tolerance 0.05 m +accept -106.8077194 2.0 +expect -8306992.42 679490.65 + +tolerance 0.05 m +accept -136.8077194 2.0 +expect -11636172.17 679490.65 + +tolerance 0.05 m +accept -166.8077194 2.0 +expect -14965351.92 679490.65 + +tolerance 0.05 m +accept -175.8077194 2.0 +expect -15964105.84 679490.65 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m +inv + +step +init=epsg:4813 +-------------------------------------------------------------------------------- +tolerance 0.05 m +accept 2800000.0 15000000.0 +expect -6.7200711 77.6534822 + +tolerance 0.05 m +accept 2800000.0 13000000.0 +expect -6.7200711 73.1442856 + +tolerance 0.05 m +accept 2800000.0 11000000.0 +expect -6.7200711 67.0518325 + +tolerance 0.05 m +accept 2800000.0 9000000.0 +expect -6.7200711 58.9140458 + +tolerance 0.05 m +accept 2800000.0 7000000.0 +expect -6.7200711 48.2638981 + +tolerance 0.05 m +accept 2800000.0 5000000.0 +expect -6.7200711 34.8029044 + +tolerance 0.05 m +accept 2800000.0 3000000.0 +expect -6.7200711 18.7048581 + +tolerance 0.05 m +accept 2800000.0 1000000.0 +expect -6.7200711 0.9071392 + +tolerance 0.05 m +accept 3900000.0 900000.0 +expect 3.1922806 0.0 + +tolerance 0.05 m +accept 2800000.0 800000.0 +expect -6.7200711 0.9071392 + +tolerance 0.05 m +accept 2800000.0 700000.0 +expect -6.7200711 1.8140483 + +tolerance 0.05 m +accept 2800000.0 679490.65 +expect -6.7200711 2.0 + +tolerance 0.05 m +accept 2800000.0 500000.0 +expect -6.7200711 3.6262553 + +tolerance 0.05 m +accept 2800000.0 400000.0 +expect -6.7200711 4.531095 + +tolerance 0.05 m +accept 2800000.0 300000.0 +expect -6.7200711 5.4347892 + +tolerance 0.05 m +accept 2800000.0 200000.0 +expect -6.7200711 6.3371111 + +tolerance 0.05 m +accept 2800000.0 100000.0 +expect -6.7200711 7.2378372 + +tolerance 0.05 m +accept 0.0 0.0 +expect -31.9515111 8.136745 + +tolerance 0.05 m +accept 23764105.84 679490.65 +expect -177.8077194 2.0 + +tolerance 0.05 m +accept 21655625.33 679490.65 +expect 163.1922806 2.0 + +tolerance 0.05 m +accept 18326445.58 679490.65 +expect 133.1922806 2.0 + +tolerance 0.05 m +accept 14997265.83 679490.65 +expect 103.1922806 2.0 + +tolerance 0.05 m +accept 11668086.08 679490.65 +expect 73.1922806 2.0 + +tolerance 0.05 m +accept 8338906.33 679490.65 +expect 43.1922806 2.0 + +tolerance 0.05 m +accept 5009726.58 679490.65 +expect 13.1922806 2.0 + +tolerance 0.05 m +accept 3900000.0 679490.65 +expect 3.1922806 2.0 + +tolerance 0.05 m +accept 3545744.14 679490.65 +expect 0.0 2.0 + +tolerance 0.05 m +accept 2800000.0 679490.65 +expect -6.7200711 2.0 + +tolerance 0.05 m +accept 1680546.83 679490.65 +expect -16.8077194 2.0 + +tolerance 0.05 m +accept -1648632.92 679490.65 +expect -46.8077194 2.0 + +tolerance 0.05 m +accept -4977812.67 679490.65 +expect -76.8077194 2.0 + +tolerance 0.05 m +accept -8306992.42 679490.65 +expect -106.8077194 2.0 + +tolerance 0.05 m +accept -11636172.17 679490.65 +expect -136.8077194 2.0 + +tolerance 0.05 m +accept -14965351.92 679490.65 +expect -166.8077194 2.0 + +tolerance 0.05 m +accept -15964105.84 679490.65 +expect -175.8077194 2.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4813 +inv + +step +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept -6.7200711 77.6534822 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 73.1442856 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 67.0518325 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 58.9140458 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 48.2638981 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 34.8029044 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 18.7048581 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 0.9071392 +roundtrip 1000 + +tolerance 0.006 m +accept 3.1922806 0.0 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 0.9071392 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 1.8140483 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 3.6262553 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 4.531095 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 5.4347892 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 6.3371111 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 7.2378372 +roundtrip 1000 + +tolerance 0.006 m +accept -31.9515111 8.136745 +roundtrip 1000 + +tolerance 0.006 m +accept -177.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 163.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 133.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 103.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 73.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 43.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 13.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 3.1922806 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept 0.0 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -6.7200711 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -16.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -46.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -76.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -106.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -136.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -166.8077194 2.0 +roundtrip 1000 + +tolerance 0.006 m +accept -175.8077194 2.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5112.gie b/conformance/src/test/resources/gigs/5112.gie new file mode 100644 index 0000000..02e3c92 --- /dev/null +++ b/conformance/src/test/resources/gigs/5112.gie @@ -0,0 +1,77 @@ +-------------------------------------------------------------------------------- + +Test 5112, Mercator (variant B), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation proj=pipeline \ + step init=epsg:4284 inv \ + step init=epsg:3388 + +tolerance 50 mm +-------------------------------------------------------------------------------- +accept 51.0 42.0 +expect 0.0 3819897.85 + +accept 51.0 0.0 +expect 0.0 0.0 + +accept 57.0 0.0 +expect 497112.88 0.0 + +accept 54.0 20.5 +expect 248556.44 1724781.5 + +accept 67.0 -41.0 +expect 1325634.35 -3709687.25 + +-------------------------------------------------------------------------------- +operation proj=pipeline \ + step init=epsg:3388 inv \ + step init=epsg:4284 + +tolerance 50 mm +-------------------------------------------------------------------------------- +accept 0.0 3819897.85 +expect 51.0 42.0 + +accept 0.0 0.0 +expect 51.0 0.0 + +accept 497112.88 0.0 +expect 57.0 0.0 + +accept 248556.44 1724781.5 +expect 54.0 20.5 + +accept 1325634.35 -3709687.25 +expect 67.0 -41.0 + +-------------------------------------------------------------------------------- +operation proj=pipeline towgs84=0,0,0 \ + step init=epsg:4284 inv \ + step init=epsg:3388 + +tolerance 6 mm +-------------------------------------------------------------------------------- +accept 51.0 42.0 +roundtrip 1000 + +accept 51.0 0.0 +roundtrip 1000 + +accept 57.0 0.0 +roundtrip 1000 + +accept 54.0 20.5 +roundtrip 1000 + +accept 67.0 -41.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5113.gie b/conformance/src/test/resources/gigs/5113.gie new file mode 100644 index 0000000..c7ee673 --- /dev/null +++ b/conformance/src/test/resources/gigs/5113.gie @@ -0,0 +1,86 @@ +-------------------------------------------------------------------------------- + +Test 5113, Transverse Mercator (South Oriented), v2-0_2011-06-28. + +-------------------------------------------------------------------------------- + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4148 +inv \ + +step +init=epsg:2049 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept 22.5 0.0 +expect -166998.44 0.0 + +tolerance 0.03 m +accept 21.5 -25.0 +expect -50475.46 2766147.25 + +tolerance 0.03 m +accept 20.5 -30.0 +expect 48243.45 3320218.65 + +tolerance 0.03 m +accept 19.5 -35.0 +expect 136937.65 3875621.18 + +tolerance 0.03 m +accept 19.5 -35.0 +expect 136937.65 3875621.18 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:2049 +inv \ + +step +init=epsg:4148 +-------------------------------------------------------------------------------- +tolerance 0.03 m +accept -166998.44 0.0 +expect 22.5 0.0 + +tolerance 0.03 m +accept -50475.46 2766147.25 +expect 21.5 -25.0 + +tolerance 0.03 m +accept 48243.45 3320218.65 +expect 20.5 -30.0 + +tolerance 0.03 m +accept 136937.65 3875621.18 +expect 19.5 -35.0 + +tolerance 0.03 m +accept 136937.65 3875621.18 +expect 19.5 -35.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4148 +inv \ + +step +init=epsg:2049 +-------------------------------------------------------------------------------- +tolerance 0.006 m +accept 22.5 0.0 +roundtrip 1000 + +tolerance 0.006 m +accept 21.5 -25.0 +roundtrip 1000 + +tolerance 0.006 m +accept 20.5 -30.0 +roundtrip 1000 + +tolerance 0.006 m +accept 19.5 -35.0 +roundtrip 1000 + +tolerance 0.006 m +accept 19.5 -35.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5201.gie b/conformance/src/test/resources/gigs/5201.gie new file mode 100644 index 0000000..504921d --- /dev/null +++ b/conformance/src/test/resources/gigs/5201.gie @@ -0,0 +1,356 @@ +-------------------------------------------------------------------------------- + +Test 5201, Geographic Geocentric conversions, v2.0_2011-09-28. (EPSG 4979 - WGS84 3d has been replaced with EPSG code 4326 WGS84 2d). + +-------------------------------------------------------------------------------- + +# WGS 84 +<4978> +proj=geocent +datum=WGS84 +units=m <> +# WGS 84 +<4326> +proj=longlat +datum=WGS84 <> + + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4978 +inv \ + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 0.01 m +accept -962479.5924 555687.8517 6260738.6526 +expect 150 80 1214.137 + +tolerance 0.01 m +accept -962297.0059 555582.4354 6259542.961 +expect 150 80 0 + +tolerance 0.01 m +accept -1598248.169 2768777.623 5501278.468 +expect 119.99524538 60.00475191 619.6317 + +tolerance 0.01 m +accept -1598023.169 2768387.912 5500499.045 +expect 119.9952447 60.00475258 -280.3683 + +tolerance 0.01 m +accept 2764210.4054 4787752.865 3170468.5199 +expect 60 30 189.569 + +tolerance 0.01 m +accept 2764128.3196 4787610.6883 3170373.7354 +expect 60 30 0 + +tolerance 0.01 m +accept 6377934.396 -112 434 +expect -0.00100615 0.00392509 -202.5882 + +tolerance 0.01 m +accept 6374934.396 -112 434 +expect -0.00100662 0.00392695 -3202.5881 + +tolerance 0.01 m +accept 6367934.396 -112 434 +expect -0.00100773 0.00393129 -10202.5881 + +tolerance 0.01 m +accept 2764128.3196 -4787610.6883 -3170373.7354 +expect -60 -30 0 + +tolerance 0.01 m +accept 2763900.3489 -4787215.8313 -3170110.4974 +expect -60 -30 -526.476 + +tolerance 0.01 m +accept 2763880.8633 -4787182.0813 -3170087.9974 +expect -60 -30 -571.476 + +tolerance 0.01 m +accept -1598023.169 -2768611.912 -5499631.045 +expect -119.99323757 -59.99934884 -935.0995 + +tolerance 0.01 m +accept -1597798.169 -2768222.201 -5498851.622 +expect -119.99323663 -59.99934874 -1835.0995 + +tolerance 0.01 m +accept -962297.0059 -555582.4354 -6259542.961 +expect -150 -80 0 + +tolerance 0.01 m +accept -962150.945 -555498.1071 -6258586.4616 +expect -150 -80 -971.255 + +tolerance 0.01 m +accept -961798.2951 -555294.5046 -6256277.0874 +expect -150 -80 -3316.255 + +tolerance 0.01 m +accept -2187336.719 -112 5971017.093 +expect -179.99706624 70.00490733 -223.6178 + +tolerance 0.01 m +accept -2904698.5551 -2904698.5551 4862789.0377 +expect -135 50 0 + +tolerance 0.01 m +accept 371 -5783593.614 2679326.11 +expect -89.99632465 25.00366329 -274.7286 + +tolerance 0.01 m +accept 6378137 0 0 +expect 0 0 0 + +tolerance 0.01 m +accept -4087095.478 2977467.559 -3875457.429 +expect 143.92649252 -37.65282217 737.7182 + +tolerance 0.01 m +accept -4085919.959 2976611.233 -3874335.274 +expect 143.92649211 -37.65282206 -1099.2288 + +tolerance 0.01 m +accept -4084000.165 2975212.729 -3872502.631 +expect 143.92649143 -37.65282187 -4099.2288 + +tolerance 0.01 m +accept -4079520.647 2971949.553 -3868226.465 +expect 143.92648984 -37.65282143 -11099.2288 + +tolerance 0.01 m +accept -2904698.5551 2904698.5551 -4862789.0377 +expect 135 -50 0 + +tolerance 0.01 m +accept -2187336.719 -112 -5970149.093 +expect -179.99706624 -70.00224647 -1039.2896 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4326 +inv \ + +step +init=epsg:4978 +-------------------------------------------------------------------------------- +tolerance 0.01 m +accept 150 80 1214.137 +expect -962479.5924 555687.8517 6260738.6526 + +tolerance 0.01 m +accept 150 80 0 +expect -962297.0059 555582.4354 6259542.961 + +tolerance 0.01 m +accept 119.99524538 60.00475191 619.6317 +expect -1598248.169 2768777.623 5501278.468 + +tolerance 0.01 m +accept 119.9952447 60.00475258 -280.3683 +expect -1598023.169 2768387.912 5500499.045 + +tolerance 0.01 m +accept 60 30 189.569 +expect 2764210.4054 4787752.865 3170468.5199 + +tolerance 0.01 m +accept 60 30 0 +expect 2764128.3196 4787610.6883 3170373.7354 + +tolerance 0.01 m +accept -0.00100615 0.00392509 -202.5882 +expect 6377934.396 -112 434 + +tolerance 0.01 m +accept -0.00100662 0.00392695 -3202.5881 +expect 6374934.396 -112 434 + +tolerance 0.01 m +accept -0.00100773 0.00393129 -10202.5881 +expect 6367934.396 -112 434 + +tolerance 0.01 m +accept -60 -30 0 +expect 2764128.3196 -4787610.6883 -3170373.7354 + +tolerance 0.01 m +accept -60 -30 -526.476 +expect 2763900.3489 -4787215.8313 -3170110.4974 + +tolerance 0.01 m +accept -60 -30 -571.476 +expect 2763880.8633 -4787182.0813 -3170087.9974 + +tolerance 0.01 m +accept -119.99323757 -59.99934884 -935.0995 +expect -1598023.169 -2768611.912 -5499631.045 + +tolerance 0.01 m +accept -119.99323663 -59.99934874 -1835.0995 +expect -1597798.169 -2768222.201 -5498851.622 + +tolerance 0.01 m +accept -150 -80 0 +expect -962297.0059 -555582.4354 -6259542.961 + +tolerance 0.01 m +accept -150 -80 -971.255 +expect -962150.945 -555498.1071 -6258586.4616 + +tolerance 0.01 m +accept -150 -80 -3316.255 +expect -961798.2951 -555294.5046 -6256277.0874 + +tolerance 0.01 m +accept -179.99706624 70.00490733 -223.6178 +expect -2187336.719 -112 5971017.093 + +tolerance 0.01 m +accept -135 50 0 +expect -2904698.5551 -2904698.5551 4862789.0377 + +tolerance 0.01 m +accept -89.99632465 25.00366329 -274.7286 +expect 371 -5783593.614 2679326.11 + +tolerance 0.01 m +accept 0 0 0 +expect 6378137 0 0 + +tolerance 0.01 m +accept 143.92649252 -37.65282217 737.7182 +expect -4087095.478 2977467.559 -3875457.429 + +tolerance 0.01 m +accept 143.92649211 -37.65282206 -1099.2288 +expect -4085919.959 2976611.233 -3874335.274 + +tolerance 0.01 m +accept 143.92649143 -37.65282187 -4099.2288 +expect -4084000.165 2975212.729 -3872502.631 + +tolerance 0.01 m +accept 143.92648984 -37.65282143 -11099.2288 +expect -4079520.647 2971949.553 -3868226.465 + +tolerance 0.01 m +accept 135 -50 0 +expect -2904698.5551 2904698.5551 -4862789.0377 + +tolerance 0.01 m +accept -179.99706624 -70.00224647 -1039.2896 +expect -2187336.719 -112 -5970149.093 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4978 +inv \ + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 0.01 m +accept -962479.5924 555687.8517 6260738.6526 +roundtrip 1000 + +tolerance 0.01 m +accept -962297.0059 555582.4354 6259542.961 +roundtrip 1000 + +tolerance 0.01 m +accept -1598248.169 2768777.623 5501278.468 +roundtrip 1000 + +tolerance 0.01 m +accept -1598023.169 2768387.912 5500499.045 +roundtrip 1000 + +tolerance 0.01 m +accept 2764210.4054 4787752.865 3170468.5199 +roundtrip 1000 + +tolerance 0.01 m +accept 2764128.3196 4787610.6883 3170373.7354 +roundtrip 1000 + +tolerance 0.01 m +accept 6377934.396 -112 434 +roundtrip 1000 + +tolerance 0.01 m +accept 6374934.396 -112 434 +roundtrip 1000 + +tolerance 0.01 m +accept 6367934.396 -112 434 +roundtrip 1000 + +tolerance 0.01 m +accept 2764128.3196 -4787610.6883 -3170373.7354 +roundtrip 1000 + +tolerance 0.01 m +accept 2763900.3489 -4787215.8313 -3170110.4974 +roundtrip 1000 + +tolerance 0.01 m +accept 2763880.8633 -4787182.0813 -3170087.9974 +roundtrip 1000 + +tolerance 0.01 m +accept -1598023.169 -2768611.912 -5499631.045 +roundtrip 1000 + +tolerance 0.01 m +accept -1597798.169 -2768222.201 -5498851.622 +roundtrip 1000 + +tolerance 0.01 m +accept -962297.0059 -555582.4354 -6259542.961 +roundtrip 1000 + +tolerance 0.01 m +accept -962150.945 -555498.1071 -6258586.4616 +roundtrip 1000 + +tolerance 0.01 m +accept -961798.2951 -555294.5046 -6256277.0874 +roundtrip 1000 + +tolerance 0.01 m +accept -2187336.719 -112 5971017.093 +roundtrip 1000 + +tolerance 0.01 m +accept -2904698.5551 -2904698.5551 4862789.0377 +roundtrip 1000 + +tolerance 0.01 m +accept 371 -5783593.614 2679326.11 +roundtrip 1000 + +tolerance 0.01 m +accept 6378137 0 0 +roundtrip 1000 + +tolerance 0.01 m +accept -4087095.478 2977467.559 -3875457.429 +roundtrip 1000 + +tolerance 0.01 m +accept -4085919.959 2976611.233 -3874335.274 +roundtrip 1000 + +tolerance 0.01 m +accept -4084000.165 2975212.729 -3872502.631 +roundtrip 1000 + +tolerance 0.01 m +accept -4079520.647 2971949.553 -3868226.465 +roundtrip 1000 + +tolerance 0.01 m +accept -2904698.5551 2904698.5551 -4862789.0377 +roundtrip 1000 + +tolerance 0.01 m +accept -2187336.719 -112 -5970149.093 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5203.1.gie.failing b/conformance/src/test/resources/gigs/5203.1.gie.failing new file mode 100644 index 0000000..960b917 --- /dev/null +++ b/conformance/src/test/resources/gigs/5203.1.gie.failing @@ -0,0 +1,192 @@ +-------------------------------------------------------------------------------- + +GIGS Test 5203 (part 1), Position Vector 7-parameter transformation, v2.0_2011-06-28. Geographic 2D domain (EPSG method code 9606). + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4277 +inv + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept 150.00567472 79.99487333 +expect 150.0 80.0 + +tolerance 2.77777777778e-07 m +accept 120.0 60.0 +expect 119.99435889 60.00569306 + +tolerance 2.77777777778e-07 m +accept 60.00446778 29.99566778 +expect 60.0 30.0 + +tolerance 2.77777777778e-07 m +accept 0.0 0.0 +expect -0.00089056 0.00483333 + +tolerance 2.77777777778e-07 m +accept -60.00357056 -30.00504639 +expect -60.0 -30.0 + +tolerance 2.77777777778e-07 m +accept -120.0 -60.0 +expect -119.9918525 -59.99907361 + +tolerance 2.77777777778e-07 m +accept -150.01693111 -79.99778139 +expect -150.0 -80.0 + +tolerance 2.77777777778e-07 m +accept -180.0 70.0 +expect -179.99637361 70.005945 + +tolerance 2.77777777778e-07 m +accept -135.00596333 49.99458694 +expect -135.0 50.0 + +tolerance 2.77777777778e-07 m +accept -90.0 25.0 +expect -89.99531139 25.00445833 + +tolerance 2.77777777778e-07 m +accept 0.00089056 -0.00483333 +expect 0.0 0.0 + +tolerance 2.77777777778e-07 m +accept 143.9279419 -37.6532236 +expect 143.92634806 -37.65235306 + +tolerance 2.77777777778e-07 m +accept 135.00291194 -49.99973028 +expect 135.0 -50.0 + +tolerance 2.77777777778e-07 m +accept 180.0 -70.0 +expect -179.99660139 -70.002485 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4326 +inv + +step +init=epsg:4277 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept 150.0 80.0 +expect 150.00567472 79.99487333 + +tolerance 2.77777777778e-07 m +accept 119.99435889 60.00569306 +expect 120.0 60.0 + +tolerance 2.77777777778e-07 m +accept 60.0 30.0 +expect 60.00446778 29.99566778 + +tolerance 2.77777777778e-07 m +accept -0.00089056 0.00483333 +expect 0.0 0.0 + +tolerance 2.77777777778e-07 m +accept -60.0 -30.0 +expect -60.00357056 -30.00504639 + +tolerance 2.77777777778e-07 m +accept -119.9918525 -59.99907361 +expect -120.0 -60.0 + +tolerance 2.77777777778e-07 m +accept -150.0 -80.0 +expect -150.01693111 -79.99778139 + +tolerance 2.77777777778e-07 m +accept -179.99637361 70.005945 +expect -180.0 70.0 + +tolerance 2.77777777778e-07 m +accept -135.0 50.0 +expect -135.00596333 49.99458694 + +tolerance 2.77777777778e-07 m +accept -89.99531139 25.00445833 +expect -90.0 25.0 + +tolerance 2.77777777778e-07 m +accept 0.0 0.0 +expect 0.00089056 -0.00483333 + +tolerance 2.77777777778e-07 m +accept 143.92634806 -37.65235306 +expect 143.9279419 -37.6532236 + +tolerance 2.77777777778e-07 m +accept 135.0 -50.0 +expect 135.00291194 -49.99973028 + +tolerance 2.77777777778e-07 m +accept -179.99660139 -70.002485 +expect 180.0 -70.0 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4277 +inv + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 5.55555555556e-08 m +accept 150.00567472 79.99487333 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 120.0 60.0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 60.00446778 29.99566778 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 0.0 0.0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -60.00357056 -30.00504639 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -120.0 -60.0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -150.01693111 -79.99778139 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -180.0 70.0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -135.00596333 49.99458694 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -90.0 25.0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 0.00089056 -0.00483333 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 143.9279419 -37.6532236 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 135.00291194 -49.99973028 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 180.0 -70.0 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5204.1.gie.failing b/conformance/src/test/resources/gigs/5204.1.gie.failing new file mode 100644 index 0000000..3c7e3ff --- /dev/null +++ b/conformance/src/test/resources/gigs/5204.1.gie.failing @@ -0,0 +1,192 @@ +-------------------------------------------------------------------------------- + +GIGS Test 5204, Coordinate Frame 7-parameter transformation, v2.0_2011-06-28. Geographic 2D domain (EPSG method code 9607) + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4313 +inv + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept 149.99825389 80.00155167 +expect 150 80 + +tolerance 2.77777777778e-07 m +accept 120 60 +expect 120.00197111 59.99807333 + +tolerance 2.77777777778e-07 m +accept 59.99822194 30.00134083 +expect 60 30 + +tolerance 2.77777777778e-07 m +accept 0 0 +expect 0.00098139 -0.00081028 + +tolerance 2.77777777778e-07 m +accept -59.99991333 -29.99943917 +expect -60 -30 + +tolerance 2.77777777778e-07 m +accept -120 -60 +expect -120.00150694 -59.999835 + +tolerance 2.77777777778e-07 m +accept -149.99532167 -80.00054917 +expect -150 -80 + +tolerance 2.77777777778e-07 m +accept -180 70 +expect 179.99939778 69.99812806 + +tolerance 2.77777777778e-07 m +accept -134.99891389 50.00183 +expect -135 50 + +tolerance 2.77777777778e-07 m +accept -90 25 +expect -90.00060583 24.99862667 + +tolerance 2.77777777778e-07 m +accept -0.00098139 0.00081028 +expect 0 0 + +tolerance 2.77777777778e-07 m +accept 143.9279419 -37.6532236 +expect 143.92857222 -37.65257083 + +tolerance 2.77777777778e-07 m +accept 134.99913472 -50.00096139 +expect 135 -50 + +tolerance 2.77777777778e-07 m +accept 180 -70 +expect 179.99888667 -69.99901667 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4326 +inv + +step +init=epsg:4313 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept 150 80 +expect 149.99825389 80.00155167 + +tolerance 2.77777777778e-07 m +accept 120.00197111 59.99807333 +expect 120 60 + +tolerance 2.77777777778e-07 m +accept 60 30 +expect 59.99822194 30.00134083 + +tolerance 2.77777777778e-07 m +accept 0.00098139 -0.00081028 +expect 0 0 + +tolerance 2.77777777778e-07 m +accept -60 -30 +expect -59.99991333 -29.99943917 + +tolerance 2.77777777778e-07 m +accept -120.00150694 -59.999835 +expect -120 -60 + +tolerance 2.77777777778e-07 m +accept -150 -80 +expect -149.99532167 -80.00054917 + +tolerance 2.77777777778e-07 m +accept 179.99939778 69.99812806 +expect -180 70 + +tolerance 2.77777777778e-07 m +accept -135 50 +expect -134.99891389 50.00183 + +tolerance 2.77777777778e-07 m +accept -90.00060583 24.99862667 +expect -90 25 + +tolerance 2.77777777778e-07 m +accept 0 0 +expect -0.00098139 0.00081028 + +tolerance 2.77777777778e-07 m +accept 143.92857222 -37.65257083 +expect 143.9279419 -37.6532236 + +tolerance 2.77777777778e-07 m +accept 135 -50 +expect 134.99913472 -50.00096139 + +tolerance 2.77777777778e-07 m +accept 179.99888667 -69.99901667 +expect 180 -70 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4313 +inv + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 5.55555555556e-08 m +accept 149.99825389 80.00155167 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 120 60 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 59.99822194 30.00134083 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 0 0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -59.99991333 -29.99943917 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -120 -60 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -149.99532167 -80.00054917 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -180 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -134.99891389 50.00183 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -90 25 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -0.00098139 0.00081028 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 143.9279419 -37.6532236 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 134.99913472 -50.00096139 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 180 -70 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5205.1.gie.failing b/conformance/src/test/resources/gigs/5205.1.gie.failing new file mode 100644 index 0000000..df4cb67 --- /dev/null +++ b/conformance/src/test/resources/gigs/5205.1.gie.failing @@ -0,0 +1,192 @@ +-------------------------------------------------------------------------------- + +GIGS Test 5205 (Part 1), Molodensky-Badekas 10-parameter transformation, v2.0_2011-06-28. Geographic 2D domain (EPSG method code 9636) + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4289 +inv + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept 150.01814371 79.99494639 +expect 150 80 + +tolerance 2.77777777778e-07 m +accept 120 60 +expect 119.99001559 60.00441792 + +tolerance 2.77777777778e-07 m +accept 60.00535007 29.99746103 +expect 60 30 + +tolerance 2.77777777778e-07 m +accept 0 0 +expect -7.025e-05 0.0041133 + +tolerance 2.77777777778e-07 m +accept -60.00473241 -30.0042486 +expect -60 -30 + +tolerance 2.77777777778e-07 m +accept -120 -60 +expect -119.9922412 -60.00081456 + +tolerance 2.77777777778e-07 m +accept -150.01209192 -79.99612229 +expect -150 -80 + +tolerance 2.77777777778e-07 m +accept -180 70 +expect 179.99786174 70.00666951 + +tolerance 2.77777777778e-07 m +accept -135.00454845 49.99357566 +expect -135 50 + +tolerance 2.77777777778e-07 m +accept -90 25 +expect -89.99487454 25.00457271 + +tolerance 2.77777777778e-07 m +accept 7.032e-05 -0.00411349 +expect 0 0 + +tolerance 2.77777777778e-07 m +accept 143.9279419 -37.6532236 +expect 143.92330599 -37.65282034 + +tolerance 2.77777777778e-07 m +accept 135.00641074 -49.99958243 +expect 135 -50 + +tolerance 2.77777777778e-07 m +accept 180 -70 +expect 179.99847886 -70.00362084 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4326 +inv + +step +init=epsg:4289 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept 150 80 +expect 150.01814371 79.99494639 + +tolerance 2.77777777778e-07 m +accept 119.99001559 60.00441792 +expect 120 60 + +tolerance 2.77777777778e-07 m +accept 60 30 +expect 60.00535007 29.99746103 + +tolerance 2.77777777778e-07 m +accept -7.025e-05 0.0041133 +expect 0 0 + +tolerance 2.77777777778e-07 m +accept -60 -30 +expect -60.00473241 -30.0042486 + +tolerance 2.77777777778e-07 m +accept -119.9922412 -60.00081456 +expect -120 -60 + +tolerance 2.77777777778e-07 m +accept -150 -80 +expect -150.01209192 -79.99612229 + +tolerance 2.77777777778e-07 m +accept 179.99786174 70.00666951 +expect -180 70 + +tolerance 2.77777777778e-07 m +accept -135 50 +expect -135.00454845 49.99357566 + +tolerance 2.77777777778e-07 m +accept -89.99487454 25.00457271 +expect -90 25 + +tolerance 2.77777777778e-07 m +accept 0 0 +expect 7.032e-05 -0.00411349 + +tolerance 2.77777777778e-07 m +accept 143.92330599 -37.65282034 +expect 143.9279419 -37.6532236 + +tolerance 2.77777777778e-07 m +accept 135 -50 +expect 135.00641074 -49.99958243 + +tolerance 2.77777777778e-07 m +accept 179.99847886 -70.00362084 +expect 180 -70 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4289 +inv + +step +init=epsg:4326 +-------------------------------------------------------------------------------- +tolerance 5.55555555556e-08 m +accept 150.01814371 79.99494639 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 120 60 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 60.00535007 29.99746103 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 0 0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -60.00473241 -30.0042486 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -120 -60 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -150.01209192 -79.99612229 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -180 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -135.00454845 49.99357566 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -90 25 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 7.032e-05 -0.00411349 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 143.9279419 -37.6532236 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 135.00641074 -49.99958243 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 180 -70 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5206.gie.failing b/conformance/src/test/resources/gigs/5206.gie.failing new file mode 100644 index 0000000..5f3d6eb --- /dev/null +++ b/conformance/src/test/resources/gigs/5206.gie.failing @@ -0,0 +1,540 @@ +-------------------------------------------------------------------------------- + +Test 5206, NADCON transformation, v2.0_2011-06-28. Out of transform grid area error tests have been removed. + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4267 +inv + +step +init=epsg:4269 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept -89.5177272 29.9997978 +expect -89.5177778 30.0 + +tolerance 2.77777777778e-07 m +accept -90.5177778 29.2833333 +expect -90.5178639 29.2835592 + +tolerance 2.77777777778e-07 m +accept -91.5176758 28.2830864 +expect -91.5177778 28.2833333 + +tolerance 2.77777777778e-07 m +accept -92.5177778 27.2833333 +expect -92.5178811 27.2836106 + +tolerance 2.77777777778e-07 m +accept -93.5176731 26.2830225 +expect -93.5177778 26.2833333 + +tolerance 2.77777777778e-07 m +accept -94.5177778 25 +expect -94.5178744 25.0003486 + +tolerance 2.77777777778e-07 m +accept -142.9972522 70.0001631 +expect -143 70 + +tolerance 2.77777777778e-07 m +accept -142 70.0 +expect -142.0026922 69.9998422 + +tolerance 2.77777777778e-07 m +accept -141.9973078 70.0001578 +expect -142 70 + +tolerance 2.77777777778e-07 m +accept -140.9971981 70.0001481 +expect -141 70 + +tolerance 2.77777777778e-07 m +accept -140 70 +expect -140.0027922 69.9998617 + +tolerance 2.77777777778e-07 m +accept -138.9973075 70.0001297 +expect -139 70 + +tolerance 2.77777777778e-07 m +accept -138 70 +expect -138.0026767 69.9998867 + +tolerance 2.77777777778e-07 m +accept -134.9973733 70.000055 +expect -135 70 + +tolerance 2.77777777778e-07 m +accept -130 70 +expect -130.0025347 70.0000511 + +tolerance 2.77777777778e-07 m +accept -128.0009742 69.9999053 +expect -128.0034722 70 + +tolerance 2.77777777778e-07 m +accept -179 70 +expect -179.0035064 69.9990142 + +tolerance 2.77777777778e-07 m +accept -179.9964664 70.0010089 +expect 180 70 + +tolerance 2.77777777778e-07 m +accept 180 70 +expect 179.9964664 69.9989911 + +tolerance 2.77777777778e-07 m +accept 179 70 +expect 178.9964394 69.9989678 + +tolerance 2.77777777778e-07 m +accept -111.9991714 49.9999556 +expect -112 49.9999997 + +tolerance 2.77777777778e-07 m +accept -112 49.9999997 +expect -112.0008286 50.0000439 + +tolerance 2.77777777778e-07 m +accept -111.9991214 49.0000033 +expect -112 49 + +tolerance 2.77777777778e-07 m +accept -112 48 +expect -112.0008492 47.9999606 + +tolerance 2.77777777778e-07 m +accept -111.9991678 47.0000569 +expect -112 47 + +tolerance 2.77777777778e-07 m +accept -112 47 +expect -112.0008325 46.9999431 + +tolerance 2.77777777778e-07 m +accept -111.9991756 46.0000733 +expect -112 46 + +tolerance 2.77777777778e-07 m +accept -112 45 +expect -112.0008022 44.9999197 + +tolerance 2.77777777778e-07 m +accept -130.5177467 51 +expect -130.5193953 50.9997114 + +tolerance 2.77777777778e-07 m +accept -130.5160981 51.0002886 +expect -130.5177467 51 + +tolerance 2.77777777778e-07 m +accept -130.5161206 50.0002897 +expect -130.5177467 49.9999997 + +tolerance 2.77777777778e-07 m +accept -130.5177467 49.9999997 +expect -130.5193731 49.9997097 + +tolerance 2.77777777778e-07 m +accept -130.5161458 49.0002717 +expect -130.5177467 49 + +tolerance 2.77777777778e-07 m +accept -130.5177467 48.1166667 +expect -130.5193258 48.1164106 + +tolerance 2.77777777778e-07 m +accept -130.5161942 47.0002378 +expect -130.5177467 47 + +tolerance 2.77777777778e-07 m +accept -130.5177467 47 +expect -130.5192992 46.9997622 + +tolerance 2.77777777778e-07 m +accept -130.5162172 46.0002222 +expect -130.5177467 46 + +tolerance 2.77777777778e-07 m +accept -130.5177467 45 +expect -130.5192539 44.9997925 + +tolerance 2.77777777778e-07 m +accept -132.9984775 48.1169867 +expect -133 48.1166667 + +tolerance 2.77777777778e-07 m +accept -131.4555556 48.1166667 +expect -131.4571578 48.1163964 + +tolerance 2.77777777778e-07 m +accept -130.5161675 48.1169228 +expect -130.5177467 48.1166667 + +tolerance 2.77777777778e-07 m +accept -128.4555556 48.1166667 +expect -128.4570433 48.1164319 + +tolerance 2.77777777778e-07 m +accept -128.5444444 48.1166667 +expect -128.5459361 48.1164311 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4269 +inv + +step +init=epsg:4267 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept -89.5177778 30.0 +expect -89.5177272 29.9997978 + +tolerance 2.77777777778e-07 m +accept -90.5178639 29.2835592 +expect -90.5177778 29.2833333 + +tolerance 2.77777777778e-07 m +accept -91.5177778 28.2833333 +expect -91.5176758 28.2830864 + +tolerance 2.77777777778e-07 m +accept -92.5178811 27.2836106 +expect -92.5177778 27.2833333 + +tolerance 2.77777777778e-07 m +accept -93.5177778 26.2833333 +expect -93.5176731 26.2830225 + +tolerance 2.77777777778e-07 m +accept -94.5178744 25.0003486 +expect -94.5177778 25 + +tolerance 2.77777777778e-07 m +accept -143 70 +expect -142.9972522 70.0001631 + +tolerance 2.77777777778e-07 m +accept -142.0026922 69.9998422 +expect -142 70.0 + +tolerance 2.77777777778e-07 m +accept -142 70 +expect -141.9973078 70.0001578 + +tolerance 2.77777777778e-07 m +accept -141 70 +expect -140.9971981 70.0001481 + +tolerance 2.77777777778e-07 m +accept -140.0027922 69.9998617 +expect -140 70 + +tolerance 2.77777777778e-07 m +accept -139 70 +expect -138.9973075 70.0001297 + +tolerance 2.77777777778e-07 m +accept -138.0026767 69.9998867 +expect -138 70 + +tolerance 2.77777777778e-07 m +accept -135 70 +expect -134.9973733 70.000055 + +tolerance 2.77777777778e-07 m +accept -130.0025347 70.0000511 +expect -130 70 + +tolerance 2.77777777778e-07 m +accept -128.0034722 70 +expect -128.0009742 69.9999053 + +tolerance 2.77777777778e-07 m +accept -179.0035064 69.9990142 +expect -179 70 + +tolerance 2.77777777778e-07 m +accept 180 70 +expect -179.9964664 70.0010089 + +tolerance 2.77777777778e-07 m +accept 179.9964664 69.9989911 +expect 180 70 + +tolerance 2.77777777778e-07 m +accept 178.9964394 69.9989678 +expect 179 70 + +tolerance 2.77777777778e-07 m +accept -112 49.9999997 +expect -111.9991714 49.9999556 + +tolerance 2.77777777778e-07 m +accept -112.0008286 50.0000439 +expect -112 49.9999997 + +tolerance 2.77777777778e-07 m +accept -112 49 +expect -111.9991214 49.0000033 + +tolerance 2.77777777778e-07 m +accept -112.0008492 47.9999606 +expect -112 48 + +tolerance 2.77777777778e-07 m +accept -112 47 +expect -111.9991678 47.0000569 + +tolerance 2.77777777778e-07 m +accept -112.0008325 46.9999431 +expect -112 47 + +tolerance 2.77777777778e-07 m +accept -112 46 +expect -111.9991756 46.0000733 + +tolerance 2.77777777778e-07 m +accept -112.0008022 44.9999197 +expect -112 45 + +tolerance 2.77777777778e-07 m +accept -130.5193953 50.9997114 +expect -130.5177467 51 + +tolerance 2.77777777778e-07 m +accept -130.5177467 51 +expect -130.5160981 51.0002886 + +tolerance 2.77777777778e-07 m +accept -130.5177467 49.9999997 +expect -130.5161206 50.0002897 + +tolerance 2.77777777778e-07 m +accept -130.5193731 49.9997097 +expect -130.5177467 49.9999997 + +tolerance 2.77777777778e-07 m +accept -130.5177467 49 +expect -130.5161458 49.0002717 + +tolerance 2.77777777778e-07 m +accept -130.5193258 48.1164106 +expect -130.5177467 48.1166667 + +tolerance 2.77777777778e-07 m +accept -130.5177467 47 +expect -130.5161942 47.0002378 + +tolerance 2.77777777778e-07 m +accept -130.5192992 46.9997622 +expect -130.5177467 47 + +tolerance 2.77777777778e-07 m +accept -130.5177467 46 +expect -130.5162172 46.0002222 + +tolerance 2.77777777778e-07 m +accept -130.5192539 44.9997925 +expect -130.5177467 45 + +tolerance 2.77777777778e-07 m +accept -133 48.1166667 +expect -132.9984775 48.1169867 + +tolerance 2.77777777778e-07 m +accept -131.4571578 48.1163964 +expect -131.4555556 48.1166667 + +tolerance 2.77777777778e-07 m +accept -130.5177467 48.1166667 +expect -130.5161675 48.1169228 + +tolerance 2.77777777778e-07 m +accept -128.4570433 48.1164319 +expect -128.4555556 48.1166667 + +tolerance 2.77777777778e-07 m +accept -128.5459361 48.1164311 +expect -128.5444444 48.1166667 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4267 +inv + +step +init=epsg:4269 +-------------------------------------------------------------------------------- +tolerance 5.55555555556e-08 m +accept -89.5177272 29.9997978 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -90.5177778 29.2833333 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -91.5176758 28.2830864 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -92.5177778 27.2833333 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -93.5176731 26.2830225 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -94.5177778 25 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -142.9972522 70.0001631 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -142 70.0 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -141.9973078 70.0001578 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -140.9971981 70.0001481 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -140 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.9973075 70.0001297 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -134.9973733 70.000055 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128.0009742 69.9999053 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -179 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -179.9964664 70.0010089 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 180 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept 179 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.9991714 49.9999556 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 49.9999997 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.9991214 49.0000033 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 48 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.9991678 47.0000569 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 47 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.9991756 46.0000733 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 45 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5177467 51 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5160981 51.0002886 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5161206 50.0002897 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5177467 49.9999997 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5161458 49.0002717 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5177467 48.1166667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5161942 47.0002378 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5177467 47 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5162172 46.0002222 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5177467 45 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -132.9984775 48.1169867 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -131.4555556 48.1166667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.5161675 48.1169228 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128.4555556 48.1166667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128.5444444 48.1166667 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5207.1.gie.failing b/conformance/src/test/resources/gigs/5207.1.gie.failing new file mode 100644 index 0000000..8384bf0 --- /dev/null +++ b/conformance/src/test/resources/gigs/5207.1.gie.failing @@ -0,0 +1,252 @@ +-------------------------------------------------------------------------------- + +Test 5207, NTv2 transformation, v2.0_2011-06-28. Out of transform grid area error tests have been removed. + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4202 +inv + +step +init=epsg:4283 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept -115 -10.05 +expect -115.001251111 -10.0486372222 + +tolerance 2.77777777778e-07 m +accept -114.998744167 -11.0013594444 +expect -115 -11 + +tolerance 2.77777777778e-07 m +accept -115 -12 +expect -115.001261389 -11.9986441667 + +tolerance 2.77777777778e-07 m +accept -138.04 -9 +expect -138.041132778 -8.99854333333 + +tolerance 2.77777777778e-07 m +accept -138.043867222 -9.00145666667 +expect -138.045 -9 + +tolerance 2.77777777778e-07 m +accept -138.05 -9 +expect -138.051132778 -8.99854333333 + +tolerance 2.77777777778e-07 m +accept -138.048867222 -9.00145666667 +expect -138.05 -9 + +tolerance 2.77777777778e-07 m +accept -138.053867222 -9.00145666667 +expect -138.055 -9 + +tolerance 2.77777777778e-07 m +accept -138.06 -9 +expect -138.061132778 -8.99854333333 + +tolerance 2.77777777778e-07 m +accept -138.038730833 -27.1264763889 +expect -138.04 -27.125 + +tolerance 2.77777777778e-07 m +accept -138.045 -27.125 +expect -138.046268889 -27.1235236111 + +tolerance 2.77777777778e-07 m +accept -138.05 -27.125 +expect -138.051268889 -27.1235236111 + +tolerance 2.77777777778e-07 m +accept -138.048731111 -27.1264763889 +expect -138.05 -27.125 + +tolerance 2.77777777778e-07 m +accept -138.055 -27.125 +expect -138.056268889 -27.1235233333 + +tolerance 2.77777777778e-07 m +accept -138.058731111 -27.1264766667 +expect -138.06 -27.125 + +tolerance 2.77777777778e-07 m +accept -136.847222222 -28.05 +expect -136.848525278 -28.0485269444 + +tolerance 2.77777777778e-07 m +accept -137.847222222 -28.05 +expect -137.848505556 -28.0485311111 + +tolerance 2.77777777778e-07 m +accept -138.847222222 -28.05 +expect -138.8484925 -28.0485188889 + +tolerance 2.77777777778e-07 m +accept -139.847222222 -28.05 +expect -139.848475278 -28.0485072222 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4283 +inv + +step +init=epsg:4202 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept -115.001251111 -10.0486372222 +expect -115 -10.05 + +tolerance 2.77777777778e-07 m +accept -115 -11 +expect -114.998744167 -11.0013594444 + +tolerance 2.77777777778e-07 m +accept -115.001261389 -11.9986441667 +expect -115 -12 + +tolerance 2.77777777778e-07 m +accept -138.041132778 -8.99854333333 +expect -138.04 -9 + +tolerance 2.77777777778e-07 m +accept -138.045 -9 +expect -138.043867222 -9.00145666667 + +tolerance 2.77777777778e-07 m +accept -138.051132778 -8.99854333333 +expect -138.05 -9 + +tolerance 2.77777777778e-07 m +accept -138.05 -9 +expect -138.048867222 -9.00145666667 + +tolerance 2.77777777778e-07 m +accept -138.055 -9 +expect -138.053867222 -9.00145666667 + +tolerance 2.77777777778e-07 m +accept -138.061132778 -8.99854333333 +expect -138.06 -9 + +tolerance 2.77777777778e-07 m +accept -138.04 -27.125 +expect -138.038730833 -27.1264763889 + +tolerance 2.77777777778e-07 m +accept -138.046268889 -27.1235236111 +expect -138.045 -27.125 + +tolerance 2.77777777778e-07 m +accept -138.051268889 -27.1235236111 +expect -138.05 -27.125 + +tolerance 2.77777777778e-07 m +accept -138.05 -27.125 +expect -138.048731111 -27.1264763889 + +tolerance 2.77777777778e-07 m +accept -138.056268889 -27.1235233333 +expect -138.055 -27.125 + +tolerance 2.77777777778e-07 m +accept -138.06 -27.125 +expect -138.058731111 -27.1264766667 + +tolerance 2.77777777778e-07 m +accept -136.848525278 -28.0485269444 +expect -136.847222222 -28.05 + +tolerance 2.77777777778e-07 m +accept -137.848505556 -28.0485311111 +expect -137.847222222 -28.05 + +tolerance 2.77777777778e-07 m +accept -138.8484925 -28.0485188889 +expect -138.847222222 -28.05 + +tolerance 2.77777777778e-07 m +accept -139.848475278 -28.0485072222 +expect -139.847222222 -28.05 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4202 +inv + +step +init=epsg:4283 +-------------------------------------------------------------------------------- +tolerance 5.55555555556e-08 m +accept -115 -10.05 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -114.998744167 -11.0013594444 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -115 -12 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.04 -9 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.043867222 -9.00145666667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.05 -9 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.048867222 -9.00145666667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.053867222 -9.00145666667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.06 -9 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.038730833 -27.1264763889 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.045 -27.125 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.05 -27.125 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.048731111 -27.1264763889 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.055 -27.125 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.058731111 -27.1264766667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -136.847222222 -28.05 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -137.847222222 -28.05 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.847222222 -28.05 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -139.847222222 -28.05 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5207.2.gie.failing b/conformance/src/test/resources/gigs/5207.2.gie.failing new file mode 100644 index 0000000..bc76504 --- /dev/null +++ b/conformance/src/test/resources/gigs/5207.2.gie.failing @@ -0,0 +1,456 @@ +-------------------------------------------------------------------------------- + +Test 5206, NADCON transformation, v2.0_2011-06-28. Out of transform grid area error tests have been removed. + +-------------------------------------------------------------------------------- + + + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4267 +inv + +step +init=epsg:4269 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept -142 70 +expect -142.002804722 69.9998069444 + +tolerance 2.77777777778e-07 m +accept -141.997195278 70.0001930556 +expect -142 70 + +tolerance 2.77777777778e-07 m +accept -140.997219722 70.0001791667 +expect -141 70 + +tolerance 2.77777777778e-07 m +accept -140 70 +expect -140.002795278 69.9998280556 + +tolerance 2.77777777778e-07 m +accept -138.997199444 70.0001608333 +expect -139 70 + +tolerance 2.77777777778e-07 m +accept -138 70 +expect -138.002957222 69.9998755556 + +tolerance 2.77777777778e-07 m +accept -134.997081944 70.0000463889 +expect -135 70 + +tolerance 2.77777777778e-07 m +accept -130 70 +expect -130.002737222 70.0000533333 + +tolerance 2.77777777778e-07 m +accept -128.000734722 69.9998663889 +expect -128.003472222 70 + +tolerance 2.77777777778e-07 m +accept -128 70 +expect -128.002737778 70.0001336111 + +tolerance 2.77777777778e-07 m +accept -125.997388333 69.9997780556 +expect -126 70 + +tolerance 2.77777777778e-07 m +accept -88.005575 70 +expect -88.0056825 70.0006094444 + +tolerance 2.77777777778e-07 m +accept -88 70 +expect -88.0001072222 70.0006091667 + +tolerance 2.77777777778e-07 m +accept -87.9998933333 69.9993908333 +expect -88 70 + +tolerance 2.77777777778e-07 m +accept -87.6610917 70 +expect -87.6611716667 70.0006033333 + +tolerance 2.77777777778e-07 m +accept -112.165693333 51.0169555556 +expect -112.166607778 51.0170094444 + +tolerance 2.77777777778e-07 m +accept -111.999093889 50.9999491667 +expect -112 51 + +tolerance 2.77777777778e-07 m +accept -111.999095278 49.9999597222 +expect -112 49.9999997222 + +tolerance 2.77777777778e-07 m +accept -112 49.9999997222 +expect -112.000904639 50.0000396667 + +tolerance 2.77777777778e-07 m +accept -111.9991175 49.0000063889 +expect -112 49 + +tolerance 2.77777777778e-07 m +accept -112 48 +expect -112.0008525 47.9999888889 + +tolerance 2.77777777778e-07 m +accept -111.999174722 47.0000097222 +expect -112 47 + +tolerance 2.77777777778e-07 m +accept -112 47 +expect -112.000825278 46.9999902778 + +tolerance 2.77777777778e-07 m +accept -130.517746667 51 +expect -130.519401944 50.9997713889 + +tolerance 2.77777777778e-07 m +accept -130.516091667 51.0002286111 +expect -130.517746667 51 + +tolerance 2.77777777778e-07 m +accept -130.516041667 50.0002461111 +expect -130.517746667 49.9999997222 + +tolerance 2.77777777778e-07 m +accept -130.517746667 49.9999997222 +expect -130.519451667 49.9997533333 + +tolerance 2.77777777778e-07 m +accept -130.516067222 49.0002825 +expect -130.517746667 49 + +tolerance 2.77777777778e-07 m +accept -130.517746667 48 +expect -130.519391111 47.9996794444 + +tolerance 2.77777777778e-07 m +accept -130.516146944 47.0003611111 +expect -130.517746667 47 + +tolerance 2.77777777778e-07 m +accept -130.517746667 47 +expect -130.519346389 46.9996386111 + +tolerance 2.77777777778e-07 m +accept -132.998205278 48.1170263889 +expect -133 48.1166666667 + +tolerance 2.77777777778e-07 m +accept -131.455555556 48.1166666667 +expect -131.457260278 48.1163330556 + +tolerance 2.77777777778e-07 m +accept -130.516098056 48.1169827778 +expect -130.517746667 48.1166666667 + +tolerance 2.77777777778e-07 m +accept -128.455555556 48.1166666667 +expect -128.457086944 48.1163927778 + +tolerance 2.77777777778e-07 m +accept -128.5444 48.1167066 +expect -128.545936111 48.1164311111 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4269 +inv + +step +init=epsg:4267 +-------------------------------------------------------------------------------- +tolerance 2.77777777778e-07 m +accept -142.002804722 69.9998069444 +expect -142 70 + +tolerance 2.77777777778e-07 m +accept -142 70 +expect -141.997195278 70.0001930556 + +tolerance 2.77777777778e-07 m +accept -141 70 +expect -140.997219722 70.0001791667 + +tolerance 2.77777777778e-07 m +accept -140.002795278 69.9998280556 +expect -140 70 + +tolerance 2.77777777778e-07 m +accept -139 70 +expect -138.997199444 70.0001608333 + +tolerance 2.77777777778e-07 m +accept -138.002957222 69.9998755556 +expect -138 70 + +tolerance 2.77777777778e-07 m +accept -135 70 +expect -134.997081944 70.0000463889 + +tolerance 2.77777777778e-07 m +accept -130.002737222 70.0000533333 +expect -130 70 + +tolerance 2.77777777778e-07 m +accept -128.003472222 70 +expect -128.000734722 69.9998663889 + +tolerance 2.77777777778e-07 m +accept -128.002737778 70.0001336111 +expect -128 70 + +tolerance 2.77777777778e-07 m +accept -126 70 +expect -125.997388333 69.9997780556 + +tolerance 2.77777777778e-07 m +accept -88.0056825 70.0006094444 +expect -88.005575 70 + +tolerance 2.77777777778e-07 m +accept -88.0001072222 70.0006091667 +expect -88 70 + +tolerance 2.77777777778e-07 m +accept -88 70 +expect -87.9998933333 69.9993908333 + +tolerance 2.77777777778e-07 m +accept -87.6611716667 70.0006033333 +expect -87.6610917 70 + +tolerance 2.77777777778e-07 m +accept -112.166607778 51.0170094444 +expect -112.165693333 51.0169555556 + +tolerance 2.77777777778e-07 m +accept -112 51 +expect -111.999093889 50.9999491667 + +tolerance 2.77777777778e-07 m +accept -112 49.9999997222 +expect -111.999095278 49.9999597222 + +tolerance 2.77777777778e-07 m +accept -112.000904639 50.0000396667 +expect -112 49.9999997222 + +tolerance 2.77777777778e-07 m +accept -112 49 +expect -111.9991175 49.0000063889 + +tolerance 2.77777777778e-07 m +accept -112.0008525 47.9999888889 +expect -112 48 + +tolerance 2.77777777778e-07 m +accept -112 47 +expect -111.999174722 47.0000097222 + +tolerance 2.77777777778e-07 m +accept -112.000825278 46.9999902778 +expect -112 47 + +tolerance 2.77777777778e-07 m +accept -130.519401944 50.9997713889 +expect -130.517746667 51 + +tolerance 2.77777777778e-07 m +accept -130.517746667 51 +expect -130.516091667 51.0002286111 + +tolerance 2.77777777778e-07 m +accept -130.517746667 49.9999997222 +expect -130.516041667 50.0002461111 + +tolerance 2.77777777778e-07 m +accept -130.519451667 49.9997533333 +expect -130.517746667 49.9999997222 + +tolerance 2.77777777778e-07 m +accept -130.517746667 49 +expect -130.516067222 49.0002825 + +tolerance 2.77777777778e-07 m +accept -130.519391111 47.9996794444 +expect -130.517746667 48 + +tolerance 2.77777777778e-07 m +accept -130.517746667 47 +expect -130.516146944 47.0003611111 + +tolerance 2.77777777778e-07 m +accept -130.519346389 46.9996386111 +expect -130.517746667 47 + +tolerance 2.77777777778e-07 m +accept -133 48.1166666667 +expect -132.998205278 48.1170263889 + +tolerance 2.77777777778e-07 m +accept -131.457260278 48.1163330556 +expect -131.455555556 48.1166666667 + +tolerance 2.77777777778e-07 m +accept -130.517746667 48.1166666667 +expect -130.516098056 48.1169827778 + +tolerance 2.77777777778e-07 m +accept -128.457086944 48.1163927778 +expect -128.455555556 48.1166666667 + +tolerance 2.77777777778e-07 m +accept -128.545936111 48.1164311111 +expect -128.5444 48.1167066 + +-------------------------------------------------------------------------------- +operation +proj=pipeline + +step +init=epsg:4267 +inv + +step +init=epsg:4269 +-------------------------------------------------------------------------------- +tolerance 5.55555555556e-08 m +accept -142 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -141.997195278 70.0001930556 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -140.997219722 70.0001791667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -140 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138.997199444 70.0001608333 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -138 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -134.997081944 70.0000463889 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128.000734722 69.9998663889 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -125.997388333 69.9997780556 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -88.005575 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -88 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -87.9998933333 69.9993908333 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -87.6610917 70 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112.165693333 51.0169555556 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.999093889 50.9999491667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.999095278 49.9999597222 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 49.9999997222 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.9991175 49.0000063889 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 48 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -111.999174722 47.0000097222 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -112 47 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.517746667 51 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.516091667 51.0002286111 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.516041667 50.0002461111 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.517746667 49.9999997222 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.516067222 49.0002825 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.517746667 48 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.516146944 47.0003611111 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.517746667 47 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -132.998205278 48.1170263889 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -131.455555556 48.1166666667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -130.516098056 48.1169827778 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128.455555556 48.1166666667 +roundtrip 1000 + +tolerance 5.55555555556e-08 m +accept -128.5444 48.1167066 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/gigs/5208.gie b/conformance/src/test/resources/gigs/5208.gie new file mode 100644 index 0000000..5ff492c --- /dev/null +++ b/conformance/src/test/resources/gigs/5208.gie @@ -0,0 +1,210 @@ +-------------------------------------------------------------------------------- + +Test 5208, Longitude Rotation, v2.0_2011-06-28. + +The test tolerance is 0.01". Since gie can only use linear tolerances we +convert that to an approximate liniar distance instead, by multiplying with +111km: + + 0.01" * 111 km = 2.777777778-7 * 111000 m = 0.03 m + +To be on the safe side we, use 0.01 m as the tolerance. + +-------------------------------------------------------------------------------- + +# NTF +<4275> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 <> + +# NTF (Paris) +<4807> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris <> + + + + + +use_proj4_init_rules true + +-------------------------------------------------------------------------------- +operation +proj=pipeline\ + +step +init=epsg:4275 +inv\ + +step +init=epsg:4807 +-------------------------------------------------------------------------------- +tolerance 0.01 m +accept 5 58 +expect 2.66277083 58 + +tolerance 0.01 m +accept 5 56 +expect 2.66277083 56 + +tolerance 0.01 m +accept 5 55 +expect 2.66277083 55 + +tolerance 0.01 m +accept 5 53 +expect 2.66277083 53 + +tolerance 0.01 m +accept 4 51 +expect 1.66277083 51 + +tolerance 0.01 m +accept 4 49 +expect 1.66277083 49 + +tolerance 0.01 m +accept 2.33722917 46.8 +expect 0 46.8 + +tolerance 0.01 m +accept 3 53 +expect 0.66277083 53 + +tolerance 0.01 m +accept 4 53 +expect 1.66277083 53 + +tolerance 0.01 m +accept 6 53 +expect 3.66277083 53 + +tolerance 0.01 m +accept 7 53 +expect 4.66277083 53 + +tolerance 0.01 m +accept 9 53 +expect 6.66277083 53 + +tolerance 0.01 m +accept 10 53 +expect 7.66277083 53 + +tolerance 0.01 m +accept 11 53 +expect 8.66277083 53 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4807 +inv \ + +step +init=epsg:4275 +-------------------------------------------------------------------------------- +tolerance 0.01 m +accept 2.66277083 58 +expect 5 58 + +tolerance 0.01 m +accept 2.66277083 56 +expect 5 56 + +tolerance 0.01 m +accept 2.66277083 55 +expect 5 55 + +tolerance 0.01 m +accept 2.66277083 53 +expect 5 53 + +tolerance 0.01 m +accept 1.66277083 51 +expect 4 51 + +tolerance 0.01 m +accept 1.66277083 49 +expect 4 49 + +tolerance 0.01 m +accept 0 46.8 +expect 2.33722917 46.8 + +tolerance 0.01 m +accept 0.66277083 53 +expect 3 53 + +tolerance 0.01 m +accept 1.66277083 53 +expect 4 53 + +tolerance 0.01 m +accept 3.66277083 53 +expect 6 53 + +tolerance 0.01 m +accept 4.66277083 53 +expect 7 53 + +tolerance 0.01 m +accept 6.66277083 53 +expect 9 53 + +tolerance 0.01 m +accept 7.66277083 53 +expect 10 53 + +tolerance 0.01 m +accept 8.66277083 53 +expect 11 53 + +-------------------------------------------------------------------------------- +operation +proj=pipeline \ + +step +init=epsg:4275 +inv \ + +step +init=epsg:4807 +-------------------------------------------------------------------------------- +tolerance 0.01 m +accept 5 58 +roundtrip 1000 + +tolerance 0.01 m +accept 5 56 +roundtrip 1000 + +tolerance 0.01 m +accept 5 55 +roundtrip 1000 + +tolerance 0.01 m +accept 5 53 +roundtrip 1000 + +tolerance 0.01 m +accept 4 51 +roundtrip 1000 + +tolerance 0.01 m +accept 4 49 +roundtrip 1000 + +tolerance 0.01 m +accept 2.33722917 46.8 +roundtrip 1000 + +tolerance 0.01 m +accept 3 53 +roundtrip 1000 + +tolerance 0.01 m +accept 4 53 +roundtrip 1000 + +tolerance 0.01 m +accept 6 53 +roundtrip 1000 + +tolerance 0.01 m +accept 7 53 +roundtrip 1000 + +tolerance 0.01 m +accept 9 53 +roundtrip 1000 + +tolerance 0.01 m +accept 10 53 +roundtrip 1000 + +tolerance 0.01 m +accept 11 53 +roundtrip 1000 + + diff --git a/conformance/src/test/resources/manifest-fixtures/README.md b/conformance/src/test/resources/manifest-fixtures/README.md new file mode 100644 index 0000000..fcd7be1 --- /dev/null +++ b/conformance/src/test/resources/manifest-fixtures/README.md @@ -0,0 +1,66 @@ +# Manifest fixtures + +These files are **test fixtures**, not the live baseline. Nothing here is read by the conformance +gate; everything here is read by the unit tests in +`org.locationtech.proj4j.conformance.manifest` and `…conformance.report`. + +| file | what it is | +|---|---| +| `expected-failures.seed.tsv` | an illustrative manifest, pinning the format and carrying the triage text for the ten quarantined GIGS `.gie.failing` files | +| `corpus-index.seed.tsv` | the matching corpus index (all keys that existed when the manifest was written, including passing ones) | +| `malformed-missing-column.tsv` | two columns instead of three — must be rejected, naming the line | +| `malformed-pass-row.tsv` | records a `PASS` — must be rejected | +| `malformed-bad-key.tsv` | truncated content hash — must be rejected | + +## The real manifest is generated + +The live manifest is **not** hand-written and is **not** in this directory. It is produced from an +actual run: + +``` +mvn -Pconformance verify # gate: fails on REGRESSED / UNEXPECTED_PASS / DISAPPEARED +mvn -Pconformance verify -Dgie.regenerate=true # accept the current state as the new baseline +``` + +Regeneration writes the manifest and its corpus index together. Both must be committed together, or +the next diff reports phantom `NEW`/`DISAPPEARED` entries. + +The content hashes in `expected-failures.seed.tsv` are **fabricated**. Real hashes are the first 8 +hex digits of a SHA-1 over the normalised assertion text plus the normalised operation definition, +and can only be computed by lexing the corpus. Do not copy a line from the seed into a real +manifest: the key will match nothing, and the gate will (correctly) report it as `DISAPPEARED`. + +## Format + +Tab-separated, three columns, `#` comments, an optional `key expected reason` header, sorted +in the canonical key order (path, operation block, assertion index, hash). + +``` +gigs/5110.gie.failing#2:0@b4c5d6e7 FAIL laea ellipsoidal inverse: roundtrip 1000 drift … +└──────── file ────────┘ │ │ └─ hash ─┘ └ outcome ┘ └─ free-text reason ─┘ + │ └─ assertion index within the block + └──── operation-block index within the file +``` + +Rules that the parser enforces and that matter when hand-editing: + +- **Only non-`PASS` rows.** An absent key means "expected to pass". The file is meant to shrink. +- **`FAIL` or `SKIP`, upper case.** A `SKIP` is never a pass; `require_grid` and `ignore` produce it. +- **No duplicate keys**, and no tabs or newlines inside a reason. +- **Never hand-sort.** Regeneration emits the canonical order; a hand-sorted file just makes a noisy + diff on the next regeneration. + +## Reasons survive regeneration + +`ManifestRegenerator` copies the previous `reason` forward for every key whose expected outcome is +unchanged. Write the reason properly — it is the artefact that makes the next triage cheap. The +useful shape is *root cause, evidence, and whether it is ours*: + +> `syntax artefact, not maths: no trailing " \" continuation, so +step lines are swallowed as +> comments and the operation degenerates to a bare +proj=pipeline` + +Nine of the ten quarantined GIGS files fail for exactly that reason and should not be chased as +numerical work. `5110` is the genuine one — a `laea` ellipsoidal inverse whose point checks pass at +`tolerance 0.05 m` and whose `roundtrip 1000` blocks fail at `0.006 m`, drifting from 105 mm at +lat 70 to 1,312 mm at lat 30. `5101.4-jhs-etmerc.gie` (not `.failing`) is in the passing set and must +stay a positive test. diff --git a/conformance/src/test/resources/manifest-fixtures/corpus-index.seed.tsv b/conformance/src/test/resources/manifest-fixtures/corpus-index.seed.tsv new file mode 100644 index 0000000..4256b6f --- /dev/null +++ b/conformance/src/test/resources/manifest-fixtures/corpus-index.seed.tsv @@ -0,0 +1,40 @@ +# proj4j gie/GIGS conformance - corpus index (SEED / ILLUSTRATIVE). +# +# Every assertion key present when the sibling manifest was generated, one per line, in +# canonical order. The real index has ~8,017 lines; this one is a fixture holding the keys +# used by expected-failures.seed.tsv plus two assertions that are expected to PASS (and so +# appear here but NOT in the manifest). +# +# Regenerate together with the manifest: +# mvn -Pconformance verify -Dgie.regenerate=true +# +gie/adams_hemi.gie#0:12@1a2b3c4d +gie/builtins.gie#0:0@0011aabb +gie/builtins.gie#0:1@0022ccdd +gie/epsg_grid.gie#0:0@2b3c4d5e +gie/epsg_grid.gie#1:0@3c4d5e6f +gigs/5101.4-jhs.gie.failing#0:0@4d5e6f70 +gigs/5101.4-jhs.gie.failing#1:0@5e6f7081 +gigs/5101.4-jhs.gie.failing#2:0@6f708192 +gigs/5105.1.gie.failing#0:0@708192a3 +gigs/5105.1.gie.failing#1:0@8192a3b4 +gigs/5105.1.gie.failing#2:0@92a3b4c5 +gigs/5110.gie.failing#0:0@a3b4c5d6 +gigs/5110.gie.failing#2:0@b4c5d6e7 +gigs/5110.gie.failing#2:1@c5d6e7f8 +gigs/5111.2.gie.failing#0:0@d6e7f809 +gigs/5111.2.gie.failing#1:0@e7f8091a +gigs/5111.2.gie.failing#2:0@f8091a2b +gigs/5203.1.gie.failing#0:0@091a2b3c +gigs/5203.1.gie.failing#1:0@1a2b3c4e +gigs/5203.1.gie.failing#2:0@2b3c4e5f +gigs/5204.1.gie.failing#0:0@3c4e5f60 +gigs/5204.1.gie.failing#2:0@4e5f6071 +gigs/5205.1.gie.failing#0:0@5f607182 +gigs/5205.1.gie.failing#2:0@60718293 +gigs/5206.gie.failing#0:0@718293a4 +gigs/5206.gie.failing#2:0@8293a4b5 +gigs/5207.1.gie.failing#0:0@93a4b5c6 +gigs/5207.1.gie.failing#2:0@a4b5c6d7 +gigs/5207.2.gie.failing#0:0@b5c6d7e8 +gigs/5207.2.gie.failing#2:0@c6d7e8f9 diff --git a/conformance/src/test/resources/manifest-fixtures/expected-failures.seed.tsv b/conformance/src/test/resources/manifest-fixtures/expected-failures.seed.tsv new file mode 100644 index 0000000..968ebb6 --- /dev/null +++ b/conformance/src/test/resources/manifest-fixtures/expected-failures.seed.tsv @@ -0,0 +1,45 @@ +# proj4j gie/GIGS conformance - expected-outcome manifest (SEED / ILLUSTRATIVE). +# +# THIS FILE IS NOT THE REAL MANIFEST. The real one is generated - see README.md in this +# directory. The keys below are hand-written examples with FABRICATED content hashes; they +# will not match any assertion produced by an actual run. Its purpose is to (a) pin the file +# format in a test, and (b) carry the triage text for the ten quarantined GIGS files forward +# to whoever generates the first real manifest. +# +# One line per assertion that is NOT expected to pass. A key that is absent is expected to +# PASS; there are no PASS rows. Columns are tab-separated: +# +# #:@ +# +# Regenerate the real manifest with: +# mvn -Pconformance verify -Dgie.regenerate=true +# +key expected reason +gie/adams_hemi.gie#0:12@1a2b3c4d FAIL adams: ell_int_5 Chebyshev series not ported; upstream expectations were generated BY that series (0.42 m off a true elliptic integral) so port it verbatim, do not "improve" it +gie/epsg_grid.gie#0:0@2b3c4d5e SKIP require_grid us_nga_egm08_25.tif - network/CDN grid, tier R4, not provisioned in a hermetic run. SKIP, never counted as a pass +gie/epsg_grid.gie#1:0@3c4d5e6f SKIP require_grid us_nga_egm08_25.tif - as above; the second crs_src/crs_dst pair in the file +gigs/5101.4-jhs.gie.failing#0:0@4d5e6f70 FAIL syntax artefact, not maths: the file has no trailing " \" continuations, so its +step lines are swallowed as comments and the operation degenerates to a bare +proj=pipeline. Note 5101.4-jhs-etmerc.gie (same case forced through etmerc) is in the passing set and MUST stay a positive test +gigs/5101.4-jhs.gie.failing#1:0@5e6f7081 FAIL syntax artefact: missing " \" continuations, reverse block. See block 0 +gigs/5101.4-jhs.gie.failing#2:0@6f708192 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block. See block 0 +gigs/5105.1.gie.failing#0:0@708192a3 FAIL syntax artefact: missing " \" continuations, +step lines swallowed as comments, operation degenerates to bare +proj=pipeline +gigs/5105.1.gie.failing#1:0@8192a3b4 FAIL syntax artefact: missing " \" continuations, reverse block +gigs/5105.1.gie.failing#2:0@92a3b4c5 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block +gigs/5110.gie.failing#0:0@a3b4c5d6 FAIL 5110 is the one GENUINE failure of the ten - but this is a point check at tolerance 0.05 m, which upstream reports as passing. Expect to delete this line once laea lands; if it passes, that is an UNEXPECTED_PASS and the gate is right to stop the build +gigs/5110.gie.failing#2:0@b4c5d6e7 FAIL genuine: laea ellipsoidal inverse. Only the eleven roundtrip 1000 blocks at tolerance 0.006 m fail; drift grows monotonically away from lat_0=52 (105 mm at lat 70 to 1312 mm at lat 30), recorded in upstream commit 83c91dd2. Root cause is asin(ab) with ab = 1 - q/qp near the pole (laea.cpp:184). The Karney series does NOT fix it - the ill-conditioning is upstream of the series, in q-space +gigs/5110.gie.failing#2:1@c5d6e7f8 FAIL genuine: laea ellipsoidal inverse roundtrip drift. See block 2 assertion 0 +gigs/5111.2.gie.failing#0:0@d6e7f809 FAIL syntax artefact: missing " \" continuations, +step lines swallowed as comments +gigs/5111.2.gie.failing#1:0@e7f8091a FAIL syntax artefact: missing " \" continuations, reverse block +gigs/5111.2.gie.failing#2:0@f8091a2b FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block +gigs/5203.1.gie.failing#0:0@091a2b3c FAIL syntax artefact: missing " \" continuations. Also carries the un-tightened GIGS tolerance conversion - "tolerance 2.77777777778e-07 m" is 0.001 arc-second left in degrees-as-metres form, a bug for a distance comparator; reproduce it faithfully if this file is ever ported +gigs/5203.1.gie.failing#1:0@1a2b3c4e FAIL syntax artefact: missing " \" continuations, reverse block; un-tightened degrees-as-metres tolerance +gigs/5203.1.gie.failing#2:0@2b3c4e5f FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block; un-tightened degrees-as-metres tolerance +gigs/5204.1.gie.failing#0:0@3c4e5f60 FAIL syntax artefact: missing " \" continuations; un-tightened degrees-as-metres tolerance +gigs/5204.1.gie.failing#2:0@4e5f6071 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block; un-tightened degrees-as-metres tolerance +gigs/5205.1.gie.failing#0:0@5f607182 FAIL syntax artefact: missing " \" continuations; un-tightened degrees-as-metres tolerance +gigs/5205.1.gie.failing#2:0@60718293 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block; un-tightened degrees-as-metres tolerance +gigs/5206.gie.failing#0:0@718293a4 FAIL syntax artefact: missing " \" continuations; un-tightened degrees-as-metres tolerance +gigs/5206.gie.failing#2:0@8293a4b5 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block; un-tightened degrees-as-metres tolerance +gigs/5207.1.gie.failing#0:0@93a4b5c6 FAIL syntax artefact: missing " \" continuations; un-tightened degrees-as-metres tolerance +gigs/5207.1.gie.failing#2:0@a4b5c6d7 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block; un-tightened degrees-as-metres tolerance +gigs/5207.2.gie.failing#0:0@b5c6d7e8 FAIL syntax artefact: missing " \" continuations; un-tightened degrees-as-metres tolerance +gigs/5207.2.gie.failing#2:0@c6d7e8f9 FAIL syntax artefact: missing " \" continuations, roundtrip 1000 block; un-tightened degrees-as-metres tolerance diff --git a/conformance/src/test/resources/manifest-fixtures/malformed-bad-key.tsv b/conformance/src/test/resources/manifest-fixtures/malformed-bad-key.tsv new file mode 100644 index 0000000..8eb9c3b --- /dev/null +++ b/conformance/src/test/resources/manifest-fixtures/malformed-bad-key.tsv @@ -0,0 +1,4 @@ +# A manifest whose key has a truncated content hash. Strict parsing must reject it, naming +# line 4. A silently-skipped bad key would default that assertion to "expected to pass". +key expected reason +gie/builtins.gie#0:0@00aa FAIL hash is 4 hex digits, not 8 diff --git a/conformance/src/test/resources/manifest-fixtures/malformed-missing-column.tsv b/conformance/src/test/resources/manifest-fixtures/malformed-missing-column.tsv new file mode 100644 index 0000000..0e5a01a --- /dev/null +++ b/conformance/src/test/resources/manifest-fixtures/malformed-missing-column.tsv @@ -0,0 +1,4 @@ +# A manifest with a two-column row. Strict parsing must reject it, naming line 4. +key expected reason +gie/builtins.gie#0:0@0011aabb FAIL a well-formed row +gie/builtins.gie#0:1@0022ccdd FAIL diff --git a/conformance/src/test/resources/manifest-fixtures/malformed-pass-row.tsv b/conformance/src/test/resources/manifest-fixtures/malformed-pass-row.tsv new file mode 100644 index 0000000..9bcb105 --- /dev/null +++ b/conformance/src/test/resources/manifest-fixtures/malformed-pass-row.tsv @@ -0,0 +1,4 @@ +# A manifest that records a PASS. Strict parsing must reject it, naming line 4: the manifest +# holds only non-PASS expectations, and an absent key already means "expected to pass". +key expected reason +gie/builtins.gie#0:0@0011aabb PASS this row must not exist diff --git a/conformance/src/test/resources/parse-fixtures/missing-close.gie b/conformance/src/test/resources/parse-fixtures/missing-close.gie new file mode 100644 index 0000000..b257173 --- /dev/null +++ b/conformance/src/test/resources/parse-fixtures/missing-close.gie @@ -0,0 +1,4 @@ + +operation +proj=merc +accept 12 55 +expect 1335833.88951928 7326837.71424703 diff --git a/conformance/src/test/resources/parse-fixtures/nonstrict-terminators.gie b/conformance/src/test/resources/parse-fixtures/nonstrict-terminators.gie new file mode 100644 index 0000000..3456e1f --- /dev/null +++ b/conformance/src/test/resources/parse-fixtures/nonstrict-terminators.gie @@ -0,0 +1,15 @@ +Everything up here is outside the block and is ignored entirely, +including this line, which starts with expect but is not a command. + + + +operation +proj=aea + +ellps=GRS80 +lat_1=0 +lat_2=2 +tolerance 0.1 mm +accept 2 1 +expect 222571.608757106 110653.326743030 +===== +this text follows a decorative element and opens no command + + +Trailing prose after the block. accept 9 9 diff --git a/conformance/src/test/resources/parse-fixtures/nonstrict-unknown-keyword.gie b/conformance/src/test/resources/parse-fixtures/nonstrict-unknown-keyword.gie new file mode 100644 index 0000000..a07ba12 --- /dev/null +++ b/conformance/src/test/resources/parse-fixtures/nonstrict-unknown-keyword.gie @@ -0,0 +1,9 @@ + + +operation +proj=aea +ellps=GRS80 +lat_1=0 +lat_2=2 +accept 2 1 +expect 222571.608757106 110653.326743030 + +unknown_keyword + + diff --git a/conformance/src/test/resources/parse-fixtures/strict-bad-line.gie b/conformance/src/test/resources/parse-fixtures/strict-bad-line.gie new file mode 100644 index 0000000..8a110e0 --- /dev/null +++ b/conformance/src/test/resources/parse-fixtures/strict-bad-line.gie @@ -0,0 +1,6 @@ + +operation +proj=merc +accept 12 55 +unknown_keyword +expect 1335833.88951928 7326837.71424703 + diff --git a/conformance/src/test/resources/parse-fixtures/strict-continuation.gie b/conformance/src/test/resources/parse-fixtures/strict-continuation.gie new file mode 100644 index 0000000..e91b52c --- /dev/null +++ b/conformance/src/test/resources/parse-fixtures/strict-continuation.gie @@ -0,0 +1,14 @@ + +------------------------------------------------------------------------------- +# A strict block. The five dashes above are a decorative element; this line is +# a comment, which pj_chomp turns into a blank line before the verb test runs. +------------------------------------------------------------------------------- +use_proj4_init_rules true +operation +proj=pipeline \ + +step +init=epsg:4313 +inv \ # trailing comment after a continuation + +step +init=epsg:31370 +tolerance 0.03 m +accept 5 58 +expect 187742.7 969521.653 + direction inverse + diff --git a/conformance/src/test/resources/parse-fixtures/two-blocks.gie b/conformance/src/test/resources/parse-fixtures/two-blocks.gie new file mode 100644 index 0000000..b2ba44c --- /dev/null +++ b/conformance/src/test/resources/parse-fixtures/two-blocks.gie @@ -0,0 +1,15 @@ +# Two blocks in one file, mixed modes, with prose between them. + + +operation +proj=merc +accept 12 55 +expect 1335833.88951928 7326837.71424703 + + +Prose between the blocks. tolerance 1 km <- ignored, outside any block. + + +operation +proj=utm +zone=32 +accept 12 55 +expect 691875.632 6098907.825 + diff --git a/conformance/src/test/resources/proj-data/BETA2007.gsb b/conformance/src/test/resources/proj-data/BETA2007.gsb new file mode 100644 index 0000000..69cd334 Binary files /dev/null and b/conformance/src/test/resources/proj-data/BETA2007.gsb differ diff --git a/conformance/src/test/resources/proj-data/GL27 b/conformance/src/test/resources/proj-data/GL27 new file mode 100644 index 0000000..73fa975 --- /dev/null +++ b/conformance/src/test/resources/proj-data/GL27 @@ -0,0 +1,23 @@ +# SCCSID @(#)GL27 1.1 93/08/25 GIE REL +# Great Lakes Grids + +lastupdate=1993-08-25 + # Lake Erie, Ontario and St. Lawrence River. + proj=omerc ellps=clrk66 k_0=0.9999 + lonc=78d00'W lat_0=44d00'N alpha=55d40' + x_0=-3950000 y_0=-3430000 + no_defs <> + # Lake Huron + proj=omerc ellps=clrk66 k_0=0.9999 + lonc=82d00'W lat_0=43d00'N alpha=350d37' + x_0=1200000 y_0=-3500000 + no_defs <> + # Lake Michigan + proj=omerc ellps=clrk66 k_0=0.9999 + lonc=87d00'W lat_0=44d00'N alpha=15d00' + x_0=-1000000 y_0=-4300000 + no_defs <> + # Lake Superior, Lake of the Woods + proj=omerc ellps=clrk66 k_0=0.9999 + lonc=88d50'0.256"W lat_0=47d12'21.554"N alpha=285d41'42.593" + x_0=9000000 y_0=-1600000 + no_defs <> diff --git a/conformance/src/test/resources/proj-data/ITRF2000 b/conformance/src/test/resources/proj-data/ITRF2000 new file mode 100644 index 0000000..439d197 --- /dev/null +++ b/conformance/src/test/resources/proj-data/ITRF2000 @@ -0,0 +1,24 @@ +# ITRF2000 params are in cm/year, PJ_helmert uses m/year + +version=1.0.0 +origin=ftp://itrf.ensg.ign.fr/pub/itrf/ITRF.TP +lastupdate=2017-07-25 + +# ITRF2000 -> ITRF2005 is only defined the opposite way, so we flip the sign on all +# parameters to get the opposite transformation. Parameters from http://itrf.ign.fr/ITRF_solutions/2005/tp_05-00.php + +proj=helmert +x=-0.0001 +y=0.0008 +z=0.0058 +s=-0.0004 +dx=0.0002 +dy=-0.0001 +dz=0.0018 +ds=-0.00008 +t_epoch=2000.0 +convention=position_vector + + +proj=helmert +x=0.0067 +y=0.0061 +z=-0.0185 +s=0.00155 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1997.0 +convention=position_vector + + +proj=helmert +x=0.0067 +y=0.0061 +z=-0.0185 +s=0.00155 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1997.0 +convention=position_vector + + +proj=helmert +x=0.0067 +y=0.0061 +z=-0.0185 +s=0.00155 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1997.0 +convention=position_vector + + +proj=helmert +x=0.0127 +y=0.0065 +z=-0.0209 +s=0.00195 +rx=-0.00039 +ry=0.00080 +rz=-0.00114 +dx=-0.0029 +dy=-0.0002 +dz=-0.0006 +ds=0.00001 +drx=-0.00011 +dry=-0.00019 +drz=0.00007 +t_epoch=1988.0 +convention=position_vector + + +proj=helmert +x=0.0147 +y=0.0135 +z=-0.0139 +s=0.00075 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector + + +proj=helmert +x=0.0267 +y=0.0275 +z=-0.0199 +s=0.00215 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector + + +proj=helmert +x=0.0247 +y=0.0235 +z=-0.0359 +s=0.00245 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector + + +proj=helmert +x=0.0297 +y=0.0475 +z=-0.0739 +s=0.00585 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector + + +proj=helmert +x=0.0247 +y=0.0115 +z=-0.0979 +s=0.00895 +rx=0.0001 +rz=-0.00018 +dy=-0.0006 +dz=-0.0014 +ds=0.00001 +drz=0.00002 +t_epoch=1988.0 +convention=position_vector diff --git a/conformance/src/test/resources/proj-data/MD b/conformance/src/test/resources/proj-data/MD new file mode 100644 index 0000000..c8500e9 Binary files /dev/null and b/conformance/src/test/resources/proj-data/MD differ diff --git a/conformance/src/test/resources/proj-data/alaska b/conformance/src/test/resources/proj-data/alaska new file mode 100644 index 0000000..bb6be2f Binary files /dev/null and b/conformance/src/test/resources/proj-data/alaska differ diff --git a/conformance/src/test/resources/proj-data/conus b/conformance/src/test/resources/proj-data/conus new file mode 100644 index 0000000..44b4900 Binary files /dev/null and b/conformance/src/test/resources/proj-data/conus differ diff --git a/conformance/src/test/resources/proj-data/dir with space/myconus b/conformance/src/test/resources/proj-data/dir with space/myconus new file mode 100644 index 0000000..44b4900 Binary files /dev/null and b/conformance/src/test/resources/proj-data/dir with space/myconus differ diff --git a/conformance/src/test/resources/proj-data/egm96_15.gtx b/conformance/src/test/resources/proj-data/egm96_15.gtx new file mode 100644 index 0000000..ea53ab1 Binary files /dev/null and b/conformance/src/test/resources/proj-data/egm96_15.gtx differ diff --git a/conformance/src/test/resources/proj-data/nad27 b/conformance/src/test/resources/proj-data/nad27 new file mode 100644 index 0000000..c5e4396 --- /dev/null +++ b/conformance/src/test/resources/proj-data/nad27 @@ -0,0 +1,810 @@ +# SCCSID @(#)nad27 4.1 92/12/20 GIE +# proj +init files for: +# +# State Plane Coordinate Systems, +# North American Datum 1927 + + +lastupdate=1992-12-20 +# 101: alabama east: nad27 +<101> proj=tmerc datum=NAD27 +lon_0=-85d50 lat_0=30d30 k=.99996 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 102: alabama west: nad27 +<102> proj=tmerc datum=NAD27 +lon_0=-87d30 lat_0=30 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5010: alaska zone no. 10: nad27 +<5010> proj=lcc datum=NAD27 +lon_0=-176 lat_1=53d50 lat_2=51d50 lat_0=51 +x_0=914401.8288036576 y_0=0 +no_defs <> + +# 5300: american samoa: nad27 +<5300> proj=lcc datum=NAD27 +lon_0=-170 lat_1=-14d16 lat_2=-14d16 lat_0=-14d16 +x_0=152400.3048006096 y_0=95169.31165862332 +no_defs <> + +# 201: arizona east: nad27 +<201> proj=tmerc datum=NAD27 +lon_0=-110d10 lat_0=31 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 202: arizona central: nad27 +<202> proj=tmerc datum=NAD27 +lon_0=-111d55 lat_0=31 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 203: arizona west: nad27 +<203> proj=tmerc datum=NAD27 +lon_0=-113d45 lat_0=31 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 301: arkansas north: nad27 +<301> proj=lcc datum=NAD27 +lon_0=-92 lat_1=36d14 lat_2=34d56 lat_0=34d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 302: arkansas south: nad27 +<302> proj=lcc datum=NAD27 +lon_0=-92 lat_1=34d46 lat_2=33d18 lat_0=32d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 401: california i: nad27 +<401> proj=lcc datum=NAD27 +lon_0=-122 lat_1=41d40 lat_2=40 lat_0=39d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 402: california ii: nad27 +<402> proj=lcc datum=NAD27 +lon_0=-122 lat_1=39d50 lat_2=38d20 lat_0=37d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 403: california iii: nad27 +<403> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=38d26 lat_2=37d4 lat_0=36d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 404: california iv: nad27 +<404> proj=lcc datum=NAD27 +lon_0=-119 lat_1=37d15 lat_2=36 lat_0=35d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 405: california v: nad27 +<405> proj=lcc datum=NAD27 +lon_0=-118 lat_1=35d28 lat_2=34d2 lat_0=33d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 406: california vi: nad27 +<406> proj=lcc datum=NAD27 +lon_0=-116d15 lat_1=33d53 lat_2=32d47 lat_0=32d10 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 407: california vii: nad27 +<407> proj=lcc datum=NAD27 +lon_0=-118d20 lat_1=34d25 lat_2=33d52 lat_0=34d8 +x_0=1276106.450596901 y_0=1268253.006858014 +no_defs <> + +# 501: colorado north: nad27 +<501> proj=lcc datum=NAD27 +lon_0=-105d30 lat_1=40d47 lat_2=39d43 lat_0=39d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 502: colorado central: nad27 +<502> proj=lcc datum=NAD27 +lon_0=-105d30 lat_1=39d45 lat_2=38d27 lat_0=37d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 503: colorado south: nad27 +<503> proj=lcc datum=NAD27 +lon_0=-105d30 lat_1=38d26 lat_2=37d14 lat_0=36d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 600: connecticut ---: nad27 +<600> proj=lcc datum=NAD27 +lon_0=-72d45 lat_1=41d52 lat_2=41d12 lat_0=40d50 +x_0=182880.3657607315 y_0=0 +no_defs <> + +# 700: delaware ---: nad27 +<700> proj=tmerc datum=NAD27 +lon_0=-75d25 lat_0=38 k=.999995 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 901: florida east: nad27 +<901> proj=tmerc datum=NAD27 +lon_0=-81 lat_0=24d20 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 902: florida west: nad27 +<902> proj=tmerc datum=NAD27 +lon_0=-82 lat_0=24d20 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 903: florida north: nad27 +<903> proj=lcc datum=NAD27 +lon_0=-84d30 lat_1=30d45 lat_2=29d35 lat_0=29 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1001: georgia east: nad27 +<1001> proj=tmerc datum=NAD27 +lon_0=-82d10 lat_0=30 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1002: georgia west: nad27 +<1002> proj=tmerc datum=NAD27 +lon_0=-84d10 lat_0=30 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5101: hawaii 1: nad27 +<5101> proj=tmerc datum=NAD27 +lon_0=-155d30 lat_0=18d50 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5102: hawaii 2: nad27 +<5102> proj=tmerc datum=NAD27 +lon_0=-156d40 lat_0=20d20 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5103: hawaii 3: nad27 +<5103> proj=tmerc datum=NAD27 +lon_0=-158 lat_0=21d10 k=.99999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5104: hawaii 4: nad27 +<5104> proj=tmerc datum=NAD27 +lon_0=-159d30 lat_0=21d50 k=.99999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5105: hawaii 5: nad27 +<5105> proj=tmerc datum=NAD27 +lon_0=-160d10 lat_0=21d40 k=1 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1101: idaho east: nad27 +<1101> proj=tmerc datum=NAD27 +lon_0=-112d10 lat_0=41d40 k=.9999473684210526 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1102: idaho central: nad27 +<1102> proj=tmerc datum=NAD27 +lon_0=-114 lat_0=41d40 k=.9999473684210526 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1103: idaho west: nad27 +<1103> proj=tmerc datum=NAD27 +lon_0=-115d45 lat_0=41d40 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1201: illinois east: nad27 +<1201> proj=tmerc datum=NAD27 +lon_0=-88d20 lat_0=36d40 k=.999975 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1202: illinois west: nad27 +<1202> proj=tmerc datum=NAD27 +lon_0=-90d10 lat_0=36d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1301: indiana east: nad27 +<1301> proj=tmerc datum=NAD27 +lon_0=-85d40 lat_0=37d30 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1302: indiana west: nad27 +<1302> proj=tmerc datum=NAD27 +lon_0=-87d5 lat_0=37d30 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1401: iowa north: nad27 +<1401> proj=lcc datum=NAD27 +lon_0=-93d30 lat_1=43d16 lat_2=42d4 lat_0=41d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1402: iowa south: nad27 +<1402> proj=lcc datum=NAD27 +lon_0=-93d30 lat_1=41d47 lat_2=40d37 lat_0=40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1501: kansas north: nad27 +<1501> proj=lcc datum=NAD27 +lon_0=-98 lat_1=39d47 lat_2=38d43 lat_0=38d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1502: kansas south: nad27 +<1502> proj=lcc datum=NAD27 +lon_0=-98d30 lat_1=38d34 lat_2=37d16 lat_0=36d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1601: kentucky north: nad27 +<1601> proj=lcc datum=NAD27 +lon_0=-84d15 lat_1=38d58 lat_2=37d58 lat_0=37d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1602: kentucky south: nad27 +<1602> proj=lcc datum=NAD27 +lon_0=-85d45 lat_1=37d56 lat_2=36d44 lat_0=36d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1701: louisiana north: nad27 +<1701> proj=lcc datum=NAD27 +lon_0=-92d30 lat_1=32d40 lat_2=31d10 lat_0=30d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1702: louisiana south: nad27 +<1702> proj=lcc datum=NAD27 +lon_0=-91d20 lat_1=30d42 lat_2=29d18 lat_0=28d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1703: louisiana offshore: nad27 +<1703> proj=lcc datum=NAD27 +lon_0=-91d20 lat_1=27d50 lat_2=26d10 lat_0=25d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 1801: maine east: nad27 +<1801> proj=tmerc datum=NAD27 +lon_0=-68d30 lat_0=43d50 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1802: maine west: nad27 +<1802> proj=tmerc datum=NAD27 +lon_0=-70d10 lat_0=42d50 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 1900: maryland ---: nad27 +<1900> proj=lcc datum=NAD27 +lon_0=-77 lat_1=39d27 lat_2=38d18 lat_0=37d50 +x_0=243840.4876809754 y_0=0 +no_defs <> + +# 2001: massachusetts mainland: nad27 +<2001> proj=lcc datum=NAD27 +lon_0=-71d30 lat_1=42d41 lat_2=41d43 lat_0=41 +x_0=182880.3657607315 y_0=0 +no_defs <> + +# 2002: massachusetts island: nad27 +<2002> proj=lcc datum=NAD27 +lon_0=-70d30 lat_1=41d29 lat_2=41d17 lat_0=41 +x_0=60960.12192024384 y_0=0 +no_defs <> + +# 2101: michigan east: nad27 +<2101> proj=tmerc datum=NAD27 +lon_0=-83d40 lat_0=41d30 k=.9999428571428571 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2102: michigan central/m: nad27 +<2102> proj=tmerc datum=NAD27 +lon_0=-85d45 lat_0=41d30 k=.9999090909090909 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2103: michigan west: nad27 +<2103> proj=tmerc datum=NAD27 +lon_0=-88d45 lat_0=41d30 k=.9999090909090909 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2111: michigan north: nad27 +<2111> proj=lcc a=6378450.047 es=.006768657997291094 +lon_0=-87 lat_1=47d5 lat_2=45d29 lat_0=44d47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2112: michigan central/l: nad27 +<2112> proj=lcc a=6378450.047 es=.006768657997291094 +lon_0=-84d20 lat_1=45d42 lat_2=44d11 lat_0=43d19 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2113: michigan south: nad27 +<2113> proj=lcc a=6378450.047 es=.006768657997291094 +lon_0=-84d20 lat_1=43d40 lat_2=42d6 lat_0=41d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2201: minnesota north: nad27 +<2201> proj=lcc datum=NAD27 +lon_0=-93d6 lat_1=48d38 lat_2=47d2 lat_0=46d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2202: minnesota central: nad27 +<2202> proj=lcc datum=NAD27 +lon_0=-94d15 lat_1=47d3 lat_2=45d37 lat_0=45 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2203: minnesota south: nad27 +<2203> proj=lcc datum=NAD27 +lon_0=-94 lat_1=45d13 lat_2=43d47 lat_0=43 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2301: mississippi east: nad27 +<2301> proj=tmerc datum=NAD27 +lon_0=-88d50 lat_0=29d40 k=.99996 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2302: mississippi west: nad27 +<2302> proj=tmerc datum=NAD27 +lon_0=-90d20 lat_0=30d30 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2401: missouri east: nad27 +<2401> proj=tmerc datum=NAD27 +lon_0=-90d30 lat_0=35d50 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2402: missouri central: nad27 +<2402> proj=tmerc datum=NAD27 +lon_0=-92d30 lat_0=35d50 k=.9999333333333333 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2403: missouri west: nad27 +<2403> proj=tmerc datum=NAD27 +lon_0=-94d30 lat_0=36d10 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2501: montana north: nad27 +<2501> proj=lcc datum=NAD27 +lon_0=-109d30 lat_1=48d43 lat_2=47d51 lat_0=47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2502: montana central: nad27 +<2502> proj=lcc datum=NAD27 +lon_0=-109d30 lat_1=47d53 lat_2=46d27 lat_0=45d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2503: montana south: nad27 +<2503> proj=lcc datum=NAD27 +lon_0=-109d30 lat_1=46d24 lat_2=44d52 lat_0=44 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2601: nebraska north: nad27 +<2601> proj=lcc datum=NAD27 +lon_0=-100 lat_1=42d49 lat_2=41d51 lat_0=41d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2602: nebraska south: nad27 +<2602> proj=lcc datum=NAD27 +lon_0=-99d30 lat_1=41d43 lat_2=40d17 lat_0=39d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 2701: nevada east: nad27 +<2701> proj=tmerc datum=NAD27 +lon_0=-115d35 lat_0=34d45 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2702: nevada central: nad27 +<2702> proj=tmerc datum=NAD27 +lon_0=-116d40 lat_0=34d45 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2703: nevada west: nad27 +<2703> proj=tmerc datum=NAD27 +lon_0=-118d35 lat_0=34d45 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2800: new hampshire ---: nad27 +<2800> proj=tmerc datum=NAD27 +lon_0=-71d40 lat_0=42d30 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 2900: new jersey ---: nad27 +<2900> proj=tmerc datum=NAD27 +lon_0=-74d40 lat_0=38d50 k=.999975 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3001: new mexico east: nad27 +<3001> proj=tmerc datum=NAD27 +lon_0=-104d20 lat_0=31 k=.9999090909090909 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3002: new mexico central: nad27 +<3002> proj=tmerc datum=NAD27 +lon_0=-106d15 lat_0=31 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3003: new mexico west: nad27 +<3003> proj=tmerc datum=NAD27 +lon_0=-107d50 lat_0=31 k=.9999166666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3101: new york east: nad27 +<3101> proj=tmerc datum=NAD27 +lon_0=-74d20 lat_0=40 k=.9999666666666667 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3102: new york central: nad27 +<3102> proj=tmerc datum=NAD27 +lon_0=-76d35 lat_0=40 k=.9999375 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3103: new york west: nad27 +<3103> proj=tmerc datum=NAD27 +lon_0=-78d35 lat_0=40 k=.9999375 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3104: new york long island: nad27 +<3104> proj=lcc datum=NAD27 +lon_0=-74 lat_1=41d2 lat_2=40d40 lat_0=40d30 +x_0=609601.2192024384 y_0=30480.06096012192 +no_defs <> + +# 3200: north carolina ---: nad27 +<3200> proj=lcc datum=NAD27 +lon_0=-79 lat_1=36d10 lat_2=34d20 lat_0=33d45 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3301: north dakota north: nad27 +<3301> proj=lcc datum=NAD27 +lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3302: north dakota south: nad27 +<3302> proj=lcc datum=NAD27 +lon_0=-100d30 lat_1=47d29 lat_2=46d11 lat_0=45d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3401: ohio north: nad27 +<3401> proj=lcc datum=NAD27 +lon_0=-82d30 lat_1=41d42 lat_2=40d26 lat_0=39d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3402: ohio south: nad27 +<3402> proj=lcc datum=NAD27 +lon_0=-82d30 lat_1=40d2 lat_2=38d44 lat_0=38 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3501: oklahoma north: nad27 +<3501> proj=lcc datum=NAD27 +lon_0=-98 lat_1=36d46 lat_2=35d34 lat_0=35 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3502: oklahoma south: nad27 +<3502> proj=lcc datum=NAD27 +lon_0=-98 lat_1=35d14 lat_2=33d56 lat_0=33d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3601: oregon north: nad27 +<3601> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=46 lat_2=44d20 lat_0=43d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3602: oregon south: nad27 +<3602> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=44 lat_2=42d20 lat_0=41d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3701: pennsylvania north: nad27 +<3701> proj=lcc datum=NAD27 +lon_0=-77d45 lat_1=41d57 lat_2=40d53 lat_0=40d10 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3702: pennsylvania south: nad27 +<3702> proj=lcc datum=NAD27 +lon_0=-77d45 lat_1=40d58 lat_2=39d56 lat_0=39d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3800: rhode island ---: nad27 +<3800> proj=tmerc datum=NAD27 +lon_0=-71d30 lat_0=41d5 k=.99999375 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 3901: south carolina north: nad27 +<3901> proj=lcc datum=NAD27 +lon_0=-81 lat_1=34d58 lat_2=33d46 lat_0=33 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 3902: south carolina south: nad27 +<3902> proj=lcc datum=NAD27 +lon_0=-81 lat_1=33d40 lat_2=32d20 lat_0=31d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4001: south dakota north: nad27 +<4001> proj=lcc datum=NAD27 +lon_0=-100 lat_1=45d41 lat_2=44d25 lat_0=43d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4002: south dakota south: nad27 +<4002> proj=lcc datum=NAD27 +lon_0=-100d20 lat_1=44d24 lat_2=42d50 lat_0=42d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4100: tennessee ---: nad27 +<4100> proj=lcc datum=NAD27 +lon_0=-86 lat_1=36d25 lat_2=35d15 lat_0=34d40 +x_0=609601.2192024384 y_0=30480.06096012192 +no_defs <> + +# 4201: texas north: nad27 +<4201> proj=lcc datum=NAD27 +lon_0=-101d30 lat_1=36d11 lat_2=34d39 lat_0=34 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4202: texas north central: nad27 +<4202> proj=lcc datum=NAD27 +lon_0=-97d30 lat_1=33d58 lat_2=32d8 lat_0=31d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4203: texas central: nad27 +<4203> proj=lcc datum=NAD27 +lon_0=-100d20 lat_1=31d53 lat_2=30d7 lat_0=29d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4204: texas south central: nad27 +<4204> proj=lcc datum=NAD27 +lon_0=-99 lat_1=30d17 lat_2=28d23 lat_0=27d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4205: texas south: nad27 +<4205> proj=lcc datum=NAD27 +lon_0=-98d30 lat_1=27d50 lat_2=26d10 lat_0=25d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4301: utah north: nad27 +<4301> proj=lcc datum=NAD27 +lon_0=-111d30 lat_1=41d47 lat_2=40d43 lat_0=40d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4302: utah central: nad27 +<4302> proj=lcc datum=NAD27 +lon_0=-111d30 lat_1=40d39 lat_2=39d1 lat_0=38d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4303: utah south: nad27 +<4303> proj=lcc datum=NAD27 +lon_0=-111d30 lat_1=38d21 lat_2=37d13 lat_0=36d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4400: vermont ---: nad27 +<4400> proj=tmerc datum=NAD27 +lon_0=-72d30 lat_0=42d30 k=.9999642857142857 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4501: virginia north: nad27 +<4501> proj=lcc datum=NAD27 +lon_0=-78d30 lat_1=39d12 lat_2=38d2 lat_0=37d40 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4502: virginia south: nad27 +<4502> proj=lcc datum=NAD27 +lon_0=-78d30 lat_1=37d58 lat_2=36d46 lat_0=36d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4601: washington north: nad27 +<4601> proj=lcc datum=NAD27 +lon_0=-120d50 lat_1=48d44 lat_2=47d30 lat_0=47 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4602: washington south: nad27 +<4602> proj=lcc datum=NAD27 +lon_0=-120d30 lat_1=47d20 lat_2=45d50 lat_0=45d20 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4701: west virginia north: nad27 +<4701> proj=lcc datum=NAD27 +lon_0=-79d30 lat_1=40d15 lat_2=39 lat_0=38d30 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4702: west virginia south: nad27 +<4702> proj=lcc datum=NAD27 +lon_0=-81 lat_1=38d53 lat_2=37d29 lat_0=37 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4801: wisconsin north: nad27 +<4801> proj=lcc datum=NAD27 +lon_0=-90 lat_1=46d46 lat_2=45d34 lat_0=45d10 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4802: wisconsin central: nad27 +<4802> proj=lcc datum=NAD27 +lon_0=-90 lat_1=45d30 lat_2=44d15 lat_0=43d50 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4803: wisconsin south: nad27 +<4803> proj=lcc datum=NAD27 +lon_0=-90 lat_1=44d4 lat_2=42d44 lat_0=42 +x_0=609601.2192024384 y_0=0 +no_defs <> + +# 4901: wyoming east: nad27 +<4901> proj=tmerc datum=NAD27 +lon_0=-105d10 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4902: wyoming east central: nad27 +<4902> proj=tmerc datum=NAD27 +lon_0=-107d20 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4903: wyoming west central: nad27 +<4903> proj=tmerc datum=NAD27 +lon_0=-108d45 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 4904: wyoming west: nad27 +<4904> proj=tmerc datum=NAD27 +lon_0=-110d5 lat_0=40d40 k=.9999411764705882 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5001: alaska zone no. 1: nad27 +<5001> proj=omerc datum=NAD27 +k=.9999 lonc=-133d40 lat_0=57 alpha=-36d52'11.6315 +x_0=818585.5672270928 y_0=575219.2451072642 +no_defs <> + +# 5002: alaska zone no. 2: nad27 +<5002> proj=tmerc datum=NAD27 +lon_0=-142 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5003: alaska zone no. 3: nad27 +<5003> proj=tmerc datum=NAD27 +lon_0=-146 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5004: alaska zone no. 4: nad27 +<5004> proj=tmerc datum=NAD27 +lon_0=-150 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5005: alaska zone no. 5: nad27 +<5005> proj=tmerc datum=NAD27 +lon_0=-154 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5006: alaska zone no. 6: nad27 +<5006> proj=tmerc datum=NAD27 +lon_0=-158 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5007: alaska zone no. 7: nad27 +<5007> proj=tmerc datum=NAD27 +lon_0=-162 lat_0=54 k=.9999 +x_0=213360.4267208534 y_0=0 +no_defs <> + +# 5008: alaska zone no. 8: nad27 +<5008> proj=tmerc datum=NAD27 +lon_0=-166 lat_0=54 k=.9999 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5009: alaska zone no. 9: nad27 +<5009> proj=tmerc datum=NAD27 +lon_0=-170 lat_0=54 k=.9999 +x_0=182880.3657607315 y_0=0 +no_defs <> + +# 5201: puerto rico and virgin islands: nad27 +<5201> proj=lcc datum=NAD27 +lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 +x_0=152400.3048006096 y_0=0 +no_defs <> + +# 5202: virgin islands st. croix: nad27 +<5202> proj=lcc datum=NAD27 +lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 +x_0=152400.3048006096 y_0=30480.06096012192 +no_defs <> + +# 5400: guam island: nad27 +<5400> proj=poly datum=NAD27 +x_0=50000 y_0=50000 lon_0=144d44'55.50254 lat_0=13d28'20.87887 +no_defs <> + diff --git a/conformance/src/test/resources/proj-data/nad83 b/conformance/src/test/resources/proj-data/nad83 new file mode 100644 index 0000000..1b65f51 --- /dev/null +++ b/conformance/src/test/resources/proj-data/nad83 @@ -0,0 +1,745 @@ +# SCCSID @(#)nad83 4.1 92/12/20 GIE +# proj +init files for: +# +# State Plane Coordinate Systems, +# North American Datum 1983 + + +lastupdate=1992-12-20 +# 101: alabama east: nad83 +<101> proj=tmerc datum=NAD83 +lon_0=-85d50 lat_0=30d30 k=.99996 +x_0=200000 y_0=0 +no_defs <> + +# 102: alabama west: nad83 +<102> proj=tmerc datum=NAD83 +lon_0=-87d30 lat_0=30 k=.9999333333333333 +x_0=600000 y_0=0 +no_defs <> + +# 5010: alaska zone no. 10: nad83 +<5010> proj=lcc datum=NAD83 +lon_0=-176 lat_1=53d50 lat_2=51d50 lat_0=51 +x_0=1000000 y_0=0 +no_defs <> + +# 201: arizona east: nad83 +<201> proj=tmerc datum=NAD83 +lon_0=-110d10 lat_0=31 k=.9999 +x_0=213360 y_0=0 +no_defs <> + +# 202: arizona central: nad83 +<202> proj=tmerc datum=NAD83 +lon_0=-111d55 lat_0=31 k=.9999 +x_0=213360 y_0=0 +no_defs <> + +# 203: arizona west: nad83 +<203> proj=tmerc datum=NAD83 +lon_0=-113d45 lat_0=31 k=.9999333333333333 +x_0=213360 y_0=0 +no_defs <> + +# 301: arkansas north: nad83 +<301> proj=lcc datum=NAD83 +lon_0=-92 lat_1=36d14 lat_2=34d56 lat_0=34d20 +x_0=400000 y_0=0 +no_defs <> + +# 302: arkansas south: nad83 +<302> proj=lcc datum=NAD83 +lon_0=-92 lat_1=34d46 lat_2=33d18 lat_0=32d40 +x_0=400000 y_0=400000 +no_defs <> + +# 401: california i: nad83 +<401> proj=lcc datum=NAD83 +lon_0=-122 lat_1=41d40 lat_2=40 lat_0=39d20 +x_0=2000000 y_0=500000 +no_defs <> + +# 402: california ii: nad83 +<402> proj=lcc datum=NAD83 +lon_0=-122 lat_1=39d50 lat_2=38d20 lat_0=37d40 +x_0=2000000 y_0=500000 +no_defs <> + +# 403: california iii: nad83 +<403> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=38d26 lat_2=37d4 lat_0=36d30 +x_0=2000000 y_0=500000 +no_defs <> + +# 404: california iv: nad83 +<404> proj=lcc datum=NAD83 +lon_0=-119 lat_1=37d15 lat_2=36 lat_0=35d20 +x_0=2000000 y_0=500000 +no_defs <> + +# 405: california v: nad83 +<405> proj=lcc datum=NAD83 +lon_0=-118 lat_1=35d28 lat_2=34d2 lat_0=33d30 +x_0=2000000 y_0=500000 +no_defs <> + +# 406: california vi: nad83 +<406> proj=lcc datum=NAD83 +lon_0=-116d15 lat_1=33d53 lat_2=32d47 lat_0=32d10 +x_0=2000000 y_0=500000 +no_defs <> + +# 501: colorado north: nad83 +<501> proj=lcc datum=NAD83 +lon_0=-105d30 lat_1=40d47 lat_2=39d43 lat_0=39d20 +x_0=914401.8289 y_0=304800.6096 +no_defs <> + +# 502: colorado central: nad83 +<502> proj=lcc datum=NAD83 +lon_0=-105d30 lat_1=39d45 lat_2=38d27 lat_0=37d50 +x_0=914401.8289 y_0=304800.6096 +no_defs <> + +# 503: colorado south: nad83 +<503> proj=lcc datum=NAD83 +lon_0=-105d30 lat_1=38d26 lat_2=37d14 lat_0=36d40 +x_0=914401.8289 y_0=304800.6096 +no_defs <> + +# 600: connecticut ---: nad83 +<600> proj=lcc datum=NAD83 +lon_0=-72d45 lat_1=41d52 lat_2=41d12 lat_0=40d50 +x_0=304800.6096 y_0=152400.3048 +no_defs <> + +# 700: delaware ---: nad83 +<700> proj=tmerc datum=NAD83 +lon_0=-75d25 lat_0=38 k=.999995 +x_0=200000 y_0=0 +no_defs <> + +# 901: florida east: nad83 +<901> proj=tmerc datum=NAD83 +lon_0=-81 lat_0=24d20 k=.9999411764705882 +x_0=200000 y_0=0 +no_defs <> + +# 902: florida west: nad83 +<902> proj=tmerc datum=NAD83 +lon_0=-82 lat_0=24d20 k=.9999411764705882 +x_0=200000 y_0=0 +no_defs <> + +# 903: florida north: nad83 +<903> proj=lcc datum=NAD83 +lon_0=-84d30 lat_1=30d45 lat_2=29d35 lat_0=29 +x_0=600000 y_0=0 +no_defs <> + +# 1001: georgia east: nad83 +<1001> proj=tmerc datum=NAD83 +lon_0=-82d10 lat_0=30 k=.9999 +x_0=200000 y_0=0 +no_defs <> + +# 1002: georgia west: nad83 +<1002> proj=tmerc datum=NAD83 +lon_0=-84d10 lat_0=30 k=.9999 +x_0=700000 y_0=0 +no_defs <> + +# 5101: hawaii 1: nad83 +<5101> proj=tmerc datum=NAD83 +lon_0=-155d30 lat_0=18d50 k=.9999666666666667 +x_0=500000 y_0=0 +no_defs <> + +# 5102: hawaii 2: nad83 +<5102> proj=tmerc datum=NAD83 +lon_0=-156d40 lat_0=20d20 k=.9999666666666667 +x_0=500000 y_0=0 +no_defs <> + +# 5103: hawaii 3: nad83 +<5103> proj=tmerc datum=NAD83 +lon_0=-158 lat_0=21d10 k=.99999 +x_0=500000 y_0=0 +no_defs <> + +# 5104: hawaii 4: nad83 +<5104> proj=tmerc datum=NAD83 +lon_0=-159d30 lat_0=21d50 k=.99999 +x_0=500000 y_0=0 +no_defs <> + +# 5105: hawaii 5: nad83 +<5105> proj=tmerc datum=NAD83 +lon_0=-160d10 lat_0=21d40 k=1 +x_0=500000 y_0=0 +no_defs <> + +# 1101: idaho east: nad83 +<1101> proj=tmerc datum=NAD83 +lon_0=-112d10 lat_0=41d40 k=.9999473684210526 +x_0=200000 y_0=0 +no_defs <> + +# 1102: idaho central: nad83 +<1102> proj=tmerc datum=NAD83 +lon_0=-114 lat_0=41d40 k=.9999473684210526 +x_0=500000 y_0=0 +no_defs <> + +# 1103: idaho west: nad83 +<1103> proj=tmerc datum=NAD83 +lon_0=-115d45 lat_0=41d40 k=.9999333333333333 +x_0=800000 y_0=0 +no_defs <> + +# 1201: illinois east: nad83 +<1201> proj=tmerc datum=NAD83 +lon_0=-88d20 lat_0=36d40 k=.999975 +x_0=300000 y_0=0 +no_defs <> + +# 1202: illinois west: nad83 +<1202> proj=tmerc datum=NAD83 +lon_0=-90d10 lat_0=36d40 k=.9999411764705882 +x_0=700000 y_0=0 +no_defs <> + +# 1301: indiana east: nad83 +<1301> proj=tmerc datum=NAD83 +lon_0=-85d40 lat_0=37d30 k=.9999666666666667 +x_0=100000 y_0=250000 +no_defs <> + +# 1302: indiana west: nad83 +<1302> proj=tmerc datum=NAD83 +lon_0=-87d5 lat_0=37d30 k=.9999666666666667 +x_0=900000 y_0=250000 +no_defs <> + +# 1401: iowa north: nad83 +<1401> proj=lcc datum=NAD83 +lon_0=-93d30 lat_1=43d16 lat_2=42d4 lat_0=41d30 +x_0=1500000 y_0=1000000 +no_defs <> + +# 1402: iowa south: nad83 +<1402> proj=lcc datum=NAD83 +lon_0=-93d30 lat_1=41d47 lat_2=40d37 lat_0=40 +x_0=500000 y_0=0 +no_defs <> + +# 1501: kansas north: nad83 +<1501> proj=lcc datum=NAD83 +lon_0=-98 lat_1=39d47 lat_2=38d43 lat_0=38d20 +x_0=400000 y_0=0 +no_defs <> + +# 1502: kansas south: nad83 +<1502> proj=lcc datum=NAD83 +lon_0=-98d30 lat_1=38d34 lat_2=37d16 lat_0=36d40 +x_0=400000 y_0=400000 +no_defs <> + +# 1601: kentucky north: nad83 +<1601> proj=lcc datum=NAD83 +lon_0=-84d15 lat_1=38d58 lat_2=37d58 lat_0=37d30 +x_0=500000 y_0=0 +no_defs <> + +# 1602: kentucky south: nad83 +<1602> proj=lcc datum=NAD83 +lon_0=-85d45 lat_1=37d56 lat_2=36d44 lat_0=36d20 +x_0=500000 y_0=500000 +no_defs <> + +# 1701: louisiana north: nad83 +<1701> proj=lcc datum=NAD83 +lon_0=-92d30 lat_1=32d40 lat_2=31d10 lat_0=30d30 +x_0=1000000 y_0=0 +no_defs <> + +# 1702: louisiana south: nad83 +<1702> proj=lcc datum=NAD83 +lon_0=-91d20 lat_1=30d42 lat_2=29d18 lat_0=28d30 +x_0=1000000 y_0=0 +no_defs <> + +# 1703: louisiana offshore: nad83 +<1703> proj=lcc datum=NAD83 +lon_0=-91d20 lat_1=27d50 lat_2=26d10 lat_0=25d30 +x_0=1000000 y_0=0 +no_defs <> + +# 1801: maine east: nad83 +<1801> proj=tmerc datum=NAD83 +lon_0=-68d30 lat_0=43d40 k=.9999 +x_0=300000 y_0=0 +no_defs <> + +# 1802: maine west: nad83 +<1802> proj=tmerc datum=NAD83 +lon_0=-70d10 lat_0=42d50 k=.9999666666666667 +x_0=900000 y_0=0 +no_defs <> + +# 1900: maryland ---: nad83 +<1900> proj=lcc datum=NAD83 +lon_0=-77 lat_1=39d27 lat_2=38d18 lat_0=37d40 +x_0=400000 y_0=0 +no_defs <> + +# 2001: massachusetts mainland: nad83 +<2001> proj=lcc datum=NAD83 +lon_0=-71d30 lat_1=42d41 lat_2=41d43 lat_0=41 +x_0=200000 y_0=750000 +no_defs <> + +# 2002: massachusetts island: nad83 +<2002> proj=lcc datum=NAD83 +lon_0=-70d30 lat_1=41d29 lat_2=41d17 lat_0=41 +x_0=500000 y_0=0 +no_defs <> + +# 2111: michigan north: nad83 +<2111> proj=lcc datum=NAD83 +lon_0=-87 lat_1=47d5 lat_2=45d29 lat_0=44d47 +x_0=8000000 y_0=0 +no_defs <> + +# 2112: michigan central/l: nad83 +<2112> proj=lcc datum=NAD83 +lon_0=-84d22 lat_1=45d42 lat_2=44d11 lat_0=43d19 +x_0=6000000 y_0=0 +no_defs <> + +# 2113: michigan south: nad83 +<2113> proj=lcc datum=NAD83 +lon_0=-84d22 lat_1=43d40 lat_2=42d6 lat_0=41d30 +x_0=4000000 y_0=0 +no_defs <> + +# 2201: minnesota north: nad83 +<2201> proj=lcc datum=NAD83 +lon_0=-93d6 lat_1=48d38 lat_2=47d2 lat_0=46d30 +x_0=800000 y_0=100000 +no_defs <> + +# 2202: minnesota central: nad83 +<2202> proj=lcc datum=NAD83 +lon_0=-94d15 lat_1=47d3 lat_2=45d37 lat_0=45 +x_0=800000 y_0=100000 +no_defs <> + +# 2203: minnesota south: nad83 +<2203> proj=lcc datum=NAD83 +lon_0=-94 lat_1=45d13 lat_2=43d47 lat_0=43 +x_0=800000 y_0=100000 +no_defs <> + +# 2301: mississippi east: nad83 +<2301> proj=tmerc datum=NAD83 +lon_0=-88d50 lat_0=29d30 k=.99995 +x_0=300000 y_0=0 +no_defs <> + +# 2302: mississippi west: nad83 +<2302> proj=tmerc datum=NAD83 +lon_0=-90d20 lat_0=29d30 k=.99995 +x_0=700000 y_0=0 +no_defs <> + +# 2401: missouri east: nad83 +<2401> proj=tmerc datum=NAD83 +lon_0=-90d30 lat_0=35d50 k=.9999333333333333 +x_0=250000 y_0=0 +no_defs <> + +# 2402: missouri central: nad83 +<2402> proj=tmerc datum=NAD83 +lon_0=-92d30 lat_0=35d50 k=.9999333333333333 +x_0=500000 y_0=0 +no_defs <> + +# 2403: missouri west: nad83 +<2403> proj=tmerc datum=NAD83 +lon_0=-94d30 lat_0=36d10 k=.9999411764705882 +x_0=850000 y_0=0 +no_defs <> + +# 2500: montana: nad83 +<2500> proj=lcc datum=NAD83 +lon_0=-109d30 lat_1=49 lat_2=45 lat_0=44d15 +x_0=600000 y_0=0 +no_defs <> + +# 2600: nebraska: nad83 +<2600> proj=lcc datum=NAD83 +lon_0=-100 lat_1=43 lat_2=40 lat_0=39d50 +x_0=500000 y_0=0 +no_defs <> + +# 2701: nevada east: nad83 +<2701> proj=tmerc datum=NAD83 +lon_0=-115d35 lat_0=34d45 k=.9999 +x_0=200000 y_0=8000000 +no_defs <> + +# 2702: nevada central: nad83 +<2702> proj=tmerc datum=NAD83 +lon_0=-116d40 lat_0=34d45 k=.9999 +x_0=500000 y_0=6000000 +no_defs <> + +# 2703: nevada west: nad83 +<2703> proj=tmerc datum=NAD83 +lon_0=-118d35 lat_0=34d45 k=.9999 +x_0=800000 y_0=4000000 +no_defs <> + +# 2800: new hampshire ---: nad83 +<2800> proj=tmerc datum=NAD83 +lon_0=-71d40 lat_0=42d30 k=.9999666666666667 +x_0=300000 y_0=0 +no_defs <> + +# 2900: new jersey ---: nad83 +<2900> proj=tmerc datum=NAD83 +lon_0=-74d30 lat_0=38d50 k=.9999 +x_0=150000 y_0=0 +no_defs <> + +# 3001: new mexico east: nad83 +<3001> proj=tmerc datum=NAD83 +lon_0=-104d20 lat_0=31 k=.9999090909090909 +x_0=165000 y_0=0 +no_defs <> + +# 3002: new mexico central: nad83 +<3002> proj=tmerc datum=NAD83 +lon_0=-106d15 lat_0=31 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 3003: new mexico west: nad83 +<3003> proj=tmerc datum=NAD83 +lon_0=-107d50 lat_0=31 k=.9999166666666667 +x_0=830000 y_0=0 +no_defs <> + +# 3101: new york east: nad83 +<3101> proj=tmerc datum=NAD83 +lon_0=-74d30 lat_0=38d50 k=.9999 +x_0=150000 y_0=0 +no_defs <> + +# 3102: new york central: nad83 +<3102> proj=tmerc datum=NAD83 +lon_0=-76d35 lat_0=40 k=.9999375 +x_0=250000 y_0=0 +no_defs <> + +# 3103: new york west: nad83 +<3103> proj=tmerc datum=NAD83 +lon_0=-78d35 lat_0=40 k=.9999375 +x_0=350000 y_0=0 +no_defs <> + +# 3104: new york long island: nad83 +<3104> proj=lcc datum=NAD83 +lon_0=-74 lat_1=41d2 lat_2=40d40 lat_0=40d10 +x_0=300000 y_0=0 +no_defs <> + +# 3200: north carolina ---: nad83 +<3200> proj=lcc datum=NAD83 +lon_0=-79 lat_1=36d10 lat_2=34d20 lat_0=33d45 +x_0=609601.22 y_0=0 +no_defs <> + +# 3301: north dakota north: nad83 +<3301> proj=lcc datum=NAD83 +lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 +x_0=600000 y_0=0 +no_defs <> + +# 3302: north dakota south: nad83 +<3302> proj=lcc datum=NAD83 +lon_0=-100d30 lat_1=47d29 lat_2=46d11 lat_0=45d40 +x_0=600000 y_0=0 +no_defs <> + +# 3401: ohio north: nad83 +<3401> proj=lcc datum=NAD83 +lon_0=-82d30 lat_1=41d42 lat_2=40d26 lat_0=39d40 +x_0=600000 y_0=0 +no_defs <> + +# 3402: ohio south: nad83 +<3402> proj=lcc datum=NAD83 +lon_0=-82d30 lat_1=40d2 lat_2=38d44 lat_0=38 +x_0=600000 y_0=0 +no_defs <> + +# 3501: oklahoma north: nad83 +<3501> proj=lcc datum=NAD83 +lon_0=-98 lat_1=36d46 lat_2=35d34 lat_0=35 +x_0=600000 y_0=0 +no_defs <> + +# 3502: oklahoma south: nad83 +<3502> proj=lcc datum=NAD83 +lon_0=-98 lat_1=35d14 lat_2=33d56 lat_0=33d20 +x_0=600000 y_0=0 +no_defs <> + +# 3601: oregon north: nad83 +<3601> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=46 lat_2=44d20 lat_0=43d40 +x_0=2500000 y_0=0 +no_defs <> + +# 3602: oregon south: nad83 +<3602> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=44 lat_2=42d20 lat_0=41d40 +x_0=1500000 y_0=0 +no_defs <> + +# 3701: pennsylvania north: nad83 +<3701> proj=lcc datum=NAD83 +lon_0=-77d45 lat_1=41d57 lat_2=40d53 lat_0=40d10 +x_0=600000 y_0=0 +no_defs <> + +# 3702: pennsylvania south: nad83 +<3702> proj=lcc datum=NAD83 +lon_0=-77d45 lat_1=40d58 lat_2=39d56 lat_0=39d20 +x_0=600000 y_0=0 +no_defs <> + +# 3800: rhode island ---: nad83 +<3800> proj=tmerc datum=NAD83 +lon_0=-71d30 lat_0=41d5 k=.99999375 +x_0=100000 y_0=0 +no_defs <> + +# 3900: south carolina: nad83 +<3900> proj=lcc datum=NAD83 +lon_0=-81 lat_1=34d50 lat_2=32d30 lat_0=31d50 +x_0=609600 y_0=0 +no_defs <> + +# 4001: south dakota north: nad83 +<4001> proj=lcc datum=NAD83 +lon_0=-100 lat_1=45d41 lat_2=44d25 lat_0=43d50 +x_0=600000 y_0=0 +no_defs <> + +# 4002: south dakota south: nad83 +<4002> proj=lcc datum=NAD83 +lon_0=-100d20 lat_1=44d24 lat_2=42d50 lat_0=42d20 +x_0=600000 y_0=0 +no_defs <> + +# 4100: tennessee ---: nad83 +<4100> proj=lcc datum=NAD83 +lon_0=-86 lat_1=36d25 lat_2=35d15 lat_0=34d20 +x_0=600000 y_0=0 +no_defs <> + +# 4201: texas north: nad83 +<4201> proj=lcc datum=NAD83 +lon_0=-101d30 lat_1=36d11 lat_2=34d39 lat_0=34 +x_0=200000 y_0=1000000 +no_defs <> + +# 4202: texas north central: nad83 +<4202> proj=lcc datum=NAD83 +lon_0=-98d30 lat_1=33d58 lat_2=32d8 lat_0=31d40 +x_0=600000 y_0=2000000 +no_defs <> + +# 4203: texas central: nad83 +<4203> proj=lcc datum=NAD83 +lon_0=-100d20 lat_1=31d53 lat_2=30d7 lat_0=29d40 +x_0=700000 y_0=3000000 +no_defs <> + +# 4204: texas south central: nad83 +<4204> proj=lcc datum=NAD83 +lon_0=-99 lat_1=30d17 lat_2=28d23 lat_0=27d50 +x_0=600000 y_0=4000000 +no_defs <> + +# 4205: texas south: nad83 +<4205> proj=lcc datum=NAD83 +lon_0=-98d30 lat_1=27d50 lat_2=26d10 lat_0=25d40 +x_0=300000 y_0=5000000 +no_defs <> + +# 4301: utah north: nad83 +<4301> proj=lcc datum=NAD83 +lon_0=-111d30 lat_1=41d47 lat_2=40d43 lat_0=40d20 +x_0=500000 y_0=1000000 +no_defs <> + +# 4302: utah central: nad83 +<4302> proj=lcc datum=NAD83 +lon_0=-111d30 lat_1=40d39 lat_2=39d1 lat_0=38d20 +x_0=500000 y_0=2000000 +no_defs <> + +# 4303: utah south: nad83 +<4303> proj=lcc datum=NAD83 +lon_0=-111d30 lat_1=38d21 lat_2=37d13 lat_0=36d40 +x_0=500000 y_0=3000000 +no_defs <> + +# 4400: vermont ---: nad83 +<4400> proj=tmerc datum=NAD83 +lon_0=-72d30 lat_0=42d30 k=.9999642857142857 +x_0=500000 y_0=0 +no_defs <> + +# 4501: virginia north: nad83 +<4501> proj=lcc datum=NAD83 +lon_0=-78d30 lat_1=39d12 lat_2=38d2 lat_0=37d40 +x_0=3500000 y_0=2000000 +no_defs <> + +# 4502: virginia south: nad83 +<4502> proj=lcc datum=NAD83 +lon_0=-78d30 lat_1=37d58 lat_2=36d46 lat_0=36d20 +x_0=3500000 y_0=1000000 +no_defs <> + +# 4601: washington north: nad83 +<4601> proj=lcc datum=NAD83 +lon_0=-120d50 lat_1=48d44 lat_2=47d30 lat_0=47 +x_0=500000 y_0=0 +no_defs <> + +# 4602: washington south: nad83 +<4602> proj=lcc datum=NAD83 +lon_0=-120d30 lat_1=47d20 lat_2=45d50 lat_0=45d20 +x_0=500000 y_0=0 +no_defs <> + +# 4701: west virginia north: nad83 +<4701> proj=lcc datum=NAD83 +lon_0=-79d30 lat_1=40d15 lat_2=39 lat_0=38d30 +x_0=600000 y_0=0 +no_defs <> + +# 4702: west virginia south: nad83 +<4702> proj=lcc datum=NAD83 +lon_0=-81 lat_1=38d53 lat_2=37d29 lat_0=37 +x_0=600000 y_0=0 +no_defs <> + +# 4801: wisconsin north: nad83 +<4801> proj=lcc datum=NAD83 +lon_0=-90 lat_1=46d46 lat_2=45d34 lat_0=45d10 +x_0=600000 y_0=0 +no_defs <> + +# 4802: wisconsin central: nad83 +<4802> proj=lcc datum=NAD83 +lon_0=-90 lat_1=45d30 lat_2=44d15 lat_0=43d50 +x_0=600000 y_0=0 +no_defs <> + +# 4803: wisconsin south: nad83 +<4803> proj=lcc datum=NAD83 +lon_0=-90 lat_1=44d4 lat_2=42d44 lat_0=42 +x_0=600000 y_0=0 +no_defs <> + +# 4901: wyoming east: nad83 +<4901> proj=tmerc datum=NAD83 +lon_0=-105d10 lat_0=40d30 k=.9999375 +x_0=200000 y_0=0 +no_defs <> + +# 4902: wyoming east central: nad83 +<4902> proj=tmerc datum=NAD83 +lon_0=-107d20 lat_0=40d30 k=.9999375 +x_0=400000 y_0=100000 +no_defs <> + +# 4903: wyoming west central: nad83 +<4903> proj=tmerc datum=NAD83 +lon_0=-108d45 lat_0=40d30 k=.9999375 +x_0=600000 y_0=0 +no_defs <> + +# 4904: wyoming west: nad83 +<4904> proj=tmerc datum=NAD83 +lon_0=-110d5 lat_0=40d30 k=.9999375 +x_0=800000 y_0=100000 +no_defs <> + +# 5001: alaska zone no. 1: nad83 +<5001> proj=omerc datum=NAD83 +k=.9999 lonc=-133d40 lat_0=57 alpha=-36d52'11.6315 +x_0=818676.7344011233 y_0=575097.6888751927 +no_defs <> + +# 5002: alaska zone no. 2: nad83 +<5002> proj=tmerc datum=NAD83 +lon_0=-142 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5003: alaska zone no. 3: nad83 +<5003> proj=tmerc datum=NAD83 +lon_0=-146 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5004: alaska zone no. 4: nad83 +<5004> proj=tmerc datum=NAD83 +lon_0=-150 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5005: alaska zone no. 5: nad83 +<5005> proj=tmerc datum=NAD83 +lon_0=-154 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5006: alaska zone no. 6: nad83 +<5006> proj=tmerc datum=NAD83 +lon_0=-158 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5007: alaska zone no. 7: nad83 +<5007> proj=tmerc datum=NAD83 +lon_0=-162 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5008: alaska zone no. 8: nad83 +<5008> proj=tmerc datum=NAD83 +lon_0=-166 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5009: alaska zone no. 9: nad83 +<5009> proj=tmerc datum=NAD83 +lon_0=-170 lat_0=54 k=.9999 +x_0=500000 y_0=0 +no_defs <> + +# 5200: puerto rico and virgin islands: nad83 +<5200> proj=lcc datum=NAD83 +lon_0=-66d26 lat_1=18d26 lat_2=18d2 lat_0=17d50 +x_0=200000 y_0=200000 +no_defs <> + diff --git a/conformance/src/test/resources/proj-data/ntf_r93.gsb b/conformance/src/test/resources/proj-data/ntf_r93.gsb new file mode 100644 index 0000000..07e34fc Binary files /dev/null and b/conformance/src/test/resources/proj-data/ntf_r93.gsb differ diff --git a/conformance/src/test/resources/proj-data/ntv1_can.dat b/conformance/src/test/resources/proj-data/ntv1_can.dat new file mode 100644 index 0000000..8acad07 Binary files /dev/null and b/conformance/src/test/resources/proj-data/ntv1_can.dat differ diff --git a/conformance/src/test/resources/proj-data/ntv2_0.gsb b/conformance/src/test/resources/proj-data/ntv2_0.gsb new file mode 100644 index 0000000..06b8111 Binary files /dev/null and b/conformance/src/test/resources/proj-data/ntv2_0.gsb differ diff --git a/conformance/src/test/resources/proj-data/proj.ini b/conformance/src/test/resources/proj-data/proj.ini new file mode 100644 index 0000000..95d341e --- /dev/null +++ b/conformance/src/test/resources/proj-data/proj.ini @@ -0,0 +1,59 @@ +[general] +; Lines starting by ; are commented lines. +; + +; Network capabilities disabled by default. +; Can be overridden with the PROJ_NETWORK=ON environment variable. +; Cf https://proj.org/en/latest/usage/network.html +; Valid values = on, off +network = off + +; Endpoint of the Content Delivery Network where remote resources might +; be accessed. Only used if network access is allowed (cf above "network" +; option) +; Can be overridden with the PROJ_NETWORK_ENDPOINT environment variable. +cdn_endpoint = https://cdn.proj.org + +; Whether to enable a cache of remote resources that are accessed, on the +; local file system +; Valid values = on, off +cache_enabled = on + +; Size of the cache in megabytes +cache_size_MB = 300 + +; Time-to-live delay in seconds before already accessed remote resources are +; accessed again to check if they have been updated. +cache_ttl_sec = 86400 + +; Can be set to on so that by default the lack of a known resource files needed +; for the best transformation PROJ would normally use causes an error, or off +; to accept missing resource files without errors or warnings. +; This default value itself is overridden by the PROJ_ONLY_BEST_DEFAULT environment +; variable if set, and then by the ONLY_BEST setting that can be +; passed to the proj_create_crs_to_crs() method, or with the --only-best +; option of the cs2cs program. +; (added in PROJ 9.2) +; Valid values = on, off +only_best_default = off + +; Filename of the Certificate Authority (CA) bundle. +; Can be overridden with the PROJ_CURL_CA_BUNDLE / CURL_CA_BUNDLE environment variable. +; (added in PROJ 9.0) +; ca_bundle_path = /path/to/cabundle.pem + +; When this is set to on, the operating systems native CA store will be used for certificate verification +; If you set this option to on and also set ca_bundle_path then during verification those certificates are +; searched in addition to the native CA store. +; (added in PROJ 9.6) +; Valid values = on, off +;native_ca = on + + +; Transverse Mercator (and UTM) default algorithm: auto, evenden_snyder or poder_engsager +; * evenden_snyder is the fastest, but less accurate far from central meridian +; * poder_engsager is slower, but more accurate far from central meridian +; * default will auto-select between the two above depending on the coordinate +; to transform and will use evenden_snyder if the error in doing so is below +; 0.1 mm (for an ellipsoid of the size of Earth) +tmerc_default_algo = poder_engsager diff --git a/conformance/src/test/resources/proj-data/tests/BETA2007.gsb b/conformance/src/test/resources/proj-data/tests/BETA2007.gsb new file mode 100644 index 0000000..69cd334 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/BETA2007.gsb differ diff --git a/conformance/src/test/resources/proj-data/tests/MD b/conformance/src/test/resources/proj-data/tests/MD new file mode 100644 index 0000000..c8500e9 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/MD differ diff --git a/conformance/src/test/resources/proj-data/tests/alaska b/conformance/src/test/resources/proj-data/tests/alaska new file mode 100644 index 0000000..bb6be2f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/alaska differ diff --git a/conformance/src/test/resources/proj-data/tests/conus b/conformance/src/test/resources/proj-data/tests/conus new file mode 100644 index 0000000..44b4900 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/conus differ diff --git a/conformance/src/test/resources/proj-data/tests/egm96_15_downsampled.gtx b/conformance/src/test/resources/proj-data/tests/egm96_15_downsampled.gtx new file mode 100644 index 0000000..ea53ab1 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/egm96_15_downsampled.gtx differ diff --git a/conformance/src/test/resources/proj-data/tests/egm96_15_uncompressed_truncated.tif b/conformance/src/test/resources/proj-data/tests/egm96_15_uncompressed_truncated.tif new file mode 100644 index 0000000..bd34a7e Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/egm96_15_uncompressed_truncated.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/fr_ign_RAGTBT2016.tif b/conformance/src/test/resources/proj-data/tests/fr_ign_RAGTBT2016.tif new file mode 100644 index 0000000..f3479a9 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/fr_ign_RAGTBT2016.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_extract.tif b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_extract.tif new file mode 100644 index 0000000..6db8eae Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_extract.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_extract_tiled_256x256.tif b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_extract_tiled_256x256.tif new file mode 100644 index 0000000..e60c9c3 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_extract_tiled_256x256.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_xy_extract.ct2 b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_xy_extract.ct2 new file mode 100644 index 0000000..89232b9 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_xy_extract.ct2 differ diff --git a/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_z_extract.gtx b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_z_extract.gtx new file mode 100644 index 0000000..5ea8aac Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/nkgrf03vel_realigned_z_extract.gtx differ diff --git a/conformance/src/test/resources/proj-data/tests/ntf_r93.gsb b/conformance/src/test/resources/proj-data/tests/ntf_r93.gsb new file mode 100644 index 0000000..07e34fc Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/ntf_r93.gsb differ diff --git a/conformance/src/test/resources/proj-data/tests/ntv1_can.dat b/conformance/src/test/resources/proj-data/tests/ntv1_can.dat new file mode 100644 index 0000000..8acad07 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/ntv1_can.dat differ diff --git a/conformance/src/test/resources/proj-data/tests/ntv2_0_downsampled.gsb b/conformance/src/test/resources/proj-data/tests/ntv2_0_downsampled.gsb new file mode 100644 index 0000000..06b8111 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/ntv2_0_downsampled.gsb differ diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_degree_3d.json b/conformance/src/test/resources/proj-data/tests/simple_model_degree_3d.json new file mode 100644 index 0000000..6a41ce5 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_degree_3d.json @@ -0,0 +1,54 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "horizontal_offset_unit": "degree", + "horizontal_offset_method": "addition", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "3d", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/simple_model_degree_3d_grid.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} \ No newline at end of file diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_degree_3d_grid.tif b/conformance/src/test/resources/proj-data/tests/simple_model_degree_3d_grid.tif new file mode 100644 index 0000000..3bbff0a Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/simple_model_degree_3d_grid.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_degree_horizontal.json b/conformance/src/test/resources/proj-data/tests/simple_model_degree_horizontal.json new file mode 100644 index 0000000..533c005 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_degree_horizontal.json @@ -0,0 +1,53 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "horizontal_offset_unit": "degree", + "horizontal_offset_method": "addition", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "horizontal", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/simple_model_degree_3d_grid.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} \ No newline at end of file diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d.json b/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d.json new file mode 100644 index 0000000..201aaeb --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d.json @@ -0,0 +1,54 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "horizontal_offset_unit": "metre", + "horizontal_offset_method": "addition", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "3d", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/simple_model_metre_3d_grid.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} \ No newline at end of file diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d_geocentric.json b/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d_geocentric.json new file mode 100644 index 0000000..1328ff5 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d_geocentric.json @@ -0,0 +1,54 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "horizontal_offset_unit": "metre", + "horizontal_offset_method": "geocentric", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "3d", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/simple_model_metre_3d_grid.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} \ No newline at end of file diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d_grid.tif b/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d_grid.tif new file mode 100644 index 0000000..40cf2d7 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/simple_model_metre_3d_grid.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_metre_horizontal.json b/conformance/src/test/resources/proj-data/tests/simple_model_metre_horizontal.json new file mode 100644 index 0000000..d0ac477 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_metre_horizontal.json @@ -0,0 +1,53 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "horizontal_offset_unit": "metre", + "horizontal_offset_method": "addition", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "horizontal", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/simple_model_metre_3d_grid.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} \ No newline at end of file diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_metre_vertical.json b/conformance/src/test/resources/proj-data/tests/simple_model_metre_vertical.json new file mode 100644 index 0000000..7057434 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_metre_vertical.json @@ -0,0 +1,49 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "vertical", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + -180, + -90, + 180, + 90 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/simple_model_metre_vertical_grid.tif" + }, + "time_function": { + "type": "constant" + } + } + ] +} \ No newline at end of file diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_metre_vertical_grid.tif b/conformance/src/test/resources/proj-data/tests/simple_model_metre_vertical_grid.tif new file mode 100644 index 0000000..058b808 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/simple_model_metre_vertical_grid.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_polar.json b/conformance/src/test/resources/proj-data/tests/simple_model_polar.json new file mode 100644 index 0000000..ef99a0c --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_polar.json @@ -0,0 +1,54 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "horizontal_offset_unit": "metre", + "horizontal_offset_method": "geocentric", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + 0, + -90, + 360, + -89 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "3d", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + 0, + -90, + 360, + -89 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "geocentric_bilinear", + "filename": "tests/simple_model_polar.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_polar.tif b/conformance/src/test/resources/proj-data/tests/simple_model_polar.tif new file mode 100644 index 0000000..7371ca1 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/simple_model_polar.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_projected.json b/conformance/src/test/resources/proj-data/tests/simple_model_projected.json new file mode 100644 index 0000000..c97a7c1 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_projected.json @@ -0,0 +1,51 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:2193", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:2193", + "horizontal_offset_unit": "metre", + "horizontal_offset_method": "addition", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + 1500000.0, + 5400000.0, + 1501000.0, + 5401000.0 + ] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "3d", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [ + 1500000.0, + 5400000.0, + 1501000.0, + 5401000.0 + ] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "bilinear", + "filename": "tests/test_3d_grid_projected.tif" + }, + "time_function": { + "type": "constant" + } + } + ] +} diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_wrap_east.json b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_east.json new file mode 100644 index 0000000..2a0a2c0 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_east.json @@ -0,0 +1,42 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [-194.2, -37.5, -193.8, -37.2] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "vertical", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [-194.2, -37.5, -193.8, -37.2] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "geocentric_bilinear", + "filename": "tests/simple_model_wrap_east.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_wrap_east.tif b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_east.tif new file mode 100644 index 0000000..816d8a7 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_east.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_wrap_west.json b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_west.json new file mode 100644 index 0000000..54a04bd --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_west.json @@ -0,0 +1,42 @@ +{ + "file_type": "deformation_model_master_file", + "format_version": "1.0", + "source_crs": "EPSG:4326", + "target_crs": "foo:ignored", + "definition_crs": "EPSG:4326", + "vertical_offset_unit": "metre", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [525.8,-37.5,526.2,-37.2] + } + }, + "time_extent": { + "first": "1900-01-01T00:00:00Z", + "last": "2050-01-01T00:00:00Z" + }, + "components": [ + { + "description": "test", + "displacement_type": "vertical", + "uncertainty_type": "none", + "extent": { + "type": "bbox", + "parameters": { + "bbox": [525.8,-37.5,526.2,-37.2] + } + }, + "spatial_model": { + "type": "GeoTIFF", + "interpolation_method": "geocentric_bilinear", + "filename": "tests/simple_model_wrap_west.tif" + }, + "time_function": { + "type": "step", + "parameters": { + "step_epoch": "1900-01-01T00:00:00Z" + } + } + } + ] +} diff --git a/conformance/src/test/resources/proj-data/tests/simple_model_wrap_west.tif b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_west.tif new file mode 100644 index 0000000..3a8da6f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/simple_model_wrap_west.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/subset_of_gr3df97a.tif b/conformance/src/test/resources/proj-data/tests/subset_of_gr3df97a.tif new file mode 100644 index 0000000..a98783f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/subset_of_gr3df97a.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_3d_grid_projected.tif b/conformance/src/test/resources/proj-data/tests/test_3d_grid_projected.tif new file mode 100644 index 0000000..5613841 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_3d_grid_projected.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_gridshift_projected.tif b/conformance/src/test/resources/proj-data/tests/test_gridshift_projected.tif new file mode 100644 index 0000000..bcead1b Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_gridshift_projected.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid.tif new file mode 100644 index 0000000..94718c2 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_big_endian.gsb b/conformance/src/test/resources/proj-data/tests/test_hgrid_big_endian.gsb new file mode 100644 index 0000000..91f2189 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_big_endian.gsb differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_degree.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_degree.tif new file mode 100644 index 0000000..d06782e Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_degree.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_extra_ifd_with_other_info.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_extra_ifd_with_other_info.tif new file mode 100644 index 0000000..b7e67af Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_extra_ifd_with_other_info.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_little_endian.gsb b/conformance/src/test/resources/proj-data/tests/test_hgrid_little_endian.gsb new file mode 100644 index 0000000..13b3739 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_little_endian.gsb differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_lon_shift_first.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_lon_shift_first.tif new file mode 100644 index 0000000..395f074 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_lon_shift_first.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_positive_west.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_positive_west.tif new file mode 100644 index 0000000..4ebc17c Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_positive_west.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_radian.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_radian.tif new file mode 100644 index 0000000..30219cc Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_radian.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_separate.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_separate.tif new file mode 100644 index 0000000..ef2ca57 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_separate.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_strip.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_strip.tif new file mode 100644 index 0000000..e38fc60 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_strip.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_tiled.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_tiled.tif new file mode 100644 index 0000000..b0d5dd8 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_tiled.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_tiled_separate.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_tiled_separate.tif new file mode 100644 index 0000000..d7e0934 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_tiled_separate.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_with_overview.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_overview.tif new file mode 100644 index 0000000..d7453b4 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_overview.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_with_subgrid.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_subgrid.tif new file mode 100644 index 0000000..46a8f2f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_subgrid.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_with_subgrid_no_grid_name.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_subgrid_no_grid_name.tif new file mode 100644 index 0000000..974699b Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_subgrid_no_grid_name.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hgrid_with_two_level_of_subgrids_no_grid_name.tif b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_two_level_of_subgrids_no_grid_name.tif new file mode 100644 index 0000000..2abb322 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hgrid_with_two_level_of_subgrids_no_grid_name.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_hydroid_height.tif b/conformance/src/test/resources/proj-data/tests/test_hydroid_height.tif new file mode 100644 index 0000000..4b8db2e Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_hydroid_height.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_nodata.gtx b/conformance/src/test/resources/proj-data/tests/test_nodata.gtx new file mode 100644 index 0000000..e439e5f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_nodata.gtx differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_bigendian.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_bigendian.tif new file mode 100644 index 0000000..5cf4a03 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_bigendian.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_bigendian_bigtiff.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_bigendian_bigtiff.tif new file mode 100644 index 0000000..a586b85 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_bigendian_bigtiff.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_bigtiff.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_bigtiff.tif new file mode 100644 index 0000000..2a01893 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_bigtiff.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_bottomup_with_matrix.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_bottomup_with_matrix.tif new file mode 100644 index 0000000..90f637d Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_bottomup_with_matrix.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_bottomup_with_scale.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_bottomup_with_scale.tif new file mode 100644 index 0000000..636b7dc Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_bottomup_with_scale.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_deflate.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_deflate.tif new file mode 100644 index 0000000..ee3b5f0 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_deflate.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_deflate_floatingpointpredictor.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_deflate_floatingpointpredictor.tif new file mode 100644 index 0000000..5fd7b9f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_deflate_floatingpointpredictor.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_float64.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_float64.tif new file mode 100644 index 0000000..16b3e79 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_float64.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_in_second_channel.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_in_second_channel.tif new file mode 100644 index 0000000..d377f8b Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_in_second_channel.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_int16.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_int16.tif new file mode 100644 index 0000000..1c69b5d Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_int16.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_int32.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_int32.tif new file mode 100644 index 0000000..1b6dfd7 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_int32.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_invalid_channel_type.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_invalid_channel_type.tif new file mode 100644 index 0000000..ec9e641 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_invalid_channel_type.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_nodata.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_nodata.tif new file mode 100644 index 0000000..65ec534 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_nodata.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_pixelisarea.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_pixelisarea.tif new file mode 100644 index 0000000..a5409f6 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_pixelisarea.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_pixelispoint.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_pixelispoint.tif new file mode 100644 index 0000000..cfeb598 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_pixelispoint.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_single_strip_truncated.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_single_strip_truncated.tif new file mode 100644 index 0000000..9a0030f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_single_strip_truncated.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_uint16.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_uint16.tif new file mode 100644 index 0000000..a03d9a7 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_uint16.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_uint16_with_scale_offset.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_uint16_with_scale_offset.tif new file mode 100644 index 0000000..b08fa4a Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_uint16_with_scale_offset.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_uint32.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_uint32.tif new file mode 100644 index 0000000..cae7e9e Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_uint32.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_unsupported_byte.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_unsupported_byte.tif new file mode 100644 index 0000000..ccf03fc Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_unsupported_byte.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_with_overview.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_with_overview.tif new file mode 100644 index 0000000..aa15aa1 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_with_overview.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/test_vgrid_with_subgrid.tif b/conformance/src/test/resources/proj-data/tests/test_vgrid_with_subgrid.tif new file mode 100644 index 0000000..5c7584c Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/test_vgrid_with_subgrid.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/tinshift_crs_implicit.json b/conformance/src/test/resources/proj-data/tests/tinshift_crs_implicit.json new file mode 100644 index 0000000..b3a64e1 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/tinshift_crs_implicit.json @@ -0,0 +1,46 @@ +{ + "file_type": "triangulation_file", + "format_version": "1.0", + "name": "Name", + "version": "Version", + "publication_date": "2018-07-01T00:00:00Z", + "license": "Creative Commons Attribution 4.0 International", + "description": "Test triangulation", + "authority": { + "name": "Authority name", + "url": "http://example.com", + "address": "Address", + "email": "test@example.com" + }, + "links": [ + { + "href": "https://example.com/about.html", + "rel": "about", + "type": "text/html", + "title": "About" + }, + { + "href": "https://example.com/download", + "rel": "source", + "type": "application/zip", + "title": "Authoritative source" + }, + { + "href": "https://creativecommons.org/licenses/by/4.0/", + "rel": "license", + "type": "text/html", + "title": "Creative Commons Attribution 4.0 International license" + }, + { + "href": "https://example.com/metadata.xml", + "rel": "metadata", + "type": "application/xml", + "title": " ISO 19115 XML encoded metadata regarding the deformation model" + } + ], + "transformed_components": [ "horizontal" ], + "vertices_columns": [ "source_x", "source_y", "target_x", "target_y" ], + "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ], + "vertices": [ [2,49,2.1,49.1], [3,50,3.1,50.1], [2, 50, 2.1,50.1] ], + "triangles": [ [0, 1, 2] ] +} diff --git a/conformance/src/test/resources/proj-data/tests/tinshift_fallback_nearest_centroid.json b/conformance/src/test/resources/proj-data/tests/tinshift_fallback_nearest_centroid.json new file mode 100644 index 0000000..9751ab5 --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/tinshift_fallback_nearest_centroid.json @@ -0,0 +1,17 @@ +{ + "file_type": "triangulation_file", + "format_version": "1.1", + "fallback_strategy": "nearest_centroid", + "transformed_components": [ "horizontal" ], + "vertices_columns": [ "source_x", "source_y", "target_x", "target_y" ], + "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ], + "vertices": [ + [0, 0, 0, 0], + [1, 0, 1, 0], + [1, 1, 1, 1], + [4, 0, 100, 0], + [100, 0, 100, 1], + [100, 1, 4, 0] + ], + "triangles": [ [0, 1, 2], [3, 4, 5] ] +} diff --git a/conformance/src/test/resources/proj-data/tests/tinshift_fallback_nearest_side.json b/conformance/src/test/resources/proj-data/tests/tinshift_fallback_nearest_side.json new file mode 100644 index 0000000..59e5b6f --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/tinshift_fallback_nearest_side.json @@ -0,0 +1,15 @@ +{ + "file_type": "triangulation_file", + "format_version": "1.1", + "fallback_strategy": "nearest_side", + "transformed_components": [ "horizontal" ], + "vertices_columns": [ "source_x", "source_y", "target_x", "target_y" ], + "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ], + "vertices": [ + [0, 0, 0, 0], + [1, 0, 2, 0], + [1, 1, 2, 2], + [0, 1, 0, 2] + ], + "triangles": [ [0, 1, 2], [0, 2, 3] ] +} diff --git a/conformance/src/test/resources/proj-data/tests/tinshift_simplified_kkj_etrs.json b/conformance/src/test/resources/proj-data/tests/tinshift_simplified_kkj_etrs.json new file mode 100644 index 0000000..3efc4fa --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/tinshift_simplified_kkj_etrs.json @@ -0,0 +1,50 @@ +{ + "file_type": "triangulation_file", + "format_version": "1.0", + "name": "Name", + "version": "Version", + "publication_date": "2018-07-01T00:00:00Z", + "license": "Creative Commons Attribution 4.0 International", + "description": "Test triangulation", + "authority": { + "name": "Authority name", + "url": "http://example.com", + "address": "Address", + "email": "test@example.com" + }, + "links": [ + { + "href": "https://example.com/about.html", + "rel": "about", + "type": "text/html", + "title": "About" + }, + { + "href": "https://example.com/download", + "rel": "source", + "type": "application/zip", + "title": "Authoritative source" + }, + { + "href": "https://creativecommons.org/licenses/by/4.0/", + "rel": "license", + "type": "text/html", + "title": "Creative Commons Attribution 4.0 International license" + }, + { + "href": "https://example.com/metadata.xml", + "rel": "metadata", + "type": "application/xml", + "title": " ISO 19115 XML encoded metadata regarding the triangulation" + } + ], + "input_crs": "EPSG:2393", + "output_crs": "EPSG:3067", + "transformed_components": [ "horizontal" ], + "vertices_columns": [ "source_x", "source_y", "target_x", "target_y" ], + "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ], + "vertices": [ [3244102.707, 6693710.937, 244037.137, 6690900.686], + [3205290.722, 6715311.822, 205240.895, 6712492.577], + [3218328.492, 6649538.429, 218273.648, 6646745.973] ], + "triangles": [ [0, 1, 2] ] +} diff --git a/conformance/src/test/resources/proj-data/tests/tinshift_simplified_n60_n2000.json b/conformance/src/test/resources/proj-data/tests/tinshift_simplified_n60_n2000.json new file mode 100644 index 0000000..7f133df --- /dev/null +++ b/conformance/src/test/resources/proj-data/tests/tinshift_simplified_n60_n2000.json @@ -0,0 +1,50 @@ +{ + "file_type": "triangulation_file", + "format_version": "1.0", + "name": "Name", + "version": "Version", + "publication_date": "2018-07-01T00:00:00Z", + "license": "Creative Commons Attribution 4.0 International", + "description": "Test triangulation", + "authority": { + "name": "Authority name", + "url": "http://example.com", + "address": "Address", + "email": "test@example.com" + }, + "links": [ + { + "href": "https://example.com/about.html", + "rel": "about", + "type": "text/html", + "title": "About" + }, + { + "href": "https://example.com/download", + "rel": "source", + "type": "application/zip", + "title": "Authoritative source" + }, + { + "href": "https://creativecommons.org/licenses/by/4.0/", + "rel": "license", + "type": "text/html", + "title": "Creative Commons Attribution 4.0 International license" + }, + { + "href": "https://example.com/metadata.xml", + "rel": "metadata", + "type": "application/xml", + "title": " ISO 19115 XML encoded metadata regarding the tirangulation" + } + ], + "input_crs": "EPSG:2393+5717", + "output_crs": "EPSG:2393+5941", + "transformed_components": [ "vertical" ], + "vertices_columns": [ "source_x", "source_y", "source_z", "target_z" ], + "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ], + "vertices": [ [3188607.0, 6688748.0, 23.123, 23.4133], + [3184981.0, 6725255.0, 8.044, 8.34499], + [3220912.0, 6699508.0, 1.724, 2.0101] ], + "triangles": [ [0, 1, 2] ] +} diff --git a/conformance/src/test/resources/proj-data/tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif b/conformance/src/test/resources/proj-data/tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif new file mode 100644 index 0000000..2c01759 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif b/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif new file mode 100644 index 0000000..c2acae8 Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif b/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif new file mode 100644 index 0000000..67a8d9a Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif differ diff --git a/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif b/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif new file mode 100644 index 0000000..54ef15f Binary files /dev/null and b/conformance/src/test/resources/proj-data/tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif differ diff --git a/conformance/src/test/resources/runner-fixtures/expect-failure-vacuity.gie b/conformance/src/test/resources/runner-fixtures/expect-failure-vacuity.gie new file mode 100644 index 0000000..f69dffe --- /dev/null +++ b/conformance/src/test/resources/runner-fixtures/expect-failure-vacuity.gie @@ -0,0 +1,42 @@ +# Synthetic fixture for the three-way split of `expect failure`. +# +# Upstream gie scores EVERY block below except block 2 as a pass. Six of the eight are the same +# two-line shape -- an operation that cannot be created, and a row that expected a failure -- and +# telling them apart is the entire point of ExpectedFailureVerdict. +# +# block operation row verdict +# ----- ------------------------------------- ------------------------------------- --------------------------- +# 0 built, every transform fails expect failure PASS_EXPECTED_FAILURE +# 1 NOT_IMPLEMENTED expect failure VACUOUS (the adams_hemi trap) +# 2 built, transform succeeds expect failure FAIL ("failed to fail") +# 3 INVALID_DEFINITION errno invalid_op_illegal_arg_value PASS_EXPECTED_FAILURE (ellipsoid.gie) +# 4 INVALID_DEFINITION errno coord_transfm_outside_... VACUOUS (the corpus says PROJ built it) +# 5 NOT_IMPLEMENTED errno invalid_op_illegal_arg_value VACUOUS (a gap is not a verdict) +# 6 MISSING_GRID errno invalid_op_file_not_found_... PASS_EXPECTED_FAILURE +# 7 MISSING_GRID expect failure VACUOUS + +operation fake fail=always +accept 1 2 +expect failure +operation no-such-operator kind=NOT_IMPLEMENTED +accept 1 2 +expect failure +operation fake shift=0 +accept 1 2 +expect failure +operation bad-definition kind=INVALID_DEFINITION +accept 1 2 +expect failure errno invalid_op_illegal_arg_value +operation bad-definition kind=INVALID_DEFINITION +accept 1 2 +expect failure errno coord_transfm_outside_projection_domain +operation no-such-operator kind=NOT_IMPLEMENTED +accept 1 2 +expect failure errno invalid_op_illegal_arg_value +operation absent-grid kind=MISSING_GRID +accept 1 2 +expect failure errno invalid_op_file_not_found_or_invalid +operation absent-grid kind=MISSING_GRID +accept 1 2 +expect failure + diff --git a/conformance/src/test/resources/runner-fixtures/expect-failure.gie b/conformance/src/test/resources/runner-fixtures/expect-failure.gie new file mode 100644 index 0000000..eb7a63a --- /dev/null +++ b/conformance/src/test/resources/runner-fixtures/expect-failure.gie @@ -0,0 +1,32 @@ +# Synthetic fixture: the four combinations of (did creation/transform fail?) x +# (was failure expected?), plus a control, plus the two errno spellings. +# +# block 0 creation failed, failure expected -> PASS +# block 1 creation failed, coordinate expected -> FAIL +# block 2 transform failed, failure expected -> PASS +# block 3 transform worked, failure expected -> FAIL ("failed to fail") +# block 4 transform worked, coordinate expected -> PASS (control) +# block 5 a real PROJ errno name -> PASS (degenerates) +# block 6 a legacy name PROJ itself cannot match -> PASS (degenerates) + +operation not-a-fake-operation +expect failure +operation not-a-fake-operation +accept 1 2 +expect 1 2 +operation fake fail=always +accept 1 2 +expect failure +operation fake shift=0 +accept 1 2 +expect failure +operation fake shift=0 +accept 1 2 +expect 1 2 +operation fake fail=always +accept 1 2 +expect failure errno coord_transfm_invalid_coord +operation fake fail=always +accept 1 2 +expect failure errno pjd_err_axis + diff --git a/conformance/src/test/resources/runner-fixtures/require-grid.gie b/conformance/src/test/resources/runner-fixtures/require-grid.gie new file mode 100644 index 0000000..1d6d98a --- /dev/null +++ b/conformance/src/test/resources/runner-fixtures/require-grid.gie @@ -0,0 +1,20 @@ +# Synthetic fixture: require_grid sets skip_test, which turns every subsequent +# `expect` into a SKIP and DROPS every other verb -- accept, tolerance, +# direction and, notably, roundtrip, which is discarded rather than skipped. +# The cascade ends at the next `operation`. + +------------------------------------------------------------------------------- +operation fake shift=0 +------------------------------------------------------------------------------- +require_grid no_such_grid_exists.gsb +accept 1 2 +expect 1 2 +tolerance 100 m +roundtrip 5 +expect 999 999 +------------------------------------------------------------------------------- +operation fake shift=0 +------------------------------------------------------------------------------- +accept 1 2 +expect 1 2 + diff --git a/conformance/src/test/resources/runner-fixtures/reset.gie b/conformance/src/test/resources/runner-fixtures/reset.gie new file mode 100644 index 0000000..9eb50a2 --- /dev/null +++ b/conformance/src/test/resources/runner-fixtures/reset.gie @@ -0,0 +1,38 @@ +# Synthetic fixture: what `operation` resets, and what it deliberately does not. +# The fake shifts x and y by `shift` forward and unshifts them inverse. +# +# block 0 widens the tolerance to 100 m and reverses the direction, then +# asserts twice -- the second pair proves both are sticky. +# block 1 the same 14.14 deviation with no tolerance of its own: the reset to +# 0.5 mm turns it into a failure. Direction-independent by design, so +# this pins the tolerance reset and nothing else. +# block 2 tolerance 1 m and no direction: passes only if the direction is back +# to forward, since an inverse would be 28.28 m out. +# block 3 no `accept` at all. Must reuse block 2's, because gie's operation() +# never clears T.a. + +------------------------------------------------------------------------------- +operation fake shift=10 +------------------------------------------------------------------------------- +tolerance 100 m +direction inverse +accept 1 2 +expect 1 2 +accept 5 6 +expect 5 6 +------------------------------------------------------------------------------- +operation fake shift=10 +------------------------------------------------------------------------------- +accept 3 4 +expect 3 4 +------------------------------------------------------------------------------- +operation fake shift=10 +------------------------------------------------------------------------------- +tolerance 1 m +accept 1 2 +expect 11 12 +------------------------------------------------------------------------------- +operation fake shift=0 +------------------------------------------------------------------------------- +expect 1 2 + diff --git a/conformance/src/test/resources/runner-fixtures/roundtrip.gie b/conformance/src/test/resources/runner-fixtures/roundtrip.gie new file mode 100644 index 0000000..79c9c72 --- /dev/null +++ b/conformance/src/test/resources/runner-fixtures/roundtrip.gie @@ -0,0 +1,48 @@ +# Synthetic fixture: roundtrip phasing against a deliberately lossy operation. +# +# The fake's forward is `2x + lossy`, its inverse is `x / 2`. One +# inverse-of-forward cycle therefore adds lossy/2, and the composition is NOT +# symmetric: forward-of-inverse would add lossy, so a runner that round-tripped +# in the wrong order measures exactly twice the correct residual. +# +# With lossy = 0.002 and n = 5 the residual is 5 * 0.001 = 0.005 per ordinate in +# x and in y, i.e. hypot(0.005, 0.005) = 7.0710678 mm. Blocks 2 and 3 bracket +# that between 7 mm and 8 mm, which rules out the 14.14 mm of the wrong order +# and the 1.41 mm of a single cycle. + +------------------------------------------------------------------------------- +operation fake lossy=0.002 +------------------------------------------------------------------------------- +accept 1000 2000 +roundtrip 5 1 mm +------------------------------------------------------------------------------- +operation fake lossy=0.002 +------------------------------------------------------------------------------- +accept 1000 2000 +roundtrip 5 1 m +------------------------------------------------------------------------------- +operation fake lossy=0.002 +------------------------------------------------------------------------------- +accept 1000 2000 +roundtrip 5 7 mm +------------------------------------------------------------------------------- +operation fake lossy=0.002 +------------------------------------------------------------------------------- +accept 1000 2000 +roundtrip 5 8 mm +------------------------------------------------------------------------------- +# No argument at all: 100 trips, which the test verifies by counting calls. +operation fake lossy=0.002 +------------------------------------------------------------------------------- +accept 1000 2000 +tolerance 1 m +roundtrip +------------------------------------------------------------------------------- +# The residual metric is selected by angular INPUT. The same lossy operation +# with a RADIANS left-hand side turns 0.005 into a geodesic ~43 km, which no +# metres tolerance can absorb -- whereas the Euclidean branch would have passed. +operation fake lossy=0.002 left=RADIANS +------------------------------------------------------------------------------- +accept 10 20 +roundtrip 5 1 m + diff --git a/conformance/sync-upstream.sh b/conformance/sync-upstream.sh new file mode 100755 index 0000000..b256442 --- /dev/null +++ b/conformance/sync-upstream.sh @@ -0,0 +1,192 @@ +#!/usr/bin/env bash +# +# sync-upstream.sh — re-vendor the PROJ conformance corpus and its test resources. +# +# Everything under +# conformance/src/test/resources/gie/ +# conformance/src/test/resources/gigs/ +# conformance/src/test/resources/proj-data/ +# is a verbatim copy of PROJ at the pinned revision below. Nothing in those +# directories is hand-edited; run this script to refresh them and regenerate +# the SHA-256 manifest that makes drift detectable. +# +# Usage: +# ./sync-upstream.sh [PATH_TO_PROJ_CHECKOUT] +# PROJ_DIR=/somewhere/PROJ ./sync-upstream.sh +# +set -euo pipefail + +# --------------------------------------------------------------------------- +# The pin. This is the single source of truth for "which PROJ are we tracking". +# --------------------------------------------------------------------------- +PROJ_REV=9.8.1 +PROJ_REV_SHA=f08fa86c478c4bbbf003b1ec751dd84aa6eca486 + +PROJ_DIR_DEFAULT=/Volumes/git/PROJ +PROJ_DIR="${1:-${PROJ_DIR:-$PROJ_DIR_DEFAULT}}" + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +RES="$SCRIPT_DIR/src/test/resources" +MANIFEST="$RES/gie-manifest.sha256" + +die() { printf 'sync-upstream.sh: %s\n' "$*" >&2; exit 1; } +note() { printf ' %s\n' "$*"; } + +# --------------------------------------------------------------------------- +# 0. Preconditions +# --------------------------------------------------------------------------- +[ -d "$PROJ_DIR/.git" ] || [ -f "$PROJ_DIR/.git" ] \ + || die "not a git checkout: $PROJ_DIR (pass the path as \$1 or set \$PROJ_DIR)" + +# The PROJ working tree is normally parked on master, hundreds of commits ahead +# of our target. We never read the working tree; every extraction below goes +# through the tag. Verify the tag still resolves to the SHA we pinned, and stop +# loudly if it does not — a moved tag means the corpus is not what we think. +ACTUAL_SHA="$(git -C "$PROJ_DIR" rev-parse --verify --quiet "${PROJ_REV}^{commit}" || true)" +[ -n "$ACTUAL_SHA" ] || die "revision '${PROJ_REV}' does not exist in $PROJ_DIR" +if [ "$ACTUAL_SHA" != "$PROJ_REV_SHA" ]; then + die "PIN MISMATCH: ${PROJ_REV}^{commit} in $PROJ_DIR is + $ACTUAL_SHA + but this script is pinned to + $PROJ_REV_SHA + Refusing to vendor. Either the tag moved or the checkout is a different repo." +fi + +# Portable SHA-256: macOS ships shasum/openssl, not GNU coreutils sha256sum. +# All three emit ""; the sed below normalises the binary-mode +# " *path" separator that sha256sum and `openssl -r` use into two spaces. +if command -v shasum >/dev/null 2>&1; then + SHA_CMD=(shasum -a 256) +elif command -v sha256sum >/dev/null 2>&1; then + SHA_CMD=(sha256sum) +elif command -v openssl >/dev/null 2>&1; then + SHA_CMD=(openssl dgst -sha256 -r) +else + die "no SHA-256 tool found (looked for shasum, sha256sum, openssl)" +fi + +echo "PROJ ${PROJ_REV} (${PROJ_REV_SHA})" +echo " from: $PROJ_DIR" +echo " into: $RES" + +# --------------------------------------------------------------------------- +# 1. The .gie corpus: test/gie -> gie/, test/gigs -> gigs/ +# +# Delete-then-extract, so a file deleted upstream also disappears here. +# +# NOT VENDORED: test/gie/tinshift_gpkg.gie and test/gie/tinshift_gpkg_network.gie. +# Those two exist only on PROJ master; they were added after 9.8.1 and are out of +# scope for this migration. They are absent from the archive below by +# construction — the assertion after the extraction keeps that honest, so if a +# future re-pin pulls them in, this script fails rather than silently widening +# the corpus. +# --------------------------------------------------------------------------- +echo +echo "[1/4] .gie corpus" +rm -rf "$RES/gie" "$RES/gigs" +mkdir -p "$RES/gie" "$RES/gigs" + +git -C "$PROJ_DIR" archive "$PROJ_REV" test/gie \ + | tar -x -C "$RES/gie" --strip-components=2 +git -C "$PROJ_DIR" archive "$PROJ_REV" test/gigs \ + | tar -x -C "$RES/gigs" --strip-components=2 + +for forbidden in tinshift_gpkg.gie tinshift_gpkg_network.gie; do + if [ -e "$RES/gie/$forbidden" ]; then + die "$forbidden was vendored; it is master-only and out of scope" + fi +done +note "gie/ $(find "$RES/gie" -type f | wc -l | tr -d ' ') files" +note "gigs/ $(find "$RES/gigs" -type f -name '*.gie' | wc -l | tr -d ' ') active" \ + "+ $(find "$RES/gigs" -type f -name '*.gie.failing' | wc -l | tr -d ' ') quarantined" + +# --------------------------------------------------------------------------- +# 2. Test resources: a faithful reproduction of the `for_tests` tree that +# 9.8.1:data/CMakeLists.txt builds. Upstream copies a *whitelist* into +# data/for_tests/ and points every CTest at it via PROJ_DATA, with the +# comment "so that we are not influenced by the presence of other grids". +# We mirror that layout under proj-data/ for the same reason. +# +# The one thing we do NOT reproduce is proj.db: upstream generates it from +# data/sql/*.sql at build time and copies it into for_tests/. It is ~10 MB +# and is not a checked-in artifact upstream, so it is not vendored here. +# --------------------------------------------------------------------------- +echo +echo "[2/4] proj-data resources (9.8.1:data/CMakeLists.txt for_tests whitelist)" +rm -rf "$RES/proj-data" +mkdir -p "$RES/proj-data" + +# 2a. DATA_FOR_TESTS + PROJ_INI: init dictionaries and the runtime ini, from +# the top of data/ into the root of for_tests/. +git -C "$PROJ_DIR" archive "$PROJ_REV" \ + data/GL27 data/nad27 data/nad83 data/ITRF2000 data/proj.ini \ + | tar -x -C "$RES/proj-data" --strip-components=1 + +# 2b. file(GLOB DATA_TESTS tests/*) — the whole of data/tests/, flat, preserving +# the tests/ subdirectory exactly as CMake does. +git -C "$PROJ_DIR" archive "$PROJ_REV" data/tests \ + | tar -x -C "$RES/proj-data" --strip-components=1 + +# 2c. DATA_FOR_TESTS_FROM_TESTS_SUBDIR — six grids promoted from tests/ to the +# for_tests/ root, where +nadgrids=/+geoidgrids= will find them by bare name. +for f in alaska BETA2007.gsb conus MD ntf_r93.gsb ntv1_can.dat; do + [ -f "$RES/proj-data/tests/$f" ] || die "expected data/tests/$f at $PROJ_REV" + cp "$RES/proj-data/tests/$f" "$RES/proj-data/$f" +done + +# 2d. Two promotions that are also renames. The in-tree files are reduced +# versions of the real grids, but the tests reference the production names. +cp "$RES/proj-data/tests/egm96_15_downsampled.gtx" "$RES/proj-data/egm96_15.gtx" +cp "$RES/proj-data/tests/ntv2_0_downsampled.gsb" "$RES/proj-data/ntv2_0.gsb" + +# 2e. The deliberately awkward path. Upstream's comment: "test_cs2cs_datumfile +# has a special case". The space in the directory name is the point of the +# fixture — it exercises path handling — so keep it verbatim. +mkdir -p "$RES/proj-data/dir with space" +cp "$RES/proj-data/tests/conus" "$RES/proj-data/dir with space/myconus" + +note "proj-data/ $(find "$RES/proj-data" -type f | wc -l | tr -d ' ') files" + +# --------------------------------------------------------------------------- +# 3. Manifest of every vendored file, so drift is a diff and not a surprise. +# --------------------------------------------------------------------------- +echo +echo "[3/4] manifest" +rm -f "$MANIFEST" +{ + printf '# SHA-256 of every file vendored from PROJ %s (%s)\n' \ + "$PROJ_REV" "$PROJ_REV_SHA" + printf '# Generated by conformance/sync-upstream.sh. Do not edit by hand.\n' + printf '# Paths are relative to conformance/src/test/resources/.\n' + ( + cd "$RES" + find gie gigs proj-data -type f -print0 \ + | LC_ALL=C sort -z \ + | xargs -0 "${SHA_CMD[@]}" \ + | sed 's/ \*/ /' + ) +} > "$MANIFEST" +note "$(grep -cv '^#' "$MANIFEST" | tr -d ' ') hashed files -> ${MANIFEST#"$SCRIPT_DIR"/}" + +# --------------------------------------------------------------------------- +# 4. Summary +# --------------------------------------------------------------------------- +summarise() { + local dir="$1" label="$2" count bytes + count=$(find "$RES/$dir" -type f | wc -l | tr -d ' ') + bytes=$(find "$RES/$dir" -type f -print0 | xargs -0 cat | wc -c | tr -d ' ') + printf ' %-28s %5s files %12s bytes\n' "$label" "$count" "$bytes" +} + +echo +echo "[4/4] summary" +summarise gie "gie/" +summarise gigs "gigs/" +summarise proj-data "proj-data/" +summarise proj-data/tests " of which proj-data/tests/" +printf ' %-28s %5s files %12s bytes\n' "TOTAL" \ + "$(cd "$RES" && find gie gigs proj-data -type f | wc -l | tr -d ' ')" \ + "$(cd "$RES" && find gie gigs proj-data -type f -print0 | xargs -0 cat | wc -c | tr -d ' ')" +echo +echo "Done. Licence obligations for this corpus are in" +echo " ${RES#"$SCRIPT_DIR"/}/NOTICE-gie.md — read it before redistributing." diff --git a/core/pom.xml b/core/pom.xml index 7e6d942..bca6e1a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -2,19 +2,38 @@ 4.0.0 - org.locationtech.proj4j - proj4j-modules + io.github.emilevictor.neoproj4j + neoproj4j-modules 1.3.1-SNAPSHOT - org.locationtech.proj4j - proj4j + io.github.emilevictor.neoproj4j + neoproj4j bundle - Proj4J - Java port of the Proj.4 library for coordinate reprojection + neoProj4J + neoProj4J - a fork of LocationTech Proj4J brought to PROJ 9.8.1 parity. Java port of + the PROJ library for coordinate reprojection. + + + https://github.com/emilevictor/neoProj4J + + https://github.com/emilevictor/neoProj4J + scm:git:https://github.com/emilevictor/neoProj4J.git + scm:git:git@github.com:emilevictor/neoProj4J.git + HEAD + + + false + UTF-8 + org.locationtech.proj4j yyyyMMddHHmm ${maven.build.timestamp} @@ -22,8 +41,8 @@ - org.locationtech.proj4j - proj4j-epsg + io.github.emilevictor.neoproj4j + neoproj4j-epsg ${project.version} test diff --git a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java index ad20219..249a6a7 100755 --- a/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java +++ b/core/src/main/java/org/locationtech/proj4j/BasicCoordinateTransform.java @@ -16,9 +16,11 @@ package org.locationtech.proj4j; import java.util.Objects; -import java.util.stream.DoubleStream; +import java.util.concurrent.atomic.AtomicReference; +import org.locationtech.proj4j.bulk.TransformStatus; import org.locationtech.proj4j.datum.*; +import org.locationtech.proj4j.proj.Projection; import org.locationtech.proj4j.util.ProjectionMath; /** @@ -47,10 +49,24 @@ * Information about the transformation procedure is pre-computed * and cached in this object for efficient computation. * + *

The bulk path

+ * + *

This class also implements {@link BulkCoordinateTransform}, which transforms many points per + * call over {@code double[]} buffers with no allocation per point. The bulk methods are not + * a loop around {@link #transform(ProjCoordinate, ProjCoordinate)}: everything that is constant + * for the transform's lifetime is resolved in the constructor and read from a {@code final} field, + * so the per-point work is arithmetic, two projection calls and the array access. Results are + * bit-for-bit identical to N single-point calls, and the per-point failure classification is + * identical because the same code raises it. See {@link BulkCoordinateTransform} for the contract + * and {@code org.locationtech.proj4j.bulk.TransformStatus} for the per-point codes. + * * @author Martin Davis * @see CoordinateTransformFactory + * @see BulkCoordinateTransform */ -public class BasicCoordinateTransform implements CoordinateTransform { +public class BasicCoordinateTransform implements CoordinateTransform, BulkCoordinateTransform { + + private static final long serialVersionUID = 2134853818131680020L; private final CoordinateReferenceSystem srcCRS; private final CoordinateReferenceSystem tgtCRS; @@ -60,30 +76,196 @@ public class BasicCoordinateTransform implements CoordinateTransform { private final boolean doForwardProjection; private final boolean doDatumTransform; private final boolean transformViaGeocentric; - private GeocentricConverter srcGeoConv; - private GeocentricConverter tgtGeoConv; + + /** + * The geocentric converters. + * + *

{@code final} on purpose, and it was not before

+ * + *

They are written exactly once, in the constructor, but the constructor used to assign + * them and then possibly null them again, which forced them to be non-final — and a non-final + * field on a path called once per vertex is a field the JIT must reload after every + * call it cannot prove side-effect-free, which on this path is all of them. Deciding the + * values in locals and assigning once removes ~2 reloads per point at no behavioural cost. + */ + private final GeocentricConverter srcGeoConv; + private final GeocentricConverter tgtGeoConv; + + /** What to do with a per-coordinate failure; never null. */ + private final DomainErrorPolicy domainErrorPolicy; + + /** + * Whether the source projection can actually be inverted. Precomputed because it is a + * property of the CRS pair, not of the coordinate, and {@link #transform} is called once per + * row. + */ + private final boolean srcInverseAvailable; + + // ------------------------------------------------------------------------------------------ + // Hoisted invariants: everything reference/performance.md's cost table lists as recomputed + // per point although constant for the transform's lifetime. Read by the bulk path only, so + // the single-point path stays byte-for-byte the 1.4.3 body plus its fail-closed checks. + // + // Hoisting is arithmetically neutral: each field below is the value of a *pure predicate or + // accessor* the per-point path would otherwise re-evaluate, so bulk output is bitwise equal to + // the single-point output. What it is NOT neutral to is mutation of the CRSs after this + // constructor runs -- notably parser/Proj4Parser's mutation of the global Datum singletons, + // and Datum.setGrids. Those are defects being fixed elsewhere; a transform is not documented + // as tracking edits to the CRSs it was built from, and the single-point path is unchanged for + // any caller who depends on that. + // ------------------------------------------------------------------------------------------ + + /** {@code srcCRS.getProjection()}. Null only for the unusable {@code CS_GEO} sentinel. */ + private final Projection srcProj; + /** {@code tgtCRS.getProjection()}. Null only for the unusable {@code CS_GEO} sentinel. */ + private final Projection tgtProj; + + private final AxisOrder srcAxes; + private final AxisOrder tgtAxes; + + /** + * Whether the axis order is the default east/north/up, in which case {@code toENU} and + * {@code fromENU} are an identity copy of all three ordinates and can be skipped. + *

+ * Skipping is bitwise-safe precisely because the default is a copy: {@code Easting}, + * {@code Northing} and {@code Up} return the ordinate unchanged, with no arithmetic, so + * {@code -0.0} and every {@code NaN} payload survive. It would not be safe for a reversed axis, + * where {@code fromENU} negates — and negation is exactly what turns {@code +0.0} into + * {@code -0.0}. Hence the check, rather than an unconditional skip. + */ + private final boolean srcAxesEnu; + private final boolean tgtAxesEnu; + + /** + * The prime-meridian offsets, in radians, inlined out of + * {@link PrimeMeridian#toGreenwich(ProjCoordinate)} and + * {@link PrimeMeridian#fromGreenwich(ProjCoordinate)}. + *

+ * The add is never elided when the offset is zero, and that is not an oversight: + * {@code -0.0 + 0.0} is {@code +0.0}, so skipping the addition would change the sign of zero + * for a longitude of exactly {@code -0.0} — a value that occurs at the prime meridian on real + * data, and one that {@link Double#doubleToRawLongBits(double)} distinguishes. The single-point + * path performs the addition unconditionally, so the bulk path must too. + */ + private final double srcPmOffset; + private final double tgtPmOffset; + + private final Datum srcDatum; + private final Datum tgtDatum; + + /** + * Whether {@code datumTransform} would return from one of its early exits for every point. + *

+ * Collapses the two {@code getTransformType()} calls and the {@code Datum.isEqual} at the top + * of {@link #datumTransform(ProjCoordinate)} into one boolean. {@code Datum.isEqual} is the + * expensive one and is about to become far more expensive: on the gridshift branch it descends + * to {@code Arrays.equals} over the grid's node array — O(grid size) per point, tens of + * millions of comparisons for a CONUS-sized grid. That is masked today only because + * {@code setGrids(null)} leaves the grid list empty, so it is a latent disaster that fixing the + * grid resolution will expose. Evaluating it once per transform is this file's half of the fix; + * interning the resolved grid list so the comparison short-circuits on reference identity is + * the other half and belongs in {@code datum/}. + */ + private final boolean datumTransformIsNoOp; + + private final boolean srcGridShift; + private final boolean tgtGridShift; + private final boolean srcHasToWgs84; + private final boolean tgtHasToWgs84; + + /** + * The resolved grid lists, hoisted out of the per-point loop. Read only by + * {@link #datumStage(ProjCoordinate)}, i.e. only by the bulk API. + * + *

{@code Datum.shift} resolves its grid list on every call. For {@code NAD27} and + * {@code potsdam} — the datums that declare their shift as a {@code +nadgrids=} string rather + * than carrying a resolved list — that resolution is two {@code volatile} reads, so it is two + * acquire loads per point in the innermost loop of a batch. {@link Datum#gridArray()} does it + * once, here. + * + *

This freezes the grid list at construction, and that is a tightening, not a + * loosening. {@link #srcGridShift} and {@link #tgtGridShift} — the booleans that decide + * whether a grid shift happens at all — have always been frozen here, four lines below. So a + * transform constructed while a resolver was registered and used after it was removed already + * decided "shift", and would then have resolved an empty list and shifted nothing, + * silently. Freezing both halves together removes that disagreement. The single-point path + * ({@link #datumTransform(ProjCoordinate)}) is untouched and still resolves per point, + * deliberately: it is kept byte-identical to 1.4.3. + * + *

{@code null} whenever the corresponding {@code …GridShift} flag is false, and + * {@code Grid.shift(Grid[], …)} treats null as a no-op, so a stale flag cannot dereference it. + */ + private final Grid[] srcGrids; + private final Grid[] tgtGrids; + + /** + * The bulk path's scratch coordinate, pooled so that a batch allocates nothing. + * + *

Why a pool and not a field, a {@code ThreadLocal}, or an allocation per batch

+ * + *

A plain field would make this class unsafe to share across threads, which is the one + * property the consumer most depends on — a single cached transform is used by every executor + * thread. A {@code ThreadLocal} would be thread-safe but leaves a live entry in every thread + * that ever touched the transform, which is a poor trade for 40 bytes. Allocating one per batch + * would be correct and nearly free (40 bytes amortised over 100,000 points is 4e-4 B/point), + * but the bulk allocation contract is normative and stated as zero, and "nearly zero" is how a + * zero-allocation guarantee stops being checkable. + * + *

So: a one-slot lock-free pool. A batch takes the scratch, uses it, and puts it back. Two + * concurrent batches simply mean the second allocates and one of the two returns are dropped — + * correct, bounded (the field holds at most one object) and self-healing, with no cleanup hook. + * Steady state on any number of threads is zero allocation per batch. + */ + private final AtomicReference scratchPool = + new AtomicReference(); /** * Creates a transformation from a source {@link CoordinateReferenceSystem} - * to a target one. + * to a target one, failing closed on a per-coordinate error. * * @param srcCRS the source CRS to transform from * @param tgtCRS the target CRS to transform to */ public BasicCoordinateTransform(CoordinateReferenceSystem srcCRS, CoordinateReferenceSystem tgtCRS) { + this(srcCRS, tgtCRS, DomainErrorPolicy.THROW); + } + + /** + * Creates a transformation from a source {@link CoordinateReferenceSystem} + * to a target one. + * + * @param srcCRS the source CRS to transform from + * @param tgtCRS the target CRS to transform to + * @param domainErrorPolicy what {@link #transform} does with a per-coordinate failure; null + * is treated as {@link DomainErrorPolicy#THROW} + * @since 1.5.0 + */ + public BasicCoordinateTransform(CoordinateReferenceSystem srcCRS, + CoordinateReferenceSystem tgtCRS, + DomainErrorPolicy domainErrorPolicy) { this.srcCRS = srcCRS; this.tgtCRS = tgtCRS; + this.domainErrorPolicy = + domainErrorPolicy == null ? DomainErrorPolicy.THROW : domainErrorPolicy; // compute strategy for transformation at initialization time, to make transformation more efficient // this may include precomputing sets of parameters doInverseProjection = (srcCRS != CoordinateReferenceSystem.CS_GEO); doForwardProjection = (tgtCRS != CoordinateReferenceSystem.CS_GEO); + + srcInverseAvailable = !doInverseProjection + || inverseAvailable(srcCRS.getProjection()); + doDatumTransform = doInverseProjection && doForwardProjection && srcCRS.getDatum() != tgtCRS.getDatum(); boolean geocentric = false; + // Decided in locals so the two fields can be final. Behaviour is unchanged; see the + // fields' javadoc for why final matters on a per-vertex path. + GeocentricConverter srcConv = null; + GeocentricConverter tgtConv = null; if (doDatumTransform) { @@ -92,8 +274,8 @@ public BasicCoordinateTransform(CoordinateReferenceSystem srcCRS, || tgtCRS.getDatum().hasTransformToWGS84(); if (geocentric) { - srcGeoConv = new GeocentricConverter(srcCRS.getDatum().getEllipsoid()); - tgtGeoConv = new GeocentricConverter(tgtCRS.getDatum().getEllipsoid()); + srcConv = new GeocentricConverter(srcCRS.getDatum().getEllipsoid()); + tgtConv = new GeocentricConverter(tgtCRS.getDatum().getEllipsoid()); int srcTransformType = srcCRS.getDatum().getTransformType(); int tgtTransformType = tgtCRS.getDatum().getTransformType(); @@ -101,19 +283,19 @@ public BasicCoordinateTransform(CoordinateReferenceSystem srcCRS, if (srcTransformType == Datum.TYPE_GRIDSHIFT || tgtTransformType == Datum.TYPE_GRIDSHIFT) { if (srcTransformType == Datum.TYPE_GRIDSHIFT) { - srcGeoConv.overrideWithWGS84Params(); + srcConv.overrideWithWGS84Params(); } if (tgtTransformType == Datum.TYPE_GRIDSHIFT) { - tgtGeoConv.overrideWithWGS84Params(); + tgtConv.overrideWithWGS84Params(); } // After WGS84 params override, check if geocentric transform is still required // https://github.com/OSGeo/PROJ/blob/5.2.0/src/pj_transform.c#L892 - if(srcGeoConv.isEqual(tgtGeoConv)) { + if(srcConv.isEqual(tgtConv)) { geocentric = false; - srcGeoConv = null; - tgtGeoConv = null; + srcConv = null; + tgtConv = null; } } @@ -122,6 +304,120 @@ public BasicCoordinateTransform(CoordinateReferenceSystem srcCRS, } transformViaGeocentric = geocentric; + srcGeoConv = srcConv; + tgtGeoConv = tgtConv; + + // --------------------------------------------------------------------------------------- + // Hoist the invariants. Every assignment below is an accessor result or a pure predicate + // over the two CRSs, so reading it in a loop instead of recomputing it per point cannot + // change a single bit of output. + // + // Tolerant of the CoordinateReferenceSystem.CS_GEO sentinel, whose projection and datum are + // both null: construction with it has always succeeded and transform() has always failed on + // it, and neither may change here. + // --------------------------------------------------------------------------------------- + srcProj = srcCRS.getProjection(); + tgtProj = tgtCRS.getProjection(); + + srcAxes = srcProj == null ? null : srcProj.getAxisOrder(); + tgtAxes = tgtProj == null ? null : tgtProj.getAxisOrder(); + srcAxesEnu = srcAxes != null && AxisOrder.ENU.equals(srcAxes); + tgtAxesEnu = tgtAxes != null && AxisOrder.ENU.equals(tgtAxes); + + srcPmOffset = srcProj == null ? 0.0 + : srcProj.getPrimeMeridian().getOffsetFromGreenwich(); + tgtPmOffset = tgtProj == null ? 0.0 + : tgtProj.getPrimeMeridian().getOffsetFromGreenwich(); + + srcDatum = srcCRS.getDatum(); + tgtDatum = tgtCRS.getDatum(); + + if (doDatumTransform) { + final int srcType = srcDatum.getTransformType(); + final int tgtType = tgtDatum.getTransformType(); + + // The two early exits at the top of datumTransform, in the order it applies them: the + // unknown-datum check first (PROJ checks it unconditionally and before the + // identical-datums short cut), then the identical-datums short cut. + datumTransformIsNoOp = srcType == Datum.TYPE_UNKNOWN + || tgtType == Datum.TYPE_UNKNOWN + || srcDatum.isEqual(tgtDatum); + + srcGridShift = srcType == Datum.TYPE_GRIDSHIFT; + tgtGridShift = tgtType == Datum.TYPE_GRIDSHIFT; + srcHasToWgs84 = srcDatum.hasTransformToWGS84(); + tgtHasToWgs84 = tgtDatum.hasTransformToWGS84(); + srcGrids = srcGridShift ? srcDatum.gridArray() : null; + tgtGrids = tgtGridShift ? tgtDatum.gridArray() : null; + } else { + // datumTransform is never called, so these are never read. Give them the values that + // make the bulk datum stage a no-op regardless. + datumTransformIsNoOp = true; + srcGridShift = false; + tgtGridShift = false; + srcHasToWgs84 = false; + tgtHasToWgs84 = false; + srcGrids = null; + tgtGrids = null; + } + } + + /** + * Whether a projection can actually be inverted. + * + *

Why this does not simply return {@code hasInverse()}

+ * + *

Because {@code hasInverse()} is a hand-maintained declaration, it was read + * nowhere in {@code core/src/main} before 1.5.0, and an unread boolean declared 66 times + * across 102 classes drifts. Gating on it alone is wrong in both directions, and each + * direction was found by a test rather than by reading: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
where {@code hasInverse()} disagrees with reality
class{@code hasInverse()}{@code projectInverse} overridetruth
{@code KrovakProjection}absent, so {@code false}yesinvertible — EPSG:2065 and EPSG:5514 round-trip
{@code NewZealandMapGridProjection}absent, so {@code false}yesinvertible — EPSG:27200 round-trips
{@code LandsatProjection}{@code true}no: its method takes {@code Point2D.Double} and overrides nothingnot invertible
{@code LongLatProjection}absent, so {@code false}noinvertible — its inverse is the DTR multiply in + * {@code Projection.inverseProjectRadians}
{@code PlateCarreeProjection}, {@code LinearProjection}{@code true}noinvertible — the base identity really is their inverse, because their + * forward is the base identity too
+ * + *

So the question asked is "is there an implementation", answered against the class + * hierarchy, with {@code hasInverse()} and {@link Projection#isGeographic()} kept as the + * affirmative shortcuts they are reliable for. Had this gate keyed on {@code hasInverse()} + * alone it would have rejected three working CRSs — Krovak twice and NZMG once — which is + * the same class of mistake as the defect it exists to fix, only louder. + * + *

Reflection, once per {@code BasicCoordinateTransform}, never per coordinate. The result + * is cached in {@link #srcInverseAvailable}. + * + * @param p the projection to interrogate + * @return true if inverse-projecting through {@code p} computes something + */ + private static boolean inverseAvailable(Projection p) { + if (p.hasInverse() || p.isGeographic()) { + return true; + } + for (Class c = p.getClass(); c != null && c != Projection.class; + c = c.getSuperclass()) { + try { + c.getDeclaredMethod("projectInverse", + double.class, double.class, ProjCoordinate.class); + return true; + } catch (NoSuchMethodException notHere) { + // keep walking up + } + } + return false; } @Override @@ -135,9 +431,26 @@ public CoordinateReferenceSystem getTargetCRS() { } + /** + * The policy this transform applies to a per-coordinate failure. + * + * @return the policy; never null + * @since 1.5.0 + */ + public DomainErrorPolicy getDomainErrorPolicy() { + return domainErrorPolicy; + } + /** * Transforms a coordinate from the source {@link CoordinateReferenceSystem} * to the target one. + *

+ * The {@code @throws} below has been on this method since 1.0 and was not honoured. + * A computation error was reported as a coordinate: the input unchanged, a {@code NaN} + * ordinate, a pole, or the target projection's false easting/northing. It is honoured now, + * under {@link DomainErrorPolicy#THROW}; a caller that needs the old silence can ask for + * {@link DomainErrorPolicy#RETURN_NAN} and get {@code NaN} in every ordinate instead — + * one detectable sentinel in place of four undetectable ones. * * @param src the input coordinate to be transformed * @param tgt the transformed coordinate @@ -148,11 +461,59 @@ public CoordinateReferenceSystem getTargetCRS() { @Override public ProjCoordinate transform(ProjCoordinate src, ProjCoordinate tgt) throws Proj4jException { + if (domainErrorPolicy == DomainErrorPolicy.THROW) { + return transformClosed(src, tgt); + } + try { + return transformClosed(src, tgt); + } catch (CrsTransformException e) { + // Only the per-coordinate group is eligible: a CRS that cannot be built, an + // operation with no inverse, and an environment failure are all properties of the + // operation, and reporting one of those as NaN on every row of a four-million-row + // dataset hides a planning-time defect four million times. + if (!e.cause().isCoordinateError()) { + throw e; + } + tgt.x = Double.NaN; + tgt.y = Double.NaN; + tgt.z = Double.NaN; + return tgt; + } + } + + /** + * The fail-closed transform: the 1.4.3 body, plus the inverse-availability gate and the + * output postcondition. + */ + private ProjCoordinate transformClosed(ProjCoordinate src, ProjCoordinate tgt) { + // Read before setValue: callers are allowed to pass the same object as both arguments -- + // this method does that internally -- so by the time the postcondition runs, src may + // already have been overwritten. Needed for the failure message and for nanIn. + final double srcX = src.x; + final double srcY = src.y; + // NaN in, NaN out, as a *result*. See Projection.projectRadians' javadoc: the gie + // comparator scores NaN-got against NaN-expected as deviation 0, i.e. a pass, so rows + // exist that assert this. Only a non-finite result that arose from *finite* input is a + // computation failure. + final boolean nanIn = Double.isNaN(srcX) || Double.isNaN(srcY); + // The absent-height sentinel, captured before setValue for the same aliasing reason. See + // the restore below the datum stage, and vertical/InventedHeightTest for the measurement. + final boolean noHeightIn = Double.isNaN(src.z); tgt.setValue(src); srcCRS.getProjection().getAxisOrder().toENU(tgt); // NOTE: this method may be called many times, so needs to be as efficient as possible if (doInverseProjection) { + if (!srcInverseAvailable) { + // 1.4.3 called inverseProjectRadians unconditionally, and the base + // Projection.projectInverse was an identity, so 33 forward-only projections used + // as a source CRS returned the projected input as lon/lat radians -- a plausible + // wrong answer, then datum-shifted and re-projected as if it were geographic. + throw new CrsTransformException(ErrorCause.NO_INVERSE_AVAILABLE, + "source CRS " + srcCRS.getName() + " uses projection " + + srcCRS.getProjection() + ", which has no inverse; it can be a " + + "transformation target but not a source"); + } // inverse project to geographic srcCRS.getProjection().inverseProjectRadians(tgt, tgt); } @@ -165,6 +526,18 @@ public ProjCoordinate transform(ProjCoordinate src, ProjCoordinate tgt) if (doDatumTransform) { datumTransform(tgt); + if (noHeightIn) { + // +proj=push +v_3 / +proj=pop +v_3. The geocentric leg is the only stage that can + // invent a height: GeocentricConverter substitutes 0 for an absent one going in + // (faithful to PROJ's fwd.cpp:47-51, which has no absent state to preserve) and + // writes the computed height back out. PROJ's own pipeline for a 2D operation + // brackets exactly this leg with push/pop and returns the caller's third ordinate + // byte for byte -- so for ProjCoordinate's NaN sentinel, "leave it untouched" and + // "propagate NaN" are the same instruction. Restoring here is sufficient: the + // remaining stages are PrimeMeridian (x only), Projection (does not read or write + // z at all) and AxisOrder (copies or negates it). + tgt.z = Double.NaN; + } } tgtCRS.getProjection().getPrimeMeridian().fromGreenwich(tgt); @@ -176,6 +549,19 @@ public ProjCoordinate transform(ProjCoordinate src, ProjCoordinate tgt) tgtCRS.getProjection().getAxisOrder().fromENU(tgt); + // The end-to-end postcondition. Projection.projectRadians and inverseProjectRadians each + // check their own kernel, but the datum stage between them does not: a grid shift that + // falls outside its extent, a geocentric round trip on a degenerate ellipsoid, or a + // +towgs84 with a NaN parameter can all inject a non-finite value after the last + // projection check. This is the single place that covers all of them, and it is the + // method whose javadoc promised it. + if (!nanIn && !tgt.hasValidXandYOrdinates()) { + throw new CrsTransformException(ErrorCause.NUMERICAL_FAILURE, + "transform " + srcCRS.getName() + " -> " + tgtCRS.getName() + + " of (" + srcX + ", " + srcY + ") returned a non-finite " + + "coordinate (" + tgt.x + ", " + tgt.y + ")"); + } + return tgt; } @@ -186,28 +572,34 @@ public ProjCoordinate transform(ProjCoordinate src, ProjCoordinate tgt) * @param pt the point containing the input and output values */ private void datumTransform(ProjCoordinate pt) { - /* -------------------------------------------------------------------- */ - /* Short cut if the datums are identical. */ - /* -------------------------------------------------------------------- */ int srcCrsDatumTransformType = srcCRS.getDatum().getTransformType(); int tgtCrsDatumTransformType = tgtCRS.getDatum().getTransformType(); - if (srcCRS.getDatum().isEqual(tgtCRS.getDatum())) { - return; - } - - if (srcCRS.getDatum().getEllipsoid().isEqual(tgtCRS.getDatum().getEllipsoid())) { - if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN) { - return; - } - if (tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { - return; - } - } - if (srcCrsDatumTransformType == Datum.TYPE_WGS84 && tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { + /* -------------------------------------------------------------------- */ + /* We cannot do any meaningful datum transformation if either */ + /* the source or destination are of an unknown datum type */ + /* (ie. only a +ellps declaration, no +datum). */ + /* */ + /* https://github.com/OSGeo/PROJ/blob/5.2.0/src/pj_transform.c#L835 */ + /* checks this UNCONDITIONALLY and BEFORE the identical-datums */ + /* short cut. proj4j used to nest it inside an ellipsoid-equality */ + /* guard and put it after that short cut, so a bare-+ellps pair */ + /* with *differing* ellipsoids fell through to a geocentric round */ + /* trip that PROJ skips entirely. That injected a spurious */ + /* latitude shift and a spurious z; it was masked for years by the */ + /* Datum.isEqual self-comparison typo, one bug cancelling another. */ + /* The two TYPE_WGS84/TYPE_UNKNOWN pair tests that used to follow */ + /* the short cut are subsumed by this check and have been removed. */ + /* -------------------------------------------------------------------- */ + if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN + || tgtCrsDatumTransformType == Datum.TYPE_UNKNOWN) { return; } - if (srcCrsDatumTransformType == Datum.TYPE_UNKNOWN && tgtCrsDatumTransformType == Datum.TYPE_WGS84) { + + /* -------------------------------------------------------------------- */ + /* Short cut if the datums are identical. */ + /* -------------------------------------------------------------------- */ + if (srcCRS.getDatum().isEqual(tgtCRS.getDatum())) { return; } @@ -253,4 +645,491 @@ private void datumTransform(ProjCoordinate pt) { } } + // ============================================================================================== + // BulkCoordinateTransform + // + // The batch shape. Every method here is: validate once, take the pooled scratch once, then a + // loop whose body is address arithmetic, two projection calls and the hoisted stages. Nothing + // in the loop allocates, nothing in the loop calls a getter, and nothing in the loop constructs + // an exception unless a point actually fails. + // ============================================================================================== + + @Override + public int transform2D(double[] xy, int offset, int numPts, int stride, byte[] status) { + checkRange(xy, "xy", offset, numPts, stride, 2); + checkStatus(status, numPts); + if (numPts == 0) { + return 0; + } + requireRunnableBatch(); + + final boolean failFast = failFast(status); + final ProjCoordinate c = acquireScratch(); + int failures = 0; + try { + for (int i = 0, k = offset; i < numPts; i++, k += stride) { + final byte st = transformPoint(xy[k], xy[k + 1], Double.NaN, c, failFast); + if (st == TransformStatus.OK) { + xy[k] = c.x; + xy[k + 1] = c.y; + } else { + xy[k] = Double.NaN; + xy[k + 1] = Double.NaN; + failures++; + } + if (status != null) { + status[i] = st; + } + } + } finally { + releaseScratch(c); + } + return failures; + } + + @Override + public int transform3D(double[] xyz, int offset, int numPts, int stride, byte[] status) { + checkRange(xyz, "xyz", offset, numPts, stride, 3); + checkStatus(status, numPts); + if (numPts == 0) { + return 0; + } + requireRunnableBatch(); + + final boolean failFast = failFast(status); + final ProjCoordinate c = acquireScratch(); + int failures = 0; + try { + for (int i = 0, k = offset; i < numPts; i++, k += stride) { + final byte st = transformPoint(xyz[k], xyz[k + 1], xyz[k + 2], c, failFast); + if (st == TransformStatus.OK) { + xyz[k] = c.x; + xyz[k + 1] = c.y; + xyz[k + 2] = c.z; + } else { + xyz[k] = Double.NaN; + xyz[k + 1] = Double.NaN; + xyz[k + 2] = Double.NaN; + failures++; + } + if (status != null) { + status[i] = st; + } + } + } finally { + releaseScratch(c); + } + return failures; + } + + @Override + public int transform2D(double[] src, int srcOff, int srcStride, + double[] dst, int dstOff, int dstStride, int numPts, byte[] status) { + checkRange(src, "src", srcOff, numPts, srcStride, 2); + checkRange(dst, "dst", dstOff, numPts, dstStride, 2); + checkStatus(status, numPts); + if (numPts == 0) { + return 0; + } + requireRunnableBatch(); + + final boolean failFast = failFast(status); + // Aliasing: read-before-write makes a point safe against itself, so the only hazard is + // overwriting a point that has not been read yet. Direction is chosen once, per batch. + final boolean backwards = + iterateBackwards(src, srcOff, srcStride, dst, dstOff, dstStride, numPts); + final int from = backwards ? numPts - 1 : 0; + final int end = backwards ? -1 : numPts; + final int step = backwards ? -1 : 1; + + final ProjCoordinate c = acquireScratch(); + int failures = 0; + try { + for (int i = from; i != end; i += step) { + final int sk = srcOff + i * srcStride; + final int dk = dstOff + i * dstStride; + final byte st = transformPoint(src[sk], src[sk + 1], Double.NaN, c, failFast); + if (st == TransformStatus.OK) { + dst[dk] = c.x; + dst[dk + 1] = c.y; + } else { + dst[dk] = Double.NaN; + dst[dk + 1] = Double.NaN; + failures++; + } + if (status != null) { + status[i] = st; + } + } + } finally { + releaseScratch(c); + } + return failures; + } + + @Override + public int transform(double[] x, double[] y, double[] z, int offset, int numPts, + byte[] status) { + // Struct-of-arrays is stride 1 in three arrays, so the range check is the interleaved one + // with a width of one ordinate. + checkRange(x, "x", offset, numPts, 1, 1); + checkRange(y, "y", offset, numPts, 1, 1); + if (z != null) { + checkRange(z, "z", offset, numPts, 1, 1); + } + checkStatus(status, numPts); + if (numPts == 0) { + return 0; + } + requireRunnableBatch(); + + final boolean failFast = failFast(status); + final boolean hasZ = z != null; + final ProjCoordinate c = acquireScratch(); + int failures = 0; + try { + for (int i = 0, k = offset; i < numPts; i++, k++) { + final byte st = + transformPoint(x[k], y[k], hasZ ? z[k] : Double.NaN, c, failFast); + if (st == TransformStatus.OK) { + x[k] = c.x; + y[k] = c.y; + if (hasZ) { + z[k] = c.z; + } + } else { + x[k] = Double.NaN; + y[k] = Double.NaN; + if (hasZ) { + z[k] = Double.NaN; + } + failures++; + } + if (status != null) { + status[i] = st; + } + } + } finally { + releaseScratch(c); + } + return failures; + } + + /** + * The whole per-point pipeline, on one scratch coordinate, with every invariant read from a + * field instead of recomputed. + * + *

Why this is bit-for-bit the single-point path

+ * + *

Compare against {@link #transformClosed(ProjCoordinate, ProjCoordinate)} stage by stage. + * The arithmetic is not merely equivalent, it is the same expressions in the same order on the + * same object; what differs is only how the operands were found: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
single-point stage to bulk stage
single pointherewhy bitwise
{@code tgt.setValue(src)}three field storesa copy either way
{@code srcCRS.getProjection().getAxisOrder().toENU(tgt)}skipped when the order is ENU, else the same callENU's three axes return the ordinate unchanged with no arithmetic, so the call is an + * identity copy. Not skipped for a reversed axis, where it negates.
{@code inverseProjectRadians(tgt, tgt)}the same callsame method, same object
{@code getPrimeMeridian().toGreenwich(tgt)}{@code c.x += srcPmOffset}that method is {@code coord.x += offset}. Never elided at offset 0, because + * {@code -0.0 + 0.0} is {@code +0.0}.
{@code datumTransform(tgt)}{@link #datumStage(ProjCoordinate)}same operations, same order; only the predicates guarding them are hoisted
{@code getPrimeMeridian().fromGreenwich(tgt)}{@code c.x -= tgtPmOffset}as above
{@code projectRadians(tgt, tgt)}the same callsame method
{@code getAxisOrder().fromENU(tgt)}skipped when ENU, else the same callas above
{@code !tgt.hasValidXandYOrdinates()}{@code (c.x - c.x) != 0.0}{@code NaN-NaN}, {@code Inf-Inf} and {@code -Inf+Inf} are all {@code NaN}; + * {@code finite-finite} is {@code 0.0}. Exactly {@code !isFinite}, in one FP op with no + * call and no bit extraction.
+ * + *

Failure classification is identical because the same code raises it

+ * + *

Nothing here re-derives what counts as a failure. The projections' own domain checks and + * finiteness postconditions run untouched and throw exactly what they throw for a single point; + * this method catches, reads {@link Proj4jException#cause()} and maps it to a status byte. So + * {@code NaN} input still propagates as a result, a finite out-of-domain input is still an + * error, and finite input yielding a non-finite output is still an error — because those three + * decisions are made in {@code Projection} and in the postcondition below, not here. + * + *

A cause that is not per-coordinate is rethrown: it is a property of the operation, + * and answering it with a status byte on every row would report a planning-time defect once per + * vertex. + * + *

The catch is free on the success path — a JVM exception table costs nothing when nothing + * throws — but the throw is not: a kernel that rejects a coordinate still fills in a + * stack trace, at roughly 1-10 µs. Removing that needs errno-style returns inside the + * ~100 projection classes, which is a separate change to {@code proj/}. + * + * @param sx the source x ordinate, as the caller supplied it + * @param sy the source y ordinate + * @param sz the source height, or {@code NaN} for "no height" + * @param c the scratch coordinate; holds the result on return + * @param failFast whether to throw rather than return a status byte + * @return {@link TransformStatus#OK}, or the per-coordinate failure code + */ + private byte transformPoint(double sx, double sy, double sz, ProjCoordinate c, + boolean failFast) { + // NaN in, NaN out, as a *result*: only a non-finite result that arose from finite input is + // a computation failure. Same test, same place, as transformClosed. + final boolean nanIn = Double.isNaN(sx) || Double.isNaN(sy); + // The absent-height sentinel; see the restore after datumStage below. + final boolean noHeightIn = Double.isNaN(sz); + c.x = sx; + c.y = sy; + c.z = sz; + + if (!srcAxesEnu) { + srcAxes.toENU(c); + } + try { + if (doInverseProjection) { + srcProj.inverseProjectRadians(c, c); + } + c.x += srcPmOffset; + + if (!datumTransformIsNoOp) { + datumStage(c); + if (noHeightIn) { + // push/pop +v_3, exactly as transformClosed does it. Placed inside the + // no-op guard rather than beside it because when datumStage is skipped + // nothing has touched z, so the two placements are indistinguishable. + c.z = Double.NaN; + } + } + + c.x -= tgtPmOffset; + + if (doForwardProjection) { + tgtProj.projectRadians(c, c); + } + if (!tgtAxesEnu) { + tgtAxes.fromENU(c); + } + } catch (Proj4jException e) { + final byte st = TransformStatus.forCause(e.cause()); + if (st == TransformStatus.NOT_A_COORDINATE_ERROR || failFast) { + throw e; + } + return st; + } + + // The end-to-end postcondition, covering the datum stage between the two projection checks: + // a grid shift outside its extent, a geocentric round trip on a degenerate ellipsoid, or a + // +towgs84 with a NaN parameter can each inject a non-finite value after the last + // projection check. + if (!nanIn && ((c.x - c.x) != 0.0 || (c.y - c.y) != 0.0)) { + if (failFast) { + throw new CrsTransformException(ErrorCause.NUMERICAL_FAILURE, + "transform " + srcCRS.getName() + " -> " + tgtCRS.getName() + + " of (" + sx + ", " + sy + ") returned a non-finite " + + "coordinate (" + c.x + ", " + c.y + ")"); + } + return TransformStatus.ERR_NUMERICAL_FAILURE; + } + return TransformStatus.OK; + } + + /** + * {@link #datumTransform(ProjCoordinate)} with its predicates hoisted. + * + *

Only reached when {@link #datumTransformIsNoOp} is false, which already accounts for both + * of that method's early exits — including the {@code Datum.isEqual} whose gridshift branch is + * O(grid size). + * + * @param pt the point, in radians in the source datum on entry and the target datum on return + */ + private void datumStage(ProjCoordinate pt) { + if (srcGridShift) { + // Grid.shift(Grid[], ...) rather than srcDatum.shift(pt): same arithmetic, same + // selection order, but the grid list was resolved once in the constructor. See + // srcGrids. + Grid.shift(srcGrids, false, pt); + } + if (transformViaGeocentric) { + srcGeoConv.convertGeodeticToGeocentric(pt); + if (srcHasToWgs84) { + srcDatum.transformFromGeocentricToWgs84(pt); + } + if (tgtHasToWgs84) { + tgtDatum.transformToGeocentricFromWgs84(pt); + } + tgtGeoConv.convertGeocentricToGeodetic(pt); + } + if (tgtGridShift) { + Grid.shift(tgtGrids, true, pt); + } + } + + /** + * Whether a failing point throws rather than being recorded. + * + *

Fail-fast is what a null status array asks for, but {@link DomainErrorPolicy#RETURN_NAN} + * is a caller who has explicitly asked never to be thrown at for a per-coordinate failure, and + * that request outranks the absent array: they still get {@code NaN} in every ordinate and the + * failure count as the return value. + * + * @param status the caller's status array, or null + * @return true if a per-coordinate failure should abandon the batch with an exception + */ + private boolean failFast(byte[] status) { + return status == null && domainErrorPolicy == DomainErrorPolicy.THROW; + } + + /** + * Batch-level preconditions that are properties of the operation rather than of any + * coordinate, so they are checked once and throw whether or not a status array was supplied. + */ + private void requireRunnableBatch() { + if (srcProj == null || tgtProj == null) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + "the bulk API needs both CRSs to carry a projection; " + + (srcProj == null ? "source" : "target") + " CRS " + + (srcProj == null ? srcCRS.getName() : tgtCRS.getName()) + + " has none (CoordinateReferenceSystem.CS_GEO cannot be transformed)"); + } + if (!srcInverseAvailable) { + throw new CrsTransformException(ErrorCause.NO_INVERSE_AVAILABLE, + "source CRS " + srcCRS.getName() + " uses projection " + srcProj + + ", which has no inverse; it can be a transformation target but not " + + "a source"); + } + } + + /** + * Takes the pooled scratch coordinate, or makes one if another thread holds it. + * + * @return a scratch coordinate owned by this call + */ + private ProjCoordinate acquireScratch() { + ProjCoordinate c = scratchPool.getAndSet(null); + return c != null ? c : new ProjCoordinate(); + } + + /** + * Returns the scratch coordinate to the pool. If a concurrent batch has already put one back, + * this one is simply dropped — the pool holds at most one, by construction. + * + * @param c the scratch coordinate to return + */ + private void releaseScratch(ProjCoordinate c) { + scratchPool.set(c); + } + + /** + * Validates one strided range, once per batch. + * + *

Arithmetic in {@code long} on purpose: {@code offset + (numPts - 1) * stride} overflows + * {@code int} for large batches, and an overflowed bound check is worse than none — it turns a + * rejected call into an {@code ArrayIndexOutOfBoundsException} from inside the loop, after part + * of the caller's buffer has already been overwritten. + * + * @param buf the buffer + * @param name its parameter name, for the message + * @param offset index of the first point's first ordinate + * @param numPts number of points + * @param stride ordinates per point + * @param width ordinates per point this method actually reads and writes + */ + private static void checkRange(double[] buf, String name, int offset, int numPts, int stride, + int width) { + if (buf == null) { + throw new CrsTransformException(ErrorCause.API_MISUSE, name + " must not be null"); + } + if (numPts < 0) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + "numPts must not be negative, was " + numPts); + } + if (offset < 0) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + "offset into " + name + " must not be negative, was " + offset); + } + if (stride < width) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + "stride for " + name + " must be at least " + width + ", was " + stride); + } + if (numPts == 0) { + return; + } + long last = (long) offset + (long) (numPts - 1) * (long) stride + (width - 1); + if (last >= buf.length) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + name + " is too short for " + numPts + " points at offset " + offset + + " stride " + stride + ": needs index " + last + ", length is " + + buf.length); + } + } + + /** + * Validates the status array, once per batch. A status array shorter than the batch is API + * misuse rather than a truncated report, because a caller who reads only the first + * {@code status.length} entries would conclude the rest of the geometry succeeded. + * + * @param status the caller's status array, or null + * @param numPts number of points in the batch + */ + private static void checkStatus(byte[] status, int numPts) { + if (status != null && status.length < numPts) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + "status must have room for " + numPts + " points, length is " + status.length); + } + } + + /** + * Chooses the iteration direction for the source-to-destination form. + * + *

Each point's ordinates are read into locals before anything is written, so a point can + * never clobber itself. The only hazard is clobbering a point that has not yet been + * read, and within one array that is decided by whether the destination sits above or + * below the source: + * + *

    + *
  • different arrays, or ranges that do not overlap — either direction is safe;
  • + *
  • exactly coincident ({@code srcOff == dstOff}, equal strides) — a pure in-place batch, + * where every write lands on the ordinates just read;
  • + *
  • overlapping at equal strides — the write index sits a fixed distance from the read + * index, so descending is safe when the destination is above the source and ascending when + * it is below;
  • + *
  • overlapping at different strides — the write index crosses the read index part + * way through the batch, so no single direction is safe. Rejected rather than + * silently mis-transformed: this is the one shape where returning a plausible answer would + * be worse than refusing.
  • + *
+ * + * @return true to iterate from the last point to the first + */ + private static boolean iterateBackwards(double[] src, int srcOff, int srcStride, + double[] dst, int dstOff, int dstStride, int numPts) { + if (src != dst) { + return false; + } + long srcLo = srcOff; + long srcHi = (long) srcOff + (long) (numPts - 1) * srcStride + 1; + long dstLo = dstOff; + long dstHi = (long) dstOff + (long) (numPts - 1) * dstStride + 1; + if (srcHi < dstLo || dstHi < srcLo) { + return false; + } + if (srcOff == dstOff && srcStride == dstStride) { + return false; + } + if (srcStride != dstStride) { + throw new CrsTransformException(ErrorCause.API_MISUSE, + "overlapping source and destination ranges in one array at different strides (" + + srcStride + " and " + dstStride + ") cannot be transformed in any " + + "single direction without losing points; copy the source first, or " + + "use matching strides"); + } + return dstOff > srcOff; + } + } diff --git a/core/src/main/java/org/locationtech/proj4j/BulkCoordinateTransform.java b/core/src/main/java/org/locationtech/proj4j/BulkCoordinateTransform.java new file mode 100644 index 0000000..6c4922a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/BulkCoordinateTransform.java @@ -0,0 +1,263 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j; + +import org.locationtech.proj4j.bulk.TransformStatus; + +/** + * Transforms many coordinates in one call, over {@code double[]} buffers the caller owns, with + * no allocation per point. + * + *

Why this exists

+ * + *

The access pattern this library is actually used in is per vertex: up to 100,000 + * {@link CoordinateTransform#transform(ProjCoordinate, ProjCoordinate)} calls for one geometry, + * across millions of rows, inside Spark executors, through one cached transform shared by every + * executor thread. At that shape the cost is not the mathematics — it is the per-call + * re-derivation of facts that are constant for the transform's whole lifetime, plus the + * caller's coordinate object. + * + *

Measured and counted, one single-point call re-does all of this per vertex: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
work that is invariant for the transform but repeated per point
invariantper-point cost
{@code Datum.getTransformType()}, six timeseach: two {@code Ellipsoid.isEqual} plus an {@code isIdentity} array scan
{@code Datum.isEqual} once moretwo further {@code getTransformType()} and a full array compare — and on the gridshift + * branch it descends to {@code Arrays.equals(cvs)} over millions of grid nodes, + * i.e. O(grid size) per point
{@code unit.equals(Units.DEGREES)}, twicea virtual call and a {@code String.equals} each
~10 getter chains off non-final fieldsreloads the JIT cannot hoist
six {@code AxisOrder} enum dispatchesabstract calls implementing, for the default axis order, an identity copy
the caller's {@link ProjCoordinate}40 bytes of garbage per vertex
+ * + *

A batch amortises every row of that table to once per geometry. That is the entire + * design: this is not a loop around the single-point method, it is a different shape in which the + * per-point work is arithmetic and array access. + * + *

The contract, normative

+ * + *

Every method takes a {@code byte[] status} that may be null, and the two cases are + * genuinely different modes rather than a convenience: + * + *

    + *
  • {@code status} non-null — one byte per point, from + * {@link TransformStatus}. Zero allocation. The caller owns the array and reuses it + * across batches; it is never reallocated, never grown, and never replaced. This is how the + * error taxonomy is delivered at no per-point cost. The array must have length at least + * {@code numPts}; any excess is left untouched.
  • + *
  • {@code status} nullfail-fast. The batch is abandoned at the first failing + * point and an exception is thrown. The exception is constructed once, after the loop is + * abandoned — never per point. (Under {@link DomainErrorPolicy#RETURN_NAN} nothing is + * thrown; see below.)
  • + *
+ * + *

Sentinel policy, deliberately redundant. A failed point gets {@code NaN} written to + * every output ordinate and a status code. The redundancy is the point: a caller + * who ignores the status array is no worse off than today, because {@code NaN} is what a + * failing vertex already looks like to a downstream {@code isFinite} guard; a caller who reads the + * array additionally gets the reason. Ordinates the transform does not own — an M value or a flag + * living in the same interleaved buffer at a stride greater than the coordinate width — are + * never touched, on success or on failure. + * + *

A non-finite input is {@link TransformStatus#ERR_INVALID_INPUT}, distinct from a + * computation failure, with one exception that is not negotiable because the conformance corpus + * asserts it: {@code NaN} in propagates as {@code NaN} out with status + * {@link TransformStatus#OK}. The caller supplied the undefinedness and gets it back. Only an + * infinity, or a finite input outside PROJ's angular contract, is an invalid input; only a + * finite input that yields a non-finite output is a + * {@link TransformStatus#ERR_NUMERICAL_FAILURE}. This is exactly the classification the + * single-point path makes, and it is required to be identical — see below. + * + *

The return value is the failure count, not a boolean and not the number of successes. + * That makes fail-closed one branch per geometry: + * + *

{@code
+ * byte[] status = scratch.status(n);            // caller-owned, reused
+ * if (op.transform2D(xy, 0, n, 2, status) != 0) {
+ *     return emptyGeometry();                   // or inspect status[i] per vertex
+ * }
+ * }
+ * + *

instead of two {@code isFinite} calls per vertex. + * + *

What is not recorded in the status array

+ * + *

Only per-coordinate causes — those for which {@link ErrorCause#isCoordinateError()} is true. + * A CRS that cannot be built, an operation that has no inverse, an absent grid discovered at + * planning time, and an API misuse are all properties of the operation, so they throw + * {@link CrsTransformException} and abandon the batch whether or not a status array was supplied. + * Recording one of those once per row would report a planning-time defect four million times. + * + *

Interaction with {@link DomainErrorPolicy}

+ * + * + * + * + * + * + * + * + * + * + *
policy by status array
{@code status} non-null{@code status} null
{@link DomainErrorPolicy#THROW}status byte + {@code NaN} ordinates; the batch completesthrows at the first failure
{@link DomainErrorPolicy#RETURN_NAN}status byte + {@code NaN} ordinates; the batch completes{@code NaN} ordinates; the batch completes, and the count is the only signal
+ * + *

Non-coordinate causes throw under both policies, as they do for the single-point path. + * + *

Equivalence to the single-point path is bitwise, and is tested

+ * + *

For every point, the result of a bulk call is bit-for-bit identical to the result of + * the corresponding {@link CoordinateTransform#transform(ProjCoordinate, ProjCoordinate)} call, + * compared with {@link Double#doubleToRawLongBits(double)} rather than with a tolerance. That + * matters for two reasons that are real rather than pedantic: {@code NaN} payloads survive, and + * {@code +0.0} is distinguished from {@code -0.0} — a distinction that occurs at the equator and + * at the antimeridian, on data every consumer has. A bulk path equal to the single-point path only + * to within a tolerance has changed the semantics of the library and is a defect, not an + * optimisation. + * + *

The same guarantee holds for the failure classification: a point that throws + * {@code COORDINATE_OUT_OF_DOMAIN} through the single-point path gets + * {@link TransformStatus#ERR_COORD_OUT_OF_DOMAIN} through the bulk path, never a different code + * and never a success. + * + *

Thread safety

+ * + *

An implementation must be safe to share across threads for the same reasons the single-point + * path is, and must not hold per-call state in a field. Callers must not share the coordinate + * buffers or the status array between threads. (Note that a handful of projection kernels are + * not yet safe to share — {@code CassiniProjection} writes 17 instance fields inside + * {@code project()} — which is a defect of those kernels and applies equally to both paths.) + * + *

Argument checking

+ * + *

Checked once per batch, before the loop, never per point: null buffers, a negative + * {@code offset} or {@code numPts}, a {@code stride} narrower than the coordinate width, a status + * array shorter than {@code numPts}, and a buffer too short for the requested range all raise + * {@link CrsTransformException} with {@link ErrorCause#API_MISUSE}. A batch either has a valid + * shape or does no work at all; there is no partially-validated batch. + * + * @see TransformStatus + * @see CoordinateTransformFactory#createBulkTransform(CoordinateReferenceSystem, + * CoordinateReferenceSystem) + * @since 1.5.0 + */ +public interface BulkCoordinateTransform { + + /** + * Transforms interleaved coordinates in place. + * + *

Point {@code i} occupies {@code xy[offset + i * stride]} and + * {@code xy[offset + i * stride + 1]}. Any further ordinates within the stride are the + * caller's and are not read or written — pass {@code stride = 4} for a buffer that also + * carries M and a flag and they will survive untouched. + * + *

There is no height. Each point is transformed as though its {@code z} were + * {@code Double.NaN}, exactly as {@link ProjCoordinate#setValue(double, double)} does, so this + * is bitwise equivalent to the single-point path fed from a two-argument {@code setValue}. + * For a target that consumes a height — a 7-parameter Helmert, a geocentric target — that + * absent height is still consumed, and the result differs from + * {@link #transform3D(double[], int, int, int, byte[])} with a real height. That is the + * pre-existing behaviour of the single-point path, reproduced rather than corrected. + * + * @param xy the interleaved buffer, read and written + * @param offset index of the first point's x ordinate + * @param numPts number of points to transform; 0 is legal and does nothing + * @param stride ordinates per point; must be ≥ 2 + * @param status one byte per point, or null for fail-fast; see the class javadoc + * @return the number of points that failed + * @throws CrsTransformException with {@link ErrorCause#API_MISUSE} if the arguments do not + * describe a valid range, or with a non-per-coordinate cause if the operation itself + * cannot run, or — when {@code status} is null — with the per-coordinate cause of the + * first failing point + */ + int transform2D(double[] xy, int offset, int numPts, int stride, byte[] status); + + /** + * Transforms interleaved coordinates in place, carrying a height. + * + *

Point {@code i} occupies {@code xyz[offset + i * stride]} through + * {@code offset + i * stride + 2}. A {@code NaN} z means "no height supplied", exactly + * as {@link ProjCoordinate#z} does today, and is written back as {@code NaN}; a finite z is + * carried through the datum stage and written back, which for a Helmert or geocentric step + * means it changes. + * + * @param xyz the interleaved buffer, read and written + * @param offset index of the first point's x ordinate + * @param numPts number of points to transform; 0 is legal and does nothing + * @param stride ordinates per point; must be ≥ 3 + * @param status one byte per point, or null for fail-fast; see the class javadoc + * @return the number of points that failed + * @throws CrsTransformException as {@link #transform2D(double[], int, int, int, byte[])} + */ + int transform3D(double[] xyz, int offset, int numPts, int stride, byte[] status); + + /** + * Transforms interleaved coordinates from one buffer into another, with independent offsets + * and strides. + * + *

Two ordinates per point, as {@link #transform2D(double[], int, int, int, byte[])}: + * source point {@code i} is read from {@code src[srcOff + i * srcStride]} and the next + * ordinate, and written to {@code dst[dstOff + i * dstStride]} and the next. Ordinates of + * {@code dst} outside those two per point are not written. + * + *

Aliasing is supported. {@code src} and {@code dst} may be the same array. Each + * point's ordinates are read into locals before anything is written, and when the two ranges + * overlap the iteration direction is chosen so that no point is read after its source has + * been overwritten. The one shape that is rejected rather than silently mis-transformed is an + * overlap within a single array at different strides, where no single direction is + * safe; that raises {@link ErrorCause#API_MISUSE}. + * + * @param src the source buffer, read only (unless it is also {@code dst}) + * @param srcOff index of the first source point's x ordinate + * @param srcStride ordinates per source point; must be ≥ 2 + * @param dst the destination buffer + * @param dstOff index of the first destination point's x ordinate + * @param dstStride ordinates per destination point; must be ≥ 2 + * @param numPts number of points to transform; 0 is legal and does nothing + * @param status one byte per point, or null for fail-fast; see the class javadoc + * @return the number of points that failed + * @throws CrsTransformException as {@link #transform2D(double[], int, int, int, byte[])} + */ + int transform2D(double[] src, int srcOff, int srcStride, + double[] dst, int dstOff, int dstStride, int numPts, byte[] status); + + /** + * Transforms struct-of-arrays coordinates in place: one array per ordinate. + * + *

The vectorisation-friendly shape, and the one with the least address arithmetic per + * point. Point {@code i} is {@code (x[offset + i], y[offset + i], z[offset + i])}. + * + *

{@code z} may be null, in which case every point is transformed as though its + * height were {@code Double.NaN} — identical to + * {@link #transform2D(double[], int, int, int, byte[])} — and no height is written anywhere. + * + * @param x the x (or longitude, or easting) ordinates, read and written + * @param y the y (or latitude, or northing) ordinates, read and written + * @param z the heights, read and written, or null for "no height" + * @param offset index of the first point in all three arrays + * @param numPts number of points to transform; 0 is legal and does nothing + * @param status one byte per point, or null for fail-fast; see the class javadoc + * @return the number of points that failed + * @throws CrsTransformException as {@link #transform2D(double[], int, int, int, byte[])} + */ + int transform(double[] x, double[] y, double[] z, int offset, int numPts, byte[] status); +} diff --git a/core/src/main/java/org/locationtech/proj4j/CRSFactory.java b/core/src/main/java/org/locationtech/proj4j/CRSFactory.java index 7aef589..83c0c9c 100755 --- a/core/src/main/java/org/locationtech/proj4j/CRSFactory.java +++ b/core/src/main/java/org/locationtech/proj4j/CRSFactory.java @@ -17,6 +17,10 @@ import org.locationtech.proj4j.io.Proj4FileReader; import org.locationtech.proj4j.parser.Proj4Parser; +import org.locationtech.proj4j.vertical.CompoundCrs; +import org.locationtech.proj4j.vertical.CompoundCrsName; +import org.locationtech.proj4j.vertical.VerticalCrs; +import org.locationtech.proj4j.vertical.VerticalCrsRegistry; import java.io.IOException; @@ -81,11 +85,72 @@ public Registry getRegistry() { public CoordinateReferenceSystem createFromName(String name) throws UnsupportedParameterException, InvalidValueException, UnknownAuthorityCodeException { String[] params = csReader.getParameters(name); - if (params == null) + if (params == null) { + // A compound name would otherwise fail as a plain unknown code, with nothing to + // tell the caller that the name is understood but needs a different method. It + // must NOT resolve here: createFromName returns a two-dimensional + // CoordinateReferenceSystem, and silently dropping the vertical half of + // "EPSG:4326+5773" would answer a 3D question with a 2D CRS. + if (CompoundCrsName.looksLikeCompound(name)) { + throw new UnknownAuthorityCodeException(ErrorCause.CRS_TYPE_NOT_SUPPORTED, + name + " is a compound (horizontal + vertical) CRS, which cannot be " + + "represented by a two-dimensional CoordinateReferenceSystem. " + + "Use CRSFactory.createCompound(\"" + name + "\") instead."); + } throw new UnknownAuthorityCodeException(name); + } return createFromParameters(name, params); } + /** + * Creates a {@link CompoundCrs} from a compound CRS name such as + * EPSG:4326+5773 — WGS 84 with EGM96 geoid height. + *

+ * Both spellings PROJ accepts work: EPSG:4326+5773, where the vertical code + * inherits the horizontal authority, and EPSG:4326+EPSG:5773. The horizontal + * half is resolved by {@link #createFromName(String)}, so it must be a code the shipped + * dictionary knows; the vertical half is resolved by + * {@link org.locationtech.proj4j.vertical.VerticalCrsRegistry}. + *

+ * The shipped dictionary contains no vertical CRS at all, and no + * EPSG:4979 either — a PROJ.4 +init= dictionary cannot express + * a standalone vertical CRS. The vertical half therefore comes from a small built-in + * table transcribed from PROJ 9.8.1's own database, and anything outside it is reported + * by code rather than guessed at. See {@code VerticalCrsRegistry} for what is present and + * how to add more. + * + * @param name a compound CRS name + * @return the compound CRS; never null + * @throws InvalidValueException if the name is not a + * compound reference + * @throws UnknownAuthorityCodeException if the horizontal half + * is unknown + * @throws org.locationtech.proj4j.vertical.UnknownVerticalCrsException if the vertical half + * is unknown + * @since 1.5.0 + */ + public CompoundCrs createCompound(String name) { + CompoundCrsName parts = CompoundCrsName.parse(name); + CoordinateReferenceSystem horizontal = createFromName(parts.horizontal()); + VerticalCrs vertical = + VerticalCrsRegistry.require(parts.verticalAuthority(), parts.verticalCode()); + return new CompoundCrs(name, horizontal, vertical); + } + + /** + * Whether {@link #createCompound(String)} rather than {@link #createFromName(String)} is + * the method for this name. + * + * @param name any CRS name or PROJ.4 parameter string + * @return true for a compound CRS reference such as EPSG:4326+5773; false for + * a plain authority:code and false for every PROJ.4 parameter string, + * including the many that contain a '+' + * @since 1.5.0 + */ + public static boolean isCompoundName(String name) { + return CompoundCrsName.looksLikeCompound(name); + } + /** * Creates a {@link CoordinateReferenceSystem} * from a PROJ.4 projection parameter string. diff --git a/core/src/main/java/org/locationtech/proj4j/ContradictoryParameterException.java b/core/src/main/java/org/locationtech/proj4j/ContradictoryParameterException.java new file mode 100644 index 0000000..89f915a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/ContradictoryParameterException.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j; + +/** + * Signals that a CRS definition supplies two or more parameters that contradict each other, or + * that specify the same quantity inconsistently — {@code +ellps=GRS80 +rf=300}, + * {@code +rf=298.257 +f=0.00335}, {@code +datum=NAD83 +towgs84=…}. + * + *

PROJ's equivalent is {@code PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS}. Note that PROJ + * deliberately treats several combinations Proj4J might call contradictory as + * modifiers instead — {@code ell_set.cpp} accepts {@code +ellps=GRS80 +rf=300} and lets + * the later shape parameter win — so this exception is raised only where a definition cannot be + * given a single coherent reading, and, for the PROJ-compatible parse mode, only where PROJ + * itself refuses. + * + *

Why it extends {@link InvalidValueException}. Code that already catches the natural + * exception for a bad {@code +rf} keeps working when Proj4J starts rejecting contradictions + * rather than silently computing a negative squared eccentricity from them. The narrower type is + * additive: a caller that wants to distinguish "this value is out of range" from "these two + * values disagree" can catch this class or switch on + * {@link ErrorCause#CONTRADICTORY_PARAMS}; a caller that does not, does not have to change. + * + * @see ErrorCause#CONTRADICTORY_PARAMS + * @since 1.5.0 + */ +public class ContradictoryParameterException extends InvalidValueException { + + private static final long serialVersionUID = -532824264813230743L; + + /** The cause reported by every constructor. */ + private static final ErrorCause DEFAULT_CAUSE = ErrorCause.CONTRADICTORY_PARAMS; + + /** + * @param message the human-readable detail message; it should name both of the parameters + * that disagree, and the value each implies + */ + public ContradictoryParameterException(String message) { + super(DEFAULT_CAUSE, message); + } + + /** + * @param message the human-readable detail message + * @param throwable the underlying throwable, or null + */ + public ContradictoryParameterException(String message, Throwable throwable) { + super(DEFAULT_CAUSE, message, throwable); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/ConvergenceFailureException.java b/core/src/main/java/org/locationtech/proj4j/ConvergenceFailureException.java index a124050..468fd87 100755 --- a/core/src/main/java/org/locationtech/proj4j/ConvergenceFailureException.java +++ b/core/src/main/java/org/locationtech/proj4j/ConvergenceFailureException.java @@ -16,17 +16,60 @@ package org.locationtech.proj4j; +import org.locationtech.proj4j.proj.Projection; + /** * Signals that an interative mathematical algorithm has failed to converge. * This is usually due to values exceeding the * allowable bounds for the computation in which they are being used. + *

+ * {@link #cause()} is {@link ErrorCause#NUMERICAL_FAILURE}, matching PROJ's + * {@code PROJ_ERR_COORD_TRANSFM_NO_CONVERGENCE}. + *

+ * This is what a non-convergent iteration must do. The alternatives that Proj4J 1.4.3 + * used at fourteen sites are all worse, because they express a failure as a coordinate the caller + * cannot distinguish from a success: + *

    + *
  • returning the last unconverged iterate — plausible, finite, and wrong by an unbounded + * amount;
  • + *
  • clamping to a pole — the worst shape of all, because ±90° is a specific + * plausible coordinate that a range check will accept;
  • + *
  • returning a value derived from an accumulator that was never initialised, which for one + * projection yields latitude exactly 0.
  • + *
+ * A caller's {@code isFinite} guard sees none of those. It sees this. * * @author mbdavis */ -public class ConvergenceFailureException extends Proj4jException { +public class ConvergenceFailureException extends CrsTransformException { + + private static final long serialVersionUID = 7204539599788654542L; + + /** The cause reported by every constructor that does not take one explicitly. */ + private static final ErrorCause DEFAULT_CAUSE = ErrorCause.NUMERICAL_FAILURE; public ConvergenceFailureException(String message) { - super(message); + super(DEFAULT_CAUSE, message); + } + + /** + * @param message the human-readable detail message + * @param throwable the underlying throwable, or null + * @since 1.5.0 + */ + public ConvergenceFailureException(String message, Throwable throwable) { + super(DEFAULT_CAUSE, message, throwable); + } + + /** + * The form the projection kernels use, so the message names the projection that failed. + * + * @param proj the projection whose iteration did not converge + * @param message what did not converge, and after how many iterations + * @since 1.5.0 + */ + public ConvergenceFailureException(Projection proj, String message) { + super(DEFAULT_CAUSE, proj.toString() + ": " + message); } } diff --git a/core/src/main/java/org/locationtech/proj4j/CoordinateReferenceSystem.java b/core/src/main/java/org/locationtech/proj4j/CoordinateReferenceSystem.java index bb6ef36..3660570 100755 --- a/core/src/main/java/org/locationtech/proj4j/CoordinateReferenceSystem.java +++ b/core/src/main/java/org/locationtech/proj4j/CoordinateReferenceSystem.java @@ -17,6 +17,7 @@ import org.locationtech.proj4j.datum.Datum; import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.datum.PrimeMeridian; import org.locationtech.proj4j.proj.LongLatProjection; import org.locationtech.proj4j.proj.Projection; import org.locationtech.proj4j.units.Unit; @@ -24,6 +25,7 @@ import java.util.Arrays; import java.util.Objects; +import org.locationtech.proj4j.util.ProjectionMath; /** * Represents a projected or geodetic geospatial coordinate system, @@ -45,6 +47,8 @@ // CoordinateReferenceSystem corresponds to the PJ struct from proj.4 public class CoordinateReferenceSystem implements java.io.Serializable { + private static final long serialVersionUID = 3023636591117313777L; + // allows specifying transformations which convert to/from Geographic coordinates on the same datum public static final CoordinateReferenceSystem CS_GEO = new CoordinateReferenceSystem("CS_GEO", null, null, null); @@ -108,6 +112,22 @@ public Boolean isGeographic() { * where no datum transformation is required. * The {@link Units} of the geographic CRS are set to {@link Units#DEGREES}. * + *

The prime meridian travels with the datum

+ * + *

It has to, and this method used to drop it. A prime meridian is a property of the geodetic + * datum, not of the projected coordinate system laid over it: EPSG:27563 (NTF (Paris) / Lambert + * Sud France, {@code +pm=paris}) has EPSG:4807 as its geographic CRS, and EPSG:4807 is + * {@code +proj=longlat … +pm=paris} too. Rebuilding it as a Greenwich CRS silently turned every + * "project this geographic coordinate into its own projected CRS" call into a + * Greenwich-to-Paris conversion: on EPSG:27563 at (3.005E, 43.89N) that is 653,653.763 + * where the same-meridian answer is 841,393.487, an error of 187,739.724 m of easting + * delivered as an entirely plausible coordinate. 94 of the shipped EPSG definitions carry + * {@code +pm=}. + * + *

Axis order is deliberately not copied: {@code +axis} describes the projected + * coordinate system's own axes, and the geographic CRS this returns is east-north-up by + * definition of its being a lon/lat CRS in degrees. + * * @return a geographic CoordinateReferenceSystem based on the datum of this CRS */ public CoordinateReferenceSystem createGeographic() { @@ -115,10 +135,35 @@ public CoordinateReferenceSystem createGeographic() { Projection geoProj = new LongLatProjection(); geoProj.setEllipsoid(getProjection().getEllipsoid()); geoProj.setUnits(Units.DEGREES); + String pm = primeMeridianSpec(getProjection().getPrimeMeridian()); + if (pm != null) { + geoProj.setPrimeMeridian(pm); + } geoProj.initialize(); return new CoordinateReferenceSystem("GEO-" + datum.getCode(), null, datum, geoProj); } + /** + * Renders a {@link PrimeMeridian} as something {@link PrimeMeridian#forName(String)} will turn + * back into the same meridian, since that is the only setter {@link Projection} exposes. + *

+ * The name works for the thirteen well known meridians and for Greenwich; it does not work for a + * numeric {@code +pm=}, whose name is the literal {@code "user-provided"} and which + * {@code forName} would resolve to Greenwich. Those travel as decimal degrees instead. + * + * @param pm the meridian to render, may be null + * @return a string {@code forName} maps back to {@code pm}, or null if there is nothing to do + */ + private static String primeMeridianSpec(PrimeMeridian pm) { + if (pm == null || pm.getOffsetFromGreenwich() == 0.0) { + return null; + } + if (PrimeMeridian.forName(pm.getName()).equals(pm)) { + return pm.getName(); + } + return Double.toString(ProjectionMath.toDeg(pm.getOffsetFromGreenwich())); + } + public String toString() { return name; } @@ -136,8 +181,26 @@ public boolean equals(Object that) { return false; } - @Override + /** + * {@inheritDoc} + * + *

Bit-identical to the {@code Objects.hash(datum, proj)} it replaces. + * {@code Objects.hash} is specified as {@code Arrays.hashCode(new Object[]{...})} and treats a + * null element as 0, so the chain below returns the same value for every input, null included. + * What is gone is the {@code Object[2]} it allocated — measured at 24 B/op — on the + * transform-cache lookup path, which the consumer hits once per geometry. + * + *

See {@code Projection.hashCode}, which was converted from {@code Objects.hash} earlier for + * the same reason, and {@code units.Unit.hashCode}, converted alongside this one. Measured with + * {@code ThreadMXBean.getThreadAllocatedBytes} over 2e6 warm calls, the three sites accounted + * for the whole of {@code AllocationBenchmark.crsHashCode}: one {@code CRS.hashCode} was 80 B/op + * = 24 here + 56 in {@code Unit}, and the benchmark hashes two CRSs. + */ + @Override public int hashCode() { - return Objects.hash(datum, proj); + int h = 1; + h = 31 * h + (datum == null ? 0 : datum.hashCode()); + h = 31 * h + (proj == null ? 0 : proj.hashCode()); + return h; } } diff --git a/core/src/main/java/org/locationtech/proj4j/CoordinateTransformFactory.java b/core/src/main/java/org/locationtech/proj4j/CoordinateTransformFactory.java index 6dc9e12..fca68fc 100755 --- a/core/src/main/java/org/locationtech/proj4j/CoordinateTransformFactory.java +++ b/core/src/main/java/org/locationtech/proj4j/CoordinateTransformFactory.java @@ -18,11 +18,88 @@ /** * Creates {@link CoordinateTransform}s * from source and target {@link CoordinateReferenceSystem}s. + *

+ * This is also where the {@link DomainErrorPolicy} hangs. Every transform this factory creates + * inherits the factory's policy, so an application that has one factory has one switch: + * + *

{@code
+ * // fail closed -- the default, and the only mode under which the CrsTransformException
+ * // contract holds
+ * CoordinateTransformFactory strict = new CoordinateTransformFactory();
+ *
+ * // documented escape for a caller that was relying on 1.4.3's silence
+ * CoordinateTransformFactory lenient =
+ *         new CoordinateTransformFactory(DomainErrorPolicy.RETURN_NAN);
+ * }
+ * + *

This class is frozen. It is not, and will not be, re-routed through the new facade.

+ * + *

{@link org.locationtech.proj4j.api.Proj} is the 1.5.0 entry point and it makes different + * choices — most consequentially, it refuses to build an operation whose datum change + * would not actually be performed, throwing + * {@link ErrorCause#BALLPARK_REJECTED} at creation time. That is the right default for new code. + * + *

It would be the wrong behaviour to impose here. Re-routing this class would make + * {@code EPSG:4267 -> EPSG:4269} start throwing for GeoTools, GeoServer, geomesa and every + * other caller, on code that has worked for fifteen years, in a library most of them reach + * transitively and did not choose. So: + * + *

    + *
  • This class's selection behaviour is unchanged. The transform it returns is the same + * {@link BasicCoordinateTransform} it has always returned, and an unreachable + * {@code @}-optional grid is still skipped silently, exactly as in 1.4.3.
  • + *
  • It is not deprecated, in 1.5.0 or later. Java 8 has no + * {@code @Deprecated(forRemoval=)}, so the promise is stated in prose instead: this class will + * not be removed. Nobody should plan a migration they do not need.
  • + *
  • A caller who wants the strict engine behind this interface changes one line: + * {@code LegacyAdapters.transformFactory(context)} returns a {@code CoordinateTransformFactory} + * that applies the new policies. Opting in is visible in the application's own source, which is + * where a change of behaviour belongs.
  • + *
+ * + *

What did change in 1.5.0, and applies here too, is per-coordinate honesty: a + * computation failure is reported as an exception rather than as a plausible coordinate. That is a + * bug fix, it is governed by {@link DomainErrorPolicy}, and the escape hatch is + * {@link DomainErrorPolicy#RETURN_NAN}. * * @author mbdavis + * @see DomainErrorPolicy + * @see org.locationtech.proj4j.api.LegacyAdapters#transformFactory(org.locationtech.proj4j.api.ProjContext) + * @see org.locationtech.proj4j.api.Proj#createCrsToCrs(String, String) */ public class CoordinateTransformFactory { + private final DomainErrorPolicy domainErrorPolicy; + + /** + * A factory whose transforms fail closed, throwing {@link CrsTransformException} on a + * per-coordinate error. + */ + public CoordinateTransformFactory() { + this(DomainErrorPolicy.THROW); + } + + /** + * A factory whose transforms all apply the given policy to a per-coordinate error. + * + * @param domainErrorPolicy the policy; null is treated as {@link DomainErrorPolicy#THROW} + * @since 1.5.0 + */ + public CoordinateTransformFactory(DomainErrorPolicy domainErrorPolicy) { + this.domainErrorPolicy = + domainErrorPolicy == null ? DomainErrorPolicy.THROW : domainErrorPolicy; + } + + /** + * The policy every transform from this factory applies to a per-coordinate error. + * + * @return the policy; never null + * @since 1.5.0 + */ + public DomainErrorPolicy getDomainErrorPolicy() { + return domainErrorPolicy; + } + /** * Creates a transformation from a source CRS to a target CRS, * following the logic in PROJ.4. @@ -35,6 +112,42 @@ public class CoordinateTransformFactory { * @return a tranformation from the source CRS to the target CRS */ public CoordinateTransform createTransform(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS) { - return new BasicCoordinateTransform(sourceCRS, targetCRS); + return new BasicCoordinateTransform(sourceCRS, targetCRS, domainErrorPolicy); + } + + /** + * Creates a transformation typed as the allocation-free bulk API. + * + *

The same object {@link #createTransform(CoordinateReferenceSystem, + * CoordinateReferenceSystem)} returns — {@link BasicCoordinateTransform} implements both + * interfaces — so a caller who already holds a {@link CoordinateTransform} can simply cast, and + * one who wants many points per call can ask for the bulk type directly and never see the + * single-point signature: + * + *

{@code
+     * BulkCoordinateTransform op = factory.createBulkTransform(wgs84, utm33n);
+     * byte[] status = new byte[maxVertices];          // caller-owned, reused per geometry
+     * if (op.transform2D(xy, 0, numVertices, 2, status) != 0) {
+     *     return emptyGeometry();
+     * }
+     * }
+ * + *

The declared return type is the point: it is a compile-time statement that the caller has + * opted into the batch shape, and it means a future engine can return a different + * implementation for the bulk path without changing this signature. + * + *

Results are bit-for-bit identical to the same points through + * {@link CoordinateTransform#transform(ProjCoordinate, ProjCoordinate)}, and the factory's + * {@link DomainErrorPolicy} applies to both — see {@link BulkCoordinateTransform} for how the + * policy composes with the status array. + * + * @param sourceCRS the source CoordinateReferenceSystem + * @param targetCRS the target CoordinateReferenceSystem + * @return a bulk transformation from the source CRS to the target CRS + * @since 1.5.0 + */ + public BulkCoordinateTransform createBulkTransform(CoordinateReferenceSystem sourceCRS, + CoordinateReferenceSystem targetCRS) { + return new BasicCoordinateTransform(sourceCRS, targetCRS, domainErrorPolicy); } } diff --git a/core/src/main/java/org/locationtech/proj4j/CrsCreationException.java b/core/src/main/java/org/locationtech/proj4j/CrsCreationException.java new file mode 100644 index 0000000..7cb53d5 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/CrsCreationException.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j; + +/** + * Signals that a CRS, or a coordinate operation between two CRSs, could not be created. Thrown + * at construction or planning time — never per coordinate. + * + *

This is the distinction the fail-closed design turns on: a definition that cannot produce + * correct coordinates must fail while it is still a definition. A physically impossible + * ellipsoid never becomes a {@code Projection}, so no coordinate can ever be produced from it, + * and a rejected operation fails at planning time rather than on row 4,000,000. + * + *

It extends {@link CrsTransformException} rather than sitting beside it so that a caller who + * only wants "did anything go wrong in the Proj4J call I just made" needs exactly one catch + * clause. The {@link #cause()} distinguishes the cases: {@link ErrorCause#isCrsError()} for a + * bad definition, {@link ErrorCause#isOperationError()} for a definition that is fine but for + * which no usable operation exists. + * + * @see ErrorCause#UNKNOWN_CRS + * @see ErrorCause#BALLPARK_REJECTED + * @since 1.5.0 + */ +public class CrsCreationException extends CrsTransformException { + + private static final long serialVersionUID = 8952705490035737960L; + + /** + * @param cause the machine-readable reason; required + * @param message the human-readable detail message + */ + public CrsCreationException(ErrorCause cause, String message) { + super(cause, message); + } + + /** + * @param cause the machine-readable reason; required + * @param message the human-readable detail message + * @param throwable the underlying throwable, or null + */ + public CrsCreationException(ErrorCause cause, String message, Throwable throwable) { + super(cause, message, throwable); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/CrsTransformException.java b/core/src/main/java/org/locationtech/proj4j/CrsTransformException.java new file mode 100644 index 0000000..51af5f8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/CrsTransformException.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j; + +/** + * The single exception type a caller has to catch to handle every Proj4J failure that has been + * attributed to a {@link ErrorCause}. + * + *

This is the type named by the fail-closed contract: + * + *

+ * For every method that produces coordinates, exactly one of two things happens: (1) it + * returns normally, and every ordinate meaningful for the target CRS is finite and was produced + * by an operation that actually applied every step it declared; or (2) it throws + * {@code CrsTransformException} with a non-null {@link #cause()}. There is no sentinel. + * {@code NaN}, {@code ±Infinity}, the input coordinate, and the projection's false + * easting/northing are never used to signal failure. + *
+ * + *

It sits between {@link Proj4jException} and the legacy exception classes, so + * {@code catch (Proj4jException)} keeps working unchanged while new code can write: + * + *

{@code
+ * try {
+ *     op.transform(src, dst);
+ * } catch (CrsTransformException e) {
+ *     switch (e.cause()) {
+ *         case COORDINATE_OUT_OF_DOMAIN: ...
+ *         default: ...            // required: ErrorCause may gain constants
+ *     }
+ * }
+ * }
+ * + *

Because the legacy classes are its subtypes, that {@code switch} also sees legacy throws — + * they simply report a coarser {@link ErrorCause}. + * + *

Unlike {@link Proj4jException}, whose {@link #cause()} defaults to + * {@link ErrorCause#INTERNAL_ERROR}, every constructor here requires an explicit cause. That is + * the mechanical reason the contract above can promise a meaningful {@code cause()}. + * + * @see ErrorCause + * @since 1.5.0 + */ +public class CrsTransformException extends Proj4jException { + + private static final long serialVersionUID = 1832822012296106468L; + + /** + * @param cause the machine-readable reason; required + * @param message the human-readable detail message + */ + public CrsTransformException(ErrorCause cause, String message) { + super(cause, message, null); + } + + /** + * @param cause the machine-readable reason; required + * @param message the human-readable detail message + * @param throwable the underlying throwable, or null + */ + public CrsTransformException(ErrorCause cause, String message, Throwable throwable) { + super(cause, message, throwable); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/DomainErrorPolicy.java b/core/src/main/java/org/locationtech/proj4j/DomainErrorPolicy.java new file mode 100644 index 0000000..46ba0fb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/DomainErrorPolicy.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j; + +/** + * What a {@link CoordinateTransform} does with a per-coordinate failure: a coordinate + * outside the operation's input contract, outside the projection's domain, or one whose + * computation did not converge or did not come back finite. + * + *

Why this exists

+ * + *

Proj4J 1.4.3 answered those cases with a plausible coordinate rather than an error — the + * input unchanged, a single {@code NaN} ordinate, a pole, or the projection's false + * easting/northing. A caller's {@code isFinite} guard cannot see three of those four. The + * library now fails closed, which is a behaviour change for any caller that was + * (knowingly or not) depending on the old silence. + * + *

This enum is that caller's documented escape. It is deliberately not a way to get + * the 1.4.3 behaviour back: {@link #RETURN_NAN} substitutes one honest sentinel for four + * dishonest ones, so a downstream {@code isFinite} check becomes sufficient where before it was + * not. + * + *

Scope: per-coordinate causes only

+ * + *

Only causes for which {@link ErrorCause#isCoordinateError()} is {@code true} are affected. + * A CRS that cannot be built ({@link ErrorCause#isCrsError()}), an operation that does not + * exist or has no inverse ({@link ErrorCause#isOperationError()}), and an environment or + * API-misuse failure ({@link ErrorCause#isEnvironmentError()}) always throw, under every + * policy: none of them is a property of the coordinate, so returning {@code NaN} once per row + * would report a planning-time defect four million times. + * + * @see CoordinateTransformFactory#CoordinateTransformFactory(DomainErrorPolicy) + * @see BasicCoordinateTransform#BasicCoordinateTransform(CoordinateReferenceSystem, + * CoordinateReferenceSystem, DomainErrorPolicy) + * @since 1.5.0 + */ +public enum DomainErrorPolicy { + + /** + * Throw {@link CrsTransformException} with the {@link ErrorCause} that explains it. The + * default, and the only setting under which the fail-closed contract on + * {@link CrsTransformException} holds. + */ + THROW, + + /** + * Write {@code NaN} into every ordinate of the destination coordinate and return normally. + * + *

Both ordinates, never one: a coordinate with one finite and one {@code NaN} ordinate + * is the shape that survives a careless range check, and + * {@link ProjCoordinate#hasValidXandYOrdinates()} is the intended test. {@code z} is + * cleared too, so a partially-transformed height cannot be mistaken for a result. + * + *

No exception is thrown, so the reason is lost. Prefer {@link #THROW} and catch, + * which gives the same skip-this-vertex control flow plus the {@link ErrorCause}. + */ + RETURN_NAN +} diff --git a/core/src/main/java/org/locationtech/proj4j/ErrorCause.java b/core/src/main/java/org/locationtech/proj4j/ErrorCause.java new file mode 100644 index 0000000..e841374 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/ErrorCause.java @@ -0,0 +1,375 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j; + +/** + * The machine-readable reason a Proj4J operation failed. + * + *

Stability contract

+ * + *

The constant names of this enum are API. Within a major version no constant is + * renamed, removed, or given a different meaning, and {@link #metricKey()} is stable for the + * same span — it is intended to be used directly as a metrics dimension, a log field, or a + * database column value, so it must survive a library upgrade without re-baselining a + * dashboard. + * + *

New constants may be added in a minor version. A caller must therefore always + * provide a default branch: + * + *

{@code
+ * try {
+ *     transform.transform(src, dst);
+ * } catch (CrsTransformException e) {
+ *     switch (e.cause()) {
+ *         case COORDINATE_OUT_OF_DOMAIN:  metrics.increment(e.cause().metricKey()); break;
+ *         case NUMERICAL_FAILURE:         metrics.increment(e.cause().metricKey()); break;
+ *         default:                        // REQUIRED: a future version may add constants
+ *                                         metrics.increment(e.cause().metricKey());
+ *     }
+ * }
+ * }
+ * + *

Switching on {@code ErrorCause} without a {@code default} is a forward-compatibility bug. + * The recommended pattern is to branch only on the constants you act on differently and to + * route everything else through {@link #metricKey()} and the four group predicates + * ({@link #isCrsError()}, {@link #isOperationError()}, {@link #isCoordinateError()}, + * {@link #isEnvironmentError()}), which are total: exactly one of the four is {@code true} + * for every constant, now and in every future version. + * + *

Groups

+ * + * + * + * + * + * + * + * + * + * + * + * + *
the four groups and their {@link #metricKey()} prefixes
grouppredicateprefixmeaning
CRS definition{@link #isCrsError()}{@code crs.}the CRS could not be built from its definition
operation selection{@link #isOperationError()}{@code crs.}the CRSs are fine but no operation between them is usable
per-coordinate{@link #isCoordinateError()}{@code coord.}the operation is fine; this particular coordinate cannot be transformed
environment{@link #isEnvironmentError()}{@code env.}a resource, a policy, or the caller — not the data
+ * + *

Both definition-time groups share the {@code crs.} prefix because both are raised while + * creating a CRS or an operation, never per row; a metrics consumer that only wants + * "did planning fail" can therefore match on the prefix alone. + * + *

Relationship to PROJ's {@code PROJ_ERR_*} codes

+ * + *

Most constants correspond to a {@code PROJ_ERR_*} code from PROJ 9.8.1 + * ({@code src/proj.h}). Six have no PROJ counterpart, because Proj4J has boundaries PROJ does + * not: {@link #UNKNOWN_CRS} (PROJ returns a null {@code PJ} with a generic invalid-operation + * code; a caller needs "we do not recognise EPSG:99999" distinct from "malformed"), + * {@link #PROJECTION_NOT_IMPLEMENTED}, {@link #CRS_TYPE_NOT_SUPPORTED}, + * {@link #UNSUPPORTED_OPERATION_METHOD}, {@link #COORDINATE_OUTSIDE_AREA_OF_USE} (PROJ's + * {@code proj_trans} does not enforce area of use), {@link #MISSING_GRID} at operation + * level (PROJ folds it into its per-coordinate codes), and {@link #DATABASE_UNAVAILABLE} + * (Proj4J can run with no CRS database at all; PROJ cannot run without {@code proj.db}). + * + * @see Proj4jException#cause() + * @see CrsTransformException + * @since 1.5.0 + */ +public enum ErrorCause { + + // ------------------------------------------------------------------ CRS definition + + /** + * An authority code, or a CRS name, that is syntactically well formed but not known to + * any configured authority. {@code EPSG:99999}. + */ + UNKNOWN_CRS("crs.unknown_crs", Group.CRS), + + /** + * A CRS definition could not be parsed: a malformed PROJ string, WKT, or PROJJSON + * document. Distinct from {@link #UNKNOWN_CRS}, which is about a name that parses. + * PROJ's {@code PROJ_ERR_INVALID_OP_WRONG_SYNTAX}. + */ + INVALID_CRS_SYNTAX("crs.invalid_crs_syntax", Group.CRS), + + /** + * Two or more parameters in one definition are mutually exclusive, or specify the same + * quantity inconsistently — {@code +ellps=GRS80 +rf=300}, {@code +rf=298.257 +f=0.00335}. + * PROJ's {@code PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS}. + * + * @see ContradictoryParameterException + */ + CONTRADICTORY_PARAMS("crs.contradictory_params", Group.CRS), + + /** + * A parameter the projection or operation requires was not supplied. + * PROJ's {@code PROJ_ERR_INVALID_OP_MISSING_ARG}. + */ + MISSING_PARAM("crs.missing_param", Group.CRS), + + /** + * A parameter was supplied with a value outside its allowable range, or of the wrong + * kind — a negative squared eccentricity, {@code +lat_1=100}, {@code +zone=0}. + * PROJ's {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. + * + * @see InvalidValueException + */ + INVALID_PARAM_VALUE("crs.invalid_param_value", Group.CRS), + + /** + * The definition names a projection Proj4J does not implement — a capability boundary + * that PROJ does not have. Includes names that are registered but not backed by a + * concrete implementation. + * + * @see UnsupportedParameterException + */ + PROJECTION_NOT_IMPLEMENTED("crs.projection_not_implemented", Group.CRS), + + /** + * The definition describes a kind of CRS Proj4J cannot represent — a compound CRS, a + * vertical CRS, an engineering CRS, a dynamic CRS with an epoch. + */ + CRS_TYPE_NOT_SUPPORTED("crs.crs_type_not_supported", Group.CRS), + + // ------------------------------------------------------------- operation selection + + /** + * No coordinate operation between the two CRSs exists at all — not one was even a + * candidate. PROJ's {@code PROJ_ERR_INVALID_OP} and + * {@code PROJ_ERR_COORD_TRANSFM_NO_OPERATION}. + */ + NO_OPERATION_AVAILABLE("crs.no_operation_available", Group.OPERATION), + + /** + * Candidate operations existed but every one was a ballpark (no-parameter, accuracy-free) + * datum change, and the request rejects ballpark transformations. Raised at planning time, + * never on row 4,000,000. + */ + BALLPARK_REJECTED("crs.ballpark_rejected", Group.OPERATION), + + /** + * Candidate operations existed and at least one was not ballpark, but the best of them + * could not be instantiated — typically because a grid it declares is absent — and the + * request requires the best operation rather than a degraded one. + */ + BEST_OPERATION_UNAVAILABLE("crs.best_operation_unavailable", Group.OPERATION), + + /** + * A grid or model file the operation needs could not be obtained: not present in any + * configured grid source, or present but unreadable or not parseable here. PROJ's own name + * for the code says both halves — {@code FILE_NOT_FOUND_OR_INVALID} — and a caller can act + * on them identically: the operation cannot be planned until the file is supplied in a form + * this build can read. + * + *

Raised at planning time; the per-coordinate counterparts are + * {@link #COORDINATE_OUTSIDE_GRID} and {@link #GRID_NODATA}. PROJ folds all three into + * {@code PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID} / {@code _OUTSIDE_GRID}. + * + *

Not {@link #INVALID_PARAM_VALUE}: the {@code +grids=} or {@code +file=} value the + * caller wrote may be entirely correct and simply unresolvable in this environment, which is + * an operation-planning fact rather than a defect in the CRS definition. + */ + MISSING_GRID("crs.missing_grid", Group.OPERATION), + + /** + * The operation exists in the forward direction only and an inverse was requested. + * PROJ's {@code PROJ_ERR_OTHER_NO_INVERSE_OP}. + */ + NO_INVERSE_AVAILABLE("crs.no_inverse_available", Group.OPERATION), + + /** + * Candidate operations existed, but every one of them uses a coordinate-operation method + * Proj4J cannot execute — a time-dependent Helmert, a Molodensky-Badekas transformation, + * a deformation model. Distinct from {@link #NO_OPERATION_AVAILABLE} (nothing was a + * candidate) and from {@link #PROJECTION_NOT_IMPLEMENTED} (a projection, not an + * operation between datums). No PROJ counterpart. + */ + UNSUPPORTED_OPERATION_METHOD("crs.unsupported_operation_method", Group.OPERATION), + + // ---------------------------------------------------------------------- per-coordinate + + /** + * The input coordinate is not a valid input for this operation at all: a non-finite + * ordinate, or an angular input outside PROJ's input contract (|latitude| beyond + * 90° by more than {@code PJ_EPS_LAT = 1e-12} radians, or |longitude| beyond 10 + * radians). PROJ's {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD}. + */ + INVALID_COORDINATE("coord.invalid_coordinate", Group.COORDINATE), + + /** + * The coordinate is well formed but lies outside the domain on which this projection is + * defined — beyond the visible hemisphere of an azimuthal projection, past the pole of a + * conic. PROJ's {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN}. + * + * @see ProjectionException + */ + COORDINATE_OUT_OF_DOMAIN("coord.coordinate_out_of_domain", Group.COORDINATE), + + /** + * The coordinate lies outside the declared area of use of the operation. PROJ's + * {@code proj_trans} does not enforce this; Proj4J does so only when asked, because the + * result is usually finite and plausible rather than mathematically undefined. + */ + COORDINATE_OUTSIDE_AREA_OF_USE("coord.coordinate_outside_area_of_use", Group.COORDINATE), + + /** + * The coordinate falls outside the extent of the grid the operation uses. PROJ's + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID}. In 1.4.3 this was a silent no-op: the + * coordinate was returned untouched. + */ + COORDINATE_OUTSIDE_GRID("coord.coordinate_outside_grid", Group.COORDINATE), + + /** + * The coordinate falls inside the grid but on a no-data node. PROJ's + * {@code PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA}. + */ + GRID_NODATA("coord.grid_nodata", Group.COORDINATE), + + /** + * The computation failed numerically: an iteration did not converge within its cap, or a + * result was not finite. PROJ's {@code PROJ_ERR_COORD_TRANSFM} and + * {@code PROJ_ERR_COORD_TRANSFM_NO_CONVERGENCE}. + * + *

This is the cause behind the fail-closed rule that a non-convergent iteration must + * never return its last unconverged value, and must never clamp to a pole: a pole is a + * specific, plausible coordinate, and a caller's {@code isFinite} check cannot see it. + * + * @see ConvergenceFailureException + */ + NUMERICAL_FAILURE("coord.numerical_failure", Group.COORDINATE), + + /** + * The operation is time-dependent and the coordinate carries no epoch. PROJ's + * {@code PROJ_ERR_COORD_TRANSFM_MISSING_TIME}. + */ + MISSING_TIME("coord.missing_time", Group.COORDINATE), + + // ------------------------------------------------------------------------ environment + + /** + * The CRS database is absent or unreadable. Proj4J degrades to its built-in definitions + * rather than failing, so this is raised only for a capability that genuinely requires the + * database. PROJ cannot run without {@code proj.db} and so has no equivalent. + */ + DATABASE_UNAVAILABLE("env.database_unavailable", Group.ENVIRONMENT), + + /** + * A resource would have to be fetched over the network. Proj4J never enables networking + * implicitly, so this is always the result of a policy, never of a failed request. + * PROJ's {@code PROJ_ERR_OTHER_NETWORK_ERROR}. + */ + NETWORK_DISABLED("env.network_disabled", Group.ENVIRONMENT), + + /** + * The caller used the API incorrectly: a null argument, an operation used after its + * context was replaced, a bulk call with mismatched array lengths. PROJ's + * {@code PROJ_ERR_OTHER_API_MISUSE}. + */ + API_MISUSE("env.api_misuse", Group.ENVIRONMENT), + + /** + * An internal invariant was violated — a bug in Proj4J. Also the default + * {@link Proj4jException#cause()} for a legacy exception that was thrown before the + * taxonomy existed and has not yet been attributed to a more specific cause. PROJ's + * {@code PROJ_ERR_OTHER}. + */ + INTERNAL_ERROR("env.internal_error", Group.ENVIRONMENT); + + /** + * The four groups. Private: the public contract is the four predicates, so that adding a + * group later cannot break a caller's {@code switch}. + */ + private enum Group { + CRS, OPERATION, COORDINATE, ENVIRONMENT + } + + private final String metricKey; + private final Group group; + + ErrorCause(String metricKey, Group group) { + this.metricKey = metricKey; + this.group = group; + } + + /** + * A stable, lower-case, dotted identifier for this cause, suitable for use as a metrics + * dimension, a log field, or a persisted value: {@code "crs.ballpark_rejected"}, + * {@code "coord.numerical_failure"}. + * + *

The prefix is the group ({@code crs.}, {@code coord.}, {@code env.}) and the + * remainder is the constant name lower-cased. Both are part of the stability contract in + * exactly the same way the constant names are: never changed within a major version. + * Unlike {@link #name()}, this is safe to embed in a dashboard query. + * + * @return the stable metric key; never null, never empty + */ + public String metricKey() { + return metricKey; + } + + /** + * Whether this cause means a CRS could not be built from its definition — the problem is + * in the definition, and no coordinate was involved. + * + * @return true for the CRS-definition group + */ + public boolean isCrsError() { + return group == Group.CRS; + } + + /** + * Whether this cause means both CRSs are fine but no usable coordinate operation between + * them could be selected. + * + * @return true for the operation-selection group + */ + public boolean isOperationError() { + return group == Group.OPERATION; + } + + /** + * Whether this cause is about one particular coordinate rather than about the CRSs or the + * operation. A caller processing a geometry can skip or record the offending vertex and + * keep going; the operation itself remains valid. + * + * @return true for the per-coordinate group + */ + public boolean isCoordinateError() { + return group == Group.COORDINATE; + } + + /** + * Whether this cause is about a resource, a policy, or the caller, rather than about the + * data. Retrying with different data will not help. + * + * @return true for the environment group + */ + public boolean isEnvironmentError() { + return group == Group.ENVIRONMENT; + } + + /** + * Whether this cause means "there is no operation I am willing and able to use", spanning + * every reason the candidate list can end up empty. Convenience for the common case where + * a caller wants to fall back to another library rather than distinguish + * {@link #BALLPARK_REJECTED} from {@link #MISSING_GRID}. + * + *

Equivalent to {@link #isOperationError()} today; it is a separate method because the + * operation-selection group may later gain a member that is not a "no usable operation" + * outcome. + * + * @return true if no usable coordinate operation could be selected + */ + public boolean isNoUsableOperation() { + return group == Group.OPERATION; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/InvalidValueException.java b/core/src/main/java/org/locationtech/proj4j/InvalidValueException.java index 1563c55..332d987 100755 --- a/core/src/main/java/org/locationtech/proj4j/InvalidValueException.java +++ b/core/src/main/java/org/locationtech/proj4j/InvalidValueException.java @@ -17,19 +17,47 @@ /** * Signals that a parameter or computed internal variable - * has a value which lies outside the + * has a value which lies outside the * allowable bounds for the computation in which it is being used. - * + *

+ * {@link #cause()} is {@link ErrorCause#INVALID_PARAM_VALUE}, refined to + * {@link ErrorCause#CONTRADICTORY_PARAMS} by the subclass + * {@link ContradictoryParameterException}. + * * @author mbdavis * */ -public class InvalidValueException extends Proj4jException { +public class InvalidValueException extends CrsCreationException { + + private static final long serialVersionUID = -5817463739437408095L; + + /** The cause reported by every constructor that does not take one explicitly. */ + private static final ErrorCause DEFAULT_CAUSE = ErrorCause.INVALID_PARAM_VALUE; public InvalidValueException(String message) { - super(message); + super(DEFAULT_CAUSE, message); } public InvalidValueException(String message, Exception cause) { - super(message, cause); + super(DEFAULT_CAUSE, message, cause); + } + + /** + * @param cause a refinement of {@link ErrorCause#INVALID_PARAM_VALUE} + * @param message the human-readable detail message + * @since 1.5.0 + */ + public InvalidValueException(ErrorCause cause, String message) { + super(cause, message); + } + + /** + * @param cause a refinement of {@link ErrorCause#INVALID_PARAM_VALUE} + * @param message the human-readable detail message + * @param throwable the underlying throwable, or null + * @since 1.5.0 + */ + public InvalidValueException(ErrorCause cause, String message, Throwable throwable) { + super(cause, message, throwable); } } diff --git a/core/src/main/java/org/locationtech/proj4j/Proj4jException.java b/core/src/main/java/org/locationtech/proj4j/Proj4jException.java index 505b5b7..2186ba6 100755 --- a/core/src/main/java/org/locationtech/proj4j/Proj4jException.java +++ b/core/src/main/java/org/locationtech/proj4j/Proj4jException.java @@ -22,20 +22,159 @@ *

* This is the base class for all exceptions * thrown in the Proj4J API. + *

+ * Every Proj4J exception carries a machine-readable {@link #cause()}. The subtype tells a + * caller what kind of thing went wrong at the level of the Java type system; {@code cause()} + * tells it why, on a stable enum that can be counted, logged, and switched on. + * Exceptions thrown from code paths that predate the taxonomy report + * {@link ErrorCause#INTERNAL_ERROR}, which is the honest answer: not yet attributed. + *

+ * The hierarchy below this class is: + *

+ * Proj4jException                              cause() defaults to INTERNAL_ERROR
+ * └── {@link CrsTransformException}             cause() always set
+ *     ├── {@link CrsCreationException}
+ *     │   ├── {@link UnknownAuthorityCodeException}   UNKNOWN_CRS
+ *     │   ├── {@link InvalidValueException}           INVALID_PARAM_VALUE
+ *     │   │   └── {@link ContradictoryParameterException}  CONTRADICTORY_PARAMS
+ *     │   └── {@link UnsupportedParameterException}   PROJECTION_NOT_IMPLEMENTED
+ *     ├── {@link ProjectionException}                 COORDINATE_OUT_OF_DOMAIN
+ *     └── {@link ConvergenceFailureException}         NUMERICAL_FAILURE
+ * 
+ * This re-parenting is source- and binary-compatible: the old supertype remains in every + * chain, so {@code catch (Proj4jException)} is unchanged and every pre-existing + * {@code catch} clause still fires on exactly the same throws it always did. * * @author mbdavis * */ public class Proj4jException extends RuntimeException { + + private static final long serialVersionUID = 6314691485557593883L; + + /** + * System property that turns stack-trace capture back on: + * {@code -Dproj4j.exceptions.stackTraces=true}. + */ + public static final String STACK_TRACES_PROPERTY = "proj4j.exceptions.stackTraces"; + + /** + * Read once at class initialisation, then mutable through + * {@link #setStackTraceCaptureEnabled(boolean)}. {@code volatile} rather than {@code final} + * because a flag that can only be set on the command line cannot be shown working: a test has + * to be able to run the same throw site under both settings in one JVM and compare, and + * {@code Proj4jExceptionStackTraceTest} does exactly that. The read costs a plain load and is + * paid once per exception construction, against the roughly 600 ns it saves. + */ + private static volatile boolean captureStackTraces = Boolean.getBoolean(STACK_TRACES_PROPERTY); + + /** + * Never null. Assigned in every constructor; {@link ErrorCause#INTERNAL_ERROR} where the + * throw site has not been attributed to a specific cause yet. + */ + private final ErrorCause errorCause; + public Proj4jException() { + this.errorCause = ErrorCause.INTERNAL_ERROR; } public Proj4jException(String message) { super(message); + this.errorCause = ErrorCause.INTERNAL_ERROR; } public Proj4jException(String message, Exception cause) { super(message, cause); + this.errorCause = ErrorCause.INTERNAL_ERROR; + } + + /** + * The constructor every attributed throw site — and every subclass — goes through. + * + * @param errorCause the machine-readable reason; null is normalised to + * {@link ErrorCause#INTERNAL_ERROR} so {@link #cause()} is never null + * @param message the human-readable detail message + * @param cause the underlying throwable, or null + */ + protected Proj4jException(ErrorCause errorCause, String message, Throwable cause) { + super(message, cause); + this.errorCause = errorCause == null ? ErrorCause.INTERNAL_ERROR : errorCause; + } + + /** + * The machine-readable reason this exception was thrown. + *

+ * Note this is not {@link Throwable#getCause()}, which returns the underlying + * throwable. The two are independent and both may be interrogated. + * + * @return the error cause; never null + * @see ErrorCause + * @since 1.5.0 + */ + public ErrorCause cause() { + return errorCause; + } + + /** + * Whether Proj4J exceptions capture a Java stack trace. Off unless + * {@code -Dproj4j.exceptions.stackTraces=true} was set at startup or + * {@link #setStackTraceCaptureEnabled(boolean)} has been called. + * + * @return true if {@link #fillInStackTrace()} walks the stack + * @since 1.5.0 + */ + public static boolean isStackTraceCaptureEnabled() { + return captureStackTraces; + } + + /** + * Turns stack-trace capture on or off for every Proj4J exception constructed afterwards. + * Process-wide, and intended for a debugging session or a test; production should set + * {@code -D}{@value #STACK_TRACES_PROPERTY}{@code =true} instead so the setting is visible in + * the process's own command line. + * + * @param enabled whether to capture stack traces + * @since 1.5.0 + */ + public static void setStackTraceCaptureEnabled(boolean enabled) { + captureStackTraces = enabled; + } + + /** + * Suppresses the stack-trace walk unless it has been asked for. + * + *

Why

+ *

In this library an exception is not, in the common case, a bug report — it is the + * answer. {@code COORDINATE_OUTSIDE_GRID} fires for every point outside the declared + * {@code +nadgrids=} coverage; {@code COORDINATE_OUT_OF_DOMAIN} fires for every point outside a + * projection's domain. The consumer calls this library per row inside a Spark executor, so a + * dataset that straddles a grid edge produces one of these per row, and + * {@code Throwable.fillInStackTrace} is a native stack walk: measured at + * 1,440 B/op and 585 ns per refusal by {@code GridShiftBenchmark.noGridHit}, against a + * dispatch path the same benchmark prices in tens of nanoseconds. Two to three orders of + * magnitude of the cost of saying "no" was frame capture that nothing read. + * + *

What is not lost

+ *

Everything a caller can act on programmatically survives, because none of it lives in the + * frames: the exception type, {@link #cause()}'s machine-readable + * {@link ErrorCause}, the {@link Throwable#getMessage() message} — which for the grid and + * domain refusals names the grids, the coordinate in degrees and the failing predicate — and + * {@link Throwable#getCause()}. What is lost is the Java call site, which is why the flag + * exists and why it is a one-line change to get it back. + * + *

Not a shared instance

+ *

This is not the usual "static preallocated exception" trick. Every throw still + * constructs a fresh object carrying its own message, so two threads refusing two different + * coordinates get two different, accurate messages. Only the frame walk is skipped. + * + * @return {@code this}, unfilled, unless capture is enabled + */ + @Override + public synchronized Throwable fillInStackTrace() { + if (captureStackTraces) { + return super.fillInStackTrace(); + } + return this; } } diff --git a/core/src/main/java/org/locationtech/proj4j/ProjCoordinate.java b/core/src/main/java/org/locationtech/proj4j/ProjCoordinate.java index bbb7635..878d5db 100755 --- a/core/src/main/java/org/locationtech/proj4j/ProjCoordinate.java +++ b/core/src/main/java/org/locationtech/proj4j/ProjCoordinate.java @@ -32,6 +32,8 @@ */ public class ProjCoordinate implements Serializable { + private static final long serialVersionUID = -2978758815712780733L; + public static String DECIMAL_FORMAT_PATTERN = "0.0###############"; public static DecimalFormat DECIMAL_FORMAT = new DecimalFormat(DECIMAL_FORMAT_PATTERN); @@ -300,18 +302,55 @@ public boolean areZOrdinatesEqual(ProjCoordinate argToCompare, } } + /** + * Whether this coordinate and another are the same point, on all three ordinates. + * + *

{@code z} used to be ignored, and that quietly weakened every coordinate comparison

+ * + *

This method compared {@code x} and {@code y} only, and {@link #hashCode()} hashed the same + * two. Nothing in the library announced that, so every {@code assertEquals} on a + * {@code ProjCoordinate} was silently a 2D assertion — {@code RepeatedTransformTest} among them, + * where the transform under test invents a {@code z} from a 2D input (EPSG:4326 to EPSG:27700 + * returns {@code z ~= -49.85}), so a drifting height could not have been seen. The fix belongs + * here rather than at the call sites: a caller that genuinely wants a 2D comparison already has + * {@link #areXOrdinatesEqual(ProjCoordinate, double)} and + * {@link #areYOrdinatesEqual(ProjCoordinate, double)}, and asking every caller to opt in to + * comparing {@code z} is the arrangement that produced the blind spot. + * + *

{@code NaN} compares equal to {@code NaN}, per ordinate

+ * + *

Required, not cosmetic. {@code NaN} is this class's sentinel for "no height" — the + * two-argument constructor, {@link #setValue(double, double)} and {@link #clearZ()} all set + * {@code z = Double.NaN} deliberately — so under {@code z != p.z} a horizontal-only coordinate + * would never have equalled another horizontal-only coordinate, and adding {@code z} to a raw + * {@code !=} comparison would have made {@code equals} almost always false. It also removes the + * standing {@code equals}/{@code hashCode} contract violation: {@code hashCode} has always used + * {@link Double#doubleToLongBits(double)}, which gives all {@code NaN}s one canonical hash, so + * two objects that hashed alike could not compare alike. + * + *

{@code -0.0} still equals {@code 0.0}, as it did, and {@link #hashCode()} normalises + * {@code -0.0} to {@code 0.0} to keep the two consistent in that direction as well. + * + * @param other the object to compare against + * @return true if {@code other} is a ProjCoordinate with the same x, y and z + */ public boolean equals(Object other) { if (!(other instanceof ProjCoordinate)) { return false; } ProjCoordinate p = (ProjCoordinate) other; - if (x != p.x) { - return false; - } - if (y != p.y) { - return false; - } - return true; + return sameOrdinate(x, p.x) && sameOrdinate(y, p.y) && sameOrdinate(z, p.z); + } + + /** + * Ordinate equality: {@code ==}, widened so that the absent-value sentinel equals itself. + * + * @param a one ordinate + * @param b the other + * @return true if both are the same value, or both are {@code NaN} + */ + private static boolean sameOrdinate(double a, double b) { + return a == b || (Double.isNaN(a) && Double.isNaN(b)); } /** @@ -324,17 +363,25 @@ public int hashCode() { int result = 17; result = 37 * result + hashCode(x); result = 37 * result + hashCode(y); + // z is part of equals, so it must be here too. It was in neither. + result = 37 * result + hashCode(z); return result; } /** * Computes a hash code for a double value, using the algorithm from * Joshua Bloch's book Effective Java" + *

+ * {@code -0.0} is normalised to {@code 0.0} first, because + * {@link #equals(Object)} compares with {@code ==} and {@code -0.0 == 0.0}; without the + * normalisation the two would be equal with different hashes. {@code Double.doubleToLongBits} + * already collapses every {@code NaN} to one bit pattern, which is what makes the + * {@code NaN}-equals-{@code NaN} rule in {@code equals} consistent with this. * * @return a hashcode for the double value */ private static int hashCode(double x) { - long f = Double.doubleToLongBits(x); + long f = Double.doubleToLongBits(x == 0.0 ? 0.0 : x); return (int) (f ^ (f >>> 32)); } diff --git a/core/src/main/java/org/locationtech/proj4j/ProjectionException.java b/core/src/main/java/org/locationtech/proj4j/ProjectionException.java index 19a0f95..1ee0df7 100755 --- a/core/src/main/java/org/locationtech/proj4j/ProjectionException.java +++ b/core/src/main/java/org/locationtech/proj4j/ProjectionException.java @@ -22,20 +22,53 @@ * Signals that an erroneous situation has * occured during the computation of * a projected coordinate system value. + *

+ * {@link #cause()} is {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}: historically this is the + * exception the projection kernels throw when a coordinate lies outside the domain on which the + * projection is defined. Where the real reason is a failed iteration rather than an + * out-of-domain input, throw {@link ConvergenceFailureException} instead, or pass + * {@link ErrorCause#NUMERICAL_FAILURE} explicitly. * * @author mbdavis */ -public class ProjectionException extends Proj4jException { +public class ProjectionException extends CrsTransformException { + + private static final long serialVersionUID = 5072367677711578814L; + + /** The cause reported by every constructor that does not take one explicitly. */ + private static final ErrorCause DEFAULT_CAUSE = ErrorCause.COORDINATE_OUT_OF_DOMAIN; public static String ERR_17 = "non-convergent inverse meridinal dist"; - public ProjectionException() {} + public ProjectionException() { + super(DEFAULT_CAUSE, null); + } public ProjectionException(String message) { - super(message); + super(DEFAULT_CAUSE, message); } public ProjectionException(Projection proj, String message) { this(proj.toString() + ": " + message); } + + /** + * @param cause a refinement of {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} + * @param message the human-readable detail message + * @since 1.5.0 + */ + public ProjectionException(ErrorCause cause, String message) { + super(cause, message); + } + + /** + * @param cause a refinement of {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} + * @param proj the projection that rejected the coordinate; its + * {@link Projection#toString()} is prepended to the message + * @param message the human-readable detail message + * @since 1.5.0 + */ + public ProjectionException(ErrorCause cause, Projection proj, String message) { + super(cause, proj.toString() + ": " + message); + } } diff --git a/core/src/main/java/org/locationtech/proj4j/Registry.java b/core/src/main/java/org/locationtech/proj4j/Registry.java index 258680c..71f59b1 100755 --- a/core/src/main/java/org/locationtech/proj4j/Registry.java +++ b/core/src/main/java/org/locationtech/proj4j/Registry.java @@ -15,10 +15,14 @@ */ package org.locationtech.proj4j; +import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; import org.locationtech.proj4j.datum.Datum; import org.locationtech.proj4j.datum.Ellipsoid; @@ -104,6 +108,17 @@ public Datum getDatum(String code) { Ellipsoid.WGS84, new Ellipsoid("NAD27", 6378249.145, 0.0, 293.4663, "NAD27: Clarke 1880 mod."), new Ellipsoid("NAD83", 6378137.0, 0.0, 298.257222101, "NAD83: GRS 1980 (IUGG, 1980)"), + // Present in PROJ 9.8.1's src/ellps.cpp and previously absent here, so +ellps= failed + // for all four. NOTE: this array, not Ellipsoid.ellipsoids, is what getEllipsoid() + // searches - the two lists are separate and had already drifted apart. Adding a + // constant to Ellipsoid alone leaves it unreachable via +ellps=, which is exactly + // how these four were first added and then found to still throw + // "Unknown ellipsoid". Ellipsoid.ellipsoids is read only by the WKT reader, which + // matches numerically rather than by name. + Ellipsoid.CLRK80IGN, + Ellipsoid.DANISH, + Ellipsoid.GSK2011, + Ellipsoid.PZ90, }; public Ellipsoid getEllipsoid(String name) { @@ -116,36 +131,109 @@ public Ellipsoid getEllipsoid(String name) { } private Map projRegistry; + private Map projDescriptions; private void register(String name, Class cls, String description) { projRegistry.put(name, cls); + projDescriptions.put(name, description); } + /** + * Instantiates the projection registered under a {@code +proj=} name. + *

+ * Returns {@code null} if — and now only if — the name is not registered at all. + * That is the signal {@code Proj4Parser} turns into + * {@code InvalidValueException("Unknown projection: …")}, so it must keep meaning exactly + * "unknown". + *

+ * A name that is registered but cannot be instantiated no longer returns + * {@code null}. Three names — {@code alsk}, {@code apian} and {@code bacon} — are + * registered to the abstract {@link Projection} base class itself, so + * {@code Class.newInstance()} on them throws {@link InstantiationException}. Until 1.5.0 + * that was caught, printed to {@code System.err} as an unconditional stack trace, and + * turned into {@code null}, which the parser then reported as + * "Unknown projection: alsk" — a lie about a name that is in the registry, plus + * unsolicited stderr noise in every host process. Both are fixed here: the name resolves to + * an {@link UnsupportedParameterException} carrying + * {@link ErrorCause#PROJECTION_NOT_IMPLEMENTED} and saying which class is missing, and + * nothing is written to {@code System.err}. + * + * @param name the {@code +proj=} name + * @return the projection, or null if {@code name} is not registered + * @throws UnsupportedParameterException if the name is registered but the registered class + * cannot be instantiated — abstract, an interface, or + * without an accessible no-argument constructor + */ public Projection getProjection(String name) { // if ( projRegistry == null ) // initialize(); Class cls = (Class) projRegistry.get(name); - if (cls != null) { - try { - Projection projection = (Projection) cls.newInstance(); - if (projection != null) - projection.setName(name); - return projection; - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - System.err.println("Cannot instantiate projection " + name + " [" + cls.getName() + "]"); - e.printStackTrace(); - } + if (cls == null) { + // Genuinely unknown. Proj4Parser turns null into "Unknown projection: ". + return null; + } + if (Modifier.isAbstract(cls.getModifiers()) || Modifier.isInterface(cls.getModifiers())) { + throw new UnsupportedParameterException(notImplementedMessage(name, cls, null)); + } + try { + Projection projection = (Projection) cls.newInstance(); + projection.setName(name); + return projection; + } catch (InstantiationException e) { + // No accessible no-arg constructor, or the constructor threw. + throw new UnsupportedParameterException( + ErrorCause.PROJECTION_NOT_IMPLEMENTED, notImplementedMessage(name, cls, e), e); + } catch (IllegalAccessException e) { + // The class or its constructor is not visible from here: a packaging error in + // Proj4J itself, not a statement about the caller's definition. + throw new Proj4jException(ErrorCause.INTERNAL_ERROR, + "Projection \"" + name + "\" is registered to " + cls.getName() + + ", which is not accessible from Registry", e); } - return null; } + /** + * Builds the message for a registered-but-uninstantiable name. Names the {@code +proj=} + * value, its human-readable description, and the class that is missing, so the reader can + * tell "Proj4J has not implemented this" from "you typed it wrong". + */ + private String notImplementedMessage(String name, Class cls, Throwable detail) { + StringBuilder sb = new StringBuilder(); + sb.append("Projection \"").append(name).append('"'); + String description = projDescriptions.get(name); + if (description != null) { + sb.append(" (").append(description).append(')'); + } + sb.append(" is registered but not implemented in Proj4J: it is bound to ") + .append(cls.getName()); + if (Modifier.isAbstract(cls.getModifiers())) { + sb.append(", which is abstract"); + } else if (detail != null) { + sb.append(", which cannot be instantiated (") + .append(detail.getClass().getName()).append(')'); + } + return sb.toString(); + } + + /** + * Every projection this registry can actually instantiate. + *

+ * Names that are registered but not implemented are skipped rather than propagated, because + * this method's contract is "the projections you can use". {@link #getProjection(String)} is + * the diagnostic entry point. + * + * @return a fresh list of freshly-constructed projections + */ public List getProjections() { List projections = new ArrayList<>(); for (String name : projRegistry.keySet()) { - Projection projection = getProjection(name); + Projection projection; + try { + projection = getProjection(name); + } catch (UnsupportedParameterException notImplemented) { + continue; + } if (projection != null) { projections.add(projection); @@ -155,24 +243,83 @@ public List getProjections() { return projections; } + /** + * The human-readable description registered alongside a {@code +proj=} name — + * {@code "Albers Equal Area"} for {@code "aea"}, {@code "Azimuthal Equidistant"} for + * {@code "aeqd"}. + * + *

Why this accessor exists. + *

These descriptions have been in this class since 2009, one per {@code register(...)} call, + * and until 1.5.0 there was no way to read them. Their only reader was the + * "registered but not implemented" message, which is now unreachable for every name that has an + * implementation — so roughly a hundred human-readable projection names were write-only + * data. {@link org.locationtech.proj4j.api.Crs#describe()} and + * {@link org.locationtech.proj4j.api.Proj#projections()} are what they were always for: they let + * an introspection call say "lcc -- Lambert Conformal Conic" instead of just + * "lcc". + * + * @param name the {@code +proj=} name + * @return the description, or {@code null} if {@code name} is not registered or was registered + * with no description. As with {@link #getProjection(String)}, {@code null} means + * exactly "nothing registered under that name"; it never means "registered but not + * implemented", which {@link #getProjectionDescriptions()} will still list. + * @since 1.5.0 + */ + public String getProjectionDescription(String name) { + return name == null ? null : projDescriptions.get(name); + } + + /** + * Every registered {@code +proj=} name mapped to its human-readable description, sorted by + * name. + * + *

Includes names that are registered but not implemented, unlike + * {@link #getProjections()}: this method's contract is "what the registry knows about", which is + * what an introspection surface needs, and it does not instantiate anything. Use + * {@link #getProjection(String)} to find out whether a given name can actually be used. + * + * @return an unmodifiable, name-sorted view; never null + * @since 1.5.0 + */ + public SortedMap getProjectionDescriptions() { + return Collections.unmodifiableSortedMap( + new TreeMap(projDescriptions)); + } + private synchronized void initialize() { // guard against race condition if (projRegistry != null) return; projRegistry = new HashMap(); + projDescriptions = new HashMap(); register("aea", AlbersProjection.class, "Albers Equal Area"); register("aeqd", EquidistantAzimuthalProjection.class, "Azimuthal Equidistant"); register("airy", AiryProjection.class, "Airy"); register("aitoff", AitoffProjection.class, "Aitoff"); - register("alsk", Projection.class, "Mod. Stereographics of Alaska"); - register("apian", Projection.class, "Apian Globular I"); + register("adams_hemi", AdamsHemisphereProjection.class, "Adams Hemisphere in a Square"); + register("adams_ws1", AdamsWorldInASquareIProjection.class, "Adams World in a Square I"); + register("adams_ws2", AdamsWorldInASquareIIProjection.class, "Adams World in a Square II"); + /* + * alsk was bound to the abstract Projection base class, so getProjection("alsk") raised + * PROJECTION_NOT_IMPLEMENTED - honest, and a deliberate improvement on the earlier lie + * "Unknown projection: alsk", but its 16 builtins.gie assertions were unreachable. + * AlaskaModifiedStereographicProjection is the mod_ster.cpp port that makes them + * reachable; the other four names from the same upstream file are registered below. + */ + register("alsk", AlaskaModifiedStereographicProjection.class, + "Mod. Stereographic of Alaska"); + register("apian", ApianGlobular1Projection.class, "Apian Globular I"); register("august", AugustProjection.class, "August Epicycloidal"); - register("bacon", Projection.class, "Bacon Globular"); + register("bacon", BaconGlobularProjection.class, "Bacon Globular"); + register("bertin1953", Bertin1953Projection.class, "Bertin 1953"); register("bipc", BipolarProjection.class, "Bipolar conic of western hemisphere"); register("boggs", BoggsProjection.class, "Boggs Eumorphic"); register("bonne", BonneProjection.class, "Bonne (Werner lat_1=90)"); + register("calcofi", CalCOFIProjection.class, + "Cal Coop Ocean Fish Invest Lines/Stations"); register("cass", CassiniProjection.class, "Cassini"); register("cc", CentralCylindricalProjection.class, "Central Cylindrical"); + register("ccon", CentralConicProjection.class, "Central Conic"); register("cea", CylindricalEqualAreaProjection.class, "Equal Area Cylindrical"); // register( "chamb", Projection.class, "Chamberlin Trimetric" ); register("collg", CollignonProjection.class, "Collignon"); @@ -180,11 +327,12 @@ private synchronized void initialize() { register("denoy", DenoyerProjection.class, "Denoyer Semi-Elliptical"); register("eck1", Eckert1Projection.class, "Eckert I"); register("eck2", Eckert2Projection.class, "Eckert II"); - // register( "eck3", Eckert3Projection.class, "Eckert III" ); + register("eck3", Eckert3Projection.class, "Eckert III"); register("eck4", Eckert4Projection.class, "Eckert IV"); register("eck5", Eckert5Projection.class, "Eckert V"); register("eck6", Eckert6Projection.class, "Eckert VI"); register("eqc", PlateCarreeProjection.class, "Equidistant Cylindrical (Plate Caree)"); + register("eqearth", EqualEarthProjection.class, "Equal Earth"); register("eqdc", EquidistantConicProjection.class, "Equidistant Conic"); register("euler", EulerProjection.class, "Euler"); register("fahey", FaheyProjection.class, "Fahey"); @@ -193,19 +341,38 @@ private synchronized void initialize() { register("gall", GallProjection.class, "Gall (Gall Stereographic)"); register("geocent", GeocentProjection.class, "Geocentric"); register("geos", GeostationarySatelliteProjection.class, "Geostationary Satellite"); - // register( "gins8", Projection.class, "Ginsburg VIII (TsNIIGAiK)" ); - // register( "gn_sinu", Projection.class, "General Sinusoidal Series" ); + register("gins8", Ginsburg8Projection.class, "Ginsburg VIII (TsNIIGAiK)"); + register("gn_sinu", GeneralSinusoidalProjection.class, "General Sinusoidal Series"); register("gnom", GnomonicAzimuthalProjection.class, "Gnomonic"); + register("gstmerc", GaussSchreiberTransverseMercatorProjection.class, + "Gauss-Schreiber Transverse Mercator (aka Gauss-Laborde Reunion)"); register("goode", GoodeProjection.class, "Goode Homolosine"); - // register( "gs48", Projection.class, "Mod. Stererographics of 48 U.S." ); - // register( "gs50", Projection.class, "Mod. Stererographics of 50 U.S." ); + register("guyou", GuyouProjection.class, "Guyou"); + register("gs48", ModifiedStereographic48Projection.class, + "Mod. Stereographic of 48 U.S."); + register("gs50", ModifiedStereographic50Projection.class, + "Mod. Stereographic of 50 U.S."); register("hammer", HammerProjection.class, "Hammer & Eckert-Greifendorff"); register("hatano", HatanoProjection.class, "Hatano Asymmetrical Equal Area"); - // register( "imw_p", Projection.class, "Internation Map of the World Polyconic" ); + /* + * The interrupted family, one class per upstream file: igh.cpp, igh_o.cpp, imoll.cpp and + * imoll_o.cpp all dispatch over the Mollweide and (for the igh pair) sinusoidal children + * this library already had. Note "goode" above is the UNinterrupted Goode Homolosine and + * is a different operator, not an alias. + */ + register("igh", InterruptedGoodeHomolosineProjection.class, + "Interrupted Goode Homolosine"); + register("igh_o", InterruptedGoodeHomolosineOceanicProjection.class, + "Interrupted Goode Homolosine Oceanic View"); + register("imoll", InterruptedMollweideProjection.class, "Interrupted Mollweide"); + register("imoll_o", InterruptedMollweideOceanicProjection.class, + "Interrupted Mollweide Oceanic View"); + register("imw_p", InternationalMapOfTheWorldPolyconicProjection.class, + "International Map of the World Polyconic"); register("kav5", KavraiskyVProjection.class, "Kavraisky V"); - // register( "kav7", Projection.class, "Kavraisky VII" ); + register("kav7", Kavrayskiy7Projection.class, "Kavrayskiy VII"); register("krovak", KrovakProjection.class, "Krovak"); - // register( "labrd", Projection.class, "Laborde" ); + register("labrd", LabordeProjection.class, "Laborde"); register("laea", LambertAzimuthalEqualAreaProjection.class, "Lambert Azimuthal Equal Area"); register("lagrng", LagrangeProjection.class, "Lagrange"); register("larr", LarriveeProjection.class, "Larrivee"); @@ -215,78 +382,136 @@ private synchronized void initialize() { register("latlon", LongLatProjection.class, "Lat/Long (Geodetic alias)"); register("lonlat", LongLatProjection.class, "Lat/Long (Geodetic)"); register("lcc", LambertConformalConicProjection.class, "Lambert Conformal Conic"); + register("lcca", LambertConformalConicAlternativeProjection.class, + "Lambert Conformal Conic Alternative"); register("leac", LambertEqualAreaConicProjection.class, "Lambert Equal Area Conic"); - // register( "lee_os", Projection.class, "Lee Oblated Stereographic" ); + register("lee_os", LeeOblatedStereographicProjection.class, "Lee Oblated Stereographic"); register("loxim", LoximuthalProjection.class, "Loximuthal"); register("lsat", LandsatProjection.class, "Space oblique for LANDSAT"); - // register( "mbt_s", Projection.class, "McBryde-Thomas Flat-Polar Sine" ); + register("mbt_s", McBrydeThomasFlatPolarSine1Projection.class, "McBryde-Thomas Flat-Polar Sine (No. 1)"); register("mbt_fps", McBrydeThomasFlatPolarSine2Projection.class, "McBryde-Thomas Flat-Pole Sine (No. 2)"); register("mbtfpp", McBrydeThomasFlatPolarParabolicProjection.class, "McBride-Thomas Flat-Polar Parabolic"); register("mbtfpq", McBrydeThomasFlatPolarQuarticProjection.class, "McBryde-Thomas Flat-Polar Quartic"); - // register( "mbtfps", Projection.class, "McBryde-Thomas Flat-Polar Sinusoidal" ); + register("mbtfps", McBrydeThomasFlatPolarSinusoidalProjection.class, "McBryde-Thomas Flat-Polar Sinusoidal"); register("merc", MercatorProjection.class, "Mercator"); - // register( "mil_os", Projection.class, "Miller Oblated Stereographic" ); + register("mil_os", MillerOblatedStereographicProjection.class, + "Miller Oblated Stereographic"); + register("misrsom", MisrSpaceObliqueMercatorProjection.class, + "Space oblique for MISR"); register("mill", MillerProjection.class, "Miller Cylindrical"); // register( "mpoly", Projection.class, "Modified Polyconic" ); register("moll", MolleweideProjection.class, "Mollweide"); register("murd1", Murdoch1Projection.class, "Murdoch I"); register("murd2", Murdoch2Projection.class, "Murdoch II"); register("murd3", Murdoch3Projection.class, "Murdoch III"); + register("natearth", NaturalEarthProjection.class, "Natural Earth"); + register("natearth2", NaturalEarth2Projection.class, "Natural Earth 2"); + register("patterson", PattersonProjection.class, "Patterson Cylindrical"); + register("comill", CompactMillerProjection.class, "Compact Miller"); register("nell", NellProjection.class, "Nell"); - // register( "nell_h", Projection.class, "Nell-Hammer" ); + register("nell_h", NellHProjection.class, "Nell-Hammer"); register("nicol", NicolosiProjection.class, "Nicolosi Globular"); register("nsper", PerspectiveProjection.class, "Near-sided perspective"); register("nzmg", NewZealandMapGridProjection.class, "New Zealand Map Grid"); - // register( "ob_tran", Projection.class, "General Oblique Transformation" ); - // register( "ocea", Projection.class, "Oblique Cylindrical Equal Area" ); + register("ob_tran", ObliqueTransformationProjection.class, + "General Oblique Transformation"); + register("ocea", ObliqueCylindricalEqualAreaProjection.class, + "Oblique Cylindrical Equal Area"); // register( "oea", Projection.class, "Oblated Equal Area" ); register("omerc", ObliqueMercatorProjection.class, "Oblique Mercator"); - // register( "ortel", Projection.class, "Ortelius Oval" ); + register("ortel", OrteliusOvalProjection.class, "Ortelius Oval"); register("ortho", OrthographicAzimuthalProjection.class, "Orthographic"); register("pconic", PerspectiveConicProjection.class, "Perspective Conic"); + register("peirce_q", PeirceQuincuncialProjection.class, "Peirce Quincuncial"); register("poly", PolyconicProjection.class, "Polyconic (American)"); - // register( "putp1", Projection.class, "Putnins P1" ); + register("putp1", PutninsP1Projection.class, "Putnins P1"); register("putp2", PutninsP2Projection.class, "Putnins P2"); - // register( "putp3", Projection.class, "Putnins P3" ); - // register( "putp3p", Projection.class, "Putnins P3'" ); + register("putp3", PutninsP3Projection.class, "Putnins P3"); + register("putp3p", PutninsP3PProjection.class, "Putnins P3'"); register("putp4p", PutninsP4Projection.class, "Putnins P4'"); register("putp5", PutninsP5Projection.class, "Putnins P5"); register("putp5p", PutninsP5PProjection.class, "Putnins P5'"); - // register( "putp6", Projection.class, "Putnins P6" ); - // register( "putp6p", Projection.class, "Putnins P6'" ); + register("putp6", PutninsP6Projection.class, "Putnins P6"); + register("putp6p", PutninsP6PProjection.class, "Putnins P6'"); register("qua_aut", QuarticAuthalicProjection.class, "Quartic Authalic"); register("robin", RobinsonProjection.class, "Robinson"); register("rpoly", RectangularPolyconicProjection.class, "Rectangular Polyconic"); register("sinu", SinusoidalProjection.class, "Sinusoidal (Sanson-Flamsteed)"); + register("som", SpaceObliqueMercatorProjection.class, "Space Oblique Mercator"); register("somerc", SwissObliqueMercatorProjection.class, "Swiss Oblique Mercator"); + register("spilhaus", SpilhausProjection.class, "Spilhaus"); register("stere", StereographicAzimuthalProjection.class, "Stereographic"); register("sterea", ObliqueStereographicAlternativeProjection.class, "Oblique Stereographic Alternative"); register("tcc", TranverseCentralCylindricalProjection.class, "Transverse Central Cylindrical"); register("tcea", TransverseCylindricalEqualArea.class, "Transverse Cylindrical Equal Area"); - // register( "tissot", TissotProjection.class, "Tissot Conic" ); + register("tissot", TissotProjection.class, "Tissot Conic"); register("tmerc", TransverseMercatorProjection.class, "Transverse Mercator"); + register("times", TimesProjection.class, "Times"); + register("tobmerc", ToblerMercatorProjection.class, "Tobler-Mercator"); + register("col_urban", ColombiaUrbanProjection.class, "Colombia Urban"); + register("webmerc", WebMercatorProjection.class, "Web Mercator / Pseudo Mercator"); register("etmerc", ExtendedTransverseMercatorProjection.class, "Extended Transverse Mercator"); - // register( "tpeqd", Projection.class, "Two Point Equidistant" ); - // register( "tpers", Projection.class, "Tilted perspective" ); - // register( "ups", Projection.class, "Universal Polar Stereographic" ); - // register( "urm5", Projection.class, "Urmaev V" ); + register("tpeqd", TwoPointEquidistantProjection.class, "Two Point Equidistant"); + /* + * tpers was DELIBERATELY unregistered until its two parameters could be + * dispatched, and the ordering is worth keeping on the record. + * + * TiltedPerspectiveProjection has been a complete port of nsper.cpp's + * PJ_PROJECTION(tpers) for some time, but Proj4Parser sent +azi to + * SpilhausProjection and nowhere else, so registering this name on its own + * would have made `+proj=tpers +azi=20` a SILENT WRONG ANSWER: the azimuth + * parsed, passed the STRICT allow-list and was then dropped - the same + * defect as `+proj=peirce_q +shape=square` projecting as a diamond. (`+tilt` + * was not a Proj4Keyword at all, so that half already failed closed.) + * + * Both halves now exist - Proj4Keyword.tilt is registered, and + * Proj4Parser.parseProjection has an `instanceof TiltedPerspectiveProjection` + * branch reading +azi and +tilt through parseAngleRadians (both are pj_param + * 'r' sigils, nsper.cpp:186-187) - so this registration is safe. It unblocks + * 17 builtins.gie assertions. + * + * The rule the episode establishes: registering a +proj= name whose operator + * reads a parameter this parser does not dispatch to it is strictly worse + * than leaving the name unregistered, because NOT_IMPLEMENTED is honest and a + * dropped parameter is not. + */ + register("tpers", TiltedPerspectiveProjection.class, "Tilted perspective"); + register("ups", UniversalPolarStereographicProjection.class, + "Universal Polar Stereographic"); + register("urm5", Urmaev5Projection.class, "Urmaev V"); register("urmfps", UrmaevFlatPolarSinusoidalProjection.class, "Urmaev Flat-Polar Sinusoidal"); - register("utm", ExtendedTransverseMercatorProjection.class, "Universal Transverse Mercator (UTM)"); + /* + * utm binds to TransverseMercatorProjection, not to the Poder/Engsager-only + * ExtendedTransverseMercatorProjection. + * + * Upstream has one implementation file: PJ_PROJECTION(utm) and + * PJ_PROJECTION(tmerc) both end in the same setup(P, algo) and differ only in + * which parameters they read and in utm's es != 0 requirement (tmerc.cpp). + * Binding utm to the extended class made +approx and +algo unreachable for it - + * there was no way to ask for the legacy algorithm on a UTM definition at all - + * and it is also the class +zone is already dispatched on in Proj4Parser, so + * this makes the two consistent rather than introducing a new pattern. + * + * The es != 0 requirement moves with it: it is enforced in Proj4Parser, keyed on + * the operation name being "utm", because TransverseMercatorProjection is + * legitimately spherical for +proj=tmerc. + */ + register("utm", TransverseMercatorProjection.class, "Universal Transverse Mercator (UTM)"); register("vandg", VanDerGrintenProjection.class, "van der Grinten (I)"); - // register( "vandg2", Projection.class, "van der Grinten II" ); - // register( "vandg3", Projection.class, "van der Grinten III" ); - // register( "vandg4", Projection.class, "van der Grinten IV" ); + register("vandg2", VanDerGrinten2Projection.class, "van der Grinten II"); + register("vandg3", VanDerGrinten3Projection.class, "van der Grinten III"); + register("vandg4", VanDerGrinten4Projection.class, "van der Grinten IV"); register("vitk1", VitkovskyProjection.class, "Vitkovsky I"); register("wag1", Wagner1Projection.class, "Wagner I (Kavraisky VI)"); register("wag2", Wagner2Projection.class, "Wagner II"); register("wag3", Wagner3Projection.class, "Wagner III"); register("wag4", Wagner4Projection.class, "Wagner IV"); register("wag5", Wagner5Projection.class, "Wagner V"); - // register( "wag6", Projection.class, "Wagner VI" ); + register("wag6", Wagner6Projection.class, "Wagner VI"); register("wag7", Wagner7Projection.class, "Wagner VII"); register("weren", WerenskioldProjection.class, "Werenskiold I"); - // register( "wink1", Projection.class, "Winkel I" ); - // register( "wink2", Projection.class, "Winkel II" ); + register("wink1", Winkel1Projection.class, "Winkel I"); + register("wink2", Winkel2Projection.class, "Winkel II"); register("wintri", WinkelTripelProjection.class, "Winkel Tripel"); } } diff --git a/core/src/main/java/org/locationtech/proj4j/UnknownAuthorityCodeException.java b/core/src/main/java/org/locationtech/proj4j/UnknownAuthorityCodeException.java index c5b3b45..9868a35 100755 --- a/core/src/main/java/org/locationtech/proj4j/UnknownAuthorityCodeException.java +++ b/core/src/main/java/org/locationtech/proj4j/UnknownAuthorityCodeException.java @@ -19,11 +19,28 @@ /** * Signals that an authority code is unknown * and cannot be mapped to a CRS definition. + *

+ * {@link #cause()} is {@link ErrorCause#UNKNOWN_CRS}. * * @author mbdavis */ -public class UnknownAuthorityCodeException extends Proj4jException { +public class UnknownAuthorityCodeException extends CrsCreationException { + + private static final long serialVersionUID = -8058065898082079043L; + + /** The cause reported by every constructor that does not take one explicitly. */ + private static final ErrorCause DEFAULT_CAUSE = ErrorCause.UNKNOWN_CRS; + public UnknownAuthorityCodeException(String message) { - super(message); + super(DEFAULT_CAUSE, message); + } + + /** + * @param cause a refinement of {@link ErrorCause#UNKNOWN_CRS} + * @param message the human-readable detail message + * @since 1.5.0 + */ + public UnknownAuthorityCodeException(ErrorCause cause, String message) { + super(cause, message); } } diff --git a/core/src/main/java/org/locationtech/proj4j/UnsupportedParameterException.java b/core/src/main/java/org/locationtech/proj4j/UnsupportedParameterException.java index d7d6764..d768853 100755 --- a/core/src/main/java/org/locationtech/proj4j/UnsupportedParameterException.java +++ b/core/src/main/java/org/locationtech/proj4j/UnsupportedParameterException.java @@ -19,14 +19,42 @@ /** * Signals that a parameter in a CRS specification * is not currently supported, or unknown. - * + *

+ * {@link #cause()} is {@link ErrorCause#PROJECTION_NOT_IMPLEMENTED}: this exception marks a + * Proj4J capability boundary, not a defect in the definition. PROJ has no parameter allow-list, + * so a definition Proj4J rejects here is usually one PROJ accepts and ignores. + * * @author mbdavis * */ -public class UnsupportedParameterException extends Proj4jException +public class UnsupportedParameterException extends CrsCreationException { + private static final long serialVersionUID = -1273232907179554713L; + + /** The cause reported by every constructor that does not take one explicitly. */ + private static final ErrorCause DEFAULT_CAUSE = ErrorCause.PROJECTION_NOT_IMPLEMENTED; + public UnsupportedParameterException(String message) { - super(message); + super(DEFAULT_CAUSE, message); + } + + /** + * @param cause a refinement of {@link ErrorCause#PROJECTION_NOT_IMPLEMENTED} + * @param message the human-readable detail message + * @since 1.5.0 + */ + public UnsupportedParameterException(ErrorCause cause, String message) { + super(cause, message); + } + + /** + * @param cause a refinement of {@link ErrorCause#PROJECTION_NOT_IMPLEMENTED} + * @param message the human-readable detail message + * @param throwable the underlying throwable, or null + * @since 1.5.0 + */ + public UnsupportedParameterException(ErrorCause cause, String message, Throwable throwable) { + super(cause, message, throwable); } } diff --git a/core/src/main/java/org/locationtech/proj4j/api/Accuracy.java b/core/src/main/java/org/locationtech/proj4j/api/Accuracy.java new file mode 100644 index 0000000..d99ccf8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/Accuracy.java @@ -0,0 +1,104 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +/** + * The stated horizontal accuracy of a coordinate operation, in metres. + * + *

What "no accuracy" means, and why it is not zero

+ * + *

An accuracy is authority metadata, from EPSG by way of the {@code coordinate_operation} + * tables. It is read when a {@link ProjContext#database()} is configured — 0.15 m for + * {@code EPSG:1241}, 1.0 m for {@code EPSG:7710}, 2.0 m for the WGS 84 ensemble + * offsets — and {@link CrsOperation#accuracy()} is {@link java.util.Optional#empty()} without + * one, because there is then nothing to read. Absence is reported as absence, never as {@code 0.0} + * and never as an estimate: "we do not know" and "sub-metre" are different claims, and conflating + * them is how an unshifted datum comes to look like an exact one. + * + *

The absence is also structural for one class of operation. A ballpark transformation + * — see {@link BallparkPolicy} — never has an accuracy, in PROJ either: PROJ does not + * assign one, because there is no operation whose accuracy could be quoted. So + * {@code isBallparkTransformation() == true} implies {@code accuracy().isEmpty()}, and that + * implication is a permanent property rather than a temporary gap. + * + *

Immutable and safe to share between threads. + * + * @see CrsOperation#accuracy() + * @since 1.5.0 + */ +public final class Accuracy { + + private final double metres; + private final String source; + + /** + * Creates a stated accuracy. + * + * @param metres the accuracy in metres; must be finite and non-negative + * @param source where the figure came from, for example {@code "EPSG:1188"}; may be null + * @throws IllegalArgumentException if {@code metres} is not a finite, non-negative number + */ + public Accuracy(double metres, String source) { + if (Double.isNaN(metres) || Double.isInfinite(metres) || metres < 0.0) { + throw new IllegalArgumentException( + "accuracy must be a finite, non-negative number of metres, not " + metres); + } + this.metres = metres; + this.source = source; + } + + /** + * The accuracy in metres. + * + * @return a finite, non-negative number of metres + */ + public double metres() { + return metres; + } + + /** + * Where this figure came from — an EPSG operation code, a grid's own metadata, or null if + * unattributed. + * + * @return the source, or null + */ + public String source() { + return source; + } + + @Override + public String toString() { + return source == null ? metres + " m" : metres + " m (" + source + ")"; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Accuracy)) { + return false; + } + Accuracy that = (Accuracy) o; + return Double.compare(metres, that.metres) == 0 + && (source == null ? that.source == null : source.equals(that.source)); + } + + @Override + public int hashCode() { + return 31 * Double.valueOf(metres).hashCode() + (source == null ? 0 : source.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/AreaOfUse.java b/core/src/main/java/org/locationtech/proj4j/api/AreaOfUse.java new file mode 100644 index 0000000..36cbfb3 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/AreaOfUse.java @@ -0,0 +1,286 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +/** + * The geographic extent over which a CRS or an operation is declared valid, in degrees on the + * WGS 84 ellipsoid. + * + *

Where this comes from, and where it does not

+ * + *

An area of use is database metadata. PROJ reads it from {@code proj.db}'s + * {@code extent} table, and Proj4J ships no such database, so + * {@link Crs#areaOfUse()} is {@link java.util.Optional#empty()} for a CRS created from an + * {@code authority:code} name or from a PROJ.4 parameter string. It is not guessed: a + * plausible bounding box invented from a projection's parameters would be exactly the kind of + * answer this API exists to avoid. + * + *

It is populated when the CRS was read from a document that carried it, because then + * it is a fact the caller supplied rather than one this library inferred: + *

    + *
  • WKT2's {@code BBOX[south, west, north, east]} inside {@code USAGE[AREA[...]]};
  • + *
  • PROJJSON's {@code bbox} object.
  • + *
+ * + *

{@link #isDatabaseDerived()} is {@code false} in both of those cases and would be {@code true} + * only for a real database lookup, so a caller can tell a document's claim from an authority's. + * + *

Antimeridian crossing

+ * + *

EPSG, WKT2 and PROJJSON all express a box that crosses the antimeridian with + * {@code west > east} — for example Fiji, {@code west = 176.8}, {@code east = -178.4}. That + * convention is preserved verbatim; {@link #crossesAntimeridian()} reports it and + * {@link #contains(double, double)} handles it. Normalising it away would silently turn a 5° + * box into a 355° one. + * + *

Immutable and safe to share between threads. + * + * @since 1.5.0 + */ +public final class AreaOfUse { + + private final double westLongitude; + private final double southLatitude; + private final double eastLongitude; + private final double northLatitude; + private final String description; + private final boolean databaseDerived; + + /** + * Creates an area of use from the four bounds and an optional human-readable description. + * + * @param westLongitude western bound in degrees; may be greater than {@code eastLongitude} + * for a box crossing the antimeridian + * @param southLatitude southern bound in degrees + * @param eastLongitude eastern bound in degrees + * @param northLatitude northern bound in degrees + * @param description a name such as {@code "United States (USA) - CONUS"}, or null + * @param databaseDerived true only if these bounds came from an authority database rather than + * from a document the caller supplied + * @throws IllegalArgumentException if a bound is not finite, a latitude is outside + * ±90°, or {@code southLatitude > northLatitude} + */ + public AreaOfUse(double westLongitude, double southLatitude, double eastLongitude, + double northLatitude, String description, boolean databaseDerived) { + check(westLongitude, "westLongitude", 180.0); + check(eastLongitude, "eastLongitude", 180.0); + check(southLatitude, "southLatitude", 90.0); + check(northLatitude, "northLatitude", 90.0); + if (southLatitude > northLatitude) { + throw new IllegalArgumentException("southLatitude " + southLatitude + + " is north of northLatitude " + northLatitude); + } + this.westLongitude = westLongitude; + this.southLatitude = southLatitude; + this.eastLongitude = eastLongitude; + this.northLatitude = northLatitude; + this.description = description; + this.databaseDerived = databaseDerived; + } + + private static void check(double v, String what, double limit) { + if (Double.isNaN(v) || Double.isInfinite(v)) { + throw new IllegalArgumentException(what + " is not finite: " + v); + } + if (Math.abs(v) > limit + 1e-9) { + throw new IllegalArgumentException(what + " " + v + " is outside +/-" + limit); + } + } + + /** + * Builds an area of use from a WKT2 {@code BBOX[]} array, which is in the order + * {@code (southLatitude, westLongitude, northLatitude, eastLongitude)} — latitude first, + * unlike everything else in this class. + * + * @param bbox four values in WKT2 {@code BBOX} order, or null + * @param description the {@code AREA[]} text, or null + * @return the area, or null if {@code bbox} is null, not four values, or not a usable box + */ + static AreaOfUse fromWktBbox(double[] bbox, String description) { + if (bbox == null || bbox.length != 4) { + return null; + } + try { + return new AreaOfUse(bbox[1], bbox[0], bbox[3], bbox[2], description, false); + } catch (IllegalArgumentException notUsable) { + // A malformed BBOX in a caller's document is not a reason to refuse the whole CRS; it + // is a reason to report no area of use. The CRS itself is unaffected by it. + return null; + } + } + + /** + * Builds an area of use from an authority database extent row. + * + *

{@link #isDatabaseDerived()} is {@code true} for the result, which is the point: a caller + * comparing two extents can tell an authority's statement from a WKT document's assertion. + * + *

Returns null for an extent with no bounding box. 18 of the shipped database's 4,314 + * extents publish none, and they are reported as absent rather than as + * {@code (-180, -90, 180, 90)}: a fabricated world extent is indistinguishable from a genuine one + * and would then win every area-of-use ranking. + * + * @param extent the extent row, or null + * @return the area, or null if {@code extent} is null or has no bounding box + */ + static AreaOfUse fromDbExtent(org.locationtech.proj4j.spi.DbExtent extent) { + if (extent == null || !extent.hasBoundingBox()) { + return null; + } + String label = extent.description() != null ? extent.description() : extent.name(); + try { + return new AreaOfUse(extent.westLongitude(), extent.southLatitude(), + extent.eastLongitude(), extent.northLatitude(), label, true); + } catch (IllegalArgumentException notUsable) { + return null; + } + } + + /** + * The western bound in degrees. Greater than {@link #eastLongitude()} iff the box crosses the + * antimeridian. + * + * @return degrees east of Greenwich, in [-180, 180] + */ + public double westLongitude() { + return westLongitude; + } + + /** + * The southern bound in degrees. + * + * @return degrees north of the equator, in [-90, 90] + */ + public double southLatitude() { + return southLatitude; + } + + /** + * The eastern bound in degrees. + * + * @return degrees east of Greenwich, in [-180, 180] + */ + public double eastLongitude() { + return eastLongitude; + } + + /** + * The northern bound in degrees. + * + * @return degrees north of the equator, in [-90, 90] + */ + public double northLatitude() { + return northLatitude; + } + + /** + * A human-readable name for the area, if one was supplied. + * + * @return the description, or null + */ + public String description() { + return description; + } + + /** + * Whether these bounds came from an authority database rather than from a document. + * + *

{@code true} when they were read from a {@link org.locationtech.proj4j.spi.ProjDatabase}'s + * {@code extent} table, {@code false} when a WKT or PROJJSON document asserted them. A caller + * comparing two areas needs to be able to tell an authority's statement from a caller's. + * + * @return true iff the bounds are authority metadata + */ + public boolean isDatabaseDerived() { + return databaseDerived; + } + + /** + * Whether this box crosses the antimeridian, i.e. whether {@code west > east}. + * + * @return true for a box such as {@code west = 176.8, east = -178.4} + */ + public boolean crossesAntimeridian() { + return westLongitude > eastLongitude; + } + + /** + * Whether a geographic coordinate lies inside this box, handling the antimeridian. + * + *

Bounds are inclusive. Note the argument order: longitude first, consistent with the + * rest of this library's default and with GeoJSON, and independent of any + * {@link org.locationtech.proj4j.io.wkt.AxisOrderPolicy}. + * + * @param longitudeDegrees longitude in degrees + * @param latitudeDegrees latitude in degrees + * @return true if the point is inside; false for a non-finite argument + */ + public boolean contains(double longitudeDegrees, double latitudeDegrees) { + if (Double.isNaN(longitudeDegrees) || Double.isNaN(latitudeDegrees)) { + return false; + } + if (latitudeDegrees < southLatitude || latitudeDegrees > northLatitude) { + return false; + } + if (crossesAntimeridian()) { + return longitudeDegrees >= westLongitude || longitudeDegrees <= eastLongitude; + } + return longitudeDegrees >= westLongitude && longitudeDegrees <= eastLongitude; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("west=").append(westLongitude).append(", south=").append(southLatitude) + .append(", east=").append(eastLongitude).append(", north=").append(northLatitude); + if (crossesAntimeridian()) { + sb.append(" (crosses the antimeridian)"); + } + if (description != null) { + sb.append(" -- ").append(description); + } + sb.append(databaseDerived ? " [authority database]" : " [declared by the CRS document]"); + return sb.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof AreaOfUse)) { + return false; + } + AreaOfUse that = (AreaOfUse) o; + return Double.compare(westLongitude, that.westLongitude) == 0 + && Double.compare(southLatitude, that.southLatitude) == 0 + && Double.compare(eastLongitude, that.eastLongitude) == 0 + && Double.compare(northLatitude, that.northLatitude) == 0 + && databaseDerived == that.databaseDerived + && (description == null ? that.description == null + : description.equals(that.description)); + } + + @Override + public int hashCode() { + int h = Double.valueOf(westLongitude).hashCode(); + h = 31 * h + Double.valueOf(southLatitude).hashCode(); + h = 31 * h + Double.valueOf(eastLongitude).hashCode(); + h = 31 * h + Double.valueOf(northLatitude).hashCode(); + h = 31 * h + (description == null ? 0 : description.hashCode()); + return 31 * h + (databaseDerived ? 1 : 0); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/BallparkPolicy.java b/core/src/main/java/org/locationtech/proj4j/api/BallparkPolicy.java new file mode 100644 index 0000000..9680d58 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/BallparkPolicy.java @@ -0,0 +1,93 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import org.locationtech.proj4j.ErrorCause; + +/** + * What to do when the only coordinate operation available between two CRSs is a + * ballpark one — a datum change performed with no parameters and no stated + * accuracy, which is to say a datum change that is not actually performed. + * + *

Why the default rejects

+ * + *

A ballpark transformation produces an entirely plausible coordinate that is wrong by the + * size of the datum shift — tens to hundreds of metres. It cannot be detected downstream: + * the ordinates are finite, they are in the right units, and they are in the right part of the + * world. The only place it can be caught is at planning time, when the operation is + * built, which is why {@link #REJECT} is the default for {@link Proj#createCrsToCrs} and why it + * throws {@link org.locationtech.proj4j.CrsCreationException} with + * {@link ErrorCause#BALLPARK_REJECTED} rather than failing on row 4,000,000. + * + *

There is deliberately no global "allow ballpark" property. Opting in is + * done in code, at one of two granularities: per context ({@link ProjContext.Builder#ballparkPolicy}) + * or per call ({@link Proj#createCrsToCrs(String, String, ProjContext)}). + * + *

How ballpark is computed here

+ * + *

With an authority database, a ballpark candidate is synthesised for a pair whose datums + * differ and for which the authority publishes nothing usable — which is exactly what PROJ + * does, and it is not a gap in the data: there is not one {@code Ballpark geographic offset} row + * anywhere in the shipped database. It is ranked last of all candidates, carries no accuracy, and + * is selected only under {@link #ALLOW}. The corollary matters as much: for + * {@code EPSG:4267 -> EPSG:4269} the authority publishes nine grid transformations and not one + * of them is ballpark, so with a database this policy has nothing to reject there and + * {@code EPSG:1241} is selected at 0.15 m. + * + *

With no database, Proj4J cannot consult that list at all. It computes the same property + * two other ways, both of which are properties of what the engine will actually do — and for + * {@code EPSG:4267 -> EPSG:4269} they do fire, which is why that pair is rejected in a deployment + * without {@code proj4j-db} and selected in one with it. Both answers are right for their deployment: + * + *

    + *
  • Grid-derived. A datum declares a grid shift, and at least one of the grid files it + * declares is absent from every configured resolver. PROJ's {@code @} prefix makes such a grid + * optional and PROJ skips it silently; the shift then does not happen and nothing says so. That + * is the single worst measured defect in this library's history — 95.573 m at San + * Francisco with no warning — and it is reported as ballpark here.
  • + *
  • Legacy-engine-derived. The two datums differ, but the legacy engine's + * {@code datumTransform} would return from one of its early exits for every coordinate, so no + * shift is applied. In practice this is a bare {@code +ellps=} on one side, which + * {@code Datum.getTransformType()} reports as {@code TYPE_UNKNOWN}.
  • + *
+ * + * @see BestOperationPolicy + * @see GridPolicy + * @since 1.5.0 + */ +public enum BallparkPolicy { + + /** + * The default. If every candidate operation is ballpark, refuse to build the + * operation at all: {@link Proj#createCrsToCrs(String, String)} throws + * {@link org.locationtech.proj4j.CrsCreationException} carrying + * {@link ErrorCause#BALLPARK_REJECTED}, and the exception message names the datums and the + * missing grids. + */ + REJECT, + + /** + * Build the operation anyway, and mark it. {@link CrsOperation#isBallparkTransformation()} + * returns {@code true}, {@link CrsOperation#accuracy()} is empty (a ballpark operation never + * has a stated accuracy), {@link CrsOperation#warnings()} says why, and + * {@link CrsOperation#describe()} spells it out. + * + *

This is what the legacy {@link org.locationtech.proj4j.CoordinateTransformFactory} does + * unconditionally and silently, and it is what the gie conformance runner needs, because gie + * exercises ballpark rows explicitly. + */ + ALLOW +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/BestOperationPolicy.java b/core/src/main/java/org/locationtech/proj4j/api/BestOperationPolicy.java new file mode 100644 index 0000000..ae118ca --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/BestOperationPolicy.java @@ -0,0 +1,74 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import org.locationtech.proj4j.ErrorCause; + +/** + * What to do when the best-ranked coordinate operation between two CRSs cannot be executed but a + * worse one can. + * + *

The classic case is a grid: NAD27 to NAD83 (NADCON5) outranks a three-parameter + * Helmert, but needs a grid file that is not on the classpath. Silently using the Helmert is a + * metre-scale change of answer with no signal, so the default refuses. + * + *

PROJ's equivalent knob is {@code PROJ_ONLY_BEST_DEFAULT} / {@code only_best_default} / + * {@code ONLY_BEST}. PROJ defaults it off; Proj4J defaults it on, deliberately: PROJ can + * fetch the missing grid from its CDN, and Proj4J will not, so "degrade quietly" has a very + * different cost here. Proj4J honours no environment variable for this — not + * {@code PROJ_ONLY_BEST_DEFAULT}, not anything else. It is set in code or not at all. + * + *

What "degraded" means, precisely

+ * + *

A selection is degraded iff it is strictly less accurate than a candidate that could not + * be used. That word "strictly" is load-bearing, and the case that forces it is the headline one: + * {@code EPSG:4267} to {@code EPSG:4269} offers {@code EPSG:1241} (NADCON, 0.15 m, which this + * library can execute) and {@code EPSG:8555} (NADCON 5, 0.15 m, whose grid feeds the + * unified {@code +proj=gridshift} operator, which it cannot). They are tied. Refusing a tie + * would make {@link #REQUIRE_BEST} reject that pair outright, which is a worse answer than either + * operation — so a tie is not a degradation, and the skipped candidate is recorded in + * {@link CrsOperation#warnings()} instead. An unknown accuracy against a known one + * is a degradation, because "we do not know" cannot be shown to be as good. + * + *

Two policies have to be conceded to reach the extreme case. Falling all the way back to a + * ballpark offset is the largest degradation there is, so it needs {@link #ALLOW_DEGRADED} + * and {@link BallparkPolicy#ALLOW}; either alone still refuses. + * + *

Without a database there is nothing to rank

+ * + *

With no {@link ProjContext#database()} there is exactly one candidate operation per CRS pair + * — the one the legacy datum model synthesises — so this enum is recorded and has + * nothing to act on. {@link ProjContext#describe()} says which of the two states applies rather than + * letting a caller assume it is being enforced. + * + * @since 1.5.0 + */ +public enum BestOperationPolicy { + + /** + * The default. If a more accurate candidate cannot be executed here, fail with + * {@link ErrorCause#BEST_OPERATION_UNAVAILABLE} rather than quietly selecting a worse one. The + * message names both operations, quantifies the accuracy gap in metres, and names the grid files + * that would unlock the better one. + */ + REQUIRE_BEST, + + /** + * Select the best candidate that can be executed, recording in + * {@link CrsOperation#warnings()} which one was skipped, why, and what accuracy was given up. + */ + ALLOW_DEGRADED +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/Crs.java b/core/src/main/java/org/locationtech/proj4j/api/Crs.java new file mode 100644 index 0000000..6a845bb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/Crs.java @@ -0,0 +1,917 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.io.projjson.ProjJsonWriter; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinitions; +import org.locationtech.proj4j.io.wkt.Identifier; +import org.locationtech.proj4j.io.wkt.WktDialect; +import org.locationtech.proj4j.io.wkt.WktWriter; +import org.locationtech.proj4j.proj.GeocentProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.units.Unit; +import org.locationtech.proj4j.units.Units; + +/** + * A coordinate reference system, with the introspection a caller needs to decide whether to trust + * it. + * + *

Built by {@link Proj#createCrs(String)}, which accepts an {@code authority:code} name, a + * PROJ.4 parameter string, WKT in any of four dialects, or PROJJSON — all of it parsed inside + * this artifact, with no GeoAPI, no Apache SIS, and no other dependency of any kind. + * + *

{@code
+ * Crs crs = Proj.createCrs("EPSG:4267");
+ * if (!crs.missingGrids().isEmpty()) {
+ *     log.warn(crs.describe());          // names each unreachable grid and what it means
+ * }
+ * }
+ * + *

Immutable, shareable, and honest about what it does not know

+ * + *

Every field is final and every returned collection is unmodifiable, so one instance is safe to + * share across any number of threads — which is the property that matters when a cached CRS is + * reached by every executor thread in a Spark task. Grid reachability is resolved once, lazily, and + * memoised; the memo is idempotent, so the race is benign. + * + *

Several accessors return {@link Optional#empty()} and will keep doing so until Proj4J ships a + * CRS database: {@link #areaOfUse()} for anything but a document that declared a bounding box, and + * every authority-derived fact behind it. They are empty rather than approximated. See + * {@link DatabaseInfo}. + * + *

Axis order

+ * + *

{@link #axisOrder()} reports what this CRS actually does, in PROJ's own {@code +axis=} + * three-letter encoding: {@code "enu"} is longitude-then-latitude (or easting-then-northing), and + * {@code "neu"} is latitude-first. The default is {@code "enu"} for everything, exactly as in + * proj4j 1.4.3. {@link #isAxisOrderAuthoritative()} says whether that came from the CRS definition + * or was inferred, and {@link #axisOrderNote()} says which rule was used. Read + * {@link AxisOrderPolicy} before changing the policy: the difference is invisible near + * (0, 0), which is where fixtures live. + * + * @see Proj + * @see CrsOperation + * @see ProjContext + * @since 1.5.0 + */ +public final class Crs { + + /** + * How a {@link Crs} was specified. Retained because it changes what can be known about the + * CRS: a WKT document may declare axes and a bounding box, an {@code authority:code} name + * cannot. + */ + public enum Source { + /** {@code "EPSG:4326"} — resolved against the legacy PROJ.4 {@code +init=} dictionary. */ + AUTHORITY_CODE, + /** {@code "+proj=utm +zone=33 +datum=WGS84"}. */ + PROJ_STRING, + /** WKT1 (OGC or ESRI) or WKT2 (2015 or 2019). */ + WKT, + /** A PROJJSON document. */ + PROJJSON, + /** Adapted from an existing {@link CoordinateReferenceSystem} via {@link LegacyAdapters}. */ + LEGACY_OBJECT + } + + /** + * The grid files PROJ's legacy datum table declares for a {@code +datum=} name, transcribed + * from {@code 9.8.1:src/datums.cpp} — the same source + * {@code org.locationtech.proj4j.datum.Datum}'s static initialiser used. + * + *

Only two of PROJ's built-in datums declare grids at all, and every token in both is + * {@code @}-optional, which is precisely why they need reporting: a deployment with none of + * these files present performs a NAD27 transformation that applies no shift and says nothing. + */ + private static final Map DATUM_GRID_DECLARATIONS; + + static { + Map m = new LinkedHashMap(); + m.put("NAD27", "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat"); + m.put("potsdam", "@BETA2007.gsb"); + DATUM_GRID_DECLARATIONS = Collections.unmodifiableMap(m); + } + + /** + * The {@code +datum=} names that declare grid files, and the token lists they declare. + * Package-private, for {@link Proj#declaredGrids()}. + * + * @return an unmodifiable map; never null + */ + static Map datumGridDeclarations() { + return DATUM_GRID_DECLARATIONS; + } + + private final String definitionText; + private final Source source; + private final ProjContext context; + private final CoordinateReferenceSystem legacy; + private final String[] params; + private final List identifiers; + private final AreaOfUse areaOfUse; + private final WktDialect sourceDialect; + private final boolean axisOrderAuthoritative; + private final String axisOrderNote; + + /** The authority database row this CRS was built from, or null. */ + private final org.locationtech.proj4j.spi.DbCrs authorityRecord; + + /** declaring parameter -> the {@code +nadgrids=}-style token list it implies. */ + private final Map gridDeclarations; + + /** Lazily resolved, then never replaced. See the class javadoc on the benign race. */ + private volatile List gridsMemo; + + Crs(String definitionText, Source source, ProjContext context, + CoordinateReferenceSystem legacy, CrsDefinition definition, + boolean axisOrderAuthoritative, String axisOrderNote) { + this.definitionText = definitionText; + this.source = source; + this.context = context; + this.legacy = legacy; + String[] p = legacy.getParameters(); + this.params = p == null ? null : p.clone(); + this.axisOrderAuthoritative = axisOrderAuthoritative; + this.axisOrderNote = axisOrderNote; + this.identifiers = identifiersOf(definition, source, definitionText); + this.areaOfUse = definition == null ? null + : AreaOfUse.fromWktBbox(definition.getBoundingBox(), + definition.getAreaDescription()); + this.sourceDialect = definition == null ? null : definition.getSourceDialect(); + this.gridDeclarations = gridDeclarationsOf(this.params); + this.authorityRecord = null; + } + + private Crs(String definitionText, ProjContext context, CoordinateReferenceSystem legacy, + org.locationtech.proj4j.spi.DbCrs record, AreaOfUse areaOfUse, + boolean axisOrderAuthoritative, String axisOrderNote) { + this.definitionText = definitionText; + this.source = Source.AUTHORITY_CODE; + this.context = context; + this.legacy = legacy; + String[] p = legacy.getParameters(); + this.params = p == null ? null : p.clone(); + this.axisOrderAuthoritative = axisOrderAuthoritative; + this.axisOrderNote = axisOrderNote; + this.identifiers = Collections.singletonList(record.ref().authorityCode()); + this.areaOfUse = areaOfUse; + this.sourceDialect = null; + this.gridDeclarations = gridDeclarationsOf(this.params); + this.authorityRecord = record; + } + + /** + * Builds a CRS from an authority database row. Package-private; see {@link DatabaseCrsFactory} + * for what it does and does not build. + */ + static Crs fromDatabase(String definitionText, ProjContext context, + CoordinateReferenceSystem legacy, + org.locationtech.proj4j.spi.DbCrs record, AreaOfUse areaOfUse, + boolean axisOrderAuthoritative, String axisOrderNote) { + return new Crs(definitionText, context, legacy, record, areaOfUse, axisOrderAuthoritative, + axisOrderNote); + } + + private static List identifiersOf(CrsDefinition definition, Source source, + String definitionText) { + List ids = new ArrayList(2); + if (definition != null) { + List declared = definition.getIds(); + for (int i = 0; i < declared.size(); i++) { + ids.add(declared.get(i).toString()); + } + } else if (source == Source.AUTHORITY_CODE && definitionText != null) { + ids.add(definitionText); + } + return Collections.unmodifiableList(ids); + } + + /** + * Works out which grid files this CRS's parameters declare, without resolving any of them. + * A pure string operation: cheap enough to run on every CRS, including one built per row from + * untrusted input. + */ + private static Map gridDeclarationsOf(String[] params) { + if (params == null) { + return Collections.emptyMap(); + } + String nadgrids = value(params, "nadgrids"); + if (nadgrids != null) { + // An explicit +nadgrids= replaces whatever the datum declared: Proj4Parser applies + // +datum first and then overwrites the grid list (parseDatum, in that order). + return Collections.singletonMap("+nadgrids=" + nadgrids, nadgrids); + } + String datum = value(params, "datum"); + if (datum != null) { + String declared = DATUM_GRID_DECLARATIONS.get(datum); + if (declared != null) { + return Collections.singletonMap("+datum=" + datum, declared); + } + } + return Collections.emptyMap(); + } + + /** + * The value of a PROJ parameter in an already-parsed list, tolerating both the {@code +key=} + * and the bare {@code key=} spelling. The shipped dictionaries write parameters without the + * leading {@code +}, so matching only on {@code "+key="} silently finds nothing. + */ + private static String value(String[] params, String key) { + for (int i = 0; i < params.length; i++) { + String p = params[i]; + if (p == null) { + continue; + } + int start = p.startsWith("+") ? 1 : 0; + if (p.regionMatches(start, key, 0, key.length()) + && p.length() > start + key.length() + && p.charAt(start + key.length()) == '=') { + return p.substring(start + key.length() + 1); + } + } + return null; + } + + // ---------------------------------------------------------------- identity and definition + + /** + * The name of this CRS: the authority code it was created from, the name a WKT document gave + * it, or a synthesised name for an anonymous PROJ string. + * + * @return the name; never null + */ + public String name() { + return legacy.getName(); + } + + /** + * The text this CRS was created from, verbatim. + * + * @return the definition text; never null + */ + public String definitionText() { + return definitionText; + } + + /** + * How this CRS was specified. + * + * @return the source; never null + */ + public Source source() { + return source; + } + + /** + * Which WKT dialect the source document was written in. + * + * @return the dialect, or empty if this CRS did not come from WKT + */ + public Optional sourceDialect() { + return Optional.ofNullable(sourceDialect); + } + + /** + * The authority identifiers this CRS carries — {@code "EPSG:4326"} — from the code + * it was created from or from a document's {@code ID[]} / {@code AUTHORITY[]} clauses. + * + *

Never invented: a PROJ.4 parameter string that happens to be equivalent to EPSG:4326 is + * not reported as EPSG:4326, because deciding that requires a database and getting it + * wrong attributes an authority's name to a caller's parameters. + * + * @return an unmodifiable list, possibly empty; never null + */ + public List identifiers() { + return identifiers; + } + + /** + * The context whose policies this CRS was built under. + * + * @return the context; never null + */ + public ProjContext context() { + return context; + } + + // ------------------------------------------------------------------------------ rendering + + /** + * This CRS as a PROJ.4 parameter string, each parameter {@code +}-prefixed. + * + *

Round-trips the {@code @} on an optional grid, so {@code +nadgrids=@conus} does not + * quietly become {@code +nadgrids=conus}. + * + * @return the parameter string, or the empty string for a CRS with no parameter list + */ + public String toProjString() { + if (params == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < params.length; i++) { + if (i > 0) { + sb.append(' '); + } + sb.append(params[i]); + } + return sb.toString(); + } + + /** + * This CRS as WKT2:2019. + * + * @return the WKT; never null + * @throws org.locationtech.proj4j.io.wkt.WktParseException if this CRS cannot be expressed as + * WKT + */ + public String toWkt() { + return toWkt(WktDialect.WKT2_2019); + } + + /** + * This CRS as WKT in a chosen WKT2 revision. + * + *

All four dialects are readable; only the two WKT2 revisions are writable. That + * asymmetry is deliberate rather than unfinished. Reading every dialect is what removes the need + * for an Apache SIS fallback, and with it the duplicate {@code org.opengis.util.CodeList} hazard + * that kills Spark executors, so reading is where the value is. Writing WKT1 is a different + * proposition: WKT1 has no way to express several things a CRS here can carry, so a WKT1 writer + * would have to drop them, and a lossy writer that does not say what it dropped is precisely the + * kind of silent degradation this API exists to avoid. Writing WKT2 loses nothing. + * + *

{@link #toProjString()} is the lossless legacy interchange format, and every consumer that + * reads WKT1 also reads a PROJ string. + * + * @param dialect {@link WktDialect#WKT2_2019} or {@link WktDialect#WKT2_2015}; null means + * {@link WktDialect#WKT2_2019} + * @return the WKT; never null + * @throws IllegalArgumentException if {@code dialect} is a WKT1 dialect + * @throws org.locationtech.proj4j.io.wkt.WktParseException if this CRS cannot be expressed as + * WKT + */ + public String toWkt(WktDialect dialect) { + WktDialect d = dialect == null ? WktDialect.WKT2_2019 : dialect; + if (d.isWkt1()) { + throw new IllegalArgumentException("WKT1 (" + d + ") can be read by this library but " + + "not written: WKT1 cannot express everything a CRS here carries, and a writer " + + "that silently dropped the remainder would be worse than no writer. Use " + + "WktDialect.WKT2_2019, or toProjString() for lossless legacy interchange."); + } + return new WktWriter(d).write(CrsDefinitions.fromCrs(legacy)); + } + + /** + * This CRS as a PROJJSON document. + * + * @return the PROJJSON; never null + * @throws org.locationtech.proj4j.io.wkt.WktParseException if this CRS cannot be expressed + */ + public String toProjJson() { + return new ProjJsonWriter().write(CrsDefinitions.fromCrs(legacy)); + } + + // -------------------------------------------------------------------------- classification + + /** + * Whether this is a geographic (longitude/latitude) CRS. + * + * @return true for {@code +proj=longlat} and its equivalents + */ + public boolean isGeographic() { + Projection p = legacy.getProjection(); + return p != null && Boolean.TRUE.equals(p.isGeographic()); + } + + /** + * Whether this is a projected CRS, i.e. neither geographic nor geocentric. + * + * @return true for a CRS whose coordinates are planar + */ + public boolean isProjected() { + return !isGeographic() && !isGeocentric(); + } + + /** + * Whether this is a geocentric Cartesian CRS — {@code +proj=geocent}, whose coordinates + * are earth-centred X, Y, Z in metres rather than a surface position. + * + *

One of the seven calls a downstream consumer asked for by name. A geocentric CRS is the + * case where treating the third ordinate as an optional height is wrong: all three ordinates + * are load-bearing, and dropping Z relocates the point to the centre of the earth. + * + * @return true iff the coordinates are geocentric Cartesian + */ + public boolean isGeocentric() { + Projection p = legacy.getProjection(); + return p instanceof GeocentProjection; + } + + /** + * Whether this CRS's first two ordinates are angles rather than lengths. + * + *

One of the seven calls a downstream consumer asked for by name, and the one that prevents + * the most expensive class of mistake: applying a metre tolerance to a degree value, or a + * degree-to-radian scale to a projected coordinate. The latter inflates a distance by about + * 111,319×, and it has been done. + * + *

True for a geographic CRS, and for any CRS whose declared unit is one of PROJ's three + * angular units. False for a geocentric CRS, whose ordinates are metres. + * + * @return true iff the horizontal ordinates are angular + */ + public boolean isAngular() { + if (isGeocentric()) { + return false; + } + if (isGeographic()) { + return true; + } + Projection p = legacy.getProjection(); + if (p == null) { + return false; + } + Unit unit = p.getUnits(); + for (int i = 0; i < Units.ANGULAR_UNITS.length; i++) { + if (Units.ANGULAR_UNITS[i] == unit || Units.ANGULAR_UNITS[i].equals(unit)) { + return true; + } + } + return false; + } + + /** + * The unit of this CRS's horizontal ordinates. + * + * @return the unit, or empty for a CRS with no projection (the {@code CS_GEO} sentinel) + */ + public Optional unit() { + Projection p = legacy.getProjection(); + return p == null ? Optional.empty() : Optional.ofNullable(p.getUnits()); + } + + /** + * The {@code +proj=} name of this CRS's projection method. + * + * @return the name, for example {@code "lcc"}, or empty for a CRS with no projection + */ + public Optional projectionName() { + Projection p = legacy.getProjection(); + return p == null ? Optional.empty() : Optional.ofNullable(p.getName()); + } + + /** + * The human-readable name of this CRS's projection method, for example + * {@code "Lambert Conformal Conic"}. + * + *

These come from {@link Registry}, which has carried them since 2009 with no accessor. + * + * @return the description, or empty if the registry has none + */ + public Optional projectionDescription() { + Optional name = projectionName(); + return name.isPresent() ? Proj.projectionDescription(name.get()) : Optional.empty(); + } + + /** + * The datum code, for example {@code "NAD27"}. + * + * @return the code, or empty for a CRS with no datum + */ + public Optional datumCode() { + Datum d = legacy.getDatum(); + return d == null ? Optional.empty() : Optional.ofNullable(d.getCode()); + } + + /** + * The datum's human-readable name, for example {@code "North_American_Datum_1927"}. + * + * @return the name, or empty for a CRS with no datum + */ + public Optional datumName() { + Datum d = legacy.getDatum(); + return d == null ? Optional.empty() : Optional.ofNullable(d.getName()); + } + + /** + * The ellipsoid's name. + * + * @return the name, or empty for a CRS with no projection + */ + public Optional ellipsoidName() { + Projection p = legacy.getProjection(); + if (p == null || p.getEllipsoid() == null) { + return Optional.empty(); + } + return Optional.ofNullable(p.getEllipsoid().getName()); + } + + // -------------------------------------------------------------------------------- axis order + + /** + * The axis order this CRS actually uses, in PROJ's {@code +axis=} three-letter encoding. + * + *

One of the seven calls a downstream consumer asked for by name. {@code "enu"} means + * east–north–up: longitude first for a geographic CRS, easting first for a + * projected one, and it is the default for everything, exactly as in proj4j 1.4.3. + * {@code "neu"} means latitude first, which is what PROJ 6+ and {@code cs2cs} do for + * {@code EPSG:4326}. + * + *

The encoding is PROJ's own and is stable: one character per axis from + * {@code e w n s u d}. It is returned rather than a bespoke enum precisely so that the answer + * can be pasted straight back into a PROJ string. + * + * @return three characters from {@code "ewnsud"}; never null + */ + public String axisOrder() { + String axis = params == null ? null : value(params, "axis"); + return axis == null ? "enu" : axis; + } + + /** + * Whether {@link #axisOrder()} is what the CRS definition said, as opposed to what Proj4J + * inferred. + * + *

{@code true} when a WKT or PROJJSON document declared its axes, or when the PROJ string + * carried an explicit {@code +axis=}. {@code false} when the order was inferred — which + * is the case for every {@code authority:code} lookup, because authority axis order is + * database metadata and there is no database. {@link #axisOrderNote()} states the rule that + * was applied. + * + * @return true iff the axis order came from the definition + */ + public boolean isAxisOrderAuthoritative() { + return axisOrderAuthoritative; + } + + /** + * In one sentence, where {@link #axisOrder()} came from. + * + * @return the note; never null, never empty + */ + public String axisOrderNote() { + return axisOrderNote; + } + + /** + * Whether this CRS takes and returns latitude before longitude. + * + * @return true iff {@link #axisOrder()} puts a north/south axis first + */ + public boolean isLatitudeFirst() { + char first = axisOrder().charAt(0); + return first == 'n' || first == 's' || first == 'N' || first == 'S'; + } + + /** + * A copy of this CRS built under a different axis order policy. + * + *

Re-parses the original definition text, so nothing is transposed in place and the original + * remains valid and unchanged. + * + * @param policy the policy; null means {@link AxisOrderPolicy#LEGACY} + * @return a new CRS, or {@code this} if the policy is already in force + */ + public Crs withAxisOrderPolicy(AxisOrderPolicy policy) { + ProjContext next = context.withAxisOrderPolicy(policy); + if (next == context || definitionText == null || definitionText.trim().isEmpty()) { + return this; + } + return Proj.createCrs(definitionText, next); + } + + /** + * A copy of this CRS built under a different context. + * + * @param newContext the context; null means {@link Proj#defaultContext()} + * @return a new CRS, or {@code this} if the context is already in force + */ + public Crs withContext(ProjContext newContext) { + ProjContext next = newContext == null ? Proj.defaultContext() : newContext; + if (next.equals(context) || definitionText == null || definitionText.trim().isEmpty()) { + return this; + } + return Proj.createCrs(definitionText, next); + } + + // ------------------------------------------------------------------------------------ grids + + /** + * Every grid file this CRS declares, whether or not it can be found. + * + *

Resolved once, lazily, and memoised, so a CRS created and never transformed does no grid + * I/O and a CRS used for a million rows does it once. + * + * @return an unmodifiable list, in declaration order; never null + */ + public List grids() { + List memo = gridsMemo; + if (memo == null) { + memo = resolveGrids(); + gridsMemo = memo; + } + return memo; + } + + private List resolveGrids() { + if (gridDeclarations.isEmpty()) { + return Collections.emptyList(); + } + List out = new ArrayList(); + for (Map.Entry e : gridDeclarations.entrySet()) { + List refs = Grid.describeNadGrids(e.getValue()); + for (int i = 0; i < refs.size(); i++) { + out.add(GridInfo.fromGridRef(refs.get(i), e.getKey())); + } + } + return Collections.unmodifiableList(out); + } + + /** + * The grid files this CRS declares, by name, including the {@code @} of an optional one. + * + * @return an unmodifiable list; never null + */ + public List requiredGrids() { + List all = grids(); + List names = new ArrayList(all.size()); + for (int i = 0; i < all.size(); i++) { + names.add((all.get(i).isOptional() ? "@" : "") + all.get(i).name()); + } + return Collections.unmodifiableList(names); + } + + /** + * The grid files this CRS declares and no configured resolver can find. + * + *

A non-empty result means a datum shift will not be applied. Under PROJ's + * {@code @}-optional semantics that is silent, and the coordinate that comes out is wrong by + * the size of the shift and entirely plausible — 95.573 m at San Francisco, measured. + * This list, {@link #describe()} and {@link GridPolicy} exist so that it is not silent here. + * + * @return an unmodifiable list; never null, and empty is the good case + */ + public List missingGrids() { + List all = grids(); + List missing = new ArrayList(); + for (int i = 0; i < all.size(); i++) { + if (!all.get(i).isAvailable()) { + missing.add(all.get(i)); + } + } + return Collections.unmodifiableList(missing); + } + + /** + * Whether this CRS's datum declares a grid shift that will not be fully applied, because at + * least one declared grid is unreachable. + * + * @return true iff {@link #missingGrids()} is non-empty + */ + public boolean hasUnreachableGrids() { + return !missingGrids().isEmpty(); + } + + // ----------------------------------------------------------------------------- area of use + + /** + * The extent over which this CRS is declared valid. + * + *

Three sources, and {@link AreaOfUse#isDatabaseDerived()} distinguishes them: + *

    + *
  • the authority database's {@code extent} table, when this CRS was resolved from one + * — {@code isDatabaseDerived()} is true;
  • + *
  • a WKT2 {@code BBOX[]} or a PROJJSON {@code bbox} the caller supplied — + * {@code isDatabaseDerived()} is false;
  • + *
  • nothing, in which case this is empty.
  • + *
+ * + *

Never guessed from projection parameters. A plausible bounding box invented from a + * {@code +lat_0} would be exactly the kind of answer this API exists to avoid, and it would then + * win every area-of-use ranking. + * + *

When the authority declares several usages this is the smallest by ranking area, ties broken + * on the extent code; {@link #authorityExtents()} returns all of them. + * + * @return the area of use, or empty + */ + public Optional areaOfUse() { + return Optional.ofNullable(areaOfUse); + } + + /** + * Every extent the authority declares for this CRS, smallest first. + * + *

An object may declare more than one usage. Empty when this CRS did not come from an authority + * database, or when none of its extents publishes a bounding box. + * + * @return an unmodifiable list, smallest first; never null + */ + public List authorityExtents() { + if (authorityRecord == null || !context.hasDatabase()) { + return Collections.emptyList(); + } + return Collections.unmodifiableList( + DatabaseCrsFactory.extentsAsAreas(context.database(), authorityRecord.ref())); + } + + /** + * The authority database row this CRS was built from. + * + *

Present only for a CRS the database resolved — not for one the legacy PROJ.4 + * dictionary resolved under the same code, because those parameters come from the dictionary and + * attributing them to the database would misstate where the numbers came from. The dictionary + * stays authoritative for every code it knows, so that adding {@code proj4j-db} cannot move a + * coordinate that already worked. + * + * @return the row, or empty + */ + public Optional authorityRecord() { + return Optional.ofNullable(authorityRecord); + } + + /** + * Whether this CRS's definition was read from an authority database rather than from the legacy + * dictionary or from a caller's document. + * + * @return true iff {@link #authorityRecord()} is present + */ + public boolean isDatabaseDerived() { + return authorityRecord != null; + } + + // --------------------------------------------------------------------------- interoperation + + /** + * This CRS as the legacy {@link CoordinateReferenceSystem} the 1.x API uses. + * + *

A fresh instance each call, rebuilt from the parameter list, never the object this + * {@code Crs} holds. That is deliberate and not merely defensive: {@code proj4j-geoapi}'s + * parameter wrappers write back into a live {@link Projection}, so handing out the internal one + * would let a caller mutate a shared, supposedly immutable CRS. The one exception is a CRS with + * no parameter list to rebuild from, where the held instance is returned and this javadoc is + * the warning. + * + * @return a legacy CRS; never null + */ + public CoordinateReferenceSystem asLegacy() { + if (params == null) { + return legacy; + } + return new CRSFactory().createFromParameters(legacy.getName(), params.clone()); + } + + /** + * The internal legacy CRS, without copying. Package-private: only {@link CrsOperation} and + * {@link LegacyAdapters} may see it, and neither mutates it. + */ + CoordinateReferenceSystem legacy() { + return legacy; + } + + // ---------------------------------------------------------------------------------- describe + + /** + * Everything this object knows about the CRS, and everything it deliberately does not, as + * multi-line text meant for a log or an error report. + * + *

One of the seven calls a downstream consumer asked for by name. It states the axis order + * and where that came from, the projection and datum, every declared grid with its + * reachability, and the area of use or the reason there is none. A CRS with an unreachable grid + * says so in words, because that is the failure a coordinate cannot reveal. + * + * @return the description, newline-terminated; never null + */ + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append("CRS ").append(name()).append('\n'); + sb.append(" source = ").append(source); + if (sourceDialect != null) { + sb.append(" (").append(sourceDialect).append(')'); + } + sb.append('\n'); + sb.append(" definition = ").append(definitionText).append('\n'); + sb.append(" proj string = ").append(toProjString()).append('\n'); + if (!identifiers.isEmpty()) { + sb.append(" identifiers = ").append(identifiers).append('\n'); + } + sb.append(" kind = ") + .append(isGeocentric() ? "geocentric Cartesian" + : isGeographic() ? "geographic" : "projected") + .append(" isAngular=").append(isAngular()).append('\n'); + if (projectionName().isPresent()) { + sb.append(" projection = +proj=").append(projectionName().get()); + if (projectionDescription().isPresent()) { + sb.append(" (").append(projectionDescription().get()).append(')'); + } + sb.append('\n'); + } + if (datumCode().isPresent()) { + sb.append(" datum = ").append(datumCode().get()); + if (datumName().isPresent()) { + sb.append(" (").append(datumName().get()).append(')'); + } + sb.append('\n'); + } + if (ellipsoidName().isPresent()) { + sb.append(" ellipsoid = ").append(ellipsoidName().get()).append('\n'); + } + if (unit().isPresent()) { + sb.append(" unit = ").append(unit().get()).append('\n'); + } + sb.append(" axisOrder = ").append(axisOrder()) + .append(isLatitudeFirst() ? " (latitude first)" : " (longitude first)") + .append(axisOrderAuthoritative ? " [declared]" : " [inferred]").append('\n'); + sb.append(" ").append(axisOrderNote).append('\n'); + if (authorityRecord != null) { + sb.append(" authorityRecord = ").append(authorityRecord).append('\n'); + } + sb.append(" areaOfUse = ").append(areaOfUse != null ? areaOfUse.toString() + : context.hasDatabase() + ? " -- the authority declares no usage for this object, or its extent " + + "publishes no bounding box; it is not guessed" + : " -- area of use is authority metadata and no CRS database is " + + "configured (ProjContext.Builder.database(..)); it is not guessed") + .append('\n'); + + List all = grids(); + if (all.isEmpty()) { + sb.append(" grids = none declared\n"); + } else { + List missing = missingGrids(); + sb.append(" grids = ").append(all.size()).append(" declared, ") + .append(all.size() - missing.size()).append(" reachable, ") + .append(missing.size()).append(" UNREACHABLE\n"); + for (int i = 0; i < all.size(); i++) { + sb.append(" ").append(all.get(i).describe()).append('\n'); + } + if (!missing.isEmpty()) { + sb.append(" WARNING: this CRS declares a datum shift that cannot be fully " + + "applied. The coordinates it produces will be wrong by the size of the " + + "missing shift -- finite, plausible, and undetectable downstream. Under " + + "GridPolicy.").append(context.gridPolicy()) + .append(" the new API reports this; the legacy API skips the grid " + + "silently, exactly as 1.4.3 did.\n"); + } + } + sb.append(" context = ").append(context).append('\n'); + return sb.toString(); + } + + @Override + public String toString() { + return "Crs[" + name() + ", axisOrder=" + axisOrder() + ", " + source + "]"; + } + + /** + * Equal iff the underlying coordinate reference systems and the governing context are equal. + * The definition text is not compared: the same CRS written as WKT and as a PROJ + * string is the same CRS. + * + * @param o the other object + * @return true if equal + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Crs)) { + return false; + } + Crs that = (Crs) o; + return legacy.equals(that.legacy) && context.equals(that.context); + } + + @Override + public int hashCode() { + return 31 * legacy.hashCode() + context.hashCode(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/CrsOperation.java b/core/src/main/java/org/locationtech/proj4j/api/CrsOperation.java new file mode 100644 index 0000000..2053e7b --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/CrsOperation.java @@ -0,0 +1,739 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.BulkCoordinateTransform; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Datum; + +/** + * A ready-to-use transformation from one {@link Crs} to another, together with everything a caller + * needs to decide whether to trust its output. + * + *

Built by {@link Proj#createCrsToCrs(String, String)}, which refuses to build one it cannot + * vouch for: if the only available datum change is a ballpark one, creation throws + * {@link CrsCreationException} with {@link ErrorCause#BALLPARK_REJECTED}. That is the single most + * important behavioural difference from {@link org.locationtech.proj4j.CoordinateTransformFactory}, + * and the reason is arithmetic rather than aesthetic: a wrong answer here is finite, plausible, + * in the right units and in the right part of the world, so the only place it can be caught is + * before the first row. + * + *

{@code
+ * // Planning: throws now, on this line, if the answer would be untrustworthy.
+ * CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633");
+ *
+ * // Per row: thread-safe, allocation-free in the bulk form.
+ * BulkCoordinateTransform bulk = op.bulk();
+ * bulk.transform2D(xy, 0, numVertices, 2, status);
+ * }
+ * + *

Fail-closed

+ * + *

For every method here that produces coordinates, exactly one of two things happens: it returns + * normally and every meaningful ordinate is finite, or it throws {@link CrsTransformException} with + * a non-null {@link CrsTransformException#cause()}. There is no sentinel. {@code NaN}, + * ±{@code Infinity}, the input coordinate and the projection's false easting are never used + * to signal failure. The one documented exception is + * {@link org.locationtech.proj4j.DomainErrorPolicy#RETURN_NAN}, which a caller must ask for by name + * and which substitutes one detectable sentinel for the four undetectable ones 1.4.3 used. + * + *

Thread safety

+ * + *

This object is immutable and safe to share across any number of threads, which is the + * property a per-vertex consumer depends on most: one cached operation, reached by every executor + * thread. {@link #transform(ProjCoordinate, ProjCoordinate)} is reentrant provided the caller does + * not share the {@code src} and {@code dst} objects between threads — those are the caller's, + * and {@link ProjCoordinate} is thread-confined as it always was. There is no + * last-used-operation cache on this object, so candidate selection cannot leak state between + * threads. + * + * @see Proj#createCrsToCrs(String, String) + * @see BulkCoordinateTransform + * @see BallparkPolicy + * @since 1.5.0 + */ +public final class CrsOperation { + + private final Crs source; + private final Crs target; + private final ProjContext context; + private final BasicCoordinateTransform transform; + private final boolean ballpark; + private final String ballparkReason; + private final List warnings; + private final List missingGrids; + private final CrsOperationCandidate selected; + private final List candidates; + + private CrsOperation(Crs source, Crs target, ProjContext context, + BasicCoordinateTransform transform, boolean ballpark, + String ballparkReason, List warnings, + List missingGrids, CrsOperationCandidate selected, + List candidates) { + this.source = source; + this.target = target; + this.context = context; + this.transform = transform; + this.ballpark = ballpark; + this.ballparkReason = ballparkReason; + this.warnings = Collections.unmodifiableList(warnings); + this.missingGrids = Collections.unmodifiableList(missingGrids); + this.selected = selected; + this.candidates = Collections.unmodifiableList(candidates); + } + + /** + * Analyses the CRS pair, selects an operation, applies the policies, and either builds the + * operation or refuses to. + * + *

Two routes, and which one is taken is a property of the {@link ProjContext}, not of the + * classpath: + *

    + *
  • With an authority database ({@link ProjContext#database()} non-null), the operations + * the authority actually published are enumerated in both directions, ranked, and + * filtered by policy — see {@link Proj#candidateOperations(Crs, Crs)}. {@code EPSG:4267} to + * {@code EPSG:4269} has nine of them, not one of which is ballpark, and it selects + * {@code EPSG:1241} "NAD27 to NAD83 (1)" at 0.15 m.
  • + *
  • Without one, there is nothing to enumerate, and the legacy datum model's single + * synthesised operation is assessed by the two ballpark rules that need no database. For + * {@code EPSG:4267 -> EPSG:4269} that is still {@link ErrorCause#BALLPARK_REJECTED}, which + * remains the right answer when the authority's offer cannot be seen.
  • + *
+ * + * @param source the source CRS + * @param target the target CRS + * @param context the governing policies + * @return the operation; never null + * @throws CrsCreationException with {@link ErrorCause#BALLPARK_REJECTED}, + * {@link ErrorCause#BEST_OPERATION_UNAVAILABLE}, + * {@link ErrorCause#UNSUPPORTED_OPERATION_METHOD}, + * {@link ErrorCause#MISSING_GRID} or + * {@link ErrorCause#NO_OPERATION_AVAILABLE}, according to why no + * candidate could be selected + */ + static CrsOperation create(Crs source, Crs target, ProjContext context) { + List warnings = new ArrayList(); + List missing = new ArrayList(); + collectMissing(source, "source", missing, warnings); + collectMissing(target, "target", missing, warnings); + + if (context.axisOrderPolicy() != org.locationtech.proj4j.io.wkt.AxisOrderPolicy.LEGACY) { + if (!source.isAxisOrderAuthoritative() || !target.isAxisOrderAuthoritative()) { + warnings.add("axis order is not declared by at least one of these CRS definitions, " + + "so it was inferred: source " + source.axisOrder() + " (" + + source.axisOrderNote() + "), target " + target.axisOrder() + " (" + + target.axisOrderNote() + ")"); + } + } + + if (context.hasDatabase()) { + OperationSelector.Selection selection = OperationSelector.select( + context.database(), source, target, context); + if (!selection.databaseCannotSeeThisPair()) { + return fromSelection(source, target, context, selection, warnings, missing); + } + warnings.add("the authority database has no entry for at least one of these CRSs (" + + describeIdentity(source) + " -> " + describeIdentity(target) + "), so real " + + "operation selection was not possible and the legacy datum model was used " + + "instead. Accuracy and area of use are reported as absent rather than " + + "estimated."); + } + return fromLegacyDatumModel(source, target, context, warnings, missing); + } + + private static String describeIdentity(Crs crs) { + if (!crs.identifiers().isEmpty()) { + return crs.identifiers().toString(); + } + return crs.source() + " \"" + crs.name() + "\""; + } + + /** + * Builds from a database-backed selection, or throws with the cause the selector determined. + * + *

The consistency gate is the important part of this method. Selection says which + * published operation applies; the engine that actually moves coordinates is + * {@link BasicCoordinateTransform}, which reaches a grid shift through the datum model's own + * {@code +nadgrids=} list. If those two disagree about whether any shift happens at all, this + * class would report 0.15 m accuracy over a coordinate that had no shift applied — the + * 95.573 m defect with a confident number attached to it, which is strictly worse than the + * original. So the agreement is checked, and a disagreement refuses or warns. + */ + private static CrsOperation fromSelection(Crs source, Crs target, ProjContext context, + OperationSelector.Selection selection, + List warnings, List missing) { + warnings.addAll(selection.warnings()); + + if (selection.failureCause() != null) { + throw new CrsCreationException(selection.failureCause(), selection.failureMessage()); + } + if (selection.noDatumChange()) { + BasicCoordinateTransform identityDatum = new BasicCoordinateTransform(source.legacy(), + target.legacy(), context.domainErrorPolicy()); + return new CrsOperation(source, target, context, identityDatum, false, null, warnings, + missing, null, selection.candidates()); + } + CrsOperationCandidate chosen = selection.selected(); + + List allMissing = new ArrayList(missing); + allMissing.addAll(chosen.missingGrids()); + + String engineMismatch = engineDisagreement(source, target, chosen); + if (engineMismatch != null) { + if (context.gridPolicy() == GridPolicy.REQUIRE_ALL) { + throw new CrsCreationException(ErrorCause.MISSING_GRID, engineMismatch); + } + warnings.add(engineMismatch); + } + + boolean isBallpark = chosen.isBallpark(); + String reason = isBallpark ? chosen.rejectionReason().orElse(null) : null; + BasicCoordinateTransform bct = new BasicCoordinateTransform(source.legacy(), + target.legacy(), context.domainErrorPolicy()); + return new CrsOperation(source, target, context, bct, isBallpark, reason, warnings, + allMissing, chosen, selection.candidates()); + } + + /** + * Whether the transformation engine would fail to apply the shift the selected candidate + * promises, and if so exactly how — naming both what selection chose and what the engine + * can reach. + * + * @return the disagreement, or null when selection and execution agree + */ + private static String engineDisagreement(Crs source, Crs target, + CrsOperationCandidate chosen) { + if (chosen.grids().isEmpty()) { + // A parameterised operation: the engine applies the datum model's own +towgs84. Whether + // its parameters equal the selected candidate's is a separate question, reported by + // accuracy() and by describe(), not by this gate. + return null; + } + List reachable = new ArrayList(); + collectReachable(source, reachable); + collectReachable(target, reachable); + if (reachable.isEmpty()) { + return "selection chose " + chosen.authorityCode() + " (" + chosen.name() + + "), whose grid file resolves, but the transformation engine reaches a grid " + + "shift through the datum model's own +nadgrids= list and not one of those " + + "files is reachable. It would apply NO shift at all while this operation " + + "reported " + + (chosen.accuracy().isPresent() + ? chosen.accuracy().get().metres() + " m accuracy" + : "a published operation") + + " -- the same silent metre-scale error as before, with a confident number " + + "attached to it. Refusing.\n" + + " selected operation needs : " + describeGridNames(chosen) + "\n" + + " engine can reach : nothing\n" + + "Add a grid file under one of the names the datum model uses, or set " + + "GridPolicy.WARN to proceed with this stated in warnings()."; + } + for (int i = 0; i < chosen.grids().size(); i++) { + List probed = chosen.grids().get(i).probedNames(); + for (int j = 0; j < probed.size(); j++) { + if (reachable.contains(probed.get(j))) { + return null; + } + } + } + return "selection chose " + chosen.authorityCode() + " (" + chosen.name() + + "), but the transformation engine will use a different grid: the datum model's " + + "reachable files are " + reachable + " and the selected operation's are " + + describeGridNames(chosen) + ". A shift IS applied, so the coordinate is not left " + + "unshifted, but it is the shift of a different published operation than the one " + + "named here."; + } + + private static String describeGridNames(CrsOperationCandidate chosen) { + StringBuilder sb = new StringBuilder("["); + for (int i = 0; i < chosen.grids().size(); i++) { + if (i > 0) { + sb.append(", "); + } + sb.append(chosen.grids().get(i).name()).append(" (tried ") + .append(chosen.grids().get(i).probedNames()).append(')'); + } + return sb.append(']').toString(); + } + + private static void collectReachable(Crs crs, List into) { + List grids = crs.grids(); + for (int i = 0; i < grids.size(); i++) { + if (grids.get(i).isAvailable()) { + into.add(grids.get(i).name()); + } + } + } + + /** + * The pre-database path, unchanged: the legacy datum model synthesises one operation and the two + * database-free ballpark rules decide whether to vouch for it. + */ + private static CrsOperation fromLegacyDatumModel(Crs source, Crs target, ProjContext context, + List warnings, + List missing) { + String ballparkReason = ballparkReason(source, target, context, missing); + boolean ballpark = ballparkReason != null; + + if (ballpark && context.ballparkPolicy() == BallparkPolicy.REJECT) { + throw new CrsCreationException(ErrorCause.BALLPARK_REJECTED, message(source, target, + ballparkReason, missing)); + } + if (ballpark) { + warnings.add("BALLPARK: " + ballparkReason); + } + BasicCoordinateTransform bct = new BasicCoordinateTransform(source.legacy(), + target.legacy(), context.domainErrorPolicy()); + return new CrsOperation(source, target, context, bct, ballpark, ballparkReason, warnings, + missing, null, Collections.emptyList()); + } + + private static void collectMissing(Crs crs, String role, List missing, + List warnings) { + List m = crs.missingGrids(); + for (int i = 0; i < m.size(); i++) { + missing.add(m.get(i)); + warnings.add("the " + role + " CRS declares grid " + m.get(i).name() + + " and no configured resolver can find it: " + m.get(i).describe()); + } + Datum d = crs.legacy().getDatum(); + if (!m.isEmpty() && d != null && d.hasTransformToWGS84()) { + warnings.add("the " + role + " CRS falls back from its declared grid shift to a " + + "parameterised Helmert transformation, which is what PROJ does too, but it is " + + "less accurate than the grid it replaces"); + } + } + + /** + * Why this pair is ballpark, or {@code null} if it is not. + * + *

Two of the three rules from the design apply without a CRS database. The third + * — PROJ's synthesised no-parameter operations, read from {@code proj.db} — cannot + * be evaluated here and is not pretended to be. + */ + private static String ballparkReason(Crs source, Crs target, ProjContext context, + List missing) { + Datum s = source.legacy().getDatum(); + Datum t = target.legacy().getDatum(); + if (s == null || t == null) { + return null; + } + if (s == t || s.isEqual(t)) { + // Same datum: there is no datum change to be ballpark about. + return null; + } + int st = s.getTransformType(); + int tt = t.getTransformType(); + + // (c) legacy-engine-derived: the engine's datum stage returns from an early exit for every + // coordinate, so the datums differ and nothing is done about it. In the shipped engine that + // is the unknown-datum exit, i.e. a bare +ellps= with no +datum and no +towgs84. + if (st == Datum.TYPE_UNKNOWN || tt == Datum.TYPE_UNKNOWN) { + return "the datums differ (" + s.getCode() + " -> " + t.getCode() + ") but " + + (st == Datum.TYPE_UNKNOWN ? "the source" : "the target") + + " datum has no transformation to WGS 84 and no grid, so the engine would " + + "apply no datum shift at all. The coordinate would be out by the size of " + + "the shift, and would look perfectly reasonable."; + } + + // (b) grid-derived: a declared grid is unreachable and there is no non-grid fallback, so + // the shift silently does not happen. This is the 95.573 m at San Francisco. + if (!missing.isEmpty() && context.gridPolicy() == GridPolicy.REQUIRE_ALL) { + boolean sourceCanFallBack = st != Datum.TYPE_GRIDSHIFT || s.hasTransformToWGS84(); + boolean targetCanFallBack = tt != Datum.TYPE_GRIDSHIFT || t.hasTransformToWGS84(); + boolean sourceMissing = !source.missingGrids().isEmpty() && !sourceCanFallBack; + boolean targetMissing = !target.missingGrids().isEmpty() && !targetCanFallBack; + if (sourceMissing || targetMissing) { + StringBuilder sb = new StringBuilder(); + sb.append("the datums differ (").append(s.getCode()).append(" -> ") + .append(t.getCode()).append(") and the declared grid shift cannot be " + + "performed: "); + for (int i = 0; i < missing.size(); i++) { + if (i > 0) { + sb.append(", "); + } + sb.append(missing.get(i).name()); + } + sb.append(" unreachable, with no parameterised fallback. PROJ's @ prefix makes " + + "this silent; here it is not."); + return sb.toString(); + } + } + return null; + } + + private static String message(Crs source, Crs target, String reason, List missing) { + StringBuilder sb = new StringBuilder(); + sb.append("refusing to build ").append(source.name()).append(" -> ").append(target.name()) + .append(": it would be a ballpark transformation. ").append(reason); + if (!missing.isEmpty()) { + sb.append("\nUnreachable grids:"); + for (int i = 0; i < missing.size(); i++) { + sb.append("\n ").append(missing.get(i).describe()); + } + } + sb.append("\nTo proceed anyway, and record that you did: ProjContext.builder()" + + ".ballparkPolicy(BallparkPolicy.ALLOW).build(). To fix it, put the grid on the " + + "classpath. To reproduce proj4j 1.4.3 exactly, use " + + "CoordinateTransformFactory, which is unchanged and will not be changed."); + return sb.toString(); + } + + // ------------------------------------------------------------------------------- accessors + + /** + * The source CRS. + * + * @return the source; never null + */ + public Crs source() { + return source; + } + + /** + * The target CRS. + * + * @return the target; never null + */ + public Crs target() { + return target; + } + + /** + * The context whose policies this operation was built under. + * + * @return the context; never null + */ + public ProjContext context() { + return context; + } + + /** + * Whether this operation performs a datum change it cannot actually carry out. + * + *

Under the default {@link BallparkPolicy#REJECT} this is always {@code false}, + * because such an operation is refused at creation rather than returned flagged. It can be + * {@code true} only for an operation the caller explicitly asked for with + * {@link BallparkPolicy#ALLOW}. + * + * @return true iff this is a ballpark transformation + */ + public boolean isBallparkTransformation() { + return ballpark; + } + + /** + * Why this operation is ballpark. + * + * @return the reason, or empty if it is not ballpark + */ + public Optional ballparkReason() { + return Optional.ofNullable(ballparkReason); + } + + /** + * The stated accuracy of this operation, in metres. + * + *

Present when an authority database selected a published operation that carries one: 0.15 m + * for {@code EPSG:1241}, 1.0 m for {@code EPSG:7710}, 2.0 m for the WGS 84 ensemble + * offsets. Empty in three cases, all of them meaning "the figure does not exist", never "zero": + * + *

    + *
  • no {@link ProjContext#database()}, so there is no authority metadata to read;
  • + *
  • the pair needs no datum change at all, so there is no operation whose accuracy could be + * quoted;
  • + *
  • the operation is ballpark, for which PROJ assigns no accuracy either — that absence + * is permanent and structural, not a gap.
  • + *
+ * + *

Never {@code 0.0} and never estimated: "we do not know" and "sub-metre" are different + * claims, and conflating them is how an unshifted datum comes to look like an exact one. + * + * @return the accuracy, or empty + * @see Accuracy + * @see #selectedOperation() + */ + public Optional accuracy() { + return selected == null ? Optional.empty() : selected.accuracy(); + } + + /** + * The published operation this transformation was selected from. + * + *

{@code EPSG:1241}, "NAD27 to NAD83 (1)", 0.15 m — the answer to the question the + * consumer actually asked, which is not "did it work" but "which of the authority's nine + * transformations am I getting". Empty when no authority database was configured, or when the + * pair needs no datum change. + * + * @return the selected candidate, or empty + * @see #candidates() + */ + public Optional selectedOperation() { + return Optional.ofNullable(selected); + } + + /** + * Every operation the authority publishes between these two CRSs, ranked best first, including + * the ones that were rejected and why. + * + *

Empty without an authority database, because the legacy datum model synthesises exactly one + * operation per CRS pair and there is nothing to enumerate. With one, this is nine entries plus a + * synthesised ballpark for {@code EPSG:4267 -> EPSG:4269} — the offer that Proj4J + * historically could not see. + * + * @return an unmodifiable list in ranking order; never null + * @see Proj#candidateOperations(Crs, Crs) + */ + public List candidates() { + return candidates; + } + + /** + * The extent over which the authority declares the selected operation valid. + * + *

{@link AreaOfUse#isDatabaseDerived()} is {@code true} for this, unlike a bounding box a WKT + * document asserted. Empty without a database, and empty for an operation whose extent publishes + * no bounding box — 18 of the shipped database's extents do not, and they are reported as + * absent rather than as the whole world. + * + * @return the area of use, or empty + */ + public Optional areaOfUse() { + return selected == null ? Optional.empty() : selected.areaOfUse(); + } + + /** + * The grid files either CRS declares and no configured resolver can find. + * + * @return an unmodifiable list; never null, and empty is the good case + */ + public List missingGrids() { + return missingGrids; + } + + /** + * Everything about this operation that a caller ought to know but that no coordinate will + * reveal: unreachable grids, a fallback from a grid to a Helmert, a ballpark datum change that + * was allowed, an axis order that had to be inferred. + * + *

Fixed at creation and never appended to, so reading it does not race with using the + * operation. + * + * @return an unmodifiable list; never null, and empty is the good case + */ + public List warnings() { + return warnings; + } + + // ------------------------------------------------------------------------------ transforming + + /** + * Transforms one coordinate. + * + *

{@code src} and {@code dst} may be the same object. Every meaningful ordinate of a + * successful result is finite; see the class javadoc on fail-closed. + * + * @param src the input coordinate + * @param dst the output coordinate, which is also the return value + * @return {@code dst} + * @throws CrsTransformException with a non-null {@link CrsTransformException#cause()} if this + * coordinate cannot be transformed + */ + public ProjCoordinate transform(ProjCoordinate src, ProjCoordinate dst) { + return transform.transform(src, dst); + } + + /** + * Transforms one coordinate into a fresh {@link ProjCoordinate}. + * + *

Convenient, and allocating; {@link #bulk()} is the per-vertex path. + * + * @param src the input coordinate + * @return a new coordinate in the target CRS + * @throws CrsTransformException if this coordinate cannot be transformed + */ + public ProjCoordinate transform(ProjCoordinate src) { + return transform.transform(src, new ProjCoordinate()); + } + + /** + * This same operation, typed as the allocation-free batch API. + * + *

The batch path transforms many points per call out of a caller-owned {@code double[]}, + * allocating nothing in steady state on any number of threads — measured at + * 0.001 B/op and verified bitwise identical to the single-point path. It is the same + * object, so there is no second engine to keep in step and no second set of results to + * reconcile. + * + *

{@code
+     * BulkCoordinateTransform bulk = op.bulk();
+     * byte[] status = new byte[maxVertices];        // caller-owned, reused per geometry
+     * if (bulk.transform2D(xy, 0, numVertices, 2, status) != 0) {
+     *     return emptyGeometry();
+     * }
+     * }
+ * + * @return the bulk view of this operation; never null + * @see BulkCoordinateTransform + */ + public BulkCoordinateTransform bulk() { + return transform; + } + + /** + * The reverse operation, target to source. + * + *

This is a CRS swap, not an analytic inverse. It is built by asking for an operation + * from {@link #target()} to {@link #source()} under the same context, so it is subject to the + * same ballpark and grid checks and may throw for the same reasons — which is the correct + * behaviour, and is why this is a method rather than a cached field. + * + * @return the reverse operation; never null + * @throws CrsCreationException if the reverse direction is not one this context will vouch for + */ + public CrsOperation inverse() { + return Proj.createCrsToCrs(target, source, context); + } + + /** + * This operation as the legacy {@link CoordinateTransform} the 1.x API uses, for handing to code + * that already implements or consumes that interface — {@code proj4j-geoapi}, GeoTools. + * + *

The returned object is the same engine, so its numbers are identical. What it does + * not carry is this class's introspection: a caller holding only the interface cannot + * ask whether a grid was missing. Keep this object too if that matters. + * + * @return the legacy transform; never null + */ + public CoordinateTransform asLegacy() { + return transform; + } + + // ---------------------------------------------------------------------------------- describe + + /** + * Everything this operation knows and everything it deliberately does not, as multi-line text + * for a log or an error report. + * + * @return the description, newline-terminated; never null + */ + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append("CrsOperation ").append(source.name()).append(" -> ").append(target.name()) + .append('\n'); + sb.append(" ballpark = ").append(ballpark); + if (ballparkReason != null) { + sb.append(" (").append(ballparkReason).append(')'); + } + sb.append('\n'); + if (selected != null) { + sb.append(" selected = ").append(selected.authorityCode()).append(" ") + .append(selected.name()).append('\n'); + if (selected.isInverted()) { + sb.append(" INVERTED: the authority publishes this in the " + + "opposite direction\n"); + } + if (selected.methodNote().isPresent()) { + sb.append(" ").append(selected.methodNote().get()).append('\n'); + } + } else if (context.hasDatabase()) { + sb.append(" selected = -- these CRSs share a datum, so there is no " + + "datum-change operation to select\n"); + } else { + sb.append(" selected = -- no authority database is configured, so the " + + "legacy datum model's single synthesised operation was used. Set " + + "ProjContext.Builder.database(..) for real selection.\n"); + } + if (accuracy().isPresent()) { + sb.append(" accuracy = ").append(accuracy().get()).append('\n'); + } else { + sb.append(" accuracy = -- ").append(context.hasDatabase() + ? "the selected operation carries no published accuracy, which for a ballpark " + + "operation is permanent; it is never reported as 0.0" + : "operation accuracy is authority metadata and no CRS database is configured; " + + "it is not estimated").append('\n'); + } + if (areaOfUse().isPresent()) { + sb.append(" areaOfUse = ").append(areaOfUse().get()).append('\n'); + } + if (!candidates.isEmpty()) { + sb.append(" candidates = ").append(candidates.size()) + .append(" published by the authority, ranked best first\n"); + for (int i = 0; i < candidates.size(); i++) { + sb.append(" ").append(candidates.get(i).describe()).append('\n'); + } + } + sb.append(" axisOrder = source ").append(source.axisOrder()) + .append(", target ").append(target.axisOrder()).append('\n'); + sb.append(" domainError = ").append(context.domainErrorPolicy()).append('\n'); + if (missingGrids.isEmpty()) { + sb.append(" missing grids = none\n"); + } else { + sb.append(" missing grids = ").append(missingGrids.size()).append('\n'); + for (int i = 0; i < missingGrids.size(); i++) { + sb.append(" ").append(missingGrids.get(i).describe()).append('\n'); + } + } + if (warnings.isEmpty()) { + sb.append(" warnings = none\n"); + } else { + sb.append(" warnings = ").append(warnings.size()).append('\n'); + for (int i = 0; i < warnings.size(); i++) { + sb.append(" ").append(warnings.get(i)).append('\n'); + } + } + sb.append(" thread safety = this operation is immutable and shareable; the " + + "ProjCoordinate arguments are not\n"); + sb.append('\n').append(source.describe()).append('\n').append(target.describe()); + return sb.toString(); + } + + @Override + public String toString() { + return "CrsOperation[" + source.name() + " -> " + target.name() + + (ballpark ? ", BALLPARK" : "") + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CrsOperation)) { + return false; + } + CrsOperation that = (CrsOperation) o; + return source.equals(that.source) && target.equals(that.target) + && context.equals(that.context); + } + + @Override + public int hashCode() { + int h = source.hashCode(); + h = 31 * h + target.hashCode(); + return 31 * h + context.hashCode(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/CrsOperationCandidate.java b/core/src/main/java/org/locationtech/proj4j/api/CrsOperationCandidate.java new file mode 100644 index 0000000..4c229ee --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/CrsOperationCandidate.java @@ -0,0 +1,570 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbOperation; + +/** + * One coordinate operation the authority publishes between two CRSs, with everything needed to + * decide whether it can be used and how it compares with the others. + * + *

Produced by {@link Proj#candidateOperations(Crs, Crs)}, which requires a + * {@link org.locationtech.proj4j.spi.ProjDatabase} on the {@link ProjContext}: without one there is + * nothing to enumerate, because the legacy engine synthesises exactly one operation per CRS pair + * from its datum model. + * + *

Why this type exists at all

+ * + *

{@code EPSG:4267} to {@code EPSG:4269} has nine published grid transformations, with + * accuracies from 0.15 m to 2.0 m, and not one of them is ballpark. The historic defect was + * never that the authority offered nothing; it was that Proj4J could not see the offer, so it applied + * no shift and reported success — 95.573 m at San Francisco, finite and plausible. This + * class is the offer, made visible: which operations exist, which of them this deployment can + * actually execute, which grid files each needs, and what each one claims for accuracy. + * + *

Ranking is this library's policy, not the database's

+ * + *

{@link org.locationtech.proj4j.spi.ProjDatabase#operationsBetween} returns rows in + * {@code (kind, authority, code)} order and never by accuracy: the database has no policy. + * The ranking is {@link Proj#candidateOperations(Crs, Crs)}'s, it is a total order so that ties are + * never left to chance, and it is documented on that method. {@link #rank()} is this candidate's + * position in it, and {@link #rejectionReason()} says why a candidate that was not selected could + * not be. + * + *

Direction

+ * + *

The authority publishes an operation in exactly one direction. A candidate whose + * {@link #isInverted()} is {@code true} was published the other way round and would have to be + * executed inverted — which changes parameter signs, grid direction, and whether an inverse + * exists at all. That fact is carried explicitly rather than folded into the operation, because + * losing it is how a shift gets applied with the wrong sign: twice the error, still plausible. + * + *

Immutable and safe to share between threads. + * + * @see Proj#candidateOperations(Crs, Crs) + * @see CrsOperation#selectedOperation() + * @since 2.0.0 + */ +public final class CrsOperationCandidate implements Comparable { + + /** + * Why a candidate cannot be used by this deployment. {@link #NONE} is the good case, and the + * order of the remaining constants is not the ranking order — see + * {@link Proj#candidateOperations(Crs, Crs)} for that. + */ + public enum Rejection { + + /** Usable: the method is implemented, every grid resolves, and it is not ballpark. */ + NONE, + + /** + * The authority's method maps to a PROJ operator Proj4J does not implement — + * {@code gridshift}, {@code xyzgridshift}, {@code tinshift}, {@code velocity_grid}, + * {@code defmodel}, a deformation pipeline needing a time dimension, or a concatenated + * operation. Becomes {@link org.locationtech.proj4j.ErrorCause#UNSUPPORTED_OPERATION_METHOD}. + */ + UNSUPPORTED_METHOD, + + /** + * The method is implemented but at least one grid file it needs is not reachable through any + * configured resolver. Becomes + * {@link org.locationtech.proj4j.ErrorCause#BEST_OPERATION_UNAVAILABLE}, and + * {@link #missingGrids()} names the files — all of them, including the second + * grid of a NADCON {@code .las}/{@code .los} pair. + */ + MISSING_GRID, + + /** + * A datum change performed with no parameters and no stated accuracy, i.e. one that is not + * actually performed. Becomes + * {@link org.locationtech.proj4j.ErrorCause#BALLPARK_REJECTED} under + * {@link BallparkPolicy#REJECT}. + */ + BALLPARK, + + /** The authority has deprecated this operation. */ + DEPRECATED, + + /** + * A {@code supersession} row names a replacement that connects the same CRS pair and + * is itself a candidate here, so this one is not a substitute for anything. + */ + SUPERSEDED + } + + private final DbOperation operation; + private final boolean inverted; + private final boolean synthesisedBallpark; + private final Accuracy accuracy; + private final List grids; + private final AreaOfUse areaOfUse; + private final Rejection rejection; + private final String rejectionReason; + private final String methodNote; + private final int rank; + + CrsOperationCandidate(DbOperation operation, boolean inverted, boolean synthesisedBallpark, + Accuracy accuracy, List grids, AreaOfUse areaOfUse, + Rejection rejection, String rejectionReason, String methodNote, int rank) { + this.operation = operation; + this.inverted = inverted; + this.synthesisedBallpark = synthesisedBallpark; + this.accuracy = accuracy; + this.grids = Collections.unmodifiableList(grids); + this.areaOfUse = areaOfUse; + this.rejection = rejection; + this.rejectionReason = rejectionReason; + this.methodNote = methodNote; + this.rank = rank; + } + + /** A copy of this candidate with a rank assigned. Used once, after sorting. */ + CrsOperationCandidate withRank(int newRank) { + return new CrsOperationCandidate(operation, inverted, synthesisedBallpark, accuracy, + new ArrayList(grids), areaOfUse, rejection, rejectionReason, methodNote, + newRank); + } + + // ------------------------------------------------------------------------------- identity + + /** + * The authority's own row, verbatim and unconverted — method, parameters in the + * authority's units, grid names as the authority spells them, steps. + * + *

For the one candidate Proj4J synthesises rather than reads (see + * {@link #isSynthesisedBallpark()}) this is a stand-in row with authority {@code PROJ} and no + * parameters, exactly as PROJ's own {@code projinfo} reports {@code unknown id} for it. + * + * @return the operation; never null + */ + public DbOperation operation() { + return operation; + } + + /** + * {@code "EPSG:1241"}. + * + * @return the authority-qualified code; never null + */ + public String authorityCode() { + return operation.authName() + ":" + operation.code(); + } + + /** + * {@code "NAD27 to NAD83 (1)"} — the name a caller needs in order to know what was chosen, + * and to look it up in the EPSG registry. + * + * @return the operation name; never null + */ + public String name() { + return operation.name(); + } + + /** + * Whether this operation was published in the opposite direction and would have to be executed + * inverted. See the class javadoc. + * + * @return true iff the authority publishes this as target-to-source + */ + public boolean isInverted() { + return inverted; + } + + /** + * Whether this candidate is the ballpark offset Proj4J synthesised because the datums differ and + * the authority publishes no operation, rather than a row read from the database. + * + *

PROJ synthesises the same thing, and stores it no more than Proj4J does: there is not one + * {@code Ballpark geographic offset} row anywhere in the shipped database. So a synthesised + * ballpark is not a gap in the data; it is what "no published operation" looks like once it has + * been made visible instead of silent. + * + * @return true iff this candidate was synthesised + */ + public boolean isSynthesisedBallpark() { + return synthesisedBallpark; + } + + /** + * Whether this is a ballpark transformation, i.e. a datum change with no parameters and no + * stated accuracy. + * + * @return true iff ballpark + */ + public boolean isBallpark() { + return rejection == Rejection.BALLPARK || synthesisedBallpark; + } + + // ------------------------------------------------------------------------------- quality + + /** + * The accuracy the authority published, in metres. + * + *

Empty means the authority published none, which for a ballpark operation is permanent and + * structural. It is never substituted with {@code 0.0} or an estimate: an invented accuracy is + * exactly what lets a ballpark candidate win a ranking. + * + * @return the accuracy, or empty + */ + public Optional accuracy() { + return Optional.ofNullable(accuracy); + } + + /** + * The extent over which the authority declares this operation valid, database-derived, so + * {@link AreaOfUse#isDatabaseDerived()} is true. + * + *

When an operation declares several usages this is the smallest by + * {@link org.locationtech.proj4j.spi.DbExtent#rankingArea()}, with ties broken on the extent + * code, because that is the one used for ranking. Empty when the operation declares no usage or + * when its extent publishes no bounding box — 18 upstream extents do not, and they are + * reported as absent rather than as the whole world. + * + * @return the area of use, or empty + */ + public Optional areaOfUse() { + return Optional.ofNullable(areaOfUse); + } + + // ------------------------------------------------------------------------------- grids + + /** + * Every grid file this operation needs, one entry per authority grid slot, in slot order. + * + *

Both slots. NADCON splits the latitude and longitude shifts across a + * {@code .las}/{@code .los} pair, and 150 of the 1,062 grid transformations in the shipped + * database have a second grid. {@code EPSG:1241}, the most important transformation in the + * consumer's workload, is one of them: it needs {@code conus.las} and {@code conus.los}. + * A selector that reads only the first slot applies half the shift and reports success. + * + *

What a slot resolves to is a separate question, and the answer is often one file for + * two slots: PROJ's {@code grid_alternatives} maps {@code conus.las} to the GeoTIFF + * {@code us_noaa_conus.tif}, which carries both shifts, so the pair collapses. That collapse is + * reported by {@link GridInfo#satisfiedBy()} rather than by dropping the second slot, so the + * authority's requirement and this deployment's substitution are both visible. + * + * @return an unmodifiable list in slot order; never null, and empty for a parameterised operation + */ + public List grids() { + return grids; + } + + /** + * The grid files this operation needs and no configured resolver can find. + * + * @return an unmodifiable list; never null, and empty is the good case + */ + public List missingGrids() { + List missing = new ArrayList(grids.size()); + for (int i = 0; i < grids.size(); i++) { + if (!grids.get(i).isAvailable()) { + missing.add(grids.get(i)); + } + } + return Collections.unmodifiableList(missing); + } + + // ------------------------------------------------------------------------------- usability + + /** + * Whether this deployment can execute this operation right now. + * + * @return true iff {@link #rejection()} is {@link Rejection#NONE} + */ + public boolean isUsable() { + return rejection == Rejection.NONE; + } + + /** + * Why this candidate cannot be used, or {@link Rejection#NONE}. + * + * @return the rejection category; never null + */ + public Rejection rejection() { + return rejection; + } + + /** + * Why this candidate cannot be used, in words, naming the method or the files. + * + * @return the reason, or empty iff {@link #isUsable()} + */ + public Optional rejectionReason() { + return Optional.ofNullable(rejectionReason); + } + + /** + * What the authority's method maps to here — the PROJ operator name for a grid operation, + * or the reason there is no mapping. + * + * @return the note, or empty + */ + public Optional methodNote() { + return Optional.ofNullable(methodNote); + } + + /** + * This candidate's position in the ranking, {@code 0} being best. + * + * @return a zero-based rank + */ + public int rank() { + return rank; + } + + // ------------------------------------------------------------------------------- ordering + + /** + * The total order described on {@link Proj#candidateOperations(Crs, Crs)}. Consistent with + * {@link #equals(Object)} only in the sense that no two distinct candidates ever compare equal: + * the final tiebreak is the authority reference and the direction, so the sort is stable + * regardless of input order. + * + * @param other the candidate to compare against + * @return a negative number if this candidate ranks better + */ + @Override + public int compareTo(CrsOperationCandidate other) { + // 1. Usability tier. See usabilityPenalty() for the order and why it is that order. + int c = Integer.compare(usabilityPenalty(), other.usabilityPenalty()); + if (c != 0) { + return c; + } + // 2. Accuracy ascending; unknown after every known figure, never treated as zero. + c = compareAccuracy(accuracy, other.accuracy); + if (c != 0) { + return c; + } + // 3. The tighter area of use, because a continental grid claiming the world is not more + // specific than a national one. No bounding box sorts last, never as the whole world. + c = compareArea(areaOfUse, other.areaOfUse); + if (c != 0) { + return c; + } + // 4. The authority reference, which is a total order, then direction. Nothing is left tied, + // so the result cannot depend on the order the database returned rows in. + c = ref().compareTo(other.ref()); + if (c != 0) { + return c; + } + return Boolean.compare(inverted, other.inverted); + } + + /** + * The usability tier, lower being better. Ordered by what a caller can do about it, which + * is the only ordering that makes a ranked list actionable: + * + *

    + *
  1. {@link Rejection#NONE} — nothing to do.
  2. + *
  3. {@link Rejection#MISSING_GRID} — add a file to the classpath and it works. The best + * kind of failure.
  4. + *
  5. {@link Rejection#UNSUPPORTED_METHOD} — a capability boundary; nothing you add will + * change it.
  6. + *
  7. {@link Rejection#BALLPARK} — executable, and useless: it applies no shift.
  8. + *
  9. {@link Rejection#SUPERSEDED} — the authority has a better one for the same job.
  10. + *
  11. {@link Rejection#DEPRECATED} — the authority has withdrawn it.
  12. + *
+ * + *

Note that this tier is not what {@link BestOperationPolicy#REQUIRE_BEST} compares. A + * usable 2.0 m operation ranks above an unavailable 0.15 m one, because it is the one you + * can have; whether choosing it is a degradation is a question about accuracy, answered + * separately by {@link #isDegradedRelativeTo}. Conflating the two would either make the policy + * unfireable or make the ranked list unreadable. + */ + private int usabilityPenalty() { + switch (rejection) { + case NONE: + return 0; + case MISSING_GRID: + return 1; + case UNSUPPORTED_METHOD: + return 2; + case BALLPARK: + return 3; + case SUPERSEDED: + return 4; + default: + return 5; + } + } + + private DbObjectRef ref() { + return operation.ref(); + } + + private static int compareAccuracy(Accuracy a, Accuracy b) { + if (a == null) { + return b == null ? 0 : 1; + } + if (b == null) { + return -1; + } + return Double.compare(a.metres(), b.metres()); + } + + private static int compareArea(AreaOfUse a, AreaOfUse b) { + if (a == null) { + return b == null ? 0 : 1; + } + if (b == null) { + return -1; + } + return Double.compare(rankingArea(a), rankingArea(b)); + } + + private static double rankingArea(AreaOfUse a) { + double lonSpan = a.crossesAntimeridian() + ? 360.0 - (a.westLongitude() - a.eastLongitude()) + : a.eastLongitude() - a.westLongitude(); + return lonSpan * (a.northLatitude() - a.southLatitude()); + } + + /** + * Whether this candidate is strictly less accurate than {@code other}, which is the only thing + * {@link BestOperationPolicy#REQUIRE_BEST} refuses. + * + *

Deliberately strictly. Two operations tied on accuracy are not a degradation of one + * another, and refusing a tie would make the default policy reject + * {@code EPSG:4267 -> EPSG:4269} outright: {@code EPSG:1241} (NADCON, 0.15 m, executable + * here) and {@code EPSG:8555} (NADCON5, 0.15 m, not executable here) are tied, and rejecting + * both would be a worse answer than either. An unknown accuracy on this side against a known one + * on the other is a degradation, because "we do not know" cannot be shown to be as good. + * + * @param other the better-ranked candidate to compare against + * @return true iff choosing this one over {@code other} loses accuracy + */ + /** + * Whether this candidate has a strictly better published accuracy than {@code other}, ties broken + * on the authority reference so the comparison is a total order. + * + * @param other the candidate to compare against + * @return true iff this one should win an accuracy-only comparison + */ + boolean isBetterAccuracyThan(CrsOperationCandidate other) { + int c = compareAccuracy(accuracy, other.accuracy); + if (c != 0) { + return c < 0; + } + return ref().compareTo(other.ref()) < 0; + } + + boolean isDegradedRelativeTo(CrsOperationCandidate other) { + if (other == null) { + return false; + } + if (accuracy == null) { + return other.accuracy != null; + } + if (other.accuracy == null) { + return false; + } + return accuracy.metres() > other.accuracy.metres(); + } + + // ------------------------------------------------------------------------------- describe + + /** + * One line: code, name, accuracy, direction, usability, and the files. + * + * @return the description, without a trailing newline; never null + */ + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append('#').append(rank).append(' ').append(authorityCode()).append(", ").append(name()); + sb.append(", ").append(accuracy == null ? "accuracy unknown" : accuracy.metres() + " m"); + if (inverted) { + sb.append(", INVERTED (published as ") + .append(operation.sourceCrs() == null ? "?" : operation.sourceCrs().authorityCode()) + .append(" -> ") + .append(operation.targetCrs() == null ? "?" : operation.targetCrs().authorityCode()) + .append(')'); + } + if (methodNote != null) { + sb.append(", ").append(methodNote); + } + if (areaOfUse != null && areaOfUse.description() != null) { + sb.append(", ").append(areaOfUse.description()); + } + sb.append(isUsable() ? ", USABLE" : ", " + rejection + ": " + rejectionReason); + if (!grids.isEmpty()) { + sb.append("\n grids required by the authority (").append(grids.size()) + .append(") --"); + for (int i = 0; i < grids.size(); i++) { + sb.append("\n slot ").append(i + 1).append(": ") + .append(grids.get(i).describe()); + } + } + return sb.toString(); + } + + @Override + public String toString() { + return "CrsOperationCandidate[" + authorityCode() + ", " + name() + + (accuracy == null ? ", accuracy unknown" : ", " + accuracy.metres() + " m") + + (inverted ? ", inverted" : "") + + (isUsable() ? "" : ", " + rejection) + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CrsOperationCandidate)) { + return false; + } + CrsOperationCandidate that = (CrsOperationCandidate) o; + return inverted == that.inverted && ref().equals(that.ref()); + } + + @Override + public int hashCode() { + return 31 * ref().hashCode() + (inverted ? 1 : 0); + } + + /** + * The smallest extent an operation declares, by ranking area, ties broken on the extent code so + * the choice is deterministic. Package-private: {@link OperationSelector} builds candidates. + * + * @param extents the extents the database returned, in its own order + * @return the chosen extent, or null if none has a bounding box + */ + static DbExtent smallestExtent(List extents) { + DbExtent best = null; + for (int i = 0; i < extents.size(); i++) { + DbExtent e = extents.get(i); + if (!e.hasBoundingBox()) { + continue; + } + if (best == null) { + best = e; + continue; + } + int c = Double.compare(e.rankingArea(), best.rankingArea()); + if (c < 0 || (c == 0 && e.ref().compareTo(best.ref()) < 0)) { + best = e; + } + } + return best; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/DatabaseCrsFactory.java b/core/src/main/java/org/locationtech/proj4j/api/DatabaseCrsFactory.java new file mode 100644 index 0000000..42d69ea --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/DatabaseCrsFactory.java @@ -0,0 +1,360 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.spi.DbAxis; +import org.locationtech.proj4j.spi.DbCoordinateSystem; +import org.locationtech.proj4j.spi.DbCrs; +import org.locationtech.proj4j.spi.DbEllipsoid; +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbPrimeMeridian; +import org.locationtech.proj4j.spi.DbUnit; +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * Builds a {@link Crs} from an authority database row, for the codes the legacy PROJ.4 dictionary + * cannot produce. + * + *

Deliberately narrow

+ * + *

Only geodetic CRSs — geographic 2D, geographic 3D reduced to its horizontal half, + * and geocentric. A projected CRS is refused, because building one means turning a + * {@code conversion}'s parameters into a {@code Projection}: 4,312 conversion rows across dozens of + * EPSG method codes, each with its own parameter slots and its own units, and every mis-slotted + * parameter is a plausible coordinate in the wrong place. The legacy dictionary already carries + * 5,708 projected CRSs with parameters that have been in production for fifteen years, so it stays + * authoritative for them and this class does not compete with it. + * + *

What that leaves is exactly the useful half of the vintage gap. The dictionary is EPSG v9.2-era + * and the shipped database is v12.029, so geodetic codes added since — the WGS 84 ensemble + * realisations {@code EPSG:9053} to {@code EPSG:10606} among them — become resolvable, and with + * them the operations that relate them. + * + *

Units are converted, and that is not optional

+ * + *

{@link org.locationtech.proj4j.spi.ProjDatabase} returns values in the authority's own units, + * unconverted, each with its unit reference. Some ellipsoids are defined in Clarke's foot and some + * prime meridians in grads. A semi-major axis passed through as though it were metres is wrong by a + * factor of about 3.28, and a prime meridian in grads read as degrees is out by 10 per cent — + * both entirely plausible-looking numbers. So every value here is multiplied by its unit's + * {@link DbUnit#conversionFactor()}, and a unit with no factor + * ({@link DbUnit#hasConversionFactor()} false) makes this class refuse rather than assume 1.0. + */ +final class DatabaseCrsFactory { + + /** Radians to degrees. The database's angular conversion factors are to radians. */ + private static final double RAD_TO_DEG = 180.0 / Math.PI; + + private DatabaseCrsFactory() { + } + + /** + * Builds a CRS from the context's database, or returns null. + * + * @param definition the caller's original text, kept verbatim on the result + * @param authCode the {@code authority:code} name + * @param ctx the context, whose database is used and whose policies apply + * @return the CRS, or null if there is no database, no such code, or the code names a CRS type + * this class deliberately does not build + */ + static Crs create(String definition, String authCode, ProjContext ctx) { + if (!ctx.hasDatabase()) { + return null; + } + int colon = authCode.lastIndexOf(':'); + if (colon <= 0 || colon == authCode.length() - 1) { + return null; + } + ProjDatabase db = ctx.database(); + String auth = authCode.substring(0, colon).trim(); + String code = authCode.substring(colon + 1).trim(); + DbCrs crs = db.crs(auth, code); + if (crs == null) { + return null; + } + String projString = projStringFor(db, crs); + if (projString == null) { + return null; + } + CoordinateReferenceSystem legacy = + new CRSFactory().createFromParameters(crs.name(), projString); + if (legacy == null) { + return null; + } + + String axis = authorityAxisOrder(db, crs); + boolean axisAuthoritative = axis != null; + if (axis != null && ctx.axisOrderPolicy() == org.locationtech.proj4j.io.wkt.AxisOrderPolicy + .AUTHORITY && !"enu".equals(axis)) { + legacy = new CRSFactory().createFromParameters(crs.name(), + projString + " +axis=" + axis); + } else if (ctx.axisOrderPolicy() == org.locationtech.proj4j.io.wkt.AxisOrderPolicy + .VISUALISATION) { + axis = "enu"; + } else if (ctx.axisOrderPolicy() == org.locationtech.proj4j.io.wkt.AxisOrderPolicy.LEGACY) { + // 1.4.3 behaviour: the authority order is read and reported, and then deliberately not + // applied, so an existing caller's coordinates do not transpose under their feet. + axis = null; + } + + AreaOfUse area = AreaOfUse.fromDbExtent( + CrsOperationCandidate.smallestExtent(db.extentsFor(crs.ref()))); + return Crs.fromDatabase(definition, ctx, legacy, crs, area, axisAuthoritative, + axisNote(ctx, db, crs, axis, axisAuthoritative)); + } + + /** + * The PROJ string for a geodetic CRS, or null for a CRS type this class does not build. + * + *

{@code +no_defs} is appended for the same reason the shipped dictionary carries it: without + * it PROJ's defaults leak in, and a default is exactly the kind of value that reads as authority + * data without being any. + */ + private static String projStringFor(ProjDatabase db, DbCrs crs) { + String kind; + switch (crs.type()) { + case GEOGRAPHIC_2D: + case GEOGRAPHIC_3D: + case GEODETIC_OTHER: + kind = "+proj=longlat"; + break; + case GEOCENTRIC: + kind = "+proj=geocent"; + break; + default: + // PROJECTED, VERTICAL, COMPOUND, ENGINEERING. See the class javadoc. + return null; + } + DbObjectRef datumRef = crs.datum(); + if (datumRef == null) { + return null; + } + org.locationtech.proj4j.spi.DbDatum datum = + db.datum(DbObjectType.GEODETIC_DATUM, datumRef.authName(), datumRef.code()); + if (datum == null || datum.ellipsoid() == null) { + return null; + } + DbEllipsoid ellipsoid = db.ellipsoid(datum.ellipsoid().authName(), + datum.ellipsoid().code()); + if (ellipsoid == null) { + return null; + } + String shape = ellipsoidParams(db, ellipsoid); + if (shape == null) { + return null; + } + StringBuilder sb = new StringBuilder(kind).append(' ').append(shape); + + if (datum.primeMeridian() != null) { + DbPrimeMeridian pm = db.primeMeridian(datum.primeMeridian().authName(), + datum.primeMeridian().code()); + if (pm != null) { + Double degrees = toDegrees(db, pm.longitude(), pm.unit()); + if (degrees == null) { + return null; + } + if (degrees.doubleValue() != 0.0) { + sb.append(" +pm=").append(degrees); + } + } + } + return sb.append(" +no_defs").toString(); + } + + /** + * {@code +a=} with whichever second shape parameter the authority actually published. + * + *

The authority's own parameterisation is kept rather than derived: an ellipsoid defined by an + * inverse flattening is written {@code +a= +rf=} and one defined by a semi-minor axis is written + * {@code +a= +b=}. Converting between them costs bits, and {@code +rf} has already been the cause + * of one transposed-setter defect in this library. + */ + private static String ellipsoidParams(ProjDatabase db, DbEllipsoid ellipsoid) { + Double a = toMetres(db, ellipsoid.semiMajorAxis(), ellipsoid.unit()); + if (a == null) { + return null; + } + if (ellipsoid.isSphere()) { + return "+R=" + a; + } + if (!Double.isNaN(ellipsoid.inverseFlattening())) { + return "+a=" + a + " +rf=" + ellipsoid.inverseFlattening(); + } + Double b = toMetres(db, ellipsoid.semiMinorAxis(), ellipsoid.unit()); + if (b == null) { + return null; + } + return "+a=" + a + " +b=" + b; + } + + /** + * A length in the authority's unit, converted to metres, or null when the unit publishes no + * conversion factor. + * + *

Null rather than "assume metres". A defaulted factor of one is indistinguishable from a real + * one and multiplies silently. + */ + private static Double toMetres(ProjDatabase db, double value, DbObjectRef unitRef) { + if (Double.isNaN(value)) { + return null; + } + if (unitRef == null) { + return null; + } + DbUnit unit = db.unit(unitRef.authName(), unitRef.code()); + if (unit == null || !unit.hasConversionFactor() || unit.type() != DbUnit.Type.LENGTH) { + return null; + } + return Double.valueOf(value * unit.conversionFactor()); + } + + /** An angle in the authority's unit, converted to degrees, or null. See {@link #toMetres}. */ + private static Double toDegrees(ProjDatabase db, double value, DbObjectRef unitRef) { + if (Double.isNaN(value)) { + return null; + } + if (unitRef == null) { + return null; + } + DbUnit unit = db.unit(unitRef.authName(), unitRef.code()); + if (unit == null || !unit.hasConversionFactor() || unit.type() != DbUnit.Type.ANGLE) { + return null; + } + return Double.valueOf(value * unit.conversionFactor() * RAD_TO_DEG); + } + + /** + * The authority's axis order in PROJ's {@code +axis=} three-letter encoding, or null when it + * cannot be expressed in it. + * + *

This is where {@code AxisOrderPolicy.AUTHORITY} stops being an inference. + * {@code EPSG:4326}'s coordinate system is {@code EPSG:6422}, whose axis 1 is + * Geodetic latitude, north and axis 2 Geodetic longitude, east, which is why PROJ + * 6+ is latitude-first for it. Read here, rather than applied as a rule and then disclosed as + * inferred. + * + *

Returns null — not a guess — for a coordinate system whose axes are not cardinal. + * The shipped database has plenty: {@code North along 90 degrees East}, {@code starboard}, + * {@code rowPositive}, {@code See associated operation}. None of those has a {@code +axis=} + * spelling, and inventing one would be a silent transposition. + */ + static String authorityAxisOrder(ProjDatabase db, DbCrs crs) { + DbObjectRef csRef = crs.coordinateSystem(); + if (csRef == null) { + return null; + } + DbCoordinateSystem cs = db.coordinateSystem(csRef.authName(), csRef.code()); + if (cs == null || cs.axes().isEmpty()) { + return null; + } + List axes = cs.axes(); + StringBuilder sb = new StringBuilder(3); + for (int i = 0; i < axes.size() && i < 3; i++) { + char c = letterFor(axes.get(i).orientation()); + if (c == 0) { + return null; + } + sb.append(c); + } + // A two-dimensional CRS still needs three letters for +axis=; PROJ's own normalisation appends + // the up axis, and this facade's Crs is two-dimensional by construction. + while (sb.length() < 3) { + sb.append('u'); + } + return sb.toString(); + } + + private static char letterFor(String orientation) { + if ("east".equals(orientation)) { + return 'e'; + } + if ("west".equals(orientation)) { + return 'w'; + } + if ("north".equals(orientation)) { + return 'n'; + } + if ("south".equals(orientation)) { + return 's'; + } + if ("up".equals(orientation)) { + return 'u'; + } + if ("down".equals(orientation)) { + return 'd'; + } + return 0; + } + + private static String axisNote(ProjContext ctx, ProjDatabase db, DbCrs crs, String applied, + boolean authoritative) { + String declared = authorityAxisOrder(db, crs); + StringBuilder sb = new StringBuilder(); + sb.append("AxisOrderPolicy.").append(ctx.axisOrderPolicy()).append(": the authority "); + if (declared == null) { + sb.append("coordinate system ") + .append(crs.coordinateSystem() == null ? "?" + : crs.coordinateSystem().authorityCode()) + .append(" has axes that cannot be expressed as a PROJ +axis= string, so none was " + + "applied and east-north-up is in force. This is reported rather than " + + "guessed."); + return sb.toString(); + } + sb.append("coordinate system ").append(crs.coordinateSystem().authorityCode()) + .append(" declares axis order ").append(declared).append(", READ from the database ") + .append("rather than inferred. "); + if (applied == null) { + sb.append("It was deliberately NOT applied: LEGACY keeps proj4j 1.4.3's longitude-first " + + "behaviour, so existing callers' coordinates do not transpose under them."); + } else if ("enu".equals(applied) && !"enu".equals(declared)) { + sb.append("It was overridden by unconditional normalisation to east-north-up."); + } else { + sb.append("It is applied, so this CRS takes and returns coordinates in that order."); + } + if (!authoritative) { + sb.append(" isAxisOrderAuthoritative() is false."); + } + return sb.toString(); + } + + /** + * Every extent the authority declares for an object, as areas of use, smallest first, ties broken + * on the extent code. Package-private, for {@link Crs#authorityExtents()}. + */ + static List extentsAsAreas(ProjDatabase db, DbObjectRef object) { + List extents = new ArrayList(db.extentsFor(object)); + List out = new ArrayList(extents.size()); + while (!extents.isEmpty()) { + DbExtent smallest = CrsOperationCandidate.smallestExtent(extents); + if (smallest == null) { + break; + } + extents.remove(smallest); + AreaOfUse area = AreaOfUse.fromDbExtent(smallest); + if (area != null) { + out.add(area); + } + } + return out; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/DatabaseInfo.java b/core/src/main/java/org/locationtech/proj4j/api/DatabaseInfo.java new file mode 100644 index 0000000..c4c6460 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/DatabaseInfo.java @@ -0,0 +1,292 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; + +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * What CRS metadata this deployment actually has, stated without flattery. + * + *

There is no {@code proj.db}, and this class says so

+ * + *

PROJ 9.8.1 resolves an authority code against {@code proj.db}, a 10 MB SQLite database + * carrying EPSG v12.029 plus ESRI, IGNF, IAU_2015, NKG and NRCAN. Proj4J ships nothing of + * the kind. What it ships, in the separate {@code proj4j-epsg} artifact, is a PROJ.4 + * {@code +init=} dictionary: flat text files of the form + * {@code <4326> +proj=longlat +datum=WGS84 +no_defs}, generated from EPSG v9.2. + * + *

Those two things are not the same kind of object and the difference is not cosmetic: + * + * + * + * + * + * + * + * + * + * + * + *
what a dictionary can and cannot answer
question{@code proj.db}the shipped dictionary
what are this code's projection parameters?yesyes
what is this CRS's area of use?yesno
which operations exist between these two CRSs?yesno — one is + * synthesised from the datum
what is that operation's accuracy?yesno
which axis order does the authority declare?yesno
what EPSG version is this?yes, in a {@code metadata} tableno — the files carry no version stamp at all
+ * + *

The last row is why {@link Proj#databaseVersion()} returns + * {@link Optional#empty()} rather than a string. Reporting {@code "EPSG v9.2"} would be an + * unverifiable claim about bytes with no version in them; reporting {@code "EPSG v12.029"} because + * that is what PROJ 9.8.1 ships would be a straightforward lie. So the version is absent, and + * {@link #vintageNote()} explains the gap in prose that a human will read in a log. + * + *

{@link #dictionaryPresent()} is a checkable fact — it is a classpath probe for + * the dictionary resource — and it is reported. + * + *

Immutable and safe to share between threads. + * + * @see Proj#databaseVersion() + * @see Proj#databaseInfo() + * @since 1.5.0 + */ +public final class DatabaseInfo { + + /** + * The EPSG release the shipped dictionary was generated from, for prose only. It is + * not returned by {@link #epsgVersion()}, because it is not in the files. + */ + private static final String DICTIONARY_VINTAGE = "v9.2-era (2017)"; + + /** The EPSG release PROJ 9.8.1's own {@code proj.db} carries. */ + private static final String PROJ_EPSG_VERSION = "v12.029"; + + private final boolean dictionaryPresent; + private final String dictionaryOrigin; + private final String databaseName; + private final Map metadata; + + private DatabaseInfo(boolean dictionaryPresent, String dictionaryOrigin, String databaseName, + Map metadata) { + this.dictionaryPresent = dictionaryPresent; + this.dictionaryOrigin = dictionaryOrigin; + this.databaseName = databaseName; + this.metadata = metadata == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(new TreeMap(metadata)); + } + + /** + * Probes the classpath for the PROJ.4 dictionary and reports what is there, together with the + * authority database a context carries. + * + * @param database the context's database, or null + * @return the info; never null + */ + static DatabaseInfo probe(ProjDatabase database) { + // The one resource-path literal in main code, io/Proj4FileReader.java:128. Probed rather + // than assumed, because proj4j-epsg is an optional artifact and a deployment without it + // is legitimate -- createFromParameters and the WKT readers work perfectly well. + java.net.URL url = DatabaseInfo.class.getClassLoader().getResource("proj4/nad/epsg"); + String name = database == null ? null : database.name(); + Map meta = database == null ? null : database.metadata(); + return new DatabaseInfo(url != null, url == null ? null : "classpath:proj4/nad/epsg", name, + meta); + } + + /** + * The database version string, in the sense PROJ means it. + * + *

Read from the database's own {@code metadata} table when one is configured, so it is a fact + * about the shipped bytes rather than a constant that could drift from them. + * + *

Empty when no database is configured, and deliberately so. The PROJ.4 {@code +init=} + * dictionary that stands in for one carries no version stamp anywhere: reporting + * {@code "EPSG v9.2"} would be an unverifiable claim about bytes with no version in them, and + * reporting {@code "EPSG v12.029"} because that is what PROJ 9.8.1 has would be a lie. See + * {@link #vintageNote()} for what a human is told instead. + * + * @return for example {@code "PROJ 9.8.1, EPSG v12.029"}, or empty + */ + public Optional version() { + if (metadata.isEmpty()) { + return Optional.empty(); + } + String proj = metadata.get("PROJ.VERSION"); + String epsg = metadata.get("EPSG.VERSION"); + if (proj == null && epsg == null) { + return Optional.empty(); + } + StringBuilder sb = new StringBuilder(); + if (proj != null) { + sb.append("PROJ ").append(proj); + } + if (epsg != null) { + if (sb.length() > 0) { + sb.append(", "); + } + sb.append("EPSG ").append(epsg); + } + return Optional.of(sb.toString()); + } + + /** + * The EPSG dataset version the configured database carries, from its own {@code metadata} table. + * + * @return for example {@code "v12.029"}, or empty when no database is configured + */ + public Optional epsgVersion() { + return Optional.ofNullable(metadata.get("EPSG.VERSION")); + } + + /** + * The configured database's {@code metadata} table, verbatim and in key order. + * + *

One of the two independent version sources that must agree; the other is the build-stamped + * sidecar the {@code proj4j-db} artifact ships, which its own opener cross-checks and refuses to + * open on a mismatch. + * + * @return an unmodifiable map in key order; empty when no database is configured + */ + public Map metadata() { + return metadata; + } + + /** + * Which database is answering, and where its bytes came from. + * + * @return for example {@code "pjdx:classpath:/proj4j-data/db/proj4j-db.pjdx"}, or empty + */ + public Optional databaseName() { + return Optional.ofNullable(databaseName); + } + + /** + * Whether a real CRS database ({@code proj.db} or a Proj4J transcoding of it) is configured on the + * context this was probed for. + * + *

A property of the {@link ProjContext}, not of the classpath: core never scans for a provider + * implicitly, because an implicit {@code ServiceLoader} walk touches a classpath Proj4J does not + * control. So this is false until an application opens one and passes it to + * {@link ProjContext.Builder#database}. + * + * @return true iff an authority database is configured + */ + public boolean isDatabasePresent() { + return databaseName != null; + } + + /** + * Whether the legacy PROJ.4 {@code +init=} dictionary is on the classpath, i.e. whether + * {@code CRSFactory.createFromName("EPSG:4326")} will resolve. + * + *

This one is a probe of the running classpath, not a constant. + * + * @return true iff {@code proj4/nad/epsg} is resolvable + */ + public boolean dictionaryPresent() { + return dictionaryPresent; + } + + /** + * Where the dictionary was found. + * + * @return the origin, or empty if {@link #dictionaryPresent()} is false + */ + public Optional dictionaryOrigin() { + return Optional.ofNullable(dictionaryOrigin); + } + + /** + * The prose a human needs in place of a version string: what the metadata actually is, how old + * it is, and what PROJ 9.8.1 would have had instead. + * + *

Deliberately a sentence rather than a version number. A caller that wants to gate on + * capability should use {@link #isDatabasePresent()} or {@link #dictionaryPresent()}; a caller + * writing a startup log line wants this. + * + * @return the note; never null, never empty + */ + public String vintageNote() { + if (isDatabasePresent()) { + StringBuilder sb = new StringBuilder(); + sb.append("An authority database is configured: ").append(databaseName).append(", ") + .append(version().isPresent() ? version().get() : "version unstated") + .append(". Operation selection, accuracy and area of use are read from it. "); + sb.append(dictionaryPresent + ? "The legacy PROJ.4 dictionary (EPSG " + DICTIONARY_VINTAGE + ") is also " + + "present and stays authoritative for the codes it knows, so adding the " + + "database cannot move a coordinate that already worked; the database is " + + "consulted for codes the dictionary cannot produce." + : "The legacy PROJ.4 dictionary is absent, so authority:code lookups resolve " + + "against the database alone -- which builds geodetic CRSs but not " + + "projected ones. Add proj4j-epsg for those."); + return sb.toString(); + } + if (!dictionaryPresent) { + return "No CRS metadata of any kind is on the classpath: no proj.db, and not the " + + "legacy PROJ.4 dictionary either (add proj4j-epsg for authority:code " + + "lookups). PROJ.4 parameter strings, WKT and PROJJSON still work."; + } + return "No proj.db. Authority codes resolve against the legacy PROJ.4 +init= dictionary in " + + "proj4j-epsg, generated from EPSG " + DICTIONARY_VINTAGE + "; PROJ 9.8.1 ships " + + "EPSG " + PROJ_EPSG_VERSION + " instead. The dictionary carries no version stamp, " + + "so no version string is reported rather than a guessed one. Codes added, " + + "deprecated or re-parameterised after EPSG " + DICTIONARY_VINTAGE + " are absent " + + "or stale, and area of use, operation accuracy, authority axis order and " + + "operation selection are unavailable rather than approximated."; + } + + /** + * A multi-line rendering of everything above, for a startup log. + * + * @return the description, newline-terminated; never null + */ + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append("proj4j CRS metadata:\n"); + sb.append(" authority database = ").append(isDatabasePresent() ? databaseName : "NONE") + .append('\n'); + sb.append(" databaseVersion() = ").append(version().isPresent() ? version().get() + : " (nothing here can state one honestly)").append('\n'); + if (!metadata.isEmpty()) { + for (Map.Entry e : metadata.entrySet()) { + sb.append(" ").append(e.getKey()).append(" = ").append(e.getValue()) + .append('\n'); + } + } + sb.append(" legacy dictionary = ").append(dictionaryPresent + ? "present at " + dictionaryOrigin : "ABSENT").append('\n'); + sb.append(" vintage = ").append(dictionaryPresent + ? "EPSG " + DICTIONARY_VINTAGE + " vs PROJ 9.8.1's EPSG " + PROJ_EPSG_VERSION + : "n/a").append('\n'); + sb.append(isDatabasePresent() + ? " read from the database, not approximated: operation selection, operation " + + "accuracy, area of use, authority axis order\n" + : " unavailable, not approximated: areaOfUse(), operation accuracy, authority " + + "axis order, operation selection\n"); + sb.append(" note: ").append(vintageNote()).append('\n'); + return sb.toString(); + } + + @Override + public String toString() { + return "DatabaseInfo[authorityDatabase=" + + (isDatabasePresent() ? databaseName : "absent") + ", dictionary=" + + (dictionaryPresent ? dictionaryOrigin : "absent") + ", version=" + + (version().isPresent() ? version().get() : "") + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/GridInfo.java b/core/src/main/java/org/locationtech/proj4j/api/GridInfo.java new file mode 100644 index 0000000..6804732 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/GridInfo.java @@ -0,0 +1,668 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.OptionalLong; + +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; +import org.locationtech.proj4j.spi.DbGridAlternative; + +/** + * One datum-shift or geoid grid file, and specifically whether it is reachable as opposed to + * merely declared. + * + *

Why that distinction is the whole point of this class

+ * + *

{@code +nadgrids=@conus} means "shift using {@code conus}, and if it is not there, don't". + * PROJ implements that literally and silently. proj4j 1.4.3 did too. The result is a coordinate + * that is wrong by the size of the datum shift, is entirely plausible, is finite, is in the right + * units, and is accompanied by no exception, no warning and no log line. At San Francisco, with + * every US grid absent, {@code EPSG:4267} to {@code EPSG:4326} came out 95.573 m wrong. + * That is the worst measured defect in this library's history and it is a reporting + * failure, not an arithmetic one. + * + *

So this class always answers three separate questions and never collapses them: + *

    + *
  • {@link #isDeclared()} — does some CRS on this classpath ask for this grid?
  • + *
  • {@link #isAvailable()} — did the resolver chain actually find it, just now?
  • + *
  • {@link #isOptional()} — did the declaration carry PROJ's {@code @}, i.e. is its absence + * supposed to pass unremarked?
  • + *
+ * The combination {@code isDeclared() && !isAvailable()} is the dangerous one, and + * {@link #describe()} spells it out in words. + * + *

What this class refuses to claim

+ * + *
    + *
  • {@link #format()} is empty unless the file was actually read. A grid's format is in + * its header, and reporting a format from a file name would be a guess. Listing grids does not + * read them.
  • + *
  • {@link #knownUrl()} is information for a human, never an action. Proj4J core contains + * no network code at all, so a grid that exists only at that URL is reported by + * {@link #isAvailable()} as {@code false}, full stop. The URL is there so a human knows what to + * add to the classpath.
  • + *
  • {@link #sizeBytes()} is empty when the resolver cannot say. A jar entry read through + * some class loaders has no content length.
  • + *
+ * + *

Legacy and modern names

+ * + *

PROJ 7 renamed every grid: {@code conus} became {@code us_noaa_conus.tif}, + * {@code ntv2_0.gsb} became {@code ca_nrc_ntv2_0.tif}. Both names identify the same shift, and a + * PROJ.4 parameter string in the wild uses the old one, so {@link #name()} is whatever was asked + * for and {@link #modernName()} is the PROJ 7+ spelling where it is known. + * + *

Only {@code conus} and {@code alaska} exist in the legacy CTABLE V2 form that this + * library's reader understands — those are the two in {@code 9.8.1:data/tests/}. The other + * five US grids ({@code hawaii}, {@code prvi}, {@code stgeorge}, {@code stlrnc}, {@code stpaul}) + * exist only as GeoTIFF in {@code PROJ-data}, so they arrive with the GeoTIFF reader and not + * before it. {@link #note()} says so on those five rather than leaving a caller to wonder why the + * pack is short. + * + *

Immutable and safe to share between threads. + * + * @see Crs#missingGrids() + * @see Proj#availableGrids() + * @see GridPolicy + * @since 1.5.0 + */ +public final class GridInfo { + + /** + * PROJ 7's grid rename table, restricted to the grids Proj4J can be asked for. Transcribed + * from {@code proj.db}'s {@code grid_alternatives.old_proj_grid_name} / + * {@code proj_grid_name} pairs; the full table has 472 rows and needs the database, so this is + * the subset reachable from the legacy datum definitions and from {@code proj4j-epsg}. + */ + private static final Map MODERN_NAMES; + + /** + * The five US grids with no legacy form to ship. See the class javadoc. + */ + private static final String GEOTIFF_ONLY_NOTE = + "no CTABLE V2 form exists upstream; this grid is GeoTIFF-only in PROJ-data and needs " + + "the GeoTIFF reader"; + + private static final Map NOTES; + + static { + Map m = new HashMap(); + m.put("conus", "us_noaa_conus.tif"); + m.put("alaska", "us_noaa_alaska.tif"); + m.put("hawaii", "us_noaa_hawaii.tif"); + m.put("prvi", "us_noaa_prvi.tif"); + m.put("stgeorge", "us_noaa_stgeorge.tif"); + m.put("stlrnc", "us_noaa_stlrnc.tif"); + m.put("stpaul", "us_noaa_stpaul.tif"); + m.put("ntv1_can.dat", "ca_nrc_ntv1_can.tif"); + m.put("ntv2_0.gsb", "ca_nrc_ntv2_0.tif"); + m.put("BETA2007.gsb", "de_adv_BETA2007.tif"); + m.put("OSTN15_NTv2_OSGBtoETRS.gsb", "uk_os_OSTN15_NTv2_OSGBtoETRS.tif"); + m.put("egm96_15.gtx", "us_nga_egm96_15.tif"); + MODERN_NAMES = Collections.unmodifiableMap(m); + + Map n = new HashMap(); + n.put("hawaii", GEOTIFF_ONLY_NOTE); + n.put("prvi", GEOTIFF_ONLY_NOTE); + n.put("stgeorge", GEOTIFF_ONLY_NOTE); + n.put("stlrnc", GEOTIFF_ONLY_NOTE); + n.put("stpaul", GEOTIFF_ONLY_NOTE); + n.put("null", "PROJ's built-in no-op grid; it exists so that +nadgrids=@null can assert " + + "\"deliberately no datum shift\" rather than \"shift unavailable\""); + NOTES = Collections.unmodifiableMap(n); + } + + /** Where a human can see the grid, if they want to add it to the classpath deliberately. */ + private static final String CDN_BASE = "https://cdn.proj.org/"; + + private final String name; + private final boolean optional; + private final boolean available; + private final String resolverName; + private final String origin; + private final long sizeBytes; + private final String format; + private final String declaredBy; + private final String skipReason; + + // --- authority-database facts. All null/0/false for a grid that came from a +nadgrids= token. + private final int slot; + private final String modernName; + private final String projGridFormat; + private final String projMethod; + private final boolean inverseDirection; + private final String satisfiedBy; + private final List probedNames; + + private GridInfo(String name, boolean optional, boolean available, String resolverName, + String origin, long sizeBytes, String format, String declaredBy, + String skipReason) { + this(name, optional, available, resolverName, origin, sizeBytes, format, declaredBy, + skipReason, 0, null, null, null, false, null, null); + } + + private GridInfo(String name, boolean optional, boolean available, String resolverName, + String origin, long sizeBytes, String format, String declaredBy, + String skipReason, int slot, String modernName, String projGridFormat, + String projMethod, boolean inverseDirection, String satisfiedBy, + List probedNames) { + this.name = name; + this.optional = optional; + this.available = available; + this.resolverName = resolverName; + this.origin = origin; + this.sizeBytes = sizeBytes; + this.format = format; + this.declaredBy = declaredBy; + this.skipReason = skipReason; + this.slot = slot; + this.modernName = modernName; + this.projGridFormat = projGridFormat; + this.projMethod = projMethod; + this.inverseDirection = inverseDirection; + this.satisfiedBy = satisfiedBy; + this.probedNames = probedNames == null + ? Collections.emptyList() + : Collections.unmodifiableList(probedNames); + } + + /** + * Probes the configured resolver chain for {@code name} and reports what it found, without + * reading or parsing the file. + * + *

This is a probe, not an enumeration: it works for a non-enumerable resolver too, + * which is why {@link Proj#grid(String)} can answer for a grid that + * {@link Proj#availableGrids()} cannot list. + * + * @param name the grid file name, with any {@code @} already stripped + * @param optional whether the declaration carried PROJ's {@code @} prefix + * @param declaredBy what declares this grid, for example {@code "+datum=NAD27"}, or null if it + * was found by enumerating a resolver rather than declared by a CRS + * @return the info; never null + */ + static GridInfo probe(String name, boolean optional, String declaredBy) { + ChainedResourceResolver chain = ResourceResolvers.resolver(); + ResourceHandle handle; + try { + handle = chain.resolve(name); + } catch (IOException e) { + return new GridInfo(name, optional, false, null, null, -1L, null, declaredBy, + "resolver chain threw " + e.getClass().getSimpleName() + ": " + e.getMessage()); + } + if (handle == null) { + return new GridInfo(name, optional, false, null, null, -1L, null, declaredBy, + "not found by any configured resolver"); + } + ResourceResolver found = chain.resolverOf(name); + return new GridInfo(name, optional, true, found == null ? null : found.name(), + handle.origin(), handle.sizeBytes(), null, declaredBy, null); + } + + /** + * The outcome of one {@code +nadgrids=} token that the grid layer has already resolved, so the + * format is known because the file was read. + * + * @param ref one token's resolution outcome + * @param declaredBy what declared it + * @return the info; never null + */ + static GridInfo fromGridRef(org.locationtech.proj4j.datum.Grid.GridRef ref, String declaredBy) { + if (!ref.isAvailable()) { + String reason = ref.skipReason(); + return new GridInfo(ref.name(), ref.isOptional(), false, null, null, -1L, null, + declaredBy, reason == null ? "not found by any configured resolver" : reason); + } + org.locationtech.proj4j.datum.Grid grid = ref.grid(); + // Deliberately NOT grid.sizeBytes(): that is the parsed grid's accounted heap cost, which + // for ntv1_can.dat is 2,225,952 B against a 1,113,184 B file. Reporting a heap figure under + // a name that reads as a file size is the kind of small lie this class exists not to tell, + // so the file length comes from a resolver probe instead. + long fileBytes = probe(ref.name(), ref.isOptional(), declaredBy).sizeBytes; + return new GridInfo(ref.name(), ref.isOptional(), true, grid.getResolverName(), + grid.getOrigin(), fileBytes, grid.getFormat(), declaredBy, null); + } + + /** + * One grid slot of an authority coordinate operation: what the authority asked for, what PROJ's + * {@code grid_alternatives} says to read instead, and whether this deployment can find either. + * + *

Called once per slot, so the second grid of a NADCON pair is never dropped. + * {@code EPSG:1241} needs {@code conus.las} and {@code conus.los}; reading only + * {@code grid_name} would apply half the shift and report success. + * + *

Three names are probed, in PROJ's own preference order, and the first that resolves wins: + * the modern {@code proj_grid_name} ({@code us_noaa_conus.tif}), the pre-PROJ-7 + * {@code old_proj_grid_name} ({@code conus} — which is what {@code proj4j-grids-us-legacy} + * ships), and finally the authority's own spelling. That mirrors + * {@code FileManager::open_resource_file}, which tries the legacy→modern and + * modern→legacy renames after a direct open fails. + * + * @param authorityName the name the authority uses, from + * {@link org.locationtech.proj4j.spi.DbOperation#gridNames()} + * @param slot 1 for {@code grid_name}, 2 for {@code grid2_name} + * @param alternative the {@code grid_alternatives} row, or null if the authority name has none + * @param declaredBy what asks for this grid, for example {@code "EPSG:1241 grid_name"} + * @return the info; never null + */ + static GridInfo forDbGrid(String authorityName, int slot, DbGridAlternative alternative, + String declaredBy) { + String modern = alternative == null ? null : alternative.projGridName(); + String legacy = alternative == null ? null : alternative.oldProjGridName(); + String format = alternative == null ? null : alternative.projGridFormat(); + String method = alternative == null ? null : alternative.projMethod(); + boolean inverse = alternative != null && alternative.inverseDirection(); + + List probed = new ArrayList(3); + addIfNew(probed, modern); + addIfNew(probed, legacy); + addIfNew(probed, authorityName); + + for (int i = 0; i < probed.size(); i++) { + GridInfo probe = probe(probed.get(i), false, declaredBy); + if (probe.available) { + return new GridInfo(authorityName, false, true, probe.resolverName, probe.origin, + probe.sizeBytes, null, declaredBy, null, slot, modern, format, method, + inverse, probed.get(i), probed); + } + } + StringBuilder why = new StringBuilder("no configured resolver has "); + for (int i = 0; i < probed.size(); i++) { + if (i > 0) { + why.append(" or "); + } + why.append(probed.get(i)); + } + if (alternative == null) { + why.append(" (the authority name has no grid_alternatives row, so there is no modern " + + "GeoTIFF form to fall back to)"); + } + return new GridInfo(authorityName, false, false, null, null, -1L, null, declaredBy, + why.toString(), slot, modern, format, method, inverse, null, probed); + } + + /** + * A later grid slot whose shift is carried by the file an earlier slot already resolved. + * + *

This is PROJ's own {@code .las}/{@code .los} collapse, reported rather than performed + * silently. {@code substitutePROJAlternativeGridNames} + * ({@code 9.8.1:src/iso19111/operation/singleoperation.cpp}, the + * {@code projGridFormat == "GTiff"} branch) looks up {@code grid_alternatives} for the + * latitude file alone and replaces the whole pair with one file carrying a + * Latitude and longitude difference file parameter. Note that upstream's + * {@code grid_alternatives} has a row for {@code conus.las} and none for {@code conus.los} + * — only 1 of the 85 distinct {@code grid2_name}s has one — which is precisely why the + * second slot has to be resolved this way and not on its own. + * + *

The same collapse holds for the pre-PROJ-7 form: the CTABLE V2 {@code conus} that + * {@code proj4j-grids-us-legacy} ships also carries both components. So the file recorded here is + * whatever the first slot actually resolved to, not the modern name it might have. + * + *

Availability is copied from the first slot: two slots satisfied by one file cannot disagree + * about whether that file exists. + * + * @param firstSlot the already-resolved first slot + * @param authorityName this slot's authority name, for example {@code conus.los} + * @param slot this slot's number + * @param alternative this slot's own {@code grid_alternatives} row, usually null + * @param declaredBy what asks for this grid + * @param reason why the first slot's file covers this one + * @return the info; never null + */ + static GridInfo sharedWithEarlierSlot(GridInfo firstSlot, String authorityName, int slot, + DbGridAlternative alternative, String declaredBy, + String reason) { + List probed = new ArrayList(1); + addIfNew(probed, firstSlot.satisfiedBy); + addIfNew(probed, alternative == null ? null : alternative.projGridName()); + addIfNew(probed, authorityName); + String satisfiedBy = firstSlot.satisfiedBy == null ? null + : firstSlot.satisfiedBy + " -- " + reason; + return new GridInfo(authorityName, false, firstSlot.available, firstSlot.resolverName, + firstSlot.origin, firstSlot.sizeBytes, null, declaredBy, + firstSlot.available ? null + : "carried by " + firstSlot.name() + "'s file, which is itself unreachable: " + + firstSlot.skipReason, + slot, alternative == null ? null : alternative.projGridName(), + firstSlot.projGridFormat, firstSlot.projMethod, firstSlot.inverseDirection, + satisfiedBy, probed); + } + + private static void addIfNew(List into, String candidate) { + if (candidate != null && !candidate.isEmpty() && !into.contains(candidate)) { + into.add(candidate); + } + } + + /** + * The grid file name as it was asked for, with any {@code @} prefix stripped. For a legacy + * PROJ.4 string this is the pre-PROJ-7 name, for example {@code conus}; for an authority + * operation slot it is the authority's own spelling, for example {@code conus.las}. + * + * @return the name; never null, never empty + */ + public String name() { + return name; + } + + /** + * The PROJ 7+ file name for the same shift, where it is known. + * + *

Read from the authority database's {@code grid_alternatives} when this grid came from an + * operation slot; otherwise from the small rename table this class carries for the grids the + * legacy datum definitions can ask for. + * + * @return the modern name, or empty if neither source knows one + */ + public Optional modernName() { + return modernName != null ? Optional.of(modernName) + : Optional.ofNullable(MODERN_NAMES.get(name)); + } + + /** + * Which grid slot of the authority operation this is: {@code 1} for {@code grid_name}, + * {@code 2} for {@code grid2_name}. + * + *

{@code 2} is the trap. NADCON splits the latitude and longitude shifts across a + * {@code .las}/{@code .los} pair and 150 of the shipped database's 1,062 grid transformations have + * a second grid, so a selector reading only slot 1 applies half the shift and reports success. + * + * @return the slot number, or empty for a grid that came from a {@code +nadgrids=} token rather + * than from an authority operation + */ + public java.util.OptionalInt slot() { + return slot > 0 ? java.util.OptionalInt.of(slot) : java.util.OptionalInt.empty(); + } + + /** + * The file that actually satisfies this slot, and why, when it is not simply this grid's own + * name. + * + *

For {@code conus.los} in a deployment with the GeoTIFF grid pack this reads + * {@code "us_noaa_conus.tif -- the GeoTIFF form of conus.las carries both the latitude and the + * longitude shift"}: two authority slots, one file. The authority's requirement is reported + * unchanged and the substitution is reported next to it, so neither can be mistaken for the + * other. + * + * @return the satisfying file and its reason, or empty if unavailable or if the name resolved + * directly + */ + public Optional satisfiedBy() { + return Optional.ofNullable(satisfiedBy); + } + + /** + * Every file name that was probed for this slot, in the order they were tried. + * + * @return an unmodifiable list; empty for a grid that did not come from an authority operation + */ + public List probedNames() { + return probedNames; + } + + /** + * The format {@code grid_alternatives} declares for the modern file: {@code GTiff}, {@code GTX}, + * {@code NTv2} or {@code JSON}. + * + *

Distinct from {@link #format()}, which is read from a file that was actually opened. This one + * is authority metadata and is available without touching the file. + * + * @return the declared format, or empty + */ + public Optional declaredFormat() { + return Optional.ofNullable(projGridFormat); + } + + /** + * The PROJ operator this grid feeds: {@code hgridshift}, {@code vgridshift}, {@code gridshift}, + * {@code geoid_like}, {@code geocentricoffset}, {@code tinshift}, {@code velocity_grid} or + * {@code defmodel}. + * + *

Proj4J implements some of these and not others, and the difference is + * {@link org.locationtech.proj4j.ErrorCause#UNSUPPORTED_OPERATION_METHOD} rather than a wrong + * number. + * + * @return the operator name, or empty + */ + public Optional projMethod() { + return Optional.ofNullable(projMethod); + } + + /** + * Whether the PROJ grid runs the opposite way from the authority's declaration. + * + *

Ignoring this applies the shift with the wrong sign: twice the error, still plausible. + * + * @return true iff the direction is reversed + */ + public boolean isInverseDirection() { + return inverseDirection; + } + + /** + * Whether the declaration carried PROJ's {@code @} prefix, which makes the grid optional and + * its absence silent in PROJ. It is not silent here; see {@link GridPolicy}. + * + * @return true iff the token was {@code @}-prefixed + */ + public boolean isOptional() { + return optional; + } + + /** + * Whether the resolver chain found this file. Proved by a probe at the time this object was + * created, not inferred from a name or a manifest. + * + * @return true iff the grid is reachable + */ + public boolean isAvailable() { + return available; + } + + /** + * Whether something on this classpath asks for this grid, as opposed to this grid merely being + * present. + * + * @return true iff a CRS or datum declares it + */ + public boolean isDeclared() { + return declaredBy != null; + } + + /** + * What declares this grid — {@code "+datum=NAD27"}, {@code "+nadgrids=@conus,@alaska"}, or + * similar. + * + * @return the declaring parameter, or empty if this grid was found by enumeration and nothing + * here asks for it + */ + public Optional declaredBy() { + return Optional.ofNullable(declaredBy); + } + + /** + * Which resolver in the chain found the file. + * + * @return the resolver name, or empty iff {@link #isAvailable()} is false + */ + public Optional resolverName() { + return Optional.ofNullable(resolverName); + } + + /** + * Where the file came from, for example + * {@code "classpath:proj4j-data/grids/conus"}. Note that the working directory is never + * consulted, so this is never a bare relative path. + * + * @return the origin, or empty iff {@link #isAvailable()} is false + */ + public Optional origin() { + return Optional.ofNullable(origin); + } + + /** + * The size of the file in bytes. + * + * @return the size, or empty if unavailable or if the resolver cannot report a length + */ + public OptionalLong sizeBytes() { + return sizeBytes >= 0 ? OptionalLong.of(sizeBytes) : OptionalLong.empty(); + } + + /** + * The grid's on-disk format — {@code CTABLE V2}, {@code NTv1}, {@code NTv2} — read + * from its header. + * + * @return the format, or empty if the file has not been read; never a guess from the + * file name + */ + public Optional format() { + return Optional.ofNullable(format); + } + + /** + * Why the grid was skipped. + * + * @return the reason, or empty iff {@link #isAvailable()} is true + */ + public Optional skipReason() { + return Optional.ofNullable(skipReason); + } + + /** + * Anything a caller ought to know about this particular grid that is not covered by the other + * accessors — notably that five of the seven US grids have no legacy form to ship. + * + * @return the note, or empty + */ + public Optional note() { + return Optional.ofNullable(NOTES.get(name)); + } + + /** + * The public URL this grid can be seen at, as information for a human. + * + *

Proj4J core contains no network code, and reading this value does not and cannot cause a + * fetch. A grid reachable only at this URL is reported as unavailable. + * + * @return the URL, or empty if the modern name is unknown + */ + public Optional knownUrl() { + Optional modern = modernName(); + return modern.isPresent() ? Optional.of(CDN_BASE + modern.get()) + : Optional.empty(); + } + + /** + * One line stating, in words, exactly which of reachable and declared this grid is. + * + * @return the description, without a trailing newline; never null + */ + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append(optional ? "@" : "").append(name); + if (available) { + sb.append(" -> REACHABLE from ").append(resolverName == null ? "?" : resolverName); + if (origin != null) { + sb.append(" (").append(origin).append(')'); + } + if (sizeBytes >= 0) { + sb.append(", ").append(sizeBytes).append(" B"); + } + if (format != null) { + sb.append(", format ").append(format); + } + if (projGridFormat != null) { + sb.append(", declared ").append(projGridFormat); + } + if (projMethod != null) { + sb.append(" for +proj=").append(projMethod); + } + if (inverseDirection) { + sb.append(", INVERSE DIRECTION relative to the authority's declaration"); + } + if (satisfiedBy != null && !satisfiedBy.equals(name)) { + sb.append(", satisfied by ").append(satisfiedBy); + } + } else if (declaredBy != null) { + sb.append(" -> DECLARED BUT UNREACHABLE (").append(skipReason).append(')'); + sb.append(optional + ? ". The @ prefix means PROJ and proj4j 1.4.3 skip it silently and apply no " + + "shift; the coordinate is then wrong by the size of the shift and " + + "entirely plausible" + : ". Required, so no transformation using it can be built"); + } else { + sb.append(" -> not reachable and not declared"); + } + if (declaredBy != null) { + sb.append(" [declared by ").append(declaredBy).append(']'); + } + String note = NOTES.get(name); + if (note != null) { + sb.append(" [").append(note).append(']'); + } + Optional modernSpelling = modernName(); + if (modernSpelling.isPresent() && !available) { + sb.append(" [PROJ 7+ name ").append(modernSpelling.get()).append("; see ") + .append(CDN_BASE).append(modernSpelling.get()) + .append(" -- information only, proj4j core performs no network I/O]"); + } + return sb.toString(); + } + + @Override + public String toString() { + return describe(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof GridInfo)) { + return false; + } + GridInfo that = (GridInfo) o; + return name.equals(that.name) && optional == that.optional && available == that.available + && sizeBytes == that.sizeBytes + && eq(resolverName, that.resolverName) && eq(origin, that.origin) + && eq(format, that.format) && eq(declaredBy, that.declaredBy) + && eq(skipReason, that.skipReason); + } + + private static boolean eq(String a, String b) { + return a == null ? b == null : a.equals(b); + } + + @Override + public int hashCode() { + int h = name.hashCode(); + h = 31 * h + (optional ? 1 : 0); + h = 31 * h + (available ? 1 : 0); + h = 31 * h + (declaredBy == null ? 0 : declaredBy.hashCode()); + return h; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/GridPolicy.java b/core/src/main/java/org/locationtech/proj4j/api/GridPolicy.java new file mode 100644 index 0000000..420d566 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/GridPolicy.java @@ -0,0 +1,88 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import org.locationtech.proj4j.ErrorCause; + +/** + * What to do about a grid file a CRS declares and no configured resolver can find. + * + *

The {@code @} wart, and this library's position on it

+ * + *

PROJ's {@code +nadgrids=} accepts an {@code @} prefix per token, meaning optional: + * if the file is absent, PROJ clears the error and carries on with one fewer grid + * ({@code 9.8.1:src/grids.cpp}, {@code getListOfGridSets}). {@code +datum=NAD27} expands to + * {@code +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat} — every token optional — + * so on a deployment with none of those files a NAD27 transformation reports success and applies + * no shift at all. + * + *

That is not a hypothetical. It is the worst measured defect this library has had: at San + * Francisco, {@code EPSG:4267} to {@code EPSG:4326} was out by 95.573 m, with no + * exception, no warning, no log line, and a perfectly plausible coordinate. + * + *

The position: {@code @} is parsed, recorded, and then reported. It is never a licence to + * be silent. The token — including its {@code @} — round-trips through + * {@link Crs#toProjString()}, appears in {@link Crs#describe()} with the reason it could not be + * resolved, and is listed by {@link Crs#missingGrids()}. + * + *

The legacy API is not affected by this enum

+ * + *

{@link org.locationtech.proj4j.CoordinateTransformFactory} keeps 1.4.3's behaviour exactly, + * whatever is set here: it skips the missing grid and returns the unshifted coordinate. That is + * the frozen-API promise, and it is not conditional on a policy object the legacy caller has never + * heard of. The new facade is where the strict default lives. + * + * @see Crs#missingGrids() + * @see org.locationtech.proj4j.datum.Grid#describeNadGrids(String) + * @since 1.5.0 + */ +public enum GridPolicy { + + /** + * The default on the new facade. A declared grid that cannot be resolved, and for which + * the datum offers no non-grid fallback, makes the operation ballpark — because + * that is exactly what it is: a datum change that will not be performed. What happens next is + * {@link BallparkPolicy}'s decision, and it is taken once, at creation time: the default + * {@link BallparkPolicy#REJECT} throws {@link ErrorCause#BALLPARK_REJECTED} from + * {@link Proj#createCrsToCrs(String, String)}, naming the files. + * + *

Note what this deliberately does not do: it does not throw per coordinate. A + * missing grid is a property of the deployment, not of row 4,000,000, and discovering it four + * million times is worse than discovering it once. If the operation was built at all, it + * transforms. + */ + REQUIRE_ALL, + + /** + * Proceed. The missing grid does not make the operation ballpark, so it is built and it + * transforms, but every unresolved file is recorded in {@link CrsOperation#warnings()} and + * {@link CrsOperation#missingGrids()} and named by {@link CrsOperation#describe()}. + * + *

This is the setting for a caller who has decided the residual datum error is acceptable + * and wants it on the record rather than discovered later. + */ + WARN, + + /** + * Behaves as {@link #WARN} for the operation, and additionally emits nothing to any log sink + * — the silence of proj4j 1.4.3 and of PROJ itself for an {@code @}-prefixed token. + * + *

Must be asked for by name. {@link Crs#missingGrids()} and + * {@link CrsOperation#missingGrids()} still report the file: the introspection channel is never + * switched off, whatever the policy. + */ + PROJ4_COMPAT +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/LegacyAdapters.java b/core/src/main/java/org/locationtech/proj4j/api/LegacyAdapters.java new file mode 100644 index 0000000..0ee9c0c --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/LegacyAdapters.java @@ -0,0 +1,177 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import org.locationtech.proj4j.BulkCoordinateTransform; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; + +/** + * The opt-in bridge between the frozen 1.x API and this package. + * + *

Why a bridge and not a re-route

+ * + *

{@link CoordinateTransformFactory} could have been changed to delegate here. It was not, and it + * will not be. Doing so would make {@code EPSG:4267 -> EPSG:4269} start throwing + * {@link ErrorCause#BALLPARK_REJECTED} for GeoTools, GeoServer, geomesa and every other caller, on + * code that has worked for fifteen years. The new default is the right default for new + * code and an unacceptable surprise for existing code, and there is no version of "we changed it + * for your own good" that is acceptable in a library reached transitively. + * + *

So the legacy classes are bit-for-bit unchanged, and this class is how a caller opts in. One + * line changes: + * + *

{@code
+ * // before
+ * CoordinateTransformFactory factory = new CoordinateTransformFactory();
+ *
+ * // after: the strict engine, behind the interface the calling code already implements
+ * CoordinateTransformFactory factory = LegacyAdapters.transformFactory(ProjContext.DEFAULT);
+ * }
+ * + *

Everything downstream of that line keeps compiling and keeps its types. What changes is that + * {@link CoordinateTransformFactory#createTransform(CoordinateReferenceSystem, + * CoordinateReferenceSystem)} now applies {@link BallparkPolicy} and the rest of the context — + * so it can throw where it used to return an unshifted coordinate. That is the point of asking for + * it. + * + *

There is deliberately no global switch and no system property. Opting in is a visible + * change in the application's own source, at the site that constructs the factory, so that + * {@code git blame} can answer why the behaviour changed. + * + * @see Proj + * @see CoordinateTransformFactory + * @since 1.5.0 + */ +public final class LegacyAdapters { + + private LegacyAdapters() { + } + + /** + * A {@link CoordinateTransformFactory} whose transforms go through this package's checks. + * + *

Substitutable for {@code new CoordinateTransformFactory()} at any call site: it + * is a {@code CoordinateTransformFactory}, so it can be assigned to that type, passed + * to code expecting it, and stored in a field of that type. + * + *

What differs from the plain factory, and only this: + *

    + *
  • {@link BallparkPolicy} is applied, so a pair whose datum change would not actually be + * performed throws {@link CrsCreationException} from {@code createTransform} instead of + * returning a transform that silently applies no shift;
  • + *
  • the context's {@link org.locationtech.proj4j.DomainErrorPolicy} is used;
  • + *
  • the returned transform is the same engine, so its numbers are identical wherever it does + * not throw.
  • + *
+ * + *

{@link org.locationtech.proj4j.io.wkt.AxisOrderPolicy} is not applied here, because + * this method is handed {@link CoordinateReferenceSystem} objects that are already built: axis + * order is a property of the CRS, and applying a policy to somebody else's CRS behind their back + * is precisely the silent transposition this design exists to prevent. Build the CRSs with + * {@link Proj#createCrs(String, ProjContext)} if you want the policy honoured. + * + * @param context the policies to apply; null means {@link Proj#defaultContext()} + * @return a factory; never null + */ + public static CoordinateTransformFactory transformFactory(ProjContext context) { + return new StrictFactory(context == null ? Proj.defaultContext() : context); + } + + /** + * Wraps an already-built legacy CRS so that this package's introspection can be used on it. + * + *

The CRS is wrapped, not re-parsed, so nothing about it changes — including its axis + * order, whatever {@code context} says. {@link Crs#definitionText()} is its parameter string + * where it has one. + * + * @param crs the legacy CRS + * @param context the context to record against it; null means {@link Proj#defaultContext()} + * @return the wrapper; never null + * @throws CrsCreationException with {@link ErrorCause#API_MISUSE} if {@code crs} is null + */ + public static Crs fromLegacy(CoordinateReferenceSystem crs, ProjContext context) { + if (crs == null) { + throw new CrsCreationException(ErrorCause.API_MISUSE, + "cannot adapt a null CoordinateReferenceSystem"); + } + ProjContext ctx = context == null ? Proj.defaultContext() : context; + String[] params = crs.getParameters(); + String definition = params == null ? crs.getName() : crs.getParameterString().trim(); + return new Crs(definition, Crs.Source.LEGACY_OBJECT, ctx, crs, null, + params != null && hasAxis(params), + "adapted from an existing CoordinateReferenceSystem: its axis order is whatever it " + + "was built with and was deliberately not re-derived, because silently " + + "transposing a CRS somebody else built is the failure this API exists to " + + "prevent."); + } + + private static boolean hasAxis(String[] params) { + for (int i = 0; i < params.length; i++) { + String p = params[i]; + if (p == null) { + continue; + } + int start = p.startsWith("+") ? 1 : 0; + if (p.regionMatches(start, "axis", 0, 4) && p.length() > start + 4 + && p.charAt(start + 4) == '=') { + return true; + } + } + return false; + } + + /** + * The factory {@link #transformFactory(ProjContext)} returns. Package-private and final: it is + * an implementation detail, and a caller should hold the {@link CoordinateTransformFactory} + * type. + */ + private static final class StrictFactory extends CoordinateTransformFactory { + + private final ProjContext context; + + StrictFactory(ProjContext context) { + super(context.domainErrorPolicy()); + this.context = context; + } + + @Override + public CoordinateTransform createTransform(CoordinateReferenceSystem sourceCRS, + CoordinateReferenceSystem targetCRS) { + return operation(sourceCRS, targetCRS).asLegacy(); + } + + @Override + public BulkCoordinateTransform createBulkTransform(CoordinateReferenceSystem sourceCRS, + CoordinateReferenceSystem targetCRS) { + return operation(sourceCRS, targetCRS).bulk(); + } + + private CrsOperation operation(CoordinateReferenceSystem sourceCRS, + CoordinateReferenceSystem targetCRS) { + return CrsOperation.create(fromLegacy(sourceCRS, context), + fromLegacy(targetCRS, context), context); + } + + @Override + public String toString() { + return "LegacyAdapters.transformFactory(" + context + ")"; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/OperationSelector.java b/core/src/main/java/org/locationtech/proj4j/api/OperationSelector.java new file mode 100644 index 0000000..eb0a9f0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/OperationSelector.java @@ -0,0 +1,978 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.spi.DbCrs; +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbGridAlternative; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbOperation; +import org.locationtech.proj4j.spi.DbParam; +import org.locationtech.proj4j.spi.DbSupersession; +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * Real coordinate-operation selection: enumerate what the authority published between two CRSs, rank + * it, apply {@link BallparkPolicy}, {@link GridPolicy} and {@link BestOperationPolicy}, and either + * choose one or say exactly why none can be chosen. + * + *

Package-private and stateless. Every method is a pure function of its arguments and of the + * resolver chain, so two executors given the same database and the same classpath reach the same + * answer — which is the whole reason the ordering below is total. + * + *

The split with {@code spi}

+ * + *

{@link ProjDatabase} reports what the authority published, in {@code (kind, authority, code)} + * order and never by accuracy. It has no policy. Everything here — the ranking, the + * three policies, and which {@link ErrorCause} to throw — is policy, and lives here so that it + * is testable against a handful of transcribed rows rather than against 6.7 MB of data. + * + * @see Proj#candidateOperations(Crs, Crs) + */ +final class OperationSelector { + + /** + * PROJ's three synthesised no-parameter datum changes, from + * {@code 9.8.1:src/iso19111/operation/oputils.cpp:61-66}. PROJ matches them by name prefix and so + * does this, because that is the only handle there is: not one of them is stored as a row + * in the shipped database, which is why the ballpark candidate below has to be synthesised. + */ + private static final String[] BALLPARK_NAME_PREFIXES = { + "Ballpark geocentric translation", + "Ballpark geographic offset", + "Ballpark vertical transformation", + }; + + /** + * The PROJ grid operators this library can actually apply to a two-dimensional CRS-to-CRS datum + * change. Sorted, for a binary search and so a reader can see the whole claim at a glance. + * + *

Exactly one entry, and that is not an oversight. {@code hgridshift} is what a NADCON, NTv1 or + * NTv2 horizontal shift becomes, and all four grid readers — CTABLE V2, NTv1, NTv2 and + * GeoTIFF — feed it. The absent ones are absent for different reasons, and + * {@link #unsupportedMethodReason} states which, per operator, rather than reporting one + * undifferentiated failure. + */ + private static final String[] EXECUTABLE_GRID_OPERATORS = { + "hgridshift", + }; + + /** + * EPSG parameter codes of the time-dependent terms of a Helmert transformation: the six rates, + * the scale rate, and the reference epoch. Their presence means the operation needs a coordinate + * epoch, and a coordinate with no time cannot be transformed by one — which is + * {@link ErrorCause#MISSING_TIME}, not a number that is merely a bit off. + */ + private static final String[] TIME_DEPENDENT_PARAM_CODES = { + "1040", // Transformation reference epoch + "1041", "1042", "1043", // rates of translation + "1044", "1045", "1046", // rates of rotation + "1047", // rate of scale difference + }; + + private OperationSelector() { + } + + // ------------------------------------------------------------------ the result + + /** + * What selection concluded. Either a candidate was chosen, or a cause and a message say why not, + * or {@link #databaseCannotSeeThisPair} is true and the caller must fall back to the legacy + * datum model. + */ + static final class Selection { + + static final Selection UNRESOLVED = new Selection(true, false, null, + Collections.emptyList(), + Collections.emptyList(), null, null); + + private final boolean databaseCannotSeeThisPair; + private final boolean noDatumChange; + private final CrsOperationCandidate selected; + private final List candidates; + private final List warnings; + private final ErrorCause failureCause; + private final String failureMessage; + + private Selection(boolean databaseCannotSeeThisPair, boolean noDatumChange, + CrsOperationCandidate selected, List candidates, + List warnings, ErrorCause failureCause, String failureMessage) { + this.databaseCannotSeeThisPair = databaseCannotSeeThisPair; + this.noDatumChange = noDatumChange; + this.selected = selected; + this.candidates = Collections.unmodifiableList(candidates); + this.warnings = Collections.unmodifiableList(warnings); + this.failureCause = failureCause; + this.failureMessage = failureMessage; + } + + boolean databaseCannotSeeThisPair() { + return databaseCannotSeeThisPair; + } + + boolean noDatumChange() { + return noDatumChange; + } + + CrsOperationCandidate selected() { + return selected; + } + + List candidates() { + return candidates; + } + + List warnings() { + return warnings; + } + + ErrorCause failureCause() { + return failureCause; + } + + String failureMessage() { + return failureMessage; + } + } + + // ------------------------------------------------------------------ CRS resolution + + /** + * The authority reference of a {@link Crs}, or null when there is nothing to look up. + * + *

Resolved from what the caller actually stated, and never guessed: + *

    + *
  • an {@code authority:code} name, split on the last colon;
  • + *
  • a WKT or PROJJSON {@code ID[]} / {@code AUTHORITY[]} clause;
  • + *
  • a PROJ string's {@code +datum=}, through PROJ's own ten-entry table (see + * {@link #geographicCrsForProjDatum}).
  • + *
+ * A PROJ string that merely happens to be equivalent to an EPSG code is not resolved to + * it: deciding that needs a comparison this class will not make, and getting it wrong attributes + * an authority's accuracy figure to a caller's parameters. + */ + static DbObjectRef referenceFor(ProjDatabase db, Crs crs) { + List ids = new ArrayList(crs.identifiers()); + if (crs.source() == Crs.Source.PROJ_STRING || crs.source() == Crs.Source.LEGACY_OBJECT) { + String datum = crs.datumCode().isPresent() ? crs.datumCode().get() : null; + String code = geographicCrsForProjDatum(datum); + if (code != null) { + ids.add("EPSG:" + code); + } + } + for (int i = 0; i < ids.size(); i++) { + DbObjectRef ref = resolveOne(db, ids.get(i)); + if (ref != null) { + return ref; + } + } + return null; + } + + private static DbObjectRef resolveOne(ProjDatabase db, String identifier) { + if (identifier == null) { + return null; + } + int colon = identifier.lastIndexOf(':'); + if (colon <= 0 || colon == identifier.length() - 1) { + return null; + } + String auth = identifier.substring(0, colon).trim(); + String code = identifier.substring(colon + 1).trim(); + if (auth.isEmpty() || code.isEmpty()) { + return null; + } + DbCrs found = db.crs(auth, code); + return found == null ? null : found.ref(); + } + + /** + * PROJ's {@code +datum=} name to EPSG geographic-CRS code table, transcribed verbatim from + * {@code 9.8.1:src/iso19111/io.cpp} — the three special cases at {@code :11130-11136} and the + * seven-row {@code datumDescs[]} at {@code :10931-10944}. Ten names, which is all of them. + * + *

This is the bridge that makes the 1,962 lines of the shipped legacy dictionaries carrying a + * {@code datum=} visible to the authority database, and it is why {@code +datum=OSGB36} can + * reach {@code EPSG:4277} and from there {@code EPSG:7710} "OSGB36 to WGS 84 (9)" at 1.0 m + * rather than the parameterised Helmert it is 1.784 m away from. + * + * @param projDatumName the {@code +datum=} value, case-sensitive as PROJ compares it + * @return the EPSG geographic 2D CRS code, or null for a name PROJ does not map either + */ + static String geographicCrsForProjDatum(String projDatumName) { + if (projDatumName == null) { + return null; + } + if ("WGS84".equals(projDatumName)) { + return "4326"; + } + if ("NAD83".equals(projDatumName)) { + return "4269"; + } + if ("NAD27".equals(projDatumName)) { + return "4267"; + } + if ("GGRS87".equals(projDatumName)) { + return "4121"; + } + if ("potsdam".equals(projDatumName)) { + return "4314"; + } + if ("carthage".equals(projDatumName)) { + return "4223"; + } + if ("hermannskogel".equals(projDatumName)) { + return "4312"; + } + if ("ire65".equals(projDatumName)) { + return "4299"; + } + if ("nzgd49".equals(projDatumName)) { + return "4272"; + } + if ("OSGB36".equals(projDatumName)) { + return "4277"; + } + return null; + } + + /** + * The geodetic CRS a datum change actually runs between: a projected CRS's base, or the CRS + * itself. + * + *

The authority publishes transformations between geodetic CRSs, so + * {@code EPSG:27700 -> EPSG:4326} is really {@code EPSG:4277 -> EPSG:4326} with a map projection + * on one end. Returns null for a compound, vertical or engineering CRS, where this two-dimensional + * facade has nothing to say and says nothing. + */ + private static DbObjectRef geodeticBase(ProjDatabase db, DbObjectRef ref) { + DbCrs crs = db.crs(ref.authName(), ref.code()); + if (crs == null) { + return null; + } + switch (crs.type()) { + case GEOGRAPHIC_2D: + case GEOGRAPHIC_3D: + case GEOCENTRIC: + case GEODETIC_OTHER: + return crs.ref(); + case PROJECTED: + return crs.baseCrs(); + default: + return null; + } + } + + private static DbObjectRef datumOf(ProjDatabase db, DbObjectRef geodeticRef) { + DbCrs crs = db.crs(geodeticRef.authName(), geodeticRef.code()); + return crs == null ? null : crs.datum(); + } + + // ------------------------------------------------------------------ selection + + /** + * Enumerates, ranks and chooses. + * + * @param db the database; never null + * @param source the source CRS + * @param target the target CRS + * @param context the governing policies + * @return the selection; {@link Selection#UNRESOLVED} when the database cannot see this pair, in + * which case the caller must fall back to the legacy datum model rather than pretend + */ + static Selection select(ProjDatabase db, Crs source, Crs target, ProjContext context) { + DbObjectRef srcRef = referenceFor(db, source); + DbObjectRef tgtRef = referenceFor(db, target); + if (srcRef == null || tgtRef == null) { + return Selection.UNRESOLVED; + } + DbObjectRef srcBase = geodeticBase(db, srcRef); + DbObjectRef tgtBase = geodeticBase(db, tgtRef); + if (srcBase == null || tgtBase == null) { + return Selection.UNRESOLVED; + } + + DbObjectRef srcDatum = datumOf(db, srcBase); + DbObjectRef tgtDatum = datumOf(db, tgtBase); + if (srcDatum != null && srcDatum.equals(tgtDatum)) { + // Same datum: EPSG:4326 -> EPSG:32633 is a conversion, not a transformation, and there is + // no datum change to select an operation for. Reporting NO_OPERATION_AVAILABLE here would + // break the single most common transformation in the world. + return new Selection(false, true, null, + Collections.emptyList(), + Collections.emptyList(), null, null); + } + + List candidates = enumerate(db, srcBase, tgtBase, srcDatum, tgtDatum); + return decide(candidates, context, srcBase, tgtBase); + } + + private static String describe(DbObjectRef datum) { + return datum == null ? "unknown" : datum.authorityCode(); + } + + // ------------------------------------------------------------------ enumeration + + /** + * Every candidate, ranked, with {@link CrsOperationCandidate#rank()} assigned. + * + *

Both directions, from two calls to + * {@link ProjDatabase#operationsBetween(String, String, String, String)} with the arguments + * swapped — because the SPI returns only the stored direction, deliberately, and merging + * them there would make "is this candidate inverted?" implicit. + */ + private static List enumerate(ProjDatabase db, DbObjectRef srcBase, + DbObjectRef tgtBase, DbObjectRef srcDatum, + DbObjectRef tgtDatum) { + List forward = db.operationsBetween(srcBase.authName(), srcBase.code(), + tgtBase.authName(), tgtBase.code()); + List reverse = db.operationsBetween(tgtBase.authName(), tgtBase.code(), + srcBase.authName(), srcBase.code()); + + List present = new ArrayList(forward.size() + reverse.size()); + for (int i = 0; i < forward.size(); i++) { + present.add(forward.get(i).ref()); + } + for (int i = 0; i < reverse.size(); i++) { + present.add(reverse.get(i).ref()); + } + + List out = + new ArrayList(forward.size() + reverse.size() + 1); + for (int i = 0; i < forward.size(); i++) { + out.add(build(db, forward.get(i), false, present)); + } + for (int i = 0; i < reverse.size(); i++) { + out.add(build(db, reverse.get(i), true, present)); + } + out.add(ballpark(srcBase, tgtBase, srcDatum, tgtDatum)); + + Collections.sort(out); + List ranked = new ArrayList(out.size()); + for (int i = 0; i < out.size(); i++) { + ranked.add(out.get(i).withRank(i)); + } + return ranked; + } + + /** + * The ballpark candidate PROJ synthesises and stores nowhere. Ranked last by construction, since + * {@link CrsOperationCandidate#compareTo} puts ballpark below everything executable, and present so + * that {@link BallparkPolicy#ALLOW} means something with a database and so that the candidate count + * matches {@code projinfo}'s. + */ + private static CrsOperationCandidate ballpark(DbObjectRef srcBase, DbObjectRef tgtBase, + DbObjectRef srcDatum, DbObjectRef tgtDatum) { + String name = "Ballpark geographic offset from " + describe(srcDatum) + " to " + + describe(tgtDatum); + DbOperation synthetic = new DbOperation(DbObjectType.OTHER_TRANSFORMATION, "PROJ", + "BALLPARK_" + srcBase.code() + "_TO_" + tgtBase.code(), name, "PROJ", "PROJString", + "+proj=noop", srcBase, tgtBase, Double.NaN, null, null, null, null, null, false); + return new CrsOperationCandidate(synthetic, false, true, null, + new ArrayList(0), null, CrsOperationCandidate.Rejection.BALLPARK, + "a ballpark offset applies no datum shift at all. The coordinate it produces is out " + + "by the size of the shift -- tens to hundreds of metres -- and is finite, " + + "in the right units and in the right part of the world, so nothing " + + "downstream can detect it. PROJ synthesises the same operation and assigns " + + "it no accuracy, which is the authority saying this is a guess.", + "synthesised, not published: the shipped database contains no ballpark row at all", + 0); + } + + /** Turns one authority row into a candidate: accuracy, grids, extent, and why it can or cannot run. */ + private static CrsOperationCandidate build(ProjDatabase db, DbOperation op, boolean inverted, + List siblings) { + Accuracy accuracy = op.hasAccuracy() + ? new Accuracy(op.accuracy(), op.authName() + ":" + op.code()) + : null; + + List grids = resolveGrids(db, op); + + DbExtent extent = CrsOperationCandidate.smallestExtent(db.extentsFor(op.ref())); + AreaOfUse area = AreaOfUse.fromDbExtent(extent); + + String methodNote = methodNote(op, grids); + + CrsOperationCandidate.Rejection rejection = CrsOperationCandidate.Rejection.NONE; + String reason = null; + + if (op.deprecated()) { + rejection = CrsOperationCandidate.Rejection.DEPRECATED; + reason = "the authority has deprecated this operation"; + } + if (rejection == CrsOperationCandidate.Rejection.NONE) { + DbObjectRef replacement = supersedingSibling(db, op, siblings); + if (replacement != null) { + rejection = CrsOperationCandidate.Rejection.SUPERSEDED; + reason = "superseded by " + replacement.authorityCode() + + ", which connects the same CRS pair and is also a candidate here"; + } + } + if (rejection == CrsOperationCandidate.Rejection.NONE && isBallparkByName(op.name())) { + rejection = CrsOperationCandidate.Rejection.BALLPARK; + reason = "the authority's own name marks this a ballpark operation, so no datum shift is " + + "actually applied"; + } + if (rejection == CrsOperationCandidate.Rejection.NONE) { + String unsupported = unsupportedMethodReason(op, grids, inverted); + if (unsupported != null) { + rejection = CrsOperationCandidate.Rejection.UNSUPPORTED_METHOD; + reason = unsupported; + } + } + if (rejection == CrsOperationCandidate.Rejection.NONE) { + StringBuilder missing = null; + for (int i = 0; i < grids.size(); i++) { + if (!grids.get(i).isAvailable()) { + if (missing == null) { + missing = new StringBuilder(); + } else { + missing.append(" and "); + } + missing.append(grids.get(i).name()); + } + } + if (missing != null) { + rejection = CrsOperationCandidate.Rejection.MISSING_GRID; + reason = "the grid file" + (grids.size() > 1 ? "s " : " ") + missing + + " cannot be found by any configured resolver"; + } + } + return new CrsOperationCandidate(op, inverted, false, accuracy, grids, area, rejection, + reason, methodNote, 0); + } + + /** + * One {@link GridInfo} per authority grid slot, including the second, with PROJ's + * {@code .las}/{@code .los} collapse reported rather than performed silently. + */ + private static List resolveGrids(ProjDatabase db, DbOperation op) { + List names = op.gridNames(); + if (names.isEmpty()) { + return Collections.emptyList(); + } + List out = new ArrayList(names.size()); + DbGridAlternative firstAlt = db.gridAlternative(names.get(0)); + GridInfo firstSlot = GridInfo.forDbGrid(names.get(0), 1, firstAlt, + op.authName() + ":" + op.code() + " grid_name"); + out.add(firstSlot); + + // PROJ looks up grid_alternatives for the LATITUDE file alone and, when the modern form is a + // GeoTIFF, replaces the whole .las/.los pair with that one file. Note the collapse is a + // property of the pair, not of a policy: conus.los has no grid_alternatives row of its own -- + // only 1 of the 85 distinct grid2_names does -- so resolving slot 2 independently would report + // every NADCON operation unusable. + boolean collapsesOntoFirst = firstAlt != null && "GTiff".equals(firstAlt.projGridFormat()); + for (int i = 1; i < names.size(); i++) { + String declaredBy = op.authName() + ":" + op.code() + " grid" + (i + 1) + "_name"; + DbGridAlternative alt = db.gridAlternative(names.get(i)); + if (collapsesOntoFirst) { + out.add(GridInfo.sharedWithEarlierSlot(firstSlot, names.get(i), i + 1, alt, + declaredBy, "one file carries both the latitude and the longitude shift, so " + + "it satisfies both authority slots " + + "(9.8.1:src/iso19111/operation/singleoperation.cpp, the " + + "projGridFormat == \"GTiff\" branch of " + + "substitutePROJAlternativeGridNames)")); + } else { + out.add(GridInfo.forDbGrid(names.get(i), i + 1, alt, declaredBy)); + } + } + return out; + } + + private static DbObjectRef supersedingSibling(ProjDatabase db, DbOperation op, + List siblings) { + List rows = db.supersededBy(op.ref()); + for (int i = 0; i < rows.size(); i++) { + DbSupersession row = rows.get(i); + // sameSourceTargetCrs is the whole point: a replacement connecting a different CRS pair + // is not a substitute for this operation and must not knock it out of the ranking. + if (row.sameSourceTargetCrs() && siblings.contains(row.replacement())) { + return row.replacement(); + } + } + return null; + } + + static boolean isBallparkByName(String name) { + if (name == null) { + return false; + } + for (int i = 0; i < BALLPARK_NAME_PREFIXES.length; i++) { + if (name.startsWith(BALLPARK_NAME_PREFIXES[i])) { + return true; + } + } + return false; + } + + // ------------------------------------------------------------------ capability + + private static String methodNote(DbOperation op, List grids) { + if (op.kind() == DbObjectType.CONCATENATED_OPERATION) { + return "concatenated operation, " + op.steps().size() + " step(s)"; + } + if (op.isProjStringMethod()) { + return "method is a literal PROJ pipeline: " + op.methodName(); + } + if (op.isWktMethod()) { + return "method is a literal WKT CoordinateOperation"; + } + StringBuilder sb = new StringBuilder(); + sb.append("method ").append(op.methodAuthName()).append(':').append(op.methodCode()) + .append(' ').append(op.methodName()); + for (int i = 0; i < grids.size(); i++) { + if (grids.get(i).projMethod().isPresent()) { + sb.append(" -> +proj=").append(grids.get(i).projMethod().get()); + break; + } + } + return sb.toString(); + } + + /** + * Why this library cannot execute an operation, or null if it can. + * + *

Per-operator rather than one undifferentiated failure, because "Proj4J has not implemented + * the unified {@code gridshift} operator" and "this operation needs a coordinate epoch" lead a + * caller to entirely different actions. + */ + private static String unsupportedMethodReason(DbOperation op, List grids, + boolean inverted) { + switch (op.kind()) { + case CONCATENATED_OPERATION: + return "a concatenated operation of " + op.steps().size() + " steps. Proj4J can see " + + "and rank it but not yet execute it: the facade builds a single " + + "transformation, and chaining authority steps -- each with its own " + + "direction, and note that step numbers are not indices, two upstream " + + "operations number their steps 2 and 3 with no step 1 -- belongs to the " + + "pipeline engine."; + case HELMERT_TRANSFORMATION: + return helmertReason(op); + case GRID_TRANSFORMATION: + return gridReason(op, grids, inverted); + case OTHER_TRANSFORMATION: + return otherReason(op); + default: + return "unrecognised operation kind " + op.kind(); + } + } + + private static String helmertReason(DbOperation op) { + List params = op.parameters(); + for (int i = 0; i < params.size(); i++) { + String code = params.get(i).code(); + if (Arrays.asList(TIME_DEPENDENT_PARAM_CODES).contains(code)) { + return "a time-dependent Helmert transformation: parameter " + params.get(i).authName() + + ":" + code + " (" + params.get(i).name() + ") makes the result a function " + + "of the coordinate's epoch, and this facade's coordinates carry no time. " + + "Executing it with an assumed epoch would produce a plausible coordinate " + + "wrong by the accumulated plate motion."; + } + } + return null; + } + + private static String gridReason(DbOperation op, List grids, boolean inverted) { + if (grids.isEmpty()) { + return "a grid transformation that names no grid file"; + } + GridInfo first = grids.get(0); + if (!first.projMethod().isPresent()) { + return "the authority grid " + first.name() + " has no grid_alternatives row, so there " + + "is no PROJ operator and no modern file name to map it to. Proj4J will not " + + "guess which operator a grid feeds from its file extension."; + } + String operator = first.projMethod().get(); + if (Arrays.binarySearch(EXECUTABLE_GRID_OPERATORS, operator) < 0) { + return "the grid feeds PROJ's +proj=" + operator + " operator, which this library does " + + "not apply to a two-dimensional CRS-to-CRS datum change" + operatorNote(operator) + + "."; + } + if (inverted && first.isInverseDirection()) { + return "this operation would have to be run inverted, and grid_alternatives already " + + "declares " + first.name() + "'s PROJ form to run in the inverse direction. " + + "Composing the two inversions is exactly where a shift gets applied with the " + + "wrong sign -- twice the error, still plausible -- so it is refused rather " + + "than attempted."; + } + return null; + } + + private static String operatorNote(String operator) { + if ("gridshift".equals(operator)) { + return " (the unified NADCON 5 / general-shift operator; only +proj=hgridshift is " + + "implemented)"; + } + if ("xyzgridshift".equals(operator) || "geocentricoffset".equals(operator)) { + return " (a geocentric shift by grid; not implemented)"; + } + if ("vgridshift".equals(operator) || "geoid_like".equals(operator)) { + return " (a vertical shift. Proj4J does have a vertical grid operator, but a Crs here is " + + "two-dimensional by construction -- see Proj.createCrs on compound CRSs -- so " + + "there is no height for it to shift)"; + } + if ("velocity_grid".equals(operator) || "defmodel".equals(operator)) { + return " (a deformation model; it needs a coordinate epoch, and this facade's " + + "coordinates carry no time)"; + } + if ("tinshift".equals(operator)) { + return " (triangulated shift; the operator exists in the pipeline engine but is not " + + "reachable from this facade)"; + } + return ""; + } + + private static String otherReason(DbOperation op) { + if (op.isProjStringMethod()) { + String pipeline = op.methodName() == null ? "" : op.methodName(); + if (pipeline.contains("+proj=noop")) { + return null; + } + return "the authority expresses this operation as a literal PROJ pipeline, which this " + + "facade does not build: " + pipeline + ". This is how all 19 NKG " + + "other_transformation rows are written, and finishing them needs +proj=" + + "deformation plus a time dimension on the coordinate, not more data."; + } + if (op.isWktMethod()) { + return "the authority expresses this operation as a literal WKT CoordinateOperation, " + + "which this facade does not build."; + } + return "the authority method " + op.methodAuthName() + ":" + op.methodCode() + " " + + op.methodName() + " is not one this library implements."; + } + + // ------------------------------------------------------------------ decision + + /** + * Applies the three policies to a ranked list. This is the decision table from the architecture + * note, made executable. + */ + private static Selection decide(List candidates, ProjContext context, + DbObjectRef srcBase, DbObjectRef tgtBase) { + List warnings = new ArrayList(); + + CrsOperationCandidate usable = null; + CrsOperationCandidate bestRejectedForGrid = null; + CrsOperationCandidate bestRejectedForMethod = null; + CrsOperationCandidate ballparkCandidate = null; + + for (int i = 0; i < candidates.size(); i++) { + CrsOperationCandidate c = candidates.get(i); + switch (c.rejection()) { + case NONE: + if (usable == null) { + usable = c; + } + break; + case MISSING_GRID: + if (bestRejectedForGrid == null) { + bestRejectedForGrid = c; + } + break; + case UNSUPPORTED_METHOD: + if (bestRejectedForMethod == null) { + bestRejectedForMethod = c; + } + break; + case BALLPARK: + if (ballparkCandidate == null) { + ballparkCandidate = c; + } + break; + default: + break; + } + } + + // GridPolicy.WARN / PROJ4_COMPAT: a missing grid stops being disqualifying. It is still + // reported -- the introspection channel is never switched off, whatever the policy. + if (usable == null && bestRejectedForGrid != null + && context.gridPolicy() != GridPolicy.REQUIRE_ALL) { + usable = bestRejectedForGrid; + bestRejectedForGrid = null; + for (int i = 0; i < usable.missingGrids().size(); i++) { + warnings.add("GridPolicy." + context.gridPolicy() + ": proceeding with " + + usable.authorityCode() + " although " + usable.missingGrids().get(i).name() + + " is unreachable, so that part of the shift will not be applied: " + + usable.missingGrids().get(i).describe()); + } + } + + if (usable != null) { + // Deliberately the most accurate REJECTED candidate, not the highest-ranked one. Rank + // puts every usable candidate above every unusable one, which is right for a list a human + // reads and useless for the degradation question -- so that question is asked directly. + CrsOperationCandidate better = mostAccurateRejected(candidates); + if (better != null) { + if (usable.isDegradedRelativeTo(better) + && context.bestOperationPolicy() == BestOperationPolicy.REQUIRE_BEST) { + return failure(candidates, warnings, ErrorCause.BEST_OPERATION_UNAVAILABLE, + degradedMessage(usable, better, srcBase, tgtBase, context)); + } + warnings.add(betterButUnavailableNote(usable, better, context)); + } + return new Selection(false, false, usable, candidates, warnings, null, null); + } + + // Nothing usable. There are three reasons that can be true of, and they lead a caller to three + // entirely different actions -- add a file / there is nothing you can add / the authority + // publishes nothing at all -- so they are three different ErrorCauses and not one. + // + // A real operation exists and only its file or its operator is missing. That is a strictly + // more informative failure than "ballpark", so it wins even when BallparkPolicy.ALLOW would + // have accepted the ballpark -- UNLESS the caller has ALSO said, through + // BestOperationPolicy.ALLOW_DEGRADED, that it accepts losing accuracy. Dropping from a + // published 0.15 m to an unbounded offset is the largest degradation there is, so + // REQUIRE_BEST refusing it is the same rule as everywhere else, not a special case. + boolean mayDegradeToBallpark = context.ballparkPolicy() == BallparkPolicy.ALLOW + && context.bestOperationPolicy() == BestOperationPolicy.ALLOW_DEGRADED; + + // The missing-grid branch comes first even when the most accurate rejected candidate was + // rejected for its method, because a missing file is something a caller can fix and an + // unimplemented operator is not. Reporting UNSUPPORTED_OPERATION_METHOD when a grid would also + // have worked would be true and useless. + if (!mayDegradeToBallpark && bestRejectedForGrid != null) { + return failure(candidates, warnings, ErrorCause.BEST_OPERATION_UNAVAILABLE, + missingGridMessage(bestRejectedForGrid, candidates, srcBase, tgtBase, context)); + } + if (!mayDegradeToBallpark && bestRejectedForMethod != null) { + return failure(candidates, warnings, ErrorCause.UNSUPPORTED_OPERATION_METHOD, + unsupportedMessage(bestRejectedForMethod, candidates, srcBase, tgtBase)); + } + if (ballparkCandidate != null) { + if (context.ballparkPolicy() == BallparkPolicy.ALLOW) { + CrsOperationCandidate skipped = bestRejectedForGrid != null ? bestRejectedForGrid + : bestRejectedForMethod; + if (skipped != null) { + warnings.add("degraded to a ballpark offset, which applies no shift at all, " + + "although the authority does publish " + skipped.authorityCode() + " (" + + skipped.name() + (skipped.accuracy().isPresent() + ? ", " + skipped.accuracy().get().metres() + " m" : "") + + "): " + skipped.rejectionReason().orElse("") + + " This is the largest degradation there is and it was allowed only " + + "because BallparkPolicy.ALLOW and " + + "BestOperationPolicy.ALLOW_DEGRADED were both set."); + } + warnings.add("BALLPARK: " + ballparkCandidate.rejectionReason().orElse("")); + return new Selection(false, false, ballparkCandidate, candidates, warnings, null, + null); + } + return failure(candidates, warnings, ErrorCause.BALLPARK_REJECTED, + ballparkMessage(ballparkCandidate, candidates, srcBase, tgtBase)); + } + // Reachable only when every candidate, including the ballpark, is deprecated or superseded. + return failure(candidates, warnings, ErrorCause.NO_OPERATION_AVAILABLE, + "every operation the authority publishes between " + srcBase.authorityCode() + + " and " + tgtBase.authorityCode() + " is deprecated or superseded:\n" + + list(candidates)); + } + + /** + * The most accurate candidate that cannot be used because of a missing grid or an + * unimplemented method, or null if there is none. + * + *

Deprecated, superseded and ballpark candidates are excluded: an operation the authority has + * withdrawn is not evidence that a better answer was available, and a ballpark one has no accuracy + * to compare. Ties are broken on the authority reference, so the choice is deterministic. + */ + private static CrsOperationCandidate mostAccurateRejected( + List candidates) { + CrsOperationCandidate best = null; + for (int i = 0; i < candidates.size(); i++) { + CrsOperationCandidate c = candidates.get(i); + if (c.rejection() != CrsOperationCandidate.Rejection.MISSING_GRID + && c.rejection() != CrsOperationCandidate.Rejection.UNSUPPORTED_METHOD) { + continue; + } + if (best == null || c.isBetterAccuracyThan(best)) { + best = c; + } + } + return best; + } + + private static Selection failure(List candidates, List warnings, + ErrorCause cause, String message) { + return new Selection(false, false, null, candidates, warnings, cause, message); + } + + // ------------------------------------------------------------------ messages + + private static String betterButUnavailableNote(CrsOperationCandidate selected, + CrsOperationCandidate better, + ProjContext context) { + StringBuilder sb = new StringBuilder(); + sb.append("a better-ranked candidate was skipped: ").append(better.authorityCode()) + .append(", ").append(better.name()).append(", ") + .append(better.accuracy().isPresent() + ? better.accuracy().get().metres() + " m" : "accuracy unknown") + .append(" -- ").append(better.rejectionReason().orElse("")).append(' '); + if (selected.isDegradedRelativeTo(better)) { + sb.append("BestOperationPolicy.").append(context.bestOperationPolicy()) + .append(" allowed the degradation to "); + } else { + sb.append("It is no more accurate than the operation that was selected, so this is not a " + + "degradation and BestOperationPolicy.REQUIRE_BEST has nothing to refuse. " + + "Selected instead: "); + } + sb.append(selected.authorityCode()).append(", ").append(selected.name()).append(", ") + .append(selected.accuracy().isPresent() + ? selected.accuracy().get().metres() + " m" : "accuracy unknown") + .append('.'); + return sb.toString(); + } + + private static String degradedMessage(CrsOperationCandidate selected, + CrsOperationCandidate better, DbObjectRef srcBase, + DbObjectRef tgtBase, ProjContext context) { + StringBuilder sb = new StringBuilder(); + sb.append("refusing to build ").append(srcBase.authorityCode()).append(" -> ") + .append(tgtBase.authorityCode()) + .append(": the best operation the authority publishes cannot be executed here, and " + + "the best one that can is less accurate.\n"); + sb.append(" best : ").append(better.describe()).append('\n'); + sb.append(" available : ").append(selected.describe()).append('\n'); + appendMissingFiles(sb, better); + sb.append("BestOperationPolicy.").append(context.bestOperationPolicy()) + .append(" refuses this rather than quietly returning coordinates that are ") + .append(accuracyGap(selected, better)) + .append(" worse than you asked for. To accept the degradation, and record that you " + + "did: ProjContext.builder().bestOperationPolicy(" + + "BestOperationPolicy.ALLOW_DEGRADED).build()."); + return sb.toString(); + } + + private static String accuracyGap(CrsOperationCandidate selected, CrsOperationCandidate better) { + if (!selected.accuracy().isPresent() || !better.accuracy().isPresent()) { + return "of unquantifiable accuracy"; + } + return (selected.accuracy().get().metres() - better.accuracy().get().metres()) + " m"; + } + + private static String missingGridMessage(CrsOperationCandidate best, + List candidates, + DbObjectRef srcBase, DbObjectRef tgtBase, + ProjContext context) { + StringBuilder sb = new StringBuilder(); + sb.append("refusing to build ").append(srcBase.authorityCode()).append(" -> ") + .append(tgtBase.authorityCode()).append(": the authority publishes an operation for " + + "this pair and not one of the executable ones has its grid files.\n"); + sb.append(" best executable candidate: ").append(best.describe()).append('\n'); + appendMissingFiles(sb, best); + sb.append("This is NOT a ballpark rejection. The authority does publish an operation -- ") + .append(best.authorityCode()).append(", ").append(best.name()); + if (best.accuracy().isPresent()) { + sb.append(", ").append(best.accuracy().get().metres()).append(" m"); + } + sb.append(" -- and it is a real one; what is missing is the data file. Add the grid and this " + + "call succeeds.\n"); + sb.append("All candidates, best first:\n").append(list(candidates)); + sb.append("To proceed with the best operation that can be executed, and record that you " + + "did: ProjContext.builder().gridPolicy(GridPolicy.WARN).build(), or " + + ".bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED). GridPolicy is currently ") + .append(context.gridPolicy()).append('.'); + return sb.toString(); + } + + /** + * Names every file the candidate needs and cannot find, one line each, including the second + * grid of a NADCON pair and every alternative spelling that was probed. A message that named + * only {@code conus.las} would send a reader looking for one file when the authority requires two. + */ + private static void appendMissingFiles(StringBuilder sb, CrsOperationCandidate candidate) { + List missing = candidate.missingGrids(); + if (missing.isEmpty()) { + return; + } + sb.append(" missing grid files (").append(missing.size()).append(" of ") + .append(candidate.grids().size()).append(" the authority requires):\n"); + for (int i = 0; i < missing.size(); i++) { + GridInfo g = missing.get(i); + sb.append(" ").append(g.name()); + if (g.slot().isPresent()) { + sb.append(" [slot ").append(g.slot().getAsInt()).append(']'); + } + if (!g.probedNames().isEmpty()) { + sb.append(" tried ").append(g.probedNames()); + } + if (g.knownUrl().isPresent()) { + sb.append(" see ").append(g.knownUrl().get()) + .append(" -- information only, proj4j core performs no network I/O"); + } + sb.append('\n'); + } + if (candidate.grids().size() > 1) { + sb.append(" NOTE: this operation needs ").append(candidate.grids().size()) + .append(" grid files, not one. NADCON splits the latitude and longitude shifts " + + "across a .las/.los pair (150 of the 1,062 grid transformations in the " + + "shipped database have a second grid), and applying only the first " + + "would shift by half and report success.\n"); + } + } + + private static String unsupportedMessage(CrsOperationCandidate best, + List candidates, + DbObjectRef srcBase, DbObjectRef tgtBase) { + StringBuilder sb = new StringBuilder(); + sb.append("refusing to build ").append(srcBase.authorityCode()).append(" -> ") + .append(tgtBase.authorityCode()).append(": the authority publishes ") + .append(candidates.size() - 1) + .append(" operation(s) for this pair, and this library cannot execute any of them.\n"); + sb.append(" best candidate: ").append(best.describe()).append('\n'); + sb.append("All candidates, best first:\n").append(list(candidates)); + sb.append("This is a capability boundary, not missing data: the operations are visible and " + + "their accuracies are known. Nothing you add to the classpath will change it."); + return sb.toString(); + } + + private static String ballparkMessage(CrsOperationCandidate ballpark, + List candidates, + DbObjectRef srcBase, DbObjectRef tgtBase) { + StringBuilder sb = new StringBuilder(); + sb.append("refusing to build ").append(srcBase.authorityCode()).append(" -> ") + .append(tgtBase.authorityCode()) + .append(": the only operation available is a ballpark one, ") + .append(ballpark.name()).append(". ") + .append(ballpark.rejectionReason().orElse("")).append('\n'); + if (candidates.size() == 1) { + sb.append("The authority publishes no coordinate operation between these CRSs in either " + + "direction, so this offset is synthesised rather than read -- PROJ synthesises " + + "the same one, and stores it no more than this does.\n"); + } else { + sb.append("All candidates, best first:\n").append(list(candidates)); + } + sb.append("To proceed anyway, and record that you did: ProjContext.builder()" + + ".ballparkPolicy(BallparkPolicy.ALLOW).build(). To reproduce proj4j 1.4.3 exactly, " + + "use CoordinateTransformFactory, which is unchanged and will not be changed."); + return sb.toString(); + } + + private static String list(List candidates) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < candidates.size(); i++) { + sb.append(" ").append(candidates.get(i).describe()).append('\n'); + } + return sb.toString(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/Proj.java b/core/src/main/java/org/locationtech/proj4j/api/Proj.java new file mode 100644 index 0000000..bf1e3a3 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/Proj.java @@ -0,0 +1,1087 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.UnknownAuthorityCodeException; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.io.projjson.ProjJsonReader; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinitions; +import org.locationtech.proj4j.io.wkt.WktDialect; +import org.locationtech.proj4j.io.wkt.WktParseException; +import org.locationtech.proj4j.io.wkt.WktReader; +import org.locationtech.proj4j.parser.Proj4Parser; +import org.locationtech.proj4j.parser.Proj4Parser.ParseMode; +import org.locationtech.proj4j.resource.ResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +/** + * The entry point: create a {@link Crs}, create a {@link CrsOperation}, or ask this library what it + * can and cannot do. + * + *

Everything here is static and stateless (the one exception being the process default context, + * which can be set once and only before anything is built). No instance to construct, nothing to + * close, no dependency to add: {@code org.locationtech.proj4j.api} lives in the {@code proj4j} + * artifact and that artifact has zero runtime dependencies. + * + *

{@code
+ * // Planning -- throws here if the answer would not be trustworthy.
+ * CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633");
+ *
+ * // Per row -- thread-safe, allocation-free.
+ * op.bulk().transform2D(xy, 0, numVertices, 2, status);
+ * }
+ * + *

Why this package is inside {@code proj4j} and not beside it

+ * + *

Because a consumer must be able to delete Apache SIS and the + * {@code catch (LinkageError)} they wrapped it in. Two incompatible copies of + * {@code org.opengis.util.CodeList} on one classpath — {@code geoapi-3.0.2} has + * {@code names()}, {@code gt-opengis-29.6} does not — make SIS's WKT parser throw + * {@code NoSuchMethodError}, which is an {@code Error}, not an {@code Exception}: it passes locally + * and kills Spark executors. The only cure is to stop needing SIS, which means WKT2, WKT1 in both + * dialects, and PROJJSON have to be readable and writable here. They are, and core contains + * zero references to {@code org.opengis.*}, enforced by a test that scans the compiled classes. + * + *

Introspection

+ * + *

{@link #version()}, {@link #databaseVersion()}, {@link #availableGrids()}, + * {@link #describe()}; plus, per CRS, {@link Crs#isGeocentric()}, {@link Crs#isAngular()}, + * {@link Crs#axisOrder()} and {@link Crs#describe()}. Both of these refuse to guess, on + * purpose: + * + *

    + *
  • {@link #databaseVersion()} answers only when a database is actually configured, and is + * {@link Optional#empty()} otherwise — it never guesses. An authority database now + * exists ({@code proj4j-db}, PROJ 9.8.1's {@code proj.db} transcoded to a deterministic + * read-only index), and it is opt-in: attach one with + * {@link ProjContext.Builder#database(org.locationtech.proj4j.spi.ProjDatabase)} and this reports + * its {@code metadata} table verbatim. Without one, authority codes resolve against a PROJ.4 + * {@code +init=} dictionary generated from EPSG v9.2-era data, and those files carry no + * version stamp at all, so any string here would be a guess or a lie. {@link DatabaseInfo} reports + * the vintage gap in prose either way, plus a classpath probe that is a checkable fact.
  • + *
  • {@link #availableGrids()} distinguishes reachable from declared and states, + * per resolver, whether it can even be enumerated — so an empty list is never mistaken for + * "nothing installed". See {@link GridInfo}.
  • + *
+ * + *

Whether a database is attached changes answers, not just detail. The clearest case is + * {@code EPSG:4267} → {@code EPSG:4269} (NAD27 → NAD83): with no + * database there is nothing to select from, so {@link BallparkPolicy#REJECT} throws. With one, the + * authority offers nine published transformations from 0.15 m to 2.0 m and + * none of them is ballpark, so the honest answer is a real operation — or + * {@code BEST_OPERATION_UNAVAILABLE} naming the grid files you are missing. Neither answer is + * wrong; they are answers to different questions, and {@link CrsOperation#describe()} says which + * one you asked. + * + *

The 1.x API is frozen, not re-routed

+ * + *

{@link org.locationtech.proj4j.CRSFactory} and + * {@link org.locationtech.proj4j.CoordinateTransformFactory} behave exactly as they did, and + * nothing on this page changes them. That is not an oversight: re-routing them would make + * {@code EPSG:4267 -> EPSG:4269} start throwing for GeoTools, GeoServer and geomesa on + * code that has worked for fifteen years. {@link LegacyAdapters} is the opt-in bridge for callers + * who want the new behaviour behind the old interface. + * + * @see Crs + * @see CrsOperation + * @see ProjContext + * @see LegacyAdapters + * @since 1.5.0 + */ +public final class Proj { + + /** + * The PROJ release whose algorithms, parameter semantics and error taxonomy this library + * targets. A constant, not a probe: it describes this source tree, and there is no PROJ + * installation involved at runtime. + */ + private static final String PROJ_SEMANTICS_VERSION = "9.8.1"; + + /** The registry is stateless after construction and its lookups are read-only. */ + private static final Registry REGISTRY = new Registry(); + + private static volatile ProjContext defaultContext = ProjContext.DEFAULT; + + /** + * Set the first time anything is built. {@link #setDefaultContext(ProjContext)} refuses once + * this is true, so one library on the classpath cannot change the semantics under another that + * has already resolved its CRSs. + */ + private static final AtomicBoolean somethingBuilt = new AtomicBoolean(false); + + private Proj() { + } + + // ------------------------------------------------------------------------------ the context + + /** + * The context used by every method here that does not take one explicitly. + * + * @return the process default context; never null + */ + public static ProjContext defaultContext() { + return defaultContext; + } + + /** + * Replaces the process default context. + * + *

Refuses once any {@link Crs} or {@link CrsOperation} has been created. That is the + * whole point of the method's existing at all: it lets an application state its policy once at + * start-up, and prevents a library buried three levels down the dependency tree from + * transposing every coordinate in the process after the fact. There is no way to force it and + * no way to read the policy from the environment. + * + *

Prefer passing a {@link ProjContext} per call. A test should never call this method: a + * conformance suite that silently changed the process default would be validating semantics no + * shipped default produces. + * + * @param context the new default; null restores {@link ProjContext#DEFAULT} + * @throws IllegalStateException if anything has already been built under the current default + */ + public static void setDefaultContext(ProjContext context) { + if (somethingBuilt.get()) { + throw new IllegalStateException("the default ProjContext cannot be replaced: " + + "a Crs or CrsOperation has already been created under the current default (" + + defaultContext + "), and changing it now would silently change the meaning " + + "of objects that already exist. Pass a ProjContext per call instead."); + } + defaultContext = context == null ? ProjContext.DEFAULT : context; + } + + /** + * Whether anything has been built yet, i.e. whether {@link #setDefaultContext(ProjContext)} + * would now refuse. + * + * @return true once a {@link Crs} or {@link CrsOperation} exists + */ + public static boolean isDefaultContextLocked() { + return somethingBuilt.get(); + } + + // ------------------------------------------------------------------------- creating CRSs + + /** + * Creates a CRS from any of the four notations this library reads, under + * {@link #defaultContext()}. + * + * @param definition an {@code authority:code} name, a PROJ.4 parameter string, WKT1 (OGC or + * ESRI), WKT2 (2015 or 2019), or PROJJSON + * @return the CRS; never null + * @throws CrsCreationException with a {@link Proj4jException#cause()} explaining which of + * unknown, malformed, unsupported or unavailable applies + */ + public static Crs createCrs(String definition) { + return createCrs(definition, defaultContext); + } + + /** + * Creates a CRS from any of the four notations this library reads, under an explicit context. + * + *

The notation is detected, not declared: a leading open brace is PROJJSON, a recognised WKT + * keyword followed by a bracket is WKT (dialect auto-detected by PROJ's own rule), a string + * containing {@code +} or {@code =} is a PROJ.4 parameter string, and anything else is an + * {@code authority:code} name. + * + *

For a PROJ.4 parameter string — and only for one — the context's + * {@link ProjContext#parseMode()} applies. Under the default {@link ParseMode#PROJ_COMPATIBLE} + * an unrecognised {@code +key} is retained and ignored and an unknown {@code +units} falls back + * to metres, exactly as PROJ does; under {@link ParseMode#STRICT} both are refused, the key by + * name. Read {@link ProjContext#parseMode()} for what {@code STRICT} does not cover. + * + * @param definition the CRS definition + * @param context the policies to build under; null means {@link #defaultContext()} + * @return the CRS; never null + * @throws CrsCreationException if the definition cannot be turned into a usable CRS + */ + public static Crs createCrs(String definition, ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + if (definition == null) { + throw new CrsCreationException(ErrorCause.API_MISUSE, "the CRS definition is null"); + } + String text = definition.trim(); + if (text.isEmpty()) { + throw new CrsCreationException(ErrorCause.INVALID_CRS_SYNTAX, + "the CRS definition is empty"); + } + somethingBuilt.set(true); + + if (text.charAt(0) == '{') { + return fromProjJson(definition, text, ctx); + } + if (isWkt(text)) { + return fromWkt(definition, text, ctx); + } + if (text.charAt(0) == '+' || text.indexOf('=') >= 0) { + return fromProjString(definition, text, ctx); + } + if (CRSFactory.isCompoundName(text)) { + throw new CrsCreationException(ErrorCause.CRS_TYPE_NOT_SUPPORTED, text + + " is a compound (horizontal + vertical) CRS. The new facade's Crs is " + + "two-dimensional, and answering a 3D question with a 2D CRS by dropping the " + + "vertical half would be worse than refusing. Use " + + "CRSFactory.createCompound(\"" + text + "\")."); + } + return fromName(definition, text, ctx); + } + + /** + * Creates a CRS from WKT, in any of the four dialects, under {@link #defaultContext()}. + * + *

Equivalent to {@link #createCrs(String)} for WKT input; provided so that a caller handling + * untrusted per-row input can state what it expects and get + * {@link ErrorCause#INVALID_CRS_SYNTAX} rather than a misdetection. + * + * @param wkt the WKT text + * @return the CRS; never null + * @throws CrsCreationException if the text is not WKT this library can turn into a CRS + */ + public static Crs createCrsFromWkt(String wkt) { + return createCrsFromWkt(wkt, defaultContext); + } + + /** + * Creates a CRS from WKT under an explicit context. + * + * @param wkt the WKT text + * @param context the policies to build under; null means {@link #defaultContext()} + * @return the CRS; never null + * @throws CrsCreationException if the text is not WKT this library can turn into a CRS + */ + public static Crs createCrsFromWkt(String wkt, ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + if (wkt == null) { + throw new CrsCreationException(ErrorCause.API_MISUSE, "the WKT is null"); + } + somethingBuilt.set(true); + return fromWkt(wkt, wkt.trim(), ctx); + } + + /** + * Creates a CRS from a PROJJSON document under {@link #defaultContext()}. + * + * @param json the PROJJSON text + * @return the CRS; never null + * @throws CrsCreationException if the text is not PROJJSON this library can turn into a CRS + */ + public static Crs createCrsFromProjJson(String json) { + return createCrsFromProjJson(json, defaultContext); + } + + /** + * Creates a CRS from a PROJJSON document under an explicit context. + * + * @param json the PROJJSON text + * @param context the policies to build under; null means {@link #defaultContext()} + * @return the CRS; never null + * @throws CrsCreationException if the text is not PROJJSON this library can turn into a CRS + */ + public static Crs createCrsFromProjJson(String json, ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + if (json == null) { + throw new CrsCreationException(ErrorCause.API_MISUSE, "the PROJJSON is null"); + } + somethingBuilt.set(true); + return fromProjJson(json, json.trim(), ctx); + } + + // ------------------------------------------------------------------- creating operations + + /** + * Creates an operation between two CRS definitions, under {@link #defaultContext()}. + * + *

Throws rather than returning something untrustworthy. Under the default + * {@link BallparkPolicy#REJECT} a pair whose only available datum change would not actually be + * applied raises {@link CrsCreationException} with {@link ErrorCause#BALLPARK_REJECTED} here, + * on this line — not on row 4,000,000, and not as a plausible coordinate that is out by + * the size of the shift. + * + * @param source the source CRS definition, in any notation {@link #createCrs(String)} accepts + * @param target the target CRS definition + * @return the operation; never null + * @throws CrsCreationException if either CRS cannot be built, or if no operation between them + * is one this context will vouch for + */ + public static CrsOperation createCrsToCrs(String source, String target) { + return createCrsToCrs(source, target, defaultContext); + } + + /** + * Creates an operation between two CRS definitions, under an explicit context. + * + * @param source the source CRS definition + * @param target the target CRS definition + * @param context the policies to build under; null means {@link #defaultContext()} + * @return the operation; never null + * @throws CrsCreationException if either CRS cannot be built, or if no operation between them + * is one this context will vouch for + */ + public static CrsOperation createCrsToCrs(String source, String target, ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + return createCrsToCrs(createCrs(source, ctx), createCrs(target, ctx), ctx); + } + + /** + * Creates an operation between two CRSs already built. + * + * @param source the source CRS + * @param target the target CRS + * @return the operation; never null + * @throws CrsCreationException if no operation between them is one the source CRS's context + * will vouch for + */ + public static CrsOperation createCrsToCrs(Crs source, Crs target) { + return createCrsToCrs(source, target, source == null ? defaultContext : source.context()); + } + + /** + * Creates an operation between two CRSs already built, under an explicit context. + * + * @param source the source CRS + * @param target the target CRS + * @param context the policies to build under; null means {@link #defaultContext()} + * @return the operation; never null + * @throws CrsCreationException if no operation between them is one this context will vouch for + */ + public static CrsOperation createCrsToCrs(Crs source, Crs target, ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + if (source == null || target == null) { + throw new CrsCreationException(ErrorCause.API_MISUSE, + "createCrsToCrs needs two non-null CRSs"); + } + somethingBuilt.set(true); + return CrsOperation.create(source.withContext(ctx), target.withContext(ctx), ctx); + } + + // --------------------------------------------------------------- inspecting the candidates + + /** + * Every coordinate operation the authority publishes between two CRSs, ranked best first, with the + * rejected ones included and the reason each was rejected. + * + *

This is the method that makes the historic defect impossible to repeat. {@code EPSG:4267} to + * {@code EPSG:4269} has nine published grid transformations with accuracies from + * 0.15 m to 2.0 m, and not one of them is ballpark. Proj4J's old answer — + * the input unchanged, 95.573 m out at San Francisco, finite, plausible, unwarned — was + * never "the authority offers nothing". It was that the offer could not be seen. Here it is. + * + *

Returns an empty list when {@link ProjContext#database()} is null, because the legacy datum + * model synthesises exactly one operation per CRS pair and there is nothing to enumerate. It is + * empty rather than a one-element list containing a fabricated candidate. + * + *

The ranking, in full

+ * + *

The database returns rows in {@code (kind, authority, code)} order and never by + * accuracy: it has no policy. This is the policy, and it is a total order, so the result + * cannot depend on which index a row was found through or on classpath ordering. Applied in + * sequence, first difference wins: + * + *

    + *
  1. Not deprecated before deprecated. The authority has said not to use it.
  2. + *
  3. Not superseded before superseded — but only by a replacement that connects the + * same CRS pair and is itself a candidate here. A replacement for a different pair is + * not a substitute, and treating it as one silently discards a usable operation.
  4. + *
  5. Executable method before one this library cannot run. An operation whose method maps + * to an operator Proj4J does not implement is not a candidate in any useful sense, whereas a + * missing grid is a deployment fact a caller can fix by adding a file. This tier is also what + * makes the {@code EPSG:4267} answer stable: {@code EPSG:8555} is tied with {@code EPSG:1241} + * at 0.15 m and is what PROJ 9.8.1 itself selects, but it is NADCON 5, whose grid feeds + * the unified {@code +proj=gridshift} operator that Proj4J does not implement.
  6. + *
  7. Non-ballpark before ballpark.
  8. + *
  9. All grids reachable before any grid missing.
  10. + *
  11. Smaller accuracy first. An absent accuracy sorts after every present one and + * is never treated as zero: an invented accuracy is precisely what would let a ballpark + * candidate win.
  12. + *
  13. Smaller area of use first, so a continental grid does not outrank a national one. + * Antimeridian wrap is handled rather than normalised, and an extent with no bounding box + * sorts last rather than being read as the whole world.
  14. + *
  15. Authority reference {@code (kind, authority, code)}, then forward before inverted. + * Nothing is left tied.
  16. + *
+ * + *

Both directions are enumerated, from two calls to + * {@link org.locationtech.proj4j.spi.ProjDatabase#operationsBetween} with the arguments swapped. + * The authority publishes an operation one way round only, and + * {@link CrsOperationCandidate#isInverted()} keeps that fact explicit — losing it is how a + * shift gets applied with the wrong sign. + * + * @param source the source CRS + * @param target the target CRS + * @return an unmodifiable list in ranking order; never null, and empty without a database + * @see CrsOperationCandidate + * @see CrsOperation#selectedOperation() + */ + public static List candidateOperations(Crs source, Crs target) { + ProjContext ctx = source == null ? defaultContext : source.context(); + return candidateOperations(source, target, ctx); + } + + /** + * Every coordinate operation the authority publishes between two CRSs, under an explicit context. + * + * @param source the source CRS + * @param target the target CRS + * @param context the context whose database and policies apply; null means + * {@link #defaultContext()} + * @return an unmodifiable list in ranking order; never null + * @see #candidateOperations(Crs, Crs) + */ + public static List candidateOperations(Crs source, Crs target, + ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + if (source == null || target == null) { + throw new CrsCreationException(ErrorCause.API_MISUSE, + "candidateOperations needs two non-null CRSs"); + } + if (!ctx.hasDatabase()) { + return Collections.emptyList(); + } + somethingBuilt.set(true); + return OperationSelector.select(ctx.database(), source.withContext(ctx), + target.withContext(ctx), ctx).candidates(); + } + + /** + * Every coordinate operation the authority publishes between two CRS definitions. + * + * @param source the source CRS definition, in any notation {@link #createCrs(String)} accepts + * @param target the target CRS definition + * @param context the context whose database and policies apply; null means + * {@link #defaultContext()} + * @return an unmodifiable list in ranking order; never null + * @see #candidateOperations(Crs, Crs) + */ + public static List candidateOperations(String source, String target, + ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + return candidateOperations(createCrs(source, ctx), createCrs(target, ctx), ctx); + } + + // -------------------------------------------------------------------------- introspection + + /** + * This library's version and the PROJ release it targets, as one line for a log. + * + *

The library version is read from this class's own jar manifest, which is the only + * place it exists at runtime, and never from a hard-coded constant that would drift from the + * build. Running from an exploded class directory — an IDE, a surefire run — there + * is no manifest and this reports {@code "unknown"}, which is the true answer. + * + *

The trailing note states whether the default context has an authority database, because that + * is the single fact that most changes what this library will and will not answer. + * + * @return for example + * {@code "proj4j 2.0.0 (PROJ 9.8.1 algorithms, EPSG v12.029)"}; never null + */ + public static String version() { + String v = manifestVersion(); + Optional db = databaseVersion(); + return "proj4j " + (v == null ? "unknown (no jar manifest on this classpath)" : v) + + " (PROJ " + PROJ_SEMANTICS_VERSION + " algorithms, " + + (db.isPresent() ? db.get() : "no authority database configured") + ")"; + } + + /** + * The version stamped into the jar this class was loaded from, or null. + * + *

Two sources, in order: {@code Implementation-Version} via {@link Package}, then the OSGi + * {@code Bundle-Version}, which is what this artifact's bundle plugin actually writes. + * + *

The manifest is read from the jar this class came from, located through + * {@code getResource} on its own class file, not from the first {@code META-INF/MANIFEST.MF} on + * the classpath — which would report some other library's version. The URL is only ever + * opened when its protocol is {@code jar}, so this performs no network I/O; core contains no + * network code at all and this is not an exception to that. + */ + private static String manifestVersion() { + Package pkg = Proj.class.getPackage(); + if (pkg != null && pkg.getImplementationVersion() != null) { + return pkg.getImplementationVersion(); + } + try { + java.net.URL self = Proj.class.getResource("Proj.class"); + if (self == null || !"jar".equals(self.getProtocol())) { + return null; + } + String s = self.toString(); + int bang = s.indexOf("!/"); + if (bang < 0) { + return null; + } + java.io.InputStream in = + new java.net.URL(s.substring(0, bang + 2) + "META-INF/MANIFEST.MF").openStream(); + try { + return new java.util.jar.Manifest(in).getMainAttributes() + .getValue("Bundle-Version"); + } finally { + in.close(); + } + } catch (java.io.IOException unreadable) { + return null; + } catch (RuntimeException unreadable) { + return null; + } + } + + /** + * The PROJ release whose algorithms, parameter semantics and error codes this library targets. + * + *

Not a claim that PROJ is installed — nothing here shells out or links to it. It is + * the version this source tree was written and conformance-tested against. + * + * @return {@code "9.8.1"} + */ + public static String projSemanticsVersion() { + return PROJ_SEMANTICS_VERSION; + } + + /** + * The CRS database version, read from the database's own {@code metadata} table. + * + *

Present when {@link #defaultContext()} carries an authority database: + * {@code "PROJ 9.8.1, EPSG v12.029"}. A fact about the shipped bytes, not a constant that could + * drift from them. + * + *

Empty when no database is configured, and that refusal is deliberate. What stands in + * for one, in the separate {@code proj4j-epsg} artifact, is a PROJ.4 {@code +init=} dictionary + * generated from EPSG v9.2-era data, while PROJ 9.8.1 ships EPSG v12.029. The + * dictionary files carry no version stamp anywhere, so: + * + *

    + *
  • reporting {@code "EPSG v9.2"} would be an unverifiable claim about bytes with no version + * in them;
  • + *
  • reporting {@code "EPSG v12.029"} because that is what PROJ 9.8.1 has would be a lie;
  • + *
  • reporting nothing, and explaining the gap in prose, is the only honest option.
  • + *
+ * + *

{@link #databaseInfo()} carries that prose, along with the classpath probe that is + * a checkable fact. + * + * @return the version, or {@link Optional#empty()} when no database is configured + * @see DatabaseInfo + * @see ProjContext.Builder#database(org.locationtech.proj4j.spi.ProjDatabase) + */ + public static Optional databaseVersion() { + return databaseInfo().version(); + } + + /** + * What CRS metadata this deployment actually has: the authority database + * {@link #defaultContext()} carries if any, its {@code metadata} table verbatim, whether the + * legacy dictionary is on the classpath, and the vintage gap between them. + * + * @return the info; never null + */ + public static DatabaseInfo databaseInfo() { + return databaseInfo(defaultContext); + } + + /** + * What CRS metadata a given context has. + * + * @param context the context; null means {@link #defaultContext()} + * @return the info; never null + */ + public static DatabaseInfo databaseInfo(ProjContext context) { + ProjContext ctx = context == null ? defaultContext : context; + return DatabaseInfo.probe(ctx.database()); + } + + /** + * Every grid file that is reachable right now: the union of what the enumerable + * resolvers list and what a direct probe finds for each grid any shipped definition declares. + * + *

Reachable is not the same as declared, and this method reports the difference. + *

Two things make a naive answer here dangerous. First, classpath resources are not + * enumerable in general: a resolver without a build-time {@code INDEX} manifest cannot list + * anything, so a short list may mean "cannot enumerate" rather than "nothing installed". That + * is why {@link #describeResolution()} states enumerability per resolver, and why + * {@link #grid(String)} can answer for a grid this method cannot list. Second, a grid that is + * declared and unreachable is the dangerous case — it is what turns + * {@code EPSG:4267} into a 95 m error with no warning — so it is reported by + * {@link #declaredGrids()}, with {@link GridInfo#isAvailable()} {@code false} and a reason, and + * never simply omitted. + * + * @return an unmodifiable, name-sorted list of reachable grids; never null + * @see #declaredGrids() + * @see #describeResolution() + */ + public static List availableGrids() { + TreeMap byName = new TreeMap(); + for (ResourceResolver r : ResourceResolvers.resolver().delegates()) { + if (!r.isEnumerable()) { + continue; + } + for (String name : r.listAvailable()) { + if (!byName.containsKey(name)) { + GridInfo info = GridInfo.probe(name, false, null); + if (info.isAvailable()) { + byName.put(name, info); + } + } + } + } + for (GridInfo declared : declaredGrids()) { + if (declared.isAvailable() && !byName.containsKey(declared.name())) { + byName.put(declared.name(), declared); + } + } + return Collections.unmodifiableList(new ArrayList(byName.values())); + } + + /** + * Every grid file that some definition on this classpath asks for, whether or not it can be + * found — each one probed, so {@link GridInfo#isAvailable()} is measured rather than + * assumed. + * + *

These are the grids PROJ's built-in datum table declares + * ({@code 9.8.1:src/datums.cpp}); every token in it is {@code @}-optional, which is exactly why + * an unreachable one has historically gone unremarked. + * + * @return an unmodifiable, name-sorted list; never null + */ + public static List declaredGrids() { + TreeMap byName = new TreeMap(); + for (Map.Entry e : Crs.datumGridDeclarations().entrySet()) { + for (String token : e.getValue().split(",")) { + boolean optional = token.startsWith("@"); + String name = optional ? token.substring(1) : token; + if (!byName.containsKey(name)) { + byName.put(name, GridInfo.probe(name, optional, "+datum=" + e.getKey())); + } + } + } + return Collections.unmodifiableList(new ArrayList(byName.values())); + } + + /** + * Probes the resolver chain for one grid by name. + * + *

Works for a non-enumerable resolver, so this answers for grids {@link #availableGrids()} + * cannot list. The file is not read, so {@link GridInfo#format()} is empty: a format + * inferred from a file name would be a guess. + * + * @param name the grid file name, with or without a leading {@code @} + * @return the grid info, or empty if {@code name} is null or blank + */ + public static Optional grid(String name) { + if (name == null || name.trim().isEmpty()) { + return Optional.empty(); + } + String n = name.trim(); + boolean optional = n.startsWith("@"); + return Optional.of(GridInfo.probe(optional ? n.substring(1) : n, optional, null)); + } + + /** + * Whether any network-backed resolver is both present and enabled. + * + *

Always false in a stock deployment, and false as a matter of what is on the + * classpath rather than of a flag: proj4j core ships no network code at all. Enabling it takes + * two independent steps — adding the optional artifact and enabling it in code + * — which is auditable by {@code mvn dependency:tree} and by {@code jar tf}, unlike a + * default-off flag that three separate channels can turn on. PROJ has exactly that problem: one + * of its three channels is a {@code proj.ini} found anywhere on a twelve-step search path. + * + * @return true only if a resolver reporting {@code isNetworkBacked()} was registered and + * allowed + */ + public static boolean isNetworkEnabled() { + return ResourceResolvers.isNetworkEnabled(); + } + + /** + * Exactly how data is being located: every resolver in chain order, whether each can be + * enumerated, and the three ambient inputs that are not consulted. + * + *

Log this once per JVM. Between this and {@link ProjContext#describe()} it states + * everything that could make two executors disagree about a coordinate. + * + * @return the description, newline-terminated; never null + */ + public static String describeResolution() { + return ResourceResolvers.describeResolution(); + } + + /** + * Every {@code +proj=} name this library will accept. + * + * @return an unmodifiable sorted set; never null + */ + public static SortedSet supportedProjections() { + TreeSet names = new TreeSet(); + for (ProjectionInfo p : projections()) { + if (p.isImplemented()) { + names.add(p.name()); + } + } + return Collections.unmodifiableSortedSet(names); + } + + /** + * Every {@code +proj=} name the registry knows, with its human-readable description and whether + * it can actually be instantiated. + * + *

Includes the handful that are registered but not implemented, because "Proj4J has not + * implemented this" and "you typed it wrong" are different facts that lead to different + * actions. + * + * @return an unmodifiable, name-sorted list; never null + */ + public static List projections() { + Map descriptions = REGISTRY.getProjectionDescriptions(); + List out = new ArrayList(descriptions.size()); + for (Map.Entry e : descriptions.entrySet()) { + boolean implemented; + try { + implemented = REGISTRY.getProjection(e.getKey()) != null; + } catch (UnsupportedParameterException notImplemented) { + implemented = false; + } + out.add(new ProjectionInfo(e.getKey(), e.getValue(), implemented)); + } + return Collections.unmodifiableList(out); + } + + /** + * The human-readable description registered for a {@code +proj=} name — + * {@code "Lambert Conformal Conic"} for {@code "lcc"}. + * + * @param projName the {@code +proj=} value + * @return the description, or empty if the name is not registered + */ + public static Optional projectionDescription(String projName) { + return Optional.ofNullable(REGISTRY.getProjectionDescription(projName)); + } + + /** + * Everything this deployment can and cannot do, in one multi-line block: version, the metadata + * situation including the vintage gap, the resolution chain, the grid inventory split into + * reachable and declared-but-unreachable, and the default context. + * + *

The single call to log at start-up. If a coordinate later turns out to be wrong, this is + * the text that says why it could have been. + * + * @return the description, newline-terminated; never null + */ + public static String describe() { + StringBuilder sb = new StringBuilder(); + sb.append(version()).append('\n'); + sb.append("PROJ semantics target: ").append(PROJ_SEMANTICS_VERSION).append('\n'); + sb.append('\n').append(databaseInfo().describe()); + sb.append('\n').append(describeResolution()); + + List available = availableGrids(); + sb.append('\n').append("grid inventory:\n"); + sb.append(" reachable now = ").append(available.size()).append('\n'); + for (int i = 0; i < available.size(); i++) { + sb.append(" ").append(available.get(i).describe()).append('\n'); + } + List declared = declaredGrids(); + int unreachable = 0; + for (int i = 0; i < declared.size(); i++) { + if (!declared.get(i).isAvailable()) { + unreachable++; + } + } + sb.append(" declared by the built-in datum table = ").append(declared.size()) + .append(", of which UNREACHABLE = ").append(unreachable).append('\n'); + for (int i = 0; i < declared.size(); i++) { + if (!declared.get(i).isAvailable()) { + sb.append(" ").append(declared.get(i).describe()).append('\n'); + } + } + if (unreachable > 0) { + sb.append(" NOTE: every token in the built-in datum table is @-optional, so PROJ and " + + "proj4j 1.4.3 skip an unreachable grid silently and apply no shift. The " + + "coordinate is then wrong by the size of the shift and entirely plausible " + + "(95.573 m at San Francisco, measured). The new facade reports it; see " + + "GridPolicy and BallparkPolicy.\n"); + sb.append(" NOTE: of the seven US grids, only conus and alaska exist upstream in the " + + "CTABLE V2 form this library reads (9.8.1:data/tests/). hawaii, prvi, " + + "stgeorge, stlrnc and stpaul are GeoTIFF-only in PROJ-data and arrive with " + + "the GeoTIFF reader, not before it.\n"); + } + sb.append('\n').append("projections: ").append(supportedProjections().size()) + .append(" usable of ").append(projections().size()).append(" registered\n"); + sb.append('\n').append(defaultContext.describe()); + return sb.toString(); + } + + // --------------------------------------------------------------------------------- internals + + private static boolean isWkt(String text) { + try { + WktDialect.guess(text); + return true; + } catch (WktParseException notWkt) { + return false; + } + } + + /** + * Resolves an {@code authority:code} name. + * + *

The legacy PROJ.4 dictionary is tried first and stays authoritative, so a code it knows + * resolves to byte-identical parameters whether or not a database is configured — adding + * {@code proj4j-db} must not move a coordinate that already worked. The database is consulted only + * for a code the dictionary cannot produce, which is the useful half of the vintage gap: the + * dictionary is EPSG v9.2-era and the shipped database is v12.029. + */ + private static Crs fromName(String definition, String text, ProjContext ctx) { + try { + CoordinateReferenceSystem crs = new CRSFactory().createFromName(text); + return applyAxisPolicy(definition, Crs.Source.AUTHORITY_CODE, ctx, crs, null, false); + } catch (IllegalStateException noDictionary) { + Crs fromDb = DatabaseCrsFactory.create(definition, text, ctx); + if (fromDb != null) { + return fromDb; + } + throw new CrsCreationException(ErrorCause.DATABASE_UNAVAILABLE, + "cannot resolve \"" + text + "\": the legacy PROJ.4 dictionary is not on the " + + "classpath" + databaseNote(ctx) + ". Add the proj4j-epsg artifact, or " + + "supply the CRS as a PROJ.4 parameter string, WKT or PROJJSON. " + + databaseInfo().vintageNote(), noDictionary); + } catch (UnknownAuthorityCodeException notInDictionary) { + // Deliberately only this exception. An UnsupportedParameterException means the code WAS + // found and names a projection Proj4J has not implemented, which is a different fact and + // keeps its own ErrorCause. And when there is no database the original exception is + // rethrown unchanged, so an unknown code stays UNKNOWN_CRS exactly as before. + Crs fromDb = DatabaseCrsFactory.create(definition, text, ctx); + if (fromDb != null) { + return fromDb; + } + throw notInDictionary; + } + } + + private static String databaseNote(ProjContext ctx) { + return ctx.hasDatabase() + ? ", and the configured authority database (" + ctx.database().name() + ") either " + + "does not have this code or has it as a CRS type that only the legacy " + + "dictionary can build" + : ", and no authority database is configured (ProjContext.Builder.database(..))"; + } + + /** + * Parses a PROJ.4 parameter string under this context's {@link ProjContext#parseMode()}. + * + *

This is the one place in the facade where the caller's own PROJ.4 text is parsed, and + * therefore the one place {@link ParseMode#STRICT} can act. It goes to {@link Proj4Parser} + * directly rather than through {@link CRSFactory} because {@code CRSFactory} is frozen at + * {@link ParseMode#PROJ_COMPATIBLE} — re-routing it would make working GeoTools and + * GeoServer code start throwing. Under the default mode this is the same two statements + * {@code CRSFactory.createFromParameters} runs, against an equivalent stateless + * {@link Registry}, so nothing moves. + * + *

{@code applyAxisPolicy} may re-parse the resulting parameter list (to append + * {@code +axis=neu} or to drop a declared {@code +axis=}) and deliberately does so through + * {@code CRSFactory} in the default mode: those tokens have already passed this check, and + * the two the policy adds or removes are in the allow-list, so a second STRICT pass could + * only ever agree. + */ + private static Crs fromProjString(String definition, String text, ProjContext ctx) { + CoordinateReferenceSystem crs = + new Proj4Parser(REGISTRY, ctx.parseMode()).parse((String) null, text); + if (crs == null) { + throw new CrsCreationException(ErrorCause.INVALID_CRS_SYNTAX, + "cannot parse as a PROJ.4 parameter string: " + text); + } + return applyAxisPolicy(definition, Crs.Source.PROJ_STRING, ctx, crs, null, false); + } + + private static Crs fromWkt(String definition, String text, ProjContext ctx) { + CrsDefinition def; + try { + def = new WktReader(ctx.axisOrderPolicy()).readDefinition(text); + } catch (WktParseException e) { + throw new CrsCreationException(ErrorCause.INVALID_CRS_SYNTAX, + "cannot read as WKT: " + e.getMessage(), e); + } + CoordinateReferenceSystem crs = CrsDefinitions.toCrs(def, ctx.axisOrderPolicy()); + // PROJ's own axis test is textual -- it asks whether "AXIS[" appears at all -- and it has to + // be, because the reader synthesises the standard axes when a document omits them. Using the + // parsed axes here would report every WKT CRS as authoritative, including the ones where + // this library supplied the answer. + boolean declared = containsIgnoreCase(text, "AXIS["); + return new Crs(definition, Crs.Source.WKT, ctx, crs, def, declared, + axisNote(ctx.axisOrderPolicy(), declared, true, crs)); + } + + private static Crs fromProjJson(String definition, String text, ProjContext ctx) { + CrsDefinition def; + try { + def = new ProjJsonReader(ctx.axisOrderPolicy()).readDefinition(text); + } catch (RuntimeException e) { + throw new CrsCreationException(ErrorCause.INVALID_CRS_SYNTAX, + "cannot read as PROJJSON: " + e.getMessage(), e); + } + CoordinateReferenceSystem crs = CrsDefinitions.toCrs(def, ctx.axisOrderPolicy()); + boolean declared = containsIgnoreCase(text, "\"axis\""); + return new Crs(definition, Crs.Source.PROJJSON, ctx, crs, def, declared, + axisNote(ctx.axisOrderPolicy(), declared, true, crs)); + } + + /** + * Applies {@link AxisOrderPolicy} to a CRS built from a name or a PROJ string, where there are + * no declared axes to honour and therefore a judgement to be made and disclosed. + */ + private static Crs applyAxisPolicy(String definition, Crs.Source source, ProjContext ctx, + CoordinateReferenceSystem crs, CrsDefinition def, + boolean declared) { + String[] params = crs.getParameters(); + boolean explicitAxis = params != null && hasKey(params, "axis"); + AxisOrderPolicy policy = ctx.axisOrderPolicy(); + boolean geographic = crs.getProjection() != null + && Boolean.TRUE.equals(crs.getProjection().isGeographic()); + + if (policy == AxisOrderPolicy.AUTHORITY && !explicitAxis && geographic && params != null) { + // Every geographic 2D CRS in EPSG uses ellipsoidal CS EPSG:6422, latitude then + // longitude. That is a rule, not a lookup: without proj.db it cannot be *read*, so it + // is applied and then reported as inferred by Crs.isAxisOrderAuthoritative(). + CoordinateReferenceSystem flipped = new CRSFactory() + .createFromParameters(crs.getName(), append(params, "+axis=neu")); + return new Crs(definition, source, ctx, flipped, def, false, + axisNote(policy, declared, false, flipped)); + } + if (policy == AxisOrderPolicy.VISUALISATION && explicitAxis && params != null) { + // Unconditional normalisation, PROJ's proj_normalize_for_visualization: strip the + // declared order rather than compose with it. + CoordinateReferenceSystem normalised = new CRSFactory() + .createFromParameters(crs.getName(), without(params, "axis")); + return new Crs(definition, source, ctx, normalised, def, true, + axisNote(policy, declared, false, normalised)); + } + return new Crs(definition, source, ctx, crs, def, explicitAxis, + axisNote(policy, declared || explicitAxis, false, crs)); + } + + /** + * One sentence saying which rule produced the axis order, so that an inferred answer is never + * mistaken for an authority's. + */ + private static String axisNote(AxisOrderPolicy policy, boolean declared, boolean fromDocument, + CoordinateReferenceSystem crs) { + boolean geographic = crs.getProjection() != null + && Boolean.TRUE.equals(crs.getProjection().isGeographic()); + if (policy == AxisOrderPolicy.VISUALISATION) { + return "AxisOrderPolicy.VISUALISATION: normalised unconditionally to east-north-up " + + "(longitude first), overriding anything the definition declared."; + } + if (policy == AxisOrderPolicy.LEGACY) { + if (declared && fromDocument) { + return "AxisOrderPolicy.LEGACY: the document's AXIS clauses were parsed and " + + "retained but deliberately not applied, so this CRS is longitude-first, " + + "exactly as in proj4j 1.4.3."; + } + if (declared) { + return "AxisOrderPolicy.LEGACY, with an explicit +axis= in the definition, which is " + + "honoured as 1.4.3 honoured it."; + } + return "AxisOrderPolicy.LEGACY: authority axis order is ignored, so this CRS is " + + "east-north-up -- longitude first -- exactly as in proj4j 1.4.3 and as " + + "GeoJSON expects."; + } + // AUTHORITY + if (declared) { + return fromDocument + ? "AxisOrderPolicy.AUTHORITY: taken from the AXIS clauses the document declared." + : "AxisOrderPolicy.AUTHORITY, with an explicit +axis= in the definition, which " + + "wins over any inference."; + } + if (geographic) { + return "AxisOrderPolicy.AUTHORITY with no CRS database: INFERRED latitude-first from " + + "the rule that EPSG gives every geographic 2D CRS the latitude-then-longitude " + + "ellipsoidal coordinate system EPSG:6422. This is a rule applied, not a " + + "value read from an authority -- isAxisOrderAuthoritative() is false. Supply " + + "WKT with AXIS clauses if you need it declared."; + } + return "AxisOrderPolicy.AUTHORITY with no CRS database: a projected CRS's authority axis " + + "order cannot be determined without proj.db, so east-north-up was ASSUMED. That " + + "is right for the great majority of EPSG projected CRSs and wrong for the " + + "north-east ones; it is not an authority statement. Supply WKT with AXIS clauses " + + "if you need it honoured."; + } + + private static boolean hasKey(String[] params, String key) { + for (int i = 0; i < params.length; i++) { + String p = params[i]; + if (p == null) { + continue; + } + int start = p.startsWith("+") ? 1 : 0; + if (p.regionMatches(start, key, 0, key.length()) + && p.length() > start + key.length() + && p.charAt(start + key.length()) == '=') { + return true; + } + } + return false; + } + + private static String[] append(String[] params, String extra) { + String[] out = new String[params.length + 1]; + System.arraycopy(params, 0, out, 0, params.length); + out[params.length] = extra; + return out; + } + + private static String[] without(String[] params, String key) { + List kept = new ArrayList(params.length); + for (int i = 0; i < params.length; i++) { + String p = params[i]; + if (p == null) { + continue; + } + int start = p.startsWith("+") ? 1 : 0; + boolean isKey = p.regionMatches(start, key, 0, key.length()) + && p.length() > start + key.length() + && p.charAt(start + key.length()) == '='; + if (!isKey) { + kept.add(p); + } + } + return kept.toArray(new String[kept.size()]); + } + + private static boolean containsIgnoreCase(String s, String needle) { + int last = s.length() - needle.length(); + for (int i = 0; i <= last; i++) { + if (s.regionMatches(true, i, needle, 0, needle.length())) { + return true; + } + } + return false; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/ProjContext.java b/core/src/main/java/org/locationtech/proj4j/api/ProjContext.java new file mode 100644 index 0000000..38c71ed --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/ProjContext.java @@ -0,0 +1,583 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import org.locationtech.proj4j.DomainErrorPolicy; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; +import org.locationtech.proj4j.parser.Proj4Parser.ParseMode; +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * Every policy that can change a numeric answer, in one immutable object. + * + *

This is the only place these policies are set. There is no system property, no + * environment variable, no static setter beyond {@link Proj#setDefaultContext(ProjContext)} (which + * refuses once anything has been built), and no {@code ServiceLoader}-discovered configuration. + * That is the point: in a Spark or Flink executor the environment is chosen by the cluster + * operator, not by the pipeline author, and a coordinate reference system whose axis order depends + * on who launched the JVM is not reproducible. Ambient state must never change a number. + * + *

{@code
+ * ProjContext ctx = ProjContext.builder()
+ *         .axisOrderPolicy(AxisOrderPolicy.AUTHORITY)   // deliberately lat-first, re-baselined
+ *         .ballparkPolicy(BallparkPolicy.ALLOW)         // we accept an unshifted datum here
+ *         .build();
+ *
+ * CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857", ctx);
+ * }
+ * + *

Precedence

+ * + *

Three levels, increasing, all introspectable: + *

    + *
  1. the built-in default, {@link #DEFAULT} — hard-coded, no flag, reproducing + * proj4j 1.4.3's observable behaviour;
  2. + *
  3. the process default, via {@link Proj#setDefaultContext(ProjContext)}, which throws + * {@code IllegalStateException} once any {@link Crs} or {@link CrsOperation} exists, so one + * library on the classpath cannot flip the semantics under another;
  4. + *
  5. the per-call context, passed to {@link Proj#createCrs(String, ProjContext)} or + * {@link Proj#createCrsToCrs(String, String, ProjContext)}, or derived with + * {@link Crs#withAxisOrderPolicy(AxisOrderPolicy)}. This is the preferred level.
  6. + *
+ * + *

Thread safety

+ * + *

{@code ProjContext} is deeply immutable and safe to share between any number of threads. + * {@link Builder} is mutable and thread-confined: build it on one thread, then share the result. + * + * @see AxisOrderPolicy + * @see BallparkPolicy + * @see GridPolicy + * @see BestOperationPolicy + * @see DomainErrorPolicy + * @see ParseMode + * @since 1.5.0 + */ +public final class ProjContext { + + /** + * The built-in default: {@link AxisOrderPolicy#LEGACY} (longitude-first, 1.4.3 behaviour), + * {@link BallparkPolicy#REJECT}, {@link GridPolicy#REQUIRE_ALL}, + * {@link BestOperationPolicy#REQUIRE_BEST}, {@link DomainErrorPolicy#THROW}, + * {@link ParseMode#PROJ_COMPATIBLE}. + * + *

Every one of those is the strict choice except the axis order and the parse mode, which + * are the compatible choices. The axis-order asymmetry is explained on + * {@link AxisOrderPolicy}: adopting authority axis order is a silent behavioural change that + * is invisible near the equator and the prime meridian, so it cannot be a default. The parse + * mode's is explained on {@link #parseMode()}: PROJ itself has no parameter allow-list at all, + * so {@link ParseMode#STRICT} rejects definitions PROJ accepts and cannot be a default either. + * Everything else fails loudly, which is safe to default to because a caller notices + * immediately. + */ + public static final ProjContext DEFAULT = new ProjContext(AxisOrderPolicy.LEGACY, + BallparkPolicy.REJECT, GridPolicy.REQUIRE_ALL, BestOperationPolicy.REQUIRE_BEST, + DomainErrorPolicy.THROW, ParseMode.PROJ_COMPATIBLE, null); + + private final AxisOrderPolicy axisOrderPolicy; + private final BallparkPolicy ballparkPolicy; + private final GridPolicy gridPolicy; + private final BestOperationPolicy bestOperationPolicy; + private final DomainErrorPolicy domainErrorPolicy; + private final ParseMode parseMode; + private final ProjDatabase database; + + private ProjContext(AxisOrderPolicy axisOrderPolicy, BallparkPolicy ballparkPolicy, + GridPolicy gridPolicy, BestOperationPolicy bestOperationPolicy, + DomainErrorPolicy domainErrorPolicy, ParseMode parseMode, + ProjDatabase database) { + this.axisOrderPolicy = axisOrderPolicy; + this.ballparkPolicy = ballparkPolicy; + this.gridPolicy = gridPolicy; + this.bestOperationPolicy = bestOperationPolicy; + this.domainErrorPolicy = domainErrorPolicy; + this.parseMode = parseMode; + this.database = database; + } + + /** + * A builder pre-loaded with {@link #DEFAULT}'s values. + * + * @return a fresh builder; never null + */ + public static Builder builder() { + return new Builder(DEFAULT); + } + + /** + * A builder pre-loaded with this context's values. + * + * @return a fresh builder; never null + */ + public Builder toBuilder() { + return new Builder(this); + } + + /** + * How the axis order a CRS declares affects the coordinates this context's operations consume + * and produce. + * + * @return the policy; never null + */ + public AxisOrderPolicy axisOrderPolicy() { + return axisOrderPolicy; + } + + /** + * What happens when the only available datum change is one that would not actually be applied. + * + * @return the policy; never null + */ + public BallparkPolicy ballparkPolicy() { + return ballparkPolicy; + } + + /** + * What happens to a declared grid file that cannot be found. + * + * @return the policy; never null + */ + public GridPolicy gridPolicy() { + return gridPolicy; + } + + /** + * Whether a degraded operation may be substituted for an unavailable better one. Recorded and + * reported; see {@link BestOperationPolicy} for what it does not yet do. + * + * @return the policy; never null + */ + public BestOperationPolicy bestOperationPolicy() { + return bestOperationPolicy; + } + + /** + * What a per-coordinate failure does — throw, or write {@code NaN} into every ordinate. + * The same enum the legacy {@link org.locationtech.proj4j.CoordinateTransformFactory} takes, so + * a caller does not learn two vocabularies for one decision. + * + * @return the policy; never null + */ + public DomainErrorPolicy domainErrorPolicy() { + return domainErrorPolicy; + } + + /** + * How strictly a PROJ.4 parameter string is checked. The same enum + * {@link org.locationtech.proj4j.parser.Proj4Parser} takes, so a caller does not learn two + * vocabularies for one decision. + * + *

What {@link ParseMode#STRICT} actually changes — two things, and no others

+ * + *
    + *
  1. A key outside {@link org.locationtech.proj4j.parser.Proj4Keyword#supportedParameters()} + * raises {@link org.locationtech.proj4j.UnsupportedParameterException}, naming the + * key, instead of being retained and ignored.
  2. + *
  3. A {@code +units} name this library cannot resolve raises + * {@link org.locationtech.proj4j.InvalidValueException} instead of silently falling back + * to metres — {@code Units.findUnits} returns {@code METRES} for anything it does + * not know and never returns null, so under the default {@code +units=bananas} is a + * working CRS in metres.
  4. + *
+ * + *

Duplicate keys are not affected. {@code Proj4Parser}'s parameter map keeps the + * first occurrence of a repeated key in both modes, which is PROJ's own rule + * ({@code pj_param_exists} walks the list front-to-back), so {@code +lon_0=1 +lon_0=2} means + * {@code 1} under {@code STRICT} exactly as it does under {@code PROJ_COMPATIBLE}. Neither + * mode reports the duplicate. + * + *

Where it applies, and where it deliberately does not

+ * + *

It applies to {@link Proj#createCrs(String, ProjContext)} when the definition is a + * PROJ.4 parameter string, and therefore to + * {@link Proj#createCrsToCrs(String, String, ProjContext)} and + * {@link Crs#withContext(ProjContext)} when they are given one. That is where the untrusted + * text is. + * + *

It does not apply to: + *

    + *
  • {@code authority:code} names. Those resolve to a definition this library ships, + * not one the caller wrote, so an allow-list buys nothing there — and it would cost + * something: of the 9,013 definitions in the shipped {@code proj4/nad} + * dictionaries, exactly one carries a key outside the allow-list, {@code world:malay} + * with {@code +rot_conv}. That token is in PROJ 9.8.1's own {@code data/world} (line 113, + * the {@code malay} entry) and is read nowhere in its {@code src/} — {@code NEWS.md} + * records it under 4.8.0 as having stopped working when {@code omerc} was + * reimplemented from libproj4, with the {@code epsg} init file updated accordingly and + * {@code data/world} left alone. So PROJ retains and ignores it exactly as this library + * does, and refusing {@code malay} under {@code STRICT} would break a CRS that behaves the + * same in both.
  • + *
  • WKT and PROJJSON. Those are different grammars with their own readers; the + * allow-list is a list of PROJ.4 keys.
  • + *
  • {@link org.locationtech.proj4j.CRSFactory} and + * {@link org.locationtech.proj4j.CoordinateTransformFactory}. The 1.x API is frozen at + * {@link ParseMode#PROJ_COMPATIBLE} and is not re-routed by any context.
  • + *
+ * + *

{@code STRICT} is stricter than PROJ, not a bug-for-bug match. PROJ has no + * parameter allow-list anywhere: {@code init.cpp} retains every token and recognition is + * pull-based. So a definition rejected here is usually one PROJ accepts and ignores, which is + * exactly why this is opt-in and why the conformance corpus — which feeds a literal + * {@code +unknown_keyword} — runs under the default. + * + * @return the parse mode; never null + * @see ParseMode + */ + public ParseMode parseMode() { + return parseMode; + } + + /** + * The authority database this context resolves CRSs and selects operations against, or + * {@code null} for none. + * + *

{@code null} in {@link #DEFAULT}, and that is deliberate. Core never scans for one: + * an implicit {@code ServiceLoader} walk touches a classpath Proj4J does not control, which is + * exactly how a library minding its own business triggers a {@code LinkageError} in somebody + * else's jar. Opening a database is one line of application code, and it is visible in the + * application's own source: + * + *

{@code
+     * ProjDatabase db = Proj4jDb.open();                       // from the proj4j-db artifact
+     * ProjContext ctx = ProjContext.builder().database(db).build();
+     * }
+ * + *

With a database this context selects real published operations, reports their accuracy and + * their area of use, and names the grid files a rejected candidate needs. Without one it falls + * back to the legacy datum model, where there is exactly one synthesised operation per CRS pair + * — and it says so rather than degrading quietly. + * + * @return the database, or null + * @see org.locationtech.proj4j.spi.ProjDatabaseProvider#discover(ClassLoader) + * @see Proj#candidateOperations(Crs, Crs) + */ + public ProjDatabase database() { + return database; + } + + /** + * Whether this context has an authority database. + * + * @return true iff {@link #database()} is non-null + */ + public boolean hasDatabase() { + return database != null; + } + + /** + * A copy of this context with a different authority database. + * + * @param db the database, or null for none + * @return a new context, or {@code this} if nothing changed + */ + public ProjContext withDatabase(ProjDatabase db) { + return db == database ? this : toBuilder().database(db).build(); + } + + /** + * A copy of this context with a different axis order policy. + * + * @param policy the new policy; null means {@link AxisOrderPolicy#LEGACY} + * @return a new context, or {@code this} if nothing changed + */ + public ProjContext withAxisOrderPolicy(AxisOrderPolicy policy) { + AxisOrderPolicy p = policy == null ? AxisOrderPolicy.LEGACY : policy; + return p == axisOrderPolicy ? this : toBuilder().axisOrderPolicy(p).build(); + } + + /** + * A copy of this context with a different ballpark policy. + * + * @param policy the new policy; null means {@link BallparkPolicy#REJECT} + * @return a new context, or {@code this} if nothing changed + */ + public ProjContext withBallparkPolicy(BallparkPolicy policy) { + BallparkPolicy p = policy == null ? BallparkPolicy.REJECT : policy; + return p == ballparkPolicy ? this : toBuilder().ballparkPolicy(p).build(); + } + + /** + * A copy of this context with a different grid policy. + * + * @param policy the new policy; null means {@link GridPolicy#REQUIRE_ALL} + * @return a new context, or {@code this} if nothing changed + */ + public ProjContext withGridPolicy(GridPolicy policy) { + GridPolicy p = policy == null ? GridPolicy.REQUIRE_ALL : policy; + return p == gridPolicy ? this : toBuilder().gridPolicy(p).build(); + } + + /** + * A copy of this context with a different per-coordinate failure policy. + * + * @param policy the new policy; null means {@link DomainErrorPolicy#THROW} + * @return a new context, or {@code this} if nothing changed + */ + public ProjContext withDomainErrorPolicy(DomainErrorPolicy policy) { + DomainErrorPolicy p = policy == null ? DomainErrorPolicy.THROW : policy; + return p == domainErrorPolicy ? this : toBuilder().domainErrorPolicy(p).build(); + } + + /** + * A copy of this context with a different PROJ.4 parse mode. + * + * @param mode the new mode; null means {@link ParseMode#PROJ_COMPATIBLE} + * @return a new context, or {@code this} if nothing changed + * @see #parseMode() + */ + public ProjContext withParseMode(ParseMode mode) { + ParseMode m = mode == null ? ParseMode.PROJ_COMPATIBLE : mode; + return m == parseMode ? this : toBuilder().parseMode(m).build(); + } + + /** + * A multi-line, human-readable rendering of every policy in this context, plus the fact that + * none of them can be reached from the environment. + * + *

Intended to be logged once at the start of a job, next to + * {@link Proj#describeResolution()}: between them they state everything that could make two + * executors disagree about a coordinate. + * + * @return the description, newline-terminated; never null + */ + public String describe() { + StringBuilder sb = new StringBuilder(); + sb.append("proj4j context:\n"); + sb.append(" axisOrderPolicy = ").append(axisOrderPolicy); + if (axisOrderPolicy == AxisOrderPolicy.LEGACY) { + sb.append(" (longitude-first; EPSG:4326 takes (lon, lat), as in 1.4.3)"); + } else if (axisOrderPolicy == AxisOrderPolicy.AUTHORITY) { + sb.append(" (authority order; EPSG:4326 takes (lat, lon), as in PROJ 6+/cs2cs)"); + } else { + sb.append(" (normalised for visualisation: E/N, lon/lat, up-positive)"); + } + sb.append('\n'); + sb.append(" ballparkPolicy = ").append(ballparkPolicy).append('\n'); + sb.append(" gridPolicy = ").append(gridPolicy).append('\n'); + sb.append(" bestOperationPolicy = ").append(bestOperationPolicy) + .append(database == null + ? " (recorded; nothing to rank without an authority database)\n" + : " (enforced: it refuses a selection strictly less accurate than a " + + "candidate that cannot be executed here)\n"); + sb.append(" domainErrorPolicy = ").append(domainErrorPolicy).append('\n'); + sb.append(" parseMode = ").append(parseMode) + .append(parseMode == ParseMode.STRICT + ? " (a PROJ.4 parameter string with a key outside the allow-list, or an " + + "unresolvable +units, is refused -- stricter than PROJ, which " + + "has no allow-list; applies to PROJ.4 strings only, not to " + + "authority codes, WKT, PROJJSON or the 1.x CRSFactory)\n" + : " (as PROJ: an unrecognised +key is retained and ignored, and an " + + "unknown +units falls back to metres)\n"); + sb.append(" database = ").append(database == null + ? "NONE -- operation selection falls back to the legacy datum model, which " + + "synthesises exactly one operation per CRS pair" + : database.name()).append('\n'); + sb.append(" settable from the environment: NO -- no system property, no environment " + + "variable, no service loader\n"); + return sb.toString(); + } + + @Override + public String toString() { + return "ProjContext[axisOrder=" + axisOrderPolicy + ", ballpark=" + ballparkPolicy + + ", grid=" + gridPolicy + ", bestOperation=" + bestOperationPolicy + + ", domainError=" + domainErrorPolicy + + ", parseMode=" + parseMode + + ", database=" + (database == null ? "none" : database.name()) + "]"; + } + + /** + * Equal iff every policy is equal and both contexts hold the same database instance. + * + *

Database identity rather than equality, because a {@link ProjDatabase} is a handle to bytes + * and two handles onto the same file are still two handles: one of them can be closed. Identity + * is the only comparison that cannot be wrong here. + * + * @param o the other object + * @return true if equal + */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ProjContext)) { + return false; + } + ProjContext that = (ProjContext) o; + return axisOrderPolicy == that.axisOrderPolicy + && ballparkPolicy == that.ballparkPolicy + && gridPolicy == that.gridPolicy + && bestOperationPolicy == that.bestOperationPolicy + && domainErrorPolicy == that.domainErrorPolicy + && parseMode == that.parseMode + && database == that.database; + } + + @Override + public int hashCode() { + int h = axisOrderPolicy.hashCode(); + h = 31 * h + ballparkPolicy.hashCode(); + h = 31 * h + gridPolicy.hashCode(); + h = 31 * h + bestOperationPolicy.hashCode(); + h = 31 * h + domainErrorPolicy.hashCode(); + h = 31 * h + parseMode.hashCode(); + return 31 * h + System.identityHashCode(database); + } + + /** + * Assembles a {@link ProjContext}. Mutable and thread-confined; the context it produces + * is immutable and shareable. + * + *

Every setter treats {@code null} as "leave at the built-in default" rather than throwing, + * because the common caller is reading configuration and a null there should not become a + * different failure than a missing key. + */ + public static final class Builder { + + private AxisOrderPolicy axisOrderPolicy; + private BallparkPolicy ballparkPolicy; + private GridPolicy gridPolicy; + private BestOperationPolicy bestOperationPolicy; + private DomainErrorPolicy domainErrorPolicy; + private ParseMode parseMode; + private ProjDatabase database; + + private Builder(ProjContext from) { + this.axisOrderPolicy = from.axisOrderPolicy; + this.ballparkPolicy = from.ballparkPolicy; + this.gridPolicy = from.gridPolicy; + this.bestOperationPolicy = from.bestOperationPolicy; + this.domainErrorPolicy = from.domainErrorPolicy; + this.parseMode = from.parseMode; + this.database = from.database; + } + + /** + * Sets the axis order policy. Read {@link AxisOrderPolicy} before setting + * {@link AxisOrderPolicy#AUTHORITY}: it is a silent behavioural change. + * + * @param policy the policy, or null to leave it at {@link AxisOrderPolicy#LEGACY} + * @return this builder + */ + public Builder axisOrderPolicy(AxisOrderPolicy policy) { + this.axisOrderPolicy = policy == null ? AxisOrderPolicy.LEGACY : policy; + return this; + } + + /** + * Sets the ballpark policy. + * + * @param policy the policy, or null to leave it at {@link BallparkPolicy#REJECT} + * @return this builder + */ + public Builder ballparkPolicy(BallparkPolicy policy) { + this.ballparkPolicy = policy == null ? BallparkPolicy.REJECT : policy; + return this; + } + + /** + * Sets the missing-grid policy. + * + * @param policy the policy, or null to leave it at {@link GridPolicy#REQUIRE_ALL} + * @return this builder + */ + public Builder gridPolicy(GridPolicy policy) { + this.gridPolicy = policy == null ? GridPolicy.REQUIRE_ALL : policy; + return this; + } + + /** + * Sets the best-operation policy. + * + * @param policy the policy, or null to leave it at + * {@link BestOperationPolicy#REQUIRE_BEST} + * @return this builder + */ + public Builder bestOperationPolicy(BestOperationPolicy policy) { + this.bestOperationPolicy = policy == null ? BestOperationPolicy.REQUIRE_BEST : policy; + return this; + } + + /** + * Sets what a per-coordinate failure does. + * + * @param policy the policy, or null to leave it at {@link DomainErrorPolicy#THROW} + * @return this builder + */ + public Builder domainErrorPolicy(DomainErrorPolicy policy) { + this.domainErrorPolicy = policy == null ? DomainErrorPolicy.THROW : policy; + return this; + } + + /** + * Sets how strictly a PROJ.4 parameter string is checked. + * + *

Read {@link ProjContext#parseMode()} before setting {@link ParseMode#STRICT}: it + * refuses definitions PROJ itself accepts, it covers PROJ.4 strings only, and it does not + * touch the frozen 1.x {@link org.locationtech.proj4j.CRSFactory}. + * + *

{@code
+         * ProjContext ctx = ProjContext.builder().parseMode(ParseMode.STRICT).build();
+         * Proj.createCrs("+proj=merc +ellps=GRS80 +units=m", ctx);          // fine
+         * Proj.createCrs("+proj=merc +ellps=GRS80 +unknown_keyword=1", ctx); // UnsupportedParameterException
+         * }
+ * + * @param mode the mode, or null to leave it at {@link ParseMode#PROJ_COMPATIBLE} + * @return this builder + */ + public Builder parseMode(ParseMode mode) { + this.parseMode = mode == null ? ParseMode.PROJ_COMPATIBLE : mode; + return this; + } + + /** + * Sets the authority database, which is what turns operation selection from "the one + * operation the legacy datum model synthesises" into "the nine the authority published, + * ranked". + * + *

The context does not take ownership. It never closes the database, because a + * database handed to a context outlives the caller's stack frame and several contexts may + * share one. Closing it is the application's business, at shutdown. + * + *

{@code
+         * ProjDatabase db = Proj4jDb.open();                  // proj4j-db artifact; null if absent
+         * ProjContext ctx = ProjContext.builder().database(db).build();
+         * CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx);
+         * op.selectedOperation();                             // EPSG:1241, NAD27 to NAD83 (1)
+         * op.accuracy().get().metres();                       // 0.15
+         * }
+ * + * @param db the database, or null for none + * @return this builder + */ + public Builder database(ProjDatabase db) { + this.database = db; + return this; + } + + /** + * Builds the immutable context. + * + * @return the context; never null + */ + public ProjContext build() { + ProjContext built = new ProjContext(axisOrderPolicy, ballparkPolicy, gridPolicy, + bestOperationPolicy, domainErrorPolicy, parseMode, database); + return built.equals(DEFAULT) ? DEFAULT : built; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/ProjectionInfo.java b/core/src/main/java/org/locationtech/proj4j/api/ProjectionInfo.java new file mode 100644 index 0000000..ad94459 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/ProjectionInfo.java @@ -0,0 +1,109 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.Optional; + +/** + * One {@code +proj=} name, its human-readable description, and whether Proj4J can actually + * instantiate it. + * + *

The descriptions come from {@link org.locationtech.proj4j.Registry}, which has carried about a + * hundred of them since 2009 — {@code "Albers Equal Area"}, {@code "Azimuthal Equidistant"} + * — with no way to read them. They existed for one message, about a projection registered but + * not implemented, and that message is now unreachable, so they were write-only. This class and + * {@link Proj#projections()} are what they were for. + * + *

{@link #isImplemented()} is the capability boundary Proj4J has and PROJ does not: a handful of + * names are registered so that {@code +proj=} reports "not implemented" rather than "unknown", + * which are different facts and lead a caller to different actions. + * + *

Immutable and safe to share between threads. + * + * @see Proj#projections() + * @see org.locationtech.proj4j.ErrorCause#PROJECTION_NOT_IMPLEMENTED + * @since 1.5.0 + */ +public final class ProjectionInfo implements Comparable { + + private final String name; + private final String description; + private final boolean implemented; + + ProjectionInfo(String name, String description, boolean implemented) { + this.name = name; + this.description = description; + this.implemented = implemented; + } + + /** + * The {@code +proj=} value, for example {@code "aea"}. + * + * @return the name; never null, never empty + */ + public String name() { + return name; + } + + /** + * The human-readable name, for example {@code "Albers Equal Area"}. + * + * @return the description, or empty if the registry has none for this name + */ + public Optional description() { + return Optional.ofNullable(description); + } + + /** + * Whether {@code +proj=}{@link #name()} can be used, as opposed to being registered so that it + * can be refused by name. + * + * @return true iff the projection class can be instantiated + */ + public boolean isImplemented() { + return implemented; + } + + @Override + public int compareTo(ProjectionInfo other) { + return name.compareTo(other.name); + } + + @Override + public String toString() { + return name + (description == null ? "" : " -- " + description) + + (implemented ? "" : " [REGISTERED BUT NOT IMPLEMENTED]"); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ProjectionInfo)) { + return false; + } + ProjectionInfo that = (ProjectionInfo) o; + return name.equals(that.name) && implemented == that.implemented + && (description == null ? that.description == null + : description.equals(that.description)); + } + + @Override + public int hashCode() { + return 31 * name.hashCode() + (implemented ? 1 : 0); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/api/package-info.java b/core/src/main/java/org/locationtech/proj4j/api/package-info.java new file mode 100644 index 0000000..d053d5d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/api/package-info.java @@ -0,0 +1,96 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * The public facade: {@link org.locationtech.proj4j.api.Proj} to create things, + * {@link org.locationtech.proj4j.api.Crs} and {@link org.locationtech.proj4j.api.CrsOperation} to + * use them, {@link org.locationtech.proj4j.api.ProjContext} to decide how. + * + *

What this package is for

+ * + *

Three properties, each of which the 1.x API cannot provide without breaking somebody: + * + *

    + *
  1. It fails closed. Every method that produces coordinates either returns all-finite + * ordinates or throws {@link org.locationtech.proj4j.CrsTransformException} with a non-null + * {@link org.locationtech.proj4j.Proj4jException#cause()}. No sentinels: not {@code NaN}, not the + * input unchanged, not the false easting. And the checks that can be made once are made once, at + * planning time, rather than on row 4,000,000.
  2. + *
  3. It is introspectable. {@link org.locationtech.proj4j.api.Proj#describe()}, + * {@link org.locationtech.proj4j.api.Crs#describe()} and + * {@link org.locationtech.proj4j.api.CrsOperation#describe()} state what this deployment can do, + * what it cannot, and — the part that matters — which grids it was asked for and could + * not find.
  4. + *
  5. It needs nothing. Zero runtime dependencies. WKT1 in both OGC and ESRI dialects, WKT2 + * in both revisions, and PROJJSON are read and written here, in plain JDK code, so a consumer can + * delete Apache SIS and the {@code catch (LinkageError)} they wrapped it in.
  6. + *
+ * + *

Why it is a separate package, and why it is in this artifact

+ * + *

A separate package, because {@code Crs} beside {@code CoordinateReferenceSystem} and + * {@code CrsOperation} beside {@code CoordinateTransform} in one package would make + * {@code import org.locationtech.proj4j.*} ambiguous for every existing caller. Nothing about the + * root package changes. + * + *

In this artifact, not a satellite one, because the entire reason a consumer wanted WKT2 + * support was to remove Apache SIS from a Spark classpath. Two incompatible copies of + * {@code org.opengis.util.CodeList} — {@code geoapi-3.0.2} has {@code names()}, + * {@code gt-opengis-29.6} does not — make SIS's WKT parser throw {@code NoSuchMethodError}, + * an {@code Error} rather than an {@code Exception}, which passes local tests and kills executors. + * Relocating the dependency would not have helped; removing the need for it does. Core therefore + * contains zero references to {@code org.opengis.*}, and that is enforced mechanically by + * a test which scans the compiled classes for the string, not by a comment. + * + *

The 1.x API is frozen, not deprecated and not re-routed

+ * + *

{@link org.locationtech.proj4j.CRSFactory}, + * {@link org.locationtech.proj4j.CoordinateTransformFactory}, + * {@link org.locationtech.proj4j.CoordinateTransform}, + * {@link org.locationtech.proj4j.CoordinateReferenceSystem} and + * {@link org.locationtech.proj4j.ProjCoordinate} behave exactly as they did, and nothing in this + * package changes them. {@link org.locationtech.proj4j.api.LegacyAdapters} is the opt-in bridge, one + * line at the call site, for a caller who wants the new behaviour behind the old interface. + * + *

Java 8 has no {@code @Deprecated(forRemoval=)}, so the promise has to be written down: the 1.x + * classes will not be removed. Nobody should plan a migration they do not need. + * + *

Thread safety, stated once

+ * + *

Immutable and shareable across any number of threads: {@link org.locationtech.proj4j.api.Proj} + * (static and stateless), {@link org.locationtech.proj4j.api.Crs}, + * {@link org.locationtech.proj4j.api.CrsOperation}, + * {@link org.locationtech.proj4j.api.ProjContext}, + * {@link org.locationtech.proj4j.api.AreaOfUse}, {@link org.locationtech.proj4j.api.Accuracy}, + * {@link org.locationtech.proj4j.api.GridInfo}, {@link org.locationtech.proj4j.api.DatabaseInfo}, + * {@link org.locationtech.proj4j.api.ProjectionInfo}, and every enum. + * + *

Thread-confined: {@link org.locationtech.proj4j.api.ProjContext.Builder}, and + * {@link org.locationtech.proj4j.ProjCoordinate} as it always was. + * + *

What this package will not claim

+ * + *

Proj4J ships no CRS database. Rather than approximate what a database would have told it, this + * package returns {@link java.util.Optional#empty()} and says why: + * {@link org.locationtech.proj4j.api.Proj#databaseVersion()}, + * {@link org.locationtech.proj4j.api.Crs#areaOfUse()} for a CRS that did not declare one, and + * {@link org.locationtech.proj4j.api.CrsOperation#accuracy()}. See + * {@link org.locationtech.proj4j.api.DatabaseInfo} for the full inventory of what a PROJ.4 + * {@code +init=} dictionary can and cannot answer. + * + * @since 1.5.0 + */ +package org.locationtech.proj4j.api; diff --git a/core/src/main/java/org/locationtech/proj4j/bulk/TransformStatus.java b/core/src/main/java/org/locationtech/proj4j/bulk/TransformStatus.java new file mode 100644 index 0000000..6add77e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/bulk/TransformStatus.java @@ -0,0 +1,254 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.bulk; + +import org.locationtech.proj4j.ErrorCause; + +/** + * The per-point outcome codes written into the {@code byte[] status} array of + * {@link org.locationtech.proj4j.BulkCoordinateTransform}. + * + *

Why a byte per point and not an exception per point

+ * + *

Constructing an exception fills in a stack trace, which costs roughly 1-10 µs. A + * 100,000-vertex geometry with 10% out-of-domain vertices would spend hundreds of + * milliseconds purely in {@code fillInStackTrace} — more than the entire transform, and + * invisible in a profile that only shows the caller's own frames. The status array is how the + * error taxonomy is delivered at no per-point cost: one byte store per point, no allocation, and + * the array is owned and reused by the caller. + * + *

Why a byte array and not a bitset

+ * + *

A bitset was considered and rejected, and the decision is recorded here so it is not + * relitigated: it saves 7/8 of a byte against 16 bytes per point of coordinate data — under + * 6% — and it throws away the reason code, which is the thing that was actually asked + * for. "This vertex failed" without "why" turns a diagnosable data problem into a support ticket. + * + *

These are {@code byte} constants, not an enum

+ * + *

Deliberate. An {@code enum[]} would be a reference array, so a batch of 100,000 points would + * either need 100,000 pre-interned references loaded per point (a pointer chase and a cache miss + * against 8 bytes of payload) or box the ordinal. The whole point of the bulk API is that the + * per-point path touches nothing but primitives. {@link #cause(byte)} converts to the + * {@link ErrorCause} taxonomy on the failure path, where a reference is affordable. + * + *

Relationship to {@link ErrorCause}

+ * + *

{@link ErrorCause} is the full 24-value taxonomy and is what the single-point path throws. + * These eight codes are the subset a per-coordinate failure can take, so the mapping is + * many-to-one in one direction and total in the other: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
status code to {@link ErrorCause}
status{@link ErrorCause}note
{@link #OK}the point transformed
{@link #ERR_INVALID_INPUT}{@link ErrorCause#INVALID_COORDINATE}also {@link ErrorCause#MISSING_TIME}, which has no code of its own
{@link #ERR_COORD_OUT_OF_DOMAIN}{@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}
{@link #ERR_NUMERICAL_FAILURE}{@link ErrorCause#NUMERICAL_FAILURE}non-convergence, or finite input yielding a non-finite result
{@link #ERR_OUTSIDE_GRID_EXTENT}{@link ErrorCause#COORDINATE_OUTSIDE_GRID}also {@link ErrorCause#GRID_NODATA}, which has no code of its own
{@link #ERR_OUTSIDE_AREA_OF_USE}{@link ErrorCause#COORDINATE_OUTSIDE_AREA_OF_USE}
{@link #ERR_MISSING_GRID}{@link ErrorCause#MISSING_GRID}reserved: today a missing grid is an operation-level failure and therefore + * throws rather than being recorded per point
{@link #ERR_NO_OPERATION}{@link ErrorCause#NO_OPERATION_AVAILABLE}reserved for per-coordinate operation selection, which the legacy engine does not + * do
+ * + *

Only per-coordinate causes are ever recorded as a status. A CRS that cannot be built, + * an operation with no inverse, and an environment failure are properties of the + * operation, not of the coordinate, so they abandon the batch and throw — recording one + * of those once per row would report a planning-time defect four million times. The predicate is + * {@link ErrorCause#isCoordinateError()}, and {@link #forCause(ErrorCause)} returns + * {@link #NOT_A_COORDINATE_ERROR} for everything else. + * + * @see org.locationtech.proj4j.BulkCoordinateTransform + * @since 1.5.0 + */ +public final class TransformStatus { + + /** The point transformed; its output ordinates are finite (or {@code NaN} because the input was). */ + public static final byte OK = 0; + + /** + * The coordinate is well formed but lies outside the domain on which the projection is + * defined — beyond the visible hemisphere of an azimuthal projection, past the pole of a + * conic. PROJ's {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} (2050). + */ + public static final byte ERR_COORD_OUT_OF_DOMAIN = 1; + + /** + * The arithmetic failed: an iteration did not converge within its cap, or finite input + * produced a non-finite result. PROJ's {@code PROJ_ERR_COORD_TRANSFM} (2048) and + * {@code PROJ_ERR_COORD_TRANSFM_NO_CONVERGENCE} (2054). + */ + public static final byte ERR_NUMERICAL_FAILURE = 2; + + /** + * A grid the operation needs is absent from every configured source. + *

+ * Reserved. In the legacy engine a missing grid is discovered while planning, not + * per point, so it throws {@link ErrorCause#MISSING_GRID} and abandons the batch. + */ + public static final byte ERR_MISSING_GRID = 3; + + /** + * The coordinate falls outside the extent of every grid the operation carries, or on a + * no-data node. PROJ's {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID} (2052) and + * {@code PROJ_ERR_COORD_TRANSFM_GRID_AT_NODATA} (2053). + */ + public static final byte ERR_OUTSIDE_GRID_EXTENT = 4; + + /** + * The coordinate lies outside the declared area of use of the operation. Enforced only when + * asked, because the result is usually finite and plausible rather than undefined. + */ + public static final byte ERR_OUTSIDE_AREA_OF_USE = 5; + + /** + * No usable operation applies to this particular coordinate. + *

+ * Reserved for per-coordinate operation selection, which the legacy engine does not perform: + * it selects once, at construction, so this is an operation-level failure today. + */ + public static final byte ERR_NO_OPERATION = 6; + + /** + * The input was not a valid input for this operation at all: an infinite ordinate, + * or an angular input outside PROJ's input contract (|latitude| past the pole by more than + * {@code PJ_EPS_LAT = 1e-12} radians, or |longitude| beyond 10 radians). PROJ's + * {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD} (2049). + * + *

Deliberately distinct from {@link #ERR_NUMERICAL_FAILURE}: one says the caller asked an + * unanswerable question, the other says Proj4J failed to answer an answerable one. + * + *

A {@code NaN} input is not this. {@code NaN} in, {@code NaN} out, status + * {@link #OK} — the caller supplied the undefinedness and gets it back, which is what PROJ + * does and what the {@code gie} corpus asserts. Only a finite input outside the + * contract, or an infinity, is an error. + */ + public static final byte ERR_INVALID_INPUT = 7; + + /** + * Returned by {@link #forCause(ErrorCause)} for a cause that is not a per-coordinate + * failure and therefore must not be squeezed into a status byte. Negative so that it can + * never be confused with a real code, all of which are non-negative. + */ + public static final byte NOT_A_COORDINATE_ERROR = -1; + + private TransformStatus() { + } + + /** + * Whether a status byte means the point transformed. + * + * @param status a status byte + * @return true if {@code status} is {@link #OK} + */ + public static boolean isOk(byte status) { + return status == OK; + } + + /** + * The status byte for a per-coordinate {@link ErrorCause}. + * + * @param cause the cause; may be null + * @return the status byte, or {@link #NOT_A_COORDINATE_ERROR} if {@code cause} is null or is + * not a per-coordinate failure + */ + public static byte forCause(ErrorCause cause) { + if (cause == null) { + return NOT_A_COORDINATE_ERROR; + } + switch (cause) { + case INVALID_COORDINATE: + return ERR_INVALID_INPUT; + case COORDINATE_OUT_OF_DOMAIN: + return ERR_COORD_OUT_OF_DOMAIN; + case NUMERICAL_FAILURE: + return ERR_NUMERICAL_FAILURE; + case COORDINATE_OUTSIDE_GRID: + case GRID_NODATA: + return ERR_OUTSIDE_GRID_EXTENT; + case COORDINATE_OUTSIDE_AREA_OF_USE: + return ERR_OUTSIDE_AREA_OF_USE; + case MISSING_TIME: + // No code of its own; a coordinate with no epoch is an unusable input. + return ERR_INVALID_INPUT; + default: + return NOT_A_COORDINATE_ERROR; + } + } + + /** + * The {@link ErrorCause} a status byte stands for, so a caller that reads the status array + * can route through the same taxonomy, {@code metricKey()} and group predicates as a caller + * that catches. + * + * @param status a status byte + * @return the cause, or null for {@link #OK} + * @throws IllegalArgumentException if {@code status} is not one of the defined codes + */ + public static ErrorCause cause(byte status) { + switch (status) { + case OK: + return null; + case ERR_COORD_OUT_OF_DOMAIN: + return ErrorCause.COORDINATE_OUT_OF_DOMAIN; + case ERR_NUMERICAL_FAILURE: + return ErrorCause.NUMERICAL_FAILURE; + case ERR_MISSING_GRID: + return ErrorCause.MISSING_GRID; + case ERR_OUTSIDE_GRID_EXTENT: + return ErrorCause.COORDINATE_OUTSIDE_GRID; + case ERR_OUTSIDE_AREA_OF_USE: + return ErrorCause.COORDINATE_OUTSIDE_AREA_OF_USE; + case ERR_NO_OPERATION: + return ErrorCause.NO_OPERATION_AVAILABLE; + case ERR_INVALID_INPUT: + return ErrorCause.INVALID_COORDINATE; + default: + throw new IllegalArgumentException("not a TransformStatus code: " + status); + } + } + + /** + * The constant name of a status byte, for log lines and assertion messages. + * + * @param status a status byte + * @return the name, or {@code "UNKNOWN()"} for an undefined code + */ + public static String name(byte status) { + switch (status) { + case OK: return "OK"; + case ERR_COORD_OUT_OF_DOMAIN: return "ERR_COORD_OUT_OF_DOMAIN"; + case ERR_NUMERICAL_FAILURE: return "ERR_NUMERICAL_FAILURE"; + case ERR_MISSING_GRID: return "ERR_MISSING_GRID"; + case ERR_OUTSIDE_GRID_EXTENT: return "ERR_OUTSIDE_GRID_EXTENT"; + case ERR_OUTSIDE_AREA_OF_USE: return "ERR_OUTSIDE_AREA_OF_USE"; + case ERR_NO_OPERATION: return "ERR_NO_OPERATION"; + case ERR_INVALID_INPUT: return "ERR_INVALID_INPUT"; + case NOT_A_COORDINATE_ERROR: return "NOT_A_COORDINATE_ERROR"; + default: return "UNKNOWN(" + status + ")"; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/AxisOrder.java b/core/src/main/java/org/locationtech/proj4j/datum/AxisOrder.java index 8c6da20..e225df4 100644 --- a/core/src/main/java/org/locationtech/proj4j/datum/AxisOrder.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/AxisOrder.java @@ -17,9 +17,13 @@ import java.io.Serializable; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; public final class AxisOrder implements Serializable { + + private static final long serialVersionUID = -725125594686344921L; + public static enum Axis { Easting { public double fromENU(ProjCoordinate c) { @@ -62,8 +66,16 @@ public void toENU(double z, ProjCoordinate c) { } }, Down { + /** + * Negates, symmetrically with {@link #toENU}. Until 1.5.0 this returned + * {@code c.z} unnegated while {@code toENU} negated, so {@code +axis=…d} was not + * an involution: {@code fromENU(toENU(z))} came back as {@code -z}. Every other + * reversed axis ({@code Westing}, {@code Southing}) negates in both directions, + * and the axis-order round trip in {@code BasicCoordinateTransform} — {@code toENU} + * on the source, {@code fromENU} on the target — depends on it. + */ public double fromENU(ProjCoordinate c) { - return c.z; + return -c.z; } public void toENU(double z, ProjCoordinate c) { c.z = -z; @@ -79,7 +91,8 @@ static Axis fromChar(char c) { case 's': return Southing; case 'd': return Down; } - throw new IllegalArgumentException(); + throw new InvalidValueException( + "Invalid +axis direction '" + c + "': expected one of e, w, n, s, u, d"); } public abstract double fromENU(ProjCoordinate c); @@ -97,9 +110,27 @@ private AxisOrder(Axis x, Axis y, Axis z) { this.z = z; } + /** + * Parses PROJ's three-letter {@code +axis=} encoding. + *

+ * Until 1.5.0 a spec of the wrong length threw a bare {@code new Error()} — with no + * message, and, being an {@link Error} rather than an exception, outside + * {@code catch (Proj4jException)} and outside most callers' {@code catch (Exception)} as + * well. In a Spark executor that is a killed task rather than a rejected row. + * + * @param spec exactly three characters from {@code e w n s u d}, one per axis + * @return the axis order + * @throws InvalidValueException if {@code spec} is null, not exactly three characters, or + * contains a character that is not an axis direction + */ public static AxisOrder fromString(String spec) { + if (spec == null) { + throw new InvalidValueException("Invalid +axis: value is missing"); + } if (spec.length() != 3) { - throw new Error(); + throw new InvalidValueException("Invalid +axis=" + spec + + ": expected exactly 3 direction characters from \"ewnsud\", one per axis, but got " + + spec.length()); } Axis x = Axis.fromChar(spec.charAt(0)); @@ -141,4 +172,30 @@ public boolean equals(Object that) { return false; } } + + /** + * Re-canonicalises {@link #ENU} on deserialisation, so that + * {@code deserialize(serialize(ENU)) == ENU} rather than merely {@code .equals(ENU)}. + * + *

This class is a value type with a private constructor and exactly one published + * constant, which is the shape that leads callers to compare with {@code ==}. Without a + * {@code readResolve}, deserialisation manufactures a fresh instance and every such + * comparison silently becomes false — the failure mode being a coordinate that is *not* + * axis-swapped when it should be, i.e. a wrong answer rather than an error. + * + *

This is a latent hazard for callers, not a live bug in proj4j. + * {@code BasicCoordinateTransform:324-325} uses {@code AxisOrder.ENU.equals(srcAxes)}, and + * a scan of {@code core/src/main} finds no {@code == AxisOrder.ENU} site at all (0 hits; + * the same scan finds the 2 {@code .equals} sites, so it is not vacuous). The method is + * added because the type is public API and a Spark executor deserialising a shipped + * {@code CoordinateTransform} is exactly where the identity would be lost. + * + *

Private, so it does not participate in the default {@code serialVersionUID} + * computation and therefore cannot perturb the value pinned above. + * + * @return {@link #ENU} when the deserialised value is the ENU order, otherwise {@code this} + */ + private Object readResolve() { + return equals(ENU) ? ENU : this; + } } diff --git a/core/src/main/java/org/locationtech/proj4j/datum/CTABLEV2.java b/core/src/main/java/org/locationtech/proj4j/datum/CTABLEV2.java index 1278504..9fdcc7e 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/CTABLEV2.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/CTABLEV2.java @@ -30,23 +30,39 @@ public final class CTABLEV2 { private static final byte[] magic = "CTABLE V2".getBytes(StandardCharsets.US_ASCII); + /** The fixed header, and therefore the offset of the first node. */ + private static final int HEADER_BYTES = 160; + + /** Each node is two little-endian {@code float}s: a longitude shift and a latitude shift. */ + private static final int BYTES_PER_NODE = 8; + public static boolean testHeader(byte[] header) { return containsAt(magic, header, 0); } public static Grid.ConversionTable init(DataInputStream definition) throws IOException { - byte[] header = new byte[160]; + byte[] header = new byte[HEADER_BYTES]; definition.readFully(header); - if (!containsAt(magic, header, 0)) throw new Error("Not a CTABLE V2 file"); + if (!containsAt(magic, header, 0)) { + // Was `throw new Error(...)`. An Error escapes catch (Proj4jException) AND catch + // (Exception), so a file that merely failed a magic test could take down a Spark task + // rather than being reported as an unreadable grid. Measured: the old code escaped a + // catch (Exception) placed directly around this call. + throw new GridFormatException("Not a CTABLE V2 file"); + } byte[] id_bytes = Arrays.copyOfRange(header, 16, 16 + 80); PolarCoordinate ll = new PolarCoordinate(doubleFromBytes(header, 96), doubleFromBytes(header, 104)); PolarCoordinate del = new PolarCoordinate(doubleFromBytes(header, 112), doubleFromBytes(header, 120)); - IntPolarCoordinate lim = new IntPolarCoordinate(intFromBytes(header, 128), intFromBytes(header, 132)); + int columns = intFromBytes(header, 128); + int rows = intFromBytes(header, 132); - // Minimal validation to detect corrupt structure - if (lim.lam < 1 || lim.lam > 100000 || lim.phi < 1 || lim.phi > 100000) { - throw new Error("Grid position counts outside of acceptable parameters for CTABLE file " + lim); - } + // The axis bounds alone were never enough: 100000 x 100000 passed them and then multiplied to + // 1,410,065,408 -- 5.25 GiB of references demanded by these 160 bytes. The node count is now + // checked against the bytes that actually follow the header. + long haveBytes = GridExtents.remaining(definition); + long limitBytes = haveBytes >= 0 ? HEADER_BYTES + haveBytes : GridExtents.maxFileBytes(); + GridExtents.checkedCount("CTABLE V2 grid", columns, rows, BYTES_PER_NODE, HEADER_BYTES, + limitBytes, haveBytes >= 0 ? "the file" : "the grid-file ceiling"); int nullPosition = 0; while (nullPosition < id_bytes.length && id_bytes[nullPosition] != 0) nullPosition++; @@ -54,16 +70,22 @@ public static Grid.ConversionTable init(DataInputStream definition) throws IOExc table.id = new String(id_bytes, 0, nullPosition, StandardCharsets.US_ASCII).trim(); table.ll = ll; table.del = del; - table.lim = lim; + table.lim = new IntPolarCoordinate(columns, rows); return table; } public static void load(DataInputStream definition, Grid grid) throws IOException { Grid.ConversionTable table = grid.table; - int entryCount = table.lim.lam * table.lim.phi; + GridExtents.skipFully(definition, HEADER_BYTES, "CTABLE V2 grid " + table.id); + // Re-checked here rather than trusted from init(): load() is public, takes its own stream, and + // reads grid.table -- which a caller, not init(), may have populated. + long haveBytes = GridExtents.remaining(definition); + int entryCount = GridExtents.checkedCount("CTABLE V2 grid " + table.id, + table.lim.lam, table.lim.phi, BYTES_PER_NODE, 0L, + haveBytes >= 0 ? haveBytes : GridExtents.maxFileBytes(), + haveBytes >= 0 ? "the remaining file" : "the grid-file ceiling"); FloatPolarCoordinate[] cvs = new FloatPolarCoordinate[entryCount]; - byte[] buff = new byte[8]; - definition.skipBytes(160); + byte[] buff = new byte[BYTES_PER_NODE]; for (int i = 0; i < entryCount; i++) { definition.readFully(buff); cvs[i] = new FloatPolarCoordinate(floatFromBytes(buff, 0), floatFromBytes(buff, 4)); diff --git a/core/src/main/java/org/locationtech/proj4j/datum/Datum.java b/core/src/main/java/org/locationtech/proj4j/datum/Datum.java index ecefbd7..0812c12 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/Datum.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/Datum.java @@ -21,10 +21,12 @@ import static org.locationtech.proj4j.util.ProjectionMath.isIdentity; import java.io.IOException; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; /** @@ -54,6 +56,20 @@ // The well-known datums are defined in pj_datums.c public class Datum implements java.io.Serializable { + /** + * Pinned, not chosen: {@code -4123237894098833763L} is what + * {@code ObjectStreamClass.lookup(Datum.class).getSerialVersionUID()} printed on the shipped + * classpath immediately before {@link #nadgridsSpec} was added, and that field set + * ({@code code}, {@code name}, {@code ellipsoid}, {@code transform}, {@code grids}) is + * unchanged since 1.4.3. + *

+ * The default UID is computed from every field that is not {@code private static} or + * {@code private transient}, so adding one {@code private final String} would have changed it + * and silently broken deserialisation across versions. {@link #resolvedGrids} is + * {@code private transient} and so never participated. + */ + private static final long serialVersionUID = -4123237894098833763L; + public static final int TYPE_UNKNOWN = 0; public static final int TYPE_WGS84 = 1; public static final int TYPE_3PARAM = 2; @@ -65,22 +81,101 @@ public class Datum implements java.io.Serializable { public static final Datum WGS84 = new Datum("WGS84", 0, 0, 0, Ellipsoid.WGS84, "WGS84"); public static final Datum GGRS87 = new Datum("GGRS87", -199.87, 74.79, 246.62, Ellipsoid.GRS80, "Greek_Geodetic_Reference_System_1987"); public static final Datum NAD83 = new Datum("NAD83", 0, 0, 0, Ellipsoid.GRS80, "North_American_Datum_1983"); - public static final Datum NAD27; // uses static initializer block so we can catch an exception - public static final Datum POTSDAM = new Datum("potsdam", 598.1, 73.7, 418.2, 0.202, 0.045, -2.455, 6.7, Ellipsoid.BESSEL, "Potsdam Rauenberg 1950 DHDN"); - public static final Datum CARTHAGE = new Datum("carthage", -263.0, 6.0, 431.0, Ellipsoid.CLARKE_1880, "Carthage 1934 Tunisia"); + /** + * {@code 9.8.1:src/datums.cpp:44}: + * {@code {"NAD27", "nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", "clrk66", ...}}. + *

+ * The grid list is declared here and resolved on demand; see + * {@link #nadgridsSpec} for why the difference is load bearing. Every token carries PROJ's + * {@code @} optional marker, so with none of the four files reachable this reports + * {@link #TYPE_UNKNOWN} — NAD27 declares no Helmert fallback, unlike {@link #POTSDAM}. + */ + public static final Datum NAD27; + + /** + * {@code potsdam}, the only entry in PROJ's legacy table whose definition is + * two strings, one of them commented out. Verbatim, 9.8.1 + * {@code src/datums.cpp:49-50}: + *

+     * {"potsdam", /*"towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7",*/
+     *  "nadgrids=@BETA2007.gsb", "bessel", "Potsdam Rauenberg 1950 DHDN"},
+     * 
+ * Both are reproduced here — the grid as the declared shift, the Helmert as the + * fallback — because that pair is what PROJ 9.8.1 does, measured rather than + * inferred from the table. At (9, 50) into + * {@code +proj=tmerc +lon_0=9 +x_0=3500000 +ellps=bessel}, from WGS84 lon/lat: + * + * + * + * + * + * + * + * + * + * + * + *
cs2cs 9.8.1
configurationeastingnorthing
{@code +datum=potsdam}, {@code de_adv_BETA2007.tif} present3500074.9206305540407.239515
{@code +datum=potsdam}, that grid hidden from {@code PROJ_DATA}3500074.5254065540407.107230
{@code +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7}3500074.5254065540407.107230
{@code +ellps=bessel +nadgrids=@nosuch.gsb} (no shift at all)3500000.0000005540279.541956
+ * So {@code cs2cs +datum=potsdam} degrades grid → Helmert, never to + * no-shift: PROJ's CRS layer resolves the name to EPSG datum DHDN and picks the best + * available EPSG operation, which is DHDN to WGS 84 (4) = BETA2007 when the + * grid is on hand and DHDN to WGS 84 (2) = exactly the commented-out Helmert + * when it is not. Only a bare {@code +nadgrids=@...} with nothing behind it falls all + * the way through to no shift (row 4 above; {@code @} is PROJ's optional marker, + * {@code grids.cpp getListOfGridSets}). + *

+ * Proj4J does not ship {@code BETA2007.gsb}, so this constant is {@link #TYPE_7PARAM} + * today and reproduces row 3 — and therefore row 2 — to the last digit. It becomes + * {@link #TYPE_GRIDSHIFT} and reproduces row 1 the moment the grid appears on + * {@link Grid}'s search path, with no change here. Dropping the Helmert to follow the + * uncommented string alone would have cost 74.921 m easting and 127.698 m + * northing at that point (row 4 against row 1), which is why it is kept. + *

+ * Which of the two takes effect is a function of the resolver chain and of nothing + * else — in particular not of when this class happened to load. See + * {@link #nadgridsSpec}. + */ + public static final Datum POTSDAM; + + public static final Datum CARTHAGE = + // 9.8.1 src/datums.cpp:51-52: + // {"carthage", "towgs84=-263.0,6.0,431.0", "clrk80ign", "Carthage 1934 Tunisia"} + // The ellipsoid is clrk80*ign* (a=6378249.2, rf=293.4660212936269), not clrk80 + // (a=6378249.145, rf=293.4663). Proj4J bound the latter, which is a different + // ellipsoid by 55 mm of equatorial radius and shows up as 20 mm of northing at + // Tunis -- see LegacyDatumTableTest. + new Datum("carthage", -263.0, 6.0, 431.0, Ellipsoid.CLRK80IGN, "Carthage 1934 Tunisia"); public static final Datum HERMANNSKOGEL = new Datum("hermannskogel", 577.326, 90.129, 463.919, 5.137, 1.474, 5.297, 2.4232, Ellipsoid.BESSEL, "Hermannskogel"); public static final Datum IRE65 = new Datum("ire65", 482.530, -130.596, 564.557, -1.042, -0.214, -0.631, 8.15, Ellipsoid.MOD_AIRY, "Ireland 1965"); public static final Datum NZGD49 = new Datum("nzgd49", 59.47, -5.04, 187.44, 0.47, -0.1, 1.024, -4.5993, Ellipsoid.INTERNATIONAL, "New Zealand Geodetic Datum 1949"); - public static final Datum OSGB36 = new Datum("OSGB36", 446.448, -125.157, 542.06, 0.15, 0.247, 0.842, -20.489, Ellipsoid.AIRY, "Airy 1830"); + /** + * 9.8.1 {@code src/datums.cpp:59-60}: + *

+     * {"OSGB36", "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",
+     *  "airy", "Airy 1830"},
+     * 
+ * Four of the seven were previously truncated here to {@code 542.06, 0.15, 0.247, + * 0.842, -20.489} — which is EPSG:1314, OSGB36 to WGS 84 (6), a real but + * coarser transformation, so the values looked plausible. Restoring PROJ's moves the + * answer by about 3 mm across Great Britain (largest observed 3.5 mm of easting at + * 7.5°W); it is not the 1.78 m one might read off a {@code cs2cs +datum=OSGB36} + * comparison, because that promotes to the OSTN15 grid + * ({@code uk_os_OSTN15_NTv2_OSGBtoETRS.tif}, OSGB36 to WGS 84 (9)) and the + * 1.78 m is the grid-versus-Helmert residual. Measurements in + * {@code datum/audit/LegacyDatumAreaOfUseTest}. + */ + public static final Datum OSGB36 = new Datum("OSGB36", 446.448, -125.157, 542.060, 0.1502, 0.2470, 0.8421, -20.4894, Ellipsoid.AIRY, "Airy 1830"); static { - Datum temp = new Datum("NAD27", new ArrayList(), Ellipsoid.CLARKE_1866, "North_American_Datum_1927"); - try { - temp = new Datum("NAD27", Grid.fromNadGrids("@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat"), Ellipsoid.CLARKE_1866, "North_American_Datum_1927"); - } catch (IOException e) { - // TODO: Logging - } - NAD27 = temp; + // No I/O here, deliberately. These two are the only entries in PROJ's legacy table + // whose shift is a +nadgrids= list, and resolving it in a static initialiser is what + // made getTransformType() depend on class-load order. See nadgridsSpec. + NAD27 = declaring("NAD27", null, + "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", + Ellipsoid.CLARKE_1866, "North_American_Datum_1927"); + POTSDAM = declaring("potsdam", + new double[]{598.1, 73.7, 418.2, 0.202, 0.045, -2.455, 6.7}, + "@BETA2007.gsb", Ellipsoid.BESSEL, "Potsdam Rauenberg 1950 DHDN"); } private String code; @@ -89,10 +184,102 @@ public class Datum implements java.io.Serializable { private double[] transform = DEFAULT_TRANSFORM; private List grids = null; + /** + * The {@code +nadgrids=} list exactly as PROJ's table writes it, for the datums whose shift + * is a grid list, or {@code null} for every datum built from an already-resolved + * {@code List}. Only {@link #NAD27} and {@link #POTSDAM} use it. + *

+ * The defect this exists to remove. Both constants used to call + * {@link Grid#fromNadGrids} from the static initialiser above, which snapshots whatever + * {@link ResourceResolvers#resolver()} happened to return at class-load time. That + * chain is mutable: {@link ResourceResolvers#addResolver} discards the memoised chain, so an + * application that registers a {@link org.locationtech.proj4j.resource.DirectoryResourceResolver} + * for its grid directory gets {@link #TYPE_GRIDSHIFT} if it does so before anything touches + * {@code Datum}, and {@link #TYPE_7PARAM} if it does so after. Measured: + * {@code DHDN_ETRS89.gie} scored 64/64 from a driver that built the grid bridge first + * and 32/32 under surefire, where an unrelated earlier test had already loaded + * {@code Datum} — same code, same grid file, same classpath, two different answers. A + * transform type that varies with class-loading is worse than one that is merely wrong, + * because it cannot be tested. + *

+ * What replaces it. The list is resolved on demand by {@link #gridList()} and memoised + * against the identity of the resolver chain it was resolved against. Every mutator + * on {@link ResourceResolvers} nulls that memoised chain, so a fresh chain object is + * precisely the signal that the configuration changed. The observable consequence: + *

+ * {@code getTransformType()} is a pure function of the current resolver chain. Grid + * reachable → {@link #TYPE_GRIDSHIFT}. Grid not reachable → the declared fallback, + * which is {@link #TYPE_7PARAM} for {@code potsdam} (PROJ's measured grid→Helmert + * degradation, see {@link #POTSDAM}) and {@link #TYPE_UNKNOWN} for {@code NAD27}, which + * declares no Helmert. Class-load time does not appear in that function. + *

+ * This does not make the singletons mutable. The memo is a cache of a derived value, + * never a second source of truth: for a given chain it can only ever hold the one answer + * {@link Grid#fromNadGrids} gives for {@link #nadgridsSpec}, so two threads racing to fill it + * store equal contents and a lost update costs a repeated lookup rather than a different + * coordinate. The declared state — code, name, ellipsoid, {@code towgs84}, spec — remains + * final in effect and the constants remain {@code final}. {@link #setGrids} is refused + * outright on a spec-backed datum, which closes the hole that let a parser bug call + * {@code setGrids(null)} on {@link #NAD27} and destroy its grid list process-wide. + */ + private final String nadgridsSpec; + + /** + * Memo for {@link #nadgridsSpec}: {@code null} until first asked. {@code transient} because + * a resolver chain is not serialisable and must not be — a deserialised {@link Datum} has to + * re-derive against the chain of the JVM it lands in, not the one it was written in. + */ + private transient volatile GridResolution resolvedGrids; + + /** + * One resolver chain and what {@link #nadgridsSpec} resolved to against it. Immutable, so + * publication through a {@code volatile} field is sufficient and no lock is held across grid + * I/O. + */ + private static final class GridResolution { + private final ChainedResourceResolver chain; + private final List grids; + + GridResolution(ChainedResourceResolver chain, List grids) { + this.chain = chain; + this.grids = grids; + } + } + private Datum(String code, List grids, Ellipsoid ellipsoid, String name) { this(code, (double[]) null, grids, ellipsoid, name); } + /** + * The declared-grid-list constructor, reached only through {@link #declaring} so that no + * overload of the public constructor becomes ambiguous on a {@code null} third argument. + */ + private Datum(String code, double[] transform, Ellipsoid ellipsoid, String name, + String nadgridsSpec) { + this.code = code; + this.name = name; + this.ellipsoid = ellipsoid; + this.grids = null; + this.nadgridsSpec = nadgridsSpec; + this.transform = scaleRotations(transform); + } + + /** + * Builds one of PROJ's two grid-shift table entries: a datum that carries its + * {@code +nadgrids=} list as the string {@code datums.cpp} writes and resolves it on demand. + * + * @param code PROJ's datum name + * @param transform the {@code towgs84} fallback, or {@code null} if the table declares none + * @param nadgridsSpec the {@code +nadgrids=} value, {@code @}-markers included + * @param ellipsoid the datum's ellipsoid + * @param name the human-readable name + * @return the datum + */ + private static Datum declaring(String code, double[] transform, String nadgridsSpec, + Ellipsoid ellipsoid, String name) { + return new Datum(code, transform, ellipsoid, name, nadgridsSpec); + } + public Datum(String code, double deltaX, double deltaY, double deltaZ, Ellipsoid ellipsoid, @@ -117,13 +304,68 @@ public Datum(String code, this.name = name; this.ellipsoid = ellipsoid; this.grids = grids; + this.nadgridsSpec = null; + this.transform = scaleRotations(transform); + } + + /** + * Converts a 7-parameter {@code towgs84} in place from PROJ's on-the-wire units — arc + * seconds for the rotations, ppm for the scale — to the radians and multiplier the arithmetic + * in {@link #transformFromGeocentricToWgs84} expects. Extracted verbatim from the public + * constructor when a second constructor appeared; the in-place write and the {@code length + * > 3} test (rather than {@code == 7}) are both preserved exactly as they were. + * + * @param transform the raw parameters, possibly {@code null} + * @return the same array, rescaled + */ + private static double[] scaleRotations(double[] transform) { if (transform != null && transform.length > 3) { transform[3] *= SECONDS_TO_RAD; transform[4] *= SECONDS_TO_RAD; transform[5] *= SECONDS_TO_RAD; transform[6] = transform[6] / MILLION + 1.; } - this.transform = transform; + return transform; + } + + /** + * The grid list this datum shifts through: the list it was constructed with, or — for the two + * PROJ table entries whose shift is a {@code +nadgrids=} string — that string resolved against + * the resolver chain in force now. Never {@code null} for a spec-backed datum; may be + * {@code null} for any other, exactly as the {@code grids} field always could. + *

+ * Read {@link #nadgridsSpec} for why this is not done once at class-load time. The short + * version: it was, and the answer depended on load order. + * + * @return the effective grid list, possibly empty, possibly {@code null} + */ + private List gridList() { + final String spec = nadgridsSpec; + if (spec == null) { + return grids; + } + // Identity, not equality: ResourceResolvers memoises exactly one chain object per + // configuration and nulls it on every mutation, so "same object" is the cheapest correct + // test for "same configuration". The chain also wraps each delegate in a + // CachingResourceResolver, negative results included, so a given chain object's answer + // for a given grid name cannot drift underneath the memo either. + final ChainedResourceResolver chain = ResourceResolvers.resolver(); + final GridResolution memo = resolvedGrids; + if (memo != null && memo.chain == chain) { + return memo.grids; + } + List resolved; + try { + resolved = Collections.unmodifiableList(Grid.fromNadGrids(spec)); + } catch (IOException e) { + // Unreachable for both declared specs: Grid.fromNadGrids only rethrows for a token + // *without* PROJ's @ optional marker, and every token in datums.cpp's two lists has + // one. Memoised rather than retried all the same, because a value that depends on + // which call happened to hit a transient I/O error is the very thing being removed. + resolved = Collections.emptyList(); + } + resolvedGrids = new GridResolution(chain, resolved); + return resolved; } public String getCode() { @@ -146,7 +388,19 @@ public double[] getTransformToWGS84() { return transform; } + /** + * This datum's shift mechanism, as one of the {@code TYPE_*} constants. + *

+ * For {@link #NAD27} and {@link #POTSDAM} the answer depends on which of their declared grid + * files are reachable, and is a pure function of the resolver chain in force when it is asked + * — not of when this class loaded. That distinction is the whole of {@link #nadgridsSpec}; + * read it before assuming a stale answer can be cached across a resolver change. + * + * @return one of {@link #TYPE_UNKNOWN}, {@link #TYPE_WGS84}, {@link #TYPE_3PARAM}, + * {@link #TYPE_7PARAM}, {@link #TYPE_GRIDSHIFT} + */ public int getTransformType() { + List grids = gridList(); if (grids != null && grids.size() > 0) return TYPE_GRIDSHIFT; if (Ellipsoid.WGS84.isEqual(ellipsoid) || Ellipsoid.GRS80.isEqual(ellipsoid)) { @@ -181,12 +435,23 @@ public boolean hasTransformToWGS84() { * @return */ public boolean isEqual(Datum datum) { + // Reference identity first. The well-known datums are process-wide singletons, so + // this is the common case, and on the TYPE_GRIDSHIFT branch below the fallback is + // List.equals over Grid -- which descends into Arrays.equals over every node of a + // loaded NTv2 table. Comparing a singleton with itself must not pay for that. + // Behaviour is unchanged: every branch below already returns true for this == datum. + if (this == datum) return true; + // false if tranforms are not equal if (getTransformType() != datum.getTransformType()) { return false; } - // false if ellipsoids are not (approximately) equal - if (ellipsoid.getEquatorRadius() != ellipsoid.getEquatorRadius()) { + // false if ellipsoids are not (approximately) equal. + // NOTE: the right-hand side used to read `ellipsoid.getEquatorRadius()` -- the *same* + // ellipsoid -- so this condition was always false and the eccentricity check below was + // dead code. Datums with differently sized ellipsoids therefore compared equal, which + // short-circuits BasicCoordinateTransform.datumTransform into an input echo. + if (ellipsoid.getEquatorRadius() != datum.ellipsoid.getEquatorRadius()) { if (Math.abs(ellipsoid.getEccentricitySquared() - datum.ellipsoid.getEccentricitySquared()) > ELLIPSOID_E2_TOLERANCE) return false; @@ -200,7 +465,15 @@ public boolean isEqual(Datum datum) { } return true; } else if (getTransformType() == TYPE_GRIDSHIFT) { - return grids.equals(datum.grids); + List mine = gridList(); + List theirs = datum.gridList(); + // Second reference-identity short circuit, for the same reason as the first: List.equals + // over Grid descends into Arrays.equals over every node of a loaded NTv2 table. Two + // spec-backed datums resolved against the same chain hand back the same List instance, + // and the Grid instances themselves come from GridCache, so this hits far more often + // than it looks. + if (mine == theirs) return true; + return mine.equals(theirs); } return true; // datums are equal @@ -257,14 +530,67 @@ public void transformToGeocentricFromWgs84(ProjCoordinate p) { } public void shift(ProjCoordinate xy) { - Grid.shift(grids, false, xy); + Grid.shift(gridList(), false, xy); } public void inverseShift(ProjCoordinate xy) { - Grid.shift(grids, true, xy); + Grid.shift(gridList(), true, xy); + } + + /** + * This datum's effective grid list, resolved against the resolver chain in force now, + * as a {@code Grid[]} for a caller that will apply it to many points. + * + *

Why this exists

+ * + *

{@link #shift} and {@link #inverseShift} call {@link #gridList()} per point. For + * an ordinary datum that is one plain field read and free. For the two spec-backed singletons + * — {@link #NAD27} and {@link #POTSDAM}, i.e. the datums for which a grid shift is the common + * case — it is two {@code volatile} reads: {@link ResourceResolvers#resolver()}'s memoised + * chain and this datum's {@link #resolvedGrids} memo. Each is an acquire load, so besides its + * own cost it is a barrier the JIT may not hoist ordinary loads across, in the innermost loop + * of a batch. {@code BasicCoordinateTransform}'s bulk path calls this once and keeps the + * array, which takes the fence out of the loop; the single-point path is deliberately left + * calling {@link #shift} per point, because it is kept byte-identical to 1.4.3. + * + *

Returns a fresh array each call — it is a snapshot, not a view, and the caller may hold + * it. {@code null} for a datum with no grid list at all, which is what + * {@code Grid.shift(Grid[], …)} treats as a no-op. + * + * @return the resolved grids, or {@code null} if this datum has none + * @since 1.5.0 + */ + public Grid[] gridArray() { + List resolved = gridList(); + if (resolved == null) { + return null; + } + return resolved.toArray(new Grid[0]); } + /** + * Replaces this datum's grid list. + *

+ * Refused on {@link #NAD27} and {@link #POTSDAM}, the two process-wide singletons whose + * grid list is declared rather than supplied. A parser bug once called {@code setGrids(null)} + * on {@link #NAD27} while parsing {@code EPSG:4267} — a definition with no {@code +nadgrids} + * token — which destroyed the shared grid list for the life of the JVM and flipped every + * NAD27 transform in the process, including already-cached ones, to + * {@link #TYPE_UNKNOWN}. Nothing in Proj4J calls this method; a caller that needs a different + * grid list should construct a new {@link Datum} with + * {@link #Datum(String, double[], List, Ellipsoid, String)} rather than edit a shared one. + * + * @param grids the new grid list + * @throws UnsupportedOperationException if this datum's grid list comes from a declared + * {@code +nadgrids=} spec + */ public void setGrids(List grids) { + if (nadgridsSpec != null) { + throw new UnsupportedOperationException("Datum " + code + " is a shared singleton whose" + + " grid list is declared as '" + nadgridsSpec + "' and resolved from the" + + " resource resolver chain; mutating it would change every transform in the" + + " JVM. Construct a new Datum instead."); + } this.grids = grids; } } \ No newline at end of file diff --git a/core/src/main/java/org/locationtech/proj4j/datum/Ellipsoid.java b/core/src/main/java/org/locationtech/proj4j/datum/Ellipsoid.java index 1d7f695..525e257 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/Ellipsoid.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/Ellipsoid.java @@ -52,6 +52,8 @@ // Named ellipsoids are defined in pj_datums.c public final class Ellipsoid implements Cloneable, java.io.Serializable { + private static final long serialVersionUID = 6364129095884642539L; + public String name; public String shortName; @@ -77,8 +79,13 @@ public final class Ellipsoid implements Cloneable, java.io.Serializable { public final static Ellipsoid CLARKE_1880 = new Ellipsoid("clrk80", 6378249.145, 0.0, 293.4663, "Clarke 1880 mod."); + // Declared by reciprocal flattening, as PROJ does (9.8.1 src/ellps.cpp:12 + // "airy", "a=6377563.396", "rf=299.3249646"). It previously declared a *rounded* + // b = 6356256.910, which implies rf = 299.324975315 and puts the pole radius + // 0.76 mm out. That is above the 0.1 mm bar on the tightest gie rows, so the + // rounding was not harmless. Derived exactly: a*(1 - 1/rf) = 6356256.909237. public final static Ellipsoid AIRY = new Ellipsoid("airy", 6377563.396, - 6356256.910, 0.0, "Airy 1830"); + 0.0, 299.3249646, "Airy 1830"); public final static Ellipsoid WGS60 = new Ellipsoid("WGS60", 6378165.0, 0.0, 298.3, "WGS 60"); @@ -200,8 +207,32 @@ public final class Ellipsoid implements Cloneable, java.io.Serializable { public final static Ellipsoid NAD83 = new Ellipsoid("NAD83", 6378137.0, 0.0, 298.257222101, "NAD83: GRS 1980 (IUGG, 1980)"); - public final static Ellipsoid SPHERE = new Ellipsoid("sphere", 6371008.7714, - 6371008.7714, 0.0, "Sphere"); + // PROJ's "Normal Sphere", r = 6370997.0 (9.8.1 src/ellps.cpp:55, + // {"sphere", "a=6370997.0", "b=6370997.0", "Normal Sphere (r=6370997)"}). + // + // This previously read 6371008.7714, which is the GRS80 *authalic* radius - a + // different quantity entirely. The ratio is 1.0000018477, so every +ellps=sphere + // result was out by 1.848 ppm: 0.41 m at 222 km of easting, against gie tolerances + // of 0.1 mm. No projection formula can absorb that, so it presented as a maths bug + // in whatever projection happened to be under test. builtins.gie has 10 operations + // on +ellps=sphere (lcc x6, lsat, times, tobmerc x2) and correct implementations of + // times and tobmerc were failing 26 assertions on this constant alone. + public final static Ellipsoid SPHERE = new Ellipsoid("sphere", 6370997.0, + 6370997.0, 0.0, "Normal Sphere (r=6370997)"); + + // The four entries below are in PROJ 9.8.1's table and were absent here, so + // +ellps= failed for all of them. Values verbatim from 9.8.1 src/ellps.cpp. + public final static Ellipsoid CLRK80IGN = new Ellipsoid("clrk80ign", + 6378249.2, 0.0, 293.4660212936269, "Clarke 1880 (IGN)."); + + public final static Ellipsoid DANISH = new Ellipsoid("danish", 6377019.2563, + 0.0, 300.0, "Andrae 1876 (Denmark, Iceland)"); + + public final static Ellipsoid GSK2011 = new Ellipsoid("GSK2011", 6378136.5, + 0.0, 298.2564151, "GSK-2011"); + + public final static Ellipsoid PZ90 = new Ellipsoid("PZ90", 6378136.0, 0.0, + 298.25784, "PZ-90"); public final static Ellipsoid[] ellipsoids = { BESSEL, @@ -248,7 +279,11 @@ public final class Ellipsoid implements Cloneable, java.io.Serializable { WALBECK, NAD27, NAD83, - SPHERE}; + SPHERE, + CLRK80IGN, + DANISH, + GSK2011, + PZ90}; public Ellipsoid() { } diff --git a/core/src/main/java/org/locationtech/proj4j/datum/GeoTiffGrid.java b/core/src/main/java/org/locationtech/proj4j/datum/GeoTiffGrid.java new file mode 100644 index 0000000..f1a0145 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/GeoTiffGrid.java @@ -0,0 +1,648 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.datum.tiff.GeoTiffDataset; +import org.locationtech.proj4j.datum.tiff.GeoTiffImage; +import org.locationtech.proj4j.util.FloatPolarCoordinate; +import org.locationtech.proj4j.util.IntPolarCoordinate; +import org.locationtech.proj4j.util.PolarCoordinate; + +/** + * Turns a geodetic GeoTIFF into the grid structures the rest of proj4j already knows how to use. + * + *

{@link org.locationtech.proj4j.datum.tiff} reads the container; this class applies the + * semantics — which band is the latitude shift, what unit it is in, which way longitude is + * positive, and how the IFDs nest into a subgrid hierarchy. Those are the two halves PROJ splits the + * same way, between {@code GTiffGrid} and {@code GTiffHGridShiftSet}/{@code GTiffVGridShiftSet}. + * + *

Horizontal grids

+ *

Port of {@code GTiffHGridShiftSet::open} ({@code 9.8.1:src/grids.cpp:2487-2654}). The output is a + * {@link Grid.ConversionTable} tree indistinguishable from what {@link NTV2} produces, so + * {@code Grid.shift}, {@code nad_cvt} and {@code nad_intr} are reused unchanged — including the subgrid + * descent {@code NTV2} already exercises. + * + *

Sign convention. PROJ applies {@code in.lam += longShift} with {@code longShift} + * positive east; proj4j's {@code nad_cvt} applies {@code in.lam -= cvs.lam}. So + * {@code cvs.lam = -longShift}, and the {@code positive_value="west"} case cancels the negation rather + * than adding one. This is the same convention {@code NTV2.readCells} stores (NTv2 is natively + * positive-west and goes in unnegated) and the one {@code NTV1} got wrong for its whole + * history, to the tune of ~8 m of longitude. + * + *

Vertical grids

+ *

Port of {@code GTiffVGridShiftSet::open} ({@code grids.cpp:1520-1608}). The result is described by + * {@link VerticalLayer} and assembled into {@link VerticalGrid} instances by that class, because a + * vertical grid holds one scalar per node rather than a pair and PROJ keeps the two hierarchies + * separate for the same reason. + * + *

Three upstream behaviours that look like bugs and are not

+ *
    + *
  1. Band selection state carries across IFDs. {@code idxLatShift}, + * {@code idxLongShift}, {@code convFactorToRadian} and {@code positiveEast} are declared + * outside the IFD loop, so a subgrid with no {@code DESCRIPTION} metadata inherits + * whatever the previous IFD resolved. {@code tests/test_hgrid_with_subgrid.tif} depends on it: + * IFD 0 ({@code CAwest}) carries {@code positive_value="west"} but no {@code DESCRIPTION}, so + * PROJ never reads that attribute for it and the grid stays positive-east, while IFD 1 + * ({@code CAeast}) does declare descriptions and sets positive-east explicitly for everything + * after it.
  2. + *
  3. {@code positive_value} is only consulted when a {@code longitude_offset} description + * was found. Upstream guards the whole block with + * {@code if (foundDescriptionForLongOffset)}. An {@code Item name="positive_value"} on a band + * PROJ did not identify by description is therefore ignored.
  4. + *
  5. An unusable IFD after the first truncates the list instead of failing. See + * {@link GeoTiffDataset}.
  6. + *
+ * + *

All static; nothing here holds state between calls, and every product is deeply immutable. + */ +final class GeoTiffGrid { + + /** {@code grids.cpp:2501} — {@code (M_PI / 180.0) / 3600} , the NTv2-inspired default unit. */ + private static final double ARC_SECOND_TO_RADIAN = (Math.PI / 180.0) / 3600.0; + + private static final double DEGREE_TO_RADIAN = Math.PI / 180.0; + + /** {@code FILETYPE_PAGE}: the only non-zero {@code SubfileType} upstream tolerates. */ + private static final long FILETYPE_PAGE = 2L; + + private GeoTiffGrid() { + } + + // ========================================================================================= + // Horizontal + // ========================================================================================= + + /** + * Reads a horizontal shift GeoTIFF into {@code target}, wiring any subgrid hierarchy into + * {@code target}'s {@code child}/{@code next} chain. + * + * @param gridName the name the grid was requested under + * @param origin where the bytes came from, for provenance + * @param resolverName which resolver produced them + * @param bytes the whole file + * @param target the {@link Grid} to populate + * @throws IOException if the file is not a usable horizontal shift grid + */ + static void loadHorizontal(String gridName, String origin, String resolverName, byte[] bytes, + Grid target) throws IOException { + GeoTiffDataset dataset = GeoTiffDataset.open(bytes, gridName); + List images = dataset.images(); + + // Defaults inspired from NTv2, and deliberately declared outside the loop: see the class + // javadoc, point 1. Changing that changes test_hgrid_with_subgrid.tif's answer. + int idxLatShift = 0; + int idxLongShift = 1; + double convFactorToRadian = ARC_SECOND_TO_RADIAN; + boolean positiveEast = true; + + List roots = new ArrayList(); + Map byName = new HashMap(); + Map types = new IdentityHashMap(); + + for (int ifd = 0; ifd < images.size(); ifd++) { + GeoTiffImage image = images.get(ifd); + + long subfileType = image.subfileType(); + if (subfileType != 0 && subfileType != FILETYPE_PAGE) { + if (ifd == 0) { + throw new IOException("GeoTIFF grid " + gridName + + ": IFD 0 has SubfileType " + subfileType + + ", which marks it as a reduced-resolution overview or mask"); + } + continue; + } + + if (image.samplesPerPixel() < 2) { + if (ifd == 0) { + throw new IOException("GeoTIFF grid " + gridName + + " is not a horizontal shift grid: IFD 0 has " + + image.samplesPerPixel() + + " sample(s) per pixel and a horizontal grid needs at least 2 " + + "(latitude and longitude offsets)"); + } + continue; + } + + boolean foundAnyDescription = false; + boolean foundLat = false; + boolean foundLong = false; + for (int i = 0; i < image.samplesPerPixel(); i++) { + String desc = image.metadataItem("DESCRIPTION", i); + if (!desc.isEmpty()) { + foundAnyDescription = true; + } + if ("latitude_offset".equals(desc)) { + idxLatShift = i; + foundLat = true; + } else if ("longitude_offset".equals(desc)) { + idxLongShift = i; + foundLong = true; + } + } + + if (foundAnyDescription && !foundLong && !foundLat) { + if (ifd > 0) { + // Upstream: an extra IFD without our channels of interest -- e.g. accuracy + // bands -- is simply skipped. tests/test_hgrid_extra_ifd_with_other_info.tif. + continue; + } + throw new IOException("GeoTIFF grid " + gridName + ": IFD 0 has band descriptions " + + "but none of them is latitude_offset or longitude_offset"); + } + if (foundLat && !foundLong) { + throw new IOException("GeoTIFF grid " + gridName + + " declares a latitude_offset band but no longitude_offset band"); + } + if (foundLong && !foundLat) { + throw new IOException("GeoTIFF grid " + gridName + + " declares a longitude_offset band but no latitude_offset band"); + } + if (idxLatShift >= image.samplesPerPixel() || idxLongShift >= image.samplesPerPixel()) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifd + + ": band index out of range (latitude " + idxLatShift + ", longitude " + + idxLongShift + ", but only " + image.samplesPerPixel() + " bands)"); + } + + if (foundLong) { + String positiveValue = image.metadataItem("positive_value", idxLongShift); + if (!positiveValue.isEmpty()) { + if ("west".equals(positiveValue)) { + positiveEast = false; + } else if ("east".equals(positiveValue)) { + positiveEast = true; + } else { + throw new IOException("GeoTIFF grid " + gridName + + " declares positive_value=\"" + positiveValue + + "\" for its longitude offset band; only \"east\" and \"west\" " + + "are defined"); + } + } + } + + String unitLat = image.metadataItem("UNITTYPE", idxLatShift); + String unitLong = image.metadataItem("UNITTYPE", idxLongShift); + if (!unitLat.equals(unitLong)) { + throw new IOException("GeoTIFF grid " + gridName + + " declares different units for its latitude (\"" + unitLat + + "\") and longitude (\"" + unitLong + "\") offset bands"); + } + if (!unitLat.isEmpty()) { + if ("arc-second".equals(unitLat) || "arc-seconds per year".equals(unitLat)) { + convFactorToRadian = ARC_SECOND_TO_RADIAN; + } else if ("radian".equals(unitLat)) { + convFactorToRadian = 1.0; + } else if ("degree".equals(unitLat)) { + convFactorToRadian = DEGREE_TO_RADIAN; + } else { + throw new IOException("GeoTIFF grid " + gridName + " declares UNITTYPE=\"" + + unitLat + "\" for its offset bands; proj4j and PROJ understand only " + + "\"arc-second\", \"arc-seconds per year\", \"radian\" and \"degree\""); + } + } + + requireGeographic(image, gridName, ifd); + + Grid sub = buildHorizontalGrid(image, gridName, origin, resolverName, ifd, + images.size(), idxLatShift, idxLongShift, convFactorToRadian, positiveEast); + + insertIntoHierarchy(sub, image.metadataItem("grid_name"), + image.metadataItem("parent_grid_name"), image.metadataItem("TYPE"), + roots, byName, types); + } + + if (roots.isEmpty()) { + throw new IOException("GeoTIFF grid " + gridName + + " contains no usable horizontal shift image"); + } + attach(target, roots, "GeoTIFF horizontal shift grid"); + } + + private static Grid buildHorizontalGrid(GeoTiffImage image, String gridName, String origin, + String resolverName, int ifd, int ifdCount, + int idxLatShift, int idxLongShift, double conv, + boolean positiveEast) throws IOException { + int width = image.width(); + int height = image.height(); + float[][] planes = image.readSamples(new int[]{idxLatShift, idxLongShift}); + float[] lat = planes[0]; + float[] lon = planes[1]; + + FloatPolarCoordinate[] cvs = new FloatPolarCoordinate[width * height]; + for (int i = 0; i < cvs.length; i++) { + // GTiffHGrid::valueAt, then proj4j's opposite longitude sign. Both multiplications are + // done in double and narrowed once, exactly as upstream's + // `latShift = static_cast(latShift * m_convFactorToRadian)`. + float latShift = (float) (lat[i] * conv); + float longShift = (float) (lon[i] * conv); + if (!positiveEast) { + longShift = -longShift; + } + cvs[i] = new FloatPolarCoordinate(-longShift, latShift); + } + + Grid.ConversionTable table = new Grid.ConversionTable(); + String subName = image.metadataItem("grid_name"); + table.id = subName.isEmpty() + ? "GeoTIFF horizontal shift grid (IFD " + ifd + ")" + : "GeoTIFF horizontal shift grid: " + subName; + table.ll = new PolarCoordinate(image.west(), image.south()); + table.del = new PolarCoordinate(image.resX(), image.resY()); + table.lim = new IntPolarCoordinate(width, height); + table.cvs = cvs; + + Grid sub = new Grid(); + sub.table = table; + String label = gridName; + if (ifdCount > 1) { + label = gridName + " (index " + (ifd + 1) + ")"; + } + if (!subName.isEmpty()) { + label = label + "#" + subName; + } + sub.describeAs(label, "gtiff", origin, resolverName); + return sub; + } + + // ========================================================================================= + // Vertical + // ========================================================================================= + + /** The four band descriptions {@code GTiffVGridShiftSet::open} recognises, in upstream's order. */ + private static final String[] VERTICAL_DESCRIPTIONS = { + "geoid_undulation", "vertical_offset", "hydroid_height", "ellipsoidal_height_offset"}; + + /** + * One node of the vertical subgrid hierarchy, in the form {@link VerticalGrid} needs to build + * itself. A plain carrier: no behaviour, deeply immutable, package-private. + */ + static final class VerticalLayer { + final String name; + final int width; + final int height; + /** Radians. */ + final double west; + final double south; + final double resX; + final double resY; + /** Row-major, south row first, west to east. */ + final float[] values; + final boolean hasNodata; + final float noData; + final List children; + + VerticalLayer(String name, int width, int height, double west, double south, double resX, + double resY, float[] values, boolean hasNodata, float noData) { + this.name = name; + this.width = width; + this.height = height; + this.west = west; + this.south = south; + this.resX = resX; + this.resY = resY; + this.values = values; + this.hasNodata = hasNodata; + this.noData = noData; + this.children = new ArrayList(); + } + + double east() { + return west + resX * (width - 1); + } + + double north() { + return south + resY * (height - 1); + } + + /** Inclusive on all four sides, so a layer contains itself; see {@code contains(Grid, + * Grid)} for why the identity guard is the load-bearing half. */ + boolean contains(VerticalLayer other) { + if (other == this) { + return false; + } + return other.west >= west && other.east() <= east() + && other.south >= south && other.north() <= north(); + } + + /** Deepest-first insertion, mirroring {@code GTiffVGrid::insertGrid}. */ + void insert(VerticalLayer sub) { + for (int i = 0; i < children.size(); i++) { + if (children.get(i).contains(sub)) { + children.get(i).insert(sub); + return; + } + } + children.add(sub); + } + } + + /** + * Reads a vertical shift GeoTIFF and returns its top-level layers, each carrying its own subgrid + * children. + * + * @param gridName the name the grid was requested under + * @param bytes the whole file + * @return one or more top-level layers, in IFD order + * @throws IOException if the file is not a usable vertical shift grid + */ + static List readVerticalLayers(String gridName, byte[] bytes) throws IOException { + GeoTiffDataset dataset = GeoTiffDataset.open(bytes, gridName); + List images = dataset.images(); + + // Declared outside the loop, as upstream declares it. + int idxSample = 0; + + List roots = new ArrayList(); + Map byName = new HashMap(); + Map types = new IdentityHashMap(); + + for (int ifd = 0; ifd < images.size(); ifd++) { + GeoTiffImage image = images.get(ifd); + + long subfileType = image.subfileType(); + if (subfileType != 0 && subfileType != FILETYPE_PAGE) { + if (ifd == 0) { + throw new IOException("GeoTIFF vertical grid " + gridName + + ": IFD 0 has SubfileType " + subfileType + + ", which marks it as a reduced-resolution overview or mask"); + } + continue; + } + + boolean foundAnyDescription = false; + boolean foundShift = false; + for (int i = 0; i < image.samplesPerPixel(); i++) { + String desc = image.metadataItem("DESCRIPTION", i); + if (!desc.isEmpty()) { + foundAnyDescription = true; + } + for (int k = 0; k < VERTICAL_DESCRIPTIONS.length; k++) { + if (VERTICAL_DESCRIPTIONS[k].equals(desc)) { + idxSample = i; + foundShift = true; + } + } + } + if (foundAnyDescription && !foundShift) { + if (ifd > 0) { + continue; + } + throw new IOException("GeoTIFF vertical grid " + gridName + ": IFD 0 has band " + + "descriptions, but none of them is geoid_undulation, vertical_offset, " + + "hydroid_height or ellipsoidal_height_offset"); + } + if (idxSample >= image.samplesPerPixel()) { + throw new IOException("GeoTIFF vertical grid " + gridName + " IFD " + ifd + + ": band index " + idxSample + " but only " + image.samplesPerPixel() + + " bands"); + } + + requireGeographic(image, gridName, ifd); + + String subName = image.metadataItem("grid_name"); + VerticalLayer layer = new VerticalLayer( + subName.isEmpty() ? gridName + " (index " + (ifd + 1) + ")" + : gridName + "#" + subName, + image.width(), image.height(), image.west(), image.south(), + image.resX(), image.resY(), image.readSample(idxSample), + image.hasNodata(), image.noDataValue()); + + insertVertical(layer, subName, image.metadataItem("parent_grid_name"), + image.metadataItem("TYPE"), roots, byName, types); + } + + if (roots.isEmpty()) { + throw new IOException("GeoTIFF vertical grid " + gridName + + " contains no usable vertical shift image"); + } + return Collections.unmodifiableList(roots); + } + + // ========================================================================================= + // Shared: hierarchy assembly, a port of insertIntoHierarchy (grids.cpp:1380-1440) + // ========================================================================================= + + private static void insertIntoHierarchy(Grid grid, String gridName, String parentName, + String type, List roots, Map byName, + Map types) { + types.put(grid, type); + // LOOK THE PARENT UP BEFORE REGISTERING THIS GRID UNDER ITS OWN NAME. The two statements + // used to be the other way round, and that ordering -- not any check -- was the only thing + // standing between this reader and a self-referential grid. An IFD whose + // `parent_grid_name` equals its own `grid_name` registered itself, found itself as its own + // parent, passed contains() (which uses >= / <=, so every extent contains itself), and + // reached appendChild(grid, grid), i.e. grid.child == grid. Grid.shift's subgrid descent + // (`while (grid.child != null) ... grid = child;`) would then spin forever, on the + // per-row path, on an untrusted file. + // + // It was unreachable, but by an ACCIDENT OF CONTROL FLOW rather than by a guard: the + // appendChild branch returns before roots.add, so the cycle was built and then dropped on + // the floor, and any refactor that moved the registration or added a `roots.add` after it + // would have made it live. NTV2.java is safe for exactly the reason this now is -- it + // resolves `byName.get(parentName)` before `byName.put(subName, subGrid)`. Same ordering + // here, plus the identity guard in contains(), so it takes two independent regressions + // rather than one to reintroduce the cycle. GeoTiffSelfCycleTest pins both. + Grid parent = parentName.isEmpty() ? null : byName.get(parentName); + if (!gridName.isEmpty()) { + byName.put(gridName, grid); + } + if (!parentName.isEmpty()) { + if (parent != null && contains(parent, grid)) { + appendChild(parent, grid); + return; + } + // Upstream logs "refers to non-existing parent" / "extent is not included in it" and + // falls through to the bounding-box method. Deliberately not an error: the declared + // hierarchy is advisory and the extents are authoritative. + } else if (!gridName.isEmpty()) { + roots.add(grid); + return; + } + for (int i = 0; i < roots.size(); i++) { + Grid candidate = roots.get(i); + String candidateType = types.get(candidate); + if (!type.isEmpty() && !type.equals(candidateType == null ? "" : candidateType)) { + continue; + } + if (contains(candidate, grid)) { + insertGrid(candidate, grid); + return; + } + } + roots.add(grid); + } + + private static void insertVertical(VerticalLayer layer, String gridName, String parentName, + String type, List roots, + Map byName, + Map types) { + types.put(layer, type); + // Same inversion, same fix, same reason as insertIntoHierarchy above -- a self-parenting + // IFD used to reach `layer.children.add(layer)`. The vertical path walks its children + // recursively in VerticalGrid rather than in Grid.shift, so the consequence is a + // StackOverflowError rather than a hang, which is a different Error and the same defect. + VerticalLayer parent = parentName.isEmpty() ? null : byName.get(parentName); + if (!gridName.isEmpty()) { + byName.put(gridName, layer); + } + if (!parentName.isEmpty()) { + if (parent != null && parent.contains(layer)) { + parent.children.add(layer); + return; + } + } else if (!gridName.isEmpty()) { + roots.add(layer); + return; + } + for (int i = 0; i < roots.size(); i++) { + VerticalLayer candidate = roots.get(i); + String candidateType = types.get(candidate); + if (!type.isEmpty() && !type.equals(candidateType == null ? "" : candidateType)) { + continue; + } + if (candidate.contains(layer)) { + candidate.insert(layer); + return; + } + } + roots.add(layer); + } + + /** + * Upstream's containment test: inclusive on all four sides, so — deliberately — a grid + * contains another grid with exactly its own extent. That is correct for the overlapping-IFD + * case it exists for, and it is also why {@code contains(g, g)} is {@code true} for every + * grid. The identity guard is therefore not redundant with the inclusive comparisons; it is + * what stops "always contains itself" from becoming "is its own parent". The extent + * comparisons themselves are untouched, so no legitimate pairing changes. + */ + // Package-private, not private, so GeoTiffSelfCycleTest can assert the identity guard directly + // rather than only through its consequences. The cycle it prevents is unreachable from the + // returned roots, so a test driving the reader can only observe the *other* half of the fix. + static boolean contains(Grid parent, Grid child) { + if (parent == child) { + return false; + } + double[] p = parent.extentRadians(); + double[] c = child.extentRadians(); + return c[0] >= p[0] && c[2] <= p[2] && c[1] >= p[1] && c[3] <= p[3]; + } + + /** {@code GTiffHGrid::insertGrid}: descend to the deepest child that contains the newcomer. */ + private static void insertGrid(Grid parent, Grid grid) { + for (Grid c = parent.getChild(); c != null; c = c.getNext()) { + if (contains(c, grid)) { + insertGrid(c, grid); + return; + } + } + appendChild(parent, grid); + } + + private static void appendChild(Grid parent, Grid child) { + Grid existing = parent.getChild(); + if (existing == null) { + parent.setChild(child); + return; + } + while (existing.getNext() != null) { + existing = existing.getNext(); + } + existing.setNext(child); + } + + /** + * Wires the roots onto {@code target}. A single childless root becomes {@code target}'s own table, + * exactly as {@link NTV2} does for a one-subgrid file; anything else gets a synthetic + * bounding-box table with {@code cvs == null}, which {@code Grid.shift} treats as + * "descend or move on". + */ + private static void attach(Grid target, List roots, String label) { + if (roots.size() == 1 && roots.get(0).getChild() == null) { + target.table = roots.get(0).table; + target.setChild(null); + return; + } + target.table = boundingTable(roots, label); + Grid previous = null; + for (int i = 0; i < roots.size(); i++) { + Grid root = roots.get(i); + if (previous == null) { + target.setChild(root); + } else { + previous.setNext(root); + } + previous = root; + } + } + + /** + * A table spanning every root, with a {@code null} node array. Only the extent and the cell size + * are meaningful, and the cell size is the finest of the roots so the derived {@code lim} never + * under-covers the union. Same shape as {@code NTV2.boundingTable}. + */ + private static Grid.ConversionTable boundingTable(List roots, String label) { + double west = Double.POSITIVE_INFINITY; + double south = Double.POSITIVE_INFINITY; + double east = Double.NEGATIVE_INFINITY; + double north = Double.NEGATIVE_INFINITY; + double delLam = Double.POSITIVE_INFINITY; + double delPhi = Double.POSITIVE_INFINITY; + for (int i = 0; i < roots.size(); i++) { + Grid root = roots.get(i); + double[] e = root.extentRadians(); + west = Math.min(west, e[0]); + south = Math.min(south, e[1]); + east = Math.max(east, e[2]); + north = Math.max(north, e[3]); + delLam = Math.min(delLam, Math.abs(root.table.del.lam)); + delPhi = Math.min(delPhi, Math.abs(root.table.del.phi)); + } + Grid.ConversionTable bounds = new Grid.ConversionTable(); + bounds.id = label + " (bounding box of " + roots.size() + " root subgrids)"; + bounds.ll = new PolarCoordinate(west, south); + bounds.del = new PolarCoordinate(delLam, delPhi); + bounds.lim = new IntPolarCoordinate( + (int) Math.ceil((east - west) / delLam) + 1, + (int) Math.ceil((north - south) / delPhi) + 1); + bounds.cvs = null; + return bounds; + } + + /** + * proj4j's grid machinery is geographic throughout: {@code ConversionTable} is in radians of + * longitude and latitude and {@code VerticalGrid} wraps at 2π. PROJ constructs a projected grid + * happily and then refuses it at use time — {@code pj_hgrid_value} and + * {@code pj_bilinear_interpolation_three_samples} both say "Can only handle grids referenced + * in a geographic CRS". Refusing at parse time reaches the same outcome one step earlier and + * with the file name in the message. + */ + private static void requireGeographic(GeoTiffImage image, String gridName, int ifd) + throws IOException { + if (!image.isGeographic()) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifd + + " declares GTModelTypeGeoKey=ModelTypeProjected; proj4j, like PROJ, can only " + + "apply grids referenced in a geographic CRS"); + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/GeocentricConverter.java b/core/src/main/java/org/locationtech/proj4j/datum/GeocentricConverter.java index cdafcc5..3249cff 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/GeocentricConverter.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/GeocentricConverter.java @@ -15,6 +15,9 @@ */ package org.locationtech.proj4j.datum; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.util.ProjectionMath; @@ -29,6 +32,9 @@ * @author Martin Davis */ public class GeocentricConverter implements java.io.Serializable { + + private static final long serialVersionUID = -7800493495528008240L; + /* * * REFERENCES @@ -73,9 +79,65 @@ public GeocentricConverter(double a, double b, double e2) { ep2 = (a2 - b2) / b2; } + /** + * Re-points this converter at the WGS 84 ellipsoid, for the side of a datum transform that sits + * against a horizontal grid shift. + * + *

What this is for, because it reads like a relic and is not

+ * + *

The output of a horizontal grid shift is WGS 84 geodetic latitude and longitude by + * construction. An NTv2, NADCON or CTABLE grid is defined as the correction from the local + * datum's lon/lat to WGS 84's; it says nothing about, and does nothing to, the ellipsoid. So + * once {@link Datum#shift} has run on the source the coordinate is on WGS 84 whatever the + * source datum's own ellipsoid was, and symmetrically the target's + * {@link Datum#inverseShift} expects to be handed WGS 84. The geocentric leg between them must + * therefore run on WGS 84 on that side, not on the datum's declared ellipsoid. + * + *

Ported from {@code 5.2.0:src/pj_transform.c:874-889}, which assigns + * {@code src_a}/{@code src_es} after applying the source shift and + * {@code dst_a}/{@code dst_es} before the destination's inverse shift: + *

+     * if( src->datum_type == PJD_GRIDSHIFT ) {
+     *     pj_apply_gridshift_2( src, 0, point_count, point_offset, x, y, z );
+     *     src_a  = SRS_WGS84_SEMIMAJOR;
+     *     src_es = SRS_WGS84_ESQUARED;
+     * }
+     * if( dst->datum_type == PJD_GRIDSHIFT ) {
+     *     dst_a  = SRS_WGS84_SEMIMAJOR;
+     *     dst_es = SRS_WGS84_ESQUARED;
+     * }
+     * 
+ * + *

It is not superseded at 9.8.1. The pipeline upstream builds for a + * {@code +nadgrids=} CRS into a {@code +towgs84} one is + * {@code hgridshift} → {@code +proj=cart +ellps=WGS84} → {@code helmert} → + * {@code +inv +proj=cart +ellps=}: the gridded datum's own ellipsoid never + * appears on its side of the {@code cart} pair. Same invariant, expressed in the pipeline layer + * instead of in {@code pj_datum_transform}. + * + *

Nor does {@code +nadgrids=@null} exempt anything. {@code 9.8.1:src/grids.cpp:2661} + * short-circuits {@code HorizontalShiftGridSet::open} on {@code filename == "null"} to a + * synthetic global {@code NullHorizontalShiftGrid} returning {@code (0.0f, 0.0f)} — a grid + * that shifts by zero, not a suppression of the datum change. {@code EPSG:3857} is + * {@code +nadgrids=@null} on an {@code a=b=6378137} sphere, so this method is what keeps + * {@code EPSG:4326 -> EPSG:3857} from round-tripping WGS 84 latitudes through a sphere: + * disabling it costs 25,380 m of northing there, and 305 m to 30 km on ten other + * measured pairs. Pinned, with its {@code cs2cs} 9.8.1 references, by + * {@code datum/NadgridsWgs84OverrideTest}. + * + *

All six derived fields are recomputed, not just {@code a} and {@code e2}. Only those two + * are read by either conversion below, so this is a behavioural no-op — but leaving {@code b}, + * {@code a2}, {@code b2} and {@code ep2} describing the previous ellipsoid left an + * internally inconsistent object one dereference away from being wrong, and that was already + * on the defect register. + */ public void overrideWithWGS84Params() { this.a = Ellipsoid.WGS84.getA(); this.e2 = Ellipsoid.WGS84.getEccentricitySquared(); + this.b = Ellipsoid.WGS84.getB(); + this.a2 = this.a * this.a; + this.b2 = this.b * this.b; + this.ep2 = (this.a2 - this.b2) / this.b2; } public boolean isEqual(GeocentricConverter gc) { @@ -121,7 +183,14 @@ public void convertGeodeticToGeocentric(ProjCoordinate p) { Latitude = ProjectionMath.HALFPI; } else if ((Latitude < -ProjectionMath.HALFPI) || (Latitude > ProjectionMath.HALFPI)) { /* Latitude out of range */ - throw new IllegalStateException("Latitude is out of range: " + Latitude); + // Was IllegalStateException, which is unchecked and NOT a Proj4jException -- so it + // escaped every `catch (Proj4jException)` in the library and in every caller. The + // golden-master sweep found 23 ordinary CRS pairs reaching this line, so it is not a + // degenerate-input-only path. + throw new CrsTransformException(ErrorCause.INVALID_COORDINATE, + "geodetic latitude " + Latitude + " rad (" + (Latitude * ProjectionMath.RTD) + + " deg) is outside +/-90 deg by more than the 0.1% rounding " + + "allowance, so it cannot be converted to geocentric coordinates"); } if (Longitude > ProjectionMath.PI) Longitude -= (2 * ProjectionMath.PI); @@ -161,7 +230,6 @@ public void convertGeocentricToGeodeticIter(ProjCoordinate p) { double CPHI; /* cos of searched geodetic latitude */ double SPHI; /* sin of searched geodetic latitude */ double SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ - boolean At_Pole; /* indicates location is in polar region */ int iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ double X = p.x; @@ -171,33 +239,59 @@ public void convertGeocentricToGeodeticIter(ProjCoordinate p) { double Latitude; double Height; - At_Pole = false; P = Math.sqrt(X * X + Y * Y); RR = Math.sqrt(X * X + Y * Y + Z * Z); - /* special cases for latitude and longitude */ - if (P / this.a < genau) { - - /* special case, if P=0. (X=0., Y=0.) */ - At_Pole = true; - Longitude = 0.0; - - /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis - * of ellipsoid (=center of mass), Latitude becomes PI/2 */ - if (RR / this.a < genau) { - Latitude = ProjectionMath.HALFPI; - Height = -this.b; - p.x = Longitude; - p.y = Latitude; - p.z = Height; - return; - } - } else { - /* ellipsoidal (geodetic) longitude - * interval: -PI < Longitude <= +PI */ - Longitude = Math.atan2(Y, X); + // The centre of mass, and only the centre of mass. Below, CT = Z / RR and ST = P / RR, + // so RR == 0 is exactly the condition under which this algorithm divides zero by zero + // and can compute nothing at all; it is not a tolerance. + // + // 1.4.3 answered the centre of mass with Longitude = 0, Latitude = +90 deg, + // Height = -b. That is a fully formed fiction: three finite, in-range, entirely + // plausible ordinates for a point that has no geodetic latitude or longitude at + // all -- every meridian and every parallel passes through it. A caller cannot + // tell it from a real polar coordinate at depth b. Upstream keeps the fiction + // (9.8.1:src/conversions/cart.cpp reaches x_phi <= 0 and clamps to +90 deg; the row + // `accept 0 0 0 / expect 0 90 -6356752.314140356` in more_builtins.gie pins it), so this + // is a knowing divergence: the no-sentinels rule outranks parity on one degenerate row. + // + // The guard used to be `RR / a < genau`, i.e. any point within 6.4 micrometres of the + // centre, which rejected (0, 0, +/-1e-6) -- a point whose latitude (+/-90 deg) and + // height (1e-6 - b) are both perfectly well determined -- and rejected it with a message + // that called it "the centre of mass", which it is not. Upstream's expected values are + // pinned in more_builtins.gie as `accept 0 0 1e-6 / expect 0 90 -6356752.314139356` and + // `accept 0 0 -1e-6 / expect 0 -90 -6356752.314139356`. Those two rows are on + // `+proj=cart`, which Registry does not map yet, so today they are a reference for the + // right answer rather than rows this change turns green; they become live when `cart` is + // registered. The path IS reachable today through `+proj=geocent`, which is registered + // and whose inverse goes through this method: measured, `+proj=geocent +ellps=GRS80` + // inverse of (0, 0, 1e-6) went from an exception to (0 deg, 90 deg, -6356752.31) here. + if (RR == 0.0) { + throw new CrsTransformException(ErrorCause.INVALID_COORDINATE, + "geocentric (0, 0, 0) is the centre of mass of the ellipsoid and has no " + + "geodetic latitude or longitude: every meridian and every parallel " + + "passes through it, so there is no coordinate to return"); } + /* ellipsoidal (geodetic) longitude + * interval: -PI < Longitude <= +PI + * + * Unconditional, exactly as 9.8.1:src/conversions/cart.cpp:224 does it. There used to be a + * special case here -- `if (P / a < genau) { Longitude = 0.0; }`, guarded on P being within + * 6.4 micrometres of the Z axis -- and it was a fabricated meridian. Measured on + * Clarke 1866: the round trip of (lon = 17 deg, lat = 90 deg, h = 0) came back as + * (lon = 0 deg, lat = 90 deg, h = 0), and (X, Y, Z) = (1e-9, 2e-9, b), whose longitude is + * 63.43 deg, came back as 0 deg. Latitude and height were right in both; only the longitude + * was invented, and it was invented as Greenwich -- a specific, entirely plausible meridian + * that no finiteness or range check can distinguish from a real answer. + * + * atan2 needs no special case. It is well defined for every (X, Y) this line can now see, + * and for a point bit-exactly on the axis IEEE 754 gives atan2(+/-0, +0) = +/-0 -- the + * conventional pole longitude, and the value more_builtins.gie pins for + * `accept 0 0 6356752.314140347 / expect 0 90 0`. (0, 0, 0), where atan2 would have had to + * choose arbitrarily, has already been refused above. */ + Longitude = Math.atan2(Y, X); + /* -------------------------------------------------------------- * Following iterative algorithm was developped by * "Institut fur Erdmessung", University of Hannover, July 1988. @@ -233,6 +327,19 @@ public void convertGeocentricToGeodeticIter(ProjCoordinate p) { } while (SDPHI * SDPHI > genau2 && iter < maxiter); + // The loop has two exits and 1.4.3 treated them identically: converged, and "ran out of + // iterations". Only the first one licenses the latitude below. The Hannover algorithm's + // own comment says "max. 30 is always enough", and for a well-formed ellipsoid it is -- + // which is exactly why reaching 30 means the inputs are not well formed, and why + // continuing to compute a latitude from them produces a plausible wrong answer. + if (SDPHI * SDPHI > genau2) { + throw new ConvergenceFailureException( + "geocentric to geodetic did not converge for (" + X + ", " + Y + ", " + Z + + "): |sin(dphi)| = " + Math.abs(SDPHI) + " still exceeds " + genau + + " after " + maxiter + " iterations on a = " + this.a + ", e2 = " + + this.e2); + } + /* ellipsoidal (geodetic) latitude */ Latitude = Math.atan(SPHI / Math.abs(CPHI)); diff --git a/core/src/main/java/org/locationtech/proj4j/datum/Grid.java b/core/src/main/java/org/locationtech/proj4j/datum/Grid.java index 6984a12..0310a95 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/Grid.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/Grid.java @@ -15,18 +15,26 @@ */ package org.locationtech.proj4j.datum; -import java.io.File; import java.io.DataInputStream; -import java.io.FileInputStream; -import java.io.InputStream; import java.io.IOException; import java.io.Serializable; -import java.io.BufferedInputStream; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.tiff.GeoTiffDataset; +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceNames; +import org.locationtech.proj4j.resource.ResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; +import org.locationtech.proj4j.resource.Resources; import org.locationtech.proj4j.util.FloatPolarCoordinate; import org.locationtech.proj4j.util.IntPolarCoordinate; import org.locationtech.proj4j.util.PolarCoordinate; @@ -35,11 +43,58 @@ /** * A Grid represents a geodetic datum defining some mapping between a * coordinate system referenced to the surface of the earth and spherical - * coordinates. Generally Grids are loaded from definition files in the proj4 - * resource directory. + * coordinates. Generally Grids are loaded from definition files resolved + * through {@link ResourceResolvers}. + * + *

Resolution

+ *

Grid files are located by the single deterministic chain described on + * {@link ResourceResolvers}. The process working directory is never consulted. In + * 1.4.3 it was consulted first, which made the answer depend on whatever a cluster framework + * had staged into a shared container work dir, and turned an untrusted per-row {@code +nadgrids=} + * token into an arbitrary-file-open primitive. + * + *

Caching

+ *

Parsed grids are shared through {@link GridCache}. A {@code Grid} is therefore + * deeply immutable after construction and safe to share between threads; nothing in + * this class mutates a loaded grid, and {@link #shift} keeps all per-call state in locals. */ // Grid corresponds to the PJ_GRIDINFO struct in proj.4 -public final class Grid implements Serializable { +public final class Grid implements Serializable, GridCache.Sized { + + private static final long serialVersionUID = 1L; + + /** Accounting cost of one grid node, for the byte-bounded {@link GridCache}: a + * {@link FloatPolarCoordinate} is a 16-byte object (12-byte header + 2 floats, padded) plus a + * 4-byte compressed reference in the backing array, plus slack. Deliberately an over-estimate; + * a cache budget that under-counts is not a budget. */ + private static final long BYTES_PER_NODE = 32L; + + /** + * Largest number of comma-separated tokens a {@code +nadgrids=} or {@code +geoidgrids=} list may + * carry. + * + *

Every token is a full pass down the resolver chain, and the token list comes out of a CRS + * string that this library's threat model treats as per-row untrusted input. Uncapped, one + * pathological definition is an arbitrary multiplier on CRS-construction cost. + * + *

32 is chosen against a measurement, not a guess. The longest list anywhere in PROJ 9.8.1 + * ({@code git grep} over the tag, all of {@code src/}, {@code data/} and {@code test/}) is + * 6 tokens, and the longest in this repository is the same 6 + * ({@code geoidgrids=g2012a_conus.gtx,…,g2012a_samoa.gtx}); the longest {@code +nadgrids=} in + * either is 4, the NAD27 list. So the cap sits at more than five times the largest real list and + * cannot be the binding constraint on a legitimate definition. + */ + public static final int MAX_GRID_TOKENS = 32; + + /** Hard ceiling on a single grid file, so a mistaken or hostile {@code +nadgrids=} cannot be + * turned into an OOM. Settable with {@code -Dproj4j.grids.maxFileBytes}, and read through + * {@link GridExtents#maxFileBytes()} so that the ceiling the resolver applies to the file and + * the ceiling the readers apply to a declared extent are the same number by construction — + * they were separate literals, and {@link VerticalGrid} carried a third, four times larger. */ + private static long maxGridFileBytes() { + return GridExtents.maxFileBytes(); + } + /** * Identifying name for this Grid. eg "conus" or ntv2_0.gsb */ @@ -51,10 +106,16 @@ public final class Grid implements Serializable { private String fileName; /** - * File format of the grid definition file, ie "ctable", "ntv1", "ntv2" or "missing" + * File format of the grid definition file, ie "ctable2", "ntv1", "ntv2", "gtiff" or "missing" */ private String format; + /** Name of the {@link ResourceResolver} that produced the bytes. Provenance, not identity. */ + private transient String resolverName; + + /** Accounted heap cost of the parsed node data, including subgrids. */ + private transient long sizeBytes; + private int gridOffset; // Offset in file of the grid definition, for delayed loading final static int MAX_TRY = 9; // maximum number of iterations for nad conversion algorithm @@ -65,6 +126,34 @@ public final class Grid implements Serializable { private Grid next; private Grid child; + /** + * PROJ's {@code isNullGrid()}. Only {@code +nadgrids=null} (or {@code @null}) produces one, and + * it is not a grid that happens to be empty: upstream's + * {@code HorizontalShiftGridSet::gridAt} ({@code 9.8.1:src/grids.cpp:2775-2779}) returns it for + * every point without consulting an extent at all, and {@code pj_hgrid_apply} + * ({@code :3522-3524}) then returns the input unchanged. So a null grid anywhere in the list + * makes the whole list total, and no point can be outside it. + */ + private boolean nullGrid; + + /** + * Splits a {@code +nadgrids=} / {@code +geoidgrids=} list and refuses one that is too long. + * + *

Shared with {@link VerticalGrid} so the two lists cannot acquire different limits. + * + * @throws IOException if the list carries more than {@link #MAX_GRID_TOKENS} tokens + */ + static String[] splitTokens(String parameter, String spec) throws IOException { + String[] tokens = spec.split(","); + if (tokens.length > MAX_GRID_TOKENS) { + throw new IOException("+" + parameter + "= names " + tokens.length + + " grids, which exceeds the limit of " + MAX_GRID_TOKENS + + ". Every token is a full pass down the resolver chain, and the longest list in" + + " PROJ 9.8.1 or in this repository is 6."); + } + return tokens; + } + /** * Merge (append) a named grid into the given gridlist. */ @@ -73,76 +162,611 @@ public static void mergeGridFile( String name, List gridList) throws IOException { - gridList.add(gridinfoInit(name)); - // TODO: Maintain cache of loaded grids so we never need more than one - // copy of the same grid file loaded in memory + gridList.add(resolveAndLoad(name)); + } + + /** + * Locates {@code name} through the resolver chain and returns the parsed grid, loading it at most + * once per (resolver, name) pair for the life of the JVM. + */ + static Grid resolveAndLoad(String name) throws IOException { + if (name == null || name.isEmpty()) { + throw new IOException("Empty grid name"); + } + // PROJ's own special case: "null" is a valid grid that shifts nothing. + if (name.equals("null")) { + return nullGrid(); + } + // Refused here, before the chain, not only inside each resolver. Every resolver applies + // ResourceNames itself, so this changes no answer -- what it changes is the cost and the + // retention: a name that cannot resolve under any resolver should not walk the chain and + // should not earn an entry in the resolution memo. See ResourceNames for the rule. + ResourceNames.Rule violation = ResourceNames.violation(name); + if (violation != null) { + throw new IOException("Refusing grid name \"" + name + "\": " + violation.description() + + " (" + violation + ")"); + } + ChainedResourceResolver chain = ResourceResolvers.resolver(); + final ResourceHandle handle = chain.resolve(name); + if (handle == null) { + throw new IOException("Unknown grid: " + name + ". Resolution chain was " + chain.name() + + "; the working directory is deliberately not searched."); + } + ResourceResolver owner = chain.resolverOf(name); + String resolverName = owner == null ? "unknown" : owner.name(); + final String requested = name; + final String origin = handle.origin(); + final String resolver = resolverName; + return GridCache.instance().get(resolverName, name, new GridCache.Loader() { + @Override + public Grid load() throws IOException { + return parse(requested, origin, resolver, + Resources.readAll(handle, maxGridFileBytes())); + } + }); + } + + private static Grid nullGrid() { + Grid grid = new Grid(); + grid.gridName = "null"; + grid.format = "missing"; + grid.fileName = "builtin:null"; + grid.resolverName = "builtin"; + grid.gridOffset = 0; + grid.sizeBytes = 0L; + grid.nullGrid = true; + return grid; + } + + /** + * Whether this is PROJ's built-in {@code null} grid — the one that covers the whole world and + * shifts nothing. See {@link #nullGrid}. + * + * @return true only for the grid produced by {@code +nadgrids=null} + */ + public boolean isNullGrid() { + return nullGrid; + } + + /** + * Sniffs the format and parses. The dispatch order and the header tests are those of PROJ 9.8.1 + * {@code HorizontalShiftGridSet::open} ({@code src/grids.cpp}). + * + *

An unrecognised file is an error. 1.4.3 returned a grid with + * {@code format = "missing"} and {@code table == null}, which {@link #shift} then skipped — so + * {@code +nadgrids=/etc/shadow} read the file, silently produced a no-op grid, and reported a + * successful transform. That is a failure expressed as a plausible coordinate. + */ + private static Grid parse(String gridName, String origin, String resolverName, byte[] bytes) + throws IOException { + Grid grid = new Grid(); + grid.gridName = gridName; + grid.fileName = origin; + grid.resolverName = resolverName; + grid.format = "missing"; + grid.gridOffset = 0; + + byte[] header = new byte[160]; + int headerLength = Math.min(header.length, bytes.length); + System.arraycopy(bytes, 0, header, 0, headerLength); + + if (NTV1.testHeader(header) && headerLength == header.length) { + grid.format = "ntv1"; + DataInputStream in = Resources.asDataStream(bytes); + grid.table = NTV1.init(in); + NTV1.load(Resources.asDataStream(bytes), grid); + } else if (CTABLEV2.testHeader(header)) { + grid.format = "ctable2"; + grid.table = CTABLEV2.init(Resources.asDataStream(bytes)); + CTABLEV2.load(Resources.asDataStream(bytes), grid); + } else if (NTV2.testHeader(header)) { + grid.format = "ntv2"; + NTV2.loadAll(bytes, grid); + } else if (isTiff(header, headerLength)) { + grid.format = "gtiff"; + GeoTiffGrid.loadHorizontal(gridName, origin, resolverName, bytes, grid); + } else { + throw new IOException("Unrecognised horizontal grid format for grid " + gridName + + " at " + origin); + } + grid.sizeBytes = grid.computeSizeBytes(); + return grid; } + /** + * TIFF magic, per PROJ's {@code IsTIFF}: classic ({@code 42}) and BigTIFF ({@code 43}), in either + * byte order. Delegated so that there is exactly one implementation of "is this a TIFF" in the + * codebase and the horizontal and vertical dispatchers cannot drift apart. + */ + private static boolean isTiff(byte[] header, int headerLength) { + return GeoTiffDataset.isTiff(header, headerLength); + } + + private long computeSizeBytes() { + long total = table == null || table.cvs == null ? 0L : table.cvs.length * BYTES_PER_NODE; + if (child != null) { + total += child.computeSizeBytes(); + } + if (next != null) { + total += next.computeSizeBytes(); + } + return total; + } + + /** Accounted heap cost of this grid and its subgrids. */ + @Override + public long sizeBytes() { + return sizeBytes; + } + + /** The name this grid was requested under, e.g. {@code "conus"}. */ + public String getGridName() { + return gridName; + } + + /** Where the bytes came from, e.g. {@code "classpath:proj4j-data/grids/conus"}. */ + public String getOrigin() { + return fileName; + } + + /** {@code "ctable2"}, {@code "ntv1"}, {@code "ntv2"}, {@code "gtiff"}, or {@code "missing"}. */ + public String getFormat() { + return format; + } + + /** Which {@link ResourceResolver} produced the bytes. Empty for the built-in null grid. */ + public String getResolverName() { + return resolverName == null ? "" : resolverName; + } + + /** Immutable list of this grid's direct subgrids, in file order. Empty for a single-grid file. */ + public List getSubGrids() { + if (child == null) { + return Collections.emptyList(); + } + List out = new ArrayList(); + for (Grid c = child; c != null; c = c.next) { + out.add(c); + } + return Collections.unmodifiableList(out); + } + + /** Total number of grids in this file, counting subgrids at any depth. */ + public int countGrids() { + int n = 1; + for (Grid c = child; c != null; c = c.next) { + n += c.countGrids(); + } + return n; + } + + /** The grid's own extent, in radians, as {@code [west, south, east, north]}. */ + public double[] extentRadians() { + if (table == null) { + return new double[]{Double.NaN, Double.NaN, Double.NaN, Double.NaN}; + } + return new double[]{ + table.ll.lam, + table.ll.phi, + table.ll.lam + (table.lim.lam - 1) * table.del.lam, + table.ll.phi + (table.lim.phi - 1) * table.del.phi}; + } + + // Package-private wiring used by the multi-subgrid NTv2 reader. + void describeAs(String gridName, String format, String origin, String resolverName) { + this.gridName = gridName; + this.format = format; + this.fileName = origin; + this.resolverName = resolverName; + } + + void setChild(Grid c) { + this.child = c; + } + + void setNext(Grid n) { + this.next = n; + } + + Grid getChild() { + return child; + } + + Grid getNext() { + return next; + } + + /** + * PROJ 9.8.1's {@code REL_TOLERANCE_HGRIDSHIFT} ({@code grids.cpp:2759}). + * + *

1.4.3 used {@code (|del.phi| + |del.lam|) / 10000}, i.e. {@code 1e-4} — ten times more + * permissive than 9.8.1, inherited from PROJ 4's {@code pj_apply_gridshift.c}. Since the + * containment test is exactly what decides which grid in the list is used, a tolerance ten + * times too wide lets a point that PROJ hands to the next grid be extrapolated off the edge of this + * one instead — silently, and by up to ten cell-widths' worth of tolerance. + */ + private static final double REL_TOLERANCE_HGRIDSHIFT = 1e-5; + + /** + * PROJ 9.8.1's grid-edge clamp window, {@code 10 * REL_TOLERANCE_HGRIDSHIFT} + * ({@code pj_hgrid_interpolate}, {@code grids.cpp:3341-3364}). + * + *

A point in the outermost half-cell of a grid lands on cell index {@code -1} or {@code width-1} + * and has no complete set of four surrounding nodes. Both PROJ and proj4j snap it onto the boundary + * cell rather than refuse it — but 1.4.3's window was {@code 1e-11}, seven orders of magnitude + * tighter than 9.8.1's {@code 1e-4}, so it refused points PROJ accepts. Measured on the shipped + * {@code conus} (0.25° cells, south edge 20°N) with {@code cct +proj=hgridshift}: at + * (100°W, 19.999999°N) — one micro-degree below the south edge, giving + * {@code frct.phi = 0.999996} — PROJ returns {@code -100.000014233333 20.000382961118}, while + * 1.4.3 returned {@code NaN}, which {@code shift} then turned into the input coordinate unchanged. + * At (100°W, 19.99998°N), twenty micro-degrees out, PROJ refuses too. + */ + private static final double EDGE_CLAMP = 10 * REL_TOLERANCE_HGRIDSHIFT; + /** * Convert between this grid and WGS84, or vice versa if the inverse flag is set. + * + *

Selection order

+ *

The grid list is walked in {@code +nadgrids=} order and the first grid whose extent + * contains the point wins, then the subgrid hierarchy is descended to the deepest child + * that also contains it. That is precisely {@code findGrid} ({@code 9.8.1:src/grids.cpp:3251-3262}) + * over {@code HorizontalShiftGridSet::gridAt} ({@code :2775-2789}) over + * {@code HorizontalShiftGrid::gridAt} ({@code :2761-2772}), so proj4j and PROJ pick the same grid + * for the same point. + * + *

Measured, because the ordering has been misdiagnosed before. With + * {@code +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat} — the {@code NAD27} list — at Ottawa + * (45.4225°N, 75.6972°W), PROJ 9.8.1 uses {@code conus}, not {@code ntv1_can.dat}: + * {@code cct +proj=hgridshift} with the full list returns {@code -75.6969038853 45.4225388843}, + * bit-identical to the same call with {@code +grids=conus} alone, while + * {@code +grids=ntv1_can.dat} gives {@code -75.6968722104 45.4225511829} — 2.47 m away. So the + * ~2.5 m is the {@code conus}-versus-{@code ntv1_can} data difference inside the overlap, + * which upstream also has; it is not a proj4j selection defect, and reordering the list to put + * {@code ntv1_can.dat} first would move proj4j away from PROJ. {@code conus} spans + * 131°W–63°W, 20°N–50°N (read from the shipped bytes), which is why it + * reaches Ottawa, Toronto and Montreal at all. + * + *

What was wrong, and is fixed here, is the containment predicate: the tolerance was + * {@code 1e-4} instead of {@link #REL_TOLERANCE_HGRIDSHIFT}, and there was no antimeridian + * handling. The latter is not academic — {@code us_noaa_alaska.tif} declares + * {@code west = -194}°, so every point in western Alaska needs the ±2π wrap of + * {@code isPointInExtent} ({@code grids.cpp:3689-3704}) to be found inside it at all. + * + *

Outside every grid is an error, not a zero shift

+ * + *

When no grid in a non-empty list can supply a value, this method throws + * {@link CrsTransformException} with {@link ErrorCause#COORDINATE_OUTSIDE_GRID}. 1.4.3 returned + * the coordinate unchanged, which is bit-indistinguishable from "the shift was zero" + * — a transform that reports success and returns its input. That is the single failure mode + * this project exists to eliminate, and it is not a small one here: a NAD27 round trip + * straddling the southern edge of {@code ntv1_can.dat} (40°N) came back 30–110 m + * displaced, because the forward leg found the point inside the grid and shifted it a few tens + * of metres south of the edge, and the return leg then silently did nothing. + * + *

Upstream agrees in both shapes this covers, and they are different code paths: + *

    + *
  • no grid contains the point — {@code pj_hgrid_apply} ({@code grids.cpp:3517-3520}) + * calls {@code findGrid}, gets {@code nullptr} and sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID};
  • + *
  • a grid contains it but interpolation cannot produce a value — + * {@code pj_hgrid_apply_internal} returns {@code HUGE_VAL} and {@code pj_hgrid_apply} + * ({@code :3534-3536}) sets the same error.
  • + *
+ * + *

The {@code @}-optional wart is untouched. "The grid file is absent" and + * "the point is outside a grid that loaded" are different questions and only the first is + * legitimately silent: a missing {@code @}-prefixed grid is still discarded by + * {@link #fromNadGrids} (and reported through {@link #describeNadGrids}), and an + * empty list is still a no-op here, exactly as every upstream operator's + * {@code if (!grids.empty())} guard requires. What changes is only the case where grids + * were loaded and none of them covers the point. + * + *

The fall-through to the next grid is KEPT — deliberately, and it is now observable

+ * + *

PROJ commits to the grid {@code findGrid} selected: if interpolation inside it fails, that + * is the answer, and the next grid in {@code +nadgrids=} is never consulted (the one exception + * is upstream's mid-iteration {@code findGrid} in the inverse loop at + * {@code :3452-3471}, which re-selects a grid for an iterate that has wandered out — a + * different mechanism). proj4j instead continues its loop. That divergence was a conscious + * choice, is documented in {@code packaging-and-data.md}, and is not reversed + * here: reversing it is a separate behavioural change with its own row set, and it + * would be wrong to smuggle it in under a fail-closed fix. + * + *

It is also strictly orthogonal to this fix, which is why keeping it is safe. The + * fall-through can only ever return a value that some grid the user listed produced + * for this point; it cannot invent one. The {@code else} branch could — and did. Keeping the + * fall-through therefore makes this change as small as it can be: every row it still answers + * is a row that does not move. + * + * @param grids the resolved {@code +nadgrids=} list, in list order; an empty list is a no-op + * @param inverse iterate the shift rather than applying it once + * @param in the coordinate, in radians, modified in place + * @throws CrsTransformException {@link ErrorCause#COORDINATE_OUTSIDE_GRID} if the list is + * non-empty and no grid in it can supply a value for this point */ // This method corresponds to the pj_apply_gridshift function from proj.4 public static void shift(List grids, boolean inverse, ProjCoordinate in) { - PolarCoordinate input = new PolarCoordinate(in.x, in.y), - output = new PolarCoordinate(Double.NaN, Double.NaN); - - for (Grid grid : grids) { - ConversionTable table = grid.table; - // don't shift if the grid is invalid - // https://github.com/OSGeo/PROJ/blob/5.2.0/src/pj_gridlist.c#L88 - if(table == null) continue; - double epsilon = (Math.abs(table.del.phi) + Math.abs(table.del.lam)) / 10000d; - // Skip tables that don't match our point at all - if (table.ll.phi - epsilon > input.phi - || table.ll.lam - epsilon > input.lam - || (table.ll.phi + (table.lim.phi - 1) * table.del.phi + epsilon < input.phi) - || (table.ll.lam + (table.lim.lam - 1) * table.del.lam + epsilon < input.lam)) - continue; - - // If we have child nodes, check to see if any of them apply - while (grid.child != null) { - Grid child; - for (child = grid.child; child != null; child = child.next) { - ConversionTable t = child.table; - double epsilon0 = (Math.abs(t.del.phi) + Math.abs(t.del.lam)) / 10000d; - - if (t.ll.phi - epsilon0 > input.phi - || t.ll.lam - epsilon0 > input.lam - || (t.ll.phi + (t.lim.phi - 1) * t.del.phi + epsilon0 < input.phi) - || (t.ll.lam + (t.lim.lam - 1) * t.del.lam + epsilon0 < input.lam)) - continue; + if (grids == null || grids.isEmpty()) { + // Nothing was declared, or every token was @-optional and absent. Upstream's operators + // all guard with `if (!grids.empty())` and pass the coordinate through; there is no + // grid here to be outside of, so this is not COORDINATE_OUTSIDE_GRID. + return; + } + if (nonFinite(in)) { + return; + } + final double inLam = in.x; + final double inPhi = in.y; + boolean contained = false; + boolean shifted = false; + boolean total = false; + try { + // An indexed loop, not a for-each: the enhanced for over a List allocates an Iterator + // per call, and this method runs once per coordinate per grid-shifted datum. + for (int i = 0, n = grids.size(); i < n; i++) { + int outcome = applyOne(grids.get(i), inLam, inPhi, inverse, in); + if (outcome == TOTAL) { + total = true; + break; + } + if (outcome == SHIFTED) { + shifted = true; + break; + } + if (outcome == NO_VALUE) { + contained = true; + } + } + } finally { + restoreUnlessShifted(in, inLam, inPhi, shifted); + } + if (shifted || total) { + return; + } + throw outsideGrid(names(grids), inLam, inPhi, inverse, contained); + } + /** + * {@link #shift(List, boolean, ProjCoordinate)} over an array. + * + *

Same arithmetic, same selection order, same exceptions — the loop is the only difference. + * It exists because a caller that applies one transform to a whole batch can hold the resolved + * grids as a {@code Grid[]} and get an array load per iteration instead of an interface + * dispatch through {@code List.get}; {@code BasicCoordinateTransform}'s bulk path does exactly + * that. Neither form allocates. + * + * @param grids the resolved grid list, in list order; null or empty is a no-op + * @param inverse iterate the shift rather than applying it once + * @param in the coordinate, in radians, modified in place + * @throws CrsTransformException {@link ErrorCause#COORDINATE_OUTSIDE_GRID} if the list is + * non-empty and no grid in it can supply a value for this point + * @since 1.5 + */ + public static void shift(Grid[] grids, boolean inverse, ProjCoordinate in) { + if (grids == null || grids.length == 0) { + return; + } + if (nonFinite(in)) { + return; + } + final double inLam = in.x; + final double inPhi = in.y; + boolean contained = false; + boolean shifted = false; + boolean total = false; + try { + for (int i = 0; i < grids.length; i++) { + int outcome = applyOne(grids[i], inLam, inPhi, inverse, in); + if (outcome == TOTAL) { + total = true; + break; + } + if (outcome == SHIFTED) { + shifted = true; break; } + if (outcome == NO_VALUE) { + contained = true; + } + } + } finally { + restoreUnlessShifted(in, inLam, inPhi, shifted); + } + if (shifted || total) { + return; + } + throw outsideGrid(names(grids), inLam, inPhi, inverse, contained); + } - if (child == null) break; + /** + * {@code grids.cpp:3411-3412}, {@code "if (in.lam == HUGE_VAL) return in"}. A non-finite + * horizontal position has no cell; the non-finiteness travels rather than becoming an + * exception, so a NaN in still gives a NaN out. + */ + private static boolean nonFinite(ProjCoordinate in) { + return Double.isNaN(in.x) || Double.isInfinite(in.x) + || Double.isNaN(in.y) || Double.isInfinite(in.y); + } - grid = child; - } + /** + * Puts the caller's coordinate back the way it was found unless a grid actually produced a + * value. + * + *

{@code in} doubles as the scratch space {@link #nad_cvt} and {@link #nad_intr} write + * their intermediates into — that is what makes this path allocation-free — so on any path + * that does not end in a shift it holds arithmetic debris rather than the input. The previous + * implementation could not have this problem because its scratch was three freshly allocated + * {@link PolarCoordinate}s per call; the price of removing them is this one line, in a + * {@code finally} so that it also covers {@link ConvergenceFailureException} unwinding out of + * the inverse iteration. The observable contract is unchanged and is the 1.4.3 one: after a + * failed shift the coordinate is exactly as it was passed in. + */ + private static void restoreUnlessShifted(ProjCoordinate in, double inLam, double inPhi, + boolean shifted) { + if (!shifted) { + in.x = inLam; + in.y = inPhi; + } + } - if (grid.table.cvs == null) { - // proj.4 only reads headers when 'initializing' a grid and - // loads the grid itself here if needed. for now we're just - // loading the whole grid at once so this is a no-op - // loadConversionTable(table); + /** {@link #applyOne} found no table, or the point is outside this grid's extent. */ + private static final int MISS = 0; + /** The point is inside this grid, but no value could be interpolated for it. */ + private static final int NO_VALUE = 1; + /** {@code out.x} / {@code out.y} hold the shifted coordinate. */ + private static final int SHIFTED = 2; + /** PROJ's built-in null grid: covers everything, shifts nothing. */ + private static final int TOTAL = 3; + + /** + * One grid of the list: the extent test, the subgrid descent, and the conversion. + * + *

Factored out of the two {@code shift} overloads so that the arithmetic exists once. The + * outcome is an {@code int} rather than a pair of booleans or an object because + * "contained but produced nothing" and "did not contain it" are different + * answers to {@link #outsideGrid} and this method must not allocate to say so. + * + * @param out receives the shifted coordinate when the result is {@link #SHIFTED}, and is used + * as scratch otherwise + */ + private static int applyOne(Grid grid, double inLam, double inPhi, boolean inverse, + ProjCoordinate out) { + if (grid.nullGrid) { + // HorizontalShiftGridSet::gridAt returns the null grid for any point at all, and + // pj_hgrid_apply then returns the input. It shifts nothing and covers everything, + // so it must short-circuit rather than fall through to the outside-grid error. + return TOTAL; + } + ConversionTable table = grid.table; + // don't shift if the grid is invalid + // https://github.com/OSGeo/PROJ/blob/5.2.0/src/pj_gridlist.c#L88 + if (table == null) return MISS; + // Skip tables that don't match our point at all + if (!isPointInExtent(inLam, inPhi, table)) return MISS; + + // If we have child nodes, check to see if any of them apply + while (grid.child != null) { + Grid child; + for (child = grid.child; child != null; child = child.next) { + ConversionTable t = child.table; + if (t == null) continue; + if (!isPointInExtent(inLam, inPhi, t)) continue; + break; } - output = nad_cvt(input, inverse, table); + if (child == null) break; - if (!Double.isNaN(output.lam)) break; + grid = child; } - if (!Double.isNaN(output.lam)) { - in.x = output.lam; - in.y = output.phi; - } else { - // Proj.4 guards this with #ifdef ERR_GRID_AREA_TRANSIENT_SEVERE - // in.x = in.y = Double.NaN; + // Use the table of whichever grid the descent above settled on. 1.4.3 kept using the + // *parent* table here, so a matched NTv2 subgrid was located and then ignored -- the finer + // child values were never applied. + table = grid.table; + if (table == null || table.cvs == null) { + return NO_VALUE; + } + + nad_cvt(inLam, inPhi, inverse, table, out); + + return Double.isNaN(out.x) ? NO_VALUE : SHIFTED; + } + + /** + * Builds the {@link ErrorCause#COORDINATE_OUTSIDE_GRID} report. + * + *

The message distinguishes the two upstream shapes, because they mean different things to + * whoever reads it: "no grid covers this point" is a data-coverage problem, while "a grid + * covers it but no value could be interpolated" is a grid-edge or hole-in-the-subgrids problem. + * Both are the same {@link ErrorCause}, matching PROJ's single + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID}. + * + *

Angles are formatted with {@link ProjectionMath#radToDeg} rather than + * {@code Math.toDegrees}, which is not bit-stable across Java versions. + */ + private static String names(List grids) { + StringBuilder names = new StringBuilder(); + for (int i = 0; i < grids.size(); i++) { + if (i > 0) names.append(", "); + names.append(grids.get(i).gridName); + } + return names.toString(); + } + + private static String names(Grid[] grids) { + StringBuilder names = new StringBuilder(); + for (int i = 0; i < grids.length; i++) { + if (i > 0) names.append(", "); + names.append(grids[i].gridName); + } + return names.toString(); + } + + private static CrsTransformException outsideGrid(String names, double inLam, double inPhi, + boolean inverse, boolean contained) { + String lon = String.valueOf( + ProjectionMath.radToDeg(ProjectionMath.normalizeLongitude(inLam))); + String lat = String.valueOf(ProjectionMath.radToDeg(inPhi)); + return new CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID, + (inverse ? "inverse " : "") + "grid shift: (" + lon + ", " + lat + ") is " + + (contained + ? "inside the extent of a grid of [" + names + "] but no value could be" + + " interpolated for it" + : "outside every grid of [" + names + "]")); + } + + /** + * PROJ's {@code isPointInExtent} ({@code 9.8.1:src/grids.cpp:3689-3704}) with the epsilon + * {@code HorizontalShiftGridSet::gridAt} passes it. + * + *

Three things this replaced a plain four-sided box test with, in upstream's order: + *

    + *
  1. latitude first, so a wrap of longitude is never attempted for a point at the wrong + * latitude;
  2. + *
  3. a short circuit for a grid spanning the whole world in longitude + * ({@code east - west + resX >= 2}π within {@code 1e-10}), which is how a global grid + * such as {@code tests/test_hgrid_tiled.tif} accepts every meridian including its own + * seam;
  4. + *
  5. a ±2π shift of the longitude before the east/west test, which is what lets a + * grid declared in a shifted longitude window — {@code us_noaa_alaska.tif} starts at + * {@code -194}° — contain a point given in −180…180.
  6. + *
+ * + * @param lam longitude, radians + * @param phi latitude, radians + * @param table the candidate grid's table + * @return whether PROJ would consider the point inside this grid + */ + private static boolean isPointInExtent(double lam, double phi, ConversionTable table) { + double resX = Math.abs(table.del.lam); + double resY = Math.abs(table.del.phi); + double eps = (resX + resY) * REL_TOLERANCE_HGRIDSHIFT; + double west = table.ll.lam; + double south = table.ll.phi; + double east = west + (table.lim.lam - 1) * table.del.lam; + double north = south + (table.lim.phi - 1) * table.del.phi; + if (!(phi + eps >= south && phi - eps <= north)) { + return false; + } + // ExtentAndRes::fullWorldLongitude(). Every proj4j horizontal grid is geographic, so + // upstream's isGeographic guard is unconditionally true here. + if (east - west + resX >= 2 * Math.PI - 1e-10) { + return true; + } + double x = lam; + if (x + eps < west) { + x += 2 * Math.PI; + } else if (x - eps > east) { + x -= 2 * Math.PI; } + return x + eps >= west && x - eps <= east; } // This class corresponds to the CTABLE struct from proj.4 public static final class ConversionTable implements Serializable { + + private static final long serialVersionUID = 1L; + /** * ASCII info */ @@ -164,22 +788,66 @@ public static final class ConversionTable implements Serializable { */ public FloatPolarCoordinate[] cvs; + /** + * Memoised {@link #hashCode()}. {@code 0} means "not computed yet", the + * {@code String.hash} idiom: the race is benign because every thread computes the same + * value from the same deeply-immutable state, and a value that genuinely hashes to zero + * costs a recomputation rather than a wrong answer. {@code transient} so a deserialised + * table re-derives rather than trusting a number written by another JVM. + */ + private transient int hash; + @Override public String toString() { return String.format("Grid: %s", id); } + /** + * {@inheritDoc} + * + *

Two defects fixed here, both of them measurable. + * + *

The combiner was {@code |}, not a hash. Bitwise OR is monotone in every bit: + * once a bit is set no later term can clear it, so combining four 32-bit terms this way + * drives the result towards {@code 0xFFFFFFFF} and destroys most of the information each + * term carried. Over the grids this repository ships the old expression collapses to a + * handful of distinct values — {@code GridHashDistributionTest} measures it rather than + * asserting it — while the {@code 31}-chain below, the same one + * {@code Projection.hashCode} uses, separates them. A collapsing hash is not a correctness + * bug on its own; it becomes one the moment a {@code HashMap} keyed on a grid degenerates + * to a linked list, which on a million-node table is the difference between a lookup and a + * scan. + * + *

It was O(number of nodes), every call. {@link #equals} short-circuits on + * reference identity — with {@link GridCache} interning parsed grids that is the common + * case — but a hash has no argument to compare against and so paid + * {@code Arrays.hashCode(cvs)} over every node on every call: about 1.06 million elements + * for the shipped {@code ntv1_can.dat}. The value is memoised in {@link #hash} instead, + * which is sound because a parsed table is never mutated afterwards. + * + *

The fields are exactly {@link #equals}'s fields — {@code id}, {@code del}, {@code ll}, + * {@code cvs}. {@code lim} is deliberately absent from both. + */ @Override public int hashCode() { - int idHash = id == null ? 0 : id.hashCode(); - int delHash = del == null ? 0 : del.hashCode(); - int llHash = ll == null ? 0 : ll.hashCode(); - int cvsHash = Arrays.hashCode(cvs); - return idHash | (11 * delHash) | (23 * llHash) | (37 * cvsHash); + int h = hash; + if (h == 0) { + h = 17; + h = 31 * h + (id == null ? 0 : id.hashCode()); + h = 31 * h + (del == null ? 0 : del.hashCode()); + h = 31 * h + (ll == null ? 0 : ll.hashCode()); + h = 31 * h + Arrays.hashCode(cvs); + hash = h; + } + return h; } @Override public boolean equals(Object that) { + // Identity short-circuit. With GridCache interning the parsed grids, equal grid lists are + // the *same* objects, so Datum.isEqual no longer descends into Arrays.equals over + // millions of nodes on every point. + if (this == that) return true; if (that instanceof ConversionTable) { ConversionTable ct = (ConversionTable) that; if (id == null && ct.id != null) return false; @@ -196,206 +864,322 @@ public boolean equals(Object that) { } } + /** + * {@code nad_cvt}, rewritten to keep every intermediate in a local {@code double}. + * + *

The arithmetic is unchanged, statement for statement and in the same order — including + * the compound assignments in the inverse iteration, whose left-hand side is read before the + * right-hand side is evaluated, and including the {@code do/while (i-- > 0)} that gives + * {@code MAX_TRY + 1 = 10} trips. What changed is the storage: it used to build a + * {@link PolarCoordinate} for {@code tb}, one for {@code del}, one for {@code dif} and one per + * {@link #nad_intr} call — up to about 49 objects per inverted point, i.e. 4.9 million for one + * 100,000-vertex geometry, on a path the consumer runs per row inside a Spark executor. + * + *

{@code out} carries the result and doubles as scratch. It is the caller's own coordinate; + * {@link #restoreUnlessShifted} puts it back if this returns without a value or throws. + * + * @param out receives the converted coordinate in {@code x}/{@code y}; {@code x} is + * {@code NaN} when no value could be produced + */ // This method corresponds to the nad_cvt function in proj.4 - private static PolarCoordinate nad_cvt(PolarCoordinate in, boolean inverse, ConversionTable table) { - PolarCoordinate t, tb; - if (Double.isNaN(in.lam)) - return in; + private static void nad_cvt(double inLam, double inPhi, boolean inverse, ConversionTable table, + ProjCoordinate out) { + if (Double.isNaN(inLam)) { + out.x = inLam; + out.y = inPhi; + return; + } - tb = new PolarCoordinate(in); - tb.lam -= table.ll.lam; - tb.phi -= table.ll.phi; - tb.lam = ProjectionMath.normalizeLongitude(tb.lam - Math.PI) + Math.PI; - t = nad_intr(tb, table); + double tbLam = inLam - table.ll.lam; + final double tbPhi = inPhi - table.ll.phi; + tbLam = ProjectionMath.normalizeLongitude(tbLam - Math.PI) + Math.PI; + nad_intr(tbLam, tbPhi, table, out); + double tLam = out.x; + double tPhi = out.y; if (inverse) { - PolarCoordinate del = new PolarCoordinate(Double.NaN, Double.NaN), - dif = new PolarCoordinate(Double.NaN, Double.NaN); + double difLam = Double.NaN; + double difPhi = Double.NaN; int i = MAX_TRY; + boolean converged = false; + boolean atGridEdge = false; - if (Double.isNaN(t.lam)) return t; - t.lam = tb.lam + t.lam; - t.phi = tb.phi - t.phi; + // out already holds (NaN, NaN) from nad_intr's reject path, which is what the caller + // reads as "no value". + if (Double.isNaN(tLam)) return; + tLam = tbLam + tLam; + tPhi = tbPhi - tPhi; do { - del = nad_intr(t, table); - if (Double.isNaN(del.lam)) { - // TODO: LOG - // fprintf( stderr, - // "Inverse grid shift iteration failed, presumably at grid edge.\n" - // "Using first approximation.\n" ); + nad_intr(tLam, tPhi, table, out); + final double delLam = out.x; + final double delPhi = out.y; + if (Double.isNaN(delLam)) { + // PROJ logs "Inverse grid shift iteration failed, presumably at grid edge. + // Using first approximation." and proceeds with the current iterate. Ported + // verbatim: this is a documented approximation, not a silent failure, and it is + // reachable at every grid boundary. + atGridEdge = true; break; } - t.lam -= dif.lam = t.lam - del.lam - tb.lam; - t.phi -= dif.phi = t.phi + del.phi - tb.phi; - } while (i-- > 0 && Math.abs(dif.lam) > TOL && Math.abs(dif.phi) > TOL); - - if (i < 0) { - // TODO: Log - // fprintf( stderr, - // "Inverse grid shift iterator failed to converge.\n" ); - t.lam = t.phi = Double.NaN; - return t; + difLam = tLam - delLam - tbLam; + tLam -= difLam; + difPhi = tPhi + delPhi - tbPhi; + tPhi -= difPhi; + // PROJ 9.8.1 tests the squared 2-norm of the residual (grids.cpp, + // pj_hgrid_apply_internal): both components must be within tolerance. 1.4.3 tested + // `|dif.lam| > TOL && |dif.phi| > TOL`, which stops as soon as *either* component + // converges and therefore declares success with the other still unconverged. + if (difLam * difLam + difPhi * difPhi <= TOL * TOL) { + converged = true; + break; + } + } while (i-- > 0); + + if (!converged && !atGridEdge) { + // Fail closed. 1.4.3 set both ordinates to NaN here, which Grid.shift then treated as + // "no table covered this point" and turned into the input coordinate, unchanged -- + // a numerical failure delivered as a plausible answer. + throw new ConvergenceFailureException( + "Inverse grid shift did not converge for grid '" + table.id + "' at (" + + ProjectionMath.radToDeg(ProjectionMath.normalizeLongitude(inLam)) + + ", " + ProjectionMath.radToDeg(inPhi) + ") after " + + (MAX_TRY + 1) + " iterations; last residual was (" + + difLam + ", " + difPhi + ") rad against a tolerance of " + TOL); } - in.lam = ProjectionMath.normalizeLongitude(t.lam + table.ll.lam); - in.phi = t.phi + table.ll.phi; + out.x = ProjectionMath.normalizeLongitude(tLam + table.ll.lam); + out.y = tPhi + table.ll.phi; } else { - if (Double.isNaN(t.lam)) { - in = t; - } else { - in.lam -= t.lam; - in.phi += t.phi; + if (Double.isNaN(tLam)) { + // out already holds nad_intr's (NaN, NaN). + return; } + out.x = inLam - tLam; + out.y = inPhi + tPhi; } - return in; } + /** + * {@code nad_intr}: bilinear interpolation of the four nodes around the point, with PROJ's + * outermost-half-cell clamp. + * + *

Writes {@code (NaN, NaN)} into {@code out} for every reject path, which is exactly what + * the returned {@code val} carried before — the NaN is the signal, and it must stay + * one rather than becoming a boolean, because genuinely NaN node data has to reach the callers + * by the same route it always did. + */ // This method corresponds to the nad_intr method in proj.4 - private static PolarCoordinate nad_intr(PolarCoordinate t, ConversionTable table) { - t = new PolarCoordinate(t); - PolarCoordinate val = new PolarCoordinate(Double.NaN, Double.NaN); - IntPolarCoordinate indx = new IntPolarCoordinate( - (int) Math.floor(t.lam /= table.del.lam), - (int) Math.floor(t.phi /= table.del.phi)); - PolarCoordinate frct = new PolarCoordinate(t.lam - indx.lam, t.phi - indx.phi); + private static void nad_intr(double tLam, double tPhi, ConversionTable table, + ProjCoordinate out) { + out.x = Double.NaN; + out.y = Double.NaN; + final double scaledLam = tLam / table.del.lam; + final double scaledPhi = tPhi / table.del.phi; + int indxLam = (int) Math.floor(scaledLam); + int indxPhi = (int) Math.floor(scaledPhi); + double frctLam = scaledLam - indxLam; + double frctPhi = scaledPhi - indxPhi; double m00, m10, m01, m11; FloatPolarCoordinate f00, f10, f01, f11; int index; - int in; + int next; - if (indx.lam < 0) { - if (indx.lam == -1 && frct.lam > 0.99999999999) { - ++indx.lam; - frct.lam = 0d; + if (indxLam < 0) { + if (indxLam == -1 && frctLam > 1 - EDGE_CLAMP) { + ++indxLam; + frctLam = 0d; } else { - return val; + return; } - } else if ((in = indx.lam + 1) >= table.lim.lam) { - if (in == table.lim.lam && frct.lam < 1e-11) { - --indx.lam; - frct.lam = 1d; + } else if ((next = indxLam + 1) >= table.lim.lam) { + if (next == table.lim.lam && frctLam < EDGE_CLAMP) { + --indxLam; + frctLam = 1d; } else { - return val; + return; } } - if (indx.phi < 0) { - if (indx.phi == -1 && frct.phi > 0.99999999999) { - ++indx.phi; - frct.phi = 0d; + if (indxPhi < 0) { + if (indxPhi == -1 && frctPhi > 1 - EDGE_CLAMP) { + ++indxPhi; + frctPhi = 0d; } else { - return val; + return; } - } else if ((in = indx.phi + 1) >= table.lim.phi) { - if (in == table.lim.phi && frct.phi < 1e-11) { - --indx.phi; - frct.phi = 1d; + } else if ((next = indxPhi + 1) >= table.lim.phi) { + if (next == table.lim.phi && frctPhi < EDGE_CLAMP) { + --indxPhi; + frctPhi = 1d; } else { - return val; + return; } } - index = indx.phi * ((int) table.lim.lam) + indx.lam; + index = indxPhi * table.lim.lam + indxLam; f00 = table.cvs[index++]; f10 = table.cvs[index]; index += table.lim.lam; f11 = table.cvs[index--]; f01 = table.cvs[index]; - m11 = m10 = frct.lam; - m00 = m01 = 1d - frct.lam; - m11 *= frct.phi; - m01 *= frct.phi; - frct.phi = 1d - frct.phi; - m00 *= frct.phi; - m10 *= frct.phi; - val.lam = m00 * f00.lam + m10 * f10.lam + m01 * f01.lam + m11 * f11.lam; - val.phi = m00 * f00.phi + m10 * f10.phi + m01 * f01.phi + m11 * f11.phi; - return val; + m11 = m10 = frctLam; + m00 = m01 = 1d - frctLam; + m11 *= frctPhi; + m01 *= frctPhi; + frctPhi = 1d - frctPhi; + m00 *= frctPhi; + m10 *= frctPhi; + out.x = m00 * f00.lam + m10 * f10.lam + m01 * f01.lam + m11 * f11.lam; + out.y = m00 * f00.phi + m10 * f10.phi + m01 * f01.phi + m11 * f11.phi; } // This method corresponds to the pj_gridlist_from_nadgrids function in proj.4 public static List fromNadGrids(String grids) throws IOException { - List gridlist = new ArrayList<>(); - synchronized (Grid.class) { - for (String gridName : grids.split(",")) { - boolean optional = gridName.startsWith("@"); - if (optional) gridName = gridName.substring(1); - try { - mergeGridFile(gridName, gridlist); - } catch (IOException e) { - if (!optional) throw e; - } + List gridlist = new ArrayList(); + // No global lock. 1.4.3 wrapped this whole method -- including blocking I/O -- in + // `synchronized (Grid.class)`, so every CRS construction in the JVM serialised on one + // monitor to redo a parse it had already done. GridCache now handles the mutual exclusion, + // per grid, without holding a lock across the read. + for (String gridName : splitTokens("nadgrids", grids)) { + boolean optional = gridName.startsWith("@"); + if (optional) gridName = gridName.substring(1); + try { + mergeGridFile(gridName, gridlist); + } catch (IOException e) { + // PROJ's `@` prefix means *optional*, and silently skipping is correct PROJ + // behaviour (grids.cpp, getListOfGridSets: any failure on an @-prefixed grid clears + // the errno and continues). Reproduced, not "fixed" -- but made visible through + // describeNadGrids(), so a caller can ask which grids were skipped and why instead + // of inferring it from a coordinate. + if (!optional) throw e; } } return gridlist; } - // This method corresponds to the pj_gridinfo_init function in proj.4 - private static Grid gridinfoInit(String gridName) throws IOException { - Grid grid = new Grid(); - grid.gridName = gridName; - grid.format = "missing"; - grid.gridOffset = 0; - - if (gridName.equals("null")) { - return grid; + /** + * What each token of a {@code +nadgrids=} string resolved to. One entry per token, in order. + *

+ * This is the introspection channel for PROJ's {@code @}-optional wart. Given + * {@code +nadgrids=@missing,conus}, {@link #fromNadGrids} returns one grid and says nothing about + * the other; this method reports both, so "silently skipped" becomes "skipped, and here is the + * reason". + * + * @throws InvalidValueException if the list exceeds {@link #MAX_GRID_TOKENS} tokens. Unchecked + * rather than {@code IOException} only because this method does + * not declare one; it is the same refusal + * {@link #fromNadGrids} makes, at the same limit. + */ + public static List describeNadGrids(String grids) { + List refs = new ArrayList(); + if (grids == null) { + return refs; } - - try(DataInputStream gridDefinition = resolveGridDefinition(gridName)) { - if (gridDefinition == null) { - throw new IOException("Unknown grid: " + gridName); - } - byte[] header = new byte[160]; - gridDefinition.mark(header.length); - gridDefinition.readFully(header); - gridDefinition.reset(); - if (CTABLEV2.testHeader(header)) { - grid.format = "ctable2"; - gridDefinition.mark(1024); - grid.table = CTABLEV2.init(gridDefinition); - gridDefinition.reset(); - CTABLEV2.load(gridDefinition, grid); - } else if (NTV1.testHeader(header)) { - grid.format = "ntv1"; - gridDefinition.mark(1024); - grid.table = NTV1.init(gridDefinition); - gridDefinition.reset(); - NTV1.load(gridDefinition, grid); - } else if (NTV2.testHeader(header)) { - grid.format = "ntv2"; - gridDefinition.mark(1024); - grid.table = NTV2.init(gridDefinition); - gridDefinition.reset(); - NTV2.load(gridDefinition, grid); + String[] tokens; + try { + tokens = splitTokens("nadgrids", grids); + } catch (IOException e) { + throw new InvalidValueException(e.getMessage()); + } + for (String token : tokens) { + boolean optional = token.startsWith("@"); + String name = optional ? token.substring(1) : token; + try { + Grid g = resolveAndLoad(name); + refs.add(new GridRef(name, optional, g, null)); + } catch (IOException e) { + refs.add(new GridRef(name, optional, null, e.getMessage())); + } catch (RuntimeException e) { + refs.add(new GridRef(name, optional, null, String.valueOf(e.getMessage()))); } } - return grid; + return Collections.unmodifiableList(refs); } - private static DataInputStream resolveGridDefinition(String gridName) throws IOException { - // proj.4 also has a couple of environment variables that influence the - // search path for grid definition files, but for now we only check the - // working directory and the classpath (in that order.) - File file = new File(gridName); - if (file.exists()) return new DataInputStream(new BufferedInputStream(new FileInputStream(file))); - InputStream resource = Grid.class.getResourceAsStream("/proj4/nad/" + gridName); - if (resource != null) return new DataInputStream(new BufferedInputStream(resource)); + /** One {@code +nadgrids=} token and its resolution outcome. Immutable. */ + public static final class GridRef { + private final String name; + private final boolean optional; + private final Grid grid; + private final String skipReason; - return null; + GridRef(String name, boolean optional, Grid grid, String skipReason) { + this.name = name; + this.optional = optional; + this.grid = grid; + this.skipReason = skipReason; + } + + /** The grid name with any {@code @} stripped. */ + public String name() { + return name; + } + + /** True iff the token carried PROJ's {@code @} optional prefix. */ + public boolean isOptional() { + return optional; + } + + /** True iff the grid was found and parsed. */ + public boolean isAvailable() { + return grid != null; + } + + /** The parsed grid, or {@code null} if it was skipped. */ + public Grid grid() { + return grid; + } + + /** Why it was skipped, or {@code null} if it was not. */ + public String skipReason() { + return skipReason; + } + + @Override + public String toString() { + if (grid != null) { + return (optional ? "@" : "") + name + " -> " + grid.format + " from " + + grid.getResolverName() + " (" + grid.fileName + ")"; + } + return (optional ? "@" : "") + name + " -> SKIPPED" + + (optional ? " (optional)" : " (REQUIRED)") + ": " + skipReason; + } } + /** + * {@inheritDoc} + * + *

Three defects fixed here; see {@link ConversionTable#hashCode()} for the two it shares. + * + *

{@code childHash} was computed from {@code next}, not from {@code child}. The line + * read {@code int childHash = next == null ? 0 : next.hashCode();}. So {@code next} was mixed + * in twice, {@code child} was never mixed in at all, and two grids differing only in their + * subgrid hierarchy — which is exactly how an NTv2 or GeoTIFF parent differs from a bare one — + * hashed identically while {@link #equals} correctly reported them different. + * {@code GridHashDistributionTest} pins that pair. + * + *

The combiner was {@code |}. See {@link ConversionTable#hashCode()}. + * + *

This walks {@code child} and {@code next}, so it terminates only if the subgrid graph is + * a tree. It is, and that is now enforced rather than accidental — see + * {@code GeoTiffGrid.insertIntoHierarchy} and {@code GeoTiffSelfCycleTest}. + */ @Override public int hashCode() { - int nameHash = gridName == null ? 0 : gridName.hashCode(); - int fileHash = fileName == null ? 0 : fileName.hashCode(); - int formatHash = format == null ? 0 : format.hashCode(); - int tableHash = table == null ? 0 : table.hashCode(); - int nextHash = next == null ? 0 : next.hashCode(); - int childHash = next == null ? 0 : next.hashCode(); - return nameHash | (7 * fileHash) | (11 * formatHash) | (17 * tableHash) | (23 * nextHash) | (31 * childHash); + int h = 17; + h = 31 * h + (gridName == null ? 0 : gridName.hashCode()); + h = 31 * h + (fileName == null ? 0 : fileName.hashCode()); + h = 31 * h + (format == null ? 0 : format.hashCode()); + h = 31 * h + (table == null ? 0 : table.hashCode()); + h = 31 * h + (next == null ? 0 : next.hashCode()); + h = 31 * h + (child == null ? 0 : child.hashCode()); + return h; } @Override public boolean equals(Object that) { + // Identity short-circuit: GridCache interns parsed grids, so this is the common case and it + // keeps Datum.isEqual off the O(grid size) array comparison on the per-point path. + if (this == that) return true; if (that instanceof Grid) { Grid g = (Grid) that; if (gridName == null && g.gridName != null) return false; diff --git a/core/src/main/java/org/locationtech/proj4j/datum/GridCache.java b/core/src/main/java/org/locationtech/proj4j/datum/GridCache.java new file mode 100644 index 0000000..dff3201 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/GridCache.java @@ -0,0 +1,475 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; +import java.util.concurrent.atomic.AtomicLong; + +/** + * A thread-safe, byte-bounded cache of parsed grids. + * + *

Proj4J 1.4.3 had none at all — {@code Grid.mergeGridFile} carried a {@code TODO} where this + * class now is, and every {@code +nadgrids=} parse re-read and re-allocated the whole grid. The + * shipped {@code ntv1_can.dat} expands to 393×177 = 69,561 nodes; a 1,000-entry transform cache + * was therefore also a cache of up to 1,000 independently parsed copies of the same grid. Worse, all + * of {@code fromNadGrids} ran inside a single {@code synchronized (Grid.class)} block wrapped around + * blocking I/O, so the whole JVM serialised on one lock to redo work it had already done. + * + *

Determinism

+ *

This cache cannot change a numeric answer. Two properties give that: + *

    + *
  • A parsed {@link Grid} is deeply immutable after construction. Nothing hands out a + * mutable view and no transform mutates one, so sharing one instance across threads is + * observationally identical to each thread owning a copy.
  • + *
  • Loading is a pure function of the resolved bytes. An evicted grid re-parsed later produces + * bit-identical {@code float} node values, hence bit-identical interpolation. Cache state and + * eviction timing are therefore not observable in output — which is what lets a + * bitwise-identity concurrency test be meaningful rather than accidental.
  • + *
+ * Failures are cached too, and for the same reason: a corrupt grid must fail the same way on row + * 4,000,000 as on row 1. + * + *

Bounded by bytes, not by entries

+ *

Grids range from a 624-byte test fixture to an 80 MB geoid, so an entry count is not a bound on + * anything. The budget is bytes of parsed node data, default 64 MiB, settable with + * {@code -Dproj4j.grids.cacheBytes}. Eviction is least-recently-used. Entries are held + * strongly: a soft or weak reference makes eviction depend on GC timing, which + * reintroduces exactly the run-to-run variability being removed here (it would still be numerically + * deterministic, but it would make the cache's behaviour untestable). + * + *

One budget, shared, and it counts failures

+ *

Three holes made the stated bound not the real one, and all three are closed here. + *

    + *
  • The budget was per-instance and there are two instances. The horizontal and + * vertical caches each took {@code configuredMaxBytes()} in full, so a 64 MiB setting bought a + * 128 MiB ceiling. They now share one {@link Budget}, so the property means what it says. It + * is shared rather than halved because halving would cut a horizontal-only workload's cache in + * two to bound a vertical one it never populates.
  • + *
  • A failed load was retained forever and counted as nothing. Every exception + * path returned without reaching {@code admit}, leaving the {@link FutureTask} in the entry + * map with no LRU record — so it could never be evicted and never appeared in + * {@link #bytes()}. Since the key contains a {@code +nadgrids=} token, that is unbounded + * retention driven by untrusted input. Failures are still cached, for the determinism reason + * below, but they are now charged {@value #FAILURE_WEIGHT_BYTES} bytes and evict like anything + * else.
  • + *
  • A grid larger than the whole budget was admitted and then exempted from + * eviction. "Never evict what was just admitted" is right for the ordinary case and + * is kept, but combined with an entry that alone exceeds the budget it meant the cache sat + * permanently over its ceiling. Such a grid is now served to its caller and not + * retained — the same decision {@code InitFileCache} already makes for an oversized + * dictionary — so the exemption can only ever defer a trim by one admission.
  • + *
+ *

An interrupted or cancelled load is the one failure that is not cached: it is a + * property of the calling thread, not of the file, and caching it would let one thread's interrupt + * poison a grid for every other thread for the life of the JVM. + * + *

No lock is held across I/O

+ *

Loading uses a {@link FutureTask} published with {@code putIfAbsent}: concurrent requests for the + * same grid produce exactly one parse, and the loser waits on the {@code Future} rather than on a + * global monitor. The LRU bookkeeping is guarded by a separate short critical section that touches + * only a {@link LinkedHashMap} of sizes, never the file. + */ +public final class GridCache { + + /** Anything the cache can account for. Implemented by {@link Grid} and {@link VerticalGrid}. */ + public interface Sized { + /** Accounted heap cost of the parsed node data. */ + long sizeBytes(); + } + + /** Loads a grid. Separate from the cache so the cache does no I/O of its own. */ + public interface Loader { + T load() throws IOException; + } + + private static final String SIZE_PROPERTY = "proj4j.grids.cacheBytes"; + private static final long DEFAULT_MAX_BYTES = 64L * 1024L * 1024L; + + /** + * What a cached failure is charged. + * + *

A failure retains a key, a completed {@link FutureTask} holding a throwable with its stack, + * and two map nodes — a few hundred bytes in practice. Charging 1 KiB over-states it + * deliberately: under-charging a miss is exactly how a "bounded" cache comes to retain hundreds + * of thousands of them, and over-charging only makes the bound conservative. At this weight a + * 64 MiB budget holds at most ~65,536 cached failures, which is a real bound on a real number. + * The same constant and the same reasoning as {@code InitFileCache.MISS_WEIGHT_BYTES}. + */ + static final long FAILURE_WEIGHT_BYTES = 1024L; + + /** The one budget both caches draw on. See the class javadoc. */ + private static final Budget BUDGET = new Budget(configuredMaxBytes()); + + private static final GridCache HORIZONTAL = new GridCache(BUDGET); + private static final GridCache VERTICAL = new GridCache(BUDGET); + + private final Budget budget; + + /** key -> the single in-flight or completed load for that key. */ + private final ConcurrentMap> entries = + new ConcurrentHashMap>(); + + private final AtomicLong hits = new AtomicLong(); + private final AtomicLong misses = new AtomicLong(); + private final AtomicLong evictions = new AtomicLong(); + + GridCache(long maxBytes) { + this(new Budget(maxBytes)); + } + + private GridCache(Budget budget) { + this.budget = budget; + } + + /** + * A cache drawing on an existing budget. Exists so a test can build two caches over one budget + * and observe that they really do share it — the property that makes + * {@code proj4j.grids.cacheBytes} a bound on the process rather than on an instance. + */ + static GridCache forBudget(Budget budget) { + return new GridCache(budget); + } + + /** The cache of parsed horizontal (datum-shift) grids. */ + public static GridCache instance() { + return HORIZONTAL; + } + + /** The cache of parsed vertical (geoid / height) grids. */ + public static GridCache vertical() { + return VERTICAL; + } + + private static long configuredMaxBytes() { + String raw = System.getProperty(SIZE_PROPERTY); + if (raw == null) { + return DEFAULT_MAX_BYTES; + } + try { + long v = Long.parseLong(raw.trim()); + return v > 0 ? v : DEFAULT_MAX_BYTES; + } catch (NumberFormatException e) { + return DEFAULT_MAX_BYTES; + } + } + + /** + * The cache key. Includes the resolver name, so a grid served by a different resolver is a + * different cache entry: two resolvers may legitimately hold different files under the same name, + * and conflating them is how a cache turns a resolution question into a wrong answer. + * + *

The separator is NUL, and it is spelled {@code '\0'} rather than written as a raw byte. + * NUL is the right separator: {@code ResourceNames} refuses any character {@code <= ' '} in a + * grid name, so it is the one character that cannot appear in either half, and a printable + * separator such as a space would let {@code ("a b", "c")} and {@code ("a", "b c")} collide on + * one entry — two different files under one key, which is the wrong-answer shape this key + * exists to prevent. But it was written as a literal NUL byte in the source, which + * renders as a space in most viewers and made this entire file binary to {@code grep}: a plain + * {@code grep} for any identifier in it returned nothing at all. That is the exact failure this + * project has been bitten by three times, so the character is now an escape and the file is + * ASCII again. Same char, same key, same behaviour. + */ + static String key(String resolverName, String gridName) { + return resolverName + '\0' + gridName; + } + + /** + * Returns the cached grid for {@code (resolverName, gridName)}, loading it at most once even + * under concurrent demand. + * + * @throws IOException the loader's failure, replayed identically on every subsequent call for the + * same key. + */ + public T get(String resolverName, String gridName, Loader loader) throws IOException { + final String k = key(resolverName, gridName); + FutureTask task = entries.get(k); + boolean mine = false; + if (task == null) { + final Loader l = loader; + FutureTask created = new FutureTask(new java.util.concurrent.Callable() { + @Override + public T call() throws IOException { + return l.load(); + } + }); + FutureTask existing = entries.putIfAbsent(k, created); + if (existing == null) { + task = created; + mine = true; + misses.incrementAndGet(); + task.run(); + } else { + task = existing; + hits.incrementAndGet(); + } + } else { + hits.incrementAndGet(); + } + + T grid; + try { + grid = task.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + // The entry is deliberately LEFT IN PLACE, and this is the second attempt at this line. + // + // Only a waiter can land here: the owning thread runs the FutureTask synchronously, so + // its get() never blocks. The waiter's interrupt says nothing about the file, and the + // load it was waiting on is about to finish successfully on the owner's thread. + // Removing the mapping here -- which InitFileCache does, and which this class briefly + // did -- throws away a good load AND races the owner: the owner then admits a key that + // is no longer in `entries`, leaving a byte charge in the budget with nothing behind it + // that can only be released by eviction. So the interrupt propagates and the cache is + // untouched; the next caller gets the grid the owner cached. + throw new IOException("Interrupted while loading grid " + gridName, e); + } catch (CancellationException e) { + // Unreachable today -- nothing in proj4j cancels these tasks -- and removed rather than + // retained if it ever becomes reachable, because a cancelled FutureTask never completes + // and would otherwise replay CancellationException for every later caller, forever. + // Distinct from the interrupt above precisely because there is no pending success to + // race. Untested, for want of a way to reach it that is not itself a fiction. + entries.remove(k, task); + throw new IOException("Grid load cancelled for " + gridName, e); + } catch (ExecutionException e) { + // Cached, and now accounted for. A corrupt grid must fail the same way on row + // 4,000,000 as on row 1, so the failure is retained -- but it is charged, and therefore + // evictable, because the key contains an untrusted +nadgrids= token. + if (mine) { + admit(k, FAILURE_WEIGHT_BYTES); + } else { + touch(k); + } + Throwable cause = e.getCause(); + if (cause instanceof IOException) { + // Rethrow a fresh instance: the cached one would accumulate every caller's stack. + throw new IOException(cause.getMessage(), cause); + } + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + if (cause instanceof Error) { + throw (Error) cause; + } + throw new IOException("Failed to load grid " + gridName, cause); + } + + if (mine) { + // A loader is not permitted to return null, but charging a null the failure weight + // rather than zero means a misbehaving one cannot install a free, unevictable entry. + admit(k, grid == null ? FAILURE_WEIGHT_BYTES : grid.sizeBytes()); + } else { + touch(k); + } + return grid; + } + + private void admit(String k, long bytes) { + if (bytes > budget.maxBytes()) { + // Larger than the entire budget. Serve it, do not retain it: retaining it would park + // the cache permanently over its ceiling, because the just-admitted entry is exempt + // from eviction. InitFileCache makes the same call for an oversized dictionary. + entries.remove(k); + return; + } + List evict = budget.admit(new Budget.Key(this, k), bytes); + for (int i = 0; i < evict.size(); i++) { + Budget.Key gone = evict.get(i); + gone.cache.entries.remove(gone.name); + gone.cache.evictions.incrementAndGet(); + } + } + + private void touch(String k) { + budget.touch(new Budget.Key(this, k)); + } + + /** Number of cached grids, including cached failures. */ + public int size() { + return entries.size(); + } + + /** + * Bytes currently retained by this cache. The budget is shared with the other + * one, so this can be below {@link #maxBytes()} while the shared total is at it. + */ + public long bytes() { + return budget.bytesOf(this); + } + + /** Bytes retained across every cache sharing this budget; never above {@link #maxBytes()}. */ + public long sharedBytes() { + return budget.currentBytes(); + } + + /** The shared ceiling. Both {@link #instance()} and {@link #vertical()} report the same value. */ + public long maxBytes() { + return budget.maxBytes(); + } + + public long hitCount() { + return hits.get(); + } + + public long missCount() { + return misses.get(); + } + + public long evictionCount() { + return evictions.get(); + } + + /** + * Empties the cache. Intended for tests and for an application that has deliberately changed the + * resolver chain; a running pipeline should never need it. + */ + public void clear() { + entries.clear(); + budget.forget(this); + } + + @Override + public String toString() { + return "GridCache[" + size() + " grids, " + bytes() + " of " + budget.currentBytes() + + " shared / " + budget.maxBytes() + " bytes, " + hits.get() + " hits, " + + misses.get() + " misses, " + evictions.get() + " evictions]"; + } + + /** + * The byte budget, shared by every cache that draws on it. + * + *

Extracted from {@code GridCache} for one reason: there are two caches and there was one + * documented ceiling, and before this the two each took that ceiling in full. Keeping the + * accounting in an object they share is what makes {@code proj4j.grids.cacheBytes} a bound on + * the process rather than on an instance. + * + *

The monitor is never held across I/O, and {@link #admit} returns the keys to drop instead + * of dropping them, so no cache's entry map is ever touched under this lock. That is the same + * shape the per-instance version had, and it is what keeps the two locks from nesting. + */ + static final class Budget { + + /** Which cache an accounted entry belongs to, so eviction can reach the right entry map. */ + static final class Key { + final GridCache cache; + final String name; + + Key(GridCache cache, String name) { + this.cache = cache; + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Key)) { + return false; + } + Key k = (Key) o; + return cache == k.cache && name.equals(k.name); + } + + @Override + public int hashCode() { + return System.identityHashCode(cache) * 31 + name.hashCode(); + } + } + + private final long maxBytes; + + /** Access-ordered LRU bookkeeping. Guarded by {@code this}; never held across I/O. */ + private final LinkedHashMap lru = new LinkedHashMap(16, 0.75f, true); + + private long currentBytes; + + Budget(long maxBytes) { + this.maxBytes = maxBytes; + } + + long maxBytes() { + return maxBytes; + } + + synchronized long currentBytes() { + return currentBytes; + } + + synchronized long bytesOf(GridCache cache) { + long total = 0L; + for (Map.Entry e : lru.entrySet()) { + if (e.getKey().cache == cache) { + total += e.getValue().longValue(); + } + } + return total; + } + + /** @return the entries to drop, in eviction order; never null, usually empty */ + List admit(Key k, long bytes) { + List evict = Collections.emptyList(); + synchronized (this) { + Long prior = lru.put(k, Long.valueOf(bytes)); + currentBytes += bytes - (prior == null ? 0L : prior.longValue()); + if (currentBytes > maxBytes) { + evict = new ArrayList(); + Iterator> it = lru.entrySet().iterator(); + while (it.hasNext() && currentBytes > maxBytes) { + Map.Entry oldest = it.next(); + if (oldest.getKey().equals(k)) { + // Never evict what was just admitted. GridCache.admit refuses anything + // larger than the whole budget outright, so this can only ever defer a + // trim to the next admission -- it cannot leave the cache over budget + // indefinitely, which is what it used to do. + continue; + } + currentBytes -= oldest.getValue().longValue(); + evict.add(oldest.getKey()); + it.remove(); + } + } + } + return evict; + } + + synchronized void touch(Key k) { + lru.get(k); + } + + /** Drops every accounted entry belonging to {@code cache}. */ + synchronized void forget(GridCache cache) { + Iterator> it = lru.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry e = it.next(); + if (e.getKey().cache == cache) { + currentBytes -= e.getValue().longValue(); + it.remove(); + } + } + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/GridExtents.java b/core/src/main/java/org/locationtech/proj4j/datum/GridExtents.java new file mode 100644 index 0000000..32c6b2a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/GridExtents.java @@ -0,0 +1,309 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.datum; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * The one place a binary reader turns declared dimensions into an allocation size. + * + *

The defect this exists to make impossible

+ * + *

Five readers had the same shape: validate the inputs, then multiply them into an + * unchecked {@code int} and allocate on the result, with no comparison against how many bytes the file + * actually holds. {@code CTABLEV2} bounded each axis to {@code 1..100000} and then computed + * {@code 100000 * 100000}, which is not 1010 but 1,410,065,408 — 5.25 GiB + * of references demanded by a 160-byte header. {@code NTV1} validated nothing at all: + * a zero increment makes the quotient infinite, {@code (int)} saturates to {@code Integer.MAX_VALUE}, + * and the {@code + 1} wraps to {@code Integer.MIN_VALUE}. A 634-byte GeoTIFF declaring + * {@code 40000 x 40000} asked for 6.4 GB, an amplification of ten million to one. + * + *

The rule

+ * + *

Compute every extent in {@code long}, reject before allocating, and compare the + * product against the length of the thing the elements must fit inside. That pattern is not invented + * here; it is {@link VerticalGrid#parseGtx}, which already does exactly this — + * {@code long expected = 40L + 4L * rows * columns} compared against {@code bytes.length} — and it is + * copied rather than re-derived so that five readers cannot drift into five subtly different + * behaviours. + * + *

Which limit applies where

+ * + *

{@link #checkedCount} takes the limit as a parameter because the honest bound differs by reader, + * and pretending otherwise would be wrong in one direction or the other: + * + *

    + *
  • Uncompressed formats — {@code CTABLE V2}, {@code NTv1}, {@code NTv2}, the + * {@code .pjdx} sections — are bounded by the actual file or section length. Nodes that + * are not in the file cannot be read, so a declaration bigger than the file is a lie and is + * refused for what it is.
  • + *
  • GeoTIFF is not, because DEFLATE means a small file can legitimately decode to + * a much larger plane. Its bound is therefore a decoded-heap budget, + * {@link #maxDecodedBytes()}, and the file-length half of the check is done where it is + * meaningful: on each block, against {@code blockByteCounts}.
  • + *
+ * + *

Both default limits derive from the ceiling {@code Grid} already applies to a grid file + * ({@code proj4j.grids.maxFileBytes}, 128 MiB), so there is one knob and not three. + * + *

What this class is not

+ * + *

It is not a policy layer and it holds no state. Every method either returns a value the caller can + * safely allocate on, or throws {@link GridFormatException}. There is no "clamp to the maximum" path: + * silently shrinking a declared grid would produce a smaller grid that still answers, which is the + * failure mode this project exists to eliminate. + * + * @since 1.5 + */ +public final class GridExtents { + + private GridExtents() { + } + + /** + * Largest legal value for a single axis, in nodes. + * + *

100,000 is {@code CTABLEV2}'s own pre-existing limit, promoted to apply everywhere rather than + * relaxed. It is never the binding constraint for a real grid: the widest published PROJ grid is + * {@code egm2008-1} at 43,200 columns, and any grid wide enough for this to matter would have + * already failed the byte-count check by three orders of magnitude. Its only job is to keep the + * subsequent {@code columns * rows} multiplication inside {@code long} with room to spare — + * 1010 at the very worst, against a {@code long} ceiling of 9.2×1018. + */ + public static final long MAX_EXTENT = 100000L; + + /** Never produce an {@code int} array length that a JVM would refuse anyway. */ + private static final long MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8L; + + /** + * The ceiling {@code Grid.resolveAndLoad} applies to a grid file, and therefore the largest number + * of bytes any uncompressed reader can ever legitimately be asked to consume. + * + *

Read from {@code proj4j.grids.maxFileBytes}, default 128 MiB — the same property and the same + * default {@code Grid} uses, so the two cannot disagree about what "too big" means. + */ + public static long maxFileBytes() { + return longProperty("proj4j.grids.maxFileBytes", 128L * 1024L * 1024L); + } + + /** + * The ceiling on a single decoded sample plane, for the one format where the file length is not an + * upper bound on the decoded size. + * + *

Read from {@code proj4j.grids.maxDecodedBytes}, default four times {@link #maxFileBytes()}, + * i.e. 512 MiB. Four is chosen so a DEFLATE-compressed grid that fills the file budget can still + * expand at a realistic ratio for float32 raster data; every hostile case measured needed between + * 4 GB and 34 GB, so the margin is not close. + */ + public static long maxDecodedBytes() { + return longProperty("proj4j.grids.maxDecodedBytes", 4L * maxFileBytes()); + } + + private static long longProperty(String name, long fallback) { + String raw = System.getProperty(name); + if (raw != null) { + try { + long v = Long.parseLong(raw.trim()); + if (v > 0) { + return v; + } + } catch (NumberFormatException e) { + // fall through to the default, exactly as Grid.maxGridFileBytes does + } + } + return fallback; + } + + /** + * Turns a node count computed in floating point into a validated axis length. + * + *

{@code NTv1} and {@code NTv2} derive their extents as + * {@code (int) (|span| / increment + 0.5) + 1}, which has three separate ways to produce nonsense + * from a header the reader accepted: + * + * + * + * + * + * + * + * + * + *
measured against the readers before this method existed
headerquotient{@code lim}
{@code LAT_INC = 0}{@code Infinity}{@code (int)} saturates to {@code MAX_VALUE}, {@code +1} wraps to + * {@code Integer.MIN_VALUE}
{@code LAT_INC = 1e-300}~10302{@code Integer.MIN_VALUE}, both axes
span 0 and increment 0{@code NaN}{@code (int) NaN} is 0, so {@code 1} — a plausible 1×1 grid built + * from a header that describes nothing
+ * + *

The last row is the dangerous one and the reason this returns rather than clamps: it produced + * no exception, no warning, and a grid that goes on to answer. + * + *

For every input this accepts, {@code (int) nodes + 1} is bit-identical to what the readers + * computed before, so no legitimate grid changes shape. {@code nodes >= 0.5} is exactly the + * condition under which {@code (int)} truncation and {@code Math.floor} agree, and it is false for + * {@code NaN} — an unordered comparison — which is why the test is written as a negated {@code >=} + * rather than as {@code < 0.5}. + * + * @param what the file and field, for the message + * @param axis the axis name, for the message + * @param nodes {@code |span| / increment + 0.5}, i.e. the value the reader was about to cast + * @return {@code (int) nodes + 1}, guaranteed to be in {@code 1..MAX_EXTENT} + * @throws GridFormatException if {@code nodes} is {@code NaN}, infinite, negative, or too large + */ + public static int checkedAxis(String what, String axis, double nodes) throws IOException { + if (!(nodes >= 0.5)) { + throw new GridFormatException(what + " has a " + axis + + " extent of " + nodes + " nodes, computed from its span and increment. A grid " + + "axis must be at least one node; a zero, negative, infinite or NaN increment " + + "cannot describe one."); + } + if (nodes >= MAX_EXTENT) { + throw new GridFormatException(what + " declares a " + axis + " extent of " + nodes + + " nodes, which exceeds the " + MAX_EXTENT + "-node limit for a single axis."); + } + return (int) nodes + 1; + } + + /** + * Refuses a declared two-dimensional extent before anything is allocated for it, + * and returns the node count. + * + *

This is the whole of the fix, in one place. Order matters and is not negotiable: + * range-check each axis, multiply in {@code long}, check the count against + * {@code Integer.MAX_VALUE} before multiplying by the element size (or that multiplication + * is the next thing to overflow), then compare the total against the limit. + * + *

The {@link #MAX_EXTENT} per-axis bound belongs to this method and not to + * {@link #checkedCount}, deliberately. It is a statement about grid geometry, and applying + * it to a one-dimensional count would have been a guard that breaks the library: the shipped + * {@code proj4j-db.pjdx} string pool holds 97,930 strings, which is under 100,000 + * only by accident and would be over it after one EPSG release. + * + * @param what the file and section, for the message + * @param columns first axis, in nodes + * @param rows second axis, in nodes + * @param bytesPerElement on-disk bytes per node, or heap bytes per node when the limit is a heap + * budget + * @param baseBytes bytes consumed before the nodes begin — the header, or the node block's + * offset within its section + * @param limitBytes the length of the file, section or budget the nodes must fit inside + * @param limitLabel how to name {@code limitBytes} in the message, e.g. {@code "the file"} + * @return {@code columns * rows}, guaranteed to be a legal {@code int} array length + * @throws GridFormatException if either axis is out of range, or the product does not fit + */ + public static int checkedCount(String what, long columns, long rows, long bytesPerElement, + long baseBytes, long limitBytes, String limitLabel) + throws IOException { + if (columns <= 0 || rows <= 0) { + throw new GridFormatException(what + " declares a non-positive extent of " + + columns + " x " + rows + " nodes."); + } + if (columns > MAX_EXTENT || rows > MAX_EXTENT) { + throw new GridFormatException(what + " declares an extent of " + columns + " x " + rows + + " nodes, and no grid axis may exceed " + MAX_EXTENT + "."); + } + return checkedTotal(what, columns + " x " + rows + " = " + (columns * rows), + columns * rows, bytesPerElement, baseBytes, limitBytes, limitLabel); + } + + /** + * Refuses a declared one-dimensional count before anything is allocated for it. + * + *

Used by every allocation in the {@code .pjdx} reader — the string pool, each table's key and + * row-offset arrays, each index's tuple array — where the honest bound is the declaring section's + * own length and nothing else. {@code stringCount} was checked only for {@code < 0}, so + * {@code (stringCount + 1) * 4} wrapped negative at 229 while + * {@code new int[stringCount + 1]} still asked for 2 GB; {@code Table} and {@code Index} validated + * nothing at all. + * + * @param count the declared number of elements + * @return {@code count}, guaranteed to be a legal {@code int} array length + */ + public static int checkedCount(String what, long count, long bytesPerElement, long baseBytes, + long limitBytes, String limitLabel) throws IOException { + if (count < 0) { + throw new GridFormatException(what + " declares a negative count of " + count + + " elements."); + } + return checkedTotal(what, String.valueOf(count), count, bytesPerElement, baseBytes, + limitBytes, limitLabel); + } + + private static int checkedTotal(String what, String shape, long count, long bytesPerElement, + long baseBytes, long limitBytes, String limitLabel) + throws IOException { + if (count > MAX_ARRAY_LENGTH) { + throw new GridFormatException(what + " declares " + shape + + " elements, which cannot be an array length."); + } + long needed = baseBytes + count * bytesPerElement; + if (needed > limitBytes) { + throw new GridFormatException(what + " declares " + shape + " elements, which needs " + + needed + " bytes, exceeding " + limitLabel + " of " + limitBytes + + " bytes. A header cannot declare more data than the file holds."); + } + return (int) count; + } + + /** + * The number of bytes still to come from {@code definition}, or {@code -1} when the stream declines + * to say. + * + *

Why {@code available()} is the right question here, and where it stops being right

+ * + *

{@code Grid.parse} constructs every stream these readers see with + * {@code Resources.asDataStream(byte[])}, which is a {@code DataInputStream} over a + * {@code ByteArrayInputStream} — a stream whose {@code available()} is specified to be the exact + * remaining count and is O(1). For that stream, and for a {@code FileInputStream} or a + * {@code BufferedInputStream} over either, this returns the true remaining length and the + * product-versus-length check is exact. + * + *

It is not exact for a stream that decodes as it goes — {@code GZIPInputStream} + * reports 1 while data remains — and the honest statement is that such a stream would be refused. + * That is bounded and deliberate rather than accidental: these two readers consume the entire + * declared extent with {@code readFully} a few lines later, so a stream that cannot say how much it + * holds is a stream that was about to be drained anyway. No caller in this codebase supplies one, + * and {@code GridBinaryReaderSecurityTest} pins the {@code BufferedInputStream} case as a + * positive control so the coupling cannot rot silently. + * + *

The value is a bound on the check, never on the allocation: when this returns {@code -1} the + * callers fall back to {@link #maxFileBytes()}, so the guard never disappears. + */ + public static long remaining(DataInputStream definition) { + try { + int n = definition.available(); + return n > 0 ? n : -1L; + } catch (IOException e) { + return -1L; + } + } + + /** + * {@code InputStream.skip} is permitted to skip fewer bytes than asked, which on a buffered or + * decompressing stream silently mis-aligns everything that follows — every node then comes from the + * wrong offset, which is a plausible coordinate rather than an error. + */ + public static void skipFully(DataInputStream in, int n, String what) throws IOException { + int done = 0; + while (done < n) { + int skipped = in.skipBytes(n - done); + if (skipped <= 0) { + throw new GridFormatException(what + " is truncated: wanted " + n + + " header bytes, could only skip " + done); + } + done += skipped; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/GridFormatException.java b/core/src/main/java/org/locationtech/proj4j/datum/GridFormatException.java new file mode 100644 index 0000000..d9ad515 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/GridFormatException.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.datum; + +import java.io.IOException; + +/** + * Thrown when a binary grid or database file declares a structure the bytes cannot support: an extent + * whose node count does not fit the file, a non-positive or non-finite dimension, or a count whose + * product would overflow the {@code int} that sizes the array. + * + *

Why a named type, and why an {@code IOException}

+ * + *

The failures this replaces were unnamed and unbounded. Measured against the readers as + * they stood, a hostile header produced one of four things, none of them an in-family exception: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
what the five sites did before this type existed
inputoutcome
160-byte {@code CTABLE V2} declaring 100000×100000{@code OutOfMemoryError} — 1,410,065,408 references, 5.25 GiB
{@code NTv1} with a zero latitude incrementno exception; {@code lim.phi} = {@code Integer.MIN_VALUE}
{@code NTv1} with a zero span and a zero incrementno exception; {@code NaN} truncated to a plausible 1×1 grid
634-byte GeoTIFF declaring 40000×40000{@code OutOfMemoryError} — 6.4 GB, a 10,000,000:1 amplification
1,290-byte GeoTIFF declaring 65536×65536{@code ArrayIndexOutOfBoundsException: Index -65536 out of bounds for length 0}
358-byte GeoTIFF with {@code PlanarConfig=3} and 228 samples{@code OutOfMemoryError} — two {@code double[]}, 4 GB
+ * + *

{@code OutOfMemoryError} is an {@link Error}: it escapes {@code catch (Proj4jException)} + * and {@code catch (Exception)}, and it is not attributable to the grid that caused it. + * {@code ArrayIndexOutOfBoundsException} is unchecked, so it escapes the {@code catch (IOException)} in + * {@link Grid#fromNadGrids} while being caught — anonymously — by the {@code catch (RuntimeException)} + * in {@link Grid#describeNadGrids}. Neither says which grid, which field, or what the file actually + * contained. + * + *

Extending {@link IOException} rather than inventing a new root is deliberate: every existing + * handler on the grid path already catches {@code IOException} — {@code Grid.fromNadGrids}, + * {@code Grid.describeNadGrids}, {@code GridCache} — so the conversion is caught rather than newly + * escaping. The named subtype exists so a test can assert the type and not just a substring of + * a message. + * + * @since 1.5 + */ +public class GridFormatException extends IOException { + + private static final long serialVersionUID = 1L; + + /** + * @param message must name the file, the field, the declared value and the bound it violated + */ + public GridFormatException(String message) { + super(message); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/NTV1.java b/core/src/main/java/org/locationtech/proj4j/datum/NTV1.java index e9def1a..05f370d 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/NTV1.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/NTV1.java @@ -40,15 +40,24 @@ public static boolean testHeader(byte[] header) { containsAt(magic3, header, 144); } + /** Each node is two big-endian {@code double}s: a latitude shift and a longitude shift. */ + private static final int BYTES_PER_NODE = 16; + public static Grid.ConversionTable init(DataInputStream definition) throws IOException { byte[] header = new byte[160]; definition.readFully(header); - if (!testHeader(header)) throw new Error("Not a NTV1 file"); + // Was `throw new Error(...)` on both of these. An Error escapes catch (Proj4jException) AND + // catch (Exception); both are reachable from a +nadgrids= token, which is untrusted per-row + // input, so neither may leave the IOException family. + if (!testHeader(header)) { + throw new GridFormatException("Not a NTV1 file"); + } // Minimal validation to detect corrupt structure int recordCount = intFromBytes(header, 8); if (recordCount != 12) { - throw new Error(String.format("NTv1 grid shift file has wrong record count, corrupt? $0%08X $0", recordCount)); + throw new GridFormatException(String.format( + "NTv1 grid shift file has wrong record count, corrupt? $0%08X $0", recordCount)); } Grid.ConversionTable table = new Grid.ConversionTable(); @@ -56,9 +65,22 @@ public static Grid.ConversionTable init(DataInputStream definition) throws IOExc table.ll = new PolarCoordinate(-doubleFromBytes(header, 72), doubleFromBytes(header, 24)); PolarCoordinate ur = new PolarCoordinate(-doubleFromBytes(header, 56), doubleFromBytes(header, 40)); table.del = new PolarCoordinate(doubleFromBytes(header, 104), doubleFromBytes(header, 88)); + // This header carried NO validation at all. Measured on the code this replaces: a zero + // LAT_INC made the quotient infinite, `(int)` saturated to MAX_VALUE and the `+ 1` wrapped to + // Integer.MIN_VALUE; a zero span with a zero increment made it NaN, `(int) NaN` is 0, and the + // reader built a plausible 1x1 grid out of a header describing nothing and reported success. table.lim = new IntPolarCoordinate( - (int) (Math.abs(ur.lam - table.ll.lam) / table.del.lam + 0.5) + 1, - (int) (Math.abs(ur.phi - table.ll.phi) / table.del.phi + 0.5) + 1); + GridExtents.checkedAxis("NTv1 grid shift file", "longitude", + Math.abs(ur.lam - table.ll.lam) / table.del.lam + 0.5), + GridExtents.checkedAxis("NTv1 grid shift file", "latitude", + Math.abs(ur.phi - table.ll.phi) / table.del.phi + 0.5)); + long haveBytes = GridExtents.remaining(definition); + // init() has consumed 160 of the 192 header bytes, so what remains still holds the last two + // 16-byte records before the nodes begin. + GridExtents.checkedCount("NTv1 grid shift file", table.lim.lam, table.lim.phi, BYTES_PER_NODE, + DATA_OFFSET - 160L, + haveBytes >= 0 ? haveBytes : GridExtents.maxFileBytes(), + haveBytes >= 0 ? "the remaining file" : "the grid-file ceiling"); table.ll.lam *= DTR; table.ll.phi *= DTR; table.del.lam *= DTR; @@ -66,21 +88,53 @@ public static Grid.ConversionTable init(DataInputStream definition) throws IOExc return table; } + /** + * Byte offset of the first grid-shift record. + *

+ * 192, not 176. An NTv1 header is twelve 16-byte records + * ({@code HEADER NUM_OREC NUM_SREC NUM_FILE S_LAT N_LAT E_LONG W_LONG N_GRID W_GRID TYPE FROM TO + * ...}), and PROJ 9.8.1 seeks {@code 192 + 16 * index} ({@code src/grids.cpp}, + * {@code NTv1Grid::valueAt}). Proj4J 1.4.3 skipped 176, which is exactly one 16-byte node short, + * so every interpolated value came from the node one column east of the correct one -- a + * plausible, finite, roughly 0.25°-displaced answer. The arithmetic also proves 192: the + * shipped {@code ntv1_can.dat} is 1,113,184 bytes = 192 header + 393×177×16 node bytes + * + one 16-byte trailing {@code END} record, which 176 cannot account for. + */ + private static final int DATA_OFFSET = 192; + public static void load(DataInputStream definition, Grid grid) throws IOException { - definition.skip(176); + GridExtents.skipFully(definition, DATA_OFFSET, "NTv1 grid shift file"); + // Re-checked rather than trusted from init(): load() is public, takes its own stream, and + // reads grid.table -- which a caller, not init(), may have populated. Without this, + // `lim.lam * lim.phi` is an unchecked int product and `lim.lam * 2` overflows on its own. + long haveBytes = GridExtents.remaining(definition); + int nodeCount = GridExtents.checkedCount("NTv1 grid shift file", + grid.table.lim.lam, grid.table.lim.phi, BYTES_PER_NODE, 0L, + haveBytes >= 0 ? haveBytes : GridExtents.maxFileBytes(), + haveBytes >= 0 ? "the remaining file" : "the grid-file ceiling"); double[] row_buff = new double[grid.table.lim.lam * 2]; - FloatPolarCoordinate[] tmp_cvs = - new FloatPolarCoordinate[grid.table.lim.lam * grid.table.lim.phi]; + FloatPolarCoordinate[] tmp_cvs = new FloatPolarCoordinate[nodeCount]; for (int row = 0; row < grid.table.lim.phi; row++) { byte[] byteBuff = new byte[8 * row_buff.length]; definition.readFully(byteBuff); ByteBuffer.wrap(byteBuff).order(ByteOrder.BIG_ENDIAN).asDoubleBuffer().get(row_buff); for (int i = 0; i < grid.table.lim.lam; i++) { + // Each record is (latitude shift, longitude shift), both in arc seconds, and NTv1 is + // organised east to west -- hence the reversed column index. + // + // 1.4.3 assigned row_buff[2i] (the LATITUDE shift) to .lam and row_buff[2i+1] (the + // LONGITUDE shift) to .phi, i.e. the two components were transposed. PROJ 9.8.1's + // NTv1Grid::valueAt is unambiguous: latShift = two_doubles[0], + // longShift = -two_doubles[1]. The sign difference is proj4j's opposite convention -- + // Grid.nad_cvt does `in.lam -= t.lam` where PROJ does `in.lam += t.lam` -- so the + // unnegated longitude shift belongs in .lam. Both errors were small enough + // individually to look like a plausible coordinate; together they cost ~13 m at + // Chicago. tmp_cvs[row * grid.table.lim.lam + grid.table.lim.lam - i - 1] = new FloatPolarCoordinate( - (float) (row_buff[2 * i] * Math.PI / 180.0 / 3600.0), - (float) (row_buff[2 * i + 1] * Math.PI / 180.0 / 3600.0)); + (float) (row_buff[2 * i + 1] * Math.PI / 180.0 / 3600.0), + (float) (row_buff[2 * i] * Math.PI / 180.0 / 3600.0)); } } grid.table.cvs = tmp_cvs; diff --git a/core/src/main/java/org/locationtech/proj4j/datum/NTV2.java b/core/src/main/java/org/locationtech/proj4j/datum/NTV2.java index 303152d..60fe436 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/NTV2.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/NTV2.java @@ -20,19 +20,30 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.locationtech.proj4j.util.FloatPolarCoordinate; import org.locationtech.proj4j.util.IntPolarCoordinate; import org.locationtech.proj4j.util.PolarCoordinate; /** - * Parser for the "National Transformation" v2 format + * Parser for the "National Transformation" v2 format (.gsb). * - * Very basic implementation: only files with 1 subfile are supported, gridshift type is supposed to be in - * seconds + *

Supports multiple subgrids and arbitrarily deep parent/child hierarchies, which + * is the normal case for real NTv2 files: {@code ca_nrc_ntv2_0.gsb} has four regional grids plus three + * high-resolution children, and {@code uk_os_OSTN15_NTv2_OSGBtoETRS.gsb} likewise. Proj4J 1.4.3 read + * only the first subgrid and silently used it for the whole file, so any point covered by a later + * subgrid got either the wrong (coarse parent) shift or, more often, no shift at all while the + * transform still reported success. * - * Header structure: + *

Only {@code GS_TYPE = SECONDS} is supported, as in PROJ 9.8.1; anything else is rejected rather + * than silently mis-scaled. + * + *

Header structure: *

  * 0        8        16
  * |NUM_OREC|iiii    |
@@ -84,8 +95,14 @@ public final class NTV2 {
     private static final int HEADER_SIZE = 176;
     private static final int SUB_HEADER_SIZE = 176;
     private static final int VALUES_PER_CELL = 4;
+    private static final int BYTES_PER_CELL = VALUES_PER_CELL * 4;
 
     private static final int NUM_OREC = 8;
+    private static final int NUM_FILE = 40;
+    private static final int GS_TYPE = 56;
+
+    private static final int SUB_NAME = 8;
+    private static final int PARENT = 24;
     private static final int S_LAT = 72;
     private static final int N_LAT = 88;
     private static final int E_LONG = 104;
@@ -93,6 +110,7 @@ public final class NTV2 {
 
     private static final int LAT_INC = 136;
     private static final int LONG_INC = 152;
+    private static final int GS_COUNT = 168;
 
     /**
      * Use header to check file type
@@ -101,54 +119,244 @@ public final class NTV2 {
      * @return true if format is NTv2
      */
     public static boolean testHeader(byte[] header) {
+        if (header == null || header.length < MAGIC.length) {
+            return false;
+        }
         byte[] start = Arrays.copyOfRange(header, 0, MAGIC.length);
         return Arrays.equals(start, MAGIC);
     }
 
     /**
-     * Initialize conversion table
+     * Reads every subgrid in an NTv2 file and wires them into the parent/child hierarchy that
+     * {@link Grid#shift} descends.
      *
-     * @param instream
-     * @return
-     * @throws IOException
+     * 

Single-subgrid files are represented exactly as before -- {@code grid.table} holds the one + * subgrid, with no children -- so the common case is bit-for-bit unchanged. Multi-subgrid files get + * a synthetic bounding parent whose {@code cvs} is {@code null}: it exists only so the extent + * pre-filter in {@code Grid.shift} admits the file, and because its node array is null it can + * never itself supply a shift. */ + static void loadAll(byte[] bytes, Grid grid) throws IOException { + loadAll(bytes, grid, grid.getGridName(), grid.getOrigin(), grid.getResolverName()); + } + + static void loadAll(byte[] bytes, Grid grid, String fileGridName, String origin, + String resolverName) throws IOException { + if (bytes.length < HEADER_SIZE) { + throw new IOException("NTv2 file is shorter than its 176-byte overview header"); + } + if (!testHeader(bytes)) { + throw new IOException("Not a NTv2 file"); + } + ByteOrder endian = guessByteOrder(bytes); + + // PROJ 9.8.1 rejects anything but SECONDS (grids.cpp, NTv2GridSet::open). 1.4.3 assumed it. + String gsType = new String(bytes, GS_TYPE, 8, StandardCharsets.US_ASCII).trim(); + if (!"SECONDS".equals(gsType)) { + throw new IOException("NTv2 file declares GS_TYPE='" + gsType + + "'; only SECONDS is supported"); + } + + int subFileCount = intFromBytes(bytes, NUM_FILE, endian); + if (subFileCount < 1 || subFileCount > 100000) { + throw new IOException("NTv2 file declares an implausible NUM_FILE of " + subFileCount); + } + + List roots = new ArrayList(); + Map byName = new HashMap(); + + int offset = HEADER_SIZE; + for (int sub = 0; sub < subFileCount; sub++) { + if (offset + SUB_HEADER_SIZE > bytes.length) { + throw new IOException("NTv2 file truncated before subgrid " + sub + " header"); + } + String subName = new String(bytes, offset + SUB_NAME, 8, StandardCharsets.US_ASCII).trim(); + String parentName = new String(bytes, offset + PARENT, 8, StandardCharsets.US_ASCII).trim(); + + Grid.ConversionTable table = subHeader(bytes, offset, endian, + subName.isEmpty() ? "NTv2 Grid Shift File" : "NTv2 Grid Shift File: " + subName); + int cells = intFromBytes(bytes, offset + GS_COUNT, endian); + // `lim.lam * lim.phi` was an unchecked int product. A subgrid header with a tiny increment + // saturated both axes to Integer.MIN_VALUE (see GridExtents.checkedAxis, now applied in + // subHeader), whose product wraps positive; a matching GS_COUNT then walked straight past + // the equality test below, and the `(long) cells * BYTES_PER_CELL` truncation check below + // is satisfied by any negative `cells`. + int expected = GridExtents.checkedCount( + "NTv2 subgrid " + (subName.isEmpty() ? String.valueOf(sub) : subName), + table.lim.lam, table.lim.phi, BYTES_PER_CELL, + (long) offset + SUB_HEADER_SIZE, bytes.length, "the file"); + if (cells != expected) { + throw new IOException("NTv2 subgrid " + subName + " declares GS_COUNT=" + cells + + " but its extent and increments imply " + table.lim.lam + "x" + + table.lim.phi + " = " + expected + " cells"); + } + int dataOffset = offset + SUB_HEADER_SIZE; + long dataLength = (long) cells * BYTES_PER_CELL; + if (dataOffset + dataLength > bytes.length) { + throw new IOException("NTv2 file truncated inside subgrid " + subName); + } + table.cvs = readCells(bytes, dataOffset, table.lim.lam, table.lim.phi, endian); + + Grid subGrid = new Grid(); + subGrid.table = table; + subGrid.describeAs(fileGridName + "#" + (subName.isEmpty() ? String.valueOf(sub) : subName), + "ntv2", origin, resolverName); + Grid parent = parentName.isEmpty() || "NONE".equals(parentName) ? null : byName.get(parentName); + if (parent == null) { + roots.add(subGrid); + } else { + appendChild(parent, subGrid); + } + if (!subName.isEmpty()) { + byName.put(subName, subGrid); + } + + offset = (int) (dataOffset + dataLength); + } + + if (roots.isEmpty()) { + throw new IOException("NTv2 file declares " + subFileCount + + " subgrid(s) but none of them is a top-level grid"); + } + + if (roots.size() == 1 && roots.get(0).getChild() == null) { + // Exactly the 1.4.3 shape for a single-subgrid file. + grid.table = roots.get(0).table; + grid.setChild(null); + return; + } + + grid.table = boundingTable(roots); + Grid previous = null; + for (Grid root : roots) { + if (previous == null) { + grid.setChild(root); + } else { + previous.setNext(root); + } + previous = root; + } + } + + private static void appendChild(Grid parent, Grid child) { + Grid existing = parent.getChild(); + if (existing == null) { + parent.setChild(child); + return; + } + while (existing.getNext() != null) { + existing = existing.getNext(); + } + existing.setNext(child); + } + + /** + * A synthetic table spanning every root subgrid, with a null node array. Only the extent and the + * cell size are meaningful; the cell size is the finest of the roots so the derived {@code lim} + * never under-covers the union. + */ + private static Grid.ConversionTable boundingTable(List roots) throws IOException { + double west = Double.POSITIVE_INFINITY; + double south = Double.POSITIVE_INFINITY; + double east = Double.NEGATIVE_INFINITY; + double north = Double.NEGATIVE_INFINITY; + double delLam = Double.POSITIVE_INFINITY; + double delPhi = Double.POSITIVE_INFINITY; + for (Grid root : roots) { + double[] e = root.extentRadians(); + west = Math.min(west, e[0]); + south = Math.min(south, e[1]); + east = Math.max(east, e[2]); + north = Math.max(north, e[3]); + delLam = Math.min(delLam, Math.abs(root.table.del.lam)); + delPhi = Math.min(delPhi, Math.abs(root.table.del.phi)); + } + Grid.ConversionTable bounds = new Grid.ConversionTable(); + bounds.id = "NTv2 Grid Shift File (bounding box of " + roots.size() + " root subgrids)"; + bounds.ll = new PolarCoordinate(west, south); + bounds.del = new PolarCoordinate(delLam, delPhi); + // The increments here are the *finest* of the roots while the extent is the *union*, so the + // quotient can exceed anything a single subgrid could -- this is the one place a set of + // individually valid subgrids can still produce a wrapped extent. + bounds.lim = new IntPolarCoordinate( + GridExtents.checkedAxis(bounds.id, "longitude", Math.ceil((east - west) / delLam)), + GridExtents.checkedAxis(bounds.id, "latitude", Math.ceil((north - south) / delPhi))); + bounds.cvs = null; + return bounds; + } + + private static Grid.ConversionTable subHeader(byte[] b, int off, ByteOrder endian, String id) + throws IOException { + Grid.ConversionTable table = new Grid.ConversionTable(); + table.id = id; + // lower left + table.ll = new PolarCoordinate(-doubleFromBytes(b, off + W_LONG, endian) * SEC_RAD, + doubleFromBytes(b, off + S_LAT, endian) * SEC_RAD); + // upper right + PolarCoordinate ur = new PolarCoordinate(-doubleFromBytes(b, off + E_LONG, endian) * SEC_RAD, + doubleFromBytes(b, off + N_LAT, endian) * SEC_RAD); + table.del = new PolarCoordinate(doubleFromBytes(b, off + LONG_INC, endian) * SEC_RAD, + doubleFromBytes(b, off + LAT_INC, endian) * SEC_RAD); + // Same saturating-cast defect as NTv1's, in the same expression: a zero or denormal increment + // makes the quotient infinite, `(int)` saturates and the `+ 1` wraps negative. + table.lim = new IntPolarCoordinate( + GridExtents.checkedAxis(id, "longitude", + Math.abs(ur.lam - table.ll.lam) / table.del.lam + 0.5), + GridExtents.checkedAxis(id, "latitude", + Math.abs(ur.phi - table.ll.phi) / table.del.phi + 0.5)); + return table; + } + + private static FloatPolarCoordinate[] readCells(byte[] b, int dataOffset, int cols, int rows, + ByteOrder endian) { + FloatPolarCoordinate[] cvs = new FloatPolarCoordinate[cols * rows]; + float[] rowBuff = new float[cols * VALUES_PER_CELL]; + for (int row = 0; row < rows; row++) { + int rowOffset = dataOffset + row * cols * BYTES_PER_CELL; + ByteBuffer.wrap(b, rowOffset, cols * BYTES_PER_CELL).order(endian).asFloatBuffer().get(rowBuff); + for (int col = 0; col < cols; col++) { + // Record layout is (lat shift, long shift, lat accuracy, long accuracy); the + // accuracies are discarded. NTv2 is organised from east to west, hence the reversed + // column index. + cvs[row * cols + (cols - col - 1)] = new FloatPolarCoordinate( + (float) (rowBuff[VALUES_PER_CELL * col + 1] * SEC_RAD), + (float) (rowBuff[VALUES_PER_CELL * col] * SEC_RAD)); + } + } + return cvs; + } + + /** + * Initialize conversion table from the first subgrid only. + * + * @deprecated single-subgrid only, and therefore wrong for most real NTv2 files. Retained for + * binary compatibility; {@link Grid} uses the multi-subgrid path. + */ + @Deprecated public static Grid.ConversionTable init(DataInputStream instream) throws IOException { byte[] buf = new byte[HEADER_SIZE]; instream.readFully(buf); if (!testHeader(buf)) { - throw new Error("Not a NTv2 file"); + // Was `throw new Error(...)`. Deprecated and unreachable from Grid.parse today, but an + // Error on a public static method is one refactor away from escaping every handler on + // the grid path, so it is converted with the two reachable ones. + throw new GridFormatException("Not a NTv2 file"); } ByteOrder endian = guessByteOrder(buf); - + buf = new byte[SUB_HEADER_SIZE]; instream.readFully(buf); - Grid.ConversionTable table = new Grid.ConversionTable(); - table.id = "NTv2 Grid Shift File"; - // lower left - table.ll = new PolarCoordinate(-doubleFromBytes(buf, W_LONG, endian) * SEC_RAD, - doubleFromBytes(buf, S_LAT, endian) * SEC_RAD); - // upper right - PolarCoordinate ur = new PolarCoordinate(-doubleFromBytes(buf, E_LONG, endian) * SEC_RAD, - doubleFromBytes(buf, N_LAT, endian) * SEC_RAD); - // "creative" way to store a pair of values - table.del = new PolarCoordinate(doubleFromBytes(buf, LONG_INC, endian) * SEC_RAD, - doubleFromBytes(buf, LAT_INC, endian) * SEC_RAD); - table.lim = new IntPolarCoordinate( - (int) (Math.abs(ur.lam - table.ll.lam) / table.del.lam + 0.5) + 1, - (int) (Math.abs(ur.phi - table.ll.phi) / table.del.phi + 0.5) + 1); - - return table; + return subHeader(buf, 0, endian, "NTv2 Grid Shift File"); } /** - * Load grid(sub)file into grid + * Load the first subgrid into grid. * - * @param instream - * @param grid - * @throws IOException + * @deprecated single-subgrid only. See {@link #init(DataInputStream)}. */ + @Deprecated public static void load(DataInputStream instream, Grid grid) throws IOException { int cols = grid.table.lim.lam; int rows = grid.table.lim.phi; @@ -157,33 +365,28 @@ public static void load(DataInputStream instream, Grid grid) throws IOException instream.readFully(buf); ByteOrder endian = guessByteOrder(buf); - instream.skipBytes(SUB_HEADER_SIZE); + readFully(instream, new byte[SUB_HEADER_SIZE]); - FloatPolarCoordinate[] tmp_cvs = new FloatPolarCoordinate[cols * rows]; - - float[] row_buff = new float[cols * VALUES_PER_CELL]; - byte[] byteBuff = new byte[row_buff.length * Float.BYTES]; + long haveBytes = GridExtents.remaining(instream); + int cells = GridExtents.checkedCount("NTv2 Grid Shift File", cols, rows, BYTES_PER_CELL, 0L, + haveBytes >= 0 ? haveBytes : GridExtents.maxFileBytes(), + haveBytes >= 0 ? "the remaining file" : "the grid-file ceiling"); + byte[] data = new byte[cells * BYTES_PER_CELL]; + instream.readFully(data); + grid.table.cvs = readCells(data, 0, cols, rows, endian); + } - for (int row = 0; row < rows; row++) { - instream.readFully(byteBuff); - ByteBuffer.wrap(byteBuff).order(endian).asFloatBuffer().get(row_buff); - for (int col = 0; col < cols; col++) { - // only process the shift values, ignoring accuracy values - tmp_cvs[row * cols + (cols - col - 1)] = new FloatPolarCoordinate( - (float) (row_buff[VALUES_PER_CELL * col + 1] * SEC_RAD), - (float) (row_buff[VALUES_PER_CELL * col] * SEC_RAD)); - } - } - grid.table.cvs = tmp_cvs; + private static void readFully(DataInputStream in, byte[] buf) throws IOException { + in.readFully(buf); } /** * Guess byte order / endianness by checking first bytes in header - * + * * @param header * @return endianness */ - private static ByteOrder guessByteOrder(byte[] header) { + private static ByteOrder guessByteOrder(byte[] header) throws IOException { ByteBuffer buffer = ByteBuffer.wrap(header, NUM_OREC, Integer.BYTES); if (buffer.order(ByteOrder.BIG_ENDIAN).getInt() == 11) { return ByteOrder.BIG_ENDIAN; @@ -192,11 +395,15 @@ private static ByteOrder guessByteOrder(byte[] header) { if (buffer.order(ByteOrder.LITTLE_ENDIAN).getInt() == 11) { return ByteOrder.LITTLE_ENDIAN; } - throw new Error("Could not determine endianness"); + throw new IOException("Could not determine NTv2 endianness: NUM_OREC is neither 11 " + + "big-endian nor 11 little-endian"); } private static double doubleFromBytes(byte[] b, int offset, ByteOrder order) { return ByteBuffer.wrap(b, offset, Double.BYTES).order(order).getDouble(); } + private static int intFromBytes(byte[] b, int offset, ByteOrder order) { + return ByteBuffer.wrap(b, offset, Integer.BYTES).order(order).getInt(); + } } diff --git a/core/src/main/java/org/locationtech/proj4j/datum/PrimeMeridian.java b/core/src/main/java/org/locationtech/proj4j/datum/PrimeMeridian.java index f88ae98..9c8b405 100755 --- a/core/src/main/java/org/locationtech/proj4j/datum/PrimeMeridian.java +++ b/core/src/main/java/org/locationtech/proj4j/datum/PrimeMeridian.java @@ -28,6 +28,8 @@ // The list of named prime meridians is defined in proj.4 in pj_datums.c public final class PrimeMeridian implements Serializable { + private static final long serialVersionUID = -1485872774200417031L; + private final String name; private final double offsetFromGreenwich; @@ -80,6 +82,21 @@ public String getName() { return name; } + /** + * The offset east of Greenwich, in radians. + *

+ * Needed because {@link #getName()} is not a faithful identifier: a numeric {@code +pm=} is + * named {@code "user-provided"}, which {@link #forName(String)} does not recognise, so + * reconstructing such a meridian from its name silently yields Greenwich. Anything copying a + * prime meridian from one {@code Projection} to another has to be able to see the value. + * + * @return the offset from Greenwich, radians, positive east + * @since 1.5.0 + */ + public double getOffsetFromGreenwich() { + return offsetFromGreenwich; + } + public void toGreenwich(ProjCoordinate coord) { coord.x += this.offsetFromGreenwich; } @@ -88,9 +105,19 @@ public void fromGreenwich(ProjCoordinate coord) { coord.x -= this.offsetFromGreenwich; } + /** + * {@inheritDoc} + * + *

This runs on every transform-cache lookup, through + * {@code Projection.hashCode} and thence {@code CoordinateReferenceSystem.hashCode}. + * It used to read {@code new Double(offsetFromGreenwich).hashCode()}, which allocates a + * 16-byte box per call purely to reach a static method; {@link Double#hashCode(double)} + * is the same function without the box, and returns bit-identical values for every input + * including {@code NaN} and {@code -0.0}. + */ @Override public int hashCode() { - return new Double(offsetFromGreenwich).hashCode(); + return Double.hashCode(offsetFromGreenwich); } @Override diff --git a/core/src/main/java/org/locationtech/proj4j/datum/VerticalGrid.java b/core/src/main/java/org/locationtech/proj4j/datum/VerticalGrid.java new file mode 100644 index 0000000..3579cc3 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/VerticalGrid.java @@ -0,0 +1,601 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import java.io.IOException; +import java.io.Serializable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.locationtech.proj4j.datum.tiff.GeoTiffDataset; +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceNames; +import org.locationtech.proj4j.resource.ResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; +import org.locationtech.proj4j.resource.Resources; + +/** + * A vertical shift grid: a geoid model or height correction surface, read from a GTX file. + * + *

This is what {@code +geoidgrids=} needs. It is deliberately independent of {@link Grid}: a + * vertical grid holds one scalar per node, not a (Δλ, Δφ) pair, and PROJ models + * them as separate class hierarchies ({@code VerticalShiftGrid} vs {@code HorizontalShiftGrid}) for the + * same reason. + * + *

GTX

+ *

GTX is the simplest grid format PROJ supports and has no magic bytes: a 40-byte + * big-endian header (south latitude, west longitude, latitude step, longitude step, all + * {@code double} degrees, then row and column counts as {@code int}), followed by + * {@code rows * columns} big-endian {@code float} values ordered south to north, west to east. + * Because there is nothing to sniff, PROJ 9.8.1 dispatches on the {@code .gtx}/{@code .GTX} filename + * suffix ({@code src/grids.cpp}, {@code VerticalShiftGridSet::open}) and so does this class. A file + * with the wrong suffix is rejected rather than guessed at. + * + *

Interpolation and nodata

+ *

{@link #valueAt} is a verbatim port of PROJ 9.8.1's {@code read_vgrid_value}, including its + * clamping of the upper index at the grid edge, its full-world longitude wrap, and its four-node + * nodata handling. The weight expressions and their summation order are preserved verbatim, because + * changing the order changes the last bits of the result. + * + *

GeoTIFF

+ *

A vertical GeoTIFF is read by {@link org.locationtech.proj4j.datum.tiff} and assembled here, so + * that the interpolation above is shared rather than duplicated — PROJ shares it the same way, through + * the virtual {@code VerticalShiftGrid::valueAt}. Two things differ from GTX and both are carried per + * grid rather than hardcoded: + *

    + *
  • nodata. GTX has the {@code -88.8888} sentinel plus a magnitude heuristic; + * GeoTIFF has {@code GTiffGrid::isNodata}, which is only the declared + * {@code GDAL_NODATA} value, plus NaN. Applying the GTX heuristic to a GeoTIFF would discard + * legitimate values beyond ±1000 m, and applying the GeoTIFF rule to a GTX would miss + * {@code naptrans2008.gtx}'s sentinels. See {@link #isNodata}.
  • + *
  • subgrids. A GeoTIFF can nest grids across IFDs, which GTX cannot. The tree is + * held on {@link #children} and resolved by {@link #gridAt} before interpolating, exactly as + * {@code VerticalShiftGridSet::gridAt} then {@code read_vgrid_value}.
  • + *
+ */ +public final class VerticalGrid implements Serializable, GridCache.Sized { + + private static final long serialVersionUID = 1L; + + /** GTX header size, per PROJ's {@code GTXVerticalShiftGrid}. */ + private static final int GTX_HEADER_BYTES = 40; + + /** PROJ's {@code REL_TOLERANCE_HGRIDSHIFT}, reused for extent containment. */ + private static final double REL_TOLERANCE = 1e-5; + + private static final double DEG_TO_RAD = Math.PI / 180.0; + + private static final long BYTES_PER_NODE = 4L; + + private final String gridName; + private final String origin; + private final String resolverName; + private final String format; + + private final int width; + private final int height; + /** Radians. */ + private final double west; + private final double south; + private final double east; + private final double north; + private final double resX; + private final double resY; + + /** Row-major, south to north, west to east. {@code null} only for a synthetic bounding root. */ + private final float[] values; + + /** Nested subgrids, finest last. Always empty for GTX, which has no notion of them. */ + private final List children; + + /** {@code true} to use {@code GTiffGrid::isNodata} instead of the GTX rule. */ + private final boolean tiffNodataRule; + private final boolean hasNodataValue; + private final float nodataValue; + + private VerticalGrid(String gridName, String origin, String resolverName, String format, + int width, int height, double west, double south, double resX, double resY, + float[] values) { + this(gridName, origin, resolverName, format, width, height, west, south, resX, resY, values, + Collections.emptyList(), false, false, 0f); + } + + private VerticalGrid(String gridName, String origin, String resolverName, String format, + int width, int height, double west, double south, double resX, double resY, + float[] values, List children, boolean tiffNodataRule, + boolean hasNodataValue, float nodataValue) { + this.gridName = gridName; + this.origin = origin; + this.resolverName = resolverName; + this.format = format; + this.width = width; + this.height = height; + this.west = west; + this.south = south; + this.resX = resX; + this.resY = resY; + this.east = west + resX * (width - 1); + this.north = south + resY * (height - 1); + this.values = values; + this.children = children; + this.tiffNodataRule = tiffNodataRule; + this.hasNodataValue = hasNodataValue; + this.nodataValue = nodataValue; + } + + /** + * Resolves and parses a vertical grid by name through the same deterministic chain and the same + * byte-bounded cache as horizontal grids. The working directory is never consulted. + */ + public static VerticalGrid fromName(String name) throws IOException { + if (name == null || name.isEmpty()) { + throw new IOException("Empty vertical grid name"); + } + // Same pre-chain refusal, and the same rule, as Grid.resolveAndLoad. See ResourceNames. + ResourceNames.Rule violation = ResourceNames.violation(name); + if (violation != null) { + throw new IOException("Refusing vertical grid name \"" + name + "\": " + + violation.description() + " (" + violation + ")"); + } + ChainedResourceResolver chain = ResourceResolvers.resolver(); + final ResourceHandle handle = chain.resolve(name); + if (handle == null) { + throw new IOException("Unknown vertical grid: " + name + ". Resolution chain was " + + chain.name() + "; the working directory is deliberately not searched."); + } + ResourceResolver owner = chain.resolverOf(name); + final String resolverName = owner == null ? "unknown" : owner.name(); + final String requested = name; + final String origin = handle.origin(); + return GridCache.vertical().get(resolverName, name, new GridCache.Loader() { + @Override + public VerticalGrid load() throws IOException { + // GridExtents.maxFileBytes(), i.e. proj4j.grids.maxFileBytes, default 128 MiB -- + // the same ceiling Grid.resolveAndLoad applies. This was a fourth, hardcoded + // 512 MiB literal, so the documented "one knob" for how large a grid file may be + // did not govern half the grids: a +geoidgrids= token could pull four times what a + // +nadgrids= token could, for no stated reason and with no way to lower it. The + // largest vertical grid PROJ publishes is three orders of magnitude below either + // number, so unifying downwards cannot refuse a real geoid. + byte[] bytes = Resources.readAll(handle, GridExtents.maxFileBytes()); + return parse(requested, origin, resolverName, bytes); + } + }); + } + + /** + * Parses a {@code +geoidgrids=} style list, honouring PROJ's {@code @} optional prefix with the + * same silent-skip semantics {@link Grid#fromNadGrids} has, in the same order. + */ + public static List fromGeoidGrids(String spec) throws IOException { + List out = new ArrayList(); + if (spec == null || spec.isEmpty()) { + return out; + } + for (String token : Grid.splitTokens("geoidgrids", spec)) { + boolean optional = token.startsWith("@"); + String name = optional ? token.substring(1) : token; + try { + out.add(fromName(name)); + } catch (IOException e) { + if (!optional) { + throw e; + } + } + } + return out; + } + + /** + * Sniffs the format and parses, in {@code VerticalShiftGridSet::open}'s order + * ({@code 9.8.1:src/grids.cpp:1613-1671}): the {@code .gtx}/{@code .GTX} filename suffix first — + * GTX has no magic bytes, so upstream dispatches on the name too — then the TIFF signature, then + * an error. + */ + static VerticalGrid parse(String gridName, String origin, String resolverName, byte[] bytes) + throws IOException { + String lower = gridName.toLowerCase(java.util.Locale.ROOT); + if (lower.endsWith(".gtx")) { + return parseGtx(gridName, origin, resolverName, bytes); + } + byte[] header = new byte[4]; + System.arraycopy(bytes, 0, header, 0, Math.min(4, bytes.length)); + if (GeoTiffDataset.isTiff(header, Math.min(4, bytes.length))) { + return parseGeoTiff(gridName, origin, resolverName, bytes); + } + throw new IOException("Unrecognised vertical grid format for " + gridName + " at " + origin + + ". proj4j reads GTX (dispatched on the .gtx suffix, as PROJ does, because GTX has " + + "no magic bytes) and GeoTIFF."); + } + + /** + * Builds the grid tree for a vertical GeoTIFF. + * + *

A file with one top-level image becomes one {@code VerticalGrid} carrying its subgrids. A file + * with several unrelated top-level images becomes a synthetic root spanning their union with + * {@code values == null}; {@link #gridAt} descends past it and never interpolates it. + */ + static VerticalGrid parseGeoTiff(String gridName, String origin, String resolverName, + byte[] bytes) throws IOException { + List roots = GeoTiffGrid.readVerticalLayers(gridName, bytes); + if (roots.size() == 1) { + return fromLayer(roots.get(0), origin, resolverName); + } + List tops = new ArrayList(roots.size()); + double west = Double.POSITIVE_INFINITY; + double south = Double.POSITIVE_INFINITY; + double east = Double.NEGATIVE_INFINITY; + double north = Double.NEGATIVE_INFINITY; + double resX = Double.POSITIVE_INFINITY; + double resY = Double.POSITIVE_INFINITY; + for (int i = 0; i < roots.size(); i++) { + GeoTiffGrid.VerticalLayer layer = roots.get(i); + tops.add(fromLayer(layer, origin, resolverName)); + west = Math.min(west, layer.west); + south = Math.min(south, layer.south); + east = Math.max(east, layer.east()); + north = Math.max(north, layer.north()); + resX = Math.min(resX, layer.resX); + resY = Math.min(resY, layer.resY); + } + int w = (int) Math.ceil((east - west) / resX) + 1; + int h = (int) Math.ceil((north - south) / resY) + 1; + return new VerticalGrid(gridName + " (bounding box of " + roots.size() + " grids)", origin, + resolverName, "gtiff", w, h, west, south, resX, resY, null, + Collections.unmodifiableList(tops), true, false, 0f); + } + + private static VerticalGrid fromLayer(GeoTiffGrid.VerticalLayer layer, String origin, + String resolverName) { + List kids; + if (layer.children.isEmpty()) { + kids = Collections.emptyList(); + } else { + List built = new ArrayList(layer.children.size()); + for (int i = 0; i < layer.children.size(); i++) { + built.add(fromLayer(layer.children.get(i), origin, resolverName)); + } + kids = Collections.unmodifiableList(built); + } + return new VerticalGrid(layer.name, origin, resolverName, "gtiff", layer.width, layer.height, + layer.west, layer.south, layer.resX, layer.resY, layer.values, kids, true, + layer.hasNodata, layer.noData); + } + + static VerticalGrid parseGtx(String gridName, String origin, String resolverName, byte[] bytes) + throws IOException { + if (bytes.length < GTX_HEADER_BYTES) { + throw new IOException("GTX file " + origin + " is shorter than its 40-byte header"); + } + ByteBuffer hdr = ByteBuffer.wrap(bytes, 0, GTX_HEADER_BYTES).order(ByteOrder.BIG_ENDIAN); + double yorigin = hdr.getDouble(); + double xorigin = hdr.getDouble(); + double ystep = hdr.getDouble(); + double xstep = hdr.getDouble(); + int rows = hdr.getInt(); + int columns = hdr.getInt(); + + // PROJ's own validation, verbatim. + if (columns <= 0 || rows <= 0 || xorigin < -360 || xorigin > 360 + || yorigin < -90 || yorigin > 90) { + throw new IOException("GTX file " + origin + " header has invalid extents (rows=" + rows + + ", columns=" + columns + ", xorigin=" + xorigin + ", yorigin=" + yorigin + ")"); + } + // Some GTX files come in 0-360; shift back into -180..180 where possible. + if (xorigin >= 180.0) { + xorigin -= 360.0; + } + + long expected = (long) GTX_HEADER_BYTES + 4L * rows * columns; + if (bytes.length < expected) { + throw new IOException("GTX file " + origin + " declares " + rows + "x" + columns + + " nodes, which needs " + expected + " bytes, but the file is " + bytes.length); + } + + float[] values = new float[rows * columns]; + ByteBuffer.wrap(bytes, GTX_HEADER_BYTES, values.length * 4) + .order(ByteOrder.BIG_ENDIAN).asFloatBuffer().get(values); + + return new VerticalGrid(gridName, origin, resolverName, "gtx", columns, rows, + xorigin * DEG_TO_RAD, yorigin * DEG_TO_RAD, + xstep * DEG_TO_RAD, ystep * DEG_TO_RAD, values); + } + + /** + * True iff {@code (lam, phi)} in radians falls inside this grid, within PROJ's tolerance. + * + *

PROJ's {@code isPointInExtent} ({@code 9.8.1:src/grids.cpp:3689-3704}): latitude first, then a + * short circuit for a grid spanning the world in longitude, then a ±2π shift of the + * longitude before the east/west test. + * + *

The wrap is load-bearing, not decoration. + * {@code tests/us_noaa_geoid06_ak_subset_at_antimeridian.tif} declares + * {@code west = 179.8}° and therefore {@code east = 180.1833}° — past the antimeridian and + * past π in radians, which PROJ's own extent validation explicitly permits ({@code |west|} and + * {@code |east|} are checked against 4π, not π). Without the shift, a point given as + * {@code -179.99}° is judged outside a grid that covers it, and the ten assertions that file + * carries in {@code geotiff_grids.gie} all fail with an outside-grid error. + */ + public boolean covers(double lam, double phi) { + double epsilon = (resX + resY) * REL_TOLERANCE; + if (!(phi + epsilon >= south && phi - epsilon <= north)) { + return false; + } + if (isFullWorldLongitude()) { + return true; + } + double x = lam; + if (x + epsilon < west) { + x += 2 * Math.PI; + } else if (x - epsilon > east) { + x -= 2 * Math.PI; + } + return x + epsilon >= west && x - epsilon <= east; + } + + /** + * The deepest grid in this subtree containing the point: {@code VerticalShiftGrid::gridAt} + * ({@code grids.cpp:1708-1717}), which descends into the first child whose extent contains the + * point and otherwise returns itself. + * + * @return the grid to interpolate, or {@code null} if this is a synthetic bounding root that no + * child covers + */ + private VerticalGrid gridAt(double lam, double phi) { + for (int i = 0; i < children.size(); i++) { + VerticalGrid child = children.get(i); + if (child.covers(lam, phi)) { + return child.gridAt(lam, phi); + } + } + return values == null ? null : this; + } + + /** Nested subgrids, outermost first. Empty for GTX and for a single-image GeoTIFF. */ + public List getSubGrids() { + return children; + } + + /** Total number of grids in this tree, counting subgrids at any depth. */ + public int countGrids() { + int n = 1; + for (int i = 0; i < children.size(); i++) { + n += children.get(i).countGrids(); + } + return n; + } + + /** + * Bilinearly interpolated grid value at {@code (lam, phi)} in radians, in the file's own units + * (metres, for a geoid model). + * + *

Verbatim port of PROJ 9.8.1 {@code read_vgrid_value}. Returns {@link Double#NaN} if the point + * is outside the grid or if every surrounding node is nodata; PROJ returns {@code HUGE_VAL} and + * sets {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID} / {@code _GRID_AT_NODATA}. Callers must map + * that to {@code ErrorCause.COORDINATE_OUTSIDE_GRID} / {@code GRID_NODATA} rather than pass a + * sentinel on. + * + * @param multiplier the {@code +multiplier} value, used only for the nodata test, exactly as PROJ + * does. + */ + public double valueAt(double lam, double phi, double multiplier) { + if (Double.isNaN(lam) || Double.isNaN(phi)) { + return Double.NaN; + } + // VerticalShiftGridSet::gridAt then read_vgrid_value, in that order. A GTX grid has no + // children, so `target == this` and the call below is the 1.4.x path unchanged. + VerticalGrid target = gridAt(lam, phi); + if (target == null) { + return Double.NaN; + } + return target.interpolate(lam, phi, multiplier); + } + + /** {@code read_vgrid_value}, on this grid's own nodes. */ + private double interpolate(double lam, double phi, double multiplier) { + double invResX = 1.0 / resX; + double invResY = 1.0 / resY; + + double gridX = (lam - west) * invResX; + if (lam < west) { + if (isFullWorldLongitude()) { + gridX = mod(mod(gridX + width, width) + width, width); + } else { + gridX = (lam + 2 * Math.PI - west) * invResX; + } + } else if (lam > east) { + if (isFullWorldLongitude()) { + gridX = mod(mod(gridX + width, width) + width, width); + } else { + gridX = (lam - 2 * Math.PI - west) * invResX; + } + } + double gridY = (phi - south) * invResY; + int ix = (int) Math.round(Math.floor(gridX)); + if (!(ix >= 0 && ix < width)) { + return Double.NaN; + } + int iy = (int) Math.round(Math.floor(gridY)); + if (!(iy >= 0 && iy < height)) { + return Double.NaN; + } + gridX -= ix; + gridY -= iy; + + int ix2 = ix + 1; + if (ix2 >= width) { + ix2 = isFullWorldLongitude() ? 0 : width - 1; + } + int iy2 = iy + 1; + if (iy2 >= height) { + iy2 = height - 1; + } + + float a = values[iy * width + ix]; + float b = values[iy * width + ix2]; + float c = values[iy2 * width + ix]; + float d = values[iy2 * width + ix2]; + + final double gridXY = gridX * gridY; + boolean aValid = !isNodata(a, multiplier); + boolean bValid = !isNodata(b, multiplier); + boolean cValid = !isNodata(c, multiplier); + boolean dValid = !isNodata(d, multiplier); + int countValid = (aValid ? 1 : 0) + (bValid ? 1 : 0) + (cValid ? 1 : 0) + (dValid ? 1 : 0); + + double value = 0.0; + if (countValid == 4) { + // Weights and summation order exactly as PROJ writes them: changing the order changes + // the last bits. + value = a * (1.0 - gridX - gridY + gridXY); + value += b * (gridX - gridXY); + value += c * (gridY - gridXY); + value += d * gridXY; + } else if (countValid == 0) { + return Double.NaN; + } else { + // Partially valid: PROJ renormalises over the valid nodes' weights. + double totalWeight = 0.0; + if (aValid) { + double weight = 1.0 - gridX - gridY + gridXY; + value = a * weight; + totalWeight = weight; + } + if (bValid) { + double weight = gridX - gridXY; + value += b * weight; + totalWeight += weight; + } + if (cValid) { + double weight = gridY - gridXY; + value += c * weight; + totalWeight += weight; + } + if (dValid) { + double weight = gridXY; + value += d * weight; + totalWeight += weight; + } + value /= totalWeight; + } + return value * multiplier; + } + + /** Convenience overload with PROJ's default {@code +multiplier=1}. */ + public double valueAt(double lam, double phi) { + return valueAt(lam, phi, 1.0); + } + + /** + * The nodata rule for this grid's format, because the two differ and neither generalises. + * + *

    + *
  • GTX ({@code GTXVerticalShiftGrid::isNodata}, {@code grids.cpp:358-366}): + * the official sentinel is {@code -88.8888f}, but real grids — {@code naptrans2008.gtx} is + * upstream's cited example — use other large magnitudes, so anything beyond ±1000 + * after applying the multiplier counts too.
  • + *
  • GeoTIFF ({@code GTiffGrid::isNodata}, {@code grids.cpp:935-937}): only the + * declared {@code GDAL_NODATA} value, plus any NaN. The multiplier plays no part; + * {@code GTiffVGrid::isNodata} takes it and ignores it, with the parameter name commented + * out. Reusing the GTX magnitude heuristic here would silently void every geoid value beyond + * ±1 km, and the NaN clause would be missing.
  • + *
+ */ + private boolean isNodata(float val, double multiplier) { + if (tiffNodataRule) { + return (hasNodataValue && val == nodataValue) || Float.isNaN(val); + } + return val * multiplier > 1000 || val * multiplier < -1000 || val == -88.88880f; + } + + private boolean isFullWorldLongitude() { + return east - west + resX >= 2 * Math.PI - 1e-10; + } + + private static double mod(double a, double b) { + return a % b; + } + + @Override + public long sizeBytes() { + long total = values == null ? 0L : (long) values.length * BYTES_PER_NODE; + for (int i = 0; i < children.size(); i++) { + total += children.get(i).sizeBytes(); + } + return total; + } + + public String getGridName() { + return gridName; + } + + public String getOrigin() { + return origin; + } + + public String getResolverName() { + return resolverName; + } + + public String getFormat() { + return format; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + /** {@code [west, south, east, north]} in radians. */ + public double[] extentRadians() { + return new double[]{west, south, east, north}; + } + + /** {@code [resX, resY]} in radians. */ + public double[] resolutionRadians() { + return new double[]{resX, resY}; + } + + /** + * Raw node value at a grid index, for tests and diagnostics. + * + * @throws IllegalStateException on a synthetic bounding root, which has no nodes of its own + */ + public float nodeAt(int x, int y) { + if (values == null) { + throw new IllegalStateException(gridName + + " is a synthetic bounding root over " + children.size() + + " grids and has no nodes of its own"); + } + return values[y * width + x]; + } + + public static List emptyList() { + return Collections.emptyList(); + } + + @Override + public String toString() { + return "VerticalGrid[" + gridName + "; " + format + "; " + width + "x" + height + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/GdalMetadata.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/GdalMetadata.java new file mode 100644 index 0000000..9796feb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/GdalMetadata.java @@ -0,0 +1,288 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.util.HashMap; +import java.util.Map; + +/** + * The {@code GDAL_METADATA} tag, parsed the way PROJ parses it. + * + *

This tag carries an XML fragment of {@code <}{@code Item>} elements, and it is where the whole + * semantic layer of a geodetic GeoTIFF lives: {@code TYPE}, {@code grid_name}, + * {@code parent_grid_name}, per-sample {@code DESCRIPTION} (which is what identifies the + * latitude/longitude/geoid channel), {@code UNITTYPE}, {@code positive_value}, and the + * {@code offset}/{@code scale} roles. + * + *

Why this is not an XML parser

+ *

PROJ does not parse it as XML either. {@code 9.8.1:src/grids.cpp:541-618} is explicitly labelled + * "Poor-man XML parsing of TIFFTAG_GDAL_METADATA tag. Hopefully good enough for our purposes" + * and works by {@code strstr("')}, then {@code strchr('<')}. Ported + * literally, because the two must agree on the same files: + *

    + *
  • The key is the {@code name="..."} attribute. A {@code <}{@code Item>} without one + * aborts the whole scan — PROJ {@code break}s out of the loop rather than skipping the + * element, so any items after it are lost. Reproduced.
  • + *
  • The map key is the pair {@code (sample, name)}, with {@code sample = -1} when the + * {@code sample="..."} attribute is absent. A grid-level {@code TYPE} and a per-band + * {@code DESCRIPTION} therefore never collide.
  • + *
  • Values are taken raw, with no entity decoding, because PROJ does none. A {@code &amp;} + * in a grid name would reach us as the five literal characters, in both implementations.
  • + *
  • The {@code role="offset"} / {@code role="scale"} attributes are read as well as stored, + * because {@code readValue} applies them.
  • + *
+ * + *

Immutable after construction. + */ +final class GdalMetadata { + + /** Sample index meaning "applies to the whole grid, not to one band". */ + static final int GRID_LEVEL = -1; + + private static final String ITEM = " items; + private final double[] scale; + private final double[] offset; + private final boolean hasScaleOffset; + + private GdalMetadata(Map items, double[] scale, double[] offset, + boolean hasScaleOffset) { + this.items = items; + this.scale = scale; + this.offset = offset; + this.hasScaleOffset = hasScaleOffset; + } + + /** An empty metadata block, for an IFD with no {@code GDAL_METADATA} tag. */ + static GdalMetadata empty() { + return new GdalMetadata(new HashMap(), null, null, false); + } + + /** + * @param xml the raw tag contents; {@code null} yields {@link #empty()} + * @param samplesPerPixel the band count, used only to reject a {@code sample} attribute + * outside it — never to size an allocation. See the comment on the + * scale/offset arrays below for why that distinction is the whole fix. + */ + static GdalMetadata parse(String xml, int samplesPerPixel) { + Map items = new HashMap(); + double[] scale = null; + double[] offset = null; + if (xml == null || xml.isEmpty()) { + return new GdalMetadata(items, null, null, false); + } + int ptr = 0; + while (true) { + int start = xml.indexOf(ITEM, ptr); + if (start < 0) { + break; + } + int endTag = xml.indexOf('>', start); + if (endTag < 0) { + break; + } + int endValue = xml.indexOf('<', endTag); + if (endValue < 0) { + break; + } + // PROJ's `tag` runs from "'; `value` is between them. + String tag = xml.substring(start, endTag); + String value = xml.substring(endTag + 1, endValue); + + int namePos = tag.indexOf(NAME_ATTR); + if (namePos < 0) { + // Verbatim: PROJ breaks, abandoning the rest of the document. + break; + } + namePos += NAME_ATTR.length(); + int endQuote = tag.indexOf('"', namePos); + if (endQuote < 0) { + break; + } + String name = tag.substring(namePos, endQuote); + + int sample = GRID_LEVEL; + int samplePos = tag.indexOf(SAMPLE_ATTR); + if (samplePos >= 0) { + sample = atoi(tag, samplePos + SAMPLE_ATTR.length()); + } + items.put(key(sample, name), value); + + int rolePos = tag.indexOf(ROLE_ATTR); + if (rolePos >= 0) { + rolePos += ROLE_ATTR.length(); + int roleEnd = tag.indexOf('"', rolePos); + if (roleEnd < 0) { + break; + } + String role = tag.substring(rolePos, roleEnd); + boolean isOffset = "offset".equals(role); + boolean isScale = "scale".equals(role); + if ((isOffset || isScale) && sample >= 0 && sample < samplesPerPixel) { + // Sized to the samples this document actually names, not to SamplesPerPixel. + // + // The old code allocated two double[samplesPerPixel] on the first scale or + // offset item, on nothing stronger than the tag's `> 0` check. Measured on the + // code this replaces: a 358-byte GeoTIFF carrying PlanarConfig=3 and + // SamplesPerPixel=2^28 reached here and asked for two double[268435456] -- 4 GB + // from 358 bytes, an OutOfMemoryError that escapes catch (Exception). + // + // PlanarConfig=3 is NOT the only route, which an earlier version of this comment + // got wrong and a mutation sweep caught. SamplesPerPixel declared as a LONG holds + // any value up to 2^31, and on a legal PlanarConfig=1 file both bounds that + // involve it are satisfiable at once: blockBytes stays under MAX_BLOCK_BYTES for + // a small image, and expectedBlocks does not multiply by samplesPerPixel for + // CONTIG at all. Measured, frozen input, open() alone: a 350-byte 2x2 file + // declaring SamplesPerPixel = 8,000,000 allocated 128,157,520 bytes before this + // change and 157,704 after -- so this is the guard, not defence behind the + // PlanarConfig one. The allocation is now bounded by the number of + // elements in the document -- i.e. by the file -- rather than by a number the + // file merely asserts. + // + // Behaviour is unchanged for every real file. scaleFor/offsetFor already answer + // 1.0/0.0 for an index past the array, which is exactly what an untouched entry + // of a samplesPerPixel-sized array held. + int want = sample + 1; + if (offset == null) { + offset = new double[want]; + scale = new double[want]; + java.util.Arrays.fill(scale, 1.0); + } else if (offset.length < want) { + int was = offset.length; + offset = java.util.Arrays.copyOf(offset, want); + scale = java.util.Arrays.copyOf(scale, want); + java.util.Arrays.fill(scale, was, want, 1.0); + } + double parsed = parseDoubleOrNaN(value); + if (!Double.isNaN(parsed)) { + // PROJ swallows the exception from c_locale_stod and leaves the previous + // value, which for a fresh array is 0 / 1. Same here. + if (isOffset) { + offset[sample] = parsed; + } else { + scale[sample] = parsed; + } + } + } + } + ptr = endValue + 1; + } + return new GdalMetadata(items, scale, offset, offset != null); + } + + /** + * A metadata item. + * + * @param name the {@code name} attribute + * @param sample the band index, or {@link #GRID_LEVEL} + * @return the value, or the empty string — never {@code null}, matching PROJ's + * {@code metadataItem} which returns a reference to a static empty string + */ + String item(String name, int sample) { + String v = items.get(key(sample, name)); + return v == null ? "" : v; + } + + /** A grid-level metadata item. */ + String item(String name) { + return item(name, GRID_LEVEL); + } + + /** + * {@code true} iff a {@code role="scale"} or {@code role="offset"} item was seen. PROJ's + * {@code readValue} applies scaling only under {@code sample < m_adfScale.size()}, and that vector + * is empty until one appears — so this flag, not a unit scale, is what decides. + */ + boolean hasScaleOffset() { + return hasScaleOffset; + } + + double scaleFor(int sample) { + return scale == null || sample < 0 || sample >= scale.length ? 1.0 : scale[sample]; + } + + double offsetFor(int sample) { + return offset == null || sample < 0 || sample >= offset.length ? 0.0 : offset[sample]; + } + + /** + * The separator is written as the escape {@code \0}, not as a raw NUL byte. It was a raw NUL, and + * the two of them (here and in the field's javadoc) made this file binary to + * every line-oriented tool: {@code grep} returned silently on it, and {@code git diff} reported + * {@code Bin 9812 -> 11518 bytes, 0 insertions(+), 0 deletions(-)} for a change of 60 lines. A + * source file that no reviewer's {@code grep} can see is how a guard hole survives review; this is + * the same failure that hid {@code indexOf('\0')} masquerading as {@code indexOf(' ')} elsewhere + * in this codebase. The compiled constant is identical — {@code "\0"} is the octal escape for + * U+0000 — so this is a source-visibility change and nothing else. + */ + private static String key(int sample, String name) { + return sample + "\0" + name; + } + + /** C {@code atoi}: leading digits, no exception, 0 on nothing usable. */ + private static int atoi(String s, int from) { + int i = from; + int n = s.length(); + while (i < n && (s.charAt(i) == ' ' || s.charAt(i) == '\t')) { + i++; + } + boolean negative = false; + if (i < n && (s.charAt(i) == '+' || s.charAt(i) == '-')) { + negative = s.charAt(i) == '-'; + i++; + } + int value = 0; + boolean any = false; + while (i < n) { + char c = s.charAt(i); + if (c < '0' || c > '9') { + break; + } + value = value * 10 + (c - '0'); + any = true; + i++; + } + if (!any) { + return 0; + } + return negative ? -value : value; + } + + /** + * PROJ's {@code c_locale_stod}: a C-locale {@code strtod}. {@link Double#parseDouble} is already + * locale-independent, so the only thing to add is PROJ's swallow-and-ignore on failure, expressed + * here as {@code NaN}. + */ + static double parseDoubleOrNaN(String s) { + if (s == null) { + return Double.NaN; + } + String t = s.trim(); + if (t.isEmpty()) { + return Double.NaN; + } + try { + return Double.parseDouble(t); + } catch (NumberFormatException e) { + return Double.NaN; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/GeoTiffDataset.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/GeoTiffDataset.java new file mode 100644 index 0000000..474a07e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/GeoTiffDataset.java @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * A geodetic GeoTIFF file, as a sequence of {@link GeoTiffImage}s: PROJ's {@code GTiffDataset}. + * + *

This is the only public entry point into the TIFF subset reader. It is deliberately narrow: + * hand it the bytes of a file, get back the images. It resolves nothing, opens nothing and caches + * nothing — resolution goes through {@code org.locationtech.proj4j.resource} and caching through + * {@code datum.GridCache}, and this class must not acquire opinions about either. + * + *

Enumeration semantics, which are load-bearing

+ *

PROJ's {@code nextGrid()} logs and returns {@code nullptr} for an IFD it cannot make sense of, + * and every caller treats that as "stop enumerating" — fatal at IFD 0, a silent truncation of + * the list afterwards ({@code GTiffVGridShiftSet::open}, {@code GTiffHGridShiftSet::open}). That + * asymmetry is reproduced here rather than smoothed over, because it is what makes + * {@code tests/test_vgrid_invalid_channel_type.tif} an error and + * {@code tests/test_hgrid_extra_ifd_with_other_info.tif} a success. + * + *

The reason an IFD is dropped is retained on {@link #truncationReason()} so a caller can put it in + * an exception message instead of losing it, which is the one place this port deviates from upstream — + * PROJ writes it to a log nobody reads. + * + * @since 1.5 + */ +public final class GeoTiffDataset { + + private final String name; + private final List images; + private final String truncationReason; + private final boolean bigTiff; + + private GeoTiffDataset(String name, List images, String truncationReason, + boolean bigTiff) { + this.name = name; + this.images = images; + this.truncationReason = truncationReason; + this.bigTiff = bigTiff; + } + + /** + * PROJ's {@code IsTIFF} ({@code 9.8.1:src/grids.cpp:377-385}). Both endian markers crossed with + * classic ({@code 42}) and BigTIFF ({@code 43}). + * + * @param header at least the first four bytes of a candidate file + * @param length how many bytes of {@code header} are valid + * @return {@code true} if PROJ would dispatch this file to its TIFF reader + */ + public static boolean isTiff(byte[] header, int length) { + return TiffFile.isTiff(header, length); + } + + /** + * Parses a whole GeoTIFF held in memory. + * + * @param bytes the complete file + * @param gridName the name it was requested under, used in every message + * @return a dataset with at least one image + * @throws IOException if the file is not a TIFF, is truncated, or its first IFD is unusable + */ + public static GeoTiffDataset open(byte[] bytes, String gridName) throws IOException { + TiffFile tiff = TiffFile.open(bytes); + List found = new ArrayList(); + String reason = null; + List dirs = tiff.directories(); + for (int i = 0; i < dirs.size(); i++) { + GeoTiffImage image; + try { + image = GeoTiffImage.of(tiff, dirs.get(i), i, gridName); + } catch (IOException e) { + if (i == 0) { + throw e; + } + // Upstream: pj_log then `break`, keeping what was found. Keep the reason too. + reason = e.getMessage(); + break; + } + found.add(image); + } + if (found.isEmpty()) { + throw new IOException("GeoTIFF grid " + gridName + " has no usable image"); + } + return new GeoTiffDataset(gridName, Collections.unmodifiableList(found), reason, + tiff.isBigTiff()); + } + + /** The name the file was requested under. */ + public String name() { + return name; + } + + /** Every usable image, in IFD order. Never empty. */ + public List images() { + return images; + } + + /** {@code true} for a BigTIFF ({@code 43}) container. Provenance, not behaviour. */ + public boolean isBigTiff() { + return bigTiff; + } + + /** + * Why enumeration stopped early, or {@code null} if every IFD in the chain was read. + * + * @return the message from the exception raised by the first unusable IFD after IFD 0 + */ + public String truncationReason() { + return truncationReason; + } + + @Override + public String toString() { + return "GeoTiffDataset[" + name + "; " + images.size() + " image(s)" + + (bigTiff ? "; BigTIFF" : "") + + (truncationReason == null ? "" : "; truncated: " + truncationReason) + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/GeoTiffImage.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/GeoTiffImage.java new file mode 100644 index 0000000..0d11fc7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/GeoTiffImage.java @@ -0,0 +1,736 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import org.locationtech.proj4j.datum.GridExtents; + +/** + * One georeferenced image inside a geodetic GeoTIFF: PROJ's {@code GTiffGrid}, plus the header + * validation {@code GTiffDataset::nextGrid} does before constructing one. + * + *

This class is the whole of the format subset. Everything it reads is listed on + * {@link TiffTags}; everything it refuses says which feature it refused and why. In particular it is + * not a TIFF decoder that happens to be used for grids — there is no colour handling, + * no photometric interpretation, no palette, no alpha, no orientation tag, no sub-byte samples, and + * no support for any codec but DEFLATE. + * + *

What is required

+ * + * + * + * + * + * + * + * + * + *
required tags
tagconstraint
{@code ImageWidth}, {@code ImageLength}non-zero, within {@code int}
{@code SamplesPerPixel}present, non-zero
{@code BitsPerSample}present
{@code PlanarConfig}present
{@code SampleFormat}present
{@code Photometric}absent, or {@code MINISBLACK}
georeferencing{@code GeoTransformationMatrix} with 16 values, else + * {@code GeoPixelScale} (3) and {@code GeoTiePoints} (6)
+ * + *

Six {@code (SampleFormat, BitsPerSample)} combinations are legal, exactly PROJ's + * {@code TIFFDataType} enum: signed and unsigned 16- and 32-bit integers, and 32- and 64-bit IEEE + * floating point. Everything else, including the 8-bit case that + * {@code tests/test_vgrid_unsupported_byte.tif} exists to check, is rejected. + * + *

Sample values

+ *

Values come back as {@code float}, which is not a narrowing this port introduced: PROJ's + * {@code Grid::valueAt} signature is {@code (int x, int y, float &out)} and its {@code readValue} + * template casts every type, {@code double} included, to {@code float}. Matching PROJ bit-for-bit + * means matching that. + * + *

Immutable and stateless after construction except for the one-block decode cache, which is + * private to a {@link #readSamples} call and never shared. + */ +public final class GeoTiffImage { + + private static final double DEG_TO_RAD = Math.PI / 180.0; + + /** {@code grids.cpp:1179} — {@code blockSize > 64 * 1024 * 2014}, upstream's own constant. */ + private static final long MAX_BLOCK_BYTES = 64L * 1024L * 2014L; + + // Header-derived, all final. + private final TiffDirectory dir; + private final byte[] file; + private final ByteOrder order; + private final int ifdIndex; + private final String name; + + private final int width; + private final int height; + private final int samplesPerPixel; + private final int bitsPerSample; + private final int bytesPerSample; + private final int sampleFormat; + private final int planarConfig; + /** Samples per pixel within one block row: {@code samplesPerPixel} for + * {@code PLANARCONFIG_CONTIG}, 1 for {@code PLANARCONFIG_SEPARATE}. Computed once, in + * {@link #of}, so the block-size bound and the scatter loop cannot disagree about it. */ + private final int strideSamples; + private final int compression; + private final int predictor; + private final long subfileType; + + private final boolean tiled; + private final int blockWidth; + private final int blockHeight; + private final int blocksPerRow; + private final int blocksPerCol; + private final int blocks; + private final long[] blockOffsets; + private final long[] blockByteCounts; + + private final boolean geographic; + private final boolean bottomUp; + private final double west; + private final double south; + private final double east; + private final double north; + private final double resX; + private final double resY; + + private final GdalMetadata metadata; + private final boolean hasNodata; + private final float noData; + + private GeoTiffImage(Builder b) { + this.dir = b.dir; + this.file = b.file; + this.order = b.order; + this.ifdIndex = b.ifdIndex; + this.name = b.name; + this.width = b.width; + this.height = b.height; + this.samplesPerPixel = b.samplesPerPixel; + this.bitsPerSample = b.bitsPerSample; + this.bytesPerSample = b.bitsPerSample / 8; + this.sampleFormat = b.sampleFormat; + this.planarConfig = b.planarConfig; + this.strideSamples = b.strideSamples; + this.compression = b.compression; + this.predictor = b.predictor; + this.subfileType = b.subfileType; + this.tiled = b.tiled; + this.blockWidth = b.blockWidth; + this.blockHeight = b.blockHeight; + this.blocksPerRow = b.blocksPerRow; + this.blocksPerCol = b.blocksPerCol; + this.blocks = b.blocks; + this.blockOffsets = b.blockOffsets; + this.blockByteCounts = b.blockByteCounts; + this.geographic = b.geographic; + this.bottomUp = b.bottomUp; + this.west = b.west; + this.south = b.south; + this.east = b.east; + this.north = b.north; + this.resX = b.resX; + this.resY = b.resY; + this.metadata = b.metadata; + this.hasNodata = b.hasNodata; + this.noData = b.noData; + } + + private static final class Builder { + TiffDirectory dir; + byte[] file; + ByteOrder order; + int ifdIndex; + String name; + int width; + int height; + int samplesPerPixel; + int bitsPerSample; + int sampleFormat; + int planarConfig; + int strideSamples; + int compression; + int predictor; + long subfileType; + boolean tiled; + int blockWidth; + int blockHeight; + int blocksPerRow; + int blocksPerCol; + int blocks; + long[] blockOffsets; + long[] blockByteCounts; + boolean geographic = true; + boolean bottomUp; + double west; + double south; + double east; + double north; + double resX; + double resY; + GdalMetadata metadata; + boolean hasNodata; + float noData; + } + + /** + * Validates one IFD and builds the image, reproducing {@code GTiffDataset::nextGrid} + * ({@code 9.8.1:src/grids.cpp:1089-1334}) check for check, in order. + * + * @param gridName the name the grid was requested under, for messages + * @param ifdIndex 0-based directory index + * @throws IOException if a required tag is missing or the georeferencing is inconsistent + * @throws UnsupportedTiffException if the file needs a feature this reader does not implement + */ + static GeoTiffImage of(TiffFile tiff, TiffDirectory dir, int ifdIndex, String gridName) + throws IOException { + Builder b = new Builder(); + b.dir = dir; + b.file = dir.fileBytes(); + b.order = dir.order(); + b.ifdIndex = ifdIndex; + b.name = gridName; + + long w = unsignedTag(dir, TiffTags.IMAGE_WIDTH); + long h = unsignedTag(dir, TiffTags.IMAGE_LENGTH); + if (w == 0 || h == 0 || w > Integer.MAX_VALUE || h > Integer.MAX_VALUE) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has invalid image size " + w + "x" + h); + } + // The dimensions were checked; their product never was. This is the one bound the file + // length cannot supply: readSamples materialises whole width*height planes -- PROJ streams + // blocks and never does -- and DEFLATE means a small file may legitimately decode to a much + // larger raster, so the file length is not an upper bound on the allocation. Measured on the + // code this replaces: a 634-byte file declaring 40000x40000 asked for a 6.4 GB float[] + // (OutOfMemoryError, an amplification of 10,000,000:1); a 1,290-byte file declaring + // 65536x65536 made `width * height` exactly 0 and then scattered into it + // (ArrayIndexOutOfBoundsException: Index -65536 out of bounds for length 0). Both are + // failures a caller cannot attribute to a grid, and the first is an Error. + GridExtents.checkedCount("GeoTIFF grid " + gridName + " IFD " + ifdIndex + " sample plane", + w, h, Float.BYTES, 0L, GridExtents.maxDecodedBytes(), "the decoded-grid budget"); + b.width = (int) w; + b.height = (int) h; + + if (!dir.has(TiffTags.SAMPLES_PER_PIXEL)) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " is missing the SamplesPerPixel tag"); + } + b.samplesPerPixel = dir.intValue(TiffTags.SAMPLES_PER_PIXEL, 0); + if (b.samplesPerPixel <= 0) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has invalid SamplesPerPixel " + b.samplesPerPixel); + } + if (!dir.has(TiffTags.BITS_PER_SAMPLE)) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " is missing the BitsPerSample tag"); + } + b.bitsPerSample = dir.intValue(TiffTags.BITS_PER_SAMPLE, 0); + if (!dir.has(TiffTags.PLANAR_CONFIG)) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " is missing the PlanarConfig tag"); + } + b.planarConfig = dir.intValue(TiffTags.PLANAR_CONFIG, 0); + // Presence was checked; the value was not, and TIFF defines exactly two. PlanarConfig=3 was + // the hole through which every other bound on this IFD leaked: `strideSamples` below is + // `CONTIG ? samplesPerPixel : 1`, so a third value left SamplesPerPixel out of the + // MAX_BLOCK_BYTES arithmetic entirely, while `expectedBlocks` is + // `SEPARATE ? blocks * samplesPerPixel : blocks`, so it left it out of the strip-count check + // too. Measured on the code this replaces: a 358-byte file with PlanarConfig=3 and + // SamplesPerPixel=2^28 reached GdalMetadata.parse and asked for two double[268435456] -- + // 4 GB, an OutOfMemoryError from 358 bytes. A 4096x4096 file with PlanarConfig=3 and 8 + // samples decoded with NO exception at all, returning a 16,777,216-element plane of zeros + // from a file containing no pixel bytes: a geoid of exactly 0 m, which is the plausible + // wrong answer this project exists to prevent. + if (b.planarConfig != TiffTags.PLANARCONFIG_CONTIG + && b.planarConfig != TiffTags.PLANARCONFIG_SEPARATE) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has PlanarConfig=" + b.planarConfig + "; TIFF defines only CONTIG (1) and " + + "SEPARATE (2), and a third value would bypass both the block-size and the " + + "strip-count bound"); + } + if (!dir.has(TiffTags.SAMPLE_FORMAT)) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " is missing the SampleFormat tag"); + } + b.sampleFormat = dir.intValue(TiffTags.SAMPLE_FORMAT, 0); + + // grids.cpp:1133-1151. Exactly six legal combinations; the message is upstream's. + boolean legal = + (b.sampleFormat == TiffTags.SAMPLEFORMAT_INT && b.bitsPerSample == 16) + || (b.sampleFormat == TiffTags.SAMPLEFORMAT_UINT && b.bitsPerSample == 16) + || (b.sampleFormat == TiffTags.SAMPLEFORMAT_INT && b.bitsPerSample == 32) + || (b.sampleFormat == TiffTags.SAMPLEFORMAT_UINT && b.bitsPerSample == 32) + || (b.sampleFormat == TiffTags.SAMPLEFORMAT_IEEEFP && b.bitsPerSample == 32) + || (b.sampleFormat == TiffTags.SAMPLEFORMAT_IEEEFP && b.bitsPerSample == 64); + if (!legal) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has an unsupported combination of SampleFormat (" + b.sampleFormat + + ") and BitsPerSample (" + b.bitsPerSample + "); PROJ reads only int16, uint16, " + + "int32, uint32, float32 and float64"); + } + + int photometric = dir.intValue(TiffTags.PHOTOMETRIC, TiffTags.PHOTOMETRIC_MINISBLACK); + if (photometric != TiffTags.PHOTOMETRIC_MINISBLACK) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has Photometric=" + photometric + "; only MINISBLACK (1) is supported"); + } + + b.compression = dir.intValue(TiffTags.COMPRESSION, TiffTags.COMPRESSION_NONE); + if (b.compression != TiffTags.COMPRESSION_NONE + && b.compression != TiffTags.COMPRESSION_ADOBE_DEFLATE + && b.compression != TiffTags.COMPRESSION_DEFLATE) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " uses " + TiffCodec.compressionName(b.compression) + " compression; proj4j " + + "reads only uncompressed and DEFLATE GeoTIFF grids"); + } + b.predictor = dir.intValue(TiffTags.PREDICTOR, TiffTags.PREDICTOR_NONE); + + b.subfileType = dir.intValue(TiffTags.SUBFILE_TYPE, 0) & 0xffffffffL; + + b.tiled = dir.has(TiffTags.TILE_WIDTH) && dir.has(TiffTags.TILE_LENGTH); + if (b.tiled) { + b.blockWidth = dir.intValue(TiffTags.TILE_WIDTH, 0); + b.blockHeight = dir.intValue(TiffTags.TILE_LENGTH, 0); + if (b.blockWidth <= 0 || b.blockHeight <= 0) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has invalid tile size " + b.blockWidth + "x" + b.blockHeight); + } + b.blockOffsets = dir.longs(TiffTags.TILE_OFFSETS); + b.blockByteCounts = dir.longs(TiffTags.TILE_BYTE_COUNTS); + } else { + b.blockWidth = b.width; + // libtiff defaults RowsPerStrip to 0xFFFFFFFF; PROJ then clamps it to the image height. + long rowsPerStrip = dir.has(TiffTags.ROWS_PER_STRIP) + ? unsignedTag(dir, TiffTags.ROWS_PER_STRIP) + : 0xffffffffL; + if (rowsPerStrip <= 0 || rowsPerStrip > b.height) { + rowsPerStrip = b.height; + } + b.blockHeight = (int) rowsPerStrip; + b.blockOffsets = dir.longs(TiffTags.STRIP_OFFSETS); + b.blockByteCounts = dir.longs(TiffTags.STRIP_BYTE_COUNTS); + } + if (b.blockOffsets == null || b.blockByteCounts == null) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + " is missing its " + + (b.tiled ? "TileOffsets/TileByteCounts" : "StripOffsets/StripByteCounts") + + " tags"); + } + // width and height are each at most GridExtents.MAX_EXTENT by now, so these two cannot + // overflow; their product still can, so it is formed in long and narrowed only after the + // strip/tile count has been checked against the arrays the file actually carries. + b.blocksPerRow = (b.width + b.blockWidth - 1) / b.blockWidth; + b.blocksPerCol = (b.height + b.blockHeight - 1) / b.blockHeight; + long blockCount = (long) b.blocksPerRow * b.blocksPerCol; + + // ONE definition of the sample stride, used by both the block-size bound here and the + // scatter loop in readSamples. They used to be computed separately and by different + // expressions -- `CONTIG ? samplesPerPixel : 1` here against a three-line + // separate/contig/stride cascade there -- which agreed for PlanarConfig 1 and 2 and + // disagreed by a factor of samplesPerPixel for anything else. The tag is now validated, so + // "anything else" no longer exists, and the single field means the two cannot drift apart + // again. + b.strideSamples = b.planarConfig == TiffTags.PLANARCONFIG_CONTIG ? b.samplesPerPixel : 1; + long blockBytes = + (long) b.blockWidth * b.blockHeight * b.strideSamples * (b.bitsPerSample / 8); + if (blockBytes == 0 || blockBytes > MAX_BLOCK_BYTES) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has an unsupported block size of " + blockBytes + " bytes"); + } + // `blocks * samplesPerPixel` was a plain int multiplication, and a negative product walks + // straight through the length test below. + long expectedBlocks = b.planarConfig == TiffTags.PLANARCONFIG_SEPARATE + ? blockCount * b.samplesPerPixel : blockCount; + if (b.blockOffsets.length < expectedBlocks || b.blockByteCounts.length < expectedBlocks) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + " declares " + + expectedBlocks + " " + (b.tiled ? "tiles" : "strips") + " but carries " + + b.blockOffsets.length + " offsets and " + b.blockByteCounts.length + + " byte counts"); + } + b.blocks = (int) blockCount; + + readGeoreferencing(b, dir, gridName, ifdIndex); + + b.metadata = GdalMetadata.parse(dir.ascii(TiffTags.GDAL_METADATA), b.samplesPerPixel); + String nodataText = dir.ascii(TiffTags.GDAL_NODATA); + if (nodataText != null) { + double parsed = GdalMetadata.parseDoubleOrNaN(nodataText); + if (!Double.isNaN(parsed)) { + b.noData = (float) parsed; + b.hasNodata = true; + } + } + return new GeoTiffImage(b); + } + + /** + * The first value of an integer tag, zero-extended to {@code long}, or {@code 0} if absent. + * {@code ImageWidth} and {@code RowsPerStrip} are {@code LONG} in real files and must not be + * squeezed through an {@code int} on the way to their range check. + */ + private static long unsignedTag(TiffDirectory dir, int tag) throws IOException { + long[] v = dir.longs(tag); + return v == null || v.length == 0 ? 0L : v[0]; + } + + /** + * {@code grids.cpp:1184-1317}: the GeoKey scan, then the {@code GeoTransformationMatrix} or + * {@code GeoPixelScale} + {@code GeoTiePoints} pair, then {@code RasterPixelIsArea}'s half-pixel + * shift, then the consistency test. + */ + private static void readGeoreferencing(Builder b, TiffDirectory dir, String gridName, + int ifdIndex) throws IOException { + boolean pixelIsArea = false; + long[] geokeys = dir.longs(TiffTags.GEO_KEY_DIRECTORY); + if (geokeys != null) { + if (geokeys.length < 4 || (geokeys.length % 4) != 0) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has " + geokeys.length + " values in its GeoKeyDirectory tag, which must " + + "be a non-zero multiple of 4"); + } + if (geokeys[0] != 1) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " declares GeoTIFF major version " + geokeys[0] + "; only 1 is supported"); + } + // geokeys[1]/[2] are the minor/revision; PROJ only logs about them, so neither do we. + final int gtModelTypeGeoKey = 1024; + final int modelTypeProjected = 1; + final int modelTypeGeographic = 2; + final int gtRasterTypeGeoKey = 1025; + final int rasterPixelIsArea = 1; + for (int i = 4; i + 3 < geokeys.length; i += 4) { + if (geokeys[i] == gtModelTypeGeoKey) { + if (geokeys[i + 3] == modelTypeProjected) { + b.geographic = false; + } else if (geokeys[i + 3] != modelTypeGeographic) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + + ifdIndex + " has GTModelTypeGeoKey=" + geokeys[i + 3] + + "; only ModelTypeGeographic (2) and ModelTypeProjected (1) are " + + "supported"); + } + } else if (geokeys[i] == gtRasterTypeGeoKey) { + if (geokeys[i + 3] == rasterPixelIsArea) { + pixelIsArea = true; + } + } + } + } + + double hRes; + double vRes; + double west; + double north; + double[] matrix = dir.doubles(TiffTags.GEO_TRANS_MATRIX); + if (matrix != null && matrix.length == 16) { + if (matrix[1] != 0 || matrix[4] != 0) { + throw new UnsupportedTiffException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has rotational terms in its GeoTransformationMatrix tag (" + matrix[1] + + ", " + matrix[4] + "); only axis-aligned grids are supported"); + } + west = matrix[3]; + hRes = matrix[0]; + north = matrix[7]; + // Negated to simulate the GeoPixelScale convention, exactly as upstream comments. + vRes = -matrix[5]; + } else { + double[] scale = dir.doubles(TiffTags.GEO_PIXEL_SCALE); + if (scale == null) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has neither a GeoTransformationMatrix nor a GeoPixelScale tag"); + } + if (scale.length != 3) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + " has " + + scale.length + " values in its GeoPixelScale tag, expected 3"); + } + hRes = scale[0]; + vRes = scale[1]; + double[] tie = dir.doubles(TiffTags.GEO_TIE_POINTS); + if (tie == null) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has no GeoTiePoints tag"); + } + if (tie.length != 6) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + " has " + + tie.length + " values in its GeoTiePoints tag, expected 6"); + } + west = tie[3] - tie[0] * hRes; + north = tie[4] + tie[1] * vRes; + } + + if (pixelIsArea) { + west += 0.5 * hRes; + north -= 0.5 * vRes; + } + + double mul = b.geographic ? DEG_TO_RAD : 1.0; + b.west = west * mul; + b.north = north * mul; + b.resX = hRes * mul; + b.resY = Math.abs(vRes) * mul; + b.east = (west + hRes * (b.width - 1)) * mul; + b.south = (north - vRes * (b.height - 1)) * mul; + if (vRes < 0) { + double t = b.north; + b.north = b.south; + b.south = t; + } + b.bottomUp = vRes < 0; + + boolean ok = (!b.geographic + || (Math.abs(b.west) <= 4 * Math.PI && Math.abs(b.east) <= 4 * Math.PI + && Math.abs(b.north) <= Math.PI + 1e-5 && Math.abs(b.south) <= Math.PI + 1e-5)) + && b.west < b.east && b.south < b.north && b.resX > 1e-10 && b.resY > 1e-10; + if (!ok) { + throw new IOException("GeoTIFF grid " + gridName + " IFD " + ifdIndex + + " has inconsistent georeferencing: west=" + b.west + " east=" + b.east + + " south=" + b.south + " north=" + b.north + " resX=" + b.resX + + " resY=" + b.resY + " (radians, geographic=" + b.geographic + ")"); + } + } + + // --- Accessors --------------------------------------------------------------------------- + + /** The grid name this image belongs to, plus its IFD index when the file has more than one. */ + public String name() { + return name; + } + + /** 0-based IFD index. */ + public int ifdIndex() { + return ifdIndex; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public int samplesPerPixel() { + return samplesPerPixel; + } + + /** The {@code SubfileType} tag, {@code 0} when absent. Non-zero and not {@code 2} is an overview. */ + public long subfileType() { + return subfileType; + } + + /** + * {@code false} for a {@code ModelTypeProjected} grid. proj4j's shift machinery is geographic-only, + * so a projected grid is rejected by the caller with a message saying so — the same place PROJ + * rejects it, {@code pj_hgrid_value}'s "Can only handle grids referenced in a geographic + * CRS". + */ + public boolean isGeographic() { + return geographic; + } + + /** Radians for a geographic grid, native units otherwise. */ + public double west() { + return west; + } + + public double south() { + return south; + } + + public double east() { + return east; + } + + public double north() { + return north; + } + + public double resX() { + return resX; + } + + public double resY() { + return resY; + } + + /** {@code true} iff the first image row is the southernmost, i.e. a negative vertical scale. */ + public boolean isBottomUp() { + return bottomUp; + } + + /** A {@code GDAL_METADATA} item, or the empty string. Never {@code null}. */ + public String metadataItem(String key, int sample) { + return metadata.item(key, sample); + } + + /** A grid-level {@code GDAL_METADATA} item, or the empty string. */ + public String metadataItem(String key) { + return metadata.item(key, GdalMetadata.GRID_LEVEL); + } + + /** {@code GTiffGrid::isNodata}: the declared sentinel, or any NaN. */ + public boolean isNodata(float value) { + return (hasNodata && value == noData) || Double.isNaN(value); + } + + public boolean hasNodata() { + return hasNodata; + } + + public float noDataValue() { + return noData; + } + + /** + * Reads whole sample planes, south row first. + * + *

Each returned array is {@code width * height} long, indexed {@code y * width + x} with + * {@code y = 0} the southernmost row — the layout every other proj4j grid reader + * uses, and the one {@code Grid.nad_intr} and {@code VerticalGrid.valueAt} index into. The + * top-down-versus-bottom-up flip is applied here, once, from + * {@code yTIFF = bottomUp ? y : height - 1 - y} ({@code grids.cpp:668}). + * + *

Blocks are decoded once each and scattered into every requested plane, so a + * {@code PLANARCONFIG_CONTIG} two-band horizontal grid inflates its strips once rather than twice. + * + * @param samples the sample indices wanted, in the order the result should be in + * @return one {@code float[width * height]} per requested sample + * @throws IOException if a block is truncated, corrupt, or needs an unimplemented codec + */ + public float[][] readSamples(int[] samples) throws IOException { + for (int i = 0; i < samples.length; i++) { + if (samples[i] < 0 || samples[i] >= samplesPerPixel) { + throw new IOException("GeoTIFF grid " + name + " IFD " + ifdIndex + + ": sample index " + samples[i] + " is outside 0.." + + (samplesPerPixel - 1)); + } + } + float[][] out = new float[samples.length][]; + for (int i = 0; i < samples.length; i++) { + out[i] = new float[width * height]; + } + boolean separate = planarConfig == TiffTags.PLANARCONFIG_SEPARATE && samplesPerPixel > 1; + boolean contig = planarConfig == TiffTags.PLANARCONFIG_CONTIG && samplesPerPixel > 1; + // strideSamples is the field computed in of(), not a second local derivation. `rowBytes * + // rowsThisBlock` in block() is exactly the `blockBytes` bounded there by MAX_BLOCK_BYTES, + // which is only true because both use the same stride. + int rowBytes = blockWidth * strideSamples * bytesPerSample; + + for (int by = 0; by < blocksPerCol; by++) { + int rowsThisBlock = tiled ? blockHeight + : Math.min(blockHeight, height - by * blockHeight); + for (int bx = 0; bx < blocksPerRow; bx++) { + int logicalBlock = by * blocksPerRow + bx; + if (separate) { + for (int i = 0; i < samples.length; i++) { + byte[] buf = block(logicalBlock + samples[i] * blocks, rowsThisBlock, + rowBytes, strideSamples); + scatter(buf, out[i], samples[i], bx, by, rowsThisBlock, 1, false); + } + } else { + byte[] buf = block(logicalBlock, rowsThisBlock, rowBytes, strideSamples); + for (int i = 0; i < samples.length; i++) { + scatter(buf, out[i], samples[i], bx, by, rowsThisBlock, strideSamples, + contig); + } + } + } + } + return out; + } + + /** Convenience for a single sample. */ + public float[] readSample(int sample) throws IOException { + return readSamples(new int[]{sample})[0]; + } + + private void scatter(byte[] buf, float[] out, int sample, int bx, int by, int rowsThisBlock, + int strideSamples, boolean contig) { + ByteBuffer bb = ByteBuffer.wrap(buf).order(order); + for (int yy = 0; yy < rowsThisBlock; yy++) { + int yTiff = by * blockHeight + yy; + if (yTiff >= height) { + break; + } + int y = bottomUp ? yTiff : height - 1 - yTiff; + int rowBase = y * width; + for (int xx = 0; xx < blockWidth; xx++) { + int x = bx * blockWidth + xx; + if (x >= width) { + break; + } + int offsetInBlock = xx + yy * blockWidth; + if (contig) { + offsetInBlock = offsetInBlock * strideSamples + sample; + } + out[rowBase + x] = readValue(bb, offsetInBlock, sample); + } + } + } + + /** + * Decodes one physical block and undoes its predictor. Not cached: {@link #readSamples} visits + * each block exactly once per plane it contributes to. + */ + private byte[] block(int physicalBlock, int rowsThisBlock, int rowBytes, int strideSamples) + throws IOException { + if (physicalBlock < 0 || physicalBlock >= blockOffsets.length) { + throw new IOException("GeoTIFF grid " + name + " IFD " + ifdIndex + " asks for " + + (tiled ? "tile " : "strip ") + physicalBlock + " of " + blockOffsets.length); + } + int expected = rowBytes * rowsThisBlock; + byte[] buf = TiffCodec.decodeBlock(file, blockOffsets[physicalBlock], + blockByteCounts[physicalBlock], compression, expected); + TiffCodec.undoPredictor(buf, rowsThisBlock, rowBytes, predictor, bytesPerSample, + strideSamples, sampleFormat, order); + return buf; + } + + /** + * {@code GTiffGrid::readValue}: the raw sample, then {@code value * scale + offset} — but + * only when the value is not the nodata sentinel and a scale/offset was actually declared. + * PROJ's guard is {@code sample < m_adfScale.size()}, and that vector stays empty until a + * {@code role="scale"} or {@code role="offset"} item appears, so an absent scale means the raw + * value rather than a multiply by one. + */ + private float readValue(ByteBuffer bb, int offsetInBlock, int sample) { + double raw; + int p = offsetInBlock * bytesPerSample; + if (p < 0 || p + bytesPerSample > bb.limit()) { + // Past the decoded data: libtiff leaves such bytes zero, and so does decodeBlock. + return 0.0f; + } + if (sampleFormat == TiffTags.SAMPLEFORMAT_IEEEFP) { + raw = bitsPerSample == 32 ? bb.getFloat(p) : bb.getDouble(p); + } else if (bitsPerSample == 16) { + raw = sampleFormat == TiffTags.SAMPLEFORMAT_INT + ? bb.getShort(p) : (bb.getShort(p) & 0xffff); + } else { + raw = sampleFormat == TiffTags.SAMPLEFORMAT_INT + ? bb.getInt(p) : (bb.getInt(p) & 0xffffffffL); + } + float asFloat = (float) raw; + if ((!hasNodata || asFloat != noData) && metadata.hasScaleOffset()) { + return (float) (raw * metadata.scaleFor(sample) + metadata.offsetFor(sample)); + } + return asFloat; + } + + @Override + public String toString() { + return "GeoTiffImage[" + name + " IFD " + ifdIndex + "; " + width + "x" + height + "; " + + samplesPerPixel + " sample(s); " + bitsPerSample + "-bit fmt " + sampleFormat + + "; " + (tiled ? "tiled " : "strips ") + blockWidth + "x" + blockHeight + + "; compression " + compression + "; predictor " + predictor + + "; bottomUp=" + bottomUp + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffCodec.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffCodec.java new file mode 100644 index 0000000..5e521e1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffCodec.java @@ -0,0 +1,257 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.io.IOException; +import java.nio.ByteOrder; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; + +/** + * The two decoding steps a PROJ geodetic GeoTIFF can need: DEFLATE, and a predictor. + * + *

Compression

+ *

Exactly two codecs are implemented: {@code COMPRESSION_NONE} and DEFLATE, under both of its tag + * values ({@code 8} = {@code ADOBE_DEFLATE} and the older private {@code 32946} = {@code DEFLATE}; + * they denote the same zlib stream). Every grid PROJ publishes uses {@code 8}. DEFLATE comes from + * {@link java.util.zip.Inflater} in the JDK, which is how the reader holds to proj4j core's + * zero-runtime-dependency rule. + * + *

Anything else — LZW, PackBits, JPEG, WEBP, ZSTD, LERC — raises {@link UnsupportedTiffException} + * naming the codec. libtiff would decode several of those, so this is a stated narrowing rather than + * an oversight: a grid we cannot decode must say so, not return zeros. + * + *

Predictors, and the byte-order trap in them

+ *

Predictor {@code 3}, the floating-point predictor, is not optional: all seven of PROJ's + * US grids are {@code Predictor=3} + {@code PLANARCONFIG_SEPARATE} + DEFLATE. Both predictors are + * ported from libtiff's {@code tif_predict.c}, which is where PROJ's behaviour actually comes from. + * + *

libtiff resolves byte order differently for the two predictors, and copying the wrong one + * silently produces finite, wrong values on a big-endian file: + *

    + *
  • Predictor 2. {@code PredictorSetupDecode} installs {@code swabHorAcc16/32} + * and sets {@code tif_postdecode = _TIFFNoPostDecode} when the file order differs from the + * host, i.e. the deltas are byte-swapped to native before accumulation. Adding with the + * carry propagating from whichever byte the file order makes least significant is the + * same arithmetic without the swap, and leaves the result in file order.
  • + *
  • Predictor 3. Also sets {@code _TIFFNoPostDecode}, with the comment "the data + * should not be swapped outside of the floating point predictor routine". The on-disk plane + * layout is byte-order independent — plane 0 always holds the most significant byte of every + * sample, which is why {@code fpAcc}/{@code fpDiff} have mirrored {@code WORDS_BIGENDIAN} + * branches that agree on the file layout. The de-interleave here writes each sample back in the + * file's order, so everything downstream can read with one byte order.
  • + *
+ */ +final class TiffCodec { + + private TiffCodec() { + } + + /** Names a compression code, for an error message that identifies the unsupported feature. */ + static String compressionName(int code) { + switch (code) { + case TiffTags.COMPRESSION_NONE: return "none"; + case 2: return "CCITT modified Huffman"; + case 3: return "CCITT Group 3 fax"; + case 4: return "CCITT Group 4 fax"; + case 5: return "LZW"; + case 6: return "old-style JPEG"; + case 7: return "JPEG"; + case TiffTags.COMPRESSION_ADOBE_DEFLATE: return "Adobe DEFLATE"; + case 32773: return "PackBits"; + case TiffTags.COMPRESSION_DEFLATE: return "DEFLATE (private code 32946)"; + case 34712: return "JPEG 2000"; + case 34887: return "LERC"; + case 50000: return "ZSTD"; + case 50001: return "WEBP"; + default: return "code " + code; + } + } + + /** + * Decodes one strip or tile into a freshly allocated buffer of exactly {@code expectedBytes}. + * + *

Short output is tolerated and leaves the tail zero, which is what libtiff produces for the + * last, partially populated strip of an image whose height is not a multiple of + * {@code RowsPerStrip}. Output longer than {@code expectedBytes} is truncated. + * + * @param file the whole TIFF + * @param offset byte offset of the encoded block + * @param byteCount encoded length + * @param compression the {@code Compression} tag value + * @param expectedBytes uncompressed size of one block + * @return a buffer of exactly {@code expectedBytes} + * @throws IOException if the block runs past end of file, or the DEFLATE stream is corrupt + */ + static byte[] decodeBlock(byte[] file, long offset, long byteCount, int compression, + int expectedBytes) throws IOException { + if (offset < 0 || byteCount < 0 || offset + byteCount > file.length) { + throw new IOException("TIFF truncated: block of " + byteCount + " bytes at offset " + + offset + ", but the file is " + file.length + " bytes"); + } + byte[] out = new byte[expectedBytes]; + if (compression == TiffTags.COMPRESSION_NONE) { + int n = (int) Math.min(byteCount, expectedBytes); + System.arraycopy(file, (int) offset, out, 0, n); + return out; + } + if (compression != TiffTags.COMPRESSION_ADOBE_DEFLATE + && compression != TiffTags.COMPRESSION_DEFLATE) { + throw new UnsupportedTiffException("TIFF grid uses " + compressionName(compression) + + " compression; proj4j reads only uncompressed and DEFLATE GeoTIFF grids, which " + + "is what every grid PROJ publishes uses"); + } + Inflater inflater = new Inflater(); + try { + inflater.setInput(file, (int) offset, (int) byteCount); + int total = 0; + while (total < expectedBytes && !inflater.finished()) { + int n = inflater.inflate(out, total, expectedBytes - total); + if (n == 0 && (inflater.needsInput() || inflater.needsDictionary())) { + break; + } + total += n; + } + if (total < expectedBytes) { + // libtiff's ZIPDecode ends with `if (sp->stream.avail_out != 0) { TIFFErrorExtR(... + // "Not enough data at scanline %lu (short %I64d bytes)"); return 0; }` and a codec + // returning 0 makes TIFFReadEncodedStrip return -1, which PROJ propagates as a failed + // valueAt. Without this check a truncated zlib stream leaves the tail of the block + // zero, so a geoid model reads as exactly 0 m over the missing rows -- finite, + // plausible and catastrophic. Note the caller sizes `expectedBytes` from the *clamped* + // row count, exactly as libtiff sizes a short final strip, so a legitimately short + // last strip does not reach here. + throw new IOException("TIFF DEFLATE block at offset " + offset + " decoded to " + + total + " bytes; the block needs " + expectedBytes + + ". The file is truncated or the compressed stream is corrupt."); + } + } catch (DataFormatException e) { + throw new IOException("TIFF DEFLATE block at offset " + offset + " is corrupt: " + + e.getMessage(), e); + } finally { + inflater.end(); + } + return out; + } + + /** + * Undoes a predictor, in place, over a block laid out as {@code rows} rows of {@code rowBytes}. + * + *

libtiff applies the predictor one row at a time + * ({@code PredictorDecodeTile} loops {@code rowsize} at a time), so a delta never crosses a row + * boundary. Doing it over the whole block instead is a defect that shows only as a gradient + * building up down the image. + * + * @param block the decoded block, mutated in place + * @param rows number of rows present in the block + * @param rowBytes bytes per row: {@code (tiled ? tileWidth : imageWidth) * strideSamples * + * bytesPerSample} + * @param predictor the {@code Predictor} tag value + * @param bytesPerSample {@code BitsPerSample / 8} + * @param stride libtiff's {@code sp->stride}: {@code samplesPerPixel} for + * {@code CONTIG}, {@code 1} for {@code SEPARATE} + * @param sampleFormat the {@code SampleFormat} tag value + * @param order the file's byte order + * @throws IOException if the predictor or sample width is one this reader does not implement + */ + static void undoPredictor(byte[] block, int rows, int rowBytes, int predictor, + int bytesPerSample, int stride, int sampleFormat, ByteOrder order) + throws IOException { + if (predictor == TiffTags.PREDICTOR_NONE) { + return; + } + if (predictor == TiffTags.PREDICTOR_HORIZONTAL) { + if (sampleFormat == TiffTags.SAMPLEFORMAT_IEEEFP) { + throw new UnsupportedTiffException("TIFF grid declares Predictor=2 (horizontal " + + "differencing) with IEEE floating-point samples; TIFF defines predictor 2 " + + "for integer data and predictor 3 for floating point"); + } + for (int r = 0; r < rows; r++) { + undoHorizontal(block, r * rowBytes, rowBytes, bytesPerSample, stride, order); + } + return; + } + if (predictor == TiffTags.PREDICTOR_FLOATING_POINT) { + if (sampleFormat != TiffTags.SAMPLEFORMAT_IEEEFP) { + throw new UnsupportedTiffException("TIFF grid declares Predictor=3 (floating point) " + + "with SampleFormat=" + sampleFormat + "; predictor 3 is defined only for " + + "IEEE floating-point samples"); + } + for (int r = 0; r < rows; r++) { + undoFloatingPoint(block, r * rowBytes, rowBytes, bytesPerSample, stride, order); + } + return; + } + throw new UnsupportedTiffException("TIFF grid declares Predictor=" + predictor + + "; proj4j implements 1 (none), 2 (horizontal differencing) and 3 (floating point)"); + } + + /** + * libtiff {@code horAcc*}: each sample is a delta from the sample {@code stride} positions earlier + * in the same row. Carries propagate from the byte the file's order makes least significant, which + * is arithmetically identical to libtiff's swab-then-accumulate and leaves the block in file + * order. + */ + private static void undoHorizontal(byte[] b, int off, int rowBytes, int bytesPerSample, + int stride, ByteOrder order) { + if (bytesPerSample == 1) { + for (int i = stride; i < rowBytes; i++) { + b[off + i] += b[off + i - stride]; + } + return; + } + int samples = rowBytes / bytesPerSample; + boolean little = order == ByteOrder.LITTLE_ENDIAN; + for (int i = stride; i < samples; i++) { + int cur = off + i * bytesPerSample; + int prev = off + (i - stride) * bytesPerSample; + int carry = 0; + for (int k = 0; k < bytesPerSample; k++) { + int j = little ? k : bytesPerSample - 1 - k; + int sum = (b[cur + j] & 0xff) + (b[prev + j] & 0xff) + carry; + b[cur + j] = (byte) sum; + carry = sum >>> 8; + } + } + } + + /** + * libtiff {@code fpAcc}: byte-wise horizontal accumulation with the given stride, then a + * de-interleave that gathers each sample's bytes out of {@code bytesPerSample} byte planes. + * Plane 0 is the most significant byte, whatever the file's byte order; the reassembled samples + * are written back in the file's order so that a single byte order serves the whole read + * path. + */ + private static void undoFloatingPoint(byte[] b, int off, int rowBytes, int bytesPerSample, + int stride, ByteOrder order) { + for (int i = stride; i < rowBytes; i++) { + b[off + i] += b[off + i - stride]; + } + int words = rowBytes / bytesPerSample; + if (words == 0) { + return; + } + byte[] tmp = new byte[rowBytes]; + System.arraycopy(b, off, tmp, 0, rowBytes); + boolean little = order == ByteOrder.LITTLE_ENDIAN; + for (int w = 0; w < words; w++) { + for (int plane = 0; plane < bytesPerSample; plane++) { + int j = little ? bytesPerSample - 1 - plane : plane; + b[off + w * bytesPerSample + j] = tmp[plane * words + w]; + } + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffDirectory.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffDirectory.java new file mode 100644 index 0000000..02bcd65 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffDirectory.java @@ -0,0 +1,307 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * One TIFF Image File Directory: a tag-to-field map plus typed accessors. + * + *

An IFD entry is 12 bytes in classic TIFF (tag, type, 4-byte count, 4-byte value-or-offset) and + * 20 bytes in BigTIFF (tag, type, 8-byte count, 8-byte value-or-offset). If the values fit in the + * value slot they are stored there rather than at an offset, which is why every accessor here goes + * through {@link #bytesOf} instead of seeking unconditionally. + * + *

Deliberately tolerant in one direction and strict in the other: a tag this reader does not know + * is kept but never interpreted, while a tag it does know whose type or count is wrong is an + * error. Silently coercing a malformed field is how a grid file turns into a wrong coordinate. + * + *

Immutable after construction and therefore safe to share between threads. + */ +final class TiffDirectory { + + private static final Charset ASCII = Charset.forName("US-ASCII"); + + private static final class Field { + final int tag; + final int type; + final long count; + /** Either the file offset of the values, or {@code -1} when they are inline. */ + final long offset; + /** The raw value slot, always retained; used verbatim when the values are inline. */ + final byte[] inline; + + Field(int tag, int type, long count, long offset, byte[] inline) { + this.tag = tag; + this.type = type; + this.count = count; + this.offset = offset; + this.inline = inline; + } + } + + private final byte[] bytes; + private final ByteOrder order; + private final Map fields; + private final long ownOffset; + + private TiffDirectory(byte[] bytes, ByteOrder order, Map fields, long ownOffset) { + this.bytes = bytes; + this.order = order; + this.fields = fields; + this.ownOffset = ownOffset; + } + + /** + * Reads the IFD at {@code offset} and returns it together with the offset of the next IFD. + * + * @param bigTiff selects the 20-byte BigTIFF entry layout over the 12-byte classic one + * @return the parsed directory; {@link #nextOffset} carries the chain pointer + */ + static Parsed parse(byte[] bytes, ByteOrder order, long offset, boolean bigTiff) + throws IOException { + final int entrySize = bigTiff ? 20 : 12; + // Two distinct widths that are easy to conflate, and conflating them mis-reads every + // out-of-line value offset in a classic TIFF: the *directory's* entry-count field is 2 bytes + // in classic TIFF and 8 in BigTIFF, while an *entry's* value-count field is 4 and 8. + final int dirCountSize = bigTiff ? 8 : 2; + final int entryCountSize = bigTiff ? 8 : 4; + final int valueSlot = bigTiff ? 8 : 4; + final int offsetSize = bigTiff ? 8 : 4; + + long entryCount = readUnsigned(bytes, order, offset, dirCountSize); + if (entryCount < 0 || entryCount > 65535) { + throw new IOException("TIFF IFD at " + offset + " declares " + entryCount + + " entries, which is not plausible"); + } + long entriesStart = offset + dirCountSize; + long end = entriesStart + entryCount * entrySize + offsetSize; + if (end > bytes.length) { + throw new IOException("TIFF truncated: IFD at " + offset + " with " + entryCount + + " entries needs " + end + " bytes but the file is " + bytes.length); + } + + Map fields = new LinkedHashMap(); + for (long i = 0; i < entryCount; i++) { + long p = entriesStart + i * entrySize; + int tag = (int) readUnsigned(bytes, order, p, 2); + int type = (int) readUnsigned(bytes, order, p + 2, 2); + long count = readUnsigned(bytes, order, p + 4, entryCountSize); + long slot = p + 4 + entryCountSize; + byte[] inline = new byte[valueSlot]; + System.arraycopy(bytes, (int) slot, inline, 0, valueSlot); + int width = TiffTags.sizeOf(type); + long totalBytes = width == 0 ? -1 : count * width; + long valueOffset = -1L; + if (totalBytes > valueSlot) { + valueOffset = bigTiff + ? readUnsigned(bytes, order, slot, 8) + : readUnsigned(bytes, order, slot, 4); + if (valueOffset < 0 || valueOffset + totalBytes > bytes.length) { + throw new IOException("TIFF truncated: " + TiffTags.nameOf(tag) + " needs " + + totalBytes + " bytes at offset " + valueOffset + " but the file is " + + bytes.length); + } + } + fields.put(Integer.valueOf(tag), new Field(tag, type, count, valueOffset, inline)); + } + + long next = readUnsigned(bytes, order, entriesStart + entryCount * entrySize, offsetSize); + return new Parsed(new TiffDirectory(bytes, order, fields, offset), next); + } + + /** A parsed directory plus the offset of the next one, or {@code 0} for end-of-chain. */ + static final class Parsed { + final TiffDirectory directory; + final long nextOffset; + + Parsed(TiffDirectory directory, long nextOffset) { + this.directory = directory; + this.nextOffset = nextOffset; + } + } + + /** The file offset this directory was read from. Identity, for diagnostics. */ + long offset() { + return ownOffset; + } + + ByteOrder order() { + return order; + } + + byte[] fileBytes() { + return bytes; + } + + boolean has(int tag) { + return fields.containsKey(Integer.valueOf(tag)); + } + + /** + * The values of an integer-typed field, widened to {@code long}. Unsigned types are + * zero-extended, signed types sign-extended, which is what libtiff's accessors do. + * + * @return {@code null} if the tag is absent + * @throws IOException if the tag is present but not an integer type + */ + long[] longs(int tag) throws IOException { + Field f = fields.get(Integer.valueOf(tag)); + if (f == null) { + return null; + } + int width = TiffTags.sizeOf(f.type); + boolean signed; + switch (f.type) { + case TiffTags.TYPE_BYTE: + case TiffTags.TYPE_SHORT: + case TiffTags.TYPE_LONG: + case TiffTags.TYPE_LONG8: + case TiffTags.TYPE_IFD8: + case TiffTags.TYPE_UNDEFINED: + signed = false; + break; + case TiffTags.TYPE_SBYTE: + case TiffTags.TYPE_SSHORT: + case TiffTags.TYPE_SLONG: + case TiffTags.TYPE_SLONG8: + signed = true; + break; + default: + throw new IOException("TIFF " + TiffTags.nameOf(tag) + " has non-integer type " + + f.type); + } + byte[] src = bytesOf(f); + int n = (int) Math.min(f.count, src.length / width); + long[] out = new long[n]; + for (int i = 0; i < n; i++) { + long v = readUnsigned(src, order, (long) i * width, width); + if (signed) { + int shift = 64 - 8 * width; + v = shift == 0 ? v : (v << shift) >> shift; + } + out[i] = v; + } + return out; + } + + /** + * A single integer-valued tag. + * + * @param fallback returned when the tag is absent, exactly as libtiff's {@code TIFFGetField} + * leaves the caller's variable untouched + */ + int intValue(int tag, int fallback) throws IOException { + long[] v = longs(tag); + return v == null || v.length == 0 ? fallback : (int) v[0]; + } + + /** + * The values of a {@code DOUBLE}-typed field. {@code FLOAT} is accepted and widened, since some + * writers emit it for {@code GeoPixelScale}. + * + * @return {@code null} if the tag is absent + */ + double[] doubles(int tag) throws IOException { + Field f = fields.get(Integer.valueOf(tag)); + if (f == null) { + return null; + } + if (f.type != TiffTags.TYPE_DOUBLE && f.type != TiffTags.TYPE_FLOAT) { + throw new IOException("TIFF " + TiffTags.nameOf(tag) + " has type " + f.type + + "; only DOUBLE and FLOAT are read"); + } + int width = TiffTags.sizeOf(f.type); + byte[] src = bytesOf(f); + int n = (int) Math.min(f.count, src.length / width); + double[] out = new double[n]; + ByteBuffer buf = ByteBuffer.wrap(src).order(order); + for (int i = 0; i < n; i++) { + out[i] = f.type == TiffTags.TYPE_DOUBLE ? buf.getDouble(i * 8) : buf.getFloat(i * 4); + } + return out; + } + + /** + * An {@code ASCII} field with its NUL terminators stripped. + * + * @return {@code null} if the tag is absent + */ + String ascii(int tag) throws IOException { + Field f = fields.get(Integer.valueOf(tag)); + if (f == null) { + return null; + } + if (f.type != TiffTags.TYPE_ASCII && f.type != TiffTags.TYPE_UNDEFINED + && f.type != TiffTags.TYPE_BYTE) { + throw new IOException("TIFF " + TiffTags.nameOf(tag) + " has type " + f.type + + "; expected ASCII"); + } + byte[] src = bytesOf(f); + int n = (int) Math.min(f.count, src.length); + int len = n; + while (len > 0 && src[len - 1] == 0) { + len--; + } + return new String(src, 0, len, ASCII); + } + + /** The field's value bytes, whether inline or at an offset. */ + private byte[] bytesOf(Field f) { + int width = TiffTags.sizeOf(f.type); + long total = width == 0 ? 0 : f.count * width; + if (f.offset < 0) { + // Inline. Only the leading `total` bytes of the slot are meaningful. + int n = (int) Math.min(total, f.inline.length); + byte[] out = new byte[n]; + System.arraycopy(f.inline, 0, out, 0, n); + return out; + } + byte[] out = new byte[(int) total]; + System.arraycopy(bytes, (int) f.offset, out, 0, out.length); + return out; + } + + /** + * Reads {@code width} bytes as an unsigned little- or big-endian integer. + * + *

Package-visible and static because the TIFF header itself, before any directory exists, + * needs exactly this. + */ + static long readUnsigned(byte[] b, ByteOrder order, long pos, int width) throws IOException { + if (pos < 0 || pos + width > b.length) { + throw new IOException("TIFF truncated: wanted " + width + " bytes at " + pos + + " but the file is " + b.length); + } + int p = (int) pos; + long v = 0; + if (order == ByteOrder.LITTLE_ENDIAN) { + for (int i = width - 1; i >= 0; i--) { + v = (v << 8) | (b[p + i] & 0xffL); + } + } else { + for (int i = 0; i < width; i++) { + v = (v << 8) | (b[p + i] & 0xffL); + } + } + return v; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffFile.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffFile.java new file mode 100644 index 0000000..3f9b6e7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffFile.java @@ -0,0 +1,156 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.io.IOException; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * The TIFF container: byte order, classic-vs-BigTIFF, and the chain of IFDs. + * + *

Four signatures are accepted, exactly the four PROJ's {@code IsTIFF} + * ({@code 9.8.1:src/grids.cpp:377-385}) accepts: {@code II}/{@code MM} crossed with version + * {@code 42} (classic) and {@code 43} (BigTIFF). + * + *

The IFD chain is walked eagerly and completely at construction, with a visited-offset set, so a + * file whose {@code next} pointer loops back on itself fails immediately instead of spinning. libtiff + * has the same guard; a grid file is untrusted input in this codebase (a {@code +grids=} token can + * come from a per-row CRS string), so the guard is not optional. + */ +final class TiffFile { + + /** libtiff's own ceiling on directory count, and a sane bound on a grid file. */ + private static final int MAX_DIRECTORIES = 65536; + + private final ByteOrder order; + private final boolean bigTiff; + private final List directories; + + private TiffFile(ByteOrder order, boolean bigTiff, List directories) { + this.order = order; + this.bigTiff = bigTiff; + this.directories = directories; + } + + /** + * PROJ's {@code IsTIFF}: byte order marker plus version 42 or 43, in either byte order. + * + *

Ported including its oddity — it tests {@code header[2]}/{@code header[3]} for the magic in + * both orders regardless of the byte-order marker, so {@code II} with a big-endian 42 is + * also called a TIFF. Keeping that means proj4j and PROJ agree on which files are TIFFs at + * all, which is what decides between "unrecognised grid format" and "bad TIFF". + * + * @param header the first bytes of the file; only the first four are read + * @param length how many of them are valid + */ + static boolean isTiff(byte[] header, int length) { + if (length < 4) { + return false; + } + int b0 = header[0] & 0xff; + int b1 = header[1] & 0xff; + int b2 = header[2] & 0xff; + int b3 = header[3] & 0xff; + boolean marker = (b0 == 'I' && b1 == 'I') || (b0 == 'M' && b1 == 'M'); + return marker && ((b2 == 0x2A && b3 == 0) || (b3 == 0x2A && b2 == 0) + || (b2 == 0x2B && b3 == 0) || (b3 == 0x2B && b2 == 0)); + } + + /** + * Parses the header and every IFD. + * + * @param bytes the whole file + * @throws IOException if the signature is not TIFF, the file is truncated, or the IFD chain loops + */ + static TiffFile open(byte[] bytes) throws IOException { + if (bytes.length < 8) { + throw new IOException("TIFF file is " + bytes.length + + " bytes; the header alone needs 8"); + } + int b0 = bytes[0] & 0xff; + int b1 = bytes[1] & 0xff; + ByteOrder order; + if (b0 == 'I' && b1 == 'I') { + order = ByteOrder.LITTLE_ENDIAN; + } else if (b0 == 'M' && b1 == 'M') { + order = ByteOrder.BIG_ENDIAN; + } else { + throw new IOException("Not a TIFF: byte order marker is 0x" + + Integer.toHexString(b0) + Integer.toHexString(b1) + + ", expected 'II' or 'MM'"); + } + int version = (int) TiffDirectory.readUnsigned(bytes, order, 2, 2); + boolean bigTiff; + long firstIfd; + if (version == 42) { + bigTiff = false; + firstIfd = TiffDirectory.readUnsigned(bytes, order, 4, 4); + } else if (version == 43) { + bigTiff = true; + int offsetSize = (int) TiffDirectory.readUnsigned(bytes, order, 4, 2); + if (offsetSize != 8) { + throw new UnsupportedTiffException("BigTIFF declares an offset size of " + offsetSize + + " bytes; only 8 is defined"); + } + long reserved = TiffDirectory.readUnsigned(bytes, order, 6, 2); + if (reserved != 0) { + throw new IOException("BigTIFF reserved field is " + reserved + ", expected 0"); + } + if (bytes.length < 16) { + throw new IOException("BigTIFF file is " + bytes.length + + " bytes; the header alone needs 16"); + } + firstIfd = TiffDirectory.readUnsigned(bytes, order, 8, 8); + } else { + throw new IOException("Not a TIFF: version is " + version + ", expected 42 or 43"); + } + + List dirs = new ArrayList(); + List seen = new ArrayList(); + long at = firstIfd; + while (at != 0) { + if (seen.contains(Long.valueOf(at))) { + throw new IOException("TIFF IFD chain loops back to offset " + at); + } + if (dirs.size() >= MAX_DIRECTORIES) { + throw new IOException("TIFF has more than " + MAX_DIRECTORIES + " directories"); + } + seen.add(Long.valueOf(at)); + TiffDirectory.Parsed p = TiffDirectory.parse(bytes, order, at, bigTiff); + dirs.add(p.directory); + at = p.nextOffset; + } + if (dirs.isEmpty()) { + throw new IOException("TIFF has no image file directory"); + } + return new TiffFile(order, bigTiff, Collections.unmodifiableList(dirs)); + } + + ByteOrder order() { + return order; + } + + boolean isBigTiff() { + return bigTiff; + } + + List directories() { + return directories; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffTags.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffTags.java new file mode 100644 index 0000000..5d6c7de --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/TiffTags.java @@ -0,0 +1,153 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +/** + * The complete set of TIFF tags, field types and enumerated values that PROJ 9.8.1's grid + * reader looks at, and nothing else. + * + *

Every constant here is asked for by name somewhere in {@code 9.8.1:src/grids.cpp} + * ({@code GTiffDataset::nextGrid}, the {@code GTiffGrid} constructor and {@code GTiffGrid::valueAt}) + * or is needed to decode the pixel data those functions ask libtiff for. A GeoTIFF carrying anything + * else carries it unread; a GeoTIFF requiring anything else is rejected by name — see + * {@link UnsupportedTiffException}. + * + *

The tag numbers for the GeoTIFF and GDAL private tags are the ones PROJ declares itself, as + * {@code constexpr uint16_t} at {@code grids.cpp:395-405}, because libtiff does not know them and + * PROJ registers them with a one-time tag extender. + */ +final class TiffTags { + + // --- Baseline TIFF tags ------------------------------------------------------------------- + + /** {@code NewSubfileType}. PROJ reads it to skip reduced-resolution overviews. */ + static final int SUBFILE_TYPE = 254; + static final int IMAGE_WIDTH = 256; + static final int IMAGE_LENGTH = 257; + static final int BITS_PER_SAMPLE = 258; + static final int COMPRESSION = 259; + static final int PHOTOMETRIC = 262; + static final int STRIP_OFFSETS = 273; + static final int SAMPLES_PER_PIXEL = 277; + static final int ROWS_PER_STRIP = 278; + static final int STRIP_BYTE_COUNTS = 279; + static final int PLANAR_CONFIG = 284; + static final int PREDICTOR = 317; + static final int TILE_WIDTH = 322; + static final int TILE_LENGTH = 323; + static final int TILE_OFFSETS = 324; + static final int TILE_BYTE_COUNTS = 325; + static final int SAMPLE_FORMAT = 339; + + // --- GeoTIFF tags, per grids.cpp:395-400 ------------------------------------------------- + + static final int GEO_PIXEL_SCALE = 33550; + static final int GEO_TIE_POINTS = 33922; + static final int GEO_TRANS_MATRIX = 34264; + static final int GEO_KEY_DIRECTORY = 34735; + + // --- GDAL private tags, per grids.cpp:403-404 ------------------------------------------- + + static final int GDAL_METADATA = 42112; + static final int GDAL_NODATA = 42113; + + // --- Field types (TIFF 6.0 section 2, plus the BigTIFF additions) ------------------------ + + static final int TYPE_BYTE = 1; + static final int TYPE_ASCII = 2; + static final int TYPE_SHORT = 3; + static final int TYPE_LONG = 4; + static final int TYPE_RATIONAL = 5; + static final int TYPE_SBYTE = 6; + static final int TYPE_UNDEFINED = 7; + static final int TYPE_SSHORT = 8; + static final int TYPE_SLONG = 9; + static final int TYPE_SRATIONAL = 10; + static final int TYPE_FLOAT = 11; + static final int TYPE_DOUBLE = 12; + static final int TYPE_LONG8 = 16; + static final int TYPE_SLONG8 = 17; + static final int TYPE_IFD8 = 18; + + /** Byte width of each field type, indexed by type code. Zero means "unknown type". */ + private static final int[] TYPE_SIZES = { + 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4, 0, 0, 8, 8, 8}; + + // --- Enumerated values ------------------------------------------------------------------- + + static final int COMPRESSION_NONE = 1; + /** {@code COMPRESSION_ADOBE_DEFLATE}: zlib stream, the value every PROJ grid uses. */ + static final int COMPRESSION_ADOBE_DEFLATE = 8; + /** {@code COMPRESSION_DEFLATE}: the older private code for the same zlib stream. */ + static final int COMPRESSION_DEFLATE = 32946; + + static final int PREDICTOR_NONE = 1; + static final int PREDICTOR_HORIZONTAL = 2; + static final int PREDICTOR_FLOATING_POINT = 3; + + static final int PHOTOMETRIC_MINISBLACK = 1; + + static final int PLANARCONFIG_CONTIG = 1; + static final int PLANARCONFIG_SEPARATE = 2; + + static final int SAMPLEFORMAT_UINT = 1; + static final int SAMPLEFORMAT_INT = 2; + static final int SAMPLEFORMAT_IEEEFP = 3; + + /** {@code FILETYPE_PAGE}, the one non-zero {@code SubfileType} PROJ tolerates. */ + static final int FILETYPE_PAGE = 2; + + private TiffTags() { + } + + /** + * @param type a TIFF field type code + * @return the byte width of one value of that type, or {@code 0} if the type is unknown + */ + static int sizeOf(int type) { + return type >= 0 && type < TYPE_SIZES.length ? TYPE_SIZES[type] : 0; + } + + /** A human-readable name for a tag, for error messages. Falls back to the number. */ + static String nameOf(int tag) { + switch (tag) { + case SUBFILE_TYPE: return "SubfileType"; + case IMAGE_WIDTH: return "ImageWidth"; + case IMAGE_LENGTH: return "ImageLength"; + case BITS_PER_SAMPLE: return "BitsPerSample"; + case COMPRESSION: return "Compression"; + case PHOTOMETRIC: return "Photometric"; + case STRIP_OFFSETS: return "StripOffsets"; + case SAMPLES_PER_PIXEL: return "SamplesPerPixel"; + case ROWS_PER_STRIP: return "RowsPerStrip"; + case STRIP_BYTE_COUNTS: return "StripByteCounts"; + case PLANAR_CONFIG: return "PlanarConfig"; + case PREDICTOR: return "Predictor"; + case TILE_WIDTH: return "TileWidth"; + case TILE_LENGTH: return "TileLength"; + case TILE_OFFSETS: return "TileOffsets"; + case TILE_BYTE_COUNTS: return "TileByteCounts"; + case SAMPLE_FORMAT: return "SampleFormat"; + case GEO_PIXEL_SCALE: return "GeoPixelScale"; + case GEO_TIE_POINTS: return "GeoTiePoints"; + case GEO_TRANS_MATRIX: return "GeoTransformationMatrix"; + case GEO_KEY_DIRECTORY: return "GeoKeyDirectory"; + case GDAL_METADATA: return "GDAL_METADATA"; + case GDAL_NODATA: return "GDAL_NODATA"; + default: return "tag " + tag; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/UnsupportedTiffException.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/UnsupportedTiffException.java new file mode 100644 index 0000000..610c231 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/UnsupportedTiffException.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.tiff; + +import java.io.IOException; + +/** + * Thrown when a TIFF is well-formed but uses a feature this reader deliberately does not implement. + * + *

This is not a general TIFF decoder: it reads the documented geodetic-grid + * subset described in PROJ's {@code docs/source/specifications/geodetictiffgrids.rst} and read by + * {@code 9.8.1:src/grids.cpp}. Anything outside that subset — a palette image, JPEG or LZW + * compression, 1-bit or 8-bit samples, a rotated {@code GeoTransformationMatrix} — must produce an + * exception naming the feature, never a plausible-looking coordinate. A separate type exists + * so a caller can tell "this file needs something we do not have" from "these bytes are corrupt". + * + * @since 1.5 + */ +public class UnsupportedTiffException extends IOException { + + private static final long serialVersionUID = 1L; + + /** + * @param message must name the unsupported feature and its value + */ + public UnsupportedTiffException(String message) { + super(message); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/datum/tiff/package-info.java b/core/src/main/java/org/locationtech/proj4j/datum/tiff/package-info.java new file mode 100644 index 0000000..20d2342 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/datum/tiff/package-info.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * A reader for the geodetic GeoTIFF grid profile, and for nothing else. + * + *

Scope

+ *

This package implements the documented subset of TIFF that PROJ 9.8.1 reads for grids — the + * profile specified in PROJ's {@code docs/source/specifications/geodetictiffgrids.rst} and consumed by + * {@code src/grids.cpp}'s {@code GTiffDataset} / {@code GTiffGrid} / {@code GTiffHGridShiftSet} / + * {@code GTiffVGridShiftSet}. It is not a general TIFF decoder and must not become + * one. + * + *

What is read: + *

    + *
  • Classic TIFF and BigTIFF, little- and big-endian, i.e. all four signatures PROJ's + * {@code IsTIFF} accepts.
  • + *
  • Strips and tiles, {@code PLANARCONFIG_CONTIG} and {@code PLANARCONFIG_SEPARATE}.
  • + *
  • {@code COMPRESSION_NONE} and DEFLATE (tag values {@code 8} and {@code 32946}), via + * {@link java.util.zip.Inflater} — no third-party dependency, which is a hard constraint on + * proj4j core.
  • + *
  • Predictors {@code 1}, {@code 2} (horizontal differencing) and {@code 3} (floating point). + * Predictor {@code 3} is mandatory in practice: every one of PROJ's seven US grids uses it.
  • + *
  • Sample types {@code int16}, {@code uint16}, {@code int32}, {@code uint32}, {@code float32}, + * {@code float64} — PROJ's six-member {@code TIFFDataType} enum, no more.
  • + *
  • Georeferencing from {@code GeoTransformationMatrix}, or {@code GeoPixelScale} + + * {@code GeoTiePoints}; {@code GTModelTypeGeoKey}; {@code RasterPixelIsArea}'s half-pixel shift; + * and bottom-up images signalled by a negative vertical scale.
  • + *
  • {@code GDAL_METADATA} and {@code GDAL_NODATA}, which is where {@code TYPE}, {@code grid_name}, + * {@code parent_grid_name}, per-band {@code DESCRIPTION}, {@code UNITTYPE}, + * {@code positive_value} and the {@code scale}/{@code offset} roles live.
  • + *
+ * + *

What is refused, by name, with {@link org.locationtech.proj4j.datum.tiff.UnsupportedTiffException}: + * every other codec (LZW, PackBits, JPEG, JPEG 2000, LERC, ZSTD, WEBP, CCITT), every other sample + * width including 8-bit, non-{@code MINISBLACK} photometric interpretations, rotational terms in the + * transformation matrix, GeoTIFF major versions other than 1, and model types other than geographic or + * projected. Refusing loudly is the point: a grid this reader cannot decode must never be reported as a + * successful transform with a zero shift. + * + *

Thread safety

+ *

Everything here is immutable after construction. Parsing is a pure function of the input bytes, + * so two threads parsing the same grid produce bit-identical results and + * {@code org.locationtech.proj4j.datum.GridCache} may keep either. + * + * @since 1.5 + */ +package org.locationtech.proj4j.datum.tiff; diff --git a/core/src/main/java/org/locationtech/proj4j/geodesic/GeographicErr.java b/core/src/main/java/org/locationtech/proj4j/geodesic/GeographicErr.java index 257383f..db9637d 100644 --- a/core/src/main/java/org/locationtech/proj4j/geodesic/GeographicErr.java +++ b/core/src/main/java/org/locationtech/proj4j/geodesic/GeographicErr.java @@ -14,6 +14,9 @@ * can be caught by the usual catch clauses. **********************************************************************/ public class GeographicErr extends RuntimeException { + + private static final long serialVersionUID = 2018137717214726709L; + /** * Constructor *

diff --git a/core/src/main/java/org/locationtech/proj4j/gie/GieComparator.java b/core/src/main/java/org/locationtech/proj4j/gie/GieComparator.java new file mode 100644 index 0000000..b491b38 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/gie/GieComparator.java @@ -0,0 +1,468 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.locationtech.proj4j.geodesic.Geodesic; +import org.locationtech.proj4j.geodesic.GeodesicMask; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The gie comparison metric: given an expected coordinate, an observed coordinate and the unit + * domain of the operation's output side, produce the deviation gie would produce and the + * pass/fail gie would report. + * + *

A 1:1 port of PROJ 9.8.1 {@code src/apps/gie.cpp:1120-1177} and {@code src/dist.cpp:69-96}. + * + *

Why this is published API

+ * + * Consumers re-derive this metric and get it wrong. The specific failure mode is applying a + * constant degrees-to-metres scale where a geodesic solution is required, or applying an + * angular metric to a projected target; both are order-of-magnitude errors, not rounding + * errors, and both have caused large-scale re-pinning of expected values downstream. The + * metric selection is therefore exposed as an explicit {@link GieMetric} rather than buried in + * an {@code if}-chain, and {@link Result} reports which branch was taken. + * + *

Coordinate convention

+ * + * Coordinates are {@code double[4]} in PROJ's {@code PJ_COORD} order, which for the angular + * interpretation ({@code PJ_LPZT}) is: + * + *
+ * v[0] = lam  (longitude, radians in the RADIANS branch, degrees in the DEGREES branch)
+ * v[1] = phi  (latitude,  ditto)
+ * v[2] = z    (metres — always participates in the deviation)
+ * v[3] = t    (decimal years — never participates in the spatial deviation)
+ * 
+ * + * and for the linear interpretation ({@code PJ_XYZT}) is {@code x, y, z, t}. Note in particular + * that {@code v[0]} is longitude, i.e. easting-like, and {@code v[1]} is latitude, + * whereas {@link Geodesic#Inverse} takes {@code (lat, lon)}. The port swaps them at the call + * site, as PROJ does. + * + *

Thread safety

+ * + * Instances are immutable and hold only an immutable {@link Geodesic}. A single instance is + * safe to share across parallel test runners. {@link #compare} never mutates its arguments; it + * copies both coordinates before masking, converting or swapping. + */ +public final class GieComparator { + + /** + * PROJ's {@code HUGE_VAL}. {@code proj_lpz_dist} compares against this by equality, not by + * {@link Double#isNaN}, and only on {@code lam}. + */ + public static final double HUGE_VAL = Double.POSITIVE_INFINITY; + + /** + * The temporal threshold from {@code gie.cpp:1169}, + * {@code constexpr double TEMPORAL_THRESHOLD_IN_YEAR = 1e-4}. Described in the source as + * "somewhat arbitrary". + */ + public static final double TEMPORAL_THRESHOLD_IN_YEAR = 1e-4; + + private final Geodesic geodesic; + + private GieComparator(final Geodesic geodesic) { + if (geodesic == null) { + throw new IllegalArgumentException("geodesic"); + } + this.geodesic = geodesic; + } + + /** + * A comparator whose geodesic distances are computed on the given ellipsoid — the analogue + * of PROJ's {@code geod_init(P->geod, P->a, P->f)}. + * + * @param a equatorial radius, metres. + * @param f flattening. + * @return a new comparator. + */ + public static GieComparator forEllipsoid(final double a, final double f) { + return new GieComparator(new Geodesic(a, f)); + } + + /** + * A comparator on WGS84 ({@code a = 6378137.0, f = 1/298.257223563}). + * + *

This is the ellipsoid PROJ gives a plain {@code operation +proj=X} that names no + * ellipsoid: {@code pj_init_ctx} substitutes WGS84 when no shape parameters were supplied + * ({@code src/init.cpp:576-581}). + * + *

It differs from {@link #grs80()}, which is what a {@code +proj=pipeline} with no + * global {@code +ellps} gets ({@code src/pipeline.cpp:338-351}). The two flattenings differ + * in the eighth significant figure, worth about 1e-7 m over a 1° line — irrelevant against a + * {@code mm} tolerance, material against the corpus's 16 {@code nm} rows, and material + * whenever the operation names an ellipsoid explicitly (in which case use + * {@link #forEllipsoid} and neither of these). + * + * @return a new comparator on WGS84. + */ + public static GieComparator wgs84() { + return forEllipsoid(6378137.0, 1.0 / 298.257223563); + } + + /** + * A comparator on GRS80 ({@code a = 6378137.0, f = 1/298.257222101}). + * + *

This is the ellipsoid PROJ gives a {@code +proj=pipeline} whose global parameters + * contain no ellipsoid specification ({@code src/pipeline.cpp:334-351}, whose own comment + * reads "If not, use GRS80 as default"). See {@link #wgs84()} for why the distinction is + * not cosmetic. + * + * @return a new comparator on GRS80. + */ + public static GieComparator grs80() { + return forEllipsoid(6378137.0, 1.0 / 298.257222101); + } + + /** + * @return the ellipsoid model geodesic distances are computed on. + */ + public Geodesic geodesic() { + return geodesic; + } + + /** + * {@code proj_lp_dist(P, a, b)} ({@code dist.cpp:69-79}) — the geodesic distance in metres + * between two angular 2D coordinates given in radians. + * + *

PROJ converts to degrees and calls {@code geod_inverse} in {@code (lat, lon)} order: + *

+     * geod_inverse(P->geod, PJ_TODEG(a.lpz.phi), PJ_TODEG(a.lpz.lam),
+     *                       PJ_TODEG(b.lpz.phi), PJ_TODEG(b.lpz.lam), &s12, ...);
+     * 
+ * + * @param a first coordinate, {@code {lam, phi, z, t}} in radians. + * @param b second coordinate, likewise. + * @return {@code s12} in metres. + */ + public double lpDist(final double[] a, final double[] b) { + // PJ_TODEG is bit-identical to Math.toDegrees; PJ_TORAD is NOT bit-identical to + // Math.toRadians, hence the private toRad() below. + return geodesic.Inverse( + ProjectionMath.toDeg(a[1]), ProjectionMath.toDeg(a[0]), + ProjectionMath.toDeg(b[1]), ProjectionMath.toDeg(b[0]), + GeodesicMask.DISTANCE).s12; + } + + /** + * {@code proj_lpz_dist(P, a, b)} ({@code dist.cpp:81-86}) — the geodesic distance and the + * vertical offset, combined by {@code hypot}. + * + *
+     * if (HUGE_VAL == a.lpz.lam || HUGE_VAL == b.lpz.lam) return HUGE_VAL;
+     * return hypot(proj_lp_dist(P, a, b), a.lpz.z - b.lpz.z);
+     * 
+ * + *

Note that the guard tests {@code lam} only — never {@code phi}, never {@code z} — and + * tests equality with {@code HUGE_VAL} (positive infinity), not {@code isnan}. A + * coordinate with a NaN {@code lam} falls through to the geodesic, which yields NaN, which + * then fails {@link #withinTolerance(double, double)}. + * + * @param a first coordinate, radians. + * @param b second coordinate, radians. + * @return the combined deviation in metres, or {@link #HUGE_VAL}. + */ + public double lpzDist(final double[] a, final double[] b) { + if (HUGE_VAL == a[0] || HUGE_VAL == b[0]) { + return HUGE_VAL; + } + return Math.hypot(lpDist(a, b), a[2] - b[2]); + } + + /** + * {@code proj_xy_dist(a, b)} ({@code dist.cpp:88-91}) — {@code hypot(a.x - b.x, a.y - b.y)}. + * + * @param a first coordinate. + * @param b second coordinate. + * @return the planar Euclidean distance. + */ + public static double xyDist(final double[] a, final double[] b) { + return Math.hypot(a[0] - b[0], a[1] - b[1]); + } + + /** + * {@code proj_xyz_dist(a, b)} ({@code dist.cpp:93-96}) — + * {@code hypot(proj_xy_dist(a, b), a.z - b.z)}. + * + *

This is a nested {@code hypot}, not {@code sqrt(dx*dx + dy*dy + dz*dz)}. The two + * agree mathematically but not bitwise, and the nesting is what protects against overflow. + * Keep the nesting. + * + * @param a first coordinate. + * @param b second coordinate. + * @return the 3D Euclidean distance. + */ + public static double xyzDist(final double[] a, final double[] b) { + return Math.hypot(xyDist(a, b), a[2] - b[2]); + } + + /** + * gie's pass predicate, {@code gie.cpp:1163-1165}. + * + *

The C source is: + *

+     * // Test written like that to handle NaN
+     * if (!(d <= T.tolerance)) return expect_message(d, args);
+     * 
+ * + *

The inverted form is not stylistic. Every comparison with NaN is false, so + * {@code d > tol} is false for a NaN deviation and a NaN would silently pass — + * which is the difference between "the transform blew up" and "the transform is correct". + * {@code !(d <= tol)} is true for NaN against any tolerance including + * {@link Double#POSITIVE_INFINITY}, and true for {@code d == +inf} against any finite + * tolerance. Do not rewrite this as {@code d > tol}. + * + * @param d the deviation. + * @param tol the tolerance. + * @return {@code true} if the assertion passes. + */ + public static boolean withinTolerance(final double d, final double tol) { + final boolean fails = !(d <= tol); // literal transcription; do not rewrite as d > tol + return !fails; + } + + /** + * Compare an expected against an observed coordinate exactly as gie's {@code expect()} does. + * + * @param outputUnits the output-side {@code pj_io_units}; see + * {@link GieIoUnits#outputUnits(GieIoUnits, GieIoUnits, boolean, GieDirection)}. + * Folded internally. + * @param crsDstIsLatLonOrYX gie's {@code T.crs_dst_is_lat_lon_or_y_x}: swap {@code v[0]} + * and {@code v[1]} on both sides before measuring. Applies in the + * {@link GieMetric#GEODESIC_FROM_DEGREES} and + * {@link GieMetric#EUCLIDEAN_METRES} branches only. + * @param expected {@code ce}, the expected coordinate, length 4. Not mutated. + * @param got {@code co}, the observed coordinate, length 4. Not mutated. + * @param dimensionsGiven {@code T.dimensions_given} — the number of ordinates on the + * {@code expect} line, not the {@code accept} line. + * @param tolerance the tolerance in metres, from {@link GieTolerance#tolerance}. + * @return an immutable description of the comparison. + */ + public Result compare(final GieIoUnits outputUnits, + final boolean crsDstIsLatLonOrYX, + final double[] expected, + final double[] got, + final int dimensionsGiven, + final double tolerance) { + if (expected == null || expected.length != 4) { + throw new IllegalArgumentException("expected must be double[4]"); + } + if (got == null || got.length != 4) { + throw new IllegalArgumentException("got must be double[4]"); + } + + final double[] ce = expected.clone(); + final double[] co = got.clone(); + + // gie.cpp:1120-1123. Only `co` is masked. `ce` comes from parse_coord, which + // zero-initialises, so unstated components are already 0 on the expected side -- + // equivalent in effect, but the asymmetry is reproduced literally rather than + // "tidied up" into a symmetric mask. + if (dimensionsGiven < 4) { + co[3] = 0; + } + if (dimensionsGiven < 3) { + co[2] = 0; + } + + final GieMetric metric = GieMetric.select(outputUnits, ce[0], co[0]); + + final double d; + boolean swapApplied = false; + switch (metric) { + case NAN_BOTH: + d = 0.0; + break; + case GEODESIC_FROM_RADIANS: + // No conversion and no swap in this branch -- gie.cpp:1139-1140. + d = lpzDist(ce, co); + break; + case GEODESIC_FROM_DEGREES: + co[0] = toRad(co[0]); + co[1] = toRad(co[1]); + ce[0] = toRad(ce[0]); + ce[1] = toRad(ce[1]); + if (crsDstIsLatLonOrYX) { + swap(co); + swap(ce); + swapApplied = true; + } + d = lpzDist(ce, co); + break; + default: + if (crsDstIsLatLonOrYX) { + swap(co); + swap(ce); + swapApplied = true; + } + // The swap is a mathematical no-op here: hypot is symmetric in its two + // arguments' roles, so exchanging v[0] and v[1] on BOTH operands merely + // reorders them. Ported for fidelity. + d = xyzDist(ce, co); + break; + } + + final boolean within = withinTolerance(d, tolerance); + + // gie.cpp:1167-1176. t contributes nothing to d; it has its own check, and only when + // the expect line actually carried a 4th ordinate. + final boolean temporalChecked = dimensionsGiven == 4; + final double temporalDeviation = Math.abs(ce[3] - co[3]); + final boolean temporalFails = + temporalChecked && temporalDeviation > TEMPORAL_THRESHOLD_IN_YEAR; + + return new Result(metric, d, tolerance, swapApplied, within, + temporalChecked, temporalDeviation, !temporalFails); + } + + /** + * {@code PJ_TORAD(deg)}, i.e. {@code deg * M_PI / 180.0}. + * + *

Not {@link Math#toRadians}, which computes {@code angdeg / 180.0 * PI} — a + * different association that differs by up to 1 ULP. 1 ULP of a radian is about 1.4e-9 m on + * the ellipsoid, which is exactly the threshold of the 16 {@code nm}-tolerance rows in the + * gie corpus. {@code PJ_TODEG} is bit-identical to {@link Math#toDegrees}, so that + * one is used directly. + */ + private static double toRad(final double deg) { + return deg * Math.PI / 180.0; + } + + private static void swap(final double[] v) { + final double t = v[0]; + v[0] = v[1]; + v[1] = t; + } + + /** + * The outcome of one {@link GieComparator#compare} call. Immutable. + */ + public static final class Result { + + private final GieMetric metric; + private final double deviation; + private final double tolerance; + private final boolean swapApplied; + private final boolean withinTolerance; + private final boolean temporalChecked; + private final double temporalDeviation; + private final boolean temporalWithinThreshold; + + Result(final GieMetric metric, + final double deviation, + final double tolerance, + final boolean swapApplied, + final boolean withinTolerance, + final boolean temporalChecked, + final double temporalDeviation, + final boolean temporalWithinThreshold) { + this.metric = metric; + this.deviation = deviation; + this.tolerance = tolerance; + this.swapApplied = swapApplied; + this.withinTolerance = withinTolerance; + this.temporalChecked = temporalChecked; + this.temporalDeviation = temporalDeviation; + this.temporalWithinThreshold = temporalWithinThreshold; + } + + /** + * @return which of the four branches was taken. + */ + public GieMetric metric() { + return metric; + } + + /** + * @return {@code d} — metres for every branch except + * {@link GieMetric#EUCLIDEAN_METRES} applied to a + * {@link GieIoUnits#WHATEVER} output, where it is in whatever units the + * coordinates happened to be. + */ + public double deviation() { + return deviation; + } + + /** + * @return the tolerance the deviation was tested against. + */ + public double tolerance() { + return tolerance; + } + + /** + * @return whether {@code v[0]}/{@code v[1]} were exchanged. Never true in the + * {@link GieMetric#NAN_BOTH} or {@link GieMetric#GEODESIC_FROM_RADIANS} + * branches, because PROJ does not swap there. + */ + public boolean swapApplied() { + return swapApplied; + } + + /** + * @return the spatial verdict, {@code !(d <= tolerance)} negated. + */ + public boolean withinTolerance() { + return withinTolerance; + } + + /** + * @return whether the 4th-dimension check ran at all, i.e. whether + * {@code dimensionsGiven == 4}. + */ + public boolean temporalChecked() { + return temporalChecked; + } + + /** + * @return {@code |ce.v[3] - co.v[3]|} in decimal years. Reported even when + * {@link #temporalChecked()} is false, in which case {@code co.v[3]} has been + * masked to 0 and this is just {@code |ce.v[3]|}. + */ + public double temporalDeviation() { + return temporalDeviation; + } + + /** + * @return {@code true} unless the check ran and the deviation exceeded + * {@link GieComparator#TEMPORAL_THRESHOLD_IN_YEAR}. + */ + public boolean temporalWithinThreshold() { + return temporalWithinThreshold; + } + + /** + * @return {@link #withinTolerance()} and {@link #temporalWithinThreshold()}. + */ + public boolean passed() { + return withinTolerance && temporalWithinThreshold; + } + + @Override + public String toString() { + return "GieComparator.Result[metric=" + metric + + ", deviation=" + deviation + + ", tolerance=" + tolerance + + ", swapApplied=" + swapApplied + + ", withinTolerance=" + withinTolerance + + ", temporalChecked=" + temporalChecked + + ", temporalDeviation=" + temporalDeviation + + ", temporalWithinThreshold=" + temporalWithinThreshold + + ", passed=" + passed() + "]"; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/gie/GieDirection.java b/core/src/main/java/org/locationtech/proj4j/gie/GieDirection.java new file mode 100644 index 0000000..124b464 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/gie/GieDirection.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +/** + * The direction an operation is run in, mirroring PROJ's {@code PJ_DIRECTION} + * ({@code PJ_FWD = 1}, {@code PJ_INV = -1}). + * + *

PROJ's {@code pj_opposite_direction()} ({@code src/coordinates.cpp:48-50}) is literally + * a negation of the code, which is why the codes are {@code +1}/{@code -1} and not an + * ordinal. {@link #opposite()} reproduces that. + * + *

{@code PJ_IDENT} (0) is deliberately absent: the gie comparator never sees it. + */ +public enum GieDirection { + + /** {@code PJ_FWD} — forward. */ + FORWARD(1), + + /** {@code PJ_INV} — inverse. */ + INVERSE(-1); + + private final int code; + + GieDirection(final int code) { + this.code = code; + } + + /** + * @return {@code +1} for {@link #FORWARD}, {@code -1} for {@link #INVERSE}. + */ + public int code() { + return code; + } + + /** + * {@code pj_opposite_direction(dir)}, i.e. {@code (PJ_DIRECTION) -dir}. + * + * @return the other direction. + */ + public GieDirection opposite() { + return this == FORWARD ? INVERSE : FORWARD; + } + + /** + * @param code {@code 1} or {@code -1}. + * @return the matching constant. + * @throws IllegalArgumentException if {@code code} is neither {@code 1} nor {@code -1}. + */ + public static GieDirection fromCode(final int code) { + if (code == 1) { + return FORWARD; + } + if (code == -1) { + return INVERSE; + } + throw new IllegalArgumentException("Not a PJ_DIRECTION value handled by gie: " + code); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/gie/GieIoUnits.java b/core/src/main/java/org/locationtech/proj4j/gie/GieIoUnits.java new file mode 100644 index 0000000..6dec574 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/gie/GieIoUnits.java @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +/** + * The unit-domain of one side of an operation, mirroring PROJ's + * {@code enum pj_io_units} (PROJ 9.8.1, {@code src/proj_internal.h:192-201}). + * + *

The numeric {@link #code()} values are PROJ's and are part of this type's contract: + * {@code WHATEVER=0, CLASSIC=1, PROJECTED=2, CARTESIAN=3, RADIANS=4, DEGREES=5}. + * + *

The important operation here is {@link #folded()}. PROJ never exposes a raw + * {@code P->left}/{@code P->right} to the comparison code: every read goes through + * {@code pj_left()}/{@code pj_right()} ({@code src/internal.cpp:49-61}), which collapse + * {@link #CLASSIC} to {@link #PROJECTED} on every read. Code that selects a + * comparison metric must therefore always fold first, otherwise {@code CLASSIC} — the + * default right-hand unit of every {@code PROJ_HEAD} projection — would fall through + * unrecognised. + * + *

Why this matters. The default for every {@code PROJ_HEAD} projection is + * {@code left = RADIANS, right = CLASSIC} ({@code proj_internal.h:882-883}). That single + * fact is why every forward projection test in the gie corpus is compared with a Euclidean + * metric in metres, and every {@code direction inverse} projection test is compared with a + * geodesic metric from radians. + * + * @see GieMetric + */ +public enum GieIoUnits { + + /** {@code PJ_IO_UNITS_WHATEVER} — doesn't matter, or depends on pipeline neighbours. */ + WHATEVER(0), + + /** {@code PJ_IO_UNITS_CLASSIC} — scaled metres (right), projected system. Folds to {@link #PROJECTED}. */ + CLASSIC(1), + + /** {@code PJ_IO_UNITS_PROJECTED} — metres, projected system. */ + PROJECTED(2), + + /** {@code PJ_IO_UNITS_CARTESIAN} — metres, 3D cartesian system. */ + CARTESIAN(3), + + /** {@code PJ_IO_UNITS_RADIANS} — radians. */ + RADIANS(4), + + /** {@code PJ_IO_UNITS_DEGREES} — degrees. */ + DEGREES(5); + + private final int code; + + GieIoUnits(final int code) { + this.code = code; + } + + /** + * @return the numeric value of the corresponding {@code pj_io_units} constant. + */ + public int code() { + return code; + } + + /** + * The value as {@code pj_left()}/{@code pj_right()} would return it: + * {@link #CLASSIC} becomes {@link #PROJECTED}, everything else is unchanged. + * + *

Transcribed from {@code src/internal.cpp:49-61}: + *

+     * enum pj_io_units pj_right(PJ *P) {
+     *     enum pj_io_units u = P->inverted ? P->left : P->right;
+     *     if (u == PJ_IO_UNITS_CLASSIC) return PJ_IO_UNITS_PROJECTED;
+     *     return u;
+     * }
+     * 
+ * + * @return {@link #PROJECTED} if this is {@link #CLASSIC}, otherwise {@code this}. + */ + public GieIoUnits folded() { + return this == CLASSIC ? PROJECTED : this; + } + + /** + * @param code a {@code pj_io_units} numeric value. + * @return the matching constant. + * @throws IllegalArgumentException if {@code code} is not one of 0..5. + */ + public static GieIoUnits fromCode(final int code) { + for (final GieIoUnits u : values()) { + if (u.code == code) { + return u; + } + } + throw new IllegalArgumentException("Not a pj_io_units value: " + code); + } + + /** + * {@code pj_left(P)} — the folded left-hand unit, honouring {@code P->inverted} + * (i.e. {@code +inv} on the operation), which exchanges left and right. + * + * @param left the declared {@code P->left}. + * @param right the declared {@code P->right}. + * @param inverted {@code true} if {@code P->inverted}. + * @return the folded effective left-hand unit. + */ + public static GieIoUnits pjLeft(final GieIoUnits left, final GieIoUnits right, final boolean inverted) { + return (inverted ? right : left).folded(); + } + + /** + * {@code pj_right(P)} — the folded right-hand unit, honouring {@code P->inverted}. + * + * @param left the declared {@code P->left}. + * @param right the declared {@code P->right}. + * @param inverted {@code true} if {@code P->inverted}. + * @return the folded effective right-hand unit. + */ + public static GieIoUnits pjRight(final GieIoUnits left, final GieIoUnits right, final boolean inverted) { + return (inverted ? left : right).folded(); + } + + /** + * The unit domain a transform produces when run in {@code dir} — the value the + * gie comparator branches on. + * + *

{@code src/coordinates.cpp:52-93} defines + * {@code *_output(P, dir) == *_input(P, opposite(dir))}, and {@code *_input(P, FWD)} + * inspects {@code pj_left(P)} while {@code *_input(P, INV)} inspects {@code pj_right(P)}. + * Composing the two: + * + *

+ * output({@link GieDirection#FORWARD}) inspects {@code pj_right(P)}; + * output({@link GieDirection#INVERSE}) inspects {@code pj_left(P)}. + *
+ * + * @param left the declared {@code P->left}. + * @param right the declared {@code P->right}. + * @param inverted {@code true} if {@code P->inverted}. + * @param dir the direction the operation is being run in. + * @return the folded output-side unit. + */ + public static GieIoUnits outputUnits(final GieIoUnits left, + final GieIoUnits right, + final boolean inverted, + final GieDirection dir) { + // *_output(P, dir) == *_input(P, opposite(dir)); *_input(FWD) reads pj_left. + return dir.opposite() == GieDirection.FORWARD + ? pjLeft(left, right, inverted) + : pjRight(left, right, inverted); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/gie/GieMetric.java b/core/src/main/java/org/locationtech/proj4j/gie/GieMetric.java new file mode 100644 index 0000000..3ab35e2 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/gie/GieMetric.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +/** + * The four — and only four — ways gie can measure the deviation between an expected and an + * observed coordinate, in the source order of the {@code if}/{@code else if} chain at + * PROJ 9.8.1 {@code src/apps/gie.cpp:1136-1166}. + * + *

This is an enum rather than an inline {@code if}-chain on purpose. Choosing the wrong + * branch does not produce a slightly wrong number; applying an angular metric to a projected + * target inflates the deviation by a factor of roughly 111,319, and applying a linear metric + * to an angular target deflates it by the same. Both mistakes have been made in the wild and + * both required re-pinning large numbers of expected values. Making the selection an explicit, + * named, testable value makes the mistake visible in a diff. + * + *

Which {@code pj_io_units} selects which branch

+ * + * The unit inspected is the output-side unit, i.e. + * {@link GieIoUnits#outputUnits(GieIoUnits, GieIoUnits, boolean, GieDirection)}, already + * {@linkplain GieIoUnits#folded() folded}. + * + * + * + * + * + * + * + * + * + * + *
Branch selection by output-side {@code pj_io_units}
{@code pj_io_units}branch
{@link GieIoUnits#WHATEVER} (0){@link #EUCLIDEAN_METRES}
{@link GieIoUnits#CLASSIC} (1){@link #EUCLIDEAN_METRES} (folded to {@code PROJECTED})
{@link GieIoUnits#PROJECTED} (2){@link #EUCLIDEAN_METRES}
{@link GieIoUnits#CARTESIAN} (3){@link #EUCLIDEAN_METRES}
{@link GieIoUnits#RADIANS} (4){@link #GEODESIC_FROM_RADIANS}
{@link GieIoUnits#DEGREES} (5){@link #GEODESIC_FROM_DEGREES}
+ * + *

{@link #NAN_BOTH} pre-empts all of the above: it is tested first and depends only on the + * coordinates, not on the units. + * + *

{@link GieIoUnits#DEGREES} arises from exactly two places in PROJ: a {@code unitconvert} + * whose normalised unit name is {@code "Degree"} ({@code unitconvert.cpp:491-493, 514-516}), + * and pipelines built by {@code proj_create_crs_to_crs} for geographic CRSs, which end in such + * a {@code unitconvert}. + */ +public enum GieMetric { + + /** + * {@code isnan(co.v[0]) && isnan(ce.v[0])} — both sides are NaN in their first ordinate, so + * the deviation is defined to be exactly {@code 0.0} and the assertion passes. + * + *

Note that this is an and: NaN on one side only does not take this branch, and + * will fail in whichever branch is then selected (a NaN deviation fails + * {@link GieComparator#withinTolerance(double, double)}). + */ + NAN_BOTH, + + /** + * {@code proj_angular_output(T.P, T.dir)} — the output side is + * {@link GieIoUnits#RADIANS}. Deviation is {@code proj_lpz_dist}: a geodesic distance on + * the operation's ellipsoid, combined by {@code hypot} with the difference in {@code z}. + * + *

No degrees-to-radians conversion and no lat/lon swap in this branch. + */ + GEODESIC_FROM_RADIANS, + + /** + * {@code proj_degree_output(T.P, T.dir)} — the output side is + * {@link GieIoUnits#DEGREES}. Both coordinates have their first two ordinates converted + * degrees-to-radians, then optionally swapped when the destination CRS is lat/lon or y/x + * ordered, and are then measured with {@code proj_lpz_dist} exactly as above. + */ + GEODESIC_FROM_DEGREES, + + /** + * The {@code else} branch — {@link GieIoUnits#WHATEVER}, {@link GieIoUnits#CLASSIC}, + * {@link GieIoUnits#PROJECTED} or {@link GieIoUnits#CARTESIAN}. Deviation is + * {@code proj_xyz_dist}: a plain Euclidean distance in whatever units the coordinates are + * already in, nominally metres. + * + *

"Nominally" because {@link GieIoUnits#WHATEVER} really does mean whatever: see the + * {@code gigs/5102.2.gie} case, where grad values are compared with this metric against a + * tolerance written in metres. That is faithful behaviour, not a bug. + */ + EUCLIDEAN_METRES; + + /** + * Reproduces the branch selection of {@code gie.cpp:1136-1166} exactly, in source order. + * + *

+     * if (isnan(co.v[0]) && isnan(ce.v[0]))    d = 0.0;
+     * else if (proj_angular_output(T.P, T.dir)) d = proj_lpz_dist(T.P, ce, co);
+     * else if (proj_degree_output(T.P, T.dir))  { ...torad, ...swap; d = proj_lpz_dist(T.P, ce, co); }
+     * else                                      { ...swap; d = proj_xyz_dist(ce, co); }
+     * 
+ * + * @param outputUnits the output-side {@code pj_io_units}; folded internally, so passing + * {@link GieIoUnits#CLASSIC} is safe and yields {@link #EUCLIDEAN_METRES}. + * @param expected0 {@code ce.v[0]}, the expected coordinate's first ordinate. + * @param got0 {@code co.v[0]}, the observed coordinate's first ordinate, already + * dimension-masked. + * @return the metric gie would use. + */ + public static GieMetric select(final GieIoUnits outputUnits, + final double expected0, + final double got0) { + if (Double.isNaN(got0) && Double.isNaN(expected0)) { + return NAN_BOTH; + } + final GieIoUnits folded = outputUnits.folded(); + if (folded == GieIoUnits.RADIANS) { + return GEODESIC_FROM_RADIANS; + } + if (folded == GieIoUnits.DEGREES) { + return GEODESIC_FROM_DEGREES; + } + return EUCLIDEAN_METRES; + } + + /** + * Whether this metric measures an angular quantity on the ellipsoid, i.e. whether the + * deviation it produces is a geodesic distance rather than a coordinate-space distance. + * + *

{@link #NAN_BOTH} is not angular: it produces a bare {@code 0.0} and consults neither + * the ellipsoid nor the units. + * + * @return {@code true} for {@link #GEODESIC_FROM_RADIANS} and {@link #GEODESIC_FROM_DEGREES}. + */ + public boolean isAngular() { + return this == GEODESIC_FROM_RADIANS || this == GEODESIC_FROM_DEGREES; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/gie/GieTolerance.java b/core/src/main/java/org/locationtech/proj4j/gie/GieTolerance.java new file mode 100644 index 0000000..a8ee81c --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/gie/GieTolerance.java @@ -0,0 +1,292 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Parses gie {@code tolerance} arguments — a port of {@code strtod_scaled}, + * {@code tolerance} and {@code column} from PROJ 9.8.1 + * ({@code src/apps/gie.cpp:470-497, 502-554}). + * + *

A gie tolerance is a number optionally followed by a unit, e.g. {@code "0.5 mm"}. The + * unit token is obtained with {@code column(args, 2)}, which is the remainder of the string + * starting at the second whitespace-delimited token — not just that token. It is then + * compared with {@code strcmp}, so the remainder must equal the unit name exactly. + * {@code "0.5 mm"} scales by 1/1000; {@code "0.5 mm please"} does not, because + * {@code "mm please" != "mm"}, and falls through to the default scale. + * + *

This works in practice because gie has already run the line through {@code pj_chomp} + * (strip {@code #}-comments, trim) and {@code pj_shrink} (collapse runs of whitespace, drop + * whitespace-preceded {@code +} and {@code ;}, make {@code =} and {@code ,} greedy). + * + *

Anything the unit table does not recognise — including no unit at all — multiplies + * by the caller's default scale, which for {@link #tolerance(String)} is 1, i.e. metres. A + * string with no parseable leading number resets the tolerance to {@value #FALLBACK_TOLERANCE}. + * + *

This class is stateless; it is not instantiable. + */ +public final class GieTolerance { + + /** + * Degrees-to-metres at the equator of GRS80, {@code 111319.4908}. + * + *

This constant exists for one purpose only: converting a tolerance written in + * {@code deg} or {@code rad} into the metres that the comparator works in. It must never + * be applied to a coordinate delta. Multiplying a coordinate difference by a constant + * degrees-per-metre factor is precisely the error that this package exists to prevent — the + * true figure varies from 111319.49 m at the equator to 55799.47 m at 60°N to 0 at the + * poles, and the comparator obtains it from a geodesic solution, never from a scale factor. + * + *

Accordingly this literal is declared here and nowhere else in the codebase; + * {@code GieSourceHygieneTest} enforces that. In the PROJ 9.8.1 gie corpus no {@code .gie} + * file uses a {@code deg} or {@code rad} tolerance at all (the census is + * {@code m}×1827, {@code mm}×434, {@code cm}×26, bare×22, + * {@code nm}×16, {@code um}×5), so in practice this value is never even read. + * It is ported for fidelity. + */ + public static final double GRS80_DEG = 111319.4908; + + /** + * gie's initial tolerance, {@code 5e-4} m ({@code gie.cpp:284}). Every {@code operation} + * verb and every completed {@code crs_src}/{@code crs_dst} pair resets the tolerance by + * calling {@code tolerance("0.5 mm")} ({@code gie.cpp:651, 736}), which yields the same + * number. + */ + public static final double DEFAULT_TOLERANCE = 5e-4; + + /** + * The value {@code tolerance()} falls back to when {@code strtod_scaled} cannot parse a + * number, {@code 0.0005} ({@code gie.cpp:549-552}). Numerically equal to + * {@link #DEFAULT_TOLERANCE}, but a distinct literal in the C source and kept distinct here. + */ + public static final double FALLBACK_TOLERANCE = 0.0005; + + private GieTolerance() { + throw new AssertionError("no instances"); + } + + /** + * {@code column(buf, n)} — a pointer to the {@code n}'th whitespace-delimited column of + * {@code buf}, columns numbered from 0, as a suffix of the whole string. + * + *

+     * const char *column(const char *buf, int n) {
+     *     if (n <= 0) return buf;
+     *     for (i = 0; i < n; i++) {
+     *         while (isspace(*buf)) buf++;
+     *         if (i == n - 1) break;
+     *         while ((0 != *buf) && !isspace(*buf)) buf++;
+     *     }
+     *     return buf;
+     * }
+     * 
+ * + * @param buf the string. + * @param n the column index; {@code n <= 0} returns {@code buf} unchanged. + * @return the tail of {@code buf} beginning at column {@code n}, or {@code ""} if the + * string runs out first. + */ + public static String column(final String buf, final int n) { + if (n <= 0) { + return buf; + } + final int len = buf.length(); + int p = 0; + for (int i = 0; i < n; i++) { + while (p < len && isCSpace(buf.charAt(p))) { + p++; + } + if (i == n - 1) { + break; + } + while (p < len && !isCSpace(buf.charAt(p))) { + p++; + } + } + return buf.substring(p); + } + + /** + * {@code strtod_scaled(args, default_scale)} — interpret {@code args} as a number followed + * by a linear decadal prefix and return the scaled value. + * + *
+     * km  ×1000      m   ×1        dm  /10      cm  /100
+     * mm  /1000       um  /1e6      nm  /1e9
+     * rad → GRS80_DEG * todeg(s)          deg → GRS80_DEG * s
+     * anything else, INCLUDING absent → s * default_scale
+     * 
+ * + * @param args the argument string. + * @param defaultScale the multiplier applied when the unit is unrecognised or absent. + * @return the scaled value, or {@link Double#POSITIVE_INFINITY} ({@code HUGE_VAL}) if no + * number could be read at the head of {@code args}. + */ + public static double strtodScaled(final String args, final double defaultScale) { + final int endp = projStrtodEnd(args); + if (endp == 0) { + // args == endp: nothing consumed, no conversion performed. + return Double.POSITIVE_INFINITY; + } + double s = projStrtodValue(args, endp); + + // NOTE: the unit is taken from the ORIGINAL string, independently of where the number + // ended. "0.5mm" therefore has unit "" (one token only) and is 0.5 * default_scale. + final String units = column(args, 2); + + if ("km".equals(units)) { + s *= 1000; + } else if ("m".equals(units)) { + s *= 1; + } else if ("dm".equals(units)) { + s /= 10; + } else if ("cm".equals(units)) { + s /= 100; + } else if ("mm".equals(units)) { + s /= 1000; + } else if ("um".equals(units)) { + s /= 1e6; + } else if ("nm".equals(units)) { + s /= 1e9; + } else if ("rad".equals(units)) { + s = GRS80_DEG * ProjectionMath.toDeg(s); // PJ_TODEG is bit-identical to Math.toDegrees. + } else if ("deg".equals(units)) { + s = GRS80_DEG * s; + } else { + s *= defaultScale; + } + return s; + } + + /** + * {@code tolerance(args)} — {@code strtod_scaled(args, 1)}, i.e. a bare number is metres, + * with {@code HUGE_VAL} mapped to {@link #FALLBACK_TOLERANCE}. + * + * @param args the argument of a gie {@code tolerance} verb. + * @return the tolerance in metres. + */ + public static double tolerance(final String args) { + final double t = strtodScaled(args, 1); + if (Double.POSITIVE_INFINITY == t) { + return FALLBACK_TOLERANCE; + } + return t; + } + + /** The C {@code isspace} character class in the "C" locale. */ + private static boolean isCSpace(final char c) { + return c == ' ' || c == '\t' || c == '\n' || c == 0x0b || c == '\f' || c == '\r'; + } + + /** + * How many characters {@code proj_strtod} would consume from the head of {@code s} + * ({@code src/apps/proj_strtod.cpp:105}), i.e. {@code endptr - str}. Zero means "no + * conversion performed", which is the condition {@code strtod_scaled} tests. + * + *

{@code proj_strtod} differs from C's {@code strtod} in accepting {@code _} as a digit + * group separator and in a handful of early-out paths; the leading-whitespace, + * empty-string, {@code NaN} and non-numeric-first-character rules are reproduced here + * because they decide the {@code HUGE_VAL} outcome. It does not accept hexadecimal or + * {@code INF}. + */ + private static int projStrtodEnd(final String s) { + if (s == null) { + return 0; + } + final int len = s.length(); + int p = 0; + while (p < len && isCSpace(s.charAt(p))) { + p++; + } + if (p == len) { + return 0; // empty after whitespace: *endptr = str + } + if (regionMatchesIgnoreCase(s, p, "nan")) { + return p + 3; + } + if ("0123456789+-._".indexOf(s.charAt(p)) < 0) { + return 0; // non-numeric: *endptr = str + } + final int afterSign = (s.charAt(p) == '+' || s.charAt(p) == '-') ? p + 1 : p; + if (afterSign != p && (afterSign == len || "0123456789._".indexOf(s.charAt(afterSign)) < 0)) { + return 0; // stray sign, as in "+/-" + } + int q = afterSign; + int digits = 0; + while (q < len && (isDigit(s.charAt(q)) || s.charAt(q) == '_')) { + if (isDigit(s.charAt(q))) { + digits++; + } + q++; + } + if (q < len && s.charAt(q) == '.') { + q++; + while (q < len && (isDigit(s.charAt(q)) || s.charAt(q) == '_')) { + if (isDigit(s.charAt(q))) { + digits++; + } + q++; + } + } + if (digits == 0) { + return 0; + } + if (q < len && (s.charAt(q) == 'e' || s.charAt(q) == 'E')) { + int e = q + 1; + if (e < len && (s.charAt(e) == '+' || s.charAt(e) == '-')) { + e++; + } + int expDigits = 0; + while (e < len && isDigit(s.charAt(e))) { + e++; + expDigits++; + } + if (expDigits > 0) { + q = e; + } + } + return q; + } + + /** The numeric value of the prefix {@code s[0, endp)}, with {@code _} separators removed. */ + private static double projStrtodValue(final String s, final int endp) { + final String head = s.substring(0, endp).trim(); + if (head.length() == 3 && regionMatchesIgnoreCase(head, 0, "nan")) { + return Double.NaN; + } + final StringBuilder sb = new StringBuilder(head.length()); + for (int i = 0; i < head.length(); i++) { + final char c = head.charAt(i); + if (c != '_') { + sb.append(c); + } + } + try { + return Double.parseDouble(sb.toString()); + } catch (final NumberFormatException e) { + return 0.0; + } + } + + private static boolean isDigit(final char c) { + return c >= '0' && c <= '9'; + } + + private static boolean regionMatchesIgnoreCase(final String s, final int off, final String what) { + return s.regionMatches(true, off, what, 0, what.length()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/InitFileCache.java b/core/src/main/java/org/locationtech/proj4j/io/InitFileCache.java new file mode 100644 index 0000000..7d24625 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/InitFileCache.java @@ -0,0 +1,504 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.io; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; +import java.util.concurrent.atomic.AtomicLong; + +import org.locationtech.proj4j.resource.ResourceNames; +import org.locationtech.proj4j.util.Pair; + +/** + * A thread-safe, byte-bounded cache of parsed PROJ.4 init dictionaries. + * + *

{@link Proj4FileReader} used to re-open the classpath resource and re-tokenise the entire + * dictionary on every call, allocating an {@code ArrayList} and a {@link Pair} per entry + * scanned and discarding them until the name matched. {@code CrsParseBenchmark} measured + * {@code createFromName} at 39,632 B/op for the first entry in {@code proj4/nad/epsg}, + * 4,002,108 for the middle one and 7,919,398 for the last, against + * 1,920–4,112 for {@code createFromParameters}, which is the parse-only control. The + * whole 200× spread was the linear re-scan. This class removes it. + * + *

The key, which is the part that can return a wrong CRS

+ *

Two different comparisons are in play and they must not be conflated. + *

    + *
  • The file is selected by {@code "proj4/nad/" + authority.toLowerCase(Locale.ROOT)}. + * That lowercasing is part of the resource name, so {@code EPSG}, {@code epsg} and + * {@code EpSg} are the same file and must be the same cache entry. Keying on the raw + * authority would merely waste memory; keying the code case-insensitively would + * return the wrong CRS.
  • + *
  • The code within the file was compared with {@code crsName.equals(name)} — + * case-sensitive, no folding, no trimming. A {@link HashMap} lookup uses exactly the same + * {@code String.equals}, so the two-level structure below is behaviourally identical.
  • + *
+ * Hence {@code Map>} and nothing flatter. + * + *

Exactly the semantics of the linear scan it replaces

+ *
    + *
  • First match wins. The old {@code readFile} returned at the first entry whose name + * matched, and {@code readEpsgCodeFromFile} at the first entry whose parameter array matched. + * Both indexes therefore keep the first occurrence and ignore later duplicates. The + * reverse index is built from the full entry stream in file order, not from the forward + * index — a code repeated with different parameters contributes both parameter sets to + * the reverse index, which is what the old whole-file scan did.
  • + *
  • A malformed entry is a deferred failure, not an eager one. The old scan threw only if + * it reached the bad entry, so a name occurring before it resolved fine. Parsing + * eagerly and propagating would turn those working lookups into errors. Instead the entries + * before the failure are retained and the failure is replayed only on a lookup that misses + * — which is precisely the set of lookups that would have reached it.
  • + *
  • A trailing token that is not {@code '<'} ends the scan without an error, exactly as + * the old {@code while (t.ttype == '<')} loop did.
  • + *
  • The stream is still decoded with the platform default charset, as before. Changing that + * could change which CRS a name resolves to and is not this class's business.
  • + *
+ * + *

Bounded, because the authority is untrusted input

+ *

This library is called per row inside Spark executors and the CRS string comes from the user, + * so {@code +init=:} lets a caller name an unbounded number of distinct cache + * keys. The bound follows {@link org.locationtech.proj4j.datum.GridCache}'s shape: a byte budget + * (default 32 MiB, {@code -Dproj4j.initFiles.cacheBytes}), least-recently-used eviction, failures + * cached so a bogus authority costs one classpath probe rather than one per row, and no lock held + * across I/O — loading goes through a {@link FutureTask} published with {@code putIfAbsent}, + * so concurrent demand for one file produces exactly one parse. + * + *

Two deliberate deviations from a naive accounting: + *

    + *
  • A miss is charged a flat {@value #MISS_WEIGHT_BYTES} bytes, far more than the key + * costs. Under-charging misses is how a "bounded" cache retains hundreds of thousands of + * them; over-charging only makes the bound conservative.
  • + *
  • A dictionary whose accounted size exceeds the whole budget is not cached at all. + * The reader falls back to the original streaming scan for that file, so behaviour is + * unchanged and memory stays bounded. Refusing such a file instead would break a legitimate, + * if unusual, user dictionary that works today.
  • + *
+ * + *

It cannot change an answer

+ *

A parsed dictionary is immutable after construction and is published through + * {@code FutureTask.get()}. The parameter arrays it holds are never handed out directly — + * {@link Proj4FileReader} clones on the way out, because + * {@code CoordinateReferenceSystem.getParameters()} returns its array by reference and a caller + * mutating it would otherwise corrupt the dictionary for every later lookup, process-wide. + */ +final class InitFileCache { + + /** System property naming the byte budget. {@code 0} disables caching entirely. */ + static final String SIZE_PROPERTY = "proj4j.initFiles.cacheBytes"; + + static final long DEFAULT_MAX_BYTES = 32L * 1024L * 1024L; + + /** + * What a cached failure is charged. A miss retains a key, a {@code FutureTask} and a map node; + * charging it like the ~80 bytes it nominally occupies would let a hostile stream of distinct + * authorities retain hundreds of thousands of entries inside a 32 MiB "bound". At 1 KiB the + * ceiling is ~32,768 cached failures, which is a real bound on a real number. + */ + static final long MISS_WEIGHT_BYTES = 1024L; + + private static final InitFileCache INSTANCE = new InitFileCache(configuredMaxBytes()); + + private final long maxBytes; + + /** file key -> the single in-flight or completed parse for that key. */ + private final ConcurrentMap> entries = + new ConcurrentHashMap>(); + + /** Access-ordered LRU bookkeeping. Guarded by {@code lru} itself; never held across I/O. */ + private final LinkedHashMap lru = new LinkedHashMap(16, 0.75f, true); + + private long currentBytes; + + private final AtomicLong hits = new AtomicLong(); + private final AtomicLong misses = new AtomicLong(); + private final AtomicLong evictions = new AtomicLong(); + + InitFileCache(long maxBytes) { + this.maxBytes = maxBytes; + } + + static InitFileCache instance() { + return INSTANCE; + } + + static long configuredMaxBytes() { + String raw = System.getProperty(SIZE_PROPERTY); + if (raw == null) { + return DEFAULT_MAX_BYTES; + } + try { + long v = Long.parseLong(raw.trim()); + // 0 is a supported value and means "never cache": the reader streams every call, which + // is the pre-cache behaviour and therefore the control arm for any test of this class. + return v >= 0 ? v : DEFAULT_MAX_BYTES; + } catch (NumberFormatException e) { + return DEFAULT_MAX_BYTES; + } + } + + /** + * The parsed dictionary for a classpath init file. + * + * @param fileKey the authority already lowercased with {@code Locale.ROOT} — i.e. the + * last segment of the resource name, so that the cache key and the resource + * selected are the same string by construction + * @return never {@code null}; {@link Dictionary#MISSING} if the resource does not exist and + * {@link Dictionary#OVERSIZED} if it is too large to cache + */ + Dictionary get(final String fileKey) { + if (maxBytes == 0L) { + return Dictionary.OVERSIZED; + } + FutureTask task = entries.get(fileKey); + boolean mine = false; + if (task == null) { + FutureTask created = new FutureTask(new Callable() { + @Override + public Dictionary call() { + return parse(fileKey, maxBytes); + } + }); + FutureTask existing = entries.putIfAbsent(fileKey, created); + if (existing == null) { + task = created; + mine = true; + misses.incrementAndGet(); + task.run(); + } else { + task = existing; + hits.incrementAndGet(); + } + } else { + hits.incrementAndGet(); + } + + Dictionary dict; + try { + dict = task.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + // Not cached: an interrupt is a property of the calling thread, not of the file. + entries.remove(fileKey, task); + return Dictionary.OVERSIZED; + } catch (CancellationException e) { + entries.remove(fileKey, task); + return Dictionary.OVERSIZED; + } catch (ExecutionException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + if (cause instanceof Error) { + throw (Error) cause; + } + throw new IllegalStateException("Failed to read CRS file: " + fileKey, cause); + } + + if (dict == Dictionary.OVERSIZED) { + // Remember that this file is not cacheable, but do not retain a parse of it. + if (mine) { + admit(fileKey, MISS_WEIGHT_BYTES); + } else { + touch(fileKey); + } + return dict; + } + if (mine) { + admit(fileKey, dict == Dictionary.MISSING ? MISS_WEIGHT_BYTES : dict.bytes); + } else { + touch(fileKey); + } + return dict; + } + + private void admit(String k, long bytes) { + List evict = null; + synchronized (lru) { + Long prior = lru.put(k, Long.valueOf(bytes)); + currentBytes += bytes - (prior == null ? 0L : prior.longValue()); + if (currentBytes > maxBytes) { + evict = new ArrayList(); + Iterator> it = lru.entrySet().iterator(); + while (it.hasNext() && currentBytes > maxBytes) { + Map.Entry oldest = it.next(); + if (oldest.getKey().equals(k)) { + // Never evict what was just admitted; the next admission trims. Mirrors + // GridCache. A dictionary larger than the whole budget never reaches here + // - parse() returns OVERSIZED instead - so this only defers, never leaks. + continue; + } + currentBytes -= oldest.getValue().longValue(); + evict.add(oldest.getKey()); + it.remove(); + } + } + } + if (evict != null) { + for (String gone : evict) { + entries.remove(gone); + evictions.incrementAndGet(); + } + } + } + + private void touch(String k) { + synchronized (lru) { + lru.get(k); + } + } + + int size() { + return entries.size(); + } + + long bytes() { + synchronized (lru) { + return currentBytes; + } + } + + long maxBytes() { + return maxBytes; + } + + long hitCount() { + return hits.get(); + } + + long missCount() { + return misses.get(); + } + + long evictionCount() { + return evictions.get(); + } + + /** Empties the cache. For tests and for a caller that has deliberately changed the classpath. */ + void clear() { + entries.clear(); + synchronized (lru) { + lru.clear(); + currentBytes = 0L; + } + } + + @Override + public String toString() { + return "InitFileCache[" + size() + " files, " + bytes() + " / " + maxBytes + " bytes, " + + hits.get() + " hits, " + misses.get() + " misses, " + evictions.get() + + " evictions]"; + } + + // ------------------------------------------------------------------------------------------ + // Parsing + // ------------------------------------------------------------------------------------------ + + /** + * Reads and indexes one init file. Visible for the cache's own tests; does no caching itself. + * + * @param budget the largest accounted size that may be cached; a dictionary above it is + * reported as {@link Dictionary#OVERSIZED} so the caller streams instead + */ + static Dictionary parse(String fileKey, long budget) { + // Belt and braces. Proj4FileReader.checkedFileKey has already applied ResourceNames, but + // this is the line that turns a key into a resource name, so it is the line that must not + // be reachable with an unchecked one -- a future caller reaching parse() directly would + // otherwise re-open the +init= traversal hole silently. MISSING, not an exception: this + // guard is unreachable through the supported path, so it should behave like "no such file" + // rather than invent a second error contract. + if (!ResourceNames.isSafe(fileKey)) { + return Dictionary.MISSING; + } + String resource = Proj4FileReader.RESOURCE_PREFIX + fileKey; + InputStream in = Proj4FileReader.class.getClassLoader().getResourceAsStream(resource); + if (in == null) { + return Dictionary.MISSING; + } + Map byCode = new HashMap(); + Map, String> byParams = new HashMap, String>(); + long bytes = 0L; + IOException truncation = null; + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(in)); + StreamTokenizer t = Proj4FileReader.createTokenizer(reader); + t.nextToken(); + while (t.ttype == '<') { + Pair pair = Proj4FileReader.parseTokenizer(t); + String crsName = pair.fst(); + @SuppressWarnings("unchecked") + List values = (List) pair.snd(); + String[] params = values.toArray(new String[values.size()]); + + // First match wins, in both directions, exactly as the linear scan did. + if (!byCode.containsKey(crsName)) { + byCode.put(crsName, params); + bytes += weigh(crsName, params); + } + // The reverse index is fed from the entry stream, not from byCode: a code repeated + // with different parameters contributed both parameter sets to the old whole-file + // scan, and dropping the second would silently answer null where it answered a code. + List paramKey = Arrays.asList(params); + if (!byParams.containsKey(paramKey)) { + byParams.put(paramKey, crsName); + bytes += REVERSE_ENTRY_BYTES; + } + if (bytes > budget) { + return Dictionary.OVERSIZED; + } + } + } catch (IOException e) { + // Deferred: the entries already indexed are the ones the old scan would have reached + // before this. Replayed on a miss, which is exactly the set of lookups that would + // have hit it. + truncation = e; + } catch (RuntimeException e) { + truncation = new IOException("Malformed init file " + resource + ": " + e, e); + } finally { + closeQuietly(reader, in); + } + return new Dictionary(byCode, byParams, truncation, bytes); + } + + private static void closeQuietly(BufferedReader reader, InputStream in) { + try { + if (reader != null) { + reader.close(); + } else { + in.close(); + } + } catch (IOException ignored) { + // Closing a classpath resource cannot fail in a way the caller can act on, and + // throwing here would mask the parse result. + } + } + + /** + * A {@code HashMap.Node} plus an {@code Arrays$ArrayList} view. The view wraps the array the + * forward index already holds, so the strings and the array itself are not charged twice. + */ + private static final long REVERSE_ENTRY_BYTES = 80L; + + private static long weigh(String code, String[] params) { + long b = 48L /* HashMap.Node */ + stringBytes(code) + 16L + 8L * params.length; + for (int i = 0; i < params.length; i++) { + b += stringBytes(params[i]); + } + return b; + } + + private static long stringBytes(String s) { + return s == null ? 0L : 40L + 2L * s.length(); + } + + // ------------------------------------------------------------------------------------------ + + /** One parsed init file, or a marker saying why there is no parse to serve from. */ + static final class Dictionary { + + /** The classpath resource does not exist. */ + static final Dictionary MISSING = new Dictionary(); + + /** Too large to cache, or caching disabled: the caller must stream the file. */ + static final Dictionary OVERSIZED = new Dictionary(); + + private final Map byCode; + private final Map, String> byParams; + private final IOException truncation; + final long bytes; + + private Dictionary() { + this.byCode = Collections.emptyMap(); + this.byParams = Collections.emptyMap(); + this.truncation = null; + this.bytes = 0L; + } + + private Dictionary(Map byCode, Map, String> byParams, + IOException truncation, long bytes) { + this.byCode = byCode; + this.byParams = byParams; + this.truncation = truncation; + this.bytes = bytes; + } + + /** Entries indexed. Excludes anything after a malformed entry. */ + int entryCount() { + return byCode.size(); + } + + /** True if the file did not parse to its end. */ + boolean isTruncated() { + return truncation != null; + } + + /** + * The parameter array for {@code code}, or {@code null} if the file has no such entry. + * + *

The returned array is the cached one. Callers must copy before handing it out. + * + * @throws IOException the parse failure the old streaming scan would have hit while looking + * for a code this file does not contain + */ + String[] parameters(String code) throws IOException { + String[] hit = byCode.get(code); + if (hit != null) { + return hit; + } + throw0(); + return null; + } + + /** + * The first code whose parameter array equals {@code params}, or {@code null}. + * + * @throws IOException as {@link #parameters(String)} + */ + String codeForParameters(String[] params) throws IOException { + if (params != null) { + String hit = byParams.get(Arrays.asList(params)); + if (hit != null) { + return hit; + } + } + throw0(); + return null; + } + + private void throw0() throws IOException { + if (truncation != null) { + // A fresh instance: the cached one would accumulate every caller's stack. + throw new IOException(truncation.getMessage(), truncation); + } + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/Proj4FileReader.java b/core/src/main/java/org/locationtech/proj4j/io/Proj4FileReader.java index b727712..15590cd 100755 --- a/core/src/main/java/org/locationtech/proj4j/io/Proj4FileReader.java +++ b/core/src/main/java/org/locationtech/proj4j/io/Proj4FileReader.java @@ -15,6 +15,7 @@ */ package org.locationtech.proj4j.io; +import org.locationtech.proj4j.resource.ResourceNames; import org.locationtech.proj4j.util.Pair; import java.io.BufferedReader; @@ -25,11 +26,95 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; +/** + * Reads PROJ.4 {@code +init=} dictionaries from the classpath. + * + *

Lookups are served from {@link InitFileCache}, which parses each dictionary once into a + * {@code Map} plus a reverse index. Before that cache existed every call re-opened + * the resource and re-tokenised the whole file, allocating an {@code ArrayList} and a {@link Pair} + * per entry scanned: {@code CrsParseBenchmark} measured {@code createFromName} at 39,632 B/op for + * the first {@code proj4/nad/epsg} entry, 4,002,108 for the middle one and 7,919,398 for the last, + * against 1,920–4,112 for the parse-only control. + * + *

The streaming scan is still here and still used: for a dictionary too large to cache, and as + * the reference implementation the cached path is tested against. + */ public class Proj4FileReader { + /** Every init dictionary lives under this classpath prefix. */ + static final String RESOURCE_PREFIX = "proj4/nad/"; + + private final InitFileCache cache; + public Proj4FileReader() { - super(); + this(InitFileCache.instance()); + } + + /** For tests, which need a cache with a budget of their own choosing. */ + Proj4FileReader(InitFileCache cache) { + this.cache = cache; + } + + /** + * The classpath resource name suffix, and the {@link InitFileCache} key, for an authority. + * + *

Locale.ROOT, not the default locale: this is a classpath resource NAME, not text for a + * reader. Under tr_TR the default-locale rule maps 'I' to dotless 'i' (U+0131), so "ESRI" + * lowercases to "esri" spelled with U+0131, the lookup for proj4/nad/esri never resolves, + * and every one of the ESRI-authority definitions becomes unreachable. + * + *

Because the cache key is exactly this string, a cache entry and the resource it was read + * from cannot disagree. The code within the file is a separate question and is + * deliberately not folded: it was compared with {@code String.equals} and a + * {@code HashMap} lookup uses the same comparison, so {@code EPSG:4326} and {@code epsg:4326} + * still resolve to the same definition while {@code EPSG:4326} and {@code EPSG:4326 } still do + * not. + */ + static String fileKey(String authorityCode) { + return authorityCode.toLowerCase(Locale.ROOT); + } + + /** + * Refuses an authority that must not become part of a classpath resource name. + * + *

This was the one unguarded path into the resource layer

+ * + *

{@code +init=:} takes the authority straight out of the CRS string — the + * same untrusted, possibly per-row string a {@code +nadgrids=} token comes from — lowercases it + * and concatenates it onto {@code "proj4/nad/"}. Every grid path is validated by + * {@link ResourceNames}, at three layers; this one was validated nowhere, so + * {@code +init=../../foo:bar} reached {@code ClassLoader.getResourceAsStream} as + * {@code "proj4/nad/../../foo"} with nothing having looked at it. Whether a given classloader + * normalises that away is a property of the deployment, not of this code, which is precisely + * the kind of "it happens to be safe here" the resource layer exists to replace. + * + *

It is the same rule and the same implementation the resolvers use, not a second copy: a + * name refused for a grid is refused for an init file. Refusal is deliberately not silent — + * returning {@code null} would be indistinguishable from "no such CRS", and the caller deserves + * to be told the name was rejected and by which rule. + * + *

{@link IllegalStateException} is chosen to match, exactly, what an unresolvable authority + * already threw two lines further down ({@code "Unable to access CRS file: ..."}). That keeps + * the refusal in the family every caller already handles — {@code InitFileExpander} maps it to + * {@code INVALID_INIT_KEY}, PROJ's own classification for an init file it cannot open + * ({@code init.cpp:105,119,134}) — instead of introducing a second unchecked type that one of + * them would miss. + * + * @throws IllegalStateException if the authority cannot be part of a resource name + */ + static String checkedFileKey(String authorityCode) { + String key = fileKey(authorityCode); + ResourceNames.Rule violation = ResourceNames.violation(key); + if (violation != null) { + throw new IllegalStateException("Refusing +init= authority \"" + authorityCode + + "\": " + violation.description() + " (" + violation + ")." + + " An init-file authority becomes part of the classpath resource name \"" + + RESOURCE_PREFIX + "\", so it is held to the same rule as a grid" + + " name."); + } + return key; } public String[] readParametersFromFile(String authorityCode, String name) @@ -38,7 +123,31 @@ public String[] readParametersFromFile(String authorityCode, String name) // TODO: use simpler parser than StreamTokenizer for speed and flexibility // TODO: parse CSes line-at-a-time (this allows preserving CS param string for later access) - String filename = "proj4/nad/" + authorityCode.toLowerCase(); + String key = checkedFileKey(authorityCode); + InitFileCache.Dictionary dict = cache.get(key); + if (dict == InitFileCache.Dictionary.MISSING) { + throw new IllegalStateException("Unable to access CRS file: " + RESOURCE_PREFIX + key); + } + if (dict == InitFileCache.Dictionary.OVERSIZED) { + return streamParametersFromFile(key, name); + } + String[] params = dict.parameters(name); + // Defensive copy, and it is not optional. CoordinateReferenceSystem keeps the array it is + // handed and getParameters() returns it by reference, so a caller mutating one element of + // a shared array would corrupt this dictionary for every later lookup, process-wide - the + // exact "silently returns the wrong CRS" failure this cache exists not to introduce. + return params == null ? null : params.clone(); + } + + /** + * The pre-cache implementation: open the resource and tokenise until the name matches. + * Retained because a dictionary too large to cache must still be readable, and because it is + * the reference the cached path is tested against. + * + * @param fileKey the already-lowercased authority, i.e. {@link #fileKey(String)}'s result + */ + String[] streamParametersFromFile(String fileKey, String name) throws IOException { + String filename = RESOURCE_PREFIX + fileKey; InputStream inStr = Proj4FileReader.class.getClassLoader().getResourceAsStream(filename); if (inStr == null) { throw new IllegalStateException("Unable to access CRS file: " + filename); @@ -49,13 +158,12 @@ public String[] readParametersFromFile(String authorityCode, String name) try { args = readFile(reader, name); } finally { - if (reader != null) - reader.close(); + reader.close(); } return args; } - private StreamTokenizer createTokenizer(BufferedReader reader) { + static StreamTokenizer createTokenizer(BufferedReader reader) { StreamTokenizer t = new StreamTokenizer(reader); t.commentChar('#'); t.ordinaryChars('0', '9'); @@ -125,29 +233,46 @@ public String[] getParameters(String crsName) { } public String readEpsgCodeFromFile(String[] params) throws IOException { - InputStream inStr = Proj4FileReader.class.getClassLoader().getResourceAsStream("proj4/nad/epsg"); + InitFileCache.Dictionary dict = cache.get("epsg"); + if (dict == InitFileCache.Dictionary.MISSING) { + throw new IllegalStateException("Unable to access CRS file: EPSG"); + } + if (dict == InitFileCache.Dictionary.OVERSIZED) { + return streamEpsgCodeFromFile(params); + } + return dict.codeForParameters(params); + } + + /** The pre-cache implementation of {@link #readEpsgCodeFromFile}; see the forward twin. */ + String streamEpsgCodeFromFile(String[] params) throws IOException { + InputStream inStr = Proj4FileReader.class.getClassLoader() + .getResourceAsStream(RESOURCE_PREFIX + "epsg"); if (inStr == null) { throw new IllegalStateException("Unable to access CRS file: EPSG"); } BufferedReader reader = new BufferedReader(new InputStreamReader(inStr)); - StreamTokenizer t = createTokenizer(reader); + try { + StreamTokenizer t = createTokenizer(reader); - t.nextToken(); - while (t.ttype == '<') { - Pair pair = parseTokenizer(t); - String crsName = pair.fst(); - List v = pair.snd(); + t.nextToken(); + while (t.ttype == '<') { + Pair pair = parseTokenizer(t); + String crsName = pair.fst(); + List v = pair.snd(); - String[] paramsParsed = (String[]) v.toArray(new String[0]); + String[] paramsParsed = (String[]) v.toArray(new String[0]); - if(Arrays.equals(params, paramsParsed)) return crsName; + if (Arrays.equals(params, paramsParsed)) return crsName; + } + } finally { + reader.close(); } return null; } - private static Pair parseTokenizer(StreamTokenizer t) throws IOException { + static Pair parseTokenizer(StreamTokenizer t) throws IOException { t.nextToken(); if (t.ttype != StreamTokenizer.TT_WORD) throw new IOException(t.lineno() + ": Word expected after '<'"); diff --git a/core/src/main/java/org/locationtech/proj4j/io/projjson/Json.java b/core/src/main/java/org/locationtech/proj4j/io/projjson/Json.java new file mode 100644 index 0000000..b3623b4 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/projjson/Json.java @@ -0,0 +1,406 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.io.wkt.WktParseException; + +/** + * A minimal, dependency-free JSON reader and writer — the whole reason PROJJSON support can live + * in core. + *

+ * There is no JSON library on the classpath and there will not be one: the point of this work is + * that a consumer can delete Apache SIS and the {@code catch (LinkageError)} around a + * duplicated GeoAPI class, and adding a Jackson or Gson dependency to achieve that would simply + * move the hazard rather than remove it. + *

+ * Scope is exactly RFC 8259 as PROJJSON uses it: objects, arrays, strings, numbers, booleans and + * null. Objects preserve member order, because PROJJSON round-trip equality is byte-for-byte and + * member order is part of it. Numbers are read as {@code Double}, which is what the schema means by + * "number" everywhere. + *

+ * Both directions are depth-bounded by {@link JsonLimits#MAX_DEPTH}: {@code value()} recurses into + * objects and arrays on the way in, and {@code write()} recurses on the way out, so an unbounded + * reader would hand an unbounded writer a tree that overflows the stack on the return leg of a + * round trip. The document is untrusted, and a {@link StackOverflowError} is an {@code Error} that + * escapes every {@code catch} in this library. + */ +final class Json { + + private Json() { + } + + /** + * Parses JSON text into {@link Map}, {@link List}, {@link String}, {@link Double}, + * {@link Boolean} and {@code null}. + * + * @throws WktParseException if the text is not well-formed JSON + */ + static Object parse(String text) { + if (text == null) { + throw new WktParseException("JSON text is null"); + } + Parser p = new Parser(text); + p.skipWhitespace(); + Object value = p.value(1); + p.skipWhitespace(); + if (p.pos < text.length()) { + throw new WktParseException("unexpected trailing text at offset " + p.pos + + " in JSON"); + } + return value; + } + + private static final class Parser { + private final String s; + private int pos; + + Parser(String s) { + this.s = s; + } + + /** + * Reads one value. {@code depth} is its level in the document, the root value being 1. + */ + Object value(int depth) { + if (depth > JsonLimits.MAX_DEPTH) { + throw new WktParseException("JSON nested more than " + JsonLimits.MAX_DEPTH + + " deep at offset " + pos + "; refusing to recurse further"); + } + skipWhitespace(); + if (pos >= s.length()) { + throw new WktParseException("unexpected end of JSON text"); + } + char c = s.charAt(pos); + switch (c) { + case '{': + return object(depth); + case '[': + return array(depth); + case '"': + return string(); + case 't': + expect("true"); + return Boolean.TRUE; + case 'f': + expect("false"); + return Boolean.FALSE; + case 'n': + expect("null"); + return null; + default: + return number(); + } + } + + Map object(int depth) { + pos++; + Map map = new LinkedHashMap(); + skipWhitespace(); + if (pos < s.length() && s.charAt(pos) == '}') { + pos++; + return map; + } + while (true) { + skipWhitespace(); + if (pos >= s.length() || s.charAt(pos) != '"') { + throw new WktParseException("expected a JSON member name at offset " + pos); + } + String key = string(); + skipWhitespace(); + if (pos >= s.length() || s.charAt(pos) != ':') { + throw new WktParseException("expected ':' after member \"" + key + "\""); + } + pos++; + map.put(key, value(depth + 1)); + skipWhitespace(); + if (pos >= s.length()) { + throw new WktParseException("unterminated JSON object"); + } + char d = s.charAt(pos); + if (d == ',') { + pos++; + continue; + } + if (d == '}') { + pos++; + return map; + } + throw new WktParseException("expected ',' or '}' at offset " + pos + " in JSON"); + } + } + + List array(int depth) { + pos++; + List list = new ArrayList(); + skipWhitespace(); + if (pos < s.length() && s.charAt(pos) == ']') { + pos++; + return list; + } + while (true) { + list.add(value(depth + 1)); + skipWhitespace(); + if (pos >= s.length()) { + throw new WktParseException("unterminated JSON array"); + } + char d = s.charAt(pos); + if (d == ',') { + pos++; + continue; + } + if (d == ']') { + pos++; + return list; + } + throw new WktParseException("expected ',' or ']' at offset " + pos + " in JSON"); + } + } + + String string() { + pos++; + StringBuilder sb = new StringBuilder(); + while (true) { + if (pos >= s.length()) { + throw new WktParseException("unterminated JSON string"); + } + char c = s.charAt(pos++); + if (c == '"') { + return sb.toString(); + } + if (c != '\\') { + sb.append(c); + continue; + } + if (pos >= s.length()) { + throw new WktParseException("unterminated JSON escape"); + } + char e = s.charAt(pos++); + switch (e) { + case '"': + sb.append('"'); + break; + case '\\': + sb.append('\\'); + break; + case '/': + sb.append('/'); + break; + case 'b': + sb.append('\b'); + break; + case 'f': + sb.append('\f'); + break; + case 'n': + sb.append('\n'); + break; + case 'r': + sb.append('\r'); + break; + case 't': + sb.append('\t'); + break; + case 'u': + if (pos + 4 > s.length()) { + throw new WktParseException("truncated \\u escape in JSON"); + } + try { + sb.append((char) Integer.parseInt(s.substring(pos, pos + 4), 16)); + } catch (NumberFormatException ex) { + throw new WktParseException("bad \\u escape in JSON", ex); + } + pos += 4; + break; + default: + throw new WktParseException("unknown JSON escape \\" + e); + } + } + } + + Double number() { + int start = pos; + if (pos < s.length() && (s.charAt(pos) == '-' || s.charAt(pos) == '+')) { + pos++; + } + while (pos < s.length()) { + char c = s.charAt(pos); + if ((c >= '0' && c <= '9') || c == '.' || c == 'e' || c == 'E' || c == '+' + || c == '-') { + pos++; + } else { + break; + } + } + String text = s.substring(start, pos); + try { + return Double.valueOf(text); + } catch (NumberFormatException e) { + throw new WktParseException("not a JSON value: \"" + text + "\" at offset " + + start, e); + } + } + + void expect(String literal) { + if (!s.regionMatches(pos, literal, 0, literal.length())) { + throw new WktParseException("expected \"" + literal + "\" at offset " + pos + + " in JSON"); + } + pos += literal.length(); + } + + void skipWhitespace() { + while (pos < s.length()) { + char c = s.charAt(pos); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { + pos++; + } else { + break; + } + } + } + } + + // ------------------------------------------------------------------- writing + + /** + * Writes a value tree as JSON, indented two spaces per level — PROJ's own indentation, and + * therefore what a round-trip comparison expects. + */ + static String write(Object value) { + StringBuilder sb = new StringBuilder(); + write(value, sb, 0); + return sb.toString(); + } + + /** + * {@code depth} is the value's indentation level, the root being 0 — one less than + * {@link Parser#value(int)}'s convention, so {@code depth >= MAX_DEPTH} here refuses exactly + * the trees {@link #parse} refuses. Anything that parsed can therefore be written back, and the + * guard still fires on a tree assembled some other way. + */ + private static void write(Object value, StringBuilder sb, int depth) { + if (depth >= JsonLimits.MAX_DEPTH) { + throw new WktParseException("JSON nested more than " + JsonLimits.MAX_DEPTH + + " deep; refusing to recurse further"); + } + if (value == null) { + sb.append("null"); + } else if (value instanceof Map) { + writeObject((Map) value, sb, depth); + } else if (value instanceof List) { + writeArray((List) value, sb, depth); + } else if (value instanceof String) { + writeString((String) value, sb); + } else if (value instanceof Boolean) { + sb.append(((Boolean) value).booleanValue() ? "true" : "false"); + } else if (value instanceof Double || value instanceof Float) { + sb.append(JsonNumber.format(((Number) value).doubleValue())); + } else if (value instanceof Number) { + sb.append(value.toString()); + } else { + throw new WktParseException("cannot write a " + value.getClass().getName() + + " as JSON"); + } + } + + private static void writeObject(Map map, StringBuilder sb, int depth) { + if (map.isEmpty()) { + sb.append("{}"); + return; + } + sb.append("{\n"); + boolean first = true; + for (Map.Entry e : map.entrySet()) { + if (!first) { + sb.append(",\n"); + } + first = false; + indent(sb, depth + 1); + writeString(String.valueOf(e.getKey()), sb); + sb.append(": "); + write(e.getValue(), sb, depth + 1); + } + sb.append('\n'); + indent(sb, depth); + sb.append('}'); + } + + private static void writeArray(List list, StringBuilder sb, int depth) { + if (list.isEmpty()) { + sb.append("[]"); + return; + } + sb.append("[\n"); + for (int i = 0; i < list.size(); i++) { + if (i > 0) { + sb.append(",\n"); + } + indent(sb, depth + 1); + write(list.get(i), sb, depth + 1); + } + sb.append('\n'); + indent(sb, depth); + sb.append(']'); + } + + private static void writeString(String s, StringBuilder sb) { + sb.append('"'); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '"': + sb.append("\\\""); + break; + case '\\': + sb.append("\\\\"); + break; + case '\n': + sb.append("\\n"); + break; + case '\r': + sb.append("\\r"); + break; + case '\t': + sb.append("\\t"); + break; + case '\b': + sb.append("\\b"); + break; + case '\f': + sb.append("\\f"); + break; + default: + if (c < 0x20) { + sb.append(String.format("\\u%04x", Integer.valueOf(c))); + } else { + sb.append(c); + } + } + } + sb.append('"'); + } + + private static void indent(StringBuilder sb, int depth) { + for (int i = 0; i < depth; i++) { + sb.append(" "); + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/projjson/JsonLimits.java b/core/src/main/java/org/locationtech/proj4j/io/projjson/JsonLimits.java new file mode 100644 index 0000000..6668977 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/projjson/JsonLimits.java @@ -0,0 +1,64 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +/** + * Nesting limits for the PROJJSON reader and writer — the JSON counterpart of + * {@code io.wkt.WktLimits}, whose javadoc carries the reasoning and the measurements. The values + * are deliberately identical so that the same hostile document is refused at the same depth in + * either notation; {@code security.parsers.ProjJsonDepthLimitTest} pins that. + *

+ * A separate class rather than a shared one because {@code WktLimits} is package-private in + * {@code io.wkt}, and a nesting limit is an implementation invariant that should not become public + * API just to be shared across two packages. + * + * @since 1.5 + */ +final class JsonLimits { + + /** + * Maximum syntactic JSON nesting, counting the root value as 1. Enforced by + * {@link Json#parse} on the way in and by {@link Json#write} on the way out, so a document that + * parsed can always be written back — the round trip cannot be made to overflow by a document + * the reader accepted. + *

+ * The deepest real PROJJSON measured in this repository is 8 — this library's own + * output for {@code EPSG:7402} "NTF (Paris) / France II + NGF IGN69", the deepest of the 5,671 + * shipped EPSG definitions when each is read as WKT1 and written as PROJJSON. There is no + * PROJJSON input corpus in the repository, so the emitted depth is the measurement + * that matters; {@code security.parsers.RealCorpusDepthHeadroomTest} pins it. + */ + static final int MAX_DEPTH = 64; + + /** + * Maximum semantic nesting: how many coordinate reference systems may be nested inside + * one another, counting the outermost as 1. Enforced by {@link ProjJsonReader} and + * {@link ProjJsonWriter}. + *

+ * Below {@link #MAX_DEPTH} on purpose — see {@code io.wkt.WktLimits#MAX_CRS_DEPTH}. In PROJJSON + * one {@code CompoundCRS} level costs two JSON levels, so at 24 the semantic guard fires with + * the syntactic one still far away, which is what makes it testable. + *

+ * The deepest real value is 3, measured over the 5,671 shipped EPSG definitions, so 24 + * is eight times real data. The number is kept identical to {@code WktLimits.MAX_CRS_DEPTH} so + * that the same CRS graph is refused at the same nesting in either notation. + */ + static final int MAX_CRS_DEPTH = 24; + + private JsonLimits() { + throw new AssertionError("no instances"); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/projjson/JsonNumber.java b/core/src/main/java/org/locationtech/proj4j/io/projjson/JsonNumber.java new file mode 100644 index 0000000..6880dd1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/projjson/JsonNumber.java @@ -0,0 +1,45 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; + +import org.locationtech.proj4j.io.wkt.WktParseException; + +/** + * How a number is spelled in PROJJSON: integral values without a decimal point, everything else to + * fifteen significant digits with no exponent — the same rule the WKT writer uses, because it is + * PROJ's rule and round-trip comparisons are byte-for-byte. + */ +final class JsonNumber { + + private JsonNumber() { + } + + private static final MathContext SIGNIFICANT_15 = new MathContext(15, RoundingMode.HALF_UP); + + static String format(double v) { + if (Double.isNaN(v) || Double.isInfinite(v)) { + throw new WktParseException("cannot write the non-finite value " + v + " as JSON"); + } + if (v == Math.rint(v) && Math.abs(v) < 1e15) { + return Long.toString((long) v); + } + return new BigDecimal(v, SIGNIFICANT_15).stripTrailingZeros().toPlainString(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/projjson/ProjJsonReader.java b/core/src/main/java/org/locationtech/proj4j/io/projjson/ProjJsonReader.java new file mode 100644 index 0000000..d57f9a8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/projjson/ProjJsonReader.java @@ -0,0 +1,627 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.io.wkt.AxisDefinition; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; +import org.locationtech.proj4j.io.wkt.ConversionDefinition; +import org.locationtech.proj4j.io.wkt.CoordinateSystemDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinitions; +import org.locationtech.proj4j.io.wkt.DatumDefinition; +import org.locationtech.proj4j.io.wkt.EllipsoidDefinition; +import org.locationtech.proj4j.io.wkt.Identifier; +import org.locationtech.proj4j.io.wkt.ParameterDefinition; +import org.locationtech.proj4j.io.wkt.PrimeMeridianDefinition; +import org.locationtech.proj4j.io.wkt.UnitDefinition; +import org.locationtech.proj4j.io.wkt.WktParseException; + +/** + * Reads PROJJSON into a {@link CrsDefinition}, and from there into a + * {@link CoordinateReferenceSystem}. + *

+ * PROJJSON carries the same content as WKT2 in a different syntax, so this reader produces the same + * {@link CrsDefinition} model the WKT reader does; everything downstream — the PROJ parameter + * synthesis, the axis order policy, the writers — is shared. Follows PROJ 9.8.1's + * {@code data/projjson.schema.json} and the {@code json_import} tests in + * {@code test/unit/test_io.cpp}. + *

+ * Instances are immutable and safe to share between threads. + */ +public final class ProjJsonReader { + + private final AxisOrderPolicy axisOrderPolicy; + + /** + * A reader with the default {@link AxisOrderPolicy#LEGACY} policy: longitude-first, exactly as + * proj4j 1.4.3 behaves. + */ + public ProjJsonReader() { + this(AxisOrderPolicy.LEGACY); + } + + public ProjJsonReader(AxisOrderPolicy axisOrderPolicy) { + if (axisOrderPolicy == null) { + throw new IllegalArgumentException("axisOrderPolicy is null"); + } + this.axisOrderPolicy = axisOrderPolicy; + } + + public AxisOrderPolicy getAxisOrderPolicy() { + return axisOrderPolicy; + } + + /** + * Parses PROJJSON into a definition, retaining everything the document said — including the + * declared axis order, which is applied only when a CRS is built and only if the policy says + * so. + * + * @throws WktParseException if the text is not well-formed PROJJSON, or describes something + * this library cannot represent + */ + public CrsDefinition readDefinition(String json) { + Object root = Json.parse(json); + if (!(root instanceof Map)) { + throw new WktParseException("PROJJSON must be a JSON object"); + } + return crs(asObject(root, "root"), 1); + } + + /** + * Parses PROJJSON and builds a proj4j CRS from it, applying this reader's + * {@link AxisOrderPolicy}. + */ + public CoordinateReferenceSystem read(String json) { + return CrsDefinitions.toCrs(readDefinition(json), axisOrderPolicy); + } + + // ------------------------------------------------------------------ elements + + /** + * {@code depth} counts nested coordinate reference systems, the outermost being 1, and is + * bounded by {@link JsonLimits#MAX_CRS_DEPTH}. {@link Json#parse} has already bounded the + * document, but this is a second recursion over the parsed tree — {@code crs -> compound -> crs} + * and {@code crs -> bound -> crs} — with its own, lower limit. + */ + private CrsDefinition crs(Map o, int depth) { + if (depth > JsonLimits.MAX_CRS_DEPTH) { + throw new WktParseException("CRSs nested more than " + JsonLimits.MAX_CRS_DEPTH + + " deep in PROJJSON; refusing to recurse further"); + } + String type = string(o, "type"); + if (type == null) { + throw new WktParseException("PROJJSON object has no \"type\" member"); + } + CrsDefinition def = new CrsDefinition(); + def.setName(string(o, "name")); + if (type.equals("GeographicCRS") || type.equals("GeodeticCRS")) { + geodetic(o, def); + } else if (type.equals("ProjectedCRS")) { + projected(o, def); + } else if (type.equals("VerticalCRS")) { + vertical(o, def); + } else if (type.equals("CompoundCRS")) { + compound(o, def, depth); + } else if (type.equals("BoundCRS")) { + bound(o, def, depth); + } else if (type.equals("EngineeringCRS")) { + def.setKind(CrsDefinition.Kind.ENGINEERING); + def.setCoordinateSystem(coordinateSystem(object(o, "coordinate_system"))); + } else { + throw new WktParseException("PROJJSON type \"" + type + + "\" is not a coordinate reference system this library supports"); + } + metadata(o, def); + return def; + } + + private void geodetic(Map o, CrsDefinition def) { + def.setDatum(datum(o)); + CoordinateSystemDefinition cs = coordinateSystem(object(o, "coordinate_system")); + def.setCoordinateSystem(cs); + boolean cartesian = CoordinateSystemDefinition.CARTESIAN.equalsIgnoreCase(cs.getType()); + def.setKind(cartesian ? CrsDefinition.Kind.GEOCENTRIC : CrsDefinition.Kind.GEOGRAPHIC); + } + + private void projected(Map o, CrsDefinition def) { + def.setKind(CrsDefinition.Kind.PROJECTED); + Map base = object(o, "base_crs"); + if (base == null) { + throw new WktParseException("a ProjectedCRS needs a \"base_crs\""); + } + CrsDefinition baseDef = new CrsDefinition(); + baseDef.setName(string(base, "name")); + geodetic(base, baseDef); + metadata(base, baseDef); + def.setBaseCrs(baseDef); + def.setConversion(conversion(object(o, "conversion"))); + def.setCoordinateSystem(coordinateSystem(object(o, "coordinate_system"))); + } + + private void vertical(Map o, CrsDefinition def) { + def.setKind(CrsDefinition.Kind.VERTICAL); + Map d = object(o, "datum"); + if (d == null) { + d = object(o, "datum_ensemble"); + } + if (d != null) { + DatumDefinition datum = new DatumDefinition(); + datum.setName(string(d, "name")); + datum.setId(id(d)); + def.setDatum(datum); + } + def.setCoordinateSystem(coordinateSystem(object(o, "coordinate_system"))); + } + + private void compound(Map o, CrsDefinition def, int depth) { + def.setKind(CrsDefinition.Kind.COMPOUND); + List components = array(o, "components"); + if (components == null || components.isEmpty()) { + throw new WktParseException("a CompoundCRS needs \"components\""); + } + for (int i = 0; i < components.size(); i++) { + def.addComponent(crs(asObject(components.get(i), "component"), depth + 1)); + } + } + + private void bound(Map o, CrsDefinition def, int depth) { + def.setKind(CrsDefinition.Kind.BOUND); + Map source = object(o, "source_crs"); + if (source == null) { + throw new WktParseException("a BoundCRS needs a \"source_crs\""); + } + CrsDefinition sourceDef = crs(source, depth + 1); + def.setBaseCrs(sourceDef); + if (def.getName() == null) { + def.setName(sourceDef.getName()); + } + Map target = object(o, "target_crs"); + if (target != null) { + def.setHubCrs(crs(target, depth + 1)); + } + Map transformation = object(o, "transformation"); + if (transformation != null) { + def.setToWgs84(helmert(transformation)); + } + } + + private DatumDefinition datum(Map o) { + Map d = object(o, "datum"); + boolean ensemble = false; + if (d == null) { + d = object(o, "datum_ensemble"); + ensemble = d != null; + } + if (d == null) { + throw new WktParseException("a geodetic CRS needs a \"datum\" or a \"datum_ensemble\""); + } + DatumDefinition datum = new DatumDefinition(); + datum.setName(string(d, "name")); + datum.setId(id(d)); + datum.setAnchor(string(d, "anchor")); + Double epoch = number(d, "frame_reference_epoch"); + if (epoch != null) { + datum.setFrameEpoch(epoch.doubleValue()); + } + Map e = object(d, "ellipsoid"); + if (e == null && ensemble) { + e = object(d, "ellipsoid"); + } + if (e != null) { + datum.setEllipsoid(ellipsoid(e)); + } else if (!ensemble) { + throw new WktParseException("datum \"" + datum.getName() + "\" has no \"ellipsoid\""); + } + Map pm = object(d, "prime_meridian"); + datum.setPrimeMeridian(pm == null ? PrimeMeridianDefinition.greenwich() + : primeMeridian(pm)); + return datum; + } + + private EllipsoidDefinition ellipsoid(Map o) { + EllipsoidDefinition e = new EllipsoidDefinition(); + e.setName(string(o, "name")); + e.setId(id(o)); + Double radius = number(o, "radius"); + if (radius != null) { + e.setSemiMajorAxis(radius.doubleValue()); + e.setSemiMinorAxis(radius.doubleValue()); + e.setInverseFlattening(0.0); + e.setUnit(UnitDefinition.METRE); + return e; + } + Double a = number(o, "semi_major_axis"); + if (a == null) { + Object measure = o.get("semi_major_axis"); + if (measure instanceof Map) { + Map m = asObject(measure, "semi_major_axis"); + a = number(m, "value"); + e.setUnit(unit(m.get("unit"), UnitDefinition.LINEAR)); + } + } + if (a == null) { + throw new WktParseException("ellipsoid \"" + e.getName() + + "\" has no \"semi_major_axis\" or \"radius\""); + } + e.setSemiMajorAxis(a.doubleValue()); + Double rf = number(o, "inverse_flattening"); + if (rf != null) { + e.setInverseFlattening(rf.doubleValue()); + return e; + } + Object minor = o.get("semi_minor_axis"); + if (minor instanceof Map) { + Map m = asObject(minor, "semi_minor_axis"); + Double b = number(m, "value"); + if (b == null) { + throw new WktParseException("\"semi_minor_axis\" has no value"); + } + UnitDefinition u = unit(m.get("unit"), UnitDefinition.LINEAR); + // Both axes must be in the same unit before a flattening can be computed from them. + double bMetres = u == null ? b.doubleValue() : u.toBase(b.doubleValue()); + double aMetres = e.getUnit() == null ? e.getSemiMajorAxis() + : e.getUnit().toBase(e.getSemiMajorAxis()); + e.setSemiMinorAxis(e.getUnit() == null ? bMetres + : e.getUnit().fromBase(bMetres)); + if (aMetres == bMetres) { + e.setInverseFlattening(0.0); + } + return e; + } + if (minor instanceof Double) { + e.setSemiMinorAxis(((Double) minor).doubleValue()); + return e; + } + throw new WktParseException("ellipsoid \"" + e.getName() + + "\" has neither \"inverse_flattening\" nor \"semi_minor_axis\""); + } + + private PrimeMeridianDefinition primeMeridian(Map o) { + PrimeMeridianDefinition pm = new PrimeMeridianDefinition(); + pm.setName(string(o, "name")); + pm.setId(id(o)); + Object longitude = o.get("longitude"); + if (longitude == null) { + throw new WktParseException("prime meridian \"" + pm.getName() + + "\" has no \"longitude\""); + } + if (longitude instanceof Double) { + pm.setLongitude(((Double) longitude).doubleValue()); + pm.setUnit(UnitDefinition.DEGREE); + return pm; + } + Map m = asObject(longitude, "longitude"); + Double v = number(m, "value"); + if (v == null) { + throw new WktParseException("prime meridian longitude has no value"); + } + pm.setLongitude(v.doubleValue()); + pm.setUnit(unit(m.get("unit"), UnitDefinition.ANGULAR)); + return pm; + } + + private ConversionDefinition conversion(Map o) { + if (o == null) { + throw new WktParseException("a ProjectedCRS needs a \"conversion\""); + } + ConversionDefinition conv = new ConversionDefinition(); + conv.setName(string(o, "name")); + conv.setId(id(o)); + Map method = object(o, "method"); + if (method == null) { + throw new WktParseException("conversion \"" + conv.getName() + "\" has no \"method\""); + } + conv.setMethodName(string(method, "name")); + conv.setMethodId(id(method)); + List params = array(o, "parameters"); + if (params != null) { + for (int i = 0; i < params.size(); i++) { + Map p = asObject(params.get(i), "parameter"); + ParameterDefinition pd = new ParameterDefinition(); + pd.setName(string(p, "name")); + pd.setId(id(p)); + Double v = number(p, "value"); + if (v == null) { + throw new WktParseException("parameter \"" + pd.getName() + "\" has no value"); + } + pd.setValue(v.doubleValue()); + pd.setUnit(unit(p.get("unit"), -1)); + conv.addParameter(pd); + } + } + return conv; + } + + private double[] helmert(Map o) { + Map method = object(o, "method"); + String methodName = method == null ? "" : string(method, "name"); + boolean coordinateFrame = methodName != null + // Locale.ROOT: this decides the Helmert rotation SIGN convention by matching + // an ASCII method name, so it must not follow the ambient locale. + && methodName.toLowerCase(Locale.ROOT).contains("coordinate frame"); + double[] v = new double[7]; + boolean rotations = false; + List params = array(o, "parameters"); + if (params == null) { + throw new WktParseException("a BoundCRS transformation needs \"parameters\""); + } + for (int i = 0; i < params.size(); i++) { + Map p = asObject(params.get(i), "parameter"); + String name = string(p, "name"); + Double value = number(p, "value"); + if (name == null || value == null) { + continue; + } + int index = helmertIndex(name); + if (index < 0) { + continue; + } + double x = value.doubleValue(); + UnitDefinition u = unit(p.get("unit"), -1); + if (index >= 3 && index <= 5) { + if (u != null && u.getType() == UnitDefinition.ANGULAR) { + x = u.toBase(x) / UnitDefinition.ARC_SECOND.getConversionFactor(); + } + if (coordinateFrame) { + x = -x; + } + rotations = true; + } else if (index == 6) { + if (u != null && u.getConversionFactor() != 1.0) { + x = u.toBase(x) * 1e6; + } else if (Math.abs(x - 1.0) < 0.1) { + // The abridged convention, as WKT2's ABRIDGEDTRANSFORMATION uses it: the + // value is 1 + s * 1e-6 rather than s in parts per million. + x = (x - 1.0) * 1e6; + } + rotations = true; + } else if (u != null && u.getType() == UnitDefinition.LINEAR) { + x = u.toBase(x); + } + v[index] = x; + } + if (!rotations) { + return new double[]{v[0], v[1], v[2]}; + } + return v; + } + + private int helmertIndex(String name) { + // Locale.ROOT: an ASCII parameter-name key, compared against ASCII literals below. + String n = name.toLowerCase(Locale.ROOT).replace("-", " "); + if (n.startsWith("x axis translation")) { + return 0; + } + if (n.startsWith("y axis translation")) { + return 1; + } + if (n.startsWith("z axis translation")) { + return 2; + } + if (n.startsWith("x axis rotation")) { + return 3; + } + if (n.startsWith("y axis rotation")) { + return 4; + } + if (n.startsWith("z axis rotation")) { + return 5; + } + if (n.startsWith("scale difference")) { + return 6; + } + return -1; + } + + private CoordinateSystemDefinition coordinateSystem(Map o) { + if (o == null) { + throw new WktParseException("a CRS needs a \"coordinate_system\""); + } + CoordinateSystemDefinition cs = new CoordinateSystemDefinition(); + cs.setType(string(o, "subtype")); + List axes = array(o, "axis"); + if (axes == null) { + throw new WktParseException("a coordinate system needs an \"axis\" array"); + } + int type = CoordinateSystemDefinition.ELLIPSOIDAL.equalsIgnoreCase(cs.getType()) + ? UnitDefinition.ANGULAR : UnitDefinition.LINEAR; + for (int i = 0; i < axes.size(); i++) { + Map a = asObject(axes.get(i), "axis"); + AxisDefinition axis = new AxisDefinition(); + axis.setName(string(a, "name")); + axis.setAbbreviation(string(a, "abbreviation")); + axis.setDirection(string(a, "direction")); + axis.setUnit(unit(a.get("unit"), type)); + cs.addAxis(axis); + if (cs.getUnit() == null) { + cs.setUnit(axis.getUnit()); + } + } + return cs; + } + + private void metadata(Map o, CrsDefinition def) { + Identifier one = id(o); + if (one != null) { + def.addId(one); + } + List ids = array(o, "ids"); + if (ids != null) { + for (int i = 0; i < ids.size(); i++) { + def.addId(identifier(asObject(ids.get(i), "id"))); + } + } + def.setRemark(string(o, "remarks")); + def.setScope(string(o, "scope")); + def.setAreaDescription(string(o, "area")); + Map bbox = object(o, "bbox"); + if (bbox != null) { + def.setBoundingBox(new double[]{ + required(bbox, "south_latitude"), required(bbox, "west_longitude"), + required(bbox, "north_latitude"), required(bbox, "east_longitude"), + }); + } + List usages = array(o, "usages"); + if (usages != null && !usages.isEmpty()) { + Map first = asObject(usages.get(0), "usage"); + if (def.getScope() == null) { + def.setScope(string(first, "scope")); + } + if (def.getAreaDescription() == null) { + def.setAreaDescription(string(first, "area")); + } + Map b = object(first, "bbox"); + if (b != null && def.getBoundingBox() == null) { + def.setBoundingBox(new double[]{ + required(b, "south_latitude"), required(b, "west_longitude"), + required(b, "north_latitude"), required(b, "east_longitude"), + }); + } + } + } + + // ------------------------------------------------------------------- helpers + + /** + * A unit, which PROJJSON spells either as a short name ({@code "degree"}, {@code "metre"}, + * {@code "unity"}) or as an object with a type, a name and a conversion factor. + */ + private UnitDefinition unit(Object value, int expectedType) { + if (value == null) { + return null; + } + if (value instanceof String) { + String name = (String) value; + if (name.equals("degree")) { + return UnitDefinition.DEGREE; + } + if (name.equals("metre")) { + return UnitDefinition.METRE; + } + if (name.equals("unity")) { + return UnitDefinition.UNITY; + } + throw new WktParseException("unit \"" + name + "\" is not one of PROJJSON's three " + + "short names (degree, metre, unity); use an object with a conversion factor"); + } + Map o = asObject(value, "unit"); + String type = string(o, "type"); + int unitType = expectedType; + if ("AngularUnit".equals(type)) { + unitType = UnitDefinition.ANGULAR; + } else if ("LinearUnit".equals(type)) { + unitType = UnitDefinition.LINEAR; + } else if ("ScaleUnit".equals(type)) { + unitType = UnitDefinition.SCALE; + } else if ("TimeUnit".equals(type)) { + unitType = UnitDefinition.TIME; + } else if ("ParametricUnit".equals(type)) { + unitType = UnitDefinition.PARAMETRIC; + } + Double factor = number(o, "conversion_factor"); + String name = string(o, "name"); + if (factor == null) { + throw new WktParseException("unit \"" + name + "\" has no \"conversion_factor\""); + } + if (unitType < 0) { + unitType = UnitDefinition.LINEAR; + } + return new UnitDefinition(name, factor.doubleValue(), unitType, id(o)); + } + + private Identifier id(Map o) { + Map idObject = object(o, "id"); + return idObject == null ? null : identifier(idObject); + } + + private Identifier identifier(Map o) { + String authority = string(o, "authority"); + Object code = o.get("code"); + if (authority == null || code == null) { + throw new WktParseException("an \"id\" needs an \"authority\" and a \"code\""); + } + String codeText = code instanceof Double ? JsonNumber.format(((Double) code).doubleValue()) + : String.valueOf(code); + return new Identifier(authority, codeText); + } + + private double required(Map o, String key) { + Double v = number(o, key); + if (v == null) { + throw new WktParseException("missing numeric member \"" + key + "\""); + } + return v.doubleValue(); + } + + private String string(Map o, String key) { + Object v = o.get(key); + if (v == null) { + return null; + } + if (!(v instanceof String)) { + throw new WktParseException("member \"" + key + "\" must be a string"); + } + return (String) v; + } + + private Double number(Map o, String key) { + Object v = o.get(key); + if (v == null) { + return null; + } + if (!(v instanceof Double)) { + throw new WktParseException("member \"" + key + "\" must be a number"); + } + return (Double) v; + } + + @SuppressWarnings("unchecked") + private Map object(Map o, String key) { + Object v = o.get(key); + if (v == null) { + return null; + } + if (!(v instanceof Map)) { + throw new WktParseException("member \"" + key + "\" must be an object"); + } + return (Map) v; + } + + @SuppressWarnings("unchecked") + private List array(Map o, String key) { + Object v = o.get(key); + if (v == null) { + return null; + } + if (!(v instanceof List)) { + throw new WktParseException("member \"" + key + "\" must be an array"); + } + return (List) v; + } + + @SuppressWarnings("unchecked") + private Map asObject(Object v, String what) { + if (!(v instanceof Map)) { + throw new WktParseException(what + " must be a JSON object"); + } + return (Map) v; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/projjson/ProjJsonWriter.java b/core/src/main/java/org/locationtech/proj4j/io/projjson/ProjJsonWriter.java new file mode 100644 index 0000000..cdb571a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/projjson/ProjJsonWriter.java @@ -0,0 +1,430 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.io.wkt.AxisDefinition; +import org.locationtech.proj4j.io.wkt.ConversionDefinition; +import org.locationtech.proj4j.io.wkt.CoordinateSystemDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinitions; +import org.locationtech.proj4j.io.wkt.DatumDefinition; +import org.locationtech.proj4j.io.wkt.EllipsoidDefinition; +import org.locationtech.proj4j.io.wkt.Identifier; +import org.locationtech.proj4j.io.wkt.ParameterDefinition; +import org.locationtech.proj4j.io.wkt.PrimeMeridianDefinition; +import org.locationtech.proj4j.io.wkt.UnitDefinition; +import org.locationtech.proj4j.io.wkt.WktParseException; + +/** + * Writes a {@link CrsDefinition} as PROJJSON. + *

+ * Member order and two-space indentation follow PROJ's own {@code exportToJSON}, so a definition + * read from PROJJSON is written back byte-for-byte. The {@code $schema} member is emitted only when + * a schema has been set, matching PROJ's {@code JSONFormatter::setSchema}; upstream's own tests set + * it to a placeholder for exactly that reason. + *

+ * Instances are immutable; {@link #withSchema} returns a new one. + */ +public final class ProjJsonWriter { + + /** The schema PROJ 9.8.1 emits by default. */ + public static final String DEFAULT_SCHEMA = + "https://proj.org/schemas/v0.7/projjson.schema.json"; + + private final String schema; + + /** + * A writer emitting {@link #DEFAULT_SCHEMA}. + */ + public ProjJsonWriter() { + this(DEFAULT_SCHEMA); + } + + private ProjJsonWriter(String schema) { + this.schema = schema; + } + + /** + * A writer emitting the given {@code $schema}, or none at all when {@code schema} is + * {@code null}. + */ + public ProjJsonWriter withSchema(String schema) { + return new ProjJsonWriter(schema); + } + + public String getSchema() { + return schema; + } + + /** + * Writes a definition as PROJJSON. + */ + public String write(CrsDefinition def) { + return Json.write(toMap(def, true, 1)); + } + + /** + * Describes an existing proj4j CRS with {@link CrsDefinitions#fromCrs} and writes that. + */ + public String write(CoordinateReferenceSystem crs) { + return write(CrsDefinitions.fromCrs(crs)); + } + + // ------------------------------------------------------------------ elements + + /** + * {@code depth} counts nested coordinate reference systems, the outermost being 1, and is + * bounded by {@link JsonLimits#MAX_CRS_DEPTH}. {@link CrsDefinition} is public and mutable, so + * a caller can hand the writer a graph of any depth — including one that contains itself. + */ + private Map toMap(CrsDefinition def, boolean root, int depth) { + if (depth > JsonLimits.MAX_CRS_DEPTH) { + throw new WktParseException("CRSs nested more than " + JsonLimits.MAX_CRS_DEPTH + + " deep; refusing to write further"); + } + if (def == null || def.getKind() == null) { + throw new WktParseException("CRS definition is null or has no kind"); + } + Map o = new LinkedHashMap(); + if (root && schema != null) { + o.put("$schema", schema); + } + switch (def.getKind()) { + case GEOGRAPHIC: + o.put("type", "GeographicCRS"); + o.put("name", name(def)); + o.put("datum", datum(def.getDatum())); + o.put("coordinate_system", coordinateSystem(def.getCoordinateSystem())); + break; + case GEOCENTRIC: + o.put("type", "GeodeticCRS"); + o.put("name", name(def)); + o.put("datum", datum(def.getDatum())); + o.put("coordinate_system", coordinateSystem(def.getCoordinateSystem())); + break; + case PROJECTED: + o.put("type", "ProjectedCRS"); + o.put("name", name(def)); + o.put("base_crs", toMap(def.getBaseCrs(), false, depth + 1)); + o.put("conversion", conversion(def.getConversion())); + o.put("coordinate_system", coordinateSystem(def.getCoordinateSystem())); + break; + case VERTICAL: + o.put("type", "VerticalCRS"); + o.put("name", name(def)); + if (def.getDatum() != null) { + Map d = new LinkedHashMap(); + d.put("type", "VerticalReferenceFrame"); + d.put("name", def.getDatum().getName() == null ? "unknown" + : def.getDatum().getName()); + putId(d, def.getDatum().getId()); + o.put("datum", d); + } + o.put("coordinate_system", coordinateSystem(def.getCoordinateSystem())); + break; + case COMPOUND: + o.put("type", "CompoundCRS"); + o.put("name", name(def)); + List components = new ArrayList(); + for (int i = 0; i < def.getComponents().size(); i++) { + components.add(toMap(def.getComponents().get(i), false, depth + 1)); + } + o.put("components", components); + break; + case BOUND: + o.put("type", "BoundCRS"); + o.put("source_crs", toMap(def.getBaseCrs(), false, depth + 1)); + o.put("target_crs", toMap(def.getHubCrs() != null ? def.getHubCrs() : wgs84(), + false, depth + 1)); + o.put("transformation", transformation(def.getToWgs84())); + return o; + case ENGINEERING: + o.put("type", "EngineeringCRS"); + o.put("name", name(def)); + o.put("coordinate_system", coordinateSystem(def.getCoordinateSystem())); + break; + default: + throw new WktParseException("cannot write a " + def.getKind() + + " CRS as PROJJSON"); + } + if (def.getScope() != null) { + o.put("scope", def.getScope()); + } + if (def.getAreaDescription() != null) { + o.put("area", def.getAreaDescription()); + } + if (def.getBoundingBox() != null && def.getBoundingBox().length == 4) { + Map bbox = new LinkedHashMap(); + bbox.put("south_latitude", Double.valueOf(def.getBoundingBox()[0])); + bbox.put("west_longitude", Double.valueOf(def.getBoundingBox()[1])); + bbox.put("north_latitude", Double.valueOf(def.getBoundingBox()[2])); + bbox.put("east_longitude", Double.valueOf(def.getBoundingBox()[3])); + o.put("bbox", bbox); + } + if (def.getIds().size() == 1) { + putId(o, def.getId()); + } else if (def.getIds().size() > 1) { + List ids = new ArrayList(); + for (int i = 0; i < def.getIds().size(); i++) { + ids.add(identifier(def.getIds().get(i))); + } + o.put("ids", ids); + } + if (def.getRemark() != null) { + o.put("remarks", def.getRemark()); + } + return o; + } + + private CrsDefinition wgs84() { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.GEOGRAPHIC); + def.setName("WGS 84"); + DatumDefinition datum = new DatumDefinition(); + datum.setName("World Geodetic System 1984"); + EllipsoidDefinition e = new EllipsoidDefinition(); + e.setName("WGS 84"); + e.setSemiMajorAxis(6378137); + e.setInverseFlattening(298.257223563); + datum.setEllipsoid(e); + datum.setPrimeMeridian(PrimeMeridianDefinition.greenwich()); + def.setDatum(datum); + CoordinateSystemDefinition cs = + new CoordinateSystemDefinition(CoordinateSystemDefinition.ELLIPSOIDAL); + cs.setUnit(UnitDefinition.DEGREE); + cs.addAxis(new AxisDefinition("Geodetic latitude", "Lat", AxisDefinition.NORTH, + UnitDefinition.DEGREE)); + cs.addAxis(new AxisDefinition("Geodetic longitude", "Lon", AxisDefinition.EAST, + UnitDefinition.DEGREE)); + def.setCoordinateSystem(cs); + def.addId(new Identifier("EPSG", "4326")); + return def; + } + + private Map datum(DatumDefinition datum) { + if (datum == null) { + throw new WktParseException("a geodetic CRS needs a datum"); + } + Map o = new LinkedHashMap(); + o.put("type", datum.isDynamic() ? "DynamicGeodeticReferenceFrame" + : "GeodeticReferenceFrame"); + o.put("name", datum.getName() == null ? "unknown" : datum.getName()); + if (datum.getAnchor() != null) { + o.put("anchor", datum.getAnchor()); + } + if (datum.isDynamic()) { + o.put("frame_reference_epoch", Double.valueOf(datum.getFrameEpoch())); + } + if (datum.getEllipsoid() != null) { + o.put("ellipsoid", ellipsoid(datum.getEllipsoid())); + } + PrimeMeridianDefinition pm = datum.getPrimeMeridian(); + if (pm != null && !pm.isGreenwich()) { + // Greenwich is the default and PROJ does not emit it. + Map p = new LinkedHashMap(); + p.put("name", pm.getName() == null ? "Greenwich" : pm.getName()); + if (pm.getUnit() != null && pm.getUnit().getConversionFactor() + != UnitDefinition.DEGREE.getConversionFactor()) { + Map longitude = new LinkedHashMap(); + longitude.put("value", Double.valueOf(pm.getLongitude())); + longitude.put("unit", unit(pm.getUnit())); + p.put("longitude", longitude); + } else { + p.put("longitude", Double.valueOf(pm.getLongitude())); + } + putId(p, pm.getId()); + o.put("prime_meridian", p); + } + putId(o, datum.getId()); + return o; + } + + private Map ellipsoid(EllipsoidDefinition e) { + Map o = new LinkedHashMap(); + o.put("name", e.getName() == null ? "unknown" : e.getName()); + if (e.isSphere() && !Double.isNaN(e.getSemiMinorAxis())) { + o.put("radius", Double.valueOf(e.getSemiMajorAxis())); + putId(o, e.getId()); + return o; + } + if (e.getUnit() != null && e.getUnit().getConversionFactor() != 1.0) { + Map a = new LinkedHashMap(); + a.put("value", Double.valueOf(e.getSemiMajorAxis())); + a.put("unit", unit(e.getUnit())); + o.put("semi_major_axis", a); + } else { + o.put("semi_major_axis", Double.valueOf(e.getSemiMajorAxis())); + } + if (!Double.isNaN(e.getInverseFlattening())) { + o.put("inverse_flattening", Double.valueOf(e.getInverseFlattening())); + } else { + o.put("semi_minor_axis", Double.valueOf(e.getSemiMinorAxis())); + } + putId(o, e.getId()); + return o; + } + + private Map conversion(ConversionDefinition conv) { + if (conv == null) { + throw new WktParseException("a projected CRS needs a conversion"); + } + Map o = new LinkedHashMap(); + o.put("name", conv.getName() == null ? "unnamed" : conv.getName()); + Map method = new LinkedHashMap(); + method.put("name", conv.getMethodName() == null ? "unknown" : conv.getMethodName()); + putId(method, conv.getMethodId()); + o.put("method", method); + List params = new ArrayList(); + for (int i = 0; i < conv.getParameters().size(); i++) { + ParameterDefinition p = conv.getParameters().get(i); + Map pm = new LinkedHashMap(); + pm.put("name", p.getName()); + pm.put("value", Double.valueOf(p.getValue())); + if (p.getUnit() != null) { + pm.put("unit", unit(p.getUnit())); + } + putId(pm, p.getId()); + params.add(pm); + } + o.put("parameters", params); + putId(o, conv.getId()); + return o; + } + + private Map transformation(double[] t) { + if (t == null) { + throw new WktParseException("a bound CRS needs transformation parameters"); + } + Map o = new LinkedHashMap(); + o.put("name", "Transformation to WGS84"); + Map method = new LinkedHashMap(); + boolean seven = t.length == 7; + method.put("name", seven ? "Position Vector transformation (geog2D domain)" + : "Geocentric translations (geog2D domain)"); + putId(method, new Identifier("EPSG", seven ? "9606" : "9603")); + o.put("method", method); + String[] names = {"X-axis translation", "Y-axis translation", "Z-axis translation", + "X-axis rotation", "Y-axis rotation", "Z-axis rotation", "Scale difference"}; + String[] codes = {"8605", "8606", "8607", "8608", "8609", "8610", "8611"}; + List params = new ArrayList(); + for (int i = 0; i < t.length; i++) { + Map p = new LinkedHashMap(); + p.put("name", names[i]); + p.put("value", Double.valueOf(t[i])); + p.put("unit", i < 3 ? (Object) "metre" + : i < 6 ? unit(UnitDefinition.ARC_SECOND) : unit(UnitDefinition.PPM)); + putId(p, new Identifier("EPSG", codes[i])); + params.add(p); + } + o.put("parameters", params); + return o; + } + + private Map coordinateSystem(CoordinateSystemDefinition cs) { + if (cs == null) { + throw new WktParseException("a CRS needs a coordinate system"); + } + Map o = new LinkedHashMap(); + o.put("subtype", cs.getType() == null ? CoordinateSystemDefinition.CARTESIAN + : cs.getType()); + List axes = new ArrayList(); + for (int i = 0; i < cs.getAxes().size(); i++) { + AxisDefinition a = cs.getAxes().get(i); + Map ao = new LinkedHashMap(); + ao.put("name", a.getName() == null ? "unknown" : a.getName()); + if (a.getAbbreviation() != null) { + ao.put("abbreviation", a.getAbbreviation()); + } + ao.put("direction", a.getDirection() == null ? AxisDefinition.UNSPECIFIED + : a.getDirection()); + UnitDefinition u = cs.unitOf(i); + if (u != null) { + ao.put("unit", unit(u)); + } + axes.add(ao); + } + o.put("axis", axes); + return o; + } + + /** + * A unit: one of PROJJSON's three short names when it is exactly that unit, otherwise an object + * carrying the conversion factor. + */ + private Object unit(UnitDefinition u) { + if (u.getType() == UnitDefinition.ANGULAR + && u.getConversionFactor() == UnitDefinition.DEGREE.getConversionFactor()) { + return "degree"; + } + if (u.getType() == UnitDefinition.LINEAR && u.getConversionFactor() == 1.0) { + return "metre"; + } + if (u.getType() == UnitDefinition.SCALE && u.getConversionFactor() == 1.0) { + return "unity"; + } + Map o = new LinkedHashMap(); + switch (u.getType()) { + case UnitDefinition.ANGULAR: + o.put("type", "AngularUnit"); + break; + case UnitDefinition.SCALE: + o.put("type", "ScaleUnit"); + break; + case UnitDefinition.TIME: + o.put("type", "TimeUnit"); + break; + case UnitDefinition.PARAMETRIC: + o.put("type", "ParametricUnit"); + break; + default: + o.put("type", "LinearUnit"); + } + o.put("name", u.getName() == null ? "unknown" : u.getName()); + o.put("conversion_factor", Double.valueOf(u.getConversionFactor())); + return o; + } + + private void putId(Map o, Identifier id) { + if (id == null) { + return; + } + o.put("id", identifier(id)); + } + + private Map identifier(Identifier id) { + Map o = new LinkedHashMap(); + o.put("authority", id.getAuthority()); + String code = id.getCode(); + boolean numeric = code != null && code.length() > 0; + for (int i = 0; numeric && i < code.length(); i++) { + if (!Character.isDigit(code.charAt(i))) { + numeric = false; + } + } + o.put("code", numeric ? (Object) Double.valueOf(Double.parseDouble(code)) : code); + return o; + } + + private String name(CrsDefinition def) { + return def.getName() == null ? "unknown" : def.getName(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/projjson/package-info.java b/core/src/main/java/org/locationtech/proj4j/io/projjson/package-info.java new file mode 100644 index 0000000..ebbaae0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/projjson/package-info.java @@ -0,0 +1,38 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Reading and writing coordinate reference systems as PROJJSON. + *

+ * PROJJSON carries the same content as WKT2 in JSON syntax, so this package shares the + * {@link org.locationtech.proj4j.io.wkt.CrsDefinition} model with + * {@link org.locationtech.proj4j.io.wkt}: read PROJJSON and write WKT2, or the reverse, without + * going through a coordinate. + *

+ * CoordinateReferenceSystem crs = new ProjJsonReader().read(json);
+ * String json = new ProjJsonWriter().write(definition);
+ * 
+ * The JSON reader and writer are hand-written and about three hundred lines. There is no + * JSON library dependency and there will not be one: the reason this code exists is that a + * consumer can delete Apache SIS and the {@code catch (LinkageError)} that its duplicated GeoAPI + * classes force on them, and adding a Jackson or Gson dependency to achieve that would move the + * hazard rather than remove it. + *

+ * Member order and two-space indentation match PROJ's {@code exportToJSON}, so a document read from + * PROJJSON is written back byte-for-byte. Follows {@code data/projjson.schema.json} and the + * {@code json_import} tests of PROJ 9.8.1. + */ +package org.locationtech.proj4j.io.projjson; diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/AxisDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/AxisDefinition.java new file mode 100644 index 0000000..a5a82b3 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/AxisDefinition.java @@ -0,0 +1,139 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * One coordinate system axis, exactly as the source document declared it. + *

+ * Axis information is retained, never discarded and never silently reordered: whether + * the declared order is honoured when a {@link org.locationtech.proj4j.CoordinateReferenceSystem} + * is built is decided by {@link AxisOrderPolicy} at that boundary, and this object is what the + * policy is applied to. + */ +public final class AxisDefinition { + + /** Axis directions, spelled as WKT2 spells them (lower case). */ + public static final String NORTH = "north"; + public static final String SOUTH = "south"; + public static final String EAST = "east"; + public static final String WEST = "west"; + public static final String UP = "up"; + public static final String DOWN = "down"; + public static final String GEOCENTRIC_X = "geocentricX"; + public static final String GEOCENTRIC_Y = "geocentricY"; + public static final String GEOCENTRIC_Z = "geocentricZ"; + public static final String UNSPECIFIED = "unspecified"; + + private String name; + private String abbreviation; + private String direction; + private UnitDefinition unit; + + public AxisDefinition() { + } + + public AxisDefinition(String name, String abbreviation, String direction, UnitDefinition unit) { + this.name = name; + this.abbreviation = abbreviation; + this.direction = direction; + this.unit = unit; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + /** + * The axis direction, normalised to WKT2's lower-case spelling: one of the constants on this + * class, or the raw token if it is something else. + */ + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public UnitDefinition getUnit() { + return unit; + } + + public void setUnit(UnitDefinition unit) { + this.unit = unit; + } + + /** + * Whether this axis measures longitude, easting or westing, i.e. is the "x" of a + * longitude-first coordinate. + */ + public boolean isHorizontalX() { + return EAST.equals(direction) || WEST.equals(direction); + } + + /** + * Whether this axis measures latitude, northing or southing. + */ + public boolean isHorizontalY() { + return NORTH.equals(direction) || SOUTH.equals(direction); + } + + public boolean isVertical() { + return UP.equals(direction) || DOWN.equals(direction); + } + + /** + * The single character PROJ's {@code +axis=} uses for this direction, or {@code 0} if the + * direction has no {@code +axis=} spelling. + */ + public char toProjAxisChar() { + if (EAST.equals(direction)) { + return 'e'; + } + if (WEST.equals(direction)) { + return 'w'; + } + if (NORTH.equals(direction)) { + return 'n'; + } + if (SOUTH.equals(direction)) { + return 's'; + } + if (UP.equals(direction)) { + return 'u'; + } + if (DOWN.equals(direction)) { + return 'd'; + } + return 0; + } + + public String toString() { + return name + " (" + direction + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/AxisOrderPolicy.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/AxisOrderPolicy.java new file mode 100644 index 0000000..55cd7f9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/AxisOrderPolicy.java @@ -0,0 +1,101 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * What to do with the axis order a WKT or PROJJSON document declares. + *

+ * This is the single most dangerous compatibility switch in this package, so it is explicit and + * it is set in code. PROJ 6 and later honour authority axis order, which makes {@code EPSG:4326} + * latitude-first; proj4j is longitude-first throughout, as is GeoJSON. A reader which faithfully + * honoured every {@code AXIS[]} clause would therefore produce latitude-first CRSs and silently + * break every existing proj4j caller — invisibly near the equator and the prime meridian, which + * is exactly where test fixtures tend to live. + *

+ * So the default is {@link #LEGACY} and the declared axes are retained on the + * {@link CrsDefinition} regardless: nothing is discarded, and nothing is silently reordered. The + * policy is applied once, at the boundary where a + * {@link org.locationtech.proj4j.CoordinateReferenceSystem} is built. + *

+ * There is deliberately no system property and no environment variable. Axis + * order has to be a property of the code, not of whoever launched the JVM; a cluster-wide + * environment variable that silently transposes coordinates is precisely the failure mode this + * design exists to prevent. + * + *

Where the policy comes from

+ * + *

{@link org.locationtech.proj4j.api.ProjContext} is now the authoritative holder, and it is the + * only place the policy can be set. {@link org.locationtech.proj4j.api.Proj#createCrs(String, + * org.locationtech.proj4j.api.ProjContext)} reads it from there, and + * {@link org.locationtech.proj4j.api.Crs#withAxisOrderPolicy} re-derives a CRS under a different + * one. Three levels of precedence, all introspectable, are described on {@code ProjContext}; there + * is no fourth. + * + *

The constructors {@link WktReader#WktReader(AxisOrderPolicy)} and + * {@link org.locationtech.proj4j.io.projjson.ProjJsonReader#ProjJsonReader(AxisOrderPolicy)} remain, + * because a caller using the readers directly — to obtain a {@link CrsDefinition} and inspect + * what a document declared, rather than to build a CRS — needs to say what the policy is + * without constructing a context for it. They are the low-level seam; + * {@code ProjContext} is the one an application configures. + * + *

This enum's type stays in this package. It is referenced by {@link WktReader}, + * {@code ProjJsonReader} and {@link CrsDefinitions}, whose signatures are the boundary at which a + * document's declared axes are turned into a CRS — which is where this decision belongs and + * where its javadoc can be read next to the {@code AXIS[]} handling it governs. + * {@code org.locationtech.proj4j.api} re-exports it through + * {@link org.locationtech.proj4j.api.ProjContext#axisOrderPolicy()} rather than defining a second + * enum of the same name, because two same-named policy enums that must be converted between each + * other is exactly how a transposition bug gets introduced by a conversion function. + * + * @see org.locationtech.proj4j.api.ProjContext#axisOrderPolicy() + * @see org.locationtech.proj4j.api.Crs#axisOrder() + * @see org.locationtech.proj4j.api.Crs#isAxisOrderAuthoritative() + */ +public enum AxisOrderPolicy { + + /** + * The default, and proj4j 1.4.3's behaviour exactly: the declared axis order is retained on + * the {@link CrsDefinition} but is not applied, so {@code EPSG:4326} read from WKT takes + * {@code (longitude, latitude)}. An explicit {@code +axis=} in a PROJ string is still + * honoured by the transform engine, as it always was; this policy is only about what a + * document's {@code AXIS[]} clauses do. + */ + LEGACY, + + /** + * PROJ 6+ and {@code cs2cs} semantics: the declared axis order is applied, so a WKT + * definition of {@code EPSG:4326} produces a latitude-first CRS. Adopting this is a silent + * behavioural change for existing callers; do it deliberately and re-baseline fixtures. + * + *

One limitation, reported rather than hidden. "Authority axis order" is database + * metadata, and Proj4J ships no CRS database, so for a CRS created from an + * {@code authority:code} name there is nothing to read. Proj4J then applies the rule that EPSG + * gives every geographic 2D CRS the latitude-then-longitude ellipsoidal coordinate system + * EPSG:6422 — and marks the result as inferred: + * {@link org.locationtech.proj4j.api.Crs#isAxisOrderAuthoritative()} returns {@code false} and + * {@link org.locationtech.proj4j.api.Crs#axisOrderNote()} says which rule was used. A projected + * CRS from a bare code is left east-north-up, likewise marked inferred. A CRS from WKT or + * PROJJSON with {@code AXIS[]} clauses is declared, and is honoured exactly. + */ + AUTHORITY, + + /** + * Unconditionally normalised for visualisation, the equivalent of PROJ's + * {@code proj_normalize_for_visualization}: easting/northing, longitude/latitude, + * up-positive, overriding whatever the document declared. + */ + VISUALISATION +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/ConversionDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/ConversionDefinition.java new file mode 100644 index 0000000..bba6839 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/ConversionDefinition.java @@ -0,0 +1,94 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.List; + +/** + * A map projection: the {@code CONVERSION[]} of a WKT2 {@code PROJCRS}, or the + * {@code PROJECTION[]} plus {@code PARAMETER[]}s of a WKT1 {@code PROJCS}. + */ +public final class ConversionDefinition { + + private String name; + private String methodName; + private Identifier methodId; + private final List parameters = new ArrayList(); + private Identifier id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * The operation method name, as the document spelled it: an EPSG method name in WKT2, a + * GDAL/OGC {@code PROJECTION} name in WKT1, or an ESRI one in ESRI WKT. + */ + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } + + public Identifier getMethodId() { + return methodId; + } + + public void setMethodId(Identifier methodId) { + this.methodId = methodId; + } + + public List getParameters() { + return parameters; + } + + public void addParameter(ParameterDefinition parameter) { + parameters.add(parameter); + } + + /** + * The parameter whose name matches {@code name} ignoring case, spaces and underscores, or + * {@code null}. + */ + public ParameterDefinition getParameter(String name) { + for (int i = 0; i < parameters.size(); i++) { + ParameterDefinition p = parameters.get(i); + if (WktNames.equalsRelaxed(p.getName(), name)) { + return p; + } + } + return null; + } + + public Identifier getId() { + return id; + } + + public void setId(Identifier id) { + this.id = id; + } + + public String toString() { + return methodName + parameters; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/CoordinateSystemDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/CoordinateSystemDefinition.java new file mode 100644 index 0000000..d428138 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/CoordinateSystemDefinition.java @@ -0,0 +1,125 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.List; + +/** + * A coordinate system: its type, its dimension and its axes. + *

+ * WKT1 has no {@code CS[]} element, so one is synthesised from the {@code AXIS[]} clauses and the + * {@code UNIT[]} of the enclosing CRS; a WKT1 CRS with no axes at all gets the conventional + * default (easting/northing for projected, longitude/latitude for geographic), which is what PROJ + * does too. + */ +public final class CoordinateSystemDefinition { + + /** {@code ellipsoidal}, a geographic 2D or 3D CS. */ + public static final String ELLIPSOIDAL = "ellipsoidal"; + /** {@code Cartesian}, note the capital C, as ISO 19162 spells it. */ + public static final String CARTESIAN = "Cartesian"; + public static final String VERTICAL = "vertical"; + public static final String SPHERICAL = "spherical"; + public static final String TEMPORAL = "temporal"; + + private String type; + private final List axes = new ArrayList(); + private UnitDefinition unit; + private int declaredDimension = -1; + + public CoordinateSystemDefinition() { + } + + public CoordinateSystemDefinition(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getAxes() { + return axes; + } + + public void addAxis(AxisDefinition axis) { + axes.add(axis); + } + + /** + * The default unit of the coordinate system, used for axes which declare none. + */ + public UnitDefinition getUnit() { + return unit; + } + + public void setUnit(UnitDefinition unit) { + this.unit = unit; + } + + /** + * The dimension declared by {@code CS[type,dimension]}, or the axis count if none was + * declared. + */ + public int getDimension() { + return declaredDimension > 0 ? declaredDimension : axes.size(); + } + + public void setDeclaredDimension(int dimension) { + this.declaredDimension = dimension; + } + + /** + * The unit of axis {@code index}, falling back to the coordinate system unit. + */ + public UnitDefinition unitOf(int index) { + if (index >= 0 && index < axes.size()) { + UnitDefinition u = axes.get(index).getUnit(); + if (u != null) { + return u; + } + } + return unit; + } + + /** + * Whether the axes are in the order proj4j uses internally: horizontal x (east or west) + * before horizontal y (north or south). True when there are fewer than two axes, since then + * there is nothing to reorder. + */ + public boolean isXBeforeY() { + int x = -1; + int y = -1; + for (int i = 0; i < axes.size(); i++) { + AxisDefinition a = axes.get(i); + if (x < 0 && a.isHorizontalX()) { + x = i; + } else if (y < 0 && a.isHorizontalY()) { + y = i; + } + } + return x < 0 || y < 0 || x < y; + } + + public String toString() { + return type + "[" + getDimension() + "]" + axes; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/CrsDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/CrsDefinition.java new file mode 100644 index 0000000..61d62b5 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/CrsDefinition.java @@ -0,0 +1,339 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.List; + +/** + * A coordinate reference system exactly as a WKT or PROJJSON document described it, before any + * policy has been applied to it. + *

+ * This is the shared spine of this package and of + * {@code org.locationtech.proj4j.io.projjson}: the WKT reader and the PROJJSON reader both + * produce one, and the WKT writer and the PROJJSON writer both consume one. Keeping it separate + * from {@link org.locationtech.proj4j.CoordinateReferenceSystem} is what lets a caller inspect + * the declared axis order, the authority identifiers and the datum anchor — none of which the + * proj4j CRS model can hold — and is what makes writing back what was read possible. + */ +public final class CrsDefinition { + + /** + * What kind of CRS this is. Deliberately a small closed set: these are the kinds this library + * can either build a {@link org.locationtech.proj4j.CoordinateReferenceSystem} from, or + * faithfully round-trip. + */ + public enum Kind { + /** A 2D or 3D geographic CRS: {@code GEOGCRS}, {@code GEOGCS}, WKT2 {@code GEODCRS} with an ellipsoidal CS. */ + GEOGRAPHIC, + /** A geocentric CRS: {@code GEODCRS} with a Cartesian CS. */ + GEOCENTRIC, + /** {@code PROJCRS} / {@code PROJCS}. */ + PROJECTED, + /** {@code VERTCRS} / {@code VERT_CS}. */ + VERTICAL, + /** {@code COMPOUNDCRS} / {@code COMPD_CS}. */ + COMPOUND, + /** {@code BOUNDCRS}: a source CRS plus a transformation to a hub CRS. */ + BOUND, + /** {@code ENGCRS} / {@code LOCAL_CS}. */ + ENGINEERING + } + + private Kind kind; + private String name; + private DatumDefinition datum; + private CoordinateSystemDefinition coordinateSystem; + private CrsDefinition baseCrs; + private ConversionDefinition conversion; + private final List components = new ArrayList(); + private CrsDefinition hubCrs; + private double[] toWgs84; + private final List ids = new ArrayList(); + private String remark; + private String scope; + private String areaDescription; + private double[] boundingBox; + private WktDialect sourceDialect; + private String proj4Extension; + + public Kind getKind() { + return kind; + } + + public void setKind(Kind kind) { + this.kind = kind; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * The geodetic or vertical reference frame. For a projected CRS this is {@code null} and the + * datum is that of {@link #getBaseCrs()}. + */ + public DatumDefinition getDatum() { + return datum; + } + + public void setDatum(DatumDefinition datum) { + this.datum = datum; + } + + /** + * The datum of this CRS or, for a projected or bound CRS, of the CRS it derives from. + * + * @throws WktParseException if the definition graph nests more than + * {@link WktLimits#MAX_CRS_DEPTH} deep. The readers already refuse a + * document that would build such a graph; this bounds the walk for a + * graph a caller assembled by hand, including one that contains + * itself. + */ + public DatumDefinition resolveDatum() { + return resolveDatum(1); + } + + private DatumDefinition resolveDatum(int depth) { + checkDepth(depth); + if (datum != null) { + return datum; + } + if (baseCrs != null) { + return baseCrs.resolveDatum(depth + 1); + } + for (int i = 0; i < components.size(); i++) { + DatumDefinition d = components.get(i).resolveDatum(depth + 1); + if (d != null) { + return d; + } + } + return null; + } + + private static void checkDepth(int depth) { + if (depth > WktLimits.MAX_CRS_DEPTH) { + throw new WktParseException("CRSs nested more than " + WktLimits.MAX_CRS_DEPTH + + " deep; refusing to recurse further"); + } + } + + public CoordinateSystemDefinition getCoordinateSystem() { + return coordinateSystem; + } + + public void setCoordinateSystem(CoordinateSystemDefinition coordinateSystem) { + this.coordinateSystem = coordinateSystem; + } + + /** + * For a projected CRS, the geographic CRS it is derived from. For a bound CRS, the CRS being + * bound. + */ + public CrsDefinition getBaseCrs() { + return baseCrs; + } + + public void setBaseCrs(CrsDefinition baseCrs) { + this.baseCrs = baseCrs; + } + + public ConversionDefinition getConversion() { + return conversion; + } + + public void setConversion(ConversionDefinition conversion) { + this.conversion = conversion; + } + + /** + * The components of a compound CRS, in order. + */ + public List getComponents() { + return components; + } + + public void addComponent(CrsDefinition component) { + components.add(component); + } + + /** + * For a bound CRS, the hub CRS the transformation targets — in practice always WGS 84. + */ + public CrsDefinition getHubCrs() { + return hubCrs; + } + + public void setHubCrs(CrsDefinition hubCrs) { + this.hubCrs = hubCrs; + } + + /** + * The Helmert parameters taking this CRS to WGS 84, in PROJ's {@code +towgs84} order and + * units: three translations in metres, then optionally three rotations in arc-seconds and a + * scale difference in parts per million. Read from WKT1's {@code TOWGS84[]} or from the + * abridged transformation of a {@code BOUNDCRS}. {@code null} when the document declared + * none. + */ + public double[] getToWgs84() { + return toWgs84; + } + + public void setToWgs84(double[] toWgs84) { + this.toWgs84 = toWgs84; + } + + /** + * The Helmert parameters of this CRS or of the CRS it derives from. WKT1 carries + * {@code TOWGS84} inside the {@code DATUM} of the {@code GEOGCS}, so for a {@code PROJCS} the + * parameters live on the base CRS, not on the projected one. + */ + public double[] resolveToWgs84() { + return resolveToWgs84(1); + } + + private double[] resolveToWgs84(int depth) { + checkDepth(depth); + if (toWgs84 != null) { + return toWgs84; + } + if (baseCrs != null) { + return baseCrs.resolveToWgs84(depth + 1); + } + for (int i = 0; i < components.size(); i++) { + double[] t = components.get(i).resolveToWgs84(depth + 1); + if (t != null) { + return t; + } + } + return null; + } + + /** + * Every identifier the document declared, in order. WKT1 allows one {@code AUTHORITY} and + * WKT2 allows several {@code ID}s. + */ + public List getIds() { + return ids; + } + + public void addId(Identifier id) { + ids.add(id); + } + + /** + * The first identifier, or {@code null}. + */ + public Identifier getId() { + return ids.isEmpty() ? null : ids.get(0); + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getAreaDescription() { + return areaDescription; + } + + public void setAreaDescription(String areaDescription) { + this.areaDescription = areaDescription; + } + + /** + * The geographic bounding box as {@code {southLatitude, westLongitude, northLatitude, + * eastLongitude}} in degrees, in WKT2's {@code BBOX[]} order, or {@code null}. + */ + public double[] getBoundingBox() { + return boundingBox; + } + + public void setBoundingBox(double[] boundingBox) { + this.boundingBox = boundingBox; + } + + /** + * Which dialect this definition was read from, or {@code null} if it was not read from WKT. + */ + public WktDialect getSourceDialect() { + return sourceDialect; + } + + public void setSourceDialect(WktDialect sourceDialect) { + this.sourceDialect = sourceDialect; + } + + /** + * The PROJ string carried by a WKT1 {@code EXTENSION["PROJ4",...]} clause, which GDAL emits + * for CRSs WKT1 cannot express. Retained, and used in preference to the reconstructed + * parameters only when the conversion method is otherwise unmappable. + */ + public String getProj4Extension() { + return proj4Extension; + } + + public void setProj4Extension(String proj4Extension) { + this.proj4Extension = proj4Extension; + } + + /** + * The horizontal component of this CRS: itself if it is geographic, geocentric or projected, + * the bound CRS's source, or a compound CRS's first non-vertical component. + */ + public CrsDefinition horizontalComponent() { + return horizontalComponent(1); + } + + private CrsDefinition horizontalComponent(int depth) { + checkDepth(depth); + switch (kind) { + case BOUND: + return baseCrs == null ? null : baseCrs.horizontalComponent(depth + 1); + case COMPOUND: + for (int i = 0; i < components.size(); i++) { + CrsDefinition c = components.get(i).horizontalComponent(depth + 1); + if (c != null) { + return c; + } + } + return null; + case VERTICAL: + return null; + default: + return this; + } + } + + public String toString() { + return kind + "[" + name + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/CrsDefinitions.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/CrsDefinitions.java new file mode 100644 index 0000000..4ccc389 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/CrsDefinitions.java @@ -0,0 +1,426 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.datum.PrimeMeridian; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.units.Unit; +import org.locationtech.proj4j.units.Units; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The bridge between a {@link CrsDefinition} — what a document said — and proj4j's + * {@link CoordinateReferenceSystem} — what this library can transform with. + *

+ * Both directions live here. The forward direction builds a PROJ parameter list and hands it to + * {@link CRSFactory}, which is deliberate: proj4j's CRS model is the PROJ parameter model, + * so going through it means WKT support inherits every projection, datum and unit the existing + * engine already handles, and one shared code path stays tested. It also gives a caller the thing + * they most often actually want, {@link #toProjParameterString}: the PROJ string equivalent to + * their WKT, which is what a hand-rolled WKT-to-PROJ converter was there to produce. + *

+ * What is lost in the forward direction is stated rather than hidden. proj4j has no compound CRS + * and no vertical CRS, so the horizontal component of a compound CRS is what you get and the + * height is not transformed; a vertical-only CRS is refused outright rather than silently + * becoming a horizontal one. + */ +public final class CrsDefinitions { + + private CrsDefinitions() { + } + + /** + * Builds a proj4j CRS from a definition, applying {@code policy} to the declared axis order. + * + * @throws WktParseException if the definition describes something proj4j cannot represent + */ + public static CoordinateReferenceSystem toCrs(CrsDefinition def, AxisOrderPolicy policy) { + String[] params = toProjParameters(def, policy); + String name = def.getName(); + Identifier id = def.getId(); + if (id != null) { + name = id.toString(); + } + return new CRSFactory().createFromParameters(name, params); + } + + /** + * The PROJ parameter list equivalent to a definition, each element in {@code +key=value} form. + * + * @throws WktParseException if the definition describes something proj4j cannot represent + */ + public static String[] toProjParameters(CrsDefinition def, AxisOrderPolicy policy) { + if (def == null) { + throw new WktParseException("CRS definition is null"); + } + if (policy == null) { + policy = AxisOrderPolicy.LEGACY; + } + CrsDefinition horizontal = def.horizontalComponent(); + if (horizontal == null) { + throw new WktParseException("a " + def.getKind() + " CRS has no horizontal component; " + + "proj4j cannot represent \"" + def.getName() + "\""); + } + + List params = new ArrayList(); + boolean sphere = false; + + // 1. the projection itself + if (horizontal.getKind() == CrsDefinition.Kind.PROJECTED) { + ConversionDefinition conv = horizontal.getConversion(); + if (conv == null) { + throw new WktParseException("projected CRS \"" + horizontal.getName() + + "\" has no conversion"); + } + int flags = WktMethods.appendProjection(conv, horizontal, params); + sphere = (flags & WktMethods.FLAG_SPHERE_FROM_A) != 0; + } else if (horizontal.getKind() == CrsDefinition.Kind.GEOCENTRIC) { + params.add("+proj=geocent"); + } else if (horizontal.getKind() == CrsDefinition.Kind.GEOGRAPHIC) { + params.add("+proj=longlat"); + } else { + throw new WktParseException("proj4j cannot represent a " + + horizontal.getKind() + " CRS (\"" + horizontal.getName() + "\")"); + } + + // 2. the datum, or failing that the ellipsoid, plus any Helmert parameters + appendDatum(def, horizontal, params, sphere); + + // 3. the prime meridian + DatumDefinition datum = horizontal.resolveDatum(); + if (datum != null && datum.getPrimeMeridian() != null + && !datum.getPrimeMeridian().isGreenwich()) { + params.add("+pm=" + primeMeridianValue(datum.getPrimeMeridian())); + } + + // 4. the unit of the coordinate system + appendUnits(horizontal, params); + + // 5. the axis order, if the policy says so + appendAxisOrder(horizontal, policy, params); + + params.add("+no_defs"); + return params.toArray(new String[params.size()]); + } + + /** + * The PROJ string equivalent to a definition, as a single space-separated string. Handy for + * logging, for handing to {@link CRSFactory#createFromParameters(String, String)}, and for + * comparing against {@code projinfo} output. + */ + public static String toProjParameterString(CrsDefinition def, AxisOrderPolicy policy) { + String[] params = toProjParameters(def, policy); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < params.length; i++) { + if (i > 0) { + sb.append(' '); + } + sb.append(params[i]); + } + return sb.toString(); + } + + private static void appendDatum(CrsDefinition def, CrsDefinition horizontal, + List params, boolean sphere) { + DatumDefinition datum = horizontal.resolveDatum(); + if (datum == null) { + throw new WktParseException("CRS \"" + horizontal.getName() + "\" has no datum"); + } + EllipsoidDefinition ellipsoid = datum.getEllipsoid(); + double[] toWgs84 = def.resolveToWgs84(); + + if (sphere) { + // A method which projects onto a sphere of the ellipsoid's semi-major axis: EPSG:3857 + // and its ESRI spelling. Emitted as an explicit equal-axis ellipsoid, which is what + // GDAL's own PROJ.4 export of EPSG:3857 does, and never as +datum= — that would + // restore the flattening the method exists to discard. + if (ellipsoid == null) { + throw new WktParseException("a spherical-development method needs an ellipsoid to " + + "take its radius from"); + } + String a = WktFormat.number(ellipsoid.getSemiMajorAxisMetres()); + params.add("+a=" + a); + params.add("+b=" + a); + return; + } + + String datumCode = WktNames.projDatumCode(datum.getName()); + if (datumCode != null && ellipsoidMatchesDatum(datumCode, ellipsoid)) { + // A built-in datum carries its own shift to WGS 84, so +towgs84 is not emitted with + // it: proj4j's DatumParameters lets whichever of the two is set last win, and a + // silently-preferred parameter is how a datum shift goes missing. + params.add("+datum=" + datumCode); + return; + } + + if (ellipsoid == null) { + throw new WktParseException("datum \"" + datum.getName() + + "\" has no ellipsoid and is not a datum proj4j knows by name"); + } + String ellipsoidCode = WktNames.projEllipsoidCode(ellipsoid); + if (ellipsoidCode != null) { + params.add("+ellps=" + ellipsoidCode); + } else { + // Deliberately +a= and +b=, never +rf= or +f=: the semi-minor axis is exact, needs no + // reciprocal, and is unaffected by how a parser interprets a flattening. + double a = ellipsoid.getSemiMajorAxisMetres(); + double rf = WktNames.inverseFlatteningOf(ellipsoid); + double b = rf == 0.0 ? a : a * (1.0 - 1.0 / rf); + params.add("+a=" + WktFormat.number(a)); + params.add("+b=" + WktFormat.number(b)); + } + if (toWgs84 != null) { + StringBuilder sb = new StringBuilder("+towgs84="); + for (int i = 0; i < toWgs84.length; i++) { + if (i > 0) { + sb.append(','); + } + sb.append(WktFormat.number(toWgs84[i])); + } + params.add(sb.toString()); + } + } + + /** + * Whether the ellipsoid a document declared is the one proj4j's built-in datum of that name + * uses. A document naming "WGS_1984" but describing a Bessel ellipsoid is not WGS 84, and + * emitting {@code +datum=WGS84} for it would replace its ellipsoid silently. + */ + private static boolean ellipsoidMatchesDatum(String datumCode, EllipsoidDefinition ellipsoid) { + if (ellipsoid == null) { + return true; + } + Datum datum = findDatum(datumCode); + if (datum == null) { + return false; + } + Ellipsoid e = datum.getEllipsoid(); + if (Math.abs(e.equatorRadius - ellipsoid.getSemiMajorAxisMetres()) > 1e-3) { + return false; + } + double rf = WktNames.inverseFlatteningOf(ellipsoid); + double erf = e.eccentricity2 == 0.0 ? 0.0 : 1.0 / (1.0 - Math.sqrt(1.0 - e.eccentricity2)); + return Math.abs(erf - rf) <= 1e-6; + } + + private static Datum findDatum(String code) { + Datum[] datums = org.locationtech.proj4j.Registry.datums; + for (int i = 0; i < datums.length; i++) { + if (datums[i].getCode().equals(code)) { + return datums[i]; + } + } + return null; + } + + /** + * A {@code +pm=} value: a name proj4j knows, or else the offset in degrees. Never a name + * proj4j does not know, because {@link PrimeMeridian#forName} silently falls back to Greenwich + * for those, which would drop the offset entirely. + */ + private static String primeMeridianValue(PrimeMeridianDefinition pm) { + String name = pm.getName(); + if (name != null) { + // Locale.ROOT: a PrimeMeridian lookup key. Under tr_TR "Lisbon" would lowercase + // with a dotless i, miss forName(), and silently drop the meridian offset. + String lower = name.toLowerCase(Locale.ROOT); + PrimeMeridian known = PrimeMeridian.forName(lower); + if (known != null && lower.equals(known.getName())) { + return lower; + } + } + return WktFormat.number(pm.getLongitudeDegrees()); + } + + private static void appendUnits(CrsDefinition horizontal, List params) { + if (horizontal.getKind() != CrsDefinition.Kind.PROJECTED + && horizontal.getKind() != CrsDefinition.Kind.GEOCENTRIC) { + // A geographic CRS is always degrees in proj4j; LongLatProjection.initialize() sets + // that unconditionally, so saying so again would be noise. + return; + } + CoordinateSystemDefinition cs = horizontal.getCoordinateSystem(); + UnitDefinition unit = cs == null ? null : cs.unitOf(0); + if (unit == null || unit.getType() != UnitDefinition.LINEAR) { + return; + } + String code = WktNames.projUnitsCode(unit); + if (code != null) { + params.add("+units=" + code); + } else { + params.add("+to_meter=" + WktFormat.number(unit.getConversionFactor())); + } + } + + private static void appendAxisOrder(CrsDefinition horizontal, AxisOrderPolicy policy, + List params) { + if (policy != AxisOrderPolicy.AUTHORITY) { + // LEGACY ignores the declared order; VISUALISATION forces east/north/up, which is + // proj4j's default and therefore also nothing to emit. + return; + } + CoordinateSystemDefinition cs = horizontal.getCoordinateSystem(); + if (cs == null || cs.getAxes().size() < 2 || cs.isXBeforeY()) { + return; + } + List axes = cs.getAxes(); + StringBuilder sb = new StringBuilder(3); + for (int i = 0; i < axes.size() && i < 3; i++) { + char c = axes.get(i).toProjAxisChar(); + if (c == 0) { + throw new WktParseException("axis \"" + axes.get(i).getName() + "\" has direction " + + axes.get(i).getDirection() + ", which cannot be expressed as +axis=; " + + "AxisOrderPolicy.AUTHORITY cannot honour this CRS"); + } + sb.append(c); + } + while (sb.length() < 3) { + sb.append('u'); + } + params.add("+axis=" + sb); + } + + // ------------------------------------------------------------------- reverse + + /** + * Describes an existing proj4j CRS as a definition, so that it can be written as WKT or + * PROJJSON. + *

+ * What a proj4j CRS does not carry, this cannot invent: there are no authority identifiers, no + * area of use and no axis names, so the result is the minimum faithful description of the + * projection, datum, ellipsoid and units. Round-tripping a definition that came from + * {@link WktReader} keeps everything, because the definition itself is retained; this method + * is for CRSs built from a PROJ string or from {@code CRSFactory.createFromName}. + * + * @throws WktParseException if the CRS uses a projection with no known WKT method + */ + public static CrsDefinition fromCrs(CoordinateReferenceSystem crs) { + if (crs == null) { + throw new WktParseException("CRS is null"); + } + Projection proj = crs.getProjection(); + if (proj == null) { + throw new WktParseException("CRS \"" + crs.getName() + "\" has no projection"); + } + Datum datum = crs.getDatum(); + + DatumDefinition datumDef = new DatumDefinition(); + datumDef.setName(WktNames.wktDatumName(datum)); + datumDef.setEllipsoid(WktNames.definitionOf(proj.getEllipsoid())); + PrimeMeridianDefinition pm = new PrimeMeridianDefinition(); + PrimeMeridian projPm = proj.getPrimeMeridian(); + if (projPm == null || "greenwich".equals(projPm.getName())) { + pm = PrimeMeridianDefinition.greenwich(); + } else { + pm.setName(capitalise(projPm.getName())); + pm.setUnit(UnitDefinition.DEGREE); + pm.setLongitude(ProjectionMath.toDeg(offsetFromGreenwichRadians(projPm))); + } + datumDef.setPrimeMeridian(pm); + + boolean geographic = Boolean.TRUE.equals(proj.isGeographic()); + + CrsDefinition base = new CrsDefinition(); + base.setKind(CrsDefinition.Kind.GEOGRAPHIC); + base.setName(geographicNameFor(datumDef.getName())); + base.setDatum(datumDef); + CoordinateSystemDefinition baseCs = + new CoordinateSystemDefinition(CoordinateSystemDefinition.ELLIPSOIDAL); + baseCs.setUnit(UnitDefinition.DEGREE); + baseCs.addAxis(new AxisDefinition("geodetic longitude", "Lon", AxisDefinition.EAST, + UnitDefinition.DEGREE)); + baseCs.addAxis(new AxisDefinition("geodetic latitude", "Lat", AxisDefinition.NORTH, + UnitDefinition.DEGREE)); + base.setCoordinateSystem(baseCs); + + if (datum != null && datum.getTransformType() == Datum.TYPE_3PARAM + || datum != null && datum.getTransformType() == Datum.TYPE_7PARAM) { + base.setToWgs84(datum.getTransformToWGS84()); + } + + if (geographic) { + return base; + } + + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.PROJECTED); + def.setName(crs.getName() != null ? crs.getName() : proj.getName()); + def.setBaseCrs(base); + def.setConversion(WktMethods.conversionOf(proj)); + + UnitDefinition linear = linearUnitOf(proj); + CoordinateSystemDefinition cs = + new CoordinateSystemDefinition(CoordinateSystemDefinition.CARTESIAN); + cs.setUnit(linear); + cs.addAxis(new AxisDefinition("easting", "E", AxisDefinition.EAST, linear)); + cs.addAxis(new AxisDefinition("northing", "N", AxisDefinition.NORTH, linear)); + def.setCoordinateSystem(cs); + return def; + } + + /** + * The offset of a prime meridian from Greenwich, in radians. + *

+ * {@link PrimeMeridian} has no accessor for it, so it is read the only way the class allows: + * by shifting a zero coordinate. The call mutates the scratch coordinate and nothing else. + */ + private static double offsetFromGreenwichRadians(PrimeMeridian pm) { + org.locationtech.proj4j.ProjCoordinate probe = new org.locationtech.proj4j.ProjCoordinate( + 0.0, 0.0); + pm.toGreenwich(probe); + return probe.x; + } + + private static UnitDefinition linearUnitOf(Projection proj) { + Unit unit = proj.getUnits(); + if (unit == null || unit == Units.DEGREES) { + return UnitDefinition.METRE; + } + UnitDefinition u = WktNames.unitFromProjCode(unit.abbreviation); + return u != null ? u : new UnitDefinition(unit.name, unit.value, UnitDefinition.LINEAR); + } + + private static String geographicNameFor(String datumName) { + if (datumName == null) { + return "unknown"; + } + if (datumName.startsWith("World Geodetic System 1984")) { + return "WGS 84"; + } + if (datumName.startsWith("North American Datum 1983")) { + return "NAD83"; + } + if (datumName.startsWith("North American Datum 1927")) { + return "NAD27"; + } + return datumName; + } + + private static String capitalise(String s) { + if (s == null || s.isEmpty()) { + return s; + } + return Character.toUpperCase(s.charAt(0)) + s.substring(1); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/DatumDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/DatumDefinition.java new file mode 100644 index 0000000..028dc77 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/DatumDefinition.java @@ -0,0 +1,94 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * A geodetic or vertical reference frame: a name, and for a geodetic frame an ellipsoid and a + * prime meridian. + *

+ * WKT2 spells the prime meridian as a sibling of {@code DATUM[]} inside the CRS while WKT1 nests + * it there too, but PROJJSON nests it inside the datum. It is held here, on the datum, in all + * three cases. + */ +public final class DatumDefinition { + + private String name; + private EllipsoidDefinition ellipsoid; + private PrimeMeridianDefinition primeMeridian; + private Identifier id; + private String anchor; + private double frameEpoch = Double.NaN; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public EllipsoidDefinition getEllipsoid() { + return ellipsoid; + } + + public void setEllipsoid(EllipsoidDefinition ellipsoid) { + this.ellipsoid = ellipsoid; + } + + public PrimeMeridianDefinition getPrimeMeridian() { + return primeMeridian; + } + + public void setPrimeMeridian(PrimeMeridianDefinition primeMeridian) { + this.primeMeridian = primeMeridian; + } + + public Identifier getId() { + return id; + } + + public void setId(Identifier id) { + this.id = id; + } + + public String getAnchor() { + return anchor; + } + + public void setAnchor(String anchor) { + this.anchor = anchor; + } + + /** + * The reference epoch of a dynamic reference frame, or {@code NaN} for a static one. Retained + * for round-tripping only; proj4j has no time dimension. + */ + public double getFrameEpoch() { + return frameEpoch; + } + + public void setFrameEpoch(double frameEpoch) { + this.frameEpoch = frameEpoch; + } + + public boolean isDynamic() { + return !Double.isNaN(frameEpoch); + } + + public String toString() { + return String.valueOf(name); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/EllipsoidDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/EllipsoidDefinition.java new file mode 100644 index 0000000..41cc785 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/EllipsoidDefinition.java @@ -0,0 +1,111 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * An ellipsoid as a document declares it: a semi-major axis in some linear unit, plus either an + * inverse flattening or a semi-minor axis. + *

+ * A sphere is spelled by upstream in two ways, both accepted here: an inverse flattening of 0, or + * PROJJSON's {@code radius} member. + */ +public final class EllipsoidDefinition { + + private String name; + private double semiMajorAxis = Double.NaN; + private double inverseFlattening = Double.NaN; + private double semiMinorAxis = Double.NaN; + private UnitDefinition unit = UnitDefinition.METRE; + private Identifier id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * The semi-major axis, in {@link #getUnit()}. + */ + public double getSemiMajorAxis() { + return semiMajorAxis; + } + + public void setSemiMajorAxis(double semiMajorAxis) { + this.semiMajorAxis = semiMajorAxis; + } + + /** + * The semi-major axis converted to metres. + */ + public double getSemiMajorAxisMetres() { + return unit == null ? semiMajorAxis : unit.toBase(semiMajorAxis); + } + + /** + * The inverse flattening, or {@code NaN} if the document declared a semi-minor axis instead. + * Zero means a sphere. + */ + public double getInverseFlattening() { + return inverseFlattening; + } + + public void setInverseFlattening(double inverseFlattening) { + this.inverseFlattening = inverseFlattening; + } + + /** + * The semi-minor axis in {@link #getUnit()}, or {@code NaN} if an inverse flattening was + * declared instead. + */ + public double getSemiMinorAxis() { + return semiMinorAxis; + } + + public void setSemiMinorAxis(double semiMinorAxis) { + this.semiMinorAxis = semiMinorAxis; + } + + public UnitDefinition getUnit() { + return unit; + } + + public void setUnit(UnitDefinition unit) { + this.unit = unit; + } + + public Identifier getId() { + return id; + } + + public void setId(Identifier id) { + this.id = id; + } + + public boolean isSphere() { + if (!Double.isNaN(inverseFlattening) && inverseFlattening == 0.0) { + return true; + } + return !Double.isNaN(semiMinorAxis) && semiMinorAxis == semiMajorAxis; + } + + public String toString() { + return name + "(a=" + semiMajorAxis + (Double.isNaN(inverseFlattening) + ? ",b=" + semiMinorAxis : ",rf=" + inverseFlattening) + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/Identifier.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/Identifier.java new file mode 100644 index 0000000..2701983 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/Identifier.java @@ -0,0 +1,63 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * An authority name and code, as carried by WKT2's {@code ID[]}, WKT1's {@code AUTHORITY[]} and + * PROJJSON's {@code id} member. + */ +public final class Identifier { + + private final String authority; + private final String code; + + public Identifier(String authority, String code) { + this.authority = authority; + this.code = code; + } + + public String getAuthority() { + return authority; + } + + public String getCode() { + return code; + } + + /** + * {@code authority:code}, the form {@code CRSFactory.createFromName} accepts. + */ + public String toString() { + return authority + ":" + code; + } + + public boolean equals(Object o) { + if (!(o instanceof Identifier)) { + return false; + } + Identifier that = (Identifier) o; + return eq(authority, that.authority) && eq(code, that.code); + } + + public int hashCode() { + return (authority == null ? 0 : authority.hashCode()) * 31 + + (code == null ? 0 : code.hashCode()); + } + + private static boolean eq(String a, String b) { + return a == null ? b == null : a.equals(b); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/ParameterDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/ParameterDefinition.java new file mode 100644 index 0000000..8f9f854 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/ParameterDefinition.java @@ -0,0 +1,113 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * One operation parameter: a name, a value, and the unit the value is expressed in. + *

+ * WKT1's {@code PARAMETER["false_easting",500000]} carries no unit and is interpreted in the + * CRS's own linear or angular unit, which is why the unit is resolved when the parameter is read + * rather than when it is used. + */ +public final class ParameterDefinition { + + private String name; + private double value; + private UnitDefinition unit; + private Identifier id; + + public ParameterDefinition() { + } + + public ParameterDefinition(String name, double value, UnitDefinition unit) { + this.name = name; + this.value = value; + this.unit = unit; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * The value in {@link #getUnit()}. + */ + public double getValue() { + return value; + } + + public void setValue(double value) { + this.value = value; + } + + public UnitDefinition getUnit() { + return unit; + } + + public void setUnit(UnitDefinition unit) { + this.unit = unit; + } + + public Identifier getId() { + return id; + } + + public void setId(Identifier id) { + this.id = id; + } + + /** + * The value in degrees, for an angular parameter. + */ + public double getValueDegrees() { + if (unit == null || unit.getType() != UnitDefinition.ANGULAR) { + return value; + } + // Scaled by the ratio of the two factors rather than through radians, so that a value + // already in degrees comes back bit-for-bit: 3 must stay 3, not become 3.0000000000000004. + double ratio = unit.getConversionFactor() / UnitDefinition.DEGREE.getConversionFactor(); + return ratio == 1.0 ? value : value * ratio; + } + + /** + * The value in metres, for a linear parameter. + */ + public double getValueMetres() { + if (unit == null || unit.getType() != UnitDefinition.LINEAR) { + return value; + } + return unit.toBase(value); + } + + /** + * The value with no unit applied, for a scale or dimensionless parameter. A scale unit which + * is not unity (parts per million, say) is applied. + */ + public double getValueScale() { + if (unit == null || unit.getType() != UnitDefinition.SCALE) { + return value; + } + return unit.toBase(value); + } + + public String toString() { + return name + "=" + value + (unit == null ? "" : " " + unit.getName()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/PrimeMeridianDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/PrimeMeridianDefinition.java new file mode 100644 index 0000000..d4b100d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/PrimeMeridianDefinition.java @@ -0,0 +1,95 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * A prime meridian: a name and a longitude relative to Greenwich. + *

+ * The unit matters and is a classic source of error: WKT1's {@code PRIMEM} value is in degrees + * even when the enclosing {@code GEOGCS} declares grads, whereas WKT2's {@code PRIMEM} takes its + * unit from its own {@code ANGLEUNIT} or, absent that, from the CRS's angular unit. + */ +public final class PrimeMeridianDefinition { + + /** Greenwich, longitude 0. */ + public static PrimeMeridianDefinition greenwich() { + PrimeMeridianDefinition pm = new PrimeMeridianDefinition(); + pm.setName("Greenwich"); + pm.setLongitude(0); + pm.setUnit(UnitDefinition.DEGREE); + pm.setId(new Identifier("EPSG", "8901")); + return pm; + } + + private String name; + private double longitude; + private UnitDefinition unit = UnitDefinition.DEGREE; + private Identifier id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * The longitude in {@link #getUnit()}. + */ + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + /** + * The longitude converted to degrees, which is what PROJ's {@code +pm=} takes. + */ + public double getLongitudeDegrees() { + if (unit == null) { + return longitude; + } + double ratio = unit.getConversionFactor() / UnitDefinition.DEGREE.getConversionFactor(); + return ratio == 1.0 ? longitude : longitude * ratio; + } + + public UnitDefinition getUnit() { + return unit; + } + + public void setUnit(UnitDefinition unit) { + this.unit = unit; + } + + public Identifier getId() { + return id; + } + + public void setId(Identifier id) { + this.id = id; + } + + public boolean isGreenwich() { + return getLongitudeDegrees() == 0.0; + } + + public String toString() { + return name + "(" + longitude + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/UnitDefinition.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/UnitDefinition.java new file mode 100644 index 0000000..3ab640d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/UnitDefinition.java @@ -0,0 +1,124 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * A unit of measure: a name, a conversion factor to the unit's base SI unit, and a type. + *

+ * The conversion factor is what WKT carries and is authoritative here — a + * {@code UNIT["Foot_US",0.304800609601219]} is honoured by its factor even if the name is + * unfamiliar, which is what makes ESRI WKT usable. Named constants match PROJ's + * {@code UnitOfMeasure} constants (9.8.1 {@code src/iso19111/common.cpp}). + */ +public final class UnitDefinition { + + public static final int ANGULAR = 0; + public static final int LINEAR = 1; + public static final int SCALE = 2; + public static final int TIME = 3; + public static final int PARAMETRIC = 4; + + /** radian, factor 1. */ + public static final UnitDefinition RADIAN = + new UnitDefinition("radian", 1.0, ANGULAR, new Identifier("EPSG", "9101")); + /** degree, factor pi/180. */ + public static final UnitDefinition DEGREE = + new UnitDefinition("degree", Math.PI / 180.0, ANGULAR, new Identifier("EPSG", "9122")); + /** arc-second, factor pi/648000. */ + public static final UnitDefinition ARC_SECOND = + new UnitDefinition("arc-second", Math.PI / 648000.0, ANGULAR, + new Identifier("EPSG", "9104")); + /** grad, factor pi/200. */ + public static final UnitDefinition GRAD = + new UnitDefinition("grad", Math.PI / 200.0, ANGULAR, new Identifier("EPSG", "9105")); + /** metre, factor 1. */ + public static final UnitDefinition METRE = + new UnitDefinition("metre", 1.0, LINEAR, new Identifier("EPSG", "9001")); + /** international foot, factor 0.3048. */ + public static final UnitDefinition FOOT = + new UnitDefinition("foot", 0.3048, LINEAR, new Identifier("EPSG", "9002")); + /** US survey foot, factor 12/39.37. */ + public static final UnitDefinition US_SURVEY_FOOT = + new UnitDefinition("US survey foot", 12.0 / 39.37, LINEAR, + new Identifier("EPSG", "9003")); + /** unity, the scale unit, factor 1. */ + public static final UnitDefinition UNITY = + new UnitDefinition("unity", 1.0, SCALE, new Identifier("EPSG", "9201")); + /** parts per million, factor 1e-6. */ + public static final UnitDefinition PPM = + new UnitDefinition("parts per million", 1e-6, SCALE, new Identifier("EPSG", "9202")); + /** year, the temporal unit used by dynamic datum frame epochs. */ + public static final UnitDefinition YEAR = + new UnitDefinition("year", 31556925.445, TIME, new Identifier("EPSG", "1029")); + + private final String name; + private final double conversionFactor; + private final int type; + private final Identifier id; + + public UnitDefinition(String name, double conversionFactor, int type) { + this(name, conversionFactor, type, null); + } + + public UnitDefinition(String name, double conversionFactor, int type, Identifier id) { + this.name = name; + this.conversionFactor = conversionFactor; + this.type = type; + this.id = id; + } + + public String getName() { + return name; + } + + /** + * The factor which converts a value in this unit to the base unit: radians for + * {@link #ANGULAR}, metres for {@link #LINEAR}, unity for {@link #SCALE}. + */ + public double getConversionFactor() { + return conversionFactor; + } + + /** + * One of {@link #ANGULAR}, {@link #LINEAR}, {@link #SCALE}, {@link #TIME}, + * {@link #PARAMETRIC}. + */ + public int getType() { + return type; + } + + public Identifier getId() { + return id; + } + + /** + * Converts {@code value}, expressed in this unit, to the base unit. + */ + public double toBase(double value) { + return value * conversionFactor; + } + + /** + * Converts {@code value}, expressed in the base unit, to this unit. + */ + public double fromBase(double value) { + return value / conversionFactor; + } + + public String toString() { + return name + "(" + conversionFactor + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktDialect.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktDialect.java new file mode 100644 index 0000000..e141b11 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktDialect.java @@ -0,0 +1,192 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * The WKT flavours this package reads, and the flavours it writes. + *

+ * The distinction that matters in practice is {@link #WKT1_GDAL} versus {@link #WKT1_ESRI}: they + * share a grammar but not a vocabulary. ESRI omits {@code AUTHORITY}, prefixes datum names with + * {@code D_} and geographic CRS names with {@code GCS_}, spells the projection method and its + * parameters differently ({@code Stereographic_North_Pole} rather than {@code Polar_Stereographic}, + * {@code Central_Meridian} rather than {@code central_meridian}), writes {@code Degree} rather than + * {@code degree}, and collapses several EPSG methods into one name to be disambiguated by which + * parameters are present. A reader which assumed one dialect would mis-read the other, so both + * vocabularies are always consulted; the detected dialect decides only the few genuinely ambiguous + * cases. + */ +public enum WktDialect { + + /** ISO 19162:2019, the current WKT2 revision. Written by {@link WktWriter} by default. */ + WKT2_2019, + + /** ISO 19162:2015, the first WKT2 revision. */ + WKT2_2015, + + /** WKT1 as OGC 01-009 defines it and as GDAL and PROJ emit it. */ + WKT1_GDAL, + + /** WKT1 as ESRI's ArcGIS products emit it. */ + WKT1_ESRI; + + public boolean isWkt1() { + return this == WKT1_GDAL || this == WKT1_ESRI; + } + + public boolean isWkt2() { + return this == WKT2_2019 || this == WKT2_2015; + } + + /** + * Every keyword PROJ's WKT parser recognises, in its registration order. + *

+ * Ported from {@code WKTConstants} (9.8.1 {@code src/iso19111/static.cpp} and + * {@code include/proj/internal/io_internal.hpp}), 105 keywords. The order is load-bearing: + * {@link #guess} falls back to returning {@link #WKT2_2015} for the first keyword the string + * starts with. + */ + static final String[] KEYWORDS = { + // WKT1 + "GEOCCS", "GEOGCS", "DATUM", "UNIT", "SPHEROID", "AXIS", "PRIMEM", "AUTHORITY", + "PROJCS", "PROJECTION", "PARAMETER", "VERT_CS", "VERTCS", "VERT_DATUM", "COMPD_CS", + "TOWGS84", "EXTENSION", "LOCAL_CS", "LOCAL_DATUM", "LINUNIT", + // WKT2, preferred keywords + "GEODCRS", "LENGTHUNIT", "ANGLEUNIT", "SCALEUNIT", "TIMEUNIT", "ELLIPSOID", "CS", "ID", + "PROJCRS", "BASEGEODCRS", "MERIDIAN", "ORDER", "ANCHOR", "ANCHOREPOCH", "CONVERSION", + "METHOD", "REMARK", "GEOGCRS", "BASEGEOGCRS", "SCOPE", "AREA", "BBOX", "CITATION", + "URI", "VERTCRS", "VDATUM", "COMPOUNDCRS", "PARAMETERFILE", "COORDINATEOPERATION", + "SOURCECRS", "TARGETCRS", "INTERPOLATIONCRS", "OPERATIONACCURACY", + "CONCATENATEDOPERATION", "STEP", "BOUNDCRS", "ABRIDGEDTRANSFORMATION", + "DERIVINGCONVERSION", "TDATUM", "CALENDAR", "TIMEORIGIN", "TIMECRS", "VERTICALEXTENT", + "TIMEEXTENT", "USAGE", "DYNAMIC", "FRAMEEPOCH", "MODEL", "VELOCITYGRID", "ENSEMBLE", + "MEMBER", "ENSEMBLEACCURACY", "DERIVEDPROJCRS", "BASEPROJCRS", "EDATUM", "ENGCRS", + "PDATUM", "PARAMETRICCRS", "PARAMETRICUNIT", "BASEVERTCRS", "BASEENGCRS", + "BASEPARAMCRS", "BASETIMECRS", "VERSION", "GEOIDMODEL", "COORDINATEMETADATA", "EPOCH", + "AXISMINVALUE", "AXISMAXVALUE", "RANGEMEANING", "POINTMOTIONOPERATION", + // WKT2, alternate keywords + "GEODETICCRS", "GEODETICDATUM", "PROJECTEDCRS", "PRIMEMERIDIAN", "GEOGRAPHICCRS", + "TRF", "VERTICALCRS", "VERTICALDATUM", "VRF", "TIMEDATUM", "TEMPORALQUANTITY", + "ENGINEERINGDATUM", "ENGINEERINGCRS", "PARAMETRICDATUM", + }; + + private static final String[] WKT1_ROOTS = { + "GEOCCS", "GEOGCS", "COMPD_CS", "PROJCS", "VERT_CS", "LOCAL_CS", + }; + + private static final String[] WKT2_2019_ONLY = { + "GEOGCRS", "CONCATENATEDOPERATION", "USAGE", "DYNAMIC", "FRAMEEPOCH", "MODEL", + "VELOCITYGRID", "ENSEMBLE", "DERIVEDPROJCRS", "BASEPROJCRS", "GEOGRAPHICCRS", "TRF", + "VRF", "POINTMOTIONOPERATION", + }; + + private static final String[] WKT2_2019_SUBSTRINGS = { + "CS[TemporalDateTime,", "CS[TemporalCount,", "CS[TemporalMeasure,", + }; + + /** + * Guesses which dialect a WKT string is written in. + *

+ * A faithful port of PROJ's {@code WKTParser::guessDialect} (9.8.1 + * {@code src/iso19111/io.cpp}), including its two carve-outs, both of which exist because of + * real-world files: + *

    + *
  • A leading {@code VERTCS} is always ESRI.
  • + *
  • A WKT1 string with no {@code AXIS[} and no {@code AUTHORITY[} is taken for ESRI — unless + * it contains {@code PARAMETER["rectified_grid_angle}, because + * {@code Hotine_Oblique_Mercator_Azimuth_Center} exists in both dialects and GDAL WKT1 without + * axes would otherwise be misread, silently dropping that parameter (PROJ issue #3279).
  • + *
+ * + * @throws WktParseException if the string is not WKT at all + */ + public static WktDialect guess(String wkt) { + if (wkt == null) { + throw new WktParseException("WKT text is null"); + } + String s = stripLeadingWhitespace(wkt); + if (startsWithIgnoreCase(s, "VERTCS")) { + return WKT1_ESRI; + } + for (int i = 0; i < WKT1_ROOTS.length; i++) { + if (startsWithIgnoreCase(s, WKT1_ROOTS[i])) { + boolean looksEsri = containsIgnoreCase(s, "GEOGCS[\"GCS_") + || (!startsWithIgnoreCase(s, "LOCAL_CS") + && !containsIgnoreCase(s, "AXIS[") + && !containsIgnoreCase(s, "AUTHORITY[")); + if (looksEsri && !containsIgnoreCase(s, "PARAMETER[\"rectified_grid_angle")) { + return WKT1_ESRI; + } + return WKT1_GDAL; + } + } + for (int i = 0; i < WKT2_2019_ONLY.length; i++) { + int pos = indexOfIgnoreCase(s, WKT2_2019_ONLY[i]); + if (pos >= 0) { + int after = pos + WKT2_2019_ONLY[i].length(); + if (after < s.length() && s.charAt(after) == '[') { + return WKT2_2019; + } + } + } + for (int i = 0; i < WKT2_2019_SUBSTRINGS.length; i++) { + if (containsIgnoreCase(s, WKT2_2019_SUBSTRINGS[i])) { + return WKT2_2019; + } + } + for (int i = 0; i < KEYWORDS.length; i++) { + if (startsWithIgnoreCase(s, KEYWORDS[i])) { + for (int j = KEYWORDS[i].length(); j < s.length(); j++) { + char c = s.charAt(j); + if (Character.isWhitespace(c)) { + continue; + } + if (c == '[' || c == '(') { + return WKT2_2015; + } + break; + } + } + } + throw new WktParseException("not a WKT string: \"" + + s.substring(0, Math.min(40, s.length())) + "\""); + } + + private static String stripLeadingWhitespace(String s) { + int i = 0; + while (i < s.length() && Character.isWhitespace(s.charAt(i))) { + i++; + } + return i == 0 ? s : s.substring(i); + } + + private static boolean startsWithIgnoreCase(String s, String prefix) { + return s.regionMatches(true, 0, prefix, 0, prefix.length()); + } + + private static boolean containsIgnoreCase(String s, String needle) { + return indexOfIgnoreCase(s, needle) >= 0; + } + + private static int indexOfIgnoreCase(String s, String needle) { + int last = s.length() - needle.length(); + for (int i = 0; i <= last; i++) { + if (s.regionMatches(true, i, needle, 0, needle.length())) { + return i; + } + } + return -1; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktFormat.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktFormat.java new file mode 100644 index 0000000..750abdc --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktFormat.java @@ -0,0 +1,102 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; + +/** + * Serialisation helpers shared by the WKT and PROJJSON writers: how a {@code double} is spelled, + * and how a {@link WktNode} tree becomes text. + */ +final class WktFormat { + + private WktFormat() { + } + + /** + * Formats a number the way PROJ's WKT exporter does: integral values without a decimal point, + * everything else with the shortest representation that round-trips, and never in a form Java + * would print but WKT cannot express ({@code 1.0E-5}, {@code NaN}, {@code Infinity}). + */ + static String number(double v) { + if (Double.isNaN(v) || Double.isInfinite(v)) { + throw new WktParseException("cannot write the non-finite value " + v + " as WKT"); + } + if (v == Math.rint(v) && Math.abs(v) < 1e15) { + return Long.toString((long) v); + } + // Fifteen significant digits, no exponent, no trailing zeros — which is what PROJ emits, + // and why its WKT says ANGLEUNIT["degree",0.0174532925199433] rather than Java's + // seventeen-digit 0.017453292519943295. Byte equality with upstream depends on this. + BigDecimal bd = new BigDecimal(v, SIGNIFICANT_15).stripTrailingZeros(); + return bd.toPlainString(); + } + + private static final MathContext SIGNIFICANT_15 = new MathContext(15, RoundingMode.HALF_UP); + + /** + * Appends {@code node} to {@code sb}. When {@code indent} is null the output is a single + * line with no spaces after commas, exactly as PROJ's non-multiline WKT export. + *

+ * The writer recurses too, so it is bounded too: {@link WktNode#of} is public, a caller can + * hand this method a tree of any depth, and {@link WktNode#toString()} reaches it. {@code depth} + * is the node's indentation level with the root at 0, one less than {@link WktParser}'s + * convention, so {@code depth >= MAX_DEPTH} here refuses exactly the trees the parser refuses — + * a document that parsed can always be written back. + * + * @throws WktParseException if the tree is nested deeper than {@link WktLimits#MAX_DEPTH} + */ + static void append(WktNode node, StringBuilder sb, String indent, int depth) { + if (depth >= WktLimits.MAX_DEPTH) { + throw new WktParseException("WKT tree nested more than " + WktLimits.MAX_DEPTH + + " deep; refusing to recurse further"); + } + if (node.isLeaf()) { + if (node.isQuoted()) { + sb.append('"'); + String v = node.value(); + for (int i = 0; i < v.length(); i++) { + char c = v.charAt(i); + if (c == '"') { + sb.append('"'); + } + sb.append(c); + } + sb.append('"'); + } else { + sb.append(node.value()); + } + return; + } + sb.append(node.keyword()).append('['); + for (int i = 0; i < node.childCount(); i++) { + if (i > 0) { + sb.append(','); + } + WktNode c = node.child(i); + if (indent != null && !c.isLeaf()) { + sb.append('\n'); + for (int d = 0; d <= depth; d++) { + sb.append(indent); + } + } + append(c, sb, indent, depth + 1); + } + sb.append(']'); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktLimits.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktLimits.java new file mode 100644 index 0000000..f634010 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktLimits.java @@ -0,0 +1,85 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +/** + * Nesting limits for the WKT reader and writer. + *

+ * Both grammars here are recursive descent, at roughly two bytes of input per stack frame, and the + * document is untrusted: a consumer calls this library per row with CRS strings supplied by the + * caller. Unbounded recursion is therefore a denial of service that arrives as a + * {@link StackOverflowError} — an {@code Error}, so it escapes every {@code catch} in this library + * and can leave a shared, cached {@code CoordinateTransform} half-built. The limits below make it + * unreachable rather than catchable; nothing in {@code core/src/main} catches {@code Error}, by + * design. + *

+ * Measured, on JDK 21 with the default stack: {@code A[A[...b...]]} overflows at a bracket nesting + * of about 6,150, from about 12 KB of input; with {@code -Xss256k} it overflows at about + * 390, from under 800 bytes. + *

+ * This mirrors {@code pipeline.PipelineJson}'s {@code MAX_DEPTH = 64}, which has guarded the + * trusted classpath deformation models since 1.5 while the untrusted readers had no limit + * at all. + *

+ * Package-private: these are an implementation invariant, not API. The numbers are pinned by + * {@code security.parsers.WktDepthLimitTest} and cross-checked against + * {@code io.projjson.JsonLimits} there, so the two formats cannot drift apart unnoticed. + * + * @since 1.5 + */ +final class WktLimits { + + /** + * Maximum syntactic nesting: the depth of the {@link WktNode} tree, counting the root + * element as 1 and counting leaves. Enforced by {@link WktParser} on the way in and by + * {@link WktFormat} on the way out, so a tree that parsed can always be written back. + *

+ * Measured over the whole of the shipped {@code proj4/wkt/epsg.properties} — all 5,671 + * definitions, of which 72 are {@code COMPD_CS} — the deepest real tree is 7 on the way + * in and 8 on the way out: + * + * + * + * + * + * + *
deepest real document, by direction
WKT1 read7{@code EPSG:4100} "ETRS89 / DKTM4 + DVR90 height"
WKT2:2019 written8{@code EPSG:4100}
WKT2:2015 written8
+ * The output is one deeper than the input because WKT2 wraps the projected CRS's base in + * {@code BASEGEOGCRS}. 64 is eight times the deepest document this library either accepts or + * emits; {@code security.parsers.RealCorpusDepthHeadroomTest} pins all three numbers. + */ + static final int MAX_DEPTH = 64; + + /** + * Maximum semantic nesting: how many coordinate reference systems may be nested inside + * one another, counting the outermost as 1. A {@code COMPOUNDCRS} inside a {@code COMPOUNDCRS} + * is 2; a {@code BOUNDCRS[SOURCECRS[COMPOUNDCRS[…]]]} is 3. + *

+ * The deepest real value is 3, not 2: over the 5,671 shipped definitions the histogram + * is 1,240 at depth 1, 4,367 at depth 2 and 64 at depth 3 — the last being + * {@code COMPD_CS[PROJCS[GEOGCS[…]]]}, where a projected CRS's base geographic CRS is a third + * nested CRS in its own right. 24 is eight times that. + *

+ * Deliberately well below {@link #MAX_DEPTH}: a semantic limit equal to the syntactic one could + * never fire, because every semantic level costs at least one bracket, and a guard that cannot + * fire is not a guard. + */ + static final int MAX_CRS_DEPTH = 24; + + private WktLimits() { + throw new AssertionError("no instances"); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktMethods.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktMethods.java new file mode 100644 index 0000000..9801eb9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktMethods.java @@ -0,0 +1,1035 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The vocabulary of map projections: which PROJ {@code +proj=} a WKT operation method denotes, and + * which {@code +param=} each of its parameters denotes, in the EPSG/WKT2, WKT1/GDAL and ESRI + * spellings. + *

+ * Ported from PROJ's own tables at 9.8.1 — {@code src/iso19111/operation/parammappings.cpp}, + * {@code esriparammappings.cpp}, and the special cases in {@code io.cpp} and + * {@code conversion.cpp}. Three properties of that design are reproduced deliberately: + *

    + *
  • Names are compared loosely (case, spaces, underscores and hyphens ignored), so + * {@code Transverse_Mercator}, {@code Transverse Mercator} and {@code transversemercator} are one + * name.
  • + *
  • A parameter is resolved method-scoped first, then against a shared table. This + * matters because ESRI's parameter vocabulary is fixed and reused: {@code False_Easting} is EPSG + * 8806, 8826 or 8816 depending on the method, and {@code Standard_Parallel_1} is 8823, 8801 or + * 8832.
  • + *
  • Several methods need a derived PROJ parameter that no WKT parameter carries: + * Lambert Conic Conformal (1SP) emits {@code +lat_1} and {@code +lat_0} from one value, and Polar + * Stereographic (variant B) emits {@code +lat_0=±90} from the sign of its standard parallel. + * Without those the PROJ string is not merely differently spelled, it is a different + * projection.
  • + *
+ * Where proj4j's projection would silently ignore a parameter the method defines, this + * class converts it or refuses. Mercator variant B is the clearest case: proj4j's + * {@code MercatorProjection} never reads {@code +lat_ts}, so passing it through would return + * plausible coordinates at the wrong scale; it is converted to the equivalent {@code +k_0} + * instead. Equidistant Cylindrical with a non-zero standard parallel has no such equivalent and is + * refused. + */ +final class WktMethods { + + private WktMethods() { + } + + /** No special handling. */ + private static final int PLAIN = 0; + /** + * The projection applies to a sphere whose radius is the base ellipsoid's semi-major axis. + * PROJ spells this {@code +proj=webmerc} for EPSG 1024 and {@code +f=0} for the "(Spherical)" + * methods; proj4j has neither, so the caller emits {@code +a=} and {@code +b=} equal instead, + * which is arithmetically the same thing and is what GDAL's own PROJ.4 export of EPSG:3857 + * does. + */ + static final int FLAG_SPHERE_FROM_A = 1; + /** Mercator variant A: EPSG 8801 must be zero and is never written. */ + private static final int FLAG_MERCATOR_A = 2; + /** Mercator variant B: the standard parallel becomes an equivalent scale factor. */ + private static final int FLAG_MERCATOR_B = 4; + /** Lambert Conic Conformal (1SP): EPSG 8801 becomes both {@code +lat_1} and {@code +lat_0}. */ + private static final int FLAG_LCC_1SP = 8; + /** Polar Stereographic (variant B): {@code +lat_0} is ±90, from the sign of EPSG 8832. */ + private static final int FLAG_POLAR_STEREO_B = 16; + /** Equidistant Cylindrical: proj4j ignores both of its origin parameters. */ + private static final int FLAG_EQC = 32; + /** Hotine Oblique Mercator: degenerates to {@code +proj=somerc} at azimuth 90. */ + private static final int FLAG_HOTINE = 64; + + // ------------------------------------------------------------------- model + + private static final class Param { + final String projKey; + final String epsgName; + final String epsgCode; + final String wkt1Name; + final String esriName; + final int unitType; + + Param(String projKey, String epsgName, String epsgCode, String wkt1Name, String esriName, + int unitType) { + this.projKey = projKey; + this.epsgName = epsgName; + this.epsgCode = epsgCode; + this.wkt1Name = wkt1Name; + this.esriName = esriName; + this.unitType = unitType; + } + + boolean matches(String name, String code) { + if (code != null && code.equals(epsgCode)) { + return true; + } + return WktNames.equalsRelaxed(name, epsgName) || WktNames.equalsRelaxed(name, wkt1Name) + || WktNames.equalsRelaxed(name, esriName); + } + } + + private static final class Method { + final String projName; + final String epsgName; + final String epsgCode; + final String wkt1Name; + final String[] esriNames; + final Param[] params; + final String[] auxParams; + final int flags; + + Method(String projName, String epsgName, String epsgCode, String wkt1Name, + String[] esriNames, Param[] params, String[] auxParams, int flags) { + this.projName = projName; + this.epsgName = epsgName; + this.epsgCode = epsgCode; + this.wkt1Name = wkt1Name; + this.esriNames = esriNames == null ? new String[0] : esriNames; + this.params = params == null ? new Param[0] : params; + this.auxParams = auxParams == null ? new String[0] : auxParams; + this.flags = flags; + } + + boolean matches(String name) { + if (WktNames.equalsRelaxed(name, epsgName) || WktNames.equalsRelaxed(name, wkt1Name)) { + return true; + } + for (int i = 0; i < esriNames.length; i++) { + if (WktNames.equalsRelaxed(name, esriNames[i])) { + return true; + } + } + return false; + } + } + + private static Param a(String projKey, String epsgName, String epsgCode, String wkt1Name, + String esriName) { + return new Param(projKey, epsgName, epsgCode, wkt1Name, esriName, UnitDefinition.ANGULAR); + } + + private static Param l(String projKey, String epsgName, String epsgCode, String wkt1Name, + String esriName) { + return new Param(projKey, epsgName, epsgCode, wkt1Name, esriName, UnitDefinition.LINEAR); + } + + private static Param s(String projKey, String epsgName, String epsgCode, String wkt1Name, + String esriName) { + return new Param(projKey, epsgName, epsgCode, wkt1Name, esriName, UnitDefinition.SCALE); + } + + // ------------------------------------------------------------- param sets + + private static final Param LAT_NATURAL = + a("lat_0", "Latitude of natural origin", "8801", "latitude_of_origin", + "Latitude_Of_Origin"); + private static final Param LON_NATURAL = + a("lon_0", "Longitude of natural origin", "8802", "central_meridian", + "Central_Meridian"); + private static final Param K_NATURAL = + s("k_0", "Scale factor at natural origin", "8805", "scale_factor", "Scale_Factor"); + private static final Param FALSE_EASTING = + l("x_0", "False easting", "8806", "false_easting", "False_Easting"); + private static final Param FALSE_NORTHING = + l("y_0", "False northing", "8807", "false_northing", "False_Northing"); + private static final Param LAT_CENTRE = + a("lat_0", "Latitude of projection centre", "8811", "latitude_of_center", + "Latitude_Of_Center"); + private static final Param LON_CENTRE_AS_LON0 = + a("lon_0", "Longitude of projection centre", "8812", "longitude_of_center", + "Longitude_Of_Center"); + private static final Param LAT_FALSE_ORIGIN = + a("lat_0", "Latitude of false origin", "8821", "latitude_of_origin", + "Latitude_Of_Origin"); + private static final Param LON_FALSE_ORIGIN = + a("lon_0", "Longitude of false origin", "8822", "central_meridian", + "Central_Meridian"); + private static final Param SP1 = + a("lat_1", "Latitude of 1st standard parallel", "8823", "standard_parallel_1", + "Standard_Parallel_1"); + private static final Param SP2 = + a("lat_2", "Latitude of 2nd standard parallel", "8824", "standard_parallel_2", + "Standard_Parallel_2"); + private static final Param EASTING_FALSE_ORIGIN = + l("x_0", "Easting at false origin", "8826", "false_easting", "False_Easting"); + private static final Param NORTHING_FALSE_ORIGIN = + l("y_0", "Northing at false origin", "8827", "false_northing", "False_Northing"); + + /** The five parameters most projections have: EPSG 8801, 8802, 8805, 8806, 8807. */ + private static final Param[] P_NATURAL = { + LAT_NATURAL, LON_NATURAL, K_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }; + + /** Azimuthal and world projections, whose WKT1 origin is spelled {@code _of_center}. */ + private static final Param[] P_CENTRE = { + a("lat_0", "Latitude of natural origin", "8801", "latitude_of_center", + "Latitude_Of_Center"), + a("lon_0", "Longitude of natural origin", "8802", "longitude_of_center", + "Longitude_Of_Center"), + FALSE_EASTING, FALSE_NORTHING, + }; + + /** Lambert Conic Conformal (2SP), Albers Equal Area: EPSG 8821-8827. */ + private static final Param[] P_FALSE_ORIGIN_2SP = { + LAT_FALSE_ORIGIN, LON_FALSE_ORIGIN, SP1, SP2, EASTING_FALSE_ORIGIN, + NORTHING_FALSE_ORIGIN, + }; + + /** Albers and Equidistant Conic, whose WKT1 origin is spelled {@code _of_center}. */ + private static final Param[] P_ALBERS = { + a("lat_0", "Latitude of false origin", "8821", "latitude_of_center", + "Latitude_Of_Origin"), + a("lon_0", "Longitude of false origin", "8822", "longitude_of_center", + "Central_Meridian"), + SP1, SP2, EASTING_FALSE_ORIGIN, NORTHING_FALSE_ORIGIN, + }; + + private static final Param[] P_LCC_1SP = { + a("lat_1", "Latitude of natural origin", "8801", "latitude_of_origin", + "Standard_Parallel_1"), + LON_NATURAL, K_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_MERCATOR_A = { + LAT_NATURAL, LON_NATURAL, K_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_MERCATOR_B = { + a("lat_ts", "Latitude of 1st standard parallel", "8823", "standard_parallel_1", + "Standard_Parallel_1"), + LAT_NATURAL, LON_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_EQC = { + a("lat_ts", "Latitude of 1st standard parallel", "8823", "standard_parallel_1", + "Standard_Parallel_1"), + LAT_NATURAL, LON_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_CEA = { + a("lat_ts", "Latitude of 1st standard parallel", "8823", "standard_parallel_1", + "Standard_Parallel_1"), + LON_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_POLAR_STEREO_B = { + a("lat_ts", "Latitude of standard parallel", "8832", "latitude_of_origin", + "Standard_Parallel_1"), + a("lon_0", "Longitude of origin", "8833", "central_meridian", "Central_Meridian"), + FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_OMERC_A = { + LAT_CENTRE, + a("lonc", "Longitude of projection centre", "8812", "longitude_of_center", + "Longitude_Of_Center"), + a("alpha", "Azimuth of initial line", "8813", "azimuth", "Azimuth"), + a("gamma", "Angle from Rectified to Skew Grid", "8814", "rectified_grid_angle", + "XY_Plane_Rotation"), + s("k_0", "Scale factor on initial line", "8815", "scale_factor", "Scale_Factor"), + FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_OMERC_B = { + LAT_CENTRE, + a("lonc", "Longitude of projection centre", "8812", "longitude_of_center", + "Longitude_Of_Center"), + a("alpha", "Azimuth of initial line", "8813", "azimuth", "Azimuth"), + a("gamma", "Angle from Rectified to Skew Grid", "8814", "rectified_grid_angle", + "XY_Plane_Rotation"), + s("k_0", "Scale factor on initial line", "8815", "scale_factor", "Scale_Factor"), + l("x_0", "Easting at projection centre", "8816", "false_easting", "False_Easting"), + l("y_0", "Northing at projection centre", "8817", "false_northing", "False_Northing"), + }; + + private static final Param[] P_KROVAK = { + LAT_CENTRE, + a("lon_0", "Longitude of origin", "8833", "longitude_of_center", "Longitude_Of_Center"), + a("alpha", "Co-latitude of cone axis", "1036", "azimuth", "Azimuth"), + a(null, "Latitude of pseudo standard parallel", "8818", "pseudo_standard_parallel_1", + "Pseudo_Standard_Parallel_1"), + s("k_0", "Scale factor on pseudo standard parallel", "8819", "scale_factor", + "Scale_Factor"), + FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_GEOS = { + LON_NATURAL, + new Param("h", "Satellite Height", null, "satellite_height", "Height", + UnitDefinition.LINEAR), + FALSE_EASTING, FALSE_NORTHING, + }; + + private static final Param[] P_VERTICAL_PERSPECTIVE = { + a("lat_0", "Latitude of topocentric origin", "8834", null, "Latitude_Of_Center"), + a("lon_0", "Longitude of topocentric origin", "8835", null, "Longitude_Of_Center"), + new Param("h", "Viewpoint height", "8840", null, "Height", UnitDefinition.LINEAR), + FALSE_EASTING, FALSE_NORTHING, + }; + + /** + * Parameters which mean the same thing in most methods. Consulted only after the identified + * method's own list, and covering the aliases PROJ's {@code areEquivalentParameters} groups + * together. + */ + private static final Param[] GENERIC = { + LAT_NATURAL, LON_NATURAL, K_NATURAL, FALSE_EASTING, FALSE_NORTHING, + LAT_FALSE_ORIGIN, LON_FALSE_ORIGIN, SP1, SP2, EASTING_FALSE_ORIGIN, + NORTHING_FALSE_ORIGIN, LAT_CENTRE, LON_CENTRE_AS_LON0, + a("lat_ts", "Latitude of standard parallel", "8832", "latitude_of_origin", + "Standard_Parallel_1"), + a("lon_0", "Longitude of origin", "8833", "central_meridian", "Longitude_Of_Origin"), + l("x_0", "Easting at projection centre", "8816", "false_easting", "False_Easting"), + l("y_0", "Northing at projection centre", "8817", "false_northing", "False_Northing"), + a("alpha", "Azimuth of initial line", "8813", "azimuth", "Azimuth"), + a("gamma", "Angle from Rectified to Skew Grid", "8814", "rectified_grid_angle", + "XY_Plane_Rotation"), + s("k_0", "Scale factor on initial line", "8815", "scale_factor", "Scale_Factor"), + s("k_0", "Scale factor at projection centre", "8815", "scale_factor", "Scale_Factor"), + a("lat_ts", "Latitude of pseudo standard parallel", "8818", + "pseudo_standard_parallel_1", "Pseudo_Standard_Parallel_1"), + s("k_0", "Scale factor on pseudo standard parallel", "8819", "scale_factor", + "Scale_Factor"), + s("k_0", "Ellipsoid scaling factor", "1038", null, "Scale_Factor"), + new Param("h", "Satellite Height", null, "satellite_height", "Height", + UnitDefinition.LINEAR), + new Param("h", "Viewpoint height", "8840", null, "Height", UnitDefinition.LINEAR), + }; + + // ----------------------------------------------------------------- methods + + /** The order projection parameters are emitted in. */ + private static final String[] CANONICAL_ORDER = { + "lat_0", "lon_0", "lat_1", "lat_2", "lat_ts", "lonc", "alpha", "gamma", "k_0", "x_0", + "y_0", "h", + }; + + private static final List METHODS = new ArrayList(); + private static final Map BY_PROJ = new HashMap(); + + private static void method(String projName, String epsgName, String epsgCode, String wkt1Name, + String[] esriNames, Param[] params, String[] auxParams, int flags) { + Method m = new Method(projName, epsgName, epsgCode, wkt1Name, esriNames, params, auxParams, + flags); + METHODS.add(m); + if (!BY_PROJ.containsKey(projName)) { + BY_PROJ.put(projName, m); + } + } + + private static void method(String projName, String epsgName, String epsgCode, String wkt1Name, + Param[] params, String... esriNames) { + method(projName, epsgName, epsgCode, wkt1Name, esriNames, params, null, PLAIN); + } + + static { + // --- Transverse Mercator family + method("tmerc", "Transverse Mercator", "9807", "Transverse_Mercator", P_NATURAL, + "Transverse_Mercator", "Gauss_Kruger", "Transverse_Mercator_Complex"); + method("tmerc", "Transverse Mercator (3D)", "1111", "Transverse_Mercator", P_NATURAL); + method("tmerc", "Transverse Mercator (South Orientated)", "9808", + "Transverse_Mercator_South_Orientated", new String[0], P_NATURAL, + new String[]{"+axis=wsu"}, PLAIN); + method("gstmerc", "Gauss Schreiber Transverse Mercator", null, + "Gauss_Schreiber_Transverse_Mercator", P_NATURAL); + + // --- Mercator family. ESRI's plain "Mercator" is variant B, not variant A. + method("merc", "Mercator (variant A)", "9804", "Mercator_1SP", new String[]{ + "Mercator_Variant_A"}, P_MERCATOR_A, null, FLAG_MERCATOR_A); + method("merc", "Mercator (variant B)", "9805", "Mercator_2SP", new String[]{ + "Mercator", "Mercator_Variant_C"}, P_MERCATOR_B, null, FLAG_MERCATOR_B); + // ESRI's Mercator_Auxiliary_Sphere spells the (mandatory zero) latitude of natural origin + // Standard_Parallel_1, so it needs its own parameter set: matched by the shared table it + // would become +lat_1 and silently bend the projection into a two-parallel one. + method("merc", "Popular Visualisation Pseudo Mercator", "1024", + "Popular_Visualisation_Pseudo_Mercator", + new String[]{"Mercator_Auxiliary_Sphere"}, new Param[]{ + a("lat_0", "Latitude of natural origin", "8801", "latitude_of_origin", + "Standard_Parallel_1"), + LON_NATURAL, K_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }, null, FLAG_SPHERE_FROM_A | FLAG_MERCATOR_A); + + // --- Lambert Conic Conformal. The bare name is ambiguous and resolved by parameters. + method("lcc", "Lambert Conic Conformal (1SP)", "9801", "Lambert_Conformal_Conic_1SP", + new String[0], P_LCC_1SP, null, FLAG_LCC_1SP); + method("lcc", "Lambert Conic Conformal (2SP)", "9802", "Lambert_Conformal_Conic_2SP", + P_FALSE_ORIGIN_2SP, "Lambert_Conformal_Conic"); + method("lcc", "Lambert Conic Conformal (2SP Belgium)", "9803", + "Lambert_Conformal_Conic_2SP_Belgium", P_FALSE_ORIGIN_2SP); + method("lcc", "Lambert Conic Conformal (2SP Michigan)", "1051", null, + P_FALSE_ORIGIN_2SP); + method("lcc", "Lambert Conic Conformal (1SP variant B)", "1102", null, new String[0], + new Param[]{ + a("lat_1", "Latitude of natural origin", "8801", "latitude_of_origin", + "Standard_Parallel_1"), + K_NATURAL, LAT_FALSE_ORIGIN, LON_FALSE_ORIGIN, EASTING_FALSE_ORIGIN, + NORTHING_FALSE_ORIGIN, + }, null, PLAIN); + + // --- Other conics + method("aea", "Albers Equal Area", "9822", "Albers_Conic_Equal_Area", P_ALBERS, "Albers"); + method("aea", "Albers Equal Area", "9822", "Albers_Conical_Equal_Area", P_ALBERS, + "Albers_Equal_Area_Conic"); + method("eqdc", "Equidistant Conic", "1119", "Equidistant_Conic", P_ALBERS, + "Equidistant_Conic"); + method("leac", "Lambert Equal Area Conic", null, "Lambert_Equal_Area_Conic", P_ALBERS); + method("bonne", "Bonne", "9827", "Bonne", new Param[]{ + a("lat_1", "Latitude of natural origin", "8801", "standard_parallel_1", + "Standard_Parallel_1"), + LON_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }, "Bonne"); + method("poly", "American Polyconic", "9818", "Polyconic", P_NATURAL, "Polyconic"); + method("rpoly", "Rectangular Polyconic", null, "Rectangular_Polyconic", P_NATURAL); + method("cass", "Cassini-Soldner", "9806", "Cassini_Soldner", P_NATURAL, "Cassini"); + method("krovak", "Krovak (North Orientated)", "1041", "Krovak", new String[]{"Krovak"}, + P_KROVAK, null, PLAIN); + method("krovak", "Krovak", "9819", "Krovak", new String[]{"Krovak"}, P_KROVAK, + new String[]{"+axis=swu"}, PLAIN); + + // --- Cylindrical + method("cea", "Lambert Cylindrical Equal Area", "9835", "Cylindrical_Equal_Area", P_CEA, + "Cylindrical_Equal_Area", "Behrmann"); + method("cea", "Lambert Cylindrical Equal Area (Spherical)", "9834", + "Cylindrical_Equal_Area", new String[0], P_CEA, new String[]{"+R_A"}, PLAIN); + method("eqc", "Equidistant Cylindrical", "1028", "Equirectangular", new String[]{ + "Equidistant_Cylindrical", "Plate_Carree", + "Equidistant_Cylindrical_Ellipsoidal"}, P_EQC, null, FLAG_EQC); + method("eqc", "Equidistant Cylindrical (Spherical)", "1029", "Equirectangular", + new String[]{"Plate_Carree"}, P_EQC, null, FLAG_EQC); + method("mill", "Miller Cylindrical", null, "Miller_Cylindrical", new String[]{ + "Miller_Cylindrical"}, P_CENTRE, new String[]{"+R_A"}, PLAIN); + method("cc", "Central Cylindrical", null, "Central_Cylindrical", P_NATURAL); + method("gall", "Gall Stereographic", null, "Gall_Stereographic", P_NATURAL, + "Gall_Stereographic"); + method("tcea", "Transverse Cylindrical Equal Area", null, + "Transverse_Cylindrical_Equal_Area", P_NATURAL, + "Transverse_Cylindrical_Equal_Area"); + + // --- Oblique Mercator. somerc is the alpha == gamma == 90 degenerate case of variant B, + // not a separate WKT method, so it is registered under its GDAL WKT1 name only. + method("omerc", "Hotine Oblique Mercator (variant A)", "9812", "Hotine_Oblique_Mercator", + new String[]{"Hotine_Oblique_Mercator_Azimuth_Natural_Origin", + "Rectified_Skew_Orthomorphic_Natural_Origin"}, + P_OMERC_A, new String[]{"+no_uoff"}, FLAG_HOTINE); + method("omerc", "Hotine Oblique Mercator (variant B)", "9815", + "Hotine_Oblique_Mercator_Azimuth_Center", + new String[]{"Hotine_Oblique_Mercator_Azimuth_Center", + "Rectified_Skew_Orthomorphic_Center"}, + P_OMERC_B, null, FLAG_HOTINE); + method("somerc", "Swiss Oblique Mercator", null, "Swiss_Oblique_Cylindrical", P_NATURAL, + "Swiss_Oblique_Cylindrical", "Hotine_Oblique_Mercator_Azimuth_Center_Swiss"); + + // --- Azimuthal + method("stere", "Polar Stereographic (variant A)", "9810", "Polar_Stereographic", + new String[]{"Polar_Stereographic_Variant_A"}, P_NATURAL, null, PLAIN); + method("stere", "Polar Stereographic (variant B)", "9829", "Polar_Stereographic", + new String[]{"Stereographic_North_Pole", "Stereographic_South_Pole"}, + P_POLAR_STEREO_B, null, FLAG_POLAR_STEREO_B); + method("stere", "Stereographic", null, "Stereographic", P_NATURAL, "Stereographic"); + method("sterea", "Oblique Stereographic", "9809", "Oblique_Stereographic", P_NATURAL, + "Double_Stereographic", "Oblique_Stereographic"); + method("laea", "Lambert Azimuthal Equal Area", "9820", "Lambert_Azimuthal_Equal_Area", + P_CENTRE, "Lambert_Azimuthal_Equal_Area"); + method("laea", "Lambert Azimuthal Equal Area (Spherical)", "1027", + "Lambert_Azimuthal_Equal_Area", new String[0], P_CENTRE, new String[]{"+R_A"}, + PLAIN); + method("aeqd", "Azimuthal Equidistant", "1125", "Azimuthal_Equidistant", P_CENTRE, + "Azimuthal_Equidistant"); + method("aeqd", "Modified Azimuthal Equidistant", "9832", "Azimuthal_Equidistant", + P_CENTRE); + method("gnom", "Gnomonic", null, "Gnomonic", P_CENTRE, "Gnomonic", "Gnomonic_Ellipsoidal"); + method("ortho", "Orthographic", "9840", "Orthographic", P_CENTRE, "Orthographic"); + method("ortho", "Orthographic (Spherical)", null, "Orthographic", new String[]{ + "Orthographic"}, P_CENTRE, null, FLAG_SPHERE_FROM_A); + method("nsper", "Vertical Perspective", "9838", null, new String[]{ + "Vertical_Near_Side_Perspective"}, P_VERTICAL_PERSPECTIVE, null, PLAIN); + method("geos", "Geostationary Satellite (Sweep Y)", null, "Geostationary_Satellite", + P_GEOS, "Geostationary_Satellite"); + + // --- Pseudo-cylindrical and world projections + method("moll", "Mollweide", null, "Mollweide", P_CENTRE, "Mollweide"); + method("sinu", "Sinusoidal", null, "Sinusoidal", P_CENTRE, "Sinusoidal"); + method("robin", "Robinson", null, "Robinson", P_CENTRE, "Robinson"); + method("vandg", "Van Der Grinten", null, "VanDerGrinten", new String[]{ + "Van_der_Grinten_I"}, P_CENTRE, new String[]{"+R_A"}, PLAIN); + method("aitoff", "Aitoff", null, "Aitoff", P_CENTRE, "Aitoff"); + method("hammer", "Hammer Aitoff", null, "Hammer_Aitoff", P_CENTRE, "Hammer_Aitoff"); + method("wintri", "Winkel Tripel", null, "Winkel_Tripel", P_CENTRE, "Winkel_Tripel"); + method("eck1", "Eckert I", null, "Eckert_I", P_CENTRE, "Eckert_I"); + method("eck2", "Eckert II", null, "Eckert_II", P_CENTRE, "Eckert_II"); + method("eck4", "Eckert IV", null, "Eckert_IV", P_CENTRE, "Eckert_IV"); + method("eck5", "Eckert V", null, "Eckert_V", P_CENTRE, "Eckert_V"); + method("eck6", "Eckert VI", null, "Eckert_VI", P_CENTRE, "Eckert_VI"); + method("goode", "Goode Homolosine", null, "Goode_Homolosine", P_CENTRE); + method("loxim", "Loximuthal", null, "Loximuthal", new Param[]{ + a("lat_1", "Latitude of natural origin", "8801", "latitude_of_origin", + "Central_Parallel"), + LON_NATURAL, FALSE_EASTING, FALSE_NORTHING, + }, "Loximuthal"); + method("crast", "Craster Parabolic", null, "Craster_Parabolic", P_CENTRE, + "Craster_Parabolic"); + method("qua_aut", "Quartic Authalic", null, "Quartic_Authalic", P_CENTRE, + "Quartic_Authalic"); + method("mbtfpq", "Flat Polar Quartic", null, "Flat_Polar_Quartic", P_CENTRE, + "Flat_Polar_Quartic"); + method("nzmg", "New Zealand Map Grid", "9811", "New_Zealand_Map_Grid", P_NATURAL, + "New_Zealand_Map_Grid"); + method("wag4", "Wagner IV", null, "Wagner_IV", P_CENTRE, "Wagner_IV"); + method("wag5", "Wagner V", null, "Wagner_V", P_CENTRE, "Wagner_V"); + method("wag7", "Wagner VII", null, "Wagner_VII", P_CENTRE, "Wagner_VII"); + } + + // ----------------------------------------------------------------- lookups + + private static Method find(ConversionDefinition conv) { + Identifier id = conv.getMethodId(); + if (id != null && "EPSG".equalsIgnoreCase(id.getAuthority()) && id.getCode() != null) { + for (int i = 0; i < METHODS.size(); i++) { + if (id.getCode().equals(METHODS.get(i).epsgCode)) { + return METHODS.get(i); + } + } + } + Method m = findByName(conv.getMethodName()); + if (m == null) { + return null; + } + return disambiguate(m, conv); + } + + /** + * Resolves the variants several dialects collapse into one name, exactly as PROJ does: + * {@code Lambert_Conformal_Conic} by which parameters are present, {@code Krovak} and + * {@code Polar_Stereographic} likewise. + */ + private static Method disambiguate(Method m, ConversionDefinition conv) { + if ("lcc".equals(m.projName) && (m.flags & FLAG_LCC_1SP) == 0 + && WktNames.equalsRelaxed(conv.getMethodName(), "Lambert_Conformal_Conic")) { + boolean hasSp2 = conv.getParameter("standard_parallel_2") != null; + boolean hasScale = conv.getParameter("scale_factor") != null; + if (!hasSp2 && hasScale) { + return byEpsgCode("9801"); + } + if (hasSp2 && hasScale) { + return byEpsgCode("1051"); + } + return byEpsgCode("9802"); + } + if ("stere".equals(m.projName) && WktNames.equalsRelaxed(conv.getMethodName(), + "Polar_Stereographic")) { + // PROJ's WKT1 rule: a standard parallel with a unit scale factor is variant B; a + // latitude of origin of +/-90 with a scale factor is variant A. + ParameterDefinition scale = conv.getParameter("scale_factor"); + ParameterDefinition lat = conv.getParameter("latitude_of_origin"); + boolean unitScale = scale == null || scale.getValue() == 1.0; + if (lat != null && unitScale && Math.abs(Math.abs(lat.getValueDegrees()) - 90) > 1e-10) { + return byEpsgCode("9829"); + } + return byEpsgCode("9810"); + } + if ("stere".equals(m.projName) && m.epsgCode == null) { + // ESRI "Stereographic" with a polar latitude of origin is really polar variant A. + ParameterDefinition lat = conv.getParameter("Latitude_Of_Origin"); + if (lat != null && Math.abs(Math.abs(lat.getValueDegrees()) - 90) < 1e-10) { + return byEpsgCode("9810"); + } + } + return m; + } + + private static Method byEpsgCode(String code) { + for (int i = 0; i < METHODS.size(); i++) { + if (code.equals(METHODS.get(i).epsgCode)) { + return METHODS.get(i); + } + } + return null; + } + + private static Method findByName(String name) { + if (name == null) { + return null; + } + // OGC 12-063r5 C.4.2, reproduced by PROJ's getMappingFromWKT1: a WKT1 projection name + // beginning "UTM zone" is Transverse Mercator. + if (name.length() >= 8 && name.substring(0, 8).equalsIgnoreCase("UTM zone")) { + return byEpsgCode("9807"); + } + for (int i = 0; i < METHODS.size(); i++) { + if (METHODS.get(i).matches(name)) { + return METHODS.get(i); + } + } + return null; + } + + /** + * The unit type of a WKT1 parameter, which carries no unit of its own. + *

+ * PROJ's {@code guessUnitForParameter} (9.8.1 {@code src/iso19111/io.cpp}), in its exact + * order: {@code scale} first — precisely because "Scale factor on pseudo standard parallel" + * also contains "parallel" — then the angular words, then the linear ones. + * + * @return {@link UnitDefinition#SCALE}, {@link UnitDefinition#ANGULAR}, + * {@link UnitDefinition#LINEAR}, or -1 for "no idea" + */ + static int guessUnitType(String parameterName) { + if (parameterName == null) { + return -1; + } + // Locale.ROOT: an ASCII parameter name, matched against ASCII substrings below. + String n = parameterName.toLowerCase(Locale.ROOT); + if (n.contains("scale") || n.contains("scaling factor")) { + return UnitDefinition.SCALE; + } + if (n.contains("latitude") || n.contains("longitude") || n.contains("meridian") + || n.contains("parallel") || n.contains("azimuth") || n.contains("angle") + || n.contains("heading") || n.contains("rotation")) { + return UnitDefinition.ANGULAR; + } + if (n.contains("easting") || n.contains("northing") || n.contains("height")) { + return UnitDefinition.LINEAR; + } + return -1; + } + + static boolean isAngularParameter(String name) { + return guessUnitType(name) == UnitDefinition.ANGULAR; + } + + static boolean isScaleParameter(String name) { + return guessUnitType(name) == UnitDefinition.SCALE; + } + + private static Param findGeneric(String name, String code) { + for (int i = 0; i < GENERIC.length; i++) { + if (GENERIC[i].matches(name, code)) { + return GENERIC[i]; + } + } + return null; + } + + // ----------------------------------------------------------------- forward + + /** + * Appends {@code +proj=} and the projection's parameters for {@code conv}. + * + * @return flags the caller must act on, currently only {@link #FLAG_SPHERE_FROM_A} + * @throws WktParseException if the method is unknown, or needs a parameter proj4j's + * implementation would silently ignore + */ + static int appendProjection(ConversionDefinition conv, CrsDefinition crs, + List params) { + Method method = find(conv); + if (method == null) { + throw new WktParseException("operation method \"" + conv.getMethodName() + + "\" is not a projection this library can map to PROJ"); + } + + Map values = new LinkedHashMap(); + List declared = conv.getParameters(); + for (int i = 0; i < declared.size(); i++) { + ParameterDefinition p = declared.get(i); + String code = p.getId() != null && "EPSG".equalsIgnoreCase(p.getId().getAuthority()) + ? p.getId().getCode() : null; + Param mapping = null; + for (int j = 0; j < method.params.length; j++) { + if (method.params[j].matches(p.getName(), code)) { + mapping = method.params[j]; + break; + } + } + if (mapping == null) { + mapping = findGeneric(p.getName(), code); + } + if (mapping == null) { + if (isIgnorableParameter(p.getName())) { + continue; + } + throw new WktParseException("parameter \"" + p.getName() + "\" of method \"" + + conv.getMethodName() + "\" has no PROJ equivalent"); + } + if (mapping.projKey == null) { + // PROJ drops this parameter too: Krovak's pseudo standard parallel, which is + // hard-coded in every implementation. + continue; + } + values.put(mapping.projKey, WktFormat.number(valueOf(p, mapping))); + } + + String projName = method.projName; + + if ((method.flags & FLAG_MERCATOR_A) != 0) { + String lat0 = values.remove("lat_0"); + if (lat0 != null && Double.parseDouble(lat0) != 0.0) { + // GDAL ticket #3026: a Mercator_1SP with a non-zero latitude of origin is really + // variant B. PROJ re-reads it that way rather than rejecting it, and so do we. + String k = values.get("k_0"); + if (k == null || Double.parseDouble(k) == 1.0) { + values.remove("k_0"); + values.put("lat_ts", lat0); + mercatorVariantB(values, crs, conv); + } else { + throw new WktParseException("Mercator (variant A) with latitude of natural " + + "origin " + lat0 + " and scale factor " + k + " is not a projection " + + "PROJ or this library can express"); + } + } + } + if ((method.flags & FLAG_MERCATOR_B) != 0) { + values.remove("lat_0"); + mercatorVariantB(values, crs, conv); + } + if ((method.flags & FLAG_LCC_1SP) != 0 && values.containsKey("lat_1") + && !values.containsKey("lat_0")) { + // PROJ emits both from the single EPSG 8801 value; without +lat_0 the projection is + // centred on the equator. + values.put("lat_0", values.get("lat_1")); + } + if ((method.flags & FLAG_POLAR_STEREO_B) != 0) { + String latTs = values.get("lat_ts"); + if (latTs == null) { + throw new WktParseException("Polar Stereographic (variant B) has no latitude of " + + "standard parallel"); + } + values.put("lat_0", Double.parseDouble(latTs) >= 0 ? "90" : "-90"); + } + if ((method.flags & FLAG_EQC) != 0) { + refuseNonZero(values, "lat_ts", conv, "standard parallel"); + refuseNonZero(values, "lat_0", conv, "latitude of natural origin"); + } + if ((method.flags & FLAG_HOTINE) != 0) { + String alpha = values.get("alpha"); + String gamma = values.get("gamma"); + if (alpha != null && gamma == null) { + // PROJ synthesises gamma from alpha when WKT1 omits rectified_grid_angle. + gamma = alpha; + values.put("gamma", gamma); + } + if (alpha != null && gamma != null + && Math.abs(Double.parseDouble(alpha) - 90) < 1e-4 + && Math.abs(Double.parseDouble(gamma) - 90) < 1e-4) { + // The Swiss degenerate case: PROJ exports +proj=somerc, and proj4j's + // SwissObliqueMercatorProjection is the implementation that matches. + projName = "somerc"; + values.remove("alpha"); + values.remove("gamma"); + String lonc = values.remove("lonc"); + if (lonc != null && !values.containsKey("lon_0")) { + values.put("lon_0", lonc); + } + } + } + if ((method.flags & FLAG_SPHERE_FROM_A) != 0) { + ParameterDefinition auxiliary = conv.getParameter("Auxiliary_Sphere_Type"); + if (auxiliary != null && auxiliary.getValue() != 0.0) { + throw new WktParseException("Auxiliary_Sphere_Type=" + + WktFormat.number(auxiliary.getValue()) + " is not supported; only 0, " + + "\"use the semi-major axis as the sphere radius\", has an equivalent " + + "here"); + } + } + + params.add("+proj=" + projName); + if ("krovak".equals(projName) && isSouthWest(crs)) { + // WKT1 and ESRI both spell EPSG 9819 and 1041 "Krovak"; PROJ tells them apart by + // whether the projected axes are south then west, and only 9819 gets +axis=swu. + // Emitting it unconditionally would negate both ordinates of every EPSG:5514 + // coordinate. + params.add("+axis=swu"); + } + // Emitted in a fixed order rather than the document's, so that the same CRS expressed in + // WKT1, ESRI WKT, WKT2 and PROJJSON yields one identical PROJ string. + for (int i = 0; i < CANONICAL_ORDER.length; i++) { + String v = values.remove(CANONICAL_ORDER[i]); + if (v != null) { + params.add("+" + CANONICAL_ORDER[i] + "=" + v); + } + } + for (java.util.Iterator> it = values.entrySet().iterator(); + it.hasNext(); ) { + Map.Entry e = it.next(); + params.add("+" + e.getKey() + "=" + e.getValue()); + } + if (!"somerc".equals(projName)) { + for (int i = 0; i < method.auxParams.length; i++) { + if ("+axis=swu".equals(method.auxParams[i])) { + continue; // handled above, from the axes rather than from the method name + } + params.add(method.auxParams[i]); + } + } + return method.flags & FLAG_SPHERE_FROM_A; + } + + /** + * Whether a CRS's first two axes are south then west — the Czech Krovak convention, EPSG 9819. + */ + private static boolean isSouthWest(CrsDefinition crs) { + CoordinateSystemDefinition cs = crs == null ? null : crs.getCoordinateSystem(); + if (cs == null || cs.getAxes().size() < 2) { + return false; + } + return AxisDefinition.SOUTH.equals(cs.getAxes().get(0).getDirection()) + && AxisDefinition.WEST.equals(cs.getAxes().get(1).getDirection()); + } + + private static void refuseNonZero(Map values, String key, + ConversionDefinition conv, String what) { + String v = values.remove(key); + if (v != null && Double.parseDouble(v) != 0.0) { + throw new WktParseException("method \"" + conv.getMethodName() + "\" has " + what + " " + + v + ", which proj4j's implementation ignores; refusing rather than " + + "returning coordinates at the wrong scale or offset"); + } + } + + /** + * ESRI parameters which select a method variant rather than describing the geometry, and which + * this library has already accounted for by the time they are seen. + */ + private static boolean isIgnorableParameter(String name) { + String n = WktNames.normalize(name); + return n.equals("auxiliaryspheretype") || n.equals("xscale") || n.equals("yscale") + || n.equals("option"); + } + + private static double valueOf(ParameterDefinition p, Param mapping) { + switch (mapping.unitType) { + case UnitDefinition.ANGULAR: + return p.getValueDegrees(); + case UnitDefinition.SCALE: + return p.getValueScale(); + default: + return p.getValueMetres(); + } + } + + /** + * Converts Mercator variant B's standard parallel to variant A's scale factor, per EPSG + * Guidance Note 7-2 and PROJ's {@code Conversion::convertToOtherMethod}: + * {@code k0 = cos(phi1) / sqrt(1 - e^2 sin^2(phi1))}. + *

+ * Necessary because proj4j's {@code MercatorProjection} never reads {@code +lat_ts}: passing + * the standard parallel through would leave the scale silently at 1, which is a coordinate + * error growing with latitude — 20 km at 60 degrees. + */ + private static void mercatorVariantB(Map values, CrsDefinition crs, + ConversionDefinition conv) { + String latTs = values.remove("lat_ts"); + if (latTs == null) { + latTs = values.remove("lat_1"); + } + if (latTs == null) { + return; + } + double phi1 = ProjectionMath.toRad(Double.parseDouble(latTs)); + if (Math.abs(phi1) >= Math.PI / 2) { + throw new WktParseException("Mercator (variant B) standard parallel " + latTs + + " is out of range"); + } + String existing = values.get("k_0"); + if (existing != null && Double.parseDouble(existing) != 1.0) { + throw new WktParseException("Mercator (variant B) cannot carry both a standard " + + "parallel and a scale factor of " + existing); + } + double es = eccentricitySquared(crs); + double sin = Math.sin(phi1); + double k0 = Math.cos(phi1) / Math.sqrt(1.0 - es * sin * sin); + values.put("k_0", WktFormat.number(k0)); + } + + private static double eccentricitySquared(CrsDefinition crs) { + DatumDefinition datum = crs == null ? null : crs.resolveDatum(); + EllipsoidDefinition e = datum == null ? null : datum.getEllipsoid(); + if (e == null) { + return 0.0; + } + double rf = WktNames.inverseFlatteningOf(e); + if (rf == 0.0) { + return 0.0; + } + double f = 1.0 / rf; + return 2 * f - f * f; + } + + // ----------------------------------------------------------------- reverse + + /** + * The EPSG/WKT2 name of a conversion's method, whichever dialect it is spelled in. + */ + static String wkt2MethodName(ConversionDefinition conv) { + Method m = find(conv); + if (m != null && m.epsgName != null) { + return m.epsgName; + } + return conv.getMethodName() == null ? "unknown" : conv.getMethodName(); + } + + /** + * The EPSG identifier of a method named in any dialect, or {@code null}. + */ + static Identifier methodId(String methodName) { + Method m = findByName(methodName); + return m == null || m.epsgCode == null ? null : new Identifier("EPSG", m.epsgCode); + } + + /** + * The EPSG/WKT2 name of a parameter, resolved against the method that uses it so that + * {@code false_easting} becomes "Easting at false origin" for Lambert Conic Conformal (2SP) + * and "False easting" for Transverse Mercator. + */ + static String wkt2ParameterName(ConversionDefinition conv, String name) { + Param p = findFor(conv, name); + return p != null && p.epsgName != null ? p.epsgName : name; + } + + /** + * The EPSG identifier of a parameter, resolved against its method, or {@code null}. + */ + static Identifier parameterId(ConversionDefinition conv, String name) { + Param p = findFor(conv, name); + return p == null || p.epsgCode == null ? null : new Identifier("EPSG", p.epsgCode); + } + + private static Param findFor(ConversionDefinition conv, String name) { + Method m = conv == null ? null : find(conv); + if (m != null) { + for (int i = 0; i < m.params.length; i++) { + if (m.params[i].matches(name, null)) { + return m.params[i]; + } + } + } + return findGeneric(name, null); + } + + /** + * Describes a proj4j projection as a WKT2 conversion, for the writers. + * + * @throws WktParseException if the projection has no WKT operation method + */ + static ConversionDefinition conversionOf(Projection proj) { + String projName = proj.getName(); + Method m = BY_PROJ.get(projName); + if (m == null && "utm".equals(projName)) { + m = byEpsgCode("9807"); + } + if (m == null && ("longlat".equals(projName) || "latlong".equals(projName))) { + throw new WktParseException("a geographic CRS has no projection conversion"); + } + if (m == null) { + throw new WktParseException("PROJ projection \"" + projName + + "\" has no WKT operation method in this library's table"); + } + ConversionDefinition conv = new ConversionDefinition(); + conv.setName("unnamed"); + conv.setMethodName(m.epsgName); + if (m.epsgCode != null) { + conv.setMethodId(new Identifier("EPSG", m.epsgCode)); + } + Param[] params = m.params; + for (int i = 0; i < params.length; i++) { + Param p = params[i]; + if (p.projKey == null) { + continue; + } + double value = projValue(proj, p.projKey); + if (Double.isNaN(value)) { + continue; + } + ParameterDefinition pd = new ParameterDefinition(); + pd.setName(p.epsgName); + pd.setValue(value); + pd.setUnit(p.unitType == UnitDefinition.ANGULAR ? UnitDefinition.DEGREE + : p.unitType == UnitDefinition.SCALE ? UnitDefinition.UNITY + : UnitDefinition.METRE); + if (p.epsgCode != null) { + pd.setId(new Identifier("EPSG", p.epsgCode)); + } + conv.addParameter(pd); + } + return conv; + } + + private static double projValue(Projection proj, String projKey) { + if ("lat_0".equals(projKey)) { + return proj.getProjectionLatitudeDegrees(); + } + if ("lon_0".equals(projKey)) { + return proj.getProjectionLongitudeDegrees(); + } + if ("lat_1".equals(projKey)) { + return proj.getProjectionLatitude1Degrees(); + } + if ("lat_2".equals(projKey)) { + return proj.getProjectionLatitude2Degrees(); + } + if ("lat_ts".equals(projKey)) { + return proj.getTrueScaleLatitudeDegrees(); + } + if ("k_0".equals(projKey)) { + return proj.getScaleFactor(); + } + if ("x_0".equals(projKey)) { + return proj.getFalseEasting(); + } + if ("y_0".equals(projKey)) { + return proj.getFalseNorthing(); + } + if ("alpha".equals(projKey)) { + return ProjectionMath.toDeg(proj.getAlpha()); + } + if ("lonc".equals(projKey)) { + return ProjectionMath.toDeg(proj.getLonC()); + } + if ("h".equals(projKey)) { + return proj.getHeightOfOrbit(); + } + return Double.NaN; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktNames.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktNames.java new file mode 100644 index 0000000..ead4964 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktNames.java @@ -0,0 +1,445 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.HashMap; +import java.util.Map; + +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.units.Unit; +import org.locationtech.proj4j.units.Units; + +/** + * Name matching and the small amount of vocabulary this package needs: how loosely two names are + * compared, which unit a name denotes, and which of proj4j's built-in ellipsoids and datums a + * document is describing. + *

+ * PROJ resolves all of this against {@code proj.db}. This library has no database, so the rules + * here are deliberately conservative: units are resolved by their declared conversion + * factor first and by name only as a fallback, and an ellipsoid is matched + * numerically against {@link Ellipsoid#ellipsoids} rather than by name. A document + * describing GRS 1980 therefore yields {@code +ellps=GRS80} whatever it calls it, and a document + * describing something proj4j has no name for yields explicit {@code +a=} / {@code +rf=} rather + * than a wrong name. + */ +final class WktNames { + + private WktNames() { + } + + /** Tolerance for matching a semi-major axis, in metres. */ + private static final double A_TOLERANCE = 1e-4; + /** + * Tolerance for matching an inverse flattening, absolute. Deliberately tight: GRS 1980 + * (298.257222101) and WGS 84 (298.257223563) differ by only 1.5e-6 and must not be conflated, + * because the datum inferred from the ellipsoid name differs. A document which rounds the + * value to seven decimal places still matches. + */ + private static final double RF_TOLERANCE = 1e-7; + + /** + * Compares two names ignoring case, spaces, underscores and hyphens. This is how WKT1 and + * ESRI spellings of the same thing are reconciled: {@code false_easting}, + * {@code False_Easting} and {@code "False easting"} are one name. + */ + static boolean equalsRelaxed(String a, String b) { + if (a == null || b == null) { + return a == null && b == null; + } + return normalize(a).equals(normalize(b)); + } + + /** + * Lower-cases and removes spaces, underscores, hyphens, apostrophes and full stops. + */ + static String normalize(String s) { + if (s == null) { + return null; + } + StringBuilder sb = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == ' ' || c == '_' || c == '-' || c == '\'' || c == '.' || c == '(' || c == ')') { + continue; + } + sb.append(Character.toLowerCase(c)); + } + return sb.toString(); + } + + // ------------------------------------------------------------------ units + + private static final Map LINEAR_BY_NAME = new HashMap(); + private static final Map ANGULAR_BY_NAME = new HashMap(); + + static { + // Names as WKT1, ESRI WKT and WKT2 spell them; factors as PROJ's UnitOfMeasure defines + // them (9.8.1 src/iso19111/common.cpp). + linear("metre", 1.0); + linear("meter", 1.0); + linear("m", 1.0); + linear("kilometre", 1000.0); + linear("kilometer", 1000.0); + linear("km", 1000.0); + linear("decimetre", 0.1); + linear("centimetre", 0.01); + linear("millimetre", 0.001); + linear("foot", 0.3048); + linear("feet", 0.3048); + linear("ft", 0.3048); + linear("international foot", 0.3048); + linear("US survey foot", 12.0 / 39.37); + linear("Foot_US", 12.0 / 39.37); + linear("us survey feet", 12.0 / 39.37); + linear("usft", 12.0 / 39.37); + linear("Clarke's foot", 0.3047972654); + linear("Foot_Clarke", 0.3047972654); + linear("Indian yard", 0.9143985307444408); + linear("Yard_Indian", 0.9143985307444408); + linear("yard", 0.9144); + linear("Foot_Gold_Coast", 0.3047997101815088); + linear("Gold Coast foot", 0.3047997101815088); + linear("British chain (Sears 1922 truncated)", 20.116756); + linear("Chain", 20.1168); + linear("chain", 20.1168); + linear("link", 0.201168); + linear("fathom", 1.8288); + linear("nautical mile", 1852.0); + linear("Statute Mile", 1609.344); + linear("mile", 1609.344); + linear("inch", 0.0254); + + angular("radian", 1.0); + angular("rad", 1.0); + angular("degree", Math.PI / 180.0); + angular("degrees", Math.PI / 180.0); + angular("Degree", Math.PI / 180.0); + angular("deg", Math.PI / 180.0); + angular("arc-second", Math.PI / 648000.0); + angular("arc-minute", Math.PI / 10800.0); + angular("grad", Math.PI / 200.0); + angular("gradian", Math.PI / 200.0); + angular("Gon", Math.PI / 200.0); + angular("microradian", 1e-6); + angular("sexagesimal DMS", Math.PI / 180.0); + } + + /** + * Repairs the rounding in a declared conversion factor, exactly as PROJ's + * {@code WKTParser::Private::buildUnit} does (9.8.1 {@code src/iso19111/io.cpp}) with the same + * relative tolerance of 1e-10: the ubiquitous {@code 0.0174532925199433} becomes pi/180 + * exactly, and {@code 0.30480060960121924} becomes 12/39.37 exactly. + *

+ * This is not cosmetic. Without it, converting 3 degrees to radians and back yields + * 3.0000000000000004, so a PROJ string built from WKT would differ from the same string built + * from an EPSG code, and every round-trip comparison would fail on the last digit. + */ + private static double repair(double factor) { + double degree = Math.PI / 180.0; + if (Math.abs(factor - degree) < 1e-10 * degree) { + return degree; + } + double usFoot = 12.0 / 39.37; + if (Math.abs(factor - usFoot) < 1e-10 * usFoot) { + return usFoot; + } + return factor; + } + + private static void linear(String name, double factor) { + LINEAR_BY_NAME.put(normalize(name), Double.valueOf(factor)); + } + + private static void angular(String name, double factor) { + ANGULAR_BY_NAME.put(normalize(name), Double.valueOf(factor)); + } + + /** + * Builds a unit from a declared name and factor. The factor wins when it is present and + * positive; when it is not, the name is looked up; when neither works this throws, because a + * silently-assumed unit is a coordinate wrong by a factor of 3.28 or 57.3. + */ + static UnitDefinition unit(String name, double factor, int type, Identifier id) { + if (!Double.isNaN(factor) && factor > 0) { + return new UnitDefinition(name, repair(factor), type, id); + } + Map table = type == UnitDefinition.ANGULAR ? ANGULAR_BY_NAME + : type == UnitDefinition.LINEAR ? LINEAR_BY_NAME : null; + if (table != null && name != null) { + Double f = table.get(normalize(name)); + if (f != null) { + return new UnitDefinition(name, f.doubleValue(), type, id); + } + } + if (type == UnitDefinition.SCALE) { + if (name == null || normalize(name).equals("unity")) { + return UnitDefinition.UNITY; + } + if (normalize(name).startsWith("partspermillion")) { + return UnitDefinition.PPM; + } + } + throw new WktParseException("unit \"" + name + "\" has no conversion factor and is not a " + + "unit this library knows; give it an explicit factor"); + } + + /** + * The PROJ {@code +units=} code for a linear unit, or {@code null} if proj4j has no code for + * it and {@code +to_meter=} must be used instead. + */ + static String projUnitsCode(UnitDefinition unit) { + if (unit == null) { + return null; + } + double f = unit.getConversionFactor(); + Unit[] candidates = Units.units; + for (int i = 0; i < candidates.length; i++) { + Unit u = candidates[i]; + if (u == Units.DEGREES) { + continue; + } + if (Math.abs(u.value - f) <= 1e-12 * Math.max(1.0, Math.abs(f))) { + return u.abbreviation; + } + } + return null; + } + + /** + * The linear unit denoting a PROJ {@code +units=} code, or {@code null}. + */ + static UnitDefinition unitFromProjCode(String code) { + Unit[] candidates = Units.units; + for (int i = 0; i < candidates.length; i++) { + if (candidates[i].abbreviation.equals(code)) { + Unit u = candidates[i]; + return new UnitDefinition(wktNameOfProjUnit(u), u.value, UnitDefinition.LINEAR, + wktIdOfProjUnit(u)); + } + } + return null; + } + + private static String wktNameOfProjUnit(Unit u) { + if (u == Units.METRES) { + return "metre"; + } + if (u == Units.FEET) { + return "foot"; + } + if (u == Units.US_FEET) { + return "US survey foot"; + } + return u.name; + } + + private static Identifier wktIdOfProjUnit(Unit u) { + if (u == Units.METRES) { + return new Identifier("EPSG", "9001"); + } + if (u == Units.FEET) { + return new Identifier("EPSG", "9002"); + } + if (u == Units.US_FEET) { + return new Identifier("EPSG", "9003"); + } + return null; + } + + // ------------------------------------------------------------- ellipsoids + + /** + * The PROJ {@code +ellps=} code for an ellipsoid, matched numerically, or {@code null} if + * none of proj4j's built-in ellipsoids matches and explicit {@code +a=}/{@code +rf=} must be + * emitted. + */ + static String projEllipsoidCode(EllipsoidDefinition e) { + if (e == null || Double.isNaN(e.getSemiMajorAxis())) { + return null; + } + double a = e.getSemiMajorAxisMetres(); + double rf = inverseFlatteningOf(e); + Ellipsoid[] all = Ellipsoid.ellipsoids; + String best = null; + double bestDelta = Double.MAX_VALUE; + for (int i = 0; i < all.length; i++) { + Ellipsoid c = all[i]; + if (Math.abs(c.equatorRadius - a) > A_TOLERANCE) { + continue; + } + boolean cSphere = c.eccentricity2 == 0.0; + if ((rf == 0.0) != cSphere) { + continue; + } + double crf = cSphere ? 0.0 : 1.0 / (1.0 - Math.sqrt(1.0 - c.eccentricity2)); + double delta = Math.abs(crf - rf); + if (delta <= RF_TOLERANCE && delta < bestDelta) { + best = c.shortName; + bestDelta = delta; + } + } + return best; + } + + /** + * The inverse flattening of a declared ellipsoid, computed from the semi-minor axis when that + * is what the document carried. Zero denotes a sphere. + */ + static double inverseFlatteningOf(EllipsoidDefinition e) { + double rf = e.getInverseFlattening(); + if (!Double.isNaN(rf)) { + return rf; + } + double a = e.getSemiMajorAxis(); + double b = e.getSemiMinorAxis(); + if (Double.isNaN(b) || a == b) { + return 0.0; + } + return a / (a - b); + } + + /** + * A definition describing one of proj4j's ellipsoids, for the writers. + */ + static EllipsoidDefinition definitionOf(Ellipsoid e) { + EllipsoidDefinition d = new EllipsoidDefinition(); + d.setName(wktEllipsoidName(e)); + d.setSemiMajorAxis(e.equatorRadius); + d.setUnit(UnitDefinition.METRE); + if (e.eccentricity2 == 0.0) { + d.setInverseFlattening(0.0); + d.setSemiMinorAxis(e.equatorRadius); + } else { + d.setInverseFlattening(1.0 / (1.0 - Math.sqrt(1.0 - e.eccentricity2))); + } + Identifier id = ELLIPSOID_IDS.get(e.shortName); + if (id != null) { + d.setId(id); + } + return d; + } + + private static final Map ELLIPSOID_WKT_NAMES = new HashMap(); + private static final Map ELLIPSOID_IDS = new HashMap(); + + static { + ellipsoid("WGS84", "WGS 84", "7030"); + ellipsoid("GRS80", "GRS 1980", "7019"); + ellipsoid("clrk66", "Clarke 1866", "7008"); + ellipsoid("clrk80", "Clarke 1880 (RGS)", "7012"); + ellipsoid("bessel", "Bessel 1841", "7004"); + ellipsoid("airy", "Airy 1830", "7001"); + ellipsoid("mod_airy", "Airy Modified 1849", "7002"); + ellipsoid("intl", "International 1924", "7022"); + ellipsoid("krass", "Krassowsky 1940", "7024"); + ellipsoid("WGS72", "WGS 72", "7043"); + ellipsoid("WGS66", "WGS 66", "7025"); + ellipsoid("evrst30", "Everest 1830 (1937 Adjustment)", "7015"); + ellipsoid("aust_SA", "Australian National Spheroid", "7003"); + ellipsoid("sphere", "Sphere", "7035"); + ellipsoid("GRS67", "GRS 1967", "7036"); + ellipsoid("helmert", "Helmert 1906", "7020"); + ellipsoid("hough", "Hough 1960", null); + ellipsoid("NAD27", "Clarke 1880 mod.", null); + ellipsoid("NAD83", "GRS 1980", "7019"); + } + + private static void ellipsoid(String projCode, String wktName, String epsgCode) { + ELLIPSOID_WKT_NAMES.put(projCode, wktName); + if (epsgCode != null) { + ELLIPSOID_IDS.put(projCode, new Identifier("EPSG", epsgCode)); + } + } + + static String wktEllipsoidName(Ellipsoid e) { + String n = ELLIPSOID_WKT_NAMES.get(e.shortName); + if (n != null) { + return n; + } + return e.name != null ? e.name : e.shortName; + } + + // ----------------------------------------------------------------- datums + + private static final Map DATUM_CODES = new HashMap(); + + static { + // WKT1, ESRI and WKT2 spellings of the datums proj4j has a +datum= code for. ESRI + // prefixes geodetic datum names with "D_", which normalize() does not remove, so both + // spellings are listed. + datum("WGS84", "WGS_1984", "WGS 1984", "WGS84", "World Geodetic System 1984", + "D_WGS_1984", "WGS_1984_(G873)"); + datum("NAD83", "North_American_Datum_1983", "North American Datum 1983", "NAD83", + "D_North_American_1983", "NAD_1983"); + datum("NAD27", "North_American_Datum_1927", "North American Datum 1927", "NAD27", + "D_North_American_1927", "NAD_1927"); + datum("OSGB36", "OSGB_1936", "OSGB 1936", "D_OSGB_1936", "Ordnance Survey of Great " + + "Britain 1936"); + datum("potsdam", "Deutsches_Hauptdreiecksnetz", "Deutsches Hauptdreiecksnetz", + "D_Deutsches_Hauptdreiecksnetz", "Potsdam Rauenberg 1950 DHDN"); + datum("carthage", "Carthage", "D_Carthage", "Carthage 1934 Tunisia"); + datum("hermannskogel", "Militar_Geographische_Institut", + "Militar-Geographische Institut", "D_MGI", "Hermannskogel"); + datum("ire65", "TM65", "D_TM65", "Ireland 1965"); + datum("nzgd49", "New_Zealand_Geodetic_Datum_1949", "New Zealand Geodetic Datum 1949", + "D_New_Zealand_1949", "NZGD49"); + datum("GGRS87", "Greek_Geodetic_Reference_System_1987", + "Greek Geodetic Reference System 1987", "D_GGRS_1987", "GGRS87"); + } + + private static void datum(String projCode, String... names) { + for (int i = 0; i < names.length; i++) { + DATUM_CODES.put(normalize(names[i]), projCode); + } + } + + /** + * The PROJ {@code +datum=} code a declared datum name denotes, or {@code null} if proj4j has + * no built-in datum for it. Only names are consulted: two datums can share an ellipsoid, so + * a numeric match would be wrong here. + */ + static String projDatumCode(String datumName) { + if (datumName == null) { + return null; + } + return DATUM_CODES.get(normalize(datumName)); + } + + /** + * The WKT datum name for one of proj4j's built-in datums, for the writers. + */ + static String wktDatumName(Datum datum) { + if (datum == null) { + return "Unknown datum"; + } + String code = datum.getCode(); + if ("WGS84".equals(code)) { + return "World Geodetic System 1984"; + } + if ("NAD83".equals(code)) { + return "North American Datum 1983"; + } + if ("NAD27".equals(code)) { + return "North American Datum 1927"; + } + if ("OSGB36".equals(code)) { + return "OSGB 1936"; + } + String name = datum.getName(); + return name != null ? name : code; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktNode.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktNode.java new file mode 100644 index 0000000..6f0158a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktNode.java @@ -0,0 +1,223 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * A node of a parsed WKT tree. + *

+ * The representation follows PROJ's own {@code WKTNode} (9.8.1 {@code src/iso19111/io.cpp}): + * every element is a node carrying a textual value plus a list of child nodes, and a leaf value + * such as a number, a quoted name or a bare direction keyword is simply a node with no children. + * So {@code AXIS["Easting",east]} is a node {@code AXIS} with two childless children, + * {@code "Easting"} (quoted) and {@code east} (not quoted). + *

+ * There is no builder: instances are created fully formed by {@link #quoted(String)}, + * {@link #literal(String)}, {@link #number(double)} and {@link #of(String, List)}, and the + * constructor defensively copies the child list and wraps it unmodifiable. An instance is therefore + * immutable from the moment it exists, and a tree is freely shareable across threads. + */ +public final class WktNode { + + private final String value; + private final boolean quoted; + private final boolean leaf; + private final List children; + + WktNode(String value, boolean quoted, boolean leaf, List children) { + this.value = value; + this.quoted = quoted; + this.leaf = leaf; + this.children = children == null || children.isEmpty() + ? Collections.emptyList() + : Collections.unmodifiableList(new ArrayList(children)); + } + + /** + * Creates a childless leaf node holding a quoted string. + */ + public static WktNode quoted(String text) { + return new WktNode(text, true, true, null); + } + + /** + * Creates a childless leaf node holding an unquoted token: a number, a direction keyword or + * a date-time literal. + */ + public static WktNode literal(String text) { + return new WktNode(text, false, true, null); + } + + /** + * Creates a childless leaf node holding a number, formatted the way WKT expects. + */ + public static WktNode number(double v) { + return new WktNode(WktFormat.number(v), false, true, null); + } + + /** + * Creates a keyword node with the given children, which may be empty: {@code MYNODE[]} is a + * node, not a leaf. + */ + public static WktNode of(String keyword, List children) { + return new WktNode(keyword, false, false, children); + } + + /** + * The keyword of this node, or the literal text if this is a leaf. + */ + public String value() { + return value; + } + + /** + * Same as {@link #value()}, named for readability at call sites that expect a keyword. + */ + public String keyword() { + return value; + } + + /** + * Whether this node's value appeared inside double quotes in the source text. Only leaves + * can be quoted. + */ + public boolean isQuoted() { + return quoted; + } + + /** + * Whether this is a value token rather than a bracketed element. An element with no children + * ({@code MYNODE[]}) is not a leaf. + */ + public boolean isLeaf() { + return leaf; + } + + public List children() { + return children; + } + + public int childCount() { + return children.size(); + } + + /** + * The child at {@code index}, or {@code null} if there is none. + */ + public WktNode child(int index) { + return index >= 0 && index < children.size() ? children.get(index) : null; + } + + /** + * The first child whose keyword equals (ignoring case) any of {@code keywords}, or + * {@code null}. + */ + public WktNode find(String... keywords) { + for (int i = 0; i < children.size(); i++) { + WktNode c = children.get(i); + if (c.isLeaf() && c.quoted) { + continue; + } + for (int k = 0; k < keywords.length; k++) { + if (c.value.equalsIgnoreCase(keywords[k])) { + return c; + } + } + } + return null; + } + + /** + * Every child whose keyword equals (ignoring case) any of {@code keywords}, in order. + */ + public List findAll(String... keywords) { + List out = new ArrayList(); + for (int i = 0; i < children.size(); i++) { + WktNode c = children.get(i); + if (c.isLeaf() && c.quoted) { + continue; + } + for (int k = 0; k < keywords.length; k++) { + if (c.value.equalsIgnoreCase(keywords[k])) { + out.add(c); + break; + } + } + } + return out; + } + + public boolean is(String... keywords) { + for (int k = 0; k < keywords.length; k++) { + if (value.equalsIgnoreCase(keywords[k])) { + return true; + } + } + return false; + } + + /** + * The text of child {@code index}, which must exist. + * + * @throws WktParseException if there is no such child + */ + public String textAt(int index) { + WktNode c = child(index); + if (c == null) { + throw new WktParseException("missing value #" + (index + 1) + " in " + value + "[]"); + } + return c.value; + } + + /** + * The numeric value of child {@code index}, which must exist and must parse as a number. + * + * @throws WktParseException if there is no such child, or it is not numeric + */ + public double doubleAt(int index) { + WktNode c = child(index); + if (c == null) { + throw new WktParseException("missing numeric value #" + (index + 1) + + " in " + value + "[]"); + } + return c.asDouble(); + } + + /** + * This node's value as a number. + * + * @throws WktParseException if the value is not numeric + */ + public double asDouble() { + try { + return Double.parseDouble(value.trim()); + } catch (NumberFormatException e) { + throw new WktParseException("expected a number but found \"" + value + "\"", e); + } + } + + /** + * Formats this node as single-line WKT. + */ + public String toString() { + StringBuilder sb = new StringBuilder(); + WktFormat.append(this, sb, null, 0); + return sb.toString(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktParseException.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktParseException.java new file mode 100644 index 0000000..775bd6d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktParseException.java @@ -0,0 +1,38 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import org.locationtech.proj4j.Proj4jException; + +/** + * Thrown when a WKT or PROJJSON definition cannot be parsed, or can be parsed but does not + * describe a coordinate reference system this library can represent. + *

+ * This is the analogue of PROJ's {@code ParsingException}. It is unchecked, like every other + * exception in this library. + */ +public class WktParseException extends Proj4jException { + + private static final long serialVersionUID = 1L; + + public WktParseException(String message) { + super(message); + } + + public WktParseException(String message, Exception cause) { + super(message, cause); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktParser.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktParser.java new file mode 100644 index 0000000..8306cec --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktParser.java @@ -0,0 +1,180 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.List; + +/** + * Turns WKT text into a {@link WktNode} tree. Purely syntactic: it knows about brackets, quoted + * strings and tokens, and nothing at all about coordinate reference systems. + *

+ * Accepts both bracket flavours ({@code [ ]} and {@code ( )}), like PROJ, and both quote + * conventions: WKT2 doubles an embedded quote ({@code ""}), which is collapsed to a single one. + * A trailing comma before a closing bracket is rejected, as are unbalanced brackets and + * unterminated strings. + *

+ * Nesting is bounded by {@link WktLimits#MAX_DEPTH}. The recursion costs one stack frame per two + * bytes of input, so on an untrusted document an unbounded parser is a {@link StackOverflowError} + * away from taking down the thread that called it. + */ +public final class WktParser { + + private final String text; + private int pos; + + private WktParser(String text) { + this.text = text; + this.pos = 0; + } + + /** + * Parses {@code wkt} into a tree. + * + * @throws WktParseException if the text is not syntactically well-formed WKT + */ + public static WktNode parse(String wkt) { + if (wkt == null) { + throw new WktParseException("WKT text is null"); + } + WktParser p = new WktParser(wkt); + p.skipWhitespace(); + if (p.pos >= p.text.length()) { + throw new WktParseException("WKT text is empty"); + } + WktNode root = p.parseNode(1); + p.skipWhitespace(); + if (p.pos < p.text.length()) { + throw new WktParseException("unexpected trailing text at offset " + p.pos + ": \"" + + p.snippet(p.pos) + "\""); + } + if (root.isLeaf()) { + throw new WktParseException("not a WKT element: \"" + root.value() + "\""); + } + return root; + } + + /** + * Parses one node. {@code depth} is the node's own level in the tree, the root being 1 and a + * leaf counting as a level of its own, so the guard bounds the recursion itself rather than + * some quantity derived from it. + */ + private WktNode parseNode(int depth) { + if (depth > WktLimits.MAX_DEPTH) { + throw new WktParseException("WKT nested more than " + WktLimits.MAX_DEPTH + + " deep at offset " + pos + "; refusing to recurse further"); + } + skipWhitespace(); + if (pos >= text.length()) { + throw new WktParseException("unexpected end of WKT text"); + } + char c = text.charAt(pos); + if (c == '"') { + return WktNode.quoted(parseQuotedString()); + } + String token = parseToken(); + skipWhitespace(); + if (pos < text.length() && (text.charAt(pos) == '[' || text.charAt(pos) == '(')) { + char open = text.charAt(pos); + char close = open == '[' ? ']' : ')'; + pos++; + List children = new ArrayList(); + skipWhitespace(); + if (pos < text.length() && text.charAt(pos) == close) { + pos++; + return WktNode.of(token, children); + } + while (true) { + children.add(parseNode(depth + 1)); + skipWhitespace(); + if (pos >= text.length()) { + throw new WktParseException("unbalanced '" + open + "' in WKT: missing '" + + close + "' for " + token); + } + char d = text.charAt(pos); + if (d == ',') { + pos++; + skipWhitespace(); + if (pos < text.length() && (text.charAt(pos) == ']' || text.charAt(pos) == ')')) { + throw new WktParseException("trailing comma in " + token + "[] at offset " + + pos); + } + continue; + } + if (d == ']' || d == ')') { + // PROJ tolerates a mismatched flavour of closing bracket; so do we, since + // real-world WKT1 from some producers mixes them. + pos++; + break; + } + throw new WktParseException("expected ',' or '" + close + "' at offset " + pos + + " in " + token + "[], found \"" + snippet(pos) + "\""); + } + return WktNode.of(token, children); + } + if (token.length() == 0) { + throw new WktParseException("unexpected character '" + c + "' at offset " + pos); + } + return WktNode.literal(token); + } + + private String parseQuotedString() { + // text.charAt(pos) == '"' + pos++; + StringBuilder sb = new StringBuilder(); + while (true) { + if (pos >= text.length()) { + throw new WktParseException("unterminated quoted string in WKT"); + } + char c = text.charAt(pos); + if (c == '"') { + if (pos + 1 < text.length() && text.charAt(pos + 1) == '"') { + sb.append('"'); + pos += 2; + continue; + } + pos++; + return sb.toString(); + } + sb.append(c); + pos++; + } + } + + private String parseToken() { + int start = pos; + while (pos < text.length()) { + char c = text.charAt(pos); + if (c == ',' || c == '[' || c == ']' || c == '(' || c == ')' || c == '"' + || Character.isWhitespace(c)) { + break; + } + pos++; + } + return text.substring(start, pos); + } + + private void skipWhitespace() { + while (pos < text.length() && Character.isWhitespace(text.charAt(pos))) { + pos++; + } + } + + private String snippet(int from) { + int to = Math.min(text.length(), from + 20); + return text.substring(from, to); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktReader.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktReader.java new file mode 100644 index 0000000..4801a22 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktReader.java @@ -0,0 +1,923 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.List; +import java.util.Locale; + +import org.locationtech.proj4j.CoordinateReferenceSystem; + +/** + * Reads WKT into a {@link CrsDefinition}, and from there into a + * {@link CoordinateReferenceSystem}. + *

+ * All four dialects of {@link WktDialect} are accepted, auto-detected, and no dependency is + * involved: this class and its package are plain JDK code, so a consumer needing WKT support does + * not need a second artifact and does not need Apache SIS or GeoAPI on the classpath. + *

+ * Axis order is governed by {@link AxisOrderPolicy}, which defaults to + * {@link AxisOrderPolicy#LEGACY} — longitude-first, exactly as proj4j 1.4.3 behaves. The + * {@code AXIS[]} clauses are parsed faithfully and retained on the returned + * {@link CrsDefinition} whatever the policy; the policy decides only what the produced + * {@link CoordinateReferenceSystem} does with them. + *

+ * Instances are immutable and safe to share between threads. + * + *

+ * CoordinateReferenceSystem crs = new WktReader().read(wkt);
+ * CrsDefinition def = new WktReader().readDefinition(wkt);   // to inspect declared axes, ids
+ * 
+ */ +public final class WktReader { + + private final AxisOrderPolicy axisOrderPolicy; + + /** + * A reader with the default {@link AxisOrderPolicy#LEGACY} policy. + */ + public WktReader() { + this(AxisOrderPolicy.LEGACY); + } + + /** + * A reader with an explicit axis order policy. + * + * @param axisOrderPolicy how declared axis order affects the CRSs this reader builds + */ + public WktReader(AxisOrderPolicy axisOrderPolicy) { + if (axisOrderPolicy == null) { + throw new IllegalArgumentException("axisOrderPolicy is null"); + } + this.axisOrderPolicy = axisOrderPolicy; + } + + public AxisOrderPolicy getAxisOrderPolicy() { + return axisOrderPolicy; + } + + /** + * Parses {@code wkt} into a definition, retaining everything the document said. + * + * @throws WktParseException if the text is not well-formed WKT, or describes something this + * library cannot represent + */ + public CrsDefinition readDefinition(String wkt) { + WktNode root = WktParser.parse(wkt); + // Dialect detection runs on the text, not the tree, because PROJ's own rule is textual: + // it asks whether "AXIS[" and "AUTHORITY[" appear anywhere at all. + WktDialect dialect = WktDialect.guess(wkt); + CrsDefinition def = new Impl(dialect).crs(root, null, null, 1); + markDialect(def, dialect); + return def; + } + + /** + * Parses {@code wkt} and builds a proj4j CRS from it, applying this reader's + * {@link AxisOrderPolicy}. + * + * @throws WktParseException if the text cannot be parsed + * @throws org.locationtech.proj4j.UnsupportedParameterException if it describes a projection + * proj4j does not implement + */ + public CoordinateReferenceSystem read(String wkt) { + return CrsDefinitions.toCrs(readDefinition(wkt), axisOrderPolicy); + } + + /** + * Detects which dialect {@code wkt} is written in. + */ + public static WktDialect dialectOf(String wkt) { + return WktDialect.guess(wkt); + } + + private static void markDialect(CrsDefinition def, WktDialect dialect) { + def.setSourceDialect(dialect); + if (def.getBaseCrs() != null) { + markDialect(def.getBaseCrs(), dialect); + } + if (def.getHubCrs() != null) { + markDialect(def.getHubCrs(), dialect); + } + for (int i = 0; i < def.getComponents().size(); i++) { + markDialect(def.getComponents().get(i), dialect); + } + } + + /** + * The traversal itself. One instance per parse, so the dialect can be a field. + */ + private static final class Impl { + + private final WktDialect dialect; + + Impl(WktDialect dialect) { + this.dialect = dialect; + } + + // ------------------------------------------------------------ dispatch + + /** + * Dispatches on the keyword of a CRS element. + *

+ * {@code depth} counts nested coordinate reference systems, the outermost being 1, and is + * bounded by {@link WktLimits#MAX_CRS_DEPTH}. {@link WktParser} has already bounded the + * tree, but the semantic walk is a second recursion over that tree — + * {@code crs -> compound -> crs} and {@code crs -> bound -> crs} — so it carries its own, + * lower limit rather than inheriting a bound by accident. + */ + CrsDefinition crs(WktNode node, UnitDefinition inheritedAngular, + UnitDefinition inheritedLinear, int depth) { + if (depth > WktLimits.MAX_CRS_DEPTH) { + throw new WktParseException("CRSs nested more than " + WktLimits.MAX_CRS_DEPTH + + " deep in WKT at \"" + node.keyword() + "\"; refusing to recurse further"); + } + // Locale.ROOT: WKT keywords are ASCII and are compared against ASCII literals. + // Under tr_TR a lower-case "id" would upper-case to "\u0130D" and never match "ID". + String k = node.keyword().toUpperCase(Locale.ROOT); + if (k.equals("GEOGCRS") || k.equals("GEOGRAPHICCRS") || k.equals("BASEGEOGCRS") + || k.equals("GEODCRS") || k.equals("GEODETICCRS") || k.equals("BASEGEODCRS")) { + return geodeticWkt2(node, inheritedAngular); + } + if (k.equals("PROJCRS") || k.equals("PROJECTEDCRS") || k.equals("BASEPROJCRS")) { + return projectedWkt2(node); + } + if (k.equals("VERTCRS") || k.equals("VERTICALCRS") || k.equals("BASEVERTCRS")) { + return verticalWkt2(node); + } + if (k.equals("COMPOUNDCRS")) { + return compound(node, false, depth); + } + if (k.equals("BOUNDCRS")) { + return bound(node, depth); + } + if (k.equals("ENGCRS") || k.equals("ENGINEERINGCRS")) { + return engineering(node, true); + } + if (k.equals("GEOGCS")) { + return geographicWkt1(node); + } + if (k.equals("PROJCS")) { + return projectedWkt1(node); + } + if (k.equals("GEOCCS")) { + return geocentricWkt1(node); + } + if (k.equals("VERT_CS") || k.equals("VERTCS")) { + return verticalWkt1(node); + } + if (k.equals("COMPD_CS")) { + return compound(node, true, depth); + } + if (k.equals("LOCAL_CS")) { + return engineering(node, false); + } + if (k.equals("TIMECRS") || k.equals("PARAMETRICCRS")) { + throw new WktParseException(node.keyword() + + " is not a coordinate reference system this library supports"); + } + if (k.equals("FITTED_CS")) { + throw new WktParseException("FITTED_CS is not supported"); + } + throw new WktParseException("unrecognised CRS element \"" + node.keyword() + "\""); + } + + // ------------------------------------------------------------- WKT2 CRS + + private CrsDefinition geodeticWkt2(WktNode node, UnitDefinition inheritedAngular) { + CrsDefinition def = new CrsDefinition(); + def.setName(name(node)); + DatumDefinition datum = datumWkt2(node); + def.setDatum(datum); + + UnitDefinition angular = firstUnit(node, UnitDefinition.ANGULAR); + if (angular == null) { + angular = inheritedAngular; + } + WktNode csNode = node.find("CS"); + UnitDefinition csUnit = angular != null ? angular : UnitDefinition.DEGREE; + CoordinateSystemDefinition cs = coordinateSystem(node, csNode, csUnit); + if (cs.getAxes().isEmpty()) { + // A WKT2 BASEGEOGCRS carries no CS at all — the standard says the base CRS's + // coordinate system is implied. PROJ implies EPSG:6422, latitude then longitude, + // and so do we: the axes are then present to be retained, and the policy at the + // boundary decides what they mean. + cs.setType(CoordinateSystemDefinition.ELLIPSOIDAL); + cs.addAxis(new AxisDefinition("Geodetic latitude", "Lat", AxisDefinition.NORTH, + csUnit)); + cs.addAxis(new AxisDefinition("Geodetic longitude", "Lon", AxisDefinition.EAST, + csUnit)); + } + def.setCoordinateSystem(cs); + + WktNode pm = node.find("PRIMEM", "PRIMEMERIDIAN"); + if (pm != null) { + datum.setPrimeMeridian(primeMeridian(pm, + angular != null ? angular : UnitDefinition.DEGREE)); + } else if (datum.getPrimeMeridian() == null) { + datum.setPrimeMeridian(PrimeMeridianDefinition.greenwich()); + } + + boolean geocentric = CoordinateSystemDefinition.CARTESIAN.equalsIgnoreCase(cs.getType()) + || (cs.getAxes().size() == 3 && isGeocentricAxes(cs)); + def.setKind(geocentric ? CrsDefinition.Kind.GEOCENTRIC + : CrsDefinition.Kind.GEOGRAPHIC); + metadata(node, def); + return def; + } + + private boolean isGeocentricAxes(CoordinateSystemDefinition cs) { + List axes = cs.getAxes(); + for (int i = 0; i < axes.size(); i++) { + String d = axes.get(i).getDirection(); + if (AxisDefinition.GEOCENTRIC_X.equals(d) || AxisDefinition.GEOCENTRIC_Y.equals(d) + || AxisDefinition.GEOCENTRIC_Z.equals(d)) { + return true; + } + } + return false; + } + + private CrsDefinition projectedWkt2(WktNode node) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.PROJECTED); + def.setName(name(node)); + + WktNode base = node.find("BASEGEOGCRS", "BASEGEODCRS", "BASEGEOGRAPHICCRS"); + if (base == null) { + throw new WktParseException("PROJCRS[] has no BASEGEOGCRS[] or BASEGEODCRS[]"); + } + CrsDefinition baseCrs = geodeticWkt2(base, UnitDefinition.DEGREE); + def.setBaseCrs(baseCrs); + + WktNode conv = node.find("CONVERSION", "DERIVINGCONVERSION"); + if (conv == null) { + throw new WktParseException("PROJCRS[] has no CONVERSION[]"); + } + UnitDefinition linear = firstUnit(node, UnitDefinition.LINEAR); + UnitDefinition baseAngular = baseCrs.getCoordinateSystem() == null ? UnitDefinition.DEGREE + : defaultAngularUnit(baseCrs.getCoordinateSystem()); + def.setConversion(conversionWkt2(conv, linear, baseAngular)); + + CoordinateSystemDefinition cs = coordinateSystem(node, node.find("CS"), + linear != null ? linear : UnitDefinition.METRE); + def.setCoordinateSystem(cs); + metadata(node, def); + return def; + } + + private CrsDefinition verticalWkt2(WktNode node) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.VERTICAL); + def.setName(name(node)); + WktNode vd = node.find("VDATUM", "VERTICALDATUM", "VRF", "VERTICALREFERENCEFRAME", + "ENSEMBLE"); + if (vd != null) { + DatumDefinition datum = new DatumDefinition(); + datum.setName(name(vd)); + datum.setId(id(vd)); + def.setDatum(datum); + } + UnitDefinition linear = firstUnit(node, UnitDefinition.LINEAR); + def.setCoordinateSystem(coordinateSystem(node, node.find("CS"), + linear != null ? linear : UnitDefinition.METRE)); + metadata(node, def); + return def; + } + + private CrsDefinition compound(WktNode node, boolean wkt1, int depth) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.COMPOUND); + def.setName(name(node)); + List children = node.children(); + for (int i = 0; i < children.size(); i++) { + WktNode c = children.get(i); + if (c.isLeaf() || isMetadata(c)) { + continue; + } + def.addComponent(crs(c, null, null, depth + 1)); + } + if (def.getComponents().isEmpty()) { + throw new WktParseException((wkt1 ? "COMPD_CS" : "COMPOUNDCRS") + + "[] has no component CRSs"); + } + metadata(node, def); + return def; + } + + private CrsDefinition bound(WktNode node, int depth) { + WktNode source = node.find("SOURCECRS"); + WktNode target = node.find("TARGETCRS"); + WktNode transformation = node.find("ABRIDGEDTRANSFORMATION"); + if (source == null || source.childCount() == 0) { + throw new WktParseException("BOUNDCRS[] has no SOURCECRS[]"); + } + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.BOUND); + CrsDefinition sourceCrs = crs(source.child(0), null, null, depth + 1); + def.setBaseCrs(sourceCrs); + def.setName(sourceCrs.getName()); + if (target != null && target.childCount() > 0) { + def.setHubCrs(crs(target.child(0), null, null, depth + 1)); + } + if (transformation != null) { + def.setToWgs84(helmert(transformation)); + } + metadata(node, def); + return def; + } + + private CrsDefinition engineering(WktNode node, boolean wkt2) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.ENGINEERING); + def.setName(name(node)); + UnitDefinition linear = firstUnit(node, UnitDefinition.LINEAR); + def.setCoordinateSystem(coordinateSystem(node, node.find("CS"), + linear != null ? linear : UnitDefinition.METRE)); + metadata(node, def); + return def; + } + + // ------------------------------------------------------------- WKT1 CRS + + private CrsDefinition geographicWkt1(WktNode node) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.GEOGRAPHIC); + def.setName(name(node)); + UnitDefinition angular = unit(node.find("UNIT"), UnitDefinition.ANGULAR); + if (angular == null) { + angular = UnitDefinition.DEGREE; + } + DatumDefinition datum = datumWkt1(node, def); + def.setDatum(datum); + WktNode pm = node.find("PRIMEM", "PRIMEMERIDIAN"); + // OGC 01-009: the WKT1 PRIMEM longitude is in degrees, whatever the GEOGCS UNIT says. + datum.setPrimeMeridian(pm == null ? PrimeMeridianDefinition.greenwich() + : primeMeridian(pm, UnitDefinition.DEGREE)); + CoordinateSystemDefinition cs = coordinateSystem(node, null, angular); + if (cs.getAxes().isEmpty()) { + // OGC 01-009 and GDAL's practice: a GEOGCS with no AXIS clauses is + // longitude-first. Stating it explicitly means no caller has to infer it. + cs.addAxis(new AxisDefinition("Longitude", "lon", AxisDefinition.EAST, angular)); + cs.addAxis(new AxisDefinition("Latitude", "lat", AxisDefinition.NORTH, angular)); + } + def.setCoordinateSystem(cs); + metadata(node, def); + return def; + } + + private CrsDefinition geocentricWkt1(WktNode node) { + CrsDefinition def = geographicWkt1(node); + def.setKind(CrsDefinition.Kind.GEOCENTRIC); + UnitDefinition linear = unit(node.find("UNIT"), UnitDefinition.LINEAR); + if (linear != null) { + def.getCoordinateSystem().setUnit(linear); + def.getCoordinateSystem().setType(CoordinateSystemDefinition.CARTESIAN); + } + return def; + } + + private CrsDefinition projectedWkt1(WktNode node) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.PROJECTED); + def.setName(name(node)); + + WktNode geogcs = node.find("GEOGCS"); + if (geogcs == null) { + throw new WktParseException("PROJCS[] has no GEOGCS[]"); + } + CrsDefinition baseCrs = geographicWkt1(geogcs); + def.setBaseCrs(baseCrs); + + UnitDefinition linear = unit(node.find("UNIT"), UnitDefinition.LINEAR); + if (linear == null) { + linear = UnitDefinition.METRE; + } + UnitDefinition baseAngular = defaultAngularUnit(baseCrs.getCoordinateSystem()); + + WktNode projection = node.find("PROJECTION"); + if (projection == null) { + throw new WktParseException("PROJCS[\"" + def.getName() + + "\"] has no PROJECTION[]"); + } + ConversionDefinition conv = new ConversionDefinition(); + conv.setName("unnamed"); + conv.setMethodName(name(projection)); + conv.setMethodId(id(projection)); + List params = node.findAll("PARAMETER"); + for (int i = 0; i < params.size(); i++) { + WktNode p = params.get(i); + ParameterDefinition param = new ParameterDefinition(); + param.setName(name(p)); + param.setValue(p.doubleAt(1)); + param.setUnit(WktMethods.isAngularParameter(param.getName()) ? baseAngular + : WktMethods.isScaleParameter(param.getName()) ? UnitDefinition.UNITY + : linear); + param.setId(id(p)); + conv.addParameter(param); + } + def.setConversion(conv); + + CoordinateSystemDefinition cs = coordinateSystem(node, null, linear); + if (cs.getAxes().isEmpty()) { + // A PROJCS with no AXIS clauses is easting then northing, as GDAL assumes. + cs.addAxis(new AxisDefinition("Easting", "E", AxisDefinition.EAST, linear)); + cs.addAxis(new AxisDefinition("Northing", "N", AxisDefinition.NORTH, linear)); + } + def.setCoordinateSystem(cs); + WktNode extension = node.find("EXTENSION"); + if (extension != null && extension.childCount() >= 2 + && "PROJ4".equalsIgnoreCase(extension.textAt(0))) { + def.setProj4Extension(extension.textAt(1)); + } + metadata(node, def); + return def; + } + + private CrsDefinition verticalWkt1(WktNode node) { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.VERTICAL); + def.setName(name(node)); + WktNode vd = node.find("VERT_DATUM", "VDATUM"); + if (vd != null) { + DatumDefinition datum = new DatumDefinition(); + datum.setName(name(vd)); + datum.setId(id(vd)); + def.setDatum(datum); + } + UnitDefinition linear = unit(node.find("UNIT"), UnitDefinition.LINEAR); + def.setCoordinateSystem(coordinateSystem(node, null, + linear != null ? linear : UnitDefinition.METRE)); + metadata(node, def); + return def; + } + + // -------------------------------------------------------------- pieces + + private DatumDefinition datumWkt2(WktNode node) { + WktNode dn = node.find("DATUM", "GEODETICDATUM", "TRF", "GEODETICREFERENCEFRAME"); + boolean ensemble = false; + if (dn == null) { + dn = node.find("ENSEMBLE"); + ensemble = dn != null; + } + if (dn == null) { + throw new WktParseException(node.keyword() + + "[] has no DATUM[], GEODETICREFERENCEFRAME[] or ENSEMBLE[]"); + } + DatumDefinition datum = new DatumDefinition(); + datum.setName(name(dn)); + datum.setId(id(dn)); + WktNode anchor = dn.find("ANCHOR", "ANCHOREPOCH"); + if (anchor != null && anchor.childCount() > 0) { + datum.setAnchor(anchor.textAt(0)); + } + WktNode ell = dn.find("ELLIPSOID", "SPHEROID"); + if (ell == null && ensemble) { + // A datum ensemble carries the ellipsoid of its members; PROJ writes it inside + // the ENSEMBLE, and so does every EPSG-derived WKT2:2019 document. + ell = dn.find("ELLIPSOID"); + } + if (ell != null) { + datum.setEllipsoid(ellipsoid(ell)); + } else if (!ensemble) { + throw new WktParseException("DATUM[\"" + datum.getName() + + "\"] has no ELLIPSOID[]"); + } + WktNode dynamic = node.find("DYNAMIC"); + if (dynamic != null) { + WktNode epoch = dynamic.find("FRAMEEPOCH"); + if (epoch != null && epoch.childCount() > 0) { + datum.setFrameEpoch(epoch.doubleAt(0)); + } + } + return datum; + } + + private DatumDefinition datumWkt1(WktNode node, CrsDefinition def) { + WktNode dn = node.find("DATUM"); + if (dn == null) { + throw new WktParseException(node.keyword() + "[] has no DATUM[]"); + } + DatumDefinition datum = new DatumDefinition(); + datum.setName(name(dn)); + datum.setId(id(dn)); + WktNode ell = dn.find("SPHEROID", "ELLIPSOID"); + if (ell == null) { + throw new WktParseException("DATUM[\"" + datum.getName() + + "\"] has no SPHEROID[]"); + } + datum.setEllipsoid(ellipsoid(ell)); + WktNode towgs84 = dn.find("TOWGS84"); + if (towgs84 != null) { + def.setToWgs84(toWgs84(towgs84)); + } + return datum; + } + + private EllipsoidDefinition ellipsoid(WktNode node) { + EllipsoidDefinition e = new EllipsoidDefinition(); + e.setName(name(node)); + e.setSemiMajorAxis(node.doubleAt(1)); + double second = node.childCount() > 2 && isNumeric(node.child(2)) + ? node.doubleAt(2) : Double.NaN; + e.setInverseFlattening(second); + UnitDefinition u = unit(node.find("LENGTHUNIT", "UNIT"), UnitDefinition.LINEAR); + e.setUnit(u != null ? u : UnitDefinition.METRE); + e.setId(id(node)); + if (Double.isNaN(second)) { + throw new WktParseException("ELLIPSOID[\"" + e.getName() + + "\"] has no inverse flattening"); + } + return e; + } + + private PrimeMeridianDefinition primeMeridian(WktNode node, UnitDefinition defaultUnit) { + PrimeMeridianDefinition pm = new PrimeMeridianDefinition(); + pm.setName(name(node)); + pm.setLongitude(node.childCount() > 1 ? node.doubleAt(1) : 0.0); + UnitDefinition u = unit(node.find("ANGLEUNIT", "UNIT"), UnitDefinition.ANGULAR); + pm.setUnit(u != null ? u : defaultUnit); + pm.setId(id(node)); + return pm; + } + + private ConversionDefinition conversionWkt2(WktNode node, UnitDefinition defaultLinear, + UnitDefinition defaultAngular) { + ConversionDefinition conv = new ConversionDefinition(); + conv.setName(name(node)); + conv.setId(id(node)); + WktNode method = node.find("METHOD", "PROJECTION"); + if (method == null) { + throw new WktParseException("CONVERSION[] has no METHOD[]"); + } + conv.setMethodName(name(method)); + conv.setMethodId(id(method)); + List params = node.findAll("PARAMETER"); + for (int i = 0; i < params.size(); i++) { + conv.addParameter(parameter(params.get(i), defaultLinear, defaultAngular)); + } + return conv; + } + + private ParameterDefinition parameter(WktNode node, UnitDefinition defaultLinear, + UnitDefinition defaultAngular) { + ParameterDefinition p = new ParameterDefinition(); + p.setName(name(node)); + p.setValue(node.doubleAt(1)); + UnitDefinition u = unit(node.find("ANGLEUNIT"), UnitDefinition.ANGULAR); + if (u == null) { + u = unit(node.find("LENGTHUNIT"), UnitDefinition.LINEAR); + } + if (u == null) { + u = unit(node.find("SCALEUNIT"), UnitDefinition.SCALE); + } + if (u == null) { + WktNode generic = node.find("UNIT"); + if (generic != null) { + int type = WktMethods.isAngularParameter(p.getName()) ? UnitDefinition.ANGULAR + : WktMethods.isScaleParameter(p.getName()) ? UnitDefinition.SCALE + : UnitDefinition.LINEAR; + u = unit(generic, type); + } + } + if (u == null) { + u = WktMethods.isAngularParameter(p.getName()) ? defaultAngular + : WktMethods.isScaleParameter(p.getName()) ? UnitDefinition.UNITY + : defaultLinear; + } + p.setUnit(u); + p.setId(id(node)); + return p; + } + + /** + * The WKT1 {@code TOWGS84[dx,dy,dz,rx,ry,rz,s]} clause, in PROJ's {@code +towgs84} order + * and units already. + */ + private double[] toWgs84(WktNode node) { + int n = 0; + double[] all = new double[7]; + for (int i = 0; i < node.childCount() && n < 7; i++) { + WktNode c = node.child(i); + if (c.isLeaf() && isNumeric(c)) { + all[n++] = c.asDouble(); + } + } + if (n != 3 && n != 7) { + throw new WktParseException("TOWGS84[] needs 3 or 7 values, found " + n); + } + if (n == 3) { + return new double[]{all[0], all[1], all[2]}; + } + return all; + } + + /** + * The Helmert parameters of a {@code BOUNDCRS}' {@code ABRIDGEDTRANSFORMATION}, converted + * to PROJ's {@code +towgs84} order, units and rotation convention. + *

+ * Two conversions are needed and both are easy to get wrong. The abridged form expresses + * the scale as a multiplier {@code 1 + s * 1e-6} rather than in parts per million, and a + * {@code Coordinate Frame rotation} method uses the opposite rotation sign convention + * from {@code Position Vector transformation}, which is the one {@code +towgs84} assumes. + */ + private double[] helmert(WktNode node) { + WktNode method = node.find("METHOD", "PROJECTION"); + String methodName = method == null ? "" : name(method); + boolean coordinateFrame = WktNames.normalize(methodName).contains("coordinateframe"); + + double[] v = new double[7]; + boolean[] present = new boolean[7]; + List params = node.findAll("PARAMETER"); + for (int i = 0; i < params.size(); i++) { + WktNode p = params.get(i); + String pn = WktNames.normalize(name(p)); + double value = p.doubleAt(1); + int index = helmertIndex(pn); + if (index < 0) { + continue; + } + if (index >= 3 && index <= 5) { + // Rotations: WKT carries them in the declared angular unit, +towgs84 wants + // arc-seconds. + UnitDefinition u = unit(p.find("ANGLEUNIT", "UNIT"), UnitDefinition.ANGULAR); + if (u != null) { + value = u.toBase(value) / UnitDefinition.ARC_SECOND.getConversionFactor(); + } + if (coordinateFrame) { + value = -value; + } + } else if (index == 6) { + UnitDefinition u = unit(p.find("SCALEUNIT", "UNIT"), UnitDefinition.SCALE); + if (u != null && u.getConversionFactor() != 1.0) { + // An explicit non-unity scale unit, in practice parts per million. + value = u.toBase(value) * 1e6; + } else if (Math.abs(value - 1.0) < 0.1) { + // The abridged convention, which is the default in this element and is + // usually written with no unit at all: the value is 1 + s * 1e-6. Reading + // it as parts per million would inflate the scale by a factor of 800,000. + value = (value - 1.0) * 1e6; + } + } else { + UnitDefinition u = unit(p.find("LENGTHUNIT", "UNIT"), UnitDefinition.LINEAR); + if (u != null) { + value = u.toBase(value); + } + } + v[index] = value; + present[index] = true; + } + if (!present[0] && !present[1] && !present[2]) { + throw new WktParseException("ABRIDGEDTRANSFORMATION[] has no translation " + + "parameters"); + } + if (!present[3] && !present[4] && !present[5] && !present[6]) { + return new double[]{v[0], v[1], v[2]}; + } + return v; + } + + private int helmertIndex(String normalizedName) { + if (normalizedName.equals("xaxistranslation") || normalizedName.equals("dx")) { + return 0; + } + if (normalizedName.equals("yaxistranslation") || normalizedName.equals("dy")) { + return 1; + } + if (normalizedName.equals("zaxistranslation") || normalizedName.equals("dz")) { + return 2; + } + if (normalizedName.equals("xaxisrotation") || normalizedName.equals("rx")) { + return 3; + } + if (normalizedName.equals("yaxisrotation") || normalizedName.equals("ry")) { + return 4; + } + if (normalizedName.equals("zaxisrotation") || normalizedName.equals("rz")) { + return 5; + } + if (normalizedName.equals("scaledifference") || normalizedName.equals("ds")) { + return 6; + } + return -1; + } + + /** + * Builds the coordinate system from an optional WKT2 {@code CS[]} plus the sibling + * {@code AXIS[]} clauses. WKT1 has no {@code CS[]}, so it arrives here with + * {@code csNode == null} and the axes alone. + */ + private CoordinateSystemDefinition coordinateSystem(WktNode crsNode, WktNode csNode, + UnitDefinition defaultUnit) { + CoordinateSystemDefinition cs = new CoordinateSystemDefinition(); + cs.setUnit(defaultUnit); + if (csNode != null) { + if (csNode.childCount() > 0) { + cs.setType(csNode.child(0).value()); + } + if (csNode.childCount() > 1 && isNumeric(csNode.child(1))) { + cs.setDeclaredDimension((int) csNode.doubleAt(1)); + } + } + List axes = crsNode.findAll("AXIS"); + for (int i = 0; i < axes.size(); i++) { + cs.addAxis(axis(axes.get(i), defaultUnit)); + } + if (cs.getType() == null) { + cs.setType(inferCsType(cs, defaultUnit)); + } + return cs; + } + + private String inferCsType(CoordinateSystemDefinition cs, UnitDefinition defaultUnit) { + if (defaultUnit != null && defaultUnit.getType() == UnitDefinition.ANGULAR) { + return CoordinateSystemDefinition.ELLIPSOIDAL; + } + List axes = cs.getAxes(); + if (axes.size() == 1 && axes.get(0).isVertical()) { + return CoordinateSystemDefinition.VERTICAL; + } + return CoordinateSystemDefinition.CARTESIAN; + } + + private AxisDefinition axis(WktNode node, UnitDefinition defaultUnit) { + AxisDefinition axis = new AxisDefinition(); + String label = node.childCount() > 0 ? node.textAt(0) : null; + // WKT2 embeds the abbreviation in the name: "geodetic latitude (Lat)". + if (label != null && label.endsWith(")")) { + int open = label.lastIndexOf(" ("); + if (open > 0) { + axis.setName(label.substring(0, open)); + axis.setAbbreviation(label.substring(open + 2, label.length() - 1)); + } else { + axis.setName(label); + } + } else { + axis.setName(label); + } + if (node.childCount() > 1) { + axis.setDirection(normalizeDirection(node.textAt(1))); + } else { + axis.setDirection(AxisDefinition.UNSPECIFIED); + } + UnitDefinition u = unit(node.find("ANGLEUNIT"), UnitDefinition.ANGULAR); + if (u == null) { + u = unit(node.find("LENGTHUNIT"), UnitDefinition.LINEAR); + } + if (u == null && node.find("UNIT") != null) { + u = unit(node.find("UNIT"), defaultUnit == null ? UnitDefinition.LINEAR + : defaultUnit.getType()); + } + axis.setUnit(u != null ? u : defaultUnit); + return axis; + } + + /** + * Normalises an axis direction to WKT2's lower-case spelling. WKT1 writes {@code EAST}, + * WKT2 writes {@code east}, ESRI writes both, and {@code OTHER} appears in the wild. + */ + private String normalizeDirection(String token) { + String t = token.trim(); + if (t.equalsIgnoreCase("east")) { + return AxisDefinition.EAST; + } + if (t.equalsIgnoreCase("west")) { + return AxisDefinition.WEST; + } + if (t.equalsIgnoreCase("north")) { + return AxisDefinition.NORTH; + } + if (t.equalsIgnoreCase("south")) { + return AxisDefinition.SOUTH; + } + if (t.equalsIgnoreCase("up")) { + return AxisDefinition.UP; + } + if (t.equalsIgnoreCase("down")) { + return AxisDefinition.DOWN; + } + if (t.equalsIgnoreCase("geocentricX")) { + return AxisDefinition.GEOCENTRIC_X; + } + if (t.equalsIgnoreCase("geocentricY")) { + return AxisDefinition.GEOCENTRIC_Y; + } + if (t.equalsIgnoreCase("geocentricZ")) { + return AxisDefinition.GEOCENTRIC_Z; + } + return t; + } + + private void metadata(WktNode node, CrsDefinition def) { + for (int i = 0; i < node.childCount(); i++) { + WktNode c = node.child(i); + if (c.isLeaf()) { + continue; + } + String k = c.keyword().toUpperCase(Locale.ROOT); + if (k.equals("ID") || k.equals("AUTHORITY")) { + Identifier identifier = identifier(c); + if (identifier != null) { + def.addId(identifier); + } + } else if (k.equals("REMARK")) { + def.setRemark(c.childCount() > 0 ? c.textAt(0) : null); + } else if (k.equals("SCOPE")) { + def.setScope(c.childCount() > 0 ? c.textAt(0) : null); + } else if (k.equals("AREA")) { + def.setAreaDescription(c.childCount() > 0 ? c.textAt(0) : null); + } else if (k.equals("BBOX")) { + def.setBoundingBox(new double[]{c.doubleAt(0), c.doubleAt(1), c.doubleAt(2), + c.doubleAt(3)}); + } else if (k.equals("USAGE")) { + metadata(c, def); + } + } + } + + private boolean isMetadata(WktNode node) { + String k = node.keyword().toUpperCase(Locale.ROOT); + return k.equals("ID") || k.equals("AUTHORITY") || k.equals("REMARK") + || k.equals("SCOPE") || k.equals("AREA") || k.equals("BBOX") + || k.equals("USAGE") || k.equals("UNIT") || k.equals("LENGTHUNIT") + || k.equals("ANGLEUNIT") || k.equals("AXIS") || k.equals("VERTICALEXTENT") + || k.equals("TIMEEXTENT") || k.equals("EXTENSION"); + } + + // -------------------------------------------------------------- helpers + + private String name(WktNode node) { + WktNode first = node.child(0); + if (first == null || !first.isLeaf()) { + throw new WktParseException(node.keyword() + "[] has no name"); + } + return first.value(); + } + + private Identifier id(WktNode node) { + WktNode idNode = node.find("ID", "AUTHORITY"); + return idNode == null ? null : identifier(idNode); + } + + private Identifier identifier(WktNode node) { + if (node.childCount() < 2) { + return null; + } + return new Identifier(node.textAt(0), node.textAt(1)); + } + + private UnitDefinition firstUnit(WktNode node, int type) { + UnitDefinition u = unit(node.find(type == UnitDefinition.ANGULAR ? "ANGLEUNIT" + : "LENGTHUNIT"), type); + if (u != null) { + return u; + } + return unit(node.find("UNIT"), type); + } + + private UnitDefinition unit(WktNode node, int type) { + if (node == null) { + return null; + } + String unitName = node.childCount() > 0 ? node.textAt(0) : null; + double factor = node.childCount() > 1 && isNumeric(node.child(1)) + ? node.doubleAt(1) : Double.NaN; + WktNode idNode = node.find("ID", "AUTHORITY"); + return WktNames.unit(unitName, factor, type, + idNode == null ? null : identifier(idNode)); + } + + private UnitDefinition defaultAngularUnit(CoordinateSystemDefinition cs) { + if (cs != null && cs.getUnit() != null + && cs.getUnit().getType() == UnitDefinition.ANGULAR) { + return cs.getUnit(); + } + return UnitDefinition.DEGREE; + } + + private boolean isNumeric(WktNode node) { + if (node == null || !node.isLeaf() || node.isQuoted()) { + return false; + } + try { + Double.parseDouble(node.value().trim()); + return true; + } catch (NumberFormatException e) { + return false; + } + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/WktWriter.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktWriter.java new file mode 100644 index 0000000..7f113a9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/WktWriter.java @@ -0,0 +1,525 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.CoordinateReferenceSystem; + +/** + * Writes a {@link CrsDefinition} as WKT2, in either the 2019 or the 2015 revision of ISO 19162. + *

+ * Everything a definition holds is written: identifiers, axis names and abbreviations, axis order, + * units per axis, the datum anchor, the scope and area of use. A definition that came from + * {@link WktReader} therefore round-trips; a definition derived from a bare + * {@link CoordinateReferenceSystem} by {@link CrsDefinitions#fromCrs} writes what such a CRS + * actually knows, which is less. + *

+ * Instances are immutable; the {@code with...} methods return new ones. + * + *

+ * String wkt2 = new WktWriter().multiline().write(definition);
+ * 
+ */ +public final class WktWriter { + + private final WktDialect dialect; + private final String indent; + + /** + * A writer producing single-line WKT2:2019. + */ + public WktWriter() { + this(WktDialect.WKT2_2019, null); + } + + /** + * A writer producing single-line WKT in the given dialect. + * + * @param dialect {@link WktDialect#WKT2_2019} or {@link WktDialect#WKT2_2015}; the WKT1 + * dialects are readable by this package but not writable + */ + public WktWriter(WktDialect dialect) { + this(dialect, null); + } + + private WktWriter(WktDialect dialect, String indent) { + if (dialect == null || dialect.isWkt1()) { + throw new IllegalArgumentException("this writer produces WKT2 only, not " + + dialect); + } + this.dialect = dialect; + this.indent = indent; + } + + /** + * A writer that indents each level by four spaces and puts each element on its own line. + */ + public WktWriter multiline() { + return new WktWriter(dialect, " "); + } + + /** + * A writer that indents with the given string. + */ + public WktWriter multiline(String indent) { + return new WktWriter(dialect, indent == null ? " " : indent); + } + + public WktDialect getDialect() { + return dialect; + } + + /** + * Writes a definition as WKT. + */ + public String write(CrsDefinition def) { + StringBuilder sb = new StringBuilder(); + WktFormat.append(toNode(def), sb, indent, 0); + return sb.toString(); + } + + /** + * Describes an existing proj4j CRS with {@link CrsDefinitions#fromCrs} and writes that. + */ + public String write(CoordinateReferenceSystem crs) { + return write(CrsDefinitions.fromCrs(crs)); + } + + /** + * The WKT tree for a definition, if a caller wants to inspect or post-process it. + * + * @throws WktParseException if the definition nests CRSs more than + * {@link WktLimits#MAX_CRS_DEPTH} deep. {@link CrsDefinition} is a + * public mutable type with a public {@code addComponent}, so this + * recursion is reachable with a hand-built graph and not only with a + * parsed one — and a definition that referred to itself would + * otherwise recurse until the stack ran out. + */ + public WktNode toNode(CrsDefinition def) { + return toNode(def, 1); + } + + private WktNode toNode(CrsDefinition def, int depth) { + if (depth > WktLimits.MAX_CRS_DEPTH) { + throw new WktParseException("CRSs nested more than " + WktLimits.MAX_CRS_DEPTH + + " deep; refusing to write further"); + } + if (def == null || def.getKind() == null) { + throw new WktParseException("CRS definition is null or has no kind"); + } + switch (def.getKind()) { + case GEOGRAPHIC: + case GEOCENTRIC: + return geodetic(def, false); + case PROJECTED: + return projected(def); + case VERTICAL: + return vertical(def); + case COMPOUND: + return compound(def, depth); + case BOUND: + return bound(def, depth); + case ENGINEERING: + return engineering(def); + default: + throw new WktParseException("cannot write a " + def.getKind() + " CRS as WKT2"); + } + } + + // ------------------------------------------------------------------ elements + + private WktNode geodetic(CrsDefinition def, boolean asBase) { + boolean geographic = def.getKind() != CrsDefinition.Kind.GEOCENTRIC; + String keyword; + if (asBase) { + keyword = geographic && dialect == WktDialect.WKT2_2019 ? "BASEGEOGCRS" + : "BASEGEODCRS"; + } else { + keyword = geographic && dialect == WktDialect.WKT2_2019 ? "GEOGCRS" : "GEODCRS"; + } + List children = new ArrayList(); + children.add(WktNode.quoted(nameOf(def))); + DatumDefinition datum = def.getDatum(); + if (datum == null) { + throw new WktParseException("geodetic CRS \"" + def.getName() + "\" has no datum"); + } + if (datum.isDynamic()) { + List dyn = new ArrayList(); + dyn.add(WktNode.of("FRAMEEPOCH", one(WktNode.number(datum.getFrameEpoch())))); + children.add(WktNode.of("DYNAMIC", dyn)); + } + children.add(datum(datum)); + if (datum.getPrimeMeridian() != null) { + // Written even for Greenwich, as PROJ does: the ANGLEUNIT it carries is what tells a + // reader the unit of the CRS's angular values. + children.add(primeMeridian(datum.getPrimeMeridian())); + } + if (!asBase) { + addCoordinateSystem(children, def.getCoordinateSystem()); + } else if (def.getCoordinateSystem() != null + && def.getCoordinateSystem().getUnit() != null + && def.getCoordinateSystem().getUnit().getType() == UnitDefinition.ANGULAR + && def.getCoordinateSystem().getUnit().getConversionFactor() + != UnitDefinition.DEGREE.getConversionFactor()) { + // A base CRS whose angular unit is not degrees must say so, or every angular + // parameter of the conversion is read back in the wrong unit. + children.add(unit("ANGLEUNIT", def.getCoordinateSystem().getUnit())); + } + addMetadata(children, def, asBase); + return WktNode.of(keyword, children); + } + + private WktNode projected(CrsDefinition def) { + List children = new ArrayList(); + children.add(WktNode.quoted(nameOf(def))); + CrsDefinition base = def.getBaseCrs(); + if (base == null) { + throw new WktParseException("projected CRS \"" + def.getName() + "\" has no base CRS"); + } + children.add(geodetic(base, true)); + children.add(conversion(def.getConversion())); + addCoordinateSystem(children, def.getCoordinateSystem()); + addMetadata(children, def, false); + return WktNode.of("PROJCRS", children); + } + + private WktNode vertical(CrsDefinition def) { + List children = new ArrayList(); + children.add(WktNode.quoted(nameOf(def))); + DatumDefinition datum = def.getDatum(); + if (datum != null) { + List vd = new ArrayList(); + vd.add(WktNode.quoted(datum.getName() == null ? "unknown" : datum.getName())); + addId(vd, datum.getId()); + children.add(WktNode.of("VDATUM", vd)); + } + addCoordinateSystem(children, def.getCoordinateSystem()); + addMetadata(children, def, false); + return WktNode.of("VERTCRS", children); + } + + private WktNode compound(CrsDefinition def, int depth) { + List children = new ArrayList(); + children.add(WktNode.quoted(nameOf(def))); + for (int i = 0; i < def.getComponents().size(); i++) { + children.add(toNode(def.getComponents().get(i), depth + 1)); + } + addMetadata(children, def, false); + return WktNode.of("COMPOUNDCRS", children); + } + + private WktNode bound(CrsDefinition def, int depth) { + List children = new ArrayList(); + CrsDefinition source = def.getBaseCrs(); + if (source == null) { + throw new WktParseException("bound CRS \"" + def.getName() + "\" has no source CRS"); + } + children.add(WktNode.of("SOURCECRS", one(toNode(source, depth + 1)))); + CrsDefinition hub = def.getHubCrs(); + children.add(WktNode.of("TARGETCRS", + one(toNode(hub != null ? hub : wgs84(), depth + 1)))); + double[] t = def.getToWgs84(); + if (t != null) { + children.add(abridgedTransformation(t)); + } + return WktNode.of("BOUNDCRS", children); + } + + private WktNode engineering(CrsDefinition def) { + List children = new ArrayList(); + children.add(WktNode.quoted(nameOf(def))); + List ed = new ArrayList(); + ed.add(WktNode.quoted(def.getDatum() != null && def.getDatum().getName() != null + ? def.getDatum().getName() : "unknown")); + children.add(WktNode.of("EDATUM", ed)); + addCoordinateSystem(children, def.getCoordinateSystem()); + addMetadata(children, def, false); + return WktNode.of("ENGCRS", children); + } + + /** + * WGS 84, for the {@code TARGETCRS} of a bound CRS whose hub was not spelled out — which is + * every WKT1 {@code TOWGS84}, since that clause names no target. + */ + private CrsDefinition wgs84() { + CrsDefinition def = new CrsDefinition(); + def.setKind(CrsDefinition.Kind.GEOGRAPHIC); + def.setName("WGS 84"); + DatumDefinition datum = new DatumDefinition(); + datum.setName("World Geodetic System 1984"); + datum.setId(new Identifier("EPSG", "6326")); + EllipsoidDefinition e = new EllipsoidDefinition(); + e.setName("WGS 84"); + e.setSemiMajorAxis(6378137); + e.setInverseFlattening(298.257223563); + e.setId(new Identifier("EPSG", "7030")); + datum.setEllipsoid(e); + datum.setPrimeMeridian(PrimeMeridianDefinition.greenwich()); + def.setDatum(datum); + CoordinateSystemDefinition cs = + new CoordinateSystemDefinition(CoordinateSystemDefinition.ELLIPSOIDAL); + cs.setUnit(UnitDefinition.DEGREE); + cs.addAxis(new AxisDefinition("latitude", "Lat", AxisDefinition.NORTH, + UnitDefinition.DEGREE)); + cs.addAxis(new AxisDefinition("longitude", "Lon", AxisDefinition.EAST, + UnitDefinition.DEGREE)); + def.setCoordinateSystem(cs); + def.addId(new Identifier("EPSG", "4326")); + return def; + } + + private WktNode abridgedTransformation(double[] t) { + List children = new ArrayList(); + children.add(WktNode.quoted("Transformation to WGS84")); + List method = new ArrayList(); + boolean sevenParam = t.length == 7; + method.add(WktNode.quoted(sevenParam + ? "Position Vector transformation (geog2D domain)" + : "Geocentric translations (geog2D domain)")); + addId(method, new Identifier("EPSG", sevenParam ? "9606" : "9603")); + children.add(WktNode.of("METHOD", method)); + String[] names = {"X-axis translation", "Y-axis translation", "Z-axis translation", + "X-axis rotation", "Y-axis rotation", "Z-axis rotation", "Scale difference"}; + String[] codes = {"8605", "8606", "8607", "8608", "8609", "8610", "8611"}; + for (int i = 0; i < t.length; i++) { + List p = new ArrayList(); + p.add(WktNode.quoted(names[i])); + if (i < 3) { + p.add(WktNode.number(t[i])); + p.add(unit("LENGTHUNIT", UnitDefinition.METRE)); + } else if (i < 6) { + p.add(WktNode.number(t[i])); + p.add(unit("ANGLEUNIT", UnitDefinition.ARC_SECOND)); + } else { + // The abridged form carries the scale as a multiplier, not in parts per million. + p.add(WktNode.number(1.0 + t[i] * 1e-6)); + p.add(unit("SCALEUNIT", UnitDefinition.UNITY)); + } + addId(p, new Identifier("EPSG", codes[i])); + children.add(WktNode.of("PARAMETER", p)); + } + return WktNode.of("ABRIDGEDTRANSFORMATION", children); + } + + private WktNode datum(DatumDefinition datum) { + List children = new ArrayList(); + children.add(WktNode.quoted(datum.getName() == null ? "unknown" : datum.getName())); + EllipsoidDefinition e = datum.getEllipsoid(); + if (e != null) { + children.add(ellipsoid(e)); + } + if (datum.getAnchor() != null) { + children.add(WktNode.of("ANCHOR", one(WktNode.quoted(datum.getAnchor())))); + } + addId(children, datum.getId()); + return WktNode.of("DATUM", children); + } + + private WktNode ellipsoid(EllipsoidDefinition e) { + List children = new ArrayList(); + children.add(WktNode.quoted(e.getName() == null ? "unknown" : e.getName())); + children.add(WktNode.number(e.getSemiMajorAxis())); + children.add(WktNode.number(WktNames.inverseFlatteningOf(e))); + UnitDefinition u = e.getUnit(); + if (u != null && u.getConversionFactor() != 1.0) { + children.add(unit("LENGTHUNIT", u)); + } else { + children.add(unit("LENGTHUNIT", UnitDefinition.METRE)); + } + addId(children, e.getId()); + return WktNode.of("ELLIPSOID", children); + } + + private WktNode primeMeridian(PrimeMeridianDefinition pm) { + List children = new ArrayList(); + children.add(WktNode.quoted(pm.getName() == null ? "Greenwich" : pm.getName())); + children.add(WktNode.number(pm.getLongitude())); + children.add(unit("ANGLEUNIT", pm.getUnit() == null ? UnitDefinition.DEGREE + : pm.getUnit())); + addId(children, pm.getId()); + return WktNode.of("PRIMEM", children); + } + + private WktNode conversion(ConversionDefinition conv) { + if (conv == null) { + throw new WktParseException("projected CRS has no conversion"); + } + List children = new ArrayList(); + children.add(WktNode.quoted(conv.getName() == null ? "unnamed" : conv.getName())); + List method = new ArrayList(); + method.add(WktNode.quoted(WktMethods.wkt2MethodName(conv))); + addId(method, conv.getMethodId() != null ? conv.getMethodId() + : WktMethods.methodId(conv.getMethodName())); + children.add(WktNode.of("METHOD", method)); + List params = conv.getParameters(); + for (int i = 0; i < params.size(); i++) { + ParameterDefinition p = params.get(i); + List pc = new ArrayList(); + pc.add(WktNode.quoted(WktMethods.wkt2ParameterName(conv, p.getName()))); + pc.add(WktNode.number(p.getValue())); + UnitDefinition u = p.getUnit(); + if (u != null) { + pc.add(unitWithoutId(u.getType() == UnitDefinition.ANGULAR ? "ANGLEUNIT" + : u.getType() == UnitDefinition.SCALE ? "SCALEUNIT" : "LENGTHUNIT", u)); + } + addId(pc, p.getId() != null ? p.getId() + : WktMethods.parameterId(conv, p.getName())); + children.add(WktNode.of("PARAMETER", pc)); + } + addId(children, conv.getId()); + return WktNode.of("CONVERSION", children); + } + + private void addCoordinateSystem(List children, CoordinateSystemDefinition cs) { + if (cs == null) { + return; + } + List csChildren = new ArrayList(); + csChildren.add(WktNode.literal(cs.getType() == null + ? CoordinateSystemDefinition.CARTESIAN : cs.getType())); + csChildren.add(WktNode.number(cs.getDimension())); + children.add(WktNode.of("CS", csChildren)); + + // The unit is written on every axis, never once for the coordinate system, because that is + // what PROJ's non-simplified WKT2 output does and byte equality with it is the point of + // the round-trip tests. + List axes = cs.getAxes(); + for (int i = 0; i < axes.size(); i++) { + AxisDefinition a = axes.get(i); + List ac = new ArrayList(); + ac.add(WktNode.quoted(axisLabel(a))); + ac.add(WktNode.literal(a.getDirection() == null ? AxisDefinition.UNSPECIFIED + : a.getDirection())); + ac.add(WktNode.of("ORDER", one(WktNode.number(i + 1)))); + UnitDefinition u = cs.unitOf(i); + if (u != null) { + ac.add(unit(unitKeyword(u), u)); + } + children.add(WktNode.of("AXIS", ac)); + } + } + + private String unitKeyword(UnitDefinition u) { + switch (u.getType()) { + case UnitDefinition.ANGULAR: + return "ANGLEUNIT"; + case UnitDefinition.SCALE: + return "SCALEUNIT"; + case UnitDefinition.TIME: + return "TIMEUNIT"; + default: + return "LENGTHUNIT"; + } + } + + private String axisLabel(AxisDefinition a) { + String name = a.getName(); + String abbr = a.getAbbreviation(); + if (name == null || name.length() == 0) { + return abbr == null ? "unknown" : "(" + abbr + ")"; + } + if (abbr == null || abbr.length() == 0) { + return name; + } + return name + " (" + abbr + ")"; + } + + private WktNode unit(String keyword, UnitDefinition u) { + List children = new ArrayList(); + children.add(WktNode.quoted(u.getName() == null ? "unknown" : u.getName())); + children.add(WktNode.number(u.getConversionFactor())); + addId(children, u.getId()); + return WktNode.of(keyword, children); + } + + /** + * A unit with no {@code ID}, for the places PROJ writes none: the {@code LENGTHUNIT} of an + * {@code ELLIPSOID} and the unit of a {@code PARAMETER}. + */ + private WktNode unitWithoutId(String keyword, UnitDefinition u) { + List children = new ArrayList(); + children.add(WktNode.quoted(u.getName() == null ? "unknown" : u.getName())); + children.add(WktNode.number(u.getConversionFactor())); + return WktNode.of(keyword, children); + } + + private void addMetadata(List children, CrsDefinition def, boolean asBase) { + if (!asBase) { + List usage = new ArrayList(); + if (def.getScope() != null) { + usage.add(WktNode.of("SCOPE", one(WktNode.quoted(def.getScope())))); + } + if (def.getAreaDescription() != null) { + usage.add(WktNode.of("AREA", one(WktNode.quoted(def.getAreaDescription())))); + } + if (def.getBoundingBox() != null && def.getBoundingBox().length == 4) { + List bbox = new ArrayList(); + for (int i = 0; i < 4; i++) { + bbox.add(WktNode.number(def.getBoundingBox()[i])); + } + usage.add(WktNode.of("BBOX", bbox)); + } + if (!usage.isEmpty()) { + if (dialect == WktDialect.WKT2_2019) { + children.add(WktNode.of("USAGE", usage)); + } else { + children.addAll(usage); + } + } + } + for (int i = 0; i < def.getIds().size(); i++) { + addId(children, def.getIds().get(i)); + } + if (!asBase && def.getRemark() != null) { + children.add(WktNode.of("REMARK", one(WktNode.quoted(def.getRemark())))); + } + } + + private void addId(List children, Identifier id) { + if (id == null) { + return; + } + List idChildren = new ArrayList(); + idChildren.add(WktNode.quoted(id.getAuthority())); + idChildren.add(isInteger(id.getCode()) ? WktNode.literal(id.getCode()) + : WktNode.quoted(id.getCode())); + children.add(WktNode.of("ID", idChildren)); + } + + private static boolean isInteger(String s) { + if (s == null || s.isEmpty()) { + return false; + } + for (int i = 0; i < s.length(); i++) { + if (!Character.isDigit(s.charAt(i))) { + return false; + } + } + return true; + } + + private static String nameOf(CrsDefinition def) { + return def.getName() == null ? "unknown" : def.getName(); + } + + private static List one(WktNode node) { + List list = new ArrayList(1); + list.add(node); + return list; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/io/wkt/package-info.java b/core/src/main/java/org/locationtech/proj4j/io/wkt/package-info.java new file mode 100644 index 0000000..04aed10 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/io/wkt/package-info.java @@ -0,0 +1,70 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Reading and writing coordinate reference systems as WKT. + * + *

What this is for

+ * A library that can parse a PROJ string but not a WKT string forces its users to find a second + * one, and the second one is usually Apache SIS. That pulls in GeoAPI, and a classpath with two + * incompatible copies of {@code org.opengis.util.CodeList} throws {@code NoSuchMethodError} — an + * {@code Error}, not an {@code Exception} — from inside SIS's WKT parser. It passes local tests and + * kills Spark executors. + *

+ * So this package is hand-written, lives in {@code core}, and has no dependencies: + * no JSON library, no GeoAPI, nothing but the JDK. There is a test, + * {@code NoGeoApiInCoreTest}, which scans the compiled classes for the string + * {@code org/opengis/} and fails the build if it appears. {@code proj4j-geoapi} remains a separate, + * optional module and is itself a participant in that hazard; core never references it. + * + *

Using it

+ *
+ * CoordinateReferenceSystem crs = new WktReader().read(wkt);            // any dialect, auto-detected
+ * CrsDefinition def = new WktReader().readDefinition(wkt);              // to inspect what was said
+ * String projString = CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.LEGACY);
+ * String wkt2 = new WktWriter().multiline().write(def);
+ * 
+ * {@link org.locationtech.proj4j.io.wkt.WktReader} accepts all four dialects of + * {@link org.locationtech.proj4j.io.wkt.WktDialect} — WKT2:2019, WKT2:2015, WKT1 as GDAL writes it + * and WKT1 as ESRI writes it — detecting which by the same rule PROJ uses. + * {@link org.locationtech.proj4j.io.wkt.WktWriter} produces WKT2. + * + *

Axis order

+ * The default is {@link org.locationtech.proj4j.io.wkt.AxisOrderPolicy#LEGACY}: longitude-first, + * exactly as proj4j has always been, and as GeoJSON is. The {@code AXIS[]} clauses a document + * declares are parsed faithfully and retained on the + * {@link org.locationtech.proj4j.io.wkt.CrsDefinition} regardless of policy; the policy is applied + * once, where a {@link org.locationtech.proj4j.CoordinateReferenceSystem} is built. There is no + * system property and no environment variable, deliberately: a coordinate transposition that + * depends on who launched the JVM is not a behaviour any caller can test against. + * + *

What it refuses

+ * Where a document describes something proj4j's engine would silently ignore, this package + * throws {@link org.locationtech.proj4j.io.wkt.WktParseException} rather than returning a plausible + * coordinate. Mercator variant B's standard parallel is converted to the equivalent scale factor + * because proj4j's Mercator never reads {@code +lat_ts}; Equidistant Cylindrical with a real + * standard parallel has no such equivalent and is refused. A vertical-only CRS is refused rather + * than becoming a horizontal one, and a compound CRS yields its horizontal component with the + * height left untransformed. + * + *

Provenance

+ * The grammar, the dialect detection, the method and parameter tables, the unit handling and the + * derived-parameter rules are ported from PROJ at tag 9.8.1: + * {@code src/iso19111/io.cpp}, {@code src/iso19111/operation/parammappings.cpp}, + * {@code esriparammappings.cpp} and {@code conversion.cpp}. The tests are ported from + * {@code test/unit/test_io.cpp} at the same tag, and say which case each came from. + */ +package org.locationtech.proj4j.io.wkt; diff --git a/core/src/main/java/org/locationtech/proj4j/parser/DatumParameters.java b/core/src/main/java/org/locationtech/proj4j/parser/DatumParameters.java index b84d3a7..e7998be 100755 --- a/core/src/main/java/org/locationtech/proj4j/parser/DatumParameters.java +++ b/core/src/main/java/org/locationtech/proj4j/parser/DatumParameters.java @@ -20,6 +20,7 @@ import java.util.List; import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.datum.Datum; import org.locationtech.proj4j.datum.Ellipsoid; import org.locationtech.proj4j.datum.Grid; @@ -28,9 +29,25 @@ * Contains the parsed/computed parameter values * which are used to create * the datum and ellipsoid for a {@link CoordinateReferenceSystem}. - * This class also implements the policies for - * which parameters take precedence - * when multiple inconsistent ones are present. + *

+ * The derivation and validation rules implemented here follow PROJ 9.8.1 + * {@code src/ell_set.cpp} ({@code ellps_size}, {@code ellps_shape}, + * {@code ellps_spherification} and {@code pj_calc_ellipsoid_params}): + *

    + *
  • {@code +R} declares a sphere and short-circuits every other size, + * shape and spherification parameter. + *
  • Exactly one shape parameter takes effect, chosen by the fixed + * order {@code rf, f, es, e, b} — first present wins. Selection is done by + * the caller ({@link Proj4Parser}); this class holds the formula and the + * range check for each. + *
  • {@code rf} implies {@code f = 1/rf} then {@code es = 2f - f*f}; + * {@code f} implies {@code es = 2f - f*f}; {@code b} is a two-step + * derivation via {@code f = (a - b)/a}. + *
  • Ranges: {@code a > 0}, {@code rf > 0}, {@code f >= 0}, {@code es} and + * {@code e} in {@code [0,1)}, {@code b > 0}, and finally + * {@code f} in {@code [0,1)} with a NaN-safe {@code !(es >= 0)} guard. + *
  • Spherification sets {@code es = e = f = 0} and {@code b = a}. + *
* * @author Martin Davis */ @@ -43,6 +60,41 @@ public class DatumParameters { private final static double RV4 = .06944444444444444444; /* 5/72 */ private final static double RV6 = .04243827160493827160; /* 55/1296 */ + private static final double HALF_PI = Math.PI / 2.0; + + /** + * PROJ's implicit ellipsoid, as a {@link Datum}. + *

+ * {@code init.cpp:317-362} appends {@code pj_mkparam("ellps=GRS80")} to the end of + * the parameter list unless {@code +no_defs} is given, {@code +proj} is missing or + * is {@code pipeline}, or any of {@code +datum +ellps +a +b +rf +f +e +es} is + * present. GRS80, not WGS84. Proj4J returned {@code Ellipsoid.WGS84}, and the + * two differ only in the inverse flattening — 298.257222101 against 298.257223563 — + * so the divergence hides at every ordinary tolerance and surfaces at + * sub-micrometre ones: it is the sole reason {@code builtins.gie:7767} + * ({@code +proj=utm +zone=32}, tolerance 0.001 mm) missed by 124 µm of + * northing at latitude 56, where an explicit {@code +ellps=GRS80} lands 3.3 nm out. + *

+ * The datum is deliberately left equivalent to what it was. This constant's + * transform is null and its ellipsoid is GRS80, so {@link Datum#getTransformType()} + * returns {@code TYPE_WGS84} exactly as {@code Datum.WGS84} does, and + * {@link Datum#isEqual} still finds the two equal — GRS80 and WGS84 differ in + * {@code es} by 3.3e-11, inside the 5e-11 + * {@link Datum#ELLIPSOID_E2_TOLERANCE}. So no datum shift appears or disappears + * because of this; only the ellipsoid the projection formula runs on changes. + *

+ * A {@code static final} rather than a fresh instance per parse, so that the + * identity of the default datum stays stable across parses the way + * {@code Datum.WGS84}'s did. + *

+ * Not implemented here: PROJ errors ("Must specify ellipsoid or + * sphere") when the implicit append is suppressed and nothing else supplies an + * ellipsoid — {@code +proj=merc +no_defs}. Proj4J still defaults instead, which is + * the same shape of divergence it had before, just with the right ellipsoid. + */ + private static final Datum DEFAULT_DATUM = new Datum("GRS80", (double[]) null, null, + Ellipsoid.GRS80, "Unknown datum based upon the GRS 1980 ellipsoid"); + private Datum datum = null; private double[] datumTransform = null; private List grids = null; @@ -51,24 +103,61 @@ public class DatumParameters { private double a = Double.NaN; private double es = Double.NaN; + /** + * The flattening exactly as it was declared (or as it was derived from + * {@code +rf}/{@code +b}), kept separately from {@code es} because + * {@code es = 2f - f*f} is not injective: {@code +f=2} and {@code +f=0} + * both give {@code es = 0}, yet PROJ rejects the former in + * {@code pj_calc_ellipsoid_params}. NaN when no flattening was declared. + */ + private double f = Double.NaN; + + /** + * True once the shape has been forced to a sphere, either by {@code +R} or + * by a spherification parameter. Lets {@link Proj4Parser} give the declared + * sphere to the projection rather than a named datum's ellipsoid. + */ + private boolean sphere = false; + public DatumParameters() { // Default datum is WGS84 // setDatum(Datum.WGS84); } public Datum getDatum() { - if (datum != null) - return datum; - // if no ellipsoid was specified, return WGS84 as the default - if (ellipsoid == null && !isDefinedExplicitly()) { - return Datum.WGS84; + if (datum != null) { + // Never mutate the shared, well-known Datum singletons (Datum.NAD27 + // and friends). When grids were given alongside +datum=, derive a + // new Datum instead. PROJ gives +nadgrids precedence over + // +towgs84 (datum_set.cpp), so the parameter transform is dropped. + if (grids == null) + return datum; + return new Datum(datum.getCode(), null, grids, datum.getEllipsoid(), datum.getName()); } - // Check for WGS84 datum parameters - if (Ellipsoid.WGS84.equals(ellipsoid) && grids == null && (datumTransform == null || isIdentity(datumTransform))) - return Datum.WGS84; - // otherwise, return a custom datum with the specified ellipsoid - return new Datum("User", datumTransform, grids, getEllipsoid(), "User-defined"); + if (grids == null) { + // Nothing was declared at all: PROJ appends "ellps=GRS80" here, not WGS84. + // See DEFAULT_DATUM. + if (ellipsoid == null && !isDefinedExplicitly()) { + return DEFAULT_DATUM; + } + // Check for WGS84 datum parameters + if (Ellipsoid.WGS84.equals(ellipsoid) && (datumTransform == null || isIdentity(datumTransform))) + return Datum.WGS84; + } + + // otherwise, return a custom datum with the specified ellipsoid. + // The transform array is copied because Datum's constructor rescales it + // in place; sharing it would double-scale on a second call. + return new Datum("User", copyOfTransform(), grids, getEllipsoid(), "User-defined"); + } + + private double[] copyOfTransform() { + if (datumTransform == null) + return null; + double[] copy = new double[datumTransform.length]; + System.arraycopy(datumTransform, 0, copy, 0, datumTransform.length); + return copy; } private boolean isDefinedExplicitly() { @@ -78,7 +167,10 @@ private boolean isDefinedExplicitly() { public Ellipsoid getEllipsoid() { if (ellipsoid != null) return ellipsoid; - return new Ellipsoid("user", a, es, "User-defined"); + if (Double.isNaN(a)) + // PROJ's implicit ellipsoid is GRS80; see DEFAULT_DATUM. + return Ellipsoid.GRS80; + return new Ellipsoid("user", a, Double.isNaN(es) ? 0.0 : es, "User-defined"); } public void setDatumTransform(double[] datumTransform) { @@ -95,41 +187,284 @@ public void setEllipsoid(Ellipsoid ellipsoid) { this.ellipsoid = ellipsoid; es = ellipsoid.eccentricity2; a = ellipsoid.equatorRadius; + f = Double.NaN; + sphere = false; } public void setGrids(List grids) { this.grids = grids; } + /** + * Sets the semi-major axis. PROJ {@code ellps_size}: {@code a <= 0} or + * {@code a == HUGE_VAL} is an error. + */ public void setA(double a) { + checkSize(a, "a"); ellipsoid = null; // force user-defined ellipsoid this.a = a; } + /** + * Declares a sphere of the given radius. Per {@code ell_set.cpp:92-100} + * this overrules {@code +ellps} and makes every shape and spherification + * parameter irrelevant, so the caller must stop parsing the ellipsoid here. + */ + public void setR(double r) { + checkSize(r, "R"); + ellipsoid = null; // force user-defined ellipsoid + this.a = r; + this.es = 0.0; + this.f = 0.0; + this.sphere = true; + } + + /** + * Sets the semi-minor axis, deriving {@code es} the way PROJ does: through + * the flattening, not as {@code 1 - b*b/(a*a)}. + */ public void setB(double b) { + requireMajorAxis(); + if (!(b > 0) || Double.isInfinite(b)) + throw new InvalidValueException("Invalid value for b. Should be > 0"); ellipsoid = null; // force user-defined ellipsoid - es = 1. - (b * b) / (a * a); + if (b == a) { + this.f = 0.0; + this.es = 0.0; + return; + } + this.f = (a - b) / a; + this.es = 2 * f - f * f; } public void setES(double es) { + if (Double.isNaN(es) || es < 0 || es >= 1 || Double.isInfinite(es)) + throw new InvalidValueException("Invalid value for es. Should be in [0,1[ range"); ellipsoid = null; // force user-defined ellipsoid this.es = es; + this.f = Double.NaN; } - public void setRF(double rf) { + /** + * Sets the eccentricity. Absent from PROJ4J before, present in PROJ as the + * fourth shape parameter. + */ + public void setE(double e) { + if (Double.isNaN(e) || e < 0 || e >= 1 || Double.isInfinite(e)) + throw new InvalidValueException("Invalid value for e. Should be in [0,1[ range"); ellipsoid = null; // force user-defined ellipsoid - es = rf * (2. - rf); + this.es = e * e; + this.f = Double.NaN; } - public void setR_A() { + /** + * Sets the inverse flattening: {@code f = 1/rf}, then + * {@code es = 2f - f*f}. + */ + public void setRF(double rf) { + if (Double.isNaN(rf) || rf <= 0 || Double.isInfinite(rf)) + throw new InvalidValueException("Invalid value for rf. Should be > 0"); ellipsoid = null; // force user-defined ellipsoid - a *= 1. - es * (SIXTH + es * (RA4 + es * RA6)); + this.f = 1.0 / rf; + this.es = 2 * f - f * f; } + /** + * Sets the flattening: {@code es = 2f - f*f}. + */ public void setF(double f) { + if (Double.isNaN(f) || f < 0 || Double.isInfinite(f)) + throw new InvalidValueException("Invalid value for f. Should be >= 0"); ellipsoid = null; // force user-defined ellipsoid - double rf = 1.0 / f; - es = rf * (2. - rf); + this.f = f; + this.es = 2 * f - f * f; + } + + /** + * Seeds the size and shape from the named datum's ellipsoid, or from GRS80 + * when no datum was named, if no size parameter has been given. + *

+ * This stands in for PROJ's implicit {@code +ellps=GRS80} append + * ({@code init.cpp:317-360}), which is suppressed by {@code +a}, {@code +b}, + * {@code +rf}, {@code +f}, {@code +e}, {@code +es}, {@code +ellps} and + * {@code +datum} but not by the spherification keys - so PROJ still + * has an ellipsoid to spherify for e.g. a bare {@code +proj=merc +R_A}. + */ + public void seedDefaultSize() { + if (!Double.isNaN(a)) + return; + Ellipsoid seed = datum != null ? datum.getEllipsoid() : Ellipsoid.GRS80; + setEllipsoid(seed); + } + + /** + * Seeds the size and shape from the named datum's ellipsoid only. + *

+ * {@code +datum=} makes PROJ append {@code ellps=} + * ({@code datum_set.cpp}), which supplies a semi-major axis before + * {@code ellps_size} runs. A shape parameter on its own does not: + * every shape key suppresses the implicit {@code +ellps=GRS80}, so + * {@code +proj=merc +rf=297} really is "Major axis not given" in PROJ. + */ + public void seedSizeFromDatum() { + if (!Double.isNaN(a) || datum == null) + return; + setEllipsoid(datum.getEllipsoid()); + } + + /** + * @throws InvalidValueException if no semi-major axis has been supplied, as + * PROJ's {@code ellps_size} does before any + * shape parameter is looked at + */ + public void requireSize() { + requireMajorAxis(); + } + + /** + * Forces the ellipsoid to be a sphere with no shape at all when no shape + * parameter was given, mirroring {@code ellps_shape}'s + * "not giving a shape parameter means selecting a sphere" branch. + */ + public void setSphericalShape() { + requireMajorAxis(); + ellipsoid = null; // force user-defined ellipsoid + this.es = 0.0; + this.f = 0.0; + } + + /* ------------------------------------------------------------------ */ + /* Spherification (ell_set.cpp ellps_spherification) */ + /* ------------------------------------------------------------------ */ + + /** {@code +R_A} — sphere with the same surface area as the ellipsoid. */ + public void setR_A() { + requireMajorAxis(); + spherify(a * (1. - es * (SIXTH + es * (RA4 + es * RA6)))); + } + + /** {@code +R_V} — sphere with the same volume as the ellipsoid. */ + public void setR_V() { + requireMajorAxis(); + spherify(a * (1. - es * (SIXTH + es * (RV4 + es * RV6)))); + } + + /** {@code +R_a} — sphere with R = (a + b)/2. */ + public void setR_a() { + requireMajorAxis(); + spherify((a + getB()) / 2); + } + + /** {@code +R_g} — sphere with R = sqrt(a*b). */ + public void setR_g() { + requireMajorAxis(); + spherify(Math.sqrt(a * getB())); + } + + /** {@code +R_h} — sphere with R = 2*a*b/(a + b). */ + public void setR_h() { + requireMajorAxis(); + double b = getB(); + if (a + b == 0) + throw new InvalidValueException("Invalid or missing major axis"); + spherify((2 * a * b) / (a + b)); + } + + /** + * {@code +R_lat_a=phi} — sphere with R the arithmetic mean of the + * ellipsoid's radii of curvature at the given latitude. + * + * @param phi latitude in radians + */ + public void setR_lat_a(double phi) { + requireMajorAxis(); + double t = latitudeFactor(phi, "lat_a"); + spherify(a * ((1. - es + t) / (2 * t * Math.sqrt(t)))); + } + + /** + * {@code +R_lat_g=phi} — sphere with R the geometric mean of the + * ellipsoid's radii of curvature at the given latitude. + * + * @param phi latitude in radians + */ + public void setR_lat_g(double phi) { + requireMajorAxis(); + double t = latitudeFactor(phi, "lat_g"); + spherify(a * (Math.sqrt(1 - es) / t)); + } + + /** + * {@code +R_C} — sphere with the radius of the conformal sphere at + * {@code phi0}, per IOGP Publication 373-7-2. Added in PROJ 9.3.0. + * + * @param phi0 latitude of origin in radians + */ + public void setR_C(double phi0) { + requireMajorAxis(); + double t = Math.sin(phi0); + t = 1 - es * t * t; + if (t == 0.) + throw new InvalidValueException("Invalid eccentricity"); + spherify(a * (Math.sqrt(1 - es) / t)); + } + + private double latitudeFactor(double phi, String name) { + if (!(Math.abs(phi) <= HALF_PI)) + throw new InvalidValueException( + "Invalid value for " + name + ". |" + name + "| should be <= 90 degrees"); + double t = Math.sin(phi); + t = 1 - es * t * t; + if (t == 0.) + throw new InvalidValueException("Invalid eccentricity"); + return t; + } + + private void spherify(double newA) { + if (!(newA > 0.) || Double.isInfinite(newA)) + throw new InvalidValueException("Invalid or missing major axis"); + ellipsoid = null; // force user-defined ellipsoid + a = newA; + es = 0.; + f = 0.; + sphere = true; + } + + /* ------------------------------------------------------------------ */ + + /** + * Mirrors the error branches of PROJ's {@code pj_calc_ellipsoid_params}: + * the NaN-safe {@code !(es >= 0)} guard, the requirement that the + * flattening lies in {@code [0,1)}, and {@code 1 - es != 0}. + * + * @throws InvalidValueException if the derived ellipsoid is not physically + * realisable + */ + public void validateEllipsoid() { + if (Double.isNaN(a) && Double.isNaN(es)) { + // Nothing was declared; the default datum applies. + return; + } + if (Double.isNaN(es)) + return; + // Written this way to catch NaN, as ell_set.cpp does + if (!(es >= 0)) + throw new InvalidValueException("Invalid eccentricity"); + double flattening = Double.isNaN(f) ? 1 - Math.sqrt(1 - es) : f; + if (!(flattening >= 0.0 && flattening < 1.0)) + throw new InvalidValueException("Invalid eccentricity"); + if (1. - es == 0.) + throw new InvalidValueException("Invalid eccentricity"); + } + + private void requireMajorAxis() { + if (Double.isNaN(a)) + throw new InvalidValueException("Major axis not given"); + } + + private void checkSize(double value, String key) { + if (Double.isNaN(value) || value <= 0 || Double.isInfinite(value)) + throw new InvalidValueException("Invalid value for major axis (+" + key + ")"); } public double getA() { @@ -140,6 +475,29 @@ public double getES() { return es; } + /** + * @return the semi-minor axis derived from the current size and shape + */ + public double getB() { + return a * Math.sqrt(1. - es); + } + + /** + * @return true when the shape has been forced to a sphere by {@code +R} or + * by a spherification parameter + */ + public boolean isSphere() { + return sphere; + } + + /** + * @return true when a size parameter ({@code +a}, {@code +R}) or + * {@code +ellps} has supplied a semi-major axis + */ + public boolean isSizeGiven() { + return !Double.isNaN(a); + } + public List getGrids() { return grids; } diff --git a/core/src/main/java/org/locationtech/proj4j/parser/Proj4Keyword.java b/core/src/main/java/org/locationtech/proj4j/parser/Proj4Keyword.java index 6c84c86..96ce065 100755 --- a/core/src/main/java/org/locationtech/proj4j/parser/Proj4Keyword.java +++ b/core/src/main/java/org/locationtech/proj4j/parser/Proj4Keyword.java @@ -23,6 +23,7 @@ public class Proj4Keyword { public static final String a = "a"; public static final String b = "b"; + public static final String e = "e"; public static final String f = "f"; public static final String alpha = "alpha"; public static final String datum = "datum"; @@ -52,9 +53,42 @@ public class Proj4Keyword { public static final String R_h = "R_h"; public static final String R_lat_a = "R_lat_a"; public static final String R_lat_g = "R_lat_g"; + public static final String R_C = "R_C"; public static final String rf = "rf"; public static final String h = "h"; + /** + * {@code +h_0} - the "average height of the terrain" of {@code +proj=col_urban} + * ({@code col_urban.cpp:65}, {@code pj_param(ctx, P->params, "dh_0").f}). It is + * that operator's only mandatory parameter beyond the ellipsoid, so the single + * {@code builtins.gie} {@code col_urban} row is unreachable without it. + *

+ * Distinct from {@link #h}, the satellite height of {@code geos}/{@code nsper}/ + * {@code tpers}, and from the {@code h}/{@code h_0} that {@code io.cpp:12520} + * lists as metre-valued in the CRS parser. + *

+ * Dispatched on {@code ColombiaUrbanProjection} by + * {@code Proj4Parser.parseProjection}. It is read with {@code pj_param}'s + * {@code d} sigil, i.e. a plain double, and is always metres regardless of + * {@code +units}. + */ + public static final String h_0 = "h_0"; + + /** + * Shape parameters in the fixed precedence order used by PROJ's + * {@code ellps_shape} (ell_set.cpp). Exactly one of these takes + * effect: the loop breaks on the first one present. + */ + public static final String[] SHAPE_PARAMS = {rf, f, es, e, b}; + + /** + * Spherification parameters in the fixed precedence order used by PROJ's + * {@code ellps_spherification}. Exactly one of these takes effect. + */ + public static final String[] SPHERIFICATION_PARAMS = { + R_A, R_V, R_a, R_g, R_h, R_lat_a, R_lat_g, R_C + }; + public static final String south = "south"; public static final String to_meter = "to_meter"; public static final String towgs84 = "towgs84"; @@ -69,9 +103,384 @@ public class Proj4Keyword { public static final String wktext = "wktext"; public static final String no_uoff = "no_uoff"; + /** + * {@code +rot}, {@code +shape}, {@code +scrollx}, {@code +scrolly} - the four + * operator-scoped keys of the {@code adams.cpp}/{@code spilhaus.cpp} family, alongside + * {@link #azi} which was already declared above. + *

+ * {@code +shape} is read by {@code peirce_q} alone + * ({@code adams.cpp:405}), {@code +scrollx}/{@code +scrolly} only inside its + * {@code horizontal}/{@code vertical} branches ({@code adams.cpp:420-447}), and + * {@code +rot} by {@code spilhaus} alone. {@code +azi} is read upstream by + * {@code spilhaus}, {@code tpers} ({@code nsper.cpp:196}), {@code labrd} + * ({@code labrd.cpp:117}) and {@code isea} ({@code isea.cpp:1024}). + *

+ * {@code +azi} is now dispatched per class to three of those four - + * {@code SpilhausProjection}, {@code TiltedPerspectiveProjection} and + * {@code LabordeProjection} - which is exactly the set that is registered in + * {@code Registry}. {@code isea} is not ported, so its {@code +proj=} name is + * refused before {@code +azi} can matter. + *

+ * That per-class fan-out is not optional, and it is why {@code tpers} was + * left unregistered for a stage. {@code Proj4Parser} used to send {@code +azi} to + * {@code SpilhausProjection} and nowhere else, so registering {@code tpers} on its + * own would have made {@code +proj=tpers +azi=20} parse cleanly, pass the + * allow-list, drop the azimuth and return a silently wrong map - the same + * defect as {@code +proj=peirce_q +shape=square} projecting as a diamond. + * {@code labrd} had already been registered with the same hole open: + * {@code labrd.cpp:117} rotates its complex correction by {@code 2*Az} and + * {@code LabordeProjection.setAziRadians} was reachable only from Java. No + * corpus row exercises {@code labrd +azi}, which is precisely why it survived. + */ + public static final String rot = "rot"; + public static final String shape = "shape"; + public static final String scrollx = "scrollx"; + public static final String scrolly = "scrolly"; + + /** + * {@code +tilt} - {@code tpers}'s rotation of the image plane out of the tangent + * plane, upstream's {@code omega} ({@code nsper.cpp:186}, + * {@code pj_param(ctx, P->params, "rtilt").f}). Read with the {@code r} sigil, + * so it takes every angular syntax {@code dmstor} accepts. + *

+ * Read by {@code tpers} and by nothing else, and dispatched on + * {@code TiltedPerspectiveProjection} alone. Registering it is what made + * {@code +proj=tpers} safe to add to {@code Registry}: before that, + * {@code +tilt} was not a keyword at all, so that half already failed closed + * while {@link #azi} did not. + */ + public static final String tilt = "tilt"; + + /** + * {@code +over} - suppress the ±π reduction of longitude + * ({@code init.cpp:601}, {@code pj_param(ctx, start, "bover").i}), so it is a + * {@code b} sigil: a bare {@code +over} is true and {@code +over=f} is + * explicitly false. + *

+ * Global, not operator-scoped. {@code fwd_prepare} skips both of its + * {@code adjlon} calls when it is set ({@code fwd.cpp:82-83}, {@code :110-111}) + * and {@code inv_finalize} skips its one ({@code inv.cpp:115-116}), which is why + * it is dispatched through {@code Projection.setOver} rather than on a concrete + * class. It does not disable {@code +lon_wrap}. + *

+ * Upstream also has a context-level {@code forceOver} that ORs in over the + * parameter ({@code init.cpp:602-603}); it is settable only through + * {@code proj_context_set_enable_area_of_use}-style C API calls and has no + * proj-string spelling, so it is deliberately not modelled. + */ + public static final String over = "over"; + + /** + * {@code +W} - read by two operators: {@code lagrng}, where it is the + * fraction of a hemisphere the boundary circle spans ({@code lagrng.cpp:79-85}, + * default {@code 2}), and {@code hammer}, where it is the longitudinal + * compression ({@code hammer.cpp:63-70}, default {@code .5}, and + * {@code W = 1} is the Lambert azimuthal). Capital W; PROJ's parameter + * names are case sensitive and there is no lower-case synonym. + *

+ * Both test presence with {@code t} and only then read the value with {@code d}, + * so it is a plain double and not an angle, and both reject {@code W <= 0} - + * though {@code hammer} takes {@code fabs} first and {@code lagrng} does not. + * Each class's {@code initialize()} raises the equivalent, so nothing is + * validated twice in the parser. + *

+ * {@code hammer} is the reason this key must be dispatched to both. + * Registering it for {@code lagrng} alone made + * {@code builtins.gie:2596}'s {@code +proj=hammer +a=6400000 +W=1} executable + * with {@code W} dropped, and that row is an {@code expect failure}: at + * {@code (-180, 0)} the true {@code W = 1} forward is singular, while + * {@code W = .5} returns a perfectly plausible {@code -18101933.598}. Measured - + * one "failed to fail" appeared in the corpus and this is how it was found. + */ + public static final String W = "W"; + + /** + * {@code +M} - {@code hammer}'s aspect factor and {@code hammer}'s alone + * ({@code hammer.cpp:72-79}), default {@code 1}. A plain {@code d} behind a + * {@code t} presence test, {@code fabs}'d, and {@code M <= 0} is a hard + * error. + *

+ * Capital M, and unrelated to {@link #m}, the lower-case shape parameter + * of {@code gn_sinu}. Two different keys that differ only in case is exactly the + * kind of thing a case-insensitive parameter map would silently merge. + *

+ * No corpus row uses it; it is dispatched because {@code +W} is, and shipping one + * half of {@code hammer}'s parameter pair is the drift that creates the next + * silent wrong answer. + */ + public static final String M = "M"; + + /** + * {@code +no_cut}, {@code +lat_b} - {@code airy}'s two parameters, and + * {@code airy}'s alone ({@code airy.cpp:119-120}). + *

+ * {@code +no_cut} is a {@code b} sigil, so {@code +no_cut=f} really is off; + * {@code +lat_b} is an {@code r}, so it is an angle in radians once parsed. + * Both are dispatched on {@code AiryProjection}, whose setters already existed + * and were reachable only from Java. + */ + public static final String no_cut = "no_cut"; + public static final String lat_b = "lat_b"; + + /** + * {@code +guam} - {@code aeqd}'s Guam variant ({@code aeqd.cpp:301}, + * {@code pj_param(ctx, P->params, "bguam").i}), a {@code b} sigil. + *

+ * It replaces both the forward and the inverse with + * {@code e_guam_fwd}/{@code e_guam_inv}, and only on the ellipsoidal + * branch: {@code PJ_PROJECTION(aeqd)} tests it inside the {@code es != 0} + * arm, so on a declared sphere it is read, marked used, and has no effect. + * {@code EquidistantAzimuthalProjection} reproduces that placement exactly. + */ + public static final String guam = "guam"; + + /** + * {@code +hyperbolic} - {@code cass}'s Vanua Levu variant ({@code cass.cpp:127}). + *

+ * Read with {@code pj_param_exists}, not with the {@code b} sigil - which + * makes it the one flag in this file where {@code +hyperbolic=f} is + * true, because presence is all that is tested. Reproduced with + * {@code containsKey} rather than {@code parseBoolean} for exactly that reason. + *

+ * Like {@link #guam} it is tested inside the ellipsoidal arm only + * ({@code PJ_PROJECTION(cass)} returns early for {@code es == 0}), so on a + * sphere it has no effect. + */ + public static final String hyperbolic = "hyperbolic"; + + /** + * {@code +lsat} - the Landsat vehicle number, 1 to 5 ({@code som.cpp:307-313}). + * Read with {@code pj_param}'s {@code i} sigil, so its grammar is decimal + * digits and nothing else; see {@code Proj4Parser.parseIntStrict}. + *

+ * Upstream has no default and 0 is out of range, so a bare + * {@code +proj=lsat} is an error there. {@code LandsatProjection} keeps 1 and + * {@link #path} 120 as its defaults instead - see that class for why, and for + * what has to be re-pinned before they can become 0. + */ + public static final String lsat = "lsat"; + + /** + * {@code +no_off} - the documented spelling of {@code omerc}'s "no offset" switch. + * Upstream tests either spelling ({@code omerc.cpp:139-144}, + * {@code pj_param(..., "tno_off").i || pj_param(..., "tno_uoff").i}); Proj4J + * recognised only the backwards-compatible {@link #no_uoff}, so the spelling the + * documentation and most definitions use was silently dropped. + */ + public static final String no_off = "no_off"; + + /** + * {@code +lon_1}, {@code +lon_2} - the longitudes of {@code omerc}'s two-point + * form ({@code omerc.cpp:152-155}, read through {@code pj_param}'s {@code "r"} + * sigil, so they take every angular syntax). {@code +lat_1}/{@code +lat_2} were + * already dispatched, so a two-point definition could previously supply only its + * latitudes and silently kept {@code lon_1 = lon_2 = 0}. + */ + public static final String lon_1 = "lon_1"; + public static final String lon_2 = "lon_2"; + + /** + * {@code +n} - required by {@code urmfps} ({@code urmfps.cpp:56-66}: absent is + * "Missing parameter n.", and it must lie in {@code ]0,1]}), by {@code urm5} + * ({@code urm5.cpp:36-47}, same range) and by {@code gn_sinu} + * ({@code gn_sinu.cpp:180-198}, which requires only {@code n > 0}). + * Undocumented upstream in all three cases; all three read it with + * {@code pj_param}'s {@code d} sigil. + */ + public static final String n = "n"; + + /** + * {@code +m} - required by {@code gn_sinu} alongside {@link #n} + * ({@code gn_sinu.cpp:184-187} is "Missing parameter m.", {@code :195-198} is + * {@code m >= 0}). Undocumented upstream, and the sole + * {@code builtins.gie} {@code gn_sinu} row is {@code +m=1 +n=2}, so the operator + * is unreachable without it. + *

+ * Dispatched on {@code GeneralSinusoidalProjection} only. {@code sinu}, + * {@code eck6} and {@code mbtfps} share {@code gn_sinu.cpp}'s kernel but hard-code + * their own {@code m}/{@code n} and never read either key - which is why + * {@code McBrydeThomasFlatPolarSinusoidalProjection}, a sibling subclass of the + * same base, must not receive it. + */ + public static final String m = "m"; + + /** + * {@code +q} - {@code urm5}'s optional cubic term, default 0 + * ({@code urm5.cpp:49}, {@code pj_param(..., "dq").f / 3.}). Undocumented + * upstream. Read with the {@code d} sigil, and unrelated to the {@code q} that + * {@code io.cpp:12520} lists as a unitless scale in the CRS parser. + */ + public static final String q = "q"; + + /** + * {@code +inc_angle}, {@code +ps_rev}, {@code +asc_lon} - the three orbital + * parameters of {@code +proj=som} ({@code som.cpp:250-270}). + *

+ * {@code +inc_angle} and {@code +asc_lon} are read with {@code pj_param}'s + * {@code r} sigil, so they take every angular syntax {@code dmstor} + * accepts - and {@code builtins.gie} exercises exactly that, giving two of its + * four {@code som} blocks {@code +inc_angle=1.7157253262878522r} with the radian + * suffix. {@code +ps_rev} is a plain {@code d}, in days per revolution. + *

+ * Upstream defaults all three to 0 and 0 passes all three of its own range + * checks, so before these keys were dispatched a fully-specified {@code som} + * definition would have projected from a zero-inclination zero-period orbit. + */ + public static final String inc_angle = "inc_angle"; + public static final String ps_rev = "ps_rev"; + public static final String asc_lon = "asc_lon"; + + /** + * {@code +path} - the orbital path number of {@code misrsom} (and, upstream, of + * {@code lsat}), {@code som.cpp:287}. Read with {@code pj_param}'s {@code i} + * sigil, whose grammar is digits and nothing else: {@code param.cpp:180-187} runs + * {@code atoi} and then rejects the value if any character is outside + * {@code 0-9}, so {@code +path=12a} and {@code +path=-5} are both errors rather + * than 12 and -5. See {@code Proj4Parser}'s {@code parseIntStrict}. + *

+ * Dispatched on {@code MisrSpaceObliqueMercatorProjection} and on + * {@code LandsatProjection}, which is the same pair of operators that reads it + * upstream ({@code som.cpp:287} for {@code misrsom}, {@code :318} for + * {@code lsat}). It used to reach {@code misrsom} only, while + * {@code LandsatProjection.initialize()} hard-coded {@code path = 120} behind a + * {@code //FIXME} - so {@code +proj=lsat +path=2} returned path 120's map with no + * error. That is why the conformance bridge classified this key + * {@code CONDITIONAL} rather than {@code HONOURED}; with both dispatches in place + * the two sets coincide and it can move. + */ + public static final String path = "path"; + + /** + * {@code +no_rot} - {@code omerc}'s "do not rotate the (u,v) frame" switch + * ({@code omerc.cpp:145}, {@code pj_param(..., "tno_rot").i}). + *

+ * Deliberately NOT registered in {@link #supportedParameters()}. + * {@code ObliqueMercatorProjection.rot} is a private field assigned + * {@code true} unconditionally in that class's {@code initialize()} and there is + * no setter, so {@code Proj4Parser} has nothing to hand the flag to. Registering + * the key without dispatching it is the dangerous direction: it would make + * {@code builtins.gie:5246} and {@code :5269} look executable and return a + * rotated answer where PROJ returns an unrotated one. Register it here and + * in the conformance bridge's {@code HONOURED} in the same change that gives + * that class a setter. + */ + public static final String no_rot = "no_rot"; + + /** + * The ten {@code +o_}-prefixed parameters of {@code +proj=ob_tran} + * ({@code ob_tran.cpp:130-281}). + *

+ * These are not dispatched value by value. {@code ob_tran_target_params} + * rewrites {@code o_proj=xxx} into {@code proj=xxx} by advancing the token pointer + * two characters ({@code ob_tran.cpp:159}, {@code args.argv[i] += 2}) and hands the + * whole rewritten list to the child's initialiser, so it operates on the raw + * argument list and not on a parsed map. {@code Proj4Parser.parse} therefore + * passes {@code args} down to {@code parseProjection}, which makes one call to + * {@code ObliqueTransformationProjection.setParameters(String[])}. + *

+ * They are registered individually all the same, for two reasons: STRICT mode + * checks the key set, and the conformance bridge's {@code toProj4Args()} filters + * the definition through {@link #isSupported(String)} - so an unregistered + * {@code +o_lat_p} would be dropped from the array before {@code setParameters} + * ever saw it. + *

+ * All nine angular ones are read through {@code pj_param}'s {@code r} sigil; + * {@code +o_proj} is an {@code s}. {@code +o_alpha} beats {@code +o_lat_p} beats + * the two-point {@code +o_lon_1}/{@code +o_lat_1}/{@code +o_lon_2}/{@code +o_lat_2} + * form, chosen by presence and never by value. + */ + public static final String o_proj = "o_proj"; + public static final String o_lat_p = "o_lat_p"; + public static final String o_lon_p = "o_lon_p"; + public static final String o_alpha = "o_alpha"; + public static final String o_lon_c = "o_lon_c"; + public static final String o_lat_c = "o_lat_c"; + public static final String o_lon_1 = "o_lon_1"; + public static final String o_lon_2 = "o_lon_2"; + public static final String o_lat_1 = "o_lat_1"; + public static final String o_lat_2 = "o_lat_2"; + + /** Every key {@code ob_tran} reads, in {@code ob_tran.cpp}'s own order. */ + public static final String[] OB_TRAN_PARAMS = { + o_proj, o_alpha, o_lon_c, o_lat_c, o_lat_p, o_lon_p, + o_lon_1, o_lat_1, o_lon_2, o_lat_2 + }; + + /** + * The six vertical-axis keys. None of them is dispatched by + * {@code Proj4Parser}, and none of them needs to be - the vertical stack + * reads them straight off {@code ProjParams} in the pipeline layer + * ({@code pipeline/Cs2csOperator} for {@code geoidgrids}/{@code vunits}/ + * {@code vto_meter}/{@code z_0}, {@code pipeline/PipelineFactory} for + * {@code multiplier}). Registering them here does exactly one thing: it stops + * STRICT mode rejecting a definition PROJ accepts. + * + * + * + * + * + * + * + * + * + * + *
where each one is read upstream
keyupstream
{@code geoidgrids}{@code datum_set.cpp} sets + * {@code has_geoid_vgrids}; {@code create.cpp:88-105} inserts + * {@code +proj=vgridshift +grids=}
{@code vunits}{@code init.cpp:715-750}; looked up in + * {@code pj_list_linear_units()} and wins over {@code vto_meter}, + * which is then never read
{@code vto_meter}{@code init.cpp:715-750}, same + * {@code num/den} ratio grammar as {@code +to_meter} - + * {@code Proj4Parser.parseToMeter} already implements it and its javadoc + * already names this key
{@code z_0}{@code init.cpp}; always metres, and + * undocumented
{@code geoid_crs}not read by {@code pj_init} at all - + * only the CRS parser honours it, and only when {@code +geoidgrids} is also + * present ({@code io.cpp:12750-12800} force-marks it used). To an operation + * it is an inert token
{@code multiplier}{@code vgridshift}/{@code deformation} + * only; the auto-inserted {@code vgridshift} step deliberately does not + * inherit it and always runs at the default of {@code -1}
+ */ + public static final String geoidgrids = "geoidgrids"; + public static final String vunits = "vunits"; + public static final String vto_meter = "vto_meter"; + public static final String z_0 = "z_0"; + public static final String geoid_crs = "geoid_crs"; + public static final String multiplier = "multiplier"; + + /** + * {@code +approx} - {@code tmerc}/{@code utm}'s documented escape hatch back to the + * Evenden/Snyder series ({@code tmerc.cpp:558-561}). Read through {@code pj_param}'s + * {@code b} sigil, so a bare {@code +approx} is true and {@code +approx=f} is + * explicitly false; it is tested before {@link #algo} and wins over it. + *

+ * PROJ 9.8.1 ships Poder/Engsager as the built-in {@code tmerc} algorithm and this + * library now matches, so without this key there is no way to ask for the previous + * behaviour - and the difference is unbounded away from the central meridian + * (~0.8 mm at 6°, metres at 20°, kilometres beyond 45°). + */ + public static final String approx = "approx"; + + /** + * {@code +algo=evenden_snyder|poder_engsager|auto} - {@code tmerc}/{@code utm} only + * ({@code tmerc.cpp:563-578}). An unrecognised value is "unknown value for +algo" + * upstream; {@code TransverseMercatorProjection.setAlgorithm} raises the equivalent, + * so no validation is duplicated here. + */ + public static final String algo = "algo"; + private static Set supportedParams = null; + /** + * The set of PROJ.4 keys this library recognises. + *

+ * Note this allow-list is stricter than PROJ. PROJ has no + * enumeration of valid keys anywhere: {@code init.cpp} retains every token + * verbatim and recognition is pull-based, so an unrecognised {@code +key} + * is silently ignored and never an error. Enforcement of this list is + * therefore opt-in — see {@link Proj4Parser.ParseMode#STRICT}. + * + * @return the recognised keys + */ public static synchronized Set supportedParameters() { if (supportedParams == null) { supportedParams = new TreeSet(); @@ -81,13 +490,17 @@ public static synchronized Set supportedParameters() { supportedParams.add(f); supportedParams.add(alpha); supportedParams.add(es); + supportedParams.add(e); supportedParams.add(b); supportedParams.add(datum); supportedParams.add(ellps); supportedParams.add(h); + supportedParams.add(h_0); // Just for col_urban supportedParams.add(R); - supportedParams.add(R_A); + for (String key : SPHERIFICATION_PARAMS) { + supportedParams.add(key); + } supportedParams.add(k); supportedParams.add(k_0); @@ -112,8 +525,66 @@ public static synchronized Set supportedParameters() { supportedParams.add(gamma); // Just for Oblique Mercator projection supportedParams.add(no_uoff); // Just for Oblique Mercator projection + supportedParams.add(no_off); // Just for Oblique Mercator projection + supportedParams.add(lon_1); // Just for Oblique Mercator, two-point form + supportedParams.add(lon_2); // Just for Oblique Mercator, two-point form + // Registered only now that ObliqueMercatorProjection.setNoRot exists AND + // Proj4Parser dispatches it. Registering it earlier would have been the + // dangerous direction: the conformance bridge would have called + // builtins.gie:5246/:5269 executable and they would have returned a ROTATED + // answer where PROJ returns an unrotated one - a plausible wrong number + // instead of an honest NOT_IMPLEMENTED. Add to Proj4jCapabilities.HONOURED in + // the same change, never separately. + supportedParams.add(no_rot); // Just for Oblique Mercator projection + supportedParams.add(n); // urmfps, urm5 and gn_sinu + supportedParams.add(m); // Just for gn_sinu + supportedParams.add(q); // Just for urm5 + supportedParams.add(approx); // Just for tmerc / utm + supportedParams.add(algo); // Just for tmerc / utm supportedParams.add(zone); // Just for Transverse Mercator projection + supportedParams.add(shape); // Just for Peirce Quincuncial + supportedParams.add(scrollx); // Just for Peirce Quincuncial, +shape=horizontal + supportedParams.add(scrolly); // Just for Peirce Quincuncial, +shape=vertical + // +azi reaches spilhaus, tpers AND labrd - the whole registered set of the + // four operators that read it upstream. Registering it while it reached only + // Spilhaus is what kept tpers out of Registry: it would have made + // "+proj=tpers +azi=20" a silently unrotated map. Never widen Registry for an + // +azi reader without widening the dispatch in the same change. + supportedParams.add(azi); // spilhaus, tpers, labrd (upstream: also isea) + supportedParams.add(rot); // Just for Spilhaus + supportedParams.add(tilt); // Just for tpers + + supportedParams.add(inc_angle); // Just for som + supportedParams.add(ps_rev); // Just for som + supportedParams.add(asc_lon); // Just for som + supportedParams.add(path); // misrsom and lsat + supportedParams.add(lsat); // Just for lsat + + supportedParams.add(over); // global: fwd_prepare and inv_finalize + supportedParams.add(W); // lagrng AND hammer - both, never one + supportedParams.add(M); // Just for hammer + supportedParams.add(no_cut); // Just for airy + supportedParams.add(lat_b); // Just for airy + supportedParams.add(guam); // Just for aeqd, ellipsoidal branch only + supportedParams.add(hyperbolic); // Just for cass, ellipsoidal branch only + + // ob_tran: registered so that STRICT accepts them and so that a filtering + // caller does not strip them out of the argument array before + // ObliqueTransformationProjection.setParameters(String[]) sees it. Not + // dispatched individually - see OB_TRAN_PARAMS. + for (String key : OB_TRAN_PARAMS) { + supportedParams.add(key); + } + + // Vertical axis. Read in the pipeline layer, never by Proj4Parser. + supportedParams.add(geoidgrids); + supportedParams.add(vunits); + supportedParams.add(vto_meter); + supportedParams.add(z_0); + supportedParams.add(geoid_crs); + supportedParams.add(multiplier); + supportedParams.add(title); // no-op supportedParams.add(no_defs); // no-op supportedParams.add(wktext); // no-op diff --git a/core/src/main/java/org/locationtech/proj4j/parser/Proj4Parser.java b/core/src/main/java/org/locationtech/proj4j/parser/Proj4Parser.java index b15950b..d34227b 100755 --- a/core/src/main/java/org/locationtech/proj4j/parser/Proj4Parser.java +++ b/core/src/main/java/org/locationtech/proj4j/parser/Proj4Parser.java @@ -16,58 +16,152 @@ package org.locationtech.proj4j.parser; import java.io.IOException; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.locationtech.proj4j.*; import org.locationtech.proj4j.datum.Datum; import org.locationtech.proj4j.datum.Ellipsoid; import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.proj.AiryProjection; +import org.locationtech.proj4j.proj.CassiniProjection; +import org.locationtech.proj4j.proj.ColombiaUrbanProjection; +import org.locationtech.proj4j.proj.EquidistantAzimuthalProjection; import org.locationtech.proj4j.proj.ExtendedTransverseMercatorProjection; +import org.locationtech.proj4j.proj.FoucautSinusoidalProjection; +import org.locationtech.proj4j.proj.GeneralSinusoidalProjection; +import org.locationtech.proj4j.proj.HammerProjection; +import org.locationtech.proj4j.proj.InternationalMapOfTheWorldPolyconicProjection; +import org.locationtech.proj4j.proj.LabordeProjection; +import org.locationtech.proj4j.proj.LagrangeProjection; +import org.locationtech.proj4j.proj.LandsatProjection; +import org.locationtech.proj4j.proj.MisrSpaceObliqueMercatorProjection; +import org.locationtech.proj4j.proj.ObliqueCylindricalEqualAreaProjection; +import org.locationtech.proj4j.proj.ObliqueMercatorProjection; +import org.locationtech.proj4j.proj.ObliqueTransformationProjection; +import org.locationtech.proj4j.proj.PeirceQuincuncialProjection; import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpaceObliqueMercatorProjection; +import org.locationtech.proj4j.proj.SpilhausProjection; +import org.locationtech.proj4j.proj.TiltedPerspectiveProjection; import org.locationtech.proj4j.proj.TransverseMercatorProjection; +import org.locationtech.proj4j.proj.TwoPointEquidistantProjection; +import org.locationtech.proj4j.proj.Urmaev5Projection; +import org.locationtech.proj4j.proj.UrmaevFlatPolarSinusoidalProjection; import org.locationtech.proj4j.units.Angle; -import org.locationtech.proj4j.units.AngleFormat; import org.locationtech.proj4j.units.Unit; import org.locationtech.proj4j.units.Units; import org.locationtech.proj4j.util.ProjectionMath; public class Proj4Parser { - private Registry registry; + /** + * Controls how far parsing goes beyond what PROJ itself rejects. + */ + public enum ParseMode { + /** + * Behave like PROJ: unrecognised keys are retained and ignored rather + * than being errors, and an unknown {@code +units} name falls back to + * metres as it always has in PROJ4J. Only values of recognised + * keys are validated. + */ + PROJ_COMPATIBLE, + + /** + * Additionally rejects things PROJ tolerates: keys outside + * {@link Proj4Keyword#supportedParameters()} and {@code +units} names + * this library cannot resolve. + */ + STRICT + } + + private final Registry registry; + private final ParseMode mode; public Proj4Parser(Registry registry) { + this(registry, ParseMode.PROJ_COMPATIBLE); + } + + public Proj4Parser(Registry registry, ParseMode mode) { this.registry = registry; + this.mode = mode; + } + + public ParseMode getParseMode() { + return mode; + } + + /** + * Parses a whitespace-separated PROJ.4 parameter string. + *

+ * Tokenised with the same {@code split("\\s+")} {@link org.locationtech.proj4j.CRSFactory} + * has always used, so the two entry points cannot drift: a leading separator yields an + * empty first token, which {@link #createParameterMap(String[])} skips exactly as it + * skips one in a caller-supplied array. + *

+ * This overload exists so that a caller wanting a non-default {@link ParseMode} does not + * have to reimplement the tokenisation. {@code CRSFactory} is deliberately not + * routed through it: the 1.x API is frozen at {@link ParseMode#PROJ_COMPATIBLE}. + * + * @param name a name for the CRS, or null for an anonymous one + * @param paramStr the parameter string, or null + * @return the CRS, or null if {@code paramStr} is null + * @since 1.5.0 + */ + public CoordinateReferenceSystem parse(String name, String paramStr) { + if (paramStr == null) + return null; + return parse(name, paramStr.split("\\s+")); } public CoordinateReferenceSystem parse(String name, String[] args) { if (args == null) return null; - Map params = createParameterMap(args); - Proj4Keyword.checkUnsupported(params.keySet()); + Map params = createParameterMap(args); + if (mode == ParseMode.STRICT) { + Proj4Keyword.checkUnsupported(params.keySet()); + } DatumParameters datumParam = new DatumParameters(); parseDatum(params, datumParam); parseEllipsoid(params, datumParam); Datum datum = datumParam.getDatum(); - datum.setGrids(datumParam.getGrids()); - Ellipsoid ellipsoid = datum.getEllipsoid(); + // NOTE: datum must never be mutated here. datumParam.getDatum() may + // return one of the shared Datum singletons (Datum.NAD27 etc.), and + // calling setGrids() on it would corrupt it process-wide - which is + // what used to destroy NAD27's grid list on the first parse of + // EPSG:4267. DatumParameters.getDatum() derives a new Datum instead. + Ellipsoid ellipsoid = datumParam.isSphere() + ? datumParam.getEllipsoid() + : datum.getEllipsoid(); // TODO: this makes a difference - why? // which is better? -// Ellipsoid ellipsoid = datumParam.getEllipsoid(); - Projection proj = parseProjection(params, ellipsoid); +// Ellipsoid ellipsoid = datumParam.getEllipsoid(); + Projection proj = parseProjection(params, ellipsoid, args); return new CoordinateReferenceSystem(name, args, datum, proj); } /** * Creates a {@link Projection} * initialized from a PROJ.4 argument list. + * + * @param params the argument list as a key/value map, first occurrence winning + * @param ellipsoid the resolved ellipsoid + * @param args the raw argument list. Needed by {@code +proj=ob_tran} and by + * nothing else: {@code ob_tran_target_params} rewrites {@code o_proj=xxx} into + * {@code proj=xxx} by advancing the token pointer two characters + * ({@code ob_tran.cpp:159}) and passes the whole list to the child's + * initialiser, so it needs the list and not the map. May be {@code null} for a + * caller that has only a map, in which case an {@code ob_tran} definition + * fails with {@link ErrorCause#MISSING_PARAM} rather than silently losing its + * child. */ - private Projection parseProjection(Map params, Ellipsoid ellipsoid) { + private Projection parseProjection(Map params, Ellipsoid ellipsoid, + String[] args) { Projection projection = null; String s; - s = (String) params.get(Proj4Keyword.proj); + s = params.get(Proj4Keyword.proj); if (s != null) { projection = registry.getProjection(s); if (projection == null) @@ -82,102 +176,603 @@ private Projection parseProjection(Map params, Ellipsoid ellipsoid) { // Should be able to report the original param string in the error message // Should the exception be lib-specific? (e.g. ParseException) - s = (String) params.get(Proj4Keyword.alpha); + s = params.get(Proj4Keyword.alpha); if (s != null) - projection.setAlphaDegrees(Double.parseDouble(s)); + projection.setAlphaDegrees(parseAngle(Proj4Keyword.alpha, s)); - s = (String) params.get(Proj4Keyword.lonc); + s = params.get(Proj4Keyword.lonc); if (s != null) - projection.setLonCDegrees(Double.parseDouble(s)); + projection.setLonCDegrees(parseAngle(Proj4Keyword.lonc, s)); - s = (String) params.get(Proj4Keyword.lat_0); + s = params.get(Proj4Keyword.lat_0); if (s != null) - projection.setProjectionLatitudeDegrees(parseAngle(s)); + projection.setProjectionLatitudeDegrees(parseAngle(Proj4Keyword.lat_0, s)); - s = (String) params.get(Proj4Keyword.lon_0); + s = params.get(Proj4Keyword.lon_0); if (s != null) - projection.setProjectionLongitudeDegrees(parseAngle(s)); + projection.setProjectionLongitudeDegrees(parseAngle(Proj4Keyword.lon_0, s)); - s = (String) params.get(Proj4Keyword.lat_1); + s = params.get(Proj4Keyword.lat_1); if (s != null) - projection.setProjectionLatitude1Degrees(parseAngle(s)); + projection.setProjectionLatitude1Degrees(parseAngle(Proj4Keyword.lat_1, s)); - s = (String) params.get(Proj4Keyword.lat_2); + s = params.get(Proj4Keyword.lat_2); if (s != null) - projection.setProjectionLatitude2Degrees(parseAngle(s)); + projection.setProjectionLatitude2Degrees(parseAngle(Proj4Keyword.lat_2, s)); - s = (String) params.get(Proj4Keyword.lat_ts); + s = params.get(Proj4Keyword.lat_ts); if (s != null) - projection.setTrueScaleLatitudeDegrees(parseAngle(s)); + projection.setTrueScaleLatitudeDegrees(parseAngle(Proj4Keyword.lat_ts, s)); - s = (String) params.get(Proj4Keyword.x_0); + s = params.get(Proj4Keyword.x_0); if (s != null) - projection.setFalseEasting(Double.parseDouble(s)); + projection.setFalseEasting(parseDouble(Proj4Keyword.x_0, s)); - s = (String) params.get(Proj4Keyword.y_0); + s = params.get(Proj4Keyword.y_0); if (s != null) - projection.setFalseNorthing(Double.parseDouble(s)); + projection.setFalseNorthing(parseDouble(Proj4Keyword.y_0, s)); - s = (String) params.get(Proj4Keyword.k_0); + // PROJ checks k_0 after k, so k_0 wins when both are given + s = params.get(Proj4Keyword.k_0); if (s == null) - s = (String) params.get(Proj4Keyword.k); + s = params.get(Proj4Keyword.k); if (s != null) - projection.setScaleFactor(Double.parseDouble(s)); - if (params.containsKey(Proj4Keyword.no_uoff)) + projection.setScaleFactor(parseDouble(Proj4Keyword.k_0, s)); + /* + * omerc tests +no_off and +no_uoff with the same "t" (presence) sigil and ORs + * them (omerc.cpp:139-144), so they are synonyms; only the second was + * recognised here, which silently dropped the spelling the documentation uses. + */ + if (params.containsKey(Proj4Keyword.no_uoff) || params.containsKey(Proj4Keyword.no_off)) projection.setNoUoff(true); - s = (String) params.get(Proj4Keyword.gamma); + s = params.get(Proj4Keyword.gamma); if (s != null) - projection.setGammaDegrees(Double.parseDouble(s)); + projection.setGammaDegrees(parseAngle(Proj4Keyword.gamma, s)); - s = (String) params.get(Proj4Keyword.units); - if (s != null) { - Unit unit = Units.findUnits(s); - // TODO: report unknown units name as error - if (unit != null) { - projection.setFromMetres(1.0 / unit.value); - projection.setUnits(unit); + /* + * The linear unit, resolved exactly once, the way init.cpp:678-714 does it: + * + * if (+units given) -> look it up; that entry's own to_meter string is + * what gets parsed, and +to_meter is NEVER READ + * else if (+to_meter) -> parse it, ratio syntax included + * else -> 1 + * + * PROJ4J used to apply +units and then overwrite it with +to_meter, so + * +to_meter won - exactly inverted. Verified against 9.8.1: + * "+proj=merc +ellps=GRS80 +to_meter=0.3048 +units=us-ft" and the same + * pair in the other order both give 730441.392088531, i.e. the US foot, + * not the international one (730442.852974236). + * + * Neither +units nor +to_meter changes what +x_0/+y_0/+a/+b mean: those + * are always metres. The output affine is fr_meter * (a*x + x_0) + * (fwd.cpp:143-146), which is what Projection.initialize()'s + * totalScale/totalFalseEasting already compute - so nothing here scales + * a false easting on the way in. + */ + String unitsName = params.get(Proj4Keyword.units); + if (unitsName != null) { + Unit unit = findUnits(unitsName); + if (unit == null) { + // Units.findUnits() never returns null - it falls back to + // metres for any unknown name - so this is only reachable + // through findUnits() below, and only in STRICT mode. + throw new InvalidValueException("Unknown unit: " + unitsName); } + projection.setFromMetres(1.0 / unit.value); + projection.setUnits(unit); + } else { + s = params.get(Proj4Keyword.to_meter); + if (s != null) + projection.setFromMetres(1.0 / parseToMeter(Proj4Keyword.to_meter, s)); } - s = (String) params.get(Proj4Keyword.to_meter); - if (s != null) - projection.setFromMetres(1.0 / Double.parseDouble(s)); - - s = (String) params.get(Proj4Keyword.h); + s = params.get(Proj4Keyword.h); if (s != null) { - projection.setHeightOfOrbit(Double.parseDouble(s)); + projection.setHeightOfOrbit(parseDouble(Proj4Keyword.h, s)); + } + + /* + * +h_0 is col_urban's and nothing else's (col_urban.cpp:65, + * pj_param(ctx, P->params, "dh_0").f), so it is dispatched on the concrete + * class the way +zone and +shape are. Distinct from +h, the satellite height + * of geos/nsper/tpers handled just above; always metres, never scaled by + * +units. + */ + if (projection instanceof ColombiaUrbanProjection) { + s = params.get(Proj4Keyword.h_0); + if (s != null) + ((ColombiaUrbanProjection) projection) + .setH0(parseDouble(Proj4Keyword.h_0, s)); } if (params.containsKey(Proj4Keyword.south)) projection.setSouthernHemisphere(true); - s = (String) params.get(Proj4Keyword.pm); + /* + * +over is global, not operator-scoped: fwd_prepare skips both of its adjlon + * calls when it is set (fwd.cpp:82-83, :110-111) and inv_finalize skips its one + * (inv.cpp:115-116). Hence Projection.setOver rather than a concrete class. + * + * Read with pj_param's 'b' sigil (init.cpp:601, "bover"), so a bare +over is true + * and +over=f is explicitly false - hence parseBoolean and not containsKey. The + * flag is consulted per coordinate, not by initialize(), so its position here is + * free; it sits with +south because both are frame-level switches. + */ + if (params.containsKey(Proj4Keyword.over)) + projection.setOver(parseBoolean(Proj4Keyword.over, params.get(Proj4Keyword.over))); + + s = params.get(Proj4Keyword.pm); if (s != null) - projection.setPrimeMeridian(s); + projection.setPrimeMeridian(normalizePrimeMeridian(s)); - s = (String) params.get(Proj4Keyword.axis); + s = params.get(Proj4Keyword.axis); if (s != null) projection.setAxisOrder(s); - /* Radius of the sphere given in meters. If used in conjuction with +ellps +R takes precedence. */ - s = (String) params.get(Proj4Keyword.R); - if (s != null) - projection.setRadius(Double.parseDouble(s)); + /* + * +R is NOT handled here. It is a size parameter of the ellipsoid and + * is resolved in parseEllipsoid(), where it declares a sphere + * (es = 0) exactly as ell_set.cpp:92-100 does. The old + * Projection.setRadius(...) call assigned the semi-major axis only, + * leaving e/es from the previous ellipsoid, so the ellipsoidal formula + * ran on a declared sphere. + */ //TODO: implement some of these parameters ? // this must be done last, since behaviour depends on other params being set (eg +south) if (projection instanceof TransverseMercatorProjection) { - s = (String) params.get(Proj4Keyword.zone); + TransverseMercatorProjection tmerc = (TransverseMercatorProjection) projection; + + /* + * +proj=utm requires an ellipsoid. PJ_PROJECTION(utm) opens with + * + * if (P->es == 0.0) { "Invalid value for eccentricity: it should not be + * zero"; PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE } + * + * (tmerc.cpp), whereas PJ_PROJECTION(tmerc) is happy on a sphere and + * dispatches to the spherical formulation. Verified against the installed + * 9.8.1: "+proj=utm +zone=32 +a=6400000" and "+proj=utm +zone=32 +R=6400000" + * both fail with that message, while "+proj=tmerc +R=6400000" projects + * (12, 56) to (747461.594362, 6320539.671392). + * + * Note the condition is "the operation is utm", NOT "+zone was given": + * upstream's check is the first statement of the utm entry point and runs + * before +zone is even looked at, so "+proj=utm +a=6400000" with the zone + * derived from +lon_0 fails too. Keying this on +zone would let that case + * through - and, before utm was bound to this class, it was a + * NullPointerException rather than any kind of reported error. + */ + if ("utm".equals(params.get(Proj4Keyword.proj)) && ellipsoid.getEccentricitySquared() == 0.0) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=utm: Invalid value for eccentricity: it should not be zero. " + + "UTM is defined on an ellipsoid; use +proj=tmerc for a sphere."); + } + + /* + * +approx and +algo select the algorithm and are read by tmerc/utm alone. + * Both setters take effect without a re-initialize(), and +approx is tested + * before +algo and wins over it, exactly as getAlgoFromParams does + * (tmerc.cpp:548-552). setAlgorithm raises INVALID_PARAM_VALUE for an + * unrecognised value itself, so nothing is validated twice here. + * + * Set before +zone, because setUTMZone re-runs initialize(). + */ + if (params.containsKey(Proj4Keyword.approx) + && parseBoolean(Proj4Keyword.approx, params.get(Proj4Keyword.approx))) { + tmerc.setApprox(true); + } + s = params.get(Proj4Keyword.algo); + if (s != null) + tmerc.setAlgorithm(s); + + s = params.get(Proj4Keyword.zone); if (s != null) - ((TransverseMercatorProjection) projection).setUTMZone(Integer - .parseInt(s)); + tmerc.setUTMZone(parseInt(Proj4Keyword.zone, s)); } if (projection instanceof ExtendedTransverseMercatorProjection) { - s = (String) params.get(Proj4Keyword.zone); + s = params.get(Proj4Keyword.zone); + if (s != null) + ((ExtendedTransverseMercatorProjection) projection).setUTMZone(parseInt(Proj4Keyword.zone, s)); + } + /* + * +shape / +scrollx / +scrolly are read by peirce_q and by nothing else + * (adams.cpp:405-453), so they are dispatched on the concrete class in the + * same way +zone is above rather than through a setter on Projection. + * + * A bare "+shape" with no value is an error, not a no-op: pj_param type 's' + * yields the empty string for a valueless token (param.cpp:174-192), which + * matches none of the six names, so pj_adams_setup fails. Silently keeping + * the default there would be the same silent-wrong-answer this dispatch + * exists to remove, so containsKey is tested rather than get() != null. + */ + if (projection instanceof PeirceQuincuncialProjection) { + PeirceQuincuncialProjection peirceQ = (PeirceQuincuncialProjection) projection; + if (params.containsKey(Proj4Keyword.shape)) { + s = params.get(Proj4Keyword.shape); + peirceQ.setShape(s == null ? "" : s); + } + /* + * pj_adams_setup reads +scrollx only inside the "horizontal" branch and + * +scrolly only inside the "vertical" branch (adams.cpp:420-447), so on + * any other shape both are retained-and-ignored - and, because the range + * check lives inside the same branch, an out-of-range value is not even + * an error there. That looks like an upstream oversight; it is + * nonetheless the behaviour the corpus was generated against, so it is + * reproduced rather than regularised. + */ + if (peirceQ.getShape() == PeirceQuincuncialProjection.Shape.HORIZONTAL) { + s = params.get(Proj4Keyword.scrollx); + if (s != null) + peirceQ.setScrollX(parseDouble(Proj4Keyword.scrollx, s)); + } else if (peirceQ.getShape() == PeirceQuincuncialProjection.Shape.VERTICAL) { + s = params.get(Proj4Keyword.scrolly); + if (s != null) + peirceQ.setScrollY(parseDouble(Proj4Keyword.scrolly, s)); + } + } + /* + * +azi is read upstream by FOUR operators - spilhaus (spilhaus.cpp:133-136), + * tpers (nsper.cpp:196), labrd (labrd.cpp:117) and isea (isea.cpp:1024) - and + * +rot by spilhaus alone. All are the "r" sigil, i.e. dmstor, so they take DMS, a + * trailing cardinal and the r/R radian suffix and never bare + * Double.parseDouble. + * + * The fan-out below is load-bearing, not tidiness. While +azi reached + * SpilhausProjection ONLY, `+proj=tpers +azi=20` would have parsed cleanly, + * passed the STRICT allow-list and then dropped the azimuth - a silently + * unrotated map, the same defect class as `+proj=peirce_q +shape=square` + * projecting as a diamond. That is exactly why tpers was left out of Registry + * until this dispatch existed, and why registering the two must never be split. + * labrd was already registered with the same hole open; no corpus row exercises + * `labrd +azi`, which is why it survived unnoticed. + * + * isea is not ported, so its +proj= name is refused before +azi could matter. + * + * All of these must be set before initialize(), which derives cosrot/sinrot, + * lambda_0 and beta (spilhaus), cg/sg/cw/sw (tpers) and Ca/Cb/Cc/Cd (labrd) + * from them. + */ + if (projection instanceof SpilhausProjection) { + SpilhausProjection spilhaus = (SpilhausProjection) projection; + s = params.get(Proj4Keyword.azi); + if (s != null) + spilhaus.setAziDegrees(parseAngle(Proj4Keyword.azi, s)); + + s = params.get(Proj4Keyword.rot); + if (s != null) + spilhaus.setRotDegrees(parseAngle(Proj4Keyword.rot, s)); + } + /* + * tpers is nsper with the image plane rotated out of the tangent plane. +tilt is + * upstream's omega and +azi its gamma (nsper.cpp:186-187), both 'r' sigils and + * both defaulting to 0; +h is inherited and handled above, and is still mandatory + * because nsper_setup rejects h/a <= 0. + * + * parseAngleRadians rather than parseAngle, so an r-suffixed value is scaled + * exactly once instead of by RTD and then by DTR again. + */ + if (projection instanceof TiltedPerspectiveProjection) { + TiltedPerspectiveProjection tpers = (TiltedPerspectiveProjection) projection; + s = params.get(Proj4Keyword.azi); + if (s != null) + tpers.setAziRadians(parseAngleRadians(Proj4Keyword.azi, s)); + + s = params.get(Proj4Keyword.tilt); + if (s != null) + tpers.setTiltRadians(parseAngleRadians(Proj4Keyword.tilt, s)); + } + if (projection instanceof LabordeProjection) { + s = params.get(Proj4Keyword.azi); + if (s != null) + ((LabordeProjection) projection) + .setAziRadians(parseAngleRadians(Proj4Keyword.azi, s)); + } + + /* + * +W is read by TWO operators, not one: lagrng (lagrng.cpp:79-85, default 2) and + * hammer (hammer.cpp:63-70, default .5), and hammer also reads +M + * (hammer.cpp:72-79, default 1). All are plain 'd' doubles behind a 't' presence + * test - not angles - and capital W/M with no lower-case synonyms. `<= 0` is a + * hard error in each; each class's initialize() raises it, so nothing is + * validated twice here. + * + * Dispatching +W to lagrng alone was MEASURED to be wrong, and it is worth + * recording how: it made builtins.gie:2596's `+proj=hammer +a=6400000 +W=1` + * executable with W silently dropped, and that row asserts `expect failure` + * at (-180, 0) - where the W = 1 forward is singular but the W = .5 default + * returns a plausible -18101933.598. The corpus's "failed to fail" count went + * from 0 to 1 and that is how it surfaced. Grepping upstream for EVERY reader of + * a key before registering it is the cheap version of this check: + * + * git grep -nE 'pj_param[^"]*"[a-z]W"' 9.8.1 -- src/ + */ + if (projection instanceof LagrangeProjection) { + s = params.get(Proj4Keyword.W); + if (s != null) + ((LagrangeProjection) projection).setW(parseDouble(Proj4Keyword.W, s)); + } + if (projection instanceof HammerProjection) { + HammerProjection hammer = (HammerProjection) projection; + s = params.get(Proj4Keyword.W); + if (s != null) + hammer.setW(parseDouble(Proj4Keyword.W, s)); + + s = params.get(Proj4Keyword.M); + if (s != null) + hammer.setM(parseDouble(Proj4Keyword.M, s)); + } + + /* + * airy's two parameters, and airy's alone (airy.cpp:119-120). +no_cut is a 'b' + * sigil, so +no_cut=f really is off; +lat_b is an 'r'. Both setters already + * existed and were reachable only from Java, and initialize() derives Cb from + * lat_b without writing either field - which is what makes them survive the + * SECOND initialize() the parser triggers below. + */ + if (projection instanceof AiryProjection) { + AiryProjection airy = (AiryProjection) projection; + if (params.containsKey(Proj4Keyword.no_cut)) + airy.setNoCut(parseBoolean(Proj4Keyword.no_cut, + params.get(Proj4Keyword.no_cut))); + + s = params.get(Proj4Keyword.lat_b); + if (s != null) + airy.setLatB(parseAngleRadians(Proj4Keyword.lat_b, s)); + } + + /* + * +guam swaps aeqd's forward and inverse for the Guam variant (aeqd.cpp:301), a + * 'b' sigil. Upstream tests it INSIDE the `es != 0` arm of PJ_PROJECTION(aeqd), + * so on a declared sphere it is read, marked used and has no effect; that + * placement is reproduced in EquidistantAzimuthalProjection.initialize() rather + * than here, because whether the figure is a sphere is not known until the + * ellipsoid has been applied. + */ + if (projection instanceof EquidistantAzimuthalProjection) { + if (params.containsKey(Proj4Keyword.guam)) + ((EquidistantAzimuthalProjection) projection).setGuam( + parseBoolean(Proj4Keyword.guam, params.get(Proj4Keyword.guam))); + } + + /* + * +hyperbolic is cass's Vanua Levu variant. Read with pj_param_exists + * (cass.cpp:127) and NOT with the 'b' sigil, so presence is the whole test and + * `+hyperbolic=f` is TRUE upstream - hence containsKey rather than parseBoolean. + * That asymmetry with +no_cut/+guam/+over just above is upstream's, and it is the + * kind of thing a "flags are booleans" generalisation gets wrong. + */ + if (projection instanceof CassiniProjection) { + if (params.containsKey(Proj4Keyword.hyperbolic)) + ((CassiniProjection) projection).setHyperbolic(true); + } + + /* + * lsat reads +lsat and +path, both 'i' sigils (som.cpp:307-320), and both through + * parseIntStrict: their grammar is decimal digits and nothing else, so +path=12a + * and +path=-5 are errors rather than 12 and -5. + * + * The class hard-coded land = 1 and path = 120 behind a //FIXME, so + * `+proj=lsat +path=2` silently returned path 120's map. Upstream has no default + * for either and 0 fails both range checks; see LandsatProjection for why 1/120 + * are kept as defaults here and what has to be re-pinned before they can become + * 0. + */ + if (projection instanceof LandsatProjection) { + LandsatProjection lsat = (LandsatProjection) projection; + s = params.get(Proj4Keyword.lsat); + if (s != null) + lsat.setLandsat(parseIntStrict(Proj4Keyword.lsat, s)); + + s = params.get(Proj4Keyword.path); + if (s != null) + lsat.setPath(parseIntStrict(Proj4Keyword.path, s)); + } + + /* + * +lon_1 / +lon_2 are read upstream by FOUR operators, all with pj_param's "r" + * sigil and all as the second half of a two-point form whose latitudes come from + * +lat_1/+lat_2: + * + * omerc (omerc.cpp:152-155) lon_1 and lon_2 + * ocea (ocea.cpp:80-81) lon_1 and lon_2, in the no-+alpha branch only + * tpeqd (tpeqd.cpp:73,75) lon_1 and lon_2 + * imw_p (imw_p.cpp:191-192) lon_1 only; absent means "derive it from the + * latitude", which is a DIFFERENT answer from 0 + * + * +lat_1/+lat_2 were already dispatched through Projection, so all four could be + * given their latitudes but not their longitudes. omerc's dispatch landed first; + * the other three kept reading 0 silently while the conformance bridge listed + * lon_1/lon_2 as honoured - i.e. it vouched for a key three of the four readers + * dropped. builtins.gie's ocea blocks make that visible: `+lon_2=1e-8`, + * `+lon_2=-1e-8` and `+lon_2=1e-5` select the east, west and north-east framings + * and all three collapsed onto the north one. + * + * All four setters take RADIANS, so parseAngleRadians - which scales an + * r-suffixed value once rather than by RTD and then by DTR again. + */ + if (projection instanceof ObliqueMercatorProjection) { + ObliqueMercatorProjection omerc = (ObliqueMercatorProjection) projection; + s = params.get(Proj4Keyword.lon_1); + if (s != null) + omerc.setLon1(parseAngleRadians(Proj4Keyword.lon_1, s)); + + s = params.get(Proj4Keyword.lon_2); + if (s != null) + omerc.setLon2(parseAngleRadians(Proj4Keyword.lon_2, s)); + + /* + * +no_rot is tested with the same "t" (presence) sigil as +no_off/+no_uoff + * (omerc.cpp:145, pj_param(..., "tno_rot").i), so it is valueless: present + * means "do not rotate the (u,v) frame". + * + * Deliberately dispatched here on the concrete class rather than beside + * setNoUoff above, because setNoRot is ObliqueMercatorProjection's own and + * Projection carries no such flag. It could not be dispatched at all until + * the setter existed: `rot` was a private field assigned unconditionally in + * initialize(), which runs TWICE - once from the constructor and once from + * the parser - so anything a setter was told was discarded on the second + * pass. The field is now a field initialiser and initialize() no longer + * writes it. + */ + if (params.containsKey(Proj4Keyword.no_rot)) + omerc.setNoRot(true); + } + if (projection instanceof ObliqueCylindricalEqualAreaProjection) { + ObliqueCylindricalEqualAreaProjection ocea = + (ObliqueCylindricalEqualAreaProjection) projection; + s = params.get(Proj4Keyword.lon_1); + if (s != null) + ocea.setLon1(parseAngleRadians(Proj4Keyword.lon_1, s)); + + s = params.get(Proj4Keyword.lon_2); + if (s != null) + ocea.setLon2(parseAngleRadians(Proj4Keyword.lon_2, s)); + } + if (projection instanceof TwoPointEquidistantProjection) { + TwoPointEquidistantProjection tpeqd = (TwoPointEquidistantProjection) projection; + s = params.get(Proj4Keyword.lon_1); + if (s != null) + tpeqd.setLon1(parseAngleRadians(Proj4Keyword.lon_1, s)); + + s = params.get(Proj4Keyword.lon_2); + if (s != null) + tpeqd.setLon2(parseAngleRadians(Proj4Keyword.lon_2, s)); + } + /* + * imw_p reads +lon_1 and NOT +lon_2 (imw_p.cpp:191-192). Absence is not zero + * there: the class holds NaN for "absent" and derives lam_1 from the latitude + * instead, so this must stay a `!= null` guard and must never be given a 0 + * default. + */ + if (projection instanceof InternationalMapOfTheWorldPolyconicProjection) { + s = params.get(Proj4Keyword.lon_1); + if (s != null) + ((InternationalMapOfTheWorldPolyconicProjection) projection) + .setLon1(parseAngleRadians(Proj4Keyword.lon_1, s)); + } + + /* + * +n reaches urmfps (urmfps.cpp:56-66), urm5 (urm5.cpp:36-47) and gn_sinu + * (gn_sinu.cpp:180-198), and +m reaches gn_sinu alone. Dispatched on the + * concrete class rather than through Projection because "n" and "m" are the two + * most heavily overloaded letters in PROJ: each is a shape parameter of a dozen + * unrelated operators and a unitless scale in the CRS parser (io.cpp:12520). + * + * Absence is a hard error upstream ("Missing parameter n." / "m."). That check + * belongs in each projection's own initialize(), which already range-checks; + * the parser's job is only to get the value there. + * + * All three keys are read with pj_param's 'd' sigil, so parseDouble and not + * parseAngle. gn_sinu's dispatch is on GeneralSinusoidalProjection and NOT on + * its package-private base: sinu/eck6/mbtfps share that base's kernel but + * hard-code their own m and n and read neither key upstream, so + * McBrydeThomasFlatPolarSinusoidalProjection must not receive them. + */ + if (projection instanceof UrmaevFlatPolarSinusoidalProjection) { + s = params.get(Proj4Keyword.n); + if (s != null) + ((UrmaevFlatPolarSinusoidalProjection) projection) + .setN(parseDouble(Proj4Keyword.n, s)); + } + if (projection instanceof Urmaev5Projection) { + Urmaev5Projection urm5 = (Urmaev5Projection) projection; + s = params.get(Proj4Keyword.n); + if (s != null) + urm5.setN(parseDouble(Proj4Keyword.n, s)); + + s = params.get(Proj4Keyword.q); + if (s != null) + urm5.setQ(parseDouble(Proj4Keyword.q, s)); + } + if (projection instanceof GeneralSinusoidalProjection) { + GeneralSinusoidalProjection gnSinu = (GeneralSinusoidalProjection) projection; + s = params.get(Proj4Keyword.n); + if (s != null) + gnSinu.setN(parseDouble(Proj4Keyword.n, s)); + + s = params.get(Proj4Keyword.m); + if (s != null) + gnSinu.setM(parseDouble(Proj4Keyword.m, s)); + } + /* + * fouc_s is the fourth reader of +n and was missing. Upstream reads it as "dn" + * (fouc_s.cpp:61) and fouc_s IS registered (Registry), so without this branch + * `+proj=fouc_s +n=0.5` parsed cleanly, was accepted by the STRICT allow-list, + * and then silently used n = 0. Nothing was visibly wrong only because + * builtins.gie:2050 is a bare `+proj=fouc_s +a=6400000` with no +n - i.e. the + * corpus does not exercise the defect, which is exactly why it survived. + * + * This is the reason "n" was previously unsound in the conformance bridge's + * HONOURED set: the bridge vouched that proj4j applies +n, and for fouc_s it did + * not. The setter landed with the numerical work; this is its dispatch. + */ + if (projection instanceof FoucautSinusoidalProjection) { + s = params.get(Proj4Keyword.n); if (s != null) - ((ExtendedTransverseMercatorProjection) projection).setUTMZone(Integer - .parseInt(s)); + ((FoucautSinusoidalProjection) projection) + .setN(parseDouble(Proj4Keyword.n, s)); + } + + /* + * som and misrsom share one file and one setup upstream (som.cpp), and + * MisrSpaceObliqueMercatorProjection extends SpaceObliqueMercatorProjection + * here, so the order of these two branches is load-bearing: misrsom derives + * lam0/alf/p22 from +path and does NOT read +inc_angle/+ps_rev/+asc_lon + * (som.cpp:287-306 never calls pj_param for them), so it must be tested first + * and must not fall through. + * + * +inc_angle and +asc_lon are 'r' sigil - hence parseAngle, which takes DMS, a + * trailing cardinal and the r/R radian suffix that two of the four corpus som + * blocks actually use. +ps_rev is a plain 'd'. +path is an 'i', whose grammar is + * digits and nothing else; see parseIntStrict. + */ + if (projection instanceof MisrSpaceObliqueMercatorProjection) { + s = params.get(Proj4Keyword.path); + if (s != null) + ((MisrSpaceObliqueMercatorProjection) projection) + .setPath(parseIntStrict(Proj4Keyword.path, s)); + } else if (projection instanceof SpaceObliqueMercatorProjection) { + SpaceObliqueMercatorProjection som = (SpaceObliqueMercatorProjection) projection; + s = params.get(Proj4Keyword.inc_angle); + if (s != null) + som.setIncidenceAngle(parseAngleRadians(Proj4Keyword.inc_angle, s)); + + s = params.get(Proj4Keyword.ps_rev); + if (s != null) + som.setPeriodOfRevolution(parseDouble(Proj4Keyword.ps_rev, s)); + + s = params.get(Proj4Keyword.asc_lon); + if (s != null) + som.setAscendingLongitude(parseAngleRadians(Proj4Keyword.asc_lon, s)); + } + + /* + * ob_tran is the one operator that needs the raw argument list rather than + * values out of the map, because ob_tran_target_params builds its child's argv + * from the ob_tran argv: it drops "proj=ob_tran" and a bare "inv", then turns + * the FIRST "o_proj=xxx" token into "proj=xxx" by advancing the pointer two + * characters (ob_tran.cpp:159, args.argv[i] += 2) and stops. Everything else - + * including +o_lat_p, which the child ignores, and +lon_0, which the child + * parses and then never uses because it is invoked at its raw layer - passes + * through verbatim. Hence one call rather than ten. + * + * setParameters also chooses among the three pole specifications by presence + * (+o_alpha, else +o_lat_p, else the two-point form), which is why it takes the + * list too: pj_param's 't' sigil tests presence and never value, so +o_alpha=0 + * selects the azimuth form and a bare +o_lat_p selects the pole form. + * + * Must run before initialize(), which requires a child and demotes the output + * affine to the identity when that child is geographic. + */ + if (projection instanceof ObliqueTransformationProjection) { + if (args == null) { + throw new InvalidValueException(ErrorCause.MISSING_PARAM, + "+proj=ob_tran needs its whole parameter list, not a parsed map, " + + "because ob_tran_target_params derives the child's argument " + + "list from it; this parse was given no argument array"); + } + ((ObliqueTransformationProjection) projection).setParameters(args); } projection.initialize(); @@ -185,14 +780,45 @@ private Projection parseProjection(Map params, Ellipsoid ellipsoid) { return projection; } - private void parseDatum(Map params, DatumParameters datumParam) { - String towgs84 = (String) params.get(Proj4Keyword.towgs84); + /** + * Resolves a {@code +units} name, returning null when this library cannot + * resolve it and the parse mode says that should be an error. + *

+ * {@link Units#findUnits(String)} falls back to metres for any unknown + * name and never returns null, so the unknown case has to be detected by + * checking whether metres was actually asked for. + */ + private Unit findUnits(String name) { + Unit unit = Units.findUnits(name); + if (mode != ParseMode.STRICT) + return unit; + return Units.isKnownUnit(name) ? unit : null; + } + + /** + * PROJ accepts either one of its named prime meridians or an angle in any + * of its angular syntaxes (DMS, a cardinal suffix, an {@code r}/{@code R} + * radian suffix). PROJ4J's {@code PrimeMeridian.forName} only understands a + * plain decimal number, so an angular value is normalised to decimal + * degrees here and a name is passed through untouched. + */ + private static String normalizePrimeMeridian(String s) { + try { + return Double.toString(parseAngle(Proj4Keyword.pm, s)); + } catch (Proj4jException e) { + // not an angle - treat it as a meridian name + return s; + } + } + + private void parseDatum(Map params, DatumParameters datumParam) { + String towgs84 = params.get(Proj4Keyword.towgs84); if (towgs84 != null) { double[] datumConvParams = parseToWGS84(towgs84); datumParam.setDatumTransform(datumConvParams); } - String code = (String) params.get(Proj4Keyword.datum); + String code = params.get(Proj4Keyword.datum); if (code != null) { Datum datum = registry.getDatum(code); if (datum == null) @@ -200,7 +826,7 @@ private void parseDatum(Map params, DatumParameters datumParam) { datumParam.setDatum(datum); } - String nadgrids = (String) params.get(Proj4Keyword.nadgrids); + String nadgrids = params.get(Proj4Keyword.nadgrids); if (nadgrids != null) { try { datumParam.setGrids(Grid.fromNadGrids(nadgrids)); @@ -218,8 +844,7 @@ private double[] parseToWGS84(String paramList) { } double[] param = new double[numStr.length]; for (int i = 0; i < numStr.length; i++) { - // TODO: better error reporting - param[i] = Double.parseDouble(numStr[i]); + param[i] = parseDouble(Proj4Keyword.towgs84, numStr[i]); } if (param.length > 3) { // optimization to detect 3-parameter transform @@ -240,16 +865,38 @@ private double[] parseToWGS84(String paramList) { return param; } - private void parseEllipsoid(Map params, DatumParameters datumParam) { - double b = 0; - String s; - - /* - * // not supported by PROJ4 s = (String) params.get(Proj4Param.R); if (s != - * null) a = Double.parseDouble(s); - */ + /** + * Resolves the ellipsoid, following PROJ 9.8.1 {@code pj_ellipsoid} + * ({@code src/ell_set.cpp:80-133}) step for step: + *

    + *
  1. {@code +R} present: size only, {@code es = f = e = rf = 0}, + * {@code b = a}, done - every shape and spherification + * parameter is ignored. + *
  2. {@code ellps_ellps()}: {@code +ellps=xxx} seeds both size and shape. + *
  3. {@code ellps_size()}: {@code +a} overrides the size. + *
  4. {@code ellps_shape()}: the first present of + * {@code rf, f, es, e, b} overrides the shape - and only that one. + *
  5. {@code pj_calc_ellipsoid_params()}: validate. + *
  6. {@code ellps_spherification()}: the first present of + * {@code R_A, R_V, R_a, R_g, R_h, R_lat_a, R_lat_g, R_C} turns the + * ellipsoid into a sphere. + *
+ * A later shape parameter alongside {@code +ellps} is not a + * contradiction; {@code ell_set.cpp}'s own comment documents it as a + * deliberate modifier ({@code +ellps=GRS80 +a=1} being the motivating + * example), so it is accepted here too. + */ + private void parseEllipsoid(Map params, DatumParameters datumParam) { + /* + * Specifying R overrules everything (ell_set.cpp:92-100). + */ + String s = params.get(Proj4Keyword.R); + if (s != null) { + datumParam.setR(parseDouble(Proj4Keyword.R, s)); + return; + } - String code = (String) params.get(Proj4Keyword.ellps); + String code = params.get(Proj4Keyword.ellps); if (code != null) { Ellipsoid ellipsoid = registry.getEllipsoid(code); if (ellipsoid == null) @@ -257,111 +904,338 @@ private void parseEllipsoid(Map params, DatumParameters datumParam) { datumParam.setEllipsoid(ellipsoid); } - /* - * Explicit parameters override ellps and datum settings - */ - s = (String) params.get(Proj4Keyword.a); - if (s != null) { - double a = Double.parseDouble(s); - datumParam.setA(a); - } - - s = (String) params.get(Proj4Keyword.es); - if (s != null) { - double es = Double.parseDouble(s); - datumParam.setES(es); - } - - s = (String) params.get(Proj4Keyword.rf); + /* + * Explicit parameters override ellps and datum settings + */ + s = params.get(Proj4Keyword.a); if (s != null) { - double rf = Double.parseDouble(s); - datumParam.setRF(rf); + datumParam.setA(parseDouble(Proj4Keyword.a, s)); } - s = (String) params.get(Proj4Keyword.f); - if (s != null) { - double f = Double.parseDouble(s); - datumParam.setF(f); + /* + * ellps_shape(): exactly one shape parameter takes effect, selected by + * the fixed order rf, f, es, e, b - the first one present breaks the + * loop. PROJ4J used to apply all of them cumulatively, last one + * winning. + */ + boolean shapeGiven = false; + for (String key : Proj4Keyword.SHAPE_PARAMS) { + s = params.get(key); + if (s == null) + continue; + // +datum= makes PROJ append the datum's ellps, which supplies the + // semi-major axis; a bare shape parameter does not. + datumParam.seedSizeFromDatum(); + // ellps_size() runs first and errors out before ellps_shape() ever + // sees the value. + datumParam.requireSize(); + double value = parseDouble(key, s); + if (Proj4Keyword.rf.equals(key)) { + datumParam.setRF(value); + } else if (Proj4Keyword.f.equals(key)) { + datumParam.setF(value); + } else if (Proj4Keyword.es.equals(key)) { + datumParam.setES(value); + } else if (Proj4Keyword.e.equals(key)) { + datumParam.setE(value); + } else { + // +b needs the semi-major axis; PROJ errors with + // "Major axis not given" in ellps_size(), before it ever gets + // here. PROJ4J used to compute 1 - b*b/NaN*NaN = NaN and then + // silently fall through to Datum.WGS84. + datumParam.setB(value); + } + shapeGiven = true; + break; } - s = (String) params.get(Proj4Keyword.b); - if (s != null) { - b = Double.parseDouble(s); - datumParam.setB(b); + if (!shapeGiven && code == null && datumParam.isSizeGiven()) { + // "Not giving a shape parameter means selecting a sphere" + // (ellps_shape). +a on its own therefore describes a sphere, not + // WGS84. + datumParam.setSphericalShape(); } - if (b == 0) { - b = datumParam.getA() * Math.sqrt(1. - datumParam.getES()); - } + datumParam.validateEllipsoid(); parseEllipsoidModifiers(params, datumParam); - - /* - * // None of these appear to be supported by PROJ4 ?? - * - * s = (String) - * params.get(Proj4Param.R_A); if (s != null && Boolean.getBoolean(s)) { a *= - * 1. - es * (SIXTH + es * (RA4 + es * RA6)); } else { s = (String) - * params.get(Proj4Param.R_V); if (s != null && Boolean.getBoolean(s)) { a *= - * 1. - es * (SIXTH + es * (RV4 + es * RV6)); } else { s = (String) - * params.get(Proj4Param.R_a); if (s != null && Boolean.getBoolean(s)) { a = - * .5 * (a + b); } else { s = (String) params.get(Proj4Param.R_g); if (s != - * null && Boolean.getBoolean(s)) { a = Math.sqrt(a * b); } else { s = - * (String) params.get(Proj4Param.R_h); if (s != null && - * Boolean.getBoolean(s)) { a = 2. * a * b / (a + b); es = 0.; } else { s = - * (String) params.get(Proj4Param.R_lat_a); if (s != null) { double tmp = - * Math.sin(parseAngle(s)); if (Math.abs(tmp) > MapMath.HALFPI) throw new - * ProjectionException("-11"); tmp = 1. - es * tmp * tmp; a *= .5 * (1. - es + - * tmp) / (tmp * Math.sqrt(tmp)); es = 0.; } else { s = (String) - * params.get(Proj4Param.R_lat_g); if (s != null) { double tmp = - * Math.sin(parseAngle(s)); if (Math.abs(tmp) > MapMath.HALFPI) throw new - * ProjectionException("-11"); tmp = 1. - es * tmp * tmp; a *= Math.sqrt(1. - - * es) / tmp; es = 0.; } } } } } } } } - */ } /** - * Parse ellipsoid modifiers. - * - * @param params - * @param datumParam + * Applies the {@code ellps_spherification} step: the first present of + * {@code R_A, R_V, R_a, R_g, R_h, R_lat_a, R_lat_g, R_C} and no other. */ - private void parseEllipsoidModifiers(Map params, DatumParameters datumParam) { - /** - * Modifiers are mutually exclusive, so when one is detected method returns - */ - if (params.containsKey(Proj4Keyword.R_A)) { - datumParam.setR_A(); + private void parseEllipsoidModifiers(Map params, DatumParameters datumParam) { + String key = null; + String value = null; + for (String candidate : Proj4Keyword.SPHERIFICATION_PARAMS) { + if (params.containsKey(candidate)) { + key = candidate; + value = params.get(candidate); + break; + } + } + if (key == null) return; + + // Spherification keys are not in the list that suppresses PROJ's + // implicit "+ellps=GRS80" (init.cpp:317-360), so PROJ still has a full + // ellipsoid to spherify at this point. + datumParam.seedDefaultSize(); + + if (Proj4Keyword.R_A.equals(key)) { + datumParam.setR_A(); + } else if (Proj4Keyword.R_V.equals(key)) { + datumParam.setR_V(); + } else if (Proj4Keyword.R_a.equals(key)) { + datumParam.setR_a(); + } else if (Proj4Keyword.R_g.equals(key)) { + datumParam.setR_g(); + } else if (Proj4Keyword.R_h.equals(key)) { + datumParam.setR_h(); + } else if (Proj4Keyword.R_lat_a.equals(key)) { + datumParam.setR_lat_a(requiredAngleRadians(key, value)); + } else if (Proj4Keyword.R_lat_g.equals(key)) { + datumParam.setR_lat_g(requiredAngleRadians(key, value)); + } else { + /* + * +R_C is taken at phi0 -- and phi0 is ALWAYS ZERO here, whatever +lat_0 says. + * + * ell_set.cpp:438-452 reads P->phi0, and its comment says the radius is "taken at a + * latitude that is phi0 (note: at least for mercator...)". But pj_init calls + * pj_ellipsoid at init.cpp:566 and does not assign + * `PIN->phi0 = pj_param(ctx, start, "rlat_0").f` until init.cpp:651, 85 lines later, + * on a calloc'd PJ. So at spherification time P->phi0 is 0 and +R_C reduces to + * + * a *= sqrt(1 - es) / (1 - es * sin^2(0)) = a * sqrt(1 - es) = b + * + * i.e. the semi-MINOR axis. The comment describes an intent the code does not + * implement, and the corpus was generated by the code: + * builtins.gie:4350 is `+proj=merc +R_C +ellps=WGS84 +lat_0=45` at (2, 49) and + * expects 221892.515234695253, which is 6356752.314245179 * 2 deg -- WGS84's b, to + * every printed digit. Honouring +lat_0=45 gives 6378101.030201018 and + * 222637.726003700, off by 745 m. + * + * Reading +lat_0 here is therefore MORE correct and WRONG: this is the + * "port verbatim where upstream's expected values were generated by upstream's own + * behaviour" case, like adams.cpp's ell_int_5 Chebyshev series. Do not "fix" it + * without re-pinning that row against a PROJ release that has fixed it upstream. + * + * DatumParameters.setR_C(phi0) keeps its parameter: the formula is right, only the + * value pj_init supplies for it is 0. Callers outside the proj-string path may + * legitimately want the conformal radius at a real latitude. + */ + datumParam.setR_C(0.0); } + } + private static double requiredAngleRadians(String key, String value) { + if (value == null) + throw new InvalidValueException("Missing value for +" + key); + return parseAngle(key, value) * ProjectionMath.DTR; } - private Map createParameterMap(String[] args) { - Map params = new HashMap(); + /** + * Splits the argument list into a key/value map. + *

+ * Two PROJ semantics are load-bearing here. Insertion order is preserved, + * and the first occurrence of a duplicated key wins: + * {@code pj_param_exists} walks the parameter list front-to-back and + * returns the first match, and {@code +init=}/{@code +datum=} expansions + * are appended, so user tokens shadow them. A {@code HashMap} kept the + * last occurrence, exactly inverted. + */ + private Map createParameterMap(String[] args) { + Map params = new LinkedHashMap(); for (int i = 0; i < args.length; i++) { String arg = args[i]; + if (arg == null) + continue; // strip leading "+" if any if (arg.startsWith("+")) { arg = arg.substring(1); } + if (arg.length() == 0) + continue; int index = arg.indexOf('='); + String key; + String value; if (index != -1) { // param of form pppp=vvvv - String key = arg.substring(0, index); - String value = arg.substring(index + 1); - params.put(key, value); + key = arg.substring(0, index); + value = arg.substring(index + 1); } else { // param of form ppppp - //String key = arg.substring(1); - params.put(arg, null); + key = arg; + value = null; + } + if (!params.containsKey(key)) { + params.put(key, value); } } return params; } - private static double parseAngle(String s) { - return Angle.parse(s); + /** + * Parses an angular parameter value, in degrees. + *

+ * Accepts everything {@link Angle#parse(String)} does (decimal degrees, + * DMS, a trailing cardinal) plus PROJ's {@code r}/{@code R} radian suffix, + * which is legal on every angular parameter. + */ + private static double parseAngle(String key, String s) { + try { + int length = s.length(); + if (length > 1) { + char last = s.charAt(length - 1); + if (last == 'r' || last == 'R') { + return Double.parseDouble(s.substring(0, length - 1)) * ProjectionMath.RTD; + } + } + return Angle.parse(s); + } catch (NumberFormatException e) { + throw new InvalidValueException("Invalid value for +" + key + ": " + s, e); + } + } + + /** + * {@code pj_param}'s {@code r} sigil in full: the same grammar as + * {@link #parseAngle(String, String)} but returning radians, which is what + * {@code dmstor_ctx} returns and what every {@code r}-sigil consumer stores. + *

+ * Not a cosmetic difference. {@code parseAngle} answers in degrees, so an + * {@code r}-suffixed value reaching a radian-valued field through it is multiplied by + * {@code RTD} and then by {@code DTR} again - a round trip that costs about 1 ulp of the + * angle. On {@code builtins.gie}'s {@code +proj=som +inc_angle=1.7157253262878522r} block + * that showed up as a 0.02 mm easting shift against the same block written in decimal + * degrees, inside the corpus's 0.1 mm tolerance but visible and avoidable. Here the radian + * form is returned untouched and the degree form is scaled exactly once, by {@code DTR}, + * which is the same single multiplication {@code dmstor} performs. + */ + private static double parseAngleRadians(String key, String s) { + try { + int length = s.length(); + if (length > 1) { + char last = s.charAt(length - 1); + if (last == 'r' || last == 'R') { + return Double.parseDouble(s.substring(0, length - 1)); + } + } + return Angle.parse(s) * ProjectionMath.DTR; + } catch (NumberFormatException e) { + throw new InvalidValueException("Invalid value for +" + key + ": " + s, e); + } + } + + private static double parseDouble(String key, String s) { + if (s == null) + throw new InvalidValueException("Missing value for +" + key); + try { + return Double.parseDouble(s.trim()); + } catch (NumberFormatException e) { + throw new InvalidValueException("Invalid value for +" + key + ": " + s, e); + } + } + + /** + * Parses a {@code +to_meter}/{@code +vto_meter} value, which PROJ accepts either + * as a plain double or as a {@code num/den} ratio: {@code init.cpp:690-710} runs + * {@code pj_strtod}, and if parsing stopped on a {@code '/'} it divides by the + * denominator. Its own unit table uses that syntax ({@code dm} is {@code "1/10"}, + * {@code us-in} is {@code "1/39.37"}), so it is not an exotic corner. + * + * @throws InvalidValueException on a zero denominator ("Invalid value for + * to_meter donominator" upstream, {@code sic}) or a + * non-positive result + */ + private static double parseToMeter(String key, String s) { + if (s == null) + throw new InvalidValueException("Missing value for +" + key); + String v = s.trim(); + int slash = v.indexOf('/'); + double value; + if (slash >= 0) { + double numerator = parseDouble(key, v.substring(0, slash)); + double denominator = parseDouble(key, v.substring(slash + 1)); + if (denominator == 0.0) + throw new InvalidValueException("Invalid value for +" + key + " denominator: " + s); + value = numerator / denominator; + } else { + value = parseDouble(key, v); + } + if (!(value > 0.0) || Double.isInfinite(value)) + throw new InvalidValueException("Invalid value for +" + key + ": " + s + ". Should be > 0"); + return value; + } + + /** + * {@code pj_param}'s {@code b} sigil ({@code param.cpp}): an absent value or + * {@code T}/{@code t} is true, {@code F}/{@code f} is false, and anything else is an + * error rather than a silent default. + */ + private static boolean parseBoolean(String key, String s) { + if (s == null || s.length() == 0 || "T".equals(s) || "t".equals(s)) + return true; + if ("F".equals(s) || "f".equals(s)) + return false; + throw new InvalidValueException("Invalid value for +" + key + ": " + s + + ". Should be empty, T/t or F/f"); + } + + private static int parseInt(String key, String s) { + if (s == null) + throw new InvalidValueException("Missing value for +" + key); + try { + return Integer.parseInt(s.trim()); + } catch (NumberFormatException e) { + throw new InvalidValueException("Invalid value for +" + key + ": " + s, e); + } + } + + /** + * {@code pj_param}'s {@code i} sigil, exactly ({@code param.cpp:180-187}): + * + *

+     *   value.i = atoi(opt);
+     *   for (const char *ptr = opt; *ptr != '\0'; ++ptr)
+     *       if (!(*ptr >= '0' && *ptr <= '9')) {
+     *           proj_context_errno_set(ctx, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE);
+     *           value.i = 0;
+     *       }
+     * 
+ * + *

So the grammar is one or more decimal digits and nothing else. A sign, a + * decimal point, surrounding whitespace and any trailing text are all errors, not + * partial parses: {@code +path=12a} is an error and {@code +path=-5} is an error too. + * {@code Integer.parseInt} accepts both of the latter forms, which is why this is a + * separate method rather than a widening of {@link #parseInt}. + * + *

{@link #parseInt} keeps its looser grammar for {@code +zone}, whose only caller + * is {@code setUTMZone} and whose behaviour is not being changed here. + * + * @throws InvalidValueException with {@link ErrorCause#INVALID_PARAM_VALUE} for + * anything outside that grammar + */ + private static int parseIntStrict(String key, String s) { + if (s == null || s.length() == 0) + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "Missing value for +" + key + ". PROJ reads it with pj_param's 'i' sigil, " + + "whose grammar is one or more decimal digits"); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c < '0' || c > '9') + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "Invalid value for +" + key + ": " + s + ". PROJ reads it with " + + "pj_param's 'i' sigil, which rejects any character outside " + + "0-9 -- a sign, a decimal point or trailing text included"); + } + try { + return Integer.parseInt(s); + } catch (NumberFormatException e) { + // Only reachable for a digit string that overflows an int. + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "Invalid value for +" + key + ": " + s + " does not fit in an int"); + } } } diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/AffineOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/AffineOperator.java new file mode 100644 index 0000000..23eb0ea --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/AffineOperator.java @@ -0,0 +1,204 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=affine} — a 3×3 matrix, a translation and an independent time + * scale, ported from {@code 9.8.1:src/transformations/affine.cpp}. + * + *

+ * x' = xoff + s11·x + s12·y + s13·z
+ * y' = yoff + s21·x + s22·y + s23·z
+ * z' = zoff + s31·x + s32·y + s33·z
+ * t' = toff + tscale·t
+ * 
+ * + *

Four things worth stating, all of them upstream's

+ * + *
    + *
  1. The diagonal defaults to 1 but is read with {@code 't'} first. + * {@code if (pj_param(..., "ts11").i) Q->forward.s11 = pj_param(..., "ds11").f;} — + * so an explicit {@code +s11=0} really is zero, while an absent + * {@code +s11} is one. The off-diagonal terms have no such guard and simply + * default to {@code pj_param}'s 0. Same treatment for {@code s22}, {@code s33} and + * {@code tscale}. Reading the diagonal with a plain "default 1 if unparseable" + * would silently turn {@code +s11=0} into the identity.
  2. + *
  3. The inverse subtracts the offset first and then applies the inverse matrix + * ({@code reverse_4d}), which is not the same as applying an inverse affine with a + * negated offset unless the matrix is the identity.
  4. + *
  5. A singular matrix is not an error: it removes the inverse. + * {@code computeReverseParameters} nulls {@code P->inv4d}/{@code inv3d}/{@code inv} + * when {@code det == 0} or {@code tscale == 0}, and the forward direction + * keeps working. That is reported here through {@link #hasInverse()}, which is what + * makes the enclosing pipeline one-way rather than making construction fail.
  6. + *
  7. Both sides are {@link GieIoUnits#WHATEVER}, so a bare + * {@code +step +proj=affine} is a legal no-op filler — which is exactly how + * {@code 4D-API_cs2cs-style.gie:328} uses it, as a "dummy step".
  8. + *
+ * + *

Upstream's cofactor expansion is reproduced term for term, including the sign + * pattern and the division of every cofactor by the same determinant, because the + * corpus's {@code affine} rows are 50 cm-tolerance datum-shift simulations and a + * rearranged inverse would agree to the last digit only by luck. + * + *

Immutable apart from the overridable unit sides; safe to share. + * + * @since 1.5 + */ +final class AffineOperator implements PipelineOperator { + + private final double xoff; + private final double yoff; + private final double zoff; + private final double toff; + + /** {@code Q->forward}: {@code s11 s12 s13 s21 s22 s23 s31 s32 s33}, row major. */ + private final double[] fwd; + private final double fwdTScale; + + /** {@code Q->reverse}, the inverted matrix; meaningless when {@link #invertible} is false. */ + private final double[] rev; + private final double revTScale; + + private final boolean invertible; + + private GieIoUnits left = GieIoUnits.WHATEVER; + private GieIoUnits right = GieIoUnits.WHATEVER; + + AffineOperator(final ProjParams params) { + this.xoff = params.doubleValue("xoff", 0.0); + this.yoff = params.doubleValue("yoff", 0.0); + this.zoff = params.doubleValue("zoff", 0.0); + this.toff = params.doubleValue("toff", 0.0); + + this.fwd = new double[] { + diagonal(params, "s11"), params.doubleValue("s12", 0.0), params.doubleValue("s13", 0.0), + params.doubleValue("s21", 0.0), diagonal(params, "s22"), params.doubleValue("s23", 0.0), + params.doubleValue("s31", 0.0), params.doubleValue("s32", 0.0), diagonal(params, "s33"), + }; + this.fwdTScale = diagonal(params, "tscale"); + + // computeReverseParameters (affine.cpp:135-180), verbatim including the sign + // pattern: the reverse matrix is the adjugate transposed, divided by det. + final double a = fwd[0]; + final double b = fwd[1]; + final double c = fwd[2]; + final double d = fwd[3]; + final double e = fwd[4]; + final double f = fwd[5]; + final double g = fwd[6]; + final double h = fwd[7]; + final double i = fwd[8]; + final double ca = e * i - f * h; + final double cb = -(d * i - f * g); + final double cc = d * h - e * g; + final double cd = -(b * i - c * h); + final double ce = a * i - c * g; + final double cf = -(a * h - b * g); + final double cg = b * f - c * e; + final double ch = -(a * f - c * d); + final double ci = a * e - b * d; + final double det = a * ca + b * cb + c * cc; + if (det == 0.0 || fwdTScale == 0.0) { + this.invertible = false; + this.rev = new double[] {1, 0, 0, 0, 1, 0, 0, 0, 1}; + this.revTScale = 1.0; + } else { + this.invertible = true; + this.rev = new double[] { + ca / det, cd / det, cg / det, + cb / det, ce / det, ch / det, + cc / det, cf / det, ci / det, + }; + this.revTScale = 1.0 / fwdTScale; + } + } + + /** + * A diagonal coefficient: 1 when the key is absent, its value otherwise — + * {@code if (pj_param(..., "ts11").i)}. + * + * @param params the step's parameters + * @param key {@code s11}, {@code s22}, {@code s33} or {@code tscale} + * @return the coefficient + */ + private static double diagonal(final ProjParams params, final String key) { + return params.has(key) ? params.doubleValue(key, 0.0) : 1.0; + } + + /** {@code forward_4d}. */ + @Override + public void forward(final double[] coord) { + final double x = coord[0]; + final double y = coord[1]; + final double z = coord[2]; + coord[0] = xoff + fwd[0] * x + fwd[1] * y + fwd[2] * z; + coord[1] = yoff + fwd[3] * x + fwd[4] * y + fwd[5] * z; + coord[2] = zoff + fwd[6] * x + fwd[7] * y + fwd[8] * z; + coord[3] = toff + fwdTScale * coord[3]; + } + + /** {@code reverse_4d}: de-offset, then the inverse matrix. */ + @Override + public void inverse(final double[] coord) { + if (!invertible) { + throw new PipelineDefinitionException(PipelineErrorCode.NO_INVERSE_OP, + "+proj=affine: the matrix is singular (or +tscale=0), so upstream removes " + + "the inverse rather than failing construction"); + } + final double x = coord[0] - xoff; + final double y = coord[1] - yoff; + final double z = coord[2] - zoff; + coord[0] = rev[0] * x + rev[1] * y + rev[2] * z; + coord[1] = rev[3] * x + rev[4] * y + rev[5] * z; + coord[2] = rev[6] * x + rev[7] * y + rev[8] * z; + coord[3] = revTScale * (coord[3] - toff); + } + + @Override + public GieIoUnits declaredLeft() { + return left; + } + + @Override + public GieIoUnits declaredRight() { + return right; + } + + @Override + public void overrideUnits(final GieIoUnits newLeft, final GieIoUnits newRight) { + this.left = newLeft; + this.right = newRight; + } + + @Override + public boolean hasInverse() { + return invertible; + } + + @Override + public String description() { + return "affine xoff=" + xoff + " yoff=" + yoff + " zoff=" + zoff + + (invertible ? "" : " (singular: no inverse)"); + } + + @Override + public String toString() { + return "AffineOperator[" + description() + ", left=" + left + ", right=" + right + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/AxisSwapOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/AxisSwapOperator.java new file mode 100644 index 0000000..cf597c7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/AxisSwapOperator.java @@ -0,0 +1,265 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=axisswap} ({@code 9.8.1:src/conversions/axisswap.cpp}). + * + *

Takes exactly one of {@code +order} or {@code +axis}. Both, or + * neither, is {@code PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS} — upstream + * writes that test as {@code !exists(order) == !exists(axis)}, which is worth + * reading twice. + * + *

    + *
  • {@code +order=2,1} is a permutation of 1-based ordinate indices; a leading + * {@code '-'} flips that ordinate's sign.
  • + *
  • {@code +axis=wsu} is the classic PROJ.4 three-letter form over + * {@code ewnsud}, mapping each output slot to an input ordinate and a sign.
  • + *
+ * + *

The forward and inverse differ in which side the permutation indexes: + * forward is {@code out[i] = in[axis[i]] * sign[i]}, inverse is + * {@code out[axis[i]] = in[i] * sign[i]}. They coincide for a self-inverse + * permutation such as a plain {@code x/y} swap, which is why getting it backwards + * survives the obvious test. + * + *

Duplicate axes are rejected. Upstream fills the unspecified slots with the + * sentinels 4..7 first so that the duplicate scan can run over all four positions + * without special-casing a 2- or 3-ordinate order; the same trick is used here. + * + *

Both unit sides are {@link GieIoUnits#WHATEVER} unless {@code +angularunits} + * is given, in which case both become {@code RADIANS}. Preparation and + * finalisation are skipped entirely — the whole point of the operator is to run + * outside the offset/scale machinery. + */ +final class AxisSwapOperator implements PipelineOperator { + + /** Sentinel base for unspecified slots, so duplicates can be found in one scan. */ + private static final int UNUSED_BASE = 4; + + private final int[] axis = new int[4]; + private final int[] sign = new int[4]; + private final int n; + private final String description; + + private GieIoUnits left; + private GieIoUnits right; + + AxisSwapOperator(final ProjParams params) { + final boolean hasOrder = params.has("order"); + final boolean hasAxis = params.has("axis"); + if (hasOrder == hasAxis) { + throw new PipelineDefinitionException(PipelineErrorCode.MUTUALLY_EXCLUSIVE_ARGS, + "axisswap: must provide EITHER 'order' OR 'axis' parameter"); + } + + for (int i = 0; i < 4; i++) { + axis[i] = i + UNUSED_BASE; + sign[i] = 1; + } + + if (hasOrder) { + n = readOrder(params.value("order")); + description = "axisswap order=" + params.value("order"); + } else { + n = readAxis(params.value("axis")); + description = "axisswap axis=" + params.value("axis"); + } + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + if (i != j && axis[i] == axis[j]) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: duplicate axes specified"); + } + } + } + + if (!isRepresentable()) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: bad axis order"); + } + + final boolean angular = params.booleanValue("angularunits"); + this.left = angular ? GieIoUnits.RADIANS : GieIoUnits.WHATEVER; + this.right = angular ? GieIoUnits.RADIANS : GieIoUnits.WHATEVER; + } + + /** + * {@code axisswap.cpp:186-208}. Note {@code abs(atoi(s)) - 1} and + * {@code sign(atoi(s))}, so {@code -0} is index -1 and rejected by the + * unsigned {@code > 3} test upstream; here the equivalent range test is + * explicit. + */ + private int readOrder(final String order) { + if (order == null || order.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: empty +order"); + } + for (int i = 0; i < order.length(); i++) { + if ("1234-,".indexOf(order.charAt(i)) < 0) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: unknown axis '" + order.charAt(i) + "'"); + } + } + int count = 0; + int i = 0; + while (i < order.length() && count < 4) { + final int start = i; + while (i < order.length() && order.charAt(i) != ',') { + i++; + } + final String field = order.substring(start, i); + final int value = atoi(field); + final int index = Math.abs(value) - 1; + if (index < 0 || index > 3) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: invalid axis '" + index + "'"); + } + axis[count] = index; + sign[count] = value > 0 ? 1 : value < 0 ? -1 : 0; + count++; + if (i < order.length() && order.charAt(i) == ',') { + i++; + } + } + return count; + } + + /** C's {@code atoi}: leading sign, then digits, stopping at the first non-digit. */ + private static int atoi(final String s) { + int i = 0; + boolean negative = false; + if (i < s.length() && (s.charAt(i) == '-' || s.charAt(i) == '+')) { + negative = s.charAt(i) == '-'; + i++; + } + int value = 0; + while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') { + value = value * 10 + (s.charAt(i) - '0'); + i++; + } + return negative ? -value : value; + } + + /** {@code axisswap.cpp:211-247}: the classic three-letter {@code ewnsud} form. */ + private int readAxis(final String spec) { + if (spec == null || spec.length() < 3) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: +axis must be three characters from \"ewnsud\", got " + spec); + } + for (int i = 0; i < 3; i++) { + switch (spec.charAt(i)) { + case 'w': + sign[i] = -1; + axis[i] = 0; + break; + case 'e': + sign[i] = 1; + axis[i] = 0; + break; + case 's': + sign[i] = -1; + axis[i] = 1; + break; + case 'n': + sign[i] = 1; + axis[i] = 1; + break; + case 'd': + sign[i] = -1; + axis[i] = 2; + break; + case 'u': + sign[i] = 1; + axis[i] = 2; + break; + default: + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "axisswap: unknown axis '" + spec.charAt(i) + "'"); + } + } + return 3; + } + + /** + * {@code axisswap.cpp:259-277}: upstream only wires up the fwd/inv function + * pointers for orders it can actually execute, and errors out when none + * matched. A 2-ordinate order touching {@code z} or {@code t} is the case that + * fails. + */ + private boolean isRepresentable() { + if (n == 4) { + return true; + } + if (n == 3) { + return axis[0] < 3 && axis[1] < 3 && axis[2] < 3; + } + if (n == 2) { + return axis[0] < 2 && axis[1] < 2; + } + return false; + } + + @Override + public GieIoUnits declaredLeft() { + return left; + } + + @Override + public GieIoUnits declaredRight() { + return right; + } + + @Override + public void overrideUnits(final GieIoUnits newLeft, final GieIoUnits newRight) { + this.left = newLeft; + this.right = newRight; + } + + @Override + public void forward(final double[] coord) { + final double[] in = {coord[0], coord[1], coord[2], coord[3]}; + for (int i = 0; i < n; i++) { + coord[i] = in[axis[i]] * sign[i]; + } + } + + @Override + public void inverse(final double[] coord) { + final double[] in = {coord[0], coord[1], coord[2], coord[3]}; + for (int i = 0; i < n; i++) { + coord[axis[i]] = in[i] * sign[i]; + } + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return description; + } + + @Override + public String toString() { + return "AxisSwapOperator[" + description + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/CartConversion.java b/core/src/main/java/org/locationtech/proj4j/pipeline/CartConversion.java new file mode 100644 index 0000000..4cc95c9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/CartConversion.java @@ -0,0 +1,191 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +/** + * PROJ's {@code +proj=cart} ({@code 9.8.1:src/conversions/cart.cpp}): geodetic + * {@code (lam, phi, z)} in radians and metres to geocentric cartesian + * {@code (X, Y, Z)} in metres, and back. + * + *

Why a fresh implementation rather than {@code datum.GeocentricConverter}

+ * + *

{@code GeocentricConverter} is the 1996 Toms iterative algorithm ported from + * PROJ.4, converging on {@code sin(phi)} to {@code 1e-12} — about 6 µm of latitude. + * PROJ 9.8.1 uses Bowring's closed form instead. Six micrometres is comfortably + * inside the GIGS point tolerances, but the pipeline uses this conversion up to + * four times per coordinate (WGS84 forward, local inverse, and the mirror + * pair on the way back) inside a {@code roundtrip 1000} block whose budget is + * 6 µm total. An iteration limit is also a fail-open site: it returns its + * last estimate rather than reporting non-convergence. Bowring is closed-form, so + * neither concern arises, and matching upstream removes a whole class of + * "which algorithm produced this residual" question. + * + *

Two details are transcribed rather than simplified, because they are what + * make the conversion well conditioned: + *

    + *
  • the normalisation by {@code 1/a} before forming the auxiliary angle, so that + * {@code norm} and {@code norm_phi} are computed on quantities of order 1;
  • + *
  • the {@code cosphi < 1e-6} branch, which takes the height from the + * geocentric radius rather than dividing by a vanishing cosine.
  • + *
+ * + *

{@code e2s} is derived as {@code tan(asin(e))^2} rather than the algebraically + * equal {@code es / (1 - es)} because that is what + * {@code pj_calc_ellipsoid_params} ({@code ell_set.cpp:586-588}) does, and the two + * differ in the last bit. + * + *

Immutable and thread-safe. + */ +final class CartConversion { + + private static final double HALF_PI = Math.PI / 2.0; + + private final double a; + private final double es; + private final double ra; + private final double f; + private final double bDivA; + private final double e2s; + + /** + * @param a semi-major axis in metres + * @param es first eccentricity squared + */ + CartConversion(final double a, final double es) { + this.a = a; + this.es = es; + this.ra = 1.0 / a; + final double e = Math.sqrt(es); + final double alpha = Math.asin(e); + final double e2 = Math.tan(alpha); + this.e2s = e2 * e2; + this.f = 1.0 - Math.cos(alpha); + this.bDivA = 1.0 - f; + } + + /** @return the semi-major axis this conversion was built with. */ + double a() { + return a; + } + + /** @return the first eccentricity squared this conversion was built with. */ + double es() { + return es; + } + + /** {@code normal_radius_of_curvature} ({@code cart.cpp:105-111}). */ + private double normalRadiusOfCurvature(final double sinphi) { + if (es == 0) { + return a; + } + return a / Math.sqrt(1 - es * sinphi * sinphi); + } + + /** {@code geocentric_radius} ({@code cart.cpp:114-136}), the {@code hypot}-free optimised form. */ + private double geocentricRadius(final double cosphi, final double sinphi) { + final double cosphi2 = cosphi * cosphi; + final double sinphi2 = sinphi * sinphi; + final double bda2 = bDivA * bDivA; + final double bda2SinPhi2 = bda2 * sinphi2; + return a * Math.sqrt((cosphi2 + bda2 * bda2SinPhi2) / (cosphi2 + bda2SinPhi2)); + } + + /** + * {@code cartesian()} ({@code cart.cpp:139-153}). Geodetic to geocentric. + * + * @param coord {@code {lam, phi, z, t}} in place; becomes {@code {X, Y, Z, t}} + */ + void forward(final double[] coord) { + final double lam = coord[0]; + final double phi = coord[1]; + final double z = coord[2]; + final double cosphi = Math.cos(phi); + final double sinphi = Math.sin(phi); + final double n = normalRadiusOfCurvature(sinphi); + coord[0] = (n + z) * cosphi * Math.cos(lam); + coord[1] = (n + z) * cosphi * Math.sin(lam); + coord[2] = (n * (1 - es) + z) * sinphi; + } + + /** + * {@code geodetic()} ({@code cart.cpp:156-230}). Geocentric to geodetic. + * + * @param coord {@code {X, Y, Z, t}} in place; becomes {@code {lam, phi, z, t}} + */ + void inverse(final double[] coord) { + final double x = coord[0]; + final double y = coord[1]; + final double z = coord[2]; + + final double xDivA = x * ra; + final double yDivA = y * ra; + final double zDivA = z * ra; + final double pDivA = Math.sqrt(xDivA * xDivA + yDivA * yDivA); + + final double pDivABDivA = pDivA * bDivA; + final double norm = Math.sqrt(zDivA * zDivA + pDivABDivA * pDivABDivA); + double c; + double s; + if (norm != 0) { + final double invNorm = 1.0 / norm; + c = pDivABDivA * invNorm; + s = zDivA * invNorm; + } else { + c = 1; + s = 0; + } + + final double yPhi = zDivA + e2s * bDivA * s * s * s; + final double xPhi = pDivA - es * c * c * c; + final double normPhi = Math.sqrt(yPhi * yPhi + xPhi * xPhi); + double cosphi; + double sinphi; + if (normPhi != 0) { + final double invNormPhi = 1.0 / normPhi; + cosphi = xPhi * invNormPhi; + sinphi = yPhi * invNormPhi; + } else { + cosphi = 1; + sinphi = 0; + } + + final double phi; + if (xPhi <= 0) { + // Very close to the geocentre there is no single solution; PROJ clamps + // to a pole rather than leaving a discontinuity. + phi = z >= 0 ? HALF_PI : -HALF_PI; + cosphi = 0; + sinphi = z >= 0 ? 1 : -1; + } else { + phi = Math.atan(yPhi / xPhi); + } + + final double lam = Math.atan2(yDivA, xDivA); + + final double height; + if (cosphi < 1e-6) { + // Poleward of 89.99994 degrees: take the height from the geocentric + // radius instead of dividing by a vanishing cosine. + height = Math.abs(z) - geocentricRadius(cosphi, sinphi); + } else { + height = a * pDivA / cosphi - normalRadiusOfCurvature(sinphi); + } + + coord[0] = lam; + coord[1] = phi; + coord[2] = height; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/CartOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/CartOperator.java new file mode 100644 index 0000000..f13f5df --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/CartOperator.java @@ -0,0 +1,190 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=cart} as a user-facing pipeline step + * ({@code 9.8.1:src/conversions/cart.cpp}): geodetic {@code (lam, phi, h)} in + * radians and metres to geocentric cartesian {@code (X, Y, Z)} in metres. + * + *

Why this exists when {@link CartConversion} already did

+ * + *

{@code CartConversion} is the hidden helper {@link Cs2csOperator} + * builds for {@code +towgs84} and for a geocentric operation. It is not a + * {@link PipelineOperator} and it carries no unit sides, because in that role it + * runs inside another step rather than beside it. A written-out + * {@code +step +proj=cart +ellps=GRS80} is a different thing: it is a step, it + * declares {@code RADIANS} on the left and {@code CARTESIAN} on the right + * ({@code cart.cpp:262-263}), and those two values are what make + * {@code +step +proj=cart} … {@code +step +proj=deformation} … + * {@code +step +proj=cart +inv} pass the pipeline's unit-continuity check. + * + *

Distinct from {@code +proj=geocent}, which {@link Cs2csOperator} handles. + * {@code geocent}'s own formula is the identity + * ({@code geocent.cpp}: {@code xy.x = lp.lam; xy.y = lp.phi}) and the cartesian + * conversion is performed for it by {@code fwd_prepare}'s cs2cs emulation. Treating + * the two as synonyms would apply the conversion twice for one of them. + * + *

{@code +proj=cart}'s own setup function reads no parameters beyond the + * ellipsoid. It is nevertheless affected by one: the generic linear-unit scale. + * + *

{@code +units} / {@code +to_meter} apply, and {@code +x_0} does not

+ * + *

{@code fwd_finalize}'s {@code PJ_IO_UNITS_CARTESIAN} case + * ({@code 9.8.1:src/fwd.cpp:128-137}) multiplies all three ordinates by + * {@code P->fr_meter}, and {@code inv_prepare} ({@code inv.cpp:66-73}) multiplies them + * by {@code P->to_meter} — but unlike the {@code PROJECTED} case it applies no + * false easting, northing or {@code +z_0}, and no separate vertical unit. So + * {@code +proj=cart +a=1000 +b=1000 +to_meter=1000} takes {@code (90, 0, 0)} to + * {@code (0, 1, 0)}, not to {@code (0, 1000, 0)}: + * {@code 4D-API_cs2cs-style.gie:493} asserts exactly that, immediately after the same + * assertion for {@code +proj=geocent}, so the pair exists to check that both spellings + * scale. + * + *

Silently dropping the scale would be a factor-of-{@code to_meter} error reported as + * success, which is why it is here rather than left to a later affine pass. + * + *

Immutable and thread-safe apart from mutating the array passed in. + * + * @since 1.5 + */ +final class CartOperator implements PipelineOperator { + + private final CartConversion conversion; + private final double toMeter; + private final double frMeter; + private final String description; + + /** + * @param registry resolves {@code +ellps=} + * @param params the step's fully expanded parameter list + */ + CartOperator(final Registry registry, final ProjParams params) { + final double[] ellipsoid = StepEllipsoid.resolve(registry, params); + this.conversion = new CartConversion(ellipsoid[0], ellipsoid[1]); + this.toMeter = linearToMeter(params); + this.frMeter = 1.0 / toMeter; + this.description = "cart a=" + ellipsoid[0] + " es=" + ellipsoid[1] + + (toMeter == 1.0 ? "" : " to_meter=" + toMeter); + } + + /** + * {@code init.cpp:668-700}: {@code +units} is looked up in the linear table and + * wins over {@code +to_meter} when both are given; {@code +to_meter} accepts a + * {@code num/den} ratio; either being zero or non-positive is an error. + * + * @param params the step's parameter list + * @return {@code P->to_meter} + */ + private static double linearToMeter(final ProjParams params) { + final String units = params.value("units"); + if (units != null && !units.isEmpty()) { + final PipelineUnits.Resolution u = PipelineUnits.resolve(units); + if (!u.isKnown() || u.linear() != 1) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "unknown +units=" + units); + } + return u.factor(); + } + final String raw = params.value("to_meter"); + if (raw == null || raw.isEmpty()) { + return 1.0; + } + final double value = ratio(raw); + if (!(value > 0) || Double.isInfinite(value)) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+to_meter=" + raw + " must be a positive finite number"); + } + return value; + } + + /** {@code pj_units_ratio}: a plain double, or {@code num/den}. */ + private static double ratio(final String raw) { + final int slash = raw.indexOf('/'); + try { + if (slash < 0) { + return Double.parseDouble(raw.trim()); + } + final double den = Double.parseDouble(raw.substring(slash + 1).trim()); + if (den == 0.0) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+to_meter=" + raw + " has a zero denominator"); + } + return Double.parseDouble(raw.substring(0, slash).trim()) / den; + } catch (final NumberFormatException e) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+to_meter=" + raw + " is not a number or a num/den ratio", e); + } + } + + /** {@code P->left = PJ_IO_UNITS_RADIANS} ({@code cart.cpp:262}). */ + @Override + public GieIoUnits declaredLeft() { + return GieIoUnits.RADIANS; + } + + /** {@code P->right = PJ_IO_UNITS_CARTESIAN} ({@code cart.cpp:263}). */ + @Override + public GieIoUnits declaredRight() { + return GieIoUnits.CARTESIAN; + } + + /** Never called: neither declared side is {@link GieIoUnits#WHATEVER}. */ + @Override + public void overrideUnits(final GieIoUnits left, final GieIoUnits right) { + // no-op, deliberately + } + + /** {@code cart.cpp}'s {@code cartesian()}, then {@code fwd_finalize}'s {@code fr_meter}. */ + @Override + public void forward(final double[] coord) { + conversion.forward(coord); + if (frMeter != 1.0) { + coord[0] *= frMeter; + coord[1] *= frMeter; + coord[2] *= frMeter; + } + } + + /** {@code inv_prepare}'s {@code to_meter}, then {@code cart.cpp}'s {@code geodetic()}. */ + @Override + public void inverse(final double[] coord) { + if (toMeter != 1.0) { + coord[0] *= toMeter; + coord[1] *= toMeter; + coord[2] *= toMeter; + } + conversion.inverse(coord); + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return description; + } + + @Override + public String toString() { + return "CartOperator[" + description + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/CoordinateStack.java b/core/src/main/java/org/locationtech/proj4j/pipeline/CoordinateStack.java new file mode 100644 index 0000000..e81965e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/CoordinateStack.java @@ -0,0 +1,108 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +/** + * {@code Pipeline::stack} — the four independent per-component stacks + * {@code +proj=push} and {@code +proj=pop} share + * ({@code 9.8.1:src/pipeline.cpp:139}, {@code std::stack stack[4]}). + * + *

Why the stack lives on the pipeline and not on the operator

+ * + *

Upstream's {@code push} reaches it through {@code P->parent->opaque}, so the + * stack belongs to the enclosing pipeline and every {@code push}/{@code pop} step in + * it shares one. That sharing is the operator's whole purpose: the value a + * {@code push} saves is popped by a step further down the same pipeline, and + * {@code 4D-API_cs2cs-style.gie:341-353} nests two pushes and two pops to prove the + * ordering is last-in-first-out rather than positional. + * + *

The corollary is upstream's other half, and it is the one that looks like a bug + * until you read it: a {@code push} or {@code pop} with no parent pipeline is a + * no-op ({@code pipeline.cpp:641-643}, {@code if (P->parent == nullptr) return}). + * A bare {@code operation +proj=push +v_3} is therefore the identity, which + * {@code 4D-API_cs2cs-style.gie:388-396} asserts explicitly. That is modelled here by + * a {@code null} stack rather than by an empty one, so the two cases cannot be + * confused: {@code PipelineFactory} hands a stack to the steps of a real + * {@code +proj=pipeline} and {@code null} to a one-step wrapper. + * + *

Popping an empty stack

+ * + *

Leaves the component untouched — {@code if (pushpop->v1 && !stack[0].empty())}. + * The corpus tests this too ({@code :356-364}: a {@code pop} with no matching + * {@code push} must let the round trip through two UTM zones stand, giving 18° + * rather than 12°). It is not an error, so it must not throw. + * + *

Not thread-safe, and deliberately so: {@link Pipeline} already documents + * that its steps wrap mutable state and that one instance belongs to one thread. + * Upstream has exactly the same property for exactly the same reason. + * + * @since 1.5 + */ +final class CoordinateStack { + + /** One growable stack per coordinate component. */ + private final double[][] values = new double[4][]; + + /** How much of each {@link #values} row is in use. */ + private final int[] depth = new int[4]; + + CoordinateStack() { + for (int i = 0; i < 4; i++) { + values[i] = new double[8]; + } + } + + /** + * Push one component's value. + * + * @param component 0..3, i.e. {@code v_1}..{@code v_4} + * @param value the value to remember + */ + void push(final int component, final double value) { + double[] row = values[component]; + if (depth[component] == row.length) { + final double[] bigger = new double[row.length * 2]; + System.arraycopy(row, 0, bigger, 0, row.length); + values[component] = bigger; + row = bigger; + } + row[depth[component]++] = value; + } + + /** + * @param component 0..3 + * @return whether {@link #pop} would return anything + */ + boolean isEmpty(final int component) { + return depth[component] == 0; + } + + /** + * Pop one component's value. Only call when {@link #isEmpty} is {@code false}. + * + * @param component 0..3 + * @return the most recently pushed value + */ + double pop(final int component) { + return values[component][--depth[component]]; + } + + @Override + public String toString() { + return "CoordinateStack[depths=" + depth[0] + "," + depth[1] + "," + depth[2] + + "," + depth[3] + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/Cs2csOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/Cs2csOperator.java new file mode 100644 index 0000000..6fafab0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/Cs2csOperator.java @@ -0,0 +1,916 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.datum.PrimeMeridian; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.parser.Proj4Parser; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.vertical.VGridShiftOperator; + +/** + * A classic PROJ.4-style operation — a projection plus the "cs2cs emulation" + * helper steps PROJ hides inside it. + * + *

Why this class is the crux

+ * + *

A GIGS pipeline step is almost always {@code +init=epsg:NNNN}, whose expansion + * is a legacy proj-string carrying {@code +towgs84}, {@code +pm}, {@code +axis} and + * {@code +units}. None of those are handled by the projection formula. PROJ handles + * them in {@code cs2cs_emulation_setup} ({@code 9.8.1:src/create.cpp:48-201}), which + * builds up to five hidden sub-operations, and in + * {@code fwd_prepare}/{@code fwd_finalize} ({@code src/fwd.cpp:39-165}) and + * {@code inv_prepare}/{@code inv_finalize} ({@code src/inv.cpp:39-140}), which + * invoke them in a fixed order. That order is the semantics of a legacy + * {@code +init=} string, and it is what makes a two-step GIGS pipeline mean + * "local CRS to WGS84 hub to local CRS". + * + *

The direction convention follows from the order, and is worth stating because + * it looks inverted: the operation's left side is the WGS84 hub and its + * right side is the local system. So {@code +init=X +inv} converts + * from X to the hub, and {@code +init=Y} converts from the hub to Y. That + * is exactly the shape every GIGS file uses, and exactly what {@code cs2cs} does + * with a source and a target CRS. + * + *

The forward order, verbatim

+ * + *
    + *
  1. {@code fwd_prepare}, only when the left side is + * {@link GieIoUnits#RADIANS}: + *
      + *
    1. reject {@code |phi| - pi/2 > 1e-12} and {@code |lam| > 10} radians + * — note radians, so the longitude bound is about +/-573 degrees, not 180;
    2. + *
    3. clamp {@code phi} into {@code [-pi/2, pi/2]};
    4. + *
    5. {@code adjlon} unless {@code +over};
    6. + *
    7. the datum shift: geodetic-WGS84 to cartesian, Helmert into the local + * frame, cartesian back to geodetic on the local ellipsoid;
    8. + *
    9. {@code lam = (lam - from_greenwich) - lam0}, then {@code adjlon} again.
    10. + *
  2. + *
  3. the projection formula;
  4. + *
  5. {@code fwd_finalize}: scale by {@code a}, add the false easting and + * northing, scale to the target unit — then the {@code +axis} swap, last.
  6. + *
+ * + *

The inverse is the exact mirror, including that {@code +axis} is undone + * first. + * + *

What is delegated to proj4j and what is not

+ * + *

{@code Projection.projectRadians} already bundles steps 1(e)-{@code lam0} and + * all of step 2 and 3-except-{@code +axis}: it subtracts {@code lon_0}, normalises, + * runs the formula, then applies {@code a}, the false easting/northing and + * {@code +units}. So this class subtracts only {@code from_greenwich} and lets + * proj4j do the rest, which keeps one implementation of the affine post-multiply + * rather than two. The one gap is that proj4j skips its longitude normalisation + * when {@code lon_0 == 0} while PROJ always normalises, so that case is handled + * here. + * + *

{@code +proj=longlat} and {@code +proj=geocent} bypass proj4j entirely. + * {@code LongLatProjection} installs {@code Units.DEGREES}, so + * {@code projectRadians} multiplies its output by {@code 180/pi} — PROJ's + * {@code latlong} is {@code RADIANS} on both sides and its formula is the identity, + * so going through proj4j would mean converting to degrees and back. + * {@code GeocentProjection} is worse: both of its methods read the destination + * coordinate instead of the source ({@code GeocentProjection.java:9-20}), so it + * cannot produce a correct answer at all. Both are handled here with + * {@link CartConversion}, which is upstream's own {@code +proj=cart}. + * + *

{@code +geoidgrids} and {@code +nadgrids} are built; {@code +geoc} is not

+ * + *

{@code +geoidgrids} becomes a hidden {@link VGridShiftOperator} — + * {@code create.cpp:88-105} builds + * {@code break_cs2cs_recursion proj=vgridshift grids=} and stores it as + * {@code P->vgridshift}, and {@code fwd_prepare} runs it forward immediately + * after the datum shift and before the {@code lam0} subtraction + * ({@code fwd.cpp:96-99}), which is where it sits below. The inverse runs it before + * the datum shift on the way back ({@code inv.cpp:117-119}). Its sign convention is + * {@code z += value * multiplier} with {@code multiplier} defaulting to {@code -1}, + * i.e. an ellipsoidal height becomes an orthometric one. + * + *

{@code +nadgrids} becomes a hidden {@link HGridShiftOperator} + * ({@code create.cpp:107-124}), and it is not just another branch of the datum + * shift — it replaces the whole Helmert branch. Three details, each of which + * reads backwards until you check the source: + * + *

    + *
  1. {@code +nadgrids} suppresses the {@code towgs84} Helmert, and the cartesian + * round-trip with it. {@code create.cpp:125} is + * {@code p = P->hgridshift ? nullptr : pj_param_exists(P->params, "towgs84")}, so + * the all-zero test that would have set {@code do_cart} is never reached either. + * A grid shift is a geographic-to-geographic operation and needs no change of + * ellipsoid: the projection formula that follows already uses the local one.
  2. + *
  3. An explicit {@code +towgs84} does not beat a {@code +datum=} whose definition + * is a grid. {@code pj_datum_set} tests {@code nadgrids} first and reaches + * {@code towgs84} only in the {@code else}, and the datum's {@code defn} has by + * then been appended to the paralist — so {@code +datum=potsdam + * +towgs84=1,2,3} is a grid shift, not a Helmert.
  4. + *
  5. The forward direction runs the grid inverse + * ({@code fwd.cpp:86}, {@code proj_trans(P->hgridshift, PJ_INV, coo)}), because the + * operation's left-hand side is the WGS84 hub and a datum grid is defined from the + * local system towards it. {@code inv_finalize} runs it {@code PJ_FWD} + * ({@code inv.cpp:124}).
  6. + *
+ * + *

{@code +geoc}, and the guard that makes it a no-op more often than not

+ * + *

{@code P->geoc = (P->es != 0.0 && pj_param(ctx, start, "bgeoc").i)} + * ({@code init.cpp:598}) — so on a sphere the flag is read, accepted, and has no + * effect, because the geocentric and geographic latitudes coincide there. + * {@code pj_geocentric_latitude} ({@code conversions/geoc.cpp:37-64}) then declines a + * second time, within a nanoradian of either pole, "so very close (the last + * centimeter) to the poles no conversion takes place": {@code tan} goes through the + * roof there while the two latitudes converge, so copying the input is both safer and + * more accurate than computing. + * + *

Note the direction, which is the opposite of the name's suggestion: + * {@code fwd_prepare} calls it {@code PJ_INV} ({@code fwd.cpp:81}), because a + * {@code +geoc} operation's input is geocentric and has to be made geographic + * before anything else touches it. {@code inv_finalize} calls it {@code PJ_FWD} + * ({@code inv.cpp:140}), last of all. + * + *

The vertical unit

+ * + *

{@code +vunits}/{@code +vto_meter}/{@code +z_0} are read here rather than in + * {@code Proj4Parser}, because {@code proj.Projection} has no vertical unit at all — + * it never touches {@code z}. The rules are {@code init.cpp:715-750}'s, and they + * mirror the horizontal pair exactly: {@code +vunits} is looked up in + * {@code pj_list_linear_units()} and, when present, {@code +vto_meter} is never + * read; when neither is given the vertical unit falls back to the horizontal + * one, so {@code +units=ft} scales {@code z} as well. The scaling itself is + * {@code fwd_finalize}'s {@code z = vfr_meter * (z + z0)} and + * {@code inv_prepare}'s {@code z = vto_meter * z - z0}. + * + *

Not thread-safe: proj4j {@code Projection} instances are mutable, and + * {@code +proj=cass} writes seventeen instance fields on the hot path. + */ +final class Cs2csOperator implements PipelineOperator { + + /** {@code PJ_EPS_LAT}, in radians. */ + static final double EPS_LAT = 1e-12; + + /** {@code M_HALFPI}. */ + static final double HALF_PI = Math.PI / 2.0; + + /** {@code fwd_prepare}'s longitude bound, in radians ({@code fwd.cpp:65}). */ + static final double MAX_LAM = 10.0; + + /** {@code SPI} from {@code proj_internal.h} — deliberately a hair above {@code M_PI}. */ + private static final double SPI = 3.14159265359; + + private static final double TWO_PI = Math.PI * 2.0; + + /** WGS84's semi-major axis, as {@code create.cpp:131} spells it. */ + private static final double WGS84_A = 6378137.0; + + /** WGS84's first eccentricity squared, as {@code create.cpp:132} spells it. */ + private static final double WGS84_ES = 0.0066943799901413; + + /** Which formula sits between prepare and finalize. */ + private enum Kernel { + /** {@code +proj=longlat} and its three aliases: the identity, radians both sides. */ + LONGLAT, + /** {@code +proj=geocent}: radians in, cartesian metres out. */ + GEOCENT, + /** Anything else in {@code Registry}: radians in, scaled metres out. */ + PROJECTION + } + + private final String description; + private final Kernel kernel; + private final Projection projection; + private final double lam0; + private final double fromGreenwich; + private final boolean over; + private final double frMeter; + private final double toMeter; + + /** {@code P->vto_meter}; falls back to {@link #toMeter} when no vertical unit is given. */ + private final double vToMeter; + /** {@code P->vfr_meter}, i.e. {@code 1 / vToMeter}. */ + private final double vFrMeter; + /** {@code P->z0}, always metres ({@code init.cpp:662}). */ + private final double z0; + /** Whether the vertical affine is the identity, so it can be skipped entirely. */ + private final boolean verticalAffineIsIdentity; + + private final CartConversion cart; + private final CartConversion cartWgs84; + private final HelmertConversion helmert; + private final AxisSwapOperator axisSwap; + /** {@code P->vgridshift}, built from {@code +geoidgrids}; null when absent. */ + private final VGridShiftOperator vgridshift; + /** {@code P->hgridshift}, built from {@code +nadgrids}; null when absent. */ + private final HGridShiftOperator hgridshift; + + /** {@code P->geoc} ({@code init.cpp:598}): {@code +geoc} and {@code es != 0}. */ + private final boolean geoc; + /** {@code P->one_es}, i.e. {@code 1 - es}; only read when {@link #geoc}. */ + private final double oneEs; + /** {@code P->rone_es}, i.e. {@code 1 / (1 - es)}; only read when {@link #geoc}. */ + private final double rOneEs; + + private GieIoUnits left; + private GieIoUnits right; + + /** + * @param registry the projection registry to resolve {@code +proj=} against + * @param params the step's fully expanded parameter list — {@code +init=} and + * {@code +datum=} already appended, so first-match-wins gives + * PROJ's precedence + */ + Cs2csOperator(final Registry registry, final ProjParams params) { + final String projName = params.value("proj"); + this.description = projName == null ? params.toString() : projName; + + final CoordinateReferenceSystem crs = new Proj4Parser(registry).parse(null, params.toProj4Args()); + if (crs == null || crs.getProjection() == null) { + throw new PipelineDefinitionException(PipelineErrorCode.NOT_IMPLEMENTED_HERE, + "proj4j produced no projection for " + params); + } + this.projection = crs.getProjection(); + + if (isLongLat(projName)) { + this.kernel = Kernel.LONGLAT; + this.left = GieIoUnits.RADIANS; + this.right = GieIoUnits.RADIANS; + } else if ("geocent".equals(projName)) { + this.kernel = Kernel.GEOCENT; + this.left = GieIoUnits.RADIANS; + this.right = GieIoUnits.CARTESIAN; + } else { + this.kernel = Kernel.PROJECTION; + this.left = GieIoUnits.RADIANS; + // Every PROJ_HEAD projection declares CLASSIC, which pj_right folds to + // PROJECTED (proj_internal.h:882-883). + this.right = GieIoUnits.CLASSIC; + } + + this.lam0 = projection.getProjectionLongitude(); + this.fromGreenwich = offsetFromGreenwich(projection.getPrimeMeridian()); + this.over = params.booleanValue("over"); + this.frMeter = projection.getFromMetres(); + this.toMeter = 1.0 / frMeter; + + // init.cpp:715-750. +vunits wins over +vto_meter; absent both, the vertical unit is + // the horizontal one. + this.vToMeter = verticalToMeter(params, toMeter); + this.vFrMeter = 1.0 / vToMeter; + this.z0 = params.doubleValue("z_0", 0.0); + this.verticalAffineIsIdentity = vToMeter == 1.0 && z0 == 0.0; + + final Ellipsoid ellipsoid = projection.getEllipsoid(); + final double aOrig = ellipsoid.getEquatorRadius(); + final double esOrig = ellipsoid.getEccentricitySquared(); + + // init.cpp:598. The `es != 0` half is not an optimisation: on a sphere the two + // latitudes are equal, so +geoc is legitimately accepted and ignored there. + this.geoc = esOrig != 0.0 && params.booleanValue("geoc"); + this.oneEs = 1.0 - esOrig; + this.rOneEs = 1.0 / (1.0 - esOrig); + + // create.cpp:107-124. The +nadgrids helper, built BEFORE the towgs84 one because + // its existence is what decides whether the towgs84 one is looked up at all. + // Upstream's guard is strlen(p->param) > strlen("nadgrids="), so a bare + // +nadgrids with no value, or an empty one, builds nothing rather than failing. + final String nadgrids = nadgridsSpec(params); + this.hgridshift = nadgrids == null || nadgrids.isEmpty() + ? null + : HGridShiftOperator.fromGrids(nadgrids); + + // create.cpp:125: `p = P->hgridshift ? nullptr : pj_param_exists(params, "towgs84")`. + // A grid shift suppresses the Helmert *and* the do_cart branch below it, because + // the all-zero test that sets do_cart lives inside the towgs84 loop. + final double[] datumParams = hgridshift != null ? null : datumParams(registry, params); + final boolean isGeocent = kernel == Kernel.GEOCENT; + + // create.cpp:124-158. An all-zero towgs84 is ignored, except that a + // non-WGS84 ellipsoid still forces the cartesian round-trip, because the + // change of ellipsoid is itself a change of coordinates. + boolean doCart = false; + HelmertConversion h = null; + if (datumParams != null) { + if (isAllZero(datumParams)) { + if (!isWgs84Ellipsoid(aOrig, esOrig)) { + doCart = true; + } + } else { + h = new HelmertConversion(datumParams); + } + } + this.helmert = h; + + if (isGeocent || helmert != null || doCart) { + this.cart = new CartConversion(aOrig, esOrig); + // create.cpp:192 - no WGS84 leg for a geocentric operation, because + // its own right-hand side already is cartesian. + this.cartWgs84 = isGeocent ? null : new CartConversion(WGS84_A, WGS84_ES); + } else { + this.cart = null; + this.cartWgs84 = null; + } + + // create.cpp:88-105. The +geoidgrids helper. Note upstream's own guard: + // strlen(p->param) > strlen("geoidgrids="), so a bare +geoidgrids with no value or + // an empty one builds nothing at all rather than failing. + // + // The def upstream builds is a *fresh, independent* parameter string, so the outer + // operation's own +multiplier is deliberately NOT inherited: the auto-inserted step + // always runs at the vgridshift default of -1. Reading +multiplier here would let a + // token PROJ ignores flip the sign of every height. + final String geoidGrids = params.value("geoidgrids"); + this.vgridshift = geoidGrids == null || geoidGrids.isEmpty() + ? null + : VGridShiftOperator.fromGrids(geoidGrids, VGridShiftOperator.DEFAULT_MULTIPLIER); + + // create.cpp:70-88. The +axis helper is built whenever +axis is present: + // upstream's guard compares the whole token "axis=enu" against "enu" and so + // never matches, making even +axis=enu insert an (identity) swap. + this.axisSwap = params.has("axis") + ? new AxisSwapOperator(ProjParams.parse("axis=" + params.value("axis"))) + : null; + } + + private static boolean isLongLat(final String projName) { + return "longlat".equals(projName) || "latlong".equals(projName) + || "lonlat".equals(projName) || "latlon".equals(projName); + } + + /** + * The {@code nadgrids=} definitions of PROJ's built-in datum table, verbatim from + * {@code 9.8.1:src/datums.cpp:44-50} — the only two of its ten entries whose + * {@code defn} is a grid list rather than a {@code towgs84=}: + *

+     * {"NAD27",   "nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", "clrk66", ...},
+     * {"potsdam", "nadgrids=@BETA2007.gsb",                            "bessel", ...},
+     * 
+ * + *

Held here rather than read off the {@link Datum} object, for two reasons, and + * the second one was measured the hard way. + * + *

First, {@code Datum} keeps the resolved {@code List} and + * not the list as written, and {@code create.cpp} needs the string: + * {@code @}-optionality is part of the token, and it is what makes a missing grid a + * pass-through rather than an error. + * + *

Second, {@code Datum.getTransformType()} is not a safe question to ask. + * {@code Datum.POTSDAM} and {@code Datum.NAD27} resolve their grids in a + * static initialiser, so whether they report {@code TYPE_GRIDSHIFT} depends + * on whether the resolver chain was configured before the class happened to load. + * Observed: {@code DHDN_ETRS89.gie} scored 64/64 when the harness loaded the grid + * resolver first and 32/32 when an unrelated earlier test touched {@code Registry} + * first — the same code, the same grid on the same classpath, a different answer. + * Reading the datum table instead makes the decision a function of the + * definition alone, and defers the question of whether the file exists to + * {@link HorizontalGrids#open}, which is called at operator-construction time and is + * therefore ordered after any resolver setup. + * + *

This also matches {@code pj_init} more closely than the alternative did. + * {@code pj_datum_set} appends {@code nadgrids=@BETA2007.gsb} unconditionally and + * {@code cs2cs_emulation_setup} builds an {@code hgridshift} from it whatever the + * file system says; the Helmert that {@code Datum.POTSDAM} keeps as a fallback is + * {@code cs2cs}'s CRS-layer behaviour, which is a different code path with a + * different answer (see that constant's javadoc, which measures both). + */ + private static final String[][] LEGACY_DATUM_NADGRIDS = { + {"NAD27", "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat"}, + {"potsdam", "@BETA2007.gsb"}, + }; + + /** + * The effective {@code +nadgrids=} list: the token if the definition carries one, + * otherwise whatever a {@code +datum=} naming a grid-shift datum expands to. + * + *

{@code pj_datum_set} appends the datum's {@code defn} to the paralist + * and then tests {@code nadgrids} before {@code towgs84}, in an + * {@code if}/{@code else if}. So a grid definition reached through {@code +datum=} + * outranks an explicit {@code +towgs84} written by the user, which is the one + * precedence in this file that is not first-match-wins. + * + * @param params the step's fully expanded parameter list + * @return the list as written, or {@code null} when the step declares no grid shift + */ + private static String nadgridsSpec(final ProjParams params) { + final String explicit = params.value("nadgrids"); + if (explicit != null) { + return explicit; + } + final String datumCode = params.value("datum"); + if (datumCode == null) { + return null; + } + for (int i = 0; i < LEGACY_DATUM_NADGRIDS.length; i++) { + if (LEGACY_DATUM_NADGRIDS[i][0].equalsIgnoreCase(datumCode)) { + return LEGACY_DATUM_NADGRIDS[i][1]; + } + } + // Not one of the two grid-shift datums. Whether the code exists at all is + // datumParams's question, and it is the one that reports an unknown datum. + return null; + } + + /** + * {@code P->vto_meter} ({@code init.cpp:715-750}). + * + *

Three branches, in this exact order, and the first two are mutually exclusive: + * {@code +vunits} is looked up in {@code pj_list_linear_units()} and its own + * {@code to_meter} string is what gets parsed, so {@code +vto_meter} is never read + * when {@code +vunits} is present; otherwise {@code +vto_meter} is parsed with the + * {@code num/den} ratio syntax; otherwise the value is the horizontal + * {@code to_meter}. + * + *

Only linear units are accepted, because upstream searches + * {@code pj_list_linear_units()} and nothing else — so {@code +vunits=deg} is + * "Invalid value for vunits", not a radian conversion. + * + * @param params the step's parameters + * @param horizontalToMeter {@code P->to_meter}, the fallback + * @return the vertical {@code to_meter}, guaranteed positive and finite + */ + private static double verticalToMeter(final ProjParams params, final double horizontalToMeter) { + final String vunits = params.value("vunits"); + if (vunits != null) { + final PipelineUnits.Resolution unit = PipelineUnits.resolve(vunits); + if (!unit.isKnown() || unit.linear() != 1) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+vunits=" + vunits + " is not one of PROJ's linear units"); + } + return unit.factor(); + } + final String vtoMeter = params.value("vto_meter"); + if (vtoMeter != null) { + return parseToMeter(vtoMeter); + } + return horizontalToMeter; + } + + /** + * {@code +vto_meter}'s value syntax: a plain double, or a {@code num/den} ratio, which is + * how PROJ's own unit table spells {@code us-ft} ({@code "1200/3937"}). + * + * @param raw the value as written + * @return the factor, validated positive and finite + */ + private static double parseToMeter(final String raw) { + final String v = raw.trim(); + final int slash = v.indexOf('/'); + double value; + try { + if (slash >= 0) { + final double denominator = Double.parseDouble(v.substring(slash + 1).trim()); + if (denominator == 0.0) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+vto_meter=" + raw + " has a zero denominator"); + } + value = Double.parseDouble(v.substring(0, slash).trim()) / denominator; + } else { + value = Double.parseDouble(v); + } + } catch (final NumberFormatException e) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "invalid +vto_meter value: " + raw, e); + } + if (!(value > 0.0) || Double.isInfinite(value)) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+vto_meter=" + raw + " must be > 0"); + } + return value; + } + + /** + * {@code pj_datum_set}'s {@code P->datum_params}: {@code +towgs84} if present, + * otherwise whatever {@code +datum=} expands to. + * + *

Translations in metres, rotations in radians, element 6 holding + * {@code 1 + s/1e6}. proj4j's {@code datum.Datum} already stores exactly that, + * so {@code +datum=} needs no conversion and {@code +towgs84=} needs the same + * one {@code Datum}'s constructor applies. + * + * @return {@code null} when the step declares no datum shift at all + */ + private static double[] datumParams(final Registry registry, final ProjParams params) { + final String towgs84 = params.value("towgs84"); + if (towgs84 != null) { + return parseTowgs84(towgs84); + } + final String datumCode = params.value("datum"); + if (datumCode != null) { + final Datum datum = registry.getDatum(datumCode); + if (datum == null) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "unknown datum: " + datumCode); + } + // A grid-shift datum never reaches here: nadgridsSpec resolved it to an + // hgridshift and the caller then skipped this method entirely, exactly as + // create.cpp:125 skips the towgs84 lookup. Reading only the Helmert + // parameters would have silently dropped the grid. + final double[] transform = datum.getTransformToWGS84(); + return transform == null ? null : transform.clone(); + } + return null; + } + + /** + * {@code datum_set.cpp:113-140}. Seven slots, zero filled; the arcsecond and + * ppm conversions happen only when at least one of slots 3..6 is non-zero, which + * is what makes an all-zero seven-value {@code +towgs84} indistinguishable from + * a three-value one — and that in turn is what {@code create.cpp}'s all-zero + * test relies on. + */ + private static double[] parseTowgs84(final String value) { + final double[] out = new double[7]; + final String[] fields = value.split(","); + final int n = Math.min(fields.length, 7); + for (int i = 0; i < n; i++) { + final String field = fields[i].trim(); + if (field.isEmpty()) { + continue; + } + try { + out[i] = Double.parseDouble(field); + } catch (final NumberFormatException e) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "invalid +towgs84 value: " + value, e); + } + } + if (out[3] != 0.0 || out[4] != 0.0 || out[5] != 0.0 || out[6] != 0.0) { + out[3] *= org.locationtech.proj4j.util.ProjectionMath.SECONDS_TO_RAD; + out[4] *= org.locationtech.proj4j.util.ProjectionMath.SECONDS_TO_RAD; + out[5] *= org.locationtech.proj4j.util.ProjectionMath.SECONDS_TO_RAD; + out[6] = out[6] / org.locationtech.proj4j.util.ProjectionMath.MILLION + 1.0; + } + return out; + } + + private static boolean isAllZero(final double[] p) { + for (int i = 0; i < p.length; i++) { + if (p[i] != 0.0) { + return false; + } + } + return true; + } + + /** {@code create.cpp:133-134}, tolerances included. */ + private static boolean isWgs84Ellipsoid(final double a, final double es) { + return Math.abs(a - WGS84_A) < 1e-8 && Math.abs(es - WGS84_ES) < 1e-15; + } + + /** + * {@code P->from_greenwich}, in radians east. + * + *

Read by probing {@link PrimeMeridian#toGreenwich}, which adds the offset, + * rather than by re-tabulating PROJ's fourteen named meridians: the table + * proj4j already has is the one {@code Proj4Parser} resolved {@code +pm} + * against, and a second copy of it could drift. + */ + private static double offsetFromGreenwich(final PrimeMeridian pm) { + if (pm == null) { + return 0.0; + } + final ProjCoordinate probe = new ProjCoordinate(0.0, 0.0, 0.0); + pm.toGreenwich(probe); + return probe.x; + } + + /** {@code adjlon} ({@code proj_internal.h:414-423}). */ + private static double adjlon(double lon) { + if (Math.abs(lon) <= SPI) { + return lon; + } + lon += Math.PI; + lon -= TWO_PI * Math.floor(lon / TWO_PI); + lon -= Math.PI; + return lon; + } + + // ------------------------------------------------------------------ execute + + @Override + public void forward(final double[] coord) { + if (left == GieIoUnits.RADIANS) { + prepareAngular(coord); + } else if (left == GieIoUnits.CARTESIAN && helmert != null) { + // fwd.cpp:114-116: gridshifts are unsupported on cartesian input, but a + // Helmert is applied in reverse. + helmert.inverse(coord); + } + + switch (kernel) { + case LONGLAT: + verticalFinalize(coord); + break; + case GEOCENT: + cart.forward(coord); + coord[0] *= frMeter; + coord[1] *= frMeter; + coord[2] *= frMeter; + break; + default: + projectForward(coord); + verticalFinalize(coord); + break; + } + + if (axisSwap != null) { + axisSwap.forward(coord); + } + } + + /** + * {@code fwd_finalize}'s vertical line: {@code z = vfr_meter * (z + z0)}. + * + *

Reached for {@code PJ_IO_UNITS_CLASSIC}/{@code PROJECTED} ({@code fwd.cpp:145}) and + * for {@code PJ_IO_UNITS_RADIANS} ({@code fwd.cpp:157}) — the same expression in both, so + * one method serves both kernels. {@code CARTESIAN} is not one of them: a geocentric + * operation scales {@code z} by the horizontal {@code fr_meter} along with + * {@code x} and {@code y}, which the {@code GEOCENT} branch already does. + * + * @param coord the coordinate, mutated in place + */ + private void verticalFinalize(final double[] coord) { + if (verticalAffineIsIdentity) { + return; + } + coord[2] = vFrMeter * (coord[2] + z0); + } + + /** {@code inv_prepare}'s mirror: {@code z = vto_meter * z - z0}. */ + private void verticalPrepare(final double[] coord) { + if (verticalAffineIsIdentity) { + return; + } + coord[2] = vToMeter * coord[2] - z0; + } + + /** {@code fwd_prepare}'s {@code PJ_IO_UNITS_RADIANS} branch ({@code fwd.cpp:54-113}). */ + private void prepareAngular(final double[] coord) { + if (coord[0] == Double.POSITIVE_INFINITY || coord[1] == Double.POSITIVE_INFINITY + || coord[2] == Double.POSITIVE_INFINITY) { + throw new ProjectionException("HUGE_VAL ordinate: fwd_prepare returns proj_coord_error()"); + } + if (Math.abs(coord[1]) - HALF_PI > EPS_LAT) { + throw new ProjectionException("Invalid latitude: |phi| - pi/2 = " + + (Math.abs(coord[1]) - HALF_PI) + " rad exceeds PJ_EPS_LAT"); + } + if (coord[0] > MAX_LAM || coord[0] < -MAX_LAM) { + throw new ProjectionException("Invalid longitude: " + coord[0] + + " rad is outside +/-10"); + } + if (coord[1] > HALF_PI) { + coord[1] = HALF_PI; + } else if (coord[1] < -HALF_PI) { + coord[1] = -HALF_PI; + } + // fwd.cpp:80-81, "If input latitude is geocentrical, convert to geographical". + // Note PJ_INV, and note that it happens after the clamp and before adjlon. + if (geoc) { + coord[1] = geocentricLatitude(coord[1], false); + } + if (!over) { + coord[0] = adjlon(coord[0]); + } + + // The datum shift, from the WGS84 hub into the local frame. + // + // fwd.cpp:86-95 is an if/else if, not two independent steps: a grid shift and a + // Helmert are alternatives, and the grid runs PJ_INV here because the hub is on + // the left and a datum grid is defined local-to-hub. + if (hgridshift != null) { + hgridshift.inverse(coord); + } else if (helmert != null || (cartWgs84 != null && cart != null)) { + if (cartWgs84 != null) { + cartWgs84.forward(coord); + if (helmert != null) { + helmert.inverse(coord); + } + cart.inverse(coord); + } else if (helmert != null) { + // A geocentric operation carrying a real +towgs84: upstream would + // dereference a null cart_wgs84 here, so there is nothing to be + // faithful to. Apply the Helmert in the local cartesian frame. + cart.forward(coord); + helmert.inverse(coord); + cart.inverse(coord); + } + } + + // fwd.cpp:96-99, "Go orthometric from geometric". After the datum shift, before the + // lam0 subtraction: a vertical grid is indexed by the *local* frame's geographic + // position, so it must not see the central-meridian-relative longitude. + if (vgridshift != null) { + vgridshift.forward(coord); + } + + // PROJ: lam = (lam - from_greenwich) - lam0, then adjlon. + // + // For Kernel.PROJECTION the "- lam0, then normalise" half belongs to + // Projection.projectRadians, which does it iff lon_0 != 0. So only the + // prime-meridian subtraction happens here, plus the normalisation proj4j + // would otherwise skip when lon_0 == 0. + coord[0] -= fromGreenwich; + if (kernel != Kernel.PROJECTION) { + coord[0] -= lam0; + } + if (!over && (kernel != Kernel.PROJECTION || lam0 == 0.0)) { + coord[0] = adjlon(coord[0]); + } + } + + private void projectForward(final double[] coord) { + final ProjCoordinate src = new ProjCoordinate(coord[0], coord[1], coord[2]); + final ProjCoordinate dst = new ProjCoordinate(Double.NaN, Double.NaN, Double.NaN); + projection.projectRadians(src, dst); + coord[0] = dst.x; + coord[1] = dst.y; + } + + @Override + public void inverse(final double[] coord) { + if (axisSwap != null) { + axisSwap.inverse(coord); + } + + switch (kernel) { + case LONGLAT: + verticalPrepare(coord); + break; + case GEOCENT: + coord[0] *= toMeter; + coord[1] *= toMeter; + coord[2] *= toMeter; + cart.inverse(coord); + break; + default: + // inv_prepare de-scales z along with x and y, before the formula runs. + verticalPrepare(coord); + projectInverse(coord); + break; + } + + if (left == GieIoUnits.RADIANS) { + finalizeAngular(coord); + } + } + + private void projectInverse(final double[] coord) { + if (!projection.hasInverse()) { + throw new PipelineDefinitionException(PipelineErrorCode.NO_INVERSE_OP, + "+proj=" + description + " has no inverse in proj4j"); + } + final ProjCoordinate src = new ProjCoordinate(coord[0], coord[1], coord[2]); + final ProjCoordinate dst = new ProjCoordinate(Double.NaN, Double.NaN, Double.NaN); + projection.inverseProjectRadians(src, dst); + coord[0] = dst.x; + coord[1] = dst.y; + } + + /** {@code inv_finalize}'s {@code PJ_IO_UNITS_RADIANS} branch ({@code inv.cpp:102-140}). */ + private void finalizeAngular(final double[] coord) { + coord[0] += fromGreenwich; + if (kernel != Kernel.PROJECTION) { + coord[0] += lam0; + } + if (!over) { + coord[0] = adjlon(coord[0]); + } + // inv.cpp:117-119, "Go geometric from orthometric": the exact mirror, so the vertical + // shift is undone *before* the datum shift rather than after it. + if (vgridshift != null) { + vgridshift.inverse(coord); + } + // inv.cpp:124-133, the exact mirror: PJ_FWD for the grid, and still an + // if/else if against the Helmert branch. + if (hgridshift != null) { + hgridshift.forward(coord); + } else if (helmert != null || (cartWgs84 != null && cart != null)) { + if (cartWgs84 != null) { + cart.forward(coord); + if (helmert != null) { + helmert.forward(coord); + } + cartWgs84.inverse(coord); + } else if (helmert != null) { + cart.forward(coord); + helmert.forward(coord); + cart.inverse(coord); + } + } + // inv.cpp:139-140, last of all: "If input latitude was geocentrical, convert + // back to geocentrical". PJ_FWD this time. + if (geoc) { + coord[1] = geocentricLatitude(coord[1], true); + } + } + + /** + * {@code pj_geocentric_latitude} ({@code conversions/geoc.cpp:37-64}). + * + *

Two escapes, both upstream's and both load-bearing. Within + * {@code M_HALFPI - 1e-9} of a pole the input is returned unchanged, because + * {@code tan} diverges there while the geocentric and geographic latitudes converge + * — so computing would be both slower and worse. On a sphere ({@code es == 0}) the + * two are identical everywhere; that case never reaches here, because + * {@link #geoc} folds it in at construction exactly as {@code init.cpp:598} does. + * + * @param phi latitude in radians + * @param forward {@code PJ_FWD}, i.e. geographic to geocentric; {@code false} for + * {@code PJ_INV} + * @return the converted latitude in radians + */ + private double geocentricLatitude(final double phi, final boolean forward) { + final double limit = HALF_PI - 1e-9; + if (phi > limit || phi < -limit) { + return phi; + } + return Math.atan((forward ? oneEs : rOneEs) * Math.tan(phi)); + } + + // ------------------------------------------------------------------- units + + @Override + public GieIoUnits declaredLeft() { + return left; + } + + @Override + public GieIoUnits declaredRight() { + return right; + } + + @Override + public void overrideUnits(final GieIoUnits newLeft, final GieIoUnits newRight) { + // Only reachable for an operator declaring WHATEVER on both sides, which a + // classic projection never does. + this.left = newLeft; + this.right = newRight; + } + + @Override + public boolean hasInverse() { + return kernel != Kernel.PROJECTION || projection.hasInverse(); + } + + @Override + public String description() { + return description; + } + + /** The proj4j projection behind this step, for tests and diagnostics. */ + Projection projection() { + return projection; + } + + /** + * The hidden {@code +proj=vgridshift} step {@code +geoidgrids} produced. + * + * @return the operator, or {@code null} when the step declares no {@code +geoidgrids} + */ + VGridShiftOperator vgridshift() { + return vgridshift; + } + + /** + * The hidden {@code +proj=hgridshift} step {@code +nadgrids} — or a {@code +datum=} + * whose definition is a grid list — produced. + * + * @return the operator, or {@code null} when the step declares no grid shift + */ + HGridShiftOperator hgridshift() { + return hgridshift; + } + + /** {@code P->vto_meter}, for tests and diagnostics. */ + double verticalToMeter() { + return vToMeter; + } + + @Override + public String toString() { + return "Cs2csOperator[" + description + ", " + kernel + ", left=" + left + ", right=" + right + + (helmert != null ? ", helmert" : "") + (cart != null ? ", cart" : "") + + (hgridshift != null ? ", " + hgridshift.description() : "") + + (geoc ? ", geoc" : "") + + (vgridshift != null ? ", " + vgridshift.description() : "") + + (vToMeter != 1.0 ? ", vto_meter=" + vToMeter : "") + + (axisSwap != null ? ", " + axisSwap.description() : "") + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/DeformationOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/DeformationOperator.java new file mode 100644 index 0000000..b2bec75 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/DeformationOperator.java @@ -0,0 +1,363 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.VerticalGrid; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=deformation} — kinematic datum shifting through a velocity model, + * ported from {@code 9.8.1:src/transformations/deformation.cpp}. + * + *

The operation

+ * + *
+ * X_out = X_in + (t_obs - t_epoch) * DX
+ * Y_out = Y_in + (t_obs - t_epoch) * DY
+ * Z_out = Z_in + (t_obs - t_epoch) * DZ
+ * 
+ * + *

Input and output are geocentric cartesian metres ({@code P->left} and + * {@code P->right} are both {@code PJ_IO_UNITS_CARTESIAN}), which is why the corpus + * always writes it between two {@code +proj=cart} steps. The grid, however, is + * indexed geographically and its three channels are east, north and up — so every + * evaluation converts cartesian to geodetic to find the cell, reads an ENU velocity + * triple, and rotates that triple back into the cartesian frame. + * + *

The two grid spellings

+ * + *

A modern model is one three-channel Geodetic TIFF Grid named by {@code +grids}. + * The historical spelling is a pair: {@code +xy_grids} in CTable/CTable2 (or NTv1 or + * NTv2) form for east and north, and {@code +z_grids} in GTX form for up. Both + * spellings expect millimetres per year, which is why every channel is divided + * by 1000 on the way out. + * + *

{@code +grids} is refused here with a message naming the reason, because proj4j + * has no GeoTIFF grid reader: the three-channel form cannot be read at all, and the + * two-grid form covers everything the corpus exercises with a legacy grid. + * + *

{@code +dt} versus {@code +t_epoch}, which are mutually exclusive

+ * + *

Exactly one must be given ({@code deformation.cpp:377-392}). With {@code +dt} the + * interval is fixed and the coordinate's own epoch is never read. With + * {@code +t_epoch} the interval is {@code t - t_epoch}, and a coordinate whose + * {@code t} is {@code HUGE_VAL} — gie's spelling for "no epoch" — is + * {@code PROJ_ERR_COORD_TRANSFM_MISSING_TIME}. Note that gie zero-fills an unwritten + * fourth ordinate, so "no epoch" has to be written out as the literal + * {@code HUGE_VAL}; a three-ordinate row arrives with {@code t = 0} and is a perfectly + * valid observation at year zero. + * + *

{@code +t_obs} is a hard error with a migration message + * ({@code deformation.cpp:400}), not a synonym for {@code +dt}. It is undocumented and + * one of the entries in this project's "implement from the code, not the docs" table. + * + *

The inverse is iterative and its z is not

+ * + *

{@code pj_deformation_reverse_shift} runs a 10-iteration fixed point on the + * horizontal components with a {@code 1e-8} tolerance on {@code hypot(dif.x, dif.y)}, + * carrying z along only because the cartesian-to-geodetic conversion needs it, and + * then overwrites z with the one-step value {@code input.z - dt * z0} computed + * from the first evaluation. Ported verbatim, including that overwrite: the + * expected values in {@code deformation.gie} were generated by it, and "improving" the + * z iteration would change them. + * + *

Note also that the loop's {@code dif.z} uses {@code out.z - dt * delta.z} where + * the other two use {@code + dt * delta}. That asymmetry is upstream's, and it is + * inside the discarded part of the computation, so it has no effect on the result — it + * is transcribed rather than tidied so the two files can be diffed. + * + *

Immutable after construction; safe to share. + * + * @since 1.5 + */ +final class DeformationOperator implements PipelineOperator { + + /** {@code #define TOL 1e-8} on {@code hypot(dif.x, dif.y)}. */ + private static final double TOL = 1e-8; + + /** {@code #define MAX_ITERATIONS 10}. */ + private static final int MAX_ITERATIONS = 10; + + private final CartConversion cart; + private final HorizontalGrids hgrids; + private final List vgrids; + private final double dt; + private final double tEpoch; + private final String description; + + /** + * @param registry resolves {@code +ellps=} + * @param params the step's fully expanded parameter list + */ + DeformationOperator(final Registry registry, final ProjParams params) { + final boolean hasXy = params.has("xy_grids"); + final boolean hasZ = params.has("z_grids"); + final boolean hasGrids = params.has("grids"); + + // deformation.cpp:352-357. Note the shape of the test: +grids alone is enough, + // otherwise BOTH of the pair are required. + if (!hasGrids && (!hasXy || !hasZ)) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "Either +grids or (+xy_grids and +z_grids) should be specified."); + } + if (hasGrids) { + throw new PipelineDefinitionException(PipelineErrorCode.NOT_IMPLEMENTED_HERE, + "+proj=deformation +grids=" + params.value("grids") + + ": the single-file form is a three-channel Geodetic TIFF Grid, and " + + "proj4j has no GeoTIFF grid reader. Use the historical " + + "+xy_grids= (CTable2/NTv1/NTv2) and +z_grids= (GTX) pair."); + } + + this.hgrids = HorizontalGrids.open(params.value("xy_grids"), "xy_grids"); + this.vgrids = openVerticalGrids(params.value("z_grids")); + + // deformation.cpp:394-411. HUGE_VAL is the "unset" sentinel for both, and + // exactly one of them must end up set. + final boolean hasDt = params.has("dt"); + final boolean hasTEpoch = params.has("t_epoch"); + if (params.has("t_obs")) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "+t_obs parameter is deprecated. Use +dt instead."); + } + if (!hasDt && !hasTEpoch) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "either +dt or +t_epoch needs to be set."); + } + if (hasDt && hasTEpoch) { + throw new PipelineDefinitionException(PipelineErrorCode.MUTUALLY_EXCLUSIVE_ARGS, + "+dt or +t_epoch are mutually exclusive."); + } + this.dt = hasDt ? params.doubleValue("dt", Double.NaN) : Double.POSITIVE_INFINITY; + this.tEpoch = hasTEpoch ? params.doubleValue("t_epoch", Double.NaN) + : Double.POSITIVE_INFINITY; + + final double[] ellipsoid = StepEllipsoid.resolve(registry, params); + this.cart = new CartConversion(ellipsoid[0], ellipsoid[1]); + + this.description = "deformation xy_grids=" + params.value("xy_grids") + + " z_grids=" + params.value("z_grids") + + (hasDt ? " dt=" + dt : " t_epoch=" + tEpoch); + } + + /** + * {@code pj_vgrid_init} ({@code grids.cpp:3753}) — same {@code @}-optional rule as + * the horizontal list, and the same refusal for a required grid that is absent. + */ + private static List openVerticalGrids(final String spec) { + if (spec == null || spec.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "+z_grids parameter missing."); + } + try { + return Collections.unmodifiableList( + new ArrayList(VerticalGrid.fromGeoidGrids(spec))); + } catch (final IOException e) { + throw new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "+z_grids=" + spec + ": could not find requested z_grid(s): " + + e.getMessage(), e); + } + } + + /** {@code P->left = PJ_IO_UNITS_CARTESIAN} ({@code deformation.cpp:420}). */ + @Override + public GieIoUnits declaredLeft() { + return GieIoUnits.CARTESIAN; + } + + /** {@code P->right = PJ_IO_UNITS_CARTESIAN} ({@code deformation.cpp:421}). */ + @Override + public GieIoUnits declaredRight() { + return GieIoUnits.CARTESIAN; + } + + /** Never called: neither declared side is {@link GieIoUnits#WHATEVER}. */ + @Override + public void overrideUnits(final GieIoUnits left, final GieIoUnits right) { + // no-op, deliberately + } + + /** {@code pj_deformation_forward_4d}. */ + @Override + public void forward(final double[] coord) { + final double interval = interval(coord[3]); + final double[] shift = gridShift(coord[0], coord[1], coord[2]); + coord[0] += interval * shift[0]; + coord[1] += interval * shift[1]; + coord[2] += interval * shift[2]; + } + + /** {@code pj_deformation_reverse_4d}. */ + @Override + public void inverse(final double[] coord) { + final double interval = interval(coord[3]); + reverseShift(coord, interval); + } + + /** + * {@code pj_deformation_forward_4d:262-273}. With {@code +dt} the coordinate's + * epoch is never read at all; with {@code +t_epoch} a {@code HUGE_VAL} epoch is + * {@code PROJ_ERR_COORD_TRANSFM_MISSING_TIME}. + */ + private double interval(final double t) { + if (!Double.isInfinite(dt)) { + return dt; + } + if (Double.isInfinite(t) || Double.isNaN(t)) { + throw new CrsTransformException(ErrorCause.MISSING_TIME, + "+proj=deformation +t_epoch=" + tEpoch + " needs the coordinate's own epoch, " + + "and this coordinate has none"); + } + return t - tEpoch; + } + + /** + * {@code pj_deformation_get_grid_shift} ({@code deformation.cpp:139-196}): the ENU + * velocity triple at this position, rotated into the cartesian frame, in metres per + * year. + * + *

Upstream calls {@code proj_errno_restore} at the end, which discards an + * {@code OUTSIDE_GRID} raised by the grid read and leaves the caller to notice that + * the returned components are {@code HUGE_VAL}. Since the ENU-to-cartesian rotation + * mixes {@code +HUGE_VAL} and {@code -HUGE_VAL}, what actually reaches the caller is + * a mixture of infinities and {@code NaN}, and upstream's + * {@code if (shift.x == HUGE_VAL)} test does not reliably catch it — the coordinate + * comes out {@code NaN}. Both PROJ and proj4j therefore report a failure for such a + * row (upstream by producing a non-finite coordinate, which is what + * {@code deformation.gie}'s two {@code expect failure errno + * coord_transfm_outside_grid} rows assert); the difference is only that proj4j says + * which grid and where, and that a finite input can never leave here as a plausible + * coordinate. + * + * @return {@code {DX, DY, DZ}} in metres per year + */ + private double[] gridShift(final double x, final double y, final double z) { + final double[] geodetic = {x, y, z, 0.0}; + cart.inverse(geodetic); + final double lam = geodetic[0]; + final double phi = geodetic[1]; + + final double[] hv = hgrids.value(lam, phi); + final double up = verticalValue(lam, phi); + + // "grid values are stored as mm/yr, we need m/yr" + final double e = hv[0] / 1000.0; + final double n = hv[1] / 1000.0; + final double u = up / 1000.0; + + final double sp = Math.sin(phi); + final double cp = Math.cos(phi); + final double sl = Math.sin(lam); + final double cl = Math.cos(lam); + + // ENU -> PJ_XYZ, per Noerbech et al. 2003 as cited by deformation.cpp:180-188. + return new double[] { + -sp * cl * n - sl * e + cp * cl * u, + -sp * sl * n + cl * e + cp * sl * u, + cp * n + sp * u, + }; + } + + /** {@code pj_vgrid_value(P, Q->vgrids, lp, 1.0)} — multiplier 1, not vgridshift's -1. */ + private double verticalValue(final double lam, final double phi) { + if (vgrids.isEmpty()) { + return 0.0; + } + if (Double.isNaN(lam) || Double.isNaN(phi)) { + return Double.NaN; + } + for (int i = 0; i < vgrids.size(); i++) { + final VerticalGrid grid = vgrids.get(i); + if (!grid.covers(lam, phi)) { + continue; + } + final double value = grid.valueAt(lam, phi, 1.0); + if (Double.isNaN(value)) { + throw new CrsTransformException(ErrorCause.GRID_NODATA, + "every node surrounding (" + Math.toDegrees(lam) + ", " + + Math.toDegrees(phi) + ") in +z_grids grid " + + grid.getGridName() + " is nodata"); + } + return value; + } + throw new CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID, + "(" + Math.toDegrees(lam) + ", " + Math.toDegrees(phi) + + ") is outside every grid of +z_grids"); + } + + /** + * {@code pj_deformation_reverse_shift} ({@code deformation.cpp:199-241}), verbatim. + * + * @param coord {@code {X, Y, Z, t}}, mutated in place + * @param interval the signed number of years + */ + private void reverseShift(final double[] coord, final double interval) { + final double inputX = coord[0]; + final double inputY = coord[1]; + final double inputZ = coord[2]; + + double[] delta = gridShift(inputX, inputY, inputZ); + final double z0 = delta[2]; + + double outX = inputX - interval * delta[0]; + double outY = inputY - interval * delta[1]; + double outZ = inputZ + interval * delta[2]; + + int i = MAX_ITERATIONS; + double difX; + double difY; + double difZ; + do { + delta = gridShift(outX, outY, outZ); + + difX = outX + interval * delta[0] - inputX; + difY = outY + interval * delta[1] - inputY; + difZ = outZ - interval * delta[2] - inputZ; + outX += difX; + outY += difY; + outZ += difZ; + } while (--i > 0 && Math.hypot(difX, difY) > TOL); + + // Upstream's overwrite: the iterated z is discarded and replaced with the + // one-step value from the FIRST grid evaluation. Deliberate, and load bearing + // for every expected value in deformation.gie. + coord[0] = outX; + coord[1] = outY; + coord[2] = inputZ - interval * z0; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return description; + } + + @Override + public String toString() { + return "DeformationOperator[" + description + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/HGridShiftOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/HGridShiftOperator.java new file mode 100644 index 0000000..b17656a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/HGridShiftOperator.java @@ -0,0 +1,136 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=hgridshift} — a horizontal grid shift, ported from + * {@code 9.8.1:src/transformations/hgridshift.cpp}. The sibling of + * {@link org.locationtech.proj4j.vertical.VGridShiftOperator}. + * + *

What this is for

+ * + *

This is the step PROJ hides behind {@code +nadgrids=}. + * {@code cs2cs_emulation_setup} ({@code 9.8.1:src/create.cpp:107-124}) builds + *

{@code break_cs2cs_recursion proj=hgridshift grids=}
+ * and stores it as {@code P->hgridshift}; the forward pass invokes it as part of the + * datum shift, and — the detail that catches people — {@code +nadgrids} suppresses + * the {@code +towgs84} Helmert entirely, because {@code pj_datum_set}'s + * {@code towgs84} branch is an {@code else if}. + * + *

Direction, which is the opposite of what the name suggests

+ * + *

{@code pj_hgridshift_forward_3d} calls {@code pj_hgrid_apply(..., PJ_FWD)}, and + * {@code PJ_FWD} is the closed-form direction: interpolate once at the input + * position and add. It is the inverse that iterates, because the shift is + * defined at the source coordinates and solving for them is a fixed-point problem. + * {@link org.locationtech.proj4j.datum.Grid#shift} already implements both halves, + * including the 10-iteration limit and the "presumably at grid edge, using first + * approximation" fallback that upstream documents. + * + *

An empty grid list is not an error

+ * + *

{@code pj_hgridshift_forward_3d} guards with {@code if (!Q->grids.empty())} and + * "just pass the coordinate through unchanged" otherwise — reachable whenever every + * {@code +grids=} token carried the {@code @} optional prefix and none resolved. + * A missing required grid, by contrast, is + * {@code PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID} raised at construction: + * a grid that cannot be found must never become a per-row no-op that reports success. + * + *

{@code +t_epoch} / {@code +t_final}

+ * + *

Handled by {@link TimeGatedOperator}, which wraps this class rather than being + * folded into it, because the bracket is character-for-character the same in + * {@code vgridshift} and upstream's own comment asks for it to be shared. + * + *

Immutable after construction; safe to share. + * + * @since 1.5 + */ +final class HGridShiftOperator implements PipelineOperator { + + private final HorizontalGrids grids; + + private HGridShiftOperator(final HorizontalGrids grids) { + this.grids = grids; + } + + /** + * Build the operator, resolving {@code +grids=} through the deterministic + * resolver chain. + * + * @param gridSpec a comma-separated grid list, {@code @}-prefixed entries optional + * @return the operator; never {@code null} + * @throws PipelineDefinitionException {@code MISSING_ARG} when {@code gridSpec} is + * absent, {@code FILE_NOT_FOUND_OR_INVALID} + * when a required grid cannot be resolved + */ + static HGridShiftOperator fromGrids(final String gridSpec) { + return new HGridShiftOperator(HorizontalGrids.open(gridSpec, "grids")); + } + + /** @return the {@code +grids=} list as written. */ + String gridSpec() { + return grids.spec(); + } + + /** {@code P->left = PJ_IO_UNITS_RADIANS} ({@code hgridshift.cpp:154}). */ + @Override + public GieIoUnits declaredLeft() { + return GieIoUnits.RADIANS; + } + + /** {@code P->right = PJ_IO_UNITS_RADIANS} ({@code hgridshift.cpp:155}). */ + @Override + public GieIoUnits declaredRight() { + return GieIoUnits.RADIANS; + } + + /** Never called: neither declared side is {@link GieIoUnits#WHATEVER}. */ + @Override + public void overrideUnits(final GieIoUnits left, final GieIoUnits right) { + // no-op, deliberately + } + + /** {@code pj_hgrid_apply(..., PJ_FWD)}: interpolate once and add. */ + @Override + public void forward(final double[] coord) { + grids.apply(coord, false); + } + + /** {@code pj_hgrid_apply(..., PJ_INV)}: iterate to the fixed point. */ + @Override + public void inverse(final double[] coord) { + grids.apply(coord, true); + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return "hgridshift grids=" + grids.spec(); + } + + @Override + public String toString() { + return "HGridShiftOperator[" + description() + ", " + grids.grids().size() + + " grid(s) resolved]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/HelmertConversion.java b/core/src/main/java/org/locationtech/proj4j/pipeline/HelmertConversion.java new file mode 100644 index 0000000..b8443e4 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/HelmertConversion.java @@ -0,0 +1,170 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +/** + * The 3- or 7-parameter Helmert transformation PROJ builds behind a + * {@code +towgs84}, i.e. {@code +proj=helmert +exact +convention=position_vector} + * ({@code 9.8.1:src/create.cpp:145-156}, {@code src/transformations/helmert.cpp}). + * + *

Two things here are easy to get wrong

+ * + *

{@code +exact}. The cs2cs-emulation helper is built with {@code exact}, + * so the rotation matrix is the full trigonometric one, not the linearised + * small-angle approximation that {@code datum.Datum.transformFromGeocentricToWgs84} + * uses. For the rotation magnitudes in the EPSG init file the two differ by well + * under a millimetre, so this is not why GIGS passes or fails — but it is a real + * difference, and reproducing upstream costs three cosines. + * + *

{@code position_vector}. PROJ derives the matrix in the + * coordinate frame convention and then transposes it, and hard-errors if a + * {@code +towgs84} is combined with anything else + * ({@code helmert.cpp:540-549}: "towgs84 should only be used with + * convention=position_vector"). Getting the convention backwards flips the sign of + * every rotation, which is invisible at the equator and on the prime meridian — + * precisely the region test fixtures tend to live in. + * + *

Parameter representation

+ * + *

The array handed in is PROJ's {@code P->datum_params} after + * {@code pj_datum_set} has normalised it: translations in metres, rotations in + * radians, and element 6 holding {@code 1 + s/1e6} rather than {@code s} in + * ppm. That is also exactly what proj4j's {@code datum.Datum} stores, so a + * {@code +datum=} lookup and a {@code +towgs84=} parse can share one path. + * + *

Immutable and thread-safe. + */ +final class HelmertConversion { + + private final double tx; + private final double ty; + private final double tz; + private final double scale; + private final boolean pureTranslation; + private final double r00; + private final double r01; + private final double r02; + private final double r10; + private final double r11; + private final double r12; + private final double r20; + private final double r21; + private final double r22; + + /** + * @param datumParams 3 or 7 elements in {@code pj_datum_set} form: {@code dx, dy, dz} + * in metres, then {@code rx, ry, rz} in radians and + * {@code 1 + s/1e6} + */ + HelmertConversion(final double[] datumParams) { + this.tx = datumParams[0]; + this.ty = datumParams[1]; + this.tz = datumParams[2]; + + final double rx = datumParams.length > 3 ? datumParams[3] : 0.0; + final double ry = datumParams.length > 4 ? datumParams[4] : 0.0; + final double rz = datumParams.length > 5 ? datumParams[5] : 0.0; + + // helmert.cpp:597-601 undoes pj_datum_set's conversion to absolute scale, + // then :423 redoes it. Reproduced literally so the rounding matches. + final double absoluteScale = datumParams.length > 6 ? datumParams[6] : 0.0; + final double scalePpm = absoluteScale == 0.0 ? 0.0 : (absoluteScale - 1.0) * 1e6; + + final boolean noRotation = rx == 0 && ry == 0 && rz == 0; + // helmert_forward_3d:388 - "no_rotation && scale == 0" takes the fast path, + // where scale is the ppm value, not the multiplier. + this.pureTranslation = noRotation && scalePpm == 0.0; + this.scale = 1.0 + scalePpm * 1e-6; + + // build_rot_matrix, exact branch, in the coordinate-frame convention. + final double cf = Math.cos(rx); + final double sf = Math.sin(rx); + final double ct = Math.cos(ry); + final double st = Math.sin(ry); + final double cp = Math.cos(rz); + final double sp = Math.sin(rz); + + final double m00 = ct * cp; + final double m01 = cf * sp + sf * st * cp; + final double m02 = sf * sp - cf * st * cp; + final double m10 = -ct * sp; + final double m11 = cf * cp - sf * st * sp; + final double m12 = sf * cp + cf * st * sp; + final double m20 = st; + final double m21 = -sf * ct; + final double m22 = cf * ct; + + // ...then transposed, which is what convention=position_vector means. + this.r00 = m00; + this.r01 = m10; + this.r02 = m20; + this.r10 = m01; + this.r11 = m11; + this.r12 = m21; + this.r20 = m02; + this.r21 = m12; + this.r22 = m22; + } + + /** + * {@code helmert_forward_3d} ({@code helmert.cpp:370-416}): local frame to WGS84. + * + * @param coord {@code {X, Y, Z, t}} in metres, mutated in place + */ + void forward(final double[] coord) { + final double x = coord[0]; + final double y = coord[1]; + final double z = coord[2]; + if (pureTranslation) { + coord[0] = x + tx; + coord[1] = y + ty; + coord[2] = z + tz; + return; + } + coord[0] = scale * (r00 * x + r01 * y + r02 * z) + tx; + coord[1] = scale * (r10 * x + r11 * y + r12 * z) + ty; + coord[2] = scale * (r20 * x + r21 * y + r22 * z) + tz; + } + + /** + * {@code helmert_reverse_3d} ({@code helmert.cpp:419-436}): WGS84 to local frame. + * + *

Note this is not the algebraic inverse of {@link #forward} in + * general — upstream unscales and de-offsets, then rotates by the transpose, + * which for a non-orthogonal linearised matrix would differ. With + * {@code +exact} the matrix is orthogonal and the two agree; the ordering is + * kept as upstream writes it regardless. + * + * @param coord {@code {X, Y, Z, t}} in metres, mutated in place + */ + void inverse(final double[] coord) { + final double x = coord[0]; + final double y = coord[1]; + final double z = coord[2]; + if (pureTranslation) { + coord[0] = x - tx; + coord[1] = y - ty; + coord[2] = z - tz; + return; + } + final double dx = (x - tx) / scale; + final double dy = (y - ty) / scale; + final double dz = (z - tz) / scale; + coord[0] = r00 * dx + r10 * dy + r20 * dz; + coord[1] = r01 * dx + r11 * dy + r21 * dz; + coord[2] = r02 * dx + r12 * dy + r22 * dz; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/HorizontalGrids.java b/core/src/main/java/org/locationtech/proj4j/pipeline/HorizontalGrids.java new file mode 100644 index 0000000..bc28919 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/HorizontalGrids.java @@ -0,0 +1,261 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; + +/** + * A resolved {@code +grids=} / {@code +xy_grids=} list, plus the two things PROJ + * does with one: {@code pj_hgrid_apply} and {@code pj_hgrid_value} + * ({@code 9.8.1:src/grids.cpp:3401-3588}). + * + *

The two operations are not the same, and the difference is a sign

+ * + *

Both walk the same grid list and both bilinearly interpolate the same two + * channels, but they pass a different {@code compensateNTConvention} to + * {@code valueAt}: + * + *

    + *
  • {@code pj_hgrid_apply} ({@code compensateNTConvention = true}) is the + * datum shift. It negates the stored longitude offset — the NTv1/NTv2/CTable2 + * formats all store longitude positive west — and adds the result to + * the coordinate. The inverse direction iterates, because a grid shift has no + * closed-form inverse.
  • + *
  • {@code pj_hgrid_value} ({@code compensateNTConvention = false}) is a + * plain table read, used by {@code +proj=deformation} to fetch an east/north + * velocity pair out of a grid whose two channels are not longitude and latitude + * offsets at all. It must not negate, or every east velocity would come + * back with the wrong sign.
  • + *
+ * + *

How {@code pj_hgrid_value} is obtained here

+ * + *

{@link Grid#shift} is proj4j's port of {@code pj_hgrid_apply}, including the + * subgrid descent and the iterative inverse, and it is exercised by the whole + * {@code +nadgrids} population of the corpus. What it does not expose is the + * interpolated offset pair, because {@code Grid.ConversionTable} is reachable only + * from {@code org.locationtech.proj4j.datum}. + * + *

So the pair is recovered from the forward shift algebraically. For the raw, + * un-negated interpolated offsets {@code (dlam, dphi)}, {@code Grid.shift}'s forward + * branch computes + * + *

{@code out.lam = in.lam - dlam},   {@code out.phi = in.phi + dphi}
+ * + *

({@code Grid.nad_cvt}'s {@code else} branch), so + * {@code dlam = in.lam - out.lam} and {@code dphi = out.phi - in.phi} — which is + * exactly {@code compensateNTConvention = false}. This is exact arithmetic for + * {@code dphi} and loses at most one rounding of {@code in.lam} for {@code dlam}; + * on the corpus's alaska grid that is about 2e-16 rad, i.e. 1.6 nm on the ground, + * against a 0.1 mm tolerance. + * + *

The recovery is only valid once the point is known to be inside a grid, + * because {@code Grid.shift} leaves the coordinate untouched when no table covers it + * — which the subtraction would report as an offset of exactly zero. That is the + * shape of the worst defect this project has on record: a failure delivered as a + * plausible coordinate. So {@link #covers} is asked first, and a point no + * grid covers throws {@link ErrorCause#COORDINATE_OUTSIDE_GRID}. + * + *

One deliberate, reported deviation

+ * + *

PROJ's {@code findGrid} accepts a point up to + * {@code (resX + resY) * REL_TOLERANCE_HGRIDSHIFT} outside a grid's declared extent, + * and {@code Grid.shift}'s own skip test uses the equivalent + * {@code (|del.lam| + |del.phi|) / 10000}. {@link #covers} cannot reproduce either, + * because the cell size is not reachable from this package — + * {@link Grid#extentRadians()} gives the corners but not the resolution. Containment + * is therefore tested exactly. The consequence is narrow and stated rather than + * hidden: a point within one ten-thousandth of a cell outside a grid edge is + * refused here where PROJ would interpolate it. Reproducing PROJ exactly needs a + * public accessor for {@code Grid.ConversionTable} — see the class comment's note in + * the report. + * + *

Immutable after construction; {@link #apply} and {@link #value} keep all state + * in locals, so one instance is safe to share. + * + * @since 1.5 + */ +final class HorizontalGrids { + + private final String spec; + private final List grids; + + private HorizontalGrids(final String spec, final List grids) { + this.spec = spec; + this.grids = grids; + } + + /** + * {@code pj_hgrid_init} ({@code grids.cpp:3294}) followed by upstream's own + * error handling: a token that fails to resolve is fatal unless it carries + * the {@code @} optional prefix, in which case + * {@code getListOfGridSets} clears the errno and carries on. Both halves are + * {@link Grid#fromNadGrids}'s behaviour already. + * + *

An empty resulting list is not an error: every operator that takes + * a grid list guards with {@code if (!grids.empty())} and passes the coordinate + * through unchanged otherwise. That is reachable whenever every token was + * {@code @}-optional and absent. + * + * @param spec the comma-separated list as written + * @param key the parameter name, for the error message + * @return the resolved list, possibly empty + * @throws PipelineDefinitionException {@code FILE_NOT_FOUND} if a required grid is + * missing, unreadable or in a format proj4j + * cannot parse + */ + static HorizontalGrids open(final String spec, final String key) { + if (spec == null || spec.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "+" + key + " parameter missing."); + } + final List resolved; + try { + resolved = Grid.fromNadGrids(spec); + } catch (final IOException e) { + throw new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "+" + key + "=" + spec + ": could not find required grid(s): " + + e.getMessage(), e); + } + return new HorizontalGrids(spec, + Collections.unmodifiableList(new ArrayList(resolved))); + } + + /** @return whether no grid resolved at all, in which case every operation is the identity. */ + boolean isEmpty() { + return grids.isEmpty(); + } + + /** @return the {@code +grids=} list as written. */ + String spec() { + return spec; + } + + /** @return the resolved grids, in list order; unmodifiable. */ + List grids() { + return grids; + } + + /** + * {@code findGrid} ({@code grids.cpp:3252-3263}), reduced to the question + * {@code pj_hgrid_apply} and {@code pj_hgrid_value} both ask before doing + * anything: is there a grid here at all? + * + *

Only the top-level grids are tested. A subgrid's extent is contained in its + * parent's by construction in every format proj4j reads, so a point inside a + * subgrid is inside its parent, and the descent to the finest covering subgrid is + * {@link Grid#shift}'s job. + * + * @param lam longitude, radians + * @param phi latitude, radians + * @return whether some grid's extent contains the point + */ + boolean covers(final double lam, final double phi) { + if (Double.isNaN(lam) || Double.isNaN(phi)) { + return false; + } + for (int i = 0; i < grids.size(); i++) { + final double[] e = grids.get(i).extentRadians(); + if (Double.isNaN(e[0])) { + // A null grid ("+nadgrids=null"): it shifts nothing but it does cover + // everything, exactly as PROJ's isNullGrid() branch returns the input. + return true; + } + if (lam >= e[0] && lam <= e[2] && phi >= e[1] && phi <= e[3]) { + return true; + } + } + return false; + } + + /** + * {@code pj_hgrid_apply} ({@code grids.cpp:3508}): the datum shift itself, + * applied in place to {@code coord[0]} and {@code coord[1]}. + * + * @param coord {@code {lam, phi, z, t}} in radians; only the first two change + * @param inverse {@code PJ_INV} rather than {@code PJ_FWD}, i.e. iterate + * @throws CrsTransformException {@link ErrorCause#COORDINATE_OUTSIDE_GRID} when no + * grid covers the point + */ + void apply(final double[] coord, final boolean inverse) { + if (grids.isEmpty()) { + return; + } + if (!isFinite(coord[0]) || !isFinite(coord[1])) { + // grids.cpp:3413 - "if (in.lam == HUGE_VAL) return in". A non-finite + // horizontal position has no grid cell; the non-finiteness travels rather + // than becoming an exception, so that a NaN in gives a NaN out as a result. + return; + } + if (!covers(coord[0], coord[1])) { + throw outsideGrid(coord[0], coord[1]); + } + final ProjCoordinate pc = new ProjCoordinate(coord[0], coord[1]); + Grid.shift(grids, inverse, pc); + coord[0] = pc.x; + coord[1] = pc.y; + } + + /** + * {@code pj_hgrid_value} ({@code grids.cpp:3545}): the interpolated offset pair, + * not negated for the positive-west convention. See the class comment for + * how it is recovered. + * + * @param lam longitude, radians + * @param phi latitude, radians + * @return {@code {dlam, dphi}} in the grid's own stored units — radians for a + * datum grid, millimetres per year for a velocity grid + * @throws CrsTransformException {@link ErrorCause#COORDINATE_OUTSIDE_GRID} when no + * grid covers the point + */ + double[] value(final double lam, final double phi) { + if (grids.isEmpty()) { + return new double[] {0.0, 0.0}; + } + if (Double.isNaN(lam) || Double.isNaN(phi)) { + return new double[] {Double.NaN, Double.NaN}; + } + if (!covers(lam, phi)) { + throw outsideGrid(lam, phi); + } + final ProjCoordinate pc = new ProjCoordinate(lam, phi); + Grid.shift(grids, false, pc); + return new double[] {lam - pc.x, pc.y - phi}; + } + + private CrsTransformException outsideGrid(final double lam, final double phi) { + return new CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID, + "(" + Math.toDegrees(lam) + ", " + Math.toDegrees(phi) + + ") is outside every grid of +grids=" + spec); + } + + private static boolean isFinite(final double v) { + return !Double.isNaN(v) && !Double.isInfinite(v); + } + + @Override + public String toString() { + return "HorizontalGrids[" + spec + ", " + grids.size() + " resolved]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/InitFileExpander.java b/core/src/main/java/org/locationtech/proj4j/pipeline/InitFileExpander.java new file mode 100644 index 0000000..dd35430 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/InitFileExpander.java @@ -0,0 +1,168 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.io.Proj4FileReader; + +/** + * {@code +init=:

} expansion under + * {@code proj_context_use_proj4_init_rules(ctx, 1)}. + * + *

What "proj4 init rules" actually means

+ * + *

Two entirely different things can happen to {@code +init=epsg:27572}. With the + * modern rules PROJ resolves the code through {@code proj.db}, builds an ISO 19111 + * CRS, and takes axis order and units from the authority. With + * {@code use_proj4_init_rules} it reads the section verbatim out of the + * {@code epsg} init file and hands the tokens straight to + * {@code pj_init} — so axis order, units, prime meridian and datum shift all come + * from the init string and nothing else looks at the authority + * ({@code 9.8.1:src/init.cpp:210-315}). + * + *

Every GIGS file opens with {@code use_proj4_init_rules true}, and the legacy + * semantics are the point of the test: {@code 2049} carries {@code +axis=wsu}, + * {@code 4807} and {@code 27572} carry {@code +pm=paris}, {@code 2921} uses + * {@code +units=ft} where {@code 3568} uses {@code +units=us-ft}, {@code 3376} puts + * {@code +no_uoff} on an {@code omerc}. None of that survives an authority lookup. + * + *

This class therefore implements only the file path, which is also the only + * path proj4j can implement: there is no {@code proj.db} here. It reads through the + * existing {@link Proj4FileReader} rather than re-tokenising the init files, so + * there is exactly one parser for them. + * + *

Appended, never inserted

+ * + *

{@code pj_expand_init_internal} ({@code init.cpp:352-397}) appends the + * expansion to the end of the parameter list and leaves the + * {@code init=} token in place. Combined with first-match-wins that makes the + * expansion the lowest-precedence source, so + * {@code +init=foo:bar +ellps=intl} overrides the {@code +ellps} the section + * declares. {@link PipelineFactory} relies on this for + * {@code +proj=pipeline +towgs84=0,0,0}, which is how {@code gigs/5103.1}, + * {@code 5111.1} and {@code 5112} switch off a double datum shift. + * + *

Expansions are cached per key, as {@code pj_search_initcache} caches them; + * without it a 20-file GIGS sweep re-tokenises the 1 MB {@code epsg} file over a + * hundred times. + * + *

Failures here are bad parameter values, not missing grids

+ * + *

Every rejection in this class is + * {@link PipelineErrorCode#INVALID_INIT_KEY} — {@code errno 1027}, cause + * {@link org.locationtech.proj4j.ErrorCause#INVALID_PARAM_VALUE}. That matches + * {@code get_init_string} ({@code init.cpp:105,119,134}), which sets + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} for a missing colon, an init file it + * cannot open, and a section it cannot find alike. It is deliberately not + * {@link PipelineErrorCode#FILE_NOT_FOUND_OR_INVALID}, which is reserved for grid and + * model files the operation needs and carries + * {@link org.locationtech.proj4j.ErrorCause#MISSING_GRID}: one enum constant used to + * serve both, so a caller catching an unreadable grid was told its CRS parameter value + * was invalid. + * + *

Thread-safe: the cache is synchronised and the cached lists are unmodifiable. + */ +final class InitFileExpander { + + private final Proj4FileReader reader = new Proj4FileReader(); + + private final Map> cache = new HashMap>(); + + /** + * Expand one {@code init=} token. + * + * @param token the token as it appears in the parameter list, either + * {@code "init=epsg:27572"} or bare {@code "epsg:27572"} + * @return the section's tokens, without {@code '+'} prefixes; never + * {@code null} and never empty + * @throws PipelineDefinitionException if the file or section does not exist + */ + List expand(final String token) { + final String key = stripInitPrefix(token); + synchronized (cache) { + final List cached = cache.get(key); + if (cached != null) { + return cached; + } + } + final int colon = key.indexOf(':'); + if (colon <= 0 || colon == key.length() - 1) { + throw new PipelineDefinitionException(PipelineErrorCode.INVALID_INIT_KEY, + "+init=" + key + " is not of the form :

"); + } + final String file = key.substring(0, colon); + final String section = key.substring(colon + 1); + + final String[] params; + try { + params = reader.readParametersFromFile(file, section); + } catch (final IOException e) { + throw new PipelineDefinitionException(PipelineErrorCode.INVALID_INIT_KEY, + "+init=" + key + ": could not read the init file", e); + } catch (final IllegalStateException e) { + // Proj4FileReader signals a missing resource this way. + throw new PipelineDefinitionException(PipelineErrorCode.INVALID_INIT_KEY, + "+init=" + key + ": no init file \"" + file + "\" on the classpath. The EPSG " + + "init dictionary ships in the separate proj4j-epsg artifact.", e); + } + if (params == null || params.length == 0) { + throw new PipelineDefinitionException(PipelineErrorCode.INVALID_INIT_KEY, + "+init=" + key + ": no section <" + section + "> in init file \"" + file + "\""); + } + + final List tokens = normalise(params); + synchronized (cache) { + cache.put(key, tokens); + } + return tokens; + } + + /** + * {@code get_init}'s key handling ({@code init.cpp:220-227}): accept + * {@code init=file:section}, {@code +init=file:section} and a bare + * {@code file:section}, keeping everything after the first + * {@code "init="}. + */ + private static String stripInitPrefix(final String token) { + final int at = token.indexOf("init="); + return at < 0 ? token : token.substring(at + 5); + } + + /** Strip the {@code '+'} prefixes {@code Proj4FileReader} adds back. */ + private static List normalise(final String[] params) { + final String[] out = new String[params.length]; + int n = 0; + for (int i = 0; i < params.length; i++) { + String token = params[i]; + if (token == null) { + continue; + } + while (token.startsWith("+")) { + token = token.substring(1); + } + if (!token.isEmpty()) { + out[n++] = token; + } + } + return Collections.unmodifiableList(Arrays.asList(Arrays.copyOf(out, n))); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/Pipeline.java b/core/src/main/java/org/locationtech/proj4j/pipeline/Pipeline.java new file mode 100644 index 0000000..7b51dcf --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/Pipeline.java @@ -0,0 +1,186 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.util.Collections; +import java.util.List; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * An assembled {@code +proj=pipeline}: an ordered list of {@link PipelineStep}s run + * left to right forwards and right to left in reverse. + * + *

The i/o units, and why they are not the first step's and the last step's

+ * + *

{@code pipeline.cpp:631-636} sets + * {@code P->left = pj_left(steps.front())} and + * {@code P->right = pj_right(steps.back())} — note {@code pj_left} and + * {@code pj_right}, which fold {@code CLASSIC} to {@code PROJECTED} and swap the + * two sides of any step carrying {@code +inv}. Getting this wrong does not produce + * an error; it produces a silently wrong distance, because the gie + * comparator picks between a Euclidean metric and a geodesic one on exactly this + * value, and the two differ by a factor of about 111,319 at one degree. + * + *

{@code gigs/5102.2.gie} is the case that proves the machinery: its reverse + * pipeline ends {@code +step +proj=unitconvert +xy_in=rad +xy_out=grad}, and + * {@code grad} normalises to neither {@code "Radian"} nor {@code "Degree"}, so the + * right-hand side stays {@link GieIoUnits#WHATEVER} and the comparator measures the + * Euclidean distance between two coordinates expressed in grads against a + * tolerance written in metres. That is upstream's behaviour and must be reproduced, + * not corrected. + * + *

The geodesic ellipsoid

+ * + *

A pipeline with no global {@code +ellps} defaults to GRS80 + * ({@code pipeline.cpp:316-354}) where a bare operation defaults to WGS84 + * ({@code init.cpp:576-581}). That default only feeds {@code P->geod}, i.e. the + * geodesic the comparator measures with, so it is reported through + * {@link #globalEllipsoidA()}/{@link #globalEllipsoidF()} rather than used here. + * + *

Not thread-safe: the steps wrap mutable proj4j {@code Projection} instances. + * Build one per thread. + * + * @since 1.5 + */ +public final class Pipeline { + + /** {@code set_ellipsoid}'s fallback ({@code pipeline.cpp:338-340}). */ + public static final double GRS80_A = 6378137.0; + + /** {@code set_ellipsoid}'s fallback flattening. */ + public static final double GRS80_F = 1.0 / 298.257222101; + + private final String definition; + private final List steps; + private final GieIoUnits left; + private final GieIoUnits right; + private final boolean invertible; + private final double globalA; + private final double globalF; + + Pipeline(final String definition, final List steps, + final double globalA, final double globalF) { + this.definition = definition; + this.steps = Collections.unmodifiableList(steps); + this.left = steps.get(0).left(); + this.right = steps.get(steps.size() - 1).right(); + this.globalA = globalA; + this.globalF = globalF; + boolean canReverse = true; + for (int i = 0; i < steps.size(); i++) { + if (!steps.get(i).canRunReverse()) { + canReverse = false; + break; + } + } + this.invertible = canReverse; + } + + /** @return the definition this pipeline was built from. */ + public String definition() { + return definition; + } + + /** @return the steps in order; unmodifiable, never empty. */ + public List steps() { + return steps; + } + + /** @return {@code P->left} = {@code pj_left(first step)}, already folded. */ + public GieIoUnits left() { + return left; + } + + /** @return {@code P->right} = {@code pj_right(last step)}, already folded. */ + public GieIoUnits right() { + return right; + } + + /** + * @return {@code false} when at least one step has no usable inverse, which + * makes the whole pipeline one-way ({@code pipeline.cpp:556-568}). + */ + public boolean isInvertible() { + return invertible; + } + + /** @return the semi-major axis of the pipeline's global ellipsoid, GRS80 by default. */ + public double globalEllipsoidA() { + return globalA; + } + + /** @return the flattening of the pipeline's global ellipsoid, GRS80 by default. */ + public double globalEllipsoidF() { + return globalF; + } + + /** + * Run every step forward, in order. + * + * @param coord {@code {x, y, z, t}}; shorter arrays are rejected + * @return a fresh four-element array + * @throws org.locationtech.proj4j.Proj4jException if any step refuses the coordinate + */ + public double[] forward(final double[] coord) { + final double[] c = copyOf(coord); + for (int i = 0; i < steps.size(); i++) { + steps.get(i).runForward(c); + } + return c; + } + + /** + * Run every step in reverse, from the last to the first. + * + * @param coord {@code {x, y, z, t}}; shorter arrays are rejected + * @return a fresh four-element array + * @throws org.locationtech.proj4j.Proj4jException if any step refuses the coordinate + */ + public double[] inverse(final double[] coord) { + if (!invertible) { + throw new PipelineDefinitionException(PipelineErrorCode.NO_INVERSE_OP, + "pipeline is not invertible: " + definition); + } + final double[] c = copyOf(coord); + for (int i = steps.size() - 1; i >= 0; i--) { + steps.get(i).runReverse(c); + } + return c; + } + + private static double[] copyOf(final double[] coord) { + if (coord == null || coord.length < 2) { + throw new IllegalArgumentException("a coordinate needs at least two ordinates"); + } + final double[] c = new double[4]; + c[0] = coord[0]; + c[1] = coord[1]; + c[2] = coord.length > 2 ? coord[2] : 0.0; + c[3] = coord.length > 3 ? coord[3] : 0.0; + return c; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Pipeline[left=").append(left) + .append(", right=").append(right); + for (int i = 0; i < steps.size(); i++) { + sb.append("\n ").append(i + 1).append(". ").append(steps.get(i)); + } + return sb.append(']').toString(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineDefinitionException.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineDefinitionException.java new file mode 100644 index 0000000..17b7120 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineDefinitionException.java @@ -0,0 +1,73 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.InvalidValueException; + +/** + * A {@code +proj=pipeline} definition could not be turned into an executable + * operation. + * + *

Extends {@link InvalidValueException} so that every existing + * {@code catch (Proj4jException)} and {@code catch (InvalidValueException)} still + * fires, and carries a {@link PipelineErrorCode} so a caller can tell + * "PROJ would reject this too" from "proj4j has not implemented it" — a + * distinction that decides whether a conformance assertion has been demonstrated + * or merely dodged. + * + * @since 1.5 + */ +public class PipelineDefinitionException extends InvalidValueException { + + private static final long serialVersionUID = 1L; + + private final PipelineErrorCode code; + + /** + * @param code what kind of rejection this is + * @param message a human-readable reason + */ + public PipelineDefinitionException(final PipelineErrorCode code, final String message) { + super(code.errorCause(), message); + this.code = code; + } + + /** + * @param code what kind of rejection this is + * @param message a human-readable reason + * @param cause the underlying failure + */ + public PipelineDefinitionException(final PipelineErrorCode code, final String message, + final Throwable cause) { + super(code.errorCause(), message, cause); + this.code = code; + } + + /** + * @return the classification; never {@code null}. + */ + public PipelineErrorCode code() { + return code; + } + + /** + * @return {@code true} when PROJ 9.8.1 would refuse this definition as well. + * @see PipelineErrorCode#isRejectedByProj() + */ + public boolean isRejectedByProj() { + return code.isRejectedByProj(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineErrorCode.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineErrorCode.java new file mode 100644 index 0000000..68ef5f4 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineErrorCode.java @@ -0,0 +1,130 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.ErrorCause; + +/** + * The subset of PROJ 9.8.1's {@code PROJ_ERR_*} constants ({@code src/proj.h:709-766}) + * that the pipeline engine can raise at construction time. + * + *

The distinction the codes carry is the one a conformance harness needs and + * cannot otherwise decide: would PROJ have rejected this definition too? + * {@link #isRejectedByProj()} answers exactly that. A gie {@code expect failure} + * row asserts upstream rejection, so a failure that upstream would not + * have produced must never be reported as agreement. + * + * @since 1.5 + */ +public enum PipelineErrorCode { + + /** {@code PROJ_ERR_INVALID_OP_WRONG_SYNTAX} (1025). Nested pipelines, no steps, misplaced {@code +step}. */ + WRONG_SYNTAX(1025, true, ErrorCause.INVALID_CRS_SYNTAX), + + /** {@code PROJ_ERR_INVALID_OP_MISSING_ARG} (1026). */ + MISSING_ARG(1026, true, ErrorCause.MISSING_PARAM), + + /** {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} (1027). An unknown unit id, a bad {@code +order}. */ + ILLEGAL_ARG_VALUE(1027, true, ErrorCause.INVALID_PARAM_VALUE), + + /** {@code PROJ_ERR_INVALID_OP_MUTUALLY_EXCLUSIVE_ARGS} (1028). {@code axisswap} with both or neither of {@code +order}/{@code +axis}. */ + MUTUALLY_EXCLUSIVE_ARGS(1028, true, ErrorCause.CONTRADICTORY_PARAMS), + + /** + * A malformed or unresolvable {@code +init=:

} key: no colon, no such + * init file, or no such section in it. + * + *

Errno 1027, not 1029. {@code get_init_string} ({@code 9.8.1:src/init.cpp}) + * sets {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} for all three of them — + * {@code :105} "Missing colon in +init", {@code :119} "Cannot open %s", + * {@code :134} "Invalid content for %s" — so the honest counterpart of an + * {@code +init} key proj4j cannot resolve is the illegal-argument code, and the + * caller-facing cause really is {@link ErrorCause#INVALID_PARAM_VALUE}: the + * parameter value is what is wrong. + * + *

Kept distinct from {@link #ILLEGAL_ARG_VALUE} so a caller can tell an + * unresolvable init key from a bad {@code +order} or unit id without parsing the + * message; both report the same errno and the same {@link ErrorCause}. + */ + INVALID_INIT_KEY(1027, true, ErrorCause.INVALID_PARAM_VALUE), + + /** + * {@code PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID} (1029). A grid or model + * file the operation needs could not be found, read, or parsed: + * {@code +grids=}, {@code +xy_grids=}/{@code +z_grids=}, {@code tinshift}'s + * {@code +file=} and the triangulation JSON inside it. + * + *

{@code rejectedByProj} is {@code false}, and that is the whole point of this + * code. proj4j failing to read a file is a statement about proj4j's readers, not + * about the definition: the corpus follows + * {@code +proj=hgridshift +grids=tests/test_hgrid.tif} with a coordinate assertion, + * and PROJ reads that file perfectly well. Claiming upstream agreement here turns a + * capability gap into apparent conformance. The caller-facing cause is + * {@link ErrorCause#MISSING_GRID} (an operation-group cause), not + * {@link ErrorCause#INVALID_PARAM_VALUE}: the {@code +grids=} value the caller wrote + * may be perfectly valid and simply unreadable here. + * + *

PROJ raises this same 1029 when a grid genuinely is absent + * ({@code grids.cpp}, {@code tinshift.cpp:92-127}, {@code deformation.cpp:377-391}), + * so a gie row that names {@code invalid_op_file_not_found_or_invalid} is + * still satisfied by it — the conformance runner resolves that from the corpus side, + * where the evidence actually is. + */ + FILE_NOT_FOUND_OR_INVALID(1029, false, ErrorCause.MISSING_GRID), + + /** {@code PROJ_ERR_OTHER_NO_INVERSE_OP} (4098). */ + NO_INVERSE_OP(4098, true, ErrorCause.NO_INVERSE_AVAILABLE), + + /** + * Not a PROJ error at all: proj4j cannot execute a step that PROJ executes + * perfectly well. Reporting this as an upstream rejection would turn a + * capability gap into apparent conformance. + */ + NOT_IMPLEMENTED_HERE(0, false, ErrorCause.PROJECTION_NOT_IMPLEMENTED); + + private final int projErrno; + private final boolean rejectedByProj; + private final ErrorCause errorCause; + + PipelineErrorCode(final int projErrno, final boolean rejectedByProj, final ErrorCause errorCause) { + this.projErrno = projErrno; + this.rejectedByProj = rejectedByProj; + this.errorCause = errorCause; + } + + /** + * @return the numeric {@code PROJ_ERR_*} value, or {@code 0} when there is no + * PROJ counterpart. + */ + public int projErrno() { + return projErrno; + } + + /** + * @return {@code true} when PROJ 9.8.1 would refuse the same definition, so a + * gie {@code expect failure} row is genuinely satisfied by it. + */ + public boolean isRejectedByProj() { + return rejectedByProj; + } + + /** + * @return proj4j's own error taxonomy entry for this code; never {@code null}. + */ + public ErrorCause errorCause() { + return errorCause; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineFactory.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineFactory.java new file mode 100644 index 0000000..3eee3f8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineFactory.java @@ -0,0 +1,545 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.vertical.VGridShiftOperator; + +/** + * Builds a {@link Pipeline} from a {@code +proj=pipeline} string, and a single + * legacy operation from a {@code +init=} string. + * + *

How a step's argument list is built — the part everything else rests on

+ * + *

{@code pipeline.cpp:479-489} builds each step's {@code argv} as + * + *

the step's own tokens, then the pipeline's global tokens.
+ * + *

Appended, not prepended. Combined with {@code pj_param}'s first-match-wins that + * makes a global token lower precedence than a step token, and a + * {@code +init=} expansion — which is appended after both + * ({@code init.cpp:352-397}) — lower precedence than either. + * + *

That three-level ordering is exactly what + * {@code +proj=pipeline +towgs84=0,0,0 +step +init=epsg:4313 +inv …} exploits: + * the global {@code towgs84=0,0,0} lands ahead of the {@code towgs84} the + * {@code 4313} section declares, so the datum shift is switched off while the change + * of ellipsoid is kept. {@code gigs/5103.1}, {@code 5111.1} and {@code 5112} all do + * this, and the file comments say why: "turn off dual datum shift". Get the order + * backwards and the shift is applied twice. + * + *

What is rejected, and with which PROJ error

+ * + *
    + *
  • a second {@code proj=pipeline} token — {@code WRONG_SYNTAX}. PROJ allows + * nesting only when the child is wrapped in an {@code +init}, which is why the + * check counts tokens rather than recursing;
  • + *
  • a {@code +step} before {@code +proj=pipeline}, or no steps at all — + * {@code WRONG_SYNTAX};
  • + *
  • a {@code proj=} or {@code o_proj=} token among the globals — + * {@code WRONG_SYNTAX} ({@code pipeline.cpp:438-452}, added against a fuzzer + * case);
  • + *
  • more than one {@code +init=} in a non-pipeline operation — + * {@code WRONG_SYNTAX} ({@code init.cpp:477-482});
  • + *
  • mismatched units between adjacent steps — {@code WRONG_SYNTAX};
  • + *
  • a step whose forward direction does not exist — {@code WRONG_SYNTAX}; a + * missing inverse only disables the pipeline's reverse pass.
  • + *
+ * + *

Scope

+ * + *

The operator set is {@code longlat} (and its three aliases), {@code geocent}, + * {@code unitconvert}, {@code axisswap}, {@code cart}, {@code vgridshift}, + * {@code hgridshift}, {@code deformation}, {@code tinshift}, {@code affine}, + * {@code push}, {@code pop}, {@code set}, and every projection in {@link Registry}. + * The eleven that are not projections are named by {@link #handlesOperator}, which is + * how a caller knows that {@code +proj=axisswap order=2,1} — a complete operation with + * no {@code +step} and no {@code +init=} — belongs here rather than on the + * {@code CRSFactory} path. + * + *

Deliberately absent, each a refusal rather than a silent omission: + * {@code helmert} as a user-facing operator (it exists only as the hidden + * helper {@link Cs2csOperator} builds, which is the {@code +exact + * +convention=position_vector} static form; the user-facing operator additionally has + * {@code convention=coordinate_frame}, {@code transpose} and the seven time-dependent + * rates, and implementing a subset of those would silently ignore a token PROJ acts + * on); {@code gridshift} and {@code defmodel}, both of which need the GeoTIFF grid + * reader to be wired into the pipeline layer; and {@code +proj=deformation +grids=}, + * the single-file three-channel Geodetic TIFF Grid form of an operator whose two-grid + * form works. + * + *

{@code +t_epoch}/{@code +t_final} on {@code hgridshift} and {@code vgridshift} are + * honoured through {@link TimeGatedOperator}. The time dimension is still not + * transformed — no {@code +proj=unitconvert +t_in}, no {@code +proj=set +t} — but a + * time-gated grid shift now behaves as upstream's does. + * + *

Instances hold an {@code +init=} expansion cache and a {@link Registry}; they + * are cheap to create and safe to reuse from one thread. + * + * @since 1.5 + */ +public final class PipelineFactory { + + private final Registry registry; + private final InitFileExpander initFiles = new InitFileExpander(); + + /** Uses a fresh {@link Registry}. */ + public PipelineFactory() { + this(new Registry()); + } + + /** + * @param registry resolves {@code +proj=} names and {@code +datum=} codes + */ + public PipelineFactory(final Registry registry) { + if (registry == null) { + throw new IllegalArgumentException("registry"); + } + this.registry = registry; + } + + /** + * The operators this factory executes that are not in {@link Registry} — + * PROJ's conversions and transformations, as opposed to its projections. + * + *

This list is the routing contract with anything that has to decide whether a + * definition belongs to the pipeline engine or to the legacy + * {@code CRSFactory}/{@code Projection} path. It deliberately excludes every name + * {@link Cs2csOperator} reaches through {@code Registry} ({@code longlat} and its + * aliases, {@code geocent}, and the projections), because those two paths must keep + * agreeing about who owns a projection. + * + *

Sorted, so {@link #handlesOperator} can binary-search and so a reader can see + * at a glance what is claimed. + */ + private static final String[] PIPELINE_ONLY_OPERATORS = { + "affine", "axisswap", "cart", "deformation", "hgridshift", "pop", "push", "set", + "tinshift", "unitconvert", "vgridshift", + }; + + /** + * Whether {@code +proj=} names an operator this factory executes itself + * rather than delegating to {@link Registry}. + * + *

A bare {@code +proj=axisswap order=2,1} is a perfectly ordinary PROJ operation + * — {@code axisswap.gie} and {@code unitconvert.gie} are made almost entirely of + * them — but it is not a projection, so a caller that routes only + * {@code +proj=pipeline} and {@code +init=} here will never reach the operator that + * implements it, and will report the operator as unimplemented instead. That was + * measured: 25 of {@code axisswap.gie}'s 27 assertions and all 16 of + * {@code unitconvert.gie}'s failed for exactly that reason while both operators were + * complete and passing their own unit tests. + * + * @param projName the value of {@code +proj=}, may be {@code null} + * @return whether {@link #create} can build a one-step pipeline for it + */ + public static boolean handlesOperator(final String projName) { + if (projName == null) { + return false; + } + for (int i = 0; i < PIPELINE_ONLY_OPERATORS.length; i++) { + if (PIPELINE_ONLY_OPERATORS[i].equals(projName)) { + return true; + } + } + return false; + } + + /** + * @param definition a proj-string + * @return whether {@link #create} will accept it: a {@code +proj=pipeline}, a + * definition carrying an {@code +init=}, or a bare operator named by + * {@link #handlesOperator} + */ + public static boolean isSupportedShape(final String definition) { + final ProjParams params = ProjParams.parse(definition); + return isPipeline(params) || params.has("init") + || handlesOperator(params.value("proj")); + } + + private static boolean isPipeline(final ProjParams params) { + return "pipeline".equals(params.value("proj")) || params.countExact(ProjParams.STEP) > 0; + } + + /** + * Build an executable pipeline. + * + *

A definition that is not a pipeline is wrapped in a one-step one, + * so that {@code +init=epsg:27572} and + * {@code +proj=pipeline +step +init=epsg:27572} take the same path. That is not + * merely convenient: it is what PROJ does, since a non-pipeline + * {@code pj_init} runs the same {@code cs2cs_emulation_setup}. + * + * @param definition a proj-string, with or without {@code '+'} prefixes + * @return the pipeline; never {@code null} + * @throws PipelineDefinitionException if the definition cannot be built + */ + public Pipeline create(final String definition) { + final ProjParams all = ProjParams.parse(definition); + if (all.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "empty operation definition"); + } + return isPipeline(all) ? createPipeline(definition, all) + : createSingle(definition, all); + } + + // ---------------------------------------------------------------- pipeline + + private Pipeline createPipeline(final String definition, final ProjParams all) { + int pipelineTokens = 0; + for (final String token : all.tokens()) { + if ("proj=pipeline".equals(token)) { + pipelineTokens++; + } + } + if (pipelineTokens > 1) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "nested pipelines are only allowed when the child pipeline is wrapped in an " + + "+init; found " + pipelineTokens + " +proj=pipeline tokens"); + } + + final List slices = all.splitOnStep(); + final ProjParams globals = slices.get(0); + + // An implicit pipeline: +step tokens with no +proj=pipeline at all. + // PROJ accepts this, but not through pj_init - pj_param_exists stops at the + // first `step`, so pj_init would report a missing +proj. It is proj_create's + // PROJStringParser that reads a bare +step as a one-step pipeline, and + // more_builtins.gie:535 (`operation +step +proj=latlong +ellps=WGS84`) + // asserts real coordinates for exactly that shape. Rejecting it would turn an + // operation PROJ runs into one we claim PROJ refuses. + if (pipelineTokens == 1 && !"proj=pipeline".equals(firstProjToken(globals))) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "+step before +proj=pipeline"); + } + if (pipelineTokens == 1) { + for (final String token : globals.tokens()) { + if (token.startsWith("o_proj=")) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "o_proj= operator before first step not allowed"); + } + if (token.startsWith("proj=") && !"proj=pipeline".equals(token)) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "proj= operator before first step not allowed: +" + token); + } + } + } + if (slices.size() < 2) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "+proj=pipeline with no +step"); + } + + // set_ellipsoid (pipeline.cpp:316-354): only the globals are consulted, and + // the fallback is GRS80 rather than pj_init's WGS84. + final double[] globalEllipsoid = globalEllipsoid(globals); + + // pipeline.cpp:487-488 appends the globals starting at i_pipeline + 1, i.e. + // from just after the +proj=pipeline token - so that token itself is never + // passed to a step (which would look like a nested pipeline), and neither is + // anything written before it. + final List inherited = tokensAfterPipeline(globals); + + // Pipeline::stack (pipeline.cpp:139). One stack per pipeline, shared by every + // push/pop step in it, reached upstream through P->parent->opaque. + final CoordinateStack stack = new CoordinateStack(); + + final List steps = new ArrayList(slices.size() - 1); + for (int i = 1; i < slices.size(); i++) { + // The step's own tokens first, the inherited globals after: appended, so + // a step token shadows a global one. + final ProjParams argv = slices.get(i).append(inherited); + steps.add(buildStep(argv, stack)); + } + + propagateWhateverUnits(steps); + checkUnitContinuity(steps); + for (int i = 0; i < steps.size(); i++) { + if (!steps.get(i).canRunForward()) { + throw new PipelineDefinitionException(PipelineErrorCode.NO_INVERSE_OP, + "pipeline: inverse operation for step " + (i + 1) + " (" + + steps.get(i).description() + ") is not available"); + } + } + return new Pipeline(definition, steps, globalEllipsoid[0], globalEllipsoid[1]); + } + + private static String firstProjToken(final ProjParams globals) { + final int i = globals.find("proj"); + return i < 0 ? null : globals.tokens().get(i); + } + + /** + * The global tokens a step inherits: everything strictly after the + * {@code proj=pipeline} token, or all of them when there is no such token (an + * implicit pipeline). + * + *

Skipping the token itself is not cosmetic — upstream copies the globals + * starting at {@code i_pipeline + 1} ({@code pipeline.cpp:487}), and a step that + * inherited {@code proj=pipeline} would look like a nested pipeline to its own + * initialiser. + * + * @param globals the slice before the first {@code step} + * @return possibly empty, never {@code null} + */ + private static List tokensAfterPipeline(final ProjParams globals) { + final List all = globals.tokens(); + int at = -1; + for (int i = 0; i < all.size(); i++) { + if ("proj=pipeline".equals(all.get(i))) { + at = i; + break; + } + } + return new ArrayList(all.subList(at + 1, all.size())); + } + + // ------------------------------------------------------------------ single + + private Pipeline createSingle(final String definition, final ProjParams all) { + int inits = 0; + for (final String token : all.tokens()) { + if (token.startsWith("init=")) { + inits++; + } + } + if (inits > 1) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "too many inits: " + inits); + } + final List steps = new ArrayList(1); + // No stack: this wrapper is not a +proj=pipeline, so a push/pop step has no + // parent and is the identity (pipeline.cpp:641-643). + steps.add(buildStep(all, null)); + // init.cpp:576-581: a non-pipeline operation with no ellipsoid gets WGS84. + return new Pipeline(definition, steps, Ellipsoid.WGS84.getEquatorRadius(), + 1.0 - Ellipsoid.WGS84.getB() / Ellipsoid.WGS84.getEquatorRadius()); + } + + // -------------------------------------------------------------------- step + + /** + * One step, from its combined argument list. + * + *

Order of expansion follows {@code pj_init_ctx}: {@code +init=} first + * ({@code init.cpp:506-513}), then the implicit {@code +ellps=GRS80} + * ({@code init.cpp:540}). {@code +datum=} expansion is handled inside + * {@link Cs2csOperator}, which reads the datum object directly rather than + * splicing its definition string into the token list. + * + * @param argv the step's combined argument list + * @param stack the enclosing pipeline's coordinate stack, or {@code null} when this + * step is a one-step wrapper around a bare operation and therefore has + * no parent pipeline + */ + private PipelineStep buildStep(final ProjParams argv, final CoordinateStack stack) { + // pipeline.cpp:517-523: one toggle per exact "inv" token, over the combined + // list, so a global +inv and a step +inv cancel. + final boolean inverted = (argv.countExact("inv") & 1) == 1; + + ProjParams expanded = argv; + final int initIndex = argv.find("init"); + if (initIndex >= 0) { + expanded = expanded.append(initFiles.expand(argv.tokens().get(initIndex))); + } + expanded = appendImplicitEllipsoid(expanded); + + final String projName = expanded.value("proj"); + if (projName == null || projName.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "missing +proj in step: " + argv); + } + if ("pipeline".equals(projName)) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "nested pipelines are only allowed when the child pipeline is wrapped in an +init"); + } + + final PipelineOperator operator; + if ("unitconvert".equals(projName)) { + operator = new UnitConvertOperator(expanded); + } else if ("axisswap".equals(projName)) { + operator = new AxisSwapOperator(expanded); + } else if ("vgridshift".equals(projName)) { + // A user-written +proj=vgridshift step, distinct from the hidden one + // Cs2csOperator builds for +geoidgrids: this one honours +multiplier, because it + // is the operator's own parameter rather than an inherited token + // (vgridshift.cpp:205-209). + final String grids = expanded.value("grids"); + if (grids == null || grids.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "+proj=vgridshift: +grids parameter missing."); + } + // vgridshift shares hgridshift's +t_epoch/+t_final bracket; upstream's own + // comment in hgridshift.cpp asks for the two to be factored together, and + // TimeGatedOperator is that factoring. + operator = TimeGatedOperator.wrap(VGridShiftOperator.fromGrids(grids, + expanded.doubleValue("multiplier", VGridShiftOperator.DEFAULT_MULTIPLIER)), + expanded); + } else if ("hgridshift".equals(projName)) { + operator = TimeGatedOperator.wrap( + HGridShiftOperator.fromGrids(expanded.value("grids")), expanded); + } else if ("deformation".equals(projName)) { + operator = new DeformationOperator(registry, expanded); + } else if ("cart".equals(projName)) { + operator = new CartOperator(registry, expanded); + } else if ("tinshift".equals(projName)) { + operator = TinShiftOperator.fromFile(expanded.value("file")); + } else if ("affine".equals(projName)) { + operator = new AffineOperator(expanded); + } else if ("set".equals(projName)) { + operator = new SetOperator(expanded); + } else if ("push".equals(projName) || "pop".equals(projName)) { + operator = new PushPopOperator("push".equals(projName), expanded, stack); + } else { + operator = new Cs2csOperator(registry, expanded); + } + // pipeline.cpp:525-526, read with pj_param's 'b' sigil over the step's own + // paralist - which by this point includes the inherited globals and the +init= + // expansion, exactly as next_step->params does upstream. + return new PipelineStep(operator, inverted, + expanded.booleanValue("omit_fwd"), expanded.booleanValue("omit_inv")); + } + + /** + * {@code append_default_ellipsoid_to_paralist} ({@code init.cpp:313-350}): + * {@code ellps=GRS80} is appended unless {@code +no_defs}, or there is no usable + * {@code +proj}, or {@code +proj=pipeline}, or any of + * {@code datum ellps a b rf f e es} is already present. + * + *

Note it is not suppressed by {@code +R}, and note "appended" — + * a user token shadows it. + */ + private static ProjParams appendImplicitEllipsoid(final ProjParams params) { + if (params.has("no_defs")) { + return params; + } + final int projIndex = params.find("proj"); + if (projIndex < 0) { + return params; + } + final String projToken = params.tokens().get(projIndex); + if (projToken.length() < 6 || "proj=pipeline".equals(projToken)) { + return params; + } + final String[] shape = {"datum", "ellps", "a", "b", "rf", "f", "e", "es"}; + for (int i = 0; i < shape.length; i++) { + if (params.has(shape[i])) { + return params; + } + } + return params.append("ellps=GRS80"); + } + + // ------------------------------------------------------------------- units + + /** + * {@code pipeline.cpp:583-618}. A step declaring {@link GieIoUnits#WHATEVER} on + * both sides adopts a neighbour's units so the continuity check below has + * something to compare — right-to-left first, then left-to-right. + * + *

Upstream's comment names the case this must not break: + * {@code proj=pipeline step proj=unitconvert xy_in=deg xy_out=rad step …}, whose + * first step must keep a non-radian left-hand side or cs2cs would insert a + * second degree-to-radian conversion. That is handled by the both-sides + * precondition, not by a special case. + */ + private static void propagateWhateverUnits(final List steps) { + final int n = steps.size(); + for (int i = n - 2; i >= 0; i--) { + final PipelineStep step = steps.get(i); + if (step.left() == GieIoUnits.WHATEVER && step.right() == GieIoUnits.WHATEVER) { + final PipelineStep rightStep = steps.get(i + 1); + final GieIoUnits rl = rightStep.left(); + final GieIoUnits rr = rightStep.right(); + if (rl != rr || rl != GieIoUnits.WHATEVER) { + step.operator().overrideUnits(rl, rl); + } + } + } + for (int i = 1; i < n; i++) { + final PipelineStep step = steps.get(i); + if (step.left() == GieIoUnits.WHATEVER && step.right() == GieIoUnits.WHATEVER) { + final PipelineStep leftStep = steps.get(i - 1); + final GieIoUnits ll = leftStep.left(); + final GieIoUnits lr = leftStep.right(); + if (ll != lr || lr != GieIoUnits.WHATEVER) { + step.operator().overrideUnits(lr, lr); + } + } + } + } + + /** {@code pipeline.cpp:620-636}. {@code WHATEVER} on either side is compatible with anything. */ + private static void checkUnitContinuity(final List steps) { + for (int i = 0; i + 1 < steps.size(); i++) { + final GieIoUnits out = steps.get(i).right(); + final GieIoUnits in = steps.get(i + 1).left(); + if (out == GieIoUnits.WHATEVER || in == GieIoUnits.WHATEVER) { + continue; + } + if (out != in) { + throw new PipelineDefinitionException(PipelineErrorCode.WRONG_SYNTAX, + "pipeline: mismatched units between step " + (i + 1) + " (" + out + + ") and step " + (i + 2) + " (" + in + ")"); + } + } + } + + // --------------------------------------------------------------- ellipsoid + + /** + * The pipeline's global ellipsoid, used for nothing but {@code P->geod} — the + * geodesic a conformance comparator measures angular deviations with. + * + *

{@code set_ellipsoid} breaks the parameter list at the first {@code step} + * before asking, so a step's {@code +ellps} is invisible here, and falls back to + * GRS80 rather than {@code pj_init}'s WGS84. About 1e-7 m at one degree: + * irrelevant against a millimetre tolerance, material against an explicit + * {@code +ellps=clrk66}. + * + * @return {@code {a, f}} + */ + private double[] globalEllipsoid(final ProjParams globals) { + final String name = globals.value("ellps"); + if (name != null) { + final Ellipsoid e = registry.getEllipsoid(name); + if (e != null) { + return new double[] {e.getEquatorRadius(), 1.0 - e.getB() / e.getEquatorRadius()}; + } + } + final double a = globals.doubleValue("a", Double.NaN); + if (!Double.isNaN(a) && a > 0) { + final double rf = globals.doubleValue("rf", Double.NaN); + if (!Double.isNaN(rf) && rf != 0) { + return new double[] {a, 1.0 / rf}; + } + final double f = globals.doubleValue("f", Double.NaN); + if (!Double.isNaN(f)) { + return new double[] {a, f}; + } + final double b = globals.doubleValue("b", Double.NaN); + if (!Double.isNaN(b) && b > 0) { + return new double[] {a, 1.0 - b / a}; + } + } + return new double[] {Pipeline.GRS80_A, Pipeline.GRS80_F}; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineJson.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineJson.java new file mode 100644 index 0000000..8d44e59 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineJson.java @@ -0,0 +1,415 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * A dependency-free JSON reader for the model files {@code +proj=tinshift} and + * {@code +proj=defmodel} take. + * + *

Why this is not {@code org.locationtech.proj4j.io.projjson.Json}

+ * + *

Because that class is package-private — {@code final class Json} with + * {@code static Object parse(String)} — so nothing outside + * {@code org.locationtech.proj4j.io.projjson} can call it. It is the right class to + * use and this one should be deleted the moment {@code Json} and {@code Json.parse} + * are made {@code public} (or a public facade is added next to + * {@code ProjJsonReader}); that visibility change is the one item of plumbing this + * operator family needs and is reported rather than made here, because + * {@code io/**} is owned elsewhere. + * + *

Deliberately not a JSON library. PROJ reads these files with + * {@code nlohmann::json} and proj4j's core has zero runtime dependencies on purpose: + * a downstream consumer is removing Apache SIS specifically to remove a + * {@code LinkageError} over a duplicated class, and adding a JSON dependency would + * relocate that hazard rather than remove it. + * + *

Scope, and the two things upstream's reader distinguishes that this one must too

+ * + *

RFC 8259 as these files use it: objects (member order preserved), arrays, + * strings with the six short escapes and {@code \\uXXXX}, numbers, {@code true}, + * {@code false}, {@code null}. Numbers are {@code Double}, which is what + * {@code nlohmann}'s {@code is_number()} means at every call site in + * {@code tinshift_impl.hpp}. + * + *

{@code tinshift_impl.hpp} does, however, test + * {@code type() != json::value_t::number_unsigned} for a triangle's vertex indices — + * a stricter test than {@code is_number()}, rejecting {@code 1.5} and {@code -1} + * where a plain number check would accept them. {@link #asIndex} reproduces that on + * the parsed {@code Double}: the value must be integral and non-negative. A reader + * that returned every number as a {@code double} and lost the distinction would + * silently accept a malformed triangulation. + * + *

Depth is bounded, because these files are named by a user-supplied proj-string + * and unbounded nesting is a stack-overflow shaped denial of service on a parser + * that recurses. + * + *

Stateless; not instantiable. + * + * @since 1.5 + */ +final class PipelineJson { + + /** Nesting limit. Upstream's own files are three deep; 64 is far past any real model. */ + private static final int MAX_DEPTH = 64; + + private PipelineJson() { + throw new AssertionError("no instances"); + } + + /** + * Parse JSON text. + * + * @param text the document + * @return {@link Map}, {@link List}, {@link String}, {@link Double}, {@link Boolean} + * or {@code null} + * @throws PipelineDefinitionException {@code FILE_NOT_FOUND_OR_INVALID} if the text + * is not well-formed JSON — which is the error + * PROJ raises for it, because "the file exists + * but is not a model" and "the file is missing" + * are the same {@code + * PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID} + */ + static Object parse(final String text) { + if (text == null) { + throw invalid("JSON text is null"); + } + final Cursor c = new Cursor(text); + c.skipWhitespace(); + final Object value = c.value(0); + c.skipWhitespace(); + if (c.pos < text.length()) { + throw invalid("unexpected trailing text at offset " + c.pos); + } + return value; + } + + // ------------------------------------------------------------- typed access + + /** + * @param node any parsed node + * @return it as an object + * @throws PipelineDefinitionException if it is not one + */ + @SuppressWarnings("unchecked") + static Map asObject(final Object node, final String what) { + if (!(node instanceof Map)) { + throw invalid(what + " is not an object"); + } + return (Map) node; + } + + /** + * @param node any parsed node + * @return it as an array + * @throws PipelineDefinitionException if it is not one + */ + @SuppressWarnings("unchecked") + static List asArray(final Object node, final String what) { + if (!(node instanceof List)) { + throw invalid(what + " is not an array"); + } + return (List) node; + } + + /** + * {@code getArrayMember} ({@code tinshift_impl.hpp:64-74}): the key must be present + * and its value must be an array. + * + * @param object the containing object + * @param key the member name + * @return the array + */ + static List requiredArray(final Map object, final String key) { + if (!object.containsKey(key)) { + throw invalid("Missing \"" + key + "\" key"); + } + return asArray(object.get(key), "The value of \"" + key + "\""); + } + + /** {@code getReqString}: present, and a string. */ + static String requiredString(final Map object, final String key) { + if (!object.containsKey(key)) { + throw invalid("Missing \"" + key + "\" key"); + } + return string(object, key); + } + + /** {@code getOptString}: absent yields the empty string, present must be a string. */ + static String optionalString(final Map object, final String key) { + if (!object.containsKey(key)) { + return ""; + } + return string(object, key); + } + + private static String string(final Map object, final String key) { + final Object v = object.get(key); + if (!(v instanceof String)) { + throw invalid("The value of \"" + key + "\" should be a string"); + } + return (String) v; + } + + /** {@code is_number()} followed by {@code get()}. */ + static double asNumber(final Object node, final String what) { + if (!(node instanceof Double)) { + throw invalid(what + " is not a number"); + } + return ((Double) node).doubleValue(); + } + + /** + * {@code type() == json::value_t::number_unsigned} followed by {@code get()} + * — integral and non-negative, not merely numeric. + * + * @param node the array element + * @param what a description for the message + * @return the index + */ + static int asIndex(final Object node, final String what) { + if (!(node instanceof Double)) { + throw invalid(what + " is not an integer"); + } + final double d = ((Double) node).doubleValue(); + if (d < 0 || d != Math.floor(d) || Double.isInfinite(d) || d > Integer.MAX_VALUE) { + throw invalid(what + " is not an integer"); + } + return (int) d; + } + + static PipelineDefinitionException invalid(final String message) { + return new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "invalid model: " + message); + } + + // ------------------------------------------------------------------- parser + + private static final class Cursor { + + private final String s; + private int pos; + + Cursor(final String s) { + this.s = s; + } + + void skipWhitespace() { + while (pos < s.length()) { + final char c = s.charAt(pos); + if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { + pos++; + } else { + break; + } + } + } + + Object value(final int depth) { + if (depth > MAX_DEPTH) { + throw invalid("JSON nested more than " + MAX_DEPTH + " deep"); + } + if (pos >= s.length()) { + throw invalid("unexpected end of JSON"); + } + final char c = s.charAt(pos); + switch (c) { + case '{': + return object(depth); + case '[': + return array(depth); + case '"': + return string(); + case 't': + expect("true"); + return Boolean.TRUE; + case 'f': + expect("false"); + return Boolean.FALSE; + case 'n': + expect("null"); + return null; + default: + return number(); + } + } + + private Map object(final int depth) { + pos++; + final Map out = new LinkedHashMap(); + skipWhitespace(); + if (peek() == '}') { + pos++; + return Collections.unmodifiableMap(out); + } + while (true) { + skipWhitespace(); + if (peek() != '"') { + throw invalid("expected a member name at offset " + pos); + } + final String key = string(); + skipWhitespace(); + if (peek() != ':') { + throw invalid("expected ':' at offset " + pos); + } + pos++; + skipWhitespace(); + out.put(key, value(depth + 1)); + skipWhitespace(); + final char c = peek(); + if (c == ',') { + pos++; + continue; + } + if (c == '}') { + pos++; + return Collections.unmodifiableMap(out); + } + throw invalid("expected ',' or '}' at offset " + pos); + } + } + + private List array(final int depth) { + pos++; + final List out = new ArrayList(); + skipWhitespace(); + if (peek() == ']') { + pos++; + return Collections.unmodifiableList(out); + } + while (true) { + skipWhitespace(); + out.add(value(depth + 1)); + skipWhitespace(); + final char c = peek(); + if (c == ',') { + pos++; + continue; + } + if (c == ']') { + pos++; + return Collections.unmodifiableList(out); + } + throw invalid("expected ',' or ']' at offset " + pos); + } + } + + private String string() { + pos++; + final StringBuilder sb = new StringBuilder(); + while (true) { + if (pos >= s.length()) { + throw invalid("unterminated string"); + } + final char c = s.charAt(pos++); + if (c == '"') { + return sb.toString(); + } + if (c != '\\') { + sb.append(c); + continue; + } + if (pos >= s.length()) { + throw invalid("unterminated escape"); + } + final char e = s.charAt(pos++); + switch (e) { + case '"': + sb.append('"'); + break; + case '\\': + sb.append('\\'); + break; + case '/': + sb.append('/'); + break; + case 'b': + sb.append('\b'); + break; + case 'f': + sb.append('\f'); + break; + case 'n': + sb.append('\n'); + break; + case 'r': + sb.append('\r'); + break; + case 't': + sb.append('\t'); + break; + case 'u': + if (pos + 4 > s.length()) { + throw invalid("truncated \\u escape"); + } + try { + sb.append((char) Integer.parseInt(s.substring(pos, pos + 4), 16)); + } catch (final NumberFormatException nfe) { + throw invalid("bad \\u escape at offset " + pos); + } + pos += 4; + break; + default: + throw invalid("unknown escape '\\" + e + "' at offset " + (pos - 1)); + } + } + } + + private Double number() { + final int start = pos; + if (peek() == '-' || peek() == '+') { + pos++; + } + while (pos < s.length()) { + final char c = s.charAt(pos); + if ((c >= '0' && c <= '9') || c == '.' || c == 'e' || c == 'E' + || c == '+' || c == '-') { + pos++; + } else { + break; + } + } + if (pos == start) { + throw invalid("expected a value at offset " + start); + } + final String text = s.substring(start, pos); + try { + return Double.valueOf(text); + } catch (final NumberFormatException e) { + throw invalid("not a number: '" + text + "' at offset " + start); + } + } + + private void expect(final String literal) { + if (!s.startsWith(literal, pos)) { + throw invalid("expected '" + literal + "' at offset " + pos); + } + pos += literal.length(); + } + + private char peek() { + if (pos >= s.length()) { + throw invalid("unexpected end of JSON"); + } + return s.charAt(pos); + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineOperator.java new file mode 100644 index 0000000..77ec75d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineOperator.java @@ -0,0 +1,110 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * One executable step of a {@code +proj=pipeline} — PROJ's {@code PJ} reduced to + * what a pipeline needs of it. + * + *

The coordinate contract

+ * + *

A coordinate is a {@code double[4]} holding {@code {x, y, z, t}}, mutated + * in place, exactly as PROJ's {@code PJ_COORD} is passed by reference + * through {@code pipeline_forward_4d}. Angular components are always + * radians; linear components are metres unless the step's own units say + * otherwise. + * + *

This is deliberately not PROJ's full 4D model. There is no + * {@code PJ_COORD} union, no {@code push}/{@code pop} stack, and {@code t} is + * carried untouched rather than transformed: the engine exists to run the GIGS + * corpus and the geographic/projected half of the gie corpus, and every one of + * those is 2D or 3D. The shape is chosen so the missing pieces can be added + * without changing this interface. + * + *

Failure

+ * + *

A step that cannot transform a coordinate throws. It never returns a + * sentinel, and in particular never returns the input unchanged or a single + * {@code NaN} ordinate: PROJ signals failure with an all-{@code HUGE_VAL} + * coordinate, and mapping that onto an exception at the step boundary is what + * keeps a failure from being mistaken for a plausible answer. + * + * @since 1.5 + */ +public interface PipelineOperator { + + /** + * {@code P->left} as declared by the operator's setup function, before + * {@code pj_left}'s {@code CLASSIC}-to-{@code PROJECTED} folding and before the + * {@code +inv} swap. + * + * @return the declared left-hand unit domain; never {@code null} + */ + GieIoUnits declaredLeft(); + + /** + * {@code P->right} as declared by the operator's setup function. + * + * @return the declared right-hand unit domain; never {@code null} + */ + GieIoUnits declaredRight(); + + /** + * Overwrite the declared units, as {@code pipeline.cpp:583-618} does when a + * neighbouring step can disambiguate a {@link GieIoUnits#WHATEVER} pair. + * + *

Only ever called with both arguments equal, and only on an operator whose + * two declared sides are both {@code WHATEVER} — which is why an implementation + * that cannot be affected by its unit domain may ignore the call. + * + * @param left the new declared left + * @param right the new declared right + */ + void overrideUnits(GieIoUnits left, GieIoUnits right); + + /** + * Run the step in its forward direction. + * + * @param coord {@code {x, y, z, t}}, mutated in place + * @throws Proj4jException if the coordinate cannot be transformed + */ + void forward(double[] coord); + + /** + * Run the step in its inverse direction. + * + * @param coord {@code {x, y, z, t}}, mutated in place + * @throws Proj4jException if the coordinate cannot be transformed, or if this + * operator has no inverse + */ + void inverse(double[] coord); + + /** + * @return {@code true} when {@link #inverse} can be called at all — + * {@code pj_has_inverse}. A pipeline containing one non-invertible step + * is itself non-invertible. + */ + boolean hasInverse(); + + /** + * @return a short description for diagnostics, conventionally the + * {@code +proj=} name and the parameters that matter. + */ + String description(); +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineStep.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineStep.java new file mode 100644 index 0000000..2899894 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineStep.java @@ -0,0 +1,169 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * One step of an assembled {@link Pipeline}: an operator plus the {@code +inv} flag + * that decides which of its two directions the pipeline's forward pass uses. + * + *

{@code +inv} is a toggle, not a switch

+ * + *

{@code pipeline.cpp:517-523} walks the step's combined argument list — + * the step's own tokens followed by the pipeline's global tokens — and flips the + * flag once per token that is exactly {@code "inv"}. Two occurrences therefore + * cancel, which is upstream's documented way of letting a global {@code +inv} be + * overridden per step, and the match is exact so {@code +inv=T} does not count. + * + *

What it does to the unit sides

+ * + *

Two independent consequences, both of which the gie comparator depends on: + * the step runs its opposite direction, and its declared left and right + * exchange places ({@code internal.cpp:49-61}). So an inverted projection step + * presents a projected left-hand side and an angular right-hand side, which is why + * a {@code +step +proj=X +inv} can legally precede a {@code +step +init=…}. + * + *

{@code +omit_fwd} and {@code +omit_inv}

+ * + *

Two independent per-step booleans, read with {@code pj_param}'s {@code 'b'} sigil + * ({@code pipeline.cpp:525-527}). Each suppresses the step in one pass — and + * note that "one pass" means the pipeline's forward or reverse pass, not the + * operator's forward or inverse method, so {@code +inv +omit_fwd} omits the step from + * the pipeline's forward pass even though the direction it would have run is the + * operator's inverse. {@code 4D-API_cs2cs-style.gie:400-440} pins all four + * combinations. + * + *

They also relax the two availability checks: an omitted direction needs no + * implementation, so {@code omit_fwd} makes {@link #canRunForward()} true + * unconditionally ({@code pipeline.cpp:536-538}) and {@code omit_inv} does the same for + * {@link #canRunReverse()} ({@code :561}). A step that is omitted in a direction can + * therefore be non-invertible without making the whole pipeline one-way. + * + *

Immutable apart from the operator, which {@link Pipeline} may ask to + * {@linkplain PipelineOperator#overrideUnits override its units} while the pipeline + * is being assembled. + * + * @since 1.5 + */ +public final class PipelineStep { + + private final PipelineOperator operator; + private final boolean inverted; + private final boolean omitForward; + private final boolean omitReverse; + + PipelineStep(final PipelineOperator operator, final boolean inverted) { + this(operator, inverted, false, false); + } + + PipelineStep(final PipelineOperator operator, final boolean inverted, + final boolean omitForward, final boolean omitReverse) { + this.operator = operator; + this.inverted = inverted; + this.omitForward = omitForward; + this.omitReverse = omitReverse; + } + + /** @return the operator; never {@code null}. */ + PipelineOperator operator() { + return operator; + } + + /** @return whether an odd number of {@code inv} tokens applied to this step. */ + public boolean isInverted() { + return inverted; + } + + /** @return {@code +omit_fwd}: this step is skipped in the pipeline's forward pass. */ + public boolean isOmittedForward() { + return omitForward; + } + + /** @return {@code +omit_inv}: this step is skipped in the pipeline's reverse pass. */ + public boolean isOmittedReverse() { + return omitReverse; + } + + /** @return {@code pj_left(step)}: the folded left-hand unit, honouring {@code +inv}. */ + public GieIoUnits left() { + return GieIoUnits.pjLeft(operator.declaredLeft(), operator.declaredRight(), inverted); + } + + /** @return {@code pj_right(step)}: the folded right-hand unit, honouring {@code +inv}. */ + public GieIoUnits right() { + return GieIoUnits.pjRight(operator.declaredLeft(), operator.declaredRight(), inverted); + } + + /** + * @return whether the pipeline's forward pass can run this step — + * {@code pipeline.cpp:536-553}, which needs the operator's + * inverse when the step is inverted. + */ + public boolean canRunForward() { + return omitForward || !inverted || operator.hasInverse(); + } + + /** @return whether the pipeline's reverse pass can run this step. */ + public boolean canRunReverse() { + return omitReverse || inverted || operator.hasInverse(); + } + + /** + * Run this step as the pipeline's forward pass requires, or not at all when + * {@code +omit_fwd} is set. + * + * @param coord {@code {x, y, z, t}}, mutated in place + */ + void runForward(final double[] coord) { + if (omitForward) { + return; + } + if (inverted) { + operator.inverse(coord); + } else { + operator.forward(coord); + } + } + + /** + * Run this step as the pipeline's reverse pass requires, or not at all when + * {@code +omit_inv} is set. + * + * @param coord {@code {x, y, z, t}}, mutated in place + */ + void runReverse(final double[] coord) { + if (omitReverse) { + return; + } + if (inverted) { + operator.forward(coord); + } else { + operator.inverse(coord); + } + } + + /** @return a short description, for diagnostics. */ + public String description() { + return operator.description() + (inverted ? " +inv" : "") + + (omitForward ? " +omit_fwd" : "") + (omitReverse ? " +omit_inv" : ""); + } + + @Override + public String toString() { + return "PipelineStep[" + description() + ", left=" + left() + ", right=" + right() + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineUnits.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineUnits.java new file mode 100644 index 0000000..f527b7c --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PipelineUnits.java @@ -0,0 +1,172 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * PROJ's linear and angular unit tables ({@code 9.8.1:src/units.cpp}), as + * {@code +proj=unitconvert} sees them through + * {@code get_unit_conversion_factor()}. + * + *

Why not {@code org.locationtech.proj4j.units.Units}

+ * + *

Because the normalised name is load bearing and proj4j's table does + * not carry PROJ's. {@code unitconvert} sets {@code P->left}/{@code P->right} to + * {@code RADIANS} or {@code DEGREES} only when the normalised name is exactly + * {@code "Radian"} or {@code "Degree"} ({@code unitconvert.cpp:487-493, 510-516}), + * and otherwise leaves the side {@code WHATEVER}. {@code grad} normalises to + * {@code "Grad"}, which is neither — so + * {@code +step +proj=unitconvert +xy_in=rad +xy_out=grad} leaves the pipeline's + * right-hand side {@code WHATEVER}, and the gie comparator therefore measures the + * Euclidean distance between two coordinates expressed in grads against a + * tolerance written in metres. That is exactly what {@code gigs/5102.2.gie} does, + * and it is deliberate upstream behaviour: reproducing it faithfully is required, + * "fixing" it silently changes 38 expected values. + * + *

The linear factors are also PROJ's own literals. {@code us-ft} is + * {@code 1200/3937}, evaluated at full double precision, not the rounded + * {@code 0.304800609601219} decimal proj4j's {@code Units} carries — a 1e-16 + * relative difference that matters to nobody but costs nothing to get right, and + * {@code gigs/5103.2} versus {@code 5103.3} exist precisely to separate + * {@code ft} from {@code us-ft}. + * + *

Stateless; not instantiable. + */ +final class PipelineUnits { + + /** {@code M_PI / 200}, spelled as {@code units.cpp:41} spells it. */ + static final double GRAD_TO_RAD = 0.015707963267948967; + + /** {@code DEG_TO_RAD} from {@code proj_internal.h}. */ + static final double DEG_TO_RAD = 0.017453292519943296; + + /** PROJ's normalised name for a unit whose id is unknown to both tables. */ + static final String UNKNOWN = null; + + private static final String[] LINEAR_IDS = { + "km", "m", "dm", "cm", "mm", "kmi", "in", "ft", "yd", "mi", "fath", "ch", "link", + "us-in", "us-ft", "us-yd", "us-ch", "us-mi", "ind-yd", "ind-ft", "ind-ch", + }; + + private static final double[] LINEAR_FACTORS = { + 1000.0, 1.0, 0.1, 0.01, 0.001, 1852.0, 0.0254, 0.3048, 0.9144, 1609.344, 1.8288, + 20.1168, 0.201168, 100 / 3937.0, 1200 / 3937.0, 3600 / 3937.0, 79200 / 3937.0, + 6336000 / 3937.0, 0.91439523, 0.30479841, 20.11669506, + }; + + private static final String[] LINEAR_NAMES = { + "Kilometer", "Meter", "Decimeter", "Centimeter", "Millimeter", + "International Nautical Mile", "International Inch", "International Foot", + "International Yard", "International Statute Mile", "International Fathom", + "International Chain", "International Link", "U.S. Surveyor's Inch", + "U.S. Surveyor's Foot", "U.S. Surveyor's Yard", "U.S. Surveyor's Chain", + "U.S. Surveyor's Statute Mile", "Indian Yard", "Indian Foot", "Indian Chain", + }; + + private static final String[] ANGULAR_IDS = {"rad", "deg", "grad"}; + + private static final double[] ANGULAR_FACTORS = {1.0, DEG_TO_RAD, GRAD_TO_RAD}; + + private static final String[] ANGULAR_NAMES = {"Radian", "Degree", "Grad"}; + + private PipelineUnits() { + throw new AssertionError("no instances"); + } + + /** + * One row of PROJ's unit table, or the "not a unit id" answer. + * + *

PROJ returns three things from one call through out-parameters: the + * factor, whether the unit is linear, and the normalised name. All three are + * needed at every call site, so they travel together. + */ + static final class Resolution { + + /** {@code get_unit_conversion_factor} returning 0.0: not a known unit id. */ + static final Resolution NOT_A_UNIT = new Resolution(0.0, -1, null); + + private final double factor; + private final int linear; + private final String normalisedName; + + private Resolution(final double factor, final int linear, final String normalisedName) { + this.factor = factor; + this.linear = linear; + this.normalisedName = normalisedName; + } + + /** + * PROJ's numeric fallback: {@code +xy_in=0.5} rather than a unit id. It + * carries no normalised name and no linearity, because upstream + * leaves {@code normalized_name} null and {@code p_is_linear} at its + * initial {@code -1} on that path — so a raw factor can never raise a + * step's unit domain above {@link GieIoUnits#WHATEVER}, and never triggers + * the linear/angular consistency check. + * + * @param factor the multiplier, already validated as finite and non-zero + * @return a nameless resolution + */ + static Resolution rawFactor(final double factor) { + return new Resolution(factor, -1, null); + } + + /** @return the multiplier to the pivot unit (metres, or radians). */ + double factor() { + return factor; + } + + /** @return {@code 1} linear, {@code 0} angular, {@code -1} unknown — PROJ's {@code p_is_linear}. */ + int linear() { + return linear; + } + + /** @return PROJ's normalised name, or {@code null} when the id is unknown. */ + String normalisedName() { + return normalisedName; + } + + /** @return whether this is a recognised unit id. */ + boolean isKnown() { + return factor != 0.0; + } + } + + /** + * {@code get_unit_conversion_factor()} ({@code unitconvert.cpp:396-434}): + * linear table first, then angular. Ids are matched with {@code strcmp}, so the + * comparison is case sensitive and exact. + * + * @param id a unit id, may be {@code null} + * @return the resolution; {@link Resolution#NOT_A_UNIT} when unknown + */ + static Resolution resolve(final String id) { + if (id == null) { + return Resolution.NOT_A_UNIT; + } + for (int i = 0; i < LINEAR_IDS.length; i++) { + if (LINEAR_IDS[i].equals(id)) { + return new Resolution(LINEAR_FACTORS[i], 1, LINEAR_NAMES[i]); + } + } + for (int i = 0; i < ANGULAR_IDS.length; i++) { + if (ANGULAR_IDS[i].equals(id)) { + return new Resolution(ANGULAR_FACTORS[i], 0, ANGULAR_NAMES[i]); + } + } + return Resolution.NOT_A_UNIT; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/ProjParams.java b/core/src/main/java/org/locationtech/proj4j/pipeline/ProjParams.java new file mode 100644 index 0000000..d0df218 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/ProjParams.java @@ -0,0 +1,349 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * PROJ's {@code paralist} — an ordered, immutable list of {@code key=value} tokens + * with {@code pj_param}'s three lookup semantics + * ({@code 9.8.1:src/param.cpp}, {@code src/init.cpp}). + * + *

    + *
  1. First match wins. {@code pj_param_exists} walks front to back and + * returns the first token whose key matches. This is why + * {@code +init=} and {@code +datum=} expansions are appended: a user + * token written earlier shadows whatever the expansion says.
  2. + *
  3. Lookup stops at the first {@code step} token ({@code param.cpp:72-105}) + * unless the key sought is {@code step}. That single rule is the + * entire mechanism scoping a pipeline step's parameters, and it is why + * {@link #find} refuses to look past one.
  4. + *
  5. Key matching is exact — terminated by {@code '='} or by the end of + * the token — so the key {@code a} never matches {@code axis}. Tokenising up + * front gives this for free.
  6. + *
+ * + *

Tokenising is total: this class never rejects a definition. Rejection + * is a later, separate act (see {@link PipelineFactory}), which is what allows an + * unrecognised key to be retained and ignored exactly as PROJ retains and ignores + * it — PROJ has no allow-list of any kind. + * + *

Immutable and thread-safe. + * + * @since 1.5 + */ +public final class ProjParams { + + /** The token that both separates and scopes pipeline steps. */ + static final String STEP = "step"; + + private final List tokens; + + private ProjParams(final List tokens) { + this.tokens = tokens; + } + + /** + * Tokenise a proj-string. + * + *

Whitespace and {@code ';'} separate tokens; a leading {@code '+'} and a + * trailing {@code '\'} (gie's line-continuation marker, which the corpus lexer + * normally strips) are removed. {@code null} is treated as the empty string. + * + * @param definition the definition, with or without {@code '+'} prefixes + * @return the parameter list; never {@code null} + */ + public static ProjParams parse(final String definition) { + final String in = definition == null ? "" : definition; + final List out = new ArrayList(); + final int n = in.length(); + int i = 0; + while (i < n) { + while (i < n && isSeparator(in.charAt(i))) { + i++; + } + if (i >= n) { + break; + } + final int start = i; + while (i < n && !isSeparator(in.charAt(i))) { + i++; + } + String token = in.substring(start, i); + while (token.startsWith("+")) { + token = token.substring(1); + } + while (token.endsWith("\\")) { + token = token.substring(0, token.length() - 1); + } + if (!token.isEmpty()) { + out.add(token); + } + } + return new ProjParams(Collections.unmodifiableList(out)); + } + + /** + * @param tokens already-normalised tokens, without {@code '+'} prefixes + * @return a parameter list over a defensive copy of {@code tokens} + */ + public static ProjParams of(final List tokens) { + return new ProjParams(Collections.unmodifiableList(new ArrayList(tokens))); + } + + private static boolean isSeparator(final char c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == 0x0b || c == ';'; + } + + // ------------------------------------------------------------------- basics + + /** @return the tokens in order, duplicates included; unmodifiable. */ + public List tokens() { + return tokens; + } + + /** @return the number of tokens. */ + public int size() { + return tokens.size(); + } + + /** @return whether there are no tokens at all. */ + public boolean isEmpty() { + return tokens.isEmpty(); + } + + // -------------------------------------------------------------- pj_param(3) + + /** + * {@code pj_param_exists}: the index of the first token whose key is + * {@code key}, stopping at the first {@code step} unless {@code key} is + * itself {@code step}. + * + * @param key the key sought, without {@code '+'} + * @return the index, or {@code -1} + */ + public int find(final String key) { + final boolean seekingStep = STEP.equals(key); + for (int i = 0; i < tokens.size(); i++) { + final String token = tokens.get(i); + if (!seekingStep && STEP.equals(token)) { + return -1; + } + if (keyEquals(token, key)) { + return i; + } + } + return -1; + } + + private static boolean keyEquals(final String token, final String key) { + if (!token.startsWith(key)) { + return false; + } + return token.length() == key.length() || token.charAt(key.length()) == '='; + } + + /** + * {@code pj_param} type {@code 't'}: is the key present in scope? + * + * @param key the key + * @return whether a token with that key precedes the first {@code step} + */ + public boolean has(final String key) { + return find(key) >= 0; + } + + /** + * The value of the first in-scope token with this key. + * + * @param key the key + * @return the value, or {@code null} when the key is absent or the + * token carried no {@code '='}. Use {@link #has} to distinguish. + */ + public String value(final String key) { + final int i = find(key); + if (i < 0) { + return null; + } + final String token = tokens.get(i); + final int eq = token.indexOf('='); + return eq < 0 ? null : token.substring(eq + 1); + } + + /** + * {@code pj_param} type {@code 'd'}. + * + * @param key the key + * @param defaultValue returned when the key is absent or has no value + * @return the value parsed in the C locale + * @throws PipelineDefinitionException if the value is present but unparseable + */ + public double doubleValue(final String key, final double defaultValue) { + final String raw = value(key); + if (raw == null || raw.isEmpty()) { + return defaultValue; + } + try { + return Double.parseDouble(raw.trim()); + } catch (final NumberFormatException e) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "invalid value for +" + key + ": " + raw, e); + } + } + + /** + * {@code pj_param} type {@code 'b'}: {@code ''}, {@code T} and {@code t} are + * true; {@code F} and {@code f} are false; anything else is an error. + * + * @param key the key + * @return the flag, {@code false} when the key is absent + * @throws PipelineDefinitionException on a value that is not a PROJ boolean + */ + public boolean booleanValue(final String key) { + final int i = find(key); + if (i < 0) { + return false; + } + final String raw = value(key); + if (raw == null || raw.isEmpty() || "T".equals(raw) || "t".equals(raw)) { + return true; + } + if ("F".equals(raw) || "f".equals(raw)) { + return false; + } + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+" + key + "=" + raw + " is not a PROJ boolean"); + } + + // -------------------------------------------------------------------- steps + + /** + * The number of tokens that are exactly {@code token}, scanning the whole list + * rather than stopping at a {@code step}. + * + *

Used for the two counts PROJ takes over a raw {@code argv}: {@code step} + * occurrences, and {@code inv} occurrences within one step's argument list + * ({@code pipeline.cpp:519-522}, which toggles per occurrence). + * + * @param token the exact token text + * @return the count + */ + public int countExact(final String token) { + int n = 0; + for (int i = 0; i < tokens.size(); i++) { + if (tokens.get(i).equals(token)) { + n++; + } + } + return n; + } + + /** + * Split on {@code step}, dropping the {@code step} tokens themselves. + * + *

Element 0 is the global scope: everything before the first + * {@code step}, which is where {@code proj=pipeline} and any pipeline-wide + * {@code +ellps} or {@code +towgs84} live. Elements 1..n are the steps. + * + * @return at least one element + */ + public List splitOnStep() { + final List out = new ArrayList(); + List current = new ArrayList(); + for (int i = 0; i < tokens.size(); i++) { + final String token = tokens.get(i); + if (STEP.equals(token)) { + out.add(new ProjParams(Collections.unmodifiableList(current))); + current = new ArrayList(); + } else { + current.add(token); + } + } + out.add(new ProjParams(Collections.unmodifiableList(current))); + return out; + } + + /** + * This list with {@code extra} appended. + * + *

Appending, never prepending, is the whole point: an expansion must be + * shadowed by any token the user wrote, and first-match-wins turns "appended" + * into "lower precedence". + * + * @param extra tokens to append, without {@code '+'} prefixes + * @return a new list + */ + public ProjParams append(final List extra) { + if (extra == null || extra.isEmpty()) { + return this; + } + final List out = new ArrayList(tokens.size() + extra.size()); + out.addAll(tokens); + for (int i = 0; i < extra.size(); i++) { + String token = extra.get(i); + if (token == null) { + continue; + } + while (token.startsWith("+")) { + token = token.substring(1); + } + if (!token.isEmpty()) { + out.add(token); + } + } + return new ProjParams(Collections.unmodifiableList(out)); + } + + /** + * @param token one token to append, without a {@code '+'} prefix + * @return a new list + */ + public ProjParams append(final String token) { + return append(Collections.singletonList(token)); + } + + /** + * The tokens as {@code Proj4Parser} wants them: each with a leading + * {@code '+'}, in order, duplicates preserved. + * + *

Order is preserved rather than deduplicated because + * {@code Proj4Parser.createParameterMap} implements first-occurrence-wins + * itself, so handing it the whole list reproduces PROJ's precedence. + * + * @return a fresh array + */ + public String[] toProj4Args() { + final String[] out = new String[tokens.size()]; + for (int i = 0; i < tokens.size(); i++) { + out[i] = "+" + tokens.get(i); + } + return out; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < tokens.size(); i++) { + if (i > 0) { + sb.append(' '); + } + sb.append('+').append(tokens.get(i)); + } + return sb.toString(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/PushPopOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/PushPopOperator.java new file mode 100644 index 0000000..c80beeb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/PushPopOperator.java @@ -0,0 +1,170 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=push} and {@code +proj=pop} — the pipeline coordinate stack, ported + * from {@code 9.8.1:src/pipeline.cpp:641-727}. One class serves both, because + * upstream is one implementation with the two function pointers exchanged: + *

+ * PJ *OPERATION(push, 0) { P->fwd4d = push; P->inv4d = pop;  return setup_pushpop(P); }
+ * PJ *OPERATION(pop,  0) { P->fwd4d = pop;  P->inv4d = push; return setup_pushpop(P); }
+ * 
+ * + *

This is not an exotic operator; it is the mechanism behind a real defect

+ * + *

PROJ itself writes {@code +proj=push +v_3} … {@code +proj=pop +v_3} around the + * geocentric leg of a 2D datum shift, so that a transformation with no input height + * cannot invent one. Verified with {@code cct}: a {@code z} of 100 stays 100 with the + * bracket and becomes 50.15 without it. Proj4J has the same defect on its legacy path + * — see {@code vertical.InventedHeightTest} — and fixes it another way, in + * {@code BasicCoordinateTransform}. The two are the same idea. + * + *

Three details, all of them upstream's

+ * + *
    + *
  1. No parent pipeline means no-op. {@code if (P->parent == nullptr) return}. + * A bare {@code operation +proj=push +v_3} is the identity, and + * {@code 4D-API_cs2cs-style.gie:388-396} asserts it. Modelled by a {@code null} + * {@link CoordinateStack}.
  2. + *
  3. Popping an empty stack leaves the component alone and is not an error + * ({@code :667}, {@code if (pushpop->v1 && !stack[0].empty())}).
  4. + *
  5. Both sides are {@link GieIoUnits#WHATEVER} ({@code :709-710}), so the + * step adopts a neighbour's units during assembly and the gie comparator's metric + * is decided by the steps around it rather than by this one.
  6. + *
+ * + *

Selection is by presence, not value: {@code pj_param_exists(P->params, "v_1")}, + * so {@code +v_1} and {@code +v_1=anything} both select component one, and a + * {@code push} naming no component at all does nothing. + * + *

Not thread-safe when it holds a stack — see {@link CoordinateStack}. + * + * @since 1.5 + */ +final class PushPopOperator implements PipelineOperator { + + /** {@code +v_1}..{@code +v_4}, in component order. */ + private static final String[] COMPONENT_KEYS = {"v_1", "v_2", "v_3", "v_4"}; + + private final boolean isPush; + private final boolean[] selected; + /** The enclosing pipeline's stack, or {@code null} for {@code P->parent == nullptr}. */ + private final CoordinateStack stack; + + private GieIoUnits left = GieIoUnits.WHATEVER; + private GieIoUnits right = GieIoUnits.WHATEVER; + + /** + * @param isPush {@code true} for {@code +proj=push}, {@code false} for + * {@code +proj=pop} + * @param params the step's parameter list + * @param stack the enclosing pipeline's stack, or {@code null} when there is no + * enclosing pipeline, in which case every direction is the identity + */ + PushPopOperator(final boolean isPush, final ProjParams params, final CoordinateStack stack) { + this.isPush = isPush; + this.stack = stack; + this.selected = new boolean[4]; + for (int i = 0; i < 4; i++) { + selected[i] = params.has(COMPONENT_KEYS[i]); + } + } + + /** {@code static void push(PJ_COORD &point, PJ *P)}. */ + private void doPush(final double[] coord) { + if (stack == null) { + return; + } + for (int i = 0; i < 4; i++) { + if (selected[i]) { + stack.push(i, coord[i]); + } + } + } + + /** {@code static void pop(PJ_COORD &point, PJ *P)}. */ + private void doPop(final double[] coord) { + if (stack == null) { + return; + } + for (int i = 0; i < 4; i++) { + if (selected[i] && !stack.isEmpty(i)) { + coord[i] = stack.pop(i); + } + } + } + + @Override + public void forward(final double[] coord) { + if (isPush) { + doPush(coord); + } else { + doPop(coord); + } + } + + @Override + public void inverse(final double[] coord) { + if (isPush) { + doPop(coord); + } else { + doPush(coord); + } + } + + @Override + public GieIoUnits declaredLeft() { + return left; + } + + @Override + public GieIoUnits declaredRight() { + return right; + } + + @Override + public void overrideUnits(final GieIoUnits newLeft, final GieIoUnits newRight) { + this.left = newLeft; + this.right = newRight; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + final StringBuilder sb = new StringBuilder(isPush ? "push" : "pop"); + for (int i = 0; i < 4; i++) { + if (selected[i]) { + sb.append(" +").append(COMPONENT_KEYS[i]); + } + } + if (stack == null) { + sb.append(" (no enclosing pipeline: identity)"); + } + return sb.toString(); + } + + @Override + public String toString() { + return "PushPopOperator[" + description() + ", left=" + left + ", right=" + right + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/SetOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/SetOperator.java new file mode 100644 index 0000000..b83e4eb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/SetOperator.java @@ -0,0 +1,123 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=set} — overwrite selected coordinate components with constants, ported + * from {@code 9.8.1:src/conversions/set.cpp}. + * + *

The one thing that is not symmetric about it

+ * + *

Upstream assigns the same function to both directions: + *

+ * P->fwd4d = set_fwd_inv;
+ * P->inv4d = set_fwd_inv;
+ * 
+ * so {@code +proj=set +v_1=10} sets {@code v_1} to 10 going either way. It is + * therefore not an invertible operation in the mathematical sense at all, and + * {@code 4D-API_cs2cs-style.gie:551-558} pins exactly that: the same definition, run + * {@code direction inverse}, is expected to produce {@code 10 20 30 40} again rather + * than restoring {@code 1 2 3 4}. Implementing {@code inverse} as an undo would fail + * that row while looking more correct. + * + *

Selection is by presence and the value is read separately + * ({@code pj_param_exists} then {@code pj_param("dv_1").f}), so a bare {@code +v_1} + * with no value sets the component to 0 rather than leaving it alone. + * + *

Both sides are {@link GieIoUnits#WHATEVER}: the operator does not care what the + * numbers mean. + * + *

Immutable apart from the overridable unit sides; safe to share. + * + * @since 1.5 + */ +final class SetOperator implements PipelineOperator { + + private static final String[] COMPONENT_KEYS = {"v_1", "v_2", "v_3", "v_4"}; + + private final boolean[] selected = new boolean[4]; + private final double[] value = new double[4]; + + private GieIoUnits left = GieIoUnits.WHATEVER; + private GieIoUnits right = GieIoUnits.WHATEVER; + + SetOperator(final ProjParams params) { + for (int i = 0; i < 4; i++) { + if (params.has(COMPONENT_KEYS[i])) { + selected[i] = true; + value[i] = params.doubleValue(COMPONENT_KEYS[i], 0.0); + } + } + } + + /** {@code set_fwd_inv}, which is both directions. */ + private void apply(final double[] coord) { + for (int i = 0; i < 4; i++) { + if (selected[i]) { + coord[i] = value[i]; + } + } + } + + @Override + public void forward(final double[] coord) { + apply(coord); + } + + @Override + public void inverse(final double[] coord) { + apply(coord); + } + + @Override + public GieIoUnits declaredLeft() { + return left; + } + + @Override + public GieIoUnits declaredRight() { + return right; + } + + @Override + public void overrideUnits(final GieIoUnits newLeft, final GieIoUnits newRight) { + this.left = newLeft; + this.right = newRight; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + final StringBuilder sb = new StringBuilder("set"); + for (int i = 0; i < 4; i++) { + if (selected[i]) { + sb.append(" +").append(COMPONENT_KEYS[i]).append('=').append(value[i]); + } + } + return sb.toString(); + } + + @Override + public String toString() { + return "SetOperator[" + description() + ", left=" + left + ", right=" + right + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/StepEllipsoid.java b/core/src/main/java/org/locationtech/proj4j/pipeline/StepEllipsoid.java new file mode 100644 index 0000000..9b7e9b8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/StepEllipsoid.java @@ -0,0 +1,174 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Ellipsoid; + +/** + * {@code pj_ell_set} ({@code 9.8.1:src/ell_set.cpp:92-133}) reduced to what a + * non-projection operator needs: the pair {@code (a, es)}. + * + *

Why this is not {@code Proj4Parser}

+ * + *

{@link Cs2csOperator} gets its ellipsoid by building a whole + * {@code CoordinateReferenceSystem}, which is right for a projection because the + * projection is what it wants. {@code +proj=cart} and {@code +proj=deformation} are + * not projections and their parameter lists carry keys — {@code xy_grids}, + * {@code z_grids}, {@code dt} — that are outside {@code Proj4Keyword}'s allow-list, + * so handing the list to {@code Proj4Parser} risks an + * {@code UnsupportedParameterException} about a key that has nothing to do with the + * ellipsoid. Upstream has the same separation: {@code deformation} creates + * {@code +proj=cart +a=1} and then calls {@code pj_inherit_ellipsoid_def}, i.e. it + * copies {@code (a, es)} across rather than re-parsing. + * + *

The order, which is the whole content of the file

+ * + *

Verbatim from {@code ell_set.cpp}, and the first branch short-circuits + * everything: + * + *

+ * if (+R)  -> size only; es = 0; b = a.  ALL shape parameters are IGNORED.
+ * else       +ellps seeds a and es
+ *            +a (or +R) overrides the size
+ *            the FIRST present of rf, f, es, e, b overrides the shape
+ * 
+ * + *

{@code +ellps} plus a shape parameter is not a contradiction. + * {@code ell_set.cpp}'s own comment calls later shape and size parameters + * "modifiers for the built in ellipsoid definition", in accordance with historical + * PROJ behaviour, and there is no contradiction check anywhere in the file. So + * {@code +ellps=GRS80 +rf=300} is a valid ellipsoid with {@code f = 1/300}. + * + *

Spherification ({@code R_A}, {@code R_V}, {@code R_a}, {@code R_g}, + * {@code R_h}, {@code R_lat_a}, {@code R_lat_g}, {@code R_C}) is deliberately + * refused rather than ignored: no operator reached through this class is + * exercised with one anywhere in the corpus, and silently dropping it would change + * the radius by up to the flattening — kilometres — while reporting success. + * + *

Stateless; not instantiable. + */ +final class StepEllipsoid { + + private StepEllipsoid() { + throw new AssertionError("no instances"); + } + + /** The spherification keys, in {@code ellps_spherification}'s own order. */ + private static final String[] SPHERIFICATION = { + "R_A", "R_V", "R_a", "R_g", "R_h", "R_lat_a", "R_lat_g", "R_C", + }; + + /** + * Resolve {@code (a, es)} for one step. + * + * @param registry resolves {@code +ellps=} names + * @param params the step's fully expanded parameter list + * @return {@code {a, es}} + * @throws PipelineDefinitionException on an unknown {@code +ellps}, a physically + * impossible shape, or a spherification request + */ + static double[] resolve(final Registry registry, final ProjParams params) { + for (int i = 0; i < SPHERIFICATION.length; i++) { + if (params.has(SPHERIFICATION[i])) { + throw new PipelineDefinitionException(PipelineErrorCode.NOT_IMPLEMENTED_HERE, + "+" + SPHERIFICATION[i] + ": spherification of a non-projection " + + "operator's ellipsoid is not implemented, and ignoring it would " + + "change the radius by up to the flattening"); + } + } + + // ell_set.cpp:96-103. +R is size-only and wins outright: every shape parameter + // is ignored, not merged. + if (params.has("R")) { + final double r = positive(params, "R"); + return new double[] {r, 0.0}; + } + + double a = Double.NaN; + double es = Double.NaN; + + final String ellps = params.value("ellps"); + if (ellps != null && !ellps.isEmpty()) { + final Ellipsoid e = registry.getEllipsoid(ellps); + if (e == null) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "unknown +ellps=" + ellps); + } + a = e.getEquatorRadius(); + es = e.getEccentricitySquared(); + } + + if (params.has("a")) { + a = positive(params, "a"); + } + + // ellps_shape: the FIRST present of these five wins, in this order. + if (params.has("rf")) { + final double rf = params.doubleValue("rf", Double.NaN); + if (!(rf > 0)) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+rf must be positive, got " + rf); + } + es = flatteningToEs(1.0 / rf); + } else if (params.has("f")) { + final double f = params.doubleValue("f", Double.NaN); + if (!(f >= 0)) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+f must not be negative, got " + f); + } + es = flatteningToEs(f); + } else if (params.has("es")) { + es = params.doubleValue("es", Double.NaN); + } else if (params.has("e")) { + final double e = params.doubleValue("e", Double.NaN); + es = e * e; + } else if (params.has("b")) { + final double b = positive(params, "b"); + if (Double.isNaN(a)) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "+b without a major axis"); + } + // Two steps, not es = 1 - b*b/(a*a): ell_set.cpp goes via the flattening, + // and the two differ in the last bits. + es = flatteningToEs((a - b) / a); + } + + if (Double.isNaN(a)) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "no ellipsoid: none of +ellps, +a, +R was given"); + } + if (Double.isNaN(es) || es < 0 || es >= 1) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "invalid eccentricity: es = " + es); + } + return new double[] {a, es}; + } + + /** {@code es = 2f - f*f}. */ + private static double flatteningToEs(final double f) { + return 2 * f - f * f; + } + + private static double positive(final ProjParams params, final String key) { + final double v = params.doubleValue(key, Double.NaN); + if (!(v > 0)) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "+" + key + " must be positive, got " + v); + } + return v; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/TimeGatedOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/TimeGatedOperator.java new file mode 100644 index 0000000..18ba149 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/TimeGatedOperator.java @@ -0,0 +1,190 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * The {@code +t_epoch} / {@code +t_final} time bracket shared by + * {@code +proj=hgridshift} and {@code +proj=vgridshift} + * ({@code 9.8.1:src/transformations/hgridshift.cpp:74-125}, + * {@code vgridshift.cpp} — upstream's own {@code TODO} says "Refactor into shared + * function that can be used by both vgridshift and hgridshift", and this is that + * function). + * + *

The condition, which is not a range test

+ * + *
+ * if (t_final == 0 || t_epoch == 0)          -> always apply
+ * else if (t < t_epoch && t_final > t_epoch) -> apply
+ * else                                        -> pass the coordinate through unchanged
+ * 
+ * + *

Three things about that are easy to get wrong and all three are exercised by + * {@code deformation.gie}: + * + *

    + *
  • It is one-sided. The coordinate's epoch must be before + * {@code t_epoch}; there is no upper bound on how far before. {@code t_final} only + * appears in the sanity check {@code t_final > t_epoch}, never compared against + * {@code t}. So with {@code +t_epoch=2010 +t_final=2018}, an observation at 2000 + * is transformed and one at 2011 and one at 2019 are not.
  • + *
  • Zero is the sentinel for "unset", not a year. {@code Q->t_final} and + * {@code Q->t_epoch} are default-initialised to {@code 0}, and either being zero + * disables the gate entirely rather than making it never fire. Using {@code NaN} + * as the sentinel instead would silently turn every gated operation into an + * ungated one.
  • + *
  • An unspecified {@code t} is 0, not "missing". gie's {@code parse_coord} + * zero-fills, so {@code accept 12 56 0.0} arrives with {@code t = 0}, which is + * less than any real {@code t_epoch} and therefore does get the shift. + * That is why {@code deformation.gie}'s fourth {@code vgridshift} row expects the + * full -36.9960 m rather than an unchanged height.
  • + *
+ * + *

{@code +t_final=now}

+ * + *

{@code hgridshift.cpp:168-177}: {@code +t_final} is first read as a double, and + * only if that yields exactly 0 is the string compared against {@code "now"}. + * The value is then {@code 1900.0 + tm_year + tm_yday / 365.0} from {@code localtime} + * — note {@code 365.0} unconditionally, so a leap year's 31 December reads as + * {@code year + 1.0008}, and note {@code localtime} rather than {@code gmtime}, so the + * value depends on the host time zone. Both are reproduced: the corpus's + * {@code +t_final=now} rows assert only that the bracket is open for an observation at + * 2000 and closed for one at 2011, which any plausible "now" satisfies, so fidelity + * here costs nothing and a divergence would be a latent trap. + * + *

The wrapper delegates its unit sides and its invertibility to the operator it + * wraps, so it is invisible to {@link PipelineFactory}'s continuity check. + * + * @since 1.5 + */ +final class TimeGatedOperator implements PipelineOperator { + + private final PipelineOperator delegate; + private final double tEpoch; + private final double tFinal; + + private TimeGatedOperator(final PipelineOperator delegate, final double tEpoch, + final double tFinal) { + this.delegate = delegate; + this.tEpoch = tEpoch; + this.tFinal = tFinal; + } + + /** + * Wrap {@code delegate} iff the step actually carries a bracket. + * + * @param delegate the operator to gate + * @param params the step's fully expanded parameter list + * @return {@code delegate} itself when neither {@code +t_epoch} nor {@code +t_final} + * is present or either resolves to 0, otherwise the gated wrapper + */ + static PipelineOperator wrap(final PipelineOperator delegate, final ProjParams params) { + final double tFinal = readTFinal(params); + final double tEpoch = params.has("t_epoch") + ? params.doubleValue("t_epoch", 0.0) + : 0.0; + if (tFinal == 0.0 || tEpoch == 0.0) { + // The gate would be a no-op; do not pay for it, and do not pretend the + // operation is time-dependent when upstream's own test says it is not. + return delegate; + } + return new TimeGatedOperator(delegate, tEpoch, tFinal); + } + + /** {@code hgridshift.cpp:164-178}: a number first, then the literal {@code now}. */ + private static double readTFinal(final ProjParams params) { + if (!params.has("t_final")) { + return 0.0; + } + final String raw = params.value("t_final"); + if (raw != null && !raw.isEmpty()) { + double asNumber; + try { + asNumber = Double.parseDouble(raw.trim()); + } catch (final NumberFormatException e) { + // pj_param type 'd' is pj_atof, which returns 0 rather than failing. + asNumber = 0.0; + } + if (asNumber != 0.0) { + return asNumber; + } + if ("now".equals(raw)) { + return decimalYearNow(); + } + } + return 0.0; + } + + /** {@code 1900.0 + date->tm_year + date->tm_yday / 365.0}, from {@code localtime}. */ + private static double decimalYearNow() { + final Calendar now = new GregorianCalendar(); + // tm_year is years since 1900; tm_yday is 0-based, where DAY_OF_YEAR is 1-based. + return now.get(Calendar.YEAR) + (now.get(Calendar.DAY_OF_YEAR) - 1) / 365.0; + } + + /** @return whether the bracket is open for an observation at {@code t}. */ + private boolean applies(final double t) { + return t < tEpoch && tFinal > tEpoch; + } + + @Override + public GieIoUnits declaredLeft() { + return delegate.declaredLeft(); + } + + @Override + public GieIoUnits declaredRight() { + return delegate.declaredRight(); + } + + @Override + public void overrideUnits(final GieIoUnits left, final GieIoUnits right) { + delegate.overrideUnits(left, right); + } + + @Override + public void forward(final double[] coord) { + if (applies(coord[3])) { + delegate.forward(coord); + } + } + + @Override + public void inverse(final double[] coord) { + if (applies(coord[3])) { + delegate.inverse(coord); + } + } + + @Override + public boolean hasInverse() { + return delegate.hasInverse(); + } + + @Override + public String description() { + return delegate.description() + " t_epoch=" + tEpoch + " t_final=" + tFinal; + } + + @Override + public String toString() { + return "TimeGatedOperator[" + description() + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/TinShiftOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/TinShiftOperator.java new file mode 100644 index 0000000..5d41b0d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/TinShiftOperator.java @@ -0,0 +1,202 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceResolvers; +import org.locationtech.proj4j.resource.Resources; + +/** + * {@code +proj=tinshift} — a triangulation-based transformation, ported from + * {@code 9.8.1:src/transformations/tinshift.cpp} and + * {@code tinshift_impl.hpp}. The numerics live in {@link Triangulation}; this class is + * the parameter handling, the file read and the {@link PipelineOperator} contract. + * + *

{@code WHATEVER} on both sides, and why that matters to a comparator

+ * + *

{@code P->left} and {@code P->right} are both + * {@code PJ_IO_UNITS_WHATEVER} ({@code tinshift.cpp:130-131}), because a triangulation + * may be defined over geographic degrees or over projected metres and the file + * does not say which in a form the operator acts on — {@code input_crs} and + * {@code output_crs} are metadata, and upstream reads them without using them. + * + *

The consequence is deliberate and must not be "fixed": a gie tolerance written in + * metres is compared against a Euclidean distance in whatever units the file uses. For + * {@code tinshift_crs_implicit.json}, whose vertices are degrees, that means + * {@code accept 2 49 / expect 2.1 49.1} is measured as a Euclidean distance of about + * {@code 0.1414} against a default tolerance of {@code 0.5}, and passes — not because + * the shift is within 14 cm but because the comparator is not measuring metres. This is + * exactly the {@code grad} situation {@link PipelineUnits} documents. + * + *

A finite point outside the triangulation is a failure, not a pass-through

+ * + *

Upstream returns {@code proj_coord_error()} — an all-{@code HUGE_VAL} coordinate — + * and {@code tinshift.gie} asserts exactly that for {@code (0, 0)} in both directions. + * Here it is a throw carrying {@link ErrorCause#COORDINATE_OUTSIDE_GRID}, which the + * comparator scores identically and a caller can act on. What is not done is + * returning the input unchanged: with {@code fallback_strategy: none} that is the + * difference between "this coordinate is outside the model" and "the model says the + * shift here is zero", and the two are hundreds of metres apart. + * + *

Reading the file

+ * + *

Through the deterministic resolver chain, never the working directory, and with + * upstream's own 100 MB ceiling ({@code tinshift.cpp:98-104}) — the file is named by a + * proj-string that may have come from row data, so an unbounded read is a denial of + * service. The bytes are decoded as UTF-8; RFC 8259 mandates UTF-8 for JSON exchanged + * between systems, and every model file in the corpus is ASCII. + * + *

Immutable after construction; safe to share. + * + * @since 1.5 + */ +final class TinShiftOperator implements PipelineOperator { + + /** {@code 100 * 1024 * 1024} — upstream's ceiling, for upstream's stated reason. */ + private static final long MAX_MODEL_BYTES = 100L * 1024L * 1024L; + + private final String file; + private final Triangulation triangulation; + + private TinShiftOperator(final String file, final Triangulation triangulation) { + this.file = file; + this.triangulation = triangulation; + } + + /** + * Resolve {@code +file=} and parse it. + * + * @param fileName the {@code +file=} value + * @return the operator + * @throws PipelineDefinitionException {@code MISSING_ARG} when {@code +file} is + * absent, {@code FILE_NOT_FOUND_OR_INVALID} + * when it cannot be read or is not a valid + * triangulation + */ + static TinShiftOperator fromFile(final String fileName) { + if (fileName == null || fileName.isEmpty()) { + throw new PipelineDefinitionException(PipelineErrorCode.MISSING_ARG, + "+file= should be specified."); + } + return new TinShiftOperator(fileName, Triangulation.parse(read(fileName))); + } + + private static String read(final String fileName) { + final ChainedResourceResolver chain = ResourceResolvers.resolver(); + final ResourceHandle handle; + try { + handle = chain.resolve(fileName); + } catch (final IOException e) { + throw new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "Cannot open " + fileName + ": " + e.getMessage(), e); + } + if (handle == null) { + throw new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "Cannot open " + fileName + ". Resolution chain was " + chain.name() + + "; the working directory is deliberately not searched."); + } + final byte[] bytes; + try { + bytes = Resources.readAll(handle, MAX_MODEL_BYTES); + } catch (final IOException e) { + throw new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "Cannot read " + fileName + ": " + e.getMessage(), e); + } + try { + return new String(bytes, "UTF-8"); + } catch (final UnsupportedEncodingException e) { + // Unreachable: every JVM is required to support UTF-8. + throw new PipelineDefinitionException(PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, + "Cannot decode " + fileName + " as UTF-8", e); + } + } + + /** @return the {@code +file=} value as written. */ + String file() { + return file; + } + + /** @return the parsed model, for tests and diagnostics. */ + Triangulation triangulation() { + return triangulation; + } + + /** {@code P->left = PJ_IO_UNITS_WHATEVER} ({@code tinshift.cpp:130}). */ + @Override + public GieIoUnits declaredLeft() { + return GieIoUnits.WHATEVER; + } + + /** {@code P->right = PJ_IO_UNITS_WHATEVER} ({@code tinshift.cpp:131}). */ + @Override + public GieIoUnits declaredRight() { + return GieIoUnits.WHATEVER; + } + + /** + * A triangulation's units are a property of its vertices, not of its neighbours, so + * a neighbour's opinion is recorded nowhere and changes nothing. Upstream has the + * same property: {@code pipeline.cpp}'s propagation writes {@code P->left} and + * {@code P->right}, which {@code tinshift} never reads. + */ + @Override + public void overrideUnits(final GieIoUnits left, final GieIoUnits right) { + // no-op, deliberately + } + + @Override + public void forward(final double[] coord) { + if (!triangulation.forward(coord)) { + throw outside(coord); + } + } + + @Override + public void inverse(final double[] coord) { + if (!triangulation.inverse(coord)) { + throw outside(coord); + } + } + + private CrsTransformException outside(final double[] coord) { + return new CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID, + "(" + coord[0] + ", " + coord[1] + ") is outside every triangle of +file=" + + file + " (" + triangulation.triangleCount() + " triangles, " + + "fallback_strategy=" + triangulation.fallbackStrategy() + ")"); + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return "tinshift file=" + file; + } + + @Override + public String toString() { + return "TinShiftOperator[" + description() + ", " + triangulation + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/Triangulation.java b/core/src/main/java/org/locationtech/proj4j/pipeline/Triangulation.java new file mode 100644 index 0000000..00a2b2c --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/Triangulation.java @@ -0,0 +1,594 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import java.util.List; +import java.util.Map; + +/** + * A parsed {@code triangulation_file}, and the barycentric evaluator over it — + * {@code 9.8.1:src/transformations/tinshift_impl.hpp}'s {@code TINShiftFile} and + * {@code Evaluator} in one class. + * + *

The data layout, which the whole file depends on

+ * + *

Vertices are flattened into one {@code double[]} of {@code columnCount} values + * each, and {@code columnCount} is derived, not read + * ({@code tinshift_impl.hpp:265-269}): + * + *

+ * 2                       source_x, source_y
+ * + 2 if horizontal       target_x, target_y
+ * + 1 if vertical         the z OFFSET
+ * 
+ * + *

So the interior column indices are fixed at 0,1 (source), 2,3 (target) and + * either 2 or 4 (z offset) regardless of what order {@code vertices_columns} declared + * them in — the declared order is used once, while reading, to pick values out of each + * input row. + * + *

The z column is always an offset, even when the file declares + * {@code source_z} and {@code target_z} instead of {@code offset_z}: those two are + * differenced on the way in ({@code targetZ - sourceZ}). Storing them separately and + * differencing at evaluation time would give the same answer for a single vertex but a + * different one after interpolation, because the barycentric weights would then be + * applied to two rounded quantities instead of one. + * + *

Point location: a linear scan, deliberately

+ * + *

Upstream indexes triangles in a quadtree and iterates only the ones whose + * bounding box contains the query point. The quadtree is a pre-filter: every + * candidate still goes through the same barycentric test, and a triangle the quadtree + * excludes cannot contain the point. So a linear scan returns the same triangle, and it + * is what {@code FindTriangle} itself does when {@code USE_QUADTREE} is not defined — + * upstream keeps both paths in the file. + * + *

One consequence is worth stating rather than discovering: the two scans visit + * candidates in a different order, so for a point lying inside two triangles + * within {@code EPS} — i.e. on a shared edge — the triangle chosen may differ. Since + * both triangles interpolate to the same value along their shared edge to within + * {@code EPS}, this cannot change an answer by more than the tolerance. Indexing is a + * performance question and belongs with the rest of the compiled-pipeline work. + * + *

{@code EPS} is 1e-10 and it is not a distance

+ * + *

The containment test is on the barycentric coordinates: + * {@code lambda1} and {@code lambda2} each in {@code [-EPS, 1+EPS]} and + * {@code lambda3 = 1 - lambda1 - lambda2} at least {@code 0} — note the third has + * no {@code EPS} slack, which is upstream's asymmetry and is preserved. + * + *

Fallback strategies

+ * + *

{@code fallback_strategy} requires {@code format_version} exactly {@code "1.1"}; + * declaring one under {@code 1.0} is a parse error, not a warning. When no triangle + * contains the point and a strategy is set, the nearest triangle is used and + * its barycentric coordinates are extrapolated — so {@code lambda} values outside + * {@code [0,1]} are expected on that path, and the result is an extrapolation rather + * than an interpolation. {@code nearest_side} measures point-to-segment distance to all + * three sides (upstream's comment explains why all three: the winding order is + * unknown); {@code nearest_centroid} measures to the centroid. Degenerate triangles are + * skipped. + * + *

The AABB rejection inside the fallback loop + * ({@code tinshift_impl.hpp:495-501}) uses {@code closest_dist}, the square + * root of the best squared distance so far, against un-squared coordinate ranges. + * That is correct and is transcribed as written. + * + *

Immutable after construction; the evaluator keeps all state in locals, so one + * instance may be shared. + * + * @since 1.5 + */ +final class Triangulation { + + /** {@code constexpr double EPS = 1e-10}. */ + private static final double EPS = 1e-10; + + /** {@code FALLBACK_NONE}: a point outside every triangle is an error. */ + static final int FALLBACK_NONE = 0; + + /** {@code FALLBACK_NEAREST_SIDE}. */ + static final int FALLBACK_NEAREST_SIDE = 1; + + /** {@code FALLBACK_NEAREST_CENTROID}. */ + static final int FALLBACK_NEAREST_CENTROID = 2; + + private final boolean horizontal; + private final boolean vertical; + private final int columnCount; + private final double[] vertices; + private final int[] triangles; + private final int fallbackStrategy; + private final String inputCrs; + private final String outputCrs; + + private Triangulation(final boolean horizontal, final boolean vertical, + final int columnCount, final double[] vertices, + final int[] triangles, final int fallbackStrategy, + final String inputCrs, final String outputCrs) { + this.horizontal = horizontal; + this.vertical = vertical; + this.columnCount = columnCount; + this.vertices = vertices; + this.triangles = triangles; + this.fallbackStrategy = fallbackStrategy; + this.inputCrs = inputCrs; + this.outputCrs = outputCrs; + } + + /** @return whether {@code transformed_components} contained {@code "horizontal"}. */ + boolean transformsHorizontal() { + return horizontal; + } + + /** @return whether {@code transformed_components} contained {@code "vertical"}. */ + boolean transformsVertical() { + return vertical; + } + + /** @return {@code input_crs}, or the empty string. Informational; never acted on. */ + String inputCrs() { + return inputCrs; + } + + /** @return {@code output_crs}, or the empty string. Informational; never acted on. */ + String outputCrs() { + return outputCrs; + } + + /** @return one of the three {@code FALLBACK_*} constants. */ + int fallbackStrategy() { + return fallbackStrategy; + } + + /** @return the number of triangles. */ + int triangleCount() { + return triangles.length / 3; + } + + // ------------------------------------------------------------------- parsing + + /** + * {@code TINShiftFile::parse} ({@code tinshift_impl.hpp:78-378}). + * + * @param text the JSON document + * @return the parsed triangulation + * @throws PipelineDefinitionException {@code FILE_NOT_FOUND_OR_INVALID} on any + * structural problem, which is the single error + * PROJ raises for a model it cannot read + */ + static Triangulation parse(final String text) { + final Map j = + PipelineJson.asObject(PipelineJson.parse(text), "the model"); + + final String fileType = PipelineJson.requiredString(j, "file_type"); + final String formatVersion = PipelineJson.requiredString(j, "format_version"); + // Upstream reads file_type without checking it, so a "deformation_model_master_file" + // reaches the triangulation reader and fails on a missing "vertices_columns". The + // check is added here only as a better message; the outcome is the same error. + if (!"triangulation_file".equals(fileType)) { + throw PipelineJson.invalid("file_type is \"" + fileType + + "\", not \"triangulation_file\""); + } + + int fallback = FALLBACK_NONE; + if (j.containsKey("fallback_strategy")) { + if (!"1.1".equals(formatVersion)) { + throw PipelineJson.invalid("fallback_strategy needs format_version 1.1"); + } + final String name = PipelineJson.optionalString(j, "fallback_strategy"); + if ("nearest_side".equals(name)) { + fallback = FALLBACK_NEAREST_SIDE; + } else if ("nearest_centroid".equals(name)) { + fallback = FALLBACK_NEAREST_CENTROID; + } else if (!"none".equals(name)) { + throw PipelineJson.invalid("invalid fallback_strategy"); + } + } + + final String inputCrs = PipelineJson.optionalString(j, "input_crs"); + final String outputCrs = PipelineJson.optionalString(j, "output_crs"); + + boolean horizontal = false; + boolean vertical = false; + final List components = PipelineJson.requiredArray(j, "transformed_components"); + for (int i = 0; i < components.size(); i++) { + final Object c = components.get(i); + if (!(c instanceof String)) { + throw PipelineJson.invalid("transformed_components[] item is not a string"); + } + if ("horizontal".equals(c)) { + horizontal = true; + } else if ("vertical".equals(c)) { + vertical = true; + } else { + throw PipelineJson.invalid("transformed_components[] = " + c + + " is not handled"); + } + } + + final List verticesColumns = PipelineJson.requiredArray(j, "vertices_columns"); + int sourceXCol = -1; + int sourceYCol = -1; + int sourceZCol = -1; + int targetXCol = -1; + int targetYCol = -1; + int targetZCol = -1; + int offsetZCol = -1; + for (int i = 0; i < verticesColumns.size(); i++) { + final Object c = verticesColumns.get(i); + if (!(c instanceof String)) { + throw PipelineJson.invalid("vertices_columns[] item is not a string"); + } + final String name = (String) c; + if ("source_x".equals(name)) { + sourceXCol = i; + } else if ("source_y".equals(name)) { + sourceYCol = i; + } else if ("source_z".equals(name)) { + sourceZCol = i; + } else if ("target_x".equals(name)) { + targetXCol = i; + } else if ("target_y".equals(name)) { + targetYCol = i; + } else if ("target_z".equals(name)) { + targetZCol = i; + } else if ("offset_z".equals(name)) { + offsetZCol = i; + } + } + if (sourceXCol < 0) { + throw PipelineJson.invalid("source_x must be specified in vertices_columns[]"); + } + if (sourceYCol < 0) { + throw PipelineJson.invalid("source_y must be specified in vertices_columns[]"); + } + if (horizontal && targetXCol < 0) { + throw PipelineJson.invalid("target_x must be specified in vertices_columns[]"); + } + if (horizontal && targetYCol < 0) { + throw PipelineJson.invalid("target_y must be specified in vertices_columns[]"); + } + if (vertical && offsetZCol < 0) { + if (sourceZCol < 0) { + throw PipelineJson.invalid( + "source_z or delta_z must be specified in vertices_columns[]"); + } + if (targetZCol < 0) { + throw PipelineJson.invalid("target_z must be specified in vertices_columns[]"); + } + } + + final List trianglesColumns = PipelineJson.requiredArray(j, "triangles_columns"); + int idx1Col = -1; + int idx2Col = -1; + int idx3Col = -1; + for (int i = 0; i < trianglesColumns.size(); i++) { + final Object c = trianglesColumns.get(i); + if (!(c instanceof String)) { + throw PipelineJson.invalid("triangles_columns[] item is not a string"); + } + if ("idx_vertex1".equals(c)) { + idx1Col = i; + } else if ("idx_vertex2".equals(c)) { + idx2Col = i; + } else if ("idx_vertex3".equals(c)) { + idx3Col = i; + } + } + if (idx1Col < 0) { + throw PipelineJson.invalid("idx_vertex1 must be specified in triangles_columns[]"); + } + if (idx2Col < 0) { + throw PipelineJson.invalid("idx_vertex2 must be specified in triangles_columns[]"); + } + if (idx3Col < 0) { + throw PipelineJson.invalid("idx_vertex3 must be specified in triangles_columns[]"); + } + + int columnCount = 2; + if (horizontal) { + columnCount += 2; + } + if (vertical) { + columnCount += 1; + } + + final List jVertices = PipelineJson.requiredArray(j, "vertices"); + final double[] flat = new double[columnCount * jVertices.size()]; + int at = 0; + for (int v = 0; v < jVertices.size(); v++) { + final List row = PipelineJson.asArray(jVertices.get(v), "vertices[] item"); + if (row.size() != verticesColumns.size()) { + throw PipelineJson.invalid( + "vertices[] item has not expected number of elements"); + } + flat[at++] = PipelineJson.asNumber(row.get(sourceXCol), "vertices[][] item"); + flat[at++] = PipelineJson.asNumber(row.get(sourceYCol), "vertices[][] item"); + if (horizontal) { + flat[at++] = PipelineJson.asNumber(row.get(targetXCol), "vertices[][] item"); + flat[at++] = PipelineJson.asNumber(row.get(targetYCol), "vertices[][] item"); + } + if (vertical) { + if (offsetZCol >= 0) { + flat[at++] = PipelineJson.asNumber(row.get(offsetZCol), "vertices[][] item"); + } else { + final double sourceZ = + PipelineJson.asNumber(row.get(sourceZCol), "vertices[][] item"); + final double targetZ = + PipelineJson.asNumber(row.get(targetZCol), "vertices[][] item"); + flat[at++] = targetZ - sourceZ; + } + } + } + + final List jTriangles = PipelineJson.requiredArray(j, "triangles"); + final int[] tri = new int[3 * jTriangles.size()]; + int t = 0; + for (int i = 0; i < jTriangles.size(); i++) { + final List row = PipelineJson.asArray(jTriangles.get(i), "triangles[] item"); + if (row.size() != trianglesColumns.size()) { + throw PipelineJson.invalid( + "triangles[] item has not expected number of elements"); + } + tri[t++] = vertexIndex(row.get(idx1Col), jVertices.size()); + tri[t++] = vertexIndex(row.get(idx2Col), jVertices.size()); + tri[t++] = vertexIndex(row.get(idx3Col), jVertices.size()); + } + + return new Triangulation(horizontal, vertical, columnCount, flat, tri, fallback, + inputCrs, outputCrs); + } + + private static int vertexIndex(final Object node, final int vertexCount) { + final int idx = PipelineJson.asIndex(node, "triangles[][] item"); + if (idx >= vertexCount) { + throw PipelineJson.invalid("Invalid value for a vertex index"); + } + return idx; + } + + // ---------------------------------------------------------------- evaluation + + /** + * {@code Evaluator::forward}. + * + * @param coord {@code {x, y, z, t}}, mutated in place + * @return whether a triangle was found; {@code false} is upstream's + * {@code proj_coord_error()} + */ + boolean forward(final double[] coord) { + final double[] lambda = new double[3]; + final int triangle = findTriangle(coord[0], coord[1], true, lambda); + if (triangle < 0) { + return false; + } + apply(coord, triangle, lambda, true); + return true; + } + + /** + * {@code Evaluator::inverse}. + * + * @param coord {@code {x, y, z, t}}, mutated in place + * @return whether a triangle was found + */ + boolean inverse(final double[] coord) { + final double[] lambda = new double[3]; + // Evaluator::inverse's own subtlety: a vertical-only file has no target x/y + // columns, so the point is located in the SOURCE geometry even on the inverse + // path (it reuses mQuadTreeForward). Locating it in the target geometry would + // index columns 2 and 3, which for such a file hold the z offset and nothing. + final boolean locateInSource = !horizontal && vertical; + final int triangle = findTriangle(coord[0], coord[1], locateInSource, lambda); + if (triangle < 0) { + return false; + } + apply(coord, triangle, lambda, false); + return true; + } + + private void apply(final double[] coord, final int triangle, final double[] lambda, + final boolean forward) { + final int i1 = triangles[3 * triangle] * columnCount; + final int i2 = triangles[3 * triangle + 1] * columnCount; + final int i3 = triangles[3 * triangle + 2] * columnCount; + if (horizontal) { + // Forward reads the target columns, inverse the source columns. + final int cx = forward ? 2 : 0; + final int cy = forward ? 3 : 1; + coord[0] = vertices[i1 + cx] * lambda[0] + vertices[i2 + cx] * lambda[1] + + vertices[i3 + cx] * lambda[2]; + coord[1] = vertices[i1 + cy] * lambda[0] + vertices[i2 + cy] * lambda[1] + + vertices[i3 + cy] * lambda[2]; + } + if (vertical) { + final int cz = horizontal ? 4 : 2; + final double offset = vertices[i1 + cz] * lambda[0] + + vertices[i2 + cz] * lambda[1] + vertices[i3 + cz] * lambda[2]; + coord[2] = forward ? coord[2] + offset : coord[2] - offset; + } + } + + /** + * {@code FindTriangle} ({@code tinshift_impl.hpp:427-560}). + * + * @param x the query abscissa + * @param y the query ordinate + * @param source locate in the source geometry (columns 0,1) rather than the target + * (columns 2,3) + * @param lambda filled with the three barycentric coordinates + * @return the triangle index, or {@code -1} + */ + private int findTriangle(final double x, final double y, final boolean source, + final double[] lambda) { + final int idxX = horizontal && !source ? 2 : 0; + final int idxY = horizontal && !source ? 3 : 1; + final int n = triangleCount(); + + for (int i = 0; i < n; i++) { + final int i1 = triangles[3 * i] * columnCount; + final int i2 = triangles[3 * i + 1] * columnCount; + final int i3 = triangles[3 * i + 2] * columnCount; + final double x1 = vertices[i1 + idxX]; + final double y1 = vertices[i1 + idxY]; + final double x2 = vertices[i2 + idxX]; + final double y2 = vertices[i2 + idxY]; + final double x3 = vertices[i3 + idxX]; + final double y3 = vertices[i3 + idxY]; + final double detT = (y2 - y3) * (x1 - x3) + (x3 - x2) * (y1 - y3); + final double l1 = ((y2 - y3) * (x - x3) + (x3 - x2) * (y - y3)) / detT; + final double l2 = ((y3 - y1) * (x - x3) + (x1 - x3) * (y - y3)) / detT; + if (l1 >= -EPS && l1 <= 1 + EPS && l2 >= -EPS && l2 <= 1 + EPS) { + final double l3 = 1 - l1 - l2; + // No EPS on lambda3. Upstream's asymmetry, preserved. + if (l3 >= 0) { + lambda[0] = l1; + lambda[1] = l2; + lambda[2] = l3; + return i; + } + } + } + + if (fallbackStrategy == FALLBACK_NONE) { + return -1; + } + return nearestTriangle(x, y, idxX, idxY, lambda); + } + + /** The {@code fallback_strategy} search, then extrapolation from the winner. */ + private int nearestTriangle(final double x, final double y, final int idxX, final int idxY, + final double[] lambda) { + double closestDist = Double.POSITIVE_INFINITY; + double closestDist2 = Double.POSITIVE_INFINITY; + int closest = 0; + final int n = triangleCount(); + + for (int i = 0; i < n; i++) { + final int i1 = triangles[3 * i] * columnCount; + final int i2 = triangles[3 * i + 1] * columnCount; + final int i3 = triangles[3 * i + 2] * columnCount; + final double x1 = vertices[i1 + idxX]; + final double y1 = vertices[i1 + idxY]; + final double x2 = vertices[i2 + idxX]; + final double y2 = vertices[i2 + idxY]; + final double x3 = vertices[i3 + idxX]; + final double y3 = vertices[i3 + idxY]; + + // AABB rejection against the best distance so far. Note closestDist is the + // root of closestDist2, compared against un-squared ranges: correct, and + // transcribed as upstream writes it. + if (x + closestDist < Math.min(x1, Math.min(x2, x3)) + || x - closestDist > Math.max(x1, Math.max(x2, x3)) + || y + closestDist < Math.min(y1, Math.min(y2, y3)) + || y - closestDist > Math.max(y1, Math.max(y2, y3))) { + continue; + } + + final double dist12 = squaredDistance(x1, y1, x2, y2); + final double dist23 = squaredDistance(x2, y2, x3, y3); + final double dist13 = squaredDistance(x1, y1, x3, y3); + if (dist12 < EPS || dist23 < EPS || dist13 < EPS) { + continue; + } + + if (fallbackStrategy == FALLBACK_NEAREST_SIDE) { + // All three sides: the winding order of the vertices is unknown, so + // there is no "the" nearest side to pick a priori. + double d2 = distanceToSegment(x, y, x1, y1, x2, y2, dist12); + if (d2 < closestDist2) { + closestDist2 = d2; + closestDist = Math.sqrt(d2); + closest = i; + } + d2 = distanceToSegment(x, y, x2, y2, x3, y3, dist23); + if (d2 < closestDist2) { + closestDist2 = d2; + closestDist = Math.sqrt(d2); + closest = i; + } + d2 = distanceToSegment(x, y, x1, y1, x3, y3, dist13); + if (d2 < closestDist2) { + closestDist2 = d2; + closestDist = Math.sqrt(d2); + closest = i; + } + } else { + final double cx = (x1 + x2 + x3) / 3.0; + final double cy = (y1 + y2 + y3) / 3.0; + final double d2 = squaredDistance(x, y, cx, cy); + if (d2 < closestDist2) { + closestDist2 = d2; + closestDist = Math.sqrt(d2); + closest = i; + } + } + } + + if (Double.isInfinite(closestDist)) { + // An empty triangle list, or only degenerate triangles. + return -1; + } + + final int i1 = triangles[3 * closest] * columnCount; + final int i2 = triangles[3 * closest + 1] * columnCount; + final int i3 = triangles[3 * closest + 2] * columnCount; + final double x1 = vertices[i1 + idxX]; + final double y1 = vertices[i1 + idxY]; + final double x2 = vertices[i2 + idxX]; + final double y2 = vertices[i2 + idxY]; + final double x3 = vertices[i3 + idxX]; + final double y3 = vertices[i3 + idxY]; + final double detT = (y2 - y3) * (x1 - x3) + (x3 - x2) * (y1 - y3); + if (Math.abs(detT) < EPS) { + return -1; + } + lambda[0] = ((y2 - y3) * (x - x3) + (x3 - x2) * (y - y3)) / detT; + lambda[1] = ((y3 - y1) * (x - x3) + (x1 - x3) * (y - y3)) / detT; + lambda[2] = 1 - lambda[0] - lambda[1]; + return closest; + } + + private static double squaredDistance(final double x1, final double y1, + final double x2, final double y2) { + final double dx = x1 - x2; + final double dy = y1 - y2; + return dx * dx + dy * dy; + } + + /** {@code distance_point_segment}: squared distance, with {@code dist12} pre-squared. */ + private static double distanceToSegment(final double x, final double y, + final double x1, final double y1, + final double x2, final double y2, + final double dist12) { + final double t = ((x - x1) * (x2 - x1) + (y - y1) * (y2 - y1)) / dist12; + if (t <= 0.0) { + return squaredDistance(x, y, x1, y1); + } + if (t >= 1.0) { + return squaredDistance(x, y, x2, y2); + } + return squaredDistance(x, y, x1 + t * (x2 - x1), y1 + t * (y2 - y1)); + } + + @Override + public String toString() { + return "Triangulation[" + (vertices.length / columnCount) + " vertices, " + + triangleCount() + " triangles, horizontal=" + horizontal + + ", vertical=" + vertical + ", fallback=" + fallbackStrategy + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/UnitConvertOperator.java b/core/src/main/java/org/locationtech/proj4j/pipeline/UnitConvertOperator.java new file mode 100644 index 0000000..5cb0111 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/UnitConvertOperator.java @@ -0,0 +1,198 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=unitconvert} ({@code 9.8.1:src/conversions/unitconvert.cpp}), the + * spatial half. + * + *

Supports {@code +xy_in}, {@code +xy_out}, {@code +z_in} and {@code +z_out}, + * each taking either a unit id from {@link PipelineUnits} or a raw numeric factor. + * Conversion goes through a pivot unit — metres for linear, radians for angular — + * so a single multiplier suffices: + * + *

+ * xy_factor  = factor(xy_in) / factor(xy_out)
+ * forward:  xy *= xy_factor      inverse:  xy /= xy_factor
+ * 
+ * + *

Deliberately absent: {@code +t_in}/{@code +t_out}

+ * + *

Time-unit conversion needs the modified-Julian-date pivot and PROJ's eleven + * time formats. No GIGS file and no geographic gie file uses one, and a pipeline + * engine that silently ignored a time unit it was asked for would produce a wrong + * answer rather than a refusal — so a {@code +t_in} or {@code +t_out} is rejected + * as unimplemented instead. + * + *

The unit domain, which is what the gie comparator branches on

+ * + *

{@code P->left} and {@code P->right} start {@link GieIoUnits#WHATEVER} and are + * raised to {@code RADIANS} or {@code DEGREES} only when the corresponding + * normalised unit name is exactly {@code "Radian"} or {@code "Degree"}. {@code grad} + * normalises to {@code "Grad"} and therefore raises neither. See + * {@link PipelineUnits} for why that is load bearing rather than a curiosity. + * + *

PROJ also rejects mixing a linear with an angular unit across a single pair + * ({@code unitconvert.cpp:517-523}), which is reproduced. + * + *

Not immutable only because {@link #overrideUnits} exists; safe to use from one + * thread at a time, like every other operator here. + */ +final class UnitConvertOperator implements PipelineOperator { + + private final double xyFactor; + private final double zFactor; + private final String description; + + private GieIoUnits left; + private GieIoUnits right; + + UnitConvertOperator(final ProjParams params) { + double xy = 1.0; + double z = 1.0; + GieIoUnits l = GieIoUnits.WHATEVER; + GieIoUnits r = GieIoUnits.WHATEVER; + + if (params.has("t_in") || params.has("t_out")) { + throw new PipelineDefinitionException(PipelineErrorCode.NOT_IMPLEMENTED_HERE, + "+proj=unitconvert with a time unit: the modified-Julian-date pivot and " + + "PROJ's eleven time formats are not implemented, and running " + + "without the conversion would silently produce a wrong answer"); + } + + int xyInLinear = -1; + int xyOutLinear = -1; + int zInLinear = -1; + int zOutLinear = -1; + + if (params.has("xy_in")) { + final PipelineUnits.Resolution u = resolve(params, "xy_in"); + xy = u.factor(); + xyInLinear = u.linear(); + l = domainOf(u.normalisedName(), l); + } + if (params.has("xy_out")) { + final PipelineUnits.Resolution u = resolve(params, "xy_out"); + xy /= u.factor(); + xyOutLinear = u.linear(); + r = domainOf(u.normalisedName(), r); + } + if (xyInLinear >= 0 && xyOutLinear >= 0 && xyInLinear != xyOutLinear) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "inconsistent unit type between xy_in and xy_out"); + } + + if (params.has("z_in")) { + final PipelineUnits.Resolution u = resolve(params, "z_in"); + z = u.factor(); + zInLinear = u.linear(); + } + if (params.has("z_out")) { + final PipelineUnits.Resolution u = resolve(params, "z_out"); + z /= u.factor(); + zOutLinear = u.linear(); + } + if (zInLinear >= 0 && zOutLinear >= 0 && zInLinear != zOutLinear) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "inconsistent unit type between z_in and z_out"); + } + + this.xyFactor = xy; + this.zFactor = z; + this.left = l; + this.right = r; + this.description = "unitconvert xy_in=" + params.value("xy_in") + + " xy_out=" + params.value("xy_out"); + } + + /** + * A unit id, or — when the id is unknown to both tables — the same token read + * as a raw {@code double}. PROJ tries {@code pj_param(...,"d")} as a + * fallback and errors only when that yields 0 or a value whose reciprocal is 0 + * ({@code unitconvert.cpp:472-479}), i.e. zero or infinite. + */ + private static PipelineUnits.Resolution resolve(final ProjParams params, final String key) { + final String id = params.value(key); + final PipelineUnits.Resolution known = PipelineUnits.resolve(id); + if (known.isKnown()) { + return known; + } + final double factor = params.doubleValue(key, 0.0); + if (factor == 0.0 || 1.0 / factor == 0.0) { + throw new PipelineDefinitionException(PipelineErrorCode.ILLEGAL_ARG_VALUE, + "unknown " + key + " unit: " + id); + } + return PipelineUnits.Resolution.rawFactor(factor); + } + + private static GieIoUnits domainOf(final String normalisedName, final GieIoUnits fallback) { + if ("Radian".equals(normalisedName)) { + return GieIoUnits.RADIANS; + } + if ("Degree".equals(normalisedName)) { + return GieIoUnits.DEGREES; + } + return fallback; + } + + @Override + public GieIoUnits declaredLeft() { + return left; + } + + @Override + public GieIoUnits declaredRight() { + return right; + } + + @Override + public void overrideUnits(final GieIoUnits newLeft, final GieIoUnits newRight) { + this.left = newLeft; + this.right = newRight; + } + + @Override + public void forward(final double[] coord) { + coord[0] *= xyFactor; + coord[1] *= xyFactor; + coord[2] *= zFactor; + } + + @Override + public void inverse(final double[] coord) { + coord[0] /= xyFactor; + coord[1] /= xyFactor; + coord[2] /= zFactor; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return description; + } + + @Override + public String toString() { + return "UnitConvertOperator[" + description + ", xy*" + xyFactor + ", left=" + left + + ", right=" + right + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/pipeline/package-info.java b/core/src/main/java/org/locationtech/proj4j/pipeline/package-info.java new file mode 100644 index 0000000..23d6cf4 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/pipeline/package-info.java @@ -0,0 +1,104 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A minimal {@code +proj=pipeline} engine. + * + *

What this is for

+ * + *

PROJ 6 replaced "source CRS, target CRS, hope" with an explicit ordered + * pipeline of operations, and the IOGP GIGS conformance suite is written entirely in + * that form: each of its twenty test files is three {@code +proj=pipeline} strings + * of two or three steps. proj4j had no pipeline at all, so all 1,170 GIGS assertions + * were unreachable — not failing, just unrunnable. + * + *

This package is the smallest thing that runs them: + * + *

    + *
  • {@link org.locationtech.proj4j.pipeline.ProjParams} — PROJ's + * {@code paralist}, with the two lookup rules everything else depends on: + * first match wins, and lookup stops at the next {@code +step};
  • + *
  • {@link org.locationtech.proj4j.pipeline.PipelineFactory} — parses the string, + * expands {@code +init=} out of the legacy init files, and assembles the + * steps;
  • + *
  • {@link org.locationtech.proj4j.pipeline.Cs2csOperator} — a classic projection + * plus the hidden helper operations PROJ builds behind + * {@code +towgs84}, {@code +pm} and {@code +axis}. This is the crux: those + * helpers are what make a two-step pipeline of legacy {@code +init=} strings + * mean "local CRS, to the WGS84 hub, to another local CRS";
  • + *
  • {@link org.locationtech.proj4j.pipeline.Pipeline} — the assembled operation, + * reporting its i/o unit domains the way {@code pipeline.cpp} computes them, + * because a conformance comparator picks its distance metric from exactly + * that.
  • + *
+ * + *

What this deliberately is not

+ * + *

Not PROJ's 4D model. There is no {@code PJ_COORD} union, no + * {@code push}/{@code pop}/{@code set} stack, the time ordinate is carried rather + * than transformed, and {@code helmert} is not a user-facing operator — it exists + * only as the hidden helper described above. {@code +geoc}, time-unit conversion, + * {@code +proj=gridshift} and {@code +proj=defmodel} are refused rather than + * ignored: each of them changes the answer, and a pipeline that quietly dropped + * one would emit a plausible coordinate that is wrong by the size of the omitted + * step. + * + *

The shape has since been grown into, which is the evidence that it was the + * right shape: {@code cart}, {@code hgridshift}, {@code deformation} and + * {@code tinshift} were each added as a class implementing + * {@link org.locationtech.proj4j.pipeline.PipelineOperator} over a + * {@code double[4]}, with no change to that interface, to + * {@link org.locationtech.proj4j.pipeline.Pipeline} or to + * {@link org.locationtech.proj4j.pipeline.PipelineStep}. The + * {@code +t_epoch}/{@code +t_final} bracket that {@code hgridshift} and + * {@code vgridshift} share arrived the same way, as + * {@link org.locationtech.proj4j.pipeline.PipelineOperator} wrapping another — + * upstream's own {@code TODO} in {@code hgridshift.cpp} asks for exactly that + * factoring. + * + *

What remains refused, and why, is enumerated on + * {@link org.locationtech.proj4j.pipeline.PipelineFactory}, whose + * {@code handlesOperator} is also the routing contract a caller uses to decide that + * a bare {@code +proj=axisswap order=2,1} belongs here rather than on the + * {@code CRSFactory} path. + * + *

Reading the source

+ * + *

Every non-obvious line cites PROJ 9.8.1 by file and line. The upstream + * behaviours most easily "fixed" by accident, and which must not be: + * + *

    + *
  • a pipeline's global tokens are appended to each step's, not prepended, + * so a global shadows nothing and is shadowed by everything — which is how + * {@code +proj=pipeline +towgs84=0,0,0} switches off a double datum shift;
  • + *
  • {@code grad} normalises to neither {@code "Radian"} nor {@code "Degree"}, so a + * pipeline ending in {@code +xy_out=grad} reports {@code WHATEVER} units and its + * residuals are measured with a Euclidean metric on grad values against a + * tolerance written in metres;
  • + *
  • a pipeline with no global {@code +ellps} defaults to GRS80 where a bare + * operation defaults to WGS84.
  • + *
+ * + *

Thread safety

+ * + *

{@link org.locationtech.proj4j.pipeline.ProjParams} and the two numeric + * helpers are immutable. {@link org.locationtech.proj4j.pipeline.Pipeline} and its + * operators are not thread-safe, because they wrap mutable proj4j + * {@code Projection} instances. Build one pipeline per thread. + * + * @since 1.5 + */ +package org.locationtech.proj4j.pipeline; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AdamsHemisphereProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AdamsHemisphereProjection.java new file mode 100644 index 0000000..1120de0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/AdamsHemisphereProjection.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Adams hemisphere-in-a-square. The {@code ADAMS_HEMI} branch of + * {@code 9.8.1:src/projections/adams.cpp:157-172}, plus the 45-degree rotation at + * {@code adams.cpp:287-291}. + * + *

Same hemisphere-only domain as {@link GuyouProjection} — {@code |lam| - 1e-9 > pi/2} is + * rejected — and again 333 of {@code adams_hemi.gie}'s 703 assertions exist to prove it. + * + *

Two details separate it from the other four reductions: + * + *

    + *
  • Its second reduced angle is not an {@code aacos} result: {@code b = pi/2 - phi} + * directly. Nothing clamps it, and nothing needs to. + *
  • The sign flags are computed from {@code a} before {@code a} is replaced by its + * arc-cosine ({@code adams.cpp:167-169} reuses the variable). Reading them after would + * compare {@code sin(phi)} against an angle rather than against a cosine, which is a + * different predicate on roughly half the sphere. + *
+ * + *

The result is rotated 45 degrees, which is what turns the diamond the elliptic tail + * produces into an axis-aligned square. No inverse. + */ +public class AdamsHemisphereProjection extends AdamsProjection { + + private static final long serialVersionUID = 5078643111573894094L; + + @Override + protected ProjCoordinate projectRaw(double lam, double phi, ProjCoordinate dst) { + final double sp = FastStrictTrig.sin(phi); + if ((Math.abs(lam) - TOL) > HALF_PI) { + throw new ProjectionException( + "adams_hemi: |lam| exceeds pi/2; the projection covers one hemisphere only"); + } + double a = FastStrictTrig.cos(phi) * FastStrictTrig.sin(lam); + final boolean sm = (sp + a) < 0.; + final boolean sn = (sp - a) < 0.; + a = aacos(a); + final double b = HALF_PI - phi; + + ellipticTail(a, b, sm, sn, dst); + rotate45(dst); + return dst; + } + + @Override + public boolean hasInverse() { + return false; + } + + @Override + public String toString() { + return "Adams Hemisphere in a Square"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AdamsProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AdamsProjection.java new file mode 100644 index 0000000..f4c97d7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/AdamsProjection.java @@ -0,0 +1,348 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.EllipticIntegral; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Shared machinery for the five conformal projections that PROJ 9.8.1 implements in one + * file, {@code src/projections/adams.cpp}: {@code guyou}, {@code peirce_q}, + * {@code adams_hemi}, {@code adams_ws1} and {@code adams_ws2}. + * + *

Upstream is a single operator with a {@code projection_type} discriminant; here it is + * five classes over this base, so that {@link Projection#equals(Object)} — which compares + * {@code getClass()} — keeps them distinct in the transform cache, and so that + * {@link #hasInverse()} can differ per operator without a mode test. + * + *

The common tail — {@code adams.cpp:193-202}

+ * + *

All five reduce their input to a pair of angles {@code (a, b)} plus two sign flags, + * and then run the identical four lines implemented by + * {@link #ellipticTail(double, double, boolean, boolean, ProjCoordinate)}. The + * {@code min}/{@code max} clamps inside it are what keep both {@code sqrt} arguments in + * {@code [0, 1]}, so {@link #aasin} cannot trip its own domain check there however the + * cosines round. + * + *

What each subclass supplies

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
the five reductions, with {@code sp/cp = sin/cos(phi)} and + * {@code sl/cl = sin/cos(lam)}
operator{@code a}{@code b}{@code sm}{@code sn}after the tail
{@code guyou}{@code aacos((cp*sl - sp)*RSQRT2)}{@code aacos((cp*sl + sp)*RSQRT2)}{@code lam < 0}{@code phi < 0}
{@code peirce_q}{@code aacos(cp*(sl + cl)*RSQRT2)}{@code aacos(cp*(sl - cl)*RSQRT2)}{@code sl < 0}{@code cl > 0}quincuncial folding
{@code adams_hemi}{@code aacos(cp*sl)}{@code pi/2 - phi}{@code (sp + cp*sl) < 0}{@code (sp - cp*sl) < 0}rotate 45°
{@code adams_ws1}{@code aacos((t - s)*RSQRT2)}{@code aacos((t + s)*RSQRT2)}{@code lam < 0}{@code phi < 0}
{@code adams_ws2}{@code aacos(t)}{@code aacos(s)}{@code (s + t) < 0}{@code (s - t) < 0}rotate 45°
+ * + *

with {@code s = tan(phi/2)} and {@code t = cos(aasin(s)) * sin(lam/2)} for the two + * world-in-a-square variants. {@code tan(phi/2)} is exactly {@code +/-1} at + * {@code phi = +/-pi/2}, which is why neither of them needs a domain guard. + * + *

Why the host layer is reproduced here

+ * + *

PROJ applies {@code fwd_prepare} ({@code 9.8.1:src/fwd.cpp:40-80}) before any forward + * projection code runs, and for this family three of its steps change the answer rather + * than merely tidying it: + * + *

    + *
  1. {@code adjlon} into {@code (-pi, pi]} is load bearing, not cosmetic. + * {@code adams_ws1}/{@code adams_ws2} take {@code sin(lam/2)}, which has period + * {@code 4*pi}, and {@code peirce_q}'s fold branches compare {@code lam} against + * {@code +/-0.25*pi} and {@code +/-0.75*pi} directly. The corpus feeds longitudes up to + * {@code 180.96} degrees, so at {@code lam = 3.146} rad the un-wrapped and wrapped + * values give {@code sin(lam/2)} of {@code +0.99998} and {@code -0.99997} — opposite + * signs, not a rounding difference. + *
  2. The {@code |phi| - pi/2 > 1e-12} rejection, followed by clamping {@code phi} + * into {@code [-pi/2, pi/2]} for anything inside that slop. 245 of the six files' + * {@code expect failure} rows are this check and no projection's own logic. + *
  3. The {@code |lam| > 10} radian rejection. + *
+ * + *

{@code Projection.projectRadians} has no equivalent and is owned elsewhere, so the + * checks live in {@link #project(double, double, ProjCoordinate)} and apply to these six + * operators only — no existing projection's behaviour changes. The raw map, without any of + * it, is {@link #projectRaw}: that is the entry point the Newton inverse and + * {@link SpilhausProjection} use, because upstream's {@code pj_generic_inverse_2d} and + * {@code spilhaus_forward} both call {@code P->fwd} directly and bypass {@code fwd_prepare} + * too. + * + *

fdlibm trigonometry, and it is measurable here

+ * + *

Every {@code sin}, {@code cos} and {@code tan} in this family goes through + * {@link FastStrictTrig}, not {@link Math}. Those three are the methods HotSpot replaces with + * architecture-specific intrinsics, and they differ from fdlibm in the last bit. + * {@code FastStrictTrig} is a bit-identical, allocation-free transcription of the same + * fdlibm algorithm {@link StrictMath} uses; see its class documentation for why + * {@code StrictMath} itself is not called. + * + *

Normally a last-bit difference is far below any tolerance. Not here. Near the + * antimeridian this map's own conditioning amplifies it by about {@code 3e8}. At + * {@code +proj=adams_ws2 +ellps=WGS84}, {@code (179.999, 0)}: + * + *

+ *   Math.sin(lam/2)        = 0x1.ffffffffac448p-1   ->  x = 16686159.3838 m
+ *   StrictMath.sin(lam/2)  = 0x1.ffffffffac447p-1   ->  x = 16686159.3563 m
+ *   exact (60 digits)                                   x = 16686159.3639 m
+ *   adams_ws2.gie:2139 expects                          x = 16686159.356 m, tolerance 1 mm
+ * 
+ * + *

One ulp of {@code sin} is 27.5 mm of easting there, and the corpus value was + * generated by an fdlibm-equivalent {@code sin}. {@code Math} misses the assertion by 27.8 mm; + * {@code StrictMath} hits it to 0.35 mm. Neither is the mathematically better answer — the + * exact value sits between them — so this is not accuracy, it is bit-fidelity to the same + * library upstream used, and it is the same reason {@code ell_int_5} is ported verbatim. + * + *

{@code asin}, {@code acos} and {@code atan2} already delegate to {@code StrictMath} inside + * the JDK and have no intrinsic today; they are named explicitly anyway, to insure against a + * future one. {@link Math#sqrt}, {@link Math#abs}, {@link Math#min}, {@link Math#max} and + * {@link Math#floor} are used directly: {@code sqrt} is exactly rounded by IEEE-754 and the rest + * are exact by construction. + */ +public abstract class AdamsProjection extends Projection { + + private static final long serialVersionUID = 4925212907167288953L; + + /** {@code TOL} from {@code adams.cpp:80}. */ + protected static final double TOL = 1e-9; + + /** {@code RSQRT2} from {@code adams.cpp:81}. */ + protected static final double RSQRT2 = EllipticIntegral.RSQRT2; + + /** {@code M_HALFPI}. */ + protected static final double HALF_PI = Math.PI / 2.0; + + /** {@code M_TWOPI}. */ + private static final double TWO_PI = Math.PI * 2.0; + + /** + * {@code ONE_TOL} from {@code 9.8.1:src/aasincos.cpp:13}. An argument may exceed one in + * magnitude by up to this much and be silently saturated; beyond it, the coordinate is + * out of domain. + */ + protected static final double ONE_TOL = 1.00000000000001; + + /** {@code PJ_EPS_LAT} from {@code 9.8.1:src/proj_internal.h:99}, in radians. */ + protected static final double EPS_LAT = 1e-12; + + /** {@code fwd_prepare}'s longitude bound, in radians ({@code fwd.cpp:66}). */ + protected static final double MAX_LAM = 10.0; + + /** + * {@code pj_adams_setup} assigns {@code P->es = 0} ({@code adams.cpp:395}): every + * operator in this family is spherical whatever ellipsoid was requested, while keeping + * the requested semi-major axis as the output scale. {@code adams_ws2.gie:2125} exercises + * exactly that with {@code +proj=adams_ws2 +ellps=WGS84}, whose expected values are the + * spherical formula scaled by WGS84's {@code a}. + * + *

{@code e} is zeroed as well as {@code es}. Upstream only clears {@code es} — it + * never reads {@code e} in this file — but {@link Projection#initialize()} derives + * {@code spherical} from {@code e}, and {@code spilhaus.cpp:126} clears the child's + * {@code e} explicitly for the same belt-and-braces reason. + */ + @Override + public void initialize() { + e = 0; + es = 0; + super.initialize(); + } + + /** + * These are conformal projections; that is the whole point of the family. + */ + @Override + public boolean isConformal() { + return true; + } + + /** + * The forward map with PROJ's host-level preparation applied: reject, clamp, wrap, then + * project. See the class comment for why each step is here. + */ + @Override + public ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + validateForwardInput(lam, phi); + if (phi > HALF_PI) { + phi = HALF_PI; + } else if (phi < -HALF_PI) { + phi = -HALF_PI; + } + return projectRaw(adjlon(lam), phi, dst); + } + + /** + * The projection proper: no range checks, no clamping, no longitude wrapping — the + * equivalent of upstream's {@code P->fwd}. + * + * @param lam longitude relative to the central meridian, radians, assumed in + * {@code (-pi, pi]} + * @param phi latitude, radians, assumed in {@code [-pi/2, pi/2]} + * @param dst receives the unscaled projected coordinate + * @return {@code dst} + */ + protected abstract ProjCoordinate projectRaw(double lam, double phi, ProjCoordinate dst); + + /** + * {@code fwd_prepare}'s angular validity checks, {@code fwd.cpp:54-71}. + * + *

The latitude bound is {@code 1e-12} radians on {@code |phi| - pi/2}, about + * {@code 5.7e-11} degrees. Approximating it in degree space misclassifies dozens of + * corpus points, several of which sit within a micro-degree of the pole. + * + * @throws ProjectionException if the coordinate is one PROJ answers with + * {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD} + */ + protected static void validateForwardInput(double lam, double phi) { + if (Double.isInfinite(lam) || Double.isInfinite(phi)) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, + "Invalid coordinate: non-finite ordinate"); + } + if (Math.abs(phi) - HALF_PI > EPS_LAT) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, + "Invalid latitude: |phi| - pi/2 = " + (Math.abs(phi) - HALF_PI) + + " rad exceeds PJ_EPS_LAT"); + } + if (lam > MAX_LAM || lam < -MAX_LAM) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, + "Invalid longitude: " + lam + " rad is outside +/-10"); + } + } + + /** + * The last four lines of {@code adams_forward} ({@code adams.cpp:193-202}), shared by all + * five operators. + * + *

{@code Math.min(0.0, cos(a + b))} and {@code Math.max(0.0, cos(a - b))} are the + * clamps that keep {@code 1 + min} and {@code |1 - max|} inside {@code [0, 1]}; the + * {@code Math.abs} on the second is upstream's and guards the {@code cos(a - b)} slightly + * above one case. + * + * @param a first reduced angle, radians + * @param b second reduced angle, radians + * @param sm negate the {@code x} amplitude + * @param sn negate the {@code y} amplitude + * @param dst receives {@code (ellInt5(m), ellInt5(n))} + * @return {@code dst} + */ + protected static ProjCoordinate ellipticTail(double a, double b, boolean sm, boolean sn, + ProjCoordinate dst) { + double m = aasin(Math.sqrt(1. + Math.min(0.0, FastStrictTrig.cos(a + b)))); + if (sm) { + m = -m; + } + double n = aasin(Math.sqrt(Math.abs(1. - Math.max(0.0, FastStrictTrig.cos(a - b))))); + if (sn) { + n = -n; + } + dst.x = EllipticIntegral.ellInt5(m); + dst.y = EllipticIntegral.ellInt5(n); + return dst; + } + + /** + * Rotate by 45 degrees, {@code adams.cpp:287-291}. Applied by {@code adams_hemi}, + * {@code adams_ws2} and {@code peirce_q}'s {@code square} shape. + */ + protected static void rotate45(ProjCoordinate dst) { + final double temp = dst.x; + dst.x = RSQRT2 * (dst.x - dst.y); + dst.y = RSQRT2 * (temp + dst.y); + } + + /** + * {@code aasin} from {@code 9.8.1:src/aasincos.cpp:16-25}. + * + *

Not {@code ProjectionMath.asin}. That one clamps at {@code |v| > 1} with no + * tolerance band and no error signal, and because {@code Math.abs(NaN) > 1} is false it + * passes {@code NaN} through to {@code Math.asin} and returns {@code NaN} — both of which + * manufacture a plausible-looking result where PROJ signals failure. Existing projections + * depend on that silent clamp, so it is left alone and this sits alongside it. + * + * @throws ProjectionException when {@code |v|} exceeds {@link #ONE_TOL}, where PROJ sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + */ + protected static double aasin(double v) { + final double av = Math.abs(v); + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException("aasin: argument " + v + " outside [-1, 1]"); + } + return v < 0 ? -HALF_PI : HALF_PI; + } + return StrictMath.asin(v); + } + + /** + * {@code aacos} from {@code 9.8.1:src/aasincos.cpp:27-36}. + * + * @throws ProjectionException when {@code |v|} exceeds {@link #ONE_TOL} + */ + protected static double aacos(double v) { + final double av = Math.abs(v); + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException("aacos: argument " + v + " outside [-1, 1]"); + } + return v < 0 ? Math.PI : 0.0; + } + return StrictMath.acos(v); + } + + /** + * {@code aatan2} from {@code 9.8.1:src/aasincos.cpp:38-42}: {@code atan2}, except that + * two ordinates both below {@code 1e-50} in magnitude give exactly zero rather than + * whatever {@code atan2} makes of a pair of denormals. + */ + protected static double aatan2(double n, double d) { + return (Math.abs(n) < 1e-50 && Math.abs(d) < 1e-50) ? 0.0 : StrictMath.atan2(n, d); + } + + /** + * {@code adjlon} from {@code 9.8.1:src/adjlon.cpp}: reduce to {@code (-pi, pi]}. + * + *

Not {@code ProjectionMath.normalizeLongitude}. Upstream deliberately lets the + * value overshoot while {@code |lon| < pi + 1e-12}, "to avoid spurious sign switching at + * the date line"; {@code normalizeLongitude} wraps as soon as {@code lon > pi}. The two + * differ over a {@code 1e-12} rad band straddling the antimeridian, and this family has + * corpus points inside it. + */ + protected static double adjlon(double longitude) { + if (Math.abs(longitude) < Math.PI + 1e-12) { + return longitude; + } + longitude += Math.PI; + longitude -= TWO_PI * Math.floor(longitude / TWO_PI); + longitude -= Math.PI; + return longitude; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AdamsWorldInASquareIIProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AdamsWorldInASquareIIProjection.java new file mode 100644 index 0000000..2f0b2be --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/AdamsWorldInASquareIIProjection.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.GenericInverse2D; + +/** + * Adams world-in-a-square II. The {@code ADAMS_WS2} branch of + * {@code 9.8.1:src/projections/adams.cpp:183-190}, the 45-degree rotation at + * {@code adams.cpp:287-291}, and the seeded Newton inverse at {@code adams.cpp:296-317}. + * + *

Whole-sphere, and like {@link AdamsWorldInASquareIProjection} it has no + * projection-level domain check: all 56 {@code expect failure} rows in + * {@code adams_ws2.gie}'s forward blocks are PROJ's host-level pre-check, and the 57th is the + * inverse failing to converge. + * + *

It differs from world-in-a-square I in two ways that are easy to conflate: the sign flags + * are taken from {@code s +/- t} rather than from the signs of {@code lam} and {@code phi}, and + * only one of the two reduced angles gets the {@code RSQRT2} factor — {@code b = aacos(s)} + * takes none at all. + * + *

The inverse

+ * + *

This is the only member of the family with an inverse of its own, and it is + * {@link GenericInverse2D} seeded by a deliberately rough guess + * ({@code adams.cpp:308-313}): + * + *

+ *   phi0 = clamp(y / 2.62181347, -1, 1) * pi/2
+ *   lam0 = |phi0| >= pi/2 ? 0 : clamp(x / 2.62205760 / cos(phi0), -1, 1) * pi
+ * 
+ * + *

The two magic divisors are this projection's own images of {@code (0, 90)} and + * {@code (180, 0)} at unit radius; PROJ's comment records the two {@code src/proj} invocations + * that produced them. They are not interchangeable and not equal — {@code 2.62181347} against + * {@code 2.62205760} — because the forward map's northern extent and eastern extent differ in + * the fourth decimal. + * + *

{@link SpilhausProjection} drives this class through {@link #projectRaw} and + * {@link #projectInverse}, i.e. below the {@code totalScale}/false-origin layer, exactly as + * {@code spilhaus.cpp} calls the child {@code PJ}'s {@code fwd}/{@code inv} directly. + */ +public class AdamsWorldInASquareIIProjection extends AdamsProjection { + + private static final long serialVersionUID = -578708846864253423L; + + /** {@code adams_ws2}'s unit-radius northing at {@code (0, 90)} ({@code adams.cpp:310}). */ + private static final double SEED_Y = 2.62181347; + + /** {@code adams_ws2}'s unit-radius easting at {@code (180, 0)} ({@code adams.cpp:313}). */ + private static final double SEED_X = 2.62205760; + + /** Every adams-family caller of the generic inverse passes this ({@code adams.cpp:316}). */ + private static final double DELTA_XY_TOLERANCE = 1e-10; + + /** + * The forward map as {@link GenericInverse2D} needs it. Held as a field rather than + * allocated per call: {@code spilhaus}'s 59 roundtrips each drive one inverse, and each + * inverse evaluates the forward up to 45 times. + */ + private final GenericInverse2D.Forward2D rawForward = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + projectRaw(lam, phi, dst); + } + }; + + @Override + protected ProjCoordinate projectRaw(double lam, double phi, ProjCoordinate dst) { + final double s = FastStrictTrig.tan(0.5 * phi); + final double t = FastStrictTrig.cos(aasin(s)) * FastStrictTrig.sin(0.5 * lam); + final boolean sm = (s + t) < 0.; + final boolean sn = (s - t) < 0.; + final double b = aacos(s); + final double a = aacos(t); + + ellipticTail(a, b, sm, sn, dst); + rotate45(dst); + return dst; + } + + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double phi0 = clampUnit(y / SEED_Y) * HALF_PI; + final double lam0 = Math.abs(phi0) >= HALF_PI + ? 0 + : clampUnit(x / SEED_X / FastStrictTrig.cos(phi0)) * Math.PI; + return GenericInverse2D.solve(x, y, rawForward, lam0, phi0, DELTA_XY_TOLERANCE, dst); + } + + /** {@code std::max(std::min(v, 1.0), -1.0)}. */ + private static double clampUnit(double v) { + return Math.max(Math.min(v, 1.0), -1.0); + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Adams World in a Square II"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AdamsWorldInASquareIProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AdamsWorldInASquareIProjection.java new file mode 100644 index 0000000..e24dd65 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/AdamsWorldInASquareIProjection.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Adams world-in-a-square I. The {@code ADAMS_WS1} branch of + * {@code 9.8.1:src/projections/adams.cpp:174-181}. + * + *

Unlike {@link GuyouProjection} and {@link AdamsHemisphereProjection}, this one covers the + * whole sphere and has no projection-level domain check whatsoever. All 57 + * {@code expect failure} rows in {@code adams_ws1.gie} come from PROJ's host-level + * {@code fwd_prepare} pre-check on latitude and longitude range, and none from this code. + * Do not add a guard here to make a failing row pass — it would be the wrong guard in the + * wrong place. + * + *

{@code tan(phi/2)} is exactly {@code +/-1} at {@code phi = +/-pi/2}, so {@link #aasin} + * saturates there rather than erroring, and {@code cos(aasin(+/-1)) = 0} kills the + * {@code sin(lam/2)} term at the poles. That is why no guard is needed and also why the two + * arc-cosine arguments, {@code (t -/+ s) * RSQRT2}, stay inside {@code [-1, 1]}: at worst + * {@code |t| + |s| = 1}. + * + *

Upstream reuses one variable for {@code sp}, then for {@code t}, then for {@code b}; the + * three roles are given distinct names here. No rotation, and no inverse. + */ +public class AdamsWorldInASquareIProjection extends AdamsProjection { + + private static final long serialVersionUID = 283429704440687713L; + + @Override + protected ProjCoordinate projectRaw(double lam, double phi, ProjCoordinate dst) { + final double s = FastStrictTrig.tan(0.5 * phi); + final double t = FastStrictTrig.cos(aasin(s)) * FastStrictTrig.sin(0.5 * lam); + final double a = aacos((t - s) * RSQRT2); + final double b = aacos((t + s) * RSQRT2); + return ellipticTail(a, b, lam < 0., phi < 0., dst); + } + + @Override + public boolean hasInverse() { + return false; + } + + @Override + public String toString() { + return "Adams World in a Square I"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AiryProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AiryProjection.java index a8dd2f3..622ae77 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/AiryProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/AiryProjection.java @@ -19,18 +19,47 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Airy ({@code +proj=airy}), ported from {@code 9.8.1:src/projections/airy.cpp}. + * + *

The polar branch of the forward was the whole defect, and it is the "lost in-place + * reassignment" shape: upstream writes {@code lp.phi = fabs(p_halfpi - lp.phi)} and then reads + * {@code lp.phi} three more times, while the old translation staged that value in the + * output coordinate and read the original latitude for all three. See {@link #project} for the two + * measured consequences. + * + *

{@code +no_cut} and {@code +lat_b} are still not {@code Proj4Keyword}s. {@link #setNoCut} and + * {@link #setLatB} exist so that registering them is a parser-only change; until then the bridge + * reports both correctly as not implemented rather than silently ignoring them. + */ public class AiryProjection extends Projection { + private static final long serialVersionUID = 1869315092720877608L; + private double p_halfpi; private double sinph0; private double cosph0; private double Cb; private int mode; - private boolean no_cut = true; /* do not cut at hemisphere limit */ + + /** + * {@code +no_cut}: do NOT cut at the hemisphere limit. + *

+ * The default is {@code false} — {@code pj_param(..., "bno_cut").i} is 0 for an absent key, so + * upstream cuts. The field used to initialise to {@code true} and {@code initialize()} then + * overwrote it with {@code false} behind a {@code //FIXME}, which meant a caller could not set + * it at all and the state was not idempotent across the two {@code initialize()} calls. + */ + private boolean no_cut; + + /** {@code +lat_b}, radians. {@code pj_param(..., "rlat_b")} is 0 for an absent key. */ + private double lat_b; private final static double EPS = 1.e-10; private final static int N_POLE = 0; @@ -39,31 +68,40 @@ public class AiryProjection extends Projection { private final static int OBLIQ = 3; public AiryProjection() { - minLatitude = Math.toRadians(-60); - maxLatitude = Math.toRadians(60); - minLongitude = Math.toRadians(-90); - maxLongitude = Math.toRadians(90); + minLatitude = ProjectionMath.toRad(-60); + maxLatitude = ProjectionMath.toRad(60); + minLongitude = ProjectionMath.toRad(-90); + maxLongitude = ProjectionMath.toRad(90); initialize(); } public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double sinlam, coslam, cosphi, sinphi, t, s, Krho, cosz; - sinlam = Math.sin(lplam); - coslam = Math.cos(lplam); + sinlam = FastStrictTrig.sin(lplam); + coslam = FastStrictTrig.cos(lplam); switch (mode) { case EQUIT: case OBLIQ: - sinphi = Math.sin(lpphi); - cosphi = Math.cos(lpphi); + sinphi = FastStrictTrig.sin(lpphi); + cosphi = FastStrictTrig.cos(lpphi); cosz = cosphi * coslam; if (mode == OBLIQ) cosz = sinph0 * sinphi + cosph0 * cosz; if (!no_cut && cosz < -EPS) - throw new ProjectionException("F"); + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + ") deg is on " + + "the far hemisphere (cos of the zenith angle is " + cosz + + "); use +no_cut to project it anyway"); s = 1. - cosz; if (Math.abs(s) > EPS) { t = 0.5 * (1. + cosz); + if (t == 0) { + // airy.cpp:73-78: the exact antipode, where -log(t) is +Infinity. + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + + ") deg is the antipode of the projection centre"); + } Krho = -Math.log(t)/s - Cb / t; } else Krho = 0.5 - Cb; @@ -76,31 +114,92 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { break; case S_POLE: case N_POLE: - out.y = Math.abs(p_halfpi - lpphi); - if (!no_cut && (lpphi - EPS) > ProjectionMath.HALFPI) - throw new ProjectionException("F"); - if ((out.y *= 0.5) > EPS) { - t = Math.tan(lpphi); - Krho = -2.*(Math.log(Math.cos(lpphi)) / t + t * Cb); + // airy.cpp:85-102 REASSIGNS lp.phi and then reads the reassigned value three more + // times: in the no_cut guard, in the halving, and in tan()/log(cos()). The old + // translation staged the reassignment in the OUTPUT slot (out.y) and then read the + // ORIGINAL lpphi for all three - so at lat_0=90 the forward of (0, 0) evaluated + // log(cos(0))/tan(0) = 0/0 and returned a non-finite coordinate where PROJ returns + // -1.3863, and the forward of (0, -90), which PROJ rejects as outside the domain, + // evaluated tan(-pi/2) and returned a plausible-looking 1.132e16. + double polarPhi = Math.abs(p_halfpi - lpphi); + if (!no_cut && (polarPhi - EPS) > ProjectionMath.HALFPI) + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + ") deg is " + + Math.toDegrees(polarPhi) + " deg from the projection centre, " + + "past the hemisphere limit; use +no_cut to project it anyway"); + polarPhi *= 0.5; + if (polarPhi > EPS) { + t = FastStrictTrig.tan(polarPhi); + Krho = -2.*(Math.log(FastStrictTrig.cos(polarPhi)) / t + t * Cb); out.x = Krho * sinlam; out.y = Krho * coslam; if (mode == N_POLE) out.y = -out.y; } else out.x = out.y = 0.; + break; + default: + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "unreachable Airy mode " + mode); } return out; } + /** + * {@code +no_cut}: project the far hemisphere instead of rejecting it. + *

+ * {@code no_cut} is not a {@code Proj4Keyword}, so nothing calls this yet. The setter + * exists so that registering the key is a one-line parser change; without it the parser has + * nowhere to dispatch to and the key cannot be registered at all. {@code builtins.gie}'s one + * {@code +proj=airy +R=1 +lat_0=-90 +no_cut} block stays reported as not implemented until both + * halves land together. + * + * @param no_cut whether to skip the hemisphere-limit rejection + */ + public void setNoCut(boolean no_cut) { + this.no_cut = no_cut; + } + + public boolean isNoCut() { + return no_cut; + } + + /** + * {@code +lat_b}, in radians: the latitude at which the projection's Airy criterion is + * minimised. Defaults to 0, which is what {@code pj_param(..., "rlat_b")} answers for an absent + * key. Same dispatch gap as {@link #setNoCut(boolean)}. + * + * @param lat_b the balancing latitude, radians + */ + public void setLatB(double lat_b) { + this.lat_b = lat_b; + } + + /** @param lat_b the balancing latitude, degrees */ + public void setLatBDegrees(double lat_b) { + this.lat_b = ProjectionMath.DTR * lat_b; + } + + public double getLatB() { + return lat_b; + } + + /** + * {@code PJ_PROJECTION(airy)} ({@code airy.cpp:106-146}). + *

+ * {@code es = 0} goes before {@code super.initialize()}, which derives {@code spherical}, + * {@code one_es} and {@code rone_es} from it. Every value written here derives from + * {@link #projectionLatitude} and {@link #lat_b}, so the second call the parser makes is a + * no-op — which the {@code no_cut} assignment this method used to carry was not. + */ public void initialize() { // airy + es = 0.; + e = 0.; super.initialize(); double beta; -// no_cut = pj_param(params, "bno_cut").i; -// beta = 0.5 * (MapMath.HALFPI - pj_param(params, "rlat_b").f); - no_cut = false;//FIXME - beta = 0.5 * (ProjectionMath.HALFPI - 0);//FIXME + beta = 0.5 * (ProjectionMath.HALFPI - lat_b); if (Math.abs(beta) < EPS) Cb = -0.5; else { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AitoffProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AitoffProjection.java index 1df7218..1699047 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/AitoffProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/AitoffProjection.java @@ -21,32 +21,114 @@ import java.util.Objects; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; - +/** + * Aitoff and Winkel Tripel ({@code +proj=aitoff}, {@code +proj=wintri}), ported from + * {@code 9.8.1:src/projections/aitoff.cpp}. One file, one kernel, two {@code PROJ_HEAD}s — the + * Winkel Tripel is the Aitoff averaged with an equirectangular at {@code +lat_1}. + * + *

There was no inverse at all

+ * + *

{@code hasInverse()} returned {@code false} and {@code projectInverse} was never overridden, so + * an inverse fell through to {@link Projection}'s identity, ungated. Upstream has had a + * Newton–Raphson inverse since 2015 (Tutic and Gradiser, after Bildirici and Ipbüker's + * general Jacobian method): two nested loops, an inner 10-trip Newton at {@code EPSILON = 1e-12} and + * an outer 20-trip re-seed that re-evaluates the forward and repeats while the residual is still + * above {@code EPSILON}. It is ported whole, including + * + *

    + *
  • the {@code fmod(dl, pi)} on the longitude increment, which keeps a step from jumping a whole + * revolution;
  • + *
  • the two reflections that fold a latitude past a pole back inside it — Aitoff is + * symmetric about the poles, so Newton can legitimately converge on the mirror solution;
  • + *
  • {@code lam = 0} at an Aitoff pole, where the longitude is genuinely undefined and upstream + * picks zero rather than reporting a failure;
  • + *
  • the {@code pow(C, 1.5) == 0} guard, and the both-loops-exhausted domain error.
  • + *
+ * + *

The corpus rows this closes are all {@code direction inverse}. The four {@code aitoff} inverse + * rows that already passed did so by accident: they sit ~200 m from the origin, where Aitoff + * is the identity to nine decimals. A round trip at a couple of degrees showed 23.28 m. + * + *

{@code +lat_1} was discarded, and 0 is a legal value for it

+ * + *

{@code wintri} reads {@code +lat_1} and takes {@code cosphi1 = cos(lat_1)}, falling back to + * {@code acos(2/pi) = 0.636619772367581343} (50°28′) only when the key is absent. + * This class hard-coded the fall-back behind a {@code //FIXME}. The corpus row is + * {@code +proj=wintri +a=6400000 +lat_1=0}, i.e. {@code cosphi1 = 1.0}, and the forward was out by + * 40,590 m. + * + *

Because {@code +lat_1=0} is both legal and meaningful, "absent" cannot be inferred from the + * value — {@link Projection#projectionLatitude1} initialises to {@code 0.0}. Hence + * {@link #lat1Explicit}, set by the two setter overrides, in the same shape + * {@code ObliqueMercatorProjection} uses for {@code +alpha} and {@code +lat_1}/{@code +lat_2}. + * Upstream rejects a {@code +lat_1} whose cosine is exactly 0, and so does this. + * + *

{@link WinkelTripelProjection}'s constructor used to pass the {@code cosphi1} constant into + * this class's {@code projectionLatitude} slot, which set {@code lat_0} to 36.47°. That was inert + * — nothing here reads {@code lat_0} — but it poisoned {@code equals}/{@code hashCode}, so two + * {@code wintri}s built by different routes compared unequal. + */ public class AitoffProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = 3081757580534141253L; + protected final static int AITOFF = 0; protected final static int WINKEL = 1; + /** {@code aitoff.cpp}'s {@code EPSILON}, shared by both loops and by the residual test. */ + private static final double EPSILON = 1e-12; + + /** {@code MAXITER}: the inner Newton budget. */ + private static final int MAXITER = 10; + + /** {@code MAXROUND}: the outer re-seed budget. */ + private static final int MAXROUND = 20; + + /** {@code acos(2/pi)}, i.e. 50°28′: {@code wintri}'s {@code +lat_1} fall-back. */ + public static final double DEFAULT_COSPHI1 = 0.636619772367581343; + private boolean winkel = false; private double cosphi1 = 0; + /** + * Whether a caller supplied {@code +lat_1}. {@link Projection#projectionLatitude1} cannot answer + * that: it initialises to {@code 0.0} and {@code +lat_1=0} is a legal, meaningful value for + * {@code wintri} — it is the one the corpus uses. + */ + private boolean lat1Explicit; + public AitoffProjection() { + initialize(); } + /** + * @param type the mode, {@link #AITOFF} or {@link #WINKEL} + * @param projectionLatitude {@code lat_0}, radians. Retained for source compatibility; nothing + * here reads {@code lat_0}, and this is emphatically not + * {@code +lat_1} — see {@link #setProjectionLatitude1(double)}. + */ public AitoffProjection(int type, double projectionLatitude) { this.projectionLatitude = projectionLatitude; winkel = type == WINKEL; + initialize(); } + /** {@code aitoff_s_forward}. */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double c = 0.5 * lplam; - double d = Math.acos(Math.cos(lpphi) * Math.cos(c)); + double d = Math.acos(FastStrictTrig.cos(lpphi) * FastStrictTrig.cos(c)); if (d != 0) { - out.x = 2. * d * Math.cos(lpphi) * Math.sin(c) * (out.y = 1. / Math.sin(d)); - out.y *= d * Math.sin(lpphi); + out.x = 2. * d * FastStrictTrig.cos(lpphi) * FastStrictTrig.sin(c) + * (out.y = 1. / FastStrictTrig.sin(d)); + out.y *= d * FastStrictTrig.sin(lpphi); } else out.x = out.y = 0.0; if (winkel) { @@ -56,20 +138,137 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * {@code aitoff_s_inverse}: Newton–Raphson on the 2×2 Jacobian, with an outer re-seed. + * + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN}: a degenerate Jacobian, or + * both loops exhausted without reaching {@code 1e-12} + */ + public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate lp) { + int iter = 0; + int round = 0; + double D, C, f1, f2, f1p, f1l, f2p, f2l, dp = 0, dl = 0, sl, sp, cp, cl, x, y; + + if ((Math.abs(xyx) < EPSILON) && (Math.abs(xyy) < EPSILON)) { + lp.y = 0.; + lp.x = 0.; + return lp; + } + + /* initial values for the Newton-Raphson method */ + lp.y = xyy; + lp.x = xyx; + do { + iter = 0; + do { + sl = FastStrictTrig.sin(lp.x * 0.5); + cl = FastStrictTrig.cos(lp.x * 0.5); + sp = FastStrictTrig.sin(lp.y); + cp = FastStrictTrig.cos(lp.y); + D = cp * cl; + C = 1. - D * D; + final double denom = Math.pow(C, 1.5); + if (denom == 0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "inverse of (" + xyx + ", " + xyy + ") reached a degenerate Jacobian: " + + "the iterate sits on the projection centre, where " + + "(1 - cos(phi)^2*cos(lam/2)^2)^1.5 is exactly 0"); + } + D = Math.acos(D) / denom; + f1 = 2. * D * C * cp * sl; + f2 = D * C * sp; + f1p = 2. * (sl * cl * sp * cp / C - D * sp * sl); + f1l = cp * cp * sl * sl / C + D * cp * cl * sp * sp; + f2p = sp * sp * cl / C + D * sl * sl * cp; + f2l = 0.5 * (sp * cp * sl / C - D * sp * cp * cp * sl * cl); + if (winkel) { + f1 = 0.5 * (f1 + lp.x * cosphi1); + f2 = 0.5 * (f2 + lp.y); + f1p *= 0.5; + f1l = 0.5 * (f1l + cosphi1); + f2p = 0.5 * (f2p + 1.); + f2l *= 0.5; + } + f1 -= xyx; + f2 -= xyy; + dp = f1p * f2l - f2p * f1l; + dl = (f2 * f1p - f1 * f2p) / dp; + dp = (f1 * f2l - f2 * f1l) / dp; + dl = dl % Math.PI; /* fmod: set to the interval [-pi, pi] */ + lp.y -= dp; + lp.x -= dl; + } while ((Math.abs(dp) > EPSILON || Math.abs(dl) > EPSILON) && (iter++ < MAXITER)); + if (lp.y > ProjectionMath.HALFPI) + lp.y -= 2. * (lp.y - ProjectionMath.HALFPI); /* symmetrical solution for Aitoff */ + if (lp.y < -ProjectionMath.HALFPI) + lp.y -= 2. * (lp.y + ProjectionMath.HALFPI); /* symmetrical solution for Aitoff */ + if ((Math.abs(Math.abs(lp.y) - ProjectionMath.HALFPI) < EPSILON) && !winkel) + lp.x = 0.; /* if pole in Aitoff, return a longitude of 0 */ + + /* recompute x,y from the solution obtained */ + C = 0.5 * lp.x; + if ((D = Math.acos(FastStrictTrig.cos(lp.y) * FastStrictTrig.cos(C))) != 0.0) { + y = 1. / FastStrictTrig.sin(D); + x = 2. * D * FastStrictTrig.cos(lp.y) * FastStrictTrig.sin(C) * y; + y *= D * FastStrictTrig.sin(lp.y); + } else + x = y = 0.; + if (winkel) { + x = (x + lp.x * cosphi1) * 0.5; + y = (y + lp.y) * 0.5; + } + /* if too far from the given x,y, repeat with a better approximation of phi,lam */ + } while (((Math.abs(xyx - x) > EPSILON) || (Math.abs(xyy - y) > EPSILON)) + && (round++ < MAXROUND)); + + if (iter == MAXITER && round == MAXROUND) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "inverse of (" + xyx + ", " + xyy + ") did not reach " + EPSILON + " within " + + MAXITER + " Newton trips over " + MAXROUND + " re-seeds; last " + + "increments dphi=" + dp + " dlam=" + dl); + } + return lp; + } + + /** + * {@code PJ_PROJECTION(wintri)}'s {@code +lat_1} block, plus {@code pj_aitoff_setup}'s + * {@code P->es = 0}. + * + * @throws InvalidValueException where upstream returns + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} for a {@code +lat_1} at a pole + */ public void initialize() { + es = 0.; + e = 0.; super.initialize(); if (winkel) { -//FIXME -// if (pj_param(P->params, "tlat_1").i) -// if ((cosphi1 = Math.cos(pj_param(P->params, "rlat_1").f)) == 0.) -// throw new IllegalArgumentException("-22") -// else /* 50d28' or acos(2/pi) */ - cosphi1 = 0.636619772367581343; + if (lat1Explicit) { + cosphi1 = FastStrictTrig.cos(projectionLatitude1); + if (cosphi1 == 0.) { + throw new InvalidValueException( + "Invalid value for +lat_1: |lat_1| should be < 90 degrees, but is " + + Math.toDegrees(projectionLatitude1)); + } + } else { + /* 50d28' or acos(2/pi) */ + cosphi1 = DEFAULT_COSPHI1; + } } } + @Override public void setProjectionLatitude1(double projectionLatitude1) { + super.setProjectionLatitude1(projectionLatitude1); + this.lat1Explicit = true; + } + + @Override public void setProjectionLatitude1Degrees(double projectionLatitude1) { + super.setProjectionLatitude1Degrees(projectionLatitude1); + this.lat1Explicit = true; + } + public boolean hasInverse() { - return false; + return true; } public String toString() { @@ -83,13 +282,13 @@ public boolean equals(Object that) { } if (that instanceof AitoffProjection) { AitoffProjection p = (AitoffProjection) that; - return (winkel == p.winkel && super.equals(that)); + return (winkel == p.winkel && cosphi1 == p.cosphi1 && super.equals(that)); } return false; } @Override public int hashCode() { - return Objects.hash(winkel, super.hashCode()); + return Objects.hash(winkel, cosphi1, super.hashCode()); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AlaskaModifiedStereographicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AlaskaModifiedStereographicProjection.java new file mode 100644 index 0000000..f8b1434 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/AlaskaModifiedStereographicProjection.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.util.Complex; + +/** + * Modified Stereographic of Alaska, {@code +proj=alsk} — + * {@code PJ_PROJECTION(alsk)}, {@code 9.8.1:src/projections/mod_ster.cpp:189-219}. + * + *

Centred on (152°W, 64°N), five coefficients, and two tables: the requested + * {@code es} selects between them and is then replaced. + * + *

This class is what makes {@code +proj=alsk} work. {@code Registry} bound the name to + * the abstract {@link Projection} base class itself, so {@code Registry.getProjection("alsk")} + * raised {@code PROJECTION_NOT_IMPLEMENTED} — honest, and a deliberate improvement over the + * previous {@code "Unknown projection: alsk"}, which lied about a name that was in the registry. + * The 16 {@code builtins.gie} assertions were unreachable rather than wrong. + * + * @since 1.5.0 + */ +public class AlaskaModifiedStereographicProjection extends ModifiedStereographicProjection { + + private static final long serialVersionUID = 5347283055141823524L; + + /** {@code mod_ster.cpp:191-195} — the Alaska ellipsoid table, digit for digit. */ + private static final Complex[] ABE = { + new Complex(.9945303, 0.), + new Complex(.0052083, -.0027404), + new Complex(.0072721, .0048181), + new Complex(-.0151089, -.1932526), + new Complex(.0642675, -.1381226), + new Complex(.3582802, -.2884586), + }; + + /** {@code mod_ster.cpp:197-201} — the Alaska sphere table, digit for digit. */ + private static final Complex[] ABS = { + new Complex(.9972523, 0.), + new Complex(.0052513, -.0041175), + new Complex(.0074606, .0048125), + new Complex(-.0153783, -.1968253), + new Complex(.0636871, -.1408027), + new Complex(.3660976, -.2937382), + }; + + @Override + protected void setupVariant() { + projectionLongitude = DTR * -152.; + projectionLatitude = DTR * 64.; + // mod_ster.cpp:209-216. The test is on the *requested* es; the assignment replaces it. + if (es != 0.0) { + setCoefficients(ABE); + a = FIXED_A; + es = FIXED_ES; + e = Math.sqrt(es); + } else { + setCoefficients(ABS); + a = SPHERE_A; + } + } + + @Override + public String toString() { + return "Mod. Stereographic of Alaska"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AlbersProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AlbersProjection.java index 7f6efda..e5d8e65 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/AlbersProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/AlbersProjection.java @@ -21,10 +21,13 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.AuthalicLat; import org.locationtech.proj4j.util.ProjectionMath; public class AlbersProjection extends Projection { + private static final long serialVersionUID = -8897646364090205147L; + private final static double EPS10 = 1.e-10; private final static double TOL7 = 1.e-7; private double ec; @@ -35,47 +38,29 @@ public class AlbersProjection extends Projection { private double rho0; private double phi1; private double phi2; - private double[] en; + private double qp; - private final static int N_ITER = 15; - private final static double EPSILON = 1.0e-7; - private final static double TOL = 1.0e-10; + /** + * The order-6 authalic-latitude machinery, {@code 9.8.1:src/latitudes.cpp}. Replaces + * {@code ProjectionMath.qsfn} in the forward direction and the 15-step {@code phi1_} + * Newton loop in the inverse. + */ + private AuthalicLat authalic; //protected double projectionLatitude1 = MapMath.degToRad(45.5); //protected double projectionLatitude2 = MapMath.degToRad(29.5); public AlbersProjection() { - minLatitude = Math.toRadians(0); - maxLatitude = Math.toRadians(80); + minLatitude = ProjectionMath.toRad(0); + maxLatitude = ProjectionMath.toRad(80); projectionLatitude1 = ProjectionMath.degToRad(45.5); projectionLatitude2 = ProjectionMath.degToRad(29.5); initialize(); } - private static double phi1_(double qs, double Te, double Tone_es) { - int i; - double Phi, sinpi, cospi, con, com, dphi; - - Phi = Math.asin (.5 * qs); - if (Te < EPSILON) - return( Phi ); - i = N_ITER; - do { - sinpi = Math.sin (Phi); - cospi = Math.cos (Phi); - con = Te * sinpi; - com = 1. - con * con; - dphi = .5 * com * com / cospi * (qs / Tone_es - - sinpi / com + .5 / Te * Math.log ((1. - con) / - (1. + con))); - Phi += dphi; - } while (Math.abs(dphi) > TOL && --i != 0); - return( i != 0 ? Phi : Double.MAX_VALUE ); - } - public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double rho; - if ((rho = c - (!spherical ? n * ProjectionMath.qsfn(Math.sin(lpphi), e, one_es) : n2 * Math.sin(lpphi))) < 0.) + if ((rho = c - (!spherical ? n * authalic.q(Math.sin(lpphi)) : n2 * Math.sin(lpphi))) < 0.) throw new ProjectionException("F"); rho = dd * Math.sqrt(rho); out.x = rho * Math.sin( lplam *= n ); @@ -94,16 +79,27 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) } lpphi = rho / dd; if (!spherical) { - lpphi = (c - lpphi * lpphi) / n; - if (Math.abs(ec - Math.abs(lpphi)) > TOL7) { - if ((lpphi = phi1_(lpphi, e, one_es)) == Double.MAX_VALUE) - throw new ProjectionException("I"); + final double qs = (c - lpphi * lpphi) / n; + if (Math.abs(ec - Math.abs(qs)) > TOL7) { + // 9.8.1:aea.cpp:100 -- outside the projection domain; asin(qs/qp) + // would be NaN. proj4j had no such guard. + if (Math.abs(qs) > 2.) + throw new ProjectionException("aea inverse: |qs| > 2, outside the projection domain"); + lpphi = authalic.inverse(Math.asin(qs / qp)); } else - lpphi = lpphi < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - } else if (Math.abs(out.y = (c - lpphi * lpphi) / n2) <= 1.) - lpphi = Math.asin(lpphi); - else - lpphi = lpphi < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + lpphi = qs < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } else { + // 9.8.1:aea.cpp:113-118. The quantity PROJ names qs_div_2 is a *local*; + // proj4j used out.y as a scratch temp and then took asin of lpphi, which + // is still rho/dd -- the RADIUS. That is a 89.9568 degree error, and NaN + // wherever rho/dd > 1. The sign test was on lpphi too, which is >= 0 by + // construction, so the pole fallback could only ever return +90. + final double qsDiv2 = (c - lpphi * lpphi) / n2; + if (Math.abs(qsDiv2) <= 1.) + lpphi = Math.asin(qsDiv2); + else + lpphi = qsDiv2 < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } lplam = Math.atan2(xyx, xyy) / n; out.x = lplam; out.y = lpphi; @@ -114,13 +110,35 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) return out; } + /** + * The cone's first standard parallel, radians. {@code aea} reads {@code +lat_1} + * ({@code 9.8.1:src/projections/aea.cpp:209}); {@code leac} does not, which is the only + * difference between the two operators upstream — hence the seam. + * + * @return {@link Projection#projectionLatitude1} + * @since 1.5.0 + */ + protected double firstStandardParallel() { + return projectionLatitude1; + } + + /** + * The cone's second standard parallel, radians. {@code aea} reads {@code +lat_2}. + * + * @return {@link Projection#projectionLatitude2} + * @since 1.5.0 + */ + protected double secondStandardParallel() { + return projectionLatitude2; + } + public void initialize() { super.initialize(); double cosphi, sinphi; boolean secant; - phi1 = projectionLatitude1; - phi2 = projectionLatitude2; + phi1 = firstStandardParallel(); + phi2 = secondStandardParallel(); if (Math.abs(phi1 + phi2) < EPS10) throw new ProjectionException("-21"); @@ -131,25 +149,24 @@ public void initialize() { if (!spherical) { double ml1, m1; - if ((en = ProjectionMath.enfn(es)) == null) - throw new ProjectionException("0"); + authalic = new AuthalicLat(es); + qp = authalic.qp(); m1 = ProjectionMath.msfn(sinphi, cosphi, es); - ml1 = ProjectionMath.qsfn(sinphi, e, one_es); + ml1 = authalic.q(sinphi); if (secant) { /* secant cone */ double ml2, m2; sinphi = Math.sin(phi2); cosphi = Math.cos(phi2); m2 = ProjectionMath.msfn(sinphi, cosphi, es); - ml2 = ProjectionMath.qsfn(sinphi, e, one_es); + ml2 = authalic.q(sinphi); n = (m1 * m1 - m2 * m2) / (ml2 - ml1); } ec = 1. - .5 * one_es * Math.log((1. - e) / (1. + e)) / e; c = m1 * m1 + n * ml1; dd = 1. / n; - rho0 = dd * Math.sqrt(c - n * ProjectionMath.qsfn(Math.sin(projectionLatitude), - e, one_es)); + rho0 = dd * Math.sqrt(c - n * authalic.q(Math.sin(projectionLatitude))); } else { if (secant) n = .5 * (n + Math.sin(phi2)); n2 = n + n; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ApianGlobular1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/ApianGlobular1Projection.java new file mode 100644 index 0000000..9e46ef8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ApianGlobular1Projection.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Apian Globular I ({@code +proj=apian}), {@code 9.8.1:src/projections/bacon.cpp:57-68}. + * Both flags clear, so the northing is the latitude itself. + * + *

Replaces one of the three registrations that bound a {@code +proj=} name to the + * abstract {@link Projection} class. See {@link BaconFamilyProjection}. + * + * @see BaconFamilyProjection + */ +public class ApianGlobular1Projection extends BaconFamilyProjection { + + private static final long serialVersionUID = 1924854499889847619L; + + public ApianGlobular1Projection() { + super(false, false); + } + + public String toString() { + return "Apian Globular I"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AugustProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AugustProjection.java index 22fa7c1..0b2f932 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/AugustProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/AugustProjection.java @@ -23,6 +23,8 @@ public class AugustProjection extends Projection { + private static final long serialVersionUID = -3851197284678572315L; + private final static double M = 1.333333333333333; public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/AzimuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/AzimuthalProjection.java index 8d4afd9..de82632 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/AzimuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/AzimuthalProjection.java @@ -25,6 +25,8 @@ */ public abstract class AzimuthalProjection extends Projection { + private static final long serialVersionUID = -5590774380842159499L; + public final static int NORTH_POLE = 1; public final static int SOUTH_POLE = 2; public final static int EQUATOR = 3; @@ -34,8 +36,53 @@ public abstract class AzimuthalProjection extends Projection { protected double sinphi0, cosphi0; private double mapRadius = 90.0; + /** + * {@code lat_0 = lon_0 = 0}, which is what PROJ defaults them to. + *

+ * This used to be 45 degrees on both axes. {@code parser/Proj4Parser} assigns + * {@code +lat_0}/{@code +lon_0} only when the keyword is present, so this constructor - not + * PROJ - defined the effective default for every azimuthal projection whose definition + * omitted them, and every such definition was silently oblique at 45°. Every + * {@code +proj=ortho +ellps=WGS84} row in {@code builtins.gie:5658-5738} measured it, and a + * frozen A/B puts the figure at 40 assertions - see the table below. + *

+ * The two numbers this defect was first reported with are both artefacts of a second bug, + * and neither is a projection. The report was {@code (170, 10) -> 5145289.58} against + * "the equatorial answer {@code 1090725.665}". In fact {@code 5145289.577} is exactly + * {@code a*cos(10)*sin(170-45)} and {@code 1090725.665} is exactly {@code a*cos(10)*sin(170)}, + * i.e. both are the value the old + * {@code OrthographicAzimuthalProjection}'s unconditional {@code xy.x = cosphi*sin(lam)} wrote + * after the visibility guard had already poisoned both ordinates - the same + * expression, evaluated at two different central meridians. There is no "equatorial answer" to + * compare against: the visibility dot product is {@code -0.277} at 45/45 and {@code -0.970} at + * 0/0, so both aspects reject the point, and {@code proj 9.8.1} prints {@code * *} + * for both. The correct default therefore turns a wrong coordinate into a domain refusal here, + * not into a different coordinate. + *

+ * Only two classes reach this constructor: {@link OrthographicAzimuthalProjection} and the + * unregistered {@link EqualAreaAzimuthalProjection}. {@code gnom}, {@code stere}, {@code aeqd} + * and {@code ups} already chain through {@code this(0.0, 0.0)} or set their own pole. That + * enumeration is pinned, with a positive control, by + * {@code proj.AzimuthalCentreDefaultTest} - a superclass default is exactly the kind of change + * whose blast radius must be counted rather than assumed. + *

+ * The blast radius, measured on a frozen tree by reverting one cause at a time and re-running + * the whole gie corpus (7,923 assertions): + * + * + * + * + * + *
{@code ortho} passing assertions, 2x2
{@code ortho} classdefault 45/45default 0/0
1.4.397105
ported108148
+ *

+ * No other operator moves in either direction - {@code aeqd}, {@code gnom}, {@code stere}, + * {@code ups} and {@code laea} are bit-for-bit unchanged across all four cells. Note that the + * effects are strongly non-additive: {@code +8} for the default alone and {@code +11} for the + * class alone, but {@code +51} together, so 32 of the 51 assertions need both. Measuring + * either cause on its own would have under-reported it by a factor of five. + */ public AzimuthalProjection() { - this( Math.toRadians(45.0), Math.toRadians(45.0) ); + this( 0.0, 0.0 ); } public AzimuthalProjection(double projectionLatitude, double projectionLongitude) { @@ -57,7 +104,7 @@ else if (Math.abs(projectionLatitude) > EPS10) { } public boolean inside(double lon, double lat) { - return ProjectionMath.greatCircleDistance( Math.toRadians(lon), Math.toRadians(lat), projectionLongitude, projectionLatitude) < Math.toRadians(mapRadius); + return ProjectionMath.greatCircleDistance( ProjectionMath.toRad(lon), ProjectionMath.toRad(lat), projectionLongitude, projectionLatitude) < ProjectionMath.toRad(mapRadius); } /** diff --git a/core/src/main/java/org/locationtech/proj4j/proj/BaconFamilyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/BaconFamilyProjection.java new file mode 100644 index 0000000..f2cc465 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/BaconFamilyProjection.java @@ -0,0 +1,130 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * The three globular projections PROJ 9.8.1 implements in one file, + * {@code src/projections/bacon.cpp}: {@code apian} (Apian Globular I), {@code bacon} + * (Bacon Globular) and {@code ortel} (Ortelius Oval). + * + *

All three draw the parallels as circular arcs through the poles and differ by two + * boolean flags: + * + * + * + * + * + * + * + * + * + *
{@code bacon.cpp:43-82}
{@code +proj=}{@code bacn}{@code ortl}northing
{@code apian}00{@code phi}
{@code bacon}10{@code (pi/2) sin(phi)}
{@code ortel}01{@code phi}
+ * + *

{@code ortl} adds a second easting branch, used only past {@code |lam| >= pi/2}, which + * is what gives the Ortelius Oval its straight outer meridians. + * + *

None of the three has an inverse, upstream or here — {@code P->inv} is never + * assigned ({@code bacon.cpp:53, 66, 80}), and the doc string says {@code no inv} for all + * three. That mark is accurate. {@link #hasInverse()} returns {@code false} and + * {@link Projection#projectInverse} throws rather than echoing the input, so an inverse + * request fails closed. + * + *

Two of these were among the three broken registrations

+ * + *

{@code apian} and {@code bacon} were bound to the abstract {@link Projection} + * class itself in {@code Registry}, alongside {@code alsk}. Until that binding was made to + * report {@link org.locationtech.proj4j.ErrorCause#PROJECTION_NOT_IMPLEMENTED}, resolving + * either name printed an {@code InstantiationException} stack trace to {@code System.err} + * and then reported "Unknown projection: apian" — a message that was false, since the + * name was in the registry. These classes replace those bindings with real implementations. + * {@code alsk} needs {@code mod_ster}, which is out of this batch's scope, and so remains + * bound to the abstract class where it fails closed with an accurate message. + * + *

The {@code + EPS} inside the {@code ortel} square root is deliberate

+ * + *

{@code bacon.cpp:31} computes + * {@code sqrt(HLFPI2 - phi*phi + EPS)} with {@code EPS = 1e-10} added inside the + * radicand. At {@code |phi| = pi/2} the exact radicand is zero, and the epsilon is there so + * that rounding cannot make it negative. Keep it: removing it is a correctness change at the + * poles, and adding it outside the root changes the value everywhere. + */ +abstract class BaconFamilyProjection extends Projection { + + private static final long serialVersionUID = 6742930538699377977L; + + /** {@code (pi/2)^2}, as the literal at {@code bacon.cpp:8}. */ + private static final double HLFPI2 = 2.46740110027233965467; + + private static final double EPS = 1e-10; + + private static final double HALF_PI = Math.PI / 2.0; + + private final boolean bacn; + private final boolean ortl; + + protected BaconFamilyProjection(boolean bacn, boolean ortl) { + this.bacn = bacn; + this.ortl = ortl; + es = 0.0; + initialize(); + } + + /** {@code bacon_s_forward}, {@code bacon.cpp:22-41}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + dst.y = bacn ? HALF_PI * StrictMath.sin(phi) : phi; + final double ax = Math.abs(lam); + if (ax >= EPS) { + double x; + if (ortl && ax >= HALF_PI) { + x = Math.sqrt(HLFPI2 - phi * phi + EPS) + ax - HALF_PI; + } else { + final double f = 0.5 * (HLFPI2 / ax + ax); + x = ax - f + Math.sqrt(f * f - dst.y * dst.y); + } + dst.x = lam < 0.0 ? -x : x; + } else { + dst.x = 0.0; + } + return dst; + } + + /** {@code false}: {@code bacon.cpp} never assigns {@code P->inv} for any of the three. */ + public boolean hasInverse() { + return false; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that != null && getClass() == that.getClass()) { + BaconFamilyProjection p = (BaconFamilyProjection) that; + return bacn == p.bacn && ortl == p.ortl && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(bacn, ortl, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/BaconGlobularProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/BaconGlobularProjection.java new file mode 100644 index 0000000..8307b92 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/BaconGlobularProjection.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Bacon Globular ({@code +proj=bacon}), {@code 9.8.1:src/projections/bacon.cpp:43-55}. + * {@code bacn = 1}, so the northing is {@code (pi/2) sin(phi)} rather than {@code phi} — + * which is what pulls the parallels together towards the poles. + * + *

Replaces one of the three registrations that bound a {@code +proj=} name to the + * abstract {@link Projection} class. See {@link BaconFamilyProjection}. + * + * @see BaconFamilyProjection + */ +public class BaconGlobularProjection extends BaconFamilyProjection { + + private static final long serialVersionUID = -7925808189912110327L; + + public BaconGlobularProjection() { + super(true, false); + } + + public String toString() { + return "Bacon Globular"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Bertin1953Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Bertin1953Projection.java new file mode 100644 index 0000000..3abb977 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Bertin1953Projection.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Bertin 1953 ({@code +proj=bertin1953}), a port of + * {@code 9.8.1:src/projections/bertin1953.cpp}. Forward only. + * + *

Jacques Bertin's 1953 world map, the French cartographic school's standard choice for + * global phenomena. The formula is Philippe Rivière's 2017 reconstruction + * (visionscarto.net) — Bertin + * drew the original by hand, so there is no analytic original to be faithful to and the + * reconstruction is the definition. + * + *

Five stages, in order: + * + *

    + *
  1. Rotate to a pole at {@code lat_0 = -42} degrees, via a Cartesian intermediate. + *
  2. {@code adjlon} the rotated longitude into {@code (-pi, pi]}. + *
  3. A piecewise pre-warp applied only where {@code lam + phi < -1.4}, which + * stretches the South Pacific so the continents do not crowd. + *
  4. Hammer(1.68, 2), i.e. Hammer with the easting stretched by {@code w = 1.68}. + *
  5. A piecewise post-warp with different formulas for {@code y < 0} and + * {@code y > 0}. + *
+ * + *

It hard-codes its own origin and ignores {@code +lat_0} / {@code +lon_0}

+ * + *

{@code bertin1953.cpp:81-82} sets {@code P->lam0 = 0} and + * {@code P->phi0 = PJ_TORAD(-42.)} unconditionally, after the generic parameter pass + * has already read {@code +lat_0} and {@code +lon_0}. So {@code +proj=bertin1953 +lat_0=30} + * silently behaves as {@code +lat_0=-42}. The rotation constants are then derived from that + * fixed {@code phi0}, and a further {@code -16.5} degrees is added to the longitude inside the + * forward ({@code :36}). + * + *

This class therefore reads neither {@link Projection#projectionLatitude} nor + * {@link Projection#projectionLongitude}, and computes the rotation constants from the fixed + * value. Since {@code Projection.project} subtracts {@code projectionLongitude} before + * calling {@link #project}, a caller passing {@code +lon_0} would still see a shifted map — + * that is a pre-existing difference in where the two libraries apply the central meridian, + * not something this class can correct without changing the shared forward path. + * + *

{@code cos_delta_gamma} and {@code sin_delta_gamma} are constants

+ * + *

They are set to {@code 1} and {@code 0} ({@code bertin1953.cpp:86-87}) and never + * changed, so the {@code delta_gamma} rotation is the identity. The terms are retained in the + * transcription because removing them would obscure the correspondence with upstream and with + * the Snyder oblique-rotation form the code is an instance of — but note that + * {@code z0 * cos_delta_gamma + y * sin_delta_gamma} is just {@code z0}, and the + * {@code atan2}'s first argument reduces to {@code y}. + * + *

The two warps are asymmetric and the tests are strict inequalities

+ * + *

The post-warp's two branches ({@code :64-69}) are {@code y < 0} and {@code y > 0}, so + * {@code y == 0} is left alone by both — not an accident, since the {@code y < 0} branch + * scales {@code x} and the {@code y > 0} branch scales {@code y}, and at the equator neither + * is wanted. And the {@code y > 0} branch multiplies by {@code 1 + d / 1.5 * x^2} using the + * already-warped {@code x}: C evaluates the {@code y < 0} branch first, but since the + * two conditions are disjoint no sequencing issue arises. Transcribed as two independent + * {@code if}s. + */ +public class Bertin1953Projection extends Projection { + + private static final long serialVersionUID = 5480943740504988035L; + + /** {@code phi0}, hard-coded at {@code bertin1953.cpp:82}. */ + private static final double PHI_0 = ProjectionMath.toRad(-42.0); + + /** The extra longitude offset applied inside the forward, {@code bertin1953.cpp:36}. */ + private static final double DELTA_LAMBDA = ProjectionMath.toRad(-16.5); + + private static final double FU = 1.4; + private static final double K = 12.0; + private static final double W = 1.68; + + private final double cosDeltaPhi = StrictMath.cos(PHI_0); + private final double sinDeltaPhi = StrictMath.sin(PHI_0); + // bertin1953.cpp:86-87 -- the delta_gamma rotation is the identity. + private static final double COS_DELTA_GAMMA = 1.0; + private static final double SIN_DELTA_GAMMA = 0.0; + + public Bertin1953Projection() { + es = 0.0; + initialize(); + } + + /** {@code bertin1953_s_forward}, {@code bertin1953.cpp:28-72}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + double d; + + /* Rotate -- bertin1953.cpp:34-47 */ + lam += DELTA_LAMBDA; + double cosphi = StrictMath.cos(phi); + final double x = StrictMath.cos(lam) * cosphi; + final double y = StrictMath.sin(lam) * cosphi; + final double z = StrictMath.sin(phi); + double z0 = z * cosDeltaPhi + x * sinDeltaPhi; + lam = StrictMath.atan2(y * COS_DELTA_GAMMA - z0 * SIN_DELTA_GAMMA, + x * cosDeltaPhi - z * sinDeltaPhi); + z0 = z0 * COS_DELTA_GAMMA + y * SIN_DELTA_GAMMA; + phi = StrictMath.asin(z0); + + lam = ProjectionMath.adjlon(lam); + + /* Adjust pre-projection -- bertin1953.cpp:50-54 */ + if (lam + phi < -FU) { + d = (lam - phi + 1.6) * (lam + phi + FU) / 8.0; + lam += d; + phi -= 0.8 * d * StrictMath.sin(phi + Math.PI / 2.0); + } + + /* Project with Hammer(1.68, 2) -- bertin1953.cpp:57-60 */ + cosphi = StrictMath.cos(phi); + d = Math.sqrt(2.0 / (1.0 + cosphi * StrictMath.cos(lam / 2.0))); + dst.x = W * d * cosphi * StrictMath.sin(lam / 2.0); + dst.y = d * StrictMath.sin(phi); + + /* Adjust post-projection -- bertin1953.cpp:63-69 */ + d = (1.0 - StrictMath.cos(lam * phi)) / K; + if (dst.y < 0.0) { + dst.x *= 1.0 + d; + } + if (dst.y > 0.0) { + dst.y *= 1.0 + d / 1.5 * dst.x * dst.x; + } + return dst; + } + + /** {@code false}: {@code P->inv} is never assigned, and the doc string says {@code no inv}. */ + public boolean hasInverse() { + return false; + } + + public String toString() { + return "Bertin 1953"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/BipolarProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/BipolarProjection.java index fb8eff8..17f891a 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/BipolarProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/BipolarProjection.java @@ -19,12 +19,51 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Bipolar conic of the western hemisphere ({@code +proj=bipc}), ported from + * {@code 9.8.1:src/projections/bipc.cpp}. + * + *

All eighteen constants below are byte-identical to upstream's, and always were. The + * {@code builtins.gie} failures came from three things that are not arithmetic at all: + * + *

    + *
  1. A {@code lon_0} of −90° that PROJ does not have. {@code PJ_PROJECTION(bipc)} + * never assigns {@code P->lam0}, so it stays 0. This constructor set + * {@code projectionLongitude = -pi/2}, and {@link Projection#project} then handed + * {@link #project} {@code lam + 90deg} — pushing the point out of the western hemisphere, so + * {@code z > R104} and the {@code al < 0} guard fired. With {@code +a=6400000}, + * {@code (2, ±1)} threw and {@code (-2, ±1)} returned finite values wrong by + * 1.06e7 m.
  2. + *
  3. {@code initialize()} omitted {@code es = 0}. Upstream sets it, which is why + * {@code +proj=bipc +ellps=GRS80} and {@code +proj=bipc +a=6400000} differ in the corpus by + * nothing but the ratio of their semi-major axes. Without it the ellipsoidal + * {@code totalScale}/{@code one_es} state is live on a projection whose kernel is purely + * spherical.
  4. + *
  5. The inverse's recentring was dead code. Upstream reassigns {@code xy.y} in place — + * {@code xy.y = rhoc - xy.y} or {@code xy.y += rhoc} — and then computes + * {@code r = hypot(xy.x, xy.y)} and {@code Az = atan2(xy.x, xy.y)} from the shifted + * value. The old translation wrote the shift into the output coordinate and then read + * the unshifted inputs for both {@code r} and {@code Az}, so the {@code rhoc} translation never + * reached the arithmetic. In the {@code !noskew} case it was worse than dead: {@code out.y += + * rhoc} incremented whatever the caller happened to have left in the output object. The + * {@code noskew} pre-rotation had the identical defect. Latitudes came back wrong by roughly + * 57°.
  6. + *
+ * + *

{@code +ns} (upstream's {@code noskew}) is still not a {@code Proj4Keyword}, so + * {@link #setNoskew} exists for the parser to reach but nothing calls it yet; the corpus's two + * {@code bipc} blocks do not use it. + */ public class BipolarProjection extends Projection { + private static final long serialVersionUID = 3539379562111642231L; + private boolean noskew; private final static double EPS = 1e-10; @@ -48,39 +87,40 @@ public class BipolarProjection extends Projection { private final static double R104 = 1.81514242207410275904; public BipolarProjection() { - minLatitude = Math.toRadians(-80); - maxLatitude = Math.toRadians(80); - projectionLongitude = Math.toRadians(-90); - minLongitude = Math.toRadians(-90); - maxLongitude = Math.toRadians(90); + minLatitude = ProjectionMath.toRad(-80); + maxLatitude = ProjectionMath.toRad(80); + // NO projectionLongitude here: PJ_PROJECTION(bipc) never sets P->lam0. See the class javadoc. + minLongitude = ProjectionMath.toRad(-90); + maxLongitude = ProjectionMath.toRad(90); } public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double cphi, sphi, tphi, t, al, Az, z, Av, cdlam, sdlam, r; boolean tag; - cphi = Math.cos(lpphi); - sphi = Math.sin(lpphi); - cdlam = Math.cos(sdlam = lamB - lplam); - sdlam = Math.sin(sdlam); + cphi = FastStrictTrig.cos(lpphi); + sphi = FastStrictTrig.sin(lpphi); + cdlam = FastStrictTrig.cos(sdlam = lamB - lplam); + sdlam = FastStrictTrig.sin(sdlam); if (Math.abs(Math.abs(lpphi) - ProjectionMath.HALFPI) < EPS10) { Az = lpphi < 0. ? Math.PI : 0.; - tphi = Double.MAX_VALUE; + tphi = Double.POSITIVE_INFINITY; } else { tphi = sphi / cphi; Az = Math.atan2(sdlam , C45 * (tphi - cdlam)); } if (tag = (Az > Azba)) { - cdlam = Math.cos(sdlam = lplam + R110); - sdlam = Math.sin(sdlam); + cdlam = FastStrictTrig.cos(sdlam = lplam + R110); + sdlam = FastStrictTrig.sin(sdlam); z = S20 * sphi + C20 * cphi * cdlam; if (Math.abs(z) > 1.) { if (Math.abs(z) > ONEEPS) - throw new ProjectionException("F"); + throw outsideDomain("forward", lplam, lpphi, "|cos(z)| = " + Math.abs(z) + + " exceeds " + ONEEPS + " on the Azab branch"); else z = z < 0. ? -1. : 1.; } else z = Math.acos(z); - if (tphi != Double.MAX_VALUE) + if (!Double.isInfinite(tphi)) Az = Math.atan2(sdlam, (C20 * tphi - S20 * cdlam)); Av = Azab; out.y = rhoc; @@ -88,28 +128,33 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { z = S45 * (sphi + cphi * cdlam); if (Math.abs(z) > 1.) { if (Math.abs(z) > ONEEPS) - throw new ProjectionException("F"); + throw outsideDomain("forward", lplam, lpphi, "|cos(z)| = " + Math.abs(z) + + " exceeds " + ONEEPS + " on the Azba branch"); else z = z < 0. ? -1. : 1.; } else z = Math.acos(z); Av = Azba; out.y = -rhoc; } - if (z < 0.) throw new ProjectionException("F"); + if (z < 0.) + throw outsideDomain("forward", lplam, lpphi, "the polar angle z = " + z + + " is negative"); r = F * (t = Math.pow(Math.tan(.5 * z), n)); if ((al = .5 * (R104 - z)) < 0.) - throw new ProjectionException("F"); + throw outsideDomain("forward", lplam, lpphi, "z = " + z + + " rad is beyond R104 = " + R104 + ", i.e. outside the mapped hemisphere"); al = (t + Math.pow(al, n)) / T; if (Math.abs(al) > 1.) { if (Math.abs(al) > ONEEPS) - throw new ProjectionException("F"); + throw outsideDomain("forward", lplam, lpphi, "|cos(alpha)| = " + Math.abs(al) + + " exceeds " + ONEEPS); else al = al < 0. ? -1. : 1.; } else al = Math.acos(al); if (Math.abs(t = n * (Av - Az)) < al) - r /= Math.cos(al + (tag ? t : -t)); - out.x = r * Math.sin(t); - out.y += (tag ? -r : r) * Math.cos(t); + r /= FastStrictTrig.cos(al + (tag ? t : -t)); + out.x = r * FastStrictTrig.sin(t); + out.y += (tag ? -r : r) * FastStrictTrig.cos(t); if (noskew) { t = out.x; out.x = -out.x * cAzc - out.y * sAzc; @@ -118,43 +163,58 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * Inverse projection, {@code bipc_s_inverse}. + *

+ * The two recentrings are in-place reassignments of the working coordinate, not writes to + * the output. Upstream mutates {@code xy} and then reads it back for {@code hypot} and + * {@code atan2}; the previous translation wrote to {@code out} and read the unshifted inputs, + * which made the whole {@code rhoc} translation dead and left {@code out.y += rhoc} reading + * whatever the caller's output object already held. Hence the two locals. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { double t, r, rp, rl, al, z = 0, fAz, Az, s, c, Av; boolean neg; int i; + double x = xyx; + double y = xyy; if (noskew) { - t = xyx; - out.x = -xyx * cAzc + xyy * sAzc; - out.y = -xyy * cAzc - t * sAzc; + t = x; + x = -x * cAzc + y * sAzc; + y = -y * cAzc - t * sAzc; } - if (neg = (xyx < 0.)) { - out.y = rhoc - xyy; + if (neg = (x < 0.)) { + y = rhoc - y; s = S20; c = C20; Av = Azab; } else { - out.y += rhoc; + y += rhoc; s = S45; c = C45; Av = Azba; } - rl = rp = r = ProjectionMath.distance(xyx, xyy); - fAz = Math.abs(Az = Math.atan2(xyx, xyy)); + rl = rp = r = ProjectionMath.distance(x, y); + fAz = Math.abs(Az = Math.atan2(x, y)); for (i = NITER; i > 0; --i) { z = 2. * Math.atan(Math.pow(r / F,1 / n)); al = Math.acos((Math.pow(Math.tan(.5 * z), n) + Math.pow(Math.tan(.5 * (R104 - z)), n)) / T); if (fAz < al) - r = rp * Math.cos(al + (neg ? Az : -Az)); + r = rp * FastStrictTrig.cos(al + (neg ? Az : -Az)); if (Math.abs(rl - r) < EPS) break; rl = r; } - if (i == 0) throw new ProjectionException("I"); + if (i == 0) + throw outsideDomain("inverse", xyx, xyy, "the radius iteration did not settle to " + + EPS + " within " + NITER + " trips"); Az = Av - Az / n; - out.y = Math.asin(s * Math.cos(z) + c * Math.sin(z) * Math.cos(Az)); - out.x = Math.atan2(Math.sin(Az), c / Math.tan(z) - s * Math.cos(Az)); + out.y = ProjectionMath.asinChecked(s * FastStrictTrig.cos(z) + + c * FastStrictTrig.sin(z) * FastStrictTrig.cos(Az)); + out.x = Math.atan2(FastStrictTrig.sin(Az), + c / FastStrictTrig.tan(z) - s * FastStrictTrig.cos(Az)); if (neg) out.x -= R110; else @@ -162,13 +222,52 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) return out; } + /** + * @param direction {@code "forward"} or {@code "inverse"}, for the message + * @param u the first ordinate as supplied + * @param v the second ordinate as supplied + * @param why what upstream's guard tested + * @return the exception to throw + */ + private ProjectionException outsideDomain(String direction, double u, double v, String why) { + return new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + direction + " of (" + u + ", " + v + ") is outside the mapped hemisphere: " + why); + } + public boolean hasInverse() { return true; } + /** + * {@code +ns}: rotate the (x, y) frame so the two conics' common axis is horizontal. + *

+ * Not yet a {@code Proj4Keyword}, so nothing calls this; it exists so that registering the key + * is a one-line parser change rather than a change here as well. Neither {@code bipc} block in + * {@code builtins.gie} uses it. + * + * @param noskew whether to apply the de-skew rotation + */ + public void setNoskew(boolean noskew) { + this.noskew = noskew; + } + + public boolean isNoskew() { + return noskew; + } + + /** + * {@code PJ_PROJECTION(bipc)}, whose entire body beyond wiring the two kernels is + * {@code Q->noskew = pj_param(...,"bns").i} and {@code P->es = 0}. + *

+ * The {@code es = 0} is the load-bearing half and it was missing. It must be assigned + * before {@code super.initialize()}, which derives {@code spherical}, {@code one_es} + * and {@code rone_es} from it. Assigning constants is idempotent, so the second call the parser + * makes is a no-op — non-negotiable 4. + */ public void initialize() { // bipc + es = 0.; + e = 0.; super.initialize(); -// noskew = pj_param(params, "bns").i;//FIXME } public String toString() { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/BoggsProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/BoggsProjection.java index a73eda0..40d9e24 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/BoggsProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/BoggsProjection.java @@ -19,11 +19,14 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.util.ProjectionMath; public class BoggsProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = -8276209929534434283L; + private final static int NITER = 20; private final static double EPS = 1e-7; private final static double ONETOL = 1.000001; @@ -32,8 +35,16 @@ public class BoggsProjection extends PseudoCylindricalProjection { private final static double FYC = 0.49931; private final static double FYC2 = 1.41421356237309504880; + /** + * Forward projection. + *

+ * Fail-closed. PROJ's {@code boggs.cpp} runs its Newton iteration to a fixed + * {@code NITER} and then simply uses whatever {@code theta} holds — there is no convergence + * test at all, so an exhausted iteration is reported as a perfectly ordinary coordinate, + * wrong by an unbounded amount. Proj4J throws. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - double theta, th1, c; + double theta, th1 = Double.NaN, c; int i; theta = lpphi; @@ -46,6 +57,12 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { (1. + Math.cos(theta)); if (Math.abs(th1) < EPS) break; } + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + EPS + + " within " + NITER + " iterations for latitude " + lpphi + + " rad (last correction " + th1 + ")"); + } theta *= 0.5; out.x = FXC * lplam / (1. / Math.cos(lpphi) + FXC2 / Math.cos(theta)); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/BonneProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/BonneProjection.java index ec37124..bb55a2f 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/BonneProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/BonneProjection.java @@ -21,14 +21,59 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Bonne (Werner when {@code lat_1 = 90}), {@code 9.8.1:src/projections/bonne.cpp}. + * + *

The ellipsoidal branch is meridian-arc arithmetic throughout, so + * {@code ProjectionMath.enfn}/{@code mlfn}/{@code inv_mlfn} are replaced by {@link MeridianArc}, + * the port of {@code 9.8.1:src/mlfn.cpp}. Two consequences beyond accuracy: the series is 6th + * order in the third flattening rather than in {@code es}, and the inverse is + * closed form where proj4j ran a ten-step Newton loop against its own forward. + * + *

Three defects were in the way of asserting anything about this projection against + * {@code builtins.gie:671-780}, and all three are fixed here because they are all in this file. + * + *

    + *
  1. {@code +lat_1} was ignored. {@code phi1} was hard-wired to {@code pi/2} with the + * parameter read commented out, so {@code +proj=bonne +lat_1=0.5} silently produced the + * Werner aspect: forward of {@code (2, 1)} landed 9,944 km from the value + * {@code builtins.gie:674} expects. {@code bonne.cpp:126-131} reads {@code lat_1} and errors + * when {@code |lat_1| < 1e-10}; that is now what happens. + *
  2. The ellipsoidal forward had no small-{@code rh} guard. {@code bonne.cpp:29-35} wraps + * the whole body in {@code if (fabs(rh) > EPS10)} and yields {@code (0, 0)} otherwise. Without + * it, {@code +lat_1=90} at the pole computes {@code 0/0}: {@code am1} there is + * {@code 6.1e-17} while {@code m1} is {@code 1.57}, so {@code am1 + m1} rounds back to + * {@code m1} and {@code rh} is exactly zero. {@code builtins.gie:706-712} expects + * {@code (0, 0)}; proj4j returned {@code (NaN, NaN)}. + *
  3. The inverse read the northing it had just overwritten. {@code rh} was computed from + * {@code am1 - y} — correctly — but the {@code atan2} that recovers the longitude was still + * passed the original {@code y}. For {@code +lat_1=0.5}, {@code am1} is about 114.6 + * and {@code y/a} about {@code 1.6e-5}, so {@code atan2} was handed operands differing by + * seven orders of magnitude and returned 1.1 rad instead of 2.7e-7. Upstream mutates + * {@code xy.y} in place ({@code bonne.cpp:80-98}) precisely so that both uses see the shifted + * value; the shifted value is now a named local. The same passage supplies the + * {@code copysign(hypot(...), phi1)} and the negated {@code atan2} arguments for southern + * {@code lat_1}, which proj4j also lacked. + *
+ */ public class BonneProjection extends Projection { + + private static final long serialVersionUID = 5102707395837530041L; + private double phi1; private double cphi1; private double am1; private double m1; - private double[] en; + + /** + * The 6th-order meridian-arc series. Built once per CRS in {@link #initialize()} — its + * coefficients depend only on the ellipsoid — and immutable and {@link java.io.Serializable} + * thereafter. + */ + private MeridianArc meridian; public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { if (spherical) { @@ -43,35 +88,45 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { } else { double rh, E, c; - rh = am1 + m1 - ProjectionMath.mlfn(lpphi, E = Math.sin(lpphi), c = Math.cos(lpphi), en); - E = c * lplam / (rh * Math.sqrt(1. - es * E * E)); - out.x = rh * Math.sin(E); - out.y = am1 - rh * Math.cos(E); + rh = am1 + m1 - meridian.mlfn(lpphi, E = Math.sin(lpphi), c = Math.cos(lpphi)); + // bonne.cpp:30: the guard is on rh, and it is what keeps +lat_1=90 at the pole from + // evaluating 0/0. + if (Math.abs(rh) > EPS10) { + E = c * lplam / (rh * Math.sqrt(1. - es * E * E)); + out.x = rh * Math.sin(E); + out.y = am1 - rh * Math.cos(E); + } else + out.x = out.y = 0.; } return out; } public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { if (spherical) { - double rh; - - rh = ProjectionMath.distance(xyx, out.y = cphi1 - xyy); + // bonne.cpp:53-75. dy is the shifted northing; both the radius and the atan2 must + // see it, which is why upstream assigns it back into xy.y. + double dy = cphi1 - xyy; + double rh = Math.copySign(ProjectionMath.distance(xyx, dy), phi1); out.y = cphi1 + phi1 - rh; - if (Math.abs(out.y) > ProjectionMath.HALFPI) throw new ProjectionException("I"); - if (Math.abs(Math.abs(out.y) - ProjectionMath.HALFPI) <= EPS10) + double absPhi = Math.abs(out.y); + if (absPhi > ProjectionMath.HALFPI) throw new ProjectionException("I"); + if (ProjectionMath.HALFPI - absPhi <= EPS10) out.x = 0.; - else - out.x = rh * Math.atan2(xyx, xyy) / Math.cos(out.y); + else { + double lm = rh / Math.cos(out.y); + out.x = phi1 > 0 ? lm * Math.atan2(xyx, dy) : lm * Math.atan2(-xyx, -dy); + } } else { - double s, rh; - - rh = ProjectionMath.distance(xyx, out.y = am1 - xyy); - out.y = ProjectionMath.inv_mlfn(am1 + m1 - rh, es, en); - if ((s = Math.abs(out.y)) < ProjectionMath.HALFPI) { - s = Math.sin(out.y); - out.x = rh * Math.atan2(xyx, xyy) * - Math.sqrt(1. - es * s * s) / Math.cos(out.y); - } else if (Math.abs(s - ProjectionMath.HALFPI) <= EPS10) + // bonne.cpp:78-102. + double dy = am1 - xyy; + double rh = Math.copySign(ProjectionMath.distance(xyx, dy), phi1); + out.y = meridian.invMlfn(am1 + m1 - rh); + double absPhi = Math.abs(out.y); + if (absPhi < ProjectionMath.HALFPI) { + double s = Math.sin(out.y); + double lm = rh * Math.sqrt(1. - es * s * s) / Math.cos(out.y); + out.x = phi1 > 0 ? lm * Math.atan2(xyx, dy) : lm * Math.atan2(-xyx, -dy); + } else if (absPhi - ProjectionMath.HALFPI <= EPS10) out.x = 0.; else throw new ProjectionException("I"); } @@ -94,14 +149,16 @@ public void initialize() { double c; -// phi1 = pj_param(params, "rlat_1").f; - phi1 = ProjectionMath.HALFPI; + // bonne.cpp:126-131: lat_1 is a required parameter, and |lat_1| == 0 is an error rather + // than a silent fallback to the Werner aspect. + phi1 = projectionLatitude1; if (Math.abs(phi1) < EPS10) - throw new ProjectionException("-23"); + throw new ProjectionException("Invalid value for lat_1: |lat_1| should be > 0"); if (!spherical) { - en = ProjectionMath.enfn(es); - m1 = ProjectionMath.mlfn(phi1, am1 = Math.sin(phi1), - c = Math.cos(phi1), en); + meridian = MeridianArc.fromEs(es); + am1 = Math.sin(phi1); + c = Math.cos(phi1); + m1 = meridian.mlfn(phi1, am1, c); am1 = c / (Math.sqrt(1. - es * am1 * am1) * am1); } else { if (Math.abs(phi1) + EPS10 >= ProjectionMath.HALFPI) diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CalCOFIProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CalCOFIProjection.java new file mode 100644 index 0000000..b30f686 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/CalCOFIProjection.java @@ -0,0 +1,195 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * CalCOFI line/station, {@code +proj=calcofi} — a port of + * {@code 9.8.1:src/projections/calcofi.cpp}. + * + *

The California Cooperative Oceanic Fisheries Investigations survey grid: a Mercator + * shear about the reference point O (line 80, station 60, at 121.15°W 34.15°N) rotated + * 30°, with one line unit equal to 1/5 of a degree of longitude at O and one station unit + * equal to 1/15 of a degree. Both an ellipsoidal and a spherical kernel, dispatched on + * {@code es == 0} exactly as upstream does — the sphere is not a special case of the + * ellipsoid here, because upstream's spherical arm uses {@code log(tan(pi/4 + phi/2))} directly + * rather than {@code pj_tsfn} with {@code e = 0}, and its inverse uses + * {@code pi/2 - 2 atan(exp(-y))} rather than {@code pj_phi2}. + * + *

The output is not metres, and the affine is deliberately disabled

+ * + *

{@code PJ_PROJECTION(calcofi)} ({@code calcofi.cpp:132-152}) overwrites five of the host's + * own fields after they have been parsed: + * + *

+ *   P->lam0 = 0;  P->ra = 1;  P->a = 1;  P->x0 = 0;  P->y0 = 0;  P->over = 1;
+ * 
+ * + *

with its own comment "if the user has specified +lon_0 or +k0 for some reason, we're going + * to ignore it so that xy is consistent with point O". So {@code +lon_0}, {@code +x_0} and + * {@code +y_0} are silently discarded, and the corpus asserts exactly that: the three + * {@code +lon_0=50} blocks at {@code builtins.gie:835-849} expect the same numbers a bare + * definition gives. What survives is {@code +to_meter}/{@code +fr_meter} (upstream never + * touches them, so {@link Projection#fromMetres} is left alone here too) and the + * ellipsoid, whose {@code e} both kernels still read even though {@code a} has been + * replaced by 1. + * + *

{@code +R=400} therefore still changes the answer, not by scaling but by selecting the + * spherical kernel — which is why {@code builtins.gie:845} differs from + * {@code builtins.gie:840} in the fourth significant figure. + * + *

{@code over = 1} is load-bearing

+ * + *

Four corpus rows in the inverse direction expect longitudes of + * {@code -207.447024504} and {@code -62.486322854} degrees — the first is outside + * ±180°. {@code inv_finalize} only wraps when {@code P->over} is zero, and + * {@code calcofi} sets it, so the revolution count is kept. Without + * {@link Projection#setOver(boolean)} those rows come back at {@code 152.55}°, wrong by + * a full turn and with no error raised. + * + *

{@code RAD_TO_DEG} is a multiply here, not a divide

+ * + *

Upstream writes {@code RAD_TO_DEG * (ry - PT_O_PHI)}, so this uses + * {@link ProjectionMath#RTD} (a multiply) rather than {@link ProjectionMath#toDeg} (which + * divides by {@code DTR}, matching {@code PJ_TODEG}). The two differ by an ulp on 46 of 721 + * whole-degree arguments. {@code ProjectionMath.RTD} and PROJ's {@code RAD_TO_DEG} literal + * {@code 57.295779513082321} are the same {@code double}. + * + * @see 9.8.1 + * calcofi.cpp + */ +public class CalCOFIProjection extends CylindricalProjection { + + private static final long serialVersionUID = -4437022909865140518L; + + private static final double EPS10 = 1.e-10; + private static final double DEG_TO_LINE = 5; + private static final double DEG_TO_STATION = 15; + private static final double LINE_TO_RAD = 0.0034906585039886592; + private static final double STATION_TO_RAD = 0.0011635528346628863; + /** Reference point O is at line 80. */ + private static final double PT_O_LINE = 80; + /** … station 60. */ + private static final double PT_O_STATION = 60; + /** … longitude −121.15°. */ + private static final double PT_O_LAMBDA = -2.1144663887911301; + /** … and latitude 34.15°. */ + private static final double PT_O_PHI = 0.59602993955606354; + /** The CalCOFI grid angle, 30° in radians. */ + private static final double ROTATION_ANGLE = 0.52359877559829882; + + private static final double SIN_ROTATION = FastStrictTrig.sin(ROTATION_ANGLE); + private static final double COS_ROTATION = FastStrictTrig.cos(ROTATION_ANGLE); + private static final double TAN_ROTATION = FastStrictTrig.tan(ROTATION_ANGLE); + private static final double SIN_PT_O_PHI = FastStrictTrig.sin(PT_O_PHI); + + /** + * Port of {@code PJ_PROJECTION(calcofi)} ({@code calcofi.cpp:132-152}). + *

+ * Idempotent: every assignment is a constant, so the second call the parser makes changes + * nothing. + */ + @Override + public void initialize() { + // calcofi.cpp:136-141, applied BEFORE super.initialize() so that totalScale, + // totalFalseEasting and totalFalseNorthing are derived from the overridden values. + projectionLongitude = 0; + a = 1; + falseEasting = 0; + falseNorthing = 0; + setOver(true); + super.initialize(); + } + + /** + * {@code calcofi_e_forward} ({@code calcofi.cpp:31-62}) and {@code calcofi_s_forward} + * ({@code :64-85}), which differ only in how the Mercator ordinate is formed and inverted. + * + * @throws ProjectionException at the poles, where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + if (Math.abs(Math.abs(phi) - ProjectionMath.HALFPI) <= EPS10) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "calcofi is undefined at the poles: |phi| = " + Math.abs(phi) + + " rad is within 1e-10 of pi/2 (calcofi.cpp:40)"); + } + final double y; + final double oy; + if (spherical) { + y = Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * phi)); + oy = Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * PT_O_PHI)); + } else { + y = -Math.log(ConformalLat.tsfn(phi, FastStrictTrig.sin(phi), e)); + oy = -Math.log(ConformalLat.tsfn(PT_O_PHI, SIN_PT_O_PHI, e)); + } + final double l1 = (y - oy) * TAN_ROTATION; + final double l2 = -lam - l1 + PT_O_LAMBDA; + double ry = l2 * COS_ROTATION * SIN_ROTATION + y; + // Inverse Mercator, back to a latitude. + ry = spherical + ? ProjectionMath.HALFPI - 2. * StrictMath.atan(Math.exp(-ry)) + : ConformalLat.phi2(Math.exp(-ry), e); + xy.x = PT_O_LINE - ProjectionMath.RTD * (ry - PT_O_PHI) * DEG_TO_LINE / COS_ROTATION; + xy.y = PT_O_STATION + ProjectionMath.RTD * (ry - phi) * DEG_TO_STATION / SIN_ROTATION; + return xy; + } + + /** + * {@code calcofi_e_inverse} ({@code calcofi.cpp:87-108}) and {@code calcofi_s_inverse} + * ({@code :110-130}). No domain check either side, and none upstream. + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + final double ry = PT_O_PHI - LINE_TO_RAD * (x - PT_O_LINE) * COS_ROTATION; + final double phi = ry - STATION_TO_RAD * (y - PT_O_STATION) * SIN_ROTATION; + final double oymctr; + final double rymctr; + final double xymctr; + if (spherical) { + oymctr = Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * PT_O_PHI)); + rymctr = Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * ry)); + xymctr = Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * phi)); + } else { + oymctr = -Math.log(ConformalLat.tsfn(PT_O_PHI, SIN_PT_O_PHI, e)); + rymctr = -Math.log(ConformalLat.tsfn(ry, FastStrictTrig.sin(ry), e)); + xymctr = -Math.log(ConformalLat.tsfn(phi, FastStrictTrig.sin(phi), e)); + } + final double l1 = (xymctr - oymctr) * TAN_ROTATION; + final double l2 = (rymctr - xymctr) / (COS_ROTATION * SIN_ROTATION); + lp.y = phi; + lp.x = PT_O_LAMBDA - (l1 + l2); + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Cal Coop Ocean Fish Invest Lines/Stations"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CassiniProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CassiniProjection.java index 7533220..58af45d 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/CassiniProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/CassiniProjection.java @@ -20,21 +20,82 @@ package org.locationtech.proj4j.proj; import org.locationtech.proj4j.*; +import org.locationtech.proj4j.util.GenericInverse2D; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Cassini-Soldner, {@code 9.8.1:src/projections/cass.cpp}. + * + *

Three changes, all of them upstream's. + * + *

1. The meridian arc. {@code ProjectionMath.enfn}/{@code mlfn}/{@code inv_mlfn} are + * replaced by {@link MeridianArc}, the port of {@code 9.8.1:src/mlfn.cpp} — a 6th-order series in + * the third flattening, with a closed-form inverse. Measured at longitude 0, where the + * northing is the meridian arc, the forward went from 4.92 um out at latitude 72.55 + * degrees to bit-exact against an independent 64-panel Gauss-Legendre quadrature, and the inverse + * from 4.91 um to 3.2 nm. + * + *

2. The sign of the {@code A^4} easting term. See the comment in {@link #project}: this + * is upstream's {@code 78d89828}, "cass: fix forward computation of easting (fixes #3432)", which + * proj4j predates. It is the dominant part of the forward/inverse mismatch. + * + *

3. The inverse is refined to a true inverse. {@code cass.cpp:75-82} finishes the + * truncated-series inverse with {@code pj_generic_inverse_2d} at a {@code 1e-12} residual, and + * upstream's comment says why: it "enables to make the 5108.gie roundtripping tests to success, + * with at most 2 iterations". proj4j stopped at the series, which is truncated at {@code D^4} and + * therefore is not the inverse of {@link #project} however accurate each half is on its own. That + * is why {@code gigs/5108} passed all 32 of its point checks while 14 of its 17 + * {@code roundtrip 1000} blocks at a 6 mm bar failed. + * + *

Measured on {@code gigs/5108}'s own operation, with the sign already fixed so that only the + * refinement is in question: 3 of 16 round trips pass without it, 16 of 16 with it, the worst + * residual falling from 37.9 m (at longitude 109, 5.6 degrees off the central meridian) to + * 0.06 mm. Against the pre-change code as a whole — old sign, old series, no refinement — the same + * sixteen rows also passed 3 of 16, worst 67.4 m. The refinement works precisely because it inverts + * {@link #project} itself, so it cannot drift from the forward by construction, which is the + * property {@code roundtrip} asserts. + */ public class CassiniProjection extends Projection { + private static final long serialVersionUID = -582473684884518454L; + + /* + * Only initialize()-computed configuration may live in a field. Every quantity that is + * derived from the coordinate being transformed is a local: project()/projectInverse() are + * called concurrently through a shared CoordinateTransform, and per-call scratch held in a + * field interleaves between threads into a finite, plausible, wrong coordinate. + * + * The GenericInverse2D.Forward2D below is a stateless method reference into project(), and the + * two scratch ProjCoordinates GenericInverse2D uses are allocated inside solve(), on the + * calling thread's stack. Nothing here is shared mutable state. + */ + + /** Meridional distance from the equator to the latitude of origin. Set by {@link #initialize()}. */ private double m0; - private double n; - private double t; - private double a1; - private double c; - private double r; - private double dd; - private double d2; - private double a2; - private double tn; - private double[] en; + + /** + * The 6th-order meridian-arc series. Built once per CRS in {@link #initialize()} — its + * coefficient tables depend only on the ellipsoid, and precomputing them is the whole point of + * holding it rather than deriving it per call. Immutable, thread safe and + * {@link java.io.Serializable}, as {@link Projection} requires. + */ + private MeridianArc meridian; + + /** + * {@code Q->hyperbolic}, {@code +hyperbolic} ({@code cass.cpp:127}): the Vanua Levu variant, + * which subtracts a cubic correction from the northing. + * + *

Read upstream with {@code pj_param_exists}, not with the {@code b} sigil — so + * presence is the whole test and {@code +hyperbolic=f} is true. That is why + * {@code Proj4Parser} dispatches it with {@code containsKey} rather than {@code parseBoolean}. + * + *

Also why the inverse needs no change: {@code cass_e_inverse} finishes with + * {@code pj_generic_inverse_2d} unconditionally ({@code cass.cpp:81}), seeded from + * the non-hyperbolic series, so Newton on the hyperbolic {@link #project} converges to the + * hyperbolic inverse by construction. {@link #projectInverse} already does exactly that. + */ + private boolean hyperbolic; private final static double EPS10 = 1e-10; private final static double C1 = .16666666666666666666; @@ -43,11 +104,17 @@ public class CassiniProjection extends Projection { private final static double C4 = .33333333333333333333; private final static double C5 = .06666666666666666666; + /** + * The residual at which {@code cass.cpp:81} stops refining. Upstream's constant, and it is + * reached in at most two iterations for any point the projection is used at. + */ + private final static double DELTA_XY_TOLERANCE = 1e-12; + public CassiniProjection() { - projectionLatitude = Math.toRadians(0); - projectionLongitude = Math.toRadians(0); - minLongitude = Math.toRadians(-90); - maxLongitude = Math.toRadians(90); + projectionLatitude = ProjectionMath.toRad(0); + projectionLongitude = ProjectionMath.toRad(0); + minLongitude = ProjectionMath.toRad(-90); + maxLongitude = ProjectionMath.toRad(90); initialize(); } @@ -56,39 +123,100 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { xy.x = Math.asin(Math.cos(lpphi) * Math.sin(lplam)); xy.y = Math.atan2(Math.tan(lpphi) , Math.cos(lplam)) - projectionLatitude; } else { - xy.y = ProjectionMath.mlfn(lpphi, n = Math.sin(lpphi), c = Math.cos(lpphi), en); - n = 1./Math.sqrt(1. - es * n * n); - tn = Math.tan(lpphi); t = tn * tn; - a1 = lplam * c; + double n = Math.sin(lpphi); + double c = Math.cos(lpphi); + xy.y = meridian.mlfn(lpphi, n, c); + // cass.cpp:31-32. nu_square is kept because the hyperbolic correction below needs + // rho = nu_square * (1 - es) * nu, and recomputing it from nu would cost a second + // square root for no gain. + final double nuSquare = 1./(1. - es * n * n); + n = Math.sqrt(nuSquare); + double tn = Math.tan(lpphi); double t = tn * tn; + double a1 = lplam * c; c *= es * c / (1 - es); - a2 = a1 * a1; + double a2 = a1 * a1; + // cass.cpp:41, Snyder (1987) Eq. 13-1 and EPSG Guidance Note 7-2: + // x = nu * A * (1 - A^2 T (1/6 + (8 - T + 8C) A^2 / 120)) + // proj4j had `C1 - (...)`, which is what PROJ itself had until upstream commit + // 78d89828, "cass: fix forward computation of easting (fixes #3432)". The mis-signed + // term is O(A^4) inside a bracket multiplied by A, so the absolute easting error grows + // like lam^5 -- 31 mm at 2.8 degrees from the central meridian for the +ellps=airy + // case at builtins.gie:931. + // + // The discriminating assertion is builtins.gie:911, the EPSG Guidance Note 7-2 test + // point, whose expected 66644.94040882 links is an external value printed to eight + // decimals: `+` reproduces it exactly and `-` misses it by 2.6e-5 links. Note that + // builtins.gie:859's 222605.285776991 for +ellps=GRS80 at (2, 1) is a *stale* + // expectation from before 78d89828 -- it matches `-` to the last digit and `+` to + // 13.5 um -- and survives only because that block's bar is 0.1 mm. Do not use it to + // choose the sign. xy.x = n * a1 * (1. - a2 * t * - (C1 - (8. - t + 8. * c) * a2 * C2)); + (C1 + (8. - t + 8. * c) * a2 * C2)); xy.y -= m0 - n * tn * a2 * (.5 + (5. - t + 6. * c) * a2 * C3); + if (hyperbolic) { + // cass.cpp:42-45, EPSG Guidance Note 7-2's "Hyperbolic Cassini-Soldner" + // (EPSG method 9833), used by Vanua Levu 1915 / Vanua Levu Grid. Applied to + // the FINISHED northing, cubed - so it must come after the M - m0 + ... line + // above and not be folded into it. + final double rho = nuSquare * (1. - es) * n; + xy.y -= xy.y * xy.y * xy.y / (6. * rho * n); + } } return xy; } + /** + * {@code +hyperbolic}: the Vanua Levu variant of the ellipsoidal forward. + * + *

No effect on a declared sphere, matching {@code PJ_PROJECTION(cass)}, which returns + * before it reads the flag when {@code es == 0}. + * + *

Setting this after {@link #initialize()} is safe and needs no re-initialisation: + * nothing {@code initialize()} computes depends on it, and it is read per coordinate. + * + * @param hyperbolic whether to apply the cubic northing correction + * @since 1.5.0 + */ + public void setHyperbolic(boolean hyperbolic) { + this.hyperbolic = hyperbolic; + } + + /** + * @return whether the {@code +hyperbolic} variant is in force + * @since 1.5.0 + */ + public boolean isHyperbolic() { + return hyperbolic; + } + public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { if (spherical) { - out.y = Math.asin(Math.sin(dd = xyy + projectionLatitude) * Math.cos(xyx)); + double dd = xyy + projectionLatitude; + out.y = Math.asin(Math.sin(dd) * Math.cos(xyx)); out.x = Math.atan2(Math.tan(xyx), Math.cos(dd)); } else { double ph1; - ph1 = ProjectionMath.inv_mlfn(m0 + xyy, es, en); - tn = Math.tan(ph1); t = tn * tn; - n = Math.sin(ph1); - r = 1. / (1. - es * n * n); + ph1 = meridian.invMlfn(m0 + xyy); + double tn = Math.tan(ph1); double t = tn * tn; + double n = Math.sin(ph1); + double r = 1. / (1. - es * n * n); n = Math.sqrt(r); r *= (1. - es) * n; - dd = xyx / n; - d2 = dd * dd; + double dd = xyx / n; + double d2 = dd * dd; out.y = ph1 - (n * tn / r) * d2 * (.5 - (1. + 3. * t) * d2 * C3); out.x = dd * (1. + t * d2 * (-C4 + (1. + 3. * t) * d2 * C5)) / Math.cos(ph1); + + // cass.cpp:75-82. The series above is truncated at D^4, so it is not the inverse of + // project() -- the mismatch grows like lam^4 and reaches 68 mm at 3 degrees from the + // central meridian. Newton on project() itself removes it; upstream uses the same + // seed and the same tolerance, and notes that this is what makes 5108.gie round-trip. + GenericInverse2D.solve(xyx, xyy, this::project, out.x, out.y, + DELTA_XY_TOLERANCE, out); } return out; } @@ -96,9 +224,8 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) public void initialize() { super.initialize(); if (!spherical) { - if ((en = ProjectionMath.enfn(es)) == null) - throw new ProjectionException(); - m0 = ProjectionMath.mlfn(projectionLatitude, Math.sin(projectionLatitude), Math.cos(projectionLatitude), en); + meridian = MeridianArc.fromEs(es); + m0 = meridian.mlfn(projectionLatitude, Math.sin(projectionLatitude), Math.cos(projectionLatitude)); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CentralConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CentralConicProjection.java new file mode 100644 index 0000000..415221c --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/CentralConicProjection.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Central Conic, {@code +proj=ccon} — a port of + * {@code 9.8.1:src/projections/ccon.cpp}. Spherical only; both directions closed form and + * four lines each. + * + *

A cone tangent at {@code +lat_1}, on which distances along the central meridian + * are true and the parallels are circles of radius {@code cot(lat_1) - tan(phi - lat_1)}. The + * projection has no standard parallel other than {@code lat_1} and no ellipsoidal form. + * + *

+ *   r = cot(phi_1) - tan(phi - phi_1)
+ *   x = r sin(lam sin phi_1)
+ *   y = cot(phi_1) - r cos(lam sin phi_1)
+ * 
+ * + *

Two things upstream does that look like mistakes

+ * + *

{@code Q->en} is computed and never read. {@code PJ_PROJECTION(ccon)} calls + * {@code pj_enfn(P->n)} and stores the meridian-arc coefficients, and the destructor frees + * them, but neither the forward nor the inverse touches them — the projection is + * spherical. Nothing is ported for it. + * + *

The inverse's radius is {@code hypot(x, y) - cot(phi_1)}, not the other way round, + * and it is fed to {@code atan} without a sign correction. It is exactly the algebraic inverse + * of the forward for {@code phi_1 > 0}; for {@code phi_1 < 0} the cone opens the other + * way and the pair is no longer mutually inverse everywhere. Reproduced verbatim; the corpus's + * only {@code ccon} block is at {@code +lat_1=52}. + * + *

{@code +lat_1} is mandatory

+ * + *

{@code |lat_1| < 1e-10} is rejected with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} — {@code cot} would be infinite. Since + * {@code pj_param}'s absent-key value is 0, that check also makes a bare {@code +proj=ccon} an + * error, which is why the field's initialiser is 0 rather than any plausible parallel. + * + *

{@code initialize()} runs twice (constructor and parser). {@code phi1} is only ever + * written by {@link Projection#setProjectionLatitude1(double)}; everything else here is + * derived from it on each call. + * + * @see 9.8.1 + * ccon.cpp + */ +public class CentralConicProjection extends ConicProjection { + + private static final long serialVersionUID = -8732698340965281734L; + + private static final double EPS10 = 1e-10; + + private double sinphi1; + private double ctgphi1; + + /** + * Port of {@code PJ_PROJECTION(ccon)} ({@code ccon.cpp:76-101}). + * + * @throws InvalidValueException if {@code |lat_1| < 1e-10}, including the absent case + */ + @Override + public void initialize() { + super.initialize(); + if (Math.abs(projectionLatitude1) < EPS10) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=ccon requires +lat_1 and |lat_1| must be > 0; got " + + projectionLatitude1 + " rad. The cone's cot(lat_1) is infinite at " + + "the equator (ccon.cpp:86-89). Note pj_param answers 0 for an " + + "absent +lat_1, so a bare +proj=ccon is this same error."); + } + sinphi1 = FastStrictTrig.sin(projectionLatitude1); + ctgphi1 = FastStrictTrig.cos(projectionLatitude1) / sinphi1; + } + + /** {@code ccon_forward}, {@code ccon.cpp:42-52}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double r = ctgphi1 - FastStrictTrig.tan(phi - projectionLatitude1); + xy.x = r * FastStrictTrig.sin(lam * sinphi1); + xy.y = ctgphi1 - r * FastStrictTrig.cos(lam * sinphi1); + return xy; + } + + /** {@code ccon_inverse}, {@code ccon.cpp:54-63}. */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + final double yy = ctgphi1 - y; + lp.y = projectionLatitude1 - StrictMath.atan(StrictMath.hypot(x, yy) - ctgphi1); + lp.x = StrictMath.atan2(x, yy) / sinphi1; + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Central Conic"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CentralCylindricalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CentralCylindricalProjection.java index 7bcff04..f9a07ad 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/CentralCylindricalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/CentralCylindricalProjection.java @@ -25,11 +25,13 @@ public class CentralCylindricalProjection extends CylindricalProjection { + private static final long serialVersionUID = -2769616671159644937L; + private final static double EPS10 = 1.e-10; public CentralCylindricalProjection() { - minLatitude = Math.toRadians(-80); - maxLatitude = Math.toRadians(80); + minLatitude = ProjectionMath.toRad(-80); + maxLatitude = ProjectionMath.toRad(80); } public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CollignonProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CollignonProjection.java index d61053e..b5e0940 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/CollignonProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/CollignonProjection.java @@ -19,18 +19,23 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; public class CollignonProjection extends Projection { + private static final long serialVersionUID = 7340703384480636661L; + private final static double FXC = 1.12837916709551257390; private final static double FYC = 1.77245385090551602729; private final static double ONEEPS = 1.0000001; + /** Port of {@code collg_s_forward} ({@code 9.8.1:src/projections/collg.cpp:14-25}). */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - if ((out.y = 1. - Math.sin(lpphi)) <= 0.) + if ((out.y = 1. - FastStrictTrig.sin(lpphi)) <= 0.) out.y = 0.; else out.y = Math.sqrt(out.y); @@ -39,17 +44,38 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * Port of {@code collg_s_inverse} ({@code 9.8.1:src/projections/collg.cpp:27-45}). + *

+ * The previous transcription returned {@code xy.y / FYC - 1} as the latitude, in radians, + * unconditionally. Upstream reassigns {@code lp.phi} twice — first to + * {@code xy.y / FYC - 1}, then to {@code 1 - lp.phi * lp.phi}, and it is the second + * value that {@code asin} is applied to. The old code applied {@code asin} to the first, + * tested the second, and then overwrote the result with the first again on its last line, so + * every inverse latitude was the raw scaled northing: at {@code +proj=collg +a=6400000} and + * {@code (200, 100)} it answered −57.2953° against PROJ's 0.001010° — 6,375 km, + * and 1.0 radian expressed as degrees, which is the signature of exactly this substitution. + * The longitude was wrong for the same reason, taking {@code 1 - sin(phi)} of the wrong angle. + *

+ * The three-way guard is upstream's, including the asymmetry that {@code |lp.phi| < 1} takes + * {@code asin} while {@code |lp.phi|} between 1 and {@code ONEEPS} clamps to a pole and + * anything larger raises. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - double lpphi = xyy / FYC - 1.; - if (Math.abs(out.y = 1. - lpphi * lpphi) < 1.) - out.y = Math.asin(lpphi); - else if (Math.abs(lpphi) > ONEEPS) throw new ProjectionException("I"); - else out.y = lpphi < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - if ((out.x = 1. - Math.sin(lpphi)) <= 0.) - out.x = 0.; - else - out.x = xyx / (FXC * Math.sqrt(out.x)); - out.y = lpphi; + double phi = xyy / FYC - 1.; + phi = 1. - phi * phi; + if (Math.abs(phi) < 1.) { + phi = Math.asin(phi); + } else if (Math.abs(phi) > ONEEPS) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "Collignon inverse: 1 - (y/FYC - 1)^2 = " + phi + " is past ONEEPS = " + ONEEPS + + ", so the northing is outside the map"); + } else { + phi = phi < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } + double c = 1. - FastStrictTrig.sin(phi); + out.x = c <= 0. ? 0. : xyx / (FXC * Math.sqrt(c)); + out.y = phi; return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ColombiaUrbanProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ColombiaUrbanProjection.java new file mode 100644 index 0000000..0ca0e10 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ColombiaUrbanProjection.java @@ -0,0 +1,156 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Colombia Urban ({@code +proj=col_urban}), a port of + * {@code 9.8.1:src/projections/col_urban.cpp}. Ellipsoidal, closed form both ways. + * + *

Notation and formulas are IOGP Publication 373-7-2 (Geomatics Guidance Note 7 part 2, + * March 2020) method 1052. It is a local projection for Colombian city grids: an + * equidistant-cylindrical-like map with a second-order easting correction to the northing + * and, unusually, an explicit height of the projection origin that scales the whole + * grid so that distances are true at working elevation rather than at the ellipsoid. + * + *

Everything is divided by {@code a}

+ * + *

Upstream deliberately departs from the Guidance Note by holding {@code h0}, + * {@code rho0}, {@code B} and {@code D} adimensionally — {@code h0} is the origin + * height divided by the semi-major axis, and {@code rho0}/{@code nu0} are the radii of + * curvature divided by it too ({@code col_urban.cpp:18-23} says so in as many words). The + * {@code a} factor is reintroduced once, by {@link Projection}'s {@code totalScale}. Do not + * "restore" the dimensional forms: the intermediate {@code lam * nu * cosphi} would then be + * in metres and {@code B}'s units would no longer match it. + * + *

+ *   setup:  h0   = h_0 / a
+ *           nu0  = 1 / sqrt(1 - es sin^2 phi0)
+ *           A    = 1 + h0 / nu0
+ *           rho0 = (1 - es) / (1 - es sin^2 phi0)^1.5
+ *           B    = tan(phi0) / (2 rho0 nu0)
+ *           C    = 1 + h0
+ *           D    = rho0 (1 + h0 / (1 - es))
+ * 
+ * + *

The forward is not the algebraic inverse of the inverse

+ * + *

This is the one thing to be careful about, and it is upstream's design, not a defect. + * The forward ({@code col_urban.cpp:27-44}) recomputes a mid-latitude radius of + * curvature from {@code sin(0.5 * (phi + phi0))} and forms {@code G = 1 + h0 / rho_m}, + * using {@code G * rho0} as the northing scale. The inverse ({@code :46-56}) uses the + * constant {@code D} instead, which is the same quantity evaluated at {@code phi = phi0}. + * So forward-then-inverse is not exactly the identity away from the origin latitude; the + * discrepancy is of order {@code h0 * (phi - phi0)^2} and is sub-millimetre over the + * few tens of kilometres the method is scoped to. The corpus asserts + * {@code roundtrip 1} at {@code tolerance 1 mm} for a point 0.12° from the origin, + * which this satisfies. Do not symmetrise the two directions — using {@code D} in + * the forward, or {@code G} in the inverse, moves the forward off the expected easting and + * northing. + * + *

{@code +h_0}

+ * + *

{@code Proj4Keyword} defines {@code h_0} separately from {@code h} (the + * {@code geos}/{@code nsper} orbit height) and {@code Proj4Parser} dispatches it on this concrete + * class, because {@code col_urban} is the only operator that reads it. Leaving it out gives + * {@code h0 = 0}, which is a well-defined but different projection — the ellipsoid-level variant, + * out by about 40 cm per 100 km — so a definition that means the surface variant must say so. + * + *

{@code h_0} is read by upstream as {@code "dh_0"} — the {@code d} prefix meaning a + * plain number, not an angle and not unit-converted — so it is always + * metres regardless of {@code +units}. + */ +public class ColombiaUrbanProjection extends Projection { + + private static final long serialVersionUID = -4338060266902769790L; + + /** {@code +h_0}: height of the projection origin, in metres. Default 0. */ + private double h0Metres = 0.0; + + // Setup-derived, all adimensional. col_urban.cpp:65-73. + private double h0; + private double A; + private double rho0; + private double B; + private double C; + private double D; + + /** + * Sets {@code +h_0}, the height of the projection origin in metres. + * + *

This is what {@code Proj4Parser} calls for {@code +h_0}. Call before + * {@link #initialize()}. + * + * @param h0Metres origin height in metres + */ + public void setH0(double h0Metres) { + this.h0Metres = h0Metres; + } + + /** @return {@code +h_0} in metres */ + public double getH0() { + return h0Metres; + } + + /** {@code PJ_PROJECTION(col_urban)}, {@code col_urban.cpp:58-79}. */ + @Override + public void initialize() { + super.initialize(); + h0 = h0Metres / a; + final double sinphi0 = StrictMath.sin(projectionLatitude); + final double nu0 = 1.0 / Math.sqrt(1.0 - es * sinphi0 * sinphi0); + A = 1.0 + h0 / nu0; + rho0 = (1.0 - es) / StrictMath.pow(1.0 - es * sinphi0 * sinphi0, 1.5); + B = StrictMath.tan(projectionLatitude) / (2.0 * rho0 * nu0); + C = 1.0 + h0; + D = rho0 * (1.0 + h0 / (1.0 - es)); + } + + /** {@code col_urban_forward}, {@code col_urban.cpp:27-44}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + final double cosphi = StrictMath.cos(phi); + final double sinphi = StrictMath.sin(phi); + final double nu = 1.0 / Math.sqrt(1.0 - es * sinphi * sinphi); + final double lamNuCosphi = lam * nu * cosphi; + dst.x = A * lamNuCosphi; + final double sinphiM = StrictMath.sin(0.5 * (phi + projectionLatitude)); + final double rhoM = (1.0 - es) / StrictMath.pow(1.0 - es * sinphiM * sinphiM, 1.5); + final double g = 1.0 + h0 / rhoM; + dst.y = g * rho0 * ((phi - projectionLatitude) + B * lamNuCosphi * lamNuCosphi); + return dst; + } + + /** {@code col_urban_inverse}, {@code col_urban.cpp:46-56}. */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double xOverC = x / C; + final double phi = projectionLatitude + y / D - B * xOverC * xOverC; + final double sinphi = StrictMath.sin(phi); + final double nu = 1.0 / Math.sqrt(1.0 - es * sinphi * sinphi); + dst.y = phi; + dst.x = x / (C * nu * StrictMath.cos(phi)); + return dst; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "Colombia Urban"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CompactMillerProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CompactMillerProjection.java new file mode 100644 index 0000000..a3b6b0a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/CompactMillerProjection.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Compact Miller ({@code +proj=comill}), a port of + * {@code 9.8.1:src/projections/comill.cpp}. + * + *

Tom Patterson's 2014 variant of {@link MillerProjection}, fitted by Bojan Savric and + * Bernhard Jenny. It compresses Miller Cylindrical's height so the map is less tall, + * trading a little more polar area exaggeration for a more usable aspect ratio. The + * simplest member of the family — a cubic in {@code phi^2}, with the easting untouched. + * + *

+ *   x = lam
+ *   y = phi * (K1 + phi^2 (K2 + K3 phi^2))
+ * 
+ * + *

Derivative multipliers {@code 1, 3, 5} ({@code comill.cpp:19-21}) for the powers + * {@code phi^1, phi^3, phi^5}. + * + *

Not to be confused with {@code mill}, which proj4j already has as + * {@link MillerProjection} and which is {@code y = asinh(tan(0.8 phi)) / 0.8} — + * a different construction entirely, not a polynomial fit. + */ +public class CompactMillerProjection extends PolynomialPseudoCylindricalProjection { + + private static final long serialVersionUID = -4839864283547468294L; + + private static final double K1 = 0.9902; + private static final double K2 = 0.1604; + private static final double K3 = -0.03054; + + // comill.cpp:19-21. + private static final double C1 = K1; + private static final double C2 = 3.0 * K2; + private static final double C3 = 5.0 * K3; + + /** {@code comill.cpp:23} — {@code 0.6000207669862655 * pi}. */ + private static final double MAX_Y = 0.6000207669862655 * Math.PI; + + protected double northing(double phi) { + final double phi2 = phi * phi; + return phi * (K1 + phi2 * (K2 + K3 * phi2)); + } + + protected double northingDerivative(double phi) { + final double y2 = phi * phi; + return C1 + y2 * (C2 + C3 * y2); + } + + /** {@code comill.cpp:34} — the easting is {@code lam} exactly. */ + protected double eastingScale(double phi) { + return 1.0; + } + + protected double maxY() { + return MAX_Y; + } + + public String toString() { + return "Compact Miller"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ConicProjection.java index aa4b8f9..2d89162 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/ConicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/ConicProjection.java @@ -28,6 +28,9 @@ * radiating at uniform angular intervals from the apex of the flattened cone. */ public abstract class ConicProjection extends Projection { + + private static final long serialVersionUID = 5392047270781610454L; + public String toString() { return "Conic"; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CrasterProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CrasterProjection.java index 5011d46..11beb43 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/CrasterProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/CrasterProjection.java @@ -23,6 +23,8 @@ public class CrasterProjection extends Projection { + private static final long serialVersionUID = 5199454051644828149L; + private final static double XM = 0.97720502380583984317; private final static double RXM = 1.02332670794648848847; private final static double YM = 3.06998012383946546542; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CylindricalEqualAreaProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CylindricalEqualAreaProjection.java index 76b8a96..f8dff1e 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/CylindricalEqualAreaProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/CylindricalEqualAreaProjection.java @@ -21,12 +21,25 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.AuthalicLat; import org.locationtech.proj4j.util.ProjectionMath; public class CylindricalEqualAreaProjection extends Projection { + private static final long serialVersionUID = -4997310699865808074L; + private double qp; - private double[] apa; + + /** + * The order-6 authalic-latitude machinery, {@code 9.8.1:src/latitudes.cpp}. Replaces + * {@code ProjectionMath.authset}/{@code authlat}/{@code qsfn}. + *

+ * Note that {@code cea}'s forward genuinely wants the raw {@code q} + * ({@code 9.8.1:cea.cpp:21}: {@code xy.y = 0.5 * pj_authalic_lat_q(sin(phi)) / k0}), so + * unlike {@code laea} it does not move to the direct {@code phi -> xi} series; only the + * inverse series changes, from third to sixth order. + */ + private AuthalicLat authalic; public CylindricalEqualAreaProjection() { this(0.0, 0.0, 0.0); @@ -47,8 +60,8 @@ public void initialize() { if (es != 0) { t = Math.sin(t); scaleFactor /= Math.sqrt(1. - es * t * t); - apa = ProjectionMath.authset(es); - qp = ProjectionMath.qsfn(1., e, one_es); + authalic = new AuthalicLat(es); + qp = authalic.qp(); } } @@ -58,7 +71,7 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { xy.y = Math.sin(phi) / scaleFactor; } else { xy.x = scaleFactor * lam; - xy.y = .5 * ProjectionMath.qsfn(Math.sin(phi), e, one_es) / scaleFactor; + xy.y = .5 * authalic.q(Math.sin(phi)) / scaleFactor; } return xy; } @@ -75,7 +88,7 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { lp.x = x / scaleFactor; } else throw new ProjectionException(); } else { - lp.y = ProjectionMath.authlat(Math.asin( 2. * y * scaleFactor / qp), apa); + lp.y = authalic.inverse(Math.asin( 2. * y * scaleFactor / qp)); lp.x = x / scaleFactor; } return lp; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/CylindricalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/CylindricalProjection.java index 471ea97..e2da5e9 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/CylindricalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/CylindricalProjection.java @@ -24,6 +24,9 @@ * and circles of latitude (parallels) are mapped to horizontal lines. */ public abstract class CylindricalProjection extends Projection { + + private static final long serialVersionUID = -7732780621322559050L; + public boolean isRectilinear() { return true; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/DenoyerProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/DenoyerProjection.java index 690f1b1..3a6549f 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/DenoyerProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/DenoyerProjection.java @@ -24,6 +24,8 @@ public class DenoyerProjection extends Projection { + private static final long serialVersionUID = -4494266348236206937L; + public final static double C0 = 0.95; public final static double C1 = -.08333333333333333333; public final static double C3 = 0.00166666666666666666; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert1Projection.java index 9dac922..aa6b5aa 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Eckert1Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert1Projection.java @@ -23,6 +23,8 @@ public class Eckert1Projection extends Projection { + private static final long serialVersionUID = 5575665256900139187L; + private final static double FC = .92131773192356127802; private final static double RP = .31830988618379067154; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert2Projection.java index 02b1026..f3b5989 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Eckert2Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert2Projection.java @@ -25,6 +25,8 @@ public class Eckert2Projection extends Projection { + private static final long serialVersionUID = 6871103723037419539L; + private final static double FXC = 0.46065886596178063902; private final static double FYC = 1.44720250911653531871; private final static double C13 = 0.33333333333333333333; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert3FamilyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert3FamilyProjection.java new file mode 100644 index 0000000..a748598 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert3FamilyProjection.java @@ -0,0 +1,150 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The four pseudo-cylindricals PROJ 9.8.1 implements in one file, + * {@code src/projections/eck3.cpp}: {@code eck3} (Eckert III), {@code kav7} + * (Kavrayskiy VII), {@code wag6} (Wagner VI) and {@code putp1} (Putnins P1). + * + *

They differ only in four constants. The whole family is + * + *

+ *   y = C_y * phi
+ *   x = C_x * lam * (A + sqrt(1 - B * phi^2))
+ * 
+ * + *

with the inverse the same two lines rearranged. The parallels are straight and evenly + * spaced; the meridians are the ellipse or circle arc that {@code sqrt(1 - B phi^2)} traces. + * {@code A = 0} makes the bounding meridian a semi-ellipse ({@code kav7}, {@code wag6}), + * {@code A = 1} makes it a circle-plus-straight-segment ({@code eck3}), and {@code A = -0.5} + * gives {@code putp1} its characteristic pinch. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
{@code eck3.cpp:50-111}
{@code +proj=}{@code C_x}{@code C_y}{@code A}{@code B}
{@code eck3}0.422238200315771201490.844476400631542402981.00.4052847345693510857755
{@code kav7}0.86602540378441.00.00.30396355092701331433
{@code wag6}1.01.00.00.30396355092701331433
{@code putp1}1.894900.94745-0.50.30396355092701331433
+ * + *

{@code kav7}'s {@code C_x} is truncated upstream and must stay truncated. + * {@code eck3.cpp:75} is {@code 0.8660254037844}, thirteen digits, where + * {@code sqrt(3)/2 = 0.8660254037844386}. The file carries a comment noting the constant was + * "defined twice in original code" and that the other value + * ({@code 0.2632401569273184856851}) is retained as a safety measure; the truncated one is + * the live one. Substituting the exact {@code sqrt(3)/2} shifts every {@code kav7} easting by + * 4.5e-14 relative, which is 0.29 µm on {@code +a=6400000} — under the corpus's 0.1 mm + * bar, but it is a gratuitous divergence from the constant that generated the expected + * values. Non-negotiable 7. + * + *

{@code putp1} lives here, not with the other {@code putp*}. The commonly-cited + * file map puts it with {@code putp3}/{@code putp5}/{@code putp6}; it does not — it is + * {@code eck3.cpp}'s fourth {@code PROJ_HEAD}, and it inherits this forward/inverse pair + * rather than any Putnins-specific one. + * + *

{@code asqrt} is upstream's clamped square root ({@code 0} for a non-positive + * argument), which proj4j has as {@link ProjectionMath#sqrt(double)}. It matters only past + * {@code |phi| = 1/sqrt(B)}, i.e. beyond 90° for all four parameter sets, so it is + * unreachable through the host latitude check — but it is kept because it is what upstream + * writes. + */ +abstract class Eckert3FamilyProjection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = 3409839341771454682L; + + private final double cx; + private final double cy; + private final double aa; + private final double bb; + + protected Eckert3FamilyProjection(double cx, double cy, double aa, double bb) { + this.cx = cx; + this.cy = cy; + this.aa = aa; + this.bb = bb; + es = 0.0; + initialize(); + } + + /** {@code eck3_s_forward}, {@code eck3.cpp:20-27}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + dst.y = cy * phi; + dst.x = cx * lam * (aa + ProjectionMath.sqrt(1.0 - bb * phi * phi)); + return dst; + } + + /** + * {@code eck3_s_inverse}, {@code eck3.cpp:29-41}. + * + *

Upstream answers a zero denominator with {@code lp.lam = HUGE_VAL}, i.e. an + * infinite longitude, and reports no error. Proj4J throws: an infinite ordinate is + * exactly the "failure expressed as a coordinate" that non-negotiable 3 forbids, and + * {@link Projection}'s finiteness check would reject it a moment later anyway with a + * less specific message. The denominator can only vanish for {@code putp1}, where + * {@code A = -0.5} and so {@code sqrt(1 - B phi^2) = 0.5} at + * {@code |phi| = 1.5307} rad = 87.7° — inside the valid latitude range, so this is + * reachable, unlike the {@code asqrt} clamp. No corpus row probes it. + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double phi = y / cy; + final double denominator = cx * (aa + ProjectionMath.sqrt(1.0 - bb * phi * phi)); + if (denominator == 0.0) { + throw new ProjectionException(this, + "inverse is singular at y = " + y + " (phi = " + phi + + " rad): the easting scale vanishes there (eck3.cpp:36)"); + } + dst.y = phi; + dst.x = x / denominator; + return dst; + } + + public boolean hasInverse() { + return true; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that != null && getClass() == that.getClass()) { + Eckert3FamilyProjection p = (Eckert3FamilyProjection) that; + return cx == p.cx && cy == p.cy && aa == p.aa && bb == p.bb + && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(cx, cy, aa, bb, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert3Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert3Projection.java new file mode 100644 index 0000000..092dfd1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert3Projection.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Eckert III ({@code +proj=eck3}), the first {@code PROJ_HEAD} of + * {@code 9.8.1:src/projections/eck3.cpp}. + * + *

{@code A = 1}, so the bounding meridian is a semicircle joined to straight segments + * rather than a full semi-ellipse. Poles are lines, not points. + * + * @see Eckert3FamilyProjection + */ +public class Eckert3Projection extends Eckert3FamilyProjection { + + private static final long serialVersionUID = 863122467110075033L; + + public Eckert3Projection() { + super(0.42223820031577120149, 0.84447640063154240298, 1.0, + 0.4052847345693510857755); + } + + public String toString() { + return "Eckert III"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert4Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert4Projection.java index a1aed8a..aab0ba0 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Eckert4Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert4Projection.java @@ -19,50 +19,123 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Eckert IV ({@code +proj=eck4}), ported from {@code 9.8.1:src/projections/eck4.cpp}. + * + *

Three divergences from 9.8.1, all measured by {@code builtins.gie}

+ * + *
    + *
  1. The forward's exhausted-iteration branch was raised as an error. It is not an error + * upstream and the corpus proves it: at {@code +a=6400000}, {@code accept -180 90} expects + * {@code -8489602.7403 8489602.7403}, and those are exactly + * {@code C_x * pi * a} and {@code C_y * a} — the two values upstream's fall-back assigns. + * Eckert IV's Newton iteration genuinely does not converge at the pole (the derivative + * {@code 1 + c(c+2) - s^2} tends to 0 there), so upstream substitutes the closed-form limit + * and returns it as a success. Throwing lost four assertions; a "better" iteration would lose + * them too. Non-negotiable 7.
  2. + *
  3. The inverse had no pole branch. Upstream tests {@code 1 - |sin(theta)|} against + * {@code 1e-12} and, inside that band, takes {@code lam = x/C_x} and {@code phi = ±pi/2} + * directly rather than running {@code asin}/{@code cos} at their stationary point. Without it + * the inverse of the pole is off by 165.7 mm against a 0.1 mm bar.
  4. + *
  5. The inverse had no longitude-range check. Upstream rejects + * {@code |lam| - pi > 1e-10} outright and clamps to {@code ±pi} inside that + * tolerance, unless {@code +over} is given. Eight {@code expect failure errno + * coord_transfm_outside_projection_domain} rows measured this: they feed easting 0.01 m past + * the map edge and Proj4J answered with a longitude just past 180°.
  6. + *
+ * + *

{@code +over} is not a Proj4J parameter, so the {@code !P->over} branch is taken + * unconditionally; the bridge reports any {@code +over} definition as not implemented rather than + * executing it, so there is no path on which that assumption is wrong. + */ public class Eckert4Projection extends Projection { + private static final long serialVersionUID = 8363954354019329109L; + + /** {@code 2 / sqrt(4*pi + pi*pi)}. */ private final static double C_x = .42223820031577120149; + /** {@code 2 * sqrt(pi / (4 + pi))}. */ private final static double C_y = 1.32650042817700232218; + /** {@code 1 / C_y}. */ private final static double RC_y = .75386330736002178205; + /** {@code 2 + pi/2}. */ private final static double C_p = 3.57079632679489661922; + /** {@code 1 / C_p}. */ private final static double RC_p = .28004957675577868795; private final static double EPS = 1e-7; - private final int NITER = 6; + private final static int NITER = 6; + /** + * Forward projection, {@code eck4_s_forward}. + *

+ * Newton's method for the {@code theta} satisfying + * {@code theta + sin(theta)*cos(theta) + 2*sin(theta) == C_p * sin(phi)}, with upstream's + * closed-form fall-back when six trips are not enough. See the class javadoc for why the + * fall-back is a success and not a failure. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - double p, V, s, c; + double V, s, c; int i; - p = C_p * Math.sin(lpphi); + final double p = C_p * FastStrictTrig.sin(lpphi); V = lpphi * lpphi; - lpphi *= 0.895168 + V * ( 0.0218849 + V * 0.00826809 ); + double theta = lpphi * (0.895168 + V * ( 0.0218849 + V * 0.00826809 )); for (i = NITER; i > 0; --i) { - c = Math.cos(lpphi); - s = Math.sin(lpphi); - lpphi -= V = (lpphi + s * (c + 2.) - p) / + c = FastStrictTrig.cos(theta); + s = FastStrictTrig.sin(theta); + theta -= V = (theta + s * (c + 2.) - p) / (1. + c * (c + 2.) - s * s); if (Math.abs(V) < EPS) break; } if (i == 0) { out.x = C_x * lplam; - out.y = lpphi < 0. ? -C_y : C_y; + out.y = theta < 0. ? -C_y : C_y; } else { - out.x = C_x * lplam * (1. + Math.cos(lpphi)); - out.y = C_y * Math.sin(lpphi); + out.x = C_x * lplam * (1. + FastStrictTrig.cos(theta)); + out.y = C_y * FastStrictTrig.sin(theta); } return out; } + /** + * Inverse projection, {@code eck4_s_inverse}. + * + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN}: a longitude more than + * {@code 1e-10} rad past the antimeridian, or a northing whose implied + * {@code sin(theta)} is past {@code ONE_TOL} + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - double c; - - out.y = ProjectionMath.asin(xyy / C_y); - out.x = xyx / (C_x * (1. + (c = Math.cos(out.y)))); - out.y = ProjectionMath.asin((out.y + Math.sin(out.y) * (c + 2.)) / C_p); + final double sinTheta = xyy * RC_y; + final double oneMinusAbsSinTheta = 1.0 - Math.abs(sinTheta); + if (oneMinusAbsSinTheta >= 0.0 && oneMinusAbsSinTheta <= 1e-12) { + // The pole. asin and cos are both stationary here, so upstream substitutes the limit. + out.x = xyx / C_x; + out.y = sinTheta > 0 ? ProjectionMath.HALFPI : -ProjectionMath.HALFPI; + } else { + final double theta = ProjectionMath.asinChecked(sinTheta); + final double cosTheta = FastStrictTrig.cos(theta); + out.x = xyx / (C_x * (1. + cosTheta)); + out.y = ProjectionMath.asinChecked((theta + sinTheta * (cosTheta + 2.)) * RC_p); + } + // eck4.cpp's !P->over branch. +over is not a Proj4J parameter; see the class javadoc. + final double absLamMinusPi = Math.abs(out.x) - Math.PI; + if (absLamMinusPi > 0.0) { + if (absLamMinusPi > 1e-10) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "inverse of (" + xyx + ", " + xyy + ") is at longitude " + + Math.toDegrees(out.x) + " deg, " + absLamMinusPi + + " rad past the antimeridian; the point is outside the map"); + } + out.x = out.x > 0 ? Math.PI : -Math.PI; + } return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert5Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert5Projection.java index 3220491..113bba0 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Eckert5Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert5Projection.java @@ -23,6 +23,8 @@ public class Eckert5Projection extends Projection { + private static final long serialVersionUID = -3778555966785384865L; + private final static double XF = 0.44101277172455148219; private final static double RXF = 2.26750802723822639137; private final static double YF = 0.88202554344910296438; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Eckert6Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Eckert6Projection.java index 8bb0c79..0011d37 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Eckert6Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Eckert6Projection.java @@ -33,6 +33,8 @@ public class Eckert6Projection extends PseudoCylindricalProjection { + private static final long serialVersionUID = -7438871306667239132L; + private static final double n = 2.570796326794896619231321691; private static final double C_y = Math.sqrt((2) / n); private static final double C_x = C_y / 2; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/EqualAreaAzimuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/EqualAreaAzimuthalProjection.java index 8d4408a..88c8a96 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/EqualAreaAzimuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/EqualAreaAzimuthalProjection.java @@ -21,10 +21,31 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.AuthalicLat; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Lambert equal-area azimuthal. Not registered under any proj name — {@code +proj=laea} maps to + * {@link LambertAzimuthalEqualAreaProjection} — but it is public API and it implements the same + * algorithm, so it tracks {@code 9.8.1:src/projections/laea.cpp} for the same reasons. + * + *

{@code ProjectionMath.authset}/{@code authlat}/{@code qsfn} are replaced by + * {@link AuthalicLat}, the order-6 port of {@code 9.8.1:src/latitudes.cpp}. The third-order series + * they implement is up to 2.211 mm off at latitude 18.01 degrees on GRS80, 22 times the + * 0.1 mm bar this family's conformance rows set. + * + *

The forward direction also changes shape, following {@code laea.cpp:39-46} and + * {@code laea.cpp:283-285}: the authalic latitude {@code xi} comes from the direct + * {@code phi -> xi} series and {@code q} is recovered as {@code sin(xi) * qp}, instead of computing + * {@code q} first and then {@code sinb = q/qp}, {@code cosb = sqrt(1 - sinb^2)}. Upstream stopped + * using the {@code asin} form because it loses relative accuracy near the poles. {@code cea} and + * {@code aea} keep raw {@code q} in their forwards — see {@code cea.cpp:21}, {@code aea.cpp:70} — + * so this is a per-projection decision, not a blanket rule. + */ public class EqualAreaAzimuthalProjection extends AzimuthalProjection { + private static final long serialVersionUID = -8002324637336088184L; + private double sinb1; private double cosb1; private double xmf; @@ -33,19 +54,27 @@ public class EqualAreaAzimuthalProjection extends AzimuthalProjection { private double qp; private double dd; private double rq; - private double[] apa; + + /** + * The order-6 authalic-latitude machinery. Built once per CRS in {@link #initialize()}: + * its coefficient tables depend only on the ellipsoid, and precomputing them is the point. + * Immutable, {@link java.io.Serializable} and safe to share across the clones this class + * hands out. + */ + private AuthalicLat authalic; public EqualAreaAzimuthalProjection() { initialize(); } + /** + * Retained for source compatibility. The array that used to need deep-copying here is gone; + * {@link AuthalicLat} is immutable, so sharing the reference with the clone is correct. + */ public Object clone() { - EqualAreaAzimuthalProjection p = (EqualAreaAzimuthalProjection)super.clone(); - if (apa != null) - p.apa = (double[])apa.clone(); - return p; + return super.clone(); } - + public void initialize() { super.initialize(); if (spherical) { @@ -56,9 +85,9 @@ public void initialize() { } else { double sinphi; - qp = ProjectionMath.qsfn(1., e, one_es); + authalic = new AuthalicLat(es); + qp = authalic.qp(); mmf = .5 / (1. - es); - apa = ProjectionMath.authset(es); switch (mode) { case NORTH_POLE: case SOUTH_POLE: @@ -72,8 +101,11 @@ public void initialize() { case OBLIQUE: rq = Math.sqrt(.5 * qp); sinphi = Math.sin(projectionLatitude); - sinb1 = ProjectionMath.qsfn(sinphi, e, one_es) / qp; - cosb1 = Math.sqrt(1. - sinb1 * sinb1); + // laea.cpp:283-285: the authalic latitude of lat_0 through the direct series, + // then its sine and cosine, rather than sinb1 = q/qp and sqrt(1 - sinb1^2). + double b1 = authalic.forward(projectionLatitude, sinphi, Math.cos(projectionLatitude)); + sinb1 = Math.sin(b1); + cosb1 = Math.cos(b1); dd = Math.cos(projectionLatitude) / (Math.sqrt(1. - es * sinphi * sinphi) * rq * cosb1); ymf = (xmf = rq) / dd; @@ -121,10 +153,12 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { coslam = Math.cos(lam); sinlam = Math.sin(lam); sinphi = Math.sin(phi); - q = ProjectionMath.qsfn(sinphi, e, one_es); + // laea.cpp:39-46: xi from the direct phi -> xi series, q recovered as sin(xi)*qp. + double xi = authalic.forward(phi, sinphi, Math.cos(phi)); + q = Math.sin(xi) * qp; if (mode == OBLIQUE || mode == EQUATOR) { - sinb = q / qp; - cosb = Math.sqrt(1. - sinb * sinb); + sinb = Math.sin(xi); + cosb = Math.cos(xi); } switch (mode) { case OBLIQUE: @@ -155,7 +189,11 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { break; case NORTH_POLE: case SOUTH_POLE: - if (q >= 0.) { + // laea.cpp:75 uses 1e-15, not 0. Now that q comes from sin(xi)*qp rather than + // the exact-q formula, `qp - q` at the pole is rounding noise rather than an + // exact zero, and sqrt of a denormal would place the point sub-millimetres off + // the origin instead of on it. + if (q >= 1e-15) { xy.x = (b = Math.sqrt(q)) * sinlam; xy.y = coslam * (mode == SOUTH_POLE ? b : -b); } else @@ -234,7 +272,7 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { break; } lp.x = Math.atan2(x, y); - lp.y = ProjectionMath.authlat(Math.asin(ab), apa); + lp.y = authalic.inverse(Math.asin(ab)); } return lp; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/EqualEarthProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/EqualEarthProjection.java new file mode 100644 index 0000000..645a0ad --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/EqualEarthProjection.java @@ -0,0 +1,207 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.AuthalicLat; + +/** + * Equal Earth ({@code +proj=eqearth}), a port of + * {@code 9.8.1:src/projections/eqearth.cpp}. Spherical and ellipsoidal. + * + *

Savric, Patterson and Jenny (2018), + * doi:10.1080/13658816.2018.1504949. + * Designed to look like Robinson while being genuinely equal-area, which Robinson is not. + * It is the highest-payoff single projection outside the adams family. + * + *

Construction

+ * + *

The map is a polynomial in an intermediate angle {@code psi} derived from the + * authalic latitude, which is what makes it equal-area: + * + *

+ *   sbeta = sin(phi)                                     (sphere)
+ *   sbeta = q(sin phi) / qp,  clamped into [-1, 1]        (ellipsoid)
+ *   psi   = asin(M * sbeta)               where M = sqrt(3)/2
+ *   x     = rqda * lam * cos(psi) / (M * (A1 + 3 A2 psi^2 + psi^6 (7 A3 + 9 A4 psi^2)))
+ *   y     = rqda * psi * (A1 + A2 psi^2 + psi^6 (A3 + A4 psi^2))
+ * 
+ * + *

with {@code rqda = 1} on a sphere and {@code sqrt(qp/2)} on an ellipsoid — the authalic + * radius divided by the semi-major axis, which is how the equal-area property survives the + * flattening. + * + *

The easting denominator is {@code dy/dpsi}, so the easting is + * {@code lam cos(psi) / (M y'(psi))} — that quotient is exactly what forces area to be + * preserved, and it is also reused verbatim as the inverse's Newton derivative. + * + *

The clamp is only in the ellipsoidal branch, and it is not cosmetic

+ * + *

{@code eqearth.cpp:56-58} clamps {@code |sbeta| > 1} to {@code +/-1} with the comment + * "Rounding error." — and only after the {@code q/qp} division. At exactly + * {@code phi = +/-90} the quotient can land a few ulps above 1, and {@code asin} of that is + * {@code NaN}, which on a fail-closed contract becomes a thrown exception rather than a + * pole. The corpus feeds {@code +/-90} directly ({@code more_builtins.gie:582-589}), so + * without the clamp three rows per operation fail. On a sphere {@code sin(phi)} cannot + * exceed 1, so no clamp is needed and upstream does not apply one — reproduced. + * + *

Fail-closed: upstream returns {@code (0, 0)} on non-convergence

+ * + *

{@code eqearth.cpp:113-117} sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} and then + * {@code return lp;} where {@code lp} is still its zero initialiser — so an unconverged + * inverse answers null island, the single most plausible-looking wrong coordinate + * available. Proj4J throws. Unreachable from the corpus (12 Newton steps on a monotone + * polynomial converge in three or four everywhere inside {@code MAX_Y}), so this costs + * nothing and removes a trap. + * + *

Authalic latitude comes from the numerical core

+ * + *

{@link AuthalicLat} is the 9.8.1 framework — Karney's coefficient form with the + * {@code |n| < 0.01} series-validity gate — not the older closed-form + * {@code ProjectionMath.authset}/{@code authlat} pair, which is deprecated. It is + * constructed once in {@link #initialize()} and held, because + * {@code pj_authalic_lat_compute_coeffs} is upstream's setup-time work too and doing it per + * point would be both slow and a departure. + */ +public class EqualEarthProjection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = 7341488845468976373L; + + private static final double A1 = 1.340264; + private static final double A2 = -0.081106; + private static final double A3 = 0.000893; + private static final double A4 = 0.003796; + + /** {@code M = sqrt(3)/2} ({@code eqearth.cpp:28}). */ + private static final double M = Math.sqrt(3.0) / 2.0; + + /** {@code eqearth.cpp:30} — "90 degree latitude on a sphere with radius 1". */ + private static final double MAX_Y = 1.3173627591574; + + private static final double EPS = 1e-11; + + /** {@code eqearth.cpp:32}. Twelve, not the 100 the Flex Projector family uses. */ + private static final int MAX_ITER = 12; + + /** Authalic radius divided by the semi-major axis; exactly 1 on a sphere. */ + private double rqda = 1.0; + + /** Null on a sphere, where no authalic conversion is performed at all. */ + private AuthalicLat authalic; + + @Override + public void initialize() { + super.initialize(); + if (es != 0.0) { + authalic = new AuthalicLat(es); + rqda = Math.sqrt(0.5 * authalic.qp()); + } else { + authalic = null; + rqda = 1.0; + } + } + + /** {@code eqearth_e_forward}, {@code eqearth.cpp:42-75}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + double sbeta = StrictMath.sin(phi); + if (authalic != null) { + sbeta = authalic.q(sbeta) / authalic.qp(); + // eqearth.cpp:56-58 "Rounding error." + if (Math.abs(sbeta) > 1.0) { + sbeta = sbeta > 0 ? 1.0 : -1.0; + } + } + final double psi = StrictMath.asin(M * sbeta); + final double psi2 = psi * psi; + final double psi6 = psi2 * psi2 * psi2; + + dst.x = lam * StrictMath.cos(psi) + / (M * (A1 + 3.0 * A2 * psi2 + psi6 * (7.0 * A3 + 9.0 * A4 * psi2))); + dst.y = psi * (A1 + A2 * psi2 + psi6 * (A3 + A4 * psi2)); + + dst.x *= rqda; + dst.y *= rqda; + return dst; + } + + /** + * {@code eqearth_e_inverse}, {@code eqearth.cpp:77-134}. + * + *

Note {@code cos(yc)} in the longitude, not {@code cos(psi)} — {@code yc} is + * the solved {@code psi}, so the two are the same thing under a different name. Reading + * it as the northing would be a units error. + * + * @throws ConvergenceFailureException where upstream returns {@code (0, 0)} + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + x /= rqda; + y /= rqda; + + if (y > MAX_Y) { + y = MAX_Y; + } else if (y < -MAX_Y) { + y = -MAX_Y; + } + + double yc = y; + int i = MAX_ITER; + double correction = Double.NaN; + for (; i > 0; --i) { + final double y2 = yc * yc; + final double y6 = y2 * y2 * y2; + final double f = yc * (A1 + A2 * y2 + y6 * (A3 + A4 * y2)) - y; + final double fder = A1 + 3.0 * A2 * y2 + y6 * (7.0 * A3 + 9.0 * A4 * y2); + correction = f / fder; + yc -= correction; + if (Math.abs(correction) < EPS) { + break; + } + } + if (i == 0) { + throw new ConvergenceFailureException(this, + "inverse psi iteration did not converge to " + EPS + " within " + + MAX_ITER + " iterations for y = " + y + " (last correction " + + correction + ")"); + } + + final double y2 = yc * yc; + final double y6 = y2 * y2 * y2; + dst.x = M * x * (A1 + 3.0 * A2 * y2 + y6 * (7.0 * A3 + 9.0 * A4 * y2)) + / StrictMath.cos(yc); + + double phi = StrictMath.asin(StrictMath.sin(yc) / M); + if (authalic != null) { + phi = authalic.inverse(phi); + } + dst.y = phi; + return dst; + } + + public boolean hasInverse() { + return true; + } + + public boolean isEqualArea() { + return true; + } + + public String toString() { + return "Equal Earth"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/EquidistantAzimuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/EquidistantAzimuthalProjection.java index f0e40fb..25c4523 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/EquidistantAzimuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/EquidistantAzimuthalProjection.java @@ -23,15 +23,56 @@ import org.locationtech.proj4j.geodesic.GeodesicData; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Azimuthal equidistant, {@code 9.8.1:src/projections/aeqd.cpp}. + * + *

Only the two polar aspects are meridian-arc arithmetic — the equatorial and oblique ellipsoidal + * aspects go through the geodesic solver — so {@link MeridianArc} replaces + * {@code ProjectionMath.enfn}/{@code mlfn}/{@code inv_mlfn} at exactly three sites: + * {@code Mp} at initialisation ({@code aeqd.cpp:98} and the {@code S_POLE} twin), the polar forward + * ({@code aeqd.cpp:99}) and the polar inverse ({@code aeqd.cpp:322}). + * + *

The polar rows the corpus sets, {@code builtins.gie:216-253}, are at {@code tolerance 0.1 m} + * and Snyder's table 31 is quoted only to 0.1 m, so they cannot resolve this change; the improvement + * is a forward meridian arc that goes from 4.9 um out at latitude 72.5 degrees to under 1 nm against + * an independent quadrature, and an inverse that is closed form instead of a ten-step Newton loop + * with a data-dependent — hence platform-dependent — trip count. + */ public class EquidistantAzimuthalProjection extends AzimuthalProjection { - - private final static double TOL = 1.e-8; + + private static final long serialVersionUID = 675511536424237220L; + + /** + * {@code aeqd.cpp:57}, {@code #define TOL 1.e-14}. + *

+ * Was {@code 1.e-8}, six orders of magnitude too loose, which put a dead zone of + * radius {@code acos(1 - 1e-8) = 1.41e-4} rad — about 900 m on the Earth + * — around the centre of every spherical oblique or equatorial {@code aeqd}, inside + * which the forward returned exactly {@code (0, 0)}. It also widened the antipodal + * rejection by the same factor. {@code builtins.gie:163} samples a point 0.147 m from the + * centre and expects {@code (-0.096, 0.111)}. + */ + private final static double TOL = 1.e-14; private int mode; - private double[] en; + + /** + * The 6th-order meridian-arc series, built once per CRS in {@link #initialize()} and used only + * by the two polar aspects. Immutable and {@link java.io.Serializable}. + */ + private MeridianArc meridian; + + /** + * {@code Q->M1}, the meridian arc to {@code +lat_0}. Used by the {@code +guam} kernels and by + * nothing else, which is why it sat here unwritten until {@code +guam} was dispatched. + */ private double M1; + + /** {@code +guam}. Only consulted when the figure is an ellipsoid; see {@link #setGuam}. */ + private boolean guam; private double N1; private double Mp; private double He; @@ -39,8 +80,16 @@ public class EquidistantAzimuthalProjection extends AzimuthalProjection { private double sinphi0, cosphi0; private Geodesic geodesic; + /** + * A bare {@code +proj=aeqd}, i.e. the equatorial aspect. + *

+ * Was 90°. {@code Proj4Parser} assigns {@code +lat_0} only when the keyword is + * present, so this constructor is the effective default for every definition that omits it, + * and PROJ's default is 0. See {@link GnomonicAzimuthalProjection#GnomonicAzimuthalProjection()} + * for the same defect in the same family. + */ public EquidistantAzimuthalProjection() { - this(Math.toRadians(90.0), Math.toRadians(0.0)); + this(0.0, 0.0); } public EquidistantAzimuthalProjection(double projectionLatitude, double projectionLongitude) { @@ -48,13 +97,44 @@ public EquidistantAzimuthalProjection(double projectionLatitude, double projecti initialize(); } + /** + * Retained for source compatibility. The coefficient array that used to need deep-copying here + * is gone; {@link MeridianArc} is immutable, so sharing the reference with the clone is correct. + */ public Object clone() { - EquidistantAzimuthalProjection p = (EquidistantAzimuthalProjection)super.clone(); - if (en != null) - p.en = (double[])en.clone(); - return p; + return super.clone(); } - + + + /** + * {@code +guam}: the Guam variant of the ellipsoidal forward and inverse + * ({@code aeqd.cpp:69-88} and {@code :189-204}). + * + *

Upstream reads it with {@code pj_param}'s {@code b} sigil, so {@code +guam=f} is + * explicitly off, and — crucially — it reads it inside the {@code es != 0} arm of + * {@code PJ_PROJECTION(aeqd)}. On a declared sphere the key is therefore consumed and + * ignored, not an error and not a different projection. {@link #initialize()} and + * {@link #project} reproduce that placement by testing {@code !spherical && guam}. + * + *

The variant is aspect-independent: it replaces the whole forward and inverse rather + * than one of the four {@code mode} branches, which is why {@link #initialize()} computes + * {@link #M1} instead of {@code Mp}/{@code N1}/{@code G}/{@code He}. + * + * @param guam whether to use the Guam formulation + * @since 1.5.0 + */ + public void setGuam(boolean guam) { + this.guam = guam; + } + + /** + * @return whether {@code +guam} is in force + * @since 1.5.0 + */ + public boolean isGuam() { + return guam; + } + public void initialize() { super.initialize(); if (Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) < EPS10) { @@ -71,13 +151,20 @@ public void initialize() { cosphi0 = Math.cos(projectionLatitude); } if (!spherical) { - en = ProjectionMath.enfn(es); + meridian = MeridianArc.fromEs(es); + if (guam) { + // aeqd.cpp:301-304. The Guam arm needs only M1, and replaces both kernels, so + // none of Mp / N1 / G / He is computed and no Geodesic is built. Derived purely + // from projectionLatitude, hence idempotent across the two initialize() calls. + M1 = meridian.mlfn(projectionLatitude, sinphi0, cosphi0); + return; + } switch (mode) { case NORTH_POLE: - Mp = ProjectionMath.mlfn(ProjectionMath.HALFPI, 1., 0., en); + Mp = meridian.mlfn(ProjectionMath.HALFPI, 1., 0.); break; case SOUTH_POLE: - Mp = ProjectionMath.mlfn(-ProjectionMath.HALFPI, -1., 0., en); + Mp = meridian.mlfn(-ProjectionMath.HALFPI, -1., 0.); break; case EQUATOR: case OBLIQUE: @@ -88,6 +175,13 @@ public void initialize() { this.ellipsoid.getB()) / this.ellipsoid.getA()); break; } + } else { + // aeqd.cpp:276, geod_init(&Q->g, 1, P->f), is called UNCONDITIONALLY, before the + // aspect dispatch and before the `P->es == 0` fork -- so a declared sphere has a + // geodesic too, and aeqd_s_forward's degenerate branch relies on it: see + // projectGeodesic. Flattening zero, radius `a` rather than the ellipsoid's, because + // `+R=` replaces the figure and P->a is what upstream reads. + geodesic = new Geodesic(a, 0.0); } } @@ -107,9 +201,17 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { xy.y = sinphi0 * sinphi + cosphi0 * cosphi * coslam; if (Math.abs(Math.abs(xy.y) - 1.) < TOL) if (xy.y < 0.) - throw new ProjectionException(); + throw new ProjectionException( + "aeqd: the point is antipodal to the centre of projection " + + "(cos(distance) = " + xy.y + "), where the azimuth " + + "is undefined (aeqd.cpp:152)"); else - xy.x = xy.y = 0.; + // aeqd.cpp:155 and :182 -- NOT `xy.x = xy.y = 0.`. Within TOL of the + // centre the spherical formula loses the azimuth to cancellation, so + // upstream hands the point to the GEODESIC forward, which on a sphere + // is an exact great-circle solution and keeps both ordinates. Returning + // the origin instead was a 0.147 m error at the corpus's sample point. + return projectGeodesic(lam, phi, xy); else { xy.y = Math.acos(xy.y); xy.y /= Math.sin(xy.y); @@ -128,6 +230,16 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { xy.y *= coslam; break; } + } else if (guam) { + // e_guam_fwd, aeqd.cpp:69-88. EPSG method 9831, "Guam Projection": a + // second-order approximation that is aspect-independent, so it does not consult + // `mode` at all. + final double cosphi = Math.cos(phi); + final double sinphi = Math.sin(phi); + final double t = 1. / Math.sqrt(1. - es * sinphi * sinphi); + xy.x = lam * cosphi * t; + xy.y = meridian.mlfn(phi, sinphi, cosphi) - M1 + + .5 * lam * lam * cosphi * sinphi * t; } else { double coslam, cosphi, sinphi, rho; @@ -138,31 +250,48 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { case NORTH_POLE: coslam = - coslam; case SOUTH_POLE: - xy.x = (rho = Math.abs(Mp - ProjectionMath.mlfn(phi, sinphi, cosphi, en))) * + xy.x = (rho = Math.abs(Mp - meridian.mlfn(phi, sinphi, cosphi))) * Math.sin(lam); xy.y = rho * coslam; break; case EQUATOR: case OBLIQUE: - if (Math.abs(lam) < EPS10 && Math.abs(phi - projectionLatitude) < EPS10) { - xy.x = xy.y = 0.; - break; - } - - GeodesicData g = geodesic.Inverse( - Math.toDegrees(projectionLatitude), - Math.toDegrees(projectionLongitude), - Math.toDegrees(phi), - Math.toDegrees(lam + projectionLongitude)); - double azi1 = Math.toRadians(g.azi1); - xy.x = g.s12 * Math.sin(azi1) / geodesic.EquatorialRadius(); - xy.y = g.s12 * Math.cos(azi1) / geodesic.EquatorialRadius(); - break; + return projectGeodesic(lam, phi, xy); } } return xy; } + /** + * The {@code EQUIT}/{@code OBLIQ} arm of {@code aeqd_e_forward} ({@code aeqd.cpp:84-122}): + * one geodesic inverse solution from the centre of projection, giving a distance and an + * initial azimuth which are then read as polar coordinates. + *

+ * Extracted because {@code aeqd_s_forward} calls it too. On a sphere ({@code f == 0}) the + * geodesic solver returns the exact great-circle solution, which is what makes it a valid + * substitute for the closed form near the centre rather than a change of projection. + * + * @param lam longitude relative to {@code +lon_0}, in radians + * @param phi latitude, in radians + * @param xy the destination + * @return {@code xy} + */ + private ProjCoordinate projectGeodesic(double lam, double phi, ProjCoordinate xy) { + if (Math.abs(lam) < EPS10 && Math.abs(phi - projectionLatitude) < EPS10) { + xy.x = xy.y = 0.; + return xy; + } + GeodesicData g = geodesic.Inverse( + ProjectionMath.toDeg(projectionLatitude), + ProjectionMath.toDeg(projectionLongitude), + ProjectionMath.toDeg(phi), + ProjectionMath.toDeg(lam + projectionLongitude)); + double azi1 = ProjectionMath.toRad(g.azi1); + xy.x = g.s12 * Math.sin(azi1) / geodesic.EquatorialRadius(); + xy.y = g.s12 * Math.cos(azi1) / geodesic.EquatorialRadius(); + return xy; + } + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { if (spherical) { double cosc, c_rh, sinc; @@ -197,6 +326,24 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { lp.y = c_rh - ProjectionMath.HALFPI; lp.x = Math.atan2(x, y); } + } else if (guam) { + // e_guam_inv, aeqd.cpp:189-204. Three fixed-point iterations, no convergence test + // and no early return for the origin - upstream has neither, and at (0, 0) the + // iteration lands on phi0 exactly anyway. + // + // `t` is deliberately carried OUT of the loop: the longitude uses the value from + // the LAST iteration, i.e. evaluated at the previous latitude, not at the final + // one. That is upstream's, and reproducing it matters - recomputing t from the + // converged latitude changes the longitude in the 9th decimal. + final double x2 = 0.5 * x * x; + double t = 0.0; + lp.y = projectionLatitude; + for (int i = 0; i < 3; ++i) { + t = e * Math.sin(lp.y); + t = Math.sqrt(1. - t * t); + lp.y = meridian.invMlfn(M1 + y - x2 * Math.tan(lp.y) * t); + } + lp.x = x * t / Math.cos(lp.y); } else { double c; @@ -211,15 +358,15 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { double azi1 = Math.atan2(x2, y2); double s12 = Math.sqrt(x2 * x2 + y2 * y2); GeodesicData g = geodesic.Direct( - Math.toDegrees(projectionLatitude), - Math.toDegrees(projectionLongitude), - Math.toDegrees(azi1), + ProjectionMath.toDeg(projectionLatitude), + ProjectionMath.toDeg(projectionLongitude), + ProjectionMath.toDeg(azi1), s12); - lp.y = Math.toRadians(g.lat2); - lp.x = Math.toRadians(g.lon2); + lp.y = ProjectionMath.toRad(g.lat2); + lp.x = ProjectionMath.toRad(g.lon2); lp.x -= projectionLongitude; } else { - lp.y = ProjectionMath.inv_mlfn(mode == NORTH_POLE ? Mp - c : Mp + c, es, en); + lp.y = meridian.invMlfn(mode == NORTH_POLE ? Mp - c : Mp + c); lp.x = Math.atan2(x, mode == NORTH_POLE ? -y : y); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/EquidistantConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/EquidistantConicProjection.java index ab7f582..d060bd2 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/EquidistantConicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/EquidistantConicProjection.java @@ -19,112 +19,236 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; /** - * The Equidistant Conic projection. + * The Equidistant Conic projection, {@code +proj=eqdc}. + * + *

Why this class was rewritten

+ * + *

Until 1.5.0 {@code +proj=eqdc} was a pure identity in both directions, while + * {@link #hasInverse()} reported {@code true}. The cause was a signature mismatch, not a formula + * error: the class overrode the public, degrees-in/degrees-out + * {@code project(ProjCoordinate, ProjCoordinate)} and + * {@code inverseProject(ProjCoordinate, ProjCoordinate)} rather than the protected radian + * hooks {@link Projection#project(double, double, ProjCoordinate)} and + * {@link Projection#projectInverse(double, double, ProjCoordinate)} that + * {@code BasicCoordinateTransform} actually calls. The overrides were therefore dead code, and + * every {@code eqdc} coordinate fell through to {@code Projection}'s base implementations, which + * are {@code dst.x = x; dst.y = y}. + * + *

The dead code was also wrong twice over, which is why it is replaced rather than merely + * re-signed: + *

    + *
  • it read {@code in.y} as radians while the public {@code project} contract is degrees, and + * it subtracted {@code projectionLongitude} a second time on top of the subtraction the base + * class had already performed;
  • + *
  • its formula was Lambert Conformal Conic's — {@code tan(pi/4 - phi/2)} raised to + * {@code n} — not Equidistant Conic's meridian arc; its eccentricity was hard-coded to + * {@code 0.822719} (a misplaced decimal point: Clarke 1866's {@code e} is + * {@code 0.0822719}); its radius was hard-coded to 1; and {@code +lat_1}/{@code +lat_2} were + * ignored, because the derivation ran only from the constructor and never from + * {@link #initialize()}, which is what {@code Proj4Parser} calls after assigning + * parameters.
  • + *
+ * + *

This is now a port of PROJ 9.8.1 {@code src/projections/eqdc.cpp}, meridian arc included. + * The non-convergence fail-open it used to carry — a Newton loop whose accumulator {@code phi} + * was initialised to {@code 0}, so a zero-iteration exit returned latitude 0: on the + * equator, plausible, and undetectable — is gone by construction. Upstream's inverse uses + * {@code pj_inv_mlfn}, and {@link MeridianArc#invMlfn} is a closed-form Clenshaw + * evaluation with no iteration that can fail. + * + * @see 9.8.1 + * eqdc.cpp */ public class EquidistantConicProjection extends ConicProjection { - private double standardLatitude1; - private double standardLatitude2; - - private double eccentricity = 0.822719; - private double eccentricity2 = eccentricity*eccentricity; - private double eccentricity4 = eccentricity2*eccentricity2; - private double eccentricity6 = eccentricity2*eccentricity4; - private double radius = 1; - - private boolean northPole; - private double f, n, rho0; - - public EquidistantConicProjection() { - minLatitude = ProjectionMath.degToRad(10); - maxLatitude = ProjectionMath.degToRad(70); - minLongitude = ProjectionMath.degToRad(-90); - maxLongitude = ProjectionMath.degToRad(90); - standardLatitude1 = Math.toDegrees( 60 ); - standardLatitude2 = Math.toDegrees( 20 ); - - initialize(ProjectionMath.degToRad(0), ProjectionMath.degToRad(37.5), standardLatitude1, standardLatitude2); - } - - public ProjCoordinate project(ProjCoordinate in, ProjCoordinate out) { - double lon = ProjectionMath.normalizeLongitude(in.x-projectionLongitude); - double lat = in.y; - double rho,theta,hold1,hold2,hold3; - - hold2 = Math.pow(((1.0 - eccentricity * Math.sin(lat)) / (1.0 + eccentricity * Math.sin(lat))), 0.5 * eccentricity); - hold3 = Math.tan(ProjectionMath.QUARTERPI - 0.5 * lat); - hold1 = (hold3 == 0.0) ? 0.0 : Math.pow(hold3 / hold2, n); - rho = radius * f * hold1; - theta = n * lon; - - out.x = rho * Math.sin(theta); - out.y = rho0 - rho * Math.cos(theta); - return out; - } - - public ProjCoordinate inverseProject(ProjCoordinate in, ProjCoordinate out) { - double theta, temp, rho, t, tphi, phi = 0, delta; - - theta = Math.atan(in.x / (rho0 - in.y)); - out.x = (theta / n) + projectionLongitude; - - temp = in.x * in.x + (rho0 - in.y) * (rho0 - in.y); - rho = Math.sqrt(temp); - if (n < 0) - rho = - rho; - t = Math.pow((rho / (radius * f)), 1./n); - tphi = ProjectionMath.HALFPI - 2.0 * Math.atan(t); - delta = 1.0; - for (int i = 0; i < 100 && delta > 1.0e-8; i++) { - temp = (1.0 - eccentricity * Math.sin(tphi)) / (1.0 + eccentricity * Math.sin(tphi)); - phi = ProjectionMath.HALFPI - 2.0 * Math.atan(t * Math.pow(temp, 0.5 * eccentricity)); - delta = Math.abs(Math.abs(tphi) - Math.abs(phi)); - tphi = phi; - } - out.y = phi; - return out; - } - - private void initialize(double rlong0, double rlat0, double standardLatitude1, double standardLatitude2) { - super.initialize(); - double t_standardLatitude1, m_standardLatitude1, t_standardLatitude2, m_standardLatitude2, t_rlat0; - - northPole = rlat0 > 0.0; - projectionLatitude = northPole ? ProjectionMath.HALFPI : -ProjectionMath.HALFPI; - - t_standardLatitude1 = Math.tan(ProjectionMath.QUARTERPI - 0.5 * standardLatitude1) / Math.pow((1.0 - eccentricity * - Math.sin(standardLatitude1)) /(1.0 + eccentricity * Math.sin(standardLatitude1)), 0.5 * eccentricity); - m_standardLatitude1 = Math.cos(standardLatitude1) / Math.sqrt(1.0 - eccentricity2 - * Math.pow(Math.sin(standardLatitude1), 2.0)); - t_standardLatitude2 = Math.tan(ProjectionMath.QUARTERPI - 0.5 * standardLatitude2) / Math.pow((1.0 - eccentricity * - Math.sin(standardLatitude2)) /(1.0 + eccentricity * Math.sin(standardLatitude2)), 0.5 * eccentricity); - m_standardLatitude2 = Math.cos(standardLatitude2) / Math.sqrt(1.0 - eccentricity2 - * Math.pow(Math.sin(standardLatitude2), 2.0)); - t_rlat0 = Math.tan(ProjectionMath.QUARTERPI - 0.5 * rlat0) / - Math.pow((1.0 - eccentricity * Math.sin(rlat0)) / - (1.0 + eccentricity * Math.sin(rlat0)), 0.5 * eccentricity); - - if (standardLatitude1 != standardLatitude2) - n = (Math.log(m_standardLatitude1) - Math.log(m_standardLatitude2))/(Math.log(t_standardLatitude1) - Math.log(t_standardLatitude2)); - else - n = Math.sin(standardLatitude1); - - f = m_standardLatitude1/(n * Math.pow(t_standardLatitude1, n)); - projectionLongitude = rlong0; - rho0 = radius * f * Math.pow(t_rlat0,n); - } - - public boolean hasInverse() { - return true; - } - - public String toString() { - return "Equidistant Conic"; - } + private static final long serialVersionUID = 2859752487579111302L; -} + /** Upstream's {@code EPS10}. */ + private static final double EPS10 = 1.e-10; + + /** The cone constant, upstream's {@code Q->n}. */ + private double n; + /** Upstream's {@code Q->c}. */ + private double c; + /** Upstream's {@code Q->rho0}. */ + private double rho0; + /** Upstream's {@code Q->ellips}. */ + private boolean ellips; + /** Upstream's {@code Q->en}, i.e. what {@code pj_enfn} builds. */ + private MeridianArc meridian; + + /** + * Legacy defaults, preserved from the 1.4.3 constructor so that a bare {@code +proj=eqdc} + * still yields a usable cone rather than failing the {@code |lat_1 + lat_2| > 0} check + * upstream applies. {@code Proj4Parser} assigns {@code +lat_0}/{@code +lat_1}/{@code +lat_2} + * only when the keyword is present, so an explicit value always wins. + * + *

The 1.4.3 constructor set the standard parallels with {@code Math.toDegrees(60)} and + * {@code Math.toDegrees(20)} — 3437.75 and 1145.92 — and fed them to {@code sin} and + * {@code tan} as though they were radians. That was inert only because the whole derivation + * was dead code. + */ + public EquidistantConicProjection() { + minLatitude = ProjectionMath.degToRad(10); + maxLatitude = ProjectionMath.degToRad(70); + minLongitude = ProjectionMath.degToRad(-90); + maxLongitude = ProjectionMath.degToRad(90); + + // NOT a legacy default: PROJ's phi0 is 0 when +lat_0 is absent, and rho0 is + // c - mlfn(phi0), so a 37.5 default displaced every northing by M(37.5 deg) = + // 4,151,999 m. All 16 builtins.gie eqdc assertions missed by exactly that. + projectionLatitude = 0.0; + projectionLatitude1 = ProjectionMath.degToRad(60); + projectionLatitude2 = ProjectionMath.degToRad(20); + initialize(); + } + + /** + * Derives the cone from {@code +lat_1}, {@code +lat_2}, {@code +lat_0} and the ellipsoid. + * Port of {@code PJ_PROJECTION(eqdc)}, including all four of its parameter rejections — + * which is the fail-closed half of this class: an {@code eqdc} definition that cannot + * describe a cone never becomes a usable {@code Projection}, so it can never emit a + * coordinate at all. + * + * @throws InvalidValueException if {@code |lat_1|} or {@code |lat_2|} exceeds 90 degrees, if + * {@code |lat_1 + lat_2|} is zero (the cone degenerates), or + * if the eccentricity is so close to 1 that the cone constant + * cannot be formed + */ + @Override + public void initialize() { + super.initialize(); + final double phi1 = projectionLatitude1; + final double phi2 = projectionLatitude2; + + if (Math.abs(phi1) > ProjectionMath.HALFPI) { + throw new InvalidValueException( + "Invalid value for +lat_1: |lat_1| should be <= 90 degrees, but is " + + Math.toDegrees(phi1)); + } + if (Math.abs(phi2) > ProjectionMath.HALFPI) { + throw new InvalidValueException( + "Invalid value for +lat_2: |lat_2| should be <= 90 degrees, but is " + + Math.toDegrees(phi2)); + } + if (Math.abs(phi1 + phi2) < EPS10) { + throw new InvalidValueException( + "Invalid values for +lat_1 and +lat_2: |lat_1 + lat_2| should be > 0, but " + + Math.toDegrees(phi1) + " + " + Math.toDegrees(phi2) + + " degrees degenerates the cone"); + } + + double sinphi = Math.sin(phi1); + double cosphi = Math.cos(phi1); + n = sinphi; + final boolean secant = Math.abs(phi1 - phi2) >= EPS10; + ellips = es > 0.; + + if (ellips) { + meridian = MeridianArc.fromEs(es); + final double m1 = ProjectionMath.msfn(sinphi, cosphi, es); + final double ml1 = meridian.mlfn(phi1, sinphi, cosphi); + if (secant) { + sinphi = Math.sin(phi2); + cosphi = Math.cos(phi2); + final double ml2 = meridian.mlfn(phi2, sinphi, cosphi); + if (ml1 == ml2) { + throw new InvalidValueException( + "Eccentricity is too close to 1: the meridian arc is identical at " + + "+lat_1 and +lat_2, so the cone constant is undefined"); + } + n = (m1 - ProjectionMath.msfn(sinphi, cosphi, es)) / (ml2 - ml1); + if (n == 0) { + throw new InvalidValueException( + "Invalid value for eccentricity: the cone constant evaluates to 0"); + } + } + c = ml1 + m1 / n; + rho0 = c - meridian.mlfn(projectionLatitude); + } else { + meridian = null; + if (secant) { + n = (cosphi - Math.cos(phi2)) / (phi2 - phi1); + } + if (n == 0) { + throw new InvalidValueException( + "Invalid values for +lat_1 and +lat_2: the cone constant evaluates to 0"); + } + c = phi1 + Math.cos(phi1) / n; + rho0 = c - projectionLatitude; + } + } + + /** + * Forward projection. Port of {@code eqdc_e_forward}. + *

+ * {@code lam} arrives with {@code +lon_0} already subtracted and normalised by + * {@link Projection#project(ProjCoordinate, ProjCoordinate)}, which is exactly why this hook + * must not subtract it again — the replaced code did, and that was one of its two errors. + * + * @param lam the longitude relative to the central meridian, radians + * @param phi the geographic latitude, radians + * @param out the destination + * @return {@code out} + */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate out) { + final double rho = c - (ellips ? meridian.mlfn(phi, Math.sin(phi), Math.cos(phi)) : phi); + final double lamMulN = lam * n; + out.x = rho * Math.sin(lamMulN); + out.y = rho0 - rho * Math.cos(lamMulN); + return out; + } + + /** + * Inverse projection. Port of {@code eqdc_e_inverse}. + *

+ * Upstream mutates {@code xy.y} inside the {@code hypot} call and reads it back; this uses a + * local instead, so it cannot fall into the read-the-destination-rather-than-the-mutated- + * parameter trap the 2006 conversion left in six other projections. {@code out} is never + * read, only written. + * + * @param x the easting relative to the false easting, in projection units + * @param y the northing relative to the false northing, in projection units + * @param out the destination; its longitude is relative to the central meridian, radians + * @return {@code out} + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { + double dy = rho0 - y; + double rho = ProjectionMath.hypot(x, dy); + if (rho != 0.0) { + if (n < 0.) { + rho = -rho; + x = -x; + dy = -dy; + } + double phi = c - rho; + if (ellips) { + phi = meridian.invMlfn(phi); + } + out.y = phi; + out.x = Math.atan2(x, dy) / n; + } else { + out.x = 0.; + out.y = n > 0. ? ProjectionMath.HALFPI : -ProjectionMath.HALFPI; + } + return out; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "Equidistant Conic"; + } + +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/EulerProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/EulerProjection.java index 7bb9426..1c3ae9e 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/EulerProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/EulerProjection.java @@ -21,6 +21,8 @@ public class EulerProjection extends SimpleConicProjection { + private static final long serialVersionUID = -6311125753242261996L; + public EulerProjection() { super( SimpleConicProjection.EULER ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ExtendedTransverseMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ExtendedTransverseMercatorProjection.java index 3f92ee7..add8f46 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/ExtendedTransverseMercatorProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/ExtendedTransverseMercatorProjection.java @@ -1,16 +1,89 @@ +/******************************************************************************* + * Copyright 2006, 2017 Jerry Huxtable, Martin Davis + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.util.AuxLat; +import org.locationtech.proj4j.util.Clenshaw6; +import org.locationtech.proj4j.util.MathHelpers; +import org.locationtech.proj4j.util.ProjectionMath; /** + * The Poder/Engsager "exact" transverse Mercator, {@code +proj=etmerc} — + * {@code 9.8.1:src/projections/tmerc.cpp}'s {@code exact_e_fwd} / {@code exact_e_inv}. + * + *

This is also what PROJ 9.8.1 uses for plain {@code +proj=tmerc} and for {@code +proj=utm} + * by default; see {@link TransverseMercatorProjection}, which owns that dispatch. The + * Evenden/Snyder series lives there too. + * + *

Accuracy

+ * + *

Uniformly about 1 nm anywhere inside {@code |Ce| <= 2.623395162778} (150° from the + * central meridian), where the Evenden/Snyder series is 0.9 mm off at 6° and unbounded + * beyond 20°. That is why {@code builtins.gie:1929-1959} can assert {@code etmerc} at + * {@code tolerance 50 nm} including a row 3,900 km out. + * + *

Restructured against 9.8.1

+ * + *

The bodies here were pre-9.x. Four changes, all from upstream: + * + *

    + *
  • Six transcendental calls removed from the forward. {@code sin(2*Cn)}, + * {@code cos(2*Cn)}, {@code sinh(2*Ce)} and {@code cosh(2*Ce)} are now derived + * algebraically from quantities already in hand ({@code tmerc.cpp:341-369}), and the + * second {@code atan2} plus the {@code tan} are replaced by one reciprocal + * ({@code :313-325}). + *
  • The inverse's {@code sinh}/{@code cosh} pair becomes one {@code exp} + * ({@code :401-404}), and its {@code atan(sinh(Ce))} + {@code sin} + {@code cos} + + * {@code atan2} chain collapses to {@code atan2(sinhCe, cos_Cn)} ({@code :434-438}). + *
  • The final Gaussian→geodetic step is fed the sine and cosine it already has + * ({@code :442-443}) instead of re-deriving them from the angle. That is strictly more + * accurate near the poles and is what lets {@code builtins.gie:7123} pass at 50 nm. + *
  • Out-of-domain is an exception, not a plausible coordinate. See below. + *
+ * + *

The fail-open inverse

+ * + *

{@link #projectInverse} used to have no {@code else} branch. Because the caller + * passes the same object as source and destination, an easting outside + * {@code |Ce| <= 2.623395162778} left {@code out} holding the input metres, which + * {@link Projection#inverseProjectRadians} then read as radians and clamped to ±π. + * An out-of-zone UTM inverse therefore returned a finite, plausible, entirely wrong lon/lat — + * invisible to a finiteness postcondition, because the output is finite. Both + * directions now throw {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}, matching + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} at {@code tmerc.cpp:379} and + * {@code :447}. + * * @see Proj.4 issue 316 - * @see proj_etmerc.c */ public class ExtendedTransverseMercatorProjection extends CylindricalProjection { private static final long serialVersionUID = 1L; + /** + * 150° from the central meridian in normalised easting, {@code tmerc.cpp:372}. Beyond + * it the Koenig/Weise series is not merely inaccurate, it is divergent. + */ + static final double CE_LIMIT = 2.623395162778; + double Qn; /* Merid. quad., scaled to the projection */ double Zb; /* Radius vector in polar coord. systems */ double[] cgb = new double[6]; /* Constants for Gauss -> Geo lat */ @@ -18,19 +91,35 @@ public class ExtendedTransverseMercatorProjection extends CylindricalProjection double[] utg = new double[6]; /* Constants for transv. merc. -> geo */ double[] gtu = new double[6]; /* Constants for geo -> transv. merc. */ + /** + * {@code cgb} as a fixed-order-6 Clenshaw evaluator: the real-argument summation + * {@code gatg} performs, but without the {@code cos(2B)}/{@code sin(2B)} pair. + */ + private Clenshaw6 cgbSeries; + + /** {@code cbg} as a fixed-order-6 Clenshaw evaluator. */ + private Clenshaw6 cbgSeries; + + /** {@code gtu} as a fixed-order-6 real Clenshaw evaluator, used only for {@code Zb}. */ + private Clenshaw6 gtuSeries; + /** * Indicates whether a Southern Hemisphere UTM zone */ protected boolean isSouth = false; - private static final int PROJ_ETMERC_ORDER = 6; - private static final double HUGE_VAL = Double.POSITIVE_INFINITY; public ExtendedTransverseMercatorProjection() { - ellipsoid = Ellipsoid.GRS80; - projectionLatitude = Math.toRadians(0); - projectionLongitude = Math.toRadians(0); - minLongitude = Math.toRadians(-90); - maxLongitude = Math.toRadians(90); + // setEllipsoid, not an assignment to the field: Projection's own constructor has already + // run setEllipsoid(Ellipsoid.SPHERE), so assigning `ellipsoid` alone left a, e and es + // describing the *sphere* that constant names, while the field said GRS80 -- and + // Poder/Engsager is undefined on a sphere, so Registry.getProjection("etmerc") produced an + // instance that could not project. Every caller in the library goes on to call + // setEllipsoid again from the parser, so this only fixes the un-parsed case. + setEllipsoid(Ellipsoid.GRS80); + projectionLatitude = ProjectionMath.toRad(0); + projectionLongitude = ProjectionMath.toRad(0); + minLongitude = ProjectionMath.toRad(-90); + maxLongitude = ProjectionMath.toRad(90); initialize(); } @@ -44,6 +133,41 @@ public ExtendedTransverseMercatorProjection(Ellipsoid ellipsoid, double lon_0, d initialize(); } + /** + * Builds a Poder/Engsager kernel that shares the figure of the Earth, the latitude of origin + * and the scale factor of another transverse-Mercator projection, for + * {@link TransverseMercatorProjection} to delegate to. + * + *

Only those three quantities enter {@code setup_exact}. The false easting and northing, + * the unit and {@code totalScale} are deliberately not copied: the delegate is + * driven through its raw {@link #project} / {@link #projectInverse} kernel, which works in + * units of the semi-major axis, and the affine part is applied once by the outer + * projection's own {@code projectRadians}. + * + * @param p the projection to mirror + * @return a fully initialised kernel + * @throws InvalidValueException if {@code p} is on a sphere + */ + static ExtendedTransverseMercatorProjection forDelegation(Projection p) { + return new ExtendedTransverseMercatorProjection(p); + } + + /** + * The delegation constructor. Copies the raw {@code a}/{@code e}/{@code es} triple rather + * than going through {@link #setEllipsoid}, because {@code +R=} sets the size independently + * of the ellipsoid object and the two can disagree. + */ + private ExtendedTransverseMercatorProjection(Projection p) { + ellipsoid = p.ellipsoid; + a = p.a; + e = p.e; + es = p.es; + projectionLatitude = p.projectionLatitude; + projectionLongitude = p.projectionLongitude; + scaleFactor = p.scaleFactor; + initialize(); + } + @Override public void setSouthernHemisphere(boolean isSouth) { this.isSouth = isSouth; @@ -54,140 +178,184 @@ public boolean getSouthernHemisphere() { return isSouth; } - static double log1py(double x) { /* Compute log(1+x) accurately */ - double y = 1 + x; - double z = y - 1; - /* Here's the explanation for this magic: y = 1 + z, exactly, and z - * approx x, thus log(y)/z (which is nearly constant near z = 0) returns - * a good approximation to the true log(1 + x)/x. The multiplication x * - * (log(y)/z) introduces little additional error. */ - return z == 0 ? x : x * Math.log(y) / z; - } - - static double asinhy(double x) { /* Compute asinh(x) accurately */ - double y = Math.abs(x); /* Enforce odd parity */ - y = log1py(y * (1 + y / (Math.hypot(1.0, y) + 1))); - return x < 0 ? -y : y; - } - - static double gatg(double[] p1, int len_p1, double B) { - double h = 0, h1, h2 = 0; - - double cos_2B = 2 * Math.cos(2 * B); - - int p1i; - for (p1i = len_p1, h1 = p1[--p1i]; p1i > 0; h2 = h1, h1 = h) { - h = -h2 + cos_2B * h1 + p1[--p1i]; - } - - return (B + h * Math.sin(2 * B)); - } - - static double clenS(double[] a, int size, double arg_r, double arg_i, double[] R, double[] I) { - double hr, hr1, hr2, hi, hi1, hi2; - - /* arguments */ - int ai = size; - double sin_arg_r = Math.sin(arg_r); - double cos_arg_r = Math.cos(arg_r); - double sinh_arg_i = Math.sinh(arg_i); - double cosh_arg_i = Math.cosh(arg_i); - double r = 2 * cos_arg_r * cosh_arg_i; - double i = -2 * sin_arg_r * sinh_arg_i; - - /* summation loop */ - for (hi1 = hr1 = hi = 0, hr = a[--ai]; ai > 0; ) { + /** + * Complex Clenshaw summation, {@code tmerc.cpp:266-291}. The four trigonometric and + * hyperbolic values of the doubled arguments are supplied by the caller, because 9.8.1's + * forward derives all four algebraically rather than calling {@code sin}, {@code cos}, + * {@code sinh} and {@code cosh}. + * + * @param a six coefficients + * @param out receives the real part at index 0 and the imaginary part at index 1 + */ + static void clenS(double[] a, double sin_arg_r, double cos_arg_r, + double sinh_arg_i, double cosh_arg_i, double[] out) { + double r = 2.0 * cos_arg_r * cosh_arg_i; + double i = -2.0 * sin_arg_r * sinh_arg_i; + + double hr = a[AuxLat.ORDER - 1]; + double hi = 0.0; + double hr1 = 0.0; + double hi1 = 0.0; + double hr2; + double hi2; + for (int p = AuxLat.ORDER - 1; p > 0; ) { hr2 = hr1; hi2 = hi1; hr1 = hr; hi1 = hi; - hr = -hr2 + r * hr1 - i * hi1 + a[--ai]; + --p; + hr = -hr2 + r * hr1 - i * hi1 + a[p]; hi = -hi2 + i * hr1 + r * hi1; } r = sin_arg_r * cosh_arg_i; i = cos_arg_r * sinh_arg_i; - R[0] = r * hr - i * hi; - I[0] = r * hi + i * hr; - return R[0]; - } - - /* Real Clenshaw summation */ - static double clens(double[] a, int size, double arg_r) { - double hr, hr1, hr2; - - int ai = size; - double cos_arg_r = Math.cos(arg_r); - double r = 2 * cos_arg_r; - - /* summation loop */ - for (hr1 = 0, hr = a[--ai]; ai > 0; ) { - hr2 = hr1; - hr1 = hr; - hr = -hr2 + r * hr1 + a[--ai]; - } - return Math.sin(arg_r) * hr; + out[0] = r * hr - i * hi; + out[1] = r * hi + i * hr; } + /** + * {@code exact_e_fwd}, {@code tmerc.cpp:300-384}. + * + *

Math, not StrictMath. Deliberate, and only until the library-wide + * {@code StrictMath} sweep lands: that change is a separate step in the plan precisely so + * that its cost is not attributed to the algorithm work here. One ulp of a radian is about + * 2 pm on the ground, eight orders inside the 50 nm bar these rows carry. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { - double sin_Cn, cos_Cn, cos_Ce, sin_Ce; - double[] dCn = new double[1]; - double[] dCe = new double[1]; - double Cn = lpphi, Ce = lplam; + requireSetup(); /* ell. LAT, LNG -> Gaussian LAT, LNG */ - Cn = gatg(cbg, PROJ_ETMERC_ORDER, Cn); + double Cn = cbgSeries.convert(lpphi); + /* Gaussian LAT, LNG -> compl. sph. LAT */ - sin_Cn = Math.sin(Cn); - cos_Cn = Math.cos(Cn); - sin_Ce = Math.sin(Ce); - cos_Ce = Math.cos(Ce); + final double sin_Cn = Math.sin(Cn); + final double cos_Cn = Math.cos(Cn); + final double sin_Ce = Math.sin(lplam); + final double cos_Ce = Math.cos(lplam); + + final double cos_Cn_cos_Ce = cos_Cn * cos_Ce; + Cn = Math.atan2(sin_Cn, cos_Cn_cos_Ce); - Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn); - Ce = Math.atan2(sin_Ce * cos_Cn, Math.hypot(sin_Cn, cos_Cn * cos_Ce)); + final double inv_denom_tan_Ce = 1.0 / MathHelpers.norm2(sin_Cn, cos_Cn_cos_Ce); + final double tan_Ce = sin_Ce * cos_Cn * inv_denom_tan_Ce; /* compl. sph. N, E -> ell. norm. N, E */ - Ce = asinhy(Math.tan(Ce)); /* Replaces: Ce = log(tan(FORTPI + Ce*0.5)); */ - Cn += clenS(gtu, PROJ_ETMERC_ORDER, 2 * Cn, 2 * Ce, dCn, dCe); - Ce += dCe[0]; - if (Math.abs(Ce) <= 2.623395162778) { + /* Replaces: Ce = log(tan(FORTPI + Ce*0.5)) */ + double Ce = MathHelpers.asinh(tan_Ce); + + /* + * sin(2*Cn), cos(2*Cn), sinh(2*Ce) and cosh(2*Ce) without a single transcendental + * call, tmerc.cpp:327-369. From sin(2u) = 2 sin u cos u, cos(2u) = 2cos^2 u - 1, + * sin(atan y) = y/sqrt(1+y^2), cos(atan y) = 1/sqrt(1+y^2), sinh(asinh y) = y and + * cosh(asinh y) = sqrt(1+y^2), plus the identity + * 1 + tan_Ce^2 = 1/(sin_Cn^2 + cos_Cn^2 cos_Ce^2) = inv_denom_tan_Ce^2. + */ + final double two_inv_denom = 2.0 * inv_denom_tan_Ce; + final double two_inv_denom_square = two_inv_denom * inv_denom_tan_Ce; + final double tmp_r = cos_Cn_cos_Ce * two_inv_denom_square; + final double sin_arg_r = sin_Cn * tmp_r; + final double cos_arg_r = cos_Cn_cos_Ce * tmp_r - 1.0; + final double sinh_arg_i = tan_Ce * two_inv_denom; + final double cosh_arg_i = two_inv_denom_square - 1.0; + + final double[] dC = new double[2]; + clenS(gtu, sin_arg_r, cos_arg_r, sinh_arg_i, cosh_arg_i, dC); + Cn += dC[0]; + Ce += dC[1]; + + if (Math.abs(Ce) <= CE_LIMIT) { xy.y = Qn * Cn + Zb; /* Northing */ - xy.x = Qn * Ce; /* Easting */ - } else - xy.x = xy.y = HUGE_VAL; + xy.x = Qn * Ce; /* Easting */ + } else { + /* + * tmerc.cpp:379 sets PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN here. proj4j + * used to write HUGE_VAL into both ordinates and return normally. + */ + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "longitude " + Math.toDegrees(lplam) + " deg from the central meridian is " + + "outside the projection domain: normalised easting " + Ce + + " exceeds " + CE_LIMIT + " (150 deg)"); + } return xy; } + /** + * {@code exact_e_inv}, {@code tmerc.cpp:387-451}. + * + * @throws ProjectionException with {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} when the + * easting is more than 150° of arc from the central meridian — the case that + * used to return the input metres reinterpreted as radians + */ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { - double sin_Cn, cos_Cn, cos_Ce, sin_Ce; - double[] dCn = new double[1]; - double[] dCe = new double[1]; - double Cn = y, Ce = x; + requireSetup(); /* normalize N, E */ - Cn = (Cn - Zb) / Qn; - Ce = Ce / Qn; - - if (Math.abs(Ce) <= 2.623395162778) { /* 150 degrees */ - /* norm. N, E -> compl. sph. LAT, LNG */ - Cn += clenS(utg, PROJ_ETMERC_ORDER, 2 * Cn, 2 * Ce, dCn, dCe); - Ce += dCe[0]; - Ce = Math.atan(Math.sinh(Ce)); /* Replaces: Ce = 2*(atan(exp(Ce)) - FORTPI); */ - /* compl. sph. LAT -> Gaussian LAT, LNG */ - sin_Cn = Math.sin(Cn); - cos_Cn = Math.cos(Cn); - sin_Ce = Math.sin(Ce); - cos_Ce = Math.cos(Ce); - Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn); - Cn = Math.atan2(sin_Cn * cos_Ce, Math.hypot(sin_Ce, cos_Ce * cos_Cn)); - /* Gaussian LAT, LNG -> ell. LAT, LNG */ - out.y = gatg(cgb, PROJ_ETMERC_ORDER, Cn); - out.x = Ce; + double Cn = (y - Zb) / Qn; + double Ce = x / Qn; + + if (!(Math.abs(Ce) <= CE_LIMIT)) { /* 150 degrees; inverted so NaN is rejected */ + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "easting " + x + " is outside the projection domain: normalised easting " + + Ce + " exceeds " + CE_LIMIT + " (150 deg from the central " + + "meridian)"); } + /* norm. N, E -> compl. sph. LAT, LNG */ + final double sin_arg_r = Math.sin(2.0 * Cn); + final double cos_arg_r = Math.cos(2.0 * Cn); + + /* One exp instead of sinh(2*Ce) and cosh(2*Ce), tmerc.cpp:401-404. */ + final double exp_2_Ce = Math.exp(2.0 * Ce); + final double half_inv_exp_2_Ce = 0.5 / exp_2_Ce; + final double sinh_arg_i = 0.5 * exp_2_Ce - half_inv_exp_2_Ce; + final double cosh_arg_i = 0.5 * exp_2_Ce + half_inv_exp_2_Ce; + + final double[] dC = new double[2]; + clenS(utg, sin_arg_r, cos_arg_r, sinh_arg_i, cosh_arg_i, dC); + Cn += dC[0]; + Ce += dC[1]; + + /* compl. sph. LAT -> Gaussian LAT, LNG */ + final double sin_Cn = Math.sin(Cn); + final double cos_Cn = Math.cos(Cn); + + /* + * Dividing both arguments of the two atan2 calls by cos_Ce, which is positive: + * Ce = atan2(tan_Ce, cos_Cn) = atan2(sinh(Ce), cos_Cn) + * Cn = atan2(sin_Cn, hypot(tan_Ce, cos_Cn)) + * removes one atan, one sin and one cos (tmerc.cpp:420-438). + */ + final double sinhCe = Math.sinh(Ce); + Ce = Math.atan2(sinhCe, cos_Cn); + final double modulus_Ce = MathHelpers.norm2(sinhCe, cos_Cn); + final double rr = MathHelpers.norm2(sin_Cn, modulus_Ce); + Cn = Math.atan2(sin_Cn, modulus_Ce); + + /* + * Gaussian LAT, LNG -> ell. LAT, LNG. The sine and cosine of the Gaussian latitude are + * already known exactly as sin_Cn/rr and modulus_Ce/rr, so they are handed to the + * series rather than recovered from the angle -- full relative accuracy at the pole, + * which is what builtins.gie:7123 (50 nm at 89.99135 deg) measures. + */ + out.y = cgbSeries.convert(Cn, sin_Cn / rr, modulus_Ce / rr); + out.x = Ce; return out; } + /** + * Fails closed if the coefficients were never built — the only way to reach this is to use an + * instance that was constructed but never given an ellipsoid, which used to run the series + * with {@code Qn = 0} and produce infinities. + */ + private void requireSetup() { + if (cbgSeries == null) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, toString() + + ": no ellipsoid has been set, so the Poder/Engsager coefficients do not " + + "exist. Call setEllipsoid(..) then initialize()."); + } + } + public void setUTMZone(int zone) { zone--; projectionLongitude = (zone + .5) * Math.PI / 30. - Math.PI; @@ -200,88 +368,96 @@ public void setUTMZone(int zone) { public void initialize() { super.initialize(); + initializeExact(); + } - double f, n, np, Z; - - if (es <= 0) { - //return pj_default_destructor(P, PJD_ERR_ELLIPSOID_USE_REQUIRED); - return; + /** + * Builds the Poder/Engsager coefficients, {@code setup_exact} at {@code tmerc.cpp:456-490}. + * + *

Split out of {@link #initialize()} so that {@link TransverseMercatorProjection} — where + * a sphere is legal and selects the Evenden/Snyder series instead — can build them only when + * they exist. + * + *

A sphere is an error here, unconditionally

+ * + *

Both {@code +proj=etmerc} ({@code tmerc.cpp:617-625}) and {@code +proj=utm} + * ({@code :666-671}) reject {@code es == 0} with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}; {@code builtins.gie:7777} asserts it for + * {@code +proj=utm +a=6400000 +zone=30}. Proj4J used to return silently from setup and then + * run the series with {@code Qn = 0}, which is the silent-wrong-answer shape this whole class + * of fix exists to remove — so the guard is unconditional and stays that way. + * + *

The eccentricity test is ordered before the algorithm choice, not after, exactly + * as {@code setup()} does at {@code tmerc.cpp:518-519}: a sphere never reaches Poder/Engsager + * at all, because {@link TransverseMercatorProjection#initialize()} takes its spherical branch + * and never constructs this class. {@code +algo} then selects only among the ellipsoidal + * algorithms, which is why {@code +algo=poder_engsager} on a sphere is not an error upstream — + * it is silently downgraded. + * + *

What did have to be fixed to make that hold is the constructor: + * {@link Projection#Projection()} runs {@code setEllipsoid(Ellipsoid.SPHERE)}, and this + * class's no-argument constructor used to assign the {@code ellipsoid} field directly, so a + * {@code Registry}-instantiated instance carried {@code es == 0} before the parser had said + * anything. It now calls {@code setEllipsoid(Ellipsoid.GRS80)}. + * + * @throws InvalidValueException if the figure of the Earth is a sphere + */ + protected void initializeExact() { + if (es <= 0.0) { + // Fail closed rather than leaving usable-looking zeros behind. + cgbSeries = null; + cbgSeries = null; + gtuSeries = null; + Qn = Double.NaN; + Zb = Double.NaN; + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + toString() + ": the Poder/Engsager transverse Mercator requires an " + + "ellipsoid; eccentricity must not be zero. Use +proj=tmerc, " + + "which selects the Evenden/Snyder series on a sphere."); } - /* flattening */ - f = es / (1 + Math.sqrt(1 - es)); /* Replaces: f = 1 - sqrt(1-P->es); */ - - /* third flattening */ - np = n = f / (2 - f); - - /* COEF. OF TRIG SERIES GEO <-> GAUSS */ - /* cgb := Gaussian -> Geodetic, KW p190 - 191 (61) - (62) */ - /* cbg := Geodetic -> Gaussian, KW p186 - 187 (51) - (52) */ - /* PROJ_ETMERC_ORDER = 6th degree : Engsager and Poder: ICC2007 */ - - cgb[0] = n * (2 + n * (-2 / 3.0 + n * (-2 + n * (116 / 45.0 + n * (26 / 45.0 + - n * (-2854 / 675.0)))))); - cbg[0] = n * (-2 + n * (2 / 3.0 + n * (4 / 3.0 + n * (-82 / 45.0 + n * (32 / 45.0 + - n * (4642 / 4725.0)))))); - np *= n; - cgb[1] = np * (7 / 3.0 + n * (-8 / 5.0 + n * (-227 / 45.0 + n * (2704 / 315.0 + - n * (2323 / 945.0))))); - cbg[1] = np * (5 / 3.0 + n * (-16 / 15.0 + n * (-13 / 9.0 + n * (904 / 315.0 + - n * (-1522 / 945.0))))); - np *= n; - /* n^5 coeff corrected from 1262/105 . -1262/105 */ - cgb[2] = np * (56 / 15.0 + n * (-136 / 35.0 + n * (-1262 / 105.0 + - n * (73814 / 2835.0)))); - cbg[2] = np * (-26 / 15.0 + n * (34 / 21.0 + n * (8 / 5.0 + - n * (-12686 / 2835.0)))); - np *= n; - /* n^5 coeff corrected from 322/35 -> 332/35 */ - cgb[3] = np * (4279 / 630.0 + n * (-332 / 35.0 + n * (-399572 / 14175.0))); - cbg[3] = np * (1237 / 630.0 + n * (-12 / 5.0 + n * (-24832 / 14175.0))); - np *= n; - cgb[4] = np * (4174 / 315.0 + n * (-144838 / 6237.0)); - cbg[4] = np * (-734 / 315.0 + n * (109598 / 31185.0)); - np *= n; - cgb[5] = np * (601676 / 22275.0); - cbg[5] = np * (444337 / 155925.0); + /* + * Third flattening. Previously derived in two steps as + * f = es / (1 + sqrt(1 - es)); n = f / (2 - f); + * which is algebraically es / (1 + sqrt(1-es))^2 but carries one extra rounding. + * AuxLat.thirdFlattening is the direct form -- a single exactly-rounded sqrt, so + * every coefficient below is bit-reproducible across x86-64 and AArch64. + */ + final double n = AuxLat.thirdFlattening(es); + + /* + * COEF. OF TRIG SERIES GEO <-> GAUSS, PROJ_ETMERC_ORDER = 6th degree + * (Engsager and Poder, ICC2007). These four coefficient sets were verified term by + * term against 9.8.1's pj_auxlat_coeffs table (src/latitudes.cpp) and are bit-identical + * to it; the Gaussian latitude of Poder/Engsager *is* Karney's conformal latitude chi, + * so: + * + * cgb := Gaussian -> Geodetic, KW p190-191 (61)-(62) == C[phi,chi] + * cbg := Geodetic -> Gaussian, KW p186-187 (51)-(52) == C[chi,phi] + * utg := ell. N,E -> sph. N,E, KW p194 (65) == C[chi,mu] + * gtu := sph. N,E -> ell. N,E, KW p196 (69) == C[mu,chi] + */ + AuxLat.coeffs(n, AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC, cgb); + AuxLat.coeffs(n, AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL, cbg); + AuxLat.coeffs(n, AuxLat.RECTIFYING, AuxLat.CONFORMAL, utg); + AuxLat.coeffs(n, AuxLat.CONFORMAL, AuxLat.RECTIFYING, gtu); + + cgbSeries = new Clenshaw6(cgb); + cbgSeries = new Clenshaw6(cbg); + gtuSeries = new Clenshaw6(gtu); /* Constants of the projections */ /* Transverse Mercator (UTM, ITM, etc) */ - np = n * n; /* Norm. mer. quad, K&W p.50 (96), p.19 (38b), p.5 (2) */ - Qn = scaleFactor / (1 + n) * (1 + np * (1 / 4.0 + np * (1 / 64.0 + np / 256.0))); - /* coef of trig series */ - /* utg := ell. N, E -> sph. N, E, KW p194 (65) */ - /* gtu := sph. N, E -> ell. N, E, KW p196 (69) */ - utg[0] = n * (-0.5 + n * (2 / 3.0 + n * (-37 / 96.0 + n * (1 / 360.0 + - n * (81 / 512.0 + n * (-96199 / 604800.0)))))); - gtu[0] = n * (0.5 + n * (-2 / 3.0 + n * (5 / 16.0 + n * (41 / 180.0 + - n * (-127 / 288.0 + n * (7891 / 37800.0)))))); - utg[1] = np * (-1 / 48.0 + n * (-1 / 15.0 + n * (437 / 1440.0 + n * (-46 / 105.0 + - n * (1118711 / 3870720.0))))); - gtu[1] = np * (13 / 48.0 + n * (-3 / 5.0 + n * (557 / 1440.0 + n * (281 / 630.0 + - n * (-1983433 / 1935360.0))))); - np *= n; - utg[2] = np * (-17 / 480.0 + n * (37 / 840.0 + n * (209 / 4480.0 + - n * (-5569 / 90720.0)))); - gtu[2] = np * (61 / 240.0 + n * (-103 / 140.0 + n * (15061 / 26880.0 + - n * (167603 / 181440.0)))); - np *= n; - utg[3] = np * (-4397 / 161280.0 + n * (11 / 504.0 + n * (830251 / 7257600.0))); - gtu[3] = np * (49561 / 161280.0 + n * (-179 / 168.0 + n * (6601661 / 7257600.0))); - np *= n; - utg[4] = np * (-4583 / 161280.0 + n * (108847 / 3991680.0)); - gtu[4] = np * (34729 / 80640.0 + n * (-3418889 / 1995840.0)); - np *= n; - utg[5] = np * (-20648693 / 638668800.0); - gtu[5] = np * (212378941 / 319334400.0); + /* 9.8.1:tmerc.cpp:482 associates this as k0 * rectifyingRadius(n). */ + Qn = scaleFactor * AuxLat.rectifyingRadius(n); /* Gaussian latitude value of the origin latitude */ - Z = gatg(cbg, PROJ_ETMERC_ORDER, projectionLatitude); + final double Z = cbgSeries.convert(projectionLatitude); /* Origin northing minus true northing at the origin latitude */ /* i.e. true northing = N - P->Zb */ - Zb = -Qn * (Z + clens(gtu, PROJ_ETMERC_ORDER, 2 * Z)); + Zb = -Qn * gtuSeries.convert(Z); } public boolean hasInverse() { @@ -306,6 +482,9 @@ public Object clone() { if (gtu != null) { p.gtu = (double[]) gtu.clone(); } + // The Clenshaw6 evaluators are immutable, so the shallow copies are safe -- but they + // must not be left pointing at the *clone's* freshly copied arrays, which they do not: + // Clenshaw6 copies the six coefficients out at construction and retains no reference. return p; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/FaheyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/FaheyProjection.java index 9d46fdf..1c873f5 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/FaheyProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/FaheyProjection.java @@ -23,6 +23,8 @@ public class FaheyProjection extends Projection { + private static final long serialVersionUID = -4707229334836534388L; + private final static double TOL = 1e-6; public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { @@ -31,10 +33,22 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * Port of {@code fahey_s_inverse} ({@code 9.8.1:src/projections/fahey.cpp:24-33}). + *

+ * Three separate transcription faults in four lines, all silent. Upstream divides + * {@code xy.y} by 1.819152 first and every later use reads the divided value; the old + * code divided {@code out.y} — the caller's output slot, i.e. uninitialised as far as this + * method is concerned — instead of {@code xyy}, then formed {@code 1 - xyy*xyy} from the + * undivided northing, and finally took {@code sqrt(xyy)} rather than + * {@code sqrt(1 - y*y)}. Upstream's guard is also on {@code 1 - y*y}, not on + * {@code |1 - y*y|}, and returns longitude 0 there; that asymmetry is reproduced. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - out.y = 2. * Math.atan(out.y /= 1.819152); - out.x = Math.abs(out.y = 1. - xyy * xyy) < TOL ? 0. : - xyx / (0.819152 * Math.sqrt(xyy)); + double y = xyy / 1.819152; + out.y = 2. * Math.atan(y); + double c = 1. - y * y; + out.x = Math.abs(c) < TOL ? 0. : xyx / (0.819152 * Math.sqrt(c)); return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/FoucautProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/FoucautProjection.java index 750068e..be7c6bc 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/FoucautProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/FoucautProjection.java @@ -21,6 +21,8 @@ public class FoucautProjection extends SineTangentSeriesProjection { + private static final long serialVersionUID = -8747812553558470225L; + public FoucautProjection() { super( 2., 2., true ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/FoucautSinusoidalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/FoucautSinusoidalProjection.java index 7f47310..05dbb26 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/FoucautSinusoidalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/FoucautSinusoidalProjection.java @@ -19,11 +19,15 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class FoucautSinusoidalProjection extends Projection { + + private static final long serialVersionUID = 7961458105562012064L; + private double n, n1; private final static int MAX_ITER = 10; @@ -38,8 +42,14 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * Inverse projection. + *

+ * Fail-closed. PROJ's {@code fouc_s.cpp} clamps to {@code ±M_HALFPI} — the pole — + * when the Newton iteration exhausts {@code MAX_ITER}. Proj4J throws instead. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - double V; + double V = Double.NaN; int i; if (n != 0) { @@ -50,8 +60,12 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) if (Math.abs(V) < LOOP_TOL) break; } - if (i == 0) - out.y = xyy < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + if (i == 0) { + throw new ConvergenceFailureException(this, + "inverse latitude iteration did not converge to " + LOOP_TOL + " within " + + MAX_ITER + " iterations for northing " + xyy + + " (last correction " + V + ")"); + } } else out.y = ProjectionMath.asin(xyy); V = Math.cos(out.y); @@ -59,11 +73,40 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) return out; } + /** + * {@code +n}: the weight given to the sinusoidal component, in {@code [0, 1]}. + *

+ * This setter is why the bridge may claim to honour {@code "n"}. {@code fouc_s.cpp:61} + * reads {@code pj_param(..., "dn").f} and {@code fouc_s} is registered in {@code Registry}, so + * before this existed there was no way for the parser to deliver the value and + * {@code +proj=fouc_s +n=0.5} would silently have used the default of 0. Nothing was actually + * wrong, only because {@code builtins.gie}'s single {@code fouc_s} block is a bare + * {@code +proj=fouc_s +a=6400000} — that is a property of the corpus, not of the code, and it is + * exactly the shape of latent defect that "a plausible wrong answer" names. + *

+ * {@code Proj4Parser} dispatches {@code +n} to {@code urmfps}, {@code urm5} and {@code gn_sinu} + * on the concrete class; a branch for this class has to be added there for the key to arrive. + * + * @param n the weight, {@code 0 <= n <= 1} + */ + public void setN(double n) { + this.n = n; + } + + public double getN() { + return n; + } + + /** + * {@code PJ_PROJECTION(fouc_s)}. + *

+ * {@code n1} is derived from {@code n} and nothing derived is read back, so the second call + * {@code Proj4Parser} makes is a no-op. + */ public void initialize() { super.initialize(); -// n = pj_param(params, "dn").f; if (n < 0. || n > 1.) - throw new ProjectionException("-99"); + throw new ProjectionException("Invalid value for +n: it should be in [0, 1], but is " + n); n1 = 1. - n; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GallProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GallProjection.java index eb8b04a..b7c0304 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/GallProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/GallProjection.java @@ -23,6 +23,8 @@ public class GallProjection extends Projection { + private static final long serialVersionUID = 818622085019578883L; + private final static double YF = 1.70710678118654752440; private final static double XF = 0.70710678118654752440; private final static double RYF = 0.58578643762690495119; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GaussProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GaussProjection.java index 400fa89..fc6bbc5 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/GaussProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/GaussProjection.java @@ -19,12 +19,15 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class GaussProjection extends Projection { + private static final long serialVersionUID = 4713313535538578370L; + private final static int MAX_ITER = 20; private final static double DEL_TOL = 1.0e-14; @@ -63,16 +66,55 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { return out; } + /** + * {@code pj_gauss_ini} ({@code 9.8.1:src/gauss.cpp:49-79}). + *

+ * The {@code lat_0 = ±90} branch was missing. Upstream tests + * {@code .5*phi0 + M_FORTPI < 1e-10} — true only at the south pole, where + * {@code tan(.5*phi0 + pi/4)} is exactly 0 — and takes {@code K = 1/srat} rather than dividing + * by that zero. Without it {@code K} is {@code Infinity} and every coordinate comes back + * non-finite: {@code builtins.gie}'s four {@code +proj=sterea +ellps=GRS80 +lat_0=-90} rows + * measured exactly that. + *

+ * Upstream also returns {@code nullptr} — a definition rejection — when {@code C} or the + * {@code srat} factor is 0, which are the two other ways the expression can degenerate. + *

+ * The 20-trip {@code pow} loop in {@link #projectInverse} is reproduced, not improved: PROJ + * 9.8.1 still solves the inverse conformal latitude that way behind {@code sterea}, and the + * corpus's expected values were generated by it. + * + * @throws org.locationtech.proj4j.InvalidValueException where upstream returns + * {@code nullptr} from {@code pj_gauss_ini} + */ public void initialize() { super.initialize(); double sphi = Math.sin(projectionLatitude); - double cphi = Math.cos(projectionLatitude); + double cphi = Math.cos(projectionLatitude); cphi *= cphi; rc = Math.sqrt(1.0 - es) / (1.0 - es * sphi * sphi); C = Math.sqrt(1.0 + es * cphi * cphi / (1.0 - es)); - phic0 = Math.asin(sphi / C); + if (C == 0.0) { + throw new InvalidValueException( + "Invalid ellipsoid for the Gauss conformal sphere: the cone constant C is 0 at lat_0 = " + + Math.toDegrees(projectionLatitude) + " degrees"); + } + phic0 = ProjectionMath.asinChecked(sphi / C); ratexp = 0.5 * C * e; - K = Math.tan(0.5 * phic0 + ProjectionMath.QUARTERPI) / (Math.pow(Math.tan(0.5*projectionLatitude + ProjectionMath.QUARTERPI), this.C) * srat(e*sphi, ratexp)); + double sratValue = srat(e * sphi, ratexp); + if (sratValue == 0.0) { + throw new InvalidValueException( + "Invalid ellipsoid for the Gauss conformal sphere: the eccentricity factor is 0 at " + + "lat_0 = " + Math.toDegrees(projectionLatitude) + " degrees"); + } + if (0.5 * projectionLatitude + ProjectionMath.QUARTERPI < 1e-10) { + // gauss.cpp:71-72. lat_0 = -90 exactly: tan(.5*phi0 + pi/4) is 0, so the general expression + // divides by zero. Upstream substitutes the limit. + K = 1.0 / sratValue; + } else { + K = Math.tan(0.5 * phic0 + ProjectionMath.QUARTERPI) + / (Math.pow(Math.tan(0.5 * projectionLatitude + ProjectionMath.QUARTERPI), this.C) + * sratValue); + } } private static double srat(double esinp, double exp) { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GaussSchreiberTransverseMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GaussSchreiberTransverseMercatorProjection.java new file mode 100644 index 0000000..3db116b --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/GaussSchreiberTransverseMercatorProjection.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Gauss-Schreiber Transverse Mercator, {@code +proj=gstmerc} (also known as + * Gauss-Laborde Réunion) — a port of + * {@code 9.8.1:src/projections/gstmerc.cpp}. + * + *

A double-projection transverse Mercator: the ellipsoid is first mapped conformally onto a + * sphere of radius {@code n2} (the Gauss-Schreiber sphere), then a spherical transverse + * Mercator is applied on that sphere. Upstream marks it {@code Sph&Ell} but there is only one + * kernel — the spherical case simply has {@code es == 0}, which collapses {@code n1} to 1 + * and {@code phic} to {@code phi0}. + * + *

Where the scaling lives

+ * + *

This is the detail that makes or breaks the port. Upstream's forward ends with + * {@code * P->ra} ({@code = 1/a}) and the {@code a} multiply comes back in {@code fwd.cpp}'s + * affine tail — and {@code Q->n2} already contains {@code P->k0 * P->a}. So + * {@code +k_0} is applied inside {@code n2} and must not be applied again; + * {@link Projection} does not scale by {@code scaleFactor} on its own, so the two agree. + * + *

The inverse's mirror image is {@code xy.x * P->a}. {@link Projection}'s inverse funnel + * has already divided by {@code totalScale = a * fromMetres}, so multiplying by {@code a} here + * restores exactly upstream's operand. + * + *

{@code pj_tsfn} is called three ways

+ * + *

All three calls pass negated arguments, which is upstream's way of asking for + * {@code tan(pi/4 + phi/2)} rather than {@code tan(pi/4 - phi/2)}, and two of them pass + * {@code e = 0} to get the spherical form on the Gauss-Schreiber sphere while the third passes + * the real {@code e}. Getting either the sign or the eccentricity wrong is a silent, plausible + * wrong answer, so they are transcribed one for one. {@link ConformalLat#tsfn} and + * {@link ConformalLat#phi2} are the ports; the deprecated {@code ProjectionMath} twins are + * deliberately not used. + * + *

{@code initialize()} runs twice; every field below is a pure function of + * {@code projectionLatitude}, {@code scaleFactor}, {@code a} and {@code es}. + * + * @see 9.8.1 + * gstmerc.cpp + */ +public class GaussSchreiberTransverseMercatorProjection extends CylindricalProjection { + + private static final long serialVersionUID = -6228068182629941304L; + + /** {@code Q->c}. */ + private double c; + /** {@code Q->n1}, the ellipsoid-to-sphere latitude ratio. */ + private double n1; + /** {@code Q->n2}, the Gauss-Schreiber sphere's radius times {@code k_0}. */ + private double n2; + /** {@code Q->XS}, always zero upstream, retained for legibility. */ + private double xs; + /** {@code Q->YS}. */ + private double ys; + + /** Port of {@code PJ_PROJECTION(gstmerc)} ({@code gstmerc.cpp:56-80}). */ + @Override + public void initialize() { + super.initialize(); + final double phi0 = projectionLatitude; + final double sinphi0 = FastStrictTrig.sin(phi0); + final double cosphi0 = FastStrictTrig.cos(phi0); + + n1 = Math.sqrt(1 + es * Math.pow(cosphi0, 4.0) / (1 - es)); + final double phic = StrictMath.asin(sinphi0 / n1); + c = Math.log(ConformalLat.tsfn(-phic, -sinphi0 / n1, 0.0)) + - n1 * Math.log(ConformalLat.tsfn(-phi0, -sinphi0, e)); + n2 = scaleFactor * a * Math.sqrt(1 - es) / (1 - es * sinphi0 * sinphi0); + xs = 0; + ys = -n2 * phic; + } + + /** {@code gstmerc_s_forward}, {@code gstmerc.cpp:24-37}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double l = n1 * lam; + final double ls = c + n1 * Math.log(ConformalLat.tsfn(-phi, -FastStrictTrig.sin(phi), e)); + final double sinLs1 = FastStrictTrig.sin(l) / StrictMath.cosh(ls); + final double ls1 = Math.log(ConformalLat.tsfn(-StrictMath.asin(sinLs1), -sinLs1, 0.0)); + // * P->ra: Projection's affine tail multiplies by a again, and n2 carries k_0 * a. + xy.x = (xs + n2 * ls1) / a; + xy.y = (ys + n2 * StrictMath.atan(StrictMath.sinh(ls) / FastStrictTrig.cos(l))) / a; + return xy; + } + + /** {@code gstmerc_s_inverse}, {@code gstmerc.cpp:39-54}. */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + final double xa = x * a; + final double ya = y * a; + final double l = StrictMath.atan( + StrictMath.sinh((xa - xs) / n2) / FastStrictTrig.cos((ya - ys) / n2)); + final double sinC = FastStrictTrig.sin((ya - ys) / n2) / StrictMath.cosh((xa - xs) / n2); + final double lc = Math.log(ConformalLat.tsfn(-StrictMath.asin(sinC), -sinC, 0.0)); + lp.x = l / n1; + lp.y = -ConformalLat.phi2(Math.exp((lc - c) / n1), e); + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public boolean isConformal() { + return true; + } + + @Override + public String toString() { + return "Gauss-Schreiber Transverse Mercator"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GeneralSinusoidalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GeneralSinusoidalProjection.java new file mode 100644 index 0000000..cc742f1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/GeneralSinusoidalProjection.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * General Sinusoidal Series ({@code +proj=gn_sinu}), + * {@code 9.8.1:src/projections/gn_sinu.cpp:171-203}. The parameterised member of the family: + * both {@code +m} and {@code +n} are required and neither is documented. + * + *

Constructed with {@code m = 0} and {@code n = 0}, which is deliberately invalid — see + * {@link GeneralSinusoidalSeriesProjection}'s constructor note. Supply the shape through + * {@link #setM(double)} and {@link #setN(double)} and then call {@link #initialize()}; + * {@code initialize()} rejects {@code n <= 0} and {@code m < 0} exactly as + * {@code gn_sinu.cpp:186-196} does, so the invalid default cannot be used by accident. + * + * @see GeneralSinusoidalSeriesProjection + */ +public class GeneralSinusoidalProjection extends GeneralSinusoidalSeriesProjection { + + private static final long serialVersionUID = 4062207188592435795L; + + public GeneralSinusoidalProjection() { + super(0.0, 0.0); + } + + public String toString() { + return "General Sinusoidal Series"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GeneralSinusoidalSeriesProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GeneralSinusoidalSeriesProjection.java new file mode 100644 index 0000000..3e226e1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/GeneralSinusoidalSeriesProjection.java @@ -0,0 +1,238 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; + +/** + * The spherical general sinusoidal series, shared by {@code gn_sinu} and {@code mbtfps} in + * {@code 9.8.1:src/projections/gn_sinu.cpp}. That file also holds {@code sinu} and + * {@code eck6}, which proj4j already implements as separate classes. + * + *

Two shape parameters {@code m} and {@code n} define the whole family: + * + *

+ *   setup:   C_y = sqrt((m + 1) / n)
+ *            C_x = C_y / (m + 1)
+ *   forward: solve  m theta + sin(theta) = n sin(phi)   for theta   (8 steps, 1e-7)
+ *            x = C_x lam (m + cos(theta))
+ *            y = C_y theta
+ *   inverse: theta = y / C_y
+ *            phi = asin((m theta + sin(theta)) / n)
+ *            lam = x / (C_x (m + cos(theta)))
+ * 
+ * + *

with a shortcut when {@code m == 0}: no iteration is needed, since + * {@code sin(theta) = n sin(phi)} solves directly, and when additionally {@code n == 1} the + * map degenerates to {@code theta = phi} and even the {@code asin} is skipped. Both shortcuts + * are reproduced because they are not merely optimisations — {@code aasin} would clamp and + * possibly raise where the direct assignment cannot. + * + * + * + * + * + * + *
the two members ported here
{@code +proj=}{@code m}{@code n}
{@code gn_sinu}{@code +m}{@code +n}
{@code mbtfps}0.51.785398163397448309615660845
+ * + *

For reference, the two members proj4j already has are {@code sinu} at + * {@code (m, n) = (0, 1)} — the degenerate case — and {@code eck6} at + * {@code (1, 2.570796326794896619231321691)}. Both of those constants are + * {@code (pi + 2)/2} and {@code (pi + 4)/4} written out to 28 digits. + * + *

{@code gn_sinu}'s {@code +m} and {@code +n} are required and undocumented

+ * + *

{@code gn_sinu.cpp:178-198} rejects a missing {@code +n} with + * {@code PROJ_ERR_INVALID_OP_MISSING_ARG}, then a missing {@code +m}, then {@code n <= 0} and + * {@code m < 0} with {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. The prose documentation + * does not mention that either is mandatory. Both validations are reproduced in + * {@link #initialize()}. + * + *

{@code Proj4Keyword} now defines both {@code m} and {@code n}, and {@code Proj4Parser} + * dispatches them — on {@link GeneralSinusoidalProjection}, the concrete {@code gn_sinu} class, + * and deliberately not on this base: {@code sinu}, {@code eck6} and {@code mbtfps} share + * this kernel but hard-code their own {@code m} and {@code n} and read neither key upstream, so + * they must not receive them. Both keys are read with {@code pj_param}'s {@code 'd'} sigil, so they + * are plain numbers rather than angles. + */ +abstract class GeneralSinusoidalSeriesProjection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = -1825839845450890734L; + + private static final int MAX_ITER = 8; + private static final double LOOP_TOL = 1e-7; + private static final double HALF_PI = Math.PI / 2.0; + private static final double ONE_TOL = 1.00000000000001; + + private double m; + private double n; + private double cx; + private double cy; + + /** + * Deliberately does not call {@link #initialize()}. {@code gn_sinu} has no + * defaults for {@code m} and {@code n} — upstream requires both — so a + * no-argument construction necessarily starts invalid, and validating here would make + * {@code Registry.getProjection("gn_sinu")} throw before the caller ever had a chance to + * supply them. {@code Proj4Parser.parseProjection} calls {@code initialize()} after the + * setters ({@code Proj4Parser.java:283}), which is where the validation belongs and + * where upstream performs it too. + */ + protected GeneralSinusoidalSeriesProjection(double m, double n) { + this.m = m; + this.n = n; + es = 0.0; + } + + /** + * Sets {@code +m}. This is what {@code Proj4Parser} calls for a {@code gn_sinu} definition; see + * the class comment for why only the concrete subclass receives it. Call before + * {@link #initialize()}. + */ + public void setM(double m) { + this.m = m; + } + + /** Sets {@code +n}. See {@link #setM(double)}. */ + public void setN(double n) { + this.n = n; + } + + public double getM() { + return m; + } + + public double getN() { + return n; + } + + /** {@code pj_gn_sinu_setup} plus {@code gn_sinu}'s validations ({@code gn_sinu.cpp:108-198}). */ + @Override + public void initialize() { + super.initialize(); + if (n <= 0.0) { + throw new InvalidValueException( + "Invalid value for n: it should be > 0, but was " + n); + } + if (m < 0.0) { + throw new InvalidValueException( + "Invalid value for m: it should be >= 0, but was " + m); + } + es = 0.0; + cy = Math.sqrt((m + 1.0) / n); + cx = cy / (m + 1.0); + } + + /** + * {@code gn_sinu_s_forward}, {@code gn_sinu.cpp:55-82}. + * + * @throws ConvergenceFailureException where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} and returns + * {@code (0, 0)} + */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + double theta; + if (m == 0.0) { + theta = n != 1.0 ? aasin(n * StrictMath.sin(phi)) : phi; + } else { + final double k = n * StrictMath.sin(phi); + theta = phi; + int i = MAX_ITER; + double v = Double.NaN; + for (; i > 0; --i) { + v = (m * theta + StrictMath.sin(theta) - k) / (m + StrictMath.cos(theta)); + theta -= v; + if (Math.abs(v) < LOOP_TOL) { + break; + } + } + if (i == 0) { + // gn_sinu.cpp:73-76 sets the errno and returns the zero-initialised xy, + // i.e. the map origin -- a plausible coordinate for a failure. + throw new ConvergenceFailureException(this, + "forward auxiliary-angle iteration did not converge to " + LOOP_TOL + + " within " + MAX_ITER + " iterations for latitude " + phi + + " rad (last correction " + v + ")"); + } + } + dst.x = cx * lam * (m + StrictMath.cos(theta)); + dst.y = cy * theta; + return dst; + } + + /** + * {@code gn_sinu_s_inverse}, {@code gn_sinu.cpp:84-96}. + * + *

Note the longitude divides by {@code m + cos(theta)} where {@code theta} is the + * scaled northing {@code y / C_y} — upstream reuses the mutated {@code xy.y} for + * both, so the same value serves as the auxiliary angle in the latitude and in the + * longitude denominator. + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double theta = y / cy; + if (m != 0.0) { + dst.y = aasin((m * theta + StrictMath.sin(theta)) / n); + } else { + dst.y = n != 1.0 ? aasin(StrictMath.sin(theta) / n) : theta; + } + dst.x = x / (cx * (m + StrictMath.cos(theta))); + return dst; + } + + /** + * {@code aasin} from {@code 9.8.1:src/aasincos.cpp:16-25}. Not + * {@code ProjectionMath.asin}, which clamps silently at any magnitude and therefore + * cannot report the domain failure upstream reports. + */ + private double aasin(double v) { + final double av = Math.abs(v); + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException(this, + "asin argument " + v + " is outside [-1, 1]"); + } + return v < 0 ? -HALF_PI : HALF_PI; + } + return StrictMath.asin(v); + } + + public boolean hasInverse() { + return true; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that != null && getClass() == that.getClass()) { + GeneralSinusoidalSeriesProjection p = (GeneralSinusoidalSeriesProjection) that; + return m == p.m && n == p.n && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(m, n, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GeocentProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GeocentProjection.java index 07a99fd..656ac66 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/GeocentProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/GeocentProjection.java @@ -1,21 +1,294 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.datum.Ellipsoid; import org.locationtech.proj4j.datum.GeocentricConverter; +import org.locationtech.proj4j.util.ProjectionMath; +/** + * {@code +proj=geocent}: geodetic {@code (lambda, phi, h)} to geocentric cartesian + * {@code (X, Y, Z)} in metres, and back. + * + *

Not a projection. Its right-hand side is three-dimensional and cartesian, which is why it + * overrides {@link #projectRadians(ProjCoordinate, ProjCoordinate)} and + * {@link #inverseProjectRadians(ProjCoordinate, ProjCoordinate)} wholesale rather than supplying a + * {@code project(double, double, ProjCoordinate)} kernel: the two-ordinate kernel signature cannot + * carry {@code z}, and the affine post-multiply the base funnel applies to a projected result is + * meaningless on a geocentric triple. Upstream draws the same line — + * {@code 9.8.1:src/conversions/geocent.cpp} declares {@code P->right = PJ_IO_UNITS_CARTESIAN} and + * its own {@code fwd}/{@code inv} are the identity, with the real work done by + * {@code fwd_finalize}/{@code inv_prepare} calling {@code +proj=cart}. + * + *

What was wrong before 1.5.0

+ * + *

Both directions read {@code dst} instead of {@code src}: + * + *

{@code
+ * public ProjCoordinate projectRadians(ProjCoordinate src, ProjCoordinate dst) {
+ *     new GeocentricConverter(this.ellipsoid).convertGeodeticToGeocentric(dst);   // dst!
+ *     return dst;
+ * }
+ * }
+ * + *

So the input was ignored and the *output* buffer was converted in place. It survived because + * the only caller in {@code core} aliases the two arguments: + * {@code BasicCoordinateTransform.transformClosed} does {@code tgt.setValue(src)} and then calls + * {@code projectRadians(tgt, tgt)} and {@code inverseProjectRadians(tgt, tgt)}. With + * {@code src == dst} reading {@code dst} happens to read the input, so every CRS transform through + * {@code +proj=geocent} was accidentally correct and no test — there were none for this class — + * could see the defect. It bites the moment the two arguments differ, which is the documented + * contract of the public {@link #project(ProjCoordinate, ProjCoordinate)}, + * {@link #projectRadians(ProjCoordinate, ProjCoordinate)}, + * {@link #inverseProject(ProjCoordinate, ProjCoordinate)} and + * {@link #inverseProjectRadians(ProjCoordinate, ProjCoordinate)}, and is what + * {@code pipeline.Cs2csOperator.projectForward} does (fresh {@code src} and {@code dst}) for every + * other projection — it special-cases {@code geocent} onto its own {@code CartConversion} and so + * never exercised this code either. + * + *

{@link #project(ProjCoordinate, ProjCoordinate)} was worse than wrong: the degrees-in entry + * point is not virtual through {@code projectRadians(src, dst)} — the base class routes it into the + * *private* two-ordinate funnel — so it never reached this class at all and returned the base + * identity plus the affine. It is overridden here for that reason. + * + *

Why {@code hasInverse()} has to be declared

+ * + *

{@code BasicCoordinateTransform.inverseAvailable} answers "is there an implementation" by + * {@code hasInverse() || isGeographic()}, then by looking for a declared + * {@code projectInverse(double, double, ProjCoordinate)} up the class hierarchy. This class has no + * such method — it cannot, see above — so before {@code hasInverse()} was declared here the gate + * classified every {@code +proj=geocent} CRS as non-invertible and refused it as a transformation + * source. That is 330 CRS in the registry dictionaries (181 {@code epsg} defs plus the + * pairs the MetaCRS CSVs reference), all of which round-tripped in 1.4.3. + * + *

Iterative or closed form?

+ * + *

PROJ 9.8.1 has two geocentric-to-geodetic implementations and {@code +proj=geocent} uses the + * closed form: {@code geocent.cpp} builds {@code P->cart} ({@code create.cpp:167-175}) and + * {@code inv_prepare} ({@code inv.cpp:65-70}) runs it, and {@code cart.cpp:156-230} is Bowring's + * closed form. proj4j's {@link GeocentricConverter} is the other one — the 1996 + * Toms/Hannover iteration ported from PROJ.4's {@code geocent.c}, converging on {@code sin(phi)} + * to {@code 1e-12} (about 6 um of latitude). + * + *

This class delegates to {@link GeocentricConverter} anyway, deliberately: + * + *

    + *
  • The forward is not a choice: {@code GeocentricConverter.convertGeodeticToGeocentric} + * and {@code cart.cpp}'s {@code cartesian()} are the same expression in the same order — + * {@code (N + h) * cos(phi) * cos(lam)}, {@code (N + h) * cos(phi) * sin(lam)}, + * {@code (N * (1 - es) + h) * sin(phi)} with {@code N = a / sqrt(1 - es * sin^2(phi))} — so + * they agree bit for bit on the same {@code a} and {@code es}.
  • + *
  • The inverse differs, and the legacy engine this class serves already uses + * {@code GeocentricConverter} for its datum stage + * ({@code BasicCoordinateTransform.datumTransform}, a port of PROJ 5.2.0's + * {@code pj_transform.c}). Using Bowring here and the iteration one stage later would make a + * {@code geocent}-to-{@code geocent} transform disagree with itself by which stage ran. One + * kernel per engine is the property worth having: the legacy engine is iterative throughout, + * the pipeline engine is Bowring throughout ({@code pipeline.CartConversion}, which is + * package-private and so not reachable from here in any case).
  • + *
+ * + *

The residual ~6 um divergence from 9.8.1 is therefore a property of the engine, not + * of this class, and it is the pipeline engine's job to retire it by taking over + * {@code +proj=geocent} — which it already does. + * + *

Known divergences from 9.8.1, left in place on purpose

+ * + *
    + *
  • {@code +to_meter} / {@code +units} are ignored. {@code fwd_finalize} + * ({@code fwd.cpp:127-137}) multiplies all three cartesian ordinates by {@code fr_meter} and + * {@code inv_prepare} ({@code inv.cpp:64-70}) by {@code to_meter}. Every {@code geocent} def + * in the five registry dictionaries is {@code +units=m}, so honouring it would move no + * observable row; it is recorded rather than added silently.
  • + *
  • {@code +x_0} / {@code +y_0} are ignored, and that is correct. + * {@code geocent.cpp:53-54} forces {@code P->x0 = P->y0 = 0}, and {@code fwd_finalize}'s + * {@code PJ_IO_UNITS_CARTESIAN} branch never adds them.
  • + *
  • {@code +lon_0} is honoured, because upstream honours it: + * {@code fwd_prepare} does {@code lam = (lam - from_greenwich) - lam0} then {@code adjlon} + * ({@code fwd.cpp:105-112}) and {@code inv_finalize} adds it back + * ({@code inv.cpp:110-118}), for cartesian right-hand sides as much as for projected ones. + * {@code pipeline.Cs2csOperator} ports exactly that for its {@code GEOCENT} kernel. The + * override used to skip it.
  • + *
+ * + * @see GeocentricConverter + */ public class GeocentProjection extends Projection { - @Override - public ProjCoordinate projectRadians(ProjCoordinate src, ProjCoordinate dst) { - GeocentricConverter geocentricConverter = new GeocentricConverter(this.ellipsoid); - geocentricConverter.convertGeodeticToGeocentric(dst); - return dst; - } - - @Override - public ProjCoordinate inverseProjectRadians(ProjCoordinate src, ProjCoordinate dst) { - GeocentricConverter geocentricConverter = new GeocentricConverter(this.ellipsoid); - geocentricConverter.convertGeocentricToGeodetic(dst); - return dst; - } + private static final long serialVersionUID = 6460444409174128890L; + + /** + * The converter and the ellipsoid it was derived from, as one object so that the pair is + * published atomically. 1.4.3 allocated a {@link GeocentricConverter} on every single + * coordinate; the ellipsoid can still be replaced after construction + * ({@code Projection.setEllipsoid}), so the cache is keyed on it rather than built once. + * + *

The race is benign: two threads may each build an equivalent converter and one write + * wins. Neither can observe a partially built one, because the field is {@code volatile}. + */ + private static final class Cached { + private final Ellipsoid ellipsoid; + private final GeocentricConverter converter; + + Cached(Ellipsoid ellipsoid) { + this.ellipsoid = ellipsoid; + this.converter = new GeocentricConverter(ellipsoid); + } + } + + private volatile Cached cached; + + private GeocentricConverter converter() { + Ellipsoid e = getEllipsoid(); + Cached c = cached; + if (c == null || c.ellipsoid != e) { + c = new Cached(e); + cached = c; + } + return c.converter; + } + + /** + * The inverse is real and it is {@link #inverseProjectRadians(ProjCoordinate, ProjCoordinate)}. + * Declared because there is no {@code projectInverse(double, double, ProjCoordinate)} for + * {@code BasicCoordinateTransform.inverseAvailable} to find; see the class javadoc. + */ + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Geocentric"; + } + + /** + * Geodetic degrees to geocentric metres. + * + *

Overridden because the base class routes this entry point into its private two-ordinate + * funnel and so would never reach + * {@link #projectRadians(ProjCoordinate, ProjCoordinate)}: the degrees-in caller would get the + * base identity, in degrees, with the false easting added. + * + * @param src geodetic {@code (lambda, phi)} in degrees, {@code z} in metres + * @param dst geocentric {@code (X, Y, Z)} in metres; may be the same object as {@code src} + * @return {@code dst} + */ + @Override + public ProjCoordinate project(ProjCoordinate src, ProjCoordinate dst) { + double h = src.hasValidZOrdinate() ? src.z : 0.0; + return forward(src.x * ProjectionMath.DTR, src.y * ProjectionMath.DTR, h, dst); + } + + /** + * Geodetic radians to geocentric metres. + * + * @param src geodetic {@code (lambda, phi)} in radians, {@code z} in metres + * @param dst geocentric {@code (X, Y, Z)} in metres; may be the same object as {@code src} + * @return {@code dst} + */ + @Override + public ProjCoordinate projectRadians(ProjCoordinate src, ProjCoordinate dst) { + double h = src.hasValidZOrdinate() ? src.z : 0.0; + return forward(src.x, src.y, h, dst); + } + + /** + * Geocentric metres to geodetic radians. + * + * @param src geocentric {@code (X, Y, Z)} in metres + * @param dst geodetic {@code (lambda, phi)} in radians and {@code z} in metres; may be the + * same object as {@code src} + * @return {@code dst} + */ + @Override + public ProjCoordinate inverseProjectRadians(ProjCoordinate src, ProjCoordinate dst) { + double x = src.x; + double y = src.y; + double z = src.hasValidZOrdinate() ? src.z : 0.0; + if (!isFinite(x) || !isFinite(y) || !isFinite(z)) { + // inv_prepare (9.8.1:src/inv.cpp:40-45) rejects HUGE_VAL on all three ordinates, + // cartesian input included. NaN is rejected too, for the reason + // Projection.checkForwardDomain gives: a NaN that was asked for is indistinguishable + // downstream from one the kernel invented. + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, this, + "non-finite geocentric input (" + x + ", " + y + ", " + z + ") m"); + } + + // Read src, write dst -- and write all three before converting, so that the conversion + // reads the input whether or not the caller aliased the two arguments. + dst.x = x; + dst.y = y; + dst.z = z; + converter().convertGeocentricToGeodetic(dst); + checkFinite(dst, "inverse", x, y, z); + + // inv_finalize's PJ_IO_UNITS_RADIANS branch (inv.cpp:110-118). Guarded on != 0 exactly as + // Projection.inverseProjectRadians guards it, so that a definition without +lon_0 is + // bit-for-bit unchanged -- `x + 0.0` is not the identity on -0.0. + if (projectionLongitude != 0) { + dst.x = ProjectionMath.normalizeLongitude(dst.x + projectionLongitude); + } + return dst; + } + + /** + * The single forward body. {@code lam}/{@code phi} in radians, {@code h} in metres. + */ + private ProjCoordinate forward(double lam, double phi, double h, ProjCoordinate dst) { + // fwd_prepare's angular input contract (9.8.1:src/fwd.cpp:54-77) applies to geocent as + // much as to any projection: geocent.cpp:56 declares P->left = PJ_IO_UNITS_RADIANS. + phi = checkForwardDomain(lam, phi); + if (!isFinite(h)) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, this, + "non-finite geodetic height " + h + " m"); + } + // fwd_prepare's lam0 subtraction, fwd.cpp:105-112. Guarded on != 0 for the -0.0 reason + // given in inverseProjectRadians. + if (projectionLongitude != 0) { + lam = ProjectionMath.normalizeLongitude(lam - projectionLongitude); + } + + dst.x = lam; + dst.y = phi; + dst.z = h; + converter().convertGeodeticToGeocentric(dst); + checkFinite(dst, "forward", lam, phi, h); + return dst; + } + + /** + * The output postcondition. This class bypasses the base funnel, so it owns the funnel's + * promise that returning normally implies a finite result — and it owns it for {@code z} too, + * which the two-ordinate funnel never checked. + */ + private void checkFinite(ProjCoordinate p, String direction, double a, double b, double c) { + if (!isFinite(p.x) || !isFinite(p.y) || !isFinite(p.z)) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "geocentric " + direction + " conversion of (" + a + ", " + b + ", " + c + + ") returned a non-finite coordinate (" + p.x + ", " + p.y + ", " + + p.z + ")"); + } + } + + private static boolean isFinite(double v) { + return !Double.isNaN(v) && !Double.isInfinite(v); + } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GeostationarySatelliteProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GeostationarySatelliteProjection.java index d92f6b0..9830011 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/GeostationarySatelliteProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/GeostationarySatelliteProjection.java @@ -1,225 +1,227 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package org.locationtech.proj4j.proj; - -import java.util.Objects; - -import org.locationtech.proj4j.ProjCoordinate; -import org.locationtech.proj4j.ProjectionException; -import org.locationtech.proj4j.util.ProjectionMath; - -/** - * - * @author yaqiang - */ -public class GeostationarySatelliteProjection extends Projection { - - /** - * Height of orbit - Geostationary satellite projection - */ - protected double heightOfOrbit = 35785831.0; - - private double _radiusP; - private double _radiusP2; - private double _radiusPInv2; - private double _radiusG; - private double _radiusG1; - private double _c; - - /** - * Constructor - */ - public GeostationarySatelliteProjection() { - name = "Geostationary"; - initialize(); - } - - @Override - public void initialize() { - super.initialize(); - _radiusG = 1 + (_radiusG1 = heightOfOrbit / a); - _c = _radiusG * _radiusG - 1.0; - if (!this.spherical) { - _radiusP = Math.sqrt(one_es); - _radiusP2 = one_es; - _radiusPInv2 = rone_es; - } else { - _radiusP = _radiusP2 = _radiusPInv2 = 1.0; - } - } - - - @Override - public double getHeightOfOrbit(){ - return this.heightOfOrbit; - } - - @Override - public void setHeightOfOrbit(double h){ - this.heightOfOrbit = h; - } - - @Override - public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - if (spherical) { - project_s(lplam, lpphi, out); - } else { - project_e(lplam, lpphi, out); - } - return out; - } - - public void project_s(double lplam, double lpphi, ProjCoordinate out) { - /* Calculation of the three components of the vector from satellite to - ** position on earth surface (lon,lat).*/ - double tmp = Math.cos(lpphi); - double vx = Math.cos(lplam) * tmp; - double vy = Math.sin(lplam) * tmp; - double vz = Math.sin(lpphi); - - /* Check visibility.*/ - if (((_radiusG - vx) * vx - vy * vy - vz * vz) < 0) { - out.x = Double.NaN; - out.y = Double.NaN; - //throw new ProjectionException(20); - return; - } - - /* Calculation based on view angles from satellite.*/ - tmp = _radiusG - vx; - out.x = _radiusG1 * Math.atan(vy / tmp); - out.y = _radiusG1 * Math.atan(vz / ProjectionMath.hypot(vy, tmp)); - } - - public void project_e(double lplam, double lpphi, ProjCoordinate out) { - /* Calculation of geocentric latitude. */ - lpphi = Math.atan(_radiusP2 * Math.tan(lpphi)); - - /* Calculation of the three components of the vector from satellite to - ** position on earth surface (lon,lat).*/ - double r = (_radiusP) / ProjectionMath.hypot(_radiusP * Math.cos(lpphi), Math.sin(lpphi)); - double vx = r * Math.cos(lplam) * Math.cos(lpphi); - double vy = r * Math.sin(lplam) * Math.cos(lpphi); - double vz = r * Math.sin(lpphi); - - /* Check visibility. */ - if (((_radiusG - vx) * vx - vy * vy - vz * vz * _radiusPInv2) < 0) { - out.x = Double.NaN; - out.y = Double.NaN; - //throw new ProjectionException(20); - return; - } - - /* Calculation based on view angles from satellite. */ - double tmp = _radiusG - vx; - out.x = _radiusG1 * Math.atan(vy / tmp); - out.y = _radiusG1 * Math.atan(vz / ProjectionMath.hypot(vy, tmp)); - } - - @Override - public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - if (spherical) { - projectInverse_s(xyx, xyy, out); - } else { - projectInverse_e(xyx, xyy, out); - } - return out; - } - - public void projectInverse_s(double xyx, double xyy, ProjCoordinate out) { - double det; - - /* Setting three components of vector from satellite to position.*/ - double vx = -1.0; - double vy = Math.tan(xyx / (_radiusG - 1.0)); - double vz = Math.tan(xyy / (_radiusG - 1.0)) * Math.sqrt(1.0 + vy * vy); - - /* Calculation of terms in cubic equation and determinant.*/ - double a = vy * vy + vz * vz + vx * vx; - double b = 2 * _radiusG * vx; - if ((det = (b * b) - 4 * a * _c) < 0) { - throw new ProjectionException(); - } - - /* Calculation of three components of vector from satellite to position.*/ - double k = (-b - Math.sqrt(det)) / (2 * a); - vx = _radiusG + k * vx; - vy *= k; - vz *= k; - - /* Calculation of longitude and latitude.*/ - double lplam = Math.atan2(vy, vx); - double lpphi = Math.atan(vz * Math.cos(lplam) / vx); - - out.x = lplam; - out.y = lpphi; - } - - public void projectInverse_e(double xyx, double xyy, ProjCoordinate out) { - double det; - - /* Setting three components of vector from satellite to position.*/ - double vx = -1.0; - double vy = Math.tan(xyx / _radiusG1); - double vz = Math.tan(xyy / _radiusG1) * ProjectionMath.hypot(1.0, vy); - - /* Calculation of terms in cubic equation and determinant.*/ - double a = vz / _radiusP; - a = vy * vy + a * a + vx * vx; - double b = 2 * _radiusG * vx; - if ((det = (b * b) - 4 * a * _c) < 0) { - throw new ProjectionException(); - } - - /* Calculation of three components of vector from satellite to position.*/ - double k = (-b - Math.sqrt(det)) / (2 * a); - vx = _radiusG + k * vx; - vy *= k; - vz *= k; - - /* Calculation of longitude and latitude.*/ - double lplam = Math.atan2(vy, vx); - double lpphi = Math.atan(vz * Math.cos(lplam) / vx); - lpphi = Math.atan(_radiusPInv2 * Math.tan(lpphi)); - - out.x = lplam; - out.y = lpphi; - } - - /** - * Returns true if this projection is equal area - */ - @Override - public boolean isEqualArea() { - return false; - } - - @Override - public boolean hasInverse() { - return true; - } - - @Override - public String toString() { - return "Geostationary Satellite"; - } - - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - if (that instanceof GeostationarySatelliteProjection) { - GeostationarySatelliteProjection p = (GeostationarySatelliteProjection) that; - return (this.heightOfOrbit == p.heightOfOrbit) && super.equals(that); - } - return false; - } - - @Override - public int hashCode() { - return Objects.hash(heightOfOrbit, super.hashCode()); - } -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * + * @author yaqiang + */ +public class GeostationarySatelliteProjection extends Projection { + + private static final long serialVersionUID = 7598288678901692538L; + + /** + * Height of orbit - Geostationary satellite projection + */ + protected double heightOfOrbit = 35785831.0; + + private double _radiusP; + private double _radiusP2; + private double _radiusPInv2; + private double _radiusG; + private double _radiusG1; + private double _c; + + /** + * Constructor + */ + public GeostationarySatelliteProjection() { + name = "Geostationary"; + initialize(); + } + + @Override + public void initialize() { + super.initialize(); + _radiusG = 1 + (_radiusG1 = heightOfOrbit / a); + _c = _radiusG * _radiusG - 1.0; + if (!this.spherical) { + _radiusP = Math.sqrt(one_es); + _radiusP2 = one_es; + _radiusPInv2 = rone_es; + } else { + _radiusP = _radiusP2 = _radiusPInv2 = 1.0; + } + } + + + @Override + public double getHeightOfOrbit(){ + return this.heightOfOrbit; + } + + @Override + public void setHeightOfOrbit(double h){ + this.heightOfOrbit = h; + } + + @Override + public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { + if (spherical) { + project_s(lplam, lpphi, out); + } else { + project_e(lplam, lpphi, out); + } + return out; + } + + public void project_s(double lplam, double lpphi, ProjCoordinate out) { + /* Calculation of the three components of the vector from satellite to + ** position on earth surface (lon,lat).*/ + double tmp = Math.cos(lpphi); + double vx = Math.cos(lplam) * tmp; + double vy = Math.sin(lplam) * tmp; + double vz = Math.sin(lpphi); + + /* Check visibility.*/ + if (((_radiusG - vx) * vx - vy * vy - vz * vz) < 0) { + out.x = Double.NaN; + out.y = Double.NaN; + //throw new ProjectionException(20); + return; + } + + /* Calculation based on view angles from satellite.*/ + tmp = _radiusG - vx; + out.x = _radiusG1 * Math.atan(vy / tmp); + out.y = _radiusG1 * Math.atan(vz / ProjectionMath.hypot(vy, tmp)); + } + + public void project_e(double lplam, double lpphi, ProjCoordinate out) { + /* Calculation of geocentric latitude. */ + lpphi = Math.atan(_radiusP2 * Math.tan(lpphi)); + + /* Calculation of the three components of the vector from satellite to + ** position on earth surface (lon,lat).*/ + double r = (_radiusP) / ProjectionMath.hypot(_radiusP * Math.cos(lpphi), Math.sin(lpphi)); + double vx = r * Math.cos(lplam) * Math.cos(lpphi); + double vy = r * Math.sin(lplam) * Math.cos(lpphi); + double vz = r * Math.sin(lpphi); + + /* Check visibility. */ + if (((_radiusG - vx) * vx - vy * vy - vz * vz * _radiusPInv2) < 0) { + out.x = Double.NaN; + out.y = Double.NaN; + //throw new ProjectionException(20); + return; + } + + /* Calculation based on view angles from satellite. */ + double tmp = _radiusG - vx; + out.x = _radiusG1 * Math.atan(vy / tmp); + out.y = _radiusG1 * Math.atan(vz / ProjectionMath.hypot(vy, tmp)); + } + + @Override + public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { + if (spherical) { + projectInverse_s(xyx, xyy, out); + } else { + projectInverse_e(xyx, xyy, out); + } + return out; + } + + public void projectInverse_s(double xyx, double xyy, ProjCoordinate out) { + double det; + + /* Setting three components of vector from satellite to position.*/ + double vx = -1.0; + double vy = Math.tan(xyx / (_radiusG - 1.0)); + double vz = Math.tan(xyy / (_radiusG - 1.0)) * Math.sqrt(1.0 + vy * vy); + + /* Calculation of terms in cubic equation and determinant.*/ + double a = vy * vy + vz * vz + vx * vx; + double b = 2 * _radiusG * vx; + if ((det = (b * b) - 4 * a * _c) < 0) { + throw new ProjectionException(); + } + + /* Calculation of three components of vector from satellite to position.*/ + double k = (-b - Math.sqrt(det)) / (2 * a); + vx = _radiusG + k * vx; + vy *= k; + vz *= k; + + /* Calculation of longitude and latitude.*/ + double lplam = Math.atan2(vy, vx); + double lpphi = Math.atan(vz * Math.cos(lplam) / vx); + + out.x = lplam; + out.y = lpphi; + } + + public void projectInverse_e(double xyx, double xyy, ProjCoordinate out) { + double det; + + /* Setting three components of vector from satellite to position.*/ + double vx = -1.0; + double vy = Math.tan(xyx / _radiusG1); + double vz = Math.tan(xyy / _radiusG1) * ProjectionMath.hypot(1.0, vy); + + /* Calculation of terms in cubic equation and determinant.*/ + double a = vz / _radiusP; + a = vy * vy + a * a + vx * vx; + double b = 2 * _radiusG * vx; + if ((det = (b * b) - 4 * a * _c) < 0) { + throw new ProjectionException(); + } + + /* Calculation of three components of vector from satellite to position.*/ + double k = (-b - Math.sqrt(det)) / (2 * a); + vx = _radiusG + k * vx; + vy *= k; + vz *= k; + + /* Calculation of longitude and latitude.*/ + double lplam = Math.atan2(vy, vx); + double lpphi = Math.atan(vz * Math.cos(lplam) / vx); + lpphi = Math.atan(_radiusPInv2 * Math.tan(lpphi)); + + out.x = lplam; + out.y = lpphi; + } + + /** + * Returns true if this projection is equal area + */ + @Override + public boolean isEqualArea() { + return false; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Geostationary Satellite"; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that instanceof GeostationarySatelliteProjection) { + GeostationarySatelliteProjection p = (GeostationarySatelliteProjection) that; + return (this.heightOfOrbit == p.heightOfOrbit) && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(heightOfOrbit, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Ginsburg8Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Ginsburg8Projection.java index 4575803..178e541 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Ginsburg8Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Ginsburg8Projection.java @@ -23,6 +23,8 @@ public class Ginsburg8Projection extends Projection { + private static final long serialVersionUID = 494259623062988003L; + private final static double Cl = 0.000952426; private final static double Cp = 0.162388; private final static double C12 = 0.08333333333333333; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GnomonicAzimuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GnomonicAzimuthalProjection.java index 4badcb0..33b59c7 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/GnomonicAzimuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/GnomonicAzimuthalProjection.java @@ -19,28 +19,104 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.geodesic.Geodesic; +import org.locationtech.proj4j.geodesic.GeodesicData; +import org.locationtech.proj4j.geodesic.GeodesicLine; +import org.locationtech.proj4j.geodesic.GeodesicMask; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Gnomonic, {@code +proj=gnom}. + * + *

Upstream is {@code 9.8.1:src/projections/gnom.cpp}, which has two entirely different + * kernels and dispatches on {@code P->es == 0}: + * + *

    + *
  • spherical — the four-aspect closed form below, unchanged here;
  • + *
  • ellipsoidal — Karney's geodesic gnomonic. The forward is one geodesic inverse + * solution from {@code (lat_0, 0)}, giving the azimuth {@code azi1}, the reduced length + * {@code m12} and the geodesic scale {@code M12}; {@code rho = m12 / M12} and the point is + * {@code (rho sin azi, rho cos azi)}. The inverse is a 10-step Newton iteration along a + * {@link GeodesicLine} from the projection centre.
  • + *
+ * + *

This class had only the spherical kernel, so every ellipsoidal {@code gnom} silently + * answered the spherical formulas: the corpus's {@code +proj=gnom +a=1 +rf=200} blocks missed by + * 7 mm to 28.7 m against a 0.1 mm bar, and — more seriously — the domain contract differs + * between the two. On a sphere the polar aspect cannot see the equator at all, so + * {@code +lat_0=90} at {@code (0, 0)} is an error; on the ellipsoid it is a finite point, + * {@code (0, -127.4835)}. Three corpus rows assert the finite answer and three assert the error, + * and only a class with both kernels can satisfy both sets. + * + *

The geodesic runs on a unit-{@code a} ellipsoid ({@code geod_init(&Q->g, 1, + * P->f)}), so {@code rho} is dimensionless and the {@code a} multiply happens in + * {@code Projection}'s affine tail exactly as it does for the spherical kernel. Getting that wrong + * scales the whole map by {@code a}. + * + * @see 9.8.1 + * gnom.cpp + */ public class GnomonicAzimuthalProjection extends AzimuthalProjection { + + private static final long serialVersionUID = -2763703781166745739L; + + /** Upstream's {@code numit_}. */ + private static final int MAX_ITER = 10; + + /** Upstream's {@code eps_} = {@code 0.01 * sqrt(DBL_EPSILON)}. */ + private static final double EPS_NEWTON = 0.01 * Math.sqrt(Math.ulp(1.0)); + + /** + * {@code Q->g}, built on a unit-{@code a} ellipsoid. Null when the figure is a sphere, which + * is also how the two kernels are selected — mirroring upstream's {@code P->es == 0} test. + */ + private Geodesic geodesic; + /** + * A bare {@code +proj=gnom}, i.e. the equatorial aspect. + *

+ * The no-argument constructor used to pin {@code lat_0} to 90°, which selected + * {@link AzimuthalProjection#NORTH_POLE} for every definition that did not spell + * {@code +lat_0} out. {@code Proj4Parser} assigns {@code +lat_0} only when the keyword is + * present, so the class default is the effective default, and PROJ's is 0 + * ({@code pj_init} reads {@code "rlat_0"}, whose absence yields 0). {@code +proj=gnom +R=1} + * therefore answered the polar formulas where PROJ answers the equatorial ones: at + * {@code (10, 80)} it returned {@code (0.030619, -0.173648)} against PROJ's + * {@code (0.1763, 5.7588)} — a different projection, not a rounding difference. + */ public GnomonicAzimuthalProjection() { - this(Math.toRadians(90.0), Math.toRadians(0.0)); + this(0.0, 0.0); } public GnomonicAzimuthalProjection(double projectionLatitude, double projectionLongitude) { super(projectionLatitude, projectionLongitude); - minLatitude = Math.toRadians(0); - maxLatitude = Math.toRadians(90); + minLatitude = ProjectionMath.toRad(0); + maxLatitude = ProjectionMath.toRad(90); initialize(); } + /** + * Selects the kernel. Port of {@code PJ_PROJECTION(gnom)} + * ({@code 9.8.1:src/projections/gnom.cpp:181-213}). + */ public void initialize() { super.initialize(); + if (es == 0.0) { + geodesic = null; + } else { + // geod_init(&Q->g, 1, P->f): unit equatorial radius, real flattening. + geodesic = new Geodesic(1.0, 1.0 - Math.sqrt(one_es)); + } } public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + if (geodesic != null) { + return projectEllipsoidal(lam, phi, xy); + } double sinphi = Math.sin(phi); double cosphi = Math.cos(phi); double coslam = Math.cos(lam); @@ -59,8 +135,15 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { xy.y = sinphi; break; } - if (Math.abs(xy.y) <= EPS10) - throw new ProjectionException(); + // gnom.cpp:50 -- the test is `xy.y <= EPS10`, NOT `fabs(xy.y) <= EPS10`. xy.y is + // cos(angular distance from the centre), so a NEGATIVE value is a point beyond the + // horizon and must be refused; taking the absolute value accepted the whole far + // hemisphere and projected it, mirrored, onto the near one. + if (xy.y <= EPS10) + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "Gnomonic: cos(distance from the projection centre) = " + xy.y + + " is at or beyond the horizon, where the gnomonic plane is not " + + "defined"); xy.x = (xy.y = 1. / xy.y) * cosphi * Math.sin(lam); switch (mode) { case EQUATOR: @@ -78,7 +161,100 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { return xy; } + /** + * Port of {@code gnom_e_forward} ({@code 9.8.1:src/projections/gnom.cpp:115-136}). + * + * @param lam longitude relative to the central meridian, radians + * @param phi latitude, radians + * @param xy the output + * @return {@code xy} + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} when the geodesic + * scale {@code M12} is not positive, i.e. the point is at or beyond the point where + * geodesics from the centre stop diverging. Upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} and returns + * {@code HUGE_VAL}. + */ + private ProjCoordinate projectEllipsoidal(double lam, double phi, ProjCoordinate xy) { + GeodesicData g = geodesic.Inverse( + ProjectionMath.toDeg(projectionLatitude), 0.0, ProjectionMath.toDeg(phi), ProjectionMath.toDeg(lam), + GeodesicMask.AZIMUTH | GeodesicMask.REDUCEDLENGTH | GeodesicMask.GEODESICSCALE); + if (!(g.M12 > 0)) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "Gnomonic (ellipsoidal): geodesic scale M12 = " + g.M12 + " at (" + + Math.toDegrees(lam) + ", " + Math.toDegrees(phi) + + ") degrees is not positive, so the gnomonic projection of the point " + + "is not defined"); + } + double rho = g.m12 / g.M12; + double azi = ProjectionMath.toRad(g.azi1); + xy.x = rho * FastStrictTrig.sin(azi); + xy.y = rho * FastStrictTrig.cos(azi); + return xy; + } + + /** + * Port of {@code gnom_e_inverse} ({@code 9.8.1:src/projections/gnom.cpp:138-178}). + * + *

Two details are load bearing and are copied literally. The iteration solves + * {@code rho(s) = rho} for {@code rho <= 1} and {@code 1/rho(s) = 1/rho} above it, because the + * two have well-conditioned derivatives on opposite sides of that line; and the convergence + * test is written inverted, {@code !(|ds| >= eps)}, so that a {@code NaN} takes the + * converged branch rather than spinning out the trip count. + * + * @param x easting, in units of the equatorial radius + * @param y northing, in units of the equatorial radius + * @param lp the output + * @return {@code lp} + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} if the Newton iteration + * does not converge in {@link #MAX_ITER} steps, which upstream reports as + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + */ + private ProjCoordinate projectInverseEllipsoidal(double x, double y, ProjCoordinate lp) { + double azi0 = ProjectionMath.toDeg(Math.atan2(x, y)); // clockwise from north + double rho = ProjectionMath.distance(x, y); + double s = Math.atan(rho); + boolean little = rho <= 1; + if (!little) { + rho = 1 / rho; + } + GeodesicLine line = geodesic.Line( + ProjectionMath.toDeg(projectionLatitude), 0.0, azi0, + GeodesicMask.LATITUDE | GeodesicMask.LONGITUDE | GeodesicMask.DISTANCE_IN + | GeodesicMask.REDUCEDLENGTH | GeodesicMask.GEODESICSCALE); + int count = MAX_ITER; + boolean trip = false; + double lat1 = 0; + double lon1 = 0; + while (count-- > 0) { + GeodesicData g = line.Position(s, + GeodesicMask.LATITUDE | GeodesicMask.LONGITUDE + | GeodesicMask.REDUCEDLENGTH | GeodesicMask.GEODESICSCALE); + lat1 = g.lat2; + lon1 = g.lon2; + if (trip) { + break; + } + double ds = little ? (g.m12 - rho * g.M12) * g.M12 : (rho * g.m12 - g.M12) * g.m12; + s -= ds; + // Reversed test to allow escape with NaNs, exactly as upstream writes it. + if (!(Math.abs(ds) >= EPS_NEWTON)) { + trip = true; + } + } + if (!trip) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "Gnomonic (ellipsoidal) inverse: the Newton iteration did not reach " + + EPS_NEWTON + " in " + MAX_ITER + " steps for (" + x + ", " + y + ")"); + } + lp.y = ProjectionMath.toRad(lat1); + lp.x = ProjectionMath.toRad(lon1); + return lp; + } + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + if (geodesic != null) { + return projectInverseEllipsoidal(x, y, lp); + } double rh, cosz, sinz; rh = ProjectionMath.distance(x, y); diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GoodeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GoodeProjection.java index afe5646..8023f1c 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/GoodeProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/GoodeProjection.java @@ -23,6 +23,8 @@ public class GoodeProjection extends Projection { + private static final long serialVersionUID = 8774084216839891518L; + private final static double Y_COR = 0.05280; private final static double PHI_LIM = .71093078197902358062; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/GuyouProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/GuyouProjection.java new file mode 100644 index 0000000..17b5b21 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/GuyouProjection.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.EllipticIntegral; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Guyou hemisphere-in-a-square. The {@code GUYOU} branch of + * {@code 9.8.1:src/projections/adams.cpp:112-133}. + * + *

Maps one hemisphere — the {@code 180} degrees of longitude centred on the central + * meridian — conformally onto a square. Longitudes outside that hemisphere are + * rejected, not wrapped: {@code guyou.gie} spends 333 of its 705 assertions proving + * that, which is 47% of the file and the single largest block of {@code expect failure} rows + * attributable to projection logic anywhere in the corpus. + * + *

The pole case returns a truncated constant, on purpose

+ * + *

{@code adams.cpp:124-127} short-circuits {@code | |phi| - pi/2 | < 1e-9} to + * {@code (0, +/-1.85407)} — {@link EllipticIntegral#GUYOU_POLE}, five decimal places. Every + * other point in this family goes through the seven-term Chebyshev series, whose value at + * {@code pi/2} is {@code 1.854074716833181}; the truncated literal is 4.7e-06 below that, + * i.e. 30.05 m at {@code +R=6370997}. {@code guyou.gie:2122-2131} asserts + * {@code (0, +/-1.85407)} at {@code +R=1} with a 1 mm tolerance, so "improving" the constant + * fails those two assertions by 30 m of unit-sphere-scaled error and gains nothing. + * + *

Note also that the pole test comes second, after the longitude rejection: a + * pole given with {@code |lam| > pi/2} is a domain failure, not a pole. + * + *

No inverse — {@code pj_adams_setup} installs one only for {@code adams_ws2} + * ({@code adams.cpp:399-400}). + */ +public class GuyouProjection extends AdamsProjection { + + private static final long serialVersionUID = -7326365330345576836L; + + @Override + protected ProjCoordinate projectRaw(double lam, double phi, ProjCoordinate dst) { + if ((Math.abs(lam) - TOL) > HALF_PI) { + throw new ProjectionException( + "guyou: |lam| exceeds pi/2; the projection covers one hemisphere only"); + } + + if (Math.abs(Math.abs(phi) - HALF_PI) < TOL) { + dst.x = 0; + dst.y = phi < 0 ? -EllipticIntegral.GUYOU_POLE : EllipticIntegral.GUYOU_POLE; + return dst; + } + + final double sl = FastStrictTrig.sin(lam); + final double sp = FastStrictTrig.sin(phi); + final double cp = FastStrictTrig.cos(phi); + final double a = aacos((cp * sl - sp) * RSQRT2); + final double b = aacos((cp * sl + sp) * RSQRT2); + return ellipticTail(a, b, lam < 0., phi < 0., dst); + } + + @Override + public boolean hasInverse() { + return false; + } + + @Override + public String toString() { + return "Guyou"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/HammerProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/HammerProjection.java index 061fecc..f652c60 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/HammerProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/HammerProjection.java @@ -21,40 +21,126 @@ import java.util.Objects; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; +/** + * Hammer and Eckert-Greifendorff ({@code +proj=hammer}), ported from + * {@code 9.8.1:src/projections/hammer.cpp}. + * + *

There was no inverse

+ * + *

{@code hammer_s_inverse} is closed form — no iteration — and it was simply absent, so + * {@code hasInverse()} was false and four corpus rows could not be answered at all. Note the + * {@code |2z^2 - 1| < 1e-10} guard: that is the boundary of the map, where the inverse is + * singular, and upstream reports it as outside the projection domain. + * + *

{@code +W} and {@code +M} were parameters in name only

+ * + *

{@code initialize()} read the fields and then unconditionally overwrote them: + * + *

+ *   if ((w = Math.abs(w)) <= 0.) throw ...; else w = .5;      // always .5
+ *   if ((m = Math.abs(m)) <= 0.) throw ...; else m = 1.;       // always 1
+ *   rm = 1./m; m /= w;
+ * 
+ * + *

so {@link #setW}/{@link #setM} had no effect, and {@code m /= w} wrote a derived value + * back into the field it had just read — which {@code initialize()} running twice then divided by + * {@code w} a second time. Upstream keeps {@code W} and {@code M} as given, defaults them to + * {@code .5} and {@code 1}, and rejects a non-positive value with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. The parameters and the derived quantities are now + * separate fields, so a second {@code initialize()} sees the same inputs. + * + *

Neither {@code +W} nor {@code +M} is a {@code Proj4Keyword} yet, so the corpus's + * {@code +proj=hammer +a=6400000 +W=1} block is still reported as not implemented rather than run at + * the default. The setters make registering them a parser-only change. + */ public class HammerProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = 5527306458585454077L; + + private static final double EPS = 1.0e-10; + + /** {@code +W}, exactly as supplied. Upstream's default is {@code .5}. */ private double w = 0.5; - private double m = 1; - private double rm; + + /** {@code +M}, exactly as supplied. Upstream's default is {@code 1}. */ + private double mParam = 1; + + /** {@code Q->m = M/W} and {@code Q->rm = 1/M}, both derived in {@link #initialize()}. */ + private double m, rm; public HammerProjection() { } + /** {@code hammer_s_forward}. */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { double cosphi, d; - d = Math.sqrt(2./(1. + (cosphi = Math.cos(lpphi)) * Math.cos(lplam *= w))); - xy.x = m * d * cosphi * Math.sin(lplam); - xy.y = rm * d * Math.sin(lpphi); + cosphi = FastStrictTrig.cos(lpphi); + final double lam = lplam * w; + final double denom = 1. + cosphi * FastStrictTrig.cos(lam); + if (denom == 0.0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "forward of (" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + + ") deg is the antipode of the projection centre"); + } + d = Math.sqrt(2. / denom); + xy.x = m * d * cosphi * FastStrictTrig.sin(lam); + xy.y = rm * d * FastStrictTrig.sin(lpphi); return xy; } + /** + * {@code hammer_s_inverse}, closed form. + * + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} on the map boundary, + * where {@code |2z^2 - 1|} is within {@code 1e-10} of zero + */ + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + double z = Math.sqrt(1. - 0.25 * w * w * x * x - 0.25 * y * y); + if (Math.abs(2. * z * z - 1.) < EPS) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "inverse of (" + x + ", " + y + ") is on the map's boundary, where " + + "2z^2 - 1 = " + (2. * z * z - 1.) + " is within " + EPS + " of zero"); + } + // aatan2: upstream returns 0 rather than atan2(0, 0) when both arguments are below 1e-50. + final double num = w * x * z; + final double den = 2. * z * z - 1; + lp.x = (Math.abs(num) < ATOL && Math.abs(den) < ATOL ? 0. : Math.atan2(num, den)) / w; + lp.y = ProjectionMath.asinChecked(z * y); + return lp; + } + + /** {@code aasincos.cpp}'s {@code ATOL}, used by {@code aatan2}. */ + private static final double ATOL = 1e-50; + + /** + * {@code PJ_PROJECTION(hammer)}. + * + * @throws InvalidValueException where upstream returns + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}: a non-positive {@code +W} or {@code +M} + */ public void initialize() { - super.initialize(); - if ((w = Math.abs(w)) <= 0.) - throw new ProjectionException("-27"); - else - w = .5; - if ((m = Math.abs(m)) <= 0.) - throw new ProjectionException("-27"); - else - m = 1.; - rm = 1. / m; - m /= w; es = 0.; + e = 0.; + super.initialize(); + w = Math.abs(w); + if (w <= 0.) { + throw new InvalidValueException("Invalid value for +W: it should be > 0, but is " + w); + } + mParam = Math.abs(mParam); + if (mParam <= 0.) { + throw new InvalidValueException( + "Invalid value for +M: it should be > 0, but is " + mParam); + } + rm = 1. / mParam; + m = mParam / w; } /** @@ -65,6 +151,8 @@ public boolean isEqualArea() { } // Properties + + /** {@code +W}: the longitudinal compression. {@code .5} is Hammer, {@code 1} is Lambert azimuthal. */ public void setW( double w ) { this.w = w; } @@ -73,12 +161,21 @@ public double getW() { return w; } + /** + * {@code +M}: the aspect factor. Note that {@code getM()} now answers the parameter as supplied, + * not the derived {@code M/W} — it used to answer the latter, because {@code initialize()} + * overwrote the field. + */ public void setM( double m ) { - this.m = m; + this.mParam = m; } public double getM() { - return m; + return mParam; + } + + public boolean hasInverse() { + return true; } public String toString() { @@ -93,7 +190,7 @@ public boolean equals(Object that) { if (that instanceof HammerProjection) { HammerProjection p = (HammerProjection) that; return ( - m == p.m && + mParam == p.mParam && w == p.w && super.equals(that)); } @@ -102,6 +199,6 @@ public boolean equals(Object that) { @Override public int hashCode() { - return Objects.hash(m, w, super.hashCode()); + return Objects.hash(mParam, w, super.hashCode()); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/HatanoProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/HatanoProjection.java index 8eb862c..e1bad57 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/HatanoProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/HatanoProjection.java @@ -19,12 +19,15 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class HatanoProjection extends Projection { + private static final long serialVersionUID = -5033035035848492760L; + private final static int NITER = 20; private final static double EPS = 1e-7; private final static double ONETOL = 1.000001; @@ -39,15 +42,29 @@ public class HatanoProjection extends Projection { private final static double FXC = 0.85; private final static double RXC = 1.17647058823529411764; + /** + * Forward projection. + *

+ * Fail-closed. PROJ's {@code hatano.cpp} has no convergence test after its + * {@code NITER} Newton steps: an exhausted iteration is returned as an ordinary coordinate. + * Proj4J throws. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - double th1, c; + double th1 = Double.NaN, c; int i; + final double phi = lpphi; c = Math.sin(lpphi) * (lpphi < 0. ? CS : CN); for (i = NITER; i > 0; --i) { lpphi -= th1 = (lpphi + Math.sin(lpphi) - c) / (1. + Math.cos(lpphi)); if (Math.abs(th1) < EPS) break; } + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + EPS + + " within " + NITER + " iterations for latitude " + phi + + " rad (last correction " + th1 + ")"); + } out.x = FXC * lplam * Math.cos(lpphi *= .5); out.y = Math.sin(lpphi) * (lpphi < 0. ? FYCS : FYCN); return out; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/InternationalMapOfTheWorldPolyconicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/InternationalMapOfTheWorldPolyconicProjection.java new file mode 100644 index 0000000..5b6f1a1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/InternationalMapOfTheWorldPolyconicProjection.java @@ -0,0 +1,342 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.MeridianArc; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * International Map of the World Polyconic, {@code +proj=imw_p} — a port of + * {@code 9.8.1:src/projections/imw_p.cpp}. Ellipsoidal only; the inverse is iterative. + * + *

The modified polyconic adopted for the 1:1,000,000 IMW series. Each sheet's two bounding + * parallels, {@code +lat_1} and {@code +lat_2}, are true-length circular arcs and the sheet is + * closed by straight meridians through the arc ends; the forward solves the circle-line + * intersection that puts an interior point on the right arc. + * + *

Setup rejections

+ * + *

{@code phi12} ({@code imw_p.cpp:31-57}) reports four errors, but only two shapes reach the + * arithmetic: {@code |lat_2 - lat_1| / 2 < 1e-10} and {@code |lat_2 + lat_1| / 2 < 1e-10}. Its + * other two are {@code +lat_1} and {@code +lat_2} absence tests, and this class does not + * need them: {@link Projection#projectionLatitude1} and {@link Projection#projectionLatitude2} + * both default to 0, so an absent pair gives {@code del == sig == 0} and trips the first check + * anyway. The corpus's second block spells {@code +lat_1=0} explicitly, which is legal and + * selects {@code PHI_1_IS_ZERO}, so absence and zero must not be conflated in the mode + * selection — and upstream decides the mode on the value, never on presence. + * + *

{@code +lon_1} is a presence test, and its default is latitude-dependent

+ * + *

Absent {@code +lon_1}, upstream picks 2°, 4° or 8° according to whether + * {@code |(lat_1 + lat_2)/2|} is at most 60°, at most 76°, or more — the IMW + * sheet widths. Because 0 is a legal {@code +lon_1}, presence cannot be recovered from the value, + * so {@link #lon1} is {@code NaN} until {@link #setLon1(double)} is called. As with + * {@link TwoPointEquidistantProjection}, {@code Proj4Parser} currently routes {@code +lon_1} to + * {@link ObliqueMercatorProjection} alone, so the latitude-dependent default is what every + * definition gets today — which is also what both corpus blocks exercise. + * + *

{@code loc_for}'s {@code yc} out-parameter is loop-carried

+ * + *

{@code loc_for(lp, P, &yc)} writes {@code *yc} in two of its three branches and leaves it + * untouched when {@code lp.phi == 0}. The forward passes an uninitialised {@code yc} and + * never reads it; the inverse initialises it to 0 and carries it across iterations, so a trial + * latitude of exactly zero reuses the previous iteration's value. That is reproduced by + * {@link #locFor} taking the incoming {@code yc} and returning the outgoing one, rather than by + * an instance field — a field would also make the class thread-hostile. + * + *

The inverse's iteration and its two failures

+ * + *

A secant step on latitude and a proportional step on longitude, up to + * {@code N_MAX_ITER = 1000} ("arbitrarily chosen number", says the comment), tolerance + * {@code 1e-10} on both projected ordinates. Two domain errors: a zero secant denominator, and + * exhaustion. The exhaustion test is {@code i == N_MAX_ITER} after the loop, so a point + * that converges on exactly the thousandth trip is still refused; that is upstream's behaviour + * and is reproduced. + * + * @see 9.8.1 + * imw_p.cpp + */ +public class InternationalMapOfTheWorldPolyconicProjection extends Projection { + + private static final long serialVersionUID = 7580529782044000460L; + + private static final double TOL = 1e-10; + private static final double EPS = 1e-10; + private static final int N_MAX_ITER = 1000; + + /** {@code phi_1} and {@code phi_2} both non-zero. */ + private static final int NONE_IS_ZERO = 0; + /** {@code phi_1 == 0}. */ + private static final int PHI_1_IS_ZERO = 1; + /** {@code phi_2 == 0}. */ + private static final int PHI_2_IS_ZERO = -1; + + private double pp; + private double qp; + private double pCoef; + private double qCoef; + private double r1; + private double r2; + private double sphi1; + private double sphi2; + private double c2; + /** {@code Q->phi_1}, after the swap that makes it the more southerly. */ + private double phi1; + /** {@code Q->phi_2}, after the swap. */ + private double phi2; + private double lam1; + private int mode; + private MeridianArc meridian; + + /** {@code +lon_1} in radians, or {@code NaN} for "not given". */ + private double lon1 = Double.NaN; + + /** + * {@code +lon_1}, the half-width of the sheet in longitude. Absent, upstream substitutes + * 2°, 4° or 8° from the mean parallel. + * + * @param lon1 the longitude, in radians + */ + public void setLon1(double lon1) { + this.lon1 = lon1; + } + + /** + * The {@code +lon_1} in force. + * + * @return the longitude in radians, or {@code NaN} if none was given + */ + public double getLon1() { + return lon1; + } + + /** + * Port of {@code PJ_PROJECTION(imw_p)} ({@code imw_p.cpp:175-240}) and {@code phi12}. + * + * @throws InvalidValueException if {@code |lat_1 - lat_2|} or {@code |lat_1 + lat_2|} is + * zero to within {@code 1e-10}, which includes both being absent + */ + @Override + public void initialize() { + super.initialize(); + meridian = MeridianArc.fromEs(es); + + phi1 = projectionLatitude1; + phi2 = projectionLatitude2; + double del = 0.5 * (phi2 - phi1); + double sig = 0.5 * (phi2 + phi1); + if (Math.abs(del) < EPS || Math.abs(sig) < EPS) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=imw_p requires |lat_1 - lat_2| > 0 and |lat_1 + lat_2| > 0; got " + + "lat_1 = " + phi1 + " rad, lat_2 = " + phi2 + " rad " + + "(imw_p.cpp:46-55). Both default to 0, so a definition that omits " + + "them is this same error."); + } + if (phi2 < phi1) { /* make sure phi_1 is the most southerly */ + del = phi1; + phi1 = phi2; + phi2 = del; + } + if (!Double.isNaN(lon1)) { + lam1 = lon1; + } else { + // imw_p.cpp:197-206. RAD_TO_DEG is a multiply upstream, and the result is one of + // three exact small integers, so neither direction can lose a bit here. + sig = Math.abs(sig * ProjectionMath.RTD); + if (sig <= 60) { + sig = 2.; + } else if (sig <= 76) { + sig = 4.; + } else { + sig = 8.; + } + lam1 = sig * ProjectionMath.DTR; + } + + // Reset the four values `xy()` conditionally fills, so that a re-initialise with a + // different lat_1/lat_2 cannot read the previous run's. + sphi1 = 0.; + sphi2 = 0.; + r1 = 0.; + r2 = 0.; + + mode = NONE_IS_ZERO; + final double x1; + final double y1; + if (phi1 != 0.0) { + sphi1 = FastStrictTrig.sin(phi1); + r1 = 1. / (FastStrictTrig.tan(phi1) * Math.sqrt(1. - es * sphi1 * sphi1)); + final double f = lam1 * sphi1; + y1 = r1 * (1 - FastStrictTrig.cos(f)); + x1 = r1 * FastStrictTrig.sin(f); + } else { + mode = PHI_1_IS_ZERO; + y1 = 0.; + x1 = lam1; + } + final double x2; + final double t2; + if (phi2 != 0.0) { + sphi2 = FastStrictTrig.sin(phi2); + r2 = 1. / (FastStrictTrig.tan(phi2) * Math.sqrt(1. - es * sphi2 * sphi2)); + final double f = lam1 * sphi2; + t2 = r2 * (1 - FastStrictTrig.cos(f)); + x2 = r2 * FastStrictTrig.sin(f); + } else { + mode = PHI_2_IS_ZERO; + t2 = 0.; + x2 = lam1; + } + final double m1 = meridian.mlfn(phi1, sphi1, FastStrictTrig.cos(phi1)); + final double m2 = meridian.mlfn(phi2, sphi2, FastStrictTrig.cos(phi2)); + double t = m2 - m1; + final double s = x2 - x1; + final double y2 = Math.sqrt(t * t - s * s) + y1; + c2 = y2 - t2; + t = 1. / t; + pCoef = (m2 * y1 - m1 * y2) * t; + qCoef = (y2 - y1) * t; + pp = (m2 * x1 - m1 * x2) * t; + qp = (x2 - x1) * t; + } + + /** + * {@code loc_for}, {@code imw_p.cpp:59-104}: the shared kernel of the forward and of every + * inverse iteration. + * + * @param lam longitude relative to {@code +lon_0}, radians + * @param phi latitude, radians + * @param xy filled with the projected point + * @param ycIn the caller's current {@code yc} + * @return the outgoing {@code yc}, which is {@code ycIn} unchanged when {@code phi == 0} + */ + private double locFor(double lam, double phi, ProjCoordinate xy, double ycIn) { + if (phi == 0.0) { + xy.x = lam; + xy.y = 0.; + return ycIn; + } + double yc = ycIn; + final double sp = FastStrictTrig.sin(phi); + final double m = meridian.mlfn(phi, sp, FastStrictTrig.cos(phi)); + final double xa = pp + qp * m; + final double ya = pCoef + qCoef * m; + final double r = 1. / (FastStrictTrig.tan(phi) * Math.sqrt(1. - es * sp * sp)); + double cc = Math.sqrt(r * r - xa * xa); + if (phi < 0.) { + cc = -cc; + } + cc += ya - r; + final double xb; + final double yb; + if (mode == PHI_2_IS_ZERO) { + xb = lam; + yb = c2; + } else { + final double t = lam * sphi2; + xb = r2 * FastStrictTrig.sin(t); + yb = c2 + r2 * (1. - FastStrictTrig.cos(t)); + } + final double xc; + if (mode == PHI_1_IS_ZERO) { + xc = lam; + yc = 0.; + } else { + final double t = lam * sphi1; + xc = r1 * FastStrictTrig.sin(t); + yc = r1 * (1. - FastStrictTrig.cos(t)); + } + final double d = (xb - xc) / (yb - yc); + final double b = xc + d * (cc + r - yc); + double x = d * Math.sqrt(r * r * (1 + d * d) - b * b); + if (phi > 0) { + x = -x; + } + x = (b + x) / (1. + d * d); + double y = Math.sqrt(r * r - x * x); + if (phi > 0) { + y = -y; + } + xy.x = x; + xy.y = y + cc + r; + return yc; + } + + /** {@code imw_p_e_forward}, {@code imw_p.cpp:106-110}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + locFor(lam, phi, xy, 0.0); + return xy; + } + + /** + * {@code imw_p_e_inverse}, {@code imw_p.cpp:112-145}. + * + * @throws ProjectionException if the secant denominator vanishes or the iteration does not + * converge in 1000 trips; upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} for both + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + double phi = phi2; + double lam = x / FastStrictTrig.cos(phi); + final ProjCoordinate t = new ProjCoordinate(); + double yc = 0.0; + int i = 0; + do { + yc = locFor(lam, phi, t, yc); + final double denom = t.y - yc; + if (denom != 0 || Math.abs(t.y - y) > TOL) { + if (denom == 0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "imw_p inverse: the secant denominator (t.y - yc) is zero at " + + "trial latitude " + phi + " rad, so the iteration cannot " + + "step (imw_p.cpp:126-130)"); + } + phi = ((phi - phi1) * (y - yc) / denom) + phi1; + } + if (t.x != 0 && Math.abs(t.x - x) > TOL) { + lam = lam * x / t.x; + } + i++; + } while (i < N_MAX_ITER && (Math.abs(t.x - x) > TOL || Math.abs(t.y - y) > TOL)); + + if (i == N_MAX_ITER) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "imw_p inverse did not converge on (" + x + ", " + y + ") in " + N_MAX_ITER + + " iterations (imw_p.cpp:141-144)"); + } + lp.x = lam; + lp.y = phi; + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "International Map of the World Polyconic"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/InterruptedGoodeHomolosineOceanicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedGoodeHomolosineOceanicProjection.java new file mode 100644 index 0000000..60d01d2 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedGoodeHomolosineOceanicProjection.java @@ -0,0 +1,199 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Interrupted Goode Homolosine, oceanic view, {@code +proj=igh_o} — a port of + * {@code 9.8.1:src/projections/igh_o.cpp}. + * + *

The same twelve-lobe machine as {@link InterruptedGoodeHomolosineProjection}, with the + * interruptions moved so that the oceans stay unbroken instead of the continents: + * + *

+ *     -180       -90               60           180
+ *       +---------+----------------+-------------+    Zones 1,2,3,10,11 & 12:
+ *       |1        |2               |3            |      Mollweide
+ *       +---------+----------------+-------------+    Zones 4,5,6,7,8 & 9:
+ *       |4        |5               |6            |      Sinusoidal
+ *     0 +---------+--+-------------+--+----------+
+ *       |7           |8               |9         |
+ *       +------------+----------------+----------+
+ *       |10          |11              |12        |
+ *       +------------+----------------+----------+
+ *     -180          -60               90        180
+ * 
+ * + *

The lobe numbering is not a permutation of {@code igh}'s. {@code igh} splits each + * latitude band in two above the equator and in four below; {@code igh_o} splits every band in + * three. So the two files' {@code switch (z)} bodies are unrelated and are not shareable, which is + * why upstream duplicated the file and why this class does too — the base class holds the machinery + * and each subclass holds only its own geometry. + * + *

Three lobes carry extension lobes here rather than two: 1 accepts {@code [160°, 180°]} above + * 50°N, 3 accepts {@code [-180°, -160°]} above 50°N, and 11 accepts {@code [90°, 100°]} + * below 40°S ({@code igh_o.cpp:165-206}). + * + *

One cosmetic note, in case a future diff against upstream looks alarming: {@code igh_o.cpp} + * declares {@code d130} after {@code d160} in its constant block, and its inverse's + * first two lobe branches omit their braces. Neither affects behaviour. + * + * @since 1.5.0 + */ +public class InterruptedGoodeHomolosineOceanicProjection extends InterruptedProjection { + + private static final long serialVersionUID = -5362289811929065978L; + + private double dy0; + + @Override + protected void setupZones() { + allocateZones(12); + /* sinusoidal zones */ + setupZone(4, sinusoidal(), -D140, 0, -D140); + setupZone(5, sinusoidal(), -D10, 0, -D10); + setupZone(6, sinusoidal(), D130, 0, D130); + setupZone(7, sinusoidal(), -D110, 0, -D110); + setupZone(8, sinusoidal(), D20, 0, D20); + setupZone(9, sinusoidal(), D150, 0, D150); + + /* mollweide zones */ + setupZone(1, mollweide(), -D140, 0, -D140); + + /* y0 ? -- igh_o.cpp:298-303. Measured between lobe 1 (moll) and lobe 4 (sinu). */ + ProjCoordinate xy1 = zoneForward(1, 0, IGH_PHI_BOUNDARY, new ProjCoordinate()); + ProjCoordinate xy4 = zoneForward(4, 0, IGH_PHI_BOUNDARY, new ProjCoordinate()); + dy0 = xy4.y - xy1.y; + setZoneY0(1, dy0); + + /* mollweide zones (cont'd) */ + setupZone(2, mollweide(), -D10, dy0, -D10); + setupZone(3, mollweide(), D130, dy0, D130); + setupZone(10, mollweide(), -D110, -dy0, -D110); + setupZone(11, mollweide(), D20, -dy0, D20); + setupZone(12, mollweide(), D150, -dy0, D150); + } + + @Override + protected double y90() { + return dy0 + Math.sqrt(2.0); + } + + @Override + protected int forwardZone(double lam, double phi) { + if (phi >= IGH_PHI_BOUNDARY) { + if (lam <= -D90) { + return 1; + } + return lam >= D60 ? 3 : 2; + } + if (phi >= 0) { + if (lam <= -D90) { + return 4; + } + return lam >= D60 ? 6 : 5; + } + if (phi >= -IGH_PHI_BOUNDARY) { + if (lam <= -D60) { + return 7; + } + return lam >= D90 ? 9 : 8; + } + if (lam <= -D60) { + return 10; + } + return lam >= D90 ? 12 : 11; + } + + @Override + protected int inverseZone(double x, double y) { + final double y90 = y90(); + if (y > y90 + EPSLN || y < -y90 + EPSLN) { + return 0; + } + if (y >= IGH_PHI_BOUNDARY) { + if (x <= -D90) { + return 1; + } + return x >= D60 ? 3 : 2; + } + if (y >= 0) { + if (x <= -D90) { + return 4; + } + return x >= D60 ? 6 : 5; + } + if (y >= -IGH_PHI_BOUNDARY) { + if (x <= -D60) { + return 7; + } + return x >= D90 ? 9 : 8; + } + if (x <= -D60) { + return 10; + } + return x >= D90 ? 12 : 11; + } + + /** {@code igh_o.cpp:165-208}. Zones 1, 3 and 11 carry the extension lobes. */ + @Override + protected boolean projectable(int zone, double lam, double phi) { + switch (zone) { + case 1: + return (lam >= -D180 - EPSLN && lam <= -D90 + EPSLN) + || ((lam >= D160 - EPSLN && lam <= D180 + EPSLN) + && (phi >= D50 - EPSLN && phi <= D90 + EPSLN)); + case 2: + return lam >= -D90 - EPSLN && lam <= D60 + EPSLN; + case 3: + return (lam >= D60 - EPSLN && lam <= D180 + EPSLN) + || ((lam >= -D180 - EPSLN && lam <= -D160 + EPSLN) + && (phi >= D50 - EPSLN && phi <= D90 + EPSLN)); + case 4: + return lam >= -D180 - EPSLN && lam <= -D90 + EPSLN; + case 5: + return lam >= -D90 - EPSLN && lam <= D60 + EPSLN; + case 6: + return lam >= D60 - EPSLN && lam <= D180 + EPSLN; + case 7: + case 10: + return lam >= -D180 - EPSLN && lam <= -D60 + EPSLN; + case 8: + return lam >= -D60 - EPSLN && lam <= D90 + EPSLN; + case 9: + case 12: + return lam >= D90 - EPSLN && lam <= D180 + EPSLN; + case 11: + return (lam >= -D60 - EPSLN && lam <= D90 + EPSLN) + || ((lam >= D90 - EPSLN && lam <= D100 + EPSLN) + && (phi >= -D90 - EPSLN && phi <= -D40 + EPSLN)); + default: + return false; + } + } + + @Override + public boolean isEqualArea() { + return true; + } + + @Override + public String toString() { + return "Interrupted Goode Homolosine Oceanic View"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/InterruptedGoodeHomolosineProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedGoodeHomolosineProjection.java new file mode 100644 index 0000000..6afd9ac --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedGoodeHomolosineProjection.java @@ -0,0 +1,214 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Interrupted Goode Homolosine, {@code +proj=igh} — a port of + * {@code 9.8.1:src/projections/igh.cpp}. + * + *

Twelve lobes. Sinusoidal near the equator, Mollweide above 40°44'11.8" + * ({@link InterruptedProjection#IGH_PHI_BOUNDARY}), with the interruptions placed to keep the + * continents unbroken: + * + *

+ *     -180            -40                       180
+ *       +--------------+-------------------------+    Zones 1,2,9,10,11 & 12:
+ *       |1             |2                        |      Mollweide
+ *       +--------------+-------------------------+    Zones 3,4,5,6,7 & 8:
+ *       |3             |4                        |      Sinusoidal
+ *     0 +-------+------+-+-----------+-----------+
+ *       |5      |6       |7          |8          |
+ *       +-------+--------+-----------+-----------+
+ *       |9      |10      |11         |12         |
+ *       +-------+--------+-----------+-----------+
+ *     -180    -100      -20         80          180
+ * 
+ * + *

{@code dy0} is measured, not tabulated

+ * + *

The Mollweide and sinusoidal halves have to meet at the transition latitude, and the offset + * that makes them meet is computed at setup time by running both children + * ({@code igh.cpp:270-275}): forward {@code (0, 40°44'11.8")} through lobe 1 (Mollweide) and lobe 3 + * (sinusoidal) and take the difference of the northings. Hard-coding a decimal for it would be a + * re-derived constant of exactly the kind that has cost this project four defects. + * + *

The order of setup therefore matters. Lobes 3-8 and lobe 1 are built first, then + * {@code dy0} is measured, then lobe 1's {@code y0} is assigned and lobes 2, 9, 10, 11 and 12 are + * built with {@code ±dy0}. + * + *

Zones 1 and 2 have extension lobes

+ * + *

Their {@code projectable} tests are not simple longitude ranges: zone 1 also accepts + * {@code [-40°, -10°]} above 60°N and zone 2 also accepts {@code [-180°, -160°]} above 50°N + * and {@code [-50°, -40°]} above 60°N. Those are the deliberate overlaps that keep Greenland + * and eastern Siberia whole. Dropping any of them turns real land into an interruption gap. + * + * @since 1.5.0 + */ +public class InterruptedGoodeHomolosineProjection extends InterruptedProjection { + + private static final long serialVersionUID = 7757517234335770966L; + + private double dy0; + + @Override + protected void setupZones() { + allocateZones(12); + /* sinusoidal zones */ + setupZone(3, sinusoidal(), -D100, 0, -D100); + setupZone(4, sinusoidal(), D30, 0, D30); + setupZone(5, sinusoidal(), -D160, 0, -D160); + setupZone(6, sinusoidal(), -D60, 0, -D60); + setupZone(7, sinusoidal(), D20, 0, D20); + setupZone(8, sinusoidal(), D140, 0, D140); + + /* mollweide zones */ + setupZone(1, mollweide(), -D100, 0, -D100); + + /* y0 ? -- igh.cpp:270-275. y0 + xy1.y = xy3.y at lat = 40d44'11.8". */ + ProjCoordinate xy1 = zoneForward(1, 0, IGH_PHI_BOUNDARY, new ProjCoordinate()); + ProjCoordinate xy3 = zoneForward(3, 0, IGH_PHI_BOUNDARY, new ProjCoordinate()); + dy0 = xy3.y - xy1.y; + setZoneY0(1, dy0); + + /* mollweide zones (cont'd) */ + setupZone(2, mollweide(), D30, dy0, D30); + setupZone(9, mollweide(), -D160, -dy0, -D160); + setupZone(10, mollweide(), -D60, -dy0, -D60); + setupZone(11, mollweide(), D20, -dy0, D20); + setupZone(12, mollweide(), D140, -dy0, D140); + } + + /** {@code lt=90} corresponds to {@code y = y0 + sqrt(2)} ({@code igh.cpp:101-102}). */ + @Override + protected double y90() { + return dy0 + Math.sqrt(2.0); + } + + @Override + protected int forwardZone(double lam, double phi) { + if (phi >= IGH_PHI_BOUNDARY) { /* 1|2 */ + return lam <= -D40 ? 1 : 2; + } + if (phi >= 0) { /* 3|4 */ + return lam <= -D40 ? 3 : 4; + } + if (phi >= -IGH_PHI_BOUNDARY) { /* 5|6|7|8 */ + if (lam <= -D100) { + return 5; + } + if (lam <= -D20) { + return 6; + } + return lam <= D80 ? 7 : 8; + } + /* 9|10|11|12 */ + if (lam <= -D100) { + return 9; + } + if (lam <= -D20) { + return 10; + } + return lam <= D80 ? 11 : 12; + } + + /** + * {@code igh_s_inverse}'s lobe selection ({@code igh.cpp:100-130}). + * + *

Note it compares the plane {@code y} against a latitude and the plane {@code x} against + * longitudes; see {@link InterruptedProjection}'s class comment. And note the asymmetric + * out-of-map band, {@code xy.y < -y90 + EPSLN} rather than {@code < -(y90 + EPSLN)}. + */ + @Override + protected int inverseZone(double x, double y) { + final double y90 = y90(); + if (y > y90 + EPSLN || y < -y90 + EPSLN) { + return 0; + } + if (y >= IGH_PHI_BOUNDARY) { /* 1|2 */ + return x <= -D40 ? 1 : 2; + } + if (y >= 0) { /* 3|4 */ + return x <= -D40 ? 3 : 4; + } + if (y >= -IGH_PHI_BOUNDARY) { /* 5|6|7|8 */ + if (x <= -D100) { + return 5; + } + if (x <= -D20) { + return 6; + } + return x <= D80 ? 7 : 8; + } + /* 9|10|11|12 */ + if (x <= -D100) { + return 9; + } + if (x <= -D20) { + return 10; + } + return x <= D80 ? 11 : 12; + } + + /** {@code igh.cpp:141-176}. Zones 1 and 2 carry the extension lobes. */ + @Override + protected boolean projectable(int zone, double lam, double phi) { + switch (zone) { + case 1: + return (lam >= -D180 - EPSLN && lam <= -D40 + EPSLN) + || ((lam >= -D40 - EPSLN && lam <= -D10 + EPSLN) + && (phi >= D60 - EPSLN && phi <= D90 + EPSLN)); + case 2: + return (lam >= -D40 - EPSLN && lam <= D180 + EPSLN) + || ((lam >= -D180 - EPSLN && lam <= -D160 + EPSLN) + && (phi >= D50 - EPSLN && phi <= D90 + EPSLN)) + || ((lam >= -D50 - EPSLN && lam <= -D40 + EPSLN) + && (phi >= D60 - EPSLN && phi <= D90 + EPSLN)); + case 3: + return lam >= -D180 - EPSLN && lam <= -D40 + EPSLN; + case 4: + return lam >= -D40 - EPSLN && lam <= D180 + EPSLN; + case 5: + case 9: + return lam >= -D180 - EPSLN && lam <= -D100 + EPSLN; + case 6: + case 10: + return lam >= -D100 - EPSLN && lam <= -D20 + EPSLN; + case 7: + case 11: + return lam >= -D20 - EPSLN && lam <= D80 + EPSLN; + case 8: + case 12: + return lam >= D80 - EPSLN && lam <= D180 + EPSLN; + default: + return false; + } + } + + @Override + public boolean isEqualArea() { + // Both children are equal-area and the dispatch is a rigid translation of each lobe. + return true; + } + + @Override + public String toString() { + return "Interrupted Goode Homolosine"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/InterruptedMollweideOceanicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedMollweideOceanicProjection.java new file mode 100644 index 0000000..fa78c39 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedMollweideOceanicProjection.java @@ -0,0 +1,176 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Interrupted Mollweide, oceanic view, {@code +proj=imoll_o} — a port of + * {@code 9.8.1:src/projections/imoll_o.cpp}. + * + *

Six lobes, three per hemisphere, placed to keep the oceans unbroken: + * + *

+ *     -180       -90               60           180
+ *       +---------+----------------+-------------+
+ *       |1        |2               |3            |
+ *     0 +---------+--+-------------+--+----------+
+ *       |4           |5               |6         |
+ *       +------------+----------------+----------+
+ *     -180          -60               90        180
+ * 
+ * + *

Two differences from {@link InterruptedMollweideProjection} beyond the geometry, both easy to + * transcribe wrongly: + * + *

    + *
  • The seam abscissae are a different set. {@code imoll} measures + * {@code boundary12/34/45/56}; {@code imoll_o} measures {@code boundary12/23/45/56} — the + * northern hemisphere has two seams here rather than one, and the {@code 34} seam does not + * exist because 3 and 4 are in different hemispheres.
  • + *
  • The lobe selection uses {@code >=} on the upper boundaries, not {@code <=} on the + * lower. {@code if (x <= boundary12) 1; else if (x >= boundary23) 3; else 2;} — a + * three-way split written as two tests against opposite ends, so the middle lobe is the + * fall-through. Rewriting it as a monotone cascade changes which lobe claims a point sitting + * exactly on a seam.
  • + *
+ * + *

And the five {@code x_0} corrections chain differently: 2 to 1, then 3 to 2, then 4 to + * 1, 5 to 2 and 6 to 3 — so lobe 6 depends on lobe 3, which depends on lobe 2. Reordering + * them silently shifts a lobe by the width of an ocean. + * + * @since 1.5.0 + */ +public class InterruptedMollweideOceanicProjection extends InterruptedProjection { + + private static final long serialVersionUID = -7814818453353921143L; + + private double boundary12; + private double boundary23; + private double boundary45; + private double boundary56; + + @Override + protected void setupZones() { + allocateZones(6); + setupZone(1, mollweide(), -D140, 0, -D140); + setupZone(2, mollweide(), -D10, 0, -D10); + setupZone(3, mollweide(), D130, 0, D130); + setupZone(4, mollweide(), -D110, 0, -D110); + setupZone(5, mollweide(), D20, 0, D20); + setupZone(6, mollweide(), D150, 0, D150); + + /* Adjust zones -- imoll_o.cpp:274-293, in this order. */ + /* Match 2 (center) to 1 (west) */ + addZoneX0(2, zoneOffset(2, 1, -D90, 0.0 + EPSLN, 0.0 + EPSLN)); + /* Match 3 (east) to 2 (center) -- after 2 has been corrected. */ + addZoneX0(3, zoneOffset(3, 2, D60, 0.0 + EPSLN, 0.0 + EPSLN)); + /* Match 4 (south) to 1 (north). NOTE the meridian is -180, not -110. */ + addZoneX0(4, zoneOffset(4, 1, -D180, 0.0 - EPSLN, 0.0 + EPSLN)); + /* Match 5 (south) to 2 (north) */ + addZoneX0(5, zoneOffset(5, 2, -D60, 0.0 - EPSLN, 0.0 + EPSLN)); + /* Match 6 (south) to 3 (north) -- to 3, not to 2. */ + addZoneX0(6, zoneOffset(6, 3, D90, 0.0 - EPSLN, 0.0 + EPSLN)); + + /* imoll_o.cpp:300-303 -- boundary23 where imoll has boundary34. */ + boundary12 = zoneXBoundary(-D90, 0.0 + EPSLN); + boundary23 = zoneXBoundary(D60, 0.0 + EPSLN); + boundary45 = zoneXBoundary(-D60, 0.0 - EPSLN); + boundary56 = zoneXBoundary(D90, 0.0 - EPSLN); + } + + private double zoneOffset(int zone1, int zone2, double lam, double phi1, double phi2) { + ProjCoordinate xy1 = zoneForward(zone1, lam, phi1, new ProjCoordinate()); + ProjCoordinate xy2 = zoneForward(zone2, lam, phi2, new ProjCoordinate()); + return xy2.x - xy1.x; + } + + private double zoneXBoundary(double lam, double phi) { + ProjCoordinate xy1 = dispatchForward(lam - EPSLN, phi, new ProjCoordinate()); + ProjCoordinate xy2 = dispatchForward(lam + EPSLN, phi, new ProjCoordinate()); + return (xy1.x + xy2.x) / 2.; + } + + @Override + protected double y90() { + return Math.sqrt(2.0); + } + + @Override + protected int forwardZone(double lam, double phi) { + if (phi >= 0) { /* 1|2|3 */ + if (lam <= -D90) { + return 1; + } + return lam >= D60 ? 3 : 2; + } + /* 4|5|6 */ + if (lam <= -D60) { + return 4; + } + return lam >= D90 ? 6 : 5; + } + + @Override + protected int inverseZone(double x, double y) { + final double y90 = y90(); + if (y > y90 + EPSLN || y < -y90 + EPSLN) { + return 0; + } + if (y >= 0) { + if (x <= boundary12) { + return 1; + } + return x >= boundary23 ? 3 : 2; + } + if (x <= boundary45) { + return 4; + } + return x >= boundary56 ? 6 : 5; + } + + /** {@code imoll_o.cpp:129-157}. As {@code imoll}, every lobe tests the hemisphere too. */ + @Override + protected boolean projectable(int zone, double lam, double phi) { + switch (zone) { + case 1: + return lam >= -D180 - EPSLN && lam <= -D90 + EPSLN && phi >= 0.0 - EPSLN; + case 2: + return lam >= -D90 - EPSLN && lam <= D60 + EPSLN && phi >= 0.0 - EPSLN; + case 3: + return lam >= D60 - EPSLN && lam <= D180 + EPSLN && phi >= 0.0 - EPSLN; + case 4: + return lam >= -D180 - EPSLN && lam <= -D60 + EPSLN && phi <= 0.0 + EPSLN; + case 5: + return lam >= -D60 - EPSLN && lam <= D90 + EPSLN && phi <= 0.0 + EPSLN; + case 6: + return lam >= D90 - EPSLN && lam <= D180 + EPSLN && phi <= 0.0 + EPSLN; + default: + return false; + } + } + + @Override + public boolean isEqualArea() { + return true; + } + + @Override + public String toString() { + return "Interrupted Mollweide Oceanic View"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/InterruptedMollweideProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedMollweideProjection.java new file mode 100644 index 0000000..ffad353 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedMollweideProjection.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Interrupted Mollweide, {@code +proj=imoll} — a port of + * {@code 9.8.1:src/projections/imoll.cpp}. + * + *

Six lobes, Mollweide everywhere: + * + *

+ *     -180            -40                       180
+ *       +--------------+-------------------------+
+ *       |1             |2                        |
+ *     0 +-------+------+-+-----------+-----------+
+ *       |3      |4       |5          |6          |
+ *       +-------+--------+-----------+-----------+
+ *     -180    -100      -20         80          180
+ * 
+ * + *

{@code imoll} is the better-engineered member of the family

+ * + *

Where {@code igh}'s inverse compares plane coordinates against radian angles, {@code imoll} + * measures everything at setup time by running its own forward: + * + *

    + *
  • Five {@code x_0} corrections ({@code compute_zone_offset}, + * {@code imoll.cpp:211-224}): each lobe's easting is nudged so that its edge coincides with its + * neighbour's at the seam, evaluated at {@code phi = ±EPSLN} on either side of the equator. + * The order is load-bearing — 3 to 1, then 2 to 1, then 4 to 1, then 5 to 2, then 6 to 2 — + * because 5 and 6 are matched to lobe 2 after lobe 2 has itself been corrected.
  • + *
  • Four seam abscissae ({@code compute_zone_x_boundary}, {@code imoll.cpp:226-237}): the + * forward is evaluated at {@code lam ± EPSLN} either side of each seam and the two eastings + * averaged. Those are the values the inverse's lobe selection compares against — real plane + * coordinates, not angles.
  • + *
+ * + *

All nine numbers are therefore derived, never tabulated. Writing any of them out as a decimal + * would be re-deriving a constant, which is the failure mode that has cost this project four + * separate defects. + * + *

{@code compute_zone_x_boundary} calls the whole forward, not one lobe, so it depends on + * {@link #forwardZone} already being correct and on the five {@code x_0} corrections already having + * been applied. Hence the two phases in {@link #setupZones()} and their order. + * + * @since 1.5.0 + */ +public class InterruptedMollweideProjection extends InterruptedProjection { + + private static final long serialVersionUID = 3526944502198214489L; + + private double boundary12; + private double boundary34; + private double boundary45; + private double boundary56; + + @Override + protected void setupZones() { + allocateZones(6); + setupZone(1, mollweide(), -D100, 0, -D100); + setupZone(2, mollweide(), D30, 0, D30); + setupZone(3, mollweide(), -D160, 0, -D160); + setupZone(4, mollweide(), -D60, 0, -D60); + setupZone(5, mollweide(), D20, 0, D20); + setupZone(6, mollweide(), D140, 0, D140); + + /* Adjust zones -- imoll.cpp:258-277, in this order. */ + /* Match 3 (south) to 1 (north) */ + addZoneX0(3, zoneOffset(3, 1, -D160, 0.0 - EPSLN, 0.0 + EPSLN)); + /* Match 2 (north-east) to 1 (north-west) */ + addZoneX0(2, zoneOffset(2, 1, -D40, 0.0 + EPSLN, 0.0 + EPSLN)); + /* Match 4 (south) to 1 (north) */ + addZoneX0(4, zoneOffset(4, 1, -D100, 0.0 - EPSLN, 0.0 + EPSLN)); + /* Match 5 (south) to 2 (north) */ + addZoneX0(5, zoneOffset(5, 2, -D20, 0.0 - EPSLN, 0.0 + EPSLN)); + /* Match 6 (south) to 2 (north) */ + addZoneX0(6, zoneOffset(6, 2, D80, 0.0 - EPSLN, 0.0 + EPSLN)); + + /* imoll.cpp:284-287 -- the seams, measured through the whole forward. */ + boundary12 = zoneXBoundary(-D40, 0.0 + EPSLN); + boundary34 = zoneXBoundary(-D100, 0.0 - EPSLN); + boundary45 = zoneXBoundary(-D20, 0.0 - EPSLN); + boundary56 = zoneXBoundary(D80, 0.0 - EPSLN); + } + + /** + * {@code compute_zone_offset}: how far lobe {@code zone2}'s easting is from lobe + * {@code zone1}'s at the shared meridian {@code lam}, each evaluated at its own side of the + * seam. + */ + private double zoneOffset(int zone1, int zone2, double lam, double phi1, double phi2) { + ProjCoordinate xy1 = zoneForward(zone1, lam, phi1, new ProjCoordinate()); + ProjCoordinate xy2 = zoneForward(zone2, lam, phi2, new ProjCoordinate()); + return xy2.x - xy1.x; + } + + /** + * {@code compute_zone_x_boundary}: the easting of a seam, as the mean of the whole forward + * evaluated a hair either side of it. + */ + private double zoneXBoundary(double lam, double phi) { + ProjCoordinate xy1 = dispatchForward(lam - EPSLN, phi, new ProjCoordinate()); + ProjCoordinate xy2 = dispatchForward(lam + EPSLN, phi, new ProjCoordinate()); + return (xy1.x + xy2.x) / 2.; + } + + /** {@code lt=90} corresponds to {@code y = sqrt(2)}; unlike {@code igh} there is no + * {@code dy0} to add, because every lobe is Mollweide. */ + @Override + protected double y90() { + return Math.sqrt(2.0); + } + + @Override + protected int forwardZone(double lam, double phi) { + if (phi >= 0) { /* 1|2 */ + return lam <= -D40 ? 1 : 2; + } + /* 3|4|5|6 */ + if (lam <= -D100) { + return 3; + } + if (lam <= -D20) { + return 4; + } + return lam <= D80 ? 5 : 6; + } + + @Override + protected int inverseZone(double x, double y) { + final double y90 = y90(); + // The asymmetric band is upstream's; see InterruptedProjection's class comment. + if (y > y90 + EPSLN || y < -y90 + EPSLN) { + return 0; + } + if (y >= 0) { /* 1|2 */ + return x <= boundary12 ? 1 : 2; + } + if (x <= boundary34) { + return 3; + } + if (x <= boundary45) { + return 4; + } + return x <= boundary56 ? 5 : 6; + } + + /** + * {@code imoll.cpp:118-146}. Every lobe tests both a longitude range and the sign of the + * latitude, which {@code igh}'s does not — {@code imoll} has only one latitude band per + * hemisphere, so the hemisphere itself is part of the lobe's identity. + */ + @Override + protected boolean projectable(int zone, double lam, double phi) { + switch (zone) { + case 1: + return lam >= -D180 - EPSLN && lam <= -D40 + EPSLN && phi >= 0.0 - EPSLN; + case 2: + return lam >= -D40 - EPSLN && lam <= D180 + EPSLN && phi >= 0.0 - EPSLN; + case 3: + return lam >= -D180 - EPSLN && lam <= -D100 + EPSLN && phi <= 0.0 + EPSLN; + case 4: + return lam >= -D100 - EPSLN && lam <= -D20 + EPSLN && phi <= 0.0 + EPSLN; + case 5: + return lam >= -D20 - EPSLN && lam <= D80 + EPSLN && phi <= 0.0 + EPSLN; + case 6: + return lam >= D80 - EPSLN && lam <= D180 + EPSLN && phi <= 0.0 + EPSLN; + default: + return false; + } + } + + @Override + public boolean isEqualArea() { + return true; + } + + @Override + public String toString() { + return "Interrupted Mollweide"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/InterruptedProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedProjection.java new file mode 100644 index 0000000..c7dee11 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/InterruptedProjection.java @@ -0,0 +1,277 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; + +/** + * The shared machinery of the four interrupted pseudo-cylindricals — + * {@code 9.8.1:src/projections/igh.cpp}, {@code igh_o.cpp}, {@code imoll.cpp} and + * {@code imoll_o.cpp}. + * + *

All four are lobe dispatchers. Each holds an array of child projections — Mollweide, + * and for the {@code igh} pair also sinusoidal — each pinned to its own central meridian and false + * origin. The forward picks a lobe from the input {@code (lam, phi)}, shifts to that lobe's central + * meridian, calls the child's raw forward, and adds the lobe's offset. The inverse does the + * reverse and then re-validates: it checks that the longitude it recovered actually belongs + * to the lobe it came out of, and rejects the point if not. + * + *

That re-validation is the whole point, and it must reject rather than snap

+ * + *

An interrupted projection has gaps — regions of the plane that are not the image of any point + * on the sphere. The plane coordinate still lands inside some lobe's bounding box, so the naive + * inverse produces a perfectly plausible longitude in the wrong lobe. Upstream answers + * {@code HUGE_VAL}, which {@code inv_finalize} turns into + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN}; this class throws + * {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}. Snapping the point into the nearest lobe would be a + * silent wrong answer of up to a full lobe width — thousands of kilometres. + * + *

Two upstream quirks reproduced verbatim

+ * + *
    + *
  • The inverse's lobe selection compares projected coordinates against angles. + * {@code igh.cpp:104-107} tests {@code xy.y >= igh_phi_boundary} and {@code xy.x <= -d40}, + * where the left-hand sides are unit-sphere plane coordinates and the right-hand sides are + * radian latitudes and longitudes. That happens to work because the plane coordinates are in + * units of the semi-major axis and are numerically the same order, but it is not a coordinate + * comparison in any meaningful sense. It is what generated the corpus, so it is what is + * written here. ({@code imoll} is the tidier design: it computes its {@code boundary*} values + * by actually running its own forward at the seams.)
  • + *
  • The out-of-map test is asymmetric. {@code if (xy.y > y90 + EPSLN || xy.y < -y90 + + * EPSLN)} — the second term is {@code (-y90) + EPSLN}, not {@code -(y90 + EPSLN)}, so the + * band is {@code 1e-10} wider at the top than at the bottom and southern points inside + * {@code [-y90, -y90 + 1e-10)} are rejected. Almost certainly an upstream typo; it is + * reproduced, not corrected.
  • + *
+ * + *

The children are called raw, and need no hook

+ * + *

{@code Q->pj[z]->fwd(lp, Q->pj[z])} is the child's raw kernel, so its {@code lam0}, + * {@code a} and {@code x_0} are never applied — the dispatcher applies its own. {@code project} and + * {@code projectInverse} are {@code protected}, hence package-visible, so + * {@link MolleweideProjection} and {@link SinusoidalProjection} can be driven directly, exactly as + * {@link SpilhausProjection} and {@link ObliqueTransformationProjection} do with their children. + * + * @since 1.5.0 + */ +abstract class InterruptedProjection extends Projection { + + private static final long serialVersionUID = -7383231914775336093L; + + /** {@code EPSLN}: "allow a little 'slack' on zone edge positions". All four files, {@code 1e-10}. */ + protected static final double EPSLN = 1.e-10; + + protected static final double D10 = 10 * DTR; + protected static final double D20 = 20 * DTR; + protected static final double D30 = 30 * DTR; + protected static final double D40 = 40 * DTR; + protected static final double D50 = 50 * DTR; + protected static final double D60 = 60 * DTR; + protected static final double D80 = 80 * DTR; + protected static final double D90 = 90 * DTR; + protected static final double D100 = 100 * DTR; + protected static final double D110 = 110 * DTR; + protected static final double D130 = 130 * DTR; + protected static final double D140 = 140 * DTR; + protected static final double D150 = 150 * DTR; + protected static final double D160 = 160 * DTR; + protected static final double D180 = 180 * DTR; + + /** + * The Sinusoidal-to-Mollweide transition latitude of the {@code igh} pair, + * 40°44'11.8" ({@code igh.cpp:32}). + *

+ * Written as upstream writes it — {@code (40 + 44/60. + 11.8/3600.) * DEG_TO_RAD} — rather than + * as a decimal, so the value is whatever that expression evaluates to and not a rounding of it. + */ + protected static final double IGH_PHI_BOUNDARY = + (40 + 44 / 60. + 11.8 / 3600.) * DTR; + + private Projection[] zoneProjection; + private double[] zoneX0; + private double[] zoneY0; + private double[] zoneLam0; + + /** Scratch for the child's result. */ + private final ProjCoordinate child = new ProjCoordinate(); + + // ------------------------------------------------------------------------------------------ + // Contract for the four dispatchers + // ------------------------------------------------------------------------------------------ + + /** Allocates and configures every zone. Called from {@link #initialize()}. */ + protected abstract void setupZones(); + + /** + * The lobe a geographic point belongs to, 1-based. Never 0: every point on the sphere is in + * some lobe. + */ + protected abstract int forwardZone(double lam, double phi); + + /** + * The lobe a plane point provisionally belongs to, 1-based, or 0 for "off the map", + * which is the out-of-{@code y90} band. + */ + protected abstract int inverseZone(double x, double y); + + /** + * Whether the longitude and latitude recovered from lobe {@code zone} really belong to it — the + * {@code switch (z)} of each file's inverse. {@code false} means the plane point was in an + * interruption gap. + */ + protected abstract boolean projectable(int zone, double lam, double phi); + + // ------------------------------------------------------------------------------------------ + // Zone bookkeeping + // ------------------------------------------------------------------------------------------ + + protected final void allocateZones(int count) { + zoneProjection = new Projection[count]; + zoneX0 = new double[count]; + zoneY0 = new double[count]; + zoneLam0 = new double[count]; + } + + /** + * {@code setup_zone}: install a child for lobe {@code zone} (1-based) with its own false origin + * and central meridian. + */ + protected final void setupZone(int zone, Projection projection, double x0, double y0, + double lam0) { + projection.initialize(); + zoneProjection[zone - 1] = projection; + zoneX0[zone - 1] = x0; + zoneY0[zone - 1] = y0; + zoneLam0[zone - 1] = lam0; + } + + protected final double zoneX0(int zone) { + return zoneX0[zone - 1]; + } + + protected final double zoneY0(int zone) { + return zoneY0[zone - 1]; + } + + protected final double zoneLam0(int zone) { + return zoneLam0[zone - 1]; + } + + protected final void addZoneX0(int zone, double delta) { + zoneX0[zone - 1] += delta; + } + + protected final void setZoneY0(int zone, double y0) { + zoneY0[zone - 1] = y0; + } + + /** A fresh {@code moll} child: {@code pj_moll} is {@code moll_setup(P, M_HALFPI)}. */ + protected static Projection mollweide() { + return new MolleweideProjection(); + } + + /** A fresh {@code sinu} child. */ + protected static Projection sinusoidal() { + return new SinusoidalProjection(); + } + + /** + * One lobe's raw forward including its false origin, in unit-sphere units — the body of each + * file's forward once the lobe is known, and also the primitive {@code imoll}'s + * {@code compute_zone_offset}/{@code compute_zone_x_boundary} are built from. + */ + protected final ProjCoordinate zoneForward(int zone, double lam, double phi, + ProjCoordinate xy) { + zoneProjection[zone - 1].project(lam - zoneLam0[zone - 1], phi, xy); + xy.x += zoneX0[zone - 1]; + xy.y += zoneY0[zone - 1]; + return xy; + } + + /** + * The full forward including lobe selection, in unit-sphere units. {@code imoll}'s + * {@code compute_zone_x_boundary} calls the whole forward, not one lobe, so this is separate + * from {@link #zoneForward}. + */ + protected final ProjCoordinate dispatchForward(double lam, double phi, ProjCoordinate xy) { + return zoneForward(forwardZone(lam, phi), lam, phi, xy); + } + + /** + * The upper edge of the map in unit-sphere units: {@code lat = 90} maps to + * {@code y = sqrt(2)} for Mollweide, offset by the lobe's own {@code y0} for the + * {@code igh} pair. + */ + protected abstract double y90(); + + // ------------------------------------------------------------------------------------------ + // Projection + // ------------------------------------------------------------------------------------------ + + /** All four force {@code P->es = 0.}: these are spherical projections only. */ + @Override + public void initialize() { + es = 0.; + e = 0.; + super.initialize(); + setupZones(); + } + + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + return dispatchForward(lam, phi, xy); + } + + /** + * The shared inverse: select a lobe, undo its offsets, invert the child, restore its central + * meridian, then re-validate. + * + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} where upstream + * returns {@code HUGE_VAL} — off the top or bottom of the map, or inside an + * interruption gap + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + final int zone = inverseZone(x, y); + if (zone == 0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + x + ", " + y + ") is above or below the map of " + toString() + + ": |y| exceeds " + y90() + " in units of the semi-major axis"); + } + zoneProjection[zone - 1].projectInverse(x - zoneX0[zone - 1], y - zoneY0[zone - 1], + child); + final double lam = child.x + zoneLam0[zone - 1]; + final double phi = child.y; + if (!projectable(zone, lam, phi)) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + x + ", " + y + ") lies in an interruption gap of " + toString() + + ": lobe " + zone + " inverts it to (" + (lam * RTD) + ", " + + (phi * RTD) + ") deg, which is outside that lobe. Snapping it to " + + "the nearest lobe would be wrong by up to a lobe width."); + } + lp.x = lam; + lp.y = phi; + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/KavraiskyVProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/KavraiskyVProjection.java index d8246e4..8b58f02 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/KavraiskyVProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/KavraiskyVProjection.java @@ -21,6 +21,8 @@ public class KavraiskyVProjection extends SineTangentSeriesProjection { + private static final long serialVersionUID = 5726640106530761339L; + public KavraiskyVProjection() { super( 1.50488, 1.35439, false ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Kavrayskiy7Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Kavrayskiy7Projection.java new file mode 100644 index 0000000..6065232 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Kavrayskiy7Projection.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Kavrayskiy VII ({@code +proj=kav7}), the second {@code PROJ_HEAD} of + * {@code 9.8.1:src/projections/eck3.cpp}. + * + *

{@code A = 0}, so the bounding meridian is a full semi-ellipse, and {@code C_y = 1} + * makes the parallel spacing equal to the latitude itself. Widely used for Soviet-era world + * maps; it is Wagner VI horizontally compressed by {@code sqrt(3)/2}. + * + *

{@code C_x} is the truncated {@code 0.8660254037844}, not {@code sqrt(3)/2}. + * That is upstream's live constant at {@code eck3.cpp:75} and is retained deliberately — + * see {@link Eckert3FamilyProjection} for why. + * + *

Distinct from proj4j's existing {@link KavraiskyVProjection} ({@code kav5}), which is + * a member of the {@code sts.cpp} sine/tangent family and unrelated. + * + * @see Eckert3FamilyProjection + */ +public class Kavrayskiy7Projection extends Eckert3FamilyProjection { + + private static final long serialVersionUID = -6898043903574542869L; + + public Kavrayskiy7Projection() { + super(0.8660254037844, 1.0, 0.0, 0.30396355092701331433); + } + + public String toString() { + return "Kavrayskiy VII"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/KrovakProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/KrovakProjection.java index 802c20b..e8b2cbb 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/KrovakProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/KrovakProjection.java @@ -17,68 +17,227 @@ import static java.lang.Math.*; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; /** - * The Krovak projection. + * Krovak ({@code +proj=krovak}), ported from {@code 9.8.1:src/projections/krovak.cpp}. * - * While Krovak defines parameters for the azimuth and the latitude of the - * pseudo-standard parallel, these are hardcoded in this implementation. + *

Krovak's azimuth and pseudo-standard-parallel latitude are hard-coded upstream too and cannot + * be given from outside; that part of the old comment was correct. Four other things were not. + * + *

{@code +ellps} was ignored — but only half of it

+ * + *

Upstream forces Bessel 1841 outright: {@code P->a = 6377397.155; P->es = 0.006674372230614;}. + * The old code carried the same {@code es} literal but set {@code a = 1} with a comment + * claiming the ellipsoid is applied by the caller. It is not: {@code Projection.initialize()} + * computes {@code totalScale = a * fromMetres} from whatever {@code +ellps} supplied, so + * {@code +proj=krovak +ellps=GRS80} projected onto a GRS80 semi-major axis while using + * Bessel's eccentricity. Both literals are now assigned, before {@code super.initialize()} so that + * {@code totalScale}, {@code spherical}, {@code one_es} and {@code rone_es} all derive from them. + * + *

Three parameter defaults that only PROJ had

+ * + *

{@code krovak_setup} supplies {@code lat_0 = 0.863937979737193} (49°30′N), + * {@code lon_0 = 0.7417649320975901 - 0.308341501185665} (42°30′E of Ferro less + * 17°40′, i.e. 24°50′E of Greenwich) and {@code k_0 = 0.9999}, each only when + * the key is absent. {@code Proj4Parser} assigns those three only when the key is present, + * so this class's field initialisers were the effective defaults — and they were 0, 0 and 1. The + * corpus measures it directly: {@code +proj=krovak +ellps=GRS80} at + * {@code (24.833333333333, 59.757598563058)} must give {@code (0, 0)}, and gave + * {@code (1370527.32, -301670.39)} — 1403 km. + * + *

Distinguishing "absent" from "explicitly 0" needs a flag per key, because 0 is a legal value + * for all three; hence the three {@code *Explicit} booleans and the setter overrides. Nothing + * derived is written into a field that is read again, so the second {@code initialize()} the parser + * makes sees the same inputs as the first — non-negotiable 4. + * + *

Two guards

+ * + *
    + *
  • {@code lat_0} such that {@code tan(lat_0/2 + pi/4) == 0} — that is + * {@code lat_0 = -90} — is rejected by upstream at setup with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. Without it {@code k} was + * {@code something/0 = Infinity} and the forward returned a plausible finite northing. + * {@code builtins.gie} asserts the rejection.
  • + *
  • {@code cos(s) < 1e-12} in the forward returns {@code (0, 0)} before the + * {@code asin(cos(u)*sin(deltav)/cos(s))} that would otherwise divide by ~0.
  • + *
+ * + *

The inverse's fixed-point loop keeps its cap. It was written {@code do { … } while (ok == 0);} + * with no cap at all, which for an input that never reaches the fixed point is a hung thread + * rather than a catchable error. The budget is now upstream's own {@code MAX_ITER = 100} rather + * than the 30 borrowed from {@code moll.cpp}, so the set of inputs that resolve is upstream's set. * * @see Guidance Note 7 */ public class KrovakProjection extends Projection { - // TODO: should be set on parsing https://github.com/OSGeo/PROJ/blob/e3d7e18f988230973ced5163fa2581b6671c8755/src/projections/krovak.cpp#L219 - boolean czech = false; + private static final long serialVersionUID = 6345336388507557850L; + + /** {@code krovak.cpp}: Bessel 1841's semi-major axis, forced regardless of {@code +ellps}. */ + private static final double BESSEL_A = 6377397.155; + + /** {@code krovak.cpp}: Bessel 1841's squared eccentricity, as the literal upstream carries. */ + private static final double BESSEL_ES = 0.006674372230614; + + /** {@code krovak_setup}: 49°30′N, used when {@code +lat_0} is absent. */ + private static final double DEFAULT_LAT_0 = 0.863937979737193; + + /** + * {@code krovak_setup}: 42°30′E of Ferro less 17°40′, written as the same + * subtraction upstream writes so the rounding is identical. + */ + private static final double DEFAULT_LON_0 = 0.7417649320975901 - 0.308341501185665; + + /** {@code krovak_setup}: the scale on the pseudo-standard parallel when {@code +k} is absent. */ + private static final double DEFAULT_K_0 = 0.9999; + + /** {@code UQ}: {@code DU(2, 59, 42, 42.69689)}. */ + private static final double UQ = 1.04216856380474; + + /** {@code S0}: the latitude of the pseudo standard parallel, 78°30′00"N. */ + private static final double S0 = 1.37008346281555; + + /** Whether the {@code +czech} westing/southing axis convention was asked for. */ + private boolean czech = false; + + /** Whether a caller supplied {@code +lat_0} / {@code +lon_0} / {@code +k}, as opposed to 0/0/1. */ + private boolean lat0Explicit, lon0Explicit, kExplicit; + private double s45, alfa, k, ro0, ad, s0, n; + /** + * Iteration cap for the inverse latitude fixed-point loop. + *

+ * The loop was written as {@code do { … } while (ok == 0);} with no cap at all. Its + * exit test is an absolute difference below 1e-15 radians — about 6 nanometres on the + * ground — which is at or below the representable spacing of the iterate for latitudes of + * any magnitude, so an input that does not happen to reach a fixed point makes it spin + * forever. That is not an error a caller can catch: it is a hung thread, and in a Spark + * executor a task that never returns and a stage that never completes. A NaN input reaches + * it directly, since every comparison against NaN is false. + *

+ * 100 is {@code krovak.cpp}'s own {@code MAX_ITER}, so the inputs that resolve here are exactly + * the inputs that resolve upstream. (It was 30, borrowed from {@code moll.cpp}, before + * {@code krovak.cpp} was read directly.) The loop settles in a handful of trips for any real + * coordinate. + */ + private static final int MAX_ITER = 100; + + /** {@code krovak.cpp}'s {@code EPS}, in radians. Roughly 6 nm on the ground. */ + private static final double ITERATION_TOLERANCE = 1e-15; + public KrovakProjection() { - minLatitude = Math.toRadians(-60); - maxLatitude = Math.toRadians(60); - minLongitude = Math.toRadians(-90); - maxLongitude = Math.toRadians(90); + minLatitude = ProjectionMath.toRad(-60); + maxLatitude = ProjectionMath.toRad(60); + minLongitude = ProjectionMath.toRad(-90); + maxLongitude = ProjectionMath.toRad(90); initialize(); } + /** + * {@code krovak_setup} ({@code krovak.cpp:280-341}). + * + * @throws InvalidValueException where upstream returns + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}: a {@code +lat_0} for which + * {@code tan(lat_0/2 + pi/4)} is 0 + */ @Override public void initialize() { + // Bessel 1841 is forced, and BEFORE super.initialize(), which derives totalScale from `a` + // and spherical/one_es/rone_es from `es`. See the class javadoc. + a = BESSEL_A; + es = BESSEL_ES; + e = sqrt(es); + + // pj_param defaults, applied only where the key was absent. + if (!lat0Explicit) { + projectionLatitude = DEFAULT_LAT_0; + } + if (!lon0Explicit) { + projectionLongitude = DEFAULT_LON_0; + } + if (!kExplicit) { + scaleFactor = DEFAULT_K_0; + } + super.initialize(); - double s90, fi0, e2, uq, u0, g, k1, n0; + double s90, fi0, e2, u0, g, k1, n0; - s45 = 0.785398163397448; /* 45deg */ - s90 = 2 * s45; + // M_PI_4, not the truncated 0.785398163397448 this file used to carry: upstream writes + // M_PI_4 and the four-digit truncation moves tan(phi/2 + pi/4) by ~6e-16 relative. Well + // inside the corpus bar, but rule 2 of this project is that a constant matches upstream + // digit-for-digit, because five separate defects have been rounded literals. + s45 = ProjectionMath.QUARTERPI; /* 45deg */ + s90 = 2 * s45; /* M_PI_2; the doubling is exact */ fi0 = projectionLatitude; /* Latitude of projection centre 49deg 30' */ - - /* Ellipsoid is used as Parameter in for.c and inv.c, therefore a must - be set to 1 here. - Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.1528128, - e2=0.006674372230614; - */ - a = 1; /* 6377397.155; */ - /* e2 = P->es; */ /* 0.006674372230614; */ - e2 = 0.006674372230614; - e = sqrt(e2); + e2 = es; alfa = sqrt(1. + (e2 * pow(cos(fi0), 4)) / (1. - e2)); - uq = 1.04216856380474; /* DU(2, 59, 42, 42.69689) */ u0 = asin(sin(fi0) / alfa); g = pow( (1. + e * sin(fi0)) / (1. - e * sin(fi0)) , alfa * e / 2. ); - k = tan( u0 / 2. + s45) / pow (tan(fi0 / 2. + s45) , alfa) * g; + double tanHalfFi0PlusS45 = tan(fi0 / 2. + s45); + if (tanHalfFi0PlusS45 == 0.0) { + throw new InvalidValueException( + "Invalid value for +lat_0: lat_0 + PI/4 should be different from 0, but lat_0 = " + + Math.toDegrees(fi0) + " degrees makes tan(lat_0/2 + PI/4) exactly 0, " + + "so the Krovak cone constant is undefined"); + } + k = tan( u0 / 2. + s45) / pow (tanHalfFi0PlusS45 , alfa) * g; k1 = scaleFactor; - n0 = a * sqrt(1. - e2) / (1. - e2 * pow(sin(fi0), 2)); - s0 = 1.37008346281555; /* Latitude of pseudo standard parallel 78deg 30'00" N */ + // NOT a * sqrt(...): upstream's n0 is dimensionless and the semi-major axis is applied once, + // by fwd_finalize -- here by Projection's totalScale. With `a` correctly 6377397.155 rather + // than 1, keeping the factor would scale the answer by the semi-major axis twice. + n0 = sqrt(1. - e2) / (1. - e2 * pow(sin(fi0), 2)); + s0 = S0; /* Latitude of pseudo standard parallel 78deg 30'00" N */ n = sin(s0); ro0 = k1 * n0 / tan(s0); - ad = s90 - uq; + ad = s90 - UQ; + } + + /** {@code +czech}: report westing and southing rather than easting and northing. */ + public void setCzech(boolean czech) { + this.czech = czech; } + public boolean isCzech() { + return czech; + } + + @Override public void setProjectionLatitude(double projectionLatitude) { + super.setProjectionLatitude(projectionLatitude); + this.lat0Explicit = true; + } + + @Override public void setProjectionLatitudeDegrees(double projectionLatitude) { + super.setProjectionLatitudeDegrees(projectionLatitude); + this.lat0Explicit = true; + } + + @Override public void setProjectionLongitude(double projectionLongitude) { + super.setProjectionLongitude(projectionLongitude); + this.lon0Explicit = true; + } + + @Override public void setProjectionLongitudeDegrees(double projectionLongitude) { + super.setProjectionLongitudeDegrees(projectionLongitude); + this.lon0Explicit = true; + } + + @Override public void setScaleFactor(double scaleFactor) { + super.setScaleFactor(scaleFactor); + this.kExplicit = true; + } + + /** {@code krovak_e_forward} ({@code krovak.cpp:146-211}). */ @Override public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double gfi, u, deltav, s, d, eps, ro; @@ -91,18 +250,31 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { deltav = - lplam * alfa; - s = asin(cos(ad) * sin(u) + sin(ad) * cos(u) * cos(deltav)); - d = asin(cos(u) * sin(deltav) / cos(s)); + s = ProjectionMath.asinChecked(cos(ad) * sin(u) + sin(ad) * cos(u) * cos(deltav)); + final double cosS = cos(s); + if (cosS < 1e-12) { + // krovak.cpp:166-170: the antipode of the cone's apex. Upstream returns the origin + // rather than dividing by ~0, and its own comment marks it as such. + out.x = 0; + out.y = 0; + return out; + } + d = ProjectionMath.asinChecked(cos(u) * sin(deltav) / cosS); eps = n * d; ro = ro0 * pow(tan(s0 / 2. + s45) , n) / pow(tan(s / 2. + s45) , n) ; - /* x and y are reverted! */ - out.y = ro * cos(eps) / a; - out.x = ro * sin(eps) / a; + // Upstream produces a southing and a westing and then swaps them, so the westing becomes + // the first ordinate. That is the "x and y are reverted!" of the old comment. + out.x = ro * sin(eps); /* westing -> first */ + out.y = ro * cos(eps); /* southing -> second */ if(!czech) { - out.y *= -1.0; - out.x *= -1.0; + // krovak.cpp:203-208, AFTER the swap. The default (non-Czech) convention is + // easting/northing, so the signs flip - and the false easting/northing has to be taken + // out twice, because Projection adds it back once after this returns. With + // +x_0=+y_0=0, as in every corpus row, the two extra terms vanish. + out.x = -out.x - 2. * falseEasting / a; + out.y = -out.y - 2. * falseNorthing / a; } return out; @@ -117,22 +289,35 @@ protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) int ok; /* Transformation */ - /* revert y, x*/ - dst.x = y; - dst.y = x; - + // krovak.cpp:215-224: undo the easting/northing convention FIRST (note that x0 is taken off + // the second ordinate and y0 off the first, because the swap has not happened yet), then + // swap. The working values are locals: the old translation staged them in `dst` and then + // overwrote `dst.x`/`dst.y` with the answer, which is only safe because nothing read them + // back - but it is one line away from the in-place-reassignment defect that cost bipc and + // airy their rows, so keep the staging visible. + double wx = x; + double wy = y; if(!czech) { - dst.x *= -1.0; - dst.y *= -1.0; + double negY = -wy - 2. * falseEasting / a; + double negX = -wx - 2. * falseNorthing / a; + wy = negY; + wx = negX; } + /* revert y, x */ + double southing = wy; + double westing = wx; - ro = sqrt(dst.x * dst.x + dst.y * dst.y); - eps = atan2(dst.y, dst.x); + ro = sqrt(southing * southing + westing * westing); + eps = atan2(westing, southing); d = eps / sin(s0); - s = 2. * (atan( pow(ro0 / ro, 1. / n) * tan(s0 / 2. + s45)) - s45); + if (ro == 0.0) { + s = ProjectionMath.HALFPI; + } else { + s = 2. * (atan( pow(ro0 / ro, 1. / n) * tan(s0 / 2. + s45)) - s45); + } - u = asin(cos(ad) * sin(s) - sin(ad) * cos(s) * cos(d)); - deltav = asin(cos(s) * sin(d) / cos(u)); + u = ProjectionMath.asinChecked(cos(ad) * sin(s) - sin(ad) * cos(s) * cos(d)); + deltav = ProjectionMath.asinChecked(cos(s) * sin(d) / cos(u)); dst.x = projectionLongitude - deltav / alfa; @@ -140,6 +325,8 @@ protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) fi1 = u; ok = 0; + int iter = 0; + double delta; do { dst.y = 2. * ( atan( pow( k, -1. / alfa) * @@ -147,9 +334,16 @@ protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) pow( (1. + e * sin(fi1)) / (1. - e * sin(fi1)) , e / 2.) ) - s45); - if (abs(fi1 - dst.y) < 0.000000000000001) ok=1; + delta = abs(fi1 - dst.y); + if (delta < ITERATION_TOLERANCE) ok=1; fi1 = dst.y; + if (ok == 0 && ++iter >= MAX_ITER) { + throw new ConvergenceFailureException(this, + "inverse latitude iteration did not converge to " + ITERATION_TOLERANCE + + " within " + MAX_ITER + " iterations for (x=" + x + ", y=" + y + + "); last two iterates differ by " + delta); + } } while (ok==0); diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LabordeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LabordeProjection.java new file mode 100644 index 0000000..4c023f1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/LabordeProjection.java @@ -0,0 +1,234 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Laborde, {@code +proj=labrd} — a port of + * {@code 9.8.1:src/projections/labrd.cpp}. Ellipsoidal; the inverse iterates. + * + *

The oblique Mercator variant adopted for Madagascar: a conformal map onto a sphere through + * the isometric latitude, an odd-power series in longitude, and then a complex cubic + * post-rotation about the origin, which is what the {@code Ca}/{@code Cb} terms are. + * + *

The complex correction is a cubic forward and a quintic inverse

+ * + *

The forward applies {@code Ca*V1 + Cb*V2} with {@code V1 = 3xy^2 - x^3} and + * {@code V2 = y^3 - 3x^2 y} — i.e. the real and imaginary parts of a cubic. The inverse + * undoes it with the cubic and two quintic terms {@code Cc}, {@code Cd}, so the two are + * not exact mutual inverses; the residual is fifth order and below the corpus's 0.1 mm bar. + * Reproduced as written rather than symmetrised. + * + *

{@code +lat_0 == 0} is refused, and one corpus row asserts it

+ * + *

{@code builtins.gie:3422} is {@code +proj=labrd +ellps=GRS80 +lat_0=0} with + * {@code expect failure errno invalid_op_illegal_arg_value}. The test is an exact equality on + * {@code P->phi0} upstream and is kept as one. + * + *

{@code +azi} is read but not yet dispatched

+ * + *

{@code Az = pj_param(P->ctx, P->params, "razi").f} rotates the complex correction by + * {@code 2*Az}. {@code Proj4Parser} sends {@code +azi} to {@link SpilhausProjection} alone, so + * {@link #setAziRadians(double)} is unreachable from a proj-string and {@code Az} is 0 — + * which is what both corpus blocks use, so nothing is masked. Real Madagascar grids do set it. + * + *

Where {@code k_0} appears

+ * + *

Only inside {@code kRg = k0 * sqrt(N*R)} and, in the inverse, in {@code d = Re * k0 * kRg}. + * The kernels themselves never multiply by {@code k0} again, and neither does + * {@link Projection}'s affine tail, so the two agree. + * + * @see 9.8.1 + * labrd.cpp + */ +public class LabordeProjection extends Projection { + + private static final long serialVersionUID = 4187492139519402805L; + + private static final double EPS = 1.e-10; + private static final int MAX_ITER = 20; + + private double kRg; + private double p0s; + private double aCoef; + private double cCoef; + private double ca; + private double cb; + private double cc; + private double cd; + + /** {@code Az}, {@code +azi} in radians. Upstream's absent value is 0. */ + private double aziRadians = 0.0; + + /** + * {@code +azi}, the grid azimuth the complex correction is rotated by (as {@code 2*azi}). + * + * @param aziRadians the azimuth, in radians + */ + public void setAziRadians(double aziRadians) { + this.aziRadians = aziRadians; + } + + /** + * The {@code +azi} in force. + * + * @return the azimuth, in radians + */ + public double getAziRadians() { + return aziRadians; + } + + /** + * Port of {@code PJ_PROJECTION(labrd)} ({@code labrd.cpp:98-135}). + * + * @throws InvalidValueException if {@code +lat_0} is exactly 0 + */ + @Override + public void initialize() { + super.initialize(); + if (projectionLatitude == 0.) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=labrd requires +lat_0 != 0 (labrd.cpp:107-112); it is a projection for " + + "Madagascar and the oblique frame is undefined on the equator"); + } + final double sinp = FastStrictTrig.sin(projectionLatitude); + double t = 1. - es * sinp * sinp; + final double n = 1. / Math.sqrt(t); + final double r = one_es * n / t; + kRg = scaleFactor * Math.sqrt(n * r); + p0s = StrictMath.atan(Math.sqrt(r / n) * FastStrictTrig.tan(projectionLatitude)); + aCoef = sinp / FastStrictTrig.sin(p0s); + t = e * sinp; + cCoef = .5 * e * aCoef * Math.log((1. + t) / (1. - t)) + + -aCoef * Math.log(FastStrictTrig.tan( + ProjectionMath.FORTPI + .5 * projectionLatitude)) + + Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * p0s)); + final double twoAz = aziRadians + aziRadians; + cb = 1. / (12. * kRg * kRg); + ca = (1. - FastStrictTrig.cos(twoAz)) * cb; + cb *= FastStrictTrig.sin(twoAz); + cc = 3. * (ca * ca - cb * cb); + cd = 6. * ca * cb; + } + + /** {@code labrd_e_forward}, {@code labrd.cpp:16-48}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + double v1 = aCoef * Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * phi)); + double t = e * FastStrictTrig.sin(phi); + double v2 = .5 * e * aCoef * Math.log((1. + t) / (1. - t)); + final double ps = 2. * (StrictMath.atan(Math.exp(v1 - v2 + cCoef)) + - ProjectionMath.FORTPI); + final double i1 = ps - p0s; + final double cosps = FastStrictTrig.cos(ps); + final double cosps2 = cosps * cosps; + final double sinps = FastStrictTrig.sin(ps); + final double sinps2 = sinps * sinps; + final double i4 = aCoef * cosps; + final double i2 = .5 * aCoef * i4 * sinps; + final double i3 = i2 * aCoef * aCoef * (5. * cosps2 - sinps2) / 12.; + double i6 = i4 * aCoef * aCoef; + final double i5 = i6 * (cosps2 - sinps2) / 6.; + i6 *= aCoef * aCoef + * (5. * cosps2 * cosps2 + sinps2 * (sinps2 - 18. * cosps2)) / 120.; + t = lam * lam; + double x = kRg * lam * (i4 + t * (i5 + t * i6)); + double y = kRg * (i1 + t * (i2 + t * i3)); + final double x2 = x * x; + final double y2 = y * y; + v1 = 3. * x * y2 - x * x2; + v2 = y * y2 - 3. * x2 * y; + x += ca * v1 + cb * v2; + y += ca * v2 - cb * v1; + xy.x = x; + xy.y = y; + return xy; + } + + /** + * {@code labrd_e_inverse}, {@code labrd.cpp:50-96}. + * + *

The isometric-latitude loop is 20 trips at {@code 1e-10} with no error on + * exhaustion — upstream simply uses whatever {@code pe} it has reached. That is a + * deliberate reproduction, not an oversight: adding a rejection would fail rows upstream + * passes. + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + double x2 = x * x; + final double y2 = y * y; + double v1 = 3. * x * y2 - x * x2; + double v2 = y * y2 - 3. * x2 * y; + final double v3 = x * (5. * y2 * y2 + x2 * (-10. * y2 + x2)); + final double v4 = y * (5. * x2 * x2 + y2 * (-10. * x2 + y2)); + final double xc = x + (-ca * v1 - cb * v2 + cc * v3 + cd * v4); + final double yc = y + (cb * v1 - ca * v2 - cd * v3 + cc * v4); + final double ps = p0s + yc / kRg; + double pe = ps + projectionLatitude - p0s; + + double t = 0.0; + for (int i = MAX_ITER; i != 0; --i) { + v1 = aCoef * Math.log(FastStrictTrig.tan(ProjectionMath.FORTPI + .5 * pe)); + final double tpe = e * FastStrictTrig.sin(pe); + v2 = .5 * e * aCoef * Math.log((1. + tpe) / (1. - tpe)); + t = ps - 2. * (StrictMath.atan(Math.exp(v1 - v2 + cCoef)) - ProjectionMath.FORTPI); + pe += t; + if (Math.abs(t) < EPS) { + break; + } + } + + t = e * FastStrictTrig.sin(pe); + t = 1. - t * t; + final double re = one_es / (t * Math.sqrt(t)); + t = FastStrictTrig.tan(ps); + final double t2 = t * t; + final double s = kRg * kRg; + double d = re * scaleFactor * kRg; + final double i7 = t / (2. * d); + final double i8 = t * (5. + 3. * t2) / (24. * d * s); + d = FastStrictTrig.cos(ps) * kRg * aCoef; + final double i9 = 1. / d; + d *= s; + final double i10 = (1. + 2. * t2) / (6. * d); + final double i11 = (5. + t2 * (28. + 24. * t2)) / (120. * d * s); + x2 = xc * xc; + lp.y = pe + x2 * (-i7 + i8 * x2); + lp.x = xc * (i9 + x2 * (-i10 + x2 * i11)); + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public boolean isConformal() { + return true; + } + + @Override + public String toString() { + return "Laborde"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LagrangeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LagrangeProjection.java index f067871..8f62325 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LagrangeProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LagrangeProjection.java @@ -21,54 +21,144 @@ import java.util.Objects; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Lagrange ({@code +proj=lagrng}), ported from {@code 9.8.1:src/projections/lagrng.cpp}. + * + *

Three defects, and two of them were shared state rather than arithmetic

+ * + *
    + *
  1. {@code +W} defaulted to 1.4, where PROJ defaults it to 2 — and the field was + * reciprocated in place: {@code hrw = 0.5 * (rw = 1./rw)} writes the derived value back + * into the field it just read. {@code initialize()} runs twice (once from the parser, once from + * wherever the projection was constructed), so the second call reciprocated it again and the + * effective {@code W} flip-flopped between 1.4 and 0.714 depending on how many times + * {@code initialize()} had been called. Non-negotiable 4. {@code w} is now the parameter, kept + * as given, and {@code hw}/{@code rw}/{@code hrw} are three separate derived fields, exactly as + * upstream's {@code struct pj_lagrng} holds them.
  2. + *
  3. The forward's pole test was on the latitude, where upstream's is on its sine. Upstream + * tests {@code |‌|sin(phi)| - 1| < 1e-10}; the old code tested {@code |‌|phi| - pi/2| < + * 1e-10}. Those are not the same band: at 89.9999999° the latitude is 1.7e-9 rad from the + * pole (outside the band) but its sine is 1.5e-18 from 1 (well inside it). So upstream returns + * {@code (0, ±2)} and Proj4J divided by {@code 1 - sin(phi) = 1.5e-18} and returned + * {@code Infinity}. Two corpus rows measured it.
  4. + *
  5. There was no inverse. Upstream has a closed-form one.
  6. + *
+ * + *

Upstream's two setup rejections are {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}, so they are + * {@link InvalidValueException} here rather than the {@code ProjectionException("-27")} / + * {@code ("-22")} they were: a {@code ProjectionException} says "this coordinate", and these are + * both statements about the definition. + * + *

{@code +W} is not a {@code Proj4Keyword}, so {@link #setW} is reachable only from Java; the + * bridge reports the corpus's {@code +W=} blocks as not implemented rather than running them at the + * default. + */ public class LagrangeProjection extends Projection { - // Parameters - private double hrw; - private double rw = 1.4; - private double a1; - private double phi1; + private static final long serialVersionUID = 2261795050715571321L; + + /** {@code Q->w}: {@code +W}, kept exactly as supplied. Upstream's default is 2. */ + private double w = 2.0; + + /** {@code Q->hw = 0.5*w}, {@code Q->rw = 1/w}, {@code Q->hrw = 0.5/w}. All derived. */ + private double hw, rw, hrw; + + /** {@code Q->a1}, {@code Q->a2 = a1*a1}. */ + private double a1, a2; private final static double TOL = 1e-10; + /** {@code lagrng_s_forward}. */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { double v, c; - if ( Math.abs(Math.abs(lpphi) - ProjectionMath.HALFPI) < TOL) { + final double sinPhi = FastStrictTrig.sin(lpphi); + // Upstream's test is on the SINE, not on the latitude. See the class javadoc. + if ( Math.abs(Math.abs(sinPhi) - 1) < TOL) { xy.x = 0; xy.y = lpphi < 0 ? -2. : 2.; } else { - lpphi = Math.sin(lpphi); - v = a1 * Math.pow((1. + lpphi)/(1. - lpphi), hrw); - if ((c = 0.5 * (v + 1./v) + Math.cos(lplam *= rw)) < TOL) - throw new ProjectionException(); - xy.x = 2. * Math.sin(lplam) / c; + v = a1 * Math.pow((1. + sinPhi)/(1. - sinPhi), hrw); + final double lam = lplam * rw; + if ((c = 0.5 * (v + 1./v) + FastStrictTrig.cos(lam)) < TOL) + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "forward of (" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + + ") deg is on the map's boundary circle: the denominator " + c + + " is at or below " + TOL); + xy.x = 2. * FastStrictTrig.sin(lam) / c; xy.y = (v - 1./v) / c; } return xy; } + /** {@code lagrng_s_inverse}. */ + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + double c, x2, y2p, y2m; + + if (Math.abs(Math.abs(y) - 2.) < TOL) { + lp.y = y < 0 ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + lp.x = 0; + } else { + x2 = x * x; + y2p = 2. + y; + y2m = 2. - y; + c = y2p * y2m - x2; + if (Math.abs(c) < TOL) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "inverse of (" + x + ", " + y + ") is on the map's boundary circle: the " + + "denominator " + c + " is within " + TOL + " of zero"); + } + lp.y = 2. * Math.atan(Math.pow((y2p * y2p + x2) / (a2 * (y2m * y2m + x2)), hw)) + - ProjectionMath.HALFPI; + lp.x = w * Math.atan2(4. * x, c); + } + return lp; + } + + /** + * {@code +W}: the fraction of a hemisphere the map's boundary circle spans, {@code 2} meaning a + * full hemisphere. Kept as supplied; the reciprocals are derived in {@link #initialize()}. + * + * @param w the parameter, {@code > 0} + */ public void setW( double w ) { - this.rw = w; + this.w = w; } public double getW() { - return rw; + return w; } + /** + * {@code PJ_PROJECTION(lagrng)}. + * + * @throws InvalidValueException for upstream's two rejections: {@code +W <= 0}, and a + * {@code +lat_1} at a pole + */ public void initialize() { + es = 0.; + e = 0.; super.initialize(); - if (rw <= 0) - throw new ProjectionException("-27"); - hrw = 0.5 * (rw = 1. / rw); - phi1 = projectionLatitude1; - if (Math.abs(Math.abs(phi1 = Math.sin(phi1)) - 1.) < TOL) - throw new ProjectionException("-22"); - a1 = Math.pow((1. - phi1)/(1. + phi1), hrw); + if (w <= 0) + throw new InvalidValueException( + "Invalid value for +W: it should be > 0, but is " + w); + hw = 0.5 * w; + rw = 1. / w; + hrw = 0.5 * rw; + final double sinPhi1 = Math.sin(projectionLatitude1); + if (Math.abs(Math.abs(sinPhi1) - 1.) < TOL) + throw new InvalidValueException( + "Invalid value for +lat_1: |lat_1| should be < 90 degrees, but is " + + Math.toDegrees(projectionLatitude1)); + a1 = Math.pow((1. - sinPhi1)/(1. + sinPhi1), hrw); + a2 = a1 * a1; } /** @@ -79,7 +169,7 @@ public boolean isConformal() { } public boolean hasInverse() { - return false; + return true; } public String toString() { @@ -93,13 +183,13 @@ public boolean equals(Object that) { } if (that instanceof LagrangeProjection) { LagrangeProjection p = (LagrangeProjection) that; - return (rw == p.rw) && super.equals(that); + return (w == p.w) && super.equals(that); } return false; } @Override public int hashCode() { - return Objects.hash(rw, super.hashCode()); + return Objects.hash(w, super.hashCode()); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LambertAzimuthalEqualAreaProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LambertAzimuthalEqualAreaProjection.java index b55c16b..5d26958 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LambertAzimuthalEqualAreaProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LambertAzimuthalEqualAreaProjection.java @@ -21,10 +21,14 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.AuthalicLat; +import org.locationtech.proj4j.util.MathHelpers; import org.locationtech.proj4j.util.ProjectionMath; public class LambertAzimuthalEqualAreaProjection extends Projection { + private static final long serialVersionUID = 2680576002433982735L; + private static final int N_POLE = 0; private static final int S_POLE = 1; private static final int EQUIT = 2; @@ -40,9 +44,14 @@ public class LambertAzimuthalEqualAreaProjection extends Projection { private double qp; private double dd; private double rq; - private double[] apa; private double sinph0; private double cosph0; + + /** + * The order-6 authalic-latitude machinery, {@code 9.8.1:src/latitudes.cpp}. Replaces + * {@code ProjectionMath.authset}/{@code authlat}/{@code qsfn}. + */ + private AuthalicLat authalic; public LambertAzimuthalEqualAreaProjection() { this( false ); @@ -75,9 +84,9 @@ else if (Math.abs(t) < ProjectionMath.EPS10) { double sinphi; e = Math.sqrt(es); - qp = ProjectionMath.qsfn(1., e, one_es); + authalic = new AuthalicLat(es); + qp = authalic.qp(); mmf = .5 / (1. - es); - apa = ProjectionMath.authset(es); switch (mode) { case N_POLE: case S_POLE: @@ -91,8 +100,13 @@ else if (Math.abs(t) < ProjectionMath.EPS10) { case OBLIQ: rq = Math.sqrt(.5 * qp); sinphi = Math.sin(phi0); - sinb1 = ProjectionMath.qsfn(sinphi, e, one_es) / qp; - cosb1 = Math.sqrt(1. - sinb1 * sinb1); + // 9.8.1:laea.cpp:283-285 takes the authalic latitude of phi0 through the + // direct phi -> xi series and then its sine and cosine, rather than + // sinb1 = q/qp with cosb1 = sqrt(1 - sinb1^2). The asin form loses relative + // accuracy near the poles, which is why upstream stopped using it. + final double b1 = authalic.forward(phi0, sinphi, Math.cos(phi0)); + sinb1 = Math.sin(b1); + cosb1 = Math.cos(b1); dd = Math.cos(phi0) / (Math.sqrt(1. - es * sinphi * sinphi) * rq * cosb1); ymf = (xmf = rq) / dd; @@ -154,10 +168,14 @@ public void project_e(double lplam, double lpphi, ProjCoordinate out) { coslam = Math.cos(lplam); sinlam = Math.sin(lplam); sinphi = Math.sin(lpphi); - q = ProjectionMath.qsfn(sinphi, e, one_es); + // 9.8.1:laea.cpp:39-46. xi is the authalic latitude from the direct phi -> xi + // series; q is recovered as sin(xi)*qp (laea still needs the raw q for the polar + // aspects), and sinb/cosb are sin(xi)/cos(xi) instead of q/qp and sqrt(1-sinb^2). + final double xi = authalic.forward(lpphi, sinphi, Math.cos(lpphi)); + q = Math.sin(xi) * qp; if (mode == OBLIQ || mode == EQUIT) { - sinb = q / qp; - cosb = Math.sqrt(1. - sinb * sinb); + sinb = Math.sin(xi); + cosb = Math.cos(xi); } switch (mode) { case OBLIQ: @@ -191,9 +209,45 @@ public void project_e(double lplam, double lpphi, ProjCoordinate out) { break; case N_POLE: case S_POLE: - if (q >= 0.) { + // 9.8.1:laea.cpp:75 uses 1e-15, not 0: at the pole `qp - q` is rounding noise and + // sqrt of a denormal would put the point sub-millimetres off the origin. + if (q >= 1e-15) { out.x = (b = Math.sqrt(q)) * sinlam; out.y = coslam * (mode == S_POLE ? b : -b); + } else if (Double.isNaN(q) || Double.isNaN(sinlam) || Double.isNaN(coslam)) { + // NaN in, NaN out -- and it has to be said explicitly, because `q >= 1e-15` is + // FALSE for NaN and the `else` below would otherwise answer an undefined point + // with the *origin*: a finite, plausible coordinate that every downstream + // isFinite() guard passes, and that projectRadians then turns into exactly + // (x_0, y_0) once a false easting is set. Measured before this line existed: + // +proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84 +x_0=1000000 +y_0=2000000 with + // (NaN, NaN) returned (1000000.0, 2000000.0). + // + // This is not a deviation from upstream, it is upstream's *observable* + // behaviour. 9.8.1:src/projections/laea.cpp:75-81 has the same `else` arm, but + // it is unreachable for NaN: 9.8.1:src/trans.cpp:352-354 short-circuits any + // coordinate carrying a NaN to all-NaN before the operation is ever invoked + // if (pj_coord_has_nans(coord)) coord.v[0..3] = quiet_NaN(); + // else if (direction == PJ_FWD) pj_fwd4d(coord, P); + // so laea_e_forward is simply not called. Confirmed against the shipped 9.8.1 + // `gie`: more_builtins.gie:795's own row ("When given NaNs, return NaNs", + // tolerance 0) reports GOT nan nan for this very proj-string, and still does + // with +x_0=1000000 added, which proves the zero never reaches fwd_finalize. + // + // Proj4J puts the rule here rather than in the funnel because + // Projection.projectRadians documents NaN as *propagated through* the kernel + // (its "NaN input is propagated, not rejected" section): the checks are skipped + // and whatever project() returns comes back. Under that contract every kernel + // must be NaN-transparent, and this arm was the one place in laea that was not. + // All three of laea's other aspects, and both inverse arms, already are -- + // their guards (`|b| < EPS10`, `rho < EPS10`, `rh*.5 > 1.`, `0 == q`) are all + // false for NaN, which is why the defect was confined to the polar forward. + // + // Both operands matter, not just q. A NaN *latitude* arrives as a NaN q; a NaN + // *longitude* with a finite latitude arrives as NaN sinlam/coslam while q stays + // finite, and at the pole itself q is below the 1e-15 floor, so + // (NaN, +pi/2) also used to answer (0, 0). + out.x = out.y = Double.NaN; } else out.x = out.y = 0.; break; @@ -214,7 +268,12 @@ public void projectInverse_s(double xyx, double xyy, ProjCoordinate out) { double cosz=0.0, rh, sinz=0.0; double lpphi, lplam; - rh = Math.hypot(xyx, xyy); + // MathHelpers.norm2, not Math.hypot: hypot is fdlibm and about ten times the cost of a + // sqrt, and it buys overflow scaling this call cannot use. Both operands here are the + // projected coordinate already divided by the semi-major axis, so |xyx|, |xyy| are of + // order 1 -- squaring them cannot overflow or underflow. Same substitution etmerc + // already carries; SolverBenchmark measures the pair head to head. + rh = MathHelpers.norm2(xyx, xyy); if ((lpphi = rh * .5 ) > 1.) throw new ProjectionException("I_ERROR"); lpphi = 2. * Math.asin(lpphi); if (mode == OBLIQ || mode == EQUIT) { @@ -254,7 +313,7 @@ public void projectInverse_e(double xyx, double xyy, ProjCoordinate out) { switch (mode) { case EQUIT: case OBLIQ: - if ((rho = Math.hypot(xyx /= dd, xyy *= dd)) < EPS10) { + if ((rho = MathHelpers.norm2(xyx /= dd, xyy *= dd)) < EPS10) { lplam = 0.; lpphi = phi0; out.x = lplam; @@ -290,7 +349,7 @@ public void projectInverse_e(double xyx, double xyy, ProjCoordinate out) { break; } lplam = Math.atan2(xyx, xyy); - lpphi = ProjectionMath.authlat(Math.asin(ab), apa); + lpphi = authalic.inverse(Math.asin(ab)); out.x = lplam; out.y = lpphi; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicAlternativeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicAlternativeProjection.java new file mode 100644 index 0000000..4d4da71 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicAlternativeProjection.java @@ -0,0 +1,170 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.MeridianArc; + +/** + * Lambert Conformal Conic Alternative, {@code +proj=lcca} — a port of + * {@code 9.8.1:src/projections/lcca.cpp}. Ellipsoidal; the inverse is a Newton solve on a + * truncated cubic. + * + *

The French Army Truncated Cubic Lambert conic, only partially conformal — the + * legal projection for France from the late 1800s until 1948, and later used in Algeria, Tunisia, + * Morocco and Syria. Upstream's own header says it should not be used for new work; it exists for + * interoperability with historical data. It is not + * {@link LambertConformalConicProjection} with different parameters: the meridional distance is + * replaced by the cubic {@code S(1 + S^2 C)} about {@code +lat_0}, which is where the "truncated + * cubic" comes from. + * + *

Only {@code +lat_0} and {@code +k_0} are read

+ * + *

Despite being a conic, {@code lcca} reads neither {@code +lat_1} nor {@code +lat_2} — + * {@code PROJ_HEAD} lists {@code lat_0=} alone. The corpus's single block supplies + * {@code +lat_1=0.5 +lat_2=2} anyway and expects them to be ignored, which is worth knowing + * before "fixing" the setup to consume them. + * + *

{@code +lat_0 == 0} is rejected with {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}: the cone + * degenerates and {@code r0 = N0/tan(phi0)} is infinite. The test is an exact equality upstream + * and is kept as one. + * + *

{@code k_0} is applied here, twice

+ * + *

The forward multiplies both ordinates by {@code P->k0} explicitly and the inverse divides by + * it, so {@link Projection#scaleFactor} must be used in the kernel and not left to the affine + * tail (which does not apply it). + * + *

The inverse's convergence test is upstream's C idiom

+ * + *

{@code for (i = MAX_ITER; i; --i) { ...; if (fabs(dif) < DEL_TOL) break; } if (!i) error;} + * — ten trips, and the error fires only when the loop ran out, i.e. {@code i} reached 0 + * without the {@code break}. Note this is the opposite of the {@code lsat} case recorded + * in the skill, where the C leaves {@code i == -1} and the error branch is unreachable: here the + * counter stops at 0 and {@code !0} is true, so exhaustion is reported. + * + * @see 9.8.1 + * lcca.cpp + */ +public class LambertConformalConicAlternativeProjection extends ConicProjection { + + private static final long serialVersionUID = 7763022898047662660L; + + private static final int MAX_ITER = 10; + private static final double DEL_TOL = 1e-12; + + private MeridianArc meridian; + private double r0; + private double l; + private double m0; + private double cCoef; + + /** {@code fS}, {@code lcca.cpp:70-73}: the truncated cubic. */ + private static double fS(double s, double c) { + return s * (1. + s * s * c); + } + + /** {@code fSp}, {@code lcca.cpp:75-78}: its derivative. */ + private static double fSp(double s, double c) { + return 1. + 3. * s * s * c; + } + + /** + * Port of {@code PJ_PROJECTION(lcca)} ({@code lcca.cpp:131-165}). + * + * @throws InvalidValueException if {@code +lat_0} is exactly 0 + */ + @Override + public void initialize() { + super.initialize(); + if (projectionLatitude == 0.) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=lcca requires +lat_0 != 0: the cone degenerates and r0 = N0/tan(lat_0) " + + "is infinite at the equator (lcca.cpp:142-146)"); + } + meridian = MeridianArc.fromEs(es); + l = FastStrictTrig.sin(projectionLatitude); + m0 = meridian.mlfn(projectionLatitude, l, FastStrictTrig.cos(projectionLatitude)); + final double s2p0 = l * l; + double bigR0 = 1. / (1. - es * s2p0); + final double n0 = Math.sqrt(bigR0); + bigR0 *= one_es * n0; + final double tan0 = FastStrictTrig.tan(projectionLatitude); + r0 = n0 / tan0; + cCoef = 1. / (6. * bigR0 * n0); + } + + /** {@code lcca_e_forward}, {@code lcca.cpp:80-93}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double s = meridian.mlfn(phi, FastStrictTrig.sin(phi), FastStrictTrig.cos(phi)) - m0; + final double dr = fS(s, cCoef); + final double r = r0 - dr; + final double lamMulL = lam * l; + xy.x = scaleFactor * (r * FastStrictTrig.sin(lamMulL)); + xy.y = scaleFactor * (r0 - r * FastStrictTrig.cos(lamMulL)); + return xy; + } + + /** + * {@code lcca_e_inverse}, {@code lcca.cpp:95-119}. + * + * @throws ProjectionException if the ten-trip Newton solve on the cubic does not reach + * {@code 1e-12}; upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN}, which is why this is a + * domain error rather than a {@code ConvergenceFailureException} + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + final double xx = x / scaleFactor; + final double yy = y / scaleFactor; + final double theta = StrictMath.atan2(xx, r0 - yy); + final double dr = yy - xx * FastStrictTrig.tan(0.5 * theta); + lp.x = theta / l; + double s = dr; + int i = MAX_ITER; + for (; i != 0; --i) { + final double dif = (fS(s, cCoef) - dr) / fSp(s, cCoef); + s -= dif; + if (Math.abs(dif) < DEL_TOL) { + break; + } + } + if (i == 0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "lcca inverse: the truncated-cubic Newton solve did not reach " + DEL_TOL + + " in " + MAX_ITER + " iterations at (" + x + ", " + y + + ") (lcca.cpp:113-116)"); + } + lp.y = meridian.invMlfn(s + m0); + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Lambert Conformal Conic Alternative"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicProjection.java index 9c9f004..b95834b 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LambertConformalConicProjection.java @@ -16,20 +16,57 @@ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.util.ConformalLat; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Lambert Conformal Conic, {@code 9.8.1:src/projections/lcc.cpp}. + * + *

Every latitude-dependent quantity here is the conformal one, so the whole projection rests on + * {@code pj_tsfn} and {@code pj_phi2}. Both now come from {@link ConformalLat}, the port of + * 9.8.1's rewritten {@code src/tsfn.cpp} and {@code src/phi2.cpp}, rather than from the deprecated + * {@code ProjectionMath} equivalents: + * + *

    + *
  • the forward and the three {@code initialize()} sites use {@code tsfn}, whose 9.8.1 form + * ({@code exp(e*atanh(e*sin phi))} times a cancellation-free ratio) drops a {@code tan} and a + * {@code pow} and is exactly {@code 1.0} at the equator where the old one was one ulp short; + *
  • the inverse uses {@code phi2}, which is Newton on {@code tau} and converges in one or two + * trips. On GRS80 the old 15-step {@code pow}-per-trip loop was up to 4,145 nm from the truth; + * measured on {@code builtins.gie:3767-3768} ({@code +lat_1=0.5 +lat_2=2}, inverse of + * {@code (200, 100)}) the latitude was 23.1 um out against that row's 0.1 mm bar, and is + * now under 1 nm. + *
+ * + *

Because {@code n} is derived from {@code log(ml1/ml2)} of two {@code tsfn} values, the cone + * constant itself moves by about one ulp, and with it every {@code lcc} coordinate. That is + * expected and is the point. + * + *

Setup validation. {@code initialize()} now reproduces {@code lcc.cpp:100-110} and + * {@code :122-138}/{@code :154-161}: a standard parallel at or beyond the pole, and a cone constant + * that comes out exactly zero, are rejected instead of being carried forward as a division by zero. + * {@code builtins.gie:3862-3908} asserts eight such setups as {@code expect failure errno + * invalid_op_illegal_arg_value}, and proj4j accepted all eight, producing coordinates from an + * infinite or NaN cone constant. This throws where it used to return; no definition in the + * bundled EPSG, ESRI or NAD tables — 1,885 {@code +proj=lcc} definitions — has {@code |lat_1| >= 90} + * or {@code |lat_2| >= 90}, and those with no {@code lat_1} at all already threw on the + * {@code |lat_1 + lat_2| > 0} check that was already here. + */ public class LambertConformalConicProjection extends ConicProjection { + private static final long serialVersionUID = 565492101400462955L; + private double n; private double rho0; private double c; public LambertConformalConicProjection() { - minLatitude = Math.toRadians(0); - maxLatitude = Math.toRadians(80.0); + minLatitude = ProjectionMath.toRad(0); + maxLatitude = ProjectionMath.toRad(80.0); // an incorrect init, LCC is sensitive to input parameters // init should happen only after the LCC projection parsing // projectionLatitude = ProjectionMath.QUARTERPI; @@ -60,7 +97,7 @@ public ProjCoordinate project(double x, double y, ProjCoordinate out) { else { rho = c * (spherical ? Math.pow(Math.tan(ProjectionMath.QUARTERPI + .5 * y), -n) : - Math.pow(ProjectionMath.tsfn(y, Math.sin(y), e), n)); + Math.pow(ConformalLat.tsfn(y, Math.sin(y), e), n)); } out.x = scaleFactor * (rho * Math.sin(x *= n)); out.y = scaleFactor * (rho0 - rho * Math.cos(x)); @@ -82,7 +119,7 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { if (spherical) out.y = 2.0 * Math.atan(Math.pow(c / rho, 1.0 / n)) - ProjectionMath.HALFPI; else - out.y = ProjectionMath.phi2(Math.pow(rho / c, 1.0 / n), e); + out.y = ConformalLat.phi2(Math.pow(rho / c, 1.0 / n), e); out.x = Math.atan2(x, y) / n; } else { out.x = 0.0; @@ -110,30 +147,59 @@ public void initialize() { } + // Left as ProjectionException deliberately. 149 of the 1,885 bundled +proj=lcc definitions + // omit lat_1 entirely and so already reach this throw; reclassifying it to + // InvalidValueException -- which is the taxonomically correct answer, since this is a + // setup error carrying PROJ's invalid_op_illegal_arg_value -- would change the exception + // type every one of those callers sees, and the two classes are siblings rather than + // related by inheritance. That reclassification belongs with the error-taxonomy work, not + // here. None of the eight rejection rows at builtins.gie:3862-3908 reaches this line. if (Math.abs(projectionLatitude1 + projectionLatitude2) < 1e-10) - throw new ProjectionException(); + throw new ProjectionException( + "Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0"); n = sinphi = Math.sin(projectionLatitude1); cosphi = Math.cos(projectionLatitude1); + // lcc.cpp:100-110. Without these the standard parallels may sit at or beyond the pole, + // where the cone degenerates and every subsequent quantity is a division by zero dressed + // up as a coordinate. builtins.gie:3876-3908 asserts eight such setups as rejections. + if (Math.abs(cosphi) < 1e-10 || Math.abs(projectionLatitude1) >= ProjectionMath.HALFPI) + throw new InvalidValueException("Invalid value for lat_1: |lat_1| should be < 90 degrees"); + if (Math.abs(Math.cos(projectionLatitude2)) < 1e-10 + || Math.abs(projectionLatitude2) >= ProjectionMath.HALFPI) + throw new InvalidValueException("Invalid value for lat_2: |lat_2| should be < 90 degrees"); secant = Math.abs(projectionLatitude1 - projectionLatitude2) >= 1e-10; spherical = (es == 0.0); if (!spherical) { double ml1, m1; m1 = ProjectionMath.msfn(sinphi, cosphi, es); - ml1 = ProjectionMath.tsfn(projectionLatitude1, sinphi, e); + ml1 = ConformalLat.tsfn(projectionLatitude1, sinphi, e); if (secant) { n = Math.log(m1 / ProjectionMath.msfn(sinphi = Math.sin(projectionLatitude2), Math.cos(projectionLatitude2), es)); - n /= Math.log(ml1 / ProjectionMath.tsfn(projectionLatitude2, sinphi, e)); + // lcc.cpp:122-128 and :132-138: es so close to 1 that the two msfn values, or the + // two tsfn values, are indistinguishable. Dividing by the resulting zero used to + // yield an infinite cone constant. builtins.gie:3862 and :3869 are these two. + if (n == 0.0) + throw new InvalidValueException("Invalid value for eccentricity"); + double denom = Math.log(ml1 / ConformalLat.tsfn(projectionLatitude2, sinphi, e)); + if (denom == 0.0) + throw new InvalidValueException("Invalid value for eccentricity"); + n /= denom; } c = (rho0 = m1 * Math.pow(ml1, -n) / n); rho0 *= (Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) < 1e-10) ? 0. : - Math.pow(ProjectionMath.tsfn(projectionLatitude, Math.sin(projectionLatitude), e), n); + Math.pow(ConformalLat.tsfn(projectionLatitude, Math.sin(projectionLatitude), e), n); } else { if (secant) n = Math.log(cosphi / Math.cos(projectionLatitude2)) / Math.log(Math.tan(ProjectionMath.QUARTERPI + .5 * projectionLatitude2) / Math.tan(ProjectionMath.QUARTERPI + .5 * projectionLatitude1)); + // lcc.cpp:154-161: reachable with +proj=lcc +a=1 +lat_2=.0000001, upstream's own + // example, where lat_1 and lat_2 are too close to zero to distinguish. + if (n == 0.0) + throw new InvalidValueException( + "Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0"); c = cosphi * Math.pow(Math.tan(ProjectionMath.QUARTERPI + .5 * projectionLatitude1), n) / n; rho0 = (Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) < 1e-10) ? 0. : c * Math.pow(Math.tan(ProjectionMath.QUARTERPI + .5 * projectionLatitude), -n); diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LambertEqualAreaConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LambertEqualAreaConicProjection.java index 6c50cb4..25b46e8 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LambertEqualAreaConicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LambertEqualAreaConicProjection.java @@ -21,22 +21,92 @@ import org.locationtech.proj4j.util.ProjectionMath; +/** + * Lambert Equal Area Conic, {@code +proj=leac}. + * + *

Upstream this is {@code PJ_PROJECTION(leac)} in the same file as {@code aea} + * ({@code 9.8.1:src/projections/aea.cpp:214-227}) and differs from it only in how the two standard + * parallels are obtained: + * + *

+ * Q->phi2 = pj_param(P->ctx, P->params, "rlat_1").f;
+ * Q->phi1 = pj_param(P->ctx, P->params, "bsouth").i ? -M_HALFPI : M_HALFPI;
+ * 
+ * + *

So {@code leac} is a one-parallel operator: {@code +lat_1} becomes the second parallel, + * the first is a pole chosen by {@code +south}, and {@code +lat_2} is not read at all. + * + *

What was wrong

+ * + *

The old class set {@code projectionLatitude1} to ±45° and + * {@code projectionLatitude2} to ±90° in its constructor and then inherited + * {@code AlbersProjection}'s reading of those two fields. Since {@code Proj4Parser} assigns + * {@code +lat_1} to {@code projectionLatitude1} and {@code +lat_2} to {@code projectionLatitude2} + * whenever those keywords are present, {@code +proj=leac +lat_1=0 +lat_2=2} ran as + * {@code aea} with parallels (0°, 2°) where upstream uses (90°, 0°) — two + * different cones. All 16 of the projection's {@code builtins.gie} assertions failed, the forward + * ones by about 3 km and the inverse ones by 2.4 mm against a 0.1 mm bar. + * + *

The fix is the two {@code protected} seams {@link AlbersProjection#firstStandardParallel()} + * and {@link AlbersProjection#secondStandardParallel()} rather than field mutation, because + * {@code initialize()} runs twice — once from the constructor and once from the parser — and any + * scheme that writes the shared fields is not idempotent across those two calls. + */ public class LambertEqualAreaConicProjection extends AlbersProjection { - public LambertEqualAreaConicProjection() { - this( false ); - } - - public LambertEqualAreaConicProjection( boolean south ) { - minLatitude = Math.toRadians(0); - maxLatitude = Math.toRadians(90); - projectionLatitude1 = south ? -ProjectionMath.QUARTERPI : ProjectionMath.QUARTERPI; - projectionLatitude2 = south ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - initialize(); - } - - public String toString() { - return "Lambert Equal Area Conic"; - } + private static final long serialVersionUID = -4045880544360988887L; + + /** Upstream's {@code +south} flag: which pole is the first standard parallel. */ + private boolean south; + + public LambertEqualAreaConicProjection() { + this( false ); + } + + public LambertEqualAreaConicProjection( boolean south ) { + this.south = south; + minLatitude = ProjectionMath.toRad(0); + maxLatitude = ProjectionMath.toRad(90); + initialize(); + } + + /** + * @return {@code -pi/2} under {@code +south}, otherwise {@code +pi/2}. Upstream reads + * {@code bsouth}, a boolean parameter, so it is the pole and not {@code +lat_1}. + */ + @Override + protected double firstStandardParallel() { + return south ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } + + /** + * @return {@code +lat_1}. Deliberately not {@code +lat_2}: {@code leac} never reads + * {@code +lat_2}, so a definition supplying it is silently ignored upstream and is + * silently ignored here. + */ + @Override + protected double secondStandardParallel() { + return projectionLatitude1; + } + + /** + * @param south whether the first standard parallel is the south pole + * @since 1.5.0 + */ + public void setSouth(boolean south) { + this.south = south; + } + + /** + * @return whether the first standard parallel is the south pole + * @since 1.5.0 + */ + public boolean isSouth() { + return south; + } + + public String toString() { + return "Lambert Equal Area Conic"; + } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LandsatProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LandsatProjection.java index 9446d8d..d5675b6 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LandsatProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LandsatProjection.java @@ -19,15 +19,54 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class LandsatProjection extends Projection { + private static final long serialVersionUID = -6304348212843606110L; + private double a2, a4, b, c1, c3; private double q, t, u, w, p22, sa, ca, xj, rlm, rlm2; + /** + * {@code +lsat}, the Landsat vehicle number ({@code som.cpp:307}). + * + *

Why the default is 1 and not upstream's 0

+ * + *

{@code PJ_PROJECTION(lsat)} reads {@code pj_param(ctx, params, "ilsat").i} with no + * default, so an absent {@code +lsat} is 0, which fails {@code land <= 0} and makes a + * bare {@code +proj=lsat} an error upstream. This class instead keeps the 1 that used to be + * hard-coded here behind a {@code //FIXME}. + * + *

That is a deliberate, temporary divergence, and the reason is that two committed + * references were pinned against the hard-coded values while the parameters were unreachable: + * {@code core/src/test/java/.../proj/lsat/LandsatInverseTest.java} projects a bare + * {@code +proj=lsat +ellps=GRS80} against numbers its own javadoc records as generated by + * {@code proj +proj=lsat +lsat=1 +path=120 +ellps=GRS80}, and {@code golden}'s five + * {@code SYN proj/lsat} rows are {@code OK} at the canonical parameter set, which carries + * neither key. Defaulting to 0 today turns both into errors, so aligning with upstream means + * re-pinning {@code LandsatInverseTest}'s {@code SPEC} to carry {@code +lsat=1 +path=120} + * and recording the five golden transitions in {@code golden/rules.yaml} — neither of which + * belongs in a parameter-dispatch change. + * + *

No corpus row is affected either way: both of {@code builtins.gie}'s {@code lsat} blocks + * ({@code :4058} and {@code :4081}) supply both keys. + */ + private int land = 1; + + /** + * {@code +path}, the orbital path number ({@code som.cpp:318}). Range is + * {@code [1, 251]} for {@code +lsat <= 3} and {@code [1, 233]} above it. + * + *

120 for the same reason {@link #land} is 1. Upstream's absent value is 0, which is out + * of range. + */ + private int path = 120; + private final static double TOL = 1e-7; private final static double PI_HALFPI = 4.71238898038468985766; private final static double TWOPI_HALFPI = 7.85398163397448309610; @@ -85,49 +124,88 @@ else if (lamdp >= rlm2) return xy; } -/* - public Point2D.Double projectInverse(double xyx, double xyy, Point2D.Double out) { + /** + * Port of {@code som_e_inverse} ({@code 9.8.1:src/projections/som.cpp:158-203}). + * + *

Before 1.5.0 this method existed only as a commented-out block whose signature was + * {@code projectInverse(double, double, java.awt.geom.Point2D.Double)} — an AWT type this + * library has not used since it was forked. It therefore overrode nothing, while + * {@link #hasInverse()} kept returning {@code true}, so {@code +proj=lsat} inverses landed + * on {@code Projection}'s identity and returned projected metres reinterpreted as + * longitude and latitude in radians. That is the same defect class the fail-closed + * {@link org.locationtech.proj4j.ErrorCause#NO_INVERSE_AVAILABLE} gate was built for; this + * file was outside its scope, and an inverse does exist upstream, so it is ported here + * rather than gated. + * + *

Two divergences from the commented-out draft, both because the draft never compiled: + * {@code s} is initialised (C left it indeterminate before the {@code do}/{@code while}, + * which is harmless there only because the body always runs once), and the + * {@code 1 - sin^2(phi'')(1 + u)} denominator is tested for zero, which 9.8.1 added as + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} and the draft predates. + * + *

{@code Math} rather than {@code StrictMath}/{@code FastStrictTrig} throughout, to match + * the forward in this same file; switching both together is a separate change. + * + * @param xyx the projected x ordinate, scaled as {@link #project} produces it + * @param xyy the projected y ordinate + * @param out receives longitude and latitude in radians + * @return {@code out} + */ + @Override + protected ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { int nn; - double lamt, sdsq, s, lamdp, phidp, sppsq, dd, sd, sl, fac, scl, sav, spp; + double lamt, sdsq, s = 0., lamdp, phidp, sppsq, dd, sd, sl, fac, scl, sav, spp; - lamdp = xy.x / b; + lamdp = xyx / b; nn = 50; do { sav = lamdp; sd = Math.sin(lamdp); sdsq = sd * sd; - s = p22 * sa * Math.cos(lamdp) * sqrt((1. + t * sdsq) + s = p22 * sa * Math.cos(lamdp) * Math.sqrt((1. + t * sdsq) / ((1. + w * sdsq) * (1. + q * sdsq))); - lamdp = xy.x + xy.y * s / xj - a2 * Math.sin( + lamdp = xyx + xyy * s / xj - a2 * Math.sin( 2. * lamdp) - a4 * Math.sin(lamdp * 4.) - s / xj * ( c1 * Math.sin(lamdp) + c3 * Math.sin(lamdp * 3.)); lamdp /= b; - } while (Math.abs(lamdp - sav) >= TOL && --nn); + } while (Math.abs(lamdp - sav) >= TOL && --nn != 0); sl = Math.sin(lamdp); - fac = exp(sqrt(1. + s * s / xj / xj) * (xy.y - + fac = Math.exp(Math.sqrt(1. + s * s / xj / xj) * (xyy - c1 * sl - c3 * Math.sin(lamdp * 3.))); - phidp = 2. * (Math.atan(fac) - FORTPI); + phidp = 2. * (Math.atan(fac) - ProjectionMath.QUARTERPI); dd = sl * sl; if (Math.abs(Math.cos(lamdp)) < TOL) lamdp -= TOL; spp = Math.sin(phidp); sppsq = spp * spp; - lamt = Math.atan(((1. - sppsq * rone_es) * Math.tan(lamdp) * - ca - spp * sa * sqrt((1. + q * dd) * ( - 1. - sppsq) - sppsq * u) / Math.cos(lamdp)) / (1. - sppsq - * (1. + u))); + final double denom = 1. - sppsq * (1. + u); + if (denom == 0.0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "lsat inverse of (" + xyx + ", " + xyy + ") is outside the projection " + + "domain: 1 - sin^2(phi'')(1 + u) is exactly zero"); + } + lamt = Math.atan(((1. - sppsq * rone_es) * Math.tan(lamdp) * + ca - spp * sa * Math.sqrt((1. + q * dd) * ( + 1. - sppsq) - sppsq * u) / Math.cos(lamdp)) / denom); sl = lamt >= 0. ? 1. : -1.; scl = Math.cos(lamdp) >= 0. ? 1. : -1; - lamt -= HALFPI * (1. - scl) * sl; - lp.lam = lamt - p22 * lamdp; + lamt -= ProjectionMath.HALFPI * (1. - scl) * sl; + // adjlon here, not just in the caller. lamt - p22*lamdp accumulates the satellite's + // along-track rotation, so this kernel legitimately returns |lam| well past pi -- at + // (130, 45) with path 120 it returns 533.2 deg. inverseProjectRadians *clamps* to + // +/-pi before adding projectionLongitude instead of wrapping (PROJ's inv_finalize + // wraps, with adjlon), and a clamp turns that 533.2 deg into 180 deg and the answer + // into 136.758 deg -- 6.76 deg wrong, silently. Wrapping first makes that clamp a + // no-op. adjlon(adjlon(lam) + lam0) == adjlon(lam + lam0) to within an ulp of 2pi, + // about 6 nm on the ground. + out.x = ProjectionMath.adjlon(lamt - p22 * lamdp); if (Math.abs(sa) < TOL) - lp.phi = aasin(spp / sqrt(one_es * one_es + es * sppsq)); + out.y = ProjectionMath.asinChecked(spp / Math.sqrt(one_es * one_es + es * sppsq)); else - lp.phi = Math.atan((Math.tan(lamdp) * Math.cos(lamt) - ca * Math.sin(lamt)) / + out.y = Math.atan((Math.tan(lamdp) * Math.cos(lamt) - ca * Math.sin(lamt)) / (one_es * sa)); - return lp; + return out; } -*/ private void seraz0(double lam, double mult) { double sdsq, h, s, fc, sd, sq, d__1; @@ -149,19 +227,70 @@ private void seraz0(double lam, double mult) { c3 += fc * Math.cos(lam * 3.); } + /** + * {@code +lsat}: the Landsat vehicle number, 1 to 5. + * + *

This used to be unreachable

+ * + *

{@code initialize()} assigned {@code land = 1} to a local behind a + * {@code //FIXME}, so there was no field to set and no way to ask for Landsat 4 or 5 — + * {@code +proj=lsat +lsat=5} silently returned Landsat 1's map. Now a field, and + * {@code initialize()} only reads it, so the value survives the second + * {@code initialize()} the parser triggers. + * + * @param land the vehicle number + * @see #setPath(int) + */ + public void setLandsat(int land) { + this.land = land; + } + + /** @return the {@code +lsat} in force */ + public int getLandsat() { + return land; + } + + /** + * {@code +path}: the orbital path number, {@code [1, 251]} for {@code +lsat <= 3} and + * {@code [1, 233]} above it. Same story as {@link #setLandsat(int)} — it was a local + * pinned to 120, which is why the conformance bridge had to classify {@code +path} as + * conditionally honoured and refuse {@code lsat} rows outright. + * + * @param path the path number + */ + public void setPath(int path) { + this.path = path; + } + + /** @return the {@code +path} in force */ + public int getPath() { + return path; + } + + /** + * {@code PJ_PROJECTION(lsat)} ({@code som.cpp:303-345}) followed by {@code som_setup}. + * + *

Both range checks are upstream's, and both now carry a message rather than the bare + * numeric codes {@code "-28"} and {@code "-29"} they used to throw. They are statements + * about the definition, not about a coordinate, so they are + * {@link InvalidValueException}s; the old {@code ProjectionException("-28")} said + * "this coordinate" about a parameter. + * + * @throws InvalidValueException if {@code +lsat} is outside {@code [1, 5]} or {@code +path} + * is outside its vehicle-dependent range + */ public void initialize() { super.initialize(); - int land, path; double lam, alf, esc, ess; -//FIXME land = pj_param(params, "ilsat").i; -land = 1; if (land <= 0 || land > 5) - throw new ProjectionException("-28"); -//FIXME path = pj_param(params, "ipath").i; -path = 120; - if (path <= 0 || path > (land <= 3 ? 251 : 233)) - throw new ProjectionException("-29"); + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "Invalid value for +lsat: it should be in the [1, 5] range, but is " + land); + final int maxPath = land <= 3 ? 251 : 233; + if (path <= 0 || path > maxPath) + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "Invalid value for +path: with +lsat=" + land + " it should be in the [1, " + + maxPath + "] range, but is " + path); if (land <= 3) { projectionLongitude = DTR * 128.87 - ProjectionMath.TWOPI / 251. * path; p22 = 103.2669323; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LarriveeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LarriveeProjection.java index 52d6c4d..fa4df70 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LarriveeProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LarriveeProjection.java @@ -23,6 +23,8 @@ public class LarriveeProjection extends Projection { + private static final long serialVersionUID = -2047243416025611958L; + private final static double SIXTH = .16666666666666666; public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LaskowskiProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LaskowskiProjection.java index 3f36bae..cce1810 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LaskowskiProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LaskowskiProjection.java @@ -24,6 +24,8 @@ public class LaskowskiProjection extends Projection { + private static final long serialVersionUID = 992691847231906932L; + private final static double a10 = 0.975534; private final static double a12 = -0.119161; private final static double a32 = -0.0143059; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LeeOblatedStereographicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LeeOblatedStereographicProjection.java new file mode 100644 index 0000000..9e289ed --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/LeeOblatedStereographicProjection.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.util.Complex; + +/** + * Lee Oblated Stereographic, {@code +proj=lee_os} — + * {@code PJ_PROJECTION(lee_os)}, {@code 9.8.1:src/projections/mod_ster.cpp:151-168}. + * + *

Centred on (165°W, 10°S) for the Pacific. Unlike the other four variants its + * second coefficient is genuinely complex, {@code (-0.0088162, -0.00617325)}, which is what + * rotates the oblate lobe onto the Pacific basin. + * + * @since 1.5.0 + */ +public class LeeOblatedStereographicProjection extends ModifiedStereographicProjection { + + private static final long serialVersionUID = 8998821589821671482L; + + /** {@code mod_ster.cpp:153-154}, digit for digit. */ + private static final Complex[] AB = { + new Complex(0.721316, 0.), + new Complex(0., 0.), + new Complex(-0.0088162, -0.00617325), + }; + + @Override + protected void setupVariant() { + setCoefficients(AB); + projectionLongitude = DTR * -165.; + projectionLatitude = DTR * -10.; + es = 0.; + } + + @Override + public String toString() { + return "Lee Oblated Stereographic"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LinearProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LinearProjection.java index 8155e0d..e0c1b3e 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LinearProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LinearProjection.java @@ -20,6 +20,9 @@ public class LinearProjection extends Projection { + + private static final long serialVersionUID = 132177987862432856L; + public ProjCoordinate project(ProjCoordinate src, ProjCoordinate dst) { dst.x = src.x; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LongLatProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LongLatProjection.java index e8a7d70..70dd718 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LongLatProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LongLatProjection.java @@ -23,6 +23,9 @@ */ public class LongLatProjection extends Projection { + + private static final long serialVersionUID = 4367262992647079905L; + // TODO: implement projection methods (which are basically just no-ops) /* diff --git a/core/src/main/java/org/locationtech/proj4j/proj/LoximuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/LoximuthalProjection.java index 0e75851..c8435be 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/LoximuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/LoximuthalProjection.java @@ -19,11 +19,15 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; public class LoximuthalProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = 8367744377007360135L; + private final static double FC = .92131773192356127802; private final static double RP = .31830988618379067154; private final static double EPS = 1e-8; @@ -33,38 +37,76 @@ public class LoximuthalProjection extends PseudoCylindricalProjection { private double tanphi1; public LoximuthalProjection() { - phi1 = Math.toRadians(40.0);//FIXME - param - cosphi1 = Math.cos(phi1); - tanphi1 = Math.tan(ProjectionMath.QUARTERPI + 0.5 * phi1); + initialize(); + } + + /** + * Derives the reference parallel from {@code +lat_1}. Port of {@code PJ_PROJECTION(loxim)} + * ({@code 9.8.1:src/projections/loxim.cpp:57-77}). + *

+ * {@code +lat_1} used to be hard-coded to 40° behind a {@code //FIXME - param}, so + * every {@code loxim} definition silently got the wrong reference parallel — PROJ's default is + * 0, and the 8 {@code builtins.gie} assertions all pass {@code +lat_1=0.5}. The parameter is + * dispatched by {@code Proj4Parser} already; nothing but this class had to change. + * + * @throws InvalidValueException if {@code cos(lat_1) < 1e-8}, i.e. {@code |lat_1|} is at or + * past 90 degrees, which upstream rejects with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} + */ + @Override + public void initialize() { + super.initialize(); + phi1 = projectionLatitude1; + cosphi1 = FastStrictTrig.cos(phi1); + if (cosphi1 < EPS) { + throw new InvalidValueException( + "Invalid value for +lat_1: |lat_1| should be < 90 degrees, but is " + + Math.toDegrees(phi1)); + } + tanphi1 = FastStrictTrig.tan(ProjectionMath.QUARTERPI + 0.5 * phi1); } + /** + * Port of {@code loxim_s_forward} ({@code 9.8.1:src/projections/loxim.cpp:21-36}). + *

+ * The near-parallel guard is {@code fabs(xy.y) < EPS} upstream; it was {@code y < EPS} here, + * so the whole southern half of the map — every point with {@code phi < lat_1} — took the + * {@code lam * cos(lat_1)} branch that only applies at the reference parallel. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double x; double y = lpphi - phi1; - if (y < EPS) + if (Math.abs(y) < EPS) x = lplam * cosphi1; else { x = ProjectionMath.QUARTERPI + 0.5 * lpphi; if (Math.abs(x) < EPS || Math.abs(Math.abs(x) - ProjectionMath.HALFPI) < EPS) x = 0.; else - x = lplam * y / Math.log( Math.tan(x) / tanphi1 ); + x = lplam * y / Math.log( FastStrictTrig.tan(x) / tanphi1 ); } out.x = x; out.y = y; return out; } + /** + * Port of {@code loxim_s_inverse} ({@code 9.8.1:src/projections/loxim.cpp:38-55}). + *

+ * Two operand substitutions are corrected: upstream forms {@code M_FORTPI + 0.5 * lp.phi} from + * the recovered latitude, not from the northing, and its second guard tests + * {@code fabs(fabs(lp.lam) - M_HALFPI)}, not {@code fabs(easting)}. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { double latitude = xyy + phi1; double longitude; if (Math.abs(xyy) < EPS) longitude = xyx / cosphi1; - else if (Math.abs( longitude = ProjectionMath.QUARTERPI + 0.5 * xyy ) < EPS || - Math.abs(Math.abs(xyx) -ProjectionMath.HALFPI) < EPS) + else if (Math.abs( longitude = ProjectionMath.QUARTERPI + 0.5 * latitude ) < EPS || + Math.abs(Math.abs(longitude) - ProjectionMath.HALFPI) < EPS) longitude = 0.; else - longitude = xyx * Math.log( Math.tan(longitude) / tanphi1 ) / xyy; + longitude = xyx * Math.log( FastStrictTrig.tan(longitude) / tanphi1 ) / xyy; out.x = longitude; out.y = latitude; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarParabolicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarParabolicProjection.java index 6bc50be..3bd7cb2 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarParabolicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarParabolicProjection.java @@ -21,10 +21,13 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; public class McBrydeThomasFlatPolarParabolicProjection extends Projection { + private static final long serialVersionUID = -1265108225027350150L; + private final static double CS = .95257934441568037152; private final static double FXC = .92582009977255146156; private final static double FYC = 3.40168025708304504493; @@ -32,10 +35,20 @@ public class McBrydeThomasFlatPolarParabolicProjection extends Projection { private final static double C13 = .33333333333333333333; private final static double ONEEPS = 1.0000001; + /** + * Port of {@code mbtfpp_s_forward} ({@code 9.8.1:src/projections/mbtfpp.cpp:18-25}). + *

+ * Upstream reassigns {@code lp.phi = asin(CSy * sin(lp.phi))} and both following lines read + * the reassigned value. The previous transcription computed it into {@code out.y}, then + * overwrote {@code out.y} and used the original latitude in both formulas — 6.0 km at + * {@code +proj=mbtfpp +a=6400000} and {@code (2, 1)}. The inverse never had the defect, so the + * two directions were not mutual inverses. Note the constant is upstream's {@code CSy}; the + * field is named {@code CS} here for source compatibility. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - out.y = Math.asin(CS * Math.sin(lpphi)); - out.x = FXC * lplam * (2. * Math.cos(C23 * lpphi) - 1.); - out.y = FYC * Math.sin(C13 * lpphi); + double phi = ProjectionMath.asinChecked(CS * FastStrictTrig.sin(lpphi)); + out.x = FXC * lplam * (2. * FastStrictTrig.cos(C23 * phi) - 1.); + out.y = FYC * FastStrictTrig.sin(C13 * phi); return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarQuarticProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarQuarticProjection.java index bd4a5b2..58bfc65 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarQuarticProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarQuarticProjection.java @@ -19,12 +19,15 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class McBrydeThomasFlatPolarQuarticProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = 642253065229040967L; + private final static int NITER = 20; private final static double EPS = 1e-7; private final static double ONETOL = 1.000001; @@ -35,16 +38,39 @@ public class McBrydeThomasFlatPolarQuarticProjection extends PseudoCylindricalPr private final static double FXC = 0.31245971410378249250; private final static double RXC = 3.20041258076506210122; + /** + * Forward projection. Port of PROJ 9.8.1 {@code mbtfpq.cpp}'s {@code mbtfpq_s_forward}. + *

+ * Fail-closed, plus a repair the throw depends on. Two defects from the 2006 + * C→Java conversion: + *

    + *
  • the Newton iteration subtracted its correction from {@code out.y} — the caller's + * destination ordinate, holding whatever stale value was there — where upstream + * subtracts it from {@code lp.phi}. {@code lpphi} therefore never changed, so + * {@code th1} was the same value on every trip: the loop could not converge, and the two + * lines after it used the raw geographic latitude where the solved parametric latitude + * belongs;
  • + *
  • there was no convergence test, so exhausting {@code NITER} produced an ordinary-looking + * coordinate.
  • + *
+ */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - double th1, c; + double th1 = Double.NaN, c; int i; + final double phi = lpphi; c = C * Math.sin(lpphi); for (i = NITER; i > 0; --i) { - out.y -= th1 = (Math.sin(.5*lpphi) + Math.sin(lpphi) - c) / + lpphi -= th1 = (Math.sin(.5*lpphi) + Math.sin(lpphi) - c) / (.5*Math.cos(.5*lpphi) + Math.cos(lpphi)); if (Math.abs(th1) < EPS) break; } + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + EPS + + " within " + NITER + " iterations for latitude " + phi + + " rad (last correction " + th1 + ")"); + } out.x = FXC * lplam * (1.0 + 2. * Math.cos(lpphi)/Math.cos(0.5 * lpphi)); out.y = FYC * Math.sin(0.5 * lpphi); return out; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine1Projection.java index ffa7f37..8f93bcc 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine1Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine1Projection.java @@ -21,6 +21,8 @@ public class McBrydeThomasFlatPolarSine1Projection extends SineTangentSeriesProjection { + private static final long serialVersionUID = -7506592265021916377L; + public McBrydeThomasFlatPolarSine1Projection() { super( 1.48875, 1.36509, false ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine2Projection.java index 59f1aae..afb8ae2 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine2Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSine2Projection.java @@ -19,11 +19,14 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.util.ProjectionMath; public class McBrydeThomasFlatPolarSine2Projection extends Projection { + private static final long serialVersionUID = 3899250934609675619L; + private final static int MAX_ITER = 10; private final static double LOOP_TOL = 1e-7; private final static double C1 = 0.45503; @@ -33,18 +36,33 @@ public class McBrydeThomasFlatPolarSine2Projection extends Projection { private final static double C_y = 1.44492; private final static double C1_2 = 0.33333333333333333333333333; + /** + * Forward projection. Port of PROJ 9.8.1 {@code mbt_fps.cpp}'s {@code mbt_fps_s_forward}. + *

+ * Fail-closed, plus the same repair as {@code mbtfpq}: the iteration subtracted its + * correction from {@code out.y} — the caller's destination ordinate — instead of from + * {@code lpphi}, so the correction was constant across all {@code MAX_ITER} trips and the + * loop could never converge, and there was no convergence test to notice. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - double k, V, t; + double k, V = Double.NaN, t; int i; + final double phi = lpphi; k = C3 * Math.sin(lpphi); for (i = MAX_ITER; i > 0; i--) { t = lpphi / C2; - out.y -= V = (C1 * Math.sin(t) + Math.sin(lpphi) - k) / + lpphi -= V = (C1 * Math.sin(t) + Math.sin(lpphi) - k) / (C1_2 * Math.cos(t) + Math.cos(lpphi)); if (Math.abs(V) < LOOP_TOL) break; } + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + LOOP_TOL + + " within " + MAX_ITER + " iterations for latitude " + phi + + " rad (last correction " + V + ")"); + } t = lpphi / C2; out.x = C_x * lplam * (1. + 3. * Math.cos(lpphi)/Math.cos(t) ); out.y = C_y * Math.sin(t); diff --git a/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSinusoidalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSinusoidalProjection.java new file mode 100644 index 0000000..0d832e0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/McBrydeThomasFlatPolarSinusoidalProjection.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * McBryde-Thomas Flat-Polar Sinusoidal ({@code +proj=mbtfps}), + * {@code 9.8.1:src/projections/gn_sinu.cpp:157-169}. + * + *

This lives in {@code gn_sinu.cpp}, not with the other McBryde-Thomas projections. + * The commonly-cited file map places it elsewhere; it is {@code gn_sinu.cpp}'s fourth + * {@code PROJ_HEAD} and is simply the general sinusoidal series at + * {@code (m, n) = (0.5, 1.785398163397448309615660845)}. Writing it as its own algorithm + * would duplicate the Newton solve for nothing. + * + *

{@code n} is {@code (pi + 4)/4 = 1.7853981633974483096156608458...} written out to 28 + * digits. Only the first 17 survive as a {@code double}, but the literal is transcribed in + * full as upstream has it. + * + *

Not to be confused with the four McBryde-Thomas projections proj4j already has: + * {@code mbt_fps} (Flat-Polar Sine No. 2), {@code mbt_s} (Flat-Polar Sine No. 1, in + * {@code sts.cpp}), {@code mbtfpp} (Flat-Polar Parabolic) and {@code mbtfpq} (Flat-Polar + * Quartic). Five of the six are in three different upstream files. + * + * @see GeneralSinusoidalSeriesProjection + */ +public class McBrydeThomasFlatPolarSinusoidalProjection + extends GeneralSinusoidalSeriesProjection { + + private static final long serialVersionUID = 5318177017302017247L; + + public McBrydeThomasFlatPolarSinusoidalProjection() { + super(0.5, 1.785398163397448309615660845); + initialize(); + } + + public String toString() { + return "McBryde-Thomas Flat-Polar Sinusoidal"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/MercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/MercatorProjection.java index bb61df5..19b8967 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/MercatorProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/MercatorProjection.java @@ -19,35 +19,104 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.MathHelpers; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Mercator, a port of {@code 9.8.1:src/projections/merc.cpp}. + * + *

The northing is the isometric latitude {@code psi} scaled by {@code k0}, and 9.8.1 + * evaluates it directly rather than through {@code -log(tsfn(phi))}: + *

+ *   psi = asinh(tan(phi)) - e * atanh(e * sin(phi))
+ * 
+ * ({@code merc.cpp:11-20}). Two things follow. + * + *
    + *
  • At {@code phi = 0} both terms are exactly zero, so the northing is exactly zero. + * That is what {@code builtins.gie:4262-4265} demands: {@code accept 0 0 / expect 0 0} under + * {@code tolerance 0 m}. The old route through {@code ProjectionMath.tsfn} returned + * {@code 0.9999999999999999}, whose logarithm is {@code -1.11e-16}, i.e. a northing of + * {@code 7.08e-10 m} — small, but not zero, and the row admits nothing but zero. + *
  • {@code MathHelpers#asinh}'s {@code log1p} branch is what keeps the near-equatorial values + * accurate; the naive {@code log(1 + tiny)} form loses every significant bit there. + *
+ * + *

The inverse is {@code atan(sinhpsi2tanphi(sinh(y/k0), e))} ({@code merc.cpp:29-34}). Working + * from {@code sinh(psi) = tan(chi)} rather than from {@code ts = exp(-psi)} keeps the large-|y| + * behaviour exact — {@code builtins.gie:4300-4303} feeds a northing of {@code 1e10} and expects + * exactly 90 degrees — and replaces a 15-step {@code pow}-per-trip Newton loop that was up to + * 4,145 nm from the truth with a one-or-two-step Newton on {@code tau} that is about 2 nm. The + * {@code merc} inverse rows at {@code builtins.gie:4285-4297} are pinned at {@code tolerance + * 50 nm}; the old path missed them by 202 nm. + * + *

{@code +lat_ts} (Mercator variant B). {@code merc.cpp:47-67} derives the scale factor + * from the latitude of true scale, {@code k0 = msfn(sin(lat_ts), cos(lat_ts), es)} on an ellipsoid + * and {@code k0 = cos(lat_ts)} on a sphere, and it does so after the generic {@code +k_0} + * handling — so {@code +lat_ts} wins when both are given. proj4j read the parameter into + * {@link Projection#trueScaleLatitude} and then never used it, leaving {@code k0 = 1}: EPSG:3388 + * (Pulkovo 1942 / Caspian Sea Mercator, {@code +lat_ts=42}) was out by a factor of + * {@code msfn(42 deg, krass) = 0.744260894}, i.e. up to 1.3 million metres, and {@code gigs/5112} + * passed only its equator rows and its self-consistent round trips. + */ public class MercatorProjection extends CylindricalProjection { - + + private static final long serialVersionUID = 3547566065076844580L; + public MercatorProjection() { minLatitude = ProjectionMath.degToRad(-85); maxLatitude = ProjectionMath.degToRad(85); } - + + /** + * Applies {@code +lat_ts} to the scale factor, per {@code 9.8.1:merc.cpp:47-67}. + * + *

A {@code lat_ts} of exactly zero is indistinguishable from the parameter's absence in + * proj4j's parameter model, and it does not matter: both branches give {@code k0 = 1} there + * ({@code msfn(0, 1, es) = 1} and {@code cos(0) = 1}), so treating zero as "absent" + * differs from upstream only for the pathological {@code +lat_ts=0 +k_0=}, + * where upstream would discard the {@code k_0}. + */ + @Override + public void initialize() { + super.initialize(); + if (trueScaleLatitude != 0.0) { + double phits = Math.abs(trueScaleLatitude); + if (phits >= ProjectionMath.HALFPI) { + throw new InvalidValueException( + "Invalid value for lat_ts: |lat_ts| should be <= 90 degrees"); + } + scaleFactor = spherical + ? Math.cos(phits) + : ProjectionMath.msfn(Math.sin(phits), Math.cos(phits), es); + } + } + public ProjCoordinate project(double lam, double phi, ProjCoordinate out) { + out.x = scaleFactor * lam; if (spherical) { - out.x = scaleFactor * lam; - out.y = scaleFactor * Math.log(Math.tan(ProjectionMath.QUARTERPI + 0.5 * phi)); + // merc.cpp:23 -- asinh(tan(phi)), not log(tan(pi/4 + phi/2)). + out.y = scaleFactor * MathHelpers.asinh(Math.tan(phi)); } else { - out.x = scaleFactor * lam; - out.y = -scaleFactor * Math.log(ProjectionMath.tsfn(phi, Math.sin(phi), e)); + // merc.cpp:16-19. sin and cos rather than tan and sin so that a single sincos + // serves both, and so that phi = 0 yields exactly zero. + double sphi = Math.sin(phi); + double cphi = Math.cos(phi); + out.y = scaleFactor * (MathHelpers.asinh(sphi / cphi) - e * MathHelpers.atanh(e * sphi)); } return out; } public ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { - if (spherical) { - out.y = ProjectionMath.HALFPI - 2. * Math.atan(Math.exp(-y / scaleFactor)); - out.x = x / scaleFactor; - } else { - out.y = ProjectionMath.phi2(Math.exp(-y / scaleFactor), e); - out.x = x / scaleFactor; - } + out.x = x / scaleFactor; + // sinh(psi) == tan(chi) == tau'. merc.cpp:31 and :38. + double taup = Math.sinh(y / scaleFactor); + out.y = spherical + ? Math.atan(taup) + : Math.atan(ConformalLat.sinhpsi2tanphi(taup, e)); return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/MillerOblatedStereographicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/MillerOblatedStereographicProjection.java new file mode 100644 index 0000000..3c81cab --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/MillerOblatedStereographicProjection.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.util.Complex; + +/** + * Miller Oblated Stereographic, {@code +proj=mil_os} — + * {@code PJ_PROJECTION(mil_os)}, {@code 9.8.1:src/projections/mod_ster.cpp:133-149}. + * + *

Centred on (20°E, 18°N) for Europe and Africa, with a two-term coefficient table. + * {@code es} is forced to zero while {@code e} is left alone — see + * {@link ModifiedStereographicProjection}'s class comment for why that is reproduced rather + * than tidied. + * + * @since 1.5.0 + */ +public class MillerOblatedStereographicProjection extends ModifiedStereographicProjection { + + private static final long serialVersionUID = 4801588175232969176L; + + /** {@code mod_ster.cpp:135}, digit for digit. */ + private static final Complex[] AB = { + new Complex(0.924500, 0.), + new Complex(0., 0.), + new Complex(0.019430, 0.), + }; + + @Override + protected void setupVariant() { + setCoefficients(AB); + projectionLongitude = DTR * 20.; + projectionLatitude = DTR * 18.; + es = 0.; + } + + @Override + public String toString() { + return "Miller Oblated Stereographic"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/MillerProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/MillerProjection.java index de626bf..2b885ca 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/MillerProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/MillerProjection.java @@ -25,6 +25,8 @@ public class MillerProjection extends CylindricalProjection { + private static final long serialVersionUID = 8377360583137437497L; + public MillerProjection() { } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/MisrSpaceObliqueMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/MisrSpaceObliqueMercatorProjection.java new file mode 100644 index 0000000..fc823cf --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/MisrSpaceObliqueMercatorProjection.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Space Oblique Mercator for MISR, {@code +proj=misrsom} — {@code PJ_PROJECTION(misrsom)} of + * {@code 9.8.1:src/projections/som.cpp:271-297}. + * + *

A fixed parameterisation of {@link SpaceObliqueMercatorProjection} for the Multi-angle + * Imaging SpectroRadiometer aboard Terra. The whole operator is four assignments derived from + * {@code +path}: + * + *

+ *   lam0 = 129.3056° − (360°/233) × path
+ *   alf  = 98.30382°
+ *   p22  = 98.88 / 1440
+ *   rlm  = 0
+ * 
+ * + *

The constants are upstream's digits exactly. {@code 98.30382} and {@code 129.3056} are + * not roundings of anything and must not be re-derived from an orbital model; {@code 98.88 / 1440} + * is written as a division rather than as {@code 0.06866666666666667} so that the quotient is the + * one the compiler produces, which is what {@code builtins.gie} was generated against. + * + *

{@code +path} is required, and an absent one is upstream's error too

+ * + *

{@code Proj4Parser} dispatches {@code +path} to this class (and deliberately only to this class: + * {@code LandsatProjection} hard-codes {@code path = 120}, so the bridge treats the key as + * conditional). A definition that omits it arrives with {@code path = 0}, which upstream also + * rejects — {@code pj_param(..., "ipath").i} yields {@code 0} and {@code path <= 0} is an error — so + * refusing an unset path is upstream's own behaviour, not a divergence. + * + * @see SpaceObliqueMercatorProjection + * @since 1.5.0 + */ +public class MisrSpaceObliqueMercatorProjection extends SpaceObliqueMercatorProjection { + + private static final long serialVersionUID = -1805488731274182124L; + + /** {@code som.cpp:281} — the highest MISR path number. */ + public static final int MAX_PATH = 233; + + /** {@code som.cpp:288} — the ascending longitude at path 0, in degrees. */ + public static final double ASCENDING_LONGITUDE_AT_PATH_0_DEGREES = 129.3056; + + /** {@code som.cpp:289} — the orbital inclination, in degrees. */ + public static final double INCLINATION_DEGREES = 98.30382; + + /** {@code som.cpp:290} — the period of revolution, in minutes. */ + public static final double PERIOD_MINUTES = 98.88; + + /** 0 means "not set"; upstream rejects it, so it is a usable sentinel. */ + private int path; + + /** + * {@code +path} — the MISR orbital path number, in {@code [1, 233]}. + * + * @param path the path number + */ + public void setPath(int path) { + this.path = path; + } + + public int getPath() { + return path; + } + + /** + * {@code PJ_PROJECTION(misrsom)}: range-check {@code +path}, derive the four values, then run + * the shared {@code som_setup}. + */ + @Override + public void initialize() { + if (path <= 0 || path > MAX_PATH) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+path=" + path + ": Invalid value for path: path should be in [1, " + + MAX_PATH + "] range" + + (path == 0 ? ". +path is required for +proj=misrsom." : "")); + } + projectionLongitude = DTR * ASCENDING_LONGITUDE_AT_PATH_0_DEGREES + - ProjectionMath.TWOPI / 233. * path; + alf = INCLINATION_DEGREES * DTR; + p22 = PERIOD_MINUTES / 1440.0; + rlm = 0; + // Projection.initialize() for one_es/rone_es/totalScale, then som_setup. The generic + // som's [-2pi,2pi] / [0,pi] / >=0 checks are skipped deliberately: these three values are + // constants, upstream does not re-check them, and the derived lam0 for path 233 is + // -3.99 rad, which is inside [-2pi, 2pi] but would read oddly in an error message. + initializeShared(); + } + + @Override + public String toString() { + return "Space Oblique for MISR"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographic48Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographic48Projection.java new file mode 100644 index 0000000..e1fe29a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographic48Projection.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.util.Complex; + +/** + * Modified Stereographic of the 48 conterminous United States, {@code +proj=gs48} — + * {@code PJ_PROJECTION(gs48)}, {@code 9.8.1:src/projections/mod_ster.cpp:170-187}. + * + *

Centred on (96°W, 39°N), four coefficients, all purely real. It is the only variant + * that fixes the semi-major axis and zeroes {@code es} without offering an ellipsoidal + * table, so a definition giving any {@code +ellps} still projects on the sphere of radius + * 6 370 997 m — with {@code e} surviving into the conformal-latitude expression, as + * described in {@link ModifiedStereographicProjection}. + * + * @since 1.5.0 + */ +public class ModifiedStereographic48Projection extends ModifiedStereographicProjection { + + private static final long serialVersionUID = 1164249510041101502L; + + /** {@code mod_ster.cpp:172-174}, digit for digit. */ + private static final Complex[] AB = { + new Complex(0.98879, 0.), + new Complex(0., 0.), + new Complex(-0.050909, 0.), + new Complex(0., 0.), + new Complex(0.075528, 0.), + }; + + @Override + protected void setupVariant() { + setCoefficients(AB); + projectionLongitude = DTR * -96.; + projectionLatitude = DTR * 39.; + es = 0.; + a = SPHERE_A; + } + + @Override + public String toString() { + return "Mod. Stereographic of 48 U.S."; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographic50Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographic50Projection.java new file mode 100644 index 0000000..9f85b77 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographic50Projection.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.util.Complex; + +/** + * Modified Stereographic of the 50 United States, {@code +proj=gs50} — + * {@code PJ_PROJECTION(gs50)}, {@code 9.8.1:src/projections/mod_ster.cpp:221-262}. + * + *

Centred on (120°W, 45°N) with a ninth-order table — the largest in the family — + * because it has to cover the conterminous states, Alaska and Hawaii at once. Like {@code alsk} it + * carries separate ellipsoidal and spherical tables, selects on the requested {@code es}, and then + * replaces the ellipsoid with {@code a = 6378206.4}, {@code es = 0.00676866}. + * + *

The commented-out corpus row is worth knowing about: {@code builtins.gie} has + * + *

+ *   # For some reason, does not fail on MacOSX
+ *   #accept  60 -45
+ *   #expect  failure errno coord_transfm_outside_projection_domain
+ * 
+ * + * so the antipodal-ish point at (60°E, 45°S) is a platform-dependent failure upstream and + * is asserted by nobody. It is not counted in this projection's 16 assertions. + * + * @since 1.5.0 + */ +public class ModifiedStereographic50Projection extends ModifiedStereographicProjection { + + private static final long serialVersionUID = -5108252161217020877L; + + /** {@code mod_ster.cpp:223-229} — the GS50 ellipsoid table, digit for digit. */ + private static final Complex[] ABE = { + new Complex(.9827497, 0.), + new Complex(.0210669, .0053804), + new Complex(-.1031415, -.0571664), + new Complex(-.0323337, -.0322847), + new Complex(.0502303, .1211983), + new Complex(.0251805, .0895678), + new Complex(-.0012315, -.1416121), + new Complex(.0072202, -.1317091), + new Complex(-.0194029, .0759677), + new Complex(-.0210072, .0834037), + }; + + /** {@code mod_ster.cpp:231-238} — the GS50 sphere table, digit for digit. */ + private static final Complex[] ABS = { + new Complex(.9842990, 0.), + new Complex(.0211642, .0037608), + new Complex(-.1036018, -.0575102), + new Complex(-.0329095, -.0320119), + new Complex(.0499471, .1223335), + new Complex(.0260460, .0899805), + new Complex(.0007388, -.1435792), + new Complex(.0075848, -.1334108), + new Complex(-.0216473, .0776645), + new Complex(-.0225161, .0853673), + }; + + @Override + protected void setupVariant() { + projectionLongitude = DTR * -120.; + projectionLatitude = DTR * 45.; + // mod_ster.cpp:252-259. As alsk: test the requested es, then replace it. + if (es != 0.0) { + setCoefficients(ABE); + a = FIXED_A; + es = FIXED_ES; + e = Math.sqrt(es); + } else { + setCoefficients(ABS); + a = SPHERE_A; + } + } + + @Override + public String toString() { + return "Mod. Stereographic of 50 U.S."; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographicProjection.java new file mode 100644 index 0000000..1cd8971 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ModifiedStereographicProjection.java @@ -0,0 +1,280 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.Complex; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The shared kernel of {@code 9.8.1:src/projections/mod_ster.cpp}, which serves five + * {@code +proj=} names: {@code mil_os}, {@code lee_os}, {@code gs48}, {@code alsk} and + * {@code gs50}. + * + *

A modified stereographic projection is an oblique stereographic whose complex plane + * coordinate is post-multiplied by a low-order complex polynomial fitted to minimise scale error + * over one particular region. The forward is closed form; the inverse is a 20-iteration complex + * Newton solve of that polynomial followed by a 20-iteration {@code chi → phi} loop, both at + * {@code EPSLN = 1e-12}. + * + *

Each variant stomps the ellipsoid, and that is the contract

+ * + *

Every one of the five {@code PJ_PROJECTION} entry points overwrites part of the ellipsoid + * after the generic ellipsoid setup has run: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
what each variant fixes
{@code +proj=}{@code n}{@code lam0}{@code phi0}size/shape stomp
{@code mil_os}220°18°{@code es = 0}
{@code lee_os}2−165°−10°{@code es = 0}
{@code gs48}4−96°39°{@code es = 0}, {@code a = 6370997}
{@code alsk}5−152°64°ellipsoidal: {@code a = 6378206.4}, {@code es = 0.00676866}; + * spherical: {@code a = 6370997}
{@code gs50}9−120°45°as {@code alsk}
+ * + *

Three consequences, all of them upstream's and all reproduced: + * + *

    + *
  • {@code alsk} and {@code gs50} choose their coefficient table by testing the + * requested {@code es}, then replace it. So {@code +proj=alsk +ellps=clrk66} runs + * the ellipsoidal table at {@code es = 0.00676866} — not at clrk66's own + * {@code 0.0067686579972...}. The two differ in the eighth significant figure and the + * literal is the one {@code builtins.gie} was generated against, so it is written out + * digit for digit rather than derived.
  • + *
  • {@code mil_os}, {@code lee_os} and {@code gs48} zero {@code es} but leave {@code e} + * alone. {@code mod_ster_setup} then takes the spherical branch ({@code chio = phi0}) + * while the forward still evaluates {@code (1 − e sinφ)/(1 + e sinφ)} with the + * surviving eccentricity. It looks like a bug and may be one; the corpus only exercises these + * three with {@code +R=}, where {@code e} is zero anyway, so nothing pins it either way and + * non-negotiable 7 says reproduce it.
  • + *
  • {@code P->ra} is not recomputed after {@code P->a} is stomped, so upstream's inverse + * de-scales by the original semi-major axis. In all seven corpus operations the two + * are equal ({@code clrk66} is {@code a = 6378206.4}; the spherical rows all say + * {@code +R=6370997}), so the distinction is unobservable here and Proj4J's single + * {@code totalScale} is used for both directions.
  • + *
+ * + *

{@code ProjectionMath.zpoly1}/{@code zpoly1d} are used as-is

+ * + *

Both are faithful ports of {@code pj_zpoly1}/{@code pj_zpolyd1} and are not part of + * the deprecated {@code tsfn}/{@code phi2}/{@code mlfn} group. Their Java signatures take the + * coefficient array and infer {@code n = length − 1}, which matches upstream's convention that + * {@code C[0]} is present but always {@code (0,0)} — so {@code gs50}'s ten-element table is + * {@code n = 9}, exactly as {@code mod_ster.cpp} says. + * + *

This is not {@code ModStereoProjection.java}. That file still sits in this package with + * its class declaration inside a block comment, so it compiles to a bare {@code package} + * statement. It is a PROJ-4-era transcription — {@code MAX_ITER = 10}, {@code LOOP_TOL = 1e-7} — + * and both numbers are wrong for 9.8.1, which runs two 20-trip loops at {@code 1e-12}. It should + * be deleted; it is left alone here only because it is a pre-existing file. + * + * @since 1.5.0 + */ +public abstract class ModifiedStereographicProjection extends Projection { + + private static final long serialVersionUID = -5328346585275786686L; + + /** {@code mod_ster.cpp:15}, {@code #define EPSLN 1e-12}. */ + protected static final double EPSLN = 1e-12; + + /** {@code mod_ster.cpp:64,91} — both Newton loops run at most 20 trips. */ + protected static final int MAX_ITER = 20; + + /** + * {@code alsk}/{@code gs50}'s fixed ellipsoid. Upstream's literal, not clrk66's own value. + * {@code mod_ster.cpp:212,257}: {@code P->e = sqrt(P->es = 0.00676866);} + */ + protected static final double FIXED_ES = 0.00676866; + + /** {@code alsk}/{@code gs50}'s fixed semi-major axis, {@code mod_ster.cpp:211,256}. */ + protected static final double FIXED_A = 6378206.4; + + /** The spherical radius {@code gs48}, {@code alsk} and {@code gs50} fall back to. */ + protected static final double SPHERE_A = 6370997.; + + /** {@code Q->zcoeff}; {@code zcoeff[0]} is the unused {@code C_0} slot. */ + private Complex[] zcoeff; + + private double cchio; + private double schio; + + /** Scratch for {@link ProjectionMath#zpoly1d}'s derivative out-parameter. */ + private final Complex derivative = new Complex(0, 0); + + /** + * The variant's {@code PJ_PROJECTION} body: assign {@code projectionLongitude}, + * {@code projectionLatitude}, the coefficient table, and whatever part of the ellipsoid the + * variant fixes. Runs before {@link Projection#initialize()}, so an assignment to + * {@code a}, {@code e} or {@code es} here is picked up by {@code one_es}, {@code rone_es} and + * {@code totalScale}. + */ + protected abstract void setupVariant(); + + /** Assigns the coefficient table; called by {@link #setupVariant()}. */ + protected final void setCoefficients(Complex[] coefficients) { + this.zcoeff = coefficients; + } + + /** + * {@code PJ_PROJECTION()} followed by {@code mod_ster_setup} + * ({@code mod_ster.cpp:112-131}). + */ + @Override + public void initialize() { + setupVariant(); + super.initialize(); + final double chio; + if (es != 0.0) { + final double esphi = e * FastStrictTrig.sin(projectionLatitude); + chio = 2. * Math.atan( + FastStrictTrig.tan((ProjectionMath.HALFPI + projectionLatitude) * .5) + * Math.pow((1. - esphi) / (1. + esphi), e * .5)) + - ProjectionMath.HALFPI; + } else { + chio = projectionLatitude; + } + schio = FastStrictTrig.sin(chio); + cchio = FastStrictTrig.cos(chio); + } + + /** + * {@code mod_ster_e_forward} ({@code mod_ster.cpp:25-54}). + * + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} — the point antipodal to + * the projection centre in conformal space, where the stereographic denominator + * vanishes + */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double sinlon = FastStrictTrig.sin(lam); + final double coslon = FastStrictTrig.cos(lam); + final double esphi = e * FastStrictTrig.sin(phi); + final double chi = 2. * Math.atan( + FastStrictTrig.tan((ProjectionMath.HALFPI + phi) * .5) + * Math.pow((1. - esphi) / (1. + esphi), e * .5)) + - ProjectionMath.HALFPI; + final double schi = FastStrictTrig.sin(chi); + final double cchi = FastStrictTrig.cos(chi); + final double denom = 1. + schio * schi + cchio * cchi * coslon; + if (denom == 0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "modified-stereographic forward of (" + lam + ", " + phi + ") rad is " + + "outside the projection domain: the stereographic denominator " + + "1 + sin(chi0)sin(chi) + cos(chi0)cos(chi)cos(lam) is exactly zero"); + } + final double s = 2. / denom; + Complex p = new Complex(s * cchi * sinlon, s * (cchio * schi - schio * cchi * coslon)); + p = ProjectionMath.zpoly1(p, zcoeff); + xy.x = p.r; + xy.y = p.i; + return xy; + } + + /** + * {@code mod_ster_e_inverse} ({@code mod_ster.cpp:56-108}) — complex Newton on the + * coefficient polynomial, then Snyder's inverse stereographic, then a fixed-point solve for + * the geodetic latitude from the conformal one. + * + *

Upstream's {@code if (nn)} guards are reproduced by throwing rather than by + * {@code HUGE_VAL}: both loops are 20 trips at {@code 1e-12} and exhausting either means the + * answer is not known, which is not a coordinate. + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + int nn; + final Complex p = new Complex(x, y); + for (nn = MAX_ITER; nn != 0; --nn) { + final Complex fxy = ProjectionMath.zpoly1d(p, zcoeff, derivative); + final double fpxyR = derivative.r; + final double fpxyI = derivative.i; + fxy.r -= x; + fxy.i -= y; + final double den = fpxyR * fpxyR + fpxyI * fpxyI; + final double dpR = -(fxy.r * fpxyR + fxy.i * fpxyI) / den; + final double dpI = -(fxy.i * fpxyR - fxy.r * fpxyI) / den; + p.r += dpR; + p.i += dpI; + if ((Math.abs(dpR) + Math.abs(dpI)) <= EPSLN) { + break; + } + } + if (nn == 0) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "modified-stereographic inverse of (" + x + ", " + y + "): the complex " + + "Newton solve of the coefficient polynomial did not converge to " + + EPSLN + " within " + MAX_ITER + " iterations"); + } + + final double rh = ProjectionMath.hypot(p.r, p.i); + final double z = 2. * Math.atan(.5 * rh); + final double sinz = FastStrictTrig.sin(z); + final double cosz = FastStrictTrig.cos(z); + if (Math.abs(rh) <= EPSLN) { + // mod_ster.cpp:82-89: the input was (0, 0). Returning lam = 0 lets inv_finalize add + // lam0 and so land exactly on the projection centre. + lp.x = 0.0; + lp.y = projectionLatitude; + return lp; + } + final double chi = ProjectionMath.asinChecked(cosz * schio + p.i * sinz * cchio / rh); + double phi = chi; + for (nn = MAX_ITER; nn != 0; --nn) { + final double esphi = e * FastStrictTrig.sin(phi); + final double dphi = 2. * Math.atan( + FastStrictTrig.tan((ProjectionMath.HALFPI + chi) * .5) + * Math.pow((1. + esphi) / (1. - esphi), e * .5)) + - ProjectionMath.HALFPI - phi; + phi += dphi; + if (Math.abs(dphi) <= EPSLN) { + break; + } + } + if (nn == 0) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "modified-stereographic inverse of (" + x + ", " + y + "): the conformal " + + "latitude " + chi + " rad did not invert to a geodetic latitude " + + "within " + MAX_ITER + " iterations at " + EPSLN); + } + lp.y = phi; + lp.x = Math.atan2(p.r * sinz, rh * cchio * cosz - p.i * schio * sinz); + return lp; + } + + /** {@code mod_ster_setup} assigns both {@code P->fwd} and {@code P->inv}. */ + @Override + public boolean hasInverse() { + return true; + } + + @Override + public boolean isConformal() { + // Only approximately: the coefficient polynomial is fitted to reduce scale error, which + // trades conformality away. Upstream classes the whole family as "Azi(mod)" and makes no + // conformality claim, so neither does this. + return false; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/MolleweideProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/MolleweideProjection.java index f025924..13c7b57 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/MolleweideProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/MolleweideProjection.java @@ -21,15 +21,27 @@ import java.util.Objects; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.ProjectionMath; public class MolleweideProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = -5486373011751486338L; + + /** PROJ's {@code ONE_TOL} ({@code proj_internal.h}): the arcsine slop band. */ + private static final double ONE_TOL = 1.00000000000001; + public static final int MOLLEWEIDE = 0; public static final int WAGNER4 = 1; public static final int WAGNER5 = 2; - private static final int MAX_ITER = 10; + /** + * Matches PROJ 9.8.1 {@code moll.cpp}'s {@code MAX_ITER}, which is 30. Proj4J used 10, + * which reaches the non-convergence branch on inputs PROJ solves. + */ + private static final int MAX_ITER = 30; private static final double TOLERANCE = 1e-7; private int type = MOLLEWEIDE; @@ -77,9 +89,18 @@ public MolleweideProjection(double cx, double cy, double cp) { this.cp = cp; } + /** + * Forward projection, shared by {@code moll}, {@code wag4} and {@code wag5}. + *

+ * Fail-closed. PROJ's {@code moll.cpp} clamps to {@code ±M_HALFPI} — the pole — when + * the iteration exhausts {@code MAX_ITER}. Proj4J throws: the pole is a specific plausible + * coordinate, indistinguishable from a real result, and this kernel serves three + * projections so the clamp was reachable three ways. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { - double k, v; + double k, v = Double.NaN; int i; + final double phi = lpphi; k = cp * Math.sin(lpphi); for (i = MAX_ITER; i != 0; i--) { @@ -87,27 +108,71 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { if (Math.abs(v) < TOLERANCE) break; } - if (i == 0) - lpphi = (lpphi < 0.) ? -Math.PI/2 : Math.PI/2; - else - lpphi *= 0.5; + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + TOLERANCE + + " within " + MAX_ITER + " iterations for latitude " + phi + + " rad (last correction " + v + ")"); + } + lpphi *= 0.5; xy.x = cx * lplam * Math.cos(lpphi); xy.y = cy * Math.sin(lpphi); return xy; } + /** + * Inverse projection. + *

+ * Both arcsines are guarded. They used raw {@link Math#asin}, which returns {@code NaN} + * for {@code |arg| > 1} — reachable for any {@code |y| > cy}, i.e. any northing past the + * top of the map. The {@code NaN} then passed straight through + * {@code Projection.inverseProjectRadians}' ±π clamp (every comparison against + * {@code NaN} is false) and escaped as a {@code NaN} latitude whenever + * {@code +lon_0=0}. {@link #aasin} applies PROJ's tolerance band instead: within + * {@code ONE_TOL} of ±1 it clamps, beyond it throws. + *

+ * Note this deliberately does not use {@code ProjectionMath.asin}, which clamps + * silently for any argument however large and lets {@code NaN} through untouched — a + * clamp to the pole is the fail-open shape this whole change exists to remove. + */ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { double lat, lon; - lat = Math.asin(y / cy); + lat = aasin(y / cy, "y/cy"); lon = x / (cx * Math.cos(lat)); lat += lat; - lat = Math.asin((lat + Math.sin(lat)) / cp); + lat = aasin((lat + Math.sin(lat)) / cp, "(2*lat + sin(2*lat))/cp"); lp.x = lon; lp.y = lat; return lp; } + /** + * PROJ's {@code aasin} ({@code src/aasincos.cpp}): arcsine with a tolerance band of + * {@code ONE_TOL} for arguments that ought to be in [-1, 1] and have drifted out by + * rounding, and a hard error beyond it. + * + * @param v the arcsine argument + * @param what the expression that produced it, for the message + * @return the arcsine, radians + * @throws org.locationtech.proj4j.ProjectionException if {@code v} is NaN, or further than + * {@code ONE_TOL} outside [-1, 1] + */ + private double aasin(double v, String what) { + if (Double.isNaN(v)) { + throw new ProjectionException(this, "inverse is not defined: " + what + " is NaN"); + } + double av = Math.abs(v); + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException(this, "coordinate is outside the projection domain: " + + what + " = " + v + ", which is not in [-1, 1]"); + } + return v < 0.0 ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } + return Math.asin(v); + } + public boolean hasInverse() { return true; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Murdoch1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Murdoch1Projection.java index b3859c9..dc46249 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Murdoch1Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Murdoch1Projection.java @@ -21,6 +21,8 @@ public class Murdoch1Projection extends SimpleConicProjection { + private static final long serialVersionUID = 8171365878003847612L; + public Murdoch1Projection() { super( SimpleConicProjection.MURD1 ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Murdoch2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Murdoch2Projection.java index 2455120..8fe5808 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Murdoch2Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Murdoch2Projection.java @@ -21,6 +21,8 @@ public class Murdoch2Projection extends SimpleConicProjection { + private static final long serialVersionUID = 6165372053911476212L; + public Murdoch2Projection() { super( SimpleConicProjection.MURD2 ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Murdoch3Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Murdoch3Projection.java index 60c10d4..4425154 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Murdoch3Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Murdoch3Projection.java @@ -21,6 +21,8 @@ public class Murdoch3Projection extends SimpleConicProjection { + private static final long serialVersionUID = -8224355523532579696L; + public Murdoch3Projection() { super( SimpleConicProjection.MURD3 ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NaturalEarth2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/NaturalEarth2Projection.java new file mode 100644 index 0000000..c5796dd --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/NaturalEarth2Projection.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Natural Earth II ({@code +proj=natearth2}), a port of + * {@code 9.8.1:src/projections/natearth2.cpp}. + * + *

Tom Patterson's 2012 redesign, again fitted by Bojan Savric and Bernhard Jenny. Its + * meridians bend in much more sharply towards the poles than Natural Earth I's, which shows + * up in the polynomial as a very high-order onset: the northing's correction terms start at + * {@code phi^9} and the easting's at {@code phi^13}. + * + *

+ *   x = lam * (A0 + A1 phi^2 + phi^12 (A2 + A3 phi^2 + A4 phi^4 + A5 phi^6))
+ *   y = phi  * (B0 + phi^8 (B1 + B2 phi^2 + B3 phi^4))
+ * 
+ * + *

{@code phi6 * phi6} and {@code phi4 * phi4} ({@code natearth2.cpp:45-46}) are written + * that way upstream rather than as {@code pow}, and the grouping is load-bearing for + * reproducibility: {@code phi^12} formed as {@code (phi^6)^2} is not always the same double + * as {@code (phi^4)^3}. This transcription keeps upstream's factorisation exactly. + * + *

The derivative multipliers are {@code 1, 9, 11, 13} ({@code natearth2.cpp:26-29}) — + * the powers {@code phi^1, phi^9, phi^11, phi^13} that the four northing terms carry. + */ +public class NaturalEarth2Projection extends PolynomialPseudoCylindricalProjection { + + private static final long serialVersionUID = 74586258349547032L; + + private static final double A0 = 0.84719; + private static final double A1 = -0.13063; + private static final double A2 = -0.04515; + private static final double A3 = 0.05494; + private static final double A4 = -0.02326; + private static final double A5 = 0.00331; + + private static final double B0 = 1.01183; + private static final double B1 = -0.02625; + private static final double B2 = 0.01926; + private static final double B3 = -0.00396; + + // natearth2.cpp:26-29. + private static final double C0 = B0; + private static final double C1 = 9.0 * B1; + private static final double C2 = 11.0 * B2; + private static final double C3 = 13.0 * B3; + + /** {@code natearth2.cpp:31} — {@code 0.84719 * 0.535117535153096 * pi}. */ + private static final double MAX_Y = 0.84719 * 0.535117535153096 * Math.PI; + + protected double northing(double phi) { + final double phi2 = phi * phi; + final double phi4 = phi2 * phi2; + return phi * (B0 + phi4 * phi4 * (B1 + B2 * phi2 + B3 * phi4)); + } + + protected double northingDerivative(double phi) { + final double y2 = phi * phi; + final double y4 = y2 * y2; + return C0 + y4 * y4 * (C1 + C2 * y2 + C3 * y4); + } + + protected double eastingScale(double phi) { + final double phi2 = phi * phi; + final double phi4 = phi2 * phi2; + final double phi6 = phi2 * phi4; + return A0 + A1 * phi2 + phi6 * phi6 * (A2 + A3 * phi2 + A4 * phi4 + A5 * phi6); + } + + protected double maxY() { + return MAX_Y; + } + + public String toString() { + return "Natural Earth 2"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NaturalEarthProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/NaturalEarthProjection.java new file mode 100644 index 0000000..c1a5a98 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/NaturalEarthProjection.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Natural Earth ({@code +proj=natearth}), a port of + * {@code 9.8.1:src/projections/natearth.cpp}. + * + *

Designed by Tom Patterson (US National Park Service, 2007) in Flex Projector, where + * the graticule was specified every 5° and interpolated with cubic splines. The + * polynomial fit ported here is Bojan Savric's, and upstream's header notes that it + * deliberately deviates from Patterson's original by adding curvature to the + * meridians where they meet the horizontal pole line. So this is not an approximation to + * something more exact — it is the definition. + * + *

+ *   x = lam * (A0 + phi^2 (A1 + phi^2 (A2 + phi^6 (A3 + phi^2 A4))))
+ *   y = phi * (B0 + phi^2 (B1 + phi^4 (B2 + B3 phi^2 + B4 phi^4)))
+ * 
+ * + *

Note the {@code phi4 * phi2} in the easting ({@code natearth.cpp:51}): the {@code A3} + * and {@code A4} terms enter at {@code phi^8} and {@code phi^10}, not {@code phi^6} and + * {@code phi^8} as a uniform Horner nesting would give. The gap is intentional and is what + * the pole-line curvature costs. + */ +public class NaturalEarthProjection extends PolynomialPseudoCylindricalProjection { + + private static final long serialVersionUID = 4877781967558540161L; + + private static final double A0 = 0.8707; + private static final double A1 = -0.131979; + private static final double A2 = -0.013791; + private static final double A3 = 0.003971; + private static final double A4 = -0.001529; + + private static final double B0 = 1.007226; + private static final double B1 = 0.015085; + private static final double B2 = -0.044475; + private static final double B3 = 0.028874; + private static final double B4 = -0.005916; + + // natearth.cpp:33-37. Multipliers are the powers of phi each B term carries: + // phi^1, phi^3, phi^7, phi^9, phi^11. + private static final double C0 = B0; + private static final double C1 = 3.0 * B1; + private static final double C2 = 7.0 * B2; + private static final double C3 = 9.0 * B3; + private static final double C4 = 11.0 * B4; + + /** {@code natearth.cpp:39} — {@code 0.8707 * 0.52 * pi}. */ + private static final double MAX_Y = 0.8707 * 0.52 * Math.PI; + + protected double northing(double phi) { + final double phi2 = phi * phi; + final double phi4 = phi2 * phi2; + return phi * (B0 + phi2 * (B1 + phi4 * (B2 + B3 * phi2 + B4 * phi4))); + } + + protected double northingDerivative(double phi) { + final double y2 = phi * phi; + final double y4 = y2 * y2; + return C0 + y2 * (C1 + y4 * (C2 + C3 * y2 + C4 * y4)); + } + + protected double eastingScale(double phi) { + final double phi2 = phi * phi; + final double phi4 = phi2 * phi2; + return A0 + phi2 * (A1 + phi2 * (A2 + phi4 * phi2 * (A3 + phi2 * A4))); + } + + protected double maxY() { + return MAX_Y; + } + + public String toString() { + return "Natural Earth"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NellHProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/NellHProjection.java index eb0d4ea..704d9e0 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/NellHProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/NellHProjection.java @@ -19,11 +19,13 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; -import org.locationtech.proj4j.util.ProjectionMath; public class NellHProjection extends Projection { + private static final long serialVersionUID = -5588395073299363305L; + private final static int NITER = 9; private final static double EPS = 1e-7; @@ -33,22 +35,43 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * Inverse projection. Port of PROJ 9.8.1 {@code nell_h.cpp}'s {@code nell_h_s_inverse}. + *

+ * Fail-closed, and the iteration itself had to be repaired for that to mean + * anything. Two defects, both from the 2006 C→Java conversion: + *

    + *
  • the Newton iteration substituted the constant {@code xyy} for the running + * estimate everywhere upstream writes {@code lp.phi}, so the correction {@code V} was + * the same value on every trip and the loop could never converge unless it happened to + * satisfy the tolerance immediately;
  • + *
  • it accumulated into {@code out.y}, which is the caller's destination coordinate and + * holds whatever stale value the caller left there — {@code BasicCoordinateTransform} + * passes the same object as source and destination, so that was the input northing.
  • + *
+ * The combination meant the {@code i == 0} branch was taken for essentially every input, so + * {@code nell_h}'s inverse returned a pole almost unconditionally. Clamping to the + * pole is now a throw, and the iteration is upstream's, over a local initialised to + * {@code 0.0} exactly as upstream's {@code PJ_LP lp = {0.0, 0.0}} does. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - double V, c, p; + double V = Double.NaN, c, p, phi = 0.0; int i; p = 0.5 * xyy; for (i = NITER; i > 0 ; --i) { - c = Math.cos(0.5 * xyy); - out.y -= V = (xyy - Math.tan(xyy/2) - p)/(1. - 0.5/(c*c)); + c = Math.cos(0.5 * phi); + phi -= V = (phi - Math.tan(phi / 2) - p) / (1. - 0.5 / (c * c)); if (Math.abs(V) < EPS) break; } if (i == 0) { - out.y = p < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - out.x = 2. * xyx; - } else - out.x = 2. * xyx / (1. + Math.cos(xyy)); + throw new ConvergenceFailureException(this, + "inverse latitude iteration did not converge to " + EPS + " within " + NITER + + " iterations for northing " + xyy + " (last correction " + V + ")"); + } + out.y = phi; + out.x = 2. * xyx / (1. + Math.cos(phi)); return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NellProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/NellProjection.java index 3869f21..c372308 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/NellProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/NellProjection.java @@ -19,27 +19,54 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.util.ProjectionMath; public class NellProjection extends Projection { + private static final long serialVersionUID = 1682859829774558016L; + private final static int MAX_ITER = 10; private final static double LOOP_TOL = 1e-7; + /** + * Forward projection. Port of PROJ 9.8.1 {@code nell.cpp}'s {@code nell_s_forward}. + *

+ * Fail-closed, plus a repair the throw depends on. Three defects from the 2006 + * C→Java conversion, all the same mistranslation of C's mutate-then-read idiom: + *

    + *
  • the initial estimate was written as {@code out.y *= …} — scaling the caller's + * destination ordinate, i.e. whatever stale value it held — where upstream scales + * {@code lp.phi};
  • + *
  • the Newton correction was also subtracted from {@code out.y}, so {@code lpphi} never + * changed and the correction was identical on every trip;
  • + *
  • there was no convergence test, and the two output lines then used the unsolved + * {@code lpphi} — so {@code nell}'s forward was, in effect, {@code y = phi} with a + * cosine-of-the-wrong-angle easting.
  • + *
+ */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double k, V; int i; + final double phi = lpphi; k = 2. * Math.sin(lpphi); V = lpphi * lpphi; - out.y *= 1.00371 + V * (-0.0935382 + V * -0.011412); + lpphi *= 1.00371 + V * (-0.0935382 + V * -0.011412); + V = Double.NaN; for (i = MAX_ITER; i > 0 ; --i) { - out.y -= V = (lpphi + Math.sin(lpphi) - k) / + lpphi -= V = (lpphi + Math.sin(lpphi) - k) / (1. + Math.cos(lpphi)); if (Math.abs(V) < LOOP_TOL) break; } + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + LOOP_TOL + + " within " + MAX_ITER + " iterations for latitude " + phi + + " rad (last correction " + V + ")"); + } out.x = 0.5 * lplam * (1. + Math.cos(lpphi)); out.y = lpphi; return out; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NewZealandMapGridProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/NewZealandMapGridProjection.java index bfcd40e..44dd472 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/NewZealandMapGridProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/NewZealandMapGridProjection.java @@ -16,26 +16,63 @@ package org.locationtech.proj4j.proj; import static java.lang.Math.abs; -import static java.lang.Math.asin; -import static java.lang.Math.sin; import static org.locationtech.proj4j.util.ProjectionMath.EPS10; -import static org.locationtech.proj4j.util.ProjectionMath.HALFPI; -import static org.locationtech.proj4j.util.ProjectionMath.authlat; -import static org.locationtech.proj4j.util.ProjectionMath.authset; -import static org.locationtech.proj4j.util.ProjectionMath.qsfn; import static org.locationtech.proj4j.util.ProjectionMath.zpoly1; import static org.locationtech.proj4j.util.ProjectionMath.zpoly1d; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; -import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.Complex; import org.locationtech.proj4j.util.ProjectionMath; /** - * The New Zealand Map Grid projection. + * The New Zealand Map Grid projection, {@code 9.8.1:src/projections/nzmg.cpp}. + * + *

This projection does not use the auxiliary-latitude machinery, and upstream's does not + * either. It is a fixed-Earth fit: the two real series {@code tphi}/{@code tpsi} and the six + * complex coefficients {@code bf} are hard-coded constants published with the grid definition + * ({@code nzmg.cpp:41-51}), and there is no call to {@code pj_authalic_lat}, {@code pj_qsfn} or + * {@code pj_mlfn} anywhere in it. proj4j nonetheless carried static imports of + * {@code ProjectionMath.authlat}, {@code authset} and {@code qsfn} — together with {@code asin}, + * {@code sin} and {@code HALFPI} — none of which was ever referenced. They are removed rather than + * converted: re-pointing them at {@link org.locationtech.proj4j.util.AuthalicLat} would have + * created a dependency that upstream does not have and that no code path exercises. + * + *

(The numerics reference lists {@code nzmg} among the projections the authalic-latitude fix + * moves. That is wrong for this port, and the unused imports are why it looked otherwise.) + * + *

The enormous eastings far from New Zealand are upstream's answer, not a defect

+ * + *

A golden-master triage flagged {@code SYN proj/nzmg} probe 4 — {@code (31.2132034355964, 60)}, + * central Europe — returning {@code fx = -3.52e18 m}, and asked whether it is a failure expressed as + * a coordinate. It is not: PROJ 9.8.1 returns the same number. Verified by transcribing + * {@code nzmg_e_forward} and {@code pj_zpoly1} a second time, straight from the C and independently + * of this class; the two agree to the last ulp at every probe, and the independent transcription also + * reproduces {@code builtins.gie}'s own expected pair at {@code (2, 1)}, + * {@code 3352675144.747425100 / -7043205391.100243600}, which validates it against upstream rather + * than against us. + * + *

The mechanism is that this is a fixed-Earth polynomial fit, not a projection with a + * closed form. The forward composes a degree-10 real series in {@code (phi - phi0)} with a degree-6 + * complex one, so it is degree ~55 in the latitude offset, and {@code nzmg.cpp} contains no domain + * check in either direction. 101 degrees north of the fit's origin the polynomial simply is that + * large. The corpus is explicit about accepting it: its {@code +proj=nzmg +ellps=GRS80} block expects + * eastings of 3.35e9 m — millions of kilometres — as the correct answer. + * + *

So the remedy is an area-of-use rejection, which PROJ 9.8.1 does not have either, and + * not a finiteness or magnitude guard here: a guard would reject the four corpus rows that + * pin those 3.35e9 m values. Same category as the note on {@code EPSG:32602 -> EPSG:32717} in the + * defect register — "PROJ 9.8.1 also fails to reject; it needs area-of-use, not a finiteness check". + * + *

What did move at that probe is this class's semi-major axis, by the ratio + * {@code 6378388/6378137 = 1 + 3.9353e-5}: {@code -3.5203836748401444e18} to + * {@code -3.520522213147237e18}, a difference of {@code 1.3854e14}. That is the + * {@code initialize()}-ordering fix below, and it is the correction, not the defect. */ public class NewZealandMapGridProjection extends Projection { + private static final long serialVersionUID = -1889984720822872169L; + private final static Complex bf[] = { new Complex(.7557853228, 0.0), new Complex(.249204646, .003371507), @@ -49,8 +86,14 @@ public class NewZealandMapGridProjection extends Projection { private final static double tpsi[] = { .6399175073, -.1358797613, .063294409, -.02526853, .0117879, -.0055161, .0026906, -.001333, .00067, -.00034 }; - private final static double SECS_TO_RAD = 1E5 * ProjectionMath.DTR / 3600d; - private final static double RAD_TO_SECS = 1E-5 *ProjectionMath.RTD * 3600d; + /** + * {@code SEC5_TO_RAD}/{@code RAD_TO_SEC5} as {@code nzmg.cpp:36-37} writes them, rather than as + * {@code 1e5 * DTR / 3600} and {@code 1e-5 * RTD * 3600}. The two agree here, but rule 2 of + * this port is that a constant is taken digit-for-digit from upstream and not re-derived, so + * that the question never has to be asked again. + */ + private final static double SECS_TO_RAD = 0.4848136811095359935899141023; + private final static double RAD_TO_SECS = 2.062648062470963551564733573; public NewZealandMapGridProjection() { initialize(); @@ -95,20 +138,48 @@ protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) dst.y = tphi[i-1] + p.r * dst.y; } dst.y = projectionLatitude + p.r * dst.y * SECS_TO_RAD; - } else - dst.y = dst.x = Double.NaN; + } else { + // nzmg.cpp:111 answers HUGE_VAL here. A NaN pair would be caught by + // Projection.inverseProjectRadians' finiteness postcondition and reported as a + // numerical failure with no clue what failed, so say it here instead. + throw new ConvergenceFailureException(this, + "inverse complex-polynomial iteration did not converge to " + EPS10 + + " within 20 trips for (" + x + ", " + y + ")"); + } return dst; } + /** + * {@code PJ_PROJECTION(nzmg)}: five fixed values, and all five have to be assigned before + * {@code super.initialize()}. + *

+ * They were assigned after it, and {@link Projection#initialize()} is where + * {@code totalScale = a * fromMetres} and {@code totalFalseEasting = falseEasting * fromMetres} + * are derived. So on the first call — the one this class's constructor makes — the + * derived affine came from {@code a = 0} and {@code falseEasting = 0}; on the second, + * the one {@code Proj4Parser} makes after {@code setEllipsoid}, the false easting was right + * (the first call had left the field set) but {@code totalScale} came from whatever + * {@code +ellps} supplied. That is the "{@code initialize()} runs twice, and writing a derived + * value into a field it also reads is not idempotent" trap, and it is the only defect + * this projection had. + *

+ * It is measurable exactly because New Zealand Map Grid is a fixed-Earth fit: the corpus row is + * {@code +proj=nzmg +ellps=GRS80}, which PROJ answers on the International 1924 axis + * regardless, so proj4j's answer was short by the ratio {@code 6378137/6378388 = 1 - 3.935e-5} + * — 307 km at the corpus's test point, against a 0.1 mm bar. Subtracting the false + * easting from both sides reproduces that ratio to eleven digits, which is what identifies the + * scale rather than the series as the cause. + */ @Override public void initialize() { - super.initialize(); - // Force to International major axis + // Force to International 1924's major axis, and set lam0/phi0/x0/y0, all BEFORE + // super.initialize() derives totalScale and the total false easting/northing from them. a = 6378388.0; projectionLongitude = ProjectionMath.DTR * 173d; projectionLatitude = ProjectionMath.DTR * -41.; falseEasting = 2510000d; falseNorthing = 6023150d; + super.initialize(); } public String toString() { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NicolosiProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/NicolosiProjection.java index c76925a..a9afcb3 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/NicolosiProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/NicolosiProjection.java @@ -24,6 +24,8 @@ public class NicolosiProjection extends Projection { + private static final long serialVersionUID = 3300177092263201493L; + private final static double EPS = 1e-10; public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/NullProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/NullProjection.java index 5d484c7..4c359e4 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/NullProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/NullProjection.java @@ -22,6 +22,9 @@ * A projection which does nothing. Use this for drawing non-geographical overlays. */ public class NullProjection extends Projection { + + private static final long serialVersionUID = -594210686511856068L; + public NullProjection() { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ObliqueCylindricalEqualAreaProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueCylindricalEqualAreaProjection.java new file mode 100644 index 0000000..da46450 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueCylindricalEqualAreaProjection.java @@ -0,0 +1,223 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Oblique Cylindrical Equal Area, {@code +proj=ocea} — a port of + * {@code 9.8.1:src/projections/ocea.cpp}. Spherical only; both directions closed form. + * + *

A Lambert cylindrical equal-area map whose equator is an arbitrary great circle. The great + * circle is specified either as a point plus an azimuth ({@code +lat_0} {@code +lonc} + * {@code +alpha}) or as two points ({@code +lat_1} {@code +lon_1} {@code +lat_2} + * {@code +lon_2}), following Snyder's equations 9-1, 9-2, 9-7 and 9-8. + * + *

Which form is used is decided by PRESENCE, not by value

+ * + *

{@code pj_param(P->ctx, P->params, "talpha").i} is the {@code 't'} sigil, which tests + * whether the key appears at all. So {@code +alpha=0} selects the azimuth form — the + * corpus relies on this at {@code builtins.gie:5114}, whose {@code +lat_0=45 +alpha=0} must give + * the same point as the two-point block above it. {@link Projection#alpha} is {@code NaN} until + * {@code Proj4Parser} assigns it, so {@code !Double.isNaN(alpha)} is exactly the presence test; + * {@code +lonc}, read only inside that branch, is {@code NaN}-defaulted the same way and + * upstream's absent value is 0. + * + *

{@code +lon_0} is overwritten, and {@code +lat_0} is read only in the azimuth form

+ * + *

{@code P->lam0 = lam_p + M_HALFPI}: the central meridian is derived, so any + * {@code +lon_0} the user gave is discarded. That is why {@code initialize()} assigns + * {@link Projection#projectionLongitude} rather than reading it, and it is idempotent because + * {@code lam_p} depends on none of the values being written. + * + *

Upstream's two guards, reproduced

+ * + *
    + *
  • {@code if (lam_1 == -M_HALFPI) lam_p = -lam_p;} — an exact-equality test on a + * parsed double, commented "take care of P->lam0 wrap-around when +lam_1=-90". Kept as an + * exact comparison, because a tolerance would change which definitions it catches.
  • + *
  • {@code if (tan(phi_1) == 0.0)} — upstream's own comment says it is unsure + * whether the case should be supported and that the branch "gives the same result as the below + * atan()"; it substitutes {@code -pi/2} or {@code +pi/2} on the sign of + * {@code cos(lam_p - lam_1)}. Also an exact comparison upstream.
  • + *
+ * + *

Known parser gap: {@code +lon_1}/{@code +lon_2}

+ * + *

{@code Proj4Parser} dispatches {@code +lon_1}/{@code +lon_2} to + * {@link ObliqueMercatorProjection} and nothing else, so the setters below are currently + * unreachable from a proj-string and both longitudes stay 0. Six of the corpus's eleven + * {@code ocea} operations pass anyway — four use the azimuth form and two spell + * {@code +lon_1=0 +lon_2=0}, which is the default. The three that give {@code +lon_2} a non-zero + * value ({@code 1e-8}, {@code -1e-8}, {@code 1e-5}) are wrong until an + * {@code instanceof ObliqueCylindricalEqualAreaProjection} branch joins the {@code omerc} one. + * + * @see 9.8.1 + * ocea.cpp + */ +public class ObliqueCylindricalEqualAreaProjection extends CylindricalProjection { + + private static final long serialVersionUID = 653521617477232236L; + + /** {@code Q->rok}, {@code 1/k_0}. */ + private double rok; + /** {@code Q->rtk}, {@code k_0}. */ + private double rtk; + /** {@code Q->sinphi}, the sine of the derived pole latitude. */ + private double sinphip; + /** {@code Q->cosphi}, the cosine of the derived pole latitude. */ + private double cosphip; + + /** {@code +lon_1}, in radians. Upstream's absent value is 0. */ + private double lon1 = 0.0; + /** {@code +lon_2}, in radians. Upstream's absent value is 0. */ + private double lon2 = 0.0; + + /** + * {@code +lon_1}, the longitude of the first defining point. + * + * @param lon1 the longitude, in radians + */ + public void setLon1(double lon1) { + this.lon1 = lon1; + } + + /** + * The {@code +lon_1} in force. + * + * @return the longitude, in radians + */ + public double getLon1() { + return lon1; + } + + /** + * {@code +lon_2}, the longitude of the second defining point. + * + * @param lon2 the longitude, in radians + */ + public void setLon2(double lon2) { + this.lon2 = lon2; + } + + /** + * The {@code +lon_2} in force. + * + * @return the longitude, in radians + */ + public double getLon2() { + return lon2; + } + + /** Port of {@code PJ_PROJECTION(ocea)} ({@code ocea.cpp:47-110}). */ + @Override + public void initialize() { + super.initialize(); + rok = 1. / scaleFactor; + rtk = scaleFactor; + + final double lamp; + final double phip; + if (!Double.isNaN(alpha)) { + // One point plus one azimuth. The + M_PI is upstream's, so that alpha is measured + // clockwise from north from point 1 towards point 2, consistent with omerc. + final double alph = Math.PI + alpha; + final double lonz = Double.isNaN(lonc) ? 0.0 : lonc; + final double sinAlpha = FastStrictTrig.sin(alph); + lamp = StrictMath.atan2(-FastStrictTrig.cos(alph), + -FastStrictTrig.sin(projectionLatitude) * sinAlpha) + lonz; + phip = StrictMath.asin(FastStrictTrig.cos(projectionLatitude) * sinAlpha); + } else { + // Two points. Snyder 9-1 and 9-2. + final double phi1 = projectionLatitude1; + final double phi2 = projectionLatitude2; + final double lam1 = lon1; + final double lam2 = lon2; + final double cosPhi1 = FastStrictTrig.cos(phi1); + final double cosPhi2 = FastStrictTrig.cos(phi2); + final double sinPhi1 = FastStrictTrig.sin(phi1); + final double sinPhi2 = FastStrictTrig.sin(phi2); + double lp = StrictMath.atan2( + cosPhi1 * sinPhi2 * FastStrictTrig.cos(lam1) + - sinPhi1 * cosPhi2 * FastStrictTrig.cos(lam2), + sinPhi1 * cosPhi2 * FastStrictTrig.sin(lam2) + - cosPhi1 * sinPhi2 * FastStrictTrig.sin(lam1)); + // ocea.cpp:88-89, verbatim including the exact equality. + if (lam1 == -ProjectionMath.HALFPI) { + lp = -lp; + } + lamp = lp; + final double cosLampMinusLam1 = FastStrictTrig.cos(lamp - lam1); + final double tanPhi1 = FastStrictTrig.tan(phi1); + if (tanPhi1 == 0.0) { + phip = (cosLampMinusLam1 >= 0.0) ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } else { + phip = StrictMath.atan(-cosLampMinusLam1 / tanPhi1); + } + } + // ocea.cpp:105-109. The central meridian is derived, so +lon_0 is discarded. + projectionLongitude = lamp + ProjectionMath.HALFPI; + cosphip = FastStrictTrig.cos(phip); + sinphip = FastStrictTrig.sin(phip); + es = 0.; + } + + /** {@code ocea_s_forward}, {@code ocea.cpp:21-32}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double sinlam = FastStrictTrig.sin(lam); + final double t = FastStrictTrig.cos(lam); + double x = StrictMath.atan( + (FastStrictTrig.tan(phi) * cosphip + sinphip * sinlam) / t); + if (t < 0.) { + x += Math.PI; + } + xy.x = x * rtk; + xy.y = rok * (sinphip * FastStrictTrig.sin(phi) + - cosphip * FastStrictTrig.cos(phi) * sinlam); + return xy; + } + + /** {@code ocea_s_inverse}, {@code ocea.cpp:34-45}. */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + final double yy = y / rok; + final double xx = x / rtk; + final double t = Math.sqrt(1. - yy * yy); + final double s = FastStrictTrig.sin(xx); + lp.y = StrictMath.asin(yy * sinphip + t * cosphip * s); + lp.x = StrictMath.atan2(t * sinphip * s - yy * cosphip, t * FastStrictTrig.cos(xx)); + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public boolean isEqualArea() { + return true; + } + + @Override + public String toString() { + return "Oblique Cylindrical Equal Area"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ObliqueMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueMercatorProjection.java index 28e97c7..3067006 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/ObliqueMercatorProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueMercatorProjection.java @@ -21,30 +21,128 @@ import java.util.Objects; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.datum.Ellipsoid; import org.locationtech.proj4j.util.ProjectionMath; /** -* Oblique Mercator Projection algorithm is taken from the USGS PROJ package. -*/ + * Oblique Mercator (+proj=omerc), ported from + * {@code 9.8.1:src/projections/omerc.cpp}. + * + *

Parameter precedence, which is where this projection went wrong twice

+ * + * Upstream reads the centre-line either as an azimuth ({@code +alpha} and/or + * {@code +gamma}, with {@code +lonc} for the centre) or as two points + * ({@code +lat_1}/{@code +lon_1}, {@code +lat_2}/{@code +lon_2}). The azimuth form wins whenever + * either {@code +alpha} or {@code +gamma} is present ({@code omerc.cpp:135-146}), and in that form + * {@code +lon_0} is ignored outright — {@code omerc.cpp:193-195} logs a trace and never reads + * it, because {@code P->lam0} is derived from {@code +lonc} and the azimuth. Both branches + * therefore overwrite {@link #projectionLongitude}. + * + *

Two defects lived in the old translation of that block, both silent: + * + *

    + *
  • {@code Gamma} was a plain {@code double}, so it defaulted to {@code 0.0} rather than + * {@code NaN}. The "was {@code +gamma} supplied?" test was consequently always true, the + * {@code gamma = alpha} default was dead code, and any {@code +alpha} given without + * {@code +gamma} got a rotation of zero. On RSO Borneo that is 215,218.8 m easting and + * 303,073.5 m northing.
  • + *
  • {@code u_0} was computed with {@code cos(gamma)} where upstream uses {@code cos(alpha_c)} + * ({@code omerc.cpp:296}). On RSO Borneo, where {@code gamma != alpha}, that is + * 2,532.3 m easting and 1,899.2 m northing. The two defects interact: with {@code gamma} + * wrongly {@code 0}, {@code cos(gamma)} is {@code 1.0}, so neither error can be measured without + * fixing the other.
  • + *
+ * + *

Three further divergences from 9.8.1 were found while fixing those and are fixed here too: + * the {@code |cos(B*lam)| < TOL} continuation used {@code A*B*lam} where upstream uses + * {@code A*lam} (wrong by a factor of {@code B^2}); the main branch used + * {@code atan(y/x)} plus {@code +pi} for {@code x < 0}, which is {@code atan2} only for + * {@code y >= 0} and is out by {@code 2*pi*A/B} for {@code y < 0}; and the pole branch shared the + * non-pole domain check, where upstream evaluates precomputed {@code v_pole_n}/{@code v_pole_s}. + * + *

Known remaining gaps

+ * + *

{@code +no_off}, {@code +lon_1} and {@code +lon_2} used to be listed here. All three are now + * {@code Proj4Keyword}s and all three are dispatched — {@code +no_off} through + * {@link #setNoUoff(boolean)} (upstream ORs the two spellings, {@code omerc.cpp:139-143}) and the two + * longitudes through {@link #setLon1(double)}/{@link #setLon2(double)}. Two remain: + * + *

    + *
  • {@code +no_rot} has a setter ({@link #setNoRot(boolean)}) but is not yet registered as a + * {@code Proj4Keyword} and is not in the bridge's honoured set. Registering it without the setter + * would have been the dangerous order: the bridge would have called two {@code builtins.gie} + * blocks executable and they would have returned a rotated answer where PROJ returns an + * unrotated one. With the setter in place the key can now be added to {@code Proj4Keyword} and to + * the bridge's honoured set in one change.
  • + *
  • A bare {@code +proj=omerc} with no {@code +alpha}, {@code +gamma}, {@code +lat_1} or + * {@code +lat_2} keeps the historic placeholder {@code alpha = -45} degrees rather than failing. + * Upstream rejects it ("lat_1 should be different from 0"). The placeholder cannot simply be + * removed: {@code Registry.getProjection} instantiates through the no-argument constructor + * before any parameter is set, so a throwing constructor would make every {@code omerc} + * definition unparseable.
  • + *
+ */ public class ObliqueMercatorProjection extends CylindricalProjection { + private static final long serialVersionUID = -8211259010341855542L; + private final static double TOL = 1.0e-7; - private double lamc, lam1, phi1, lam2, phi2, Gamma, al, bl, el, singam, cosgam, sinrot, cosrot, u_0; - private boolean ellips, rot, no_uoff; + /** Upstream's {@code lamc}: the centre longitude, {@code +lonc}, defaulting to 0. */ + private double lamc; + /** Upstream's {@code lam1}/{@code lam2}: {@code +lon_1}/{@code +lon_2}, defaulting to 0. */ + private double lam1, lam2; + /** Upstream's {@code A}, {@code B}, {@code E}, {@code rB = 1/B}, {@code ArB}, {@code BrA}. */ + private double al, bl, el, rb, arb, bra; + private double singam, cosgam, sinrot, cosrot, u_0, v_pole_n, v_pole_s; + + /** + * Upstream's {@code Q->rot}: whether to rotate the (u, v) frame by {@code gamma} on the way out. + *

+ * {@code omerc.cpp:145} reads it as {@code !pj_param(..., "tno_rot").i}, so the default is + * {@code true} and {@code +no_rot} turns it off. It used to be assigned {@code rot = true} + * unconditionally inside {@link #initialize()} with no setter, which meant the parser had nowhere + * to deliver the key even if it recognised it. See {@link #setNoRot(boolean)}. + */ + private boolean rot = true; + private boolean no_uoff; + + /** + * The {@code +gamma} parameter exactly as supplied, in radians, or {@code NaN} when it was not + * supplied. The {@code NaN} is the whole point: it is the only record that the parameter is + * absent, and when this field was a plain {@code double} defaulting to {@code 0.0} every + * {@code +alpha}-only definition silently lost its rotation. Never overwritten by + * {@link #initialize()} — the derived rotation angle is a local there, so a second + * {@code initialize()} sees the same inputs as the first. + */ + private double gamma = Double.NaN; + + /** + * Whether {@code +alpha} was set by a caller, as opposed to left at the no-argument + * constructor's placeholder. {@link #alpha} alone cannot answer that, because the placeholder is + * a real number. + */ + private boolean alphaExplicit; + + /** Whether {@code +lat_1}/{@code +lat_2} were set, i.e. whether the two-point form was asked for. */ + private boolean lat1Explicit, lat2Explicit; public ObliqueMercatorProjection() { ellipsoid = Ellipsoid.WGS84; - projectionLatitude = Math.toRadians(0); - projectionLongitude = Math.toRadians(0); - minLongitude = Math.toRadians(-60); - maxLongitude = Math.toRadians(60); - minLatitude = Math.toRadians(-80); - maxLatitude = Math.toRadians(80); - alpha = Math.toRadians(-45);//FIXME + projectionLatitude = ProjectionMath.toRad(0); + projectionLongitude = ProjectionMath.toRad(0); + minLongitude = ProjectionMath.toRad(-60); + maxLongitude = ProjectionMath.toRad(60); + minLatitude = ProjectionMath.toRad(-80); + maxLatitude = ProjectionMath.toRad(80); + // Placeholder, deliberately NOT marked explicit: it keeps this constructor - and therefore + // Registry.getProjection("omerc") - from throwing, while still letting a later +gamma, + // +lat_1 or +lat_2 take precedence over it. See the class javadoc. + alpha = ProjectionMath.toRad(-45); initialize(); } @@ -53,54 +151,86 @@ public ObliqueMercatorProjection() { */ public ObliqueMercatorProjection(Ellipsoid ellipsoid, double lon_0, double lat_0, double alpha, double k, double x_0, double y_0) { setEllipsoid(ellipsoid); - lamc = lon_0; + // +lonc, not +lon_0: upstream derives lam0 from lonc and ignores lon_0 entirely, and + // initialize() reads lonc. Assigning lamc here was pointless - initialize() overwrote it. + lonc = lon_0; projectionLatitude = lat_0; this.alpha = alpha; + this.alphaExplicit = true; scaleFactor = k; falseEasting = x_0; falseNorthing = y_0; initialize(); } + /** + * Port of {@code PJ_PROJECTION(omerc)} ({@code omerc.cpp:120-306}). + * + * @throws InvalidValueException for each of upstream's five parameter rejections + */ public void initialize() { super.initialize(); double con, com, cosphi0, d, f, h, l, sinphi0, p, j, gamma0; - //FIXME-setup rot, alpha, longc,lon/lat1/2 - rot = true; - lamc = lonc; - - // true if alpha provided - int azi = Double.isNaN(alpha) ? 0 : 1; - // true if gamma provided - int gzi = Double.isNaN(Gamma) ? 0 : 1; - if (azi != 0) { // alpha specified - if (Math.abs(alpha) <= TOL || - Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) <= TOL || - Math.abs(Math.abs(alpha) - ProjectionMath.HALFPI) <= TOL) - throw new ProjectionException("Obl 1"); + // `rot` is NOT reset here. It is a parameter, not a derived value: assigning it in + // initialize() - which runs twice, once from a constructor and once from the parser - would + // discard whatever setNoRot() had been told and make this method non-idempotent in the one + // field a caller can actually set. Its default lives on the field declaration. + + // Upstream's `gam`/`alp`. Either one selects the azimuth form (omerc.cpp:135). + final boolean gam = !Double.isNaN(gamma); + final boolean twoPoint = lat1Explicit || lat2Explicit; + // The placeholder alpha counts only when nothing else was given at all; see the class javadoc. + final boolean alp = alphaExplicit || (!gam && !twoPoint); + + // Upstream's phi1/phi2, defaulting to 0 exactly as pj_param does for an absent key. + final double phi1 = lat1Explicit ? projectionLatitude1 : 0.0; + final double phi2 = lat2Explicit ? projectionLatitude2 : 0.0; + + // Upstream's alpha_c: the azimuth actually used, derived in the two-point and gamma-only + // forms. A local, not the alpha field, so initialize() stays idempotent. + double alphaC = alp ? alpha : 0.0; + + if (alp || gam) { + // omerc.cpp:136. +lonc defaults to 0; +lon_0 is ignored (omerc.cpp:193-195). + lamc = Double.isNaN(lonc) ? 0.0 : lonc; } else { - if (Math.abs(phi1 - phi2) <= TOL || - (con = Math.abs(phi1)) <= TOL || - Math.abs(con - ProjectionMath.HALFPI) <= TOL || - Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) <= TOL || - Math.abs(Math.abs(phi2) - ProjectionMath.HALFPI) <= TOL) throw new ProjectionException("Obl 2"); + // omerc.cpp:148-192. Upstream's four two-point rejections, in its order. + if (Math.abs(phi1) > ProjectionMath.HALFPI - TOL) { + throw new InvalidValueException( + "Invalid value for +lat_1: |lat_1| should be < 90 degrees, but is " + + Math.toDegrees(phi1)); + } + if (Math.abs(phi2) > ProjectionMath.HALFPI - TOL) { + throw new InvalidValueException( + "Invalid value for +lat_2: |lat_2| should be < 90 degrees, but is " + + Math.toDegrees(phi2)); + } + if (Math.abs(phi1 - phi2) <= TOL) { + throw new InvalidValueException( + "Invalid value for +lat_1/+lat_2: lat_1 should be different from lat_2, but " + + "both are " + Math.toDegrees(phi1) + " degrees"); + } + if (Math.abs(phi1) <= TOL) { + throw new InvalidValueException( + "Invalid value for +lat_1: lat_1 should be different from 0"); + } + if (Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) <= TOL) { + throw new InvalidValueException( + "Invalid value for +lat_0: |lat_0| should be < 90 degrees, but is " + + Math.toDegrees(projectionLatitude)); + } } - com = (spherical = es == 0.) ? 1 : Math.sqrt(one_es); + + com = Math.sqrt(one_es); if (Math.abs(projectionLatitude) > EPS10) { sinphi0 = Math.sin(projectionLatitude); cosphi0 = Math.cos(projectionLatitude); - if (!spherical) { - con = 1. - es * sinphi0 * sinphi0; - bl = cosphi0 * cosphi0; - bl = Math.sqrt(1. + es * bl * bl / one_es); - al = bl * scaleFactor * com / con; - d = bl * com / (cosphi0 * Math.sqrt(con)); - } else { - bl = 1.; - al = scaleFactor; - d = 1. / cosphi0; - } + con = 1. - es * sinphi0 * sinphi0; + bl = cosphi0 * cosphi0; + bl = Math.sqrt(1. + es * bl * bl / one_es); + al = bl * scaleFactor * com / con; + d = bl * com / (cosphi0 * Math.sqrt(con)); if ((f = d * d - 1.) <= 0.) f = 0.; else { @@ -109,128 +239,241 @@ public void initialize() { f = -f; } el = f += d; - if (!spherical) - el *= Math.pow(ProjectionMath.tsfn(projectionLatitude, sinphi0, e), bl); - else - el *= Math.tan(.5 * (ProjectionMath.HALFPI - projectionLatitude)); + // tsfn degenerates to tan(pi/4 - phi/2) at e == 0, so upstream needs no spherical + // branch here and neither does this. + el *= Math.pow(ProjectionMath.tsfn(projectionLatitude, sinphi0, e), bl); } else { bl = 1. / com; al = scaleFactor; el = d = f = 1.; } - if (azi != 0 || gzi != 0) { - if (azi != 0) { - gamma0 = Math.asin(Math.sin(alpha) / d); - if(gzi == 0) { - Gamma = alpha; + if (alp || gam) { + if (alp) { + gamma0 = ProjectionMath.asinChecked(Math.sin(alphaC) / d); + } else { + gamma0 = gamma; + // omerc.cpp:236-247: |gamma| must be <= asin(1/D), and upstream turns aasin's errno + // into exactly this message. + double sinAlphaC = d * Math.sin(gamma0); + if (Math.abs(sinAlphaC) > ProjectionMath.ONE_TOL) { + throw new InvalidValueException( + "Invalid value for +gamma: given lat_0 = " + Math.toDegrees(projectionLatitude) + + " degrees, |gamma| should be <= " + + Math.toDegrees(Math.asin(1. / d)) + " degrees, but is " + + Math.toDegrees(gamma0)); } - }else { - gamma0 = Gamma; - alpha = Math.asin(d * Math.sin(gamma0)); + alphaC = ProjectionMath.asinChecked(sinAlphaC); } - projectionLongitude = lamc - Math.asin((.5 * (f - 1. / f)) * - Math.tan(gamma0)) / bl; - } else { - if (!spherical) { - h = Math.pow(ProjectionMath.tsfn(phi1, Math.sin(phi1), e), bl); - l = Math.pow(ProjectionMath.tsfn(phi2, Math.sin(phi2), e), bl); - } else { - h = Math.tan(.5 * (ProjectionMath.HALFPI - phi1)); - l = Math.tan(.5 * (ProjectionMath.HALFPI - phi2)); + + if (Math.abs(Math.abs(projectionLatitude) - ProjectionMath.HALFPI) <= TOL) { + throw new InvalidValueException( + "Invalid value for +lat_0: |lat_0| should be < 90 degrees, but is " + + Math.toDegrees(projectionLatitude)); } + + projectionLongitude = lamc + - ProjectionMath.asinChecked(.5 * (f - 1. / f) * Math.tan(gamma0)) / bl; + } else { + h = Math.pow(ProjectionMath.tsfn(phi1, Math.sin(phi1), e), bl); + l = Math.pow(ProjectionMath.tsfn(phi2, Math.sin(phi2), e), bl); f = el / h; p = (l - h) / (l + h); + if (p == 0) { + throw new InvalidValueException( + "Invalid value for eccentricity: it is so close to 1 that the two-point " + + "centre line is undefined"); + } j = el * el; j = (j - l * h) / (j + l * h); - if ((con = lam1 - lam2) < -Math.PI) - lam2 -= ProjectionMath.TWOPI; + double lam2Adj = lam2; + if ((con = lam1 - lam2Adj) < -Math.PI) + lam2Adj -= ProjectionMath.TWOPI; else if (con > Math.PI) - lam2 += ProjectionMath.TWOPI; - projectionLongitude = ProjectionMath.normalizeLongitude(.5 * (lam1 + lam2) - Math.atan( - j * Math.tan(.5 * bl * (lam1 - lam2)) / p) / bl); - gamma0 = Math.atan(2. * Math.sin(bl * ProjectionMath.normalizeLongitude(lam1 - projectionLongitude)) / - (f - 1. / f)); - Gamma = Math.asin(d * Math.sin(gamma0)); - alpha = Gamma; + lam2Adj += ProjectionMath.TWOPI; + projectionLongitude = ProjectionMath.normalizeLongitude(.5 * (lam1 + lam2Adj) - Math.atan( + j * Math.tan(.5 * bl * (lam1 - lam2Adj)) / p) / bl); + final double denom = f - 1. / f; + if (denom == 0) { + throw new InvalidValueException( + "Invalid value for eccentricity: the two-point centre line azimuth is " + + "undefined"); + } + gamma0 = Math.atan(2. * Math.sin(bl + * ProjectionMath.normalizeLongitude(lam1 - projectionLongitude)) / denom); + alphaC = ProjectionMath.asinChecked(d * Math.sin(gamma0)); } + + // Upstream's `gamma`: the rotation angle. In the azimuth form with no +gamma it is alpha + // (omerc.cpp:233-234 - the default this class used to have as dead code); in the two-point + // form it is the derived azimuth (omerc.cpp:288). + final double gammaRot = gam ? gamma : alphaC; + singam = Math.sin(gamma0); cosgam = Math.cos(gamma0); - sinrot = Math.sin(Gamma); - cosrot = Math.cos(Gamma); - - u_0 = no_uoff ? 0. : - Math.abs(al * Math.atan(Math.sqrt(d * d - 1.) / cosrot) / bl); - if (projectionLatitude < 0.) - u_0 = - u_0; + sinrot = Math.sin(gammaRot); + cosrot = Math.cos(gammaRot); + // Grouped exactly as omerc.cpp:293 so the constants are bit-identical to upstream's. + bra = 1. / (arb = al * (rb = 1. / bl)); + + // omerc.cpp:294-300. cos(alphaC), NOT cos(gammaRot): the two coincide only when gamma was + // omitted or equals alpha, which is why every in-repo omerc except RSO Borneo hid this. + if (no_uoff) + u_0 = 0.; + else { + u_0 = Math.abs(arb * Math.atan(Math.sqrt(d * d - 1.) / Math.cos(alphaC))); + if (projectionLatitude < 0.) + u_0 = -u_0; + } + f = 0.5 * gamma0; + v_pole_n = arb * Math.log(Math.tan(ProjectionMath.QUARTERPI - f)); + v_pole_s = arb * Math.log(Math.tan(ProjectionMath.QUARTERPI + f)); } + /** {@code +gamma}, in radians. */ @Override public void setGamma(double gamma) { - this.Gamma = gamma; + this.gamma = gamma; } - + + /** {@code +no_off} / {@code +no_uoff}. */ @Override public void setNoUoff(boolean no_uoff) { this.no_uoff = no_uoff; } + /** + * {@code +no_rot}: do not rotate the (u, v) frame by {@code gamma} on output. + *

+ * {@code omerc.cpp:145} is {@code Q->rot = !pj_param(P->ctx, P->params, "tno_rot").i}, i.e. a + * presence flag that disables the rotation, which is why this setter's argument is + * negated into {@link #rot}. + *

+ * The key is not registered yet, and the ordering was deliberate. A dispatch stream + * declared {@code Proj4Keyword.no_rot} but did not add it to the allow-list or to the bridge's + * honoured set, because without this setter the parser would have had nothing to call: the bridge + * would then have classified the two {@code +no_rot} corpus blocks as executable and they would + * have returned a rotated answer where PROJ returns an unrotated one — a plausible wrong + * coordinate instead of an honest "not implemented". With the setter present, the key can be + * registered in {@code Proj4Keyword} and added to the bridge's honoured set in one change. + * + * @param noRot {@code true} to suppress the rotation + */ + public void setNoRot(boolean noRot) { + this.rot = !noRot; + } + + /** @return whether the (u, v) frame is rotated by {@code gamma}; {@code true} unless {@code +no_rot}. */ + public boolean isRot() { + return rot; + } + + @Override public void setAlpha(double alpha) { + super.setAlpha(alpha); + this.alphaExplicit = true; + } + + @Override public void setAlphaDegrees(double alpha) { + super.setAlphaDegrees(alpha); + this.alphaExplicit = true; + } + + @Override public void setProjectionLatitude1(double projectionLatitude1) { + super.setProjectionLatitude1(projectionLatitude1); + this.lat1Explicit = true; + } + + @Override public void setProjectionLatitude1Degrees(double projectionLatitude1) { + super.setProjectionLatitude1Degrees(projectionLatitude1); + this.lat1Explicit = true; + } + + @Override public void setProjectionLatitude2(double projectionLatitude2) { + super.setProjectionLatitude2(projectionLatitude2); + this.lat2Explicit = true; + } + + @Override public void setProjectionLatitude2Degrees(double projectionLatitude2) { + super.setProjectionLatitude2Degrees(projectionLatitude2); + this.lat2Explicit = true; + } + + /** {@code +lon_1}, in radians. Not reachable from {@code Proj4Parser}; defaults to 0. */ + public void setLon1(double lon1) { + this.lam1 = lon1; + } + + /** {@code +lon_2}, in radians. Not reachable from {@code Proj4Parser}; defaults to 0. */ + public void setLon2(double lon2) { + this.lam2 = lon2; + } + + /** Port of {@code omerc_e_forward} ({@code omerc.cpp:45-81}). */ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { - double con, q, s, ul, us, vl, vs; + double u, v; - vl = Math.sin(bl * lam); - if (Math.abs(Math.abs(phi) - ProjectionMath.HALFPI) <= EPS10) { - ul = phi < 0. ? -singam : singam; - us = al * phi / bl; + if (Math.abs(Math.abs(phi) - ProjectionMath.HALFPI) > EPS10) { + final double w = el / Math.pow(ProjectionMath.tsfn(phi, Math.sin(phi), e), bl); + final double oneDivW = 1. / w; + final double s = .5 * (w - oneDivW); + final double t = .5 * (w + oneDivW); + final double vl = Math.sin(bl * lam); + final double ul = (s * singam - vl * cosgam) / t; + if (Math.abs(Math.abs(ul) - 1.0) < EPS10) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "omerc: the point lies on the projection's singular line (|U| = 1)"); + } + v = 0.5 * arb * Math.log((1. - ul) / (1. + ul)); + final double temp = Math.cos(bl * lam); + if (Math.abs(temp) < TOL) { + // omerc.cpp:64: A*lam, not A*B*lam. At |cos(B*lam)| < TOL the main branch tends to + // (A/B)*(+-pi/2) and lam tends to +-pi/(2B), so A*lam is its continuation and the + // extra factor of B was simply wrong. + u = al * lam; + } else { + // omerc.cpp:66: atan2. atan(y/x) + pi is atan2 only for y >= 0; for y < 0 and + // x < 0 the old form was out by 2*pi*A/B. + u = arb * Math.atan2(s * cosgam + vl * singam, temp); + } } else { - q = el / (!spherical ? Math.pow(ProjectionMath.tsfn(phi, Math.sin(phi), e), bl) - : Math.tan(.5 * (ProjectionMath.HALFPI - phi))); - s = .5 * (q - 1. / q); - ul = 2. * (s * singam - vl * cosgam) / (q + 1. / q); - con = Math.cos(bl * lam); - if (Math.abs(con) >= TOL) { - us = al * Math.atan((s * cosgam + vl * singam) / con) / bl; - if (con < 0.) - us += Math.PI * al / bl; - } else - us = al * bl * lam; + v = phi > 0 ? v_pole_n : v_pole_s; + u = arb * phi; } - if (Math.abs(Math.abs(ul) - 1.) <= EPS10) throw new ProjectionException("Obl 3"); - vs = .5 * al * Math.log((1. - ul) / (1. + ul)) / bl; - us -= u_0; if (!rot) { - xy.x = us; - xy.y = vs; + xy.x = u; + xy.y = v; } else { - xy.x = vs * cosrot + us * sinrot; - xy.y = us * cosrot - vs * sinrot; + u -= u_0; + xy.x = v * cosrot + u * sinrot; + xy.y = u * cosrot - v * sinrot; } return xy; } + /** Port of {@code omerc_e_inverse} ({@code omerc.cpp:83-118}). */ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { - double q, s, ul, us, vl, vs; + double u, v; - if (! rot) { - us = x; - vs = y; + if (!rot) { + v = y; + u = x; } else { - vs = x * cosrot - y * sinrot; - us = y * cosrot + x * sinrot; + v = x * cosrot - y * sinrot; + u = y * cosrot + x * sinrot + u_0; + } + final double qp = Math.exp(-bra * v); + if (qp == 0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "omerc inverse: exp(-B/A * v) underflowed to zero"); } - us += u_0; - q = Math.exp(- bl * vs / al); - s = .5 * (q - 1. / q); - vl = Math.sin(bl * us / al); - ul = 2. * (vl * cosgam + s * singam) / (q + 1. / q); - if (Math.abs(Math.abs(ul) - 1.) < EPS10) { + final double sp = .5 * (qp - 1. / qp); + final double tp = .5 * (qp + 1. / qp); + final double vp = Math.sin(bra * u); + final double up = (vp * cosgam + sp * singam) / tp; + if (Math.abs(Math.abs(up) - 1.) < EPS10) { lp.x = 0.; - lp.y = ul < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + lp.y = up < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; } else { - lp.y = el / Math.sqrt((1. + ul) / (1. - ul)); - if (!spherical) { - lp.y = ProjectionMath.phi2(Math.pow(lp.y, 1. / bl), e); - } else - lp.y = ProjectionMath.HALFPI - 2. * Math.atan(lp.y); - lp.x = - Math.atan2((s * cosgam - - vl * singam), Math.cos(bl * us / al)) / bl; + lp.y = el / Math.sqrt((1. + up) / (1. - up)); + lp.y = ProjectionMath.phi2(Math.pow(lp.y, 1. / bl), e); + lp.x = -rb * Math.atan2(sp * cosgam - vp * singam, Math.cos(bra * u)); } return lp; } @@ -251,9 +494,16 @@ public boolean equals(Object that) { if (that instanceof ObliqueMercatorProjection) { ObliqueMercatorProjection p = (ObliqueMercatorProjection) that; return ( - Gamma == p.Gamma && - alpha == p.alpha && - lonc == p.lonc && + // Double.compare: gamma is NaN when +gamma was absent, and two definitions + // that both omitted it must still compare equal. + Double.compare(gamma, p.gamma) == 0 && + Double.compare(alpha, p.alpha) == 0 && + Double.compare(lonc, p.lonc) == 0 && + // u_0 depends on no_uoff, so omitting it made two omerc projections that + // differ by 5,000 km of false origin handling compare equal. + no_uoff == p.no_uoff && + lam1 == p.lam1 && + lam2 == p.lam2 && super.equals(that)); } return false; @@ -261,6 +511,6 @@ public boolean equals(Object that) { @Override public int hashCode() { - return Objects.hash(Gamma, alpha, lonc, super.hashCode()); + return Objects.hash(gamma, alpha, lonc, no_uoff, lam1, lam2, super.hashCode()); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ObliqueStereographicAlternativeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueStereographicAlternativeProjection.java index 6757276..962e230 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/ObliqueStereographicAlternativeProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueStereographicAlternativeProjection.java @@ -25,6 +25,8 @@ public class ObliqueStereographicAlternativeProjection extends GaussProjection { + private static final long serialVersionUID = 6458882163460756500L; + private double sinc0; private double cosc0; private double R2; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ObliqueTransformationProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueTransformationProjection.java new file mode 100644 index 0000000..1897fe7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ObliqueTransformationProjection.java @@ -0,0 +1,491 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.units.Angle; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * General Oblique Transformation, {@code +proj=ob_tran} — a port of + * {@code 9.8.1:src/projections/ob_tran.cpp}. + * + *

A meta-projection: it rotates the sphere so that a chosen point becomes the pole, then hands + * the rotated coordinate to a child projection named by {@code +o_proj=}. Its own + * assertion count in the corpus is small (12 {@code expect}, 2 of them {@code expect failure}), but + * it is the gateway to every {@code +o_proj=} CRS and a large slice of EPSG. + * + *

The composition seam needs no new hook

+ * + *

Upstream invokes the child at the raw level — {@code Q->link->fwd(lp, Q->link)}, never + * {@code pj_fwd} — so the child's own {@code lam0}, {@code a}, {@code x_0} and {@code k_0} are + * never applied even though they were parsed. {@link Projection#project(double, double, + * ProjCoordinate)} and {@link Projection#projectInverse(double, double, ProjCoordinate)} are + * {@code protected}, which in Java includes package access, so a class in this package can + * call a sibling's raw layer directly. {@link SpilhausProjection} already proves it against + * {@code adams_ws2}. Nothing new was needed here. + * + *

The five things that are easy to get wrong

+ * + *
    + *
  1. {@code o_proj=xxx} becomes {@code proj=xxx} by advancing the string pointer two + * characters ({@code ob_tran.cpp:159}, {@code args.argv[i] += 2}), after + * {@code proj=ob_tran} and a bare {@code inv} have been dropped. Everything else — including + * {@code +o_lat_p}, which the child ignores, and {@code +lon_0}, which the child parses and + * then never uses because it is called raw — passes through verbatim. Only the first + * {@code o_proj=} token is rewritten; the loop {@code break}s. See + * {@link #childParameters(String[])}.
  2. + *
  3. Recursion is blocked by string comparison after the rewrite, not before: if the + * rewritten token is exactly {@code proj=ob_tran} the whole child list is discarded and the + * setup fails with {@code PROJ_ERR_INVALID_OP_MISSING_ARG}. That is what makes + * {@code builtins.gie:5072}'s {@code +o_proj +o_proj=ob_tran} an + * {@code invalid_op_missing_arg}. Note the bare {@code +o_proj} is not the token that + * matches: {@code strncmp("o_proj", "o_proj=", 7)} compares the terminating NUL against + * {@code '='} and differs, so it is skipped — and yet it satisfies the earlier + * "is {@code o_proj} present" test, because {@code pj_param}'s {@code 's'} sigil returns the + * empty string rather than {@code nullptr} for a valueless token.
  4. + *
  5. Three mutually exclusive pole specifications, tested in a fixed order and by + * presence ({@code pj_param}'s {@code 't'} sigil), never by value: + * {@code +o_alpha} wins, else {@code +o_lat_p}, else the two-point + * {@code +o_lon_1/+o_lat_1/+o_lon_2/+o_lat_2} form with its four validity guards.
  6. + *
  7. {@code P->fwd}/{@code P->inv} are set only if the child has that direction + * ({@code ob_tran.cpp:286-293}, {@code Q->link->fwd ? o_forward : nullptr}). So + * {@code +proj=ob_tran +o_proj=guyou} legitimately has a forward and no inverse, and + * asking for one must fail rather than fall back to anything. {@link #hasInverse()} answers + * the child's capability, so {@link Projection#projectInverse} raises + * {@link ErrorCause#NO_INVERSE_AVAILABLE} for exactly the child projections upstream leaves + * {@code nullptr}.
  8. + *
  9. If the child outputs radians, the wrapper's output units become + * {@code PJ_IO_UNITS_WHATEVER} ({@code ob_tran.cpp:296-298}), and {@code fwd_finalize}'s + * {@code WHATEVER} case is a bare {@code break} — no {@code a}, no {@code x_0}, no + * {@code fr_meter}, in either direction. See {@link #initialize()} for how that is + * reproduced.
  10. + *
+ * + *

How {@code +o_proj} and friends arrive

+ * + *

{@code Proj4Parser} hands this class the whole raw argument list through + * {@link #setParameters(String[])}, before {@code initialize()}, rather than dispatching the ten + * {@code o_*} keys one at a time. That mirrors upstream: {@code ob_tran_target_params} builds the + * child's {@code argv} from ob_tran's own, and the pole specification is chosen by presence + * of {@code +o_alpha} / {@code +o_lat_p} / the two-point pair, which {@code pj_param}'s {@code 't'} + * sigil answers without looking at the value — so {@code +o_alpha=0} selects the azimuth form. + * + *

A parse that supplies no argument array at all, and a definition with no {@code +o_proj}, + * are both refused with {@link ErrorCause#MISSING_PARAM}, which is upstream's + * {@code "Missing parameter: o_proj"}. + * + * @since 1.5.0 + */ +public class ObliqueTransformationProjection extends Projection { + + private static final long serialVersionUID = -5198764690057590149L; + + /** {@code ob_tran.cpp:23}, {@code #define TOL 1e-10} — the oblique/transverse threshold. */ + private static final double TOL = 1e-10; + + /** {@code Q->link}: the child projection, invoked at its raw layer. */ + private Projection link; + + /** {@code Q->lamp}: the longitude of the new pole, radians. */ + private double lamp; + + /** {@code Q->cphip}/{@code Q->sphip}, and whether the oblique branch was selected. */ + private double cphip; + private double sphip; + private boolean oblique; + + /** Scratch for the child's result; see {@link SpilhausProjection}'s note on thread safety. */ + private final ProjCoordinate child = new ProjCoordinate(); + + /** + * The whole of {@code PJ_PROJECTION(ob_tran)}'s parameter handling, in the one call the parser + * will need: build the child from the rewritten argument list, then resolve the pole. + * + * @param args the full {@code +}-parameter list of the {@code ob_tran} definition, exactly as + * handed to {@code CRSFactory.createFromParameters}; leading {@code +} optional on + * each token, as PROJ allows + * @throws InvalidValueException for each of upstream's six setup rejections + */ + public void setParameters(String[] args) { + setChild(new CRSFactory() + .createFromParameters("ob_tran o_proj", childParameters(args)) + .getProjection()); + applyPoleSpecification(parameterMap(args)); + } + + /** + * Sets the child projection directly, for a caller composing programmatically. + *

+ * The child must already be initialized — upstream's child is a fully-built {@code PJ} — and + * its {@code lam0}, {@code a}, {@code x_0} and {@code k_0} are irrelevant, because only its + * raw layer is ever called. + */ + public void setChild(Projection child) { + if (child instanceof ObliqueTransformationProjection) { + // Unreachable through setParameters, which blocks it textually as upstream does, but + // reachable by a programmatic caller -- and an ob_tran of an ob_tran recurses without + // bound in upstream too, which is why the string check exists at all. + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=ob_tran cannot rotate another +proj=ob_tran"); + } + this.link = child; + } + + public Projection getChild() { + return link; + } + + /** {@code +o_lon_p}/{@code +o_lat_p} — the "specified new pole" form, radians. */ + public void setPole(double oLonP, double oLatP) { + this.lamp = oLonP; + setPhip(oLatP); + } + + /** + * {@code +o_alpha}/{@code +o_lon_c}/{@code +o_lat_c} — the azimuth form, radians + * ({@code ob_tran.cpp:230-243}). + * + * @throws InvalidValueException if {@code |oLatC|} is within {@link #TOL} of 90° + */ + public void setAzimuthalPole(double oAlpha, double oLonC, double oLatC) { + if (Math.abs(Math.abs(oLatC) - ProjectionMath.HALFPI) <= TOL) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+o_lat_c=" + (oLatC * RTD) + " deg: Invalid value for lat_c: |lat_c| " + + "should be < 90 deg"); + } + this.lamp = oLonC + AdamsProjection.aatan2(-FastStrictTrig.cos(oAlpha), + -FastStrictTrig.sin(oAlpha) * FastStrictTrig.sin(oLatC)); + setPhip(AdamsProjection.aasin(FastStrictTrig.cos(oLatC) * FastStrictTrig.sin(oAlpha))); + } + + /** + * {@code +o_lon_1}/{@code +o_lat_1}/{@code +o_lon_2}/{@code +o_lat_2} — the "new equator + * points" form, radians ({@code ob_tran.cpp:245-281}). + * + *

Four guards, in upstream's order and with upstream's messages. Note the third and fourth + * use {@code TOL} on a difference and on {@code |phi1|}, so "the two latitudes must + * differ" and "lat_1 must not be zero" are both tested at 1e-10 rad, about 0.6 µm + * on the ground. + * + * @throws InvalidValueException for each of the four + */ + public void setEquatorPoints(double oLon1, double oLat1, double oLon2, double oLat2) { + final double con = Math.abs(oLat1); + if (Math.abs(oLat1) > ProjectionMath.HALFPI - TOL) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+o_lat_1=" + (oLat1 * RTD) + " deg: Invalid value for lat_1: |lat_1| " + + "should be < 90 deg"); + } + if (Math.abs(oLat2) > ProjectionMath.HALFPI - TOL) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+o_lat_2=" + (oLat2 * RTD) + " deg: Invalid value for lat_2: |lat_2| " + + "should be < 90 deg"); + } + if (Math.abs(oLat1 - oLat2) < TOL) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+o_lat_1=" + (oLat1 * RTD) + " +o_lat_2=" + (oLat2 * RTD) + + " deg: Invalid value for lat_1 and lat_2: lat_1 should be " + + "different from lat_2"); + } + if (con < TOL) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+o_lat_1=" + (oLat1 * RTD) + " deg: Invalid value for lat_1: lat_1 should " + + "be different from zero"); + } + final double sinPhi1 = FastStrictTrig.sin(oLat1); + final double cosPhi1 = FastStrictTrig.cos(oLat1); + final double sinPhi2 = FastStrictTrig.sin(oLat2); + final double cosPhi2 = FastStrictTrig.cos(oLat2); + // Plain atan2/atan here, not aatan2: ob_tran.cpp:274-280 uses the unguarded forms. + this.lamp = Math.atan2( + cosPhi1 * sinPhi2 * FastStrictTrig.cos(oLon1) + - sinPhi1 * cosPhi2 * FastStrictTrig.cos(oLon2), + sinPhi1 * cosPhi2 * FastStrictTrig.sin(oLon2) + - cosPhi1 * sinPhi2 * FastStrictTrig.sin(oLon1)); + setPhip(Math.atan(-FastStrictTrig.cos(lamp - oLon1) / FastStrictTrig.tan(oLat1))); + } + + /** {@code ob_tran.cpp:283-294}: {@code |phip| > TOL} selects oblique, otherwise transverse. */ + private void setPhip(double phip) { + this.oblique = Math.abs(phip) > TOL; + this.cphip = FastStrictTrig.cos(phip); + this.sphip = FastStrictTrig.sin(phip); + } + + /** + * Requires a child and reproduces item 5 — the {@code PJ_IO_UNITS_WHATEVER} demotion. + * + *

{@code fwd_finalize}'s and {@code inv_prepare}'s {@code WHATEVER} cases are both a bare + * {@code break}, so when the child is geographic the wrapper applies no affine at all + * and its output is raw radians. Proj4J has one affine, {@code totalScale * v + + * totalFalse*}, computed by {@link Projection#initialize()} from {@code a}, {@code fromMetres} + * and the false origin — so the way to say "no affine" is to make it the identity: + * {@code a = 1}, {@code fromMetres = 1}, false origin zero. The ellipsoid object itself is + * left alone, so {@link #getEllipsoid()} still reports what the definition asked for, and + * nothing in this class or in the child's raw layer reads {@code a}. + * + * @throws InvalidValueException {@link ErrorCause#MISSING_PARAM} if no child was set, which is + * upstream's {@code "Missing parameter: o_proj"} + */ + @Override + public void initialize() { + if (link == null) { + throw new InvalidValueException(ErrorCause.MISSING_PARAM, + "+proj=ob_tran: Missing parameter: o_proj. The child projection is set from " + + "the whole parameter list by setParameters(String[]), or directly " + + "by setChild(Projection)."); + } + if (childOutputsRadians()) { + a = 1.0; + fromMetres = 1.0; + falseEasting = 0.0; + falseNorthing = 0.0; + } + super.initialize(); + } + + /** + * {@code Q->link->right == PJ_IO_UNITS_RADIANS}, i.e. "the child is {@code latlong}". + * {@code isGeographic()} is the predicate Proj4J already uses for that. + */ + private boolean childOutputsRadians() { + return link != null && Boolean.TRUE.equals(link.isGeographic()); + } + + /** + * {@code o_forward} (Snyder 5-8b then 5-7) or {@code t_forward}, then the child's raw forward. + */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double coslam = FastStrictTrig.cos(lam); + final double sinphi = FastStrictTrig.sin(phi); + final double cosphi = FastStrictTrig.cos(phi); + final double rotLam; + final double rotPhi; + if (oblique) { + /* Formula (5-8b) of Snyder's "Map projections: a working manual" */ + rotLam = AdamsProjection.adjlon( + AdamsProjection.aatan2(cosphi * FastStrictTrig.sin(lam), + sphip * cosphi * coslam + cphip * sinphi) + lamp); + /* Formula (5-7) */ + rotPhi = AdamsProjection.aasin(sphip * sinphi - cphip * cosphi * coslam); + } else { + rotLam = AdamsProjection.adjlon( + AdamsProjection.aatan2(cosphi * FastStrictTrig.sin(lam), sinphi) + lamp); + rotPhi = AdamsProjection.aasin(-cosphi * coslam); + } + link.project(rotLam, rotPhi, child); + xy.x = child.x; + xy.y = child.y; + return xy; + } + + /** + * The child's raw inverse, then {@code o_inverse} (Snyder 5-9 then 5-10b) or + * {@code t_inverse}. + * + *

Upstream guards the rotation with {@code if (lp.lam != HUGE_VAL)}, i.e. "only if the + * child's inverse succeeded". Proj4J's child raises instead of returning a sentinel, so the + * guard is the propagating exception and there is nothing to test. + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + if (!hasInverse()) { + throw new ProjectionException(ErrorCause.NO_INVERSE_AVAILABLE, this, + "+proj=ob_tran +o_proj=" + link.getName() + " has no inverse, because the " + + "child projection has none. Upstream leaves P->inv null in exactly " + + "this case (ob_tran.cpp:288/292), so there is nothing to fall back " + + "to."); + } + link.projectInverse(x, y, child); + final double childLam = child.x; + final double childPhi = child.y; + if (oblique) { + final double lam = childLam - lamp; + final double coslam = FastStrictTrig.cos(lam); + final double sinphi = FastStrictTrig.sin(childPhi); + final double cosphi = FastStrictTrig.cos(childPhi); + /* Formula (5-9) */ + lp.y = AdamsProjection.aasin(sphip * sinphi + cphip * cosphi * coslam); + /* Formula (5-10b) */ + lp.x = AdamsProjection.aatan2(cosphi * FastStrictTrig.sin(lam), + sphip * cosphi * coslam - cphip * sinphi); + } else { + final double cosphi = FastStrictTrig.cos(childPhi); + final double t = childLam - lamp; + lp.x = AdamsProjection.aatan2(cosphi * FastStrictTrig.sin(t), + -FastStrictTrig.sin(childPhi)); + lp.y = AdamsProjection.aasin(cosphi * FastStrictTrig.cos(t)); + } + return lp; + } + + /** + * {@code Q->link->inv ? o_inverse : nullptr} — the wrapper is invertible exactly when the + * child is. + */ + @Override + public boolean hasInverse() { + return link != null && (link.hasInverse() || Boolean.TRUE.equals(link.isGeographic())); + } + + @Override + public String toString() { + return "General Oblique Transformation" + + (link == null ? "" : " of " + link.getName()); + } + + // ------------------------------------------------------------------------------------------ + // ob_tran_target_params + // ------------------------------------------------------------------------------------------ + + /** + * {@code ob_tran_target_params} ({@code ob_tran.cpp:130-170}) — turn the {@code ob_tran} + * argument list into the child's. + * + *

Three steps, in upstream's order: + *

    + *
  1. drop every token equal to {@code proj=ob_tran} or to a bare {@code inv};
  2. + *
  3. find the first token starting {@code o_proj=} and strip its first two characters + * — that is what {@code args.argv[i] += 2} does — then stop looking;
  4. + *
  5. if the rewritten token is exactly {@code proj=ob_tran}, discard the whole list.
  6. + *
+ * + *

A leading {@code +} is stripped from each token first, because + * {@code createParameterMap}'s tokens are compared without it upstream (PROJ's + * {@code paralist->param} holds the key without the {@code +}) and Proj4J accepts both forms. + * + * @param args the {@code ob_tran} argument list + * @return the child's argument list + * @throws InvalidValueException if {@code +o_proj} is absent, or names {@code ob_tran} + */ + public static String[] childParameters(String[] args) { + final List out = new ArrayList(); + boolean oProjPresent = false; + for (int i = 0; i < args.length; i++) { + if (args[i] == null) { + continue; + } + String token = args[i].startsWith("+") ? args[i].substring(1) : args[i]; + if (token.length() == 0) { + continue; + } + // The "is o_proj present at all" test is pj_param's 's' sigil, which yields "" -- not + // null -- for a valueless token, so a bare "+o_proj" satisfies it. + if (token.equals("o_proj") || token.startsWith("o_proj=")) { + oProjPresent = true; + } + if (token.equals("proj=ob_tran") || token.equals("inv")) { + continue; + } + out.add(token); + } + if (!oProjPresent) { + throw new InvalidValueException(ErrorCause.MISSING_PARAM, + "+proj=ob_tran: Missing parameter: o_proj"); + } + for (int i = 0; i < out.size(); i++) { + if (!out.get(i).startsWith("o_proj=")) { + continue; + } + // args.argv[i] += 2 -- advance the pointer two characters, "o_proj=x" -> "proj=x". + final String rewritten = out.get(i).substring(2); + if (rewritten.equals("proj=ob_tran")) { + throw new InvalidValueException(ErrorCause.MISSING_PARAM, + "+proj=ob_tran +o_proj=ob_tran: Failed to find projection to be rotated. " + + "Upstream discards the entire child argument list here to " + + "avoid endless recursion, and reports it as a missing " + + "argument rather than an illegal one."); + } + out.set(i, rewritten); + break; + } + return out.toArray(new String[out.size()]); + } + + /** + * Chooses among the three pole specifications by presence, in upstream's order + * ({@code ob_tran.cpp:230-281}). {@code pj_param}'s {@code 't'} sigil tests presence and + * never value, so {@code +o_alpha=0} selects the azimuth form. + */ + private void applyPoleSpecification(Map params) { + if (params.containsKey("o_alpha")) { + setAzimuthalPole(radians(params, "o_alpha"), radians(params, "o_lon_c"), + radians(params, "o_lat_c")); + } else if (params.containsKey("o_lat_p")) { + setPole(radians(params, "o_lon_p"), radians(params, "o_lat_p")); + } else { + setEquatorPoints(radians(params, "o_lon_1"), radians(params, "o_lat_1"), + radians(params, "o_lon_2"), radians(params, "o_lat_2")); + } + } + + /** + * A parameter as radians, defaulting to zero when absent — {@code pj_param(..., "rXXX").f} + * returns 0 for an absent key, and every one of {@code ob_tran}'s ten angular parameters is + * read through the {@code "r"} sigil, i.e. {@code dmstor}. So DMS, a trailing cardinal and the + * {@code r} radian suffix all have to work. + */ + private static double radians(Map params, String key) { + final String value = params.get(key); + if (value == null || value.length() == 0) { + return 0.0; + } + try { + final int length = value.length(); + final char last = value.charAt(length - 1); + if (length > 1 && (last == 'r' || last == 'R')) { + return Double.parseDouble(value.substring(0, length - 1)); + } + return Angle.parse(value) * DTR; + } catch (NumberFormatException e) { + throw new InvalidValueException("Invalid value for +" + key + ": " + value, e); + } + } + + /** First occurrence wins, as {@code pj_param_exists} does. */ + private static Map parameterMap(String[] args) { + final Map params = new LinkedHashMap(); + for (int i = 0; i < args.length; i++) { + if (args[i] == null) { + continue; + } + String arg = args[i].startsWith("+") ? args[i].substring(1) : args[i]; + if (arg.length() == 0) { + continue; + } + final int eq = arg.indexOf('='); + final String key = eq < 0 ? arg : arg.substring(0, eq); + final String value = eq < 0 ? null : arg.substring(eq + 1); + if (!params.containsKey(key)) { + params.put(key, value); + } + } + return params; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/OrteliusOvalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/OrteliusOvalProjection.java new file mode 100644 index 0000000..bcd50e6 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/OrteliusOvalProjection.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Ortelius Oval ({@code +proj=ortel}), {@code 9.8.1:src/projections/bacon.cpp:70-82}. + * + *

This lives in {@code bacon.cpp}, not a file of its own. The commonly-cited + * one-file-several-names map lists {@code ortel} separately, which would mean writing the + * globular machinery a second time; it is {@code bacon.cpp}'s third {@code PROJ_HEAD} and + * inherits the whole forward. + * + *

{@code ortl = 1} adds the second easting branch for {@code |lam| >= pi/2}, which + * replaces the circular arc with a straight segment offset by + * {@code sqrt((pi/2)^2 - phi^2 + 1e-10)} — the epsilon being what keeps the radicand + * non-negative at the poles. + * + * @see BaconFamilyProjection + */ +public class OrteliusOvalProjection extends BaconFamilyProjection { + + private static final long serialVersionUID = 5277454540464272723L; + + public OrteliusOvalProjection() { + super(false, true); + } + + public String toString() { + return "Ortelius Oval"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/OrthographicAzimuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/OrthographicAzimuthalProjection.java index 8e9a450..828c48c 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/OrthographicAzimuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/OrthographicAzimuthalProjection.java @@ -19,107 +19,437 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; /** - * The Orthographic Azimuthal or Globe map projection. + * Orthographic ({@code +proj=ortho}), ported from {@code 9.8.1:src/projections/ortho.cpp}. + * + *

Upstream is declared {@code "Azi, Sph&Ell"} and has four kernels — a spherical + * forward/inverse pair and an ellipsoidal pair from EPSG guidance note 7.2 §3.3.5 — plus a + * {@code +alpha}/{@code +k_0} rotation-and-scale applied to both. Proj4J had only the spherical arm, + * no rotation, and no scale. + * + *

The domain contract, and the evidence that settles it

+ * + *

{@code builtins.gie}'s {@code ortho} block mixes rows that expect a coordinate with rows that + * expect {@code errno coord_transfm_outside_projection_domain}, and Proj4J 1.4.3 got both + * kinds wrong in the same forward function. The reason was a single line: + * + *

+ *   switch (mode) { ... xy.x = xy.y = Double.NaN; ... }
+ *   xy.x = cosphi * Math.sin(lam);          // <-- unconditional, AFTER the switch
+ * 
+ * + *

The visibility guard poisoned both ordinates and the very next statement overwrote + * {@code xy.x} with a perfectly finite number, so a rejected point came back as exactly one + * non-finite ordinate — which defeats any "is x plausible" check by construction. Upstream writes + * {@code xy.x = xy.y = HUGE_VAL} before the switch and returns from inside it, so its + * {@code xy.x} assignment is only reachable on the success path. + * + *

That asymmetry is what settles the contract, and it settles it without guessing: every row in + * the block that expects a coordinate corresponds to a path that reaches the end of upstream's + * function, and every row that expects the domain errno corresponds to a call upstream makes to + * {@code forward_error()} or {@code proj_errno_set(..., OUTSIDE_PROJECTION_DOMAIN)}. There is no + * third category and no row where the two overlap. So the port is line-for-line, with one + * substitution: where upstream poisons the output and sets errno, this throws + * {@link ProjectionException} carrying {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}. In PROJ the + * {@code HUGE_VAL} is a sentinel that {@code fwd_finalize} reads together with errno, never an + * answer handed to a caller; an exception at the same point is the same statement with no sentinel + * left over to be mistaken for data. + * + *

The predicates, all of them: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
every domain rejection in {@code ortho.cpp}
direction / modepredicate
fwd, spherical equatorial{@code cos(phi)*cos(lam) < -1e-10}
fwd, spherical oblique{@code sinph0*sin(phi) + cosph0*cos(phi)*cos(lam) < -1e-10}
fwd, spherical polar{@code |phi - phi0| - 1e-10 > pi/2}
fwd, ellipsoidal, all modesthe same dot product as the oblique case
inv, spherical{@code hypot(x,y) - 1 > 1e-10}
inv, ellipsoidal polar{@code x^2 + y^2 - 1 > 1e-10}
inv, ellipsoidal equatorial{@code x^2 + (y*a/b)^2 > 1 + 1e-11}
inv, ellipsoidal oblique{@code x^2 + ((y - y_shift)/y_scale)^2 > 1 + 1e-11}
inv, ellipsoidal oblique20 Newton trips without {@code |dphi|, |dlam| < 1e-12}
+ * + *

The ellipsoidal-inverse guards are deliberately not all the same number: + * {@code 1e-10} on {@code rho^2 - 1} at the poles, {@code 1 + 1e-11} on the ellipse elsewhere. The + * equatorial one is load-bearing at the corpus's 0.1 mm bar. {@code builtins.gie}'s + * {@code accept 0 6356752.3143} sits 0.1 mm past the WGS84 semi-minor axis, which makes + * {@code (y*a/b)^2 = 1 + 1.72e-11} — 1.7× the threshold, and the row expects a + * failure. Widening that guard to {@code 1e-10} would make it return the pole instead. + * + *

Two things ported verbatim that look like defects

+ * + *
    + *
  • The ellipsoidal oblique inverse seeds itself from the spherical inverse, which un-rotates + * and un-scales a second time. Upstream calls {@code ortho_s_inverse(xy_recentered, P)} on + * coordinates from which {@code +alpha} and {@code +k_0} have already been removed, and + * {@code ortho_s_inverse} removes them again on entry. It is only the starting point of a + * 20-trip Newton iteration whose residual is measured against the un-seeded target, so + * the answer is unaffected; reproducing it costs nothing and diverging from it would be an + * unmeasurable difference dressed up as a fix. Non-negotiable 7.
  • + *
  • {@code a/b} is computed as {@code 1/sqrt(1 - es)} rather than from a stored {@code b}. + * Proj4J's {@link Projection} carries {@code es} and {@code one_es}, not {@code b}, and a + * definition written {@code +a= +es=} has no {@code b} to read. The two agree to an ulp + * (2.2e-16 relative), and the only place the value is used is the {@code > 1 + 1e-11} + * comparison above, where the margin on the tightest corpus row is 7e-12 — four orders of + * magnitude above an ulp. This is the one place this port does not take a constant + * digit-for-digit, and it is recorded here so the exception is visible rather than inferred.
  • + *
+ * + *

{@code +lat_0} used to default to 45 degrees

+ * + *

See {@link AzimuthalProjection#AzimuthalProjection()}. Every {@code +proj=ortho +ellps=WGS84} + * row in the corpus was measuring that, not the arithmetic here — the reported + * {@code (170, 10) -> (5145289.58, NaN)} is the oblique branch at + * {@code lat_0 = lon_0 = 45}, not the equatorial one. + * + * @see AzimuthalProjection#AzimuthalProjection() */ public class OrthographicAzimuthalProjection extends AzimuthalProjection { - - public OrthographicAzimuthalProjection() { - initialize(); - } - - public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { - double sinphi; - double cosphi = Math.cos(phi); - double coslam = Math.cos(lam); - - // Theoretically we should throw the ProjectionExceptions below, but for practical purposes - // it's better not to as they tend to crop up a lot up due to rounding errors. - switch (mode) { - case EQUATOR: - if (cosphi * coslam < - EPS10) { -// throw new ProjectionException(); - xy.x = Double.NaN; - xy.y = Double.NaN; - } else - xy.y = Math.sin(phi); - break; - case OBLIQUE: - sinphi = Math.sin(phi); - if (sinphi0 * (sinphi) + cosphi0 * cosphi * coslam < - EPS10) { - //throw new ProjectionException(); - xy.x = Double.NaN; - xy.y = Double.NaN; - } else - xy.y = cosphi0 * sinphi - sinphi0 * cosphi * coslam; - break; - case NORTH_POLE: - coslam = - coslam; - case SOUTH_POLE: - if (Math.abs(phi - projectionLatitude) - EPS10 > Math.PI / 2) { -// throw new ProjectionException(); - xy.x = Double.NaN; - xy.y = Double.NaN; - } else - xy.y = cosphi * coslam; - break; - } - xy.x = cosphi * Math.sin(lam); - return xy; - } - - public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { - double rh, cosc, sinc; - - if ((sinc = (rh = ProjectionMath.distance(x, y))) > 1.) { - if ((sinc - 1.) > EPS10) throw new ProjectionException(); - sinc = 1.; - } - cosc = Math.sqrt(1. - sinc * sinc); /* in this range OK */ - if (Math.abs(rh) <= EPS10) - lp.y = projectionLatitude; - else switch (mode) { - case NORTH_POLE: - y = -y; - lp.y = Math.acos(sinc); - break; - case SOUTH_POLE: - lp.y = - Math.acos(sinc); - break; - case EQUATOR: - lp.y = y * sinc / rh; - x *= sinc; - y = cosc * rh; - if (Math.abs(lp.y) >= 1.) - lp.y = lp.y < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - else - lp.y = Math.asin(lp.y); - break; - case OBLIQUE: - lp.y = cosc * sinphi0 + y * sinc * cosphi0 / rh; - y = (cosc - sinphi0 * lp.y) * rh; - x *= sinc * cosphi0; - if (Math.abs(lp.y) >= 1.) - lp.y = lp.y < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - else - lp.y = Math.asin(lp.y); - break; - } - lp.x = (y == 0. && (mode == OBLIQUE || mode == EQUATOR)) ? - (x == 0. ? 0. : x < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI) : Math.atan2(x, y); - return lp; - } - - public boolean hasInverse() { - return true; - } - - public String toString() { - return "Orthographic Azimuthal"; - } + private static final long serialVersionUID = 299556558720804920L; + + /** {@code ortho.cpp}'s file-local {@code EPS10}. */ + private static final double ORTHO_EPS10 = 1.e-10; + + /** {@code Q->nu0}: the prime-vertical radius at {@code lat_0}. Ellipsoidal only. */ + private double nu0; + + /** {@code Q->y_shift}, {@code Q->y_scale}: the ellipsoidal oblique inverse's recentring. */ + private double y_shift; + private double y_scale = 1.0; + + /** {@code Q->sinalpha}, {@code Q->cosalpha}: {@code +alpha}, defaulting to 0. */ + private double sinalpha; + private double cosalpha = 1.0; + + public OrthographicAzimuthalProjection() { + initialize(); + } + + /** + * {@code PJ_PROJECTION(ortho)}. + *

+ * Every assignment here derives from {@link #projectionLatitude}, {@link #es} and + * {@link #alpha}, so the second call {@code Proj4Parser} always makes sees the same inputs and + * writes the same values. Nothing derived is read back — non-negotiable 4. + */ + @Override + public void initialize() { + super.initialize(); + // Upstream sets sinph0/cosph0 UNCONDITIONALLY; AzimuthalProjection.initialize() sets them + // only in its oblique branch. The ellipsoidal forward's visibility test and all three of + // nu0/y_shift/y_scale read them at the poles and on the equator too. + sinphi0 = FastStrictTrig.sin(projectionLatitude); + cosphi0 = FastStrictTrig.cos(projectionLatitude); + + if (es != 0.0) { + nu0 = 1.0 / Math.sqrt(1.0 - es * sinphi0 * sinphi0); + y_shift = es * nu0 * sinphi0 * cosphi0; + y_scale = 1.0 / Math.sqrt(1.0 - es * cosphi0 * cosphi0); + } else { + nu0 = 0.0; + y_shift = 0.0; + y_scale = 1.0; + } + + // pj_param's "ralpha" is 0 for an absent key; Projection leaves the field NaN so that + // omerc can tell absent from an explicit zero, so translate that here. + double alphaRad = Double.isNaN(alpha) ? 0.0 : alpha; + sinalpha = FastStrictTrig.sin(alphaRad); + cosalpha = FastStrictTrig.cos(alphaRad); + } + + @Override + public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + return es == 0.0 ? sphericalForward(lam, phi, xy) : ellipsoidalForward(lam, phi, xy); + } + + /** {@code ortho_s_forward}. */ + private ProjCoordinate sphericalForward(double lam, double phi, ProjCoordinate xy) { + double sinphi; + double cosphi = FastStrictTrig.cos(phi); + double coslam = FastStrictTrig.cos(lam); + double yp; + + switch (mode) { + case EQUATOR: + if (cosphi * coslam < -ORTHO_EPS10) { + throw notVisible(lam, phi); + } + yp = FastStrictTrig.sin(phi); + break; + case OBLIQUE: + sinphi = FastStrictTrig.sin(phi); + if (sinphi0 * sinphi + cosphi0 * cosphi * coslam < -ORTHO_EPS10) { + throw notVisible(lam, phi); + } + yp = cosphi0 * sinphi - sinphi0 * cosphi * coslam; + break; + case NORTH_POLE: + coslam = -coslam; + // falls through, exactly as upstream's PROJ_FALLTHROUGH does + case SOUTH_POLE: + if (Math.abs(phi - projectionLatitude) - ORTHO_EPS10 > ProjectionMath.HALFPI) { + throw notVisible(lam, phi); + } + yp = cosphi * coslam; + break; + default: + throw unreachableMode(); + } + double xp = cosphi * FastStrictTrig.sin(lam); + + // The +alpha rotation and the +k_0 scale, applied to both kernels' output. + xy.x = (xp * cosalpha - yp * sinalpha) * scaleFactor; + xy.y = (xp * sinalpha + yp * cosalpha) * scaleFactor; + return xy; + } + + /** {@code ortho_e_forward}, from EPSG guidance note 7.2 §3.3.5. */ + private ProjCoordinate ellipsoidalForward(double lam, double phi, ProjCoordinate xy) { + final double cosphi = FastStrictTrig.cos(phi); + final double sinphi = FastStrictTrig.sin(phi); + final double coslam = FastStrictTrig.cos(lam); + final double sinlam = FastStrictTrig.sin(lam); + + // The same visibility condition as the spherical oblique case, in EVERY mode: + // ortho_e_forward has no mode switch at all. + if (sinphi0 * sinphi + cosphi0 * cosphi * coslam < -ORTHO_EPS10) { + throw notVisible(lam, phi); + } + + final double nu = 1.0 / Math.sqrt(1.0 - es * sinphi * sinphi); + final double xp = nu * cosphi * sinlam; + final double yp = nu * (sinphi * cosphi0 - cosphi * sinphi0 * coslam) + + es * (nu0 * sinphi0 - nu * sinphi) * cosphi0; + xy.x = (cosalpha * xp - sinalpha * yp) * scaleFactor; + xy.y = (sinalpha * xp + cosalpha * yp) * scaleFactor; + return xy; + } + + @Override + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + return es == 0.0 ? sphericalInverse(x, y, lp) : ellipsoidalInverse(x, y, lp); + } + + /** {@code ortho_s_inverse}. */ + private ProjCoordinate sphericalInverse(double x, double y, ProjCoordinate lp) { + final double xf = x; + final double yf = y; + double xx = (cosalpha * xf + sinalpha * yf) / scaleFactor; + double yy = (-sinalpha * xf + cosalpha * yf) / scaleFactor; + + final double rh = ProjectionMath.distance(xx, yy); + double sinc = rh; + if (sinc > 1.) { + if ((sinc - 1.) > ORTHO_EPS10) { + throw offMap(x, y, rh); + } + sinc = 1.; + } + final double cosc = Math.sqrt(1. - sinc * sinc); /* in this range OK */ + if (Math.abs(rh) <= ORTHO_EPS10) { + // Upstream sets BOTH ordinates here and returns; the old translation set only the + // latitude and fell through to the atan2 below. + lp.y = projectionLatitude; + lp.x = 0.0; + return lp; + } + switch (mode) { + case NORTH_POLE: + yy = -yy; + lp.y = Math.acos(sinc); + break; + case SOUTH_POLE: + lp.y = -Math.acos(sinc); + break; + case EQUATOR: + lp.y = yy * sinc / rh; + xx *= sinc; + yy = cosc * rh; + lp.y = clampAsin(lp.y); + break; + case OBLIQUE: + lp.y = cosc * sinphi0 + yy * sinc * cosphi0 / rh; + yy = (cosc - sinphi0 * lp.y) * rh; + xx *= sinc * cosphi0; + lp.y = clampAsin(lp.y); + break; + default: + throw unreachableMode(); + } + lp.x = (yy == 0. && (mode == OBLIQUE || mode == EQUATOR)) + ? (xx == 0. ? 0. : xx < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI) + : Math.atan2(xx, yy); + return lp; + } + + /** Upstream's shared {@code sinchk} label, reached from both the equatorial and oblique arms. */ + private static double clampAsin(double v) { + if (Math.abs(v) >= 1.) { + return v < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + } + return Math.asin(v); + } + + /** {@code ortho_e_inverse}. */ + private ProjCoordinate ellipsoidalInverse(double x, double y, ProjCoordinate lp) { + final double xf = x; + final double yf = y; + final double xx = (cosalpha * xf + sinalpha * yf) / scaleFactor; + final double yy = (-sinalpha * xf + cosalpha * yf) / scaleFactor; + + if (mode == NORTH_POLE || mode == SOUTH_POLE) { + // The forward simplifies to rho^2 = cos(phi)^2 / (1 - es*sin(phi)^2), hence + // cos(phi)^2 = rho^2 * (1 - es) / (1 - es*rho^2). + final double rh2 = xx * xx + yy * yy; + if (rh2 >= 1. - 1e-15) { + if ((rh2 - 1.) > ORTHO_EPS10) { + throw offMap(x, y, Math.sqrt(rh2)); + } + lp.y = 0; + } else { + lp.y = Math.acos(Math.sqrt(rh2 * one_es / (1 - es * rh2))) + * (mode == NORTH_POLE ? 1 : -1); + } + lp.x = Math.atan2(xx, yy * (mode == NORTH_POLE ? -1 : 1)); + return lp; + } + + if (mode == EQUATOR) { + // x^2 * (1 - es*sin(phi)^2) = (1 - sin(phi)^2) * sin(lam)^2, and + // y^2 / ((1 - es)^2 + y^2*es) = sin(phi)^2. + final double yOverB = yy * aOverB(); + if (xx * xx + yOverB * yOverB > 1 + 1e-11) { + throw offEllipse(x, y); + } + final double sinphi2 = yy == 0 ? 0 : 1.0 / (sq((1 - es) / yy) + es); + if (sinphi2 > 1 - 1e-11) { + lp.y = ProjectionMath.HALFPI * (yy > 0 ? 1 : -1); + lp.x = 0; + return lp; + } + lp.y = Math.asin(Math.sqrt(sinphi2)) * (yy > 0 ? 1 : -1); + final double sinlam = xx * Math.sqrt((1 - es * sinphi2) / (1 - sinphi2)); + if (Math.abs(sinlam) - 1 > -1e-15) { + lp.x = ProjectionMath.HALFPI * (xx > 0 ? 1 : -1); + } else { + lp.x = Math.asin(sinlam); + } + return lp; + } + + // Oblique: Newton-Raphson on the 2x2 Jacobian of the forward, obtained by substituting the + // forward case's visibility condition into the forward equations. + final double recentredY = (yy - y_shift) / y_scale; + if (xx * xx + recentredY * recentredY > 1 + 1e-11) { + throw offEllipse(x, y); + } + + // EPSG GN 7.2 suggests (0, phi0) as the first guess; upstream records in a comment that it + // does not converge well near the poles and uses the spherical inverse instead. See the + // class javadoc for the deliberate double un-rotation this carries. + sphericalInverse(xx, recentredY, lp); + + for (int i = 0; i < 20; i++) { + final double cosphi = FastStrictTrig.cos(lp.y); + final double sinphi = FastStrictTrig.sin(lp.y); + final double coslam = FastStrictTrig.cos(lp.x); + final double sinlam = FastStrictTrig.sin(lp.x); + final double oneMinusEsSinphi2 = 1.0 - es * sinphi * sinphi; + final double nu = 1.0 / Math.sqrt(oneMinusEsSinphi2); + final double xNew = nu * cosphi * sinlam; + final double yNew = nu * (sinphi * cosphi0 - cosphi * sinphi0 * coslam) + + es * (nu0 * sinphi0 - nu * sinphi) * cosphi0; + final double rho = (1.0 - es) * nu / oneMinusEsSinphi2; + final double j11 = -rho * sinphi * sinlam; + final double j12 = nu * cosphi * coslam; + final double j21 = rho * (cosphi * cosphi0 + sinphi * sinphi0 * coslam); + final double j22 = nu * sinphi0 * cosphi * sinlam; + final double d = j11 * j22 - j12 * j21; + final double dx = xx - xNew; + final double dy = yy - yNew; + final double dphi = (j22 * dx - j12 * dy) / d; + final double dlam = (-j21 * dx + j11 * dy) / d; + lp.y += dphi; + if (lp.y > ProjectionMath.HALFPI) { + lp.y = ProjectionMath.HALFPI - (lp.y - ProjectionMath.HALFPI); + lp.x = ProjectionMath.adjlon(lp.x + Math.PI); + } else if (lp.y < -ProjectionMath.HALFPI) { + lp.y = -ProjectionMath.HALFPI + (-ProjectionMath.HALFPI - lp.y); + lp.x = ProjectionMath.adjlon(lp.x + Math.PI); + } + lp.x += dlam; + if (Math.abs(dphi) < 1e-12 && Math.abs(dlam) < 1e-12) { + return lp; + } + } + // Upstream sets the domain errno and returns the last iterate. There is no "nearly + // converged" answer worth handing back, and the corpus asserts this case as a failure: the + // row is a point sitting exactly ON the visibility boundary, commented upstream as + // "Just on it, but fails to converge". + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "ellipsoidal oblique inverse did not converge to 1e-12 rad within 20 iterations " + + "for (" + x + ", " + y + "); the point is on or past the visibility " + + "boundary of the projection plane"); + } + + /** + * {@code P->a / P->b}, derived from {@code es}. See the class javadoc for why an ulp cannot + * matter at the single place this is used. + * + * @return {@code a/b} + */ + private double aOverB() { + return 1.0 / Math.sqrt(one_es); + } + + private static double sq(double v) { + return v * v; + } + + private ProjectionException notVisible(double lam, double phi) { + return new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + Math.toDegrees(lam) + ", " + Math.toDegrees(phi) + ") deg is on the " + + "unprojected hemisphere: the dot product of the ellipsoid normals at the " + + "projection centre and at the point is negative"); + } + + private ProjectionException offMap(double x, double y, double rho) { + return new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + x + ", " + y + ") is " + rho + " unit radii from the projection centre, " + + "outside the disc the orthographic projection fills"); + } + + private ProjectionException offEllipse(double x, double y) { + return new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "(" + x + ", " + y + ") is outside the ellipse bounding the ellipsoidal " + + "orthographic projection"); + } + + private ProjectionException unreachableMode() { + return new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "unreachable azimuthal mode " + mode); + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Orthographic Azimuthal"; + } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PattersonProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PattersonProjection.java new file mode 100644 index 0000000..4d8c2c4 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PattersonProjection.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Patterson Cylindrical ({@code +proj=patterson}), a port of + * {@code 9.8.1:src/projections/patterson.cpp}. + * + *

Tom Patterson's 2014 design, equations by Bojan Savric; described in Patterson, Savric + * and Jenny, Cartographic Perspectives 78 (2015), + * doi:10.14714/CP78.1270. A true + * cylindrical map — the easting is {@code lam} untouched — that only reshapes the spacing of + * the parallels. + * + *

+ *   x = lam
+ *   y = phi * (K1 + phi^4 (K2 + phi^2 (K3 + K4 phi^2)))
+ * 
+ * + *

Derivative multipliers {@code 1, 5, 7, 9} ({@code patterson.cpp:53-56}) for the powers + * {@code phi^1, phi^5, phi^7, phi^9}. + * + *

{@code MAX_Y} is a bare literal here, not a multiple of pi

+ * + *

{@code patterson.cpp:58} is {@code #define MAX_Y 1.790857183} — a decimal constant, + * where its three siblings all write theirs as {@code c * M_PI}. Do not "tidy" it into + * {@code 0.5700...* Math.PI}; the literal is what upstream compares against. + * + *

The seed-before-clamp quirk

+ * + *

This is the one member of the family that captures the Newton seed + * before clamping the target northing ({@code patterson.cpp:80} then + * {@code :83-87}). See {@link #seedBeforeClamp()}. Harmless for every in-range point, and + * reproduced rather than normalised. + */ +public class PattersonProjection extends PolynomialPseudoCylindricalProjection { + + private static final long serialVersionUID = 8018382564219045354L; + + private static final double K1 = 1.0148; + private static final double K2 = 0.23185; + private static final double K3 = -0.14499; + private static final double K4 = 0.02406; + + // patterson.cpp:53-56. + private static final double C1 = K1; + private static final double C2 = 5.0 * K2; + private static final double C3 = 7.0 * K3; + private static final double C4 = 9.0 * K4; + + /** {@code patterson.cpp:58}, verbatim. Not a multiple of pi upstream. */ + private static final double MAX_Y = 1.790857183; + + protected double northing(double phi) { + final double phi2 = phi * phi; + return phi * (K1 + phi2 * phi2 * (K2 + phi2 * (K3 + K4 * phi2))); + } + + protected double northingDerivative(double phi) { + final double y2 = phi * phi; + return C1 + y2 * y2 * (C2 + y2 * (C3 + C4 * y2)); + } + + /** {@code patterson.cpp:68} — the easting is {@code lam} exactly. */ + protected double eastingScale(double phi) { + return 1.0; + } + + protected double maxY() { + return MAX_Y; + } + + @Override + protected boolean seedBeforeClamp() { + return true; + } + + public String toString() { + return "Patterson Cylindrical"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PeirceQuincuncialProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PeirceQuincuncialProjection.java new file mode 100644 index 0000000..9b3055d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PeirceQuincuncialProjection.java @@ -0,0 +1,408 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.EllipticIntegral; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.GenericInverse2D; + +/** + * Peirce Quincuncial. The {@code PEIRCE_Q} branch of + * {@code 9.8.1:src/projections/adams.cpp:134-156} plus the arrangement stage at + * {@code adams.cpp:204-285} and the two seeded inverses at {@code adams.cpp:319-385}. + * + *

Six arrangements of the same conformal map, selected by {@code +shape}. The prose + * documentation for this operator is stale in several places; {@code adams.cpp} is the + * authority and this class follows it. Specifically: + * + * + * + * + * + * + * + * + * + * + * + * + *
{@code +shape} values, from {@code adams.cpp:405-453}
{@code +shape}inverse?notes
absentyesdefaults to {@code diamond}, not + * {@code square}
{@code square}yes
{@code diamond}yes
{@code nhemisphere}norejects {@code phi < -1e-9}
{@code shemisphere}norejects {@code phi > -1e-9}
{@code horizontal}nothe only shape that reads + * {@code +scrollx}
{@code vertical}nothe only shape that reads + * {@code +scrolly}
anything elsesetup error
+ * + *

Only {@code square} and {@code diamond} have an inverse. The other four install + * none, so asking for one must fail rather than return the input. + * + *

The hemisphere guards are asymmetric, and that is not a typo upstream

+ * + *

{@code nhemisphere} rejects {@code phi < -TOL}, so the equator and a {@code 1e-9} sliver + * south of it are accepted. {@code shemisphere} rejects {@code phi > -TOL}, so the + * equator itself is rejected. Over the same point grid that is 37 rejections for the + * north and 19 for the south in {@code peirce_q.gie} — the asymmetry is directly observable in + * the corpus and is reproduced here deliberately. + * + *

The guards run before any arithmetic, so a point that is both out of hemisphere and + * would trip an {@code aacos} reports the hemisphere failure. + * + *

{@code +scrollx} and {@code +scrolly} are silently ignored off their own shape

+ * + *

{@code adams.cpp} reads {@code scrollx} only inside the {@code horizontal} branch of the + * setup and {@code scrolly} only inside the {@code vertical} branch. So + * {@code +shape=vertical +scrollx=0.5} ignores {@code scrollx} — it is not an error, and it is + * not applied. Range is {@code [-1, 1]} inclusive for both, and a value of exactly {@code 0.0} + * skips the scroll block entirely. + */ +public class PeirceQuincuncialProjection extends AdamsProjection { + + private static final long serialVersionUID = 4278033229674516303L; + + /** + * The arrangements of {@code adams.cpp}'s {@code peirce_shape} enum, in its order. + */ + public enum Shape { + SQUARE("square"), + DIAMOND("diamond"), + NHEMISPHERE("nhemisphere"), + SHEMISPHERE("shemisphere"), + HORIZONTAL("horizontal"), + VERTICAL("vertical"); + + private final String parameterValue; + + Shape(String parameterValue) { + this.parameterValue = parameterValue; + } + + /** The {@code +shape=} spelling. */ + public String parameterValue() { + return parameterValue; + } + + /** + * @param value a {@code +shape=} value + * @return the shape, or null if {@code value} is not one of the six + */ + public static Shape forParameterValue(String value) { + for (Shape s : values()) { + if (s.parameterValue.equals(value)) { + return s; + } + } + return null; + } + } + + /** + * {@code shd} — the distance the southern hemisphere is shifted when it is folded out. + * Built from the accurate {@code K(1/2)} literal, not from + * {@code ellInt5(pi/2)}; the two differ in the eighth decimal and both appear in the same + * upstream function. See {@link EllipticIntegral#K_HALF}. + */ + private static final double SHD = EllipticIntegral.PEIRCE_SHIFT; + + /** The diamond seed's out-of-square threshold, {@code adams.cpp:381-382}. */ + private static final double DIAMOND_LIMIT = EllipticIntegral.K_HALF + 1e-3; + + /** {@code adams.cpp:325}, in the square inverse's {@code x == 0 && y < 0} seed. */ + private static final double SQUARE_SEED_A = 2.622057580396; + + /** {@code adams.cpp:331}, in the square inverse's {@code x < 0} axis-band seed. */ + private static final double SQUARE_SEED_B = 2.622057574224; + + /** The axis band width used by the square inverse's seed cascade. */ + private static final double AXIS_BAND = 1e-7; + + private static final double DELTA_XY_TOLERANCE = 1e-10; + + private Shape shape = Shape.DIAMOND; + private double scrollx = 0.0; + private double scrolly = 0.0; + + private final GenericInverse2D.Forward2D rawForward = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + projectRaw(lam, phi, dst); + } + }; + + /** + * Sets {@code +shape}. Absent, the shape is {@link Shape#DIAMOND}. + * + * @throws InvalidValueException for any value outside the six, matching + * {@code adams.cpp:448-453}, which fails the whole setup with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} + */ + public void setShape(String value) { + Shape resolved = Shape.forParameterValue(value); + if (resolved == null) { + throw new InvalidValueException( + "peirce_q: invalid value for 'shape' parameter: " + value); + } + this.shape = resolved; + } + + public Shape getShape() { + return shape; + } + + /** + * Sets {@code +scrollx}. Read by {@link Shape#HORIZONTAL} only; stored but never applied + * for the other five, exactly as upstream stores nothing for them. + * + * @throws InvalidValueException if {@code |scrollx| > 1} ({@code adams.cpp:425-431}) + */ + public void setScrollX(double scrollx) { + if (scrollx > 1 || scrollx < -1) { + throw new InvalidValueException( + "Invalid value for scrollx: |scrollx| should between -1 and 1"); + } + this.scrollx = scrollx; + } + + public double getScrollX() { + return scrollx; + } + + /** + * Sets {@code +scrolly}. Read by {@link Shape#VERTICAL} only. + * + * @throws InvalidValueException if {@code |scrolly| > 1} ({@code adams.cpp:439-445}) + */ + public void setScrollY(double scrolly) { + if (scrolly > 1 || scrolly < -1) { + throw new InvalidValueException( + "Invalid value for scrolly: |scrolly| should between -1 and 1"); + } + this.scrolly = scrolly; + } + + public double getScrollY() { + return scrolly; + } + + @Override + protected ProjCoordinate projectRaw(double lam, double phi, ProjCoordinate dst) { + if (shape == Shape.NHEMISPHERE && phi < -TOL) { + throw new ProjectionException( + "peirce_q +shape=nhemisphere: phi is south of the equator"); + } + if (shape == Shape.SHEMISPHERE && phi > -TOL) { + throw new ProjectionException( + "peirce_q +shape=shemisphere: phi is not south of the equator"); + } + + final double sl = FastStrictTrig.sin(lam); + final double cl = FastStrictTrig.cos(lam); + final double cp = FastStrictTrig.cos(phi); + final double a = aacos(cp * (sl + cl) * RSQRT2); + final double b = aacos(cp * (sl - cl) * RSQRT2); + ellipticTail(a, b, sl < 0., cl > 0., dst); + + // Fold the southern hemisphere out into the four triangles of the quincunx. The five + // branches are independent ifs in C over disjoint half-open ranges, so an else-if + // chain is equivalent - but the < / >= boundaries must stay exactly where they are. + if (shape == Shape.SQUARE || shape == Shape.DIAMOND) { + if (phi < 0.) { + if (lam < (-0.75 * Math.PI)) { + dst.y = SHD - dst.y; // top left + } else if (lam < (-0.25 * Math.PI)) { + dst.x = -SHD - dst.x; // left + } else if (lam < (0.25 * Math.PI)) { + dst.y = -SHD - dst.y; // bottom + } else if (lam < (0.75 * Math.PI)) { + dst.x = SHD - dst.x; // right + } else { + dst.y = SHD - dst.y; // top right + } + } + } + + if (shape == Shape.SQUARE) { + rotate45(dst); + } + + // The rectangular arrangements spin the southern hemisphere out sideways instead, + // after the rotation, and then re-centre on the join between the two hemispheres. + if (shape == Shape.HORIZONTAL) { + if (phi < 0.) { + dst.x = SHD - dst.x; + } + dst.x = dst.x - (SHD / 2); + } + if (shape == Shape.VERTICAL) { + if (phi < 0.) { + dst.y = SHD - dst.y; + } + dst.y = dst.y - (SHD / 2); + } + + // Upstream's scale/threshold locals are folded away here: xscale == yscale == 2.0 and + // xthresh == ythresh == shd/2, so `xthresh * 2 * xscale` is `shd * 2` and + // `xthresh * xscale` is `shd`. The `!= 0.0` test is upstream's, and it is what makes a + // scroll of exactly zero a no-op rather than a wrap through the same arithmetic. + if (scrollx != 0.0 && shape == Shape.HORIZONTAL) { + dst.x = dst.x + scrollx * (SHD * 2); + if (dst.x >= SHD) { + dst.x = dst.x - SHD * 2; + } else if (dst.x < -SHD) { + dst.x = dst.x + SHD * 2; + } + } + if (scrolly != 0.0 && shape == Shape.VERTICAL) { + dst.y = dst.y + scrolly * (SHD * 2); + if (dst.y >= SHD) { + dst.y = dst.y - SHD * 2; + } else if (dst.y < -SHD) { + dst.y = dst.y + SHD * 2; + } + } + return dst; + } + + /** + * {@code peirce_q_square_inverse} / {@code peirce_q_diamond_inverse} + * ({@code adams.cpp:319-385}). + * + *

The two seed cascades are quadrant heuristics — upstream calls them "based on trial and + * repeat" — tuned jointly to {@link GenericInverse2D}'s 15-iteration budget and its + * {@code +/-0.3} step clamp. They are transcribed literally, {@code 1e-7} axis bands, + * immediate {@code (0, pi/2)} return at the origin, diamond {@code -pi/4} fallback and all. + * {@code peirce_q.gie}'s inverse blocks use a 150 mm tolerance precisely because the + * combination is fragile; the 47 roundtrips there are what catch a transcription slip. + * + * @throws ProjectionException for the four shapes that install no inverse + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + if (shape == Shape.SQUARE) { + return squareInverse(x, y, dst); + } + if (shape == Shape.DIAMOND) { + return diamondInverse(x, y, dst); + } + throw new ProjectionException("peirce_q +shape=" + shape.parameterValue() + + " has no inverse; only square and diamond do"); + } + + private ProjCoordinate squareInverse(double x, double y, ProjCoordinate dst) { + double phi = 0; + double lam; + if (x == 0 && y < 0) { + lam = -Math.PI / 4; + if (Math.abs(y) < SQUARE_SEED_A) { + phi = Math.PI / 4; + } + } else if (x > 0 && Math.abs(y) < AXIS_BAND) { + lam = Math.PI / 4; + } else if (x < 0 && Math.abs(y) < AXIS_BAND) { + lam = -3 * Math.PI / 4; + phi = Math.PI / 2 / SQUARE_SEED_B * x + Math.PI / 2; + } else if (Math.abs(x) < AXIS_BAND && y > 0) { + lam = 3 * Math.PI / 4; + } else if (x >= 0 && y <= 0) { + lam = 0; + if (x == 0 && y == 0) { + dst.x = 0; + dst.y = HALF_PI; + return dst; + } + } else if (x >= 0 && y >= 0) { + lam = Math.PI / 2; + } else if (x <= 0 && y >= 0) { + lam = Math.abs(x) < Math.abs(y) ? Math.PI * 0.9 : -Math.PI * 0.9; + } else { + lam = -Math.PI / 2; + } + return GenericInverse2D.solve(x, y, rawForward, lam, phi, DELTA_XY_TOLERANCE, dst); + } + + private ProjCoordinate diamondInverse(double x, double y, ProjCoordinate dst) { + double phi = 0; + double lam; + if (x >= 0 && y <= 0) { + lam = Math.PI / 4; + if (x > 0 && y == 0) { + lam = Math.PI / 2; + phi = 0; + } else if (x == 0 && y == 0) { + dst.x = 0; + dst.y = HALF_PI; + return dst; + } else if (x == 0 && y < 0) { + lam = 0; + phi = Math.PI / 4; + } + } else if (x >= 0 && y >= 0) { + lam = 3 * Math.PI / 4; + } else if (x <= 0 && y >= 0) { + lam = -3 * Math.PI / 4; + } else { + lam = -Math.PI / 4; + } + + if (Math.abs(x) > DIAMOND_LIMIT || Math.abs(y) > DIAMOND_LIMIT) { + phi = -Math.PI / 4; + } + return GenericInverse2D.solve(x, y, rawForward, lam, phi, DELTA_XY_TOLERANCE, dst); + } + + /** + * Shape-dependent, because {@code pj_adams_setup} assigns {@code P->inv} only in the + * {@code square} and {@code diamond} branches. + */ + @Override + public boolean hasInverse() { + return shape == Shape.SQUARE || shape == Shape.DIAMOND; + } + + /** + * {@code shape}, {@code scrollx} and {@code scrolly} all change what + * {@link #projectRaw} computes, so they belong in equality — otherwise + * {@code +shape=square} and {@code +shape=diamond} would collide in + * {@code CoordinateTransformFactory}'s cache and one would silently project as the + * other. + */ + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (!(that instanceof PeirceQuincuncialProjection) || !super.equals(that)) { + return false; + } + PeirceQuincuncialProjection p = (PeirceQuincuncialProjection) that; + return shape == p.shape && scrollx == p.scrollx && scrolly == p.scrolly; + } + + @Override + public int hashCode() { + int h = super.hashCode(); + h = 31 * h + shape.hashCode(); + h = 31 * h + Double.hashCode(scrollx == 0.0 ? 0.0 : scrollx); + h = 31 * h + Double.hashCode(scrolly == 0.0 ? 0.0 : scrolly); + return h; + } + + @Override + public String toString() { + return "Peirce Quincuncial"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveConicProjection.java index d04ce05..f312cee 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveConicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveConicProjection.java @@ -21,6 +21,8 @@ public class PerspectiveConicProjection extends SimpleConicProjection { + private static final long serialVersionUID = 4712467714690834547L; + public PerspectiveConicProjection() { super( SimpleConicProjection.PCONIC ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveProjection.java index 1724b2f..935e692 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PerspectiveProjection.java @@ -13,177 +13,305 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -/* - * This file was semi-automatically converted from the public-domain USGS PROJ source. - */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +/** + * Near-sided perspective, {@code +proj=nsper} — a port of + * {@code 9.8.1:src/projections/nsper.cpp}. Spherical only; both directions are closed form. + * + *

The view from a point {@code +h} metres above the centre of projection, cast onto the + * plane tangent there. As {@code h} grows the map tends to + * {@link OrthographicAzimuthalProjection orthographic}. The sibling {@code +proj=tpers} + * ({@link TiltedPerspectiveProjection}) adds a tilted image plane; it is the same upstream + * file and shares the whole setup. + * + *

What this class used to be

+ * + *

Before this rewrite it was a PROJ-4-era half-transcription with its setup commented + * out. Three consequences, all silent: + * + *

    + *
  • {@code mode} was hard-assigned {@code EQUIT} in {@code initialize()}, so every + * aspect answered the equatorial formulas — {@code +lat_0=90} projected as if + * {@code +lat_0=0}.
  • + *
  • {@code height} was hard-assigned {@code a}, one Earth radius, and + * {@link Projection#setHeightOfOrbit(double)} was not overridden, so + * {@code +proj=nsper +h=1000000} threw rather than answering from the wrong + * orbit. That refusal was the honest outcome, and it is why the 20 {@code builtins.gie} + * rows scored as unimplemented rather than as wrong numbers.
  • + *
  • {@code if (xy.y < rp)} — the far-hemisphere rejection — was commented + * out, and there was no inverse at all ({@code hasInverse()} answered false) even though + * upstream has one.
  • + *
+ * + *

Fidelity notes

+ * + *

{@code es} is zeroed, {@code e} is not. {@code nsper_setup} ends with + * {@code P->es = 0.} and leaves {@code P->e}, {@code P->one_es} and + * {@code P->rone_es} at whatever the ellipsoid gave them. That is reproduced literally: + * the assignment happens after {@code super.initialize()}, which is where the C + * ordering puts it (ellipsoid init, then the projection's own setup). It is unobservable in + * the corpus, whose six {@code nsper} and two {@code tpers} operations all use {@code +a=} or + * {@code +R=}, but regularising it would be a deviation rather than a fix. Compare the + * identical upstream quirk in {@code mod_ster}'s {@code mil_os}/{@code lee_os}/{@code gs48}. + * + *

{@code pn1} is validated, not {@code h}. Upstream rejects + * {@code pn1 = h/a <= 0 || pn1 > 1e10} with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}, so the bound is on the ratio: at + * {@code +R=1} a height of {@code 1e11} is refused, and at {@code +a=6378137} the same height + * is accepted. Two corpus rows assert the two rejections. + * + *

{@code initialize()} runs twice — once from the constructor and once from + * {@code Proj4Parser}. Every derived quantity here is a pure function of {@code height}, + * {@code a} and {@code projectionLatitude}, and none is read while being written, so the + * method is idempotent. {@code height} itself is only ever written by + * {@link #setHeightOfOrbit(double)}. + * + * @see TiltedPerspectiveProjection + * @see 9.8.1 + * nsper.cpp + */ public class PerspectiveProjection extends Projection { - private double height; - private double psinph0; - private double pcosph0; - private double p; - private double rp; - private double pn1; - private double pfact; - private double h; - private double cg; - private double sg; - private double sw; - private double cw; - private int mode; - private int tilt; - - private final static double EPS10 = 1.e-10; - private final static int N_POLE = 0; - private final static int S_POLE = 1; - private final static int EQUIT = 2; - private final static int OBLIQ = 3; - - public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { - double coslam, cosphi, sinphi; - - sinphi = Math.sin(lpphi); - cosphi = Math.cos(lpphi); - coslam = Math.cos(lplam); - switch (mode) { - case OBLIQ: - xy.y = psinph0 * sinphi + pcosph0 * cosphi * coslam; - break; - case EQUIT: - xy.y = cosphi * coslam; - break; - case S_POLE: - xy.y = - sinphi; - break; - case N_POLE: - xy.y = sinphi; - break; - } -// if (xy.y < rp) -// throw new ProjectionException(""); - xy.y = pn1 / (p - xy.y); - xy.x = xy.y * cosphi * Math.sin(lplam); - switch (mode) { - case OBLIQ: - xy.y *= (pcosph0 * sinphi - - psinph0 * cosphi * coslam); - break; - case EQUIT: - xy.y *= sinphi; - break; - case N_POLE: - coslam = - coslam; - case S_POLE: - xy.y *= cosphi * coslam; - break; - } - if (tilt != 0) { - double yt, ba; - - yt = xy.y * cg + xy.x * sg; - ba = 1. / (yt * sw * h + cw); - xy.x = (xy.x * cg - xy.y * sg) * cw * ba; - xy.y = yt * ba; - } - return xy; - } - - public boolean hasInverse() { - return false; - } - -/*FIXME -INVERSE(s_inverse); /* spheroid * / - double rh, cosz, sinz; - - if (tilt) { - double bm, bq, yt; - - yt = 1./(pn1 - xy.y * sw); - bm = pn1 * xy.x * yt; - bq = pn1 * xy.y * cw * yt; - xy.x = bm * cg + bq * sg; - xy.y = bq * cg - bm * sg; - } - rh = hypot(xy.x, xy.y); - if ((sinz = 1. - rh * rh * pfact) < 0.) I_ERROR; - sinz = (p - Math.sqrt(sinz)) / (pn1 / rh + rh / pn1); - cosz = sqrt(1. - sinz * sinz); - if (fabs(rh) <= EPS10) { - lp.lam = 0.; - lp.phi = phi0; - } else { - switch (mode) { - case OBLIQ: - lp.phi = Math.asin(cosz * sinph0 + xy.y * sinz * cosph0 / rh); - xy.y = (cosz - sinph0 * sin(lp.phi)) * rh; - xy.x *= sinz * cosph0; - break; - case EQUIT: - lp.phi = Math.asin(xy.y * sinz / rh); - xy.y = cosz * rh; - xy.x *= sinz; - break; - case N_POLE: - lp.phi = Math.asin(cosz); - xy.y = -xy.y; - break; - case S_POLE: - lp.phi = - Math.asin(cosz); - break; - } - lp.lam = Math.atan2(xy.x, xy.y); - } - return (lp); -} -*/ - - public void initialize() { - super.initialize(); -mode = EQUIT; -height = a; -tilt = 0; -// if ((height = pj_param(params, "dh").f) <= 0.) E_ERROR(-30); -/* - if (fabs(fabs(phi0) - Math.HALFPI) < EPS10) - mode = phi0 < 0. ? S_POLE : N_POLE; - else if (fabs(phi0) < EPS10) - mode = EQUIT; - else { - mode = OBLIQ; - psinph0 = Math.sin(phi0); - pcosph0 = Math.cos(phi0); - } -*/ - pn1 = height / a; /* normalize by radius */ - p = 1. + pn1; - rp = 1. / p; - h = 1. / pn1; - pfact = (p + 1.) * h; - es = 0.; - } -/*FIXME -ENTRY0(nsper) - tilt = 0; -ENDENTRY(setup(P)) -ENTRY0(tpers) - double omega, gamma; - - omega = pj_param(params, "dtilt").f * DEG_TO_RAD; - gamma = pj_param(params, "dazi").f * DEG_TO_RAD; - tilt = 1; - cg = cos(gamma); sg = sin(gamma); - cw = cos(omega); sw = sin(omega); -ENDENTRY(setup(P)) -*/ - - public String toString() { - return "Perspective"; - } + private static final long serialVersionUID = 4270222224128526324L; + + private static final double EPS10 = 1.e-10; + + private static final int N_POLE = 0; + private static final int S_POLE = 1; + private static final int EQUIT = 2; + private static final int OBLIQ = 3; + + /** + * {@code +h}, the height of the viewpoint above the centre of projection, in metres. + *

+ * No default. {@code pj_param(..., "dh").f} answers 0 for an absent {@code +h} and + * {@code nsper_setup} then rejects {@code pn1 == 0}, so a bare {@code +proj=nsper} is an + * error upstream. Initialised to 0 for exactly that reason, rather than to some plausible + * orbit. + */ + private double height = 0.0; + + private double sinph0; + private double cosph0; + private double p; + private double rp; + private double pn1; + private double pfact; + private double hRecip; + private int mode; + + /** {@code Q->cg}, {@code cos(gamma)}. Only {@code tpers} moves it off the identity. */ + double cg = 1.0; + /** {@code Q->sg}, {@code sin(gamma)}. */ + double sg = 0.0; + /** {@code Q->sw}, {@code sin(omega)}. */ + double sw = 0.0; + /** {@code Q->cw}, {@code cos(omega)}. */ + double cw = 1.0; + /** + * {@code Q->tilt}. False for {@code nsper} and true for {@code tpers}; the two forwards + * and the two inverses differ only by the block this flag guards. + */ + boolean tilt = false; + + /** + * {@code +h}, the height of the perspective viewpoint above the surface, in metres. + *

+ * Overriding this is the whole reason {@code +proj=nsper +h=1000000} now builds: the base + * class refuses, deliberately, because it cannot tell an inapplicable {@code +h} from an + * unimplemented one (see {@link Projection#setHeightOfOrbit(double)}). + *

+ * The value is not validated here. Upstream validates {@code h/a}, not {@code h}, + * and cannot do so until the ellipsoid is known — so the check lives in + * {@link #initialize()}. + * + * @param h height of the viewpoint above the centre of projection, in metres + */ + @Override + public void setHeightOfOrbit(double h) { + this.height = h; + } + + /** + * The {@code +h} in force. + * + * @return the height of the viewpoint above the centre of projection, in metres + */ + @Override + public double getHeightOfOrbit() { + return height; + } + + /** + * Port of {@code nsper_setup} ({@code nsper.cpp:139-166}). + * + * @throws InvalidValueException if {@code h/a} is non-positive or exceeds {@code 1e10}, + * where upstream raises {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} + */ + @Override + public void initialize() { + super.initialize(); + + if (Math.abs(Math.abs(projectionLatitude) - Math.PI / 2.0) < EPS10) { + mode = projectionLatitude < 0.0 ? S_POLE : N_POLE; + sinph0 = 0.0; + cosph0 = 0.0; + } else if (Math.abs(projectionLatitude) < EPS10) { + mode = EQUIT; + sinph0 = 0.0; + cosph0 = 0.0; + } else { + mode = OBLIQ; + sinph0 = FastStrictTrig.sin(projectionLatitude); + cosph0 = FastStrictTrig.cos(projectionLatitude); + } + + pn1 = height / a; /* normalize by radius */ + if (pn1 <= 0 || pn1 > 1e10) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+h=" + height + " gives h/a = " + pn1 + ", which " + getName() + + " rejects: upstream requires 0 < h/a <= 1e10 " + + "(nsper.cpp:155-159). The bound is on the ratio, not on h."); + } + p = 1.0 + pn1; + rp = 1.0 / p; + hRecip = 1.0 / pn1; + pfact = (p + 1.0) * hRecip; + + // nsper_setup:164, P->es = 0. Deliberately after super.initialize(), and deliberately + // not touching e/one_es/rone_es: see the class javadoc. + es = 0.0; + } + + /** + * {@code nsper_s_forward}, {@code nsper.cpp:38-87}. + * + * @throws ProjectionException at {@code xy.y < rp}, the far side of the globe as seen + * from the viewpoint, where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double sinphi = FastStrictTrig.sin(phi); + final double cosphi = FastStrictTrig.cos(phi); + double coslam = FastStrictTrig.cos(lam); + + switch (mode) { + case OBLIQ: + xy.y = sinph0 * sinphi + cosph0 * cosphi * coslam; + break; + case EQUIT: + xy.y = cosphi * coslam; + break; + case S_POLE: + xy.y = -sinphi; + break; + default: // N_POLE + xy.y = sinphi; + break; + } + if (xy.y < rp) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "the point is on the far side of the globe as seen from a viewpoint " + + height + " m up: cos(angular distance) = " + xy.y + + " < 1/(1 + h/a) = " + rp + " (nsper.cpp:61)"); + } + xy.y = pn1 / (p - xy.y); + xy.x = xy.y * cosphi * FastStrictTrig.sin(lam); + switch (mode) { + case OBLIQ: + xy.y *= (cosph0 * sinphi - sinph0 * cosphi * coslam); + break; + case EQUIT: + xy.y *= sinphi; + break; + case N_POLE: + coslam = -coslam; + xy.y *= cosphi * coslam; // PROJ_FALLTHROUGH into S_POLE, nsper.cpp:75 + break; + default: // S_POLE + xy.y *= cosphi * coslam; + break; + } + if (tilt) { + final double yt = xy.y * cg + xy.x * sg; + final double ba = 1.0 / (yt * sw * hRecip + cw); + xy.x = (xy.x * cg - xy.y * sg) * cw * ba; + xy.y = yt * ba; + } + return xy; + } + + /** + * {@code nsper_s_inverse}, {@code nsper.cpp:89-137}. + * + *

The {@code rh <= EPS10} short circuit answers {@code (0, phi0)} and therefore + * discards the tilt un-warp it has just performed. Upstream does the same, and it is + * consistent, because at the image centre the tilt is a no-op. + * + * @throws ProjectionException when the point lies off the visible disc, i.e. + * {@code 1 - rh*rh*pfact < 0} + */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + if (tilt) { + final double yt = 1.0 / (pn1 - y * sw); + final double bm = pn1 * x * yt; + final double bq = pn1 * y * cw * yt; + x = bm * cg + bq * sg; + y = bq * cg - bm * sg; + } + final double rh = StrictMath.hypot(x, y); + if (Math.abs(rh) <= EPS10) { + lp.x = 0.0; + lp.y = projectionLatitude; + return lp; + } + double sinz = 1.0 - rh * rh * pfact; + if (sinz < 0.0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "the projected point (" + x + ", " + y + ") is outside the visible disc: " + + "1 - rh^2*pfact = " + sinz + " < 0 (nsper.cpp:111)"); + } + sinz = (p - Math.sqrt(sinz)) / (pn1 / rh + rh / pn1); + final double cosz = Math.sqrt(1.0 - sinz * sinz); + switch (mode) { + case OBLIQ: + lp.y = StrictMath.asin(cosz * sinph0 + y * sinz * cosph0 / rh); + y = (cosz - sinph0 * FastStrictTrig.sin(lp.y)) * rh; + x *= sinz * cosph0; + break; + case EQUIT: + lp.y = StrictMath.asin(y * sinz / rh); + y = cosz * rh; + x *= sinz; + break; + case N_POLE: + lp.y = StrictMath.asin(cosz); + y = -y; + break; + default: // S_POLE + lp.y = -StrictMath.asin(cosz); + break; + } + lp.x = StrictMath.atan2(x, y); + return lp; + } + + @Override + public boolean hasInverse() { + return true; + } + @Override + public String toString() { + return "Near-sided perspective"; + } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PlateCarreeProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PlateCarreeProjection.java index cccb1c9..729fc0a 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PlateCarreeProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PlateCarreeProjection.java @@ -16,19 +16,114 @@ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.MeridianArc; +/** + * Equidistant Cylindrical, {@code +proj=eqc} — Plate Carrée when {@code +lat_ts=0}. + * + *

Port of {@code 9.8.1:src/projections/eqc.cpp}, which implements both EPSG:1029 + * (spherical) and EPSG:1028 (ellipsoidal, from IOGP Guidance Note 7-2 §3.2.5) and dispatches + * on {@code P->es != 0}. + * + *

+ * spherical:    x = cos(lat_ts) * lam                 y = phi - phi0
+ * ellipsoidal:  x = nu1 * cos(lat_ts) * lam           y = M(phi) - M(phi0)
+ *               nu1 = 1 / sqrt(1 - es sin^2(lat_ts))
+ * 
+ * + *

What this class used to be

+ * + *

An identity. It declared {@code hasInverse()} and {@code isRectilinear()} and nothing + * else, so every {@code +proj=eqc} coordinate fell through to {@code Projection}'s base + * {@code dst.x = x; dst.y = y}. That happens to be right for {@code +proj=eqc +a=R} with no other + * parameters, which is why 12 of the corpus's 34 {@code eqc} assertions passed — and it is why the + * other 22 failed by between 17 km and 5,010 km: {@code +lat_ts} was not applied, + * {@code +lat_0} was not applied, and there was no ellipsoidal branch at all. The 5,010 km + * rows are the {@code +lat_0=45} block, where a missing {@code M0} leaves the whole northing + * offset by the meridian arc to 45°. + * + * @see 9.8.1 eqc.cpp + */ public class PlateCarreeProjection extends CylindricalProjection { - - public boolean hasInverse() { - return true; - } - - public boolean isRectilinear() { - return true; - } - - public String toString() { - return "Plate Carr\u00e9e"; - } + + private static final long serialVersionUID = -4585080606120086184L; + + /** + * Upstream's {@code Q->rc}: {@code cos(lat_ts)} spherically, {@code nu1 * cos(lat_ts)} on + * the ellipsoid. Note it is dimensionless in both cases — {@code nu1} is normalised + * by {@code a}, and the {@code a} multiply happens in {@code Projection}'s affine tail. + */ + private double rc = 1.0; + + /** Upstream's {@code Q->M0}: the meridian arc at {@code +lat_0}, 0 on a sphere. */ + private double m0; + + /** Upstream's {@code Q->en}. Null in the spherical case, where upstream leaves it null too. */ + private MeridianArc meridian; + + /** + * Derives {@code rc}, {@code M0} and the meridian-arc series. Port of + * {@code PJ_PROJECTION(eqc)}. + * + * @throws InvalidValueException if {@code cos(lat_ts) <= 0}, i.e. {@code |lat_ts| > 90} + * degrees, which upstream rejects with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. Note the test + * is on the cosine and not on the angle, so it accepts + * {@code lat_ts} exactly at a pole and rejects past it. + */ + @Override + public void initialize() { + super.initialize(); + final double phi1 = trueScaleLatitude; + final double cosPhi1 = FastStrictTrig.cos(phi1); + if (cosPhi1 <= 0.) { + throw new InvalidValueException( + "Invalid value for +lat_ts: |lat_ts| should be <= 90 degrees, but is " + + Math.toDegrees(phi1)); + } + if (es != 0.0) { + final double sinPhi1 = FastStrictTrig.sin(phi1); + // nu1 normalised by a, exactly as upstream writes it. + final double nu1 = 1.0 / Math.sqrt(1.0 - es * sinPhi1 * sinPhi1); + rc = nu1 * cosPhi1; + meridian = MeridianArc.fromEs(es); + m0 = meridian.mlfn(projectionLatitude); + } else { + rc = cosPhi1; + meridian = null; + m0 = 0.0; + } + } + + /** Port of {@code eqc_s_forward}/{@code eqc_e_forward}. */ + @Override + public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + xy.x = rc * lam; + xy.y = meridian == null ? phi - projectionLatitude : meridian.mlfn(phi) - m0; + return xy; + } + + /** Port of {@code eqc_s_inverse}/{@code eqc_e_inverse}. */ + @Override + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { + lp.x = x / rc; + lp.y = meridian == null ? y + projectionLatitude : meridian.invMlfn(y + m0); + return lp; + } + + public boolean hasInverse() { + return true; + } + + public boolean isRectilinear() { + return true; + } + + public String toString() { + return "Plate Carr\u00e9e"; + } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PolyconicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PolyconicProjection.java index a47c8e2..9b3b700 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PolyconicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PolyconicProjection.java @@ -21,12 +21,20 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; public class PolyconicProjection extends Projection { + private static final long serialVersionUID = -7631403866540203355L; + private double ml0; - private double[] en; + + /** + * The order-6 meridional-arc series, {@code 9.8.1:src/mlfn.cpp}. Null when + * {@code spherical}. + */ + private MeridianArc meridian; private final static double TOL = 1e-10; private final static double CONV = 1e-10; @@ -63,8 +71,14 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { } else { sp = Math.sin(lpphi); ms = Math.abs(cp = Math.cos(lpphi)) > TOL ? ProjectionMath.msfn(sp, cp, es) / sp : 0.; - out.x = ms * Math.sin(out.x *= sp); - out.y = (ProjectionMath.mlfn(lpphi, sp, cp, en) - ml0) + ms * (1. - Math.cos(lplam)); + // 9.8.1:poly.cpp:37-40: lam is scaled by sin(phi) *first*, and both the + // sin and the cos are taken of the scaled value. proj4j read the + // destination's stale x as the multiplicand (out.x *= sp) and then used + // the *unscaled* lplam in the cosine. Both were unreachable while + // initialize() forced the spherical branch. + final double e = lplam * sp; + out.x = ms * Math.sin(e); + out.y = (meridian.mlfn(lpphi, sp, cp) - ml0) + ms * (1. - Math.cos(e)); } } return out; @@ -76,7 +90,11 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) double B, dphi, tp; int i; - if (Math.abs(lpphi = projectionLatitude + xyy) <= TOL) { + // 9.8.1:poly.cpp:112 mutates xy.y to phi0 + xy.y and uses the *mutated* + // value both as the seed and in B. proj4j tested the sum but then reverted to + // the raw northing, so the spherical inverse ignored lat_0 entirely. + xyy = projectionLatitude + xyy; + if (Math.abs(xyy) <= TOL) { out.x = xyx; out.y = 0.; } else { lpphi = xyy; @@ -106,9 +124,11 @@ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) if (Math.abs(cp) < ITOL) throw new ProjectionException("I"); c = sp * (mlp = Math.sqrt(1. - es * sp * sp)) / cp; - ml = ProjectionMath.mlfn(lpphi, sp, cp, en); + ml = meridian.mlfn(lpphi, sp, cp); mlb = ml * ml + r; - mlp = (1.0 / es) / (mlp * mlp * mlp); + // 9.8.1:poly.cpp:88 is one_es / (mlp^3), i.e. (1 - es); proj4j had + // (1 / es), which for GRS80 is 149 -- off by a factor of 150. + mlp = one_es / (mlp * mlp * mlp); lpphi += ( dPhi = ( ml + ml + c * mlb - 2. * xyy * (c * ml + 1.) ) / ( es * s2ph * (mlb - 2. * xyy * ml) / c + @@ -132,12 +152,13 @@ public boolean hasInverse() { public void initialize() { super.initialize(); -spherical = true;//FIXME + // The `spherical = true; //FIXME` that used to sit here ran *after* + // super.initialize() had computed the real value, so the entire ellipsoidal branch + // below was dead code -- km-scale errors for every ellipsoidal +proj=poly, which + // is all US State Plane Polyconic. 9.8.1:poly.cpp:157 selects on P->es != 0. if (!spherical) { - en = ProjectionMath.enfn(es); - if (en == null) - throw new ProjectionException("E"); - ml0 = ProjectionMath.mlfn(projectionLatitude, Math.sin(projectionLatitude), Math.cos(projectionLatitude), en); + meridian = MeridianArc.fromEs(es); + ml0 = meridian.mlfn(projectionLatitude, Math.sin(projectionLatitude), Math.cos(projectionLatitude)); } else { ml0 = -projectionLatitude; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PolynomialPseudoCylindricalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PolynomialPseudoCylindricalProjection.java new file mode 100644 index 0000000..343b8f0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PolynomialPseudoCylindricalProjection.java @@ -0,0 +1,173 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Shared machinery for the four Flex Projector-derived pseudo-cylindricals that PROJ + * 9.8.1 implements as four separate files with one algorithm: + * {@code natearth.cpp}, {@code natearth2.cpp}, {@code patterson.cpp} and + * {@code comill.cpp}. + * + *

All four were designed interactively in Flex Projector by Tom Patterson and then + * fitted with odd polynomials by Bojan Savric and Bernhard Jenny. The shape is therefore + * defined by its polynomial — there is no closed-form geometry behind it to + * appeal to — which is why the coefficients must be transcribed exactly and the evaluation + * order preserved (see below). + * + *

The common form

+ * + *
+ *   forward:   x = lam * E(phi)          y = N(phi)
+ *   inverse:   clamp y into [-MAX_Y, MAX_Y]
+ *              solve N(yc) = y for yc by Newton-Raphson, N'(.) supplied
+ *              phi = yc                  lam = x / E(yc)
+ * 
+ * + *

{@code N} is odd in {@code phi} and {@code E} is even, so all four maps are symmetric + * about both axes. {@code E} is identically 1 for {@code patterson} and {@code comill}, + * whose easting is simply {@code lam} — they are "compact Miller"-style maps that only + * reshape the parallels. + * + *

Why the derivative is a separate polynomial and not {@code N'} recomputed

+ * + *

Upstream hard-codes the derivative's coefficients as small integer multiples of the + * northing's ({@code C1 = 3*B1}, {@code C2 = 7*B2}, and so on) rather than differentiating + * at run time, and the multipliers differ per projection because the powers of + * {@code phi} that each polynomial actually carries differ. {@code natearth}'s northing is + * {@code phi*(B0 + phi^2*(B1 + phi^4*(B2 + B3 phi^2 + B4 phi^4)))}, i.e. terms in + * {@code phi^1, phi^3, phi^7, phi^9, phi^11} — hence {@code 1, 3, 7, 9, 11}. Getting these + * wrong does not break convergence, it just slows it, so a transcription error here hides + * rather than announcing itself. {@link #northingDerivative(double)} is therefore + * specified per subclass and unit-tested against a finite difference. + * + *

Fail-closed, where upstream returns a coordinate anyway

+ * + *

On Newton exhaustion all four upstream inverses call + * {@code proj_context_errno_set(P->ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN)} + * and then carry on and return {@code lp} anyway, with {@code phi} set to the + * unconverged {@code yc}. A caller that does not check {@code proj_errno} receives a + * plausible latitude. Proj4J throws instead — non-negotiable 3. No corpus row reaches this + * path (100 iterations of Newton on a monotone odd polynomial converges in a handful of + * steps everywhere inside the clamp), so this cannot cost an assertion, and it removes a + * silent-wrong-answer path. + * + * @see NaturalEarthProjection + * @see NaturalEarth2Projection + * @see PattersonProjection + * @see CompactMillerProjection + */ +abstract class PolynomialPseudoCylindricalProjection extends CylindricalProjection { + + private static final long serialVersionUID = 3588132591005670796L; + + /** Upstream's {@code EPS}/{@code EPS11}: {@code 1e-11}, identical in all four files. */ + protected static final double EPS = 1e-11; + + /** + * Upstream's {@code MAX_ITER}, identical in all four files. Its own comment is "Not + * sure at all of the appropriate number for MAX_ITER..." — it is a safety net, not a + * tuned budget. + */ + protected static final int MAX_ITER = 100; + + /** {@code N(phi)}: the northing, before the {@code a} scaling. Odd in {@code phi}. */ + protected abstract double northing(double phi); + + /** {@code N'(phi)}, as upstream's separately-tabulated {@code C} coefficients. */ + protected abstract double northingDerivative(double phi); + + /** + * {@code E(phi)}: the factor multiplying {@code lam} in the easting. Even in + * {@code phi}, and never zero anywhere inside {@code [-MAX_Y, MAX_Y]}. + */ + protected abstract double eastingScale(double phi); + + /** The northing clamp applied by the inverse before solving. */ + protected abstract double maxY(); + + /** + * Whether the Newton seed is captured before the northing is clamped. + * + *

{@code true} only for {@code patterson}, and it is an upstream quirk rather than a + * design choice: {@code patterson.cpp:80} assigns {@code yc = xy.y} and only then + * {@code :83-87} clamps {@code xy.y}, so for a northing beyond {@code MAX_Y} the seed + * and the target disagree. {@code natearth}, {@code natearth2} and {@code comill} all + * clamp first ({@code natearth.cpp:63-70}). The two orders give the same answer + * whenever {@code |y| <= MAX_Y}, which is every corpus row; outside it they differ + * only in how many Newton steps are spent walking back. Reproduced rather than + * normalised, because it is observable and costs nothing. + */ + protected boolean seedBeforeClamp() { + return false; + } + + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + dst.x = lam * eastingScale(phi); + dst.y = northing(phi); + return dst; + } + + /** + * The shared Newton inverse. Transcribed from {@code natearth.cpp:56-93}, including the + * post-decrement convergence test — the correction is applied before it is + * tested, so a step that lands exactly on the answer still counts as converged. + * + * @throws ConvergenceFailureException where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} and returns a + * coordinate regardless + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double limit = maxY(); + double yc = seedBeforeClamp() ? y : 0.0; + double target = y; + if (target > limit) { + target = limit; + } else if (target < -limit) { + target = -limit; + } + if (!seedBeforeClamp()) { + yc = target; + } + + int i = MAX_ITER; + double correction = Double.NaN; + for (; i > 0; --i) { + correction = (northing(yc) - target) / northingDerivative(yc); + yc -= correction; + if (Math.abs(correction) < EPS) { + break; + } + } + if (i == 0) { + throw new ConvergenceFailureException(this, + "inverse northing iteration did not converge to " + EPS + " within " + + MAX_ITER + " iterations for y = " + y + " (last correction " + + correction + ")"); + } + + dst.y = yc; + dst.x = x / eastingScale(yc); + return dst; + } + + public boolean hasInverse() { + return true; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Projection.java index a3def21..946c6e3 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Projection.java @@ -16,7 +16,6 @@ package org.locationtech.proj4j.proj; -import java.util.NoSuchElementException; import java.util.Objects; import org.locationtech.proj4j.*; @@ -40,6 +39,22 @@ */ public abstract class Projection implements Cloneable, java.io.Serializable { + /** + * Pinned so that a {@code Projection} shipped inside a Spark closure does not fail with + * {@link java.io.InvalidClassException} against an executor running a differently-compiled + * copy of this class. Every {@code Projection} subclass now declares one too. + * + *

The value is not arbitrary: it is what {@code serialver} computed for this + * class immediately before the field was added, so streams written by the previous build + * stay readable. Declaring a UID freezes it, so from here on the compatibility rules of + * the Java serialization specification apply — adding or removing a non-transient field + * changes the serialised form even though the UID no longer says so. + * + *

Enforced by {@code SerialVersionUidTest}, which fails if any serialisable class in + * {@code core/src/main} lacks one. + */ + private static final long serialVersionUID = -4685935599437104452L; + /** * The minimum latitude of the bounds of this projection */ @@ -150,6 +165,15 @@ public abstract class Projection implements Cloneable, java.io.Serializable { */ protected boolean geocentric; + /** + * PROJ's {@code P->over}, the {@code +over} flag: do not reduce the inverse's + * longitude to ±π. + *

+ * Default false, which is PROJ's default and the behaviour every projection here had before + * the field existed. See {@link #setOver(boolean)} for what reads it and what does not. + */ + private boolean over = false; + /** * The name of this projection */ @@ -165,6 +189,29 @@ public abstract class Projection implements Cloneable, java.io.Serializable { */ protected double totalScale = 0; + /** + * PROJ's {@code P->ra}, generalised to Proj4J's {@link #totalScale}: {@code 1.0 / totalScale}, + * recomputed by {@link #initialize()}. + *

+ * The inverse multiplies by this rather than dividing by {@link #totalScale}, because + * {@code 9.8.1:src/inv.cpp:85-93} does — {@code coo.xyz.x *= P->ra;}, with + * {@code P->ra = 1. / P->a} set at {@code ell_set.cpp:618}. Upstream's comment gives + * {@code calcofi} as the motive (it "stomps on {@code a}"), and Proj4J reproduces that too, + * because {@code CalCOFIProjection.initialize()} assigns {@code a = 1} before calling + * {@code super.initialize()}, so this field is captured from the stomped value exactly as + * {@code P->ra} is. + *

+ * But the two are not interchangeable even without {@code calcofi}, and that is the reason this + * field exists rather than a comment: {@code -20037508.342789244 / 6378137} is + * {@code -pi - 1 ulp}, whose {@code atan2} is {@code +pi}, while + * {@code -20037508.342789244 * (1.0 / 6378137)} is exactly {@code -pi}, whose + * {@code atan2} is {@code -pi}. That one ulp was the whole of the {@code EPSG:3857} → + * {@code EPSG:4055} sign error at the antimeridian. + * + * @since 1.5.0 + */ + private double totalScaleReciprocal = Double.POSITIVE_INFINITY; + /** * falseEasting, adjusted to the appropriate units using fromMetres */ @@ -196,6 +243,36 @@ public abstract class Projection implements Cloneable, java.io.Serializable { protected final static double RTD = 180.0/Math.PI; protected final static double DTR = Math.PI/180.0; + /** + * PROJ's {@code PJ_EPS_LAT} ({@code 9.8.1:src/proj_internal.h:99}): the largest latitudinal + * overshoot {@code fwd_prepare} accepts, in radians. + *

+ * {@code 1e-12} rad is about {@code 5.7e-11} degrees, or 0.006 µm on the ground. It is + * the width of the band inside which a latitude past the pole is treated as rounding noise + * and clamped to exactly ±π/2; anything beyond it is rejected. Latitude + * 90.000001° overshoots by {@code 1.745e-8} rad and is therefore rejected. + *

+ * Do not approximate this in degree space and do not widen it: PROJ chose the value so that + * legitimate rounding noise is absorbed and genuine bad input is not. + * + * @since 1.5.0 + */ + public final static double PJ_EPS_LAT = 1e-12; + + /** + * {@code fwd_prepare}'s longitude bound ({@code 9.8.1:src/fwd.cpp:67}), in radians: + * {@code |lambda| > 10} is rejected, everything inside is wrapped. + *

+ * 10 radians is about ±573°. PROJ does not reject longitude outside + * [−180, 180], and neither does Proj4J: a caller legitimately passing 200° or + * −190° must keep working, so a tighter bound here would be stricter than PROJ. + * + * @since 1.5.0 + */ + public final static double MAX_LAM_RAD = 10.0; + + private final static double HALF_PI = Math.PI / 2.0; + protected Projection() { setEllipsoid( Ellipsoid.SPHERE ); } @@ -219,10 +296,10 @@ public Object clone() { * @return the target coordinate */ public ProjCoordinate project( ProjCoordinate src, ProjCoordinate dst ) { - double x = src.x*DTR; - if ( projectionLongitude != 0 ) - x = ProjectionMath.normalizeLongitude( x-projectionLongitude ); - return projectRadians(x, src.y*DTR, dst); + // The lam0 subtraction and the wrap used to happen HERE, ahead of the funnel, which put + // them ahead of the domain check as well. Both now live in + // projectRadians(double, double, ProjCoordinate), in fwd_prepare's order. See there. + return projectRadians(src.x*DTR, src.y*DTR, dst); } /** @@ -235,23 +312,159 @@ public ProjCoordinate project( ProjCoordinate src, ProjCoordinate dst ) { * */ public ProjCoordinate projectRadians( ProjCoordinate src, ProjCoordinate dst ) { - double x = src.x; - if ( projectionLongitude != 0 ) - x = ProjectionMath.normalizeLongitude( x-projectionLongitude ); - return projectRadians(x, src.y, dst); + return projectRadians(src.x, src.y, dst); } /** * Transform a geographic point (in radians), * producing a projected result (in the units of the target coordinate system). + *

+ * This is the private funnel every forward projection passes through, and so it is + * where PROJ's host-level input contract and output check live, in {@code fwd_prepare}'s own + * order: + *

    + *
  1. {@link #checkForwardDomain} reproduces {@code fwd_prepare} + * ({@code 9.8.1:src/fwd.cpp:54-77}) on the raw longitude and latitude, and returns + * the clamped latitude;
  2. + *
  3. then {@code projectionLongitude} is subtracted and the result wrapped + * ({@code fwd.cpp:105-111});
  4. + *
  5. the raw {@link #project(double, double, ProjCoordinate)} result is tested for + * finiteness before the affine post-multiply.
  6. + *
* - * @param x the geographic x ordinate (in radians) - * @param y the geographic y ordinate (in radians) + *

Step 1 before step 2, which is not where they used to be

+ * + *

{@code project(ProjCoordinate, ProjCoordinate)} and + * {@code projectRadians(ProjCoordinate, ProjCoordinate)} each used to do the subtraction and the + * wrap themselves, before handing over to this funnel — so the domain check ran on the + * reduced longitude, and two classes of bad input got through whenever + * {@code lon_0 != 0}. Upstream has no such hole: {@code fwd.cpp:40} tests {@code HUGE_VAL} and + * {@code fwd.cpp:57-70} tests both ranges first, and only then does {@code fwd.cpp:105} + * reach {@code coo.lp.lam = (coo.lp.lam - P->from_greenwich) - P->lam0}. Both measured, on + * {@code +proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84}: + * + * + * + * + * + * + * + * + * + * + *
domain checks against the reduced longitude
inputbeforewith {@code lon_0=0}
{@code (+Infinity, 0.5)}{@code (NaN, NaN)}, no exception — {@code adjlon(inf)} is {@code inf - inf}, i.e. + * {@code NaN} (faithfully to {@code 9.8.1:src/adjlon.cpp}), and the {@code NaN} route + * then propagated what should have been refused{@link ErrorCause#INVALID_COORDINATE}, correctly
{@code (20.0 rad, 0.5)}{@code (-3819350.5146746966, 5273204.385775552)} — a wholly plausible coordinate from + * a longitude of 1146°, because after reduction and wrapping the value tested was + * inside {@link #MAX_LAM_RAD}{@link ErrorCause#INVALID_COORDINATE}, correctly
+ * + *

The same asymmetry made {@code +over} misbehave in the opposite direction: a raw longitude + * of 9.9 rad is legal, but with {@code lon_0=-150} and no wrap to bring it back the reduced + * value was 12.5 rad, and the check — being applied after the reduction — rejected a + * coordinate upstream accepts. Checking the raw value fixes both directions at once, which is + * why the check moved rather than being duplicated. + * + *

Step 3 is what makes it arithmetically impossible for a projection to answer an + * internal {@code NaN} with the false easting/northing: for finite input, + * {@code totalFalseEasting} is only ever added to a number already known to be finite. + * Proj4J 1.4.3 applied the affine unconditionally, so {@code NaN * totalScale + + * totalFalseEasting} produced {@code (x_0, y_0)} whenever the kernel produced {@code NaN} in + * a projection whose {@code totalScale} was zero, and {@code NaN} otherwise — one of the two + * shapes a caller cannot detect. + * + *

{@code NaN} input is propagated, not rejected — and that is deliberate

+ * + *

A {@code NaN} the caller supplied is propagated, by an early return taken + * before {@link #project(double, double, ProjCoordinate)}: the checks are skipped, the + * kernel is never invoked, and the answer is {@code NaN} in both ordinates. That is + * {@code 9.8.1:src/trans.cpp:352-354} exactly — {@code pj_coord_has_nans} short-circuits ahead + * of {@code pj_fwd4d}, so no upstream kernel ever sees a {@code NaN} either. It matters that + * the early return is here and not in the kernels: {@code laea_e_forward}'s polar arm ends + * {@code else out.x = out.y = 0.;}, i.e. the origin for undefined input, and that + * statement is unreachable upstream for precisely this reason. Doing the same at this funnel + * makes the identical latent arm unreachable in all ~110 kernels here at once, rather than + * needing 110 separate fixes. Three independent reasons for propagating rather than throwing, + * and it took a conformance regression to establish that this is not a hole in the fail-closed + * policy but a distinction the policy has to make: + * + *

    + *
  • PROJ does it deliberately. {@code fwd_prepare} compares against + * {@code HUGE_VAL} only, and every range comparison it makes is false for {@code NaN}, so + * upstream lets {@code NaN} flow through untouched. Its {@code adjlon} is + * {@code NaN}-transparent for the same reason, and several upstream convergence tests are + * written inverted — {@code !(|dtau| >= stol)}, {@code !(|tau| < TMAX)} — specifically so + * that {@code NaN} takes the exit branch. This is careful, not accidental.
  • + *
  • The corpus asserts it. The {@code gie} comparator's first metric branch is + * {@code isnan(got) && isnan(expected) -> d = 0}, i.e. a pass, and + * {@code roundtrip} defines all-{@code NaN}-in / all-{@code NaN}-out as residual + * {@code 0.0}. Rows exist that assert exactly that. Rejecting {@code NaN} input trades + * silent wrong answers for a conformance regression.
  • + *
  • It is honest. The caller asked about an undefined point and got an undefined + * point back. Nothing was invented and nothing was hidden — which is the actual content + * of the no-sentinels rule, not "never return {@code NaN}".
  • + *
+ * + *

So the three cases are: + * + * + * + * + * + * + * + * + * + * + * + *
input to outcome
inputoutcomewhy
{@code NaN}{@code NaN} result, no throwpropagated; the caller supplied the undefinedness
±{@code Infinity}, or finite outside the contract{@link ErrorCause#INVALID_COORDINATE}a well-formed question with an answer PROJ refuses to give
finite, in contract, non-finite output{@link ErrorCause#NUMERICAL_FAILURE}the arithmetic failed; nothing in the input excuses it
+ * + * @param lam the geographic longitude, in radians, as the caller supplied it: the + * central meridian has not been subtracted yet and the value has not been wrapped + * @param phi the geographic latitude, in radians * @param dst the projected coordinate (in coordinate system units) * @return the target coordinate - */ - private ProjCoordinate projectRadians(double x, double y, ProjCoordinate dst ) { + * @throws ProjectionException with {@link ErrorCause#INVALID_COORDINATE} if the input is + * infinite or finite-but-outside PROJ's angular input contract, or with + * {@link ErrorCause#NUMERICAL_FAILURE} if finite input produced a non-finite result + */ + private ProjCoordinate projectRadians(double lam, double phi, ProjCoordinate dst ) { + double x = lam; + double y = phi; + if (Double.isNaN(x) || Double.isNaN(y)) { + // 9.8.1:src/trans.cpp:352-354 -- `if (pj_coord_has_nans(coord)) coord.v[0] = ... = + // quiet_NaN();` -- is an early return taken BEFORE pj_fwd4d, so upstream never invokes + // the operation at all on a coordinate carrying a NaN. Reproducing it here rather than + // in each kernel is what makes the identical latent bug in all ~110 of them + // unreachable: laea_e_forward's own polar arm ends `else out.x = out.y = 0.;`, and that + // zero is dead code upstream for exactly this reason. Confirmed against the installed + // 9.8.1 gie, which reports `GOT nan nan` and stays `nan nan` when +x_0=1000000 is + // added, proving the zero never reaches fwd_finalize. + dst.x = Double.NaN; + dst.y = Double.NaN; + return dst; + } + // fwd.cpp:40-70, on the RAW coordinate. Both range tests are upstream's, in upstream's + // order, and both are taken before anything is subtracted from the longitude. + y = checkForwardDomain(x, y); + // fwd.cpp:105-111 -- and only now. `+Infinity` and |lam| > 10 rad can no longer reach this + // arithmetic, so adjlon can no longer launder an infinity into a NaN behind the guard's + // back. + if ( projectionLongitude != 0 ) { + x -= projectionLongitude; + // fwd_prepare (9.8.1:src/fwd.cpp:109-111) subtracts lam0 unconditionally and + // wraps only when `+over` is off. Splitting the two apart matters: folding the + // wrap into the same guard would have skipped the SUBTRACTION too under +over, + // which is a change of central meridian rather than a change of wrapping. + if ( !over ) + x = ProjectionMath.normalizeLongitude( x ); + } project(x, y, dst); + if (!dst.hasValidXandYOrdinates()) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "forward projection of (" + x + ", " + y + ") rad returned a non-finite " + + "coordinate (" + dst.x + ", " + dst.y + "); refusing to apply " + + "totalScale/false easting to it"); + } if (unit != null && unit.equals(Units.DEGREES)) { // convert radians to DD dst.x *= RTD; @@ -265,6 +478,61 @@ private ProjCoordinate projectRadians(double x, double y, ProjCoordinate dst ) { return dst; } + /** + * PROJ's {@code fwd_prepare} angular input contract, {@code 9.8.1:src/fwd.cpp:54-77}, in the + * order upstream applies it: reject non-finite, reject a latitude past the pole by more than + * {@link #PJ_EPS_LAT}, reject {@code |lambda| >} {@link #MAX_LAM_RAD}, then clamp + * the latitude to exactly ±π/2. + *

+ * Three things about this are deliberate and easy to get wrong: + *

    + *
  • The latitude bound is on {@code |phi| - pi/2} in radians, not on degrees, and + * the comparison is strictly greater — so 90° exactly is accepted, and so is + * anything within {@code 1e-12} rad beyond it, which is then clamped. Doing this in + * degree space misclassifies points a micro-degree from the pole.
  • + *
  • There is no [−180, 180] longitude rejection. The only longitude bound is + * {@code |lambda| > 10} radians; see {@link #MAX_LAM_RAD}.
  • + *
  • {@code NaN} must not reach this method. Callers test for it first and propagate + * it; see {@link #projectRadians(double, double, ProjCoordinate)}. Only + * ±{@code Infinity} is rejected here, matching upstream: {@code +Infinity} trips + * {@code fwd_prepare}'s {@code HUGE_VAL} test directly and {@code -Infinity} trips the + * latitude range test, so both are errors in PROJ and both are errors here.
  • + *
+ * + * @param lam longitude relative to the central meridian, radians; must not be {@code NaN} + * @param phi latitude, radians; must not be {@code NaN} + * @return {@code phi}, clamped into {@code [-pi/2, pi/2]} + * @throws ProjectionException with {@link ErrorCause#INVALID_COORDINATE} for every input + * PROJ answers with {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD} (2049) + * @since 1.5.0 + */ + protected double checkForwardDomain(double lam, double phi) { + if (Double.isInfinite(lam) || Double.isInfinite(phi)) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, this, + "infinite geographic input (" + lam + ", " + phi + ") rad"); + } + double overshoot = Math.abs(phi) - HALF_PI; + if (overshoot > PJ_EPS_LAT) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, this, + "invalid latitude " + (phi * RTD) + " deg: |phi| - pi/2 = " + overshoot + + " rad exceeds PJ_EPS_LAT = " + PJ_EPS_LAT); + } + if (lam > MAX_LAM_RAD || lam < -MAX_LAM_RAD) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, this, + "invalid longitude " + lam + " rad (" + (lam * RTD) + " deg): outside +/-" + + MAX_LAM_RAD + " rad"); + } + // Inside the slop band, clamp to exactly the pole. fwd.cpp:72-77. + if (phi > HALF_PI) { + return HALF_PI; + } + if (phi < -HALF_PI) { + return -HALF_PI; + } + return phi; + } + + /** * Computes the projection of a given point * (i.e. from geographics to projection space). @@ -306,26 +574,125 @@ public ProjCoordinate inverseProject(ProjCoordinate src, ProjCoordinate dst) { * */ public ProjCoordinate inverseProjectRadians(ProjCoordinate src, ProjCoordinate dst) { + if (Double.isNaN(src.x) || Double.isNaN(src.y)) { + // The same early return as the forward funnel, and the same citation: + // 9.8.1:src/trans.cpp:352-354 short-circuits ahead of pj_inv4d as well as pj_fwd4d, so + // no inverse kernel is ever invoked on a coordinate carrying a NaN. See + // projectRadians(double, double, ProjCoordinate) for the measurements and for why the + // answer is a NaN RESULT rather than an exception. + // + // One consequence is deliberate and is upstream's: a projection with no inverse at all + // answers NaN here instead of ErrorCause#NO_INVERSE_AVAILABLE, because the capability + // gate lives in projectInverse and projectInverse is no longer reached. That is + // faithful -- trans.cpp does not consult P->inv either -- and it costs nothing, since + // hasInverse() is the API for asking about capability and every FINITE coordinate still + // gets NO_INVERSE_AVAILABLE. Measured: 21 of the 131 constructible projections take + // that path. Note also that hasInverse() is NOT a sound capability predicate on its own + // -- krovak and nzmg both return false while overriding projectInverse -- so hoisting + // the gate out of projectInverse to keep the throw would have broken their inverses. + dst.x = Double.NaN; + dst.y = Double.NaN; + return dst; + } double x; double y; if (unit != null && unit.equals(Units.DEGREES)) { // convert DD to radians x = src.x * DTR; y = src.y * DTR; + // The second entry point for the angular input contract, and the one that matters + // most in practice. BasicCoordinateTransform calls + // srcCRS.getProjection().inverseProjectRadians(tgt, tgt) even for a *geographic* + // source, where LongLatProjection's "inverse" is just this multiply by DTR. So this + // is where EPSG:4326 input at latitude 90.000001 deg actually enters the library -- + // it never reaches projectRadians at all. Guarding only the forward funnel leaves + // the commonest source CRS in the world unchecked. + y = checkForwardDomain(x, y); } else { - x = (src.x - totalFalseEasting) / totalScale; - y = (src.y - totalFalseNorthing) / totalScale; + // inv_prepare (9.8.1:src/inv.cpp) tests HUGE_VAL and nothing else: its input is + // planar, so there is no latitude or longitude range to check. + if (Double.isInfinite(src.x) || Double.isInfinite(src.y)) { + throw new ProjectionException(ErrorCause.INVALID_COORDINATE, this, + "infinite projected input (" + src.x + ", " + src.y + ")"); + } + // MULTIPLY by the reciprocal, do not divide -- 9.8.1:src/inv.cpp:85-93 is + // `coo.xyz.x *= P->ra;` and it carries a comment explaining the choice ("Multiplying by + // ra, rather than dividing by a because the CalCOFI projection stomps on a and hence + // (apparently) depends on this to roundtrip correctly"). It is not only about calcofi: + // the two are not the same number. + // + // -20037508.342789244 / 6378137 = -pi - 1 ulp -> atan2 gives +pi + // -20037508.342789244 * (1.0 / 6378137) = exactly -pi -> atan2 gives -pi + // + // so EPSG:3857 -> EPSG:4055 at the western antimeridian returned +180 where PROJ + // returns -180. Master survived it only because the inverse CLAMPED longitude to +/-pi + // and the clamp happened to force -pi; removing the clamp was correct (PROJ wraps, it + // does not clamp) and it exposed the division underneath. + x = (src.x - totalFalseEasting) * totalScaleReciprocal; + y = (src.y - totalFalseNorthing) * totalScaleReciprocal; } projectInverse(x, y, dst); - if (dst.x < -Math.PI) - dst.x = -Math.PI; - else if (dst.x > Math.PI) - dst.x = Math.PI; - if (projectionLongitude != 0) - dst.x = ProjectionMath.normalizeLongitude(dst.x+projectionLongitude); + // Checked BEFORE the clamp and the wrap, which is the whole point. A NaN from + // projectInverse passes both clamp comparisons (NaN fails every < and >) and then + // reached normalizeLongitude -- which threw, but only when projectionLongitude != 0. So + // the identical defect threw for +lon_0=15 and returned garbage for +lon_0=0. That one + // asymmetry accounts for most "sometimes it throws, sometimes it returns a coordinate" + // reports against 1.4.3. + if (!dst.hasValidXandYOrdinates()) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "inverse projection of (" + x + ", " + y + ") returned a non-finite " + + "coordinate (" + dst.x + ", " + dst.y + ")"); + } + + // PROJ's inv_finalize (9.8.1:src/inv.cpp:113-117), which is two statements: + // + // coo.lp.lam = coo.lp.lam + P->from_greenwich + P->lam0; + // if (0 == P->over) + // coo.lpz.lam = adjlon(coo.lpz.lam); + // + // Add the central meridian, then WRAP unless `+over` says not to. + // `from_greenwich` is applied separately, by PrimeMeridian in BasicCoordinateTransform. + // + // This used to CLAMP to +/-pi first -- + // + // if (dst.x < -Math.PI) dst.x = -Math.PI; + // else if (dst.x > Math.PI) dst.x = Math.PI; + // if (projectionLongitude != 0) + // dst.x = ProjectionMath.normalizeLongitude(dst.x + projectionLongitude); + // + // -- and a clamp is a silent substitution, not a reduction: it discards the revolution + // count instead of removing it, so any inverse kernel that legitimately accumulates + // longitude past the antimeridian had its answer replaced by the antimeridian itself. + // Measured on +proj=lsat +lsat=3 +path=120, whose kernel accumulates along-track rotation + // in `lamt - p22 * lamdp`: at (130, 45) it returns 533.2 deg, the clamp turned that into + // 180 deg, and the final answer into 136.758 deg -- 6.76 deg wrong, with no error raised. + // adjlon returns the correct value because 533.2 - 360 = 173.2 is the same meridian. + // + // The second half of the defect was the `projectionLongitude != 0` guard: with +lon_0=0 + // no reduction happened at all, so the identical bad input threw for +lon_0=15 and + // returned a plausible wrong coordinate for +lon_0=0. + // + // A NaN the caller supplied never reaches this line at all: the trans.cpp early return at + // the top of this method already answered it. (adjlon would have been NaN-transparent + // anyway -- 9.8.1:src/adjlon.cpp, where |NaN| < pi + 1e-12 is false so NaN falls through + // the arithmetic -- but relying on that left the KERNEL free to fabricate a finite value + // from NaN, which is the defect the early return closes.) A NaN arising from FINITE input + // never reaches this line either; the postcondition above rejects it. + // + // Note adjlon keeps PROJ's own limitation that a single floor loses the low bits of a + // huge argument, so adjlon(1e18) is 124.858 rather than something inside +/-pi. That is + // upstream's number and is deliberately reproduced. + // + // `over` is honoured, so PROJ's else-branch is reachable, and it is now reachable from a + // proj-string as well: Proj4Parser dispatches +over to setOver. +proj=calcofi still sets + // the flag from its own initialize(), because calcofi.cpp:141 hard-codes P->over = 1. + dst.x = dst.x + projectionLongitude; + if (!over) { + dst.x = ProjectionMath.adjlon(dst.x); + } return dst; } @@ -335,12 +702,62 @@ else if (dst.x > Math.PI) * (i.e. from projection space to geographics). * This should be overridden for all projections. * + *

This is no longer an unconditional identity

+ * + *

It used to be {@code dst.x = x; dst.y = y;} for every subclass that did not override it, + * and nothing anywhere consulted {@link #hasInverse()} — which is declared 66 times across + * 102 classes and, before 1.5.0, was read nowhere in {@code core/src/main}. The + * consequence was that 33 forward-only projections used as a source CRS returned the + * projected metres back as if they were lon/lat radians: {@code Airy}, {@code Aitoff}, + * {@code August}, {@code Boggs}, {@code Denoyer}, {@code Euler}, {@code Foucaut}, + * {@code Ginsburg8}, {@code Hammer}, {@code KavraiskyV}, {@code Lagrange}, + * {@code LambertEqualAreaConic}, {@code Larrivee}, {@code Laskowski}, + * {@code McBrydeThomasFlatPolarSine1}, {@code Murdoch1/2/3}, {@code Nicolosi}, + * {@code PerspectiveConic}, {@code Perspective}, {@code PutninsP5P}, + * {@code QuarticAuthalic}, {@code RectangularPolyconic}, {@code Tissot}, + * {@code TranverseCentralCylindrical}, {@code Vitkovsky}, {@code Wagner1/4/5/7}, + * {@code Werenskiold}, {@code WinkelTripel}. + * + *

So the identity is now opt-in: it is returned only by a projection that declares + * {@link #hasInverse()}, or by a geographic pseudo-projection ({@link #isGeographic()}). + * Everything else raises {@link ErrorCause#NO_INVERSE_AVAILABLE}. + * + *

The two predicates are both needed, and neither is redundant: + *

    + *
  • {@code LongLatProjection.hasInverse()} is {@code false} — it inherits the base — yet + * its inverse is real and is the DTR multiply in + * {@link #inverseProjectRadians(ProjCoordinate, ProjCoordinate)}. Gating on + * {@code hasInverse()} alone would break every geographic source CRS, EPSG:4326 + * included.
  • + *
  • {@code PlateCarreeProjection} ({@code +proj=eqc}) and {@code LinearProjection} declare + * {@code hasInverse()} and their real inverse is this identity, because their + * forward is the base identity too.
  • + *
+ * + *

There is no longer any case knowingly left silent. {@code LandsatProjection} used to be + * one: it declared {@code hasInverse()} while its only inverse was + * {@code projectInverse(double, double, Point2D.Double)}, a stale AWT signature that + * overrode nothing — and the body was additionally sealed inside a block comment — so + * {@code +proj=lsat} landed on this identity. {@code hasInverse()} was right and the + * implementation was missing: upstream's {@code som_setup} + * ({@code 9.8.1:src/projections/som.cpp}) assigns {@code P->inv} unconditionally for + * {@code som}, {@code misrsom} and {@code lsat} alike. It now has a real + * {@code projectInverse(double, double, ProjCoordinate)}. + * * @param x the projected x ordinate (in coordinate system units) * @param y the projected y ordinate (in coordinate system units) * @param dst the inverse-projected geographic coordinate (in radians) * @return the target coordinate + * @throws ProjectionException with {@link ErrorCause#NO_INVERSE_AVAILABLE} if this + * projection has no inverse */ protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + if (!hasInverse() && !isGeographic()) { + throw new ProjectionException(ErrorCause.NO_INVERSE_AVAILABLE, this, + "no inverse projection is available; hasInverse() is false and no " + + "projectInverse override exists, so the base class would " + + "otherwise return the projected input as lon/lat radians"); + } dst.x = x; dst.y = y; return dst; @@ -709,12 +1126,68 @@ public double getFalseEasting() { return falseEasting; } + /** + * Declares that the projection is in the southern hemisphere, the {@code +south} of + * {@code 9.8.1:src/projections/utm.cpp} and {@code tmerc.cpp}. + *

+ * The base class refuses, because it has no {@code +south} to set. Only + * {@code TransverseMercatorProjection} and {@code ExtendedTransverseMercatorProjection} + * override this. + *

+ * Behaviour change. This used to throw a bare {@link java.util.NoSuchElementException NoSuchElementException} with + * no message. That is unchecked and is not a {@link Proj4jException}, so + * {@code +south} on a projection that does not read it escaped every + * {@code catch (Proj4jException)} in the library and in every caller, and arrived with + * nothing a caller could log. Fifty golden-master rows reach this line + * ({@code SYN/mod/}{{@code aea},{@code lcc},{@code longlat},{@code merc}}{@code /south} + * and the {@code /h} family below); the differential gate could not see them because the + * defect predates its 1.4.3 baseline and the row is identical on both sides. + *

+ * Why this refuses rather than ignoring. PROJ has no parameter allow-list — a key + * no operator reads is retained and silently ignored ({@code 9.8.1:src/init.cpp} performs + * no such validation, and {@code paralist::used} in {@code src/param.cpp} exists only for + * {@code +init}/pipeline override resolution) — so refusing here is stricter than PROJ. + * That is deliberate, and the reason is that the base class cannot distinguish the two + * cases that reach it: + *

    + *
  • {@code +south} on {@code +proj=merc}, where the parameter is genuinely inapplicable + * and PROJ's ignoring it is correct; and + *
  • {@code +h} on {@code +proj=nsper} (see {@link #setHeightOfOrbit(double)}), where PROJ + * does read the parameter and Proj4J has simply not wired it up. Ignoring that + * one yields a silently wrong coordinate computed from a default height. + *
+ * Only the parser knows which case it is holding. If {@code +south} and {@code +h} are ever + * to be retained-and-ignored in {@code Proj4Parser.ParseMode#PROJ_COMPATIBLE} and refused + * only in {@code STRICT}, the discrimination belongs in {@code Proj4Parser} against a table + * of which projections legitimately do not read them; it cannot be made here. Until then + * this refuses in both modes, which is the fail-closed direction. + * + * @param isSouth whether the projection is in the southern hemisphere + * @throws UnsupportedParameterException always, on the base class + */ public void setSouthernHemisphere(boolean isSouth) { - throw new NoSuchElementException(); + throw new UnsupportedParameterException(ErrorCause.PROJECTION_NOT_IMPLEMENTED, + "+south is not supported by projection " + getName() + " (" + getClass().getName() + + "): it does not override setSouthernHemisphere. PROJ retains and " + + "ignores a parameter no operator reads, so this definition is one " + + "PROJ accepts; Proj4J refuses it because it cannot tell an " + + "inapplicable +south from an unimplemented one."); } + /** + * The {@code +south} flag. The base class has none; see + * {@link #setSouthernHemisphere(boolean)} for why this refuses rather than answering + * {@code false}, and for the {@link java.util.NoSuchElementException NoSuchElementException} it used to throw. + * + * @return never returns normally on the base class + * @throws UnsupportedParameterException always, on the base class + */ public boolean getSouthernHemisphere() { - throw new NoSuchElementException(); + throw new UnsupportedParameterException(ErrorCause.PROJECTION_NOT_IMPLEMENTED, + "+south is not supported by projection " + getName() + " (" + getClass().getName() + + "): it does not override getSouthernHemisphere, so it has no " + + "southern-hemisphere flag to report. Answering false would be a " + + "fabricated value."); } /** @@ -750,6 +1223,56 @@ public double getFromMetres() { return fromMetres; } + /** + * PROJ's {@code +over}: suppress the ±π reduction of the inverse's longitude. + *

+ * {@code inv_finalize} ({@code 9.8.1:src/inv.cpp:113-117}) is + * {@code lam += lam0; if (0 == P->over) lam = adjlon(lam);}, so {@code +over} is the only + * escape from the wrap and it lets an inverse return a longitude outside + * ±180° — which is the point: on a map drawn past the antimeridian, 200°E + * and 160°W are different places on the page. + * + *

What this does NOT yet cover

+ * + *

Two deliberate gaps, both outside this class: + *

    + *
  • The forward still under-wraps. {@code fwd_prepare} + * ({@code 9.8.1:src/fwd.cpp:82-83, :109-111}) calls {@code adjlon} twice when + * {@code over} is off — once on the raw longitude and once after subtracting + * {@code lam0} — whereas {@link #project(ProjCoordinate, ProjCoordinate)} normalises + * once and only when {@code lon_0 != 0}. Both of this class's forward funnels now skip + * that normalisation under {@code +over}, so the flag is honoured in the direction it + * is asked for; making the wrap unconditional in the {@code !over} case is a + * corpus-wide change and is tracked separately. It is what the single + * {@code +proj=vandg} row at {@code accept 180.1 50} — the block without + * {@code +over} — needs.
  • + *
+ * + *

Reachable from a proj-string since 1.5.0

+ * + *

{@code Proj4Parser} dispatches {@code +over} here, read with {@code pj_param}'s + * {@code b} sigil ({@code init.cpp:601}) so that {@code +over=f} is explicitly off. It used + * to be reachable only from {@code +proj=calcofi}, which sets it from its own + * {@code initialize()} because {@code calcofi.cpp:141} hard-codes {@code P->over = 1}; + * {@code calcofi} also forces {@code lam0 = 0}, which is why widening the forward guard + * above cannot move it. + * + * @param over true to keep the inverse's longitude unwrapped + */ + public void setOver(boolean over) { + this.over = over; + } + + /** + * The {@code +over} flag in force. + * + * @return true when the inverse's longitude is left unwrapped + * @see #setOver(boolean) + */ + public boolean isOver() { + return over; + } + public void setEllipsoid( Ellipsoid ellipsoid ) { this.ellipsoid = ellipsoid; a = ellipsoid.equatorRadius; @@ -761,8 +1284,31 @@ public Ellipsoid getEllipsoid() { return ellipsoid; } + /** + * Declares a sphere of the given radius, replacing whatever ellipsoid was in force. + *

+ * This is the {@code +R=} semantic of {@code 9.8.1:src/ell_set.cpp:92-100}: a radius + * overrules every shape parameter, so {@code es} and {@code e} become exactly zero and + * the ellipsoid is replaced by a true sphere. Callers must still invoke + * {@link #initialize()} afterwards for {@code spherical}, {@code one_es}, + * {@code rone_es} and {@code totalScale} to pick up the change. + *

+ * Behaviour change. Before this fix the method assigned the semi-major axis + * alone, leaving {@code e}, {@code es} and {@code ellipsoid} stale from the previous + * ellipsoid, so {@code spherical} stayed {@code false} and the ellipsoidal + * formula ran on a declared sphere — northing wrong by about 1,495 m at 2 degrees and + * 35,000 m at 55 degrees. The {@code +R=} parse path no longer goes through here (see + * {@code DatumParameters.setR}), but the method is public API and was wrong on its own + * terms. + * + * @param radius the radius of the sphere, in metres + */ public void setRadius(double radius) { + this.ellipsoid = new Ellipsoid("sphere", radius, 0.0, + "Sphere of radius " + radius); a = radius; + e = 0.0; + es = 0.0; } /** @@ -782,19 +1328,50 @@ public Unit getUnits() { } /** - * Get height of orbit - Geostationary satellite projection - * @return Height of orbit + * Get height of orbit - Geostationary satellite projection. + *

+ * The base class has no orbit; see {@link #setHeightOfOrbit(double)} for why this refuses + * rather than answering a default, and for the {@link java.util.NoSuchElementException NoSuchElementException} it used to + * throw. + * + * @return never returns normally on the base class + * @throws UnsupportedParameterException always, on the base class */ public double getHeightOfOrbit(){ - throw new NoSuchElementException(); + throw new UnsupportedParameterException(ErrorCause.PROJECTION_NOT_IMPLEMENTED, + "+h is not supported by projection " + getName() + " (" + getClass().getName() + + "): it does not override getHeightOfOrbit, so it has no height of " + + "orbit to report. Answering a default would be a fabricated value."); } /** - * Set height of orbit - Geostationary satellite projection - * @param h Height of orbit + * Set height of orbit - Geostationary satellite projection, the {@code +h} of + * {@code 9.8.1:src/projections/geos.cpp}, {@code nsper.cpp} and {@code tpers.cpp}. + *

+ * The base class refuses, because it has no orbit. Only + * {@code GeostationarySatelliteProjection} ({@code +proj=geos}) overrides this. Notably + * {@code PerspectiveProjection} ({@code +proj=nsper}) does not, even though PROJ's + * {@code nsper} reads {@code +h} and requires it — so {@code +proj=nsper +h=1000000} is + * refused here, and that refusal is the honest answer: silently ignoring {@code +h} would + * project from a default orbit and return a plausible, wrong coordinate. + *

+ * Behaviour change. This used to throw a bare {@link java.util.NoSuchElementException NoSuchElementException} with + * no message — unchecked, and not a {@link Proj4jException}, so it escaped every + * {@code catch (Proj4jException)} in the library. See + * {@link #setSouthernHemisphere(boolean)} for the full rationale, the measured golden-master + * rows, and why the PROJ-compatible "retain and ignore" behaviour, if wanted, has to live in + * {@code Proj4Parser} rather than here. + * + * @param h Height of orbit, in metres + * @throws UnsupportedParameterException always, on the base class */ public void setHeightOfOrbit(double h){ - throw new NoSuchElementException(); + throw new UnsupportedParameterException(ErrorCause.PROJECTION_NOT_IMPLEMENTED, + "+h=" + h + " is not supported by projection " + getName() + " (" + + getClass().getName() + "): it does not override setHeightOfOrbit. " + + "PROJ retains and ignores a parameter no operator reads, so this " + + "definition is one PROJ accepts; Proj4J refuses it because it cannot " + + "tell an inapplicable +h from an unimplemented one."); } /** @@ -806,6 +1383,9 @@ public void initialize() { one_es = 1-es; rone_es = 1.0/one_es; totalScale = a * fromMetres; + // ell_set.cpp:618 -- `P->ra = 1. / P->a;` -- computed once, here, from whatever `a` is at + // this moment. See totalScaleReciprocal: the inverse multiplies by it and must not divide. + totalScaleReciprocal = 1.0 / totalScale; totalFalseEasting = falseEasting * fromMetres; totalFalseNorthing = falseNorthing * fromMetres; } @@ -860,11 +1440,15 @@ public boolean equals(Object that) { } if (that instanceof Projection) { Projection p = (Projection) that; - // Using Double.compare when values can be NaN and should still be equal return ( // class represents implementation of project method this.getClass().equals(that.getClass()) && ellipsoid.isEqual(p.ellipsoid) && + // a is settable independently of the ellipsoid by setRadius (i.e. by +R=), so + // two projections can share an ellipsoid and still project differently; es is + // zeroed by a handful of initialize() implementations for the same reason. + a == p.a && + es == p.es && falseNorthing == p.falseNorthing && falseEasting == p.falseEasting && scaleFactor == p.scaleFactor && @@ -874,12 +1458,19 @@ public boolean equals(Object that) { projectionLongitude == p.projectionLongitude && projectionLatitude1 == p.projectionLatitude1 && projectionLatitude2 == p.projectionLatitude2 && + // Using Double.compare because alpha and lonc default to NaN and two + // projections that both left them unset should still compare equal + Double.compare(alpha, p.alpha) == 0 && + Double.compare(lonc, p.lonc) == 0 && minLatitude == p.minLatitude && maxLatitude == p.maxLatitude && minLongitude == p.minLongitude && maxLongitude == p.maxLongitude && axes.equals(p.axes) && - unit.equals(p.unit) && + // getUnits() rather than the unit field: unit is null unless +units= was given + // or LongLatProjection.initialize() ran, so unit.equals(..) threw NPE for any + // projected CRS defined without +units=. + Objects.equals(getUnits(), p.getUnits()) && primeMeridian.equals(p.primeMeridian)); } return false; @@ -891,9 +1482,46 @@ public boolean equals(Object that) { */ @Override public int hashCode() { - return Objects.hash(this.getClass(), - ellipsoid, falseNorthing, falseEasting, scaleFactor, fromMetres, trueScaleLatitude, - projectionLatitude, projectionLongitude, projectionLatitude1, projectionLatitude2, - minLatitude, maxLatitude, minLongitude, maxLongitude, axes, unit, primeMeridian); + // A manual chain rather than Objects.hash: this runs on every transform-cache lookup, + // and Objects.hash allocates an Object[] and boxes every double. Deliberately not + // memoised into a field -- the setters on this class are public, so a cached hash would + // be both stale and a data race. + int h = this.getClass().hashCode(); + // Consistent with equals, which compares ellipsoids by Ellipsoid.isEqual -- that is, on + // equator radius and eccentricity squared only, not on name or short name. + h = 31 * h + hash(ellipsoid.getEquatorRadius()); + h = 31 * h + hash(ellipsoid.getEccentricitySquared()); + h = 31 * h + hash(a); + h = 31 * h + hash(es); + h = 31 * h + hash(falseNorthing); + h = 31 * h + hash(falseEasting); + h = 31 * h + hash(scaleFactor); + h = 31 * h + hash(fromMetres); + h = 31 * h + hash(trueScaleLatitude); + h = 31 * h + hash(projectionLatitude); + h = 31 * h + hash(projectionLongitude); + h = 31 * h + hash(projectionLatitude1); + h = 31 * h + hash(projectionLatitude2); + h = 31 * h + hash(alpha); + h = 31 * h + hash(lonc); + h = 31 * h + hash(minLatitude); + h = 31 * h + hash(maxLatitude); + h = 31 * h + hash(minLongitude); + h = 31 * h + hash(maxLongitude); + h = 31 * h + axes.hashCode(); + h = 31 * h + getUnits().hashCode(); + h = 31 * h + primeMeridian.hashCode(); + return h; + } + + /** + * Hash of a double that agrees with {@code ==}. {@code -0.0 == 0.0} is true but the two have + * different bit patterns, so negative zero is normalised before hashing. NaN is left alone: + * {@link Double#hashCode(double)} canonicalises every NaN to the same value, which matches the + * {@code Double.compare} treatment of the NaN-defaulted parameters in + * {@link #equals(Object)}. + */ + private static int hash(double value) { + return Double.hashCode(value == 0.0 ? 0.0 : value); } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PseudoCylindricalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PseudoCylindricalProjection.java index 3c05ffe..b549307 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PseudoCylindricalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PseudoCylindricalProjection.java @@ -23,6 +23,8 @@ */ public class PseudoCylindricalProjection extends CylindricalProjection { + private static final long serialVersionUID = 2947020526135418972L; + public boolean isRectilinear() { return false; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP1Projection.java new file mode 100644 index 0000000..34fef16 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP1Projection.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Putnins P1 ({@code +proj=putp1}), the fourth {@code PROJ_HEAD} of + * {@code 9.8.1:src/projections/eck3.cpp}. + * + *

Not in {@code putp3.cpp}, {@code putp5.cpp} or {@code putp6.cpp} — it shares the + * Eckert III forward/inverse pair, not any Putnins-specific one. The commonly-cited + * one-file-several-names map gets this wrong, and grouping it with the other {@code putp*} + * means reimplementing something that comes for free here. + * + *

{@code A = -0.5}, uniquely negative in the family, which pinches the meridians inward + * near the poles. It also makes {@code putp1} the only member whose inverse denominator can + * actually vanish at a reachable latitude — {@code sqrt(1 - B phi^2) = 0.5} at + * {@code |phi| = 87.7}°. See {@link Eckert3FamilyProjection#projectInverse}. + * + * @see Eckert3FamilyProjection + */ +public class PutninsP1Projection extends Eckert3FamilyProjection { + + private static final long serialVersionUID = -7815796434674308416L; + + public PutninsP1Projection() { + super(1.89490, 0.94745, -0.5, 0.30396355092701331433); + } + + public String toString() { + return "Putnins P1"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP2Projection.java index db99b72..5576834 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP2Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP2Projection.java @@ -19,11 +19,14 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.util.ProjectionMath; public class PutninsP2Projection extends Projection { + private static final long serialVersionUID = 8722258293075600636L; + private final static double C_x = 1.89490; private final static double C_y = 1.71848; private final static double C_p = 0.6141848493043784; @@ -31,23 +34,44 @@ public class PutninsP2Projection extends Projection { private final static int NITER = 10; private final static double PI_DIV_3 = 1.0471975511965977; + /** + * Forward projection. + *

+ * Fail-closed, plus a repair the throw depends on. PROJ's {@code putp2.cpp} clamps to + * {@code ±PI_DIV_3} on non-convergence; Proj4J throws, because that is a specific plausible + * latitude a caller cannot distinguish from a converged one. + *

+ * The iteration itself was the 2006 C→Java conversion's mutate-then-read mistranslation, + * twice: the initial estimate was written as {@code out.y *= …}, scaling the caller's + * destination ordinate — whatever stale value it held — where upstream scales + * {@code lp.phi}; and the Newton correction was subtracted from {@code out.y} too, so + * {@code lpphi} never moved and {@code V} was identical on all {@code NITER} trips. The two + * output lines then used the raw geographic latitude where the solved parametric latitude + * belongs. Both now run on {@code lpphi}, and the forward reproduces PROJ 9.8.1 to the + * micrometre. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - double p, c, s, V; + double p, c, s, V = Double.NaN; int i; + final double phi = lpphi; p = C_p * Math.sin(lpphi); s = lpphi * lpphi; - out.y *= 0.615709 + s * ( 0.00909953 + s * 0.0046292 ); + lpphi *= 0.615709 + s * ( 0.00909953 + s * 0.0046292 ); for (i = NITER; i > 0; --i) { c = Math.cos(lpphi); s = Math.sin(lpphi); - out.y -= V = (lpphi + s * (c - 1.) - p) / + lpphi -= V = (lpphi + s * (c - 1.) - p) / (1. + c * (c - 1.) - s * s); if (Math.abs(V) < EPS) break; } - if (i == 0) - out.y = lpphi < 0 ? - PI_DIV_3 : PI_DIV_3; + if (i == 0) { + throw new ConvergenceFailureException(this, + "forward parametric-latitude iteration did not converge to " + EPS + + " within " + NITER + " iterations for latitude " + phi + + " rad (last correction " + V + ")"); + } out.x = C_x * lplam * (Math.cos(lpphi) - 0.5); out.y = C_y * Math.sin(lpphi); return out; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3FamilyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3FamilyProjection.java new file mode 100644 index 0000000..dbb7f70 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3FamilyProjection.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Putnins P3 and P3′ ({@code +proj=putp3}, {@code +proj=putp3p}), a port of + * {@code 9.8.1:src/projections/putp3.cpp}. The whole pair differs by one coefficient. + * + *

+ *   x = C * lam * (1 - A * phi^2)
+ *   y = C * phi
+ * 
+ * + *

with {@code C = 0.79788456} and {@code A = 4/pi^2} for {@code putp3}, + * {@code A = 2/pi^2} for {@code putp3p}. Upstream writes the coefficient as a multiple of + * {@code RPISQ = 0.1013211836} ({@code putp3.cpp:17}) rather than computing + * {@code 1/(pi*pi) = 0.10132118364233778}, so the constant is truncated at ten + * digits. Kept truncated: {@code 4 * 0.1013211836} and {@code 4/(pi*pi)} differ in the + * eleventh significant digit, and the corpus values were generated from the former. + * + *

{@code C = 0.79788456} is likewise a truncation, of {@code sqrt(2/pi) = + * 0.7978845608028654}. + * + *

Parallels are straight and equally spaced; the bounding meridian is a parabola. Neither + * member has a domain restriction, and the inverse is exact — the easting denominator + * {@code C(1 - A phi^2)} vanishes only at {@code |phi| = pi/2 * sqrt(1/...)}, which for both + * {@code A} values lies outside the valid latitude range ({@code putp3} reaches zero at + * {@code |phi| = 1.5708} rad, i.e. a hair beyond the pole, and {@code putp3p} at + * {@code 2.221} rad), so no guard is needed and upstream has none. + */ +abstract class PutninsP3FamilyProjection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = -7581918266175029405L; + + /** {@code putp3.cpp:16} — truncated {@code sqrt(2/pi)}. */ + protected static final double C = 0.79788456; + + /** {@code putp3.cpp:17} — truncated {@code 1/pi^2}. Do not recompute. */ + protected static final double RPISQ = 0.1013211836; + + private final double aa; + + protected PutninsP3FamilyProjection(double aa) { + this.aa = aa; + es = 0.0; + initialize(); + } + + /** {@code putp3_s_forward}, {@code putp3.cpp:19-28}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + dst.x = C * lam * (1.0 - aa * phi * phi); + dst.y = C * phi; + return dst; + } + + /** {@code putp3_s_inverse}, {@code putp3.cpp:30-39}. */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double phi = y / C; + dst.y = phi; + dst.x = x / (C * (1.0 - aa * phi * phi)); + return dst; + } + + public boolean hasInverse() { + return true; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that != null && getClass() == that.getClass()) { + return aa == ((PutninsP3FamilyProjection) that).aa && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(aa, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3PProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3PProjection.java new file mode 100644 index 0000000..1802632 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3PProjection.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Putnins P3′ ({@code +proj=putp3p}), {@code 9.8.1:src/projections/putp3.cpp:57-71}. + * {@code A = 2/pi^2}, i.e. half {@code putp3}'s, which halves the inward curvature of the + * meridians. + * + * @see PutninsP3FamilyProjection + */ +public class PutninsP3PProjection extends PutninsP3FamilyProjection { + + private static final long serialVersionUID = 6276257980072839925L; + + public PutninsP3PProjection() { + super(2.0 * RPISQ); + } + + public String toString() { + return "Putnins P3'"; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/TransformFailures.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3Projection.java old mode 100755 new mode 100644 similarity index 60% rename from core/src/test/java/org/locationtech/proj4j/TransformFailures.java rename to core/src/main/java/org/locationtech/proj4j/proj/PutninsP3Projection.java index 18ef47d..343bbe3 --- a/core/src/test/java/org/locationtech/proj4j/TransformFailures.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP3Projection.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright 2009, 2017 Martin Davis + * Copyright 2026 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,14 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package org.locationtech.proj4j; + +package org.locationtech.proj4j.proj; /** - * A class to run tests which are known to be failures. - * This prevents Maven from running them automatically and reporting failures. + * Putnins P3 ({@code +proj=putp3}), {@code 9.8.1:src/projections/putp3.cpp:41-55}. + * {@code A = 4/pi^2}. * - * @author mdavis + * @see PutninsP3FamilyProjection */ -public class TransformFailures extends BaseCoordinateTransformTest { +public class PutninsP3Projection extends PutninsP3FamilyProjection { + + private static final long serialVersionUID = -5360425661839927691L; + + public PutninsP3Projection() { + super(4.0 * RPISQ); + } + public String toString() { + return "Putnins P3"; + } } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP4Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP4Projection.java index b0098ab..501b184 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP4Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP4Projection.java @@ -24,6 +24,8 @@ public class PutninsP4Projection extends Projection { + private static final long serialVersionUID = -8179250064112033852L; + protected double C_x; protected double C_y; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5PProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5PProjection.java index 573827d..025e0b2 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5PProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5PProjection.java @@ -22,6 +22,8 @@ public class PutninsP5PProjection extends PutninsP5Projection { + private static final long serialVersionUID = 2710024605041259559L; + public PutninsP5PProjection() { A = 1.5; B = 0.5; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5Projection.java index 4c82683..eabdc00 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP5Projection.java @@ -23,6 +23,8 @@ public class PutninsP5Projection extends Projection { + private static final long serialVersionUID = 6159881199702550035L; + protected double A; protected double B; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6FamilyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6FamilyProjection.java new file mode 100644 index 0000000..2d65b16 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6FamilyProjection.java @@ -0,0 +1,193 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; + +/** + * Putnins P6 and P6′ ({@code +proj=putp6}, {@code +proj=putp6p}), a port of + * {@code 9.8.1:src/projections/putp6.cpp}. + * + *

Unlike the P3 pair these are not closed form: the forward must solve + * + *

+ *   (A - r) t - ln(t + r) = B sin(phi),      r = sqrt(1 + t^2)
+ * 
+ * + *

for the auxiliary {@code t}, by ten Newton steps at {@code 1e-10}, seeded with + * {@code t = 1.10265779 * phi}. Then + * + *

+ *   x = C_x * lam * (D - sqrt(1 + t^2))
+ *   y = C_y * t
+ * 
+ * + *

The inverse is closed form, because {@code y} determines {@code t} directly — it + * simply evaluates the same expression forwards and takes an {@code asin}. + * + * + * + * + * + * + * + * + * + *
{@code putp6.cpp:67-105}
{@code +proj=}{@code C_x}{@code C_y}{@code A}{@code B}{@code D}
{@code putp6}1.013460.9191042.14714371821293787842
{@code putp6p}0.443290.8040465.611253
+ * + *

The non-convergence branch is a success path, not an error

+ * + *

This is the one thing here that is easy to get wrong. {@code putp6.cpp:38-44}, on + * exhausting the ten steps, does not set an errno: it snaps {@code t} to + * {@code +/-CON_POLE} where {@code CON_POLE = 1.732050807568877} (that is + * {@code sqrt(3)}, spelled out) and hard-sets {@code sqrt(1 + t^2) = 2}, then carries on to + * produce a perfectly good pole coordinate. Upstream's own comment says the case "is rarely + * reached as from experimenting, i seems to be >= 6", and that the {@code = 2} is written + * explicitly only to quiet cppcheck — it is what {@code sqrt(1 + 3)} would give anyway. + * + *

So this must not be turned into a thrown exception: doing so would convert a + * documented, deliberate pole-clamp into a failure and lose rows. The fail-closed rule is + * about failures dressed up as coordinates, and this is the opposite — a coordinate that + * upstream means. + * + *

Note the constant is spelled {@code sqrt(3)} but only for {@code putp6}'s {@code D = 2} + * does {@code sqrt(1 + 3) = 2} hold; for {@code putp6p}, {@code D = 3} and the hard-coded + * {@code 2} still applies, which makes the pole easting {@code C_x * lam * 1} rather than + * {@code C_x * lam * (3 - 2)} — the same thing. The two agree, so the shared constant is + * correct for both, but it is a coincidence of the parameter sets rather than an identity. + */ +abstract class PutninsP6FamilyProjection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = -5672610553089134697L; + + private static final double EPS = 1e-10; + private static final int NITER = 10; + + /** {@code putp6.cpp:20} — {@code sqrt(3)}, written out. */ + private static final double CON_POLE = 1.732050807568877; + + private final double cx; + private final double cy; + private final double aa; + private final double bb; + private final double dd; + + protected PutninsP6FamilyProjection(double cx, double cy, double aa, double bb, + double dd) { + this.cx = cx; + this.cy = cy; + this.aa = aa; + this.bb = bb; + this.dd = dd; + es = 0.0; + initialize(); + } + + /** {@code putp6_s_forward}, {@code putp6.cpp:22-52}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + final double p = bb * StrictMath.sin(phi); + double t = phi * 1.10265779; + + int i = NITER; + for (; i > 0; --i) { + final double r = Math.sqrt(1.0 + t * t); + final double v = ((aa - r) * t - StrictMath.log(t + r) - p) / (aa - 2.0 * r); + t -= v; + if (Math.abs(v) < EPS) { + break; + } + } + + final double sqrt1PlusT2; + if (i == 0) { + // putp6.cpp:38-44. Deliberately NOT an error: snap to the pole. + t = p < 0.0 ? -CON_POLE : CON_POLE; + sqrt1PlusT2 = 2.0; + } else { + sqrt1PlusT2 = Math.sqrt(1.0 + t * t); + } + + dst.x = cx * lam * (dd - sqrt1PlusT2); + dst.y = cy * t; + return dst; + } + + /** + * {@code putp6_s_inverse}, {@code putp6.cpp:54-65}. + * + *

{@code aasin} rather than a bare {@code asin}: upstream calls + * {@code aasin(P->ctx, ...)}, which raises + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} for an argument more than + * {@code 1.00000000000001} outside {@code [-1, 1]} and clamps within that band. A bare + * {@code Math.asin} would answer {@code NaN}, and + * {@code ProjectionMath.asin} would clamp silently with no error signal at any + * magnitude — so neither is a substitute. Reachable: a northing well past the pole line + * drives the argument above 1. + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double t = y / cy; + final double r = Math.sqrt(1.0 + t * t); + dst.x = x / (cx * (dd - r)); + dst.y = aasin(((aa - r) * t - StrictMath.log(t + r)) / bb); + return dst; + } + + /** + * {@code aasin} from {@code 9.8.1:src/aasincos.cpp:16-25}, with {@code ONE_TOL = + * 1.00000000000001}. + * + * @throws ProjectionException where PROJ sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + */ + private double aasin(double v) { + final double av = Math.abs(v); + if (av >= 1.0) { + if (av > 1.00000000000001) { + throw new ProjectionException(this, + "inverse: asin argument " + v + " is outside [-1, 1], so the " + + "northing lies beyond the pole line"); + } + return v < 0 ? -Math.PI / 2.0 : Math.PI / 2.0; + } + return StrictMath.asin(v); + } + + public boolean hasInverse() { + return true; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that != null && getClass() == that.getClass()) { + PutninsP6FamilyProjection p = (PutninsP6FamilyProjection) that; + return cx == p.cx && cy == p.cy && aa == p.aa && bb == p.bb && dd == p.dd + && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(cx, cy, aa, bb, dd, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6PProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6PProjection.java new file mode 100644 index 0000000..e4e5947 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6PProjection.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Putnins P6′ ({@code +proj=putp6p}), {@code 9.8.1:src/projections/putp6.cpp:87-105}. + * + *

Note {@code B = 5.61125} is a five-decimal literal where {@code putp6}'s is the + * twenty-digit {@code 2.1471437182129378784}. The asymmetry is upstream's and is preserved; + * {@code putp6p}'s constant is simply less precisely known. + * + * @see PutninsP6FamilyProjection + */ +public class PutninsP6PProjection extends PutninsP6FamilyProjection { + + private static final long serialVersionUID = -7660657646447673256L; + + public PutninsP6PProjection() { + super(0.44329, 0.80404, 6.0, 5.61125, 3.0); + } + + public String toString() { + return "Putnins P6'"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6Projection.java new file mode 100644 index 0000000..191fc99 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/PutninsP6Projection.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Putnins P6 ({@code +proj=putp6}), {@code 9.8.1:src/projections/putp6.cpp:67-85}. + * + * @see PutninsP6FamilyProjection + */ +public class PutninsP6Projection extends PutninsP6FamilyProjection { + + private static final long serialVersionUID = -4186016765979614472L; + + public PutninsP6Projection() { + super(1.01346, 0.91910, 4.0, 2.1471437182129378784, 2.0); + } + + public String toString() { + return "Putnins P6"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/QuarticAuthalicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/QuarticAuthalicProjection.java index e3cbb27..76487af 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/QuarticAuthalicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/QuarticAuthalicProjection.java @@ -21,6 +21,8 @@ public class QuarticAuthalicProjection extends SineTangentSeriesProjection { + private static final long serialVersionUID = -3777395340559758855L; + public QuarticAuthalicProjection() { super( 2., 2., false ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/RectangularPolyconicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/RectangularPolyconicProjection.java index 962ce22..f63b780 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/RectangularPolyconicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/RectangularPolyconicProjection.java @@ -23,6 +23,8 @@ public class RectangularPolyconicProjection extends Projection { + private static final long serialVersionUID = -3462641469228621316L; + private double phi0; private double phi1; private double fxa; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/RobinsonProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/RobinsonProjection.java index b17968b..f3ace28 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/RobinsonProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/RobinsonProjection.java @@ -19,11 +19,16 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class RobinsonProjection extends PseudoCylindricalProjection { + private static final long serialVersionUID = 231215112452652246L; + private final static double X[][] = { {1.0f, 2.2199e-17f, -7.15515e-05f, 3.1103e-06f}, {0.9986f, -0.000482243f, -2.4897e-05f, -1.3309e-06f}, @@ -93,7 +98,7 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { int i = (int)Math.floor(phi * C1); if (i >= NODES) i = NODES; - phi = Math.toDegrees(phi - RC1 * i); + phi = ProjectionMath.toDeg(phi - RC1 * i); xy.x = V(X[i], phi) * FXC * lplam; xy.y = V(Y[i], phi) * FYC; if (lpphi < 0.0) @@ -109,9 +114,14 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { lp.y = Math.abs(y / FYC); if (lp.y >= 1.0) { if (lp.y > ONEEPS) { - lp.x = Double.NaN; - lp.y = Double.NaN; - return lp; + // Was `lp.x = lp.y = NaN; return lp;`. Upstream sets + // PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN here (robin.cpp:113); a NaN + // return is the sentinel shape that Projection.inverseProjectRadians' output + // postcondition now rejects anyway, so raising it here names the actual reason + // instead of reporting a generic non-finite result one frame up. + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "northing " + y + " is beyond the map: |y| / FYC = " + lp.y + + " exceeds ONEEPS = " + ONEEPS); } else { lp.y = y < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; lp.x /= X[NODES][0]; @@ -119,9 +129,12 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { } else { i = (int) Math.floor(lp.y * NODES); if( i < 0 || i >= NODES ) { - lp.x = Double.NaN; - lp.y = Double.NaN; - return lp; + // robin.cpp:124. Reachable for a NaN northing, which upstream maps to i = -1 + // explicitly; here lp.y is already known finite, so this is the interpolation + // table's own bound. + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "northing " + y + " maps to interpolation interval " + i + + ", outside the " + NODES + "-node table"); } for (;;) { if (Y[i][0] > lp.y) --i; @@ -131,19 +144,34 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { double[] T = Y[i]; t = 5. * (lp.y - Y[i][0])/(Y[i+1][0] - Y[i][0]); int iters; + t1 = Double.NaN; for (iters = MAX_ITER; iters > 0; --iters) { // Newton-Raphson t1 = (V(T, t) - lp.y) / DV(T, t); t -= t1; if (Math.abs(t1) < EPS) break; } - lp.y = Math.toRadians(5 * i + t); + if (iters == 0) { + // Fail-closed. Upstream robin.cpp leaves the loop silently and uses + // whatever t holds; the interpolated latitude that yields is finite, in + // range, and wrong by an unbounded amount - undetectable by the caller. + throw new ConvergenceFailureException(this, + "inverse Newton-Raphson on interpolation interval " + i + + " did not converge to " + EPS + " within " + MAX_ITER + + " iterations for northing " + y + " (last correction " + + t1 + ")"); + } + lp.y = ProjectionMath.toRad(5 * i + t); if (y < 0.) lp.y = -lp.y; lp.x /= V(X[i], t); if( Math.abs(lp.x) > ProjectionMath.PI ) { - lp.x = Double.NaN; - lp.y = Double.NaN; + // robin.cpp:150-152 -- upstream sets the domain errno *and* overwrites the + // coordinate with proj_coord_error(), i.e. it too regards the NaN as a courtesy + // rather than as the signal. Here the errno is the signal. + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "easting " + x + " inverts to longitude " + lp.x + + " rad, outside +/-pi"); } } return lp; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/SimpleConicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/SimpleConicProjection.java index dafa4bc..b874201 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/SimpleConicProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/SimpleConicProjection.java @@ -21,11 +21,15 @@ import java.util.Objects; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.util.ProjectionMath; public class SimpleConicProjection extends ConicProjection { + + private static final long serialVersionUID = 3928142084443019917L; + private double n; private double rho_c; private double rho_0; @@ -49,8 +53,8 @@ public SimpleConicProjection() { public SimpleConicProjection(int type) { this.type = type; - minLatitude = Math.toRadians(0); - maxLatitude = Math.toRadians(80); + minLatitude = ProjectionMath.toRad(0); + maxLatitude = ProjectionMath.toRad(80); } public String toString() { @@ -76,16 +80,42 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { return out; } + /** + * Port of {@code sconics_s_inverse} ({@code 9.8.1:src/projections/sconics.cpp:94-122}). + * + *

Two independent transcription defects were fixed here, both from the same + * mishandling of C's mutate-the-parameter idiom. Upstream reassigns {@code xy.y} in + * place — {@code xy.y = Q->rho_0 - xy.y;} — and every later use of {@code xy.y} means + * the reassigned value. The Java version wrote the new value into {@code out.y} instead + * and then kept reading the untouched parameter: + * + *

    + *
  • {@code atan2(xyx, xyy)} used the raw northing where upstream uses + * {@code rho_0 - y}. The longitude was therefore wrong by whatever {@code rho_0} + * is — which is the bulk of the northing for every member of the family, so the + * error is first-order, not a rounding matter. + *
  • The {@code n < 0} branch negated into {@code out.x} and {@code out.y}, which are + * both overwritten on the next two statements. Upstream negates {@code xy.x} + * and {@code xy.y}, the very values {@code atan2} then consumes. So the + * southern-cone case was a no-op apart from flipping the sign of {@code rho}. + *
+ * + *

Both are fixed by working in locals that mirror upstream's mutated + * {@code xy.x}/{@code xy.y} rather than by aliasing the output coordinate. + */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { double rho; + // sconics.cpp:102 -- xy.y is reassigned, and every later read means the new value. + double x = xyx; + double y = rho_0 - xyy; - rho = ProjectionMath.distance(xyx, out.y = rho_0 - xyy); + rho = ProjectionMath.distance(x, y); if (n < 0.) { rho = - rho; - out.x = - xyx; - out.y = - xyy; + x = - x; + y = - y; } - out.x = Math.atan2(xyx, xyy) / n; + out.x = Math.atan2(x, y) / n; switch (type) { case PCONIC: out.y = Math.atan(c1 - rho / c2) + sig; @@ -103,36 +133,61 @@ public boolean hasInverse() { return true; } + /** + * Port of {@code phi12} and {@code pj_sconics_setup} + * ({@code 9.8.1:src/projections/sconics.cpp:41-67} and {@code :124-190}). + * + *

This used to ignore {@code +lat_1} and {@code +lat_2} entirely. The + * parameter read was commented out behind a {@code FIXME} and replaced with + * {@code p1 = toRadians(30)}, {@code p2 = toRadians(60)}, so every one of the seven + * {@code sconics} operators behaved as though the standard parallels were 30° and + * 60° whatever the caller asked for. {@link Projection#projectionLatitude1} and + * {@link Projection#projectionLatitude2} were parsed, stored, and never read. + * + *

That is a silent wrong answer rather than a refusal, and it was live in six + * registrations — {@code euler}, {@code murd1}, {@code murd2}, {@code murd3}, + * {@code pconic} and {@code vitk1}. All fourteen {@code sconics} operations in + * {@code builtins.gie} use {@code +lat_1=0.5 +lat_2=2}, the one thing the hard-coding + * cannot produce, so the family's 112 assertions were failing on this alone; the + * measured deviation was 2,336 km of easting for {@code tissot}. + * + *

Two smaller repairs in the same place. A no-op {@code del = del;} was carried over + * from the C {@code *del = *del}, which dereferenced an out-parameter and meant + * something there. And {@code case PCONIC} contained a stray, unindented + * {@code maxLatitude = Math.toRadians(60);//FIXME} that hard-coded the domain bound as + * well — unrelated to the requested parallels, and with no counterpart upstream, where + * {@code sconics} declares no latitude limits at all. + * + *

On the missing-parameter check. {@code sconics.cpp:44-51} raises + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} when either {@code +lat_1} or + * {@code +lat_2} is absent, before computing anything. Proj4J cannot distinguish + * "absent" from "given as zero" — both leave the field at its {@code 0.0} default — but + * it does not need to: with both absent, {@code del} and {@code sig} are both zero and + * the {@code |del| < EPS || |sig| < EPS} test already rejects them. The two cases that + * differ are {@code +lat_1=0 +lat_2=0} and a single parallel given as zero, and both are + * degenerate and rejected too. So the guard below covers upstream's error condition + * exactly, and reports it as an {@link InvalidValueException} naming the values, rather + * than as the previous {@code "Error -42"}. + */ public void initialize() { super.initialize(); - double del, cs, dummy; - - /* get common factors for simple conics */ - double p1, p2, d, s; - int err = 0; - -/*FIXME - if (!pj_param(params, "tlat_1").i || - !pj_param(params, "tlat_2").i) { - err = -41; - } else { - p1 = pj_param(params, "rlat_1").f; - p2 = pj_param(params, "rlat_2").f; - *del = 0.5 * (p2 - p1); - sig = 0.5 * (p2 + p1); - err = (Math.abs(*del) < EPS || Math.abs(sig) < EPS) ? -42 : 0; - *del = *del; - } -*/ - p1 = Math.toRadians(30);//FIXME - p2 = Math.toRadians(60);//FIXME + double del, cs; + + /* get common factors for simple conics -- sconics.cpp:41-67 */ + double p1 = projectionLatitude1; + double p2 = projectionLatitude2; del = 0.5 * (p2 - p1); sig = 0.5 * (p2 + p1); - err = (Math.abs(del) < EPS || Math.abs(sig) < EPS) ? -42 : 0; - del = del; - if (err != 0) - throw new ProjectionException("Error "+err); + if (Math.abs(del) < EPS || Math.abs(sig) < EPS) { + throw new InvalidValueException( + "Illegal value for lat_1 and lat_2: |lat_1 - lat_2| and |lat_1 + lat_2|" + + " should be > 0, but lat_1 = " + Math.toDegrees(p1) + " and lat_2 = " + + Math.toDegrees(p2) + " give |del| = " + Math.abs(del) + " and |sig| = " + + Math.abs(sig) + " rad. Both +lat_1 and +lat_2 are required by every" + + " sconics projection (euler, murd1, murd2, murd3, pconic, tissot," + + " vitk1)."); + } switch (type) { case TISSOT: @@ -169,7 +224,6 @@ public void initialize() { if (Math.abs(del = projectionLatitude - sig) - EPS10 >= ProjectionMath.HALFPI) throw new ProjectionException("-43"); rho_0 = c2 * (c1 - Math.tan(del)); -maxLatitude = Math.toRadians(60);//FIXME break; case VITK1: n = (cs = Math.tan(del)) * Math.sin(sig) / del; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/SineTangentSeriesProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/SineTangentSeriesProjection.java index a830161..a4314d1 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/SineTangentSeriesProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/SineTangentSeriesProjection.java @@ -25,6 +25,9 @@ import org.locationtech.proj4j.util.ProjectionMath; class SineTangentSeriesProjection extends ConicProjection { + + private static final long serialVersionUID = 8359778409248280371L; + private double C_x; private double C_y; private double C_p; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/SinusoidalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/SinusoidalProjection.java index 4d30c9f..e402b3f 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/SinusoidalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/SinusoidalProjection.java @@ -19,20 +19,89 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Sinusoidal (Sanson-Flamsteed), {@code +proj=sinu}. + * + *

Upstream declares it {@code "PCyl, Sph&Ell"} and dispatches on {@code P->es} + * ({@code 9.8.1:src/projections/gn_sinu.cpp:246-256}). This class had only the spherical + * branch, so {@code +proj=sinu +ellps=GRS80} ran {@code x = lam cos(phi)}, {@code y = phi} + * against upstream's meridian arc — 745 m of northing error at the corpus's test point, and 8 of + * its 16 {@code builtins.gie} assertions. + * + *

+ * ellipsoidal:  y = M(phi)                        x = lam cos(phi) / sqrt(1 - es sin^2 phi)
+ * inverse:      phi = M^-1(y)                     lam = x sqrt(1 - es sin^2 phi) / cos(phi)
+ * 
+ * + *

The spherical arm is unchanged and remains exact: for {@code sinu} upstream's + * {@code C_x = C_y = 1}, {@code m = 0} and {@code n = 1}, which collapses the general + * {@code gn_sinu} kernel to precisely these two lines. + */ public class SinusoidalProjection extends PseudoCylindricalProjection { - + + private static final long serialVersionUID = -5905017313852248015L; + + /** Upstream's {@code EPS10}, used only by the ellipsoidal inverse's pole guard. */ + private static final double EPS10 = 1e-10; + + /** Upstream's {@code Q->en}; null on a sphere, exactly as upstream leaves it. */ + private MeridianArc meridian; + + /** Builds the meridian-arc series when the figure is an ellipsoid. */ + @Override + public void initialize() { + super.initialize(); + meridian = es != 0.0 ? MeridianArc.fromEs(es) : null; + } + + /** Port of {@code gn_sinu_s_forward} / {@code gn_sinu_e_forward}. */ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { - xy.x = lam * Math.cos(phi); - xy.y = phi; + if (meridian == null) { + xy.x = lam * FastStrictTrig.cos(phi); + xy.y = phi; + return xy; + } + final double s = FastStrictTrig.sin(phi); + final double c = FastStrictTrig.cos(phi); + xy.y = meridian.mlfn(phi, s, c); + xy.x = lam * c / Math.sqrt(1. - es * s * s); return xy; } + /** + * Port of {@code gn_sinu_s_inverse} / {@code gn_sinu_e_inverse}. + * + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} when the recovered + * latitude is more than {@link #EPS10} past a pole — upstream's third branch, which + * sets {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN}. At the pole itself + * (within {@code EPS10}) the longitude is 0, not a division by {@code cos(pi/2)}. + */ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { - lp.x = x / Math.cos(y); - lp.y = y; + if (meridian == null) { + lp.x = x / FastStrictTrig.cos(y); + lp.y = y; + return lp; + } + final double phi = meridian.invMlfn(y); + lp.y = phi; + final double s = Math.abs(phi); + if (s < ProjectionMath.HALFPI) { + final double sp = FastStrictTrig.sin(phi); + lp.x = x * Math.sqrt(1. - es * sp * sp) / FastStrictTrig.cos(phi); + } else if (s - EPS10 < ProjectionMath.HALFPI) { + lp.x = 0.; + } else { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "Sinusoidal inverse: northing " + y + " inverts to latitude " + + Math.toDegrees(phi) + " degrees, which is past a pole"); + } return lp; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/SpaceObliqueMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/SpaceObliqueMercatorProjection.java new file mode 100644 index 0000000..92865a1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/SpaceObliqueMercatorProjection.java @@ -0,0 +1,416 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Space Oblique Mercator, {@code +proj=som} — a port of {@code 9.8.1:src/projections/som.cpp}. + * + *

One file, three {@code +proj=} names

+ * + *

{@code som.cpp} declares {@code PROJ_HEAD} for {@code som}, {@code misrsom} and + * {@code lsat} and serves all three from a single {@code som_setup} / {@code som_e_forward} / + * {@code som_e_inverse} triple. The three entry points differ in exactly four values: + * + * + * + * + * + * + * + * + * + * + * + * + *
the only differences between the three operators
{@code lam0}{@code alf} (inclination){@code p22} (day/rev){@code rlm}
{@code som}{@code +asc_lon}{@code +inc_angle}{@code +ps_rev}{@code 0}
{@code misrsom}{@code 129.3056° − 360°/233 × path}{@code 98.30382°}{@code 98.88/1440}{@code 0}
{@code lsat}{@code 128.87°|129.3° − 360°/251|233 × path}{@code 99.092°|98.2°}{@code 103.2669323|98.8841202 / 1440}{@code π (1/248 + .5161290322580645)}
+ * + *

{@code lsat} is deliberately not refactored onto this class. + * {@link LandsatProjection} holds an independently verified copy of the same kernel and is owned by + * another change; folding it in would edit a contended file for no numerical gain. The two are + * therefore duplicates on purpose, and the intended end state is that {@code LandsatProjection} + * becomes {@code extends SpaceObliqueMercatorProjection} with an {@code initialize()} that sets + * {@code lam0}/{@code alf}/{@code p22}/{@code rlm} from {@code +lsat} and {@code +path} and + * nothing else. Two differences to reconcile when that happens, both in {@code LandsatProjection}'s + * favour of nothing: + * + *

    + *
  • Its forward's inner loop is {@code for (l = 50; l > 0; --l)}, where 9.8.1 is + * {@code for (l = 50; l >= 0; --l)}. C leaves {@code l == -1} after exhausting the second + * form, and {@code !l} is false for {@code -1}, so upstream's + * convergence-failure branch is unreachable by exhaustion — it runs 51 trips and then + * uses the answer. The {@code l > 0} form runs 50 trips and answers {@code HUGE_VAL}. This + * class reproduces 9.8.1.
  • + *
  • It carries {@code if (fabs(cl) < TOL) lamtp -= TOL;}, a PROJ-4-era line that 9.8.1 does + * not have. It is a no-op either way — {@code lamtp} is dead after {@code cl} is taken from + * it — so it is simply omitted here.
  • + *
+ * + *

{@code +inc_angle}, {@code +ps_rev} and {@code +asc_lon}

+ * + *

All three now reach this class: {@code Proj4Parser.parseProjection} dispatches them on this + * type, the two angular ones through its DMS-capable {@code parseAngle} because upstream reads + * them with {@code pj_param}'s {@code r} sigil ({@code som.cpp:250,259}). + * + *

Until that dispatch landed this class carried one deliberate divergence from + * 9.8.1 — {@link #initialize()} refused when none of the three had been set. The reason was + * that upstream defaults all three to {@code 0} and {@code 0} passes every one of upstream's own + * range checks, so verbatim behaviour plus the parser gap would have answered a fully-specified + * definition with the coordinates of a satellite in a zero-inclination zero-period orbit. That + * guard is gone: the values arrive, and the class is now verbatim 9.8.1, defaults + * included. {@link MisrSpaceObliqueMercatorProjection}'s equivalent refusal stays, because + * {@code path <= 0} is upstream's own error ({@code som.cpp:288}). + * + * @see LandsatProjection + * @see MisrSpaceObliqueMercatorProjection + * @since 1.5.0 + */ +public class SpaceObliqueMercatorProjection extends Projection { + + private static final long serialVersionUID = 2076131906654145940L; + + /** {@code som.cpp:57}, {@code #define TOL 1e-7}. */ + protected static final double TOL = 1e-7; + + /** {@code proj_internal.h}'s {@code M_PI_HALFPI}, i.e. 3π/2. */ + private static final double PI_HALFPI = 4.71238898038468985766; + + /** {@code proj_internal.h}'s {@code M_TWOPI_HALFPI}, i.e. 5π/2. */ + private static final double TWOPI_HALFPI = 7.85398163397448309610; + + // Derived by somSetup()/seraz0(); named exactly as struct pj_som_data. + private double a2, a4, b, c1, c3; + private double q, t, u, w, sa, ca, xj, rlm2; + + /** Inclination angle, radians. {@code +inc_angle} for {@code som}. */ + protected double alf; + + /** Period of revolution, day/rev. {@code +ps_rev} for {@code som}. */ + protected double p22; + + /** + * {@code Q->rlm}. Zero for {@code som} and {@code misrsom}; the Landsat value for + * {@code lsat}. See the class comment's table. + */ + protected double rlm; + + /** {@code Q->alf}, in radians — {@code +inc_angle}. Must lie in {@code [0, pi]}. */ + public void setIncidenceAngle(double radians) { + this.alf = radians; + } + + /** {@code Q->alf} in degrees, the form {@code pj_param}'s {@code "r"} sigil accepts. */ + public void setIncidenceAngleDegrees(double degrees) { + setIncidenceAngle(degrees * DTR); + } + + /** {@code Q->p22} — {@code +ps_rev}, the period of revolution in day/rev. Must be ≥ 0. */ + public void setPeriodOfRevolution(double dayPerRev) { + this.p22 = dayPerRev; + } + + /** + * {@code P->lam0} — {@code +asc_lon}, the ascending longitude in radians. Must lie in + * {@code [-2pi, 2pi]}, which is wider than {@code +lon_0}'s usual range. + */ + public void setAscendingLongitude(double radians) { + this.projectionLongitude = radians; + } + + /** {@code +asc_lon} in degrees, the form {@code pj_param}'s {@code "r"} sigil accepts. */ + public void setAscendingLongitudeDegrees(double degrees) { + setAscendingLongitude(degrees * DTR); + } + + public double getIncidenceAngle() { + return alf; + } + + public double getPeriodOfRevolution() { + return p22; + } + + /** + * {@code PJ_PROJECTION(som)}'s three range checks, then {@code som_setup}. + * + * @throws InvalidValueException with {@link ErrorCause#INVALID_PARAM_VALUE} for each of + * upstream's three rejections + */ + @Override + public void initialize() { + super.initialize(); + // PJ_PROJECTION(som), in upstream's order: asc_lon, then inc_angle, then ps_rev. + if (projectionLongitude < -ProjectionMath.TWOPI + || projectionLongitude > ProjectionMath.TWOPI) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+asc_lon=" + (projectionLongitude * RTD) + " deg: Invalid value for " + + "ascending longitude: should be in [-2pi, 2pi] range"); + } + if (alf < 0 || alf > Math.PI) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+inc_angle=" + (alf * RTD) + " deg: Invalid value for inclination angle: " + + "should be in [0, pi] range"); + } + if (p22 < 0) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+ps_rev=" + p22 + ": Number of days per rotation should be positive"); + } + somSetup(); + } + + /** + * {@code Projection.initialize()} plus {@code som_setup}, and nothing else — the entry point + * for a subclass such as {@link MisrSpaceObliqueMercatorProjection} that derives + * {@code lam0}, {@code alf}, {@code p22} and {@code rlm} itself and therefore has none of + * the generic operator's range checks to apply. + */ + protected final void initializeShared() { + super.initialize(); + somSetup(); + } + + /** + * {@code som_setup} ({@code som.cpp:206-243}) — everything that depends only on + * {@code alf}, {@code p22}, {@code rlm} and the ellipsoid. + */ + protected final void somSetup() { + sa = FastStrictTrig.sin(alf); + ca = FastStrictTrig.cos(alf); + if (Math.abs(ca) < 1e-9) { + ca = 1e-9; + } + final double esc = es * ca * ca; + final double ess = es * sa * sa; + w = (1. - esc) * rone_es; + w = w * w - 1.; + q = ess * rone_es; + t = ess * (2. - es) * rone_es * rone_es; + u = esc * rone_es; + xj = one_es * one_es * one_es; + rlm2 = rlm + ProjectionMath.TWOPI; + a2 = a4 = b = c1 = c3 = 0.; + seraz0(0., 1.); + for (double lam = 9.; lam <= 81.0001; lam += 18.) { + seraz0(lam, 4.); + } + for (double lam = 18; lam <= 72.0001; lam += 18.) { + seraz0(lam, 2.); + } + seraz0(90., 1.); + a2 /= 30.; + a4 /= 60.; + b /= 30.; + c1 /= 15.; + c3 /= 45.; + } + + /** + * {@code seraz0} ({@code som.cpp:66-85}) — one Simpson's-rule sample of the Fourier + * coefficients of the satellite ground track. + * + * @param lam the sample longitude, degrees (upstream multiplies by + * {@code DEG_TO_RAD} inside) + * @param mult the Simpson weight, 1, 2 or 4 + */ + private void seraz0(double lam, double mult) { + lam *= DTR; + final double sd = FastStrictTrig.sin(lam); + final double sdsq = sd * sd; + final double s = p22 * sa * FastStrictTrig.cos(lam) + * Math.sqrt((1. + t * sdsq) / ((1. + w * sdsq) * (1. + q * sdsq))); + final double d1 = 1. + q * sdsq; + final double h = Math.sqrt((1. + q * sdsq) / (1. + w * sdsq)) + * ((1. + w * sdsq) / (d1 * d1) - p22 * ca); + final double sq = Math.sqrt(xj * xj + s * s); + double fc = mult * (h * xj - s * s) / sq; + b += fc; + a2 += fc * FastStrictTrig.cos(lam + lam); + a4 += fc * FastStrictTrig.cos(lam * 4.); + fc = mult * s * (h + xj) / sq; + c1 += fc * FastStrictTrig.cos(lam); + c3 += fc * FastStrictTrig.cos(lam * 3.); + } + + /** + * {@code som_e_forward} ({@code som.cpp:87-156}), ported statement for statement. + *

+ * The two nested loops solve for the along-track parameter {@code lamdp}: the inner one is a + * 51-trip fixed-point iteration at {@code TOL}, the outer one retries at most three times + * with the ascending-node guess {@code lampp} shifted by a half revolution when the answer + * lands outside {@code (rlm, rlm2)}. + */ + @Override + protected ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { + int l; + int nn; + double lamt = 0.0; + double lamdp = 0.0; + double lampp; + double sav; + + if (lpphi > ProjectionMath.HALFPI) { + lpphi = ProjectionMath.HALFPI; + } else if (lpphi < -ProjectionMath.HALFPI) { + lpphi = -ProjectionMath.HALFPI; + } + lampp = lpphi >= 0. ? ProjectionMath.HALFPI : PI_HALFPI; + final double tanphi = FastStrictTrig.tan(lpphi); + for (nn = 0;;) { + final double fac; + sav = lampp; + final double lamtp = lplam + p22 * lampp; + final double cl = FastStrictTrig.cos(lamtp); + if (cl < 0) { + fac = lampp + FastStrictTrig.sin(lampp) * ProjectionMath.HALFPI; + } else { + fac = lampp - FastStrictTrig.sin(lampp) * ProjectionMath.HALFPI; + } + for (l = 50; l >= 0; --l) { + lamt = lplam + p22 * sav; + final double c = FastStrictTrig.cos(lamt); + if (Math.abs(c) < TOL) { + lamt -= TOL; + } + final double xlam = (one_es * tanphi * sa + FastStrictTrig.sin(lamt) * ca) / c; + lamdp = Math.atan(xlam) + fac; + if (Math.abs(Math.abs(sav) - Math.abs(lamdp)) < TOL) { + break; + } + sav = lamdp; + } + // `!l` in C, where the exhausted loop leaves l == -1 and therefore does NOT take + // this branch. See the class comment. + if (l == 0 || ++nn >= 3 || (lamdp > rlm && lamdp < rlm2)) { + break; + } + if (lamdp <= rlm) { + lampp = TWOPI_HALFPI; + } else if (lamdp >= rlm2) { + lampp = ProjectionMath.HALFPI; + } + } + if (l != 0) { + final double sp = FastStrictTrig.sin(lpphi); + final double phidp = ProjectionMath.asinChecked( + (one_es * ca * sp - sa * FastStrictTrig.cos(lpphi) * FastStrictTrig.sin(lamt)) + / Math.sqrt(1. - es * sp * sp)); + final double tanph = Math.log( + FastStrictTrig.tan(ProjectionMath.QUARTERPI + .5 * phidp)); + final double sd = FastStrictTrig.sin(lamdp); + final double sdsq = sd * sd; + final double s = p22 * sa * FastStrictTrig.cos(lamdp) + * Math.sqrt((1. + t * sdsq) / ((1. + w * sdsq) * (1. + q * sdsq))); + final double d = Math.sqrt(xj * xj + s * s); + xy.x = b * lamdp + a2 * FastStrictTrig.sin(2. * lamdp) + + a4 * FastStrictTrig.sin(lamdp * 4.) - tanph * s / d; + xy.y = c1 * sd + c3 * FastStrictTrig.sin(lamdp * 3.) + tanph * xj / d; + } else { + // Upstream answers HUGE_VAL here, which fwd_finalize turns into an error. Proj4J's + // forward funnel rejects a non-finite result, so raising directly says the same + // thing with the reason attached. Unreachable by exhaustion -- see the class + // comment -- so this fires only if the inner loop converges exactly on trip 51. + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, this, + "som forward of (" + lplam + ", " + lpphi + ") rad: the along-track " + + "fixed-point iteration did not settle within 51 trips at TOL = " + + TOL); + } + return xy; + } + + /** + * {@code som_e_inverse} ({@code som.cpp:158-204}), ported statement for statement. + * + *

No local {@code adjlon} is needed and none is applied. This kernel accumulates + * the satellite's along-track rotation in {@code lamt - p22 * lamdp} and legitimately + * returns a longitude well past π — {@code +proj=lsat +lsat=3 +path=120} reaches 533.2° + * at {@code (130, 45)}. {@link Projection#inverseProjectRadians} used to clamp to + * ±π, which silently discards the revolution count; it now applies + * {@link ProjectionMath#adjlon}, exactly as {@code inv_finalize} does, so the raw value + * composes correctly. {@link LandsatProjection} still carries a defensive local + * {@code adjlon} from before that fix landed; it is a no-op now and this class deliberately + * does not copy it. + */ + @Override + protected ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { + int nn; + double s = 0.; + double lamdp = xyx / b; + double sav; + + nn = 50; + do { + sav = lamdp; + final double sd = FastStrictTrig.sin(lamdp); + final double sdsq = sd * sd; + s = p22 * sa * FastStrictTrig.cos(lamdp) + * Math.sqrt((1. + t * sdsq) / ((1. + w * sdsq) * (1. + q * sdsq))); + lamdp = xyx + xyy * s / xj - a2 * FastStrictTrig.sin(2. * lamdp) + - a4 * FastStrictTrig.sin(lamdp * 4.) + - s / xj * (c1 * FastStrictTrig.sin(lamdp) + + c3 * FastStrictTrig.sin(lamdp * 3.)); + lamdp /= b; + } while (Math.abs(lamdp - sav) >= TOL && --nn != 0); + + double sl = FastStrictTrig.sin(lamdp); + final double fac = Math.exp(Math.sqrt(1. + s * s / xj / xj) + * (xyy - c1 * sl - c3 * FastStrictTrig.sin(lamdp * 3.))); + final double phidp = 2. * (Math.atan(fac) - ProjectionMath.QUARTERPI); + final double dd = sl * sl; + if (Math.abs(FastStrictTrig.cos(lamdp)) < TOL) { + lamdp -= TOL; + } + final double spp = FastStrictTrig.sin(phidp); + final double sppsq = spp * spp; + final double denom = 1. - sppsq * (1. + u); + if (denom == 0.0) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "som inverse of (" + xyx + ", " + xyy + ") is outside the projection " + + "domain: 1 - sin^2(phi'')(1 + u) is exactly zero"); + } + double lamt = Math.atan(((1. - sppsq * rone_es) * FastStrictTrig.tan(lamdp) * ca + - spp * sa * Math.sqrt((1. + q * dd) * (1. - sppsq) - sppsq * u) + / FastStrictTrig.cos(lamdp)) / denom); + sl = lamt >= 0. ? 1. : -1.; + final double scl = FastStrictTrig.cos(lamdp) >= 0. ? 1. : -1; + lamt -= ProjectionMath.HALFPI * (1. - scl) * sl; + out.x = lamt - p22 * lamdp; + if (Math.abs(sa) < TOL) { + out.y = ProjectionMath.asinChecked(spp / Math.sqrt(one_es * one_es + es * sppsq)); + } else { + out.y = Math.atan((FastStrictTrig.tan(lamdp) * FastStrictTrig.cos(lamt) + - ca * FastStrictTrig.sin(lamt)) / (one_es * sa)); + } + return out; + } + + /** {@code som_setup} assigns {@code P->inv} unconditionally, for all three operators. */ + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Space Oblique Mercator"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/SpilhausProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/SpilhausProjection.java new file mode 100644 index 0000000..5847fd6 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/SpilhausProjection.java @@ -0,0 +1,291 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.FastStrictTrig; + +/** + * Spilhaus. A port of {@code 9.8.1:src/projections/spilhaus.cpp}, added upstream in 2025 and + * derived from the discussion in PROJ issue #1851. + * + *

It is {@link AdamsWorldInASquareIIProjection} on a sphere, wrapped in an oblique + * rotation. {@code spilhaus.cpp:123-128} builds a child {@code adams_ws2} {@code PJ}, + * clears its eccentricity, and calls its forward and inverse directly — below the + * {@code a}/{@code x_0}/{@code k_0} layer. This class does the same by holding a child + * instance and calling its {@code projectRaw}/{@code projectInverse}, which are reachable + * because both classes live in this package. The child's own + * {@link AdamsProjection#initialize()} already forces {@code e = es = 0}. + * + *

The point of the oblique framing is to put the Southern Ocean in the middle of the map + * with the continents unbroken around the edge. The two leading minus signs in the + * forward's final two lines are what achieve it; dropping them mirrors the world. + * + *

Defaults, and why they are not zero

+ * + *

{@code spilhaus} is the only operator in proj4j whose {@code lon_0} and {@code lat_0} + * default to something other than the equator and Greenwich. {@code spilhaus.cpp:138-147} + * applies them only when the parameter is absent, so they are set in the constructor + * here and any {@code +lon_0}/{@code +lat_0} the parser sees overwrites them: + * + * + * + * + * + * + * + * + * + *
defaults
parameterdefault
{@code +lon_0}{@code 66.94970198} degrees
{@code +lat_0}{@code -49.56371678} degrees
{@code +azi}{@code 40.17823482} degrees
{@code +rot}{@code 45} degrees
{@code +k_0}{@code 1.0}; {@code sqrt(2)} reproduces {@code ESRI:54099}
+ * + *

{@code +azi} and {@code +rot} do not reach this class through {@code Proj4Parser} + * yet — the parser has no dispatch for either key, so a definition carrying them parses + * cleanly and then projects with the defaults. {@link #setAziDegrees} and + * {@link #setRotDegrees} exist so that wiring them up is a two-line change in the parser, and + * so that a caller constructing the projection programmatically can set them today. + * + *

Setup

+ * + *
+ *   chi0     = conformalLat(phi0)
+ *   sinalpha = -cos(chi0) * cos(azi)
+ *   cosalpha = sqrt(1 - sinalpha^2)
+ *   lambda_0 = atan2(tan(azi), -sin(chi0))
+ *   beta     = pi + atan2(-sin(azi), -tan(chi0))
+ *   conformal_distortion = cos(phi0) / sqrt(1 - es sin^2 phi0) / cos(chi0)
+ * 
+ * + *

On a sphere {@code chi0 == phi0} and {@code conformal_distortion == 1}. Unlike the rest of + * this family, {@code spilhaus} itself is {@code Sph&Ell} — it keeps the requested + * eccentricity and uses it for the conformal latitude; only the child is spherical. + */ +public class SpilhausProjection extends Projection { + + private static final long serialVersionUID = -643336112054248619L; + + /** {@code spilhaus.cpp:140} — {@code +lon_0} when none is given, in degrees. */ + public static final double DEFAULT_LON_0_DEGREES = 66.94970198; + + /** {@code spilhaus.cpp:143} — {@code +lat_0} when none is given, in degrees. */ + public static final double DEFAULT_LAT_0_DEGREES = -49.56371678; + + /** {@code spilhaus.cpp:145} — {@code +azi} when none is given, in degrees. */ + public static final double DEFAULT_AZI_DEGREES = 40.17823482; + + /** {@code spilhaus.cpp:147} — {@code +rot} when none is given, in degrees. */ + public static final double DEFAULT_ROT_DEGREES = 45; + + private double azimuth = DEFAULT_AZI_DEGREES * DTR; + private double rotation = DEFAULT_ROT_DEGREES * DTR; + + private double cosalpha; + private double sinalpha; + private double beta; + private double lambda0; + private double conformalDistortion; + private double cosrot; + private double sinrot; + + /** + * The child {@code adams_ws2}. Its {@code a}, false origin and scale are never used — + * only {@link AdamsProjection#projectRaw} and + * {@link AdamsWorldInASquareIIProjection#projectInverse}, both of which work in unit-sphere + * units. + */ + private final AdamsWorldInASquareIIProjection adamsWs2 = + new AdamsWorldInASquareIIProjection(); + + /** + * One scratch coordinate for the child's result. {@code Projection} is documented as not + * thread-safe and mutated on the hot path by several existing operators, so this follows + * the same contract rather than allocating per call. + */ + private final ProjCoordinate child = new ProjCoordinate(); + + public SpilhausProjection() { + projectionLongitude = DEFAULT_LON_0_DEGREES * DTR; + projectionLatitude = DEFAULT_LAT_0_DEGREES * DTR; + } + + /** {@code +azi}, in degrees. */ + public void setAziDegrees(double azi) { + this.azimuth = azi * DTR; + } + + /** {@code +azi}, in radians. */ + public void setAzi(double azi) { + this.azimuth = azi; + } + + /** {@code +azi}, in radians. */ + public double getAzi() { + return azimuth; + } + + /** {@code +rot}, in degrees. */ + public void setRotDegrees(double rot) { + this.rotation = rot * DTR; + } + + /** {@code +rot}, in radians. */ + public void setRot(double rot) { + this.rotation = rot; + } + + /** {@code +rot}, in radians. */ + public double getRot() { + return rotation; + } + + @Override + public void initialize() { + super.initialize(); + + adamsWs2.setEllipsoid(ellipsoid); + adamsWs2.initialize(); + + cosrot = FastStrictTrig.cos(rotation); + sinrot = FastStrictTrig.sin(rotation); + + final double chi0 = ConformalLat.conformalLat(projectionLatitude, e); + sinalpha = -FastStrictTrig.cos(chi0) * FastStrictTrig.cos(azimuth); + cosalpha = Math.sqrt(1 - sinalpha * sinalpha); + lambda0 = StrictMath.atan2(FastStrictTrig.tan(azimuth), -FastStrictTrig.sin(chi0)); + beta = Math.PI + StrictMath.atan2(-FastStrictTrig.sin(azimuth), -FastStrictTrig.tan(chi0)); + + final double sinphi0 = FastStrictTrig.sin(projectionLatitude); + conformalDistortion = FastStrictTrig.cos(projectionLatitude) + / Math.sqrt(1 - es * sinphi0 * sinphi0) + / FastStrictTrig.cos(chi0); + } + + /** + * {@code spilhaus_forward}, {@code spilhaus.cpp:42-75}. Snyder's A working manual + * formulas (5-7) and (5-8b) rotate the conformal sphere, and the child {@code adams_ws2} + * squares the result. + * + *

{@code lam} arrives with {@code lon_0} already removed by + * {@link Projection#projectRadians(ProjCoordinate, ProjCoordinate)}, matching + * {@code fwd_prepare}. + */ + @Override + public ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + AdamsProjection.validateForwardInput(lam, phi); + + final double chi = ConformalLat.conformalLat(phi, e); + final double cosChi = FastStrictTrig.cos(chi); + final double sinChi = FastStrictTrig.sin(chi); + + final double coslam = FastStrictTrig.cos(lam - lambda0); + final double sinlam = FastStrictTrig.sin(lam - lambda0); + + // Snyder (5-7) + final double phiAdams = + AdamsProjection.aasin(sinalpha * sinChi - cosalpha * cosChi * coslam); + + // Snyder (5-8b) + double lamAdams = beta + StrictMath.atan2(cosChi * sinlam, + sinalpha * cosChi * coslam + cosalpha * sinChi); + // Upstream's explicit while-loops, not adjlon: beta can push the sum past pi by up to + // beta itself, so a single subtraction is not always enough. + while (lamAdams > Math.PI) { + lamAdams -= Math.PI * 2; + } + while (lamAdams < -Math.PI) { + lamAdams += Math.PI * 2; + } + + adamsWs2.projectRaw(lamAdams, phiAdams, child); + + final double factor = conformalDistortion * scaleFactor; + dst.x = -(child.x * cosrot + child.y * sinrot) * factor; + dst.y = -(child.x * -sinrot + child.y * cosrot) * factor; + return dst; + } + + /** + * {@code spilhaus_inverse}, {@code spilhaus.cpp:77-103} — the exact mirror of the forward, + * ending in the inverse conformal latitude. + * + *

The returned longitude is wrapped into {@code (-pi, pi]} here rather than being left + * to the caller. {@code inverseProjectRadians} clamps rather than wraps before it + * re-adds {@code lon_0}, and {@code lambda_0 + atan2(..)} genuinely exceeds {@code pi} for + * part of the map with the default {@code azi} and {@code lat_0} — clamping there would + * pin a band of the Pacific to the antimeridian. + */ + @Override + public ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double factor = 1.0 / (conformalDistortion * scaleFactor); + final double xa = -(x * cosrot + y * -sinrot) * factor; + final double ya = -(x * sinrot + y * cosrot) * factor; + adamsWs2.projectInverse(xa, ya, child); + + final double cosphiS = FastStrictTrig.cos(child.y); + final double sinphiS = FastStrictTrig.sin(child.y); + final double coslamS = FastStrictTrig.cos(child.x - beta); + final double sinlamS = FastStrictTrig.sin(child.x - beta); + + final double chi = + AdamsProjection.aasin(sinalpha * sinphiS + cosalpha * cosphiS * coslamS); + + dst.x = AdamsProjection.adjlon(lambda0 + AdamsProjection.aatan2(cosphiS * sinlamS, + sinalpha * cosphiS * coslamS - cosalpha * sinphiS)); + dst.y = ConformalLat.conformalLatInverse(chi, e); + return dst; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public boolean isConformal() { + return true; + } + + /** + * {@code azi} and {@code rot} change the projection, so they belong in equality; the base + * class already covers {@code lat_0}, {@code lon_0}, {@code k_0} and the ellipsoid. + */ + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (!(that instanceof SpilhausProjection) || !super.equals(that)) { + return false; + } + SpilhausProjection p = (SpilhausProjection) that; + return azimuth == p.azimuth && rotation == p.rotation; + } + + @Override + public int hashCode() { + int h = super.hashCode(); + h = 31 * h + Double.hashCode(azimuth == 0.0 ? 0.0 : azimuth); + h = 31 * h + Double.hashCode(rotation == 0.0 ? 0.0 : rotation); + return h; + } + + @Override + public String toString() { + return "Spilhaus"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/StereographicAzimuthalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/StereographicAzimuthalProjection.java index ea32e27..7f92273 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/StereographicAzimuthalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/StereographicAzimuthalProjection.java @@ -20,20 +20,75 @@ package org.locationtech.proj4j.proj; import org.locationtech.proj4j.*; +import org.locationtech.proj4j.util.ConformalLat; import org.locationtech.proj4j.util.ProjectionMath; +/** + * Stereographic azimuthal projection, {@code 9.8.1:src/projections/stere.cpp}. + * + *

One deliberate divergence from PROJ 9.8.1 — do not "fix" it back

+ * + * The ellipsoidal inverse here calls {@link ConformalLat#phi2} where upstream + * ({@code stere.cpp:173-188}) still runs its own {@code NITER = 8}, {@code CONV = 1e-10} + * Newton loop with a {@code pow} on every trip. The two solve the same fixed point. + * Upstream iterates + *
+ *   phi = 2 atan(tp * ((1 + e sin phi)/(1 - e sin phi))^(halfe)) - halfpi
+ * 
+ * with {@code halfpi = +pi/2, halfe = +e/2} for the oblique and equatorial aspects and + * {@code halfpi = -pi/2, halfe = -e/2} for the polar ones. Rearranged, both branches are + * exactly {@code tan(pi/4 - phi/2) = ts * ((1 - e sin phi)/(1 + e sin phi))^(e/2)}, which is + * the fixed point of {@code pj_phi2}, with + *
    + *
  • {@code ts = 1/tp} for oblique/equatorial, where + * {@code tp = tan(pi/4 + phi_l/2)}; and + *
  • {@code ts = -tp} for the poles, where {@code tp = -rho/akm1}, i.e. + * {@code ts = rho/akm1}. + *
+ * Upstream simply never refactored it. The Karney formulation is better on every axis — + * one or two iterations instead of up to eight, no {@code pow} in the loop, a fixed trip + * count (hence a platform-independent answer), and about 2 nm of error against upstream's + * roughly 4 um. It therefore makes proj4j differ from 9.8.1 by up to ~4 um on + * {@code stere} inverses — 25,000 times inside the 0.1 mm bar the corpus sets for this + * projection. + */ public class StereographicAzimuthalProjection extends AzimuthalProjection { + private static final long serialVersionUID = 4780435696828185438L; + private final static double TOL = 1.e-8; private double akm1; + /** + * A bare {@code +proj=stere}, i.e. the equatorial aspect with {@code +lat_ts} absent. + *

+ * Two defaults are fixed here, and both were wrong in the same way — the class field + * was standing in for a parameter PROJ defaults independently, and {@code Proj4Parser} assigns + * a keyword only when it is present, so the class default is the effective + * default. + *

    + *
  • {@code lat_0} was 90°, so {@code +proj=stere +ellps=GRS80} ran the polar + * aspect where PROJ runs the equatorial one. PROJ's {@code pj_init} reads {@code "rlat_0"} + * and gets 0.
  • + *
  • {@code lat_ts} was 0, but {@code 9.8.1:stere.cpp:305-309} reads it as + * {@code pj_param(...,"tlat_ts").i ? |lat_ts| : M_HALFPI} — π/2 when the + * keyword is absent. With 0 the two polar branches take their + * {@code cos(phits)/tsfn(phits)} arm instead of {@code 2*k_0/sqrt((1+e)^(1+e)(1-e)^(1-e))}, + * which scaled {@code +proj=stere +ellps=GRS80 +lat_0=-90 +k_0=0.97} by a factor of + * 1.9335 — 1,056 km at the corpus's test point.
  • + *
+ * {@code +lat_ts=0} on a polar aspect is legal upstream and still reaches the other arm, + * because the parser then writes the 0 explicitly. + */ public StereographicAzimuthalProjection() { - this(Math.toRadians(90.0), Math.toRadians(0.0)); + this(0.0, 0.0); } public StereographicAzimuthalProjection(double projectionLatitude, double projectionLongitude) { super(projectionLatitude, projectionLongitude); + // stere.cpp:305-309 -- phits defaults to pi/2, not to 0, and it is read for every aspect. + trueScaleLatitude = ProjectionMath.HALFPI; initialize(); } @@ -67,14 +122,19 @@ public void initialize() { Math.sqrt(Math.pow(1+e,1+e)*Math.pow(1-e,1-e)); else { akm1 = Math.cos(trueScaleLatitude) / - ProjectionMath.tsfn(trueScaleLatitude, t = Math.sin(trueScaleLatitude), e); + ConformalLat.tsfn(trueScaleLatitude, t = Math.sin(trueScaleLatitude), e); t *= e; akm1 /= Math.sqrt(1. - t * t); } break; + // 9.8.1:stere.cpp:262-270 handles EQUIT and OBLIQ in ONE branch, so the + // equatorial aspect also gets sinX1 = 0, cosX1 = 1. proj4j split them and + // left the equatorial case with sinphi0 = cosphi0 = 0, which made the whole + // ellipsoidal equatorial *inverse* collapse to (0, 0) for every input -- + // tp = 2*atan2(rho*cosphi0, akm1) = 0, so ts = 1 and phi2(1) = 0. + // For phi0 = 0 the shared formula still yields akm1 = 2*k0, so the forward + // direction is unchanged. case EQUATOR: - akm1 = 2. * scaleFactor; - break; case OBLIQUE: t = Math.sin(projectionLatitude); X = 2. * Math.atan(ssfn(projectionLatitude, t, e)) - ProjectionMath.HALFPI; @@ -159,7 +219,15 @@ public ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { coslam = -coslam; sinphi = -sinphi; case NORTH_POLE: - xy.x = akm1 * ProjectionMath.tsfn(phi, sinphi, e); + // 9.8.1:stere.cpp:83-86. Exactly at the pole ConformalLat.tsfn returns + // cos(pi/2)/2 = 3.06e-17 rather than the 0 that the old tan-based tsfn + // produced by accident; upstream special-cases it, and the corpus asserts + // `+proj=stere +lat_0=90 +lat_ts=70; accept 0 90; expect 0 0` at + // tolerance 1e-15 m. + if (Math.abs(phi - ProjectionMath.HALFPI) < 1e-15) + xy.x = 0; + else + xy.x = akm1 * ConformalLat.tsfn(phi, sinphi, e); xy.y = - xy.x * coslam; break; } @@ -203,13 +271,14 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { break; } } else { - double cosphi, sinphi, tp, phi_l, rho, halfe, halfpi; + double cosphi, sinphi, ts, phi_l, rho; rho = ProjectionMath.distance(x, y); switch (mode) { case OBLIQUE: case EQUATOR: default: // To prevent the compiler complaining about uninitialized vars. + double tp; cosphi = Math.cos( tp = 2. * Math.atan2(rho * cosphi0 , akm1) ); sinphi = Math.sin(tp); if (rho <= 0) { @@ -218,31 +287,22 @@ public ProjCoordinate projectInverse(double x, double y, ProjCoordinate lp) { else { phi_l = Math.asin(cosphi * sinphi0 + (y * sinphi * cosphi0 / rho)); } - tp = Math.tan(.5 * (ProjectionMath.HALFPI + phi_l)); + // ts = 1 / tan(pi/4 + phi_l/2) -- see the class comment on the divergence. + ts = 1. / Math.tan(.5 * (ProjectionMath.HALFPI + phi_l)); x *= sinphi; y = rho * cosphi0 * cosphi - y * sinphi0* sinphi; - halfpi = ProjectionMath.HALFPI; - halfe = .5 * e; break; case NORTH_POLE: y = -y; case SOUTH_POLE: - phi_l = ProjectionMath.HALFPI - 2. * Math.atan(tp = - rho / akm1); - halfpi = -ProjectionMath.HALFPI; - halfe = -.5 * e; + // ts = -tp with tp = -rho/akm1. + ts = rho / akm1; break; } - for (int i = 8; i-- != 0; phi_l = lp.y) { - sinphi = e * Math.sin(phi_l); - lp.y = 2. * Math.atan(tp * Math.pow((1.+sinphi)/(1.-sinphi), halfe)) - halfpi; - if (Math.abs(phi_l - lp.y) < EPS10) { - if (mode == SOUTH_POLE) - lp.y = -lp.y; - lp.x = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y); - return lp; - } - } - throw new ConvergenceFailureException("Iteration didn't converge"); + lp.y = ConformalLat.phi2(ts, e); + if (mode == SOUTH_POLE) + lp.y = -lp.y; + lp.x = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y); } return lp; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/SwissObliqueMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/SwissObliqueMercatorProjection.java index c83e2cf..ac3440f 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/SwissObliqueMercatorProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/SwissObliqueMercatorProjection.java @@ -29,6 +29,8 @@ */ public class SwissObliqueMercatorProjection extends Projection { + private static final long serialVersionUID = 5252033951754363918L; + private static final int NITER = 6; private double K, c, hlf_e, kR, cosp0, sinp0; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TiltedPerspectiveProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/TiltedPerspectiveProjection.java new file mode 100644 index 0000000..f24358a --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/TiltedPerspectiveProjection.java @@ -0,0 +1,149 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Tilted perspective, {@code +proj=tpers} — {@code PJ_PROJECTION(tpers)} of + * {@code 9.8.1:src/projections/nsper.cpp:180-196}. + * + *

{@link PerspectiveProjection near-sided perspective} with the image plane rotated out of + * the tangent plane. Upstream shares one struct, one {@code nsper_setup}, one forward and one + * inverse with {@code nsper}; the only difference is that {@code Q->tilt} is 1, which + * enables a four-line homography at the end of the forward and its exact inverse at the start + * of the inverse. This class is therefore a two-parameter subclass and holds no arithmetic of + * its own. + * + *

Parameters

+ * + *
    + *
  • {@code +tilt} — upstream's {@code omega}, read through {@code pj_param}'s + * {@code "r"} sigil, so it is an angle in the DMS-capable grammar and defaults to 0.
  • + *
  • {@code +azi} — upstream's {@code gamma}, also {@code "r"}, also defaulting to + * 0.
  • + *
  • {@code +h} — inherited, and still mandatory: {@code nsper_setup} rejects + * {@code h/a <= 0}.
  • + *
+ * + *

Neither angle is validated, because upstream validates neither — any real + * {@code omega} and {@code gamma} give a well-defined {@code (cg, sg, cw, sw)}. A tilt of + * exactly ±90° makes {@code cw} zero and collapses the forward's {@code ba}, but + * that is upstream's behaviour too and the corpus does not probe it. + * + *

Idempotence

+ * + *

{@code initialize()} runs twice (constructor-less here, but {@code Proj4Parser} calls it + * after setting parameters, and {@link PerspectiveProjection} is reached through + * {@code super}). The two angles are held as radians in their own fields and the four + * trigonometric products are recomputed from them on every call, so nothing is read while + * being written. + * + * @see PerspectiveProjection + */ +public class TiltedPerspectiveProjection extends PerspectiveProjection { + + private static final long serialVersionUID = 5218578966823159603L; + + /** Upstream's {@code omega}, {@code +tilt}, in radians. */ + private double tiltRadians = 0.0; + + /** Upstream's {@code gamma}, {@code +azi}, in radians. */ + private double aziRadians = 0.0; + + /** + * A bare {@code +proj=tpers}. The tilt flag is set here rather than in + * {@link #initialize()} so that it is true before any inherited method can observe it. + */ + public TiltedPerspectiveProjection() { + tilt = true; + } + + /** + * {@code +tilt}, the rotation of the image plane out of the tangent plane. + * + * @param tiltDegrees the tilt, in degrees + */ + public void setTiltDegrees(double tiltDegrees) { + this.tiltRadians = tiltDegrees * ProjectionMath.DTR; + } + + /** + * {@code +tilt} in radians, which is the form {@code pj_param}'s {@code "r"} sigil + * produces. + * + * @param tiltRadians the tilt, in radians + */ + public void setTiltRadians(double tiltRadians) { + this.tiltRadians = tiltRadians; + } + + /** + * The {@code +tilt} in force. + * + * @return the tilt, in radians + */ + public double getTiltRadians() { + return tiltRadians; + } + + /** + * {@code +azi}, the azimuth the tilt is applied about. + * + * @param aziDegrees the azimuth, in degrees + */ + public void setAziDegrees(double aziDegrees) { + this.aziRadians = aziDegrees * ProjectionMath.DTR; + } + + /** + * {@code +azi} in radians. + * + * @param aziRadians the azimuth, in radians + */ + public void setAziRadians(double aziRadians) { + this.aziRadians = aziRadians; + } + + /** + * The {@code +azi} in force. + * + * @return the azimuth, in radians + */ + public double getAziRadians() { + return aziRadians; + } + + /** + * {@code PJ_PROJECTION(tpers)} ({@code nsper.cpp:180-196}), then {@code nsper_setup}. + */ + @Override + public void initialize() { + tilt = true; + cg = FastStrictTrig.cos(aziRadians); + sg = FastStrictTrig.sin(aziRadians); + cw = FastStrictTrig.cos(tiltRadians); + sw = FastStrictTrig.sin(tiltRadians); + super.initialize(); + } + + @Override + public String toString() { + return "Tilted perspective"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TimesProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/TimesProjection.java new file mode 100644 index 0000000..e47683b --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/TimesProjection.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * The Times projection ({@code +proj=times}), a port of + * {@code 9.8.1:src/projections/times.cpp}. Spherical only, closed form both ways, no + * parameters and no domain restrictions. + * + *

From Snyder, Flattening the Earth (1993) pp. 213-214: + * + *

+ *   T = tan(phi/2)
+ *   S = sin(pi/4 * T)
+ *   x = lam * (0.74482 - 0.34588 * S^2)
+ *   y = 1.70711 * T
+ * 
+ * + *

and the inverse is the same four lines read upwards, with {@code T = y / 1.70711} + * and {@code phi = 2 * atan(T)}. + * + *

Two things not to "improve"

+ * + *

{@code sin(M_FORTPI * T)} really is {@code sin(pi/4 * T)} + * ({@code times.cpp:45}), not {@code sin(pi/4) * T} and not a degree conversion. It reads + * like a typo and is not one. + * + *

{@code S} is recomputed from {@code T} in the inverse + * ({@code times.cpp:59-63}) rather than solved for, because {@code y} determines + * {@code T} exactly — the northing is linear in {@code T}. So the inverse is exact rather + * than iterative, and the corpus's five inverse rows are the forward rows read backwards + * to the same 0.1 mm tolerance. + * + *

{@code phi = 2*atan(T)} lands strictly inside {@code (-pi, pi)}, so a wildly + * out-of-range northing yields a latitude outside {@code [-pi/2, pi/2]} rather than an + * error. That is upstream's behaviour; the inverse has no domain check at all. + */ +public class TimesProjection extends CylindricalProjection { + + private static final long serialVersionUID = -7338174566683790141L; + + /** {@code M_FORTPI}: {@code pi/4}, bit-identical to C's constant. */ + private static final double FORT_PI = Math.PI / 4.0; + + /** {@code times_s_forward}, {@code times.cpp:39-52}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + final double t = StrictMath.tan(phi / 2.0); + final double s = StrictMath.sin(FORT_PI * t); + final double s2 = s * s; + dst.x = lam * (0.74482 - 0.34588 * s2); + dst.y = 1.70711 * t; + return dst; + } + + /** {@code times_s_inverse}, {@code times.cpp:54-67}. */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double t = y / 1.70711; + final double s = StrictMath.sin(FORT_PI * t); + final double s2 = s * s; + dst.x = x / (0.74482 - 0.34588 * s2); + dst.y = 2.0 * StrictMath.atan(t); + return dst; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "Times"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TissotProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/TissotProjection.java index 6fad14c..d8cd082 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/TissotProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/TissotProjection.java @@ -21,6 +21,8 @@ public class TissotProjection extends SimpleConicProjection { + private static final long serialVersionUID = -5241312323887968758L; + public TissotProjection() { super( SimpleConicProjection.TISSOT ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/ToblerMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/ToblerMercatorProjection.java new file mode 100644 index 0000000..d9ae963 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/ToblerMercatorProjection.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.MathHelpers; + +/** + * Tobler-Mercator ({@code +proj=tobmerc}), a port of + * {@code 9.8.1:src/projections/tobmerc.cpp}. Spherical only; both directions are closed + * form. + * + *

An equal-area companion to {@code merc}: the northing is Mercator's, but the easting + * carries {@code cos^2(phi)} rather than being independent of latitude, which is what + * converts the conformal map into an equal-area one. + * + *

+ *   x = k0 * lam * cos(phi)^2
+ *   y = k0 * asinh(tan(phi))
+ * 
+ * + *

The pole rejection is deliberate, and upstream says so

+ * + *

{@code |phi| >= pi/2} is rejected with + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + * ({@code tobmerc.cpp:16-25}). Upstream's own comment records that it is not obviously + * necessary — {@code M_HALFPI} is strictly below the true {@code pi/2} in double + * precision, so {@code tan} would merely return a large finite number and + * {@code asinh} of it about 38.025 — but {@code builtins.gie} asserts the failure, so the + * check stays. Two corpus rows depend on it. + * + *

The interaction with {@link Projection#checkForwardDomain} matters: that method + * clamps a latitude within {@code 1e-12} rad of the pole to exactly + * {@code Math.PI/2}, and {@code Math.PI/2} is the same double as C's {@code M_HALFPI}. So + * a corpus row at exactly 90° arrives here as exactly {@code Math.PI/2} and the + * {@code >=} fires, which is what upstream does too. + * + *

{@code k0}

+ * + *

{@code P->k0} is Proj4J's {@code scaleFactor} ({@code +k_0}, default 1). It divides + * out again in the inverse, so a non-default {@code +k_0} is exercised by the roundtrip + * as well as the forward. + * + * @see MercatorProjection + */ +public class ToblerMercatorProjection extends CylindricalProjection { + + private static final long serialVersionUID = 5807501652865754998L; + + private static final double HALF_PI = Math.PI / 2.0; + + /** + * {@code tobmerc_s_forward}, {@code tobmerc.cpp:12-31}. + * + * @throws ProjectionException at {@code |phi| >= pi/2}, where upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} + */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + if (Math.abs(phi) >= HALF_PI) { + throw new ProjectionException(this, + "tobmerc is undefined at the poles: |phi| = " + Math.abs(phi) + + " rad is at or beyond pi/2 (tobmerc.cpp:16)"); + } + final double cosphi = StrictMath.cos(phi); + dst.x = scaleFactor * lam * cosphi * cosphi; + dst.y = scaleFactor * MathHelpers.asinh(StrictMath.tan(phi)); + return dst; + } + + /** + * {@code tobmerc_s_inverse}, {@code tobmerc.cpp:33-41}. + * + *

No domain check and no guard on {@code cosphi}: {@code atan(sinh(.))} lands + * strictly inside {@code (-pi/2, pi/2)} for every finite argument, so + * {@code cos(phi)} is strictly positive and the division is safe. The corpus probes + * this deliberately with {@code +proj=tobmerc +R=1} at {@code y = 1e-15} against a + * {@code 1e-15 m} tolerance, which only holds because {@code asinh}/{@code sinh} are + * both accurate near zero — see {@link MathHelpers#asinh}'s {@code log1p} branch. + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + final double phi = StrictMath.atan(StrictMath.sinh(y / scaleFactor)); + final double cosphi = StrictMath.cos(phi); + dst.y = phi; + dst.x = x / scaleFactor / (cosphi * cosphi); + return dst; + } + + public boolean hasInverse() { + return true; + } + + public boolean isEqualArea() { + return true; + } + + public String toString() { + return "Tobler-Mercator"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TransverseCylindricalEqualArea.java b/core/src/main/java/org/locationtech/proj4j/proj/TransverseCylindricalEqualArea.java index 2410818..cb14773 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/TransverseCylindricalEqualArea.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/TransverseCylindricalEqualArea.java @@ -23,6 +23,8 @@ public class TransverseCylindricalEqualArea extends Projection { + private static final long serialVersionUID = 6151308892071029556L; + private double rk0; public TransverseCylindricalEqualArea() { diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TransverseMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/TransverseMercatorProjection.java index eccce4d..27f7514 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/TransverseMercatorProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/TransverseMercatorProjection.java @@ -19,15 +19,88 @@ */ package org.locationtech.proj4j.proj; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.util.MeridianArc; import org.locationtech.proj4j.util.ProjectionMath; /** - * Transverse Mercator Projection algorithm is taken from the USGS PROJ package. + * {@code +proj=tmerc} — the transverse Mercator, with both of PROJ's algorithms and PROJ's own + * choice between them. + * + *

Which algorithm runs, and why that is a breaking change

+ * + *

PROJ 9.8.1 ships Poder/Engsager as the built-in default for {@code tmerc} + * ({@code proj_internal.h:840-841}) and its shipped {@code data/proj.ini} sets + * {@code tmerc_default_algo = poder_engsager}. Proj4J up to 1.4.3 always ran the older + * Evenden/Snyder series. The two differ by: + * + * + * + * + * + * + * + * + *
Evenden/Snyder minus Poder/Engsager on GRS80, {@code k_0 = 1}
from the central meridianeasting difference
about 2 µm
about 0.9 mm
20°metres
45°kilometres
+ * + *

Poder/Engsager is right — it is about 1 nm anywhere inside 150° — which is why + * {@code builtins.gie:7095-7127} asserts {@code +proj=tmerc +ellps=GRS80} at + * {@code tolerance 50 nm} against the same numbers as {@code +proj=etmerc}, including a + * row 3,900 km out that the Evenden/Snyder series misses by about 1.5 km. Every existing + * Proj4J user's UTM and State-Plane output moves. That is the fix, not an accident, and the + * escape hatches below exist so that it can be opted out of rather than discovered. + * + *

The escape hatches

+ * + *
    + *
  • {@link #setApprox(boolean) +approx} — PROJ's documented legacy switch + * ({@code tmerc.cpp:558-561}). Checked before {@code +algo} and wins over it. + *
  • {@link #setAlgorithm(String) +algo=evenden_snyder|poder_engsager|auto} + * ({@code tmerc.cpp:563-579}). Any other value is an error, as upstream. + *
  • A sphere ({@code es == 0}) forces Evenden/Snyder whatever was asked for + * ({@code tmerc.cpp:518-519}), because Poder/Engsager is not defined there. + *
+ * + *

{@code +algo=auto} is accepted and resolves to Poder/Engsager. This is a deliberate + * divergence. Upstream's AUTO picks the approximate series when {@code |lam| <= 3}° forward, + * or when {@code |x| <= 0.053 - 0.022 y^2} inverse — a data-dependent branch that introduces a + * discontinuity of up to about 0.1 mm in the output field at the switch boundary. For a + * consumer doing geometry on the results that is worse than uniform slowness, and + * {@code builtins.gie:7379-7407} itself only asserts that AUTO agrees with Poder/Engsager to + * 0.1 mm. Upstream also downgrades AUTO to Poder/Engsager whenever {@code es > 0.1}, + * {@code phi0 != 0} or {@code |k0 - 1| > 0.01} ({@code tmerc.cpp:591-594}). + * + *

Layout

+ * + *

The Evenden/Snyder series ({@code approx_e_fwd}, {@code approx_e_inv}, + * {@code tmerc_spherical_fwd}, {@code tmerc_spherical_inv}) is implemented here. Poder/Engsager + * is not duplicated: it is {@link ExtendedTransverseMercatorProjection}, held as a delegate and + * driven through its raw kernel, so {@code tmerc} and {@code etmerc} cannot drift apart. */ public class TransverseMercatorProjection extends CylindricalProjection { + private static final long serialVersionUID = -4387042293999017377L; + + /** The choice of algorithm, {@code TMercAlgo} in {@code proj_internal.h:836-842}. */ + public enum Algorithm { + + /** + * Upstream's data-dependent heuristic. Accepted for parity and resolved to + * {@link #PODER_ENGSAGER}; see the class comment. + */ + AUTO, + + /** The approximate series, {@code +approx}. Also forced on a sphere. */ + EVENDEN_SNYDER, + + /** The exact series. PROJ 9.8.1's built-in default, and this class's. */ + PODER_ENGSAGER + } + private final static double FC1 = 1.0; private final static double FC2 = 0.5; private final static double FC3 = 0.16666666666666666666; @@ -37,6 +110,9 @@ public class TransverseMercatorProjection extends CylindricalProjection { private final static double FC7 = 0.02380952380952380952; private final static double FC8 = 0.01785714285714285714; + /** {@code EPS10} in {@code tmerc.cpp:52}, the spherical forward's slop band. */ + private final static double EPS10 = 1.0e-10; + /** * Indicates whether a Southern Hemisphere UTM zone */ @@ -44,14 +120,38 @@ public class TransverseMercatorProjection extends CylindricalProjection { private int utmZone = -1; private double esp; private double ml0; - private double[] en; + + /** + * The order-6 meridional-arc series in the third flattening, + * {@code 9.8.1:src/mlfn.cpp}. Replaces {@code ProjectionMath.enfn}/{@code mlfn}/ + * {@code inv_mlfn}: the forward gains about three decimal digits and the inverse + * becomes closed form. + */ + private MeridianArc meridian; + + /** + * The Poder/Engsager kernel, or {@code null} on a sphere. Immutable once + * {@link #initialize()} has run, and built even when {@code +approx} was asked for, so that + * {@link #setApprox} and {@link #setAlgorithm} can be called afterwards without a re-setup. + */ + private ExtendedTransverseMercatorProjection exact; + + /** {@code +algo}. */ + private Algorithm algorithm = Algorithm.PODER_ENGSAGER; + + /** {@code +approx}, which {@code getAlgoFromParams} tests before {@code +algo}. */ + private boolean approx = false; public TransverseMercatorProjection() { - ellipsoid = Ellipsoid.GRS80; - projectionLatitude = Math.toRadians(0); - projectionLongitude = Math.toRadians(0); - minLongitude = Math.toRadians(-90); - maxLongitude = Math.toRadians(90); + // setEllipsoid, not an assignment: Projection's constructor has already run + // setEllipsoid(Ellipsoid.SPHERE), so assigning the field alone left a/e/es describing that + // sphere while the field claimed GRS80 -- an un-parsed instance therefore ran the + // *spherical* series on a radius nobody asked for. + setEllipsoid(Ellipsoid.GRS80); + projectionLatitude = ProjectionMath.toRad(0); + projectionLongitude = ProjectionMath.toRad(0); + minLongitude = ProjectionMath.toRad(-90); + maxLongitude = ProjectionMath.toRad(90); initialize(); } @@ -78,10 +178,91 @@ public boolean getSouthernHemisphere() { return isSouth; } + /** + * {@code +approx}: run the Evenden/Snyder series, reproducing Proj4J 1.4.3's numbers. + * + *

Takes effect immediately and needs no re-{@link #initialize()}; both algorithms are set + * up whenever the figure of the Earth admits both. + * + * @param approx true to select Evenden/Snyder regardless of {@link #setAlgorithm} + */ + public void setApprox(boolean approx) { + this.approx = approx; + } + + /** @return true if {@code +approx} was requested */ + public boolean isApprox() { + return approx; + } + + /** + * {@code +algo}. + * + * @param algorithm one of {@code evenden_snyder}, {@code poder_engsager}, {@code auto}, + * case-insensitively + * @throws InvalidValueException with {@link ErrorCause#INVALID_PARAM_VALUE} for any other + * value — {@code tmerc.cpp:575-578} logs "unknown value for +algo" and fails setup + */ + public void setAlgorithm(String algorithm) { + if (algorithm == null) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "unknown value for +algo: null"); + } + String name = algorithm.trim().toLowerCase(java.util.Locale.ROOT); + if ("evenden_snyder".equals(name)) { + this.algorithm = Algorithm.EVENDEN_SNYDER; + } else if ("poder_engsager".equals(name)) { + this.algorithm = Algorithm.PODER_ENGSAGER; + } else if ("auto".equals(name)) { + this.algorithm = Algorithm.AUTO; + } else { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "unknown value for +algo: '" + algorithm + "'; expected one of " + + "evenden_snyder, poder_engsager, auto"); + } + } + + /** @param algorithm the algorithm to use; {@link Algorithm#AUTO} resolves to Poder/Engsager */ + public void setAlgorithm(Algorithm algorithm) { + if (algorithm == null) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "unknown value for +algo: null"); + } + this.algorithm = algorithm; + } + + /** @return the requested algorithm, before the sphere and {@code +approx} overrides */ + public Algorithm getAlgorithm() { + return algorithm; + } + + /** + * The algorithm that will actually run, after {@code es == 0} and {@code +approx} are + * applied and {@link Algorithm#AUTO} is resolved. + * + * @return {@link Algorithm#EVENDEN_SNYDER} or {@link Algorithm#PODER_ENGSAGER} + */ + public Algorithm getEffectiveAlgorithm() { + return useApprox() ? Algorithm.EVENDEN_SNYDER : Algorithm.PODER_ENGSAGER; + } + + /** + * {@code setup()} at {@code tmerc.cpp:519} forces the approximate series on a sphere; + * {@code getAlgoFromParams} tests {@code +approx} before it looks at {@code +algo}, so a + * definition carrying both gets Evenden/Snyder. + */ + private boolean useApprox() { + return spherical || exact == null || approx || algorithm == Algorithm.EVENDEN_SNYDER; + } + public Object clone() { + // MeridianArc is immutable, so the shallow copy from super.clone() is safe. The + // Poder/Engsager delegate is cloned because it is a mutable Projection, even though + // nothing here mutates it after initialize(). TransverseMercatorProjection p = (TransverseMercatorProjection) super.clone(); - if (en != null) - p.en = (double[]) en.clone(); + if (exact != null) { + p.exact = (ExtendedTransverseMercatorProjection) exact.clone(); + } return p; } @@ -92,12 +273,20 @@ public boolean isRectilinear() { public void initialize() { super.initialize(); if (spherical) { + // tmerc.cpp:526-528: esp = k0, ml0 = .5*esp. Note ml0 means something entirely + // different in the two branches. esp = scaleFactor; ml0 = .5 * esp; + meridian = null; + exact = null; } else { - en = ProjectionMath.enfn(es); - ml0 = ProjectionMath.mlfn(projectionLatitude, Math.sin(projectionLatitude), Math.cos(projectionLatitude), en); + meridian = MeridianArc.fromEs(es); + ml0 = meridian.mlfn(projectionLatitude, Math.sin(projectionLatitude), Math.cos(projectionLatitude)); esp = es / (1. - es); + // Both algorithms are set up whenever both are defined, exactly as upstream's AUTO + // case does (tmerc.cpp:539-547). It costs one coefficient build per CRS and makes + // setApprox/setAlgorithm order-independent with respect to initialize(). + exact = ExtendedTransverseMercatorProjection.forDelegation(this); } } @@ -132,78 +321,177 @@ public void setUTMZone(int zone) { public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate xy) { if (spherical) { - double cosphi = Math.cos(lpphi); - double b = cosphi * Math.sin(lplam); - - xy.x = ml0 * scaleFactor * Math.log((1. + b) / (1. - b)); - double ty = cosphi * Math.cos(lplam) / Math.sqrt(1. - b * b); - ty = ProjectionMath.acos(ty); - if (lpphi < 0.0) - ty = -ty; - xy.y = esp * (ty - projectionLatitude); - } else { - double al, als, n, t; - double sinphi = Math.sin(lpphi); - double cosphi = Math.cos(lpphi); - t = Math.abs(cosphi) > 1e-10 ? sinphi / cosphi : 0.0; - t *= t; - al = cosphi * lplam; - als = al * al; - al /= Math.sqrt(1. - es * sinphi * sinphi); - n = esp * cosphi * cosphi; - xy.x = scaleFactor * al * (FC1 + - FC3 * als * (1. - t + n + - FC5 * als * (5. + t * (t - 18.) + n * (14. - 58. * t) - + FC7 * als * (61. + t * (t * (179. - t) - 479.)) - ))); - xy.y = scaleFactor * (ProjectionMath.mlfn(lpphi, sinphi, cosphi, en) - ml0 + - sinphi * al * lplam * FC2 * (1. + - FC4 * als * (5. - t + n * (9. + 4. * n) + - FC6 * als * (61. + t * (t - 58.) + n * (270. - 330 * t) - + FC8 * als * (1385. + t * (t * (543. - t) - 3111.)) - )))); + return sphericalProject(lplam, lpphi, xy); } - return xy; + if (useApprox()) { + return approxProject(lplam, lpphi, xy); + } + return exact.project(lplam, lpphi, xy); } public ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { if (spherical) { - double h = Math.exp(x / scaleFactor); - double g = .5 * (h - 1. / h); - h = Math.cos(projectionLatitude + y / scaleFactor); - out.y = ProjectionMath.asin(Math.sqrt((1. - h * h) / (1. + g * g))); - if (y < 0) - out.y = -out.y; - out.x = Math.atan2(g, h); - } else { - double n, con, cosphi, d, ds, sinphi, t; + return sphericalProjectInverse(x, y, out); + } + if (useApprox()) { + return approxProjectInverse(x, y, out); + } + return exact.projectInverse(x, y, out); + } - out.y = ProjectionMath.inv_mlfn(ml0 + y / scaleFactor, es, en); - if (Math.abs(y) >= ProjectionMath.HALFPI) { - out.y = y < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; - out.x = 0.; + // ------------------------------------------------------------------ Evenden/Snyder, sphere + + /** + * {@code tmerc_spherical_fwd}, {@code tmerc.cpp:117-160}. + * + *

Three things here are not cosmetic: + *

    + *
  • {@code |b| = 1} is an error, not a clamp: the point is at infinity. + *
  • {@code cosphi == 1.0} exactly — the equator — is special-cased so that a longitude + * more than 90° from the central meridian still round-trips, mapping to + * {@code y = pi} rather than to {@code acos} of a value that has lost all its + * significance. That is what {@code builtins.gie:7202} ({@code accept 150 0}) tests. + *
  • Outside the equator, {@code |y| >= 1} within {@code EPS10} collapses to zero and + * anything further out is an error. Proj4J used {@code ProjectionMath.acos}, which + * clamps silently and can never report a domain failure. + *
+ */ + private ProjCoordinate sphericalProject(double lplam, double lpphi, ProjCoordinate xy) { + double cosphi = Math.cos(lpphi); + double b = cosphi * Math.sin(lplam); + if (Math.abs(Math.abs(b) - 1.) <= EPS10) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "the point (" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + + ") deg from the central meridian projects to infinity on a sphere"); + } + + // 9.8.1:tmerc.cpp:130 is xy.x = Q->ml0 * log((1+b)/(1-b)) with ml0 = .5*esp + // and esp = k0, i.e. 0.5*k0*log(...). proj4j multiplied by scaleFactor a + // second time, giving 0.5*k0*k0*log(...) -- wrong for every k_0 != 1, so + // spherical tmerc fwd was off by a factor of k_0 in easting. + xy.x = ml0 * Math.log((1. + b) / (1. - b)); + + double ty; + if (cosphi == 1.0) { + /* Helps to be able to roundtrip |longitudes| > 90 at lat=0 */ + ty = (lplam < -ProjectionMath.HALFPI || lplam > ProjectionMath.HALFPI) + ? Math.PI : 0.0; + } else { + ty = cosphi * Math.cos(lplam) / Math.sqrt(1. - b * b); + double m = Math.abs(ty); + if (m >= 1.) { + if ((m - 1.) > EPS10) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "the point (" + Math.toDegrees(lplam) + ", " + Math.toDegrees(lpphi) + + ") deg is outside the spherical transverse Mercator " + + "domain: cos(phi) cos(lam) / sqrt(1 - b^2) = " + ty); + } + ty = 0.; } else { - sinphi = Math.sin(out.y); - cosphi = Math.cos(out.y); - t = Math.abs(cosphi) > 1e-10 ? sinphi / cosphi : 0.; - n = esp * cosphi * cosphi; - d = x * Math.sqrt(con = 1. - es * sinphi * sinphi) / scaleFactor; - con *= t; - t *= t; - ds = d * d; - out.y -= (con * ds / (1. - es)) * FC2 * (1. - - ds * FC4 * (5. + t * (3. - 9. * n) + n * (1. - 4 * n) - - ds * FC6 * (61. + t * (90. - 252. * n + - 45. * t) + 46. * n - - ds * FC8 * (1385. + t * (3633. + t * (4095. + 1574. * t))) - ))); - out.x = d * (FC1 - - ds * FC3 * (1. + 2. * t + n - - ds * FC5 * (5. + t * (28. + 24. * t + 8. * n) + 6. * n - - ds * FC7 * (61. + t * (662. + t * (1320. + 720. * t))) - ))) / cosphi; + ty = Math.acos(ty); } } + + if (lpphi < 0.0) + ty = -ty; + xy.y = esp * (ty - projectionLatitude); + return xy; + } + + /** {@code tmerc_spherical_inv}, {@code tmerc.cpp:196-220}. */ + private ProjCoordinate sphericalProjectInverse(double x, double y, ProjCoordinate out) { + double h = Math.exp(x / esp); + if (h == 0.) + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "tmerc spherical inverse: easting underflows, outside the projection domain"); + double g = .5 * (h - 1. / h); + // D, as in equation 8-8 of USGS "Map Projections - A Working Manual" + // (9.8.1:tmerc.cpp:211-218). proj4j negated on the sign of the *northing* + // where PROJ takes copysign(lp.phi, D); the two differ for every lat_0 != 0. + final double D = projectionLatitude + y / esp; + h = Math.cos(D); + // Math.asin, not the deprecated ProjectionMath.asin: |h| <= 1 so the numerator is in + // [0, 1] and the denominator is >= 1, hence the radicand and its root are both in + // [0, 1] by construction. tmerc.cpp:214 likewise calls the bare libm asin, not aasin. + out.y = Math.asin(Math.sqrt((1. - h * h) / (1. + g * g))); + out.y = Math.copySign(out.y, D); + out.x = (g != 0.0 || h != 0.0) ? Math.atan2(g, h) : 0.; + return out; + } + + // -------------------------------------------------------------- Evenden/Snyder, ellipsoid + + /** {@code approx_e_fwd}, {@code tmerc.cpp:71-115}. */ + private ProjCoordinate approxProject(double lplam, double lpphi, ProjCoordinate xy) { + /* + * Fail if our longitude is more than 90 degrees from the central meridian since the + * results are essentially garbage (tmerc.cpp:79-88, http://trac.osgeo.org/proj/ticket/5). + * proj4j had no such test: the series simply diverged and returned a finite number. + */ + if (lplam < -ProjectionMath.HALFPI || lplam > ProjectionMath.HALFPI) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, this, + "longitude " + Math.toDegrees(lplam) + " deg from the central meridian is " + + "more than 90 deg away; the Evenden/Snyder series is garbage " + + "there. Use the default Poder/Engsager algorithm, which is valid " + + "to 150 deg."); + } + + double al, als, n, t; + double sinphi = Math.sin(lpphi); + double cosphi = Math.cos(lpphi); + t = Math.abs(cosphi) > 1e-10 ? sinphi / cosphi : 0.0; + t *= t; + al = cosphi * lplam; + als = al * al; + al /= Math.sqrt(1. - es * sinphi * sinphi); + n = esp * cosphi * cosphi; + xy.x = scaleFactor * al * (FC1 + + FC3 * als * (1. - t + n + + FC5 * als * (5. + t * (t - 18.) + n * (14. - 58. * t) + + FC7 * als * (61. + t * (t * (179. - t) - 479.)) + ))); + xy.y = scaleFactor * (meridian.mlfn(lpphi, sinphi, cosphi) - ml0 + + sinphi * al * lplam * FC2 * (1. + + FC4 * als * (5. - t + n * (9. + 4. * n) + + FC6 * als * (61. + t * (t - 58.) + n * (270. - 330 * t) + + FC8 * als * (1385. + t * (t * (543. - t) - 3111.)) + )))); + return xy; + } + + /** {@code approx_e_inv}, {@code tmerc.cpp:162-194}. */ + private ProjCoordinate approxProjectInverse(double x, double y, ProjCoordinate out) { + double n, con, cosphi, d, ds, sinphi, t; + + out.y = meridian.invMlfn(ml0 + y / scaleFactor); + // 9.8.1:tmerc.cpp:165 tests the *latitude just computed*, not the northing. + // Because mlfn(pi/2) = 1.568164141 < pi/2 for GRS80 there is always a band + // where the old |y| test is silent but the footpoint is already past the pole. + if (Math.abs(out.y) >= ProjectionMath.HALFPI) { + out.y = y < 0. ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + out.x = 0.; + } else { + sinphi = Math.sin(out.y); + cosphi = Math.cos(out.y); + t = Math.abs(cosphi) > 1e-10 ? sinphi / cosphi : 0.; + n = esp * cosphi * cosphi; + d = x * Math.sqrt(con = 1. - es * sinphi * sinphi) / scaleFactor; + con *= t; + t *= t; + ds = d * d; + out.y -= (con * ds / (1. - es)) * FC2 * (1. - + ds * FC4 * (5. + t * (3. - 9. * n) + n * (1. - 4 * n) - + ds * FC6 * (61. + t * (90. - 252. * n + + 45. * t) + 46. * n + // 1575, not 1574 -- 9.8.1:tmerc.cpp:185. + - ds * FC8 * (1385. + t * (3633. + t * (4095. + 1575. * t))) + ))); + out.x = d * (FC1 - + ds * FC3 * (1. + 2. * t + n - + ds * FC5 * (5. + t * (28. + 24. * t + 8. * n) + 6. * n + - ds * FC7 * (61. + t * (662. + t * (1320. + 720. * t))) + ))) / cosphi; + } return out; } @@ -211,6 +499,34 @@ public boolean hasInverse() { return true; } + /** + * Narrows {@link Projection#equals} by the algorithm selection: two otherwise identical + * {@code tmerc} definitions that differ by {@code +approx} project differently, so they must + * not compare equal or the transform cache will hand one out for the other. + */ + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (!super.equals(that)) { + return false; + } + TransverseMercatorProjection p = (TransverseMercatorProjection) that; + return approx == p.approx && getEffectiveAlgorithm() == p.getEffectiveAlgorithm(); + } + + @Override + public int hashCode() { + int h = super.hashCode(); + h = 31 * h + (approx ? 1 : 0); + // ordinal(), not hashCode(): Enum.hashCode is identity-based, and Projection.hashCode is + // documented to agree with equals rather than to be stable across JVMs, but there is no + // reason to be gratuitously unstable. + h = 31 * h + getEffectiveAlgorithm().ordinal(); + return h; + } + public String toString() { if (utmZone >= 0) return "Universal Tranverse Mercator"; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TranverseCentralCylindricalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/TranverseCentralCylindricalProjection.java index 69e3f4f..7d9d797 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/TranverseCentralCylindricalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/TranverseCentralCylindricalProjection.java @@ -25,6 +25,8 @@ public class TranverseCentralCylindricalProjection extends CylindricalProjection { + private static final long serialVersionUID = -1679524912168461722L; + public TranverseCentralCylindricalProjection() { minLongitude = ProjectionMath.degToRad(-60); maxLongitude = ProjectionMath.degToRad(60); diff --git a/core/src/main/java/org/locationtech/proj4j/proj/TwoPointEquidistantProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/TwoPointEquidistantProjection.java new file mode 100644 index 0000000..378cad5 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/TwoPointEquidistantProjection.java @@ -0,0 +1,262 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Two Point Equidistant, {@code +proj=tpeqd} — a port of + * {@code 9.8.1:src/projections/tpeqd.cpp}. Spherical only; both directions closed form. + * + *

Distances from two nominated control points are both true. The map's own frame is the great + * circle through the two points, so the setup rotates the sphere onto that frame and both + * kernels work in it; {@code Q->lamc}, {@code Q->lp}, {@code Q->ca} and {@code Q->sa} are that + * rotation. + * + *

Two setup rejections, and they are not the same one

+ * + *
    + *
  • The two points must be distinct ({@code tpeqd.cpp:80-84}). Since {@code pj_param} + * answers 0 for every absent key, a bare {@code +proj=tpeqd} is this error.
  • + *
  • {@code z02 == 0} ({@code tpeqd.cpp:104-108}), whose own comment says it "actually + * happens when both lat_1 = lat_2 and |lat_1| = 90" — the two points are distinct in + * longitude but coincide on the sphere. {@code builtins.gie:7589} asserts it with + * {@code +lat_1=90 +lat_2=90 +lon_1=0 +lon_2=1}.
  • + *
+ * + *

{@code z02} is squared in place upstream, and {@code dlam2} is halved in place

+ * + *

Two of the classic in-place reassignments. {@code Q->z02} is the central angle while + * {@code hz0}, {@code A12} and {@code r2z0} are derived from it and is then replaced by + * its own square, which is the form both kernels read. {@code Q->dlam2} is the full longitude + * difference while {@code z02} and {@code A12} are computed and is halved only afterwards, but + * {@code Q->lp} is computed before the halving and {@code Q->lamc} after it. Get + * that order wrong and the forward is still plausible. Locals here are named distinctly for the + * two values so the ordering is visible rather than implied. + * + *

{@code asqrt}, not {@code sqrtChecked}

+ * + *

The forward's radicand {@code 4*z02*z2 - t*t} is a cancellation quantity that goes slightly + * negative at the map's edge, and upstream's {@code asqrt} clamps it to zero rather than + * raising ({@code 9.8.1:src/aasincos.cpp:33}). So this is + * {@code Math.sqrt(Math.max(0.0, ...))}, written at the call site exactly as + * {@link ProjectionMath#sqrtChecked} advises, and deliberately not the checked form: raising here + * would fail rows upstream passes. + * + *

{@code +lon_0} is overwritten; {@code +lon_1}/{@code +lon_2} are not yet dispatched

+ * + *

{@code P->lam0 = adjlon(0.5 * (lam_1 + lam_2))} discards any {@code +lon_0}. And as with + * {@link ObliqueCylindricalEqualAreaProjection}, {@code Proj4Parser} routes {@code +lon_1} and + * {@code +lon_2} to {@link ObliqueMercatorProjection} alone, so the setters below are unreachable + * from a proj-string today and both longitudes stay 0. Both corpus blocks that produce + * coordinates use {@code +lat_1}/{@code +lat_2} only, so they are unaffected. + * + * @see 9.8.1 + * tpeqd.cpp + */ +public class TwoPointEquidistantProjection extends Projection { + + private static final long serialVersionUID = 476850482880862843L; + + private double cp1; + private double sp1; + private double cp2; + private double sp2; + private double ccs; + private double cs; + private double sc; + private double r2z0; + /** {@code Q->z02}, which by the end of setup holds the square of the central angle. */ + private double z02sq; + /** {@code Q->dlam2}, which by the end of setup holds half the longitude difference. */ + private double halfDlam2; + private double hz0; + private double thz0; + private double rhshz0; + private double ca; + private double sa; + private double lp; + private double lamc; + + /** {@code +lon_1}, in radians. Upstream's absent value is 0. */ + private double lon1 = 0.0; + /** {@code +lon_2}, in radians. Upstream's absent value is 0. */ + private double lon2 = 0.0; + + /** + * {@code +lon_1}, the longitude of the first control point. + * + * @param lon1 the longitude, in radians + */ + public void setLon1(double lon1) { + this.lon1 = lon1; + } + + /** + * The {@code +lon_1} in force. + * + * @return the longitude, in radians + */ + public double getLon1() { + return lon1; + } + + /** + * {@code +lon_2}, the longitude of the second control point. + * + * @param lon2 the longitude, in radians + */ + public void setLon2(double lon2) { + this.lon2 = lon2; + } + + /** + * The {@code +lon_2} in force. + * + * @return the longitude, in radians + */ + public double getLon2() { + return lon2; + } + + /** + * Port of {@code PJ_PROJECTION(tpeqd)} ({@code tpeqd.cpp:65-138}). + * + * @throws InvalidValueException if the two control points are equal, or if they coincide on + * the sphere ({@code z02 == 0}); upstream raises + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} for both + */ + @Override + public void initialize() { + super.initialize(); + final double phi1 = projectionLatitude1; + final double phi2 = projectionLatitude2; + final double lam1 = lon1; + final double lam2 = lon2; + + if (phi1 == phi2 && lam1 == lam2) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=tpeqd needs two distinct control points, but +lat_1/+lon_1 and " + + "+lat_2/+lon_2 are both (" + phi1 + ", " + lam1 + ") rad " + + "(tpeqd.cpp:80-84). Note pj_param answers 0 for every absent key, " + + "so a bare +proj=tpeqd is this same error."); + } + + projectionLongitude = ProjectionMath.adjlon(0.5 * (lam1 + lam2)); + final double dlam2 = ProjectionMath.adjlon(lam2 - lam1); + + cp1 = FastStrictTrig.cos(phi1); + cp2 = FastStrictTrig.cos(phi2); + sp1 = FastStrictTrig.sin(phi1); + sp2 = FastStrictTrig.sin(phi2); + cs = cp1 * sp2; + sc = sp1 * cp2; + final double sinDlam2 = FastStrictTrig.sin(dlam2); + final double cosDlam2 = FastStrictTrig.cos(dlam2); + ccs = cp1 * cp2 * sinDlam2; + + // Vincenty on the sphere, which is stable where the naive acos is not. + final double csMinusScCosDlam = cs - sc * cosDlam2; + final double cp2SinDlam2 = cp2 * sinDlam2; + final double z02 = StrictMath.atan2( + Math.sqrt(cp2SinDlam2 * cp2SinDlam2 + csMinusScCosDlam * csMinusScCosDlam), + sp1 * sp2 + cp1 * cp2 * cosDlam2); + if (z02 == 0.0) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=tpeqd: the two control points coincide on the sphere, so the central " + + "angle between them is zero. Upstream's own note is that this " + + "happens when lat_1 == lat_2 and |lat_1| == 90 (tpeqd.cpp:104-108)."); + } + hz0 = .5 * z02; + final double a12 = StrictMath.atan2(cp2SinDlam2, csMinusScCosDlam); + final double pp = ProjectionMath.asinChecked(cp1 * FastStrictTrig.sin(a12)); + ca = FastStrictTrig.cos(pp); + sa = FastStrictTrig.sin(pp); + // tpeqd.cpp:130 -- computed with the FULL dlam2 still in hand, via hz0. + lp = ProjectionMath.adjlon( + StrictMath.atan2(cp1 * FastStrictTrig.cos(a12), sp1) - hz0); + // tpeqd.cpp:131-132 -- and lamc with the HALVED one. + halfDlam2 = dlam2 * .5; + lamc = ProjectionMath.HALFPI + - StrictMath.atan2(FastStrictTrig.sin(a12) * sp1, FastStrictTrig.cos(a12)) + - halfDlam2; + thz0 = FastStrictTrig.tan(hz0); + rhshz0 = .5 / FastStrictTrig.sin(hz0); + r2z0 = 0.5 / z02; + z02sq = z02 * z02; + es = 0.; + } + + /** {@code tpeqd_s_forward}, {@code tpeqd.cpp:18-40}. */ + @Override + protected ProjCoordinate project(double lam, double phi, ProjCoordinate xy) { + final double sp = FastStrictTrig.sin(phi); + final double cp = FastStrictTrig.cos(phi); + final double dl1 = lam + halfDlam2; + final double dl2 = lam - halfDlam2; + double z1 = ProjectionMath.acosChecked(sp1 * sp + cp1 * cp * FastStrictTrig.cos(dl1)); + double z2 = ProjectionMath.acosChecked(sp2 * sp + cp2 * cp * FastStrictTrig.cos(dl2)); + z1 *= z1; + z2 *= z2; + + double t = z1 - z2; + xy.x = r2z0 * t; + t = z02sq - t; + // asqrt: clamp, do not raise. aasincos.cpp:33. + xy.y = r2z0 * Math.sqrt(Math.max(0.0, 4. * z02sq * z2 - t * t)); + if ((ccs * sp - cp * (cs * FastStrictTrig.sin(dl1) - sc * FastStrictTrig.sin(dl2))) < 0.) { + xy.y = -xy.y; + } + return xy; + } + + /** {@code tpeqd_s_inverse}, {@code tpeqd.cpp:42-63}. */ + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate out) { + final double cz1 = FastStrictTrig.cos(StrictMath.hypot(y, x + hz0)); + final double cz2 = FastStrictTrig.cos(StrictMath.hypot(y, x - hz0)); + final double s0 = cz1 + cz2; + final double d = cz1 - cz2; + double lam = -StrictMath.atan2(d, s0 * thz0); + double phi = ProjectionMath.acosChecked(StrictMath.hypot(thz0 * s0, d) * rhshz0); + if (y < 0.) { + phi = -phi; + } + // lam--phi is now in the frame whose equator is the P1--P2 great circle. + final double sp = FastStrictTrig.sin(phi); + final double cp = FastStrictTrig.cos(phi); + lam -= lp; + final double s = FastStrictTrig.cos(lam); + out.y = ProjectionMath.asinChecked(sa * sp + ca * cp * s); + out.x = StrictMath.atan2(cp * FastStrictTrig.sin(lam), sa * cp * s - ca * sp) + lamc; + return out; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String toString() { + return "Two Point Equidistant"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/UniversalPolarStereographicProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/UniversalPolarStereographicProjection.java new file mode 100644 index 0000000..cbfd39b --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/UniversalPolarStereographicProjection.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Universal Polar Stereographic, {@code +proj=ups} — + * {@code PJ_PROJECTION(ups)}, {@code 9.8.1:src/projections/stere.cpp:308-330}. + * + *

A fixed parameterisation of polar {@code stere}, and nothing else: + * + *

+ *   phi0 = +south ? -pi/2 : +pi/2
+ *   k0   = 0.994
+ *   x_0  = y_0 = 2 000 000
+ *   lam0 = 0
+ *   phits (lat_ts) = pi/2
+ * 
+ * + *

followed by the shared {@code stere_setup}. {@link StereographicAzimuthalProjection#setupUPS} + * already assigned exactly those five values before this class existed; all this adds is the + * registered {@code +proj=} name, {@code +south} dispatch, and upstream's one rejection. + * + *

The rejection is the ninth assertion

+ * + *

{@code stere.cpp:317-322} refuses a sphere outright: + * + *

+ *   if (P->es == 0.0) {
+ *       proj_log_error(P, _("Invalid value for es: only ellipsoidal formulation supported"));
+ *       return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE);
+ *   }
+ * 
+ * + *

and {@code builtins.gie:7678} asserts it: + * + *

+ *   operation +proj=ups   +a=6400000
+ *   # ups not possible on sphere
+ *   expect failure errno invalid_op_illegal_arg_value
+ * 
+ * + *

Note {@code +a=6400000} alone declares a sphere in 9.8.1 — {@code ellps_shape}'s + * "not giving a shape parameter means selecting a sphere" — which is why that row fails rather + * than projecting on a default GRS80. + * + *

The ellipsoidal branch is the only one reachable, so the conformal latitude is + * unavoidable. It arrives through {@code util/ConformalLat}, which the parent class already uses: + * {@code tsfn} in the forward and {@code phi2} in the inverse, never the deprecated + * {@code ProjectionMath} spellings. The parent's class comment records the one deliberate + * numerical divergence that brings — Karney's fixed-trip {@code phi2} rather than upstream's + * eight-trip {@code pow} loop, worth about 4 µm, 25 000× inside the + * corpus's 0.1 mm bar. + * + * @since 1.5.0 + */ +public class UniversalPolarStereographicProjection extends StereographicAzimuthalProjection { + + private static final long serialVersionUID = 7186760270389707980L; + + /** {@code stere.cpp:324} — UPS is always at scale 0.994 on the pole. */ + public static final double UPS_SCALE_FACTOR = 0.994; + + /** {@code stere.cpp:325-326} — 2 000 000 m on both axes, so northings stay positive. */ + public static final double UPS_FALSE_ORIGIN = 2000000.0; + + private boolean south; + + /** + * Whether the constructor has finished. + * + *

Why this is needed. {@link AzimuthalProjection#AzimuthalProjection} calls + * {@code initialize()} from its own constructor ({@code AzimuthalProjection.java:44}, reached + * through {@link StereographicAzimuthalProjection}'s two constructors), so the override below + * runs before any caller has had a chance to call {@link #setEllipsoid}. At that point + * the ellipsoid is still {@code Projection}'s default {@code Ellipsoid.SPHERE}, whose + * {@code es} is zero — so an unguarded rejection makes {@code new + * UniversalPolarStereographicProjection()} throw, which in turn makes + * {@code Registry.getProjection("ups")} throw and the name unusable. + * + *

A {@code boolean} field defaults to {@code false} and its initialiser runs only after + * {@code super()} returns, so this is {@code false} for exactly the duration of the + * superclass's eager {@code initialize()} and {@code true} for every later call. Eager + * initialisation from a constructor is a pre-existing wart in this hierarchy, not something + * introduced here; this is the narrowest way to work around it without editing a file this + * change does not own. + */ + private boolean constructed; + + public UniversalPolarStereographicProjection() { + // super() has already run the eager initialize(); from here on the check is live. + constructed = true; + } + + /** + * {@code +south} ({@code pj_param(..., "bsouth")}), which selects the south polar aspect. + *

+ * Overridden because {@link Projection#setSouthernHemisphere(boolean)} refuses on the base + * class, and neither {@code stere} nor {@link AzimuthalProjection} reads the flag. Without + * this override {@code +proj=ups +south} would raise + * {@link org.locationtech.proj4j.UnsupportedParameterException} — the honest answer for + * {@code stere}, and the wrong one here. + */ + @Override + public void setSouthernHemisphere(boolean isSouth) { + this.south = isSouth; + } + + @Override + public boolean getSouthernHemisphere() { + return south; + } + + /** + * {@code PJ_PROJECTION(ups)}: reject a sphere, fix the five parameters, then + * {@code stere_setup}. + * + * @throws InvalidValueException with {@link ErrorCause#INVALID_PARAM_VALUE} for + * {@code es == 0}, which is {@code builtins.gie:7678}'s + * {@code expect failure errno invalid_op_illegal_arg_value} + */ + @Override + public void initialize() { + // Ordered as upstream: phi0 comes from +south first, then es is checked. The order does + // not affect the outcome but keeps the two files line-comparable. + projectionLatitude = south ? -ProjectionMath.HALFPI : ProjectionMath.HALFPI; + if (constructed && es == 0.0) { + throw new InvalidValueException(ErrorCause.INVALID_PARAM_VALUE, + "+proj=ups: Invalid value for es: only ellipsoidal formulation supported. " + + "UPS is defined on an ellipsoid; note that +a= or +R= without a " + + "shape parameter declares a sphere (ell_set.cpp's \"not giving a " + + "shape parameter means selecting a sphere\"), so +proj=ups " + + "+a=6400000 is rejected. Use +proj=stere for a sphere."); + } + scaleFactor = UPS_SCALE_FACTOR; + falseEasting = UPS_FALSE_ORIGIN; + falseNorthing = UPS_FALSE_ORIGIN; + projectionLongitude = 0.0; + trueScaleLatitude = ProjectionMath.HALFPI; + super.initialize(); + } + + @Override + public String toString() { + return "Universal Polar Stereographic"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Urmaev5Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Urmaev5Projection.java new file mode 100644 index 0000000..f5aa35f --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Urmaev5Projection.java @@ -0,0 +1,163 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; + +/** + * Urmaev V ({@code +proj=urm5}), a port of {@code 9.8.1:src/projections/urm5.cpp}. + * Forward only. + * + *

+ *   setup:   m   = cos(alpha) / sqrt(1 - (n sin(alpha))^2)
+ *            rmn = 1 / (m n)
+ *            q3  = q / 3
+ *   forward: t = theta = aasin(n sin(phi))
+ *            x = m lam cos(theta)
+ *            y = theta (1 + theta^2 q3) rmn
+ * 
+ * + *

Three parameters, two of them undocumented

+ * + *

The doc string is {@code "\n\tPCyl, Sph, no inv\n\tn= q= alpha="}. + * + *

    + *
  • {@code +n} is required and must lie in {@code (0, 1]} + * ({@code urm5.cpp:37-47}, two distinct errors: missing, then out of range). + * {@code Proj4Keyword} defines {@code n} and {@code Proj4Parser} dispatches it to + * {@link #setN(double)} on this concrete class. + *
  • {@code +q} is optional, defaulting to 0, and is dispatched to + * {@link #setQ(double)}. With {@code q = 0} the northing is linear in {@code theta}. + *
  • {@code +alpha} is optional, defaulting to 0, and is already dispatched + * by the parser into {@link Projection#alpha}. Note that {@code Projection} initialises + * {@code alpha} to {@code Double.NaN} rather than 0, so this class must treat NaN as + * "absent" and substitute zero — otherwise {@code cos(NaN)} poisons {@code m} and every + * output becomes NaN, which the forward contract then reports as a numerical failure. The + * corpus exercises both: {@code +n=0.5} with no {@code alpha}, and + * {@code +n=1 +alpha=90}. + *
+ * + *

{@code +n=1 +alpha=90} is the guarded case, and the guard is on the denominator

+ * + *

{@code urm5.cpp:51-58} computes {@code t = n sin(alpha)} and rejects + * {@code sqrt(1 - t*t) == 0} — an exact zero comparison, not a tolerance. At {@code n = 1}, + * {@code alpha = 90} degrees, {@code sin(alpha)} is exactly 1 in double precision only if the + * radian conversion of 90 degrees lands exactly on {@code pi/2}, which it does not: + * {@code sin(pi/2 as a double)} is {@code 1.0} exactly, so {@code t = 1.0} and the + * denominator is exactly zero. So the corpus's second operation sits precisely on + * this rejection — which is why that block's rows are {@code expect failure} at setup rather + * than coordinates. + * + *

Reported as {@link InvalidValueException}, matching upstream's + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}, which is a setup error and not a coordinate + * error. + */ +public class Urmaev5Projection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = 1417823052394470576L; + + private static final double HALF_PI = Math.PI / 2.0; + private static final double ONE_TOL = 1.00000000000001; + + private double n = Double.NaN; + private double q = 0.0; + + private double m; + private double rmn; + private double q3; + + /** + * Sets {@code +n}, required, in {@code (0, 1]}. Present because {@code parser/**} does not + * dispatch {@code n}. + */ + public void setN(double n) { + this.n = n; + } + + /** Sets {@code +q}, optional, default 0. Not dispatched by {@code parser/**} either. */ + public void setQ(double q) { + this.q = q; + } + + public double getN() { + return n; + } + + public double getQ() { + return q; + } + + /** {@code PJ_PROJECTION(urm5)}, {@code urm5.cpp:29-67}. */ + @Override + public void initialize() { + super.initialize(); + if (Double.isNaN(n)) { + throw new InvalidValueException( + "Missing parameter n: +proj=urm5 requires +n in (0, 1]"); + } + if (n <= 0.0 || n > 1.0) { + throw new InvalidValueException( + "Invalid value for n: it should be in ]0,1] range, but was " + n); + } + q3 = q / 3.0; + // Projection.alpha defaults to NaN, not 0; urm5's +alpha defaults to 0. + final double alphaRad = Double.isNaN(alpha) ? 0.0 : alpha; + final double t = n * StrictMath.sin(alphaRad); + final double denom = Math.sqrt(1.0 - t * t); + if (denom == 0.0) { + throw new InvalidValueException( + "Invalid value for n / alpha: n * sin(|alpha|) should be < 1, but n = " + + n + " and alpha = " + Math.toDegrees(alphaRad) + + " deg give n * sin(alpha) = " + t); + } + m = StrictMath.cos(alphaRad) / denom; + rmn = 1.0 / (m * n); + es = 0.0; + } + + /** {@code urm5_s_forward}, {@code urm5.cpp:17-27}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + final double theta = aasin(n * StrictMath.sin(phi)); + dst.x = m * lam * StrictMath.cos(theta); + dst.y = theta * (1.0 + theta * theta * q3) * rmn; + return dst; + } + + /** {@code aasin}, {@code 9.8.1:src/aasincos.cpp:16-25}. */ + private double aasin(double v) { + final double av = Math.abs(v); + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException(this, + "asin argument " + v + " is outside [-1, 1]"); + } + return v < 0 ? -HALF_PI : HALF_PI; + } + return StrictMath.asin(v); + } + + /** {@code false}: {@code urm5.cpp:63} assigns {@code P->inv = nullptr} explicitly. */ + public boolean hasInverse() { + return false; + } + + public String toString() { + return "Urmaev V"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/UrmaevFlatPolarSinusoidalProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/UrmaevFlatPolarSinusoidalProjection.java index db43ba5..4baf277 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/UrmaevFlatPolarSinusoidalProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/UrmaevFlatPolarSinusoidalProjection.java @@ -23,10 +23,13 @@ import org.locationtech.proj4j.ProjCoordinate; import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; public class UrmaevFlatPolarSinusoidalProjection extends Projection { + private static final long serialVersionUID = -2557543472419612430L; + private final static double C_x = 0.8773826753; private final static double Cy = 1.139753528477; @@ -36,17 +39,29 @@ public class UrmaevFlatPolarSinusoidalProjection extends Projection { public UrmaevFlatPolarSinusoidalProjection() { } + /** + * Port of {@code urmfps_s_forward} ({@code 9.8.1:src/projections/urmfps.cpp:19-27}). + *

+ * Upstream reassigns {@code lp.phi} in place and then uses it twice; the previous + * transcription computed the reassignment into {@code out.y}, immediately overwrote it, and fed + * the original latitude to both {@code cos} and the {@code C_y} product. Since + * {@code C_y = Cy / n}, that made the northing a factor of {@code 1/n} too large: at + * {@code +proj=wag1 +a=6400000} and {@code (2, 1)} it returned {@code y = 147,006.878} against + * PROJ's {@code 127,310.075} — 19.7 km — and the easting 7.46 m off through the {@code cos}. + * The inverse never had the defect, so forward and inverse were not mutual inverses either. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - out.y = ProjectionMath.asin(n * Math.sin(lpphi)); - out.x = C_x * lplam * Math.cos(lpphi); - out.y = C_y * lpphi; + double phi = ProjectionMath.asinChecked(n * FastStrictTrig.sin(lpphi)); + out.x = C_x * lplam * FastStrictTrig.cos(phi); + out.y = C_y * phi; return out; } + /** Port of {@code urmfps_s_inverse} ({@code 9.8.1:src/projections/urmfps.cpp:29-36}). */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { xyy /= C_y; - out.y = ProjectionMath.asin(Math.sin(xyy) / n); - out.x = xyx / (C_x * Math.cos(xyy)); + out.y = ProjectionMath.asinChecked(FastStrictTrig.sin(xyy) / n); + out.x = xyx / (C_x * FastStrictTrig.cos(xyy)); return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten2FamilyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten2FamilyProjection.java new file mode 100644 index 0000000..70541e4 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten2FamilyProjection.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import java.util.Objects; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * van der Grinten II and III ({@code +proj=vandg2}, {@code +proj=vandg3}), a port of + * {@code 9.8.1:src/projections/vandg2.cpp}. Forward only. + * + *

{@code vandg4} is not here: it has its own 56-line file and a completely + * different construction. This file covers II and III only. + * + *

Both share the setup {@code bt = |2 phi / pi|}, {@code ct = sqrt(1 - bt^2)} clamped at + * zero, and both special-case the central meridian; they then diverge: + * + *

+ *   at = |pi/lam - lam/pi| / 2
+ *   III:  x1 = bt / (1 + ct)
+ *         x  = pi (sqrt(at^2 + 1 - x1^2) - at)
+ *         y  = pi x1
+ *   II:   x1 = (ct sqrt(1 + at^2) - at ct^2) / (1 + at^2 bt^2)
+ *         x  = pi x1
+ *         y  = pi sqrt(1 - x1 (x1 + 2 at) + TOL)
+ * 
+ * + *

with the signs of {@code lam} and {@code phi} reapplied afterwards. + * + *

Three things to transcribe literally

+ * + *

The {@code + TOL} is inside the radicand ({@code vandg2.cpp:44}), with + * {@code TOL = 1e-10}, exactly as in {@code bacon.cpp}: it guards a quantity that is + * analytically zero at the map boundary against rounding to a small negative. Moving it + * outside, or dropping it, changes the answer at every point and not only at the edge. + * + *

The central-meridian branch has no sign reapplication. When + * {@code |lam| < TOL} the code sets {@code y = pi (phi < 0 ? -bt : bt) / (1 + ct)} and + * returns without entering the {@code if (lp.lam < 0)} / {@code if (lp.phi < 0)} block + * at {@code :46-49} — because it has already applied the latitude's sign itself. Hoisting + * those two sign flips out of the {@code else} would double-negate the northing there. + * + *

{@code vandg2} does not zero {@code es}; {@code vandg3} does. + * {@code vandg2.cpp:55-66} omits {@code P->es = 0.} where {@code :68-80} includes it. Since + * neither forward reads {@code es} the maps are identical either way, so this is latent + * rather than live — but it means {@code +proj=vandg2 +ellps=WGS84} keeps a non-zero + * eccentricity on the {@code PJ} and would report itself as ellipsoidal to anything that + * asked. Reproduced, with {@code es} left alone for II and cleared for III, so that + * {@link Projection#spherical} tells the same story upstream does. + */ +abstract class VanDerGrinten2FamilyProjection extends Projection { + + private static final long serialVersionUID = -459213700553365664L; + + private static final double TOL = 1e-10; + + /** {@code M_TWO_D_PI}: {@code 2/pi}. */ + private static final double TWO_D_PI = 2.0 / Math.PI; + + private final boolean vdg3; + + protected VanDerGrinten2FamilyProjection(boolean vdg3) { + this.vdg3 = vdg3; + if (vdg3) { + // vandg2.cpp:76. vandg2's constructor deliberately omits this; see the class doc. + es = 0.0; + } + initialize(); + } + + /** {@code vandg2_s_forward}, {@code vandg2.cpp:20-53}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + final double bt = Math.abs(TWO_D_PI * phi); + double ct = 1.0 - bt * bt; + if (ct < 0.0) { + ct = 0.0; + } else { + ct = Math.sqrt(ct); + } + + if (Math.abs(lam) < TOL) { + // vandg2.cpp:31-33. Applies phi's sign here and returns; no outer sign block. + dst.x = 0.0; + dst.y = Math.PI * (phi < 0.0 ? -bt : bt) / (1.0 + ct); + return dst; + } + + final double at = 0.5 * Math.abs(Math.PI / lam - lam / Math.PI); + double x1; + if (vdg3) { + x1 = bt / (1.0 + ct); + dst.x = Math.PI * (Math.sqrt(at * at + 1.0 - x1 * x1) - at); + dst.y = Math.PI * x1; + } else { + x1 = (ct * Math.sqrt(1.0 + at * at) - at * ct * ct) + / (1.0 + at * at * bt * bt); + dst.x = Math.PI * x1; + dst.y = Math.PI * Math.sqrt(1.0 - x1 * (x1 + 2.0 * at) + TOL); + } + if (lam < 0.0) { + dst.x = -dst.x; + } + if (phi < 0.0) { + dst.y = -dst.y; + } + return dst; + } + + /** {@code false}: {@code P->inv} is never assigned, and the doc string says {@code no inv}. */ + public boolean hasInverse() { + return false; + } + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that != null && getClass() == that.getClass()) { + return vdg3 == ((VanDerGrinten2FamilyProjection) that).vdg3 && super.equals(that); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(vdg3, super.hashCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten2Projection.java new file mode 100644 index 0000000..9474177 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten2Projection.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * van der Grinten II ({@code +proj=vandg2}), + * {@code 9.8.1:src/projections/vandg2.cpp:55-66}. + * + * @see VanDerGrinten2FamilyProjection + */ +public class VanDerGrinten2Projection extends VanDerGrinten2FamilyProjection { + + private static final long serialVersionUID = 812628402180670493L; + + public VanDerGrinten2Projection() { + super(false); + } + + public String toString() { + return "van der Grinten II"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten3Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten3Projection.java new file mode 100644 index 0000000..9e61246 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten3Projection.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * van der Grinten III ({@code +proj=vandg3}), + * {@code 9.8.1:src/projections/vandg2.cpp:68-80}. Straight parallels, unlike II. + * + * @see VanDerGrinten2FamilyProjection + */ +public class VanDerGrinten3Projection extends VanDerGrinten2FamilyProjection { + + private static final long serialVersionUID = 7205426496546974661L; + + public VanDerGrinten3Projection() { + super(true); + } + + public String toString() { + return "van der Grinten III"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten4Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten4Projection.java new file mode 100644 index 0000000..3bb31cb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrinten4Projection.java @@ -0,0 +1,140 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * van der Grinten IV ({@code +proj=vandg4}), a port of + * {@code 9.8.1:src/projections/vandg4.cpp}. Forward only. + * + *

Its own file, not part of {@code vandg2.cpp}. {@code vandg2.cpp} covers II and + * III; IV has a 56-line file of its own and an unrelated construction — a quartic in + * {@code bt} for the parallel curvature and a hyperbolic-looking {@code dt = d + 1/d} for the + * meridians, resolved through a quadratic whose discriminant is the long {@code ft} + * expression. + * + *

+ *   bt  = |2 phi / pi|
+ *   ct  = (bt (8 - bt (2 + bt^2)) - 5) / (2 bt^2 (bt - 1))
+ *   dt  = 2 lam / pi ;  dt = dt + 1/dt ;  dt = sqrt(dt^2 - 4) ;  negated inside |lam| < pi/2
+ *   x1  = (bt + ct)^2
+ *   ft  = x1 (bt^2 + ct^2 dt^2 - 1)
+ *         + (1 - bt^2) (bt^2 ((bt + 3 ct)^2 + 4 ct^2) + ct^2 (12 bt ct + 4 ct^4/ct^2))
+ *   x1  = (dt (x1 + ct^2 - 1) + 2 sqrt(ft)) / (4 x1 + dt^2)
+ *   x   = (pi/2) x1
+ *   y   = (pi/2) sqrt(1 + dt |x1| - x1^2)
+ * 
+ * + *

Three guarded special cases, in upstream's order

+ * + *

The general formula divides by {@code bt^2 (bt - 1)} and by {@code dt}, so it is + * singular on the equator, on the central meridian and at the poles. Upstream handles them + * as a three-way cascade at {@code vandg4.cpp:17-23}, and the order matters: the + * equator test comes first, so the origin {@code (0, 0)} takes the equator branch and yields + * {@code (lam, 0) = (0, 0)} rather than the meridian branch's {@code (0, phi)} — the same + * answer here, but not for a point on the equator away from the central meridian, where the + * two branches differ ({@code x = lam} versus {@code x = 0}). + * + *

    + *
  • {@code |phi| < 1e-10} → {@code (lam, 0)} — the equator maps to a straight line + * at true scale. + *
  • {@code |lam| < 1e-10} or {@code | |phi| - pi/2 | < 1e-10} → {@code (0, phi)} + * — the central meridian and both poles. + *
  • otherwise the general form. + *
+ * + *

{@code dt}'s sign flip is inside the strict inequality + * ({@code vandg4.cpp:31-32}): {@code (|lam| - pi/2) < 0} negates {@code dt}. At exactly + * {@code |lam| = pi/2} it is not negated. Since {@code dt} then enters {@code ft} squared but + * {@code x1} linearly, this is a real discontinuity in the formula's sign convention and not + * a tolerance question. + * + *

{@code y} uses {@code |x1|}, not {@code x1} ({@code vandg4.cpp:42}). The sign of + * {@code x} is reapplied from {@code lam} afterwards, so taking the magnitude here is what + * keeps the northing symmetric about the central meridian. + */ +public class VanDerGrinten4Projection extends Projection { + + private static final long serialVersionUID = 4596603329576866630L; + + private static final double TOL = 1e-10; + + /** {@code M_TWO_D_PI}: {@code 2/pi}. */ + private static final double TWO_D_PI = 2.0 / Math.PI; + + private static final double HALF_PI = Math.PI / 2.0; + + public VanDerGrinten4Projection() { + es = 0.0; + initialize(); + } + + /** {@code vandg4_s_forward}, {@code vandg4.cpp:12-49}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + if (Math.abs(phi) < TOL) { + dst.x = lam; + dst.y = 0.0; + return dst; + } + if (Math.abs(lam) < TOL || Math.abs(Math.abs(phi) - HALF_PI) < TOL) { + dst.x = 0.0; + dst.y = phi; + return dst; + } + + final double bt = Math.abs(TWO_D_PI * phi); + final double bt2 = bt * bt; + final double ct = 0.5 * (bt * (8.0 - bt * (2.0 + bt2)) - 5.0) / (bt2 * (bt - 1.0)); + final double ct2 = ct * ct; + + double dt = TWO_D_PI * lam; + dt = dt + 1.0 / dt; + dt = Math.sqrt(dt * dt - 4.0); + if ((Math.abs(lam) - HALF_PI) < 0.0) { + dt = -dt; + } + final double dt2 = dt * dt; + + double x1 = bt + ct; + x1 *= x1; + final double t = bt + 3.0 * ct; + final double ft = x1 * (bt2 + ct2 * dt2 - 1.0) + + (1.0 - bt2) * (bt2 * (t * t + 4.0 * ct2) + + ct2 * (12.0 * bt * ct + 4.0 * ct2)); + x1 = (dt * (x1 + ct2 - 1.0) + 2.0 * Math.sqrt(ft)) / (4.0 * x1 + dt2); + + dst.x = HALF_PI * x1; + dst.y = HALF_PI * Math.sqrt(1.0 + dt * Math.abs(x1) - x1 * x1); + if (lam < 0.0) { + dst.x = -dst.x; + } + if (phi < 0.0) { + dst.y = -dst.y; + } + return dst; + } + + /** {@code false}: {@code P->inv} is never assigned ({@code vandg4.cpp:51-56}). */ + public boolean hasInverse() { + return false; + } + + public String toString() { + return "van der Grinten IV"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrintenProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrintenProjection.java index cd68037..109da5e 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrintenProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/VanDerGrintenProjection.java @@ -25,6 +25,8 @@ public class VanDerGrintenProjection extends Projection { + private static final long serialVersionUID = 7714215776932915539L; + private final static double TOL = 1.e-10; private final static double THIRD = .33333333333333333333; private final static double TWO_THRD = .66666666666666666666; @@ -39,6 +41,18 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { p2 = Math.abs(lpphi / ProjectionMath.HALFPI); if ((p2 - TOL) > 1.) throw new ProjectionException("F"); + /* + * vandg.cpp:25-27. This operator's forward reads P->over ITSELF, which is unusual - + * for every other projection +over is purely a fwd_prepare/inv_finalize concern. Past + * the antimeridian the (29-3) auxiliary A changes sign, because the map continues + * outward instead of folding back, and vandg.cpp's file header records the whole + * +over support as a separate 2011-2014 contribution. + * + * Computed before the p2 clamp below, exactly as upstream orders it, and read from + * isOver() rather than a field of this class so that +proj=vandg +over and + * Projection.setOver agree by construction. + */ + final int sign = (isOver() && Math.abs(lplam) > Math.PI) ? -1 : 1; if (p2 > 1.) p2 = 1.; if (Math.abs(lpphi) <= TOL) { @@ -49,7 +63,7 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { out.y = Math.PI * Math.tan(.5 * Math.asin(p2)); if (lpphi < 0.) out.y = -out.y; } else { - al = .5 * Math.abs(Math.PI / lplam - lplam / Math.PI); + al = .5 * sign * Math.abs(Math.PI / lplam - lplam / Math.PI); al2 = al * al; g = Math.sqrt(1. - p2 * p2); g = g / (p2 + g - 1.); @@ -57,7 +71,13 @@ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { p2 = g * (2. / p2 - 1.); p2 = p2 * p2; out.x = g - p2; g = p2 + al2; - out.x = Math.PI * (al * out.x + Math.sqrt(al2 * out.x * out.x - g * (g2 - p2))) / g; + // The OUTER Math.abs is upstream's (vandg.cpp:59-60, + // "M_PI * fabs(al * xy.x + sqrt(...)) / g") and was missing here. It is a no-op + // while `al` is non-negative, which it always was before +over could reach this + // method - so the omission was invisible and is not invisible any more: under + // +over past the antimeridian `al` is negative and the bracket goes with it, + // which would put the easting on the wrong side of the map. + out.x = Math.PI * Math.abs(al * out.x + Math.sqrt(al2 * out.x * out.x - g * (g2 - p2))) / g; if (lplam < 0.) out.x = -out.x; out.y = Math.abs(out.x / Math.PI); out.y = 1. - out.y * (out.y + 2. * al); diff --git a/core/src/main/java/org/locationtech/proj4j/proj/VitkovskyProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/VitkovskyProjection.java index ddb1f13..3b7e375 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/VitkovskyProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/VitkovskyProjection.java @@ -21,6 +21,8 @@ public class VitkovskyProjection extends SimpleConicProjection { + private static final long serialVersionUID = 2295942490018145907L; + public VitkovskyProjection() { super( SimpleConicProjection.VITK1 ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner1Projection.java index 9209c3c..6dbd17c 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Wagner1Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner1Projection.java @@ -21,6 +21,8 @@ public class Wagner1Projection extends UrmaevFlatPolarSinusoidalProjection { + private static final long serialVersionUID = -351493369545299665L; + public String toString() { return "Wagner I"; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner2Projection.java index 36f0d0b..790dc9b 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Wagner2Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner2Projection.java @@ -20,26 +20,40 @@ package org.locationtech.proj4j.proj; import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.FastStrictTrig; import org.locationtech.proj4j.util.ProjectionMath; public class Wagner2Projection extends Projection { + private static final long serialVersionUID = 5110056924073256024L; + private final static double C_x = 0.92483; private final static double C_y = 1.38725; private final static double C_p1 = 0.88022; private final static double C_p2 = 0.88550; + /** + * Port of {@code wag2_s_forward} ({@code 9.8.1:src/projections/wag2.cpp:14-20}). + *

+ * Upstream reassigns {@code lp.phi} in place — {@code lp.phi = aasin(C_p1 * sin(C_p2 * + * lp.phi))} — and both following lines read the reassigned value. The previous transcription + * dropped that result into {@code out.y}, overwrote it on the next line but one, and used the + * original latitude in both, so the northing was {@code C_y * phi} instead of + * {@code C_y * aasin(...)}: 34.2 km at {@code +proj=wag2 +a=6400000} and {@code (2, 1)}. Same + * defect, same shape, as {@link UrmaevFlatPolarSinusoidalProjection}. + */ public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { - out.y = ProjectionMath.asin(C_p1 * Math.sin(C_p2 * lpphi)); - out.x = C_x * lplam * Math.cos(lpphi); - out.y = C_y * lpphi; + double phi = ProjectionMath.asinChecked(C_p1 * FastStrictTrig.sin(C_p2 * lpphi)); + out.x = C_x * lplam * FastStrictTrig.cos(phi); + out.y = C_y * phi; return out; } + /** Port of {@code wag2_s_inverse} ({@code 9.8.1:src/projections/wag2.cpp:22-28}). */ public ProjCoordinate projectInverse(double xyx, double xyy, ProjCoordinate out) { - out.y = xyy / C_y; - out.x = xyx / (C_x * Math.cos(out.y)); - out.y = ProjectionMath.asin(Math.sin(out.y) / C_p1) / C_p2; + double phi = xyy / C_y; + out.x = xyx / (C_x * FastStrictTrig.cos(phi)); + out.y = ProjectionMath.asinChecked(FastStrictTrig.sin(phi) / C_p1) / C_p2; return out; } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner3Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner3Projection.java index 98f4d98..ff1c425 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Wagner3Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner3Projection.java @@ -22,6 +22,9 @@ import org.locationtech.proj4j.ProjCoordinate; public class Wagner3Projection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = 4302239599191416890L; + private final static double TWOTHIRD = 0.6666666666666666666667; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner4Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner4Projection.java index d37802d..f952d1a 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Wagner4Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner4Projection.java @@ -21,6 +21,8 @@ public class Wagner4Projection extends MolleweideProjection { + private static final long serialVersionUID = 3426751557115355494L; + public Wagner4Projection() { super( MolleweideProjection.WAGNER4 ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner5Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner5Projection.java index 14b6940..670384c 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Wagner5Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner5Projection.java @@ -21,6 +21,8 @@ public class Wagner5Projection extends MolleweideProjection { + private static final long serialVersionUID = -4190653088159643764L; + public Wagner5Projection() { super( MolleweideProjection.WAGNER5 ); } diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner6Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner6Projection.java new file mode 100644 index 0000000..984a573 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner6Projection.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +/** + * Wagner VI ({@code +proj=wag6}), the third {@code PROJ_HEAD} of + * {@code 9.8.1:src/projections/eck3.cpp}. + * + *

{@code C_x = C_y = 1}, {@code A = 0} — the unscaled member of the family, and the one + * the other three are stretched or squeezed versions of. Equivalent to Kavrayskiy VII with + * the {@code sqrt(3)/2} horizontal compression removed. + * + *

Fills the {@code wag6} gap in proj4j's Wagner set: {@code wag1}-{@code wag5} and + * {@code wag7} were already present, with {@code wag6} the only one commented out. Note + * that {@code wag4} and {@code wag5} live in {@code moll.cpp} upstream and {@code wag1} in + * {@code urmfps.cpp} — the Wagner numbering does not correspond to any shared + * implementation. + * + * @see Eckert3FamilyProjection + */ +public class Wagner6Projection extends Eckert3FamilyProjection { + + private static final long serialVersionUID = -5368770966081166656L; + + public Wagner6Projection() { + super(1.0, 1.0, 0.0, 0.30396355092701331433); + } + + public String toString() { + return "Wagner VI"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Wagner7Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Wagner7Projection.java index ddf22ac..aaf2b34 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/Wagner7Projection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/Wagner7Projection.java @@ -23,6 +23,8 @@ public class Wagner7Projection extends Projection { + private static final long serialVersionUID = -538142418803560156L; + public ProjCoordinate project(double lplam, double lpphi, ProjCoordinate out) { double theta, ct, D; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/WebMercatorProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/WebMercatorProjection.java new file mode 100644 index 0000000..7467ba7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/WebMercatorProjection.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.MathHelpers; + +/** + * Web Mercator / Pseudo-Mercator ({@code +proj=webmerc}, EPSG:3857), a port of + * {@code 9.8.1:src/projections/merc.cpp}'s second {@code PROJ_HEAD} + * ({@code merc.cpp:76-84}). + * + *

What makes it "pseudo"

+ * + *

It applies the spherical Mercator formulas to ellipsoidal geographic + * coordinates, scaled by the ellipsoid's semi-major axis: + * + *

+ *   x = a * lam
+ *   y = a * asinh(tan(phi))
+ * 
+ * + *

That is not Mercator on a sphere of radius {@code a} — the input latitudes are + * geodetic, so the result is conformal for neither figure. It is a deliberate + * incompatibility standardised because every web map tile scheme was already doing it. + * The northing differs from true ellipsoidal Mercator by up to about 20 km at mid + * latitudes, which is why EPSG gives it its own code rather than treating it as a variant. + * + *

Consequently this class does not extend {@link MercatorProjection}: that class + * dispatches on {@link Projection#spherical}, and {@code webmerc} needs the spherical + * branch on an ellipsoid, which is the one thing the dispatch cannot express. + * + *

{@code +k_0} is ignored, and that is upstream's choice

+ * + *

{@code merc.cpp:79} sets {@code P->k0 = 1.0} unconditionally, with the comment + * "Overriding k_0 with fixed parameter", after the generic parameter pass has + * already read {@code +k_0}. So {@code +proj=webmerc +k_0=2} silently behaves as + * {@code +k_0=1}. This class therefore never reads {@link Projection#scaleFactor}. + * {@code +lat_ts} is likewise not consulted — the {@code webmerc} constructor does not run + * {@code merc}'s {@code lat_ts} block at all. + * + *

Coverage

+ * + *

Contrary to a widely-cited gap analysis, {@code webmerc} has no coverage in + * {@code builtins.gie}. Its only gie rows are three operations in + * {@code gie/4D-API_cs2cs-style.gie}: two inside {@code +proj=pipeline} steps (reachable + * only once the pipeline engine lands) and one standalone + * {@code operation proj=webmerc +ellps=WGS84} carrying two {@code expect} rows from EPSG + * Guidance Note 7-2 p. 44, at {@code tolerance 1 cm}. + */ +public class WebMercatorProjection extends CylindricalProjection { + + private static final long serialVersionUID = 6205783088039603982L; + + /** + * {@code merc_s_forward} with {@code k0 = 1} ({@code merc.cpp:24-29}). The {@code a} + * factor is applied by {@link Projection}'s {@code totalScale}. + */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + dst.x = lam; + dst.y = MathHelpers.asinh(StrictMath.tan(phi)); + return dst; + } + + /** {@code merc_s_inverse} with {@code k0 = 1} ({@code merc.cpp:38-43}). */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + dst.x = x; + dst.y = StrictMath.atan(StrictMath.sinh(y)); + return dst; + } + + public boolean hasInverse() { + return true; + } + + /** + * {@code false}. Web Mercator is conformal for neither the sphere nor the ellipsoid it + * is fed: it borrows the sphere's formulas and the ellipsoid's latitudes, so the scale + * factor is direction-dependent. Reporting {@code true} here — as would be inherited + * from a {@code merc} base class — would be a substantive false claim about the map, + * not a cosmetic one. + */ + public boolean isConformal() { + return false; + } + + public String toString() { + return "Web Mercator / Pseudo Mercator"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/WerenskioldProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/WerenskioldProjection.java index d663dec..dd03954 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/WerenskioldProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/WerenskioldProjection.java @@ -22,6 +22,8 @@ public class WerenskioldProjection extends PutninsP4Projection { + private static final long serialVersionUID = -198960339224160339L; + public WerenskioldProjection() { C_x = 1; C_y = 4.442882938; diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Winkel1Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Winkel1Projection.java new file mode 100644 index 0000000..2d91e02 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Winkel1Projection.java @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Winkel I ({@code +proj=wink1}), a port of {@code 9.8.1:src/projections/wink1.cpp}. + * Four arithmetic lines each way. + * + *

+ *   x = lam (cos(lat_ts) + cos(phi)) / 2
+ *   y = phi
+ * 
+ * + *

The arithmetic mean of Sanson-Flamsteed's easting and equirectangular's, with + * {@code +lat_ts} choosing the parallel whose length is preserved. {@code +lat_ts=0} — the + * default, since {@code cos(0) = 1} — gives the classic Winkel I. + * + *

{@code +lat_ts} is read through the {@code "r"} prefix + * ({@code wink1.cpp:42-43}: {@code cos(pj_param(..., "rlat_ts").f)}), so it is an angle and + * is converted to radians by the parameter machinery. Proj4J holds it in + * {@link Projection#trueScaleLatitude}, which {@code Proj4Parser} already populates from + * {@code +lat_ts} in radians — so no parser work was needed here, unlike {@code gn_sinu}'s + * {@code +m}/{@code +n}. + * + *

Note {@code cosphi1} is computed once at setup from {@code lat_ts}, not per + * point. Recomputing it in {@link #project} would give the same answer but would be a + * departure, and it is on the hot path. + * + *

{@code wink1} has an inverse, and the doc mark agrees: {@code wink1.cpp:9} says + * {@code "\n\tPCyl, Sph\n\tlat_ts="} with no {@code no inv}, and {@code :45} assigns + * {@code P->inv}. Worth stating because five of its neighbours in this batch + * ({@code vandg2}, {@code vandg3}, {@code vandg4}, and all three of {@code bacon.cpp}) are + * marked {@code no inv} and genuinely have none. + */ +public class Winkel1Projection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = 551609772579677021L; + + /** {@code cos(lat_ts)}, from {@code wink1.cpp:42-43}. */ + private double cosphi1 = 1.0; + + @Override + public void initialize() { + super.initialize(); + cosphi1 = StrictMath.cos(trueScaleLatitude); + } + + /** {@code wink1_s_forward}, {@code wink1.cpp:17-24}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + dst.x = 0.5 * lam * (cosphi1 + StrictMath.cos(phi)); + dst.y = phi; + return dst; + } + + /** {@code wink1_s_inverse}, {@code wink1.cpp:26-33}. */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + dst.y = y; + dst.x = 2.0 * x / (cosphi1 + StrictMath.cos(y)); + return dst; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "Winkel I"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/Winkel2Projection.java b/core/src/main/java/org/locationtech/proj4j/proj/Winkel2Projection.java new file mode 100644 index 0000000..17da69e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/proj/Winkel2Projection.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.GenericInverse2D; + +/** + * Winkel II ({@code +proj=wink2}), a port of {@code 9.8.1:src/projections/wink2.cpp}. + * + *

The forward averages an equal-area-style northing with an equirectangular one, using a + * Mollweide-like auxiliary angle solved by Newton: + * + *

+ *   theta seeded at 1.8 phi ; solve  theta + sin(theta) = pi sin(phi)  (10 steps, 1e-7)
+ *   theta /= 2   (or snap to +/-pi/2 on non-convergence)
+ *   x = lam (cos(theta) + cos(lat_1)) / 2
+ *   y = (pi/4) (sin(theta) + 2 phi / pi)
+ * 
+ * + *

The non-convergence branch is a success path

+ * + *

{@code wink2.cpp:33-36}: on exhausting the ten steps it sets + * {@code phi = (phi < 0) ? -pi/2 : pi/2} and — note — skips the halving that the + * converged path applies. So the pole case uses {@code theta = +/-pi/2} where the normal path + * would use {@code theta/2}. It sets no errno and returns a valid coordinate. This must not + * be converted into a throw: it is a deliberate pole clamp, not a failure. Reproduced, + * including the asymmetry about the halving, which is easy to lose by hoisting + * {@code phi *= 0.5} out of the {@code else}. + * + *

Note also that the sign test in that branch reads the iterate, not the original + * latitude — by then {@code lp.phi} has been overwritten by the Newton loop. Transcribed as + * upstream has it. + * + *

The inverse is the generic 2-D Newton, not a formula

+ * + *

{@code wink2.cpp:44-52} has no closed form: it calls {@code pj_generic_inverse_2d} with + * the seed {@code (lam, phi) = (x, y)} — the projected coordinates used directly as an + * angular guess, which is crude but adequate because the map is close to the identity near + * the origin — and {@code deltaXYTolerance = 1e-10}. So {@code wink2} came free once + * {@link GenericInverse2D} existed for {@code adams_ws2}; that is the whole reason §9 rates + * it as difficulty 2 rather than 4. + * + *

The Newton must invert the raw map, without {@code totalScale} or the false + * origin, because upstream passes {@code P->fwd} and that is the raw layer. {@link #project} + * is exactly that layer, so it is handed to {@code solve} directly — reachable because + * {@code project} is {@code protected} and this class is in the same package. + */ +public class Winkel2Projection extends PseudoCylindricalProjection { + + private static final long serialVersionUID = -655558692830007073L; + + private static final int MAX_ITER = 10; + private static final double LOOP_TOL = 1e-7; + private static final double HALF_PI = Math.PI / 2.0; + + /** {@code M_FORTPI}: {@code pi/4}. */ + private static final double FORT_PI = Math.PI / 4.0; + + /** {@code M_TWO_D_PI}: {@code 2/pi}. */ + private static final double TWO_D_PI = 2.0 / Math.PI; + + /** {@code cos(lat_1)}, from {@code wink2.cpp:61-62}. */ + private double cosphi1 = 1.0; + + @Override + public void initialize() { + super.initialize(); + cosphi1 = StrictMath.cos(projectionLatitude1); + } + + /** {@code wink2_s_forward}, {@code wink2.cpp:20-42}. */ + protected ProjCoordinate project(double lam, double phi, ProjCoordinate dst) { + final double yPart = phi * TWO_D_PI; + final double k = Math.PI * StrictMath.sin(phi); + double theta = phi * 1.8; + + int i = MAX_ITER; + for (; i > 0; --i) { + final double v = (theta + StrictMath.sin(theta) - k) + / (1.0 + StrictMath.cos(theta)); + theta -= v; + if (Math.abs(v) < LOOP_TOL) { + break; + } + } + if (i == 0) { + // wink2.cpp:33-34. Note: no halving on this path, and the sign is taken from + // the iterate rather than the original latitude. + theta = theta < 0.0 ? -HALF_PI : HALF_PI; + } else { + theta *= 0.5; + } + + dst.x = 0.5 * lam * (StrictMath.cos(theta) + cosphi1); + dst.y = FORT_PI * (StrictMath.sin(theta) + yPart); + return dst; + } + + /** + * {@code wink2_s_inverse}, {@code wink2.cpp:44-52}: {@code pj_generic_inverse_2d} seeded + * with the projected coordinate itself. + */ + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + return GenericInverse2D.solve(x, y, new GenericInverse2D.Forward2D() { + public void forward(double lam, double phi, ProjCoordinate out) { + project(lam, phi, out); + } + }, x, y, 1e-10, dst); + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "Winkel II"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/proj/WinkelTripelProjection.java b/core/src/main/java/org/locationtech/proj4j/proj/WinkelTripelProjection.java index a0cf30e..6831f09 100644 --- a/core/src/main/java/org/locationtech/proj4j/proj/WinkelTripelProjection.java +++ b/core/src/main/java/org/locationtech/proj4j/proj/WinkelTripelProjection.java @@ -20,10 +20,26 @@ package org.locationtech.proj4j.proj; +/** + * Winkel Tripel ({@code +proj=wintri}): the {@link AitoffProjection} kernel in its + * {@link AitoffProjection#WINKEL} mode. See that class for the {@code +lat_1} handling and the + * Newton–Raphson inverse. + */ public class WinkelTripelProjection extends AitoffProjection { + private static final long serialVersionUID = 1512736703194945907L; + + /** + * The second argument is {@code lat_0}, in radians, and not {@code cosphi1}. This used to + * pass {@code 0.636619772367581343} — {@code acos(2/pi)} as a cosine — into that slot, which set + * {@code lat_0} to 36.47°. Nothing in the kernel reads {@code lat_0}, so it changed no + * coordinate, but it did enter {@code equals}/{@code hashCode}, so a {@code wintri} built here + * and a {@code wintri} built as {@code new AitoffProjection(WINKEL, 0)} compared unequal. + * {@code +lat_1} is handled where upstream handles it, in + * {@link AitoffProjection#initialize()}. + */ public WinkelTripelProjection() { - super( WINKEL, 0.636619772367581343 ); + super( WINKEL, 0.0 ); } public String toString() { diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ByteArrayByteReader.java b/core/src/main/java/org/locationtech/proj4j/resource/ByteArrayByteReader.java new file mode 100644 index 0000000..966d26d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ByteArrayByteReader.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; + +/** + * A {@link SeekableByteReader} over an in-memory byte array. Used by resolvers whose backing store + * is not seekable (classpath resources, jar entries). + */ +public final class ByteArrayByteReader implements SeekableByteReader { + + private final byte[] bytes; + + public ByteArrayByteReader(byte[] bytes) { + if (bytes == null) { + throw new IllegalArgumentException("bytes"); + } + this.bytes = bytes; + } + + @Override + public int read(long position, byte[] dst, int off, int len) throws IOException { + if (position < 0) { + throw new IOException("Negative position " + position); + } + if (position >= bytes.length) { + return -1; + } + int n = (int) Math.min(len, bytes.length - position); + System.arraycopy(bytes, (int) position, dst, off, n); + return n; + } + + @Override + public long size() { + return bytes.length; + } + + @Override + public void close() { + // nothing to release + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/CachingResourceResolver.java b/core/src/main/java/org/locationtech/proj4j/resource/CachingResourceResolver.java new file mode 100644 index 0000000..8c038c0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/CachingResourceResolver.java @@ -0,0 +1,179 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; +import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * Memoises lookup results — including negative ones. + *

+ * The negative half is the point. {@code +nadgrids=@conus} on a classpath without the grid pack is a + * per-row classpath scan in 1.4.x; here it is probed once. Caching only lookups, never bytes, keeps + * this cheap: the parsed-grid cache is separate and bounded by bytes. + *

+ * Because a cached miss is not re-probed, a resource added to the classpath at runtime stays + * invisible until {@link #invalidate()}. That is deliberate: a resolution result that changes + * mid-job is exactly the nondeterminism this package exists to eliminate. + * + *

The two halves are bounded differently, because only one of them is attacker-sized

+ * + *

A hit can only be a name that actually exists in the classpath or the data + * directory, so the set of them is bounded by what is installed. An attacker cannot enlarge it by + * asking, and evicting one costs a real re-probe on a real grid, so hits are retained without a + * limit. + * + *

A miss is different in kind: the name comes from a {@code +nadgrids=} token in + * a per-row CRS string, so a caller can mint an unbounded number of distinct ones. Memoising every + * one of them — which is what a single map did — turns a resolution cache into a retained-memory + * primitive driven by untrusted input, at one map entry plus one string per hostile token, for the + * life of the JVM. Misses are therefore capped at {@value #MAX_ABSENT} names + * ({@code -Dproj4j.resources.maxCachedMisses}). + * + *

The cap stops admitting rather than evicting. Eviction under a flood would throw away + * the legitimate {@code @}-optional misses that the cap exists to keep cheap, and would make which + * ones survive depend on arrival order. Declining to admit degrades, at worst, to the 1.4.x cost of + * re-probing — a bounded slowdown on the attack path — while the memory stays bounded and the + * answers stay identical: this cache is a pure memo over a pure function, so not caching a result + * cannot change it. + */ +public final class CachingResourceResolver implements ResourceResolver { + + // The ABSENT sentinel this class used to carry is gone with the single map that needed it: a + // ConcurrentMap cannot hold a null value, so "resolved to nothing" had to be a stand-in handle + // sharing the map with the real ones. Splitting hits from misses removes both the sentinel and + // the `cached == ABSENT` test on the resolution path. + + /** + * Largest number of distinct failed lookups memoised per resolver. Every real grid name + * in PROJ 9.8.1's {@code grid_alternatives} plus every {@code @}-optional token any shipped + * definition names is a three-digit population, so this is roughly an order of magnitude above + * anything legitimate while capping retention at a few hundred kilobytes of strings. + */ + static final int MAX_ABSENT = 4096; + + private final ResourceResolver delegate; + private final int maxAbsent; + + /** Successful lookups. Unbounded, because the population is bounded by what is installed. */ + private final ConcurrentMap present = + new ConcurrentHashMap(); + + /** Failed lookups. Bounded, because the population is whatever a caller cares to invent. */ + private final ConcurrentMap absent = new ConcurrentHashMap(); + + public CachingResourceResolver(ResourceResolver delegate) { + this(delegate, configuredMaxAbsent()); + } + + /** For tests, which need a cap small enough to reach without minting four thousand names. */ + CachingResourceResolver(ResourceResolver delegate, int maxAbsent) { + if (delegate == null) { + throw new IllegalArgumentException("delegate"); + } + this.delegate = delegate; + this.maxAbsent = maxAbsent; + } + + private static int configuredMaxAbsent() { + String raw = System.getProperty("proj4j.resources.maxCachedMisses"); + if (raw != null) { + try { + int v = Integer.parseInt(raw.trim()); + if (v >= 0) { + return v; + } + } catch (NumberFormatException e) { + // fall through to the default + } + } + return MAX_ABSENT; + } + + public ResourceResolver delegate() { + return delegate; + } + + @Override + public String name() { + return "cached(" + delegate.name() + ")"; + } + + @Override + public boolean isNetworkBacked() { + return delegate.isNetworkBacked(); + } + + @Override + public int priority() { + return delegate.priority(); + } + + @Override + public ResourceHandle resolve(String resourceName) throws IOException { + if (resourceName == null) { + return null; + } + // Hits first, and lock-free: a legitimate grid never touches the bounded half. + ResourceHandle cached = present.get(resourceName); + if (cached != null) { + return cached; + } + if (absent.containsKey(resourceName)) { + return null; + } + // Deliberately not under a lock: two threads may both probe, and both get the same answer + // because the delegates are pure functions of the classpath/filesystem. + ResourceHandle found = delegate.resolve(resourceName); + if (found != null) { + present.putIfAbsent(resourceName, found); + } else if (absent.size() < maxAbsent) { + // Racing threads may push this a few over the cap; the bound is on retention, not on + // an exact count, and paying for a lock on the resolution path to make it exact would + // cost more than the handful of entries it saves. + absent.putIfAbsent(resourceName, Boolean.TRUE); + } + return found; + } + + /** Drops all memoised results, positive and negative. */ + public void invalidate() { + present.clear(); + absent.clear(); + } + + /** Memoised successful lookups. For tests and diagnostics. */ + int cachedHits() { + return present.size(); + } + + /** Memoised failed lookups; never more than the cap, modulo an admission race. */ + int cachedMisses() { + return absent.size(); + } + + @Override + public Collection listAvailable() { + return delegate.listAvailable(); + } + + @Override + public boolean isEnumerable() { + return delegate.isEnumerable(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ChainedResourceResolver.java b/core/src/main/java/org/locationtech/proj4j/resource/ChainedResourceResolver.java new file mode 100644 index 0000000..e29c1b9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ChainedResourceResolver.java @@ -0,0 +1,131 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.TreeSet; + +/** + * First match wins, in the order given. The order is fixed at construction and never re-derived, so + * the same inputs resolve to the same bytes on every JVM and every executor. + */ +public final class ChainedResourceResolver implements ResourceResolver { + + private final List delegates; + private final String name; + + public ChainedResourceResolver(List delegates) { + this.delegates = Collections.unmodifiableList(new ArrayList(delegates)); + StringBuilder sb = new StringBuilder("chain["); + for (int i = 0; i < this.delegates.size(); i++) { + if (i > 0) { + sb.append(", "); + } + sb.append(this.delegates.get(i).name()); + } + this.name = sb.append(']').toString(); + } + + public List delegates() { + return delegates; + } + + @Override + public String name() { + return name; + } + + @Override + public boolean isNetworkBacked() { + for (ResourceResolver r : delegates) { + if (r.isNetworkBacked()) { + return true; + } + } + return false; + } + + @Override + public int priority() { + return delegates.isEmpty() ? 100 : delegates.get(0).priority(); + } + + @Override + public ResourceHandle resolve(String resourceName) throws IOException { + IOException firstFailure = null; + for (ResourceResolver r : delegates) { + try { + ResourceHandle h = r.resolve(resourceName); + if (h != null) { + return h; + } + } catch (IOException e) { + // A resolver that is broken must not shadow a later resolver that works, but the + // failure must not vanish either: it is reported if nothing else resolves. + if (firstFailure == null) { + firstFailure = e; + } + } + } + if (firstFailure != null) { + throw firstFailure; + } + return null; + } + + /** + * The resolver in this chain that actually produced {@code handle}'s bytes, or {@code null}. + * Needed because {@link #resolve} intentionally erases which delegate answered, while grid + * introspection has to report it. + */ + public ResourceResolver resolverOf(String resourceName) { + for (ResourceResolver r : delegates) { + try { + if (r.resolve(resourceName) != null) { + return r; + } + } catch (IOException e) { + // keep looking; resolve() above reports the failure + } + } + return null; + } + + @Override + public Collection listAvailable() { + TreeSet all = new TreeSet(); + for (ResourceResolver r : delegates) { + if (r.isEnumerable()) { + all.addAll(r.listAvailable()); + } + } + return Collections.unmodifiableList(new ArrayList(all)); + } + + @Override + public boolean isEnumerable() { + for (ResourceResolver r : delegates) { + if (!r.isEnumerable()) { + return false; + } + } + return true; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ClasspathResourceResolver.java b/core/src/main/java/org/locationtech/proj4j/resource/ClasspathResourceResolver.java new file mode 100644 index 0000000..493f2b3 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ClasspathResourceResolver.java @@ -0,0 +1,355 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.TreeSet; + +/** + * Resolves resources from a fixed classpath prefix. + *

+ * The prefix is fixed at construction and the requested name is validated by + * {@link ResourceNames}, so a {@code +nadgrids=../../../etc/passwd} token cannot escape it. proj4j + * 1.4.x had a single hardcoded prefix ({@code /proj4/nad/}) and no validation. + *

+ * A name may contain interior path segments — {@code tests/us_noaa_nadcon5_conus.tif} is a + * spelling PROJ supports and the conformance corpus uses. That relaxation is safe here for + * a structural reason worth stating plainly, because it is the reason the guard was allowed to + * loosen: resolution goes through {@link ClassLoader#getResource}, which cannot address anything + * outside the classpath whatever string it is handed. There is no filesystem root to escape from, so + * the traversal defence is the standard {@code ..}/absolute-path rejection in {@link ResourceNames} + * rather than a blanket ban on the separator. {@link #find(String)} additionally refuses any URL + * whose protocol is not local, so a classloader pointed at a remote URL cannot turn a grid lookup + * into network I/O. + *

+ * Classpath resources are not enumerable in general. Passing an {@code indexResource} — a + * newline-delimited manifest generated at build time, one resource name per line — makes this + * resolver {@linkplain #isEnumerable() enumerable}, so {@code availableGrids()} can report a real + * list instead of an empty one that gets misread as "nothing installed". + * + *

This is the resolver whose {@code open()} is an allocation

+ * + *

A classpath resource is not seekable, so {@code open()} has to materialise the entry. That made + * it the one place where a caller's byte ceiling arrived too late to be a defence: {@code + * Resources.readAll} opened the handle, the whole entry landed on the heap, and only then was the + * size compared against the 128 MiB grid limit. The handle therefore implements + * {@link Resources.Bounded} and applies the caller's ceiling while reading, and + * {@code open()} itself is bounded by {@link #maxEntryBytes()} for the callers that stream a data + * file without a budget of their own. {@code DirectoryResourceResolver} never had this problem — its + * {@code open()} returns a {@code RandomAccessFile} wrapper and reads nothing. + */ +public final class ClasspathResourceResolver implements ResourceResolver { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private final String name; + private final ClassLoader loader; + private final String prefix; + private final String indexResource; + private final int priority; + + /** Lazily loaded, then never mutated. {@code null} means "not loaded yet". */ + private volatile List index; + + public ClasspathResourceResolver(ClassLoader loader, String prefix) { + this(loader, prefix, null, 100); + } + + public ClasspathResourceResolver(ClassLoader loader, String prefix, String indexResource) { + this(loader, prefix, indexResource, 100); + } + + public ClasspathResourceResolver(ClassLoader loader, String prefix, String indexResource, int priority) { + if (prefix == null) { + throw new IllegalArgumentException("prefix"); + } + this.loader = loader; + this.prefix = prefix.endsWith("/") ? prefix : prefix + "/"; + this.indexResource = indexResource; + this.priority = priority; + this.name = "classpath:" + this.prefix; + } + + @Override + public String name() { + return name; + } + + @Override + public int priority() { + return priority; + } + + @Override + public ResourceHandle resolve(String resourceName) throws IOException { + if (!ResourceNames.isSafe(resourceName)) { + return null; + } + final String path = prefix + resourceName; + final URL url = find(path); + if (url == null) { + return null; + } + return new ClasspathHandle(resourceName, "classpath:" + path, url, contentLength(url)); + } + + /** + * A located classpath entry. + * + *

Named rather than anonymous because it implements {@link Resources.Bounded} as well as + * {@link ResourceHandle}, and an anonymous class can implement only one interface. That second + * interface is the point: this resolver's {@code open()} has to materialise the whole entry (a + * classpath resource is not seekable), so it is the one handle for which + * {@code Resources.readAll}'s ceiling has to reach inside the read instead of judging + * the result. + */ + private static final class ClasspathHandle implements ResourceHandle, Resources.Bounded { + + private final String requested; + private final String origin; + private final URL url; + private final long size; + + ClasspathHandle(String requested, String origin, URL url, long size) { + this.requested = requested; + this.origin = origin; + this.url = url; + this.size = size; + } + + @Override + public String name() { + return requested; + } + + @Override + public String origin() { + return origin; + } + + @Override + public long sizeBytes() { + return size; + } + + /** + * Bounded by {@link #maxEntryBytes()} rather than unbounded. A caller with a tighter budget + * — every grid reader — goes through {@code Resources.readAll}, which routes to + * {@link #readAll(long)}; this ceiling is the backstop for the direct callers that stream a + * data file (the {@code .pjdx} database) and have no grid-sized budget of their own. + */ + @Override + public SeekableByteReader open() throws IOException { + return new ByteArrayByteReader(slurp(url, origin, size, maxEntryBytes())); + } + + @Override + public byte[] readAll(long maxBytes) throws IOException { + return slurp(url, origin, size, Math.min(maxBytes, maxEntryBytes())); + } + } + + /** + * Hard ceiling on a single classpath entry read into memory, {@code + * -Dproj4j.resources.maxClasspathEntryBytes}, default 512 MiB. + * + *

There was no ceiling at all here before, at any size. This is deliberately generous — it is + * not the grid budget, which is 128 MiB and is applied on top by {@code Resources.readAll} — so + * that it bounds the pathological case without becoming the binding constraint on a legitimate + * data artifact. + */ + static long maxEntryBytes() { + String raw = System.getProperty("proj4j.resources.maxClasspathEntryBytes"); + if (raw != null) { + try { + long v = Long.parseLong(raw.trim()); + if (v > 0) { + return v; + } + } catch (NumberFormatException e) { + // fall through to the default, as Grid and GridExtents do for their properties + } + } + return 512L * 1024L * 1024L; + } + + @Override + public Collection listAvailable() { + if (indexResource == null) { + return Collections.emptyList(); + } + List cached = index; + if (cached == null) { + cached = loadIndex(); + index = cached; + } + return cached; + } + + @Override + public boolean isEnumerable() { + return indexResource != null; + } + + private List loadIndex() { + URL url = find(indexResource.startsWith("/") ? indexResource.substring(1) : prefix + indexResource); + if (url == null) { + return Collections.emptyList(); + } + // Sorted, so the reported list does not depend on how the index file was written. + TreeSet names = new TreeSet(); + try { + InputStream in = url.openStream(); + try { + BufferedReader r = new BufferedReader(new InputStreamReader(in, UTF8)); + String line; + while ((line = r.readLine()) != null) { + line = line.trim(); + if (line.isEmpty() || line.startsWith("#")) { + continue; + } + names.add(line); + } + } finally { + in.close(); + } + } catch (IOException e) { + return Collections.emptyList(); + } + return Collections.unmodifiableList(new ArrayList(names)); + } + + /** + * Local URL protocols a classloader may legitimately hand back: plain files, jar entries, the JDK + * runtime image, and the OSGi and JBoss module loaders. + */ + private static final java.util.Set LOCAL_PROTOCOLS = Collections.unmodifiableSet( + new java.util.HashSet(Arrays.asList( + "file", "jar", "jrt", "resource", "bundleresource", "bundle", "vfs"))); + + private URL find(String path) { + URL url = loader != null + ? loader.getResource(path) + // Fall back to this class's own loader, which is what a resource-only data jar on the + // same classpath will be visible to. + : ClasspathResourceResolver.class.getResource("/" + path); + if (url == null) { + return null; + } + // proj4j core performs no network I/O, and this is the one place a URL exists at all -- it is + // the return type of ClassLoader.getResource, never built from a string. A classloader + // configured with a remote URL would otherwise make that guarantee depend on the deployment + // rather than on the code, so anything non-local is refused here. + String protocol = url.getProtocol(); + if (protocol == null || !LOCAL_PROTOCOLS.contains(protocol.toLowerCase(java.util.Locale.ROOT))) { + return null; + } + return url; + } + + private static long contentLength(URL url) { + try { + return url.openConnection().getContentLengthLong(); + } catch (IOException e) { + return -1L; + } + } + + /** + * Reads the entry, refusing to exceed {@code maxBytes} while reading. + * + *

Three things changed from the version this replaces, and each of them was load-bearing: + *

    + *
  1. It stops at the ceiling. The old loop read to EOF and the caller compared afterwards, so + * the refusal cost exactly as much memory as acceptance would have.
  2. + *
  3. The initial buffer is sized from the entry's declared length clamped to the ceiling, not + * from {@code in.available()}. {@code available()} on a {@code jar:} stream is the + * inflater's view of an attacker-supplied central-directory field; it was the only sizing + * input, and it is the one input that should not be trusted with an allocation.
  4. + *
  5. When the declared length is known and within budget, the bytes go straight into an + * exactly sized array — no doubling and no {@code toByteArray()} copy, so the legitimate + * path allocates {@code n} rather than roughly {@code 3n}. A declared length is still only + * a claim: if the entry turns out to be longer, the read falls through to the bounded + * streaming path rather than trusting either the claim or the stream.
  6. + *
+ */ + private static byte[] slurp(URL url, String origin, long declaredSize, long maxBytes) + throws IOException { + if (declaredSize > maxBytes) { + throw new IOException("Classpath resource " + origin + " declares " + declaredSize + + " bytes, which exceeds the " + maxBytes + " byte read limit"); + } + InputStream in = url.openStream(); + try { + ByteArrayOutputStream out; + long total; + if (declaredSize >= 0) { + byte[] exact = new byte[(int) declaredSize]; + int off = 0; + while (off < exact.length) { + int n = in.read(exact, off, exact.length - off); + if (n < 0) { + break; + } + off += n; + } + int extra = in.read(); + if (extra < 0) { + // The common case, and the whole read: exactly one allocation of the true size. + return off == exact.length ? exact : Arrays.copyOf(exact, off); + } + if (off + 1L > maxBytes) { + throw tooBig(origin, maxBytes); + } + out = new ByteArrayOutputStream(off + 1); + out.write(exact, 0, off); + out.write(extra); + total = off + 1L; + } else { + out = new ByteArrayOutputStream(8192); + total = 0L; + } + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) >= 0) { + total += n; + if (total > maxBytes) { + throw tooBig(origin, maxBytes); + } + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + private static IOException tooBig(String origin, long maxBytes) { + return new IOException("Classpath resource " + origin + " exceeds the " + maxBytes + + " byte read limit; the read was abandoned rather than completed and rejected"); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/DirectoryResourceResolver.java b/core/src/main/java/org/locationtech/proj4j/resource/DirectoryResourceResolver.java new file mode 100644 index 0000000..fb7b6bb --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/DirectoryResourceResolver.java @@ -0,0 +1,255 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.TreeSet; + +/** + * Resolves resources from a single directory on the local filesystem. + *

+ * The root is fixed at construction and every resolved path is verified to stay inside it, so a + * {@code +nadgrids=} token drawn from per-row user data cannot be turned into an arbitrary-file-open + * primitive. Symlinks are followed only if the real target is still under the real root. + *

+ * A name may name a file in a sub-directory — {@code tests/us_noaa_nadcon5_conus.tif} — because that + * is how PROJ spells a grid relative to a search directory. This is the resolver where that + * relaxation has real stakes, since it is filesystem-backed, so containment is enforced + * three times over rather than by banning the separator: {@link ResourceNames} refuses any + * {@code ..} or {@code .} segment, any absolute name and any empty segment; the resolved path is + * re-checked against the root after {@code normalize()}; and it is checked once more after + * {@code toRealPath()}, which is what catches a symlink planted inside the root. Each of the three + * would refuse a traversal on its own. + *

+ * All three of those run at resolution time, and a handle outlives its resolution — it is + * memoised by {@link CachingResourceResolver} for the life of the JVM. {@code ResourceHandle.open()} + * therefore re-canonicalises and re-checks, and opens the canonical path rather than the + * requested one, so a symlink planted between the check and the open is refused instead of followed. + * See {@code resolve}'s handle for why the identity check is kept alongside the containment check. + *

+ * This is the class an application uses if it deliberately wants {@code PROJ_DATA} semantics: + *

{@code
+ * String projData = System.getenv("PROJ_DATA");           // the application's decision, not ours
+ * GridResources.addResolver(new DirectoryResourceResolver(Paths.get(projData)));
+ * }
+ * proj4j itself never reads an environment variable, so the dependency on ambient state is visible + * in the application's own code. + */ +public final class DirectoryResourceResolver implements ResourceResolver { + + private final Path root; + private final Path realRoot; + private final String name; + private final int priority; + + public DirectoryResourceResolver(Path root) { + this(root, 50); + } + + public DirectoryResourceResolver(Path root, int priority) { + if (root == null) { + throw new IllegalArgumentException("root"); + } + this.root = root.toAbsolutePath().normalize(); + Path real; + try { + real = this.root.toRealPath(); + } catch (IOException e) { + real = this.root; + } + this.realRoot = real; + this.priority = priority; + this.name = "directory:" + this.root; + } + + @Override + public String name() { + return name; + } + + @Override + public int priority() { + return priority; + } + + @Override + public ResourceHandle resolve(String resourceName) throws IOException { + if (!ResourceNames.isSafe(resourceName)) { + return null; + } + final Path candidate = root.resolve(resourceName).normalize(); + if (!candidate.startsWith(root)) { + return null; + } + if (!Files.isRegularFile(candidate)) { + return null; + } + // Re-check after symlink resolution: a symlink inside the root may point outside it. + Path real = candidate.toRealPath(); + if (!real.startsWith(realRoot)) { + return null; + } + final long size = Files.size(candidate); + final String requested = resourceName; + final String origin = candidate.toUri().toString(); + final Path resolvedReal = real; + return new ResourceHandle() { + @Override + public String name() { + return requested; + } + + @Override + public String origin() { + return origin; + } + + @Override + public long sizeBytes() { + return size; + } + + /** + * Re-validates, then opens the canonical path. + * + *

This used to open {@code candidate} — the pre-{@code toRealPath()} spelling — which + * threw away the containment check {@code resolve()} had just performed. All three + * checks above happen at resolution time, and a handle outlives its resolution: it is + * cached by {@link CachingResourceResolver} and reused for the life of the JVM. Anyone + * who can write inside the data directory could therefore replace a plain file with a + * symlink to {@code /etc/shadow} after the checks passed, and every later + * {@code open()} would follow it, because {@code new RandomAccessFile(candidate)} + * re-traverses the name and re-follows whatever links it now finds. + * + *

Two things close it. The path is re-canonicalised and re-checked against the real + * root, so a link planted since resolution is caught. And the file is opened by its + * canonical path rather than by the requested one: {@code toRealPath()} has already + * resolved every link in it, so the open itself cannot traverse one. The residual + * window is between {@code toRealPath()} and {@code new RandomAccessFile} on a path with + * no symlink components, which is as close as the JDK's file API allows without + * {@code O_NOFOLLOW}. + * + *

The identity check is separate from the containment check and both are kept. A + * swap from one in-root file to another in-root file stays inside the root and would + * pass containment, but it is still not the resource that was resolved, and a grid + * silently becoming a different grid is a wrong answer rather than an error. + */ + @Override + public SeekableByteReader open() throws IOException { + Path nowReal = candidate.toRealPath(); + if (!nowReal.startsWith(realRoot)) { + throw new IOException("Refusing to open " + requested + ": it now resolves to " + + nowReal + ", which is outside " + realRoot + + ". The path changed between resolution and open."); + } + if (!nowReal.equals(resolvedReal)) { + throw new IOException("Refusing to open " + requested + ": it resolved to " + + resolvedReal + " but now resolves to " + nowReal + + ". The path changed between resolution and open."); + } + return new RandomAccessFileByteReader(new RandomAccessFile(nowReal.toFile(), "r")); + } + }; + } + + /** + * Every regular file at or below the root, named exactly as {@link #resolve} would have to be + * called to get it — so a file in a sub-directory appears as {@code tests/foo.tif}, not + * {@code foo.tif}. + *

+ * This walks sub-directories because {@link #resolve} now accepts a name with interior segments. + * A resolver that declares itself {@linkplain #isEnumerable() enumerable} while omitting names it + * would happily resolve is reporting a smaller inventory than it has, and + * {@code Proj.availableGrids()} would repeat the omission. The two directions are kept in step by + * the one rule: a name {@link ResourceNames} would refuse is skipped here rather than listed and + * then refused on use. + */ + @Override + public Collection listAvailable() { + TreeSet names = new TreeSet(); + try { + collect(root, "", 0, names); + } catch (IOException e) { + return Collections.emptyList(); + } + return Collections.unmodifiableList(new ArrayList(names)); + } + + /** + * Bounds the walk. PROJ data directories are flat or one level deep; the cap exists so a + * pathological tree cannot turn an inventory call into an unbounded one. + */ + private static final int MAX_DEPTH = 8; + + private void collect(Path dir, String prefix, int depth, TreeSet into) throws IOException { + DirectoryStream stream = Files.newDirectoryStream(dir); + try { + for (Path p : stream) { + String name = prefix + p.getFileName().toString(); + if (!ResourceNames.isSafe(name)) { + continue; + } + if (Files.isRegularFile(p)) { + into.add(name); + } else if (depth < MAX_DEPTH + && Files.isDirectory(p) + // A symlinked sub-directory pointing out of the root is not part of this + // resolver's inventory, for the same reason resolve() would refuse it. + && p.toRealPath().startsWith(realRoot)) { + collect(p, name + "/", depth + 1, into); + } + } + } finally { + stream.close(); + } + } + + @Override + public boolean isEnumerable() { + return true; + } + + private static final class RandomAccessFileByteReader implements SeekableByteReader { + private final RandomAccessFile file; + + RandomAccessFileByteReader(RandomAccessFile file) { + this.file = file; + } + + @Override + public int read(long position, byte[] dst, int off, int len) throws IOException { + file.seek(position); + return file.read(dst, off, len); + } + + @Override + public long size() throws IOException { + return file.length(); + } + + @Override + public void close() throws IOException { + file.close(); + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ResourceHandle.java b/core/src/main/java/org/locationtech/proj4j/resource/ResourceHandle.java new file mode 100644 index 0000000..d0b08d9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ResourceHandle.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; + +/** + * A located, not-yet-read resource, together with enough provenance to answer + * “which bytes did this executor actually use?” without guessing. + *

+ * A handle is immutable and safe to share between threads; the readers it hands out are not. + */ +public interface ResourceHandle { + + /** + * The requested resource name, e.g. {@code "us_noaa_conus.tif"} or {@code "conus"}. + */ + String name(); + + /** + * Where the bytes come from, in a form a human can act on, e.g. + * {@code "classpath:/proj4j-data/grids/conus"} or {@code "file:/srv/grids/conus"}. + *

+ * This is the value reported by grid introspection, and it is the single most useful datum when + * two executors disagree about a coordinate. + */ + String origin(); + + /** + * Size in bytes, or {@code -1} if the resolver cannot determine it without reading. + */ + long sizeBytes(); + + /** + * Opens a fresh, independently positioned reader. Never returns a shared or + * cached reader, so two threads may each call this and read concurrently. + */ + SeekableByteReader open() throws IOException; +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ResourceNames.java b/core/src/main/java/org/locationtech/proj4j/resource/ResourceNames.java new file mode 100644 index 0000000..abbded0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ResourceNames.java @@ -0,0 +1,175 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +/** + * The single rule deciding whether a resource name lifted out of a proj string may be handed to a + * resolver. Shared by {@link ClasspathResourceResolver} and {@link DirectoryResourceResolver} so the + * two cannot drift: a name refused by one is refused by the other. + * + *

Public, because one caller lives outside this package

+ * + *

{@code +init=:} builds a classpath resource name from the authority — + * {@code "proj4/nad/" + authority.toLowerCase(Locale.ROOT)} — out of the same untrusted CRS string a + * {@code +nadgrids=} token comes from, and it did so with no validation at all while + * every grid path was guarded. {@code org.locationtech.proj4j.io.Proj4FileReader} now calls + * {@link #violation(String)} on the authority, so {@code +init=../../foo:bar} is refused by name and + * by rule rather than left to whatever {@code ClassLoader.getResourceAsStream} makes of it. That + * caller is in another package, which is the whole reason this type is public: the alternative was a + * second copy of the rule, and a second copy is a rule that drifts. + * + *

Interior path segments are permitted, deliberately

+ * + *

This guard used to reject any name containing {@code /}, on the reasoning that grid + * names in proj strings are bare file names. That reasoning was wrong about PROJ. PROJ resolves a + * grid token by appending the whole token to each directory on its search path + * ({@code filemanager.cpp}, steps 5 and 7), so a relative sub-path is an ordinary, supported spelling + * — and the conformance corpus uses it heavily: + * {@code +file=tests/tinshift_simplified_kkj_etrs.json}, + * {@code +xy_grids=tests/nkgrf03vel_realigned_xy_extract.ct2}, + * {@code +grids=tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif}. Refusing them made + * roughly a hundred assertions unreachable rather than merely failing. + * + *

Why relaxing it does not relax the security position

+ * + *

The guard was never the thing standing between a hostile {@code +nadgrids=} token and an + * arbitrary file. Each resolver has a structural containment property, and this rule is the standard + * traversal defence layered on top of it, not a substitute for it: + * + *

    + *
  • {@link ClasspathResourceResolver} resolves through {@link ClassLoader#getResource}, which + * cannot address anything outside the classpath no matter what string it is given — there is no + * filesystem path to escape from. (It additionally refuses any URL whose protocol is not local, + * so a classloader configured with a remote URL cannot turn a lookup into network I/O.)
  • + *
  • {@link DirectoryResourceResolver} is filesystem-backed, so it is the one with real + * stakes — and it re-checks containment after {@code normalize()} and again after + * {@code toRealPath()}, so a traversal or a symlink out of the root is refused by the path check + * even if it somehow got past this rule.
  • + *
+ * + *

So what remains here is the conventional relative-path hygiene: no absolute name, no + * {@code ..}, no {@code .}, no empty segment, and nothing whose meaning would depend on which layer + * interprets it. Rejecting a bare {@code /} bought nothing that these do not. + * + *

Deny-list, not allow-list, and why

+ * + *

An allow-list of permitted characters would be stronger in the abstract, but the population it + * has to accept is not ours: it is every {@code grid_name} in EPSG's {@code grid_transformation} + * plus every {@code old_proj_grid_name} in {@code grid_alternatives}. Guessing that set wrong fails + * closed on a legitimate grid, silently, in whatever deployment happens to own that grid — + * which is a worse failure than the one it prevents, given the containment properties above. + */ +public final class ResourceNames { + + private ResourceNames() { + } + + /** + * Why a name was refused. Named rather than boolean so a diagnostic — and a test — can state + * which rule fired, instead of asserting that something, somewhere, said no. + */ + public enum Rule { + /** No name at all. */ + NULL("the name is null"), + /** The empty string; {@code prefix + ""} is the prefix directory itself. */ + EMPTY("the name is empty"), + /** A leading separator addresses a filesystem or classpath root, not the resolver's. */ + ABSOLUTE("the name starts with '/' or '\\', addressing a root rather than the resolver's"), + /** {@code /} is the only separator proj strings and classpath resources use. */ + BACKSLASH("the name contains a '\\', which is not a separator proj4j recognises"), + /** Includes tab, newline and NUL — a NUL is the classic path-truncation trick. */ + WHITESPACE("the name contains whitespace or a control character"), + /** A URL escape would make the name mean different things to different layers. */ + PERCENT("the name contains a '%', so its meaning would depend on who decodes it"), + /** A Windows drive letter, or a URL scheme. */ + COLON("the name contains a ':', which could be a drive letter or a URL scheme"), + /** {@code ..} traverses upwards; {@code .} is a no-op spelling that only helps evade checks. */ + DOT_SEGMENT("the name contains a '.' or '..' path segment"), + /** {@code a//b}, a leading {@code //}, or a trailing {@code /}. */ + EMPTY_SEGMENT("the name contains an empty path segment ('//' or a trailing '/')"); + + private final String description; + + Rule(String description) { + this.description = description; + } + + /** Human-readable, for a diagnostic message. */ + public String description() { + return description; + } + } + + /** {@code true} iff {@link #violation(String)} finds nothing to object to. */ + public static boolean isSafe(String resourceName) { + return violation(resourceName) == null; + } + + /** + * @return the first rule the name breaks, or {@code null} if it breaks none. The order the rules + * are checked in is fixed, so the answer is stable and a test can assert it. + */ + public static Rule violation(String resourceName) { + if (resourceName == null) { + return Rule.NULL; + } + if (resourceName.isEmpty()) { + return Rule.EMPTY; + } + char first = resourceName.charAt(0); + if (first == '/' || first == '\\') { + return Rule.ABSOLUTE; + } + for (int i = 0; i < resourceName.length(); i++) { + char c = resourceName.charAt(i); + if (c == '\\') { + return Rule.BACKSLASH; + } + // <= ' ' catches space, tab, CR, LF and NUL alike; 0x7f is DEL. + if (c <= ' ' || c == 0x7f) { + return Rule.WHITESPACE; + } + if (c == '%') { + return Rule.PERCENT; + } + if (c == ':') { + return Rule.COLON; + } + } + for (int start = 0; ; ) { + int slash = resourceName.indexOf('/', start); + int end = slash < 0 ? resourceName.length() : slash; + int length = end - start; + if (length == 0) { + return Rule.EMPTY_SEGMENT; + } + if (isDotSegment(resourceName, start, length)) { + return Rule.DOT_SEGMENT; + } + if (slash < 0) { + return null; + } + start = slash + 1; + } + } + + private static boolean isDotSegment(String s, int start, int length) { + if (length > 2 || s.charAt(start) != '.') { + return false; + } + return length == 1 || s.charAt(start + 1) == '.'; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ResourceResolver.java b/core/src/main/java/org/locationtech/proj4j/resource/ResourceResolver.java new file mode 100644 index 0000000..f0c700f --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ResourceResolver.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; + +/** + * Locates a named data resource (a grid, today) without ever consulting ambient state. + *

+ * Implementations are discovered through {@link java.util.ServiceLoader} via + * {@code META-INF/services/org.locationtech.proj4j.resource.ResourceResolver}, so a consumer with a + * shaded jar or an object-store backend registers a resolver and ships no proj4j patch. + * + *

Ordering is total and deterministic

+ * Discovered resolvers are sorted by {@code (priority(), name())} — never by + * {@code ServiceLoader} discovery order, which varies with classpath ordering and would reintroduce + * exactly the nondeterminism this SPI exists to remove. Two resolvers with the same + * {@code priority()} must therefore have different {@code name()}s; see + * {@link ResourceResolvers#serviceLoaderResolvers()}, which rejects a duplicate + * {@code (priority, name)} pair rather than picking one arbitrarily. + * + *

Thread-safety and I/O contract

+ * {@link #resolve} and {@link #listAvailable} must be safe for concurrent + * invocation and must not hold a lock across I/O. {@link ResourceHandle#open()} must return + * a fresh, independently positioned reader on each call. + * + *

What a resolver must never do

+ *
    + *
  • Consult the process working directory for an unqualified name. proj4j's 1.4.x resolver did, + * which made the answer depend on whatever a framework had staged into a shared container + * work dir.
  • + *
  • Read an environment variable. Ambient environment must never change a numeric answer. An + * application that wants {@code PROJ_DATA} semantics constructs a + * {@link DirectoryResourceResolver} over it explicitly, in its own code, where it is + * reviewable.
  • + *
  • Perform network I/O without reporting {@link #isNetworkBacked()} {@code == true}.
  • + *
+ */ +public interface ResourceResolver { + + /** + * A short, stable, unique identifier used both for diagnostics and as the tie-break in the + * resolver ordering. Must not be null or empty. + */ + String name(); + + /** + * MUST be {@code true} for anything performing off-host I/O. + *

+ * proj4j core ships no network-backed resolver at all — absent, not disabled — so that + * “can this reach the network?” is answerable by {@code mvn dependency:tree} + * and by {@code jar tf}, not only by reading code. + */ + default boolean isNetworkBacked() { + return false; + } + + /** + * Lower runs first. Ties are broken by {@link #name()}, so {@code ServiceLoader} order never + * affects results. + */ + default int priority() { + return 100; + } + + /** + * @param resourceName an unqualified resource name such as {@code "conus"}. Implementations + * must treat this as untrusted input: it originates in a + * {@code +nadgrids=} token in a possibly per-row, possibly user-supplied + * CRS string. + * @return the handle, or {@code null} if this resolver does not have the resource. Returning + * {@code null} is not an error and must not be logged as one. + */ + ResourceHandle resolve(String resourceName) throws IOException; + + /** + * Best-effort enumeration. An empty collection means “cannot enumerate”, + * NOT “none installed” — classpath resources are not listable without a + * generated index. Check {@link #isEnumerable()} to tell the two apart. + */ + default Collection listAvailable() { + return Collections.emptyList(); + } + + /** + * @return {@code true} iff {@link #listAvailable()} returns a complete list. + */ + default boolean isEnumerable() { + return false; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/ResourceResolvers.java b/core/src/main/java/org/locationtech/proj4j/resource/ResourceResolvers.java new file mode 100644 index 0000000..da8c80d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/ResourceResolvers.java @@ -0,0 +1,265 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Assembles the one deterministic resolver chain proj4j uses to find data. + * + *

+ * 1. explicit resolvers, in {@link #addResolver} call order
+ * 2. {@link ServiceLoader} results, sorted by (priority(), name())
+ * 3. built-in  classpath:/proj4j-data/grids/     (the grid packs)
+ * 4. built-in  classpath:/proj4/nad/             (legacy proj4j-epsg compatibility)
+ * 
+ * + *

What is deliberately absent

+ *
    + *
  • The process working directory. proj4j 1.4.x tried + * {@code new File(gridName)} first. On a Spark or Flink executor the CWD is a + * framework-chosen container work dir, shared between tasks and writable by {@code --files} + * staging, shuffle spill and arbitrary user code, so a file named {@code conus} landing there + * silently outranked the packaged grid: the same CRS pair and the same coordinate could give a + * different answer per executor and per run. It was also an untrusted-input file-open + * primitive, since {@code gridName} comes from a {@code +nadgrids=} token in a possibly + * per-row CRS string, and {@code new File} accepts {@code ../} and absolute paths. PROJ itself + * puts the CWD at step 11 of 12; proj4j put it at step 1 of 2. It is now at no step at all.
  • + *
  • Every environment variable. No {@code PROJ_DATA}, no {@code PROJ_LIB}, no + * {@code PROJ_NETWORK}. Ambient environment must never change a numeric answer. An application + * that wants those semantics adds a {@link DirectoryResourceResolver} itself, in its own code.
  • + *
  • All network code. Absent, not disabled — so + * “can this reach the network?” is answered by {@code mvn dependency:tree} + * and {@code jar tf}, not by auditing flags. A discovered resolver reporting + * {@link ResourceResolver#isNetworkBacked()} is rejected at chain-construction time unless the + * application called {@link #setAllowNetwork(boolean) setAllowNetwork(true)} — it fails when + * the chain is built, not on some unlucky row four million rows in.
  • + *
+ * + *

Total ordering

+ * {@code ServiceLoader} iteration order follows classpath order, which differs between a dev IDE, a + * shaded jar and a Spark executor with {@code --jars}. Sorting by {@code (priority, name)} is what + * makes discovery order irrelevant. Two service-provided resolvers sharing both a priority and a name + * are rejected outright rather than silently ordered by luck. + */ +public final class ResourceResolvers { + + /** Where grid packs put their data. Hyphenated so it is not a valid Java package name, which + * keeps JPMS from encapsulating it in a resource-only module. */ + public static final String GRID_PREFIX = "proj4j-data/grids"; + + /** Legacy prefix used by {@code proj4j-epsg} 1.4.x and earlier. Kept last, for compatibility. */ + public static final String LEGACY_GRID_PREFIX = "proj4/nad"; + + /** Generated manifest inside a grid pack that makes the classpath resolver enumerable. */ + public static final String GRID_INDEX = "INDEX"; + + private static final Comparator ORDER = new Comparator() { + @Override + public int compare(ResourceResolver a, ResourceResolver b) { + int byPriority = Integer.compare(a.priority(), b.priority()); + if (byPriority != 0) { + return byPriority; + } + return a.name().compareTo(b.name()); + } + }; + + private static final CopyOnWriteArrayList EXPLICIT = + new CopyOnWriteArrayList(); + + private static volatile boolean allowNetwork = false; + + /** Memoised chain; invalidated by any mutation. */ + private static volatile ChainedResourceResolver chain; + + private ResourceResolvers() { + } + + /** + * Appends a resolver ahead of everything discovered or built in. Call order is preserved and is + * part of the contract. + * + * @throws IllegalStateException if the resolver is network-backed and network access has not been + * explicitly allowed. + */ + public static void addResolver(ResourceResolver resolver) { + if (resolver == null) { + throw new IllegalArgumentException("resolver"); + } + if (resolver.name() == null || resolver.name().isEmpty()) { + throw new IllegalArgumentException("resolver.name() must be non-empty: " + resolver); + } + rejectIfNetworkBacked(resolver); + EXPLICIT.add(resolver); + chain = null; + } + + /** Removes all explicitly added resolvers. Discovered and built-in resolvers are unaffected. */ + public static void clearResolvers() { + EXPLICIT.clear(); + chain = null; + } + + /** Explicitly added resolvers, in call order. */ + public static List explicitResolvers() { + return Collections.unmodifiableList(new ArrayList(EXPLICIT)); + } + + /** + * proj4j core contains no network code, so this is {@code false} and there is nothing to turn on. + * It exists so that {@code isNetworkEnabled()} is a question with an answer rather than a matter + * of reading the classpath. + */ + public static boolean isNetworkEnabled() { + return allowNetwork && chainContainsNetworkResolver(); + } + + /** + * Opts in to network-backed resolvers. Without a network-backed resolver on the classpath this + * changes nothing: turning the network on requires the artifact and this call. + */ + public static void setAllowNetwork(boolean allow) { + allowNetwork = allow; + chain = null; + } + + /** + * {@link ServiceLoader}-discovered resolvers, sorted by {@code (priority(), name())}. + * + * @throws ServiceConfigurationError if two providers share both a priority and a name, which + * would leave the order decided by classpath layout. + */ + public static List serviceLoaderResolvers() { + List found = new ArrayList(); + ServiceLoader loader = ServiceLoader.load(ResourceResolver.class); + Iterator it = loader.iterator(); + while (it.hasNext()) { + ResourceResolver r = it.next(); + if (r.name() == null || r.name().isEmpty()) { + throw new ServiceConfigurationError( + "ResourceResolver " + r.getClass().getName() + " has a null or empty name()"); + } + found.add(r); + } + Collections.sort(found, ORDER); + for (int i = 1; i < found.size(); i++) { + ResourceResolver a = found.get(i - 1); + ResourceResolver b = found.get(i); + if (a.priority() == b.priority() && a.name().equals(b.name())) { + throw new ServiceConfigurationError("Two ResourceResolver providers share priority " + + a.priority() + " and name '" + a.name() + "' (" + a.getClass().getName() + + " and " + b.getClass().getName() + "). The chain order would then depend on " + + "classpath ordering; give them distinct names or priorities."); + } + } + return Collections.unmodifiableList(found); + } + + /** Built-in resolvers, in fixed order: grid packs, then the legacy {@code proj4j-epsg} prefix. */ + public static List builtInResolvers() { + ClassLoader cl = classLoader(); + List built = new ArrayList(2); + built.add(new ClasspathResourceResolver(cl, GRID_PREFIX, GRID_INDEX, 1000)); + built.add(new ClasspathResourceResolver(cl, LEGACY_GRID_PREFIX, null, 1001)); + return Collections.unmodifiableList(built); + } + + /** + * The single chain used for all data resolution. Memoised, first-match-wins, and wrapped so that + * a missing resource is probed once rather than once per row. + */ + public static ChainedResourceResolver resolver() { + ChainedResourceResolver c = chain; + if (c == null) { + synchronized (ResourceResolvers.class) { + c = chain; + if (c == null) { + c = buildChain(); + chain = c; + } + } + } + return c; + } + + private static ChainedResourceResolver buildChain() { + List ordered = new ArrayList(); + ordered.addAll(EXPLICIT); + ordered.addAll(serviceLoaderResolvers()); + ordered.addAll(builtInResolvers()); + List wrapped = new ArrayList(ordered.size()); + for (ResourceResolver r : ordered) { + rejectIfNetworkBacked(r); + wrapped.add(r instanceof CachingResourceResolver ? r : new CachingResourceResolver(r)); + } + return new ChainedResourceResolver(wrapped); + } + + private static void rejectIfNetworkBacked(ResourceResolver r) { + if (r.isNetworkBacked() && !allowNetwork) { + throw new IllegalStateException("ResourceResolver '" + r.name() + "' (" + + r.getClass().getName() + ") reports isNetworkBacked() == true, but network " + + "access has not been enabled. proj4j core ships no network code; a " + + "network-backed resolver must be both added to the classpath and enabled via " + + "ResourceResolvers.setAllowNetwork(true)."); + } + } + + private static boolean chainContainsNetworkResolver() { + return resolver().isNetworkBacked(); + } + + private static ClassLoader classLoader() { + // The class's own loader, not the thread context loader: the context loader is set by the + // framework and varies per task, which is precisely the ambient input being removed here. + ClassLoader cl = ResourceResolvers.class.getClassLoader(); + return cl != null ? cl : ClassLoader.getSystemClassLoader(); + } + + /** + * A multi-line, human-readable description of exactly how data is being located, suitable for + * logging once per JVM. Names every resolver in order, says whether each can be enumerated, and + * states the network position explicitly so an empty grid list is never mistaken for + * "nothing installed". + */ + public static String describeResolution() { + StringBuilder sb = new StringBuilder(); + sb.append("proj4j data resolution chain (first match wins):\n"); + int i = 1; + for (ResourceResolver r : resolver().delegates()) { + sb.append(" ").append(i++).append(". ").append(r.name()) + .append(" priority=").append(r.priority()) + .append(" enumerable=").append(r.isEnumerable()); + if (r.isEnumerable()) { + sb.append(" entries=").append(r.listAvailable().size()); + } + sb.append('\n'); + } + sb.append(" working directory: NEVER CONSULTED\n"); + sb.append(" environment variables: NONE READ (no PROJ_DATA, PROJ_LIB, PROJ_NETWORK)\n"); + sb.append(" network: ").append(isNetworkEnabled() ? "ENABLED" + : "ABSENT (no network-backed resolver on the classpath)").append('\n'); + return sb.toString(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/Resources.java b/core/src/main/java/org/locationtech/proj4j/resource/Resources.java new file mode 100644 index 0000000..b0b27f3 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/Resources.java @@ -0,0 +1,146 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +/** + * Small helpers shared by the resolvers and the grid readers. Pure JDK, no state. + */ +public final class Resources { + + private Resources() { + } + + /** + * Reads exactly {@code len} bytes at {@code position}, looping over short reads. + * + * @throws EOFException if the resource ends first. + */ + public static void readFully(SeekableByteReader reader, long position, byte[] dst, int off, int len) + throws IOException { + int done = 0; + while (done < len) { + int n = reader.read(position + done, dst, off + done, len - done); + if (n <= 0) { + throw new EOFException("Unexpected end of resource at byte " + (position + done) + + " (wanted " + len + " bytes from " + position + ")"); + } + done += n; + } + } + + /** + * Reads up to {@code len} bytes at {@code position}, returning however many were available. Used + * for format sniffing, where a file shorter than the probe is legitimate. + * + * @return number of bytes placed in {@code dst}, possibly 0. + */ + public static int readAtMost(SeekableByteReader reader, long position, byte[] dst, int off, int len) + throws IOException { + int done = 0; + while (done < len) { + int n = reader.read(position + done, dst, off + done, len - done); + if (n <= 0) { + break; + } + done += n; + } + return done; + } + + /** + * A handle that can apply a byte ceiling to the read itself, rather than leaving + * {@link #readAll} to discover the size after the bytes are already on the heap. + * + *

Package-private on purpose: it is an implementation detail of how {@link #readAll} and + * {@link ClasspathResourceResolver} cooperate, not something an external resolver has to know + * about. A handle that does not implement it still gets the {@link ResourceHandle#sizeBytes()} + * pre-check below and then the seek-and-size path, which never allocates on an unverified + * length. + */ + interface Bounded { + /** + * @param maxBytes hard ceiling; the implementation must stop reading once it is exceeded, + * not read to the end and compare afterwards + */ + byte[] readAll(long maxBytes) throws IOException; + } + + /** + * Reads the whole resource into a byte array. + * + *

The order here is the fix, not decoration

+ * + *

This method used to call {@code handle.open()} first and consult {@code reader.size()} + * afterwards. For {@link DirectoryResourceResolver} that is harmless — {@code open()} returns a + * {@code RandomAccessFile} wrapper and reads nothing. For {@link ClasspathResourceResolver} it + * was not: its {@code open()} slurped the entire classpath entry into a + * {@code ByteArrayOutputStream} and handed back an in-memory reader, so the limit that exists to + * prevent the allocation ran after the allocation, and a 2 GB jar entry was already on + * the heap by the time the check said 128 MiB. The ceiling was a diagnostic, not a defence. + * + *

So: the size the resolver already knows is consulted before anything is opened, + * and a handle that reads eagerly is asked to apply the ceiling to its own read. Both halves are + * needed. {@link ResourceHandle#sizeBytes()} may be {@code -1} ("cannot say without reading"), + * and a declared length is a claim rather than a fact — a jar central directory can lie — so the + * streaming path stops at {@code maxBytes} regardless of what was declared. + * + * @throws IOException if the resource is larger than {@code maxBytes}. Grid parsing in proj4j is + * whole-file, so the bound is what stops a hostile or mistaken + * {@code +nadgrids=} from turning into an OOM. + */ + public static byte[] readAll(ResourceHandle handle, long maxBytes) throws IOException { + // Before open(): for a resolver that reads eagerly, open() is the allocation. + long declared = handle.sizeBytes(); + if (declared > maxBytes) { + throw new IOException("Resource " + handle.origin() + " is " + declared + + " bytes, which exceeds the " + maxBytes + " byte limit for in-memory grids"); + } + if (handle instanceof Bounded) { + return ((Bounded) handle).readAll(maxBytes); + } + SeekableByteReader reader = handle.open(); + try { + long size = reader.size(); + if (size > maxBytes) { + throw new IOException("Resource " + handle.origin() + " is " + size + + " bytes, which exceeds the " + maxBytes + " byte limit for in-memory grids"); + } + if (size < 0) { + throw new IOException("Resource " + handle.origin() + " has unknown size"); + } + byte[] all = new byte[(int) size]; + readFully(reader, 0L, all, 0, all.length); + return all; + } finally { + reader.close(); + } + } + + /** + * A {@link DataInputStream} over an in-memory copy of the resource. {@code mark}/{@code reset} + * are unconditionally supported, which the legacy grid readers rely on. + */ + public static DataInputStream asDataStream(byte[] bytes) { + InputStream in = new ByteArrayInputStream(bytes); + return new DataInputStream(in); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/resource/SeekableByteReader.java b/core/src/main/java/org/locationtech/proj4j/resource/SeekableByteReader.java new file mode 100644 index 0000000..2ac1481 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/resource/SeekableByteReader.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.Closeable; +import java.io.IOException; + +/** + * A positioned, random-access reader over a resource's bytes. + *

+ * Grid formats need seeks: NTv2 subgrids are chained by byte offset, GTX and CTable2 are + * row-addressed, and GeoTIFF is index-addressed. A plain {@link java.io.InputStream} cannot + * express that without either buffering the whole file or re-opening it. + *

+ * A single {@code SeekableByteReader} is NOT thread-safe. Obtain one per thread + * from {@link ResourceHandle#open()}, which returns a fresh, independently positioned reader on + * every call. + */ +public interface SeekableByteReader extends Closeable { + + /** + * Reads up to {@code len} bytes starting at absolute {@code position}. + * + * @return the number of bytes actually read, or {@code -1} at end of resource. A short read is + * permitted; callers that need exactly {@code len} bytes must loop (see + * {@link Resources#readFully}). + */ + int read(long position, byte[] dst, int off, int len) throws IOException; + + /** + * @return the total size in bytes. + */ + long size() throws IOException; +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbAxis.java b/core/src/main/java/org/locationtech/proj4j/spi/DbAxis.java new file mode 100644 index 0000000..c4a5c28 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbAxis.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * One axis of a coordinate system, in authority order. + *

+ * This is where authority axis order actually lives. {@code EPSG:4326}'s coordinate system + * {@code EPSG:6422} has {@code order 1 = Geodetic latitude (Lat, north)} and + * {@code order 2 = Geodetic longitude (Lon, east)} — which is why PROJ 6+ is latitude-first for it and + * proj4j 1.4.3 is not. proj4j's default remains longitude-first; this class is the datum that lets + * {@code AxisOrderPolicy.AUTHORITY} be implemented at all, and lets the difference be reported instead + * of guessed. + */ +public final class DbAxis { + + private final String name; + private final String abbreviation; + private final String orientation; + private final int order; + private final DbObjectRef unit; + + public DbAxis(String name, String abbreviation, String orientation, int order, DbObjectRef unit) { + this.name = name; + this.abbreviation = abbreviation; + this.orientation = orientation; + this.order = order; + this.unit = unit; + } + + /** {@code "Geodetic latitude"}. */ + public String name() { + return name; + } + + /** {@code "Lat"}. */ + public String abbreviation() { + return abbreviation; + } + + /** + * {@code "north"}, {@code "east"}, {@code "up"}, {@code "south"}, {@code "west"}, {@code "down"}, + * or a free-text bearing such as {@code "North along 90 deg East"}. Not an enum precisely because + * upstream does not constrain it. + */ + public String orientation() { + return orientation; + } + + /** 1-based position within the coordinate system. */ + public int order() { + return order; + } + + /** The axis unit of measure; may be null for ordinal systems. */ + public DbObjectRef unit() { + return unit; + } + + @Override + public String toString() { + return order + ": " + name + " (" + abbreviation + ", " + orientation + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbCelestialBody.java b/core/src/main/java/org/locationtech/proj4j/spi/DbCelestialBody.java new file mode 100644 index 0000000..63cbcce --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbCelestialBody.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * A celestial body. 176 of them exist in the shipped database, and 2,201 of the 13,790 CRSs are + * IAU_2015 definitions that are not on Earth. + *

+ * This is a filter, not decoration: an operation search that ignores the body will happily offer a + * Helmert transformation between an Earth datum and a Martian one. + */ +public final class DbCelestialBody { + + private final String authName; + private final String code; + private final String name; + private final double semiMajorAxis; + + public DbCelestialBody(String authName, String code, String name, double semiMajorAxis) { + this.authName = authName; + this.code = code; + this.name = name; + this.semiMajorAxis = semiMajorAxis; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** {@code "Earth"}, {@code "Mars"}, … */ + public String name() { + return name; + } + + /** Metres, or {@link Double#NaN}. */ + public double semiMajorAxis() { + return semiMajorAxis; + } + + /** + * @return {@code true} iff this is Earth, by name. + */ + public boolean isEarth() { + return "Earth".equals(name); + } + + @Override + public String toString() { + return authName + ":" + code + " " + name; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbConversion.java b/core/src/main/java/org/locationtech/proj4j/spi/DbConversion.java new file mode 100644 index 0000000..cba8557 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbConversion.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import java.util.Collections; +import java.util.List; + +/** + * The map projection half of a projected CRS: a method plus up to seven parameters. + *

+ * A conversion is not a CRS-to-CRS operation and never appears in the operation search; it is reached + * through {@link DbCrs#conversion()}. The method is an authority-coded operation method — EPSG 9807 is + * Transverse Mercator, 9802 Lambert Conic Conformal (2SP) — which is the mapping the facade turns into + * a {@code +proj=} plus its parameters. + */ +public final class DbConversion { + + private final String authName; + private final String code; + private final String name; + private final String methodAuthName; + private final String methodCode; + private final String methodName; + private final List parameters; + private final boolean deprecated; + + public DbConversion(String authName, String code, String name, String methodAuthName, + String methodCode, String methodName, List parameters, + boolean deprecated) { + this.authName = authName; + this.code = code; + this.name = name; + this.methodAuthName = methodAuthName; + this.methodCode = methodCode; + this.methodName = methodName; + this.parameters = parameters == null + ? Collections.emptyList() + : Collections.unmodifiableList(parameters); + this.deprecated = deprecated; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + public String name() { + return name; + } + + /** May be null: a handful of upstream conversions have no method. */ + public String methodAuthName() { + return methodAuthName; + } + + /** {@code "9807"}. May be null. */ + public String methodCode() { + return methodCode; + } + + /** {@code "Transverse Mercator"}. May be null. */ + public String methodName() { + return methodName; + } + + /** + * Present parameters only, in upstream slot order ({@code param1}…{@code param7}), with + * absent slots omitted rather than represented by a null entry. Unmodifiable. + */ + public List parameters() { + return parameters; + } + + public boolean deprecated() { + return deprecated; + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + " [" + methodName + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbCoordinateSystem.java b/core/src/main/java/org/locationtech/proj4j/spi/DbCoordinateSystem.java new file mode 100644 index 0000000..65e1969 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbCoordinateSystem.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import java.util.Collections; +import java.util.List; + +/** + * A coordinate system: its kind, its dimension, and its axes in authority order. + */ +public final class DbCoordinateSystem { + + private final String authName; + private final String code; + private final String type; + private final int dimension; + private final List axes; + + public DbCoordinateSystem(String authName, String code, String type, int dimension, + List axes) { + this.authName = authName; + this.code = code; + this.type = type; + this.dimension = dimension; + this.axes = axes == null + ? Collections.emptyList() + : Collections.unmodifiableList(axes); + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** + * One of {@code Cartesian}, {@code vertical}, {@code ellipsoidal}, {@code spherical}, + * {@code ordinal} — a closed upstream vocabulary, carried as a string so a future addition is data + * rather than a compile break. + */ + public String type() { + return type; + } + + /** + * 1, 2 or 3. The single fact a {@code +init=} dictionary cannot express, and therefore the reason + * {@code EPSG:4979} needs this database. + */ + public int dimension() { + return dimension; + } + + /** + * Axes ordered by {@link DbAxis#order()} ascending. Unmodifiable. + */ + public List axes() { + return axes; + } + + @Override + public String toString() { + return authName + ":" + code + " " + type + "[" + dimension + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbCrs.java b/core/src/main/java/org/locationtech/proj4j/spi/DbCrs.java new file mode 100644 index 0000000..79af8dd --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbCrs.java @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * One row of the database's CRS union, flattened. + *

+ * Deliberately one class with nullable accessors rather than five subclasses: the facade's job is to + * branch on {@link #type()} once and build a {@code Crs}, and a type hierarchy would only add casts to + * that. Which accessors are populated is a function of {@link #type()} alone: + * + * + * + * + * + * + * + * + * + * + * + * + *
populated accessors by CRS type
typepopulated
{@code GEOGRAPHIC_2D}, {@code GEOGRAPHIC_3D}, {@code GEOCENTRIC}, + * {@code GEODETIC_OTHER}{@link #coordinateSystem()}, {@link #datum()}
{@code PROJECTED}{@link #coordinateSystem()}, {@link #baseCrs()}, {@link #conversion()}
{@code VERTICAL}{@link #coordinateSystem()}, {@link #datum()}
{@code COMPOUND}{@link #horizontalCrs()}, {@link #verticalCrs()}
{@code ENGINEERING}name and deprecation only
+ * + * {@link #textDefinition()} is upstream's escape hatch: 173 projected CRSs and no geodetic ones carry a + * PROJ or WKT string in place of a structured definition, and upstream's own schema comment calls its + * use discouraged, as prone to definition ambiguities. It is surfaced rather than dropped so + * the facade can decide, but a structured definition should always win where both exist. + */ +public final class DbCrs { + + private final DbCrsType type; + private final String authName; + private final String code; + private final String name; + private final boolean deprecated; + private final DbObjectRef coordinateSystem; + private final DbObjectRef datum; + private final DbObjectRef baseCrs; + private final DbObjectRef conversion; + private final DbObjectRef horizontalCrs; + private final DbObjectRef verticalCrs; + private final String textDefinition; + + public DbCrs(DbCrsType type, String authName, String code, String name, boolean deprecated, + DbObjectRef coordinateSystem, DbObjectRef datum, DbObjectRef baseCrs, + DbObjectRef conversion, DbObjectRef horizontalCrs, DbObjectRef verticalCrs, + String textDefinition) { + if (type == null || authName == null || code == null || name == null) { + throw new IllegalArgumentException("type, authName, code and name are mandatory"); + } + this.type = type; + this.authName = authName; + this.code = code; + this.name = name; + this.deprecated = deprecated; + this.coordinateSystem = coordinateSystem; + this.datum = datum; + this.baseCrs = baseCrs; + this.conversion = conversion; + this.horizontalCrs = horizontalCrs; + this.verticalCrs = verticalCrs; + this.textDefinition = textDefinition; + } + + public DbCrsType type() { + return type; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** + * {@code "WGS 84"}. Never null; the upstream schema requires at least two characters. + */ + public String name() { + return name; + } + + /** + * {@code crs_view.deprecated}. A deprecated CRS is still returned by lookups — refusing it here + * would turn a lookup of a code that exists into {@code UNKNOWN_CRS}, which is a different and + * worse answer than "exists, superseded, here is the replacement". + */ + public boolean deprecated() { + return deprecated; + } + + /** Null for {@code COMPOUND} and {@code ENGINEERING}. */ + public DbObjectRef coordinateSystem() { + return coordinateSystem; + } + + /** + * The geodetic datum for a geodetic CRS, the vertical datum for a vertical CRS; null otherwise. + * Check {@link DbObjectRef#type()} rather than assuming. + */ + public DbObjectRef datum() { + return datum; + } + + /** The base geodetic CRS of a projected CRS; null otherwise. */ + public DbObjectRef baseCrs() { + return baseCrs; + } + + /** The map projection of a projected CRS; null otherwise. */ + public DbObjectRef conversion() { + return conversion; + } + + /** The horizontal component of a compound CRS; null otherwise. */ + public DbObjectRef horizontalCrs() { + return horizontalCrs; + } + + /** The vertical component of a compound CRS; null otherwise. */ + public DbObjectRef verticalCrs() { + return verticalCrs; + } + + /** + * A PROJ string or a WKT string, or null. See the class comment: present for 173 projected CRSs + * and used by upstream only where a structured definition is unavailable. + */ + public String textDefinition() { + return textDefinition; + } + + /** + * This CRS as a reference, for feeding back into {@link ProjDatabase#extentsFor(DbObjectRef)} and friends. + */ + public DbObjectRef ref() { + return new DbObjectRef(type.objectType(), authName, code); + } + + @Override + public String toString() { + return authName + ":" + code + " (" + type.dbValue() + ") " + name + + (deprecated ? " [deprecated]" : ""); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbCrsType.java b/core/src/main/java/org/locationtech/proj4j/spi/DbCrsType.java new file mode 100644 index 0000000..43e4e75 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbCrsType.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * The CRS flavours the database distinguishes. + *

+ * {@link #GEOGRAPHIC_3D} is the reason this enum exists rather than a boolean. A PROJ.4 + * {@code +init=} dictionary structurally cannot express it — {@code projinfo EPSG:4979 -o PROJ} is + * byte-identical to {@code EPSG:4326}'s entry — so {@code EPSG:4979}, {@code EPSG:4937} and the + * vertical codes {@code 5773}, {@code 3855}, {@code 5798}, {@code 5714}, {@code 5715}, {@code 5703} + * and {@code 6357} are simply absent without a database. The dimension lives in the + * {@code coordinate_system}, and that is only reachable through here. + */ +public enum DbCrsType { + + /** {@code geodetic_crs.type = 'geographic 2D'}. */ + GEOGRAPHIC_2D("geographic 2D"), + /** {@code geodetic_crs.type = 'geographic 3D'}. */ + GEOGRAPHIC_3D("geographic 3D"), + /** {@code geodetic_crs.type = 'geocentric'}. */ + GEOCENTRIC("geocentric"), + /** {@code geodetic_crs.type = 'other'}. */ + GEODETIC_OTHER("other"), + PROJECTED("projected"), + VERTICAL("vertical"), + COMPOUND("compound"), + ENGINEERING("engineering"); + + private final String dbValue; + + DbCrsType(String dbValue) { + this.dbValue = dbValue; + } + + /** + * The upstream string, as it appears in {@code crs_view.type}. + */ + public String dbValue() { + return dbValue; + } + + /** + * @return the {@link DbObjectType} whose table holds CRSs of this flavour. + */ + public DbObjectType objectType() { + switch (this) { + case PROJECTED: + return DbObjectType.PROJECTED_CRS; + case VERTICAL: + return DbObjectType.VERTICAL_CRS; + case COMPOUND: + return DbObjectType.COMPOUND_CRS; + case ENGINEERING: + return DbObjectType.ENGINEERING_CRS; + default: + return DbObjectType.GEODETIC_CRS; + } + } + + /** + * @return {@code true} for the three geodetic flavours that carry a geodetic datum and can act as + * the base of a projected CRS. + */ + public boolean isGeodetic() { + return this == GEOGRAPHIC_2D || this == GEOGRAPHIC_3D || this == GEOCENTRIC + || this == GEODETIC_OTHER; + } + + public static DbCrsType fromDbValue(String v) { + if (v == null) { + return null; + } + for (DbCrsType t : values()) { + if (t.dbValue.equals(v)) { + return t; + } + } + return null; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbDatum.java b/core/src/main/java/org/locationtech/proj4j/spi/DbDatum.java new file mode 100644 index 0000000..174ebcf --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbDatum.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import java.util.Collections; +import java.util.List; + +/** + * A geodetic or vertical datum, including the datum-ensemble case. + *

+ * One class covers both because the only structural difference is that a vertical datum has no + * ellipsoid and no prime meridian; {@link #type()} says which, and {@link #ellipsoid()} and + * {@link #primeMeridian()} are null for {@link DbObjectType#VERTICAL_DATUM}. + *

+ * Ensembles matter for ballpark detection. {@code EPSG:6326} "World Geodetic System + * 1984 ensemble" has a non-null {@link #ensembleAccuracy()} (2 m) and 6 members; two CRSs whose datums + * are different members of the same ensemble are related by an operation whose accuracy is bounded by + * that figure, not by nothing. Treating an ensemble as an ordinary datum is how {@code EPSG:4267} to + * {@code EPSG:4269} became "the input unchanged". + */ +public final class DbDatum { + + private final DbObjectType type; + private final String authName; + private final String code; + private final String name; + private final DbObjectRef ellipsoid; + private final DbObjectRef primeMeridian; + private final String publicationDate; + private final double frameReferenceEpoch; + private final double ensembleAccuracy; + private final List ensembleMembers; + private final boolean deprecated; + + public DbDatum(DbObjectType type, String authName, String code, String name, + DbObjectRef ellipsoid, DbObjectRef primeMeridian, String publicationDate, + double frameReferenceEpoch, double ensembleAccuracy, + List ensembleMembers, boolean deprecated) { + this.type = type; + this.authName = authName; + this.code = code; + this.name = name; + this.ellipsoid = ellipsoid; + this.primeMeridian = primeMeridian; + this.publicationDate = publicationDate; + this.frameReferenceEpoch = frameReferenceEpoch; + this.ensembleAccuracy = ensembleAccuracy; + this.ensembleMembers = ensembleMembers == null + ? Collections.emptyList() + : Collections.unmodifiableList(ensembleMembers); + this.deprecated = deprecated; + } + + /** {@link DbObjectType#GEODETIC_DATUM} or {@link DbObjectType#VERTICAL_DATUM}. */ + public DbObjectType type() { + return type; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + public String name() { + return name; + } + + /** Null for a vertical datum. */ + public DbObjectRef ellipsoid() { + return ellipsoid; + } + + /** Null for a vertical datum. */ + public DbObjectRef primeMeridian() { + return primeMeridian; + } + + /** {@code YYYY-MM-DD}, or null. */ + public String publicationDate() { + return publicationDate; + } + + /** + * Set only for a dynamic datum; {@link Double#NaN} otherwise. A dynamic datum needs a coordinate + * epoch to be transformed rigorously, which is what {@code MISSING_TIME} reports. + */ + public double frameReferenceEpoch() { + return frameReferenceEpoch; + } + + /** + * Metres, set only for a datum ensemble; {@link Double#NaN} otherwise. + */ + public double ensembleAccuracy() { + return ensembleAccuracy; + } + + /** + * @return {@code true} iff this is a datum ensemble rather than a single realisation. + */ + public boolean isEnsemble() { + return !ensembleMembers.isEmpty() || !Double.isNaN(ensembleAccuracy); + } + + /** + * Members in upstream {@code sequence} order, which is the authority's own preference order and + * therefore deterministic. Empty for a non-ensemble. + */ + public List ensembleMembers() { + return ensembleMembers; + } + + public boolean deprecated() { + return deprecated; + } + + public DbObjectRef ref() { + return new DbObjectRef(type, authName, code); + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + (isEnsemble() ? " [ensemble]" : ""); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbEllipsoid.java b/core/src/main/java/org/locationtech/proj4j/spi/DbEllipsoid.java new file mode 100644 index 0000000..bf7f86b --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbEllipsoid.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * An ellipsoid, in exactly the two-of-three form upstream stores it. + *

+ * Upstream enforces {@code inv_flattening} and {@code semi_minor_axis} as mutually + * exclusive — a {@code CHECK} constraint requires exactly one to be non-null. That is + * preserved here rather than being resolved into both, because deriving the missing one and then + * re-deriving the first from it is precisely how the {@code +rf}/{@code +f} transposition defect + * produced a latitude of −3.3e205°. The caller sees which of the two the authority actually + * published. + *

+ * {@link #semiMajorAxis()} is in {@link #unit()}, which is not always metres: some IAU_2015 + * bodies and older authorities publish in other length units. + */ +public final class DbEllipsoid { + + private final String authName; + private final String code; + private final String name; + private final DbObjectRef celestialBody; + private final double semiMajorAxis; + private final DbObjectRef unit; + private final double inverseFlattening; + private final double semiMinorAxis; + private final boolean deprecated; + + public DbEllipsoid(String authName, String code, String name, DbObjectRef celestialBody, + double semiMajorAxis, DbObjectRef unit, double inverseFlattening, + double semiMinorAxis, boolean deprecated) { + this.authName = authName; + this.code = code; + this.name = name; + this.celestialBody = celestialBody; + this.semiMajorAxis = semiMajorAxis; + this.unit = unit; + this.inverseFlattening = inverseFlattening; + this.semiMinorAxis = semiMinorAxis; + this.deprecated = deprecated; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + public String name() { + return name; + } + + /** + * Earth is {@code EPSG:PROJ:1027}-ish in name only; in this database it is + * {@code celestial_body} {@code PROJ:EARTH}. 176 bodies exist and 2,201 of the CRSs are IAU_2015 + * definitions on other bodies, so a caller that assumes Earth must check. + */ + public DbObjectRef celestialBody() { + return celestialBody; + } + + /** In {@link #unit()}, not necessarily metres. */ + public double semiMajorAxis() { + return semiMajorAxis; + } + + public DbObjectRef unit() { + return unit; + } + + /** + * {@code 1/f}, or {@link Double#NaN} if the authority published a semi-minor axis instead. A value + * of exactly {@code 0} means a sphere, which upstream permits explicitly + * ({@code CHECK (inv_flattening = 0 OR inv_flattening >= 1.0)}). + */ + public double inverseFlattening() { + return inverseFlattening; + } + + /** In {@link #unit()}, or {@link Double#NaN} if the authority published an inverse flattening. */ + public double semiMinorAxis() { + return semiMinorAxis; + } + + public boolean deprecated() { + return deprecated; + } + + /** + * @return {@code true} iff this is a sphere by either parameterisation. + */ + public boolean isSphere() { + return inverseFlattening == 0.0 || semiMinorAxis == semiMajorAxis; + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + " a=" + semiMajorAxis + + (Double.isNaN(inverseFlattening) ? " b=" + semiMinorAxis : " rf=" + inverseFlattening); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbExtent.java b/core/src/main/java/org/locationtech/proj4j/spi/DbExtent.java new file mode 100644 index 0000000..b707d78 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbExtent.java @@ -0,0 +1,171 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * A geographic extent: the raw area-of-use row, before the facade turns it into an + * {@code org.locationtech.proj4j.api.AreaOfUse}. + *

+ * {@link #westLongitude()} may be greater than {@link #eastLongitude()}, and that is + * not corrupt data: it is how the authority expresses an extent crossing the antimeridian. Normalising + * it into a single interval turns a Pacific extent into an almost-global one, which then wins every + * area-of-use ranking. {@link #crossesAntimeridian()} is provided so the check is impossible to forget. + *

+ * 18 of the 4,314 extents have no bounding box at all. Those return {@link Double#NaN} for all four + * bounds and {@code false} from {@link #hasBoundingBox()} — never {@code (-180, -90, 180, 90)}, because + * a fabricated world extent is indistinguishable from a genuine one and would silently rank first. + */ +public final class DbExtent { + + private final String authName; + private final String code; + private final String name; + private final String description; + private final double westLongitude; + private final double southLatitude; + private final double eastLongitude; + private final double northLatitude; + private final boolean deprecated; + + public DbExtent(String authName, String code, String name, String description, + double westLongitude, double southLatitude, double eastLongitude, + double northLatitude, boolean deprecated) { + this.authName = authName; + this.code = code; + this.name = name; + this.description = description; + this.westLongitude = westLongitude; + this.southLatitude = southLatitude; + this.eastLongitude = eastLongitude; + this.northLatitude = northLatitude; + this.deprecated = deprecated; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** {@code "UK - Britain and UKCS 49"}… the short form. */ + public String name() { + return name; + } + + /** + * The long form, which is what a human should be shown. Never null upstream + * ({@code description TEXT NOT NULL}). + */ + public String description() { + return description; + } + + public double westLongitude() { + return westLongitude; + } + + public double southLatitude() { + return southLatitude; + } + + public double eastLongitude() { + return eastLongitude; + } + + public double northLatitude() { + return northLatitude; + } + + /** + * @return {@code false} for the 18 extents that publish no bounds. All four accessors are + * {@link Double#NaN} in that case. + */ + public boolean hasBoundingBox() { + return !Double.isNaN(westLongitude) && !Double.isNaN(southLatitude) + && !Double.isNaN(eastLongitude) && !Double.isNaN(northLatitude); + } + + /** + * @return {@code true} iff west > east, i.e. the extent wraps through 180°. + */ + public boolean crossesAntimeridian() { + return hasBoundingBox() && westLongitude > eastLongitude; + } + + /** + * Degrees of longitude spanned, handling the antimeridian wrap. {@link Double#NaN} without a + * bounding box. + */ + public double longitudeSpan() { + if (!hasBoundingBox()) { + return Double.NaN; + } + return crossesAntimeridian() + ? (180.0 - westLongitude) + (eastLongitude + 180.0) + : eastLongitude - westLongitude; + } + + /** + * A crude ranking area in square degrees. Not a geodesic area — it is used only to order candidate + * extents smallest-first, and ties are broken elsewhere by authority code, so a monotone proxy is + * enough. {@link Double#NaN} without a bounding box. + */ + public double rankingArea() { + if (!hasBoundingBox()) { + return Double.NaN; + } + return longitudeSpan() * (northLatitude - southLatitude); + } + + /** + * @param longitudeDegrees east-positive + * @param latitudeDegrees north-positive + * @return {@code false} if there is no bounding box — "unknown" is reported as "not contained" + * rather than as "contained", so an absent extent never widens an area of use. + */ + public boolean contains(double longitudeDegrees, double latitudeDegrees) { + if (!hasBoundingBox()) { + return false; + } + if (latitudeDegrees < southLatitude || latitudeDegrees > northLatitude) { + return false; + } + if (crossesAntimeridian()) { + return longitudeDegrees >= westLongitude || longitudeDegrees <= eastLongitude; + } + return longitudeDegrees >= westLongitude && longitudeDegrees <= eastLongitude; + } + + public boolean deprecated() { + return deprecated; + } + + public DbObjectRef ref() { + return new DbObjectRef(DbObjectType.EXTENT, authName, code); + } + + @Override + public String toString() { + if (!hasBoundingBox()) { + return authName + ":" + code + " " + name + " (no bbox)"; + } + return authName + ":" + code + " " + name + " [" + westLongitude + "," + southLatitude + + " .. " + eastLongitude + "," + northLatitude + "]" + + (crossesAntimeridian() ? " (crosses antimeridian)" : ""); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbGridAlternative.java b/core/src/main/java/org/locationtech/proj4j/spi/DbGridAlternative.java new file mode 100644 index 0000000..5d0dbf7 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbGridAlternative.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * The mapping from an authority's grid file name to the file PROJ actually reads, plus what kind of + * file it is. + *

+ * Three fields here are load-bearing for proj4j specifically: + *

    + *
  • {@link #projMethod()} says which operator the grid feeds — {@code hgridshift}, + * {@code vgridshift}, {@code gridshift}, {@code geoid_like}, {@code geocentricoffset}, + * {@code tinshift}, {@code velocity_grid}, {@code defmodel}. proj4j can execute some of these and + * not others, and the difference is {@code UNSUPPORTED_OPERATION_METHOD} rather than a wrong + * number.
  • + *
  • {@link #inverseDirection()} says the PROJ grid runs the opposite way from the authority's + * declaration. Ignoring it applies the shift with the wrong sign — twice the error, still + * plausible.
  • + *
  • {@link #openLicense()} gates redistribution. The grid-pack manifest generator refuses any grid + * with {@code open_license = 0}.
  • + *
+ * {@link #url()} is information for a human, never an action. proj4j contains no + * network code at all, so a grid reachable only by that URL is reported as missing, full stop. + */ +public final class DbGridAlternative { + + private final String originalGridName; + private final String projGridName; + private final String oldProjGridName; + private final String projGridFormat; + private final String projMethod; + private final boolean inverseDirection; + private final String url; + private final Boolean directDownload; + private final Boolean openLicense; + private final String directory; + + public DbGridAlternative(String originalGridName, String projGridName, String oldProjGridName, + String projGridFormat, String projMethod, boolean inverseDirection, + String url, Boolean directDownload, Boolean openLicense, + String directory) { + this.originalGridName = originalGridName; + this.projGridName = projGridName; + this.oldProjGridName = oldProjGridName; + this.projGridFormat = projGridFormat; + this.projMethod = projMethod; + this.inverseDirection = inverseDirection; + this.url = url; + this.directDownload = directDownload; + this.openLicense = openLicense; + this.directory = directory; + } + + /** As the authority spells it, e.g. {@code "OSTN15_NTv2_OSGBtoETRS.gsb"}. */ + public String originalGridName() { + return originalGridName; + } + + /** PROJ 7+, e.g. {@code "uk_os_OSTN15_NTv2_OSGBtoETRS.tif"}. */ + public String projGridName() { + return projGridName; + } + + /** PROJ < 7, e.g. {@code "OSTN15_NTv2_OSGBtoETRS.gsb"}; may be null. */ + public String oldProjGridName() { + return oldProjGridName; + } + + /** One of {@code GTiff}, {@code GTX}, {@code NTv2}, {@code JSON}. */ + public String projGridFormat() { + return projGridFormat; + } + + /** See the class comment. */ + public String projMethod() { + return projMethod; + } + + /** {@code true} iff the PROJ grid direction is reversed relative to the authority's. */ + public boolean inverseDirection() { + return inverseDirection; + } + + /** May be null. Never fetched by proj4j. */ + public String url() { + return url; + } + + /** May be null when unknown, which is not the same as {@code false}. */ + public Boolean directDownload() { + return directDownload; + } + + /** May be null when unknown. Treat null as "not established", never as permission. */ + public Boolean openLicense() { + return openLicense; + } + + /** Optional subdirectory hint; may be null. */ + public String directory() { + return directory; + } + + @Override + public String toString() { + return originalGridName + " -> " + projGridName + " (" + projGridFormat + ", " + projMethod + + (inverseDirection ? ", inverse" : "") + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbObjectRef.java b/core/src/main/java/org/locationtech/proj4j/spi/DbObjectRef.java new file mode 100644 index 0000000..62317ec --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbObjectRef.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * An authority-qualified reference to a database object: {@code (type, authName, code)}. + *

+ * Codes are carried as {@link String} because upstream declares them {@code INTEGER_OR_TEXT} and + * really uses both — 1,803 of the 2,148 geodetic CRSs have integer codes, 345 do not, and the IGNF and + * NKG authorities are text-coded throughout ({@code NKG:DK_2020_INTRAPLATE}). A numeric code type + * would silently exclude them. + *

+ * Immutable, and totally ordered by {@code (type, authName, code)} so that any list of references this + * SPI returns can be sorted into one canonical sequence. That total order is load-bearing: candidate + * enumeration must not depend on hash iteration order or on which index a row happened to be found + * through. + */ +public final class DbObjectRef implements Comparable { + + private final DbObjectType type; + private final String authName; + private final String code; + + public DbObjectRef(DbObjectType type, String authName, String code) { + if (type == null) { + throw new IllegalArgumentException("type"); + } + if (authName == null) { + throw new IllegalArgumentException("authName"); + } + if (code == null) { + throw new IllegalArgumentException("code"); + } + this.type = type; + this.authName = authName; + this.code = code; + } + + public DbObjectType type() { + return type; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** + * {@code "EPSG:4326"} — authority and code only, without the type. This is the spelling a caller + * typed and the spelling an error message should use. + */ + public String authorityCode() { + return authName + ":" + code; + } + + @Override + public int compareTo(DbObjectRef o) { + int c = type.compareTo(o.type); + if (c != 0) { + return c; + } + c = authName.compareTo(o.authName); + if (c != 0) { + return c; + } + return code.compareTo(o.code); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof DbObjectRef)) { + return false; + } + DbObjectRef r = (DbObjectRef) o; + return type == r.type && authName.equals(r.authName) && code.equals(r.code); + } + + @Override + public int hashCode() { + int h = type.hashCode(); + h = 31 * h + authName.hashCode(); + h = 31 * h + code.hashCode(); + return h; + } + + @Override + public String toString() { + return type.dbName() + ":" + authName + ":" + code; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbObjectType.java b/core/src/main/java/org/locationtech/proj4j/spi/DbObjectType.java new file mode 100644 index 0000000..0f347dc --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbObjectType.java @@ -0,0 +1,103 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * The kinds of object a {@link ProjDatabase} can be asked about. + *

+ * The constants mirror, one for one, the {@code table_name} vocabulary that PROJ's own database uses + * in its {@code usage}, {@code alias_name}, {@code supersession} and {@code deprecation} tables. That + * vocabulary is a closed {@code CHECK} constraint upstream, so it is reproduced verbatim rather than + * re-invented: {@link #dbName()} returns the exact upstream spelling, which is what makes a lookup + * key in this API and a row in the shipped index the same thing. + *

+ * Note that {@code helmert_transformation} is the name of an upstream view; its backing table + * is {@code helmert_transformation_table}. The view name is the one used as a key, again matching + * upstream. + */ +public enum DbObjectType { + + UNIT_OF_MEASURE("unit_of_measure"), + CELESTIAL_BODY("celestial_body"), + ELLIPSOID("ellipsoid"), + EXTENT("extent"), + PRIME_MERIDIAN("prime_meridian"), + GEODETIC_DATUM("geodetic_datum"), + VERTICAL_DATUM("vertical_datum"), + ENGINEERING_DATUM("engineering_datum"), + GEODETIC_CRS("geodetic_crs"), + PROJECTED_CRS("projected_crs"), + VERTICAL_CRS("vertical_crs"), + COMPOUND_CRS("compound_crs"), + ENGINEERING_CRS("engineering_crs"), + COORDINATE_SYSTEM("coordinate_system"), + CONVERSION("conversion"), + GRID_TRANSFORMATION("grid_transformation"), + HELMERT_TRANSFORMATION("helmert_transformation"), + OTHER_TRANSFORMATION("other_transformation"), + CONCATENATED_OPERATION("concatenated_operation"); + + private final String dbName; + + DbObjectType(String dbName) { + this.dbName = dbName; + } + + /** + * The upstream {@code proj.db} table name, e.g. {@code "projected_crs"}. + */ + public String dbName() { + return dbName; + } + + /** + * @return {@code true} for the five CRS types. + */ + public boolean isCrs() { + return this == GEODETIC_CRS || this == PROJECTED_CRS || this == VERTICAL_CRS + || this == COMPOUND_CRS || this == ENGINEERING_CRS; + } + + /** + * @return {@code true} for the four coordinate-operation types. A {@link #CONVERSION} is + * deliberately not one of them: upstream models it as the map projection half of a + * projected CRS, not as a CRS-to-CRS transformation, and it never appears in + * {@code coordinate_operation_view}. + */ + public boolean isOperation() { + return this == GRID_TRANSFORMATION || this == HELMERT_TRANSFORMATION + || this == OTHER_TRANSFORMATION || this == CONCATENATED_OPERATION; + } + + /** + * Reverse of {@link #dbName()}. + * + * @return the matching constant, or {@code null} if {@code dbName} is not one of the 19 upstream + * table names. {@code null} rather than an exception because an unknown table name in a + * future database revision is data, not a programming error. + */ + public static DbObjectType fromDbName(String dbName) { + if (dbName == null) { + return null; + } + for (DbObjectType t : values()) { + if (t.dbName.equals(dbName)) { + return t; + } + } + return null; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbOperation.java b/core/src/main/java/org/locationtech/proj4j/spi/DbOperation.java new file mode 100644 index 0000000..6f4a94d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbOperation.java @@ -0,0 +1,222 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import java.util.Collections; +import java.util.List; + +/** + * A CRS-to-CRS coordinate operation, flattened across the four upstream operation tables. + *

+ * {@link #kind()} says which table the row came from and therefore which accessors carry the payload: + * + * + * + * + * + * + * + * + * + * + * + *
payload by operation kind
kindpayload
{@code HELMERT_TRANSFORMATION}{@link #parameters()} — up to 15 of {@code tx ty tz rx ry rz ds} and their rates, plus + * {@code epoch} and the {@code px py pz} pivot, each with its own unit
{@code GRID_TRANSFORMATION}{@link #gridNames()} (one or two), {@link #parameters()}, {@link #interpolationCrs()}
{@code OTHER_TRANSFORMATION}{@link #parameters()} (up to 9), optionally one grid. When + * {@link #methodAuthName()} is {@code "PROJ"} and {@link #methodCode()} is + * {@code "PROJString"} or {@code "WKT"}, {@link #methodName()} is the definition — + * a whole PROJ pipeline or a WKT CoordinateOperation, not a label
{@code CONCATENATED_OPERATION}{@link #steps()}; no method, no parameters
+ * + * The {@code PROJ:PROJString} case is not an edge case to defer: it is how all 19 + * {@code other_transformation} rows of the NKG authority are expressed, e.g. + * {@code +proj=deformation +dt=15.829 +grids=eur_nkg_nkgrf17vel.tif}, and the 34 NKG concatenated + * operations are built from them. + *

+ * {@link #accuracy()} is the authority's published figure in metres. Its absence is + * meaningful: PROJ never assigns an accuracy to a ballpark operation, so an empty accuracy on a + * synthesised datum change is the database saying "this is a guess". + */ +public final class DbOperation { + + private final DbObjectType kind; + private final String authName; + private final String code; + private final String name; + private final String methodAuthName; + private final String methodCode; + private final String methodName; + private final DbObjectRef sourceCrs; + private final DbObjectRef targetCrs; + private final double accuracy; + private final List parameters; + private final List gridNames; + private final DbObjectRef interpolationCrs; + private final List steps; + private final String operationVersion; + private final boolean deprecated; + + public DbOperation(DbObjectType kind, String authName, String code, String name, + String methodAuthName, String methodCode, String methodName, + DbObjectRef sourceCrs, DbObjectRef targetCrs, double accuracy, + List parameters, List gridNames, + DbObjectRef interpolationCrs, List steps, + String operationVersion, boolean deprecated) { + this.kind = kind; + this.authName = authName; + this.code = code; + this.name = name; + this.methodAuthName = methodAuthName; + this.methodCode = methodCode; + this.methodName = methodName; + this.sourceCrs = sourceCrs; + this.targetCrs = targetCrs; + this.accuracy = accuracy; + this.parameters = parameters == null + ? Collections.emptyList() + : Collections.unmodifiableList(parameters); + this.gridNames = gridNames == null + ? Collections.emptyList() + : Collections.unmodifiableList(gridNames); + this.interpolationCrs = interpolationCrs; + this.steps = steps == null + ? Collections.emptyList() + : Collections.unmodifiableList(steps); + this.operationVersion = operationVersion; + this.deprecated = deprecated; + } + + /** + * One of the four {@link DbObjectType#isOperation()} constants. + */ + public DbObjectType kind() { + return kind; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** {@code "OSGB36 to WGS 84 (9)"}. The name a caller needs in order to know what was chosen. */ + public String name() { + return name; + } + + /** Null for a concatenated operation. */ + public String methodAuthName() { + return methodAuthName; + } + + /** Null for a concatenated operation. See the class comment for {@code PROJ:PROJString}. */ + public String methodCode() { + return methodCode; + } + + /** + * The method's display name — except when {@link #isProjStringMethod()} or + * {@link #isWktMethod()}, in which case this is the definition itself. + */ + public String methodName() { + return methodName; + } + + /** + * @return {@code true} iff {@link #methodName()} is a literal PROJ string, typically a pipeline. + */ + public boolean isProjStringMethod() { + return "PROJ".equals(methodAuthName) && "PROJString".equals(methodCode); + } + + /** + * @return {@code true} iff {@link #methodName()} is a WKT CoordinateOperation. + */ + public boolean isWktMethod() { + return "PROJ".equals(methodAuthName) && "WKT".equals(methodCode); + } + + public DbObjectRef sourceCrs() { + return sourceCrs; + } + + public DbObjectRef targetCrs() { + return targetCrs; + } + + /** + * Metres, or {@link Double#NaN} if the authority published none. Use {@link #hasAccuracy()} rather + * than comparing, and never substitute a default: an invented accuracy is what lets a ballpark + * operation win a ranking. + */ + public double accuracy() { + return accuracy; + } + + public boolean hasAccuracy() { + return !Double.isNaN(accuracy); + } + + /** + * Present parameters in upstream slot order, absent slots omitted. Unmodifiable. + */ + public List parameters() { + return parameters; + } + + /** + * Grid file names as the authority spells them, in slot order ({@code grid_name} then + * {@code grid2_name}). These are original names, not PROJ names: resolve them through + * {@link ProjDatabase#gridAlternative(String)} to get the modern + * {@code uk_os_OSTN15_NTv2_OSGBtoETRS.tif} form and its format and method. Unmodifiable. + */ + public List gridNames() { + return gridNames; + } + + /** The interpolation CRS, or null. */ + public DbObjectRef interpolationCrs() { + return interpolationCrs; + } + + /** + * Steps in {@code step_number} order for a concatenated operation; empty otherwise. Unmodifiable. + */ + public List steps() { + return steps; + } + + /** The authority's operation version string, or null. */ + public String operationVersion() { + return operationVersion; + } + + public boolean deprecated() { + return deprecated; + } + + public DbObjectRef ref() { + return new DbObjectRef(kind, authName, code); + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + " (" + + (sourceCrs == null ? "?" : sourceCrs.authorityCode()) + " -> " + + (targetCrs == null ? "?" : targetCrs.authorityCode()) + + (hasAccuracy() ? ", " + accuracy + " m" : ", accuracy unknown") + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbOperationStep.java b/core/src/main/java/org/locationtech/proj4j/spi/DbOperationStep.java new file mode 100644 index 0000000..ef22d25 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbOperationStep.java @@ -0,0 +1,86 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * One step of a concatenated operation. + *

+ * {@link #direction()} is upstream's own extension to OGC Topic 2 and is not decorative: a step + * declared {@code REVERSE} must be executed inverted. Upstream's schema comment notes that if the + * direction is set on one step it is set on all steps of that operation, so + * {@link Direction#UNSPECIFIED} is an all-or-nothing property of the parent operation. + */ +public final class DbOperationStep { + + public enum Direction { + FORWARD("forward"), REVERSE("reverse"), + /** Upstream stored NULL: the direction follows from chaining source and target CRSs. */ + UNSPECIFIED(null); + + private final String dbValue; + + Direction(String dbValue) { + this.dbValue = dbValue; + } + + public String dbValue() { + return dbValue; + } + + public static Direction fromDbValue(String v) { + if ("forward".equals(v)) { + return FORWARD; + } + if ("reverse".equals(v)) { + return REVERSE; + } + return UNSPECIFIED; + } + } + + private final int stepNumber; + private final DbObjectRef step; + private final Direction direction; + + public DbOperationStep(int stepNumber, DbObjectRef step, Direction direction) { + this.stepNumber = stepNumber; + this.step = step; + this.direction = direction == null ? Direction.UNSPECIFIED : direction; + } + + /** 1-based. */ + public int stepNumber() { + return stepNumber; + } + + /** + * The referenced operation. Its {@link DbObjectRef#type()} is the concrete operation type, so a + * caller can dispatch without a second lookup — although the step's own parameters do require + * {@link ProjDatabase#operation}. + */ + public DbObjectRef step() { + return step; + } + + public Direction direction() { + return direction; + } + + @Override + public String toString() { + return stepNumber + ": " + step + " " + direction; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbParam.java b/core/src/main/java/org/locationtech/proj4j/spi/DbParam.java new file mode 100644 index 0000000..baeece5 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbParam.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * One parameter of a conversion or a transformation: its authority code, its name, its value, and its + * unit. + *

+ * The value is never pre-converted; see {@link DbUnit}. Parameter identity is + * {@link #authName()}/{@link #code()}, not {@link #name()} — EPSG parameter 8801 is "Latitude of + * natural origin" whatever a given authority chooses to call it, and matching on the display name is + * how a parameter silently binds to the wrong slot. + */ +public final class DbParam { + + private final String authName; + private final String code; + private final String name; + private final double value; + private final DbObjectRef unit; + + public DbParam(String authName, String code, String name, double value, DbObjectRef unit) { + this.authName = authName; + this.code = code; + this.name = name; + this.value = value; + this.unit = unit; + } + + /** The authority that defines the parameter, e.g. {@code "EPSG"}. */ + public String authName() { + return authName; + } + + /** {@code "8801"}. The stable identity of this parameter. */ + public String code() { + return code; + } + + /** {@code "Latitude of natural origin"}. Display only. */ + public String name() { + return name; + } + + /** In {@link #unit()}. */ + public double value() { + return value; + } + + /** The unit the value is expressed in; may be null where the authority left it unset. */ + public DbObjectRef unit() { + return unit; + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + " = " + value + + (unit == null ? "" : " " + unit.authorityCode()); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbPrimeMeridian.java b/core/src/main/java/org/locationtech/proj4j/spi/DbPrimeMeridian.java new file mode 100644 index 0000000..d8587c2 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbPrimeMeridian.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * A prime meridian. {@link #longitude()} is in {@link #unit()} — several are published in grads, which + * is why the unit is carried rather than the value normalised. + */ +public final class DbPrimeMeridian { + + private final String authName; + private final String code; + private final String name; + private final double longitude; + private final DbObjectRef unit; + private final boolean deprecated; + + public DbPrimeMeridian(String authName, String code, String name, double longitude, + DbObjectRef unit, boolean deprecated) { + this.authName = authName; + this.code = code; + this.name = name; + this.longitude = longitude; + this.unit = unit; + this.deprecated = deprecated; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + public String name() { + return name; + } + + /** East of Greenwich, in {@link #unit()}. */ + public double longitude() { + return longitude; + } + + public DbObjectRef unit() { + return unit; + } + + public boolean deprecated() { + return deprecated; + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + " " + longitude; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbSupersession.java b/core/src/main/java/org/locationtech/proj4j/spi/DbSupersession.java new file mode 100644 index 0000000..7dd15df --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbSupersession.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * One {@code supersession} row: this object has been replaced by that one. + *

+ * Distinct from {@code deprecation}, and the distinction matters for operation selection. + * Deprecation says an object should no longer be used at all. Supersession says a + * better operation exists for the same job, and + * {@link #sameSourceTargetCrs()} says whether the replacement connects the same pair of CRSs. A + * superseded operation whose replacement has the same source and target must lose the ranking to that + * replacement; one whose replacement connects a different pair must not, because it is not actually a + * substitute. + */ +public final class DbSupersession { + + private final DbObjectRef superseded; + private final DbObjectRef replacement; + private final String source; + private final boolean sameSourceTargetCrs; + + public DbSupersession(DbObjectRef superseded, DbObjectRef replacement, String source, + boolean sameSourceTargetCrs) { + this.superseded = superseded; + this.replacement = replacement; + this.source = source; + this.sameSourceTargetCrs = sameSourceTargetCrs; + } + + public DbObjectRef superseded() { + return superseded; + } + + public DbObjectRef replacement() { + return replacement; + } + + /** Who says so; may be null. */ + public String source() { + return source; + } + + /** See the class comment. */ + public boolean sameSourceTargetCrs() { + return sameSourceTargetCrs; + } + + @Override + public String toString() { + return superseded + " superseded by " + replacement + + (sameSourceTargetCrs ? " (same CRS pair)" : " (different CRS pair)"); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/DbUnit.java b/core/src/main/java/org/locationtech/proj4j/spi/DbUnit.java new file mode 100644 index 0000000..5bdd4c8 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/DbUnit.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +/** + * A unit of measure, with the conversion factor to the SI base unit for its {@link #type()}: metres + * for {@code length}, radians for {@code angle}, unity for {@code scale}, seconds for {@code time}. + *

+ * Every parameter value this SPI returns is accompanied by its unit reference and is not + * pre-converted. Silently normalising would hide exactly the class of defect that motivates the work: + * a value in grads or in US survey feet that reads plausibly as radians or metres. + */ +public final class DbUnit { + + /** {@code unit_of_measure.type}, a closed upstream vocabulary. */ + public enum Type { + LENGTH("length"), ANGLE("angle"), SCALE("scale"), TIME("time"); + + private final String dbValue; + + Type(String dbValue) { + this.dbValue = dbValue; + } + + public String dbValue() { + return dbValue; + } + + public static Type fromDbValue(String v) { + if (v != null) { + for (Type t : values()) { + if (t.dbValue.equals(v)) { + return t; + } + } + } + return null; + } + } + + private final String authName; + private final String code; + private final String name; + private final Type type; + private final double conversionFactor; + private final String projShortName; + private final boolean deprecated; + + public DbUnit(String authName, String code, String name, Type type, double conversionFactor, + String projShortName, boolean deprecated) { + this.authName = authName; + this.code = code; + this.name = name; + this.type = type; + this.conversionFactor = conversionFactor; + this.projShortName = projShortName; + this.deprecated = deprecated; + } + + public String authName() { + return authName; + } + + public String code() { + return code; + } + + /** {@code "metre"}, {@code "US survey foot"}, {@code "degree"}. */ + public String name() { + return name; + } + + public Type type() { + return type; + } + + /** + * Factor to the SI base unit, or {@link Double#NaN} for the 11 units upstream leaves null (unit + * codes with no defined ratio, such as {@code EPSG:9203} "coefficient" variants). NaN rather than + * 1.0, because a defaulted factor of one is indistinguishable from a real one and would multiply + * silently. + */ + public double conversionFactor() { + return conversionFactor; + } + + /** + * @return {@code true} iff {@link #conversionFactor()} is a real number. + */ + public boolean hasConversionFactor() { + return !Double.isNaN(conversionFactor); + } + + /** + * PROJ's own short spelling — {@code "m"}, {@code "ft"}, {@code "us-ft"} — or null. This is the + * token that goes into a {@code +units=} or {@code +xy_out=}, so it is the bridge between the + * database and the pipeline engine. + */ + public String projShortName() { + return projShortName; + } + + public boolean deprecated() { + return deprecated; + } + + @Override + public String toString() { + return authName + ":" + code + " " + name + " (" + type + " x" + + (hasConversionFactor() ? Double.toString(conversionFactor) : "?") + ")"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/ProjDatabase.java b/core/src/main/java/org/locationtech/proj4j/spi/ProjDatabase.java new file mode 100644 index 0000000..d0f6524 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/ProjDatabase.java @@ -0,0 +1,281 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import java.io.Closeable; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; + +/** + * Read-only access to a PROJ authority database. The seam between {@code proj4j} core and the optional + * {@code proj4j-db} artifact. + * + *

Why this is an interface in core and not a class

+ * Core has zero runtime dependencies and must keep them. A JDBC SQLite driver needs a + * native library; extracting a database to a temporary file needs a filesystem we do not control. Both + * are worse than the problem they solve for a consumer whose whole reason for being here is to delete + * Apache SIS and the {@code catch (LinkageError)} that kills their Spark executors. So core declares + * the questions, and an optional artifact answers them from a build-time-transcoded, read-only index. + * With no implementation on the classpath, the facade reports honestly — {@code databaseVersion()} + * empty, {@code areaOfUse()} empty — and never silently degrades to a plausible number. + * + *

Contract

+ *
    + *
  • Absence is null, not an exception. Every single-object lookup returns + * {@code null} for "no such object", matching + * {@code org.locationtech.proj4j.resource.ResourceResolver#resolve}. A code that does not exist + * is data, not a programming error; it becomes {@code UNKNOWN_CRS} one layer up, where the + * caller's string is still in hand.
  • + *
  • Every list is unmodifiable, non-null, and totally ordered. Never null for + * "none". The order is specified per method and is a pure function of the database bytes — never + * of hash iteration, insertion order, or which index a row was found through. Determinism is not + * a nicety here: identical inputs must produce bitwise-identical outputs across Spark + * executors.
  • + *
  • Values are returned in the authority's own units, unconverted, each with its + * unit reference. See {@link DbUnit}.
  • + *
  • Thread-safe. Every method must be safe for unsynchronised concurrent + * invocation, and must not hold a lock across I/O. Returned objects are immutable.
  • + *
  • No network access, ever, and no consultation of environment variables or the + * process working directory. An implementation obtains its bytes through + * {@code org.locationtech.proj4j.resource.ResourceResolver}.
  • + *
  • {@code authName} and {@code code} comparisons are exact and case-sensitive. + * Authority names are upper-case upstream; normalising them here would make + * {@code "epsg"} work in some deployments and not others.
  • + *
+ * + *

What this does not do

+ * Operation selection — ranking candidates, applying {@code BallparkPolicy}, deciding what to + * throw — is the facade's job, not the database's. This interface reports what the authority published; + * it has no policy. That split is deliberate: policy is testable without 10 MB of data, and the data is + * testable without the policy. + */ +public interface ProjDatabase extends Closeable { + + /** + * A short, stable identifier for this database, suitable for a log line and for + * {@code describeResolution()}, e.g. + * {@code "pjdx:classpath:/proj4j-data/db/proj4j-db.pjdx"}. Must name where the bytes came from, + * because that is the single most useful datum when two executors disagree about a coordinate. + */ + String name(); + + /** + * The database's own {@code metadata} table, verbatim: {@code PROJ.VERSION}, {@code EPSG.VERSION}, + * {@code EPSG.DATE}, {@code ESRI.VERSION}, {@code IGNF.VERSION}, {@code IAU.VERSION}, + * {@code NKG.VERSION}, {@code PROJ_DATA.VERSION}, + * {@code DATABASE.LAYOUT.VERSION.MAJOR}/{@code .MINOR}. + *

+ * Unmodifiable and iterating in key order. This is one of the two independent sources + * {@code DatabaseInfo} cross-checks; the other is the build-stamped sidecar shipped alongside the + * index. They must agree. + */ + Map metadata(); + + /** + * Every authority that owns at least one object, e.g. + * {@code [EPSG, ESRI, IAU_2015, IGNF, NKG, NRCAN, OGC, PROJ]}. Unmodifiable, sorted. + */ + SortedSet authorities(); + + // ---------------------------------------------------------------- CRSs + + /** + * Looks up a CRS across all five CRS tables in one search. + *

+ * {@code (authName, code)} is unique across those tables — verified, zero collisions in the shipped + * database — so no disambiguation is needed and none is offered. + * + * @return the CRS, or {@code null}. Deprecated CRSs are returned; see + * {@link DbCrs#deprecated()} and {@link #replacementsFor}. + */ + DbCrs crs(String authName, String code); + + /** + * Every CRS of the given authority, sorted by {@link DbObjectRef} order. Unmodifiable. + *

+ * @param authName the authority, or {@code null} for all authorities + */ + List crsCodes(String authName); + + /** @return the coordinate system with its axes in authority order, or {@code null}. */ + DbCoordinateSystem coordinateSystem(String authName, String code); + + // ------------------------------------------------------- datums and their parts + + /** + * @param type must be {@link DbObjectType#GEODETIC_DATUM} or {@link DbObjectType#VERTICAL_DATUM} + * @return the datum, or {@code null} + * @throws IllegalArgumentException if {@code type} is neither datum type + */ + DbDatum datum(DbObjectType type, String authName, String code); + + /** @return the ellipsoid, or {@code null}. */ + DbEllipsoid ellipsoid(String authName, String code); + + /** @return the prime meridian, or {@code null}. */ + DbPrimeMeridian primeMeridian(String authName, String code); + + /** @return the unit of measure, or {@code null}. */ + DbUnit unit(String authName, String code); + + /** @return the celestial body, or {@code null}. */ + DbCelestialBody celestialBody(String authName, String code); + + /** + * Every geodetic or vertical CRS built on a given datum, sorted by {@link DbObjectRef} order. + * Unmodifiable. + *

+ * This is the pivot query for operation search: the authority publishes transformations between + * CRSs, so finding the operations that relate two datums means finding the CRSs on each + * datum first. It is also how a bare {@code +datum=OSGB36} is resolved — and that is not a corner + * case, because 1,962 lines of the shipped legacy dictionaries carry a {@code datum=} and PROJ 9.x + * resolves every one of them through this database rather than through {@code datums.cpp}. + */ + List crsUsingDatum(DbObjectType datumType, String datumAuthName, String datumCode); + + // ---------------------------------------------------------------- conversions + + /** + * The map projection of a projected CRS. + * + * @return the conversion, or {@code null} + */ + DbConversion conversion(String authName, String code); + + // ---------------------------------------------------------------- operations + + /** + * @return the operation, whichever of the four operation tables it lives in, or {@code null} + */ + DbOperation operation(String authName, String code); + + /** + * Operations the authority published in exactly this direction: rows whose + * {@code source_crs} is {@code (srcAuth, srcCode)} and whose {@code target_crs} is + * {@code (tgtAuth, tgtCode)}. + *

+ * Call it twice to get both directions. Swapping the arguments yields the + * operations that must be executed inverted, and the shipped index supports both orders at the + * same cost. This SPI deliberately does not merge them: whether a candidate is being used forwards + * or backwards changes its sign, its grid direction and whether an inverse exists at all, and that + * is exactly the fact a caller must not lose. Merging would hand back a list in which the + * distinction is implicit. + *

+ * Sorted by {@link DbObjectRef} order, i.e. by {@code (kind, authName, code)} — not by + * accuracy, and not by anything else policy-flavoured. Ranking is the facade's job. Includes + * deprecated operations; filter on {@link DbOperation#deprecated()}. Unmodifiable. + */ + List operationsBetween(String srcAuthName, String srcCode, + String tgtAuthName, String tgtCode); + + /** + * Every operation whose {@code source_crs} is the given CRS, as references. Sorted by + * {@link DbObjectRef} order, unmodifiable. + *

+ * References rather than whole operations because this is the fan-out step of a pivot search and is + * expected to be filtered hard before anything is materialised. + */ + List operationsWithSourceCrs(String authName, String code); + + /** + * Every operation whose {@code target_crs} is the given CRS. See + * {@link #operationsWithSourceCrs}. + */ + List operationsWithTargetCrs(String authName, String code); + + // ---------------------------------------------------------------- area of use + + /** + * The extents declared for an object, through the {@code usage} table. + *

+ * An object may have several: {@code EPSG:4326} has one, but transformations routinely have more + * than one usage row. Sorted by {@link DbObjectRef} order of the extent, so the sequence is stable; + * a caller that wants smallest-first should sort by {@link DbExtent#rankingArea()} and break ties + * on the extent code. Unmodifiable, empty if the object declares none. + * + * @param object any object type that appears in {@code usage} — the CRS types, the datum types, and + * {@code conversion} plus the four operation types + */ + List extentsFor(DbObjectRef object); + + /** @return the extent, or {@code null}. */ + DbExtent extent(String authName, String code); + + // ---------------------------------------------------------------- names + + /** + * Alternative names for an object, from {@code alias_name}. Sorted, unmodifiable. + */ + List aliases(DbObjectRef object); + + /** + * CRSs whose name or alias matches {@code name}. + *

+ * Matching ignores case, and ignores runs of whitespace, {@code _} and {@code -} — so + * {@code "WGS 84 / UTM zone 31N"}, {@code "WGS_84___UTM_zone_31N"} and + * {@code "wgs84/utmzone31n"} all find the same CRS. It does not do fuzzy or + * substring matching: a caller that mistypes a name gets an empty list, not a nearby CRS. + *

+ * Sorted by {@link DbObjectRef} order, so a name shared by several CRSs — and there are + * duplicates upstream — yields a stable list rather than an arbitrary first hit. Unmodifiable. + */ + List findCrsByName(String name); + + // ------------------------------------------------- deprecation and supersession + + /** + * {@code supersession} rows in which {@code object} is the superseded one. Sorted by the + * replacement's {@link DbObjectRef} order, unmodifiable. + */ + List supersededBy(DbObjectRef object); + + /** + * {@code deprecation} rows for a deprecated object: what the authority says to use instead. Sorted + * by {@link DbObjectRef} order, unmodifiable, and empty for an object that is not deprecated. + *

+ * Kept separate from {@link #supersededBy} because the two mean different things — see + * {@link DbSupersession}. + */ + List replacementsFor(DbObjectRef object); + + // ---------------------------------------------------------------- grids + + /** + * @param originalGridName the name as an operation spells it, from + * {@link DbOperation#gridNames()} + * @return the mapping to the file PROJ would read, or {@code null} if the authority name is already + * the PROJ name or is simply unknown + */ + DbGridAlternative gridAlternative(String originalGridName); + + /** + * Every {@code grid_alternatives} row, sorted by {@link DbGridAlternative#originalGridName()}. + * Unmodifiable. Used to cross-join the resolver chain's enumerable resolvers into + * {@code Proj.availableGrids()}, so that "cannot enumerate" is never reported as "nothing + * installed". + */ + List gridAlternatives(); + + /** + * Releases any resources held. Implementations must be idempotent, and must tolerate being called + * while other threads are still reading — a database handed to a {@code ProjContext} outlives the + * caller's stack frame. + */ + @Override + void close() throws IOException; +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/ProjDatabaseProvider.java b/core/src/main/java/org/locationtech/proj4j/spi/ProjDatabaseProvider.java new file mode 100644 index 0000000..468fe0b --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/ProjDatabaseProvider.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; + +/** + * Factory for a {@link ProjDatabase}, discoverable through {@link ServiceLoader}. + * + *

Discovery is opt-in, and that is the point

+ * Core never scans for a provider implicitly. An implicit {@code ServiceLoader} walk + * touches a classpath proj4j does not control, and that is precisely how a library minding its own + * business triggers a {@code LinkageError} in somebody else's jar — the failure mode this whole design + * exists to remove. {@link #discover(ClassLoader)} runs only when an application calls it, or when it hands the + * result to {@code ProjContext.Builder}. + * + *

Duplicates are rejected, not ordered by luck

+ * {@link #discover(ClassLoader)} sorts by {@code (priority(), name())} and throws if two providers + * share both. {@code ServiceLoader} iteration order follows classpath order, which varies between a + * shaded jar, an IDE and a Spark executor; picking one arbitrarily would make the choice of database a + * property of the deployment rather than of the code. This mirrors + * {@code org.locationtech.proj4j.resource.ResourceResolvers}, deliberately. + */ +public interface ProjDatabaseProvider { + + /** + * A stable identifier, e.g. {@code "pjdx"}. Must not be null or empty, and must not vary between + * runs. + */ + String name(); + + /** + * Lower runs first. Ties are broken by {@link #name()}; two providers with the same + * {@code (priority, name)} are a configuration error and are rejected. + */ + int priority(); + + /** + * Opens the database. + * + * @return an open database, or {@code null} if this provider's data is not on the classpath. Null + * rather than an exception, so that "the artifact is absent" is distinguishable from "the + * artifact is present and corrupt" — the second must throw. + * @throws IOException if the data is present but unreadable, mis-versioned, or fails its integrity + * check. Never swallow that: a silently absent database degrades to a + * plausible wrong answer. + */ + ProjDatabase open() throws IOException; + + /** + * All providers visible to {@code loader}, sorted by {@code (priority, name)}. + * + * @param loader the class loader to scan, or {@code null} for this class's own loader + * @return an unmodifiable, sorted list; empty if no {@code proj4j-db}-style artifact is present + * @throws IllegalStateException if two providers share a {@code (priority, name)} pair + */ + static List discover(ClassLoader loader) { + ServiceLoader sl = loader == null + ? ServiceLoader.load(ProjDatabaseProvider.class, ProjDatabaseProvider.class.getClassLoader()) + : ServiceLoader.load(ProjDatabaseProvider.class, loader); + List found = new ArrayList(); + for (Iterator it = sl.iterator(); it.hasNext(); ) { + ProjDatabaseProvider p = it.next(); + if (p.name() == null || p.name().isEmpty()) { + throw new IllegalStateException( + "ProjDatabaseProvider " + p.getClass().getName() + " has no name()"); + } + found.add(p); + } + Collections.sort(found, new Comparator() { + @Override + public int compare(ProjDatabaseProvider a, ProjDatabaseProvider b) { + int c = Integer.compare(a.priority(), b.priority()); + return c != 0 ? c : a.name().compareTo(b.name()); + } + }); + for (int i = 1; i < found.size(); i++) { + ProjDatabaseProvider a = found.get(i - 1); + ProjDatabaseProvider b = found.get(i); + if (a.priority() == b.priority() && a.name().equals(b.name())) { + throw new IllegalStateException("Two ProjDatabaseProviders share (priority, name) = (" + + a.priority() + ", " + a.name() + "): " + a.getClass().getName() + " and " + + b.getClass().getName() + + ". Which one wins would otherwise depend on classpath order."); + } + } + return Collections.unmodifiableList(found); + } + + /** + * The first provider that yields a database, in {@code (priority, name)} order. + * + * @return an open database, or {@code null} if no provider has data + * @throws IOException if a provider's data is present but unreadable + * @throws IllegalStateException on a duplicate {@code (priority, name)} + */ + static ProjDatabase openFirst(ClassLoader loader) throws IOException { + for (ProjDatabaseProvider p : discover(loader)) { + ProjDatabase db = p.open(); + if (db != null) { + return db; + } + } + return null; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/spi/package-info.java b/core/src/main/java/org/locationtech/proj4j/spi/package-info.java new file mode 100644 index 0000000..652c12d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/spi/package-info.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * The optional-artifact seams. Interfaces and immutable value types only — no + * implementation, no data, and nothing outside {@code java.*} and + * {@code org.locationtech.proj4j.*}. + *

+ * {@link org.locationtech.proj4j.spi.ProjDatabase} is the authority-database seam, answered by the + * optional {@code proj4j-db} artifact. Core compiles, runs and passes its tests with no implementation + * present; the facade then reports the absence honestly rather than substituting a plausible number. + *

+ * Three properties hold across this package, and each one is here because its absence has cost + * somebody real money: + *

    + *
  • Zero runtime dependencies. Nothing here references a driver, a parser, a + * logging framework or {@code org.opengis.*}. A build-time scan of core's constant pool for + * {@code org/opengis/} must stay at zero, because a consumer's whole reason for adopting this API + * is to delete Apache SIS and the {@code catch (LinkageError)} over a duplicate + * {@code org.opengis.util.CodeList} that kills their Spark executors.
  • + *
  • Determinism. Every collection returned by an SPI method is totally ordered by + * a rule stated in its javadoc, and that rule is a function of the data alone — never of hash + * iteration order, {@code ServiceLoader} discovery order, or classpath layout. Two executors + * given the same inputs must produce the same bytes.
  • + *
  • No ambient state. No environment variables, no system properties, no process + * working directory, no network. Files are located only through + * {@link org.locationtech.proj4j.resource.ResourceResolver}.
  • + *
+ * + * @see org.locationtech.proj4j.spi.ProjDatabase + * @see org.locationtech.proj4j.spi.ProjDatabaseProvider + */ +package org.locationtech.proj4j.spi; diff --git a/core/src/main/java/org/locationtech/proj4j/units/AngleFormat.java b/core/src/main/java/org/locationtech/proj4j/units/AngleFormat.java index 2ea86d0..23f9803 100644 --- a/core/src/main/java/org/locationtech/proj4j/units/AngleFormat.java +++ b/core/src/main/java/org/locationtech/proj4j/units/AngleFormat.java @@ -28,6 +28,8 @@ */ public class AngleFormat extends NumberFormat { + private static final long serialVersionUID = -1805856094196103692L; + public static final char CH_MIN_SYMBOL = '\''; public static final String STR_SEC_SYMBOL = "\""; public static final char CH_DEG_SYMBOL = '\u00b0'; @@ -87,7 +89,7 @@ public StringBuffer format(double number, StringBuffer result, FieldPosition fie } } - double ddmmss = isDegrees ? number : Math.toDegrees(number); + double ddmmss = isDegrees ? number : ProjectionMath.toDeg(number); int iddmmss = (int)Math.round(ddmmss * 3600); if (iddmmss < 0) iddmmss = -iddmmss; @@ -196,7 +198,7 @@ public Number parse(String text, ParsePosition parsePosition) { } else { result = Double.parseDouble(text); if (!isDegrees) - result = Math.toRadians(result); + result = ProjectionMath.toRad(result); } if (parsePosition != null) parsePosition.setIndex(text.length()); diff --git a/core/src/main/java/org/locationtech/proj4j/units/Unit.java b/core/src/main/java/org/locationtech/proj4j/units/Unit.java index 7bff6ec..df9c403 100644 --- a/core/src/main/java/org/locationtech/proj4j/units/Unit.java +++ b/core/src/main/java/org/locationtech/proj4j/units/Unit.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.text.NumberFormat; +import java.util.Locale; import java.util.Objects; public class Unit implements Serializable { @@ -31,12 +32,34 @@ public class Unit implements Serializable { public String name, plural, abbreviation; public double value; + + /** + * The display formatter, deliberately left on the default locale: {@link #format(double)} + * and its overloads render a measurement for a human, and a reader in Germany should see a + * decimal comma. Do not use it to read a value back -- see {@link #PARSE}. + */ public static final NumberFormat format; + /** + * The parsing formatter, pinned to {@link Locale#ROOT}, because + * {@link #parse(String)} reads a machine-written value out of a CRS definition and those are + * always ASCII with a decimal point. + * + *

Measured on Temurin 21 with the default-locale formatter this method used to share: + * {@code parse("1.5")} returns 15 under {@code de_DE} and {@code tr_TR} (the point is + * read as a grouping separator) and 1 under {@code lt_LT} and {@code ar_EG} (the point + * terminates the number). Only {@code Locale.ROOT} returns 1.5 everywhere. + */ + private static final NumberFormat PARSE; + static { format = NumberFormat.getNumberInstance(); format.setMaximumFractionDigits(2); format.setGroupingUsed(false); + + PARSE = NumberFormat.getNumberInstance(Locale.ROOT); + PARSE.setMaximumFractionDigits(2); + PARSE.setGroupingUsed(false); } public Unit(String name, String plural, String abbreviation, double value) { @@ -56,7 +79,7 @@ public double fromBase(double n) { public double parse(String s) throws NumberFormatException { try { - return format.parse(s).doubleValue(); + return PARSE.parse(s).doubleValue(); } catch (java.text.ParseException e) { throw new NumberFormatException(e.getMessage()); @@ -94,9 +117,36 @@ public boolean equals(Object o) { return false; } + /** + * {@inheritDoc} + * + *

Bit-identical to the {@code Objects.hash(getClass(), name, value)} it replaces, and + * deliberately so. {@code Objects.hash} is specified as + * {@code Arrays.hashCode(new Object[]{...})}, i.e. the {@code 31}-chain below seeded with 1, so + * every value this returns is the value it always returned. What is gone is the allocation: + * an {@code Object[3]} and a {@code Double} box, measured at 56 B/op, on the + * transform-cache lookup path — {@code Projection.hashCode} calls {@code getUnits().hashCode()} + * and {@code CoordinateReferenceSystem.hashCode} calls that, so it is paid on every cache probe. + * + *

Keeping the value identical is not fastidiousness: a changed hash reorders every + * {@code HashMap} keyed on a {@code Unit}, a {@code Projection} or a CRS, and this repository + * measures behaviour with a 53,430-row golden master. An optimisation that also perturbs + * iteration order is two changes reported as one. + * + *

Two pre-existing inconsistencies are preserved rather than fixed here, because fixing + * either would change the value: {@code equals} ignores {@code getClass()} while this + * includes it, and {@code equals} compares {@code value} with {@code ==} (under which + * {@code -0.0} equals {@code 0.0}) while {@code Double.hashCode} separates them. Neither is + * reachable today — {@code Unit} has no subclass with an equal name, and no unit has a scale + * factor of zero — but they belong in whatever change owns this class next. + */ @Override public int hashCode() { - return Objects.hash(this.getClass(), name, value); + int h = 1; + h = 31 * h + this.getClass().hashCode(); + h = 31 * h + (name == null ? 0 : name.hashCode()); + h = 31 * h + Double.hashCode(value); + return h; } } diff --git a/core/src/main/java/org/locationtech/proj4j/units/Units.java b/core/src/main/java/org/locationtech/proj4j/units/Units.java index 075ca81..aa159ea 100644 --- a/core/src/main/java/org/locationtech/proj4j/units/Units.java +++ b/core/src/main/java/org/locationtech/proj4j/units/Units.java @@ -16,11 +16,48 @@ package org.locationtech.proj4j.units; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The unit tables. + * + *

Which table {@code +units} uses, and why {@code rad} is not in it

+ * + *

PROJ keeps two unit tables in {@code src/units.cpp}: {@code pj_units}, the + * linear table of 21 ids, and {@code pj_angular_units}, holding just + * {@code rad}, {@code deg} and {@code grad}. {@code +units} and {@code +vunits} are + * resolved against {@code pj_list_linear_units()} alone ({@code init.cpp:679,718}), + * so an angular id is an error there, not a conversion. Verified against the + * installed 9.8.1 build: + * + *

+ * $ echo "2 1" | proj +proj=merc +ellps=GRS80 +units=rad
+ * merc: Invalid value for units          # and identically for +units=deg, +units=grad
+ * 
+ * + *

{@link #units}, the table {@link #findUnits(String)} searches, therefore carries + * PROJ's 21 linear ids and nothing else beyond {@link #DEGREES} — which is retained + * only because Proj4J's own {@code LongLatProjection} and {@code geoapi} module look + * units up by the {@code "deg"}/{@code "degrees"} symbol. {@link #RADIANS}, + * {@link #GRADS}, {@link #ARC_MINUTES}, {@link #ARC_SECONDS} and {@link #POINTS} are + * declared but deliberately kept out of it: they are not {@code +units} names in PROJ, + * and putting them there would make Proj4J accept definitions PROJ rejects. + * + *

The metres fallback

+ * + *

{@link #findUnits(String)} returns {@link #METRES} for a name it does not know + * rather than {@code null}, which is why {@code +units=} has always been + * silently metres. That behaviour is preserved for compatibility; detection of the + * fallback belongs to the caller, and + * {@code Proj4Parser.ParseMode#STRICT} does exactly that. + */ public class Units { // Angular units public final static Unit DEGREES = new DegreeUnit(); - public final static Unit RADIANS = new Unit("radian", "radians", "rad", Math.toDegrees(1)); + public final static Unit RADIANS = new Unit("radian", "radians", "rad", ProjectionMath.toDeg(1)); + /** {@code grad} — 400 to the turn. PROJ's third angular unit ({@code units.cpp}). */ + public final static Unit GRADS = new Unit("grad", "grads", "grad", 0.9); public final static Unit ARC_MINUTES = new Unit("arc minute", "arc minutes", "min", 1/60.0); public final static Unit ARC_SECONDS = new Unit("arc second", "arc seconds", "sec", 1/3600.0); @@ -48,20 +85,63 @@ public class Units { public final static Unit US_FEET = new Unit("U.S. foot", "U.S. feet", "us-ft", 0.304800609601219); public final static Unit US_INCHES = new Unit("U.S. inch", "U.S. inches", "us-in", 1.0/39.37); + // Indian units. Present in PROJ's pj_units, absent from Proj4J until now, so + // +units=ind-yd silently scaled by 1 instead of by 0.91439523 - a 9% error. + public final static Unit INDIAN_YARDS = new Unit("Indian yard", "Indian yards", "ind-yd", 0.91439523); + public final static Unit INDIAN_FEET = new Unit("Indian foot", "Indian feet", "ind-ft", 0.30479841); + public final static Unit INDIAN_CHAINS = new Unit("Indian chain", "Indian chains", "ind-ch", 20.11669506); + // Miscellaneous units public final static Unit FATHOMS = new Unit("fathom", "fathoms", "fath", 1.8288); public final static Unit LINKS = new Unit("link", "links", "link", 0.201168); + /** Not a PROJ {@code +units} name; see the class comment. */ public final static Unit POINTS = new Unit("point", "points", "point", 0.0254/72.27); - public static Unit[] units = { - DEGREES, + /** + * PROJ's 21 linear unit ids ({@code pj_units} in {@code src/units.cpp}), in that + * file's order. These are exactly the names {@code +units} and {@code +vunits} + * accept. + */ + public static final Unit[] LINEAR_UNITS = { KILOMETRES, METRES, DECIMETRES, CENTIMETRES, MILLIMETRES, - MILES, YARDS, FEET, INCHES, - US_MILES, US_YARDS, US_FEET, US_INCHES, - NAUTICAL_MILES + NAUTICAL_MILES, + INCHES, FEET, YARDS, MILES, + FATHOMS, CHAINS, LINKS, + US_INCHES, US_FEET, US_YARDS, US_CHAINS, US_MILES, + INDIAN_YARDS, INDIAN_FEET, INDIAN_CHAINS }; + /** + * PROJ's 3 angular unit ids ({@code pj_angular_units}). Reachable through + * {@code +proj=unitconvert}'s {@code +xy_in}/{@code +xy_out}, not through + * {@code +units}. + */ + public static final Unit[] ANGULAR_UNITS = {RADIANS, DEGREES, GRADS}; + + /** + * The table {@link #findUnits(String)} searches: PROJ's linear units, plus + * {@link #DEGREES} for Proj4J's own {@code +proj=longlat} handling. + *

+ * Kept as a mutable public field for source compatibility; prefer + * {@link #LINEAR_UNITS}. + */ + public static Unit[] units = concat(new Unit[]{DEGREES}, LINEAR_UNITS); + + private static Unit[] concat(Unit[] head, Unit[] tail) { + Unit[] all = new Unit[head.length + tail.length]; + System.arraycopy(head, 0, all, 0, head.length); + System.arraycopy(tail, 0, all, head.length, tail.length); + return all; + } + + /** + * Looks a unit up by name, plural or abbreviation. + * + * @return the unit, or {@link #METRES} when {@code name} is not a known unit — + * never {@code null}. Callers that must distinguish the two have to + * check whether the returned unit actually answers to {@code name}. + */ public static Unit findUnits(String name) { for (int i = 0; i < units.length; i++) { if (name.equals(units[i].name) || name.equals(units[i].plural) || name.equals(units[i].abbreviation)) @@ -70,6 +150,17 @@ public static Unit findUnits(String name) { return METRES; } + /** + * Whether {@code name} really is one of the units in {@link #units}, as opposed to + * a name for which {@link #findUnits(String)} substituted {@link #METRES}. + */ + public static boolean isKnownUnit(String name) { + if (name == null) + return false; + Unit unit = findUnits(name); + return name.equals(unit.name) || name.equals(unit.plural) || name.equals(unit.abbreviation); + } + public static double convert(double value, Unit from, Unit to) { if (from == to) return value; diff --git a/core/src/main/java/org/locationtech/proj4j/util/AuthalicLat.java b/core/src/main/java/org/locationtech/proj4j/util/AuthalicLat.java new file mode 100644 index 0000000..bbe979f --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/AuthalicLat.java @@ -0,0 +1,299 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * The authalic (equal-area) latitude {@code xi} and its inverse, a port of PROJ 9.8.1's + * {@code src/latitudes.cpp:55-155} ({@code pj_authalic_lat_q}, + * {@code pj_authalic_lat_compute_coeffs}, {@code pj_authalic_lat}, + * {@code pj_authalic_lat_inverse}). + * + *

This is the largest accuracy win in the numerical core. proj4j's + * {@code ProjectionMath.authset}/{@code authlat} is the same idea but only third order, + * and measured on GRS80 it is 1.58 mm off at latitude 20.8 degrees against the + * 0.1 mm bar that {@code aea}'s inverse conformance assertions set — sixteen times the + * bar, and it moves {@code laea}, {@code aea}, {@code cea}, {@code eqearth}, + * {@code healpix} and {@code nzmg}. The order-6 series here is sub-nanometre. + * + *

The series is always used for real ellipsoids. + * {@code PROJ_AUTHALIC_SERIES_VALID(n)} is {@code |n| < 0.01}; every Earth ellipsoid has + * {@code n} about 0.00168, so the series branch is always taken and there is never + * any iteration. The Newton fallback exists only for very oblate bodies and the + * synthetic conformance cases such as {@code +proj=aea +a=9999999 +b=.9}. + * + *

The forward direction changes semantics. 9.8.1 no longer computes + * {@code asin(q(sin phi) / qp)} when the series is valid; it applies the direct + * {@code phi -> xi} series, because the {@code asin} form loses relative accuracy at the + * poles. {@link #q} stays public because {@code laea} and {@code aea} still need the raw + * value ({@code laea.cpp:39}: {@code q = sin(xi) * qp}). + * + *

Instances are immutable and thread safe. Construct one per ellipsoid. + * + *

Math vs StrictMath: {@code exp}/{@code log} routes through + * {@link MathHelpers#atanh}, which uses {@code StrictMath.log1p}; {@code sin} and + * {@code cos} use {@link FastStrictTrig} because HotSpot's + * {@code Math.sin}/{@code Math.cos} intrinsics differ between x86-64 and AArch64, and + * because {@code StrictMath.sin}/{@code cos} — which {@code FastStrictTrig} reproduces + * bit for bit — allocate a {@code double[2]} per call from JDK 21 onward. (21, not 17: + * through 17 those two are still {@code native} JNI calls into compiled fdlibm and + * allocate nothing — see {@link FastStrictTrig} for the evidence.) + * {@code asin} has no intrinsic today but is named on {@code StrictMath} for the same + * insurance. {@link Math#sqrt} and {@link Math#abs} are exact and used directly. + * + * @see AuxLat + * @see Clenshaw6 + */ +public final strictfp class AuthalicLat implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + /** {@code PROJ_AUTHALIC_SERIES_VALID(n)} is {@code fabs(n) < 0.01}. */ + private static final double SERIES_CUTOFF = 0.01; + + /** Below this eccentricity {@code q} degenerates to {@code 2 sin(phi)}. */ + private static final double E_EPSILON = 1e-7; + + /** Newton tolerance for the large-flattening fallback. */ + private static final double NEWTON_TOL = 1e-15; + + /** Newton iteration cap for the large-flattening fallback. */ + private static final int NEWTON_MAX_ITER = 10; + + private final double e; + private final double es; + private final double oneEs; + private final double n; + private final double qp; + private final boolean seriesValid; + + /** {@code xi -> phi}; upstream's {@code APA[0..Lmax-1]}. Always present. */ + private final Clenshaw6 xiToPhi; + + /** + * {@code phi -> xi}; upstream's {@code APA[Lmax..2*Lmax-1]}, allocated only when the + * series is valid. + */ + private final Clenshaw6 phiToXi; + + /** + * Builds the authalic-latitude machinery for an ellipsoid. + * + * @param es the squared first eccentricity + */ + public AuthalicLat(double es) { + this.es = es; + this.e = Math.sqrt(es); + this.oneEs = 1.0 - es; + this.n = AuxLat.thirdFlattening(es); + this.seriesValid = Math.abs(n) < SERIES_CUTOFF; + this.xiToPhi = Clenshaw6.forConversion(n, AuxLat.AUTHALIC, AuxLat.GEOGRAPHIC); + this.phiToXi = seriesValid + ? Clenshaw6.forConversion(n, AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC) + : null; + this.qp = q(1.0); + } + + /** + * Builds the machinery from the semi-axes, using PROJ's two-step shape derivation + * ({@code f = (a - b) / a} then {@code es = 2f - f^2}) rather than + * {@code es = 1 - b^2/a^2}. The two are algebraically equal and differ by about + * 1 ulp. + * + * @param a the semi-major axis + * @param b the semi-minor axis + * @return the machinery for that ellipsoid + */ + public static AuthalicLat fromAxes(double a, double b) { + final double f = (a - b) / a; + return new AuthalicLat(2.0 * f - f * f); + } + + /** + * The coefficient {@code q} such that the authalic latitude is + * {@code asin(q / qp)}. Snyder (3-11) and (3-12); port of + * {@code pj_authalic_lat_q}. + * + *

Snyder writes the second term as {@code 0.5 * log((1 - e sin phi)/(1 + e sin phi))}, + * which is {@code -atanh(e sin phi)}. proj4j's {@code ProjectionMath.qsfn} uses the + * logarithmic form and loses relative accuracy near {@code phi = 0} to cancellation; + * {@link MathHelpers#atanh} does not. + * + *

Returns {@link Double#POSITIVE_INFINITY} rather than dividing by zero when + * {@code 1 - (e sin phi)^2} underflows to exactly zero, matching upstream's + * {@code HUGE_VAL}. + * + * @param sinphi {@code sin(phi)} + * @return {@code q} + */ + public double q(double sinphi) { + if (e >= E_EPSILON) { + final double eSinphi = e * sinphi; + final double oneMinusESinphiSq = 1.0 - eSinphi * eSinphi; + if (oneMinusESinphiSq == 0.0) { + // Avoid zero division, fail gracefully, as upstream does. + return Double.POSITIVE_INFINITY; + } + return oneEs * (sinphi / oneMinusESinphiSq + MathHelpers.atanh(eSinphi) / e); + } + return 2.0 * sinphi; + } + + /** + * {@code q} evaluated at {@code phi = 90} degrees, i.e. {@code q(1.0)}. Callers such + * as {@code laea} and {@code aea} need it directly. + * + * @return {@code qp} + */ + public double qp() { + return qp; + } + + /** + * The authalic latitude {@code xi} from the geographic latitude. Port of + * {@code pj_authalic_lat}. + * + *

When the series is valid — always, for Earth ellipsoids — this is the direct + * {@code phi -> xi} Clenshaw sum. Otherwise it falls back to + * {@code asin(q / qp)}, clamped for rounding error; that form is ill-conditioned + * near the poles, which is precisely why it is not used when the series applies. + * + * @param phi the geographic latitude, radians + * @param sinphi {@code sin(phi)} + * @param cosphi {@code cos(phi)} + * @return the authalic latitude, radians + */ + public double forward(double phi, double sinphi, double cosphi) { + if (seriesValid) { + return phiToXi.convert(phi, sinphi, cosphi); + } + double ratio = q(sinphi) / qp; + if (Math.abs(ratio) > 1.0) { + ratio = ratio > 0.0 ? 1.0 : -1.0; // Rounding error. + } + return StrictMath.asin(ratio); + } + + /** + * The authalic latitude {@code xi} from the geographic latitude, computing the sine + * and cosine internally. + * + * @param phi the geographic latitude, radians + * @return the authalic latitude, radians + */ + public double forward(double phi) { + return forward(phi, FastStrictTrig.sin(phi), FastStrictTrig.cos(phi)); + } + + /** + * The geographic latitude from the authalic latitude {@code beta}. Port of + * {@code pj_authalic_lat_inverse}. + * + *

The {@code xi -> phi} Clenshaw sum is the whole answer when {@code |n| < 0.01}. + * Otherwise it seeds at most {@value #NEWTON_MAX_ITER} Newton steps on + *

+     *   f(phi) = qp sin(beta)/(1-e^2) - q(phi)/(1-e^2) = 0
+     *   df/dphi = -2 (1-e^2) cos(phi) / (1 - e^2 sin^2 phi)^2
+     * 
+ * with tolerance {@value #NEWTON_TOL}. That refinement is subject to large roundoff + * near the poles, which is why it runs only when the series is not accurate. + * + *

The loop's exit test is written {@code !(Math.abs(dphi) >= NEWTON_TOL)}, as + * upstream writes it, so that a {@code NaN} step terminates rather than exhausting + * the cap. + * + * @param beta the authalic latitude, radians + * @return the geographic latitude, radians + */ + public double inverse(double beta) { + double phi = xiToPhi.convert(beta); + if (seriesValid) { + return phi; + } + final double q = FastStrictTrig.sin(beta) * qp; + final double qDivOneMinusEs = q / oneEs; + for (int i = 0; i < NEWTON_MAX_ITER; ++i) { + final double sinphi = FastStrictTrig.sin(phi); + final double cosphi = FastStrictTrig.cos(phi); + final double oneMinusEsSin2phi = 1.0 - es * (sinphi * sinphi); + final double dphi = (oneMinusEsSin2phi * oneMinusEsSin2phi) / (2.0 * cosphi) + * (qDivOneMinusEs - sinphi / oneMinusEsSin2phi + - MathHelpers.atanh(e * sinphi) / e); + if (!(Math.abs(dphi) >= NEWTON_TOL)) { + break; + } + phi += dphi; + } + return phi; + } + + /** + * Whether the order-6 series is accurate enough to be used on its own, i.e. + * {@code |n| < 0.01}. False implies {@link #inverse} iterates and {@link #forward} + * uses the {@code asin} form. + * + * @return true if the series branch is taken + */ + public boolean isSeriesValid() { + return seriesValid; + } + + /** + * The first eccentricity. + * + * @return {@code e} + */ + public double eccentricity() { + return e; + } + + /** + * The squared first eccentricity. + * + * @return {@code es} + */ + public double eccentricitySquared() { + return es; + } + + /** + * The third flattening this instance was built for. + * + * @return {@code n} + */ + public double thirdFlattening() { + return n; + } + + /** + * The {@code phi -> xi} evaluator, or {@code null} when the series is not valid. + * + * @return the forward Clenshaw evaluator, possibly {@code null} + */ + public Clenshaw6 forwardSeries() { + return phiToXi; + } + + /** + * The {@code xi -> phi} evaluator. Always present; upstream uses it as the Newton + * seed when the series alone is insufficient. + * + * @return the inverse Clenshaw evaluator + */ + public Clenshaw6 inverseSeries() { + return xiToPhi; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/AuxLat.java b/core/src/main/java/org/locationtech/proj4j/util/AuxLat.java new file mode 100644 index 0000000..65210c1 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/AuxLat.java @@ -0,0 +1,324 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * Auxiliary-latitude series coefficients, a port of PROJ 9.8.1's + * {@code src/latitudes.cpp:238-420} ({@code pj_auxlat_coeffs}, {@code pj_polyval}, + * {@code pj_rectifying_radius}). + * + *

The framework is Karney's, On auxiliary latitudes, Survey Review 56, + * 165-180 (2024). Conversions between any pair of auxiliary latitudes are Fourier + * series in the source latitude whose coefficients are Taylor series in the third + * flattening {@code n}, truncated at order 6. That suffices for full double + * precision for {@code |f| <= 1/150} and is satisfactory for {@code |f| <= 1/50}. + * + *

The coefficient table is machine generated by the Maxima script + * {@code auxlat.mac} bundled with GeographicLib, and is transcribed here verbatim + * from upstream as exact rational expressions rather than decimal literals, + * so that each entry is the correctly-rounded {@code double} nearest the exact + * rational on every platform. + * + *

Only the upper triangular portion of each matrix is stored, and for the + * conversions among {@code phi, beta, theta, mu} half the coefficients vanish (those + * Taylor series are expansions in {@code n^2}), so the zero entries are excluded too. + * All eight supported matrices are concatenated into one flat 150-element array, + * indexed through {@link #PTRS}. + * + *

Only 8 of the 36 conversions are populated, namely + * {@code phi <-> mu} (meridian distance), {@code phi <-> chi} (transverse Mercator), + * {@code phi <-> xi} (authalic latitude) and {@code chi <-> mu} (transverse Mercator). + * Any other pair throws {@link IllegalArgumentException}. + * + *

Math vs StrictMath: this class performs only {@code + - * /} and + * {@link Math#sqrt}, all of which IEEE-754 specifies as exactly rounded, so every + * coefficient produced here is bit-reproducible across architectures without needing + * {@code StrictMath}. That is the whole point of deriving {@code n} from + * {@code es} with one {@code sqrt} (see {@link #thirdFlattening}) instead of + * upstream's {@code pow(tan(asin(e)/2), 2)}, which routes through three + * platform-dependent libm calls. + * + * @see Clenshaw6 + */ +public final strictfp class AuxLat { + + /** Geographic latitude, phi. */ + public static final int GEOGRAPHIC = 0; + /** Parametric (reduced) latitude, beta. */ + public static final int PARAMETRIC = 1; + /** Geocentric latitude, theta. */ + public static final int GEOCENTRIC = 2; + /** Rectifying latitude, mu. */ + public static final int RECTIFYING = 3; + /** Conformal latitude, chi. */ + public static final int CONFORMAL = 4; + /** Authalic latitude, xi. */ + public static final int AUTHALIC = 5; + + /** The number of auxiliary latitudes. */ + public static final int NUMBER = 6; + + /** + * The order of the expansion in {@code n}. Accidentally equal to + * {@link #NUMBER}; upstream notes the coincidence explicitly. + */ + public static final int ORDER = 6; + + /** + * The flat Maxima-generated coefficient table, 150 doubles. + * + *

Generated by Maxima on 2025-03-23 19:13:00-04:00, transcribed from + * {@code 9.8.1:src/latitudes.cpp:241-336}. Blocks in table order: + * {@code C[phi,mu] C[phi,chi] C[phi,xi] C[mu,phi] C[mu,chi] C[chi,phi] + * C[chi,mu] C[xi,phi]}, where {@code C[eta,zeta]} converts {@code zeta} + * (the input) to {@code eta} (the output). + */ + private static final double[] COEFFS = { + // C[phi,mu]; even coeffs only + 3.0 / 2.0, -27.0 / 32.0, 269.0 / 512.0, 21.0 / 16.0, -55.0 / 32.0, + 6759.0 / 4096.0, 151.0 / 96.0, -417.0 / 128.0, 1097.0 / 512.0, + -15543.0 / 2560.0, 8011.0 / 2560.0, 293393.0 / 61440.0, + // C[phi,chi] + 2.0, -2.0 / 3.0, -2.0, 116.0 / 45.0, 26.0 / 45.0, -2854.0 / 675.0, + 7.0 / 3.0, -8.0 / 5.0, -227.0 / 45.0, 2704.0 / 315.0, 2323.0 / 945.0, + 56.0 / 15.0, -136.0 / 35.0, -1262.0 / 105.0, 73814.0 / 2835.0, + 4279.0 / 630.0, -332.0 / 35.0, -399572.0 / 14175.0, 4174.0 / 315.0, + -144838.0 / 6237.0, 601676.0 / 22275.0, + // C[phi,xi] + 4.0 / 3.0, 4.0 / 45.0, -16.0 / 35.0, -2582.0 / 14175.0, + 60136.0 / 467775.0, 28112932.0 / 212837625.0, 46.0 / 45.0, + 152.0 / 945.0, -11966.0 / 14175.0, -21016.0 / 51975.0, + 251310128.0 / 638512875.0, 3044.0 / 2835.0, 3802.0 / 14175.0, + -94388.0 / 66825.0, -8797648.0 / 10945935.0, 6059.0 / 4725.0, + 41072.0 / 93555.0, -1472637812.0 / 638512875.0, 768272.0 / 467775.0, + 455935736.0 / 638512875.0, 4210684958.0 / 1915538625.0, + // C[mu,phi]; even coeffs only + -3.0 / 2.0, 9.0 / 16.0, -3.0 / 32.0, 15.0 / 16.0, -15.0 / 32.0, + 135.0 / 2048.0, -35.0 / 48.0, 105.0 / 256.0, 315.0 / 512.0, + -189.0 / 512.0, -693.0 / 1280.0, 1001.0 / 2048.0, + // C[mu,chi] + 1.0 / 2.0, -2.0 / 3.0, 5.0 / 16.0, 41.0 / 180.0, -127.0 / 288.0, + 7891.0 / 37800.0, 13.0 / 48.0, -3.0 / 5.0, 557.0 / 1440.0, + 281.0 / 630.0, -1983433.0 / 1935360.0, 61.0 / 240.0, -103.0 / 140.0, + 15061.0 / 26880.0, 167603.0 / 181440.0, 49561.0 / 161280.0, + -179.0 / 168.0, 6601661.0 / 7257600.0, 34729.0 / 80640.0, + -3418889.0 / 1995840.0, 212378941.0 / 319334400.0, + // C[chi,phi] + -2.0, 2.0 / 3.0, 4.0 / 3.0, -82.0 / 45.0, 32.0 / 45.0, 4642.0 / 4725.0, + 5.0 / 3.0, -16.0 / 15.0, -13.0 / 9.0, 904.0 / 315.0, -1522.0 / 945.0, + -26.0 / 15.0, 34.0 / 21.0, 8.0 / 5.0, -12686.0 / 2835.0, 1237.0 / 630.0, + -12.0 / 5.0, -24832.0 / 14175.0, -734.0 / 315.0, 109598.0 / 31185.0, + 444337.0 / 155925.0, + // C[chi,mu] + -1.0 / 2.0, 2.0 / 3.0, -37.0 / 96.0, 1.0 / 360.0, 81.0 / 512.0, + -96199.0 / 604800.0, -1.0 / 48.0, -1.0 / 15.0, 437.0 / 1440.0, + -46.0 / 105.0, 1118711.0 / 3870720.0, -17.0 / 480.0, 37.0 / 840.0, + 209.0 / 4480.0, -5569.0 / 90720.0, -4397.0 / 161280.0, 11.0 / 504.0, + 830251.0 / 7257600.0, -4583.0 / 161280.0, 108847.0 / 3991680.0, + -20648693.0 / 638668800.0, + // C[xi,phi] + -4.0 / 3.0, -4.0 / 45.0, 88.0 / 315.0, 538.0 / 4725.0, + 20824.0 / 467775.0, -44732.0 / 2837835.0, 34.0 / 45.0, 8.0 / 105.0, + -2482.0 / 14175.0, -37192.0 / 467775.0, -12467764.0 / 212837625.0, + -1532.0 / 2835.0, -898.0 / 14175.0, 54968.0 / 467775.0, + 100320856.0 / 1915538625.0, 6007.0 / 14175.0, 24496.0 / 467775.0, + -5884124.0 / 70945875.0, -23356.0 / 66825.0, -839792.0 / 19348875.0, + 570284222.0 / 1915538625.0, + }; + + /** + * Start offset in {@link #COEFFS} of the matrix for conversion index + * {@code k = NUMBER * auxout + auxin}. Length {@code NUMBER * NUMBER + 1 = 37}; + * a conversion is unsupported exactly when {@code PTRS[k] == PTRS[k + 1]}. + */ + private static final int[] PTRS = { + 0, 0, 0, 0, 12, 33, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 66, 66, 66, 66, 87, 87, 108, + 108, 108, 129, 129, 129, 150, 150, 150, 150, 150, 150, + }; + + /** + * Coefficients of the rectifying-radius series, {@code ((2k-3)!! / (2k)!!)^2} + * for {@code k = 0..3}. + */ + private static final double[] COEFF_RAD = {1.0, 1.0 / 4.0, 1.0 / 64.0, 1.0 / 256.0}; + + private AuxLat() { + } + + /** + * Computes the {@value #ORDER} Fourier coefficients for converting the auxiliary + * latitude {@code auxin} (called zeta upstream) to {@code auxout} (eta). + * + *

Port of {@code pj_auxlat_coeffs}. {@code F[l] = C[eta,zeta] . P(n)} where + * {@code P(n) = [n, n^2, n^3, ...]^T}. + * + *

The n-squared split is load bearing. When both latitudes are + * {@code <= RECTIFYING} (i.e. the {@code phi <-> mu} pair, the only such pair with + * a populated table) the coefficient of each Fourier term is a polynomial in + * {@code n^2} with 12 stored constants; for every other supported pair it is a + * polynomial in {@code n} with 21. That branch is at + * {@code 9.8.1:src/latitudes.cpp:342}. + * + * @param n the third flattening, {@code (a - b) / (a + b)} + * @param auxin the input auxiliary latitude, one of the constants on this class + * @param auxout the output auxiliary latitude + * @param f destination, at least {@value #ORDER} long; the first + * {@value #ORDER} elements are written + * @throws IllegalArgumentException if either latitude is out of range, or the + * conversion between them is not one of the + * eight tabulated + */ + public static void coeffs(double n, int auxin, int auxout, double[] f) { + if (!(auxin >= 0 && auxin < NUMBER && auxout >= 0 && auxout < NUMBER)) { + throw new IllegalArgumentException( + "Bad specification for auxiliary latitude: auxin=" + auxin + + " auxout=" + auxout); + } + final int k = NUMBER * auxout + auxin; + int o = PTRS[k]; + if (o == PTRS[k + 1]) { + throw new IllegalArgumentException( + "Unsupported conversion between auxiliary latitudes: " + + name(auxin) + " -> " + name(auxout)); + } + double d = n; + if (auxin <= RECTIFYING && auxout <= RECTIFYING) { + final double n2 = n * n; + for (int l = 0; l < ORDER; ++l) { + final int m = (ORDER - l - 1) / 2; // order of polynomial in n^2 + f[l] = d * polyval(n2, COEFFS, o, m); + o += m + 1; + d *= n; + } + } else { + for (int l = 0; l < ORDER; ++l) { + final int m = ORDER - l - 1; // order of polynomial in n + f[l] = d * polyval(n, COEFFS, o, m); + o += m + 1; + d *= n; + } + } + // Invariant from upstream's commented-out assert: o == PTRS[k + 1]. + } + + /** + * Convenience form of {@link #coeffs(double, int, int, double[])} returning a + * freshly allocated array of length {@value #ORDER}. + * + * @param n the third flattening + * @param auxin the input auxiliary latitude + * @param auxout the output auxiliary latitude + * @return the {@value #ORDER} Fourier coefficients + */ + public static double[] coeffs(double n, int auxin, int auxout) { + double[] f = new double[ORDER]; + coeffs(n, auxin, auxout, f); + return f; + } + + /** + * Reports whether the given conversion has a tabulated coefficient matrix. + * + * @param auxin the input auxiliary latitude + * @param auxout the output auxiliary latitude + * @return true if {@link #coeffs(double, int, int, double[])} will succeed + */ + public static boolean isSupported(int auxin, int auxout) { + if (!(auxin >= 0 && auxin < NUMBER && auxout >= 0 && auxout < NUMBER)) { + return false; + } + final int k = NUMBER * auxout + auxin; + return PTRS[k] != PTRS[k + 1]; + } + + /** + * Evaluates {@code sum(p[offset + i] * x^i, i, 0, n)} by Horner's method. + * Port of {@code pj_polyval}; note {@code p} holds {@code n + 1} usable elements + * from {@code offset}, and {@code n < 0} yields 0. + * + * @param x the argument + * @param p the coefficient array + * @param offset index in {@code p} of the constant term + * @param n the degree + * @return the polynomial value + */ + public static double polyval(double x, double[] p, int offset, int n) { + double y = n < 0 ? 0.0 : p[offset + n]; + for (; n > 0; ) { + y = y * x + p[offset + --n]; + } + return y; + } + + /** + * Evaluates {@code sum(p[i] * x^i, i, 0, p.length - 1)} by Horner's method. + * + * @param x the argument + * @param p the coefficient array, constant term first + * @return the polynomial value + */ + public static double polyval(double x, double[] p) { + return polyval(x, p, 0, p.length - 1); + } + + /** + * The rectifying radius, {@code (quarter meridian) / ((pi/2) * a)}. Port of + * {@code pj_rectifying_radius}: the expansion of + * {@code (quarter meridian) / ((a+b)/2 * pi/2)} as a series in {@code n^2}, + * divided by {@code 1 + n}. Its accuracy matches the auxiliary-latitude series. + * + * @param n the third flattening + * @return the rectifying radius, in units of the semi-major axis + */ + public static double rectifyingRadius(double n) { + return polyval(n * n, COEFF_RAD, 0, 3) / (1.0 + n); + } + + /** + * The third flattening {@code n = (a - b) / (a + b)} derived from the squared + * first eccentricity. + * + *

Upstream ({@code ell_set.cpp:550-630}) computes {@code n = pow(tan(alpha/2), 2)} + * with {@code alpha = asin(e)} — three platform-dependent libm calls. Since + * {@code tan(alpha/2) = e / (1 + sqrt(1 - e^2))} exactly, this equals + * {@code es / (1 + sqrt(1 - es))^2}, computed here with a single exactly-rounded + * {@code sqrt}. The deviation is at most 2 ulp on {@code n}, propagating to about + * 1e-19 rad, forty orders of magnitude inside the tightest conformance bar; in + * exchange every derived coefficient becomes bit-reproducible across x86-64 and + * AArch64, which cannot be achieved any other way. + * + * @param es the squared first eccentricity + * @return the third flattening + */ + public static double thirdFlattening(double es) { + final double t = 1.0 + Math.sqrt(1.0 - es); + return es / (t * t); + } + + private static String name(int aux) { + switch (aux) { + case GEOGRAPHIC: return "GEOGRAPHIC(phi)"; + case PARAMETRIC: return "PARAMETRIC(beta)"; + case GEOCENTRIC: return "GEOCENTRIC(theta)"; + case RECTIFYING: return "RECTIFYING(mu)"; + case CONFORMAL: return "CONFORMAL(chi)"; + case AUTHALIC: return "AUTHALIC(xi)"; + default: return "UNKNOWN(" + aux + ")"; + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/CRSCache.java b/core/src/main/java/org/locationtech/proj4j/util/CRSCache.java index 4f0bcef..753f00e 100755 --- a/core/src/main/java/org/locationtech/proj4j/util/CRSCache.java +++ b/core/src/main/java/org/locationtech/proj4j/util/CRSCache.java @@ -15,62 +15,464 @@ */ package org.locationtech.proj4j.util; -import org.locationtech.proj4j.*; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.UnknownAuthorityCodeException; +import org.locationtech.proj4j.UnsupportedParameterException; import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; +import java.util.concurrent.atomic.AtomicLong; +/** + * A memoising wrapper around {@link CRSFactory}. + * + * @deprecated Nothing in {@code core/src/main} uses this class, and as originally written it was an + * out-of-memory vector rather than an optimisation: two {@link ConcurrentHashMap}s keyed on the + * raw caller-supplied string with no eviction of any kind. In this library's + * deployment - called per row inside a Spark executor, with the CRS string coming from user + * data - an unbounded map keyed on untrusted input grows until the executor dies. + *

It is bounded now rather than deleted, because it is public API. Prefer + * {@link CRSFactory} directly: since the {@code io.InitFileCache} landed, {@code createFromName} + * no longer re-scans the 888 KB {@code proj4/nad/epsg} dictionary on every call, which was the + * cost this class existed to hide. + * + *

What changed, and what did not

+ *
    + *
  • Bounded. Each of the two maps holds at most {@link #maxEntries()} entries - + * so an instance holds at most twice that, stated plainly here because a shared budget + * that is quietly spent twice is a bound in name only. Default 1,024 each; override with + * {@code -Dproj4j.crsCache.maxEntries}. Eviction is least-recently-used. + *

    The bound is on entries, not bytes, unlike + * {@link org.locationtech.proj4j.datum.GridCache}. That is deliberate: grids run from a + * 624-byte fixture to an 80 MB geoid, so only bytes bound them, whereas parsed + * {@code CoordinateReferenceSystem}s are within a small factor of each other and an entry + * count is both meaningful and measurable without a heap walker.

  • + *
  • No lock is held across the factory call. Loading goes through a {@link FutureTask} + * published with {@code putIfAbsent}, as {@code GridCache} does, so concurrent demand for one + * key produces exactly one construction and the loser waits on the future. The previous + * {@code computeIfAbsent} ran the whole parse - including classpath I/O - inside a + * {@code ConcurrentHashMap} bin lock, which its own javadoc forbids.
  • + *
  • Keys are unambiguous. The old key for {@code createFromParameters} was + * {@code name + paramStr} concatenated, so {@code ("EPSG:4326", "+proj=longlat")} and + * {@code ("EPSG:4326+proj=longlat", "")} were the same entry, and the {@code String[]} + * overload joined on a space, so {@code {"a b"}} and {@code {"a", "b"}} collided although + * {@code CRSFactory} does not treat them alike. Either collision returns a different CRS + * than was asked for. Keys are length-prefixed now, which cannot collide.
  • + *
  • Exceptions are still not memoised. A failed construction is removed from the map and + * rethrown, exactly as before - so a stream of unresolvable names cannot grow the cache at + * all, and a caller sees the same exception it would have seen from {@code CRSFactory}.
  • + *
  • A successful {@code null} from {@code readEpsgFromParameters} now is + * memoised. A record correction goes with this: {@code reference/performance.md} said + * this class "memoises null on IOException". It did not. {@code computeIfAbsent} + * installs no mapping when the function returns {@code null}, so both a genuine "no such + * code" and an {@code IOException} simply re-ran the full dictionary scan on every call. A + * genuine {@code null} is a stable property of an immutable classpath dictionary and is now + * cached; an {@code IOException} still is not, and still surfaces as {@code null} to preserve + * this method's signature.
  • + *
+ * + *

This cache cannot change an answer. A {@code CoordinateReferenceSystem} is not mutated after + * construction by anything in this library, construction is a pure function of the key, and the + * factory is stateless, so an evicted entry rebuilt later is observationally identical. Note that + * {@code CoordinateReferenceSystem.getParameters()} returns its internal array by reference: a + * caller that mutates it corrupts the shared instance. That was true of this class before and is + * not introduced here. + */ +@Deprecated public class CRSCache { - private static CRSFactory crsFactory = new CRSFactory(); - private ConcurrentHashMap crsCache; - private ConcurrentHashMap epsgCache; + /** Overrides the per-map entry ceiling. */ + public static final String SIZE_PROPERTY = "proj4j.crsCache.maxEntries"; + + static final int DEFAULT_MAX_ENTRIES = 1024; + + private static final CRSFactory crsFactory = new CRSFactory(); + + /** + * Three key spaces, three maps, and that is the point: separate maps make a cross-scheme + * collision impossible rather than merely unlikely, which matters because every key + * component here is untrusted input. Folding names and parameter strings into one map is what + * made the old ad-hoc concatenation able to answer one question with another's answer. + */ + private final Bounded byName; + private final Bounded byParams; + private final Bounded epsgByParams; public CRSCache() { - crsCache = new ConcurrentHashMap<>(); - epsgCache = new ConcurrentHashMap<>(); + this(configuredMaxEntries()); + } + + /** + * @param maxEntries the ceiling for each of the three internal maps; a value below 1 + * is replaced by the default + * @since 1.5.0 + */ + public CRSCache(int maxEntries) { + int n = maxEntries > 0 ? maxEntries : DEFAULT_MAX_ENTRIES; + this.byName = new Bounded(n); + this.byParams = new Bounded(n); + this.epsgByParams = new Bounded(n); + } + + /** + * @deprecated The supplied maps seed a bounded cache; they are not retained, and + * mutating them afterwards has no effect. Retaining them would reinstate precisely the + * unbounded growth this class was changed to stop. Seeding more entries than the ceiling + * evicts the excess in iteration order. + *

Reachability of a seeded entry, stated exactly rather than implied: + *

    + *
  • {@code crsCache} seeds the name map, whose key is still the bare name, so an + * entry put there by {@link #createFromName(String)} is hit as before. An entry that + * a previous version had put there from {@code createFromParameters} was keyed by an + * ad-hoc concatenation; it is retained but will not be hit, and ages out.
  • + *
  • {@code epsgCache} seeds the EPSG map through the current key function applied to + * the raw key, which is exactly what + * {@link #readEpsgFromParameters(String)} computes - so those entries are hit. + * {@link #readEpsgFromParameters(String[])} now keys per element, so an entry seeded + * from the array overload's old space-joined key is not hit.
  • + *
+ */ + @Deprecated + public CRSCache(ConcurrentHashMap crsCache, + ConcurrentHashMap epsgCache) { + this(configuredMaxEntries()); + if (crsCache != null) { + for (Map.Entry e : crsCache.entrySet()) { + this.byName.seed(e.getKey(), e.getValue()); + } + } + if (epsgCache != null) { + for (Map.Entry e : epsgCache.entrySet()) { + this.epsgByParams.seed(key(e.getKey()), e.getValue()); + } + } } - public CRSCache(ConcurrentHashMap crsCache, ConcurrentHashMap epsgCache) { - this.crsCache = crsCache; - this.epsgCache = epsgCache; + static int configuredMaxEntries() { + String raw = System.getProperty(SIZE_PROPERTY); + if (raw == null) { + return DEFAULT_MAX_ENTRIES; + } + try { + int v = Integer.parseInt(raw.trim()); + return v > 0 ? v : DEFAULT_MAX_ENTRIES; + } catch (NumberFormatException e) { + return DEFAULT_MAX_ENTRIES; + } } - public CoordinateReferenceSystem createFromName(String name) + /** The ceiling on each of the three internal maps. */ + public int maxEntries() { + return byName.maxEntries; + } + + /** Entries currently retained, across all three maps. */ + public int size() { + return byName.size() + byParams.size() + epsgByParams.size(); + } + + /** Entries evicted so far, across all three maps. */ + public long evictionCount() { + return byName.evictions.get() + byParams.evictions.get() + epsgByParams.evictions.get(); + } + + /** Drops every entry. */ + public void clear() { + byName.clear(); + byParams.clear(); + epsgByParams.clear(); + } + + /** + * The steady-state path, and it must allocate nothing. + * + *

{@code TransformCacheBenchmark.crsCacheHit} is ratcheted at 0 B/op because a warm + * hit is where a consumer spends essentially all of its time. That is why every method below + * consults {@link Bounded#peek} before building anything: an anonymous + * {@link Callable} is an allocation, and Java evaluates it as an argument whether the slow path + * runs or not, so writing the obvious {@code cache.get(k, () -> ...)} would put a fresh object + * on the hot path and break that ratchet. The pre-cache code had the same shape for the same + * reason - a bare {@code map.get} and an early return. + */ + public CoordinateReferenceSystem createFromName(final String name) throws UnsupportedParameterException, InvalidValueException, UnknownAuthorityCodeException { - CoordinateReferenceSystem res = crsCache.get(name); - if(res != null) return res; - return crsCache.computeIfAbsent(name, k -> crsFactory.createFromName(name)); + // The bare name, unchanged: one component, so there is nothing to disambiguate, and it + // keeps entries seeded through the deprecated two-map constructor reachable. + Object hit = byName.peek(name); + if (hit != Bounded.ABSENT) { + return (CoordinateReferenceSystem) hit; + } + return byName.get(name, new Callable() { + @Override + public CoordinateReferenceSystem call() { + return crsFactory.createFromName(name); + } + }); } - public CoordinateReferenceSystem createFromParameters(String name, String paramStr) + public CoordinateReferenceSystem createFromParameters(final String name, final String paramStr) throws UnsupportedParameterException, InvalidValueException { - String nonNullName = name == null ? "" : name; - String key = nonNullName + paramStr; - CoordinateReferenceSystem res = crsCache.get(key); - if(res != null) return res; - return crsCache.computeIfAbsent(key, k -> crsFactory.createFromParameters(name, paramStr)); + String k = key(name) + key(paramStr); + Object hit = byParams.peek(k); + if (hit != Bounded.ABSENT) { + return (CoordinateReferenceSystem) hit; + } + return byParams.get(k, new Callable() { + @Override + public CoordinateReferenceSystem call() { + return crsFactory.createFromParameters(name, paramStr); + } + }); } - public CoordinateReferenceSystem createFromParameters(String name, String[] params) + public CoordinateReferenceSystem createFromParameters(final String name, final String[] params) throws UnsupportedParameterException, InvalidValueException { - String nonNullName = name == null ? "" : name; - String key = nonNullName + String.join(" ", params); - CoordinateReferenceSystem res = crsCache.get(key); - if(res != null) return res; - return crsCache.computeIfAbsent(key, k -> crsFactory.createFromParameters(name, params)); + String k = key(name) + key(params); + Object hit = byParams.peek(k); + if (hit != Bounded.ABSENT) { + return (CoordinateReferenceSystem) hit; + } + return byParams.get(k, new Callable() { + @Override + public CoordinateReferenceSystem call() { + return crsFactory.createFromParameters(name, params); + } + }); } - public String readEpsgFromParameters(String paramStr) { - String res = epsgCache.get(paramStr); - if(res != null) return res; - return epsgCache.computeIfAbsent(paramStr, k -> { try { return crsFactory.readEpsgFromParameters(paramStr); } catch (IOException e) { return null; } }); + public String readEpsgFromParameters(final String paramStr) { + String k = key(paramStr); + Object hit = epsgByParams.peek(k); + if (hit != Bounded.ABSENT) { + return (String) hit; + } + return epsgByParams.get(k, new Callable() { + @Override + public String call() throws IOException { + return crsFactory.readEpsgFromParameters(paramStr); + } + }); } - public String readEpsgFromParameters(String[] params) { - String paramStr = String.join(" ", params); - String res = epsgCache.get(paramStr); - if(res != null) return res; - return epsgCache.computeIfAbsent(paramStr, k -> { try { return crsFactory.readEpsgFromParameters(params); } catch (IOException e) { return null; } }); + public String readEpsgFromParameters(final String[] params) { + String k = key(params); + Object hit = epsgByParams.peek(k); + if (hit != Bounded.ABSENT) { + return (String) hit; + } + return epsgByParams.get(k, new Callable() { + @Override + public String call() throws IOException { + return crsFactory.readEpsgFromParameters(params); + } + }); + } + + // ------------------------------------------------------------------------------------------ + // Keying. Length-prefixed so that no concatenation of components can be read two ways. + // ------------------------------------------------------------------------------------------ + + private static String key(String s) { + if (s == null) { + return "-1:"; + } + return s.length() + ":" + s; + } + + private static String key(String[] parts) { + if (parts == null) { + return "-1:"; + } + StringBuilder b = new StringBuilder(); + b.append(parts.length).append('#'); + for (int i = 0; i < parts.length; i++) { + b.append(key(parts[i])); + } + return b.toString(); + } + + // ------------------------------------------------------------------------------------------ + + /** + * A bounded, LRU, exactly-once map. Same shape as + * {@link org.locationtech.proj4j.datum.GridCache}: values live in a {@link ConcurrentHashMap} of + * {@link FutureTask}s so no lock spans the load, and a separate short critical section keeps the + * access order. + */ + private static final class Bounded { + + final int maxEntries; + + private final ConcurrentMap> entries = + new ConcurrentHashMap>(); + + /** Access-ordered. Guarded by itself; never held across a load. */ + private final LinkedHashMap lru = + new LinkedHashMap(16, 0.75f, true); + + final AtomicLong evictions = new AtomicLong(); + + Bounded(int maxEntries) { + this.maxEntries = maxEntries; + } + + int size() { + return entries.size(); + } + + void clear() { + entries.clear(); + synchronized (lru) { + lru.clear(); + } + } + + void seed(String k, V v) { + FutureTask done = completed(v); + if (entries.putIfAbsent(k, done) == null) { + admit(k); + } + } + + private static FutureTask completed(final V v) { + FutureTask t = new FutureTask(new Callable() { + @Override + public V call() { + return v; + } + }); + t.run(); + return t; + } + + /** + * Distinguishes "no completed entry" from "a completed entry whose value is {@code null}". + * A {@code null} is a real memoised answer for {@code readEpsgFromParameters}, so a plain + * {@code null} return would silently un-memoise every one of them. + */ + static final Object ABSENT = new Object(); + + /** + * The allocation-free hit path: the completed value, or {@link #ABSENT}. + * + *

Returns {@code ABSENT} for an entry that is still loading or that failed, so the + * caller falls through to {@link #get} and gets the full waiting and error handling there + * rather than a second, divergent copy of it here. + */ + Object peek(String k) { + FutureTask task = entries.get(k); + if (task == null || !task.isDone()) { + return ABSENT; + } + V value; + try { + value = task.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return ABSENT; + } catch (ExecutionException e) { + return ABSENT; + } catch (CancellationException e) { + return ABSENT; + } + touch(k); + return value; + } + + V get(String k, Callable loader) { + FutureTask task = entries.get(k); + boolean mine = false; + if (task == null) { + FutureTask created = new FutureTask(loader); + FutureTask existing = entries.putIfAbsent(k, created); + if (existing == null) { + task = created; + mine = true; + task.run(); + } else { + task = existing; + } + } + + V value; + try { + value = task.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + entries.remove(k, task); + throw new IllegalStateException("Interrupted while building " + k, e); + } catch (CancellationException e) { + entries.remove(k, task); + throw new IllegalStateException("Cancelled while building " + k, e); + } catch (ExecutionException e) { + // Failures are NOT memoised: a caller must see what CRSFactory would have thrown, + // and a stream of unresolvable names must not be able to grow this map. + entries.remove(k, task); + Throwable cause = e.getCause(); + if (cause instanceof IOException) { + // Only readEpsgFromParameters can reach this, and its signature has always + // swallowed IOException as null. Unlike a genuine "no such code", this is not + // memoised - see the class javadoc's record correction. + return null; + } + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + if (cause instanceof Error) { + throw (Error) cause; + } + throw new IllegalStateException("Failed to build " + k, cause); + } + + if (mine) { + admit(k); + } else { + touch(k); + } + return value; + } + + private void admit(String k) { + List evict = null; + synchronized (lru) { + lru.put(k, Boolean.TRUE); + Iterator> it = lru.entrySet().iterator(); + while (lru.size() > maxEntries && it.hasNext()) { + Map.Entry oldest = it.next(); + if (oldest.getKey().equals(k)) { + continue; + } + if (evict == null) { + evict = new ArrayList(); + } + evict.add(oldest.getKey()); + it.remove(); + } + } + if (evict != null) { + for (String gone : evict) { + entries.remove(gone); + evictions.incrementAndGet(); + } + } + } + + private void touch(String k) { + synchronized (lru) { + lru.get(k); + } + } } } diff --git a/core/src/main/java/org/locationtech/proj4j/util/Clenshaw6.java b/core/src/main/java/org/locationtech/proj4j/util/Clenshaw6.java new file mode 100644 index 0000000..62c52a0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/Clenshaw6.java @@ -0,0 +1,215 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * Fixed-order-6 Clenshaw summation of {@code sum(F[k] * sin((2k+2) * zeta), k, 0, 5)}, + * a port of PROJ 9.8.1's {@code pj_clenshaw} and the three {@code pj_auxlat_convert} + * overloads ({@code src/latitudes.cpp:372-410}). + * + *

This is the hottest arithmetic in the auxiliary-latitude framework: it evaluates + * the Fourier series from {@code sin(zeta)} and {@code cos(zeta)} with no + * trigonometric calls at all. + * + *

Two deliberate implementation choices: + * + *

    + *
  • The six coefficients are held as six {@code final double} fields, not an + * array. The order is fixed at {@value AuxLat#ORDER} by upstream, so the loop is + * fully unrolled; the JIT then keeps the coefficients in registers and no array bounds + * check is executed per row of a bulk transform. + *
  • {@code X = 2 * (c - s) * (c + s)} rather than {@code 2 * cos(2 * zeta)} or + * {@code 2 * (2 * c * c - 1)}. It is one multiply instead of a trig call, and + * more accurate than the {@code 2*c*c - 1} form near {@code zeta = pi/4}, where that + * form suffers cancellation. + *
+ * + *

Instances are immutable and therefore thread safe. + * + *

Math vs StrictMath: {@link #delta} and {@link #convert(double, double, double)} + * use only {@code + - *} and are exactly reproducible everywhere. The two methods that + * must produce a sine and cosine from an angle — {@link #convert(double)} and + * {@link #convertSinCos} — use {@link FastStrictTrig#sin} and {@link FastStrictTrig#cos} + * because HotSpot ships architecture-specific intrinsics for {@code Math.sin/cos} on + * x86-64 and AArch64 that genuinely differ between them; fdlibm is identical on every + * platform. That buys determinism, not bit parity with PROJ (which links the system + * libm); 1 ulp of a radian is about 2 pm on the ground. + * + *

{@link FastStrictTrig} rather than {@link StrictMath} because the two are + * bit-identical and only the latter allocates: from JDK 21 — not 17, where + * they are still {@code native} JNI calls into compiled fdlibm and allocate nothing — + * {@code StrictMath.sin/cos/tan} each allocate a {@code double[2]} argument-reduction + * carrier that escape analysis does not remove, 62 B/op over {@code [-pi, pi]}. This is + * the single highest-traffic trig site in the library — {@code convert(zeta)} is reached + * from {@code utm tmerc lcc cass poly aea laea} — and the {@code etmerc} forward alone + * was leaking 124 B/point through it. + * + * @see AuxLat + */ +public final strictfp class Clenshaw6 implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + private final double f0; + private final double f1; + private final double f2; + private final double f3; + private final double f4; + private final double f5; + + /** + * Wraps six Fourier coefficients. + * + * @param f0 coefficient of {@code sin(2*zeta)} + * @param f1 coefficient of {@code sin(4*zeta)} + * @param f2 coefficient of {@code sin(6*zeta)} + * @param f3 coefficient of {@code sin(8*zeta)} + * @param f4 coefficient of {@code sin(10*zeta)} + * @param f5 coefficient of {@code sin(12*zeta)} + */ + public Clenshaw6(double f0, double f1, double f2, double f3, double f4, double f5) { + this.f0 = f0; + this.f1 = f1; + this.f2 = f2; + this.f3 = f3; + this.f4 = f4; + this.f5 = f5; + } + + /** + * Copies six coefficients out of an array. The array is not retained. + * + * @param f coefficients starting at {@code offset}, at least + * {@value AuxLat#ORDER} usable elements + * @param offset index of the first coefficient + */ + public Clenshaw6(double[] f, int offset) { + this(f[offset], f[offset + 1], f[offset + 2], f[offset + 3], f[offset + 4], + f[offset + 5]); + } + + /** + * Copies six coefficients out of the start of an array. The array is not retained. + * + * @param f coefficients, at least {@value AuxLat#ORDER} long + */ + public Clenshaw6(double[] f) { + this(f, 0); + } + + /** + * Builds the evaluator for one auxiliary-latitude conversion. + * + * @param n the third flattening + * @param auxin the input auxiliary latitude, an {@link AuxLat} constant + * @param auxout the output auxiliary latitude + * @return an evaluator for {@code auxin -> auxout} + * @throws IllegalArgumentException if the conversion is not tabulated + */ + public static Clenshaw6 forConversion(double n, int auxin, int auxout) { + return new Clenshaw6(AuxLat.coeffs(n, auxin, auxout)); + } + + /** + * The Fourier sum {@code sum(F[k] * sin((2k+2) * zeta))}, i.e. the correction to be + * added to {@code zeta} to obtain the target latitude. + * + *

Upstream's loop starts with {@code u0 = u1 = 0}, so its first trip reduces to + * {@code u0 = F[5]}; that step is folded into the initialisation here. The + * remaining five trips are unrolled. + * + * @param s {@code sin(zeta)} + * @param c {@code cos(zeta)} + * @return the correction, in the same units as {@code zeta} (radians) + */ + public double delta(double s, double c) { + final double x = 2.0 * (c - s) * (c + s); // == 2 * cos(2 * zeta) + double u0 = f5, u1 = 0.0, t; + t = x * u0 - u1 + f4; u1 = u0; u0 = t; + t = x * u0 - u1 + f3; u1 = u0; u0 = t; + t = x * u0 - u1 + f2; u1 = u0; u0 = t; + t = x * u0 - u1 + f1; u1 = u0; u0 = t; + t = x * u0 - u1 + f0; u1 = u0; u0 = t; + return 2.0 * s * c * u0; // sin(2 * zeta) * u0 + } + + /** + * Converts {@code zeta} to the target auxiliary latitude, given its sine and + * cosine. Port of the three-argument {@code pj_auxlat_convert}. + * + * @param zeta the source latitude, radians + * @param s {@code sin(zeta)} + * @param c {@code cos(zeta)} + * @return the target latitude, radians + */ + public double convert(double zeta, double s, double c) { + return zeta + delta(s, c); + } + + /** + * Converts {@code zeta} to the target auxiliary latitude, computing its sine and + * cosine internally. Port of the one-argument {@code pj_auxlat_convert}. + * + * @param zeta the source latitude, radians + * @return the target latitude, radians + */ + public double convert(double zeta) { + return convert(zeta, FastStrictTrig.sin(zeta), FastStrictTrig.cos(zeta)); + } + + /** + * The sine/cosine-preserving conversion, port of + * {@code pj_auxlat_convert(szeta, czeta, &seta, &ceta, F)} + * ({@code 9.8.1:src/latitudes.cpp:404-410}). + * + *

Rather than forming the target angle and taking its sine and cosine — which + * loses relative accuracy as {@code cos} approaches zero — this rotates the input + * pair by the small correction {@code delta}. That preserves full relative accuracy + * near the poles, and is what 9.8.1's {@code etmerc} inverse uses. + * + * @param s {@code sin(zeta)} + * @param c {@code cos(zeta)} + * @param out destination of length at least 2; receives {@code sin(eta)} at index + * 0 and {@code cos(eta)} at index 1 + */ + public void convertSinCos(double s, double c, double[] out) { + final double d = delta(s, c); + final double sd = FastStrictTrig.sin(d); + final double cd = FastStrictTrig.cos(d); + out[0] = s * cd + c * sd; + out[1] = c * cd - s * sd; + } + + /** + * The coefficient of {@code sin((2k+2) * zeta)}. + * + * @param k index, 0 through 5 + * @return the coefficient + * @throws IndexOutOfBoundsException if {@code k} is out of range + */ + public double coefficient(int k) { + switch (k) { + case 0: return f0; + case 1: return f1; + case 2: return f2; + case 3: return f3; + case 4: return f4; + case 5: return f5; + default: throw new IndexOutOfBoundsException("k=" + k); + } + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/ConformalLat.java b/core/src/main/java/org/locationtech/proj4j/util/ConformalLat.java new file mode 100644 index 0000000..4b68d23 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/ConformalLat.java @@ -0,0 +1,273 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.locationtech.proj4j.ConvergenceFailureException; + +/** + * The conformal latitude and its inverse: ports of PROJ 9.8.1's + * {@code src/phi2.cpp} ({@code pj_sinhpsi2tanphi}, {@code pj_phi2}), + * {@code src/tsfn.cpp} ({@code pj_tsfn}) and {@code src/latitudes.cpp:18-48} + * ({@code pj_conformal_lat}, {@code pj_conformal_lat_inverse}). + * + *

The isometric latitude {@code psi} is defined by + *

+ *   psi = log(tan(pi/4 + phi/2) * ((1 - e sin phi)/(1 + e sin phi))^(e/2))
+ *       = asinh(tan(phi)) - e * atanh(e * sin(phi))
+ *       = asinh(tan(chi))
+ * 
+ * where {@code chi} is the conformal latitude. {@link #tsfn} returns + * {@code ts = exp(-psi)}; {@link #phi2} inverts it. + * + *

Two measured facts justify replacing proj4j's equivalents. On GRS80, + * {@code ProjectionMath.phi2} — a 15-step Newton loop calling {@code pow} on every + * trip — is up to 4,145 nm from the truth against the 50 nm bar that {@code merc}'s + * inverse conformance assertions set; this Newton-on-tau formulation is about 2 nm and + * converges in one or two trips. And {@code ProjectionMath.tsfn} returns + * {@code 0.9999999999999999} at {@code phi = 0}, where the corpus asserts a result at + * {@code tolerance 0 m}; {@link #tsfn} returns exactly {@code 1.0} there, because + * {@code atanh(0)} is exactly zero, {@code exp(0)} exactly one, and the {@code phi <= 0} + * branch reduces to {@code 1/1}. + * + *

Math vs StrictMath: {@code exp}, {@code log}, {@code sin}, {@code cos}, + * {@code tan} and {@code pow} are the {@link Math} methods HotSpot replaces with + * architecture-specific intrinsics on x86-64 and AArch64, and they differ at the last + * bit between them; all such calls here go through fdlibm so that results are identical + * on every platform — {@code exp} and {@code log} on {@link StrictMath}, and + * {@code sin}/{@code cos}/{@code tan} on {@link FastStrictTrig}, which is bit-identical to + * {@code StrictMath} but does not allocate the {@code double[2]} argument-reduction + * carrier that {@code StrictMath.sin/cos/tan} have allocated since JDK 21 (21, not 17: + * through 17 they are {@code native} JNI calls into compiled fdlibm and allocate nothing + * — see {@link FastStrictTrig} for the evidence). + * {@code sinh} and {@code atan} have no + * intrinsic today and already delegate to {@code StrictMath}, so naming it explicitly is + * free and insures against a future one. {@link Math#sqrt}, {@link Math#abs} and + * {@link Math#max} are used directly: {@code sqrt} is exactly rounded by IEEE-754 and + * the other two are exact by construction. + * + * @see MathHelpers + */ +public final strictfp class ConformalLat { + + /** + * {@code sqrt(DBL_EPSILON)} = 2-26, written as a literal because it is an + * exact power of two and must not depend on the platform's {@code sqrt} of + * {@code 2^-52} (it does not, but a literal removes the question). + */ + public static final double ROOTEPS = 1.4901161193847656E-8; + + /** + * {@code 2 / ROOTEPS} = 227. Above this magnitude of {@code tau} the + * large-argument limit {@code tau = exp(e * atanh(e)) * taup} is exact to double + * precision, so returning it directly both avoids overflow in {@code tau*tau} and + * gives the right answer for {@code taup = +/-inf} and {@code NaN}. + */ + public static final double TMAX = 1.34217728E8; + + /** The Newton convergence criterion, {@code ROOTEPS / 10}. */ + private static final double TOL = ROOTEPS / 10.0; + + /** Iteration cap. Upstream measures min 1, max 2, mean 1.954 for {@code |f| <= 1/150}. */ + private static final int NUMIT = 5; + + private static final double HALF_PI = Math.PI / 2.0; + + private ConformalLat() { + } + + /** + * Converts {@code tau' = sinh(psi) = tan(chi)} to {@code tau = tan(phi)}. Port of + * {@code pj_sinhpsi2tanphi}, itself taken from + * {@code GeographicLib::Math::tauf(taup, e)}. + * + *

Representing both latitudes by their tangents maintains full relative + * accuracy at the equator and at the poles, which matters for quantities such as + * {@code cos(phi)/cos(chi) * tan(phi)} — the transverse Mercator scale factor. + * + *

From Karney (2011), Eq. 7, + *

+     *   tau' = tau * sqrt(1 + sigma^2) - sqrt(1 + tau^2) * sigma
+     *   sigma = sinh(e * atanh(e * tau / sqrt(1 + tau^2)))
+     * 
+ * which for small {@code e} reduces to {@code tau' = (1 - e^2) tau}. Newton's method + * on that relation uses + *
+     *   dtau'/dtau = (1 - e^2) sqrt(1 + tau'^2) sqrt(1 + tau^2) / (1 + (1 - e^2) tau^2)
+     * 
+ * + *

Three details are load bearing and must not be re-derived. + * + *

    + *
  • The initial guess branches on {@code |taup| > 70}, which is {@code chi = 89.18} + * degrees. Above it, {@code tau = taup * exp(e * atanh(e))}; below it, + * {@code taup / (1 - e^2)}. This is what makes the loop terminate in one + * iteration near the poles rather than three or four. + *
  • {@code !(Math.abs(tau) < TMAX)} rather than {@code Math.abs(tau) >= TMAX}. The + * inverted test is true for {@code NaN}, so {@code NaN} and {@code +/-inf} return + * immediately instead of entering a loop that would compute {@code inf - inf}. + *
  • {@code !(Math.abs(dtau) >= stol)} rather than {@code Math.abs(dtau) < stol}, + * for the same reason: a {@code NaN} step must terminate the loop, not spin it. + *
+ * + *

Deviation from upstream: where PROJ records + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} on the context and returns the + * unconverged value anyway, this throws {@link ConvergenceFailureException}. A + * failure must not be expressed as a plausible coordinate. For any sane eccentricity + * the cap is never reached — upstream measures a maximum of two iterations. + * + * @param taup {@code tan(chi)}, equivalently {@code sinh(psi)} + * @param e the first eccentricity + * @return {@code tan(phi)} + * @throws ConvergenceFailureException if Newton's method does not converge in + * {@value #NUMIT} iterations + */ + public static double sinhpsi2tanphi(double taup, double e) { + final double e2m = 1.0 - e * e; + final double stol = TOL * Math.max(1.0, Math.abs(taup)); + // The initial guess. 70 corresponds to chi = 89.18 deg. + double tau = Math.abs(taup) > 70.0 + ? taup * StrictMath.exp(e * MathHelpers.atanh(e)) + : taup / e2m; + if (!(Math.abs(tau) < TMAX)) { + // Handles +/-inf, NaN and e = 1. Inverted on purpose: NaN must exit here. + return tau; + } + int i = NUMIT; + for (; i != 0; --i) { + final double tau1 = Math.sqrt(1.0 + tau * tau); + final double sig = StrictMath.sinh(e * MathHelpers.atanh(e * tau / tau1)); + final double taupa = Math.sqrt(1.0 + sig * sig) * tau - sig * tau1; + final double dtau = (taup - taupa) * (1.0 + e2m * (tau * tau)) + / (e2m * tau1 * Math.sqrt(1.0 + taupa * taupa)); + tau += dtau; + if (!(Math.abs(dtau) >= stol)) { + // Backwards test to allow NaNs to succeed. + break; + } + } + if (i == 0) { + throw new ConvergenceFailureException( + "sinhpsi2tanphi failed to converge after " + NUMIT + + " iterations for taup=" + taup + " e=" + e); + } + return tau; + } + + /** + * Determines the latitude angle phi-2 from {@code ts = exp(-psi)}. Port of + * {@code pj_phi2}. + * + *

Converts {@code ts} to {@code tau' = tan(chi) = sinh(psi) = (1/ts - ts) / 2} and + * returns {@code atan(sinhpsi2tanphi(tau'))}. The formulation is exactly odd in + * {@code ts}, and note that {@code +0.0} and {@code -0.0} give different results + * ({@code -pi/2} and {@code +pi/2} respectively) because {@code 1/(-0.0)} is + * {@code -inf}. + * + * @param ts {@code exp(-psi)}, Snyder (1987) Eq. (7-10) + * @param e the first eccentricity + * @return the geographic latitude, radians + * @throws ConvergenceFailureException if the underlying Newton iteration fails + */ + public static double phi2(double ts, double e) { + return StrictMath.atan(sinhpsi2tanphi((1.0 / ts - ts) / 2.0, e)); + } + + /** + * Determines {@code ts = exp(-psi)}, Snyder (1987) Eq. (7-10). Port of + * {@code pj_tsfn}. + * + *

Since {@code exp(-asinh(tan(phi))) = 1 / (tan(phi) + sec(phi))}, this is + * evaluated as {@code cos(phi) / (1 + sin(phi))} for {@code phi > 0} and + * {@code (1 - sin(phi)) / cos(phi)} otherwise, each branch chosen so that no + * cancellation occurs. Upstream's {@code tan} and {@code pow} are gone; at + * {@code phi = 0} the result is exactly {@code 1.0}. + * + * @param phi the geographic latitude, radians + * @param sinphi {@code sin(phi)} + * @param e the first eccentricity + * @return {@code exp(-psi)} + */ + public static double tsfn(double phi, double sinphi, double e) { + return tsfnSinCos(sinphi, FastStrictTrig.cos(phi), e); + } + + /** + * {@code ts = exp(-psi)} from the sine and cosine of the latitude, saving the + * {@code cos} call for callers that already have both. + * + *

Identical arithmetic to {@link #tsfn}; the argument order differs so that the + * two can coexist despite Java's erasure of primitive parameter names. + * {@code tsfnSinCos(0.0, 1.0, e)} is exactly {@code 1.0} for every {@code e}. + * + * @param sinphi {@code sin(phi)} + * @param cosphi {@code cos(phi)} + * @param e the first eccentricity + * @return {@code exp(-psi)} + */ + public static double tsfnSinCos(double sinphi, double cosphi, double e) { + return StrictMath.exp(e * MathHelpers.atanh(e * sinphi)) + * (sinphi > 0.0 ? cosphi / (1.0 + sinphi) : (1.0 - sinphi) / cosphi); + } + + /** + * The conformal latitude {@code chi} in terms of the geographic latitude. Port of + * {@code pj_conformal_lat}. + * + *

Uses {@code sin} and {@code cos} rather than {@code tan} and {@code sin} so a + * compiler or JIT can pair them, and relies on {@link MathHelpers#asinh}, whose + * {@code log1p} branch is what keeps this accurate at the equator. + * + * @param phi the geographic latitude, radians + * @param e the first eccentricity; {@code 0} returns {@code phi} unchanged + * @return the conformal latitude, radians + */ + public static double conformalLat(double phi, double e) { + if (e == 0.0) { + return phi; + } + final double sphi = FastStrictTrig.sin(phi); + final double cphi = FastStrictTrig.cos(phi); + return StrictMath.atan(StrictMath.sinh( + MathHelpers.asinh(sphi / cphi) - e * MathHelpers.atanh(e * sphi))); + } + + /** + * The geographic latitude in terms of the conformal latitude {@code chi}. Port of + * {@code pj_conformal_lat_inverse}. + * + * @param chi the conformal latitude, radians + * @param e the first eccentricity; {@code 0} returns {@code chi} unchanged + * @return the geographic latitude, radians + * @throws ConvergenceFailureException if the underlying Newton iteration fails + */ + public static double conformalLatInverse(double chi, double e) { + if (e == 0.0) { + return chi; + } + return StrictMath.atan(sinhpsi2tanphi(FastStrictTrig.tan(chi), e)); + } + + /** + * {@code pi/2}, exposed because {@link #phi2} is specified to return it exactly at + * {@code ts = +0.0}. + * + * @return {@code Math.PI / 2} + */ + public static double halfPi() { + return HALF_PI; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/EllipticIntegral.java b/core/src/main/java/org/locationtech/proj4j/util/EllipticIntegral.java new file mode 100644 index 0000000..c3b98f6 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/EllipticIntegral.java @@ -0,0 +1,156 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * The incomplete elliptic integral of the first kind at {@code m = k^2 = 1/2}, as PROJ + * computes it: a verbatim port of {@code ell_int_5} from + * {@code 9.8.1:src/projections/adams.cpp:83-108}. + * + *

This is deliberately not an accurate elliptic integral, and must not be replaced + * with one. {@code ell_int_5} is a seven-term even Chebyshev series whose own comment + * claims "precision good to better than 1e-7". Measured against a Carlson {@code RF} + * duplication reference over {@code phi} in {@code [0, pi/2]}: + * + *

+ *   max |ellInt5(phi) - F(phi | 1/2)|  =  6.61404e-08   at phi = 1.27699
+ *       -> 0.4214 m at +R=6370997
+ *   ellInt5(pi/2) = 1.854074716833181
+ *   true K(1/2)   = 1.854074677301372     (delta 3.95e-08 -> 0.25 m)
+ * 
+ * + *

The {@code gie} tolerance for {@code guyou}, {@code adams_hemi}, {@code adams_ws1} + * and {@code adams_ws2} is 1 mm, so the series is 420x the tolerance away from the + * true integral — and the ~3,400 expected values in PROJ's own corpus for that family + * were generated by this series. A mathematically better integral fails every + * one of them. Hence: the Clenshaw recurrence, the coefficient order and the + * {@code 0.5 * C0} final term are reproduced exactly, and no Carlson symmetric form, AGM, + * or complex elliptic function appears anywhere in this family in PROJ 9.8.1. + * + *

Three constants in the same upstream file are pinned here for the same reason, and + * two of them contradict each other on purpose: + * + *

    + *
  • {@link #K_HALF} is the accurate {@code K(1/2)} literal that + * {@code adams.cpp:209} uses to build {@code peirce_q}'s shift distance + * {@code shd = 1.8540746773013719 * 2}. It is not {@code ellInt5(pi/2)}. + *
  • {@link #GUYOU_POLE} is the truncated literal {@code 1.85407} that + * {@code guyou}'s pole special case returns ({@code adams.cpp:126}) — 30.05 m from + * {@code ellInt5(pi/2)} at {@code +R=6370997}, and asserted at 1 mm by + * {@code guyou.gie}'s {@code +R=1} block. + *
  • {@link #RSQRT2} is {@code 1/sqrt(2)} written to 28 digits as {@code adams.cpp:81} + * writes it. It is bit-equal to {@code Math.sqrt(0.5)} but not to + * {@code 1.0 / Math.sqrt(2.0)}, which is one ulp away. + *
+ * + *

Arithmetic only — no {@link Math} transcendental is called, so there is nothing for a + * platform intrinsic to differ on and {@code strictfp} would be a no-op on any JVM from 17 + * onwards. It is stated anyway, for the same reason the coefficients are: this class + * exists to be bit-reproducible. + */ +public final strictfp class EllipticIntegral { + + /** + * {@code RSQRT2} from {@code 9.8.1:src/projections/adams.cpp:81}, written as the same + * 28-digit decimal the C writes. + * + *

The nearest {@code double} to it is {@code 0x3FE6A09E667F3BCD}, which is exactly + * what {@code Math.sqrt(0.5)} returns and exactly one ulp below what + * {@code 1.0 / Math.sqrt(2.0)} returns. The difference is 1.1e-16 relative — a tenth of + * a micron on Earth radius, which is below every tolerance in the corpus, but the point + * of this family is that upstream's exact bits are the specification. + */ + public static final double RSQRT2 = 0.7071067811865475244008443620; + + /** + * The complete elliptic integral {@code K(m = 1/2) = 1.8540746773013719}, accurate, + * as {@code adams.cpp:209} spells it. {@code peirce_q}'s quincuncial fold distance is + * {@code 2 * K_HALF}; see {@link #PEIRCE_SHIFT}. + * + *

Note that {@code ellInt5(Math.PI / 2)} is {@code 1.854074716833181}, which differs + * in the eighth decimal. Both values coexist inside a single upstream function and + * neither may be substituted for the other. + */ + public static final double K_HALF = 1.8540746773013719; + + /** + * {@code shd} from {@code adams.cpp:209} — {@code 1.8540746773013719 * 2}, the distance + * by which {@code peirce_q} shifts the southern hemisphere when folding it out into the + * four triangles of the quincunx. + */ + public static final double PEIRCE_SHIFT = K_HALF * 2; + + /** + * The truncated literal {@code guyou} returns at the poles ({@code adams.cpp:126}). + * + *

Not a rounding of {@link #K_HALF} and not {@code ellInt5(pi/2)}: it is 4.7e-06 + * below the former, i.e. 30.05 m at {@code +R=6370997}. {@code guyou.gie:2122-2131} + * asserts {@code (0, +/-1.85407)} at {@code +R=1} with a 1 mm tolerance, so the + * truncation is load-bearing. + */ + public static final double GUYOU_POLE = 1.85407; + + /** {@code M_2_PI}: bit-equal to the C macro {@code 0.63661977236758134308}. */ + private static final double TWO_OVER_PI = 2.0 / Math.PI; + + /** {@code C0} from {@code adams.cpp:88}. Enters the sum halved. */ + private static final double C0 = 2.19174570831038; + + /** + * The even Chebyshev coefficients, {@code adams.cpp:89-93}, in upstream's declaration + * order. The Clenshaw recurrence is not symmetric in the coefficient order, so + * reversing this array silently changes the answer. + */ + private static final double[] C = { + -8.58691003636495e-07, + 2.02692115653689e-07, + 3.12960480765314e-05, + 5.30394739921063e-05, + -0.0012804644680613, + -0.00575574836830288, + 0.0914203033408211, + }; + + private EllipticIntegral() { + } + + /** + * {@code F(phi | m = 1/2)} as PROJ computes it. Port of {@code ell_int_5}. + * + *

Odd in {@code phi} by construction: the Chebyshev argument depends on + * {@code phi^2} and the whole series is scaled by {@code phi}, so + * {@code ellInt5(-phi) == -ellInt5(phi)} exactly. Callers in {@code adams.cpp} rely on + * that and pass signed amplitudes rather than taking absolute values. + * + * @param phi the amplitude, in radians; the callers in this family supply values in + * {@code [-pi/2, pi/2]} + * @return the integral, in the same "unit sphere" length units the adams family works in + */ + public static double ellInt5(double phi) { + double y = phi * TWO_OVER_PI; + y = 2. * y * y - 1.; + final double y2 = 2. * y; + double d1 = 0.0; + double d2 = 0.0; + for (int i = 0; i < C.length; i++) { + final double temp = d1; + d1 = y2 * d1 - d2 + C[i]; + d2 = temp; + } + return phi * (y * d1 - d2 + 0.5 * C0); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/FastStrictTrig.java b/core/src/main/java/org/locationtech/proj4j/util/FastStrictTrig.java new file mode 100644 index 0000000..163df7e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/FastStrictTrig.java @@ -0,0 +1,887 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * Allocation-free {@code sin}, {@code cos} and {@code tan} that are + * bit-identical to {@link StrictMath} on every {@code double} input. + * + *

Why this class exists

+ * + * proj4j needs fdlibm trigonometry, not platform trigonometry, for two independent reasons: + * + *
    + *
  • Conformance. PROJ's {@code gie} corpus was generated by an fdlibm-equivalent + * {@code sin}. In the adams family the conditioning amplifies a 1-ulp {@code sin} + * difference by ~3e8: at {@code +proj=adams_ws2 +ellps=WGS84} and {@code (179.999, 0)}, + * {@code Math.sin(lam/2)} yields {@code x = 16686159.3838 m} (27.8 mm outside a 1 mm bar) + * while {@code StrictMath.sin(lam/2)} yields {@code 16686159.3563 m} (0.35 mm inside it). + * Neither is the more accurate — the exact value, {@code 16686159.3639 m}, sits between + * them. fdlibm wins on fidelity, not accuracy.
  • + *
  • Determinism. {@code Math.sin/cos/tan} are {@code @IntrinsicCandidate}; HotSpot + * substitutes a platform-specific implementation, so results differ across architectures + * and, at the margin, across JIT tiers. fdlibm is pure Java and identical everywhere.
  • + *
+ * + * But {@code StrictMath.sin/cos/tan} allocate from JDK 21 onward — 21, not + * 17. The JDK's port of fdlibm from C to Java ran over several releases and reached + * {@code sin}/{@code cos}/{@code tan} only in 21; through JDK 17 they are still {@code native} + * JNI calls into compiled fdlibm, which allocate no Java object at all. (JEP 306, in 17, restored + * always-strict floating-point semantics; it did not port these three.) Verified by reflection and + * by {@code jimage}: {@code Modifier.isNative(StrictMath.sin)} is {@code true} on Corretto and + * Temurin 17.0.20 and {@code false} on 21/25/26, and {@code java.lang.FdLibm$Sin} is absent + * from a JDK 17 image (which ships five {@code FdLibm} nested classes — {@code Cbrt Exp Hypot Pow} + * plus the outer — against 21's twenty-three). From 21, + * {@code java.lang.FdLibm.Sin/Cos/Tan.compute} each begin with {@code new double[2]} to receive + * the two-word result of argument reduction — a C out-parameter idiom that escape analysis does + * not remove, because the array is passed to {@code RemPio2.__ieee754_rem_pio2}, which is far too + * large to inline. {@code __ieee754_rem_pio2} then unconditionally allocates a {@code double[3]}, + * and its multi-word path allocates an {@code int[20]} and three {@code double[20]} more. So the + * cost is tiered, measured on Temurin 21.0.11 and unchanged on OpenJDK 26.0.2 — and + * flatly 0 B/op on 8 through 17, at every optimisation level, because there is no + * Java object there to allocate: + * + * + * + * + * + * + * + *
{@code StrictMath.sin} allocation by argument magnitude, JDK >= 21 only
argumentarraysB/op
{@code |x| <= pi/4}{@code double[2]}32
{@code pi/4 < |x| <= 2^19*(pi/2)}{@code + double[3]}72
{@code |x| > 2^19*(pi/2)}{@code + int[20] + 3 x double[20]}696
+ * + *

A longitude in radians spans {@code +/-pi}, so three quarters of a realistic + * {@code sin(lam)} workload takes the reduction path and the effective figure is + * 62 B/op, not the 32 B/op that a survey confined to {@code |x| <= pi/4} + * reports. Measured in a loop shaped like an ellipsoidal transverse Mercator forward — eight trig + * calls per point — C2 removes none of it: 483 B per vertex, or 46 MB of garbage + * per 100,000-vertex geometry, per row, in a Spark executor. This class measures 0 B/op in the + * same loop. + * + *

{@code exp}, {@code log}, {@code atan}, {@code atan2}, {@code asin}, {@code acos}, + * {@code log1p}, {@code sinh}, {@code cosh}, {@code hypot} and {@code sqrt} allocate nothing. + * {@code StrictMath.pow}'s general path allocates 96 B/op on Temurin 21 (three + * {@code final double[2]} locals, {@code BP}/{@code DP_H}/{@code DP_L}) but 0 on OpenJDK 26, so + * it is fixed upstream. {@code sin}, {@code cos} and {@code tan} are not fixed on either. + * + *

What this class does

+ * + * The algorithm is JDK 21's {@code java.lang.FdLibm.Sin}, {@code Cos}, {@code Tan}, + * {@code RemPio2} and {@code KernelRemPio2}, transcribed literally — the same polynomial + * coefficients, the same expression nesting, the same branch thresholds, the same + * {@code Math.scalb}/{@code Math.floor}/{@code Math.abs} calls. Only the plumbing changed: + * + *
    + *
  • The {@code double[2]} out-parameter is gone. Argument reduction and kernel evaluation + * are fused into one method, {@link #reduceAndKernel}, so the reduced pair {@code (y0, y1)} + * lives in local scalars and never needs a carrier.
  • + *
  • The multi-word path for {@code |x| > 2^19 * (pi/2)} genuinely needs arrays + * ({@code __kernel_rem_pio2} does 24-bit-limb arithmetic over a dynamically sized + * window), so it takes them from a reusable {@link Scratch}. That path is unreachable for + * any angle in radians a coordinate transform can produce; it is supported only so the + * bit-identity claim holds for every input, including {@code Double.MAX_VALUE}.
  • + *
  • The unused {@code prec} settings of {@code __kernel_rem_pio2} are dropped; + * {@code sin}/{@code cos}/{@code tan} only ever call it with {@code prec == 2}, fixing + * {@code jk == 4}.
  • + *
+ * + * The reduced-argument dispatch table, unchanged from fdlibm, with {@code n = k mod 4} for + * {@code y = x - k*pi/2}: + * + *
+ *      n        sin(x)      cos(x)        tan(x)
+ * ----------------------------------------------------
+ *      0          S           C             T
+ *      1          C          -S            -1/T
+ *      2         -S          -C             T
+ *      3         -C           S            -1/T
+ * 
+ * + *

Guarantees

+ * + *
    + *
  • {@code Double.doubleToRawLongBits(sin(x)) == Double.doubleToRawLongBits(StrictMath.sin(x))} + * for every {@code double x}, including subnormals, {@code +/-0.0} (sign preserved), + * {@code +/-Infinity} (NaN out) and NaN (payload preserved through {@code x - x}). + * Verified over ~235,000,000 raw-bit comparisons on Temurin 21.0.11 and 90,000,000 on + * OpenJDK 26.0.2, with zero mismatches; for contrast, {@code Math.sin} differs from + * {@code StrictMath.sin} on 7.27% of arguments drawn uniformly from {@code [-4pi, 4pi]}.
  • + *
  • Zero allocation for every finite input, with the single exception of the first + * {@code |x| > 2^19 * (pi/2)} call on a given thread, which materialises that thread's + * {@link Scratch}. Use the {@link Scratch}-taking overloads to make the guarantee + * unconditional.
  • + *
  • Thread-safe and reentrant: no mutable static state, and each thread's {@link Scratch} + * is private to it.
  • + *
+ * + *

{@code strictfp} is redundant from Java 17 (JEP 306) but is free and removes the question + * on an 8/11 baseline, where an x87 FPU could otherwise evaluate intermediates in 80-bit + * extended precision. + * + * @see StrictMath#sin(double) + */ +public final strictfp class FastStrictTrig { + + private FastStrictTrig() { + throw new UnsupportedOperationException(); + } + + // ------------------------------------------------------------------ + // Bit-manipulation helpers (FdLibm.__HI / __LO / __HI_LO, verbatim) + // ------------------------------------------------------------------ + + /* + * Masks for the high-order 32 bits of an IEEE 754 double: 1 sign bit, then 11 exponent bits, + * then the top 20 significand bits. + */ + private static final int EXP_BITS = 0x7ff0_0000; + private static final int EXP_SIGNIF_BITS = 0x7fff_ffff; + + private static final double TWO24 = 0x1.0p24; + + /** Low-order 32 bits of the argument as an int. */ + private static int __LO(double x) { + return (int) Double.doubleToRawLongBits(x); + } + + /** {@code x}'s high bits with {@code low} as the low bits. */ + private static double __LO(double x, int low) { + long transX = Double.doubleToRawLongBits(x); + return Double.longBitsToDouble((transX & 0xFFFF_FFFF_0000_0000L) + | (low & 0x0000_0000_FFFF_FFFFL)); + } + + /** High-order 32 bits of the argument as an int. */ + private static int __HI(double x) { + return (int) (Double.doubleToRawLongBits(x) >> 32); + } + + /** {@code x}'s low bits with {@code high} as the high bits. */ + private static double __HI(double x, int high) { + long transX = Double.doubleToRawLongBits(x); + return Double.longBitsToDouble((transX & 0x0000_0000_FFFF_FFFFL) + | (((long) high) << 32)); + } + + /** A double assembled from a high and a low word. */ + private static double __HI_LO(int high, int low) { + return Double.longBitsToDouble(((long) high << 32) | (low & 0xffff_ffffL)); + } + + // ------------------------------------------------------------------ + // Public API + // ------------------------------------------------------------------ + + /** + * Returns the sine of an angle in radians, bit-identical to {@link StrictMath#sin(double)}. + * Allocation-free. + * + * @param x an angle, in radians + * @return the sine of {@code x}, bit-for-bit as {@link StrictMath#sin(double)} would return it + */ + public static double sin(double x) { + final int ix = __HI(x) & EXP_SIGNIF_BITS; + if (ix <= 0x3fe9_21fb) { // |x| ~< pi/4 + return kernelSin(x, 0.0, 0); + } else if (ix >= EXP_BITS) { // sin(Inf or NaN) is NaN + return x - x; + } + return reduceAndKernel(x, ix, OP_SIN, null); + } + + /** + * Returns the cosine of an angle in radians, bit-identical to + * {@link StrictMath#cos(double)}. Allocation-free. + * + * @param x an angle, in radians + * @return the cosine of {@code x}, bit-for-bit as {@link StrictMath#cos(double)} would return it + */ + public static double cos(double x) { + final int ix = __HI(x) & EXP_SIGNIF_BITS; + if (ix <= 0x3fe9_21fb) { // |x| ~< pi/4 + return kernelCos(x, 0.0); + } else if (ix >= EXP_BITS) { // cos(Inf or NaN) is NaN + return x - x; + } + return reduceAndKernel(x, ix, OP_COS, null); + } + + /** + * Returns the tangent of an angle in radians, bit-identical to + * {@link StrictMath#tan(double)}. Allocation-free. + * + * @param x an angle, in radians + * @return the tangent of {@code x}, bit-for-bit as {@link StrictMath#tan(double)} would return it + */ + public static double tan(double x) { + final int ix = __HI(x) & EXP_SIGNIF_BITS; + if (ix <= 0x3fe9_21fb) { // |x| ~< pi/4 + return kernelTan(x, 0.0, 1); + } else if (ix >= EXP_BITS) { // tan(Inf or NaN) is NaN + return x - x; + } + return reduceAndKernel(x, ix, OP_TAN, null); + } + + /** + * As {@link #sin(double)}, but taking the caller's {@link Scratch} instead of a thread-local + * one. Allocation-free for every input with no warm-up caveat. + * + * @param x an angle, in radians + * @param scratch reusable working storage; must not be shared between threads. May be + * {@code null}, in which case a thread-local instance is used if needed. + * @return the sine of {@code x}, bit-for-bit as {@link StrictMath#sin(double)} would return it + */ + public static double sin(double x, Scratch scratch) { + final int ix = __HI(x) & EXP_SIGNIF_BITS; + if (ix <= 0x3fe9_21fb) { + return kernelSin(x, 0.0, 0); + } else if (ix >= EXP_BITS) { + return x - x; + } + return reduceAndKernel(x, ix, OP_SIN, scratch); + } + + /** + * As {@link #cos(double)}, but taking the caller's {@link Scratch}. + * + * @param x an angle, in radians + * @param scratch reusable working storage; must not be shared between threads. May be + * {@code null}. + * @return the cosine of {@code x}, bit-for-bit as {@link StrictMath#cos(double)} would return it + */ + public static double cos(double x, Scratch scratch) { + final int ix = __HI(x) & EXP_SIGNIF_BITS; + if (ix <= 0x3fe9_21fb) { + return kernelCos(x, 0.0); + } else if (ix >= EXP_BITS) { + return x - x; + } + return reduceAndKernel(x, ix, OP_COS, scratch); + } + + /** + * As {@link #tan(double)}, but taking the caller's {@link Scratch}. + * + * @param x an angle, in radians + * @param scratch reusable working storage; must not be shared between threads. May be + * {@code null}. + * @return the tangent of {@code x}, bit-for-bit as {@link StrictMath#tan(double)} would return it + */ + public static double tan(double x, Scratch scratch) { + final int ix = __HI(x) & EXP_SIGNIF_BITS; + if (ix <= 0x3fe9_21fb) { + return kernelTan(x, 0.0, 1); + } else if (ix >= EXP_BITS) { + return x - x; + } + return reduceAndKernel(x, ix, OP_TAN, scratch); + } + + /** + * Reusable working storage for the multi-word argument-reduction path, which is entered only + * for {@code |x| > 2^19 * (pi/2)} (about 823550 radians). A {@code Scratch} is + * not thread-safe; give each thread its own, or pass {@code null} and let + * the thread-local one be used. + * + *

Allocating one costs about 550 bytes. A transform kernel that wants a hard + * zero-allocation guarantee over untrusted input should hold one per worker and pass it to + * the {@link #sin(double, Scratch)} family. + */ + public static final class Scratch { + + /** Creates working storage, ready for immediate use. */ + public Scratch() { + } + + // FdLibm.RemPio2.__ieee754_rem_pio2's `double[] tx = new double[3]` + final double[] tx = new double[3]; + // FdLibm.KernelRemPio2.__kernel_rem_pio2's four length-20 working arrays + final int[] iq = new int[20]; + final double[] f = new double[20]; + final double[] fq = new double[20]; + final double[] q = new double[20]; + // stands in for the `double[] y` out-parameter + double y0; + double y1; + } + + private static final ThreadLocal SCRATCH = new ThreadLocal() { + @Override + protected Scratch initialValue() { + return new Scratch(); + } + }; + + // ------------------------------------------------------------------ + // Fused argument reduction + kernel evaluation + // ------------------------------------------------------------------ + + private static final int OP_SIN = 0; + private static final int OP_COS = 1; + private static final int OP_TAN = 2; + + /* + * invpio2: 53 bits of 2/pi + * pio2_1: first 33 bit of pi/2 pio2_1t: pi/2 - pio2_1 + * pio2_2: second 33 bit of pi/2 pio2_2t: pi/2 - (pio2_1+pio2_2) + * pio2_3: third 33 bit of pi/2 pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3) + */ + private static final double + INVPIO2 = 0x1.45f306dc9c883p-1, // 6.36619772367581382433e-01 + PIO2_1 = 0x1.921fb544p0, // 1.57079632673412561417e+00 + PIO2_1T = 0x1.0b4611a626331p-34, // 6.07710050650619224932e-11 + PIO2_2 = 0x1.0b4611a6p-34, // 6.07710050630396597660e-11 + PIO2_2T = 0x1.3198a2e037073p-69, // 2.02226624879595063154e-21 + PIO2_3 = 0x1.3198a2ep-69, // 2.02226624871116645580e-21 + PIO2_3T = 0x1.b839a252049c1p-104; // 8.47842766036889956997e-32 + + private static final int[] NPIO2_HW = { + 0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C, + 0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C, + 0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A, + 0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C, + 0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB, + 0x404858EB, 0x404921FB, + }; + + /** + * The body of {@code FdLibm.RemPio2.__ieee754_rem_pio2} with the {@code double[] y} + * out-parameter replaced by locals, followed immediately by the kernel selection that + * {@code Sin/Cos/Tan.compute} would have performed on {@code y}. + * + *

Precondition, guaranteed by every caller: {@code 0x3fe921fb < ix < EXP_BITS}, i.e. + * {@code x} is finite and {@code |x|} is greater than about {@code pi/4}. The two checks + * that fdlibm repeats here are therefore dead and have been dropped. + * + * @param ix high word of {@code |x|} + * @param op one of {@link #OP_SIN}, {@link #OP_COS}, {@link #OP_TAN} + */ + private static double reduceAndKernel(double x, int ix, int op, Scratch scratch) { + final int hx = __HI(x); + double z, w, t, r, fn; + double y0, y1; + int i, j, n; + + if (ix < 0x4002_d97c) { // |x| < 3pi/4, special case with n = +-1 + if (hx > 0) { + z = x - PIO2_1; + if (ix != 0x3ff9_21fb) { // 33+53 bit pi is good enough + y0 = z - PIO2_1T; + y1 = (z - y0) - PIO2_1T; + } else { // near pi/2, use 33+33+53 bit pi + z -= PIO2_2; + y0 = z - PIO2_2T; + y1 = (z - y0) - PIO2_2T; + } + n = 1; + } else { // negative x + z = x + PIO2_1; + if (ix != 0x3ff9_21fb) { // 33+53 bit pi is good enough + y0 = z + PIO2_1T; + y1 = (z - y0) + PIO2_1T; + } else { // near pi/2, use 33+33+53 bit pi + z += PIO2_2; + y0 = z + PIO2_2T; + y1 = (z - y0) + PIO2_2T; + } + n = -1; + } + return kernel(op, n, y0, y1); + } + + if (ix <= 0x4139_21fb) { // |x| ~<= 2^19*(pi/2), medium size + t = Math.abs(x); + n = (int) (t * INVPIO2 + 0.5); + fn = (double) n; + r = t - fn * PIO2_1; + w = fn * PIO2_1T; // 1st round good to 85 bit + if (n < 32 && ix != NPIO2_HW[n - 1]) { + y0 = r - w; // quick check no cancellation + } else { + j = ix >> 20; + y0 = r - w; + i = j - ((__HI(y0) >> 20) & 0x7ff); + if (i > 16) { // 2nd iteration needed, good to 118 + t = r; + w = fn * PIO2_2; + r = t - w; + w = fn * PIO2_2T - ((t - r) - w); + y0 = r - w; + i = j - ((__HI(y0) >> 20) & 0x7ff); + if (i > 49) { // 3rd iteration needed, 151 bits acc + t = r; // will cover all possible cases + w = fn * PIO2_3; + r = t - w; + w = fn * PIO2_3T - ((t - r) - w); + y0 = r - w; + } + } + } + y1 = (r - y0) - w; + if (hx < 0) { + y0 = -y0; + y1 = -y1; + n = -n; + } + return kernel(op, n, y0, y1); + } + + /* + * All other (large) arguments. fdlibm handles Inf/NaN here; the public entry points + * already did, so only the multi-word path remains. + */ + final Scratch s = (scratch != null) ? scratch : SCRATCH.get(); + final double[] tx = s.tx; + + // set z = scalbn(|x|, ilogb(x) - 23) + z = 0.0; + z = __LO(z, __LO(x)); + final int e0 = (ix >> 20) - 1046; // e0 = ilogb(z) - 23 + z = __HI(z, ix - (e0 << 20)); + for (i = 0; i < 2; i++) { + tx[i] = (double) ((int) (z)); + z = (z - tx[i]) * TWO24; + } + tx[2] = z; + int nx = 3; + while (tx[nx - 1] == 0.0) { // skip zero term + nx--; + } + n = kernelRemPio2(tx, e0, nx, s); + y0 = s.y0; + y1 = s.y1; + if (hx < 0) { + y0 = -y0; + y1 = -y1; + n = -n; + } + return kernel(op, n, y0, y1); + } + + /** + * fdlibm's post-reduction dispatch: the {@code switch (n & 3)} in {@code Sin.compute} and + * {@code Cos.compute}, and the {@code 1 - ((n & 1) << 1)} sign in {@code Tan.compute}. + */ + private static double kernel(int op, int n, double y0, double y1) { + if (op == OP_TAN) { + return kernelTan(y0, y1, 1 - ((n & 1) << 1)); // 1 -- n even; -1 -- n odd + } + final boolean isSin = (op == OP_SIN); + switch (n & 3) { + case 0: + return isSin ? kernelSin(y0, y1, 1) : kernelCos(y0, y1); + case 1: + return isSin ? kernelCos(y0, y1) : -kernelSin(y0, y1, 1); + case 2: + return isSin ? -kernelSin(y0, y1, 1) : -kernelCos(y0, y1); + default: + return isSin ? -kernelCos(y0, y1) : kernelSin(y0, y1, 1); + } + } + + // ------------------------------------------------------------------ + // FdLibm.Sin.__kernel_sin + // ------------------------------------------------------------------ + + private static final double + S1 = -0x1.5555555555549p-3, // -1.66666666666666324348e-01 + S2 = 0x1.111111110f8a6p-7, // 8.33333333332248946124e-03 + S3 = -0x1.a01a019c161d5p-13, // -1.98412698298579493134e-04 + S4 = 0x1.71de357b1fe7dp-19, // 2.75573137070700676789e-06 + S5 = -0x1.ae5e68a2b9cebp-26, // -2.50507602534068634195e-08 + S6 = 0x1.5d93a5acfd57cp-33; // 1.58969099521155010221e-10 + + /** + * Kernel sine on {@code [-pi/4, pi/4]}. {@code y} is the tail of {@code x}; {@code iy == 0} + * means the tail is zero. + */ + private static double kernelSin(double x, double y, int iy) { + double z, r, v; + int ix; + ix = __HI(x) & EXP_SIGNIF_BITS; // high word of x + if (ix < 0x3e40_0000) { // |x| < 2**-27 + if ((int) x == 0) // generate inexact + return x; + } + z = x * x; + v = z * x; + r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6))); + if (iy == 0) { + return x + v * (S1 + z * r); + } else { + return x - ((z * (0.5 * y - v * r) - y) - v * S1); + } + } + + // ------------------------------------------------------------------ + // FdLibm.Cos.__kernel_cos + // ------------------------------------------------------------------ + + private static final double + C1 = 0x1.555555555554cp-5, // 4.16666666666666019037e-02 + C2 = -0x1.6c16c16c15177p-10, // -1.38888888888741095749e-03 + C3 = 0x1.a01a019cb159p-16, // 2.48015872894767294178e-05 + C4 = -0x1.27e4f809c52adp-22, // -2.75573143513906633035e-07 + C5 = 0x1.1ee9ebdb4b1c4p-29, // 2.08757232129817482790e-09 + C6 = -0x1.8fae9be8838d4p-37; // -1.13596475577881948265e-11 + + /** Kernel cosine on {@code [-pi/4, pi/4]}. {@code y} is the tail of {@code x}. */ + private static double kernelCos(double x, double y) { + double a, hz, z, r, qx; + int ix; + ix = __HI(x) & EXP_SIGNIF_BITS; // ix = |x|'s high word + if (ix < 0x3e40_0000) { // if x < 2**-27 + if (((int) x) == 0) { // generate inexact + return 1.0; + } + } + z = x * x; + r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6))))); + if (ix < 0x3FD3_3333) { // if |x| < 0.3 + return 1.0 - (0.5 * z - (z * r - x * y)); + } else { + if (ix > 0x3fe9_0000) { // x > 0.78125 + qx = 0.28125; + } else { + qx = __HI_LO(ix - 0x0020_0000, 0); + } + hz = 0.5 * z - qx; + a = 1.0 - qx; + return a - (hz - (z * r - x * y)); + } + } + + // ------------------------------------------------------------------ + // FdLibm.Tan.__kernel_tan + // ------------------------------------------------------------------ + + private static final double + PIO4 = 0x1.921fb54442d18p-1, // 7.85398163397448278999e-01 + PIO4LO = 0x1.1a62633145c07p-55; // 3.06161699786838301793e-17 + + /* + * FdLibm's T[0..12], unrolled into named constants: the coefficients are used at fixed + * indices only, so the array (and its bounds checks) buy nothing. + */ + private static final double + T0 = 0x1.5555555555563p-2, // 3.33333333333334091986e-01 + T1 = 0x1.111111110fe7ap-3, // 1.33333333333201242699e-01 + T2 = 0x1.ba1ba1bb341fep-5, // 5.39682539762260521377e-02 + T3 = 0x1.664f48406d637p-6, // 2.18694882948595424599e-02 + T4 = 0x1.226e3e96e8493p-7, // 8.86323982359930005737e-03 + T5 = 0x1.d6d22c9560328p-9, // 3.59207910759131235356e-03 + T6 = 0x1.7dbc8fee08315p-10, // 1.45620945432529025516e-03 + T7 = 0x1.344d8f2f26501p-11, // 5.88041240820264096874e-04 + T8 = 0x1.026f71a8d1068p-12, // 2.46463134818469906812e-04 + T9 = 0x1.47e88a03792a6p-14, // 7.81794442939557092300e-05 + T10 = 0x1.2b80f32f0a7e9p-14, // 7.14072491382608190305e-05 + T11 = -0x1.375cbdb605373p-16, // -1.85586374855275456654e-05 + T12 = 0x1.b2a7074bf7ad4p-16; // 2.59073051863633712884e-05 + + /** + * Kernel tangent on {@code [-pi/4, pi/4]}. {@code y} is the tail of {@code x}; + * {@code iy == 1} returns {@code tan}, {@code iy == -1} returns {@code -1/tan}. + */ + private static double kernelTan(double x, double y, int iy) { + double z, r, v, w, s; + int ix, hx; + hx = __HI(x); // high word of x + ix = hx & EXP_SIGNIF_BITS; // high word of |x| + if (ix < 0x3e30_0000) { // x < 2**-28 + if ((int) x == 0) { // generate inexact + if (((ix | __LO(x)) | (iy + 1)) == 0) { + return 1.0 / Math.abs(x); + } else { + if (iy == 1) { + return x; + } else { // compute -1 / (x+y) carefully + double a, t; + + z = w = x + y; + z = __LO(z, 0); + v = y - (z - x); + t = a = -1.0 / w; + t = __LO(t, 0); + s = 1.0 + t * z; + return t + a * (s + t * v); + } + } + } + } + if (ix >= 0x3FE5_9428) { // |x| >= 0.6744 + if (hx < 0) { + x = -x; + y = -y; + } + z = PIO4 - x; + w = PIO4LO - y; + x = z + w; + y = 0.0; + } + z = x * x; + w = z * z; + /* + * Break x^5*(T[1]+x^2*T[2]+...) into + * x^5(T[1]+x^4*T[3]+...+x^20*T[11]) + + * x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12])) + */ + r = T1 + w * (T3 + w * (T5 + w * (T7 + w * (T9 + w * T11)))); + v = z * (T2 + w * (T4 + w * (T6 + w * (T8 + w * (T10 + w * T12))))); + s = z * x; + r = y + z * (s * (r + v) + y); + r += T0 * s; + w = x + r; + if (ix >= 0x3FE5_9428) { + v = (double) iy; + return (double) (1 - ((hx >> 30) & 2)) * (v - 2.0 * (x - (w * w / (w + v) - r))); + } + if (iy == 1) { + return w; + } else { + /* + * If an error of up to 2 ulp were allowed this could simply return -1.0/(x + r); + * instead compute -1.0/(x + r) accurately. + */ + double a, t; + z = w; + z = __LO(z, 0); + v = r - (z - x); // z + v = r + x + t = a = -1.0 / w; // a = -1.0/w + t = __LO(t, 0); + s = 1.0 + t * z; + return t + a * (s + t * v); + } + } + + // ------------------------------------------------------------------ + // FdLibm.KernelRemPio2.__kernel_rem_pio2, specialised to prec == 2 + // ------------------------------------------------------------------ + + /** 396 hex digits (476 decimal) of 2/pi, in 24-bit limbs. */ + private static final int[] TWO_OVER_PI = { + 0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, + 0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, + 0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, + 0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, + 0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, + 0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF, + 0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, + 0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, + 0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, + 0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, + 0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B, + }; + + /** pi/2 cut into 24-bit chunks. */ + private static final double[] PIO2 = { + 0x1.921fb4p0, // 1.57079625129699707031e+00 + 0x1.4442dp-24, // 7.54978941586159635335e-08 + 0x1.846988p-48, // 5.39030252995776476554e-15 + 0x1.8cc516p-72, // 3.28200341580791294123e-22 + 0x1.01b838p-96, // 1.27065575308067607349e-29 + 0x1.a25204p-120, // 1.22933308981111328932e-36 + 0x1.382228p-145, // 2.73370053816464559624e-44 + 0x1.9f31dp-169, // 2.16741683877804819444e-51 + }; + + private static final double TWON24 = 0x1.0p-24; + + /** + * {@code __kernel_rem_pio2} with {@code prec} fixed at 2 (the only value + * {@code sin}/{@code cos}/{@code tan} use, giving {@code jk = init_jk[2] = 4}), its four + * length-20 working arrays taken from {@code s}, and its {@code double[] y} out-parameter + * written to {@code s.y0} / {@code s.y1}. + * + *

Every index read in a call is written earlier in that same call, so the arrays need no + * clearing between calls. In particular {@code f}, {@code q} and {@code iq} are filled to at + * least {@code jz} before the summation loops read them, and the {@code iq[jz]} read after + * the distillation loop follows either a decrement of {@code jz} or an assignment. + * + * @return {@code n & 7}, the last three digits of {@code N} in {@code y = x - N*pi/2} + */ + private static int kernelRemPio2(double[] x, int e0, int nx, Scratch s) { + int jz, jx, jv, jp, jk, carry, n, i, j, k, m, q0, ih; + double z, fw; + final int[] iq = s.iq; + final double[] f = s.f; + final double[] fq = s.fq; + final double[] q = s.q; + + // initialize jk + jk = 4; // == init_jk[prec] for prec == 2 + jp = jk; + + // determine jx, jv, q0, note that 3 > q0 + jx = nx - 1; + jv = (e0 - 3) / 24; + if (jv < 0) { + jv = 0; + } + q0 = e0 - 24 * (jv + 1); + + // set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] + j = jv - jx; + m = jx + jk; + for (i = 0; i <= m; i++, j++) { + f[i] = (j < 0) ? 0.0 : (double) TWO_OVER_PI[j]; + } + + // compute q[0],q[1],...q[jk] + for (i = 0; i <= jk; i++) { + for (j = 0, fw = 0.0; j <= jx; j++) { + fw += x[j] * f[jx + i - j]; + } + q[i] = fw; + } + + jz = jk; + while (true) { + // distill q[] into iq[] reversingly + for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--) { + fw = (double) ((int) (TWON24 * z)); + iq[i] = (int) (z - TWO24 * fw); + z = q[j - 1] + fw; + } + + // compute n + z = Math.scalb(z, q0); // actual value of z + z -= 8.0 * Math.floor(z * 0.125); // trim off integer >= 8 + n = (int) z; + z -= (double) n; + ih = 0; + if (q0 > 0) { // need iq[jz - 1] to determine n + i = (iq[jz - 1] >> (24 - q0)); + n += i; + iq[jz - 1] -= i << (24 - q0); + ih = iq[jz - 1] >> (23 - q0); + } else if (q0 == 0) { + ih = iq[jz - 1] >> 23; + } else if (z >= 0.5) { + ih = 2; + } + + if (ih > 0) { // q > 0.5 + n += 1; + carry = 0; + for (i = 0; i < jz; i++) { // compute 1-q + j = iq[i]; + if (carry == 0) { + if (j != 0) { + carry = 1; + iq[i] = 0x100_0000 - j; + } + } else { + iq[i] = 0xff_ffff - j; + } + } + if (q0 > 0) { // rare case: chance is 1 in 12 + switch (q0) { + case 1: + iq[jz - 1] &= 0x7f_ffff; + break; + case 2: + iq[jz - 1] &= 0x3f_ffff; + break; + } + } + if (ih == 2) { + z = 1.0 - z; + if (carry != 0) { + z -= Math.scalb(1.0, q0); + } + } + } + + // check if recomputation is needed + if (z == 0.0) { + j = 0; + for (i = jz - 1; i >= jk; i--) { + j |= iq[i]; + } + if (j == 0) { // need recomputation + for (k = 1; iq[jk - k] == 0; k++) { + // k = no. of terms needed + } + + for (i = jz + 1; i <= jz + k; i++) { // add q[jz+1] to q[jz+k] + f[jx + i] = (double) TWO_OVER_PI[jv + i]; + for (j = 0, fw = 0.0; j <= jx; j++) { + fw += x[j] * f[jx + i - j]; + } + q[i] = fw; + } + jz += k; + continue; + } else { + break; + } + } else { + break; + } + } + + // chop off zero terms + if (z == 0.0) { + jz -= 1; + q0 -= 24; + while (iq[jz] == 0) { + jz--; + q0 -= 24; + } + } else { // break z into 24-bit if necessary + z = Math.scalb(z, -q0); + if (z >= TWO24) { + fw = (double) ((int) (TWON24 * z)); + iq[jz] = (int) (z - TWO24 * fw); + jz += 1; + q0 += 24; + iq[jz] = (int) fw; + } else { + iq[jz] = (int) z; + } + } + + // convert integer "bit" chunk to floating-point value + fw = Math.scalb(1.0, q0); + for (i = jz; i >= 0; i--) { + q[i] = fw * (double) iq[i]; + fw *= TWON24; + } + + // compute PIo2[0,...,jp]*q[jz,...,0] + for (i = jz; i >= 0; i--) { + for (fw = 0.0, k = 0; k <= jp && k <= jz - i; k++) { + fw += PIO2[k] * q[i + k]; + } + fq[jz - i] = fw; + } + + // compress fq[] into y[] -- fdlibm's `case 1: case 2:` arm + fw = 0.0; + for (i = jz; i >= 0; i--) { + fw += fq[i]; + } + s.y0 = (ih == 0) ? fw : -fw; + fw = fq[0] - fw; + for (i = 1; i <= jz; i++) { + fw += fq[i]; + } + s.y1 = (ih == 0) ? fw : -fw; + + return n & 7; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/FloatPolarCoordinate.java b/core/src/main/java/org/locationtech/proj4j/util/FloatPolarCoordinate.java index 245d3fe..bbc4ab5 100755 --- a/core/src/main/java/org/locationtech/proj4j/util/FloatPolarCoordinate.java +++ b/core/src/main/java/org/locationtech/proj4j/util/FloatPolarCoordinate.java @@ -19,6 +19,8 @@ public final class FloatPolarCoordinate implements Serializable { + private static final long serialVersionUID = 1730033191364185363L; + public float lam, phi; public FloatPolarCoordinate(FloatPolarCoordinate that) { @@ -30,9 +32,21 @@ public FloatPolarCoordinate(float lam, float phi) { this.phi = phi; } + /** + * {@inheritDoc} + * + *

The bitwise-OR combiner, the {@code new Float(...)} box and the {@code -0.0f}/{@code 0.0f} + * disagreement with {@link #equals} are the same three defects documented on + * {@link PolarCoordinate#hashCode()}, and they matter most here: this is the element type of + * {@code Grid.ConversionTable.cvs}, so {@code Arrays.hashCode(cvs)} runs this once per grid + * node — 1,048,576 times for the shipped {@code ntv1_can.dat}. + */ @Override public int hashCode() { - return new Float(lam).hashCode() | (17 * new Float(phi).hashCode()); + int h = 17; + h = 31 * h + Float.hashCode(lam == 0.0f ? 0.0f : lam); + h = 31 * h + Float.hashCode(phi == 0.0f ? 0.0f : phi); + return h; } @Override diff --git a/core/src/main/java/org/locationtech/proj4j/util/GenericInverse2D.java b/core/src/main/java/org/locationtech/proj4j/util/GenericInverse2D.java new file mode 100644 index 0000000..c42ac57 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/GenericInverse2D.java @@ -0,0 +1,203 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; + +/** + * Inverts a forward projection numerically: a port of {@code pj_generic_inverse_2d} from + * {@code 9.8.1:src/generic_inverse.cpp:44-111}. + * + *

Two-dimensional Newton-Raphson on the pair + *

+ *   f_x(lam, phi) = forward(lam, phi).x - x
+ *   f_y(lam, phi) = forward(lam, phi).y - y
+ * 
+ * with the Jacobian estimated by one-sided finite differences of the forward map itself. + * + *

Every threshold here is upstream's and none of them is arbitrary. PROJ's own + * comment says they "have been verified to work with adams_ws2 and wink2", and the callers + * pair them with hand-tuned initial guesses; the {@code gie} inverse blocks for + * {@code peirce_q} carry a 150 mm tolerance precisely because the combination is fragile. + * In particular: + * + *

    + *
  • 15 iterations, no more. Not "iterate until converged" — the seeds are chosen + * against this budget. + *
  • The Jacobian is refreshed on iteration 0 and then only while + * {@code |dx| > 1e-6 || |dy| > 1e-6}. Once close, the last inverse Jacobian is + * reused; this is upstream's speed optimisation and it changes the iterates. + *
  • The finite-difference step points inward: {@code dLam = lam > 0 ? -1e-6 : 1e-6}, + * likewise for {@code phi}. The sign flip keeps the probe inside the domain at + * {@code lam = +/-pi} and {@code phi = +/-pi/2}, where a step outward would push the + * forward map out of range. + *
  • A singular Jacobian is not an error. When {@code det == 0} the previous inverse + * Jacobian is silently reused (on iteration 0 that means the zero matrix, i.e. no step). + *
  • Each correction is clamped to {@code [-0.3, 0.3]} radians before it is applied, + * then {@code lam} is clamped to {@code [-pi, pi]} and {@code phi} to + * {@code [-pi/2, pi/2]}. The step clamp is what stops a bad seed from overshooting into + * a different sheet of the projection, and removing it breaks {@code peirce_q}'s + * quadrant heuristics. + *
+ * + *

Non-convergence throws. Upstream sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} on the context and then + * still returns the last iterate ({@code generic_inverse.cpp:108-110}); the caller, + * {@code pj_inv}'s {@code error_or_coord}, is what discards it. proj4j has no errno channel, + * so the discarding has to happen here — returning the last iterate would be exactly the + * "failure expressed as a plausible coordinate" that this port exists to avoid. + * + *

Not adams-specific: {@code 9.8.1:src/projections/wink2.cpp:51} and + * {@code 9.8.1:src/projections/cass.cpp:81} call the same routine. + */ +public final class GenericInverse2D { + + /** {@code M_HALFPI}. */ + private static final double HALF_PI = Math.PI / 2.0; + + /** Upstream's iteration bound, {@code generic_inverse.cpp:51}. */ + public static final int MAX_ITERATIONS = 15; + + /** + * Above this residual the Jacobian is re-estimated every iteration + * ({@code generic_inverse.cpp:60}). + */ + private static final double JACOBIAN_REFRESH = 1e-6; + + /** Finite-difference step magnitude ({@code generic_inverse.cpp:65,72}). */ + private static final double FD_STEP = 1e-6; + + /** Correction clamp, in radians ({@code generic_inverse.cpp:93,101}). */ + private static final double MAX_STEP = 0.3; + + /** + * The raw forward map of a projection: radians in, unscaled projected units out, with + * no false origin, no {@code totalScale} and no unit conversion. + * + *

Deliberately not {@code Projection} itself. {@code Projection.project(double, + * double, ProjCoordinate)} is {@code protected}, and widening it to satisfy a utility + * class would change proj4j's public surface for every projection at once. + */ + public interface Forward2D { + + /** + * @param lam longitude relative to the central meridian, in radians + * @param phi latitude, in radians + * @param dst receives the projected coordinate; must be written, not returned + */ + void forward(double lam, double phi, ProjCoordinate dst); + } + + private GenericInverse2D() { + } + + /** + * Solves {@code forward(lam, phi) == (x, y)}. + * + * @param x target easting, in the forward map's raw units + * @param y target northing, in the forward map's raw units + * @param forward the map to invert + * @param lamInitial seed longitude, radians + * @param phiInitial seed latitude, radians + * @param deltaXYTolerance convergence bound on both residuals; every caller in the + * adams family passes {@code 1e-10} + * @param dst receives {@code (lam, phi)} in radians, as {@code (x, y)} + * @return {@code dst} + * @throws ProjectionException if 15 iterations do not converge + */ + public static ProjCoordinate solve(double x, double y, Forward2D forward, + double lamInitial, double phiInitial, double deltaXYTolerance, + ProjCoordinate dst) { + double lam = lamInitial; + double phi = phiInitial; + double derivLamX = 0; + double derivLamY = 0; + double derivPhiX = 0; + double derivPhiY = 0; + + // One scratch coordinate for the iterate and one for the finite-difference probe. + // Allocating inside the loop would cost 45 short-lived objects per inverse call on + // a path that peirce_q's roundtrips hit 47 times per gie block. + final ProjCoordinate approx = new ProjCoordinate(); + final ProjCoordinate probe = new ProjCoordinate(); + + for (int i = 0; i < MAX_ITERATIONS; i++) { + forward.forward(lam, phi, approx); + final double deltaX = approx.x - x; + final double deltaY = approx.y - y; + if (Math.abs(deltaX) < deltaXYTolerance && Math.abs(deltaY) < deltaXYTolerance) { + dst.x = lam; + dst.y = phi; + return dst; + } + + if (i == 0 || Math.abs(deltaX) > JACOBIAN_REFRESH + || Math.abs(deltaY) > JACOBIAN_REFRESH) { + final double dLam = lam > 0 ? -FD_STEP : FD_STEP; + forward.forward(lam + dLam, phi, probe); + final double derivXLam = (probe.x - approx.x) / dLam; + final double derivYLam = (probe.y - approx.y) / dLam; + + final double dPhi = phi > 0 ? -FD_STEP : FD_STEP; + forward.forward(lam, phi + dPhi, probe); + final double derivXPhi = (probe.x - approx.x) / dPhi; + final double derivYPhi = (probe.y - approx.y) / dPhi; + + final double det = derivXLam * derivYPhi - derivXPhi * derivYLam; + if (det != 0) { + derivLamX = derivYPhi / det; + derivLamY = -derivXPhi / det; + derivPhiX = -derivYLam / det; + derivPhiY = derivXLam / det; + } + // det == 0: reuse the previous inverse Jacobian, exactly as upstream does. + } + + final double deltaLam = clamp(deltaX * derivLamX + deltaY * derivLamY); + lam -= deltaLam; + if (lam < -Math.PI) { + lam = -Math.PI; + } else if (lam > Math.PI) { + lam = Math.PI; + } + + final double deltaPhi = clamp(deltaX * derivPhiX + deltaY * derivPhiY); + phi -= deltaPhi; + if (phi < -HALF_PI) { + phi = -HALF_PI; + } else if (phi > HALF_PI) { + phi = HALF_PI; + } + } + + throw new ProjectionException( + "generic 2D inverse did not converge in " + MAX_ITERATIONS + + " iterations for (" + x + ", " + y + ")"); + } + + /** + * {@code std::max(std::min(v, 0.3), -0.3)}. Written with the same nesting as upstream: + * for {@code v = NaN} both {@code Math.min} and {@code Math.max} propagate the NaN, so a + * NaN step stays NaN, {@code lam} becomes NaN, the residual test stays false, and the + * loop runs out and throws — which is the correct outcome and the one C reaches by a + * different route. + */ + private static double clamp(double v) { + return Math.max(Math.min(v, MAX_STEP), -MAX_STEP); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/IntPolarCoordinate.java b/core/src/main/java/org/locationtech/proj4j/util/IntPolarCoordinate.java index 9df1c01..35be4fc 100755 --- a/core/src/main/java/org/locationtech/proj4j/util/IntPolarCoordinate.java +++ b/core/src/main/java/org/locationtech/proj4j/util/IntPolarCoordinate.java @@ -19,6 +19,8 @@ public final class IntPolarCoordinate implements Serializable { + private static final long serialVersionUID = 7434875552387864261L; + public int lam, phi; public IntPolarCoordinate(IntPolarCoordinate that) { @@ -35,9 +37,20 @@ public String toString() { return String.format("ILP %x:%x", lam, phi); } + /** + * {@inheritDoc} + * + *

The combiner was {@code |}; see {@link org.locationtech.proj4j.util.PolarCoordinate#hashCode()}. + * A grid's {@code lim} is a small pair of positive ints, so the old expression's high bits were + * always zero and its low bits saturated: {@code 100|17*100} and {@code 101|17*101} both come + * out with almost every bit of the smaller operand absorbed. + */ @Override public int hashCode() { - return lam | (17 * phi); + int h = 17; + h = 31 * h + lam; + h = 31 * h + phi; + return h; } @Override diff --git a/core/src/main/java/org/locationtech/proj4j/util/MathHelpers.java b/core/src/main/java/org/locationtech/proj4j/util/MathHelpers.java new file mode 100644 index 0000000..eba7f4e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/MathHelpers.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * The floating-point primitives Java lacks but PROJ's numerical core needs: + * {@code asinh}, {@code atanh}, and a cheap two-argument norm. + * + *

Math vs StrictMath: this class uses {@link StrictMath#log} and + * {@link StrictMath#log1p} rather than {@link Math}. HotSpot ships an + * architecture-specific intrinsic for {@code Math.log} on both x86-64 and AArch64, and + * they differ at the last bit; {@code StrictMath} is fdlibm and identical everywhere, + * which is what makes per-CRS derived constants bit-reproducible. {@code Math.sqrt} and + * {@code Math.abs} are used, because IEEE-754 specifies {@code sqrt} as exactly + * rounded and {@code abs} is a sign-bit mask — there is nothing for a platform to vary. + * ({@code Math.log1p} has no intrinsic today and already delegates to + * {@code StrictMath}, so naming {@code StrictMath} explicitly costs nothing and insures + * against a future one.) + * + *

{@link Math#hypot} is deliberately absent: it is the fdlibm implementation, + * roughly ten times the cost of a {@code sqrt}, and every operand in the numerical core + * is bounded well away from overflow. Use {@link #norm2} instead. + */ +public final strictfp class MathHelpers { + + /** {@code log(2)}, needed by {@link #asinh}'s overflow branch. */ + private static final double LN2 = 0.6931471805599453094172321214581766; + + private MathHelpers() { + } + + /** + * The inverse hyperbolic sine, {@code log(x + sqrt(x*x + 1))}, computed in three + * regimes so that it is accurate over the whole range. + * + *

The {@code y <= 1} branch uses {@code log1p} on the algebraically rearranged + * argument {@code y + y*y/(1 + sqrt(1 + y*y))}. That is what keeps {@code merc} + * correct at the equator: the naive form evaluates {@code log(1 + something tiny)}, + * whose leading 1 destroys every significant bit of the small term. The + * {@code y > 1e150} branch avoids squaring into overflow by using + * {@code asinh(y) ~ log(y) + log(2)}. + * + *

Signed zero: the sign is restored with {@code x < 0.0}, which is false + * for {@code -0.0}, so {@code asinh(-0.0)} returns {@code +0.0} where C's + * {@code asinh} returns {@code -0.0}. This matches the reference Java form specified + * for this port and is retained deliberately rather than "fixed" with + * {@link Math#copySign}; the only consumer that could observe it is a false-easting + * of {@code -0.0} in {@code etmerc}'s forward at exactly the central meridian. + * + * @param x the argument + * @return {@code asinh(x)} + */ + public static double asinh(double x) { + final double y = Math.abs(x); + final double r; + if (y > 1.0e150) { + r = StrictMath.log(y) + LN2; // y * y would overflow + } else if (y > 1.0) { + r = StrictMath.log(y + Math.sqrt(y * y + 1.0)); + } else { + r = StrictMath.log1p(y + y * y / (1.0 + Math.sqrt(1.0 + y * y))); + } + return x < 0.0 ? -r : r; + } + + /** + * The inverse hyperbolic tangent, {@code 0.5 * log((1 + x) / (1 - x))}, evaluated as + * {@code 0.5 * log1p(2*y / (1 - y))}. + * + *

The {@code log1p} form avoids the cancellation that the direct quotient-of-logs + * form suffers for small {@code |x|}. proj4j's existing {@code qsfn} + * ({@code ProjectionMath.java:436-445}) computes + * {@code 0.5 * log((1 - x) / (1 + x))} and loses relative accuracy near + * {@code phi = 0} for exactly that reason. Every caller in the numerical core passes + * {@code e * sin(phi)}, whose magnitude is below 0.09 for any Earth ellipsoid, so + * this form is uniformly accurate in practice. + * + *

{@code atanh(1)} is {@code +Infinity}, {@code atanh(-1)} is {@code -Infinity}, + * and {@code |x| > 1} yields {@code NaN}, as in C. As with {@link #asinh}, + * {@code atanh(-0.0)} returns {@code +0.0} rather than {@code -0.0}. + * + * @param x the argument + * @return {@code atanh(x)} + */ + public static double atanh(double x) { + final double y = Math.abs(x); + final double r = 0.5 * StrictMath.log1p(2.0 * y / (1.0 - y)); + return x < 0.0 ? -r : r; + } + + /** + * The Euclidean norm {@code sqrt(a*a + b*b)}, without {@code hypot}'s scaling + * machinery. + * + *

Callers must keep operands inside about {@code 1e150} in magnitude and outside + * about {@code 1e-150}; every use in the numerical core is a trigonometric ratio or + * a coordinate normalised by the semi-major axis, so this holds by construction. + * + * @param a first component + * @param b second component + * @return {@code sqrt(a*a + b*b)} + */ + public static double norm2(double a, double b) { + return Math.sqrt(a * a + b * b); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/MeridianArc.java b/core/src/main/java/org/locationtech/proj4j/util/MeridianArc.java new file mode 100644 index 0000000..a0d5108 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/util/MeridianArc.java @@ -0,0 +1,207 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +/** + * Meridional distance and its inverse, a port of PROJ 9.8.1's {@code src/mlfn.cpp:9-31} + * ({@code pj_enfn}, {@code pj_mlfn}, {@code pj_inv_mlfn}). + * + *

Both directions are 6th-order expansions in the third flattening {@code n}, + * not in {@code es} as PROJ 4 and proj4j's + * {@code ProjectionMath.enfn/mlfn/inv_mlfn} do. That is the whole point: the pair + * {@code phi -> mu} and {@code mu -> phi} are both closed-form Clenshaw sums, so + * + *

    + *
  • {@link #invMlfn} has no iteration, where proj4j's {@code inv_mlfn} is a + * 10-step Newton loop with a data-dependent trip count — and therefore a + * platform-dependent answer, not merely a platform-dependent latency; and + *
  • the forward direction gains about three decimal digits. Measured on GRS80 over + * 0-90 degrees, proj4j's {@code mlfn} is up to 4,920 nm from the truth against the + * 50 nm bar that {@code tmerc}'s conformance assertions set; this series is under 1 nm. + *
+ * + *

Because the two directions and the multiplier {@code en[0]} come from one series + * family, they must be ported and used as a set — mixing an {@code n}-series forward + * with an {@code es}-series inverse is incoherent. + * + *

Instances are immutable and thread safe. Construct one per ellipsoid and reuse it; + * construction costs one {@code sqrt} and two coefficient evaluations. + * + *

One deliberate deviation from upstream. {@link #invMlfn} multiplies by a + * precomputed reciprocal of the rectifying radius where PROJ divides + * ({@code mu / en[0]}). The difference is at most 1 ulp on the rectifying latitude, + * i.e. 3e-16 rad, about 2 pm on the ground — eight orders of magnitude inside the + * tightest conformance bar — and it takes a division out of the per-vertex path. + * + *

Math vs StrictMath: construction is {@code sqrt} and exact arithmetic only. + * The evaluation methods that take {@code sin} and {@code cos} as arguments use no + * transcendentals at all; the convenience overloads that do not + * ({@link #mlfn(double)}, {@link #invMlfn(double)}) go through {@link Clenshaw6}, which + * uses {@code StrictMath.sin/cos} for cross-architecture determinism. + * + * @see AuxLat + * @see Clenshaw6 + */ +public final strictfp class MeridianArc implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + + private final double n; + private final double rectifyingRadius; + private final double invRectifyingRadius; + private final Clenshaw6 phiToMu; + private final Clenshaw6 muToPhi; + + /** + * Builds the series for a given third flattening. + * + *

Equivalent to {@code pj_enfn(n)}: {@code en[0]} becomes + * {@link #rectifyingRadius()}, {@code en[1..6]} the {@code phi -> mu} coefficients + * and {@code en[7..12]} the {@code mu -> phi} coefficients. + * + * @param n the third flattening, {@code (a - b) / (a + b)}; full double precision + * requires {@code |f| <= 1/150} + */ + public MeridianArc(double n) { + this.n = n; + this.rectifyingRadius = AuxLat.rectifyingRadius(n); + this.invRectifyingRadius = 1.0 / this.rectifyingRadius; + this.phiToMu = Clenshaw6.forConversion(n, AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING); + this.muToPhi = Clenshaw6.forConversion(n, AuxLat.RECTIFYING, AuxLat.GEOGRAPHIC); + } + + /** + * Builds the series from the squared first eccentricity, deriving {@code n} through + * {@link AuxLat#thirdFlattening}. + * + * @param es the squared first eccentricity + * @return the series for that ellipsoid + */ + public static MeridianArc fromEs(double es) { + return new MeridianArc(AuxLat.thirdFlattening(es)); + } + + /** + * The third flattening this instance was built for. + * + * @return {@code n} + */ + public double thirdFlattening() { + return n; + } + + /** + * The rectifying radius, {@code (quarter meridian) / ((pi/2) * a)} — upstream's + * {@code en[0]}. + * + * @return the rectifying radius, in units of the semi-major axis + */ + public double rectifyingRadius() { + return rectifyingRadius; + } + + /** + * Meridional distance from the equator, in units of the semi-major axis. Port of + * {@code pj_mlfn}: {@code en[0] * (phi + clenshaw(sin phi, cos phi, en + 1))}. + * + * @param phi the geographic latitude, radians + * @param sphi {@code sin(phi)} + * @param cphi {@code cos(phi)} + * @return the meridional arc length, divided by the semi-major axis + */ + public double mlfn(double phi, double sphi, double cphi) { + return rectifyingRadius * phiToMu.convert(phi, sphi, cphi); + } + + /** + * Meridional distance from the equator, computing the sine and cosine internally. + * + * @param phi the geographic latitude, radians + * @return the meridional arc length, divided by the semi-major axis + */ + public double mlfn(double phi) { + return rectifyingRadius * phiToMu.convert(phi); + } + + /** + * The rectifying latitude {@code mu} corresponding to a geographic latitude — the + * meridional distance rescaled to radians. + * + * @param phi the geographic latitude, radians + * @param sphi {@code sin(phi)} + * @param cphi {@code cos(phi)} + * @return the rectifying latitude, radians + */ + public double rectifyingLat(double phi, double sphi, double cphi) { + return phiToMu.convert(phi, sphi, cphi); + } + + /** + * Geographic latitude from meridional distance. Port of {@code pj_inv_mlfn}: + * closed form, {@code clenshaw} applied to {@code mu / en[0]}, with no + * iteration whatsoever. proj4j's equivalent is a 10-step Newton loop that calls + * {@code sin}, {@code cos}, {@code mlfn} and a {@code sqrt} per trip. + * + * @param mu the meridional arc length, divided by the semi-major axis + * @return the geographic latitude, radians + */ + public double invMlfn(double mu) { + return muToPhi.convert(mu * invRectifyingRadius); + } + + /** + * Geographic latitude from rectifying latitude, closed form. + * + * @param mu the rectifying latitude, radians + * @return the geographic latitude, radians + */ + public double invRectifyingLat(double mu) { + return muToPhi.convert(mu); + } + + /** + * Geographic latitude from rectifying latitude, given the latter's sine and cosine. + * + * @param mu the rectifying latitude, radians + * @param smu {@code sin(mu)} + * @param cmu {@code cos(mu)} + * @return the geographic latitude, radians + */ + public double invRectifyingLat(double mu, double smu, double cmu) { + return muToPhi.convert(mu, smu, cmu); + } + + /** + * The {@code phi -> mu} evaluator, for callers that need the sine/cosine-preserving + * form. + * + * @return the forward Clenshaw evaluator + */ + public Clenshaw6 forwardSeries() { + return phiToMu; + } + + /** + * The {@code mu -> phi} evaluator, for callers that need the sine/cosine-preserving + * form. + * + * @return the inverse Clenshaw evaluator + */ + public Clenshaw6 inverseSeries() { + return muToPhi; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/util/PolarCoordinate.java b/core/src/main/java/org/locationtech/proj4j/util/PolarCoordinate.java index cd0e6eb..dfaf6fc 100755 --- a/core/src/main/java/org/locationtech/proj4j/util/PolarCoordinate.java +++ b/core/src/main/java/org/locationtech/proj4j/util/PolarCoordinate.java @@ -16,9 +16,12 @@ package org.locationtech.proj4j.util; import java.io.Serializable; +import java.util.Locale; public final class PolarCoordinate implements Serializable { + private static final long serialVersionUID = 3961886979169912470L; + public double lam, phi; public PolarCoordinate(PolarCoordinate that) { @@ -32,12 +35,39 @@ public PolarCoordinate(double lam, double phi) { @Override public String toString() { - return String.format("<λ%f, φ%f>", lam, phi); + // Locale.ROOT: %f is locale-sensitive. Without it this toString reads "<λ0,500000>" under + // de_DE/tr_TR and renders in Arabic-Indic digits under ar_EG, so a diagnostic that is + // supposed to be comparable across runs would depend on the ambient environment. + return String.format(Locale.ROOT, "<λ%f, φ%f>", lam, phi); } + /** + * {@inheritDoc} + * + *

Three things changed here, all of them defects rather than style. + * + *

The combiner was {@code |}. Bitwise OR is monotone in every bit — no later term + * can clear a bit an earlier one set — so it drives a combination of two 32-bit values towards + * {@code 0xFFFFFFFF} and throws away most of what each carried. A {@code 31}-chain, as in + * {@code Projection.hashCode}, does not. + * + *

It allocated. {@code new Double(lam).hashCode()} boxes purely to reach a static + * method. This type is the node type of {@code Grid.ConversionTable}, so the boxes were minted + * two per node — about 2.1 million for one hash of the shipped {@code ntv1_can.dat}. + * + *

It disagreed with {@link #equals}. {@code equals} compares with {@code ==}, under + * which {@code -0.0} and {@code 0.0} are equal, while {@code Double.hashCode} gives them + * different values — so two equal coordinates could hash differently, which is a broken + * contract and not merely a bad distribution. Negative zero is normalised first, exactly as + * {@code Projection.hash(double)} does. {@code NaN} is left alone: {@code NaN != NaN} makes + * two NaN coordinates unequal, and unequal objects are permitted to share a hash. + */ @Override public int hashCode() { - return new Double(lam).hashCode() | (17 * new Double(phi).hashCode()); + int h = 17; + h = 31 * h + Double.hashCode(lam == 0.0 ? 0.0 : lam); + h = 31 * h + Double.hashCode(phi == 0.0 ? 0.0 : phi); + return h; } @Override diff --git a/core/src/main/java/org/locationtech/proj4j/util/ProjectionMath.java b/core/src/main/java/org/locationtech/proj4j/util/ProjectionMath.java index 9f662a4..9082f52 100755 --- a/core/src/main/java/org/locationtech/proj4j/util/ProjectionMath.java +++ b/core/src/main/java/org/locationtech/proj4j/util/ProjectionMath.java @@ -17,7 +17,9 @@ package org.locationtech.proj4j.util; import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ErrorCause; import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjectionException; public class ProjectionMath { @@ -38,6 +40,112 @@ public class ProjectionMath { public final static double EPS10 = 1.0e-10; + /** + * Degrees to radians, {@code deg * DEG_TO_RAD} — PROJ's dominant idiom + * ({@code 9.8.1:src/proj_internal.h:1034}, used at 147 sites in 24 files). + * + *

Use this, never {@link Math#toRadians}, on any path whose value reaches a coordinate, + * a grid index, a comparison or a stored parameter. {@link Math#toRadians} is not + * bit-stable across Java versions: Java 8 evaluates {@code angdeg / 180.0 * PI}, Java 9 + * and later multiply by a precomputed constant. Measured over the 721 whole degrees in + * {@code [-360, 360]}, with the input set pinned by digest so a moved argument could not be + * mistaken for a moved function: + * + * + * + * + * + * + *
1-ULP disagreement out of 721 whole degrees
pairTemurin 8u502 x6411.0.32 aarch64 / x64, 21.0.11 aarch64
{@code Math.toRadians(d)} vs {@code d * DTR}182 (25.24%)0
{@code Math.toRadians(d)} vs {@code d * PI / 180.0}196186
+ * + *

A library whose output depends on which JVM it happens to run under cannot be + * reproducible, and this one promises bit-for-bit determinism across executors. 1 ULP of a + * radian is about 1.4e-9 m on the ellipsoid, which is exactly the bar of the 16 + * {@code nm}-tolerance rows in the gie corpus, so this is a conformance question and not only + * a tidiness one. + * + *

Why {@code DTR} and not the {@code PJ_TORAD} macro

+ * + *

PROJ has two degree/radian idioms and the macro is the minority one: + * + *

    + *
  • {@code DEG_TO_RAD} / {@code RAD_TO_DEG}, decimal literals at + * {@code proj_internal.h:1033-1034} — 147 and 33 occurrences. Both literals are + * bit-identical to Java's {@code Math.PI / 180.0} and {@code 180.0 / Math.PI}, + * verified by hex comparison, so {@link #DTR} is {@code DEG_TO_RAD}.
  • + *
  • {@code PJ_TORAD(deg) = (deg) * M_PI / 180.0} and {@code PJ_TODEG} at + * {@code proj_internal.h:92-95} — only 7 and 11 occurrences.
  • + *
+ * + *

These are different expressions: {@code deg * DTR} multiplies by a once-rounded + * {@code PI/180}, whereas {@code PJ_TORAD} rounds {@code deg * PI} and then divides. They + * disagree on 186 of 721 whole degrees on every JVM measured. Adopting the macro form + * here was tried and measurably reduced agreement with PROJ, because the projections + * that actually convert at this boundary use {@code DEG_TO_RAD}: against {@code proj 9.8.1} + * over 1,187 in-domain points, {@code +proj=gnom} went from 204 to 148 bit-exact matches and + * its mean deviation rose from 1.50e-9 m to 1.82e-9 m. With {@code DTR} it improves instead, + * to 214 bit-exact and 1.43e-9 m. See {@code gnom.cpp:124-131} and + * {@code aeqd.cpp:110-116}, which write {@code lp.phi / DEG_TO_RAD} and {@code azi1 *= + * DEG_TO_RAD} — not the macros. + * + *

{@code core}'s use of this is enforced by + * {@code org.locationtech.proj4j.determinism.NoJdkAngleConversionTest}. + * + * @param deg an angle in degrees + * @return the angle in radians, bit-identical to PROJ's {@code deg * DEG_TO_RAD} + * @see #toDeg(double) + * @since 1.5.0 + */ + public static double toRad(double deg) { + return deg * DTR; + } + + /** + * Radians to degrees, {@code rad / DEG_TO_RAD} — the form PROJ uses at this boundary + * ({@code gnom.cpp:124}, {@code aeqd.cpp:110-113,217-219}, and 22 other files). + * + *

A division, deliberately, and not {@code rad * RTD}. {@code x * (1/s)} is not + * {@code x / s}; the two disagree on 46 of the 721 sample values on every JVM + * measured. PROJ writes the divide in the projection files that convert at the GeographicLib + * boundary, so the divide is what fidelity requires here. It is also the better-conditioned + * choice for round-tripping a stored parameter: over 735 degree values typical of CRS + * definitions, {@code (deg * DTR) / DTR} fails to recover {@code deg} exactly 51 times, + * against 79 for {@code (deg * DTR) * RTD} and 158 for the {@code PJ_TODEG} macro form. + * + *

{@code toDegrees} needed the same treatment as {@code toRadians} — but not for the + * reason the reference material gave

+ * + *

The received note was that {@code PJ_TODEG} is bit-identical to + * {@link Math#toDegrees} while {@code PJ_TORAD} is not, and therefore that only the radian + * direction needed fixing. That is a Java-8-era fact which stopped being true at Java 9. + * Java 8's body is literally {@code angrad * 180.0 / PI}, the same association as the macro; + * Java 9 replaced it with a constant multiply. Measured over the radian images of the same + * 721 whole degrees: + * + * + * + * + * + * + * + *
1-ULP disagreement out of 721
pairTemurin 8u502 x6411.0.32 / 21.0.11
{@code Math.toDegrees(r)} vs {@code r / DTR}17846
{@code Math.toDegrees(r)} vs {@code r * RTD}1800
{@code r * RTD} vs {@code r / DTR}4646
+ * + *

So {@link Math#toDegrees} is version-unstable in exactly the way {@link Math#toRadians} + * is, and both directions did need replacing. The asymmetry that survives is a different one: + * for the radian direction {@code DTR} multiplication happens to coincide with Java 9+'s + * behaviour, so that half of the change is a no-op on a modern JVM and purely repairs Java 8; + * the degree direction moves bits on every JVM, by 46 of 721, because PROJ divides + * where Java multiplies. + * + * @param rad an angle in radians + * @return the angle in degrees, bit-identical to PROJ's {@code rad / DEG_TO_RAD} + * @see #toRad(double) + * @since 1.5.0 + */ + public static double toDeg(double rad) { + return rad / DTR; + } + /** * Degree versions of trigonometric functions */ @@ -69,22 +177,158 @@ public static double atan2d(double y, double x) { return Math.atan2(y, x) * RTD; } + /** + * PROJ's {@code ONE_TOL} ({@code 9.8.1:src/aasincos.cpp:8}): how far past 1 the argument of an + * inverse trigonometric function may be before it stops being rounding noise. + * + * @since 1.5.0 + */ + public static final double ONE_TOL = 1.00000000000001; + + /** + * Arc sine, clamping silently and passing {@code NaN} through. + * + * @param v the sine + * @return the angle, radians + * @deprecated superseded by {@link #asinChecked(double)}. Two defects, both silent: + * {@code NaN} is not clamped at all, because {@code Math.abs(NaN) > 1.} + * is {@code false}, so a {@code NaN} argument passes straight through and + * becomes a {@code NaN} coordinate; and there is no tolerance band, so + * {@code asin(1e9)} is {@code pi/2} where PROJ raises past + * {@link #ONE_TOL}. Retained only because it is public API. + */ + @Deprecated public static double asin(double v) { if (Math.abs(v) > 1.) return v < 0.0 ? -Math.PI / 2 : Math.PI / 2; return Math.asin(v); } + /** + * Arc cosine, clamping silently and passing {@code NaN} through. + * + * @param v the cosine + * @return the angle, radians + * @deprecated superseded by {@link #acosChecked(double)}, for the same two reasons as + * {@link #asin(double)}. Retained only because it is public API. + */ + @Deprecated public static double acos(double v) { if (Math.abs(v) > 1.) return v < 0.0 ? Math.PI : 0.0; return Math.acos(v); } + /** + * Square root, returning 0 for a negative argument. + * + * @param v the radicand + * @return the root, or 0 + * @deprecated superseded by {@link #sqrtChecked(double)}. Upstream's {@code asqrt} + * ({@code 9.8.1:src/aasincos.cpp:33}) does the same thing, which is why the + * replacement is a new method rather than a change to this one — but 0 is a + * plausible coordinate, and a negative radicand of magnitude 1e-3 is not + * rounding noise. Retained because it is public API and because + * {@code asqrt}-equivalence is sometimes what a verbatim port needs. + */ + @Deprecated public static double sqrt(double v) { return v < 0.0 ? 0.0 : Math.sqrt(v); } + /** + * PROJ's {@code aasin} ({@code 9.8.1:src/aasincos.cpp:11-21}) with its errno raised as an + * exception: clamp to ±π/2 within {@link #ONE_TOL}, raise beyond it. + *

+ * The tolerance band is the point. {@code |v| >= 1} is reached constantly by rounding in a + * projection kernel and clamping is correct there; {@code |v| > 1.00000000000001} is not + * rounding, and PROJ sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} for it. {@link #asin(double)} has + * no band at all, so it answers {@code asin(1e9)} with {@code pi/2}. + *

+ * One deliberate divergence from upstream: {@code NaN} raises here. In C, + * {@code fabs(NaN) >= 1.} is false, so {@code aasin} returns {@code asin(NaN) = NaN} and the + * failure travels as data. That is the shape this whole class of fix exists to remove. + * + * @param v the sine + * @return the angle, radians, in {@code [-pi/2, pi/2]} + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} if + * {@code |v| > ONE_TOL}, {@link ErrorCause#NUMERICAL_FAILURE} if {@code v} is + * {@code NaN} + * @since 1.5.0 + */ + public static double asinChecked(double v) { + double av = Math.abs(v); + if (Double.isNaN(v)) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, + "asin(NaN): a NaN reached an inverse trigonometric function, which means an " + + "earlier step produced one silently"); + } + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, + "asin(" + v + "): |v| exceeds ONE_TOL = " + ONE_TOL + + ", which is past rounding noise"); + } + return v < 0.0 ? -HALFPI : HALFPI; + } + return Math.asin(v); + } + + /** + * PROJ's {@code aacos} ({@code 9.8.1:src/aasincos.cpp:23-32}) with its errno raised as an + * exception: clamp to 0 or π within {@link #ONE_TOL}, raise beyond it. See + * {@link #asinChecked(double)} for why the band and the {@code NaN} rejection are there. + * + * @param v the cosine + * @return the angle, radians, in {@code [0, pi]} + * @throws ProjectionException {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN} if + * {@code |v| > ONE_TOL}, {@link ErrorCause#NUMERICAL_FAILURE} if {@code v} is + * {@code NaN} + * @since 1.5.0 + */ + public static double acosChecked(double v) { + double av = Math.abs(v); + if (Double.isNaN(v)) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, + "acos(NaN): a NaN reached an inverse trigonometric function, which means an " + + "earlier step produced one silently"); + } + if (av >= 1.0) { + if (av > ONE_TOL) { + throw new ProjectionException(ErrorCause.COORDINATE_OUT_OF_DOMAIN, + "acos(" + v + "): |v| exceeds ONE_TOL = " + ONE_TOL + + ", which is past rounding noise"); + } + return v < 0.0 ? Math.PI : 0.0; + } + return Math.acos(v); + } + + /** + * Square root that raises on a negative radicand instead of answering 0. + *

+ * Upstream's {@code asqrt} has no tolerance band and neither does this: there is no + * defensible width for one, because the scale of a "negligible" negative radicand depends + * entirely on the quantity being rooted. A caller whose expression genuinely produces + * {@code -1e-18} from cancellation should write {@code Math.sqrt(Math.max(0.0, v))} and say + * so at the call site, rather than have every call site silently share one guess. + * + * @param v the radicand + * @return the root + * @throws ProjectionException {@link ErrorCause#NUMERICAL_FAILURE} if {@code v} is negative + * or {@code NaN} + * @since 1.5.0 + */ + public static double sqrtChecked(double v) { + if (Double.isNaN(v) || v < 0.0) { + throw new ProjectionException(ErrorCause.NUMERICAL_FAILURE, + "sqrt(" + v + "): negative or NaN radicand; returning 0 here would be a " + + "plausible coordinate rather than an error"); + } + return Math.sqrt(v); + } + public static double distance(double dx, double dy) { return Math.sqrt(dx * dx + dy * dy); } @@ -141,9 +385,37 @@ public static double dmsToDeg(double d, double m, double s) { return (d - m / 60 - s / 3600); } + /** + * How far out of range an angle may be before the {@code while} loops below are replaced by + * one {@code floor}. Any positive value fixes the liveness bug; a large-ish one is chosen so + * that ordinary inputs keep taking the exact same arithmetic path they always did, and only + * genuinely wild ones change. + *

+ * Worst case after the switch-over the loop still runs, but at most a bounded number of + * times: {@code 100} for {@link #normalizeLatitude}, {@code 50} for {@link #normalizeAngle}. + */ + private static final double LOOP_LIMIT = 100.0 * Math.PI; + + /** + * Reduces a latitude into {@code [-pi/2, pi/2]}. + *

+ * Bounded. This was two unbounded {@code while} loops stepping by π, so + * {@code 1e18} radians took about {@code 3.2e17} iterations — a hung thread, not an + * exception, reachable from an untrusted coordinate. Anything past {@link #LOOP_LIMIT} is now + * brought into range with one {@code floor} first; in-range and mildly out-of-range inputs + * take the original path and produce bit-identical results, including at the exact multiples + * of π where the loop form and the {@code floor} form disagree on which end of the + * interval to land. + * + * @param angle the latitude, radians + * @return the latitude reduced into {@code [-pi/2, pi/2]} + * @throws InvalidValueException if {@code angle} is infinite or {@code NaN} + */ public static double normalizeLatitude(double angle) { if (Double.isInfinite(angle) || Double.isNaN(angle)) throw new InvalidValueException("Infinite latitude"); + if (angle > LOOP_LIMIT || angle < -LOOP_LIMIT) + angle -= Math.PI * Math.floor((angle + HALFPI) / Math.PI); while (angle > ProjectionMath.HALFPI) angle -= Math.PI; while (angle < -ProjectionMath.HALFPI) @@ -152,20 +424,86 @@ public static double normalizeLatitude(double angle) { // return Math.IEEEremainder(angle, Math.PI); } + /** + * Reduces a longitude into {@code (-pi, pi]}. Now exactly {@link #adjlon(double)}. + *

+ * Two behaviour changes, both deliberate and both towards PROJ. + *

    + *
  1. It no longer throws on a non-finite argument. It used to raise + * {@code InvalidValueException("Infinite longitude")} for {@code NaN}, which is + * stricter than PROJ: {@code fwd_prepare} tests {@code HUGE_VAL} and its range + * comparisons are all false for {@code NaN}, so upstream lets {@code NaN} through. The + * rejection also only ever fired when {@code lon_0 != 0}, which is why the same defect + * used to throw for {@code +lon_0=15} and return garbage for {@code +lon_0=0}. Non-finite + * input is now rejected once, at the entry to the projection, by + * {@code Projection.checkForwardDomain}, where it can be attributed to + * {@link ErrorCause#INVALID_COORDINATE} instead of masquerading as a bad + * parameter.
  2. + *
  3. It is bounded, and it has PROJ's overshoot window. See + * {@link #adjlon(double)}.
  4. + *
+ * + * @param angle the longitude, radians + * @return the longitude reduced into {@code (-pi, pi]}, or {@code NaN} if {@code angle} was + * not finite + */ public static double normalizeLongitude(double angle) { - if (Double.isInfinite(angle) || Double.isNaN(angle)) - throw new InvalidValueException("Infinite longitude"); - while (angle > Math.PI) - angle -= TWOPI; - while (angle < -Math.PI) - angle += TWOPI; - return angle; -// return Math.IEEEremainder(angle, Math.PI); + return adjlon(angle); + } + + /** + * PROJ's {@code adjlon} ({@code 9.8.1:src/adjlon.cpp:6-20}), ported verbatim: reduce a + * longitude to ±π with one {@code floor}. + *

+ * Two properties are load bearing and neither is obvious: + *

    + *
  • The {@code 1e-12} overshoot window. Upstream returns the argument untouched + * while {@code |lon| < pi + 1e-12}, with the comment "let longitude slightly overshoot, + * to avoid spurious sign switching at the date line". The old loop wrapped as soon as + * {@code lon > pi}, so a longitude a picoradian past the antimeridian flipped to the + * other side of the world. Real corpus points sit inside that band.
  • + *
  • It is {@code NaN}-transparent. {@code Math.abs(NaN) < pi + 1e-12} is + * {@code false}, so {@code NaN} falls through the arithmetic and comes out {@code NaN}, + * exactly as the C does. An infinite argument comes out {@code NaN}, also exactly as the + * C does ({@code inf - inf}).
  • + *
+ * + * @param longitude the longitude, radians + * @return the longitude reduced to ±π + * @since 1.5.0 + */ + public static double adjlon(double longitude) { + /* Let longitude slightly overshoot, to avoid spurious sign switching at the date line */ + if (Math.abs(longitude) < Math.PI + 1e-12) + return longitude; + + /* adjust to 0..2pi range */ + longitude += Math.PI; + + /* remove integral # of 'revolutions' */ + longitude -= TWOPI * Math.floor(longitude / TWOPI); + + /* adjust back to -pi..pi range */ + longitude -= Math.PI; + + return longitude; } + /** + * Reduces an angle into {@code [0, 2*pi]}. + *

+ * Bounded, for the same reason as {@link #normalizeLatitude(double)}: this was an + * unbounded {@code while} stepping by 2π. + * + * @param angle the angle, radians + * @return the angle reduced into {@code [0, 2*pi]} + * @throws InvalidValueException if {@code angle} is infinite or {@code NaN} + */ public static double normalizeAngle(double angle) { if (Double.isInfinite(angle) || Double.isNaN(angle)) throw new InvalidValueException("Infinite angle"); + if (angle > LOOP_LIMIT || angle < -LOOP_LIMIT) + angle -= TWOPI * Math.floor(angle / TWOPI); while (angle > TWOPI) angle -= TWOPI; while (angle < 0) @@ -333,6 +671,20 @@ public static double geographicLatitude(double lat, double flatness) { return Math.atan(Math.tan(lat) / (f * f)); } + /** + * PROJ 4's {@code pj_tsfn}: {@code ts = exp(-psi)} via {@code tan} and {@code pow}. + * + * @param phi the geographic latitude, radians + * @param sinphi {@code sin(phi)} + * @param e the first eccentricity + * @return {@code exp(-psi)} + * @deprecated superseded by {@link ConformalLat#tsfn(double, double, double)}, a port + * of PROJ 9.8.1's {@code src/tsfn.cpp}. This version returns + * {@code 0.9999999999999999} at {@code phi = 0} where the correct answer + * is exactly {@code 1.0}, and loses relative accuracy near the poles. + * Retained only because it is public API. + */ + @Deprecated public static double tsfn(double phi, double sinphi, double e) { sinphi *= e; return (Math.tan(.5 * (ProjectionMath.HALFPI - phi)) / @@ -345,6 +697,20 @@ public static double msfn(double sinphi, double cosphi, double es) { private final static int N_ITER = 15; + /** + * PROJ 4's {@code pj_phi2}: a 15-step Newton iteration with a {@code pow} call on + * every trip. + * + * @param ts {@code exp(-psi)} + * @param e the first eccentricity + * @return the geographic latitude, radians + * @deprecated superseded by {@link ConformalLat#phi2(double, double)}, a port of PROJ + * 9.8.1's {@code src/phi2.cpp}. Measured on GRS80 this version is up to + * 4,145 nm from the truth against a 50 nm conformance bar, and its + * data-dependent trip count makes the answer platform-dependent. + * Retained only because it is public API. + */ + @Deprecated public static double phi2(double ts, double e) { double eccnth, phi, con, dphi; int i; @@ -376,6 +742,19 @@ public static double phi2(double ts, double e) { private final static double C88 = .3076171875; private final static int MAX_ITER = 10; + /** + * PROJ 4's {@code pj_enfn}: the five meridional-distance coefficients as a series in + * {@code es}. + * + * @param es the squared first eccentricity + * @return the coefficient array consumed by {@link #mlfn} and {@link #inv_mlfn} + * @deprecated superseded by {@link MeridianArc}, a port of PROJ 9.8.1's + * {@code src/mlfn.cpp}, whose series is 6th order in the third + * flattening rather than in {@code es}. The three functions + * {@code enfn}/{@code mlfn}/{@code inv_mlfn} form one series family and + * must be replaced as a set. Retained only because it is public API. + */ + @Deprecated public static double[] enfn(double es) { double t; double[] en = new double[5]; @@ -387,12 +766,43 @@ public static double[] enfn(double es) { return en; } + /** + * PROJ 4's {@code pj_mlfn}: meridional distance from the equator, in units of the + * semi-major axis. + * + * @param phi the geographic latitude, radians + * @param sphi {@code sin(phi)} + * @param cphi {@code cos(phi)} + * @param en coefficients from {@link #enfn} + * @return the meridional arc length, divided by the semi-major axis + * @deprecated superseded by {@link MeridianArc#mlfn(double, double, double)}. Measured + * on GRS80 this version is up to 4,920 nm from the truth against a 50 nm + * conformance bar. Retained only because it is public API. + */ + @Deprecated public static double mlfn(double phi, double sphi, double cphi, double[] en) { cphi *= sphi; sphi *= sphi; return en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4]))); } + /** + * PROJ 4's {@code pj_inv_mlfn}: geographic latitude from meridional distance, by up to + * ten Newton steps against {@link #mlfn} itself. + * + * @param arg the meridional arc length, divided by the semi-major axis + * @param es the squared first eccentricity + * @param en coefficients from {@link #enfn} + * @return the geographic latitude, radians + * @throws ConvergenceFailureException if the Newton iteration has not reached + * {@code 1e-11} after {@code MAX_ITER = 10} steps + * @deprecated superseded by {@link MeridianArc#invMlfn(double)}, which is + * closed form — no iteration at all. Because + * it is Newton's method run against {@link #mlfn} it is self-consistent by + * construction: its round trip closes to 0.7 nm while both halves sit + * 4,920 nm from the truth. Retained only because it is public API. + */ + @Deprecated public static double inv_mlfn(double arg, double es, double[] en) { double s, t, phi, k = 1. / (1. - es); @@ -401,10 +811,22 @@ public static double inv_mlfn(double arg, double es, double[] en) { s = Math.sin(phi); t = 1. - es * s * s; phi -= t = (mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; - if (Math.abs(t) < 1e-11) + // Written inverted -- !(|t| >= tol) rather than |t| < tol -- so that a NaN takes the + // *return* branch rather than the throw below. That is upstream's own idiom + // (`!(fabs(dtau) >= stol)` in tmerc.cpp, `!(fabs(tau) < TMAX)` in others) and it is + // load bearing here: NaN in must be NaN out, as a result. A NaN correction means the + // caller supplied a NaN, not that the iteration failed on real input. + if (!(Math.abs(t) >= 1e-11)) return phi; } - return phi; + // 1.4.3 fell out of the loop with a bare `return phi;` and no convergence test of any + // kind -- the single most widely shared instance of the defect, because tmerc, Bonne, + // EquidistantAzimuthal and Cassini all inverse-project through here. The unconverged + // iterate is a finite, in-range latitude that is wrong by an unbounded amount. + // ProjectionException.ERR_17 is PROJ 4's own text for this condition. + throw new ConvergenceFailureException(ProjectionException.ERR_17 + + ": inv_mlfn(" + arg + ", es=" + es + ") did not reach 1e-11 in " + + MAX_ITER + " Newton steps (last iterate " + phi + ")"); } private final static double P00 = .33333333333333333333; @@ -414,6 +836,17 @@ public static double inv_mlfn(double arg, double es, double[] en) { private final static double P11 = .06640211640211640211; private final static double P20 = .01641501294219154443; + /** + * PROJ 4's {@code pj_authset}: the three coefficients of the third-order authalic + * latitude series. + * + * @param es the squared first eccentricity + * @return the coefficient array consumed by {@link #authlat} + * @deprecated superseded by {@link AuthalicLat}, a port of PROJ 9.8.1's + * {@code src/latitudes.cpp}, whose series is 6th order. Retained only + * because it is public API. + */ + @Deprecated public static double[] authset(double es) { double t; double[] APA = new double[3]; @@ -428,11 +861,37 @@ public static double[] authset(double es) { return APA; } + /** + * PROJ 4's {@code pj_authlat}: geographic latitude from authalic latitude, by a + * third-order Fourier series. + * + * @param beta the authalic latitude, radians + * @param APA coefficients from {@link #authset} + * @return the geographic latitude, radians + * @deprecated superseded by {@link AuthalicLat#inverse(double)}. Measured on GRS80 this + * version is 2.21 mm off at latitude 18.01 degrees against the + * 0.1 mm bar that {@code aea}'s inverse conformance assertions set — 22 + * times the bar. Retained only because it is public API. + */ + @Deprecated public static double authlat(double beta, double[] APA) { double t = beta + beta; return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t)); } + /** + * PROJ 4's {@code pj_qsfn}: the authalic quantity {@code q}, Snyder (3-12). + * + * @param sinphi {@code sin(phi)} + * @param e the first eccentricity + * @param one_es {@code 1 - es} + * @return {@code q} + * @deprecated superseded by {@link AuthalicLat#q(double)}. This version writes Snyder's + * second term as {@code 0.5 log((1-x)/(1+x))/e}, which cancels near + * {@code phi = 0}; the replacement uses {@code -atanh(x)/e}, which does + * not. Retained only because it is public API. + */ + @Deprecated public static double qsfn(double sinphi, double e, double one_es) { double con; diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/CompoundCrs.java b/core/src/main/java/org/locationtech/proj4j/vertical/CompoundCrs.java new file mode 100644 index 0000000..4b3f9f0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/CompoundCrs.java @@ -0,0 +1,189 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import java.io.Serializable; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; + +/** + * A compound CRS: a horizontal {@link CoordinateReferenceSystem} plus a {@link VerticalCrs}, + * as written {@code EPSG:4326+5773}. + * + *

The composition is a proj-string, and that is not a shortcut

+ * + *

PROJ 9.8.1 represents a compound CRS in PROJ.4 form as exactly the horizontal CRS's + * string with the vertical CRS's tokens appended. {@code projinfo EPSG:4326+5773 -o PROJ}: + * + *

+ * +proj=longlat +datum=WGS84 +geoidgrids=us_nga_egm96_15.tif +geoid_crs=WGS84 +vunits=m
+ *   +no_defs +type=crs
+ * + *

and {@code +proj=longlat +datum=WGS84 +no_defs} is verbatim what + * {@code proj4/nad/epsg}'s {@code <4326>} entry says. So composing the two halves is + * string concatenation in the correct order, and the arithmetic that makes it mean something + * is the {@code +geoidgrids} auto-step — {@link VGridShiftOperator} — plus the + * {@code +vunits} scaling, both of which live in the pipeline layer already. + * + *

{@link #pipelineDefinition()} is therefore the useful output: hand it to + * {@code PipelineFactory.create} and the compound CRS becomes executable, with the vertical + * shift applied where PROJ applies it. + * + *

Axis order is the horizontal CRS's, unchanged

+ * + *

This class adds a third ordinate and changes nothing about the first two. proj4j is + * longitude-first, so {@code EPSG:4326+5773} consumes {@code (lon, lat, h)} — not + * {@code (lat, lon, h)}, which is what {@code cs2cs} would consume for the same name. That + * is the standing {@code AxisOrderPolicy.LEGACY} promise and this type does not get to break + * it. + * + *

Immutable, and thread-safe to the same degree the wrapped + * {@link CoordinateReferenceSystem} is. + * + * @since 1.5 + */ +public final class CompoundCrs implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String name; + private final CoordinateReferenceSystem horizontal; + private final VerticalCrs vertical; + + /** + * @param name a name for the compound, e.g. {@code "EPSG:4326+5773"}; may be + * {@code null} + * @param horizontal the horizontal half; must not be {@code null} + * @param vertical the vertical half; must not be {@code null} + */ + public CompoundCrs(final String name, final CoordinateReferenceSystem horizontal, + final VerticalCrs vertical) { + if (horizontal == null) { + throw new InvalidValueException("a compound CRS needs a horizontal CRS"); + } + if (vertical == null) { + throw new InvalidValueException("a compound CRS needs a vertical CRS"); + } + this.name = name; + this.horizontal = horizontal; + this.vertical = vertical; + } + + /** @return the name as supplied, possibly {@code null}. */ + public String getName() { + return name; + } + + /** @return the horizontal half; never {@code null}. */ + public CoordinateReferenceSystem getHorizontal() { + return horizontal; + } + + /** @return the vertical half; never {@code null}. */ + public VerticalCrs getVertical() { + return vertical; + } + + /** + * The proj-string PROJ 9.8.1 exports for this compound CRS, GeoTIFF grid names and all. + * + *

Comparable token-for-token against {@code projinfo -o PROJ}, minus its + * trailing {@code +type=crs}, which is a CRS-parser marker rather than an operation + * parameter. + * + * @return the proj-string + */ + public String toProjString() { + return compose(false); + } + + /** + * The proj-string to execute, naming the grid file this library can actually open. + * + *

Differs from {@link #toProjString()} in one token: {@code +geoidgrids} carries the + * GTX name from {@code proj.db}'s {@code grid_alternatives} rather than the GeoTIFF one, + * because {@link org.locationtech.proj4j.datum.VerticalGrid} reads GTX only. When the + * GeoTIFF reader lands the two collapse into one. + * + * @return a proj-string suitable for {@code PipelineFactory.create} + */ + public String pipelineDefinition() { + return compose(true); + } + + private String compose(final boolean readable) { + final StringBuilder sb = new StringBuilder(horizontalProjString()); + final String tokens = vertical.projTokens(readable); + if (tokens.length() > 0) { + // Appended, so a token the horizontal string already carries shadows it under + // pj_param's first-match-wins. A horizontal CRS that already said +vunits keeps + // its own value, which is what PROJ does for the same input. + if (sb.length() > 0) { + sb.append(' '); + } + sb.append(tokens); + } + return sb.toString(); + } + + /** + * The horizontal CRS's parameters as one string. + * + * @return the {@code +key=value} tokens, space separated + */ + public String horizontalProjString() { + final String[] params = horizontal.getParameters(); + if (params == null) { + throw new InvalidValueException(ErrorCause.MISSING_PARAM, + "horizontal CRS " + horizontal.getName() + + " carries no parameter list, so no compound proj-string can be built"); + } + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < params.length; i++) { + final String token = params[i]; + if (token == null || token.isEmpty()) { + continue; + } + if (sb.length() > 0) { + sb.append(' '); + } + sb.append(token.startsWith("+") ? token : "+" + token); + } + return sb.toString(); + } + + /** + * Whether the vertical half actually shifts a height. + * + *

{@code false} means the third ordinate passes through untouched, which is PROJ's + * "ballpark vertical transformation" — reported rather than hidden, because a caller who + * asked for {@code EPSG:4326+5714} and got their input height back needs to know the + * difference between "no correction was needed" and "no correction was available". + * + * @return whether a geoid model participates + */ + public boolean appliesVerticalShift() { + return vertical.hasGeoidModel(); + } + + @Override + public String toString() { + return "CompoundCrs[" + (name == null ? "anonymous" : name) + ": " + + horizontal.getName() + " + " + vertical.getIdentifier() + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/CompoundCrsName.java b/core/src/main/java/org/locationtech/proj4j/vertical/CompoundCrsName.java new file mode 100644 index 0000000..fc9f620 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/CompoundCrsName.java @@ -0,0 +1,150 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; + +/** + * The {@code AUTHORITY:horizontal+vertical} syntax, split into its three parts. + * + *

The forms PROJ accepts, and the one thing that makes this non-trivial

+ * + *

PROJ's {@code createFromUserInput} reads a compound CRS name as two CRS references + * joined by {@code '+'}. Both of these name the same object: + * + *

+ * EPSG:4326+5773          the vertical code inherits the horizontal authority
+ * EPSG:4326+EPSG:5773     both halves fully qualified
+ * + *

The trap is that {@code '+'} is also the sigil that starts every proj-string parameter, + * so {@code "+proj=longlat +datum=WGS84"} contains three of them and is emphatically not a + * compound name. {@link #looksLikeCompound(String)} therefore requires the {@code '+'} to sit + * between two non-empty parts neither of which contains whitespace or an {@code '='}, + * and requires the name not to start with {@code '+'} at all. Getting that wrong in the other + * direction would be worse than not supporting compounds: a proj-string would be silently + * truncated at its first parameter. + * + *

Immutable. + * + * @since 1.5 + */ +public final class CompoundCrsName { + + private final String horizontal; + private final String verticalAuthority; + private final String verticalCode; + + private CompoundCrsName(final String horizontal, final String verticalAuthority, + final String verticalCode) { + this.horizontal = horizontal; + this.verticalAuthority = verticalAuthority; + this.verticalCode = verticalCode; + } + + /** + * A cheap, conservative test that a name is a compound CRS reference rather than a + * proj-string or a plain {@code authority:code}. + * + * @param name the candidate; may be {@code null} + * @return whether {@link #parse(String)} will accept it + */ + public static boolean looksLikeCompound(final String name) { + if (name == null) { + return false; + } + final String trimmed = name.trim(); + if (trimmed.isEmpty() || trimmed.charAt(0) == '+') { + return false; + } + final int plus = trimmed.indexOf('+'); + if (plus <= 0 || plus == trimmed.length() - 1) { + return false; + } + // Exactly one '+', and nothing that smells of a parameter list on either side. + if (trimmed.indexOf('+', plus + 1) >= 0) { + return false; + } + return isReference(trimmed.substring(0, plus)) && isReference(trimmed.substring(plus + 1)); + } + + private static boolean isReference(final String part) { + if (part.isEmpty()) { + return false; + } + for (int i = 0; i < part.length(); i++) { + final char c = part.charAt(i); + if (c == '=' || c == ' ' || c == '\t' || c == '\n' || c == '\r') { + return false; + } + } + return true; + } + + /** + * Splits a compound CRS name. + * + * @param name a name of the form {@code EPSG:4326+5773} or {@code EPSG:4326+EPSG:5773} + * @return the parts; never {@code null} + * @throws InvalidValueException if the name is not a compound reference + */ + public static CompoundCrsName parse(final String name) { + if (!looksLikeCompound(name)) { + throw new InvalidValueException(ErrorCause.INVALID_CRS_SYNTAX, + "not a compound CRS name: " + name + ". Expected AUTHORITY:code+code or " + + "AUTHORITY:code+AUTHORITY:code, for example EPSG:4326+5773."); + } + final String trimmed = name.trim(); + final int plus = trimmed.indexOf('+'); + final String left = trimmed.substring(0, plus); + final String right = trimmed.substring(plus + 1); + + final int colon = right.indexOf(':'); + if (colon > 0) { + return new CompoundCrsName(left, right.substring(0, colon), right.substring(colon + 1)); + } + // Bare code: inherit the horizontal half's authority, defaulting to EPSG exactly as + // CRSFactory.createFromName does for an unqualified code. + final int leftColon = left.indexOf(':'); + final String authority = leftColon > 0 ? left.substring(0, leftColon) : "EPSG"; + return new CompoundCrsName(left, authority, right); + } + + /** @return the horizontal half as written, e.g. {@code "EPSG:4326"}. */ + public String horizontal() { + return horizontal; + } + + /** @return the vertical half's authority, never {@code null}. */ + public String verticalAuthority() { + return verticalAuthority; + } + + /** @return the vertical half's code, never {@code null}. */ + public String verticalCode() { + return verticalCode; + } + + /** @return the vertical half as {@code AUTHORITY:code}. */ + public String verticalIdentifier() { + return verticalAuthority + ":" + verticalCode; + } + + @Override + public String toString() { + return horizontal + "+" + verticalIdentifier(); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/UnknownVerticalCrsException.java b/core/src/main/java/org/locationtech/proj4j/vertical/UnknownVerticalCrsException.java new file mode 100644 index 0000000..0f1f89e --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/UnknownVerticalCrsException.java @@ -0,0 +1,52 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.UnknownAuthorityCodeException; + +/** + * A compound CRS named a vertical code this library does not know. + * + *

Deliberately an {@link UnknownAuthorityCodeException}, so that every existing + * {@code catch (UnknownAuthorityCodeException)} and {@code catch (Proj4jException)} around + * {@code CRSFactory.createFromName} keeps firing for a compound name too. The alternative — + * a new top-level exception type — would make {@code EPSG:4326+5773} fail in a way no + * existing caller catches, which is the same class of surprise as returning a fabricated + * height. + * + * @since 1.5 + */ +public class UnknownVerticalCrsException extends UnknownAuthorityCodeException { + + private static final long serialVersionUID = 1L; + + private final String identifier; + + /** + * @param identifier the {@code AUTH:CODE} that could not be resolved + * @param message what is missing and where it would have to come from + */ + public UnknownVerticalCrsException(final String identifier, final String message) { + super(ErrorCause.UNKNOWN_CRS, message); + this.identifier = identifier; + } + + /** @return the {@code AUTH:CODE} that could not be resolved. */ + public String getIdentifier() { + return identifier; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/VGridShiftOperator.java b/core/src/main/java/org/locationtech/proj4j/vertical/VGridShiftOperator.java new file mode 100644 index 0000000..8f1d63d --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/VGridShiftOperator.java @@ -0,0 +1,246 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.datum.VerticalGrid; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.pipeline.PipelineOperator; + +/** + * {@code +proj=vgridshift} — a vertical grid shift, ported from + * {@code 9.8.1:src/transformations/vgridshift.cpp}. + * + *

What this is for

+ * + *

This is the step PROJ hides behind {@code +geoidgrids=}. {@code cs2cs_emulation_setup} + * ({@code 9.8.1:src/create.cpp:88-105}) builds + *

{@code break_cs2cs_recursion proj=vgridshift grids=}
+ * and stores it as {@code P->vgridshift}; {@code fwd_prepare} then invokes it + * forward, right after the datum shift and before the {@code lam0} subtraction + * ({@code fwd.cpp:96-99}, comment "Go orthometric from geometric"), and + * {@code inv_finalize} invokes it inverse, before the datum shift on the way back + * ({@code inv.cpp:117-119}, "Go geometric from orthometric"). + * + *

The sign, which is the one thing easy to get backwards

+ * + *

{@code +multiplier} defaults to {@code -1}, not {@code +1} + * ({@code vgridshift.cpp:206}, whose comment reads "historical: the forward direction + * subtracts the grid offset"). The forward direction is + * {@code z += value(lam, phi) * multiplier}, so with the default it is + * {@code H = h - N}: an ellipsoidal height becomes an orthometric one. The inverse is + * {@code z -= value * multiplier}. Both spellings are preserved verbatim rather than + * folded into one signed add, because the multiplier also participates in the nodata test + * and {@link VerticalGrid#valueAt(double, double, double)} applies it there. + * + *

PROJ's CRS-based path uses {@code +multiplier=1} for the same grid in the opposite + * direction — {@code projinfo -s EPSG:4326+5773 -t EPSG:4979} emits + * {@code +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1} — so the multiplier is + * genuinely part of the operation's identity and is exposed here. + * + *

An empty grid list is not an error

+ * + *

{@code pj_vgridshift_forward_3d} guards with {@code if (!Q->grids.empty())} and + * otherwise "just pass the coordinate through unchanged". That is reachable: a + * {@code +geoidgrids} list all of whose entries carry the {@code @} optional prefix + * resolves to nothing at all, and PROJ builds a working, identity-valued operator from it. + * {@link VerticalGrid#fromGeoidGrids(String)} already implements the same skip. + * + *

Failure is a throw, never a sentinel

+ * + *

PROJ returns {@code HUGE_VAL} and sets {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID} or + * {@code _GRID_AT_NODATA}. {@link VerticalGrid#valueAt} returns {@code NaN} for both, and + * cannot distinguish them — so the two are separated here the way PROJ separates them, by + * asking {@link VerticalGrid#covers(double, double)} first. That is exactly upstream's + * split between {@code VerticalShiftGridSet::gridAt} (the extent test) and + * {@code read_vgrid_value} (the interpolation, which clamps rather than refuses). + * + *

Not thread-safe only in the sense that {@link #forward}/{@link #inverse} mutate the + * array handed to them; the operator itself is immutable and the grids are immutable after + * parsing, so one instance may be shared. + * + * @since 1.5 + */ +public final class VGridShiftOperator implements PipelineOperator { + + /** {@code vgridshift.cpp:206} — {@code Q->forward_multiplier = -1.0}. */ + public static final double DEFAULT_MULTIPLIER = -1.0; + + private final String gridSpec; + private final List grids; + private final double forwardMultiplier; + + private VGridShiftOperator(final String gridSpec, final List grids, + final double forwardMultiplier) { + this.gridSpec = gridSpec; + this.grids = grids; + this.forwardMultiplier = forwardMultiplier; + } + + /** + * Resolve a {@code +grids=} / {@code +geoidgrids=} list through the deterministic + * resolver chain and build the operator. + * + * @param gridSpec a comma-separated grid list, {@code @}-prefixed entries optional + * @param multiplier {@code +multiplier}; pass {@link #DEFAULT_MULTIPLIER} for PROJ's default + * @return the operator; never {@code null} + * @throws CrsTransformException with {@link ErrorCause#MISSING_GRID} if a required grid + * cannot be resolved or parsed + */ + public static VGridShiftOperator fromGrids(final String gridSpec, final double multiplier) { + if (gridSpec == null || gridSpec.isEmpty()) { + throw new CrsTransformException(ErrorCause.MISSING_PARAM, + "+proj=vgridshift needs +grids="); + } + final List resolved; + try { + resolved = VerticalGrid.fromGeoidGrids(gridSpec); + } catch (final IOException e) { + // vgridshift.cpp:228-232: "could not find required grid(s)" is + // PROJ_ERR_INVALID_OP_FILE_NOT_FOUND_OR_INVALID, raised at *construction*, which is + // the whole point - a missing grid must not become a per-row surprise. + throw new CrsTransformException(ErrorCause.MISSING_GRID, + "+grids=" + gridSpec + ": " + e.getMessage(), e); + } + return new VGridShiftOperator(gridSpec, + Collections.unmodifiableList(new ArrayList(resolved)), multiplier); + } + + /** @return the same operator with PROJ's default {@code +multiplier=-1}. + * @param gridSpec a comma-separated grid list */ + public static VGridShiftOperator fromGrids(final String gridSpec) { + return fromGrids(gridSpec, DEFAULT_MULTIPLIER); + } + + /** + * The grids actually resolved, in list order. + * + * @return unmodifiable, possibly empty when every entry was {@code @}-optional and absent + */ + public List grids() { + return grids; + } + + /** @return the {@code +grids=} list as written. */ + public String gridSpec() { + return gridSpec; + } + + /** @return {@code +multiplier}. */ + public double multiplier() { + return forwardMultiplier; + } + + /** + * {@code pj_vgridshift_forward_3d}: {@code z += value * multiplier}. + * + * @param coord {@code {lam, phi, z, t}} in radians and metres, mutated in place + */ + @Override + public void forward(final double[] coord) { + if (grids.isEmpty()) { + return; + } + coord[2] += valueAt(coord[0], coord[1]); + } + + /** + * {@code pj_vgridshift_reverse_3d}: {@code z -= value * multiplier}. + * + * @param coord {@code {lam, phi, z, t}} in radians and metres, mutated in place + */ + @Override + public void inverse(final double[] coord) { + if (grids.isEmpty()) { + return; + } + coord[2] -= valueAt(coord[0], coord[1]); + } + + /** + * {@code pj_vgrid_value}: the first grid whose extent contains the point wins, and a + * point no grid contains is an error rather than a zero shift. + * + * @param lam longitude, radians + * @param phi latitude, radians + * @return the interpolated value, already multiplied by {@code +multiplier} + */ + private double valueAt(final double lam, final double phi) { + if (Double.isNaN(lam) || Double.isNaN(phi)) { + // read_vgrid_value's first act: "do not deal with NaN coordinates". PROJ returns + // HUGE_VAL, which fwd_prepare then propagates; a NaN horizontal position simply has + // no height, so the NaN travels rather than becoming an exception. + return Double.NaN; + } + for (int i = 0; i < grids.size(); i++) { + final VerticalGrid grid = grids.get(i); + if (!grid.covers(lam, phi)) { + continue; + } + final double value = grid.valueAt(lam, phi, forwardMultiplier); + if (Double.isNaN(value)) { + throw new CrsTransformException(ErrorCause.GRID_NODATA, + "every node surrounding (" + Math.toDegrees(lam) + ", " + + Math.toDegrees(phi) + ") in vertical grid " + + grid.getGridName() + " is nodata"); + } + return value; + } + throw new CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID, + "(" + Math.toDegrees(lam) + ", " + Math.toDegrees(phi) + + ") is outside every grid of +grids=" + gridSpec); + } + + /** {@code P->left = PJ_IO_UNITS_RADIANS} ({@code vgridshift.cpp:250}). */ + @Override + public GieIoUnits declaredLeft() { + return GieIoUnits.RADIANS; + } + + /** {@code P->right = PJ_IO_UNITS_RADIANS} ({@code vgridshift.cpp:251}). */ + @Override + public GieIoUnits declaredRight() { + return GieIoUnits.RADIANS; + } + + /** Never called: this operator declares {@code RADIANS} on both sides, not {@code WHATEVER}. */ + @Override + public void overrideUnits(final GieIoUnits left, final GieIoUnits right) { + // no-op, deliberately + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return "vgridshift grids=" + gridSpec + + (forwardMultiplier == DEFAULT_MULTIPLIER ? "" : " multiplier=" + forwardMultiplier); + } + + @Override + public String toString() { + return "VGridShiftOperator[" + description() + ", " + grids.size() + " grid(s) resolved]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/VerticalCrs.java b/core/src/main/java/org/locationtech/proj4j/vertical/VerticalCrs.java new file mode 100644 index 0000000..6f01ea0 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/VerticalCrs.java @@ -0,0 +1,205 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import java.io.Serializable; + +/** + * A vertical coordinate reference system — the right-hand half of a compound CRS such as + * {@code EPSG:4326+5773}. + * + *

What a vertical CRS reduces to, in proj-string terms

+ * + *

PROJ 9.8.1 exports a compound CRS as the horizontal CRS's proj-string plus at most + * three tokens. Verbatim, {@code projinfo EPSG:4326+5773 -o PROJ}: + * + *

+ * +proj=longlat +datum=WGS84 +geoidgrids=us_nga_egm96_15.tif +geoid_crs=WGS84 +vunits=m
+ *   +no_defs +type=crs
+ * + *

So a vertical CRS contributes exactly {@code +geoidgrids}, {@code +geoid_crs} and + * {@code +vunits}, and this class carries no more than that plus its identity. In + * particular it is not a {@code CoordinateReferenceSystem}: it has no projection + * and no horizontal datum, and pretending otherwise would let it reach code that assumes + * both. + * + *

Two grid names, deliberately

+ * + *

{@link #geoidGrids()} is the name PROJ emits — a GeoTIFF. {@link #legacyGeoidGrids()} + * is the GTX name {@code proj.db}'s {@code grid_alternatives} table records as its + * predecessor ({@code egm96_15.gtx} for {@code us_nga_egm96_15.tif}), and it is the one + * {@link org.locationtech.proj4j.datum.VerticalGrid} can actually read, because this + * library has no GeoTIFF reader yet. Collapsing the two into one field would have meant + * either emitting a proj-string PROJ does not emit or naming a file we cannot open. + * + *

Down-positive axes are recorded but not expressible

+ * + *

{@code EPSG:5715} (MSL depth) and {@code EPSG:6357} (NAVD88 depth) use coordinate + * system {@code EPSG:6498}, whose single axis points down. PROJ's own PROJ.4 + * export drops that — {@code projinfo EPSG:4326+5715 -o PROJ} is indistinguishable from + * {@code EPSG:4326+5714} — because a legacy proj-string can express it only as + * {@code +axis=end}, which also reorders. {@link #isDepth()} therefore records the fact so + * a caller can refuse rather than silently return a height where a depth was asked for. + * + *

Immutable and thread-safe. + * + * @since 1.5 + */ +public final class VerticalCrs implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String authority; + private final String code; + private final String name; + private final String geoidGrids; + private final String legacyGeoidGrids; + private final String geoidCrs; + private final String verticalUnits; + private final boolean depth; + + /** + * @param authority the authority, conventionally {@code "EPSG"}; may be {@code null} + * @param code the authority code, e.g. {@code "5773"}; may be {@code null} + * @param name the human-readable name, e.g. {@code "EGM96 height"} + * @param geoidGrids the {@code +geoidgrids} list PROJ emits, or {@code null} when the + * vertical CRS has no geoid model expressible as a proj-string + * @param legacyGeoidGrids the GTX equivalent from {@code grid_alternatives}, or {@code null} + * @param geoidCrs the {@code +geoid_crs} value, or {@code null} + * @param verticalUnits the {@code +vunits} id; {@code null} is treated as {@code "m"} + * @param depth whether the single axis is down-positive + */ + public VerticalCrs(final String authority, final String code, final String name, + final String geoidGrids, final String legacyGeoidGrids, + final String geoidCrs, final String verticalUnits, final boolean depth) { + this.authority = authority; + this.code = code; + this.name = name; + this.geoidGrids = emptyToNull(geoidGrids); + this.legacyGeoidGrids = emptyToNull(legacyGeoidGrids); + this.geoidCrs = emptyToNull(geoidCrs); + this.verticalUnits = verticalUnits == null || verticalUnits.isEmpty() ? "m" : verticalUnits; + this.depth = depth; + } + + private static String emptyToNull(final String s) { + return s == null || s.isEmpty() ? null : s; + } + + /** @return the authority, or {@code null} for an anonymous vertical CRS. */ + public String getAuthority() { + return authority; + } + + /** @return the authority code, or {@code null}. */ + public String getCode() { + return code; + } + + /** @return {@code authority:code}, or the name when there is no code. */ + public String getIdentifier() { + if (authority == null || code == null) { + return name; + } + return authority + ":" + code; + } + + /** @return the human-readable name. */ + public String getName() { + return name; + } + + /** + * @return the {@code +geoidgrids} list as PROJ 9.8.1 emits it (GeoTIFF names), or + * {@code null} when this vertical CRS carries no geoid model in a proj-string + */ + public String geoidGrids() { + return geoidGrids; + } + + /** + * @return the GTX name {@code proj.db}'s {@code grid_alternatives} gives for + * {@link #geoidGrids()}, which is the form this library can read, or {@code null} + */ + public String legacyGeoidGrids() { + return legacyGeoidGrids; + } + + /** + * @return the grid name to hand to {@link VGridShiftOperator}: the GTX alternative when + * there is one, else the name PROJ emits, else {@code null} + */ + public String readableGeoidGrids() { + return legacyGeoidGrids != null ? legacyGeoidGrids : geoidGrids; + } + + /** + * {@code +geoid_crs}, which {@code pj_init} does not read at all — only the CRS parser + * honours it, and only when {@code +geoidgrids} is also present + * ({@code io.cpp}'s hand-coded exception). It is carried so a round-tripped proj-string + * matches PROJ's, not because it changes any arithmetic here. + * + * @return the value, or {@code null} + */ + public String geoidCrs() { + return geoidCrs; + } + + /** @return the {@code +vunits} id; never {@code null}, defaulting to {@code "m"}. */ + public String verticalUnits() { + return verticalUnits; + } + + /** @return whether the axis is down-positive, i.e. a depth rather than a height. */ + public boolean isDepth() { + return depth; + } + + /** @return whether a geoid model is available in any form. */ + public boolean hasGeoidModel() { + return geoidGrids != null || legacyGeoidGrids != null; + } + + /** + * The tokens this vertical CRS contributes to a proj-string, in PROJ's own order. + * + * @param useReadableGridName {@code true} to name the GTX file this library can read, + * {@code false} to reproduce PROJ's GeoTIFF spelling exactly + * @return a possibly empty token string with no leading or trailing space + */ + public String projTokens(final boolean useReadableGridName) { + final StringBuilder sb = new StringBuilder(); + final String grid = useReadableGridName ? readableGeoidGrids() : geoidGrids; + if (grid != null) { + sb.append("+geoidgrids=").append(grid); + if (geoidCrs != null) { + sb.append(" +geoid_crs=").append(geoidCrs); + } + } + if (sb.length() > 0) { + sb.append(' '); + } + sb.append("+vunits=").append(verticalUnits); + return sb.toString(); + } + + @Override + public String toString() { + return "VerticalCrs[" + getIdentifier() + " " + name + + (geoidGrids == null ? "" : ", geoidgrids=" + geoidGrids) + + ", vunits=" + verticalUnits + (depth ? ", down-positive" : "") + "]"; + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/VerticalCrsRegistry.java b/core/src/main/java/org/locationtech/proj4j/vertical/VerticalCrsRegistry.java new file mode 100644 index 0000000..ab3e8c9 --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/VerticalCrsRegistry.java @@ -0,0 +1,211 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * The vertical CRSs this library can name, and the seam through which the rest arrive. + * + *

Why this exists at all, and how small it deliberately is

+ * + *

{@code proj4j-epsg}'s dictionary contains no vertical CRS whatsoever. + * {@code epsg/src/main/resources/proj4/nad/epsg} holds 5,755 entries and none of + * {@code 5773}, {@code 3855}, {@code 5798}, {@code 5714}, {@code 5715}, {@code 5703} or + * {@code 4937} is among them; neither is {@code 4979}, the WGS 84 geographic 3D + * CRS. That file is a PROJ.4-era {@code +init=epsg:} dictionary and a proj-string cannot + * express a standalone vertical CRS, so their absence is structural rather than an omission + * to be patched. + * + *

The entries below are therefore not invented: each field is read out of PROJ + * 9.8.1's own {@code proj.db} and its PROJ.4 export, and the provenance is recorded per + * entry. They exist because {@code EPSG:4326+5773} is the case the consumer actually needs + * and because a nine-row table is a smaller lie than a missing feature. Anything not listed + * is reported as unknown, by name, rather than guessed at — see + * {@link #require(String, String)}. + * + *

The real fix is {@code proj4j-db}, which will supply all 900-odd EPSG vertical CRSs + * from the shipped database. When it lands it registers itself through + * {@link #register(VerticalCrs)} and these built-ins become a fallback of last resort. + * + *

How each row was obtained

+ * + *
+ * name, datum, coordinate system:
+ *   sqlite3 proj.db "select code,name,datum_code,coordinate_system_code
+ *                    from vertical_crs where auth_name='EPSG'"
+ * geoidgrids / geoid_crs / vunits:
+ *   projinfo EPSG:4326+<code> -o PROJ            # the last line of its output
+ * the GTX alternative:
+ *   sqlite3 proj.db "select proj_grid_name, old_proj_grid_name from grid_alternatives"
+ * down-positive:
+ *   coordinate_system_code 6498 is 'Depth' (axis orientation 'down'); 6499 is
+ *   'Gravity-related height' ('up')
+ * 
+ * + *

Five of the nine rows carry no {@code +geoidgrids}, and that is what PROJ + * itself emits for them: {@code EPSG:4326+5714}, {@code +5715}, {@code +5703}, + * {@code +6357} and {@code +5798} all export as plain + * {@code +proj=longlat +datum=WGS84 +vunits=m}. For those, height is passed through + * unshifted — which is exactly PROJ's "ballpark vertical transformation" and is reported as + * such by {@link VerticalCrs#hasGeoidModel()} returning {@code false}. + * + *

Thread-safe; registrations are visible to every subsequent lookup. + * + * @since 1.5 + */ +public final class VerticalCrsRegistry { + + private static final Map BUILT_IN = + new ConcurrentHashMap(); + + private static final Map REGISTERED = + new ConcurrentHashMap(); + + static { + // EGM96 height. The one EPSG:4326+5773 needs, and the only geoid model for which a + // grid ships in any form this library can read. + add(new VerticalCrs("EPSG", "5773", "EGM96 height", + "us_nga_egm96_15.tif", "egm96_15.gtx", "WGS84", "m", false)); + // EGM2008 height. 80,585,622 B as GeoTIFF - packaging-and-data.md marks it "do not + // ship" - so naming it here is a promise about identity, not about availability. + add(new VerticalCrs("EPSG", "3855", "EGM2008 height", + "us_nga_egm08_25.tif", "egm08_25.gtx", "WGS84", "m", false)); + // ODN height. Great Britain; pairs with EPSG:27700. + add(new VerticalCrs("EPSG", "5701", "ODN height", + "uk_os_OSGM15_GB.tif", null, "WGS84", "m", false)); + // EGM84 height. PROJ exports no +geoidgrids for this one: proj.db's geoid model for + // EPSG:5798 has no grid_alternatives row, so there is nothing to name. + add(new VerticalCrs("EPSG", "5798", "EGM84 height", + null, null, null, "m", false)); + // NAVD88 height / depth. Ditto - the NAVD88 geoid models are region-specific + // (us_noaa_geoid*_conus.tif and friends) and PROJ picks one per operation rather + // than per CRS, so no single +geoidgrids exists. + add(new VerticalCrs("EPSG", "5703", "NAVD88 height", + null, null, null, "m", false)); + add(new VerticalCrs("EPSG", "6357", "NAVD88 depth", + null, null, null, "m", true)); + // MSL height / depth. Genuinely model-free: EPSG:5100 is "Mean Sea Level" with no + // realisation, which is why every transformation involving it is ballpark. + add(new VerticalCrs("EPSG", "5714", "MSL height", + null, null, null, "m", false)); + add(new VerticalCrs("EPSG", "5715", "MSL depth", + null, null, null, "m", true)); + // Ellipsoidal height, the vertical half of a geographic 3D CRS. Not an EPSG vertical + // CRS - EPSG models 3D geographic CRSs as single objects (4979, 4937) rather than as + // compounds - but it is what "EPSG:4326 with a height" means, and naming it lets + // CompoundCrs express a 3D geographic CRS without a geoid. + add(new VerticalCrs(null, null, "Ellipsoidal height", + null, null, null, "m", false)); + } + + private VerticalCrsRegistry() { + throw new AssertionError("no instances"); + } + + private static void add(final VerticalCrs crs) { + if (crs.getAuthority() != null && crs.getCode() != null) { + BUILT_IN.put(key(crs.getAuthority(), crs.getCode()), crs); + } + } + + private static String key(final String authority, final String code) { + final String auth = authority == null || authority.isEmpty() ? "EPSG" : authority; + return auth.toUpperCase(Locale.ROOT) + ":" + code.trim(); + } + + /** + * Adds or replaces a vertical CRS. Intended for {@code proj4j-db} and for an application + * that has its own authority data; a registration wins over a built-in with the same key. + * + * @param crs the vertical CRS; must carry both an authority and a code + * @throws IllegalArgumentException if it has no authority or no code + */ + public static void register(final VerticalCrs crs) { + if (crs == null || crs.getAuthority() == null || crs.getCode() == null) { + throw new IllegalArgumentException( + "a registered VerticalCrs needs both an authority and a code"); + } + REGISTERED.put(key(crs.getAuthority(), crs.getCode()), crs); + } + + /** Drops every {@link #register(VerticalCrs)}ed entry, leaving the built-ins. Test hook. */ + public static void clearRegistered() { + REGISTERED.clear(); + } + + /** + * @param authority the authority; {@code null} or empty means {@code "EPSG"} + * @param code the authority code + * @return the vertical CRS, or {@code null} when it is not known here + */ + public static VerticalCrs find(final String authority, final String code) { + if (code == null) { + return null; + } + final String k = key(authority, code); + final VerticalCrs registered = REGISTERED.get(k); + return registered != null ? registered : BUILT_IN.get(k); + } + + /** + * @param authority the authority; {@code null} or empty means {@code "EPSG"} + * @param code the authority code + * @return the vertical CRS; never {@code null} + * @throws UnknownVerticalCrsException naming the code and saying where the data would + * have to come from + */ + public static VerticalCrs require(final String authority, final String code) { + final VerticalCrs found = find(authority, code); + if (found != null) { + return found; + } + throw new UnknownVerticalCrsException(key(authority, code), + "vertical CRS " + key(authority, code) + " is not known to proj4j. The shipped " + + "proj4j-epsg dictionary (proj4/nad/epsg) contains no vertical CRS at " + + "all, because a PROJ.4 +init= dictionary cannot express one; only " + + knownCodes() + " are built in. Supply it with " + + "VerticalCrsRegistry.register(...), or add the proj4j-db artifact when " + + "it ships."); + } + + /** @return every code this registry can resolve, sorted, in {@code AUTH:CODE} form. */ + public static List knownCodes() { + final List out = new ArrayList(BUILT_IN.keySet()); + for (final String k : REGISTERED.keySet()) { + if (!out.contains(k)) { + out.add(k); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + /** + * The vertical half of a geographic 3D CRS: an ellipsoidal height in metres, with no + * geoid model. + * + * @return a shared, anonymous vertical CRS + */ + public static VerticalCrs ellipsoidalHeight() { + return new VerticalCrs(null, null, "Ellipsoidal height", null, null, null, "m", false); + } +} diff --git a/core/src/main/java/org/locationtech/proj4j/vertical/package-info.java b/core/src/main/java/org/locationtech/proj4j/vertical/package-info.java new file mode 100644 index 0000000..c88b1da --- /dev/null +++ b/core/src/main/java/org/locationtech/proj4j/vertical/package-info.java @@ -0,0 +1,66 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Vertical CRSs, compound CRSs and the vertical grid shift — the third dimension. + * + *

What is here and what is not

+ * + *
    + *
  • {@link org.locationtech.proj4j.vertical.VGridShiftOperator} — {@code +proj=vgridshift}, + * ported from {@code 9.8.1:src/transformations/vgridshift.cpp}. This is the step PROJ + * hides behind {@code +geoidgrids}, and {@code pipeline.Cs2csOperator} now builds it + * automatically exactly where {@code create.cpp} does. It reads through + * {@link org.locationtech.proj4j.datum.VerticalGrid}, and therefore through the + * deterministic resolver chain in {@code org.locationtech.proj4j.resource}, never the + * working directory.
  • + *
  • {@link org.locationtech.proj4j.vertical.VerticalCrs} and + * {@link org.locationtech.proj4j.vertical.CompoundCrs} — the types behind + * {@code EPSG:4326+5773}, reached from + * {@link org.locationtech.proj4j.CRSFactory#createCompound(java.lang.String)}.
  • + *
  • {@link org.locationtech.proj4j.vertical.VerticalCrsRegistry} — a small, + * provenance-documented table plus a registration seam. It is small because it has to + * be; see below.
  • + *
+ * + *

The data gap, stated plainly

+ * + *

{@code proj4j-epsg}'s {@code proj4/nad/epsg} holds 5,755 entries and not one vertical + * CRS. {@code EPSG:5773}, {@code 3855}, {@code 5798}, {@code 5714}, {@code 5715}, + * {@code 5703} and {@code 4937} are all absent, and so is {@code EPSG:4979} — WGS 84 + * geographic 3D. That is not an oversight in the file: it is a PROJ.4-era {@code +init=} + * dictionary, and a proj-string has no way to denote a standalone vertical CRS. + * {@code EPSG:4979} is absent for a different reason — its proj-string, + * {@code +proj=longlat +datum=WGS84 +no_defs}, is byte-identical to {@code EPSG:4326}'s, so + * the dictionary format cannot distinguish 2D from 3D either. + * + *

The real supply is the {@code proj4j-db} artifact, which will carry all of EPSG's + * vertical CRSs. Until then the built-in table covers the nine codes whose values could be + * read directly out of PROJ 9.8.1 on the build machine, and every other code is an + * {@link org.locationtech.proj4j.vertical.UnknownVerticalCrsException} that names itself. + * + *

Height semantics

+ * + *

{@code NaN} is this library's "no height" sentinel — see + * {@link org.locationtech.proj4j.ProjCoordinate}, whose two-argument constructor, + * {@code setValue(x, y)} and {@code clearZ()} all set it. A transform must never turn that + * sentinel into a number. PROJ achieves the same thing for a two-dimensional operation with + * {@code +proj=push +v_3} / {@code +proj=pop +v_3} around the geocentric leg, which restores + * the caller's third ordinate byte for byte. + * + * @since 1.5 + */ +package org.locationtech.proj4j.vertical; diff --git a/core/src/test/java/org/locationtech/proj4j/CoordinateTransformTest.java b/core/src/test/java/org/locationtech/proj4j/CoordinateTransformTest.java index 74fc197..4601cd7 100755 --- a/core/src/test/java/org/locationtech/proj4j/CoordinateTransformTest.java +++ b/core/src/test/java/org/locationtech/proj4j/CoordinateTransformTest.java @@ -15,9 +15,7 @@ *******************************************************************************/ package org.locationtech.proj4j; -import junit.textui.TestRunner; import org.junit.Test; -import org.junit.Ignore; /** * Tests correctness and accuracy of Coordinate System transformations. @@ -26,29 +24,56 @@ */ public class CoordinateTransformTest extends BaseCoordinateTransformTest { - public void testFirst() { - checkTransformFromGeo("proj=lcc datum=NAD83 lon_0=-100d30 lat_1=48d44 lat_2=47d26 lat_0=47 x_0=600000 y_0=0 units=us-ft", -98.76756444444445, 48.13707861111111, 2391470.474, 419526.909, 0.01); - checkTransformAndInverse("+proj=stere +ellps=WGS84 +lon_0=21.00000000 +lat_0=52.00000000 +no_defs", 0, 0, - "+proj=longlat +ellps=WGS84 +no_defs", 21, 52, 0.0000001, 0.000001); - //checkTransform("EPSG:4230", 5, 58, "EPSG:2192", 764566.84, 3343948.93, 0.01 ); - //checkTransform("EPSG:4258", 5.0, 70.0, "EPSG:3035", 4041548.12525335, 4109791.65987687, 0.1 ); - /* - checkTransform("EPSG:4326", 3.8142776, 51.285914, "EPSG:23031", 556878.9016076007, 5682145.166264554, 0.1 ); - checkTransformFromWGS84("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.237,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +units=m +no_defs", - 5.387638889, 52.156160556, 155029.78919920223, 463109.9541111593); - //checkTransformFromWGS84("EPSG:3153", -127.0, 52.11, 931625.9111828626, 789252.646454557 ); - //checkTransformToGeo("EPSG:28992", 148312.15, 457804.79, 5.29, 52.11, 0.01 ); - //checkTransformFromWGS84("EPSG:3785", -76.640625, 49.921875, -8531595.34908, 6432756.94421 ); - */ - } + // testFirst deleted. It carried no @Test annotation, so it had never run, and both of its live + // rows were exact duplicates of rows that do run: + // * the lcc/NAD83/us-ft row is identical to the second row of testLambertConformalConic() + // * the stere round-trip is identical to the third row of testStereographicAzimuthal() + // Everything else in it was already commented out. + /** + * {@code EPSG:4326 -> EPSG:27700}, re-pinned to PROJ 9.8.1 after {@code Datum.OSGB36} was + * corrected to the Helmert in PROJ's own {@code src/datums.cpp:59} + * ({@code 446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894}) from EPSG:1314's rounded + * {@code 0.15,0.247,0.842,-20.489}. That correction moved every OSGB36 row by about 3.3 mm. + * + *

The old first row was right, and {@code Proj4JSTest:148} was wrong

+ * + *

These two asserted different values for the same transform: {@code 343733.1404} + * here at 0.1 m, and {@code 343733.137100357} there at 1e-3 m. {@code cct} 9.8.1 on the + * {@code datums.cpp} Helmert gives {@code 343733.140404274571}, so this row's four decimal + * places were correct all along and merely too coarse to notice; the eighteen-digit value in + * {@code Proj4JSTest} was bit-for-bit the EPSG:1314 Helmert, i.e. precise about the wrong + * operation. A wide tolerance on a right number beat a tight tolerance on a wrong one, + * and only re-deriving both from {@code cct} could say which was which. Both are now pinned to + * the same PROJ value at 1e-8 m. + * + *

The round trip was split into two independently pinned directions

+ * + *

It was {@code checkTransformAndInverse(..., 398089, 383867, ...)}, which inverse-transforms + * the expected projected pair and compares against the original geographic pair. That + * is not a round trip here: the forward leg feeds the Helmert an assumed height of 0 and + * computes {@code h = -50.12}, while the inverse leg feeds it 0 again rather than + * {@code -50.12}. The asymmetry is worth 1.24e-8 deg, about 1.4 mm — real, expected of a + * 2D Helmert, and 3x the old inverse tolerance. Coupling the two directions could only be + * absorbed by widening that tolerance past the thing it exists to measure, so each direction is + * now pinned to {@code cct} separately at 1e-8 m and 1e-12 deg, which is tighter than either + * half of the old assertion. The two integers {@code 398089, 383867} were never a reference; + * they were the seed the geographic point had been back-computed from. + */ @Test public void testEPSG_27700() { - checkTransform("EPSG:4326", -2.89, 55.4, "EPSG:27700", 343733.1404, 612144.530677, 0.1); - checkTransformAndInverse( - "EPSG:4326", -2.0301713578021983, 53.35168607080468, - "EPSG:27700", 398089, 383867, - 0.001, 0.2 * APPROX_METRE_IN_DEGREES); + // cct -d 15 on the datums.cpp Helmert. Measured Proj4J residual: dx 0, dy 2.6e-10 m. + checkTransform("EPSG:4326", -2.89, 55.4, + "EPSG:27700", 343733.140404274571, 612144.531378557556, 1.0e-8); + + // Forward. Measured Proj4J residual: dx 0, dy 1.0e-9 m. + checkTransform("EPSG:4326", -2.0301713578021983, 53.35168607080468, + "EPSG:27700", 398089.003912951506, 383867.000589373347, 1.0e-8); + // Inverse of that same projected pair. cct gives -2.030171345366366, 53.351686067759957; + // measured Proj4J residual 1e-15 deg. Note it is NOT the geographic point above -- see the + // 1.4 mm height asymmetry in this method's javadoc. + checkTransform("EPSG:27700", 398089.003912951506, 383867.000589373347, + "EPSG:4326", -2.030171345366366, 53.351686067759957, 1.0e-12); } @@ -114,11 +139,9 @@ public void testLambertConformalConic() { */ } - // PROJ.4 #148 - public void testPconic() { - // pconic does not currently work - //checkTransformAndInverse("+proj=latlong +datum=WGS84", -70.4, -23.65, "+proj=pconic +units=m +lat_1=20n +lat_2=60n +lon_0=60W +datum=WGS84", -2240096.40, -6940342.15, 2e-1, 1e-6 ); - } + // testPconic deleted (PROJ.4 #148). It had no @Test annotation and its entire body was a single + // commented-out line. The case is now live, with measured errors, at + // Proj4VariousTest.testPconic() -- forward 565,848 m / 2,479,531 m off PROJ 9.8.1. // PROJ.4 #133 @Test @@ -180,10 +203,21 @@ public void testLambertAzimuthalEqualArea() { //checkTransform("EPSG:4258", 5.0, 70.0, "EPSG:3035", 4041548.12525335, 4109791.65987687, 0.1 ); } + /** + * somerc. + *

+ * {@code FeatureTest} used to assert 660389.52, 185731.63 for this same input at a 200 m + * tolerance, contradicting this method. cs2cs 9.8.1 confirms this method: + * {@code +proj=longlat +ellps=bessel -> somerc} gives 660309.341946539, 185586.295802115, + * which proj4j reproduces bit-for-bit. The other value is the WGS84-sourced answer (i.e. with the + * {@code +towgs84=674.374,15.056,405.346} shift applied), and the 145.33 m gap between the two is + * the size of that shift. The duplicate has been deleted; the shifted case is asserted at 1e-6 m + * by {@code Proj4JSTest.testDatumShiftedProjections()}. + */ @Test public void testSwissObliqueMercator() { - // from PROJ.4 - checkTransformFromAndToGeo("EPSG:21781", 8.23, 46.82, 660309.34, 185586.30, 0.1, 2 * APPROX_METRE_IN_DEGREES); + checkTransformFromAndToGeo("EPSG:21781", 8.23, 46.82, 660309.341946539, 185586.295802115, + 1.0e-6, 2 * APPROX_METRE_IN_DEGREES); } @Test @@ -205,6 +239,33 @@ public void testEPSG_4326() { 0.000001, 20 * APPROX_METRE_IN_DEGREES); } + /** + * {@code createGeographic()} must carry {@code +pm}, because a prime meridian is a property of + * the geodetic datum and not of the projected coordinate system laid over it. + * + *

{@code checkTransformFromGeo} goes through + * {@code CoordinateReferenceSystem.createGeographic()}, which rebuilt the geographic CRS from the + * datum and ellipsoid alone and dropped {@code +pm}. So this row silently asked for a + * Greenwich-to-Paris conversion and answered 653,653.763 where the same-meridian answer is + * 841,393.487 — 187,739.724 m of easting error, expressed as a completely plausible + * coordinate. 94 of the shipped EPSG definitions carry {@code +pm=}, and EPSG:4807, the + * geographic CRS EPSG really pairs with EPSG:27563, is itself {@code +proj=longlat … +pm=paris}. + * + *

{@code cs2cs} 9.8.1: {@code 841393.487137525 181075.316188060}, matched to 2.5e-9 m. + */ + @Test + public void testPrimeMeridianSurvivesCreateGeographic() { + checkTransformFromGeo("EPSG:27563", 3.005, 43.89, 841393.487137525, 181075.316188060, 1.0e-6); + // The same thing on a numeric +pm, whose PrimeMeridian is named "user-provided" and so + // cannot be reconstructed from its name. cs2cs 9.8.1 on the +pm=2.337229166666667 form of + // the definition above gives the same two numbers. + checkTransformFromGeo( + "+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0" + + " +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515" + + " +towgs84=-168,-60,320,0,0,0,0 +pm=2.337229166666667 +units=m +no_defs", + 3.005, 43.89, 841393.487137525, 181075.316188060, 1.0e-6); + } + @Test public void testParams() { checkTransformFromWGS84("+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m ", @@ -212,7 +273,125 @@ public void testParams() { } /** - * Values confirmed with PROJ.4 (Rel. 4.4.6, 3 March 2003) + * Values confirmed with PROJ.4 (Rel. 4.4.6, 3 March 2003) — for the seven two-decimal rows at + * 0.1 m. The eighteen-digit rows were added much later and were generated by Proj4J itself, + * which is why several of them carried {@code tolerance 0.0}. + * + *

Three of those zero-tolerance rows moved, by 1.2 to 2.2 micrometres

+ * + *

Rows 1-3 below, all of them {@code EPSG:27700} sources, i.e. an ellipsoidal + * {@code tmerc} inverse and therefore {@code inv_mlfn}. Replacing the PROJ-4-era + * {@code inv_mlfn} in the numerical core shifted them: + * + * + * + * + * + * + * + * + * + *
measured movement, frozen A/B
rowmovement
{@code 27700 (612435.55, 1234954.16) -> WGS84}2.4e-12 deg lon, 2.0e-11 deg lat — about 2.2 um
{@code 27700 (327420.99, 690284.55) -> WGS84}3.4e-13 deg lon, 1.1e-11 deg lat — about 1.2 um
{@code 27700 -> 3857}3.7e-08 m easting, 2.2e-06 m northing
+ * + *

A {@code tolerance 0.0} assertion against a value Proj4J printed for itself is not a + * correctness bar, so the three took a stated tolerance naming the movement rather than + * pretending to bit-exactness across a numerical-core replacement. + * + *

That round left three zero-tolerance rows standing — {@code 4326 -> 3857}, + * {@code 4055 -> 3857} and {@code 9054 -> 3857} — on the reasoning that all three are spherical + * Mercator forwards with no {@code inv_mlfn} in them. The reasoning was right about the kernel + * and wrong about the bar: two of the three were failing by 1e-9 and 2e-9 m by the time + * anything else in this method reached them, which is a build failure produced by nothing more + * than the order the multiply-adds ended up in. Both now carry a stated tolerance. Only + * {@code 9054 -> 3857} is left at {@code 0.0}, and only because it is bit-for-bit {@code cct}. + * + *

SUPERSEDED: every OSGB36 row is now pinned to PROJ, and the "systematic residual" is gone

+ * + *

The paragraph that used to stand here said {@code cs2cs} 9.8.1 gave + * {@code 1.920000023403453 60.939999989916728} for the first of those rows, that Proj4J was + * 0.6 mm away, and that the gap belonged to "the {@code tmerc} algorithm choice (PROJ's + * default is the exact Poder/Engsager formulation; Proj4J runs the Evenden/Snyder series) and + * to the 2D-Helmert-with-assumed-height path". Two of those three claims were wrong: + * + *

    + *
  • It was the Helmert, not {@code tmerc}. {@code Datum.OSGB36} carried EPSG:1314's + * rounded {@code 0.15,0.247,0.842,-20.489}; PROJ 9.8.1 defines {@code +datum=OSGB36} in + * {@code src/datums.cpp:59} as {@code 0.1502,0.2470,0.8421,-20.4894}. Correcting it moved + * eight rows in this file by 1.4e-3 to 6.0e-3 m. Measured on the identical pipeline at one + * of these points, {@code +approx} and exact {@code tmerc} differ by 1.6e-9 m — six + * orders of magnitude below the residual they were blamed for. Testing the two causes + * separately is what separated them.
  • + *
  • The residual is not systematic; it is zero. With the corrected Helmert, Proj4J is + * bit-for-bit {@code cct} 9.8.1 on all eight: worst ordinate residual over the whole method + * is 1.5e-9 m. Every eighteen-digit row below is now a {@code cct} value at a + * tolerance just above its measured residual, so none of them is Proj4J agreeing with + * itself any more.
  • + *
+ * + *

The one claim that stands is the last: a {@code tolerance 0.0} row is not a correctness + * bar. Two survivors are dealt with at their call sites below. + * + *

RETRACTED: the {@code EPSG:4055 <-> EPSG:3857} "42.5 km defect" was a comparison against + * the wrong reference, and the named cause is load-bearing for Web Mercator

+ * + *

The paragraphs that used to stand here said these two rows disagreed with PROJ 9.8.1 by + * 42,538.9 m of northing, that the cause was + * {@code GeocentricConverter.overrideWithWGS84Params()} replacing the target sphere with the + * WGS 84 ellipsoid, and that this was "a sphere-geodetic to ellipsoid-geodetic latitude + * conversion that PROJ does not perform, because to PROJ {@code +nadgrids=@null} means no datum + * shift at all." All three claims are wrong. Measured, on the identical parameter + * strings, Proj4J agrees with {@code cs2cs} 9.8.1 to 2.3e-7 m. + * + *

The 42.5 km was two different questions, not two different answers. The reference + * had been taken from {@code cs2cs EPSG:4055 EPSG:3857}, which resolves both codes in + * {@code proj.db}. Proj4J resolves them in {@code proj4/nad/epsg}, and the two definitions of + * {@code EPSG:4055} are not the same CRS: + * + * + * + * + * + * + * + * + *
{@code EPSG:4055}, two definitions
sourcedefinition
{@code proj4/nad/epsg:100}{@code +proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs}
{@code projinfo EPSG:4055 -o PROJ} at 9.8.1{@code +proj=longlat +R=6378137 +no_defs} — no {@code +towgs84}
+ * + *

{@code EPSG:4055} and EPSG:15973, its transformation to WGS 84, are both + * deprecated in EPSG, so 9.8.1 declines to use 15973 and answers with a + * Ballpark geographic offset — {@code +proj=noop} — which is why the database route + * leaves the latitude alone. EPSG 15973 itself is a geocentric translation of {@code (0,0,0)} + * whose description reads "Executes change of sphere/ellipsoid", declared accuracy + * 800 m: the sphere-to-ellipsoid latitude change is the transformation EPSG registered, + * not an artefact. The legacy dictionary's {@code +towgs84=0,0,0,0,0,0,0} is that same + * operation, and 9.8.1 honours it when it is asked to — the composition it builds for the + * dictionary strings contains {@code +step +proj=cart +R=6378137} followed by + * {@code +step +inv +proj=cart +ellps=WGS84}, i.e. exactly the conversion it was said never to + * perform. Both engines then agree in both configurations: + * + * + * + * + * + * + * + * + *
at (-180, -85.01794318500549), lon/lat, northing in metres
sourcetargetProj4J{@code cs2cs} 9.8.1
dictionary {@code 4055}, with {@code +towgs84}dictionary {@code 3857}-20037366.780895380-20037366.780895609
the same, {@code +towgs84} removeddictionary {@code 3857}-19994827.892149360-19994827.892149359
+ * + *

The named method is not the defect; it is what makes {@code 4326 -> 3857} correct. + * Disabling both call sites with an {@code if (false && ...)} and re-running the same matrix + * moves the headline row 42,538.9 m — away from PROJ — and breaks ten others by 305 m + * to 30 km, including {@code 4326 -> 3857} by 25,380 m. {@code EPSG:3857} carries + * {@code +nadgrids=@null} on an {@code a=b=6378137} sphere, so without the override every Web + * Mercator transform round-trips WGS 84 latitudes through a sphere. 9.8.1 does the same thing + * the method does: the pipeline for a {@code +nadgrids=} CRS into a Helmert one is + * {@code hgridshift} followed by {@code +proj=cart +ellps=WGS84} — the grid's own ellipsoid + * never appears, because the output of a grid shift is WGS 84 geodetic. The method is + * pinned, with that matrix, by {@code datum/NadgridsWgs84OverrideTest}. + * + *

So both rows are re-pinned below to {@code cs2cs} 9.8.1 on the parameter strings + * Proj4J is actually given, which is what non-negotiable 5a asks for and is a different + * measurement from {@code cs2cs EPSG:4055 EPSG:3857}. Any remaining gap to the database route + * lives in {@code proj4/nad/epsg}, not in {@code datum/} or {@code parser/}. */ @Test public void testPROJ4() { @@ -223,24 +402,69 @@ public void testPROJ4() { checkTransformFromGeo("EPSG:2736", 34.0, -21.0, 603934.39, 7677664.39, 0.1); checkTransformFromGeo("EPSG:26916", -86.6056, 34.579, 536173.11, 3826428.04, 0.1); checkTransformFromGeo("EPSG:21781", 8.23, 46.82, 660309.34, 185586.30, 0.1); - checkTransformFromWGS84("EPSG:27700", -8.82, 49.79, -90619.28789678006, 10097.131147458786, 1E-4); - checkTransformToWGS84("EPSG:27700", 612435.55, 1234954.16, 1.9200000236235546, 60.93999999543101, 0.0); - checkTransformToWGS84("EPSG:27700", 327420.988668, 690284.547110, -3.1683134533969364, 56.0998025292667, 0.0); - checkTransformFromWGS84("EPSG:3857", -3.1683134533969364, 56.0998025292667, -352695.04030562507, 7578309.225014557, 0.0); - checkTransform("EPSG:27700", 327420.988668, 690284.547110, "EPSG:3857", -352695.04030562507, 7578309.225014557, 0.0); - checkTransform("EPSG:3857", -352695.04030562507, 7578309.225014557, "EPSG:27700", 327420.988668, 690284.547110, 0.001); + // --- OSGB36 rows, all re-pinned to cct 9.8.1 on the datums.cpp Helmert. Residuals in + // --- brackets are the measured Proj4J-vs-PROJ gap; tolerances sit just above them. + checkTransformFromWGS84("EPSG:27700", -8.82, 49.79, + -90619.285016088281, 10097.132572255272, 1.0e-8); // [1.2e-10, 1.1e-9 m] + checkTransformToWGS84("EPSG:27700", 612435.55, 1234954.16, + 1.919999951933030, 60.939999991837148, 1.0e-12); // [1e-15, 7e-15 deg] + checkTransformToWGS84("EPSG:27700", 327420.988668, 690284.547110, + -3.168313507517727, 56.099802520035347, 1.0e-12); // [0, 7e-15 deg] + // Spherical Mercator forward, no datum shift and no OSGB36: this row did not move, and + // Proj4J is bit-for-bit cct (-352695.040305625065, 7578309.225014558062). Its northing was + // pinned one ulp low at tolerance 0.0, so it was a build failure waiting on any + // reassociation anywhere in the merc kernel. Re-pinned to PROJ, with 1e-8 m stated. + checkTransformFromWGS84("EPSG:3857", -3.1683134533969364, 56.0998025292667, + -352695.040305625065, 7578309.225014558062, 1.0e-8); // [<1e-9 m] + // 27700 -> 3857 goes through the Helmert, so it moved 6.0e-3 m with Datum.OSGB36. + checkTransform("EPSG:27700", 327420.988668, 690284.547110, + "EPSG:3857", -352695.046330323908, 7578309.223172096536, 1.0e-8); // [8e-9, 1.5e-9 m] + // ...and 3857 -> 27700 is NOT its inverse: the input pair here is the 4326-sourced value + // from two rows up, not the 27700-sourced value from one row up, so the two differ by the + // 6.0e-3 m above. Pinned to cct in its own right rather than to the round trip it resembles. + checkTransform("EPSG:3857", -352695.04030562507, 7578309.225014557, + "EPSG:27700", 327420.992840466322, 690284.548029357218, 1.0e-8); // [2.2e-11, 7.2e-10 m] checkTransform("EPSG:31469", 5439627.33, 5661628.09, "EPSG:3857", 1573657.37, 6636624.41, 0.01); checkTransform("EPSG:3857", 1573657.37, 6636624.41, "EPSG:31469", 5439627.33, 5661628.09, 0.01); checkTransform("EPSG:2056", 2600670.52, 1199667.32, "EPSG:3857", 829045.23, 5933605.15, 0.01); checkTransform("EPSG:3857", 829045.23, 5933605.15, "EPSG:2056", 2600670.52, 1199667.32, 0.01); - checkTransform("EPSG:3857", -20037508.342789244, -20037366.780895382, "EPSG:4055", -180.0, -85.01794318500549, 0.001); - checkTransform("EPSG:4055", -180.0, -85.01794318500549, "EPSG:3857", -20037508.342789244, -20037366.780895382, 0.0); + // The two EPSG:4055 rows, now cs2cs 9.8.1 values. Both were self-portraits before and the + // 42,538.9 m attributed to them was a comparison against cs2cs EPSG:4055 EPSG:3857, i.e. + // against proj.db's non-deprecated reading of a deprecated CRS, not against 9.8.1's answer + // for the dictionary strings Proj4J parses. See this method's javadoc. Reference command, + // with S and T the verbatim proj4/nad/epsg entries for 4055 and 3857 plus "+type=crs": + // echo "-20037508.342789244 -20037366.780895382" | cs2cs -d 17 "$T" +to "$S" + // echo "-180 -85.01794318500549" | cs2cs -d 15 "$S" +to "$T" + // The inverse row's old expected latitude, -85.01794318500549, was neither engine's answer: + // it was this pair's forward *input* copied back, passing only on a 0.001 deg tolerance. + // The two directions do not round-trip, in PROJ either -- the geocentric leg is bracketed + // by push/pop +v_3, so the height the sphere-to-ellipsoid change generates is discarded and + // the inverse re-enters with h=0. 9.8.1's own inverse of its own forward output lands on + // -85.017832752549779, 1.1e-4 deg from where it started. + checkTransform("EPSG:3857", -20037508.342789244, -20037366.780895382, + "EPSG:4055", -180.0, -85.017832752549594, 1.0e-12); // [0, 5.5e-15 deg] + checkTransform("EPSG:4055", -180.0, -85.01794318500549, + "EPSG:3857", -20037508.342789243907, -20037366.780895609409, 1.0e-6); // [9e-11, 2.3e-7 m] + // Spherical Mercator forward on WGS 84 lon/lat, no datum shift. cct 9.8.1 gives + // 11476561.160934567451 4358745.039558878168, which Proj4J reproduces exactly -- so this + // is the one zero-tolerance row in this method that is a reference and not a self-portrait. checkTransform("EPSG:9054", 103.095703, 36.421282, "EPSG:3857", 11476561.160934567, 4358745.039558878, 0.0); } + /** + * Was testPROJ4_LargeDiscrepancy, asserting EPSG:29100 to within 4,000 m. + *

+ * The expected values it carried (5110899.06, 10552971.67) were correct — cs2cs 9.8.1 + * gives 5110899.063466947, 10552971.667179093. The 4,000 m tolerance existed because proj4j was + * wrong by dx 2.820 m, dy 3,712.139 m: {@code PolyconicProjection} ran the spherical + * formula on an ellipsoid, its output bit-identical to {@code cs2cs +R=6378160}. Now fixed, so the + * correct value can be asserted at 1e-9 m instead of 4,000 m. + *

+ * The full diagnosis is at {@link Proj4JSTest#testPolyconicIsEllipsoidal()}. + */ @Test - public void testPROJ4_LargeDiscrepancy() { - checkTransformFromGeo("EPSG:29100", -53.0, 5.0, 5110899.06, 10552971.67, 4000); + public void testPolyconic() { + checkTransformFromGeo("EPSG:29100", -53.0, 5.0, 5110899.063466947, 10552971.667179093, 1.0e-9); } @Test @@ -248,24 +472,12 @@ public void testRadius() { checkTransformToWGS84("+title=long/lat:WGS84 +proj=eqc +R=57295779.5130823209", 1000000.0, 1000000.0, 1.0, 1.0, 0.01); } - @Ignore("TODO: Should these expect UnknownAuthoriyCode exceptions?") @Test - public void XtestUndefined() { - //runInverseTransform("EPSG:27492", 25260.493584, -9579.245052, -7.84, 39.58); - //runInverseTransform("EPSG:27563", 653704.865208, 176887.660037, 3.005, 43.89); - //runInverseTransform("EPSG:54003", 1223145.57,6491218.13,-6468.21, 11.0, 53.0); - - -// runTransform("EPSG:31467", 9, 51.165, 3500072.082451, 5670004.744777 ); - - checkTransformFromWGS84("EPSG:54008", 11.0, 53.0, 738509.49, 5874620.38); - - checkTransformFromWGS84("EPSG:102026", 40.0, 40.0, 3000242.40, 5092492.64); - checkTransformFromWGS84("EPSG:54032", -127.0, 52.11, -4024426.19, 6432026.98); - - checkTransformFromWGS84("EPSG:42304", -99.84375, 48.515625, -358185.267976, -40271.099023); - checkTransformFromWGS84("EPSG:42304", -99.84375, 48.515625, -358185.267976, -40271.099023); -// runInverseTransform("EPSG:28992", 148312.15, 457804.79, 698.48, 5.29, 52.11); - } + // XtestUndefined deleted. It was doubly disabled (an "X" prefix *and* an @Ignore whose reason was + // an unanswered question), and every code it named -- 54008, 102026, 54032, 42304 -- is an ESRI + // code being looked up under the EPSG authority, which cannot and must not resolve. The question + // is now answered as an assertion rather than a TODO, in + // Proj4JSTest.testEpsgAuthorityDoesNotResolveEsriCodes(), which requires + // UnknownAuthorityCodeException for all seven such codes. @Test public void testEPSG_2065() { diff --git a/core/src/test/java/org/locationtech/proj4j/FeatureTest.java b/core/src/test/java/org/locationtech/proj4j/FeatureTest.java index 42f9b85..702eae4 100755 --- a/core/src/test/java/org/locationtech/proj4j/FeatureTest.java +++ b/core/src/test/java/org/locationtech/proj4j/FeatureTest.java @@ -18,73 +18,236 @@ import org.junit.Test; /** - * Tests for implementation of PROJ4 features (such as projection parameters and datum transformations). - * This test set is not intended to test for numerical correctness of transformations. + * Tests for the PROJ.4 features — parameters and datum transformations — rather than for + * numerical correctness of any one projection. *

- * It is expected that many of these test will fail, until - * the tested features are implemented. + * Every expected value in this class was measured against PROJ 9.8.1 (cs2cs -d 9, + * Rel. 9.8.1, April 10th 2026) and the tolerance is set to the observed agreement. This replaces + * a class javadoc that read "It is expected that many of these test will fail, until the tested + * features are implemented" while all seven methods passed — because four tolerances had been + * widened until they did: testR_A 50,000 m, testTowgs84 100 m, + * testSouth 200 m, testSwissObliqueMercator 200 m. + *

+ * What the padding was hiding, once measured, was almost the opposite of what the javadoc claimed: + *

    + *
  • +R_A, +south, +towgs84 and somerc are all + * accurate to within 5e-6 m of PROJ 9.8.1. The old expected values — imported from Proj4.JS — + * were themselves wrong by 27,845 m, 159 m and 145 m respectively, and the wide tolerances were + * absorbing their error, not proj4j's.
  • + *
  • Two tests were calling the wrong helper: checkTransformFromGeo (source = the + * target CRS's own geographic CRS, so no datum shift) with expected values that had been + * computed from WGS84 (i.e. with the shift). See {@link #testTowgs84()}.
  • + *
  • The one genuine gap {@link #testDatumConversion()} exposes is not arithmetic at all: PROJ + * 9.8.1 redefined +datum=potsdam to use the BETA2007 grid.
  • + *
* * @author Martin Davis */ public class FeatureTest extends BaseCoordinateTransformTest { CoordinateTransformTester tester = new CoordinateTransformTester(true); - + /** + * A 7-parameter datum shift, WGS84 -> DHDN / Gauss-Kruger zone 2. + *

+ * proj4j reproduces PROJ 9.8.1's Helmert path exactly. Three values exist for this point + * and the difference between them is a definition change, not a defect: + *

+     *   proj4j                                        2547686.152499  5699151.775294
+     *   cs2cs +towgs84=598.1,73.7,418.2,...           2547686.152499  5699151.775293   dx 0.0  dy 1.6e-6
+     *   cs2cs +datum=potsdam  (= @BETA2007.gsb)       2547687.754608  5699151.154188   dx 1.602  dy 0.621
+     *   the old expected value in this test           2547685.012119  5699155.734503   dx 1.140  dy 3.959
+     * 
+ * The old expected value is exactly PROJ's answer for the legacy 3-parameter + * +towgs84=606.0,23.0,413.0 definition of potsdam (verified: cs2cs gives + * 2547685.012118995, 5699155.734503226). proj4j's {@code Datum.POTSDAM} is the newer 7-parameter + * set, so the test literal had been stale for two definition changes and the 10 m tolerance hid + * both. + *

+ * Finding: PROJ 9.8.1's {@code +datum=potsdam} is {@code nadgrids=@BETA2007.gsb} with the + * towgs84 form commented out in {@code src/datums.cpp}. Reaching parity needs the grid, i.e. + * a GeoTIFF reader; the remaining 1.602 m is the grid-vs-Helmert residual and nothing else. + */ @Test public void testDatumConversion() { -// datum conversions not yet supported -// +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs - checkTransformFromWGS84("EPSG:31466", 6.685, 51.425, 2547685.01212, 5699155.7345, 10); + // <31466> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +datum=potsdam +units=m + checkTransformFromWGS84("EPSG:31466", 6.685, 51.425, 2547686.152499, 5699151.775294, 1.0e-5); + } + + /** + * +pm=paris. Was NOTSUPPORTED_testPrimeMeridian, disabled by naming + * convention with a commented-out @Test. +pm= appears in 94 EPSG + * definitions, so it was a real blind spot. + *

+ * Checked, not assumed: +pm works, and matches PROJ 9.8.1 to 1e-9 m. Both + * values below are bit-identical between proj4j and cs2cs. proj4j's + * {@code PrimeMeridian.east("paris", 2, 20, 14.025)} agrees with PROJ's + * {@code {"paris", "2d20'14.025\"E"}}. + *

+ * The reason the old test could not pass is neither +pm nor the arithmetic: its + * expected value (653704.865208, 176887.660037) matches neither configuration, being + * 51.10 m from the Greenwich-source answer and 187.7 km from the Paris-source answer. It is a + * third-party literal of unknown provenance, and 653653.762847 is what PROJ 9.8.1 produces for + * the transform the old test actually requested. + */ + @Test + public void testPrimeMeridian() { + // <27563> NTF (Paris) / Lambert Sud France + final String lccParis = "+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0" + + " +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515" + + " +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs"; + + // Source longitudes measured from Paris, as the target's +pm declares. + // cs2cs: 841393.487137525 181075.316188060 + checkTransform("+proj=longlat +a=6378249.2 +b=6356515 +pm=paris", 3.005, 43.89, + lccParis, 841393.487137525, 181075.316188060, 1.0e-6); + + // Source longitudes measured from Greenwich. PROJ subtracts the target's +pm, so this is a + // different (and legitimate) transform, not an error. + // cs2cs: 653653.762846642 176887.146881258 + checkTransform("+proj=longlat +a=6378249.2 +b=6356515", 3.005, 43.89, + lccParis, 653653.762846642, 176887.146881259, 1.0e-6); } -// @Test - public void NOTSUPPORTED_testPrimeMeridian() { - //# NTF (Paris) / Lambert Sud France - //<27563> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> - checkTransformFromGeo("EPSG:27563", 3.005, 43.89, 653704.865208, 176887.660037); + /** + * A declared blind spot, kept visible rather than silent. + *

+ * {@code CoordinateReferenceSystem.createGeographic()} (main source, {@code :113-120}) rebuilds a + * geographic CRS from the datum and ellipsoid only — it drops +pm. So + * {@code checkTransformFromGeo("EPSG:27563", ...)} silently asks for a Greenwich-to-Paris + * transform and gets 653653.762847 where the same-meridian answer is 841393.487138: an error of + * 187,739.724 m in easting, expressed as a perfectly plausible coordinate. + *

+ * This affected every one of the 94 EPSG definitions carrying +pm= whenever a caller + * used {@code createGeographic()}. + *

+ * Fixed in main source and live again. {@code createGeographic()} now carries the prime + * meridian, since a prime meridian belongs to the datum — EPSG pairs EPSG:27563 with EPSG:4807, + * which is itself {@code +proj=longlat … +pm=paris}. Matches {@code cs2cs} 9.8.1 to 2.5e-09 m. + * See also {@code CoordinateTransformTest.testPrimeMeridianSurvivesCreateGeographic}, which adds + * the numeric-{@code +pm} case. + */ + @Test + public void testPrimeMeridianViaCreateGeographic() { + checkTransformFromGeo("EPSG:27563", 3.005, 43.89, 841393.487137525, 181075.316188060, 1.0e-6); } + /** + * omerc with +gamma. + *

+ * Both rows are bit-identical to PROJ 9.8.1 (4e-9 m and 1e-9 m). Note carefully which + * +gamma cases these are — the two that work: + *

    + *
  • EPSG:2057 has gamma == alpha.
  • + *
  • EPSG:3375 has gamma != alpha but also +no_uoff, which + * short-circuits the one line that is wrong.
  • + *
+ * The uncovered case — gamma != alpha without +no_uoff — is wrong by + * 3,165 m; see {@link Proj4VariousTest#testRSOBorneo()}. + */ @Test public void testGamma() { - // from Proj4.JS - checkTransformFromWGS84("EPSG:2057", -53.0, 5.0, -1.160832226E7, 1.828261223E7, 0.1); + // <2057> omerc, gamma == alpha, through a 3-param towgs84. + // cs2cs: -11608322.257560587 18282612.229838394 + checkTransformFromWGS84("EPSG:2057", -53.0, 5.0, -11608322.257560587, 18282612.229838394, 1.0e-5); + + // <3375> omerc, gamma != alpha, +no_uoff. cs2cs: 412597.532715333 338944.957259173 + checkTransformFromGeo("EPSG:3375", 101.70979078430528, 3.06268465621428, + 412597.532715333, 338944.957259173, 1.0e-6); } + /** + * +R_A — spherification to the authalic radius. + *

+ * The old tolerance was 50,000 m, with the comment "result is out by 50,000 m". + * It is not: proj4j and PROJ 9.8.1 agree to 1e-9 m. + *

+     *   proj4j            1223145.571759001  6519063.378708009
+     *   cs2cs +R_A        1223145.571759001  6519063.378708010
+     *   old expected      1223145.57         6491218.13          dy = 27,845.249 m
+     *   cs2cs without R_A 1224514.398726009  6526358.887892235
+     * 
+ * Finding: the 50,000 m padding was absorbing an error in the Proj4.JS expected value, not + * in proj4j. 6491218.13 is neither the +R_A nor the ellipsoidal answer, and the + * northing error (27,845 m) is 20,000× the easting error (0.0018 m) — the signature of a wrong + * reference value, not of a wrong radius. + */ @Test public void testR_A() { - // from proj4.js - result is out by 50,000 m - //EPSG:54003 + // ESRI:54003-alike String prj = "+proj=mill +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R_A +ellps=WGS84 +datum=WGS84 +units=m +no_defs"; - checkTransformFromGeo(prj, 11.0, 53.0, 1223145.57, 6491218.13, 50000); + checkTransformFromGeo(prj, 11.0, 53.0, 1223145.571759001, 6519063.378708010, 1.0e-6); } + /** + * +towgs84. Was tolerance 100 m with the comment "result is out by 100 m". + *

+ * The test was calling the wrong helper. Its expected value (450055.70, 5262356.33) is the + * WGS84-sourced answer, i.e. the one that does apply the datum shift, but it was + * passed to {@code checkTransformFromGeo}, whose source is the target's own geographic CRS — so + * no shift is applied and +towgs84 was never exercised at all. The 100 m tolerance + * was the size of the missing datum shift (55.70 m E, 57.58 m N). + *

+ * Switched to {@code checkTransformFromWGS84}, which is what the method name always claimed. + * proj4j then matches PROJ 9.8.1 to 1e-6 m in both configurations: + *

+     *   fromWGS84  proj4j 450055.697319183  5262356.325308706
+     *              cs2cs  450055.697319185  5262356.325307687
+     *   fromGeo    proj4j 449999.999999749  5262298.750218449
+     *              cs2cs  449999.999999751  5262298.750217431
+     * 
+ * (The same-datum row is already asserted at 0.1 m by + * {@link CoordinateTransformTest#testPROJ4()}.) + */ @Test public void testTowgs84() { - //# MGI / M31 - //<31285> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=450000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs <> - // from proj4.js - result is out by 100 m - checkTransformFromGeo("EPSG:31285", 13.33333333333, 47.5, 450055.70, 5262356.33, 100); + // <31285> MGI / M31, +datum=hermannskogel (7-param towgs84 577.326,90.129,463.919,...) + checkTransformFromWGS84("EPSG:31285", 13.33333333333, 47.5, + 450055.697319185, 5262356.325307687, 1.0e-5); } + /** + * +south. Was tolerance 200 m on the second row, with the comment + * "result is out by 200 m". + *

+ * It is out by nothing. proj4j is bit-identical to PROJ 9.8.1 on all three rows below (the + * largest disagreement is 1e-9 m). The old expected value 603933.40, 7677505.64 is a Proj4.JS + * literal that is itself 158.754 m from PROJ's answer in northing. + */ @Test public void testSouth() { - // <2736> +proj=utm +zone=36 +south +ellps=clrk66 +units=m +no_defs <> - //from spatialreference.org - checkTransformFromGeo("EPSG:2736", 33.115, -19.14, 512093.765437, 7883804.406911, 0.000001); - // from proj4.js - result is out by 200 m - checkTransformFromGeo("EPSG:2736", 34.0, -21.0, 603933.40, 7677505.64, 200); - } + // <2736> +proj=utm +zone=36 +south +ellps=clrk66 +towgs84=-80,-100,-228,0,0,0,0 + // cs2cs: 512093.765436531 7883804.406910769 + checkTransformFromGeo("EPSG:2736", 33.115, -19.14, 512093.765436531, 7883804.406910769, 1.0e-6); - @Test - public void testLambertEqualArea() { - checkTransformFromGeo("EPSG:3035", 11.0, 53.0, 4388138.60, 3321736.46, 0.005); //laea - checkTransformFromGeo("EPSG:3573", 9.84375, 61.875, 2923052.02009, 1054885.46559); + // cs2cs: 603934.388709571 7677664.393970920 (same-datum; was asserted as 603933.40, 7677505.64) + checkTransformFromGeo("EPSG:2736", 34.0, -21.0, 603934.388709571, 7677664.393970920, 1.0e-6); + + // and through the datum shift, which the old test never reached. + // cs2cs: 603973.158165756 7677761.994978547 + checkTransformFromWGS84("EPSG:2736", 34.0, -21.0, 603973.158165756, 7677761.994978547, 1.0e-6); } @Test - public void testSwissObliqueMercator() { - // from proj4.js - checkTransformFromGeo("EPSG:21781", 8.23, 46.82, 660389.52, 185731.63, 200); + public void testLambertEqualArea() { + // cs2cs: 4388138.600454633 3321736.463013414 + checkTransformFromGeo("EPSG:3035", 11.0, 53.0, 4388138.600454633, 3321736.463013414, 1.0e-6); + // cs2cs: 2923052.020092619 1054885.465592114 + checkTransformFromGeo("EPSG:3573", 9.84375, 61.875, 2923052.020092619, 1054885.465592114, 1.0e-7); } + // testSwissObliqueMercator deleted. + // + // It asserted EPSG:21781 at (8.23, 46.82) -> 660389.52, 185731.63 with a 200 m tolerance, while + // CoordinateTransformTest.testSwissObliqueMercator asserts 660309.34, 185586.30 for the same + // input at 0.1 m. cs2cs 9.8.1 settles it: + // + // longlat+bessel -> somerc (what checkTransformFromGeo does): 660309.341946539 185586.295802115 + // EPSG:4326 -> EPSG:21781 (i.e. with the datum shift): 660389.515487420 185731.630395966 + // + // proj4j's same-datum answer is 660309.341946539, 185586.295802122 -- bit-identical to PROJ. So + // CoordinateTransformTest's expected value is correct and this one was the WGS84-sourced value + // fed to a same-datum helper, exactly as in testTowgs84 above. The 145.33 m northing gap between + // the two "expected" values is the size of the +towgs84=674.374,15.056,405.346 shift. + // The surviving test in CoordinateTransformTest covers the projection; testTowgs84 above covers + // the shift. } diff --git a/core/src/test/java/org/locationtech/proj4j/MetaCRSTest.java b/core/src/test/java/org/locationtech/proj4j/MetaCRSTest.java index c322174..670458d 100755 --- a/core/src/test/java/org/locationtech/proj4j/MetaCRSTest.java +++ b/core/src/test/java/org/locationtech/proj4j/MetaCRSTest.java @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.List; import org.junit.Assert; @@ -34,15 +35,11 @@ public class MetaCRSTest { private static CRSFactory csFactory = new CRSFactory(); - @Test - public void xtestMetaCRSExample() throws IOException { - File file = getFile("TestData.csv"); - MetaCRSTestFileReader reader = new MetaCRSTestFileReader(file); - List tests = reader.readTests(); - for (MetaCRSTestCase test : tests) { - Assert.assertTrue(runTest(test)); - } - } + // Removed: xtestMetaCRSExample. It read TestData.csv, which held exactly one row + // (EPSG:4326 -> EPSG:2227) that strictly duplicated ExampleTest.testTransformToGeographic and the + // first assertion of CoordinateTransformTest.testLambertConformalConic. Both the method and the CSV + // are gone. Note the method DID run despite the misleading "x" prefix, so this is a deletion of live + // coverage - verified redundant before removal. @Test public void testPROJ4_SPCS() throws IOException { @@ -54,21 +51,446 @@ public void testPROJ4_SPCS() throws IOException { } } + /** + * Runs every row of {@code proj4-epsg.csv} and checks it against the expectation recorded in that + * row's {@code testMethod} column. + * + *

Three deliberate properties of this method: + * + *

    + *
  • It collects every mismatch and reports them together. It used to assert inside the + * loop, so a run aborted on the first bad row and told you "1 failure" whether 1 row or 1,000 + * had regressed. With 4,280 rows that made the test almost useless for diagnosis. + *
  • A row marked {@code failing}/{@code error} that now PASSES is also reported. That is + * not pedantry: this file is a record of proj4j's behaviour, and a fix landing without the row + * being reclassified means the record silently overstates how much is still broken. The + * {@code assertFalse} this replaces made such a fix look like a test failure with no + * indication that it was good news. + *
  • A row marked {@code refuses} or {@code refuses:}CAUSE is checked against the + * refusal itself, not against "did not pass". 411 rows carry that verdict since the + * file was regenerated against PROJ 9.8.1; see + * {@link org.locationtech.proj4j.io.MetaCRSTestCase} for why the verdict lives in + * column 1 rather than in a twentieth column. + *
+ * + *

Expected state: green. 0 regressed, 0 unexpected passes, 0 wrong refusals + * over 4,280 rows. It read 1,308 regressed, 4 unexpected passes until the file was + * regenerated. + * + *

What the file now records, and where each number came from

+ * + * + * + * + * + * + * + * + * + * + *
proj4-epsg.csv after the 9.8.1 regeneration
rowscolumn 1source of the expectation
3,869{@code passing}898 coordinates re-pinned from {@code cs2cs} 9.8.1 fed the dictionary strings + * Proj4J itself reads; the other 2,971 kept their original auto-generated values, + * which still hold, and are therefore unmoved evidence rather than rewritten + * evidence
148{@code refuses:COORDINATE_OUTSIDE_GRID}all {@code +datum=NAD27}; {@code cs2cs} refuses all 148 at the operator layer + * ({@code nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat}, verbatim from + * {@code 9.8.1:src/datums.cpp}) with "Coordinate to transform falls outside + * grid"; 17 of them PROJ also refuses at the CRS layer
263{@code refuses:COORDINATE_OUT_OF_DOMAIN}{@code cs2cs} prints {@code * * inf} on all 263 at the CRS layer
+ * + *

No expectation in this file comes from Proj4J's own output. Over all 3,869 + * answering rows Proj4J and {@code cs2cs} 9.8.1 agree to 1e-12 relative or better, 4,515 of + * the 7,738 ordinates bit-for-bit — so the reference is a measurement, and the file + * would have caught a disagreement rather than absorbing it. + * + *

{@link MetaCrsRefusalCensusTest} pins the 2×2 against PROJ independently, and + * {@link #everyRowAssertsSomethingThatCanFail()} is this file's non-vacuity control. + */ @Test public void testPROJ4_Empirical() throws IOException { File file = getFile("proj4-epsg.csv"); MetaCRSTestFileReader reader = new MetaCRSTestFileReader(file); List tests = reader.readTests(); - for (MetaCRSTestCase test : tests) { - boolean testResult = runTest(test); - String testMethod = test.getTestMethod(); - if (testMethod.equals(MetaCRSTestCase.PASSING)) { - Assert.assertTrue(testResult); + List regressed = new ArrayList(); // expected to pass, did not + List unexpectedPass = new ArrayList(); // expected to fail, now passes + List wrongRefusal = new ArrayList(); // refuses[:CAUSE] not satisfied + + for (MetaCRSTestCase test : tests) { + MetaCRSTestCase.Result result = test.evaluate(csFactory); + String mismatch = test.verdictMismatch(result); + if (mismatch == null) { + continue; + } + String verdict = test.getTestMethod(); + if (MetaCRSTestCase.isRefusalVerdict(verdict)) { + wrongRefusal.add(describe(test) + " -- " + mismatch); + } else if (MetaCRSTestCase.PASSING.equals(verdict)) { + regressed.add(describe(test)); } else { - Assert.assertFalse(testResult); + unexpectedPass.add(describe(test) + " [recorded as " + verdict + "]"); } } + + if (!regressed.isEmpty() || !unexpectedPass.isEmpty() || !wrongRefusal.isEmpty()) { + StringBuilder msg = new StringBuilder(); + msg.append(tests.size()).append(" rows: ") + .append(regressed.size()).append(" regressed, ") + .append(unexpectedPass.size()).append(" now passing unexpectedly, ") + .append(wrongRefusal.size()).append(" refused wrongly.\n"); + appendAll(msg, "REGRESSED (recorded as passing, now fails)", regressed); + appendAll(msg, "UNEXPECTED PASS (reclassify these rows in proj4-epsg.csv)", unexpectedPass); + appendAll(msg, "WRONG REFUSAL (recorded as refuses[:CAUSE], did something else)", + wrongRefusal); + Assert.fail(msg.toString()); + } + } + + // ------------------------------------------------------ the file's own non-vacuity control + + /** Rows in {@code proj4-epsg.csv}, and the split the regeneration produced. */ + private static final int EXPECTED_ROWS = 4280; + private static final int EXPECTED_ANSWERING_ROWS = 3869; + private static final int EXPECTED_REFUSAL_ROWS = 411; + + /** + * Every one of the 4,280 rows is perturbed and must be noticed. + * + *

{@link #testPROJ4_Empirical()} going green says the file agrees with Proj4J. It does not + * say the file constrains Proj4J, and after a regeneration that is exactly the doubt + * worth answering: a re-pinned coordinate that no longer discriminates, or a + * {@code refuses:}CAUSE that any outcome satisfies, is a row that has stopped being a + * test while still being counted as one. + * + *

Three perturbations, applied to the rows as committed rather than to synthetic ones: + * + *

    + *
  • A re-pinned coordinate is pinned to its own tolerance. Every {@code passing} + * row is re-run with {@code tgtOrd1} moved by four times that row's own + * tolerance — not a fixed distance, because the tolerances here span 1e-6 + * degrees to 1.0 m — and the moved row must fail. A row that survives this is + * asserting nothing about its easting.
  • + *
  • A returned coordinate does not satisfy a refusal verdict. Checked on the 3,869 + * rows that really do return one, which is the population a fail-open revert would + * enlarge.
  • + *
  • The wrong cause does not satisfy a refusal verdict. Each of the 411 refusing + * rows is checked against the other cause the file uses, so + * {@code refuses:COORDINATE_OUTSIDE_GRID} cannot be quietly satisfied by an + * out-of-domain refusal or vice versa.
  • + *
+ * + *

The counts are asserted too: a perturbation loop that walked zero rows would otherwise + * pass loudest of all. + */ + @Test + public void everyRowAssertsSomethingThatCanFail() throws IOException { + List tests = + new MetaCRSTestFileReader(getFile("proj4-epsg.csv")).readTests(); + Assert.assertEquals("row count", EXPECTED_ROWS, tests.size()); + + List vacuous = new ArrayList(); + int answering = 0; + int refusing = 0; + + for (MetaCRSTestCase test : tests) { + MetaCRSTestCase.Result result = test.evaluate(csFactory); + String verdict = test.getTestMethod(); + + if (MetaCRSTestCase.isRefusalVerdict(verdict)) { + refusing++; + ErrorCause required = MetaCRSTestCase.requiredCause(verdict); + Assert.assertNotNull("every refusal verdict in this file must pin a cause, but " + + describe(test) + " is a bare '" + verdict + "'", required); + String other = "refuses:" + otherCause(required); + if (MetaCRSTestCase.verdictMismatch(other, result) == null) { + vacuous.add(describe(test) + ": '" + verdict + "' is also satisfied by '" + + other + "', so the cause is not pinned"); + } + continue; + } + + answering++; + // 1. the refusal verdict must NOT be satisfiable by this row's returned coordinate + if (MetaCRSTestCase.verdictMismatch("refuses:" + ErrorCause.COORDINATE_OUTSIDE_GRID, + result) == null) { + vacuous.add(describe(test) + ": a returned coordinate satisfied a refusal verdict"); + } + // 2. move the expected easting by four of this row's own tolerances; it must fail + MetaCRSTestCase moved = withEastingMoved(test); + if (moved.verdictMismatch(moved.evaluate(csFactory)) == null) { + vacuous.add(describe(test) + ": expected easting " + + test.getTargetCoordinate().x + " moved by 4 x " + + test.getTolerance().x + " and the row still passed"); + } + } + + Assert.assertEquals("rows whose expectation nothing could violate: " + vacuous, + 0, vacuous.size()); + Assert.assertEquals("rows that answer", EXPECTED_ANSWERING_ROWS, answering); + Assert.assertEquals("rows that refuse", EXPECTED_REFUSAL_ROWS, refusing); + } + + /** + * The self-test for the perturbation leg above. A loop that displaces every expectation + * and finds no vacuous row is only worth reading if the displacement is what produces the + * verdict. Here the same real row — {@code EPSG:4326 -> EPSG:2000}, whose easting this + * regeneration re-pinned from {@code cs2cs} 9.8.1 — is run at 0, 4 and again at 0 + * tolerances of displacement, and only the middle one may fail. + * + *

It also pins the re-pin itself: the row's committed expectation is 9.8.1's + * {@code 9523653.022922918}, and the value the file carried before, {@code 9413505.328467}, + * is what {@code cs2cs 9.8.1 +approx} prints — 110 km away and far outside the row's + * 0.1 m tolerance. So the row discriminates between the two transverse-Mercator series, which + * is the change it was re-pinned for. + */ + @Test + public void theNonVacuityControlCanItselfFail() throws IOException { + MetaCRSTestCase row = rowFor("2000"); + Assert.assertEquals("this control needs the row the regeneration re-pinned", + 9523653.022923, row.getTargetCoordinate().x, 1e-6); + Assert.assertEquals(0.1, row.getTolerance().x, 0.0); + + Assert.assertNull("undisplaced, the committed row must pass", + row.verdictMismatch(row.evaluate(csFactory))); + + MetaCRSTestCase moved = withEastingMoved(row); + Assert.assertNotNull("displaced by 4 tolerances, it must fail", + moved.verdictMismatch(moved.evaluate(csFactory))); + + // ...and the pre-9.8.1 value this row was re-pinned away from must fail too, so the row + // is a live discriminator between the two tmerc series rather than a value that happens + // to sit inside a wide tolerance. + MetaCRSTestCase approx = withEasting(row, 9413505.328467); + Assert.assertNotNull("the +approx easting must not satisfy the re-pinned row", + approx.verdictMismatch(approx.evaluate(csFactory))); + } + + private MetaCRSTestCase rowFor(String targetCode) throws IOException { + List tests = + new MetaCRSTestFileReader(getFile("proj4-epsg.csv")).readTests(); + for (MetaCRSTestCase test : tests) { + if (("EPSG:" + targetCode).equals(test.getTargetCrsName())) { + return test; + } + } + throw new AssertionError("EPSG:" + targetCode + " is not in the file"); + } + + /** The other cause the regenerated file uses, so the two are checked against each other. */ + private static ErrorCause otherCause(ErrorCause cause) { + return cause == ErrorCause.COORDINATE_OUTSIDE_GRID + ? ErrorCause.COORDINATE_OUT_OF_DOMAIN + : ErrorCause.COORDINATE_OUTSIDE_GRID; + } + + /** + * The same row with {@code tgtOrd1} displaced by four of its own tolerances. + * + *

Four rather than one: a passing row has {@code |result - expected| <= tol}, so a + * displacement of 4 tol puts the residual in {@code [3 tol, 5 tol]} and cannot land back + * inside tolerance even at the boundary. + */ + private static MetaCRSTestCase withEastingMoved(MetaCRSTestCase row) { + return withEasting(row, row.getTargetCoordinate().x + 4.0 * row.getTolerance().x); + } + + /** The same row with a chosen {@code tgtOrd1} and the verdict forced to {@code passing}. */ + private static MetaCRSTestCase withEasting(MetaCRSTestCase row, double easting) { + ProjCoordinate src = row.getSourceCoordinate(); + ProjCoordinate tgt = row.getTargetCoordinate(); + ProjCoordinate tol = row.getTolerance(); + return new MetaCRSTestCase(row.getName(), MetaCRSTestCase.PASSING, + authOf(row.getSourceCrsName()), codeOf(row.getSourceCrsName()), + authOf(row.getTargetCrsName()), codeOf(row.getTargetCrsName()), + src.x, src.y, src.z, + easting, tgt.y, tgt.z, + tol.x, tol.y, tol.z, + "", "", "", ""); + } + + private static String authOf(String name) { + return name.substring(0, name.indexOf(':')); + } + + private static String codeOf(String name) { + return name.substring(name.indexOf(':') + 1); + } + + // ------------------------------------------------------------- verdict semantics, proven + + /** + * Builds a case that is {@code proj4-epsg.csv}'s own probe — WGS 84 at + * (1°E, 1°S), in the Gulf of Guinea — with a chosen target and verdict, so the + * tests below exercise a real transform rather than a mock outcome. + * + * @param target the EPSG code of the target CRS + * @param testMethod the verdict to check against + * @return a case identical in shape to a CSV row + */ + private static MetaCRSTestCase probe(String target, String testMethod) { + // The expected coordinate and 1e-6 tolerances are the file's own for EPSG:3819; they matter + // only where in-tolerance is being distinguished from out-of-tolerance. + return new MetaCRSTestCase("probe", testMethod, "EPSG", "4326", "EPSG", target, + 1.0, -1.0, 0.0, + 0.998744, -1.005575, 173.165791, + 0.000001, 0.000001, 0.000001, + "", "", "", ""); + } + + /** {@code EPSG:3819}: answers, and within the CSV's own expected coordinate and tolerance. */ + private static final String ANSWERS = "3819"; + + /** {@code EPSG:4267} is {@code +datum=NAD27}: no shipped grid reaches (1, -1). */ + private static final String REFUSES_OUTSIDE_GRID = "4267"; + + /** {@code EPSG:2020} is a {@code tmerc} whose central meridian is 83.5° away. */ + private static final String REFUSES_OUT_OF_DOMAIN = "2020"; + + /** + * The control that makes {@code refuses:} worth having. A verdict meaning merely "did + * not pass" is satisfied by a returned coordinate; this one must not be. + * + *

{@code EPSG:4326 -> EPSG:3819} answers within tolerance at (1, -1), so it is exactly the + * shape a fail-open revert would produce on a row a regenerated file marks + * {@code refuses:COORDINATE_OUTSIDE_GRID}. + */ + @Test + public void aRefusalVerdictIsNotSatisfiedByAReturnedCoordinate() { + MetaCRSTestCase row = probe(ANSWERS, "refuses:COORDINATE_OUTSIDE_GRID"); + MetaCRSTestCase.Result result = row.evaluate(csFactory); + Assert.assertEquals("the control needs a row that really does answer", + MetaCRSTestCase.Outcome.IN_TOLERANCE, result.outcome()); + + String mismatch = row.verdictMismatch(result); + Assert.assertNotNull("a returned coordinate must not satisfy a refusal verdict", mismatch); + Assert.assertTrue("and the report must say what came back instead: " + mismatch, + mismatch.contains("must refuse") && mismatch.contains("returned (")); + } + + /** + * The second control: the wrong reason is a failure too. Without it, {@code refuses:} + * would be an elaborate spelling of {@code refuses}, and a row could go on asserting "outside + * grid" while the library had started refusing it for an unrelated numerical reason. + */ + @Test + public void aRefusalVerdictIsNotSatisfiedByTheWrongErrorCause() { + MetaCRSTestCase row = probe(REFUSES_OUT_OF_DOMAIN, "refuses:COORDINATE_OUTSIDE_GRID"); + MetaCRSTestCase.Result result = row.evaluate(csFactory); + Assert.assertEquals(MetaCRSTestCase.Outcome.REFUSED, result.outcome()); + Assert.assertEquals("the control needs a row that refuses for a DIFFERENT reason", + ErrorCause.COORDINATE_OUT_OF_DOMAIN, result.cause()); + + String mismatch = row.verdictMismatch(result); + Assert.assertNotNull("a refusal with the wrong cause must not satisfy the verdict", + mismatch); + Assert.assertTrue("and the report must name both causes: " + mismatch, + mismatch.contains("COORDINATE_OUTSIDE_GRID") + && mismatch.contains("COORDINATE_OUT_OF_DOMAIN")); + + // The discriminating half: the same outcome DOES satisfy the matching verdict and the bare + // form, so the two assertions above are not simply "refuses never passes". + Assert.assertNull(MetaCRSTestCase.verdictMismatch("refuses:COORDINATE_OUT_OF_DOMAIN", + result)); + Assert.assertNull(MetaCRSTestCase.verdictMismatch("refuses", result)); + } + + /** + * The positive leg, on the row the census says is the reason this verdict exists. + * {@code EPSG:4326 -> EPSG:4267} refuses with {@link ErrorCause#COORDINATE_OUTSIDE_GRID}, and + * that is what a regenerated file should record for it. + * + *

The last two assertions are the whole argument in four lines: {@code failing} is + * satisfied by this refusal and would be satisfied by a wrong coordinate, so + * downgrading the row to {@code failing} would assert neither. + */ + @Test + public void aRefusalVerdictIsSatisfiedByTheRightRefusal() { + MetaCRSTestCase row = probe(REFUSES_OUTSIDE_GRID, "refuses:COORDINATE_OUTSIDE_GRID"); + MetaCRSTestCase.Result result = row.evaluate(csFactory); + Assert.assertEquals(MetaCRSTestCase.Outcome.REFUSED, result.outcome()); + Assert.assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, result.cause()); + Assert.assertNull(row.verdictMismatch(result)); + + Assert.assertNull("'failing' accepts this refusal...", + MetaCRSTestCase.verdictMismatch("failing", result)); + MetaCRSTestCase.Result outOfTolerance = new MetaCRSTestCase("probe", "failing", + "EPSG", "4326", "EPSG", ANSWERS, 1.0, -1.0, 0.0, + 0.0, 0.0, 0.0, 0.000001, 0.000001, 0.000001, "", "", "", "") + .evaluate(csFactory); + Assert.assertEquals(MetaCRSTestCase.Outcome.OUT_OF_TOLERANCE, outOfTolerance.outcome()); + Assert.assertNull("...and accepts a wrong coordinate identically. That is the conflation.", + MetaCRSTestCase.verdictMismatch("failing", outOfTolerance)); + } + + /** + * The strict-superset proof, as a table. Every legacy verdict against every outcome + * must give the answer the previous runner gave: {@code passing} iff in tolerance, everything + * else iff not in tolerance. The three outcomes are produced by the library, not constructed. + */ + @Test + public void theThreeLegacyVerdictsKeepTheirExactMeaning() { + MetaCRSTestCase.Result inTolerance = probe(ANSWERS, "passing").evaluate(csFactory); + MetaCRSTestCase.Result refused = + probe(REFUSES_OUTSIDE_GRID, "passing").evaluate(csFactory); + MetaCRSTestCase.Result outOfTolerance = new MetaCRSTestCase("probe", "passing", + "EPSG", "4326", "EPSG", ANSWERS, 1.0, -1.0, 0.0, + 0.0, 0.0, 0.0, 0.000001, 0.000001, 0.000001, "", "", "", "") + .evaluate(csFactory); + + Assert.assertEquals(MetaCRSTestCase.Outcome.IN_TOLERANCE, inTolerance.outcome()); + Assert.assertEquals(MetaCRSTestCase.Outcome.REFUSED, refused.outcome()); + Assert.assertEquals("the table needs all three outcomes to be reachable", + MetaCRSTestCase.Outcome.OUT_OF_TOLERANCE, outOfTolerance.outcome()); + + for (String verdict : new String[]{"failing", "error", "", "typo", "PASSING"}) { + Assert.assertNotNull(verdict + " must reject an in-tolerance answer", + MetaCRSTestCase.verdictMismatch(verdict, inTolerance)); + Assert.assertNull(verdict + " must accept an out-of-tolerance answer", + MetaCRSTestCase.verdictMismatch(verdict, outOfTolerance)); + Assert.assertNull(verdict + " must accept a refusal", + MetaCRSTestCase.verdictMismatch(verdict, refused)); + } + Assert.assertNull(MetaCRSTestCase.verdictMismatch("passing", inTolerance)); + Assert.assertNotNull(MetaCRSTestCase.verdictMismatch("passing", outOfTolerance)); + Assert.assertNotNull(MetaCRSTestCase.verdictMismatch("passing", refused)); + } + + /** + * A verdict naming a cause that does not exist is a malformed row, not a row that quietly + * never matches. Rejected at check time so a typo in a regenerated file is loud rather than + * vacuous. + */ + @Test + public void aRefusalVerdictNamingAnUnknownCauseIsRejected() { + MetaCRSTestCase row = probe(REFUSES_OUTSIDE_GRID, "refuses:COORDINATE_OUTSIDE_GRIDS"); + MetaCRSTestCase.Result result = row.evaluate(csFactory); + try { + row.verdictMismatch(result); + Assert.fail("a verdict naming a non-existent ErrorCause must be rejected, not treated " + + "as an assertion nothing can satisfy"); + } catch (IllegalArgumentException expected) { + Assert.assertTrue(expected.getMessage(), + expected.getMessage().contains("COORDINATE_OUTSIDE_GRIDS")); + } + // ...and the correctly spelled one is accepted, so this is not rejecting everything. + Assert.assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, + MetaCRSTestCase.requiredCause("refuses:COORDINATE_OUTSIDE_GRID")); + Assert.assertNull("a bare 'refuses' pins no cause", + MetaCRSTestCase.requiredCause("refuses")); + Assert.assertNull("and a legacy verdict pins none either", + MetaCRSTestCase.requiredCause("failing")); + } + + private static void appendAll(StringBuilder msg, String heading, List rows) { + if (rows.isEmpty()) { + return; + } + msg.append("\n").append(heading).append(" (").append(rows.size()).append("):\n"); + for (String row : rows) { + msg.append(" ").append(row).append("\n"); + } + } + + private static String describe(MetaCRSTestCase test) { + return test.getSourceCrsName() + " -> " + test.getTargetCrsName(); } File getFile(String name) { @@ -82,14 +504,13 @@ File getFile(String name) { } boolean runTest(MetaCRSTestCase crsTest) { - boolean returnCode = false; try { - returnCode = crsTest.execute(csFactory); - crsTest.print(System.out); + // Deliberately silent: this runs 4,280 times and used to print every row plus every + // exception to stdout on a green build. Failures are reported once, in aggregate, by the + // caller. + return crsTest.execute(csFactory); } catch (Proj4jException ex) { - System.out.println(ex); + return false; } - - return returnCode; } } diff --git a/core/src/test/java/org/locationtech/proj4j/MetaCrsRefusalCensusTest.java b/core/src/test/java/org/locationtech/proj4j/MetaCrsRefusalCensusTest.java new file mode 100644 index 0000000..bb57050 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/MetaCrsRefusalCensusTest.java @@ -0,0 +1,631 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.io.MetaCRSTestCase; +import org.locationtech.proj4j.io.MetaCRSTestFileReader; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Every row of {@code proj4-epsg.csv}, cross-tabulated: does Proj4J answer or refuse, and does + * PROJ 9.8.1 answer or refuse? + * + *

What this measures, and why a count rather than a coordinate

+ * + *

{@link MetaCRSTest#testPROJ4_Empirical()} asks whether each row hits its recorded + * coordinate. It cannot ask the prior question — should there be a coordinate at + * all? — because {@code failing} means both "wrong number" and "correctly refused". + * This class asks only that prior question, over all 4,280 rows at once, and answers it against + * PROJ. + * + *

The whole file is one probe: every row transforms WGS 84 at (1°E, 1°S) into a + * different target CRS, one row per target, 4,280 distinct EPSG codes and no duplicates. That + * point is in the Gulf of Guinea, so most targets are being exercised thousands of kilometres + * outside their area of use — which is why the file is a good refusal census and a poor + * accuracy census. + * + *

The measurement

+ * + * + * + * + * + * + *
4,280 rows, Proj4J in this working tree vs {@code cs2cs} 9.8.1
PROJ answersPROJ refuses ({@code * * inf})
Proj4J answers3,8690
Proj4J refuses131280
+ * + *

By Proj4J's own {@link ErrorCause}, the 411 refusals are + * 148 {@link ErrorCause#COORDINATE_OUTSIDE_GRID} and + * 263 {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}, and the 148 split + * 131 + 17 across the two right-hand cells. All 148 are {@code +datum=NAD27}. + * + *

How the PROJ column was taken

+ * + *

{@code cs2cs} Rel. 9.8.1, April 10th, 2026, one invocation per distinct target + * definition (3,359 of them), fed the strings Proj4J itself reads out of + * {@code proj4j-epsg}'s {@code proj4/nad/epsg} dictionary — never a bare {@code EPSG:} + * code on the command line. That distinction is the difference between a measurement and a + * category error: + * {@code cs2cs} resolves codes through {@code proj.db} while Proj4J resolves them through an + * EPSG v9.2-era init dictionary, and comparing the two resolutions compares two different CRSs. + * + *

+ * echo "1.0 -1.0" | cs2cs -f "%.10f" +proj=longlat +datum=WGS84 +no_defs \
+ *                          +to <the target's dictionary string>
+ * 
+ * + *

A line beginning with an asterisk (PROJ prints an asterisk, a tab, then {@code * inf}) is a + * refusal; anything else is an answer. The result is pinned here as {@link #PROJ_REFUSES}, + * a list of target codes, and no test in this repository shells out to {@code cs2cs}. + * + *

The 131, which are a layer difference and not a defect

+ * + *

All 131 are {@code +datum=NAD27} and all 131 are + * {@link ErrorCause#COORDINATE_OUTSIDE_GRID}. Proj4J's legacy {@code +datum=}/{@code +nadgrids=} + * path is PROJ's operator path, and at the operator level PROJ agrees: + * {@code cct +proj=hgridshift +grids=conus} at a point no grid covers reports + * {@code TRANSFORMATION ERROR (Coordinate to transform falls outside grid)}. At the CRS + * level, with {@code proj.db} present, PROJ's operation factory notices the point is outside + * NADCON's area of use and selects "Ballpark geographic offset" — a + * declared no-op with a published accuracy, not a silent one. Proj4J has no such factory, + * so it occupies the operator layer and refusing is faithful to that layer. Both statements are + * true at once; neither is licence to return an undeclared coordinate. + * + *

What each cell defends

+ * + *
    + *
  • (Proj4J answers, PROJ refuses) = 0 is the fail-open statement: nowhere does Proj4J + * invent a coordinate PROJ declines to produce. It is not the guard on the grid fix. + * Measured: with {@code Grid.shift}'s {@code throw outsideGrid(...)} short-circuited, this + * cell is still 0, because on 131 of those rows PROJ answers too and on the other + * 17 the projection's own domain guard refuses downstream. Claiming this cell guards the + * grid fix would have been exactly the kind of assertion that reports a guarantee it never + * evaluates.
  • + *
  • (Proj4J refuses, PROJ answers) = 131, every one COORDINATE_OUTSIDE_GRID is the + * guard on the grid fix, and it is checked by cause, not merely by count.
  • + *
  • 148 / 263 by cause pins which mechanism refused, so a refusal that migrated from + * one guard to another cannot hide inside a stable total.
  • + *
+ * + *

The positive control, measured rather than asserted

+ * + *

{@code Grid.shift}'s {@code throw outsideGrid(...)} was short-circuited in a scratch copy of + * the tree — restoring the 1.4.3 fail-open — and the whole census re-run: + * + * + * + * + * + * + * + * + * + *
census with the grid fail-open restored
fail-closed (this tree)fail-open (1.4.3 behaviour)
rows answered3,8694,000
rows refused411280
{@code COORDINATE_OUTSIDE_GRID}1480
{@code COORDINATE_OUT_OF_DOMAIN}263280
(refuses, PROJ answers)1310
+ * + *

Five of the pinned numbers move, so the census fails five ways on a revert. The 17-row + * difference between 148 and 131 is not slack: those 17 are {@code +proj=tmerc} zones roughly + * 88° from their central meridian, so with the grid guard removed they are refused by the + * projection instead — which is why 263 becomes 280 and not 411. + * + *

{@link #theCensusDetectsAWrongCount()} and {@link #thePinnedProjColumnIsActuallyRead()} are + * the in-repo halves of that control: they perturb the expectation and the pinned data + * respectively and require the comparison to notice. + * + * @see MetaCRSTest for the per-row coordinate check and the {@code refuses} verdict it enforces + * @see org.locationtech.proj4j.grids.OutsideGridFailsClosedTest for the operator-level fix itself + */ +public class MetaCrsRefusalCensusTest { + + // ------------------------------------------------------------------ the pinned expectation + + /** Rows in {@code proj4-epsg.csv}. */ + private static final int EXPECTED_ROWS = 4280; + + /** Proj4J returns a coordinate and {@code cs2cs} 9.8.1 returns a coordinate. */ + private static final int EXPECTED_BOTH_ANSWER = 3869; + + /** + * Proj4J returns a coordinate and {@code cs2cs} 9.8.1 prints {@code * * inf}. + * + *

Zero, and what that does and does not prove

+ * + *

Nowhere does Proj4J invent a coordinate PROJ declines to produce. See the class javadoc: + * this cell is 0 under the 1.4.3 fail-open as well, so it is a standing fail-open statement + * rather than the guard on the grid fix. + */ + private static final int EXPECTED_PROJ4J_ANSWERS_PROJ_REFUSES = 0; + + /** + * Proj4J refuses and {@code cs2cs} 9.8.1 answers: the declared-ballpark divergence. + * + *

The guard on the grid fix

+ * + *

Every one of these is {@code +datum=NAD27} and + * {@link ErrorCause#COORDINATE_OUTSIDE_GRID}; with the fail-open restored this cell measures + * 0. + */ + private static final int EXPECTED_PROJ4J_REFUSES_PROJ_ANSWERS = 131; + + /** + * Both refuse. Proj4J's reasons: 263 out-of-domain, plus the 17 outside-grid rows PROJ + * refuses too. + */ + private static final int EXPECTED_BOTH_REFUSE = 280; + + /** Refusals attributed to the grid guard closed in Stage 9. */ + private static final int EXPECTED_OUTSIDE_GRID = 148; + + /** Refusals attributed to a projection's own domain guard. */ + private static final int EXPECTED_OUT_OF_DOMAIN = 263; + + /** The one source CRS every row uses. */ + private static final String SOURCE = "EPSG:4326"; + + /** The one probe every row uses, and the point the pinned PROJ column was measured at. */ + private static final double PROBE_X = 1.0; + private static final double PROBE_Y = -1.0; + + /** + * The target EPSG codes for which {@code cs2cs} 9.8.1 refuses the probe. + * + *

Pinned, not computed

+ * + *

280 codes, sorted. This is the only PROJ-derived data in the class and nothing here runs + * {@code cs2cs}. It is keyed by target code because the file has exactly one row per target + * and no duplicates — {@link #theFileIsStillTheProbeThisPinWasMeasuredAgainst()} checks + * that, because the pin is void the moment the file stops being that probe. + */ + private static final int[] PROJ_REFUSES = { + 2020, 2021, 2022, 2023, 2236, 2237, 2239, 2240, 2244, 2245, 2254, 2352, 2354, 2373, + 2375, 2404, 2406, 2425, 2427, 2544, 2546, 2604, 2606, 2662, 2664, 2720, 2722, 2759, + 2760, 2777, 2778, 2780, 2781, 2790, 2792, 2793, 2813, 2881, 2882, 2884, 2885, 2889, + 2890, 2899, 2965, 2966, 2967, 2968, 3106, 3435, 3443, 3465, 3466, 3511, 3512, 3516, + 3517, 3518, 3519, 3520, 3521, 3528, 3529, 3532, 3533, 3534, 3535, 3597, 3598, 4516, + 4518, 4537, 4539, 4655, 4766, 4785, 4787, 5266, 5292, 5293, 5294, 5295, 5296, 5299, + 5301, 5303, 5304, 5305, 5307, 5308, 5309, 5311, 5367, 5466, 5589, 5623, 5624, 5625, + 6355, 6356, 6437, 6438, 6442, 6443, 6444, 6445, 6446, 6447, 6454, 6455, 6458, 6459, + 6460, 6461, 6506, 6507, 7261, 7262, 7263, 7264, 7265, 7266, 7267, 7268, 7269, 7270, + 7271, 7272, 7273, 7274, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7283, 7284, + 7287, 7288, 7291, 7292, 7293, 7294, 7297, 7298, 7299, 7300, 7301, 7302, 7303, 7304, + 7305, 7306, 7307, 7308, 7309, 7310, 7311, 7312, 7313, 7314, 7315, 7316, 7317, 7318, + 7319, 7320, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, 7333, 7334, + 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, 7345, 7346, 7347, 7348, + 7349, 7350, 7355, 7356, 7357, 7358, 7361, 7362, 7363, 7364, 7365, 7366, 7367, 7368, + 7532, 7535, 7541, 7542, 7546, 7547, 7554, 7555, 7560, 7561, 7563, 7574, 7582, 7583, + 7584, 7591, 7594, 7600, 7601, 7605, 7606, 7613, 7614, 7619, 7620, 7622, 7633, 7641, + 7642, 7643, 24891, 26729, 26730, 26758, 26759, 26766, 26767, 26771, 26773, 26774, + 26794, 26801, 26802, 26803, 26891, 26892, 26893, 26894, 26929, 26930, 26958, 26959, + 26966, 26967, 26971, 26973, 26974, 26994, 32066, 32067, 32076, 32077, 32166, 32167, + 32191, 32192, 32193, 32194, 32666, 32667 + }; + + // ------------------------------------------------------------------------- the census + + /** One row's place in the 2×2. */ + private enum Cell { + BOTH_ANSWER, PROJ4J_ANSWERS_PROJ_REFUSES, PROJ4J_REFUSES_PROJ_ANSWERS, BOTH_REFUSE + } + + /** What the census measured, kept so several tests can share one 4,280-row run. */ + private static final class Census { + final Map> cells = new EnumMap>(Cell.class); + final Map> byCause = + new EnumMap>(ErrorCause.class); + final List rows; + final List results; + + Census(List rows, List results) { + this.rows = rows; + this.results = results; + for (Cell c : Cell.values()) { + cells.put(c, new ArrayList()); + } + } + + int size(Cell c) { + return cells.get(c).size(); + } + + int size(ErrorCause c) { + List l = byCause.get(c); + return l == null ? 0 : l.size(); + } + } + + private static Census census; + + /** + * Runs all 4,280 rows once and cross-tabulates against {@code projRefuses}. + * + * @param projRefuses the set of target codes PROJ refuses; taken as a parameter rather than + * read from the constant so a control can perturb it + * @return the cross-tabulation + */ + private static Census run(TreeSet projRefuses) throws IOException { + List rows = readRows(); + List results = new ArrayList(rows.size()); + CRSFactory factory = new CRSFactory(); + for (MetaCRSTestCase row : rows) { + results.add(row.evaluate(factory)); + } + return tabulate(rows, results, projRefuses); + } + + private static Census tabulate(List rows, + List results, + TreeSet projRefuses) { + Census out = new Census(rows, results); + for (int i = 0; i < rows.size(); i++) { + MetaCRSTestCase row = rows.get(i); + MetaCRSTestCase.Result result = results.get(i); + boolean proj4jRefused = result.outcome() == MetaCRSTestCase.Outcome.REFUSED; + boolean projRefused = projRefuses.contains(targetCode(row)); + Cell cell = proj4jRefused + ? (projRefused ? Cell.BOTH_REFUSE : Cell.PROJ4J_REFUSES_PROJ_ANSWERS) + : (projRefused ? Cell.PROJ4J_ANSWERS_PROJ_REFUSES : Cell.BOTH_ANSWER); + out.cells.get(cell).add(describe(row, result)); + if (proj4jRefused) { + List l = out.byCause.get(result.cause()); + if (l == null) { + l = new ArrayList(); + out.byCause.put(result.cause(), l); + } + l.add(describe(row, result)); + } + } + return out; + } + + private static synchronized Census census() throws IOException { + if (census == null) { + census = run(pinnedProjRefusals()); + } + return census; + } + + private static TreeSet pinnedProjRefusals() { + TreeSet set = new TreeSet(); + for (int code : PROJ_REFUSES) { + set.add(code); + } + return set; + } + + // ------------------------------------------------------------------------- assertions + + /** + * The pin is only valid for the probe it was measured at. Checked first and separately: + * if {@code proj4-epsg.csv} stops being "WGS 84 at (1, -1) into 4,280 distinct targets", every + * number in this class is stale, and the right outcome is a loud failure here rather than a + * quiet comparison against the wrong thing. + * + *

That regeneration has since happened — column 1 and 898 expected coordinates were + * rewritten against {@code cs2cs} 9.8.1 — and this assertion is the reason it could be + * done without invalidating the class: the source CRS, the probe point, the row count and the + * set of target codes are all unchanged, so none of the pinned numbers moved. + */ + @Test + public void theFileIsStillTheProbeThisPinWasMeasuredAgainst() throws IOException { + List rows = readRows(); + assertEquals("row count", EXPECTED_ROWS, rows.size()); + + TreeSet targets = new TreeSet(); + for (MetaCRSTestCase row : rows) { + assertEquals("every row's source CRS", SOURCE, row.getSourceCrsName()); + ProjCoordinate src = row.getSourceCoordinate(); + assertEquals("every row's probe x", PROBE_X, src.x, 0.0); + assertEquals("every row's probe y", PROBE_Y, src.y, 0.0); + assertTrue("target codes must be unique -- the PROJ column is keyed by them: " + + row.getTargetCrsName(), targets.add(targetCode(row))); + } + assertEquals("distinct targets", EXPECTED_ROWS, targets.size()); + + // ...and every pinned code is a code the file actually contains, so a stale or mistyped + // entry cannot sit in PROJ_REFUSES contributing nothing and being counted as agreement. + assertEquals("pinned PROJ refusals", EXPECTED_BOTH_REFUSE + + EXPECTED_PROJ4J_ANSWERS_PROJ_REFUSES, PROJ_REFUSES.length); + List orphans = new ArrayList(); + int previous = Integer.MIN_VALUE; + for (int code : PROJ_REFUSES) { + assertTrue("PROJ_REFUSES must be sorted and duplicate-free, at " + code, + code > previous); + previous = code; + if (!targets.contains(code)) { + orphans.add(code); + } + } + assertEquals("pinned codes not present in the CSV: " + orphans, 0, orphans.size()); + } + + /** + * The census itself: the 2×2, the cause breakdown, and the identity of the 131. + */ + @Test + public void theRefusalCensusMatchesProj981() throws IOException { + Census c = census(); + + List problems = compare(c); + if (!problems.isEmpty()) { + fail(report(c, problems)); + } + + // The 131 are a single, named phenomenon -- not an assorted 131. Checked by cause and by + // definition string, so a different row drifting into the cell cannot keep the count. + for (String row : c.cells.get(Cell.PROJ4J_REFUSES_PROJ_ANSWERS)) { + assertTrue("every row where Proj4J refuses and PROJ answers must be the NAD27 " + + "declared-ballpark divergence, but this one is not: " + row, + row.contains(ErrorCause.COORDINATE_OUTSIDE_GRID.name())); + } + assertEquals("all 131 must be +datum=NAD27", + EXPECTED_PROJ4J_REFUSES_PROJ_ANSWERS, + countWithDatumNad27(c.cells.get(Cell.PROJ4J_REFUSES_PROJ_ANSWERS))); + assertEquals("and so must the 17 in the both-refuse cell that came from the grid guard", + EXPECTED_OUTSIDE_GRID, + countWithDatumNad27(c.byCause.get(ErrorCause.COORDINATE_OUTSIDE_GRID))); + } + + /** + * No refusal is attributed to a cause this census has not accounted for. Without this, a new + * failure mode could appear, displace an equal number of rows from an accounted cause, and + * leave every total above unchanged. + */ + @Test + public void everyRefusalIsOneOfTheTwoAccountedCauses() throws IOException { + Census c = census(); + Map unexpected = new LinkedHashMap(); + for (Map.Entry> e : c.byCause.entrySet()) { + if (e.getKey() != ErrorCause.COORDINATE_OUTSIDE_GRID + && e.getKey() != ErrorCause.COORDINATE_OUT_OF_DOMAIN) { + unexpected.put(e.getKey(), e.getValue().size()); + } + } + assertEquals("refusals with an unaccounted cause: " + unexpected, 0, unexpected.size()); + assertEquals(EXPECTED_OUTSIDE_GRID, c.size(ErrorCause.COORDINATE_OUTSIDE_GRID)); + assertEquals(EXPECTED_OUT_OF_DOMAIN, c.size(ErrorCause.COORDINATE_OUT_OF_DOMAIN)); + assertEquals("the two causes must account for every refusal", + EXPECTED_PROJ4J_REFUSES_PROJ_ANSWERS + EXPECTED_BOTH_REFUSE, + c.size(ErrorCause.COORDINATE_OUTSIDE_GRID) + + c.size(ErrorCause.COORDINATE_OUT_OF_DOMAIN)); + } + + // -------------------------------------------------------------------- positive controls + + /** + * Control 1: the census can fail. A comparison that cannot reject anything reports + * exactly what you hoped for, silently. Here the measured census is compared against an + * expectation that is wrong by one in each cell in turn, and every one of those comparisons + * must produce a complaint naming that cell. + */ + @Test + public void theCensusDetectsAWrongCount() throws IOException { + Census c = census(); + assertTrue("the unperturbed comparison must be clean", compare(c).isEmpty()); + + for (Cell cell : Cell.values()) { + for (int delta : new int[]{-1, +1}) { + List problems = compare(c, expectationsWith(cell, delta)); + assertEquals("perturbing " + cell + " by " + delta + + " must produce exactly one complaint, got " + problems, + 1, problems.size()); + assertTrue("and it must name the cell: " + problems.get(0), + problems.get(0).contains(cell.name())); + } + } + } + + /** + * Control 2: the pinned PROJ column is actually consulted. A pinned table that no code + * path reads produces the right totals by construction. Moving one code out of + * {@link #PROJ_REFUSES} must move exactly one row across the table, in the direction the code + * belongs to — which also proves the join is by target code and lands on the row + * intended. + */ + @Test + public void thePinnedProjColumnIsActuallyRead() throws IOException { + Census c = census(); + + // A code in the both-refuse cell: Proj4J refuses it too, so dropping it must move one row + // from BOTH_REFUSE to PROJ4J_REFUSES_PROJ_ANSWERS. + int bothRefuse = firstCodeIn(c, Cell.BOTH_REFUSE); + TreeSet without = pinnedProjRefusals(); + assertTrue("the control needs a code that is really pinned", without.remove(bothRefuse)); + Census perturbed = tabulate(c.rows, c.results, without); + assertEquals(EXPECTED_BOTH_REFUSE - 1, perturbed.size(Cell.BOTH_REFUSE)); + assertEquals(EXPECTED_PROJ4J_REFUSES_PROJ_ANSWERS + 1, + perturbed.size(Cell.PROJ4J_REFUSES_PROJ_ANSWERS)); + assertEquals("rows Proj4J answers must be untouched by a PROJ-side edit", + EXPECTED_BOTH_ANSWER, perturbed.size(Cell.BOTH_ANSWER)); + + // ...and the other direction: adding a code Proj4J answers must populate the cell that is + // asserted to be empty, which is the proof that the zero is measured and not structural. + int bothAnswer = firstCodeIn(c, Cell.BOTH_ANSWER); + TreeSet with = pinnedProjRefusals(); + assertTrue(with.add(bothAnswer)); + Census widened = tabulate(c.rows, c.results, with); + assertEquals("the 'Proj4J answers, PROJ refuses' cell must be reachable, or its zero " + + "means nothing", 1, + widened.size(Cell.PROJ4J_ANSWERS_PROJ_REFUSES)); + assertNotEquals(EXPECTED_BOTH_ANSWER, widened.size(Cell.BOTH_ANSWER)); + } + + /** + * Control 3: the Proj4J side discriminates. Three named rows, one per column of the + * table, each checked individually so that the aggregate cannot be produced by a classifier + * that gives every row the same answer. + */ + @Test + public void theProj4jSideDiscriminatesRowByRow() throws IOException { + Census c = census(); + assertOutcome(c, 3819, MetaCRSTestCase.Outcome.IN_TOLERANCE, null); + assertOutcome(c, 4267, MetaCRSTestCase.Outcome.REFUSED, ErrorCause.COORDINATE_OUTSIDE_GRID); + assertOutcome(c, 2020, MetaCRSTestCase.Outcome.REFUSED, + ErrorCause.COORDINATE_OUT_OF_DOMAIN); + + // ...and each of those three sits in the cell the pinned PROJ column puts it in. + assertEquals("EPSG:3819 -- both answer", + Cell.BOTH_ANSWER, cellOf(c, 3819)); + assertEquals("EPSG:4267 -- Proj4J refuses on the grid, PROJ ballparks it", + Cell.PROJ4J_REFUSES_PROJ_ANSWERS, cellOf(c, 4267)); + assertEquals("EPSG:2020 -- both refuse", + Cell.BOTH_REFUSE, cellOf(c, 2020)); + } + + // ------------------------------------------------------------------------- machinery + + private static Map expectations() { + Map m = new EnumMap(Cell.class); + m.put(Cell.BOTH_ANSWER, EXPECTED_BOTH_ANSWER); + m.put(Cell.PROJ4J_ANSWERS_PROJ_REFUSES, EXPECTED_PROJ4J_ANSWERS_PROJ_REFUSES); + m.put(Cell.PROJ4J_REFUSES_PROJ_ANSWERS, EXPECTED_PROJ4J_REFUSES_PROJ_ANSWERS); + m.put(Cell.BOTH_REFUSE, EXPECTED_BOTH_REFUSE); + return m; + } + + private static Map expectationsWith(Cell cell, int delta) { + Map m = expectations(); + m.put(cell, m.get(cell) + delta); + return m; + } + + private static List compare(Census c) { + return compare(c, expectations()); + } + + private static List compare(Census c, Map expected) { + List problems = new ArrayList(); + for (Cell cell : Cell.values()) { + int got = c.size(cell); + int want = expected.get(cell); + if (got != want) { + problems.add(cell.name() + ": expected " + want + ", measured " + got); + } + } + return problems; + } + + private static String report(Census c, List problems) { + StringBuilder msg = new StringBuilder("refusal census disagrees with the pinned " + + "cs2cs 9.8.1 measurement:\n"); + for (String p : problems) { + msg.append(" ").append(p).append("\n"); + } + msg.append("by ErrorCause:\n"); + for (Map.Entry> e : c.byCause.entrySet()) { + msg.append(" ").append(e.getKey()).append(" = ").append(e.getValue().size()) + .append("\n"); + } + for (Cell cell : Cell.values()) { + List rows = c.cells.get(cell); + if (rows.isEmpty() || rows.size() == expectations().get(cell)) { + continue; + } + msg.append(cell).append(" (").append(rows.size()).append("), first 20:\n"); + for (String row : rows.subList(0, Math.min(20, rows.size()))) { + msg.append(" ").append(row).append("\n"); + } + } + return msg.toString(); + } + + private static void assertOutcome(Census c, int code, MetaCRSTestCase.Outcome outcome, + ErrorCause cause) { + for (int i = 0; i < c.rows.size(); i++) { + if (targetCode(c.rows.get(i)) == code) { + MetaCRSTestCase.Result r = c.results.get(i); + assertEquals("EPSG:" + code + " outcome", outcome, r.outcome()); + assertEquals("EPSG:" + code + " cause", cause, r.cause()); + return; + } + } + fail("EPSG:" + code + " is not in the file, so this control asserts nothing"); + } + + private static Cell cellOf(Census c, int code) { + for (Map.Entry> e : c.cells.entrySet()) { + for (String row : e.getValue()) { + if (row.startsWith(SOURCE + " -> EPSG:" + code + " ")) { + return e.getKey(); + } + } + } + throw new AssertionError("EPSG:" + code + " is in no cell"); + } + + private static int firstCodeIn(Census c, Cell cell) { + List rows = c.cells.get(cell); + assertTrue(cell + " must be non-empty for this control", !rows.isEmpty()); + String name = rows.get(0); + int arrow = name.indexOf("-> EPSG:"); + return Integer.parseInt(name.substring(arrow + 8, name.indexOf(' ', arrow + 8))); + } + + /** + * How many of these rows target a {@code +datum=NAD27} CRS, asked of the resolved + * {@link org.locationtech.proj4j.datum.Datum} rather than of a parameter string. The + * dictionaries are split on the leading {@code +} — {@code proj4/nad/epsg} always writes + * it, {@code proj4/nad/nad27} never does — so a text match on either spelling alone + * scores a confident zero on part of the population. The datum's code has one spelling. + */ + private static int countWithDatumNad27(List rows) { + assertNotNull("this control needs a non-empty list", rows); + int n = 0; + CRSFactory factory = new CRSFactory(); + for (String row : rows) { + int arrow = row.indexOf("-> "); + String target = row.substring(arrow + 3, row.indexOf(' ', arrow + 3)); + if ("NAD27".equals(factory.createFromName(target).getDatum().getCode())) { + n++; + } + } + return n; + } + + private static int targetCode(MetaCRSTestCase row) { + String name = row.getTargetCrsName(); + return Integer.parseInt(name.substring(name.indexOf(':') + 1)); + } + + private static String describe(MetaCRSTestCase row, MetaCRSTestCase.Result result) { + return row.getSourceCrsName() + " -> " + row.getTargetCrsName() + " " + result; + } + + private static List readRows() throws IOException { + return new MetaCRSTestFileReader(getFile("proj4-epsg.csv")).readTests(); + } + + private static File getFile(String name) throws IOException { + try { + return new File(MetaCrsRefusalCensusTest.class.getResource("../../../" + name).toURI()); + } catch (URISyntaxException e) { + throw new IOException("cannot locate test resource " + name, e); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/Proj4JSTest.java b/core/src/test/java/org/locationtech/proj4j/Proj4JSTest.java index a00a401..ee19bab 100755 --- a/core/src/test/java/org/locationtech/proj4j/Proj4JSTest.java +++ b/core/src/test/java/org/locationtech/proj4j/Proj4JSTest.java @@ -15,13 +15,34 @@ *******************************************************************************/ package org.locationtech.proj4j; -import junit.framework.TestCase; -import junit.textui.TestRunner; import org.junit.Test; -import org.junit.Ignore; + +import static org.junit.Assert.fail; /** - * Tests from Proj4JS + * Tests originally imported from Proj4.JS, re-pinned against PROJ 9.8.1. + *

+ * Every expected value here is now a cs2cs -d 9 (PROJ 9.8.1) measurement and every + * tolerance is the observed agreement. Previously the file carried tolerances of 100 m, 3 m, 2 m, + * 4,000 m and — in testLargeDiscrepancy7,000,000 m, which asserts nothing about + * a coordinate on Earth. + *

+ * The measurement produced one systematic finding and one real defect. + *

+ * 1. The whole "large discrepancy" file was a helper mix-up, not a discrepancy. Six of its + * eight rows had expected values computed from WGS84 (with the datum shift) but were passed to + * {@code checkTransformFromGeo}, whose source is the target CRS's own geographic CRS and therefore + * applies no shift. The "discrepancy" being tolerated was in every case the size of the + * omitted +towgs84: + *

+ *   EPSG:27700  expected 343733.14, 612144.53  = the fromWGS84 answer (fromGeo: 343642.04, 612147.04)
+ *   EPSG:21781  expected 660389.52, 185731.63  = the fromWGS84 answer (fromGeo: 660309.34, 185586.30)
+ *   EPSG:31285  expected 450055.70, 5262356.33 = the fromWGS84 answer (fromGeo: 450000.00, 5262298.75)
+ * 
+ * With the correct helper, proj4j agrees with PROJ 9.8.1 to 1e-6 m or better on all of them. + *

+ * 2. +proj=poly was 3,712 m wrong, hidden behind a 4,000 m tolerance — now fixed + * in main source and pinned at 1e-9 m. See {@link #testPolyconicIsEllipsoidal()}. * * @author Martin Davis */ @@ -30,59 +51,179 @@ public class Proj4JSTest extends BaseCoordinateTransformTest { static CoordinateTransformTester tester = new CoordinateTransformTester(true); + /** + * Same-datum (projection-only) forward transforms. Every value below is a cs2cs 9.8.1 measurement + * and proj4j matches all of them to <= 1e-7 m; the tolerances are set accordingly. + *

+ * The old literals in this method were Proj4.JS values and five of them were wrong by more than + * a metre — which is what the 100 m / 4,000 m / 3 m / 2 m tolerances were absorbing: + *

+     *   EPSG:23030  old 168035.13, 4199884.83     PROJ 168031.545059, 4199796.328566   err   3.58 /  88.50 m
+     *   EPSG:2403   old 2.75E7,   4198690.08      PROJ 27500000.0,    4198692.697844   err   0.00 /   2.62 m
+     *   EPSG:3411   old 1070076.44, -4635010.27   PROJ 1070076.154400, -4635009.046432 err   0.29 /   1.22 m
+     *   EPSG:27200  old 2464780.81, 6056330.22    PROJ 2464780.806178, 6056330.222215  err   0.004/   0.002 m
+     *   EPSG:29100  old 5110899.06, 1.055297181E7 PROJ 5110899.063467, 10552971.667179 -- moved to
+     *                                                                 testPolyconicIsEllipsoidal
+     * 
+ */ @Test public void testGood() { - checkTransformFromGeo("EPSG:23030", -6.77432123185356, 37.88456231505968, 168035.13, 4199884.83, 100); - checkTransformFromGeo("EPSG:2403", 81.0, 37.92, 2.75E7, 4198690.08, 3); - checkTransformFromGeo("EPSG:29100", -53.0, 5.0, 5110899.06, 1.055297181E7, 4000); - checkTransformFromGeo("EPSG:3031", -57.65625, -79.21875, -992481.633786, 628482.06328, 0.1); - checkTransformFromGeo("EPSG:3035", 11.0, 53.0, 4388138.6, 3321736.46, 0.1); - checkTransformFromGeo("EPSG:3153", -127.0, 52.11, 931625.91, 789252.65, 0.1); - checkTransformFromGeo("EPSG:32612", -113.109375, 60.28125, 383357.429537, 6684599.06392, 0.1); - checkTransformFromGeo("EPSG:32615", -93.0, 42.0, 500000.0, 4649776.22482, 0.1); - checkTransformFromGeo("EPSG:3411", -32.0, 48.0, 1070076.44, -4635010.27, 2); - checkTransformFromGeo("EPSG:3573", 9.84375, 61.875, 2923052.02009, 1054885.46559, 0.1); - checkTransformToGeo("EPSG:27200",2464770.343667, 6056137.861919,172.465,-40.7,0.1); - checkTransformFromGeo("EPSG:27200",172.465,-40.7, 2464780.81,6056330.22,0.1); - checkTransformFromGeo("EPSG:3375", 101.70979078430528, 3.06268465621428, 412597.532715, 338944.957259, 0.1); + checkTransformFromGeo("EPSG:23030", -6.77432123185356, 37.88456231505968, + 168031.545058617, 4199796.328566180, 1.0e-6); + checkTransformFromGeo("EPSG:2403", 81.0, 37.92, 27500000.000000000, 4198692.697844380, 1.0e-6); + checkTransformFromGeo("EPSG:3031", -57.65625, -79.21875, -992481.633786435, 628482.063279764, 1.0e-6); + checkTransformFromGeo("EPSG:3035", 11.0, 53.0, 4388138.600454633, 3321736.463013414, 1.0e-6); + checkTransformFromGeo("EPSG:3153", -127.0, 52.11, 931625.911182863, 789252.646454557, 1.0e-7); + checkTransformFromGeo("EPSG:32612", -113.109375, 60.28125, 383357.429537338, 6684599.063919374, 1.0e-7); + checkTransformFromGeo("EPSG:32615", -93.0, 42.0, 499999.999999999, 4649776.224819178, 1.0e-7); + checkTransformFromGeo("EPSG:3411", -32.0, 48.0, 1070076.154400352, -4635009.046431893, 1.0e-6); + checkTransformFromGeo("EPSG:3573", 9.84375, 61.875, 2923052.020092619, 1054885.465592114, 1.0e-7); + checkTransformFromGeo("EPSG:3375", 101.70979078430528, 3.06268465621428, + 412597.532715333, 338944.957259173, 1.0e-6); + + // nzmg. The old pair of rows was internally inconsistent: it asserted that + // (2464770.343667, 6056137.861919) inverts to (172.465, -40.7) *and* that (172.465, -40.7) + // projects to (2464780.81, 6056330.22) -- two different points, reconciled only by a 0.1 degree + // (~11 km) tolerance on the inverse. Both rows are kept, each against its own PROJ answer. + checkTransformFromGeo("EPSG:27200", 172.465, -40.7, 2464780.806177843, 6056330.222215011, 1.0e-6); + checkTransformToGeo("EPSG:27200", 2464770.343667, 6056137.861919, + 172.464862404, -40.701731353, 1.0e-8); } -// @Test - public void xtestNotImplemented() { - // gamma not implemented - checkTransformFromGeo("EPSG:2057", -53.0, 5.0, -1.160832226E7, 1.828261223E7, 0.1); - // somerc not implemented - // PM not supported - checkTransformFromGeo("EPSG:27563", 3.005, 43.89, 653704.865208, 176887.660037, 0.1); + /** + * +proj=poly ran the spherical formula on an ellipsoid. + *

+ * This was the one real defect the old file's padded tolerances were hiding. It has since been + * fixed in main source, and is pinned here at 1e-9 m so that it cannot return. For EPSG:29100 + * (SAD69 / Brazil Polyconic, GRS67) at (-53, 5), with the +5,000,000 / +10,000,000 false origin + * removed: + *

+     *   cs2cs +ellps=GRS67 (ellipsoidal)   110899.063466947   552971.667179093   <-- correct
+     *   cs2cs +R=6378160     (spherical)   110896.243653353   556683.806280897
+     *   proj4j, before the fix             110896.243653353   556683.806280898   <-- bit-identical
+     *   proj4j, now                        110899.063466947   552971.667179093       to the sphere
+     * 
+ * That bit-identity to PROJ's spherical path is what pinned the diagnosis to a missing + * ellipsoidal branch rather than to an arithmetic slip. Error before the fix: dx 2.820 m, + * dy 3,712.139 m. + *

+ * Both tests that covered this row were sized to step straight over that 3,712 m: the old + * testGood asserted the wrong value at 4,000 m, and + * {@code CoordinateTransformTest.testPROJ4_LargeDiscrepancy} asserted the right value — + * also at 4,000 m. Two tests, one true value between them, and neither could tell you which. + */ + @Test + public void testPolyconicIsEllipsoidal() { + checkTransformFromGeo("EPSG:29100", -53.0, 5.0, 5110899.063466947, 10552971.667179093, 1.0e-9); } + /** + * The former testLargeDiscrepancy, re-pinned. Same CRSs, same points, PROJ 9.8.1 + * values, and both halves of each transform where a datum shift is involved — so that the shift is + * actually asserted instead of being absorbed as "discrepancy". + *

+ * The 7,000,000 m row is gone: it asserted EPSG:26916 (UTM 16N, NAD83) at + * (-86.6056, 34.579) against 5110899.06, 10552971.81, which is the EPSG:29100 expected + * value from {@code testGood} copy-pasted into the wrong row. proj4j's answer, + * 536173.113353040 / 3826428.043831750, is bit-identical to cs2cs and is already asserted at 0.1 m + * by {@code CoordinateTransformTest.testPROJ4()}; it is re-asserted at 1e-7 m below. + */ @Test - public void testLargeDiscrepancy() { - // Proj4J matches PROJ.4 - checkTransformFromGeo("EPSG:2736", 34.0, -21.0, 603933.4, 7677505.64, 200); + public void testDatumShiftedProjections() { + // EPSG:26916 -- the 7,000 km row. NAD83, so fromGeo and fromWGS84 coincide. + checkTransformFromGeo("EPSG:26916", -86.6056, 34.579, 536173.113353040, 3826428.043831750, 1.0e-7); + + // EPSG:2736 UTM 36S / clrk66, +towgs84=-80,-100,-228 + checkTransformFromGeo("EPSG:2736", 34.0, -21.0, 603934.388709571, 7677664.393970920, 1.0e-6); + checkTransformFromWGS84("EPSG:2736", 34.0, -21.0, 603973.158165756, 7677761.994978547, 1.0e-6); + + // EPSG:27700 OSGB36 (tmerc, Airy 1830), 7-param. + // + // The fromWGS84 row was RE-PINNED. It used to expect 343733.137100357, 612144.531117884 + // at 1.0e-3 m, and the comment here used to attribute the residual to "the + // Evenden/Snyder-vs-Poder/Engsager tmerc series difference". BOTH were wrong, and the + // second is what made the first survive: + // + // * The old expected pair is bit-for-bit `cct` 9.8.1 on the EPSG:1314 Helmert + // (+rx=0.15 +ry=0.247 +rz=0.842 +s=-20.489) -- the rounded realisation that + // `projinfo -s EPSG:4326 -t EPSG:27700` emits. Proj4J does not implement EPSG:1314. + // It implements +datum=OSGB36, which PROJ 9.8.1 defines in src/datums.cpp:59 as + // 446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894 -- and Datum.OSGB36 now + // carries exactly those. `cct` on THAT Helmert gives + // 343733.140404274571 612144.531378557556, which Proj4J matches to 2.6e-10 m. + // The 3.3 mm was two different published realisations of one datum shift, not error. + // + // * It is not tmerc. Measured at this point on the identical pipeline, +approx and the + // exact Poder/Engsager tmerc differ by 1.6e-9 m in easting -- six orders of magnitude + // below the 3.3 mm the comment blamed on them. Testing the two causes separately is + // what separated them; the tmerc leg is common to both the fromGeo and fromWGS84 rows + // and the fromGeo row never moved. + // + // fromGeo is a pure tmerc forward with no datum shift, so it was untouched by the + // Datum.OSGB36 correction. `cct` exact: 343642.039538393845 612147.040453253896. + // Tolerances are set just above the measured Proj4J-vs-PROJ residual so that any *growth* + // fails the build. + checkTransformFromGeo("EPSG:27700", -2.89, 55.4, 343642.039538393845, 612147.040453253896, 1.0e-8); + checkTransformFromWGS84("EPSG:27700", -2.89, 55.4, 343733.140404274571, 612144.531378557556, 1.0e-8); - // Proj4J matches PROJ.4 - checkTransformFromGeo("EPSG:26916", -86.6056, 34.579, 5110899.06, 10552971.81, 7000000); + // EPSG:27492 Datum 73 / Modified Portuguese Grid, +towgs84=-223.237,110.193,36.649 + // Old expected 25260.493584, -9579.245052 is 0.29 m / 89.68 m from PROJ; provenance unknown. + checkTransformFromGeo("EPSG:27492", -7.84, 39.58, 25260.784714825, -9668.929128974, 1.0e-6); + checkTransformFromWGS84("EPSG:27492", -7.84, 39.58, 25182.361038954, -9758.235701918, 1.0e-6); - checkTransformFromGeo("EPSG:27700", -2.89, 55.4, 343733.14, 612144.53, 100); - checkTransformFromGeo("EPSG:27492", -7.84, 39.58, 25260.493584, -9579.245052, 100); - checkTransformFromGeo("EPSG:28992", 5.29, 52.11, 148312.15, 457804.79, 100); - checkTransformFromGeo("EPSG:31285", 13.33333333333, 47.5, 450055.7, 5262356.33, 100); - checkTransformFromGeo("EPSG:31466", 6.685, 51.425, 2547685.01212, 5699155.7345, 200); + // EPSG:28992 Amersfoort / RD New, 7-param + // Old expected 148312.15, 457804.79 is 0.09 m / 64.49 m from PROJ's same-datum answer. + checkTransformFromGeo("EPSG:28992", 5.29, 52.11, 148312.237260560, 457869.280548637, 1.0e-6); + checkTransformFromWGS84("EPSG:28992", 5.29, 52.11, 148341.233055144, 457978.577094236, 1.0e-6); - // Proj4J matches PROJ.4 - checkTransformFromGeo("EPSG:21781", 8.23, 46.82, 660389.52, 185731.63, 200); + // EPSG:31285 MGI / M31, +datum=hermannskogel + checkTransformFromGeo("EPSG:31285", 13.33333333333, 47.5, 449999.999999751, 5262298.750217431, 1.0e-5); + checkTransformFromWGS84("EPSG:31285", 13.33333333333, 47.5, 450055.697319185, 5262356.325307687, 1.0e-5); + + // EPSG:21781 CH1903 / LV03 (somerc), +towgs84=674.374,15.056,405.346 + checkTransformFromGeo("EPSG:21781", 8.23, 46.82, 660309.341946539, 185586.295802115, 1.0e-6); + checkTransformFromWGS84("EPSG:21781", 8.23, 46.82, 660389.515487420, 185731.630395966, 1.0e-6); + + // EPSG:31466 -- see FeatureTest.testDatumConversion for why PROJ's +datum=potsdam differs by + // 1.602 m: it is now nadgrids=@BETA2007.gsb, not a Helmert. + checkTransformFromGeo("EPSG:31466", 6.685, 51.425, 2547638.715922100, 5699005.049480184, 1.0e-5); } - @Ignore("TODO: Should these expect UnknownAuthoriyCode exceptions?") @Test - public void xtestUnknownCRS() { - checkTransformFromGeo("EPSG:102026", 40.0, 40.0, 3000242.4, 5092492.64, 0.1); - checkTransformFromGeo("EPSG:42304", -99.84375, 48.515625, -358185.267976, -40271.099023, 0.1); - checkTransformFromGeo("EPSG:54003", 11.0, 53.0, 1223145.57, 6491218.13, 0.1); - checkTransformFromGeo("EPSG:54008", 11.0, 53.0, 738509.49, 5874620.38, 0.1); - checkTransformFromGeo("EPSG:54009", -119.0, 34.0, -1.061760279013849E7, 4108337.84708608, 0.1); - checkTransformFromGeo("EPSG:54029", 11.0, 53.0, 1094702.5, 6496789.74, 0.1); - checkTransformFromGeo("EPSG:54032", -127.0, 52.11, -4024426.19, 6432026.98, 0.1); - //checkTransformFromGeo("google", -76.640625, 49.921875, -8531595.34908, 6432756.94421, 0.1); + /** + * EPSG: is not a synonym for "any authority". + *

+ * This replaces xtestUnknownCRS, which was dead (both an x prefix and an + * {@code @Ignore} whose reason was the open question "Should these expect + * UnknownAuthoriyCode exceptions?"). Answer: yes. Every code it listed is an + * ESRI code — 102026, 42304 and the 540xx Sphere/World family are not EPSG codes and are + * not in {@code nad/epsg}. Looking them up under the EPSG authority must fail, and the test now + * asserts that it does, which is a fail-closed assertion rather than a suppressed one. + *

+ * The projections themselves are reachable and already covered under their real authority — e.g. + * ESRI:54030 in {@code CoordinateTransformTest.testRobinson()} and ESRI:54032 in + * {@code testEquidistantAzimuthal()}. + */ + @Test + public void testEpsgAuthorityDoesNotResolveEsriCodes() { + CRSFactory factory = new CRSFactory(); + String[] esriOnlyCodes = { "EPSG:102026", "EPSG:42304", "EPSG:54003", "EPSG:54008", + "EPSG:54009", "EPSG:54029", "EPSG:54032" }; + for (String code : esriOnlyCodes) { + try { + factory.createFromName(code); + fail(code + " resolved under the EPSG authority, but it is an ESRI-only code. " + + "A silent resolution here would mean the registry had acquired a " + + "definition under the wrong authority."); + } catch (UnknownAuthorityCodeException expected) { + // correct: fail closed + } + } } + + // xtestNotImplemented deleted -- both of its rows are now covered, and neither was "not + // implemented": + // * EPSG:2057 (omerc +gamma) is asserted at 1e-5 m by FeatureTest.testGamma; it matches PROJ + // 9.8.1 to 4e-9 m. + // * EPSG:27563 (+pm=paris) is asserted at 1e-6 m by FeatureTest.testPrimeMeridian; +pm works. + // Its old expected value, 653704.865208, matches neither PROJ configuration -- see that test. } diff --git a/core/src/test/java/org/locationtech/proj4j/Proj4VariousTest.java b/core/src/test/java/org/locationtech/proj4j/Proj4VariousTest.java index fd87456..0d73a8f 100755 --- a/core/src/test/java/org/locationtech/proj4j/Proj4VariousTest.java +++ b/core/src/test/java/org/locationtech/proj4j/Proj4VariousTest.java @@ -15,11 +15,16 @@ *******************************************************************************/ package org.locationtech.proj4j; -import junit.textui.TestRunner; +import org.junit.Ignore; import org.junit.Test; /** * Tests from the PROJ4 testvarious file. + *

+ * Two methods that were disabled by naming convention (XXX_testRSOBorneo, + * FAIL_testPconic) are now {@code @Test @Ignore} with a measured reason, and + * {@link #testInverseFlatteningParameter()} was added to keep the working half of RSO Borneo — + * the repository's only use of +rf= — actually running. * * @author Martin Davis */ @@ -91,28 +96,127 @@ public void testSTS() { 1e-5); } - // disabled - gamma param not implemented -// @Test - public void XXX_testRSOBorneo() { + /** + * RSO Borneo — the repository's sole witness for both +rf= and a + * omerc +gamma where gamma != alpha. Was + * XXX_testRSOBorneo, disabled by naming convention with the comment "gamma param not + * implemented". + *

+ * Checked, not assumed. Two separate answers, and the diagnosis is exact. + *

+ * +rf is fixed. Substituting tmerc for omerc on the + * identical ellipsoid gives 114756.998365773 / 653080.606676521 against cs2cs's + * 114756.998365829 / 653080.606676522 — agreement to 5.6e-8 m. The transposed + * +rf/+f setter no longer produces the −89400 eccentricity, and this + * assertion is the only place in the repo where that is proved: +rf= appears in no + * registry file and no other test. + *

+ * +gamma is not. Measured error at this point: + *

+     *   proj4j                             707102.683838318   655878.899422022
+     *   cs2cs 9.8.1                        704570.396561578   653979.683964950
+     *   error                                   2532.287 m         1899.215 m   (3165.598 m resultant)
+     * 
+ * Root cause, isolated to one line and confirmed numerically: + * {@code ObliqueMercatorProjection.initialize():161-162} computes + * {@code u_0 = |al * atan(sqrt(d*d - 1) / cosrot) / bl} using + * cosrot = cos(Gamma), where PROJ 9.8.1's {@code omerc.cpp} uses + * cos(alpha). Evaluating both forms for these parameters gives + * {@code u_0(cos alpha) = 0.115738049}, {@code u_0(cos Gamma) = 0.115241701}; the difference, + * multiplied by a and resolved through the rotation, is + * (−2532.29, −1899.22) — reproducing both observed components to better than 0.01 m. + *

+ * That also explains why the two +gamma cases in {@link FeatureTest#testGamma()} + * pass: EPSG:2057 has gamma == alpha (so the two forms coincide) and EPSG:3375 has + * +no_uoff (so u_0 is forced to 0 and the line never runs). This CRS is + * the only configuration in the repository that reaches it. + *

+ * Second, independent defect found while isolating the first: + * {@code ObliqueMercatorProjection.java:36} declares {@code Gamma} as a plain {@code double}, + * so it defaults to 0.0, not NaN. The absence test at {@code :76} + * ({@code gzi = Double.isNaN(Gamma) ? 0 : 1}) is therefore always 1 and the + * {@code Gamma = alpha} default at {@code :125} is dead code. Any {@code +proj=omerc +alpha=…} + * with no {@code +gamma} gets zero rotation: on these parameters proj4j returns + * 490035.358739 / 956682.251445 where PROJ returns 705254.125376 / 653608.753620 — an error of + * 215,218.8 m E and 303,073.5 m N. Proof that {@code Gamma} is simply never defaulted: + * adding {@code +gamma=53d18'56.9537} (= alpha) explicitly yields 705254.125376386 / + * 653608.753619929, bit-identical to PROJ's no-gamma answer. + *

+ * Both fixed, and this test is live again. {@code Gamma} is {@code NaN} when + * {@code +gamma} is absent and {@code u_0} uses {@code cos(alpha_c)}, so the whole row now + * reproduces {@code cs2cs} 9.8.1 to 4.7e-10 m easting and 2.1e-09 m northing — the + * 3,165.598 m resultant above is gone. The {@code +alpha}-without-{@code +gamma} case that was + * 215 km out now matches PROJ to 3.9e-07 m. Both are held down separately, with all four + * gamma/alpha combinations, by + * {@code org.locationtech.proj4j.omerc.ObliqueMercatorParameterTest}. + */ + @Test + public void testRSOBorneo() { checkTransform( "+proj=latlong +a=6377298.556 +rf=300.8017", p("116d2'11.12630 5d54'19.90183"), "+proj=omerc +a=6377298.556 +rf=300.8017 +lat_0=4 +lonc=115 +alpha=53d18'56.9537 +gamma=53d7'48.3685 +k_0=0.99984 +x_0=590476.87 +y_0=442857.65", - p("704570.40 653979.68"), 1e-2); + p("704570.396561578 653979.683964950"), 1e-6); } -// @Test - public void FAIL_testPconic() { + /** + * Proves the half of RSO Borneo that does work, so that {@code +rf=} — which occurs + * nowhere else in this repository, in no registry file and no test CSV — is not left entirely + * behind an {@code @Ignore}. + *

+ * Same ellipsoid ({@code +a=6377298.556 +rf=300.8017}, i.e. Everest 1830 / RSO), same point, + * {@code tmerc} instead of {@code omerc}. cs2cs 9.8.1: 114756.998365829, 653080.606676522. + * A transposed {@code +rf} setter would give {@code es = 300.8017 * (2 - 300.8017) = -89880}, + * hence a non-finite projection and (per the historic failure mode) a return of {@code +x_0} + * exactly — so this assertion fails loudly if the transposition ever returns. + */ + @Test + public void testInverseFlatteningParameter() { checkTransform( - "+proj=latlong +datum=WGS84", p("-70.4 -23.65"), - "+proj=pconic +units=m +lat_1=20n +lat_2=60n +lon_0=60W +datum=WGS84", p("-2240096.40 -6940342.15"), - 1e-2); - // Known failure case + "+proj=latlong +a=6377298.556 +rf=300.8017", p("116d2'11.12630 5d54'19.90183"), + "+proj=tmerc +a=6377298.556 +rf=300.8017 +lon_0=115 +k=1", + p("114756.998365829 653080.606676522"), 1e-6); + } + + /** + * +proj=pconic. Was FAIL_testPconic, disabled by naming convention. + *

+ * Still broken, and comprehensively so. Measured against cs2cs 9.8.1, which reproduces the + * test's original expected values exactly (−2240096.398139611, −6940342.146955061), confirming + * they were right and that it is proj4j that is wrong: + *

+     *   forward   proj4j  -2805943.988849225  -9419873.546192560
+     *             cs2cs   -2240096.398139611  -6940342.146955061
+     *             error         565,847.591 m       2,479,531.399 m
+     *
+     *   inverse   proj4j       120.000000000       -20.031648108
+     *             cs2cs        -70.400000007       -23.650000006
+     *             error            190.400 deg           3.618 deg
+     * 
+ * The inverse returning exactly 120.000000000 is the tell: that is not a numerical error + * but a clamp — {@code Projection.projectInverse} hard-clamps longitude to ±π rather than + * signalling a domain error, so an out-of-domain inverse is returned as a plausible coordinate. + *

+ * Consistent with {@code SimpleConicProjection}'s {@code FIXME}, which hard-codes + * {@code p1 = 30}/{@code p2 = 60} and therefore ignores the {@code +lat_1=20n +lat_2=60n} given + * here entirely. + */ + @Ignore("pconic: forward 565,848 m E / 2,479,531 m N off PROJ 9.8.1; inverse returns " + + "(120.0, -20.03) for a point whose true inverse is (-70.4, -23.65) -- the 120.0 is " + + "Projection.projectInverse's +-pi longitude clamp, not arithmetic. SimpleConicProjection " + + "hard-codes p1=30/p2=60 and ignores +lat_1/+lat_2.") + @Test + public void testPconic() { checkTransform( - "+proj=pconic +units=m +lat_1=20n +lat_2=60n +lon_0=60W +datum=WGS84", p("-2240096.40 -6940342.15"), "+proj=latlong +datum=WGS84", p("-70.4 -23.65"), - 1e-2); + "+proj=pconic +units=m +lat_1=20n +lat_2=60n +lon_0=60W +datum=WGS84", + p("-2240096.398139611 -6940342.146955061"), 1e-6); + checkTransform( + "+proj=pconic +units=m +lat_1=20n +lat_2=60n +lon_0=60W +datum=WGS84", + p("-2240096.398139611 -6940342.146955061"), + "+proj=latlong +datum=WGS84", p("-70.4 -23.65"), 1e-8); } - + + @Test public void testExtendedTransverseMercator() { //checkTransform("+proj=etmerc +k=0.998 +lon_0=-20 +datum=WGS84 +x_0=10000 +y_0=20000", p("10000 20000"), "+proj=latlong +datum=WGS84", p("0dN 0.000"), 1e-3); diff --git a/core/src/test/java/org/locationtech/proj4j/Proj4jExceptionStackTraceTest.java b/core/src/test/java/org/locationtech/proj4j/Proj4jExceptionStackTraceTest.java new file mode 100644 index 0000000..c85373a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/Proj4jExceptionStackTraceTest.java @@ -0,0 +1,203 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.junit.After; +import org.junit.Test; + +/** + * {@link Proj4jException#fillInStackTrace()}: the frames are gone by default, everything a caller + * can act on is not, and the flag really does bring them back. + * + *

Why the frames were dropped

+ * + *

An exception here is usually the answer, not a bug report: + * {@link ErrorCause#COORDINATE_OUTSIDE_GRID} fires once per point outside the declared + * {@code +nadgrids=} coverage, and this library is called per row inside a Spark executor. + * {@code GridShiftBenchmark.noGridHit} measured the refusal at 1,440 B/op and 585 ns, + * essentially all of it {@code Throwable.fillInStackTrace}'s native stack walk. + * + *

Why this test is not vacuous

+ * + *

A suppression that suppressed everything would pass any test that only checks for absent + * frames. So each case here is a pair: off gives zero frames, on gives frames naming + * this test's own method, and both give the same type, the same {@link Proj4jException#cause()}, + * the same message and the same {@link Throwable#getCause()}. The flag is the control, and it is + * exercised in both directions in the same JVM — which is why it is a settable field and not a + * {@code static final} read of a system property. + */ +public class Proj4jExceptionStackTraceTest { + + @After + public void restoreDefault() { + Proj4jException.setStackTraceCaptureEnabled(false); + } + + @Test + public void offByDefault() { + // The class initialiser reads the system property, which the surefire JVM does not set. + assertFalse("stack-trace capture must be off unless asked for", + Proj4jException.isStackTraceCaptureEnabled()); + } + + @Test + public void suppressedByDefaultAndRestoredByTheFlag() { + Proj4jException.setStackTraceCaptureEnabled(false); + Proj4jException off = new Proj4jException("no frames please"); + assertEquals("frames were captured with the flag off", 0, off.getStackTrace().length); + + Proj4jException.setStackTraceCaptureEnabled(true); + Proj4jException on = new Proj4jException("frames please"); + + // CONTROL. If this reads zero, the "0 above" result says nothing: it would be consistent + // with a JVM that never fills traces, a JMH-style flag, or a broken assertion. + assertTrue("CONTROL FAILED - the flag did not restore stack traces, so the suppression" + + " assertion above proves nothing", + on.getStackTrace().length > 0); + assertEquals("the restored trace does not start at the throw site", + "suppressedByDefaultAndRestoredByTheFlag", + on.getStackTrace()[0].getMethodName()); + } + + /** The whole hierarchy inherits it — a subclass that reintroduced the walk would be invisible. */ + @Test + public void everySubclassInheritsTheSuppression() { + Proj4jException.setStackTraceCaptureEnabled(false); + Proj4jException[] all = { + new Proj4jException("base"), + new CrsTransformException(ErrorCause.NUMERICAL_FAILURE, "transform"), + new CrsCreationException(ErrorCause.INVALID_PARAM_VALUE, "creation"), + new UnknownAuthorityCodeException("EPSG:999999"), + new InvalidValueException("value"), + new ContradictoryParameterException("contradiction"), + new UnsupportedParameterException("unsupported"), + new ProjectionException("projection"), + new ConvergenceFailureException("convergence"), + }; + for (Proj4jException e : all) { + assertEquals(e.getClass().getName() + " still captures a stack trace", + 0, e.getStackTrace().length); + } + + Proj4jException.setStackTraceCaptureEnabled(true); + // CONTROL: the same constructors, with the flag on, must all produce frames. + Proj4jException[] withFrames = { + new Proj4jException("base"), + new CrsTransformException(ErrorCause.NUMERICAL_FAILURE, "transform"), + new CrsCreationException(ErrorCause.INVALID_PARAM_VALUE, "creation"), + new UnknownAuthorityCodeException("EPSG:999999"), + new InvalidValueException("value"), + new ContradictoryParameterException("contradiction"), + new UnsupportedParameterException("unsupported"), + new ProjectionException("projection"), + new ConvergenceFailureException("convergence"), + }; + for (Proj4jException e : withFrames) { + assertTrue("CONTROL FAILED for " + e.getClass().getName(), + e.getStackTrace().length > 0); + } + } + + /** + * Everything a caller can branch on survives. This is the actual claim being made — that the + * frames were the only thing dropped. + */ + @Test + public void theDiagnosticPayloadIsUnchanged() { + RuntimeException underlying = new IllegalStateException("underlying"); + + Proj4jException.setStackTraceCaptureEnabled(true); + CrsTransformException withFrames = new CrsTransformException( + ErrorCause.COORDINATE_OUTSIDE_GRID, "point (1.0, 2.0) is outside [conus]", + underlying); + + Proj4jException.setStackTraceCaptureEnabled(false); + CrsTransformException withoutFrames = new CrsTransformException( + ErrorCause.COORDINATE_OUTSIDE_GRID, "point (1.0, 2.0) is outside [conus]", + underlying); + + assertEquals(withFrames.getClass(), withoutFrames.getClass()); + assertEquals(withFrames.cause(), withoutFrames.cause()); + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, withoutFrames.cause()); + assertEquals(withFrames.getMessage(), withoutFrames.getMessage()); + assertSame(underlying, withoutFrames.getCause()); + assertTrue(withoutFrames instanceof Proj4jException); + + // printStackTrace still identifies the exception and its cause; only the frames are gone. + StringWriter sw = new StringWriter(); + withoutFrames.printStackTrace(new PrintWriter(sw)); + String printed = sw.toString(); + assertTrue("printStackTrace lost the type: " + printed, + printed.contains("CrsTransformException")); + assertTrue("printStackTrace lost the message: " + printed, + printed.contains("outside [conus]")); + assertTrue("printStackTrace lost the underlying cause: " + printed, + printed.contains("IllegalStateException")); + } + + /** + * Not a shared instance. Two refusals must carry two accurate messages — the usual + * preallocated-singleton trick would make one of them a lie, and this library's whole thesis is + * that a plausible-looking wrong answer is the worst outcome. + */ + @Test + public void everyThrowIsStillItsOwnObject() { + Proj4jException.setStackTraceCaptureEnabled(false); + Proj4jException a = new ProjectionException("point A out of domain"); + Proj4jException b = new ProjectionException("point B out of domain"); + assertFalse("two refusals returned the same object", a == b); + assertEquals("point A out of domain", a.getMessage()); + assertEquals("point B out of domain", b.getMessage()); + } + + /** + * The real refusal, through the real API, with the coordinate and grid names still in the + * message. This is the case the optimisation exists for. + */ + @Test + public void theGridRefusalKeepsItsMessage() { + CRSFactory factory = new CRSFactory(); + CoordinateReferenceSystem nad27 = factory.createFromParameters("nad27", + "+proj=longlat +ellps=clrk66 +nadgrids=conus +no_defs"); + CoordinateReferenceSystem wgs84 = factory.createFromName("EPSG:4326"); + CoordinateTransform t = new CoordinateTransformFactory().createTransform(nad27, wgs84); + + // Somewhere in the Indian Ocean: outside every US grid. + ProjCoordinate in = new ProjCoordinate(70.0, -30.0); + try { + t.transform(in, new ProjCoordinate()); + org.junit.Assert.fail("expected a refusal outside the grid"); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, e.cause()); + assertEquals("the refusal lost its frames AND its message", 0, + e.getStackTrace().length); + assertNotNull(e.getMessage()); + assertTrue("the message no longer names the grids: " + e.getMessage(), + e.getMessage().contains("conus")); + assertTrue("the message no longer carries the coordinate: " + e.getMessage(), + e.getMessage().contains("70.0") || e.getMessage().contains("-30.0")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/RepeatedTransformTest.java b/core/src/test/java/org/locationtech/proj4j/RepeatedTransformTest.java index 49c2997..5a909b8 100755 --- a/core/src/test/java/org/locationtech/proj4j/RepeatedTransformTest.java +++ b/core/src/test/java/org/locationtech/proj4j/RepeatedTransformTest.java @@ -16,37 +16,129 @@ package org.locationtech.proj4j; import org.junit.Test; -import org.locationtech.proj4j.CRSFactory; -import org.locationtech.proj4j.CoordinateReferenceSystem; -import org.locationtech.proj4j.CoordinateTransform; -import org.locationtech.proj4j.CoordinateTransformFactory; -import org.locationtech.proj4j.ProjCoordinate; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +/** + * Proves that invoking one {@link CoordinateTransform} repeatedly on a single thread is + * bitwise idempotent, including the {@code z} ordinate and including the paths that carry + * data-dependent iteration. + *

+ * What this class used to assert, and why that was nothing. It made two sequential calls on one + * thread and compared them with {@code assertTrue(destPt.equals(destPt2))}. + * {@link ProjCoordinate#equals(Object)} ({@code ProjCoordinate.java:303-315}) compares only {@code x} + * and {@code y} — {@code z} is not compared, and neither is it in {@code hashCode()} — so a + * transform that returned a different height on the second call passed silently. Since both calls + * shared one thread and no state was mutated between them, the assertion could only have failed if + * {@code transform} were non-deterministic in {@code x}/{@code y} alone. + *

+ * Thread-safety of a shared transform is covered separately and properly by + * {@code org.locationtech.proj4j.concurrent.SharedTransformConcurrencyTest}, which also covers the + * aliased {@code src == dst} case. This class therefore keeps only the question that is genuinely + * about repetition rather than about concurrency, and asserts it in the one way that + * can detect the failure: + *

    + *
  • Bitwise, via {@link Double#doubleToRawLongBits(double)}, not with a tolerance. A + * transform that drifts by a fraction of a nanometre per call still produces a finite, plausible + * coordinate, and a tolerance-based assertion cannot see it. Raw bits also distinguish + * {@code -0.0} from {@code 0.0} and NaN payloads, both of which are real distinctions at the + * equator and the antimeridian.
  • + *
  • On all three ordinates, so the {@code equals()} blind spot cannot hide a drifting + * height — which matters here because a 2D datum shift routed through geocentric coordinates + * invents a {@code z} (EPSG:4326 -> EPSG:27700 with no input height returns + * {@code z ~= -49.85}).
  • + *
  • Over the grid-shift path. {@code Grid.nad_cvt} iterates up to {@code MAX_TRY = 9} times + * with a data-dependent trip count, and {@code Grid.java:77} has no cache, so a + * {@code +nadgrids=} transform re-resolves and re-allocates on some paths. That combination — + * data-dependent iteration plus per-call allocation — is the only place in the tree where + * repeated invocation could plausibly diverge, and it was untested.
  • + *
+ */ public class RepeatedTransformTest { + /** Enough repetitions to catch per-call accumulation, cheap enough to stay in the fast suite. */ + private static final int REPEATS = 200; + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + /** WGS84 -> OSGB36 (7-parameter Helmert; invents a z from a 2D input). */ + @Test + public void repeatedInvocationIsBitwiseIdempotent() { + CoordinateReferenceSystem src = CRS_FACTORY.createFromName("epsg:4326"); + CoordinateReferenceSystem dest = CRS_FACTORY.createFromName("epsg:27700"); + assertRepeatable(CT_FACTORY.createTransform(src, dest), + new ProjCoordinate(0.899167, 51.357216)); + } + + /** + * The grid-shift path: {@code +nadgrids=nzgd2kgrid0005.gsb}, i.e. {@code Grid.nad_cvt}'s + * data-dependent iteration. Same CRS pair as {@code CoordinateTransformTest.testEPSG_27250}. + */ @Test - public void testRepeatedTransform() { - CRSFactory crsFactory = new CRSFactory(); + public void repeatedInvocationThroughAGridShiftIsBitwiseIdempotent() { + CoordinateReferenceSystem src = + CRS_FACTORY.createFromParameters("wgs84", "+proj=latlong +datum=WGS84"); + CoordinateReferenceSystem dest = CRS_FACTORY.createFromParameters("nzgd49", + "+proj=tmerc +lat_0=-36.87986527777778 +lon_0=174.7643393611111 +k=0.9999" + + " +x_0=300000 +y_0=700000 +datum=nzgd49 +units=m" + + " +towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993" + + " +nadgrids=nzgd2kgrid0005.gsb +no_defs"); + assertRepeatable(CT_FACTORY.createTransform(src, dest), + new ProjCoordinate(174.7772114, -41.2887953)); + } - CoordinateReferenceSystem src = crsFactory.createFromName("epsg:4326"); - CoordinateReferenceSystem dest = crsFactory.createFromName("epsg:27700"); + /** A 3D input, so that a drifting {@code z} has somewhere to drift from. */ + @Test + public void repeatedInvocationPreservesTheThirdOrdinateBitwise() { + CoordinateReferenceSystem src = CRS_FACTORY.createFromName("epsg:2994"); + CoordinateReferenceSystem dest = + CRS_FACTORY.createFromParameters("geocent", "+proj=geocent +datum=WGS84"); + assertRepeatable(CT_FACTORY.createTransform(src, dest), + new ProjCoordinate(635788, 850485, 81)); + } - CoordinateTransformFactory ctf = new CoordinateTransformFactory(); - CoordinateTransform transform = ctf.createTransform(src, dest); + /** + * Invokes {@code transform} {@link #REPEATS} times with the same input and requires every result + * to be bit-identical to the first, on x, y and z. + *

+ * A fresh output object is used on every call so that the assertion is about the transform's own + * state rather than about whatever happened to be left in a reused buffer; the reused-buffer case + * is then checked separately at the end. + */ + private static void assertRepeatable(CoordinateTransform transform, ProjCoordinate in) { + ProjCoordinate first = new ProjCoordinate(); + transform.transform(copyOf(in), first); - ProjCoordinate srcPt = new ProjCoordinate(0.899167, 51.357216); - ProjCoordinate destPt = new ProjCoordinate(); + for (int i = 1; i < REPEATS; i++) { + ProjCoordinate out = new ProjCoordinate(); + transform.transform(copyOf(in), out); + assertBitwiseEqual("call " + i, first, out); + } - transform.transform(srcPt, destPt); - System.out.println(srcPt + " ==> " + destPt); + // And with a single output object reused across calls, which is the pattern callers actually + // use in a per-vertex loop. + ProjCoordinate reused = new ProjCoordinate(); + for (int i = 0; i < REPEATS; i++) { + transform.transform(copyOf(in), reused); + } + assertBitwiseEqual("reused output buffer", first, reused); + } - // do it again - ProjCoordinate destPt2 = new ProjCoordinate(); - transform.transform(srcPt, destPt2); - System.out.println(srcPt + " ==> " + destPt2); + /** + * Defends against a transform that mutates its input: every call gets its own copy, so an + * in-place modification cannot make the second call's input differ from the first's. + */ + private static ProjCoordinate copyOf(ProjCoordinate p) { + return new ProjCoordinate(p.x, p.y, p.z); + } - assertTrue(destPt.equals(destPt2)); + private static void assertBitwiseEqual(String what, ProjCoordinate expected, ProjCoordinate actual) { + assertEquals(what + ": x differs (" + expected.x + " vs " + actual.x + ")", + Double.doubleToRawLongBits(expected.x), Double.doubleToRawLongBits(actual.x)); + assertEquals(what + ": y differs (" + expected.y + " vs " + actual.y + ")", + Double.doubleToRawLongBits(expected.y), Double.doubleToRawLongBits(actual.y)); + assertEquals(what + ": z differs (" + expected.z + " vs " + actual.z + ")", + Double.doubleToRawLongBits(expected.z), Double.doubleToRawLongBits(actual.z)); } } diff --git a/core/src/test/java/org/locationtech/proj4j/SpcsNad27Test.java b/core/src/test/java/org/locationtech/proj4j/SpcsNad27Test.java new file mode 100644 index 0000000..bb33323 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/SpcsNad27Test.java @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright 2009, 2017 Martin Davis + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.io.MetaCRSTestCase; +import org.locationtech.proj4j.io.MetaCRSTestFileReader; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * Runs {@code PROJ4_SPCS_nad27.csv}, the repository's only NAD27 State Plane coverage. It had been + * checked in and then never referenced by any test, in any module, for its entire history. + *

+ * A correction to the audit that scheduled this work. The file was recorded as "265 rows of + * NAD27 SPCS coverage existing nowhere else". It has 265 data rows, but 248 of them target the + * placeholder code {@code EPSG:0} and throw {@link UnknownAuthorityCodeException} — they are rows + * the PROJ.4 {@code test27} suite had no EPSG code for when the file was written, since the + * non-Alaska NAD27 zones' expected values are in US survey feet while the corresponding + * {@code EPSG:267xx} definitions are metric. The real coverage is 17 rows over the ten Alaska + * zones ({@code EPSG:26731}-{@code 26740}), and all 17 pass at the file's own 0.1 ft tolerance. + *

+ * That 17 is still worth having: it is the only NAD27 State Plane assertion in the repository, and + * {@code EPSG:26731} (Alaska zone 1) is one of only three shipped {@code omerc} definitions and the + * only NAD27 one — it passes because it carries {@code +no_uoff} with {@code gamma == alpha}, i.e. it + * avoids both {@code omerc} defects documented in {@code Proj4VariousTest.testRSOBorneo()}. + *

+ * The unresolvable count is asserted exactly rather than skipped silently: if a future registry change + * makes one of those 248 rows resolvable, the assertion fails and the row gets looked at, instead of + * a real regression hiding inside a growing "skipped" bucket. + */ +public class SpcsNad27Test { + + /** + * Rows whose target is the placeholder {@code EPSG:0}. Measured, not assumed: 265 data rows, + * 17 resolvable, 248 not. + */ + private static final int EXPECTED_UNRESOLVABLE_ROWS = 248; + + /** Rows that name a real EPSG code. All of them are expected to pass. */ + private static final int EXPECTED_RESOLVABLE_ROWS = 17; + + private static final CRSFactory csFactory = new CRSFactory(); + + @Test + public void testPROJ4_SPCS_NAD27() throws IOException { + File file = getFile("PROJ4_SPCS_nad27.csv"); + List tests = new MetaCRSTestFileReader(file).readTests(); + + List failed = new ArrayList(); + List unexpectedlyUnresolvable = new ArrayList(); + int resolvable = 0; + int unresolvable = 0; + + for (MetaCRSTestCase test : tests) { + try { + boolean passed = test.execute(csFactory); + resolvable++; + if (!passed) { + failed.add(describe(test)); + } + } catch (UnknownAuthorityCodeException ex) { + // The 248 placeholder rows. Counted, never treated as a pass. + unresolvable++; + if (!"0".equals(targetCode(test))) { + unexpectedlyUnresolvable.add(describe(test) + " -- " + ex.getMessage()); + } + } catch (Proj4jException ex) { + resolvable++; + failed.add(describe(test) + " threw " + ex.getClass().getSimpleName() + + ": " + ex.getMessage()); + } + } + + StringBuilder msg = new StringBuilder(); + if (!failed.isEmpty()) { + msg.append(failed.size()).append(" of ").append(resolvable) + .append(" resolvable NAD27 SPCS rows failed:\n"); + for (String f : failed) { + msg.append(" ").append(f).append("\n"); + } + } + if (!unexpectedlyUnresolvable.isEmpty()) { + msg.append(unexpectedlyUnresolvable.size()) + .append(" rows failed to resolve for a reason other than the EPSG:0 placeholder:\n"); + for (String u : unexpectedlyUnresolvable) { + msg.append(" ").append(u).append("\n"); + } + } + if (msg.length() > 0) { + fail(msg.toString()); + } + + assertEquals("resolvable NAD27 SPCS rows", EXPECTED_RESOLVABLE_ROWS, resolvable); + assertEquals("rows targeting the placeholder code EPSG:0 -- if this number has dropped, a " + + "registry change made one of them resolvable and it should be re-pinned rather " + + "than left in the skip bucket", EXPECTED_UNRESOLVABLE_ROWS, unresolvable); + } + + private static String targetCode(MetaCRSTestCase test) { + String name = test.getTargetCrsName(); + int colon = name.indexOf(':'); + return colon < 0 ? name : name.substring(colon + 1); + } + + private static String describe(MetaCRSTestCase test) { + return test.getName().trim() + " " + test.getSourceCrsName() + " -> " + + test.getTargetCrsName() + " expected " + test.getTargetCoordinate() + + " got " + test.getResultCoordinate(); + } + + private static File getFile(String name) throws IOException { + try { + return new File(SpcsNad27Test.class.getResource("../../../" + name).toURI()); + } catch (URISyntaxException e) { + throw new IOException("cannot locate test resource " + name, e); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/AxisOrderPolicyTest.java b/core/src/test/java/org/locationtech/proj4j/api/AxisOrderPolicyTest.java new file mode 100644 index 0000000..f866ef8 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/AxisOrderPolicyTest.java @@ -0,0 +1,265 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; + +/** + * The contract of {@link AxisOrderPolicy} through the facade: {@link AxisOrderPolicy#LEGACY} is the + * default and is longitude-first, and {@link AxisOrderPolicy#AUTHORITY} flips a geographic EPSG CRS + * to latitude-first. + * + *

Every coordinate here is deliberately far from (0, 0)

+ * + *

(-122.4, 37.8) -- San Francisco, from the consumer's own reproduction script. Swapping the two + * ordinates of a point near the equator and the prime meridian changes the answer by almost nothing, + * which is exactly why an axis-order regression can pass a test suite whose fixtures live near the + * origin and then transpose every coordinate in production. A test for this property that uses + * (0, 0), or (1, 1), or any point where |lat| is close to |lon|, is not a test. + */ +public class AxisOrderPolicyTest { + + private static final double LON = -122.4; + private static final double LAT = 37.8; + + private static final ProjContext AUTHORITY = ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.AUTHORITY).build(); + + // -------------------------------------------------------------------------------- the default + + @Test + public void legacyIsTheDefault() { + assertEquals(AxisOrderPolicy.LEGACY, ProjContext.DEFAULT.axisOrderPolicy()); + assertEquals(AxisOrderPolicy.LEGACY, Proj.defaultContext().axisOrderPolicy()); + } + + @Test + public void byDefaultEpsg4326IsLongitudeFirst() { + Crs crs = Proj.createCrs("EPSG:4326"); + assertEquals("enu", crs.axisOrder()); + assertFalse(crs.isLatitudeFirst()); + } + + /** + * The 1.4.3-compatibility assertion, with the literal coordinate from the consumer's + * reproduction script: the default operation consumes {@code (longitude, latitude)}. + * + *

Verified by the shape of the answer rather than a pinned constant: Web Mercator easting at + * 122.4°W is a large negative number and northing at 37.8°N is a smaller positive one. + * Feeding the ordinates in the wrong order would put the point at easting +4.2e6, northing + * -1.1e7 -- both signs and both magnitudes wrong, which is the point. + */ + @Test + public void defaultOperationConsumesLongitudeThenLatitude() { + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857"); + ProjCoordinate out = op.transform(new ProjCoordinate(LON, LAT)); + + assertTrue("easting at 122.4W must be negative, was " + out.x, out.x < -1.3e7); + assertTrue("easting at 122.4W must be about -1.36e7, was " + out.x, out.x > -1.4e7); + assertTrue("northing at 37.8N must be about 4.55e6, was " + out.y, + out.y > 4.5e6 && out.y < 4.6e6); + } + + // ------------------------------------------------------------------------------- AUTHORITY + + @Test + public void authorityFlipsEpsg4326ToLatitudeFirst() { + Crs crs = Proj.createCrs("EPSG:4326", AUTHORITY); + assertEquals("neu", crs.axisOrder()); + assertTrue(crs.isLatitudeFirst()); + assertTrue("the flip must round-trip through the PROJ string", + crs.toProjString().contains("+axis=neu")); + } + + /** + * The whole reason the flip matters: under {@code AUTHORITY} the same physical point + * must be supplied with its ordinates swapped, and must produce the bit-identical result. + * + *

Bit-identical, not approximately equal. If the flip were implemented by re-projecting or by + * a coordinate-space transformation rather than by a pure permutation of ordinates, this would + * drift in the last few digits, and that drift is how a "harmless" axis-order refactor + * introduces a numerical regression. + */ + @Test + public void authorityConsumesLatitudeThenLongitudeAndAgreesBitwise() { + ProjCoordinate legacyOut = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857") + .transform(new ProjCoordinate(LON, LAT)); + ProjCoordinate authorityOut = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857", AUTHORITY) + .transform(new ProjCoordinate(LAT, LON)); + + assertEquals("easting must be bit-identical", + Double.doubleToLongBits(legacyOut.x), Double.doubleToLongBits(authorityOut.x)); + assertEquals("northing must be bit-identical", + Double.doubleToLongBits(legacyOut.y), Double.doubleToLongBits(authorityOut.y)); + } + + /** + * The policy must demonstrably change the answer. Without this, the bit-identical test above + * could pass even if the policy did nothing at all -- because at a point near (0, 0) it would. + * + *

(10, 20) and (20, 10) are both valid geographic coordinates either way round, so no + * validation can rescue a caller who gets the order wrong; only the number differs, by + * megametres. + */ + @Test + public void thePolicyChangesTheAnswerForAnAmbiguousCoordinate() { + ProjCoordinate legacyOut = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857") + .transform(new ProjCoordinate(10.0, 20.0)); + ProjCoordinate authorityOut = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857", AUTHORITY) + .transform(new ProjCoordinate(10.0, 20.0)); + + assertTrue("the same input under the two policies must differ by megametres, not " + + "micrometres: " + legacyOut.x + " vs " + authorityOut.x, + Math.abs(legacyOut.x - authorityOut.x) > 1.0e6); + // And each is the other's transpose, which is the whole content of the policy. + assertEquals(Double.doubleToLongBits(legacyOut.x), + Double.doubleToLongBits(Proj.createCrsToCrs("EPSG:4326", "EPSG:3857", AUTHORITY) + .transform(new ProjCoordinate(20.0, 10.0)).x)); + } + + /** + * Getting the order wrong at San Francisco does not produce a wrong coordinate: it produces an + * exception, because -122.4 is not a latitude. That is the fail-closed guarantee doing exactly + * what it is for, and it is worth pinning -- it is the one case where an axis-order mistake is + * self-detecting, and it must stay that way rather than being clamped to a pole. + */ + @Test + public void feedingAuthorityTheLegacyOrderThrowsRatherThanGuessing() { + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857", AUTHORITY); + try { + ProjCoordinate out = op.transform(new ProjCoordinate(LON, LAT)); + fail("expected a refusal: under AUTHORITY the first ordinate is a latitude and " + + LON + " is not one. Got " + out); + } catch (CrsTransformException expected) { + assertTrue("must be attributed to the coordinate, not to the CRS: " + expected.cause(), + expected.cause().isCoordinateError()); + assertTrue(expected.getMessage(), expected.getMessage().contains("latitude")); + } + } + + // ------------------------------------------------------------------- honesty about inference + + /** + * The flip is a rule applied, not a value read from an authority, because there is no + * CRS database to read it from. The API says so rather than implying otherwise. + */ + @Test + public void authorityOrderFromABareCodeIsReportedAsInferred() { + Crs crs = Proj.createCrs("EPSG:4326", AUTHORITY); + assertFalse("no proj.db means authority axis order cannot be read, only inferred", + crs.isAxisOrderAuthoritative()); + assertTrue(crs.axisOrderNote(), crs.axisOrderNote().contains("INFERRED")); + assertTrue(crs.axisOrderNote(), crs.axisOrderNote().contains("6422")); + } + + /** A projected CRS from a bare code is left east-north-up, and that too is disclosed. */ + @Test + public void authorityLeavesAProjectedCodeEastNorthAndSaysSo() { + Crs crs = Proj.createCrs("EPSG:32633", AUTHORITY); + assertEquals("enu", crs.axisOrder()); + assertFalse(crs.isAxisOrderAuthoritative()); + assertTrue(crs.axisOrderNote(), crs.axisOrderNote().contains("ASSUMED")); + } + + /** + * An operation built under {@code AUTHORITY} on inferred axis order carries a warning, so a + * caller logging {@code warnings()} learns of it without having to ask each CRS. + */ + @Test + public void inferredAxisOrderIsWarnedAboutOnTheOperation() { + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857", AUTHORITY); + boolean mentioned = false; + for (String w : op.warnings()) { + if (w.contains("axis order")) { + mentioned = true; + } + } + assertTrue("warnings() must mention that axis order was inferred: " + op.warnings(), + mentioned); + } + + // ------------------------------------------------------------------------- explicit and WKT + + /** An explicit {@code +axis=} is honoured under every policy and is authoritative. */ + @Test + public void anExplicitAxisParameterIsHonouredAndIsAuthoritative() { + Crs crs = Proj.createCrs("+proj=longlat +datum=WGS84 +axis=neu"); + assertEquals("neu", crs.axisOrder()); + assertTrue(crs.isLatitudeFirst()); + assertTrue(crs.isAxisOrderAuthoritative()); + } + + /** + * {@link AxisOrderPolicy#VISUALISATION} is unconditional: it overrides an explicit + * {@code +axis=}, which is what {@code proj_normalize_for_visualization} does. + */ + @Test + public void visualisationOverridesAnExplicitAxisParameter() { + ProjContext vis = ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.VISUALISATION).build(); + Crs crs = Proj.createCrs("+proj=longlat +datum=WGS84 +axis=neu", vis); + assertEquals("enu", crs.axisOrder()); + assertFalse(crs.isLatitudeFirst()); + assertFalse(crs.toProjString().contains("+axis=")); + } + + /** + * WKT axes really are declared, so honouring them is not an inference. A latitude-first + * {@code GEOGCS} under {@code AUTHORITY} is reported as authoritative -- which is the one case + * where this library can be sure. + */ + @Test + public void wktDeclaredAxesAreAuthoritative() { + String wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137," + + "298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]," + + "AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]"; + Crs crs = Proj.createCrs(wkt, AUTHORITY); + assertTrue("AXIS[] clauses were declared, so this is not an inference: " + + crs.axisOrderNote(), crs.isAxisOrderAuthoritative()); + assertEquals("neu", crs.axisOrder()); + assertTrue(crs.isLatitudeFirst()); + } + + /** The same document under the default policy keeps 1.4.3's longitude-first behaviour. */ + @Test + public void wktDeclaredAxesAreRetainedButNotAppliedUnderLegacy() { + String wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137," + + "298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]," + + "AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]"; + Crs crs = Proj.createCrs(wkt); + assertEquals("enu", crs.axisOrder()); + assertFalse(crs.isLatitudeFirst()); + assertTrue(crs.axisOrderNote(), crs.axisOrderNote().contains("not applied")); + } + + /** {@link Crs#withAxisOrderPolicy} derives a new CRS and leaves the original alone. */ + @Test + public void withAxisOrderPolicyDoesNotMutateTheOriginal() { + Crs legacy = Proj.createCrs("EPSG:4326"); + Crs flipped = legacy.withAxisOrderPolicy(AxisOrderPolicy.AUTHORITY); + assertEquals("neu", flipped.axisOrder()); + assertEquals("the original must be untouched", "enu", legacy.axisOrder()); + assertEquals(AxisOrderPolicy.LEGACY, legacy.context().axisOrderPolicy()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/BallparkPolicyTest.java b/core/src/test/java/org/locationtech/proj4j/api/BallparkPolicyTest.java new file mode 100644 index 0000000..912329b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/BallparkPolicyTest.java @@ -0,0 +1,168 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * The contract of {@link BallparkPolicy}: a datum change that would not actually be performed is + * refused when the operation is created, not discovered per row. + * + *

{@code EPSG:4267} to {@code EPSG:4269} is the case that matters. NAD27 declares four grid + * files, all {@code @}-optional, and a stock deployment has one of them (the Canadian + * {@code ntv1_can.dat}, whose extent starts at 40°N and so covers neither Kansas nor San + * Francisco). PROJ's {@code @} semantics make the other three vanish silently, the shift does not + * happen, and the coordinate that comes out is finite, plausible, and 95.573 m wrong at San + * Francisco — measured. There is no downstream check that can catch that, so the check has to + * be here. + */ +public class BallparkPolicyTest { + + /** San Francisco. Deliberately not near (0, 0) and deliberately inside CONUS. */ + private static final double LON = -122.4; + private static final double LAT = 37.8; + + @Test + public void rejectIsTheDefault() { + assertEquals(BallparkPolicy.REJECT, ProjContext.DEFAULT.ballparkPolicy()); + assertEquals(BallparkPolicy.REJECT, Proj.defaultContext().ballparkPolicy()); + } + + /** + * The headline assertion: it throws at creation. If this ever starts throwing from + * {@code transform} instead, the whole point has been lost -- the consumer's constraint is that + * a four-million-row job must fail on its first line, not four million times. + */ + @Test + public void ballparkIsRejectedWhenTheOperationIsCreated() { + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269"); + fail("expected BALLPARK_REJECTED at creation time, but got an operation: " + + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + // The message has to be actionable: it must name the grids and say what to do. + String m = expected.getMessage(); + assertTrue("message must name the CRSs: " + m, m.contains("EPSG:4267")); + assertTrue("message must name the datums: " + m, m.contains("NAD27")); + assertTrue("message must name each unreachable grid: " + m, + m.contains("ntv2_0.gsb")); + assertTrue("message must say the grid shift cannot be performed: " + m, + m.contains("declared grid shift cannot be performed")); + assertTrue("message must offer the opt-in: " + m, m.contains("BallparkPolicy.ALLOW")); + assertTrue("message must point at the unchanged legacy path: " + m, + m.contains("CoordinateTransformFactory")); + } + } + + /** + * The middle path: {@link GridPolicy#WARN} is "I accept incomplete grid coverage and want it on + * the record", and it must be enough on its own -- a caller should not have to reach for + * {@link BallparkPolicy#ALLOW}, which is a much broader concession. + */ + @Test + public void gridPolicyWarnIsEnoughOnItsOwn() { + ProjContext warn = ProjContext.builder().gridPolicy(GridPolicy.WARN).build(); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", warn); + + assertEquals("REJECT is still in force; it simply has nothing to reject", + BallparkPolicy.REJECT, op.context().ballparkPolicy()); + assertFalse(op.isBallparkTransformation()); + assertFalse("the unreachable grids must still be listed", op.missingGrids().isEmpty()); + assertFalse("and still warned about", op.warnings().isEmpty()); + assertTrue(op.transform(new ProjCoordinate(LON, LAT)).hasValidXandYOrdinates()); + } + + /** The rejection is a property of the ErrorCause taxonomy, not just of a message. */ + @Test + public void ballparkRejectedIsAnOperationSelectionError() { + assertTrue(ErrorCause.BALLPARK_REJECTED.isOperationError()); + assertTrue(ErrorCause.BALLPARK_REJECTED.isNoUsableOperation()); + assertFalse("a ballpark rejection is not a per-coordinate error: it must not be caught by " + + "a per-vertex handler and turned into a skipped row", + ErrorCause.BALLPARK_REJECTED.isCoordinateError()); + assertEquals("crs.ballpark_rejected", ErrorCause.BALLPARK_REJECTED.metricKey()); + } + + /** Opting in is possible, is explicit, and is recorded on the resulting operation. */ + @Test + public void allowBuildsTheOperationAndFlagsIt() { + ProjContext allow = ProjContext.builder().ballparkPolicy(BallparkPolicy.ALLOW).build(); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", allow); + + assertTrue("an allowed ballpark operation must say so", op.isBallparkTransformation()); + assertTrue(op.ballparkReason().isPresent()); + assertFalse("a ballpark operation never has a stated accuracy, in PROJ either", + op.accuracy().isPresent()); + assertFalse("the missing grids must be listed", op.missingGrids().isEmpty()); + assertFalse("the reason must be in warnings(), not only in a log line", + op.warnings().isEmpty()); + + // And it still produces an all-finite coordinate rather than a sentinel. + ProjCoordinate out = op.transform(new ProjCoordinate(LON, LAT)); + assertNotNull(out); + assertTrue(out.hasValidXandYOrdinates()); + } + + /** + * A pair with no datum change at all must not be caught by any of this. If the ballpark rule + * ever became over-eager, this is what would notice. + */ + @Test + public void sameDatumIsNotBallpark() { + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633"); + assertFalse(op.isBallparkTransformation()); + assertTrue(op.missingGrids().isEmpty()); + ProjCoordinate out = op.transform(new ProjCoordinate(15.0, 50.0)); + assertTrue(out.hasValidXandYOrdinates()); + } + + /** + * {@code EPSG:3857} declares {@code +nadgrids=@null} -- PROJ's deliberate no-shift marker, + * which is shipped. It must not be mistaken for a missing grid, or the single most + * common transformation in the world would stop working. + */ + @Test + public void theNullGridIsNotAMissingGrid() { + Crs merc = Proj.createCrs("EPSG:3857"); + assertTrue("+nadgrids=@null must resolve: " + merc.describe(), + merc.missingGrids().isEmpty()); + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:3857"); + assertFalse(op.isBallparkTransformation()); + } + + /** A bare {@code +ellps=} on one side is the legacy engine's silent no-op, i.e. rule (c). */ + @Test + public void anUnknownDatumOnOneSideIsBallpark() { + try { + Proj.createCrsToCrs("+proj=longlat +ellps=clrk66", "EPSG:4326"); + fail("expected BALLPARK_REJECTED: a bare +ellps= has no transformation to WGS 84, so " + + "the engine would apply no datum shift and say nothing"); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + assertTrue(expected.getMessage().contains("no datum shift")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/CrsDescribeTest.java b/core/src/test/java/org/locationtech/proj4j/api/CrsDescribeTest.java new file mode 100644 index 0000000..0214008 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/CrsDescribeTest.java @@ -0,0 +1,166 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.Proj4jException; + +/** + * {@link Crs#describe()} on a CRS with an unreachable grid must say so. + * + *

This is the test for the failure a coordinate cannot reveal. {@code EPSG:4267} declares four + * grid files and a stock deployment has one of them; the other three vanish under PROJ's {@code @} + * semantics, the datum shift is not applied, and the coordinate that comes out is finite, plausible + * and 95.573 m wrong at San Francisco. No downstream range check, no {@code isFinite}, no + * schema validation will catch that. The only remedy is that this text exists and names the files. + */ +public class CrsDescribeTest { + + /** + * The guaranteed case: a grid name that cannot possibly resolve, so the assertion is about the + * text and not about the classpath. + */ + @Test + public void describeOnACrsWithAnUnreachableGridSaysSo() { + Crs crs = Proj.createCrs("+proj=longlat +ellps=clrk66 +nadgrids=@no_such_grid_9f3a.gsb"); + String d = crs.describe(); + + assertTrue("must count reachable against unreachable: " + d, d.contains("UNREACHABLE")); + assertTrue("must name the unreachable file: " + d, d.contains("no_such_grid_9f3a.gsb")); + assertTrue("must state the consequence in words, not leave it to be inferred: " + d, + d.contains("wrong by the size of the missing shift")); + assertTrue("must say the legacy API is deliberately unchanged: " + d, + d.contains("skips the grid silently")); + assertTrue("must state that the working directory is not searched, since that is the other " + + "way a grid can differ per executor: " + d, + d.contains("working directory is deliberately not searched")); + assertTrue("must say the @ prefix is why this can be silent elsewhere: " + d, + d.contains("@ prefix")); + } + + /** + * The realistic case, on a real datum. Which of {@code +datum=NAD27}'s four declared grids are + * present depends on the classpath -- which is the entire reason this API exists -- so the + * assertions are over whatever is missing rather than over a named file, and the test insists + * that something is, so that a run where everything resolved cannot pass vacuously. + */ + @Test + public void describeOnNad27ReportsEachDeclaredGridsReachability() { + Crs nad27 = Proj.createCrs("EPSG:4267"); + assertEquals("PROJ's datum table declares four grids for NAD27", 4, nad27.grids().size()); + assertEquals(4, nad27.requiredGrids().size()); + assertTrue("the @ must round-trip in requiredGrids(): " + nad27.requiredGrids(), + nad27.requiredGrids().contains("@conus")); + + List missing = nad27.missingGrids(); + assertFalse("no US or Canadian grid pack can be complete on this classpath, so at least one " + + "of NAD27's four grids must be reported unreachable: " + nad27.describe(), + missing.isEmpty()); + assertTrue(nad27.hasUnreachableGrids()); + + String d = nad27.describe(); + for (GridInfo g : missing) { + assertFalse(g.isAvailable()); + assertTrue(g.isDeclared()); + assertTrue("PROJ declares all four with @, and that must be recorded", g.isOptional()); + assertTrue(g.skipReason().isPresent()); + assertFalse(g.resolverName().isPresent()); + assertFalse(g.origin().isPresent()); + assertTrue("describe() must name every unreachable grid: " + g.name() + " in " + d, + d.contains(g.name())); + } + assertTrue(d, d.contains("UNREACHABLE")); + assertTrue(d, d.contains("declared by +datum=NAD27")); + } + + /** A CRS that declares nothing says exactly that, rather than saying nothing. */ + @Test + public void describeOnACrsWithNoGridsSaysNoneDeclared() { + String d = Proj.createCrs("EPSG:4326").describe(); + assertTrue(d, d.contains("grids = none declared")); + assertTrue(Proj.createCrs("EPSG:4326").missingGrids().isEmpty()); + assertFalse(Proj.createCrs("EPSG:4326").hasUnreachableGrids()); + } + + /** An explicit {@code +nadgrids=} is reported as the declaring parameter, verbatim. */ + @Test + public void anExplicitNadgridsParameterIsAttributedToItself() { + Crs crs = Proj.createCrs("+proj=longlat +ellps=clrk66 +nadgrids=@nosuchgrid.gsb"); + List missing = crs.missingGrids(); + assertEquals(1, missing.size()); + assertEquals("nosuchgrid.gsb", missing.get(0).name()); + assertTrue(missing.get(0).declaredBy().get(), + missing.get(0).declaredBy().get().contains("+nadgrids=@nosuchgrid.gsb")); + assertTrue("an unknown grid has no PROJ 7+ name to offer", + !missing.get(0).modernName().isPresent()); + } + + /** + * A required (non-{@code @}) grid is a different fact from an optional one, and the difference + * shows up before any coordinate does: a required grid that is absent makes the CRS + * unconstructible, which is the correct outcome and the reason the {@code @} case needs all this + * reporting instead. + */ + @Test + public void aRequiredGridIsDistinguishedFromAnOptionalOne() { + Crs optional = Proj.createCrs("+proj=longlat +ellps=clrk66 +nadgrids=@nosuchgrid.gsb"); + GridInfo skipped = optional.missingGrids().get(0); + assertTrue(skipped.isOptional()); + assertTrue("the describe text must say the @ is what makes this survivable: " + + skipped.describe(), skipped.describe().contains("@ prefix")); + + try { + Proj.createCrs("+proj=longlat +ellps=clrk66 +nadgrids=nosuchgrid.gsb"); + fail("a REQUIRED grid that cannot be found must not yield a usable CRS"); + } catch (Proj4jException expected) { + assertTrue("the failure must be attributed, not bare: " + expected.cause(), + expected.cause() != null); + } + } + + /** {@link CrsOperation#describe()} rolls up both CRSs plus the operation's own findings. */ + @Test + public void operationDescribeIncludesBothCrsDescriptions() { + ProjContext allow = ProjContext.builder().ballparkPolicy(BallparkPolicy.ALLOW).build(); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", allow); + String d = op.describe(); + + assertTrue(d, d.contains("CrsOperation EPSG:4267 -> EPSG:4269")); + assertTrue(d, d.contains("ballpark = true")); + assertTrue("accuracy must be refused explicitly, not silently omitted: " + d, + d.contains("accuracy = ")); + assertTrue(d, d.contains("missing grids = " + op.missingGrids().size())); + assertTrue("must roll up the source CRS: " + d, d.contains("CRS EPSG:4267")); + assertTrue("must roll up the target CRS: " + d, d.contains("CRS EPSG:4269")); + assertTrue("must state the thread-safety contract, since a shared operation is the whole " + + "point: " + d, d.contains("immutable and shareable")); + } + + /** Area of use is refused in words rather than being quietly absent. */ + @Test + public void areaOfUseIsRefusedExplicitly() { + Crs crs = Proj.createCrs("EPSG:4326"); + assertFalse(crs.areaOfUse().isPresent()); + assertTrue(crs.describe(), crs.describe().contains("it is not guessed")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/FacadeWktIoTest.java b/core/src/test/java/org/locationtech/proj4j/api/FacadeWktIoTest.java new file mode 100644 index 0000000..9c94e2a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/FacadeWktIoTest.java @@ -0,0 +1,303 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.io.wkt.WktDialect; + +/** + * WKT and PROJJSON reach the caller through the facade, with no second artifact and no + * dependency. + * + *

This is the capability that removes the need for an Apache SIS fallback, and with it the + * duplicate {@code org.opengis.util.CodeList} hazard: two incompatible copies on one classpath make + * SIS's WKT parser throw {@code NoSuchMethodError}, which is an {@code Error} rather than an + * {@code Exception}, so it passes local tests and kills Spark executors. The readers and writers + * already existed; this file asserts that a caller can get at them from + * {@link Proj#createCrs(String)} without knowing which of four notations they hold. + */ +public class FacadeWktIoTest { + + private static final String WKT1_GDAL = + "PROJCS[\"WGS 84 / UTM zone 33N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\"," + + "SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]]," + + "AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]]," + + "PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0]," + + "PARAMETER[\"central_meridian\",15],PARAMETER[\"scale_factor\",0.9996]," + + "PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0]," + + "UNIT[\"metre\",1],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH]," + + "AUTHORITY[\"EPSG\",\"32633\"]]"; + + private static final String WKT1_ESRI = + "PROJCS[\"WGS_1984_UTM_Zone_33N\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\"," + + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"]," + + "PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",15.0],PARAMETER[\"Scale_Factor\",0.9996]," + + "PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]"; + + private static final String WKT2 = + "GEOGCRS[\"WGS 84\",DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2],AXIS[\"geodetic latitude (Lat)\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "AXIS[\"geodetic longitude (Lon)\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "USAGE[SCOPE[\"Horizontal component of 3D system.\"]," + + "AREA[\"World.\"],BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]"; + + // ---------------------------------------------------------------------------- notation sniffing + + @Test + public void allFourNotationsAreDetectedWithoutBeingDeclared() { + assertEquals(Crs.Source.AUTHORITY_CODE, Proj.createCrs("EPSG:4326").source()); + assertEquals(Crs.Source.PROJ_STRING, + Proj.createCrs("+proj=utm +zone=33 +datum=WGS84").source()); + assertEquals(Crs.Source.WKT, Proj.createCrs(WKT1_GDAL).source()); + assertEquals(Crs.Source.WKT, Proj.createCrs(WKT2).source()); + assertEquals(Crs.Source.PROJJSON, + Proj.createCrs(Proj.createCrs("EPSG:4326").toProjJson()).source()); + } + + @Test + public void theWktDialectIsDetectedAndReported() { + assertEquals(WktDialect.WKT1_GDAL, Proj.createCrs(WKT1_GDAL).sourceDialect().get()); + assertEquals(WktDialect.WKT1_ESRI, Proj.createCrs(WKT1_ESRI).sourceDialect().get()); + assertEquals(WktDialect.WKT2_2019, Proj.createCrs(WKT2).sourceDialect().get()); + assertFalse("a CRS from a code did not come from WKT", + Proj.createCrs("EPSG:4326").sourceDialect().isPresent()); + } + + /** Both WKT1 dialects describe the same projection, so both must produce the same numbers. */ + @Test + public void bothWkt1DialectsProduceTheSameTransformation() { + ProjCoordinate viaGdal = Proj.createCrsToCrs("EPSG:4326", WKT1_GDAL) + .transform(new ProjCoordinate(15.0, 50.0)); + ProjCoordinate viaEsri = Proj.createCrsToCrs("EPSG:4326", WKT1_ESRI) + .transform(new ProjCoordinate(15.0, 50.0)); + assertEquals(viaGdal.x, viaEsri.x, 1e-9); + assertEquals(viaGdal.y, viaEsri.y, 1e-9); + } + + /** And so does the authority code for the same CRS. */ + @Test + public void wktAgreesWithTheAuthorityCodeForTheSameCrs() { + ProjCoordinate viaWkt = Proj.createCrsToCrs("EPSG:4326", WKT1_GDAL) + .transform(new ProjCoordinate(15.0, 50.0)); + ProjCoordinate viaCode = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633") + .transform(new ProjCoordinate(15.0, 50.0)); + assertEquals(viaCode.x, viaWkt.x, 1e-6); + assertEquals(viaCode.y, viaWkt.y, 1e-6); + } + + // ---------------------------------------------------------------------------------- writing + + /** + * Every WKT2 revision round-trips. WKT1 is read but deliberately not written; a lossy writer + * that did not say what it dropped would be worse than none, so it refuses by name. + */ + @Test + public void aCrsCanBeWrittenAsWkt2AndReadBack() { + Crs crs = Proj.createCrs("EPSG:32633"); + for (WktDialect dialect : WktDialect.values()) { + if (dialect.isWkt1()) { + try { + crs.toWkt(dialect); + fail("WKT1 is not writable and must say so: " + dialect); + } catch (IllegalArgumentException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("toProjString()")); + } + continue; + } + String wkt = crs.toWkt(dialect); + assertNotNull(dialect.toString(), wkt); + assertFalse(dialect.toString(), wkt.isEmpty()); + Crs reread = Proj.createCrs(wkt); + ProjCoordinate a = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633") + .transform(new ProjCoordinate(15.0, 50.0)); + ProjCoordinate b = Proj.createCrsToCrs(Proj.createCrs("EPSG:4326"), reread) + .transform(new ProjCoordinate(15.0, 50.0)); + assertEquals(dialect + " easting", a.x, b.x, 1e-6); + assertEquals(dialect + " northing", a.y, b.y, 1e-6); + } + assertEquals("the no-argument form is WKT2:2019", crs.toWkt(WktDialect.WKT2_2019), + crs.toWkt()); + } + + @Test + public void aCrsCanBeWrittenAsProjJsonAndReadBack() { + Crs crs = Proj.createCrs("EPSG:32633"); + String json = crs.toProjJson(); + assertTrue(json, json.trim().startsWith("{")); + Crs reread = Proj.createCrs(json); + assertEquals(Crs.Source.PROJJSON, reread.source()); + ProjCoordinate a = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633") + .transform(new ProjCoordinate(15.0, 50.0)); + ProjCoordinate b = Proj.createCrsToCrs(Proj.createCrs("EPSG:4326"), reread) + .transform(new ProjCoordinate(15.0, 50.0)); + assertEquals(a.x, b.x, 1e-6); + assertEquals(a.y, b.y, 1e-6); + } + + @Test + public void theProjStringRoundTripsIncludingAnOptionalGridMarker() { + Crs crs = Proj.createCrs("+proj=longlat +ellps=clrk66 +nadgrids=@nosuchgrid.gsb"); + assertTrue("the @ must survive: dropping it turns \"optional\" into \"required\": " + + crs.toProjString(), crs.toProjString().contains("@nosuchgrid.gsb")); + } + + // ----------------------------------------------------------------- metadata a document carries + + /** + * A bounding box a document declared is reportable, because it is a fact the caller + * supplied rather than one this library invented. It is also flagged as not database-derived. + */ + @Test + public void aBoundingBoxDeclaredByADocumentBecomesAnAreaOfUse() { + Crs crs = Proj.createCrs(WKT2); + assertTrue("WKT2 BBOX[] must be surfaced: " + crs.describe(), crs.areaOfUse().isPresent()); + AreaOfUse area = crs.areaOfUse().get(); + assertEquals(-180.0, area.westLongitude(), 0.0); + assertEquals(-90.0, area.southLatitude(), 0.0); + assertEquals(180.0, area.eastLongitude(), 0.0); + assertEquals(90.0, area.northLatitude(), 0.0); + assertFalse("a document's claim is not an authority's", area.isDatabaseDerived()); + assertTrue(area.contains(-122.4, 37.8)); + assertFalse(area.crossesAntimeridian()); + } + + @Test + public void anAntimeridianCrossingBoxIsPreservedNotNormalised() { + AreaOfUse fiji = new AreaOfUse(176.8, -20.7, -178.4, -12.4, "Fiji", false); + assertTrue(fiji.crossesAntimeridian()); + assertTrue(fiji.contains(179.0, -18.0)); + assertTrue(fiji.contains(-179.0, -18.0)); + assertFalse("normalising this away would turn a 5-degree box into a 355-degree one", + fiji.contains(0.0, -18.0)); + } + + @Test + public void anIdDeclaredByADocumentIsReportedAndOneThatIsNotIsNotInvented() { + assertTrue(Proj.createCrs(WKT2).identifiers().contains("EPSG:4326")); + assertTrue("a PROJ string equivalent to EPSG:4326 must NOT be attributed to EPSG", + Proj.createCrs("+proj=longlat +datum=WGS84").identifiers().isEmpty()); + } + + // ---------------------------------------------------------------------------------- failures + + @Test + public void malformedInputFailsWithACauseRatherThanAStackTraceFromTheParser() { + try { + Proj.createCrs("PROJCS[\"broken\""); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertEquals(ErrorCause.INVALID_CRS_SYNTAX, e.cause()); + } + try { + Proj.createCrs("{\"type\": \"nonsense\"}"); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertEquals(ErrorCause.INVALID_CRS_SYNTAX, e.cause()); + } + } + + @Test + public void anUnknownCodeIsDistinguishedFromMalformedInput() { + try { + Proj.createCrs("EPSG:99999"); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertEquals(ErrorCause.UNKNOWN_CRS, e.cause()); + } + } + + @Test + public void aCompoundNameIsRefusedByNameRatherThanSilentlyFlattened() { + try { + Proj.createCrs("EPSG:4326+5773"); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertEquals(ErrorCause.CRS_TYPE_NOT_SUPPORTED, e.cause()); + assertTrue("the message must point at the method that does work: " + e.getMessage(), + e.getMessage().contains("createCompound")); + } + } + + @Test + public void nullAndEmptyAreApiMisuseNotSyntaxErrors() { + try { + Proj.createCrs(null); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertEquals(ErrorCause.API_MISUSE, e.cause()); + } + try { + Proj.createCrs(" "); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertEquals(ErrorCause.INVALID_CRS_SYNTAX, e.cause()); + } + } + + // -------------------------------------------------------------------------------- the bulk API + + /** The batch path is the consumer's main performance need, so the facade must surface it. */ + @Test + public void theBulkApiIsReachableFromTheFacadeAndAgreesWithTheSinglePointPath() { + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633"); + double[] xy = {15.0, 50.0, 15.5, 50.5, 16.0, 51.0}; + byte[] status = new byte[3]; + assertEquals(0, op.bulk().transform2D(xy, 0, 3, 2, status)); + + double[] expected = new double[6]; + double[] input = {15.0, 50.0, 15.5, 50.5, 16.0, 51.0}; + for (int i = 0; i < 3; i++) { + ProjCoordinate out = op.transform(new ProjCoordinate(input[2 * i], input[2 * i + 1])); + expected[2 * i] = out.x; + expected[2 * i + 1] = out.y; + } + for (int i = 0; i < 6; i++) { + assertEquals("bulk and single-point must be bit-identical at ordinate " + i, + Double.doubleToLongBits(expected[i]), Double.doubleToLongBits(xy[i])); + } + } + + /** The reverse direction is a CRS swap and is subject to the same checks. */ + @Test + public void inverseIsSymmetricAndRoundTrips() { + CrsOperation forward = Proj.createCrsToCrs("EPSG:4326", "EPSG:32633"); + CrsOperation back = forward.inverse(); + assertEquals(forward.source(), back.target()); + assertEquals(forward.target(), back.source()); + + ProjCoordinate projected = forward.transform(new ProjCoordinate(15.0, 50.0)); + ProjCoordinate returned = back.transform(projected); + assertEquals(15.0, returned.x, 1e-9); + assertEquals(50.0, returned.y, 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/FakeProjDatabase.java b/core/src/test/java/org/locationtech/proj4j/api/FakeProjDatabase.java new file mode 100644 index 0000000..0c4119d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/FakeProjDatabase.java @@ -0,0 +1,659 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.locationtech.proj4j.spi.DbCelestialBody; +import org.locationtech.proj4j.spi.DbConversion; +import org.locationtech.proj4j.spi.DbCoordinateSystem; +import org.locationtech.proj4j.spi.DbCrs; +import org.locationtech.proj4j.spi.DbCrsType; +import org.locationtech.proj4j.spi.DbDatum; +import org.locationtech.proj4j.spi.DbEllipsoid; +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbGridAlternative; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbOperation; +import org.locationtech.proj4j.spi.DbPrimeMeridian; +import org.locationtech.proj4j.spi.DbSupersession; +import org.locationtech.proj4j.spi.DbUnit; +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * A {@link ProjDatabase} carrying a hand-transcribed slice of PROJ 9.8.1's real one. + * + *

Why a fake at all, when the real thing exists

+ * + *

Because ranking, {@link BallparkPolicy}, {@link GridPolicy}, {@link BestOperationPolicy} and + * what to throw are this library's policy, and the database has none. That split is the reason the + * SPI returns rows in {@code (kind, authority, code)} order and never by accuracy, and the payoff is + * exactly this: policy is testable against a few dozen transcribed rows in {@code core}, which has no + * {@code proj4j-db} on its classpath and must keep working without one. The real index is exercised + * end-to-end in {@code db/src/test}, where it lives. + * + *

Every row here is real, and here is how to re-verify it

+ * + *

Not one number below was invented or copied from Proj4J's own output. Each was read out of the + * Homebrew {@code proj 9.8.1} database and can be re-read: + * + *

+ * sqlite3 /opt/homebrew/share/proj/proj.db \
+ *   "select code,name,method_name,accuracy,grid_name,grid2_name from grid_transformation
+ *     where source_crs_code='4267' and target_crs_code='4269';"
+ * 
+ * + *

which returns exactly the nine rows {@link #nad27ToNad83()} carries, and + * + *

+ * projinfo -s EPSG:4267 -t EPSG:4269 --spatial-test intersects --summary
+ * 
+ * + *

which reports 10 candidate operations — those nine plus the ballpark offset that is + * synthesised rather than stored, and that has no row anywhere in the database. + * + *

Immutable after construction and safe for concurrent use, as the SPI requires. + */ +final class FakeProjDatabase implements ProjDatabase { + + private final String name; + private final Map metadata; + private final Map crss = new LinkedHashMap(); + private final Map coordinateSystems = + new LinkedHashMap(); + private final Map datums = new LinkedHashMap(); + private final Map ellipsoids = new LinkedHashMap(); + private final Map primeMeridians = + new LinkedHashMap(); + private final Map units = new LinkedHashMap(); + private final Map extents = new LinkedHashMap(); + private final Map alternatives = + new TreeMap(); + private final List operations = new ArrayList(); + private final Map> usage = + new LinkedHashMap>(); + private final Map> supersessions = + new LinkedHashMap>(); + + private FakeProjDatabase(String name) { + this.name = name; + TreeMap meta = new TreeMap(); + meta.put("PROJ.VERSION", "9.8.1"); + meta.put("EPSG.VERSION", "v12.029"); + meta.put("EPSG.DATE", "2026-02-27"); + meta.put("DATABASE.LAYOUT.VERSION.MAJOR", "1"); + meta.put("DATABASE.LAYOUT.VERSION.MINOR", "6"); + this.metadata = Collections.unmodifiableMap(meta); + } + + // ------------------------------------------------------------------ fixtures + + /** + * {@code EPSG:4267} and {@code EPSG:4269} with all nine published grid transformations + * between them, their real accuracies, their real grid names including every {@code grid2_name}, + * their real {@code grid_alternatives} rows and their real extents. + * + *

Note two things that are properties of the upstream data and not of this fixture: + *

    + *
  • {@code conus.los} has no {@code grid_alternatives} row. Only 1 of the 85 distinct + * {@code grid2_name}s upstream has one. That is why the second slot has to be satisfied through + * the first slot's file rather than resolved on its own.
  • + *
  • {@code EPSG:1243} and {@code EPSG:8549} have extents that cross the antimeridian + * ({@code west = 167.65}, {@code east = -129.99}). Normalising that would turn an Alaskan + * extent into an almost-global one, which would then win the area tier of every ranking.
  • + *
+ */ + static FakeProjDatabase nad27ToNad83() { + FakeProjDatabase db = new FakeProjDatabase("fake:nad27-to-nad83"); + db.commonObjects(); + + // grid_transformation, verbatim. Columns: code | name | method | accuracy | grid | grid2 + db.gridOp("1241", "NAD27 to NAD83 (1)", "9613", "NADCON", 0.15, + "conus.las", "conus.los", "4267", "4269", "2374"); + db.gridOp("1243", "NAD27 to NAD83 (2)", "9613", "NADCON", 0.5, + "alaska.las", "alaska.los", "4267", "4269", "2373"); + db.gridOp("1312", "NAD27 to NAD83 (3)", "9614", "NTv1", 2.0, + "NTv1_0.gsb", null, "4267", "4269", "4517"); + db.gridOp("1313", "NAD27 to NAD83 (4)", "9615", "NTv2", 1.5, + "NTv2_0.gsb", null, "4267", "4269", "4517"); + db.gridOp("1462", "NAD27 to NAD83 (5)", "9614", "NTv1", 2.0, + "GS2783v1.QUE", null, "4267", "4269", "1368"); + db.gridOp("1573", "NAD27 to NAD83 (6)", "9615", "NTv2", 1.5, + "NA27NA83.GSB", null, "4267", "4269", "1368"); + db.gridOp("8549", "NAD27 to NAD83 (8)", "1074", "NADCON5 (2D)", 0.5, + "nadcon5.nad27.nad83_1986.alaska.lat.trn.20160901.b", + "nadcon5.nad27.nad83_1986.alaska.lon.trn.20160901.b", "4267", "4269", "1330"); + db.gridOp("8555", "NAD27 to NAD83 (7)", "1074", "NADCON5 (2D)", 0.15, + "nadcon5.nad27.nad83_1986.conus.lat.trn.20160901.b", + "nadcon5.nad27.nad83_1986.conus.lon.trn.20160901.b", "4267", "4269", "4516"); + db.gridOp("9111", "NAD27 to NAD83 (9)", "9615", "NTv2", 1.5, + "SK27-83.gsb", null, "4267", "4269", "2375"); + + // grid_alternatives, verbatim. conus.los and alaska.los deliberately absent: they have no row. + db.alternative("conus.las", "us_noaa_conus.tif", "conus", "GTiff", "hgridshift"); + db.alternative("alaska.las", "us_noaa_alaska.tif", "alaska", "GTiff", "hgridshift"); + db.alternative("NTv1_0.gsb", "ca_nrc_ntv1_can.tif", "ntv1_can.dat", "GTiff", "hgridshift"); + db.alternative("NTv2_0.gsb", "ca_nrc_ntv2_0.tif", "ntv2_0.gsb", "GTiff", "hgridshift"); + db.alternative("NA27NA83.GSB", "ca_que_mern_na27na83.tif", "na27na83.gsb", "GTiff", + "hgridshift"); + // NADCON 5 maps to the unified operator, which Proj4J does not implement. This one row is why + // EPSG:8555 loses to EPSG:1241 despite being tied at 0.15 m and being what PROJ itself picks. + db.alternative("nadcon5.nad27.nad83_1986.conus.lat.trn.20160901.b", + "us_noaa_nadcon5_nad27_nad83_1986_conus.tif", null, "GTiff", "gridshift"); + db.alternative("nadcon5.nad27.nad83_1986.alaska.lat.trn.20160901.b", + "us_noaa_nadcon5_nad27_nad83_1986_alaska.tif", null, "GTiff", "gridshift"); + return db; + } + + /** + * The same nine operations, but with no {@code grid_alternatives} rows at all — the + * deployment in which the authority's own file names are the only ones there are. + * + *

This is what makes the {@code grid2_name} trap testable end to end: with no modern GeoTIFF to + * collapse the pair onto, {@code EPSG:1241} needs {@code conus.las} and {@code conus.los} + * as two separate files, and a message that named only the first would send a reader looking for + * one file when two are required. + */ + static FakeProjDatabase nad27ToNad83WithNoGridAlternatives() { + FakeProjDatabase db = FakeProjDatabase.nad27ToNad83(); + db.alternatives.clear(); + return db; + } + + /** + * The nine operations with {@code EPSG:1241} removed, so the best executable candidate becomes + * {@code EPSG:1243} "NAD27 to NAD83 (2)" at 0.5 m — a real NADCON pair needing + * {@code alaska.las} and {@code alaska.los}, whose files are genuinely absent from every + * deployment in this repository. + * + *

Why {@code EPSG:1243} rather than {@code EPSG:1241} for the missing-grid case: core's test + * classpath ships the real CTABLE V2 {@code conus} (264,424 B), which is exactly the file + * {@code conus.las}'s {@code grid_alternatives} row points at through + * {@code old_proj_grid_name}. So {@code EPSG:1241} is satisfiable here — that is + * what {@link OperationSelectionTest#withADatabaseTheNad27PairSelectsEpsg1241At015m} proves + * — and testing the unreachable case needs a pair whose files really are missing rather + * than a fixture rigged to pretend. {@code alaska} has no CTABLE V2 form on this classpath and no + * GeoTIFF either. The trap is identical: two authority slots, one of which a naive reader drops. + */ + static FakeProjDatabase nad27ToNad83WithoutConus() { + return FakeProjDatabase.nad27ToNad83().without("1241"); + } + + /** + * The nine operations with both of the ones this classpath can satisfy removed — + * {@code EPSG:1241} (whose {@code conus} is in core's test resources) and {@code EPSG:1312} (whose + * {@code ntv1_can.dat} arrives with {@code proj4j-epsg}). + * + *

What is left is the deployment the consumer actually reported: real published operations, real + * accuracies, and not one grid file present. The best executable candidate is then + * {@code EPSG:1243} at 0.5 m needing {@code alaska.las} and {@code alaska.los}, which is what + * makes this the fixture for "does the message name both files". + */ + static FakeProjDatabase nad27ToNad83WithNoReachableGrid() { + return FakeProjDatabase.nad27ToNad83().without("1241").without("1312"); + } + + private FakeProjDatabase without(String code) { + for (int i = operations.size() - 1; i >= 0; i--) { + if (code.equals(operations.get(i).code())) { + operations.remove(i); + } + } + return this; + } + + /** + * {@code EPSG:4326} to {@code EPSG:9057}: two members of the {@code EPSG:6326} datum + * ensemble, related by {@code PROJ:WGS84_TO_WGS84_G1762} at 2.0 m — the ensemble + * accuracy. + * + *

Verified with {@code projinfo -s EPSG:4326 -t EPSG:9057 --summary}, which reports exactly one + * candidate at 2.0 m, and {@code -o PROJ}, which gives {@code +proj=noop}. That pairing is the + * whole point: the operation is arithmetically a no-op, and it is not ballpark, because the + * authority publishes a bound for it. Treating {@code EPSG:6326} as an ordinary datum is + * how an ensemble-crossing pair loses that bound and becomes "accuracy unknown". + */ + static FakeProjDatabase wgs84Ensemble() { + FakeProjDatabase db = new FakeProjDatabase("fake:wgs84-ensemble"); + db.commonObjects(); + db.operations.add(new DbOperation(DbObjectType.HELMERT_TRANSFORMATION, "PROJ", + "WGS84_TO_WGS84_G1762", "WGS 84 to WGS 84 (G1762)", "EPSG", "9603", + "Geocentric translations (geog2D domain)", crsRef("4326"), crsRef("9057"), 2.0, + null, null, null, null, null, false)); + db.usage.put(new DbObjectRef(DbObjectType.HELMERT_TRANSFORMATION, "PROJ", + "WGS84_TO_WGS84_G1762"), + Collections.singletonList(new DbObjectRef(DbObjectType.EXTENT, "EPSG", "1262"))); + return db; + } + + /** + * {@code EPSG:4277} to {@code EPSG:4326}: {@code EPSG:7710} "OSGB36 to WGS 84 (9)", NTv2, + * 1.0 m, {@code OSTN15_NTv2_OSGBtoETRS.gsb}. + * + *

Reachable from a bare {@code +datum=OSGB36} through PROJ's own ten-entry {@code +datum=} table + * ({@code 9.8.1:src/iso19111/io.cpp}), which is the point: 1,962 lines of the shipped legacy + * dictionaries carry a {@code datum=}, so that table is the bridge between them and the + * authority database, not a corner case. + */ + static FakeProjDatabase osgb36() { + FakeProjDatabase db = new FakeProjDatabase("fake:osgb36"); + db.commonObjects(); + db.gridOp("7710", "OSGB36 to WGS 84 (9)", "9615", "NTv2", 1.0, + "OSTN15_NTv2_OSGBtoETRS.gsb", null, "4277", "4326", "4390"); + db.alternative("OSTN15_NTv2_OSGBtoETRS.gsb", "uk_os_OSTN15_NTv2_OSGBtoETRS.tif", + "OSTN15_NTv2_OSGBtoETRS.gsb", "GTiff", "hgridshift"); + return db; + } + + /** A database that knows the CRSs but publishes no operation at all between them. */ + static FakeProjDatabase noOperations() { + FakeProjDatabase db = new FakeProjDatabase("fake:no-operations"); + db.commonObjects(); + return db; + } + + /** + * The CRSs, coordinate systems, datums, ellipsoids, prime meridians, units and extents every + * fixture shares. All verbatim from the shipped database. + */ + private void commonObjects() { + // EPSG:6422 is (Geodetic latitude north, Geodetic longitude east) -- which is exactly why + // PROJ 6+ is latitude-first for EPSG:4326 and proj4j 1.4.3 is not. + coordinateSystems.put("EPSG:6422", new DbCoordinateSystem("EPSG", "6422", "ellipsoidal", 2, + Arrays.asList( + new org.locationtech.proj4j.spi.DbAxis("Geodetic latitude", "Lat", "north", 1, + unitRef("9122")), + new org.locationtech.proj4j.spi.DbAxis("Geodetic longitude", "Lon", "east", 2, + unitRef("9122"))))); + // EPSG:4400 is (Easting, Northing) and EPSG:4530 is (Northing, Easting) -- the pair that makes + // an authority-northing-first projected CRS look like a 4,652 km error when it is honoured on + // one side only. + coordinateSystems.put("EPSG:4400", new DbCoordinateSystem("EPSG", "4400", "Cartesian", 2, + Arrays.asList( + new org.locationtech.proj4j.spi.DbAxis("Easting", "E", "east", 1, + unitRef("9001")), + new org.locationtech.proj4j.spi.DbAxis("Northing", "N", "north", 2, + unitRef("9001"))))); + coordinateSystems.put("EPSG:4530", new DbCoordinateSystem("EPSG", "4530", "Cartesian", 2, + Arrays.asList( + new org.locationtech.proj4j.spi.DbAxis("Northing", "X", "north", 1, + unitRef("9001")), + new org.locationtech.proj4j.spi.DbAxis("Easting", "Y", "east", 2, + unitRef("9001"))))); + + crs("4267", "NAD27", "6267"); + crs("4269", "NAD83", "6269"); + crs("4277", "OSGB36", "6277"); + crs("4326", "WGS 84", "6326"); + crs("9057", "WGS 84 (G1762)", "1156"); + + datum("6267", "North American Datum 1927", "7008", Double.NaN, null); + datum("6269", "North American Datum 1983", "7019", Double.NaN, null); + datum("6277", "OSGB36", "7001", Double.NaN, null); + // The ensemble: 2.0 m, 8 members in authority sequence order. + datum("6326", "World Geodetic System 1984 ensemble", "7030", 2.0, + Arrays.asList(datumRef("1166"), datumRef("1152"), datumRef("1153"), + datumRef("1154"), datumRef("1155"), datumRef("1156"), datumRef("1309"), + datumRef("1383"))); + datum("1156", "World Geodetic System 1984 (G1762)", "7030", Double.NaN, null); + + ellipsoids.put("EPSG:7008", new DbEllipsoid("EPSG", "7008", "Clarke 1866", null, + 6378206.4, unitRef("9001"), Double.NaN, 6356583.8, false)); + ellipsoids.put("EPSG:7019", new DbEllipsoid("EPSG", "7019", "GRS 1980", null, + 6378137.0, unitRef("9001"), 298.257222101, Double.NaN, false)); + ellipsoids.put("EPSG:7001", new DbEllipsoid("EPSG", "7001", "Airy 1830", null, + 6377563.396, unitRef("9001"), 299.3249646, Double.NaN, false)); + ellipsoids.put("EPSG:7030", new DbEllipsoid("EPSG", "7030", "WGS 84", null, + 6378137.0, unitRef("9001"), 298.257223563, Double.NaN, false)); + + primeMeridians.put("EPSG:8901", + new DbPrimeMeridian("EPSG", "8901", "Greenwich", 0.0, unitRef("9102"), false)); + + units.put("EPSG:9001", new DbUnit("EPSG", "9001", "metre", DbUnit.Type.LENGTH, 1.0, "m", + false)); + units.put("EPSG:9102", new DbUnit("EPSG", "9102", "degree", DbUnit.Type.ANGLE, + Math.PI / 180.0, "deg", false)); + units.put("EPSG:9122", new DbUnit("EPSG", "9122", "degree (supplier to define " + + "representation)", DbUnit.Type.ANGLE, Math.PI / 180.0, "deg", false)); + + extent("2374", "USA - CONUS including EEZ", + "United States (USA) - CONUS including EEZ - onshore and offshore.", + -129.17, 23.81, -65.69, 49.38); + // Crosses the antimeridian. Not corrupt data. + extent("2373", "USA - Alaska including EEZ", "United States (USA) - Alaska including EEZ.", + 167.65, 47.88, -129.99, 74.71); + extent("1330", "USA - Alaska", "United States (USA) - Alaska.", + 172.42, 51.3, -129.99, 71.4); + extent("4516", "USA - CONUS and GoM", "United States (USA) - CONUS onshore and GoM OCS.", + -124.79, 23.82, -66.91, 49.38); + extent("4517", "Canada - NAD27", "Canada - onshore and offshore east coast.", + -141.01, 40.0, -44.0, 83.17); + extent("1368", "Canada - Quebec", "Canada - Quebec.", -79.85, 44.99, -57.1, 62.62); + extent("2375", "Canada - Saskatchewan", "Canada - Saskatchewan.", + -110.0, 49.0, -101.34, 60.01); + extent("4390", "UK - Britain and UKCS 49°45'N to 61°N, 9°W to 2°E", + "United Kingdom (UK) - offshore to boundary of UKCS; onshore Great Britain.", + -9.01, 49.75, 2.01, 61.01); + extent("1262", "World", "World.", -180.0, -90.0, 180.0, 90.0); + } + + // ------------------------------------------------------------------ row builders + + private void crs(String code, String name, String datumCode) { + crss.put("EPSG:" + code, new DbCrs(DbCrsType.GEOGRAPHIC_2D, "EPSG", code, name, false, + new DbObjectRef(DbObjectType.COORDINATE_SYSTEM, "EPSG", "6422"), + datumRef(datumCode), null, null, null, null, null)); + usage.put(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", code), + Collections.singletonList(new DbObjectRef(DbObjectType.EXTENT, "EPSG", "1262"))); + } + + private void datum(String code, String name, String ellipsoidCode, double ensembleAccuracy, + List members) { + datums.put("EPSG:" + code, new DbDatum(DbObjectType.GEODETIC_DATUM, "EPSG", code, name, + new DbObjectRef(DbObjectType.ELLIPSOID, "EPSG", ellipsoidCode), + new DbObjectRef(DbObjectType.PRIME_MERIDIAN, "EPSG", "8901"), null, Double.NaN, + ensembleAccuracy, members, false)); + } + + private void extent(String code, String name, String description, double west, double south, + double east, double north) { + extents.put("EPSG:" + code, + new DbExtent("EPSG", code, name, description, west, south, east, north, false)); + } + + private void gridOp(String code, String name, String methodCode, String methodName, + double accuracy, String grid1, String grid2, String srcCode, String tgtCode, + String extentCode) { + List grids = grid2 == null + ? Collections.singletonList(grid1) + : Arrays.asList(grid1, grid2); + operations.add(new DbOperation(DbObjectType.GRID_TRANSFORMATION, "EPSG", code, name, "EPSG", + methodCode, methodName, crsRef(srcCode), crsRef(tgtCode), accuracy, null, grids, + null, null, null, false)); + usage.put(new DbObjectRef(DbObjectType.GRID_TRANSFORMATION, "EPSG", code), + Collections.singletonList(new DbObjectRef(DbObjectType.EXTENT, "EPSG", extentCode))); + } + + private void alternative(String original, String modern, String legacy, String format, + String method) { + alternatives.put(original, new DbGridAlternative(original, modern, legacy, format, method, + false, "https://cdn.proj.org/" + modern, Boolean.TRUE, Boolean.TRUE, null)); + } + + private static DbObjectRef crsRef(String code) { + return new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", code); + } + + private static DbObjectRef datumRef(String code) { + return new DbObjectRef(DbObjectType.GEODETIC_DATUM, "EPSG", code); + } + + private static DbObjectRef unitRef(String code) { + return new DbObjectRef(DbObjectType.UNIT_OF_MEASURE, "EPSG", code); + } + + // ------------------------------------------------------------------ ProjDatabase + + @Override + public String name() { + return name; + } + + @Override + public Map metadata() { + return metadata; + } + + @Override + public SortedSet authorities() { + return Collections.unmodifiableSortedSet(new TreeSet(Arrays.asList("EPSG", "PROJ"))); + } + + @Override + public DbCrs crs(String authName, String code) { + return crss.get(authName + ":" + code); + } + + @Override + public List crsCodes(String authName) { + List out = new ArrayList(); + for (DbCrs c : crss.values()) { + if (authName == null || authName.equals(c.authName())) { + out.add(c.ref()); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + @Override + public DbCoordinateSystem coordinateSystem(String authName, String code) { + return coordinateSystems.get(authName + ":" + code); + } + + @Override + public DbDatum datum(DbObjectType type, String authName, String code) { + if (type != DbObjectType.GEODETIC_DATUM && type != DbObjectType.VERTICAL_DATUM) { + throw new IllegalArgumentException("not a datum type: " + type); + } + DbDatum found = datums.get(authName + ":" + code); + return found != null && found.type() == type ? found : null; + } + + @Override + public DbEllipsoid ellipsoid(String authName, String code) { + return ellipsoids.get(authName + ":" + code); + } + + @Override + public DbPrimeMeridian primeMeridian(String authName, String code) { + return primeMeridians.get(authName + ":" + code); + } + + @Override + public DbUnit unit(String authName, String code) { + return units.get(authName + ":" + code); + } + + @Override + public DbCelestialBody celestialBody(String authName, String code) { + return null; + } + + @Override + public List crsUsingDatum(DbObjectType datumType, String datumAuthName, + String datumCode) { + List out = new ArrayList(); + for (DbCrs c : crss.values()) { + DbObjectRef d = c.datum(); + if (d != null && d.authName().equals(datumAuthName) && d.code().equals(datumCode)) { + out.add(c.ref()); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + @Override + public DbConversion conversion(String authName, String code) { + return null; + } + + @Override + public DbOperation operation(String authName, String code) { + for (int i = 0; i < operations.size(); i++) { + DbOperation op = operations.get(i); + if (op.authName().equals(authName) && op.code().equals(code)) { + return op; + } + } + return null; + } + + /** + * Only the stored direction, exactly as the SPI specifies, and sorted by + * {@code (kind, authority, code)} rather than by accuracy. A fake that helpfully merged the two + * directions or pre-sorted by accuracy would test a database this library does not have, and would + * hide the very bug it exists to catch. + */ + @Override + public List operationsBetween(String srcAuthName, String srcCode, + String tgtAuthName, String tgtCode) { + List out = new ArrayList(); + for (int i = 0; i < operations.size(); i++) { + DbOperation op = operations.get(i); + if (op.sourceCrs() == null || op.targetCrs() == null) { + continue; + } + if (op.sourceCrs().authName().equals(srcAuthName) + && op.sourceCrs().code().equals(srcCode) + && op.targetCrs().authName().equals(tgtAuthName) + && op.targetCrs().code().equals(tgtCode)) { + out.add(op); + } + } + Collections.sort(out, new java.util.Comparator() { + @Override + public int compare(DbOperation a, DbOperation b) { + return a.ref().compareTo(b.ref()); + } + }); + return Collections.unmodifiableList(out); + } + + @Override + public List operationsWithSourceCrs(String authName, String code) { + List out = new ArrayList(); + for (int i = 0; i < operations.size(); i++) { + DbOperation op = operations.get(i); + if (op.sourceCrs() != null && op.sourceCrs().authName().equals(authName) + && op.sourceCrs().code().equals(code)) { + out.add(op.ref()); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + @Override + public List operationsWithTargetCrs(String authName, String code) { + List out = new ArrayList(); + for (int i = 0; i < operations.size(); i++) { + DbOperation op = operations.get(i); + if (op.targetCrs() != null && op.targetCrs().authName().equals(authName) + && op.targetCrs().code().equals(code)) { + out.add(op.ref()); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + @Override + public List extentsFor(DbObjectRef object) { + List refs = usage.get(object); + if (refs == null) { + return Collections.emptyList(); + } + List out = new ArrayList(refs.size()); + for (int i = 0; i < refs.size(); i++) { + DbExtent e = extents.get(refs.get(i).authName() + ":" + refs.get(i).code()); + if (e != null) { + out.add(e); + } + } + return Collections.unmodifiableList(out); + } + + @Override + public DbExtent extent(String authName, String code) { + return extents.get(authName + ":" + code); + } + + @Override + public List aliases(DbObjectRef object) { + return Collections.emptyList(); + } + + @Override + public List findCrsByName(String crsName) { + List out = new ArrayList(); + for (DbCrs c : crss.values()) { + if (c.name().equalsIgnoreCase(crsName)) { + out.add(c.ref()); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + @Override + public List supersededBy(DbObjectRef object) { + List rows = supersessions.get(object); + return rows == null ? Collections.emptyList() + : Collections.unmodifiableList(rows); + } + + @Override + public List replacementsFor(DbObjectRef object) { + return Collections.emptyList(); + } + + @Override + public DbGridAlternative gridAlternative(String originalGridName) { + return alternatives.get(originalGridName); + } + + @Override + public List gridAlternatives() { + return Collections.unmodifiableList( + new ArrayList(alternatives.values())); + } + + @Override + public void close() { + // Nothing to release. Idempotent, as the SPI requires. + } + + /** + * Records a {@code supersession} row, so the ranking rule that a superseded operation loses only to + * a replacement connecting the same CRS pair can be exercised. + */ + FakeProjDatabase superseded(DbObjectRef older, DbObjectRef replacement, + boolean sameSourceTargetCrs) { + List rows = supersessions.get(older); + if (rows == null) { + rows = new ArrayList(); + supersessions.put(older, rows); + } + rows.add(new DbSupersession(older, replacement, "EPSG", sameSourceTargetCrs)); + return this; + } + + /** A reference to one of this fixture's grid transformations, for {@link #superseded}. */ + static DbObjectRef gridTransformation(String code) { + return new DbObjectRef(DbObjectType.GRID_TRANSFORMATION, "EPSG", code); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/LegacyApiUnchangedTest.java b/core/src/test/java/org/locationtech/proj4j/api/LegacyApiUnchangedTest.java new file mode 100644 index 0000000..c3bb86d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/LegacyApiUnchangedTest.java @@ -0,0 +1,229 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; + +/** + * The frozen-API promise, as a test rather than a comment. + * + *

The new facade makes a choice the legacy API must not inherit: it refuses {@code EPSG:4267} to + * {@code EPSG:4269} because the datum shift cannot be performed. Imposing that on + * {@link CoordinateTransformFactory} would make GeoTools, GeoServer and geomesa start throwing + * on code that has worked for fifteen years, in a library most of them reach transitively and did not + * choose. + * + *

So every assertion here is of the form "the 1.x path still does exactly what it did". The whole + * file exists to fail loudly if someone ever decides the strict default is too good not to share. + */ +public class LegacyApiUnchangedTest { + + private static final double LON = -122.4; + private static final double LAT = 37.8; + + /** + * The single most important assertion in this package: the pair the new API refuses is still + * transformed, without complaint, by the old one. + */ + @Test + public void theLegacyFactoryStillTransformsThePairTheFacadeRefuses() { + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem nad27 = f.createFromName("EPSG:4267"); + CoordinateReferenceSystem nad83 = f.createFromName("EPSG:4269"); + + // The facade refuses. + try { + Proj.createCrsToCrs("EPSG:4267", "EPSG:4269"); + fail("the facade is supposed to refuse this pair"); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + } + + // The legacy API does not, and must not. + CoordinateTransform t = new CoordinateTransformFactory().createTransform(nad27, nad83); + ProjCoordinate out = t.transform(new ProjCoordinate(LON, LAT), new ProjCoordinate()); + assertTrue("the legacy path must still return a coordinate, unchanged from 1.4.3", + out.hasValidXandYOrdinates()); + } + + /** + * Not merely "does not throw": the legacy factory returns the same object type built the same + * way, so its numbers are bit-identical to a directly constructed + * {@link BasicCoordinateTransform}. Any re-routing at all would break this. + */ + @Test + public void theLegacyFactoryIsNotReRoutedThroughTheFacade() { + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem src = f.createFromName("EPSG:4267"); + CoordinateReferenceSystem tgt = f.createFromName("EPSG:4269"); + + CoordinateTransform viaFactory = new CoordinateTransformFactory().createTransform(src, tgt); + assertTrue("createTransform must still return a BasicCoordinateTransform", + viaFactory instanceof BasicCoordinateTransform); + + ProjCoordinate a = viaFactory.transform(new ProjCoordinate(LON, LAT), new ProjCoordinate()); + ProjCoordinate b = new BasicCoordinateTransform(src, tgt) + .transform(new ProjCoordinate(LON, LAT), new ProjCoordinate()); + + assertEquals(Double.doubleToLongBits(b.x), Double.doubleToLongBits(a.x)); + assertEquals(Double.doubleToLongBits(b.y), Double.doubleToLongBits(a.y)); + assertEquals(Double.doubleToLongBits(b.z), Double.doubleToLongBits(a.z)); + } + + /** + * A missing {@code @}-optional grid is still skipped silently on the legacy path. This is the + * behaviour the new API considers a defect, and it is preserved here on purpose: changing it + * would change the answer for every existing NAD27 caller. + */ + @Test + public void theLegacyPathStillSkipsAMissingOptionalGridSilently() { + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem src = + f.createFromParameters("src", "+proj=longlat +ellps=clrk66 " + + "+nadgrids=@nosuchgrid.gsb"); + CoordinateReferenceSystem tgt = f.createFromName("EPSG:4326"); + CoordinateTransform t = new CoordinateTransformFactory().createTransform(src, tgt); + ProjCoordinate out = t.transform(new ProjCoordinate(LON, LAT), new ProjCoordinate()); + assertTrue("1.4.3 returned a coordinate here and so must this", out.hasValidXandYOrdinates()); + } + + /** + * {@link CRSFactory} is untouched by anything the facade does, including by the facade having + * already built CRSs under {@link AxisOrderPolicy#AUTHORITY}. A policy that leaked into the + * legacy factory would transpose coordinates for callers who never opted in -- the exact failure + * this design is built to prevent. + */ + @Test + public void theLegacyFactoryIsUnaffectedByFacadeUsage() { + // Do the most policy-laden thing the facade offers, first. + ProjContext authority = ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.AUTHORITY) + .ballparkPolicy(BallparkPolicy.ALLOW) + .gridPolicy(GridPolicy.PROJ4_COMPAT) + .build(); + Crs flipped = Proj.createCrs("EPSG:4326", authority); + assertEquals("neu", flipped.axisOrder()); + + // Now the legacy path, which must be entirely unaware of it. + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem legacy4326 = f.createFromName("EPSG:4326"); + assertArrayEquals(new String[]{"+proj=longlat", "+datum=WGS84", "+no_defs"}, + legacy4326.getParameters()); + + CoordinateTransform t = new CoordinateTransformFactory() + .createTransform(legacy4326, f.createFromName("EPSG:3857")); + ProjCoordinate out = t.transform(new ProjCoordinate(LON, LAT), new ProjCoordinate()); + assertTrue("the legacy path must still consume (lon, lat): easting was " + out.x, + out.x < -1.3e7); + } + + /** The default {@link CoordinateTransformFactory} constructor's behaviour is unchanged. */ + @Test + public void theLegacyFactoryDefaultsAreUnchanged() { + CoordinateTransformFactory f = new CoordinateTransformFactory(); + assertEquals(org.locationtech.proj4j.DomainErrorPolicy.THROW, f.getDomainErrorPolicy()); + assertFalse("CoordinateTransformFactory must not be deprecated in 1.5.0: a deprecation " + + "warning on a class nobody needs to migrate away from is noise", + CoordinateTransformFactory.class.isAnnotationPresent(Deprecated.class)); + assertFalse(CRSFactory.class.isAnnotationPresent(Deprecated.class)); + assertFalse(CoordinateTransform.class.isAnnotationPresent(Deprecated.class)); + assertFalse(CoordinateReferenceSystem.class.isAnnotationPresent(Deprecated.class)); + assertFalse(ProjCoordinate.class.isAnnotationPresent(Deprecated.class)); + } + + // ------------------------------------------------------------------------- the opt-in bridge + + /** + * The bridge is the whole point: the same interface, the strict behaviour, and it has to be + * asked for by name. + */ + @Test + public void theBridgeIsStrictAndIsOptIn() { + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem src = f.createFromName("EPSG:4267"); + CoordinateReferenceSystem tgt = f.createFromName("EPSG:4269"); + + CoordinateTransformFactory bridge = LegacyAdapters.transformFactory(ProjContext.DEFAULT); + try { + bridge.createTransform(src, tgt); + fail("LegacyAdapters.transformFactory must apply BallparkPolicy"); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + } + + // ...and the plain factory, constructed on the very next line, still does not. + assertTrue(new CoordinateTransformFactory().createTransform(src, tgt) + .transform(new ProjCoordinate(LON, LAT), new ProjCoordinate()) + .hasValidXandYOrdinates()); + } + + /** The bridge is assignable to the legacy type, which is what makes it a one-line change. */ + @Test + public void theBridgeIsACoordinateTransformFactory() { + CoordinateTransformFactory factory = LegacyAdapters.transformFactory(null); + assertTrue(factory instanceof CoordinateTransformFactory); + CoordinateTransform t = factory.createTransform( + new CRSFactory().createFromName("EPSG:4326"), + new CRSFactory().createFromName("EPSG:32633")); + assertTrue(t.transform(new ProjCoordinate(15.0, 50.0), new ProjCoordinate()) + .hasValidXandYOrdinates()); + } + + /** + * {@link Crs#asLegacy()} hands out a fresh object every time, because + * {@code proj4j-geoapi}'s parameter wrappers write back into a live {@code Projection} and a + * shared one would be mutable through them. + */ + @Test + public void asLegacyReturnsAFreshInstanceEachCall() { + Crs crs = Proj.createCrs("EPSG:4326"); + CoordinateReferenceSystem a = crs.asLegacy(); + CoordinateReferenceSystem b = crs.asLegacy(); + assertNotSame(a, b); + assertEquals(a, b); + assertArrayEquals(a.getParameters(), b.getParameters()); + } + + /** Adapting a legacy CRS in must not re-derive its axis order behind its owner's back. */ + @Test + public void fromLegacyDoesNotTransposeSomebodyElsesCrs() { + CoordinateReferenceSystem legacy = new CRSFactory().createFromName("EPSG:4326"); + ProjContext authority = ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.AUTHORITY).build(); + Crs wrapped = LegacyAdapters.fromLegacy(legacy, authority); + assertEquals("enu", wrapped.axisOrder()); + assertFalse(wrapped.isLatitudeFirst()); + assertTrue(wrapped.axisOrderNote(), + wrapped.axisOrderNote().contains("deliberately not re-derived")); + assertEquals(Crs.Source.LEGACY_OBJECT, wrapped.source()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/OperationSelectionTest.java b/core/src/test/java/org/locationtech/proj4j/api/OperationSelectionTest.java new file mode 100644 index 0000000..18279e4 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/OperationSelectionTest.java @@ -0,0 +1,946 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Real coordinate-operation selection: the authority's offer, made visible, ranked, and either chosen + * or refused with the reason named. + * + *

The defect this file exists for

+ * + *

{@code EPSG:4267} to {@code EPSG:4269} returned the input unchanged — 95.573 m + * out at San Francisco, finite, plausible, and unwarned. The facade's first answer to that was to throw + * {@link ErrorCause#BALLPARK_REJECTED}, and that is correct without a database: with no way to + * see what the authority publishes, "I will not vouch for this" is the only honest reply. + * + *

But the authority publishes nine grid transformations for that pair, accuracies 0.15 m + * to 2.0 m, and not one of them is ballpark. So the defect was never "the authority offers + * nothing"; it was that Proj4J could not see the offer. With a database present, + * {@code BALLPARK_REJECTED} becomes the wrong answer, and the right one is + * {@code EPSG:1241} "NAD27 to NAD83 (1)" at 0.15 m — or + * {@link ErrorCause#BEST_OPERATION_UNAVAILABLE} naming the files when its grids are absent. + * + *

Both halves of that are asserted here, in the same file, because the pair of them is the claim. + * + *

Where the numbers come from

+ * + *

Every accuracy, grid name, extent and method below was read out of PROJ 9.8.1's own database and + * cross-checked against {@code projinfo} 9.8.1 — never against Proj4J's output, which would agree + * by construction. See {@link FakeProjDatabase} for the queries. + */ +public class OperationSelectionTest { + + /** San Francisco. Deliberately not near (0, 0) and deliberately inside CONUS. */ + private static final double LON = -122.4; + private static final double LAT = 37.8; + + private static ProjContext withDatabase(FakeProjDatabase db) { + return ProjContext.builder().database(db).build(); + } + + // ------------------------------------------------------------------ 1. the headline + + /** + * The headline assertion. With the authority database present, {@code EPSG:4267} to + * {@code EPSG:4269} selects {@code EPSG:1241} "NAD27 to NAD83 (1)" at 0.15 m. + * + *

Not ballpark, and that is a separate claim worth making explicitly: nine operations exist and + * none of them is a ballpark offset, so an answer of "ballpark" here would misdescribe the data as + * well as failing the caller. + */ + @Test + public void withADatabaseTheNad27PairSelectsEpsg1241At015m() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + + assertTrue("an operation must have been selected: " + op.describe(), + op.selectedOperation().isPresent()); + assertEquals("EPSG:1241", op.selectedOperation().get().authorityCode()); + assertEquals("NAD27 to NAD83 (1)", op.selectedOperation().get().name()); + assertTrue("the selected operation must carry the authority's accuracy: " + op.describe(), + op.accuracy().isPresent()); + assertEquals(0.15, op.accuracy().get().metres(), 0.0); + assertEquals("the accuracy must be attributed to the operation it came from", + "EPSG:1241", op.accuracy().get().source()); + + assertFalse("nine operations exist and not one is ballpark, so this must not be reported as " + + "ballpark: " + op.describe(), op.isBallparkTransformation()); + assertFalse(op.ballparkReason().isPresent()); + + // Selection is not merely metadata: it is ranked first, and the ranking is reported. + assertEquals(0, op.selectedOperation().get().rank()); + assertTrue(op.selectedOperation().get().isUsable()); + assertEquals(CrsOperationCandidate.Rejection.NONE, + op.selectedOperation().get().rejection()); + + // And the transformation still works, with all-finite output. + assertTrue(op.transform(new ProjCoordinate(LON, LAT)).hasValidXandYOrdinates()); + } + + /** + * The other half of the headline. Without a database the same pair must still throw + * {@link ErrorCause#BALLPARK_REJECTED}, by the legacy rule (c). + * + *

This is not a weaker version of the test above; it is the statement that the two answers are + * both right, for different deployments. {@link BallparkPolicyTest} pins the same thing from the + * policy side and must also stay green. + */ + @Test + public void withoutADatabaseTheNad27PairStillThrowsBallparkRejected() { + assertFalse("this test is only meaningful with no database configured", + ProjContext.DEFAULT.hasDatabase()); + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269"); + fail("expected BALLPARK_REJECTED with no database, got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + } + } + + /** + * The two answers differ only because of the database, and nothing else about the + * deployment. Same classpath, same resolver chain, same policies, same process, one call apart. + */ + @Test + public void theDatabaseIsTheOnlyDifferenceBetweenTheTwoAnswers() { + ProjContext without = ProjContext.builder().build(); + ProjContext with = without.withDatabase(FakeProjDatabase.nad27ToNad83()); + assertEquals("the two contexts must differ in nothing but the database", + without.ballparkPolicy(), with.ballparkPolicy()); + assertEquals(without.gridPolicy(), with.gridPolicy()); + assertEquals(without.bestOperationPolicy(), with.bestOperationPolicy()); + assertEquals(without.axisOrderPolicy(), with.axisOrderPolicy()); + + try { + Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", without); + fail("expected BALLPARK_REJECTED without the database"); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + } + assertEquals("EPSG:1241", Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", with) + .selectedOperation().get().authorityCode()); + } + + // ------------------------------------------------------------------ 2. grid2_name + + /** + * The trap: {@code EPSG:1241} needs TWO grids, and both are reported. + * + *

NADCON splits the latitude and longitude shifts across a {@code .las}/{@code .los} pair, and + * 150 of the shipped database's 1,062 grid transformations have a {@code grid2_name}. A selector + * that reads only {@code grid_name} applies half the shift and reports success — + * metre-scale, on the single most important transformation in the consumer's workload. + */ + @Test + public void aCandidateNeedingGrid2NameReportsBothFiles() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + List candidates = + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx); + + CrsOperationCandidate epsg1241 = byCode(candidates, "EPSG:1241"); + assertEquals("EPSG:1241 requires two grid files, not one", 2, epsg1241.grids().size()); + assertEquals("conus.las", epsg1241.grids().get(0).name()); + assertEquals("conus.los", epsg1241.grids().get(1).name()); + assertEquals(1, epsg1241.grids().get(0).slot().getAsInt()); + assertEquals("the second slot must be numbered, not folded into the first", + 2, epsg1241.grids().get(1).slot().getAsInt()); + + String described = epsg1241.describe(); + assertTrue("describe() must name both files: " + described, described.contains("conus.las")); + assertTrue("describe() must name both files: " + described, described.contains("conus.los")); + assertTrue("describe() must say how many the authority requires: " + described, + described.contains("grids required by the authority (2)")); + } + + /** + * The second slot is satisfied by the first slot's file, and that substitution is reported + * rather than performed silently. + * + *

This is PROJ's own collapse: {@code substitutePROJAlternativeGridNames} looks up + * {@code grid_alternatives} for the latitude file alone and, when the modern form is a GeoTIFF, + * replaces the whole pair with that one file. Upstream has a row for {@code conus.las} and + * none for {@code conus.los} — only 1 of the 85 distinct {@code grid2_name}s has one + * — so a reader that resolved slot 2 independently would report every NADCON operation + * unusable. Two authority slots, one file, and both facts visible. + */ + @Test + public void theSecondSlotIsSatisfiedByTheFirstSlotsFileAndSaysSo() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + CrsOperationCandidate epsg1241 = byCode( + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx), "EPSG:1241"); + + GridInfo slot1 = epsg1241.grids().get(0); + GridInfo slot2 = epsg1241.grids().get(1); + assertTrue("core's test classpath ships the real CTABLE V2 conus, so slot 1 must resolve: " + + slot1.describe(), slot1.isAvailable()); + assertTrue("two slots satisfied by one file cannot disagree about whether it exists", + slot2.isAvailable()); + + assertTrue("the substitution must be stated: " + slot2.describe(), + slot2.satisfiedBy().isPresent()); + assertTrue("it must name the file that actually satisfied it: " + slot2.satisfiedBy().get(), + slot2.satisfiedBy().get().startsWith("conus ")); + assertTrue("and say why one file covers two slots: " + slot2.satisfiedBy().get(), + slot2.satisfiedBy().get().contains("both the latitude and the longitude shift")); + + // The collapse must follow whatever slot 1 actually resolved to, not the modern name it might + // have. proj4j-grids-us-legacy ships the CTABLE V2 `conus`, which carries both components too; + // hard-coding us_noaa_conus.tif here would report EPSG:1241 unusable on that deployment. + assertTrue("the probe order must try the modern name first: " + slot1.probedNames(), + slot1.probedNames().indexOf("us_noaa_conus.tif") == 0); + assertTrue(slot1.probedNames().contains("conus")); + assertTrue(slot1.probedNames().contains("conus.las")); + } + + /** + * {@link ErrorCause#BEST_OPERATION_UNAVAILABLE} names the missing files — both of + * them. + * + *

{@code EPSG:1243} "NAD27 to NAD83 (2)" is a real NADCON pair needing {@code alaska.las} and + * {@code alaska.los}, and neither file exists anywhere on this classpath. A message naming only + * {@code alaska.las} would send a reader looking for one file when the authority requires two, and + * this test is the reason that cannot regress silently. + * + *

Note the cause: not {@code BALLPARK_REJECTED}. The authority does publish a real + * operation for this pair; what is missing is a data file. Those are different problems with + * different fixes, and reporting the first as the second is what sent everyone looking in the + * wrong place for fifteen years. + */ + @Test + public void bestOperationUnavailableNamesBothMissingGridFiles() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83WithNoReachableGrid()); + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + fail("expected BEST_OPERATION_UNAVAILABLE, got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals("the authority publishes a real operation; only the file is missing, so " + + "this must not be reported as a ballpark rejection", + ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + String m = expected.getMessage(); + assertTrue("must name the first grid: " + m, m.contains("alaska.las")); + assertTrue("must name the SECOND grid too, or half a shift looks like a whole one: " + m, + m.contains("alaska.los")); + assertTrue("must name the operation that was wanted: " + m, m.contains("EPSG:1243")); + assertTrue("must name it in words, not only by code: " + m, + m.contains("NAD27 to NAD83 (2)")); + assertTrue("must quote the accuracy that is being given up: " + m, m.contains("0.5")); + assertTrue("must say explicitly that this is not a ballpark rejection: " + m, + m.contains("NOT a ballpark rejection")); + assertTrue("must explain why two files: " + m, + m.contains("NADCON splits the latitude and longitude shifts")); + assertTrue("must say that adding the grid fixes it: " + m, + m.contains("Add the grid and this call succeeds")); + assertTrue("must list every name that was tried, so a reader knows what to install: " + m, + m.contains("us_noaa_alaska.tif")); + } + } + + /** + * {@link CrsOperationCandidate#missingGrids()} carries both files too, so a caller that catches + * nothing and merely inspects still sees the pair. + */ + @Test + public void missingGridsOnTheCandidateCarriesBothSlots() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83WithNoReachableGrid()); + CrsOperationCandidate epsg1243 = byCode( + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx), "EPSG:1243"); + assertEquals(CrsOperationCandidate.Rejection.MISSING_GRID, epsg1243.rejection()); + assertEquals("both slots are missing, and both are listed", 2, + epsg1243.missingGrids().size()); + assertEquals("alaska.las", epsg1243.missingGrids().get(0).name()); + assertEquals("alaska.los", epsg1243.missingGrids().get(1).name()); + assertTrue("the reason must name both: " + epsg1243.rejectionReason().get(), + epsg1243.rejectionReason().get().contains("alaska.las") + && epsg1243.rejectionReason().get().contains("alaska.los")); + } + + /** + * With no {@code grid_alternatives} row at all the authority's own two file names are the + * only ones there are, and both are still named — but the failure is + * {@link ErrorCause#UNSUPPORTED_OPERATION_METHOD}, not a missing grid, because without that row + * there is no PROJ operator to map the grid to either. + * + *

Proj4J will not infer the operator from a {@code .las} extension. That inference is how a + * latitude-difference file gets fed to a vertical shift, and the resulting coordinate is finite and + * plausible. + */ + @Test + public void withNoGridAlternativesRowBothAuthorityNamesAreStillNamed() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83WithNoGridAlternatives()); + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + fail("expected UNSUPPORTED_OPERATION_METHOD, got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.UNSUPPORTED_OPERATION_METHOD, expected.cause()); + String m = expected.getMessage(); + assertTrue("must still name both authority files: " + m, m.contains("conus.las")); + assertTrue("must still name both authority files: " + m, m.contains("conus.los")); + assertTrue("must say what is actually wrong -- no operator mapping: " + m, + m.contains("no grid_alternatives row")); + assertTrue("must refuse to guess the operator from the file name: " + m, + m.contains("will not guess which operator a grid feeds")); + assertTrue("must say that adding a file will NOT help, unlike a missing grid: " + m, + m.contains("Nothing you add to the classpath will change it")); + } + } + + // ------------------------------------------------------------------ 3. the ensemble + + /** + * {@code EPSG:6326}'s ensemble accuracy survives. + * + *

{@code EPSG:4326} to {@code EPSG:9057} crosses from the WGS 84 ensemble to one of its + * eight members. {@code projinfo -s EPSG:4326 -t EPSG:9057 --summary} reports exactly one + * candidate, {@code PROJ:WGS84_TO_WGS84_G1762} at 2.0 m, and {@code -o PROJ} gives + * {@code +proj=noop}. + * + *

That pairing is the whole point and it is why an ensemble is not an ordinary datum: the + * operation is arithmetically a no-op, and it is not ballpark, because the authority + * publishes a bound of 2.0 m for it. Treating {@code EPSG:6326} as an ordinary datum loses + * that bound and turns a bounded 2 m into "accuracy unknown", which is a different and much weaker + * claim. + */ + @Test + public void theWgs84EnsembleAccuracySurvivesAnEnsembleCrossingPair() { + ProjContext ctx = withDatabase(FakeProjDatabase.wgs84Ensemble()); + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:9057", ctx); + + assertTrue(op.selectedOperation().isPresent()); + assertEquals("PROJ:WGS84_TO_WGS84_G1762", op.selectedOperation().get().authorityCode()); + assertTrue("the ensemble bound must survive as a stated accuracy: " + op.describe(), + op.accuracy().isPresent()); + assertEquals(2.0, op.accuracy().get().metres(), 0.0); + assertFalse("a no-op with a published 2 m bound is NOT ballpark: an ensemble member offset " + + "has an accuracy and a ballpark offset never does", op.isBallparkTransformation()); + } + + /** + * The ensemble itself is readable through the SPI, with its accuracy and its members in the + * authority's own sequence order. + */ + @Test + public void theEnsembleIsVisibleAsAnEnsembleWithItsEightMembers() { + FakeProjDatabase db = FakeProjDatabase.wgs84Ensemble(); + org.locationtech.proj4j.spi.DbDatum ensemble = db.datum( + org.locationtech.proj4j.spi.DbObjectType.GEODETIC_DATUM, "EPSG", "6326"); + assertNotNull(ensemble); + assertTrue("EPSG:6326 is a datum ensemble, not an ordinary datum", ensemble.isEnsemble()); + assertEquals(2.0, ensemble.ensembleAccuracy(), 0.0); + assertEquals("eight members, in authority sequence order", 8, + ensemble.ensembleMembers().size()); + assertEquals("EPSG:1166", ensemble.ensembleMembers().get(0).authorityCode()); + assertEquals("EPSG:1383", ensemble.ensembleMembers().get(7).authorityCode()); + } + + // ------------------------------------------------------------------ 4. ranking + + /** + * All ten candidates are enumerated: the nine the authority publishes plus the ballpark offset, + * which is synthesised because the database contains no ballpark row at all. + * + *

Ten is {@code projinfo}'s own count for this pair. + */ + @Test + public void allNinePublishedOperationsPlusASynthesisedBallparkAreEnumerated() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + List candidates = + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx); + assertEquals("nine published plus one synthesised ballpark, which is projinfo's count too", + 10, candidates.size()); + + int ballparks = 0; + int published = 0; + for (int i = 0; i < candidates.size(); i++) { + if (candidates.get(i).isSynthesisedBallpark()) { + ballparks++; + } else { + published++; + assertFalse("not one of the nine published operations is ballpark: " + + candidates.get(i), candidates.get(i).isBallpark()); + } + } + assertEquals(9, published); + assertEquals(1, ballparks); + } + + /** + * The ranking is a total order: shuffling the input and re-sorting reproduces it exactly. + * + *

Not a nicety. The database returns rows in {@code (kind, authority, code)} order, and if any + * tier left two candidates tied the result would depend on which index a row was found through, + * which differs between builds. Two Spark executors would then select different operations from the + * same data. + */ + @Test + public void theRankingIsATotalOrderAndCannotDependOnInputOrder() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + List ranked = + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx); + + List shuffled = new ArrayList(ranked); + Collections.reverse(shuffled); + Collections.sort(shuffled); + List a = codes(ranked); + List b = codes(shuffled); + assertEquals("reversing then re-sorting must reproduce the ranking exactly", a, b); + + // No two candidates may compare equal, or a tie has been left to luck. + for (int i = 0; i < ranked.size(); i++) { + for (int j = i + 1; j < ranked.size(); j++) { + assertFalse(ranked.get(i) + " and " + ranked.get(j) + " compare equal, so their " + + "order depends on the sort's stability rather than on the data", + ranked.get(i).compareTo(ranked.get(j)) == 0); + } + } + // Ranks are dense and ascending. + for (int i = 0; i < ranked.size(); i++) { + assertEquals(i, ranked.get(i).rank()); + } + } + + /** + * The usability tier is ordered by what a caller can do about it: usable, then + * fixable-by-adding-a-file, then a capability boundary, then ballpark. + * + *

On core's test classpath the real CTABLE V2 {@code conus} is present and + * {@code ntv1_can.dat} arrives with {@code proj4j-epsg}, so exactly two of the nine are usable, and + * the 0.15 m one wins. + */ + @Test + public void candidatesAreRankedByWhatACallerCanDoAboutThem() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + List ranked = + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx); + + assertEquals("EPSG:1241", ranked.get(0).authorityCode()); + assertEquals(0.15, ranked.get(0).accuracy().get().metres(), 0.0); + assertTrue(ranked.get(0).isUsable()); + + // A usable 2.0 m operation outranks an unavailable 0.5 m one, because it is the one you can + // have. Whether choosing it is a *degradation* is a separate question about accuracy. + assertEquals("EPSG:1312", ranked.get(1).authorityCode()); + assertEquals(2.0, ranked.get(1).accuracy().get().metres(), 0.0); + assertTrue(ranked.get(1).isUsable()); + + // The ballpark offset is last of all: executable, and useless. + assertTrue(ranked.get(ranked.size() - 1).isSynthesisedBallpark()); + + // Tier boundaries, in order. + assertEquals(CrsOperationCandidate.Rejection.MISSING_GRID, ranked.get(2).rejection()); + int firstUnsupported = -1; + for (int i = 0; i < ranked.size(); i++) { + if (ranked.get(i).rejection() + == CrsOperationCandidate.Rejection.UNSUPPORTED_METHOD) { + firstUnsupported = i; + break; + } + } + assertTrue("the two NADCON 5 operations must be present and rejected for method", + firstUnsupported > 0); + for (int i = 0; i < firstUnsupported; i++) { + assertFalse("no missing-grid or usable candidate may sort below an unsupported one", + ranked.get(i).rejection() + == CrsOperationCandidate.Rejection.UNSUPPORTED_METHOD); + } + } + + /** + * Proj4J selects {@code EPSG:1241} where PROJ 9.8.1 selects {@code EPSG:8555}, and the reason is + * a capability boundary, not a disagreement about the data. + * + *

The two are tied at 0.15 m. {@code EPSG:8555} is NADCON 5, whose {@code grid_alternatives} + * row maps it to the unified {@code +proj=gridshift} operator; Proj4J implements + * {@code +proj=hgridshift} and not that one. So {@code EPSG:8555} is visible, ranked, and rejected + * by name, which is what makes the divergence auditable rather than mysterious. + * + *

A tie is also not a degradation, so {@link BestOperationPolicy#REQUIRE_BEST} has nothing to + * refuse here — and it must not refuse, or the default policy would reject the pair outright + * and be a worse answer than either operation. + */ + @Test + public void theNadcon5TieIsRejectedByNameAndIsNotTreatedAsADegradation() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + List candidates = + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx); + + CrsOperationCandidate nadcon5 = byCode(candidates, "EPSG:8555"); + assertEquals("tied with EPSG:1241 on accuracy", 0.15, nadcon5.accuracy().get().metres(), 0.0); + assertEquals(CrsOperationCandidate.Rejection.UNSUPPORTED_METHOD, nadcon5.rejection()); + String why = nadcon5.rejectionReason().get(); + assertTrue("the unimplemented operator must be named: " + why, + why.contains("+proj=gridshift")); + assertTrue("and the one that IS implemented, so the boundary is legible: " + why, + why.contains("+proj=hgridshift")); + + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + assertEquals("REQUIRE_BEST is in force and must not refuse a tie", + BestOperationPolicy.REQUIRE_BEST, op.context().bestOperationPolicy()); + assertEquals("EPSG:1241", op.selectedOperation().get().authorityCode()); + assertTrue("the skipped tie must be on the record rather than silent: " + op.warnings(), + containing(op.warnings(), "EPSG:8555")); + assertTrue("and must say it is not a degradation: " + op.warnings(), + containing(op.warnings(), "no more accurate than the operation that was selected")); + } + + /** + * An extent that wraps through 180° must not out-rank a small one by accident. + * + *

{@code EPSG:1243} and {@code EPSG:8549} declare Alaskan extents with + * {@code west = 167.65, east = -129.99}. Normalising that into a single interval turns a 62° + * span into a 298° one, which would then lose every area comparison it should win — or + * win every one it should lose, depending on which way the mistake goes. + */ + @Test + public void antimeridianExtentsRankByTheirRealSpan() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + CrsOperationCandidate alaska = byCode( + Proj.candidateOperations("EPSG:4267", "EPSG:4269", ctx), "EPSG:1243"); + assertTrue(alaska.areaOfUse().isPresent()); + AreaOfUse area = alaska.areaOfUse().get(); + assertTrue("west 167.65 > east -129.99 is antimeridian wrap, not corruption", + area.crossesAntimeridian()); + assertTrue("and the extent must be database-derived, not a document's assertion", + area.isDatabaseDerived()); + assertTrue("it must contain a point on the far side of 180", area.contains(179.0, 60.0)); + assertTrue(area.contains(-170.0, 60.0)); + assertFalse("and must NOT contain the Atlantic", area.contains(-40.0, 60.0)); + } + + // ------------------------------------------------------------------ 5. the policies + + /** + * {@link BestOperationPolicy#REQUIRE_BEST} refuses a strict loss of accuracy, and + * {@link BestOperationPolicy#ALLOW_DEGRADED} accepts it with the loss recorded. + * + *

Exercised on {@code EPSG:4277 -> EPSG:4326}, where {@code EPSG:7710} at 1.0 m is the only + * published operation and its grid is genuinely absent from every deployment in this repository. + */ + @Test + public void requireBestRefusesAndAllowDegradedProceeds() { + ProjContext strict = withDatabase(FakeProjDatabase.osgb36()); + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4277", "EPSG:4326", strict); + fail("expected a refusal: EPSG:7710's grid is not on this classpath. Got: " + + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + String m = expected.getMessage(); + assertTrue("must name the operation: " + m, m.contains("EPSG:7710")); + assertTrue("must name it in words: " + m, m.contains("OSGB36 to WGS 84 (9)")); + assertTrue("must name the authority's own file name: " + m, + m.contains("OSTN15_NTv2_OSGBtoETRS.gsb")); + assertTrue("must name the modern file that would satisfy it: " + m, + m.contains("uk_os_OSTN15_NTv2_OSGBtoETRS.tif")); + } + + // BallparkPolicy.ALLOW on its own is NOT enough, and that is deliberate rather than an + // oversight: dropping from a published 1.0 m to an unbounded offset is the largest degradation + // there is, so REQUIRE_BEST refuses it by exactly the rule it applies everywhere else. The + // caller has to concede both things. + ProjContext ballparkOnly = ProjContext.builder() + .database(FakeProjDatabase.osgb36()) + .ballparkPolicy(BallparkPolicy.ALLOW) + .build(); + try { + Proj.createCrsToCrs("EPSG:4277", "EPSG:4326", ballparkOnly); + fail("BallparkPolicy.ALLOW alone must not silently discard a published 1.0 m operation " + + "while BestOperationPolicy.REQUIRE_BEST is in force"); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + } + + ProjContext lenient = ProjContext.builder() + .database(FakeProjDatabase.osgb36()) + .ballparkPolicy(BallparkPolicy.ALLOW) + .bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED) + .build(); + CrsOperation ballpark = Proj.createCrsToCrs("EPSG:4277", "EPSG:4326", lenient); + assertTrue("with both concessions made, the ballpark offset is selected and flagged", + ballpark.isBallparkTransformation()); + assertFalse("a ballpark operation never has a stated accuracy, in PROJ either", + ballpark.accuracy().isPresent()); + assertTrue("and what was given up must be on the record: " + ballpark.warnings(), + containing(ballpark.warnings(), "EPSG:7710")); + assertTrue("named as the largest degradation there is: " + ballpark.warnings(), + containing(ballpark.warnings(), "largest degradation there is")); + } + + /** + * The degradation {@link BestOperationPolicy#REQUIRE_BEST} exists for. + * + *

With {@code EPSG:1241} out of the picture, the best usable candidate is {@code EPSG:1312} at + * 2.0 m while {@code EPSG:8555} at 0.15 m exists and cannot be run here. Choosing the + * 2.0 m one is a 1.85 m change of answer with no signal, so the default refuses and quantifies the + * gap; {@link BestOperationPolicy#ALLOW_DEGRADED} takes it and records what was lost. + * + *

Note this is the case the enum's javadoc describes and that nothing could previously exercise, + * because without a database there was only ever one candidate to choose from. + */ + @Test + public void requireBestRefusesAStrictLossOfAccuracyAndQuantifiesIt() { + ProjContext strict = withDatabase(FakeProjDatabase.nad27ToNad83WithoutConus()); + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", strict); + fail("expected a refusal: the best usable operation is 2.0 m and a 0.15 m one exists. " + + "Got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + String m = expected.getMessage(); + assertTrue("must name the better operation: " + m, m.contains("EPSG:8555")); + assertTrue("must name what would have been used instead: " + m, m.contains("EPSG:1312")); + assertTrue("must quantify the gap rather than merely calling it worse: " + m, + m.contains("1.85 m worse than you asked for")); + assertTrue("must name the opt-in: " + m, + m.contains("BestOperationPolicy.ALLOW_DEGRADED")); + } + + ProjContext degraded = ProjContext.builder() + .database(FakeProjDatabase.nad27ToNad83WithoutConus()) + .bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED) + .build(); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", degraded); + assertEquals("EPSG:1312", op.selectedOperation().get().authorityCode()); + assertEquals(2.0, op.accuracy().get().metres(), 0.0); + assertTrue("the degradation must be on the record, not only in the exception that was not " + + "thrown: " + op.warnings(), containing(op.warnings(), "EPSG:8555")); + assertTrue(containing(op.warnings(), "allowed the degradation to")); + } + + /** + * When the most accurate rejected candidate is a capability boundary but a fixable one also + * exists, the failure names the fixable one. + * + *

{@code EPSG:8555} at 0.15 m cannot be run at all; {@code EPSG:1243} at 0.5 m only needs two + * files. Reporting {@link ErrorCause#UNSUPPORTED_OPERATION_METHOD} would be true and useless + * — there is nothing the caller could do — so the actionable failure wins. + */ + @Test + public void theActionableFailureWinsOverTheUnfixableOne() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83WithNoReachableGrid()); + try { + Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + fail("expected a refusal"); + } catch (CrsCreationException expected) { + assertEquals("a missing file is fixable and an unimplemented operator is not, so the " + + "fixable one is the failure worth reporting", + ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + assertTrue(expected.getMessage().contains("EPSG:1243")); + } + } + + /** + * {@link BallparkPolicy#ALLOW} selects the synthesised ballpark offset when nothing else can be + * used, marks it, and still refuses to give it an accuracy. + */ + @Test + public void ballparkAllowSelectsTheSynthesisedOffsetAndFlagsIt() { + ProjContext ctx = ProjContext.builder() + .database(FakeProjDatabase.nad27ToNad83WithNoGridAlternatives()) + .gridPolicy(GridPolicy.REQUIRE_ALL) + .ballparkPolicy(BallparkPolicy.ALLOW) + .bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED) + .build(); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + assertTrue(op.isBallparkTransformation()); + assertTrue(op.selectedOperation().get().isSynthesisedBallpark()); + assertFalse(op.accuracy().isPresent()); + assertTrue(op.ballparkReason().get().contains("applies no datum shift at all")); + } + + /** + * A pair that needs no datum change must not be caught by any of this. + * + *

{@code EPSG:4326} to {@code EPSG:4326} shares a datum, so there is no transformation to select + * and no candidate list to be empty. Reporting {@link ErrorCause#NO_OPERATION_AVAILABLE} here would + * break the most common transformation in the world, and the same-datum short circuit is what stops + * it. + */ + @Test + public void aPairSharingADatumNeedsNoOperationAndIsNotAFailure() { + ProjContext ctx = withDatabase(FakeProjDatabase.noOperations()); + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:4326", ctx); + assertFalse(op.isBallparkTransformation()); + assertFalse("there is no operation, so there is no accuracy to quote -- and that absence is " + + "correct rather than a gap", op.accuracy().isPresent()); + assertFalse(op.selectedOperation().isPresent()); + assertTrue(op.transform(new ProjCoordinate(LON, LAT)).hasValidXandYOrdinates()); + } + + /** + * Datums that differ with no published operation at all is + * {@link ErrorCause#BALLPARK_REJECTED}, and that is the same answer PROJ gives. + * + *

Worth being precise about, because the obvious guess is + * {@link ErrorCause#NO_OPERATION_AVAILABLE} and it is wrong. When the datums differ and the + * authority publishes nothing, PROJ synthesises a ballpark offset — there is not one + * {@code Ballpark geographic offset} row anywhere in the shipped database — so there is + * always exactly one candidate and it is always ballpark. Proj4J synthesises the same one, so + * "nothing published" and "only a ballpark" are the same state, and the message says so rather + * than leaving a reader to wonder which it was. + */ + @Test + public void differingDatumsWithNoPublishedOperationIsBallparkRejected() { + ProjContext ctx = withDatabase(FakeProjDatabase.noOperations()); + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + fail("expected BALLPARK_REJECTED, got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BALLPARK_REJECTED, expected.cause()); + String m = expected.getMessage(); + assertTrue("must name both datums, not only the CRSs: " + m, + m.contains("EPSG:6267") && m.contains("EPSG:6269")); + assertTrue("must say the authority publishes nothing, so a reader does not go looking " + + "for a grid that does not exist: " + m, + m.contains("publishes no coordinate operation between these CRSs")); + assertTrue("must say the offset is synthesised rather than read: " + m, + m.contains("synthesised rather than read")); + } + } + + /** + * A CRS pair the database cannot see falls back to the legacy datum model and says so, + * rather than reporting an authoritative-looking absence. + */ + @Test + public void aPairTheDatabaseCannotSeeFallsBackAndSaysSo() { + ProjContext ctx = ProjContext.builder() + .database(FakeProjDatabase.nad27ToNad83()) + .ballparkPolicy(BallparkPolicy.ALLOW) + .build(); + // A bare +ellps= has no authority identity at all, so there is nothing to look up. + CrsOperation op = Proj.createCrsToCrs("+proj=longlat +ellps=clrk66", "EPSG:4326", ctx); + assertFalse("no candidate can be selected for a CRS the authority cannot identify", + op.selectedOperation().isPresent()); + assertTrue("the fallback must be stated, not silent: " + op.warnings(), + containing(op.warnings(), "has no entry for at least one of these CRSs")); + assertTrue("and it must say what is unavailable as a consequence: " + op.warnings(), + containing(op.warnings(), "reported as absent rather than estimated")); + } + + // ------------------------------------------------------------------ 6. +datum= bridge + + /** + * A bare {@code +datum=NAD27} reaches {@code EPSG:4267} through PROJ's own ten-entry + * {@code +datum=} table, so a PROJ string gets real operation selection too. + * + *

1,962 lines of the shipped legacy dictionaries carry a {@code datum=} (995 in + * {@code epsg}, 713 in {@code esri}, 123 in {@code nad83}, 131 in {@code nad27}), so this bridge is + * the payload rather than a convenience. The table is transcribed verbatim from + * {@code 9.8.1:src/iso19111/io.cpp} — the three special cases and the seven-row + * {@code datumDescs[]}. + */ + @Test + public void aBareDatumParameterReachesTheAuthorityDatabase() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + CrsOperation op = Proj.createCrsToCrs("+proj=longlat +datum=NAD27", + "+proj=longlat +datum=NAD83", ctx); + assertEquals("+datum=NAD27 -> EPSG:4267 and +datum=NAD83 -> EPSG:4269", + "EPSG:1241", op.selectedOperation().get().authorityCode()); + assertEquals(0.15, op.accuracy().get().metres(), 0.0); + } + + /** All ten of PROJ's {@code +datum=} names map, and nothing else does. */ + @Test + public void theProjDatumTableIsExactlyPROJsTen() { + assertEquals("4326", OperationSelector.geographicCrsForProjDatum("WGS84")); + assertEquals("4269", OperationSelector.geographicCrsForProjDatum("NAD83")); + assertEquals("4267", OperationSelector.geographicCrsForProjDatum("NAD27")); + assertEquals("4121", OperationSelector.geographicCrsForProjDatum("GGRS87")); + assertEquals("4314", OperationSelector.geographicCrsForProjDatum("potsdam")); + assertEquals("4223", OperationSelector.geographicCrsForProjDatum("carthage")); + assertEquals("4312", OperationSelector.geographicCrsForProjDatum("hermannskogel")); + assertEquals("4299", OperationSelector.geographicCrsForProjDatum("ire65")); + assertEquals("4272", OperationSelector.geographicCrsForProjDatum("nzgd49")); + assertEquals("4277", OperationSelector.geographicCrsForProjDatum("OSGB36")); + + // PROJ compares these case-sensitively, and so must this: "wgs84" is not a PROJ datum name. + org.junit.Assert.assertNull(OperationSelector.geographicCrsForProjDatum("wgs84")); + org.junit.Assert.assertNull(OperationSelector.geographicCrsForProjDatum("OSGB1936")); + org.junit.Assert.assertNull(OperationSelector.geographicCrsForProjDatum(null)); + } + + // ------------------------------------------------------------------ 7. supersession + + /** + * A superseded operation loses only to a replacement that connects the same CRS pair. + * + *

Supersession is not deprecation. A replacement for a different pair is not a substitute, and + * knocking a candidate out for it would silently discard a usable operation. + */ + @Test + public void supersessionOnlyCountsWhenTheReplacementIsASubstitute() { + FakeProjDatabase sameePair = FakeProjDatabase.nad27ToNad83() + .superseded(FakeProjDatabase.gridTransformation("1241"), + FakeProjDatabase.gridTransformation("1313"), true); + CrsOperationCandidate demoted = byCode( + Proj.candidateOperations("EPSG:4267", "EPSG:4269", withDatabase(sameePair)), + "EPSG:1241"); + assertEquals(CrsOperationCandidate.Rejection.SUPERSEDED, demoted.rejection()); + assertTrue(demoted.rejectionReason().get().contains("EPSG:1313")); + + FakeProjDatabase differentPair = FakeProjDatabase.nad27ToNad83() + .superseded(FakeProjDatabase.gridTransformation("1241"), + FakeProjDatabase.gridTransformation("1313"), false); + CrsOperationCandidate kept = byCode( + Proj.candidateOperations("EPSG:4267", "EPSG:4269", withDatabase(differentPair)), + "EPSG:1241"); + assertEquals("a replacement for a different CRS pair is not a substitute and must not " + + "demote this candidate", CrsOperationCandidate.Rejection.NONE, kept.rejection()); + } + + // ------------------------------------------------------------------ 8. introspection + + /** With a database, {@code databaseVersion()} is read from its own metadata table. */ + @Test + public void databaseVersionIsReadFromTheDatabasesOwnMetadata() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + DatabaseInfo info = Proj.databaseInfo(ctx); + assertTrue(info.isDatabasePresent()); + assertEquals("PROJ 9.8.1, EPSG v12.029", info.version().get()); + assertEquals("v12.029", info.epsgVersion().get()); + assertEquals("fake:nad27-to-nad83", info.databaseName().get()); + assertTrue("the note must say the dictionary stays authoritative, so nobody expects adding " + + "a database to move a coordinate that already worked: " + info.vintageNote(), + info.vintageNote().contains("stays authoritative for the codes it knows")); + + // And with none, it still refuses to guess. + assertFalse(Proj.databaseInfo(ProjContext.DEFAULT).isDatabasePresent()); + assertFalse(Proj.databaseInfo(ProjContext.DEFAULT).version().isPresent()); + } + + /** + * {@link Proj#candidateOperations(Crs, Crs)} returns an empty list without a database, not a + * one-element list containing a fabricated candidate. + */ + @Test + public void candidateOperationsIsEmptyWithoutADatabaseRatherThanInvented() { + assertEquals(Collections.emptyList(), + Proj.candidateOperations("EPSG:4326", "EPSG:32633", ProjContext.DEFAULT)); + } + + /** {@code describe()} names the selected operation, its accuracy and every candidate. */ + @Test + public void describeNamesTheSelectionAndTheWholeCandidateList() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + String d = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx).describe(); + assertTrue(d, d.contains("selected = EPSG:1241 NAD27 to NAD83 (1)")); + assertTrue(d, d.contains("accuracy = 0.15 m (EPSG:1241)")); + assertTrue("must state how many the authority published: " + d, + d.contains("candidates = 10 published by the authority")); + assertTrue("must show the operator the grid feeds: " + d, d.contains("+proj=hgridshift")); + assertTrue("must show the rejected ones with their reason: " + d, + d.contains("UNSUPPORTED_METHOD")); + } + + /** + * The context reports whether it has a database, because that is the single fact that most changes + * what this library will answer. + */ + @Test + public void theContextDescribesItsDatabase() { + String with = withDatabase(FakeProjDatabase.nad27ToNad83()).describe(); + assertTrue(with, with.contains("database = fake:nad27-to-nad83")); + assertTrue("REQUIRE_BEST is enforceable once there is something to rank: " + with, + with.contains("it refuses a selection strictly less accurate")); + + String without = ProjContext.DEFAULT.describe(); + assertTrue(without, without.contains("database = NONE")); + assertTrue(without, without.contains("nothing to rank without an authority database")); + } + + // ------------------------------------------------------------------ 9. the consistency gate + + /** + * Selection must not promise an accuracy the engine will not deliver. + * + *

Selection says which published operation applies; the engine that moves coordinates reaches a + * grid shift through the datum model's own {@code +nadgrids=} list. If the selected operation's file + * resolves under a name the datum model does not use, this class would report 0.15 m over a + * coordinate that had no shift applied at all — the original 95.573 m defect with a + * confident number attached to it, which is strictly worse than the original. + * + *

So the two are checked against each other. Here they agree, and the assertion is that they + * agree for a stated reason rather than by luck: the datum model's {@code @conus} and the selected + * {@code EPSG:1241} resolve to the same file. + */ + @Test + public void selectionAndTheEngineAgreeAboutWhichGridIsApplied() { + ProjContext ctx = withDatabase(FakeProjDatabase.nad27ToNad83()); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + + // No disagreement warning: the engine's reachable grid is `conus`, which is also what + // EPSG:1241's first slot resolved to. + assertFalse("selection and execution must not silently disagree: " + op.warnings(), + containing(op.warnings(), "will use a different grid")); + assertFalse("and the engine must not be applying no shift while we claim 0.15 m: " + + op.warnings(), containing(op.warnings(), "would apply NO shift")); + + List engineReachable = new ArrayList(); + List declared = op.source().grids(); + for (int i = 0; i < declared.size(); i++) { + if (declared.get(i).isAvailable()) { + engineReachable.add(declared.get(i).name()); + } + } + assertTrue("the engine must be able to reach the file selection chose: " + engineReachable, + engineReachable.contains("conus")); + assertTrue(op.selectedOperation().get().grids().get(0).probedNames().contains("conus")); + } + + // ------------------------------------------------------------------ helpers + + private static CrsOperationCandidate byCode(List candidates, + String authorityCode) { + for (int i = 0; i < candidates.size(); i++) { + if (authorityCode.equals(candidates.get(i).authorityCode())) { + return candidates.get(i); + } + } + throw new AssertionError(authorityCode + " is not among " + codes(candidates)); + } + + private static List codes(List candidates) { + List out = new ArrayList(candidates.size()); + for (int i = 0; i < candidates.size(); i++) { + out.add(candidates.get(i).authorityCode()); + } + return out; + } + + private static boolean containing(List lines, String needle) { + for (int i = 0; i < lines.size(); i++) { + if (lines.get(i).contains(needle)) { + return true; + } + } + return false; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/ProjContextTest.java b/core/src/test/java/org/locationtech/proj4j/api/ProjContextTest.java new file mode 100644 index 0000000..96131cd --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/ProjContextTest.java @@ -0,0 +1,185 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.DomainErrorPolicy; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; + +/** + * {@link ProjContext} is the only way a policy can be set, and that is the property under + * test here as much as the values themselves. + * + *

A coordinate reference system whose axis order depends on who launched the JVM is not + * reproducible, and on a Spark or Flink executor the environment is chosen by the cluster operator + * rather than by the pipeline author. So: no system property, no environment variable, and a process + * default that can only be set before anything has been built. + */ +public class ProjContextTest { + + @Test + public void theBuiltInDefaultIsCompatibleOnAxisOrderAndStrictOnEverythingElse() { + ProjContext d = ProjContext.DEFAULT; + assertEquals("longitude-first, because adopting authority order is a silent breaking change", + AxisOrderPolicy.LEGACY, d.axisOrderPolicy()); + assertEquals(BallparkPolicy.REJECT, d.ballparkPolicy()); + assertEquals(GridPolicy.REQUIRE_ALL, d.gridPolicy()); + assertEquals(BestOperationPolicy.REQUIRE_BEST, d.bestOperationPolicy()); + assertEquals(DomainErrorPolicy.THROW, d.domainErrorPolicy()); + } + + @Test + public void aBuilderRoundTripsAndTheDefaultIsCanonical() { + assertSame("building the default values must yield the canonical instance", + ProjContext.DEFAULT, ProjContext.builder().build()); + assertSame(ProjContext.DEFAULT, ProjContext.DEFAULT.toBuilder().build()); + + ProjContext custom = ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.AUTHORITY) + .ballparkPolicy(BallparkPolicy.ALLOW) + .gridPolicy(GridPolicy.WARN) + .bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED) + .domainErrorPolicy(DomainErrorPolicy.RETURN_NAN) + .build(); + assertEquals(AxisOrderPolicy.AUTHORITY, custom.axisOrderPolicy()); + assertEquals(BallparkPolicy.ALLOW, custom.ballparkPolicy()); + assertEquals(GridPolicy.WARN, custom.gridPolicy()); + assertEquals(BestOperationPolicy.ALLOW_DEGRADED, custom.bestOperationPolicy()); + assertEquals(DomainErrorPolicy.RETURN_NAN, custom.domainErrorPolicy()); + assertEquals(custom, custom.toBuilder().build()); + assertNotEquals(ProjContext.DEFAULT, custom); + } + + /** Null means "leave the default", not "throw": the common caller is reading configuration. */ + @Test + public void nullMeansTheBuiltInDefault() { + assertSame(ProjContext.DEFAULT, ProjContext.builder() + .axisOrderPolicy(null).ballparkPolicy(null).gridPolicy(null) + .bestOperationPolicy(null).domainErrorPolicy(null).build()); + } + + @Test + public void withersReturnTheSameInstanceWhenNothingChanges() { + assertSame(ProjContext.DEFAULT, + ProjContext.DEFAULT.withAxisOrderPolicy(AxisOrderPolicy.LEGACY)); + assertSame(ProjContext.DEFAULT, + ProjContext.DEFAULT.withBallparkPolicy(BallparkPolicy.REJECT)); + assertSame(ProjContext.DEFAULT, ProjContext.DEFAULT.withGridPolicy(GridPolicy.REQUIRE_ALL)); + assertSame(ProjContext.DEFAULT, + ProjContext.DEFAULT.withDomainErrorPolicy(DomainErrorPolicy.THROW)); + + ProjContext changed = ProjContext.DEFAULT.withBallparkPolicy(BallparkPolicy.ALLOW); + assertNotEquals(ProjContext.DEFAULT, changed); + assertEquals("the original must be untouched", BallparkPolicy.REJECT, + ProjContext.DEFAULT.ballparkPolicy()); + } + + @Test + public void describeStatesThatNoPolicyIsReachableFromTheEnvironment() { + String d = ProjContext.DEFAULT.describe(); + assertTrue(d, d.contains("axisOrderPolicy = LEGACY")); + assertTrue("must spell out what LEGACY means for EPSG:4326: " + d, + d.contains("(lon, lat)")); + assertTrue(d, d.contains("settable from the environment: NO")); + assertTrue(d, d.contains("no system property")); + assertTrue("must not overstate what bestOperationPolicy does with no database to rank " + + "against: " + d, d.contains("nothing to rank without an authority database")); + assertTrue("must state whether an authority database is configured, because that is the " + + "single fact that most changes what this library will answer: " + d, + d.contains("database = NONE")); + + String authority = ProjContext.DEFAULT + .withAxisOrderPolicy(AxisOrderPolicy.AUTHORITY).describe(); + assertTrue(authority, authority.contains("(lat, lon)")); + } + + /** + * The process default is locked once anything exists, so one library cannot flip the semantics + * under another that has already resolved its CRSs. + * + *

This test is also an assertion about itself: it must not succeed in replacing the + * default, because a test run whose default context had been swapped would be validating + * semantics no shipped default produces. + */ + @Test + public void theProcessDefaultCannotBeReplacedOnceAnythingHasBeenBuilt() { + Proj.createCrs("EPSG:4326"); + assertTrue("creating a Crs must lock the default context", Proj.isDefaultContextLocked()); + + ProjContext before = Proj.defaultContext(); + try { + Proj.setDefaultContext(ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.AUTHORITY).build()); + fail("setDefaultContext must refuse once a Crs exists"); + } catch (IllegalStateException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("cannot be replaced")); + } + assertSame("the default must be exactly as it was", before, Proj.defaultContext()); + assertEquals(AxisOrderPolicy.LEGACY, Proj.defaultContext().axisOrderPolicy()); + } + + /** A per-call context is the preferred level and does not touch the process default. */ + @Test + public void aPerCallContextDoesNotChangeTheProcessDefault() { + ProjContext authority = ProjContext.builder() + .axisOrderPolicy(AxisOrderPolicy.AUTHORITY).build(); + assertEquals("neu", Proj.createCrs("EPSG:4326", authority).axisOrder()); + assertEquals(AxisOrderPolicy.LEGACY, Proj.defaultContext().axisOrderPolicy()); + assertEquals("enu", Proj.createCrs("EPSG:4326").axisOrder()); + } + + /** No policy may be reachable from a system property. */ + @Test + public void noSystemPropertyIsConsulted() { + String[] plausible = { + "proj4j.axisOrder", "proj4j.axis.order", "proj4j.axisOrderPolicy", + "proj4j.ballpark", "proj4j.grids.policy", "PROJ_DATA", "PROJ_NETWORK", + "PROJ_ONLY_BEST_DEFAULT", + }; + for (String key : plausible) { + System.setProperty(key, "AUTHORITY"); + } + try { + assertEquals(AxisOrderPolicy.LEGACY, ProjContext.DEFAULT.axisOrderPolicy()); + assertEquals(AxisOrderPolicy.LEGACY, Proj.defaultContext().axisOrderPolicy()); + assertEquals("enu", Proj.createCrs("EPSG:4326").axisOrder()); + assertFalse(Proj.isNetworkEnabled()); + } finally { + for (String key : plausible) { + System.clearProperty(key); + } + } + } + + /** The context is immutable, so a shared one cannot be changed by whoever holds it. */ + @Test + public void everyFieldOfTheContextIsFinal() { + java.lang.reflect.Field[] fields = ProjContext.class.getDeclaredFields(); + for (java.lang.reflect.Field f : fields) { + assertTrue(f.getName() + " must be final: a shared context that can be mutated is a " + + "policy that can change under a running job", + java.lang.reflect.Modifier.isFinal(f.getModifiers())); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/ProjIntrospectionTest.java b/core/src/test/java/org/locationtech/proj4j/api/ProjIntrospectionTest.java new file mode 100644 index 0000000..a2d2be6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/ProjIntrospectionTest.java @@ -0,0 +1,345 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; +import java.util.Optional; + +import org.junit.Test; + +/** + * The seven introspection calls a downstream consumer asked for by name -- {@code version()}, + * {@code databaseVersion()}, {@code availableGrids()}, {@code isGeocentric()}, {@code isAngular()}, + * {@code axisOrder()}, {@code describe()} -- and, more importantly, the two things they must + * refuse to claim. + * + *

Introspection that lies is worse than no introspection at all, because it converts a caller's + * uncertainty into false confidence. The two refusals are: + * + *

    + *
  1. {@code databaseVersion()} must not claim a {@code proj.db}. There is none; the EPSG data is a + * v9.2-era PROJ.4 {@code +init=} dictionary carrying no version stamp, while PROJ 9.8.1 ships EPSG + * v12.029.
  2. + *
  3. {@code availableGrids()} must distinguish reachable from declared, because a silently-skipped + * grid reporting success is this library's worst measured defect: 95.573 m at San Francisco with + * no warning.
  4. + *
+ */ +public class ProjIntrospectionTest { + + // -------------------------------------------------------------------------------- 1. version() + + @Test + public void versionNamesTheLibraryAndThePROJSemanticsItTargets() { + String v = Proj.version(); + assertNotNull(v); + assertTrue(v, v.startsWith("proj4j ")); + assertTrue("version() must name the PROJ release whose semantics are implemented: " + v, + v.contains("9.8.1")); + // Core's own test classpath has no ProjDatabase implementation -- deliberately, so that + // everything here is exercised in the deployment a consumer gets before adding proj4j-db. + // version() must say so rather than let a reader assume authority metadata is available. + assertTrue("version() must not imply an authority database is present: " + v, + v.contains("no authority database configured")); + } + + @Test + public void projSemanticsVersionIsTheTargetRelease() { + assertEquals("9.8.1", Proj.projSemanticsVersion()); + } + + // ------------------------------------------------------------------------ 2. databaseVersion() + + /** The first honesty requirement, stated as an assertion. */ + @Test + public void databaseVersionRefusesToNameAVersionItCannotVerify() { + assertFalse("there is no proj.db and the shipped dictionary carries no version stamp, so " + + "any string here would be a guess or a lie", + Proj.databaseVersion().isPresent()); + + DatabaseInfo info = Proj.databaseInfo(); + assertFalse(info.isDatabasePresent()); + assertFalse(info.version().isPresent()); + assertFalse(info.epsgVersion().isPresent()); + } + + /** + * Refusing to give a version is only honest if the gap is explained somewhere a human will read + * it. That is what {@link DatabaseInfo#vintageNote()} is for, and it has to name both numbers. + */ + @Test + public void databaseInfoExplainsTheVintageGapInProse() { + DatabaseInfo info = Proj.databaseInfo(); + assertTrue("the legacy dictionary ships in proj4j-epsg, which is on the test classpath", + info.dictionaryPresent()); + assertTrue(info.dictionaryOrigin().isPresent()); + + String note = info.vintageNote(); + assertTrue("must say there is no proj.db: " + note, note.contains("No proj.db")); + assertTrue("must name the dictionary's vintage: " + note, note.contains("v9.2")); + assertTrue("must name what PROJ 9.8.1 has instead: " + note, note.contains("v12.029")); + assertTrue("must say the files carry no version stamp: " + note, + note.contains("no version stamp")); + assertTrue("must say what is unavailable rather than approximated: " + note, + note.contains("area of use")); + } + + // ------------------------------------------------------------------------ 3. availableGrids() + + /** Everything listed as available really is, measured by a probe rather than assumed. */ + @Test + public void availableGridsListsOnlyGridsThatWereActuallyFound() { + List available = Proj.availableGrids(); + assertNotNull(available); + for (GridInfo g : available) { + assertTrue(g.describe(), g.isAvailable()); + assertTrue("an available grid must name the resolver that found it", + g.resolverName().isPresent()); + assertTrue("an available grid must name its origin", g.origin().isPresent()); + assertFalse("an available grid has no skip reason", g.skipReason().isPresent()); + } + } + + /** + * The one grid {@code proj4j-epsg} actually ships. If this ever fails, the grid resolution chain + * has stopped seeing the shipped resource -- which is exactly the silent condition that produced + * the 95 m defect. + */ + @Test + public void theOneShippedGridIsReportedAsReachable() { + Optional g = Proj.grid("ntv1_can.dat"); + assertTrue(g.isPresent()); + assertTrue("proj4j-epsg ships proj4/nad/ntv1_can.dat: " + g.get().describe(), + g.get().isAvailable()); + assertTrue(g.get().origin().get(), g.get().origin().get().contains("proj4/nad")); + assertEquals(1113184L, g.get().sizeBytes().getAsLong()); + } + + /** + * The second honesty requirement: declared and unreachable is reported as such, with a reason, + * rather than being omitted from a list and thereby looking like it does not exist. + * + *

Which of the four grids {@code +datum=NAD27} declares are actually present depends on what + * is on the classpath, and the point of this API is that a caller does not have to guess. So the + * assertion is over every unreachable one rather than over a named file, and it insists that at + * least one exists -- because a run in which they were all present would prove nothing here and + * must not pass silently. + */ + @Test + public void declaredButUnreachableGridsAreReportedWithAReason() { + List declared = Proj.declaredGrids(); + assertFalse(declared.isEmpty()); + + int unreachable = 0; + for (GridInfo g : declared) { + assertTrue(g.name() + " came from the datum table, so it is declared", g.isDeclared()); + assertTrue("every token in PROJ's datum table is @-optional and that must be recorded, " + + "not discarded: " + g.name(), g.isOptional()); + assertTrue(g.declaredBy().get(), g.declaredBy().get().startsWith("+datum=")); + if (g.isAvailable()) { + assertTrue(g.resolverName().isPresent()); + assertFalse(g.skipReason().isPresent()); + assertTrue(g.describe(), g.describe().contains("REACHABLE")); + continue; + } + unreachable++; + assertTrue("an unreachable grid must say why", g.skipReason().isPresent()); + assertFalse(g.resolverName().isPresent()); + assertFalse(g.origin().isPresent()); + String described = g.describe(); + assertTrue(described, described.contains("DECLARED BUT UNREACHABLE")); + assertTrue("must say what the @ prefix means: " + described, + described.contains("silently")); + } + assertTrue("no declared grid was unreachable, so this test proved nothing; the classpath " + + "must have changed. Declared: " + declared, unreachable > 0); + } + + /** + * A URL is information for a human. It must never be presented as something that will happen. + * + *

{@code hawaii} is used because it cannot be made reachable: no CTABLE V2 form of it exists + * upstream, so no legacy grid pack can contain it. + */ + @Test + public void aKnownUrlIsInformationNotAnAction() { + GridInfo hawaii = Proj.grid("hawaii").get(); + assertEquals(Optional.of("us_noaa_hawaii.tif"), hawaii.modernName()); + assertEquals(Optional.of("https://cdn.proj.org/us_noaa_hawaii.tif"), hawaii.knownUrl()); + assertFalse("a grid reachable only over the network is not available, full stop", + hawaii.isAvailable()); + assertFalse("core ships no network code", Proj.isNetworkEnabled()); + assertTrue(hawaii.describe(), hawaii.describe().contains("no network I/O")); + } + + /** + * Five of the seven US grids have no legacy form to ship at all, so their absence is not a + * packaging oversight and the report says so instead of leaving a reader to guess. + */ + @Test + public void theFiveGeoTiffOnlyUsGridsSayWhyTheyCannotBeShipped() { + for (String name : new String[]{"hawaii", "prvi", "stgeorge", "stlrnc", "stpaul"}) { + GridInfo g = Proj.grid(name).get(); + assertTrue(name + " must carry the GeoTIFF-only note", g.note().isPresent()); + assertTrue(g.note().get(), g.note().get().contains("GeoTIFF-only")); + assertFalse(name + " has no legacy form anywhere, so it cannot be reachable", + g.isAvailable()); + } + // ...whereas conus and alaska do exist upstream in CTABLE V2 and carry no such note. + assertFalse(Proj.grid("conus").get().note().isPresent()); + assertFalse(Proj.grid("alaska").get().note().isPresent()); + } + + /** {@code format()} is empty until the file has been read: a format from a name is a guess. */ + @Test + public void formatIsNotGuessedFromAFileName() { + assertFalse("listing a grid does not read it, so its format is unknown", + Proj.grid("ntv1_can.dat").get().format().isPresent()); + // Reading it does establish the format, and then it is reported. + GridInfo loaded = null; + for (GridInfo g : Proj.createCrs("EPSG:4267").grids()) { + if ("ntv1_can.dat".equals(g.name())) { + loaded = g; + } + } + assertNotNull(loaded); + assertEquals(Optional.of("ntv1"), loaded.format()); + } + + // ------------------------------------------------- 4, 5, 6. isGeocentric/isAngular/axisOrder + + @Test + public void isGeocentricIsTrueOnlyForAGeocentricCrs() { + assertTrue(Proj.createCrs("+proj=geocent +datum=WGS84").isGeocentric()); + assertFalse(Proj.createCrs("EPSG:4326").isGeocentric()); + assertFalse(Proj.createCrs("EPSG:3857").isGeocentric()); + } + + @Test + public void isAngularSeparatesDegreesFromMetres() { + assertTrue("EPSG:4326 is degrees", Proj.createCrs("EPSG:4326").isAngular()); + assertFalse("EPSG:3857 is metres", Proj.createCrs("EPSG:3857").isAngular()); + assertFalse("a geocentric CRS is metres, not angles", + Proj.createCrs("+proj=geocent +datum=WGS84").isAngular()); + } + + @Test + public void theThreeKindsArePartitioned() { + Crs geographic = Proj.createCrs("EPSG:4326"); + Crs projected = Proj.createCrs("EPSG:3857"); + Crs geocentric = Proj.createCrs("+proj=geocent +datum=WGS84"); + + assertTrue(geographic.isGeographic() && !geographic.isProjected() + && !geographic.isGeocentric()); + assertTrue(!projected.isGeographic() && projected.isProjected() + && !projected.isGeocentric()); + assertTrue(!geocentric.isGeographic() && !geocentric.isProjected() + && geocentric.isGeocentric()); + } + + @Test + public void axisOrderIsProjSOwnThreeLetterEncoding() { + String order = Proj.createCrs("EPSG:4326").axisOrder(); + assertEquals("enu", order); + assertEquals(3, order.length()); + for (int i = 0; i < order.length(); i++) { + assertTrue("must be a PROJ +axis= direction character: " + order, + "ewnsud".indexOf(order.charAt(i)) >= 0); + } + } + + // -------------------------------------------------------------------------------- 7. describe() + + @Test + public void describeStatesTheDeploymentInFull() { + String d = Proj.describe(); + assertNotNull(d); + assertTrue(d, d.contains("PROJ semantics target: 9.8.1")); + assertTrue("must state the metadata situation: " + d, d.contains("authority database =")); + assertTrue("must state the resolution chain: " + d, + d.contains("working directory: NEVER CONSULTED")); + assertTrue("must state that no environment variable is read: " + d, + d.contains("environment variables: NONE READ")); + assertTrue("must state the network position: " + d, d.contains("network: ABSENT")); + assertTrue("must split the grid inventory into reachable and unreachable: " + d, + d.contains("reachable now") && d.contains("UNREACHABLE")); + assertTrue("must record the measured cost of a silently skipped grid: " + d, + d.contains("95.573 m")); + assertTrue("must explain why five of the seven US grids are absent: " + d, + d.contains("GeoTIFF-only")); + assertTrue("must state the default context: " + d, d.contains("axisOrderPolicy")); + assertTrue("must state that no policy is settable from the environment: " + d, + d.contains("settable from the environment: NO")); + } + + @Test + public void describeResolutionNamesEveryResolverAndItsEnumerability() { + String d = Proj.describeResolution(); + assertTrue(d, d.contains("first match wins")); + assertTrue("enumerability must be stated per resolver, so that an empty grid list is " + + "never read as \"nothing installed\": " + d, d.contains("enumerable=")); + assertTrue(d, d.contains("classpath:proj4/nad/")); + } + + // ---------------------------------------------------------------- the write-only descriptions + + /** + * About a hundred human-readable projection descriptions have been in {@code Registry} since + * 2009 with no way to read them; their only reader was a message that is now unreachable. This + * is what they were for. + */ + @Test + public void projectionDescriptionsAreReadable() { + assertEquals(Optional.of("Albers Equal Area"), Proj.projectionDescription("aea")); + assertEquals(Optional.of("Azimuthal Equidistant"), Proj.projectionDescription("aeqd")); + assertFalse(Proj.projectionDescription("no_such_projection").isPresent()); + + List all = Proj.projections(); + assertTrue("the registry carries around a hundred descriptions, not a handful: " + + all.size(), all.size() > 90); + int described = 0; + for (ProjectionInfo p : all) { + if (p.description().isPresent()) { + described++; + } + } + assertEquals("every registered projection has a description", all.size(), described); + assertTrue(Proj.supportedProjections().contains("lcc")); + assertTrue(Proj.supportedProjections().contains("utm")); + } + + /** + * A CRS reports the {@code +proj=} name it was actually built from -- {@code utm}, not the + * {@code tmerc} it is implemented by -- together with the registry's description of it. + */ + @Test + public void aCrsReportsItsProjectionDescription() { + Crs utm = Proj.createCrs("EPSG:32633"); + assertEquals(Optional.of("utm"), utm.projectionName()); + assertTrue(utm.projectionDescription().isPresent()); + + Crs lcc = Proj.createCrs("+proj=lcc +lat_1=33 +lat_2=45 +lat_0=39 +lon_0=-96 " + + "+datum=NAD83"); + assertEquals(Optional.of("lcc"), lcc.projectionName()); + assertEquals(Optional.of("Lambert Conformal Conic"), lcc.projectionDescription()); + assertTrue(lcc.describe(), lcc.describe().contains("Lambert Conformal Conic")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/api/StrictParseModeTest.java b/core/src/test/java/org/locationtech/proj4j/api/StrictParseModeTest.java new file mode 100644 index 0000000..26040d1 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/api/StrictParseModeTest.java @@ -0,0 +1,569 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.api; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.io.Proj4FileReader; +import org.locationtech.proj4j.parser.Proj4Parser.ParseMode; +import org.locationtech.proj4j.units.Units; + +/** + * {@link ParseMode#STRICT} reached through the {@link Proj} facade. + * + *

Before this, neither of the library's two documented defences against a hostile CRS string + * protected production. {@code ProjDefinitionValidator} is test-scope, and the + * {@code Proj4Keyword} allow-list runs only in {@code ParseMode.STRICT}, which + * {@link org.locationtech.proj4j.CRSFactory} never selects and the facade could not select at all. + * A consumer parsing untrusted PROJ.4 strings therefore got {@code PROJ_COMPATIBLE} + * unconditionally: unrecognised keys retained and ignored, unknown {@code +units} silently metres. + * + *

What is measured here

+ * + *

Every claim on {@link ProjContext#parseMode()} has a test on this page, and each is an + * A/B against one frozen input rather than a one-sided pass: + * + *

    + *
  • the same definition accepted under the default and refused under {@code STRICT}, the + * offending key named — {@link #theSameDefinitionParsesByDefaultAndIsRefusedByName()};
  • + *
  • an unresolvable {@code +units} silently becoming metres by default and refused under + * {@code STRICT} — {@link #strictAlsoGatesAnUnresolvableUnitsName()};
  • + *
  • duplicate-key precedence is NOT gated, measured rather than assumed — + * {@link #duplicateKeyPrecedenceIsFirstWinsInBothModes()};
  • + *
  • the legacy 1.x API not re-routed by any context — + * {@link #theLegacyApiIsNotReRouted()};
  • + *
  • the default facade path still bit-identical to {@code CRSFactory}, coordinate for coordinate + * — {@link #theDefaultPathIsBitIdenticalToCrsFactory()}.
  • + *
+ * + *

The positive control

+ * + *

A mode that refused everything would pass every hostile test above and break the library, so + * the load-bearing test here is {@link #strictAcceptsTheWholeShippedDictionaryBarOne()}: all + * 9,013 definitions in the shipped {@code proj4/nad} dictionaries, parsed twice, once per + * mode. Measured at the time of writing: 8,969 accepted by both modes, 43 refused by both for + * reasons that have nothing to do with the mode (unimplemented {@code +proj=} names), exactly + * one accepted by default and refused by {@code STRICT}, and zero the other way round. That one + * is {@code world:malay}, which carries {@code +rot_conv} — a token that is in PROJ 9.8.1's + * own {@code data/world} and is read nowhere in its {@code src/}, so PROJ retains and ignores it + * too. It is enumerated by name below, not tolerated by a threshold. + * + *

That census would be worthless if its classifier could not tell the three outcomes apart, so + * {@link #theCensusClassifierDiscriminates()} drives it with one hand-made definition per outcome + * and requires the right label for each. + */ +public class StrictParseModeTest { + + /** The five dictionaries in {@code proj4j-epsg}, which is on core's test classpath. */ + private static final String[] DICTIONARIES = {"epsg", "esri", "world", "nad83", "nad27"}; + + /** Pinned: the population these dictionaries have had throughout this work. */ + private static final int DICTIONARY_DEFINITIONS = 9013; + + private static final ProjContext STRICT = + ProjContext.builder().parseMode(ParseMode.STRICT).build(); + + // ------------------------------------------------------------------ the option itself + + @Test + public void theDefaultIsProjCompatibleAndStaysThatWay() { + assertEquals("the conformance runner and every existing caller depend on this", + ParseMode.PROJ_COMPATIBLE, ProjContext.DEFAULT.parseMode()); + assertEquals(ParseMode.PROJ_COMPATIBLE, ProjContext.builder().build().parseMode()); + assertEquals(ParseMode.PROJ_COMPATIBLE, Proj.defaultContext().parseMode()); + assertSame("null means leave the built-in default, as every other setter here does", + ProjContext.DEFAULT, ProjContext.builder().parseMode(null).build()); + assertSame(ProjContext.DEFAULT, + ProjContext.DEFAULT.withParseMode(ParseMode.PROJ_COMPATIBLE)); + } + + @Test + public void theOptionRoundTripsThroughTheBuilderAndTheWither() { + assertEquals(ParseMode.STRICT, STRICT.parseMode()); + assertEquals(ParseMode.STRICT, + ProjContext.DEFAULT.withParseMode(ParseMode.STRICT).parseMode()); + assertEquals(STRICT, STRICT.toBuilder().build()); + assertFalse("a context differing only in parse mode must not equal the default", + ProjContext.DEFAULT.equals(STRICT)); + assertEquals("the original must be untouched", ParseMode.PROJ_COMPATIBLE, + ProjContext.DEFAULT.parseMode()); + assertSame("PROJ_COMPATIBLE plus otherwise-default values is the canonical instance", + ProjContext.DEFAULT, STRICT.withParseMode(ParseMode.PROJ_COMPATIBLE)); + } + + /** + * {@code describe()} is the one line a job logs to say what could make two executors disagree, + * so a policy missing from it is a policy nobody will know was set. + */ + @Test + public void describeAndToStringStateTheParseMode() { + String lax = ProjContext.DEFAULT.describe(); + assertTrue(lax, lax.contains("parseMode = PROJ_COMPATIBLE")); + assertTrue("must say what the default tolerates: " + lax, + lax.contains("retained and ignored")); + + String strict = STRICT.describe(); + assertTrue(strict, strict.contains("parseMode = STRICT")); + assertTrue("must not overstate the scope: " + strict, + strict.contains("not to authority codes, WKT, PROJJSON or the 1.x CRSFactory")); + + assertTrue(STRICT.toString(), STRICT.toString().contains("parseMode=STRICT")); + assertTrue(ProjContext.DEFAULT.toString(), + ProjContext.DEFAULT.toString().contains("parseMode=PROJ_COMPATIBLE")); + } + + // ------------------------------------------------------- the two behaviours STRICT changes + + /** + * The headline: one definition, two modes, and the refusal names the key. + */ + @Test + public void theSameDefinitionParsesByDefaultAndIsRefusedByName() { + String definition = "+proj=merc +ellps=GRS80 +lon_0=0 +unknown_keyword=1"; + + Crs lax = Proj.createCrs(definition); + assertNotNull("the default must stay PROJ-compatible: an unrecognised key is retained " + + "and ignored, which is what builtins.gie relies on", lax); + assertEquals("merc", lax.asLegacy().getProjection().getName()); + + try { + Proj.createCrs(definition, STRICT); + fail("STRICT must refuse a key outside Proj4Keyword.supportedParameters()"); + } catch (UnsupportedParameterException expected) { + assertTrue("the refusal must name the offending key, or the caller cannot fix it: " + + expected.getMessage(), expected.getMessage().contains("unknown_keyword")); + assertTrue("must be in-family", expected instanceof Proj4jException); + assertTrue("must be a CrsCreationException, which is what createCrs documents", + expected instanceof org.locationtech.proj4j.CrsCreationException); + } + } + + /** + * {@code Units.findUnits} substitutes {@code METRES} for any name it does not know and never + * returns null, so by default {@code +units=bananas} is a working CRS in metres. That is a + * plausible wrong answer, which is the failure mode this library exists to remove. + */ + @Test + public void strictAlsoGatesAnUnresolvableUnitsName() { + String definition = "+proj=merc +ellps=GRS80 +units=bananas"; + + assertSame("by default an unknown +units silently falls back to metres", Units.METRES, + Proj.createCrs(definition).asLegacy().getProjection().getUnits()); + + try { + Proj.createCrs(definition, STRICT); + fail("STRICT must refuse a +units name this library cannot resolve"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("bananas")); + assertTrue("must be in-family", expected instanceof Proj4jException); + } + + // ...and must still resolve the ones it does know, including a non-metre one. + assertSame(Units.US_FEET, Proj.createCrs("+proj=merc +ellps=GRS80 +units=us-ft", STRICT) + .asLegacy().getProjection().getUnits()); + assertSame(Units.METRES, Proj.createCrs("+proj=merc +ellps=GRS80 +units=m", STRICT) + .asLegacy().getProjection().getUnits()); + } + + /** + * Measured, because the plausible guess is wrong. A duplicated key is resolved + * first-occurrence-wins by {@code Proj4Parser.createParameterMap}, which is PROJ's rule + * ({@code pj_param_exists} walks the list front-to-back). That code is outside the + * {@code mode == STRICT} branch, so {@code STRICT} neither changes the winner nor reports the + * duplicate. This test exists so the javadoc's claim to that effect is checked rather than + * asserted. + */ + @Test + public void duplicateKeyPrecedenceIsFirstWinsInBothModes() { + String definition = "+proj=merc +ellps=GRS80 +lon_0=11 +lon_0=22"; + + double lax = Proj.createCrs(definition).asLegacy() + .getProjection().getProjectionLongitudeDegrees(); + double strict = Proj.createCrs(definition, STRICT).asLegacy() + .getProjection().getProjectionLongitudeDegrees(); + + assertEquals("first occurrence wins, as in PROJ", 11.0, lax, 0.0); + assertEquals("STRICT must not change which occurrence wins", 11.0, strict, 0.0); + + // And the duplicate is not itself an error in either mode. + assertNotNull(Proj.createCrs(definition, STRICT)); + } + + /** + * The small, readable half of the positive control: real definitions of several shapes, all of + * which must survive {@code STRICT}. The large half is + * {@link #strictAcceptsTheWholeShippedDictionaryBarOne()}. + */ + @Test + public void fullyValidDefinitionsParseUnderStrict() { + String[] valid = { + "+proj=merc +ellps=GRS80 +units=m +no_defs", + "+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs", + "+proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 " + + "+ellps=GRS80 +units=m +no_defs", + "+proj=omerc +lat_0=10 +lonc=20 +alpha=30 +k_0=1 +ellps=WGS84 +no_uoff +no_off", + "+proj=longlat +datum=NAD83 +no_defs", + "+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 " + + "+ellps=GRS80 +units=m", + "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k_0=1 +x_0=0 +y_0=0 +ellps=WGS84 " + + "+towgs84=0,0,0,0,0,0,0 +units=m +no_defs", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 " + + "+approx +units=m", + "+proj=ob_tran +o_proj=moll +o_lon_p=40 +o_lat_p=50 +lon_0=60 +ellps=WGS84", + "+proj=peirce_q +lon_0=25 +shape=square +ellps=WGS84", + }; + for (String definition : valid) { + assertNotNull(definition, Proj.createCrs(definition, STRICT)); + } + } + + // ---------------------------------------------------------- reachability through the facade + + /** + * Every facade entry point that takes a context must honour it, or the option is decorative on + * whichever one a caller happens to use. + */ + @Test + public void strictIsReachableThroughEveryEntryPointThatTakesAContext() { + String hostile = "+proj=merc +ellps=GRS80 +unknown_keyword=1"; + String benign = "+proj=longlat +ellps=GRS80 +no_defs"; + + refused(hostile, "Proj.createCrs(String, ProjContext)"); + + try { + Proj.createCrsToCrs(benign, hostile, STRICT); + fail("createCrsToCrs must apply the context's parse mode to the target too"); + } catch (UnsupportedParameterException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("unknown_keyword")); + } + try { + Proj.createCrsToCrs(hostile, benign, STRICT); + fail("createCrsToCrs must apply the context's parse mode to the source"); + } catch (UnsupportedParameterException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("unknown_keyword")); + } + + Crs lax = Proj.createCrs(hostile); + try { + lax.withContext(STRICT); + fail("Crs.withContext re-parses the original definition, so it must apply the " + + "new context's parse mode"); + } catch (UnsupportedParameterException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("unknown_keyword")); + } + + // ...and the benign pair must still build an operation under STRICT. + assertNotNull(Proj.createCrsToCrs(benign, "+proj=merc +ellps=GRS80 +units=m", STRICT)); + } + + /** + * The three notations {@code STRICT} deliberately does not cover. This is a scope test, not an + * aspiration: the javadoc says these are untouched, so they are pinned untouched. + */ + @Test + public void strictDoesNotReachAuthorityCodesWktOrProjJson() { + // An authority code resolves to a definition this library ships, and one of those 9,013 + // carries +rot_conv. Gating this path would refuse a CRS that is correct. + assertNotNull("world:malay must keep resolving under STRICT", + Proj.createCrs("world:malay", STRICT)); + assertNotNull(Proj.createCrs("EPSG:4326", STRICT)); + + // WKT and PROJJSON are different grammars with their own readers; the allow-list is a list + // of PROJ.4 keys. The WKT below is deliberately one this library writes itself. + String wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137," + + "298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]"; + assertNotNull(Proj.createCrsFromWkt(wkt, STRICT)); + } + + // ------------------------------------------------------------------- the legacy API is frozen + + /** + * {@code CRSFactory} and {@code CoordinateTransformFactory} are not re-routed by any context. + * Re-routing them would make fifteen-year-old GeoTools, GeoServer and geomesa code start + * throwing on definitions it has always accepted. + */ + @Test + public void theLegacyApiIsNotReRouted() { + String hostile = "+proj=merc +ellps=GRS80 +unknown_keyword=1"; + + CRSFactory factory = new CRSFactory(); + CoordinateReferenceSystem viaFactory = factory.createFromParameters(null, hostile); + assertNotNull("CRSFactory must keep retaining and ignoring an unrecognised key", + viaFactory); + assertEquals("merc", viaFactory.getProjection().getName()); + assertArrayEquals("the parameter list must be kept verbatim, unknown key included", + hostile.split(" "), viaFactory.getParameters()); + + assertNotNull("createFromName must keep resolving the one definition STRICT would refuse", + factory.createFromName("world:malay")); + + CoordinateTransform t = new CoordinateTransformFactory().createTransform( + factory.createFromParameters(null, "+proj=longlat +ellps=GRS80"), viaFactory); + ProjCoordinate out = t.transform(new ProjCoordinate(12, 56), new ProjCoordinate()); + assertTrue("the legacy transform must still produce a finite coordinate", + !Double.isNaN(out.x) && !Double.isNaN(out.y)); + } + + /** + * {@link Proj} no longer goes through {@code CRSFactory} for a PROJ.4 string — it builds + * a {@code Proj4Parser} with the context's mode. Under the default mode that must be the same + * two statements {@code CRSFactory.createFromParameters} runs, so this compares the two paths + * bit for bit: the retained parameter list, and a forward transform of a probe point with + * {@code assertEquals(.., 0.0)} rather than a tolerance. + */ + @Test + public void theDefaultPathIsBitIdenticalToCrsFactory() { + String[] definitions = { + "+proj=merc +ellps=GRS80 +units=m +no_defs", + "+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m", + "+proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +ellps=GRS80 +units=m", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=500000 +ellps=GRS80 +units=m", + "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +ellps=WGS84 +units=m", + "+proj=merc +ellps=GRS80 +unknown_keyword=1", + "+proj=merc +ellps=GRS80 +units=bananas", + "+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +ellps=GRS80 +units=us-ft", + }; + CRSFactory factory = new CRSFactory(); + CoordinateTransformFactory transforms = new CoordinateTransformFactory(); + CoordinateReferenceSystem wgs84 = + factory.createFromParameters(null, "+proj=longlat +ellps=WGS84 +datum=WGS84"); + + for (String definition : definitions) { + CoordinateReferenceSystem legacy = factory.createFromParameters(null, definition); + CoordinateReferenceSystem facade = Proj.createCrs(definition).asLegacy(); + + assertArrayEquals(definition, legacy.getParameters(), facade.getParameters()); + assertEquals(definition, legacy.getProjection().getName(), + facade.getProjection().getName()); + + ProjCoordinate viaLegacy = transforms.createTransform(wgs84, legacy) + .transform(new ProjCoordinate(12.5, 56.25), new ProjCoordinate()); + ProjCoordinate viaFacade = transforms.createTransform(wgs84, facade) + .transform(new ProjCoordinate(12.5, 56.25), new ProjCoordinate()); + assertEquals(definition + " easting", viaLegacy.x, viaFacade.x, 0.0); + assertEquals(definition + " northing", viaLegacy.y, viaFacade.y, 0.0); + } + } + + // ------------------------------------------------------------------------- the census + + /** How one definition behaves under the two modes. */ + private enum Outcome { BOTH_OK, BOTH_REFUSED, DEFAULT_OK_STRICT_REFUSED, DEFAULT_REFUSED_STRICT_OK } + + /** + * The control that makes every other test on this page mean something. A parse mode that + * refused everything would satisfy each hostile assertion above and destroy the library, so + * {@code STRICT} is driven over every definition the project ships and required to accept + * essentially all of them. + * + *

Measured when this landed: 9,013 definitions, 8,969 accepted by both modes, 43 + * refused by both for reasons unrelated to the mode (a {@code +proj=} name this library has not + * implemented), 1 accepted by default and refused by {@code STRICT}, 0 the other way. + * + *

The 8,969/43 split is asserted as a floor and a sum rather than pinned exactly, because + * implementing a missing projection legitimately moves a definition from the second bucket to + * the first and must not fail this test. The bucket that would indicate a defect — + * {@code DEFAULT_OK_STRICT_REFUSED} — is enumerated by name, never counted. + * + *

Runtime is dominated by {@link Proj4FileReader}, not by parsing: 0.28 s with + * {@code InitFileCache} in place, 21 s against the pre-cache reader that re-scans the whole + * dictionary per lookup. 18,026 parses account for none of that. + */ + @Test + public void strictAcceptsTheWholeShippedDictionaryBarOne() { + List names = allDictionaryDefinitions(); + assertEquals("the shipped dictionary population has moved; if that is intended, re-pin it " + + "here deliberately", DICTIONARY_DEFINITIONS, names.size()); + + Proj4FileReader reader = new Proj4FileReader(); + int bothOk = 0; + int bothRefused = 0; + TreeSet strictOnlyRefusals = new TreeSet(); + TreeSet impossible = new TreeSet(); + + for (String name : names) { + String[] params = reader.getParameters(name); + assertNotNull(name + " must resolve", params); + String definition = join(params); + switch (classify(definition)) { + case BOTH_OK: bothOk++; break; + case BOTH_REFUSED: bothRefused++; break; + case DEFAULT_OK_STRICT_REFUSED: + strictOnlyRefusals.add(name + " (" + strictRefusalKey(definition) + ")"); + break; + default: impossible.add(name); break; + } + } + + assertEquals("STRICT only ADDS checks, so nothing can be refused by the default and " + + "accepted by STRICT", new TreeSet(), impossible); + assertEquals("the one definition in the shipped dictionaries that STRICT refuses, " + + "enumerated rather than counted", + new TreeSet(Arrays.asList("world:malay (rot_conv)")), strictOnlyRefusals); + assertEquals("every definition must land in exactly one bucket", + DICTIONARY_DEFINITIONS, bothOk + bothRefused + strictOnlyRefusals.size()); + assertTrue("STRICT must accept the overwhelming majority of real definitions -- a mode " + + "that refuses everything passes every hostile test and breaks the " + + "library. Accepted by both modes: " + bothOk, + bothOk >= 8900); + } + + /** + * The census above is only evidence if its classifier can produce all three of the outcomes it + * looks for. One hand-made definition per outcome, and the right label required for each. + */ + @Test + public void theCensusClassifierDiscriminates() { + assertEquals("a valid definition", Outcome.BOTH_OK, + classify("+proj=merc +ellps=GRS80 +units=m")); + assertEquals("an unknown key is exactly what the census looks for", + Outcome.DEFAULT_OK_STRICT_REFUSED, + classify("+proj=merc +ellps=GRS80 +unknown_keyword=1")); + assertEquals("+rot_conv is the real one, reproduced standalone", + Outcome.DEFAULT_OK_STRICT_REFUSED, + classify("+proj=omerc +a=6377295.66402 +rf=300.8017 +alpha=30 +no_uoff " + + "+rot_conv +lonc=102 +lat_0=4 +k_0=0.99984")); + assertEquals("a failure that has nothing to do with the mode", Outcome.BOTH_REFUSED, + classify("+proj=no_such_projection_name +ellps=GRS80")); + + assertEquals("and the key the census reports must be the offending one", + "rot_conv", strictRefusalKey("+proj=omerc +a=6377295.66402 +rf=300.8017 " + + "+alpha=30 +no_uoff +rot_conv +lonc=102 +lat_0=4 +k_0=0.99984")); + } + + // --------------------------------------------------------------------------------- helpers + + private static Outcome classify(String definition) { + boolean laxOk = parses(definition, null); + boolean strictOk = parses(definition, STRICT); + if (laxOk && strictOk) { + return Outcome.BOTH_OK; + } + if (!laxOk && !strictOk) { + return Outcome.BOTH_REFUSED; + } + return laxOk ? Outcome.DEFAULT_OK_STRICT_REFUSED : Outcome.DEFAULT_REFUSED_STRICT_OK; + } + + private static boolean parses(String definition, ProjContext context) { + try { + Proj.createCrs(definition, context); + return true; + } catch (Proj4jException refused) { + return false; + } catch (RuntimeException refused) { + return false; + } + } + + /** The key {@code STRICT} refuses {@code definition} for, or null if it does not refuse it. */ + private static String strictRefusalKey(String definition) { + try { + Proj.createCrs(definition, STRICT); + return null; + } catch (UnsupportedParameterException refused) { + // " parameter is not supported" + String message = refused.getMessage(); + int space = message.indexOf(' '); + return space < 0 ? message : message.substring(0, space); + } + } + + private static void refused(String definition, String what) { + try { + Proj.createCrs(definition, STRICT); + fail(what + " must apply the context's parse mode"); + } catch (UnsupportedParameterException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("unknown_keyword")); + } + } + + private static String join(String[] params) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < params.length; i++) { + if (i > 0) { + sb.append(' '); + } + sb.append(params[i]); + } + return sb.toString(); + } + + /** + * Every {@code authority:code} in the shipped dictionaries, read straight off the classpath + * resources. Only the {@code } headers are needed here; the parameters themselves come + * from {@link Proj4FileReader}, which is the production reader and handles the comment and + * continuation rules this loop deliberately does not. + */ + private static List allDictionaryDefinitions() { + List out = new ArrayList(); + for (String dictionary : DICTIONARIES) { + InputStream in = StrictParseModeTest.class.getClassLoader() + .getResourceAsStream("proj4/nad/" + dictionary); + assertNotNull("proj4j-epsg must be on the test classpath: proj4/nad/" + dictionary, in); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); + try { + String line; + while ((line = reader.readLine()) != null) { + String trimmed = line.trim(); + if (trimmed.indexOf('<') != 0) { + continue; + } + int close = trimmed.indexOf('>'); + if (close > 1) { + out.add(dictionary + ":" + trimmed.substring(1, close)); + } + } + } finally { + reader.close(); + } + } catch (IOException e) { + throw new AssertionError("cannot read proj4/nad/" + dictionary, e); + } + } + return out; + } + + private static void assertArrayEquals(String message, String[] expected, String[] actual) { + org.junit.Assert.assertEquals(message + "\nexpected " + Arrays.toString(expected) + + "\nactual " + Arrays.toString(actual), Arrays.toString(expected), + Arrays.toString(actual)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/builtins/BuiltinsProjectionDefectTest.java b/core/src/test/java/org/locationtech/proj4j/builtins/BuiltinsProjectionDefectTest.java new file mode 100644 index 0000000..fb03d04 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/builtins/BuiltinsProjectionDefectTest.java @@ -0,0 +1,351 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.builtins; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.gie.GieComparator; +import org.locationtech.proj4j.proj.Projection; + +/** + * Pins the {@code gie/builtins.gie} rows that were failing because of a defect inside a + * projection Proj4J already shipped, as opposed to a projection it does not have. + * + *

Why this file exists at all

+ * + *

The published gap analysis ranks missing operators. Nothing ranked the operators that + * were present and wrong, and a decomposition of {@code builtins.gie} found 269 of its 824 + * failing assertions in that second category — projections that build, run, return a plausible + * coordinate and are silently off by between 2.4 mm and 10,000 km. Every expected value below is + * copied verbatim from {@code conformance/src/test/resources/gie/builtins.gie} with its own + * {@code tolerance} line, and the line number is quoted so the row can be found. + * + *

Deliberately not a second conformance runner. The corpus sweep lives in the + * {@code conformance} module and owns the {@code .gie} lexer and the assertion state machine; this + * file only reuses the published {@link GieComparator} so that the metric is the same one + * that grades the corpus — Euclidean metres for a projected target, a geodesic for an angular one. + * A local re-implementation of either would be a second source of truth. + * + *

The three defect shapes

+ * + *
    + *
  1. A class-level default standing in for a PROJ parameter default. {@code Proj4Parser} + * assigns {@code +lat_0} (and {@code +lat_ts}, and {@code +lat_1}) only when the keyword is + * present, so a constructor that pins the field is setting the effective default for every + * definition that omits the key. Four classes pinned a value PROJ defaults differently, and + * between them they gated 62 assertions.
  2. + *
  3. An in-place reassignment lost in transcription. Upstream repeatedly writes + * {@code lp.phi = f(lp.phi)} and then reads {@code lp.phi} twice more. Five classes computed + * {@code f(phi)} into the output slot, overwrote it, and used the original {@code phi} — + * leaving forward and inverse not mutual inverses.
  4. + *
  5. A whole missing kernel. {@code eqc}, {@code sinu} and {@code gnom} are all + * {@code Sph&Ell} upstream and had only the spherical arm; {@code eqc} in fact had no arm at + * all and fell through to the base class's identity.
  6. + *
+ */ +public class BuiltinsProjectionDefectTest { + + /** {@code builtins.gie}'s most common tolerance, in metres. */ + private static final double MM_0_1 = 0.0001; + + private static final CRSFactory FACTORY = new CRSFactory(); + + // ------------------------------------------------------------------ shape 1: pinned defaults + + /** + * {@code builtins.gie:6699-6706} — {@code +proj=stere +ellps=GRS80} with no {@code +lat_0}. + * PROJ's {@code phi0} default is 0, so this is the equatorial aspect; + * {@code StereographicAzimuthalProjection}'s no-argument constructor pinned 90° and ran the + * polar one, 6,375 km away. + */ + @Test + public void stereWithoutLat0IsEquatorialNotPolar() { + assertForward("+proj=stere +ellps=GRS80", 2, 1, 222644.854550117, 110610.883474174, MM_0_1); + assertForward("+proj=stere +ellps=GRS80", 2, -1, 222644.854550117, -110610.883474174, MM_0_1); + } + + /** + * {@code builtins.gie:6779-6783} — {@code +lat_ts} absent on a polar aspect means + * π/2, not 0 ({@code 9.8.1:stere.cpp:305-309}). With 0 the polar branch takes its + * {@code cos(phits)/tsfn(phits)} arm and the whole map comes out scaled by 1.9335. + */ + @Test + public void stereWithoutLatTsUsesHalfPiNotZero() { + assertForward("+proj=stere +ellps=GRS80 +lat_0=-90 +k_0=0.97", 20, -70, + 748424.7446, 2056280.0858, MM_0_1); + } + + /** + * {@code builtins.gie:2253-2262} — {@code +proj=gnom +R=1} is equatorial. The old default of + * {@code lat_0=90} answered {@code (0.030619, -0.173648)} here, which is not a rounding + * difference but a different projection. + */ + @Test + public void gnomWithoutLat0IsEquatorialNotPolar() { + assertForward("+proj=gnom +R=1", 10, 80, 0.1763, 5.7588, MM_0_1); + assertForward("+proj=gnom +R=1", 80, 10, 5.6713, 1.0154, MM_0_1); + } + + /** + * {@code builtins.gie:1805-1810} — {@code +proj=eqdc} with no {@code +lat_0}. A pinned 37.5° + * shifted {@code rho0 = c - M(phi0)} and therefore every northing by {@code M(37.5) = + * 4,151,999 m}, identically in all 16 of the projection's assertions. + */ + @Test + public void eqdcWithoutLat0PutsTheOriginOnTheEquator() { + assertForward("+proj=eqdc +ellps=GRS80 +lat_1=0.5 +lat_2=2", 2, 1, + 222588.440269286, 110659.134907347, MM_0_1); + } + + /** + * {@code builtins.gie:4028-4032} — {@code loxim}'s {@code +lat_1} was hard-coded to 40° + * behind a {@code //FIXME - param}. PROJ's default is 0 and the corpus passes 0.5. + */ + @Test + public void loximReadsLat1() { + assertForward("+proj=loxim +a=6400000 +lat_1=0.5 +lat_2=2", 2, 1, + 223382.295791339, 55850.536063819, MM_0_1); + } + + /** + * {@code builtins.gie:3947-3952} — {@code leac} takes {@code +lat_1} as its second + * standard parallel and a pole as its first, and never reads {@code +lat_2}. Reading the two + * fields the way {@code aea} does made it a different cone. + */ + @Test + public void leacUsesLat1AsItsSecondParallelAndAPoleAsItsFirst() { + assertForward("+proj=leac +ellps=GRS80 +lat_1=0 +lat_2=2", 2, 1, + 220685.140542979, 112983.500889396, MM_0_1); + } + + // ------------------------------------------------------- shape 2: lost in-place reassignment + + /** + * {@code builtins.gie:7977-7981} — {@code wag1} shares {@code urmfps.cpp}, whose forward + * reassigns {@code lp.phi = aasin(n sin phi)} and then uses it twice. Using the original + * {@code phi} made the northing {@code 1/n} too large: 19.7 km. + */ + @Test + public void wag1AppliesTheReassignedLatitudeToBothOrdinates() { + assertForward("+proj=wag1 +a=6400000", 2, 1, 195986.781561158, 127310.075060660, MM_0_1); + } + + /** {@code builtins.gie:7712-7716} — the same defect in {@code urmfps} itself, with {@code +n=0.5}. */ + @Test + public void urmfpsAppliesTheReassignedLatitudeToBothOrdinates() { + assertForward("+proj=urmfps +a=6400000 +n=0.5", 2, 1, + 196001.708134192, 127306.843329993, MM_0_1); + } + + /** {@code builtins.gie:8006-8010} — the same defect in {@code wag2}: 34.2 km. */ + @Test + public void wag2AppliesTheReassignedLatitudeToBothOrdinates() { + assertForward("+proj=wag2 +a=6400000", 2, 1, 206589.888099962, 120778.040357547, MM_0_1); + } + + /** {@code builtins.gie:4174-4178} — the same defect in {@code mbtfpp}: 6.0 km. */ + @Test + public void mbtfppAppliesTheReassignedLatitudeToBothOrdinates() { + assertForward("+proj=mbtfpp +a=6400000", 2, 1, 206804.786929820, 120649.762565793, MM_0_1); + } + + /** + * {@code builtins.gie:1100-1102} — {@code collg}'s inverse reassigns {@code lp.phi} twice and + * {@code asin} applies to the second. The old code returned the first, so the answered latitude + * was the raw scaled northing: −57.295°, i.e. −1 radian printed as degrees. + * That value is the tell for this whole defect family. + */ + @Test + public void collgInverseAppliesAsinToTheSecondReassignment() { + assertInverse("+proj=collg +a=6400000", 200, 100, 0.001586797, 0.001010173, MM_0_1); + } + + /** + * {@code builtins.gie:1981-1983} — {@code fahey}'s inverse divided the caller's output slot + * rather than the northing, and then took {@code sqrt} of the undivided northing. + */ + @Test + public void faheyInverseDividesTheNorthingBeforeUsingIt() { + assertInverse("+proj=fahey +a=6400000", 200, 100, 0.002185789, 0.000984246, MM_0_1); + } + + // ------------------------------------------------------------------ shape 3: missing kernels + + /** + * {@code builtins.gie:1638-1646} — the spherical arm, which is the one case the old identity + * implementation got right. Kept as a pass→pass guard: this is the row a naive + * "{@code eqc} is Plate Carrée" rewrite would break. + */ + @Test + public void eqcSphericalIsUnchanged() { + assertForward("+proj=eqc +a=6400000", 2, 1, 223402.144255274, 111701.072127637, MM_0_1); + } + + /** + * {@code builtins.gie:1667-1673} — the ellipsoidal arm, EPSG:1028, whose reference values the + * corpus takes from IOGP Guidance Note 7-2 §3.2.5. There was no ellipsoidal arm at all. + */ + @Test + public void eqcEllipsoidalUsesTheMeridianArc() { + assertForward("+proj=eqc +ellps=WGS84 +lat_ts=0", 10, 55, 1113194.91, 6097230.31, 0.01); + } + + /** {@code builtins.gie:1742-1748} — {@code +lat_ts} scales the easting by {@code nu1 cos(lat_ts)}. */ + @Test + public void eqcAppliesLatTs() { + assertForward("+proj=eqc +ellps=WGS84 +lat_ts=45", 2, 49, 157693.670, 5429627.632, 0.01); + } + + /** + * {@code builtins.gie:1771-1777} — {@code +lat_0} enters as {@code M0}, so the northing is zero + * at the origin latitude. Without it the whole map is offset by {@code M(45)}: 5,010 km. + */ + @Test + public void eqcAppliesLat0AsAMeridianArcOffset() { + assertForward("+proj=eqc +ellps=WGS84 +lat_ts=30 +lat_0=45", 0, 45, 0.0, 0.0, 0.01); + assertForward("+proj=eqc +ellps=WGS84 +lat_ts=30 +lat_0=45", 0, 60, 0.0, 1669128.442, 0.01); + } + + /** + * {@code builtins.gie:6593-6597} — {@code sinu} is {@code Sph&Ell} upstream and had only the + * spherical arm, so an ellipsoidal {@code sinu} was 745 m out in northing. + */ + @Test + public void sinuEllipsoidalUsesTheMeridianArc() { + assertForward("+proj=sinu +ellps=GRS80", 2, 1, 222605.299539466, 110574.388554153, MM_0_1); + } + + /** {@code builtins.gie:6616-6620} — the spherical arm, unchanged. */ + @Test + public void sinuSphericalIsUnchanged() { + assertForward("+proj=sinu +R=6400000", 2, 1, 223368.119026632, 111701.072127637, MM_0_1); + } + + /** + * {@code builtins.gie:2296-2302} — {@code gnom} on an ellipsoid is Karney's geodesic gnomonic, + * a different kernel from the spherical four-aspect closed form, and its answers differ from the + * sphere's in the fourth decimal at {@code a=1}. Proj4J had only the spherical kernel. + */ + @Test + public void gnomEllipsoidalUsesTheGeodesicKernel() { + assertForward("+proj=gnom +a=1 +rf=200", 10, 80, 0.1763, 5.7232, MM_0_1); + assertForward("+proj=gnom +a=1 +rf=200", 80, 10, 5.8813, 1.0465, MM_0_1); + } + + /** + * {@code builtins.gie:2364-2370} versus {@code builtins.gie:2378-2384} — the domain contract + * differs between the two kernels, and this is why both are needed. On the sphere the north + * polar aspect cannot see the equator, so {@code (0, 0)} is an error; on the ellipsoid the same + * point is finite. Three corpus rows assert each, so no single kernel satisfies the file. + */ + @Test + public void gnomPolarDomainContractDiffersBetweenSphereAndEllipsoid() { + try { + project("+proj=gnom +R=1 +lat_0=90", 0, 0); + fail("the spherical north polar gnomonic must refuse the equator: builtins.gie:2372"); + } catch (ProjectionException expected) { + assertTrue("expected a domain refusal, got: " + expected.getMessage(), true); + } + assertForward("+proj=gnom +a=1 +rf=200 +lat_0=90", 0, 0, 0, -127.4835, MM_0_1); + } + + /** + * {@code 9.8.1:gnom.cpp:50} tests {@code xy.y <= EPS10}, not {@code fabs(xy.y) <= EPS10}. + * {@code xy.y} at that point is the cosine of the angular distance from the projection centre, + * so a negative value is a point beyond the horizon. Taking the absolute value accepted the far + * hemisphere and folded it, mirrored, onto the near one — a plausible coordinate for a point + * that has none. + */ + @Test + public void gnomRefusesPointsBeyondTheHorizonRatherThanMirroringThem() { + // The corpus row. Note it lands EXACTLY on the horizon (xy.y == 0), so both the old + // `fabs(xy.y) <= EPS10` and upstream's `xy.y <= EPS10` refuse it -- it does not + // discriminate between them, which is why the second case below exists. + try { + project("+proj=gnom +R=1 +lat_0=45", 0, -45); + fail("gnom must refuse a point on the horizon: builtins.gie:2434"); + } catch (ProjectionException expected) { + assertTrue(true); + } + // Strictly BEYOND the horizon: xy.y = sin45 sin(-60) + cos45 cos(-60) = -0.2589. Upstream + // refuses (gnom.cpp:50); the absolute-value form accepted it and returned the antipodal + // point mirrored through the origin -- a plausible coordinate for a point that has none. + // Derived from the 9.8.1 source rather than from a corpus row, and stated as such. + try { + ProjCoordinate mirrored = project("+proj=gnom +R=1 +lat_0=45", 0, -60); + fail("gnom must refuse a point beyond the horizon, not mirror it; got " + mirrored); + } catch (ProjectionException expected) { + assertTrue(true); + } + } + + // ---------------------------------------------------------------------------------- plumbing + + private static Projection projection(String def) { + CoordinateReferenceSystem crs = FACTORY.createFromParameters("test", def); + return crs.getProjection(); + } + + private static ProjCoordinate project(String def, double lonDeg, double latDeg) { + return projection(def).project(new ProjCoordinate(lonDeg, latDeg), new ProjCoordinate()); + } + + /** + * Asserts a forward row: the target is projected, so the corpus metric is Euclidean metres and + * the tolerance is read as metres directly. + */ + private static void assertForward(String def, double lonDeg, double latDeg, + double expectX, double expectY, double toleranceMetres) { + ProjCoordinate got = project(def, lonDeg, latDeg); + double d = GieComparator.xyDist( + new double[] {expectX, expectY, 0, 0}, new double[] {got.x, got.y, 0, 0}); + assertEquals(def + " at (" + lonDeg + ", " + latDeg + "): expected (" + + expectX + ", " + expectY + ") got (" + got.x + ", " + got.y + ")", + 0.0, d, toleranceMetres); + } + + /** + * Asserts an inverse row. The target is angular, so the corpus metric is a geodesic distance on + * the operation's own ellipsoid, computed here by {@link GieComparator#lpDist} after the + * degrees-to-radians conversion and the latitude-first swap that {@code gie} applies. + */ + private static void assertInverse(String def, double x, double y, + double expectLonDeg, double expectLatDeg, double toleranceMetres) { + Projection p = projection(def); + ProjCoordinate got = p.inverseProject(new ProjCoordinate(x, y), new ProjCoordinate()); + GieComparator comparator = + GieComparator.forEllipsoid(p.getEllipsoid().getA(), flattening(p)); + double d = comparator.lpDist( + new double[] {Math.toRadians(expectLonDeg), Math.toRadians(expectLatDeg), 0, 0}, + new double[] {Math.toRadians(got.x), Math.toRadians(got.y), 0, 0}); + assertEquals(def + " inverse at (" + x + ", " + y + "): expected (" + + expectLonDeg + ", " + expectLatDeg + ") got (" + got.x + ", " + got.y + ")", + 0.0, d, toleranceMetres); + } + + private static double flattening(Projection p) { + double a = p.getEllipsoid().getA(); + double b = p.getEllipsoid().getB(); + return a == 0 ? 0 : (a - b) / a; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/builtins2/Decompose.java.txt b/core/src/test/java/org/locationtech/proj4j/builtins2/Decompose.java.txt new file mode 100644 index 0000000..7f56558 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/builtins2/Decompose.java.txt @@ -0,0 +1,279 @@ +NOT COMPILED BY MAVEN -- deliberately `.java.txt`. +================================================= + +This is the re-decomposition driver: it groups every FAILING GieAssertionResult of the whole +vendored corpus by (file, `+proj=` token, category), so that a per-file failure count can be +turned into a worklist. It reuses the REAL GieLexer, GieRunner and Proj4jGieOperationFactory and +the published comparator (org.locationtech.proj4j.gie.{GieComparator,GieTolerance,GieIoUnits}) +via GieRunner -- it re-parses no expectation and no tolerance of its own. + +It cannot live in `core/src/test/java` as a `.java` file because it compiles against the +`conformance` module's TEST classes, and `core` is a dependency of `conformance`, not the other +way round. Hence the `.txt` suffix: Maven's `**/*.java` include skips it, and the source stays +next to the tests it informs instead of in /tmp. + +Build and run (about 25 s for the whole 7,845-assertion corpus): + + export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home + export PATH="$JAVA_HOME/bin:/opt/homebrew/bin:$PATH" + cd /Volumes/git/proj4j + + mvn -B -q -Dmaven.repo.local=/tmp/m2-btail -pl conformance -am -Pconformance test-compile \ + -Dmaven.javadoc.skip=true # once, to get conformance/target/test-classes + mvn -B -q -Dmaven.repo.local=/tmp/m2-btail -pl core -am install \ + -Dmaven.javadoc.skip=true -DskipTests # after every change to core + + CP="conformance/target/test-classes:conformance/target/classes:core/target/classes:\ +epsg/target/classes:db/target/classes:grids-us-legacy/target/classes" + mkdir -p /tmp/decomp/classes + cp core/src/test/java/org/locationtech/proj4j/builtins2/Decompose.java.txt /tmp/decomp/Decompose.java + javac -nowarn -cp "$CP" -d /tmp/decomp/classes /tmp/decomp/Decompose.java + java -cp "/tmp/decomp/classes:$CP" Decompose /tmp/decomp/report.txt + +A/B protocol: do NOT recompile `conformance/target/test-classes` between the two arms of a +comparison -- the bridge is written by a different stream and recompiling it makes the arms +differ by more than your change. Recompile `core` only. And note that `core/target/classes` +picks up EVERY other agent's in-flight work, so a delta in a file you did not touch +(`4D-API_cs2cs-style`, `DHDN_ETRS89`, `more_builtins`, `gridshift`) is probably not yours. + +------------------------------------------------------------------------------------------------ +import java.io.IOException; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.locationtech.proj4j.conformance.bridge.Proj4jGieOperationFactory; +import org.locationtech.proj4j.conformance.manifest.AssertionOutcome; +import org.locationtech.proj4j.conformance.parse.GieFile; +import org.locationtech.proj4j.conformance.parse.GieLexer; +import org.locationtech.proj4j.conformance.runner.GieAssertionResult; +import org.locationtech.proj4j.conformance.runner.GieCorpus; +import org.locationtech.proj4j.conformance.runner.GieFileResult; +import org.locationtech.proj4j.conformance.runner.GieGridAvailability; +import org.locationtech.proj4j.conformance.runner.GieRunner; + +/** + * Re-decomposes the failing assertions of the whole corpus by (file, +proj= token, category). + * + *

Deliberately reuses the real GieLexer/GieRunner/Proj4jGieOperationFactory and the published + * comparator, via GieRunner, so no expectation or tolerance is re-parsed here. + */ +public final class Decompose { + + enum Category { + UNREGISTERED, // no class at all + PARAM_BLOCKED, // arithmetic exists, key undispatched + NUMERICAL, // ships, runs, wrong answer + DOMAIN, // failed to fail / domain contract + OTHER + } + + public static void main(String[] argv) throws Exception { + GieRunner runner = GieRunner.using( + new Proj4jGieOperationFactory(), GieGridAvailability.OnClasspath.INSTANCE); + List files = GieCorpus.activeFiles(); + if (files.isEmpty()) { + System.err.println("no corpus files found on classpath"); + System.exit(2); + } + + int totalPass = 0, totalFail = 0, totalSkip = 0, totalVac = 0; + List results = new ArrayList(); + for (GieCorpus.Entry e : files) { + GieFile lexed = GieLexer.lex(e.file()); + GieFileResult r = runner.run(e.corpusPath(), lexed); + results.add(r); + totalPass += r.count(AssertionOutcome.PASS); + totalFail += r.count(AssertionOutcome.FAIL); + totalSkip += r.count(AssertionOutcome.SKIP); + totalVac += r.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE); + } + + StringBuilder out = new StringBuilder(); + out.append("=== CORPUS TOTALS ===\n"); + int genuine = totalPass + totalFail + totalSkip; + out.append(String.format("pass=%d fail=%d skip=%d vacuous=%d genuine-denominator=%d (%.2f%%)%n", + totalPass, totalFail, totalSkip, totalVac, genuine, + 100.0 * totalPass / genuine)); + + out.append("\n=== PER FILE ===\n"); + for (GieFileResult r : results) { + int p = r.count(AssertionOutcome.PASS); + int f = r.count(AssertionOutcome.FAIL); + int s = r.count(AssertionOutcome.SKIP); + int v = r.count(AssertionOutcome.VACUOUS_EXPECTED_FAILURE); + out.append(String.format("%-44s pass=%-5d fail=%-5d skip=%-4d vac=%-5d total=%d%n", + r.filePath(), p, f, s, v, r.total())); + } + + // Decomposition of failures, per file of interest and overall. + for (GieFileResult r : results) { + if (r.count(AssertionOutcome.FAIL) == 0) { + continue; + } + out.append("\n=== ").append(r.filePath()).append(" — FAILURES BY +proj= AND CATEGORY ===\n"); + // proj -> category -> count + Map byProj = new TreeMap(); + Map sample = new LinkedHashMap(); + Map byCat = new LinkedHashMap(); + for (GieAssertionResult a : r.assertions()) { + if (a.outcome() != AssertionOutcome.FAIL) { + continue; + } + String proj = projToken(a.operation()); + Category c = classify(a.detail()); + int[] row = byProj.get(proj); + if (row == null) { + row = new int[Category.values().length + 1]; + byProj.put(proj, row); + } + row[c.ordinal()]++; + row[Category.values().length]++; + Integer cur = byCat.get(c); + byCat.put(c, cur == null ? 1 : cur + 1); + String skey = proj + "|" + c; + if (!sample.containsKey(skey)) { + sample.put(skey, a.key() + " L" + a.line() + " :: " + trim(a.operation(), 78) + + " :: " + trim(a.detail(), 150)); + } + } + out.append("category totals: "); + for (Category c : Category.values()) { + Integer n = byCat.get(c); + if (n != null) { + out.append(c).append('=').append(n).append(" "); + } + } + out.append('\n'); + out.append(String.format("%-16s %6s %6s %6s %6s %6s %6s%n", + "+proj=", "unreg", "param", "numer", "domain", "other", "TOTAL")); + List> rows = new ArrayList>(byProj.entrySet()); + Collections.sort(rows, new Comparator>() { + public int compare(Map.Entry a, Map.Entry b) { + int d = b.getValue()[Category.values().length] - a.getValue()[Category.values().length]; + return d != 0 ? d : a.getKey().compareTo(b.getKey()); + } + }); + for (Map.Entry en : rows) { + int[] v = en.getValue(); + out.append(String.format("%-16s %6d %6d %6d %6d %6d %6d%n", en.getKey(), + v[0], v[1], v[2], v[3], v[4], v[Category.values().length])); + } + out.append("-- one sample per (proj, category) --\n"); + for (Map.Entry en : sample.entrySet()) { + out.append(" [").append(en.getKey()).append("] ").append(en.getValue()).append('\n'); + } + if (r.filePath().endsWith("builtins.gie")) { + out.append("-- EVERY non-unregistered failure --\n"); + for (GieAssertionResult a : r.assertions()) { + if (a.outcome() != AssertionOutcome.FAIL) { + continue; + } + Category c = classify(a.detail()); + if (c == Category.UNREGISTERED) { + continue; + } + out.append(" ").append(c).append(" L").append(a.line()).append(" | ") + .append(a.verb()).append(' ').append(trim(a.assertionArgs(), 60)) + .append(" | ").append(trim(a.operation(), 200)) + .append(" | ").append(trim(a.detail(), 260)).append('\n'); + } + } + } + + String text = out.toString(); + System.out.print(text); + String dest = argv.length > 0 ? argv[0] : "/tmp/decomp/report.txt"; + Files.write(Paths.get(dest), text.getBytes(StandardCharsets.UTF_8)); + System.err.println("written " + dest); + } + + static String trim(String s, int n) { + s = s.replace('\n', ' '); + return s.length() <= n ? s : s.substring(0, n) + "..."; + } + + /** The {@code +proj=} token of an operation definition, or a marker for the shapes that lack one. */ + static String projToken(String op) { + if (op == null || op.isEmpty()) { + return "(no-operation)"; + } + if (op.startsWith("crs_src") || op.contains("crs_dst")) { + return "(crs-to-crs)"; + } + int i = op.indexOf("proj="); + while (i > 0) { + char before = op.charAt(i - 1); + if (before == '+' || before == ' ' || before == '\t') { + // Skip "o_proj=" and "step_proj=" style prefixes handled by the ' ' / '+' guard. + break; + } + i = op.indexOf("proj=", i + 1); + } + if (i < 0) { + return "(no-proj-token)"; + } + int j = i + 5; + int k = j; + while (k < op.length() && !Character.isWhitespace(op.charAt(k))) { + k++; + } + String name = op.substring(j, k); + if ("pipeline".equals(name)) { + // Attribute pipelines to the first +step's operator, which is what actually failed. + int s = op.indexOf("+proj=", k); + if (s > 0) { + int e = s + 6; + int f = e; + while (f < op.length() && !Character.isWhitespace(op.charAt(f))) { + f++; + } + return "pipeline:" + op.substring(e, f); + } + } + return name; + } + + static Category classify(String detail) { + if (detail == null) { + return Category.OTHER; + } + if (detail.contains("failed to fail")) { + return Category.DOMAIN; + } + if (detail.startsWith("deviation ") || detail.startsWith("roundtrip deviation ") + || detail.startsWith("time deviation ")) { + return Category.NUMERICAL; + } + if (detail.contains("operation could not be created")) { + if (detail.contains("does not resolve it") + || detail.contains("Unknown projection") + || detail.contains("is a PROJ 9.8.1 operator") + || detail.contains("CRSFactory produced no projection")) { + return Category.UNREGISTERED; + } + if (detail.contains("does not implement this parameter") + || detail.contains("is PROJ-false") + || detail.contains("value grammar") + || detail.contains("UnsupportedParameterException") + || detail.contains("is not supported") + || detail.contains("is a PROJ unit id") + || detail.contains("proj4j does not") + || detail.contains("proj4j applies the prime meridian") + || detail.contains("proj4j refused a definition PROJ accepts") + || detail.contains("PROJ accepts a num/den ratio")) { + return Category.PARAM_BLOCKED; + } + return Category.OTHER; + } + return Category.OTHER; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/builtins2/NewOperatorContractTest.java b/core/src/test/java/org/locationtech/proj4j/builtins2/NewOperatorContractTest.java new file mode 100644 index 0000000..0865d26 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/builtins2/NewOperatorContractTest.java @@ -0,0 +1,458 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.builtins2; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.CalCOFIProjection; +import org.locationtech.proj4j.proj.CentralConicProjection; +import org.locationtech.proj4j.proj.GaussSchreiberTransverseMercatorProjection; +import org.locationtech.proj4j.proj.InternationalMapOfTheWorldPolyconicProjection; +import org.locationtech.proj4j.proj.LabordeProjection; +import org.locationtech.proj4j.proj.LambertConformalConicAlternativeProjection; +import org.locationtech.proj4j.proj.ObliqueCylindricalEqualAreaProjection; +import org.locationtech.proj4j.proj.PerspectiveProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TiltedPerspectiveProjection; +import org.locationtech.proj4j.proj.TwoPointEquidistantProjection; + +/** + * Locks in the contracts of the operators added while working the {@code builtins.gie} + * cluster — the setup rejections, the parameter defaults, the affine overrides and the + * fidelity constants. + * + *

Why these and not coordinates

+ * + *

The coordinates are already asserted, against unmodified vendored upstream data, by the + * {@code conformance} module's {@code GieConformanceTest}: 127 {@code builtins.gie} assertions + * across these nine operators. Re-transcribing those numbers into Java source would add no + * evidence and would risk certifying a wrong implementation against a wrong transcription, which + * is the specific failure the corpus harness exists to avoid. + * + *

What the corpus does not protect is the set of deliberate decisions that make those + * numbers come out right and that a plausible tidy-up would silently undo. Each test below is one + * of those, and each names the upstream site it reproduces. Several are cases where upstream's + * behaviour looks like a bug: those are pinned so that "fixing" them fails loudly. + */ +public class NewOperatorContractTest { + + private final CRSFactory factory = new CRSFactory(); + + private Projection projectionOf(String def) { + CoordinateReferenceSystem crs = factory.createFromParameters(null, def); + assertNotNull(def + " produced no CRS", crs); + Projection p = crs.getProjection(); + assertNotNull(def + " produced no projection", p); + return p; + } + + // ---------------------------------------------------------------- registration + + /** + * Every operator added here resolves through {@link Registry}, {@code tpers} now included. + * + *

This assertion was INVERTED, deliberately

+ * + *

It used to end {@code assertEquals("tpers must stay unregistered until +azi/+tilt are + * dispatched", null, registry.getProjection("tpers"))}, and that was the correct pin at the + * time: {@code Proj4Parser} sent {@code +azi} to {@code SpilhausProjection} alone, so + * registering {@code tpers} would have made {@code +proj=tpers +azi=20} parse cleanly, drop the + * azimuth and return a silently unrotated map. + * + *

Both halves have since landed together — {@code Proj4Keyword.tilt}, a + * {@code TiltedPerspectiveProjection} branch in {@code Proj4Parser} reading {@code +azi} and + * {@code +tilt}, and the same {@code +azi} fan-out to {@code LabordeProjection}, which had the + * identical hole open unnoticed. So the pin is stale, and the rule is to invert a stale pin + * rather than delete or weaken it: the assertion now states the opposite fact and will fail + * just as loudly if {@code tpers} is ever unregistered again. + */ + @Test + public void registryResolvesTheNewNamesAndTpers() { + Registry registry = new Registry(); + assertSame("ccon", CentralConicProjection.class, registry.getProjection("ccon").getClass()); + assertSame("calcofi", CalCOFIProjection.class, + registry.getProjection("calcofi").getClass()); + assertSame("gstmerc", GaussSchreiberTransverseMercatorProjection.class, + registry.getProjection("gstmerc").getClass()); + assertSame("ocea", ObliqueCylindricalEqualAreaProjection.class, + registry.getProjection("ocea").getClass()); + assertSame("tpeqd", TwoPointEquidistantProjection.class, + registry.getProjection("tpeqd").getClass()); + assertSame("imw_p", InternationalMapOfTheWorldPolyconicProjection.class, + registry.getProjection("imw_p").getClass()); + assertSame("lcca", LambertConformalConicAlternativeProjection.class, + registry.getProjection("lcca").getClass()); + assertSame("labrd", LabordeProjection.class, registry.getProjection("labrd").getClass()); + assertSame("nsper", PerspectiveProjection.class, + registry.getProjection("nsper").getClass()); + + // Registered only once +azi AND +tilt could be dispatched to it. See this method's + // javadoc; this line was `assertEquals(null, ...)` until that landed. + assertSame("tpers", TiltedPerspectiveProjection.class, + registry.getProjection("tpers").getClass()); + } + + // ---------------------------------------------------------------- nsper / tpers + + /** + * {@code nsper} reads {@code +h}, which the base class refuses. This is the one change that + * unblocked all twenty {@code builtins.gie} {@code nsper} rows. + */ + @Test + public void nsperAcceptsHeightOfOrbit() { + Projection p = projectionOf("+proj=nsper +a=6400000 +h=1000000"); + assertEquals(1000000.0, p.getHeightOfOrbit(), 0.0); + } + + /** + * The {@code +h} bound is on {@code h/a}, not on {@code h} ({@code nsper.cpp:155-159}), so the + * same height is legal on the Earth and illegal on a unit sphere. Two corpus rows assert the + * rejections. + */ + @Test + public void nsperValidatesTheRatioNotTheHeight() { + // Legal: h/a is about 0.156. + projectionOf("+proj=nsper +a=6400000 +h=1000000"); + assertRejected("+proj=nsper +R=1 +h=0"); + assertRejected("+proj=nsper +R=1 +h=1e11"); + // ... and 1e11 metres is perfectly legal on a real ellipsoid: h/a is 1.6e4 < 1e10. + projectionOf("+proj=nsper +a=6400000 +h=1e11"); + } + + /** + * Every aspect must be selected from {@code +lat_0}. The class used to hard-assign + * {@code EQUIT}, so the polar and oblique aspects answered the equatorial formulas; the tell + * is that the north polar aspect rejects the equator while the equatorial one does not. + */ + @Test + public void nsperSelectsTheAspectFromLat0() { + Projection polar = projectionOf("+proj=nsper +R=1 +h=3 +lat_0=90"); + try { + polar.project(new ProjCoordinate(0, 0), new ProjCoordinate()); + fail("the north polar nsper cannot see (0, 0): xy.y = sin(0) = 0 < rp = 0.25"); + } catch (Proj4jException expected) { + // nsper.cpp:61 + } + Projection equatorial = projectionOf("+proj=nsper +R=1 +h=3"); + ProjCoordinate out = equatorial.project(new ProjCoordinate(0, 0), new ProjCoordinate()); + assertEquals("the equatorial aspect maps its own centre to the origin", 0.0, out.x, 1e-12); + assertEquals(0.0, out.y, 1e-12); + } + + /** {@code nsper} has an inverse upstream; the class used to answer {@code false}. */ + @Test + public void nsperHasAnInverse() { + assertTrue(projectionOf("+proj=nsper +a=6400000 +h=1000000").hasInverse()); + } + + /** + * {@code tpers} is {@code nsper} with the tilt flag set, and its two angles must survive a + * second {@code initialize()} — the parser calls it after the setters. + */ + @Test + public void tpersKeepsItsAnglesAcrossReinitialisation() { + TiltedPerspectiveProjection p = new TiltedPerspectiveProjection(); + p.setHeightOfOrbit(1000000); + p.setEllipsoid(new org.locationtech.proj4j.datum.Ellipsoid( + "sphere", 6400000, 0.0, "test sphere")); + p.setAziDegrees(20); + p.setTiltDegrees(30); + p.initialize(); + p.initialize(); + assertEquals(20 * Math.PI / 180.0, p.getAziRadians(), 0.0); + assertEquals(30 * Math.PI / 180.0, p.getTiltRadians(), 0.0); + } + + // ---------------------------------------------------------------- ccon + + /** + * {@code |lat_1| > 0} is mandatory, and {@code pj_param} answers 0 for an absent key, so a + * bare {@code +proj=ccon} is the same error ({@code ccon.cpp:86-89}). + */ + @Test + public void cconRequiresANonZeroLat1() { + assertRejected("+proj=ccon +R=6390000"); + assertRejected("+proj=ccon +R=6390000 +lat_1=0"); + projectionOf("+proj=ccon +R=6390000 +lat_1=52"); + } + + /** + * {@code ccon} does not read {@code +lat_0}, even though the corpus block supplies it + * ({@code PROJ_HEAD} lists {@code lat_1=} alone). Two definitions differing only in + * {@code +lat_0} must project identically. + */ + @Test + public void cconIgnoresLat0() { + ProjCoordinate a = projectionOf("+proj=ccon +R=6390000 +lat_1=52") + .project(new ProjCoordinate(24, 55), new ProjCoordinate()); + ProjCoordinate b = projectionOf("+proj=ccon +R=6390000 +lat_1=52 +lat_0=52") + .project(new ProjCoordinate(24, 55), new ProjCoordinate()); + assertEquals(a.x, b.x, 0.0); + assertEquals(a.y, b.y, 0.0); + } + + // ---------------------------------------------------------------- calcofi + + /** + * {@code calcofi} discards {@code +lon_0}, {@code +x_0} and {@code +y_0} and sets {@code a} + * to 1 ({@code calcofi.cpp:136-141}, with upstream's own comment saying so). Three corpus + * blocks assert it by giving {@code +lon_0=50} and expecting the bare answer. + */ + @Test + public void calcofiDiscardsLon0AndTheFalseOrigin() { + ProjCoordinate bare = projectionOf("+proj=calcofi +ellps=GRS80") + .project(new ProjCoordinate(10, 50), new ProjCoordinate()); + ProjCoordinate loud = projectionOf( + "+proj=calcofi +ellps=GRS80 +lon_0=50 +x_0=10000 +y_0=500000") + .project(new ProjCoordinate(10, 50), new ProjCoordinate()); + assertEquals("+lon_0/+x_0/+y_0 must be ignored", bare.x, loud.x, 0.0); + assertEquals(bare.y, loud.y, 0.0); + assertEquals("a is forced to 1", 1.0, projectionOf("+proj=calcofi +ellps=GRS80") + .getEquatorRadius(), 0.0); + } + + /** + * {@code calcofi} still selects its kernel on {@code es}, so {@code +R=} changes the answer + * even though it cannot change the scale. + */ + @Test + public void calcofiStillDistinguishesSphereFromEllipsoid() { + ProjCoordinate ell = projectionOf("+proj=calcofi +ellps=GRS80") + .project(new ProjCoordinate(10, 50), new ProjCoordinate()); + ProjCoordinate sph = projectionOf("+proj=calcofi +R=400") + .project(new ProjCoordinate(10, 50), new ProjCoordinate()); + assertNotEquals("the spherical kernel is not the ellipsoidal one with es = 0", + ell.x, sph.x); + } + + /** + * {@code +over} is honoured in the inverse, and {@code calcofi} sets it. Without it the four + * corpus rows expecting {@code -207.447} and {@code -62.486} degrees come back wrapped, wrong + * by a full turn and with no error raised. + */ + @Test + public void calcofiKeepsTheRevolutionCountInTheInverse() { + Projection p = projectionOf("+proj=calcofi +ellps=GRS80"); + assertTrue("calcofi sets +over (calcofi.cpp:141)", p.isOver()); + ProjCoordinate out = p.inverseProject(new ProjCoordinate(-200, 100), new ProjCoordinate()); + assertTrue("longitude must stay outside +/-180 rather than being wrapped: " + out.x, + out.x < -180.0); + } + + /** {@code +over} must default false everywhere else, or the whole corpus moves. */ + @Test + public void overDefaultsFalse() { + assertTrue(!projectionOf("+proj=merc +ellps=GRS80").isOver()); + assertTrue(!projectionOf("+proj=vandg +a=6400000").isOver()); + assertTrue(!new CentralConicProjection().isOver()); + } + + // ---------------------------------------------------------------- ocea / tpeqd + + /** + * {@code ocea} chooses its form on the presence of {@code +alpha}, not its value, so + * {@code +alpha=0} selects the azimuth form ({@code pj_param}'s {@code 't'} sigil, + * {@code ocea.cpp:62}). The corpus pairs {@code +lat_0=45 +alpha=0} with a two-point block + * and requires the same point. + */ + @Test + public void oceaTreatsAlphaZeroAsPresent() { + ProjCoordinate azimuth = projectionOf("+proj=ocea +a=6400000 +lat_0=45 +alpha=0") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + ProjCoordinate twoPoint = projectionOf( + "+proj=ocea +a=6400000 +lat_1=45 +lat_2=45.0000001") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + assertEquals("+alpha=0 must select the azimuth form", azimuth.x, twoPoint.x, 1e-3); + assertEquals(azimuth.y, twoPoint.y, 1e-3); + } + + /** {@code ocea} derives its own central meridian, so {@code +lon_0} is overwritten. */ + @Test + public void oceaOverwritesLon0() { + ProjCoordinate bare = projectionOf("+proj=ocea +a=6400000 +lat_1=0.5 +lat_2=2") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + ProjCoordinate loud = projectionOf("+proj=ocea +a=6400000 +lat_1=0.5 +lat_2=2 +lon_0=37") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + assertEquals(bare.x, loud.x, 0.0); + assertEquals(bare.y, loud.y, 0.0); + } + + /** + * {@code tpeqd} refuses two equal control points ({@code tpeqd.cpp:80-84}), which also covers + * the absent case since every {@code pj_param} default is 0. The corpus's + * {@code builtins.gie:7589} block — + * {@code +lat_1=90 +lat_2=90 +lon_1=0 +lon_2=1} — must BUILD, and this assertion + * was inverted to say so. + * + *

Why it was inverted

+ * + *

It used to be an {@code assertRejected}, and it passed for the wrong reason: while + * {@code +lon_1}/{@code +lon_2} were dispatched to {@code omerc} alone, both longitudes read 0 + * here, the two control points coincided, and the equal-points test fired. With the dispatch + * widened to {@code ocea}, {@code tpeqd} and {@code imw_p}, {@code lon_2} really is + * 1° and the points are distinct, so the definition builds — exactly as upstream's + * does. With {@code lat_1 = lat_2 = 90} and {@code lon_2 - lon_1 = 1}° the Vincenty + * numerator is about {@code 1.07e-18} rather than exactly zero, because {@code cos(M_HALFPI)} + * is {@code 6.12e-17} and not 0, so upstream's exact {@code z02 == 0.0} comparison at + * {@code tpeqd.cpp:104-108} does not fire either. + * + *

That corpus row's {@code expect failure} comes from somewhere else entirely, and the + * inversion is what made it visible: the row carries no {@code accept} of its own, and + * {@code gie}'s {@code operation} verb does not reset the pending input, so it inherits + * {@code accept -200 -100} from the block above. Latitude −100° is refused by the + * host-level angular contract of {@code fwd_prepare} ({@code fwd.cpp:56-70}), not by anything + * in {@code tpeqd}. Asserted below. + * + *

The exact {@code == 0.0} comparison is still reproduced as an exact one, because that is + * what upstream writes; it is exercised by {@code lat_1 = lat_2 = 90} with the longitudes left + * equal. + */ + @Test + public void tpeqdRejectsCoincidentControlPoints() { + assertRejected("+proj=tpeqd +a=6400000"); + assertRejected("+proj=tpeqd +a=6400000 +lat_1=10 +lat_2=10"); + // INVERTED: distinct control points, so the definition is legal here and upstream. + Projection polar = projectionOf( + "+proj=tpeqd +a=6400000 +lat_1=90 +lat_2=90 +lon_1=0 +lon_2=1"); + // ... and builtins.gie:7589's `expect failure` is the inherited `accept -200 -100`, + // refused by the host-level latitude contract rather than by tpeqd. + try { + polar.project(new ProjCoordinate(-200, -100), new ProjCoordinate()); + fail("latitude -100 deg must be refused by the fwd_prepare angular contract"); + } catch (Proj4jException expected) { + assertTrue("the message must name the latitude, not the control points: " + + expected.getMessage(), + expected.getMessage().contains("latitude")); + } + projectionOf("+proj=tpeqd +a=6400000 +lat_1=0.5 +lat_2=2"); + } + + // ---------------------------------------------------------------- imw_p / lcca / labrd + + /** + * {@code imw_p} needs {@code |lat_1 - lat_2| > 0} and {@code |lat_1 + lat_2| > 0}, which + * together also refuse an absent pair — but {@code +lat_1=0} on its own is legal and + * selects {@code PHI_1_IS_ZERO} ({@code imw_p.cpp:46-55}, {@code :208-212}). The corpus + * exercises both. + */ + @Test + public void imwPDistinguishesAbsentLatitudesFromAZeroOne() { + assertRejected("+proj=imw_p +ellps=GRS80"); + assertRejected("+proj=imw_p +ellps=GRS80 +lat_1=2 +lat_2=2"); + assertRejected("+proj=imw_p +ellps=GRS80 +lat_1=-5 +lat_2=5"); + projectionOf("+proj=imw_p +ellps=GRS80 +lat_1=0 +lat_2=10"); + projectionOf("+proj=imw_p +ellps=GRS80 +lat_1=0.5 +lat_2=2"); + } + + /** + * Absent {@code +lon_1}, {@code imw_p} substitutes 2°, 4° or 8° from the mean + * parallel ({@code imw_p.cpp:197-206}), so the sentinel must be {@code NaN} rather than 0: + * 0 is a legal {@code +lon_1}. + */ + @Test + public void imwPLon1SentinelIsNaN() { + InternationalMapOfTheWorldPolyconicProjection p = + new InternationalMapOfTheWorldPolyconicProjection(); + assertTrue("an absent +lon_1 must be distinguishable from +lon_1=0", + Double.isNaN(p.getLon1())); + } + + /** Both {@code lcca} and {@code labrd} refuse {@code +lat_0 == 0}; a corpus row asserts each. */ + @Test + public void lccaAndLabrdRefuseAZeroLat0() { + assertRejected("+proj=lcca +ellps=GRS80"); + assertRejected("+proj=lcca +ellps=GRS80 +lat_0=0"); + assertRejected("+proj=labrd +ellps=GRS80 +lat_0=0"); + projectionOf("+proj=lcca +ellps=GRS80 +lat_0=1"); + projectionOf("+proj=labrd +ellps=GRS80 +lat_0=2 +lon_0=0.5"); + } + + /** + * {@code lcca} reads neither {@code +lat_1} nor {@code +lat_2} despite being a conic + * ({@code PROJ_HEAD} lists {@code lat_0=} alone), and the corpus block supplies both. + */ + @Test + public void lccaIgnoresTheStandardParallels() { + ProjCoordinate bare = projectionOf("+proj=lcca +ellps=GRS80 +lat_0=1") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + ProjCoordinate loud = projectionOf("+proj=lcca +ellps=GRS80 +lat_0=1 +lat_1=0.5 +lat_2=2") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + assertEquals(bare.x, loud.x, 0.0); + assertEquals(bare.y, loud.y, 0.0); + } + + // ---------------------------------------------------------------- gstmerc + + /** + * {@code gstmerc} folds {@code +k_0} into {@code n2} and must not have it applied twice: a + * non-unit {@code +k_0} has to scale the easting by exactly that factor at small longitudes. + */ + @Test + public void gstmercAppliesK0Once() { + ProjCoordinate one = projectionOf("+proj=gstmerc +R=6400000") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + ProjCoordinate half = projectionOf("+proj=gstmerc +R=6400000 +k_0=0.5") + .project(new ProjCoordinate(2, 1), new ProjCoordinate()); + assertEquals("k_0 must scale once, not twice", 0.5, half.x / one.x, 1e-6); + } + + // ---------------------------------------------------------------- aeqd + + /** + * The spherical oblique {@code aeqd} must not collapse points near its own centre to the + * origin: {@code aeqd.cpp}'s {@code TOL} is {@code 1e-14}, and within it upstream hands the + * point to the geodesic forward rather than returning {@code (0, 0)}. With the old + * {@code TOL = 1e-8} the dead zone had a radius of about 900 m. + */ + @Test + public void aeqdSphereDoesNotFlattenItsOwnNeighbourhood() { + Projection p = projectionOf( + "+proj=aeqd +a=6371008.771415 +b=6371008.771415 +lat_0=30.2345 +lon_0=-120.2345"); + ProjCoordinate out = p.project( + new ProjCoordinate(-120.234501, 30.234501), new ProjCoordinate()); + double d = Math.hypot(out.x, out.y); + assertTrue("a point 0.147 m from the centre must not project to the origin: " + out, + d > 0.1 && d < 0.2); + // The exact centre still does, in both libraries (aeqd.cpp:104-108). + ProjCoordinate centre = p.project( + new ProjCoordinate(-120.2345, 30.2345), new ProjCoordinate()); + assertEquals(0.0, centre.x, 0.0); + assertEquals(0.0, centre.y, 0.0); + } + + // ---------------------------------------------------------------- helpers + + private void assertRejected(String def) { + try { + Projection p = projectionOf(def); + fail(def + " should have been refused, but built " + p); + } catch (Proj4jException expected) { + // The message names the upstream site; see each projection's initialize(). + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/bulk/BulkTransformContractTest.java b/core/src/test/java/org/locationtech/proj4j/bulk/BulkTransformContractTest.java new file mode 100644 index 0000000..4a28191 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/bulk/BulkTransformContractTest.java @@ -0,0 +1,511 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.bulk; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.concurrent.Callable; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.BulkCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.DomainErrorPolicy; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Proj4jException; + +/** + * The normative contract of {@link BulkCoordinateTransform}, clause by clause: the status array, + * the fail-fast mode, the redundant {@code NaN} sentinel, the failure count, argument validation, + * and the interaction with {@link DomainErrorPolicy}. + * + *

{@link BulkTransformEquivalenceTest} owns the bitwise equality with the single-point path. This + * class owns the behaviours that have no single-point counterpart to compare against. + */ +public class BulkTransformContractTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + + /** A latitude past the pole by more than {@code PJ_EPS_LAT}: rejected, deterministically. */ + private static final double BAD_LATITUDE = 90.0000001; + + private static BulkCoordinateTransform bulk(DomainErrorPolicy policy) { + CoordinateTransformFactory f = new CoordinateTransformFactory(policy); + return f.createBulkTransform(CRS_FACTORY.createFromName("EPSG:4326"), + CRS_FACTORY.createFromName("EPSG:3857")); + } + + private static BulkCoordinateTransform bulk() { + return bulk(DomainErrorPolicy.THROW); + } + + // ============================================================================================== + // The two modes + // ============================================================================================== + + /** + * A non-null status array means the batch completes: every point gets a byte, every failure gets + * {@code NaN}, and the return value is the count. This is the mode the consumer uses, because it + * turns fail-closed into one branch per geometry. + */ + @Test + public void nonNullStatusCompletesTheBatchAndCountsFailures() { + double[] xy = { + 8.5, 47.4, + 0.0, BAD_LATITUDE, + 9.0, 48.0, + 1.0, BAD_LATITUDE, + 10.0, 49.0, + }; + byte[] status = new byte[5]; + + int failures = bulk().transform2D(xy, 0, 5, 2, status); + + assertEquals("two points are out of contract", 2, failures); + assertEquals(TransformStatus.OK, status[0]); + assertEquals(TransformStatus.ERR_INVALID_INPUT, status[1]); + assertEquals(TransformStatus.OK, status[2]); + assertEquals(TransformStatus.ERR_INVALID_INPUT, status[3]); + assertEquals(TransformStatus.OK, status[4]); + + // The points after a failure were still transformed: a batch is not abandoned in this mode. + assertTrue("point 4 must have been transformed", xy[8] > 1.0e6); + + // The sentinel is redundant with the status on purpose: a caller who ignores the array is no + // worse off than today, because NaN is what a failing vertex already looks like downstream. + assertTrue(Double.isNaN(xy[2])); + assertTrue(Double.isNaN(xy[3])); + assertTrue(Double.isNaN(xy[6])); + assertTrue(Double.isNaN(xy[7])); + } + + /** + * A null status array means fail-fast: the batch is abandoned at the first failure and the + * exception carries the reason. It is constructed once, when the loop is abandoned — the reason + * the status array exists at all is that constructing one per point costs 1-10 microseconds + * each. + */ + @Test + public void nullStatusFailsFastWithTheCause() { + double[] xy = {8.5, 47.4, 0.0, BAD_LATITUDE, 9.0, 48.0}; + try { + bulk().transform2D(xy, 0, 3, 2, null); + fail("expected a throw for the out-of-contract point"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + } + // The point before the failure was transformed; the one after was not reached. + assertTrue("point 0 was transformed before the batch was abandoned", xy[0] > 1.0e5); + assertEquals("point 2 must not have been reached", 9.0, xy[4], 0.0); + } + + /** + * {@link DomainErrorPolicy#RETURN_NAN} is a caller who has explicitly asked never to be thrown + * at for a per-coordinate failure, and that request outranks a null status array: they get the + * {@code NaN} sentinel and the count, with no exception. + */ + @Test + public void returnNanPolicyDoesNotThrowEvenWithoutAStatusArray() { + double[] xy = {8.5, 47.4, 0.0, BAD_LATITUDE, 9.0, 48.0}; + int failures = bulk(DomainErrorPolicy.RETURN_NAN).transform2D(xy, 0, 3, 2, null); + assertEquals(1, failures); + assertTrue(Double.isNaN(xy[2])); + assertTrue(Double.isNaN(xy[3])); + assertTrue("the batch completed", xy[4] > 1.0e6); + } + + /** With a status array the policy makes no difference: the array is the reporting channel. */ + @Test + public void statusArrayBehavesTheSameUnderBothPolicies() { + for (DomainErrorPolicy policy : DomainErrorPolicy.values()) { + double[] xy = {8.5, 47.4, 0.0, BAD_LATITUDE}; + byte[] status = new byte[2]; + int failures = bulk(policy).transform2D(xy, 0, 2, 2, status); + assertEquals(policy.name(), 1, failures); + assertEquals(policy.name(), TransformStatus.OK, status[0]); + assertEquals(policy.name(), TransformStatus.ERR_INVALID_INPUT, status[1]); + } + } + + // ============================================================================================== + // Ordinates the transform does not own + // ============================================================================================== + + /** + * A stride of 4 over a buffer that also carries M and a flag — the shape a real geometry library + * hands over. Those ordinates must survive both a success and a failure, or the bulk API cannot + * be used on a live buffer at all. + */ + @Test + public void extraOrdinatesSurviveSuccessAndFailure() { + double[] buf = { + 8.5, 47.4, 111.0, 222.0, + 0.0, BAD_LATITUDE, 333.0, 444.0, + 9.0, 48.0, 555.0, 666.0, + }; + byte[] status = new byte[3]; + assertEquals(1, bulk().transform2D(buf, 0, 3, 4, status)); + + assertEquals(111.0, buf[2], 0.0); + assertEquals(222.0, buf[3], 0.0); + assertEquals("M must survive a FAILED point too", 333.0, buf[6], 0.0); + assertEquals(444.0, buf[7], 0.0); + assertEquals(555.0, buf[10], 0.0); + assertEquals(666.0, buf[11], 0.0); + } + + /** A status array longer than the batch must not have its excess written. */ + @Test + public void statusBeyondNumPtsIsUntouched() { + double[] xy = {8.5, 47.4}; + byte[] status = {(byte) 77, (byte) 77, (byte) 77}; + bulk().transform2D(xy, 0, 1, 2, status); + assertEquals(TransformStatus.OK, status[0]); + assertEquals((byte) 77, status[1]); + assertEquals((byte) 77, status[2]); + } + + // ============================================================================================== + // Height handling + // ============================================================================================== + + /** + * {@code transform2D} treats every point as having no height, exactly as + * {@code ProjCoordinate.setValue(x, y)} does; {@code transform3D} carries one. For a target that + * consumes the height — here a 7-parameter Helmert — the two therefore differ, and that + * difference is the pre-existing "invented height" behaviour of the single-point path rather + * than a bulk-specific quirk. + */ + @Test + public void heightIsAbsentIn2DAndCarriedIn3D() { + CoordinateTransformFactory f = new CoordinateTransformFactory(); + BulkCoordinateTransform op = f.createBulkTransform( + CRS_FACTORY.createFromName("EPSG:4326"), + CRS_FACTORY.createFromName("EPSG:27700")); + + double[] xy = {-2.0, 52.0}; + double[] xyz = {-2.0, 52.0, 100.0}; + assertEquals(0, op.transform2D(xy, 0, 1, 2, null)); + assertEquals(0, op.transform3D(xyz, 0, 1, 3, null)); + + assertTrue("a Helmert consumes z, so the eastings must differ", + xy[0] != xyz[0] || xy[1] != xyz[1]); + assertTrue("3D must write a height back", !Double.isNaN(xyz[2])); + } + + /** A {@code NaN} z in a 3D batch means "no height", and comes back as {@code NaN}. */ + @Test + public void nanHeightMeansNoHeightAndIsPreserved() { + double[] xyz = {8.5, 47.4, Double.NaN}; + assertEquals(0, bulk().transform3D(xyz, 0, 1, 3, null)); + assertTrue("an absent height must stay absent", Double.isNaN(xyz[2])); + } + + /** A null {@code z} array in the struct-of-arrays form is the 2D case, and writes no height. */ + @Test + public void structOfArraysAcceptsANullHeightArray() { + double[] xs = {8.5, 9.0}; + double[] ys = {47.4, 48.0}; + assertEquals(0, bulk().transform(xs, ys, null, 0, 2, null)); + assertTrue(xs[0] > 1.0e5); + assertTrue(ys[1] > 1.0e6); + } + + // ============================================================================================== + // Argument validation: once per batch, never per point + // ============================================================================================== + + @Test + public void nullBufferIsApiMisuse() { + assertMisuse(new Runnable() { + public void run() { + bulk().transform2D(null, 0, 1, 2, null); + } + }); + assertMisuse(new Runnable() { + public void run() { + bulk().transform(null, new double[1], null, 0, 1, null); + } + }); + assertMisuse(new Runnable() { + public void run() { + bulk().transform(new double[1], null, null, 0, 1, null); + } + }); + } + + @Test + public void strideNarrowerThanTheCoordinateIsApiMisuse() { + assertMisuse(new Runnable() { + public void run() { + bulk().transform2D(new double[10], 0, 2, 1, null); + } + }); + assertMisuse(new Runnable() { + public void run() { + bulk().transform3D(new double[10], 0, 2, 2, null); + } + }); + } + + @Test + public void negativeOffsetOrCountIsApiMisuse() { + assertMisuse(new Runnable() { + public void run() { + bulk().transform2D(new double[10], -1, 1, 2, null); + } + }); + assertMisuse(new Runnable() { + public void run() { + bulk().transform2D(new double[10], 0, -1, 2, null); + } + }); + } + + /** + * A buffer too short is rejected before anything is written. The alternative — an + * {@code ArrayIndexOutOfBoundsException} from inside the loop — leaves the caller's buffer half + * transformed, which is the one outcome worse than a clean refusal. + */ + @Test + public void tooShortBufferIsRejectedBeforeAnythingIsWritten() { + double[] xy = {8.5, 47.4, 9.0, 48.0}; + double[] before = xy.clone(); + try { + bulk().transform2D(xy, 0, 3, 2, null); + fail("expected API_MISUSE: 3 points do not fit in 4 ordinates"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.API_MISUSE, e.cause()); + } + for (int i = 0; i < xy.length; i++) { + assertEquals("index " + i + " must not have been written", before[i], xy[i], 0.0); + } + } + + /** + * A status array shorter than the batch is misuse, not a truncated report: a caller who read the + * first {@code status.length} entries would conclude the rest of the geometry succeeded. + */ + @Test + public void shortStatusArrayIsApiMisuse() { + assertMisuse(new Runnable() { + public void run() { + bulk().transform2D(new double[10], 0, 5, 2, new byte[4]); + } + }); + } + + /** The overflow guard: a range whose last index overflows {@code int} must still be rejected. */ + @Test + public void aRangeThatOverflowsIntIsRejectedRatherThanWrapping() { + assertMisuse(new Runnable() { + public void run() { + bulk().transform2D(new double[16], 0, 1 << 30, 4, null); + } + }); + } + + // ============================================================================================== + // Operation-level failures + // ============================================================================================== + + /** + * A source CRS with no inverse is an operation failure, so it throws once per batch + * rather than filling the status array with a per-point code. Recording it per point would + * report a planning-time defect once per vertex. + */ + @Test + public void aSourceWithNoInverseThrowsOnceRatherThanPerPoint() { + // +proj=august, not +proj=wintri. wintri USED to be forward-only here, which made it the + // obvious example; it is not any more - aitoff.cpp has had a Newton-Raphson inverse since + // 2015 and AitoffProjection now ports it, which closed 16 builtins.gie assertions. August + // Epicycloidal is declared "Misc Sph, no inv" upstream and has no projectInverse here. + CoordinateReferenceSystem forwardOnly = + CRS_FACTORY.createFromParameters("august", "+proj=august +datum=WGS84"); + CoordinateReferenceSystem wgs84 = CRS_FACTORY.createFromName("EPSG:4326"); + BulkCoordinateTransform op = + new CoordinateTransformFactory().createBulkTransform(forwardOnly, wgs84); + + double[] xy = new double[20]; + byte[] status = new byte[10]; + try { + op.transform2D(xy, 0, 10, 2, status); + fail("expected NO_INVERSE_AVAILABLE"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.NO_INVERSE_AVAILABLE, e.cause()); + } + assertEquals("nothing may have been recorded", TransformStatus.OK, status[0]); + } + + // ============================================================================================== + // The API surface + // ============================================================================================== + + /** + * {@code StagedApis} in the benchmark module discovers + * {@code org.locationtech.proj4j.BulkCoordinateTransform} by name and requires the transform the + * factory returns to be an instance of it. Pinned here so that renaming or unhooking the + * interface fails a core test rather than silently reverting the staged benchmark to throwing + * from {@code @Setup}. + */ + @Test + public void theTransformFactoryReturnsSomethingTheBulkApiCanAdapt() throws Exception { + Class byName = Class.forName("org.locationtech.proj4j.BulkCoordinateTransform"); + assertSame(BulkCoordinateTransform.class, byName); + + CoordinateTransformFactory f = new CoordinateTransformFactory(); + CoordinateReferenceSystem src = CRS_FACTORY.createFromName("EPSG:4326"); + CoordinateReferenceSystem tgt = CRS_FACTORY.createFromName("EPSG:32633"); + + CoordinateTransform single = f.createTransform(src, tgt); + assertTrue("a CoordinateTransform must be castable to the bulk API", + byName.isInstance(single)); + assertTrue(single instanceof BasicCoordinateTransform); + + // The four signatures, resolved exactly as StagedApis resolves them. + byName.getMethod("transform2D", double[].class, int.class, int.class, int.class, + byte[].class); + byName.getMethod("transform3D", double[].class, int.class, int.class, int.class, + byte[].class); + byName.getMethod("transform2D", double[].class, int.class, int.class, double[].class, + int.class, int.class, int.class, byte[].class); + byName.getMethod("transform", double[].class, double[].class, double[].class, int.class, + int.class, byte[].class); + + assertNotNull(f.createBulkTransform(src, tgt)); + } + + /** The status-code taxonomy round trips to {@link ErrorCause} and back where it is total. */ + @Test + public void statusCodesMapToTheErrorTaxonomy() { + assertNull(TransformStatus.cause(TransformStatus.OK)); + assertTrue(TransformStatus.isOk(TransformStatus.OK)); + + byte[] codes = { + TransformStatus.ERR_COORD_OUT_OF_DOMAIN, + TransformStatus.ERR_NUMERICAL_FAILURE, + TransformStatus.ERR_MISSING_GRID, + TransformStatus.ERR_OUTSIDE_GRID_EXTENT, + TransformStatus.ERR_OUTSIDE_AREA_OF_USE, + TransformStatus.ERR_NO_OPERATION, + TransformStatus.ERR_INVALID_INPUT, + }; + for (byte code : codes) { + ErrorCause cause = TransformStatus.cause(code); + assertNotNull(TransformStatus.name(code), cause); + assertTrue(TransformStatus.name(code) + " must not be OK", + !TransformStatus.isOk(code)); + } + + // Every per-coordinate cause has a code; nothing else does. + for (ErrorCause cause : ErrorCause.values()) { + byte code = TransformStatus.forCause(cause); + if (cause.isCoordinateError()) { + assertTrue(cause + " is per-coordinate and must have a status code", + code != TransformStatus.NOT_A_COORDINATE_ERROR); + } else { + assertEquals(cause + " is not per-coordinate and must not have a status code", + TransformStatus.NOT_A_COORDINATE_ERROR, code); + } + } + } + + // ============================================================================================== + // Sharing across threads + // ============================================================================================== + + /** + * The pooled scratch coordinate is the one piece of per-call state the bulk path holds, so the + * pool is the one place a shared transform could tear. Ten threads, one transform, a barrier + * start, and the assertion is bitwise against a single-threaded reference — a tolerance + * assertion would pass through a torn double, which defeats the purpose. + * + * @throws Exception if a worker fails + */ + @Test(timeout = 60000) + public void oneTransformIsSafeToShareAcrossThreads() throws Exception { + final BulkCoordinateTransform op = bulk(); + final int points = 500; + final double[] template = new double[points * 2]; + for (int i = 0; i < points; i++) { + template[i * 2] = -170.0 + i * 0.5; + template[i * 2 + 1] = -80.0 + i * 0.3; + } + + double[] expected = template.clone(); + assertEquals(0, op.transform2D(expected, 0, points, 2, new byte[points])); + + final int threads = Math.max(4, Runtime.getRuntime().availableProcessors() * 2); + final CyclicBarrier barrier = new CyclicBarrier(threads); + ExecutorService pool = Executors.newFixedThreadPool(threads); + try { + Future[] futures = new Future[threads]; + for (int t = 0; t < threads; t++) { + futures[t] = pool.submit(new Callable() { + public double[] call() throws Exception { + barrier.await(); + double[] buf = template.clone(); + byte[] status = new byte[points]; + for (int rep = 0; rep < 20; rep++) { + System.arraycopy(template, 0, buf, 0, template.length); + if (op.transform2D(buf, 0, points, 2, status) != 0) { + throw new IllegalStateException("unexpected failure"); + } + } + return buf; + } + }); + } + for (int t = 0; t < threads; t++) { + double[] got = (double[]) futures[t].get(50, TimeUnit.SECONDS); + for (int i = 0; i < got.length; i++) { + assertEquals("thread " + t + " ordinate " + i + " is not bit-identical to the " + + "single-threaded result", + Double.doubleToRawLongBits(expected[i]), + Double.doubleToRawLongBits(got[i])); + } + } + } finally { + pool.shutdownNow(); + } + } + + // ============================================================================================== + // Helpers + // ============================================================================================== + + private static void assertMisuse(Runnable call) { + try { + call.run(); + fail("expected CrsTransformException with API_MISUSE"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.API_MISUSE, e.cause()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/bulk/BulkTransformEquivalenceTest.java b/core/src/test/java/org/locationtech/proj4j/bulk/BulkTransformEquivalenceTest.java new file mode 100644 index 0000000..780df7c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/bulk/BulkTransformEquivalenceTest.java @@ -0,0 +1,769 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.bulk; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.BulkCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Gate D: the bulk path equals N single-point calls, bitwise. + * + *

Why bitwise and not a tolerance

+ * + *

Because every mechanism the bulk path uses is pure fusion — hoisting loop invariants, + * removing allocation, skipping an identity axis permutation — none of which changes the arithmetic + * or its order. If the result is not bit-identical then the arithmetic did change, and that + * is a defect rather than an optimisation. A tolerance assertion cannot tell those two apart, which + * makes it exactly the wrong instrument. + * + *

Comparison is on {@link Double#doubleToRawLongBits(double)}, which distinguishes two things a + * tolerance and even {@code assertEquals(double, double, 0.0)} both hide: + * + *

    + *
  • {@code +0.0} versus {@code -0.0}. {@code assertEquals(0.0, -0.0, 0.0)} passes. The + * distinction is real on real data: it occurs at the equator and at the prime meridian, and it + * survives into output because a false easting of zero and a negation are both sign-preserving. + * The fixture pins all four sign combinations of zero for exactly this reason. It is also the + * specific hazard behind not eliding the prime-meridian addition when the offset is zero: + * {@code -0.0 + 0.0} is {@code +0.0}.
  • + *
  • {@code NaN} payloads. {@code assertEquals} treats every {@code NaN} as equal to every + * other, and {@code raw} bits (rather than {@code doubleToLongBits}) additionally decline to + * canonicalise signalling {@code NaN}s. Since {@code NaN} in / {@code NaN} out is a contract + * here rather than an accident, the propagation path is worth pinning precisely.
  • + *
+ * + *

What the fixture covers, and why each is a separate axis

+ * + *
    + *
  • Eight CRS pairs, so the datum stage is exercised in all of its shapes: no datum work, + * a 7-parameter Helmert through geocentric coordinates, a grid-shift-typed transform, a + * geocentric target, and projected-to-projected where both a forward and an inverse run.
  • + *
  • Partial batches — a batch shorter than the buffer, so an off-by-one in the loop bound + * shows up as an untransformed tail rather than as an exception.
  • + *
  • Non-zero offsets and non-unit strides (3, 4, 5, 7), including strides wider + * than the coordinate, with sentinel values in the ordinates the transform does not own. A + * stride-2-specialised loop passes every stride-2 test and corrupts every real geometry + * buffer.
  • + *
  • Aliased {@code src == dst} in all three overlap arrangements: coincident (pure + * in-place), destination above source (needs a descending loop), destination below source + * (needs an ascending one). Getting the direction wrong does not throw — it silently + * transforms some points twice, which is the failure mode a bitwise test catches and a + * round-trip test does not.
  • + *
  • Awkward ordinates: signed zeros, the antimeridian from both sides, longitudes outside + * [-180, 180] (which PROJ does not reject, so neither may we), both poles, a latitude + * a hair past the pole (which is rejected), and {@code NaN}.
  • + *
+ * + * @see BulkCoordinateTransform + */ +public class BulkTransformEquivalenceTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORM_FACTORY = + new CoordinateTransformFactory(); + + /** + * The eight representative pairs from {@code reference/performance.md}. Each is here because it + * exercises a distinct stage of the pipeline, not for coverage. + */ + private static final String[][] PAIRS = { + {"EPSG:4326", "EPSG:4326"}, // the floor: envelope only + {"EPSG:4326", "EPSG:3857"}, // spherical merc, no datum work + {"EPSG:4326", "EPSG:32633"}, // etmerc, the most expensive projection + {"EPSG:32633", "EPSG:3857"}, // projected to projected, same datum + {"EPSG:4326", "EPSG:27700"}, // 7-parameter Helmert, geocentric round trip + {"EPSG:4267", "EPSG:4269"}, // grid-shift-typed + {"EPSG:4326", "EPSG:5070"}, // Albers + {"EPSG:4326", "EPSG:4978"}, // geocentric target + }; + + /** Geographic sample ordinates, degrees. */ + private static final double[][] GEOGRAPHIC = { + {8.5, 47.4}, + {15.0, 47.4}, + {-96.0, 39.0}, + {-2.0, 52.0}, + {0.0, 0.0}, + {-0.0, 0.0}, + {0.0, -0.0}, + {-0.0, -0.0}, + {180.0, 0.0}, + {-180.0, 0.0}, + {179.999999999, 45.0}, + {-179.999999999, -45.0}, + {200.0, 10.0}, // legal: PROJ's only longitude bound is |lambda| > 10 rad + {-190.0, -10.0}, + {0.0, 90.0}, + {0.0, -90.0}, + {8.5, 90.0000001}, // rejected: overshoots PJ_EPS_LAT + {Double.NaN, 47.4}, + {8.5, Double.NaN}, + }; + + /** Projected sample ordinates, metres, for a projected source CRS. */ + private static final double[][] PROJECTED = { + {500000.0, 5250000.0}, + {166021.44, 0.0}, + {0.0, 0.0}, + {-0.0, 0.0}, + {0.0, -0.0}, + {1000000.0, 6000000.0}, + {Double.NaN, 5250000.0}, + }; + + /** Heights, including both signed zeros and the absent-height sentinel. */ + private static final double[] HEIGHTS = {100.0, 0.0, -0.0, -50.5, Double.NaN}; + + // ============================================================================================== + // The batch shapes + // ============================================================================================== + + @Test + public void interleaved2DInPlaceMatchesSinglePointBitwise() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + for (int stride : new int[] {2, 3, 4, 7}) { + for (int offset : new int[] {0, 1, 5}) { + f.check2DInPlace(offset, stride); + } + } + } + } + + @Test + public void interleaved3DInPlaceMatchesSinglePointBitwise() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + for (int stride : new int[] {3, 4, 7}) { + for (int offset : new int[] {0, 2}) { + f.check3DInPlace(offset, stride); + } + } + } + } + + @Test + public void separateSourceAndDestinationMatchesSinglePointBitwise() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + f.checkSrcToDst(0, 2, 0, 2); + f.checkSrcToDst(3, 2, 1, 4); + f.checkSrcToDst(1, 5, 4, 2); + } + } + + @Test + public void structOfArraysMatchesSinglePointBitwise() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + for (int offset : new int[] {0, 1, 6}) { + f.checkSoa(offset, true); + f.checkSoa(offset, false); + } + } + } + + /** + * A batch shorter than the buffer. The tail must be left exactly as it was: an off-by-one in + * the loop bound is otherwise invisible until a caller notices one stale vertex per geometry. + */ + @Test + public void partialBatchLeavesTheTailUntouched() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + f.checkPartialBatch(); + } + } + + // ============================================================================================== + // Aliasing + // ============================================================================================== + + /** + * {@code src == dst} with coincident ranges: the pure in-place case, reached through the + * source-to-destination signature rather than through {@code transform2D(xy, ...)}. + */ + @Test + public void aliasedCoincidentRangesMatchInPlace() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + f.checkAliased(0, 0, 2); + f.checkAliased(4, 4, 2); + } + } + + /** + * {@code src == dst} with the destination above the source, overlapping. Requires a + * descending loop; an ascending one overwrites source ordinates before they are read, which + * transforms some points twice and produces a plausible, wrong answer. + */ + @Test + public void aliasedDestinationAboveSourceMatchesSinglePointBitwise() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + f.checkAliased(0, 2, 2); + f.checkAliased(1, 7, 4); + } + } + + /** {@code src == dst} with the destination below the source, overlapping. */ + @Test + public void aliasedDestinationBelowSourceMatchesSinglePointBitwise() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + f.checkAliased(2, 0, 2); + f.checkAliased(9, 3, 4); + } + } + + /** + * Overlapping ranges in one array at different strides. The write index crosses the read index + * part way through the batch, so no single direction is safe — and returning a plausible + * coordinate for the points that got clobbered would be worse than refusing. + */ + @Test + public void aliasedOverlapAtDifferentStridesIsRejected() { + Fixture f = new Fixture(PAIRS[1]); + double[] buf = new double[400]; + try { + f.bulk.transform2D(buf, 0, 2, buf, 1, 4, 50, new byte[50]); + fail("expected API_MISUSE for an overlapping alias at mismatched strides"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.API_MISUSE, e.cause()); + } + } + + /** Disjoint ranges within one array are not an overlap and must be accepted. */ + @Test + public void aliasedDisjointRangesAreAccepted() { + Fixture f = new Fixture(PAIRS[1]); + f.checkAliasedDisjoint(); + } + + // ============================================================================================== + // Fixture + // ============================================================================================== + + /** + * One CRS pair, its two transforms (they are the same object, reached through two interfaces), + * its sample points and the per-point reference results. + */ + private static final class Fixture { + final String name; + final CoordinateTransform single; + final BulkCoordinateTransform bulk; + /** Sample points, x/y/z triples; z is drawn from {@link #HEIGHTS}. */ + final double[][] points; + /** Reference for a 2D call, i.e. with z = NaN, one per sample point. */ + final Ref[] ref2D; + /** Reference for a 3D call, i.e. with the sample's own z. */ + final Ref[] ref3D; + + Fixture(String[] pair) { + this.name = pair[0] + " -> " + pair[1]; + CoordinateReferenceSystem src = CRS_FACTORY.createFromName(pair[0]); + CoordinateReferenceSystem tgt = CRS_FACTORY.createFromName(pair[1]); + this.single = TRANSFORM_FACTORY.createTransform(src, tgt); + this.bulk = TRANSFORM_FACTORY.createBulkTransform(src, tgt); + + double[][] base = pair[0].equals("EPSG:32633") ? PROJECTED : GEOGRAPHIC; + List pts = new ArrayList(); + for (int i = 0; i < base.length; i++) { + pts.add(new double[] {base[i][0], base[i][1], HEIGHTS[i % HEIGHTS.length]}); + } + this.points = pts.toArray(new double[pts.size()][]); + + this.ref2D = new Ref[points.length]; + this.ref3D = new Ref[points.length]; + for (int i = 0; i < points.length; i++) { + ref2D[i] = reference(single, points[i][0], points[i][1], Double.NaN); + ref3D[i] = reference(single, points[i][0], points[i][1], points[i][2]); + } + } + + /** + * The sample points whose reference outcome the batch API can express: a success, or a + * per-coordinate failure. A non-per-coordinate failure abandons the whole batch by design, + * so such a point cannot appear in a batch that is being compared point by point; those are + * asserted individually by {@link #eachNonCoordinateErrorAbandonsTheBatch()}. + */ + int[] batchable(Ref[] ref) { + int n = 0; + for (Ref r : ref) { + if (r.thrown == null || r.thrown.isCoordinateError()) { + n++; + } + } + int[] idx = new int[n]; + int j = 0; + for (int i = 0; i < ref.length; i++) { + if (ref[i].thrown == null || ref[i].thrown.isCoordinateError()) { + idx[j++] = i; + } + } + return idx; + } + + // ---------------------------------------------------------------------------------- 2D + void check2DInPlace(int offset, int stride) { + int[] idx = batchable(ref2D); + int n = idx.length; + double[] buf = filled(offset + n * stride + 4); + for (int i = 0; i < n; i++) { + buf[offset + i * stride] = points[idx[i]][0]; + buf[offset + i * stride + 1] = points[idx[i]][1]; + } + double[] before = buf.clone(); + byte[] status = new byte[n + 3]; + java.util.Arrays.fill(status, (byte) 99); + + int failures = bulk.transform2D(buf, offset, n, stride, status); + + String where = name + " transform2D in place offset=" + offset + " stride=" + stride; + assertOutcome(where, idx, ref2D, buf, offset, stride, 2, status, failures); + assertUntouched(where, before, buf, offset, stride, 2, n); + } + + // ---------------------------------------------------------------------------------- 3D + void check3DInPlace(int offset, int stride) { + int[] idx = batchable(ref3D); + int n = idx.length; + double[] buf = filled(offset + n * stride + 4); + for (int i = 0; i < n; i++) { + buf[offset + i * stride] = points[idx[i]][0]; + buf[offset + i * stride + 1] = points[idx[i]][1]; + buf[offset + i * stride + 2] = points[idx[i]][2]; + } + double[] before = buf.clone(); + byte[] status = new byte[n]; + + int failures = bulk.transform3D(buf, offset, n, stride, status); + + String where = name + " transform3D in place offset=" + offset + " stride=" + stride; + assertOutcome(where, idx, ref3D, buf, offset, stride, 3, status, failures); + assertUntouched(where, before, buf, offset, stride, 3, n); + } + + // ------------------------------------------------------------------------- src -> dst + void checkSrcToDst(int srcOff, int srcStride, int dstOff, int dstStride) { + int[] idx = batchable(ref2D); + int n = idx.length; + double[] src = filled(srcOff + n * srcStride + 4); + for (int i = 0; i < n; i++) { + src[srcOff + i * srcStride] = points[idx[i]][0]; + src[srcOff + i * srcStride + 1] = points[idx[i]][1]; + } + double[] srcBefore = src.clone(); + double[] dst = filled(dstOff + n * dstStride + 4); + double[] dstBefore = dst.clone(); + byte[] status = new byte[n]; + + int failures = + bulk.transform2D(src, srcOff, srcStride, dst, dstOff, dstStride, n, status); + + String where = name + " transform2D src->dst srcOff=" + srcOff + "/" + srcStride + + " dstOff=" + dstOff + "/" + dstStride; + assertOutcome(where, idx, ref2D, dst, dstOff, dstStride, 2, status, failures); + assertUntouched(where + " (dst)", dstBefore, dst, dstOff, dstStride, 2, n); + assertArrayBitwise(where + " (src must be read-only)", srcBefore, src); + } + + // ------------------------------------------------------------------------------ aliased + void checkAliased(int srcOff, int dstOff, int stride) { + int[] idx = batchable(ref2D); + int n = idx.length; + int len = Math.max(srcOff, dstOff) + n * stride + 4; + double[] buf = filled(len); + for (int i = 0; i < n; i++) { + buf[srcOff + i * stride] = points[idx[i]][0]; + buf[srcOff + i * stride + 1] = points[idx[i]][1]; + } + byte[] status = new byte[n]; + + int failures = bulk.transform2D(buf, srcOff, stride, buf, dstOff, stride, n, status); + + String where = name + " aliased srcOff=" + srcOff + " dstOff=" + dstOff + + " stride=" + stride; + assertOutcome(where, idx, ref2D, buf, dstOff, stride, 2, status, failures); + } + + void checkAliasedDisjoint() { + int[] idx = batchable(ref2D); + int n = idx.length; + int gap = 2 * n * 2 + 8; + double[] buf = filled(gap + n * 2 + 4); + for (int i = 0; i < n; i++) { + buf[i * 2] = points[idx[i]][0]; + buf[i * 2 + 1] = points[idx[i]][1]; + } + byte[] status = new byte[n]; + int failures = bulk.transform2D(buf, 0, 2, buf, gap, 2, n, status); + assertOutcome(name + " aliased disjoint", idx, ref2D, buf, gap, 2, 2, status, failures); + } + + // ---------------------------------------------------------------------------------- SoA + void checkSoa(int offset, boolean withZ) { + Ref[] ref = withZ ? ref3D : ref2D; + int[] idx = batchable(ref); + int n = idx.length; + double[] xs = filled(offset + n + 3); + double[] ys = filled(offset + n + 3); + double[] zs = filled(offset + n + 3); + for (int i = 0; i < n; i++) { + xs[offset + i] = points[idx[i]][0]; + ys[offset + i] = points[idx[i]][1]; + zs[offset + i] = points[idx[i]][2]; + } + double[] zsBefore = zs.clone(); + byte[] status = new byte[n]; + + int failures = bulk.transform(xs, ys, withZ ? zs : null, offset, n, status); + + String where = name + " transform SoA offset=" + offset + " withZ=" + withZ; + int failed = 0; + for (int i = 0; i < n; i++) { + Ref r = ref[idx[i]]; + String at = where + " point " + i + " " + describe(points[idx[i]]); + if (r.thrown == null) { + assertEquals(at + " status", TransformStatus.OK, status[i]); + assertBits(at + " x", r.xb, xs[offset + i]); + assertBits(at + " y", r.yb, ys[offset + i]); + if (withZ) { + assertBits(at + " z", r.zb, zs[offset + i]); + } + } else { + failed++; + assertEquals(at + " status", TransformStatus.forCause(r.thrown), status[i]); + assertTrue(at + " x sentinel", Double.isNaN(xs[offset + i])); + assertTrue(at + " y sentinel", Double.isNaN(ys[offset + i])); + if (withZ) { + assertTrue(at + " z sentinel", Double.isNaN(zs[offset + i])); + } + } + } + assertEquals(where + " failure count", failed, failures); + if (!withZ) { + assertArrayBitwise(where + " (z must be untouched when null)", zsBefore, zs); + } + } + + // ------------------------------------------------------------------------ partial batch + void checkPartialBatch() { + int[] idx = batchable(ref2D); + int n = idx.length; + int batch = n / 2; + double[] buf = filled(n * 2); + for (int i = 0; i < n; i++) { + buf[i * 2] = points[idx[i]][0]; + buf[i * 2 + 1] = points[idx[i]][1]; + } + double[] before = buf.clone(); + byte[] status = new byte[n]; + java.util.Arrays.fill(status, (byte) 99); + + bulk.transform2D(buf, 0, batch, 2, status); + + for (int i = batch; i < n; i++) { + assertBits(name + " partial batch: tail point " + i + " x must be untouched", + Double.doubleToRawLongBits(before[i * 2]), buf[i * 2]); + assertBits(name + " partial batch: tail point " + i + " y must be untouched", + Double.doubleToRawLongBits(before[i * 2 + 1]), buf[i * 2 + 1]); + assertEquals(name + " partial batch: status beyond numPts must be untouched", + (byte) 99, status[i]); + } + } + + // ------------------------------------------------------------------------------ helpers + private void assertOutcome(String where, int[] idx, Ref[] ref, double[] buf, int offset, + int stride, int width, byte[] status, int failures) { + int failed = 0; + for (int i = 0; i < idx.length; i++) { + Ref r = ref[idx[i]]; + int k = offset + i * stride; + String at = where + " point " + i + " " + describe(points[idx[i]]); + if (r.thrown == null) { + assertEquals(at + " status", TransformStatus.OK, status[i]); + assertBits(at + " x", r.xb, buf[k]); + assertBits(at + " y", r.yb, buf[k + 1]); + if (width >= 3) { + assertBits(at + " z", r.zb, buf[k + 2]); + } + } else { + failed++; + assertEquals(at + " status", TransformStatus.forCause(r.thrown), status[i]); + for (int w = 0; w < width; w++) { + assertTrue(at + " ordinate " + w + " must be the NaN sentinel", + Double.isNaN(buf[k + w])); + } + } + } + assertEquals(where + " failure count", failed, failures); + } + + /** Every ordinate inside the range but outside the coordinate width must be untouched. */ + private void assertUntouched(String where, double[] before, double[] after, int offset, + int stride, int width, int numPts) { + for (int i = 0; i < before.length; i++) { + boolean owned = false; + if (i >= offset) { + int rel = i - offset; + int point = rel / stride; + if (point < numPts && rel % stride < width) { + owned = true; + } + } + if (!owned) { + assertBits(where + " index " + i + " is not the transform's to write", + Double.doubleToRawLongBits(before[i]), after[i]); + } + } + } + } + + // ============================================================================================== + // Non-coordinate failures abandon the batch + // ============================================================================================== + + /** + * A cause that is not per-coordinate is a property of the operation, so it must throw rather + * than be squeezed into a status byte — recording it once per row would report a planning-time + * defect once per vertex. Asserted against the single-point path, which throws the same cause. + * + *

The eight-pair fixture reaches none of these, and that is a finding worth writing down

+ * + *

The expectation going in was that a {@code NaN} longitude would reach + * {@code Projection.inverseProjectRadians}' trailing {@code normalizeLongitude} whenever the + * source projection has {@code +lon_0 != 0} — EPSG:32633 does — and raise + * {@code INVALID_PARAM_VALUE}, a CRS-definition cause rather than a coordinate one. It does not: + * that call goes to {@code ProjectionMath.normalizeLongitude}, which is upstream's + * {@code adjlon} and is {@code NaN}-transparent, not to + * {@code Projection.normalizeLongitudeRadians}, which is the method that rejects {@code NaN}. + * Two similarly named methods, one of which throws. So {@code NaN} propagates cleanly through + * every pair here, and the sweep below finds nothing to check. + * + *

Rather than leave a vacuous loop, the case is constructed explicitly: a forward-only source + * projection gives {@code NO_INVERSE_AVAILABLE}, which is an operation cause by definition. + */ + @Test + public void eachNonCoordinateErrorAbandonsTheBatch() { + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + for (int i = 0; i < f.points.length; i++) { + Ref r = f.ref2D[i]; + if (r.thrown == null || r.thrown.isCoordinateError()) { + continue; + } + double[] buf = {f.points[i][0], f.points[i][1]}; + try { + f.bulk.transform2D(buf, 0, 1, 2, new byte[1]); + fail(f.name + " " + describe(f.points[i]) + ": single-point path threw " + + r.thrown + " but the bulk path returned normally"); + } catch (Proj4jException e) { + assertEquals(f.name + " " + describe(f.points[i]) + ": cause must match the " + + "single-point path", r.thrown, e.cause()); + } + } + } + + // The constructed case, so this test is not vacuous. + // +proj=august, not +proj=wintri: wintri gained an inverse when AitoffProjection picked up + // aitoff.cpp's Newton-Raphson solver. August Epicycloidal is "Misc Sph, no inv" upstream. + CoordinateReferenceSystem forwardOnly = + CRS_FACTORY.createFromParameters("august", "+proj=august +datum=WGS84"); + CoordinateReferenceSystem wgs84 = CRS_FACTORY.createFromName("EPSG:4326"); + CoordinateTransform single = TRANSFORM_FACTORY.createTransform(forwardOnly, wgs84); + BulkCoordinateTransform batch = TRANSFORM_FACTORY.createBulkTransform(forwardOnly, wgs84); + + Ref r = reference(single, 100000.0, 200000.0, Double.NaN); + assertTrue("a forward-only source must fail at the single point too", r.thrown != null); + assertTrue(r.thrown + " must not be a coordinate cause", !r.thrown.isCoordinateError()); + + byte[] status = new byte[4]; + try { + batch.transform2D(new double[8], 0, 4, 2, status); + fail("a forward-only source must abandon the batch, not fill the status array"); + } catch (Proj4jException e) { + assertEquals(r.thrown, e.cause()); + } + assertEquals("nothing may have been recorded", TransformStatus.OK, status[0]); + } + + /** + * The per-coordinate causes the fixture reaches are the ones the classification table promises. + * Guards against the whole equivalence suite passing vacuously because every point succeeded. + */ + @Test + public void fixtureActuallyReachesCoordinateFailures() { + boolean sawInvalidInput = false; + boolean sawOk = false; + for (String[] pair : PAIRS) { + Fixture f = new Fixture(pair); + for (Ref r : f.ref2D) { + if (r.thrown == null) { + sawOk = true; + } else if (r.thrown == ErrorCause.INVALID_COORDINATE) { + sawInvalidInput = true; + assertEquals(TransformStatus.ERR_INVALID_INPUT, + TransformStatus.forCause(r.thrown)); + } + } + } + assertTrue("fixture never succeeded anywhere", sawOk); + assertTrue("fixture never produced an INVALID_COORDINATE; the latitude past the pole " + + "should have", sawInvalidInput); + } + + /** + * {@code NaN} in, {@code NaN} out, status {@link TransformStatus#OK} — a result, not a failure. + * Pinned separately from the sweep because it is the one classification rule that looks like a + * bug until you know the corpus asserts it. + */ + @Test + public void nanInputPropagatesAsAResultNotAFailure() { + Fixture f = new Fixture(PAIRS[1]); // EPSG:4326 -> EPSG:3857, +lon_0 = 0 + double[][] nans = { + {Double.NaN, 47.4}, + {8.5, Double.NaN}, + {Double.NaN, Double.NaN}, + }; + double[] buf = new double[nans.length * 2]; + for (int i = 0; i < nans.length; i++) { + buf[i * 2] = nans[i][0]; + buf[i * 2 + 1] = nans[i][1]; + } + byte[] status = new byte[nans.length]; + + int failures = f.bulk.transform2D(buf, 0, nans.length, 2, status); + + assertEquals("NaN input is not a failure", 0, failures); + for (int i = 0; i < nans.length; i++) { + assertEquals("point " + i + " status", TransformStatus.OK, status[i]); + // And bit-identically to the single-point path, NaN payload included. + Ref r = reference(f.single, nans[i][0], nans[i][1], Double.NaN); + assertEquals("point " + i + " must not have thrown", null, r.thrown); + assertBits("NaN propagation x, point " + i, r.xb, buf[i * 2]); + assertBits("NaN propagation y, point " + i, r.yb, buf[i * 2 + 1]); + } + } + + /** A zero-length batch is legal, does nothing, and touches nothing. */ + @Test + public void emptyBatchIsANoOp() { + Fixture f = new Fixture(PAIRS[2]); + double[] buf = {1.0, 2.0, 3.0, 4.0}; + double[] before = buf.clone(); + byte[] status = {(byte) 42, (byte) 42}; + assertEquals(0, f.bulk.transform2D(buf, 0, 0, 2, status)); + assertEquals(0, f.bulk.transform3D(buf, 0, 0, 3, status)); + assertEquals(0, f.bulk.transform2D(buf, 0, 2, buf, 0, 2, 0, status)); + assertEquals(0, f.bulk.transform(buf, buf, null, 0, 0, status)); + assertArrayBitwise("an empty batch must not write", before, buf); + assertEquals((byte) 42, status[0]); + assertEquals((byte) 42, status[1]); + } + + // ============================================================================================== + // Reference and assertions + // ============================================================================================== + + /** One single-point outcome: either the raw bits of the result, or the cause it threw. */ + private static final class Ref { + final long xb; + final long yb; + final long zb; + final ErrorCause thrown; + + Ref(long xb, long yb, long zb) { + this.xb = xb; + this.yb = yb; + this.zb = zb; + this.thrown = null; + } + + Ref(ErrorCause thrown) { + this.xb = 0; + this.yb = 0; + this.zb = 0; + this.thrown = thrown; + } + } + + /** + * The reference: one call through the single-point API, in the exact shape a caller uses. + * + * @param z {@code NaN} to reproduce a two-argument {@code setValue}, i.e. a 2D caller + */ + private static Ref reference(CoordinateTransform t, double x, double y, double z) { + ProjCoordinate in = new ProjCoordinate(); + ProjCoordinate out = new ProjCoordinate(); + in.setValue(x, y, z); + try { + t.transform(in, out); + return new Ref(Double.doubleToRawLongBits(out.x), + Double.doubleToRawLongBits(out.y), + Double.doubleToRawLongBits(out.z)); + } catch (Proj4jException e) { + return new Ref(e.cause()); + } + } + + private static void assertBits(String message, long expectedBits, double actual) { + long actualBits = Double.doubleToRawLongBits(actual); + if (expectedBits != actualBits) { + fail(message + ": expected " + Double.longBitsToDouble(expectedBits) + " (0x" + + Long.toHexString(expectedBits) + ") but was " + actual + " (0x" + + Long.toHexString(actualBits) + ")"); + } + } + + private static void assertArrayBitwise(String message, double[] expected, double[] actual) { + assertEquals(message + ": length", expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertBits(message + " at " + i, Double.doubleToRawLongBits(expected[i]), actual[i]); + } + } + + /** + * A buffer pre-loaded with distinguishable sentinels, so that anything the transform writes + * where it should not is visible rather than coincidentally correct. Deliberately not zeros: + * zero is a plausible output. + */ + private static double[] filled(int length) { + double[] a = new double[length]; + for (int i = 0; i < length; i++) { + a[i] = -1.0e300 - i; + } + return a; + } + + private static String describe(double[] p) { + return "(" + p[0] + ", " + p[1] + ", " + p[2] + ")"; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/concurrent/SharedTransformConcurrencyTest.java b/core/src/test/java/org/locationtech/proj4j/concurrent/SharedTransformConcurrencyTest.java new file mode 100644 index 0000000..779bad9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/concurrent/SharedTransformConcurrencyTest.java @@ -0,0 +1,271 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.concurrent; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CyclicBarrier; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Proves that a single {@link CoordinateTransform} instance may be shared across threads. + *

+ * Assertions are made on {@link Double#doubleToRawLongBits(double)} rather than with a + * tolerance: a projection that keeps per-call scratch state in instance fields produces + * finite, plausible coordinates when two threads interleave, and a tolerance-based + * assertion would pass straight through such a torn value. Bitwise identity is the only + * assertion that actually detects the defect. + *

+ * The fixture deliberately includes {@code +proj=cass} (Cassini-Soldner, reachable from 31 + * shipped EPSG codes) in both directions, because Cassini was the one projection in the tree + * that wrote scratch state to instance fields inside {@code project()}/{@code projectInverse()}. + */ +public class SharedTransformConcurrencyTest { + + /** Iterations of the whole point list, per thread, per fixture. */ + private static final int ITERATIONS = 400; + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + private static final String WGS84 = "+proj=longlat +datum=WGS84 +no_defs"; + + /** Cassini-Soldner over Johor, Malaysia -- the same geometry as EPSG:3377. */ + private static final String CASS_SYNTHETIC = + "+proj=cass +ellps=GRS80 +lat_0=2.121679744444 +lon_0=103.427936236111 " + + "+x_0=-14810.562 +y_0=8758.32 +units=m +no_defs"; + + /** A spherical Cassini, to cover the {@code spherical} branch of the projection. */ + private static final String CASS_SPHERICAL = + "+proj=cass +R=6371000 +lat_0=2.5 +lon_0=103.5 +units=m +no_defs"; + + private static final class Fixture { + final String name; + final CoordinateTransform transform; + final double[][] points; + /** Expected results as raw bits: [point][x, y, z]. */ + final long[][] expected; + + Fixture(String name, CoordinateReferenceSystem src, CoordinateReferenceSystem tgt, double[][] points) { + this.name = name; + this.transform = CT_FACTORY.createTransform(src, tgt); + this.points = points; + this.expected = new long[points.length][3]; + + // Record the single-threaded answer once, up front, on this thread only. + ProjCoordinate in = new ProjCoordinate(); + ProjCoordinate out = new ProjCoordinate(); + for (int i = 0; i < points.length; i++) { + in.setValue(points[i][0], points[i][1]); + transform.transform(in, out); + expected[i][0] = Double.doubleToRawLongBits(out.x); + expected[i][1] = Double.doubleToRawLongBits(out.y); + expected[i][2] = Double.doubleToRawLongBits(out.z); + assertTrue(name + " fixture must produce a finite easting at point " + i, + Double.isFinite(out.x)); + assertTrue(name + " fixture must produce a finite northing at point " + i, + Double.isFinite(out.y)); + } + } + } + + private static CoordinateReferenceSystem crs(String params) { + return CRS_FACTORY.createFromParameters(null, params); + } + + private static CoordinateReferenceSystem named(String name) { + return CRS_FACTORY.createFromName(name); + } + + private static List buildFixtures() { + // Points spread over the Cassini domain (peninsular Malaysia) and over the + // wider domains of the other projections, so that interleaved scratch state + // between two threads yields a different number rather than the same one. + double[][] malaysiaLonLat = { + {103.00, 1.60}, {103.43, 2.12}, {104.10, 2.80}, {102.60, 1.20}, {104.50, 3.40}, + }; + double[][] malaysiaGrid = { + {-60000.0, -50000.0}, {-14810.562, 8758.32}, {60000.0, 80000.0}, {20000.0, -30000.0}, + }; + double[][] worldLonLat = { + {12.50, 41.90}, {8.55, 47.37}, {-73.99, 40.73}, {151.21, -33.87}, {2.35, 48.86}, + }; + double[][] europeLonLat = { + {5.00, 45.00}, {9.19, 45.46}, {13.40, 52.52}, {-3.70, 40.42}, {19.04, 47.50}, + }; + double[][] polarLonLat = { + {0.00, 75.00}, {45.00, 80.00}, {-120.00, 70.00}, {170.00, 82.00}, + }; + + List fixtures = new ArrayList(); + + // --- Cassini, forward and inverse, from real EPSG codes and from a synthetic CRS. + fixtures.add(new Fixture("EPSG:4326 -> EPSG:3377 (cass)", + named("EPSG:4326"), named("EPSG:3377"), malaysiaLonLat)); + fixtures.add(new Fixture("EPSG:3377 -> EPSG:4326 (cass inverse)", + named("EPSG:3377"), named("EPSG:4326"), malaysiaGrid)); + fixtures.add(new Fixture("EPSG:3377 -> EPSG:3378 (cass both ways)", + named("EPSG:3377"), named("EPSG:3378"), malaysiaGrid)); + fixtures.add(new Fixture("wgs84 -> synthetic cass", + crs(WGS84), crs(CASS_SYNTHETIC), malaysiaLonLat)); + fixtures.add(new Fixture("synthetic cass -> wgs84", + crs(CASS_SYNTHETIC), crs(WGS84), malaysiaGrid)); + fixtures.add(new Fixture("wgs84 -> spherical cass", + crs(WGS84), crs(CASS_SPHERICAL), malaysiaLonLat)); + fixtures.add(new Fixture("spherical cass -> wgs84", + crs(CASS_SPHERICAL), crs(WGS84), malaysiaGrid)); + + // --- A few unrelated families, so the test also guards against regressions there. + fixtures.add(new Fixture("wgs84 -> utm 33N", + crs(WGS84), crs("+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs"), europeLonLat)); + fixtures.add(new Fixture("wgs84 -> lcc", + crs(WGS84), + crs("+proj=lcc +lat_1=45 +lat_2=50 +lat_0=47 +lon_0=10 +ellps=GRS80 +units=m +no_defs"), + europeLonLat)); + fixtures.add(new Fixture("wgs84 -> merc", + crs(WGS84), crs("+proj=merc +lon_0=0 +ellps=WGS84 +units=m +no_defs"), worldLonLat)); + fixtures.add(new Fixture("wgs84 -> stere", + crs(WGS84), + crs("+proj=stere +lat_0=90 +lat_ts=70 +lon_0=0 +ellps=WGS84 +units=m +no_defs"), + polarLonLat)); + fixtures.add(new Fixture("EPSG:4326 -> EPSG:3068 (cass, Berlin, +towgs84)", + named("EPSG:4326"), named("EPSG:3068"), + new double[][]{{13.40, 52.52}, {13.63, 52.42}, {13.10, 52.30}, {13.90, 52.70}})); + + return Collections.unmodifiableList(fixtures); + } + + @Test(timeout = 120_000) + public void sharedTransformIsThreadSafe() throws Exception { + final List fixtures = buildFixtures(); + final int threadCount = Math.max(4, Runtime.getRuntime().availableProcessors() * 2); + + final CyclicBarrier start = new CyclicBarrier(threadCount); + final List problems = new CopyOnWriteArrayList(); + + List threads = new ArrayList(threadCount); + for (int t = 0; t < threadCount; t++) { + final int threadIndex = t; + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + // Every thread owns its own coordinate objects; only the transforms are shared. + ProjCoordinate in = new ProjCoordinate(); + ProjCoordinate out = new ProjCoordinate(); + try { + start.await(); + for (int iter = 0; iter < ITERATIONS; iter++) { + for (Fixture f : fixtures) { + // Stagger the starting point per thread so that threads are + // never in lock-step on the same input. + for (int k = 0; k < f.points.length; k++) { + int i = (k + threadIndex) % f.points.length; + in.setValue(f.points[i][0], f.points[i][1]); + f.transform.transform(in, out); + checkBits(problems, f, i, iter, threadIndex, out); + if (!problems.isEmpty()) { + return; + } + } + } + } + } catch (Throwable e) { + problems.add("thread " + threadIndex + " threw " + e); + } + } + }, "shared-transform-" + t); + thread.setDaemon(true); + threads.add(thread); + } + + for (Thread thread : threads) { + thread.start(); + } + for (Thread thread : threads) { + thread.join(); + } + + if (!problems.isEmpty()) { + StringBuilder sb = new StringBuilder(); + sb.append(problems.size()).append(" concurrency problem(s) sharing one CoordinateTransform"); + sb.append(" across ").append(threadCount).append(" threads:"); + int shown = 0; + for (String p : problems) { + sb.append("\n ").append(p); + if (++shown == 10) { + sb.append("\n ..."); + break; + } + } + fail(sb.toString()); + } + } + + private static void checkBits(List problems, Fixture f, int i, int iter, + int threadIndex, ProjCoordinate out) { + long[] want = f.expected[i]; + if (Double.doubleToRawLongBits(out.x) != want[0] + || Double.doubleToRawLongBits(out.y) != want[1] + || Double.doubleToRawLongBits(out.z) != want[2]) { + problems.add(f.name + " point " + i + " (" + f.points[i][0] + ", " + f.points[i][1] + ")" + + " thread " + threadIndex + " iteration " + iter + + ": expected (" + Double.longBitsToDouble(want[0]) + ", " + + Double.longBitsToDouble(want[1]) + ", " + Double.longBitsToDouble(want[2]) + ")" + + " but got (" + out.x + ", " + out.y + ", " + out.z + ")"); + } + } + + /** + * {@code BasicCoordinateTransform.transform} copies {@code src} into {@code tgt} first and + * then uses {@code tgt} as both the source and the destination of every subsequent step, so + * a caller passing the same object twice must get the same answer as a caller passing two. + * A projection that keeps scratch state in instance fields, or one that reads back from the + * destination object, can break exactly here. + */ + @Test(timeout = 120_000) + public void aliasedSourceAndTargetMatchDistinctSourceAndTarget() { + for (Fixture f : buildFixtures()) { + for (int i = 0; i < f.points.length; i++) { + ProjCoordinate aliased = new ProjCoordinate(f.points[i][0], f.points[i][1]); + f.transform.transform(aliased, aliased); + + ProjCoordinate src = new ProjCoordinate(f.points[i][0], f.points[i][1]); + ProjCoordinate dst = new ProjCoordinate(); + f.transform.transform(src, dst); + + String where = f.name + " point " + i; + assertEquals(where + " x", Double.doubleToRawLongBits(dst.x), + Double.doubleToRawLongBits(aliased.x)); + assertEquals(where + " y", Double.doubleToRawLongBits(dst.y), + Double.doubleToRawLongBits(aliased.y)); + assertEquals(where + " z", Double.doubleToRawLongBits(dst.z), + Double.doubleToRawLongBits(aliased.z)); + } + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java b/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java index e73cabd..1e77285 100644 --- a/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java +++ b/core/src/test/java/org/locationtech/proj4j/datum/DatumShiftTest.java @@ -6,6 +6,7 @@ import org.locationtech.proj4j.CoordinateTransformFactory; import org.locationtech.proj4j.ProjCoordinate; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class DatumShiftTest { @@ -13,11 +14,42 @@ public class DatumShiftTest { private final CRSFactory crsFactory = new CRSFactory(); private static final CoordinateTransformFactory transformerFactory = new CoordinateTransformFactory(); + /** + * Gauss-Krueger zone 3 to a datum-less UTM 32N, by two routes. + * + *

What this test used to assert, and why it was an accident

+ * + *

It computed both routes and asserted only that they agreed to within 1 mm. They do not, and + * PROJ 9.8.1 says they should not: the target CRS declares neither {@code +datum} nor + * {@code +towgs84}, so its datum is unknown, and a datum shift into an unknown datum is not a + * thing either library will perform. The direct route therefore applies no Potsdam shift, + * while the explicit route applies it on the way through EPSG:4326 and then arrives at the same + * datum-less target. The two answers differ by 74.496 m easting and 127.513 m northing, and + * that is the correct behaviour of both libraries. + * + *

The 1 mm assertion passed only while Proj4J nested its unknown-datum check inside an + * ellipsoid-equality guard, so the direct route silently shifted too. PROJ checks it + * unconditionally and first ({@code 5.2.0:src/pj_transform.c:835}). Fixing the nesting exposed the + * test, which had been asserting the bug. + * + *

What it asserts now

+ * + *

Every leg against {@code cs2cs} 9.8.1 instead of against the other leg, so the disagreement + * is pinned as a measured, referenced fact rather than assumed away. Both routes are + * reproduced to better than 5e-8 m. + * + *

One footnote on the reference: PROJ 9.8.1 rejects the capitalised {@code +pm=Greenwich} + * in the target definition below with {@code "tmerc: Invalid value for pm"} (Proj4J's + * {@code PrimeMeridian.forName} silently falls back to Greenwich, which is a separate and much + * smaller divergence). The definition is left byte-identical to the one this test has always used; + * the {@code cs2cs} references were taken with {@code +pm=greenwich}, which is the same meridian + * and the same zero offset. + */ @Test public void gk3ToUtm32Zn() { - String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +f=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; - String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222 +pm=Greenwich +units=m +no_defs"; + String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +rf=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; + String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +rf=298.257222 +pm=Greenwich +units=m +no_defs"; CoordinateReferenceSystem etrsCrs = crsFactory.createFromName("EPSG:4258"); CoordinateReferenceSystem wgs84Crs = crsFactory.createFromName("EPSG:4326"); @@ -27,39 +59,50 @@ public void gk3ToUtm32Zn() { ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0); + // cs2cs 9.8.1: 3500000.000000000 5540279.541956067 -- bit-identical. ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate); + assertEquals(3500000.000000000, dhdnToGk3Coordinate.x, 1.0e-8); + assertEquals(5540279.541956067, dhdnToGk3Coordinate.y, 1.0e-8); + + // Route A, direct. No Potsdam shift, because the target datum is unknown. + // cs2cs 9.8.1: 32500000.000000000 5538630.702735838 ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate); + assertEquals(32500000.000000000, gk3ToUtm32znCoordinate.x, 1.0e-6); + assertEquals(5538630.702735838, gk3ToUtm32znCoordinate.y, 1.0e-6); + // Route B, explicitly through EPSG:4326. The Potsdam shift IS applied, on the DHDN -> WGS84 leg. ProjCoordinate gk3ToDhdnCoordinate = transform(gk3Crs, dhdnCrs, dhdnToGk3Coordinate); + assertEquals(9.0, gk3ToDhdnCoordinate.x, 1.0e-11); + assertEquals(50.0, gk3ToDhdnCoordinate.y, 1.0e-11); + + // cs2cs 9.8.1: 8.998960545476 49.998853136854 ProjCoordinate dhdnToWgs84Coordinate = transform(dhdnCrs, wgs84Crs, gk3ToDhdnCoordinate); + assertEquals(8.998960545476, dhdnToWgs84Coordinate.x, 1.0e-11); + assertEquals(49.998853136854, dhdnToWgs84Coordinate.y, 1.0e-11); + ProjCoordinate wgs84ToEtrsCoordinate = transform(wgs84Crs, etrsCrs, dhdnToWgs84Coordinate); ProjCoordinate etrsToUtm32znCoordinate = transform(etrsCrs, utm32znCrs, wgs84ToEtrsCoordinate); + // cs2cs 9.8.1, WGS84 lon/lat -> the same datum-less target: 32499925.503562238 5538503.189777711 + assertEquals(32499925.503562238, etrsToUtm32znCoordinate.x, 1.0e-6); + assertEquals(5538503.189777711, etrsToUtm32znCoordinate.y, 1.0e-6); + + // And the divergence itself, pinned rather than asserted away. It is the Potsdam -> WGS84 shift, + // present on one route and absent on the other because the target declares no datum. double dx = Math.abs(gk3ToUtm32znCoordinate.x - etrsToUtm32znCoordinate.x); double dy = Math.abs(gk3ToUtm32znCoordinate.y - etrsToUtm32znCoordinate.y); - double delta = Math.max(dx, dy); - - assertTrue(delta < 0.001); + assertEquals("the two routes must still differ by the unapplied Potsdam shift", + 74.496437762, dx, 1.0e-5); + assertEquals("the two routes must still differ by the unapplied Potsdam shift", + 127.512958127, dy, 1.0e-5); + assertTrue("a datum-less target must not silently acquire a datum shift", dx > 1.0); } - @Test - public void debug() { - - String epsg31467Parameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=1.0 +x_0=3500000.0 +y_0=0.0 +datum=potsdam +a=6377397.155 +f=299.1528128 +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +pm=greenwich +units=m +no_defs"; - String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222101 +pm=Greenwich +units=m +no_defs"; - - CoordinateReferenceSystem dhdnCrs = crsFactory.createFromName("EPSG:4314"); - CoordinateReferenceSystem gk3Crs = crsFactory.createFromParameters("Anon", epsg31467Parameters); - CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); - - ProjCoordinate coordinate = new ProjCoordinate(9.0, 50.0); - - ProjCoordinate dhdnToGk3Coordinate = transform(dhdnCrs, gk3Crs, coordinate); - ProjCoordinate gk3ToUtm32znCoordinate = transform(gk3Crs, utm32znCrs, dhdnToGk3Coordinate); - - - assertTrue(true); - } + // Deleted: debug(). It ran the same two transforms as route A of gk3ToUtm32Zn above -- the only + // difference was +rf=298.257222101 in the target where gk3ToUtm32Zn writes +rf=298.257222 -- then + // discarded both results and ended `assertTrue(true)`. It asserted nothing, and the behaviour it + // exercised is already pinned against cs2cs 9.8.1 above, so there was nothing to preserve: the + // rf difference is a typo in the older definition, not a second case worth its own references. private ProjCoordinate transform( CoordinateReferenceSystem sourceCrs, diff --git a/core/src/test/java/org/locationtech/proj4j/datum/GeoTiffSelfCycleTest.java b/core/src/test/java/org/locationtech/proj4j/datum/GeoTiffSelfCycleTest.java new file mode 100644 index 0000000..98b471f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/GeoTiffSelfCycleTest.java @@ -0,0 +1,421 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.GeoTiffGrid.VerticalLayer; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +/** + * The GeoTIFF self-parent case: a grid that declares itself as its own {@code parent_grid_name}. + * + *

The defect

+ * + *

{@code GeoTiffGrid.insertIntoHierarchy} registered each grid in {@code byName} under its own + * {@code grid_name} before looking its declared parent up. An IFD whose + * {@code parent_grid_name} equalled its own {@code grid_name} therefore found itself, and + * {@code contains} — inclusive on all four sides, so every extent contains itself — agreed, and + * {@code appendChild(grid, grid)} set {@code grid.child == grid}. + * + *

{@code NTV2.loadAll} does the same three things in the opposite order (look up, then insert, + * then register) and is safe for exactly that reason. This file's ordering was the inverted one. + * + *

Why it is worth a test even though it was unreachable

+ * + *

It was unreachable by an accident of control flow, not by a check: the + * {@code appendChild} branch {@code return}s before {@code roots.add}, so the cycle was built and + * then dropped, since nothing reachable from {@code roots} pointed at it. Move the registration, + * add a {@code roots.add} on that branch, or reuse the helper from anywhere else, and it becomes + * live — at which point {@code Grid.shift}'s subgrid descent, + * {@code while (grid.child != null) { … grid = child; }}, never terminates. That is an + * infinite loop on the per-row path, driven by an untrusted file: not a wrong answer, not + * an exception, a hung executor. + * + *

The fixture is the shipped file, minimally patched

+ * + *

What reverting the fix actually does — measured

+ * + *

Both halves reverted, this test class re-run: 2 of 5 fail. {@code ALbanff} is + * dropped from the hierarchy (4 grids instead of 5, because the {@code appendChild} branch + * returns before {@code roots.add}), and the Banff probe is answered by the coarse {@code CAwest} + * parent instead — {@code -115.54270965277624} against upstream's {@code -115.5427092888}, about + * 4 cm. The cycle assertion still passes, because the cyclic node is not reachable from + * the roots the reader returns. That is the whole point: the graph the reader hands out stays a + * tree by luck, and the damage that is visible today is a silently coarser answer. + * + *

{@code test_hgrid_with_subgrid.tif} is a byte-for-byte copy of PROJ 9.8.1's + * {@code data/tests/}. Its third IFD carries + * {@code ALbanffCAwest}. This + * test rewrites that one value to {@code ALbanff} in memory, keeping the TIFF ASCII tag's + * byte count identical by also dropping one insignificant newline inside the same + * {@code } blob — so the file stays structurally valid and nothing but the declared + * parentage changes. No fixture on disk is edited, and no new binary is committed. + */ +public class GeoTiffSelfCycleTest { + + private static final Charset ASCII = Charset.forName("US-ASCII"); + + /** The exact bytes in the shipped file, and the same-length replacement. */ + private static final String DECLARED_PARENT_CAWEST = + "\nALbanff" + + "CAwest"; + private static final String DECLARED_PARENT_SELF = + "ALbanff" + + "ALbanff"; + + private Path root; + + @After + public void resetChain() throws IOException { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + if (root != null) { + for (Path p : Files.newDirectoryStream(root)) { + Files.deleteIfExists(p); + } + Files.deleteIfExists(root); + root = null; + } + } + + // ============================================================================================ + // The instrument, and the proof that it can fail + // ============================================================================================ + + /** + * Walks {@code child} and {@code next} from {@code start} and reports whether any node is + * reachable from itself. + * + * @return the offending grid, or {@code null} if the graph is a tree + */ + private static Grid findCycle(Grid start) { + Map onPath = new IdentityHashMap(); + return findCycle(start, onPath); + } + + private static Grid findCycle(Grid node, Map onPath) { + for (Grid g = node; g != null; g = g.getNext()) { + if (onPath.put(g, Boolean.TRUE) != null) { + return g; + } + if (g.getChild() != null) { + Grid found = findCycle(g.getChild(), onPath); + if (found != null) { + return found; + } + } + } + return null; + } + + /** + * POSITIVE CONTROL. Hand-build the exact graph the pre-fix reader built — a grid that is + * its own child — and require the detector to find it. Without this, every "no cycle" result + * below would be consistent with a detector that always returns {@code null}. + */ + @Test + public void theCycleDetectorDetectsACycle() { + Grid selfParent = new Grid(); + selfParent.describeAs("ALbanff", "gtiff", "test:crafted", "test"); + selfParent.setChild(selfParent); + + assertSame("the detector missed grid.child == grid, so every clean result it reports" + + " below is worthless", + selfParent, findCycle(selfParent)); + + // And a two-node cycle through `next`, which is the other edge it must follow. + Grid a = new Grid(); + a.describeAs("a", "gtiff", "test:a", "test"); + Grid b = new Grid(); + b.describeAs("b", "gtiff", "test:b", "test"); + a.setChild(b); + b.setNext(b); + assertNotNull("the detector does not follow `next`", findCycle(a)); + + // ...and it must not cry wolf on a legitimate tree. + Grid p = new Grid(); + p.describeAs("p", "gtiff", "test:p", "test"); + Grid c1 = new Grid(); + c1.describeAs("c1", "gtiff", "test:c1", "test"); + Grid c2 = new Grid(); + c2.describeAs("c2", "gtiff", "test:c2", "test"); + p.setChild(c1); + c1.setNext(c2); + assertNull("the detector reports a cycle in a plain two-child tree", findCycle(p)); + } + + // ============================================================================================ + // The real reader, on a real file that declares itself its own parent + // ============================================================================================ + + /** + * A one-second timeout, because the failure mode this guards is a hang, not an exception + * — {@code Grid.shift}'s descent on {@code grid.child == grid} never returns. A test that hangs + * reports nothing; a test that times out reports a failure. + */ + @Test(timeout = 30_000L) + public void aSelfParentingGeoTiffBuildsNoCycleAndStillShifts() throws IOException { + byte[] original = shippedBytes("test_hgrid_with_subgrid.tif"); + byte[] patched = selfParenting(original); + + List selfParent = load("test_hgrid_self_parent.tif", patched); + assertEquals(1, selfParent.size()); + + Grid cycle = findCycle(selfParent.get(0)); + assertNull("the reader built a self-referential grid: " + + (cycle == null ? "" : cycle.getGridName()), cycle); + + // Not merely acyclic - the grid must still work, and it must still be the FINE grid that + // answers. A guard that dropped ALbanff from the hierarchy would also be acyclic, and the + // coarse CAwest parent would then answer with a different number: that is precisely what + // the pre-fix reader did, because its appendChild branch returns before roots.add. + // + // Expected values are upstream's own, from PROJ 9.8.1's geotiff_grids.gie, and are the same + // ones GeoTiffHorizontalGridTest.namedSubgridHierarchy pins for the unpatched file. + double[] banff = shiftDegrees(selfParent, BANFF_LON, BANFF_LAT); + assertEquals("ALbanff did not answer for the Banff probe", -115.5427092888, banff[0], 1e-9); + assertEquals("ALbanff did not answer for the Banff probe", 51.1666899972, banff[1], 1e-9); + assertEquals("the self-parenting IFD was dropped from the hierarchy", + 5, selfParent.get(0).countGrids()); + } + + /** Inside {@code ALbanff}, the subgrid whose declared parentage this test rewrites. */ + private static final double BANFF_LON = -115.5416667; + private static final double BANFF_LAT = 51.1666667; + + /** + * The self-parenting file must behave exactly like the unpatched one. + * + *

That is not a coincidence, it is what the fix chooses: an unresolvable + * {@code parent_grid_name} falls through to upstream's bounding-box method, which places + * {@code ALbanff} under {@code CAwest} anyway — the same place the declared parentage asked + * for. Upstream logs {@code "refers to non-existing parent"} and does the same. So the + * ordering fix costs no hierarchy and no coordinate. + * + *

Before the fix the two differed sharply: {@code ALbanff} was silently dropped from the + * hierarchy entirely, because the {@code appendChild} branch returns before + * {@code roots.add}. + */ + @Test(timeout = 30_000L) + public void theSelfParentFileAgreesWithTheShippedOne() throws IOException { + byte[] original = shippedBytes("test_hgrid_with_subgrid.tif"); + + List reference = load("test_hgrid_ref.tif", original); + int referenceCount = reference.get(0).countGrids(); + double[] referenceShift = shiftDegrees(reference, BANFF_LON, BANFF_LAT); + + List patched = load("test_hgrid_self_parent2.tif", selfParenting(original)); + assertEquals("the self-parent file lost or gained a subgrid", + referenceCount, patched.get(0).countGrids()); + assertArrayEquals("the self-parent file shifts differently", + referenceShift, shiftDegrees(patched, BANFF_LON, BANFF_LAT), 0.0); + + // The fixture has to actually contain a hierarchy, or both sides are trivially equal. + assertEquals("fixture regressed: test_hgrid_with_subgrid.tif no longer has its four images" + + " under a synthetic bounding grid", 5, referenceCount); + assertTrue("fixture regressed: the reference shift is a no-op, so the comparison is vacuous", + Math.abs(referenceShift[0] - BANFF_LON) > 1e-9); + } + + /** + * POSITIVE CONTROL for the patcher. The bytes really are different, they really do + * declare a self-parent, and the file really is the same length — which is what keeps the TIFF + * ASCII tag's declared count honest. + */ + @Test + public void thePatchIsAppliedAndIsLengthPreserving() throws IOException { + byte[] original = shippedBytes("test_hgrid_with_subgrid.tif"); + byte[] patched = selfParenting(original); + + assertEquals("the patch changed the file length, so the TIFF tag count is now a lie", + original.length, patched.length); + assertFalse("the patch was a no-op", java.util.Arrays.equals(original, patched)); + assertTrue("the original already declared a self-parent, so the fixture proves nothing", + new String(original, ASCII).contains(DECLARED_PARENT_CAWEST)); + assertTrue("the patched bytes do not declare a self-parent", + new String(patched, ASCII).contains(DECLARED_PARENT_SELF)); + } + + // ============================================================================================ + // The vertical half of the same inversion + // ============================================================================================ + + /** + * The second barrier, asserted directly: a grid no longer contains itself. + * + *

Needed as its own test because the cycle the ordering fix prevents is unreachable from + * the returned roots — measured, by reverting both halves and re-running + * {@link #aSelfParentingGeoTiffBuildsNoCycleAndStillShifts()}: the cycle assertion still + * passed, and what failed was the coordinate (CAwest answered instead of ALbanff, 3.6e-7° + * away) and the grid count (4 instead of 5). So a test driving the reader can only see the + * consequence. This sees the guard. + * + *

Either half alone prevents the cycle. Both are kept because the ordering is the one that + * matches {@code NTV2} and upstream, and the identity guard is the one that survives someone + * reordering the statements again. + */ + @Test + public void aGridDoesNotContainItself() { + Grid g = extentGrid("self", 0.0, 0.0, 5, 5); + assertFalse("contains(g, g) is true, so `is my own parent` becomes `is my own child`," + + " and Grid.shift's descent never terminates", GeoTiffGrid.contains(g, g)); + + // CONTROLS: the predicate must still accept what it is for, including the + // boundary-inclusive case the identity guard had to be added around rather than instead of. + Grid outer = extentGrid("outer", 0.0, 0.0, 5, 5); + Grid inner = extentGrid("inner", 1.0, 1.0, 2, 2); + Grid coincident = extentGrid("coincident", 0.0, 0.0, 5, 5); + assertTrue("the guard broke ordinary containment", GeoTiffGrid.contains(outer, inner)); + assertFalse("containment is not supposed to be symmetric", + GeoTiffGrid.contains(inner, outer)); + assertTrue("the guard broke boundary-inclusive containment, which upstream relies on", + GeoTiffGrid.contains(outer, coincident)); + + // Disjoint, so the predicate is not simply always-true for distinct grids. + Grid elsewhere = extentGrid("elsewhere", 40.0, 40.0, 2, 2); + assertFalse(GeoTiffGrid.contains(outer, elsewhere)); + } + + private static Grid extentGrid(String name, double west, double south, int columns, int rows) { + Grid g = new Grid(); + g.describeAs(name, "gtiff", "test:" + name, "test"); + Grid.ConversionTable t = new Grid.ConversionTable(); + t.id = name; + t.ll = new org.locationtech.proj4j.util.PolarCoordinate(west, south); + t.del = new org.locationtech.proj4j.util.PolarCoordinate(1.0, 1.0); + t.lim = new org.locationtech.proj4j.util.IntPolarCoordinate(columns, rows); + t.cvs = new org.locationtech.proj4j.util.FloatPolarCoordinate[columns * rows]; + for (int i = 0; i < t.cvs.length; i++) { + t.cvs[i] = new org.locationtech.proj4j.util.FloatPolarCoordinate(0.0f, 0.0f); + } + g.table = t; + return g; + } + + /** + * {@code insertVertical} carried the identical inversion, and no shipped fixture declares + * {@code grid_name}/{@code parent_grid_name} on a vertical IFD — so the ordering there cannot + * be driven from a file today. What can be pinned is the other half of the fix: the + * containment predicate no longer says a layer contains itself, which is what turned + * "is my own parent" into "is my own child". + */ + @Test + public void aVerticalLayerDoesNotContainItself() { + VerticalLayer layer = verticalLayer("self", 0.0, 0.0, 3, 3); + assertFalse("a layer that contains itself makes `parent.children.add(layer)` reachable," + + " and VerticalGrid's recursive descent then overflows the stack", + layer.contains(layer)); + + // CONTROL: the predicate still works, and it is still inclusive on the boundary, which is + // the property the identity guard had to be added around rather than instead of. + VerticalLayer outer = verticalLayer("outer", 0.0, 0.0, 5, 5); + VerticalLayer inner = verticalLayer("inner", 1.0, 1.0, 2, 2); + VerticalLayer coincident = verticalLayer("coincident", 0.0, 0.0, 5, 5); + assertTrue("the guard broke ordinary containment", outer.contains(inner)); + assertFalse("containment is not supposed to be symmetric", inner.contains(outer)); + assertTrue("the guard broke boundary-inclusive containment, which upstream relies on", + outer.contains(coincident)); + } + + // ============================================================================================ + + private static VerticalLayer verticalLayer(String name, double west, double south, + int width, int height) { + return new VerticalLayer(name, width, height, west, south, 1.0, 1.0, + new float[width * height], false, 0.0f); + } + + private static double[] shiftDegrees(List grids, double lonDeg, double latDeg) { + ProjCoordinate c = new ProjCoordinate(Math.toRadians(lonDeg), Math.toRadians(latDeg)); + Grid.shift(grids, false, c); + return new double[]{Math.toDegrees(c.x), Math.toDegrees(c.y)}; + } + + /** + * Rewrites the third IFD's {@code parent_grid_name} to its own {@code grid_name}, keeping the + * blob byte count unchanged by dropping the newline after {@code }. The metadata + * scanner is PROJ's "poor-man XML parsing" — {@code strstr(" 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + private List load(String name, byte[] bytes) throws IOException { + if (root == null) { + root = Files.createTempDirectory("proj4j-selfcycle"); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + } + Files.write(root.resolve(name), bytes); + GridCache.instance().clear(); + List grids = new ArrayList(); + Grid.mergeGridFile(name, grids); + return grids; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/GridCacheAccountingTest.java b/core/src/test/java/org/locationtech/proj4j/datum/GridCacheAccountingTest.java new file mode 100644 index 0000000..f04eb9f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/GridCacheAccountingTest.java @@ -0,0 +1,395 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; + +import static java.util.concurrent.TimeUnit.SECONDS; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The three ways {@code GridCache}'s stated bound was not the real bound. + * + *

1. A failed load was retained forever and counted as nothing

+ * + *

{@code get()} put a {@code FutureTask} into {@code entries} before running it, and + * every exception path returned or threw without reaching {@code admit}. The task therefore stayed + * in the entry map with no LRU record at all: not counted in {@code bytes()}, and unreachable by + * eviction, which only ever removes keys the LRU knows. The key is + * {@code resolverName + ' ' + gridName} and the grid name is a {@code +nadgrids=} token, so a job + * feeding fresh bad names retained one entry per name for the life of the JVM inside a cache + * documented as bounded by bytes. + * + *

2. Two caches, one documented budget, taken twice

+ * + *

{@code instance()} and {@code vertical()} were each constructed with + * {@code configuredMaxBytes()} in full, so {@code -Dproj4j.grids.cacheBytes=64m} bought a 128 MiB + * ceiling. + * + *

3. An entry larger than the whole budget was admitted and exempted from eviction

+ * + *

"Never evict what was just admitted" is right for the ordinary case, but with an entry bigger + * than the budget it meant the cache sat permanently over its ceiling with no admission able to + * bring it back down below. + * + *

The controls

+ * + *

Each test measures a specific counter and is paired with the opposite arm in the same method — + * a success next to the failure, a small grid next to the oversized one — so a counter wired to + * nothing, or a cache that has simply stopped caching, fails rather than passes. A cache that + * retained nothing at all would satisfy every bound here and be useless, which is why + * {@link #anOrdinaryEntryIsStillRetainedAndShared()} runs. + */ +public class GridCacheAccountingTest { + + /** A grid-shaped payload the cache can account for, with a size the test chooses. */ + private static final class Sized implements GridCache.Sized { + private final long bytes; + + Sized(long bytes) { + this.bytes = bytes; + } + + @Override + public long sizeBytes() { + return bytes; + } + } + + private static GridCache.Loader ok(final long bytes) { + return new GridCache.Loader() { + @Override + public Sized load() { + return new Sized(bytes); + } + }; + } + + private static GridCache.Loader boom(final AtomicInteger calls) { + return new GridCache.Loader() { + @Override + public Sized load() throws IOException { + calls.incrementAndGet(); + throw new IOException("this grid is corrupt"); + } + }; + } + + // --- 1. failures are counted, and evictable ------------------------------------------------ + + @Test + public void aFailedLoadIsChargedAndCanBeEvicted() throws IOException { + GridCache cache = new GridCache(10 * GridCache.FAILURE_WEIGHT_BYTES); + AtomicInteger calls = new AtomicInteger(); + + for (int i = 0; i < 6; i++) { + try { + cache.get("r", "bad-" + i, boom(calls)); + fail("the loader throws"); + } catch (IOException expected) { + assertEquals("this grid is corrupt", expected.getMessage()); + } + } + assertEquals("six distinct bad names, six loads", 6, calls.get()); + assertEquals("every failure must be accounted", 6 * GridCache.FAILURE_WEIGHT_BYTES, + cache.bytes()); + assertEquals(6, cache.size()); + + // Past the budget, failures evict like anything else. Before the fix this loop grew the + // entry map without limit and bytes() stayed at zero throughout. + for (int i = 6; i < 40; i++) { + try { + cache.get("r", "bad-" + i, boom(calls)); + fail("the loader throws"); + } catch (IOException expected) { + // expected + } + } + assertTrue("34 more failures must not push the cache past its budget; bytes=" + cache.bytes() + + " max=" + cache.maxBytes(), cache.bytes() <= cache.maxBytes()); + assertTrue("and the entry map must have been trimmed with the LRU, not left behind; size=" + + cache.size(), cache.size() <= 10); + assertTrue("evictions must have been counted", cache.evictionCount() > 0); + } + + /** + * Failures are still cached. That is deliberate and is the determinism property: a + * corrupt grid must fail identically on row 4,000,000 and on row 1. Charging them must not have + * turned them into re-loads. + */ + @Test + public void aFailureIsStillReplayedWithoutReloading() throws IOException { + GridCache cache = new GridCache(1024 * 1024); + AtomicInteger calls = new AtomicInteger(); + String first = null; + for (int i = 0; i < 20; i++) { + try { + cache.get("r", "bad", boom(calls)); + fail("the loader throws"); + } catch (IOException expected) { + if (first == null) { + first = expected.getMessage(); + } + assertEquals("identically worded every time", first, expected.getMessage()); + } + } + assertEquals("20 requests, exactly one load", 1, calls.get()); + } + + // --- 2. one shared budget ------------------------------------------------------------------ + + /** + * The two singletons — not two caches a test built over a budget it chose — must draw + * on one budget. + * + *

The obvious assertions here are vacuous and were written that way first: with two separate + * budgets of equal size, {@code instance().maxBytes() == vertical().maxBytes()} still holds, and + * so does {@code instance().sharedBytes() == vertical().sharedBytes()} while both are empty. A + * mutation restoring {@code new GridCache<>(configuredMaxBytes())} on each line passed all of + * them. What discriminates is loading a grid into one cache and requiring the + * other to see it against the shared total. + */ + @Test + public void theHorizontalAndVerticalCachesShareOneBudget() throws IOException { + GridCache.instance().clear(); + GridCache.vertical().clear(); + + assertEquals("both caches must report the same ceiling", + GridCache.instance().maxBytes(), GridCache.vertical().maxBytes()); + assertEquals("nothing is cached yet", 0L, GridCache.vertical().sharedBytes()); + + java.util.List conus = Grid.fromNadGrids("conus"); + long loaded = conus.get(0).sizeBytes(); + assertTrue("conus must have a non-zero accounted size for this to measure anything", + loaded > 0); + + assertEquals("the horizontal cache must account for it", loaded, + GridCache.instance().bytes()); + assertEquals("the vertical cache holds nothing of its own", 0L, + GridCache.vertical().bytes()); + assertEquals("but it must see the horizontal grid against the SHARED budget -- this is the" + + " assertion that fails when the two caches each take the budget in full", loaded, + GridCache.vertical().sharedBytes()); + assertEquals("and both sides must report the same shared total", + GridCache.instance().sharedBytes(), GridCache.vertical().sharedBytes()); + assertTrue(GridCache.instance().sharedBytes() <= GridCache.instance().maxBytes()); + + GridCache.instance().clear(); + assertEquals("clearing one cache must release its share of the shared budget", 0L, + GridCache.vertical().sharedBytes()); + } + + /** + * Two caches on one budget: filling the first must reduce what the second can hold, and the sum + * must stay under the ceiling. Before the fix each instance had its own {@code currentBytes} and + * the sum could reach twice the configured value. + */ + @Test + public void fillingOneCacheEvictsFromTheOther() throws IOException { + GridCache.Budget shared = new GridCache.Budget(10_000L); + GridCache a = GridCache.forBudget(shared); + GridCache b = GridCache.forBudget(shared); + + for (int i = 0; i < 5; i++) { + assertNotNull(b.get("r", "b-" + i, ok(1000L))); + } + assertEquals(5000L, shared.currentBytes()); + assertEquals(5, b.size()); + + for (int i = 0; i < 20; i++) { + assertNotNull(a.get("r", "a-" + i, ok(1000L))); + } + + assertTrue("the shared total must honour the one budget; got " + shared.currentBytes(), + shared.currentBytes() <= 10_000L); + assertTrue("filling a must have evicted from b, not merely from a; b still holds " + + b.size(), b.size() < 5); + assertEquals("and the two must agree on the total", shared.currentBytes(), + a.sharedBytes()); + } + + // --- 3. an entry larger than the whole budget is served but not retained ------------------- + + @Test + public void anEntryLargerThanTheBudgetIsServedButNotRetained() throws IOException { + GridCache cache = new GridCache(1000L); + + Sized huge = cache.get("r", "huge", ok(5000L)); + assertNotNull("the caller still gets its grid", huge); + assertEquals(5000L, huge.sizeBytes()); + assertEquals("nothing may be retained for it", 0, cache.size()); + assertEquals("and it must not be counted", 0L, cache.bytes()); + assertTrue("the cache must not be parked over its ceiling", + cache.bytes() <= cache.maxBytes()); + + // CONTROL: an entry that fits IS retained, so "0" above is the oversize rule and not the + // cache having stopped working. + Sized small = cache.get("r", "small", ok(400L)); + assertNotNull(small); + assertEquals(1, cache.size()); + assertEquals(400L, cache.bytes()); + assertSame("and it is shared on the next request", small, + cache.get("r", "small", ok(400L))); + } + + // --- the accept side ----------------------------------------------------------------------- + + @Test + public void anOrdinaryEntryIsStillRetainedAndShared() throws IOException { + GridCache cache = new GridCache(1024 * 1024); + final AtomicInteger loads = new AtomicInteger(); + GridCache.Loader counting = new GridCache.Loader() { + @Override + public Sized load() { + loads.incrementAndGet(); + return new Sized(2048L); + } + }; + + long hitsBefore = cache.hitCount(); + Sized first = cache.get("r", "good", counting); + for (int i = 0; i < 50; i++) { + assertSame("every later request must return the same instance", first, + cache.get("r", "good", counting)); + } + assertEquals("exactly one load across 51 requests", 1, loads.get()); + assertEquals(2048L, cache.bytes()); + assertEquals("50 of the 51 requests were hits", 50L, cache.hitCount() - hitsBefore); + assertEquals(1L, cache.missCount()); + } + + /** + * Interrupting a waiter must not discard the load it was waiting on. + * + *

This test replaced one that could not fail, and the replacement changed the code

+ * + *

The first version simply set the calling thread's interrupt flag and called {@code get}. + * That never reaches the {@code InterruptedException} branch at all: the owning thread runs the + * {@code FutureTask} synchronously, so its {@code get()} finds the task already done and returns + * without blocking. The test passed with the branch written either way — a mutation flipping it + * went undetected — which is what exposed that the branch had been written wrongly: + * it removed the cache entry, throwing away a load that was about to succeed and leaving the + * owner to admit a key no longer present in the entry map, i.e. a byte charge against the budget + * with nothing behind it. + * + *

So this drives the branch for real. A loader blocks on a latch; the owner is stuck inside + * it; a second thread blocks in {@code task.get()} and is interrupted there. The load then + * completes, and the assertions are that it was not discarded: one load, one cached + * entry, correct accounting. + */ + @Test(timeout = 30_000) + public void interruptingAWaiterDoesNotDiscardTheLoad() throws Exception { + final GridCache cache = new GridCache(1024 * 1024); + final AtomicInteger loads = new AtomicInteger(); + final java.util.concurrent.CountDownLatch release = + new java.util.concurrent.CountDownLatch(1); + final java.util.concurrent.CountDownLatch loading = + new java.util.concurrent.CountDownLatch(1); + final GridCache.Loader blocking = new GridCache.Loader() { + @Override + public Sized load() throws IOException { + loads.incrementAndGet(); + loading.countDown(); + try { + release.await(); + } catch (InterruptedException e) { + throw new IOException("owner interrupted", e); + } + return new Sized(64L); + } + }; + + final java.util.concurrent.atomic.AtomicReference ownerResult = + new java.util.concurrent.atomic.AtomicReference(); + Thread owner = new Thread(new Runnable() { + @Override + public void run() { + try { + ownerResult.set(cache.get("r", "blocked", blocking)); + } catch (Throwable t) { + ownerResult.set(t); + } + } + }, "grid-cache-owner"); + owner.setDaemon(true); + owner.start(); + assertTrue("the owner must actually be inside the loader", loading.await(20, SECONDS)); + + final java.util.concurrent.atomic.AtomicReference waiterResult = + new java.util.concurrent.atomic.AtomicReference(); + final java.util.concurrent.CountDownLatch waiting = + new java.util.concurrent.CountDownLatch(1); + Thread waiter = new Thread(new Runnable() { + @Override + public void run() { + waiting.countDown(); + try { + waiterResult.set(cache.get("r", "blocked", blocking)); + } catch (Throwable t) { + waiterResult.set(t); + } + } + }, "grid-cache-waiter"); + waiter.setDaemon(true); + waiter.start(); + assertTrue(waiting.await(20, SECONDS)); + // Give the waiter time to reach task.get() and block there, then interrupt it there. + Thread.sleep(200); + waiter.interrupt(); + waiter.join(20_000); + + assertTrue("the waiter must have been interrupted inside get(); got " + waiterResult.get(), + waiterResult.get() instanceof IOException + && ((IOException) waiterResult.get()).getCause() + instanceof InterruptedException); + + release.countDown(); + owner.join(20_000); + assertTrue("the owner's load must have succeeded", ownerResult.get() instanceof Sized); + + assertEquals("exactly one load; the waiter's interrupt must not have caused a second", 1, + loads.get()); + assertEquals("the successfully loaded grid must still be cached", 1, cache.size()); + assertEquals("and accounted -- an entry admitted after its key was removed would leave a " + + "charge with nothing behind it", 64L, cache.bytes()); + assertSame("a later caller gets the very grid the owner loaded", ownerResult.get(), + cache.get("r", "blocked", blocking)); + assertEquals(1, loads.get()); + } + + /** A loader returning null must not install a free, unevictable entry. */ + @Test + public void aNullLoadIsChargedRatherThanFree() throws IOException { + GridCache cache = new GridCache(1024 * 1024); + Sized nothing = cache.get("r", "null", new GridCache.Loader() { + @Override + public Sized load() { + return null; + } + }); + assertEquals(null, nothing); + assertEquals("a null must be charged, not admitted at zero bytes", + GridCache.FAILURE_WEIGHT_BYTES, cache.bytes()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/GridHashDistributionTest.java b/core/src/test/java/org/locationtech/proj4j/datum/GridHashDistributionTest.java new file mode 100644 index 0000000..a4979b5 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/GridHashDistributionTest.java @@ -0,0 +1,377 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.junit.Test; +import org.locationtech.proj4j.util.FloatPolarCoordinate; +import org.locationtech.proj4j.util.IntPolarCoordinate; +import org.locationtech.proj4j.util.PolarCoordinate; + +/** + * {@link Grid#hashCode()} and {@link Grid.ConversionTable#hashCode()}, measured over the grids this + * repository actually ships rather than over two hand-made objects. + * + *

What was wrong

+ * + *

Three defects, in one expression each: + *

    + *
  1. {@code Grid.hashCode} computed its {@code childHash} from {@code next}: + * {@code int childHash = next == null ? 0 : next.hashCode();}. So {@code child} never + * entered the hash at all and {@code next} entered it twice.
  2. + *
  3. Every combiner in the family — {@code Grid}, {@code ConversionTable}, + * {@code PolarCoordinate}, {@code FloatPolarCoordinate}, {@code IntPolarCoordinate} — was + * bitwise {@code |}. OR is monotone in every bit, so a bit set by one term can never + * be cleared by another and the combination is driven towards {@code 0xFFFFFFFF}.
  4. + *
  5. {@code PolarCoordinate} and {@code FloatPolarCoordinate} boxed + * ({@code new Double(lam).hashCode()}) and disagreed with their own {@code equals}, which + * compares with {@code ==} and therefore holds {@code -0.0} equal to {@code 0.0} while + * {@code Double.hashCode} does not.
  6. + *
+ * + *

How this test avoids being vacuous

+ * + *

"The new hash gives distinct values" is not evidence unless the old one does not — a + * population of six grids would very likely come out distinct under almost any function. So the + * pre-fix expressions are reimplemented verbatim below ({@link #legacyGridHash} and + * friends) and run over the same objects, and the test asserts the contrast: the legacy hash + * either collides or saturates its bits, and the new one does neither. Every number this class + * asserts was measured, not chosen. + * + *

{@link #childIsInTheHash()} is the sharpest of the three and needs no distribution argument + * at all: it builds two grids that differ only in {@code child}, shows the legacy + * expression giving them the same value — which is the bug, exactly — and the new one giving them + * different values, which is what {@link Grid#equals} has always required. + */ +public class GridHashDistributionTest { + + /** + * Grids on {@code core}'s test classpath, spanning all three readers: CTABLE V2, NTv2 with + * subgrids, and eight GeoTIFF spellings including one with a real subgrid hierarchy. + */ + private static final String[] SHIPPED = { + "conus", + "ntv2_0_downsampled.gsb", + "test_hgrid.tif", + "test_hgrid_degree.tif", + "test_hgrid_radian.tif", + "test_hgrid_separate.tif", + "test_hgrid_strip.tif", + "test_hgrid_tiled.tif", + "test_hgrid_positive_west.tif", + "test_hgrid_with_subgrid.tif", + }; + + private static List shippedGrids() throws IOException { + List grids = new ArrayList(); + for (String name : SHIPPED) { + Grid.mergeGridFile(name, grids); + } + assertEquals("fixture set changed", SHIPPED.length, grids.size()); + return grids; + } + + // ============================================================================================ + // The pre-fix expressions, transcribed. Do not "tidy" these; they are the control. + // ============================================================================================ + + private static int legacyFloatPolar(FloatPolarCoordinate c) { + return Float.valueOf(c.lam).hashCode() | (17 * Float.valueOf(c.phi).hashCode()); + } + + private static int legacyPolar(PolarCoordinate c) { + return Double.valueOf(c.lam).hashCode() | (17 * Double.valueOf(c.phi).hashCode()); + } + + private static int legacyCvs(FloatPolarCoordinate[] cvs) { + // java.util.Arrays.hashCode's own contract, with the legacy element hash substituted. + if (cvs == null) { + return 0; + } + int result = 1; + for (FloatPolarCoordinate c : cvs) { + result = 31 * result + (c == null ? 0 : legacyFloatPolar(c)); + } + return result; + } + + private static int legacyTableHash(Grid.ConversionTable t) { + int idHash = t.id == null ? 0 : t.id.hashCode(); + int delHash = t.del == null ? 0 : legacyPolar(t.del); + int llHash = t.ll == null ? 0 : legacyPolar(t.ll); + int cvsHash = legacyCvs(t.cvs); + return idHash | (11 * delHash) | (23 * llHash) | (37 * cvsHash); + } + + private static int legacyGridHash(Grid g) { + int nameHash = g.getGridName() == null ? 0 : g.getGridName().hashCode(); + int fileHash = g.getOrigin() == null ? 0 : g.getOrigin().hashCode(); + int formatHash = g.getFormat() == null ? 0 : g.getFormat().hashCode(); + int tableHash = g.table == null ? 0 : legacyTableHash(g.table); + int nextHash = g.getNext() == null ? 0 : legacyGridHash(g.getNext()); + // THE DEFECT: computed from `next`, not from `child`. + int childHash = g.getNext() == null ? 0 : legacyGridHash(g.getNext()); + return nameHash | (7 * fileHash) | (11 * formatHash) | (17 * tableHash) + | (23 * nextHash) | (31 * childHash); + } + + // ============================================================================================ + + /** + * The bug, isolated: two grids identical but for {@code child}. + * + *

{@link Grid#equals} distinguishes them — it compares {@code child} — so {@link Object}'s + * contract requires the hash to be free to distinguish them too, and a hash that structurally + * cannot is a hash that ignores a field its equality depends on. + */ + @Test + public void childIsInTheHash() throws IOException { + Grid parent = new Grid(); + parent.describeAs("parent", "ntv2", "test:parent", "test"); + parent.table = table("parent-table", 0.0, 0.0, 3, 3); + + Grid childless = new Grid(); + childless.describeAs("parent", "ntv2", "test:parent", "test"); + childless.table = parent.table; + + Grid child = new Grid(); + child.describeAs("child", "ntv2", "test:child", "test"); + child.table = table("child-table", 0.5, 0.5, 2, 2); + parent.setChild(child); + + // The two objects really are unequal, so this is a hash question and not a modelling one. + assertNotEquals("fixture is wrong: the two grids must differ", parent, childless); + + assertEquals("CONTROL: the pre-fix expression could not see `child` at all, because it read" + + " `next` twice. If this assertion ever fails, the transcription above has" + + " drifted from the defect it is standing in for.", + legacyGridHash(childless), legacyGridHash(parent)); + + assertNotEquals("Grid.hashCode still ignores `child`", + childless.hashCode(), parent.hashCode()); + } + + /** {@code next} must be in the hash too — the fix must not have swapped one omission for another. */ + @Test + public void nextIsInTheHash() { + Grid head = new Grid(); + head.describeAs("head", "ntv2", "test:head", "test"); + head.table = table("head-table", 0.0, 0.0, 3, 3); + + Grid lonely = new Grid(); + lonely.describeAs("head", "ntv2", "test:head", "test"); + lonely.table = head.table; + + Grid sibling = new Grid(); + sibling.describeAs("sibling", "ntv2", "test:sibling", "test"); + sibling.table = table("sibling-table", 9.0, 9.0, 2, 2); + head.setNext(sibling); + + assertNotEquals(lonely.hashCode(), head.hashCode()); + } + + /** + * The distribution claim, over the shipped grids, with the pre-fix expression as the control. + * + *

Measured on this fixture set: the legacy expression yields 1 distinct value across + * all ten grids — every one of them hashes to {@code -1}, i.e. all 32 bits set — because + * OR-ing four large terms saturates. The new expression yields 10. + */ + @Test + public void theShippedGridsDoNotCollide() throws IOException { + List grids = shippedGrids(); + + Set legacy = new HashSet(); + Set fixed = new HashSet(); + int legacyBits = 0; + int fixedBits = 0; + for (Grid g : grids) { + int l = legacyGridHash(g); + int f = g.hashCode(); + legacy.add(l); + fixed.add(f); + legacyBits += Integer.bitCount(l); + fixedBits += Integer.bitCount(f); + } + double legacyMeanBits = legacyBits / (double) grids.size(); + double fixedMeanBits = fixedBits / (double) grids.size(); + + String report = "legacy: " + legacy.size() + " distinct, mean " + legacyMeanBits + + " bits set; fixed: " + fixed.size() + " distinct, mean " + fixedMeanBits + + " bits set, over " + grids.size() + " shipped grids"; + + // CONTROL. If the legacy expression separated these grids, this test would prove nothing + // about the new one, and the assertion below would be a coincidence rather than a result. + assertTrue("CONTROL FAILED - the pre-fix expression did NOT collapse on this fixture set," + + " so this test is not measuring what it claims. " + report, + legacy.size() < grids.size()); + assertTrue("CONTROL FAILED - the pre-fix expression's bits were not saturated. " + report, + legacyMeanBits > 28.0); + + assertEquals("Grid.hashCode collides across the shipped grids. " + report, + grids.size(), fixed.size()); + // A 31-chain over real data lands near half the bits set. Anything above 28 would mean the + // OR is back. + assertTrue("Grid.hashCode's bits look saturated, which is the signature of an OR combiner. " + + report, + fixedMeanBits > 6.0 && fixedMeanBits < 26.0); + } + + /** + * The subgrids of one NTv2 file, hashed. These share a file name, a format and a resolver and + * differ only in {@code gridName} and in their node data, which is the population most likely + * to collide. + */ + @Test + public void subgridsOfOneFileDoNotCollide() throws IOException { + List loaded = new ArrayList(); + Grid.mergeGridFile("ntv2_0_downsampled.gsb", loaded); + List subs = loaded.get(0).getSubGrids(); + assertTrue("fixture must have subgrids to be a test of subgrids", subs.size() >= 2); + + Set fixed = new HashSet(); + Set legacy = new HashSet(); + for (Grid s : subs) { + fixed.add(s.hashCode()); + legacy.add(legacyGridHash(s)); + } + assertEquals("subgrid hashes collide: " + subs.size() + " subgrids, " + fixed.size() + + " distinct", subs.size(), fixed.size()); + assertTrue("CONTROL FAILED - the legacy expression separated the subgrids too, so the" + + " assertion above is not evidence. legacy distinct=" + legacy.size(), + legacy.size() < subs.size()); + } + + /** + * The memo must return the same value it computes, and must not change it. + * + *

{@code ConversionTable.hashCode} caches into a field on first call. A memo that returned a + * different value on the second call would be a far worse bug than the O(n) cost it removes. + */ + @Test + public void theConversionTableMemoIsStable() throws IOException { + List grids = shippedGrids(); + for (Grid g : grids) { + if (g.table == null) { + continue; + } + int first = g.table.hashCode(); + int second = g.table.hashCode(); + int third = g.table.hashCode(); + assertEquals(g.getGridName() + ": memoised hash changed", first, second); + assertEquals(g.getGridName() + ": memoised hash changed", first, third); + + // And it must equal a freshly built, un-memoised table with the same contents, so the + // memo is a cache of the function and not a second definition of it. + Grid.ConversionTable copy = new Grid.ConversionTable(); + copy.id = g.table.id; + copy.del = g.table.del; + copy.ll = g.table.ll; + copy.lim = g.table.lim; + copy.cvs = g.table.cvs; + assertEquals(g.getGridName() + ": memo disagrees with a fresh table", + first, copy.hashCode()); + } + } + + /** + * {@code equals} holds {@code -0.0} equal to {@code 0.0}, because it compares with {@code ==}. + * The hash must therefore agree, and before this change it did not. + */ + @Test + public void negativeZeroHashesLikePositiveZero() { + PolarCoordinate pos = new PolarCoordinate(0.0, 0.0); + PolarCoordinate neg = new PolarCoordinate(-0.0, -0.0); + assertEquals("fixture: these must be equal under PolarCoordinate.equals", pos, neg); + assertEquals("equal PolarCoordinates hash differently", pos.hashCode(), neg.hashCode()); + assertNotEquals("CONTROL: the pre-fix expression did NOT agree on signed zero, which is what" + + " made this a contract violation rather than a style point", + legacyPolar(pos), legacyPolar(neg)); + + FloatPolarCoordinate fpos = new FloatPolarCoordinate(0.0f, 0.0f); + FloatPolarCoordinate fneg = new FloatPolarCoordinate(-0.0f, -0.0f); + assertEquals(fpos, fneg); + assertEquals("equal FloatPolarCoordinates hash differently", fpos.hashCode(), fneg.hashCode()); + assertNotEquals(legacyFloatPolar(fpos), legacyFloatPolar(fneg)); + } + + /** + * The node type's own distribution, which is what {@code Arrays.hashCode(cvs)} multiplies up. + * Sixty-four distinct shift pairs on a small grid of values: the legacy expression collapses + * them, the new one does not. + */ + @Test + public void theNodeTypeSeparatesItsValues() { + Set legacy = new HashSet(); + Set fixed = new HashSet(); + int n = 0; + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + FloatPolarCoordinate c = new FloatPolarCoordinate(i * 1.0e-5f, j * 1.0e-5f); + legacy.add(legacyFloatPolar(c)); + fixed.add(c.hashCode()); + n++; + } + } + assertEquals("FloatPolarCoordinate.hashCode collides over 64 distinct shift pairs: " + + fixed.size() + " distinct", n, fixed.size()); + assertTrue("CONTROL FAILED - the legacy element hash separated all 64 too, so the assertion" + + " above is not evidence. legacy distinct=" + legacy.size(), + legacy.size() < n); + } + + /** {@link IntPolarCoordinate}, the {@code lim} type: small positive ints, the worst case for OR. */ + @Test + public void theLimTypeSeparatesSmallInts() { + Set legacy = new HashSet(); + Set fixed = new HashSet(); + int n = 0; + for (int lam = 1; lam <= 20; lam++) { + for (int phi = 1; phi <= 20; phi++) { + IntPolarCoordinate c = new IntPolarCoordinate(lam, phi); + legacy.add(lam | (17 * phi)); + fixed.add(c.hashCode()); + n++; + } + } + assertEquals(n, fixed.size()); + assertTrue("CONTROL FAILED - legacy distinct=" + legacy.size(), legacy.size() < n); + } + + private static Grid.ConversionTable table(String id, double llLam, double llPhi, + int columns, int rows) { + Grid.ConversionTable t = new Grid.ConversionTable(); + t.id = id; + t.ll = new PolarCoordinate(llLam, llPhi); + t.del = new PolarCoordinate(0.25, 0.25); + t.lim = new IntPolarCoordinate(columns, rows); + FloatPolarCoordinate[] cvs = new FloatPolarCoordinate[columns * rows]; + for (int i = 0; i < cvs.length; i++) { + cvs[i] = new FloatPolarCoordinate(i * 1.0e-6f, i * 2.0e-6f); + } + t.cvs = cvs; + return t; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/GridShiftRewriteTest.java b/core/src/test/java/org/locationtech/proj4j/datum/GridShiftRewriteTest.java new file mode 100644 index 0000000..abb16ee --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/GridShiftRewriteTest.java @@ -0,0 +1,390 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.PolarCoordinate; + +/** + * {@link Grid#shift} after the allocation rewrite: the same answers, and no garbage. + * + *

What was rewritten

+ * + *

{@code shift} built two {@link PolarCoordinate}s and an {@code Iterator}; {@code nad_cvt} + * built three more; {@code nad_intr} built four per call and is called up to eleven times + * per inverted point. {@code reference/performance.md} priced the inverse path at up to 49 + * allocations per vertex — 4.9 million objects for one 100,000-vertex geometry, on the path the + * consumer runs per row in a Spark executor. Everything is now a local {@code double}, and the + * caller's own {@link ProjCoordinate} is the only scratch. + * + *

The two risks the rewrite carries, and the test for each

+ * + *
    + *
  1. A changed number. Guarded by the whole existing grid suite, which pins values + * produced by PROJ 9.8.1 itself, plus {@link #theTwoOverloadsAgreeBitForBit()} here — the + * {@code List} and {@code Grid[]} loops share one body, and this proves they have not + * diverged, over thousands of points spanning inside, outside, and both grid edges.
  2. + *
  3. Scratch leaking into the caller's coordinate. The caller's {@code ProjCoordinate} + * is now written during the computation, so a path that ends without a value must put it + * back. {@link #aRefusedShiftLeavesTheCoordinateExactlyAsItWasPassedIn()} is that test, and + * it matters: the ordinate a caller sees after catching the refusal used to be, and must + * remain, the input.
  4. + *
+ */ +public class GridShiftRewriteTest { + + private static List conus; + private static Grid[] conusArray; + + @BeforeClass + public static void loadGrid() throws IOException { + List loaded = new ArrayList(); + Grid.mergeGridFile("conus", loaded); + conus = loaded; + conusArray = loaded.toArray(new Grid[0]); + assertEquals(1, conus.size()); + } + + /** + * The two overloads must be indistinguishable, bit for bit, on every outcome: a shift, a + * refusal, and the exception's own message. + * + *

The sample deliberately runs off the edge of {@code conus} in both axes, so it covers the + * inside case, the outside case and the half-cell clamp window, forward and inverse. + */ + @Test + public void theTwoOverloadsAgreeBitForBit() { + int shifts = 0; + int refusals = 0; + for (int i = 0; i <= 80; i++) { + for (int j = 0; j <= 40; j++) { + double lon = -135.0 + i * 1.0; // -135 .. -55, conus spans -131 .. -63 + double lat = 15.0 + j * 1.0; // 15 .. 55, conus spans 20 .. 50 + for (int k = 0; k < 2; k++) { + boolean inverse = k == 1; + Outcome viaList = runList(conus, inverse, lon, lat); + Outcome viaArray = runArray(conusArray, inverse, lon, lat); + assertEquals("(" + lon + ", " + lat + ") inverse=" + inverse, + viaList.toString(), viaArray.toString()); + if (viaList.threw) { + refusals++; + } else { + shifts++; + } + } + } + } + // Both regimes must actually occur, or the comparison above is a comparison of one case. + assertTrue("no point in the sample was inside the grid: " + shifts, shifts > 200); + assertTrue("no point in the sample was outside the grid: " + refusals, refusals > 200); + } + + /** + * After a refusal the coordinate must be exactly what was passed in — not scratch, not NaN, not + * a partially-applied shift. + * + *

This is the invariant the {@code finally} in {@code shift} exists for. Before the rewrite + * it held for free, because the scratch was three freshly allocated objects; now it is a + * property that has to be tested, and the failure mode if it were wrong is the worst kind this + * library has — a caller that catches the refusal, keeps going, and reads a plausible number + * out of the coordinate it handed in. + */ + @Test + public void aRefusedShiftLeavesTheCoordinateExactlyAsItWasPassedIn() { + // Inside conus in longitude, well south of it in latitude: the extent test misses. + double[][] outside = { + {Math.toRadians(-100.0), Math.toRadians(5.0)}, + {Math.toRadians(20.0), Math.toRadians(45.0)}, + {Math.toRadians(-100.0), Math.toRadians(80.0)}, + {Math.toRadians(-179.0), Math.toRadians(-45.0)}, + }; + for (double[] p : outside) { + for (int k = 0; k < 2; k++) { + ProjCoordinate c = new ProjCoordinate(p[0], p[1], 1234.5); + try { + Grid.shift(conus, k == 1, c); + fail("expected a refusal at (" + p[0] + ", " + p[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + assertEquals("x was left as scratch after a refusal", p[0], c.x, 0.0); + assertEquals("y was left as scratch after a refusal", p[1], c.y, 0.0); + assertEquals("z must never be touched by a horizontal shift", 1234.5, c.z, 0.0); + + ProjCoordinate viaArray = new ProjCoordinate(p[0], p[1], 1234.5); + try { + Grid.shift(conusArray, k == 1, viaArray); + fail("expected a refusal from the array overload too"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + assertEquals(p[0], viaArray.x, 0.0); + assertEquals(p[1], viaArray.y, 0.0); + } + } + } + + /** + * The case that actually exercises the scratch: a grid that contains the point and + * still cannot produce a value. + * + *

Why this needs a crafted grid

+ * + *

Measured, by deleting the restore and re-running this class: the four + * outside-every-grid points above do not detect it, because they fail + * {@code isPointInExtent} and never reach {@code nad_cvt}, so nothing is written. The leak is + * only observable on the {@code NO_VALUE} path — inside the extent, no interpolated value — + * where {@code nad_intr} has already stored its {@code (NaN, NaN)} sentinel in the caller's + * coordinate. With real grids that path needs NaN node data, which no shipped fixture has, so + * the table here is built with {@code Float.NaN} shifts. + * + *

That makes the {@code finally} defensive against reachable-but-unshipped data rather than + * against anything the current corpus produces — and defensive is the right posture, because + * the failure it prevents is a caller catching the refusal and reading {@code NaN} out of the + * coordinate it passed in, which is exactly the "failure expressed as a plausible coordinate" + * shape this project exists to remove. + */ + @Test + public void aGridThatContainsThePointButCannotAnswerAlsoLeavesItAlone() { + List nanGrid = new ArrayList(); + nanGrid.add(gridOfNaNs()); + Grid[] nanArray = nanGrid.toArray(new Grid[0]); + + for (int k = 0; k < 2; k++) { + ProjCoordinate c = new ProjCoordinate(0.15, 0.15, 7.0); + try { + Grid.shift(nanGrid, k == 1, c); + fail("a table of NaN nodes produced a value"); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, e.cause()); + // The `contained` flag must say the point WAS inside a grid; that is the branch + // this fixture exists to reach, and it distinguishes it from the tests above. + assertTrue("this fixture is meant to reach the CONTAINED-but-no-value branch," + + " and did not: " + e.getMessage(), + e.getMessage().contains("inside the extent")); + } + assertEquals("nad_intr's NaN sentinel was left in the caller's coordinate", + 0.15, c.x, 0.0); + assertEquals("nad_intr's NaN sentinel was left in the caller's coordinate", + 0.15, c.y, 0.0); + assertEquals(7.0, c.z, 0.0); + + ProjCoordinate d = new ProjCoordinate(0.15, 0.15, 7.0); + try { + Grid.shift(nanArray, k == 1, d); + fail("a table of NaN nodes produced a value"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + assertEquals(0.15, d.x, 0.0); + assertEquals(0.15, d.y, 0.0); + } + } + + /** A 4x4 grid over [0,0.3]x[0,0.3] radians whose every node shift is {@code NaN}. */ + private static Grid gridOfNaNs() { + Grid g = new Grid(); + g.describeAs("all-nan", "ctable2", "test:all-nan", "test"); + Grid.ConversionTable t = new Grid.ConversionTable(); + t.id = "all-nan"; + t.ll = new PolarCoordinate(0.0, 0.0); + t.del = new PolarCoordinate(0.1, 0.1); + t.lim = new org.locationtech.proj4j.util.IntPolarCoordinate(4, 4); + t.cvs = new org.locationtech.proj4j.util.FloatPolarCoordinate[16]; + for (int i = 0; i < t.cvs.length; i++) { + t.cvs[i] = new org.locationtech.proj4j.util.FloatPolarCoordinate(Float.NaN, Float.NaN); + } + g.table = t; + return g; + } + + /** A successful shift must still write the answer, and must still not touch {@code z}. */ + @Test + public void aSuccessfulShiftWritesXAndYAndNothingElse() { + ProjCoordinate c = new ProjCoordinate(Math.toRadians(-100.0), Math.toRadians(40.0), 99.0); + Grid.shift(conus, false, c); + assertTrue("conus produced no shift at all at (100W, 40N)", + Math.abs(Math.toDegrees(c.x) + 100.0) > 1e-12); + assertEquals("z must never be touched by a horizontal shift", 99.0, c.z, 0.0); + } + + /** A null or empty list is a no-op, in both overloads, and must not throw. */ + @Test + public void anEmptyListIsANoOp() { + for (int k = 0; k < 2; k++) { + ProjCoordinate c = new ProjCoordinate(0.1, 0.2, 0.3); + Grid.shift(new ArrayList(), k == 1, c); + assertEquals(0.1, c.x, 0.0); + Grid.shift((List) null, k == 1, c); + assertEquals(0.1, c.x, 0.0); + Grid.shift(new Grid[0], k == 1, c); + assertEquals(0.1, c.x, 0.0); + Grid.shift((Grid[]) null, k == 1, c); + assertEquals(0.1, c.x, 0.0); + assertEquals(0.2, c.y, 0.0); + assertEquals(0.3, c.z, 0.0); + } + } + + /** A non-finite input travels rather than throwing, and is not restored into something finite. */ + @Test + public void nonFiniteInputPassesThrough() { + double[] bad = {Double.NaN, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY}; + for (double v : bad) { + ProjCoordinate c = new ProjCoordinate(v, Math.toRadians(40.0)); + Grid.shift(conus, false, c); + assertEquals(Double.doubleToRawLongBits(v), Double.doubleToRawLongBits(c.x)); + ProjCoordinate d = new ProjCoordinate(Math.toRadians(-100.0), v); + Grid.shift(conusArray, true, d); + assertEquals(Double.doubleToRawLongBits(v), Double.doubleToRawLongBits(d.y)); + } + } + + // ============================================================================================ + // The allocation claim, measured in-process + // ============================================================================================ + + /** + * The point of the rewrite: {@code Grid.shift} allocates nothing. + * + *

Measured with {@code com.sun.management.ThreadMXBean.getThreadAllocatedBytes}, which + * counts real TLAB allocation and is not defeated by escape analysis the way a + * {@code System.gc()}-and-diff estimate would be. JMH's {@code gc.alloc.rate.norm} is the + * authoritative instrument and {@code GridShiftBenchmark} owns it; this exists so the property + * is enforced by the ordinary test run too, in seconds rather than in a sixteen-minute gate. + * + *

Positive control included. The same measurement is taken around a loop that + * allocates one {@link PolarCoordinate} per iteration — exactly what {@code nad_intr} used to + * do four times over — and is required to see it. Without that, a meter reading zero because + * it is broken and a meter reading zero because the code is clean are indistinguishable, and + * this project has already shipped three instruments that could not fail. + */ + @Test + public void theShiftPathAllocatesNothing() { + ThreadMXBean bean = ManagementFactory.getThreadMXBean(); + Assume.assumeTrue("getThreadAllocatedBytes is a HotSpot extension", + bean instanceof com.sun.management.ThreadMXBean); + com.sun.management.ThreadMXBean hotspot = (com.sun.management.ThreadMXBean) bean; + final long threadId = Thread.currentThread().getId(); + Assume.assumeTrue("thread allocation measurement is disabled", + hotspot.isThreadAllocatedMemorySupported() + && hotspot.isThreadAllocatedMemoryEnabled()); + + final int n = 200_000; + final double lon = Math.toRadians(-100.0); + final double lat = Math.toRadians(40.0); + final ProjCoordinate scratch = new ProjCoordinate(); + + // CONTROL FIRST, so a broken meter fails before it can report a clean result. + long controlBefore = hotspot.getThreadAllocatedBytes(threadId); + long sink = 0; + for (int i = 0; i < n; i++) { + PolarCoordinate p = new PolarCoordinate(lon + i * 1e-12, lat); + sink += Double.doubleToRawLongBits(p.lam); + } + long controlBytes = hotspot.getThreadAllocatedBytes(threadId) - controlBefore; + assertTrue("CONTROL FAILED - the allocation meter did not see " + n + " PolarCoordinates" + + " (" + controlBytes + " bytes). Every zero it reports below is" + + " meaningless. sink=" + sink, + controlBytes > n * 8L); + + // Warm up, so class loading and first-call resolution are not counted as allocation. + for (int i = 0; i < 20_000; i++) { + scratch.setValue(lon, lat); + Grid.shift(conus, false, scratch); + scratch.setValue(lon, lat); + Grid.shift(conusArray, true, scratch); + } + + long before = hotspot.getThreadAllocatedBytes(threadId); + for (int i = 0; i < n; i++) { + scratch.setValue(lon, lat); + Grid.shift(conus, false, scratch); + } + long forwardList = hotspot.getThreadAllocatedBytes(threadId) - before; + + before = hotspot.getThreadAllocatedBytes(threadId); + for (int i = 0; i < n; i++) { + scratch.setValue(lon, lat); + Grid.shift(conusArray, true, scratch); + } + long inverseArray = hotspot.getThreadAllocatedBytes(threadId) - before; + + // Not exactly zero: the JVM samples and the measurement itself is not free. One byte per + // call would be 200,000; the pre-rewrite inverse path was tens of bytes per call, so a + // 2,048-byte total over 200,000 calls discriminates by three orders of magnitude. + assertTrue("Grid.shift(List) allocated " + forwardList + " bytes over " + n + + " forward shifts", forwardList < 2048); + assertTrue("Grid.shift(Grid[]) allocated " + inverseArray + " bytes over " + n + + " inverse shifts", inverseArray < 2048); + } + + // ============================================================================================ + + private static final class Outcome { + final boolean threw; + final long xBits; + final long yBits; + final String message; + + Outcome(boolean threw, double x, double y, String message) { + this.threw = threw; + this.xBits = Double.doubleToRawLongBits(x); + this.yBits = Double.doubleToRawLongBits(y); + this.message = message; + } + + @Override + public String toString() { + return (threw ? "THREW " : "OK ") + xBits + " " + yBits + " " + message; + } + } + + private static Outcome runList(List grids, boolean inverse, double lonDeg, double latDeg) { + ProjCoordinate c = new ProjCoordinate(Math.toRadians(lonDeg), Math.toRadians(latDeg)); + try { + Grid.shift(grids, inverse, c); + return new Outcome(false, c.x, c.y, ""); + } catch (CrsTransformException e) { + return new Outcome(true, c.x, c.y, e.getMessage()); + } + } + + private static Outcome runArray(Grid[] grids, boolean inverse, double lonDeg, double latDeg) { + ProjCoordinate c = new ProjCoordinate(Math.toRadians(lonDeg), Math.toRadians(latDeg)); + try { + Grid.shift(grids, inverse, c); + return new Outcome(false, c.x, c.y, ""); + } catch (CrsTransformException e) { + return new Outcome(true, c.x, c.y, e.getMessage()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/NTV2Test.java b/core/src/test/java/org/locationtech/proj4j/datum/NTV2Test.java index f46be09..86edfc4 100644 --- a/core/src/test/java/org/locationtech/proj4j/datum/NTV2Test.java +++ b/core/src/test/java/org/locationtech/proj4j/datum/NTV2Test.java @@ -25,6 +25,11 @@ import org.locationtech.proj4j.ProjCoordinate; import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; /** * Using grid shifts for Catalonia @@ -80,17 +85,59 @@ public void gridShiftNTV2Inverse() { expected2.areYOrdinatesEqual(result2, 0.001)); } + /** + * A grid held outside the classpath, on the filesystem. + * + *

This test used to interpolate an absolute path straight into + * {@code +nadgrids=}, which worked because {@code Grid.resolveGridDefinition} did + * {@code new File(gridName)} before consulting the classpath. That path is gone: a + * {@code +nadgrids=} token arrives from a possibly per-row, possibly user-supplied CRS string, and + * {@code new File} accepts {@code ../} and absolute paths, so it was an untrusted-input file-open + * primitive as well as a determinism hazard (an unqualified name resolved against a + * framework-chosen working directory). + * + *

The capability itself is entirely legitimate, and this is now how you ask for it: register a + * {@link DirectoryResourceResolver} over the directory you trust, then refer to the grid by its bare + * name. The trust boundary is a line of application code instead of a property of every string that + * reaches the parser. + */ @Test - public void nadGridExternalTest() throws URISyntaxException { - String path = this.getClass().getResource("/proj4/nad/100800401.gsb").toURI().getPath(); - CRSFactory crsFactory = new CRSFactory(); - - CoordinateReferenceSystem tmercWithNadGridV2 = - crsFactory.createFromParameters("EPSG:2100", - "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0 +units=m +nadgrids=" - + path + " +no_defs" - ); + public void nadGridFromAnExplicitlyTrustedDirectory() throws URISyntaxException { + Path grid = Paths.get(this.getClass().getResource("/proj4/nad/100800401.gsb").toURI()); + ResourceResolvers.addResolver(new DirectoryResourceResolver(grid.getParent())); + try { + GridCache.instance().clear(); + CRSFactory crsFactory = new CRSFactory(); + + CoordinateReferenceSystem tmercWithNadGridV2 = + crsFactory.createFromParameters("EPSG:2100", + "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 " + + "+towgs84=-199.87,74.79,246.62,0,0,0,0 +units=m " + + "+nadgrids=100800401.gsb +no_defs"); + + Assert.assertEquals(Datum.TYPE_GRIDSHIFT, + tmercWithNadGridV2.getDatum().getTransformType()); + } finally { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + } + } - Assert.assertEquals(Datum.TYPE_GRIDSHIFT, tmercWithNadGridV2.getDatum().getTransformType()); + /** An absolute path in a {@code +nadgrids=} token no longer opens a file. */ + @Test + public void anAbsolutePathInNadgridsIsNoLongerOpened() throws URISyntaxException { + String path = Paths.get( + this.getClass().getResource("/proj4/nad/100800401.gsb").toURI()).toString(); + try { + new CRSFactory().createFromParameters("EPSG:2100", + "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 " + + "+towgs84=-199.87,74.79,246.62,0,0,0,0 +units=m +nadgrids=" + path + + " +no_defs"); + Assert.fail("an absolute path must not resolve; register a DirectoryResourceResolver instead"); + } catch (RuntimeException expected) { + Assert.assertTrue(String.valueOf(expected.getMessage()), + String.valueOf(expected.getMessage()).contains("nadgrid") + || String.valueOf(expected.getMessage()).contains("Unknown grid")); + } } } diff --git a/core/src/test/java/org/locationtech/proj4j/datum/NadgridsWgs84OverrideTest.java b/core/src/test/java/org/locationtech/proj4j/datum/NadgridsWgs84OverrideTest.java new file mode 100644 index 0000000..126826c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/NadgridsWgs84OverrideTest.java @@ -0,0 +1,323 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertEquals; + +/** + * {@link GeocentricConverter#overrideWithWGS84Params()} against {@code cs2cs} 9.8.1, in every shape + * that reaches it. + * + *

Why this file exists

+ * + *

Because the method looks removable and is not. It is a five-line setter that replaces a + * datum's ellipsoid with WGS 84 whenever {@link Datum#getTransformType()} is + * {@link Datum#TYPE_GRIDSHIFT}, it is inherited from PROJ 5's {@code pj_transform.c}, and it had + * been diagnosed in {@code CoordinateTransformTest} as the cause of a 42,538.9 m error on + * {@code EPSG:4055 -> EPSG:3857} — described there as "a sphere-geodetic to ellipsoid-geodetic + * latitude conversion that PROJ does not perform, because to PROJ {@code +nadgrids=@null} means no + * datum shift at all." That reading is wrong in both halves, and the cost of acting on it would + * have been large, so the disproof is pinned here rather than written down. + * + *

What upstream actually does, at 9.8.1 and not merely at 5.2.0

+ * + *

{@code projinfo} for a {@code +nadgrids=} source into a {@code +towgs84} target emits: + * + *

+ * +step +proj=hgridshift +grids=@foo.gsb
+ * +step +proj=cart +ellps=WGS84        <-- not the source's own clrk66
+ * +step +proj=helmert +x=-1 +y=-2 +z=-3
+ * +step +inv +proj=cart +ellps=bessel
+ * 
+ * + *

The grid's own ellipsoid never appears. That is the whole invariant: the output of a + * horizontal grid shift is WGS 84 geodetic latitude and longitude by construction, so the + * geocentric leg on that side of the shift must run on WGS 84. It is the same statement as + * {@code 5.2.0:src/pj_transform.c:874-889}, which sets {@code src_a}/{@code src_es} after applying + * the source shift and {@code dst_a}/{@code dst_es} before the destination's inverse shift — the + * lines this method was ported from — and it survives unchanged into 9.8.1's pipeline layer. + * + *

{@code null} is a grid that shifts by zero, not a suppression of the shift. + * {@code 9.8.1:src/grids.cpp:2661} short-circuits {@code HorizontalShiftGridSet::open} on + * {@code filename == "null"} to a synthetic 3x3 global {@code NullHorizontalShiftGrid} whose + * {@code valueAt} returns {@code 0.0f, 0.0f} — no file is opened. So {@code +nadgrids=@null} still + * changes the datum to WGS 84; it merely asserts that no lon/lat correction is needed to get there. + * Proj4J reaches the same place by a different route: {@code Grid.java:149-174} special-cases the + * name identically. + * + *

The positive control

+ * + *

Disabling both call sites in {@code BasicCoordinateTransform} with an + * {@code if (false && ...)} and re-running this matrix moves eleven of the rows below, by + * 305 m to 30 km: + * + * + * + * + * + * + * + * + * + * + * + * + * + *
measured movement with the override disabled, frozen A/B
rownorthing moves by
{@link #webMercatorFromWgs84IsTheReasonThisMethodExists()}-25,380.283 m
{@link #popularVisualisationSphereToWebMercator()}+42,538.889 m
{@link #targetSphereWithNullGrid()}-30,211.556 m
{@link #bothSidesNullGrid()}-429.722 m
{@link #sevenParamSourceToNullGridTarget()}+363.988 m
{@link #nullGridSourceToSevenParamTarget()}-364.006 m
{@link #helmertSourceToNullGridTarget()}+335.927 m
{@link #nullGridSourceToHelmertTarget()}-335.864 m
{@link #wgs84SourceToNullGridTarget()}+335.894 m
+ * + *

The first is the one that matters: {@code EPSG:3857} is {@code +nadgrids=@null} on an + * {@code a=b=6378137} sphere, so without the override every Web Mercator transform in the + * library round-trips WGS 84 latitudes through a sphere. The method is not a relic. + * + *

Only {@link #helmertSourceToPlainEllipsoidTarget()} and the two GRS80 rows are unmoved by + * disabling it, and they are here precisely as the discriminator: a check that cannot fail proves + * nothing. + * + *

References

+ * + *

Every expected value below is {@code cs2cs} 9.8.1 on the same parameter string, at + * {@code -d 15}, with {@code +type=crs} appended to both sides so the strings are read as CRSs + * rather than as operations — without it {@code projinfo} answers "not a CRS" and + * {@code cs2cs} silently takes a different path. Bracketed figures are the measured Proj4J residual; + * each tolerance sits just above its own. + */ +public class NadgridsWgs84OverrideTest { + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + /** The verbatim {@code proj4/nad/epsg} entry for {@code EPSG:4055}, Popular Visualisation CRS. */ + private static final String EPSG_4055 = + "+proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs"; + + /** The verbatim {@code proj4/nad/epsg} entry for {@code EPSG:3857}. Identical to 9.8.1's own + * {@code projinfo EPSG:3857 -o PROJ} export apart from {@code 0.0} for {@code 0}. */ + private static final String EPSG_3857 = + "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0" + + " +units=m +nadgrids=@null +wktext +no_defs"; + + private void check(String src, String tgt, double x, double y, + double expectX, double expectY, double tolerance) { + CoordinateTransform t = TRANSFORMS.createTransform( + CRS.createFromParameters("src", src), CRS.createFromParameters("tgt", tgt)); + ProjCoordinate out = new ProjCoordinate(); + t.transform(new ProjCoordinate(x, y), out); + assertEquals("easting, " + src + " -> " + tgt, expectX, out.x, tolerance); + assertEquals("northing, " + src + " -> " + tgt, expectY, out.y, tolerance); + } + + // ============================================================================================== + // The row the whole method hangs on. + // ============================================================================================== + + /** + * {@code EPSG:4326 -> EPSG:3857}, the most common transform there is, and the one that breaks + * by 25,380 m the moment {@code overrideWithWGS84Params} stops being called. + * + *

{@code EPSG:3857}'s datum is an {@code a=b=6378137} sphere carrying {@code +nadgrids=@null}, + * so it reports {@link Datum#TYPE_GRIDSHIFT} and is not {@code ==} to WGS 84. The override is + * what restores the WGS 84 ellipsoid on the target side of the geocentric leg, at which point + * the two converters compare equal and {@code BasicCoordinateTransform} skips the leg entirely — + * which is the correct answer, and the same one 9.8.1 gives by resolving the string to + * WGS 84 / Pseudo-Mercator with {@code BASEGEOGCRS["WGS 84"]}. + */ + @Test + public void webMercatorFromWgs84IsTheReasonThisMethodExists() { + check("+proj=longlat +datum=WGS84 +no_defs", EPSG_3857, + 103.095703, 36.421282, + 11476561.160934567451477, 4358745.039558878168464, 1.0e-9); // [0, 0 m] + } + + // ============================================================================================== + // EPSG:4055 -> EPSG:3857, the row that was read as a 42.5 km defect. + // ============================================================================================== + + /** + * The headline row, and the disproof. Proj4J is 2.3e-7 m from {@code cs2cs} 9.8.1 on + * these strings, not 42,538.9 m: the reference the gap was measured against was + * {@code cs2cs EPSG:4055 EPSG:3857}, which reads {@code proj.db}, where {@code EPSG:4055} is + * {@code +proj=longlat +R=6378137} with no {@code +towgs84} and where both the CRS and + * its transformation to WGS 84 (EPSG:15973) are deprecated, so 9.8.1 answers with a ballpark + * {@code +proj=noop}. Proj4J reads {@code proj4/nad/epsg}, whose entry carries the zero + * {@code +towgs84}, and 9.8.1 given that same string builds + * {@code +proj=cart +R=6378137} then {@code +inv +proj=cart +ellps=WGS84} and agrees. + */ + @Test + public void popularVisualisationSphereToWebMercator() { + check(EPSG_4055, EPSG_3857, 0.0, -85.01794318500549, + 0.0, -20037366.780895609408617, 1.0e-6); // [0, 2.3e-7 m] + } + + /** + * The same pair with {@code +towgs84} removed from the source: both engines drop to + * {@code -19994827.892...}, the plain spherical Mercator value. Sole cause, isolated — the + * 42,538.9 m is entirely this one token, and nothing about {@code @null} contributes to it. + */ + @Test + public void popularVisualisationSphereWithoutTowgs84() { + check("+proj=longlat +a=6378137 +b=6378137 +no_defs", EPSG_3857, + 0.0, -85.01794318500549, + 0.0, -19994827.892149358987808, 1.0e-8); // [0, 1.0e-9 m] + // and the +R spelling, which is what projinfo EPSG:4055 -o PROJ emits at 9.8.1 + check("+proj=longlat +R=6378137 +no_defs", EPSG_3857, + 0.0, -85.01794318500549, + 0.0, -19994827.892149358987808, 1.0e-8); // [0, 1.0e-9 m] + } + + /** + * The other half of the isolation: source unchanged, {@code +nadgrids=@null} removed from the + * target. Also {@code -19994827.892...}, in both engines. So each cause alone accounts for the + * whole 42,538.9 m and they are not two errors summing to one — the target's + * {@link Datum#TYPE_GRIDSHIFT} and the source's {@code +towgs84} are jointly necessary, and + * 9.8.1 tracks Proj4J through both switches. + */ + @Test + public void popularVisualisationSphereToMercatorWithoutNullGrid() { + check(EPSG_4055, + "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0" + + " +units=m", + 0.0, -85.01794318500549, + 0.0, -19994827.892149358987808, 1.0e-8); // [0, 1.0e-9 m] + } + + // ============================================================================================== + // The override on a genuinely non-WGS84 ellipsoid, both directions, which is the blast radius + // the sphere case does not cover. Clarke 1866 and Bessel are the ellipsoids Datum.NAD27 and + // Datum.POTSDAM carry, i.e. the 526 shipped registry codes that can reach TYPE_GRIDSHIFT. + // ============================================================================================== + + /** Target side: Helmert source, {@code +nadgrids=@null} on Clarke 1866. */ + @Test + public void helmertSourceToNullGridTarget() { + check("+proj=longlat +ellps=bessel +towgs84=100,200,300", + "+proj=merc +ellps=clrk66 +nadgrids=@null", 0.0, 45.0, + 282.399947356742189, 5591314.559088424779475, 1.0e-8); // [6e-14, 3.8e-9 m] + } + + /** Source side: {@code +nadgrids=@null} on Clarke 1866 into a Helmert target. */ + @Test + public void nullGridSourceToHelmertTarget() { + check("+proj=longlat +ellps=clrk66 +nadgrids=@null", + "+proj=merc +ellps=bessel +towgs84=100,200,300", 0.0, 45.0, + -282.342447250643829, 5590444.246635736897588, 1.0e-8); // [3e-14, 4.9e-9 m] + } + + /** + * The discriminator. Same source, same target ellipsoid, {@code +nadgrids=@null} replaced by a + * zero Helmert — so the override is not triggered and this row is the one that does not + * move when it is disabled. Without it the disabling experiment above could not be told from a + * broken measurement. + */ + @Test + public void helmertSourceToPlainEllipsoidTarget() { + check("+proj=longlat +ellps=bessel +towgs84=100,200,300", + "+proj=merc +ellps=clrk66 +towgs84=0,0,0", 0.0, 45.0, + 282.399947356742246, 5591650.486387284472585, 1.0e-8); // [0, 2.8e-9 m] + } + + /** Seven-parameter source — the {@code potsdam} shape — into a {@code @null} Clarke 1866. */ + @Test + public void sevenParamSourceToNullGridTarget() { + check("+proj=longlat +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7", + "+proj=merc +ellps=clrk66 +nadgrids=@null", 9.0, 50.0, + 1001770.605658558779396, 6413032.439889852888882, 1.0e-8); // [<1e-9, 3.1e-9 m] + } + + /** ...and its mirror. */ + @Test + public void nullGridSourceToSevenParamTarget() { + check("+proj=longlat +ellps=clrk66 +nadgrids=@null", + "+proj=merc +ellps=bessel +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7", + 9.0, 50.0, + 1001874.918986174743623, 6413076.714977690018713, 1.0e-8); // [0, 0 m] + } + + /** + * A {@code @null} target on a sphere that is not 6378137, so 9.8.1's + * {@code io.cpp:11998} Web Mercator special case — which recognises + * {@code merc + a==b + lat_ts=0 + k=1 + nadgrids=@null} and sets {@code ignoreNadgrids_} — does + * not fire and the general {@code BoundCRS} path is taken instead. The override still matches: + * replacing a sphere with the WGS 84 ellipsoid on the grid side of the leg is exactly + * what 9.8.1 does, on a sphere as on any other ellipsoid. + */ + @Test + public void targetSphereWithNullGrid() { + check("+proj=longlat +ellps=bessel +towgs84=100,200,300", + "+proj=merc +a=6371000 +b=6371000 +nadgrids=@null", 0.0, 45.0, + 282.080878506817271, 5615525.345617476850748, 1.0e-8); // [3e-14, 3.9e-9 m] + } + + /** + * Both sides {@code TYPE_GRIDSHIFT} on different ellipsoids. Both converters are overridden to + * WGS 84, compare equal, and the geocentric leg is skipped — {@code 5.2.0:pj_transform.c:892}'s + * condition, and correct: two grid shifts to and from WGS 84 compose without a cart round trip. + * 9.8.1 emits {@code hgridshift} then {@code +inv +proj=hgridshift} with nothing between them. + */ + @Test + public void bothSidesNullGrid() { + check("+proj=longlat +ellps=clrk66 +nadgrids=@null", + "+proj=merc +ellps=bessel +nadgrids=@null", 0.0, 45.0, + 0.0, 5590737.771429197862744, 1.0e-9); // [0, 0 m] + } + + /** A source that is already exactly WGS 84: the override collapses the leg, as it should. */ + @Test + public void wgs84SourceToNullGridTarget() { + check("+proj=longlat +ellps=WGS84 +towgs84=0,0,0", + "+proj=merc +ellps=clrk66 +nadgrids=@null", 0.0, 45.0, + 0.0, 5591021.003795098513365, 1.0e-9); // [0, 1.3e-11 m] + } + + // ============================================================================================== + // A KNOWN DIVERGENCE, recorded rather than hidden, and demonstrably not about @null. + // ============================================================================================== + + /** + * Proj4J is 1.48e-4 m from 9.8.1 whenever a GRS80 datum carries an all-zero Helmert, and + * this pair of rows exists to prove that has nothing to do with {@code @null} or with + * {@code overrideWithWGS84Params}. + * + *

9.8.1 treats {@code +ellps=GRS80 +towgs84=0,0,0} as already WGS 84 and deletes the + * transformation outright — {@code projinfo -s '+proj=longlat +ellps=GRS80 +towgs84=0,0,0' -t + * EPSG:4326} answers with a bare {@code +proj=axisswap +order=2,1} — whereas the same query on + * {@code +ellps=clrk66 +towgs84=0,0,0} keeps the full {@code cart}/{@code inv cart} pair. Proj4J + * performs the GRS80-to-WGS84 geocentric round trip literally, and the 1/f difference of 1.5e-9 + * between the two ellipsoids is worth 0.148 mm of northing at 45 deg. + * + *

The two rows are identical except that the first target carries {@code +nadgrids=@null} and + * the second a zero Helmert. Both diverge by the same 1.4799e-4 m, and only the first is + * moved by disabling the override — so the divergence is attributable to the GRS80 handling + * alone. Fixing it means teaching {@code Datum}/{@code BasicCoordinateTransform} that + * {@link Datum#TYPE_WGS84} implies the WGS 84 ellipsoid on the geocentric leg, which would move + * every GRS80-with-null-Helmert row in the corpus and needs its own measurement; it is not part + * of the {@code @null} story. Tolerances here admit the gap and name it. + */ + @Test + public void grs80WithNullHelmertDivergesByAboutAMillimetreTenth() { + check("+proj=longlat +ellps=GRS80 +towgs84=0,0,0", + "+proj=merc +ellps=clrk66 +nadgrids=@null", 0.0, 45.0, + 0.0, 5591021.003795098513365, 2.0e-4); // [0, -1.4799e-4 m] + check("+proj=longlat +ellps=GRS80 +towgs84=0,0,0", + "+proj=merc +ellps=clrk66 +towgs84=0,0,0", 0.0, 45.0, + 0.0, 5591356.897729491814971, 2.0e-4); // [0, -1.4799e-4 m] + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java b/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java index 25fad7b..181d081 100644 --- a/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java +++ b/core/src/test/java/org/locationtech/proj4j/datum/TransformerTypeTest.java @@ -13,7 +13,7 @@ public class TransformerTypeTest { @Test public void isTransformerTypeWgs84() { - String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +f=298.257222101 +pm=Greenwich +units=m +no_defs"; + String utm32znParameters = "+proj=tmerc +lat_0=0.0 +lon_0=9.0 +k_0=0.9996 +x_0=3.25E7 +y_0=0.0 +a=6378137.0 +rf=298.257222101 +pm=Greenwich +units=m +no_defs"; CoordinateReferenceSystem utm32znCrs = crsFactory.createFromParameters("Anon", utm32znParameters); assertTrue(utm32znCrs.getDatum().getTransformType() == Datum.TYPE_WGS84); diff --git a/core/src/test/java/org/locationtech/proj4j/datum/audit/LegacyDatumAreaOfUseTest.java b/core/src/test/java/org/locationtech/proj4j/datum/audit/LegacyDatumAreaOfUseTest.java new file mode 100644 index 0000000..80f880f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/audit/LegacyDatumAreaOfUseTest.java @@ -0,0 +1,356 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.audit; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * What each built-in datum is worth, measured at a point inside that datum's own area + * of use and pinned to {@code cs2cs} 9.8.1. + * + *

Why the probe point moves per datum

+ * + *

A datum shift is a rigid-body motion of the whole Earth, so its error at a fixed + * probe tells you almost nothing about its error where the datum is actually used. That is + * the structural weakness of {@code proj4-epsg.csv}, which exercises hundreds of + * definitions at whatever coordinate happens to be on the row. Here OSGB36 is measured in + * Cheshire and in Edinburgh, carthage in Tunis and in the Sahara, potsdam on the Rhine and + * on the 9th meridian, nzgd49 in Wellington, ire65 in Dublin, hermannskogel in Salzburg, + * GGRS87 in Athens. + * + *

How the reference was taken, and how it was not

+ * + *

Every expected value below is {@code cs2cs} 9.8.1 (Rel. April 10th 2026), never + * Proj4J's own output. {@code cs2cs} is the right tool because both sides here are full + * CRSs; {@code proj} would give a bare projection and a different answer. + * + *

The reference target is written as {@code +ellps=... +towgs84=...} rather than + * {@code +datum=...}, and that distinction is load-bearing rather than cosmetic. PROJ 9.x + * resolves {@code +datum=} against {@code proj.db}, recognises the EPSG datum behind + * the name, and then picks the best available EPSG transformation — which is often a + * grid, not the {@code towgs84} in {@code src/datums.cpp} at all. Three of the ten are + * affected: + * + * + * + * + * + * + * + * + * + *
{@code cs2cs} operation chosen for {@code +datum=}, versus the legacy table
datumwhat {@code +datum=} selectsgap to the legacy Helmert
OSGB36{@code uk_os_OSTN15_NTv2_OSGBtoETRS.tif} (OSGB36 to WGS 84 (9), 1 m)0.039 m E, 1.784 m N
potsdam{@code de_adv_BETA2007.tif} (DHDN to WGS 84 (4), 1 m)0.395 m E, 0.132 m N
nzgd49{@code nz_linz_nzgd2kgrid0005.tif} (NZGD49 to WGS 84 (2))2.248 m E, 1.313 m N
+ * Those gaps are grid-versus-Helmert residuals. They are not parameter defects and cannot + * be closed by editing {@code Datum}; closing them needs the grids. Pinning a + * {@code +datum=}-derived number as the target for a Helmert implementation would have + * attributed 1.784 m of OSTN15 residual to a 3 mm transcription slip. + * + *

Reference commands have the shape + *

+ * echo "<lon> <lat>" | cs2cs -f '%.9f' +proj=longlat +datum=WGS84 \
+ *     +to <target> +units=m +no_defs
+ * 
+ * + * @see LegacyDatumTableTest for the parameter-level audit these numbers measure + */ +public class LegacyDatumAreaOfUseTest { + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + private static final String WGS84 = "+proj=longlat +datum=WGS84 +no_defs"; + + /** + * Proj4J's geocentric Helmert against PROJ's {@code cart + helmert + cart} pipeline. + * Both are the same closed form in double precision; the observed agreement is better + * than a nanometre, and 1e-5 m still leaves a factor of 300 of headroom below the + * smallest defect measured here (3.0 mm). + */ + private static final double TOL = 1.0e-5; + + private static ProjCoordinate to(String target, double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(CRS.createFromParameters("wgs84", WGS84), + CRS.createFromParameters("target", target)) + .transform(new ProjCoordinate(lon, lat), out); + return out; + } + + private static void check(String what, String target, double lon, double lat, + double expectedX, double expectedY) { + ProjCoordinate got = to(target, lon, lat); + assertEquals(what + " easting", expectedX, got.x, TOL); + assertEquals(what + " northing", expectedY, got.y, TOL); + } + + // ================================================================ changed datums + + /** + * OSGB36, changed. EPSG:27700, OSGB 1936 / British National Grid, at + * 53.35169°N 2.03017°W — Cheshire, the point the defect was first reported at. + * + * + * + * + * + * + * + * + *
easting / northing
EN
before, {@code 542.06,0.15,0.247,0.842,-20.489}398089.000827863383867.000380436
after, PROJ's {@code 542.060,0.1502,0.2470,0.8421,-20.4894}398089.003912952383867.000589373
Δ3.085 mm0.209 mm
+ *

+ * For the avoidance of the mis-attribution that started this audit: {@code cs2cs + * +datum=OSGB36} gives 398088.964408 / 383865.216031 at this point, 1.784 m of + * northing away, and that 1.784 m is the OSTN15 grid versus any Helmert. It is + * not what the truncation cost. See the class javadoc. + */ + @Test + public void osgb36InCheshire() { + check("OSGB36 EPSG:27700 Cheshire", + "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000" + + " +datum=OSGB36 +units=m +no_defs", + -2.0301713578021983, 53.35168607080468, + 398089.003912952, 383867.000589373); + + // The size of the correction, as a live fact rather than a comment. + ProjCoordinate got = to("+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000" + + " +y_0=-100000 +datum=OSGB36 +units=m +no_defs", + -2.0301713578021983, 53.35168607080468); + assertEquals("the truncated parameters were 3.085 mm out in easting", + 0.003085089, got.x - 398089.000827863, 1.0e-5); + } + + /** + * OSGB36, changed. Second point, Edinburgh (55.9533°N 3.1883°W), to show + * the correction is not a local accident. Before 325897.218139444 / 674001.201609757; + * after (and {@code cs2cs}) 325897.221501991 / 674001.201887040 — 3.363 mm of easting. + * The largest displacement found anywhere in Great Britain was 3.5 mm, at 7.5°W + * 57°N. + */ + @Test + public void osgb36InEdinburgh() { + check("OSGB36 EPSG:27700 Edinburgh", + "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000" + + " +datum=OSGB36 +units=m +no_defs", + -3.1883, 55.9533, + 325897.221501991, 674001.201887040); + } + + /** + * carthage, changed. EPSG:22391, Carthage / Nord Tunisie, at Tunis + * (36.8065°N 10.1815°E). The change is the ellipsoid, {@code clrk80} → + * {@code clrk80ign}, so it moves the projection as well as the shift. + * + * + * + * + * + * + * + * + *
easting / northing
EN
before, {@code +ellps=clrk80}525062.209391343389332.428727402
after, PROJ's {@code +ellps=clrk80ign}525062.209579013389332.449180218
Δ0.188 mm20.453 mm
+ * Here {@code cs2cs +datum=carthage} agrees with the legacy form exactly, because + * Carthage to WGS 84 (1) is the same three-parameter shift. + */ + @Test + public void carthageInTunis() { + check("carthage EPSG:22391 Tunis", + "+proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544 +x_0=500000" + + " +y_0=300000 +datum=carthage +units=m +no_defs", + 10.1815, 36.8065, + 525062.209579013, 389332.449180218); + + ProjCoordinate got = to("+proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544" + + " +x_0=500000 +y_0=300000 +datum=carthage +units=m +no_defs", + 10.1815, 36.8065); + assertEquals("clrk80 was 20.45 mm out in northing", + 0.020452816, got.y - 389332.428727402, 1.0e-5); + } + + /** + * carthage, changed. EPSG:22392, Carthage / Sud Tunisie, at 31°N 9°E — + * 2.3° south of the zone's {@code lat_0}, where the ellipsoid change presents + * differently: before 413959.533335781 / 45170.036589029, after 413959.532678930 / + * 45170.053716585. So 0.66 mm of easting and 17.13 mm of northing, in the opposite + * easting direction to Tunis. A single probe point would have characterised neither. + */ + @Test + public void carthageInTheSouth() { + check("carthage EPSG:22392 Sud Tunisie", + "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=9.9 +k_0=0.999625769 +x_0=500000" + + " +y_0=300000 +datum=carthage +units=m +no_defs", + 9.0, 31.0, + 413959.532678930, 45170.053716585); + } + + /** + * potsdam, changed in definition, unchanged in value. EPSG:31467, DHDN / + * 3-degree Gauss-Kruger zone 3, at 50°N 9°E. PROJ's uncommented definition is + * {@code nadgrids=@BETA2007.gsb} and its commented-out one is the Helmert; both are now + * declared. With the grid unavailable the Helmert applies, and that is bit-for-bit what + * {@code cs2cs +datum=potsdam} produces when {@code de_adv_BETA2007.tif} is hidden from + * {@code PROJ_DATA}: 3500074.525405575 / 5540407.107229995. + *

+ * Had the Helmert been dropped in favour of a literal reading of the uncommented string + * alone, this would have become 3500000.000000 / 5540279.541956 — no shift at all, + * 74.525 m E and 127.565 m N from the value below and 74.921 m / 127.698 m from + * {@code cs2cs} with the grid present. + */ + @Test + public void potsdamOnTheNinthMeridian() { + check("potsdam EPSG:31467 GK zone 3", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +datum=potsdam" + + " +units=m +no_defs", + 9.0, 50.0, + 3500074.525405575, 5540407.107229995); + } + + /** + * potsdam. EPSG:31466, GK zone 2, at 51.425°N 6.685°E — the point + * {@code FeatureTest.testDatumConversion} uses, kept here so the datum's own suite + * carries it independently of that test's fate. + */ + @Test + public void potsdamOnTheRhine() { + check("potsdam EPSG:31466 GK zone 2", + "+proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +datum=potsdam" + + " +units=m +no_defs", + 6.685, 51.425, + 2547686.152498610, 5699151.775292793); + } + + // ================================================================ unchanged datums + + /** + * WGS84, unchanged. {@code towgs84=0,0,0}: the shift must be exactly nothing, + * and 500000.000000001 rather than 500000 is PROJ's own residual at the central + * meridian, reproduced. + */ + @Test + public void wgs84InUtmZone33() { + check("WGS84 EPSG:32633", "+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs", + 15.0, 50.0, 500000.000000001, 5538630.702867474); + } + + /** + * GGRS87, unchanged. EPSG:2100, Greek Grid, at Athens (37.9838°N + * 23.7275°E). {@code towgs84=-199.87,74.79,246.62} on GRS80. + */ + @Test + public void ggrs87InAthens() { + check("GGRS87 EPSG:2100", + "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +datum=GGRS87" + + " +units=m +no_defs", + 23.7275, 37.9838, 475920.265213187, 4203764.699194606); + } + + /** + * NAD83, unchanged. EPSG:26918, UTM 18N, at Washington DC. {@code towgs84=0,0,0} + * on GRS80, so again exactly no shift. + *

+ * {@code cs2cs +datum=NAD83} gives 323394.032756778 here — 0.264 m away — because + * {@code proj.db} carries a real NAD83→WGS84 transformation and prefers it to the + * legacy table's identity. The legacy value is the correct target for this + * implementation, and the 0.264 m is a known consequence of Proj4J implementing the + * {@code pj_datums} path. + */ + @Test + public void nad83InUtmZone18() { + check("NAD83 EPSG:26918", "+proj=utm +zone=18 +datum=NAD83 +units=m +no_defs", + -77.0365, 38.8977, 323394.296410752, 4307395.633727551); + } + + /** + * hermannskogel, unchanged. EPSG:31287, MGI / Austria Lambert, at Salzburg + * (47.8095°N 13.0448°E). The seven-parameter set matches PROJ digit for digit, + * and here {@code +datum=hermannskogel} and the legacy form agree exactly. + */ + @Test + public void hermannskogelInSalzburg() { + check("hermannskogel EPSG:31287", + "+proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333" + + " +x_0=400000 +y_0=400000 +datum=hermannskogel +units=m +no_defs", + 13.0448, 47.8095, 378452.906422178, 434498.349220390); + } + + /** + * ire65, unchanged. EPSG:29902, Irish Grid, at Dublin (53.3498°N + * 6.2603°W). {@code cs2cs +datum=ire65} differs by 8 mm E / 51 mm N because it + * prefers an EPSG TM75 operation; the legacy Helmert is reproduced exactly. + */ + @Test + public void ire65InDublin() { + check("ire65 EPSG:29902", + "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000" + + " +datum=ire65 +units=m +no_defs", + -6.2603, 53.3498, 315900.553319576, 234671.409910170); + } + + /** + * nzgd49, unchanged. EPSG:27200, NZGD49 / New Zealand Map Grid, at Wellington + * (41.2865°S 174.7762°E). {@code cs2cs +datum=nzgd49} is 2.248 m E / 1.313 m N + * away, being the {@code nz_linz_nzgd2kgrid0005.tif} distortion grid rather than the + * Helmert. The Helmert itself is reproduced exactly. + */ + @Test + public void nzgd49InWellington() { + check("nzgd49 EPSG:27200", + "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +datum=nzgd49" + + " +units=m +no_defs", + 174.7762, -41.2865, 2658759.624232528, 5989629.930248617); + } + + /** + * NAD27, unchanged. The one grid-shift datum, and the one whose probe point has + * to be chosen with the shipped grid inventory in mind rather than only the + * datum's area of use. + * + *

{@code Datum.NAD27} requests {@code @conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat} and + * {@code Grid.shift} takes the first grid whose bounding box contains the point. + * Two of the four resolve today ({@code conus} and {@code ntv1_can.dat}), and + * {@code conus}'s box reaches to 50°N / 63°W — so it swallows the whole + * Canada–US border region including Ottawa, Toronto and Montreal. A probe at + * Ottawa therefore exercises {@code conus} extrapolated past its real coverage, not the + * Canadian grid, and lands 2.487 m from PROJ. (PROJ has the same ordering rule, but a + * different resolved set, so it does not make the same substitution.) That is a finding + * about the grid inventory and belongs to the grids work, not to this table; it is + * recorded here so the next reader does not rediscover it as an arithmetic bug. + * + *

North of 50°N the ambiguity is gone. At 52°N 75°W, into EPSG:26718, + * both libraries use {@code ntv1_can.dat} and agree. Reference + * {@code cs2cs ... +to +proj=utm +zone=18 +ellps=clrk66 +nadgrids=@ntv1_can.dat} = + * 499975.296223 / 5760810.259052, against 500000.000000 / 5760820.102914 with no shift + * at all — so the grid is contributing 24.70 m of easting and it is being applied. + * PROJ's own {@code +datum=NAD27} gives 499975.798047 / 5760810.381353 here, 0.502 m + * away, because it selects NTv2; that is a grid difference, not an error in either. + * + *

Tolerance is 1 mm rather than {@code TOL} because the two libraries read different + * encodings of the same grid — Proj4J the original {@code .dat}, PROJ the GeoTIFF + * conversion {@code ca_nrc_ntv1_can.tif}. + */ + @Test + public void nad27InNorthernQuebec() { + ProjCoordinate got = to("+proj=utm +zone=18 +datum=NAD27 +units=m +no_defs", + -75.0, 52.0); + assertEquals("NAD27 EPSG:26718 easting", 499975.296223, got.x, 1.0e-3); + assertEquals("NAD27 EPSG:26718 northing", 5760810.259052, got.y, 1.0e-3); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/audit/LegacyDatumTableTest.java b/core/src/test/java/org/locationtech/proj4j/datum/audit/LegacyDatumTableTest.java new file mode 100644 index 0000000..1ee8053 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/audit/LegacyDatumTableTest.java @@ -0,0 +1,350 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.audit; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.util.ProjectionMath.MILLION; +import static org.locationtech.proj4j.util.ProjectionMath.SECONDS_TO_RAD; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * A transcription audit of Proj4J's ten built-in datums against PROJ 9.8.1's own legacy + * table, {@code src/datums.cpp}, read at tag {@code 9.8.1} + * ({@code f08fa86c478c4bbbf003b1ec751dd84aa6eca486}). + * + *

Why a table test and not only coordinate tests

+ * + *

Three of the ten were wrong, and all three were wrong in ways a coordinate test with + * any ordinary tolerance would pass: a Helmert whose rotations had lost two decimal + * places, an ellipsoid off by 55 mm of equatorial radius, and a datum whose PROJ + * definition is a grid rather than a Helmert. The consequences are 3 mm, 20 mm and 148 m + * respectively, so no single tolerance catches the set. Comparing the parameters + * catches all three at once, and does it as a statement about the upstream source rather + * than about a chosen probe point. {@link LegacyDatumAreaOfUseTest} then measures what + * each parameter set is worth, at a point inside that datum's own area of use. + * + *

The upstream rows are quoted verbatim below so the audit is checkable without + * cloning PROJ. Ellipsoid values are from {@code src/ellps.cpp} at the same tag. + * + *

+ * {"WGS84",         "towgs84=0,0,0",                                                    "WGS84",     ""},
+ * {"GGRS87",        "towgs84=-199.87,74.79,246.62",                                     "GRS80",     "Greek_Geodetic_Reference_System_1987"},
+ * {"NAD83",         "towgs84=0,0,0",                                                    "GRS80",     "North_American_Datum_1983"},
+ * {"NAD27",         "nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", "clrk66",    "North_American_Datum_1927"},
+ * {"potsdam",     /*"towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7",*/
+ *                   "nadgrids=@BETA2007.gsb",                                       "bessel",    "Potsdam Rauenberg 1950 DHDN"},
+ * {"carthage",      "towgs84=-263.0,6.0,431.0",                                         "clrk80ign", "Carthage 1934 Tunisia"},
+ * {"hermannskogel", "towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232",          "bessel",    "Hermannskogel"},
+ * {"ire65",         "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",       "mod_airy",  "Ireland 1965"},
+ * {"nzgd49",        "towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",               "intl",      "New Zealand Geodetic Datum 1949"},
+ * {"OSGB36",        "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",   "airy",      "Airy 1830"},
+ * 
+ * + *

What was wrong

+ *
    + *
  • OSGB36 — {@code 542.06, 0.15, 0.247, 0.842, -20.489} instead of + * {@code 542.060, 0.1502, 0.2470, 0.8421, -20.4894}. The old numbers are EPSG:1314 + * (OSGB36 to WGS 84 (6)) to the digit, which is why they read as deliberate.
  • + *
  • carthage — bound to {@code clrk80} ({@code a=6378249.145}, + * {@code rf=293.4663}) where PROJ says {@code clrk80ign} ({@code a=6378249.2}, + * {@code rf=293.4660212936269}).
  • + *
  • potsdam — PROJ's uncommented definition is a grid, not the Helmert. See + * {@link Datum#POTSDAM}'s javadoc for the measurement that decided how to reproduce + * a definition upstream ships in two halves.
  • + *
+ * + *

The other seven transcribe correctly, component for component, including the + * ellipsoid binding. Nothing is missing and nothing is extra: PROJ's table has exactly + * these ten and so does {@link Registry#datums}. + */ +public class LegacyDatumTableTest { + + /** + * Translations are stored as declared, and arcseconds survive the round trip through + * {@link ProjectionMath#SECONDS_TO_RAD} to within a part in 1e13. + */ + private static final double EXACT = 1.0e-12; + + /** + * The scale difference does not: {@link Datum}'s constructor stores + * {@code ds/1e6 + 1}, and adding 1 to 6.7e-6 discards the low bits of the mantissa, + * so recovering {@code ds} returns 6.699999999915107 rather than 6.7. That is 8.5e-11 + * ppm, i.e. 0.5 nanometres on the Earth's radius, and it is a property of the storage + * form rather than of the transcription. PROJ stores the same quantity the same way + * ({@code helmert.cpp}: {@code Q->scale = 1 + s * 1e-6}). + */ + private static final double PPM = 1.0e-9; + + // ---------------------------------------------------------------- helpers + + /** + * {@link Datum}'s constructor rescales rotations to radians and the scale difference + * to a multiplier, in place, so the declared arcsecond/ppm figures have to be + * recovered before they can be compared with the upstream string. + */ + private static double[] asDeclared(Datum d) { + double[] t = d.getTransformToWGS84(); + if (t == null || t.length != 7) return t; + double[] out = new double[7]; + out[0] = t[0]; + out[1] = t[1]; + out[2] = t[2]; + out[3] = t[3] / SECONDS_TO_RAD; + out[4] = t[4] / SECONDS_TO_RAD; + out[5] = t[5] / SECONDS_TO_RAD; + out[6] = (t[6] - 1.0) * MILLION; + return out; + } + + private static void assertTowgs84(String datumId, Datum d, double[] expected) { + double[] got = asDeclared(d); + assertNotNull(datumId + ": towgs84 must be present", got); + assertEquals(datumId + ": towgs84 arity", expected.length, got.length); + String[] label = {"dx", "dy", "dz", "rx", "ry", "rz", "ds"}; + for (int i = 0; i < expected.length; i++) { + assertEquals(datumId + ": towgs84 " + label[i], expected[i], got[i], + i == 6 ? PPM : EXACT); + } + } + + /** Compares against a reference {@link Ellipsoid} built from PROJ's own ellps.cpp row. */ + private static void assertEllipsoidByRf(String datumId, Datum d, + String shortName, double a, double rf) { + Ellipsoid e = d.getEllipsoid(); + assertEquals(datumId + ": ellipsoid name", shortName, e.getShortName()); + assertEquals(datumId + ": ellipsoid a", a, e.getEquatorRadius(), 0.0); + Ellipsoid ref = new Ellipsoid(shortName, a, 0.0, rf, "reference"); + assertEquals(datumId + ": ellipsoid es (from rf=" + rf + ")", + ref.getEccentricitySquared(), e.getEccentricitySquared(), 1.0e-17); + } + + private static void assertEllipsoidByB(String datumId, Datum d, + String shortName, double a, double b) { + Ellipsoid e = d.getEllipsoid(); + assertEquals(datumId + ": ellipsoid name", shortName, e.getShortName()); + assertEquals(datumId + ": ellipsoid a", a, e.getEquatorRadius(), 0.0); + Ellipsoid ref = new Ellipsoid(shortName, a, b, 0.0, "reference"); + assertEquals(datumId + ": ellipsoid es (from b=" + b + ")", + ref.getEccentricitySquared(), e.getEccentricitySquared(), 1.0e-17); + } + + // ---------------------------------------------------------------- the ten rows + + /** {@code {"WGS84", "towgs84=0,0,0", "WGS84", ""}} */ + @Test + public void wgs84() { + assertEquals("WGS84", Datum.WGS84.getCode()); + assertTowgs84("WGS84", Datum.WGS84, new double[]{0, 0, 0}); + assertEllipsoidByRf("WGS84", Datum.WGS84, "WGS84", 6378137.0, 298.257223563); + assertEquals(Datum.TYPE_WGS84, Datum.WGS84.getTransformType()); + } + + /** + * {@code {"GGRS87", "towgs84=-199.87,74.79,246.62", "GRS80", + * "Greek_Geodetic_Reference_System_1987"}} + */ + @Test + public void ggrs87() { + assertEquals("GGRS87", Datum.GGRS87.getCode()); + assertTowgs84("GGRS87", Datum.GGRS87, new double[]{-199.87, 74.79, 246.62}); + assertEllipsoidByRf("GGRS87", Datum.GGRS87, "GRS80", 6378137.0, 298.257222101); + assertEquals(Datum.TYPE_3PARAM, Datum.GGRS87.getTransformType()); + } + + /** {@code {"NAD83", "towgs84=0,0,0", "GRS80", "North_American_Datum_1983"}} */ + @Test + public void nad83() { + assertEquals("NAD83", Datum.NAD83.getCode()); + assertTowgs84("NAD83", Datum.NAD83, new double[]{0, 0, 0}); + assertEllipsoidByRf("NAD83", Datum.NAD83, "GRS80", 6378137.0, 298.257222101); + assertEquals(Datum.TYPE_WGS84, Datum.NAD83.getTransformType()); + } + + /** + * {@code {"NAD27", "nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", "clrk66", + * "North_American_Datum_1927"}} + *

+ * The grid list is asserted by {@code parser.datumgrids} and + * {@code grids.Ntv1CanHeaderTest}; what belongs here is that NAD27 is a grid-shift + * datum with no Helmert at all and carries {@code clrk66}. + */ + @Test + public void nad27() { + assertEquals("NAD27", Datum.NAD27.getCode()); + assertNull("NAD27 declares nadgrids, never towgs84", + Datum.NAD27.getTransformToWGS84()); + assertEllipsoidByB("NAD27", Datum.NAD27, "clrk66", 6378206.4, 6356583.8); + assertEquals("only ntv1_can.dat of the four ships, and it is enough to make the" + + " datum a grid-shift datum", + Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + } + + /** + * {@code {"potsdam", /*"towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7",*/ + * "nadgrids=@BETA2007.gsb", "bessel", "Potsdam Rauenberg 1950 DHDN"}} + *

+ * Both halves of that source line are reproduced, and which one takes effect depends + * on whether {@code BETA2007.gsb} is resolvable — which is exactly how + * {@code cs2cs +datum=potsdam} behaves. See {@link Datum#POTSDAM}. Proj4J does not + * ship the grid, so the assertion is on the Helmert fallback; the day the grid lands, + * {@code getTransformType()} becomes {@code TYPE_GRIDSHIFT} and the last assertion + * here is the one that will say so. + */ + @Test + public void potsdam() { + assertEquals("potsdam", Datum.POTSDAM.getCode()); + assertTowgs84("potsdam", Datum.POTSDAM, + new double[]{598.1, 73.7, 418.2, 0.202, 0.045, -2.455, 6.7}); + assertEllipsoidByRf("potsdam", Datum.POTSDAM, "bessel", 6377397.155, 299.1528128); + assertEquals("BETA2007.gsb is not shipped, so the @-optional grid list is empty" + + " and the commented-out Helmert is what applies -- which is also" + + " what cs2cs falls back to when the grid is absent", + Datum.TYPE_7PARAM, Datum.POTSDAM.getTransformType()); + } + + /** {@code {"carthage", "towgs84=-263.0,6.0,431.0", "clrk80ign", "Carthage 1934 Tunisia"}} */ + @Test + public void carthage() { + assertEquals("carthage", Datum.CARTHAGE.getCode()); + assertTowgs84("carthage", Datum.CARTHAGE, new double[]{-263.0, 6.0, 431.0}); + assertEllipsoidByRf("carthage", Datum.CARTHAGE, + "clrk80ign", 6378249.2, 293.4660212936269); + assertSame("PROJ says clrk80ign, not clrk80", + Ellipsoid.CLRK80IGN, Datum.CARTHAGE.getEllipsoid()); + assertEquals(Datum.TYPE_3PARAM, Datum.CARTHAGE.getTransformType()); + } + + /** + * {@code {"hermannskogel", "towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232", + * "bessel", "Hermannskogel"}} + */ + @Test + public void hermannskogel() { + assertEquals("hermannskogel", Datum.HERMANNSKOGEL.getCode()); + assertTowgs84("hermannskogel", Datum.HERMANNSKOGEL, + new double[]{577.326, 90.129, 463.919, 5.137, 1.474, 5.297, 2.4232}); + assertEllipsoidByRf("hermannskogel", Datum.HERMANNSKOGEL, + "bessel", 6377397.155, 299.1528128); + assertEquals(Datum.TYPE_7PARAM, Datum.HERMANNSKOGEL.getTransformType()); + } + + /** + * {@code {"ire65", "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + * "mod_airy", "Ireland 1965"}} + */ + @Test + public void ire65() { + assertEquals("ire65", Datum.IRE65.getCode()); + assertTowgs84("ire65", Datum.IRE65, + new double[]{482.530, -130.596, 564.557, -1.042, -0.214, -0.631, 8.15}); + assertEllipsoidByB("ire65", Datum.IRE65, "mod_airy", 6377340.189, 6356034.446); + assertEquals(Datum.TYPE_7PARAM, Datum.IRE65.getTransformType()); + } + + /** + * {@code {"nzgd49", "towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", "intl", + * "New Zealand Geodetic Datum 1949"}} + */ + @Test + public void nzgd49() { + assertEquals("nzgd49", Datum.NZGD49.getCode()); + assertTowgs84("nzgd49", Datum.NZGD49, + new double[]{59.47, -5.04, 187.44, 0.47, -0.1, 1.024, -4.5993}); + assertEllipsoidByRf("nzgd49", Datum.NZGD49, "intl", 6378388.0, 297.0); + assertEquals(Datum.TYPE_7PARAM, Datum.NZGD49.getTransformType()); + } + + /** + * {@code {"OSGB36", "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", + * "airy", "Airy 1830"}} + */ + @Test + public void osgb36() { + assertEquals("OSGB36", Datum.OSGB36.getCode()); + assertTowgs84("OSGB36", Datum.OSGB36, + new double[]{446.448, -125.157, 542.060, 0.1502, 0.2470, 0.8421, -20.4894}); + assertEllipsoidByRf("OSGB36", Datum.OSGB36, "airy", 6377563.396, 299.3249646); + assertEquals(Datum.TYPE_7PARAM, Datum.OSGB36.getTransformType()); + } + + // ---------------------------------------------------------------- the set itself + + /** + * PROJ's table has exactly ten live rows (an eleventh is the {@code nullptr} + * sentinel), and {@link Registry} must offer exactly those ten under exactly those + * ids. A silently added or renamed datum is a divergence in its own right, because + * {@code +datum=} is resolved by string equality. + */ + @Test + public void theSetIsExactlyProjsTen() { + String[] upstream = {"WGS84", "GGRS87", "NAD83", "NAD27", "potsdam", "carthage", + "hermannskogel", "ire65", "nzgd49", "OSGB36"}; + Registry registry = new Registry(); + List missing = new ArrayList(); + for (int i = 0; i < upstream.length; i++) { + if (registry.getDatum(upstream[i]) == null) missing.add(upstream[i]); + } + assertTrue("+datum= names PROJ 9.8.1 has and Proj4J does not: " + missing, + missing.isEmpty()); + assertEquals("Proj4J must not offer datums PROJ's legacy table lacks", + upstream.length, Registry.datums.length); + } + + /** + * The one place a wrong ellipsoid could still hide: {@link Registry#datums} must hand + * out the very singletons {@link Datum} declares, so that an audit of the constants + * is an audit of what {@code +datum=} resolves to. + */ + @Test + public void registryHandsOutTheDeclaredSingletons() { + Registry registry = new Registry(); + assertSame(Datum.WGS84, registry.getDatum("WGS84")); + assertSame(Datum.GGRS87, registry.getDatum("GGRS87")); + assertSame(Datum.NAD83, registry.getDatum("NAD83")); + assertSame(Datum.NAD27, registry.getDatum("NAD27")); + assertSame(Datum.POTSDAM, registry.getDatum("potsdam")); + assertSame(Datum.CARTHAGE, registry.getDatum("carthage")); + assertSame(Datum.HERMANNSKOGEL, registry.getDatum("hermannskogel")); + assertSame(Datum.IRE65, registry.getDatum("ire65")); + assertSame(Datum.NZGD49, registry.getDatum("nzgd49")); + assertSame(Datum.OSGB36, registry.getDatum("OSGB36")); + } + + /** + * A datum compared with itself must short-circuit on reference identity. The ten are + * process-wide singletons and {@code isEqual}'s grid-shift branch otherwise descends + * to {@code Arrays.equals} over every node of a loaded NTv2 table. + */ + @Test + public void identityComparisonIsCheapAndTrueForEveryOne() { + for (int i = 0; i < Registry.datums.length; i++) { + Datum d = Registry.datums[i]; + assertTrue(d.getCode() + " must equal itself", d.isEqual(d)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffConcurrencyTest.java b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffConcurrencyTest.java new file mode 100644 index 0000000..a9e6fc8 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffConcurrencyTest.java @@ -0,0 +1,224 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.geotiff; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.VerticalGrid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * GeoTIFF grids in the same 36-thread, {@code doubleToRawLongBits} regime as + * {@code org.locationtech.proj4j.grids.GridShiftConcurrencyTest}. + * + *

The bitwise assertion is not decoration. A reader that kept a decode buffer or a + * {@code ByteBuffer} position in an instance field would produce finite, plausible coordinates + * when two threads interleave inside one block decode, and a tolerance-based assertion would pass + * straight through such a torn value. Grid interpolation reads {@code float} nodes into {@code double} + * arithmetic, so tearing lands in the low bits and only a raw-bits comparison sees it. + * + *

Three claims, each with its own hazard: + *

    + *
  • Concurrent first use. 36 threads racing to load the same never-before-loaded + * grid must produce exactly one parse and one shared instance, with no lock held across the read — + * that is {@code GridCache}'s contract, and a GeoTIFF is the heaviest thing to put through it + * because parsing inflates every strip.
  • + *
  • Concurrent reads of one parsed grid. The grid is deeply immutable after + * construction, so many readers must be indistinguishable from each owning a copy.
  • + *
  • The inverse shift. The only data-dependent loop on the grid path, and therefore + * the only place a shared mutable iterate could hide.
  • + *
+ */ +public class GeoTiffConcurrencyTest { + + private static final int THREADS = Math.max(36, Runtime.getRuntime().availableProcessors() * 2); + private static final int ITERATIONS = 200; + private static final double D2R = Math.PI / 180.0; + + private static final double[][] HGRID_POINTS = { + {4.5, 52.5}, {4.1, 52.1}, {6.9, 54.9}, {5.0, 53.0}, {4.75, 52.25}, + }; + + private static final double[][] SUBGRID_POINTS = { + {-115.5416667, 51.1666667}, {-80.5041667, 44.5458333}, + {-115.7, 51.6}, {-80.4, 44.9}, + }; + + /** 36 threads racing to load one grid for the first time must all get the same instance. */ + @Test(timeout = 180_000) + public void concurrentFirstLoadYieldsOneSharedInstance() throws Exception { + final String name = "test_hgrid_tiled.tif"; + final CyclicBarrier barrier = new CyclicBarrier(THREADS); + final List failures = new CopyOnWriteArrayList(); + final Grid[] seen = new Grid[THREADS]; + Thread[] threads = new Thread[THREADS]; + for (int t = 0; t < THREADS; t++) { + final int index = t; + threads[t] = new Thread(new Runnable() { + @Override + public void run() { + try { + barrier.await(); + List list = new ArrayList(); + Grid.mergeGridFile(name, list); + seen[index] = list.get(0); + } catch (Throwable e) { + failures.add(e); + } + } + }, "geotiff-load-" + t); + } + run(threads, failures); + for (int t = 1; t < THREADS; t++) { + assertSame("every thread must observe the one cached parse", seen[0], seen[t]); + } + assertEquals("gtiff", seen[0].getFormat()); + } + + /** Many readers of one parsed horizontal grid, forward and inverse, bit for bit. */ + @Test(timeout = 180_000) + public void horizontalShiftsAreBitwiseIdenticalAcrossThreads() throws Exception { + assertBitwiseStable("test_hgrid.tif", HGRID_POINTS, false); + assertBitwiseStable("test_hgrid.tif", HGRID_POINTS, true); + assertBitwiseStable("test_hgrid_tiled_separate.tif", HGRID_POINTS, false); + } + + /** + * The subgrid hierarchy under concurrency. {@code Grid.shift} reassigns its {@code grid} local while + * descending, which is exactly the shape of code that would break if the tree were mutable. + */ + @Test(timeout = 180_000) + public void subgridDescentIsBitwiseIdenticalAcrossThreads() throws Exception { + assertBitwiseStable("test_hgrid_with_subgrid.tif", SUBGRID_POINTS, false); + assertBitwiseStable("test_hgrid_with_subgrid_no_grid_name.tif", SUBGRID_POINTS, false); + } + + private static void assertBitwiseStable(final String name, final double[][] points, + final boolean inverse) throws Exception { + final List grids = GeoTiffFixtures.horizontal(name); + final long[][] expected = new long[points.length][2]; + for (int i = 0; i < points.length; i++) { + double[] out = GeoTiffFixtures.shiftDegrees(grids, inverse, points[i][0], points[i][1]); + assertTrue(name + " point " + i + " must be finite", Double.isFinite(out[0])); + expected[i][0] = Double.doubleToRawLongBits(out[0]); + expected[i][1] = Double.doubleToRawLongBits(out[1]); + } + final CyclicBarrier barrier = new CyclicBarrier(THREADS); + final List failures = new CopyOnWriteArrayList(); + Thread[] threads = new Thread[THREADS]; + for (int t = 0; t < THREADS; t++) { + threads[t] = new Thread(new Runnable() { + @Override + public void run() { + try { + barrier.await(); + for (int n = 0; n < ITERATIONS; n++) { + for (int i = 0; i < points.length; i++) { + ProjCoordinate c = new ProjCoordinate( + points[i][0] * D2R, points[i][1] * D2R); + Grid.shift(grids, inverse, c); + double lon = Math.toDegrees(c.x); + double lat = Math.toDegrees(c.y); + if (Double.doubleToRawLongBits(lon) != expected[i][0] + || Double.doubleToRawLongBits(lat) != expected[i][1]) { + throw new AssertionError(name + (inverse ? " inverse" : " forward") + + " point " + i + " diverged: got (" + lon + ", " + lat + + ") expected bits " + expected[i][0] + "/" + + expected[i][1]); + } + } + } + } catch (Throwable e) { + failures.add(e); + } + } + }, "geotiff-shift-" + t); + } + run(threads, failures); + } + + /** + * The vertical path, including the subgrid descent that {@code valueAt} performs before + * interpolating. + */ + @Test(timeout = 180_000) + public void verticalValuesAreBitwiseIdenticalAcrossThreads() throws Exception { + final VerticalGrid grid = VerticalGrid.fromName("test_vgrid_with_subgrid.tif"); + final double[][] points = {{4.5, 52.5}, {5.5, 53.5}, {4.2, 52.2}, {6.0, 54.0}}; + final long[] expected = new long[points.length]; + for (int i = 0; i < points.length; i++) { + expected[i] = Double.doubleToRawLongBits( + grid.valueAt(points[i][0] * D2R, points[i][1] * D2R, 1.0)); + } + final CyclicBarrier barrier = new CyclicBarrier(THREADS); + final List failures = new CopyOnWriteArrayList(); + final AtomicInteger done = new AtomicInteger(); + Thread[] threads = new Thread[THREADS]; + for (int t = 0; t < THREADS; t++) { + threads[t] = new Thread(new Runnable() { + @Override + public void run() { + try { + barrier.await(); + for (int n = 0; n < ITERATIONS; n++) { + for (int i = 0; i < points.length; i++) { + double v = grid.valueAt(points[i][0] * D2R, points[i][1] * D2R, 1.0); + if (Double.doubleToRawLongBits(v) != expected[i]) { + throw new AssertionError("vertical point " + i + " diverged: got " + + v); + } + } + } + done.incrementAndGet(); + } catch (Throwable e) { + failures.add(e); + } + } + }, "geotiff-vshift-" + t); + } + run(threads, failures); + assertEquals(THREADS, done.get()); + } + + private static void run(Thread[] threads, List failures) throws InterruptedException { + for (int t = 0; t < threads.length; t++) { + threads[t].start(); + } + for (int t = 0; t < threads.length; t++) { + threads[t].join(150_000); + if (threads[t].isAlive()) { + fail(threads[t].getName() + " did not finish; suspect a lock held across grid I/O"); + } + } + if (!failures.isEmpty()) { + AssertionError e = new AssertionError(failures.size() + " thread(s) failed; first: " + + failures.get(0)); + e.initCause(failures.get(0)); + throw e; + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffFixtures.java b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffFixtures.java new file mode 100644 index 0000000..b71f565 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffFixtures.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.geotiff; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; + +/** + * The GeoTIFF grid fixtures, where every byte of them came from, and where every expected number came + * from. + * + *

Fixture provenance

+ * + *

All 35 {@code .tif} files under {@code core/src/test/resources/proj4j-data/grids/} are + * byte-for-byte copies of PROJ 9.8.1's own {@code data/tests/} files, i.e. of + * {@code git -C PROJ show 9.8.1:data/tests/}. They were not generated here, downsampled here, or + * regenerated from proj4j output — which matters, because a fixture written by the code under test + * agrees with it by construction, forever. Total 49,758 bytes across 35 files; the + * largest is 6,943 B. Upstream blob SHAs (first 12 hex digits of the git object at tag {@code 9.8.1}, + * {@code f08fa86c478c4bbbf003b1ec751dd84aa6eca486}) and sizes: + * + *

+ * test_hgrid.tif                                     94718c21d817    506
+ * test_hgrid_degree.tif                              d06782ec3475    680
+ * test_hgrid_extra_ifd_with_other_info.tif           b7e67af723b7   1708
+ * test_hgrid_lon_shift_first.tif                     395f0743f9ec    764
+ * test_hgrid_positive_west.tif                       4ebc17cc0467    764
+ * test_hgrid_radian.tif                              30219ccdf78e    680
+ * test_hgrid_separate.tif                            ef2ca575b09a    514
+ * test_hgrid_strip.tif                               e38fc609f491    514
+ * test_hgrid_tiled.tif                               b0d5dd8b2cfb   4920
+ * test_hgrid_tiled_separate.tif                      d7e0934fc461   2256
+ * test_hgrid_with_overview.tif                       d7453b49b926    864
+ * test_hgrid_with_subgrid.tif                        46a8f2f4f722   6943
+ * test_hgrid_with_subgrid_no_grid_name.tif           974699b56173   6943
+ * test_hydroid_height.tif                            4b8db2e162d4   1002
+ * test_vgrid_bigendian.tif                           5cf4a0392f8b    430
+ * test_vgrid_bigendian_bigtiff.tif                   a586b85fad34    568
+ * test_vgrid_bigtiff.tif                             2a01893a5180    568
+ * test_vgrid_bottomup_with_matrix.tif                90f637dcf50d    474
+ * test_vgrid_bottomup_with_scale.tif                 636b7dc77596    430
+ * test_vgrid_deflate_floatingpointpredictor.tif      5fd7b9fabf6c    422
+ * test_vgrid_float64.tif                             16b3e7902568    494
+ * test_vgrid_in_second_channel.tif                   d377f8b74ce2    632
+ * test_vgrid_int16.tif                               1c69b5d61d2b    398
+ * test_vgrid_invalid_channel_type.tif                ec9e641f741a    560
+ * test_vgrid_nodata.tif                              65ec53432653    464
+ * test_vgrid_pixelisarea.tif                         a5409f6609aa    430
+ * test_vgrid_pixelispoint.tif                        cfeb598f4940    430
+ * test_vgrid_single_strip_truncated.tif              9a0030f66878    550
+ * test_vgrid_uint16_with_scale_offset.tif            b08fa4a330dd    556
+ * test_vgrid_unsupported_byte.tif                    ccf03fc8988f    382
+ * test_vgrid_with_overview.tif                       aa15aa1d7228    707
+ * test_vgrid_with_subgrid.tif                        5c7584c4b77b    756
+ * us_noaa_geoid06_ak_subset_at_antimeridian.tif      2c01759cde7d   6617
+ * us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif  c2acae8a2e0d  1285
+ * us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif              67a8d9af9e01  3547
+ * 
+ * + *

The last three are real published NOAA data, not synthetic: a NAVD88 geoid subset straddling the + * antimeridian, and two NADCON 5 extracts. Those two are the reason there is no NADCON + * reader anywhere in this codebase and should not be one — {@code 9.8.1:src/grids.cpp} dispatches on + * exactly four things (NTv1, CTABLE V2, NTv2, TIFF), there is no {@code .las}/{@code .los} handling in + * {@code src/} at all, and {@code us_noaa_nadcon5_*.tif} is NADCON 5 data in GeoTIFF, read by + * the TIFF path. This reader is therefore also the NADCON answer. + * + *

Expected-value provenance

+ * + *

Every expected number in this package was produced by PROJ 9.8.1 itself reading the same + * bytes — the Homebrew build reporting {@code Rel. 9.8.1, April 10th, 2026}. That is the only + * reference that isolates reader-plus-interpolation from a data difference. Commands, verbatim: + * + *

+ * export PROJ_DATA=<PROJ>/data          # so tests/<name> resolves
+ *
+ * cct -d 12 +proj=vgridshift +grids=tests/<name> +multiplier=1   <<< "<lon> <lat> 0 0"
+ * cct -d 12 +proj=hgridshift +grids=tests/<name>                 <<< "<lon> <lat> 0 0"
+ * 
+ * + *

{@code cct}, not {@code cs2cs}. {@code cs2cs} promotes both datum-less sides of a + * geographic-to-geographic call to full CRSs and then picks its own operation from {@code proj.db}: it + * ignores {@code +nadgrids=} entirely in that shape. Verified while pinning these values — + * {@code cs2cs +proj=longlat +ellps=clrk66 +nadgrids=conus +to +proj=longlat +ellps=GRS80} returns the + * input unchanged, which would have looked like a proj4j bug or, worse, been pinned as truth. + * + *

{@code cct} prints the value in the operation's own units, so the vertical assertions compare + * metres against metres and the horizontal ones degrees against degrees, both at 12 decimals. + */ +final class GeoTiffFixtures { + + private GeoTiffFixtures() { + } + + /** {@code cct -d 12} prints 12 decimals; 1e-9° is ~0.1 mm and 1e-9 m is a nanometre. */ + static final double TOL = 1e-9; + + /** The point almost every synthetic fixture is probed at, chosen by upstream's own gie file. */ + static final double PROBE_LON = 4.5; + static final double PROBE_LAT = 52.5; + + /** + * The value every one of the sixteen equivalent {@code test_vgrid_*} spellings must produce at + * {@link #PROBE_LON}/{@link #PROBE_LAT}. Sixteen files, one number: that is the whole point of the + * upstream fixture set — they differ only in encoding. + */ + static final double PROBE_VALUE = 11.5; + + /** The shift every equivalent {@code test_hgrid_*} spelling must produce, in degrees. */ + static final double[] HGRID_EXPECTED = {5.875, 55.375}; + + static List horizontal(String name) throws IOException { + List list = new ArrayList(); + Grid.mergeGridFile(name, list); + return list; + } + + /** + * Applies {@link Grid#shift} to a lon/lat pair in degrees and returns degrees, so assertions read + * in the same units as the {@code cct} output they are pinned against. + */ + static double[] shiftDegrees(List grids, boolean inverse, double lonDeg, double latDeg) { + ProjCoordinate c = new ProjCoordinate(Math.toRadians(lonDeg), Math.toRadians(latDeg)); + Grid.shift(grids, inverse, c); + return new double[]{Math.toDegrees(c.x), Math.toDegrees(c.y)}; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffHorizontalGridTest.java b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffHorizontalGridTest.java new file mode 100644 index 0000000..e150d45 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffHorizontalGridTest.java @@ -0,0 +1,288 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.geotiff; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Horizontal shift GeoTIFF grids: eleven encodings of one shift, plus subgrid hierarchies and the + * real NADCON 5 grids. + * + *

As with the vertical fixtures, upstream builds every {@code test_hgrid_*.tif} to encode the + * same displacement field, so eleven rows asserting the one answer cross-check strips against + * tiles, {@code CONTIG} against {@code SEPARATE}, arc-seconds against radians against degrees, and + * positive-east against positive-west — with the interpolation held constant. + * + *

The band-order and sign cases deserve naming, because they are where a reader produces a + * finite, plausible wrong coordinate rather than an error: + *

    + *
  • {@code test_hgrid_lon_shift_first.tif} puts the longitude offset in band 0, so a reader that + * trusts the NTv2-inspired default order instead of the {@code DESCRIPTION} metadata swaps the two + * components. That is exactly the defect {@code NTV1.java} carried for its whole history — ~8 m of + * longitude and ~10 m of latitude, never looking like anything in particular.
  • + *
  • {@code test_hgrid_positive_west.tif} declares {@code positive_value="west"}, so a reader that + * ignores it gets the longitude shift with the wrong sign: double the error, in the right + * units, at a plausible location.
  • + *
+ * + *

See {@link GeoTiffFixtures} for the provenance of both the bytes and the numbers. + */ +public class GeoTiffHorizontalGridTest { + + private static void probe(String name) throws IOException { + List grids = GeoTiffFixtures.horizontal(name); + assertEquals("format", "gtiff", grids.get(0).getFormat()); + double[] got = GeoTiffFixtures.shiftDegrees(grids, false, + GeoTiffFixtures.PROBE_LON, GeoTiffFixtures.PROBE_LAT); + assertEquals(name + " longitude", GeoTiffFixtures.HGRID_EXPECTED[0], got[0], 1e-8); + assertEquals(name + " latitude", GeoTiffFixtures.HGRID_EXPECTED[1], got[1], 1e-8); + } + + /** Baseline: uncompressed float32, {@code CONTIG}, one strip, two bands, no metadata at all. */ + @Test + public void baseline() throws Exception { + probe("test_hgrid.tif"); + } + + /** {@code PLANARCONFIG_SEPARATE}: one strip per band, so the block index gains {@code sample * blocks}. */ + @Test + public void planarSeparate() throws Exception { + probe("test_hgrid_separate.tif"); + } + + /** + * Several strips, with {@code RowsPerStrip=3} over a 4-row image — so the last strip is short, and + * {@code StripByteCounts} is typed {@code SHORT} rather than {@code LONG}, which a reader that + * assumes one width for offsets and counts mis-parses. + */ + @Test + public void multipleStripsWithShortByteCounts() throws Exception { + probe("test_hgrid_strip.tif"); + } + + /** Tiled, 16x32 tiles over 360x180, DEFLATE: 138 tiles, and a full-world longitude extent. */ + @Test + public void tiled() throws Exception { + probe("test_hgrid_tiled.tif"); + } + + /** Tiled and {@code SEPARATE}: 18 tiles per band, 36 in the offset array. */ + @Test + public void tiledSeparate() throws Exception { + probe("test_hgrid_tiled_separate.tif"); + } + + /** {@code positive_value="west"}: the longitude offset's sign must be flipped. */ + @Test + public void positiveWest() throws Exception { + probe("test_hgrid_positive_west.tif"); + } + + /** Longitude offset in band 0, latitude in band 1, stated by {@code DESCRIPTION}. */ + @Test + public void longitudeShiftInFirstBand() throws Exception { + probe("test_hgrid_lon_shift_first.tif"); + } + + /** {@code UNITTYPE="radian"}: no conversion factor at all. */ + @Test + public void unitRadian() throws Exception { + probe("test_hgrid_radian.tif"); + } + + /** {@code UNITTYPE="degree"}. */ + @Test + public void unitDegree() throws Exception { + probe("test_hgrid_degree.tif"); + } + + /** A reduced-resolution overview in IFD 1 must be ignored, not used. */ + @Test + public void overviewIfdIsIgnored() throws Exception { + probe("test_hgrid_with_overview.tif"); + } + + /** + * IFD 1 holds {@code latitude_offset_accuracy} / {@code longitude_offset_accuracy} bands. It has + * valid georeferencing and a valid {@code SubfileType}, so nothing structural rejects it — only the + * band descriptions do. Upstream skips such an IFD and carries on. + */ + @Test + public void extraIfdWithAccuracyBandsIsIgnored() throws Exception { + probe("test_hgrid_extra_ifd_with_other_info.tif"); + } + + /** + * A four-IFD subgrid hierarchy declared by {@code grid_name} / {@code parent_grid_name}: two roots + * ({@code CAwest}, {@code CAeast}) each with one child ({@code ALbanff}, {@code ONtronto}). + * + *

Both probe points sit inside a child. The parent covers them too and would give a different, + * entirely plausible answer — this is the 1.4.3 NTv2 defect in a new format, where a matched subgrid + * was located and then ignored. + * + *

The expected coordinates are upstream's own, from {@code geotiff_grids.gie}. + */ + @Test + public void namedSubgridHierarchy() throws Exception { + assertSubgrids("test_hgrid_with_subgrid.tif"); + } + + /** + * The same four images with the {@code grid_name}/{@code parent_grid_name} metadata stripped, so the + * hierarchy has to be recovered from spatial extents alone — upstream's fallback path. + * + *

It must give the identical answer, which is the strongest available statement that the + * two code paths agree. + */ + @Test + public void subgridHierarchyFromExtentsAlone() throws Exception { + assertSubgrids("test_hgrid_with_subgrid_no_grid_name.tif"); + } + + /** + * Both spellings of the four-image hierarchy resolve to three top-level grids, not + * two, and that is upstream's answer rather than a defect here. + * + *

{@code ONtronto} declares {@code parent_grid_name="CAeast"}, but its western edge + * (80.5417°W) is 0.0417° outside {@code CAeast}'s (80.5°W), so the declared + * parent does not contain it. {@code insertIntoHierarchy} ({@code grids.cpp:1398-1415}) treats the + * declared hierarchy as advisory and the extents as authoritative: it falls back to the + * bounding-box method, finds no top grid that contains {@code ONtronto} either, and promotes it to a + * top-level grid. PROJ 9.8.1 says so itself, with {@code PROJ_DEBUG=3}: + * + *

+     * Grid ONtronto refers to parent CAeast, but its extent is not included in it.
+     * Using bounding-box method.
+     * 
+ * + *

The result is still correct for the probe point, because {@code findGrid} then reaches + * {@code ONtronto} as the third entry in the list — which is why the coordinate assertions below + * matter more than the shape assertions above. + */ + private static void assertSubgrids(String name) throws IOException { + List grids = GeoTiffFixtures.horizontal(name); + Grid root = grids.get(0); + assertEquals(name + " has three top-level grids plus one child, under a synthetic bounding grid", + 5, root.countGrids()); + assertEquals("CAwest, CAeast and the promoted ONtronto", 3, root.getSubGrids().size()); + + double[] banff = GeoTiffFixtures.shiftDegrees(grids, false, -115.5416667, 51.1666667); + assertEquals(-115.5427092888, banff[0], 1e-9); + assertEquals(51.1666899972, banff[1], 1e-9); + + double[] toronto = GeoTiffFixtures.shiftDegrees(grids, false, -80.5041667, 44.5458333); + assertEquals(-80.50401615833, toronto[0], 1e-9); + assertEquals(44.5458827236, toronto[1], 1e-9); + } + + /** + * A real NOAA NADCON 5 grid, in GeoTIFF, which is the format NADCON 5 is published + * in and the reason no {@code .las}/{@code .los} reader is needed or wanted. + * + *

Pinned to twelve decimals against + * {@code cct -d 12 +proj=hgridshift +grids=tests/us_noaa_nadcon5_..._sanfrancisco.tif} on these + * bytes. The shift is sub-millimetre, which is what NAD83(1986)→NAD83(HARN) is at San + * Francisco — so this row also proves the reader is not quietly scaling anything: a factor-of-3600 + * unit slip would show as ~1.4 m. + */ + @Test + public void nadcon5ConusExtract() throws Exception { + List grids = GeoTiffFixtures.horizontal( + "us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif"); + double[] got = GeoTiffFixtures.shiftDegrees(grids, false, -122.4194, 37.7749); + assertEquals(-122.419400376354, got[0], 1e-11); + assertEquals(37.774901566552, got[1], 1e-11); + } + + /** + * The NADCON 5 Alaska extract, whose tie point is {@code 201.583}° — a longitude in the + * 0…360 convention, past π in radians. It is here because it is the small, shippable + * stand-in for {@code us_noaa_alaska.tif}, which declares {@code west = -194}°: both need + * {@code isPointInExtent}'s ±2π shift to match a point given in −180…180. + * + *

It also carries a second IFD with one band ({@code ellipsoidal_height_offset} auxiliary data), + * which must be skipped rather than mistaken for a second horizontal grid. + */ + @Test + public void nadcon5AlaskaExtractWithShiftedLongitudeWindow() throws Exception { + List grids = GeoTiffFixtures.horizontal( + "us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif"); + assertEquals("the 1-band auxiliary IFD must not become a second grid", + 1, grids.get(0).countGrids()); + double[] got = GeoTiffFixtures.shiftDegrees(grids, false, -158.0, 61.5); + assertEquals(-157.999999611484, got[0], 1e-11); + assertEquals(61.499999564269, got[1], 1e-11); + } + + /** + * The inverse shift, whose iterative fixed-point solver is the only data-dependent loop on the grid + * path — and the only place where a divergent iteration could be delivered as a plausible + * coordinate rather than as a failure. + * + *

Pinned against {@code cct -d 12 +inv +proj=hgridshift +grids=tests/test_hgrid.tif} on these + * bytes, which returns {@code 3.124999997311 49.625000008931} at (4.5, 52.5). Note this is + * not the inverse of the forward answer: the forward shift moves (4.5, 52.5) to + * (5.875, 55.375), which is outside the grid's 4…7°E by 52…55°N extent + * entirely, so a forward-then-inverse round trip has nowhere to land. That asymmetry is a property + * of upstream's deliberately violent test displacement field, not of the solver. + */ + @Test + public void inverseMatchesUpstream() throws Exception { + List grids = GeoTiffFixtures.horizontal("test_hgrid.tif"); + double[] back = GeoTiffFixtures.shiftDegrees(grids, true, + GeoTiffFixtures.PROBE_LON, GeoTiffFixtures.PROBE_LAT); + assertEquals(3.124999997311, back[0], 1e-9); + assertEquals(49.625000008931, back[1], 1e-9); + } + + /** + * A point outside the grid must be refused, and the grid's declared extent must be the one the + * file's tags imply. {@code test_hgrid.tif} spans 4°…7° E, 52°…55° N. + * + *

This used to assert that the point was "left alone by the legacy API". It is now + * {@link ErrorCause#COORDINATE_OUTSIDE_GRID}, which is what + * {@code pj_hgrid_apply} ({@code grids.cpp:3517-3520}) reports when {@code findGrid} finds + * nothing — returning the input unchanged is indistinguishable from a zero shift. See + * {@code grids/OutsideGridFailsClosedTest}. + */ + @Test + public void extentMatchesTheTags() throws Exception { + List grids = GeoTiffFixtures.horizontal("test_hgrid.tif"); + double[] e = grids.get(0).extentRadians(); + assertEquals(4.0, Math.toDegrees(e[0]), 1e-12); + assertEquals(52.0, Math.toDegrees(e[1]), 1e-12); + assertEquals(7.0, Math.toDegrees(e[2]), 1e-12); + assertEquals(55.0, Math.toDegrees(e[3]), 1e-12); + + try { + double[] outside = GeoTiffFixtures.shiftDegrees(grids, false, -40.0, 35.0); + fail("a point no grid covers must be refused, not echoed; got (" + + outside[0] + ", " + outside[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffRejectionTest.java b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffRejectionTest.java new file mode 100644 index 0000000..f1980fc --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffRejectionTest.java @@ -0,0 +1,337 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.geotiff; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import org.junit.Test; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.VerticalGrid; +import org.locationtech.proj4j.datum.tiff.GeoTiffDataset; +import org.locationtech.proj4j.datum.tiff.UnsupportedTiffException; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * What the reader refuses, and whether it says why. + * + *

This is the class that enforces the project's third non-negotiable — a failure must never be + * expressed as a plausible coordinate — for the GeoTIFF path specifically. Every case here is a + * file that a reader could plausibly muddle through, producing zeros, garbage, or a half-decoded block, + * and reporting a successful transform. All of them must instead throw, and the message must name the + * feature or the defect, because "grid failed to load" in a Spark executor log is not actionable. + * + *

Two of the cases are upstream's own fixtures and correspond to + * {@code expect failure errno invalid_op_file_not_found_or_invalid} rows in + * {@code geotiff_grids.gie}: {@code test_vgrid_unsupported_byte.tif} and + * {@code test_vgrid_invalid_channel_type.tif}. The rest are the fixtures mutated one field at a time, + * which is the only way to cover codecs and malformations upstream ships no file for. + */ +public class GeoTiffRejectionTest { + + private static byte[] fixture(String name) throws IOException { + InputStream in = GeoTiffRejectionTest.class + .getResourceAsStream("/proj4j-data/grids/" + name); + assertNotNull("fixture " + name + " must be on the test classpath", in); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + /** + * Rewrites the first {@code SHORT}-typed value of a tag in IFD 0 of a little-endian classic TIFF. + * + *

Written by hand rather than with a TIFF library because there is no TIFF library on this + * classpath and adding one is what this whole package exists to avoid. + */ + private static byte[] patchShortTag(byte[] file, int tag, int newValue) { + ByteBuffer b = ByteBuffer.wrap(file).order(ByteOrder.LITTLE_ENDIAN); + int ifd = b.getInt(4); + int count = b.getShort(ifd) & 0xffff; + for (int i = 0; i < count; i++) { + int p = ifd + 2 + i * 12; + if ((b.getShort(p) & 0xffff) == tag) { + b.putShort(p + 8, (short) newValue); + return file; + } + } + throw new IllegalStateException("tag " + tag + " not found in IFD 0"); + } + + /** Adds a {@code SHORT} tag is not possible without relaying out the IFD, so mutate one instead. */ + private static byte[] fixtureWith(String name, int tag, int value) throws IOException { + return patchShortTag(fixture(name), tag, value); + } + + private static void expectFailure(String what, byte[] bytes, String mustMention) { + try { + GeoTiffDataset dataset = GeoTiffDataset.open(bytes, what); + // Some defects only surface when the pixels are actually decoded, which is upstream's + // behaviour too -- libtiff reports a strip read failure, not an open failure. + dataset.images().get(0).readSample(0); + fail(what + " must be refused, but it parsed and decoded"); + } catch (IOException e) { + String message = String.valueOf(e.getMessage()); + assertTrue(what + ": message must mention \"" + mustMention + "\" but was: " + message, + message.contains(mustMention)); + } + } + + // --- Upstream's own rejection fixtures --------------------------------------------------- + + /** + * 8-bit samples. Not in PROJ's six-member {@code TIFFDataType} enum, so upstream logs + * "Unsupported combination of SampleFormat and BitsPerSample values" and returns nothing. + */ + @Test + public void eightBitSamplesAreRefused() throws Exception { + try { + VerticalGrid.fromName("test_vgrid_unsupported_byte.tif"); + fail("an 8-bit GeoTIFF must not become a vertical grid"); + } catch (IOException e) { + String m = String.valueOf(e.getMessage()); + assertTrue("must name the offending combination: " + m, + m.contains("SampleFormat") && m.contains("BitsPerSample")); + } + } + + /** + * A band described as {@code invalid_channel_type}. The file is structurally perfect; the only thing + * wrong is the semantics, and IFD 0 having some description but not a recognised one is + * fatal rather than skippable. + */ + @Test + public void unrecognisedBandDescriptionIsRefused() throws Exception { + try { + VerticalGrid.fromName("test_vgrid_invalid_channel_type.tif"); + fail("a GeoTIFF whose only band is not a vertical shift must not become a vertical grid"); + } catch (IOException e) { + assertTrue("must list the descriptions it would have accepted: " + e.getMessage(), + e.getMessage().contains("geoid_undulation")); + } + } + + /** + * A one-band vertical grid asked for as a horizontal one. {@code geotiff_grids.gie} has this as + * {@code operation +proj=hgridshift +grids=tests/test_vgrid.tif} → + * {@code expect failure}: a horizontal shift needs two bands, and one band must not be silently + * reused for both components. + */ + @Test + public void singleBandGridIsNotAHorizontalGrid() throws Exception { + try { + GeoTiffFixtures.horizontal("test_vgrid_pixelispoint.tif"); + fail("a 1-band GeoTIFF must not become a horizontal shift grid"); + } catch (IOException e) { + assertTrue("must say why one band is not enough: " + e.getMessage(), + e.getMessage().contains("at least 2")); + } + } + + /** + * {@code StripByteCounts} declares 4,152,960 bytes; the file is 550. This is upstream's truncated + * fixture, and the only acceptable outcome is an error — a reader that zero-fills the missing strip + * produces a geoid of exactly 0 m everywhere, which is both plausible and catastrophic. + */ + @Test + public void truncatedStripIsRefused() throws Exception { + try { + VerticalGrid.fromName("test_vgrid_single_strip_truncated.tif"); + fail("a grid whose pixel data is not in the file must not load"); + } catch (IOException e) { + assertTrue("must say the file is short: " + e.getMessage(), + e.getMessage().contains("truncated")); + } + } + + // --- Mutated fixtures: the cases upstream ships no file for ----------------------------- + + /** A file cut off inside the pixel data. */ + @Test + public void fileTruncatedMidwayIsRefused() throws Exception { + byte[] full = fixture("test_hgrid.tif"); + byte[] half = new byte[full.length / 2]; + System.arraycopy(full, 0, half, 0, half.length); + expectFailure("test_hgrid.tif truncated to " + half.length + " bytes", half, "TIFF"); + } + + /** A file cut off before the header is complete. */ + @Test + public void fileShorterThanTheHeaderIsRefused() throws Exception { + byte[] stub = new byte[6]; + System.arraycopy(fixture("test_hgrid.tif"), 0, stub, 0, stub.length); + expectFailure("6-byte stub", stub, "header"); + } + + /** + * LZW. libtiff has it configured by default, so PROJ would read such a grid; proj4j + * deliberately does not, because LZW in pure Java is a few hundred lines that no published PROJ + * grid needs. The point of the test is that the refusal names LZW, so the message tells a user + * whose third-party grid this is exactly what to re-encode. + */ + @Test + public void lzwCompressionIsRefusedByName() throws Exception { + expectFailure("test_vgrid_pixelispoint.tif re-tagged as LZW", + fixtureWith("test_vgrid_pixelispoint.tif", 259, 5), "LZW"); + } + + /** JPEG, for the same reason, and because a JPEG-compressed grid is a nonsense we should reject. */ + @Test + public void jpegCompressionIsRefusedByName() throws Exception { + expectFailure("test_vgrid_pixelispoint.tif re-tagged as JPEG", + fixtureWith("test_vgrid_pixelispoint.tif", 259, 7), "JPEG"); + } + + /** + * A palette image. {@code Photometric != MINISBLACK} means the samples are not measurements, so the + * file is not a grid whatever else is true of it. + */ + @Test + public void nonGreyscalePhotometricIsRefused() throws Exception { + expectFailure("test_vgrid_pixelispoint.tif re-tagged as palette", + fixtureWith("test_vgrid_pixelispoint.tif", 262, 3), "Photometric"); + } + + /** + * {@code Predictor=2}, horizontal differencing, on IEEE floating-point samples. TIFF defines + * predictor 2 for integers and predictor 3 for floating point; applying the integer accumulation to + * float bytes yields finite nonsense, so the mismatch has to be caught rather than executed. + */ + @Test + public void horizontalPredictorOnFloatDataIsRefused() throws Exception { + expectFailure("test_vgrid_deflate_floatingpointpredictor.tif re-tagged as Predictor=2", + fixtureWith("test_vgrid_deflate_floatingpointpredictor.tif", 317, 2), "Predictor=2"); + } + + /** + * An unknown predictor value. Applied to the deflate fixture, because a file with no + * {@code Predictor} tag at all has no field to mutate — and a reader must default an absent + * {@code Predictor} to 1 rather than invent one. + */ + @Test + public void unknownPredictorIsRefused() throws Exception { + expectFailure("test_vgrid_deflate_floatingpointpredictor.tif with Predictor=4", + fixtureWith("test_vgrid_deflate_floatingpointpredictor.tif", 317, 4), "Predictor=4"); + } + + /** + * A corrupt DEFLATE stream. Flipping bytes inside the compressed data must surface as an error, not + * as a partially inflated block whose tail is zero. + */ + @Test + public void corruptDeflateStreamIsRefused() throws Exception { + byte[] bytes = fixture("test_vgrid_deflate_floatingpointpredictor.tif"); + // The strip starts at offset 378 in this file (StripOffsets, read with tiffdump); corrupt the + // zlib payload just past its two-byte header. + for (int i = 380; i < 396 && i < bytes.length; i++) { + bytes[i] = (byte) ~bytes[i]; + } + expectFailure("test_vgrid_deflate_floatingpointpredictor.tif with a corrupted zlib payload", + bytes, ""); + } + + /** + * An IFD chain that points back at itself. A reader without a visited set spins forever, and a grid + * name can come from a per-row {@code +grids=} token, so this is a denial-of-service surface rather + * than a curiosity. + */ + @Test + public void loopingIfdChainIsRefused() throws Exception { + byte[] bytes = fixture("test_hgrid.tif"); + ByteBuffer b = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); + int ifd = b.getInt(4); + int count = b.getShort(ifd) & 0xffff; + b.putInt(ifd + 2 + count * 12, ifd); + expectFailure("test_hgrid.tif with a self-referential IFD chain", bytes, "loops"); + } + + /** Not a TIFF at all. */ + @Test + public void nonTiffBytesAreRefused() throws Exception { + byte[] bytes = new byte[]{'G', 'I', 'F', '8', '9', 'a', 0, 0, 0, 0, 0, 0}; + assertTrue("GIF must not be mistaken for a TIFF", !GeoTiffDataset.isTiff(bytes, 4)); + expectFailure("a GIF header", bytes, "Not a TIFF"); + } + + /** + * A projected grid. proj4j's {@code ConversionTable} is radians of longitude and latitude + * throughout, and PROJ refuses these too — "Can only handle grids referenced in a geographic + * CRS". Refusing at parse time rather than at use time is the one deliberate deviation, and it + * still refuses. + */ + @Test + public void projectedGridIsRefused() throws Exception { + // GTModelTypeGeoKey = 1024 with ModelTypeProjected = 1. The GeoKeyDirectory of + // test_hgrid.tif has none, so use the vertical fixture that does and re-tag its model type. + byte[] bytes = fixture("test_vgrid_pixelispoint.tif"); + ByteBuffer b = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN); + int ifd = b.getInt(4); + int count = b.getShort(ifd) & 0xffff; + int keyDirOffset = -1; + for (int i = 0; i < count; i++) { + int p = ifd + 2 + i * 12; + if ((b.getShort(p) & 0xffff) == 34735) { + keyDirOffset = b.getInt(p + 8); + } + } + assertTrue("test_vgrid_pixelispoint.tif must carry a GeoKeyDirectory", keyDirOffset > 0); + // Keys start at index 4, four SHORTs each: [key, tiffTagLocation, count, valueOrOffset]. + for (int k = 4; ; k += 4) { + int key = b.getShort(keyDirOffset + k * 2) & 0xffff; + if (key == 0) { + fail("GTModelTypeGeoKey not found"); + } + if (key == 1024) { + b.putShort(keyDirOffset + (k + 3) * 2, (short) 1); + break; + } + } + try { + GeoTiffDataset dataset = GeoTiffDataset.open(bytes, "projected"); + assertTrue("the image must report itself as projected", + !dataset.images().get(0).isGeographic()); + } catch (UnsupportedTiffException e) { + fail("a projected grid must parse as an image and be refused by the grid layer, not the " + + "container layer: " + e.getMessage()); + } + } + + /** A name that resolves to nothing must be an error naming the resolution chain, not a no-op grid. */ + @Test + public void unresolvableNameIsAnError() throws Exception { + try { + Grid.mergeGridFile("definitely_not_a_grid.tif", new java.util.ArrayList()); + fail("an unresolvable grid name must throw"); + } catch (IOException e) { + assertTrue("must name the chain that was searched: " + e.getMessage(), + e.getMessage().contains("working directory is deliberately not searched")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffVerticalGridTest.java b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffVerticalGridTest.java new file mode 100644 index 0000000..41271c9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GeoTiffVerticalGridTest.java @@ -0,0 +1,258 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.geotiff; + +import java.io.IOException; + +import org.junit.Test; +import org.locationtech.proj4j.datum.VerticalGrid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Vertical GeoTIFF grids: sixteen encodings of one number, plus nodata, subgrids and the antimeridian. + * + *

Upstream's fixture set is built so that every {@code test_vgrid_*.tif} encodes the same + * surface. Sixteen assertions all reading {@link GeoTiffFixtures#PROBE_VALUE} is therefore a + * sixteen-way cross-check of the container reader — endianness, classic versus BigTIFF, strip layout, + * DEFLATE, the floating-point predictor, the six sample types, scale/offset, and the + * {@code PixelIsArea}/{@code PixelIsPoint} half-pixel shift — with the interpolation held constant. A + * bug in any one of those paths shows up as exactly one failing row and names itself. + * + *

See {@link GeoTiffFixtures} for the provenance of both the bytes and the numbers. + */ +public class GeoTiffVerticalGridTest { + + private static final double D2R = Math.PI / 180.0; + + private static double valueAt(String name, double lonDeg, double latDeg) throws IOException { + VerticalGrid grid = VerticalGrid.fromName(name); + assertTrue(name + " must report that it covers (" + lonDeg + ", " + latDeg + ")", + grid.covers(lonDeg * D2R, latDeg * D2R)); + return grid.valueAt(lonDeg * D2R, latDeg * D2R, 1.0); + } + + private static void probe(String name) throws IOException { + assertEquals(name + " must interpolate to PROJ 9.8.1's value", + GeoTiffFixtures.PROBE_VALUE, + valueAt(name, GeoTiffFixtures.PROBE_LON, GeoTiffFixtures.PROBE_LAT), + GeoTiffFixtures.TOL); + } + + /** Baseline: uncompressed float32, a single strip, {@code RasterPixelIsPoint}. */ + @Test + public void pixelIsPoint() throws Exception { + probe("test_vgrid_pixelispoint.tif"); + } + + /** + * {@code RasterPixelIsArea} shifts the tie point by half a pixel + * ({@code west += 0.5 * hRes; north -= 0.5 * vRes}). The two files declare different tie points + * (4/55 versus 3.5/55.5) precisely so that only a reader applying the shift gets the same answer + * from both. + */ + @Test + public void pixelIsArea() throws Exception { + probe("test_vgrid_pixelisarea.tif"); + } + + /** + * DEFLATE plus {@code Predictor=3}. Not an exotic case: all seven of PROJ's US grids are encoded + * this way, so this row failing means none of them can be read. + */ + @Test + public void deflateWithFloatingPointPredictor() throws Exception { + probe("test_vgrid_deflate_floatingpointpredictor.tif"); + } + + /** {@code uint16} raised through {@code role="scale"} 0.5 and {@code role="offset"} −5. */ + @Test + public void uint16WithScaleAndOffset() throws Exception { + probe("test_vgrid_uint16_with_scale_offset.tif"); + } + + @Test + public void int16() throws Exception { + probe("test_vgrid_int16.tif"); + } + + /** {@code float64}, which PROJ narrows to {@code float} on the way out — and so must we. */ + @Test + public void float64() throws Exception { + probe("test_vgrid_float64.tif"); + } + + @Test + public void bigEndianClassicTiff() throws Exception { + probe("test_vgrid_bigendian.tif"); + } + + @Test + public void littleEndianBigTiff() throws Exception { + probe("test_vgrid_bigtiff.tif"); + } + + @Test + public void bigEndianBigTiff() throws Exception { + probe("test_vgrid_bigendian_bigtiff.tif"); + } + + /** A negative {@code GeoPixelScale[1]}: the first image row is the southernmost. */ + @Test + public void bottomUpFromNegativeScale() throws Exception { + probe("test_vgrid_bottomup_with_scale.tif"); + } + + /** + * The same bottom-up geometry expressed as a {@code GeoTransformationMatrix}, which is what GDAL + * emits because negative pixel scales have historically been treated as writer bugs. + */ + @Test + public void bottomUpFromTransformationMatrix() throws Exception { + probe("test_vgrid_bottomup_with_matrix.tif"); + } + + /** + * A second IFD carrying a reduced-resolution overview ({@code SubfileType=1}). It must be ignored; + * interpolating it instead would give a plausible, wrong answer from half-resolution data. + */ + @Test + public void overviewIfdIsIgnored() throws Exception { + probe("test_vgrid_with_overview.tif"); + } + + /** The shift lives in band 1, identified by {@code DESCRIPTION="geoid_undulation"}. */ + @Test + public void shiftInSecondChannel() throws Exception { + probe("test_vgrid_in_second_channel.tif"); + } + + /** + * {@code GDAL_NODATA = -88.8888}. The interesting part is that the GeoTIFF nodata rule is + * only the declared sentinel plus NaN, whereas GTX also treats any magnitude beyond 1000 + * as nodata. Both rules would pass this row; only the GeoTIFF rule is correct for a GeoTIFF, and + * {@link #nodataRuleIsGeoTiffsNotGtxs} pins the difference. + */ + @Test + public void nodataRenormalisation() throws Exception { + assertEquals(10.0, valueAt("test_vgrid_nodata.tif", 4.05, 52.1), GeoTiffFixtures.TOL); + } + + /** + * A GeoTIFF value of 1500 m is data, not nodata. GTX's rule + * ({@code |value| > 1000}) would discard it; {@code GTiffGrid::isNodata} does not. + * + *

Asserted through the grid the reader actually builds, rather than by reflecting on a flag: + * {@code test_vgrid_with_subgrid.tif}'s subgrid holds values around 110 with one node at 1100, and + * the value PROJ reports at (5.5, 53.5) is exactly 110 — which it could not be if a magnitude + * heuristic were voiding nodes. The direct statement of the rule is the node read below: nothing in + * the grid is treated as nodata, because the file declares no {@code GDAL_NODATA} at all. + */ + @Test + public void nodataRuleIsGeoTiffsNotGtxs() throws Exception { + VerticalGrid grid = VerticalGrid.fromName("test_vgrid_with_subgrid.tif"); + assertEquals("gtiff", grid.getFormat()); + assertEquals("the file declares no GDAL_NODATA, so every node is data", + 110.0, grid.valueAt(5.5 * D2R, 53.5 * D2R, 1.0), GeoTiffFixtures.TOL); + } + + /** + * A subgrid in a second IFD, discovered purely from spatial extent (no {@code grid_name} + * metadata). At (4.5, 52.5) the parent applies; at (5.5, 53.5) the finer child does, and the two + * differ by an order of magnitude, so using the parent everywhere is not a near miss. + */ + @Test + public void subgridIsSelectedByExtent() throws Exception { + VerticalGrid grid = VerticalGrid.fromName("test_vgrid_with_subgrid.tif"); + assertEquals("the file has one top grid with one child", 2, grid.countGrids()); + assertEquals(1, grid.getSubGrids().size()); + assertEquals(11.5, grid.valueAt(4.5 * D2R, 52.5 * D2R, 1.0), GeoTiffFixtures.TOL); + assertEquals(110.0, grid.valueAt(5.5 * D2R, 53.5 * D2R, 1.0), GeoTiffFixtures.TOL); + } + + /** + * {@code DESCRIPTION="hydroid_height"} — one of the four band descriptions upstream accepts, and + * the only one of them exercised by a real fixture. The value is pinned to twelve decimals because + * it is a genuine interpolation rather than a round number. + */ + @Test + public void hydroidHeightDescription() throws Exception { + assertEquals(44.643493652344, valueAt("test_hydroid_height.tif", 2.0, 49.0), + GeoTiffFixtures.TOL); + } + + /** + * The antimeridian, which is where every extent test that looks fine on paper breaks. + * + *

{@code us_noaa_geoid06_ak_subset_at_antimeridian.tif} declares {@code west = 179.8}° and + * {@code east = 180.1833}° — deliberately past π in radians, which PROJ's extent validation + * permits (it bounds {@code |west|} and {@code |east|} by 4π). A point given as + * {@code -179.99}° is inside the grid only after a ±2π shift, so both + * {@code covers()} and the interpolation have to wrap, and they have to wrap consistently: the two + * spellings of the same meridian, {@code 180.1833333} and {@code -179.8166667}, must give the + * same value. + * + *

All six values are {@code cct -d 12} output on these bytes. + */ + @Test + public void antimeridianWrap() throws Exception { + String ak = "us_noaa_geoid06_ak_subset_at_antimeridian.tif"; + assertEquals(-2.222574615478, valueAt(ak, 179.99, 54.5), GeoTiffFixtures.TOL); + assertEquals(-2.348757028579, valueAt(ak, -179.99, 54.5), GeoTiffFixtures.TOL); + assertEquals(-2.287227840366, valueAt(ak, 179.999999, 54.5), GeoTiffFixtures.TOL); + assertEquals(-2.287240458607, valueAt(ak, -179.999999, 54.5), GeoTiffFixtures.TOL); + assertEquals(-0.701101899147, valueAt(ak, 179.8, 54.5), GeoTiffFixtures.TOL); + assertEquals(-3.193286294634, valueAt(ak, 180.1833333, 54.5), GeoTiffFixtures.TOL); + assertEquals("the same meridian written two ways must give one value", + valueAt(ak, 180.1833333, 54.5), valueAt(ak, -179.8166667, 54.5), 0.0); + } + + /** + * Just outside the same grid, on both edges and in both longitude conventions. + * + *

These are {@code expect failure errno coord_transfm_outside_grid} rows in + * {@code geotiff_grids.gie}. They are the reason the wrap in {@code covers()} cannot simply be + * "always try both": 179.799° is 0.001° west of the western edge and 180.184° is + * 0.00067° east of the eastern one, both far outside the {@code (resX + resY) * 1e-5} + * tolerance, and a reader that accepted them would extrapolate off the edge of the data and report + * success. + */ + @Test + public void justOutsideTheAntimeridianGridIsNotCovered() throws Exception { + VerticalGrid grid = + VerticalGrid.fromName("us_noaa_geoid06_ak_subset_at_antimeridian.tif"); + assertFalse("179.799 is west of west=179.8", grid.covers(179.799 * D2R, 54.5 * D2R)); + assertFalse("180.184 is east of east=180.18333", grid.covers(180.184 * D2R, 54.5 * D2R)); + assertFalse("-179.816 is the same meridian as 180.184", + grid.covers(-179.816 * D2R, 54.5 * D2R)); + } + + /** + * GTX must be completely unaffected by any of this. The nodata rule, the subgrid descent and the + * longitude wrap are all carried per grid, and a GTX grid takes the same branch it always took. + */ + @Test + public void gtxIsUnchanged() throws Exception { + VerticalGrid gtx = VerticalGrid.fromName("egm96_15_downsampled.gtx"); + assertEquals("gtx", gtx.getFormat()); + assertEquals("a GTX file has no subgrids", 1, gtx.countGrids()); + assertTrue(gtx.getSubGrids().isEmpty()); + // cct -d 10 +proj=vgridshift +grids=egm96_15_downsampled.gtx +multiplier=1 + assertEquals(17.2340171337, gtx.valueAt(0.0, 0.0, 1.0), 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GridSelectionOrderTest.java b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GridSelectionOrderTest.java new file mode 100644 index 0000000..46e1da5 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/datum/geotiff/GridSelectionOrderTest.java @@ -0,0 +1,222 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.datum.geotiff; + +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Which grid in a {@code +nadgrids=} list gets used, and where its edge is. + * + *

The claim this class settles, and how

+ * + *

It has been asserted in this project's notes that proj4j's grid selection was wrong: that + * with {@code NAD27}'s list {@code @conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat}, a NAD27 point over Ottawa + * got {@code conus} extrapolated past its coverage where PROJ would have used {@code ntv1_can.dat}, + * landing 2.487 m away. That is not what PROJ does. Measured with PROJ 9.8.1 + * ({@code Rel. 9.8.1, April 10th, 2026}) on the same bytes this repository ships: + * + *

+ * cct -d 12 +proj=hgridshift +grids=conus,ntv1_can.dat  <<< "-75.6972 45.4225 0 0"
+ *   -> -75.696903885263  45.422538884313
+ * cct -d 12 +proj=hgridshift +grids=ntv1_can.dat,conus  <<< "-75.6972 45.4225 0 0"
+ *   -> -75.696872210356  45.422551182897
+ * cct -d 12 +proj=hgridshift +grids=conus               <<< "-75.6972 45.4225 0 0"
+ *   -> -75.696903885263  45.422538884313     (bit-identical to the first)
+ * 
+ * + *

So upstream is list order, first grid whose extent contains the point wins — + * {@code findGrid} ({@code grids.cpp:3251-3262}) — which is what proj4j already did. The ~2.5 m is the + * {@code conus}-versus-{@code ntv1_can} data difference inside their overlap, present in PROJ too, and + * reordering the list to "fix" it would move proj4j away from PROJ. {@code conus}'s own header, + * read from the shipped bytes, is 131°W–63°W by 20°N–50°N, which is why it + * reaches Ottawa at all. + * + *

What was genuinely wrong were two tolerances in the same family, and those are the + * substance of this class: + *

    + *
  1. the extent-containment tolerance was {@code 1e-4} where 9.8.1 uses + * {@code REL_TOLERANCE_HGRIDSHIFT = 1e-5} — ten times too permissive, and since containment is + * exactly what selects the grid, ten times too permissive in the one place it changes the + * answer;
  2. + *
  3. the grid-edge clamp window in {@code nad_intr} was {@code 1e-11} where 9.8.1 uses + * {@code 10 * REL_TOLERANCE_HGRIDSHIFT = 1e-4} — seven orders of magnitude too tight, so points + * PROJ shifts were left unshifted;
  4. + *
  5. and there was no antimeridian handling at all, which makes {@code us_noaa_alaska.tif} + * ({@code west = -194}°) unusable over its western half.
  6. + *
+ * + *

This class lives in the GeoTIFF test package because the GeoTIFF reader is what made the third + * point urgent — it is the format the shifted-longitude-window grids are published in. + */ +public class GridSelectionOrderTest { + + /** Ottawa. Inside {@code conus} (which reaches 50°N) and inside {@code ntv1_can.dat}. */ + private static final double OTTAWA_LON = -75.6972; + private static final double OTTAWA_LAT = 45.4225; + + /** {@code cct +proj=hgridshift +grids=conus} at Ottawa. */ + private static final double[] CONUS_AT_OTTAWA = {-75.696903885263, 45.422538884313}; + + /** {@code cct +proj=hgridshift +grids=ntv1_can.dat} at Ottawa. */ + private static final double[] NTV1_AT_OTTAWA = {-75.696872210356, 45.422551182897}; + + /** + * The first grid in the list that contains the point wins, and the second grid never runs — for both + * orderings, so this is a statement about order and not about which file happens to be better. + */ + @Test + public void firstGridInListOrderWins() throws Exception { + List conusFirst = Grid.fromNadGrids("conus,ntv1_can.dat"); + double[] a = GeoTiffFixtures.shiftDegrees(conusFirst, false, OTTAWA_LON, OTTAWA_LAT); + assertEquals("conus first must give conus's answer", CONUS_AT_OTTAWA[0], a[0], 1e-9); + assertEquals(CONUS_AT_OTTAWA[1], a[1], 1e-9); + + List ntv1First = Grid.fromNadGrids("ntv1_can.dat,conus"); + double[] b = GeoTiffFixtures.shiftDegrees(ntv1First, false, OTTAWA_LON, OTTAWA_LAT); + assertEquals("ntv1_can.dat first must give its answer", NTV1_AT_OTTAWA[0], b[0], 1e-9); + assertEquals(NTV1_AT_OTTAWA[1], b[1], 1e-9); + + assertTrue("the two grids must actually disagree, or this test proves nothing", + Math.abs(a[0] - b[0]) > 1e-7); + } + + /** + * A grid whose bounding box contains the point but whose interpolation refuses it must not be + * skipped in favour of a coarser grid silently — but the legacy API's documented behaviour + * is to fall through, so this test pins the current contract rather than asserting a change. + * + *

Stated explicitly because it is the one place proj4j is still more permissive than 9.8.1: + * PROJ's {@code pj_hgrid_apply} commits to the grid {@code findGrid} chose and reports + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID}, whereas {@code Grid.shift} continues its loop. With + * the containment tolerance now matching upstream the window in which the two differ is at most one + * clamp width wide, but it is not empty. + */ + @Test + public void fallThroughToTheNextGridIsStillTheLegacyBehaviour() throws Exception { + List grids = Grid.fromNadGrids("conus,ntv1_can.dat"); + // A point conus contains and ntv1_can.dat does not: south of 40 degrees N. + double[] sf = GeoTiffFixtures.shiftDegrees(grids, false, -122.416667, 37.783333); + assertTrue("San Francisco must be shifted by conus", Math.abs(sf[0] + 122.416667) > 1e-6); + } + + /** + * The containment tolerance, pinned by a point that discriminates {@code 1e-5} from {@code 1e-4}. + * + *

{@code conus} has 0.25° cells, so {@code eps = (resX + resY) * REL_TOLERANCE} is + * {@code 5e-6}° under 9.8.1 and {@code 5e-5}° under 1.4.3. Its south edge is 20°N. + * Measured with {@code cct +proj=hgridshift +grids=conus}: + *

    + *
  • {@code (-100, 19.999999)} — {@code 1e-6}° out, inside both tolerances — PROJ returns + * {@code -100.000014233333 20.000382961118};
  • + *
  • {@code (-100, 19.99998)} — {@code 2e-5}° out, inside 1.4.3's tolerance and outside + * 9.8.1's — PROJ returns {@code TRANSFORMATION ERROR}.
  • + *
+ * The second row is the whole test: under the old tolerance proj4j accepted the point and + * extrapolated a shift for it. + */ + @Test + public void containmentToleranceMatches9_8_1() throws Exception { + List conus = Grid.fromNadGrids("conus"); + + double[] justInside = GeoTiffFixtures.shiftDegrees(conus, false, -100.0, 19.999999); + assertEquals("1e-6 deg outside the south edge is still inside 9.8.1's tolerance", + -100.000014233333, justInside[0], 1e-9); + assertEquals(20.000382961118, justInside[1], 1e-9); + + try { + double[] justOutside = GeoTiffFixtures.shiftDegrees(conus, false, -100.0, 19.99998); + fail("2e-5 deg outside the south edge is outside 9.8.1's tolerance, which reports " + + "TRANSFORMATION ERROR; shift returned (" + + justOutside[0] + ", " + justOutside[1] + ")"); + } catch (CrsTransformException expected) { + // Was: "the legacy API leaves the coordinate alone". It no longer does -- an unchanged + // coordinate is indistinguishable from a zero shift, and upstream errors here. + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } + + /** + * A grid declared in a shifted longitude window. The NADCON 5 Alaska extract's tie point is + * {@code 201.583}°, i.e. past π in radians — the same situation as + * {@code us_noaa_alaska.tif}'s {@code west = -194}°. + * + *

Both spellings of the meridian must select the grid and apply the same shift. + * {@code cct -d 12} on these bytes returns {@code -157.999999611484 61.499999564269} for + * both {@code -158.0} and {@code 202.0} — it normalises the output longitude, which + * {@code Grid.shift}'s forward branch does not (it is a bare {@code in.lam -= t.lam}, matching + * PROJ's {@code in.lam += t.lam}). So the comparison here is on the shift, which is the + * claim: that the grid was found from either convention and the same displacement came out of it. + */ + @Test + public void shiftedLongitudeWindowIsFoundFromBothConventions() throws Exception { + List grids = GeoTiffFixtures.horizontal( + "us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif"); + double[] negative = GeoTiffFixtures.shiftDegrees(grids, false, -158.0, 61.5); + double[] positive = GeoTiffFixtures.shiftDegrees(grids, false, 202.0, 61.5); + assertEquals(-157.999999611484, negative[0], 1e-11); + assertEquals(61.499999564269, negative[1], 1e-11); + assertEquals("202 E and 158 W must yield the same longitude shift", + negative[0] - (-158.0), positive[0] - 202.0, 1e-13); + assertEquals("and the same latitude shift", negative[1], positive[1], 1e-13); + } + + /** + * A grid spanning the whole world in longitude accepts every meridian, including the seam. + * + *

{@code test_hgrid_tiled.tif} is 360 cells of 1° from 180°W, so + * {@code east - west + resX} is exactly 2π and {@code fullWorldLongitude()} short-circuits the + * east/west test. The seam is where a plain box test fails: {@code -180} is the western edge and + * {@code 179} the eastern one, so a naive reader rejects everything in between. + * + *

Measured: {@code cct} shifts {@code (-180, 0.5)} and {@code (-179.999, 0.5)} but reports + * {@code TRANSFORMATION ERROR} at {@code (179.5, 0.5)} and {@code (179.999, 0.5)} — the extent test + * accepts those, and then the interpolation refuses them because they are more than a clamp width + * past the last node. proj4j now says the same thing: this is the + * contained-but-uninterpolable shape of {@link ErrorCause#COORDINATE_OUTSIDE_GRID}, the + * one reachable only after the fall-through has exhausted the list. It used to leave the + * coordinate alone. + */ + @Test + public void fullWorldLongitudeAcceptsTheSeam() throws Exception { + List grids = GeoTiffFixtures.horizontal("test_hgrid_tiled.tif"); + double[] e = grids.get(0).extentRadians(); + assertEquals(-180.0, Math.toDegrees(e[0]), 1e-12); + assertEquals(179.0, Math.toDegrees(e[2]), 1e-12); + + double[] atWest = GeoTiffFixtures.shiftDegrees(grids, false, -180.0, 0.5); + assertTrue("the western edge must be inside", Double.isFinite(atWest[0])); + + try { + double[] pastEast = GeoTiffFixtures.shiftDegrees(grids, false, 179.5, 0.5); + fail("179.5 is inside the extent but past the last node; PROJ reports TRANSFORMATION " + + "ERROR and shift returned (" + pastEast[0] + ", " + pastEast[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + assertTrue("the message must distinguish this from 'no grid covers it': " + + expected.getMessage(), + expected.getMessage().contains("inside the extent of a grid")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/determinism/GenerateStrictMathGoldenTable.java b/core/src/test/java/org/locationtech/proj4j/determinism/GenerateStrictMathGoldenTable.java new file mode 100644 index 0000000..d0ea2f7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/determinism/GenerateStrictMathGoldenTable.java @@ -0,0 +1,179 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.determinism; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; + +/** + * Writes the committed golden table that {@link StrictMathGoldenTableTest} asserts against. + * + *

Run only when the probe set in {@link TranscendentalProbes} changes, and never to make a + * failing test pass. A regenerated table is a new claim about what the reference bits are, and the + * only thing that makes that claim worth anything is that several independent implementations agree + * on it. Regeneration procedure, in full: + * + *

+ * mvn -B -Dmaven.repo.local=/tmp/m2-det -pl core -am install -DskipTests -Dmaven.javadoc.skip=true
+ * java -cp core/target/classes:core/target/test-classes \
+ *      org.locationtech.proj4j.determinism.GenerateStrictMathGoldenTable \
+ *      core/src/test/resources/org/locationtech/proj4j/determinism/strictmath-golden.tsv
+ * 
+ * + *

Then re-run {@link StrictMathGoldenTableTest} on at least one JDK where + * {@code StrictMath.sin} is native (8 or 11 - check with reflection, do not assume) and one + * where it is pure Java (17+), and on both x86-64 and AArch64. If any of those disagree, the + * regenerated table is wrong and the disagreement is the finding. + * + *

Why the table is committed at all, rather than compared leg-to-leg in CI

+ * + *

Both, in fact - see {@code .github/workflows/determinism.yaml}. But the committed table is the + * stronger half, for a reason worth stating: a leg-to-leg comparison proves only that two runners + * agreed today. A committed table also pins the answer across time, so a JDK upgrade that + * silently changes a transcendental is caught by the ordinary build rather than by a matrix that + * someone has to remember to keep. It is affordable here only because + * {@code StrictMath}'s results are specified rather than platform-dependent; the same trick would be + * unsound for {@code Math}. + */ +public final class GenerateStrictMathGoldenTable { + + private GenerateStrictMathGoldenTable() { + } + + /** The resource path the test loads, relative to the classpath root. */ + static final String RESOURCE = "org/locationtech/proj4j/determinism/strictmath-golden.tsv"; + + /** + * Writes the table. + * + * @param args a single element, the output file path + * @throws IOException if the file cannot be written + */ + public static void main(String[] args) throws IOException { + if (args.length != 1) { + System.err.println("usage: GenerateStrictMathGoldenTable "); + System.exit(2); + } + File out = new File(args[0]); + File parent = out.getParentFile(); + if (parent != null && !parent.isDirectory() && !parent.mkdirs()) { + throw new IOException("cannot create " + parent); + } + int rows; + Writer w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out), "UTF-8")); + try { + rows = write(w); + } finally { + w.close(); + } + System.out.printf("wrote %d rows to %s%n", Integer.valueOf(rows), out.getPath()); + System.out.printf("generated on java.version=%s os.arch=%s%n", + System.getProperty("java.version"), System.getProperty("os.arch")); + } + + /** + * Writes every row. + * + * @param w the destination + * @return the number of data rows written + * @throws IOException if writing fails + */ + static int write(Writer w) throws IOException { + // No generation timestamp and no JDK version in the file: either would make the table churn + // on every regeneration and turn a meaningful diff into noise. Provenance belongs in the + // commit message, which is versioned anyway. + // + // FORMAT. One '@ ' line, then lines of 16 hex digits - the raw bits of + // StrictMath. applied to TranscendentalProbes' i'th probe for that function, in order. + // + // Arguments are deliberately NOT stored. Storing them was the first design and it made the + // file 10.5 MB, but the decisive objection is not size: a stored argument is a second source + // of truth that can disagree with TranscendentalProbes, and if it ever did, the table would + // describe inputs nobody evaluates while still passing. Regenerating the arguments from the + // same code the test uses makes that class of drift impossible rather than merely detected. + // The count line is what catches truncation and any change to the probe set. + w.write("# proj4j StrictMath golden table.\n"); + w.write("#\n"); + w.write("# Each data line is the raw IEEE-754 bits of a StrictMath result, 16 lower-case hex\n"); + w.write("# digits, unsigned. Arguments are NOT stored: they are regenerated by\n"); + w.write("# TranscendentalProbes, which is the single source of truth for them. A '@fn n'\n"); + w.write("# line introduces n results for that function, in probe order, and carries a digest\n"); + w.write("# of that function's argument bits so a probe list that generates DIFFERENT\n"); + w.write("# arguments on some JDK fails once, saying so, instead of as a flood of result\n"); + w.write("# mismatches naming plausible-looking arguments. That is not hypothetical: building\n"); + w.write("# the probes with Math.toRadians made the list differ on Java 8, because Java 9\n"); + w.write("# changed that method by 1 ulp on 25% of whole degrees.\n"); + w.write("#\n"); + w.write("# This table is only meaningful because StrictMath is specified to a bit rather than\n"); + w.write("# to an ulp. The same table would be unsound for Math, whose results HotSpot may\n"); + w.write("# substitute per architecture - which is the divergence StrictMathGoldenTableTest's\n"); + w.write("# negative control measures.\n"); + w.write("#\n"); + w.write("# Regenerate with GenerateStrictMathGoldenTable. Read its javadoc first: a\n"); + w.write("# regenerated table is a new claim, and never a way to make a failing test pass.\n"); + int rows = 0; + for (int f = 0; f < TranscendentalProbes.UNARY.length; f++) { + String fn = TranscendentalProbes.UNARY[f]; + double[] xs = TranscendentalProbes.unaryProbes(fn); + w.write("@" + fn + " " + xs.length + " " + + hex(TranscendentalProbes.digest(xs)) + "\n"); + for (int i = 0; i < xs.length; i++) { + w.write(hex(Double.doubleToRawLongBits( + TranscendentalProbes.strictUnary(fn, xs[i])))); + w.write('\n'); + rows++; + } + } + double[] pairs = TranscendentalProbes.binaryProbes(); + for (int f = 0; f < TranscendentalProbes.BINARY.length; f++) { + String fn = TranscendentalProbes.BINARY[f]; + w.write("@" + fn + " " + (pairs.length / 2) + " " + + hex(TranscendentalProbes.digest(pairs)) + "\n"); + for (int i = 0; i + 1 < pairs.length; i += 2) { + w.write(hex(Double.doubleToRawLongBits( + TranscendentalProbes.strictBinary(fn, pairs[i], pairs[i + 1])))); + w.write('\n'); + rows++; + } + } + return rows; + } + + /** + * Formats a raw bit pattern. + * + * @param bits the raw bits + * @return a fixed-width unsigned 16-digit hex string + */ + static String hex(long bits) { + // Fixed width, no 0x prefix, lower case: the file is diffed and sorted by tools, so a + // variable-width field would make column alignment depend on the value. + String s = Long.toHexString(bits); + if (s.length() == 16) { + return s; + } + StringBuilder sb = new StringBuilder(16); + for (int i = s.length(); i < 16; i++) { + sb.append('0'); + } + return sb.append(s).toString(); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/determinism/NanBitPatternTest.java b/core/src/test/java/org/locationtech/proj4j/determinism/NanBitPatternTest.java new file mode 100644 index 0000000..343d2fc --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/determinism/NanBitPatternTest.java @@ -0,0 +1,257 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.determinism; + +import org.junit.Test; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +/** + * Records the one measured exception to proj4j's bit-for-bit determinism guarantee: the sign and + * payload of an arithmetically-produced NaN are architecture-dependent. + * + *

The measurement

+ * + *

Taken with the JDK held fixed at Temurin 11.0.32 and only the instruction set varied, so the + * result is attributable to the architecture and not to a JDK difference: + * + * + * + * + * + * + * + * + * + * + * + * + *
raw bits of the result, Temurin 11.0.32
expressionx86-64AArch64
{@code Inf - Inf}{@code 0xfff8000000000000}{@code 0x7ff8000000000000}
{@code Inf * 0.0}{@code 0xfff8000000000000}{@code 0x7ff8000000000000}
{@code Inf / Inf}{@code 0xfff8000000000000}{@code 0x7ff8000000000000}
{@code Math.sqrt(-1.0)}{@code 0xfff8000000000000}{@code 0x7ff8000000000000}
{@code StrictMath.sin(Inf)}{@code 0xfff8000000000000}{@code 0x7ff8000000000000}
{@code StrictMath.asin(2.0)}{@code 0xfff8000000000000}{@code 0x7ff8000000000000}
{@code 0.0 / 0.0}{@code 0x7ff8000000000000}{@code 0x7ff8000000000000}
{@code Double.NaN} (the constant){@code 0x7ff8000000000000}{@code 0x7ff8000000000000}
+ * + *

x86-64's default NaN - Intel calls it the "real indefinite" - has the sign bit set; AArch64's + * does not. The JLS specifies only that these expressions yield a NaN. And note the two rows + * that agree: {@code 0.0/0.0} is constant-folded by javac into the canonical + * {@code Double.NaN}, so the divergence is not even uniform within one architecture, which is a good + * reason not to reason about it from first principles. + * + *

One further observation, recorded because it is worse than the above rather than better: on + * Temurin 21/AArch64 {@code Math.sin(Infinity)} returns {@code 0x7ff0000000000001} - a NaN that is + * not the canonical quiet NaN at all. So the intrinsic produces a third distinct pattern. Nothing on + * proj4j's transform path may call {@code Math.sin}, but it is worth knowing that "it is just the + * sign bit" would be an understatement. + * + *

Why this matters here rather than being a curiosity

+ * + *

Three places in this project state or rely on a raw-bit comparison, and each needs the carve-out + * spelled out or it will produce a false failure the first time it runs on a second architecture: + * + *

    + *
  1. The fail-closed sentinel policy. A failed point has {@code NaN} written to + * every output ordinate, deliberately. So the outputs most likely to be NaN are + * exactly the ones a golden table records for error rows - and those cannot be compared on raw + * bits across architectures.
  2. + *
  3. Correctness gate B ("fast-path vs general-path, bitwise, on + * {@code Double.doubleToRawLongBits}, so NaN payloads and {@code +/-0.0} are distinguished"). + * Within one JVM that is exactly right and should not be weakened. Across architectures the + * NaN half of it is not satisfiable.
  4. + *
  5. The shared-transform concurrency test, which asserts raw-bit identity precisely + * because a tolerance assertion would pass through a torn double. Also correct, and also + * single-JVM, so unaffected - but the reason it is unaffected should be on the record rather + * than left to luck.
  6. + *
+ * + *

The {@code +/-0.0} half of gate B is not affected and must not be relaxed along with the + * NaN half: signed zero is fully specified by IEEE-754 and is architecture-independent. It is a real + * distinction at the equator and the antimeridian, and this test asserts it stays one. + * + *

What this test asserts

+ * + *

Not that the divergence exists - that would fail on whichever architecture happens to be the + * majority. It asserts the properties proj4j actually depends on: that NaN is recognisable as + * NaN however it was produced, that signed zero is exact, and that the {@code dx - dx != 0.0} + * non-finite test used in the bulk inner loop behaves identically for every NaN payload. Then it + * writes this JVM's table to {@code target/determinism/} so the CI matrix can diff the architectures + * and show the difference rather than assert it from one side. + */ +public class NanBitPatternTest { + + /** The expressions whose NaN bit pattern is recorded. Names are stable; CI diffs on them. */ + private static String[] names() { + return new String[]{ + "Double.NaN", "inf-inf", "(-inf)-(-inf)", "inf*0.0", "0.0/0.0", "inf/inf", + "Math.sqrt(-1)", "StrictMath.sqrt(-1)", + "StrictMath.sin(inf)", "StrictMath.cos(inf)", "StrictMath.tan(inf)", + "StrictMath.asin(2)", "StrictMath.acos(2)", "StrictMath.log(-1)", + "StrictMath.log1p(-2)", "StrictMath.pow(-1,0.5)", + "org.locationtech.proj4j.util.FastStrictTrig.sin(inf)", + "org.locationtech.proj4j.util.FastStrictTrig.cos(inf)", + "org.locationtech.proj4j.util.FastStrictTrig.tan(inf)", + }; + } + + private static double[] values() { + double inf = Double.POSITIVE_INFINITY; + return new double[]{ + Double.NaN, inf - inf, (-inf) - (-inf), inf * 0.0, 0.0 / 0.0, inf / inf, + Math.sqrt(-1.0), StrictMath.sqrt(-1.0), + StrictMath.sin(inf), StrictMath.cos(inf), StrictMath.tan(inf), + StrictMath.asin(2.0), StrictMath.acos(2.0), StrictMath.log(-1.0), + StrictMath.log1p(-2.0), StrictMath.pow(-1.0, 0.5), + org.locationtech.proj4j.util.FastStrictTrig.sin(inf), + org.locationtech.proj4j.util.FastStrictTrig.cos(inf), + org.locationtech.proj4j.util.FastStrictTrig.tan(inf), + }; + } + + /** + * Prints and records this JVM's NaN bit patterns, and asserts every one of them really is NaN. + * + * @throws IOException if the table cannot be written + */ + @Test + public void recordThisArchitecturesNanBitPatterns() throws IOException { + String[] names = names(); + double[] vs = values(); + assertEquals("names and values must line up", names.length, vs.length); + + StringBuilder human = new StringBuilder(String.format( + "determinism NaN patterns on java.version=%s os.arch=%s:%n", + System.getProperty("java.version"), System.getProperty("os.arch"))); + StringBuilder tsv = new StringBuilder(); + tsv.append("# NaN bit patterns. Architecture-dependent BY DESIGN of the hardware - the JLS\n"); + tsv.append("# specifies only that these yield a NaN, not which one. Recorded per CI leg so\n"); + tsv.append("# the difference can be shown rather than asserted from one architecture.\n"); + tsv.append("javaVersion\t").append(System.getProperty("java.version")).append('\n'); + tsv.append("osArch\t").append(System.getProperty("os.arch")).append('\n'); + tsv.append("expression\trawbits\n"); + int distinct = 0; + long first = Double.doubleToRawLongBits(vs[0]); + for (int i = 0; i < names.length; i++) { + long bits = Double.doubleToRawLongBits(vs[i]); + human.append(String.format(" %-52s 0x%016x%n", names[i], Long.valueOf(bits))); + tsv.append(names[i]).append('\t').append(String.format("%016x", Long.valueOf(bits))) + .append('\n'); + if (bits != first) { + distinct++; + } + assertTrue(names[i] + " must be NaN, got 0x" + Long.toHexString(bits), + Double.isNaN(vs[i])); + } + human.append(" (").append(distinct).append(" of ").append(names.length) + .append(" differ from Double.NaN's canonical pattern on this architecture)\n"); + System.out.print(human); + + File dir = new File(System.getProperty("proj4j.determinism.outDir", "target/determinism")); + if (dir.isDirectory() || dir.mkdirs()) { + Writer w = new OutputStreamWriter( + new FileOutputStream(new File(dir, "nan-patterns.tsv")), "UTF-8"); + try { + w.write(tsv.toString()); + } finally { + w.close(); + } + } else { + System.out.println("determinism: could not create " + dir + + "; the table above is still the record"); + } + } + + /** + * Signed zero is architecture-independent, and must stay part of the raw-bit guarantee. + * + *

Stated separately from the NaN carve-out on purpose. The two look alike - both are "an + * IEEE-754 special case that a naive {@code ==} comparison mishandles" - and the temptation when + * relaxing one is to relax both. But signed zero is fully specified: {@code -0.0} has exactly one + * bit pattern, {@code 0.0 == -0.0} is true while their raw bits differ, and every architecture + * agrees. Losing that distinction would lose a real one: a point on the equator or the + * antimeridian can legitimately carry {@code -0.0}, and correctness gate B exists partly to + * notice when a refactor silently normalises it away. + */ + @Test + public void signedZeroIsExactAndMustNotBeRelaxedAlongWithNaN() { + assertEquals("+0.0 has one canonical pattern", + 0x0000000000000000L, Double.doubleToRawLongBits(0.0)); + assertEquals("-0.0 has one canonical pattern", + 0x8000000000000000L, Double.doubleToRawLongBits(-0.0)); + assertTrue("0.0 == -0.0 under ==, which is why a raw-bit comparison is needed at all", + 0.0 == -0.0); + assertTrue("their raw bits differ, which is the distinction being preserved", + Double.doubleToRawLongBits(0.0) != Double.doubleToRawLongBits(-0.0)); + // Produced by arithmetic rather than written as a literal, since that is how a transform + // would arrive at it - and unlike NaN, the sign here is specified. + assertEquals("-1.0 * 0.0 must be -0.0 exactly", + 0x8000000000000000L, Double.doubleToRawLongBits(-1.0 * 0.0)); + assertEquals("0.0 / -1.0 must be -0.0 exactly", + 0x8000000000000000L, Double.doubleToRawLongBits(0.0 / -1.0)); + assertEquals("StrictMath.sin(-0.0) must preserve the sign", + 0x8000000000000000L, Double.doubleToRawLongBits(StrictMath.sin(-0.0))); + assertEquals("FastStrictTrig.sin(-0.0) must preserve it too", + 0x8000000000000000L, + Double.doubleToRawLongBits(org.locationtech.proj4j.util.FastStrictTrig.sin(-0.0))); + } + + /** + * The {@code dx - dx != 0.0} non-finite test behaves identically for every NaN payload. + * + *

This is the idiom the bulk inner loop uses instead of {@code !Double.isFinite(dx)} - one + * floating-point operation, no method call, no bit extraction. Because the payload of a NaN + * reaching that loop is architecture-dependent, it is worth having on the record that the test + * itself is not: the guard is exact for a canonical quiet NaN, a signalling NaN, a negative NaN + * and the x86 default NaN alike. + */ + @Test + public void theNonFiniteGuardIsPayloadIndependent() { + long[] payloads = { + 0x7ff8000000000000L, // canonical quiet NaN, and AArch64's default + 0xfff8000000000000L, // x86-64's default NaN + 0x7ff0000000000001L, // signalling NaN, minimum payload - JDK 21 Math.sin(inf) + 0xfff0000000000001L, // negative signalling NaN + 0x7fffffffffffffffL, // maximum payload + 0xffffffffffffffffL, + }; + for (int i = 0; i < payloads.length; i++) { + double dx = Double.longBitsToDouble(payloads[i]); + assertTrue("0x" + Long.toHexString(payloads[i]) + " must be NaN", Double.isNaN(dx)); + assertTrue("the dx - dx != 0.0 guard must reject NaN payload 0x" + + Long.toHexString(payloads[i]), dx - dx != 0.0); + assertEquals("the guard must agree with !isFinite for payload 0x" + + Long.toHexString(payloads[i]), + Boolean.valueOf(!isFinite(dx)), Boolean.valueOf(dx - dx != 0.0)); + } + // And the finite/infinite cases, so the guard is checked in both directions. + double[] finite = {0.0, -0.0, 1.0, -1.0, Double.MIN_VALUE, Double.MAX_VALUE, 6378137.0}; + for (int i = 0; i < finite.length; i++) { + assertTrue(finite[i] + " must pass the guard", finite[i] - finite[i] == 0.0); + } + assertTrue("+Inf must be rejected", + Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY != 0.0); + assertTrue("-Inf must be rejected", + Double.NEGATIVE_INFINITY - Double.NEGATIVE_INFINITY != 0.0); + } + + /** {@code Double.isFinite} is Java 8+, but spelled out here so the intent is explicit. */ + private static boolean isFinite(double d) { + return Math.abs(d) <= Double.MAX_VALUE; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/determinism/NoAmbientLocaleInCoreTest.java b/core/src/test/java/org/locationtech/proj4j/determinism/NoAmbientLocaleInCoreTest.java new file mode 100644 index 0000000..0f751f3 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/determinism/NoAmbientLocaleInCoreTest.java @@ -0,0 +1,1204 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.determinism; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.io.Proj4FileReader; +import org.locationtech.proj4j.units.Unit; +import org.locationtech.proj4j.units.Units; + +/** + * Asserts that no code path in {@code core} depends on the ambient default locale when it is + * handling an identifier, an authority code, a parameter key, a resource name or any other token + * compared against an ASCII literal. {@link Locale#ROOT} is the correct form for all of those. + * + *

The defect this exists to prevent

+ * + *

{@code Proj4FileReader.readParametersFromFile} built its classpath resource name with a + * no-argument {@code authorityCode.toLowerCase()}. Under a Turkish default locale the JDK applies + * the Turkish casing rule, under which {@code 'I'} lower-cases to the dotless {@code 'ı'} + * (U+0131) rather than to ASCII {@code 'i'}. {@code "ESRI"} therefore became {@code "esrı"}, the + * lookup for {@code proj4/nad/esri} never resolved, and every ESRI-authority definition + * became unreachable with {@code Unable to access CRS file: proj4/nad/esrı}. On the {@code tr_TR} + * determinism leg that single call site produced 5 errors across + * {@code CoordinateTransformTest} and {@code MetaCRSTest}. + * + *

What was measured, on Temurin 21

+ * + *

Every classification rule below is measured rather than assumed, because two of the four + * plausible guesses are wrong: + * + * + * + * + * + * + * + * + * + * + * + *
Locale sensitivity of the constructs this scan classifies
constructen_USde_DE / tr_TRlt_LTar_EG
{@code "ESRI".toLowerCase()}esritr: esrıesriesri
{@code "id".toUpperCase()}IDtr: İDIDID
{@code Character.toLowerCase('I')}iiii
{@code String.format("%f", 1.5)}1.5000001,5000001,500000١٫٥...
{@code String.format("%d", 12345)}123451234512345١٢٣٤٥
{@code String.format("%08X", 48879)}0000BEEF0000BEEF0000BEEF0000BEEF
{@code NumberFormat.getNumberInstance().parse("1.5")}1.51511
+ * + *

Three conclusions, and the second and third are the ones that keep this scan from being + * either vacuous or a churn machine: + * + *

    + *
  1. {@code Character.toLowerCase(char)} and {@code Character.toUpperCase(char)} are + * locale-invariant. They have no {@code Locale} overload and apply the Unicode default case + * mapping, so the four call sites in {@code core} that use them for parsing -- {@code Angle}, + * {@code AngleFormat}, {@code WktNames}, {@code CrsDefinitions} -- are already safe and + * rewriting them would be pure churn. The scan classifies them benign and counts them, + * so if that classification ever silently stops matching, the discrimination assertion fails.
  2. + *
  3. Not every {@code String.format} is locale-sensitive. {@code %x}, {@code %X}, + * {@code %o}, {@code %s} and {@code %c} are invariant even under {@code ar_EG}, measured above; + * {@code %d} is not, and {@code %f}/{@code %e}/{@code %g} are not. So the rule keys on + * the conversion characters actually present in the format literal, not on the mere absence of + * a {@code Locale} first argument. Four of core's six {@code String.format} calls are + * hex-or-string only and are correctly left alone.
  4. + *
  5. Display and parsing pull in opposite directions. A number rendered for a human may + * legitimately follow the default locale; a number read back out of a CRS definition may not. + * {@link Unit} now holds both: a default-locale {@code format} for display and a + * {@code Locale.ROOT} one for {@link Unit#parse(String)}. The three deliberately + * default-locale formatters are in {@link #ALLOWED} with their reason, and the allow-list is + * itself asserted to be fully reached, so a stale entry is a failure rather than a silent + * widening.
  6. + *
+ * + *

Why this test can fail

+ * + *

A scan that cannot fail is worthless and its failure mode is silent, so the detector's + * sensitivity is proven four ways rather than assumed, following the shape of the sibling + * {@link NoJdkAngleConversionTest}: + * + *

    + *
  • {@link #classifierDistinguishesAmbientFromPinnedAndInvariant()} feeds the classifier crafted + * lines of every kind and asserts each verdict.
  • + *
  • {@link #theScanReachesTheFileTheDefectWasIn()} asserts the walk actually reached + * {@code io/Proj4FileReader.java} and saw a pinned conversion there. If the walk silently + * reached nothing, the main assertion would pass trivially.
  • + *
  • The main assertion requires non-zero counts in four benign buckets, so a classifier + * that has started rejecting or accepting everything is caught.
  • + *
  • {@link #bytecodeScanFindsBothAritiesAndAgreesWithTheSourceScan()} re-derives the same claim + * from the compiled constant pool -- which distinguishes {@code toLowerCase()} from + * {@code toLowerCase(Locale)} by descriptor, something a text grep over a class file + * cannot do -- and {@link #bytecodeScanDetectsAnInjectedViolation()} feeds it a fabricated + * class file carrying the forbidden methodref, so the zero it reports is proven to be a zero it + * could have failed to report.
  • + *
+ * + *

{@link #theFixedSitesStayFixedUnderATurkishDefaultLocale()} is the behavioural counterpart: + * it runs the real code under {@code tr_TR}, {@code lt_LT} and {@code ar_EG} on every leg, + * so the guarantee no longer depends on CI happening to schedule a Turkish job. + * + *

If the main assertion fails, do not add the offender to {@link #ALLOWED}. Pass + * {@code Locale.ROOT}. + */ +public class NoAmbientLocaleInCoreTest { + + // ------------------------------------------------------------------ the deliberate allow-list + + /** + * The only default-locale formatter constructions permitted in {@code core}, each with the + * reason it is not a defect. Matched as {@code (relative source path, distinctive substring of + * the line)}, so a different ambient-locale construction appearing in the same file is + * still a failure. + * + *

Every entry must be reached -- see {@link #everyAllowListEntryIsStillReached()} -- so an + * entry that has been fixed or deleted fails rather than quietly widening the guard. + */ + private static final String[][] ALLOWED = { + // Display only. Unit.format(double) renders a measurement for a human, and a reader in + // Germany should see a decimal comma. Unit.parse is separately pinned to Locale.ROOT. + {"org/locationtech/proj4j/units/Unit.java", "format = NumberFormat.getNumberInstance()"}, + // Write-only dead state: AngleFormat.format(double, StringBuffer, FieldPosition) appends + // ints and doubles straight to the buffer and never consults this DecimalFormat. Verified + // by grep: the field is touched only by the two setters on the following lines. + {"org/locationtech/proj4j/units/AngleFormat.java", "format = new DecimalFormat()"}, + // Diagnostics only. ProjCoordinate.toShortString() is used in test failure messages; + // ProjCoordinate.toString(), which is the one on real paths, uses Double.toString and is + // locale-independent already. + {"org/locationtech/proj4j/ProjCoordinate.java", "new DecimalFormat(DECIMAL_FORMAT_PATTERN)"}, + }; + + // ------------------------------------------------------------------------------ the needles + + private static final String[] CASE_NEEDLES = {"toLowerCase", "toUpperCase"}; + + private static final String[] FORMAT_NEEDLES = {"String.format", ".printf", ".format("}; + + /** + * Locale-defaulting formatter factories. Matched on the bare method name and then required to + * be qualified by one of {@link #FORMATTER_OWNERS}, because anchoring on {@code + * "NumberFormat.getNumberInstance"} misses the fully-qualified spelling -- which is not a + * hypothetical: the injected-violation control caught exactly that hole, a + * {@code new java.text.DecimalFormat("0.0")} that the first version of this scan waved through. + */ + private static final String[] FORMATTER_FACTORIES = { + "getNumberInstance", "getIntegerInstance", "getPercentInstance", "getCurrencyInstance", + "getInstance", "getDateInstance", "getTimeInstance", "getDateTimeInstance", + }; + + /** {@code getInstance} alone is far too common, so the qualifier is checked. */ + private static final String[] FORMATTER_OWNERS = { + "NumberFormat", "DateFormat", "DecimalFormatSymbols", "Collator", "MessageFormat", + }; + + /** Locale-defaulting formatter constructors, matched however they are qualified. */ + private static final String[] FORMATTER_CONSTRUCTORS = { + "DecimalFormat", "SimpleDateFormat", "DecimalFormatSymbols", "MessageFormat", + }; + + /** + * Conversion characters whose rendering depends on the locale. Measured, not guessed: see the + * table in the class comment. {@code %d} is here because {@code ar_EG} substitutes + * Arabic-Indic digits; {@code %x}/{@code %X}/{@code %o}/{@code %s}/{@code %c} are deliberately + * absent because the same measurement shows they do not. + */ + private static final String LOCALE_SENSITIVE_CONVERSIONS = "deEfgGaAtT"; + + // ------------------------------------------------------------------------------- the guard + + @Test + public void noCoreCodePathDependsOnTheAmbientDefaultLocale() throws IOException { + Scan scan = scanCoreSources(); + + assertTrue("found only " + scan.filesScanned + " core sources to scan under " + + coreSourceRoot() + ", so this test would prove nothing", scan.filesScanned > 100); + + // Four independent discrimination proofs. Each of these buckets is non-empty in the tree as + // it stands, so a classifier that has collapsed to "everything is fine" or "everything is a + // violation" fails here rather than reporting a comfortable zero. + assertTrue("the scan found no Locale.ROOT-pinned case conversions at all; the classifier " + + "has stopped recognising the correct form, so a zero-violation result is " + + "meaningless", scan.pinnedCase > 0); + assertTrue("the scan found no Character.toLowerCase/toUpperCase occurrences; those exist " + + "in core and are locale-invariant by JDK contract, so failing to see them means " + + "the walk or the classifier is broken", scan.invariantCharacterCase > 0); + assertTrue("the scan found no String.format calls whose conversions are all " + + "locale-invariant; core has several, so this bucket being empty means the format " + + "classifier is broken", scan.invariantFormat > 0); + assertTrue("the scan found no Locale-pinned String.format call; PolarCoordinate has one, " + + "so this bucket being empty means the format classifier is broken", + scan.pinnedFormat > 0); + + if (!scan.violations.isEmpty()) { + fail("These call sites depend on the ambient default locale. Under tr_TR the Turkish " + + "casing rule maps 'I' to dotless 'ı' and 'i' to dotted 'İ', so an " + + "identifier, authority code, parameter key or resource name round-tripped " + + "through a no-argument toLowerCase()/toUpperCase() stops matching its ASCII " + + "literal; under de_DE and lt_LT a '%f' or a NumberFormat gains a decimal " + + "comma, and under ar_EG '%d' renders in Arabic-Indic digits. Pass " + + "Locale.ROOT. Do NOT add the site to ALLOWED unless it is genuinely " + + "human-facing text. Offending sites (" + scan.violations.size() + "): " + + scan.violations); + } + } + + /** + * The allow-list is an assertion in its own right: every entry must still correspond to a real + * occurrence. A stale entry means the guard has been silently widened around code that no + * longer exists. + */ + @Test + public void everyAllowListEntryIsStillReached() throws IOException { + Scan scan = scanCoreSources(); + List unreached = new ArrayList(); + for (int i = 0; i < ALLOWED.length; i++) { + String key = ALLOWED[i][0] + " :: " + ALLOWED[i][1]; + if (!scan.allowListHits.contains(key)) { + unreached.add(key); + } + } + assertTrue("these ALLOWED entries matched nothing, so the guard is wider than the code " + + "justifies -- delete them: " + unreached, unreached.isEmpty()); + assertEquals("every ALLOWED entry should have been hit exactly once by the walk", + ALLOWED.length, scan.allowListHits.size()); + } + + // ------------------------------------------------- sensitivity proof 1: reached the target + + /** + * The walk must have reached the file the production defect lived in, and must see the fix + * there. This is the analogue of {@code NoJdkAngleConversionTest} asserting it reached the + * vendored {@code geodesic} package. + */ + @Test + public void theScanReachesTheFileTheDefectWasIn() throws IOException { + Scan scan = scanCoreSources(); + String defectSite = "org/locationtech/proj4j/io/Proj4FileReader.java"; + assertTrue("the walk never reached " + defectSite + ", so its zero-violation verdict for " + + "that file proves nothing; visited " + scan.filesScanned + " files", + scan.filesVisited.contains(defectSite)); + assertTrue("the walk reached " + defectSite + " but saw no Locale-pinned case conversion " + + "in it; the ESRI resource-name fix is the whole reason this test exists", + scan.pinnedCaseFiles.contains(defectSite)); + + // ... and the packages that carry the identifier-handling code, so a build-layout change + // that quietly excluded a source tree cannot pass. + String[] required = { + "org/locationtech/proj4j/io/wkt/WktReader.java", + "org/locationtech/proj4j/io/wkt/WktMethods.java", + "org/locationtech/proj4j/io/wkt/CrsDefinitions.java", + "org/locationtech/proj4j/io/projjson/ProjJsonReader.java", + "org/locationtech/proj4j/units/Unit.java", + }; + for (int i = 0; i < required.length; i++) { + assertTrue("the walk did not reach " + required[i], scan.filesVisited.contains(required[i])); + } + } + + // ------------------------------------------------- sensitivity proof 2: the classifier itself + + @Test + public void classifierDistinguishesAmbientFromPinnedAndInvariant() { + // --- case conversion: the ambient forms are violations. + assertViolation(" String filename = \"proj4/nad/\" + authorityCode.toLowerCase();"); + assertViolation(" String k = node.keyword().toUpperCase();"); + assertViolation(" String n = name.toLowerCase().replace(\"-\", \" \");"); + assertViolation(" return s.toLowerCase() .equals(other);"); + + // --- case conversion: pinned is fine, in both spellings that appear in this tree. + assertBenign(" String lower = gridName.toLowerCase(java.util.Locale.ROOT);"); + assertBenign(" return auth.toUpperCase(Locale.ROOT) + \":\" + code.trim();"); + + // --- Character.toLowerCase/toUpperCase take a char, have no Locale overload and are + // locale-invariant. Measured, not assumed. They must NOT be reported. + assertBenign(" char c = Character.toUpperCase(text.charAt(length-1));"); + assertBenign(" sb.append(Character.toLowerCase(c));"); + assertBenign(" return Character.toUpperCase(s.charAt(0)) + s.substring(1);"); + + // --- String.format: sensitive conversions without a Locale are violations. + assertViolation(" return String.format(\"\", lam, phi);"); + assertViolation(" return String.format(\"%d rows\", n);"); + assertViolation(" out.printf(\"%.3f%n\", value);"); + + // --- String.format: invariant conversions are fine without a Locale. + assertBenign(" return String.format(\"Grid: %s\", id);"); + assertBenign(" return String.format(\"ILP %x:%x\", lam, phi);"); + assertBenign(" throw new Error(String.format(\"wrong count $0%08X $0\", n));"); + assertBenign(" sb.append(String.format(\"\\\\u%04x\", c));"); + // %% is an escaped percent, not a conversion. + assertBenign(" return String.format(\"100%% done\");"); + + // --- String.format: pinned is always fine, whatever the conversions. + assertBenign(" return String.format(Locale.ROOT, \"\", lam, phi);"); + + // --- a format string held in a constant is unreadable to this scan, so it is reported + // rather than waved through. A false negative here would be invisible; a false positive + // is a one-line Locale.ROOT away. + assertViolation(" return String.format(MESSAGE, lam, phi);"); + assertBenign(" return String.format(Locale.ROOT, MESSAGE, lam, phi);"); + // ... but an instance formatter's format() is not a Formatter call and is not judged here. + assertNothingFound(" format.format(projectionLongitude, sb, null);"); + + // --- formatter construction, in every spelling. The fully-qualified constructor is here + // because the first version of this scan missed it and the injected-violation control + // found the hole; anchoring on the literal text "new DecimalFormat" was not enough. + assertViolation(" format = NumberFormat.getNumberInstance();"); + assertViolation(" format = new DecimalFormat(\"0.0###\");"); + assertViolation(" return new java.text.DecimalFormat(\"0.0\").format(1.0);"); + assertViolation(" f = java.text.NumberFormat.getInstance();"); + assertBenign(" PARSE = NumberFormat.getNumberInstance(Locale.ROOT);"); + assertBenign(" f = new DecimalFormat(p, DecimalFormatSymbols.getInstance(Locale.ROOT));"); + // getInstance is far too common a name to flag unqualified. + assertNothingFound(" Calendar c = Calendar.getInstance();"); + // ... and a type whose name merely starts with a formatter's name is not that formatter. + assertNothingFound(" DecimalFormatSymbolsProvider p = lookup();"); + + // --- comments and javadoc are never code, in either direction. + assertNothingFound(" * a no-argument {@code toLowerCase()} on an authority code"); + assertNothingFound(" // s = s.toUpperCase();"); + assertNothingFound(" /* String.format(\"%f\", x) */"); + + // --- a string literal that merely mentions the needle is not a call. + assertNothingFound(" throw new IllegalStateException(\"call toLowerCase(Locale.ROOT)\");"); + + // --- and a line with neither yields nothing at all. + assertNothingFound(" String x = ProjectionMath.toRad(deg) + \"\";"); + } + + private static void assertViolation(String line) { + List found = scan(line, ""); + assertEquals("expected exactly one occurrence in: " + line, 1, found.size()); + assertTrue("should have been classified a violation: " + line, + found.get(0).kind == Kind.VIOLATION); + } + + private static void assertBenign(String line) { + List found = scan(line, ""); + assertTrue("expected at least one occurrence in: " + line, found.size() > 0); + for (int i = 0; i < found.size(); i++) { + assertFalse("should have been classified benign: " + line + " -> " + found.get(i).kind, + found.get(i).kind == Kind.VIOLATION); + } + } + + private static void assertNothingFound(String line) { + assertEquals("expected no occurrence at all in: " + line, 0, scan(line, "").size()); + } + + // ---------------------------------------- sensitivity proof 3: the same claim from bytecode + + /** + * The source scan depends on finding {@code src/main/java} and on a hand-written lexer. This + * leg depends on neither: it parses the compiled constant pool and asks whether any class in + * {@code core} references {@code String.toLowerCase:()Ljava/lang/String;} -- the no-argument + * descriptor. + * + *

A byte-level {@code grep} cannot answer this question: the string {@code toLowerCase} + * appears identically for both arities, and the descriptors live in separate constant-pool + * entries. Parsing is the only instrument that discriminates, which is exactly why the + * positive control below feeds it a fabricated class file rather than trusting it. + */ + @Test + public void bytecodeScanFindsBothAritiesAndAgreesWithTheSourceScan() throws IOException { + File classes = coreClassesDirectory(); + List all = new ArrayList(); + collect(classes, all, ".class"); + assertTrue("found no compiled classes under " + classes, all.size() > 100); + + List ambient = new ArrayList(); + TreeSet pinned = new TreeSet(); + for (int i = 0; i < all.size(); i++) { + File f = all.get(i); + String rel = relative(classes, f).replace(File.separatorChar, '/'); + Set refs = methodRefs(readBytes(f)); + if (refs.contains("java/lang/String.toLowerCase:()Ljava/lang/String;") + || refs.contains("java/lang/String.toUpperCase:()Ljava/lang/String;")) { + ambient.add(rel); + } + if (refs.contains("java/lang/String.toLowerCase:(Ljava/util/Locale;)Ljava/lang/String;") + || refs.contains( + "java/lang/String.toUpperCase:(Ljava/util/Locale;)Ljava/lang/String;")) { + pinned.add(rel); + } + } + + // Positive control that keeps working on its own: the pinned arity must be found, and in + // the class the defect was in. A parser that could not see these methodrefs would report + // zero for both arities and look clean. + assertTrue("the constant-pool parser found no Locale-pinned String case conversion " + + "anywhere in core; it cannot see these methodrefs at all, so its zero for the " + + "ambient arity is meaningless", pinned.size() >= 5); + assertTrue("the constant-pool parser did not find the pinned conversion in Proj4FileReader, " + + "which is the class the ESRI defect was in: " + pinned, + pinned.contains("org/locationtech/proj4j/io/Proj4FileReader.class")); + + assertTrue("these compiled core classes still reference the no-argument " + + "String.toLowerCase()/toUpperCase(), which follows the ambient default locale: " + + ambient, ambient.isEmpty()); + } + + /** + * The injected-violation control, always on. A fabricated class file carrying a + * {@code Methodref} to {@code java/lang/String.toLowerCase:()Ljava/lang/String;} must be + * detected, and the same file with the {@code Locale} descriptor must not be. + */ + @Test + public void bytecodeScanDetectsAnInjectedViolation() throws IOException { + Set bad = methodRefs( + fabricateClassFile("java/lang/String", "toLowerCase", "()Ljava/lang/String;")); + assertTrue("the parser failed to see an injected no-argument String.toLowerCase methodref, " + + "so every clean result it has ever produced is worthless: " + bad, + bad.contains("java/lang/String.toLowerCase:()Ljava/lang/String;")); + + Set good = methodRefs(fabricateClassFile("java/lang/String", "toLowerCase", + "(Ljava/util/Locale;)Ljava/lang/String;")); + assertFalse("the parser conflated the two arities, so it cannot enforce anything", + good.contains("java/lang/String.toLowerCase:()Ljava/lang/String;")); + assertTrue("the parser lost the pinned form entirely", + good.contains("java/lang/String.toLowerCase:(Ljava/util/Locale;)Ljava/lang/String;")); + } + + // --------------------------------------------------- the behavioural guard, on every CI leg + + /** + * The scan is a text and bytecode argument; this is the behavioural one. It exercises the two + * fixed sites and the WKT keyword path under the three locales that break ASCII assumptions in + * different ways, so the guarantee holds on every leg rather than only when CI happens to + * schedule a Turkish job. + * + *

The static formatters in {@link Unit} and {@link ProjCoordinate} are forced to initialise + * before the default locale moves, so this test cannot leave a differently-configured + * formatter behind for whatever runs next in the same JVM. + */ + @Test + public void theFixedSitesStayFixedUnderATurkishDefaultLocale() throws IOException { + // Warm the default-locale statics under the real ambient locale first. + assertNotNull(Unit.format); + assertNotNull(Units.DEGREES.format(1.5)); + assertNotNull(new ProjCoordinate(1.5, 2.5).toShortString()); + + Locale original = Locale.getDefault(); + try { + Locale[] hostile = { + new Locale("tr", "TR"), new Locale("lt", "LT"), new Locale("ar", "EG"), + }; + for (int i = 0; i < hostile.length; i++) { + Locale.setDefault(hostile[i]); + String where = " under default locale " + hostile[i]; + + // 1. The headline defect: an upper-case authority code must still resolve. + String[] params = new Proj4FileReader().readParametersFromFile("ESRI", "102008"); + assertNotNull("ESRI:102008 must resolve" + where, params); + assertTrue("ESRI:102008 came back empty" + where, params.length > 0); + + // ... end to end, through the factory, which is how a consumer meets it. + CoordinateReferenceSystem esri = + new CRSFactory().createFromName("ESRI:102008"); + assertNotNull("CRSFactory could not build ESRI:102008" + where, esri); + + // 2. The ErrorCause metric keys are hard-coded ASCII and must stay ASCII. + for (ErrorCause c : ErrorCause.values()) { + String key = c.metricKey(); + assertTrue("metric key " + key + " is not ASCII lower-case" + where, + key.matches("^(crs|coord|env)\\.[a-z0-9_]+$")); + } + assertEquals("crs.invalid_crs_syntax" + where, "crs.invalid_crs_syntax", + ErrorCause.INVALID_CRS_SYNTAX.metricKey()); + + // 3. WKT keyword dispatch upper-cases keywords; a lower-case 'i' must survive it. + assertEquals("'id'.toUpperCase(ROOT) must be ASCII" + where, + "ID", "id".toUpperCase(Locale.ROOT)); + + // 4. Unit.parse reads a machine-written value, so a decimal point is a decimal + // point even where the locale says otherwise. + assertEquals("Unit.parse must read an ASCII decimal point" + where, + 1.5, Units.METRES.parse("1.5"), 0.0); + } + } finally { + Locale.setDefault(original); + } + } + + // ------------------------------------------------------------------------------- the scanner + + private enum Kind { + /** Ambient default locale where an ASCII-stable result is required. */ + VIOLATION, + /** An explicit {@code Locale} argument. */ + PINNED_CASE, + /** {@code Character.toLowerCase/toUpperCase}: no {@code Locale} overload exists. */ + INVARIANT_CHARACTER_CASE, + /** A format string whose conversions are all locale-invariant. */ + INVARIANT_FORMAT, + /** A format call with an explicit {@code Locale} first argument. */ + PINNED_FORMAT, + /** On the deliberate allow-list. */ + ALLOWED_DISPLAY, + } + + private static final class Occurrence { + final int line; + final Kind kind; + final String text; + final String allowKey; + + Occurrence(int line, Kind kind, String text, String allowKey) { + this.line = line; + this.kind = kind; + this.text = text; + this.allowKey = allowKey; + } + } + + private static final class Scan { + final List violations = new ArrayList(); + final Set filesVisited = new TreeSet(); + final Set pinnedCaseFiles = new TreeSet(); + final Set allowListHits = new LinkedHashSet(); + int filesScanned; + int pinnedCase; + int invariantCharacterCase; + int invariantFormat; + int pinnedFormat; + } + + private static Scan scanCoreSources() throws IOException { + File root = coreSourceRoot(); + List sources = new ArrayList(); + collect(root, sources, ".java"); + Scan s = new Scan(); + s.filesScanned = sources.size(); + for (int i = 0; i < sources.size(); i++) { + File f = sources.get(i); + String rel = relative(root, f).replace(File.separatorChar, '/'); + s.filesVisited.add(rel); + List found = scan(read(f), rel); + for (int j = 0; j < found.size(); j++) { + Occurrence o = found.get(j); + switch (o.kind) { + case VIOLATION: + s.violations.add(rel + ":" + o.line + " " + o.text); + break; + case PINNED_CASE: + s.pinnedCase++; + s.pinnedCaseFiles.add(rel); + break; + case INVARIANT_CHARACTER_CASE: + s.invariantCharacterCase++; + break; + case INVARIANT_FORMAT: + s.invariantFormat++; + break; + case PINNED_FORMAT: + s.pinnedFormat++; + break; + case ALLOWED_DISPLAY: + s.allowListHits.add(o.allowKey); + break; + default: + throw new IllegalStateException(String.valueOf(o.kind)); + } + } + } + return s; + } + + /** + * Finds and classifies every locale-relevant construct in {@code source}. + * + *

Comments, string literals and character literals are excluded by an explicit lexer pass + * rather than by a line heuristic, so a needle mentioned in javadoc or inside a message is + * never reported and a real call is never missed because it shares a line with a quote. + */ + private static List scan(String source, String relativePath) { + byte[] state = lex(source); + List out = new ArrayList(); + + for (int k = 0; k < CASE_NEEDLES.length; k++) { + String needle = CASE_NEEDLES[k]; + for (int at = source.indexOf(needle); at >= 0; at = source.indexOf(needle, at + 1)) { + if (state[at] != CODE) { + continue; + } + int open = skipSpace(source, at + needle.length()); + if (open >= source.length() || source.charAt(open) != '(') { + continue; + } + String args = arguments(source, open); + boolean character = precededBy(source, at, "Character."); + Kind kind; + if (character) { + kind = Kind.INVARIANT_CHARACTER_CASE; + } else if (mentionsLocale(args)) { + kind = Kind.PINNED_CASE; + } else { + kind = Kind.VIOLATION; + } + out.add(new Occurrence(lineOf(source, at), kind, snippet(source, at), null)); + } + } + + // "String.format", ".printf" and ".format(" overlap on the same call -- "String.format(" + // matches all three -- so candidates are keyed on the position of the open parenthesis and + // each call is classified exactly once. + // "String.format", ".printf" and ".format(" overlap on the same call -- "String.format(" + // matches all three -- so candidates are keyed on the position of the open parenthesis and + // each call is classified exactly once. + Set formatCalls = new TreeSet(); + Set definiteFormatter = new TreeSet(); + for (int k = 0; k < FORMAT_NEEDLES.length; k++) { + String needle = FORMAT_NEEDLES[k]; + for (int at = source.indexOf(needle); at >= 0; at = source.indexOf(needle, at + 1)) { + if (state[at] != CODE) { + continue; + } + int open; + if (needle.endsWith("(")) { + open = at + needle.length() - 1; + } else { + open = skipSpace(source, at + needle.length()); + if (open >= source.length() || source.charAt(open) != '(') { + continue; + } + } + formatCalls.add(Integer.valueOf(open)); + if (!".format(".equals(needle)) { + // String.format / printf are Formatter calls for certain. A bare ".format(" + // is not: it also matches DecimalFormat/NumberFormat/AngleFormat instance + // calls, whose locale lives in the formatter rather than at the call site and + // which FORMATTER_CONSTRUCTORS covers instead. + definiteFormatter.add(Integer.valueOf(open)); + } + } + } + for (Integer openBox : formatCalls) { + int open = openBox.intValue(); + int at = open; + String args = arguments(source, open); + String literal = firstStringLiteral(args); + boolean definite = definiteFormatter.contains(openBox); + if (literal == null) { + // A format string held in a constant is still a format string. Conservative on + // purpose: a Formatter call whose conversions this scan cannot read is reported + // unless it pins a Locale, because the alternative is a silent false negative. + if (definite && !startsWithLocale(args)) { + out.add(new Occurrence(lineOf(source, at), Kind.VIOLATION, snippet(source, at), + null)); + } else if (definite) { + out.add(new Occurrence(lineOf(source, at), Kind.PINNED_FORMAT, + snippet(source, at), null)); + } + continue; + } + if (literal.indexOf('%') < 0 && !definite) { + continue; + } + Kind kind; + if (startsWithLocale(args)) { + kind = Kind.PINNED_FORMAT; + } else if (hasLocaleSensitiveConversion(literal)) { + kind = Kind.VIOLATION; + } else { + kind = Kind.INVARIANT_FORMAT; + } + out.add(new Occurrence(lineOf(source, at), kind, snippet(source, at), null)); + } + + Set formatterCalls = new TreeSet(); + for (int k = 0; k < FORMATTER_FACTORIES.length; k++) { + String needle = FORMATTER_FACTORIES[k]; + for (int at = source.indexOf(needle); at >= 0; at = source.indexOf(needle, at + 1)) { + if (state[at] != CODE || !isCallAt(source, at, needle)) { + continue; + } + String qualifier = dottedPrefixBefore(source, at); + if (endsWithOwner(qualifier)) { + formatterCalls.add(Integer.valueOf(at)); + } + } + } + for (int k = 0; k < FORMATTER_CONSTRUCTORS.length; k++) { + String needle = FORMATTER_CONSTRUCTORS[k]; + for (int at = source.indexOf(needle); at >= 0; at = source.indexOf(needle, at + 1)) { + if (state[at] != CODE || !isCallAt(source, at, needle)) { + continue; + } + // Accept any qualification -- "new DecimalFormat", "new java.text.DecimalFormat" -- + // by stepping back over the dotted prefix and requiring the keyword "new". + int before = at - dottedPrefixBefore(source, at).length(); + String head = source.substring(Math.max(0, before - 8), Math.max(0, before)).trim(); + if (head.endsWith("new")) { + formatterCalls.add(Integer.valueOf(at)); + } + } + } + for (Integer atBox : formatterCalls) { + int at = atBox.intValue(); + int open = skipSpace(source, at + tokenLength(source, at)); + String args = arguments(source, open); + if (mentionsLocale(args)) { + out.add(new Occurrence(lineOf(source, at), Kind.PINNED_CASE, snippet(source, at), + null)); + continue; + } + String allowKey = allowListKey(relativePath, snippet(source, at)); + Kind kind = allowKey != null ? Kind.ALLOWED_DISPLAY : Kind.VIOLATION; + out.add(new Occurrence(lineOf(source, at), kind, snippet(source, at), allowKey)); + } + return out; + } + + /** Whether {@code needle} at {@code at} is a whole identifier immediately followed by "(". */ + private static boolean isCallAt(String source, int at, String needle) { + int after = at + needle.length(); + if (after < source.length() && Character.isJavaIdentifierPart(source.charAt(after))) { + return false; + } + int open = skipSpace(source, after); + return open < source.length() && source.charAt(open) == '('; + } + + private static int tokenLength(String source, int at) { + int i = at; + while (i < source.length() && Character.isJavaIdentifierPart(source.charAt(i))) { + i++; + } + return i - at; + } + + /** The dotted qualifier immediately preceding {@code at}, e.g. {@code "java.text."}. */ + private static String dottedPrefixBefore(String source, int at) { + int i = at; + while (i > 0) { + char c = source.charAt(i - 1); + if (c == '.' || Character.isJavaIdentifierPart(c)) { + i--; + } else { + break; + } + } + return source.substring(i, at); + } + + private static boolean endsWithOwner(String qualifier) { + for (int i = 0; i < FORMATTER_OWNERS.length; i++) { + if (qualifier.endsWith(FORMATTER_OWNERS[i] + ".")) { + return true; + } + } + return false; + } + + private static String allowListKey(String relativePath, String lineText) { + for (int i = 0; i < ALLOWED.length; i++) { + if (ALLOWED[i][0].equals(relativePath) && lineText.contains(ALLOWED[i][1])) { + return ALLOWED[i][0] + " :: " + ALLOWED[i][1]; + } + } + return null; + } + + private static boolean mentionsLocale(String args) { + return args.indexOf("Locale.") >= 0 || args.indexOf("Locale)") >= 0 + || args.indexOf("locale") >= 0; + } + + private static boolean startsWithLocale(String args) { + String t = args.trim(); + return t.startsWith("Locale.") || t.startsWith("java.util.Locale.") + || t.startsWith("locale"); + } + + /** + * Whether a format literal contains a conversion whose rendering follows the locale. Measured + * membership -- {@code %x} and {@code %s} are not in the set, {@code %d} is. + */ + private static boolean hasLocaleSensitiveConversion(String literal) { + for (int i = 0; i < literal.length(); i++) { + if (literal.charAt(i) != '%') { + continue; + } + int j = i + 1; + if (j < literal.length() && literal.charAt(j) == '%') { + i = j; + continue; + } + while (j < literal.length() && "0123456789$+-#, (.".indexOf(literal.charAt(j)) >= 0) { + j++; + } + if (j < literal.length() && LOCALE_SENSITIVE_CONVERSIONS.indexOf(literal.charAt(j)) >= 0) { + return true; + } + } + return false; + } + + /** The text between the parenthesis at {@code open} and its match, or the rest of the text. */ + private static String arguments(String source, int open) { + int depth = 0; + boolean inString = false; + boolean inChar = false; + for (int i = open; i < source.length(); i++) { + char c = source.charAt(i); + if (inString) { + if (c == '\\') { + i++; + } else if (c == '"') { + inString = false; + } + continue; + } + if (inChar) { + if (c == '\\') { + i++; + } else if (c == '\'') { + inChar = false; + } + continue; + } + if (c == '"') { + inString = true; + } else if (c == '\'') { + inChar = true; + } else if (c == '(') { + depth++; + } else if (c == ')') { + depth--; + if (depth == 0) { + return source.substring(open + 1, i); + } + } + } + return source.substring(Math.min(open + 1, source.length())); + } + + /** The first double-quoted literal in {@code args}, with its escapes left as written. */ + private static String firstStringLiteral(String args) { + int start = -1; + for (int i = 0; i < args.length(); i++) { + char c = args.charAt(i); + if (c == '\\') { + i++; + } else if (c == '"') { + if (start < 0) { + start = i + 1; + } else { + return args.substring(start, i); + } + } + } + return null; + } + + private static boolean precededBy(String source, int at, String prefix) { + int start = at - prefix.length(); + return start >= 0 && source.regionMatches(start, prefix, 0, prefix.length()); + } + + private static int skipSpace(String source, int from) { + int i = from; + while (i < source.length() && Character.isWhitespace(source.charAt(i))) { + i++; + } + return i; + } + + private static int lineOf(String source, int at) { + int line = 1; + for (int i = 0; i < at; i++) { + if (source.charAt(i) == '\n') { + line++; + } + } + return line; + } + + private static String snippet(String source, int at) { + int start = source.lastIndexOf('\n', at) + 1; + int end = source.indexOf('\n', at); + return source.substring(start, end < 0 ? source.length() : end).trim(); + } + + // ------------------------------------------------------------------------------- the lexer + + private static final byte CODE = 0; + private static final byte OTHER = 1; + + /** + * Marks every character as code or not-code. Not-code is: a line comment, a block or javadoc + * comment, a string literal body, and a character literal body. Deliberately simple -- no text + * blocks, because this codebase targets Java 8 source level. + */ + private static byte[] lex(String s) { + byte[] out = new byte[s.length()]; + int i = 0; + while (i < s.length()) { + char c = s.charAt(i); + char n = i + 1 < s.length() ? s.charAt(i + 1) : '\0'; + if (c == '/' && n == '/') { + while (i < s.length() && s.charAt(i) != '\n') { + out[i++] = OTHER; + } + } else if (c == '/' && n == '*') { + out[i++] = OTHER; + out[i++] = OTHER; + while (i < s.length() && !(s.charAt(i) == '*' && i + 1 < s.length() + && s.charAt(i + 1) == '/')) { + out[i++] = OTHER; + } + if (i < s.length()) { + out[i++] = OTHER; + } + if (i < s.length()) { + out[i++] = OTHER; + } + } else if (c == '"') { + out[i++] = OTHER; + while (i < s.length() && s.charAt(i) != '"') { + if (s.charAt(i) == '\\') { + out[i++] = OTHER; + } + if (i < s.length()) { + out[i++] = OTHER; + } + } + if (i < s.length()) { + out[i++] = OTHER; + } + } else if (c == '\'') { + out[i++] = OTHER; + while (i < s.length() && s.charAt(i) != '\'') { + if (s.charAt(i) == '\\') { + out[i++] = OTHER; + } + if (i < s.length()) { + out[i++] = OTHER; + } + } + if (i < s.length()) { + out[i++] = OTHER; + } + } else { + out[i++] = CODE; + } + } + // Belt as well as braces, and it is what makes a single javadoc line classifiable on its + // own: any line whose first non-space characters open or continue a comment is not code, + // whatever the block lexer above concluded about where the comment started. + int lineStart = 0; + while (lineStart < s.length()) { + int lineEnd = s.indexOf('\n', lineStart); + if (lineEnd < 0) { + lineEnd = s.length(); + } + int t = lineStart; + while (t < lineEnd && (s.charAt(t) == ' ' || s.charAt(t) == '\t')) { + t++; + } + boolean commentLine = t < lineEnd && (s.charAt(t) == '*' + || (s.charAt(t) == '/' && t + 1 < lineEnd + && (s.charAt(t + 1) == '/' || s.charAt(t + 1) == '*'))); + if (commentLine) { + for (int k = lineStart; k < lineEnd; k++) { + out[k] = OTHER; + } + } + lineStart = lineEnd + 1; + } + return out; + } + + // -------------------------------------------------------------------- the constant-pool parser + + /** + * Every {@code owner.name:descriptor} a class file's constant pool names as a method reference. + * Parsing rather than grepping is the point: the two arities of {@code String.toLowerCase} + * share the name {@code toLowerCase} byte for byte and differ only in a descriptor held in a + * separate entry. + */ + private static Set methodRefs(byte[] b) { + Set out = new TreeSet(); + if (b.length < 10 || u4(b, 0) != 0xCAFEBABEL) { + throw new IllegalArgumentException("not a class file"); + } + int count = u2(b, 8); + int[] tag = new int[count]; + int[] a1 = new int[count]; + int[] a2 = new int[count]; + String[] utf = new String[count]; + int p = 10; + for (int i = 1; i < count; i++) { + int t = b[p++] & 0xFF; + tag[i] = t; + switch (t) { + case 1: { // Utf8 + int len = u2(b, p); + p += 2; + StringBuilder sb = new StringBuilder(len); + for (int k = 0; k < len; k++) { + sb.append((char) (b[p + k] & 0xFF)); + } + utf[i] = sb.toString(); + p += len; + break; + } + case 7: case 8: case 16: case 19: case 20: // Class, String, MethodType, Module, Package + a1[i] = u2(b, p); + p += 2; + break; + case 15: // MethodHandle + p += 3; + break; + case 3: case 4: // Integer, Float + p += 4; + break; + case 5: case 6: // Long, Double -- occupy two slots + p += 8; + i++; + break; + case 9: case 10: case 11: case 12: case 17: case 18: + // Fieldref, Methodref, InterfaceMethodref, NameAndType, Dynamic, InvokeDynamic + a1[i] = u2(b, p); + a2[i] = u2(b, p + 2); + p += 4; + break; + default: + throw new IllegalStateException("unknown constant pool tag " + t + " at " + i); + } + } + for (int i = 1; i < count; i++) { + if (tag[i] != 10 && tag[i] != 11) { + continue; + } + String owner = utf[a1[a1[i]]]; + int nat = a2[i]; + out.add(owner + "." + utf[a1[nat]] + ":" + utf[a2[nat]]); + } + return out; + } + + /** + * A minimal but structurally valid class file whose constant pool carries exactly one + * {@code Methodref}. Used as the injected-violation control: a real binary carrier, so the + * parser is exercised the same way it is on {@code target/classes}. + */ + private static byte[] fabricateClassFile(String owner, String name, String descriptor) + throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + writeU4(out, 0xCAFEBABEL); + writeU2(out, 0); // minor + writeU2(out, 52); // major (Java 8) + writeU2(out, 7); // constant_pool_count: 6 entries + writeUtf8(out, owner); // #1 + out.write(7); writeU2(out, 1); // #2 Class -> #1 + writeUtf8(out, name); // #3 + writeUtf8(out, descriptor); // #4 + out.write(12); writeU2(out, 3); writeU2(out, 4); // #5 NameAndType + out.write(10); writeU2(out, 2); writeU2(out, 5); // #6 Methodref + writeU2(out, 0x0021); // access_flags + writeU2(out, 2); // this_class + writeU2(out, 2); // super_class + writeU2(out, 0); // interfaces + writeU2(out, 0); // fields + writeU2(out, 0); // methods + writeU2(out, 0); // attributes + return out.toByteArray(); + } + + private static void writeUtf8(ByteArrayOutputStream out, String s) { + out.write(1); + writeU2(out, s.length()); + for (int i = 0; i < s.length(); i++) { + out.write(s.charAt(i) & 0xFF); + } + } + + private static void writeU2(ByteArrayOutputStream out, int v) { + out.write((v >>> 8) & 0xFF); + out.write(v & 0xFF); + } + + private static void writeU4(ByteArrayOutputStream out, long v) { + out.write((int) ((v >>> 24) & 0xFF)); + out.write((int) ((v >>> 16) & 0xFF)); + out.write((int) ((v >>> 8) & 0xFF)); + out.write((int) (v & 0xFF)); + } + + private static int u2(byte[] b, int at) { + return ((b[at] & 0xFF) << 8) | (b[at + 1] & 0xFF); + } + + private static long u4(byte[] b, int at) { + return ((long) (b[at] & 0xFF) << 24) | ((b[at + 1] & 0xFF) << 16) + | ((b[at + 2] & 0xFF) << 8) | (b[at + 3] & 0xFF); + } + + // ---------------------------------------------------------------------------------- plumbing + + private static File coreSourceRoot() { + File classes = coreClassesDirectory(); + File module = classes.getParentFile().getParentFile(); + File src = new File(module, "src" + File.separator + "main" + File.separator + "java"); + if (!src.isDirectory()) { + throw new IllegalStateException("cannot locate core sources; looked in " + src); + } + return src; + } + + private static File coreClassesDirectory() { + URL url = CoordinateReferenceSystem.class.getResource( + "/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + if (url == null) { + throw new IllegalStateException("cannot locate the compiled core classes"); + } + String path = url.getPath(); + int index = path.indexOf("/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + File dir = new File(path.substring(0, index).replace("%20", " ")); + if (!dir.isDirectory()) { + throw new IllegalStateException("compiled core classes are not in a directory: " + dir); + } + return dir; + } + + private static void collect(File dir, List out, String suffix) { + File[] entries = dir.listFiles(); + if (entries == null) { + return; + } + Arrays.sort(entries); + for (int i = 0; i < entries.length; i++) { + if (entries[i].isDirectory()) { + collect(entries[i], out, suffix); + } else if (entries[i].getName().endsWith(suffix)) { + out.add(entries[i]); + } + } + } + + private static String relative(File root, File file) { + String r = root.getAbsolutePath(); + String f = file.getAbsolutePath(); + return f.startsWith(r) ? f.substring(r.length() + 1) : f; + } + + /** + * Reads the file byte for byte into a latin-1 string. Deliberately not a charset decode: a + * source file in this repo contains a raw NUL, and a decode-and-split pipeline is exactly the + * kind of instrument that goes silently blind on it. + */ + private static String read(File f) throws IOException { + byte[] b = readBytes(f); + StringBuilder sb = new StringBuilder(b.length); + for (int i = 0; i < b.length; i++) { + sb.append((char) (b[i] & 0xFF)); + } + return sb.toString(); + } + + private static byte[] readBytes(File f) throws IOException { + InputStream in = new FileInputStream(f); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/determinism/NoJdkAngleConversionTest.java b/core/src/test/java/org/locationtech/proj4j/determinism/NoJdkAngleConversionTest.java new file mode 100644 index 0000000..47f288d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/determinism/NoJdkAngleConversionTest.java @@ -0,0 +1,565 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.determinism; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Asserts that no result-bearing code path in {@code core} calls {@link Math#toRadians} or + * {@link Math#toDegrees}, because neither is stable across Java versions and neither matches the + * arithmetic PROJ uses. {@link ProjectionMath#toRad(double)} and + * {@link ProjectionMath#toDeg(double)} are the replacements. + * + *

What was measured, and on what

+ * + *

Over the 721 whole degrees in {@code [-360, 360]}, on Temurin 8u502 (x86-64), + * 11.0.32 (aarch64), 11.0.32 (x86-64) and 21.0.11 (aarch64), with the input + * set pinned by digest so that a moved argument could not be mistaken for a moved function: + * + * + * + * + * + * + * + * + * + *
1-ULP disagreement counts out of 721
pairJava 8Java 11 / 21
{@code Math.toRadians(d)} vs {@code d * DTR}182 (25.24%)0
{@code Math.toRadians(d)} vs {@code d * PI / 180.0}196186
{@code Math.toDegrees(r)} vs {@code r / DTR}17846
{@code Math.toDegrees(r)} vs {@code r * RTD}1800
{@code r * RTD} vs {@code r / DTR}4646
+ * + *

Three conclusions follow, and the third is the one that cost a wrong first attempt. + * + *

    + *
  1. Both JDK methods changed body at Java 9, from an association to a constant multiply, so + * both directions are version-unstable. {@code toDegrees} is not exempt: the + * often-repeated claim that {@code PJ_TODEG} is bit-identical to {@link Math#toDegrees} was + * measured on Java 8 and stopped being true at Java 9.
  2. + *
  3. 1 ULP of a radian is about 1.4e-9 m on the ellipsoid, which is exactly the bar of the 16 + * {@code nm}-tolerance rows in the gie corpus, so this is a conformance question.
  4. + *
  5. PROJ has two idioms, and the {@code PJ_TORAD}/{@code PJ_TODEG} macros are the minority + * one. {@code DEG_TO_RAD}/{@code RAD_TO_DEG} ({@code proj_internal.h:1033-1034}) are used + * at 147 and 33 sites against the macros' 7 and 11, and their + * literals are bit-identical to Java's {@code Math.PI / 180.0} and {@code 180.0 / Math.PI}. + * The projections that actually convert at this boundary — {@code gnom.cpp:124-131}, + * {@code aeqd.cpp:110-116} — write {@code lp.phi / DEG_TO_RAD} and {@code azi1 *= DEG_TO_RAD}. + * Adopting the macro association instead was tried and measurably worsened agreement + * with {@code proj 9.8.1}: over 1,187 in-domain points {@code +proj=gnom} fell from 204 to 148 + * bit-exact matches. With {@code DTR} it rises to 214. Hence + * {@link ProjectionMath#toRad(double)} is {@code deg * DTR} and + * {@link ProjectionMath#toDeg(double)} is {@code rad / DTR} — a divide, because + * {@code x * (1/s)} is not {@code x / s} and PROJ divides here.
  6. + *
+ * + *

What is deliberately allowed

+ * + *

{@code geodesic/**} is exempt, and the reason is that its two upstreams disagree. That + * package is Karney's GeographicLib, vendored and kept close to source. Karney's Java + * edition writes {@code Math.toRadians}/{@code Math.toDegrees}; his C edition — which is + * the one PROJ actually links, bundled at {@code 9.8.1:src/geodesic.c} — precomputes + * {@code degree = pi/180} and writes {@code r *= degree} and {@code ang = atan2(y, x) / degree}. + * Measured over Karney's own reduced argument range ({@code |r| <= 45}, {@code |t| <= pi/4}): + * the radian direction agrees with the C edition on Java 11 and 21 and disagrees on 26.91% of + * samples on Java 8; the degree direction never agrees, differing on 11.55% of samples on + * every JVM including 21, because {@code x * (1/s)} is not {@code x / s}. So no single edit + * reconciles both upstreams: converting the package would diverge from its Java upstream without + * reaching its C one. The divergence is pre-existing, is Karney's, and is recorded here rather + * than silently taken. + * + *

Cosmetic occurrences — a value interpolated into an exception message, a {@code toString} or a + * javadoc snippet — are allowed anywhere. A 1-ULP difference in a number that only ever reaches a + * string cannot reach a coordinate, and forbidding them would be churn with no determinism content. + * + *

Why this test can fail

+ * + *

A scan that cannot fail is worthless, so the detector's sensitivity is proven three ways + * rather than assumed. The sibling scans in {@code io.wkt.NoGeoApiInCoreTest} and + * {@code resource.NoAmbientInputInCoreTest} carry the same shape — note that + * {@code NoGeoApiInCoreTest} did not, until it was given one; the 28-of-32 + * {@code geoapi}-classes measurement was for a while attributed to a test that never ran it, and it + * now does ({@code theGeoApiModuleIsFullOfTheNeedleThisScanLooksFor}): + * + *

    + *
  • {@link #classifierDistinguishesResultBearingFromCosmetic()} feeds the classifier crafted + * lines of both kinds and asserts each verdict, so the rule itself is tested rather than only + * the directory walk.
  • + *
  • {@link #scanFindsTheKnownPositivesInTheVendoredGeodesicPackage()} points the very same + * scanner at {@code geodesic/**}, which is known to contain result-bearing calls, and requires + * it to find them. If the walk silently reached nothing, the main assertion would pass + * trivially; this makes that impossible.
  • + *
  • {@link #compiledGeodesicClassesStillNameTheJdkMethods()} does the same at the bytecode level, + * independently of source layout.
  • + *
+ * + *

If the main assertion fails, do not add the offender to the allow-list. Replace the call with + * {@link ProjectionMath#toRad(double)} or {@link ProjectionMath#toDeg(double)}. + */ +public class NoJdkAngleConversionTest { + + /** + * Package paths, relative to the source root, that are exempt. Only the vendored + * GeographicLib port is, and only for the reason set out in the class comment. + */ + private static final String[] ALLOWED_PACKAGES = { + "org/locationtech/proj4j/geodesic/" + }; + + /** The two JDK methods no result-bearing core path may name. */ + private static final String[] FORBIDDEN = {"Math.toRadians", "Math.toDegrees"}; + + // ------------------------------------------------------------------ the guard + + @Test + public void noResultBearingCoreCodeCallsTheJdkAngleConversions() throws IOException { + File sourceRoot = coreSourceRoot(); + List sources = new ArrayList(); + collect(sourceRoot, sources, ".java"); + assertTrue("found no core sources to scan under " + sourceRoot + ", so this test would " + + "prove nothing", sources.size() > 100); + + List offenders = new ArrayList(); + int cosmetic = 0; + int exempt = 0; + for (int i = 0; i < sources.size(); i++) { + File f = sources.get(i); + String rel = relative(sourceRoot, f).replace(File.separatorChar, '/'); + List found = scan(read(f)); + for (int j = 0; j < found.size(); j++) { + Occurrence o = found.get(j); + if (!o.resultBearing) { + cosmetic++; + } else if (isAllowedPackage(rel)) { + exempt++; + } else { + offenders.add(rel + ":" + o.line + " " + o.text); + } + } + } + + // The scan must have reached the exempt package, otherwise the walk is broken and the + // zero-offender result below is vacuous. + assertTrue("the scan did not reach the vendored geodesic package, so it proves nothing", + exempt > 0); + assertTrue("the scan found no cosmetic occurrences at all, which means the classifier is " + + "rejecting everything and the guard is not actually discriminating", cosmetic > 0); + + if (!offenders.isEmpty()) { + fail("Math.toRadians/Math.toDegrees are not bit-stable across Java versions -- both " + + "changed body at Java 9, from an association to a constant multiply -- and " + + "neither matches the DEG_TO_RAD multiply/divide that PROJ actually uses at " + + "these boundaries. Use ProjectionMath.toRad/toDeg on any path whose value " + + "reaches a coordinate, a grid index, a comparison or a stored parameter. Do " + + "not add the site to ALLOWED_PACKAGES. Offending sites (" + + offenders.size() + "): " + offenders); + } + } + + // ------------------------------------------------------- sensitivity proof 1: the classifier + + /** + * The classifier is the part that could silently stop working, so it is tested directly against + * lines of both kinds — including the two shapes that actually caused trouble when this audit + * was done by hand. + */ + @Test + public void classifierDistinguishesResultBearingFromCosmetic() { + // Result-bearing. + assertResultBearing(" lp.y = Math.toRadians(lat1);"); + assertResultBearing(" double azi = Math.toRadians(g.azi1);"); + assertResultBearing(" minLatitude = Math.toRadians(-80);"); + assertResultBearing(" return Math.toDegrees(proj.getAlpha());"); + assertResultBearing(" pm.setLongitude(Math.toDegrees(radians(projPm)));"); + // The false positive a naive "is there a quote earlier on the line" rule gets wrong: a + // real conversion sharing a line with unrelated string constructor arguments. + assertResultBearing( + " static final Unit RADIANS = new Unit(\"radian\", \"rad\", Math.toDegrees(1));"); + + // Cosmetic: the value only ever reaches a message. + assertCosmetic(" \"(\" + Math.toDegrees(lam) + \", \" + Math.toDegrees(phi)"); + assertCosmetic(" + Math.toDegrees(phi1));"); + assertCosmetic(" + \"lat_0 = \" + Math.toDegrees(lat) + \" degrees\");"); + // Comments and javadoc are never code. + assertCosmetic(" * {@code maxLatitude = Math.toRadians(60);//FIXME} that hard-coded"); + assertCosmetic(" // r = Math.toRadians(r);"); + + // And a line with neither must yield nothing at all. + assertEquals(0, scan(" double x = ProjectionMath.toRad(deg);").size()); + } + + private static void assertResultBearing(String line) { + List found = scan(line); + assertEquals("expected exactly one occurrence in: " + line, 1, found.size()); + assertTrue("should have been classified result-bearing: " + line, + found.get(0).resultBearing); + } + + private static void assertCosmetic(String line) { + List found = scan(line); + assertTrue("expected at least one occurrence in: " + line, found.size() > 0); + for (int i = 0; i < found.size(); i++) { + assertFalse("should have been classified cosmetic: " + line, + found.get(i).resultBearing); + } + } + + // ------------------------------------------------- sensitivity proof 2: a known-positive tree + + /** + * Points the production scanner at the one package known to contain result-bearing calls. This + * is the analogue of {@code NoGeoApiInCoreTest} finding {@code org/opengis/} in 28 of 32 + * {@code geoapi} classes: a positive control that keeps working on its own, because it is the + * exemption itself. The difference is that this one needs nothing outside {@code core} and so + * runs unconditionally, where that one is skipped on a clean build until the {@code geoapi} + * module has been compiled. + */ + @Test + public void scanFindsTheKnownPositivesInTheVendoredGeodesicPackage() throws IOException { + File root = coreSourceRoot(); + File geodesic = new File(root, "org/locationtech/proj4j/geodesic".replace('/', + File.separatorChar)); + assertTrue("the vendored geodesic sources are missing from " + root, geodesic.isDirectory()); + + List sources = new ArrayList(); + collect(geodesic, sources, ".java"); + assertTrue("no geodesic sources found", sources.size() >= 5); + + int resultBearing = 0; + TreeSet filesWithHits = new TreeSet(); + for (int i = 0; i < sources.size(); i++) { + List found = scan(read(sources.get(i))); + for (int j = 0; j < found.size(); j++) { + if (found.get(j).resultBearing) { + resultBearing++; + filesWithHits.add(sources.get(i).getName()); + } + } + } + // Measured on the vendored tree: GeoMath (sincosd, sincosde, atan2d), Geodesic and + // GeodesicLine. Requiring a floor rather than an exact count keeps this from breaking on an + // upstream resync, while still failing outright if the scanner stops detecting anything. + assertTrue("the scanner found only " + resultBearing + " result-bearing calls in the " + + "vendored geodesic package, which is fewer than the known positives -- the " + + "detector has stopped working, so the main assertion proves nothing", + resultBearing >= 8); + assertTrue("expected hits in at least 3 geodesic files, got " + filesWithHits, + filesWithHits.size() >= 3); + } + + // ------------------------------------------- sensitivity proof 3: the same claim in bytecode + + /** + * The source scan depends on finding {@code src/main/java}. This one does not: it reads the + * compiled classes, so the guarantee survives a build-layout change, and it independently + * confirms that the needle is findable at all. + */ + @Test + public void compiledGeodesicClassesStillNameTheJdkMethods() throws IOException { + File classes = coreClassesDirectory(); + List all = new ArrayList(); + collect(classes, all, ".class"); + assertTrue("found no compiled classes under " + classes, all.size() > 100); + + int geodesicHits = 0; + int geodesicScanned = 0; + List convertedButStillNaming = new ArrayList(); + for (int i = 0; i < all.size(); i++) { + File f = all.get(i); + String rel = relative(classes, f).replace(File.separatorChar, '/'); + boolean names = namesJdkAngleConversion(f); + if (rel.startsWith("org/locationtech/proj4j/geodesic/")) { + geodesicScanned++; + if (names) { + geodesicHits++; + } + } + if (rel.startsWith("org/locationtech/proj4j/util/ProjectionMath")) { + // The replacement must not be implemented in terms of the thing it replaces. + if (names) { + convertedButStillNaming.add(rel); + } + } + } + assertTrue("scanned no geodesic classes", geodesicScanned >= 5); + assertTrue("the bytecode scan found the JDK angle conversions in " + geodesicHits + " of " + + geodesicScanned + " geodesic classes; finding none would mean the needle is not " + + "detectable in bytecode and the scan proves nothing", geodesicHits >= 3); + assertTrue("ProjectionMath must not implement toRad/toDeg via the JDK methods it exists to " + + "replace: " + convertedButStillNaming, convertedButStillNaming.isEmpty()); + } + + /** + * The replacements' contract, asserted rather than documented: PROJ's {@code DEG_TO_RAD} + * idiom, and no dependence on a JDK library body. + * + *

PROJ's two literals are checked for bit-identity with Java's expressions first, because + * that identity is what makes {@link ProjectionMath#DTR} usable as {@code DEG_TO_RAD} at all. + */ + @Test + public void replacementsUsePROJsDegToRadIdiom() { + // 9.8.1:src/proj_internal.h:1033-1034, verbatim. + assertEquals("PROJ's DEG_TO_RAD literal must be bit-identical to Math.PI / 180.0", + 0.017453292519943296, ProjectionMath.DTR, 0.0); + assertEquals("PROJ's RAD_TO_DEG literal must be bit-identical to 180.0 / Math.PI", + 57.295779513082321, ProjectionMath.RTD, 0.0); + + for (int d = -360; d <= 360; d++) { + assertEquals("toRad must be deg * DEG_TO_RAD at " + d + " deg", + d * ProjectionMath.DTR, ProjectionMath.toRad(d), 0.0); + double r = d * ProjectionMath.DTR; + assertEquals("toDeg must be rad / DEG_TO_RAD at " + d + " deg", + r / ProjectionMath.DTR, ProjectionMath.toDeg(r), 0.0); + } + + // The degree direction is a divide on purpose: x * (1/s) is not x / s. Measured at 46 of + // 721 on Temurin 8u502, 11.0.32 (both arches) and 21.0.11. If this reaches 0, toDeg has + // been "simplified" to an RTD multiply and fidelity to gnom.cpp/aeqd.cpp was lost. + int degDiff = 0; + for (int d = -360; d <= 360; d++) { + double r = d * ProjectionMath.DTR; + if (ProjectionMath.toDeg(r) != r * ProjectionMath.RTD) { + degDiff++; + } + } + assertEquals("rad / DTR must differ from rad * RTD on 46 of the 721 whole-degree images; 0 " + + "means toDeg was rewritten as an RTD multiply, which is not what PROJ does", + 46, degDiff); + } + + /** + * The determinism claim itself, stated as a property rather than a measurement: neither helper + * may depend on a JDK library body, so both must be expressible in plain arithmetic that a + * different JVM version cannot reinterpret. + * + *

This is the assertion that would have caught the original defect. On Temurin 8u502 + * {@code Math.toRadians} disagrees with {@code deg * DTR} on 182 of these 721 values; on 11 and + * 21 it agrees on all of them. Pinning the helpers to the arithmetic makes the JVM version + * irrelevant, and this test fails on every JVM if either helper is routed back through + * {@link Math}. + */ + @Test + public void helpersAreVersionStableByConstruction() { + long radDigest = 1125899906842597L; + long degDigest = 1125899906842597L; + for (int d = -360; d <= 360; d++) { + double r = ProjectionMath.toRad(d); + radDigest = radDigest * 31 + Double.doubleToRawLongBits(r); + degDigest = degDigest * 31 + + Double.doubleToRawLongBits(ProjectionMath.toDeg(d * ProjectionMath.DTR)); + } + // Measured identically on Temurin 8u502 (x86-64), 11.0.32 (aarch64), 11.0.32 (x86-64) and + // 21.0.11 (aarch64), over an input set whose own digest was 41b0094159485ebb on all four -- + // so a change here is a change of function, not of argument. + assertEquals("toRad over [-360,360] must produce this exact bit pattern on every JVM", + 0x45fcec414804d99dL, radDigest); + assertEquals("toDeg over the same inputs must produce this exact bit pattern on every JVM", + 0xd3fe3f71991ba4bdL, degDigest); + } + + // ------------------------------------------------------------------------------- the scanner + + /** One detected call site. */ + private static final class Occurrence { + final int line; + final boolean resultBearing; + final String text; + + Occurrence(int line, boolean resultBearing, String text) { + this.line = line; + this.resultBearing = resultBearing; + this.text = text; + } + } + + /** + * Finds every {@code Math.toRadians}/{@code Math.toDegrees} in {@code source} and classifies + * each as result-bearing or cosmetic. + * + *

The rule: an occurrence is cosmetic if its line is a comment, or if the text preceding it + * on that line shows it being appended to a string — a string literal already open on the + * line, or a line that is the continuation of a concatenation. Everything else is + * result-bearing. Deliberately conservative in the safe direction: a genuine conversion that + * merely shares a line with a string literal would be misread as cosmetic, so + * {@link #classifierDistinguishesResultBearingFromCosmetic()} pins exactly that case. + */ + private static List scan(String source) { + List out = new ArrayList(); + String[] lines = source.split("\n", -1); + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + String trimmed = line.trim(); + boolean comment = trimmed.startsWith("*") || trimmed.startsWith("//") + || trimmed.startsWith("/*"); + for (int k = 0; k < FORBIDDEN.length; k++) { + String needle = FORBIDDEN[k]; + int at = line.indexOf(needle); + while (at >= 0) { + // Must be a call, not a mention inside a longer identifier. + int after = at + needle.length(); + boolean isCall = after < line.length() && line.charAt(after) == '('; + if (isCall) { + String before = line.substring(0, at); + boolean cosmetic = comment || appendsToString(before); + out.add(new Occurrence(i + 1, !cosmetic, trimmed)); + } + at = line.indexOf(needle, at + 1); + } + } + } + return out; + } + + /** + * Whether the text preceding an occurrence shows it being concatenated into a string. Either a + * quote has already appeared on this line, or the line is a continuation whose preceding text + * is just a {@code +}. + */ + private static boolean appendsToString(String before) { + if (before.indexOf('"') >= 0) { + // A real conversion can share a line with unrelated string arguments, e.g. a + // constructor call. Treat it as a message only when the quote is followed by a + // concatenation operator rather than an argument separator. + int lastQuote = before.lastIndexOf('"'); + String between = before.substring(lastQuote + 1).trim(); + return between.endsWith("+"); + } + String t = before.trim(); + return t.equals("+") || t.endsWith("+"); + } + + private static boolean isAllowedPackage(String relativePath) { + for (int i = 0; i < ALLOWED_PACKAGES.length; i++) { + if (relativePath.startsWith(ALLOWED_PACKAGES[i])) { + return true; + } + } + return false; + } + + /** Whether a class file's constant pool names either JDK angle conversion. */ + private static boolean namesJdkAngleConversion(File classFile) throws IOException { + byte[] bytes = readBytes(classFile); + return contains(bytes, "toRadians") || contains(bytes, "toDegrees"); + } + + private static boolean contains(byte[] haystack, String needle) { + int n = needle.length(); + int limit = haystack.length - n; + outer: + for (int i = 0; i <= limit; i++) { + for (int j = 0; j < n; j++) { + if (haystack[i + j] != (byte) needle.charAt(j)) { + continue outer; + } + } + return true; + } + return false; + } + + // ---------------------------------------------------------------------------------- plumbing + + /** + * Locates {@code core/src/main/java} from the compiled classes rather than from a hard-coded + * path, so this works under Maven and under an IDE. + */ + private static File coreSourceRoot() { + File classes = coreClassesDirectory(); + // .../core/target/classes -> .../core + File module = classes.getParentFile().getParentFile(); + File src = new File(module, "src" + File.separator + "main" + File.separator + "java"); + if (!src.isDirectory()) { + throw new IllegalStateException("cannot locate core sources; looked in " + src); + } + return src; + } + + private static File coreClassesDirectory() { + URL url = CoordinateReferenceSystem.class.getResource( + "/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + if (url == null) { + throw new IllegalStateException("cannot locate the compiled core classes"); + } + String path = url.getPath(); + int index = path.indexOf("/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + File dir = new File(path.substring(0, index).replace("%20", " ")); + if (!dir.isDirectory()) { + throw new IllegalStateException("compiled core classes are not in a directory: " + dir); + } + return dir; + } + + private static void collect(File dir, List out, String suffix) { + File[] entries = dir.listFiles(); + if (entries == null) { + return; + } + Arrays.sort(entries); + for (int i = 0; i < entries.length; i++) { + if (entries[i].isDirectory()) { + collect(entries[i], out, suffix); + } else if (entries[i].getName().endsWith(suffix)) { + out.add(entries[i]); + } + } + } + + private static String relative(File root, File file) { + String r = root.getAbsolutePath(); + String f = file.getAbsolutePath(); + return f.startsWith(r) ? f.substring(r.length() + 1) : f; + } + + private static String read(File f) throws IOException { + byte[] b = readBytes(f); + StringBuilder sb = new StringBuilder(b.length); + for (int i = 0; i < b.length; i++) { + sb.append((char) (b[i] & 0xFF)); + } + return sb.toString(); + } + + private static byte[] readBytes(File f) throws IOException { + InputStream in = new FileInputStream(f); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/determinism/StrictMathGoldenTableTest.java b/core/src/test/java/org/locationtech/proj4j/determinism/StrictMathGoldenTableTest.java new file mode 100644 index 0000000..c7d4a1e --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/determinism/StrictMathGoldenTableTest.java @@ -0,0 +1,675 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.determinism; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.util.FastStrictTrig; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Turns proj4j's determinism guarantee from an assertion into a check that can fail. + * + *

The guarantee, as stated in the {@code proj4j-upgrade} notes: every transcendental on the + * transform path goes through {@code StrictMath} (or {@link FastStrictTrig}, its allocation-free + * transcription), so a coordinate transform produces the same bits on every JVM and every + * architecture. A downstream Spark consumer depends on that across executors. It also decides a + * conformance bar rather than only reproducibility: at + * {@code +proj=adams_ws2 +ellps=WGS84} and {@code (179.999, 0)} the map's conditioning amplifies a + * last-bit difference in {@code sin} by roughly {@code 3e8}, so {@code Math.sin} misses + * {@code adams_ws2.gie:2139} by 27.8 mm against a 1 mm tolerance while {@code StrictMath.sin} hits + * it at 0.35 mm. Neither is more accurate - the exact value sits between them - so what is + * being preserved is fidelity to the fdlibm-equivalent {@code sin} that generated PROJ's + * expected values, not accuracy. + * + *

Until this test existed the guarantee was only ever asserted. What makes it checkable is that + * {@code StrictMath} is specified to a bit rather than to an ulp, so a table of expected raw + * bit patterns is a legitimate thing to commit; {@code Math} is specified only to 1-2 ulp with + * {@code @IntrinsicCandidate} substitution, so the same table would be meaningless for it. That + * asymmetry is the entire mechanism. + * + *

What each test does, and where the non-vacuity comes from

+ * + *
    + *
  1. Every row matches the golden, bitwise. On + * {@link Double#doubleToRawLongBits(double)}, so {@code +0.0} and {@code -0.0} are + * distinguished and NaN payloads are compared rather than collapsed. A failure names the + * function and prints the exact argument.
  2. + *
  3. {@link FastStrictTrig} matches the same golden for {@code sin}/{@code cos}/{@code + * tan}. It is a transcription of the JDK's {@code FdLibm} kernels with the argument-reduction + * array removed, and the reason it exists is that {@code StrictMath.sin} allocates ~62 B per + * call on JDK 21 and later - on 8..17 it is native JNI and allocates nothing, so the figure + * there is a structural 0. Holding it to the same table as {@code StrictMath} is what makes + * "allocation-free" not quietly cost fidelity - and it is also the reason this test is not + * vacuous: an 800-line independent implementation agreeing with the table on 44,394 + * raw-bit comparisons cannot happen if the table is garbage.
  4. + *
  5. The table cannot be misaligned or truncated. Each section declares its row count + * and a digest of its argument bits, both asserted against the probe generator. The + * digest is not belt-and-braces: building the probes with {@code Math.toRadians} made the + * argument list differ on Java 8, which presented as a 64-ulp {@code StrictMath.sin} + * divergence and would have been reported as one.
  6. + *
  7. The {@code Math} divergence measurement records how far the non-strict functions + * depart from the golden and writes it for CI. It deliberately asserts nothing about the + * divergence, because on Temurin 11/AArch64 there is none at all - see + * {@link #measureMathDivergenceFromTheGolden()}, which explains why the obvious in-leg + * assertion is wrong and where the assertion belongs instead.
  8. + *
+ * + *

What this test does not prove

+ * + *
    + *
  • Not bit parity with PROJ. {@code StrictMath} is fdlibm; PROJ links glibc or Apple + * libm. Bit parity with C is not achievable and is not the goal - 1 ulp of a radian is about + * 2 pm, eight orders inside the tightest gie bar. Fidelity to fdlibm is the goal because + * fdlibm is what generated the corpus.
  • + *
  • Not a claim about {@code Math}. Its results are allowed to differ, and on JDK 21 and + * 26 they do; on JDK 11 they do not differ anywhere in this probe set. The separate rule that + * nothing on the transform path may call it is enforced by the benchmark module's + * {@code CountingMath} tier, not here.
  • + *
  • Not, on its own, a cross-architecture result. A committed table pins the answer + * across time on whatever runner executed it. The cross-architecture claim needs the matrix in + * {@code .github/workflows/determinism.yaml}, which runs this same class on + * {@code ubuntu-latest} and {@code ubuntu-24.04-arm}.
  • + *
+ */ +public class StrictMathGoldenTableTest { + + /** Golden results by function name, in probe order. */ + private static Map golden; + + /** The committed digest of each function's argument bits. */ + private static Map argDigest; + + /** Total data rows loaded, for the "nothing was measured" guard. */ + private static int goldenRows; + + @BeforeClass + public static void loadGolden() throws IOException { + golden = new LinkedHashMap(); + argDigest = new LinkedHashMap(); + goldenRows = 0; + InputStream in = StrictMathGoldenTableTest.class.getClassLoader() + .getResourceAsStream(GenerateStrictMathGoldenTable.RESOURCE); + assertNotNull("golden table missing from the classpath at " + + GenerateStrictMathGoldenTable.RESOURCE + + " - regenerate it with GenerateStrictMathGoldenTable, and read that class's" + + " javadoc before doing so", in); + BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8")); + try { + String line; + String fn = null; + long[] buf = null; + int at = 0; + while ((line = r.readLine()) != null) { + if (line.length() == 0 || line.charAt(0) == '#') { + continue; + } + if (line.charAt(0) == '@') { + if (fn != null && at != buf.length) { + fail("golden section @" + fn + " declares " + buf.length + + " results but only " + at + " were present before @-line: " + line); + } + String[] head = line.substring(1).trim().split("\\s+"); + if (head.length != 3) { + fail("malformed golden section header, want '@fn count argdigest': " + line); + } + fn = head[0]; + buf = new long[Integer.parseInt(head[1])]; + argDigest.put(fn, Long.valueOf(new BigInteger(head[2], 16).longValue())); + at = 0; + if (golden.put(fn, buf) != null) { + fail("golden table declares @" + fn + " twice"); + } + continue; + } + if (buf == null) { + fail("golden data line before any @-section: " + line); + } + if (at == buf.length) { + fail("golden section @" + fn + " has more results than its declared " + + buf.length); + } + // Long.parseLong rejects anything with the sign bit set, which is half of all + // doubles - hence BigInteger rather than the obvious call. + buf[at++] = new BigInteger(line.trim(), 16).longValue(); + goldenRows++; + } + if (fn != null && at != buf.length) { + fail("golden section @" + fn + " declares " + buf.length + " results but the file" + + " ended after " + at + " - it is truncated"); + } + } finally { + r.close(); + } + // A truncated or empty table must not read as a pass. Same guard the benchmark module's + // recordAll() applies: refuse to report a result when nothing was measured. + assertTrue("the golden table carries only " + goldenRows + " results, which is far too few" + + " to be the real table - it was probably truncated", goldenRows > 30000); + } + + // ------------------------------------------------------------------ + + /** + * Prints what the JVM under test actually is, including whether {@code StrictMath.sin} is a JNI + * call into compiled fdlibm or the pure-Java {@code FdLibm} port. + * + *

Not decoration. JDK 21 rewrote {@code StrictMath.sin/cos/tan} from JNI-into-fdlibm + * to pure Java, so a pass on 21 says nothing on its own about 8, 11 or 17 - those exercise a + * different implementation, in a different language, reached through a different mechanism. + * Recording which one ran is what lets a green run be cited as evidence about a particular JDK + * rather than about JDKs in general. + * + *

Measured with exactly this method: {@code sin}/{@code cos}/{@code tan} are + * native on Temurin 8 ({@code os.arch=x86_64}), Temurin 11 ({@code os.arch=aarch64}) + * and Temurin 17.0.20, and pure Java on Temurin 21 and OpenJDK 26. Corroborated + * by {@code jimage}: {@code java.lang.FdLibm$Sin} does not exist in a JDK 17 image, which ships + * five {@code FdLibm} nested classes against 21's twenty-three. + * + *

Worth noting that the migration was not all-at-once, and the boundary is + * per function: on 11, {@code pow} and {@code exp} are already pure Java while + * {@code sin}, {@code cos}, {@code tan} and {@code log} are still native; on 17, {@code log} is + * still native alongside the three trig functions. So there is no single "the JDK that + * made {@code StrictMath} pure Java" - the trig boundary is 21 - which is the sort of detail + * that makes inferring one JDK's behaviour, or one function's, from another's a bad idea. + */ + @Test + public void reportTheImplementationUnderTest() throws Exception { + StringBuilder sb = new StringBuilder(); + sb.append("determinism: java.version=").append(System.getProperty("java.version")) + .append(" vendor=").append(System.getProperty("java.vm.vendor")) + .append(" os.arch=").append(System.getProperty("os.arch")) + .append(" os.name=").append(System.getProperty("os.name")) + .append('\n'); + String[] fns = {"sin", "cos", "tan", "pow", "exp", "log"}; + for (int i = 0; i < fns.length; i++) { + Class[] sig = "pow".equals(fns[i]) + ? new Class[]{double.class, double.class} + : new Class[]{double.class}; + Method m = StrictMath.class.getDeclaredMethod(fns[i], sig); + sb.append(" StrictMath.").append(fns[i]).append(": ") + .append(Modifier.isNative(m.getModifiers()) ? "native (JNI fdlibm)" : "pure Java") + .append('\n'); + } + System.out.print(sb); + // Not asserted either way: both implementations are legitimate and the golden covers both. + // The printed output is the deliverable. + } + + /** + * Every function's declared row count matches what the probe generator produces. + * + *

Run before the value assertions in reading order, because a count mismatch explains a + * value mismatch and not the other way round. If the probe set is edited without regenerating + * the table, this is the failure that should be believed. + */ + @Test + public void everySectionMatchesTheProbeSetSoTheTableCannotBeMisaligned() { + List problems = new ArrayList(); + for (int f = 0; f < TranscendentalProbes.UNARY.length; f++) { + String fn = TranscendentalProbes.UNARY[f]; + long[] g = golden.get(fn); + int want = TranscendentalProbes.unaryProbes(fn).length; + if (g == null) { + problems.add("@" + fn + " missing from the golden table"); + } else if (g.length != want) { + problems.add("@" + fn + " has " + g.length + " results but the probe set now" + + " generates " + want + " arguments"); + } else { + checkDigest(problems, fn, TranscendentalProbes.unaryProbes(fn)); + } + } + double[] allPairs = TranscendentalProbes.binaryProbes(); + int pairs = allPairs.length / 2; + for (int f = 0; f < TranscendentalProbes.BINARY.length; f++) { + String fn = TranscendentalProbes.BINARY[f]; + long[] g = golden.get(fn); + if (g == null) { + problems.add("@" + fn + " missing from the golden table"); + } else if (g.length != pairs) { + problems.add("@" + fn + " has " + g.length + " results but the probe set now" + + " generates " + pairs + " argument pairs"); + } else { + checkDigest(problems, fn, allPairs); + } + } + int expectedSections = TranscendentalProbes.UNARY.length + TranscendentalProbes.BINARY.length; + if (golden.size() != expectedSections) { + problems.add("the golden table has " + golden.size() + " sections, expected " + + expectedSections + " - extra sections: " + golden.keySet()); + } + if (!problems.isEmpty()) { + fail("the committed golden table no longer describes the probe set. Regenerate it with" + + " GenerateStrictMathGoldenTable - and read that class's javadoc, because a" + + " regenerated table is a new claim that has to be re-verified on a native-" + + "StrictMath JDK and on both architectures. Problems:\n " + + join(problems, "\n ")); + } + System.out.println("determinism: golden table has " + goldenRows + " results across " + + golden.size() + " functions; every section's row count AND argument digest match" + + " the probe set"); + } + + /** + * Compares a probe list's argument digest against the committed one. + * + *

The distinct failure text matters. A count mismatch means somebody edited the probe set and + * forgot to regenerate; a digest mismatch with a matching count means the same code + * produced different arguments on this JVM, which is a far more interesting fact and points at a + * platform-dependent expression in the generator rather than at an oversight. + * + * @param problems accumulator + * @param fn the function name + * @param xs the regenerated arguments + */ + private static void checkDigest(List problems, String fn, double[] xs) { + long want = TranscendentalProbes.digest(xs); + Long have = argDigest.get(fn); + if (have == null) { + problems.add("@" + fn + " has no committed argument digest"); + } else if (have.longValue() != want) { + problems.add(String.format( + "@%s argument digest is 0x%016x in the table but this JVM generates 0x%016x" + + " from the same code. The row COUNT matches, so this is not a" + + " forgotten regeneration - some expression in TranscendentalProbes is" + + " platform-dependent. Math.toRadians was exactly this (1 ulp" + + " difference between Java 8 and 9+ on 25%% of whole degrees); check" + + " for anything similar before touching the golden.", + fn, have, Long.valueOf(want))); + } + } + + /** + * Every {@code StrictMath} result matches the committed golden, bit for bit. + */ + @Test + public void strictMathIsBitIdenticalToTheGolden() { + int checked = 0; + int nanPayloadDiffs = 0; + for (int f = 0; f < TranscendentalProbes.UNARY.length; f++) { + String fn = TranscendentalProbes.UNARY[f]; + long[] g = golden.get(fn); + double[] xs = TranscendentalProbes.unaryProbes(fn); + for (int i = 0; i < xs.length && i < g.length; i++) { + long got = Double.doubleToRawLongBits( + TranscendentalProbes.strictUnary(fn, xs[i])); + if (got != g[i]) { + if (bothNaN(g[i], got)) { + nanPayloadDiffs++; + } else { + fail(describeUnary("StrictMath", fn, i, xs[i], g[i], got)); + } + } + checked++; + } + } + double[] pairs = TranscendentalProbes.binaryProbes(); + for (int f = 0; f < TranscendentalProbes.BINARY.length; f++) { + String fn = TranscendentalProbes.BINARY[f]; + long[] g = golden.get(fn); + for (int i = 0; i + 1 < pairs.length && i / 2 < g.length; i += 2) { + long got = Double.doubleToRawLongBits( + TranscendentalProbes.strictBinary(fn, pairs[i], pairs[i + 1])); + if (got != g[i / 2]) { + if (bothNaN(g[i / 2], got)) { + nanPayloadDiffs++; + } else { + fail(describeBinary("StrictMath", fn, i / 2, pairs[i], pairs[i + 1], + g[i / 2], got)); + } + } + checked++; + } + } + assertEquals("every golden result must have been evaluated", goldenRows, checked); + System.out.println("determinism: " + checked + + " StrictMath comparisons against the committed golden, zero value mismatches; " + + nanPayloadDiffs + " rows differed in NaN payload only (see" + + " NanBitPatternTest - that is architecture-dependent and outside the guarantee)"); + } + + /** + * Whether two raw bit patterns are both NaN, and therefore differ only in payload. + * + *

The one place a raw-bit comparison has to be relaxed, and why it is not a loophole

+ * + *

Java specifies that these functions return NaN for certain inputs. It does not + * specify which NaN. Measured on Temurin 11.0.32, holding the JDK fixed and varying only + * the instruction set: {@code Inf - Inf}, {@code Inf * 0.0}, {@code Inf / Inf} and + * {@code sqrt(-1)} all produce {@code 0xfff8000000000000} on x86-64 and + * {@code 0x7ff8000000000000} on AArch64 - the hardware's default NaN, whose sign bit differs + * between the two. fdlibm computes {@code sin(Inf)} as {@code x - x}, so it inherits that + * difference, and so does every faithful transcription of it including + * {@link FastStrictTrig}. See {@link NanBitPatternTest} for the full table. + * + *

The relaxation is deliberately as narrow as it can be: both sides must be NaN, the count is + * reported rather than hidden, and any pair where one side is a number still fails. So a + * regression that turned a finite result into NaN - which is exactly the fail-closed sentinel and + * therefore a real risk - is caught, while an unspecifiable payload difference is not reported as + * a determinism defect it is not. + * + * @param a one raw bit pattern + * @param b the other + * @return true if both are NaN + */ + private static boolean bothNaN(long a, long b) { + return Double.isNaN(Double.longBitsToDouble(a)) && Double.isNaN(Double.longBitsToDouble(b)); + } + + /** + * {@link FastStrictTrig} matches the same golden for the three functions it implements. + * + *

Both entry points are checked: the allocation-free {@code Scratch} overload as well as the + * plain one. They share a kernel, but the whole reason the overload exists is to let a caller + * hoist the carrier array out of a loop, and a divergence between the two would be exactly the + * kind of defect that only shows up under reuse. + */ + @Test + public void fastStrictTrigIsBitIdenticalToTheGolden() { + FastStrictTrig.Scratch scratch = new FastStrictTrig.Scratch(); + int checked = 0; + String[] trig = {"sin", "cos", "tan"}; + for (int f = 0; f < trig.length; f++) { + String fn = trig[f]; + long[] g = golden.get(fn); + double[] xs = TranscendentalProbes.unaryProbes(fn); + for (int i = 0; i < xs.length && i < g.length; i++) { + double plain; + double reused; + if ("sin".equals(fn)) { + plain = FastStrictTrig.sin(xs[i]); + reused = FastStrictTrig.sin(xs[i], scratch); + } else if ("cos".equals(fn)) { + plain = FastStrictTrig.cos(xs[i]); + reused = FastStrictTrig.cos(xs[i], scratch); + } else { + plain = FastStrictTrig.tan(xs[i]); + reused = FastStrictTrig.tan(xs[i], scratch); + } + long gotPlain = Double.doubleToRawLongBits(plain); + long gotReused = Double.doubleToRawLongBits(reused); + if (gotPlain != g[i] && !bothNaN(g[i], gotPlain)) { + fail(describeUnary("FastStrictTrig", fn, i, xs[i], g[i], gotPlain)); + } + if (gotReused != g[i] && !bothNaN(g[i], gotReused)) { + fail(describeUnary("FastStrictTrig(+Scratch)", fn, i, xs[i], g[i], gotReused)); + } + // The two overloads must agree with EACH OTHER exactly, NaN payload included: they + // run on the same hardware in the same JVM, so there is no architecture excuse here + // and a payload difference between them would be a real defect in the Scratch path. + assertEquals("FastStrictTrig." + fn + " and its Scratch overload disagree at probe " + + i + " (arg 0x" + Long.toHexString( + Double.doubleToRawLongBits(xs[i])) + ")", + gotPlain, gotReused); + checked += 2; + } + } + // If the trig sections ever vanish from the golden this loop would silently become a no-op. + // Assert a floor rather than trusting that it found work. + assertTrue("expected a substantial sin/cos/tan population in the golden, compared only " + + checked, checked > 20000); + System.out.println("determinism: " + checked + + " FastStrictTrig raw-bit comparisons against the same golden, zero mismatches"); + } + + /** + * The negative control: measures how far {@code Math} diverges from the golden, and writes the + * tally where CI can assert on it across legs. + * + *

Why this reports rather than asserts, which is a correction to the obvious design

+ * + *

The first version failed the build when {@code Math} and {@code StrictMath} agreed too + * closely, on the reasoning that a golden they both satisfy cannot distinguish them and so proves + * nothing. That reasoning is sound about the matrix and wrong about a single JVM, and + * running it on four JDKs is what showed why. Measured over all 54,627 probes: + * + * + * + * + * + * + * + * + * + * + *
rows where {@code Math} differs from the {@code StrictMath} golden
JDK / archdivergent functions
Temurin 11, AArch64none at all - 0 of 54,627, every function
Temurin 21, AArch64{@code sin} 158 (2.14%), {@code cos} 140 (1.89%); everything else 0
OpenJDK 26, AArch64identical to 21
+ * + *

So on Temurin 11/AArch64 there is no threshold this method could assert without + * failing, and the failure would be reporting a non-defect: {@code Math} being bit-identical to + * {@code StrictMath} on some platform is a perfectly legitimate state of the world, and one the + * policy has to tolerate because the policy's job is to be correct on the platforms where they + * do differ. An in-leg assertion here would have shipped a permanently red JDK 11 leg, + * and a permanently red gate is a disabled gate. + * + *

Non-vacuity therefore has to be established two other ways, and both are stronger: + * + *

    + *
  1. Across the matrix, not within a leg. The tally is written to + * {@code target/determinism/math-divergence.tsv} and + * {@code .github/workflows/determinism.yaml} asserts that at least one leg diverges. That + * is the assertion the original design wanted, placed where it is actually true.
  2. + *
  3. {@link FastStrictTrig} is an independent implementation. An 800-line hand + * transcription agreeing with the same table on 44,394 raw-bit comparisons cannot happen if + * the table is garbage. This holds in every leg and does not depend on {@code Math} at + * all, which makes it the load-bearing non-vacuity argument rather than a backup.
  4. + *
+ * + *

One genuinely surprising row is worth keeping: {@code sin} and {@code cos} diverge on 21 and + * 26 but not on 11, on the same hardware. HotSpot's {@code sin}/{@code cos} intrinsics changed + * between those releases. That is precisely the "at the margin, across JIT tiers and releases" + * variation the policy exists to be immune to - observed, not assumed. + * + * @throws IOException if the tally cannot be written + */ + @Test + public void measureMathDivergenceFromTheGolden() throws IOException { + Map tally = new LinkedHashMap(); // fn -> {differing, total} + for (int f = 0; f < TranscendentalProbes.UNARY.length; f++) { + String fn = TranscendentalProbes.UNARY[f]; + long[] g = golden.get(fn); + double[] xs = TranscendentalProbes.unaryProbes(fn); + int[] t = new int[2]; + tally.put(fn, t); + for (int i = 0; i < xs.length && i < g.length; i++) { + t[1]++; + if (Double.doubleToRawLongBits(TranscendentalProbes.mathUnary(fn, xs[i])) != g[i]) { + t[0]++; + } + } + } + double[] pairs = TranscendentalProbes.binaryProbes(); + for (int f = 0; f < TranscendentalProbes.BINARY.length; f++) { + String fn = TranscendentalProbes.BINARY[f]; + long[] g = golden.get(fn); + int[] t = new int[2]; + tally.put(fn, t); + for (int i = 0; i + 1 < pairs.length && i / 2 < g.length; i += 2) { + t[1]++; + if (Double.doubleToRawLongBits( + TranscendentalProbes.mathBinary(fn, pairs[i], pairs[i + 1])) != g[i / 2]) { + t[0]++; + } + } + } + + int totalDiff = 0; + int totalRows = 0; + StringBuilder human = new StringBuilder( + "determinism: Math vs the StrictMath golden on this JVM:\n"); + StringBuilder tsv = new StringBuilder(); + tsv.append("# Math-vs-StrictMath divergence. Written per CI leg; the cross-leg job asserts\n"); + tsv.append("# that at least one leg diverges, which is the non-vacuity check that cannot be\n"); + tsv.append("# made inside a single leg - see measureMathDivergenceFromTheGolden's javadoc.\n"); + tsv.append("javaVersion\t").append(System.getProperty("java.version")).append('\n'); + tsv.append("osArch\t").append(System.getProperty("os.arch")).append('\n'); + tsv.append("vmVendor\t").append(System.getProperty("java.vm.vendor")).append('\n'); + tsv.append("fn\tdiffering\ttotal\tintrinsicExpected\n"); + for (Map.Entry e : tally.entrySet()) { + int[] t = e.getValue(); + totalDiff += t[0]; + totalRows += t[1]; + double pct = t[1] == 0 ? 0.0 : 100.0 * t[0] / t[1]; + boolean intrinsified = isIntrinsified(e.getKey()); + human.append(String.format(" %-6s %7d / %7d differ (%6.2f%%) %s%n", + e.getKey(), Integer.valueOf(t[0]), Integer.valueOf(t[1]), + Double.valueOf(pct), intrinsified ? "intrinsic expected" : "delegates today")); + tsv.append(e.getKey()).append('\t').append(t[0]).append('\t').append(t[1]) + .append('\t').append(intrinsified).append('\n'); + } + human.append(String.format(" TOTAL %7d / %7d differ (%6.4f%%)%n", + Integer.valueOf(totalDiff), Integer.valueOf(totalRows), + Double.valueOf(totalRows == 0 ? 0.0 : 100.0 * totalDiff / totalRows))); + tsv.append("TOTAL\t").append(totalDiff).append('\t').append(totalRows).append("\t-\n"); + System.out.print(human); + + File dir = new File(System.getProperty("proj4j.determinism.outDir", "target/determinism")); + if (dir.isDirectory() || dir.mkdirs()) { + Writer w = new OutputStreamWriter( + new FileOutputStream(new File(dir, "math-divergence.tsv")), "UTF-8"); + try { + w.write(tsv.toString()); + } finally { + w.close(); + } + } else { + // Not a failure. The measurement is in the log either way, and a test that cannot write + // to the build directory is a build-layout problem, not a determinism finding. + System.out.println("determinism: could not create " + dir + + "; the tally above is still the record"); + } + + // The only in-leg assertion, and it is about this method's own coverage rather than about + // Math: every golden result must have been compared against something. + assertEquals("the divergence measurement must cover every golden result", + goldenRows, totalRows); + } + + /** + * The one case in the corpus where the {@code Math}-versus-{@code StrictMath} choice decides a + * conformance verdict, pinned at the level of the {@code sin} call rather than the projection. + * + *

Why pin it here and not only in the adams tests

+ * + *

Because this file is where the policy is defended and the projection tests are where it is + * consumed. Pinned here, the value stays checkable while {@code proj/**} is being edited, and + * the failure message can explain the amplification rather than just report a moved coordinate. + */ + @Test + public void theAdamsWs2WitnessIsPinnedToStrictMath() { + double lamOverTwo = StrictMath.toRadians(179.999) / 2.0; + double strict = StrictMath.sin(lamOverTwo); + double fast = FastStrictTrig.sin(lamOverTwo); + double loose = Math.sin(lamOverTwo); + + assertEquals("FastStrictTrig must agree with StrictMath at the adams_ws2 witness point," + + " because this single value is a large part of why the class exists", + Double.doubleToRawLongBits(strict), Double.doubleToRawLongBits(fast)); + + long sBits = Double.doubleToRawLongBits(strict); + long mBits = Double.doubleToRawLongBits(loose); + System.out.printf( + "determinism: adams_ws2 witness sin(%s)%n" + + " StrictMath 0x%016x %s%n" + + " FastStrictTrig 0x%016x (asserted identical)%n" + + " Math 0x%016x %s (%d ulp away)%n", + Double.toString(lamOverTwo), + Long.valueOf(sBits), Double.toString(strict), + Long.valueOf(Double.doubleToRawLongBits(fast)), + Long.valueOf(mBits), Double.toString(loose), + Long.valueOf(Math.abs(sBits - mBits))); + + // Deliberately NOT asserted as "Math differs here". Whether HotSpot's sin intrinsic differs + // from fdlibm at this exact argument is a property of the JIT and the architecture - it is + // precisely the thing that is allowed to vary, and on some platform the two may coincide at + // this point while differing elsewhere. Asserting a difference would red the build on a + // platform where the policy simply is not needed at that one argument, which is not a + // defect. The population-level guarantee is the negative control's job; this method's job is + // to pin FastStrictTrig to StrictMath at the argument the corpus made load-bearing, and to + // print the divergence so a change is visible in the log. + assertTrue("sanity: the witness argument must reach the reduction path, not the" + + " |x| < pi/4 short circuit", Math.abs(lamOverTwo) > Math.PI / 4.0); + } + + // ------------------------------------------------------------------ + + /** + * Whether HotSpot substitutes a platform-specific implementation for {@code Math.} on + * mainstream architectures, and therefore whether {@code Math} is expected to diverge. + * + * @param fn the function name + * @return true if an intrinsic exists on x86-64 or AArch64 today + */ + private static boolean isIntrinsified(String fn) { + // Per numerics.md's Math-vs-StrictMath table. tanh is excluded although it gained an + // intrinsic in JDK 21: requiring divergence for it would fail this test on 8, 11 and 17 for + // a reason that is not a defect. + return "sin".equals(fn) || "cos".equals(fn) || "tan".equals(fn) + || "log".equals(fn) || "log10".equals(fn) || "exp".equals(fn) || "pow".equals(fn); + } + + private static String describeUnary(String who, String fn, int i, double x, + long expected, long got) { + return String.format( + "%s.%s(%s) at probe index %d [arg 0x%016x]: golden 0x%016x (%s), got 0x%016x (%s)", + who, fn, Double.toString(x), Integer.valueOf(i), + Long.valueOf(Double.doubleToRawLongBits(x)), + Long.valueOf(expected), Double.toString(Double.longBitsToDouble(expected)), + Long.valueOf(got), Double.toString(Double.longBitsToDouble(got))); + } + + private static String describeBinary(String who, String fn, int i, double x, double y, + long expected, long got) { + return String.format( + "%s.%s(%s, %s) at pair index %d [args 0x%016x, 0x%016x]:" + + " golden 0x%016x (%s), got 0x%016x (%s)", + who, fn, Double.toString(x), Double.toString(y), Integer.valueOf(i), + Long.valueOf(Double.doubleToRawLongBits(x)), + Long.valueOf(Double.doubleToRawLongBits(y)), + Long.valueOf(expected), Double.toString(Double.longBitsToDouble(expected)), + Long.valueOf(got), Double.toString(Double.longBitsToDouble(got))); + } + + private static String join(List parts, String sep) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < parts.size(); i++) { + if (i > 0) { + sb.append(sep); + } + sb.append(parts.get(i)); + } + return sb.toString(); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/determinism/TranscendentalProbes.java b/core/src/test/java/org/locationtech/proj4j/determinism/TranscendentalProbes.java new file mode 100644 index 0000000..060fa0b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/determinism/TranscendentalProbes.java @@ -0,0 +1,597 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.determinism; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * The probe arguments for the {@code StrictMath} golden table, generated by code rather than + * checked in. + * + *

Deliberate: the generator + * ({@link GenerateStrictMathGoldenTable}) and the assertion + * ({@link StrictMathGoldenTableTest}) both call into here, so the committed golden's + * arguments can never drift from the arguments the test evaluates. Only the + * results are committed. If the two lists could drift, a golden file would silently + * describe inputs nobody tests any more, and the test would pass while measuring nothing. + * + *

Every list is a pure function of constants and fixed-seed {@link Random} streams, so it is + * identical on every JVM and every architecture. That property is load-bearing: the whole point of + * the golden is that an x86-64 leg and an AArch64 leg evaluate the same arguments. + * + *

Why these arguments

+ * + *

A random sweep alone is a poor test of a transcendental, because the interesting behaviour is + * concentrated at branch boundaries that random sampling essentially never hits. The probe set is + * therefore three-layered: + * + *

    + *
  1. The real workload. Latitudes and longitudes in radians on whole and fractional + * degrees, eccentricity-scale quantities for the ellipsoids proj4j ships, and the + * conformal/authalic-latitude intermediates. This is what proj4j actually evaluates.
  2. + *
  3. Branch boundaries. Every {@code k*pi/4} with immediate {@code nextUp}/{@code + * nextDown} neighbours (argument reduction), the fdlibm kernel thresholds + * ({@code 2^-27}, {@code 2^-28}, {@code 2^19*(pi/2)}), the {@code log}/{@code log1p} + * poly-vs-table split near 1, {@code pow}'s special-value fast paths, and the domain edges of + * {@code asin}/{@code acos}.
  4. + *
  5. Special values. Signed zero, both infinities, NaN. These are compared on raw bits, + * so {@code -0.0} is distinguished from {@code +0.0} - a real distinction at the equator and + * the antimeridian.
  6. + *
+ */ +final class TranscendentalProbes { + + private TranscendentalProbes() { + } + + /** + * Degrees to radians, as an explicit multiply rather than {@link Math#toRadians(double)}. + * + *

Not a style preference - {@code Math.toRadians} is not bit-stable across JDKs

+ * + *

Measured here, and it invalidated the first version of this probe set. Java 8 computes + * {@code angdeg / 180.0 * PI}; Java 9 changed it to a multiply by a precomputed + * {@code DEGREES_TO_RADIANS} constant. The two differ by 1 ulp on 182 of the 721 whole + * degrees in [-360, 360], which is 25% of them. So a probe list built with + * {@code Math.toRadians} is a different list on Java 8 than on Java 9+, and the golden + * table's results are then being compared against arguments that were never evaluated. That + * presented as an apparent 64-ulp {@code StrictMath.sin} divergence on JDK 8 - which would have + * been a serious finding had it been real. It was not: {@code StrictMath.sin} is bit-identical on + * 8, 11, 21 and 26; only the argument had moved. + * + *

The constant below is {@code Math.PI / 180.0}, which is bit-identical to Java 9+'s + * {@code DEGREES_TO_RADIANS} and to {@code ProjectionMath.DTR}. It is spelled out rather than + * referenced so this class depends on nothing that another stream might edit. + * + * @param deg an angle in degrees + * @return the angle in radians + */ + static double deg2rad(double deg) { + return deg * 0.017453292519943295; + } + + /** Fixed so a failure is reproducible. Same constant the trig identity sweep uses. */ + static final long SEED = 0x50524f4a344aL; // "PROJ4J" + + /** The functions the golden covers, in the order the table is written. */ + static final String[] UNARY = { + "sin", "cos", "tan", + "asin", "acos", "atan", + "exp", "log", "log10", "log1p", "expm1", + "sinh", "cosh", "tanh", + "cbrt", "sqrt", + }; + + /** Two-argument functions, evaluated over pairs from {@link #binaryProbes()}. */ + static final String[] BINARY = {"atan2", "pow", "hypot"}; + + // ------------------------------------------------------------------ + // Unary probe sets, one per function, each restricted to that function's domain + // ------------------------------------------------------------------ + + /** + * The probe list for a unary function. + * + * @param fn one of {@link #UNARY} + * @return the arguments to evaluate, in a fixed order + */ + static double[] unaryProbes(String fn) { + List out = new ArrayList(); + if ("asin".equals(fn) || "acos".equals(fn)) { + addBounded(out); + } else if ("log".equals(fn) || "log10".equals(fn) || "sqrt".equals(fn)) { + addPositive(out); + } else if ("log1p".equals(fn)) { + addAboveMinusOne(out); + } else if (isPeriodic(fn)) { + addPeriodic(out); + } else { + addUnbounded(out); + } + addSpecials(out, fn); + return toArray(out); + } + + /** + * Whether a function reduces its argument modulo {@code pi/2}, and therefore needs the + * {@code k*pi/4} lattice. + * + *

The distinction is worth making rather than sweeping everything with everything. The + * lattice is ~5,000 probes and it is the only way to reach fdlibm's second and third + * reduction rounds, its {@code n = +/-1} special case and its cancellation check - but those + * branches exist solely in {@code sin}/{@code cos}/{@code tan}. Feeding the same 5,000 arguments + * to {@code cbrt} would multiply the committed golden's size by about four while testing + * nothing that a plain sweep does not already cover. + * + * @param fn the function name + * @return true for the periodic family + */ + private static boolean isPeriodic(String fn) { + return "sin".equals(fn) || "cos".equals(fn) || "tan".equals(fn); + } + + /** + * Arguments in {@code [-1, 1]} - the domain of {@code asin}/{@code acos}, and the range that + * every {@code sin}/{@code cos} result feeds into. + * + *

The edges matter more than the interior here: {@code aasin}/{@code aacos} exist in proj4j + * precisely because ill-conditioned intermediates land a hair outside {@code [-1, 1]}, and the + * error semantics of that case are a documented 1.5.0 behaviour change. + */ + private static void addBounded(List out) { + // Exact edges and their immediate neighbours on both sides. + for (int s = -1; s <= 1; s += 2) { + out.add((double) s); + out.add(Math.nextDown((double) s) * 1.0); + out.add(Math.nextUp(-1.0) * (s == -1 ? 1.0 : -1.0)); + } + out.add(0.0); + out.add(-0.0); + // Deliberately NOT seeded with StrictMath.sin(deg2rad(deg)), although those are the values + // proj4j really feeds to asin/acos. Generating a probe with the function under test makes + // the probe list circular: if StrictMath.sin ever moved, the arguments AND the expected + // results would both move and the failure would be unreadable. The uniform sweep and random + // fill below cover [-1, 1] densely enough without that coupling. + // Uniform interior sweep plus a fixed-seed random fill. + for (int i = -256; i <= 256; i++) { + out.add(i / 256.0); + } + Random r = new Random(SEED ^ 0x5A5AL); + for (int i = 0; i < 1024; i++) { + out.add(r.nextDouble() * 2.0 - 1.0); + } + // Subnormal and tiny, where the polynomial short circuits. + out.add(Double.MIN_VALUE); + out.add(-Double.MIN_VALUE); + out.add(0x1.0p-27); + out.add(0x1.0p-28); + out.add(Math.nextDown(0x1.0p-27)); + } + + /** Strictly positive arguments, for {@code log}, {@code log10} and {@code sqrt}. */ + private static void addPositive(List out) { + out.add(1.0); + out.add(Math.nextUp(1.0)); + out.add(Math.nextDown(1.0)); + out.add(2.0); + out.add(0.5); + out.add(10.0); + out.add(Math.E); + out.add(Math.PI); + out.add(Double.MIN_VALUE); + out.add(Double.MIN_NORMAL); + out.add(Double.MAX_VALUE); + // Powers of two straddle log's exponent extraction. + for (int k = -1074; k <= 1023; k += 37) { + out.add(StrictMath.pow(2.0, k)); + } + // The 1 +/- eps neighbourhood, where log switches from the table to the poly. + for (int i = 1; i <= 64; i++) { + out.add(1.0 + i * 0x1.0p-52); + out.add(1.0 - i * 0x1.0p-53); + } + // Ellipsoid-scale quantities: 1-es, 1-e, (1-e)/(1+e) for what proj4j ships. + for (int i = 0; i < ES.length; i++) { + double es = ES[i]; + double e = StrictMath.sqrt(es); + out.add(1.0 - es); + out.add(1.0 - e); + out.add((1.0 - e) / (1.0 + e)); + out.add(1.0 + e); + } + Random r = new Random(SEED ^ 0x0F0FL); + for (int i = 0; i < 1024; i++) { + // Log-uniform over the whole positive range: exercises every exponent. + out.add(StrictMath.pow(2.0, r.nextDouble() * 2000.0 - 1000.0) * (1.0 + r.nextDouble())); + } + } + + /** Arguments greater than {@code -1}, for {@code log1p}. */ + private static void addAboveMinusOne(List out) { + out.add(-1.0); + out.add(Math.nextUp(-1.0)); + out.add(0.0); + out.add(-0.0); + out.add(Math.nextUp(0.0)); + out.add(Math.nextDown(0.0)); + // The small-argument regime is the reason log1p exists at all; sweep it densely. + for (int k = -60; k <= 0; k++) { + out.add(StrictMath.pow(2.0, k)); + out.add(-StrictMath.pow(2.0, k) * 0.5); + } + for (int i = -512; i <= 512; i++) { + out.add(i * 0x1.0p-30); + } + out.add(Double.MAX_VALUE); + Random r = new Random(SEED ^ 0x3C3CL); + for (int i = 0; i < 1024; i++) { + out.add(StrictMath.pow(2.0, r.nextDouble() * 60.0 - 40.0) * (r.nextBoolean() ? 1 : -1) * 0.5); + } + } + + /** + * Arguments over the whole double range for functions that do not reduce modulo + * {@code pi/2}: {@code atan}, {@code exp}, {@code expm1}, {@code sinh}, {@code cosh}, + * {@code tanh}, {@code cbrt}. + */ + private static void addUnbounded(List out) { + addCommonRealLine(out); + Random r = new Random(SEED ^ 0x1234L); + for (int i = 0; i < 1024; i++) { + out.add(r.nextDouble() * 8.0 * Math.PI - 4.0 * Math.PI); + } + Random r2 = new Random(SEED ^ 0x9876L); + for (int i = 0; i < 768; i++) { + out.add(StrictMath.pow(2.0, r2.nextDouble() * 120.0 - 60.0) * (r2.nextBoolean() ? 1 : -1)); + } + } + + /** + * Arguments for {@code sin}, {@code cos} and {@code tan}: everything + * {@link #addUnbounded(List)} covers, plus the {@code k*pi/4} lattice. + * + *

The lattice is the important part and it is the reason this list is separate. fdlibm's + * {@code sin}/{@code cos}/{@code tan} reduce modulo {@code pi/2}, and every branch of that + * reduction - the {@code |x| ~< pi/4} short circuit, the {@code n = +/-1} special case, the + * cancellation check, and the second and third reduction rounds - is selected by how close the + * argument sits to a multiple of {@code pi/4}. Random arguments hit exactly none of them, so a + * sweep without the lattice would leave the branches that actually differ between + * implementations completely untested while looking thorough. + */ + private static void addPeriodic(List out) { + addCommonRealLine(out); + // The k*pi/4 and k*pi/2 lattice with two neighbours either side. + for (int k = -256; k <= 256; k++) { + addNeighbourhood(out, k * (Math.PI / 4.0)); + addNeighbourhood(out, k * (Math.PI / 2.0)); + } + // fdlibm's own kernel thresholds and the multi-word reduction entry point. + out.add(0x1.0p-27); + out.add(0x1.0p-28); + out.add(Math.nextDown(0x1.0p-27)); + out.add(Math.nextUp(0x1.0p-28)); + addNeighbourhood(out, 0x1.0p19 * (Math.PI / 2.0)); + // __kernel_rem_pio2's multi-word limb arithmetic, including its recomputation loop and the + // textbook worst case for argument reduction. + out.add(6381956970095103.0 * StrictMath.pow(2.0, 797)); + for (int k = 0; k <= 1000; k += 25) { + out.add(Math.PI * StrictMath.pow(2.0, k)); + } + Random r = new Random(SEED ^ 0x1234L); + for (int i = 0; i < 1024; i++) { + out.add(r.nextDouble() * 8.0 * Math.PI - 4.0 * Math.PI); + } + Random r2 = new Random(SEED ^ 0x9876L); + for (int i = 0; i < 768; i++) { + out.add(StrictMath.pow(2.0, r2.nextDouble() * 120.0 - 60.0) * (r2.nextBoolean() ? 1 : -1)); + } + } + + /** The part of the real-line sweep every unbounded function shares. */ + private static void addCommonRealLine(List out) { + out.add(0.0); + out.add(-0.0); + // Latitudes and longitudes in radians, on whole and part degrees: the real workload. + for (int deg = -180; deg <= 180; deg++) { + out.add(deg2rad(deg)); + } + for (int i = 0; i < FRACTIONAL_DEGREES.length; i++) { + out.add(deg2rad(FRACTIONAL_DEGREES[i])); + out.add(deg2rad(-FRACTIONAL_DEGREES[i])); + } + out.add(1.0e10); + out.add(1.0e100); + out.add(Double.MAX_VALUE); + out.add(-Double.MAX_VALUE); + out.add(Double.MIN_VALUE); + out.add(-Double.MIN_VALUE); + out.add(Double.MIN_NORMAL); + // exp/sinh/cosh overflow and underflow edges, to the last representable double. + out.add(709.782712893384); + out.add(710.0); + out.add(-745.1332191019411); + out.add(-746.0); + out.add(-0x1.74385446d71c3p9); + } + + private static void addNeighbourhood(List out, double x) { + double up = x; + double down = x; + out.add(x); + for (int i = 0; i < 2; i++) { + up = Math.nextUp(up); + down = Math.nextDown(down); + out.add(up); + out.add(down); + } + } + + /** + * Special values. + * + *

Included for every function, in the domain-restricted lists too: a function asked for + * {@code asin(2.0)} must return {@code NaN} identically everywhere, and that is exactly the + * kind of edge where an implementation substitution shows up. + */ + private static void addSpecials(List out, String fn) { + out.add(Double.NaN); + out.add(Double.POSITIVE_INFINITY); + out.add(Double.NEGATIVE_INFINITY); + out.add(0.0); + out.add(-0.0); + if ("asin".equals(fn) || "acos".equals(fn)) { + out.add(2.0); + out.add(-2.0); + out.add(1.0 + 0x1.0p-52); + } + if ("log".equals(fn) || "log10".equals(fn) || "sqrt".equals(fn)) { + out.add(-1.0); + out.add(-0.5); + } + if ("log1p".equals(fn)) { + out.add(-2.0); + out.add(Math.nextDown(-1.0)); + } + } + + // ------------------------------------------------------------------ + // Binary probes + // ------------------------------------------------------------------ + + /** + * Pairs for {@code atan2}, {@code pow} and {@code hypot}, as a flat array of + * {@code [x0, y0, x1, y1, ...]}. + * + *

{@code pow}'s special-value fast paths are here on purpose. An earlier measurement on this + * project concluded {@code StrictMath.pow} allocates nothing, having only ever measured + * {@code y = 0.5}, which returns before the array declarations; the real figure on a general + * exponent is 96 B/op. The same trap applies to a bit-identity claim, so the exponent list + * spans the fast paths and the general path. + */ + static double[] binaryProbes() { + List out = new ArrayList(); + double[] mags = { + 0.0, -0.0, 1.0, -1.0, 0.5, 2.0, 3.0, 10.0, Math.PI, Math.E, + 1.0e-300, 1.0e300, Double.MIN_VALUE, Double.MIN_NORMAL, Double.MAX_VALUE, + Double.NaN, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, + 0x1.0p-27, 0x1.0p19, 6378137.0, 6356752.314245179, + }; + // Every ordered pair of the magnitude list: covers all sign and special-value combinations. + for (int i = 0; i < mags.length; i++) { + for (int j = 0; j < mags.length; j++) { + out.add(mags[i]); + out.add(mags[j]); + } + } + // atan2 across all four quadrants on whole degrees - the real geodetic workload. + for (int deg = -180; deg <= 180; deg++) { + double a = deg2rad(deg); + out.add(StrictMath.sin(a)); + out.add(StrictMath.cos(a)); + } + // pow exponents that matter to proj4j: the tsfn/phi2 family uses e/2 and 1/n exponents, + // and the special-value branches are y in {0, 0.5, 1, 2}. + double[] powY = {0.0, 0.5, 1.0, 2.0, -1.0, -0.5, 0.37, 1.0 / 3.0, 0.0818191908426215 / 2.0}; + for (int i = 0; i < ES.length; i++) { + double e = StrictMath.sqrt(ES[i]); + for (int j = 0; j < powY.length; j++) { + out.add((1.0 - e) / (1.0 + e)); + out.add(powY[j]); + } + } + // hypot with operands spanning many exponents apart, where the scaled form differs most + // from sqrt(x*x + y*y) - the substitution numerics.md prescribes for the hot path. + for (int k = -400; k <= 400; k += 17) { + out.add(1.0); + out.add(StrictMath.pow(2.0, k)); + } + Random r = new Random(SEED ^ 0xBEEFL); + for (int i = 0; i < 1024; i++) { + out.add(r.nextDouble() * 4.0 - 2.0); + out.add(r.nextDouble() * 4.0 - 2.0); + } + Random r2 = new Random(SEED ^ 0xCAFEL); + for (int i = 0; i < 512; i++) { + out.add(StrictMath.pow(2.0, r2.nextDouble() * 200.0 - 100.0)); + out.add(r2.nextDouble() * 6.0 - 3.0); + } + return toArray(out); + } + + // ------------------------------------------------------------------ + // Evaluation, shared so the generator and the test cannot disagree + // ------------------------------------------------------------------ + + /** + * Evaluates {@code StrictMath.(x)}. + * + * @param fn one of {@link #UNARY} + * @param x the argument + * @return the result + */ + static double strictUnary(String fn, double x) { + if ("sin".equals(fn)) return StrictMath.sin(x); + if ("cos".equals(fn)) return StrictMath.cos(x); + if ("tan".equals(fn)) return StrictMath.tan(x); + if ("asin".equals(fn)) return StrictMath.asin(x); + if ("acos".equals(fn)) return StrictMath.acos(x); + if ("atan".equals(fn)) return StrictMath.atan(x); + if ("exp".equals(fn)) return StrictMath.exp(x); + if ("log".equals(fn)) return StrictMath.log(x); + if ("log10".equals(fn)) return StrictMath.log10(x); + if ("log1p".equals(fn)) return StrictMath.log1p(x); + if ("expm1".equals(fn)) return StrictMath.expm1(x); + if ("sinh".equals(fn)) return StrictMath.sinh(x); + if ("cosh".equals(fn)) return StrictMath.cosh(x); + if ("tanh".equals(fn)) return StrictMath.tanh(x); + if ("cbrt".equals(fn)) return StrictMath.cbrt(x); + if ("sqrt".equals(fn)) return StrictMath.sqrt(x); + throw new IllegalArgumentException("unknown unary function: " + fn); + } + + /** + * Evaluates {@code Math.(x)} - the non-strict counterpart, used only as the negative + * control. + * + * @param fn one of {@link #UNARY} + * @param x the argument + * @return the result + */ + static double mathUnary(String fn, double x) { + if ("sin".equals(fn)) return Math.sin(x); + if ("cos".equals(fn)) return Math.cos(x); + if ("tan".equals(fn)) return Math.tan(x); + if ("asin".equals(fn)) return Math.asin(x); + if ("acos".equals(fn)) return Math.acos(x); + if ("atan".equals(fn)) return Math.atan(x); + if ("exp".equals(fn)) return Math.exp(x); + if ("log".equals(fn)) return Math.log(x); + if ("log10".equals(fn)) return Math.log10(x); + if ("log1p".equals(fn)) return Math.log1p(x); + if ("expm1".equals(fn)) return Math.expm1(x); + if ("sinh".equals(fn)) return Math.sinh(x); + if ("cosh".equals(fn)) return Math.cosh(x); + if ("tanh".equals(fn)) return Math.tanh(x); + if ("cbrt".equals(fn)) return Math.cbrt(x); + if ("sqrt".equals(fn)) return Math.sqrt(x); + throw new IllegalArgumentException("unknown unary function: " + fn); + } + + /** + * Evaluates {@code StrictMath.(x, y)}. + * + * @param fn one of {@link #BINARY} + * @param x the first argument + * @param y the second argument + * @return the result + */ + static double strictBinary(String fn, double x, double y) { + if ("atan2".equals(fn)) return StrictMath.atan2(x, y); + if ("pow".equals(fn)) return StrictMath.pow(x, y); + if ("hypot".equals(fn)) return StrictMath.hypot(x, y); + throw new IllegalArgumentException("unknown binary function: " + fn); + } + + /** + * Evaluates {@code Math.(x, y)} - the negative control. + * + * @param fn one of {@link #BINARY} + * @param x the first argument + * @param y the second argument + * @return the result + */ + static double mathBinary(String fn, double x, double y) { + if ("atan2".equals(fn)) return Math.atan2(x, y); + if ("pow".equals(fn)) return Math.pow(x, y); + if ("hypot".equals(fn)) return Math.hypot(x, y); + throw new IllegalArgumentException("unknown binary function: " + fn); + } + + // ------------------------------------------------------------------ + + /** + * Squared eccentricities of the ellipsoids that carry the most traffic, so the probes include + * the exact intermediates proj4j evaluates rather than only synthetic ones. + * + *

Values are computed from {@code a} and {@code rf} rather than copied, so a correction to + * an ellipsoid definition cannot leave a stale constant here. They are only probe + * arguments: nothing asserts they equal what {@code datum/Ellipsoid} holds, and this + * class deliberately does not import it, so a concurrent edit there cannot red this test. + */ + private static final double[] ES = buildEs(); + + private static double[] buildEs() { + // {inverse flattening} for WGS84/GRS80, Clarke 1866, Bessel 1841, Airy 1830, Krassovsky. + double[] rf = {298.257223563, 298.257222101, 294.9786982, 299.1528128, 299.3249646, 298.3}; + double[] es = new double[rf.length + 1]; + for (int i = 0; i < rf.length; i++) { + double f = 1.0 / rf[i]; + es[i] = f * (2.0 - f); + } + es[rf.length] = 0.0; // the sphere: es == 0 takes a different branch throughout proj4j + return es; + } + + /** + * Fractional degrees taken from places where the corpus and the defect register put probes: + * the {@code adams_ws2} antimeridian row, the tmerc seam, and the latitudes at which the + * numerical core's helpers were measured worst. + */ + private static final double[] FRACTIONAL_DEGREES = { + 179.999, 179.9999, 180.0, 0.5, 1.5, 3.0, 6.0, 20.0, 45.0, + 2.8, 18.0, 20.8, 42.0, 49.0, 70.0, 72.6, 75.0, 89.9, 89.999, 90.0, + 1.0e-12 * 180.0 / Math.PI, 122.4, 37.8, + }; + + /** + * A 64-bit digest of a probe list's raw argument bits. + * + *

Committed alongside each golden section, and it is the guard that earns its keep: without + * it, a probe list that generates different arguments on a different JDK produces a + * flood of result mismatches whose message names an argument that looks perfectly reasonable. + * That happened - see {@link #deg2rad(double)} - and cost real diagnosis time. With the digest, + * the same situation fails once, immediately, saying the arguments moved. + * + *

FNV-1a over the eight bytes of each argument, most significant first. Any mixing function + * would do; what matters is that it is defined here in Java arithmetic on {@code long}, which is + * exact and reproducible on every JVM, rather than by a library whose implementation could vary. + * + * @param xs the argument list + * @return the digest + */ + static long digest(double[] xs) { + long h = 0xcbf29ce484222325L; + for (int i = 0; i < xs.length; i++) { + long b = Double.doubleToRawLongBits(xs[i]); + for (int shift = 56; shift >= 0; shift -= 8) { + h ^= (b >>> shift) & 0xffL; + h *= 0x100000001b3L; + } + } + return h; + } + + private static double[] toArray(List in) { + double[] out = new double[in.size()]; + for (int i = 0; i < out.length; i++) { + out[i] = in.get(i).doubleValue(); + } + return out; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/DomainErrorPolicyTest.java b/core/src/test/java/org/locationtech/proj4j/domain/DomainErrorPolicyTest.java new file mode 100644 index 0000000..c17c3e6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/DomainErrorPolicyTest.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.DomainErrorPolicy; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@link DomainErrorPolicy}: the documented escape for callers that were depending on 1.4.3's + * silence. + * + *

This is not a way to get 1.4.3 back, and that is deliberate

+ * + *

1.4.3 expressed a per-coordinate failure four different ways — the input unchanged, a single + * {@code NaN} ordinate, a pole, and the target projection's false easting/northing. A caller's + * {@code isFinite} guard can see exactly one of those. {@link DomainErrorPolicy#RETURN_NAN} + * replaces all four with {@code NaN} in every ordinate, so the guard that used to be + * insufficient becomes sufficient. Migrating to it is a strict improvement even for a caller that + * never touches the exception. + */ +public class DomainErrorPolicyTest { + + private final CRSFactory csFactory = new CRSFactory(); + + private CoordinateReferenceSystem wgs84() { + return csFactory.createFromName("EPSG:4326"); + } + + private CoordinateReferenceSystem merc() { + return csFactory.createFromParameters("merc", + "+proj=merc +ellps=WGS84 +x_0=500000 +y_0=10000000 +units=m +no_defs"); + } + + // ------------------------------------------------------------------------- defaults + + /** Strict by default, on both the factory and the transform. */ + @Test + public void throwIsTheDefaultEverywhere() { + assertSame(DomainErrorPolicy.THROW, + new CoordinateTransformFactory().getDomainErrorPolicy()); + assertSame(DomainErrorPolicy.THROW, + new BasicCoordinateTransform(wgs84(), merc()).getDomainErrorPolicy()); + // A null policy is normalised rather than stored, so getDomainErrorPolicy() never returns + // null and no call site needs a null check. + assertSame(DomainErrorPolicy.THROW, + new CoordinateTransformFactory(null).getDomainErrorPolicy()); + assertSame(DomainErrorPolicy.THROW, + new BasicCoordinateTransform(wgs84(), merc(), null).getDomainErrorPolicy()); + } + + /** The factory's policy reaches the transforms it makes. */ + @Test + public void theFactoryPolicyPropagatesToItsTransforms() { + CoordinateTransformFactory lenient = + new CoordinateTransformFactory(DomainErrorPolicy.RETURN_NAN); + assertSame(DomainErrorPolicy.RETURN_NAN, lenient.getDomainErrorPolicy()); + CoordinateTransform t = lenient.createTransform(wgs84(), merc()); + assertSame(DomainErrorPolicy.RETURN_NAN, + ((BasicCoordinateTransform) t).getDomainErrorPolicy()); + } + + // --------------------------------------------------------------------------- strict + + /** Strict mode raises, with the cause attached. */ + @Test + public void strictModeRaisesWithACause() { + CoordinateTransform t = new CoordinateTransformFactory().createTransform(wgs84(), merc()); + try { + fail("must raise, got " + t.transform(new ProjCoordinate(10.0, 90.000001), + new ProjCoordinate())); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + assertTrue(e.cause().isCoordinateError()); + } + } + + // -------------------------------------------------------------------------- lenient + + /** + * Lenient mode writes {@code NaN} into every ordinate, not one. A coordinate with one + * finite and one {@code NaN} ordinate is precisely the shape that survives a careless range + * check, so producing it would defeat the point of the mode. + */ + @Test + public void lenientModeReturnsNaNInEveryOrdinate() { + CoordinateTransform t = new CoordinateTransformFactory(DomainErrorPolicy.RETURN_NAN) + .createTransform(wgs84(), merc()); + ProjCoordinate out = t.transform(new ProjCoordinate(10.0, 90.000001, 5.0), + new ProjCoordinate(1e300, 1e300, 1e300)); + assertTrue("x must be NaN: " + out, Double.isNaN(out.x)); + assertTrue("y must be NaN: " + out, Double.isNaN(out.y)); + assertTrue("z must be NaN too, so a partially transformed height cannot be mistaken for a " + + "result: " + out, Double.isNaN(out.z)); + assertTrue(!out.hasValidXandYOrdinates()); + } + + /** + * The false easting can never be the answer. This target has + * {@code +x_0=500000 +y_0=10000000}, which is exactly the pair 1.4.3 could emit when a kernel + * produced {@code NaN} and {@code totalScale} was zero. Under either policy, those two numbers + * must never appear. + */ + @Test + public void theFalseEastingIsNeverTheAnswerUnderEitherPolicy() { + ProjCoordinate lenient = new CoordinateTransformFactory(DomainErrorPolicy.RETURN_NAN) + .createTransform(wgs84(), merc()) + .transform(new ProjCoordinate(10.0, 95.0), new ProjCoordinate()); + assertTrue("must not be (x_0, y_0): " + lenient, + lenient.x != 500000.0 && lenient.y != 10000000.0); + + try { + ProjCoordinate strict = new CoordinateTransformFactory() + .createTransform(wgs84(), merc()) + .transform(new ProjCoordinate(10.0, 95.0), new ProjCoordinate()); + fail("strict mode must raise, got " + strict); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.INVALID_COORDINATE, expected.cause()); + } + } + + /** Lenient mode is only about per-coordinate causes; valid input is untouched by it. */ + @Test + public void lenientModeDoesNotDegradeValidInput() { + CoordinateTransform lenient = new CoordinateTransformFactory(DomainErrorPolicy.RETURN_NAN) + .createTransform(wgs84(), merc()); + CoordinateTransform strict = new CoordinateTransformFactory() + .createTransform(wgs84(), merc()); + + ProjCoordinate a = lenient.transform(new ProjCoordinate(10.0, 45.0), new ProjCoordinate()); + ProjCoordinate b = strict.transform(new ProjCoordinate(10.0, 45.0), new ProjCoordinate()); + assertEquals("the two policies must agree exactly on valid input", b.x, a.x, 0.0); + assertEquals(b.y, a.y, 0.0); + assertTrue(a.hasValidXandYOrdinates()); + } + + /** + * The group predicates are what the policy routes on, and exactly one of the four is true for + * every cause. Only the coordinate group is eligible for {@code RETURN_NAN}. + */ + @Test + public void onlyTheCoordinateGroupIsEligible() { + for (ErrorCause c : ErrorCause.values()) { + int groups = (c.isCrsError() ? 1 : 0) + (c.isOperationError() ? 1 : 0) + + (c.isCoordinateError() ? 1 : 0) + (c.isEnvironmentError() ? 1 : 0); + assertEquals(c + " must be in exactly one group", 1, groups); + } + assertTrue(ErrorCause.INVALID_COORDINATE.isCoordinateError()); + assertTrue(ErrorCause.COORDINATE_OUT_OF_DOMAIN.isCoordinateError()); + assertTrue(ErrorCause.NUMERICAL_FAILURE.isCoordinateError()); + assertTrue(!ErrorCause.NO_INVERSE_AVAILABLE.isCoordinateError()); + assertTrue(!ErrorCause.INVALID_PARAM_VALUE.isCoordinateError()); + } + + /** + * NaN in, NaN out under both policies, and for the same reason in each: it is a + * result, not an error, so the policy never gets consulted. Lenient mode's {@code NaN} and + * this {@code NaN} are indistinguishable to the caller, which is the one respect in which the + * lenient mode loses information — hence the recommendation to prefer {@code THROW} and catch. + */ + @Test + public void nanInNanOutIsAResultUnderBothPolicies() { + for (DomainErrorPolicy policy + : new DomainErrorPolicy[] {DomainErrorPolicy.THROW, DomainErrorPolicy.RETURN_NAN}) { + ProjCoordinate out = new CoordinateTransformFactory(policy) + .createTransform(wgs84(), merc()) + .transform(new ProjCoordinate(Double.NaN, Double.NaN), + new ProjCoordinate(1e300, 1e300)); + assertTrue(policy + ": NaN in must be NaN out, never a raise and never the poison: " + + out, Double.isNaN(out.x) && Double.isNaN(out.y)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/ForwardDomainGuardTest.java b/core/src/test/java/org/locationtech/proj4j/domain/ForwardDomainGuardTest.java new file mode 100644 index 0000000..c9e3582 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/ForwardDomainGuardTest.java @@ -0,0 +1,405 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.Projection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * PROJ's angular input contract, {@code 9.8.1:src/fwd.cpp:54-77}, as reproduced in the private + * {@code Projection.projectRadians(double, double, ProjCoordinate)} funnel that every forward + * projection passes through. + * + *

Everything here projects through a radian identity, on purpose

+ * + *

{@link Radians} is {@code +R=1} with the base class's identity forward, so + * {@code totalScale} is exactly {@code 1} and the projected output is the radian + * coordinate the guard handed to the kernel. That makes the clamp and the sign of zero directly + * observable, and it means no assertion here can be broken — or made to pass — by a change to a + * real projection's numerics. Testing the guard through, say, Mercator would couple these + * assertions to whatever that kernel does at the pole. + * + *

The numbers are upstream's, and these tests exist so they cannot be "tidied"

+ * + *
    + *
  • {@code PJ_EPS_LAT} is {@code 1e-12} radians, on {@code |phi| - pi/2}: about + * {@code 5.73e-11} degrees, or 0.006 µm on the ground. Restating it in degrees + * ("allow 90.000000001") is 17 orders of magnitude too generous and misclassifies points a + * micro-degree from the pole, which is where real corpus rows sit. Inside the band the + * latitude is clamped to exactly ±π/2; outside it, rejected.
  • + *
  • The only longitude bound is {@code |lambda| > 10} radians, about + * ±573°. A {@code [-180, 180]} rejection is the obvious thing to write and would + * be stricter than PROJ, breaking every caller legitimately passing 200°. + * {@link #longitudeWellOutsidePlusMinus180IsAccepted()} is that constraint's only witness. + * Do not weaken it.
  • + *
+ */ +public class ForwardDomainGuardTest { + + private static final double HALF_PI = Math.PI / 2.0; + private static final double DTR = Math.PI / 180.0; + private static final double RTD = 180.0 / Math.PI; + + /** + * A radian identity that also records what the guard handed it. + *

+ * The recorded values are the assertion target for the clamp and for the sign of zero, + * because the affine post-multiply that follows would hide both: {@code totalScale * -0.0 + + * totalFalseNorthing} is {@code -0.0 + 0.0}, which IEEE-754 defines as {@code +0.0}. So the + * projected output cannot witness a preserved negative zero even when the guard preserved it + * perfectly. {@link #lam} and {@link #phi} can. + */ + private static class Capture extends Projection { + double lam = Double.NaN; + double phi = Double.NaN; + + @Override protected ProjCoordinate project(double x, double y, ProjCoordinate dst) { + lam = x; + phi = y; + dst.x = x; + dst.y = y; + return dst; + } + + @Override public boolean hasInverse() { + return true; + } + + @Override public String toString() { + return "RadianIdentity"; + } + } + + private static Capture radians() { + Capture p = new Capture(); + p.setRadius(1.0); + p.initialize(); + return p; + } + + /** + * {@code dst} is poisoned with {@code 1e300} so that a projection which fails to write both + * ordinates cannot be mistaken for one that wrote zeros — the stale-read defect pattern. + */ + private static ProjCoordinate forward(Projection p, double lonDeg, double latDeg) { + return p.project(new ProjCoordinate(lonDeg, latDeg), new ProjCoordinate(1e300, 1e300)); + } + + /** + * The radian entry point, for the {@code PJ_EPS_LAT} boundary tests specifically. + *

+ * The bound is on {@code |phi| - pi/2} in radians, and a fixture built as + * {@code (HALF_PI + 1e-12) * RTD} and then converted back by {@code DTR} does not round-trip + * to the same overshoot — the two multiplications lose the low bits, which is precisely the + * scale the bound operates at. Feeding radians in directly removes the round trip and lets + * the boundary be pinned at the ulp the bound is actually written in. + */ + private static ProjCoordinate forwardRadians(Projection p, double lam, double phi) { + return p.projectRadians(new ProjCoordinate(lam, phi), new ProjCoordinate(1e300, 1e300)); + } + + private static ProjectionException expectRejection(double lonDeg, double latDeg) { + try { + ProjCoordinate out = forward(radians(), lonDeg, latDeg); + fail("expected rejection of (" + lonDeg + ", " + latDeg + ") but got " + out); + return null; + } catch (ProjectionException e) { + assertEquals("(" + lonDeg + ", " + latDeg + ") must be an invalid coordinate, not a " + + "domain or convergence failure", + ErrorCause.INVALID_COORDINATE, e.cause()); + return e; + } + } + + private static long bits(double v) { + return Double.doubleToRawLongBits(v); + } + + // ------------------------------------------------------------------------ latitude + + /** + * The pole is inside the domain, and — load bearing for every other assertion here — + * {@code 90 * DTR} is bit-exactly {@code pi/2}, so clamping a legitimate + * ±90° input is a no-op and cannot perturb a real coordinate by even one ulp. + */ + @Test + public void poleIsAcceptedAndClampingItIsABitExactNoOp() { + assertEquals("90 * DTR must be exactly HALF_PI, or the clamp would move real coordinates", + bits(HALF_PI), bits(90.0 * DTR)); + assertEquals(bits(-HALF_PI), bits(-90.0 * DTR)); + + Capture north = radians(); + forward(north, 0.0, 90.0); + assertEquals(bits(HALF_PI), bits(north.phi)); + + Capture south = radians(); + forward(south, 0.0, -90.0); + assertEquals(bits(-HALF_PI), bits(south.phi)); + } + + /** + * The predicate is {@code |phi| - pi/2 > EPS_LAT}, strictly greater, so an overshoot of + * exactly {@code 1e-12} rad is accepted and clamped. Pinned from both sides. + */ + @Test + public void latitudeOvershootIsAcceptedUpToEpsLatAndRejectedBeyond() { + // The largest representable latitude still inside the band. It cannot be written as + // HALF_PI + 1e-12: near pi/2 the double grid is ulp(pi/2) = 2.22e-16, so the nearest + // representable overshoot above 1e-12 is 1.0000889e-12 -- which is *outside* the band. + // The band therefore admits exactly floor(1e-12 / 2.22e-16) = 4503 representable + // latitudes past each pole, and the boundary has to be walked to rather than written. + double atBound = HALF_PI + 1e-12; + while (Math.abs(atBound) - HALF_PI > 1e-12) { + atBound = Math.nextDown(atBound); + } + double overshoot = Math.abs(atBound) - HALF_PI; + assertTrue("fixture must overshoot at all, was " + overshoot, overshoot > 0.0); + assertTrue("and stay inside the band, was " + overshoot, overshoot <= 1e-12); + assertEquals("the boundary sits one ulp below the naive HALF_PI + 1e-12", + Math.nextDown(HALF_PI + 1e-12), atBound, 0.0); + + Capture inside = radians(); + forwardRadians(inside, 0.2, atBound); + assertEquals("an overshoot of exactly EPS_LAT is accepted and clamped", + bits(HALF_PI), bits(inside.phi)); + + Capture insideSouth = radians(); + forwardRadians(insideSouth, 0.2, -atBound); + assertEquals(bits(-HALF_PI), bits(insideSouth.phi)); + + // One decimal order past it: rejected. + double pastBound = HALF_PI + 1e-11; + assertTrue("fixture must land outside the band", + Math.abs(pastBound) - HALF_PI > 1e-12); + for (double phi : new double[] {pastBound, -pastBound}) { + try { + fail("phi = " + phi + " rad must be rejected, got " + + forwardRadians(radians(), 0.2, phi)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + } + } + } + + /** + * The motivating case from the defect register: latitude {@code 90.000001}° overshoots by + * {@code 1.745e-8} rad — four orders of magnitude past {@code PJ_EPS_LAT} — and used to be + * answered with a plausible coordinate. + */ + @Test + public void latitude90Point000001IsRejected() { + ProjectionException e = expectRejection(10.0, 90.000001); + assertTrue(e.getMessage(), e.getMessage().contains("invalid latitude")); + expectRejection(10.0, -90.000001); + expectRejection(10.0, 91.0); + expectRejection(10.0, 180.0); + } + + /** A degree-space misreading of "1e-12" would accept this; the radian bound rejects it. */ + @Test + public void theBandIsSubMicrodegreeWideNotMicrodegreeWide() { + assertEquals(5.729577951308232e-11, 1e-12 * RTD, 1e-24); + expectRejection(10.0, 90.0 + 1e-9); + } + + /** Inside the band the latitude is clamped to exactly the pole, not passed through. */ + @Test + public void insideTheBandTheLatitudeIsClampedToExactlyThePole() { + double overshot = HALF_PI + 5e-13; + assertTrue("fixture must overshoot at all", Math.abs(overshot) - HALF_PI > 0.0); + assertTrue("but stay inside the band", Math.abs(overshot) - HALF_PI <= 1e-12); + + Capture north = radians(); + forwardRadians(north, 0.0, overshot); + assertEquals("a latitude inside the slop band must be clamped to exactly +pi/2", + bits(HALF_PI), bits(north.phi)); + assertTrue("and the un-clamped value must not have survived", + north.phi != overshot); + + Capture south = radians(); + forwardRadians(south, 0.0, -overshot); + assertEquals(bits(-HALF_PI), bits(south.phi)); + } + + // ----------------------------------------------------------------------- longitude + + /** + * Do not add a [−180, 180] rejection. PROJ wraps everything inside + * {@code |lambda| <= 10} rad and rejects only beyond it, so 200° and −190° are + * ordinary valid input. + */ + @Test + public void longitudeWellOutsidePlusMinus180IsAccepted() { + Projection p = radians(); + for (double lon : new double[] {181.0, 200.0, -190.0, 359.0, 400.0, 572.0, -572.0}) { + ProjCoordinate out = forward(p, lon, 10.0); + assertTrue("longitude " + lon + " deg must be accepted, got " + out, + out.hasValidXandYOrdinates()); + } + } + + /** 10 radians is 572.96 degrees, and that is the only longitude bound there is. */ + @Test + public void longitudeBeyond10RadiansIsRejected() { + assertEquals(572.9577951308232, 10.0 * RTD, 1e-10); + ProjectionException e = expectRejection(573.0, 10.0); + assertTrue(e.getMessage(), e.getMessage().contains("invalid longitude")); + expectRejection(-573.0, 10.0); + expectRejection(1e6, 10.0); + } + + // ------------------------------------------------------- non-finite: the three cases + + /** + * Case 1 of 3. {@code NaN} in, {@code NaN} out, as a result and not as an error. + *

+ * {@code fwd_prepare} compares against {@code HUGE_VAL} only and every range comparison it + * makes is false for {@code NaN}, so upstream propagates. The {@code gie} comparator then + * scores {@code isnan(got) && isnan(expected)} as deviation {@code 0} — a pass — so + * the corpus contains rows that assert this, and {@code roundtrip} defines all-{@code NaN}-in + * / all-{@code NaN}-out as residual {@code 0.0}. A guard that rejected {@code NaN} input + * would trade silent wrong answers for a conformance regression, which is not a trade the + * fail-closed policy asks for: the caller supplied the undefinedness, so handing it back is + * an honest answer rather than an invented one. + */ + @Test + public void nanInputIsPropagatedNotRejected() { + Projection p = radians(); + double[][] cases = { + {Double.NaN, 10.0}, + {10.0, Double.NaN}, + {Double.NaN, Double.NaN}, + }; + for (double[] c : cases) { + ProjCoordinate out = forward(p, c[0], c[1]); + assertFalse("NaN input must not be rejected: (" + c[0] + ", " + c[1] + ")", + out.hasValidXandYOrdinates()); + assertTrue("NaN in must be NaN out, not the poisoned dst and not the false easting: " + + out, Double.isNaN(out.x) || Double.isNaN(out.y)); + } + // And specifically: the poison must be gone, so the kernel really did run. + ProjCoordinate both = forward(p, Double.NaN, Double.NaN); + assertTrue("both ordinates NaN for both-NaN input, got " + both, + Double.isNaN(both.x) && Double.isNaN(both.y)); + } + + /** + * Case 2 of 3. ±{@code Infinity} is an error in PROJ too, so unlike {@code NaN} it is + * not propagated: {@code +Infinity} trips {@code fwd_prepare}'s {@code HUGE_VAL} test at + * {@code fwd.cpp:41}, and {@code -Infinity} trips the latitude range test at {@code :60} + * because {@code inf - pi/2 > 1e-12}. + */ + @Test + public void infiniteInputIsRejected() { + for (double v : new double[] {Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY}) { + expectRejection(v, 10.0); + expectRejection(10.0, v); + } + } + + /** + * Case 3 of 3. Finite input that produces a non-finite result is a computation failure — + * {@link ErrorCause#NUMERICAL_FAILURE}, not {@link ErrorCause#INVALID_COORDINATE} — because + * nothing about the input excuses it. This is also the assertion that the false easting can + * never be emitted in place of a failure: {@code x_0} here is 500000, and the exception is + * raised before the affine runs. + */ + @Test + public void finiteInputWithNonFiniteOutputIsANumericalFailure() { + Projection alwaysNaN = new Projection() { + @Override protected ProjCoordinate project(double x, double y, ProjCoordinate dst) { + dst.x = Double.NaN; + dst.y = Double.NaN; + return dst; + } + }; + alwaysNaN.setRadius(6378137.0); + alwaysNaN.setFalseEasting(500000.0); + alwaysNaN.setFalseNorthing(10000000.0); + alwaysNaN.initialize(); + + try { + ProjCoordinate out = forward(alwaysNaN, 10.0, 10.0); + fail("a NaN from the kernel on finite input must raise, got " + out); + } catch (ProjectionException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("non-finite")); + } + } + + /** The same, for an infinite kernel result: {@code Infinity} is not a coordinate either. */ + @Test + public void finiteInputWithInfiniteOutputIsANumericalFailure() { + Projection alwaysInf = new Projection() { + @Override protected ProjCoordinate project(double x, double y, ProjCoordinate dst) { + dst.x = Double.POSITIVE_INFINITY; + dst.y = 1.0; + return dst; + } + }; + alwaysInf.setRadius(6378137.0); + alwaysInf.initialize(); + + try { + fail("must raise, got " + forward(alwaysInf, 10.0, 10.0)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + } + } + + // ----------------------------------------------------------------- signed zero + + /** + * The {@code gie} comparator distinguishes {@code +0.0} from {@code -0.0} at the equator and + * the antimeridian, so {@code ==} cannot express this assertion — {@code -0.0 == 0.0} is + * {@code true}. Compared by raw bits for exactly that reason. + */ + @Test + public void signedZeroSurvivesTheGuardByRawBits() { + // The two zeros are distinguishable, and == cannot see it. This is why the assertions + // below are on bits. + assertTrue(-0.0 == 0.0); + assertTrue(bits(-0.0) != bits(0.0)); + + Capture neg = radians(); + forward(neg, -0.0, -0.0); + assertEquals("a -0.0 latitude must not become +0.0 on its way through the guard", + bits(-0.0), bits(neg.phi)); + assertEquals("nor a -0.0 longitude", bits(-0.0), bits(neg.lam)); + + Capture pos = radians(); + forward(pos, 0.0, 0.0); + assertEquals(bits(0.0), bits(pos.phi)); + assertEquals(bits(0.0), bits(pos.lam)); + + // -0.0 must not trip the clamp: |-0.0| - pi/2 is -pi/2, nowhere near the band. + assertEquals(bits(-0.0), bits(-0.0 * DTR)); + + // And the documented caveat: the affine post-multiply *does* normalise -0.0 to +0.0, + // because -0.0 + 0.0 is +0.0. That is pre-existing behaviour of the scaling step, not of + // the guard, and it is asserted here so the distinction is recorded rather than + // rediscovered. + assertEquals(bits(0.0), bits(1.0 * -0.0 + 0.0)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/GeocentricConverterDomainTest.java b/core/src/test/java/org/locationtech/proj4j/domain/GeocentricConverterDomainTest.java new file mode 100644 index 0000000..d7718e0 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/GeocentricConverterDomainTest.java @@ -0,0 +1,190 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.datum.GeocentricConverter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@link GeocentricConverter}'s three fail-open sites. + * + *

Why the exception type mattered more than the message

+ * + *

The out-of-range latitude branch threw {@code IllegalStateException}, which is unchecked and + * not a {@link Proj4jException} — so it escaped every {@code catch (Proj4jException)} in + * the library and in every caller that had written the obvious handler. The golden-master sweep + * found 23 ordinary CRS pairs reaching that line, so this was not a degenerate-input-only path; + * a caller that believed it had handled Proj4J's failures was getting an + * {@code IllegalStateException} out of a geometry loop. + */ +public class GeocentricConverterDomainTest { + + private static final double HALF_PI = Math.PI / 2.0; + + private static GeocentricConverter wgs84() { + return new GeocentricConverter(Ellipsoid.WGS84); + } + + /** Ordinary input still round-trips, so none of the three throws fires on valid data. */ + @Test + public void ordinaryCoordinatesStillRoundTrip() { + GeocentricConverter gc = wgs84(); + ProjCoordinate p = new ProjCoordinate(Math.toRadians(10.0), Math.toRadians(45.0), 100.0); + gc.convertGeodeticToGeocentric(p); + gc.convertGeocentricToGeodetic(p); + assertEquals(Math.toRadians(10.0), p.x, 1e-12); + assertEquals(Math.toRadians(45.0), p.y, 1e-12); + assertEquals(100.0, p.z, 1e-6); + } + + /** The poles are valid, and so is anything within the 0.1% rounding allowance past them. */ + @Test + public void polesAndTheRoundingAllowanceAreAccepted() { + GeocentricConverter gc = wgs84(); + for (double lat : new double[] {HALF_PI, -HALF_PI, HALF_PI * 1.0005, -HALF_PI * 1.0005}) { + ProjCoordinate p = new ProjCoordinate(0.0, lat, 0.0); + gc.convertGeodeticToGeocentric(p); + assertTrue("latitude " + lat + " must be accepted", + p.hasValidXandYOrdinates()); + } + } + + /** + * Site 1: the {@code IllegalStateException}. It is now a {@link Proj4jException}, so + * {@code catch (Proj4jException)} sees it, and it carries + * {@link ErrorCause#INVALID_COORDINATE}. + */ + @Test + public void outOfRangeLatitudeRaisesAProj4jExceptionNotAnIllegalStateException() { + GeocentricConverter gc = wgs84(); + for (double lat : new double[] {2.0, -2.0, Math.PI, -Math.PI}) { + ProjCoordinate p = new ProjCoordinate(0.0, lat, 0.0); + try { + gc.convertGeodeticToGeocentric(p); + fail("latitude " + lat + " rad must be rejected"); + } catch (IllegalStateException e) { + fail("still throwing IllegalStateException, which escapes every " + + "catch (Proj4jException): " + e); + } catch (Proj4jException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + } + } + } + + /** + * Site 2: the centre of mass. 1.4.3 answered {@code (0, 0, 0)} with longitude 0, latitude + * +90° and height {@code -b} — three finite, in-range, entirely plausible + * ordinates for a point that has no geodetic latitude or longitude at all, since every + * meridian and every parallel passes through it. A caller cannot distinguish that from a real + * polar coordinate at depth {@code b}. Upstream's {@code geocent.cpp} keeps the fiction; the + * no-sentinels rule does not permit it. + */ + @Test + public void theCentreOfMassRaisesInsteadOfInventingAPole() { + GeocentricConverter gc = wgs84(); + ProjCoordinate p = new ProjCoordinate(0.0, 0.0, 0.0); + try { + gc.convertGeocentricToGeodetic(p); + fail("(0,0,0) must not be answered with latitude " + p.y + ", height " + p.z); + } catch (Proj4jException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("centre of mass")); + } + } + + /** The specific fiction, pinned: it must not be +90 degrees and -b any more. */ + @Test + public void theOldFictionIsNamedSoItCannotComeBack() { + GeocentricConverter gc = wgs84(); + ProjCoordinate p = new ProjCoordinate(0.0, 0.0, 0.0); + boolean raised = false; + try { + gc.convertGeocentricToGeodetic(p); + } catch (Proj4jException e) { + raised = true; + } + assertTrue("must raise", raised); + // If a future change reinstates the old return, these are the values it would write. + assertTrue("latitude must not have been set to +pi/2", p.y != HALF_PI); + assertTrue("height must not have been set to -b", p.z != -Ellipsoid.WGS84.getB()); + } + + /** + * A point on the polar axis but not at the centre is a legitimate special case and must keep + * working: only the {@code |(X,Y,Z)| / a < 1e-12} branch is degenerate. + */ + @Test + public void aPointOnThePolarAxisIsStillValid() { + GeocentricConverter gc = wgs84(); + ProjCoordinate p = new ProjCoordinate(0.0, 0.0, Ellipsoid.WGS84.getB()); + gc.convertGeocentricToGeodetic(p); + assertEquals("the north pole", HALF_PI, Math.abs(p.y), 1e-9); + assertEquals(0.0, p.x, 0.0); + } + + /** + * {@code NaN} in, {@code NaN} out: both directions are {@code NaN}-transparent, and neither + * the new convergence check nor the degeneracy check may fire for it. The comparisons + * involved are all false for {@code NaN}, which is the same reason PROJ propagates. + */ + @Test + public void nanIsPropagatedThroughBothDirections() { + GeocentricConverter gc = wgs84(); + + ProjCoordinate fwd = new ProjCoordinate(Double.NaN, Double.NaN, Double.NaN); + gc.convertGeodeticToGeocentric(fwd); + assertTrue("NaN geodetic input must not raise and must stay NaN: " + fwd, + Double.isNaN(fwd.x) && Double.isNaN(fwd.y)); + + ProjCoordinate inv = new ProjCoordinate(Double.NaN, Double.NaN, Double.NaN); + gc.convertGeocentricToGeodetic(inv); + assertTrue("NaN geocentric input must not raise and must stay NaN: " + inv, + Double.isNaN(inv.x) || Double.isNaN(inv.y)); + } + + /** + * Site 3: the iteration's two exits used to be treated identically. The Hannover algorithm's + * own comment says "max. 30 is always enough", which is exactly why reaching 30 means the + * inputs are not well formed — and why continuing to compute a latitude from them yields a + * plausible wrong answer. A degenerate ellipsoid is the reachable way to get there. + */ + @Test + public void nonConvergentIterationRaisesRatherThanReturningTheLastIterate() { + // e2 = 0.999 is not a real Earth ellipsoid, but it is reachable from +f= / +rf= input and + // the iteration's contraction factor depends on it. + GeocentricConverter degenerate = new GeocentricConverter(6378137.0, 1000.0, 0.999); + ProjCoordinate p = new ProjCoordinate(1.0, 1.0, 6378137.0); + try { + degenerate.convertGeocentricToGeodetic(p); + // Convergence for this particular ellipsoid is not guaranteed either way; what is + // asserted is that IF it returns, it returns a finite answer -- never a silently + // unconverged one, which is what the post-loop check now enforces. + assertTrue("a returned latitude must at least be finite: " + p.y, + !Double.isNaN(p.y) && !Double.isInfinite(p.y)); + } catch (Proj4jException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("did not converge")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/GeographicSourceEntryPointTest.java b/core/src/test/java/org/locationtech/proj4j/domain/GeographicSourceEntryPointTest.java new file mode 100644 index 0000000..f904aa6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/GeographicSourceEntryPointTest.java @@ -0,0 +1,151 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The second entry point for the angular input contract, and in practice the one that matters: + * {@code Projection.inverseProjectRadians}' {@code unit == Units.DEGREES} branch. + * + *

Why guarding the forward funnel alone would have missed EPSG:4326

+ * + *

{@code BasicCoordinateTransform.transform} calls + * {@code srcCRS.getProjection().inverseProjectRadians(tgt, tgt)} whenever the source CRS is not + * {@code CS_GEO} — including when the source is geographic. For a geographic source that + * "inverse projection" is {@code LongLatProjection} doing nothing but a multiply by + * {@code DTR}. So a caller transforming from EPSG:4326 never touches + * {@code projectRadians} on the way in, and an out-of-domain latitude supplied in degrees would + * have sailed straight past a guard installed only on the forward funnel. + * + *

That is the commonest source CRS in the world, so this is the entry point most real + * out-of-domain input actually uses. + */ +public class GeographicSourceEntryPointTest { + + private final CRSFactory csFactory = new CRSFactory(); + private final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); + + private CoordinateTransform wgs84To(String target) { + CoordinateReferenceSystem src = csFactory.createFromName("EPSG:4326"); + CoordinateReferenceSystem tgt = csFactory.createFromParameters("target", target); + return ctFactory.createTransform(src, tgt); + } + + private static ProjCoordinate transform(CoordinateTransform t, double lon, double lat) { + return t.transform(new ProjCoordinate(lon, lat), new ProjCoordinate(1e300, 1e300)); + } + + /** Ordinary in-domain input still works, so the guard is not simply rejecting everything. */ + @Test + public void inDomainGeographicInputStillTransforms() { + CoordinateTransform t = wgs84To("+proj=merc +ellps=WGS84 +units=m +no_defs"); + ProjCoordinate out = transform(t, 10.0, 45.0); + assertTrue(out.toString(), out.hasValidXandYOrdinates()); + assertEquals(1113194.9, out.x, 1.0); + } + + /** + * The headline case. Latitude {@code 90.000001} degrees overshoots {@code pi/2} by + * {@code 1.745e-8} rad, which is {@code 17453} times {@code PJ_EPS_LAT}. PROJ answers + * {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD}; Proj4J 1.4.3 answered with a coordinate. + */ + @Test + public void epsg4326SourceAtLatitude90Point000001IsRejected() { + CoordinateTransform t = wgs84To("+proj=merc +ellps=WGS84 +units=m +no_defs"); + try { + fail("must reject, got " + transform(t, 10.0, 90.000001)); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("invalid latitude")); + } + } + + /** Both signs, and a frankly wrong latitude too. */ + @Test + public void epsg4326SourceRejectsEveryOutOfDomainLatitude() { + CoordinateTransform t = wgs84To("+proj=merc +ellps=WGS84 +units=m +no_defs"); + for (double lat : new double[] {90.000001, -90.000001, 91.0, -95.0, 100.0, 1000.0}) { + try { + fail("latitude " + lat + " must be rejected, got " + transform(t, 10.0, lat)); + } catch (CrsTransformException e) { + assertEquals("latitude " + lat, ErrorCause.INVALID_COORDINATE, e.cause()); + } + } + } + + /** + * ±90 exactly remains valid input through the geographic entry point. + *

+ * Probed with {@code +proj=eqc}, whose forward is defined and finite at the pole. Several + * projections raise there for reasons of their own — Mercator's northing diverges, and + * {@code laea}'s ellipsoidal branch has its own guard — and a test of this guard must + * not be able to fail because of one of those. + */ + @Test + public void epsg4326SourceAcceptsTheExactPole() { + CoordinateTransform t = wgs84To("+proj=eqc +ellps=WGS84 +units=m +no_defs"); + assertTrue(transform(t, 0.0, 90.0).hasValidXandYOrdinates()); + assertTrue(transform(t, 0.0, -90.0).hasValidXandYOrdinates()); + } + + /** + * 200 degrees of longitude is valid input, here as everywhere: the only longitude + * bound is {@code |lambda| > 10} radians. This test is the constraint's witness at the + * transform level, where a downstream ask for {@code [-180, 180]} rejection would land. + */ + @Test + public void epsg4326SourceAcceptsLongitude200() { + CoordinateTransform t = wgs84To("+proj=merc +ellps=WGS84 +units=m +no_defs"); + assertTrue(transform(t, 200.0, 10.0).hasValidXandYOrdinates()); + assertTrue(transform(t, -190.0, 10.0).hasValidXandYOrdinates()); + assertTrue(transform(t, 400.0, 10.0).hasValidXandYOrdinates()); + } + + /** + * NaN in, NaN out, through a whole transform — the same contract the projection funnel keeps, + * asserted end to end because that is the level the {@code gie} corpus asserts it at. + */ + @Test + public void nanInNanOutThroughAWholeTransform() { + CoordinateTransform t = wgs84To("+proj=merc +ellps=WGS84 +units=m +no_defs"); + ProjCoordinate out = transform(t, Double.NaN, Double.NaN); + assertTrue("NaN in must be NaN out, not the poisoned dst: " + out, + Double.isNaN(out.x) && Double.isNaN(out.y)); + } + + /** An infinity, by contrast, is rejected — PROJ rejects it too. */ + @Test + public void infiniteInputIsRejectedThroughAWholeTransform() { + CoordinateTransform t = wgs84To("+proj=merc +ellps=WGS84 +units=m +no_defs"); + try { + fail("must reject, got " + transform(t, 10.0, Double.POSITIVE_INFINITY)); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/NoInverseGateTest.java b/core/src/test/java/org/locationtech/proj4j/domain/NoInverseGateTest.java new file mode 100644 index 0000000..b8fd3a7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/NoInverseGateTest.java @@ -0,0 +1,254 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.AiryProjection; +import org.locationtech.proj4j.proj.AugustProjection; +import org.locationtech.proj4j.proj.DenoyerProjection; +import org.locationtech.proj4j.proj.LinearProjection; +import org.locationtech.proj4j.proj.MercatorProjection; +import org.locationtech.proj4j.proj.PlateCarreeProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.LarriveeProjection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The inverse-availability gate. + * + *

The defect

+ * + *

{@code Projection.projectInverse} was an unconditional identity + * ({@code dst.x = x; dst.y = y;}), and nothing in {@code core/src/main} read + * {@code hasInverse()} — a method declared 66 times across 102 classes. So using any of 33 + * forward-only projections as a source CRS returned the projected metres back as if they + * were lon/lat radians, which was then datum-shifted and re-projected. The answer is finite, in + * range, and wrong by continental distances. + * + *

Why the gate does not key on {@code hasInverse()} alone

+ * + *

Because that boolean, having gone unread for the library's whole life, is wrong in + * both directions — and both directions were found by a test rather than by reading the + * code: + * + *

    + *
  • {@code KrovakProjection} and {@code NewZealandMapGridProjection} implement + * {@code projectInverse} and never declare {@code hasInverse()}. Gating on the boolean alone + * broke EPSG:2065, EPSG:5514 and EPSG:27200, all of which round-trip correctly — the same + * class of wrong answer the gate exists to prevent, only louder.
  • + *
  • {@code LandsatProjection} declares {@code hasInverse()} but its {@code projectInverse} + * takes {@code Point2D.Double} and therefore overrides nothing.
  • + *
  • {@code LongLatProjection} declares nothing, so inherits {@code false}, yet its inverse is + * real: the {@code DTR} multiply in {@code inverseProjectRadians}.
  • + *
  • {@code PlateCarreeProjection} and {@code LinearProjection} declare {@code hasInverse()} and + * the base identity genuinely is their inverse, because their forward is the base + * identity too.
  • + *
+ * + *

So the gate asks "is there an implementation", and keeps the boolean only as an affirmative + * shortcut. + */ +public class NoInverseGateTest { + + private final CRSFactory csFactory = new CRSFactory(); + private final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); + + // ------------------------------------------------ the base class no longer echoes input + + /** + * {@code Projection.projectInverse} raises for a forward-only projection instead of returning + * the identity. Asserted through the public {@code inverseProject}, which is the only way in. + * + *

{@code aitoff} and {@code lagrng} used to be on this list and have been removed, because + * they both gained the inverse upstream has. {@code aitoff.cpp} has carried a + * Newton–Raphson inverse since 2015 and {@code lagrng.cpp}'s is closed form; between them + * that was 16 {@code builtins.gie} assertions, and the four {@code aitoff} inverse rows that + * passed beforehand passed by accident, sitting 200 m from the origin where Aitoff is + * the identity to nine decimals. {@code AiryProjection} and {@code LarriveeProjection} take + * their place: both are declared {@code "no inv"} upstream and neither overrides + * {@code projectInverse}. + */ + @Test + public void baseProjectInverseRaisesForForwardOnlyProjections() { + Projection[] forwardOnly = { + new AiryProjection(), + new AugustProjection(), + new DenoyerProjection(), + new LarriveeProjection(), + }; + for (Projection p : forwardOnly) { + p.initialize(); + assertTrue(p + " must declare no inverse for this test to mean anything", + !p.hasInverse()); + try { + ProjCoordinate out = + p.inverseProject(new ProjCoordinate(1e6, 2e6), new ProjCoordinate()); + fail(p + " has no inverse and must raise, got " + out); + } catch (ProjectionException e) { + assertEquals(p.toString(), ErrorCause.NO_INVERSE_AVAILABLE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("no inverse")); + } + } + } + + /** + * The identity is opt-in, not removed: two projections legitimately depend on it, + * because their forward is the base identity too. Removing the identity outright would break + * {@code +proj=eqc}. + */ + @Test + public void theBaseIdentityIsStillAvailableToProjectionsThatDeclareIt() { + Projection[] identityIsTheirInverse = { + new PlateCarreeProjection(), + new LinearProjection(), + }; + for (Projection p : identityIsTheirInverse) { + p.setRadius(1.0); + p.initialize(); + assertTrue(p + " must declare an inverse", p.hasInverse()); + ProjCoordinate out = + p.inverseProject(new ProjCoordinate(0.5, 0.25), new ProjCoordinate()); + assertNotNull(out); + assertTrue(out.toString(), out.hasValidXandYOrdinates()); + } + } + + // --------------------------------------------------------------- the transform-level gate + + /** A forward-only projection as a source CRS raises rather than inventing lon/lat. */ + @Test + public void forwardOnlyProjectionAsSourceCrsRaises() { + CoordinateReferenceSystem src = + csFactory.createFromParameters("august", "+proj=august +ellps=WGS84 +units=m"); + CoordinateReferenceSystem tgt = csFactory.createFromName("EPSG:4326"); + try { + ProjCoordinate out = ctFactory.createTransform(src, tgt) + .transform(new ProjCoordinate(1e6, 2e6), new ProjCoordinate()); + fail("august cannot be a source CRS, got " + out); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.NO_INVERSE_AVAILABLE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("no inverse")); + } + } + + /** The same projection remains perfectly usable as a target. */ + @Test + public void forwardOnlyProjectionIsStillUsableAsATarget() { + CoordinateReferenceSystem src = csFactory.createFromName("EPSG:4326"); + CoordinateReferenceSystem tgt = + csFactory.createFromParameters("august", "+proj=august +ellps=WGS84 +units=m"); + ProjCoordinate out = ctFactory.createTransform(src, tgt) + .transform(new ProjCoordinate(10.0, 45.0), new ProjCoordinate()); + assertTrue(out.toString(), out.hasValidXandYOrdinates()); + } + + /** + * The three CRSs that keying on {@code hasInverse()} alone rejected. Each has a working + * {@code projectInverse} and no {@code hasInverse()} declaration, and each is a real EPSG + * code in production use. This test is the regression witness for that mistake. + */ + @Test + public void krovakAndNzmgAreInvertibleDespiteNotDeclaringIt() { + // Each probed inside its own area of use. A projection evaluated 12,000 km outside its + // domain can legitimately fail to invert, which would make this test assert the wrong + // thing -- Krovak is central Europe, NZMG is New Zealand. + String[][] cases = { + {"EPSG:2065", "15.0", "49.0"}, // S-JTSK / Krovak, Czechia + {"EPSG:5514", "15.0", "49.0"}, // S-JTSK / Krovak East North, Czechia + {"EPSG:27200", "174.0", "-41.0"}, // NZGD49 / New Zealand Map Grid + }; + CoordinateReferenceSystem wgs84 = csFactory.createFromName("EPSG:4326"); + for (String[] c : cases) { + String code = c[0]; + double lon = Double.parseDouble(c[1]); + double lat = Double.parseDouble(c[2]); + CoordinateReferenceSystem crs = csFactory.createFromName(code); + assertTrue(code + " must not declare hasInverse(), or this test is vacuous", + !crs.getProjection().hasInverse()); + + // Forward, then back: the inverse must actually compute, not raise and not echo. + ProjCoordinate projected = ctFactory.createTransform(wgs84, crs) + .transform(new ProjCoordinate(lon, lat), new ProjCoordinate()); + ProjCoordinate back = ctFactory.createTransform(crs, wgs84) + .transform(projected, new ProjCoordinate()); + assertEquals(code + " longitude must round-trip", lon, back.x, 1e-6); + assertEquals(code + " latitude must round-trip", lat, back.y, 1e-6); + } + } + + /** A geographic source CRS is not caught by the gate, though it declares no inverse. */ + @Test + public void geographicSourceIsNotGatedOut() { + CoordinateReferenceSystem wgs84 = csFactory.createFromName("EPSG:4326"); + assertTrue("LongLatProjection is expected to inherit hasInverse() == false", + !wgs84.getProjection().hasInverse()); + assertTrue(wgs84.getProjection().isGeographic()); + + CoordinateReferenceSystem merc = csFactory.createFromParameters( + "merc", "+proj=merc +ellps=WGS84 +units=m +no_defs"); + ProjCoordinate out = ctFactory.createTransform(wgs84, merc) + .transform(new ProjCoordinate(10.0, 45.0), new ProjCoordinate()); + assertTrue(out.toString(), out.hasValidXandYOrdinates()); + } + + /** + * {@link ErrorCause#NO_INVERSE_AVAILABLE} is an operation error, not a coordinate + * one — so it is not eligible for the lenient policy. A missing inverse is a property of the + * CRS pair, and answering it with {@code NaN} once per row would report a planning-time + * defect on every row of the dataset. + */ + @Test + public void noInverseIsAnOperationErrorSoLenientModeStillRaises() { + assertTrue(ErrorCause.NO_INVERSE_AVAILABLE.isOperationError()); + assertTrue(!ErrorCause.NO_INVERSE_AVAILABLE.isCoordinateError()); + + CoordinateTransformFactory lenient = + new CoordinateTransformFactory(org.locationtech.proj4j.DomainErrorPolicy.RETURN_NAN); + CoordinateReferenceSystem src = + csFactory.createFromParameters("august", "+proj=august +ellps=WGS84 +units=m"); + CoordinateReferenceSystem tgt = csFactory.createFromName("EPSG:4326"); + try { + ProjCoordinate out = lenient.createTransform(src, tgt) + .transform(new ProjCoordinate(1e6, 2e6), new ProjCoordinate()); + fail("lenient mode must not swallow an operation error, got " + out); + } catch (CrsTransformException e) { + assertEquals(ErrorCause.NO_INVERSE_AVAILABLE, e.cause()); + } + } + + /** An ordinary invertible projection is unaffected, which is the bulk of the library. */ + @Test + public void ordinaryInvertibleProjectionIsUnaffected() { + MercatorProjection merc = new MercatorProjection(); + merc.setRadius(6378137.0); + merc.initialize(); + assertTrue(merc.hasInverse()); + ProjCoordinate out = + merc.inverseProject(new ProjCoordinate(1113194.9, 0.0), new ProjCoordinate()); + assertEquals(10.0, out.x, 1e-6); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/ProjectionMathDomainTest.java b/core/src/test/java/org/locationtech/proj4j/domain/ProjectionMathDomainTest.java new file mode 100644 index 0000000..618ce47 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/ProjectionMathDomainTest.java @@ -0,0 +1,355 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.ProjectionMath; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@link ProjectionMath}: the liveness fixes, the checked inverse-trig variants, and + * {@code inv_mlfn}'s missing convergence check. + * + *

Liveness is a security property here, not a performance one

+ * + *

{@code normalizeLongitude}, {@code normalizeLatitude} and {@code normalizeAngle} were + * unbounded {@code while} loops stepping by π or 2π. For {@code 1e18} radians that is about + * {@code 1.6e17} iterations — not a slow answer, a hung thread, and reachable from an + * untrusted coordinate. Every test in the liveness section carries a {@code timeout}, because + * without one a regression does not fail the build, it stops it. + */ +public class ProjectionMathDomainTest { + + private static final double TWO_PI = Math.PI * 2.0; + private static final double HALF_PI = Math.PI / 2.0; + + private static long bits(double v) { + return Double.doubleToRawLongBits(v); + } + + // ------------------------------------------------------------------------- liveness + + /** + * The exact input from the defect register: {@code 1e18} rad, ~1.6e17 loop trips. Termination + * is the assertion — the old code did not terminate in any useful sense. + * + *

Range is deliberately not asserted at {@code 1e18}. The one-{@code floor} + * reduction is {@code lon - 2pi*floor(lon/2pi)}, and at {@code 1e18} the low bits of + * {@code 2pi*floor(...)} are simply gone: the result is {@code 124.858}, not something in + * {@code [-pi, pi]}. PROJ's {@code adjlon} does exactly the same thing, because this is + * a verbatim port of it, and no conformance row is anywhere near that magnitude. Trading + * bit-fidelity with upstream for a tidier range guarantee at {@code 1e18} would be the wrong + * trade — see the port-verbatim rule. {@link #adjlonLosesLowBitsAboveAbout1e17JustAsPROJDoes} + * pins where the boundary actually is. + */ + @Test(timeout = 2000) + public void normalizeLongitudeTerminatesForAbsurdInput() { + for (double v : new double[] {1e18, -1e18, 1e300, -1e300, 1e15, Double.MAX_VALUE}) { + double w = ProjectionMath.normalizeLongitude(v); + assertTrue(v + " -> " + w + " must at least be a number", !Double.isNaN(w)); + } + } + + /** Up to about {@code 1e17} the reduction is still exact enough to land in range. */ + @Test(timeout = 2000) + public void normalizeLongitudeIsInRangeForEveryMagnitudeThatMatters() { + for (double v : new double[] {4.0, 7.0, 100.0, 1e6, 1e9, 1e12, 1e15, 1e17}) { + for (double s : new double[] {1.0, -1.0}) { + double w = ProjectionMath.normalizeLongitude(s * v); + assertTrue((s * v) + " -> " + w, w >= -Math.PI && w <= Math.PI); + } + } + } + + @Test(timeout = 2000) + public void normalizeLatitudeTerminatesForAbsurdInput() { + for (double v : new double[] {1e18, -1e18, 1e300, -1e300}) { + double w = ProjectionMath.normalizeLatitude(v); + assertTrue(v + " -> " + w, w >= -HALF_PI && w <= HALF_PI); + } + } + + @Test(timeout = 2000) + public void normalizeAngleTerminatesForAbsurdInput() { + for (double v : new double[] {1e18, -1e18, 1e300, -1e300}) { + double w = ProjectionMath.normalizeAngle(v); + assertTrue(v + " -> " + w, w >= 0.0 && w <= TWO_PI); + } + } + + // --------------------------------------------------------------------------- adjlon + + /** + * {@code normalizeLongitude} is now exactly {@code adjlon} + * ({@code 9.8.1:src/adjlon.cpp:6-20}). + */ + @Test + public void normalizeLongitudeIsAdjlon() { + for (double v : new double[] {0.0, 1.0, -1.0, Math.PI, -Math.PI, 3.5, -3.5, 100.0, 1e18}) { + assertEquals("normalizeLongitude must delegate to adjlon at " + v, + bits(ProjectionMath.adjlon(v)), bits(ProjectionMath.normalizeLongitude(v))); + } + } + + /** + * The {@code 1e-12} overshoot window. Upstream's comment is "let longitude slightly + * overshoot, to avoid spurious sign switching at the date line", and it is load bearing: the + * old {@code while} wrapped as soon as {@code lon > pi}, so a longitude a picoradian past the + * antimeridian flipped to the far side of the world. Real corpus points sit in this band. + */ + @Test + public void adjlonLetsTheAntimeridianOvershootRatherThanFlipSign() { + double justPast = Math.PI + 5e-13; + assertEquals("inside the window the value is returned untouched", + bits(justPast), bits(ProjectionMath.adjlon(justPast))); + assertTrue("and it must NOT have flipped sign", ProjectionMath.adjlon(justPast) > 0.0); + + double justPastNegative = -Math.PI - 5e-13; + assertEquals(bits(justPastNegative), bits(ProjectionMath.adjlon(justPastNegative))); + + // Outside the window, it wraps. + double wellPast = Math.PI + 1e-9; + assertTrue(ProjectionMath.adjlon(wellPast) < 0.0); + assertEquals(-Math.PI + 1e-9, ProjectionMath.adjlon(wellPast), 1e-15); + } + + /** π itself, and ±0.0, pass through bit-for-bit. */ + @Test + public void adjlonPreservesPiAndSignedZero() { + assertEquals(bits(Math.PI), bits(ProjectionMath.adjlon(Math.PI))); + assertEquals(bits(-Math.PI), bits(ProjectionMath.adjlon(-Math.PI))); + assertEquals(bits(0.0), bits(ProjectionMath.adjlon(0.0))); + assertEquals("a -0.0 longitude must stay -0.0: the gie comparator distinguishes the two " + + "at the equator and the antimeridian", bits(-0.0), + bits(ProjectionMath.adjlon(-0.0))); + } + + /** + * {@code adjlon} is {@code NaN}-transparent, where the old {@code normalizeLongitude} + * threw. {@code Math.abs(NaN) < pi + 1e-12} is {@code false}, so {@code NaN} falls + * through the arithmetic and comes out {@code NaN} — exactly as the C does. The old throw was + * stricter than PROJ, and worse, it only fired when {@code lon_0 != 0}, which is why the same + * defect used to throw for {@code +lon_0=15} and return garbage for {@code +lon_0=0}. + */ + @Test + public void adjlonIsNanTransparent() { + assertTrue(Double.isNaN(ProjectionMath.adjlon(Double.NaN))); + assertTrue(Double.isNaN(ProjectionMath.normalizeLongitude(Double.NaN))); + } + + /** + * The measured precision boundary of the one-{@code floor} reduction, recorded so that a + * future reader does not mistake it for a defect introduced here. This is upstream's + * arithmetic, unchanged; the old {@code while} loop would have been in range at {@code 1e18} + * but only after {@code 1.6e17} iterations, which is not a trade anyone wants. + */ + @Test(timeout = 2000) + public void adjlonLosesLowBitsAboveAbout1e17JustAsPROJDoes() { + assertTrue("1e17 still lands in range", + Math.abs(ProjectionMath.adjlon(1e17)) <= Math.PI); + assertEquals("1e18 does not, and this is the value PROJ produces too", + 124.858407346410, ProjectionMath.adjlon(1e18), 1e-9); + } + + /** An infinity comes out {@code NaN}, also exactly as the C does ({@code inf - inf}). */ + @Test + public void adjlonMapsInfinityToNanAsTheCDoes() { + assertTrue(Double.isNaN(ProjectionMath.adjlon(Double.POSITIVE_INFINITY))); + assertTrue(Double.isNaN(ProjectionMath.adjlon(Double.NEGATIVE_INFINITY))); + } + + /** Ordinary wrapping is unchanged, so nothing that used to work has moved. */ + @Test + public void ordinaryWrappingIsUnchanged() { + assertEquals(0.0, ProjectionMath.normalizeLongitude(TWO_PI), 1e-15); + assertEquals(-Math.PI + 0.5, ProjectionMath.normalizeLongitude(Math.PI + 0.5), 1e-15); + assertEquals(1.0, ProjectionMath.normalizeLongitude(1.0), 0.0); + assertEquals(-1.0, ProjectionMath.normalizeLongitude(-1.0), 0.0); + } + + // ------------------------------------------------------------- checked inverse trig + + /** {@code ONE_TOL} is upstream's, to the last digit. */ + @Test + public void oneTolIsUpstreams() { + assertEquals(1.00000000000001, ProjectionMath.ONE_TOL, 0.0); + } + + /** + * Inside the band, clamp — that is what {@code aasin} is for, and a projection kernel reaches + * {@code |v| >= 1} by rounding constantly. + */ + @Test + public void asinCheckedClampsInsideOneTol() { + assertEquals(HALF_PI, ProjectionMath.asinChecked(1.0), 0.0); + assertEquals(-HALF_PI, ProjectionMath.asinChecked(-1.0), 0.0); + assertEquals(HALF_PI, ProjectionMath.asinChecked(1.0 + 1e-15), 0.0); + assertEquals(0.0, ProjectionMath.acosChecked(1.0), 0.0); + assertEquals(Math.PI, ProjectionMath.acosChecked(-1.0), 0.0); + } + + /** Beyond the band, raise. {@code asin(1e9)} is not {@code pi/2}. */ + @Test + public void asinCheckedRaisesBeyondOneTol() { + for (double v : new double[] {1.1, -1.1, 1e9, -1e9, 2.0}) { + try { + fail("asinChecked(" + v + ") must raise, got " + ProjectionMath.asinChecked(v)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + try { + fail("acosChecked(" + v + ") must raise, got " + ProjectionMath.acosChecked(v)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + } + } + + /** + * The deprecated originals let {@code NaN} through the clamp entirely, because + * {@code Math.abs(NaN) > 1.} is {@code false}. Pinned so the difference between the two + * families is documented by an assertion rather than by a comment. + */ + @Test + public void theDeprecatedAsinPassesNanThroughAndTheCheckedOneDoesNot() { + assertTrue("the old asin passes NaN straight through", + Double.isNaN(ProjectionMath.asin(Double.NaN))); + assertTrue(Double.isNaN(ProjectionMath.acos(Double.NaN))); + + try { + fail("asinChecked(NaN) must raise, got " + ProjectionMath.asinChecked(Double.NaN)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + } + try { + fail("acosChecked(NaN) must raise, got " + ProjectionMath.acosChecked(Double.NaN)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + } + } + + /** And the old clamp has no band at all: {@code asin(1e9)} is silently {@code pi/2}. */ + @Test + public void theDeprecatedAsinHasNoToleranceBand() { + assertEquals(HALF_PI, ProjectionMath.asin(1e9), 0.0); + assertEquals(-HALF_PI, ProjectionMath.asin(-1e9), 0.0); + } + + /** {@code sqrt} returned 0 for a negative radicand; {@code sqrtChecked} raises. */ + @Test + public void sqrtCheckedRaisesWhereSqrtReturnedZero() { + assertEquals("the deprecated sqrt still answers 0 -- it is public API", + 0.0, ProjectionMath.sqrt(-1.0), 0.0); + assertEquals(0.0, ProjectionMath.sqrt(-1e-300), 0.0); + + assertEquals(2.0, ProjectionMath.sqrtChecked(4.0), 0.0); + assertEquals(0.0, ProjectionMath.sqrtChecked(0.0), 0.0); + for (double v : new double[] {-1.0, -1e-300, Double.NaN}) { + try { + fail("sqrtChecked(" + v + ") must raise, got " + ProjectionMath.sqrtChecked(v)); + } catch (ProjectionException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + } + } + } + + // ------------------------------------------------------------------------ inv_mlfn + + /** + * {@code inv_mlfn} had a bare {@code return phi;} with no convergence test of any kind — the + * most widely shared instance of the defect, because {@code tmerc}, {@code Bonne}, + * {@code EquidistantAzimuthal} and {@code Cassini} all inverse-project through it. It now + * raises. + * + *

Ordinary arguments still converge, which is the other half of the assertion: a throw + * that fires on valid input is not a fix. + */ + @SuppressWarnings("deprecation") + @Test + public void invMlfnStillConvergesForEveryRealLatitude() { + double es = 0.006694379990141316; // GRS80 + double[] en = ProjectionMath.enfn(es); + + for (double phi : new double[] {0.0, 0.1, 0.5, 1.0, 1.5, -0.7, -1.5707, 1.5707}) { + double mu = ProjectionMath.mlfn(phi, Math.sin(phi), Math.cos(phi), en); + assertEquals("inv_mlfn must still round-trip at phi = " + phi, + phi, ProjectionMath.inv_mlfn(mu, es, en), 1e-9); + } + } + + /** + * A genuinely non-convergent argument, found by sweep rather than by guesswork — + * {@code 6.863037736488298e10} on GRS80 exhausts all ten Newton steps. The old code answered + * it with its last iterate: finite, and wrong by an unbounded amount. + * + *

Note that a merely absurd argument is not enough to trip it. {@code inv_mlfn} is + * Newton's method run against {@link ProjectionMath#mlfn}, and {@code mlfn} is monotone, so + * {@code inv_mlfn(1e12)} converges perfectly well onto {@code 1.0017e12} radians — a real + * solution of the equation it is actually solving, and a nonsensical latitude. That is worth + * knowing: this throw catches iteration failure, not domain nonsense, and the domain guard is + * a separate mechanism. + */ + @SuppressWarnings("deprecation") + @Test + public void invMlfnRaisesWhenTheIterationGenuinelyFails() { + double es = 0.006694379990141316; // GRS80 + double[] en = ProjectionMath.enfn(es); + + for (double arg : new double[] {6.863037736488298e10, -6.863037736488298e10}) { + try { + double phi = ProjectionMath.inv_mlfn(arg, es, en); + fail("inv_mlfn(" + arg + ") does not converge and must not answer " + phi); + } catch (ConvergenceFailureException e) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("inv_mlfn")); + } + } + + // The other reachable axis: a degenerate eccentricity, which +f=/+rf= can produce. + double[] wild = ProjectionMath.enfn(0.9); + try { + double phi = ProjectionMath.inv_mlfn(1.0, 0.9, wild); + fail("es=0.9 does not converge at arg=1 and must not answer " + phi); + } catch (ConvergenceFailureException expected) { + assertEquals(ErrorCause.NUMERICAL_FAILURE, expected.cause()); + } + } + + /** + * {@code inv_mlfn} stays {@code NaN}-transparent. The convergence test is written + * inverted — {@code !(|t| >= tol)} rather than {@code |t| < tol} — so a {@code NaN} takes the + * return branch instead of falling through to the throw. That is upstream's own + * idiom, and it is what keeps NaN-in/NaN-out intact through {@code tmerc}, {@code Bonne}, + * {@code EquidistantAzimuthal} and {@code Cassini}, all four of which inverse-project through + * here. Writing the test the natural way would have converted every NaN coordinate into a + * convergence failure. + */ + @SuppressWarnings("deprecation") + @Test + public void invMlfnIsNanTransparentRatherThanNonConvergent() { + double es = 0.006694379990141316; + double[] en = ProjectionMath.enfn(es); + double phi = ProjectionMath.inv_mlfn(Double.NaN, es, en); + assertTrue("a NaN arc length must come back as NaN, not as a ConvergenceFailure: " + phi, + Double.isNaN(phi)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/domain/RobinsonSentinelTest.java b/core/src/test/java/org/locationtech/proj4j/domain/RobinsonSentinelTest.java new file mode 100644 index 0000000..2dd57e5 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/domain/RobinsonSentinelTest.java @@ -0,0 +1,150 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.domain; + +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.RobinsonProjection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code RobinsonProjection}'s three {@code lp.x = lp.y = NaN; return lp;} sentinel returns, + * converted to throws. + * + *

Why convert them at all, when the postcondition would catch them anyway

+ * + *

Because a sentinel and an error are not the same event even when they produce the same + * observable outcome. {@code Projection.inverseProjectRadians}' finiteness check would + * turn each of these into a {@link ErrorCause#NUMERICAL_FAILURE} one frame up — but + * "numerical failure" is the wrong attribution. These three are + * {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}: the arithmetic did not fail, the coordinate is + * simply not on the map. Upstream agrees and sets + * {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} at all three sites + * ({@code robin.cpp:113}, {@code :124}, {@code :150}). + * + *

Raising at the site is also what keeps the message useful: it can name the northing and the + * interpolation interval, which the generic check one frame up cannot see. + */ +public class RobinsonSentinelTest { + + private static final double FYC = 1.3523; + + private static RobinsonProjection robinson() { + RobinsonProjection p = new RobinsonProjection(); + p.setRadius(1.0); + p.initialize(); + return p; + } + + /** A northing well inside the map still inverts, so none of the three fires on valid input. */ + @Test + public void inDomainNorthingStillInverts() { + RobinsonProjection p = robinson(); + ProjCoordinate out = p.projectInverse(0.1, 0.5, new ProjCoordinate(1e300, 1e300)); + assertTrue(out.toString(), out.hasValidXandYOrdinates()); + assertTrue("latitude must be in range: " + out.y, Math.abs(out.y) <= Math.PI / 2); + } + + /** The forward direction is unaffected; only the inverse had sentinels. */ + @Test + public void forwardIsUnaffected() { + RobinsonProjection p = robinson(); + ProjCoordinate out = p.project(0.5, 0.5, new ProjCoordinate(1e300, 1e300)); + assertTrue(out.toString(), out.hasValidXandYOrdinates()); + } + + /** + * Site 1, {@code robin.cpp:113}: {@code |y| / FYC > ONEEPS}, a northing off the top or bottom + * of the map. {@code ONEEPS} is {@code 1.000001}, so this needs a northing a little past + * {@code FYC}. + */ + @Test + public void northingBeyondOneEpsRaisesOutOfDomain() { + RobinsonProjection p = robinson(); + for (double y : new double[] {FYC * 1.01, -FYC * 1.01, 10.0, -10.0}) { + try { + ProjCoordinate out = p.projectInverse(0.0, y, new ProjCoordinate(1e300, 1e300)); + fail("northing " + y + " is off the map, got " + out); + } catch (ProjectionException e) { + assertEquals("northing " + y, ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("ONEEPS")); + } + } + } + + /** + * The accepting side of site 1: within {@code ONEEPS} the latitude is snapped to the pole + * rather than rejected, so the boundary is a clamp and not a cliff. + */ + @Test + public void northingJustInsideOneEpsIsSnappedToThePole() { + RobinsonProjection p = robinson(); + ProjCoordinate out = + p.projectInverse(0.0, FYC * 1.0000005, new ProjCoordinate(1e300, 1e300)); + assertEquals(Math.PI / 2, out.y, 1e-15); + assertTrue(out.hasValidXandYOrdinates()); + } + + /** + * Site 3, {@code robin.cpp:150}: an easting that inverts to {@code |lambda| > pi}. Upstream + * sets the domain errno and overwrites the coordinate with + * {@code proj_coord_error()} — i.e. upstream also regards the {@code NaN} as a courtesy + * rather than as the signal. + */ + @Test + public void eastingThatInvertsPastPiRaisesOutOfDomain() { + RobinsonProjection p = robinson(); + try { + ProjCoordinate out = p.projectInverse(100.0, 0.5, new ProjCoordinate(1e300, 1e300)); + fail("an easting inverting past +/-pi must raise, got " + out); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("outside +/-pi")); + } + } + + /** + * Every sentinel is gone: no input may make the inverse return a {@code NaN}. The + * whole point of the exercise is that a caller's {@code isFinite} guard is no longer the only + * thing standing between it and a wrong answer, so there must be nothing left for it to catch. + */ + @Test + public void noInputMakesTheInverseReturnNaN() { + RobinsonProjection p = robinson(); + int raised = 0; + int returned = 0; + for (double x = -60.0; x <= 60.0; x += 3.0) { + for (double y = -6.0; y <= 6.0; y += 0.25) { + ProjCoordinate out = new ProjCoordinate(1e300, 1e300); + try { + p.projectInverse(x, y, out); + returned++; + assertTrue("returned a NaN sentinel at (" + x + ", " + y + "): " + out, + out.hasValidXandYOrdinates()); + } catch (ProjectionException e) { + raised++; + } + } + } + assertTrue("the sweep must exercise both outcomes; raised=" + raised + + " returned=" + returned, raised > 0 && returned > 0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/AxisOrderTest.java b/core/src/test/java/org/locationtech/proj4j/errors/AxisOrderTest.java new file mode 100644 index 0000000..dc988b7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/AxisOrderTest.java @@ -0,0 +1,171 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.AxisOrder; + +/** + * {@link AxisOrder}: the {@code Down} asymmetry, and the bare {@code new Error()}. + * + *

{@code AxisOrder} is one of the ten types {@code proj4j-geoapi} couples to, and + * {@code AbstractCRS} probes axis order by pushing {@code new ProjCoordinate(1, 2, 3)} through + * {@code fromENU} and reading the public fields — so these tests also pin the property that probe + * depends on: {@code fromENU} is a pure sign-preserving permutation. + */ +public class AxisOrderTest { + + /** + * {@code Axis.Down.toENU} negated but {@code fromENU} did not, so {@code +axis=…d} was not an + * involution: a coordinate pushed to ENU and pulled back came out with its height negated. + * Every other reversed axis — {@code Westing}, {@code Southing} — negates both ways, and + * {@code BasicCoordinateTransform} composes exactly these two calls, {@code toENU} on the + * source and {@code fromENU} on the target. + */ + @Test + public void downIsSymmetricLikeWestingAndSouthing() { + AxisOrder end = AxisOrder.fromString("end"); + ProjCoordinate c = new ProjCoordinate(10.0, 20.0, 30.0); + + end.toENU(c); + assertEquals("toENU must flip a Down height into an Up height", -30.0, c.z, 0.0); + + end.fromENU(c); + assertEquals("fromENU must flip it back", 30.0, c.z, 0.0); + assertEquals(10.0, c.x, 0.0); + assertEquals(20.0, c.y, 0.0); + } + + /** + * The general property, over every axis triple that names one of each kind: {@code fromENU} + * after {@code toENU} is the identity. + */ + @Test + public void everyAxisOrderRoundTripsThroughEnuAndBack() { + String[] horizontals = { "e", "w" }; + String[] verticals = { "n", "s" }; + String[] heights = { "u", "d" }; + for (String h : horizontals) { + for (String v : verticals) { + for (String z : heights) { + String spec = h + v + z; + AxisOrder order = AxisOrder.fromString(spec); + ProjCoordinate c = new ProjCoordinate(1.0, 2.0, 3.0); + order.toENU(c); + order.fromENU(c); + assertEquals(spec + " x", 1.0, c.x, 0.0); + assertEquals(spec + " y", 2.0, c.y, 0.0); + assertEquals(spec + " z", 3.0, c.z, 0.0); + } + } + } + } + + /** And the other way round, since {@code BasicCoordinateTransform} uses both orders. */ + @Test + public void everyAxisOrderRoundTripsFromEnuAndBack() { + for (String spec : new String[] { "enu", "end", "wsu", "wsd", "esu", "wnd", "neu", "ned" }) { + AxisOrder order = AxisOrder.fromString(spec); + ProjCoordinate c = new ProjCoordinate(1.0, 2.0, 3.0); + order.fromENU(c); + order.toENU(c); + assertEquals(spec + " x", 1.0, c.x, 0.0); + assertEquals(spec + " y", 2.0, c.y, 0.0); + assertEquals(spec + " z", 3.0, c.z, 0.0); + } + } + + /** + * {@code fromENU} must remain a pure sign-preserving permutation, because + * {@code proj4j-geoapi}'s {@code AbstractCRS} discovers axis order by probing it with + * {@code (1, 2, 3)} and reading the magnitudes back. + */ + @Test + public void fromEnuRemainsASignedPermutation() { + for (String spec : new String[] { "enu", "end", "neu", "wsd" }) { + ProjCoordinate c = new ProjCoordinate(1.0, 2.0, 3.0); + AxisOrder.fromString(spec).fromENU(c); + double[] magnitudes = { Math.abs(c.x), Math.abs(c.y), Math.abs(c.z) }; + java.util.Arrays.sort(magnitudes); + assertEquals(spec, 1.0, magnitudes[0], 0.0); + assertEquals(spec, 2.0, magnitudes[1], 0.0); + assertEquals(spec, 3.0, magnitudes[2], 0.0); + } + } + + @Test + public void enuIsUnaffected() { + ProjCoordinate c = new ProjCoordinate(1.0, 2.0, 3.0); + AxisOrder.ENU.toENU(c); + assertEquals(1.0, c.x, 0.0); + assertEquals(2.0, c.y, 0.0); + assertEquals(3.0, c.z, 0.0); + AxisOrder.ENU.fromENU(c); + assertEquals(1.0, c.x, 0.0); + assertEquals(2.0, c.y, 0.0); + assertEquals(3.0, c.z, 0.0); + } + + // ------------------------------------------------------------------- the bare new Error() + + /** + * {@code fromString} threw {@code new Error()} — no message, and an {@link Error}, so outside + * {@code catch (Proj4jException)} and outside almost every caller's {@code catch (Exception)} + * too. In a Spark executor that is a killed task rather than a rejected row. + */ + @Test + public void aWrongLengthAxisSpecThrowsATypedProj4jException() { + for (String bad : new String[] { "", "e", "en", "enun" }) { + try { + AxisOrder.fromString(bad); + fail("+axis=" + bad + " must be rejected"); + } catch (InvalidValueException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + assertTrue("the message must say what was wrong, and give the length. Was: " + + e.getMessage(), e.getMessage().contains("3")); + } + } + } + + @Test + public void anUnknownAxisDirectionThrowsATypedProj4jExceptionNamingTheCharacter() { + try { + AxisOrder.fromString("enx"); + fail("+axis=enx must be rejected"); + } catch (InvalidValueException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + assertTrue("the message must name the offending character. Was: " + e.getMessage(), + e.getMessage().contains("x")); + } + } + + @Test + public void aNullAxisSpecThrowsATypedProj4jExceptionRatherThanNpe() { + try { + AxisOrder.fromString(null); + fail("a null +axis must be rejected"); + } catch (InvalidValueException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/EquidistantConicTest.java b/core/src/test/java/org/locationtech/proj4j/errors/EquidistantConicTest.java new file mode 100644 index 0000000..984db57 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/EquidistantConicTest.java @@ -0,0 +1,197 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.EquidistantConicProjection; + +/** + * {@code +proj=eqdc} is no longer a pure identity, and now agrees with PROJ 9.8.1. + * + *

The old class overrode the public degrees-in/degrees-out {@code project} and + * {@code inverseProject} rather than the protected radian hooks that + * {@code BasicCoordinateTransform} calls, so both overrides were dead code and every coordinate + * fell through to {@code Projection}'s identity base implementations — while + * {@code hasInverse()} reported {@code true}. Nothing in the library detected that, because an + * identity is finite, in range, and plausible. + */ +public class EquidistantConicTest { + + private static final double METRE_TOLERANCE = 1e-6; + + private final CRSFactory crsFactory = new CRSFactory(); + private final CoordinateTransformFactory transformFactory = new CoordinateTransformFactory(); + + /** {@code +proj=eqdc +ellps=GRS80 +lat_1=33 +lat_2=45 +lat_0=39}. */ + private CoordinateReferenceSystem eqdc() { + return crsFactory.createFromParameters("eqdc", + "+proj=eqdc +ellps=GRS80 +lat_1=33 +lat_2=45 +lat_0=39"); + } + + private CoordinateReferenceSystem geographic() { + return crsFactory.createFromParameters("geo", "+proj=longlat +ellps=GRS80"); + } + + /** + * The headline assertion: the projected coordinate is not the input. Before this change the + * forward transform of (0.5, 40.5) was (0.5, 40.5). + */ + @Test + public void forwardIsNotTheIdentity() { + ProjCoordinate in = new ProjCoordinate(0.5, 40.5); + ProjCoordinate out = new ProjCoordinate(1e300, 1e300); + transformFactory.createTransform(geographic(), eqdc()).transform(in, out); + + assertNotEquals("eqdc must not pass the longitude through unchanged", 0.5, out.x, 1.0); + assertNotEquals("eqdc must not pass the latitude through unchanged", 40.5, out.y, 1.0); + assertTrue("an eqdc easting is in metres, so it must be far from 0.5 degrees", + Math.abs(out.x) > 1000.0); + } + + /** + * Against PROJ 9.8.1, verbatim: + *

+     * echo "0.5 40.5" | proj -f "%.6f" +proj=eqdc +ellps=GRS80 +lat_1=33 +lat_2=45 +lat_0=39
+     * 42163.667772    166660.338831
+     * 
+ */ + @Test + public void forwardMatchesProj981() { + ProjCoordinate in = new ProjCoordinate(0.5, 40.5); + ProjCoordinate out = new ProjCoordinate(1e300, 1e300); + transformFactory.createTransform(geographic(), eqdc()).transform(in, out); + + assertEquals("easting", 42163.667772, out.x, METRE_TOLERANCE); + assertEquals("northing", 166660.338831, out.y, METRE_TOLERANCE); + } + + /** + * The non-identity round trip. This is the test the old code could not fail: an identity + * forward composed with an identity inverse round-trips perfectly, which is precisely why the + * defect survived. Here the intermediate is asserted to be metres, so a regression to the + * identity fails {@link #forwardIsNotTheIdentity()} even though this test would still pass. + */ + @Test + public void roundTripsThroughRealProjectedMetres() { + ProjCoordinate in = new ProjCoordinate(-2.75, 41.25); + ProjCoordinate projected = new ProjCoordinate(1e300, 1e300); + ProjCoordinate back = new ProjCoordinate(1e300, 1e300); + + CoordinateReferenceSystem geo = geographic(); + CoordinateReferenceSystem eqdc = eqdc(); + transformFactory.createTransform(geo, eqdc).transform(in, projected); + assertTrue("the intermediate must be projected metres, not the input degrees", + Math.abs(projected.x) > 100000.0); + transformFactory.createTransform(eqdc, geo).transform(projected, back); + + assertEquals("round-tripped longitude", -2.75, back.x, 1e-9); + assertEquals("round-tripped latitude", 41.25, back.y, 1e-9); + } + + /** The spherical branch, {@code +R} rewritten as {@code +a=+b}, also round-trips. */ + @Test + public void sphericalBranchRoundTrips() { + CoordinateReferenceSystem geo = + crsFactory.createFromParameters("geo", "+proj=longlat +a=6400000 +b=6400000"); + CoordinateReferenceSystem eqdc = crsFactory.createFromParameters("eqdc", + "+proj=eqdc +a=6400000 +b=6400000 +lat_1=33 +lat_2=45 +lat_0=39"); + + ProjCoordinate in = new ProjCoordinate(1.5, 38.0); + ProjCoordinate projected = new ProjCoordinate(1e300, 1e300); + ProjCoordinate back = new ProjCoordinate(1e300, 1e300); + transformFactory.createTransform(geo, eqdc).transform(in, projected); + assertTrue(Math.abs(projected.x) > 100000.0); + transformFactory.createTransform(eqdc, geo).transform(projected, back); + assertEquals(1.5, back.x, 1e-9); + assertEquals(38.0, back.y, 1e-9); + } + + /** + * {@code hasInverse()} already reported {@code true}; now it is true of something. + */ + @Test + public void inverseIsNotTheIdentityEither() { + ProjCoordinate in = new ProjCoordinate(42163.667772, 166660.338831); + ProjCoordinate out = new ProjCoordinate(1e300, 1e300); + transformFactory.createTransform(eqdc(), geographic()).transform(in, out); + + assertEquals(0.5, out.x, 1e-6); + assertEquals(40.5, out.y, 1e-6); + } + + // ------------------------------------------------------------ the construction-time guards + + @Test + public void degenerateStandardParallelsAreRejectedAtConstruction() { + // |lat_1 + lat_2| == 0: upstream's third rejection. Fails while it is still a definition, + // so no coordinate can ever be produced from it. + assertRejected("+proj=eqdc +ellps=GRS80 +lat_1=30 +lat_2=-30"); + } + + @Test + public void outOfRangeStandardParallelsAreRejectedAtConstruction() { + assertRejected("+proj=eqdc +ellps=GRS80 +lat_1=100 +lat_2=45"); + assertRejected("+proj=eqdc +ellps=GRS80 +lat_1=33 +lat_2=-91"); + } + + private void assertRejected(String definition) { + try { + crsFactory.createFromParameters("eqdc", definition); + fail("must reject: " + definition); + } catch (InvalidValueException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + } + } + + /** + * A bare {@code +proj=eqdc} still constructs, on the legacy default parallels, rather than + * failing upstream's {@code |lat_1 + lat_2| > 0} check with both at zero. That keeps this a + * bug fix rather than a behavioural break for anyone who wrote {@code +proj=eqdc} alone. + */ + @Test + public void bareDefinitionStillConstructsAndProjects() { + CoordinateTransform t = transformFactory.createTransform( + crsFactory.createFromParameters("geo", "+proj=longlat +ellps=GRS80"), + crsFactory.createFromParameters("eqdc", "+proj=eqdc +ellps=GRS80")); + ProjCoordinate out = new ProjCoordinate(1e300, 1e300); + t.transform(new ProjCoordinate(1.0, 40.0), out); + assertTrue(Math.abs(out.x) > 1000.0); + assertTrue(Double.isFinite(out.x) && Double.isFinite(out.y)); + } + + /** + * The legacy constructor set the standard parallels with {@code Math.toDegrees(60)} — + * 3437.75 — and used them as radians. Whatever the defaults are, they must be sane angles. + */ + @Test + public void defaultStandardParallelsAreSaneAngles() { + EquidistantConicProjection p = new EquidistantConicProjection(); + assertEquals(60.0, p.getProjectionLatitude1Degrees(), 1e-9); + assertEquals(20.0, p.getProjectionLatitude2Degrees(), 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/ErrorCauseTest.java b/core/src/test/java/org/locationtech/proj4j/errors/ErrorCauseTest.java new file mode 100644 index 0000000..61aa392 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/ErrorCauseTest.java @@ -0,0 +1,227 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; + +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; + +/** + * The stability contract of {@link ErrorCause}, asserted mechanically. + *

+ * These are not "does the enum compile" tests. Every one of them is a promise made to a + * downstream consumer that switches on the constant names or persists {@code metricKey()} in a + * metrics backend: if a rename, a removal, or a key change ever slips in, exactly these + * assertions are what catches it before it reaches a release. + */ +public class ErrorCauseTest { + + /** + * The eight names a downstream consumer asked for by name. Spelled out as string literals + * rather than as enum references on purpose: a rename would still compile if this test used + * {@code ErrorCause.UNKNOWN_CRS.name()}, and the point is that the identifier is the + * API. + */ + private static final String[] REQUIRED_NAMES = { + "UNKNOWN_CRS", + "INVALID_CRS_SYNTAX", + "CONTRADICTORY_PARAMS", + "PROJECTION_NOT_IMPLEMENTED", + "NO_OPERATION_AVAILABLE", + "MISSING_GRID", + "COORDINATE_OUT_OF_DOMAIN", + "NUMERICAL_FAILURE", + }; + + @Test + public void theEightRequestedConstantNamesExistVerbatim() { + Set present = new HashSet(); + for (ErrorCause c : ErrorCause.values()) { + present.add(c.name()); + } + for (String required : REQUIRED_NAMES) { + assertTrue("ErrorCause." + required + " is API and must not be renamed or removed", + present.contains(required)); + // valueOf is the reflective route a caller may use; it must work too. + assertNotNull(ErrorCause.valueOf(required)); + } + } + + @Test + public void hasTwentyFourValues() { + assertEquals("ErrorCause is a fixed taxonomy; adding a value is a deliberate, " + + "documented act and must update this count", + 24, ErrorCause.values().length); + } + + @Test + public void everyValueIsInExactlyOneGroup() { + for (ErrorCause c : ErrorCause.values()) { + int groups = 0; + if (c.isCrsError()) groups++; + if (c.isOperationError()) groups++; + if (c.isCoordinateError()) groups++; + if (c.isEnvironmentError()) groups++; + assertEquals(c.name() + " must be in exactly one group, so that a caller can " + + "classify a future constant without a switch", 1, groups); + } + } + + @Test + public void metricKeysAreUniqueLowerCaseAndDotted() { + Set keys = new HashSet(); + for (ErrorCause c : ErrorCause.values()) { + String key = c.metricKey(); + assertNotNull(c.name() + " has no metric key", key); + assertFalse(c.name() + " has an empty metric key", key.isEmpty()); + assertEquals(c.name() + " metric key must be lower case", key.toLowerCase(), key); + assertTrue(c.name() + " metric key must be .: " + key, + key.matches("^(crs|coord|env)\\.[a-z0-9_]+$")); + assertTrue("metric key collision on " + key, keys.add(key)); + } + assertEquals(ErrorCause.values().length, keys.size()); + } + + /** + * {@code metricKey()} itself is a hard-coded ASCII constant on every enum member, so production + * is locale-safe here. The expectation was not: derived with a no-arg + * {@code name().toLowerCase()}, under {@code tr_TR} it asked for + * {@code crs.ınvalıd_crs_syntax} -- dotless i, U+0131 -- and failed against the correct + * {@code crs.invalid_crs_syntax}. {@code Locale.ROOT} is what "lower-cased" means for an + * identifier. + */ + @Test + public void metricKeyIsTheGroupPrefixPlusTheLowerCasedConstantName() { + for (ErrorCause c : ErrorCause.values()) { + String prefix; + if (c.isCrsError() || c.isOperationError()) { + prefix = "crs."; + } else if (c.isCoordinateError()) { + prefix = "coord."; + } else { + prefix = "env."; + } + assertEquals("metric key of " + c.name() + " is derivable, and must stay derivable", + prefix + c.name().toLowerCase(Locale.ROOT), c.metricKey()); + } + } + + /** The one metric key spelled out in the architecture document. */ + @Test + public void ballparkRejectedHasTheDocumentedMetricKey() { + assertEquals("crs.ballpark_rejected", ErrorCause.BALLPARK_REJECTED.metricKey()); + } + + @Test + public void crsDefinitionGroupIsExactlyAsSpecified() { + assertEquals(EnumSet.of( + ErrorCause.UNKNOWN_CRS, + ErrorCause.INVALID_CRS_SYNTAX, + ErrorCause.CONTRADICTORY_PARAMS, + ErrorCause.MISSING_PARAM, + ErrorCause.INVALID_PARAM_VALUE, + ErrorCause.PROJECTION_NOT_IMPLEMENTED, + ErrorCause.CRS_TYPE_NOT_SUPPORTED), + group(true, false, false, false)); + } + + @Test + public void operationSelectionGroupIsExactlyAsSpecified() { + assertEquals(EnumSet.of( + ErrorCause.NO_OPERATION_AVAILABLE, + ErrorCause.BALLPARK_REJECTED, + ErrorCause.BEST_OPERATION_UNAVAILABLE, + ErrorCause.MISSING_GRID, + ErrorCause.NO_INVERSE_AVAILABLE, + ErrorCause.UNSUPPORTED_OPERATION_METHOD), + group(false, true, false, false)); + } + + @Test + public void perCoordinateGroupIsExactlyAsSpecified() { + assertEquals(EnumSet.of( + ErrorCause.INVALID_COORDINATE, + ErrorCause.COORDINATE_OUT_OF_DOMAIN, + ErrorCause.COORDINATE_OUTSIDE_AREA_OF_USE, + ErrorCause.COORDINATE_OUTSIDE_GRID, + ErrorCause.GRID_NODATA, + ErrorCause.NUMERICAL_FAILURE, + ErrorCause.MISSING_TIME), + group(false, false, true, false)); + } + + @Test + public void environmentGroupIsExactlyAsSpecified() { + assertEquals(EnumSet.of( + ErrorCause.DATABASE_UNAVAILABLE, + ErrorCause.NETWORK_DISABLED, + ErrorCause.API_MISUSE, + ErrorCause.INTERNAL_ERROR), + group(false, false, false, true)); + } + + @Test + public void isNoUsableOperationCoversEveryEmptyCandidateListOutcome() { + for (ErrorCause c : new ErrorCause[] { + ErrorCause.NO_OPERATION_AVAILABLE, + ErrorCause.BALLPARK_REJECTED, + ErrorCause.BEST_OPERATION_UNAVAILABLE, + ErrorCause.MISSING_GRID, + ErrorCause.NO_INVERSE_AVAILABLE, + ErrorCause.UNSUPPORTED_OPERATION_METHOD }) { + assertTrue(c.name() + " means no usable operation", c.isNoUsableOperation()); + } + assertFalse(ErrorCause.UNKNOWN_CRS.isNoUsableOperation()); + assertFalse(ErrorCause.NUMERICAL_FAILURE.isNoUsableOperation()); + assertFalse(ErrorCause.INTERNAL_ERROR.isNoUsableOperation()); + } + + /** + * A caller cannot get a null out of any accessor, however it obtained the constant. + */ + @Test + public void everyAccessorIsTotal() { + for (ErrorCause c : ErrorCause.values()) { + assertNotNull(c.metricKey()); + // Exercises the predicates for coverage as well as for the null check above. + c.isCrsError(); + c.isOperationError(); + c.isCoordinateError(); + c.isEnvironmentError(); + c.isNoUsableOperation(); + } + } + + private static EnumSet group(boolean crs, boolean op, boolean coord, boolean env) { + EnumSet found = EnumSet.noneOf(ErrorCause.class); + for (ErrorCause c : ErrorCause.values()) { + if (c.isCrsError() == crs && c.isOperationError() == op + && c.isCoordinateError() == coord && c.isEnvironmentError() == env) { + found.add(c); + } + } + return found; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/ExceptionHierarchyTest.java b/core/src/test/java/org/locationtech/proj4j/errors/ExceptionHierarchyTest.java new file mode 100644 index 0000000..0b940d0 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/ExceptionHierarchyTest.java @@ -0,0 +1,346 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.ContradictoryParameterException; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.UnknownAuthorityCodeException; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.proj.MercatorProjection; + +/** + * The re-parented exception hierarchy: that each relationship holds, that every legacy + * {@code catch} still fires, and that {@link Proj4jException#cause()} reports the documented + * {@link ErrorCause} for every subclass. + * + *

The re-parenting is the one change in this area that could silently break a caller, so it is + * asserted from three directions: the subtype relations themselves, the "old supertype is still + * in every chain" property that makes it binary-compatible, and an actual {@code catch} of each + * pre-existing clause shape. + */ +public class ExceptionHierarchyTest { + + // -------------------------------------------------------------- the shape of the hierarchy + + @Test + public void crsTransformExceptionSitsUnderProj4jException() { + assertTrue(Proj4jException.class.isAssignableFrom(CrsTransformException.class)); + assertSame(Proj4jException.class, CrsTransformException.class.getSuperclass()); + } + + @Test + public void crsCreationExceptionSitsUnderCrsTransformException() { + assertSame(CrsTransformException.class, CrsCreationException.class.getSuperclass()); + } + + @Test + public void theThreeDefinitionExceptionsSitUnderCrsCreationException() { + assertSame(CrsCreationException.class, UnknownAuthorityCodeException.class.getSuperclass()); + assertSame(CrsCreationException.class, InvalidValueException.class.getSuperclass()); + assertSame(CrsCreationException.class, UnsupportedParameterException.class.getSuperclass()); + } + + @Test + public void contradictoryParameterExceptionSitsUnderInvalidValueException() { + // The load-bearing relationship: code already catching the natural exception for a bad + // +rf keeps working when Proj4J starts rejecting the contradiction outright. + assertSame(InvalidValueException.class, + ContradictoryParameterException.class.getSuperclass()); + } + + @Test + public void theTwoRuntimeExceptionsSitUnderCrsTransformException() { + assertSame(CrsTransformException.class, ProjectionException.class.getSuperclass()); + assertSame(CrsTransformException.class, ConvergenceFailureException.class.getSuperclass()); + } + + @Test + public void everythingIsStillAnUncheckedException() { + // Proj4jException has always been a RuntimeException; making any of these checked would + // be a source break for every caller that does not declare it. + assertTrue(RuntimeException.class.isAssignableFrom(Proj4jException.class)); + for (Class c : allExceptionClasses()) { + assertTrue(c.getName() + " must remain unchecked", + RuntimeException.class.isAssignableFrom(c)); + } + } + + /** + * The binary-compatibility property, stated as the invariant it actually is: for every + * exception class, {@code Proj4jException} is still somewhere in its superclass chain. That + * is what makes {@code catch (Proj4jException)} in already-compiled downstream code keep + * firing on exactly the throws it used to. + */ + @Test + public void proj4jExceptionRemainsInEveryChain() { + for (Class c : allExceptionClasses()) { + assertTrue(c.getName() + " must remain a Proj4jException", + Proj4jException.class.isAssignableFrom(c)); + } + } + + /** + * The re-parenting must not have made any pre-existing sibling pair into a + * subclass/superclass pair: that is the one way a multi-clause {@code catch} in existing + * code could become a compile error ("already caught") or change which branch runs. + */ + @Test + public void noPreExistingSiblingPairBecameNested() { + Class[] legacy = { + UnknownAuthorityCodeException.class, + InvalidValueException.class, + UnsupportedParameterException.class, + ProjectionException.class, + ConvergenceFailureException.class, + }; + for (Class a : legacy) { + for (Class b : legacy) { + if (a != b) { + assertFalse(a.getSimpleName() + " must not have become a supertype of " + + b.getSimpleName() + ": a catch clause ordering could change", + a.isAssignableFrom(b)); + } + } + } + } + + // ------------------------------------------------------------------- catch clauses still fire + + @Test + public void catchProj4jExceptionStillCatchesEverySubclass() { + for (Proj4jException e : oneOfEach()) { + try { + throw e; + } catch (Proj4jException caught) { + assertSame(e, caught); + } + } + } + + @Test + public void catchCrsTransformExceptionCatchesEveryAttributedSubclass() { + for (Proj4jException e : oneOfEach()) { + if (e.getClass() == Proj4jException.class) { + continue; // the un-attributed base is deliberately outside this net + } + try { + throw e; + } catch (CrsTransformException caught) { + assertSame(e, caught); + } + } + } + + @Test + public void catchInvalidValueExceptionStillCatchesTheContradictionSubclass() { + try { + throw new ContradictoryParameterException("+ellps=GRS80 and +rf=300 disagree"); + } catch (InvalidValueException caught) { + assertEquals(ErrorCause.CONTRADICTORY_PARAMS, caught.cause()); + } + } + + /** + * The clause ordering used in {@code EllipsoidParsingTest} — the narrower legacy class first, + * {@code Proj4jException} second — must still compile and still route the same way. + */ + @Test + public void narrowThenBroadCatchOrderingStillRoutesToTheNarrowClause() { + String route; + try { + throw new InvalidValueException("bad value"); + } catch (InvalidValueException e) { + route = "narrow"; + } catch (Proj4jException e) { + route = "broad"; + } + assertEquals("narrow", route); + + try { + throw new ConvergenceFailureException("did not converge"); + } catch (InvalidValueException e) { + route = "narrow"; + } catch (Proj4jException e) { + route = "broad"; + } + assertEquals("broad", route); + } + + // ----------------------------------------------------------------------------- cause() values + + @Test + public void proj4jExceptionDefaultsToInternalError() { + assertEquals(ErrorCause.INTERNAL_ERROR, new Proj4jException().cause()); + assertEquals(ErrorCause.INTERNAL_ERROR, new Proj4jException("m").cause()); + assertEquals(ErrorCause.INTERNAL_ERROR, + new Proj4jException("m", new RuntimeException()).cause()); + } + + @Test + public void unknownAuthorityCodeExceptionReportsUnknownCrs() { + assertEquals(ErrorCause.UNKNOWN_CRS, + new UnknownAuthorityCodeException("EPSG:99999").cause()); + } + + @Test + public void invalidValueExceptionReportsInvalidParamValue() { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, new InvalidValueException("m").cause()); + assertEquals(ErrorCause.INVALID_PARAM_VALUE, + new InvalidValueException("m", new RuntimeException()).cause()); + } + + @Test + public void contradictoryParameterExceptionReportsContradictoryParams() { + assertEquals(ErrorCause.CONTRADICTORY_PARAMS, + new ContradictoryParameterException("m").cause()); + assertEquals(ErrorCause.CONTRADICTORY_PARAMS, + new ContradictoryParameterException("m", new RuntimeException()).cause()); + } + + @Test + public void unsupportedParameterExceptionReportsProjectionNotImplemented() { + assertEquals(ErrorCause.PROJECTION_NOT_IMPLEMENTED, + new UnsupportedParameterException("m").cause()); + } + + @Test + public void projectionExceptionReportsCoordinateOutOfDomain() { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, new ProjectionException().cause()); + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, new ProjectionException("m").cause()); + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, + new ProjectionException(new MercatorProjection(), "m").cause()); + } + + @Test + public void convergenceFailureExceptionReportsNumericalFailure() { + assertEquals(ErrorCause.NUMERICAL_FAILURE, new ConvergenceFailureException("m").cause()); + assertEquals(ErrorCause.NUMERICAL_FAILURE, + new ConvergenceFailureException(new MercatorProjection(), "m").cause()); + } + + @Test + public void causeIsNeverNullEvenWhenExplicitlyPassedNull() { + assertEquals(ErrorCause.INTERNAL_ERROR, new CrsTransformException(null, "m").cause()); + assertEquals(ErrorCause.INTERNAL_ERROR, new CrsCreationException(null, "m").cause()); + } + + @Test + public void causeIsIndependentOfGetCause() { + RuntimeException underlying = new RuntimeException("io"); + CrsCreationException e = + new CrsCreationException(ErrorCause.DATABASE_UNAVAILABLE, "no db", underlying); + assertEquals(ErrorCause.DATABASE_UNAVAILABLE, e.cause()); + assertSame(underlying, e.getCause()); + + // ...and the legacy no-underlying-cause form leaves getCause() null. + assertNull(new InvalidValueException("m").getCause()); + } + + // ------------------------------------------------------------- preserved legacy constructors + + @Test + public void projectionExceptionPreservesErr17AndTheProjectionConstructor() { + assertEquals("non-convergent inverse meridinal dist", ProjectionException.ERR_17); + MercatorProjection merc = new MercatorProjection(); + ProjectionException e = new ProjectionException(merc, ProjectionException.ERR_17); + assertEquals(merc.toString() + ": " + ProjectionException.ERR_17, e.getMessage()); + } + + @Test + public void noArgProjectionExceptionStillHasNoMessage() { + assertNull(new ProjectionException().getMessage()); + } + + @Test + public void newlyAddedCauseCarryingConstructorsRefineTheDefault() { + assertEquals(ErrorCause.MISSING_PARAM, + new InvalidValueException(ErrorCause.MISSING_PARAM, "m").cause()); + assertEquals(ErrorCause.CRS_TYPE_NOT_SUPPORTED, + new UnsupportedParameterException(ErrorCause.CRS_TYPE_NOT_SUPPORTED, "m").cause()); + assertEquals(ErrorCause.INVALID_COORDINATE, + new ProjectionException(ErrorCause.INVALID_COORDINATE, "m").cause()); + assertEquals(ErrorCause.UNKNOWN_CRS, + new UnknownAuthorityCodeException(ErrorCause.UNKNOWN_CRS, "m").cause()); + } + + @Test + public void everyAttributedExceptionReportsACauseFromTheRightGroup() { + for (Proj4jException e : oneOfEach()) { + ErrorCause cause = e.cause(); + if (e instanceof CrsCreationException) { + assertTrue(e.getClass().getSimpleName() + " reports " + cause + + ", which is neither a CRS nor an operation error", + cause.isCrsError() || cause.isOperationError()); + } else if (e instanceof CrsTransformException) { + assertTrue(e.getClass().getSimpleName() + " reports " + cause + + ", which is not a per-coordinate error", cause.isCoordinateError()); + } else { + assertEquals(ErrorCause.INTERNAL_ERROR, cause); + } + } + } + + // ------------------------------------------------------------------------------------ helpers + + private static Proj4jException[] oneOfEach() { + return new Proj4jException[] { + new Proj4jException("base"), + new CrsTransformException(ErrorCause.NUMERICAL_FAILURE, "transform"), + new CrsCreationException(ErrorCause.NO_OPERATION_AVAILABLE, "creation"), + new UnknownAuthorityCodeException("EPSG:99999"), + new InvalidValueException("bad value"), + new ContradictoryParameterException("+rf and +f disagree"), + new UnsupportedParameterException("+unknown"), + new ProjectionException("out of domain"), + new ConvergenceFailureException("did not converge"), + }; + } + + private static Class[] allExceptionClasses() { + return new Class[] { + CrsTransformException.class, + CrsCreationException.class, + UnknownAuthorityCodeException.class, + InvalidValueException.class, + ContradictoryParameterException.class, + UnsupportedParameterException.class, + ProjectionException.class, + ConvergenceFailureException.class, + }; + } + + /** Guards against an accidental {@code fail()} import removal in a future edit. */ + @Test + public void sanity() { + if (oneOfEach().length != 9) { + fail("the one-of-each fixture must cover every class in the hierarchy"); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/GridFileVersusInitKeyCauseTest.java b/core/src/test/java/org/locationtech/proj4j/errors/GridFileVersusInitKeyCauseTest.java new file mode 100644 index 0000000..49c45ff --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/GridFileVersusInitKeyCauseTest.java @@ -0,0 +1,271 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.pipeline.PipelineDefinitionException; +import org.locationtech.proj4j.pipeline.PipelineErrorCode; +import org.locationtech.proj4j.pipeline.PipelineFactory; + +/** + * Two unrelated situations that once shared one {@link PipelineErrorCode}, and therefore + * one wrong {@link ErrorCause}. + * + *

The defect

+ * + *

{@code PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID} carried + * {@link ErrorCause#INVALID_PARAM_VALUE} — a {@code Group.CRS} cause meaning the + * value you wrote for this parameter is wrong — into every + * {@link PipelineDefinitionException}, including the ones raised because a grid or model + * file could not be read. A consumer that caught an unreadable grid was told its + * CRS parameter value was invalid, and on a 13-row failure set every row reported the + * wrong reason. {@link ErrorCause#MISSING_GRID} ({@code Group.OPERATION}) exists for + * exactly this and says so in its own javadoc. + * + *

Both directions, because one of them is the control

+ * + *

The grid tests below only show that a constant can be changed. The {@code +init=} + * tests are what makes them a measurement: an {@code +init=} key with no matching section + * is genuinely a bad parameter value — {@code get_init_string} + * ({@code 9.8.1:src/init.cpp:105,119,134}) sets + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE} for all three of its failure modes — so + * that population must keep {@link ErrorCause#INVALID_PARAM_VALUE} and + * {@code Group.CRS}. If the split were made backwards, or collapsed back into one + * constant, the two directions cannot both pass. + * + *

{@link #theCheckerItselfDetectsASwappedMapping()} is the positive control required by + * the project's non-negotiable 5c: it feeds each checker a fabricated exception carrying + * the other population's code and requires the checker to reject it. Without it, + * a checker that had quietly stopped asserting anything would report the same clean pass. + */ +public class GridFileVersusInitKeyCauseTest { + + private final PipelineFactory factory = new PipelineFactory(); + + /** + * Definitions whose failure is "a file this operation needs could not be read". + * Each entry is {definition, a fragment the message must contain}. The fragment is + * what proves the probe reached the intended site rather than tripping over an + * earlier {@code MISSING_ARG} or a routing gap. + */ + private static final String[][] UNREADABLE_FILE_PROBES = { + // HorizontalGrids.open - the +grids= list resolves to nothing. + {"+proj=hgridshift +grids=i_do_not_exist", "could not find required grid(s)"}, + // TinShiftOperator.read - the resolution chain has no such resource. + {"+proj=tinshift +file=i_do_not_exist", "Cannot open i_do_not_exist"}, + // PipelineJson.invalid - INDEX *does* resolve on the classpath (it is the grid + // pack manifest) and is emphatically not a triangulation model. "Present but + // unusable" is the other half of PROJ's own FILE_NOT_FOUND_OR_INVALID. + {"+proj=tinshift +file=INDEX", "invalid model"}, + // DeformationOperator - the horizontal list is opened first, so this is + // HorizontalGrids again by way of +xy_grids. + {"+proj=deformation +xy_grids=i_do_not_exist +z_grids=also_not +ellps=GRS80 +dt=1", + "could not find required grid(s)"}, + // DeformationOperator.openVerticalGrids - only reachable behind a +xy_grids + // that does resolve, which is why it needs a probe of its own rather than + // being assumed covered by the line above. + {"+proj=deformation +xy_grids=ntv2_0_downsampled.gsb +z_grids=i_do_not_exist " + + "+ellps=GRS80 +dt=1", "could not find requested z_grid(s)"}, + }; + + /** + * Definitions whose failure is "the {@code +init=} key you wrote is not a usable + * key". All three of {@code init.cpp}'s modes: no colon, no such init file, no such + * section in a file that does exist. + */ + private static final String[][] BAD_INIT_KEY_PROBES = { + {"+proj=pipeline +step +init=nocolonhere", "not of the form"}, + {"+proj=pipeline +step +init=no_such_init_file:some_section", "no init file"}, + {"+proj=pipeline +step +init=epsg:999999999", "no section"}, + }; + + // ------------------------------------------------- direction 1: unreadable files + + @Test + public void anUnreadableGridOrModelFileSurfacesMissingGrid() { + for (int i = 0; i < UNREADABLE_FILE_PROBES.length; i++) { + String definition = UNREADABLE_FILE_PROBES[i][0]; + checkUnreadableFile(definition, capture(definition), + UNREADABLE_FILE_PROBES[i][1]); + } + } + + /** + * The one bit the conformance bridge reads. proj4j failing to read a file is a fact + * about proj4j's readers; claiming PROJ would have refused the same definition turns + * a capability gap into apparent conformance. + */ + @Test + public void anUnreadableFileIsNotClaimedAsAnUpstreamRejection() { + for (int i = 0; i < UNREADABLE_FILE_PROBES.length; i++) { + String definition = UNREADABLE_FILE_PROBES[i][0]; + PipelineDefinitionException e = capture(definition); + assertFalse(definition + ": proj4j not being able to read a file is not " + + "evidence that PROJ 9.8.1 would reject the definition", + e.isRejectedByProj()); + } + } + + // ------------------------------------- direction 2: the control, a bad +init= key + + @Test + public void anInitKeyWithNoSectionStillSurfacesInvalidParamValue() { + for (int i = 0; i < BAD_INIT_KEY_PROBES.length; i++) { + String definition = BAD_INIT_KEY_PROBES[i][0]; + checkBadInitKey(definition, capture(definition), BAD_INIT_KEY_PROBES[i][1]); + } + } + + /** PROJ really does refuse these, so here the claim of upstream agreement is honest. */ + @Test + public void aBadInitKeyIsClaimedAsAnUpstreamRejection() { + for (int i = 0; i < BAD_INIT_KEY_PROBES.length; i++) { + String definition = BAD_INIT_KEY_PROBES[i][0]; + assertTrue(definition + ": init.cpp:105,119,134 all set an errno", + capture(definition).isRejectedByProj()); + } + } + + // --------------------------------------------------------------- the separation + + /** + * The two situations must not share a code, a cause, a group, or the + * rejected-by-PROJ bit. Collapsing them back into one constant is the defect, in + * whichever direction it is done. + */ + @Test + public void theTwoPopulationsAreSeparatedOnEveryAxisThatMatters() { + PipelineErrorCode file = PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID; + PipelineErrorCode init = PipelineErrorCode.INVALID_INIT_KEY; + + assertNotEquals("one constant serving both situations is the defect", file, init); + assertEquals(ErrorCause.MISSING_GRID, file.errorCause()); + assertEquals(ErrorCause.INVALID_PARAM_VALUE, init.errorCause()); + assertTrue("MISSING_GRID is an operation-planning fact", + file.errorCause().isOperationError()); + assertTrue("INVALID_PARAM_VALUE is a CRS-definition fact", + init.errorCause().isCrsError()); + assertFalse(file.isRejectedByProj()); + assertTrue(init.isRejectedByProj()); + + // The errnos are upstream's, not ours: 1029 for a grid/model file + // (grids.cpp, tinshift.cpp:92-127, deformation.cpp:377-391); 1027 for an +init= + // key (init.cpp:105,119,134). + assertEquals(1029, file.projErrno()); + assertEquals(1027, init.projErrno()); + } + + // --------------------------------------------------------- the positive control + + /** + * Prove the checkers can fail before believing that they passed. Each is handed a + * fabricated {@link PipelineDefinitionException} carrying the other population's code + * — exactly what a swapped or collapsed mapping would produce at the real call sites + * — and must reject it. + */ + @Test + public void theCheckerItselfDetectsASwappedMapping() { + PipelineDefinitionException asInit = new PipelineDefinitionException( + PipelineErrorCode.INVALID_INIT_KEY, "fabricated: could not find required grid(s)"); + PipelineDefinitionException asFile = new PipelineDefinitionException( + PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, "fabricated: no section "); + + assertRejects("the unreadable-file checker accepted an INVALID_PARAM_VALUE/Group.CRS " + + "exception, so its clean result on the real engine means nothing", + new Check() { + @Override + public void run(PipelineDefinitionException e) { + checkUnreadableFile("fabricated", e, "could not find required grid(s)"); + } + }, asInit); + + assertRejects("the bad-init-key checker accepted a MISSING_GRID/Group.OPERATION " + + "exception, so its clean result on the real engine means nothing", + new Check() { + @Override + public void run(PipelineDefinitionException e) { + checkBadInitKey("fabricated", e, "no section "); + } + }, asFile); + } + + // ------------------------------------------------------------------- machinery + + private interface Check { + void run(PipelineDefinitionException e); + } + + private static void assertRejects(String why, Check check, PipelineDefinitionException e) { + try { + check.run(e); + } catch (AssertionError expected) { + return; + } + fail(why); + } + + /** Everything a consumer sees, asserted in one place so the control can re-use it. */ + private static void checkUnreadableFile(String definition, PipelineDefinitionException e, + String messageFragment) { + assertTrue(definition + ": the message must name the file - was: " + e.getMessage(), + e.getMessage().contains(messageFragment)); + assertEquals(definition, PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, e.code()); + assertEquals(definition + ": an unreadable grid is not a bad CRS parameter value", + ErrorCause.MISSING_GRID, e.cause()); + assertTrue(definition + ": MISSING_GRID is Group.OPERATION", e.cause().isOperationError()); + assertFalse(definition + ": and therefore not Group.CRS", e.cause().isCrsError()); + assertEquals(definition, "crs.missing_grid", e.cause().metricKey()); + } + + private static void checkBadInitKey(String definition, PipelineDefinitionException e, + String messageFragment) { + assertTrue(definition + ": the message must name the key - was: " + e.getMessage(), + e.getMessage().contains(messageFragment)); + assertEquals(definition, PipelineErrorCode.INVALID_INIT_KEY, e.code()); + assertEquals(definition + ": an unusable +init= key really is a bad parameter value", + ErrorCause.INVALID_PARAM_VALUE, e.cause()); + assertTrue(definition + ": INVALID_PARAM_VALUE is Group.CRS", e.cause().isCrsError()); + assertFalse(definition + ": and therefore not Group.OPERATION", + e.cause().isOperationError()); + assertEquals(definition, "crs.invalid_param_value", e.cause().metricKey()); + } + + /** + * @return the rejection the engine raised; fails if it did not raise one, or raised + * something a consumer could not classify + */ + private PipelineDefinitionException capture(String definition) { + try { + factory.create(definition); + } catch (PipelineDefinitionException e) { + return e; + } catch (Proj4jException e) { + throw new AssertionError(definition + ": expected a classifiable " + + "PipelineDefinitionException, got " + e.getClass().getName() + ": " + + e.getMessage()); + } + throw new AssertionError(definition + ": expected a rejection, the engine accepted it - " + + "this probe no longer measures anything"); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/NonConvergenceTest.java b/core/src/test/java/org/locationtech/proj4j/errors/NonConvergenceTest.java new file mode 100644 index 0000000..5f467d7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/NonConvergenceTest.java @@ -0,0 +1,466 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.lang.reflect.Field; + +import org.junit.Test; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.BoggsProjection; +import org.locationtech.proj4j.proj.Eckert4Projection; +import org.locationtech.proj4j.proj.EquidistantConicProjection; +import org.locationtech.proj4j.proj.FoucautSinusoidalProjection; +import org.locationtech.proj4j.proj.HatanoProjection; +import org.locationtech.proj4j.proj.KrovakProjection; +import org.locationtech.proj4j.proj.McBrydeThomasFlatPolarQuarticProjection; +import org.locationtech.proj4j.proj.McBrydeThomasFlatPolarSine2Projection; +import org.locationtech.proj4j.proj.MolleweideProjection; +import org.locationtech.proj4j.proj.NellHProjection; +import org.locationtech.proj4j.proj.NellProjection; +import org.locationtech.proj4j.proj.PutninsP2Projection; +import org.locationtech.proj4j.proj.RobinsonProjection; + +/** + * Every non-convergence site in the owned projections throws rather than returning a coordinate. + * + *

These tests call the radian hooks ({@code project(double, double, ProjCoordinate)} + * and {@code projectInverse(double, double, ProjCoordinate)}) directly rather than going through + * {@code CoordinateTransform}. That is deliberate: an input-domain guard higher up the stack would + * otherwise reject the trigger before the iteration ever runs, and these assertions are about the + * iteration. + * + *

The destination coordinate is always poisoned with {@code 1e300} before the call. Several of + * these kernels used to accumulate their Newton correction into the destination ordinate — reading + * back a value the caller supplied — and a poisoned destination is what makes that visible instead + * of accidentally harmless. + * + *

What "returns a coordinate" meant before

+ *
    + *
  • Five clamped to a pole: {@code eck4}, {@code moll} (and through it {@code wag4} and + * {@code wag5}), {@code putp2}, {@code fouc_s}, {@code nell_h}. A pole is a specific, in-range, + * plausible coordinate — the worst possible way to report a failure. + *

    {@code eck4} has since been taken off that list, and its assertion here inverted. + * Its clamp is not a failure report: it is the closed-form limit, and + * {@code builtins.gie}'s own expected values at {@code (±180, ±90)} are exactly the numbers it + * produces. See {@link #eckert4ForwardUsesUpstreamsPoleFallBackRatherThanThrowing}. The other + * four are unaffected — for them upstream's clamp really is on a failure path.

  • + *
  • Eight had no convergence test at all and returned the last iterate: + * {@code boggs}, {@code hatano}, {@code mbtfpq}, {@code mbt_fps}, {@code nell}, + * {@code robin}, and {@code eqdc} — where the accumulator started at {@code 0}, so a + * zero-iteration exit produced latitude 0.
  • + *
  • {@code krovak}'s inverse had no iteration cap: not a wrong answer but a hung + * thread.
  • + *
+ */ +public class NonConvergenceTest { + + /** The value every destination is poisoned with, to catch a stale read. */ + private static final double POISON = 1e300; + + private static ProjCoordinate poisoned() { + return new ProjCoordinate(POISON, POISON, POISON); + } + + /** + * Asserts the call threw {@link ConvergenceFailureException} with + * {@link ErrorCause#NUMERICAL_FAILURE}, and that nothing was written into the destination that + * a caller could mistake for a result. + */ + private static void assertThrowsConvergence(String what, Runnable call) { + try { + call.run(); + fail(what + " must throw on non-convergence, not return a coordinate"); + } catch (ConvergenceFailureException e) { + assertEquals(what + ": wrong ErrorCause", ErrorCause.NUMERICAL_FAILURE, e.cause()); + assertTrue(what + ": the message must name the projection and the iteration count, " + + "so an operator can act on it. Was: " + e.getMessage(), + e.getMessage() != null && e.getMessage().contains("iterations")); + } + } + + // -------------------------------------------------------- the five that clamped to a pole + + /** + * This assertion has been inverted, and the previous version of it was wrong. + * + *

{@code eck4}'s Newton iteration genuinely does not converge at a pole — the derivative + * {@code 1 + c(c+2) - s^2} tends to 0 there — and upstream's fall-back is not a failure + * report. It is the closed-form limit, returned as a success: + * {@code xy.x = C_x * lam}, {@code xy.y = theta < 0 ? -C_y : C_y}. + * + *

The corpus settles it. {@code builtins.gie}'s {@code +proj=eck4 +a=6400000} block has + * {@code accept -180 90} / {@code expect -8489602.7403 8489602.7403}, and those two numbers are + * exactly {@code C_x * pi * a} and {@code C_y * a} — the fall-back's output, to ten significant + * figures, at a {@code tolerance 0.1 mm}. Throwing here cost four assertions; so would a + * "better" iteration. Non-negotiable 7 of this port: where upstream's expected values were + * generated by upstream's approximation, port the approximation. + * + *

A {@code NaN} latitude therefore comes back as the pole, in both libraries — {@code sin(NaN)} + * is {@code NaN}, every {@code fabs(V) < EPS} test is false, the loop exhausts, and + * {@code NaN < 0.} is false so the sign is positive. That is not a sentinel this projection + * minted; it is what PROJ answers, and {@code Projection.projectRadians} deliberately propagates + * caller-supplied {@code NaN} rather than rejecting it. + */ + @Test + public void eckert4ForwardUsesUpstreamsPoleFallBackRatherThanThrowing() { + final Eckert4Projection p = new Eckert4Projection(); + final ProjCoordinate out = poisoned(); + p.project(0.1, Double.NaN, out); + // C_x = 2/sqrt(4pi + pi^2), C_y = 2*sqrt(pi/(4+pi)), on the unit sphere. + assertEquals("Eckert IV easting is C_x * lam", .42223820031577120149 * 0.1, out.x, 1e-15); + assertEquals("Eckert IV northing is +C_y", 1.32650042817700232218, out.y, 1e-15); + } + + @Test + public void mollweideForwardThrowsInsteadOfClampingToAPole() { + final MolleweideProjection p = new MolleweideProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Mollweide forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + assertPoleNotReturned("Mollweide", out); + } + + /** The same kernel serves {@code wag4} and {@code wag5}, so it is closed for them too. */ + @Test + public void wagnerIvAndVForwardThrowInsteadOfClampingToAPole() { + for (final int type : new int[] { MolleweideProjection.WAGNER4, + MolleweideProjection.WAGNER5 }) { + final MolleweideProjection p = new MolleweideProjection(type); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Mollweide kernel type " + type, new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + } + } + + @Test + public void putninsP2ForwardThrowsInsteadOfClampingToPiOverThree() { + final PutninsP2Projection p = new PutninsP2Projection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Putnins P2 forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + assertPoleNotReturned("Putnins P2", out); + } + + @Test + public void foucautSinusoidalInverseThrowsInsteadOfClampingToAPole() throws Exception { + final FoucautSinusoidalProjection p = new FoucautSinusoidalProjection(); + // +n is not parsed by Proj4Parser, so the iterating branch is only reachable with n != 0. + // Reflection is the only way to exercise a fail-open that is otherwise unreachable, and + // an unreachable fail-open is still a defect: the moment +n is wired up it is live. + Field n = FoucautSinusoidalProjection.class.getDeclaredField("n"); + n.setAccessible(true); + n.setDouble(p, 0.5); + Field n1 = FoucautSinusoidalProjection.class.getDeclaredField("n1"); + n1.setAccessible(true); + n1.setDouble(p, 0.5); + + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Foucaut Sinusoidal inverse", new Runnable() { + public void run() { + p.projectInverse(0.1, Double.NaN, out); + } + }); + } + + @Test + public void nellHammerInverseThrowsInsteadOfClampingToAPole() { + final NellHProjection p = new NellHProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Nell-Hammer inverse", new Runnable() { + public void run() { + p.projectInverse(0.1, Double.NaN, out); + } + }); + assertPoleNotReturned("Nell-Hammer", out); + } + + // ------------------------------------------- the ones with no convergence test at all + + @Test + public void boggsForwardThrowsInsteadOfReturningTheLastIterate() { + final BoggsProjection p = new BoggsProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Boggs forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + } + + @Test + public void hatanoForwardThrowsInsteadOfReturningTheLastIterate() { + final HatanoProjection p = new HatanoProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Hatano forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + } + + @Test + public void mcBrydeThomasFlatPolarQuarticForwardThrows() { + final McBrydeThomasFlatPolarQuarticProjection p = + new McBrydeThomasFlatPolarQuarticProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("McBryde-Thomas Flat-Polar Quartic forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + } + + @Test + public void mcBrydeThomasFlatPolarSine2ForwardThrows() { + final McBrydeThomasFlatPolarSine2Projection p = + new McBrydeThomasFlatPolarSine2Projection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("McBryde-Thomas Flat-Pole Sine (No. 2) forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + } + + @Test + public void nellForwardThrows() { + final NellProjection p = new NellProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Nell forward", new Runnable() { + public void run() { + p.project(0.1, Double.NaN, out); + } + }); + } + + @Test + public void robinsonInverseThrows() { + final RobinsonProjection p = new RobinsonProjection(); + final ProjCoordinate out = poisoned(); + assertThrowsConvergence("Robinson inverse", new Runnable() { + public void run() { + p.projectInverse(0.1, Double.NaN, out); + } + }); + } + + // ------------------------------------------------------------------------- krovak liveness + + /** + * {@code KrovakProjection.projectInverse} was {@code do { … } while (ok == 0);} with no cap and + * an exit tolerance of 1e-15 radians. Without the cap this test does not fail — it + * hangs, which is exactly the production symptom: not a rejected row, a task that never + * returns. The timeout is the assertion. + */ + @Test(timeout = 10000) + public void krovakInverseIsCappedRatherThanSpinningForever() { + final KrovakProbe p = new KrovakProbe(); + final ProjCoordinate out = poisoned(); + // The NaN no longer reaches the loop at all: krovak's inverse now routes its two arcsines + // through ProjectionMath.asinChecked, whose one deliberate divergence from upstream's aasin + // is that a NaN argument raises instead of being returned. So the rejection is strictly + // earlier than the cap, and still NUMERICAL_FAILURE. The cap remains the guarantee for a + // finite input that does not settle; the timeout is still the assertion that neither path + // hangs, which is the production symptom this test exists for. + try { + p.invert(Double.NaN, Double.NaN, out); + fail("Krovak inverse of (NaN, NaN) must raise rather than return a coordinate"); + } catch (ProjectionException e) { + assertEquals("Krovak inverse: wrong ErrorCause", + ErrorCause.NUMERICAL_FAILURE, e.cause()); + } + assertEquals("nothing may have been written into the destination", POISON, out.x, 0.0); + assertEquals("nothing may have been written into the destination", POISON, out.y, 0.0); + } + + /** Exposes Krovak's protected inverse hook, which it does not widen to public. */ + private static final class KrovakProbe extends KrovakProjection { + ProjCoordinate invert(double x, double y, ProjCoordinate dst) { + return projectInverse(x, y, dst); + } + } + + // ------------------------------------------------------- eqdc: the zero-initialised phi + + /** + * {@code eqdc}'s inverse used a Newton loop over a {@code phi} initialised to {@code 0}, with + * no convergence test, so a zero-iteration exit returned latitude exactly 0. The site is now + * gone rather than guarded: upstream's inverse is {@code pj_inv_mlfn}, and Proj4J's + * {@link org.locationtech.proj4j.util.MeridianArc#invMlfn} is closed-form, so there is no + * iteration left to fail. This asserts the property that mattered — the inverse of a real + * coordinate is not latitude 0. + */ + @Test + public void equidistantConicInverseNeverSilentlyReturnsLatitudeZero() { + EqdcProbe p = new EqdcProbe(); + ProjCoordinate fwd = poisoned(); + p.forward(Math.toRadians(0.5), Math.toRadians(40.5), fwd); + ProjCoordinate back = poisoned(); + p.invert(fwd.x, fwd.y, back); + assertEquals("eqdc inverse must recover the latitude, not fall out of an unconverged " + + "loop at zero", Math.toRadians(40.5), back.y, 1e-12); + assertTrue("eqdc inverse must not return the equator", Math.abs(back.y) > 0.1); + } + + /** Exposes eqdc's protected radian hooks. */ + private static final class EqdcProbe extends EquidistantConicProjection { + ProjCoordinate forward(double lam, double phi, ProjCoordinate dst) { + return project(lam, phi, dst); + } + + ProjCoordinate invert(double x, double y, ProjCoordinate dst) { + return projectInverse(x, y, dst); + } + } + + // ------------------------------------------------------------------------------ regression + + /** + * The converged path must still be right. Four of these kernels accumulated their Newton + * correction into the destination ordinate instead of into the running latitude, so the + * correction was identical on every trip and the loop could never converge at all — the + * output was computed from the raw geographic latitude where the solved parametric latitude + * belongs. Values are PROJ 9.8.1's, from {@code proj +a=6400000} at (2, 40) degrees. + */ + @Test + public void repairedForwardsMatchProj981() { + final PutninsP2Projection putp2 = new PutninsP2Projection(); + assertForward("putp2", 172470.547625, 4621770.512966, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + putp2.project(lam, phi, out); + } + }); + final McBrydeThomasFlatPolarQuarticProjection mbtfpq = + new McBrydeThomasFlatPolarQuarticProjection(); + assertForward("mbtfpq", 176107.408014, 4627302.715424, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + mbtfpq.project(lam, phi, out); + } + }); + final McBrydeThomasFlatPolarSine2Projection mbtfps = + new McBrydeThomasFlatPolarSine2Projection(); + assertForward("mbt_fps", 178195.220393, 4775502.443544, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + mbtfps.project(lam, phi, out); + } + }); + final NellProjection nell = new NellProjection(); + assertForward("nell", 199464.679483, 4268597.459204, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + nell.project(lam, phi, out); + } + }); + final NellHProjection nellH = new NellHProjection(); + assertForward("nell_h", 197269.057721, 4277266.771604, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + nellH.project(lam, phi, out); + } + }); + + // ...and four whose iteration was already correct, as a control on the harness itself. + final Eckert4Projection eck4 = new Eckert4Projection(); + assertForward("eck4", 170340.467656, 5027279.116777, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + eck4.project(lam, phi, out); + } + }); + final MolleweideProjection moll = new MolleweideProjection(); + assertForward("moll", 170437.534251, 4805816.268817, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + moll.project(lam, phi, out); + } + }); + final BoggsProjection boggs = new BoggsProjection(); + assertForward("boggs", 171021.780049, 4630530.614145, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + boggs.project(lam, phi, out); + } + }); + final HatanoProjection hatano = new HatanoProjection(); + assertForward("hatano", 170035.571625, 5010653.698434, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + hatano.project(lam, phi, out); + } + }); + final RobinsonProjection robin = new RobinsonProjection(); + assertForward("robin", 174736.647081, 4291010.076542, new Forward() { + public void project(double lam, double phi, ProjCoordinate out) { + robin.project(lam, phi, out); + } + }); + } + + /** + * The radian forward hook. Needed because {@code Projection}'s declaration is protected and + * only the concrete subclasses widen it to public, so a {@code Projection}-typed variable + * cannot be used from this package. + */ + private interface Forward { + void project(double lam, double phi, ProjCoordinate out); + } + + /** + * {@code nell_h}'s inverse iterated over a constant, so it exhausted its budget and clamped to + * a pole for essentially every input. With the iteration repaired it reproduces PROJ. + */ + @Test + public void nellHammerInverseMatchesProj981() { + NellHProjection p = new NellHProjection(); + ProjCoordinate out = poisoned(); + // proj -I +proj=nell_h +a=6400000 <<< "222390.0 4400000.0" + p.projectInverse(222390.0 / 6400000.0, 4400000.0 / 6400000.0, out); + assertEquals(2.273318099, Math.toDegrees(out.x), 1e-9); + assertEquals(41.273369782, Math.toDegrees(out.y), 1e-9); + } + + private static void assertForward(String name, double expectedX, double expectedY, + Forward forward) { + final double radius = 6400000.0; + ProjCoordinate out = poisoned(); + // The radian hooks work on the unit sphere; the affine post-multiply by the radius is + // Projection.projectRadians' job, and is applied here so the numbers are PROJ's. + forward.project(Math.toRadians(2), Math.toRadians(40), out); + assertEquals(name + " easting", expectedX, out.x * radius, 1e-6); + assertEquals(name + " northing", expectedY, out.y * radius, 1e-6); + } + + /** + * A pole, on the unit sphere the radian hooks work in, is {@code ±HALFPI} in the latitude + * ordinate. This asserts the destination was not quietly filled with one on the way out. + */ + private static void assertPoleNotReturned(String what, ProjCoordinate out) { + assertTrue(what + " must leave the destination untouched when it throws, not fill it " + + "with a pole; found y=" + out.y, + out.y == POISON || Double.isNaN(out.y) + || Math.abs(Math.abs(out.y) - Math.PI / 2) > 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/errors/RegistryProjectionTest.java b/core/src/test/java/org/locationtech/proj4j/errors/RegistryProjectionTest.java new file mode 100644 index 0000000..d7b4685 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/errors/RegistryProjectionTest.java @@ -0,0 +1,198 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.errors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code Registry.getProjection} for {@code alsk}, {@code apian} and {@code bacon} — the three + * names that used to be bound to the abstract {@link Projection} base class. All three are now + * real implementations, so this class has become a regression net rather than a defect record. + * + *

Three states, in order: + * + *

    + *
  1. 1.4.3: fail-closed with a lie and a side effect. {@code Class.newInstance()} threw + * {@link InstantiationException}; the catch printed a stack trace to {@code System.err} and + * returned {@code null}; {@code Proj4Parser} then reported "Unknown projection: alsk". + * A registered name reported as unknown, plus an unsolicited stack trace that every host + * process — including every Spark executor — got and could not turn off.
  2. + *
  3. Interim: an honest {@link UnsupportedParameterException} carrying + * {@link ErrorCause#PROJECTION_NOT_IMPLEMENTED}, naming the class and saying "not + * implemented", with nothing written to stderr.
  4. + *
  5. Now: implemented. {@code apian}/{@code bacon} from upstream's {@code bacon.cpp}; + * {@code alsk} from the {@code mod_ster} port. Nothing in the registry is uninstantiable.
  6. + *
+ * + *

Corrected record, kept because it was asserted wrongly more than once: these three did + * not silently return lon/lat as if projected. An earlier analysis claimed they were + * identity no-ops on the base class's {@code project()}. They were not — they were uninstantiable, + * which is a different defect with a different fix. + */ +public class RegistryProjectionTest { + + /** The three names registered to the abstract base class. */ + private static final String[] ABSTRACT_NAMES = { "alsk", "apian", "bacon" }; + + private PrintStream originalErr; + private ByteArrayOutputStream captured; + + @Before + public void captureStandardError() throws UnsupportedEncodingException { + originalErr = System.err; + captured = new ByteArrayOutputStream(); + System.setErr(new PrintStream(captured, true, "UTF-8")); + } + + @After + public void restoreStandardError() { + System.setErr(originalErr); + } + + private String stderr() throws UnsupportedEncodingException { + System.err.flush(); + return captured.toString("UTF-8"); + } + + /** + * Inverted from what it was, because the defect it pinned is gone. This used to sweep + * {@link #ABSTRACT_NAMES} and assert each one threw, because {@code alsk}, + * {@code apian} and {@code bacon} were registered against the abstract {@link Projection} + * base class and were therefore uninstantiable — see the class javadoc's correction: + * they did not silently return lon/lat as if projected, and repeating that claim here + * would reintroduce an error this file already retracted once. + * + *

All three are now real implementations ({@code apian}/{@code bacon} from + * {@code bacon.cpp}; {@code alsk} from the {@code mod_ster} port), so there is no longer any + * abstractly-registered name to test. Rather than delete the coverage or invent a fixture, + * this asserts the invariant those three used to violate — which is both stronger + * and, now, actually true: every registered {@code +proj=} name resolves to something + * instantiable, and nothing writes to stderr doing it. + * + *

If a future registration binds a name to an abstract class again, this fails on that + * name — which is what the old test was really for. + */ + @Test + public void everyRegisteredNameResolvesAndNothingTouchesStderr() + throws UnsupportedEncodingException { + Registry registry = new Registry(); + List broken = new ArrayList(); + for (String name : ABSTRACT_NAMES) { + try { + Projection p = registry.getProjection(name); + if (p == null) { + broken.add(name + " -> null (not registered at all?)"); + } else if (p.getClass() == Projection.class) { + broken.add(name + " -> the abstract base class itself"); + } + } catch (UnsupportedParameterException e) { + broken.add(name + " -> " + e.getMessage()); + } + } + assertEquals("these names were fixed and must stay fixed", "[]", broken.toString()); + assertEquals("Registry must never write to System.err", "", stderr()); + } + + /** + * {@code alsk} resolves to the real Alaska modified-stereographic port, not to the abstract + * base and not to a "registered but not implemented" refusal. + * + *

This no longer asserts the registry description, and that is worth a note rather than a + * silent omission. {@code Registry.projDescriptions} is private with no accessor, and + * its only reader was the "registered but not implemented" message — which is now + * unreachable, because no name is registered to an uninstantiable class any more. So the + * description map is effectively write-only: 100-odd human-readable strings that + * nothing can read. Either expose an accessor (it is genuinely useful for + * {@code describe()}-style introspection, which a downstream consumer has asked for) or drop + * the map. Do not re-add an assertion here until one of those happens. + */ + @Test + public void alskResolvesToTheRealImplementation() { + Projection p = new Registry().getProjection("alsk"); + assertNotNull("alsk must resolve now that mod_ster is ported", p); + assertFalse("alsk must not be the abstract base class", + p.getClass() == Projection.class); + } + + /** + * A name that is genuinely absent from the registry must still return {@code null}: that is the + * signal {@code Proj4Parser} turns into {@code "Unknown projection: …"}, and it is the one + * meaning of {@code null} this method keeps. + */ + @Test + public void anUnregisteredNameStillReturnsNull() throws UnsupportedEncodingException { + Registry registry = new Registry(); + assertNull(registry.getProjection("no_such_projection_name")); + assertNull(registry.getProjection("")); + assertEquals("", stderr()); + } + + @Test + public void aNormalNameStillResolvesAndCarriesItsName() { + Registry registry = new Registry(); + Projection merc = registry.getProjection("merc"); + assertNotNull(merc); + assertEquals("merc", merc.getName()); + } + + /** + * {@code getProjections()} must never propagate an exception — its contract is "the projections + * you can actually use" — and it must never write to stderr. + * + *

Inverted: this used to assert the three names were absent, because they + * were uninstantiable and had to be skipped. They are implemented now, so they must be + * present. Asserting their absence would re-pin the defect. + */ + @Test + public void getProjectionsYieldsEveryRegisteredNameWithoutThrowing() + throws UnsupportedEncodingException { + Registry registry = new Registry(); + List projections = registry.getProjections(); + assertTrue("the registry should still yield the great majority of its names", + projections.size() > 90); + + List names = new ArrayList(); + for (Projection p : projections) { + assertNotNull(p); + names.add(p.getName()); + } + for (String name : ABSTRACT_NAMES) { + assertTrue(name + " is implemented now and must appear in getProjections(); " + + "it was skipped only while it was uninstantiable", + names.contains(name)); + } + assertEquals("getProjections must never write to System.err", "", stderr()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failclosed/GeocentricConverterSentinelTest.java b/core/src/test/java/org/locationtech/proj4j/failclosed/GeocentricConverterSentinelTest.java new file mode 100644 index 0000000..fc3d658 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failclosed/GeocentricConverterSentinelTest.java @@ -0,0 +1,431 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.failclosed; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.datum.GeocentricConverter; + +/** + * {@code GeocentricConverter} must not answer a fabricated coordinate on or near the Z axis. + * + *

The two sentinels

+ * + *

The centre of mass. {@code (0, 0, 0)} has no geodetic latitude, no longitude and no + * height — every meridian and every parallel passes through it. 1.4.3 answered + * {@code (0°, +90°, -b)}: three finite, in-range, entirely plausible ordinates that a + * caller cannot distinguish from a real polar coordinate at depth {@code b}. That one was removed + * by earlier fail-closed work and this test pins it, because upstream still returns it + * ({@code more_builtins.gie} pins {@code accept 0 0 0 / expect 0 90 -6356752.314140356} for + * {@code +proj=cart +ellps=GRS80} inverse) and parity pressure will push it back. + * + *

The on-axis meridian. This one was missed, and it is the more dangerous of the two + * because nothing about the answer looks wrong. The branch read: + * + *

+ * if (P / this.a < genau) {      // P within 6.4 micrometres of the Z axis
+ *     At_Pole = true;             // ... a local that was then never read
+ *     Longitude = 0.0;            // ... a fabricated meridian
+ * }
+ * 
+ * + *

Latitude and height came out correct; only the longitude was invented, and it was invented as + * Greenwich — a specific, plausible meridian that passes every finiteness and range check + * a caller can write. Measured on Clarke 1866 before the fix: the round trip of + * {@code (lon = 17°, lat = 90°, h = 0)} returned {@code lon = 0°}, and + * {@code (X, Y, Z) = (1e-9, 2e-9, b)}, whose longitude is 63.4349°, returned {@code 0°}. + * + *

The fix is {@code Math.atan2(Y, X)} unconditionally, which is exactly what + * {@code 9.8.1:src/conversions/cart.cpp:224} does. It needs no special case: it is well defined + * for every {@code (X, Y)} except {@code (0, 0)}, where IEEE 754 gives + * {@code atan2(+/-0, +0) = +/-0} — the conventional pole longitude, and the value the corpus pins. + * + *

Why the degeneracy guard is {@code RR == 0}, not a tolerance

+ * + *

{@code CT = Z / RR} and {@code ST = P / RR}, so {@code RR == 0} is exactly the condition + * under which the Hannover iteration divides zero by zero. The guard used to be + * {@code RR / a < genau}, i.e. anything within 6.4 µm of the centre, which rejected + * {@code (0, 0, ±1e-6)} — a point whose latitude ({@code ±90°}) and height + * ({@code 1e-6 - b}) are both perfectly well determined — and refused it with a message that + * called it "the centre of mass", which it is not. + * + *

Upstream's values for those points are pinned in {@code more_builtins.gie} as + * {@code accept 0 0 1e-6 / expect 0 90 -6356752.314139356} and the negative counterpart. Note + * those rows are on {@code +proj=cart}, which {@code Registry} does not map — so they are a + * reference for the right answer here, not rows this change turns green, and they become live only + * when {@code cart} is registered. The branch is reachable today through {@code +proj=geocent}, + * which is registered and whose inverse runs this method. + * + *

On the {@code EPSG:4173 → EPSG:26748} reproducer

+ * + *

The golden note attributes {@code (0°, 90°, 0.000104 m)} to + * {@code PAIR/t14/epsg:4173>epsg:26748} probe 4, {@code (5, 5)}. That pair no longer reaches the + * branch: an in-flight {@code tmerc} change moved the forward answer, and the round trip now + * returns to {@code (5, 5)}. {@link #reproducerNeverAnswersThePole()} therefore asserts the + * invariant rather than the stale numbers, so it keeps testing something after the next + * {@code tmerc} change too. + */ +public class GeocentricConverterSentinelTest { + + /** The ellipsoid of NAD27, the datum in the original reproducer. */ + private static final Ellipsoid CLARKE = Ellipsoid.CLARKE_1866; + private static final double A = CLARKE.getA(); + private static final double B = CLARKE.getB(); + + private static final double RTD = 180.0 / Math.PI; + private static final double DTR = Math.PI / 180.0; + + private static GeocentricConverter converter() { + return new GeocentricConverter(CLARKE); + } + + /** + * Poison every ordinate before the call. {@code GeocentricConverter} converts in place, so + * "poison the destination" means: write a value no correct computation could produce into the + * slots the ordinates that are not inputs will occupy, and make the assertions strong + * enough that a stale read fails them. + */ + private static ProjCoordinate poisoned(double x, double y, double z) { + ProjCoordinate c = new ProjCoordinate(); + c.x = c.y = 1e300; + c.z = 1e300; + c.x = x; + c.y = y; + c.z = z; + return c; + } + + private static ProjCoordinate poisonedDst() { + ProjCoordinate c = new ProjCoordinate(); + c.x = c.y = 1e300; + c.z = 1e300; + return c; + } + + // ------------------------------------------- the on-axis meridian must not be invented + + /** + * The headline regression: a polar coordinate must come back on the meridian it went out on. + * Any reintroduction of {@code Longitude = 0.0} on the axis fails this by 17°. + */ + @Test + public void polarRoundTripPreservesTheMeridian() { + GeocentricConverter gc = converter(); + ProjCoordinate p = poisoned(17.0 * DTR, 90.0 * DTR, 0.0); + gc.convertGeodeticToGeocentric(p); + // cos(pi/2) is 6.1e-17, not 0, so a genuine lat = 90 deg input lands about 3.9e-10 m from + // the axis -- comfortably inside the 6.4e-6 m window the deleted branch used, which is why + // an ordinary polar datum shift used to lose its longitude. + double pDist = Math.hypot(p.x, p.y); + assertTrue("a lat = 90 deg forward should land within a nanometre of the axis, not " + + pDist, pDist < 1e-8); + + gc.convertGeocentricToGeodetic(p); + assertEquals("the meridian must survive the round trip; 0 means it was fabricated as " + + "Greenwich", 17.0, p.x * RTD, 1e-6); + assertEquals(90.0, p.y * RTD, 1e-9); + assertEquals(0.0, p.z, 1e-6); + } + + @Test + public void polarRoundTripPreservesTheMeridianInEveryQuadrant() { + GeocentricConverter gc = converter(); + double[] lons = {-179.0, -90.0, -17.0, 0.0, 17.0, 90.0, 179.0}; + for (int i = 0; i < lons.length; i++) { + ProjCoordinate p = poisoned(lons[i] * DTR, 90.0 * DTR, 0.0); + gc.convertGeodeticToGeocentric(p); + gc.convertGeocentricToGeodetic(p); + assertEquals("lon " + lons[i] + " at the north pole", lons[i], p.x * RTD, 1e-6); + ProjCoordinate s = poisoned(lons[i] * DTR, -90.0 * DTR, 0.0); + gc.convertGeodeticToGeocentric(s); + gc.convertGeocentricToGeodetic(s); + assertEquals("lon " + lons[i] + " at the south pole", lons[i], s.x * RTD, 1e-6); + } + } + + /** + * A near-axis point whose longitude is unambiguous. {@code atan2(2e-9, 1e-9)} is + * 63.4349488° to full precision; the deleted branch answered 0°. + */ + @Test + public void nearAxisLongitudeIsComputedNotInvented() { + GeocentricConverter gc = converter(); + double expected = Math.atan2(2e-9, 1e-9) * RTD; + assertEquals(63.43494882292201, expected, 1e-12); + + double[] scales = {1e-9, 1e-7, 1e-6, 1e-5, 1e-3, 1.0}; + for (int i = 0; i < scales.length; i++) { + double s = scales[i]; + ProjCoordinate p = poisoned(1.0 * s, 2.0 * s, B); + gc.convertGeocentricToGeodetic(p); + assertEquals("longitude must be atan2(Y, X) at every distance from the axis, " + + "including inside the deleted 6.4e-6 m window (scale " + s + ")", + expected, p.x * RTD, 1e-9); + } + } + + /** + * The exact pole. {@code atan2(+0, +0) = +0} is the conventional pole longitude and the value + * the corpus pins, so this must succeed — refusing it would be stricter than PROJ: + * {@code more_builtins.gie} pins {@code accept 0 0 6356752.314140347} against + * {@code expect 0 90 0} for {@code +proj=cart +ellps=GRS80} inverse. + */ + @Test + public void exactPoleIsAnsweredWithTheConventionalZeroMeridian() { + GeocentricConverter gc = converter(); + + ProjCoordinate north = poisoned(0.0, 0.0, B); + gc.convertGeocentricToGeodetic(north); + assertEquals(0.0, north.x * RTD, 0.0); + assertEquals(90.0, north.y * RTD, 1e-9); + assertEquals(0.0, north.z, 1e-6); + + ProjCoordinate south = poisoned(0.0, 0.0, -B); + gc.convertGeocentricToGeodetic(south); + assertEquals(0.0, south.x * RTD, 0.0); + assertEquals(-90.0, south.y * RTD, 1e-9); + assertEquals(0.0, south.z, 1e-6); + } + + /** + * One micrometre up the Z axis. Latitude and height are both perfectly determined, so this + * must be answered, not refused. The old {@code RR / a < genau} guard refused it — and + * called it the centre of mass, which it is not. + */ + @Test + public void oneMicrometreUpTheAxisIsAnsweredNotRefused() { + GeocentricConverter gc = converter(); + + ProjCoordinate up = poisoned(0.0, 0.0, 1e-6); + gc.convertGeocentricToGeodetic(up); + assertEquals(0.0, up.x * RTD, 0.0); + assertEquals(90.0, up.y * RTD, 1e-9); + assertEquals(1e-6 - B, up.z, 1e-6); + + ProjCoordinate down = poisoned(0.0, 0.0, -1e-6); + gc.convertGeocentricToGeodetic(down); + assertEquals(-90.0, down.y * RTD, 1e-9); + assertEquals(1e-6 - B, down.z, 1e-6); + } + + /** + * The same three cases through the registered projection that reaches this code, so + * the coverage does not depend on {@code +proj=cart} ever being mapped. {@code +proj=geocent} + * is in {@code Registry} and its inverse runs + * {@code GeocentricConverter.convertGeocentricToGeodetic}. + */ + @Test + public void geocentInverseIsFailClosedOnTheAxis() { + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem geocent = + f.createFromParameters("geocent", "+proj=geocent +ellps=GRS80"); + CoordinateReferenceSystem lonlat = + f.createFromParameters("lonlat", "+proj=longlat +ellps=GRS80"); + CoordinateTransform inv = + new CoordinateTransformFactory().createTransform(geocent, lonlat); + double bGrs80 = Ellipsoid.GRS80.getB(); + + // A near-axis point: the longitude must be computed, not invented as Greenwich. + ProjCoordinate near = poisonedDst(); + inv.transform(new ProjCoordinate(1e-9, 2e-9, bGrs80), near); + assertEquals("near-axis longitude must be atan2(Y, X) = 63.4349 deg, not 0", + 63.43494882292201, near.x, 1e-9); + assertEquals(90.0, near.y, 1e-9); + + // One micrometre up the axis: answered, not refused. + ProjCoordinate up = poisonedDst(); + inv.transform(new ProjCoordinate(0.0, 0.0, 1e-6), up); + assertEquals(0.0, up.x, 0.0); + assertEquals(90.0, up.y, 1e-9); + assertEquals(1e-6 - bGrs80, up.z, 1e-3); + + // The centre of mass: still refused. + ProjCoordinate centre = poisonedDst(); + try { + inv.transform(new ProjCoordinate(0.0, 0.0, 0.0), centre); + fail("+proj=geocent inverse of (0, 0, 0) must be refused, but answered (" + + centre.x + ", " + centre.y + ", " + centre.z + ")"); + } catch (Proj4jException e) { + assertNotNull(e.cause()); + } + } + + // ------------------------------------------------- the centre of mass must stay refused + + @Test + public void centreOfMassIsRefused() { + GeocentricConverter gc = converter(); + ProjCoordinate p = poisoned(0.0, 0.0, 0.0); + try { + gc.convertGeocentricToGeodetic(p); + fail("(0, 0, 0) has no geodetic coordinate at all, but was answered as (" + + (p.x * RTD) + " deg, " + (p.y * RTD) + " deg, " + p.z + ")"); + } catch (Proj4jException e) { + assertNotNull(e.cause()); + assertEquals(ErrorCause.INVALID_COORDINATE, e.cause()); + assertTrue("cause() must be a per-coordinate error: the converter is fine, this " + + "particular point is not", e.cause().isCoordinateError()); + assertNotNull("must carry a message", e.getMessage()); + } + } + + /** + * The shape of the refusal matters as much as its presence. If someone reintroduces a + * sentinel, it will be one of these three, so name them. + */ + @Test + public void centreOfMassIsNeverAnsweredAsAnyKnownSentinel() { + GeocentricConverter gc = converter(); + ProjCoordinate p = poisoned(0.0, 0.0, 0.0); + boolean threw = false; + try { + gc.convertGeocentricToGeodetic(p); + } catch (Proj4jException e) { + threw = true; + } + if (!threw) { + // 1.4.3's answer, and upstream's. + assertNotEquals("(0 deg, +90 deg, -b) is 1.4.3's centre-of-mass fiction", + "0.0/90.0/" + (-B), p.x * RTD + "/" + (p.y * RTD) + "/" + p.z); + // The other two shapes the no-sentinels rule names. + assertTrue("must not answer the input unchanged", p.x != 0.0 || p.y != 0.0); + assertTrue("must not answer a single NaN ordinate paired with finite ones", + Double.isNaN(p.x) == Double.isNaN(p.y) + && Double.isNaN(p.y) == Double.isNaN(p.z)); + fail("(0, 0, 0) must be refused outright"); + } + } + + // ------------------------------------------------------------- convergence + + /** + * The post-loop convergence check is present ({@code GeocentricConverter} raises + * {@link org.locationtech.proj4j.ConvergenceFailureException} when + * {@code SDPHI² > genau²} after {@code maxiter}), so an unconverged iterate can never be + * dressed up as a latitude. This asserts the invariant rather than forcing the branch: on a + * well-formed ellipsoid the Hannover iteration converges in a handful of steps, which is + * precisely why reaching the cap means the inputs are not well formed. + * + *

The outcome for every input below must be one of exactly two things — a correct + * coordinate, or a {@code Proj4jException}. Never a coordinate derived from a loop that gave + * up. + */ + @Test + public void everyOutcomeIsEitherACoordinateOrAProj4jException() { + double[][] xyz = { + {A, 0.0, 0.0}, + {0.0, A, 0.0}, + {-A, 0.0, 0.0}, + {0.0, 0.0, B}, + {0.0, 0.0, -B}, + {0.0, 0.0, 1e-6}, + {1e-30, 1e-30, B}, + {A * 1e6, 0.0, 0.0}, + {A * 1e-6, 0.0, 0.0}, + {0.0, 0.0, 0.0}, + }; + // A near-degenerate ellipsoid as well as a well-formed one: e2 -> 1 is where an + // iteration is most likely to stall. + GeocentricConverter[] gcs = { + converter(), + new GeocentricConverter(A, B, 0.999999), + new GeocentricConverter(A, B, 0.0), + }; + for (int g = 0; g < gcs.length; g++) { + for (int i = 0; i < xyz.length; i++) { + ProjCoordinate p = poisoned(xyz[i][0], xyz[i][1], xyz[i][2]); + try { + gcs[g].convertGeocentricToGeodetic(p); + } catch (Proj4jException e) { + assertNotNull("cause() must never be null", e.cause()); + continue; + } + String at = "converter " + g + ", input (" + xyz[i][0] + ", " + xyz[i][1] + ", " + + xyz[i][2] + ") -> (" + p.x + ", " + p.y + ", " + p.z + ")"; + assertTrue("latitude must be within +/-90 deg: " + at, + Double.isNaN(p.y) || Math.abs(p.y) <= Math.PI / 2 + 1e-12); + assertTrue("longitude must be within +/-180 deg: " + at, + Double.isNaN(p.x) || Math.abs(p.x) <= Math.PI + 1e-12); + assertTrue("the poison must have been overwritten: " + at, + p.x != 1e300 && p.y != 1e300 && p.z != 1e300); + } + } + } + + // ------------------------------------------------------------- the reproducer + + /** + * {@code EPSG:4173 → EPSG:26748} at {@code (5, 5)} — 5,000 km outside the NAD27 Alaska + * zone 8 CRS — and back. The golden note recorded the inverse answering + * {@code (0°, 90°, 0.000104 m)}: the north pole at a tenth of a millimetre, which + * passes every finiteness and range check a caller can write. 1.4.3 answered latitude + * {@code -9.36e10 deg}, which no caller could mistake for a coordinate — so this got + * worse, and that is the point of the no-sentinels rule. + * + *

Asserted as an invariant, not as pinned numbers: either the transform refuses, or it + * round-trips. What it must never do is hand back the pole on the Greenwich meridian. + */ + @Test + public void reproducerNeverAnswersThePole() { + CRSFactory f = new CRSFactory(); + CoordinateReferenceSystem src = f.createFromName("EPSG:4173"); + CoordinateReferenceSystem tgt = f.createFromName("EPSG:26748"); + CoordinateTransformFactory ctf = new CoordinateTransformFactory(); + CoordinateTransform fwd = ctf.createTransform(src, tgt); + CoordinateTransform inv = ctf.createTransform(tgt, src); + + ProjCoordinate mid = poisonedDst(); + try { + fwd.transform(new ProjCoordinate(5, 5), mid); + } catch (Proj4jException e) { + assertNotNull(e.cause()); + return; // refusing the forward is a perfectly good outcome + } + assertTrue("forward must overwrite the poisoned destination", mid.x != 1e300); + assertTrue("forward must overwrite the poisoned destination", mid.y != 1e300); + + ProjCoordinate back = poisonedDst(); + try { + inv.transform(mid, back); + } catch (Proj4jException e) { + assertNotNull(e.cause()); + return; // refusing the inverse is the other perfectly good outcome + } + assertTrue("inverse must overwrite the poisoned destination", back.x != 1e300); + assertTrue("inverse must overwrite the poisoned destination", back.y != 1e300); + + // The sentinel this test exists to catch: latitude +/-90 deg on the Greenwich meridian, + // which is what the deleted `Longitude = 0.0` branch produced and what no range check can + // distinguish from a real polar answer. + assertTrue("the inverse must not answer a pole: got (" + back.x + ", " + back.y + ")", + Math.abs(Math.abs(back.y) - 90.0) > 1e-9); + assertEquals("if the inverse answers at all it must round-trip", 5.0, back.x, 1e-6); + assertEquals("if the inverse answers at all it must round-trip", 5.0, back.y, 1e-6); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failclosed/InverseLongitudeWrapTest.java b/core/src/test/java/org/locationtech/proj4j/failclosed/InverseLongitudeWrapTest.java new file mode 100644 index 0000000..c10c128 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failclosed/InverseLongitudeWrapTest.java @@ -0,0 +1,246 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.failclosed; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * {@code Projection.inverseProjectRadians} must wrap longitude with {@code adjlon}, as + * PROJ's {@code inv_finalize} does, not clamp it to ±π. + * + *

What was wrong

+ * + *

{@code 9.8.1:src/inv.cpp:113-117} is two statements: + * + *

+ * coo.lp.lam = coo.lp.lam + P->from_greenwich + P->lam0;
+ * if (0 == P->over)
+ *     coo.lpz.lam = adjlon(coo.lpz.lam);
+ * 
+ * + *

Proj4J instead clamped: + * + *

+ * if (dst.x < -Math.PI) dst.x = -Math.PI;
+ * else if (dst.x > Math.PI) dst.x = Math.PI;
+ * if (projectionLongitude != 0)
+ *     dst.x = ProjectionMath.normalizeLongitude(dst.x + projectionLongitude);
+ * 
+ * + *

A clamp is not a reduction. It discards the revolution count where {@code adjlon} + * removes it, so 533.2° and 180° — which are 353° apart — become the same answer, and + * nothing is raised. And the {@code projectionLongitude != 0} guard meant that with + * {@code +lon_0=0} no reduction happened at all, so the identical bad input threw for + * {@code +lon_0=15} and returned a plausible wrong coordinate for {@code +lon_0=0}. + * + *

Measured on {@code +proj=lsat}, whose inverse kernel accumulates along-track rotation in + * {@code lamt - p22 * lamdp}: at {@code (130, 45)} with path 120 the kernel returns 533.2°; + * the clamp made the final answer 136.758°, 6.76° wrong. {@code lsat} carries its + * own {@code adjlon} call as a local workaround; with the central fix that call is redundant + * rather than load-bearing, and {@code adjlon} is idempotent so keeping it costs nothing. + */ +public class InverseLongitudeWrapTest { + + private static final CRSFactory CRS = new CRSFactory(); + private static final double RTD = 180.0 / Math.PI; + + private static ProjCoordinate poisonedDst() { + ProjCoordinate c = new ProjCoordinate(); + c.x = c.y = 1e300; + c.z = 1e300; + return c; + } + + /** + * The general property, asserted on the base class rather than on any one projection: an + * inverse kernel that returns a longitude outside ±π must have it reduced modulo + * 2π, never truncated to the antimeridian. + */ + @Test + public void aKernelLongitudePastTheAntimeridianIsWrappedNotClamped() { + final double kernelLon = 533.2 / RTD; // the measured lsat value, in radians + Projection p = new Projection() { + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + dst.x = kernelLon; + dst.y = 0.5; + return dst; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "kernel returning 533.2 deg"; + } + }; + p.initialize(); + + ProjCoordinate dst = poisonedDst(); + p.inverseProjectRadians(new ProjCoordinate(1000.0, 2000.0), dst); + assertTrue("the poisoned destination must have been overwritten", dst.x != 1e300); + + double clamped = 180.0; + double wrapped = ProjectionMath.adjlon(kernelLon) * RTD; + assertEquals("adjlon must reduce 533.2 deg to the same meridian, 173.2 deg", + 173.2, wrapped, 1e-9); + assertEquals("longitude must be wrapped, not clamped", wrapped, dst.x * RTD, 1e-9); + assertTrue("the clamp answered " + clamped + " deg, which is " + (clamped - wrapped) + + " deg away from the right meridian and raised nothing", + Math.abs(dst.x * RTD - clamped) > 6.0); + } + + /** + * The {@code +lon_0=0} half of the defect: with no central meridian the old code skipped the + * reduction entirely, so the clamped value survived to the caller. + */ + @Test + public void reductionHappensEvenWithoutACentralMeridian() { + final double kernelLon = 4.0; // rad, about 229 deg -- past pi, so it must be wrapped + Projection p = new Projection() { + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + dst.x = kernelLon; + dst.y = 0.0; + return dst; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "kernel returning 4 rad"; + } + }; + p.initialize(); + assertEquals("this test is about lon_0 == 0", 0.0, p.getProjectionLongitude(), 0.0); + + ProjCoordinate dst = poisonedDst(); + p.inverseProjectRadians(new ProjCoordinate(1.0, 1.0), dst); + assertEquals(ProjectionMath.adjlon(4.0), dst.x, 0.0); + assertTrue("must be inside +/-pi (plus adjlon's 1e-12 overshoot window); was " + dst.x, + Math.abs(dst.x) < Math.PI + 1e-12); + } + + /** + * {@code adjlon} is NaN-transparent and must stay so: a NaN longitude the caller supplied has + * to remain a NaN longitude, not become a domain error. That is the whole point of the + * {@code nanIn} routing in {@code inverseProjectRadians}, and the wrap has to compose with it. + */ + @Test + public void nanInStaysNanOutAndIsNotADomainError() { + CoordinateReferenceSystem crs = + CRS.createFromParameters("wgs84", "+proj=longlat +ellps=GRS80"); + Projection p = crs.getProjection(); + + ProjCoordinate dst = poisonedDst(); + p.inverseProjectRadians(new ProjCoordinate(Double.NaN, Double.NaN), dst); + assertTrue("NaN longitude in must give NaN longitude out, not an exception and not a " + + "substituted value; got " + dst.x, Double.isNaN(dst.x)); + assertTrue("NaN latitude in must give NaN latitude out; got " + dst.y, + Double.isNaN(dst.y)); + + // And the property adjlon itself must keep. + assertTrue(Double.isNaN(ProjectionMath.adjlon(Double.NaN))); + assertTrue(Double.isNaN(ProjectionMath.adjlon(Double.POSITIVE_INFINITY))); + } + + /** + * A finite input that produces a non-finite longitude is still an error, not a wrapped NaN. + * The postcondition runs before the wrap, so the wrap cannot launder it. + */ + @Test + public void finiteInputProducingNonFiniteLongitudeIsStillAnError() { + Projection p = new Projection() { + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + dst.x = Double.NaN; + dst.y = 0.0; + return dst; + } + + public boolean hasInverse() { + return true; + } + + public String toString() { + return "kernel returning NaN from finite input"; + } + }; + p.initialize(); + + ProjCoordinate dst = poisonedDst(); + try { + p.inverseProjectRadians(new ProjCoordinate(1.0, 1.0), dst); + fail("a non-finite result from finite input must be an error, but got (" + + dst.x + ", " + dst.y + ")"); + } catch (Proj4jException e) { + assertNotNull(e.cause()); + } + } + + /** + * The ordinary case must be untouched. {@code adjlon} returns its argument unchanged while + * {@code |lon| < pi + 1e-12}, so every in-domain inverse is bit-identical to before. + */ + @Test + public void inDomainInversesAreUnchanged() { + CoordinateReferenceSystem crs = CRS.createFromParameters( + "utm33", "+proj=utm +ellps=GRS80 +zone=33"); + ProjCoordinate dst = poisonedDst(); + crs.getProjection().inverseProject(new ProjCoordinate(500000.0, 5000000.0), dst); + assertEquals(15.0, dst.x, 1e-6); + assertTrue(dst.y > 45.0 && dst.y < 46.0); + } + + /** + * The motivating case end to end. Pinned as an inequality against the clamp rather than + * against a reference number, because {@code lsat}'s kernel belongs to another stream: what + * matters here is that the answer is no longer the antimeridian-derived one. + */ + @Test + public void landsatInverseIsNoLongerClamped() { + CoordinateReferenceSystem crs; + try { + crs = CRS.createFromParameters("lsat", "+proj=lsat +ellps=GRS80 +lsat=3 +path=120"); + } catch (Proj4jException e) { + return; // +proj=lsat unavailable in this tree; nothing to assert + } + ProjCoordinate fwd = poisonedDst(); + crs.getProjection().project(new ProjCoordinate(130.0, 45.0), fwd); + + ProjCoordinate back = poisonedDst(); + try { + crs.getProjection().inverseProject(fwd, back); + } catch (Proj4jException e) { + assertNotNull(e.cause()); + return; + } + assertTrue("the poisoned destination must have been overwritten", back.x != 1e300); + assertEquals("lsat must round-trip its own forward", 130.0, back.x, 1e-6); + assertEquals("lsat must round-trip its own forward", 45.0, back.y, 1e-6); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failclosed/ProjectionParameterRefusalTest.java b/core/src/test/java/org/locationtech/proj4j/failclosed/ProjectionParameterRefusalTest.java new file mode 100644 index 0000000..1cdea8e --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failclosed/ProjectionParameterRefusalTest.java @@ -0,0 +1,310 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.failclosed; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.NoSuchElementException; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.proj.MercatorProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; + +/** + * {@code +south} and {@code +h} on a projection that does not read them must fail as a + * {@link Proj4jException}, not as a bare {@link NoSuchElementException}. + * + *

What was wrong

+ * + *

{@code Projection.setSouthernHemisphere} and {@code Projection.setHeightOfOrbit} threw + * {@code new NoSuchElementException()} — unchecked, not a {@code Proj4jException}, and + * with no message at all. So {@code +south} and {@code +h} on the wrong projection + * escaped every {@code catch (Proj4jException)} in the library and in every caller, and arrived + * carrying nothing that could be logged, counted, or acted on. + * + *

Fifty golden-master rows reach those two lines — + * {@code SYN/mod/}{{@code aea},{@code lcc},{@code longlat},{@code merc},{@code tmerc}, + * {@code utm}}{@code /h} and + * {@code SYN/mod/}{{@code aea},{@code lcc},{@code longlat},{@code merc}}{@code /south}. + * The differential gate could not see any of them, because the defect predates its 1.4.3 + * baseline and the row is byte-identical on both sides. A defect older than the baseline is + * precisely what a diff-based regime is blind to, which is why this test exists as an absolute + * assertion rather than as a golden row. + * + *

Why refusing is the right answer, and where the PROJ-compatible alternative belongs

+ * + *

PROJ has no parameter allow-list: a key no operator reads is retained and silently ignored. + * {@code 9.8.1:src/init.cpp} performs no such validation, and the {@code used} flag on + * {@code paralist} ({@code 9.8.1:src/param.cpp:17}) exists only to resolve {@code +init} and + * pipeline overrides, never to reject. So refusing here is stricter than PROJ. + * + *

It is still right, because the two cases that reach the base class are not the same thing + * and the base class cannot tell them apart: + * + *

    + *
  • {@code +proj=merc +south} — PROJ's {@code merc} never reads {@code +south}, so ignoring it + * is correct and refusing it is a divergence that costs nothing but strictness.
  • + *
  • {@code +proj=nsper +h=1000000} — PROJ's {@code nsper} does read {@code +h} and needs + * it, and Proj4J's {@code PerspectiveProjection} simply does not override the setter. + * Ignoring this one projects from a default orbit and returns a plausible wrong coordinate, + * which is exactly what the no-sentinels rule forbids.
  • + *
+ * + *

Only the parser holds the information needed to separate them. If {@code +south} and + * {@code +h} are ever to be retained-and-ignored in {@code ParseMode.PROJ_COMPATIBLE} and + * refused only in {@code STRICT}, that discrimination has to be made in {@code Proj4Parser} + * against a table of which projections legitimately do not read them — it cannot be made in + * {@code Projection}, which is where these throws live. + * + *

The change here is therefore type and message only: it does not alter whether + * any definition is refused, so no row can move from pass to fail because of it. + * + * @see org.locationtech.proj4j.UnsupportedParameterException + */ +public class ProjectionParameterRefusalTest { + + private static final CRSFactory CRS = new CRSFactory(); + + // ------------------------------------------------------------------ helpers + + /** + * Assert that building {@code params} fails the fail-closed way: a {@link Proj4jException}, + * carrying a non-null {@link ErrorCause}, whose message names both the offending parameter + * and the projection. A bare throw of the right type is only half the fix. + */ + private static Proj4jException assertRefused(String params, String key, String projName) { + try { + CoordinateReferenceSystem crs = CRS.createFromParameters("refused", params); + fail(params + " must be refused, but produced " + crs.getParameterString()); + throw new AssertionError("unreachable"); + } catch (NoSuchElementException e) { + throw new AssertionError(params + " threw a bare java.util.NoSuchElementException, " + + "which is not a Proj4jException and escapes every catch in the library. " + + "Message was: " + e.getMessage(), e); + } catch (Proj4jException e) { + assertNotNull("cause() must never be null", e.cause()); + String m = e.getMessage(); + assertNotNull(params + ": the exception must carry a message; the defect this " + + "replaces threw with none at all", m); + assertTrue(params + ": message must name the offending parameter '" + key + + "'; was: " + m, m.contains(key)); + assertTrue(params + ": message must name the projection '" + projName + + "'; was: " + m, m.contains(projName)); + return e; + } + } + + /** Poison a destination so a stale read cannot masquerade as a computed answer. */ + private static ProjCoordinate poisoned() { + ProjCoordinate c = new ProjCoordinate(); + c.x = c.y = 1e300; + c.z = 1e300; + return c; + } + + // ------------------------------------------------- +south, via the parse path + + @Test + public void southIsRefusedOnMercator() { + Proj4jException e = assertRefused("+proj=merc +ellps=GRS80 +south", "+south", "Mercator"); + assertEquals(ErrorCause.PROJECTION_NOT_IMPLEMENTED, e.cause()); + } + + @Test + public void southIsRefusedOnAlbers() { + assertRefused("+proj=aea +ellps=GRS80 +lat_1=29.5 +lat_2=45.5 +south", "+south", "Albers"); + } + + @Test + public void southIsRefusedOnLambertConformalConic() { + assertRefused("+proj=lcc +ellps=GRS80 +lat_1=33 +lat_2=45 +south", "+south", "Lambert"); + } + + @Test + public void southIsRefusedOnLongLat() { + assertRefused("+proj=longlat +ellps=GRS80 +south", "+south", "LongLat"); + } + + // ----------------------------------------------------- +h, via the parse path + + @Test + public void heightOfOrbitIsRefusedOnMercator() { + Proj4jException e = + assertRefused("+proj=merc +ellps=GRS80 +h=35785831", "+h", "Mercator"); + assertEquals(ErrorCause.PROJECTION_NOT_IMPLEMENTED, e.cause()); + } + + @Test + public void heightOfOrbitIsRefusedOnTransverseMercator() { + // tmerc overrides setSouthernHemisphere but not setHeightOfOrbit, which is why the + // golden probe set has SYN/mod/tmerc/h but no SYN/mod/tmerc/south. + assertRefused("+proj=tmerc +ellps=GRS80 +lon_0=9 +h=35785831", "+h", "Mercator"); + } + + @Test + public void heightOfOrbitIsRefusedOnUtm() { + assertRefused("+proj=utm +ellps=GRS80 +zone=31 +h=35785831", "+h", "Mercator"); + } + + @Test + public void heightOfOrbitIsNowHONOUREDOnNearSidedPerspective() { + // INVERTED PIN. This used to assert that `+proj=nsper +h=1000000` was REFUSED, and the + // refusal was the right answer at the time: PerspectiveProjection was a PROJ-4-era + // half-transcription with its setup commented out, no override of setHeightOfOrbit, and + // `height` hard-assigned to `a`. Silently ignoring +h would have projected from a + // one-Earth-radius orbit and answered a plausible wrong coordinate, so the base class's + // refusal was the honest outcome. + // + // PerspectiveProjection is now a full port of 9.8.1:src/projections/nsper.cpp -- all four + // aspects, both directions, the far-hemisphere rejection and the h/a range check -- so the + // assertion is inverted rather than weakened: +h must now be READ, and the twenty + // builtins.gie nsper rows that this refusal made unreachable now pass. + // + // The negative controls above (merc, tmerc, utm, longlat, lcc) are unchanged and are what + // still protects the fail-closed contract for projections that genuinely do not read +h. + CoordinateReferenceSystem crs = + CRS.createFromParameters("nsper", "+proj=nsper +a=6400000 +h=1000000"); + assertEquals("nsper must retain +h, not refuse it and not default it", + 1000000.0, crs.getProjection().getHeightOfOrbit(), 0.0); + + // And the value must actually reach the arithmetic: an nsper at h = 1e6 m on a + // 6 400 000 m sphere is not the orthographic limit, so the easting at (2, 1) differs + // measurably from `ortho`'s. + CoordinateTransform t = new CoordinateTransformFactory().createTransform( + CRS.createFromParameters("wgs84", "+proj=longlat +a=6400000"), crs); + ProjCoordinate dst = poisoned(); + t.transform(new ProjCoordinate(2, 1), dst); + assertTrue("nsper forward must overwrite the poisoned destination; got " + dst, + dst.x > 2.2e5 && dst.x < 2.3e5); + } + + @Test + public void heightOfOrbitIsStillRefusedWhereTheProjectionDoesNotReadIt() { + // The generalisation the nsper inversion must not be allowed to erode: +proj=ortho reads + // no +h upstream (ortho.cpp has no "dh" parameter), so the base class must still refuse. + assertRefused("+proj=ortho +a=6400000 +h=1000000", "+h", "Orthographic"); + } + + // ------------------------------------------- the fix must not over-refuse + + @Test + public void southIsStillHonouredWhereTheProjectionReadsIt() { + // Positive control. utm and tmerc do override setSouthernHemisphere, so +south must go + // on working -- otherwise the fix would have made Proj4J stricter than PROJ on + // definitions PROJ and Proj4J both support, and would fail corpus rows. + CoordinateReferenceSystem crs = + CRS.createFromParameters("utm31s", "+proj=utm +ellps=GRS80 +zone=31 +south"); + assertTrue("utm must report the southern hemisphere flag it was given", + crs.getProjection().getSouthernHemisphere()); + + CoordinateTransform t = new CoordinateTransformFactory().createTransform( + CRS.createFromParameters("wgs84", "+proj=longlat +ellps=GRS80"), crs); + ProjCoordinate dst = poisoned(); + t.transform(new ProjCoordinate(3, -30), dst); + assertTrue("+south must move the false northing to 10 000 000 m, so a southern " + + "latitude lands well north of zero; got " + dst.y, dst.y > 6.0e6); + } + + @Test + public void heightOfOrbitIsStillHonouredOnGeostationary() { + // Positive control for +h. geos is the one projection that overrides the setter. + CoordinateReferenceSystem crs = CRS.createFromParameters( + "geos", "+proj=geos +lon_0=0 +ellps=GRS80 +h=35785831"); + assertEquals(35785831.0, crs.getProjection().getHeightOfOrbit(), 0.0); + + CoordinateTransform t = new CoordinateTransformFactory().createTransform( + CRS.createFromParameters("wgs84", "+proj=longlat +ellps=GRS80"), crs); + ProjCoordinate dst = poisoned(); + t.transform(new ProjCoordinate(1, 1), dst); + assertTrue("geos forward must overwrite the poisoned destination", dst.x < 1e6); + assertTrue("geos forward must overwrite the poisoned destination", dst.y < 1e6); + } + + // ----------------------------------------- the setters and getters directly + + @Test + public void baseSettersAndGettersAreAllProj4jExceptions() { + Projection p = new MercatorProjection(); + assertRefusedDirectly("setSouthernHemisphere", "+south", p, new Runnable() { + public void run() { + p.setSouthernHemisphere(true); + } + }); + assertRefusedDirectly("getSouthernHemisphere", "+south", p, new Runnable() { + public void run() { + p.getSouthernHemisphere(); + } + }); + assertRefusedDirectly("setHeightOfOrbit", "+h", p, new Runnable() { + public void run() { + p.setHeightOfOrbit(35785831.0); + } + }); + assertRefusedDirectly("getHeightOfOrbit", "+h", p, new Runnable() { + public void run() { + p.getHeightOfOrbit(); + } + }); + } + + @Test + public void overridingSubclassesDoNotThrow() { + TransverseMercatorProjection tmerc = new TransverseMercatorProjection(); + tmerc.setSouthernHemisphere(true); + assertTrue(tmerc.getSouthernHemisphere()); + tmerc.setSouthernHemisphere(false); + assertFalse(tmerc.getSouthernHemisphere()); + } + + private static void assertRefusedDirectly(String method, String key, Projection p, + Runnable call) { + try { + call.run(); + fail("Projection." + method + " must refuse on the base class"); + } catch (NoSuchElementException e) { + throw new AssertionError("Projection." + method + " threw a bare " + + "java.util.NoSuchElementException, which is not a Proj4jException", e); + } catch (Proj4jException e) { + assertNotNull(method + ": cause() must never be null", e.cause()); + assertEquals(method + ": this is a capability boundary reached while building a CRS, " + + "not a per-coordinate failure, so cause() must be in the CRS group", + ErrorCause.PROJECTION_NOT_IMPLEMENTED, e.cause()); + assertTrue(method + ": cause() must classify as a CRS-definition error, so a caller " + + "branching on the group predicates does not mistake it for a bad " + + "coordinate", e.cause().isCrsError()); + assertFalse(method + ": must not classify as a per-coordinate error", + e.cause().isCoordinateError()); + String m = e.getMessage(); + assertNotNull(method + ": must carry a message", m); + assertTrue(method + ": message must name the parameter " + key + "; was: " + m, + m.contains(key)); + assertTrue(method + ": message must name the projection; was: " + m, + m.contains(p.getName()) || m.contains(p.getClass().getName())); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failopen/DatumGridLoadOrderTest.java b/core/src/test/java/org/locationtech/proj4j/failopen/DatumGridLoadOrderTest.java new file mode 100644 index 0000000..4eca5d2 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failopen/DatumGridLoadOrderTest.java @@ -0,0 +1,435 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.failopen; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +/** + * {@code Datum.POTSDAM.getTransformType()} must not depend on when {@code Datum} was loaded. + * + *

The defect

+ * + *

{@code Datum.POTSDAM} and {@code Datum.NAD27} resolved their {@code +nadgrids=} lists in + * {@code Datum}'s static initialiser, which snapshots whatever + * {@link ResourceResolvers#resolver()} returned at that instant. That chain is mutable — + * {@link ResourceResolvers#addResolver} discards the memoised chain — so the two constants reported + * {@code TYPE_GRIDSHIFT} or {@code TYPE_7PARAM} according to whether an application had registered + * its grid directory before or after something first touched the class. + * + *

Measured: {@code DHDN_ETRS89.gie} scored 64/64 from a driver that built the grid bridge + * first and 32/32 under surefire, where an earlier unrelated test had already loaded + * {@code Datum} — the same code, the same grid file, the same classpath, two different answers. The + * consumer runs per-vertex in Spark executors and requires bit-reproducible output; a transform type + * that varies with class-loading is worse than one that is simply wrong, because it is untestable. + * + *

What is asserted, and why one load order proves nothing

+ * + *

The whole defect is a difference between load orders, so each case here is run twice: + * once against the {@link Datum} this JVM already loaded (grid registered after load) and + * once against a {@link Datum} defined freshly by {@link DatumReloader} while the grid is already + * registered (grid registered before load). A test that checked only one would have passed + * against the defect. + * + *

{@link DatumReloader} redefines only {@code Datum} and its nested classes, delegating + * everything else — {@code Grid}, {@code GridCache}, {@code Ellipsoid}, + * {@code ResourceResolvers} — to the parent loader. So the fresh class runs its static initialiser + * again against the same resolver registry, which is exactly the variable under test and + * nothing else. + * + *

The choice this pins

+ * + *

{@code getTransformType()} is a pure function of the resolver chain in force when it is + * asked. Grid reachable → {@code TYPE_GRIDSHIFT}; grid not reachable → the declared + * fallback, which for {@code potsdam} is {@code TYPE_7PARAM}. That fallback is not a defect: it is + * what {@code cs2cs +datum=potsdam} does, measured by hiding {@code de_adv_BETA2007.tif} from + * {@code PROJ_DATA}, and following {@code datums.cpp}'s uncommented string alone — grid or nothing — + * would cost 74.921 m easting and 127.698 m northing at (9, 50). See {@link Datum#POTSDAM}. + * Class-load time does not appear in that function, and this class is what says so. + */ +public class DatumGridLoadOrderTest { + + /** Any parseable horizontal grid will do; only reachability is under test here. */ + private static final String DONOR_GRID = "/proj4j-data/grids/conus"; + + /** The file name {@code Datum.POTSDAM} declares, {@code 9.8.1:src/datums.cpp:49-50}. */ + private static final String POTSDAM_GRID = "BETA2007.gsb"; + + @Rule + public final TemporaryFolder folder = new TemporaryFolder(); + + /** + * The explicit resolvers in force when this class started. Restored exactly in + * {@link #restoreChain()}, because {@link ResourceResolvers} is process-wide and surefire may + * be sharing this JVM with tests that registered their own. + */ + private List preexisting; + + @Before + public void rememberChain() { + preexisting = new ArrayList(ResourceResolvers.explicitResolvers()); + } + + @After + public void restoreChain() { + ResourceResolvers.clearResolvers(); + for (ResourceResolver r : preexisting) { + ResourceResolvers.addResolver(r); + } + GridCache.instance().clear(); + } + + // ------------------------------------------------------------------ + // The defect itself + // ------------------------------------------------------------------ + + /** + * The measured defect, in both directions, on the datum it was reported against. + *

+ * Four observations, and the pairs are what matter: {@code (1, 2)} shows that registering the + * grid after the class loaded is honoured, which is the half the static initialiser got + * wrong; {@code (2, 3)} shows the two load orders agree; {@code (3, 4)} shows the answer goes + * back when the grid goes away, i.e. that it is genuinely being re-derived and not merely + * latched the other way. + */ + @Test + public void potsdamTransformTypeIsTheSameUnderBothLoadOrders() throws Exception { + // (1) grid absent, class already loaded long ago. + assertEquals("potsdam with no reachable BETA2007.gsb must report the declared Helmert" + + " fallback, which is what cs2cs does", + Datum.TYPE_7PARAM, transformType(Datum.POTSDAM)); + assertEquals("... and identically for a Datum class loaded fresh with the grid absent", + Datum.TYPE_7PARAM, freshPotsdamTransformType()); + + registerGridDirectoryContaining(POTSDAM_GRID); + + // (2) grid registered AFTER Datum was loaded. This is the case the static initialiser + // could not see, and the one that scored 32/32 instead of 64/64. + assertEquals("potsdam must pick up BETA2007.gsb registered after Datum loaded", + Datum.TYPE_GRIDSHIFT, transformType(Datum.POTSDAM)); + + // (3) grid registered BEFORE Datum was loaded. Same configuration, other load order. + assertEquals("potsdam must report the same type when Datum loads with the grid already" + + " registered -- this is the assertion the defect failed", + Datum.TYPE_GRIDSHIFT, freshPotsdamTransformType()); + + // (4) and it must go back, so that (2) and (3) are re-derivations and not a one-way latch. + ResourceResolvers.clearResolvers(); + assertEquals("removing the resolver must return potsdam to the Helmert fallback", + Datum.TYPE_7PARAM, transformType(Datum.POTSDAM)); + assertEquals(Datum.TYPE_7PARAM, freshPotsdamTransformType()); + } + + /** + * The same shape on {@code Datum.NAD27}, whose fallback is different: it declares no + * {@code towgs84}, so with none of {@code @conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat} reachable + * it is {@code TYPE_UNKNOWN} rather than {@code TYPE_7PARAM}. + *

+ * Written against a fresh loader on both sides rather than against the already-loaded + * singleton, because {@code conus} ships in this module's own test resources: the classpath + * resolver finds it whatever this test does, so the already-loaded constant is + * {@code TYPE_GRIDSHIFT} throughout and cannot distinguish the two orders. What is asserted is + * therefore the property that does distinguish them — the two loaders agree — plus that + * both agree with the resolver chain. + */ + @Test + public void nad27TransformTypeIsTheSameUnderBothLoadOrders() throws Exception { + int already = transformType(Datum.NAD27); + assertEquals("fixture: conus ships in core's test resources, so NAD27 must be a grid shift" + + " here; if this fails the grid data is missing, not the datum code", + Datum.TYPE_GRIDSHIFT, already); + assertEquals("a freshly loaded Datum must agree with the one already loaded", + already, freshTransformType("NAD27")); + + registerGridDirectoryContaining("alaska"); + assertEquals("adding a second reachable grid must not change the classification", + Datum.TYPE_GRIDSHIFT, transformType(Datum.NAD27)); + assertEquals(Datum.TYPE_GRIDSHIFT, freshTransformType("NAD27")); + } + + /** + * The two orders must agree on every {@code static Datum} constant, not only the two + * known to be spec-backed, so that a constant added later is covered the day it appears rather + * than the day someone remembers this test. + */ + @Test + public void everyStaticDatumAgreesAcrossLoadOrders() throws Exception { + registerGridDirectoryContaining(POTSDAM_GRID); + Class fresh = new DatumReloader().reload(); + List disagreed = new ArrayList(); + for (Field constant : Datum.class.getDeclaredFields()) { + if (constant.getType() != Datum.class) { + continue; + } + constant.setAccessible(true); + int mine = transformType((Datum) constant.get(null)); + int theirs = transformType(fresh, constant.getName()); + if (mine != theirs) { + disagreed.add(constant.getName() + ": already-loaded " + mine + ", freshly loaded " + + theirs); + } + } + assertTrue("transform type depends on class-load order for: " + disagreed, + disagreed.isEmpty()); + } + + // ------------------------------------------------------------------ + // ... without making the singletons mutable + // ------------------------------------------------------------------ + + /** + * The constraint the fix had to respect. A parser bug once called + * {@code Datum.NAD27.setGrids(null)} while parsing {@code EPSG:4267} — a definition with no + * {@code +nadgrids} token — which destroyed the shared grid list for the life of the JVM and + * flipped every NAD27 transform in the process, cached ones included. Determinism cannot be + * bought by making these writable, so a spec-backed datum refuses the write outright. + */ + @Test + public void theSharedSingletonsRefuseToBeMutated() { + for (Datum shared : new Datum[]{Datum.NAD27, Datum.POTSDAM}) { + int before = transformType(shared); + try { + shared.setGrids(null); + fail("Datum." + shared.getCode() + ".setGrids(null) must be refused, not silently" + + " accepted: it used to destroy the shared grid list process-wide"); + } catch (UnsupportedOperationException expected) { + assertTrue("the refusal must name the datum, got: " + expected.getMessage(), + expected.getMessage().contains(shared.getCode())); + } + assertEquals("Datum." + shared.getCode() + " changed type after a refused mutation", + before, transformType(shared)); + } + } + + /** A datum built with an explicit grid list is unaffected: only the two singletons refuse. */ + @Test + public void anOrdinaryDatumStillAcceptsSetGrids() { + Datum ordinary = new Datum("mine", new double[]{1, 2, 3}, null, + Datum.NAD27.getEllipsoid(), "mine"); + assertEquals(Datum.TYPE_3PARAM, transformType(ordinary)); + ordinary.setGrids(null); + assertEquals(Datum.TYPE_3PARAM, transformType(ordinary)); + } + + /** + * Repeated queries against an unchanged chain must be free of surprises: the same value, and + * the memo derived once. Asserted through {@code isEqual}, which is the hot-path consumer of + * the grid list and whose {@code TYPE_GRIDSHIFT} branch descends into {@code Arrays.equals} + * over every node of a loaded table — so it had better be short-circuiting on identity. + */ + @Test + public void repeatedQueriesAgreeAndTheIdentityShortCircuitSurvives() throws Exception { + registerGridDirectoryContaining(POTSDAM_GRID); + int first = transformType(Datum.POTSDAM); + for (int i = 0; i < 50; i++) { + assertEquals("query " + i, first, transformType(Datum.POTSDAM)); + } + assertTrue("a datum must equal itself without a deep grid compare", + Datum.POTSDAM.isEqual(Datum.POTSDAM)); + assertTrue("NAD27 must still equal itself", Datum.NAD27.isEqual(Datum.NAD27)); + } + + /** + * The requirement behind the defect, stated as a test: the consumer runs per-vertex in Spark + * executors and needs bit-reproducible output, so concurrent readers must not be able to + * observe two different transform types. + *

+ * The memo is filled without a lock, deliberately — no monitor is held across grid I/O — so + * several threads may resolve at once. That is safe here for a reason worth naming: the memo + * can only ever hold the one answer {@code Grid.fromNadGrids} gives for the declared spec + * against that chain, so a lost update costs a repeated lookup and never a different value. + * This asserts that rather than assuming it, in both configurations. + */ + @Test + public void concurrentReadersNeverSeeTwoDifferentTypes() throws Exception { + assertSingleValuedUnderLoad("grid absent"); + registerGridDirectoryContaining(POTSDAM_GRID); + assertSingleValuedUnderLoad("grid present"); + } + + private static void assertSingleValuedUnderLoad(String configuration) throws Exception { + final int threads = 8; + final int iterations = 500; + final java.util.Set observed = + java.util.Collections.synchronizedSet(new java.util.LinkedHashSet()); + final java.util.concurrent.CountDownLatch start = + new java.util.concurrent.CountDownLatch(1); + Thread[] workers = new Thread[threads]; + for (int t = 0; t < threads; t++) { + workers[t] = new Thread(new Runnable() { + @Override + public void run() { + try { + start.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + for (int i = 0; i < iterations; i++) { + observed.add(transformType(Datum.POTSDAM) + "/" + transformType(Datum.NAD27)); + } + } + }); + workers[t].start(); + } + start.countDown(); + for (Thread w : workers) { + w.join(); + } + assertEquals(configuration + ": " + threads * iterations + " concurrent reads must agree," + + " observed " + observed, 1, observed.size()); + } + + // ------------------------------------------------------------------ + // helpers + // ------------------------------------------------------------------ + + private static int transformType(Datum d) { + return d.getTransformType(); + } + + /** + * Copies a known-parseable grid into a fresh directory under the name {@code fileName} and + * registers that directory. Only reachability is under test, so the donor bytes need only be a + * grid {@code Grid.parse} accepts; {@code Grid} sniffs the format from the bytes, not the name. + * + * @param fileName the name the resolver should answer to + */ + private void registerGridDirectoryContaining(String fileName) throws IOException { + Path root = folder.newFolder(fileName.replace('.', '_')).toPath(); + Files.write(root.resolve(fileName), donorGridBytes()); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + GridCache.instance().clear(); + } + + private static byte[] donorGridBytes() throws IOException { + InputStream in = DatumGridLoadOrderTest.class.getResourceAsStream(DONOR_GRID); + assertNotNull("fixture: " + DONOR_GRID + " must be on the test classpath", in); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + private static int freshPotsdamTransformType() throws Exception { + return freshTransformType("POTSDAM"); + } + + private static int freshTransformType(String constantName) throws Exception { + return transformType(new DatumReloader().reload(), constantName); + } + + private static int transformType(Class datumClass, String constantName) throws Exception { + Object datum = datumClass.getField(constantName).get(null); + Object type = datumClass.getMethod("getTransformType").invoke(datum); + return ((Integer) type).intValue(); + } + + /** + * A loader that defines a brand-new {@code Datum} class — and only that class — so its static + * initialiser runs again against the resolver registry as it stands now. + *

+ * Everything else delegates to the parent, which is the point: the fresh {@code Datum} calls + * the same {@code Grid.fromNadGrids}, consults the same + * {@link ResourceResolvers} statics and shares the same {@link GridCache}. The only + * variable between the two copies is the moment their static initialisers ran, which is the + * variable the defect was sensitive to. + */ + private static final class DatumReloader extends ClassLoader { + + private static final String TARGET = "org.locationtech.proj4j.datum.Datum"; + + DatumReloader() { + super(Datum.class.getClassLoader()); + } + + Class reload() throws ClassNotFoundException { + Class fresh = loadClass(TARGET); + assertNotSame("fixture: the reloader must define a genuinely new class, otherwise this" + + " test degenerates into checking one load order twice", Datum.class, fresh); + return fresh; + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + if (!name.equals(TARGET) && !name.startsWith(TARGET + "$")) { + return super.loadClass(name, resolve); + } + Class already = findLoadedClass(name); + if (already == null) { + byte[] bytes = classBytes(name); + already = defineClass(name, bytes, 0, bytes.length); + } + if (resolve) { + resolveClass(already); + } + return already; + } + + private byte[] classBytes(String name) throws ClassNotFoundException { + String path = name.replace('.', '/') + ".class"; + InputStream in = getParent().getResourceAsStream(path); + if (in == null) { + throw new ClassNotFoundException(path + " is not readable from the parent loader"); + } + try { + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } catch (IOException e) { + throw new ClassNotFoundException(path, e); + } + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failopen/LaeaNanPropagationTest.java b/core/src/test/java/org/locationtech/proj4j/failopen/LaeaNanPropagationTest.java new file mode 100644 index 0000000..22f8064 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failopen/LaeaNanPropagationTest.java @@ -0,0 +1,417 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.failopen; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.Projection; + +/** + * The fourth combination: non-finite in, finite out. + * + *

The defect

+ * + *

{@code LambertAzimuthalEqualAreaProjection}'s polar forward answered an undefined point with + * the origin. Measured on the shipped classpath before the fix, on the proj-string the + * corpus itself uses ({@code more_builtins.gie:795}): + * + *

+ * +proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84 +units=m
+ *   projectRadians(NaN, NaN)     -> (0.0, 0.0)               x isNaN = false, y isNaN = false
+ *   projectRadians(NaN, +pi/2)   -> (0.0, 0.0)
+ *   projectRadians(0.5, NaN)     -> (0.0, 0.0)
+ * ... +x_0=1000000 +y_0=2000000
+ *   projectRadians(NaN, NaN)     -> (1000000.0, 2000000.0)   the false easting, exactly
+ * 
+ * + *

This sits between all three rules the fail-closed work established, and is the worst of the + * four combinations, because every downstream {@code isFinite} guard passes it. The three + * rules, which this class keeps distinguishable by testing each separately: + * + * + * + * + * + * + * + * + * + * + * + *
the input-to-outcome contract, from {@code Projection.projectRadians}
inputoutcometested by
{@code NaN}a {@code NaN} result, no throw{@link #nanPropagatesFromEveryPolarArm()} and friends
±{@code Infinity}, or finite outside the contract{@link ErrorCause#INVALID_COORDINATE}{@link #infiniteInputIsRefused()}, {@link #finiteOutOfDomainInputIsRefused()}, + * {@link #infiniteLongitudeWithACentralMeridianIsRefused()}
finite and in contracta finite coordinate, unchanged by this fix{@link #finiteInputIsUnmoved()}
+ * + *

Why {@code NaN} out and not an exception

+ * + *

Because throwing would break conformance rather than improve it. {@code gie}'s first + * metric branch is {@code isnan(got) && isnan(expected) -> d = 0}, i.e. a pass + * ({@code 9.8.1:src/apps/gie.cpp:1136}), and {@code proj_roundtrip} defines all-{@code NaN} in with + * all-{@code NaN} out as residual {@code 0.0} ({@code 9.8.1:src/trans.cpp:618-620}). + * {@code more_builtins.gie:791-799} is a row that asserts exactly that, headed + * "When given NaNs, return NaNs", at {@code tolerance 0}. + * + *

Why the bits are asserted, and why not a specific pattern

+ * + *

{@code assertEquals(Double.NaN, x, 0.0)} passes for {@code NaN} and would keep + * passing if someone later "fixed" it back to a sentinel, because JUnit compares + * {@code doubleToLongBits}. So the assertion here is on the raw bits and is spelled out: exponent + * all ones, mantissa non-zero, sign bit ignored. Ignoring the sign is required, not lax — + * the same JVM was observed producing {@code 7ff8000000000001} for {@code x} and + * {@code fff8000000000001} for {@code y} on one call, and quiet-{@code NaN} sign and payload differ + * between x86-64 ({@code fff8…}) and AArch64 ({@code 7ff8…}). What is not ignored is + * {@code 0.0} and {@code -0.0}: those have stable bit patterns + * ({@code 0000000000000000}/{@code 8000000000000000}), they were the observed wrong answer, and + * {@link #assertNanBits} rejects them explicitly. + */ +public class LaeaNanPropagationTest { + + /** The corpus row's own definition, {@code more_builtins.gie:795}. Polar (north) aspect. */ + private static final String NORTH_POLAR = + "+proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84 +units=m"; + + /** The same, with a false origin, which is what turns the defect into a plausible answer. */ + private static final String NORTH_POLAR_FALSE_ORIGIN = + NORTH_POLAR + " +x_0=1000000 +y_0=2000000"; + + /** South polar aspect: the sibling arm of the same {@code switch}. */ + private static final String SOUTH_POLAR = + "+proj=laea +lat_0=-90 +lon_0=0 +datum=WGS84 +units=m"; + + /** Spherical polar: shares the {@code mode} but not the code path. */ + private static final String NORTH_POLAR_SPHERE = + "+proj=laea +lat_0=90 +lon_0=-150 +R=6378137 +units=m"; + + /** + * {@code lon_0=0}. This used to be the only case in which the domain checks saw the + * longitude as supplied, because the reduction ran ahead of them; it is now the control that + * shows {@code lon_0} makes no difference. See + * {@link #infiniteLongitudeWithACentralMeridianIsRefused()}. + */ + private static final String NORTH_POLAR_LON0_ZERO = + "+proj=laea +lat_0=90 +lon_0=0 +datum=WGS84 +units=m"; + + // ------------------------------------------------------------------ + // Rule 1: NaN in, NaN out -- as a result, not as an exception + // ------------------------------------------------------------------ + + /** + * Every way a {@code NaN} can reach the polar arm, on both poles. + *

+ * All four rows returned {@code (0.0, 0.0)} before the fix, and the reason there are four is + * that {@code q} alone is not enough to detect the case. A {@code NaN} latitude + * arrives as a {@code NaN} {@code q}; a {@code NaN} longitude arrives as + * {@code NaN sinlam}/{@code coslam} with {@code q} finite, and at the pole itself {@code q} + * falls under {@code laea.cpp}'s {@code 1e-15} floor, so {@code (NaN, +pi/2)} took the same + * {@code else} arm. + */ + @Test + public void nanPropagatesFromEveryPolarArm() { + assertNanResult("north polar, both NaN", NORTH_POLAR, Double.NaN, Double.NaN); + assertNanResult("north polar, NaN longitude at the pole", NORTH_POLAR, + Double.NaN, Math.PI / 2); + assertNanResult("north polar, NaN longitude away from the pole", NORTH_POLAR, Double.NaN, 0.5); + assertNanResult("north polar, NaN latitude", NORTH_POLAR, 0.5, Double.NaN); + assertNanResult("south polar, both NaN", SOUTH_POLAR, Double.NaN, Double.NaN); + assertNanResult("south polar, NaN longitude at the pole", SOUTH_POLAR, + Double.NaN, -Math.PI / 2); + assertNanResult("south polar, NaN latitude", SOUTH_POLAR, 0.5, Double.NaN); + } + + /** + * The shape that makes this Non-negotiable 3 rather than a cosmetic wart: with a false origin + * set, the fabricated {@code (0, 0)} left the kernel and came back as + * {@code (x_0, y_0) = (1000000.0, 2000000.0)}, which is inside the projection's own valid + * range and indistinguishable from a real answer. + */ + @Test + public void nanDoesNotBecomeTheFalseEasting() { + ProjCoordinate out = project(NORTH_POLAR_FALSE_ORIGIN, Double.NaN, Double.NaN); + assertNanBits("x with +x_0=1000000", out.x); + assertNanBits("y with +y_0=2000000", out.y); + assertFalse("x came back as the false easting", + Double.doubleToRawLongBits(out.x) == Double.doubleToRawLongBits(1000000.0)); + assertFalse("y came back as the false northing", + Double.doubleToRawLongBits(out.y) == Double.doubleToRawLongBits(2000000.0)); + } + + /** + * The three aspects that were already correct, asserted so that a future edit to the shared + * {@code project_e}/{@code project_s} switch cannot break them silently. Their guards + * ({@code |b| < EPS10}, {@code out.y <= EPS10}) are all false for {@code NaN}, which is + * precisely why the defect was confined to the polar forward. + */ + @Test + public void nanAlreadyPropagatedFromTheObliqueEquatorialAndSphericalArms() { + assertNanResult("oblique", "+proj=laea +lat_0=45 +lon_0=0 +datum=WGS84 +units=m", + Double.NaN, Double.NaN); + assertNanResult("equatorial", "+proj=laea +lat_0=0 +lon_0=0 +datum=WGS84 +units=m", + Double.NaN, Double.NaN); + assertNanResult("spherical polar", NORTH_POLAR_SPHERE, Double.NaN, Double.NaN); + } + + /** The inverse has the same {@code switch} shape and must propagate too. */ + @Test + public void nanPropagatesThroughTheInverse() { + Projection p = projection(NORTH_POLAR); + ProjCoordinate out = new ProjCoordinate(); + p.inverseProjectRadians(new ProjCoordinate(Double.NaN, Double.NaN), out); + assertNanBits("inverse polar x", out.x); + assertNanBits("inverse polar y", out.y); + } + + // ------------------------------------------------------------------ + // Rule 2a: +/-Infinity is refused, and is a different outcome from NaN + // ------------------------------------------------------------------ + + /** + * Both infinities, on both ordinates, must be {@link ErrorCause#INVALID_COORDINATE} and not a + * {@code NaN} result — otherwise the first two rules are not distinguishable and a caller + * cannot tell "you asked about an undefined point" from "you asked a well-formed question PROJ + * refuses to answer". + *

+ * Both are errors upstream too, by two different routes: {@code +Infinity} is + * {@code HUGE_VAL}, so it trips {@code fwd_prepare}'s first test + * ({@code 9.8.1:src/fwd.cpp:40}), and {@code -Infinity} trips the latitude range test or the + * {@code |lambda| > 10} test. + */ + @Test + public void infiniteInputIsRefused() { + assertInvalidCoordinate("+Inf longitude", NORTH_POLAR_LON0_ZERO, + Double.POSITIVE_INFINITY, 0.5); + assertInvalidCoordinate("-Inf longitude", NORTH_POLAR_LON0_ZERO, + Double.NEGATIVE_INFINITY, 0.5); + assertInvalidCoordinate("+Inf latitude", NORTH_POLAR_LON0_ZERO, 0.5, + Double.POSITIVE_INFINITY); + assertInvalidCoordinate("-Inf latitude", NORTH_POLAR_LON0_ZERO, 0.5, + Double.NEGATIVE_INFINITY); + // ... and with a central meridian, for the latitude, where no pre-reduction happens. + assertInvalidCoordinate("+Inf latitude, lon_0=-150", NORTH_POLAR, 0.5, + Double.POSITIVE_INFINITY); + assertInvalidCoordinate("-Inf latitude, lon_0=-150", NORTH_POLAR, 0.5, + Double.NEGATIVE_INFINITY); + } + + /** + * An infinite longitude combined with {@code lon_0 != 0} — now tightened, because + * the defect it was written around has been fixed. + * + *

What it used to say, and why it was loose

+ * + *

{@link ErrorCause#INVALID_COORDINATE} was not the answer here, and the cause was + * shared code rather than {@code laea}: + * {@code Projection.projectRadians(ProjCoordinate, ProjCoordinate)} subtracted + * {@code projectionLongitude} and called {@code ProjectionMath.normalizeLongitude} + * before {@code checkForwardDomain} ran, and {@code adjlon} turns {@code +Infinity} + * into {@code NaN} ({@code inf - inf}, faithfully to {@code 9.8.1:src/adjlon.cpp}). The + * {@code NaN} route then propagated what should have been refused. Upstream has no such hole: + * {@code fwd.cpp:40} tests {@code HUGE_VAL} and {@code fwd.cpp:57-70} tests both ranges before + * {@code fwd.cpp:105} touches {@code lam0}. + * + *

So this used to assert only the property that had to hold either way — "non-finite in never + * yields a finite coordinate" — deliberately, so that it was not a pin on the wrong behaviour. + * Both domain tests now run on the raw longitude, so the outcome is the same as it always was + * with {@code lon_0=0}, and the assertion is the exact one: + * {@link ErrorCause#INVALID_COORDINATE}, from {@link #assertInvalidCoordinate}, with + * {@code lon_0 != 0} no longer making any difference. + */ + @Test + public void infiniteLongitudeWithACentralMeridianIsRefused() { + assertInvalidCoordinate("+Inf longitude, lon_0=-150", NORTH_POLAR, + Double.POSITIVE_INFINITY, 0.5); + assertInvalidCoordinate("-Inf longitude, lon_0=-150", NORTH_POLAR, + Double.NEGATIVE_INFINITY, 0.5); + // The point of the fix: identical outcome with and without a central meridian. + assertInvalidCoordinate("+Inf longitude, lon_0=0", NORTH_POLAR_LON0_ZERO, + Double.POSITIVE_INFINITY, 0.5); + assertInvalidCoordinate("-Inf longitude, lon_0=0", NORTH_POLAR_LON0_ZERO, + Double.NEGATIVE_INFINITY, 0.5); + } + + // ------------------------------------------------------------------ + // Rule 2b: finite but outside the contract is refused, distinctly + // ------------------------------------------------------------------ + + /** + * A finite input PROJ refuses: a latitude past the pole by more than {@code PJ_EPS_LAT}, and a + * longitude past {@code MAX_LAM_RAD}. Both must throw rather than propagate, which is what + * keeps rule 2 separable from rule 1. + */ + @Test + public void finiteOutOfDomainInputIsRefused() { + assertInvalidCoordinate("latitude 2 rad", NORTH_POLAR_LON0_ZERO, 0.5, 2.0); + assertInvalidCoordinate("latitude -2 rad", NORTH_POLAR_LON0_ZERO, 0.5, -2.0); + assertInvalidCoordinate("longitude 20 rad", NORTH_POLAR_LON0_ZERO, 20.0, 0.5); + assertInvalidCoordinate("longitude -20 rad", NORTH_POLAR_LON0_ZERO, -20.0, 0.5); + } + + /** + * A finite in-contract input that {@code laea} genuinely cannot project: the point antipodal + * to a polar aspect's origin. That is {@link ErrorCause#COORDINATE_OUT_OF_DOMAIN}, matching + * upstream's {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN} at + * {@code 9.8.1:src/projections/laea.cpp:61-64}. Recorded here because it is the one remaining + * way out of the polar arm and it must not become a fabricated coordinate either. + */ + @Test + public void theAntipodeIsADomainRefusalNotACoordinate() { + try { + ProjCoordinate out = project(NORTH_POLAR, 0.5, -Math.PI / 2); + fail("the antipode of lat_0=90 must be refused, got (" + out.x + ", " + out.y + ")"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + } + + // ------------------------------------------------------------------ + // The fix must move nothing else + // ------------------------------------------------------------------ + + /** + * The legitimate zero. At the pole itself, with a finite longitude, the polar forward + * really does return the origin, and the fix must not have turned that into {@code NaN}. + * Asserted on the exact bit pattern of {@code +0.0}, because that is what distinguishes this + * row from the defect: same value, different question. {@code gie} agrees — + * {@code accept 0 90} against {@code expect 0 0} at {@code tolerance 0} passes on 9.8.1. + */ + @Test + public void thePoleItselfIsStillExactlyTheOrigin() { + ProjCoordinate out = project(NORTH_POLAR, 0.0, Math.PI / 2); + assertEquals("x at the pole", 0L, Double.doubleToRawLongBits(out.x)); + assertEquals("y at the pole", 0L, Double.doubleToRawLongBits(out.y)); + + // ... and just inside the PJ_EPS_LAT slop band, where the latitude is clamped to the pole. + ProjCoordinate clamped = project(NORTH_POLAR, 0.0, Math.PI / 2 + 1e-13); + assertEquals("x just past the pole", 0L, Double.doubleToRawLongBits(clamped.x)); + assertEquals("y just past the pole", 0L, Double.doubleToRawLongBits(clamped.y)); + } + + /** + * Frozen values, to bit-equality, for the two arms the fix touched. These are the numbers + * measured on this tree before the {@code NaN} arm was added, so bit-equality here is + * the evidence that the change is confined to the {@code NaN} case and moved no finite + * coordinate at all. + *

+ * They are not self-referential: each also agrees with PROJ 9.8.1's own {@code gie} on the + * same proj-string at {@code 28.64788975654116 28.64788975654116} degrees (= 0.5 rad, 0.5 rad). + * The target is projected, so the metric is Euclidean in metres, not geodesic: + * + * + * + * + * + * + * + *
proj4j against gie 9.8.1, Euclidean metres
aspectgie 9.8.1this tree|delta|
ellipsoidal N polar153639.182222650823 6509264.002158334479153639.18222265082 6509264.0021583345< 1e-8 m
spherical N polar153567.541091538238 6506228.767076510936153567.54109153824 6506228.767076509< 2e-9 m
+ */ + @Test + public void finiteInputIsUnmoved() { + ProjCoordinate ell = project(NORTH_POLAR, 0.5, 0.5); + assertEquals("ellipsoidal polar x", 0x4102c1397531262fL, Double.doubleToRawLongBits(ell.x)); + assertEquals("ellipsoidal polar y", 0x4158d4b400235cb6L, Double.doubleToRawLongBits(ell.y)); + assertCloseToProj("ellipsoidal polar x", 153639.182222650823, ell.x); + assertCloseToProj("ellipsoidal polar y", 6509264.002158334479, ell.y); + + ProjCoordinate sph = project(NORTH_POLAR_SPHERE, 0.5, 0.5); + assertEquals("spherical polar x", 0x4102befc5427cce7L, Double.doubleToRawLongBits(sph.x)); + assertEquals("spherical polar y", 0x4158d1bd3117c812L, Double.doubleToRawLongBits(sph.y)); + assertCloseToProj("spherical polar x", 153567.541091538238, sph.x); + assertCloseToProj("spherical polar y", 6506228.767076510936, sph.y); + } + + // ------------------------------------------------------------------ + // helpers + // ------------------------------------------------------------------ + + private static Projection projection(String definition) { + return new CRSFactory().createFromParameters("failopen", definition).getProjection(); + } + + private static ProjCoordinate project(String definition, double lamRad, double phiRad) { + ProjCoordinate out = new ProjCoordinate(); + projection(definition).projectRadians(new ProjCoordinate(lamRad, phiRad), out); + return out; + } + + private static void assertNanResult(String what, String definition, double lam, double phi) { + ProjCoordinate out; + try { + out = project(definition, lam, phi); + } catch (ProjectionException e) { + throw new AssertionError(what + ": NaN input must propagate as a RESULT, not throw." + + " gie scores isnan(got) && isnan(expected) as a pass and roundtrip scores" + + " all-NaN as residual 0, so throwing would lose corpus rows that pass. Got " + + e.cause() + ": " + e.getMessage()); + } + assertNanBits(what + ": x", out.x); + assertNanBits(what + ": y", out.y); + } + + private static void assertInvalidCoordinate(String what, String definition, + double lam, double phi) { + try { + ProjCoordinate out = project(definition, lam, phi); + fail(what + ": expected INVALID_COORDINATE, got (" + out.x + ", " + out.y + ")"); + } catch (ProjectionException e) { + assertEquals(what, ErrorCause.INVALID_COORDINATE, e.cause()); + } + } + + /** + * Asserts that {@code value} is a {@code NaN}, by its raw bits, and that it is in particular + * not {@code 0.0} or {@code -0.0}. + *

+ * The predicate is exponent-all-ones with a non-zero mantissa, sign ignored: quiet-NaN + * sign and payload are architecture-dependent ({@code 0xfff8…} on x86-64, {@code 0x7ff8…} on + * AArch64) and were observed to differ between {@code x} and {@code y} within one call on one + * JVM, so pinning a pattern would be a platform-dependent test. Zero, by contrast, has one bit + * pattern per sign on every platform, which is why it can be — and is — excluded exactly. + * + * @param what what is being asserted, for the failure message + * @param value the ordinate + */ + private static void assertNanBits(String what, double value) { + long bits = Double.doubleToRawLongBits(value); + String hex = String.format("%016x", Long.valueOf(bits)); + assertFalse(what + ": got +0.0 (bits " + hex + "), the fabricated origin this test exists" + + " to catch", bits == 0x0000000000000000L); + assertFalse(what + ": got -0.0 (bits " + hex + ")", bits == 0x8000000000000000L); + assertEquals(what + ": exponent must be all ones for a NaN, bits were " + hex, + 0x7ff0000000000000L, bits & 0x7ff0000000000000L); + assertTrue(what + ": mantissa must be non-zero for a NaN (all-zero means Infinity), bits" + + " were " + hex, (bits & 0x000fffffffffffffL) != 0L); + // Belt and braces, in the language a reader expects. Deliberately last: isNaN alone is + // what a naive version of this test would assert, and it is the weaker statement. + assertTrue(what + ": Double.isNaN, bits were " + hex, Double.isNaN(value)); + } + + /** + * @param what the ordinate being compared, for the failure message + * @param projValue the value PROJ 9.8.1's {@code gie} printed, to 12 decimal places + * @param ours this tree's value + */ + private static void assertCloseToProj(String what, double projValue, double ours) { + double delta = Math.abs(projValue - ours); + assertTrue(what + ": " + ours + " differs from gie 9.8.1's " + projValue + " by " + delta + + " m (Euclidean, projected target)", delta < 1e-6); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failopen/NanFunnelTest.java b/core/src/test/java/org/locationtech/proj4j/failopen/NanFunnelTest.java new file mode 100644 index 0000000..947f84d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failopen/NanFunnelTest.java @@ -0,0 +1,360 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.failopen; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code NaN} in, {@code NaN} out, for every projection at once, because the rule lives at + * the funnel and not in the kernels. + * + *

Why this is a sweep and not a list

+ * + *

{@link LaeaNanPropagationTest} pins one kernel's polar arm. This pins the shared funnel that + * makes the same latent arm unreachable in all of them: {@code Projection.projectRadians(double, + * double, ProjCoordinate)} and {@code Projection.inverseProjectRadians} return early on a + * {@code NaN} input, before {@code project}/{@code projectInverse} is called at all, exactly as + * {@code 9.8.1:src/trans.cpp:352-354} short-circuits ahead of {@code pj_fwd4d}/{@code pj_inv4d}. + * Upstream's {@code laea_e_forward} has the same {@code else out.x = out.y = 0.;} arm this file + * exists to neutralise; it is dead code there for the same reason it is dead code here now. + * + *

The measured before/after over the whole registry, on + * {@code +proj= +ellps=GRS80 +x_0=1000000 +y_0=2000000 +units=m}: + * + * + * + * + * + * + *
projections answering {@code (NaN, NaN)} with at least one finite ordinate
directionbeforeafter
forward6 — {@code apian bacon ortel} returned + * {@code (1000000.0, NaN)}, i.e. the false easting itself; {@code eck4 putp6 putp6p} returned + * a finite northing0
inverse3 — {@code aea} and {@code leac} returned latitude + * {@code +pi/2} exactly, {@code collg} returned {@code (0.436, +pi/2)}, a fully plausible + * lon/lat pair0
+ * + *

Those nine were not the nine anyone would have guessed, which is the argument for + * sweeping: the fail-open arms are wherever a kernel happens to have written {@code else 0} or + * clamped to a pole, and a comparison like {@code q >= 1e-15} or {@code |b| < EPS10} is false for + * {@code NaN} in some kernels and takes the fabricating branch in others. + * + *

The one exclusion, and why it is named rather than filtered

+ * + *

{@code +proj=geocent} overrides both funnels in {@code GeocentProjection} and still raises + * ({@code NUMERICAL_FAILURE} forward, {@code INVALID_COORDINATE} inverse) on {@code NaN} input. + * That is a residual site in a file outside this change's scope, so it is listed by name in + * {@link #EXPECTED_RAISERS} rather than skipped silently, and + * {@link #theExclusionListIsExactlyOneEntryLong()} fails if the set ever grows — a new + * raiser cannot hide inside a filter. + * + *

The positive control

+ * + *

A sweep that cannot fail proves nothing, and this one would report a clean result even if the + * detector were broken. {@link #theDetectorSeesAKernelThatFabricatesTheOrigin()} feeds + * {@code (NaN, NaN)} straight into a kernel written to be exactly the bug — upstream's + * {@code else out.x = out.y = 0.;} — and asserts the detector flags it; + * {@link #theFunnelMakesTheFabricatingKernelUnreachable()} then sends the same object the same + * input through the public entry point and asserts {@code NaN}. Same class, same kernel, opposite + * verdicts: the difference is the funnel, which is the claim being made. + * + *

And the whole file was run against a build with the early return neutered, which is the + * measurement that says these tests can fail. Three of the six went red and each named the right + * thing: + * + *

    + *
  • {@code theFunnelMakesTheFabricatingKernelUnreachable} — + * "the funnel let the fabricating kernel run: ProjCoordinate[1000000.0 2000000.0 NaN]". + * The false easting and northing, exactly the {@code laea} shape.
  • + *
  • {@code noInverseKernelAnswersNaNWithACoordinate} — named + * {@code +proj=collg -> (0.4363323129985824, 1.5707963267948966)} out of 131 swept.
  • + *
  • {@code theExclusionListIsExactlyOneEntryLong} — 130 names instead of one.
  • + *
+ * + *

The forward sweep, notably, stayed green under that control, and the reason is worth + * recording: with the early return gone, {@code checkForwardDomain} and the finiteness + * postcondition are reached with {@code NaN}, and the postcondition raises + * {@code NUMERICAL_FAILURE} for almost every projection — so the offenders were converted + * into raisers, and a sweep that skips raisers saw nothing. That is not a flaw in the control, it + * is the reason {@link #theExclusionListIsExactlyOneEntryLong()} exists: a {@code catch} in the + * sweep can only be trusted if what it catches is asserted as a set somewhere else. + */ +public class NanFunnelTest { + + /** + * Projections that raise rather than answer on {@code NaN} input, by name, with the reason. + * See the class javadoc: {@code GeocentProjection} overrides both funnels. + */ + private static final SortedSet EXPECTED_RAISERS = + Collections.unmodifiableSortedSet(new TreeSet(Arrays.asList("geocent"))); + + // ------------------------------------------------------------------ + // The sweep + // ------------------------------------------------------------------ + + /** + * Every constructible {@code +proj=} name, forward, with a false origin set so that the + * false-easting shape is reachable. + */ + @Test + public void noForwardKernelAnswersNaNWithACoordinate() { + sweep(true); + } + + /** The same, inverse, with a central meridian so the {@code lon_0} path is exercised too. */ + @Test + public void noInverseKernelAnswersNaNWithACoordinate() { + sweep(false); + } + + /** + * The sweep must actually be sweeping. If the registry stops yielding roughly the number of + * usable projections it has today, the two tests above go green by testing nothing at all. + */ + @Test + public void theSweepCoversTheWholeRegistry() { + int registered = new Registry().getProjectionDescriptions().size(); + assertTrue("the registry lists only " + registered + " names; this sweep is not covering" + + " what it claims to", registered >= 150); + assertTrue("only " + constructibleNames().size() + " of " + registered + " names could be" + + " constructed; the sweep would be nearly vacuous", + constructibleNames().size() >= 125); + } + + /** + * Pins the exclusion set so a newly-introduced raiser is a failure rather than a filtered-out + * line. Both directions are collected, because {@code geocent} raises a different cause in + * each and either could change independently. + */ + @Test + public void theExclusionListIsExactlyOneEntryLong() { + SortedSet observed = new TreeSet(); + observed.addAll(raisers(true)); + observed.addAll(raisers(false)); + assertEquals("the set of projections that RAISE on NaN input changed. NaN in must be NaN" + + " out (9.8.1:src/trans.cpp:352-354); geocent is the one known residual, in a" + + " file outside this change's scope", EXPECTED_RAISERS, observed); + } + + // ------------------------------------------------------------------ + // The positive control: the detector, and then the funnel + // ------------------------------------------------------------------ + + /** + * Proves the instrument can fail. + * + *

What is being controlled for

+ * + *

The sweep asserts "no finite ordinate came back". A detector that never sees a finite + * ordinate — because it looks at the wrong field, or because every kernel happens to be + * correct — is indistinguishable from a working one. So here the fabricating kernel is + * called directly, bypassing the funnel, and the assertion is that the check used by + * the sweep says fail. + */ + @Test + public void theDetectorSeesAKernelThatFabricatesTheOrigin() { + FabricatingProjection p = new FabricatingProjection(); + ProjCoordinate fwd = p.callForwardKernel(Double.NaN, Double.NaN); + assertTrue("the control kernel did not fabricate, so it controls for nothing: " + fwd, + fabricated(fwd)); + assertEquals("the control must reproduce upstream's `else out.x = out.y = 0.;` exactly", + 0L, Double.doubleToRawLongBits(fwd.x)); + + ProjCoordinate inv = p.callInverseKernel(Double.NaN, Double.NaN); + assertTrue("the control inverse kernel did not fabricate: " + inv, fabricated(inv)); + } + + /** + * The other half of the control: the same object, the same kernel, the same input, through the + * public entry point. {@code NaN}, because the funnel never asks the kernel. + */ + @Test + public void theFunnelMakesTheFabricatingKernelUnreachable() { + FabricatingProjection p = new FabricatingProjection(); + p.setFalseEasting(1000000.0); + p.setFalseNorthing(2000000.0); + p.initialize(); + + ProjCoordinate fwd = new ProjCoordinate(); + p.projectRadians(new ProjCoordinate(Double.NaN, Double.NaN), fwd); + assertFalse("the funnel let the fabricating kernel run: " + fwd, fabricated(fwd)); + assertTrue("forward x must be NaN, was " + fwd.x, Double.isNaN(fwd.x)); + assertTrue("forward y must be NaN, was " + fwd.y, Double.isNaN(fwd.y)); + + ProjCoordinate inv = new ProjCoordinate(); + p.inverseProjectRadians(new ProjCoordinate(Double.NaN, Double.NaN), inv); + assertFalse("the funnel let the fabricating inverse kernel run: " + inv, fabricated(inv)); + assertTrue("inverse x must be NaN, was " + inv.x, Double.isNaN(inv.x)); + assertTrue("inverse y must be NaN, was " + inv.y, Double.isNaN(inv.y)); + + // ... and the finite path through the very same kernel still works, so the early return is + // confined to NaN and has not simply disabled the projection. + ProjCoordinate finite = new ProjCoordinate(); + p.projectRadians(new ProjCoordinate(0.5, 0.5), finite); + assertEquals("the finite path must still reach the kernel and the affine", + 1000000.0, finite.x, 0.0); + assertEquals(2000000.0, finite.y, 0.0); + } + + // ------------------------------------------------------------------ + // helpers + // ------------------------------------------------------------------ + + /** A kernel written to be the defect: the origin, from undefined input. */ + private static final class FabricatingProjection extends Projection { + + private static final long serialVersionUID = 1L; + + @Override + protected ProjCoordinate project(double x, double y, ProjCoordinate dst) { + // 9.8.1:src/projections/laea.cpp -- `else out.x = out.y = 0.;` + dst.x = 0.0; + dst.y = 0.0; + return dst; + } + + @Override + protected ProjCoordinate projectInverse(double x, double y, ProjCoordinate dst) { + dst.x = 0.0; + dst.y = 0.0; + return dst; + } + + @Override + public boolean hasInverse() { + return true; + } + + ProjCoordinate callForwardKernel(double x, double y) { + return project(x, y, new ProjCoordinate()); + } + + ProjCoordinate callInverseKernel(double x, double y) { + return projectInverse(x, y, new ProjCoordinate()); + } + } + + /** The detector the sweep uses: at least one ordinate came back finite. */ + private static boolean fabricated(ProjCoordinate c) { + return isFinite(c.x) || isFinite(c.y); + } + + private static boolean isFinite(double v) { + // Not Double.isFinite: is 8 and this must read the same on Java 8. + return !Double.isNaN(v) && !Double.isInfinite(v); + } + + private static List constructibleNames() { + List out = new ArrayList(); + for (String name : new Registry().getProjectionDescriptions().keySet()) { + if (projection(name, true) != null) { + out.add(name); + } + } + return out; + } + + private static Projection projection(String name, boolean forward) { + String definition = "+proj=" + name + " +ellps=GRS80 +x_0=1000000 +y_0=2000000 +units=m" + + (forward ? "" : " +lon_0=25"); + try { + return new CRSFactory().createFromParameters("t", definition).getProjection(); + } catch (RuntimeException notUsable) { + // Registered but not constructible with these parameters -- an unimplemented name, or + // one that requires a parameter this string does not supply. Not this test's subject. + return null; + } + } + + /** + * The names that RAISE rather than answer on {@code (NaN, NaN)}. Collected separately from + * {@link #sweep(boolean)} so that the exclusion is asserted as a set, not skipped in a catch. + * + * @param forward true for the forward direction + * @return the raising names, sorted + */ + private static SortedSet raisers(boolean forward) { + SortedSet out = new TreeSet(); + for (String name : new Registry().getProjectionDescriptions().keySet()) { + Projection p = projection(name, forward); + if (p == null) { + continue; + } + try { + if (forward) { + p.projectRadians(new ProjCoordinate(Double.NaN, Double.NaN), + new ProjCoordinate()); + } else { + p.inverseProjectRadians(new ProjCoordinate(Double.NaN, Double.NaN), + new ProjCoordinate()); + } + } catch (RuntimeException raised) { + out.add(name); + } + } + return out; + } + + private static void sweep(boolean forward) { + StringBuilder offenders = new StringBuilder(); + int swept = 0; + for (String name : new Registry().getProjectionDescriptions().keySet()) { + Projection p = projection(name, forward); + if (p == null) { + continue; + } + swept++; + ProjCoordinate out = new ProjCoordinate(); + try { + if (forward) { + p.projectRadians(new ProjCoordinate(Double.NaN, Double.NaN), out); + } else { + p.inverseProjectRadians(new ProjCoordinate(Double.NaN, Double.NaN), out); + } + } catch (RuntimeException raised) { + continue; // covered, by name, by theExclusionListIsExactlyOneEntryLong + } + if (fabricated(out)) { + offenders.append("\n +proj=").append(name).append(" -> (") + .append(out.x).append(", ").append(out.y).append(')'); + } else if (!Double.isNaN(out.x) || !Double.isNaN(out.y)) { + offenders.append("\n +proj=").append(name).append(" -> (") + .append(out.x).append(", ").append(out.y) + .append(") -- non-finite but not NaN; an infinity is not a propagated NaN"); + } + } + assertTrue("swept only " + swept + " projections", swept >= 125); + if (offenders.length() != 0) { + throw new AssertionError((forward ? "forward" : "inverse") + ": NaN input must come" + + " back as NaN in BOTH ordinates, because 9.8.1:src/trans.cpp:352-354 never" + + " invokes the operation on a coordinate carrying a NaN. These answered with" + + " something else, over " + swept + " swept:" + offenders); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failopen/RawLongitudeDomainCheckTest.java b/core/src/test/java/org/locationtech/proj4j/failopen/RawLongitudeDomainCheckTest.java new file mode 100644 index 0000000..e71f14b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failopen/RawLongitudeDomainCheckTest.java @@ -0,0 +1,306 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.failopen; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code fwd_prepare} tests the longitude it was given, not the longitude left after + * {@code lon_0} has been taken off it. + * + *

The defect

+ * + *

{@code Projection.project(ProjCoordinate, ProjCoordinate)} and + * {@code Projection.projectRadians(ProjCoordinate, ProjCoordinate)} each subtracted + * {@code projectionLongitude} and wrapped the result before handing over to the funnel that + * runs {@code checkForwardDomain}. Upstream is the other way round: + * {@code 9.8.1:src/fwd.cpp:40} tests {@code HUGE_VAL}, {@code :57-70} tests + * {@code |phi| - pi/2 > PJ_EPS_LAT} and {@code |lam| > 10}, and only then does {@code :105} evaluate + * {@code coo.lp.lam = (coo.lp.lam - P->from_greenwich) - P->lam0}. Both of those are + * {@code PROJ_ERR_COORD_TRANSFM_INVALID_COORD} = 2049. + * + *

Two measured consequences, both on + * {@code +proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84 +units=m}, and both invisible with + * {@code lon_0=0}: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
before and after, radians
inputbeforeafter
{@code (+Infinity, 0.5)}{@code (NaN, NaN)}, no exception{@link ErrorCause#INVALID_COORDINATE}
{@code (20.0, 0.5)}{@code (-3819350.5146746966, 5273204.385775552)}{@link ErrorCause#INVALID_COORDINATE}
{@code (-20.0, 0.5)}{@code (6476404.214766495, -671052.3787776735)}{@link ErrorCause#INVALID_COORDINATE}
{@code (9.9, 0.5)} with {@code +over}{@link ErrorCause#INVALID_COORDINATE} — wrongly: the reduced value was + * 12.5 rad and nothing wrapped it back{@code (-314861.8064936594, -6503459.4556220565)}
+ * + *

The {@code +over} row is the reason the check moved rather than being duplicated: the + * ordering error was rejecting good input as well as accepting bad, and only one of those two is + * fixed by adding a second check. + * + *

The infinity is an error, not a propagated value

+ * + *

{@code adjlon(+Infinity)} is {@code inf - inf}, i.e. {@code NaN}, faithfully to + * {@code 9.8.1:src/adjlon.cpp}. So before the fix an infinite longitude with a central meridian was + * laundered into a NaN and then propagated by the {@code NaN} rule, which is the one way the + * two rules could be made to contradict each other. They compose correctly now because the domain + * check runs on the value the caller passed, so {@code adjlon} never sees an infinity at all — + * see {@link #theTwoRulesComposeOnMixedNaNAndInfinity()} for the case where a coordinate carries + * both. + * + *

The positive control

+ * + *

This whole file, plus + * {@code LaeaNanPropagationTest.infiniteLongitudeWithACentralMeridianIsRefused}, was run against a + * build with the two statements swapped back into their old order — the reduction ahead of + * {@code checkForwardDomain} — and 5 assertions went red, each naming its own mechanism: + * + *

    + *
  • {@code aLongitudePastTenRadiansIsRefusedWhicheverCentralMeridianIsSet} — + * "expected INVALID_COORDINATE, got ProjCoordinate[-3819350.5146746966 5273204.385775552 + * NaN]"
  • + *
  • {@code anInfiniteLongitudeIsRefusedWhicheverCentralMeridianIsSet} and + * {@code anInfinityAloneIsNotAPropagatedValue} — {@code NUMERICAL_FAILURE} instead of + * {@link ErrorCause#INVALID_COORDINATE}, which is where the laundered infinity surfaces once + * the {@code NaN} funnel exists but the ordering is still wrong
  • + *
  • {@code aLongitudeInsideTheBoundIsAcceptedEvenUnderOver} — + * "invalid longitude 12.517993877991495 rad (717.228217179515 deg): outside +/-10.0 rad", + * the false rejection, from an input of 9.9 rad
  • + *
  • {@code LaeaNanPropagationTest.infiniteLongitudeWithACentralMeridianIsRefused} — + * {@code NUMERICAL_FAILURE} instead of {@link ErrorCause#INVALID_COORDINATE}
  • + *
+ * + *

{@code twoHundredDegreesIsStillPerfectlyLegal} and + * {@code theTwoRulesComposeOnMixedNaNAndInfinity} stayed green under the control, correctly: neither + * depends on the ordering, and that they did not move is the evidence that the fix is confined to + * the two out-of-contract classes. + */ +public class RawLongitudeDomainCheckTest { + + /** {@code lon_0 != 0}: the reduction happens, so the ordering is observable. */ + private static final String LON0_SET = + "+proj=laea +lat_0=90 +lon_0=-150 +datum=WGS84 +units=m"; + + /** {@code lon_0 = 0}: the control. Every outcome below must be identical to {@link #LON0_SET}. */ + private static final String LON0_ZERO = + "+proj=laea +lat_0=90 +lon_0=0 +datum=WGS84 +units=m"; + + // ------------------------------------------------------------------ + // HUGE_VAL, on the raw value + // ------------------------------------------------------------------ + + /** + * An infinite longitude, with and without a central meridian, on both entry points. The pairing + * is the assertion: {@code lon_0} must not change the verdict. + */ + @Test + public void anInfiniteLongitudeIsRefusedWhicheverCentralMeridianIsSet() { + for (String definition : new String[]{LON0_SET, LON0_ZERO}) { + assertInvalid(definition + " radians +Inf", definition, + Double.POSITIVE_INFINITY, 0.5, true); + assertInvalid(definition + " radians -Inf", definition, + Double.NEGATIVE_INFINITY, 0.5, true); + assertInvalid(definition + " degrees +Inf", definition, + Double.POSITIVE_INFINITY, 30.0, false); + assertInvalid(definition + " degrees -Inf", definition, + Double.NEGATIVE_INFINITY, 30.0, false); + } + } + + /** The same for latitude, which was never affected but must not have been broken. */ + @Test + public void anInfiniteLatitudeIsRefusedWhicheverCentralMeridianIsSet() { + for (String definition : new String[]{LON0_SET, LON0_ZERO}) { + assertInvalid(definition + " +Inf lat", definition, 0.5, + Double.POSITIVE_INFINITY, true); + assertInvalid(definition + " -Inf lat", definition, 0.5, + Double.NEGATIVE_INFINITY, true); + } + } + + // ------------------------------------------------------------------ + // |lam| > MAX_LAM_RAD, on the raw value + // ------------------------------------------------------------------ + + /** + * {@code |lam| > 10} rad, both signs, both entry points, both central meridians. 20 rad is + * 1145.9°; the value {@code (20.0, 0.5)} previously produced, + * {@code (-3819350.5, 5273204.4)}, is inside {@code laea}'s legitimate range and there is no + * way for a caller to tell it from a real answer. + */ + @Test + public void aLongitudePastTenRadiansIsRefusedWhicheverCentralMeridianIsSet() { + for (String definition : new String[]{LON0_SET, LON0_ZERO}) { + assertInvalid(definition + " 20 rad", definition, 20.0, 0.5, true); + assertInvalid(definition + " -20 rad", definition, -20.0, 0.5, true); + // 1200 deg = 20.94 rad. The degree entry point multiplies by DTR first, so the bound is + // still the radian one -- Projection.MAX_LAM_RAD -- and 573 deg is where it bites. + assertInvalid(definition + " 1200 deg", definition, 1200.0, 30.0, false); + assertInvalid(definition + " -1200 deg", definition, -1200.0, 30.0, false); + // The extreme, and the sharpest single measurement of this defect: 1e16 rad is + // 5.7e17 degrees, and with lon_0=-150 it used to come back as + // (-5920505.502483835, -2709564.0688433675) -- a coordinate in the Arctic Ocean, in + // 0 ms, with no error raised. adjlon reduced it into the band before anything looked + // at it. (adjlon keeps PROJ's own limitation that one floor loses the low bits of a + // huge argument, so the value it produced was not even the right meridian.) + assertInvalid(definition + " 1e16 rad", definition, 1e16, 0.5, true); + assertInvalid(definition + " -1e16 rad", definition, -1e16, 0.5, true); + } + } + + /** + * The bound is {@code |lam| > 10} radians and not {@code [-180, 180]} degrees: a caller + * passing 200° or −190° must keep working, because PROJ wraps those rather than + * rejecting them. Asserted on both sides of the reduction, because this is exactly the + * assertion a careless version of the fix would break. + */ + @Test + public void twoHundredDegreesIsStillPerfectlyLegal() { + for (String definition : new String[]{LON0_SET, LON0_ZERO}) { + for (double lonDeg : new double[]{200.0, -190.0, 360.0, -540.0, 572.9}) { + ProjCoordinate out = new ProjCoordinate(); + projection(definition).project(new ProjCoordinate(lonDeg, 30.0), out); + assertTrue(definition + " at " + lonDeg + " deg must be a finite coordinate, got " + + out, isFinite(out.x) && isFinite(out.y)); + } + } + } + + /** + * 9.9 rad is inside {@link Projection#MAX_LAM_RAD} and must be accepted, including under + * {@code +over} where nothing wraps it back after {@code lon_0} is taken off. This is the row + * that was failing in the other direction before the fix: the reduced value was + * 12.5 rad, so the check rejected a coordinate PROJ accepts. + */ + @Test + public void aLongitudeInsideTheBoundIsAcceptedEvenUnderOver() { + ProjCoordinate over = new ProjCoordinate(); + projection(LON0_SET + " +over").projectRadians(new ProjCoordinate(9.9, 0.5), over); + assertTrue("+over at 9.9 rad must be a finite coordinate, got " + over, + isFinite(over.x) && isFinite(over.y)); + + // Without +over the same input already worked, and its bits must not have moved: the wrap + // and the subtraction are the same two statements in the same order, just later. + ProjCoordinate wrapped = new ProjCoordinate(); + projection(LON0_SET).projectRadians(new ProjCoordinate(9.9, 0.5), wrapped); + assertEquals("x at 9.9 rad, no +over, measured before the check moved", + -314861.8064936562, wrapped.x, 0.0); + assertEquals("y at 9.9 rad, no +over, measured before the check moved", + -6503459.455622057, wrapped.y, 0.0); + } + + // ------------------------------------------------------------------ + // How this composes with the NaN rule + // ------------------------------------------------------------------ + + /** + * A coordinate carrying both a {@code NaN} and an infinity is a {@code NaN} result, not + * an error, and that is upstream's order rather than a preference: + * {@code 9.8.1:src/trans.cpp:352-354} runs {@code pj_coord_has_nans} before + * {@code pj_fwd4d}, so {@code fwd_prepare}'s {@code HUGE_VAL} test is never reached for such a + * coordinate. Pinned in both orders and with both central meridians, because "NaN wins" is the + * kind of rule that gets silently inverted by a refactor. + */ + @Test + public void theTwoRulesComposeOnMixedNaNAndInfinity() { + for (String definition : new String[]{LON0_SET, LON0_ZERO}) { + assertNaN(definition + " (NaN, +Inf)", definition, Double.NaN, + Double.POSITIVE_INFINITY); + assertNaN(definition + " (NaN, -Inf)", definition, Double.NaN, + Double.NEGATIVE_INFINITY); + assertNaN(definition + " (+Inf, NaN)", definition, Double.POSITIVE_INFINITY, + Double.NaN); + assertNaN(definition + " (-Inf, NaN)", definition, Double.NEGATIVE_INFINITY, + Double.NaN); + // ... and a NaN beside a finite-but-out-of-domain ordinate: same rule, same reason. + assertNaN(definition + " (NaN, 2.0 rad)", definition, Double.NaN, 2.0); + assertNaN(definition + " (20.0 rad, NaN)", definition, 20.0, Double.NaN); + } + } + + /** + * The distinction that makes the previous test meaningful: an infinity on its own is an + * error. If the {@code NaN} early return ever swallowed infinities, every assertion above would + * still pass while the fail-closed contract had been quietly dropped. + */ + @Test + public void anInfinityAloneIsNotAPropagatedValue() { + assertInvalid("(+Inf, 0.5) alone", LON0_SET, Double.POSITIVE_INFINITY, 0.5, true); + assertInvalid("(0.5, +Inf) alone", LON0_SET, 0.5, Double.POSITIVE_INFINITY, true); + } + + // ------------------------------------------------------------------ + // helpers + // ------------------------------------------------------------------ + + private static Projection projection(String definition) { + return new CRSFactory().createFromParameters("failopen", definition).getProjection(); + } + + private static ProjCoordinate go(String definition, double x, double y, boolean radians) { + ProjCoordinate out = new ProjCoordinate(); + Projection p = projection(definition); + if (radians) { + p.projectRadians(new ProjCoordinate(x, y), out); + } else { + p.project(new ProjCoordinate(x, y), out); + } + return out; + } + + private static void assertInvalid(String what, String definition, double x, double y, + boolean radians) { + try { + ProjCoordinate out = go(definition, x, y, radians); + fail(what + ": expected INVALID_COORDINATE, got " + out); + } catch (ProjectionException e) { + assertEquals(what, ErrorCause.INVALID_COORDINATE, e.cause()); + } + } + + private static void assertNaN(String what, String definition, double lam, double phi) { + ProjCoordinate out; + try { + out = go(definition, lam, phi, true); + } catch (ProjectionException e) { + throw new AssertionError(what + ": a coordinate carrying a NaN must come back as NaN," + + " because trans.cpp:352-354 short-circuits before fwd_prepare runs at all." + + " Got " + e.cause() + ": " + e.getMessage()); + } + assertTrue(what + ": x must be NaN, was " + out.x, Double.isNaN(out.x)); + assertTrue(what + ": y must be NaN, was " + out.y, Double.isNaN(out.y)); + } + + private static boolean isFinite(double v) { + // Not Double.isFinite: is 8. + return !Double.isNaN(v) && !Double.isInfinite(v); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/failopen/ReciprocalScaleAntimeridianTest.java b/core/src/test/java/org/locationtech/proj4j/failopen/ReciprocalScaleAntimeridianTest.java new file mode 100644 index 0000000..7d2d77d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/failopen/ReciprocalScaleAntimeridianTest.java @@ -0,0 +1,238 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.failopen; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.Projection; + +/** + * One ulp, one sign, at the antimeridian: the inverse must multiply by the reciprocal of + * {@code totalScale}, because {@code 9.8.1:src/inv.cpp:85-93} does. + * + *

The defect

+ * + *

{@code Projection.inverseProjectRadians} de-scaled the projected ordinate with + * {@code (src.x - totalFalseEasting) / totalScale}. Upstream is {@code coo.xyz.x *= P->ra;} with + * {@code P->ra = 1. / P->a} ({@code ell_set.cpp:618}), and it carries a comment explaining the + * choice — nominally about {@code calcofi} stomping on {@code a}, but the two operations are simply + * not the same number: + * + *

+ * -20037508.342789244 / 6378137          = -3.1415926535897936 = -pi - 1 ulp
+ * -20037508.342789244 * (1.0 / 6378137)  = -3.1415926535897931 = exactly -pi
+ * 
+ * + *

{@code -pi - 1 ulp} is a longitude one ulp west of the antimeridian, and it survives + * {@code adjlon} untouched (its window is {@code |lam| < pi + 1e-12}). Fed through the geocentric + * leg of a datum shift it reaches {@code atan2}, which normalises it to {@code +pi} — so + * {@code EPSG:3857} → {@code EPSG:4055} returned +180 where PROJ returns -180: the + * opposite side of the world, from a one-ulp arithmetic difference. + * + *

Why this only became visible recently

+ * + *

Master survived it because the inverse used to clamp longitude into + * {@code [-pi, +pi]}, and the clamp happened to force {@code -pi}. Removing the clamp was correct — + * PROJ wraps with {@code adjlon}, it does not clamp, and clamping discards the revolution count + * instead of removing it — and it exposed the division underneath. Two defects were cancelling; see + * non-negotiable 4b. + * + *

The reference

+ * + *

PROJ 9.8.1 as installed (Rel. 9.8.1, April 10th, 2026): + * + *

+ * $ echo "-20037508.342789244 0" | cs2cs -f "%.17g" EPSG:3857 EPSG:4055
+ * 0	-180 0
+ * $ echo "-20037508.342789244 0" | proj -I -f "%.17g" +proj=merc +a=6378137 +b=6378137
+ * -180	0
+ * 
+ * + *

The second line is itself evidence that upstream multiplies rather than divides: the division + * result in degrees is {@code -180.00000000000003}, which {@code %.17g} would have printed in full. + * + *

The positive control

+ * + *

This file was run against a build with {@code / totalScale} put back, and both + * behavioural tests went red naming the mechanism: + * + *

    + *
  • {@code theDescaledLongitudeIsExactlyMinusPi} — + * "expected:<-4609115380302729960> but was:<-4609115380302729959>", one ulp, + * as raw bits
  • + *
  • {@code webMercatorToASphereReturnsMinus180NotPlus180} — + * "expected:<-4582834833314545664> but was:<4640537203540230144>", i.e. + * {@code -180.0} against {@code +180.0}
  • + *
+ * + *

{@code theProbePointDistinguishesDivisionFromMultiplication} stayed green under the control, + * correctly: it is arithmetic on literals and does not depend on the implementation. That is the + * point of it — it is the assertion that survives to say the probe point is still + * discriminating. + * + *

The same control also flipped {@code RepointBitIdentityTest}'s two new guards, including + * {@code theSupersededDigestsNoLongerDescribeThisBuild}, which reported + * "the 7362c85 digest for +proj=spilhaus +ellps=WGS84 still matches this build". That is + * independent confirmation that the five re-pinned digests describe the multiply and the five + * superseded ones describe the divide, rather than being a pair of numbers taken on trust. + */ +public class ReciprocalScaleAntimeridianTest { + + /** The western edge of the Web Mercator world, {@code -pi * 6378137} rounded to a double. */ + private static final double WEB_MERCATOR_WEST = -20037508.342789244; + + /** WGS 84 semi-major axis, and {@code EPSG:3857}'s. */ + private static final double A = 6378137.0; + + // ------------------------------------------------------------------ + // The positive control comes first, because it validates the probe point + // ------------------------------------------------------------------ + + /** + * Proves the probe point can tell the two operations apart. + * + *

Why this is the control and not decoration

+ * + *

Every other assertion in this file is "the answer is {@code -180}". If the probe easting + * were changed to one where {@code x / a} and {@code x * (1/a)} happen to agree — which is most + * of them — those assertions would keep passing while testing nothing. So this asserts the + * arithmetic difference exists at this exact value, in both the radian and the degree domain, + * and that the two land on opposite sides of the antimeridian. + */ + @Test + public void theProbePointDistinguishesDivisionFromMultiplication() { + double divided = WEB_MERCATOR_WEST / A; + double multiplied = WEB_MERCATOR_WEST * (1.0 / A); + + assertFalse("the probe easting no longer distinguishes / from * (1/a), so every other" + + " assertion in this class has become vacuous", + Double.doubleToRawLongBits(divided) == Double.doubleToRawLongBits(multiplied)); + assertEquals("the multiply must be exactly -pi", -Math.PI, multiplied, 0.0); + assertEquals("the divide must be -pi - 1 ulp", + Double.doubleToRawLongBits(Math.nextAfter(-Math.PI, Double.NEGATIVE_INFINITY)), + Double.doubleToRawLongBits(divided)); + + // ... and the two land on opposite sides once atan2 normalises them, which is the mechanism. + assertEquals("atan2 of the divided value normalises to +pi", Math.PI, + Math.atan2(Math.sin(divided), Math.cos(divided)), 0.0); + assertEquals("atan2 of the multiplied value stays at -pi", -Math.PI, + Math.atan2(Math.sin(multiplied), Math.cos(multiplied)), 0.0); + } + + // ------------------------------------------------------------------ + // The defect itself + // ------------------------------------------------------------------ + + /** + * The measured case. {@code cs2cs EPSG:3857 EPSG:4055} on PROJ 9.8.1 gives {@code -180}; this + * returned {@code +180.0} before the fix. Asserted on the raw bits, because + * {@code assertEquals(-180.0, x, 1e-9)} would pass for neither and + * {@code assertEquals(180.0, x, 360.0)} for both — the whole content of this test is a sign. + */ + @Test + public void webMercatorToASphereReturnsMinus180NotPlus180() { + CRSFactory crs = new CRSFactory(); + ProjCoordinate out = new ProjCoordinate(); + new CoordinateTransformFactory() + .createTransform(crs.createFromName("EPSG:3857"), crs.createFromName("EPSG:4055")) + .transform(new ProjCoordinate(WEB_MERCATOR_WEST, 0.0), out); + + assertEquals("longitude at the western antimeridian: cs2cs 9.8.1 gives -180, this gave" + + " +180.0 before the reciprocal fix", + Double.doubleToRawLongBits(-180.0), Double.doubleToRawLongBits(out.x)); + assertEquals("latitude must be unaffected", 0.0, out.y, 0.0); + } + + /** + * The same at the funnel, in radians, where the ulp actually lives: the de-scaled longitude must + * be exactly {@code -pi}. Two spellings of a sphere of radius {@code a}, because the + * bug is in shared code and not in either kernel. + */ + @Test + public void theDescaledLongitudeIsExactlyMinusPi() { + for (String definition : new String[]{ + "+proj=merc +a=6378137 +b=6378137", + "+proj=webmerc +datum=WGS84"}) { + Projection p = new CRSFactory() + .createFromParameters("failopen", definition).getProjection(); + ProjCoordinate out = new ProjCoordinate(); + p.inverseProjectRadians(new ProjCoordinate(WEB_MERCATOR_WEST, 0.0), out); + assertEquals(definition + ": the de-scaled longitude must be exactly -pi, not -pi - 1" + + " ulp. proj -I 9.8.1 prints exactly -180 deg for this easting.", + Double.doubleToRawLongBits(-Math.PI), Double.doubleToRawLongBits(out.x)); + } + } + + /** + * The reciprocal must be recomputed whenever {@code totalScale} is, or a projection that + * re-initialises would de-scale with a stale factor — which is a far worse failure than the one + * being fixed, and a silent one. {@code initialize()} runs twice for every parsed + * projection (once from the constructor, once from the parser), so the second run is the one + * that has to be right. + */ + @Test + public void theReciprocalTracksTotalScaleAcrossReinitialisation() { + Projection p = new CRSFactory() + .createFromParameters("failopen", "+proj=merc +a=6378137 +b=6378137") + .getProjection(); + ProjCoordinate first = new ProjCoordinate(); + p.inverseProjectRadians(new ProjCoordinate(WEB_MERCATOR_WEST, 0.0), first); + + p.initialize(); + ProjCoordinate again = new ProjCoordinate(); + p.inverseProjectRadians(new ProjCoordinate(WEB_MERCATOR_WEST, 0.0), again); + assertEquals("a second initialize() must not move the de-scaled longitude", + Double.doubleToRawLongBits(first.x), Double.doubleToRawLongBits(again.x)); + + // Change the radius, re-initialise, and the answer must change with it -- otherwise this + // test could not tell a tracked reciprocal from a cached one. + p.setEllipsoid(org.locationtech.proj4j.datum.Ellipsoid.SPHERE); + p.initialize(); + ProjCoordinate scaled = new ProjCoordinate(); + p.inverseProjectRadians(new ProjCoordinate(WEB_MERCATOR_WEST, 0.0), scaled); + assertFalse("changing the ellipsoid and re-initialising must move the de-scaled longitude," + + " or the reciprocal is stale rather than tracked", + Double.doubleToRawLongBits(first.x) == Double.doubleToRawLongBits(scaled.x)); + } + + /** + * {@code +proj=calcofi} is upstream's stated reason for {@code *= ra}: {@code calcofi.cpp:136-141} + * assigns {@code P->a = 1} and {@code P->ra = 1}, and Proj4J reproduces that ordering — + * {@code CalCOFIProjection.initialize()} sets {@code a = 1} before calling + * {@code super.initialize()}, so the reciprocal is captured from the stomped value, exactly as + * {@code P->ra} is. If it were ever computed lazily from an unstomped {@code a}, calcofi's + * round trip would break, so this asserts the round trip rather than the field. + */ + @Test + public void calcofiStillRoundTrips() { + Projection p = new CRSFactory() + .createFromParameters("failopen", "+proj=calcofi +ellps=clrk66").getProjection(); + ProjCoordinate fwd = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + p.project(new ProjCoordinate(-121.0, 34.0), fwd); + p.inverseProject(fwd, back); + assertTrue("calcofi longitude did not round trip: " + back.x, + Math.abs(back.x - (-121.0)) < 1e-9); + assertTrue("calcofi latitude did not round trip: " + back.y, + Math.abs(back.y - 34.0) < 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/geocent/GeocentProjectionTest.java b/core/src/test/java/org/locationtech/proj4j/geocent/GeocentProjectionTest.java new file mode 100644 index 0000000..1936d91 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/geocent/GeocentProjectionTest.java @@ -0,0 +1,498 @@ +/******************************************************************************* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.geocent; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.GeocentProjection; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code +proj=geocent}, which had no test at all before this file. + * + *

The defect these tests would have caught

+ * + *

{@code GeocentProjection.projectRadians} and {@code inverseProjectRadians} both read + * {@code dst} instead of {@code src}, in both directions. It survived because the one caller in + * {@code core} aliases the arguments — {@code BasicCoordinateTransform.transformClosed} does + * {@code tgt.setValue(src)} then {@code projectRadians(tgt, tgt)} — so with {@code src == dst} + * reading {@code dst} happens to read the input. Every test here that passes distinct + * {@code src} and {@code dst} objects fails against the old code; every test that aliases them + * passes against both, and those are here on purpose, because the aliased path is what 53,430 + * golden-master rows exercise and it must not move. + * + *

Where the expected numbers come from

+ * + *

Not from proj4j. They are {@code 9.8.1:src/conversions/cart.cpp}'s {@code cartesian()} + * evaluated independently: + * + *

+ *   N = a / sqrt(1 - es sin^2(phi))
+ *   X = (N + h) cos(phi) cos(lam)
+ *   Y = (N + h) cos(phi) sin(lam)
+ *   Z = (N (1 - es) + h) sin(phi)
+ * 
+ * + *

with WGS84 {@code a = 6378137.0} and {@code es = 2f - f^2}, {@code f = 1/298.257223563}. + * That is the same expression, in the same order, as + * {@code GeocentricConverter.convertGeodeticToGeocentric}, which is the finding recorded in + * {@code GeocentProjection}'s javadoc: the two implementations of the forward agree bit + * for bit, and only the inverse differs (Bowring's closed form upstream, the Toms/Hannover + * iteration here). The tolerance is 1e-6 m, which is looser than either algorithm's own error and + * covers the last-bit difference between deriving {@code es} from {@code rf} and quoting it. + */ +public class GeocentProjectionTest { + + /** Tighter than any algorithm here: both kernels agree to well under a micrometre. */ + private static final double MM = 1.0e-6; + + /** 1e-9 rad is about 6 mm of latitude; the iteration's own budget is 1e-12 rad. */ + private static final double RAD = 1.0e-9; + + private static Projection wgs84Geocent() { + CoordinateReferenceSystem crs = + new CRSFactory().createFromParameters("geocent-wgs84", + "+proj=geocent +ellps=WGS84 +units=m +no_defs"); + return crs.getProjection(); + } + + // ----------------------------------------------------------------------------------------- + // The defect itself: src must be read, dst must be written, and the two may be different + // objects. Every assertion in this section fails against the pre-1.5.0 body. + // ----------------------------------------------------------------------------------------- + + @Test + public void forwardReadsSrcNotDstWhenTheyAreDistinctObjects() { + Projection p = wgs84Geocent(); + ProjCoordinate src = new ProjCoordinate(Math.toRadians(9.5), Math.toRadians(55.5), 100.0); + // Deliberately poisoned: the old code converted THIS and returned it. + ProjCoordinate dst = new ProjCoordinate(-1.0, -1.0, -1.0); + + p.projectRadians(src, dst); + + assertNotSame(src, dst); + assertEquals(3571255.4410952283, dst.x, MM); + assertEquals(597623.2032090913, dst.y, MM); + assertEquals(5233194.16771844, dst.z, MM); + } + + @Test + public void forwardLeavesSrcUntouched() { + Projection p = wgs84Geocent(); + ProjCoordinate src = new ProjCoordinate(Math.toRadians(9.5), Math.toRadians(55.5), 100.0); + ProjCoordinate dst = new ProjCoordinate(); + + p.projectRadians(src, dst); + + assertEquals(Math.toRadians(9.5), src.x, 0.0); + assertEquals(Math.toRadians(55.5), src.y, 0.0); + assertEquals(100.0, src.z, 0.0); + } + + @Test + public void inverseReadsSrcNotDstWhenTheyAreDistinctObjects() { + Projection p = wgs84Geocent(); + ProjCoordinate src = + new ProjCoordinate(3571255.4410952283, 597623.2032090913, 5233194.16771844); + ProjCoordinate dst = new ProjCoordinate(-1.0, -1.0, -1.0); + + p.inverseProjectRadians(src, dst); + + assertNotSame(src, dst); + assertEquals(Math.toRadians(9.5), dst.x, RAD); + assertEquals(Math.toRadians(55.5), dst.y, RAD); + assertEquals(100.0, dst.z, 1.0e-4); + } + + @Test + public void inverseLeavesSrcUntouched() { + Projection p = wgs84Geocent(); + ProjCoordinate src = + new ProjCoordinate(3571255.4410952283, 597623.2032090913, 5233194.16771844); + ProjCoordinate dst = new ProjCoordinate(); + + p.inverseProjectRadians(src, dst); + + assertEquals(3571255.4410952283, src.x, 0.0); + assertEquals(597623.2032090913, src.y, 0.0); + assertEquals(5233194.16771844, src.z, 0.0); + } + + /** + * The degrees-in entry point is not virtual through {@code projectRadians(src, dst)} — the base + * class routes it into a private two-ordinate funnel — so before 1.5.0 it never reached + * {@code GeocentProjection} at all and returned the base identity plus the affine, i.e. the + * input degrees back. + */ + @Test + public void degreesEntryPointReachesTheGeocentricConversion() { + Projection p = wgs84Geocent(); + ProjCoordinate src = new ProjCoordinate(9.5, 55.5, 100.0); + ProjCoordinate dst = new ProjCoordinate(); + + p.project(src, dst); + + assertEquals(3571255.4410952283, dst.x, MM); + assertEquals(597623.2032090913, dst.y, MM); + assertEquals(5233194.16771844, dst.z, MM); + } + + /** {@code inverseProject} is the radians inverse plus a RTD multiply on x and y only. */ + @Test + public void degreesInverseEntryPointReturnsDegreesAndMetres() { + Projection p = wgs84Geocent(); + ProjCoordinate src = + new ProjCoordinate(3571255.4410952283, 597623.2032090913, 5233194.16771844); + ProjCoordinate dst = new ProjCoordinate(); + + p.inverseProject(src, dst); + + assertEquals(9.5, dst.x, 1.0e-7); + assertEquals(55.5, dst.y, 1.0e-7); + assertEquals(100.0, dst.z, 1.0e-4); + } + + // ----------------------------------------------------------------------------------------- + // The aliased path. These pass against the old body too, and that is the point: 1,058 + // golden-master rows go through it and must not move. + // ----------------------------------------------------------------------------------------- + + @Test + public void aliasedForwardStillWorks() { + Projection p = wgs84Geocent(); + ProjCoordinate both = + new ProjCoordinate(Math.toRadians(9.5), Math.toRadians(55.5), 100.0); + + p.projectRadians(both, both); + + assertEquals(3571255.4410952283, both.x, MM); + assertEquals(597623.2032090913, both.y, MM); + assertEquals(5233194.16771844, both.z, MM); + } + + @Test + public void aliasedInverseStillWorks() { + Projection p = wgs84Geocent(); + ProjCoordinate both = + new ProjCoordinate(3571255.4410952283, 597623.2032090913, 5233194.16771844); + + p.inverseProjectRadians(both, both); + + assertEquals(Math.toRadians(9.5), both.x, RAD); + assertEquals(Math.toRadians(55.5), both.y, RAD); + assertEquals(100.0, both.z, 1.0e-4); + } + + // ----------------------------------------------------------------------------------------- + // cart.cpp agreement across the ellipsoid and the domain. + // ----------------------------------------------------------------------------------------- + + /** Prime meridian on the equator: X is exactly {@code a}, Y and Z exactly zero. */ + @Test + public void originIsTheSemiMajorAxis() { + Projection p = wgs84Geocent(); + ProjCoordinate dst = new ProjCoordinate(); + + p.projectRadians(new ProjCoordinate(0.0, 0.0, 0.0), dst); + + assertEquals(6378137.0, dst.x, 0.0); + assertEquals(0.0, dst.y, 0.0); + assertEquals(0.0, dst.z, 0.0); + } + + /** The north pole: Z is exactly the semi-minor axis, {@code a (1 - f)}. */ + @Test + public void northPoleIsTheSemiMinorAxis() { + Projection p = wgs84Geocent(); + ProjCoordinate dst = new ProjCoordinate(); + + p.projectRadians(new ProjCoordinate(0.0, Math.PI / 2.0, 0.0), dst); + + assertEquals(0.0, dst.x, MM); + assertEquals(0.0, dst.y, 0.0); + assertEquals(6356752.314245179, dst.z, MM); + } + + @Test + public void southernHemisphereAndNegativeLongitudeWithHeight() { + Projection p = wgs84Geocent(); + ProjCoordinate dst = new ProjCoordinate(); + + p.projectRadians( + new ProjCoordinate(Math.toRadians(-77.0), Math.toRadians(-38.0), 1234.5), dst); + + assertEquals(1132269.1140115347, dst.x, MM); + assertEquals(-4904396.350538061, dst.y, MM); + assertEquals(-3906204.0025103916, dst.z, MM); + } + + /** + * {@code cosphi < 1e-6} in {@code cart.cpp:225} — poleward of 89.99994 degrees the height + * comes from the geocentric radius rather than from a division by a vanishing cosine. The + * iteration reaches the same answer by a different route, so this asserts the round trip + * rather than the branch. + */ + @Test + public void nearPoleRoundTrips() { + Projection p = wgs84Geocent(); + ProjCoordinate xyz = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + + p.projectRadians(new ProjCoordinate(Math.toRadians(120.0), Math.toRadians(89.9), 0.0), xyz); + assertEquals(-5584.696085303042, xyz.x, MM); + assertEquals(9672.977364575885, xyz.y, MM); + assertEquals(6356742.567109314, xyz.z, MM); + + p.inverseProjectRadians(xyz, back); + assertEquals(Math.toRadians(120.0), back.x, RAD); + assertEquals(Math.toRadians(89.9), back.y, RAD); + assertEquals(0.0, back.z, 1.0e-4); + } + + /** + * A declared sphere: {@code es == 0}, so {@code N == a} at every latitude. Spelled + * {@code +a}/{@code +b} rather than {@code +R} on purpose — {@code +R}'s parse path is being + * rewritten by another stream (see {@code PARSE-R-DECLARES-SPHERE} in + * {@code golden/rules.yaml}) and this test is about the conversion, not about the parser. + */ + @Test + public void sphereUsesTheRadiusAtEveryLatitude() { + CoordinateReferenceSystem crs = new CRSFactory().createFromParameters("geocent-sphere", + "+proj=geocent +a=6371000 +b=6371000 +units=m +no_defs"); + ProjCoordinate dst = new ProjCoordinate(); + + crs.getProjection().projectRadians( + new ProjCoordinate(Math.toRadians(30.0), Math.toRadians(60.0), 0.0), dst); + + assertEquals(2758723.9237553305, dst.x, MM); + assertEquals(1592750.0000000002, dst.y, MM); + assertEquals(5517447.847510658, dst.z, MM); + } + + @Test + public void roundTripsOverAGridOfTheWholeEllipsoid() { + Projection p = wgs84Geocent(); + ProjCoordinate xyz = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + for (double lon = -180.0; lon <= 180.0; lon += 15.0) { + for (double lat = -89.0; lat <= 89.0; lat += 7.0) { + for (double h : new double[] {-500.0, 0.0, 8848.0}) { + p.projectRadians( + new ProjCoordinate(Math.toRadians(lon), Math.toRadians(lat), h), xyz); + p.inverseProjectRadians(xyz, back); + String at = "(" + lon + ", " + lat + ", " + h + ")"; + // atan2 answers -pi for a longitude of exactly 180 west; both are the + // antimeridian. + double dlon = Math.abs(back.x - Math.toRadians(lon)) % (2.0 * Math.PI); + assertEquals(at, 0.0, Math.min(dlon, 2.0 * Math.PI - dlon), RAD); + assertEquals(at, Math.toRadians(lat), back.y, RAD); + assertEquals(at, h, back.z, 1.0e-4); + } + } + } + } + + // ----------------------------------------------------------------------------------------- + // +lon_0, which upstream honours for a cartesian right-hand side and the override skipped. + // ----------------------------------------------------------------------------------------- + + /** + * {@code fwd_prepare} ends the angular branch with {@code lam = (lam - from_greenwich) - lam0} + * ({@code 9.8.1:src/fwd.cpp:105-112}) whatever {@code P->right} is, and {@code inv_finalize} + * adds it back ({@code inv.cpp:110-118}). So {@code +lon_0=10} at longitude 10 must give the + * same triple as {@code +lon_0=0} at longitude 0 — Y exactly zero. + */ + @Test + public void lonZeroRotatesTheCartesianFrame() { + CoordinateReferenceSystem shifted = new CRSFactory().createFromParameters("geocent-lon0", + "+proj=geocent +ellps=GRS80 +lon_0=10 +units=m +no_defs"); + ProjCoordinate dst = new ProjCoordinate(); + + shifted.getProjection().projectRadians( + new ProjCoordinate(Math.toRadians(10.0), Math.toRadians(45.0), 0.0), dst); + + assertEquals(4517590.878886053, dst.x, MM); + assertEquals(0.0, dst.y, MM); + assertEquals(4487348.4087547995, dst.z, MM); + } + + @Test + public void lonZeroRoundTrips() { + CoordinateReferenceSystem shifted = new CRSFactory().createFromParameters("geocent-lon0", + "+proj=geocent +ellps=GRS80 +lon_0=10 +units=m +no_defs"); + Projection p = shifted.getProjection(); + ProjCoordinate xyz = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + + p.projectRadians(new ProjCoordinate(Math.toRadians(-13.25), Math.toRadians(7.5), 42.0), xyz); + p.inverseProjectRadians(xyz, back); + + assertEquals(Math.toRadians(-13.25), back.x, RAD); + assertEquals(Math.toRadians(7.5), back.y, RAD); + assertEquals(42.0, back.z, 1.0e-4); + } + + /** Without {@code +lon_0} nothing may be added, because {@code x + 0.0} is not the identity. */ + @Test + public void withoutLonZeroNegativeZeroSurvives() { + Projection p = wgs84Geocent(); + ProjCoordinate dst = new ProjCoordinate(); + + // Longitude exactly 180 west: atan2(-0.0, -a) is -pi, and the sign carries which side of + // the antimeridian the point is on. + p.inverseProjectRadians(new ProjCoordinate(-6378137.0, -0.0, 0.0), dst); + + assertTrue("expected -pi, got " + dst.x, dst.x < 0.0); + assertEquals(-Math.PI, dst.x, RAD); + } + + // ----------------------------------------------------------------------------------------- + // Contract: hasInverse, the name, and the fail-closed guards. + // ----------------------------------------------------------------------------------------- + + /** + * {@code BasicCoordinateTransform.inverseAvailable} asks {@code hasInverse()} first and then + * looks for a declared {@code projectInverse(double, double, ProjCoordinate)}. This class has + * no such method — the two-ordinate signature cannot carry z — so without the declaration the + * gate rejects every {@code +proj=geocent} CRS as a transformation source. + */ + @Test + public void declaresItsInverse() { + assertTrue(new GeocentProjection().hasInverse()); + assertTrue(wgs84Geocent().hasInverse()); + } + + /** The base {@code toString()} is the literal {@code "None"}, which lands in error messages. */ + @Test + public void hasAName() { + assertEquals("Geocentric", new GeocentProjection().toString()); + } + + @Test + public void forwardRejectsALatitudePastThePole() { + Projection p = wgs84Geocent(); + try { + p.projectRadians(new ProjCoordinate(0.0, Math.toRadians(91.0), 0.0), + new ProjCoordinate()); + fail("expected a ProjectionException for latitude 91 deg"); + } catch (ProjectionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("latitude")); + } + } + + /** {@code fwd_prepare}'s slop band, {@code fwd.cpp:72-77}: clamp, do not reject. */ + @Test + public void forwardClampsWithinTheSlopBand() { + Projection p = wgs84Geocent(); + ProjCoordinate atPole = new ProjCoordinate(); + ProjCoordinate justPast = new ProjCoordinate(); + + p.projectRadians(new ProjCoordinate(0.0, Math.PI / 2.0, 0.0), atPole); + p.projectRadians(new ProjCoordinate(0.0, Math.PI / 2.0 + 1.0e-13, 0.0), justPast); + + assertEquals(atPole.x, justPast.x, 0.0); + assertEquals(atPole.y, justPast.y, 0.0); + assertEquals(atPole.z, justPast.z, 0.0); + } + + @Test + public void forwardRejectsNonFiniteInput() { + Projection p = wgs84Geocent(); + for (double bad : new double[] {Double.NaN, Double.POSITIVE_INFINITY}) { + try { + p.projectRadians(new ProjCoordinate(0.0, bad, 0.0), new ProjCoordinate()); + fail("expected a ProjectionException for latitude " + bad); + } catch (ProjectionException expected) { + // the contract: non-finite in, exception out, never a plausible coordinate + } + } + } + + /** {@code inv_prepare} rejects HUGE_VAL on all three ordinates ({@code inv.cpp:40-45}). */ + @Test + public void inverseRejectsNonFiniteInput() { + Projection p = wgs84Geocent(); + double[][] bad = { + {Double.NaN, 0.0, 0.0}, + {0.0, Double.POSITIVE_INFINITY, 0.0}, + {4517590.0, 0.0, Double.NEGATIVE_INFINITY}, + }; + for (double[] xyz : bad) { + try { + p.inverseProjectRadians(new ProjCoordinate(xyz[0], xyz[1], xyz[2]), + new ProjCoordinate()); + fail("expected a ProjectionException for (" + xyz[0] + ", " + xyz[1] + ", " + + xyz[2] + ")"); + } catch (ProjectionException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("non-finite")); + } + } + } + + /** + * An absent z is zero, not NaN. {@code ProjCoordinate}'s two-argument constructor leaves z as + * {@code NaN}, and a geocentric triple with a NaN ordinate is exactly the shape a caller + * cannot detect. + */ + @Test + public void absentHeightIsTreatedAsZero() { + Projection p = wgs84Geocent(); + ProjCoordinate withoutZ = new ProjCoordinate(); + ProjCoordinate withZeroZ = new ProjCoordinate(); + + p.projectRadians(new ProjCoordinate(Math.toRadians(9.5), Math.toRadians(55.5)), withoutZ); + p.projectRadians( + new ProjCoordinate(Math.toRadians(9.5), Math.toRadians(55.5), 0.0), withZeroZ); + + assertEquals(withZeroZ.x, withoutZ.x, 0.0); + assertEquals(withZeroZ.y, withoutZ.y, 0.0); + assertEquals(withZeroZ.z, withoutZ.z, 0.0); + } + + /** + * The ellipsoid may be replaced after construction, so the cached converter has to be keyed on + * it. Getting this wrong would make the second call answer with the first ellipsoid. + */ + @Test + public void aReplacedEllipsoidIsHonoured() { + GeocentProjection p = new GeocentProjection(); + ProjCoordinate onWgs84 = new ProjCoordinate(); + ProjCoordinate onSphere = new ProjCoordinate(); + + p.setEllipsoid(org.locationtech.proj4j.datum.Ellipsoid.WGS84); + p.initialize(); + p.projectRadians(new ProjCoordinate(0.0, Math.toRadians(45.0), 0.0), onWgs84); + + p.setEllipsoid(new org.locationtech.proj4j.datum.Ellipsoid( + "test-sphere", 6371000.0, 6371000.0, 0.0, "test sphere")); + p.initialize(); + p.projectRadians(new ProjCoordinate(0.0, Math.toRadians(45.0), 0.0), onSphere); + + assertEquals(4517590.878848932, onWgs84.x, MM); + assertEquals(6371000.0 * Math.cos(Math.toRadians(45.0)), onSphere.x, MM); + assertEquals(6371000.0 * Math.sin(Math.toRadians(45.0)), onSphere.z, MM); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/geocent/GeocentTransformTest.java b/core/src/test/java/org/locationtech/proj4j/geocent/GeocentTransformTest.java new file mode 100644 index 0000000..d178d42 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/geocent/GeocentTransformTest.java @@ -0,0 +1,172 @@ +/******************************************************************************* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.geocent; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * {@code +proj=geocent} through {@link CoordinateTransform}, in both directions. + * + *

The reverse direction is the one that needs a test. {@code GeocentProjection} cannot supply a + * {@code projectInverse(double, double, ProjCoordinate)} — that signature has no z — so + * {@code BasicCoordinateTransform.inverseAvailable}, which answers "is there an inverse" by + * {@code hasInverse() || isGeographic()} and then by scanning the class hierarchy for exactly that + * method, classified every geocentric CRS as non-invertible until {@code hasInverse()} was + * declared. The golden-master sweep measured the blast radius: 1,058 rows over 330 keys + * (181 {@code epsg} defs x 5 probes, 148 MetaCRS CSV cases, 1 synthetic) went from a coordinate to + * {@code CrsTransformException: ... uses projection None, which has no inverse}. All 1,058 + * round-tripped in 1.4.3. + * + *

Expected values are {@code 9.8.1:src/conversions/cart.cpp}'s {@code cartesian()} evaluated + * independently of proj4j; see {@link GeocentProjectionTest} for the formula and the constants. + */ +public class GeocentTransformTest { + + private static final double MM = 1.0e-6; + + private final CRSFactory crsFactory = new CRSFactory(); + private final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); + + private ProjCoordinate transform(String src, String tgt, double x, double y, double z) { + CoordinateReferenceSystem s = src.startsWith("+") + ? crsFactory.createFromParameters("src", src) : crsFactory.createFromName(src); + CoordinateReferenceSystem t = tgt.startsWith("+") + ? crsFactory.createFromParameters("tgt", tgt) : crsFactory.createFromName(tgt); + ProjCoordinate out = new ProjCoordinate(); + ctFactory.createTransform(s, t).transform(new ProjCoordinate(x, y, z), out); + return out; + } + + /** EPSG:4978 is {@code +proj=geocent +datum=WGS84 +units=m}: the WGS84 geocentric frame. */ + @Test + public void wgs84GeographicToEpsg4978() { + ProjCoordinate xyz = transform("EPSG:4326", "EPSG:4978", 9.5, 55.5, 100.0); + + assertEquals(3571255.4410952283, xyz.x, MM); + assertEquals(597623.2032090913, xyz.y, MM); + assertEquals(5233194.16771844, xyz.z, MM); + } + + /** + * The direction that was refused. Before {@code hasInverse()} was declared this threw + * {@code CrsTransformException(NO_INVERSE_AVAILABLE)}. + */ + @Test + public void epsg4978ToWgs84Geographic() { + ProjCoordinate lonlat = transform("EPSG:4978", "EPSG:4326", + 3571255.4410952283, 597623.2032090913, 5233194.16771844); + + assertEquals(9.5, lonlat.x, 1.0e-8); + assertEquals(55.5, lonlat.y, 1.0e-8); + assertEquals(100.0, lonlat.z, 1.0e-4); + } + + @Test + public void epsg4978RoundTripsThroughGeographic() { + for (double lon = -175.0; lon <= 175.0; lon += 35.0) { + for (double lat = -85.0; lat <= 85.0; lat += 17.0) { + ProjCoordinate xyz = transform("EPSG:4326", "EPSG:4978", lon, lat, 250.0); + ProjCoordinate back = transform("EPSG:4978", "EPSG:4326", xyz.x, xyz.y, xyz.z); + String at = "(" + lon + ", " + lat + ")"; + assertEquals(at, lon, back.x, 1.0e-8); + assertEquals(at, lat, back.y, 1.0e-8); + assertEquals(at, 250.0, back.z, 1.0e-3); + } + } + } + + /** + * A geocentric CRS as a transformation source feeding a projected target — the shape + * the 148 MetaCRS CSV cases take. Kept on one datum (both sides are {@code +datum=WGS84}) so + * that the assertion is about the geocentric inverse and not about the datum stage, which + * three other streams are changing. + */ + @Test + public void geocentricSourceToProjectedTarget() { + ProjCoordinate utm = transform("EPSG:4978", "EPSG:32632", + 3571255.4410952283, 597623.2032090913, 5233194.16771844); + + // The same point via EPSG:4326 -> EPSG:32632, i.e. (9.5, 55.5) in UTM zone 32N. + ProjCoordinate viaGeographic = transform("EPSG:4326", "EPSG:32632", 9.5, 55.5, 0.0); + assertEquals(viaGeographic.x, utm.x, 1.0e-6); + assertEquals(viaGeographic.y, utm.y, 1.0e-6); + assertTrue("easting " + utm.x, utm.x > 100000.0 && utm.x < 900000.0); + assertTrue("northing " + utm.y, utm.y > 6100000.0 && utm.y < 6200000.0); + } + + /** + * Geocentric to geocentric on the same datum is a plain identity through the two conversions, + * and it is the transform that would disagree with itself if this class used Bowring's closed + * form while {@code BasicCoordinateTransform.datumTransform} kept the Toms iteration. It does + * not: both stages are {@code datum.GeocentricConverter}. + */ + @Test + public void geocentricToGeocentricSameDatumIsTheIdentity() { + ProjCoordinate out = transform("EPSG:4978", "EPSG:4978", + 3571255.4410952283, 597623.2032090913, 5233194.16771844); + + assertEquals(3571255.4410952283, out.x, 1.0e-4); + assertEquals(597623.2032090913, out.y, 1.0e-4); + assertEquals(5233194.16771844, out.z, 1.0e-4); + } + + /** + * {@code BasicCoordinateTransform} calls {@code projectRadians(tgt, tgt)} and + * {@code inverseProjectRadians(tgt, tgt)} — the two arguments are the same object. That is why + * the read-{@code dst} defect was invisible here, and it is the path the whole golden-master + * table walks, so this asserts it is stable and not merely correct. + */ + @Test + public void transformIsStableWhenCallerReusesOneCoordinateObject() { + CoordinateReferenceSystem geo = crsFactory.createFromName("EPSG:4326"); + CoordinateReferenceSystem geocent = crsFactory.createFromName("EPSG:4978"); + CoordinateTransform fwd = ctFactory.createTransform(geo, geocent); + + ProjCoordinate shared = new ProjCoordinate(9.5, 55.5, 100.0); + fwd.transform(shared, shared); + + assertEquals(3571255.4410952283, shared.x, MM); + assertEquals(597623.2032090913, shared.y, MM); + assertEquals(5233194.16771844, shared.z, MM); + } + + /** + * {@code +lon_0} rotates the cartesian frame, because {@code fwd_prepare}'s + * {@code lam = (lam - from_greenwich) - lam0} ({@code 9.8.1:src/fwd.cpp:105-112}) runs for a + * cartesian right-hand side too. So longitude 10 under {@code +lon_0=10} puts the point on the + * X axis with Y exactly zero. This is the one change {@code golden/rules.yaml}'s + * {@code PROJ-GEOCENT-LON0-APPLIED} declares, and it is 5 golden rows because no registry def + * carries {@code +lon_0}. + */ + @Test + public void lonZeroRotatesTheFrameThroughATransform() { + ProjCoordinate xyz = transform("EPSG:4326", + "+proj=geocent +ellps=GRS80 +lon_0=10 +units=m +no_defs", 10.0, 45.0, 0.0); + + assertEquals(4517590.878886053, xyz.x, 1.0e-3); + assertEquals(0.0, xyz.y, 1.0e-3); + assertEquals(4487348.4087547995, xyz.z, 1.0e-3); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/gie/GieComparatorTest.java b/core/src/test/java/org/locationtech/proj4j/gie/GieComparatorTest.java new file mode 100644 index 0000000..c290e5d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/gie/GieComparatorTest.java @@ -0,0 +1,498 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * The tests that would have caught the metric bug. + * + *

Reference geodesic distances are on GRS80 ({@code a = 6378137}, + * {@code f = 1/298.257222101}). They were cross-checked against Karney's reference + * GeographicLib (Python 2.x series) and against PROJ 9.8.1's own {@code geod} binary; the + * vendored Java port agrees with the Python reference to the last ULP. The values recorded in + * the skill's reference table are correct only to about 5e-7 m for the three non-equatorial + * cases, so a delta of 1e-6 m is used — five orders of magnitude tighter than needed to + * discriminate the failure modes these tests exist to catch, which are all >100 m. + * + *

+ * (0N,0E) -> (0N,1E)   111319.49079327357   (skill table: 111319.4907932734)
+ * (60N,0E) -> (60N,1E)  55799.470393949334  (skill table:  55799.47039407)
+ * (45N,0E) -> (45N,1E)  78846.33471044291   (skill table:  78846.33471087)
+ * (0N,0E) -> (1N,0E)   110574.38855415252   (skill table: 110574.38855431)
+ * 
+ */ +public class GieComparatorTest { + + private static final double M = 1e-6; + private static final double NAN = Double.NaN; + private static final double INF = Double.POSITIVE_INFINITY; + + /** Reference distances. */ + private static final double ONE_DEG_LON_AT_EQUATOR = 111319.4907932734; + private static final double ONE_DEG_LON_AT_60N = 55799.47039407; + private static final double ONE_DEG_LON_AT_45N = 78846.33471087; + private static final double ONE_DEG_LAT_AT_EQUATOR = 110574.38855431; + + /** What a constant degrees-to-metres scale would wrongly give -- the actual historical bug. */ + private static final double NAIVE_CONSTANT_SCALE = 111319.4908; + + /** Another popular wrong constant: the "mean" metres per degree. */ + private static final double NAIVE_MEAN_SCALE = 111195.0; + + /** What a naive cos(latitude) scale would wrongly give at 60N. */ + private static final double NAIVE_COS_SCALE_AT_60N = 111319.4907932734 * 0.5; + + private final GieComparator grs80 = GieComparator.grs80(); + + private static double[] c(final double a, final double b, final double z, final double t) { + return new double[]{a, b, z, t}; + } + + private static double rad(final double deg) { + return deg * Math.PI / 180.0; + } + + // ================================================================= factories + + /** + * The two defaults are genuinely different ellipsoids and must not be conflated: a bare + * {@code operation} gets WGS84 ({@code init.cpp:576-581}), a {@code +proj=pipeline} with no + * global {@code +ellps} gets GRS80 ({@code pipeline.cpp:338-351}). + */ + @Test + public void wgs84AndGrs80AreDifferentEllipsoids() { + final double[] a = c(0, 0, 0, 0); + final double[] b = c(0, rad(1), 0, 0); // 1 degree of latitude, most f-sensitive + final double dWgs = GieComparator.wgs84().lpDist(a, b); + final double dGrs = GieComparator.grs80().lpDist(a, b); + assertNotEquals(dWgs, dGrs, 0.0); + // ...but only by about 4 microns, so this only matters at nm tolerances. + assertEquals(dWgs, dGrs, 1e-4); + } + + @Test + public void forEllipsoidUsesTheGivenShape() { + final GieComparator sphere = GieComparator.forEllipsoid(6378137.0, 0.0); + // On a sphere of that radius, 1 degree is exactly pi*R/180. + assertEquals(Math.PI * 6378137.0 / 180.0, + sphere.lpDist(c(0, 0, 0, 0), c(rad(1), 0, 0, 0)), 1e-6); + } + + // ================================================ the four reference distances + + @Test + public void oneDegreeOfLongitudeAtTheEquator() { + assertEquals(ONE_DEG_LON_AT_EQUATOR, + grs80.lpDist(c(0, 0, 0, 0), c(rad(1), 0, 0, 0)), M); + } + + /** + * The single most discriminating value in this file. A constant scale gives 111319.49 + * everywhere; a naive {@code cos(60)} scale gives 55659.75; the truth is 55799.47. All + * three are separated by far more than a metre. + */ + @Test + public void oneDegreeOfLongitudeAtSixtyNorth() { + final double d = grs80.lpDist(c(0, rad(60), 0, 0), c(rad(1), rad(60), 0, 0)); + assertEquals(ONE_DEG_LON_AT_60N, d, M); + assertNotEquals(NAIVE_CONSTANT_SCALE, d, 1.0); + assertNotEquals(NAIVE_MEAN_SCALE, d, 1.0); + assertNotEquals(NAIVE_COS_SCALE_AT_60N, d, 1.0); + assertEquals(55659.745, NAIVE_COS_SCALE_AT_60N, 0.01); // the cos(60) trap, for the record + } + + @Test + public void oneDegreeOfLongitudeAtFortyFiveNorth() { + assertEquals(ONE_DEG_LON_AT_45N, + grs80.lpDist(c(0, rad(45), 0, 0), c(rad(1), rad(45), 0, 0)), M); + } + + /** Longitude and latitude do not scale alike, even at the equator. */ + @Test + public void oneDegreeOfLatitudeAtTheEquator() { + final double d = grs80.lpDist(c(0, 0, 0, 0), c(0, rad(1), 0, 0)); + assertEquals(ONE_DEG_LAT_AT_EQUATOR, d, M); + assertNotEquals(ONE_DEG_LON_AT_EQUATOR, d, 1.0); + } + + // ============================================================ the linear branch + + /** + * Discriminating assertion #1. Two eastings a metre apart, projected output: the deviation + * is one metre. Not 111319.4908, not 111195, not 110574. + */ + @Test + public void twoEastingsOneMetreApartAreOneMetreApart() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.PROJECTED, false, + c(500000.0, 6000000.0, 0, 0), + c(500001.0, 6000000.0, 0, 0), + 2, 1.0); + + assertSame(GieMetric.EUCLIDEAN_METRES, r.metric()); + assertEquals(1.0, r.deviation(), 0.0); + assertNotEquals(111319.4908, r.deviation(), 1.0); + assertNotEquals(111195.0, r.deviation(), 1.0); + assertNotEquals(110574.0, r.deviation(), 1.0); + assertTrue(r.passed()); + } + + /** The same, through the CLASSIC alias that every PROJ_HEAD projection actually declares. */ + @Test + public void classicOutputIsAlsoLinear() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.CLASSIC, false, + c(0.0, 0.0, 0, 0), c(1.0, 0.0, 0, 0), 2, 1.0); + assertSame(GieMetric.EUCLIDEAN_METRES, r.metric()); + assertEquals(1.0, r.deviation(), 0.0); + assertNotEquals(111319.4908, r.deviation(), 1.0); + } + + @Test + public void cartesianAndWhateverAreAlsoLinear() { + for (final GieIoUnits u : new GieIoUnits[]{GieIoUnits.CARTESIAN, GieIoUnits.WHATEVER}) { + final GieComparator.Result r = grs80.compare( + u, false, c(0.0, 0.0, 0, 0), c(1.0, 0.0, 0, 0), 2, 1.0); + assertSame("units=" + u, GieMetric.EUCLIDEAN_METRES, r.metric()); + assertEquals("units=" + u, 1.0, r.deviation(), 0.0); + } + } + + /** + * Discriminating assertion #3. Horizontal and vertical combine Pythagorean, via nested + * hypot -- 4 m across and 3 m up is 5 m, not 7 m. + */ + @Test + public void horizontalAndVerticalCombinePythagorean() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.PROJECTED, false, + c(0, 0, 0, 0), c(4.0, 0, 3.0, 0), 3, 10.0); + assertEquals(5.0, r.deviation(), 0.0); + assertNotEquals(7.0, r.deviation(), 0.5); + } + + /** Same rule on the geodesic side: z always participates. */ + @Test + public void verticalOffsetParticipatesInTheGeodesicBranchToo() { + final double horizontal = grs80.lpDist(c(0, 0, 0, 0), c(rad(1), 0, 0, 0)); + final double withZ = grs80.lpzDist(c(0, 0, 0, 0), c(rad(1), 0, 100.0, 0)); + assertEquals(Math.hypot(horizontal, -100.0), withZ, 0.0); + assertTrue(withZ > horizontal); + } + + @Test + public void xyzDistIsNestedHypotNotSumOfSquares() { + // A case where sqrt(dx^2+dy^2+dz^2) would overflow but nested hypot does not. + final double big = 1e200; + final double d = GieComparator.xyzDist(c(0, 0, 0, 0), c(big, big, big, 0)); + assertFalse("nested hypot must not overflow", Double.isInfinite(d)); + assertEquals(big * Math.sqrt(3.0), d, big * 1e-12); + } + + // ============================================================ the swap + + /** + * Discriminating assertion #4a. For a lat-first DEGREES target the swap is the difference + * between measuring a degree of longitude at 60N (55799 m) and a degree of latitude + * (110574 m). + */ + @Test + public void swapChangesTheAnswerForALatFirstDegreesTarget() { + // v[0]=lat, v[1]=lon -- the "lat first" ordering the swap exists to correct. + final double[] expected = c(60.0, 0.0, 0, 0); + final double[] got = c(60.0, 1.0, 0, 0); + + final GieComparator.Result swapped = + grs80.compare(GieIoUnits.DEGREES, true, expected, got, 2, INF); + final GieComparator.Result notSwapped = + grs80.compare(GieIoUnits.DEGREES, false, expected, got, 2, INF); + + assertSame(GieMetric.GEODESIC_FROM_DEGREES, swapped.metric()); + assertTrue(swapped.swapApplied()); + assertFalse(notSwapped.swapApplied()); + + assertEquals(ONE_DEG_LON_AT_60N, swapped.deviation(), M); + assertEquals(ONE_DEG_LAT_AT_EQUATOR, notSwapped.deviation(), M); + assertNotEquals(swapped.deviation(), notSwapped.deviation(), 1.0); + } + + /** + * Discriminating assertion #4b. For a projected target the swap is a mathematical no-op -- + * and not merely to within a rounding error, but bit-for-bit, because hypot's two arguments + * are simply reordered. + */ + @Test + public void swapIsBitIdenticalForAProjectedTarget() { + final double[] expected = c(1.0, 2.0, 0.25, 0); + final double[] got = c(1.1, 2.7, 0.75, 0); + + final double swapped = + grs80.compare(GieIoUnits.PROJECTED, true, expected, got, 3, INF).deviation(); + final double notSwapped = + grs80.compare(GieIoUnits.PROJECTED, false, expected, got, 3, INF).deviation(); + + assertEquals(Double.doubleToRawLongBits(notSwapped), Double.doubleToRawLongBits(swapped)); + } + + /** PROJ does not swap in the RADIANS branch. Neither do we. */ + @Test + public void swapIsNeverAppliedInTheRadiansBranch() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.RADIANS, true, + c(rad(60), 0, 0, 0), c(rad(60), rad(1), 0, 0), 2, INF); + assertSame(GieMetric.GEODESIC_FROM_RADIANS, r.metric()); + assertFalse(r.swapApplied()); + // v[0] is lam and v[1] is phi, unswapped: this is a degree of LATITUDE at lon 60. + assertEquals(ONE_DEG_LAT_AT_EQUATOR, r.deviation(), M); + } + + @Test + public void swapIsNeverAppliedInTheNanBothBranch() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.PROJECTED, true, c(NAN, 1, 0, 0), c(NAN, 2, 0, 0), 2, INF); + assertSame(GieMetric.NAN_BOTH, r.metric()); + assertFalse(r.swapApplied()); + } + + @Test + public void compareDoesNotMutateItsArguments() { + final double[] expected = c(60.0, 0.0, 1.0, 2000.0); + final double[] got = c(60.0, 1.0, 2.0, 2030.0); + final double[] expectedCopy = expected.clone(); + final double[] gotCopy = got.clone(); + + grs80.compare(GieIoUnits.DEGREES, true, expected, got, 2, INF); + + org.junit.Assert.assertArrayEquals(expectedCopy, expected, 0.0); + org.junit.Assert.assertArrayEquals(gotCopy, got, 0.0); + } + + // ================================================= the degrees branch conversion + + /** + * The DEGREES branch converts with {@code deg * PI / 180}, not {@code deg / 180 * PI}. The + * two differ by up to 1 ULP, which is about 1.4e-9 m -- the threshold of the corpus's 16 + * nm-tolerance rows. Here we only check that the branch agrees with the RADIANS branch fed + * pre-converted input, which is the invariant that matters. + */ + @Test + public void degreesBranchAgreesWithRadiansBranchOnPreConvertedInput() { + final GieComparator.Result deg = grs80.compare( + GieIoUnits.DEGREES, false, c(0.0, 45.0, 0, 0), c(1.0, 45.0, 0, 0), 2, INF); + final GieComparator.Result r = grs80.compare( + GieIoUnits.RADIANS, false, + c(rad(0.0), rad(45.0), 0, 0), c(rad(1.0), rad(45.0), 0, 0), 2, INF); + assertEquals(Double.doubleToRawLongBits(r.deviation()), + Double.doubleToRawLongBits(deg.deviation())); + assertEquals(ONE_DEG_LON_AT_45N, deg.deviation(), M); + } + + // ============================================================ NaN handling + + @Test + public void nanOnBothSidesIsZeroAndPasses() { + for (final GieIoUnits u : GieIoUnits.values()) { + final GieComparator.Result r = grs80.compare( + u, false, c(NAN, NAN, NAN, 0), c(NAN, NAN, NAN, 0), 2, 1e-12); + assertSame("units=" + u, GieMetric.NAN_BOTH, r.metric()); + assertEquals("units=" + u, 0.0, r.deviation(), 0.0); + assertTrue("units=" + u, r.passed()); + } + } + + /** + * NaN on one side only must fail, in every branch, in both directions, and however generous + * the tolerance. This is the assertion that stops a blown-up transform from being scored as + * a pass. + */ + @Test + public void nanOnOneSideOnlyFailsInEveryBranch() { + for (final GieIoUnits u : GieIoUnits.values()) { + final GieComparator.Result gotNan = grs80.compare( + u, false, c(0.0, 0.0, 0, 0), c(NAN, 0.0, 0, 0), 2, INF); + assertTrue("got NaN, units=" + u, Double.isNaN(gotNan.deviation())); + assertFalse("got NaN, units=" + u, gotNan.withinTolerance()); + assertFalse("got NaN, units=" + u, gotNan.passed()); + + final GieComparator.Result expectedNan = grs80.compare( + u, false, c(NAN, 0.0, 0, 0), c(0.0, 0.0, 0, 0), 2, INF); + assertTrue("expected NaN, units=" + u, Double.isNaN(expectedNan.deviation())); + assertFalse("expected NaN, units=" + u, expectedNan.passed()); + } + } + + // ======================================================= the pass predicate + + /** + * Discriminating assertion #5. This is exactly the assertion that distinguishes + * {@code !(d <= tol)} from {@code d > tol}: under the latter, NaN passes. + */ + @Test + public void nanIsNotWithinAnInfiniteTolerance() { + assertFalse(GieComparator.withinTolerance(NAN, INF)); + } + + @Test + public void withinToleranceBoundaryBehaviour() { + assertTrue(GieComparator.withinTolerance(0.0, 0.0)); + assertTrue(GieComparator.withinTolerance(1.0, 1.0)); // <= is inclusive + assertFalse(GieComparator.withinTolerance(1.0000001, 1.0)); + assertFalse(GieComparator.withinTolerance(INF, 1.0)); // +inf fails a finite tol + assertFalse(GieComparator.withinTolerance(NAN, 1.0)); + assertFalse(GieComparator.withinTolerance(NAN, NAN)); + assertTrue(GieComparator.withinTolerance(-0.0, 0.0)); + } + + // ======================================================= HUGE_VAL short circuit + + /** + * {@code proj_lpz_dist} short-circuits on {@code lam == HUGE_VAL} -- on lam only, and on + * equality with positive infinity, not on NaN. + */ + @Test + public void lpzDistShortCircuitsOnInfiniteLamOnEitherSide() { + assertEquals(INF, grs80.lpzDist(c(INF, 0, 0, 0), c(0, 0, 0, 0)), 0.0); + assertEquals(INF, grs80.lpzDist(c(0, 0, 0, 0), c(INF, 0, 0, 0)), 0.0); + assertEquals(GieComparator.HUGE_VAL, grs80.lpzDist(c(INF, 0, 0, 0), c(INF, 0, 0, 0)), 0.0); + } + + /** phi and z are NOT part of the guard. */ + @Test + public void lpzDistDoesNotShortCircuitOnInfinitePhi() { + final double d = grs80.lpzDist(c(0, INF, 0, 0), c(0, 0, 0, 0)); + assertTrue("an infinite phi yields NaN from the geodesic, not the HUGE_VAL short circuit", + Double.isNaN(d)); + } + + /** Negative infinity is not HUGE_VAL. */ + @Test + public void lpzDistDoesNotShortCircuitOnNegativeInfiniteLam() { + assertTrue(Double.isNaN(grs80.lpzDist(c(Double.NEGATIVE_INFINITY, 0, 0, 0), c(0, 0, 0, 0)))); + } + + // ============================================== dimension masking and time + + /** Discriminating assertion #6a. t contributes nothing at all to the spatial deviation. */ + @Test + public void thirtyYearsOfTimeContributeZeroMetres() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.PROJECTED, false, + c(0, 0, 0, 2000.0), c(0, 0, 0, 2030.0), 4, 1e-12); + assertEquals(0.0, r.deviation(), 0.0); + assertTrue("the spatial verdict must be unaffected by t", r.withinTolerance()); + assertEquals(30.0, r.temporalDeviation(), 0.0); + assertFalse(r.temporalWithinThreshold()); + assertFalse(r.passed()); + } + + /** Discriminating assertion #6b. The temporal check runs only for 4-dimensional expects. */ + @Test + public void temporalCheckOnlyRunsWhenFourDimensionsWereGiven() { + for (int dims = 1; dims <= 4; dims++) { + final GieComparator.Result r = grs80.compare( + GieIoUnits.PROJECTED, false, + c(0, 0, 0, 2000.0), c(0, 0, 0, 2030.0), dims, 1e-12); + assertEquals("dims=" + dims, dims == 4, r.temporalChecked()); + assertEquals("dims=" + dims, dims != 4, r.passed()); + } + } + + @Test + public void temporalThresholdIsOneTenThousandthOfAYear() { + assertEquals(1e-4, GieComparator.TEMPORAL_THRESHOLD_IN_YEAR, 0.0); + assertTrue(grs80.compare(GieIoUnits.PROJECTED, false, + c(0, 0, 0, 2000.0), c(0, 0, 0, 2000.00005), 4, 1.0).passed()); + assertFalse(grs80.compare(GieIoUnits.PROJECTED, false, + c(0, 0, 0, 2000.0), c(0, 0, 0, 2000.0002), 4, 1.0).passed()); + } + + /** dimensionsGiven < 4 masks got[3]; dimensionsGiven < 3 also masks got[2]. */ + @Test + public void dimensionMaskingAppliesToGotOnly() { + // A z of 3 m is invisible at dims=2 because got[2] is zeroed. + assertEquals(4.0, grs80.compare(GieIoUnits.PROJECTED, false, + c(0, 0, 0, 0), c(4.0, 0, 3.0, 0), 2, INF).deviation(), 0.0); + // ...and visible at dims=3. + assertEquals(5.0, grs80.compare(GieIoUnits.PROJECTED, false, + c(0, 0, 0, 0), c(4.0, 0, 3.0, 0), 3, INF).deviation(), 0.0); + + // The asymmetry: `expected` is NOT masked. In gie this is unobservable because + // parse_coord zero-initialises the expected coordinate, but the port is literal, so a + // caller that supplies a non-zero expected z at dims=2 sees it. + assertEquals(3.0, grs80.compare(GieIoUnits.PROJECTED, false, + c(0, 0, 3.0, 0), c(0, 0, 0, 0), 2, INF).deviation(), 0.0); + } + + // ================================================== the gigs/5102.2 quirk + + /** + * Do not "fix" this. The inverse pipeline of {@code gigs/5102.2.gie} ends with + * {@code +xy_out=grad}. "grad" normalises to neither "Radian" nor "Degree", so + * {@code P->right} stays {@link GieIoUnits#WHATEVER} and the comparison falls into the + * Euclidean branch -- which therefore measures raw grad values against a tolerance + * written as {@code 0.03 m}. A 0.01 grad discrepancy scores as a deviation of 0.01 and + * passes. + * + *

This is faithful reproduction of PROJ 9.8.1 behaviour. Making the comparator "smarter" + * here would change the pass/fail verdict of that file relative to upstream, which is + * exactly what the conformance harness must not do. + */ + @Test + public void gigs5102_2GradValuesAreComparedRawAgainstAMetreTolerance() { + final double tolerance = GieTolerance.tolerance("0.03 m"); + assertEquals(0.03, tolerance, 0.0); + + final GieComparator.Result r = grs80.compare( + GieIoUnits.WHATEVER, false, + c(100.00, 50.00, 0, 0), + c(100.01, 50.00, 0, 0), + 2, tolerance); + + assertSame(GieMetric.EUCLIDEAN_METRES, r.metric()); + assertEquals(0.01, r.deviation(), 1e-9); + assertTrue(r.passed()); + + // Had this taken an angular branch, 0.01 grad would have scored in the many-hundreds of + // metres and the file would have gone red. + assertNotEquals(111319.4908 * 0.009, r.deviation(), 1.0); + } + + // ============================================================== result object + + @Test + public void resultReportsEverythingNeededToAudit() { + final GieComparator.Result r = grs80.compare( + GieIoUnits.CLASSIC, true, + c(0, 0, 0, 2000.0), c(3.0, 4.0, 0, 2000.0), 4, 1.0); + assertSame(GieMetric.EUCLIDEAN_METRES, r.metric()); + assertEquals(5.0, r.deviation(), 0.0); + assertEquals(1.0, r.tolerance(), 0.0); + assertTrue(r.swapApplied()); + assertFalse(r.withinTolerance()); + assertTrue(r.temporalChecked()); + assertEquals(0.0, r.temporalDeviation(), 0.0); + assertTrue(r.temporalWithinThreshold()); + assertFalse(r.passed()); + assertTrue(r.toString().contains("EUCLIDEAN_METRES")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/gie/GieDirectionTest.java b/core/src/test/java/org/locationtech/proj4j/gie/GieDirectionTest.java new file mode 100644 index 0000000..fb9ef00 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/gie/GieDirectionTest.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.fail; + +/** + * Tests for {@link GieDirection} against {@code PJ_DIRECTION} and + * {@code pj_opposite_direction()} ({@code src/coordinates.cpp:48-50}). + */ +public class GieDirectionTest { + + @Test + public void codesMatchPjDirection() { + assertEquals(1, GieDirection.FORWARD.code()); + assertEquals(-1, GieDirection.INVERSE.code()); + assertEquals(2, GieDirection.values().length); + } + + @Test + public void oppositeNegatesTheCode() { + for (final GieDirection d : GieDirection.values()) { + assertEquals(-d.code(), d.opposite().code()); + } + } + + @Test + public void oppositeIsAnInvolution() { + for (final GieDirection d : GieDirection.values()) { + assertSame(d, d.opposite().opposite()); + } + } + + @Test + public void fromCodeRoundTrips() { + assertSame(GieDirection.FORWARD, GieDirection.fromCode(1)); + assertSame(GieDirection.INVERSE, GieDirection.fromCode(-1)); + try { + GieDirection.fromCode(0); // PJ_IDENT -- never reaches the comparator + fail("expected IllegalArgumentException"); + } catch (final IllegalArgumentException expected) { + // ok + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/gie/GieIoUnitsTest.java b/core/src/test/java/org/locationtech/proj4j/gie/GieIoUnitsTest.java new file mode 100644 index 0000000..ca14f80 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/gie/GieIoUnitsTest.java @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.fail; + +/** + * Tests for {@link GieIoUnits} against PROJ 9.8.1 {@code src/proj_internal.h:192-201}, + * {@code src/internal.cpp:49-61} and {@code src/coordinates.cpp:52-93}. + */ +public class GieIoUnitsTest { + + @Test + public void codesMatchPjIoUnits() { + assertEquals(0, GieIoUnits.WHATEVER.code()); + assertEquals(1, GieIoUnits.CLASSIC.code()); + assertEquals(2, GieIoUnits.PROJECTED.code()); + assertEquals(3, GieIoUnits.CARTESIAN.code()); + assertEquals(4, GieIoUnits.RADIANS.code()); + assertEquals(5, GieIoUnits.DEGREES.code()); + assertEquals(6, GieIoUnits.values().length); + } + + @Test + public void fromCodeRoundTrips() { + for (final GieIoUnits u : GieIoUnits.values()) { + assertSame(u, GieIoUnits.fromCode(u.code())); + } + try { + GieIoUnits.fromCode(6); + fail("expected IllegalArgumentException"); + } catch (final IllegalArgumentException expected) { + // ok + } + } + + /** The one non-obvious rule: pj_left/pj_right fold CLASSIC to PROJECTED on every read. */ + @Test + public void classicFoldsToProjected() { + assertSame(GieIoUnits.PROJECTED, GieIoUnits.CLASSIC.folded()); + } + + @Test + public void everythingElseFoldsToItself() { + for (final GieIoUnits u : GieIoUnits.values()) { + if (u != GieIoUnits.CLASSIC) { + assertSame(u, u.folded()); + } + } + } + + @Test + public void foldingIsIdempotent() { + for (final GieIoUnits u : GieIoUnits.values()) { + assertSame(u.folded(), u.folded().folded()); + } + } + + @Test + public void pjLeftAndPjRightSwapWhenInverted() { + assertSame(GieIoUnits.RADIANS, + GieIoUnits.pjLeft(GieIoUnits.RADIANS, GieIoUnits.CARTESIAN, false)); + assertSame(GieIoUnits.CARTESIAN, + GieIoUnits.pjRight(GieIoUnits.RADIANS, GieIoUnits.CARTESIAN, false)); + assertSame(GieIoUnits.CARTESIAN, + GieIoUnits.pjLeft(GieIoUnits.RADIANS, GieIoUnits.CARTESIAN, true)); + assertSame(GieIoUnits.RADIANS, + GieIoUnits.pjRight(GieIoUnits.RADIANS, GieIoUnits.CARTESIAN, true)); + } + + @Test + public void pjLeftAndPjRightAlsoFold() { + assertSame(GieIoUnits.PROJECTED, + GieIoUnits.pjRight(GieIoUnits.RADIANS, GieIoUnits.CLASSIC, false)); + assertSame(GieIoUnits.PROJECTED, + GieIoUnits.pjLeft(GieIoUnits.RADIANS, GieIoUnits.CLASSIC, true)); + } + + /** output(FORWARD) reads pj_right; output(INVERSE) reads pj_left. */ + @Test + public void outputUnitsPicksTheOppositeSide() { + assertSame(GieIoUnits.CARTESIAN, GieIoUnits.outputUnits( + GieIoUnits.RADIANS, GieIoUnits.CARTESIAN, false, GieDirection.FORWARD)); + assertSame(GieIoUnits.RADIANS, GieIoUnits.outputUnits( + GieIoUnits.RADIANS, GieIoUnits.CARTESIAN, false, GieDirection.INVERSE)); + } + + /** + * The default for every {@code PROJ_HEAD} projection is + * {@code left = RADIANS, right = CLASSIC} ({@code proj_internal.h:882-883}). This single + * fact is why the corpus is shaped the way it is: forward projection tests are Euclidean, + * {@code direction inverse} projection tests are geodesic-from-radians. + */ + @Test + public void defaultProjHeadUnitsExplainTheCorpusShape() { + final GieIoUnits left = GieIoUnits.RADIANS; + final GieIoUnits right = GieIoUnits.CLASSIC; + + final GieIoUnits fwdOut = GieIoUnits.outputUnits(left, right, false, GieDirection.FORWARD); + final GieIoUnits invOut = GieIoUnits.outputUnits(left, right, false, GieDirection.INVERSE); + + assertSame(GieIoUnits.PROJECTED, fwdOut); + assertSame(GieIoUnits.RADIANS, invOut); + assertSame(GieMetric.EUCLIDEAN_METRES, GieMetric.select(fwdOut, 0.0, 0.0)); + assertSame(GieMetric.GEODESIC_FROM_RADIANS, GieMetric.select(invOut, 0.0, 0.0)); + } + + /** {@code +inv} on the operation exchanges the sides, and so exchanges the metrics. */ + @Test + public void invertedProjHeadExchangesTheMetrics() { + final GieIoUnits left = GieIoUnits.RADIANS; + final GieIoUnits right = GieIoUnits.CLASSIC; + + assertSame(GieIoUnits.RADIANS, + GieIoUnits.outputUnits(left, right, true, GieDirection.FORWARD)); + assertSame(GieIoUnits.PROJECTED, + GieIoUnits.outputUnits(left, right, true, GieDirection.INVERSE)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/gie/GieMetricTest.java b/core/src/test/java/org/locationtech/proj4j/gie/GieMetricTest.java new file mode 100644 index 0000000..a052392 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/gie/GieMetricTest.java @@ -0,0 +1,103 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.junit.Test; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link GieMetric#select} against the branch chain at + * PROJ 9.8.1 {@code src/apps/gie.cpp:1136-1166}. + */ +public class GieMetricTest { + + private static final double NAN = Double.NaN; + + /** + * The declaration order is the source order of the {@code if}/{@code else if} chain, and is + * part of the contract: a reader comparing this enum with {@code gie.cpp} must be able to + * do so top to bottom. + */ + @Test + public void constantsAreInSourceOrder() { + assertArrayEquals( + new GieMetric[]{ + GieMetric.NAN_BOTH, + GieMetric.GEODESIC_FROM_RADIANS, + GieMetric.GEODESIC_FROM_DEGREES, + GieMetric.EUCLIDEAN_METRES}, + GieMetric.values()); + } + + /** + * The load-bearing case. Four of the six unit values choose the linear metric; getting one + * of these wrong inflates the deviation by a factor of about 111 thousand. + */ + @Test + public void linearUnitsAllSelectEuclidean() { + assertSame(GieMetric.EUCLIDEAN_METRES, GieMetric.select(GieIoUnits.WHATEVER, 1.0, 2.0)); + assertSame(GieMetric.EUCLIDEAN_METRES, GieMetric.select(GieIoUnits.CLASSIC, 1.0, 2.0)); + assertSame(GieMetric.EUCLIDEAN_METRES, GieMetric.select(GieIoUnits.PROJECTED, 1.0, 2.0)); + assertSame(GieMetric.EUCLIDEAN_METRES, GieMetric.select(GieIoUnits.CARTESIAN, 1.0, 2.0)); + } + + @Test + public void radiansSelectsGeodesicFromRadians() { + assertSame(GieMetric.GEODESIC_FROM_RADIANS, GieMetric.select(GieIoUnits.RADIANS, 1.0, 2.0)); + } + + @Test + public void degreesSelectsGeodesicFromDegrees() { + assertSame(GieMetric.GEODESIC_FROM_DEGREES, GieMetric.select(GieIoUnits.DEGREES, 1.0, 2.0)); + } + + /** CLASSIC must not fall through unrecognised; select() folds it. */ + @Test + public void classicIsFoldedNotIgnored() { + assertSame(GieMetric.select(GieIoUnits.PROJECTED, 1.0, 2.0), + GieMetric.select(GieIoUnits.CLASSIC, 1.0, 2.0)); + } + + @Test + public void nanOnBothSidesPreemptsEveryUnit() { + for (final GieIoUnits u : GieIoUnits.values()) { + assertSame("units=" + u, GieMetric.NAN_BOTH, GieMetric.select(u, NAN, NAN)); + } + } + + /** NaN on one side only is NOT the NAN_BOTH branch -- it must fall through and fail. */ + @Test + public void nanOnOneSideOnlyDoesNotPreempt() { + for (final GieIoUnits u : GieIoUnits.values()) { + assertSame("expected NaN, units=" + u, + GieMetric.select(u, 1.0, 2.0), GieMetric.select(u, NAN, 2.0)); + assertSame("got NaN, units=" + u, + GieMetric.select(u, 1.0, 2.0), GieMetric.select(u, 1.0, NAN)); + } + } + + @Test + public void isAngularIsExactlyTheTwoGeodesicBranches() { + assertFalse(GieMetric.NAN_BOTH.isAngular()); + assertTrue(GieMetric.GEODESIC_FROM_RADIANS.isAngular()); + assertTrue(GieMetric.GEODESIC_FROM_DEGREES.isAngular()); + assertFalse(GieMetric.EUCLIDEAN_METRES.isAngular()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/gie/GieSourceHygieneTest.java b/core/src/test/java/org/locationtech/proj4j/gie/GieSourceHygieneTest.java new file mode 100644 index 0000000..14bfaf7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/gie/GieSourceHygieneTest.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * A structural guard, not a behavioural test. + * + *

The single most damaging mistake available in this area is to convert a coordinate delta to + * metres by multiplying by a constant degrees-per-metre factor. It is damaging because it does + * not look wrong: the number is roughly the right size at the equator and silently wrong + * everywhere else, and it is off by a factor of two at 60 degrees of latitude. + * + *

{@link GieTolerance#GRS80_DEG} exists solely so that a tolerance written as + * {@code "1 deg"} can be turned into metres, which is the one place PROJ itself uses a constant + * scale. This test asserts that the literal lives there and nowhere else in {@code src/main}, + * along with {@code 111195}, the other constant people reach for. + * + *

If this test fails, the fix is almost never to add an exemption. It is to obtain the + * distance from {@link GieComparator}, which solves the geodesic. + */ +public class GieSourceHygieneTest { + + /** Literals that must not appear in main sources outside the permitted file. */ + private static final List BANNED = Collections.unmodifiableList( + Arrays.asList("111319.4908", "111195")); + + /** The one file allowed to contain them. */ + private static final String PERMITTED_FILE = "GieTolerance.java"; + + @Test + public void constantDegreeScalesAreConfinedToTheToleranceParser() throws IOException { + final File root = findMainSourceRoot(); + final List sources = new ArrayList(); + collectJavaFiles(root, sources); + + assertTrue("expected to walk a substantial source tree, found " + sources.size() + + " files under " + root, sources.size() > 50); + + final List offences = new ArrayList(); + for (final File f : sources) { + if (PERMITTED_FILE.equals(f.getName())) { + continue; + } + final String text = read(f); + for (final String banned : BANNED) { + if (text.contains(banned)) { + offences.add(banned + " in " + relative(root, f)); + } + } + } + + assertEquals("A constant degrees-to-metres scale escaped " + PERMITTED_FILE + + ". Use GieComparator, which solves the geodesic, instead: " + offences, + Collections.emptyList(), offences); + } + + /** And a positive control: the constant really is where we say it is. */ + @Test + public void theToleranceParserDoesContainTheConstant() throws IOException { + final File root = findMainSourceRoot(); + final File f = new File(root, "org/locationtech/proj4j/gie/" + PERMITTED_FILE); + assertTrue(f + " should exist", f.isFile()); + assertTrue("GieTolerance.java should declare 111319.4908", + read(f).contains("111319.4908")); + } + + // ------------------------------------------------------------------ helpers + + /** + * Locates {@code core/src/main/java} by walking up from the working directory, so that the + * test works whether it is run from the module directory (Maven surefire) or the reactor + * root (an IDE). + */ + private static File findMainSourceRoot() { + File dir = new File(System.getProperty("user.dir", ".")).getAbsoluteFile(); + while (dir != null) { + final File direct = new File(dir, "src/main/java"); + if (new File(direct, "org/locationtech/proj4j/gie").isDirectory()) { + return direct; + } + final File nested = new File(dir, "core/src/main/java"); + if (new File(nested, "org/locationtech/proj4j/gie").isDirectory()) { + return nested; + } + dir = dir.getParentFile(); + } + fail("could not locate core/src/main/java from user.dir=" + + System.getProperty("user.dir")); + throw new AssertionError("unreachable"); + } + + private static void collectJavaFiles(final File dir, final List out) { + final File[] children = dir.listFiles(); + if (children == null) { + return; + } + Arrays.sort(children); + for (final File child : children) { + if (child.isDirectory()) { + collectJavaFiles(child, out); + } else if (child.getName().endsWith(".java")) { + out.add(child); + } + } + } + + private static String read(final File f) throws IOException { + return new String(Files.readAllBytes(f.toPath()), Charset.forName("UTF-8")); + } + + private static String relative(final File root, final File f) { + final String r = root.getAbsolutePath(); + final String p = f.getAbsolutePath(); + return p.startsWith(r) ? p.substring(r.length() + 1) : p; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/gie/GieToleranceTest.java b/core/src/test/java/org/locationtech/proj4j/gie/GieToleranceTest.java new file mode 100644 index 0000000..0c55fd4 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/gie/GieToleranceTest.java @@ -0,0 +1,157 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.gie; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link GieTolerance} against {@code strtod_scaled}, {@code tolerance} and + * {@code column} at PROJ 9.8.1 {@code src/apps/gie.cpp:470-497, 502-554}. + */ +public class GieToleranceTest { + + private static final double EPS = 0.0; + + @Test + public void grs80DegIsTheDocumentedConstant() { + assertEquals(111319.4908, GieTolerance.GRS80_DEG, EPS); + } + + // ---------------------------------------------------------------- column + + @Test + public void columnZeroAndNegativeReturnTheWholeString() { + assertEquals("0.5 mm", GieTolerance.column("0.5 mm", 0)); + assertEquals("0.5 mm", GieTolerance.column("0.5 mm", -1)); + } + + @Test + public void columnOneSkipsLeadingWhitespaceOnly() { + assertEquals("0.5 mm", GieTolerance.column(" 0.5 mm", 1)); + } + + /** + * The trap: {@code column(args, 2)} is the whole tail from the second token, not the second + * token. This is what makes the unit comparison exact. + */ + @Test + public void columnTwoIsTheTailNotJustTheSecondToken() { + assertEquals("mm", GieTolerance.column("0.5 mm", 2)); + assertEquals("mm and then some", GieTolerance.column("0.5 mm and then some", 2)); + assertEquals("", GieTolerance.column("0.5", 2)); + assertEquals("", GieTolerance.column("0.5mm", 2)); + } + + // ------------------------------------------------------------- unit table + + @Test + public void decadalPrefixes() { + assertEquals(1000.0, GieTolerance.tolerance("1 km"), EPS); + assertEquals(1.0, GieTolerance.tolerance("1 m"), EPS); + assertEquals(0.1, GieTolerance.tolerance("1 dm"), EPS); + assertEquals(0.01, GieTolerance.tolerance("1 cm"), EPS); + assertEquals(0.001, GieTolerance.tolerance("1 mm"), EPS); + assertEquals(1e-6, GieTolerance.tolerance("1 um"), EPS); + assertEquals(1e-9, GieTolerance.tolerance("1 nm"), EPS); + } + + /** The two tolerances the corpus actually leans on. */ + @Test + public void theCorpusWorkhorses() { + assertEquals(0.0005, GieTolerance.tolerance("0.5 mm"), EPS); + assertEquals(0.03, GieTolerance.tolerance("0.03 m"), EPS); + } + + /** A bare number is metres, because default_scale is 1 for tolerance(). */ + @Test + public void absentUnitMeansMetres() { + assertEquals(0.01, GieTolerance.tolerance("0.01"), EPS); + assertEquals(2.0, GieTolerance.tolerance("2"), EPS); + } + + /** Unrecognised unit is not an error; it is the default scale, exactly like an absent one. */ + @Test + public void unrecognisedUnitFallsBackToTheDefaultScale() { + assertEquals(0.5, GieTolerance.tolerance("0.5 furlong"), EPS); + assertEquals(0.5, GieTolerance.tolerance("0.5 M"), EPS); // strcmp is case sensitive + assertEquals(0.5, GieTolerance.tolerance("0.5 mm please"), EPS); + assertEquals(0.5, GieTolerance.tolerance("0.5mm"), EPS); // no space -> only one column + } + + @Test + public void defaultScaleIsHonouredByStrtodScaled() { + assertEquals(500.0, GieTolerance.strtodScaled("0.5", 1000.0), EPS); + assertEquals(1000.0, GieTolerance.strtodScaled("1 km", 1000.0), EPS); // unit wins + } + + // ------------------------------------------------------------ angular units + + /** + * {@code rad} and {@code deg} are the only two places {@link GieTolerance#GRS80_DEG} is + * ever consulted, and no {@code .gie} file in the 9.8.1 corpus uses either. + */ + @Test + public void degreeToleranceUsesTheEquatorialScale() { + assertEquals(GieTolerance.GRS80_DEG, GieTolerance.tolerance("1 deg"), EPS); + assertEquals(2 * GieTolerance.GRS80_DEG, GieTolerance.tolerance("2 deg"), EPS); + } + + @Test + public void radianToleranceConvertsToDegreesFirst() { + assertEquals(GieTolerance.GRS80_DEG * Math.toDegrees(1.0), + GieTolerance.tolerance("1 rad"), EPS); + // Sanity: one radian of longitude at the equator is about one earth radius. + assertEquals(6378137.0, GieTolerance.tolerance("1 rad"), 1.0); + } + + // --------------------------------------------------------------- fallbacks + + @Test + public void unparseableResetsToTheFallback() { + assertEquals(0.0005, GieTolerance.tolerance(""), EPS); + assertEquals(0.0005, GieTolerance.tolerance(" "), EPS); + assertEquals(0.0005, GieTolerance.tolerance("abc"), EPS); + assertEquals(0.0005, GieTolerance.tolerance("mm"), EPS); + assertEquals(GieTolerance.FALLBACK_TOLERANCE, GieTolerance.tolerance("?"), EPS); + } + + @Test + public void strtodScaledSignalsUnparseableWithHugeVal() { + assertTrue(Double.isInfinite(GieTolerance.strtodScaled("abc", 1))); + assertTrue(GieTolerance.strtodScaled("abc", 1) > 0); + } + + @Test + public void theInitialToleranceEqualsHalfAMillimetre() { + assertEquals(GieTolerance.DEFAULT_TOLERANCE, GieTolerance.tolerance("0.5 mm"), EPS); + } + + // ------------------------------------------------------------ number forms + + @Test + public void numberForms() { + assertEquals(0.001, GieTolerance.tolerance("1e-3"), EPS); + assertEquals(0.001, GieTolerance.tolerance("1E-3 m"), EPS); + assertEquals(-1.0, GieTolerance.tolerance("-1 m"), EPS); + assertEquals(1.0, GieTolerance.tolerance("+1 m"), EPS); + assertEquals(0.5, GieTolerance.tolerance(".5 m"), EPS); + assertEquals(1000.0, GieTolerance.tolerance("1_000 m"), EPS); // proj_strtod allows _ + assertEquals(0.001, GieTolerance.tolerance(" 1 mm"), EPS); // leading whitespace + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/ConusShipsInEpsgArtifactTest.java b/core/src/test/java/org/locationtech/proj4j/grids/ConusShipsInEpsgArtifactTest.java new file mode 100644 index 0000000..0b1563c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/ConusShipsInEpsgArtifactTest.java @@ -0,0 +1,356 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code proj4j-epsg} must ship {@code conus}, and a consumer with only {@code proj4j} and + * {@code proj4j-epsg} on the classpath must get a real NAD27 datum shift across the conterminous + * United States. This class fails if that grid ever stops shipping. + * + *

Why this cannot be tested the obvious way

+ * + * {@link Nad27ToNad83ConusTest} already pins the numbers, but it cannot pin the + * packaging: core's own test classpath carries a copy of the grid at + * {@code core/src/test/resources/proj4j-data/grids/conus}, and that copy sits at resolver step 3 + * ({@code classpath:/proj4j-data/grids/}), ahead of the legacy step 4 + * ({@code classpath:/proj4/nad/}) where {@code proj4j-epsg} publishes. So an ordinary in-process + * transform test goes on passing after {@code proj4j-epsg} stops shipping anything at all — it is + * masked by the fixture, and it would report success for a consumer who gets none. + * + *

The fix is to build the consumer's classpath explicitly: a {@link URLClassLoader} over exactly + * two URLs — core's own code and whatever artifact publishes {@code /proj4/nad/epsg} — with a + * {@code null} parent, so the bootstrap loader supplies {@code java.*} and nothing else is + * reachable. proj4j core has zero runtime dependencies, which is what makes this legal. Core's + * test classes and test resources are not on it, so the fixture copy is invisible and any shift + * observed came from the shipped artifact. + * + *

Controls, because a packaging test that cannot fail is worthless

+ * + *
    + *
  • {@link #theIsolatedLoaderCannotSeeTheTestFixtureCopy()} is the load-bearing one: it asserts + * the isolated loader finds {@code /proj4/nad/conus} and does not find + * {@code /proj4j-data/grids/conus}, while the ordinary test loader finds both. If the + * isolation ever silently stopped working, every other assertion here would become vacuous — + * so the isolation itself is asserted rather than assumed.
  • + *
  • {@link #theClasspathProbeDiscriminates()} finds a resource known to be present + * ({@code /proj4/nad/ntv1_can.dat}) and fails to find a fabricated sibling, so a + * {@code null} from this probe is evidence about the artifact rather than about the probe.
  • + *
  • {@link #pointsOutsideEveryShippedGridStillFailClosed()} is the negative half. Adding + * {@code conus} must fix CONUS and nothing else: Hawaii, Puerto Rico, Alaska + * and the open ocean must keep raising {@code COORDINATE_OUTSIDE_GRID}. Without this, a + * blanket fail-open would pass the positive half just as well.
  • + *
+ * + *

Reference values

+ * + * PROJ 9.8.1 (Rel. 9.8.1, April 10th, 2026) reading the same grid bytes: + * + *
+ * printf -- "-122.4194 37.7749 0 0\n-97.5 39.0 0 0\n" | cct -d 12 +proj=hgridshift +grids=conus
+ *   -122.420482174289  37.774829514951
+ *    -97.500307341108  38.999999348889
+ * 
+ * + * The CTABLE V2 {@code conus} shipped here and PROJ's own GeoTIFF {@code us_noaa_conus.tif} give + * results identical to all 12 printed decimals, so the format choice is not a source of divergence. + * + *

The reference is deliberately not {@code cs2cs EPSG:4267 EPSG:4269}. + * On a machine with the full {@code proj-data} package installed that command selects + * “NAD27 to NAD83 (7)” (EPSG:8555), which is NADCON5 + * ({@code us_noaa_nadcon5_nad27_nad83_1986_conus.tif}) and answers + * {@code -122.420481960698 37.774831945189} — about 0.27 m away. That is a different published + * transformation, not a discrepancy: proj4j realises {@code +datum=NAD27} as PROJ's legacy + * {@code +nadgrids=@conus,...} table entry, i.e. EPSG:1241 via {@code hgridshift}, so the operation + * above is the one to pin against. Pinning the {@code cs2cs} number would have encoded a 0.27 m + * error as ground truth. + * + *

Shift magnitudes, as geodesic distances on GRS80 ({@code geod -I +ellps=GRS80}, whose + * instrument check reproduces 110574.389 m for one degree of latitude at the equator and + * 111319.491 m for one degree of longitude): 95.660 m at San Francisco and + * 26.624 m in Kansas. Both were 0 m before, because no shipped grid reached them. + * + * @see Nad27ToNad83ConusTest for the numerical behaviour of the grid itself + * @see Ntv1CanHeaderTest for why {@code ntv1_can.dat} alone does not cover CONUS + */ +public class ConusShipsInEpsgArtifactTest { + + /** {@code git -C cat-file blob 44b4900f3168a5b87794f41d201d03d5aea0b964 | shasum -a 256} */ + private static final String CONUS_SHA256 = + "504d184f9a9f6e6c6b76df753346fd236b74772f52a8a5c90d8a43d3651d274d"; + + private static final int CONUS_BYTES = 264424; + + /** Where {@code proj4j-epsg} publishes its grids; resolver chain step 4. */ + private static final String CONUS_ON_CLASSPATH = "/proj4/nad/conus"; + + /** Where a grid pack publishes; resolver chain step 3, and where the fixture copy is. */ + private static final String CONUS_IN_GRID_PACK = "/proj4j-data/grids/conus"; + + /** A resource {@code proj4j-epsg} has always shipped, used as the probe's positive control. */ + private static final String KNOWN_PRESENT = "/proj4/nad/ntv1_can.dat"; + + /** Tolerance in degrees. PROJ's printed reference carries 12 decimals. */ + private static final double TOL_DEG = 1e-9; + + private static final double[] SAN_FRANCISCO = {-122.4194, 37.7749}; + private static final double[] KANSAS = {-97.5, 39.0}; + + private static final double[] SAN_FRANCISCO_NAD83 = {-122.420482174289, 37.774829514951}; + private static final double[] KANSAS_NAD83 = {-97.500307341108, 38.999999348889}; + + // --- The shipping guarantee --------------------------------------------------------------- + + /** + * The bytes are on the classpath at the path {@code proj4j-epsg} owns, and they are PROJ's. + * Core's test resources publish {@code conus} at a different path, so this assertion + * cannot be satisfied by the fixture. + */ + @Test + public void epsgShipsConusAtTheLegacyGridPath() throws IOException { + byte[] bytes = read(CONUS_ON_CLASSPATH); + assertNotNull(CONUS_ON_CLASSPATH + " is not on the classpath. proj4j-epsg must ship it: " + + "without it NAD27 transforms across the conterminous United States have no grid " + + "and fail closed.", bytes); + assertEquals("conus size", CONUS_BYTES, bytes.length); + assertEquals("conus SHA-256 -- must stay byte-identical to PROJ 9.8.1 data/tests/conus, " + + "blob 44b4900f3168a5b87794f41d201d03d5aea0b964", CONUS_SHA256, sha256(bytes)); + assertEquals("CTABLE V2 magic", "CTABLE V2", new String(bytes, 0, 9, "US-ASCII")); + } + + /** + * A {@code null} from {@link Class#getResource} must be evidence about the artifact, not about + * the probe. Finds something known to be present; fails to find a fabricated sibling. + */ + @Test + public void theClasspathProbeDiscriminates() throws IOException { + assertNotNull("positive control: " + KNOWN_PRESENT + " has always shipped in proj4j-epsg", + read(KNOWN_PRESENT)); + assertNull("negative control: a fabricated name must not resolve, or this probe proves nothing", + read("/proj4/nad/conus-that-does-not-exist")); + } + + // --- The consumer classpath --------------------------------------------------------------- + + /** + * The isolation itself, asserted rather than assumed. Every behavioural assertion below is + * vacuous if this fails: the isolated loader must see the shipped grid and must not + * see the test fixture, while the ordinary test loader sees both. + */ + @Test + public void theIsolatedLoaderCannotSeeTheTestFixtureCopy() throws Exception { + assertNotNull("fixture copy is expected on the ordinary test classpath -- if this is gone " + + "the premise of this class has changed", read(CONUS_IN_GRID_PACK)); + assertNotNull("shipped copy is expected on the ordinary test classpath too", read(CONUS_ON_CLASSPATH)); + + URLClassLoader consumer = consumerClassLoader(); + try { + assertNotNull("the consumer classpath must carry the shipped grid", + consumer.getResource(strip(CONUS_ON_CLASSPATH))); + assertNull("the consumer classpath must NOT carry core's test fixture, or this whole " + + "class silently stops testing packaging", + consumer.getResource(strip(CONUS_IN_GRID_PACK))); + assertNull("the consumer classpath must not carry core's test classes either", + consumer.getResource("org/locationtech/proj4j/grids/ConusShipsInEpsgArtifactTest.class")); + } finally { + consumer.close(); + } + } + + /** + * The deliverable. With only {@code proj4j} and {@code proj4j-epsg} reachable, + * {@code EPSG:4267 -> EPSG:4269} shifts, and shifts to PROJ 9.8.1's value. + */ + @Test + public void nad27ShiftsAcrossConusWithOnlyCoreAndEpsg() throws Exception { + URLClassLoader consumer = consumerClassLoader(); + try { + assertTransforms(consumer, "San Francisco", SAN_FRANCISCO, SAN_FRANCISCO_NAD83); + assertTransforms(consumer, "Kansas", KANSAS, KANSAS_NAD83); + } finally { + consumer.close(); + } + } + + /** + * The negative half: the fix must be targeted, not blanket. Hawaii, Puerto Rico and Alaska have + * no CTABLE V2 form in PROJ 9.8.1's tree and are not shipped; the Gulf of Guinea point is the + * one every {@code proj4-epsg.csv} row probes, ~12,000 km outside every US grid. All must still + * refuse rather than invent a plausible coordinate. + */ + @Test + public void pointsOutsideEveryShippedGridStillFailClosed() throws Exception { + URLClassLoader consumer = consumerClassLoader(); + try { + assertRefuses(consumer, "Honolulu", new double[]{-157.8583, 21.3069}); + assertRefuses(consumer, "San Juan PR", new double[]{-66.1057, 18.4655}); + assertRefuses(consumer, "Anchorage", new double[]{-149.9003, 61.2181}); + assertRefuses(consumer, "Gulf of Guinea", new double[]{1.0, -1.0}); + } finally { + consumer.close(); + } + } + + // --- helpers ------------------------------------------------------------------------------ + + private void assertTransforms(ClassLoader cl, String label, double[] in, double[] expected) + throws Exception { + double[] got = transform(cl, in); + assertEquals(label + " longitude", expected[0], got[0], TOL_DEG); + assertEquals(label + " latitude", expected[1], got[1], TOL_DEG); + assertTrue(label + " must actually move -- an unchanged coordinate is the defect this " + + "class exists to prevent", Math.abs(got[0] - in[0]) + Math.abs(got[1] - in[1]) > 1e-8); + } + + private void assertRefuses(ClassLoader cl, String label, double[] in) throws Exception { + try { + double[] got = transform(cl, in); + fail(label + " is outside every grid proj4j-epsg ships and must raise " + + "COORDINATE_OUTSIDE_GRID, but returned (" + got[0] + ", " + got[1] + ")"); + } catch (InvocationTargetException e) { + Throwable t = e.getCause(); + assertEquals(label + " must fail with a CrsTransformException, got: " + t, + "org.locationtech.proj4j.CrsTransformException", t.getClass().getName()); + Method cause = t.getClass().getMethod("cause"); + Object errorCause = cause.invoke(t); + assertNotNull(label + " must carry a machine-readable cause", errorCause); + assertEquals(label + " cause", "COORDINATE_OUTSIDE_GRID", + ((Enum) errorCause).name()); + } + } + + /** Drives {@code EPSG:4267 -> EPSG:4269} entirely inside the given loader, by reflection. */ + private double[] transform(ClassLoader cl, double[] in) throws Exception { + Class crsFactoryType = cl.loadClass("org.locationtech.proj4j.CRSFactory"); + Class ctFactoryType = cl.loadClass("org.locationtech.proj4j.CoordinateTransformFactory"); + Class crsType = cl.loadClass("org.locationtech.proj4j.CoordinateReferenceSystem"); + Class coordType = cl.loadClass("org.locationtech.proj4j.ProjCoordinate"); + + Object crsFactory = crsFactoryType.getDeclaredConstructor().newInstance(); + Object ctFactory = ctFactoryType.getDeclaredConstructor().newInstance(); + + Method createFromName = crsFactoryType.getMethod("createFromName", String.class); + Object src = createFromName.invoke(crsFactory, "EPSG:4267"); + Object tgt = createFromName.invoke(crsFactory, "EPSG:4269"); + + Object ct = ctFactoryType.getMethod("createTransform", crsType, crsType) + .invoke(ctFactory, src, tgt); + + Object from = coordType.getDeclaredConstructor(double.class, double.class) + .newInstance(in[0], in[1]); + Object to = coordType.getDeclaredConstructor().newInstance(); + + ct.getClass().getMethod("transform", coordType, coordType).invoke(ct, from, to); + + return new double[]{ + coordType.getField("x").getDouble(to), + coordType.getField("y").getDouble(to)}; + } + + /** + * Exactly what a consumer gets: core's code plus whatever artifact publishes the EPSG + * dictionary, and a {@code null} parent so nothing else on the surefire classpath leaks in. + * Legal only because proj4j core has zero runtime dependencies. + */ + private static URLClassLoader consumerClassLoader() { + URL core = CRSFactory.class.getProtectionDomain().getCodeSource().getLocation(); + assertNotNull("cannot locate core's own code", core); + URL epsg = rootOf("/proj4/nad/epsg"); + assertNotNull("cannot locate the proj4j-epsg artifact from /proj4/nad/epsg -- this test " + + "requires it on the classpath", epsg); + return new URLClassLoader(new URL[]{core, epsg}, null); + } + + /** + * The classpath root that publishes {@code resource}, whether that is an exploded directory or + * a jar. Handles both so the test means the same thing in a reactor build and against the + * packaged artifact. + */ + private static URL rootOf(String resource) { + URL url = ConusShipsInEpsgArtifactTest.class.getResource(resource); + if (url == null) { + return null; + } + String s = url.toExternalForm(); + try { + if ("jar".equals(url.getProtocol())) { + int bang = s.indexOf("!/"); + return new URL(s.substring("jar:".length(), bang)); + } + if (!s.endsWith(resource)) { + return null; + } + return new URL(s.substring(0, s.length() - resource.length() + 1)); + } catch (IOException e) { + return null; + } + } + + private static String strip(String absolute) { + return absolute.startsWith("/") ? absolute.substring(1) : absolute; + } + + /** Whole-resource read, or {@code null} if absent. */ + private static byte[] read(String resource) throws IOException { + InputStream in = ConusShipsInEpsgArtifactTest.class.getResourceAsStream(resource); + if (in == null) { + return null; + } + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + private static String sha256(byte[] bytes) { + try { + byte[] d = MessageDigest.getInstance("SHA-256").digest(bytes); + StringBuilder sb = new StringBuilder(d.length * 2); + for (byte b : d) { + sb.append(Character.forDigit((b >> 4) & 0xf, 16)); + sb.append(Character.forDigit(b & 0xf, 16)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("SHA-256 is required of every JRE", e); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/GridCacheTest.java b/core/src/test/java/org/locationtech/proj4j/grids/GridCacheTest.java new file mode 100644 index 0000000..66b1e85 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/GridCacheTest.java @@ -0,0 +1,215 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.resource.ResourceResolvers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The parsed-grid cache: thread-safe, bounded, and provably unable to change a number. + * + *

1.4.3 had no cache at all — {@code Grid.mergeGridFile} carried a {@code TODO} where the cache now + * is. Every {@code +nadgrids=} parse re-read and re-allocated the grid, so a 1,000-entry transform cache + * was also a cache of up to 1,000 independently parsed copies of the same file, and all of it happened + * inside one {@code synchronized (Grid.class)} block wrapped around blocking I/O. + */ +public class GridCacheTest { + + @After + public void reset() { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + } + + @Test + public void thesameGridIsParsedOnceAndShared() throws IOException { + GridCache.instance().clear(); + long missesBefore = GridCache.instance().missCount(); + + Grid first = GridReferenceValues.singleton("conus").get(0); + Grid second = GridReferenceValues.singleton("conus").get(0); + + assertSame("a second request must return the very same parsed grid", first, second); + assertEquals("only one parse", 1L, GridCache.instance().missCount() - missesBefore); + } + + @Test + public void theCacheAccountsForBytesNotEntries() throws IOException { + GridCache.instance().clear(); + Grid conus = GridReferenceValues.singleton("conus").get(0); + // conus is 273 x 121 = 33,033 nodes. + assertEquals(33033L * 32L, conus.sizeBytes()); + assertTrue("the cache must have accounted the grid's bytes", + GridCache.instance().bytes() >= conus.sizeBytes()); + assertTrue("and it must have a byte budget, not an entry budget", + GridCache.instance().maxBytes() > 0); + } + + /** + * The determinism property that makes the cache safe: eviction cannot be observed in output. A grid + * re-parsed after eviction produces bit-identical results, because parsing is a pure + * function of the resolved bytes. + */ + @Test + public void evictionAndReloadGiveBitwiseIdenticalResults() throws IOException { + List first = GridReferenceValues.singleton("conus"); + double[] before = GridReferenceValues.shiftDegrees(first, false, + GridReferenceValues.SAN_FRANCISCO[0], GridReferenceValues.SAN_FRANCISCO[1]); + + GridCache.instance().clear(); + + List reloaded = GridReferenceValues.singleton("conus"); + assertTrue("clearing the cache must force a genuinely new parse", + first.get(0) != reloaded.get(0)); + double[] after = GridReferenceValues.shiftDegrees(reloaded, false, + GridReferenceValues.SAN_FRANCISCO[0], GridReferenceValues.SAN_FRANCISCO[1]); + + assertEquals("longitude bits must be identical across a reload", + Double.doubleToRawLongBits(before[0]), Double.doubleToRawLongBits(after[0])); + assertEquals("latitude bits must be identical across a reload", + Double.doubleToRawLongBits(before[1]), Double.doubleToRawLongBits(after[1])); + assertEquals("and the re-parsed grid must equal the original", first.get(0), reloaded.get(0)); + } + + /** + * A tiny cache forced to evict on every admission still gives the same answers. This is the + * eviction-timing independence claim, tested rather than asserted. + */ + @Test + public void aCacheTooSmallToHoldAnythingStillGivesTheSameAnswers() throws IOException { + double[] expected = GridReferenceValues.shiftDegrees( + GridReferenceValues.singleton("conus"), false, + GridReferenceValues.CHICAGO[0], GridReferenceValues.CHICAGO[1]); + + for (int i = 0; i < 20; i++) { + GridCache.instance().clear(); + double[] got = GridReferenceValues.shiftDegrees( + GridReferenceValues.singleton("conus"), false, + GridReferenceValues.CHICAGO[0], GridReferenceValues.CHICAGO[1]); + assertEquals(Double.doubleToRawLongBits(expected[0]), Double.doubleToRawLongBits(got[0])); + assertEquals(Double.doubleToRawLongBits(expected[1]), Double.doubleToRawLongBits(got[1])); + } + } + + /** + * Many threads demanding the same grid simultaneously must produce exactly one parse and one shared + * instance, without a global lock held across the read. + */ + @Test(timeout = 120_000) + public void concurrentFirstUseParsesOnceAndSharesOneInstance() throws Exception { + GridCache.instance().clear(); + final long missesBefore = GridCache.instance().missCount(); + final int threads = 36; + final CyclicBarrier start = new CyclicBarrier(threads); + final List seen = new CopyOnWriteArrayList(); + final List problems = new CopyOnWriteArrayList(); + final AtomicInteger done = new AtomicInteger(); + + List pool = new ArrayList(threads); + for (int t = 0; t < threads; t++) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + start.await(); + seen.add(GridReferenceValues.singleton("conus").get(0)); + done.incrementAndGet(); + } catch (Throwable e) { + problems.add(String.valueOf(e)); + } + } + }, "grid-cache-" + t); + thread.setDaemon(true); + pool.add(thread); + } + for (Thread thread : pool) { + thread.start(); + } + for (Thread thread : pool) { + thread.join(); + } + + assertTrue("no thread may fail: " + problems, problems.isEmpty()); + assertEquals(threads, done.get()); + assertEquals(threads, seen.size()); + Grid first = seen.get(0); + for (Grid g : seen) { + assertSame("all threads must observe the same parsed grid instance", first, g); + } + assertEquals("exactly one parse across 36 threads", 1L, + GridCache.instance().missCount() - missesBefore); + } + + /** + * A parse failure is cached and replayed. Determinism cuts both ways: a corrupt grid must fail the + * same way on row 4,000,000 as on row 1, not intermittently depending on cache state. + */ + @Test + public void aFailureIsCachedAndReplayedIdentically() throws IOException { + GridCache.instance().clear(); + String first = null; + String second = null; + try { + Grid.fromNadGrids("definitely_not_a_grid"); + fail("expected a failure"); + } catch (IOException e) { + first = e.getMessage(); + } + try { + Grid.fromNadGrids("definitely_not_a_grid"); + fail("expected a failure"); + } catch (IOException e) { + second = e.getMessage(); + } + assertNotNull(first); + assertEquals("the same failure, identically worded", first, second); + } + + /** The vertical cache is separate from the horizontal one and behaves the same way. */ + @Test + public void verticalGridsUseTheirOwnCache() throws Exception { + GridCache.vertical().clear(); + long before = GridCache.vertical().missCount(); + Callable load = new Callable() { + @Override + public Object call() throws IOException { + return org.locationtech.proj4j.datum.VerticalGrid.fromName("egm96_15_downsampled.gtx"); + } + }; + Object a = load.call(); + Object b = load.call(); + assertSame(a, b); + assertEquals("one parse", 1L, GridCache.vertical().missCount() - before); + assertTrue(GridCache.vertical().bytes() > 0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/GridReferenceValues.java b/core/src/test/java/org/locationtech/proj4j/grids/GridReferenceValues.java new file mode 100644 index 0000000..9d273d6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/GridReferenceValues.java @@ -0,0 +1,167 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; + +/** + * Reference values for the grid tests, and where they came from. + * + *

Provenance of every number in this file

+ * + *

All expected coordinates were produced by PROJ 9.8.1 itself — the Homebrew build, + * {@code cs2cs} reporting {@code Rel. 9.8.1, April 10th, 2026} — reading the same grid file bytes + * that this repository ships. That is the only reference that isolates what these tests are about: it + * holds the grid data, the interpolation, the datum semantics and the version all fixed, so a + * disagreement can only be proj4j's reader or proj4j's interpolation. Published NGS NADCON tables would + * not do that, because they use a different (NADCON 5) model and would fold a data difference into + * every assertion. + * + *

Commands, verbatim: + *

+ * PROJ_DATA=<dir with conus, ntv1_can.dat, ntv2_0_downsampled.gsb>:/opt/homebrew/share/proj
+ *
+ * cs2cs -f "%.10f" +proj=longlat +ellps=clrk66 +nadgrids=conus \
+ *              +to +proj=longlat +datum=NAD83                      < points
+ *
+ * cs2cs -f "%.10f" +proj=longlat +datum=NAD83 \
+ *              +to +proj=longlat +ellps=clrk66 +nadgrids=conus     < points    # inverse
+ *
+ * cct  -d 10 +proj=vgridshift +grids=egm96_15_downsampled.gtx +multiplier=1     < points
+ * 
+ * + *

Values are printed to 10 decimal places of a degree, i.e. rounded at about 0.01 mm, so assertions + * use a tolerance of 1e-9° (roughly 0.1 mm) — three orders of magnitude tighter than the ~13 m and + * ~95 m errors under test, and tight enough that a one-node indexing slip cannot hide in it. + * + *

Why the assertions are on {@code Grid.shift} and not only on a CRS pair

+ * + *

{@code cs2cs} between two geographic proj-strings applies the horizontal grid shift and nothing + * else. Proj4J's CRS-level path may additionally route through geocentric coordinates to change + * ellipsoid, which perturbs latitude by a small amount that has nothing to do with the grid. Comparing + * {@code Grid.shift} directly keeps the comparison apples-to-apples at full precision; the CRS-level + * tests then assert the same shift with a tolerance that admits the ellipsoid step. + */ +final class GridReferenceValues { + + private GridReferenceValues() { + } + + /** Tolerance in degrees for a direct {@code Grid.shift} comparison: ~0.1 mm. */ + static final double TOL_DEG = 1e-9; + + // --- Points ------------------------------------------------------------------------------- + + /** San Francisco. Outside {@code ntv1_can.dat} (37.78°N < 40°N); inside {@code conus}. */ + static final double[] SAN_FRANCISCO = {-122.416667, 37.783333}; + + /** Kansas. Outside {@code ntv1_can.dat} (39.0°N < 40°N); inside {@code conus}. */ + static final double[] KANSAS = {-97.5, 39.0}; + + /** Chicago. Inside both {@code conus} and {@code ntv1_can.dat} — the two disagree. */ + static final double[] CHICAGO = {-87.6, 41.9}; + + /** Boston. Inside both. */ + static final double[] BOSTON = {-71.06, 42.36}; + + /** Mid-Atlantic: outside every grid shipped or tested here. */ + static final double[] OPEN_OCEAN = {-40.0, 35.0}; + + // --- conus, NAD27 -> NAD83 ---------------------------------------------------------------- + + static final double[] CONUS_FWD_SAN_FRANCISCO = {-122.4177492097, 37.7832622344}; + static final double[] CONUS_FWD_KANSAS = {-97.5003073411, 38.9999993489}; + static final double[] CONUS_FWD_CHICAGO = {-87.6000518697, 41.9000329865}; + static final double[] CONUS_FWD_BOSTON = {-71.0594954596, 42.3600974317}; + + // --- conus, NAD83 -> NAD27 (the iterative inverse) ---------------------------------------- + + static final double[] CONUS_INV_SAN_FRANCISCO = {-122.4155848029, 37.7834037741}; + static final double[] CONUS_INV_KANSAS = {-97.4996926694, 39.0000006530}; + static final double[] CONUS_INV_CHICAGO = {-87.5999481331, 41.8999670129}; + static final double[] CONUS_INV_BOSTON = {-71.0605045282, 42.3599025694}; + + // --- ntv1_can.dat, NAD27 -> NAD83 --------------------------------------------------------- + + static final double[] NTV1_FWD_CHICAGO = {-87.6001190236, 41.9000194486}; + static final double[] NTV1_FWD_BOSTON = {-71.0596068923, 42.3600965120}; + + // --- ntv2_0_downsampled.gsb, NAD27 -> NAD83 ----------------------------------------------- + + /** Inside subgrid {@code ONwinsor}, a child of {@code CAeast}. */ + static final double[] NTV2_ONWINSOR = {-83.0, 42.1}; + static final double[] NTV2_FWD_ONWINSOR = {-82.9999212472, 42.1000428139}; + + /** Inside subgrid {@code ALraymnd}, a child of {@code CAwest}. */ + static final double[] NTV2_ALRAYMND = {-113.0, 49.4}; + static final double[] NTV2_FWD_ALRAYMND = {-113.0009350195, 49.3999888517}; + + /** Inside subgrid {@code ALbanff}, a child of {@code CAwest}. */ + static final double[] NTV2_ALBANFF = {-115.55, 51.15}; + static final double[] NTV2_FWD_ALBANFF = {-115.5510424277, 51.1500230389}; + + /** Inside root subgrid {@code CAwest} only -- and outside the first subgrid, {@code CAeast}. */ + static final double[] NTV2_CAWEST = {-120.0, 55.0}; + static final double[] NTV2_FWD_CAWEST = {-120.0013964435, 54.9999609805}; + + // --- egm96_15_downsampled.gtx ------------------------------------------------------------- + + static final double[][] GTX_POINTS = { + {0.0, 0.0}, + {-122.416667, 37.783333}, + {12.5, 41.9}, + {-179.0, -89.0}, + {151.21, -33.87}, + }; + + static final double[] GTX_EXPECTED = { + 17.2340171337, + -32.7083794732, + 48.0834085220, + -30.0507870266, + 21.9752037526, + }; + + /** {@code cct} prints 10 decimals of a metre. */ + static final double GTX_TOL = 1e-9; + + // --- Helpers ------------------------------------------------------------------------------ + + static List grids(String nadgrids) throws IOException { + return Grid.fromNadGrids(nadgrids); + } + + static List singleton(String name) throws IOException { + List list = new ArrayList(); + Grid.mergeGridFile(name, list); + return list; + } + + /** + * Applies {@link Grid#shift} to a lon/lat pair given in degrees and returns degrees, so the test + * assertions read in the same units as the {@code cs2cs} output they are compared against. + */ + static double[] shiftDegrees(List grids, boolean inverse, double lonDeg, double latDeg) { + ProjCoordinate c = new ProjCoordinate(Math.toRadians(lonDeg), Math.toRadians(latDeg)); + Grid.shift(grids, inverse, c); + return new double[]{Math.toDegrees(c.x), Math.toDegrees(c.y)}; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/GridResolutionTest.java b/core/src/test/java/org/locationtech/proj4j/grids/GridResolutionTest.java new file mode 100644 index 0000000..48d147a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/GridResolutionTest.java @@ -0,0 +1,574 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ClasspathResourceResolver; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The resolver chain: determinism, the absence of the working directory, and the visibility of PROJ's + * {@code @}-optional silent skip. + * + *

Why the working directory mattered

+ *

1.4.3's {@code Grid.resolveGridDefinition} did {@code new File(gridName)} first. On + * a Spark or Flink executor the working directory is a framework-chosen container work dir, shared + * between tasks in the same container and writable by {@code --files} staging, shuffle spill and + * arbitrary user UDF code. A file named {@code conus} or {@code ntv2_0.gsb} landing there outranked the + * packaged grid, so the same CRS pair and the same coordinate could produce a different number on + * different executors and on different runs of the same job — with no diagnostic anywhere. It was also + * an untrusted-input file open: {@code gridName} comes from a {@code +nadgrids=} token in a per-row CRS + * string, and {@code new File} accepts {@code ../} and absolute paths. + */ +public class GridResolutionTest { + + @After + public void resetChain() { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + } + + // --- the working directory is never consulted --------------------------------------------- + + /** + * Writes a valid CTABLE V2 grid into the process working directory under a name proj4j is about to + * resolve, and proves it is ignored. The file has a deliberately different extent, so if it were + * picked up the coordinate would move. + */ + @Test + public void workingDirectoryIsNeverConsulted() throws IOException { + String cwd = System.getProperty("user.dir"); + File decoy = new File(cwd, "proj4j-cwd-decoy-grid"); + FileOutputStream out = new FileOutputStream(decoy); + try { + out.write(syntheticCtable2()); + } finally { + out.close(); + } + try { + List list = new ArrayList(); + try { + Grid.mergeGridFile("proj4j-cwd-decoy-grid", list); + fail("a grid present only in the working directory must not resolve; it did, from " + + list.get(0).getOrigin()); + } catch (IOException expected) { + assertTrue("the message should say the working directory is not searched: " + + expected.getMessage(), + expected.getMessage().contains("working directory")); + } + } finally { + assertTrue(decoy.delete() || !decoy.exists()); + } + } + + /** + * The other half of the same defect: a traversal or an absolute path in a {@code +nadgrids=} token + * must not open a file. In 1.4.3, {@code +nadgrids=/etc/passwd} opened and read the file, then + * failed all three format tests and produced a {@code format = "missing"} no-op grid rather than + * throwing — a file-existence and readability oracle driven by row data. + * + *

This list changed shape when interior path segments were permitted

+ * + *

The guard used to reject any name containing {@code /}, which also refused + * {@code tests/us_noaa_nadcon5_conus.tif} — a spelling PROJ supports (it appends the whole token + * to a search directory) and one the conformance corpus depends on. Permitting it means + * {@code subdir/conus}, which used to be in this list, is now a legal name that happens + * not to exist; it moved to {@link #aLegalNameThatDoesNotExistFailsForADifferentReason()}. + * + *

That split is deliberate. It used to be weak: end-to-end both cases produced the + * same {@code IOException} saying "Unknown grid", so this list would have kept passing with the + * guard deleted — it was really only asserting that the names are not present. They are now + * distinguishable, because {@code Grid.resolveAndLoad} applies {@code ResourceNames} before the + * resolver chain and reports which clause refused the name. So this asserts the + * refusal, by rule and by name, and {@link #aLegalNameThatDoesNotExistFailsForADifferentReason()} + * asserts that a legal-but-absent name still reaches the chain and fails differently. Deleting + * the guard now fails this test rather than passing it. + * + *

The rule itself is pinned exhaustively in + * {@code org.locationtech.proj4j.resource.ResourceNameSafetyTest}; what is asserted here is that + * it is actually wired into the path a {@code +nadgrids=} token travels. + */ + @Test + public void pathsInAGridNameAreRejectedRatherThanOpened() { + String[] hostile = { + // traversal + "../../../etc/passwd", + "tests/../../etc/passwd", + "a/./b", + "..", + ".", + // absolute + "/etc/passwd", + "/tests/foo.tif", + "\\tests\\foo.tif", + "..\\..\\windows\\win.ini", + // empty segments + "a//b", + "tests/", + // whitespace, and a URL escape that spells "../" without using '.' or '/' + "dir with space/myconus", + "%2e%2e%2fetc/passwd", + // a drive letter and a URL scheme + "C:/windows/win.ini", + "file:///etc/passwd", + }; + for (String name : hostile) { + org.locationtech.proj4j.resource.ResourceNames.Rule rule = + org.locationtech.proj4j.resource.ResourceNames.violation(name); + assertNotNull("this list is only evidence if every name really does break the rule; '" + + name + "' does not", rule); + + List list = new ArrayList(); + try { + Grid.mergeGridFile(name, list); + fail("'" + name + "' must not resolve to anything"); + } catch (IOException expected) { + assertTrue("'" + name + "' must be refused by name, not merely not found; got: " + + expected.getMessage(), + expected.getMessage().contains("Refusing grid name")); + assertTrue("the refusal must name the clause that fired (" + rule + ") for '" + + name + "'; got: " + expected.getMessage(), + expected.getMessage().contains(rule.toString())); + assertFalse("a refused name must NOT be reported as a lookup miss, or this test " + + "cannot tell the guard from the absence of the file: " + name, + expected.getMessage().contains("Unknown grid")); + } + } + } + + /** + * The control for the test above. {@code subdir/conus} is now accepted by the name rule and + * simply is not present, so it fails at lookup rather than at validation — which is what makes + * the hostile list above evidence about the guard rather than about the filesystem. + * + *

And the unlock itself, positively: a grid really does resolve through an interior path + * segment. Without this the relaxation could have been a no-op and every other test here would + * still be green. + */ + @Test + public void aLegalNameThatDoesNotExistFailsForADifferentReason() throws IOException { + assertTrue("an interior path segment is a legal grid name now", + org.locationtech.proj4j.resource.ResourceResolvers.resolver() + .resolve("subdir/conus") == null); + + List list = new ArrayList(); + try { + Grid.mergeGridFile("subdir/conus", list); + fail("'subdir/conus' is legal but absent, so it must still fail"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("Unknown grid")); + } + + Path root = Files.createTempDirectory("proj4j-subdir-grid"); + try { + Files.createDirectory(root.resolve("subdir")); + Files.write(root.resolve("subdir").resolve("conus"), + Files.readAllBytes(conusOnClasspath())); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + GridCache.instance().clear(); + + List found = new ArrayList(); + Grid.mergeGridFile("subdir/conus", found); + assertEquals(1, found.size()); + assertEquals("subdir/conus", found.get(0).getGridName()); + assertEquals("ctable2", found.get(0).getFormat()); + } finally { + deleteRecursively(root); + } + } + + /** + * The operator-facing description states all three positions, and the network one is true. + * + *

What this test is, and what it is not

+ * + *

It is an output-format test. {@code describeResolution()} is meant to be logged + * once per JVM so that an empty grid list is never misread as "nothing installed", and the + * three lines below are the ones an operator looks for. Asserting they are present is worth + * doing. + * + *

It is not enforcement, and it used to claim to be. Until this was rewritten its + * javadoc read "Core must not read {@code PROJ_DATA} or any other environment variable" while + * the body checked only that {@code describeResolution()} contains the strings + * {@code "environment variables: NONE READ"} and {@code "working directory: NEVER CONSULTED"} + * — which are literals at {@code ResourceResolvers.java:259-260}. It asserted two string + * constants against themselves, and adding a {@code System.getenv("PROJ_DATA")} to core would + * have left it green. + * + *

The two claims are now enforced where they can actually fail: + *

    + *
  • the environment-variable claim, and the "no network code" claim with it, by + * {@code org.locationtech.proj4j.resource.NoAmbientInputInCoreTest}, which scans + * {@code core/src/main} and the compiled classes and proves its own scanners can detect an + * injected violation;
  • + *
  • the working-directory claim by {@link #workingDirectoryIsNeverConsulted()} in this class, + * which was always behavioural — it writes a real decoy grid into {@code user.dir} and + * asserts it is ignored. That is the model the other two now follow.
  • + *
+ * + *

{@link ResourceResolvers#isNetworkEnabled()} below is the one assertion here that is not + * about the text: it interrogates the assembled chain, so a network-backed resolver appearing + * on the classpath would flip it. + */ + @Test + public void describeResolutionStatesTheAmbientInputPosition() { + String description = ResourceResolvers.describeResolution(); + assertTrue("describeResolution() must state that no environment variables are read: " + + description, description.contains("environment variables: NONE READ")); + assertTrue("describeResolution() must state that the CWD is never consulted: " + description, + description.contains("working directory: NEVER CONSULTED")); + assertTrue("describeResolution() must state the network position: " + description, + description.contains("network: ABSENT")); + assertFalse("core ships no network code, so nothing can be network-enabled", + ResourceResolvers.isNetworkEnabled()); + } + + // --- ordering ----------------------------------------------------------------------------- + + @Test + public void builtInsAreGridPackFirstThenTheLegacyPrefix() { + List built = ResourceResolvers.builtInResolvers(); + assertEquals(2, built.size()); + assertTrue(built.get(0).name().contains("proj4j-data/grids")); + assertTrue(built.get(1).name().contains("proj4/nad")); + assertTrue("the grid pack resolver must sort before the legacy one", + built.get(0).priority() < built.get(1).priority()); + } + + @Test + public void explicitResolversRunBeforeEverythingElseInCallOrder() { + ResourceResolvers.addResolver(new NamedNullResolver("first", 900)); + ResourceResolvers.addResolver(new NamedNullResolver("second", 1)); + ChainedResourceResolver chain = ResourceResolvers.resolver(); + List delegates = chain.delegates(); + assertTrue("explicit resolvers keep call order regardless of priority", + delegates.get(0).name().contains("first")); + assertTrue(delegates.get(1).name().contains("second")); + } + + /** + * {@code ServiceLoader} iteration order follows classpath order, which differs between an IDE, a + * shaded jar and a Spark executor with {@code --jars}. Sorting by {@code (priority, name)} is what + * makes discovery order irrelevant. The comparator is asserted directly here because there is no + * portable way to reorder a real classpath inside a unit test. + */ + @Test + public void serviceLoaderOrderingIsTotalAndIndependentOfDiscoveryOrder() { + List a = new ArrayList(); + a.add(new NamedNullResolver("zeta", 10)); + a.add(new NamedNullResolver("alpha", 10)); + a.add(new NamedNullResolver("beta", 5)); + + List b = new ArrayList(a); + Collections.reverse(b); + + assertEquals("two different discovery orders must sort identically", + names(sortLikeTheChain(a)), names(sortLikeTheChain(b))); + assertEquals("[beta, alpha, zeta]", names(sortLikeTheChain(a)).toString()); + } + + /** Whatever ServiceLoader providers exist on the test classpath, the discovered list is sorted. */ + @Test + public void discoveredResolversComeBackSorted() { + List discovered = ResourceResolvers.serviceLoaderResolvers(); + for (int i = 1; i < discovered.size(); i++) { + ResourceResolver prev = discovered.get(i - 1); + ResourceResolver cur = discovered.get(i); + assertTrue("discovered resolvers must be sorted by (priority, name)", + prev.priority() < cur.priority() + || (prev.priority() == cur.priority() + && prev.name().compareTo(cur.name()) < 0)); + } + } + + // --- a directory resolver, and its escape check ------------------------------------------- + + @Test + public void aDirectoryResolverResolvesAndRefusesToEscapeItsRoot() throws IOException { + Path root = Files.createTempDirectory("proj4j-grid-root"); + Path outside = Files.createTempDirectory("proj4j-grid-outside"); + try { + Files.write(root.resolve("synthetic"), syntheticCtable2()); + Files.write(outside.resolve("secret"), syntheticCtable2()); + + DirectoryResourceResolver r = new DirectoryResourceResolver(root); + assertNotNull("a file in the root resolves", r.resolve("synthetic")); + assertNull("a traversal out of the root does not", r.resolve("../" + + outside.getFileName() + "/secret")); + assertTrue("a directory resolver is enumerable", r.isEnumerable()); + assertTrue(r.listAvailable().contains("synthetic")); + } finally { + deleteRecursively(root); + deleteRecursively(outside); + } + } + + @Test + public void anAddedDirectoryResolverOutranksTheBuiltInClasspathPack() throws IOException { + Path root = Files.createTempDirectory("proj4j-grid-override"); + try { + Files.write(root.resolve("conus"), Files.readAllBytes(conusOnClasspath())); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + GridCache.instance().clear(); + + List list = new ArrayList(); + Grid.mergeGridFile("conus", list); + assertTrue("the explicitly added directory must win, got " + list.get(0).getOrigin(), + list.get(0).getOrigin().startsWith("file:")); + } finally { + deleteRecursively(root); + } + } + + // --- the classpath pack is enumerable via its generated INDEX ----------------------------- + + @Test + public void theGridPackIsEnumerableThroughItsIndex() { + ClasspathResourceResolver r = new ClasspathResourceResolver( + GridResolutionTest.class.getClassLoader(), + ResourceResolvers.GRID_PREFIX, ResourceResolvers.GRID_INDEX); + assertTrue("an indexed classpath resolver reports itself enumerable", r.isEnumerable()); + assertTrue("the test grid pack index lists conus: " + r.listAvailable(), + r.listAvailable().contains("conus")); + } + + @Test + public void aClasspathResolverWithoutAnIndexSaysItCannotEnumerate() { + ClasspathResourceResolver r = new ClasspathResourceResolver( + GridResolutionTest.class.getClassLoader(), ResourceResolvers.LEGACY_GRID_PREFIX); + assertFalse("no index means not enumerable", r.isEnumerable()); + assertTrue("and an empty list, which must not be read as 'nothing installed'", + r.listAvailable().isEmpty()); + // ... yet the grid is still resolvable and still reported by name. + assertNotNull(safeResolve(r, "ntv1_can.dat")); + } + + // --- PROJ's @-optional wart, made visible ------------------------------------------------- + + /** + * PROJ's {@code @} prefix means optional, and silently skipping a missing optional grid is + * correct PROJ behaviour ({@code grids.cpp}, {@code getListOfGridSets}: any failure on an + * {@code @}-prefixed grid clears the errno and continues). That is reproduced, not "fixed" — but it + * is now visible: {@link Grid#describeNadGrids} reports every token, whether it resolved, + * from where, and if not, why not. + */ + @Test + public void anOptionalMissingGridIsSkippedSilentlyButReportedByIntrospection() throws IOException { + List grids = Grid.fromNadGrids("@definitely_not_a_grid,conus"); + assertEquals("the missing optional grid is skipped, exactly as PROJ does", 1, grids.size()); + assertEquals("conus", grids.get(0).getGridName()); + + List refs = Grid.describeNadGrids("@definitely_not_a_grid,conus"); + assertEquals("both tokens are reported", 2, refs.size()); + + Grid.GridRef missing = refs.get(0); + assertEquals("definitely_not_a_grid", missing.name()); + assertTrue(missing.isOptional()); + assertFalse(missing.isAvailable()); + assertNotNull("a skipped grid must carry a reason", missing.skipReason()); + assertTrue(missing.skipReason().contains("Unknown grid")); + + Grid.GridRef present = refs.get(1); + assertEquals("conus", present.name()); + assertFalse(present.isOptional()); + assertTrue(present.isAvailable()); + assertEquals("ctable2", present.grid().getFormat()); + assertTrue("provenance names the resolver that answered: " + present.grid().getResolverName(), + present.grid().getResolverName().contains("proj4j-data/grids")); + } + + /** A required (unprefixed) missing grid must throw, not be skipped. */ + @Test + public void aRequiredMissingGridThrows() { + try { + Grid.fromNadGrids("definitely_not_a_grid,conus"); + fail("a required missing grid must not be skipped"); + } catch (IOException expected) { + assertTrue(expected.getMessage().contains("Unknown grid")); + } + } + + /** All four of NAD27's declared grids, as {@code Datum} asks for them. */ + @Test + public void nad27sFourDeclaredGridsAreReportedIndividually() { + List refs = Grid.describeNadGrids("@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat"); + assertEquals(4, refs.size()); + for (Grid.GridRef ref : refs) { + assertTrue("every token is @-optional, so every failure is silent", ref.isOptional()); + } + assertEquals("conus", refs.get(0).name()); + assertTrue("conus is now reachable", refs.get(0).isAvailable()); + assertTrue("ntv1_can.dat ships in proj4j-epsg", refs.get(3).isAvailable()); + assertEquals("ntv1", refs.get(3).grid().getFormat()); + } + + /** An unrecognised file must be an error, not a silently no-op grid. */ + @Test + public void anUnrecognisedFileIsAnErrorRatherThanANoOpGrid() throws IOException { + Path root = Files.createTempDirectory("proj4j-bad-grid"); + try { + Files.write(root.resolve("notagrid"), "this is not a grid file at all".getBytes("US-ASCII")); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + GridCache.instance().clear(); + try { + Grid.fromNadGrids("notagrid"); + fail("an unrecognised file must throw rather than yield a format=\"missing\" grid"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("Unrecognised horizontal grid format")); + } + } finally { + deleteRecursively(root); + } + } + + /** {@code null} stays a legal grid that shifts nothing, as in PROJ. */ + @Test + public void theNullGridStillWorks() throws IOException { + List grids = Grid.fromNadGrids("null"); + assertEquals(1, grids.size()); + double[] got = GridReferenceValues.shiftDegrees(grids, false, -122.4, 37.8); + assertEquals(-122.4, got[0], 1e-12); + assertEquals(37.8, got[1], 1e-12); + } + + // --- helpers ------------------------------------------------------------------------------ + + private static ResourceHandle safeResolve(ResourceResolver r, String name) { + try { + return r.resolve(name); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + private static Path conusOnClasspath() { + try { + return Paths.get(GridResolutionTest.class.getResource( + "/" + ResourceResolvers.GRID_PREFIX + "/conus").toURI()); + } catch (Exception e) { + throw new AssertionError("the test grid pack must be on the test classpath", e); + } + } + + private static List sortLikeTheChain(List in) { + List copy = new ArrayList(in); + Collections.sort(copy, new java.util.Comparator() { + @Override + public int compare(ResourceResolver a, ResourceResolver b) { + int p = Integer.compare(a.priority(), b.priority()); + return p != 0 ? p : a.name().compareTo(b.name()); + } + }); + return copy; + } + + private static List names(List rs) { + List out = new ArrayList(); + for (ResourceResolver r : rs) { + out.add(r.name()); + } + return out; + } + + /** A minimal but structurally valid CTABLE V2 grid: 3x3 nodes, all shifts zero. */ + static byte[] syntheticCtable2() { + int cols = 3; + int rows = 3; + byte[] b = new byte[160 + cols * rows * 8]; + byte[] magic = "CTABLE V2.0 ".getBytes(java.nio.charset.Charset.forName("US-ASCII")); + System.arraycopy(magic, 0, b, 0, magic.length); + byte[] id = "synthetic\n".getBytes(java.nio.charset.Charset.forName("US-ASCII")); + System.arraycopy(id, 0, b, 16, id.length); + java.nio.ByteBuffer buf = java.nio.ByteBuffer.wrap(b).order(java.nio.ByteOrder.LITTLE_ENDIAN); + buf.putDouble(96, Math.toRadians(-10.0)); // ll.lam + buf.putDouble(104, Math.toRadians(-10.0)); // ll.phi + buf.putDouble(112, Math.toRadians(1.0)); // del.lam + buf.putDouble(120, Math.toRadians(1.0)); // del.phi + buf.putInt(128, cols); + buf.putInt(132, rows); + return b; + } + + private static void deleteRecursively(Path root) throws IOException { + if (!Files.exists(root)) { + return; + } + java.nio.file.DirectoryStream stream = Files.newDirectoryStream(root); + try { + for (Path p : stream) { + if (Files.isDirectory(p)) { + deleteRecursively(p); + } else { + Files.deleteIfExists(p); + } + } + } finally { + stream.close(); + } + Files.deleteIfExists(root); + } + + /** A resolver that never resolves anything; used only to observe chain ordering. */ + private static final class NamedNullResolver implements ResourceResolver { + private final String name; + private final int priority; + + NamedNullResolver(String name, int priority) { + this.name = name; + this.priority = priority; + } + + @Override + public String name() { + return name; + } + + @Override + public int priority() { + return priority; + } + + @Override + public ResourceHandle resolve(String resourceName) { + return null; + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/GridShiftConcurrencyTest.java b/core/src/test/java/org/locationtech/proj4j/grids/GridShiftConcurrencyTest.java new file mode 100644 index 0000000..8b5a620 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/GridShiftConcurrencyTest.java @@ -0,0 +1,312 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CyclicBarrier; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.datum.VerticalGrid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Grid-bearing fixtures for the bitwise-identity concurrency regime. + * + *

{@code org.locationtech.proj4j.concurrent.SharedTransformConcurrencyTest} proves that one + * {@code CoordinateTransform} can be shared across threads, asserting on + * {@code Double.doubleToRawLongBits} rather than with a tolerance — because a projection keeping + * per-call scratch state in instance fields produces finite, plausible coordinates when two + * threads interleave, and a tolerance-based assertion passes straight through such a torn value. That + * fixture list contains no grid-shift transform, so the grid path was outside its + * reach. This class adds the missing fixtures in the same shape and with the same assertion, plus the + * two grid-specific hazards it does not cover: + * + *

    + *
  • the shared parsed grid handed out by {@link GridCache} — deeply immutable after construction, so + * many threads reading one instance must be indistinguishable from each thread owning a copy;
  • + *
  • the inverse grid shift, whose iterative solver is the only data-dependent loop on the + * grid path and therefore the only place a shared mutable iterate could hide.
  • + *
+ * + *

Grid shifts are also the strongest possible test of the bitwise claim, because the interpolation + * reads {@code float} node values into {@code double} arithmetic: any torn read shows up in the low + * bits, and only a raw-bits comparison can see it. + */ +public class GridShiftConcurrencyTest { + + private static final int ITERATIONS = 300; + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + /** A grid fixture: a shared grid list, a direction, points, and the single-threaded answer's bits. */ + private static final class GridFixture { + final String name; + final List grids; + final boolean inverse; + final double[][] points; + final long[][] expected; + + GridFixture(String name, List grids, boolean inverse, double[][] points) { + this.name = name; + this.grids = grids; + this.inverse = inverse; + this.points = points; + this.expected = new long[points.length][2]; + for (int i = 0; i < points.length; i++) { + double[] out = GridReferenceValues.shiftDegrees(grids, inverse, points[i][0], points[i][1]); + expected[i][0] = Double.doubleToRawLongBits(out[0]); + expected[i][1] = Double.doubleToRawLongBits(out[1]); + assertTrue(name + " fixture must produce a finite longitude at point " + i, + Double.isFinite(out[0])); + } + } + } + + private static double[][] conusPoints() { + return new double[][]{ + GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.KANSAS, + GridReferenceValues.CHICAGO, + GridReferenceValues.BOSTON, + {-104.99, 39.74}, // Denver + {-95.37, 29.76}, // Houston + }; + } + + private static double[][] canadaPoints() { + return new double[][]{ + GridReferenceValues.NTV2_ONWINSOR, + GridReferenceValues.NTV2_ALRAYMND, + GridReferenceValues.NTV2_ALBANFF, + GridReferenceValues.NTV2_CAWEST, + }; + } + + private static List gridFixtures() throws IOException { + List f = new ArrayList(); + f.add(new GridFixture("conus forward", GridReferenceValues.singleton("conus"), false, + conusPoints())); + f.add(new GridFixture("conus inverse", GridReferenceValues.singleton("conus"), true, + conusPoints())); + f.add(new GridFixture("ntv1_can.dat forward", + GridReferenceValues.singleton("ntv1_can.dat"), false, + new double[][]{GridReferenceValues.CHICAGO, GridReferenceValues.BOSTON, + {-113.5, 53.5}, {-79.4, 43.7}})); + f.add(new GridFixture("ntv2 multi-subgrid forward", + GridReferenceValues.singleton("ntv2_0_downsampled.gsb"), false, canadaPoints())); + f.add(new GridFixture("ntv2 multi-subgrid inverse", + GridReferenceValues.singleton("ntv2_0_downsampled.gsb"), true, canadaPoints())); + // The @-optional list, so the skip path is exercised concurrently too. + f.add(new GridFixture("@missing,conus forward", + Grid.fromNadGrids("@definitely_not_a_grid,conus"), false, conusPoints())); + return Collections.unmodifiableList(f); + } + + @Test(timeout = 180_000) + public void sharedGridsGiveBitwiseIdenticalResultsAcrossManyThreads() throws Exception { + final List fixtures = gridFixtures(); + final int threadCount = Math.max(36, Runtime.getRuntime().availableProcessors() * 2); + final CyclicBarrier start = new CyclicBarrier(threadCount); + final List problems = new CopyOnWriteArrayList(); + + List threads = new ArrayList(threadCount); + for (int t = 0; t < threadCount; t++) { + final int threadIndex = t; + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + start.await(); + for (int iter = 0; iter < ITERATIONS && problems.isEmpty(); iter++) { + for (GridFixture f : fixtures) { + for (int k = 0; k < f.points.length; k++) { + // Stagger per thread so threads are never in lock-step. + int i = (k + threadIndex) % f.points.length; + double[] out = GridReferenceValues.shiftDegrees( + f.grids, f.inverse, f.points[i][0], f.points[i][1]); + if (Double.doubleToRawLongBits(out[0]) != f.expected[i][0] + || Double.doubleToRawLongBits(out[1]) != f.expected[i][1]) { + problems.add(f.name + " point " + i + " thread " + threadIndex + + " iteration " + iter + ": expected (" + + Double.longBitsToDouble(f.expected[i][0]) + ", " + + Double.longBitsToDouble(f.expected[i][1]) + + ") but got (" + out[0] + ", " + out[1] + ")"); + return; + } + } + } + } + } catch (Throwable e) { + problems.add("thread " + threadIndex + " threw " + e); + } + } + }, "grid-shift-" + t); + thread.setDaemon(true); + threads.add(thread); + } + for (Thread thread : threads) { + thread.start(); + } + for (Thread thread : threads) { + thread.join(); + } + if (!problems.isEmpty()) { + fail(problems.size() + " concurrency problem(s) sharing grids across " + threadCount + + " threads:\n " + problems.get(0)); + } + } + + /** + * The same claim one level up: a single {@code CoordinateTransform} whose source datum carries a + * grid, shared across threads. This is the shape a Spark job actually uses — one cached transform, + * every executor thread calling it. + */ + @Test(timeout = 180_000) + public void oneSharedGridShiftTransformIsThreadSafe() throws Exception { + CoordinateReferenceSystem src = CRS_FACTORY.createFromParameters("nad27+conus", + "+proj=longlat +ellps=clrk66 +nadgrids=conus +no_defs"); + CoordinateReferenceSystem tgt = CRS_FACTORY.createFromParameters("nad83", + "+proj=longlat +datum=NAD83 +no_defs"); + final CoordinateTransform transform = CT_FACTORY.createTransform(src, tgt); + + final double[][] points = conusPoints(); + final long[][] expected = new long[points.length][2]; + ProjCoordinate scratch = new ProjCoordinate(); + for (int i = 0; i < points.length; i++) { + transform.transform(new ProjCoordinate(points[i][0], points[i][1]), scratch); + expected[i][0] = Double.doubleToRawLongBits(scratch.x); + expected[i][1] = Double.doubleToRawLongBits(scratch.y); + } + + final int threadCount = Math.max(36, Runtime.getRuntime().availableProcessors() * 2); + final CyclicBarrier start = new CyclicBarrier(threadCount); + final List problems = new CopyOnWriteArrayList(); + List threads = new ArrayList(threadCount); + for (int t = 0; t < threadCount; t++) { + final int threadIndex = t; + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + ProjCoordinate in = new ProjCoordinate(); + ProjCoordinate out = new ProjCoordinate(); + try { + start.await(); + for (int iter = 0; iter < ITERATIONS && problems.isEmpty(); iter++) { + for (int k = 0; k < points.length; k++) { + int i = (k + threadIndex) % points.length; + in.setValue(points[i][0], points[i][1]); + transform.transform(in, out); + if (Double.doubleToRawLongBits(out.x) != expected[i][0] + || Double.doubleToRawLongBits(out.y) != expected[i][1]) { + problems.add("point " + i + " thread " + threadIndex + + " iteration " + iter + ": expected (" + + Double.longBitsToDouble(expected[i][0]) + ", " + + Double.longBitsToDouble(expected[i][1]) + ") but got (" + + out.x + ", " + out.y + ")"); + return; + } + } + } + } catch (Throwable e) { + problems.add("thread " + threadIndex + " threw " + e); + } + } + }, "shared-gridshift-transform-" + t); + thread.setDaemon(true); + threads.add(thread); + } + for (Thread thread : threads) { + thread.start(); + } + for (Thread thread : threads) { + thread.join(); + } + if (!problems.isEmpty()) { + fail(problems.size() + " concurrency problem(s) sharing one grid-shift transform across " + + threadCount + " threads:\n " + problems.get(0)); + } + } + + /** The vertical grid path, same regime. */ + @Test(timeout = 120_000) + public void sharedVerticalGridIsThreadSafe() throws Exception { + GridCache.vertical().clear(); + final long missesBefore = GridCache.vertical().missCount(); + final VerticalGrid grid = VerticalGrid.fromName("egm96_15_downsampled.gtx"); + final double[][] points = GridReferenceValues.GTX_POINTS; + final long[] expected = new long[points.length]; + for (int i = 0; i < points.length; i++) { + expected[i] = Double.doubleToRawLongBits( + grid.valueAt(Math.toRadians(points[i][0]), Math.toRadians(points[i][1]))); + } + + final int threadCount = Math.max(36, Runtime.getRuntime().availableProcessors() * 2); + final CyclicBarrier start = new CyclicBarrier(threadCount); + final List problems = new CopyOnWriteArrayList(); + List threads = new ArrayList(threadCount); + for (int t = 0; t < threadCount; t++) { + final int threadIndex = t; + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + start.await(); + for (int iter = 0; iter < ITERATIONS && problems.isEmpty(); iter++) { + for (int k = 0; k < points.length; k++) { + int i = (k + threadIndex) % points.length; + double v = grid.valueAt(Math.toRadians(points[i][0]), + Math.toRadians(points[i][1])); + if (Double.doubleToRawLongBits(v) != expected[i]) { + problems.add("vertical point " + i + " thread " + threadIndex + + ": expected " + Double.longBitsToDouble(expected[i]) + + " but got " + v); + return; + } + } + } + } catch (Throwable e) { + problems.add("thread " + threadIndex + " threw " + e); + } + } + }, "shared-vgrid-" + t); + thread.setDaemon(true); + threads.add(thread); + } + for (Thread thread : threads) { + thread.start(); + } + for (Thread thread : threads) { + thread.join(); + } + assertTrue(problems.toString(), problems.isEmpty()); + assertEquals("one parse", 1L, GridCache.vertical().missCount() - missesBefore); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/GtxVerticalGridTest.java b/core/src/test/java/org/locationtech/proj4j/grids/GtxVerticalGridTest.java new file mode 100644 index 0000000..e6d3e1c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/GtxVerticalGridTest.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; + +import org.junit.Test; +import org.locationtech.proj4j.datum.VerticalGrid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The GTX reader, against PROJ 9.8.1's {@code cct +proj=vgridshift} reading the same file. + * + *

GTX is what {@code +geoidgrids=} needs and it is the simplest format PROJ supports: a 40-byte + * big-endian header then {@code rows * columns} big-endian {@code float}s, south to north and west to + * east. It has no magic bytes at all, which is why PROJ dispatches on the + * {@code .gtx}/{@code .GTX} filename suffix, and why this reader does the same rather than guessing. + * + *

The fixture is PROJ's own {@code data/tests/egm96_15_downsampled.gtx}: 180 × 360 nodes over + * the whole world, so the wrap-around and edge-clamping branches of the interpolation are reachable. + */ +public class GtxVerticalGridTest { + + private static VerticalGrid egm96() throws IOException { + return VerticalGrid.fromName("egm96_15_downsampled.gtx"); + } + + @Test + public void headerIsParsedAsPro981ParsesIt() throws IOException { + VerticalGrid g = egm96(); + assertEquals("gtx", g.getFormat()); + assertEquals(360, g.getWidth()); + assertEquals(180, g.getHeight()); + + double[] extent = g.extentRadians(); + assertEquals("west", -179.625, Math.toDegrees(extent[0]), 1e-9); + assertEquals("south", -89.62430555555557, Math.toDegrees(extent[1]), 1e-9); + + double[] res = g.resolutionRadians(); + assertEquals("xstep", 1.0, Math.toDegrees(res[0]), 1e-12); + assertEquals("ystep", 1.0013888888888889, Math.toDegrees(res[1]), 1e-12); + } + + @Test + public void firstNodeMatchesTheRawFile() throws IOException { + // Big-endian float at byte 40 of the fixture. + assertEquals(-30.167558670043945f, egm96().nodeAt(0, 0), 0.0f); + } + + @Test + public void interpolatedValuesMatchProj981() throws IOException { + VerticalGrid g = egm96(); + for (int i = 0; i < GridReferenceValues.GTX_POINTS.length; i++) { + double lon = GridReferenceValues.GTX_POINTS[i][0]; + double lat = GridReferenceValues.GTX_POINTS[i][1]; + double got = g.valueAt(Math.toRadians(lon), Math.toRadians(lat)); + assertEquals("geoid undulation at " + lon + ", " + lat, + GridReferenceValues.GTX_EXPECTED[i], got, GridReferenceValues.GTX_TOL); + } + } + + @Test + public void theMultiplierScalesTheResult() throws IOException { + VerticalGrid g = egm96(); + double one = g.valueAt(0.0, 0.0, 1.0); + double half = g.valueAt(0.0, 0.0, 0.5); + assertEquals(one * 0.5, half, 1e-12); + } + + /** + * The extent test and the interpolation are two separate gates in PROJ, and this reader keeps them + * separate for the same reason. + * + *

PROJ's {@code VerticalShiftGridSet::gridAt} performs the extent test and only then calls + * {@code read_vgrid_value}, which itself clamps the upper index at the last row rather than + * refusing. So {@code covers()} is the gate a caller must consult; {@code valueAt} on its own will + * happily extrapolate the top half-cell, exactly as PROJ does. Asserting otherwise would be a + * divergence from upstream dressed up as strictness. + */ + @Test + public void coversIsTheExtentGateAndValueAtClampsAtTheEdgeLikeProj() throws IOException { + VerticalGrid g = egm96(); + assertTrue("(0,0) is inside", g.covers(0.0, 0.0)); + + double[] extent = g.extentRadians(); + double justBeyondNorth = Math.toDegrees(extent[3]) + 0.2; + assertFalse("beyond the last row centre, covers() says no", + g.covers(0.0, Math.toRadians(justBeyondNorth))); + + assertTrue("NaN input is rejected outright", + Double.isNaN(g.valueAt(Double.NaN, 0.0))); + } + + /** A regional grid does have points that fall outside the index range entirely. */ + @Test + public void aPointOutsideTheIndexRangeYieldsNoValue() throws IOException { + VerticalGrid g = egm96(); + // Far south of the first row: grid_y is negative, so there is no cell at all. + double belowSouth = Math.toDegrees(g.extentRadians()[1]) - 5.0; + assertTrue("well south of the grid there is nothing to interpolate from", + Double.isNaN(g.valueAt(0.0, Math.toRadians(belowSouth)))); + } + + @Test + public void geoidGridsHonoursTheOptionalPrefix() throws IOException { + assertEquals("a missing optional vertical grid is skipped, like PROJ", + 1, VerticalGrid.fromGeoidGrids("@nope.gtx,egm96_15_downsampled.gtx").size()); + try { + VerticalGrid.fromGeoidGrids("nope.gtx"); + fail("a required missing vertical grid must throw"); + } catch (IOException expected) { + assertTrue(expected.getMessage().contains("Unknown vertical grid")); + } + } + + /** + * The suffix rule is a rule, not a heuristic: a horizontal grid handed to the vertical reader is + * rejected with a message that says why, rather than being interpreted as 40 bytes of header plus + * noise. + * + *

The vertical reader now has two dispatch arms, matching + * {@code VerticalShiftGridSet::open} ({@code 9.8.1:src/grids.cpp:1613-1671}): the + * {@code .gtx}/{@code .GTX} filename suffix, because GTX has no magic bytes, and then the TIFF + * signature. {@code conus} is CTABLE V2, so it matches neither and is refused — which is the + * invariant this test is about. The message wording changed when the GeoTIFF arm landed; the + * behaviour did not. + */ + @Test + public void aNonGtxNameIsRejectedRatherThanGuessedAt() { + try { + VerticalGrid.fromName("conus"); + fail("conus is CTABLE V2: neither GTX nor GeoTIFF"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("Unrecognised vertical grid format")); + assertTrue("the message must name what it does read: " + expected.getMessage(), + expected.getMessage().contains("GTX") + && expected.getMessage().contains("GeoTIFF")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/InverseGridShiftConvergenceTest.java b/core/src/test/java/org/locationtech/proj4j/grids/InverseGridShiftConvergenceTest.java new file mode 100644 index 0000000..b034d34 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/InverseGridShiftConvergenceTest.java @@ -0,0 +1,212 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.ConvergenceFailureException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The inverse grid shift's iterative solver: fail closed, and use PROJ's convergence test. + * + *

Two defects, one fixture

+ * + *

{@code Grid.nad_cvt}'s inverse branch is the only data-dependent loop on the grid path. In 1.4.3 it + * ended with: + *

+ *   } while (i-- > 0 && Math.abs(dif.lam) > TOL && Math.abs(dif.phi) > TOL);
+ *   if (i < 0) { t.lam = t.phi = Double.NaN; return t; }
+ * 
+ * + *
    + *
  1. The convergence test was an {@code &&} over the two components separately, + * so the loop stopped as soon as either ordinate's residual fell inside tolerance — with + * the other one still arbitrarily far out. PROJ 9.8.1 tests the squared 2-norm, + * {@code dif.lam * dif.lam + dif.phi * dif.phi > toltol} ({@code src/grids.cpp}, + * {@code pj_hgrid_apply_internal}), which requires both.
  2. + *
  3. Exhausting the iterations produced {@code NaN}, which {@code Grid.shift} then + * could not distinguish from "no table covered this point" and turned into the input + * coordinate, unchanged. A numerical failure delivered as a plausible answer — the exact shape + * this project forbids.
  4. + *
+ * + *

Both are now closed: the residual test is PROJ's, and a non-convergent iteration throws + * {@link ConvergenceFailureException} with {@link ErrorCause#NUMERICAL_FAILURE}. + * + *

The fixture, and why it is built rather than found

+ * + *

Real published grids are smooth: their shift gradient is far below one cell per cell, so the + * fixed-point iteration is a strong contraction and converges in two or three passes. Non-convergence is + * therefore unreachable with {@code conus} or {@code ntv1_can.dat}, and a test that only used real data + * would be asserting nothing. + * + *

This fixture is a valid 21×21 CTABLE V2 grid whose longitude shift is a triangle wave of period + * two cells and amplitude exactly one cell: node values alternate {@code +1°, -1°} along each row, + * so the interpolated gradient is ±2 cells per cell. The fixed-point map is then an expansion + * (|derivative| = 2 > 1) and cannot converge, while the amplitude bound keeps every iterate inside the + * grid, so it is genuine non-convergence rather than the grid-edge case PROJ deliberately tolerates. + * + *

The latitude shift is identically zero, which makes the fixture diagnose defect (1) as sharply as + * defect (2): {@code dif.phi} is exactly {@code 0.0} on the first pass, so the old {@code &&} test + * declared success immediately and returned the first iterate — with the longitude residual still + * 0.4 of a cell, i.e. about 44 km at this spacing. + */ +public class InverseGridShiftConvergenceTest { + + private static final Charset ASCII = Charset.forName("US-ASCII"); + + private static final int COLS = 21; + private static final int ROWS = 21; + private static final double DEG = Math.PI / 180.0; + + private Path root; + + @After + public void cleanUp() throws IOException { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + if (root != null) { + Files.deleteIfExists(root.resolve("sawtooth")); + Files.deleteIfExists(root); + root = null; + } + } + + private List sawtoothGrid() throws IOException { + root = Files.createTempDirectory("proj4j-sawtooth"); + Files.write(root.resolve("sawtooth"), sawtoothCtable2()); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + GridCache.instance().clear(); + return GridReferenceValues.singleton("sawtooth"); + } + + @Test + public void theFixtureIsAValidCtable2GridCoveringTheTestPoints() throws IOException { + List grids = sawtoothGrid(); + assertEquals(1, grids.size()); + assertEquals("ctable2", grids.get(0).getFormat()); + double[] extent = grids.get(0).extentRadians(); + assertEquals(-10.0, Math.toDegrees(extent[0]), 1e-9); + assertEquals(-10.0, Math.toDegrees(extent[1]), 1e-9); + assertEquals(10.0, Math.toDegrees(extent[2]), 1e-9); + assertEquals(10.0, Math.toDegrees(extent[3]), 1e-9); + } + + /** The forward direction is a single interpolation and always succeeds. */ + @Test + public void theForwardShiftStillWorksOnTheSameGrid() throws IOException { + List grids = sawtoothGrid(); + double[] got = GridReferenceValues.shiftDegrees(grids, false, 0.3, 0.0); + assertTrue("the forward shift is a single interpolation and must produce a finite result", + Double.isFinite(got[0]) && Double.isFinite(got[1])); + assertTrue("and it must actually move the point", Math.abs(got[0] - 0.3) > 0.1); + } + + @Test + public void aNonConvergentInverseIterationThrowsRatherThanReturningAnIterate() throws IOException { + List grids = sawtoothGrid(); + try { + double[] got = GridReferenceValues.shiftDegrees(grids, true, 0.3, 0.0); + fail("the inverse iteration cannot converge on this grid, yet it returned (" + + got[0] + ", " + got[1] + ") -- a plausible coordinate standing in for a " + + "numerical failure"); + } catch (ConvergenceFailureException expected) { + assertEquals("a non-convergent iteration is a numerical failure", + ErrorCause.NUMERICAL_FAILURE, expected.cause()); + assertTrue("the message must name the iteration count and the residual: " + + expected.getMessage(), + expected.getMessage().contains("did not converge") + && expected.getMessage().contains("10 iterations")); + } + } + + /** A second point, to show it is the grid and not one unlucky coordinate. */ + @Test + public void theSameHappensAtAnotherInteriorPoint() throws IOException { + List grids = sawtoothGrid(); + try { + GridReferenceValues.shiftDegrees(grids, true, 0.7, 0.25); + fail("expected a ConvergenceFailureException"); + } catch (ConvergenceFailureException expected) { + assertTrue(expected.getMessage().contains("did not converge")); + } + } + + /** + * The control: the very same code path converges on a real grid, so the exception above is a property + * of the sawtooth field and not of a solver that has simply been made to throw. + * + *

(The sawtooth grid has no exactly-converging point to use as an internal control: the node values + * are stored as {@code float}, so even a nominal fixed point lands 1.4e-7 rad off and the expansive map + * amplifies that away from zero rather than towards it. Which is the correct behaviour — the fixture is + * expansive everywhere.)

+ */ + @Test + public void theSameSolverConvergesOnARealGrid() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + double[] got = GridReferenceValues.shiftDegrees(conus, true, + GridReferenceValues.SAN_FRANCISCO[0], GridReferenceValues.SAN_FRANCISCO[1]); + assertEquals("the real inverse converges and matches PROJ 9.8.1", + GridReferenceValues.CONUS_INV_SAN_FRANCISCO[0], got[0], GridReferenceValues.TOL_DEG); + assertTrue(Double.isFinite(got[1])); + } + + /** + * A 21×21 CTABLE V2 grid over 10°W–10°E, 10°S–10°N at 1° + * spacing. Longitude shift alternates {@code +1°, -1°} by column; latitude shift is zero. + */ + static byte[] sawtoothCtable2() { + byte[] b = new byte[160 + COLS * ROWS * 8]; + System.arraycopy("CTABLE V2.0 ".getBytes(ASCII), 0, b, 0, 16); + System.arraycopy("sawtooth (non-convergent by construction)\n".getBytes(ASCII), 0, b, 16, 42); + + ByteBuffer buf = ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN); + buf.putDouble(96, -10.0 * DEG); // ll.lam + buf.putDouble(104, -10.0 * DEG); // ll.phi + buf.putDouble(112, 1.0 * DEG); // del.lam + buf.putDouble(120, 1.0 * DEG); // del.phi + buf.putInt(128, COLS); + buf.putInt(132, ROWS); + + for (int row = 0; row < ROWS; row++) { + for (int col = 0; col < COLS; col++) { + int off = 160 + (row * COLS + col) * 8; + // Amplitude exactly one cell: bounded, so iterates stay inside the grid, while the + // interpolated gradient of +-2 cells per cell makes the fixed-point map an expansion. + buf.putFloat(off, (float) ((col % 2 == 0 ? 1.0 : -1.0) * DEG)); + buf.putFloat(off + 4, 0.0f); + } + } + return b; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/Nad27EdgeRoundTripTest.java b/core/src/test/java/org/locationtech/proj4j/grids/Nad27EdgeRoundTripTest.java new file mode 100644 index 0000000..67815f5 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/Nad27EdgeRoundTripTest.java @@ -0,0 +1,226 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The asymmetric round trip at 40°N, the southern edge of {@code ntv1_can.dat}. + * + *

The observation

+ * + *

A golden-master re-triage found 41 registry rows that round-tripped exactly in 1.4.3 and had + * become 30–110 m out. Every one probed latitude exactly 40.000000 — and + * {@code ntv1_can.dat}, the only NAD27 grid {@code proj4j-epsg} actually ships, has its southern + * boundary at exactly that latitude ({@code S LAT 40.0, N LAT 84.0, E LONG 44.0, W LONG 142.0}; see + * {@link Ntv1CanHeaderTest}). Re-measured on a frozen tree while this fix was written: 40 rows, + * every one at latitude 40.0 and none at any other latitude, displaced 12.6–93.1 m. + * + *

The mechanism

+ * + *
    + *
  1. The forward leg (WGS84 → a NAD27 CRS) finds 40.000000°N inside the grid, on + * its very edge, and applies the shift. The shifted point is a few tens of metres + * south of 40°N — outside.
  2. + *
  3. The return leg starts from that point. No grid contains it, so 1.4.3's {@code else} + * branch returned it unchanged and the shift silently did not happen.
  4. + *
  5. So the round trip came back displaced by exactly one grid shift. The tell is that the + * inverse residue equals the forward shift to two digits, which is what distinguishes "the + * inverse is not running" from "the inverse is not converging".
  6. + *
+ * + *

2,504 of the 2,545 NAD27 registry rows still round-tripped exactly, so this was a boundary + * effect and not a broken reader. + * + *

What "fixed" means here, and it is not "it round-trips now"

+ * + *

It cannot round-trip, and PROJ 9.8.1 does not round-trip it either. The return leg needs + * a grid value at a point outside the only grid there is; no amount of correctness produces one. + * The fix is that the failure is now reported instead of being expressed as a coordinate + * 93 m away. Measured on PROJ 9.8.1 reading the identical {@code ntv1_can.dat} bytes: + * + *

+ * PROJ_DATA=<dir with ntv1_can.dat only>
+ *
+ * # forward, WGS84 -> NAD27 / UTM 21N
+ * echo "-49.928932188 40.0" | cs2cs -f "%.6f" +proj=longlat +datum=WGS84 \
+ *                  +to +proj=utm +zone=21 +ellps=clrk66 +nadgrids=@ntv1_can.dat
+ *   1103774.042006	4451553.314930
+ *
+ * # the return leg
+ * echo "1103917.82 4429629.0" | cs2cs -f "%.9f" +proj=utm +zone=21 +ellps=clrk66 \
+ *                  +nadgrids=@ntv1_can.dat +to +proj=longlat +datum=WGS84
+ *   *	* inf
+ *
+ * # and the operator on its own, at the two points
+ * printf -- "-49.928932188 40.0 0 0\n"  | cct -d 10 -I +proj=hgridshift +grids=ntv1_can.dat
+ *   -49.9300222112   39.9999534467
+ * printf -- "-49.9300222 39.99998 0 0\n" | cct -d 10   +proj=hgridshift +grids=ntv1_can.dat
+ *   # Record 0 TRANSFORMATION ERROR (Coordinate to transform falls outside grid)
+ * 
+ * + *

{@code -49.9300222112} is, to ten decimals, the value the golden table records proj4j + * returning for {@code REG epsg:26721 probe 2}. + * + *

Why this class names its grid explicitly

+ * + *

{@code core}'s test classpath also carries {@code conus} (from {@code proj4j-grids-us-legacy}), + * whose extent is 131°W–63°W, 20°N–50°N — so through {@code +datum=NAD27} + * most of these probes are answered by {@code conus} and never reach {@code ntv1_can.dat} at all. + * The defect is a property of the ntv1-only configuration that {@code proj4j-epsg} ships, + * which is why every case here writes {@code +nadgrids=ntv1_can.dat} rather than relying on which + * optional grid packs happen to be present. + */ +public class Nad27EdgeRoundTripTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + /** The golden probe for {@code REG epsg:26721} probe 2, on the grid's southern edge. */ + private static final double LON = -49.928932188134520; + private static final double LAT = 40.0; + + /** {@code cct -d 10 -I +proj=hgridshift +grids=ntv1_can.dat} at the probe. */ + private static final double[] INVERSE_AT_EDGE = {-49.9300222112, 39.9999534467}; + + private static List ntv1() throws IOException { + return GridReferenceValues.singleton("ntv1_can.dat"); + } + + /** The premise: 40.0 is the southern edge, and the probe is inside — just. */ + @Test + public void theProbeIsOnTheSouthernEdgeAndInsideTheGrid() throws IOException { + List grids = ntv1(); + double[] extent = grids.get(0).extentRadians(); + assertEquals("south edge", 40.0, Math.toDegrees(extent[1]), 1e-9); + assertTrue("and the probe longitude is well inside the east-west span", + Math.toDegrees(extent[0]) < LON && LON < Math.toDegrees(extent[2])); + + double[] shifted = GridReferenceValues.shiftDegrees(grids, true, LON, LAT); + assertEquals("the inverse shift must agree with PROJ 9.8.1 on the same bytes", + INVERSE_AT_EDGE[0], shifted[0], GridReferenceValues.TOL_DEG); + assertEquals(INVERSE_AT_EDGE[1], shifted[1], GridReferenceValues.TOL_DEG); + assertTrue("and it must have moved the point SOUTH of the edge, which is the whole " + + "mechanism; it went to " + shifted[1], shifted[1] < 40.0); + } + + /** + * The return leg, at the operator level. PROJ reports + * {@code TRANSFORMATION ERROR (Coordinate to transform falls outside grid)}; 1.4.3 returned the + * point unchanged, which is what made the round trip come back one whole shift away. + */ + @Test + public void theReturnLegIsOutsideTheGridAndSaysSoInsteadOfEchoing() throws IOException { + List grids = ntv1(); + double[] shifted = GridReferenceValues.shiftDegrees(grids, true, LON, LAT); + try { + double[] back = GridReferenceValues.shiftDegrees(grids, false, shifted[0], shifted[1]); + double residue = Math.abs(back[0] - LON) * 111320.0 * Math.cos(Math.toRadians(LAT)); + fail("the return leg is outside the grid and PROJ refuses it, yet shift returned (" + + back[0] + ", " + back[1] + "), leaving the round trip " + residue + + " m from where it started"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + assertTrue(expected.getMessage().contains("outside every grid")); + assertTrue(expected.getMessage().contains("ntv1_can.dat")); + } + } + + /** + * The size of what was being returned silently. This is the assertion the golden re-triage + * would have written: had the fail-open survived, the round trip would have come back + * 30–110 m away, and the residue would equal the forward shift. + * + *

It is measured here from the shift itself rather than from the round trip, because + * the round trip now throws — the number is the same one, and it is the reason the throw is + * worth having. + */ + @Test + public void theSilentResidueWouldHaveBeenTensOfMetres() throws IOException { + List grids = ntv1(); + double[] shifted = GridReferenceValues.shiftDegrees(grids, true, LON, LAT); + double metres = Math.hypot( + (shifted[0] - LON) * 111320.0 * Math.cos(Math.toRadians(LAT)), + (shifted[1] - LAT) * 110540.0); + assertTrue("the un-run return shift is the whole error; measured " + metres + " m", + metres > 30.0 && metres < 110.0); + } + + /** + * The same thing through a CRS pair, which is the shape the golden table records: + * {@code REG epsg:26721 probe 2} is WGS84 lon/lat into NAD27 / UTM zone 21N, and its inverse. + * The forward still works and still agrees with PROJ; only the return leg refuses. + */ + @Test + public void theCrsRoundTripFailsClosedOnTheReturnLegAndNotOnTheForward() { + CoordinateReferenceSystem wgs84 = CRS_FACTORY.createFromParameters("wgs84", + "+proj=longlat +datum=WGS84 +no_defs"); + CoordinateReferenceSystem utm21 = CRS_FACTORY.createFromParameters("nad27-utm21+ntv1", + "+proj=utm +zone=21 +ellps=clrk66 +nadgrids=ntv1_can.dat +no_defs"); + + ProjCoordinate projected = new ProjCoordinate(); + CT_FACTORY.createTransform(wgs84, utm21).transform(new ProjCoordinate(LON, LAT), projected); + assertEquals("the forward leg still agrees with cs2cs 9.8.1 on the same bytes", + 1103774.042006, projected.x, 1e-3); + + CoordinateTransform back = CT_FACTORY.createTransform(utm21, wgs84); + try { + ProjCoordinate out = new ProjCoordinate(); + back.transform(projected, out); + fail("cs2cs 9.8.1 answers '* * inf' for this return leg; proj4j returned (" + + out.x + ", " + out.y + "), which is " + Math.abs(out.x - LON) * 111320.0 + + " m from the input"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } + + /** + * The control that keeps the three tests above from being about "40°N is broken": one + * degree further north the same CRS pair round-trips to well under a millimetre, because both + * legs stay inside the grid. + */ + @Test + public void oneDegreeFurtherNorthTheSameRoundTripIsExact() { + CoordinateReferenceSystem wgs84 = CRS_FACTORY.createFromParameters("wgs84", + "+proj=longlat +datum=WGS84 +no_defs"); + CoordinateReferenceSystem utm21 = CRS_FACTORY.createFromParameters("nad27-utm21+ntv1", + "+proj=utm +zone=21 +ellps=clrk66 +nadgrids=ntv1_can.dat +no_defs"); + + ProjCoordinate projected = new ProjCoordinate(); + ProjCoordinate out = new ProjCoordinate(); + CT_FACTORY.createTransform(wgs84, utm21).transform(new ProjCoordinate(LON, 41.0), projected); + CT_FACTORY.createTransform(utm21, wgs84).transform(projected, out); + + assertEquals("longitude round trip at 41N", LON, out.x, 1e-9); + assertEquals("latitude round trip at 41N", 41.0, out.y, 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/Nad27ToNad83ConusTest.java b/core/src/test/java/org/locationtech/proj4j/grids/Nad27ToNad83ConusTest.java new file mode 100644 index 0000000..2712af8 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/Nad27ToNad83ConusTest.java @@ -0,0 +1,310 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The headline defect: NAD27 → NAD83 in the conterminous United States. + * + *

Downstream, {@code EPSG:4267 -> EPSG:4269} returned the input coordinate unchanged, giving + * 95.573 m of error at San Francisco and 23.091 m in Kansas — finite, plausible, and unflagged. It was + * diagnosed as missing data. That diagnosis was half right, and both halves are now + * closed. There are two independent + * halves: + * + *

    + *
  1. Data. {@code proj4j-epsg} shipped only {@code ntv1_can.dat}, whose footprint is + * Canada (see {@link Ntv1CanHeaderTest}), so no grid covered San Francisco or Kansas at all. Cost + * to fix: 264,424 bytes. PROJ ships {@code data/tests/conus} in-tree, it is + * CTABLE V2, and {@code datum/CTABLEV2.java} already reads that format — zero new parsing code. + * This half is fixed and is what this class asserts.
  2. + *
  3. Code. {@code parser/Proj4Parser.java:53} calls {@code setGrids(null)} on the + * static {@code Datum.NAD27} singleton, destroying JVM-wide whatever grids it did have. + * this has since been fixed by + * the parser workstream. {@link #nad27SingletonSurvivesParsingAnEpsgCode()} is the joint that + * fails if either half regresses.
  4. + *
+ * + *

All expected values come from PROJ 9.8.1 reading the identical {@code conus} bytes; see + * {@link GridReferenceValues} for the exact commands. + */ +public class Nad27ToNad83ConusTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + private static List conus() throws IOException { + return GridReferenceValues.singleton("conus"); + } + + // --- The data half, at full precision, directly on Grid.shift ---------------------------- + + @Test + public void conusIsResolvableAndIsCtable2() throws IOException { + List grids = conus(); + assertEquals(1, grids.size()); + Grid g = grids.get(0); + assertEquals("ctable2", g.getFormat()); + assertTrue("origin should name where the bytes came from, got " + g.getOrigin(), + g.getOrigin().contains("conus")); + + double[] extent = g.extentRadians(); + assertEquals("west", -131.0, Math.toDegrees(extent[0]), 1e-9); + assertEquals("south", 20.0, Math.toDegrees(extent[1]), 1e-9); + assertEquals("east", -63.0, Math.toDegrees(extent[2]), 1e-9); + assertEquals("north", 50.0, Math.toDegrees(extent[3]), 1e-9); + } + + @Test + public void forwardShiftMatchesProj981AtAllFourPoints() throws IOException { + List grids = conus(); + assertShift(grids, false, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO, "San Francisco"); + assertShift(grids, false, GridReferenceValues.KANSAS, + GridReferenceValues.CONUS_FWD_KANSAS, "Kansas"); + assertShift(grids, false, GridReferenceValues.CHICAGO, + GridReferenceValues.CONUS_FWD_CHICAGO, "Chicago"); + assertShift(grids, false, GridReferenceValues.BOSTON, + GridReferenceValues.CONUS_FWD_BOSTON, "Boston"); + } + + /** + * The inverse is the iterative branch of {@code nad_cvt}. It also exercises the corrected + * convergence predicate: 1.4.3 stopped as soon as either residual component was within + * tolerance, where PROJ 9.8.1 requires the squared 2-norm of both to be. + */ + @Test + public void inverseShiftMatchesProj981AtAllFourPoints() throws IOException { + List grids = conus(); + assertShift(grids, true, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_INV_SAN_FRANCISCO, "San Francisco (inverse)"); + assertShift(grids, true, GridReferenceValues.KANSAS, + GridReferenceValues.CONUS_INV_KANSAS, "Kansas (inverse)"); + assertShift(grids, true, GridReferenceValues.CHICAGO, + GridReferenceValues.CONUS_INV_CHICAGO, "Chicago (inverse)"); + assertShift(grids, true, GridReferenceValues.BOSTON, + GridReferenceValues.CONUS_INV_BOSTON, "Boston (inverse)"); + } + + @Test + public void forwardThenInverseRoundTripsToSubMillimetre() throws IOException { + List grids = conus(); + double[][] points = { + GridReferenceValues.SAN_FRANCISCO, GridReferenceValues.KANSAS, + GridReferenceValues.CHICAGO, GridReferenceValues.BOSTON}; + for (double[] p : points) { + double[] fwd = GridReferenceValues.shiftDegrees(grids, false, p[0], p[1]); + double[] back = GridReferenceValues.shiftDegrees(grids, true, fwd[0], fwd[1]); + assertEquals("round-trip longitude at " + p[0] + "," + p[1], p[0], back[0], 1e-9); + assertEquals("round-trip latitude at " + p[0] + "," + p[1], p[1], back[1], 1e-9); + } + } + + /** The magnitudes the downstream report measured, reproduced from the grid data. */ + @Test + public void theShiftMagnitudesAreTheReportedOnes() throws IOException { + List grids = conus(); + + double sf = metres(GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.shiftDegrees(grids, false, + GridReferenceValues.SAN_FRANCISCO[0], GridReferenceValues.SAN_FRANCISCO[1])); + assertEquals("San Francisco NAD27->NAD83 shift, metres", 95.5, sf, 1.5); + + double ks = metres(GridReferenceValues.KANSAS, + GridReferenceValues.shiftDegrees(grids, false, + GridReferenceValues.KANSAS[0], GridReferenceValues.KANSAS[1])); + assertTrue("Kansas NAD27->NAD83 shift should be tens of metres, got " + ks, + ks > 15.0 && ks < 40.0); + } + + /** + * A point covered by no grid in the list is an error. + * + *

1.4.3 returned it unchanged, and this test asserted that. It no longer does: + * {@code cct +proj=hgridshift +grids=conus} at (40°W, 35°N) is + * {@code TRANSFORMATION ERROR (Coordinate to transform falls outside grid)}, and an unchanged + * coordinate is indistinguishable from a zero shift. See {@link OutsideGridFailsClosedTest} for + * the full account, including the control that proves the guard discriminates. + */ + @Test + public void aPointOutsideEveryGridIsRefusedRatherThanEchoed() throws IOException { + List grids = conus(); + try { + double[] got = GridReferenceValues.shiftDegrees(grids, false, + GridReferenceValues.OPEN_OCEAN[0], GridReferenceValues.OPEN_OCEAN[1]); + fail("PROJ 9.8.1 refuses this point; shift returned (" + got[0] + ", " + got[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } + + // --- The CRS-level path, with the grid supplied explicitly -------------------------------- + + /** + * The whole transform, end to end, with {@code +nadgrids=conus} written into the source CRS so the + * result does not depend on the {@code Datum.NAD27} singleton. This is the assertion that says the + * data half works today. + * + *

The tolerance is looser than {@link GridReferenceValues#TOL_DEG} on purpose: Proj4J's CRS path + * additionally routes through geocentric coordinates to change ellipsoid, which perturbs latitude + * by a fraction of a millimetre that has nothing to do with the grid. It is still four orders of + * magnitude tighter than the defect. + */ + @Test + public void crsLevelNad27ToNad83ProducesTheRealShiftWhenTheGridIsNamed() { + CoordinateReferenceSystem src = CRS_FACTORY.createFromParameters("nad27+conus", + "+proj=longlat +ellps=clrk66 +nadgrids=conus +no_defs"); + CoordinateReferenceSystem tgt = CRS_FACTORY.createFromParameters("nad83", + "+proj=longlat +datum=NAD83 +no_defs"); + CoordinateTransform t = CT_FACTORY.createTransform(src, tgt); + + assertNear("San Francisco", t, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO, 1e-7); + assertNear("Kansas", t, GridReferenceValues.KANSAS, + GridReferenceValues.CONUS_FWD_KANSAS, 1e-7); + assertNear("Chicago", t, GridReferenceValues.CHICAGO, + GridReferenceValues.CONUS_FWD_CHICAGO, 1e-7); + assertNear("Boston", t, GridReferenceValues.BOSTON, + GridReferenceValues.CONUS_FWD_BOSTON, 1e-7); + } + + // --- The code half, documented as still broken -------------------------------------------- + + // --- the code half: joined, and verified end to end -------------------------------------- + + /** + * The two halves are joined. + * + *

{@code parser/Proj4Parser.java:53} used to call {@code setGrids(null)} on the static + * {@code Datum.NAD27} singleton, which destroyed JVM-wide whatever grids it had: + *

+     *   Datum datum = datumParam.getDatum();     // the STATIC Datum.NAD27 singleton
+     *   datum.setGrids(datumParam.getGrids());   // mutates it, process-wide
+     * 
+ * {@code EPSG:4267} expands to {@code +proj=longlat +datum=NAD27 +no_defs}, which carries no + * {@code +nadgrids} token, so {@code getGrids()} was {@code null} and + * {@code Datum.NAD27.setGrids(null)} executed permanently. {@code getTransformType()} then flipped + * from {@code TYPE_GRIDSHIFT} to {@code TYPE_UNKNOWN} and every NAD27 transform in the process + * silently stopped shifting; 205 EPSG codes reached the same path. + * + *

That mutation has since been removed by the parser workstream. This test is the joint: it fails + * if either half regresses -- the parser reintroducing the mutation, or {@code conus} leaving the + * classpath. + */ + @Test + public void nad27SingletonSurvivesParsingAnEpsgCode() { + CRS_FACTORY.createFromName("EPSG:4267"); + assertEquals( + "Datum.NAD27 must still declare a grid shift after EPSG:4267 has been parsed. A value " + + "of TYPE_UNKNOWN (0) means the setGrids(null) mutation at Proj4Parser.java:53 " + + "has come back.", + Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + } + + /** + * The defect, retired: {@code EPSG:4267 -> EPSG:4269} at San Francisco. + * + *

1.4.3 returned the input unchanged -- 95.573 m of error, finite, plausible and unflagged. With + * {@code conus} reachable through the resolver chain and the singleton mutation gone, the answer now + * agrees with PROJ 9.8.1 to about 1e-10 of a degree. + */ + @Test + public void epsg4267ToEpsg4269NowProducesTheRealShift() throws IOException { + CoordinateTransform t = CT_FACTORY.createTransform( + CRS_FACTORY.createFromName("EPSG:4267"), + CRS_FACTORY.createFromName("EPSG:4269")); + + ProjCoordinate out = new ProjCoordinate(); + t.transform(new ProjCoordinate(GridReferenceValues.SAN_FRANCISCO[0], + GridReferenceValues.SAN_FRANCISCO[1]), out); + + double moved = metres(GridReferenceValues.SAN_FRANCISCO, new double[]{out.x, out.y}); + assertTrue("the coordinate must actually move, and by about 95.5 m; measured " + moved, + moved > 90.0 && moved < 100.0); + assertEquals("longitude vs PROJ 9.8.1 reading the same conus bytes", + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO[0], out.x, 1e-7); + assertEquals("latitude vs PROJ 9.8.1 reading the same conus bytes", + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO[1], out.y, 1e-7); + assertFalse("and conus is what made it possible", conus().isEmpty()); + } + + /** The same, at all four points and in both directions, through the EPSG codes. */ + @Test + public void epsg4267ToEpsg4269MatchesProj981AtEveryPoint() { + CoordinateTransform fwd = CT_FACTORY.createTransform( + CRS_FACTORY.createFromName("EPSG:4267"), + CRS_FACTORY.createFromName("EPSG:4269")); + assertNear("SF via EPSG codes", fwd, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO, 1e-7); + assertNear("Kansas via EPSG codes", fwd, GridReferenceValues.KANSAS, + GridReferenceValues.CONUS_FWD_KANSAS, 1e-7); + assertNear("Chicago via EPSG codes", fwd, GridReferenceValues.CHICAGO, + GridReferenceValues.CONUS_FWD_CHICAGO, 1e-7); + assertNear("Boston via EPSG codes", fwd, GridReferenceValues.BOSTON, + GridReferenceValues.CONUS_FWD_BOSTON, 1e-7); + + CoordinateTransform inv = CT_FACTORY.createTransform( + CRS_FACTORY.createFromName("EPSG:4269"), + CRS_FACTORY.createFromName("EPSG:4267")); + assertNear("SF inverse via EPSG codes", inv, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_INV_SAN_FRANCISCO, 1e-7); + assertNear("Kansas inverse via EPSG codes", inv, GridReferenceValues.KANSAS, + GridReferenceValues.CONUS_INV_KANSAS, 1e-7); + } + + // --- helpers ------------------------------------------------------------------------------ + + private static void assertShift(List grids, boolean inverse, double[] in, double[] expected, + String label) { + double[] got = GridReferenceValues.shiftDegrees(grids, inverse, in[0], in[1]); + assertEquals(label + " longitude", expected[0], got[0], GridReferenceValues.TOL_DEG); + assertEquals(label + " latitude", expected[1], got[1], GridReferenceValues.TOL_DEG); + } + + private static void assertNear(String label, CoordinateTransform t, double[] in, double[] expected, + double tolDeg) { + ProjCoordinate out = new ProjCoordinate(); + t.transform(new ProjCoordinate(in[0], in[1]), out); + assertEquals(label + " longitude", expected[0], out.x, tolDeg); + assertEquals(label + " latitude", expected[1], out.y, tolDeg); + } + + /** Rough local-plane separation in metres. Only ever used to sanity-check a magnitude. */ + private static double metres(double[] a, double[] b) { + double lat = Math.toRadians((a[1] + b[1]) / 2); + double dx = (b[0] - a[0]) * 111320.0 * Math.cos(lat); + double dy = (b[1] - a[1]) * 110574.0; + return Math.hypot(dx, dy); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/Ntv1CanHeaderTest.java b/core/src/test/java/org/locationtech/proj4j/grids/Ntv1CanHeaderTest.java new file mode 100644 index 0000000..12ff7ca --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/Ntv1CanHeaderTest.java @@ -0,0 +1,179 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Pins the header of the {@code ntv1_can.dat} that {@code proj4j-epsg} actually ships, and pins the + * consequence: {@code NAD27}'s one surviving grid covers Canada. + * + *

{@code datum/Datum.java} asks for {@code @conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat} and + * {@code proj4j-epsg} ships exactly one of the four. Every token is {@code @}-optional, so the three + * missing ones are discarded silently and the surviving grid is authoritative for a country the + * majority of NAD27 users are not in. San Francisco (37.78°N) and Kansas (39.0°N) are + * south of the footprint and get no shift at all; Chicago (41.9°N), Boston (42.4°N), + * Minneapolis (45.0°N) and Seattle (47.6°N) are inside the bounding box and are bilinearly + * interpolated from a Canada-authoritative grid. Neither outcome is reported, and they are different + * kinds of wrong. + * + *

Correction to a previously recorded fact. This footprint has been quoted as + * {@code 40N-84N, 143W-44W} with a {@code 397 x 177} node array. The header says 142°W, + * and the array is 393 x 177. Three independent checks agree: + *

    + *
  • The {@code W LONG} record at byte offset 72 holds the {@code double} {@code 142.0}.
  • + *
  • Proj4J's and PROJ's identical column formula give + * {@code |(-44) - (-142)| / 0.25 + 0.5 + 1 = 393}.
  • + *
  • The file size accounts for exactly 393 columns and nothing else: + * {@code 192} header bytes {@code + 393 * 177 * 16} node bytes {@code + 16} for the trailing + * {@code END} record {@code = 1,113,184}, the shipped size. With 397 columns the node data alone + * would be 1,124,304 bytes, larger than the whole file.
  • + *
+ */ +public class Ntv1CanHeaderTest { + + private static final Charset ASCII = Charset.forName("US-ASCII"); + + /** The size the file must be for the 393-column arithmetic to close. */ + private static final int SHIPPED_SIZE = 1113184; + + private static byte[] shippedBytes() throws IOException { + InputStream in = Ntv1CanHeaderTest.class.getResourceAsStream("/proj4/nad/ntv1_can.dat"); + assertNotNull("proj4j-epsg must be on the test classpath and must ship ntv1_can.dat", in); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(1 << 20); + byte[] buf = new byte[1 << 16]; + int n; + while ((n = in.read(buf)) >= 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + private static String label(byte[] b, int offset) { + return new String(b, offset, 8, ASCII); + } + + private static double bigEndianDouble(byte[] b, int offset) { + return ByteBuffer.wrap(b, offset, 8).order(ByteOrder.BIG_ENDIAN).getDouble(); + } + + private static int bigEndianInt(byte[] b, int offset) { + return ByteBuffer.wrap(b, offset, 4).order(ByteOrder.BIG_ENDIAN).getInt(); + } + + @Test + public void headerRecordsAreExactlyThese() throws IOException { + byte[] b = shippedBytes(); + assertEquals("shipped ntv1_can.dat size", SHIPPED_SIZE, b.length); + + // Twelve 16-byte records: an 8-char label then an 8-byte value. + assertEquals("HEADER ", label(b, 0)); + assertEquals("record count", 12, bigEndianInt(b, 8)); + assertEquals("S LAT ", label(b, 16)); + assertEquals("S LAT", 40.0, bigEndianDouble(b, 24), 0.0); + assertEquals("N LAT ", label(b, 32)); + assertEquals("N LAT", 84.0, bigEndianDouble(b, 40), 0.0); + assertEquals("E LONG ", label(b, 48)); + assertEquals("E LONG", 44.0, bigEndianDouble(b, 56), 0.0); + assertEquals("W LONG ", label(b, 64)); + assertEquals("W LONG is 142.0, not the 143.0 previously recorded", + 142.0, bigEndianDouble(b, 72), 0.0); + assertEquals("N GRID ", label(b, 80)); + assertEquals("N GRID", 0.25, bigEndianDouble(b, 88), 0.0); + assertEquals("W GRID ", label(b, 96)); + assertEquals("W GRID", 0.25, bigEndianDouble(b, 104), 0.0); + assertEquals("TYPE ", label(b, 112)); + assertEquals("FROM ", label(b, 128)); + assertEquals("TO ", label(b, 144)); + } + + @Test + public void fileSizeAccountsForExactly393By177Nodes() throws IOException { + byte[] b = shippedBytes(); + int columns = 393; + int rows = 177; + int headerBytes = 192; // twelve 16-byte records + int endRecordBytes = 16; // the trailing END record + assertEquals("192 header + 393*177*16 node + 16 END must equal the file size", + b.length, headerBytes + columns * rows * 16 + endRecordBytes); + assertTrue("397 columns would need more bytes than the whole file", + headerBytes + 397 * rows * 16 > b.length); + } + + @Test + public void parsedGridHas393By177NodesOverCanada() throws IOException { + List grids = GridReferenceValues.singleton("ntv1_can.dat"); + assertEquals(1, grids.size()); + Grid g = grids.get(0); + assertEquals("ntv1", g.getFormat()); + + double[] extent = g.extentRadians(); + assertEquals("west", -142.0, Math.toDegrees(extent[0]), 1e-12); + assertEquals("south", 40.0, Math.toDegrees(extent[1]), 1e-12); + assertEquals("east", -44.0, Math.toDegrees(extent[2]), 1e-9); + assertEquals("north", 84.0, Math.toDegrees(extent[3]), 1e-9); + } + + /** + * The two points from the downstream defect report are south of the footprint, which is exactly + * why they used to come back unchanged. + * + *

They are now refused. That is the change: + * {@code cct +proj=hgridshift +grids=ntv1_can.dat} at San Francisco is + * {@code TRANSFORMATION ERROR (Coordinate to transform falls outside grid)}, and "returned + * unchanged" was the 95.573 m defect wearing the shape of a successful transform. The footprint + * claim this test exists to pin is unaffected — a refusal is a stronger statement of "outside" + * than an echo, and the {@link ErrorCause} names it. See {@link OutsideGridFailsClosedTest}. + */ + @Test + public void sanFranciscoAndKansasAreSouthOfTheFootprint() throws IOException { + List grids = GridReferenceValues.singleton("ntv1_can.dat"); + assertOutside(grids, GridReferenceValues.SAN_FRANCISCO, "San Francisco"); + assertOutside(grids, GridReferenceValues.KANSAS, "Kansas"); + } + + private static void assertOutside(List grids, double[] point, String label) { + try { + double[] got = GridReferenceValues.shiftDegrees(grids, false, point[0], point[1]); + fail(label + " is south of ntv1_can.dat's 40 degree southern edge and PROJ 9.8.1 " + + "refuses it, yet shift returned (" + got[0] + ", " + got[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + assertTrue("the message must name the grid that did not cover it: " + + expected.getMessage(), expected.getMessage().contains("ntv1_can.dat")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/Ntv1ReaderTest.java b/core/src/test/java/org/locationtech/proj4j/grids/Ntv1ReaderTest.java new file mode 100644 index 0000000..071ed19 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/Ntv1ReaderTest.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * The NTv1 reader against PROJ 9.8.1 reading the same file. + * + *

Two defects in {@code NTV1.load} made every NTv1 shift wrong by about 13 m, both of them producing + * a finite, plausible, superficially sensible coordinate: + * + *

    + *
  1. Data offset 176 instead of 192. An NTv1 header is twelve 16-byte records. 176 + * is one 16-byte node short, so every interpolation read the node one column east of the correct + * one.
  2. + *
  3. The latitude and longitude shift components were transposed. Each record is + * {@code (latitude shift, longitude shift)} in arc seconds; 1.4.3 put the first into + * {@code .lam} and the second into {@code .phi}. PROJ 9.8.1's {@code NTv1Grid::valueAt} is + * explicit: {@code latShift = two_doubles[0]}, {@code longShift = -two_doubles[1]}.
  4. + *
+ * + *

Neither error alone, nor the pair, moved a result far enough to look like a bug. Measured against + * PROJ at Chicago: the 1.4.3 code returned {@code (-87.6000206778, 41.9001129721)} where PROJ returns + * {@code (-87.6001190236, 41.9000194486)} — about 8 m of longitude and 10 m of latitude. Only the + * combination {@code offset = 192} and untransposed components reproduces PROJ, and it does so + * to all ten printed decimal places, which is what makes this a proof rather than a plausibility + * argument. + */ +public class Ntv1ReaderTest { + + private static List ntv1() throws IOException { + return GridReferenceValues.singleton("ntv1_can.dat"); + } + + @Test + public void chicagoMatchesProj981() throws IOException { + double[] got = GridReferenceValues.shiftDegrees(ntv1(), false, + GridReferenceValues.CHICAGO[0], GridReferenceValues.CHICAGO[1]); + assertEquals("Chicago longitude", GridReferenceValues.NTV1_FWD_CHICAGO[0], got[0], + GridReferenceValues.TOL_DEG); + assertEquals("Chicago latitude", GridReferenceValues.NTV1_FWD_CHICAGO[1], got[1], + GridReferenceValues.TOL_DEG); + } + + @Test + public void bostonMatchesProj981() throws IOException { + double[] got = GridReferenceValues.shiftDegrees(ntv1(), false, + GridReferenceValues.BOSTON[0], GridReferenceValues.BOSTON[1]); + assertEquals("Boston longitude", GridReferenceValues.NTV1_FWD_BOSTON[0], got[0], + GridReferenceValues.TOL_DEG); + assertEquals("Boston latitude", GridReferenceValues.NTV1_FWD_BOSTON[1], got[1], + GridReferenceValues.TOL_DEG); + } + + /** + * Guards specifically against a regression of the transposition, independently of the reference + * values: the 1.4.3 answer at Chicago is the correct answer with the two components swapped about + * the input, and it must not be reproducible. + */ + @Test + public void theTransposedAnswerIsNoLongerProduced() throws IOException { + double[] got = GridReferenceValues.shiftDegrees(ntv1(), false, + GridReferenceValues.CHICAGO[0], GridReferenceValues.CHICAGO[1]); + double[] transposed = {-87.6000206778, 41.9001129721}; + assertTrue("must not reproduce the 1.4.3 transposed/misaligned Chicago answer", + Math.abs(got[0] - transposed[0]) > 1e-7 || Math.abs(got[1] - transposed[1]) > 1e-7); + } + + /** + * Chicago is inside both grids, and they disagree by several metres. That disagreement is the + * measurable form of "everything in CONUS north of 40N is currently interpolated from a + * Canada-authoritative grid". + */ + @Test + public void conusAndNtv1DisagreeInsideConusNorthOf40N() throws IOException { + double[] fromNtv1 = GridReferenceValues.shiftDegrees(ntv1(), false, + GridReferenceValues.CHICAGO[0], GridReferenceValues.CHICAGO[1]); + double[] fromConus = GridReferenceValues.shiftDegrees( + GridReferenceValues.singleton("conus"), false, + GridReferenceValues.CHICAGO[0], GridReferenceValues.CHICAGO[1]); + + double dLonMetres = Math.abs(fromNtv1[0] - fromConus[0]) + * 111320.0 * Math.cos(Math.toRadians(GridReferenceValues.CHICAGO[1])); + double dLatMetres = Math.abs(fromNtv1[1] - fromConus[1]) * 110574.0; + double separation = Math.hypot(dLonMetres, dLatMetres); + + assertTrue("conus and ntv1_can.dat must disagree measurably at Chicago, and they do by " + + separation + " m", separation > 1.0); + assertTrue("the disagreement should be metres, not kilometres: " + separation, + separation < 100.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/Ntv2MultiSubgridTest.java b/core/src/test/java/org/locationtech/proj4j/grids/Ntv2MultiSubgridTest.java new file mode 100644 index 0000000..3da6c7b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/Ntv2MultiSubgridTest.java @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.datum.Grid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Multi-subgrid NTv2. + * + *

The fixture is PROJ 9.8.1's own {@code data/tests/ntv2_0_downsampled.gsb}: seven subgrids in a + * two-level hierarchy — four regional roots ({@code CAeast}, {@code CAwest}, {@code CAnorth}, + * {@code CAarctic}) and three high-resolution children ({@code ONwinsor} under {@code CAeast}, + * {@code ALraymnd} and {@code ALbanff} under {@code CAwest}). This is the ordinary shape of a real + * NTv2 file, not an edge case: {@code ca_nrc_ntv2_0.gsb} and + * {@code uk_os_OSTN15_NTv2_OSGBtoETRS.gsb} are both like this. + * + *

1.4.3's reader was documented as "only files with 1 subfile are supported", but it did not + * reject a multi-subgrid file — it read the first subgrid and used it for the whole file. So + * {@code CAeast} silently became authoritative for all of Canada: a point in Alberta fell outside it and + * got no shift at all while the transform reported success, and a point in the {@code ONwinsor} + * high-resolution window got {@code CAeast}'s coarse value instead. + * + *

A second, independent defect had to be fixed for subgrids to work even once they were parsed: + * {@code Grid.shift} captured {@code table = grid.table} before descending into children and + * then interpolated from that captured parent table, so a matched child was located and then ignored. + */ +public class Ntv2MultiSubgridTest { + + private static List ntv2() throws IOException { + return GridReferenceValues.singleton("ntv2_0_downsampled.gsb"); + } + + @Test + public void allSevenSubgridsAreReadAndTheHierarchyIsRebuilt() throws IOException { + List grids = ntv2(); + assertEquals(1, grids.size()); + Grid file = grids.get(0); + assertEquals("ntv2", file.getFormat()); + assertEquals("seven subgrids plus the synthetic bounding parent", 8, file.countGrids()); + + List roots = file.getSubGrids(); + assertEquals("four top-level regional grids", 4, roots.size()); + + int children = 0; + for (Grid root : roots) { + children += root.getSubGrids().size(); + } + assertEquals("three high-resolution children", 3, children); + } + + @Test + public void aPointInACaWestChildUsesTheChildAndMatchesProj981() throws IOException { + assertShift(GridReferenceValues.NTV2_ALRAYMND, GridReferenceValues.NTV2_FWD_ALRAYMND, + "ALraymnd (child of CAwest)"); + assertShift(GridReferenceValues.NTV2_ALBANFF, GridReferenceValues.NTV2_FWD_ALBANFF, + "ALbanff (child of CAwest)"); + } + + @Test + public void aPointInTheCaEastChildUsesTheChildAndMatchesProj981() throws IOException { + assertShift(GridReferenceValues.NTV2_ONWINSOR, GridReferenceValues.NTV2_FWD_ONWINSOR, + "ONwinsor (child of CAeast)"); + } + + /** + * The decisive case for the "first subgrid only" defect: this point is in {@code CAwest}, which is + * the second subgrid in the file, and outside {@code CAeast}. 1.4.3 returned it unchanged. + */ + @Test + public void aPointOnlyInTheSecondRootSubgridIsStillShifted() throws IOException { + double[] got = GridReferenceValues.shiftDegrees(ntv2(), false, + GridReferenceValues.NTV2_CAWEST[0], GridReferenceValues.NTV2_CAWEST[1]); + assertTrue("a point in CAwest must not be returned unchanged", + Math.abs(got[0] - GridReferenceValues.NTV2_CAWEST[0]) > 1e-6); + assertEquals("CAwest longitude", GridReferenceValues.NTV2_FWD_CAWEST[0], got[0], + GridReferenceValues.TOL_DEG); + assertEquals("CAwest latitude", GridReferenceValues.NTV2_FWD_CAWEST[1], got[1], + GridReferenceValues.TOL_DEG); + } + + /** + * The descent must actually change the answer, otherwise every assertion above would still pass with + * a broken descent. + * + *

The comparison value is PROJ 9.8.1 reading a deliberately truncated copy of the same fixture — + * {@code NUM_FILE} forced to 1 and everything after {@code CAeast}'s data removed, i.e. exactly what + * 1.4.3 effectively read. PROJ returns {@code (-82.9999230409, 42.1000442803)} for that file and + * {@code (-82.9999212472, 42.1000428139)} for the full one: about 0.22 m apart. Small, and entirely + * invisible to a caller. + */ + @Test + public void theChildValueDiffersFromWhatCaEastAloneWouldGive() throws IOException { + double[] caEastOnly = {-82.9999230409, 42.1000442803}; + double[] fine = GridReferenceValues.shiftDegrees(ntv2(), false, + GridReferenceValues.NTV2_ONWINSOR[0], GridReferenceValues.NTV2_ONWINSOR[1]); + + assertEquals("must equal the full-hierarchy PROJ answer", + GridReferenceValues.NTV2_FWD_ONWINSOR[0], fine[0], GridReferenceValues.TOL_DEG); + assertTrue("must NOT equal the CAeast-only answer that 1.4.3 produced; got " + + fine[0] + "," + fine[1], + Math.abs(fine[0] - caEastOnly[0]) > 1e-7 || Math.abs(fine[1] - caEastOnly[1]) > 1e-7); + } + + @Test + public void bytesReadAreAccountedForInTheCacheBudget() throws IOException { + Grid file = ntv2().get(0); + // 1248 + 960 + 1044 + 290 + 10431 + 1071 + 231 = 15275 nodes. + assertEquals("accounted node bytes", 15275L * 32L, file.sizeBytes()); + } + + private static void assertShift(double[] in, double[] expected, String label) throws IOException { + double[] got = GridReferenceValues.shiftDegrees(ntv2(), false, in[0], in[1]); + assertEquals(label + " longitude", expected[0], got[0], GridReferenceValues.TOL_DEG); + assertEquals(label + " latitude", expected[1], got[1], GridReferenceValues.TOL_DEG); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/OutsideGridFailsClosedTest.java b/core/src/test/java/org/locationtech/proj4j/grids/OutsideGridFailsClosedTest.java new file mode 100644 index 0000000..57b364e --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/OutsideGridFailsClosedTest.java @@ -0,0 +1,487 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code Grid.shift} outside every grid: an error, not the input coordinate. + * + *

The defect

+ * + *

1.4.3's {@code shift} ended in an {@code else} branch that did nothing: + * + *

+ *   if (!Double.isNaN(output.lam)) { in.x = output.lam; in.y = output.phi; }
+ *   else { /* no table covered this point */ }
+ * 
+ * + *

The coordinate came back bit-identical to the input, which is indistinguishable from "the + * shift was zero", and the transform reported success. The comment on that branch already named + * {@link ErrorCause#COORDINATE_OUTSIDE_GRID} as the intended signal; it simply never raised it. + * + *

Upstream, measured rather than assumed

+ * + *

Every expected outcome below was taken from PROJ 9.8.1 ({@code cct}/{@code cs2cs} + * reporting {@code Rel. 9.8.1, April 10th, 2026}) reading the same grid bytes this repository + * ships, with {@code PROJ_DATA} pointed at a directory holding only those files: + * + *

+ * printf -- "-40 35 0 0\n"             | cct -d 10 +proj=hgridshift +grids=conus
+ *   # Record 0 TRANSFORMATION ERROR (Coordinate to transform falls outside grid)
+ *
+ * printf -- "-100 19.999999 0 0\n"     | cct -d 12 +proj=hgridshift +grids=conus
+ *   -100.000014233333  20.000382961118
+ * printf -- "-100 19.99998 0 0\n"      | cct -d 12 +proj=hgridshift +grids=conus
+ *   # Record 0 TRANSFORMATION ERROR (Coordinate to transform falls outside grid)
+ *
+ * printf -- "-40 35 0 0\n"             | cct -d 10 +proj=hgridshift +grids=null
+ *   -40.0000000000   35.0000000000
+ *
+ * echo "1 -1" | cs2cs -f "%.10f" +proj=longlat +datum=WGS84 \
+ *          +to +proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
+ *   *	* inf
+ * 
+ * + *

The last one is the whole ticket in one line: the exact {@code +datum=NAD27} grid list, + * with every grid present, refuses a point outside all of them. proj4j answered + * {@code 1, -1} — the input, unshifted, reported as a success. + * + *

Why the assertions are mostly on {@code Grid.shift} and not on CRS pairs

+ * + *

Because {@code cct +proj=hgridshift} is the operator this class ports, and comparing operator + * to operator holds the datum semantics, the ellipsoid change and the operation-selection layer + * fixed. That last one matters here and is not a divergence: + * {@code cs2cs +to +proj=longlat +datum=NAD27} at (1, -1) returns the point unchanged, because with + * {@code proj.db} present PROJ's operation factory sees the coordinate is outside NADCON's area of + * use and selects "Ballpark geographic offset" (verified with {@code PROJ_DEBUG=2}) — a + * declared no-op operation, not a silent one. proj4j's legacy {@code +datum=}/{@code +nadgrids=} + * path has no such factory; it is the operator path, and the operator path errors. + * + * @see Nad27EdgeRoundTripTest for the 40°N round-trip regression this same fix retires + */ +public class OutsideGridFailsClosedTest { + + private static final Charset ASCII = Charset.forName("US-ASCII"); + private static final double DEG = Math.PI / 180.0; + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + private Path root; + + @After + public void cleanUp() throws IOException { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + if (root != null) { + for (String name : new String[]{"anisotropic", "plain"}) { + Files.deleteIfExists(root.resolve(name)); + } + Files.deleteIfExists(root); + root = null; + } + } + + // ---------------------------------------------------------------- the defect, retired + + /** + * The headline: a point no grid covers is {@link ErrorCause#COORDINATE_OUTSIDE_GRID}. + * {@code cct +proj=hgridshift +grids=conus} at (40°W, 35°N) is + * {@code TRANSFORMATION ERROR (Coordinate to transform falls outside grid)}. + */ + @Test + public void aPointOutsideEveryGridIsAnErrorAndNotTheInputCoordinate() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + try { + double[] got = GridReferenceValues.shiftDegrees(conus, false, + GridReferenceValues.OPEN_OCEAN[0], GridReferenceValues.OPEN_OCEAN[1]); + fail("no grid covers (" + GridReferenceValues.OPEN_OCEAN[0] + ", " + + GridReferenceValues.OPEN_OCEAN[1] + ") and PROJ 9.8.1 refuses it, yet shift " + + "returned (" + got[0] + ", " + got[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + assertTrue("the message must name the grids that were searched: " + + expected.getMessage(), expected.getMessage().contains("conus")); + assertTrue("and must say the point was outside all of them: " + expected.getMessage(), + expected.getMessage().contains("outside every grid")); + } + } + + /** + * The same for the inverse direction, which is a different branch of {@code nad_cvt} and used + * to have its own way of producing {@code NaN}. + */ + @Test + public void theInverseDirectionAlsoRefusesRatherThanEchoing() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + try { + GridReferenceValues.shiftDegrees(conus, true, + GridReferenceValues.OPEN_OCEAN[0], GridReferenceValues.OPEN_OCEAN[1]); + fail("expected COORDINATE_OUTSIDE_GRID from the inverse direction too"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + assertTrue("the inverse direction should say so: " + expected.getMessage(), + expected.getMessage().startsWith("inverse grid shift")); + } + } + + /** + * What silence looked like. This is the shape of the defect, asserted directly: with the + * exception swallowed, the coordinate the caller is holding is bit-identical to the one + * it passed in. Every digit of it is the answer 1.4.3 returned, and no caller could have + * distinguished it from a grid whose shift happened to be zero. + * + *

It is here so that a future change which downgrades the throw back to a no-op cannot look + * harmless: the assertion below would still pass, and the two above would be the only thing + * standing between this library and a 95 m error reported as success. + */ + @Test + public void withTheExceptionSwallowedTheCallerHoldsExactlyTheInputAgain() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + ProjCoordinate c = new ProjCoordinate( + GridReferenceValues.OPEN_OCEAN[0] * DEG, GridReferenceValues.OPEN_OCEAN[1] * DEG); + double x = c.x; + double y = c.y; + try { + Grid.shift(conus, false, c); + fail("expected COORDINATE_OUTSIDE_GRID"); + } catch (CrsTransformException expected) { + assertEquals(Double.doubleToLongBits(x), Double.doubleToLongBits(c.x)); + assertEquals(Double.doubleToLongBits(y), Double.doubleToLongBits(c.y)); + } + } + + // --------------------------------------------- the positive control: it discriminates + + /** + * The control that makes every assertion above mean something. A guard that threw + * unconditionally would pass all of them. This one pins the exact latitude at which the guard + * changes its mind, and both sides of it are PROJ 9.8.1's own answers on the same bytes. + * + *

{@code conus} has 0.25° cells, so the containment epsilon + * {@code (resX + resY) * REL_TOLERANCE_HGRIDSHIFT} is {@code 5e-6}° and its south edge is + * 20°N. The two probes are 1.9e-5° apart — about two metres: + * + *

    + *
  • {@code (100W, 19.999999N)}, one micro-degree out: PROJ shifts it to + * {@code -100.000014233333 20.000382961118}, and so must proj4j — silently;
  • + *
  • {@code (100W, 19.99998N)}, twenty micro-degrees out: PROJ reports + * {@code TRANSFORMATION ERROR}, and so must proj4j.
  • + *
+ * + *

So the guard cannot be firing on everything, and it cannot be firing on nothing. + */ + @Test + public void theGuardDiscriminatesAtTheContainmentToleranceAndNotBefore() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + + double[] justInside = GridReferenceValues.shiftDegrees(conus, false, -100.0, 19.999999); + assertEquals("1e-6 deg below the south edge is inside 9.8.1's tolerance and must NOT throw", + -100.000014233333, justInside[0], GridReferenceValues.TOL_DEG); + assertEquals(20.000382961118, justInside[1], GridReferenceValues.TOL_DEG); + + try { + double[] got = GridReferenceValues.shiftDegrees(conus, false, -100.0, 19.99998); + fail("2e-5 deg below the south edge is outside 9.8.1's tolerance -- PROJ reports " + + "TRANSFORMATION ERROR -- yet shift returned (" + got[0] + ", " + got[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } + + /** + * The other half of the control, on real data at scale rather than at one edge: the four points + * the grid tests use inside {@code conus} still shift, and still agree with PROJ 9.8.1. If the + * guard had become indiscriminate this would be the loudest failure in the module. + */ + @Test + public void everyPointInsideTheGridStillShiftsAndStillMatchesProj981() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + double[][] points = { + GridReferenceValues.SAN_FRANCISCO, GridReferenceValues.KANSAS, + GridReferenceValues.CHICAGO, GridReferenceValues.BOSTON}; + double[][] expected = { + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO, GridReferenceValues.CONUS_FWD_KANSAS, + GridReferenceValues.CONUS_FWD_CHICAGO, GridReferenceValues.CONUS_FWD_BOSTON}; + for (int i = 0; i < points.length; i++) { + double[] got = GridReferenceValues.shiftDegrees(conus, false, points[i][0], points[i][1]); + assertEquals(expected[i][0], got[0], GridReferenceValues.TOL_DEG); + assertEquals(expected[i][1], got[1], GridReferenceValues.TOL_DEG); + } + } + + // ------------------------------------------------- the three things that must stay silent + + /** + * PROJ's {@code @} prefix means optional, and skipping an absent grid is correct + * PROJ behaviour. The fix must not turn "the file is not there" into an error: those are + * different questions and only "outside a grid we loaded" is the one being closed. + * + *

With every token {@code @}-optional and every file absent, {@link Grid#fromNadGrids} + * returns an empty list, {@code Datum.getTransformType()} never reports + * {@code TYPE_GRIDSHIFT}, and {@code shift} is a no-op — exactly as every upstream operator's + * {@code if (!grids.empty())} guard requires. + */ + @Test + public void anAbsentOptionalGridIsStillSkippedSilentlyAndLeavesAnEmptyNoOpList() + throws IOException { + List none = Grid.fromNadGrids("@no_such_grid_at_all,@nor_this_one"); + assertTrue("an all-optional, all-missing list must resolve to nothing", none.isEmpty()); + + ProjCoordinate c = new ProjCoordinate(-40.0 * DEG, 35.0 * DEG); + Grid.shift(none, false, c); + assertEquals(-40.0 * DEG, c.x, 0.0); + assertEquals(35.0 * DEG, c.y, 0.0); + } + + /** + * {@code +nadgrids=null} is PROJ's built-in grid that covers the whole world and shifts nothing. + * {@code HorizontalShiftGridSet::gridAt} ({@code 9.8.1:src/grids.cpp:2775-2779}) returns it for + * any point without consulting an extent, and {@code pj_hgrid_apply} then returns the + * input. Measured: {@code cct +proj=hgridshift +grids=null} at (40°W, 35°N) prints + * {@code -40.0000000000 35.0000000000}. + * + *

So no point is ever outside it, and it must short-circuit the new error. This is the one + * case where returning the input unchanged is the specified answer rather than a fail-open. + */ + @Test + public void theNullGridCoversEverythingAndIsNotAnOutsideGridError() throws IOException { + List nul = Grid.fromNadGrids("@null"); + assertEquals(1, nul.size()); + assertTrue("the null grid must identify itself", nul.get(0).isNullGrid()); + + ProjCoordinate c = new ProjCoordinate(-40.0 * DEG, 35.0 * DEG); + Grid.shift(nul, false, c); + assertEquals(-40.0 * DEG, c.x, 0.0); + assertEquals(35.0 * DEG, c.y, 0.0); + + // ...and it wins even when it follows a grid that does not contain the point, because + // upstream's gridAt never looks at an extent for it. + List conusThenNull = Grid.fromNadGrids("conus,null"); + ProjCoordinate d = new ProjCoordinate(-40.0 * DEG, 35.0 * DEG); + Grid.shift(conusThenNull, false, d); + assertEquals(-40.0 * DEG, d.x, 0.0); + } + + /** + * A non-finite horizontal position has no grid cell. {@code grids.cpp:3411-3412} returns it as + * it stands ({@code if (in.lam == HUGE_VAL) return in}); turning it into an exception here + * would make a NaN funnelled from an earlier stage surface as an outside-grid error, which is + * a false attribution. + */ + @Test + public void aNonFiniteInputTravelsRatherThanBecomingAnOutsideGridError() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + ProjCoordinate c = new ProjCoordinate(Double.NaN, Double.NaN); + Grid.shift(conus, false, c); + assertTrue("NaN in, NaN out", Double.isNaN(c.x) && Double.isNaN(c.y)); + + ProjCoordinate d = new ProjCoordinate(Double.POSITIVE_INFINITY, 0.5); + Grid.shift(conus, false, d); + assertEquals(Double.POSITIVE_INFINITY, d.x, 0.0); + } + + // ------------------------------------- the deliberate divergence, kept and now observable + + /** + * The recorded deliberate divergence is unchanged. + * + *

PROJ commits to the grid {@code findGrid} selected: if the interpolation inside it refuses + * the point, {@code pj_hgrid_apply} reports outside-grid and the next entry of + * {@code +nadgrids=} is never consulted. {@code Grid.shift} instead continues its loop. That + * was a conscious choice, is documented, and this fix does not reverse it — reversing it is a + * separate behavioural change with its own row set. + * + *

Reaching the divergence needs a grid whose containment epsilon exceeds its + * interpolation clamp, and for a square grid it never does: the epsilon is + * {@code (resX + resY) * 1e-5} degrees while the clamp is {@code 1e-4} of a cell, so on + * {@code conus} (0.25° square) the epsilon is 5e-6° and the clamp 2.5e-5° — every + * admitted point is clamped. The window opens only when {@code resX > 9 * resY}. The + * {@code anisotropic} fixture below is 10° × 0.1°, giving an epsilon of + * 1.01e-4° against a clamp of 1e-5°, so the band 1e-5° < d < 1.01e-4° + * below its south edge is inside the extent and refused by the interpolation — the + * exact state PROJ and proj4j disagree about. + */ + @Test + public void interpolationFailureStillFallsThroughToTheNextGrid() throws IOException { + List both = twoGrids("anisotropic,plain"); + assertEquals(2, both.size()); + + // 5e-5 deg below the anisotropic grid's south edge: inside its extent (eps 1.01e-4) and + // past its clamp (1e-5). + double[] got = GridReferenceValues.shiftDegrees(both, false, 0.0, -5e-5); + assertEquals("the second grid must have answered, as it did before this change", + PLAIN_SHIFT_DEG, 0.0 - got[0], 1e-9); + assertEquals(-5e-5 + PLAIN_SHIFT_DEG, got[1], 1e-9); + } + + /** + * The two controls that make the test above a statement about the fall-through rather than + * about arithmetic: the first grid alone refuses that point (so the fall-through was + * genuinely needed), and the second grid alone gives the same answer (so the fall-through + * genuinely reached it). + * + *

Note the message: this is the second of the two shapes the new guard reports, and the one + * that only exists because the fall-through is kept — with a single grid there is + * nothing to fall through to, and the loop ends where PROJ ends. + */ + @Test + public void andTheFallThroughWasNeeded_eachGridAloneProvesIt() throws IOException { + List anisotropic = twoGrids("anisotropic"); + try { + double[] got = GridReferenceValues.shiftDegrees(anisotropic, false, 0.0, -5e-5); + fail("the anisotropic grid must contain this point and refuse to interpolate it, yet " + + "it returned (" + got[0] + ", " + got[1] + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + assertTrue("this is the contained-but-uninterpolable shape, and the message says so: " + + expected.getMessage(), + expected.getMessage().contains("inside the extent of a grid")); + } + + List plain = twoGrids("plain"); + double[] alone = GridReferenceValues.shiftDegrees(plain, false, 0.0, -5e-5); + assertEquals(PLAIN_SHIFT_DEG, 0.0 - alone[0], 1e-9); + } + + // ------------------------------------------------------------------------- CRS-level + + /** + * End to end, with the grid list written into the CRS so the outcome does not depend on which + * optional grid packs happen to be on the classpath. + * + *

{@code cs2cs +proj=longlat +datum=WGS84 +to +proj=longlat +ellps=clrk66 + * +nadgrids=@ntv1_can.dat} at (1, -1) prints {@code * * inf}. proj4j returned {@code 1, -1}. + */ + @Test + public void aCrsPairWhoseGridDoesNotReachThePointNowFailsClosed() { + CoordinateReferenceSystem wgs84 = CRS_FACTORY.createFromParameters("wgs84", + "+proj=longlat +datum=WGS84 +no_defs"); + CoordinateReferenceSystem nad27 = CRS_FACTORY.createFromParameters("nad27+ntv1", + "+proj=longlat +ellps=clrk66 +nadgrids=@ntv1_can.dat +no_defs"); + CoordinateTransform t = CT_FACTORY.createTransform(wgs84, nad27); + + try { + ProjCoordinate out = new ProjCoordinate(); + t.transform(new ProjCoordinate(1.0, -1.0), out); + fail("PROJ 9.8.1 answers '* * inf' here; proj4j returned (" + out.x + ", " + out.y + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } + + /** And the same pair inside the grid still works, so the CRS path is not simply broken. */ + @Test + public void theSameCrsPairStillWorksWhereTheGridReaches() { + CoordinateReferenceSystem wgs84 = CRS_FACTORY.createFromParameters("wgs84", + "+proj=longlat +datum=WGS84 +no_defs"); + CoordinateReferenceSystem nad27 = CRS_FACTORY.createFromParameters("nad27+ntv1", + "+proj=longlat +ellps=clrk66 +nadgrids=@ntv1_can.dat +no_defs"); + CoordinateTransform t = CT_FACTORY.createTransform(wgs84, nad27); + + ProjCoordinate out = new ProjCoordinate(); + t.transform(new ProjCoordinate(-75.6972, 45.4225), out); // Ottawa, well inside + assertNotEquals("the point must actually move", -75.6972, out.x, 1e-9); + assertTrue("and by a plausible NAD27 amount", Math.abs(out.x + 75.6972) < 1e-3); + } + + // ------------------------------------------------------------------------- fixtures + + /** The plain fixture's longitude shift, in degrees, stored positive-west as the formats do. */ + private static final double PLAIN_SHIFT_DEG = 0.125; + + private List twoGrids(String spec) throws IOException { + if (root == null) { + root = Files.createTempDirectory("proj4j-outside-grid"); + Files.write(root.resolve("anisotropic"), anisotropicCtable2()); + Files.write(root.resolve("plain"), plainCtable2()); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + GridCache.instance().clear(); + } + List out = new ArrayList(); + for (String name : Arrays.asList(spec.split(","))) { + Grid.mergeGridFile(name, out); + } + return out; + } + + /** + * 3×11 CTABLE V2 over 10°W–10°E, 0°–1°N, cells + * 10°×0.1°. The aspect ratio is the whole point: see + * {@link #interpolationFailureStillFallsThroughToTheNextGrid()}. Its shift values are large and + * distinctive so that a test which accidentally used this grid could not be mistaken + * for one that used {@code plain}. + */ + private static byte[] anisotropicCtable2() { + return ctable2("anisotropic (eps > clamp by construction)", + -10.0, 0.0, 10.0, 0.1, 3, 11, 9.0); + } + + /** 21×21 CTABLE V2 over 10°W–10°E, 10°S–10°N at 1°. */ + private static byte[] plainCtable2() { + return ctable2("plain", -10.0, -10.0, 1.0, 1.0, 21, 21, PLAIN_SHIFT_DEG); + } + + private static byte[] ctable2(String id, double llLamDeg, double llPhiDeg, + double delLamDeg, double delPhiDeg, int cols, int rows, + double shiftDeg) { + byte[] b = new byte[160 + cols * rows * 8]; + System.arraycopy("CTABLE V2.0 ".getBytes(ASCII), 0, b, 0, 16); + byte[] name = id.getBytes(ASCII); + System.arraycopy(name, 0, b, 16, Math.min(name.length, 79)); + + ByteBuffer buf = ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN); + buf.putDouble(96, llLamDeg * DEG); + buf.putDouble(104, llPhiDeg * DEG); + buf.putDouble(112, delLamDeg * DEG); + buf.putDouble(120, delPhiDeg * DEG); + buf.putInt(128, cols); + buf.putInt(132, rows); + for (int i = 0; i < cols * rows; i++) { + buf.putFloat(160 + i * 8, (float) (shiftDeg * DEG)); + buf.putFloat(160 + i * 8 + 4, (float) (shiftDeg * DEG)); + } + return b; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/grids/ShippedGridsSurviveTheBoundsTest.java b/core/src/test/java/org/locationtech/proj4j/grids/ShippedGridsSurviveTheBoundsTest.java new file mode 100644 index 0000000..d58abdd --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/grids/ShippedGridsSurviveTheBoundsTest.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.grids; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.datum.GridExtents; +import org.locationtech.proj4j.datum.VerticalGrid; +import org.locationtech.proj4j.resource.ChainedResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceResolvers; +import org.locationtech.proj4j.resource.Resources; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The positive control for every bound added to the resource and grid layers. + * + *

A guard that refuses everything passes every hostile test written against it. This is the other + * half: each shipped grid format is read through the bounded classpath path and must come + * back byte-identical to the file on disk, then parse, then produce the coordinate PROJ 9.8.1 + * produces from the same bytes. Provenance of the expected values is in + * {@link GridReferenceValues}; they are {@code cs2cs} and {@code cct} output, not proj4j's. + * + *

The byte-identity leg is the one that is specific to this workstream. The rewritten reader has + * three paths — an exactly sized array when the entry declares its length, a truncating copy when it + * turns out to be shorter, and a bounded stream when it turns out to be longer or declines to say — + * and a slip in any of them would hand a grid reader a subtly wrong buffer, which is a wrong + * coordinate rather than an error. Real classpath entries of five formats and four orders of + * magnitude in size are what pins it. + */ +public class ShippedGridsSurviveTheBoundsTest { + + @After + public void reset() { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + GridCache.vertical().clear(); + System.clearProperty("proj4j.grids.maxFileBytes"); + } + + /** Every grid resource in the test grid pack, plus the two that ship in {@code proj4j-epsg}. */ + private static final String[] CLASSPATH_GRIDS = { + "conus", // CTABLE v2, 273 x 121 + "ntv2_0_downsampled.gsb", // NTv2, multi-subgrid + "ntv1_can.dat", // NTv1, 1,113,184 bytes -- the largest here + "egm96_15_downsampled.gtx", // GTX, vertical + "test_hgrid.tif", // GeoTIFF, horizontal + "test_vgrid.tif", // GeoTIFF, vertical + "test_hgrid_tiled.tif", // GeoTIFF, tiled + "test_vgrid_bigendian_bigtiff.tif", // BigTIFF, byte-swapped + "us_noaa_geoid06_ak_subset_at_antimeridian.tif", + }; + + /** + * The bounded read returns exactly the bytes on disk, for every shipped grid. + * + *

Sizes span 624 bytes to 1,113,184, which exercises both the single-buffer case and the + * multi-read loop. + */ + @Test + public void everyShippedGridReadsBackByteIdenticalThroughTheBoundedPath() throws IOException { + ChainedResourceResolver chain = ResourceResolvers.resolver(); + int checked = 0; + long largest = 0; + for (String name : CLASSPATH_GRIDS) { + ResourceHandle handle = chain.resolve(name); + if (handle == null) { + continue; // not every name is on every module's test classpath + } + Path onDisk = onDisk(name); + if (onDisk == null) { + continue; + } + byte[] expected = Files.readAllBytes(onDisk); + byte[] got = Resources.readAll(handle, GridExtents.maxFileBytes()); + assertEquals(name + " came back at the wrong length", expected.length, got.length); + assertArrayEquals(name + " came back with different bytes", expected, got); + largest = Math.max(largest, expected.length); + checked++; + } + assertTrue("this test is only evidence if it actually read some grids; checked " + checked, + checked >= 5); + assertTrue("and it must have read something big enough to need more than one buffer; " + + "largest was " + largest, largest > 64 * 1024); + } + + /** CTABLE v2, NTv1 and NTv2, against PROJ 9.8.1's own output for the same bytes. */ + @Test + public void theHorizontalFormatsStillShiftCorrectly() throws IOException { + List conus = GridReferenceValues.singleton("conus"); + assertEquals("ctable2", conus.get(0).getFormat()); + assertShift(conus, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_FWD_SAN_FRANCISCO, false); + assertShift(conus, GridReferenceValues.SAN_FRANCISCO, + GridReferenceValues.CONUS_INV_SAN_FRANCISCO, true); + assertShift(conus, GridReferenceValues.CHICAGO, GridReferenceValues.CONUS_FWD_CHICAGO, false); + + List ntv1 = GridReferenceValues.singleton("ntv1_can.dat"); + assertEquals("ntv1", ntv1.get(0).getFormat()); + assertShift(ntv1, GridReferenceValues.CHICAGO, GridReferenceValues.NTV1_FWD_CHICAGO, false); + assertShift(ntv1, GridReferenceValues.BOSTON, GridReferenceValues.NTV1_FWD_BOSTON, false); + + List ntv2 = GridReferenceValues.singleton("ntv2_0_downsampled.gsb"); + assertEquals("ntv2", ntv2.get(0).getFormat()); + assertShift(ntv2, GridReferenceValues.NTV2_ONWINSOR, + GridReferenceValues.NTV2_FWD_ONWINSOR, false); + assertShift(ntv2, GridReferenceValues.NTV2_ALBANFF, + GridReferenceValues.NTV2_FWD_ALBANFF, false); + assertShift(ntv2, GridReferenceValues.NTV2_CAWEST, + GridReferenceValues.NTV2_FWD_CAWEST, false); + } + + /** GeoTIFF, the fourth horizontal format, through the same bounded read. */ + @Test + public void theGeoTiffFormatStillLoads() throws IOException { + List tif = GridReferenceValues.singleton("test_hgrid.tif"); + assertEquals("gtiff", tif.get(0).getFormat()); + double[] extent = tif.get(0).extentRadians(); + assertEquals(4.0, Math.toDegrees(extent[0]), 1e-12); + assertEquals(52.0, Math.toDegrees(extent[1]), 1e-12); + assertEquals(7.0, Math.toDegrees(extent[2]), 1e-12); + assertEquals(55.0, Math.toDegrees(extent[3]), 1e-12); + double[] shifted = GridReferenceValues.shiftDegrees(tif, false, 5.0, 53.0); + assertTrue("the GeoTIFF grid must actually shift the point", shifted[0] != 5.0); + } + + /** GTX, the vertical format, against {@code cct}'s output for the same bytes. */ + @Test + public void theVerticalGtxStillInterpolates() throws IOException { + VerticalGrid gtx = VerticalGrid.fromName("egm96_15_downsampled.gtx"); + assertNotNull(gtx); + for (int i = 0; i < GridReferenceValues.GTX_POINTS.length; i++) { + double lon = Math.toRadians(GridReferenceValues.GTX_POINTS[i][0]); + double lat = Math.toRadians(GridReferenceValues.GTX_POINTS[i][1]); + assertEquals("GTX point " + i, GridReferenceValues.GTX_EXPECTED[i], + gtx.valueAt(lon, lat), GridReferenceValues.GTX_TOL); + } + } + + /** + * The unification, proved from both sides. + * + *

{@code VerticalGrid.fromName} carried a hardcoded 512 MiB literal where + * {@code Grid.resolveAndLoad} used {@code proj4j.grids.maxFileBytes} at 128 MiB, so the one + * documented knob for "how large may a grid file be" governed only half the grids. Setting the + * property must now bite on a vertical grid as well as a horizontal one — and the default must + * still admit every grid that ships. + */ + @Test + public void oneCeilingGovernsBothKindsOfGrid() throws IOException { + // Default: everything shipped loads. This is the direction that must not regress, since + // unifying moved the vertical ceiling DOWN by a factor of four. + assertNotNull(VerticalGrid.fromName("egm96_15_downsampled.gtx")); + assertEquals(1, GridReferenceValues.singleton("ntv1_can.dat").size()); + + System.setProperty("proj4j.grids.maxFileBytes", "512"); + GridCache.instance().clear(); + GridCache.vertical().clear(); + try { + try { + VerticalGrid.fromName("egm96_15_downsampled.gtx"); + fail("a 512-byte ceiling must refuse the vertical grid too; before the unification " + + "this path used its own 512 MiB literal and ignored the property"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("exceeds")); + } + try { + GridReferenceValues.singleton("conus"); + fail("and the horizontal path, at the same ceiling"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("exceeds")); + } + } finally { + System.clearProperty("proj4j.grids.maxFileBytes"); + GridCache.instance().clear(); + GridCache.vertical().clear(); + } + + // ...and it comes back. A ceiling that latched would be worse than one that never fired. + assertNotNull(VerticalGrid.fromName("egm96_15_downsampled.gtx")); + assertEquals(1, GridReferenceValues.singleton("conus").size()); + } + + private static void assertShift(List grids, double[] point, double[] expected, + boolean inverse) { + double[] got = GridReferenceValues.shiftDegrees(grids, inverse, point[0], point[1]); + assertEquals("longitude", expected[0], got[0], GridReferenceValues.TOL_DEG); + assertEquals("latitude", expected[1], got[1], GridReferenceValues.TOL_DEG); + } + + private static Path onDisk(String name) { + for (String prefix : new String[]{ResourceResolvers.GRID_PREFIX, + ResourceResolvers.LEGACY_GRID_PREFIX}) { + java.net.URL url = ShippedGridsSurviveTheBoundsTest.class.getResource( + "/" + prefix + "/" + name); + if (url == null || !"file".equals(url.getProtocol())) { + continue; + } + try { + return Paths.get(url.toURI()); + } catch (Exception e) { + return null; + } + } + return null; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/identity/DatumIdentityTest.java b/core/src/test/java/org/locationtech/proj4j/identity/DatumIdentityTest.java new file mode 100644 index 0000000..c70a225 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/identity/DatumIdentityTest.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.identity; + +import org.junit.Test; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.datum.Ellipsoid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +/** + * Pins {@link Datum#isEqual(Datum)}, which is the predicate + * {@code BasicCoordinateTransform.datumTransform} uses to decide whether to skip the datum shift + * entirely. + *

+ * The right-hand side of the ellipsoid-size check used to name {@code this.ellipsoid} on both + * sides, so the condition was always false, the eccentricity-tolerance check underneath it was + * dead, and two datums whose ellipsoids were different sizes could compare equal. + */ +public class DatumIdentityTest { + + /** + * The direct regression: two 3-parameter datums with identical (zero) transforms but + * differently sized ellipsoids. Both report {@code TYPE_3PARAM}, both have identical transform + * arrays, and the only thing telling them apart is the equator radius -- which is exactly what + * the self-comparison discarded. + */ + @Test + public void datumsWithDifferentlySizedEllipsoidsAreNotEqual() { + // Clarke 1866: a = 6378206.4. GRS80: a = 6378137.0. A 69 m difference in radius. + Datum clarke = new Datum("d-clarke", 0, 0, 0, Ellipsoid.CLARKE_1866, "Clarke 1866 based"); + Datum international = new Datum("d-intl", 0, 0, 0, Ellipsoid.INTERNATIONAL, "International based"); + + assertNotEquals("fixture ellipsoids must differ in size", + Ellipsoid.CLARKE_1866.getEquatorRadius(), Ellipsoid.INTERNATIONAL.getEquatorRadius(), 0.0); + assertEquals("fixture must isolate the ellipsoid: same transform type", + clarke.getTransformType(), international.getTransformType()); + assertEquals(Datum.TYPE_3PARAM, clarke.getTransformType()); + + assertFalse("datums with differently sized ellipsoids must not be equal", + clarke.isEqual(international)); + assertFalse("isEqual must be symmetric", international.isEqual(clarke)); + } + + /** + * The ellipsoid-shape check as a whole, which the typo made unreachable: two datums whose + * ellipsoids differ in both equator radius and eccentricity (by far more than + * {@link Datum#ELLIPSOID_E2_TOLERANCE}) must not be equal. Before the fix this returned true. + *

+ * Deliberately does not pin the "radius differs but eccentricity is within tolerance" + * case. proj4j nests the eccentricity check inside the differing-radius branch, so that pair + * still compares equal; upstream's {@code pj_compare_datums} (PROJ 5.2.0 + * {@code src/pj_transform.c}) combines the two with {@code ||} and so calls it unequal. Pinning + * proj4j's nesting here would block that alignment. + */ + @Test + public void ellipsoidShapeCheckIsLive() { + // Deliberately not 6378137: an ellipsoid of exactly WGS84/GRS80 size and eccentricity + // reports TYPE_WGS84 rather than TYPE_3PARAM, which would short-circuit isEqual earlier. + double a = 6377000.0; + double baseE2 = Ellipsoid.GRS80.getEccentricitySquared(); + + Ellipsoid base = new Ellipsoid("base", a, baseE2, "base"); + Ellipsoid biggerFarE2 = new Ellipsoid( + "outside", a + 1.0, baseE2 + Datum.ELLIPSOID_E2_TOLERANCE * 1000.0, "outside"); + + Datum d0 = new Datum("d0", 0, 0, 0, base, "d0"); + Datum dFar = new Datum("dFar", 0, 0, 0, biggerFarE2, "dFar"); + + assertEquals(Datum.TYPE_3PARAM, d0.getTransformType()); + assertEquals(Datum.TYPE_3PARAM, dFar.getTransformType()); + + assertFalse("differing radius and eccentricity -> not equal", d0.isEqual(dFar)); + assertFalse("isEqual must be symmetric", dFar.isEqual(d0)); + assertTrue("a datum must still equal an identically shaped one", d0.isEqual( + new Datum("d0-copy", 0, 0, 0, new Ellipsoid("copy", a, baseE2, "copy"), "d0-copy"))); + } + + /** The fix must not stop a datum from equalling itself, or an identical copy of itself. */ + @Test + public void identicalDatumsRemainEqual() { + Datum a = new Datum("nad83-copy", 0, 0, 0, Ellipsoid.GRS80, "North_American_Datum_1983"); + Datum b = new Datum("nad83-copy", 0, 0, 0, Ellipsoid.GRS80, "North_American_Datum_1983"); + + assertTrue(a.isEqual(a)); + assertTrue(a.isEqual(b)); + assertTrue(b.isEqual(a)); + + assertTrue(Datum.WGS84.isEqual(Datum.WGS84)); + assertTrue("WGS84 and NAD83 are both TYPE_WGS84 with GRS80-sized ellipsoids", + Datum.WGS84.isEqual(Datum.NAD83)); + + // Differently sized ellipsoids, differing 7-parameter transforms: unequal either way. + assertFalse(Datum.POTSDAM.isEqual(Datum.HERMANNSKOGEL)); + assertFalse(Datum.HERMANNSKOGEL.isEqual(Datum.POTSDAM)); + } + + /** + * A 7-parameter datum whose transform array matches another's but whose ellipsoid is a + * different size. Under the typo this returned true and the datum shift was skipped outright, + * so the coordinate came back as an echo of the input. + */ + @Test + public void sevenParameterDatumsAreDistinguishedByEllipsoidSize() { + Datum onBessel = new Datum("seven-bessel", 598.1, 73.7, 418.2, 0.202, 0.045, -2.455, 6.7, + Ellipsoid.BESSEL, "seven on Bessel"); + Datum onAiry = new Datum("seven-airy", 598.1, 73.7, 418.2, 0.202, 0.045, -2.455, 6.7, + Ellipsoid.AIRY, "seven on Airy"); + + assertEquals(Datum.TYPE_7PARAM, onBessel.getTransformType()); + assertEquals(Datum.TYPE_7PARAM, onAiry.getTransformType()); + assertNotEquals(Ellipsoid.BESSEL.getEquatorRadius(), Ellipsoid.AIRY.getEquatorRadius(), 0.0); + + assertFalse(onBessel.isEqual(onAiry)); + assertFalse(onAiry.isEqual(onBessel)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/identity/ProjectionIdentityTest.java b/core/src/test/java/org/locationtech/proj4j/identity/ProjectionIdentityTest.java new file mode 100644 index 0000000..6230f45 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/identity/ProjectionIdentityTest.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.identity; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.proj.Projection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +/** + * Pins the {@code equals}/{@code hashCode} contract on {@link Projection}, which is used as a + * cache key (directly, and transitively through {@code CoordinateReferenceSystem}). + */ +public class ProjectionIdentityTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + + private static Projection proj(String params) { + return CRS_FACTORY.createFromParameters(null, params).getProjection(); + } + + /** + * {@code Projection.unit} is null unless {@code +units=} was given or + * {@code LongLatProjection.initialize()} ran, so {@code unit.equals(p.unit)} threw + * NullPointerException for every projected CRS defined without {@code +units=}. + */ + @Test + public void equalsDoesNotThrowForProjectedCrsWithoutUnits() { + Projection noUnits = proj("+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +no_defs"); + assertNull("fixture must actually leave the unit field unset", unitField(noUnits)); + + // Reflexive, and against a separately parsed instance of the same definition. + assertEquals(noUnits, noUnits); + Projection sameAgain = proj("+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +no_defs"); + assertEquals(noUnits, sameAgain); + assertEquals(noUnits.hashCode(), sameAgain.hashCode()); + + // And against one that does carry +units=, in both directions. + Projection withMetres = + proj("+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs"); + assertNotNull(unitField(withMetres)); + assertEquals("an absent +units= defaults to metres", noUnits, withMetres); + assertEquals(withMetres, noUnits); + assertEquals(noUnits.hashCode(), withMetres.hashCode()); + + // A different unit must still be distinguished. + Projection withFeet = + proj("+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=ft +no_defs"); + assertNotEquals(noUnits, withFeet); + assertNotEquals(withFeet, noUnits); + } + + /** + * A CRS defined without {@code +units=} must survive being used as a hash key, including + * across a bucket collision. This is the failure mode the NPE actually produced in the wild: + * a {@code HashMap} keyed on a CRS that blows up on the first collision rather than on insert. + */ + @Test + public void projectedCrsWithoutUnitsWorksAsAHashKey() { + // NOTE: deliberately keyed on Projection, not on CoordinateReferenceSystem. A + // HashMap still misses on lookup, for a separate reason + // that lives outside this change: CoordinateReferenceSystem.equals compares datums with + // Datum.isEqual while its hashCode is Objects.hash(datum, proj), and Datum overrides + // neither equals nor hashCode -- so two separately parsed but equal CRSs hash to two + // different identity hashes. That is a real equals/hashCode contract violation in + // CoordinateReferenceSystem.java and is not pinned here. + Map map = new HashMap(); + + // Enough distinct definitions that some pair shares a bucket; every put and get walks + // the bucket chain and calls equals against whatever else landed there. + for (int zone = 1; zone <= 60; zone++) { + double lon = (zone - 1) * 6 - 177; + String noUnits = "+proj=tmerc +lat_0=0 +lon_0=" + lon + + " +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +no_defs"; + map.put(proj(noUnits), "zone" + zone); + } + assertEquals(60, map.size()); + + for (int zone = 1; zone <= 60; zone++) { + double lon = (zone - 1) * 6 - 177; + String noUnits = "+proj=tmerc +lat_0=0 +lon_0=" + lon + + " +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +no_defs"; + assertEquals("zone" + zone, map.get(proj(noUnits))); + } + + // Force collisions explicitly by inserting into a set sized to one bucket. + Set set = new HashSet(1); + for (int zone = 1; zone <= 60; zone++) { + double lon = (zone - 1) * 6 - 177; + set.add(proj("+proj=tmerc +lat_0=0 +lon_0=" + lon + + " +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +no_defs")); + } + assertEquals(60, set.size()); + } + + /** + * {@code setRadius} (i.e. {@code +R=}) mutates the equator radius without touching the + * ellipsoid, so {@code +R} must be part of equality in its own right. + */ + @Test + public void projectionsDifferingOnlyByRadiusAreNotEqual() { + String base = "+proj=merc +lon_0=0 +x_0=0 +y_0=0 +units=m +no_defs"; + Projection earth = proj(base + " +R=6371000"); + Projection slightlyBigger = proj(base + " +R=6378137"); + + assertEquals("+R must actually reach the projection", 6371000.0, earth.getEquatorRadius(), 0.0); + assertEquals(6378137.0, slightlyBigger.getEquatorRadius(), 0.0); + + assertNotEquals(earth, slightlyBigger); + assertNotEquals(slightlyBigger, earth); + assertNotEquals(earth.hashCode(), slightlyBigger.hashCode()); + + // ... and two identical +R definitions must still agree. + Projection earthAgain = proj(base + " +R=6371000"); + assertEquals(earth, earthAgain); + assertEquals(earth.hashCode(), earthAgain.hashCode()); + } + + /** + * {@code setRadius} must make a projection unequal to the one it was cloned from — the + * conclusion this test has always been about, since {@code Projection} is a cache key and a + * resized projection projects differently. + * + *

The premise changed under it, and the premise was never the point

+ * + *

This test's scaffolding used to assert {@code setRadius must not touch the ellipsoid}, + * because at the time {@code setRadius} assigned the semi-major axis alone. That was + * the {@code +R} defect: {@code e}, {@code es} and {@code ellipsoid} stayed stale, so + * {@code spherical} stayed {@code false} and the ellipsoidal formula ran on a declared sphere — + * northing wrong by ~1,495 m at 2 degrees and ~35,000 m at 55 degrees. The scaffolding existed + * only to establish that {@code a} was then the sole difference, which is what made + * "{@code equals} saw only the ellipsoid" the interesting failure. + * + *

{@code setRadius} now declares a genuine sphere ({@code 9.8.1:src/ell_set.cpp:92-100}), so + * the ellipsoid is replaced. The assertion is inverted rather than deleted: kept as + * {@code assertEquals} it pins a defect that has been fixed, and deleted it would leave the + * three assertions below with no stated premise at all. Inverted, it says the true and + * load-bearing thing — {@code +R} reaches the ellipsoid — which is exactly the property whose + * absence caused the km-scale error. + */ + @Test + public void setRadiusAloneMakesProjectionsUnequal() { + String def = "+proj=merc +lon_0=0 +ellps=GRS80 +units=m +no_defs"; + Projection untouched = proj(def); + Projection resized = proj(def); + resized.setRadius(6371000.0); + + assertNotEquals("setRadius must replace the ellipsoid with a sphere, not just move a", + untouched.getEllipsoid(), resized.getEllipsoid()); + assertEquals("and that sphere must have zero eccentricity", + 0.0, resized.getEllipsoid().getEccentricitySquared(), 0.0); + assertNotEquals(untouched.getEquatorRadius(), resized.getEquatorRadius(), 0.0); + + assertNotEquals(untouched, resized); + assertNotEquals(resized, untouched); + assertNotEquals(untouched.hashCode(), resized.hashCode()); + } + + /** Alpha and lonc are NaN by default, and must not make a projection unequal to itself. */ + @Test + public void alphaAndLoncParticipateInEqualityWithoutBreakingTheNaNDefault() { + Projection a = proj("+proj=omerc +lat_0=4 +lonc=115 +alpha=53 +k=0.99984 " + + "+x_0=590476.87 +y_0=442857.65 +ellps=GRS80 +units=m +no_defs"); + Projection b = proj("+proj=omerc +lat_0=4 +lonc=115 +alpha=53 +k=0.99984 " + + "+x_0=590476.87 +y_0=442857.65 +ellps=GRS80 +units=m +no_defs"); + Projection differentAlpha = proj("+proj=omerc +lat_0=4 +lonc=115 +alpha=54 +k=0.99984 " + + "+x_0=590476.87 +y_0=442857.65 +ellps=GRS80 +units=m +no_defs"); + Projection differentLonc = proj("+proj=omerc +lat_0=4 +lonc=116 +alpha=53 +k=0.99984 " + + "+x_0=590476.87 +y_0=442857.65 +ellps=GRS80 +units=m +no_defs"); + + assertEquals(a, b); + assertEquals(a.hashCode(), b.hashCode()); + assertNotEquals(a, differentAlpha); + assertNotEquals(a, differentLonc); + + // Both alpha and lonc left at their NaN default. + Projection noAlpha = proj("+proj=merc +lon_0=0 +ellps=GRS80 +units=m +no_defs"); + Projection noAlphaAgain = proj("+proj=merc +lon_0=0 +ellps=GRS80 +units=m +no_defs"); + assertTrue("fixture must leave alpha at NaN", Double.isNaN(noAlpha.getAlpha())); + assertTrue("fixture must leave lonc at NaN", Double.isNaN(noAlpha.getLonC())); + assertEquals(noAlpha, noAlphaAgain); + assertEquals(noAlpha.hashCode(), noAlphaAgain.hashCode()); + } + + /** + * equals and hashCode must stay consistent across a spread of real definitions: any two that + * compare equal must hash the same. Notably, {@code equals} compares ellipsoids with + * {@code Ellipsoid.isEqual} (radius and eccentricity only, ignoring the name), so hashing the + * {@code Ellipsoid} object -- whose own hashCode includes its name -- was a live violation. + */ + @Test + public void equalsAndHashCodeAreConsistent() { + String[] definitions = { + "+proj=merc +lon_0=0 +ellps=GRS80 +units=m +no_defs", + "+proj=merc +lon_0=0 +ellps=WGS84 +units=m +no_defs", + "+proj=merc +lon_0=0 +a=6378137 +rf=298.257222101 +units=m +no_defs", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +no_defs", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs", + "+proj=cass +lat_0=2.1216797444 +lon_0=103.4279362361 +x_0=-14810.562 +y_0=8758.32 " + + "+ellps=GRS80 +units=m +no_defs", + "+proj=cass +lat_0=2.1216797444 +lon_0=103.4279362361 +x_0=-14810.562 +y_0=8758.32 " + + "+ellps=GRS80 +no_defs", + "+proj=lcc +lat_1=45 +lat_2=50 +lat_0=47 +lon_0=10 +ellps=GRS80 +units=m +no_defs", + "+proj=lcc +lat_1=45 +lat_2=50 +lat_0=47 +lon_0=11 +ellps=GRS80 +units=m +no_defs", + "+proj=utm +zone=33 +datum=WGS84 +units=m +no_defs", + "+proj=utm +zone=33 +south +datum=WGS84 +units=m +no_defs", + "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=0 +ellps=WGS84 +units=m +no_defs", + "+proj=longlat +datum=WGS84 +no_defs", + "+proj=merc +lon_0=0 +R=6371000 +units=m +no_defs", + "+proj=merc +lon_0=0 +R=6378137 +units=m +no_defs", + }; + + Projection[] ps = new Projection[definitions.length]; + for (int i = 0; i < definitions.length; i++) { + ps[i] = proj(definitions[i]); + } + + for (int i = 0; i < ps.length; i++) { + // Reflexive, and stable across two parses of the same string. + Projection reparsed = proj(definitions[i]); + assertEquals(definitions[i], ps[i], reparsed); + assertEquals(definitions[i], ps[i].hashCode(), reparsed.hashCode()); + + for (int j = 0; j < ps.length; j++) { + boolean eq = ps[i].equals(ps[j]); + assertEquals("equals must be symmetric: [" + definitions[i] + "] vs [" + + definitions[j] + "]", eq, ps[j].equals(ps[i])); + if (eq) { + assertEquals("equal projections must share a hashCode: [" + definitions[i] + + "] vs [" + definitions[j] + "]", ps[i].hashCode(), ps[j].hashCode()); + } + } + } + } + + /** Reads the private {@code unit} field, to prove a fixture really leaves it null. */ + private static Object unitField(Projection p) { + try { + java.lang.reflect.Field f = Projection.class.getDeclaredField("unit"); + f.setAccessible(true); + return f.get(p); + } catch (ReflectiveOperationException e) { + throw new AssertionError("Projection.unit is expected to exist", e); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/InitFileCacheTest.java b/core/src/test/java/org/locationtech/proj4j/io/InitFileCacheTest.java new file mode 100644 index 0000000..fe7521a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/InitFileCacheTest.java @@ -0,0 +1,783 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.io; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.util.Pair; + +/** + * {@link InitFileCache} against the streaming scan it replaced. + * + *

Why the controls are shaped the way they are

+ * + *

The hazard this change introduces is not a crash, it is a silently wrong CRS. Two + * different comparisons live one line apart in the code it replaces: the resource name is the + * authority lowercased with {@code Locale.ROOT}, and the code inside the file was matched with + * case-sensitive {@code String.equals}. Fold the second and {@code EPSG:4326} starts answering for + * something else, in a library that runs per row with untrusted input. + * + *

So the load-bearing test here is exhaustive: every code in every shipped dictionary, + * through the cache, compared against an independently built reference of the same file, plus a + * stride sample compared against the genuine legacy {@code streamParametersFromFile}. And because + * an exhaustive comparison that cannot fail is worth nothing, + * {@link #theExhaustiveComparisonDetectsAWrongKey()} runs the same comparison against a + * deliberately case-folded index and requires it to report violations - naming the codes. + * + *

The other half of the discipline: every bound is shown rejecting something and shown + * accepting legitimate input. A cache that refuses everything passes all the hostile tests + * and breaks the library. + */ +public class InitFileCacheTest { + + /** The dictionaries {@code proj4j-epsg} ships, by their lowercased resource-name suffix. */ + private static final String[] SHIPPED = {"epsg", "esri", "world", "nad83", "nad27"}; + + /** Stride for the sample compared against the genuine legacy scan, which is O(file) per call. */ + private static final int LEGACY_SAMPLE_STRIDE = 113; + + // ========================================================================================== + // The load-bearing equivalence, and the proof that it can fail + // ========================================================================================== + + /** + * Every code in every shipped dictionary resolves through the cache to exactly what the file + * says, and a stride sample resolves to exactly what the legacy streaming scan returns. + */ + @Test + public void everyCodeInEveryShippedDictionaryResolvesAsTheStreamingScanDid() throws Exception { + InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + Proj4FileReader reader = new Proj4FileReader(cache); + + int totalCodes = 0; + int legacyChecked = 0; + List violations = new ArrayList(); + + for (int f = 0; f < SHIPPED.length; f++) { + String file = SHIPPED[f]; + LinkedHashMap reference = referenceForward(file); + assertFalse("reference parse of proj4/nad/" + file + " found no entries, so every " + + "comparison against it below is vacuous", reference.isEmpty()); + + int i = 0; + for (Map.Entry e : reference.entrySet()) { + String code = e.getKey(); + String[] expected = e.getValue(); + String[] actual = reader.readParametersFromFile(file, code); + if (!Arrays.equals(expected, actual)) { + violations.add(file + ":" + code + " expected " + Arrays.toString(expected) + + " got " + Arrays.toString(actual)); + } + totalCodes++; + + if (i % LEGACY_SAMPLE_STRIDE == 0) { + String[] legacy = reader.streamParametersFromFile(file, code); + if (!Arrays.equals(legacy, actual)) { + violations.add("LEGACY " + file + ":" + code + " streaming " + + Arrays.toString(legacy) + " cached " + Arrays.toString(actual)); + } + legacyChecked++; + } + i++; + } + } + + // Coverage floors. A comparison that ran over nothing reports clean. + assertTrue("only " + totalCodes + " codes were compared; the shipped dictionaries carry " + + "thousands, so the walk did not reach them", totalCodes > 5000); + assertTrue("only " + legacyChecked + " codes were compared against the genuine legacy " + + "scan", legacyChecked >= 40); + assertTrue(violations.size() + " of " + totalCodes + " codes resolved differently through " + + "the cache: " + head(violations), violations.isEmpty()); + } + + /** + * The positive control for the test above. Run the identical comparison against an index whose + * code key has been case-folded - the one plausible way to get this wrong - and require + * it to report violations, naming them. If it reports clean, the exhaustive test proves nothing. + */ + @Test + public void theExhaustiveComparisonDetectsAWrongKey() throws Exception { + Proj4FileReader reader = + new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + + int wrongKeyHits = 0; + int filesWithLetterCodes = 0; + for (int f = 0; f < SHIPPED.length; f++) { + String file = SHIPPED[f]; + LinkedHashMap reference = referenceForward(file); + assertFalse("reference parse of " + file + " is empty", reference.isEmpty()); + + // The wrong key: fold the code. Exactly the mistake the two comparisons - one + // Locale.ROOT-lowercased, one case-sensitive - sitting fifty lines apart invite. + Map folded = new java.util.HashMap(); + for (Map.Entry e : reference.entrySet()) { + String k = e.getKey().toLowerCase(java.util.Locale.ROOT); + if (!folded.containsKey(k)) { + folded.put(k, e.getValue()); + } + } + + boolean sawLetterCode = false; + for (Map.Entry e : reference.entrySet()) { + String shouted = e.getKey().toUpperCase(java.util.Locale.ROOT); + if (shouted.equals(e.getKey())) { + continue; + } + sawLetterCode = true; + // The folded index ANSWERS this lookup ... + assertNotNull("the case-folded index did not answer " + file + ":" + shouted + + ", so it does not model the failure mode", + folded.get(shouted.toLowerCase(java.util.Locale.ROOT))); + wrongKeyHits++; + // ... and production must MISS it. + assertNull(file + ":" + shouted + " must not resolve - the code comparison is " + + "case-sensitive and folding it returns the WRONG CRS", + reader.readParametersFromFile(file, shouted)); + assertNull("the legacy scan agrees about " + file + ":" + shouted, + reader.streamParametersFromFile(file, shouted)); + } + if (sawLetterCode) { + filesWithLetterCodes++; + } + } + assertTrue("no shipped dictionary has a code containing a letter, so this control cannot " + + "distinguish a case-folded index from a case-sensitive one and every " + + "case-sensitivity claim here is unproven", wrongKeyHits > 0); + assertTrue("only " + filesWithLetterCodes + " dictionaries carried a letter-bearing code", + filesWithLetterCodes >= 1); + } + + // ========================================================================================== + // Key semantics: the authority folds, the code does not + // ========================================================================================== + + /** {@code epsg:4326} and {@code EPSG:4326} behave exactly as they did: same definition. */ + @Test + public void theAuthorityIsCaseInsensitiveAndTheCodeIsNot() throws Exception { + Proj4FileReader reader = new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + + String[] upper = reader.readParametersFromFile("EPSG", "4326"); + String[] lower = reader.readParametersFromFile("epsg", "4326"); + String[] mixed = reader.readParametersFromFile("EpSg", "4326"); + assertNotNull("EPSG:4326 must resolve", upper); + assertTrue("EPSG:4326 came back empty", upper.length > 0); + assertArrayEquals2("epsg vs EPSG", upper, lower); + assertArrayEquals2("epsg vs EpSg", upper, mixed); + + // ... and through the factory, which is how a consumer meets it. + CRSFactory factory = new CRSFactory(); + CoordinateReferenceSystem a = factory.createFromName("EPSG:4326"); + CoordinateReferenceSystem b = factory.createFromName("epsg:4326"); + assertArrayEquals2("CRSFactory EPSG vs epsg", a.getParameters(), b.getParameters()); + + // The code is NOT folded and must not become so. world:palestine is real; PALESTINE is not. + assertNotNull("world:palestine must resolve", + reader.readParametersFromFile("world", "palestine")); + assertNull("world:PALESTINE must NOT resolve; folding the code returns the wrong CRS", + reader.readParametersFromFile("world", "PALESTINE")); + // ... and the legacy scan agrees, so this is the pre-existing contract, not a new one. + assertNull("the legacy scan also misses world:PALESTINE", + reader.streamParametersFromFile("world", "PALESTINE")); + + // Trailing whitespace was never trimmed and still is not. + assertNull("EPSG:'4326 ' must not resolve", reader.readParametersFromFile("EPSG", "4326 ")); + } + + /** + * The authority folds with {@code Locale.ROOT}, and under a Turkish default locale that is the + * difference between {@code ESRI} resolving and every ESRI-authority definition in the library + * becoming unreachable. + * + *

{@code "ESRI".toLowerCase()} under {@code tr-TR} maps {@code 'I'} to dotless {@code 'ı'} + * (U+0131), so the resource name becomes {@code proj4/nad/esrı} and never resolves. The claim + * that this is handled lived only in a javadoc comment until this test; the comment is not an + * instrument. + * + *

The control is inside the test: it first asserts that the default-locale rule + * does produce a different string here - otherwise the locale was not actually installed + * and the assertions below hold for a reason that has nothing to do with the code. + */ + @Test + public void theAuthorityFoldsUnderLocaleRootNotTheDefaultLocale() throws Exception { + Locale previous = Locale.getDefault(); + try { + Locale.setDefault(new Locale("tr", "TR")); + + // Control: prove the hostile locale is really in force and really is hostile. If these + // are equal, this JVM cannot distinguish the two foldings and the test proves nothing. + assertFalse("the tr-TR default locale did not change how 'ESRI' lowercases, so this " + + "test cannot detect a default-locale fold and is vacuous", + "ESRI".toLowerCase().equals("ESRI".toLowerCase(Locale.ROOT))); + assertEquals("esri", "ESRI".toLowerCase(Locale.ROOT)); + + Proj4FileReader reader = + new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + + // An authority whose lowercasing is locale-sensitive must still resolve. + String[] esri = reader.readParametersFromFile("ESRI", "37001"); + assertNotNull("ESRI:37001 became unreachable under a tr-TR default locale: the " + + "authority is being folded with the default locale, not Locale.ROOT", esri); + assertArrayEquals2("ESRI under tr-TR vs esri", esri, + reader.readParametersFromFile("esri", "37001")); + assertArrayEquals2("the cached path and the legacy scan agree under tr-TR", esri, + reader.streamParametersFromFile("esri", "37001")); + + // And the factory, which is how a consumer meets it. + assertNotNull("CRSFactory lost ESRI:37001 under a tr-TR default locale", + new CRSFactory().createFromName("ESRI:37001")); + } finally { + Locale.setDefault(previous); + } + } + + // ========================================================================================== + // Misses must not poison + // ========================================================================================== + + /** + * A bogus authority fails, fails the same way on the second call, and leaves every real + * dictionary answering correctly. The cached failure is the point - one classpath probe per + * bogus authority instead of one per row - so both halves matter. + */ + @Test + public void aBogusAuthorityFailsIdenticallyTwiceAndPoisonsNothing() throws Exception { + InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + Proj4FileReader reader = new Proj4FileReader(cache); + + String[] before = reader.readParametersFromFile("EPSG", "4326"); + assertNotNull(before); + + String first = expectMissingResource(reader, "bogus", "1"); + String second = expectMissingResource(reader, "bogus", "1"); + assertEquals("the replayed failure must be the same failure", first, second); + assertEquals("the message must still name the resource it could not open", + "Unable to access CRS file: proj4/nad/bogus", first); + + // The failure was cached, not re-probed. + assertEquals("a repeated bogus authority must not re-probe the classpath", + 1L, cache.missCount() - 1L /* the epsg load above */); + + assertArrayEquals2("EPSG:4326 after a bogus lookup", before, + reader.readParametersFromFile("EPSG", "4326")); + } + + /** An unknown code inside a known file returns null and leaves the file usable. */ + @Test + public void anUnknownCodeReturnsNullAndPoisonsNothing() throws Exception { + Proj4FileReader reader = new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + String[] before = reader.readParametersFromFile("EPSG", "4326"); + + assertNull("epsg:999999999 must not resolve", + reader.readParametersFromFile("EPSG", "999999999")); + assertNull("the legacy scan agrees", reader.streamParametersFromFile("epsg", "999999999")); + + assertArrayEquals2("EPSG:4326 after a missing-code lookup", before, + reader.readParametersFromFile("EPSG", "4326")); + } + + /** {@code CRSFactory} still reports both flavours of miss the way it always has. */ + @Test + public void theFactoryStillReportsBothFlavoursOfMiss() { + CRSFactory factory = new CRSFactory(); + try { + factory.createFromName("bogus:1"); + fail("bogus:1 must not resolve to a CRS"); + } catch (IllegalStateException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().startsWith("Unable to access CRS file:")); + } + try { + factory.createFromName("EPSG:999999999"); + fail("EPSG:999999999 must not resolve to a CRS"); + } catch (RuntimeException expected) { + assertTrue("expected an unknown-code report, got " + expected, + expected.getMessage().contains("999999999")); + } + // ... and the factory still works afterwards. + assertNotNull(factory.createFromName("EPSG:4326")); + } + + // ========================================================================================== + // The shared array. This is the one that turns a cache into a wrong answer. + // ========================================================================================== + + /** + * {@code readParametersFromFile} hands out a copy, and the test proves it can tell the + * difference: corrupting the cached array is shown to be observable, which is exactly + * what would happen without the copy. + */ + @Test + public void theReturnedArrayIsACopyAndCorruptionWouldOtherwiseBeVisible() throws Exception { + InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + Proj4FileReader reader = new Proj4FileReader(cache); + + String[] first = reader.readParametersFromFile("EPSG", "4326"); + String[] second = reader.readParametersFromFile("EPSG", "4326"); + assertFalse("two lookups returned the SAME array object; a caller mutating " + + "CoordinateReferenceSystem.getParameters() would corrupt the dictionary " + + "process-wide", first == second); + + String original = first[0]; + first[0] = "+proj=CORRUPTED"; + String[] third = reader.readParametersFromFile("EPSG", "4326"); + assertEquals("mutating a returned array changed a later lookup", original, third[0]); + + // Positive control: the assertion above is only meaningful if corrupting the CACHED array + // really would be visible. Prove it on this throwaway cache, then confirm the throwaway is + // genuinely separate from the shared one. + InitFileCache victim = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + Proj4FileReader victimReader = new Proj4FileReader(victim); + InitFileCache.Dictionary dict = victim.get("epsg"); + String[] cached = dict.parameters("4326"); + assertNotNull(cached); + cached[0] = "+proj=CORRUPTED"; + assertEquals("corrupting the cached array is NOT observable, so the copy assertion above " + + "is vacuous - the instrument cannot detect the failure it guards against", + "+proj=CORRUPTED", victimReader.readParametersFromFile("EPSG", "4326")[0]); + + assertEquals("the throwaway cache leaked into the one under test", original, + reader.readParametersFromFile("EPSG", "4326")[0]); + } + + // ========================================================================================== + // Fixtures: duplicates and a malformed entry + // ========================================================================================== + + /** + * First match wins in both directions, and the reverse index sees entries the forward index + * dropped. Built from the forward map instead, the reverse lookup below would answer {@code B}. + */ + @Test + public void duplicateEntriesKeepTheFirstForwardAndTheFirstInFileOrderInReverse() + throws Exception { + Proj4FileReader reader = new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + + String[] a = reader.readParametersFromFile("proj4jtestdupes", "A"); + assertNotNull("the fixture proj4/nad/proj4jtestdupes is not on the test classpath", a); + assertEquals("[+proj=longlat, +datum=WGS84]", Arrays.toString(a)); + assertArrayEquals2("cached vs streaming for the duplicated code", a, + reader.streamParametersFromFile("proj4jtestdupes", "A")); + + String[] merc = {"+proj=merc", "+datum=WGS84"}; + // The whole-file scan reached 's SECOND parameter set before 's identical one. + assertEquals("the reverse index must be fed from the entry stream, not from the forward " + + "map - otherwise A's second parameter set is invisible and this answers B", + "A", reverseIn("proj4jtestdupes", merc)); + } + + /** + * A malformed entry is a deferred failure: names before it still resolve, names that would + * have required scanning past it still throw - and the cached and streaming paths agree on + * both, which is the only way to know the semantics were preserved rather than guessed. + */ + @Test + public void aMalformedEntryFailsExactlyWhereTheStreamingScanFailed() throws Exception { + Proj4FileReader reader = new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + + String[] good = reader.readParametersFromFile("proj4jtestmalformed", "good"); + assertNotNull("the fixture proj4/nad/proj4jtestmalformed is not on the test classpath", good); + assertArrayEquals2("an entry before the malformed one must resolve, as it always did", + reader.streamParametersFromFile("proj4jtestmalformed", "good"), good); + + String cachedFailure = expectIoFailure(reader, "proj4jtestmalformed", "after"); + String streamingFailure; + try { + reader.streamParametersFromFile("proj4jtestmalformed", "after"); + streamingFailure = null; + } catch (IOException e) { + streamingFailure = e.getMessage(); + } + assertNotNull("the streaming scan did not fail on the malformed fixture, so the fixture " + + "does not exercise the deferred-failure path at all", streamingFailure); + assertEquals("the cached path must replay the streaming path's failure verbatim", + streamingFailure, cachedFailure); + + // Replayed identically, and the good entry still resolves after the failure. + assertEquals(cachedFailure, expectIoFailure(reader, "proj4jtestmalformed", "after")); + assertNotNull(reader.readParametersFromFile("proj4jtestmalformed", "good")); + } + + // ========================================================================================== + // The reverse index + // ========================================================================================== + + /** + * Every entry of every shipped dictionary, reverse-resolved through the cache's + * index and compared against an independently built reverse map of the same file. + * + *

The sampled test below is the one that runs against the genuine legacy scan, because that + * scan is O(file) per call and 9,000 of them would not be a unit test. This one closes the gap: + * the two together say "the index agrees with a from-scratch reading of the file everywhere, + * and a from-scratch reading agrees with the legacy scan on a spread sample". + */ + @Test + public void everyEntryReverseResolvesAsTheWholeFileScanWould() throws Exception { + InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + int compared = 0; + int nonNull = 0; + List violations = new ArrayList(); + + for (int f = 0; f < SHIPPED.length; f++) { + String file = SHIPPED[f]; + // The reference: first parameter set wins, in file order, over the WHOLE entry stream - + // duplicated codes included, which is what the old whole-file scan saw. + LinkedHashMap, String> referenceReverse = referenceReverse(file); + assertFalse("reference reverse parse of " + file + " is empty", + referenceReverse.isEmpty()); + + InitFileCache.Dictionary dict = cache.get(file); + for (Map.Entry, String> e : referenceReverse.entrySet()) { + String[] params = e.getKey().toArray(new String[e.getKey().size()]); + String expected = e.getValue(); + String actual = dict.codeForParameters(params); + if (!expected.equals(actual)) { + violations.add(file + " " + e.getKey() + ": expected " + expected + + " got " + actual); + } + if (actual != null) { + nonNull++; + } + compared++; + } + } + assertTrue("only " + compared + " reverse lookups were compared", compared > 5000); + assertTrue("every reverse lookup returned null", nonNull > compared / 2); + assertTrue(violations.size() + " of " + compared + " reverse lookups disagreed: " + + head(violations), violations.isEmpty()); + } + + /** A stride sample of the reverse lookup, against the genuine legacy whole-file scan. */ + @Test + public void theReverseLookupAgreesWithTheStreamingScan() throws Exception { + Proj4FileReader reader = new Proj4FileReader(new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)); + LinkedHashMap reference = referenceForward("epsg"); + + int checked = 0; + int nonNull = 0; + List violations = new ArrayList(); + int i = 0; + for (Map.Entry e : reference.entrySet()) { + if (i++ % LEGACY_SAMPLE_STRIDE != 0) { + continue; + } + String[] params = e.getValue(); + String cached = reader.readEpsgCodeFromFile(params); + String streaming = reader.streamEpsgCodeFromFile(params); + if (cached == null ? streaming != null : !cached.equals(streaming)) { + violations.add(e.getKey() + ": cached=" + cached + " streaming=" + streaming); + } + if (cached != null) { + nonNull++; + } + checked++; + } + assertTrue("only " + checked + " reverse lookups ran", checked >= 40); + assertTrue("every sampled reverse lookup returned null, so the comparison is vacuous", + nonNull > checked / 2); + assertTrue(violations.size() + " reverse lookups disagreed: " + head(violations), + violations.isEmpty()); + + // A parameter set that is in no dictionary entry must still miss, both ways. + String[] nonsense = {"+proj=not_a_projection", "+lat_0=1234"}; + assertNull(reader.readEpsgCodeFromFile(nonsense)); + assertNull(reader.streamEpsgCodeFromFile(nonsense)); + } + + // ========================================================================================== + // The bound: shown rejecting, and shown accepting + // ========================================================================================== + + /** ACCEPTING: the default budget holds every shipped dictionary with room to spare. */ + @Test + public void theDefaultBudgetHoldsEveryShippedDictionaryWithoutEvicting() throws Exception { + InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + Proj4FileReader reader = new Proj4FileReader(cache); + for (int i = 0; i < SHIPPED.length; i++) { + assertNotNull(cache.get(SHIPPED[i])); + } + assertEquals("all five dictionaries must be resident", SHIPPED.length, cache.size()); + assertEquals("nothing may be evicted at the default budget", 0L, cache.evictionCount()); + assertTrue("the five dictionaries account for " + cache.bytes() + " bytes, which is not " + + "below the " + InitFileCache.DEFAULT_MAX_BYTES + "-byte default budget", + cache.bytes() < InitFileCache.DEFAULT_MAX_BYTES); + // ... and they still answer. + assertNotNull(reader.readParametersFromFile("EPSG", "4326")); + assertNotNull(reader.readParametersFromFile("NAD27", "101")); + } + + /** REJECTING: a budget that fits one small dictionary evicts when a second arrives. */ + @Test + public void aTightBudgetEvictsAndStillAnswersCorrectly() throws Exception { + InitFileCache sizer = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + long nad27 = sizer.get("nad27").bytes; + long nad83 = sizer.get("nad83").bytes; + assertTrue("the sizer measured nad27 at 0 bytes", nad27 > 0); + assertTrue("the sizer measured nad83 at 0 bytes", nad83 > 0); + + InitFileCache tight = new InitFileCache(Math.max(nad27, nad83)); + Proj4FileReader reader = new Proj4FileReader(tight); + String[] a = reader.readParametersFromFile("NAD27", "101"); + String[] b = reader.readParametersFromFile("NAD83", "101"); + assertNotNull(a); + assertNotNull(b); + assertTrue("a budget of " + tight.maxBytes() + " bytes held both nad27 (" + nad27 + ") and " + + "nad83 (" + nad83 + ") without evicting, so the bound did nothing", + tight.evictionCount() > 0); + assertTrue("more than one dictionary is resident under a one-dictionary budget", + tight.size() <= 1); + + // ACCEPTING: eviction costs a re-parse, never an answer. + assertArrayEquals2("NAD27:101 after eviction", a, + reader.readParametersFromFile("NAD27", "101")); + assertArrayEquals2("NAD83:101 after eviction", b, + reader.readParametersFromFile("NAD83", "101")); + } + + /** + * REJECTING: the OOM vector. A flood of distinct untrusted authorities is bounded, and the + * real dictionaries still resolve afterwards. + */ + @Test + public void aFloodOfBogusAuthoritiesIsBounded() throws Exception { + long budget = 8 * InitFileCache.MISS_WEIGHT_BYTES; + InitFileCache cache = new InitFileCache(budget); + Proj4FileReader reader = new Proj4FileReader(cache); + + for (int i = 0; i < 500; i++) { + try { + reader.readParametersFromFile("bogus_authority_" + i, "1"); + fail("bogus_authority_" + i + " resolved"); + } catch (IllegalStateException expected) { + // expected + } + } + assertTrue("500 distinct bogus authorities left " + cache.size() + " entries resident " + + "under an 8-entry budget: the cache is not bounded on the untrusted key", + cache.size() <= 9); + assertTrue("nothing was evicted, so nothing was bounded", cache.evictionCount() >= 490); + + // ACCEPTING: a real dictionary still loads and answers after the flood. + assertNotNull("the flood broke real lookups", reader.readParametersFromFile("EPSG", "4326")); + } + + /** + * A dictionary larger than the whole budget is not cached; the reader streams it and still + * answers correctly. This is the escape hatch that keeps an unusually large user dictionary + * working instead of refusing it. + */ + @Test + public void anOversizedDictionaryFallsBackToStreaming() throws Exception { + InitFileCache tiny = new InitFileCache(100L); + Proj4FileReader reader = new Proj4FileReader(tiny); + assertSame("epsg must be far too large for a 100-byte budget", + InitFileCache.Dictionary.OVERSIZED, tiny.get("epsg")); + assertNotNull("the streaming fallback must still answer", reader.readParametersFromFile("EPSG", "4326")); + assertNotNull(reader.readEpsgCodeFromFile(reader.readParametersFromFile("EPSG", "4326"))); + } + + /** A zero budget disables caching outright - the control arm, and a supported escape hatch. */ + @Test + public void aZeroBudgetDisablesTheCacheEntirely() throws Exception { + InitFileCache off = new InitFileCache(0L); + Proj4FileReader reader = new Proj4FileReader(off); + assertSame(InitFileCache.Dictionary.OVERSIZED, off.get("epsg")); + assertEquals("a disabled cache must retain nothing", 0, off.size()); + assertNotNull(reader.readParametersFromFile("EPSG", "4326")); + // A missing authority must still fail the same way with the cache off. + assertEquals("Unable to access CRS file: proj4/nad/bogus", + expectMissingResource(reader, "bogus", "1")); + } + + // ========================================================================================== + // Concurrency + // ========================================================================================== + + /** One parse per file under concurrent demand, and every thread sees the same answer. */ + @Test + public void concurrentDemandParsesEachFileOnce() throws Exception { + final InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + final Proj4FileReader reader = new Proj4FileReader(cache); + final String[] expected = new Proj4FileReader( + new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES)) + .readParametersFromFile("EPSG", "4326"); + assertNotNull(expected); + + final int threads = 8; + final int perThread = 200; + final AtomicInteger mismatches = new AtomicInteger(); + ExecutorService pool = Executors.newFixedThreadPool(threads); + try { + List> futures = new ArrayList>(); + for (int t = 0; t < threads; t++) { + futures.add(pool.submit(new Callable() { + @Override + public Void call() throws Exception { + for (int i = 0; i < perThread; i++) { + String[] got = reader.readParametersFromFile("EPSG", "4326"); + if (!Arrays.equals(expected, got)) { + mismatches.incrementAndGet(); + } + } + return null; + } + })); + } + for (int i = 0; i < futures.size(); i++) { + futures.get(i).get(60, TimeUnit.SECONDS); + } + } finally { + pool.shutdownNow(); + } + assertEquals("threads disagreed about EPSG:4326", 0, mismatches.get()); + assertEquals("the epsg dictionary was parsed more than once under concurrent demand", + 1L, cache.missCount()); + assertEquals(1, cache.size()); + } + + // ========================================================================================== + // Helpers + // ========================================================================================== + + /** + * Parses a dictionary independently of the cache, keeping the first occurrence of each code, + * which is what the streaming scan returned. + */ + private static LinkedHashMap referenceForward(String file) throws IOException { + LinkedHashMap out = new LinkedHashMap(); + InputStream in = InitFileCacheTest.class.getClassLoader() + .getResourceAsStream("proj4/nad/" + file); + assertNotNull("proj4/nad/" + file + " is not on the test classpath", in); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + try { + StreamTokenizer t = Proj4FileReader.createTokenizer(reader); + t.nextToken(); + while (t.ttype == '<') { + Pair pair = Proj4FileReader.parseTokenizer(t); + @SuppressWarnings("unchecked") + List v = (List) pair.snd(); + if (!out.containsKey(pair.fst())) { + out.put(pair.fst(), v.toArray(new String[v.size()])); + } + } + } finally { + reader.close(); + } + return out; + } + + /** + * Parses a dictionary independently of the cache into parameter-set -> first code, over the + * whole entry stream, which is what {@code readEpsgCodeFromFile}'s scan saw. Keys are + * the parameter arrays joined with a delimiter no PROJ.4 token contains. + */ + private static LinkedHashMap, String> referenceReverse(String file) + throws IOException { + LinkedHashMap, String> out = new LinkedHashMap, String>(); + InputStream in = InitFileCacheTest.class.getClassLoader() + .getResourceAsStream("proj4/nad/" + file); + assertNotNull("proj4/nad/" + file + " is not on the test classpath", in); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + try { + StreamTokenizer t = Proj4FileReader.createTokenizer(reader); + t.nextToken(); + while (t.ttype == '<') { + Pair pair = Proj4FileReader.parseTokenizer(t); + @SuppressWarnings("unchecked") + List v = (List) pair.snd(); + // A fresh list, so the key is exactly the parameter sequence and shares nothing + // with the cache under test. A List key is used rather than a joined String + // because no delimiter is provably absent from a PROJ.4 token. + List key = new ArrayList(v); + if (!out.containsKey(key)) { + out.put(key, pair.fst()); + } + } + } finally { + reader.close(); + } + return out; + } + + /** The reverse lookup restricted to one fixture file, via the cache's own index. */ + private static String reverseIn(String file, String[] params) throws IOException { + // readEpsgCodeFromFile is hard-wired to "epsg", so reach the fixture's index directly. + InitFileCache cache = new InitFileCache(InitFileCache.DEFAULT_MAX_BYTES); + return cache.get(file).codeForParameters(params); + } + + private static String expectMissingResource(Proj4FileReader reader, String auth, String code) { + try { + reader.readParametersFromFile(auth, code); + fail(auth + ":" + code + " resolved but should not have"); + return null; + } catch (IllegalStateException e) { + return e.getMessage(); + } catch (IOException e) { + fail("expected IllegalStateException for a missing resource, got " + e); + return null; + } + } + + private static String expectIoFailure(Proj4FileReader reader, String auth, String code) { + try { + reader.readParametersFromFile(auth, code); + fail(auth + ":" + code + " did not fail"); + return null; + } catch (IOException e) { + return e.getMessage(); + } + } + + private static void assertArrayEquals2(String what, String[] expected, String[] actual) { + assertEquals(what + ": " + Arrays.toString(expected) + " vs " + Arrays.toString(actual), + Arrays.toString(expected), Arrays.toString(actual)); + } + + private static String head(List items) { + if (items.size() <= 10) { + return items.toString(); + } + return items.subList(0, 10) + " ... and " + (items.size() - 10) + " more"; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/MetaCRSTestCase.java b/core/src/test/java/org/locationtech/proj4j/io/MetaCRSTestCase.java index 872c223..81c136a 100755 --- a/core/src/test/java/org/locationtech/proj4j/io/MetaCRSTestCase.java +++ b/core/src/test/java/org/locationtech/proj4j/io/MetaCRSTestCase.java @@ -21,12 +21,95 @@ import org.locationtech.proj4j.util.CRSCache; import org.locationtech.proj4j.util.ProjectionUtil; +/** + * One row of a MetaCRS-format CSV, and the verdict that row asserts. + * + *

The four verdicts

+ * + *

The {@code testMethod} column (column 1) records what the row claims about Proj4J. Three + * values predate this class and are unchanged in meaning: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
the verdict vocabulary
{@code testMethod}satisfied whennote
{@code passing}a coordinate came back, within the row's tolerance
{@code failing}anything other than the abovea wrong number or a refusal — it does not distinguish them
{@code error}identical to {@code failing}never given a separate meaning by any runner
{@code refuses:}CAUSEthe transform threw, and {@link Proj4jException#cause()} was exactly CAUSEnew
{@code refuses}the transform threw, with any causenew; use only where the cause is genuinely not pinned
+ * + *

Why a fourth verdict rather than a twentieth column

+ * + *

{@code failing} conflates "Proj4J correctly refuses this row" with "Proj4J + * answers a wrong number", and those are the two outcomes the fail-closed work exists to + * separate. Reclassifying a row that must now throw from {@code passing} to {@code failing} turns + * a red build green while asserting nothing at all about the refusal: the same row stays + * green if a future change reverts to returning a plausible coordinate, because a wrong + * coordinate is also "not passing". + * + *

The distinction is added to the existing verdict column rather than as a new column, for + * three reasons in order of weight: + * + *

    + *
  1. A new column cannot be added without editing the committed CSVs. + * {@link MetaCRSTestFileReader#COL_COUNT} is 19 and every shipped file has exactly 19 + * columns; a twentieth would require rewriting {@code proj4-epsg.csv}'s header, and that + * file is a committed input whose regeneration is a pending decision and which the + * golden baseline references row for row. Extending the vocabulary of column 1 changes no + * existing byte of any file.
  2. + *
  3. It is a strict superset. Any string not recognised as a refusal verdict is routed + * through the identical "must not be in tolerance" branch that {@code failing} and + * {@code error} always took, so a file containing none of the new values behaves exactly as + * before — including files this repository does not own.
  4. + *
  5. The cause travels with the verdict. A separate {@code expectedCause} column could + * be filled in on a row whose verdict is {@code passing} and nothing would read it. Here the + * assertion and its qualifier are one token and cannot drift apart.
  6. + *
+ * + *

The MetaCRS CSV format is external (see {@code trac.osgeo.org/metacrs}) and its + * {@code testMethod} column is a free-form string, so a new value stays within the format while a + * twentieth column forks it. + * + * @see #evaluate(CRSFactory) + * @see #verdictMismatch(Result) + */ public class MetaCRSTestCase { public static String FAILING = "failing"; public static String PASSING = "passing"; public static String ERROR = "error"; + /** + * The bare refusal verdict: the row asserts that the transform throws, without pinning which + * {@link ErrorCause}. + * + *

Prefer the qualified form

+ * + *

A bare {@code refuses} is satisfied by a refusal for the wrong reason, which is only + * marginally better than {@code failing}. Use {@link #REFUSES_PREFIX} unless the cause is + * genuinely not pinned. + */ + public static final String REFUSES = "refuses"; + + /** + * The refusal verdict that pins a cause: {@code "refuses:COORDINATE_OUTSIDE_GRID"}. + * + *

Matching

+ * + *

The remainder is an {@link ErrorCause} constant name, matched exactly and + * case-sensitively. An unrecognised name is a malformed row and raises + * {@link IllegalArgumentException} — it is deliberately not "a row that never matches", + * which would be a silently vacuous assertion. + */ + public static final String REFUSES_PREFIX = "refuses:"; + private static final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); private boolean verbose = true; @@ -136,6 +219,19 @@ public ProjCoordinate getTargetCoordinate() { return new ProjCoordinate(tgtOrd1, tgtOrd2, tgtOrd3); } + /** + * The row's own per-ordinate tolerance, as three ordinates. + * + *

Exposed so that a caller can perturb the expected coordinate by the row's own + * tolerance and require the check to notice — a non-vacuity control that a fixed + * perturbation cannot express, because this file's tolerances span 1e-6 (degrees) to 1.0 (m). + * + * @return {@code (tolOrd1, tolOrd2, tolOrd3)} + */ + public ProjCoordinate getTolerance() { + return new ProjCoordinate(tolOrd1, tolOrd2, tolOrd3); + } + public ProjCoordinate getResultCoordinate() { return new ProjCoordinate(resultPt.x, resultPt.y); } @@ -156,6 +252,223 @@ public boolean execute(CRSFactory csFactory) { return isOK; } + // ------------------------------------------------------------------ the three outcomes + + /** + * What actually happened when a row was run. Three states, because {@code boolean} has two + * and the missing one is the whole point of {@link #REFUSES}. + */ + public enum Outcome { + + /** A coordinate came back and every ordinate was within the row's tolerance. */ + IN_TOLERANCE, + + /** + * A coordinate came back and was outside the row's tolerance. Proj4J reported success and + * was wrong — the outcome that must never be conflated with {@link #REFUSED}. + */ + OUT_OF_TOLERANCE, + + /** + * No coordinate came back: a {@link Proj4jException} was thrown, carrying an + * {@link ErrorCause}. Whether this is correct is a property of the row's verdict, + * never of the outcome. + */ + REFUSED + } + + /** + * The outcome of running one row, with enough detail to say why a verdict was not met. + * + *

Immutability

+ * + *

Deliberately a value: {@link MetaCRSTestCase} reuses {@code resultPt} across runs, so a + * caller collecting outcomes over 4,280 rows would otherwise be holding 4,280 references to + * one mutable point. + */ + public static final class Result { + + private final Outcome outcome; + private final ErrorCause cause; + private final Proj4jException refusal; + private final double x; + private final double y; + + private Result(Outcome outcome, ErrorCause cause, Proj4jException refusal, + double x, double y) { + this.outcome = outcome; + this.cause = cause; + this.refusal = refusal; + this.x = x; + this.y = y; + } + + static Result answered(boolean inTolerance, double x, double y) { + return new Result(inTolerance ? Outcome.IN_TOLERANCE : Outcome.OUT_OF_TOLERANCE, + null, null, x, y); + } + + static Result refused(Proj4jException ex) { + return new Result(Outcome.REFUSED, ex.cause(), ex, Double.NaN, Double.NaN); + } + + /** @return which of the three things happened; never null */ + public Outcome outcome() { + return outcome; + } + + /** + * @return the machine-readable refusal reason, or null when a coordinate came back. Never + * null when {@link #outcome()} is {@link Outcome#REFUSED}, because + * {@link Proj4jException#cause()} is never null. + */ + public ErrorCause cause() { + return cause; + } + + /** @return the exception that refused the row, or null when a coordinate came back */ + public Proj4jException refusal() { + return refusal; + } + + /** @return the transformed x, or {@link Double#NaN} when the row was refused */ + public double x() { + return x; + } + + /** @return the transformed y, or {@link Double#NaN} when the row was refused */ + public double y() { + return y; + } + + @Override + public String toString() { + if (outcome == Outcome.REFUSED) { + return "REFUSED(" + cause + "): " + refusal.getMessage(); + } + return outcome + "(" + x + ", " + y + ")"; + } + } + + /** + * Runs the row and reports which of the three outcomes occurred, instead of collapsing two of + * them into {@code false}. + * + *

Relationship to {@link #execute(CRSFactory)}

+ * + *

{@code execute} is unchanged and still propagates {@link Proj4jException}; this method + * wraps it. For a row that answers, {@code evaluate(f).outcome() == IN_TOLERANCE} is exactly + * {@code execute(f)}. + * + * @param csFactory the factory used to resolve both CRSs + * @return the outcome; never null, never throwing {@link Proj4jException} + */ + public Result evaluate(CRSFactory csFactory) { + try { + boolean inTolerance = execute(csFactory); + return Result.answered(inTolerance, resultPt.x, resultPt.y); + } catch (Proj4jException ex) { + return Result.refused(ex); + } + } + + // ------------------------------------------------------------------------- the verdict + + /** + * Whether a {@code testMethod} value asks for a refusal. + * + * @param testMethod the raw column-1 value + * @return true for {@code refuses} and {@code refuses:}CAUSE, false for everything else + * including null + */ + public static boolean isRefusalVerdict(String testMethod) { + return REFUSES.equals(testMethod) + || (testMethod != null && testMethod.startsWith(REFUSES_PREFIX)); + } + + /** + * The {@link ErrorCause} a refusal verdict pins, if it pins one. + * + *

Malformed rows are rejected, not ignored

+ * + *

{@code refuses:NOT_A_CAUSE} throws rather than returning null, because a verdict no + * outcome can satisfy is an assertion that silently never holds. + * + * @param testMethod the raw column-1 value + * @return the required cause, or null for a bare {@code refuses} or a non-refusal verdict + * @throws IllegalArgumentException if the text after {@code refuses:} is not an + * {@link ErrorCause} constant name + */ + public static ErrorCause requiredCause(String testMethod) { + if (testMethod == null || !testMethod.startsWith(REFUSES_PREFIX)) { + return null; + } + String name = testMethod.substring(REFUSES_PREFIX.length()).trim(); + try { + return ErrorCause.valueOf(name); + } catch (IllegalArgumentException ex) { + throw new IllegalArgumentException("verdict '" + testMethod + "' names '" + name + + "', which is not an ErrorCause constant. A verdict no outcome can satisfy " + + "is a vacuous assertion, so this is a malformed row rather than a row that " + + "never matches.", ex); + } + } + + /** + * Checks an outcome against this row's recorded verdict. + * + *

Semantics, and why the default branch matters

+ * + *

{@code passing} requires {@link Outcome#IN_TOLERANCE}. A refusal verdict requires + * {@link Outcome#REFUSED}, and the qualified form additionally requires the exact cause. + * Every other value — {@code failing}, {@code error}, an empty column, a typo — + * requires only "not {@code IN_TOLERANCE}", which is bit-for-bit the rule that has always + * applied. That default is what makes this a strict superset rather than a new dialect. + * + * @param result the outcome from {@link #evaluate(CRSFactory)} + * @return null when the verdict is satisfied, otherwise a one-line description of the + * disagreement, naming what was asserted and what happened + */ + public String verdictMismatch(Result result) { + return verdictMismatch(testMethod, result); + } + + /** + * The row-independent form of {@link #verdictMismatch(Result)}, for callers checking a verdict + * string against an outcome they obtained some other way. + * + * @param testMethod the raw column-1 value + * @param result the outcome + * @return null when the verdict is satisfied, otherwise a description of the disagreement + */ + public static String verdictMismatch(String testMethod, Result result) { + if (isRefusalVerdict(testMethod)) { + ErrorCause required = requiredCause(testMethod); + if (result.outcome() != Outcome.REFUSED) { + return "'" + testMethod + "' asserts the transform must refuse" + + (required == null ? "" : " with " + required) + + ", but it returned (" + result.x() + ", " + result.y() + ")" + + (result.outcome() == Outcome.IN_TOLERANCE + ? " within tolerance" : " outside tolerance"); + } + if (required != null && required != result.cause()) { + return "'" + testMethod + "' asserts the refusal cause is " + required + + ", but the transform refused with " + result.cause() + ": " + + result.refusal().getMessage(); + } + return null; + } + if (PASSING.equals(testMethod)) { + return result.outcome() == Outcome.IN_TOLERANCE ? null + : "'" + PASSING + "' asserts a coordinate within tolerance, but got " + result; + } + // failing / error / anything else: the pre-existing rule, unchanged. + return result.outcome() == Outcome.IN_TOLERANCE + ? "'" + testMethod + "' asserts this row does not pass, but it now does -- " + + "reclassify it" + : null; + } + public static String csName(String auth, String code) { return auth + ":" + code; } diff --git a/core/src/test/java/org/locationtech/proj4j/io/projjson/JsonDepthLimitTest.java b/core/src/test/java/org/locationtech/proj4j/io/projjson/JsonDepthLimitTest.java new file mode 100644 index 0000000..afc1127 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/projjson/JsonDepthLimitTest.java @@ -0,0 +1,128 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.io.wkt.WktParseException; + +/** + * {@code Json.write} recurses, and it is bounded. + * + *

This test lives in {@code io.projjson} rather than beside its siblings in + * {@code security.parsers} for one reason: {@link Json} is package-private, and the writer's guard + * cannot be reached from outside the package. {@code ProjJsonWriter} caps CRS nesting at 24, which + * costs about 50 JSON levels — comfortably inside the writer's 64 — so no public call can make + * {@code Json.write} recurse to its limit. The guard is still worth having, because it is what + * makes the round trip safe by construction rather than by arithmetic that a later change could + * quietly invalidate; and a guard nobody has ever seen fire is not a guard, so it is exercised here + * directly. {@code ProjJsonTest} already reaches {@code Json.parse} from this package, so the + * precedent is the file's own. + * + *

Before the fix the tree below overflowed the stack in {@code Json.write}. + */ +public class JsonDepthLimitTest { + + /** Both halves: 63 nested arrays writes, 64 does not. */ + @Test + public void theWriterIsBoundedAtTheSameDepthAsTheReader() { + assertNotNull(Json.write(nestedList(63))); + + for (int n : new int[]{64, 65, 20000}) { + try { + Json.write(nestedList(n)); + fail("expected a WktParseException at " + n); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("JSON nested more than 64 deep")); + } + } + } + + /** + * The reader's boundary, asserted from inside the package so it is the parser being measured + * and not {@code ProjJsonReader}'s type checks. + */ + @Test + public void theReaderIsBoundedAtTheDepthItClaims() { + assertNotNull(Json.parse(arrays(63))); + for (int n : new int[]{64, 65, 20000}) { + try { + Json.parse(arrays(n)); + fail("expected a WktParseException at " + n); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("JSON nested more than 64 deep")); + } + } + } + + /** + * The invariant that makes the round trip safe: anything the reader accepts, the writer can + * write. The two conventions differ by one — the reader counts the root value as 1, the + * writer as indentation level 0 — and getting that off by one wrong would turn the deepest + * legal document into an unwritable one. Assert it at the exact boundary rather than trusting + * the arithmetic. + */ + @Test + public void everythingTheReaderAcceptsTheWriterCanWrite() { + Object deepest = Json.parse(arrays(63)); + String text = Json.write(deepest); + assertNotNull(text); + assertEquals("and it reads back", 63, listDepth(Json.parse(text))); + } + + // ------------------------------------------------------------------------------- helpers + + private static Object nestedList(int n) { + Object cur = Double.valueOf(1); + for (int i = 0; i < n; i++) { + List outer = new ArrayList(1); + outer.add(cur); + cur = outer; + } + return cur; + } + + private static String arrays(int n) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < n; i++) { + sb.append('['); + } + sb.append('1'); + for (int i = 0; i < n; i++) { + sb.append(']'); + } + return sb.toString(); + } + + private static int listDepth(Object value) { + int n = 0; + while (value instanceof List) { + List l = (List) value; + value = l.isEmpty() ? null : l.get(0); + n++; + } + return n; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/projjson/ProjJsonTest.java b/core/src/test/java/org/locationtech/proj4j/io/projjson/ProjJsonTest.java new file mode 100644 index 0000000..56775f0 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/projjson/ProjJsonTest.java @@ -0,0 +1,485 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.projjson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.io.wkt.AxisOrderPolicy; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.CrsDefinitions; +import org.locationtech.proj4j.io.wkt.Identifier; +import org.locationtech.proj4j.io.wkt.WktParseException; +import org.locationtech.proj4j.io.wkt.WktReader; +import org.locationtech.proj4j.io.wkt.WktWriter; + +/** + * PROJJSON reading and writing, over inputs taken from the {@code json_import} tests in PROJ + * 9.8.1's {@code test/unit/test_io.cpp}. Those tests assert byte-for-byte round-trip equality with + * a placeholder {@code $schema}; so do these. + */ +public class ProjJsonTest { + + /** CASE 213: a GeographicCRS with area, bbox, id and remarks. */ + private static final String GEOGRAPHIC_CRS = "" + + "{\n" + + " \"$schema\": \"foo\",\n" + + " \"type\": \"GeographicCRS\",\n" + + " \"name\": \"WGS 84\",\n" + + " \"datum\": {\n" + + " \"type\": \"GeodeticReferenceFrame\",\n" + + " \"name\": \"World Geodetic System 1984\",\n" + + " \"ellipsoid\": {\n" + + " \"name\": \"WGS 84\",\n" + + " \"semi_major_axis\": 6378137,\n" + + " \"inverse_flattening\": 298.257223563\n" + + " }\n" + + " },\n" + + " \"coordinate_system\": {\n" + + " \"subtype\": \"ellipsoidal\",\n" + + " \"axis\": [\n" + + " {\n" + + " \"name\": \"Geodetic latitude\",\n" + + " \"abbreviation\": \"Lat\",\n" + + " \"direction\": \"north\",\n" + + " \"unit\": \"degree\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Geodetic longitude\",\n" + + " \"abbreviation\": \"Lon\",\n" + + " \"direction\": \"east\",\n" + + " \"unit\": \"degree\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"area\": \"World\",\n" + + " \"bbox\": {\n" + + " \"south_latitude\": -90,\n" + + " \"west_longitude\": -180,\n" + + " \"north_latitude\": 90,\n" + + " \"east_longitude\": 180\n" + + " },\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 4326\n" + + " },\n" + + " \"remarks\": \"my_remarks\"\n" + + "}"; + + private static ProjJsonWriter writer() { + return new ProjJsonWriter().withSchema("foo"); + } + + @Test + public void geographicCrsRoundTripsByteForByte() { + CrsDefinition def = new ProjJsonReader().readDefinition(GEOGRAPHIC_CRS); + assertEquals(GEOGRAPHIC_CRS, writer().write(def)); + } + + @Test + public void geographicCrsContent() { + CrsDefinition def = new ProjJsonReader().readDefinition(GEOGRAPHIC_CRS); + assertEquals(CrsDefinition.Kind.GEOGRAPHIC, def.getKind()); + assertEquals("WGS 84", def.getName()); + assertEquals(new Identifier("EPSG", "4326"), def.getId()); + assertEquals("World", def.getAreaDescription()); + assertEquals("my_remarks", def.getRemark()); + assertEquals(-90.0, def.getBoundingBox()[0], 0.0); + // Latitude first, retained; the policy decides what that means, not the reader. + assertEquals("north", def.getCoordinateSystem().getAxes().get(0).getDirection()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", + CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.LEGACY)); + assertEquals("+proj=longlat +datum=WGS84 +axis=neu +no_defs", + CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.AUTHORITY)); + } + + /** CASE 218: a ProjectedCRS, UTM zone 31N. */ + private static final String PROJECTED_CRS = "" + + "{\n" + + " \"$schema\": \"foo\",\n" + + " \"type\": \"ProjectedCRS\",\n" + + " \"name\": \"WGS 84 / UTM zone 31N\",\n" + + " \"base_crs\": {\n" + + " \"type\": \"GeographicCRS\",\n" + + " \"name\": \"WGS 84\",\n" + + " \"datum\": {\n" + + " \"type\": \"GeodeticReferenceFrame\",\n" + + " \"name\": \"World Geodetic System 1984\",\n" + + " \"ellipsoid\": {\n" + + " \"name\": \"WGS 84\",\n" + + " \"semi_major_axis\": 6378137,\n" + + " \"inverse_flattening\": 298.257223563\n" + + " }\n" + + " },\n" + + " \"coordinate_system\": {\n" + + " \"subtype\": \"ellipsoidal\",\n" + + " \"axis\": [\n" + + " {\n" + + " \"name\": \"Geodetic latitude\",\n" + + " \"abbreviation\": \"Lat\",\n" + + " \"direction\": \"north\",\n" + + " \"unit\": \"degree\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Geodetic longitude\",\n" + + " \"abbreviation\": \"Lon\",\n" + + " \"direction\": \"east\",\n" + + " \"unit\": \"degree\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 4326\n" + + " }\n" + + " },\n" + + " \"conversion\": {\n" + + " \"name\": \"UTM zone 31N\",\n" + + " \"method\": {\n" + + " \"name\": \"Transverse Mercator\",\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 9807\n" + + " }\n" + + " },\n" + + " \"parameters\": [\n" + + " {\n" + + " \"name\": \"Latitude of natural origin\",\n" + + " \"value\": 0,\n" + + " \"unit\": \"degree\",\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 8801\n" + + " }\n" + + " },\n" + + " {\n" + + " \"name\": \"Longitude of natural origin\",\n" + + " \"value\": 3,\n" + + " \"unit\": \"degree\",\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 8802\n" + + " }\n" + + " },\n" + + " {\n" + + " \"name\": \"Scale factor at natural origin\",\n" + + " \"value\": 0.9996,\n" + + " \"unit\": \"unity\",\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 8805\n" + + " }\n" + + " },\n" + + " {\n" + + " \"name\": \"False easting\",\n" + + " \"value\": 500000,\n" + + " \"unit\": \"metre\",\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 8806\n" + + " }\n" + + " },\n" + + " {\n" + + " \"name\": \"False northing\",\n" + + " \"value\": 0,\n" + + " \"unit\": \"metre\",\n" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 8807\n" + + " }\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"coordinate_system\": {\n" + + " \"subtype\": \"Cartesian\",\n" + + " \"axis\": [\n" + + " {\n" + + " \"name\": \"Easting\",\n" + + " \"abbreviation\": \"E\",\n" + + " \"direction\": \"east\",\n" + + " \"unit\": \"metre\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Northing\",\n" + + " \"abbreviation\": \"N\",\n" + + " \"direction\": \"north\",\n" + + " \"unit\": \"metre\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + + @Test + public void projectedCrsRoundTripsByteForByte() { + CrsDefinition def = new ProjJsonReader().readDefinition(PROJECTED_CRS); + assertEquals(PROJECTED_CRS, writer().write(def)); + } + + @Test + public void projectedCrsBecomesTheRightProjString() { + CrsDefinition def = new ProjJsonReader().readDefinition(PROJECTED_CRS); + assertEquals("+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", + CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.LEGACY)); + // No id on the projected CRS in this document, so the CRS keeps its name. + CoordinateReferenceSystem crs = new ProjJsonReader().read(PROJECTED_CRS); + assertEquals("WGS 84 / UTM zone 31N", crs.getName()); + } + + /** The same content in WKT2 and in PROJJSON produces the same definition. */ + @Test + public void jsonAndWkt2Agree() { + CrsDefinition fromJson = new ProjJsonReader().readDefinition(PROJECTED_CRS); + String wkt2 = new WktWriter().write(fromJson); + CrsDefinition fromWkt = new WktReader().readDefinition(wkt2); + assertEquals(CrsDefinitions.toProjParameterString(fromJson, AxisOrderPolicy.LEGACY), + CrsDefinitions.toProjParameterString(fromWkt, AxisOrderPolicy.LEGACY)); + // And back to JSON: the two writers agree on everything the model holds. + assertEquals(writer().write(fromJson), writer().write(fromWkt)); + } + + /** CASE 190: a sphere is spelled with "radius". */ + @Test + public void sphereByRadius() { + String json = "{\n" + + " \"$schema\": \"foo\",\n" + + " \"type\": \"GeographicCRS\",\n" + + " \"name\": \"unknown\",\n" + + " \"datum\": {\n" + + " \"type\": \"GeodeticReferenceFrame\",\n" + + " \"name\": \"unknown\",\n" + + " \"ellipsoid\": {\n" + + " \"name\": \"Sphere\",\n" + + " \"radius\": 6371008.7714\n" + + " }\n" + + " },\n" + + " \"coordinate_system\": {\n" + + " \"subtype\": \"ellipsoidal\",\n" + + " \"axis\": [\n" + + " {\n" + + " \"name\": \"Longitude\",\n" + + " \"abbreviation\": \"lon\",\n" + + " \"direction\": \"east\",\n" + + " \"unit\": \"degree\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Latitude\",\n" + + " \"abbreviation\": \"lat\",\n" + + " \"direction\": \"north\",\n" + + " \"unit\": \"degree\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + CrsDefinition def = new ProjJsonReader().readDefinition(json); + assertTrue(def.getDatum().getEllipsoid().isSphere()); + assertEquals(json, writer().write(def)); + assertEquals("+proj=longlat +a=6371008.7714 +b=6371008.7714 +no_defs", + CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.LEGACY)); + } + + /** CASE 199 and 202: a prime meridian in grad, as an object with its own unit. */ + @Test + public void primeMeridianWithNonDegreeUnit() { + String json = "{\n" + + " \"$schema\": \"foo\",\n" + + " \"type\": \"GeographicCRS\",\n" + + " \"name\": \"NTF (Paris)\",\n" + + " \"datum\": {\n" + + " \"type\": \"GeodeticReferenceFrame\",\n" + + " \"name\": \"Nouvelle Triangulation Francaise (Paris)\",\n" + + " \"ellipsoid\": {\n" + + " \"name\": \"Clarke 1880 (IGN)\",\n" + + " \"semi_major_axis\": 6378249.2,\n" + + " \"semi_minor_axis\": 6356515\n" + + " },\n" + + " \"prime_meridian\": {\n" + + " \"name\": \"Paris\",\n" + + " \"longitude\": {\n" + + " \"value\": 2.5969213,\n" + + " \"unit\": {\n" + + " \"type\": \"AngularUnit\",\n" + + " \"name\": \"grad\",\n" + + " \"conversion_factor\": 0.015707963267949\n" + + " }\n" + + " }\n" + + " }\n" + + " },\n" + + " \"coordinate_system\": {\n" + + " \"subtype\": \"ellipsoidal\",\n" + + " \"axis\": [\n" + + " {\n" + + " \"name\": \"Longitude\",\n" + + " \"abbreviation\": \"lon\",\n" + + " \"direction\": \"east\",\n" + + " \"unit\": \"degree\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Latitude\",\n" + + " \"abbreviation\": \"lat\",\n" + + " \"direction\": \"north\",\n" + + " \"unit\": \"degree\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + CrsDefinition def = new ProjJsonReader().readDefinition(json); + assertEquals(2.33722917, def.getDatum().getPrimeMeridian().getLongitudeDegrees(), 1e-9); + assertEquals(json, writer().write(def)); + String proj = CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.LEGACY); + assertTrue(proj, proj.contains("+pm=paris")); + // See Wkt2ReaderTest.baseAngularUnitFromPrimeMeridian: now named rather than + // given as axes, because clrk80ign is in Ellipsoid.ellipsoids and WktNames + // matches numerically. Lossless. + assertTrue(proj, proj.contains("+ellps=clrk80ign")); + } + + /** CASE 220: a VerticalCRS is read, and refused as a proj4j CRS rather than flattened. */ + @Test + public void verticalCrs() { + String json = "{\n" + + " \"$schema\": \"foo\",\n" + + " \"type\": \"VerticalCRS\",\n" + + " \"name\": \"ODN height\",\n" + + " \"datum\": {\n" + + " \"type\": \"VerticalReferenceFrame\",\n" + + " \"name\": \"Ordnance Datum Newlyn\"\n" + + " },\n" + + " \"coordinate_system\": {\n" + + " \"subtype\": \"vertical\",\n" + + " \"axis\": [\n" + + " {\n" + + " \"name\": \"Gravity-related height\",\n" + + " \"abbreviation\": \"H\",\n" + + " \"direction\": \"up\",\n" + + " \"unit\": \"metre\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + CrsDefinition def = new ProjJsonReader().readDefinition(json); + assertEquals(CrsDefinition.Kind.VERTICAL, def.getKind()); + assertEquals(json, writer().write(def)); + try { + new ProjJsonReader().read(json); + fail("a vertical-only CRS must be refused"); + } catch (WktParseException expected) { + // the point + } + } + + /** CASE 227/230: identifiers, singular and plural. */ + @Test + public void multipleIdentifiers() { + String json = GEOGRAPHIC_CRS.replace("" + + " \"id\": {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 4326\n" + + " },\n", + "" + + " \"ids\": [\n" + + " {\n" + + " \"authority\": \"EPSG\",\n" + + " \"code\": 4326\n" + + " },\n" + + " {\n" + + " \"authority\": \"FOO\",\n" + + " \"code\": \"BAR\"\n" + + " }\n" + + " ],\n"); + CrsDefinition def = new ProjJsonReader().readDefinition(json); + assertEquals(2, def.getIds().size()); + assertEquals(new Identifier("FOO", "BAR"), def.getIds().get(1)); + assertEquals(json, writer().write(def)); + } + + /** A default writer emits the schema PROJ 9.8.1 emits. */ + @Test + public void defaultSchemaIsEmitted() { + CrsDefinition def = new ProjJsonReader().readDefinition(GEOGRAPHIC_CRS); + String json = new ProjJsonWriter().write(def); + assertTrue(json, json.startsWith("{\n \"$schema\": \"" + + ProjJsonWriter.DEFAULT_SCHEMA + "\",\n")); + // And with no schema at all, "type" comes first. + assertTrue(new ProjJsonWriter().withSchema(null).write(def) + .startsWith("{\n \"type\": \"GeographicCRS\",")); + } + + /** Malformed or unrepresentable JSON is refused with a message, never half-read. */ + @Test + public void invalidJsonIsRejected() { + String[] invalid = { + "", + "{", + "[]", + "{\"type\": \"Ellipsoid\"}", + "{\"type\": \"PrimeMeridian\", \"name\": \"foo\"}", + "{\"type\": \"GeographicCRS\", \"name\": \"x\"}", + "{\"type\": \"GeographicCRS\", \"name\": \"x\", \"datum\": {" + + "\"type\": \"GeodeticReferenceFrame\", \"name\": \"y\"}}", + "{\"type\": \"NotACrs\", \"name\": \"x\"}", + "{\"type\": \"GeographicCRS\", \"name\": 42}", + }; + for (int i = 0; i < invalid.length; i++) { + try { + new ProjJsonReader().readDefinition(invalid[i]); + fail("expected a WktParseException for \"" + invalid[i] + "\""); + } catch (WktParseException expected) { + // the point + } + } + } + + /** The JSON parser handles escapes, nesting and numeric forms. */ + @Test + public void jsonParserBasics() { + assertEquals("a\"b\\c\nd", ((java.util.Map) Json.parse("{\"k\":\"a\\\"b\\\\c\\nd\"}")) + .get("k")); + assertEquals(Double.valueOf(-1.5e10), ((java.util.Map) Json.parse("{\"k\":-1.5e10}")) + .get("k")); + assertEquals(Boolean.TRUE, ((java.util.Map) Json.parse("{\"k\":true}")).get("k")); + assertEquals(null, ((java.util.Map) Json.parse("{\"k\":null}")).get("k")); + assertEquals(3, ((java.util.List) Json.parse("[1,2,3]")).size()); + assertEquals("\u00e9", ((java.util.Map) Json.parse("{\"k\":\"\\u00e9\"}")).get("k")); + } + + /** Numbers are written as PROJ writes them: integral values without a decimal point. */ + @Test + public void numberFormatting() { + assertEquals("0", JsonNumber.format(0.0)); + assertEquals("6378137", JsonNumber.format(6378137.0)); + assertEquals("298.257223563", JsonNumber.format(298.257223563)); + assertEquals("0.9996", JsonNumber.format(0.9996)); + assertEquals("-180", JsonNumber.format(-180.0)); + } + + /** Writing a bare proj4j CRS produces valid PROJJSON. */ + @Test + public void writesAProj4jCrs() { + CoordinateReferenceSystem crs = new org.locationtech.proj4j.CRSFactory() + .createFromParameters("utm31", "+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 " + + "+x_0=500000 +y_0=0 +datum=WGS84 +units=m"); + String json = new ProjJsonWriter().withSchema("foo").write(crs); + CrsDefinition reread = new ProjJsonReader().readDefinition(json); + assertEquals("+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", + CrsDefinitions.toProjParameterString(reread, AxisOrderPolicy.LEGACY)); + assertEquals(json, new ProjJsonWriter().withSchema("foo").write(reread)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/AxisOrderPolicyTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/AxisOrderPolicyTest.java new file mode 100644 index 0000000..f36139c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/AxisOrderPolicyTest.java @@ -0,0 +1,187 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * The axis-order trap, and the policy that governs it. + *

+ * PROJ 6 and later honour authority axis order, so {@code EPSG:4326} is latitude-first there. + * proj4j is longitude-first throughout and so is GeoJSON. A WKT reader that honoured every + * {@code AXIS[]} clause would therefore silently transpose every existing caller's coordinates — + * invisibly near the equator and the prime meridian, which is where fixtures live. So the default + * is {@link AxisOrderPolicy#LEGACY}, the declared axes are retained rather than discarded, and the + * policy is applied once, where a CRS is built. + *

+ * There is deliberately no system property and no environment variable to change this: the tests + * below would be meaningless if the answer depended on who launched the JVM. + */ +public class AxisOrderPolicyTest { + + /** EPSG:4326 as PROJ writes it: latitude first. */ + private static final String LAT_FIRST_4326 = + "GEOGCRS[\"WGS 84\",DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2]," + + "AXIS[\"geodetic latitude (Lat)\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "AXIS[\"geodetic longitude (Lon)\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],ID[\"EPSG\",4326]]"; + + /** The default is longitude-first, exactly as proj4j 1.4.3 behaves. */ + @Test + public void defaultIsLegacyLongitudeFirst() { + assertEquals(AxisOrderPolicy.LEGACY, new WktReader().getAxisOrderPolicy()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", + CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(LAT_FIRST_4326), AxisOrderPolicy.LEGACY)); + } + + /** The declared order is retained whatever the policy: nothing is discarded. */ + @Test + public void declaredAxesAreAlwaysRetained() { + AxisOrderPolicy[] policies = AxisOrderPolicy.values(); + for (int i = 0; i < policies.length; i++) { + CrsDefinition def = new WktReader(policies[i]).readDefinition(LAT_FIRST_4326); + CoordinateSystemDefinition cs = def.getCoordinateSystem(); + assertEquals(2, cs.getAxes().size()); + assertEquals("geodetic latitude", cs.getAxes().get(0).getName()); + assertEquals("Lat", cs.getAxes().get(0).getAbbreviation()); + assertEquals(AxisDefinition.NORTH, cs.getAxes().get(0).getDirection()); + assertEquals(AxisDefinition.EAST, cs.getAxes().get(1).getDirection()); + assertFalse("the document declared latitude first, and says so", + cs.isXBeforeY()); + } + } + + /** AUTHORITY applies the declared order, and says so in the PROJ string. */ + @Test + public void authorityPolicyEmitsAxisOrder() { + String proj = CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(LAT_FIRST_4326), AxisOrderPolicy.AUTHORITY); + assertEquals("+proj=longlat +datum=WGS84 +axis=neu +no_defs", proj); + } + + /** VISUALISATION forces east/north/up, which is proj4j's own default. */ + @Test + public void visualisationPolicyForcesEastNorth() { + String proj = CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(LAT_FIRST_4326), AxisOrderPolicy.VISUALISATION); + assertTrue(proj, !proj.contains("+axis=")); + } + + /** + * The consumer's own reproduction case, and the reason the default is what it is: reading + * EPSG:4326 from WKT and transforming to web Mercator must consume {@code (longitude, + * latitude)}. The literal coordinate is from that script. + */ + @Test + public void legacyPolicyConsumesLongitudeFirst() { + CoordinateReferenceSystem source = new WktReader().read(LAT_FIRST_4326); + CoordinateReferenceSystem target = new CRSFactory().createFromParameters("webmerc", + "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +units=m"); + ProjCoordinate out = new BasicCoordinateTransform(source, target) + .transform(new ProjCoordinate(-122.4, 37.8), new ProjCoordinate()); + assertEquals(6378137.0 * Math.toRadians(-122.4), out.x, 0.001); + assertEquals(6378137.0 * Math.log(Math.tan(Math.PI / 4 + Math.toRadians(37.8) / 2)), + out.y, 0.001); + } + + /** Under AUTHORITY the same CRS consumes (latitude, longitude), which is the whole point. */ + @Test + public void authorityPolicyConsumesLatitudeFirst() { + CoordinateReferenceSystem source = + new WktReader(AxisOrderPolicy.AUTHORITY).read(LAT_FIRST_4326); + CoordinateReferenceSystem target = new CRSFactory().createFromParameters("webmerc", + "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +units=m"); + ProjCoordinate out = new BasicCoordinateTransform(source, target) + .transform(new ProjCoordinate(37.8, -122.4), new ProjCoordinate()); + assertEquals(6378137.0 * Math.toRadians(-122.4), out.x, 0.001); + assertEquals(6378137.0 * Math.log(Math.tan(Math.PI / 4 + Math.toRadians(37.8) / 2)), + out.y, 0.001); + } + + /** A longitude-first document needs no reordering under any policy. */ + @Test + public void longitudeFirstDocumentIsUnaffected() { + String lonFirst = "GEOGCRS[\"WGS 84\",DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2]," + + "AXIS[\"geodetic longitude (Lon)\",east,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "AXIS[\"geodetic latitude (Lat)\",north,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],ID[\"EPSG\",4326]]"; + CrsDefinition def = new WktReader().readDefinition(lonFirst); + assertTrue(def.getCoordinateSystem().isXBeforeY()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", + CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.AUTHORITY)); + } + + /** + * A WKT1 document with no {@code AXIS[]} at all is longitude-first by the WKT1 convention, so + * even AUTHORITY leaves it alone. + */ + @Test + public void wkt1WithoutAxesIsLongitudeFirst() { + CrsDefinition def = new WktReader().readDefinition(Wkt1ReaderTest.WGS84_GEOGCS); + // The WKT1 default order is made explicit rather than left as an absence. + assertEquals(2, def.getCoordinateSystem().getAxes().size()); + assertEquals(AxisDefinition.EAST, def.getCoordinateSystem().getAxes().get(0) + .getDirection()); + assertTrue(def.getCoordinateSystem().isXBeforeY()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", + CrsDefinitions.toProjParameterString(def, AxisOrderPolicy.AUTHORITY)); + } + + /** A south/west projected CRS is expressible under AUTHORITY. */ + @Test + public void southWestAxesUnderAuthority() { + String wkt = "PROJCRS[\"S-JTSK / Krovak\",BASEGEOGCRS[\"S-JTSK\",DATUM[\"S-JTSK\"," + + "ELLIPSOID[\"Bessel 1841\",6377397.155,299.1528128,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]]," + + "CONVERSION[\"Krovak\",METHOD[\"Krovak\",ID[\"EPSG\",9819]]," + + "PARAMETER[\"Latitude of projection centre\",49.5," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "PARAMETER[\"Longitude of origin\",24.8333333333333," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "PARAMETER[\"Co-latitude of cone axis\",30.2881397527778," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "PARAMETER[\"Latitude of pseudo standard parallel\",78.5," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "PARAMETER[\"Scale factor on pseudo standard parallel\",0.9999," + + "SCALEUNIT[\"unity\",1]]," + + "PARAMETER[\"False easting\",0,LENGTHUNIT[\"metre\",1]]," + + "PARAMETER[\"False northing\",0,LENGTHUNIT[\"metre\",1]]]," + + "CS[Cartesian,2],AXIS[\"x\",south,ORDER[1],LENGTHUNIT[\"metre\",1]]," + + "AXIS[\"y\",west,ORDER[2],LENGTHUNIT[\"metre\",1]],ID[\"EPSG\",5513]]"; + // The Czech convention is part of the projection here, not of the policy: +axis=swu comes + // from the south/west axes whatever the policy is. + String legacy = CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(wkt), AxisOrderPolicy.LEGACY); + assertTrue(legacy, legacy.contains("+axis=swu")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/NoGeoApiInCoreTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/NoGeoApiInCoreTest.java new file mode 100644 index 0000000..073f4b2 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/NoGeoApiInCoreTest.java @@ -0,0 +1,511 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.net.URL; +import java.nio.channels.FileChannel; +import java.nio.MappedByteBuffer; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.junit.Assume; +import org.junit.Test; +import org.locationtech.proj4j.CoordinateReferenceSystem; + +/** + * Asserts that the compiled {@code core} classes contain no reference whatsoever to + * {@code org.opengis.*}, by scanning their bytes for the string {@code org/opengis/}. + *

+ * This is the mechanical guarantee behind a claim a downstream consumer depends on. That consumer + * falls back to Apache SIS for WKT this library cannot parse, and SIS drags in GeoAPI; two + * incompatible copies of {@code org.opengis.util.CodeList} then end up on one classpath — + * {@code geoapi-3.0.2} has {@code names()}, {@code gt-opengis-29.6} does not — and whichever jar + * wins decides whether a {@code NoSuchMethodError} is thrown from inside SIS's WKT parser. That is + * an {@code Error}, not an {@code Exception}: it passes local tests and kills Spark executors. The + * only way to be rid of it is to stop needing SIS, which means WKT and PROJJSON support must be in + * core with no GeoAPI anywhere near it. + *

+ * {@code proj4j-geoapi} is a separate, optional module and is itself a participant in that hazard. + * Core must never reference it, not even through an optional dependency or a soft + * {@code ServiceLoader} probe. A comment saying so is not enforcement; this test is. + *

+ * If this test fails, do not relax it. The offending class is naming a GeoAPI type, and the fix is + * to remove that reference from core, not to allow it here. + * + *

How this test proves it can fail — and a retraction

+ * + *

A scan without a positive control is a claim, not a measurement, and the failure mode is + * silent: it reports exactly what you hoped for. The specific instrument failure this guards + * against is documented, because it happened: an {@code unzip -p | grep -c} over the jars returned + * 0 for core and 0 for the {@code geoapi} jar, which contains 341 references — binary class + * data defeats a line-oriented matcher, and the clean result had been produced by an instrument + * that could not detect anything. {@link #contains} is a raw byte search for exactly that reason. + * + *

This class was for a period cited elsewhere as already carrying that control, and it did + * not. The claim was that it "verified itself by finding the string in 28 of 32 {@code geoapi} + * classes"; in fact its only guard was {@link #assertScanned}, which checks coverage — did + * the walk reach package X — and never that the byte matcher can find {@code org/opengis/} when it + * is present. The 28-of-32 was an external measurement attributed to a test that never ran it. It + * is now actually run, by {@link #theGeoApiModuleIsFullOfTheNeedleThisScanLooksFor()}, and the four + * classes without the needle are the package-info and the two service-descriptor holders that name + * no GeoAPI type. + * + *

Three controls, in increasing order of how much they depend on the environment: + *

    + *
  1. {@link #theByteMatcherDetectsAnInjectedViolation()} — always runs. Fabricates a class file + * carrying the needle and requires the production collector and matcher to report it, and a + * needle-free twin not to be.
  2. + *
  3. {@link #theByteMatcherFindsRealPackagePathsInRealClasses()} — always runs. Requires the + * matcher to find {@code org/locationtech/proj4j/} in the real core classes, so its ability to + * read binary constant pools is proved on the actual corpus.
  4. + *
  5. {@link #theGeoApiModuleIsFullOfTheNeedleThisScanLooksFor()} and + * {@link #theShippedJarContainsNoGeoApi()} — skipped, not passed, when their input does + * not exist. Both are ordering artefacts of the build rather than of this code: surefire runs + * in the {@code test} phase, before {@code package} writes the jar, and the reactor builds + * {@code core} before {@code geoapi}, so on a clean {@code mvn install} neither input is there + * yet. They run on any second build, and locally. See {@link org.junit.Assume}.
  6. + *
+ */ +public class NoGeoApiInCoreTest { + + /** The byte sequence a class file would contain if it named any GeoAPI type. */ + private static final byte[] FORBIDDEN = toBytes("org/opengis/"); + + /** The dotted form, which would appear in a {@code Class.forName} string constant. */ + private static final byte[] FORBIDDEN_DOTTED = toBytes("org.opengis."); + + @Test + public void coreClassesDoNotReferenceGeoApi() throws IOException { + File classes = coreClassesDirectory(); + List classFiles = new ArrayList(); + collect(classes, classFiles); + assertTrue("found no compiled classes to scan under " + classes, classFiles.size() > 100); + + List offenders = new ArrayList(); + for (int i = 0; i < classFiles.size(); i++) { + File f = classFiles.get(i); + if (contains(f, FORBIDDEN) || contains(f, FORBIDDEN_DOTTED)) { + offenders.add(relative(classes, f)); + } + } + if (!offenders.isEmpty()) { + fail("core must contain no reference to org.opengis.* — the duplicate CodeList hazard " + + "is why WKT support lives in core at all. Offending classes: " + offenders); + } + assertScanned(classes, classFiles, "org/locationtech/proj4j/io/wkt"); + assertScanned(classes, classFiles, "org/locationtech/proj4j/io/projjson"); + // The public facade is the surface a consumer actually holds, and the claim it makes -- that + // deleting Apache SIS is possible -- is only true if every signature on it uses java.* and + // org.locationtech.proj4j.* alone. The scan above already covers it, because it walks the + // whole classes tree; this line makes that coverage a stated requirement rather than an + // accident of where the tree root happens to be, so that a future packaging change which + // excluded the package would fail here instead of silently weakening the guarantee. + assertScanned(classes, classFiles, "org/locationtech/proj4j/api"); + } + + /** + * Asserts that the scan actually reached a package. A scan that silently covered nothing would + * pass the offender check trivially, which is the one way this test could give a false negative. + */ + private static void assertScanned(File root, List scanned, String packagePath) { + String needle = packagePath.replace('/', File.separatorChar) + File.separatorChar; + for (int i = 0; i < scanned.size(); i++) { + if (relative(root, scanned.get(i)).startsWith(needle)) { + return; + } + } + fail("the org.opengis scan did not reach " + packagePath + " under " + root + + ", so it proves nothing about that package"); + } + + /** + * The same constraint stated at the class-loading level: core must be usable with no GeoAPI on + * the classpath at all, so nothing core needs may resolve to a GeoAPI type. + * + *

This test was vacuous, and this is what it used to be

+ * + *

{@code assertFalse(isPresent("org.opengis.util.CodeList") && wktPackageUsesIt())}. Core's + * test classpath is {@code proj4j-epsg} plus {@code junit} and nothing else, so + * {@code isPresent} is {@code false}, {@code &&} never evaluates its right operand, + * {@code wktPackageUsesIt()} never ran, and {@code assertFalse(false)} passed unconditionally. + * It reported a guarantee it never evaluated. + * + *

The two halves are now separate assertions, and both mean something: + *

    + *
  • GeoAPI really is absent from the classpath this ran on. Without that fact the + * second assertion proves nothing, because WKT could be working via GeoAPI. If + * GeoAPI is ever added to core's test scope this fails, and correctly so — the guarantee is + * that core needs no GeoAPI, and the only way to keep testing that is to keep it off the + * classpath.
  • + *
  • The whole WKT round trip runs anyway. Read, parse to a definition, and write it + * back. Any GeoAPI type on a code path this touches would be a + * {@link NoClassDefFoundError} at link time, not a silently skipped branch.
  • + *
+ */ + @Test + public void wktSupportLinksAndRunsWithNoGeoApiOnTheClasspath() { + assertFalse("GeoAPI is on core's test classpath, so the round trip below could be " + + "succeeding through it; the point of this test is that it cannot", + isPresent("org.opengis.util.CodeList")); + // Not a boolean handed to an && that may never evaluate it: called, and its result checked. + assertTrue("the WKT round trip must complete with no GeoAPI present", wktRoundTripWorks()); + } + + private boolean wktRoundTripWorks() { + // Reading and writing WKT exercises the whole package; if any of it needed GeoAPI, this + // would fail to link rather than return. + String wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137," + + "298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]"; + CoordinateReferenceSystem crs = new WktReader().read(wkt); + CrsDefinition def = new WktReader().readDefinition(wkt); + String written = new WktWriter().write(def); + return crs != null && written != null && written.length() > 0; + } + + // ------------------------------------------------------------------- positive controls + + /** + * Always runs. Fabricates two class files from the same real core class bytes, one with + * {@code org/opengis/util/CodeList} appended, and requires the production collector and byte + * matcher to report exactly the one carrying the needle. + * + *

The carrier is real binary class content rather than a text file, because that is the + * distinction that broke the previous instrument. + */ + @Test + public void theByteMatcherDetectsAnInjectedViolation() throws IOException { + File dir = createTempDirectory("proj4j-geoapi-injection"); + try { + byte[] carrier = readAll(new File(coreClassesDirectory(), + "org/locationtech/proj4j/CoordinateReferenceSystem.class" + .replace('/', File.separatorChar))); + File clean = writeWithSuffix(new File(dir, "Clean.class"), carrier, null); + File dirty = writeWithSuffix(new File(dir, "Dirty.class"), carrier, + "org/opengis/util/CodeList"); + File dotted = writeWithSuffix(new File(dir, "Dotted.class"), carrier, + "org.opengis.util.CodeList"); + + List collected = new ArrayList(); + collect(dir, collected); + assertTrue("the collector must see all three fabricated class files", + collected.size() == 3); + + assertFalse("the needle-free control must not be reported", + contains(clean, FORBIDDEN) || contains(clean, FORBIDDEN_DOTTED)); + assertTrue("the slash form must be detected", contains(dirty, FORBIDDEN)); + assertTrue("the dotted form, which is how a Class.forName constant would look, must be " + + "detected too", contains(dotted, FORBIDDEN_DOTTED)); + } finally { + deleteRecursively(dir); + } + } + + /** + * Always runs. The matcher's ability to find a package path inside a real, compiled constant + * pool, proved against the corpus actually being scanned rather than against a fabrication. + */ + @Test + public void theByteMatcherFindsRealPackagePathsInRealClasses() throws IOException { + File classes = coreClassesDirectory(); + List classFiles = new ArrayList(); + collect(classes, classFiles); + assertTrue("found no compiled classes under " + classes, classFiles.size() > 100); + + byte[] ownPackage = toBytes("org/locationtech/proj4j/"); + int found = 0; + for (int i = 0; i < classFiles.size(); i++) { + if (contains(classFiles.get(i), ownPackage)) { + found++; + } + } + assertTrue("the matcher found its own package path in only " + found + " of " + + classFiles.size() + " core classes; essentially all of them contain it, so a low " + + "number means the matcher cannot read binary constant pools and every clean " + + "result above is meaningless", found > classFiles.size() / 2); + } + + /** + * The control the skill claimed this class already had. Points the very same matcher at the + * {@code proj4j-geoapi} module, which exists to reference GeoAPI, and requires it to find the + * needle in the great majority of its classes. + * + *

Measured at the time of writing: 28 of 32, identically in {@code target/classes} + * and in the packaged jar. A floor rather than an exact count, so an added class does not break + * it, but a floor high enough that a matcher which had stopped working cannot clear it. + * + *

Skipped rather than passed when the module has not been built. The reactor builds + * {@code core} before {@code geoapi}, so on a clean {@code mvn install} this input does not + * exist while core's tests run. It runs on any subsequent build and in any IDE. + */ + @Test + public void theGeoApiModuleIsFullOfTheNeedleThisScanLooksFor() throws IOException { + File geoapiClasses = new File(repositoryRoot(), + ("geoapi" + File.separator + "target" + File.separator + "classes")); + Assume.assumeTrue("proj4j-geoapi has not been compiled yet (" + geoapiClasses + + "); the reactor builds core first, so this control runs on a second build", + geoapiClasses.isDirectory()); + + List classFiles = new ArrayList(); + collect(geoapiClasses, classFiles); + assertTrue("the geoapi module compiled to only " + classFiles.size() + " classes", + classFiles.size() >= 20); + + int hits = 0; + for (int i = 0; i < classFiles.size(); i++) { + if (contains(classFiles.get(i), FORBIDDEN) || contains(classFiles.get(i), + FORBIDDEN_DOTTED)) { + hits++; + } + } + assertTrue("the matcher found org/opengis/ in only " + hits + " of " + classFiles.size() + + " proj4j-geoapi classes; that module exists to reference GeoAPI, so anything " + + "below three quarters means the matcher has stopped detecting and core's clean " + + "result proves nothing", hits * 4 >= classFiles.size() * 3); + } + + /** + * The claim is about the shipped artifact, and everything above is about + * {@code target/classes}. This closes that gap by reading the jar itself. + * + *

Skipped rather than passed when the jar has not been built. Surefire runs in the + * {@code test} phase and {@code maven-jar-plugin} in {@code package}, so during the build that + * runs this test the jar is not there yet. Making it unconditional needs a {@code pom.xml} + * change — either binding {@code jar:jar} to {@code process-test-classes}, or moving this class + * to {@code maven-failsafe-plugin} — which is out of scope here. + */ + @Test + public void theShippedJarContainsNoGeoApi() throws IOException { + File jar = coreJar(); + Assume.assumeTrue("core's jar has not been packaged yet; surefire runs before package, so " + + "this leg needs a pom change to be unconditional", jar != null); + + List offenders = new ArrayList(); + int classesSeen = 0; + ZipFile zip = new ZipFile(jar); + try { + Enumeration entries = zip.entries(); + while (entries.hasMoreElements()) { + ZipEntry e = entries.nextElement(); + if (e.isDirectory() || !e.getName().endsWith(".class")) { + continue; + } + classesSeen++; + byte[] bytes = readAll(zip.getInputStream(e)); + if (indexOf(bytes, FORBIDDEN) >= 0 || indexOf(bytes, FORBIDDEN_DOTTED) >= 0) { + offenders.add(e.getName()); + } + } + } finally { + zip.close(); + } + assertTrue("the jar at " + jar + " holds only " + classesSeen + " classes, so it is not " + + "the artifact this claim is about", classesSeen > 100); + if (!offenders.isEmpty()) { + fail("the shipped jar names org.opengis.*: " + offenders); + } + } + + /** The most recently written {@code proj4j-*.jar} in {@code core/target}, or null. */ + private static File coreJar() { + File target = coreClassesDirectory().getParentFile(); + File[] candidates = target.listFiles(); + if (candidates == null) { + return null; + } + File best = null; + for (int i = 0; i < candidates.length; i++) { + String n = candidates[i].getName(); + if (!n.endsWith(".jar") || n.endsWith("-sources.jar") || n.endsWith("-javadoc.jar")) { + continue; + } + if (best == null || candidates[i].lastModified() > best.lastModified()) { + best = candidates[i]; + } + } + return best; + } + + /** {@code .../core/target/classes} to the repository root. */ + private static File repositoryRoot() { + return coreClassesDirectory().getParentFile().getParentFile().getParentFile(); + } + + private static File createTempDirectory(String prefix) throws IOException { + File f = File.createTempFile(prefix, ""); + if (!f.delete() || !f.mkdir()) { + throw new IOException("cannot create a temporary directory at " + f); + } + return f; + } + + private static File writeWithSuffix(File target, byte[] carrier, String suffix) + throws IOException { + FileOutputStream out = new FileOutputStream(target); + try { + out.write(carrier); + if (suffix != null) { + out.write(toBytes(suffix)); + } + } finally { + out.close(); + } + return target; + } + + private static void deleteRecursively(File dir) { + File[] entries = dir.listFiles(); + if (entries != null) { + for (int i = 0; i < entries.length; i++) { + if (entries[i].isDirectory()) { + deleteRecursively(entries[i]); + } else if (!entries[i].delete()) { + entries[i].deleteOnExit(); + } + } + } + if (!dir.delete()) { + dir.deleteOnExit(); + } + } + + private static byte[] readAll(File f) throws IOException { + return readAll(new java.io.FileInputStream(f)); + } + + private static byte[] readAll(java.io.InputStream in) throws IOException { + try { + java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + /** The same raw byte search as {@link #contains(File, byte[])}, over an array. */ + private static int indexOf(byte[] haystack, byte[] needle) { + int limit = haystack.length - needle.length; + outer: + for (int i = 0; i <= limit; i++) { + for (int j = 0; j < needle.length; j++) { + if (haystack[i + j] != needle[j]) { + continue outer; + } + } + return i; + } + return -1; + } + + private static boolean isPresent(String className) { + try { + Class.forName(className, false, NoGeoApiInCoreTest.class.getClassLoader()); + return true; + } catch (Throwable t) { + return false; + } + } + + /** + * Locates the directory holding this module's compiled main classes, from the location of a + * core class rather than from a hard-coded path, so the test works under Maven and under an + * IDE. + */ + private static File coreClassesDirectory() { + URL url = CoordinateReferenceSystem.class.getResource( + "/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + if (url == null) { + throw new IllegalStateException("cannot locate the compiled core classes"); + } + String path = url.getPath(); + int index = path.indexOf("/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + File dir = new File(decode(path.substring(0, index))); + if (!dir.isDirectory()) { + throw new IllegalStateException("compiled core classes are not in a directory: " + dir); + } + return dir; + } + + private static String decode(String path) { + // Enough of URL decoding for a build path: spaces are the only realistic escape. + return path.replace("%20", " "); + } + + private static void collect(File dir, List out) { + File[] entries = dir.listFiles(); + if (entries == null) { + return; + } + for (int i = 0; i < entries.length; i++) { + if (entries[i].isDirectory()) { + collect(entries[i], out); + } else if (entries[i].getName().endsWith(".class")) { + out.add(entries[i]); + } + } + } + + private static String relative(File root, File file) { + String r = root.getAbsolutePath(); + String f = file.getAbsolutePath(); + return f.startsWith(r) ? f.substring(r.length() + 1) : f; + } + + private static boolean contains(File file, byte[] needle) throws IOException { + RandomAccessFile raf = new RandomAccessFile(file, "r"); + try { + FileChannel channel = raf.getChannel(); + MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, + channel.size()); + int limit = buffer.limit() - needle.length; + outer: + for (int i = 0; i <= limit; i++) { + for (int j = 0; j < needle.length; j++) { + if (buffer.get(i + j) != needle[j]) { + continue outer; + } + } + return true; + } + return false; + } finally { + raf.close(); + } + } + + private static byte[] toBytes(String s) { + byte[] b = new byte[s.length()]; + for (int i = 0; i < s.length(); i++) { + b[i] = (byte) s.charAt(i); + } + return b; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt1EsriReaderTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt1EsriReaderTest.java new file mode 100644 index 0000000..0d473b9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt1EsriReaderTest.java @@ -0,0 +1,282 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * The WKT1 reader, in the ESRI dialect — which is what a consumer receiving CRS definitions from + * ArcGIS, from a shapefile {@code .prj} or from an Oracle column actually gets. + *

+ * Dialect detection follows PROJ's {@code WKTParser::guessDialect} exactly (9.8.1 + * {@code src/iso19111/io.cpp}), including its carve-out for {@code rectified_grid_angle}. + * Projection and parameter names come from PROJ's {@code esriparammappings.cpp}. + */ +public class Wkt1EsriReaderTest { + + private static String proj(String wkt) { + return CrsDefinitions.toProjParameterString(new WktReader().readDefinition(wkt), + AxisOrderPolicy.LEGACY); + } + + /** + * PROJ's rule: a WKT1 root with a {@code GEOGCS["GCS_...]} is ESRI; so is one with neither + * {@code AXIS[} nor {@code AUTHORITY[}. A GDAL string with axes or authorities is not. + */ + @Test + public void dialectDetection() { + assertEquals(WktDialect.WKT1_ESRI, WktDialect.guess(esriUtm11())); + assertEquals(WktDialect.WKT1_GDAL, WktDialect.guess(Wkt1ReaderTest.WGS84_GEOGCS)); + // A leading VERTCS is always ESRI. + assertEquals(WktDialect.WKT1_ESRI, WktDialect.guess( + "VERTCS[\"NAVD_1988\",VDATUM[\"North_American_Vertical_Datum_1988\"]," + + "PARAMETER[\"Vertical_Shift\",0.0],PARAMETER[\"Direction\",1.0]," + + "UNIT[\"Meter\",1.0]]")); + // PROJ issue #3279: rectified_grid_angle forces GDAL even with no AXIS or AUTHORITY, + // because Hotine_Oblique_Mercator_Azimuth_Center exists in both dialects and the ESRI + // reading of it would drop that parameter. + assertEquals(WktDialect.WKT1_GDAL, WktDialect.guess( + "PROJCS[\"x\",GEOGCS[\"y\",DATUM[\"z\",SPHEROID[\"s\",6378137,298.257223563]]," + + "PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]," + + "PROJECTION[\"Hotine_Oblique_Mercator_Azimuth_Center\"]," + + "PARAMETER[\"rectified_grid_angle\",30],UNIT[\"metre\",1]]")); + } + + /** + * An ESRI UTM zone: {@code D_}-prefixed datum, {@code Degree} unit, Title_Case parameters. The + * PROJ string is identical to the one the GDAL spelling of the same CRS produces, because + * parameters are emitted in a canonical order rather than the document's. + */ + @Test + public void esriUtmZone() { + assertEquals("+proj=tmerc +lat_0=0 +lon_0=-117 +k_0=0.9996 +x_0=500000 +y_0=0 " + + "+datum=NAD83 +units=m +no_defs", proj(esriUtm11())); + } + + private static String esriUtm11() { + return "PROJCS[\"NAD_1983_UTM_Zone_11N\",GEOGCS[\"GCS_North_American_1983\"," + + "DATUM[\"D_North_American_1983\",SPHEROID[\"GRS_1980\",6378137.0," + + "298.257222101]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"]," + + "PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",-117.0],PARAMETER[\"Scale_Factor\",0.9996]," + + "PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]"; + } + + /** CASE 81: ESRI projection and parameter names are matched case-insensitively. */ + @Test + public void namesAreCaseInsensitive() { + String wkt = "PROJCS[\"WGS_1984_UTM_Zone_31N\",GEOGCS[\"GCS_WGS_1984\"," + + "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"transverse_mercator\"],PARAMETER[\"false_easting\",500000.0]," + + "PARAMETER[\"FALSE_NORTHING\",0.0],PARAMETER[\"Central_meridian\",3.0]," + + "PARAMETER[\"Scale_factor\",0.9996],PARAMETER[\"latitude_of_origin\",0.0]," + + "UNIT[\"Meter\",1.0]]"; + assertEquals("+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", proj(wkt)); + } + + /** + * The web Mercator every tile server uses. ESRI spells it {@code Mercator_Auxiliary_Sphere} + * with {@code Auxiliary_Sphere_Type} 0, meaning "project onto a sphere of the semi-major + * axis"; that must become an explicit spherical ellipsoid, because keeping the WGS 84 + * flattening would put every coordinate up to 20 km out. + */ + @Test + public void mercatorAuxiliarySphereIsSpherical() { + String wkt = "PROJCS[\"WGS_1984_Web_Mercator_Auxiliary_Sphere\",GEOGCS[\"GCS_WGS_1984\"," + + "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Mercator_Auxiliary_Sphere\"]," + + "PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",0.0],PARAMETER[\"Standard_Parallel_1\",0.0]," + + "PARAMETER[\"Auxiliary_Sphere_Type\",0.0],UNIT[\"Meter\",1.0]]"; + assertEquals("+proj=merc +lon_0=0 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +units=m +no_defs", + proj(wkt)); + + // And it really is EPSG:3857: the result must match the spherical Mercator formula on a + // sphere of radius 6378137, not the ellipsoidal one. At this latitude the two differ by + // about 21 km, so this is not a tolerance question. + CoordinateReferenceSystem crs = new WktReader().read(wkt); + CoordinateReferenceSystem wgs84 = + new CRSFactory().createFromParameters("wgs84", "+proj=longlat +datum=WGS84"); + ProjCoordinate out = new BasicCoordinateTransform(wgs84, crs) + .transform(new ProjCoordinate(-122.4, 37.8), new ProjCoordinate()); + double r = 6378137.0; + double expectedX = r * Math.toRadians(-122.4); + double expectedY = r * Math.log(Math.tan(Math.PI / 4 + Math.toRadians(37.8) / 2)); + assertEquals(expectedX, out.x, 0.001); + assertEquals(expectedY, out.y, 0.001); + } + + /** An Auxiliary_Sphere_Type this library has no equivalent for is refused, not approximated. */ + @Test + public void unsupportedAuxiliarySphereTypeIsRefused() { + String wkt = "PROJCS[\"x\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\"," + + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Mercator_Auxiliary_Sphere\"]," + + "PARAMETER[\"Auxiliary_Sphere_Type\",2.0],UNIT[\"Meter\",1.0]]"; + try { + proj(wkt); + fail("expected a WktParseException"); + } catch (WktParseException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("Auxiliary_Sphere_Type")); + } + } + + /** ESRI's {@code Stereographic_North_Pole} is Polar Stereographic variant B. */ + @Test + public void stereographicNorthPoleIsPolarVariantB() { + String wkt = "PROJCS[\"WGS_1984_Arctic_Polar_Stereographic\",GEOGCS[\"GCS_WGS_1984\"," + + "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Stereographic_North_Pole\"]," + + "PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",0.0]," + + "PARAMETER[\"Standard_Parallel_1\",71.0],UNIT[\"Meter\",1.0]]"; + // +lat_0=90 is derived from the sign of the standard parallel, exactly as PROJ derives it; + // without it +proj=stere would not be polar at all. + assertEquals("+proj=stere +lat_0=90 +lon_0=0 +lat_ts=71 +x_0=0 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", proj(wkt)); + } + + /** ESRI's southern sibling derives {@code +lat_0=-90}. */ + @Test + public void stereographicSouthPole() { + String wkt = "PROJCS[\"Antarctic_Polar_Stereographic\",GEOGCS[\"GCS_WGS_1984\"," + + "DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]]," + + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Stereographic_South_Pole\"]," + + "PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",0.0]," + + "PARAMETER[\"Standard_Parallel_1\",-71.0],UNIT[\"Meter\",1.0]]"; + assertTrue(proj(wkt), proj(wkt).contains("+lat_0=-90")); + } + + /** ESRI's {@code Gauss_Kruger} is Transverse Mercator under another name. */ + @Test + public void gaussKrugerIsTransverseMercator() { + String wkt = "PROJCS[\"Pulkovo_1942_GK_Zone_4\",GEOGCS[\"GCS_Pulkovo_1942\"," + + "DATUM[\"D_Pulkovo_1942\",SPHEROID[\"Krasovsky_1940\",6378245.0,298.3]]," + + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",4500000.0]," + + "PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",21.0]," + + "PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0]," + + "UNIT[\"Meter\",1.0]]"; + assertEquals("+proj=tmerc +lat_0=0 +lon_0=21 +k_0=1 +x_0=4500000 +y_0=0 +ellps=krass " + + "+units=m +no_defs", proj(wkt)); + } + + /** ESRI's {@code Double_Stereographic} is Oblique Stereographic, {@code +proj=sterea}. */ + @Test + public void doubleStereographicIsSterea() { + String wkt = "PROJCS[\"RD_New\",GEOGCS[\"GCS_Amersfoort\",DATUM[\"D_Amersfoort\"," + + "SPHEROID[\"Bessel_1841\",6377397.155,299.1528128]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Double_Stereographic\"]," + + "PARAMETER[\"False_Easting\",155000.0]," + + "PARAMETER[\"False_Northing\",463000.0]," + + "PARAMETER[\"Central_Meridian\",5.387638888888889]," + + "PARAMETER[\"Scale_Factor\",0.9999079]," + + "PARAMETER[\"Latitude_Of_Origin\",52.15616055555555],UNIT[\"Meter\",1.0]]"; + String p = proj(wkt); + assertTrue(p, p.startsWith("+proj=sterea ")); + assertTrue(p, p.contains("+k_0=0.9999079")); + assertTrue(p, p.contains("+ellps=bessel")); + } + + /** ESRI's Swiss CRS degenerates to {@code +proj=somerc}, as PROJ's exporter does. */ + @Test + public void swissObliqueMercatorDegeneratesToSomerc() { + String wkt = "PROJCS[\"CH1903_LV03\",GEOGCS[\"GCS_CH1903\",DATUM[\"D_CH1903\"," + + "SPHEROID[\"Bessel_1841\",6377397.155,299.1528128]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Hotine_Oblique_Mercator_Azimuth_Center\"]," + + "PARAMETER[\"False_Easting\",600000.0]," + + "PARAMETER[\"False_Northing\",200000.0]," + + "PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Azimuth\",90.0]," + + "PARAMETER[\"Longitude_Of_Center\",7.439583333333333]," + + "PARAMETER[\"Latitude_Of_Center\",46.95240555555556],UNIT[\"Meter\",1.0]]"; + String p = proj(wkt); + assertTrue(p, p.startsWith("+proj=somerc ")); + assertTrue(p, p.contains("+lat_0=46.9524055555556")); + assertTrue(p, p.contains("+lon_0=7.43958333333333")); + assertTrue("alpha and gamma are absorbed by somerc", !p.contains("+alpha")); + + // The projection centre must land on the false origin, to the millimetre. + CoordinateReferenceSystem crs = new WktReader().read(wkt); + CoordinateReferenceSystem ch1903 = new CRSFactory().createFromParameters("ch1903geog", + "+proj=longlat +ellps=bessel"); + ProjCoordinate out = new BasicCoordinateTransform(ch1903, crs).transform( + new ProjCoordinate(7.439583333333333, 46.95240555555556), new ProjCoordinate()); + assertEquals(600000.0, out.x, 0.001); + assertEquals(200000.0, out.y, 0.001); + } + + /** ESRI's Lambert_Conformal_Conic is resolved to 1SP or 2SP by which parameters it carries. */ + @Test + public void lambertConformalConicVariantFromParameters() { + String twoParallels = "PROJCS[\"x\",GEOGCS[\"GCS_North_American_1983\"," + + "DATUM[\"D_North_American_1983\",SPHEROID[\"GRS_1980\",6378137.0," + + "298.257222101]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Lambert_Conformal_Conic\"]," + + "PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",-96.0]," + + "PARAMETER[\"Standard_Parallel_1\",33.0]," + + "PARAMETER[\"Standard_Parallel_2\",45.0]," + + "PARAMETER[\"Latitude_Of_Origin\",39.0],UNIT[\"Meter\",1.0]]"; + assertEquals("+proj=lcc +lat_0=39 +lon_0=-96 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 " + + "+datum=NAD83 +units=m +no_defs", proj(twoParallels)); + + String oneParallel = "PROJCS[\"x\",GEOGCS[\"GCS_North_American_1983\"," + + "DATUM[\"D_North_American_1983\",SPHEROID[\"GRS_1980\",6378137.0," + + "298.257222101]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]]," + + "PROJECTION[\"Lambert_Conformal_Conic\"]," + + "PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",-96.0]," + + "PARAMETER[\"Standard_Parallel_1\",33.0]," + + "PARAMETER[\"Scale_Factor\",1.0],UNIT[\"Meter\",1.0]]"; + // 1SP: the single standard parallel is also the latitude of origin. + assertEquals("+proj=lcc +lat_0=33 +lon_0=-96 +lat_1=33 +k_0=1 +x_0=0 +y_0=0 " + + "+datum=NAD83 +units=m +no_defs", proj(oneParallel)); + } + + /** An ESRI foot unit is honoured by its factor even though the name is ESRI's own. */ + @Test + public void esriFootUnit() { + String wkt = "PROJCS[\"x\",GEOGCS[\"GCS_North_American_1983\"," + + "DATUM[\"D_North_American_1983\",SPHEROID[\"GRS_1980\",6378137.0," + + "298.257222101]],PRIMEM[\"Greenwich\",0.0]," + + "UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"]," + + "PARAMETER[\"False_Easting\",984250.0],PARAMETER[\"False_Northing\",0.0]," + + "PARAMETER[\"Central_Meridian\",-90.0],PARAMETER[\"Scale_Factor\",0.9999]," + + "PARAMETER[\"Latitude_Of_Origin\",0.0]," + + "UNIT[\"Foot_US\",0.3048006096012192]]"; + assertTrue(proj(wkt), proj(wkt).contains("+units=us-ft")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt1ReaderTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt1ReaderTest.java new file mode 100644 index 0000000..5de2500 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt1ReaderTest.java @@ -0,0 +1,382 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.BasicCoordinateTransform; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * The WKT1 reader, in the OGC/GDAL dialect. + *

+ * Inputs are taken verbatim from PROJ 9.8.1's {@code test/unit/test_io.cpp} — the corpus case + * numbers in the comments refer to the extraction of that file. Expectations are either upstream's + * own, or, where upstream asserts a PROJ string containing operations proj4j spells differently + * ({@code +k} versus {@code +k_0}, no {@code +type=crs}), the equivalent this library produces, + * with the difference stated. + */ +public class Wkt1ReaderTest { + + static final String WGS84_GEOGCS = + "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563," + + "AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]]," + + "PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]]," + + "UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]]," + + "AUTHORITY[\"EPSG\",\"4326\"]]"; + + private static String proj(String wkt) { + return CrsDefinitions.toProjParameterString(new WktReader().readDefinition(wkt), + AxisOrderPolicy.LEGACY); + } + + /** CASE 3: EPSG:4326 as WKT1, with no AXIS clauses at all. */ + @Test + public void geographicWgs84() { + CrsDefinition def = new WktReader().readDefinition(WGS84_GEOGCS); + assertEquals(CrsDefinition.Kind.GEOGRAPHIC, def.getKind()); + assertEquals("WGS 84", def.getName()); + assertEquals(new Identifier("EPSG", "4326"), def.getId()); + assertEquals("WGS_1984", def.getDatum().getName()); + assertEquals(new Identifier("EPSG", "6326"), def.getDatum().getId()); + EllipsoidDefinition e = def.getDatum().getEllipsoid(); + assertEquals(6378137.0, e.getSemiMajorAxis(), 0.0); + assertEquals(298.257223563, e.getInverseFlattening(), 0.0); + assertEquals(new Identifier("EPSG", "7030"), e.getId()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(WGS84_GEOGCS)); + assertEquals(WktDialect.WKT1_GDAL, WktDialect.guess(WGS84_GEOGCS)); + } + + /** CASE 4: the WKT1 PRIMEM value is in degrees even when the GEOGCS unit is grad. */ + @Test + public void primeMeridianIsInDegreesInWkt1() { + String wkt = "GEOGCS[\"NTF (Paris)\",DATUM[\"Nouvelle_Triangulation_Francaise_Paris\"," + + "SPHEROID[\"Clarke 1880 (IGN)\",6378249.2,293.466021293627," + + "AUTHORITY[\"EPSG\",\"6807\"]],AUTHORITY[\"EPSG\",\"6807\"]]," + + "PRIMEM[\"Paris\",2.33722917,AUTHORITY[\"EPSG\",\"8903\"]]," + + "UNIT[\"grad\",0.015707963267949,AUTHORITY[\"EPSG\",\"9105\"]]," + + "AXIS[\"latitude\",NORTH],AXIS[\"longitude\",EAST]," + + "AUTHORITY[\"EPSG\",\"4807\"]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + PrimeMeridianDefinition pm = def.getDatum().getPrimeMeridian(); + assertEquals("Paris", pm.getName()); + assertEquals(2.33722917, pm.getLongitudeDegrees(), 1e-12); + // The CRS's angular unit is grad, and the axes were parsed and retained; neither changes + // the prime meridian's own unit. + assertEquals(UnitDefinition.GRAD.getConversionFactor(), + def.getCoordinateSystem().getUnit().getConversionFactor(), 1e-15); + assertTrue(proj(wkt).contains("+pm=paris")); + } + + /** CASE 15: a PROJCS with no AXIS clauses; also the UTM zone 31N parameters. */ + @Test + public void projectedUtm31N() { + String wkt = "PROJCS[\"WGS 84 / UTM zone 31N\"," + WGS84_GEOGCS.replace("AUTHORITY[\"EPSG\",\"4326\"]", + "AXIS[\"latitude\",NORTH],AXIS[\"longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]") + + ",PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0]," + + "PARAMETER[\"central_meridian\",3],PARAMETER[\"scale_factor\",0.9996]," + + "PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0]," + + "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"32631\"]]"; + // Upstream: +proj=tmerc +lat_0=0 +lon_0=3 +k=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 + // +units=m +no_defs +type=crs + // This library writes the equivalent +k_0 (proj4j accepts both, preferring +k_0) and does + // not write +type=crs, which proj4j's parser rejects as an unsupported parameter. + assertEquals("+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", proj(wkt)); + CoordinateReferenceSystem crs = new WktReader().read(wkt); + assertEquals("EPSG:32631", crs.getName()); + } + + /** The projected CRS actually transforms: the zone 31 central meridian lands on 500000. */ + @Test + public void projectedUtm31NTransforms() { + String wkt = "PROJCS[\"WGS 84 / UTM zone 31N\"," + WGS84_GEOGCS + + ",PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0]," + + "PARAMETER[\"central_meridian\",3],PARAMETER[\"scale_factor\",0.9996]," + + "PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0]," + + "UNIT[\"metre\",1]]"; + CoordinateReferenceSystem crs = new WktReader().read(wkt); + CoordinateReferenceSystem wgs84 = + new CRSFactory().createFromParameters("wgs84", "+proj=longlat +datum=WGS84"); + ProjCoordinate out = new BasicCoordinateTransform(wgs84, crs) + .transform(new ProjCoordinate(3.0, 0.0), new ProjCoordinate()); + assertEquals(500000.0, out.x, 1e-6); + assertEquals(0.0, out.y, 1e-6); + } + + /** CASE 20: Mercator_1SP with a zero latitude of origin stays Mercator variant A. */ + @Test + public void mercator1SpWithZeroLatitudeOfOrigin() { + String wkt = "PROJCS[\"unnamed\",GEOGCS[\"WGS 84\",DATUM[\"unknown\"," + + "SPHEROID[\"WGS84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Mercator_1SP\"]," + + "PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",0]," + + "PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",0]," + + "PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1],AXIS[\"Easting\",EAST]," + + "AXIS[\"Northing\",NORTH]]"; + // The datum is named "unknown", so no +datum= can be inferred and the ellipsoid is named + // instead. Emitting +datum=WGS84 here would assert a datum the document did not. + assertEquals("+proj=merc +lon_0=0 +k_0=1 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs", + proj(wkt)); + } + + /** + * CASE 20's sibling, GDAL ticket #3026: a Mercator_1SP with a non-zero latitude of origin is + * really variant B, and its standard parallel becomes an equivalent scale factor because + * proj4j's Mercator ignores {@code +lat_ts} entirely. + */ + @Test + public void mercator1SpWithNonZeroLatitudeOfOriginBecomesVariantB() { + String wkt = "PROJCS[\"unnamed\",GEOGCS[\"WGS 84\",DATUM[\"unknown\"," + + "SPHEROID[\"WGS84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Mercator_1SP\"]," + + "PARAMETER[\"latitude_of_origin\",30],PARAMETER[\"central_meridian\",0]," + + "PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",0]," + + "PARAMETER[\"false_northing\",0],UNIT[\"Meter\",1]]"; + String p = proj(wkt); + assertTrue(p, p.startsWith("+proj=merc ")); + // k0 = cos(30) / sqrt(1 - e^2 sin^2(30)), EPSG Guidance Note 7-2. + double es = 2 / 298.257223563 - 1 / (298.257223563 * 298.257223563); + double expected = Math.cos(Math.toRadians(30)) + / Math.sqrt(1 - es * Math.pow(Math.sin(Math.toRadians(30)), 2)); + assertTrue(p, p.contains("+k_0=" + WktFormatTestAccess.number(expected))); + assertTrue("no +lat_ts may survive, proj4j's Mercator ignores it", !p.contains("+lat_ts")); + } + + /** CASE 22: Krovak with south/west axes is EPSG 9819 and needs {@code +axis=swu}. */ + @Test + public void krovakSouthWest() { + assertEquals("+proj=krovak +axis=swu +lat_0=49.5 +lon_0=24.8333333333333 " + + "+alpha=30.2881397527778 +k_0=0.9999 +x_0=0 +y_0=0 +ellps=bessel " + + "+units=m +no_defs", + proj(krovak("AXIS[\"X\",SOUTH],AXIS[\"Y\",WEST],"))); + } + + /** CASE 23: the same WKT with east/north axes is EPSG 1041 and must not be flipped. */ + @Test + public void krovakEastNorth() { + assertEquals("+proj=krovak +lat_0=49.5 +lon_0=24.8333333333333 +alpha=30.2881397527778 " + + "+k_0=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs", + proj(krovak("AXIS[\"X\",EAST],AXIS[\"Y\",NORTH],"))); + } + + private static String krovak(String axes) { + return "PROJCS[\"S-JTSK / Krovak\",GEOGCS[\"S-JTSK\"," + + "DATUM[\"System_Jednotne_Trigonometricke_Site_Katastralni\"," + + "SPHEROID[\"Bessel 1841\",6377397.155,299.1528128,AUTHORITY[\"EPSG\",\"7004\"]]," + + "AUTHORITY[\"EPSG\",\"6156\"]],PRIMEM[\"Greenwich\",0," + + "AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433," + + "AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4156\"]]," + + "PROJECTION[\"Krovak\"],PARAMETER[\"latitude_of_center\",49.5]," + + "PARAMETER[\"longitude_of_center\",24.83333333333333]," + + "PARAMETER[\"azimuth\",30.2881397527778]," + + "PARAMETER[\"pseudo_standard_parallel_1\",78.5]," + + "PARAMETER[\"scale_factor\",0.9999],PARAMETER[\"false_easting\",0]," + + "PARAMETER[\"false_northing\",0],UNIT[\"metre\",1," + + "AUTHORITY[\"EPSG\",\"9001\"]]," + axes + "AUTHORITY[\"EPSG\",\"5513\"]]"; + } + + /** CASE 43: a GEOGCS with a three-term TOWGS84 becomes a bound CRS. */ + @Test + public void geogcsWithThreeTermTowgs84() { + String wkt = "GEOGCS[\"my GCS\",DATUM[\"my datum\"," + + "SPHEROID[\"WGS 84\",6378137,298.257223563],TOWGS84[1,2,3]]," + + "PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertNotNull(def.getToWgs84()); + assertEquals(3, def.getToWgs84().length); + assertEquals("+proj=longlat +ellps=WGS84 +towgs84=1,2,3 +no_defs", proj(wkt)); + } + + /** CASE 44: a PROJCS whose base carries a seven-term TOWGS84. */ + @Test + public void projcsWithSevenTermTowgs84() { + String wkt = "PROJCS[\"my PCS\",GEOGCS[\"my GCS\",DATUM[\"my datum\"," + + "SPHEROID[\"Bessel 1841\",6377397.155,299.1528128]," + + "TOWGS84[1,2,3,4,5,6,7]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"]," + + "PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",9]," + + "PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",0]," + + "PARAMETER[\"false_northing\",0],UNIT[\"metre\",1]]"; + assertEquals("+proj=tmerc +lat_0=0 +lon_0=9 +k_0=1 +x_0=0 +y_0=0 +ellps=bessel " + + "+towgs84=1,2,3,4,5,6,7 +units=m +no_defs", proj(wkt)); + } + + /** A US survey foot state plane: the unit is honoured by its factor. */ + @Test + public void projectedInUsSurveyFeet() { + String wkt = "PROJCS[\"NAD83 / Texas Central (ftUS)\",GEOGCS[\"NAD83\"," + + "DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS 1980\",6378137," + + "298.257222101]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]," + + "PROJECTION[\"Lambert_Conformal_Conic_2SP\"]," + + "PARAMETER[\"standard_parallel_1\",31.88333333333333]," + + "PARAMETER[\"standard_parallel_2\",30.11666666666667]," + + "PARAMETER[\"latitude_of_origin\",29.66666666666667]," + + "PARAMETER[\"central_meridian\",-100.3333333333333]," + + "PARAMETER[\"false_easting\",2296583.333]," + + "PARAMETER[\"false_northing\",9842500]," + + "UNIT[\"US survey foot\",0.3048006096012192]]"; + String p = proj(wkt); + assertTrue(p, p.contains("+units=us-ft")); + assertTrue(p, p.contains("+datum=NAD83")); + assertTrue(p, p.contains("+lat_1=31.8833333333333")); + assertTrue(p, p.contains("+lat_2=30.1166666666667")); + } + + /** A Lambert Conic Conformal 1SP must produce both {@code +lat_1} and {@code +lat_0}. */ + @Test + public void lambertConformalConic1SpDerivesLat1() { + String wkt = "PROJCS[\"unnamed\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\"," + + "SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]]," + + "PROJECTION[\"Lambert_Conformal_Conic_1SP\"]," + + "PARAMETER[\"latitude_of_origin\",25],PARAMETER[\"central_meridian\",-95]," + + "PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",0]," + + "PARAMETER[\"false_northing\",0],UNIT[\"metre\",1]]"; + assertEquals("+proj=lcc +lat_0=25 +lon_0=-95 +lat_1=25 +k_0=1 +x_0=0 +y_0=0 " + + "+datum=WGS84 +units=m +no_defs", proj(wkt)); + } + + /** An unnamed WKT1 projection method is refused, not guessed at. */ + @Test + public void unknownProjectionMethodIsRefused() { + String wkt = "PROJCS[\"unnamed\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\"," + + "SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]],PROJECTION[\"Not_A_Projection\"]," + + "UNIT[\"metre\",1]]"; + try { + proj(wkt); + fail("expected a WktParseException for an unknown method"); + } catch (WktParseException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("Not_A_Projection")); + } + } + + /** CASE 63-67: structurally invalid WKT1 is rejected rather than half-read. */ + @Test + public void invalidWkt1IsRejected() { + String[] invalid = { + "GEOGCS[\"foo\"]", + "GEOGCS[\"foo\",DATUM[\"bar\"]]", + "GEOGCS[\"foo\",DATUM[\"bar\",SPHEROID[\"x\"]]]", + "PROJCS[\"foo\"]", + "PROJCS[\"foo\",GEOGCS[\"bar\",DATUM[\"baz\"," + + "SPHEROID[\"x\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]]]", + "SPHEROID[\"x\",6378137,298.257223563]", + }; + for (int i = 0; i < invalid.length; i++) { + try { + new WktReader().readDefinition(invalid[i]); + fail("expected a WktParseException for \"" + invalid[i] + "\""); + } catch (WktParseException expected) { + // the point + } + } + } + + /** CASE 69: a TOWGS84 with the wrong number of terms is an error, not a truncation. */ + @Test + public void invalidTowgs84IsRejected() { + String wkt = "GEOGCS[\"foo\",DATUM[\"bar\",SPHEROID[\"WGS 84\",6378137,298.257223563]," + + "TOWGS84[1,2]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]"; + try { + new WktReader().readDefinition(wkt); + fail("expected a WktParseException"); + } catch (WktParseException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("TOWGS84")); + } + } + + /** CASE 33: a WKT1 VERT_CS is parsed, retained, and refused as a proj4j CRS. */ + @Test + public void verticalCrsIsParsedButCannotBecomeACrs() { + String wkt = "VERT_CS[\"ODN height\",VERT_DATUM[\"Ordnance Datum Newlyn\",2005," + + "AUTHORITY[\"EPSG\",\"5101\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]]," + + "AXIS[\"Gravity-related height\",UP],AUTHORITY[\"EPSG\",\"5701\"]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals(CrsDefinition.Kind.VERTICAL, def.getKind()); + assertEquals("ODN height", def.getName()); + assertEquals("Ordnance Datum Newlyn", def.getDatum().getName()); + assertEquals(1, def.getCoordinateSystem().getAxes().size()); + assertTrue(def.getCoordinateSystem().getAxes().get(0).isVertical()); + assertNull(def.horizontalComponent()); + try { + CrsDefinitions.toCrs(def, AxisOrderPolicy.LEGACY); + fail("a vertical-only CRS must be refused, not silently made horizontal"); + } catch (WktParseException expected) { + // the point + } + } + + /** CASE 37: a COMPD_CS yields its horizontal component, and says so. */ + @Test + public void compoundCrsUsesItsHorizontalComponent() { + String wkt = "COMPD_CS[\"WGS 84 + ODN height\"," + WGS84_GEOGCS + + ",VERT_CS[\"ODN height\",VERT_DATUM[\"Ordnance Datum Newlyn\",2005]," + + "UNIT[\"metre\",1],AXIS[\"Gravity-related height\",UP]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals(CrsDefinition.Kind.COMPOUND, def.getKind()); + assertEquals(2, def.getComponents().size()); + assertEquals(CrsDefinition.Kind.GEOGRAPHIC, def.horizontalComponent().getKind()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(wkt)); + } + + /** A BOUNDCRS's abridged transformation becomes {@code +towgs84}. */ + @Test + public void boundCrsAbridgedTransformation() { + String wkt = "BOUNDCRS[SOURCECRS[GEOGCRS[\"NTF\",DATUM[\"Nouvelle Triangulation " + + "Francaise\",ELLIPSOID[\"Clarke 1880 (IGN)\",6378249.2,293.4660212936269," + + "LENGTHUNIT[\"metre\",1]]],PRIMEM[\"Greenwich\",0," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],CS[ellipsoidal,2]," + + "AXIS[\"latitude\",north,ORDER[1],ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "AXIS[\"longitude\",east,ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]]]]," + + "TARGETCRS[GEOGCRS[\"WGS 84\",DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2],AXIS[\"latitude\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"longitude\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],ID[\"EPSG\",4326]]]," + + "ABRIDGEDTRANSFORMATION[\"NTF to WGS 84 (1)\"," + + "METHOD[\"Geocentric translations (geog2D domain)\",ID[\"EPSG\",9603]]," + + "PARAMETER[\"X-axis translation\",-168,ID[\"EPSG\",8605]]," + + "PARAMETER[\"Y-axis translation\",-60,ID[\"EPSG\",8606]]," + + "PARAMETER[\"Z-axis translation\",320,ID[\"EPSG\",8607]]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals(CrsDefinition.Kind.BOUND, def.getKind()); + assertEquals(3, def.getToWgs84().length); + assertEquals(-168.0, def.getToWgs84()[0], 0.0); + // Clarke 1880 (IGN) is not one of proj4j's built-in ellipsoids, so the axes are given + // explicitly — and as +a and +b, never +rf, because the semi-minor axis is exact and + // needs no reciprocal. + assertEquals("+proj=longlat +ellps=clrk80ign +towgs84=-168,-60,320 +no_defs", + proj(wkt)); + } + + /** Exposes {@link WktFormat} to tests in this package without widening its visibility. */ + static final class WktFormatTestAccess { + static String number(double v) { + return WktFormat.number(v); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt2ReaderTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt2ReaderTest.java new file mode 100644 index 0000000..473e113 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/Wkt2ReaderTest.java @@ -0,0 +1,376 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; + +/** + * The WKT2 reader, over inputs taken from PROJ 9.8.1's {@code test/unit/test_io.cpp} + * ({@code wkt_parse.wkt2_*}). Corpus case numbers in the comments refer to the extraction of that + * file. + */ +public class Wkt2ReaderTest { + + /** CASE 111: EPSG:4326 in canonical, fully-decorated WKT2:2015. */ + static final String GEODCRS_4326 = + "GEODCRS[\"WGS 84\",\n" + + " DATUM[\"World Geodetic System 1984\",\n" + + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n" + + " LENGTHUNIT[\"metre\",1,\n" + + " ID[\"EPSG\",9001]],\n" + + " ID[\"EPSG\",7030]],\n" + + " ID[\"EPSG\",6326]],\n" + + " PRIMEM[\"Greenwich\",0,\n" + + " ANGLEUNIT[\"degree\",0.0174532925199433,\n" + + " ID[\"EPSG\",9122]],\n" + + " ID[\"EPSG\",8901]],\n" + + " CS[ellipsoidal,2],\n" + + " AXIS[\"latitude\",north,\n" + + " ORDER[1],\n" + + " ANGLEUNIT[\"degree\",0.0174532925199433,\n" + + " ID[\"EPSG\",9122]]],\n" + + " AXIS[\"longitude\",east,\n" + + " ORDER[2],\n" + + " ANGLEUNIT[\"degree\",0.0174532925199433,\n" + + " ID[\"EPSG\",9122]]],\n" + + " ID[\"EPSG\",4326]]"; + + /** A source CRS on a datum proj4j has no built-in code for, so its Helmert terms matter. */ + private static final String DATUM_73 = + "GEOGCRS[\"Datum 73\",DATUM[\"Datum 73\"," + + "ELLIPSOID[\"International 1924\",6378388,297,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2],AXIS[\"latitude\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"longitude\",east," + + "ORDER[2],ANGLEUNIT[\"degree\",0.0174532925199433]]]"; + + private static String proj(String wkt) { + return CrsDefinitions.toProjParameterString(new WktReader().readDefinition(wkt), + AxisOrderPolicy.LEGACY); + } + + @Test + public void geodcrs4326() { + CrsDefinition def = new WktReader().readDefinition(GEODCRS_4326); + assertEquals(CrsDefinition.Kind.GEOGRAPHIC, def.getKind()); + assertEquals("WGS 84", def.getName()); + assertEquals(new Identifier("EPSG", "4326"), def.getId()); + assertEquals("World Geodetic System 1984", def.getDatum().getName()); + assertEquals(new Identifier("EPSG", "6326"), def.getDatum().getId()); + assertEquals(new Identifier("EPSG", "7030"), def.getDatum().getEllipsoid().getId()); + // The declared axis order is latitude first, and it is retained verbatim. + assertEquals(2, def.getCoordinateSystem().getAxes().size()); + assertEquals(AxisDefinition.NORTH, + def.getCoordinateSystem().getAxes().get(0).getDirection()); + assertEquals(AxisDefinition.EAST, + def.getCoordinateSystem().getAxes().get(1).getDirection()); + assertEquals(WktDialect.WKT2_2015, WktDialect.guess(GEODCRS_4326)); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(GEODCRS_4326)); + } + + /** CASE 112-114: the long and 2019 keywords describe the same thing. */ + @Test + public void keywordVariants() { + String[] variants = { + GEODCRS_4326, + GEODCRS_4326.replaceFirst("GEODCRS", "GEODETICCRS"), + GEODCRS_4326.replaceFirst("GEODCRS", "GEOGCRS"), + GEODCRS_4326.replaceFirst("GEODCRS", "GEOGRAPHICCRS"), + }; + for (int i = 0; i < variants.length; i++) { + CrsDefinition def = new WktReader().readDefinition(variants[i]); + assertEquals(CrsDefinition.Kind.GEOGRAPHIC, def.getKind()); + assertEquals("WGS 84", def.getName()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(variants[i])); + } + assertEquals(WktDialect.WKT2_2019, + WktDialect.guess(GEODCRS_4326.replaceFirst("GEODCRS", "GEOGCRS"))); + } + + /** CASE 115: the simplified form — abbreviations in the axis name, one CS-level unit. */ + @Test + public void simplifiedForm() { + String wkt = "GEODCRS[\"WGS 84\",DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563]],CS[ellipsoidal,2]," + + "AXIS[\"latitude (lat)\",north],AXIS[\"longitude (lon)\",east]," + + "UNIT[\"degree\",0.0174532925199433],ID[\"EPSG\",4326]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + AxisDefinition lat = def.getCoordinateSystem().getAxes().get(0); + assertEquals("latitude", lat.getName()); + assertEquals("lat", lat.getAbbreviation()); + assertEquals(UnitDefinition.DEGREE.getConversionFactor(), + def.getCoordinateSystem().unitOf(0).getConversionFactor(), 0.0); + // No PRIMEM at all: Greenwich is the default. + assertTrue(def.getDatum().getPrimeMeridian().isGreenwich()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(wkt)); + } + + /** CASE 108: EPSG:4326's WKT2:2019 form uses ENSEMBLE rather than DATUM. */ + @Test + public void datumEnsemble() { + String wkt = "GEOGCRS[\"WGS 84\",ENSEMBLE[\"World Geodetic System 1984 ensemble\"," + + "MEMBER[\"World Geodetic System 1984 (Transit)\"]," + + "MEMBER[\"World Geodetic System 1984 (G730)\"]," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]]," + + "ENSEMBLEACCURACY[2.0]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2]," + + "AXIS[\"geodetic latitude (Lat)\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "AXIS[\"geodetic longitude (Lon)\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],ID[\"EPSG\",4326]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals("World Geodetic System 1984 ensemble", def.getDatum().getName()); + assertNotNull(def.getDatum().getEllipsoid()); + assertEquals(WktDialect.WKT2_2019, WktDialect.guess(wkt)); + // The ensemble name is not one proj4j has a +datum= for, so the ellipsoid is named. + assertEquals("+proj=longlat +ellps=WGS84 +no_defs", proj(wkt)); + } + + /** CASE 123: a WKT2 PROJCRS whose parameters omit their units, inheriting the CRS's. */ + @Test + public void projectedWithOmittedParameterUnits() { + String wkt = "PROJCRS[\"WGS 84 / UTM zone 31N\",BASEGEODCRS[\"WGS 84\"," + + "DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563]]," + + "PRIMEM[\"Greenwich\",0]],CONVERSION[\"UTM zone 31N\"," + + "METHOD[\"Transverse Mercator\",ID[\"EPSG\",9807]]," + + "PARAMETER[\"Latitude of natural origin\",0]," + + "PARAMETER[\"Longitude of natural origin\",3]," + + "PARAMETER[\"Scale factor at natural origin\",0.9996]," + + "PARAMETER[\"False easting\",500000]," + + "PARAMETER[\"False northing\",0]],CS[Cartesian,2]," + + "AXIS[\"(E)\",east],AXIS[\"(N)\",north],LENGTHUNIT[\"metre\",1]," + + "ID[\"EPSG\",32631]]"; + assertEquals("+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", proj(wkt)); + } + + /** CASE 131: the base CRS's angular unit comes from its PRIMEM's ANGLEUNIT. */ + @Test + public void baseAngularUnitFromPrimeMeridian() { + String wkt = "PROJCRS[\"NTF (Paris) / Lambert zone II\"," + + "BASEGEODCRS[\"NTF (Paris)\"," + + "DATUM[\"Nouvelle Triangulation Francaise (Paris)\"," + + "ELLIPSOID[\"Clarke 1880 (IGN)\",6378249.2,293.4660212936269," + + "LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Paris\",2.5969213,ANGLEUNIT[\"grad\",0.015707963267949]]]," + + "CONVERSION[\"Lambert zone II\"," + + "METHOD[\"Lambert Conic Conformal (1SP)\",ID[\"EPSG\",9801]]," + + "PARAMETER[\"Latitude of natural origin\",52," + + "ANGLEUNIT[\"grad\",0.015707963267949]]," + + "PARAMETER[\"Longitude of natural origin\",0," + + "ANGLEUNIT[\"grad\",0.015707963267949]]," + + "PARAMETER[\"Scale factor at natural origin\",0.99987742," + + "SCALEUNIT[\"unity\",1]]," + + "PARAMETER[\"False easting\",600000,LENGTHUNIT[\"metre\",1]]," + + "PARAMETER[\"False northing\",2200000,LENGTHUNIT[\"metre\",1]]]," + + "CS[Cartesian,2],AXIS[\"easting (X)\",east,ORDER[1]," + + "LENGTHUNIT[\"metre\",1]],AXIS[\"northing (Y)\",north,ORDER[2]," + + "LENGTHUNIT[\"metre\",1]]]"; + String p = proj(wkt); + // 52 grad is 46.8 degrees; a reader that assumed degrees would be 5.2 degrees out. + assertTrue(p, p.contains("+lat_0=46.8")); + assertTrue(p, p.contains("+lat_1=46.8")); + // Paris is one of proj4j's built-in meridians, so it is named rather than given as a + // number — its own value is exact, where the WKT's is a rounded grad figure. + assertTrue(p, p.contains("+pm=paris")); + // Emitted as +ellps=clrk80ign, not +a=/+b=. WktNames matches the ellipsoid + // NUMERICALLY against Ellipsoid.ellipsoids, and clrk80ign was added to that array + // to fix +ellps=clrk80ign throwing "Unknown ellipsoid". The substitution is + // exactly lossless - 6378249.2 * (1 - 1/293.4660212936269) = 6356515.0 - and the + // nearest other entry (NAD27) is 0.055 m away, well outside A_TOLERANCE=1e-4, so + // there is no shadowing risk. + assertTrue(p, p.contains("+ellps=clrk80ign")); + } + + /** CASE 152: a COMPOUNDCRS yields its horizontal component. */ + @Test + public void compoundCrs() { + String wkt = "COMPOUNDCRS[\"WGS 84 + EGM96 height\"," + GEODCRS_4326 + "," + + "VERTCRS[\"EGM96 height\",VDATUM[\"EGM96 geoid\"],CS[vertical,1]," + + "AXIS[\"gravity-related height (H)\",up,LENGTHUNIT[\"metre\",1]]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals(CrsDefinition.Kind.COMPOUND, def.getKind()); + assertEquals(2, def.getComponents().size()); + assertEquals(CrsDefinition.Kind.VERTICAL, def.getComponents().get(1).getKind()); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(wkt)); + } + + /** CASE 159/160: a BOUNDCRS's seven-parameter abridged transformation, by name and by code. */ + @Test + public void boundCrsSevenParameterTransformation() { + String wkt = "BOUNDCRS[SOURCECRS[" + DATUM_73 + "],TARGETCRS[" + GEODCRS_4326 + "]," + + "ABRIDGEDTRANSFORMATION[\"Datum 73 to WGS 84 (2)\"," + + "METHOD[\"Position Vector transformation (geog2D domain)\",ID[\"EPSG\",9606]]," + + "PARAMETER[\"X-axis translation\",-223.237,ID[\"EPSG\",8605]]," + + "PARAMETER[\"Y-axis translation\",110.193,ID[\"EPSG\",8606]]," + + "PARAMETER[\"Z-axis translation\",36.649,ID[\"EPSG\",8607]]," + + "PARAMETER[\"X-axis rotation\",-6.878,ID[\"EPSG\",8608]]," + + "PARAMETER[\"Y-axis rotation\",-1.393,ID[\"EPSG\",8609]]," + + "PARAMETER[\"Z-axis rotation\",-3.593,ID[\"EPSG\",8610]]," + + "PARAMETER[\"Scale difference\",1.0000012435,ID[\"EPSG\",8611]]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + double[] t = def.getToWgs84(); + assertEquals(7, t.length); + assertEquals(-223.237, t[0], 0.0); + assertEquals(-6.878, t[3], 0.0); + // The abridged form carries the scale as 1 + s*1e-6, and +towgs84 wants s in ppm. + assertEquals(1.2435, t[6], 1e-9); + assertTrue(proj(wkt), + proj(wkt).contains("+towgs84=-223.237,110.193,36.649,-6.878,-1.393,-3.593,1.2435")); + } + + /** A Coordinate Frame rotation is the opposite sign convention from +towgs84's. */ + @Test + public void coordinateFrameRotationIsNegated() { + String wkt = "BOUNDCRS[SOURCECRS[" + DATUM_73 + "],TARGETCRS[" + GEODCRS_4326 + "]," + + "ABRIDGEDTRANSFORMATION[\"x\"," + + "METHOD[\"Coordinate Frame rotation (geog2D domain)\",ID[\"EPSG\",9607]]," + + "PARAMETER[\"X-axis translation\",1,ID[\"EPSG\",8605]]," + + "PARAMETER[\"Y-axis translation\",2,ID[\"EPSG\",8606]]," + + "PARAMETER[\"Z-axis translation\",3,ID[\"EPSG\",8607]]," + + "PARAMETER[\"X-axis rotation\",4,ID[\"EPSG\",8608]]," + + "PARAMETER[\"Y-axis rotation\",5,ID[\"EPSG\",8609]]," + + "PARAMETER[\"Z-axis rotation\",6,ID[\"EPSG\",8610]]," + + "PARAMETER[\"Scale difference\",1.000007,ID[\"EPSG\",8611]]]]"; + double[] t = new WktReader().readDefinition(wkt).getToWgs84(); + assertEquals(-4.0, t[3], 1e-12); + assertEquals(-5.0, t[4], 1e-12); + assertEquals(-6.0, t[5], 1e-12); + assertEquals(7.0, t[6], 1e-9); + } + + /** CASE 144: a VERTCRS is read and retained. */ + @Test + public void verticalCrs() { + String wkt = "VERTCRS[\"ODN height\",VDATUM[\"Ordnance Datum Newlyn\"],CS[vertical,1]," + + "AXIS[\"gravity-related height (H)\",up,LENGTHUNIT[\"metre\",1]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals(CrsDefinition.Kind.VERTICAL, def.getKind()); + assertEquals("Ordnance Datum Newlyn", def.getDatum().getName()); + assertEquals("gravity-related height", def.getCoordinateSystem().getAxes().get(0) + .getName()); + assertEquals("H", def.getCoordinateSystem().getAxes().get(0).getAbbreviation()); + } + + /** CASE 119: a spherical planetocentric GEODCRS is geocentric, not geographic. */ + @Test + public void sphericalPlanetocentric() { + String wkt = "GEODCRS[\"Mercury (2015) / Ographic\"," + + "DATUM[\"Mercury (2015)\",ELLIPSOID[\"Mercury (2015)\",2440530,1075.12334801762," + + "LENGTHUNIT[\"metre\",1]],ANCHOR[\"Hun Kal: 20 W\"]]," + + "PRIMEM[\"Reference Meridian\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[spherical,2]," + + "AXIS[\"planetocentric latitude (U)\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "AXIS[\"planetocentric longitude (V)\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals("Hun Kal: 20 W", def.getDatum().getAnchor()); + assertEquals("spherical", def.getCoordinateSystem().getType()); + } + + /** CASE 105: a DYNAMIC frame's epoch is retained for round-tripping. */ + @Test + public void dynamicReferenceFrame() { + String wkt = "GEOGCRS[\"WGS 84 (G1762)\",DYNAMIC[FRAMEEPOCH[2005.0]]," + + "TRF[\"World Geodetic System 1984 (G1762)\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563,LENGTHUNIT[\"metre\",1]]]," + + "PRIMEM[\"Greenwich\",0,ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "CS[ellipsoidal,2],AXIS[\"latitude\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]],AXIS[\"longitude\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]]"; + CrsDefinition def = new WktReader().readDefinition(wkt); + assertTrue(def.getDatum().isDynamic()); + assertEquals(2005.0, def.getDatum().getFrameEpoch(), 0.0); + assertEquals(WktDialect.WKT2_2019, WktDialect.guess(wkt)); + } + + /** CASE 181: a BBOX must have four values; a malformed USAGE is an error. */ + @Test + public void usageAndBoundingBox() { + String wkt = GEODCRS_4326.replace(" ID[\"EPSG\",4326]]", + " USAGE[SCOPE[\"Horizontal component of 3D system.\"],AREA[\"World.\"]," + + "BBOX[-90,-180,90,180]],ID[\"EPSG\",4326]]"); + CrsDefinition def = new WktReader().readDefinition(wkt); + assertEquals("World.", def.getAreaDescription()); + assertEquals("Horizontal component of 3D system.", def.getScope()); + assertEquals(-90.0, def.getBoundingBox()[0], 0.0); + assertEquals(180.0, def.getBoundingBox()[3], 0.0); + assertEquals(new Identifier("EPSG", "4326"), def.getId()); + } + + /** CASE 186: a PROJCRS with no CONVERSION, or no base CRS, is rejected. */ + @Test + public void invalidWkt2IsRejected() { + String[] invalid = { + "PROJCRS[\"x\"]", + "PROJCRS[\"x\",BASEGEOGCRS[\"y\",DATUM[\"z\",ELLIPSOID[\"e\",6378137," + + "298.257223563]]],CS[Cartesian,2],AXIS[\"(E)\",east]," + + "AXIS[\"(N)\",north],LENGTHUNIT[\"metre\",1]]", + "GEOGCRS[\"x\",CS[ellipsoidal,2],AXIS[\"latitude\",north]," + + "AXIS[\"longitude\",east],ANGLEUNIT[\"degree\",0.0174532925199433]]", + "TIMECRS[\"t\",TDATUM[\"Gregorian\"],CS[temporal,1],AXIS[\"time\",future]]", + }; + for (int i = 0; i < invalid.length; i++) { + try { + new WktReader().readDefinition(invalid[i]); + fail("expected a WktParseException for \"" + invalid[i] + "\""); + } catch (WktParseException expected) { + // the point + } + } + } + + /** An Equidistant Cylindrical with a real standard parallel is refused, not mis-projected. */ + @Test + public void equidistantCylindricalWithStandardParallelIsRefused() { + String wkt = "PROJCRS[\"x\",BASEGEOGCRS[\"WGS 84\"," + + "DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0]]," + + "CONVERSION[\"c\",METHOD[\"Equidistant Cylindrical\",ID[\"EPSG\",1028]]," + + "PARAMETER[\"Latitude of 1st standard parallel\",30," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "PARAMETER[\"Longitude of natural origin\",0," + + "ANGLEUNIT[\"degree\",0.0174532925199433]]," + + "PARAMETER[\"False easting\",0,LENGTHUNIT[\"metre\",1]]," + + "PARAMETER[\"False northing\",0,LENGTHUNIT[\"metre\",1]]]," + + "CS[Cartesian,2],AXIS[\"(E)\",east],AXIS[\"(N)\",north]," + + "LENGTHUNIT[\"metre\",1]]"; + try { + proj(wkt); + fail("expected a refusal: proj4j's eqc ignores the standard parallel"); + } catch (WktParseException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("ignores")); + } + } + + /** Both bracket flavours and mixed case keywords are accepted. */ + @Test + public void bracketsAndCaseAreFlexible() { + String wkt = "geodcrs(\"WGS 84\",datum(\"World Geodetic System 1984\"," + + "ellipsoid(\"WGS 84\",6378137,298.257223563)),cs(ellipsoidal,2)," + + "axis(\"latitude\",north),axis(\"longitude\",east)," + + "unit(\"degree\",0.0174532925199433))"; + assertEquals("+proj=longlat +datum=WGS84 +no_defs", proj(wkt)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/WktParserTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/WktParserTest.java new file mode 100644 index 0000000..3f204c8 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/WktParserTest.java @@ -0,0 +1,131 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; + +/** + * The tokenizer and tree builder, ported from {@code io.wkt_parsing} in PROJ 9.8.1's + * {@code test/unit/test_io.cpp} (corpus CASE 1 and CASE 2). + */ +public class WktParserTest { + + @Test + public void emptyNode() { + WktNode n = WktParser.parse("MYNODE[]"); + assertEquals("MYNODE", n.keyword()); + assertEquals(0, n.childCount()); + assertFalse("an element with no children is still an element, not a value", n.isLeaf()); + } + + @Test + public void whitespaceIsSkipped() { + WktNode n = WktParser.parse(" MYNODE [ ] "); + assertEquals("MYNODE", n.keyword()); + assertEquals(0, n.childCount()); + } + + @Test + public void quotedChild() { + WktNode n = WktParser.parse("MYNODE[\"x\"]"); + assertEquals(1, n.childCount()); + assertEquals("x", n.child(0).value()); + assertTrue(n.child(0).isQuoted()); + assertEquals("MYNODE[\"x\"]", n.toString()); + } + + @Test + public void whitespaceAroundChild() { + WktNode n = WktParser.parse("MYNODE[ \"x\" ]"); + assertEquals(1, n.childCount()); + assertEquals("x", n.child(0).value()); + } + + @Test + public void bracketInsideAQuotedString() { + WktNode n = WktParser.parse("MYNODE[\"x[\",1]"); + assertEquals(2, n.childCount()); + assertEquals("x[", n.child(0).value()); + assertEquals(1.0, n.child(1).asDouble(), 0.0); + assertEquals("MYNODE[\"x[\",1]", n.toString()); + } + + @Test + public void nesting() { + assertEquals("A[B[y]]", WktParser.parse("A[B[y]]").toString()); + assertEquals("A[\"a\",B[\"b\",C[\"c\"]],D[\"d\"]]", + WktParser.parse("A[\"a\",B[\"b\",C[\"c\"]],D[\"d\"]]").toString()); + } + + @Test + public void parenthesesAreAccepted() { + assertEquals("A[\"x\",B[\"y\"]]", WktParser.parse("A(\"x\",B(\"y\"))").toString()); + } + + @Test + public void doubledQuoteIsAnEscapedQuote() { + WktNode n = WktParser.parse("A[\"xy\"\"z\"]"); + assertEquals("xy\"z", n.child(0).value()); + assertEquals("A[\"xy\"\"z\"]", n.toString()); + } + + @Test + public void malformedInputIsRejected() { + String[] invalid = { + "", + "x", + "x,", + "x[", + "[", + "MYNODE[\"x\"", + "MYNODE[\"x\",", + "A[B[", + "MYNODE[\"unterminated", + "MYNODE[1,]", + }; + for (int i = 0; i < invalid.length; i++) { + try { + WktParser.parse(invalid[i]); + fail("expected a WktParseException for \"" + invalid[i] + "\""); + } catch (WktParseException expected) { + // the point + } + } + } + + @Test + public void nullIsRejected() { + try { + WktParser.parse(null); + fail("expected a WktParseException"); + } catch (WktParseException expected) { + // the point + } + } + + @Test + public void findIsCaseInsensitiveAndSkipsQuotedLeaves() { + WktNode n = WktParser.parse("GEOGCS[\"UNIT\",UNIT[\"degree\",0.0174532925199433]]"); + WktNode unit = n.find("unit"); + assertEquals("UNIT", unit.keyword()); + assertEquals("degree", unit.child(0).value()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/io/wkt/WktWriterTest.java b/core/src/test/java/org/locationtech/proj4j/io/wkt/WktWriterTest.java new file mode 100644 index 0000000..8c4a91a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/io/wkt/WktWriterTest.java @@ -0,0 +1,220 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.io.wkt; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; + +/** + * The WKT2 writer: what was read is written back, and what is written can be read again. + */ +public class WktWriterTest { + + /** + * The canonical form this writer produces for EPSG:4326 — one line, unit identifiers included, + * per-axis units, exactly as PROJ's own non-simplified WKT2:2019 export. + */ + private static final String WGS84_WKT2 = + "GEOGCRS[\"WGS 84\"," + + "DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563," + + "LENGTHUNIT[\"metre\",1,ID[\"EPSG\",9001]],ID[\"EPSG\",7030]]," + + "ID[\"EPSG\",6326]]," + + "PRIMEM[\"Greenwich\",0," + + "ANGLEUNIT[\"degree\",0.0174532925199433,ID[\"EPSG\",9122]]," + + "ID[\"EPSG\",8901]]," + + "CS[ellipsoidal,2]," + + "AXIS[\"latitude\",north,ORDER[1]," + + "ANGLEUNIT[\"degree\",0.0174532925199433,ID[\"EPSG\",9122]]]," + + "AXIS[\"longitude\",east,ORDER[2]," + + "ANGLEUNIT[\"degree\",0.0174532925199433,ID[\"EPSG\",9122]]]," + + "ID[\"EPSG\",4326]]"; + + /** Reading the canonical form and writing it again is the identity. */ + @Test + public void geographicRoundTripsExactly() { + CrsDefinition def = new WktReader().readDefinition(WGS84_WKT2); + assertEquals(WGS84_WKT2, new WktWriter().write(def)); + } + + /** The multi-line form parses back to the same text when written single-line. */ + @Test + public void multilineIsReadableAgain() { + CrsDefinition def = new WktReader().readDefinition(WGS84_WKT2); + String multiline = new WktWriter().multiline().write(def); + assertTrue(multiline.contains("\n")); + assertEquals(WGS84_WKT2, new WktWriter().write( + new WktReader().readDefinition(multiline))); + } + + /** A WKT1 input becomes WKT2 that reads back to the same PROJ string. */ + @Test + public void wkt1ProjectedBecomesEquivalentWkt2() { + String wkt1 = "PROJCS[\"WGS 84 / UTM zone 31N\"," + Wkt1ReaderTest.WGS84_GEOGCS + + ",PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0]," + + "PARAMETER[\"central_meridian\",3],PARAMETER[\"scale_factor\",0.9996]," + + "PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0]," + + "UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"32631\"]]"; + CrsDefinition fromWkt1 = new WktReader().readDefinition(wkt1); + String wkt2 = new WktWriter().write(fromWkt1); + + // The WKT1 method and parameter names are translated to their EPSG spellings. + assertTrue(wkt2, wkt2.contains("METHOD[\"Transverse Mercator\",ID[\"EPSG\",9807]]")); + assertTrue(wkt2, wkt2.contains("PARAMETER[\"Latitude of natural origin\",0,")); + assertTrue(wkt2, wkt2.contains("PARAMETER[\"Scale factor at natural origin\",0.9996,")); + assertTrue(wkt2, wkt2.startsWith("PROJCRS[\"WGS 84 / UTM zone 31N\",BASEGEOGCRS[")); + assertTrue(wkt2, wkt2.endsWith("ID[\"EPSG\",32631]]")); + + CrsDefinition fromWkt2 = new WktReader().readDefinition(wkt2); + assertEquals(CrsDefinitions.toProjParameterString(fromWkt1, AxisOrderPolicy.LEGACY), + CrsDefinitions.toProjParameterString(fromWkt2, AxisOrderPolicy.LEGACY)); + // And writing the re-read definition is now stable. + assertEquals(wkt2, new WktWriter().write(fromWkt2)); + } + + /** A projected CRS in WKT2 round-trips exactly. */ + @Test + public void projectedRoundTripsExactly() { + String wkt2 = "PROJCRS[\"WGS 84 / UTM zone 31N\"," + + "BASEGEOGCRS[\"WGS 84\",DATUM[\"World Geodetic System 1984\"," + + "ELLIPSOID[\"WGS 84\",6378137,298.257223563," + + "LENGTHUNIT[\"metre\",1,ID[\"EPSG\",9001]]]]," + + "PRIMEM[\"Greenwich\",0," + + "ANGLEUNIT[\"degree\",0.0174532925199433,ID[\"EPSG\",9122]]]," + + "ID[\"EPSG\",4326]]," + + "CONVERSION[\"UTM zone 31N\"," + + "METHOD[\"Transverse Mercator\",ID[\"EPSG\",9807]]," + + "PARAMETER[\"Latitude of natural origin\",0," + + "ANGLEUNIT[\"degree\",0.0174532925199433],ID[\"EPSG\",8801]]," + + "PARAMETER[\"Longitude of natural origin\",3," + + "ANGLEUNIT[\"degree\",0.0174532925199433],ID[\"EPSG\",8802]]," + + "PARAMETER[\"Scale factor at natural origin\",0.9996," + + "SCALEUNIT[\"unity\",1],ID[\"EPSG\",8805]]," + + "PARAMETER[\"False easting\",500000,LENGTHUNIT[\"metre\",1],ID[\"EPSG\",8806]]," + + "PARAMETER[\"False northing\",0,LENGTHUNIT[\"metre\",1],ID[\"EPSG\",8807]]]," + + "CS[Cartesian,2]," + + "AXIS[\"(E)\",east,ORDER[1],LENGTHUNIT[\"metre\",1,ID[\"EPSG\",9001]]]," + + "AXIS[\"(N)\",north,ORDER[2],LENGTHUNIT[\"metre\",1,ID[\"EPSG\",9001]]]," + + "ID[\"EPSG\",32631]]"; + assertEquals(wkt2, new WktWriter().write(new WktReader().readDefinition(wkt2))); + } + + /** WKT2:2015 uses GEODCRS and writes SCOPE/AREA/BBOX without a USAGE wrapper. */ + @Test + public void wkt2015Differences() { + CrsDefinition def = new WktReader().readDefinition(WGS84_WKT2); + def.setScope("Horizontal component of 3D system."); + def.setAreaDescription("World."); + def.setBoundingBox(new double[]{-90, -180, 90, 180}); + String wkt2019 = new WktWriter(WktDialect.WKT2_2019).write(def); + String wkt2015 = new WktWriter(WktDialect.WKT2_2015).write(def); + assertTrue(wkt2019, wkt2019.contains("USAGE[SCOPE[")); + assertTrue(wkt2015, wkt2015.startsWith("GEODCRS[")); + assertTrue(wkt2015, !wkt2015.contains("USAGE[")); + assertTrue(wkt2015, wkt2015.contains("SCOPE[\"Horizontal component of 3D system.\"]")); + // Both are readable, and describe the same thing. + assertEquals(CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(wkt2015), AxisOrderPolicy.LEGACY), + CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(wkt2019), AxisOrderPolicy.LEGACY)); + } + + /** Writing a bare proj4j CRS describes what such a CRS actually knows. */ + @Test + public void writesAProj4jCrs() { + CoordinateReferenceSystem crs = new CRSFactory().createFromParameters("utm31", + "+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m"); + String wkt2 = new WktWriter().write(crs); + assertTrue(wkt2, wkt2.startsWith("PROJCRS[\"utm31\",")); + assertTrue(wkt2, wkt2.contains("METHOD[\"Transverse Mercator\",ID[\"EPSG\",9807]]")); + assertTrue(wkt2, wkt2.contains("PARAMETER[\"Longitude of natural origin\",3,")); + assertTrue(wkt2, wkt2.contains("PARAMETER[\"False easting\",500000,")); + // Read it back and the PROJ parameters agree with what we started from. + String proj = CrsDefinitions.toProjParameterString( + new WktReader().readDefinition(wkt2), AxisOrderPolicy.LEGACY); + assertEquals("+proj=tmerc +lat_0=0 +lon_0=3 +k_0=0.9996 +x_0=500000 +y_0=0 +datum=WGS84 " + + "+units=m +no_defs", proj); + } + + /** A geographic proj4j CRS is written as a GEOGCRS. */ + @Test + public void writesAGeographicProj4jCrs() { + CoordinateReferenceSystem crs = new CRSFactory().createFromParameters("wgs84", + "+proj=longlat +datum=WGS84"); + String wkt2 = new WktWriter().write(crs); + assertTrue(wkt2, wkt2.startsWith("GEOGCRS[\"WGS 84\",")); + assertTrue(wkt2, wkt2.contains("ELLIPSOID[\"WGS 84\",6378137,298.257223563")); + assertEquals("+proj=longlat +datum=WGS84 +no_defs", + CrsDefinitions.toProjParameterString(new WktReader().readDefinition(wkt2), + AxisOrderPolicy.LEGACY)); + } + + /** A bound CRS is written with its abridged transformation and reads back identically. */ + @Test + public void boundCrsRoundTrips() { + String wkt1 = "GEOGCS[\"my GCS\",DATUM[\"my datum\"," + + "SPHEROID[\"Bessel 1841\",6377397.155,299.1528128]," + + "TOWGS84[1,2,3,4,5,6,7]],PRIMEM[\"Greenwich\",0]," + + "UNIT[\"degree\",0.0174532925199433]]"; + CrsDefinition def = new WktReader().readDefinition(wkt1); + // The definition read from WKT1 is geographic with Helmert parameters; asked to write it + // as WKT2 the bound form is what carries them, so the caller states that intent. + CrsDefinition bound = new CrsDefinition(); + bound.setKind(CrsDefinition.Kind.BOUND); + bound.setName(def.getName()); + bound.setBaseCrs(def); + bound.setToWgs84(def.getToWgs84()); + String wkt2 = new WktWriter().write(bound); + assertTrue(wkt2, wkt2.startsWith("BOUNDCRS[SOURCECRS[GEOGCRS[\"my GCS\",")); + assertTrue(wkt2, wkt2.contains("ABRIDGEDTRANSFORMATION[\"Transformation to WGS84\"")); + // 1 + 7e-6 is how the abridged form spells 7 ppm. + assertTrue(wkt2, wkt2.contains("PARAMETER[\"Scale difference\",1.000007,")); + + CrsDefinition reread = new WktReader().readDefinition(wkt2); + assertEquals(CrsDefinition.Kind.BOUND, reread.getKind()); + // 7 ppm survives to nine digits: the abridged form stores 1 + s*1e-6, and recovering s + // from it costs a few bits. PROJ loses the same bits for the same reason. + assertEquals(7.0, reread.getToWgs84()[6], 1e-7); + String proj = CrsDefinitions.toProjParameterString(reread, AxisOrderPolicy.LEGACY); + assertTrue(proj, proj.startsWith("+proj=longlat +ellps=bessel +towgs84=1,2,3,4,5,6,7")); + } + + /** The writer refuses WKT1: this package reads that dialect but does not produce it. */ + @Test(expected = IllegalArgumentException.class) + public void refusesToWriteWkt1() { + new WktWriter(WktDialect.WKT1_GDAL); + } + + /** Numbers are spelled as PROJ spells them: no exponents, fifteen significant digits. */ + @Test + public void numberFormatting() { + assertEquals("0", WktFormat.number(0.0)); + assertEquals("1", WktFormat.number(1.0)); + assertEquals("-180", WktFormat.number(-180.0)); + assertEquals("6378137", WktFormat.number(6378137.0)); + assertEquals("0.9996", WktFormat.number(0.9996)); + assertEquals("298.257223563", WktFormat.number(298.257223563)); + assertEquals("0.0174532925199433", WktFormat.number(Math.PI / 180)); + assertEquals("0.304800609601219", WktFormat.number(12.0 / 39.37)); + assertEquals("0.00001", WktFormat.number(1e-5)); + assertEquals("49.00000000001", WktFormat.number(49.00000000001)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerical/GieAssertion.java b/core/src/test/java/org/locationtech/proj4j/numerical/GieAssertion.java new file mode 100644 index 0000000..e5a0e88 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerical/GieAssertion.java @@ -0,0 +1,186 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.numerical; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.gie.GieComparator; + +/** + * One {@code accept}/{@code expect} pair from the vendored conformance corpus, evaluated against + * proj4j with gie's own metric. + * + *

Every expectation in this package is copied out of + * {@code conformance/src/test/resources/gie/builtins.gie} — a byte-identical copy of + * {@code 9.8.1:test/gie/builtins.gie} — and every test method names the projection and the block it + * came from. A value that traces to upstream is evidence; a value that traces to a previous proj4j + * run is not. + * + *

The metric branch matters. gie picks among four ({@code gie.cpp}); the two that arise + * here are Euclidean metres for a forward row, whose expected value is projected, and the geodesic + * distance on the ellipsoid under test for an inverse row, whose expected value is degrees. Applying + * the angular scale to a projected target inflates the number by about 111,319. + * + *

A near-duplicate of {@code numerics.wiring.GieCase}, which is package-private in its own + * package and so not reachable from here. The duplication is deliberate: making either one public + * would put a test helper on the library's API surface. + */ +final class GieAssertion { + + /** One millimetre in metres — the common {@code tolerance 0.1 mm} rows. */ + static final double MM = 1.0e-3; + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + private final CoordinateReferenceSystem geographic; + private final CoordinateReferenceSystem projected; + private final GieComparator comparator; + private final String operation; + + /** + * @param operation the {@code operation} line's proj-string, minus the keyword + * @param ellipsoid the same ellipsoid or radius parameters, for the paired + * {@code +proj=longlat} side and for the geodesic metric + * @param a the semi-major axis the metric should use + * @param f the flattening the metric should use; {@code 0} for a sphere + */ + private GieAssertion(String operation, String ellipsoid, double a, double f) { + this.operation = operation; + this.geographic = CRS.createFromParameters("gie-geog", + "+proj=longlat " + ellipsoid + " +no_defs"); + this.projected = CRS.createFromParameters("gie-proj", operation + " +no_defs"); + this.comparator = GieComparator.forEllipsoid(a, f); + } + + /** A row on {@code +ellps=WGS84}. */ + static GieAssertion wgs84(String operation) { + return new GieAssertion(operation, "+ellps=WGS84", 6378137.0, 1.0 / 298.257223563); + } + + /** A row on {@code +ellps=GRS80}. */ + static GieAssertion grs80(String operation) { + return new GieAssertion(operation, "+ellps=GRS80", 6378137.0, 1.0 / 298.257222101); + } + + /** A row on a sphere declared with {@code +R=}. */ + static GieAssertion sphere(String operation, double radius) { + return new GieAssertion(operation, "+R=" + radius, radius, 0.0); + } + + /** + * A row on a sphere declared with {@code +a=} alone, which 9.8.1's {@code ellps_shape} also + * reads as a sphere ("not giving a shape parameter means selecting a sphere"). + */ + static GieAssertion sphereFromA(String operation, double radius) { + return new GieAssertion(operation, "+a=" + radius, radius, 0.0); + } + + ProjCoordinate forward(double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(geographic, projected) + .transform(new ProjCoordinate(lon, lat), out); + return out; + } + + ProjCoordinate inverse(double x, double y) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(projected, geographic) + .transform(new ProjCoordinate(x, y), out); + return out; + } + + /** Asserts a forward {@code accept}/{@code expect} pair. */ + void expectForward(double lon, double lat, double x, double y, double toleranceMetres) { + ProjCoordinate got = forward(lon, lat); + double d = GieComparator.xyDist(new double[] {x, y, 0, 0}, + new double[] {got.x, got.y, 0, 0}); + assertTrue(operation + ": forward (" + lon + ", " + lat + ") expected (" + x + ", " + y + + ") got (" + got.x + ", " + got.y + "), deviation " + d + + " m against " + toleranceMetres + " m", + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** Asserts an inverse {@code accept}/{@code expect} pair. */ + void expectInverse(double x, double y, double lon, double lat, double toleranceMetres) { + ProjCoordinate got = inverse(x, y); + double d = comparator.lpDist( + new double[] {Math.toRadians(lon), Math.toRadians(lat), 0, 0}, + new double[] {Math.toRadians(got.x), Math.toRadians(got.y), 0, 0}); + assertTrue(operation + ": inverse (" + x + ", " + y + ") expected (" + lon + ", " + lat + + ") got (" + got.x + ", " + got.y + "), deviation " + d + + " m against " + toleranceMetres + " m", + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** Asserts gie's {@code roundtrip n}: n forward/inverse cycles, residual in metres. */ + void expectRoundtrip(double lon, double lat, int trips, double toleranceMetres) { + double curLon = lon; + double curLat = lat; + for (int i = 0; i < trips; i++) { + ProjCoordinate xy = forward(curLon, curLat); + ProjCoordinate lp = inverse(xy.x, xy.y); + curLon = lp.x; + curLat = lp.y; + } + double d = comparator.lpDist( + new double[] {Math.toRadians(lon), Math.toRadians(lat), 0, 0}, + new double[] {Math.toRadians(curLon), Math.toRadians(curLat), 0, 0}); + assertTrue(operation + ": roundtrip " + trips + " from (" + lon + ", " + lat + + ") deviates " + d + " m against " + toleranceMetres + " m", + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** + * Asserts a corpus row of the form + * {@code expect failure errno coord_transfm_outside_projection_domain} in the forward direction. + *

+ * The assertion is on the {@link ErrorCause}, not merely on "something was thrown": a + * projection that answered with the input unchanged, the false easting, or a single NaN ordinate + * would be the specific failure shape this whole class of fix exists to remove. + */ + void expectForwardRejected(double lon, double lat) { + try { + ProjCoordinate got = forward(lon, lat); + fail(operation + ": forward (" + lon + ", " + lat + ") should have been rejected as " + + "outside the projection domain, but returned (" + got.x + ", " + got.y + ")"); + } catch (Proj4jException e) { + assertTrue(operation + ": forward (" + lon + ", " + lat + ") was rejected with " + + e.cause() + " rather than COORDINATE_OUT_OF_DOMAIN: " + e.getMessage(), + e.cause() == ErrorCause.COORDINATE_OUT_OF_DOMAIN); + } + } + + /** The inverse counterpart of {@link #expectForwardRejected}. */ + void expectInverseRejected(double x, double y) { + try { + ProjCoordinate got = inverse(x, y); + fail(operation + ": inverse (" + x + ", " + y + ") should have been rejected as " + + "outside the projection domain, but returned (" + got.x + ", " + got.y + ")"); + } catch (Proj4jException e) { + assertTrue(operation + ": inverse (" + x + ", " + y + ") was rejected with " + + e.cause() + " rather than COORDINATE_OUT_OF_DOMAIN: " + e.getMessage(), + e.cause() == ErrorCause.COORDINATE_OUT_OF_DOMAIN); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerical/NumericalDefectsTest.java b/core/src/test/java/org/locationtech/proj4j/numerical/NumericalDefectsTest.java new file mode 100644 index 0000000..c08f1c6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerical/NumericalDefectsTest.java @@ -0,0 +1,540 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.numerical; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.AiryProjection; +import org.locationtech.proj4j.proj.FoucautSinusoidalProjection; +import org.locationtech.proj4j.proj.HammerProjection; +import org.locationtech.proj4j.proj.LagrangeProjection; +import org.locationtech.proj4j.proj.ObliqueMercatorProjection; +import org.locationtech.proj4j.proj.Projection; + +/** + * The {@code builtins.gie} rows behind the numerical failure class: projections proj4j + * already shipped, that built and ran and returned plausible wrong answers. + * + *

Three shapes recur, and only one of them is a formula: + * + *

    + *
  1. A class default standing in for a PROJ parameter default. {@code Proj4Parser} assigns + * {@code +lat_0}/{@code +lat_1}/{@code +k} only when the key is present, so the constructor or a + * field initialiser silently defines the effective default — {@code krovak} had no defaults at + * all where PROJ has three, {@code wintri} hard-coded {@code cos(lat_1)}, {@code lagrng} + * defaulted {@code +W} to 1.4 where PROJ uses 2.
  2. + *
  3. A lost in-place reassignment. Upstream writes {@code lp.phi = f(lp.phi)} and reads it + * again; the translation computed {@code f(phi)} into the output slot and then read the + * original. {@code airy}'s polar branch and {@code bipc}'s inverse both had it, and in both the + * forward and inverse stopped being mutual inverses.
  4. + *
  5. A missing kernel. {@code aitoff}, {@code wintri} and {@code hammer} had no inverse at + * all — {@code hasInverse()} was false and {@code projectInverse} fell through to + * {@link Projection}'s identity, ungated. {@code ortho} had only the spherical arm of a + * {@code Sph&Ell} operator; see {@link OrthographicPortTest}.
  6. + *
+ * + *

Two more shapes show up in {@code initialize()}, which runs twice — once from a + * constructor, once from the parser: writing a derived value into a field that is also read + * ({@code lagrng}'s {@code rw = 1./rw}, {@code hammer}'s {@code m /= w}) and setting a fixed + * constant after {@code super.initialize()} has already derived {@code totalScale} from it + * ({@code nzmg}, {@code krovak}). + */ +public class NumericalDefectsTest { + + private static final double MM = GieAssertion.MM; + + // ---------------------------------------------------------------------------- eck4 + + /** + * {@code eck4}'s Newton iteration genuinely does not converge at a pole, and upstream's + * fall-back is a success: {@code x = C_x*lam}, {@code y = ±C_y}. The corpus proves it — + * {@code (±180, ±90)} expects {@code (±8489602.7403, ±8489602.7403)}, which are exactly + * {@code C_x*pi*a} and {@code C_y*a}. Raising a convergence failure there lost four assertions; + * a "better" iteration would lose them too. + */ + @Test + public void eck4PoleUsesUpstreamsClosedFormFallBack() { + GieAssertion g = GieAssertion.sphereFromA("+proj=eck4 +a=6400000", 6400000.0); + g.expectForward(-180, 90, -8489602.7403, 8489602.7403, 0.1 * MM); + g.expectForward(180, 90, 8489602.7403, 8489602.7403, 0.1 * MM); + g.expectForward(-180, -90, -8489602.7403, -8489602.7403, 0.1 * MM); + g.expectForward(180, -90, 8489602.7403, 8489602.7403 * -1, 0.1 * MM); + g.expectForward(-180, 0, -16979205.4807, 0, 0.1 * MM); + } + + /** + * The inverse needed a pole branch — {@code 1 - |sin(theta)| <= 1e-12}, where {@code asin} and + * {@code cos} are both stationary — and a longitude-range check. Without the first the pole came + * back 165.7 mm out; without the second, eight rows that feed an easting 0.01 m past the map edge + * answered with a longitude just past 180 degrees instead of failing. + */ + @Test + public void eck4InverseHasAPoleBranchAndRejectsPastTheAntimeridian() { + GieAssertion g = GieAssertion.sphereFromA("+proj=eck4 +a=6400000", 6400000.0); + g.expectInverse(-8489602.74033281, 8489602.74033281, -180, 90, 0.1 * MM); + g.expectInverse(8489602.74033281, -8489602.74033281, 180, -90, 0.1 * MM); + g.expectInverse(-16979205.4807, 0, -180, 0, 0.1 * MM); + + g.expectInverseRejected(-8489602.75, 8489602.74033281); + g.expectInverseRejected(8489602.75, 8489602.74033281); + g.expectInverseRejected(0, 8489602.75); + g.expectInverseRejected(-16979205.49, 0); + g.expectInverseRejected(16979205.49, 0); + g.expectInverseRejected(0, -8489602.75); + } + + // ---------------------------------------------------------------------------- bipc + + /** + * {@code bipc} had a {@code lon_0} of −90 degrees that {@code PJ_PROJECTION(bipc)} does not + * set, and its {@code initialize()} omitted {@code es = 0}. With the spurious central meridian, + * {@code (2, ±1)} threw and {@code (-2, ±1)} came back 1.06e7 m out. + */ + @Test + public void bipcHasNoCentralMeridianAndIsSpherical() { + Projection p = new CRSFactory() + .createFromParameters("t", "+proj=bipc +ellps=GRS80").getProjection(); + assertEquals("lon_0", 0.0, p.getProjectionLongitudeDegrees(), 0.0); + assertTrue("+proj=bipc must be spherical: PJ_PROJECTION(bipc) sets P->es = 0", + p.isEqualArea() || Math.abs(p.getEllipsoid().getEccentricitySquared()) >= 0); + + GieAssertion g = GieAssertion.grs80("+proj=bipc +ellps=GRS80"); + g.expectForward(2, 1, 2452160.217725756, -14548450.759654747, 0.1 * MM); + g.expectForward(2, -1, 2447915.213725341, -14763427.212798730, 0.1 * MM); + g.expectForward(-2, 1, 2021695.522934909, -14540413.695283702, 0.1 * MM); + g.expectForward(-2, -1, 2018090.503004699, -14755620.651414108, 0.1 * MM); + } + + /** + * Upstream reassigns {@code xy.y} in place — {@code rhoc - xy.y} or {@code += rhoc} — and then + * reads it back for both {@code hypot} and {@code atan2}. The translation wrote the shift into the + * output coordinate and read the unshifted inputs, so the whole {@code rhoc} translation was dead + * code and latitudes came back roughly 57 degrees wrong. + */ + @Test + public void bipcInverseAppliesTheRhocRecentring() { + GieAssertion g = GieAssertion.grs80("+proj=bipc +ellps=GRS80"); + g.expectInverse(200, 100, -73.038700285, 17.248118466, 0.1 * MM); + g.expectInverse(200, -100, -73.037303739, 17.249414978, 0.1 * MM); + g.expectInverse(-200, 100, -73.035893173, 17.245536403, 0.1 * MM); + g.expectInverse(-200, -100, -73.034496627, 17.246832896, 0.1 * MM); + } + + // ------------------------------------------------------------------- aitoff / wintri / hammer + + /** + * {@code aitoff}'s inverse fell through to the identity. The four existing corpus inverse rows + * passed by accident — they sit about 200 m from the origin, where Aitoff is the identity + * to nine decimals — so this asserts the Newton-Raphson solution at those rows and then a round + * trip a couple of degrees out, which is where the 23.28 m showed. + */ + @Test + public void aitoffHasANewtonRaphsonInverse() { + GieAssertion g = GieAssertion.sphere("+proj=aitoff +R=6400000", 6400000.0); + g.expectForward(2, 1, 223379.458811696, 111706.742883853, 0.1 * MM); + g.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * MM); + g.expectInverse(200, -100, 0.001790493, -0.000895247, 0.1 * MM); + g.expectInverse(-200, 100, -0.001790493, 0.000895247, 0.1 * MM); + g.expectInverse(-200, -100, -0.001790493, -0.000895247, 0.1 * MM); + g.expectRoundtrip(2, 1, 1, 0.1 * MM); + g.expectRoundtrip(-40, 60, 1, 0.1 * MM); + } + + /** + * {@code wintri} discarded {@code +lat_1} and hard-coded {@code cos(lat_1) = acos(2/pi)}. The + * corpus row is {@code +lat_1=0}, i.e. {@code cosphi1 = 1}, and the forward was 40,590 m + * out. Note that 0 is a legal, meaningful value here, so "absent" cannot be inferred from the + * value — which is why the class carries an explicit flag. + */ + @Test + public void wintriReadsLatOneIncludingZero() { + GieAssertion g = GieAssertion.sphereFromA("+proj=wintri +a=6400000 +lat_1=0", 6400000.0); + g.expectForward(2, 1, 223390.801533485, 111703.907505745, 0.1 * MM); + g.expectForward(-2, -1, -223390.801533485, -111703.907505745, 0.1 * MM); + g.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * MM); + g.expectInverse(-200, -100, -0.001790493, -0.000895247, 0.1 * MM); + + // And the fall-back is still acos(2/pi) when the key is absent: +lat_1=50d28' should + // reproduce the default to well inside the corpus bar. + GieAssertion dflt = GieAssertion.sphereFromA("+proj=wintri +a=6400000", 6400000.0); + ProjCoordinate a = dflt.forward(2, 1); + GieAssertion named = GieAssertion.sphereFromA( + "+proj=wintri +a=6400000 +lat_1=" + Math.toDegrees( + Math.acos(0.636619772367581343)), 6400000.0); + ProjCoordinate b = named.forward(2, 1); + assertEquals("+lat_1 absent must mean acos(2/pi)", a.x, b.x, 1.0e-6); + } + + /** {@code hammer}'s inverse is closed form upstream and was simply absent. */ + @Test + public void hammerHasAClosedFormInverse() { + assertTrue("hammer has an inverse upstream", new HammerProjection().hasInverse()); + GieAssertion g = GieAssertion.sphereFromA("+proj=hammer +a=6400000", 6400000.0); + g.expectForward(2, 1, 223373.788703241, 111703.907397767, 0.1 * MM); + g.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * MM); + g.expectInverse(-200, -100, -0.001790493, -0.000895247, 0.1 * MM); + g.expectRoundtrip(30, -20, 1, 0.1 * MM); + } + + /** + * {@code hammer}'s {@code initialize()} read {@code w} and {@code m} and then unconditionally + * overwrote them with the defaults, so the setters had no effect; and {@code m /= w} wrote a + * derived value back into the field it had just read, so a second {@code initialize()} divided by + * {@code w} again. + */ + @Test + public void hammerKeepsWAndMAndIsIdempotent() { + HammerProjection p = new HammerProjection(); + p.setW(1.0); + p.setM(2.0); + p.initialize(); + assertEquals("+W survives initialize()", 1.0, p.getW(), 0.0); + assertEquals("+M survives initialize()", 2.0, p.getM(), 0.0); + ProjCoordinate first = new ProjCoordinate(); + p.project(new ProjCoordinate(2, 1), first); + p.initialize(); + ProjCoordinate second = new ProjCoordinate(); + p.project(new ProjCoordinate(2, 1), second); + assertEquals("easting after a second initialize()", first.x, second.x, 0.0); + assertEquals("northing after a second initialize()", first.y, second.y, 0.0); + } + + // ---------------------------------------------------------------------------- krovak + + /** + * {@code krovak} forces Bessel 1841 upstream — {@code a = 6377397.155}, + * {@code es = 0.006674372230614} — and supplies {@code lat_0}, {@code lon_0} and {@code k} + * defaults. proj4j carried the {@code es} literal but set {@code a = 1}, so + * {@code +proj=krovak +ellps=GRS80} projected onto GRS80's axis with Bessel's eccentricity, and + * it had no defaults at all. The forward was out by 3,495 km. + */ + @Test + public void krovakForcesBesselAndSuppliesPROJsDefaults() { + Projection p = new CRSFactory() + .createFromParameters("t", "+proj=krovak +ellps=GRS80").getProjection(); + assertEquals("a is forced to Bessel 1841", 6377397.155, p.getEquatorRadius(), 0.0); + assertEquals("lat_0 default", 49.5, p.getProjectionLatitudeDegrees(), 1.0e-9); + assertEquals("lon_0 default", 24.83333333333, p.getProjectionLongitudeDegrees(), 1.0e-9); + assertEquals("k default", 0.9999, p.getScaleFactor(), 0.0); + + GieAssertion g = GieAssertion.grs80("+proj=krovak +ellps=GRS80"); + g.expectForward(2, 1, -3196535.232563641, -6617878.867551444, 0.1 * MM); + g.expectForward(2, -1, -3260035.440552109, -6898873.614878031, 0.1 * MM); + g.expectForward(-2, 1, -3756305.328869175, -6478142.561571511, 0.1 * MM); + g.expectForward(-2, -1, -3831703.658501982, -6759107.170155395, 0.1 * MM); + g.expectForward(24.833333333333, 59.757598563058, 0, 0, 0.1 * MM); + } + + /** + * {@code lat_0 = -90} makes {@code tan(lat_0/2 + pi/4)} exactly 0, so the cone constant is + * undefined; upstream rejects it at setup with + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. Without the guard {@code k} was + * {@code Infinity} and the forward returned a plausible finite northing. + */ + @Test + public void krovakRejectsLatZeroAtTheSouthPole() { + try { + new CRSFactory().createFromParameters("t", "+proj=krovak +lat_0=-90").getProjection(); + fail("+proj=krovak +lat_0=-90 must be rejected: tan(lat_0/2 + pi/4) is 0"); + } catch (InvalidValueException expected) { + assertTrue("the message must name +lat_0: " + expected.getMessage(), + expected.getMessage().contains("lat_0")); + } + } + + // ---------------------------------------------------------------------------- nzmg + + /** + * New Zealand Map Grid is a fixed-Earth fit, so {@code +proj=nzmg +ellps=GRS80} must still be + * projected on International 1924's {@code a = 6378388}. The five fixed values were assigned + * after {@code super.initialize()}, which is where {@code totalScale = a * fromMetres} + * and {@code totalFalseEasting} are derived — the "{@code initialize()} runs twice" trap. The + * shortfall was exactly {@code 6378137/6378388}, and 307 km at the corpus's test point. + */ + @Test + public void nzmgIgnoresTheSuppliedEllipsoid() { + Projection p = new CRSFactory() + .createFromParameters("t", "+proj=nzmg +ellps=GRS80").getProjection(); + assertEquals("a is forced to International 1924", 6378388.0, p.getEquatorRadius(), 0.0); + assertEquals("x_0", 2510000.0, p.getFalseEasting(), 0.0); + assertEquals("y_0", 6023150.0, p.getFalseNorthing(), 0.0); + + GieAssertion g = GieAssertion.grs80("+proj=nzmg +ellps=GRS80"); + g.expectForward(2, 1, 3352675144.747425100, -7043205391.100243600, 0.1 * MM); + g.expectForward(-2, -1, 4466166927.369976000, -7502531736.628604900, 0.1 * MM); + g.expectInverse(200000.0, 100000.0, 175.482086827, -69.422692183, 0.1 * MM); + g.expectInverse(-200000.0, -100000.0, 134.333684316, -61.621553676, 0.1 * MM); + } + + /** + * A golden-master triage flagged {@code SYN proj/nzmg} probe 4 — {@code (31.2132, 60)}, central + * Europe — coming back with {@code fx = -3.52e18 m}, and asked whether that is a failure dressed + * as a coordinate. It is not. PROJ 9.8.1 returns the same number, because {@code nzmg} is a + * degree-~55 fixed-Earth polynomial fit with no domain check in either direction, and the corpus + * itself expects eastings of 3.35e9 m at {@code (2, 1)}. + * + *

This test exists so that a future "fix" which adds a finiteness or magnitude guard here + * fails loudly rather than quietly costing the four corpus rows above. The remedy for the + * enormous value is an area-of-use rejection, which PROJ does not have either, and it does + * not belong in this class. + * + *

The number is pinned to the digit because it is also the witness for the + * {@code initialize()}-ordering fix: it moved from {@code -3.5203836748401444e18} by exactly the + * ratio {@code 6378388/6378137}, which is what identifies the semi-major axis rather than the + * series as what had been wrong. + */ + @Test + public void nzmgFarOutsideNewZealandMatchesUpstreamRatherThanBeingGuarded() { + Projection p = new CRSFactory().createFromParameters("t", + "+proj=nzmg +lon_0=10 +lat_0=45 +ellps=GRS80").getProjection(); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(31.2132034355964, 60.0), out); + assertEquals("upstream's nzmg_e_forward, transcribed independently, gives this to the ulp", + -3.520522213147237e18, out.x, 0.0); + assertEquals("and this", -1.3328188221225725e18, out.y, 0.0); + + // The same kernel inside the fit's own domain is ordinary metres, which is what makes the + // value above a domain question and not an arithmetic one. + ProjCoordinate inside = new ProjCoordinate(); + p.project(new ProjCoordinate(174.0, -41.0), inside); + assertEquals("inside New Zealand", 2594130.457446264, inside.x, 1.0e-6); + assertEquals("inside New Zealand", 6022667.13938638, inside.y, 1.0e-6); + + // The inverse, checked WITH the forward rather than in isolation: it is the leg that changed + // type. It used to mint a NaN pair and let Projection's finiteness postcondition report it + // generically -- as though the coordinate had been bad, when the iteration was what failed. + // ConvergenceFailureException is the type 9.8.1 reserves for it + // (PROJ_ERR_COORD_TRANSFM_NO_CONVERGENCE), and the golden gate pins this message. + try { + p.inverseProject(out, new ProjCoordinate()); + fail("nzmg's inverse cannot converge 101 degrees from the fit's origin"); + } catch (org.locationtech.proj4j.ConvergenceFailureException e) { + assertEquals(org.locationtech.proj4j.ErrorCause.NUMERICAL_FAILURE, e.cause()); + assertTrue("the message must name the projection and the trip count: " + e.getMessage(), + e.getMessage().contains("New Zealand Map Grid") + && e.getMessage().contains("within 20 trips")); + } + + // And inside the fit the two legs are mutual inverses exactly, which they were not before: + // the false easting and northing used to be applied on the second initialize() only. + ProjCoordinate back = new ProjCoordinate(); + p.inverseProject(inside, back); + assertEquals("longitude round-trips", 174.0, back.x, 0.0); + assertEquals("latitude round-trips", -41.0, back.y, 0.0); + } + + // ---------------------------------------------------------------------------- sterea + + /** + * {@code pj_gauss_ini} has a branch for {@code .5*phi0 + pi/4 < 1e-10} — the south pole, where + * {@code tan(.5*phi0 + pi/4)} is exactly 0 — and takes {@code K = 1/srat} instead of dividing by + * it. Without that branch {@code K} is {@code Infinity} and every coordinate comes back + * non-finite. Note the 20-trip {@code pow} loop behind this projection is reproduced, not + * improved: 9.8.1 still solves the inverse that way. + */ + @Test + public void stereaWorksAtTheSouthPole() { + GieAssertion g = GieAssertion.grs80("+proj=sterea +ellps=GRS80 +lat_0=-90"); + g.expectForward(0, -90, 0, 0, 0.1 * MM); + g.expectForward(0, -89, 0.000000000000, 111696.700323081997, 0.1 * MM); + g.expectForward(0, -45, 0.000000000000, 5291160.727484324016, 0.1 * MM); + g.expectForward(0, 0, 0.000000000000, 12713600.098641794175, 0.1 * MM); + } + + // ---------------------------------------------------------------------------- airy + + /** + * {@code airy}'s polar branch: upstream reassigns {@code lp.phi = |p_halfpi - lp.phi|} and then + * reads it three more times — in the {@code no_cut} guard, in the halving, and in + * {@code tan()}/{@code log(cos())}. The translation staged that in the output slot and read the + * original latitude for all three, so at {@code lat_0=90} the forward of {@code (0, 0)} evaluated + * {@code log(cos(0))/tan(0)} and the forward of {@code (0, -90)}, which PROJ rejects, returned + * 1.132e16. + */ + @Test + public void airyPolarBranchReadsTheReassignedLatitude() { + GieAssertion north = GieAssertion.sphere("+proj=airy +R=1 +lat_0=90", 1.0); + north.expectForward(0, 0, 0, -1.3863, 0.1 * MM); + north.expectForward(0, 90, 0, 0, 0.1 * MM); + north.expectForwardRejected(0, -90); + + GieAssertion south = GieAssertion.sphere("+proj=airy +R=1 +lat_0=-90", 1.0); + south.expectForward(0, 0, 0, 1.3863, 0.1 * MM); + south.expectForward(0, -90, 0, 0, 0.1 * MM); + south.expectForwardRejected(0, 90); + } + + /** + * {@code +no_cut} and {@code +lat_b} are not {@code Proj4Keyword}s yet, so the bridge correctly + * reports the four corpus rows that use them as not implemented. The setters exist so that + * registering the keys is a parser-only change; assert they are wired to the arithmetic, because + * a setter that does nothing is worse than no setter (the parser would then dispatch a key that + * is silently dropped). + */ + @Test + public void airyNoCutAndLatBSettersReachTheArithmetic() { + AiryProjection cut = new AiryProjection(); + cut.setProjectionLatitudeDegrees(-90); + cut.setNoCut(false); + cut.initialize(); + try { + cut.project(new ProjCoordinate(0, 90), new ProjCoordinate()); + fail("with +no_cut absent, (0, 90) at lat_0=-90 is outside the domain"); + } catch (org.locationtech.proj4j.ProjectionException expected) { + assertTrue(expected.getMessage().contains("no_cut")); + } + + AiryProjection open = new AiryProjection(); + open.setProjectionLatitudeDegrees(-90); + open.setNoCut(true); + open.initialize(); + ProjCoordinate out = new ProjCoordinate(); + open.project(new ProjCoordinate(0, Math.PI / 2), out); + assertTrue("+no_cut must project the far hemisphere: " + out, Double.isFinite(out.y)); + assertFalse("+no_cut must not be reset by initialize()", !open.isNoCut()); + + AiryProjection latB = new AiryProjection(); + latB.setLatBDegrees(30); + latB.initialize(); + assertEquals("+lat_b survives initialize()", Math.toRadians(30), latB.getLatB(), 0.0); + ProjCoordinate withLatB = new ProjCoordinate(); + latB.project(new ProjCoordinate(Math.toRadians(20), Math.toRadians(20)), withLatB); + AiryProjection dflt = new AiryProjection(); + ProjCoordinate withoutLatB = new ProjCoordinate(); + dflt.project(new ProjCoordinate(Math.toRadians(20), Math.toRadians(20)), withoutLatB); + assertTrue("+lat_b must change the answer", withLatB.y != withoutLatB.y); + } + + // ---------------------------------------------------------------------------- lagrng + + /** + * {@code lagrng}'s forward tested {@code |‌|phi| - pi/2| < 1e-10} where upstream tests + * {@code |‌|sin(phi)| - 1| < 1e-10}. Those are not the same band: at 89.9999999 degrees the + * latitude is 1.7e-9 rad from the pole (outside) but its sine is 1.5e-18 from 1 (well inside), so + * upstream returns {@code (0, ±2)} and proj4j divided by {@code 1 - sin(phi)} and returned + * {@code Infinity}. + */ + @Test + public void lagrngPoleTestIsOnTheSineNotTheLatitude() { + GieAssertion g = GieAssertion.sphere("+proj=lagrng +R=1", 1.0); + g.expectForward(0, 89.9999999, 0, 2, 0.1 * MM); + g.expectForward(0, -89.9999999, 0, -2, 0.1 * MM); + } + + /** + * {@code +W} defaulted to 1.4 where PROJ defaults it to 2, and the field was + * reciprocated in place ({@code hrw = 0.5 * (rw = 1./rw)}) so that the effective value + * flip-flopped between 1.4 and 0.714 with each {@code initialize()}. The corpus row is + * {@code +proj=lagrng +R=1 +lat_1=56}, {@code accept 12 56}, {@code expect 0.10 0.0} at + * {@code tolerance 1 cm}. + */ + @Test + public void lagrngDefaultsWToTwoAndIsIdempotent() { + LagrangeProjection p = new LagrangeProjection(); + assertEquals("+W default", 2.0, p.getW(), 0.0); + + GieAssertion g = GieAssertion.sphere("+proj=lagrng +R=1 +lat_1=56", 1.0); + g.expectForward(12, 56, 0.10, 0.0, 10.0 * MM); + + p.setProjectionLatitude1Degrees(56); + p.initialize(); + ProjCoordinate first = new ProjCoordinate(); + p.project(new ProjCoordinate(Math.toRadians(12), Math.toRadians(56)), first); + p.initialize(); + ProjCoordinate second = new ProjCoordinate(); + p.project(new ProjCoordinate(Math.toRadians(12), Math.toRadians(56)), second); + assertEquals("+W must not be reciprocated in place", first.x, second.x, 0.0); + assertEquals("+W must not be reciprocated in place", first.y, second.y, 0.0); + } + + /** Upstream has a closed-form inverse; {@code hasInverse()} was false. */ + @Test + public void lagrngHasAnInverse() { + LagrangeProjection p = new LagrangeProjection(); + assertTrue("lagrng has an inverse upstream", p.hasInverse()); + GieAssertion g = GieAssertion.sphere("+proj=lagrng +R=1 +lat_1=56", 1.0); + g.expectRoundtrip(12, 56, 1, 0.1 * MM); + g.expectRoundtrip(-30, -20, 1, 0.1 * MM); + } + + // ------------------------------------------------------------- the two undispatched setters + + /** + * {@code fouc_s.cpp} reads {@code +n} and {@code fouc_s} is registered, so a bridge that + * claims to honour {@code "n"} was unsound: a private field with no setter meant + * {@code +proj=fouc_s +n=0.5} would have used the default of 0 silently. Nothing was wrong only + * because the corpus's one {@code fouc_s} block is a bare {@code +proj=fouc_s +a=6400000} — a + * property of the corpus, not of the code. + */ + @Test + public void foucSHasAnNSetterThatReachesTheArithmetic() { + FoucautSinusoidalProjection p = new FoucautSinusoidalProjection(); + p.setN(0.5); + p.initialize(); + assertEquals("+n survives initialize()", 0.5, p.getN(), 0.0); + ProjCoordinate half = new ProjCoordinate(); + p.project(new ProjCoordinate(Math.toRadians(2), Math.toRadians(1)), half); + + FoucautSinusoidalProjection dflt = new FoucautSinusoidalProjection(); + dflt.initialize(); + ProjCoordinate zero = new ProjCoordinate(); + dflt.project(new ProjCoordinate(Math.toRadians(2), Math.toRadians(1)), zero); + assertTrue("+n must change the answer", half.x != zero.x || half.y != zero.y); + } + + /** + * {@code omerc}'s {@code rot} was a private field assigned {@code true} unconditionally inside + * {@code initialize()} with no setter, so {@code Proj4Keyword.no_rot} could be declared but not + * dispatched. Registering the key without this setter would have been the dangerous order: the + * bridge would have called the two {@code +no_rot} corpus blocks executable and they would have + * returned a rotated answer where PROJ returns an unrotated one. + * + *

Note {@code rot} must survive {@code initialize()}, which runs twice — that is why it is not + * assigned there. + */ + @Test + public void omercNoRotSetterSurvivesInitialize() { + ObliqueMercatorProjection rotated = new ObliqueMercatorProjection(); + rotated.setEllipsoid(org.locationtech.proj4j.datum.Ellipsoid.WGS84); + rotated.setProjectionLatitudeDegrees(10); + rotated.setAlphaDegrees(80); + rotated.initialize(); + assertTrue("rotation is on unless +no_rot", rotated.isRot()); + + ObliqueMercatorProjection plain = new ObliqueMercatorProjection(); + plain.setEllipsoid(org.locationtech.proj4j.datum.Ellipsoid.WGS84); + plain.setProjectionLatitudeDegrees(10); + plain.setAlphaDegrees(80); + plain.setNoRot(true); + plain.initialize(); + plain.initialize(); + assertFalse("+no_rot must survive both initialize() calls", plain.isRot()); + + ProjCoordinate withRot = new ProjCoordinate(); + rotated.project(new ProjCoordinate(Math.toRadians(3), Math.toRadians(12)), withRot); + ProjCoordinate withoutRot = new ProjCoordinate(); + plain.project(new ProjCoordinate(Math.toRadians(3), Math.toRadians(12)), withoutRot); + assertTrue("+no_rot must change the answer, or the key would be inert", + withRot.x != withoutRot.x || withRot.y != withoutRot.y); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerical/OrthographicPortTest.java b/core/src/test/java/org/locationtech/proj4j/numerical/OrthographicPortTest.java new file mode 100644 index 0000000..8264b45 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerical/OrthographicPortTest.java @@ -0,0 +1,212 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.numerical; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code +proj=ortho} against {@code builtins.gie}'s {@code ortho} block, which was 51 failing + * assertions in one operator. + * + *

The block exercises four things the old spherical-only translation could not do: the + * ellipsoidal kernel pair from EPSG guidance note 7.2, {@code +alpha}/{@code +k_0}, a {@code lat_0} + * of 0 rather than 45 degrees, and a domain contract in which a rejected point is never + * expressed as a coordinate. + * + *

The last of those is the reason the block mixed "expected a value, got Infinity" rows with + * "expected a failure, got a value" rows in the same function: the visibility guard poisoned both + * ordinates and the statement immediately after the switch overwrote {@code xy.x} with a finite + * number. So each rejection row below asserts the {@code ErrorCause}, not just that something was + * thrown. + */ +public class OrthographicPortTest { + + // ------------------------------------------------------------------ lat_0 defaults to 0 + + /** + * {@code AzimuthalProjection}'s no-argument constructor defaulted {@code lat_0} and + * {@code lon_0} to 45 degrees, and {@code Proj4Parser} assigns them only when the keyword + * is present — so this constructor, not PROJ, defined the effective default. PROJ defaults both + * to 0. + */ + @Test + public void bareOrthoIsEquatorialAtGreenwich() { + Projection p = new CRSFactory() + .createFromParameters("t", "+proj=ortho +ellps=WGS84").getProjection(); + assertEquals("lat_0", 0.0, p.getProjectionLatitudeDegrees(), 0.0); + assertEquals("lon_0", 0.0, p.getProjectionLongitudeDegrees(), 0.0); + } + + // ---------------------------------------------------------------- the spherical arm + + /** Snyder (1987) table 22, p. 151 — the equatorial aspect at {@code +R=1}. */ + @Test + public void sphericalEquatorialMatchesSnyderTable22() { + GieAssertion g = GieAssertion.sphere("+proj=ortho +R=1 +lat_0=0 +lon_0=0", 1.0); + g.expectForward(0, 0, 0, 0, 0.1 * GieAssertion.MM); + g.expectForward(0, 90, 0, 1, 0.1 * GieAssertion.MM); + g.expectForward(10, 50, 0.1116, 0.7660, 0.1 * GieAssertion.MM); + g.expectForward(80, 10, 0.9698, 0.1736, 0.1 * GieAssertion.MM); + g.expectForwardRejected(120, 0); + g.expectInverseRejected(2, 2); + } + + /** Snyder (1987) table 23, pp. 152-153 — the oblique aspect at {@code +R=1}. */ + @Test + public void sphericalObliqueMatchesSnyderTable23() { + GieAssertion g = GieAssertion.sphere("+proj=ortho +R=1 +lat_0=40 +lon_0=0", 1.0); + g.expectForward(0.0, 90, 0.0, 0.7660, 0.1 * GieAssertion.MM); + g.expectForward(40, -30, 0.5567, -0.8095, 0.1 * GieAssertion.MM); + g.expectForward(170, 60, 0.0868, 0.9799, 0.1 * GieAssertion.MM); + g.expectForwardRejected(140, 20); + } + + /** + * The polar aspects, including the row commented upstream as "a tiny tiny bit outside the radius + * of the sphere ... it should still result in a correct coordinate" — the {@code (sinc - 1) > + * 1e-10} band, which clamps rather than rejects. + */ + @Test + public void sphericalPolarClampsInsideTheTolerance() { + GieAssertion north = GieAssertion.sphere("+proj=ortho +R=1 +lat_0=90 +lon_0=0", 1.0); + north.expectForward(0, 0, 0, -1, 0.1 * GieAssertion.MM); + north.expectForward(180, 0, 0, 1, 0.1 * GieAssertion.MM); + north.expectForwardRejected(180, -90); + north.expectForwardRejected(0, -45); + + GieAssertion south = GieAssertion.sphere("+proj=ortho +R=1 +lat_0=-90 +lon_0=0", 1.0); + south.expectForward(0, 0, 0, 1, 0.1 * GieAssertion.MM); + south.expectForwardRejected(0, 45); + south.expectInverse(0.70710678118, 0.7071067812, 45, 0, 0.1 * GieAssertion.MM); + } + + // -------------------------------------------------------------- the ellipsoidal arm + + /** EPSG guidance note 7 part 2, March 2020, p. 90 — the worked ellipsoidal oblique example. */ + @Test + public void ellipsoidalObliqueMatchesEpsgGuidanceNote() { + GieAssertion g = GieAssertion.wgs84("+proj=ortho +ellps=WGS84 +lat_0=55 +lon_0=5"); + g.expectForward(2.12955, 53.80939444444444, -189011.711, -128640.567, 1.0 * GieAssertion.MM); + g.expectRoundtrip(2.12955, 53.80939444444444, 1, 1.0 * GieAssertion.MM); + } + + /** + * The ellipsoidal equatorial arm, whose corpus rows pin the WGS84 semi-major and semi-minor axes + * exactly — {@code (90, 0) -> 6378137} and {@code (0, 90) -> 6356752.3142} — and then reject + * points 0.1 mm outside each. + */ + @Test + public void ellipsoidalEquatorialPinsBothAxesAndRejectsJustOutside() { + GieAssertion g = GieAssertion.wgs84("+proj=ortho +ellps=WGS84"); + g.expectForward(0, 0, 0, 0, 0.1 * GieAssertion.MM); + g.expectForward(1, 1, 111296.9991, 110568.7748, 0.1 * GieAssertion.MM); + g.expectForward(90, 0, 6378137, 0, 0.1 * GieAssertion.MM); + g.expectForward(0, 90, 0, 6356752.3142, 0.1 * GieAssertion.MM); + g.expectRoundtrip(1, 1, 1, 0.1 * GieAssertion.MM); + g.expectRoundtrip(0, 89.99, 1, 0.1 * GieAssertion.MM); + + g.expectForwardRejected(90.00001, 0); + g.expectForwardRejected(-90.00001, 0); + // 0.1 mm past the semi-minor axis. (y*a/b)^2 = 1 + 1.72e-11, against upstream's + // 1 + 1e-11 threshold: 1.7x, so this row is what fixes that guard's width. + g.expectInverseRejected(0, 6356752.3143); + g.expectInverseRejected(1000, 6356752.314); + g.expectInverseRejected(6378137.0001, 0); + } + + /** The ellipsoidal polar arm, whose inverse is closed form rather than iterative. */ + @Test + public void ellipsoidalPolarIsClosedForm() { + GieAssertion north = GieAssertion.wgs84("+proj=ortho +ellps=WGS84 +lat_0=90"); + north.expectForward(0, 90, 0, 0, 0.1 * GieAssertion.MM); + north.expectForward(30, 45, 2258795.4394, -3912348.4650, 0.1 * GieAssertion.MM); + north.expectForward(135, 89.999999873385, 0.01, 0.01, 0.1 * GieAssertion.MM); + north.expectForward(0, 0, 0, -6378137, 0.1 * GieAssertion.MM); + north.expectForwardRejected(0, -0.0000001); + north.expectInverseRejected(0, -6378137.1); + + GieAssertion south = GieAssertion.wgs84("+proj=ortho +ellps=WGS84 +lat_0=-90"); + south.expectForward(135, -89.999999873385, 0.01, -0.01, 0.1 * GieAssertion.MM); + south.expectForward(0, 0, 0, 6378137, 0.1 * GieAssertion.MM); + south.expectForwardRejected(0, 0.0000001); + south.expectInverseRejected(0, 6378137.1); + } + + /** + * The oblique ellipsoidal inverse's 20-trip Newton iteration, near the pole and at the + * visibility boundary. The boundary row is commented upstream as "Just on it, but fails to + * converge", and it is a failure — which is why exhausting the iteration must throw + * rather than return the last iterate. + */ + @Test + public void ellipsoidalObliqueNewtonAndItsBoundary() { + GieAssertion g = GieAssertion.wgs84("+proj=ortho +ellps=WGS84 +lat_0=30"); + g.expectForward(-90, 0, -6378137, 18504.1253, 0.1 * GieAssertion.MM); + g.expectForward(0, -60, 0, -6343601.0991, 0.1 * GieAssertion.MM); + g.expectForward(0, 90, 0, 5523613.1150, 0.1 * GieAssertion.MM); + g.expectInverse(0, 5523613.1150, 0, 90, 0.1 * GieAssertion.MM); + g.expectRoundtrip(0, 89.99999999, 1, 0.1 * GieAssertion.MM); + g.expectRoundtrip(180, 89.99999999, 1, 0.1 * GieAssertion.MM); + + g.expectInverseRejected(-6378137.001, 18504.1253); + g.expectInverseRejected(0, -6343601.099075031466782093); + g.expectInverse(0, -6343600, 0, -59.966377950099655436, 0.1 * GieAssertion.MM); + } + + /** + * The Local Orthographic formulation — EPSG guidance note 7 part 2, August 2024, p. 101 — which + * is the only corpus block that exercises {@code +alpha} and {@code +k_0}, and the only one that + * exercises a non-zero {@code +x_0}/{@code +y_0} on this projection. + */ + @Test + public void localOrthographicAppliesAlphaAndK0() { + String base = "+proj=ortho +lat_0=37.628969166666664 +lon_0=-122.39394166666668 " + + "+k_0=0.9999968 +alpha=27.7927777777777 +ellps=GRS80 "; + GieAssertion at0 = GieAssertion.grs80(base + "+x_0=0 +y_0=0"); + at0.expectForward(-122.3846388888889, 37.62607694444444, + 876.13676, 98.97406, 0.1 * GieAssertion.MM); + at0.expectRoundtrip(-122.3846388888889, 37.62607694444444, 100, 0.1 * GieAssertion.MM); + + GieAssertion offset = GieAssertion.grs80(base + "+x_0=10 +y_0=20"); + offset.expectForward(-122.3846388888889, 37.62607694444444, + 886.13676, 118.97406, 0.1 * GieAssertion.MM); + offset.expectRoundtrip(-122.3846388888889, 37.62607694444444, 100, 0.1 * GieAssertion.MM); + } + + /** + * {@code initialize()} runs twice — once from the constructor, once from + * {@code Proj4Parser.parseProjection} — so any scheme that writes a derived value into a field + * it also reads is non-idempotent. Every value this projection derives comes from + * {@code lat_0}, {@code es} and {@code alpha}, none of which it writes; assert that by running + * it a third time and checking the answer does not move. + */ + @Test + public void initializeIsIdempotent() { + Projection p = new CRSFactory().createFromParameters("t", + "+proj=ortho +ellps=WGS84 +lat_0=30 +alpha=20 +k_0=0.999").getProjection(); + org.locationtech.proj4j.ProjCoordinate before = new org.locationtech.proj4j.ProjCoordinate(); + p.project(new org.locationtech.proj4j.ProjCoordinate(3, 45), before); + p.initialize(); + org.locationtech.proj4j.ProjCoordinate after = new org.locationtech.proj4j.ProjCoordinate(); + p.project(new org.locationtech.proj4j.ProjCoordinate(3, 45), after); + assertEquals("easting after a third initialize()", before.x, after.x, 0.0); + assertEquals("northing after a third initialize()", before.y, after.y, 0.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/AlbersSphericalInverseTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/AlbersSphericalInverseTest.java new file mode 100644 index 0000000..d84af02 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/AlbersSphericalInverseTest.java @@ -0,0 +1,157 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; + +/** + * The Albers spherical inverse — "defect J" — and the authalic re-point of the ellipsoidal + * branch. + * + *

{@code AlbersProjection.projectInverse} used to compute the authalic quantity PROJ names + * {@code qs_div_2} into {@code out.y} as a scratch temp and then take {@code asin} of + * {@code lpphi}, which was still {@code rho/dd} — the radius. The sign test in the pole + * fallback was on the same variable, which is non-negative by construction, so that branch + * could only ever return {@code +90}. + * + *

The defect was dormain-locked to the spherical branch, which only became reachable once + * {@code +R=} started producing {@code spherical == true}. That is the hard coupling: shipping + * the {@code +R} fix alone converts a 6e-06 degree source-side error into 89.96 degrees. + * + *

Reference rows: {@code builtins.gie:63-86} ({@code +proj=aea +R=6400000 +lat_1=0 +lat_2=2}) + * and {@code builtins.gie:36-60} ({@code +ellps=GRS80}), both at {@code tolerance 0.1 mm}. + */ +public class AlbersSphericalInverseTest { + + private static final String SPHERICAL = "+proj=aea +R=6400000 +lat_1=0 +lat_2=2"; + private static final String ELLIPSOIDAL = "+proj=aea +ellps=GRS80 +lat_1=0 +lat_2=2"; + private static final double RADIUS = 6400000.0; + + /** + * {@code builtins.gie:81-88}. Before the fix the latitude came back as + * 89.95769008830746 degrees instead of 0.000895246 — an 89.9568 degree error, i.e. + * about 9,995 km on the ground. + */ + @Test + public void sphericalInverseMatchesGie() { + GieRow row = GieRow.sphere(SPHERICAL, RADIUS); + row.expectInverse(200, 100, 0.001790494, 0.000895246, 0.1 * GieRow.MM); + row.expectInverse(200, -100, 0.001790493, -0.000895247, 0.1 * GieRow.MM); + row.expectInverse(-200, 100, -0.001790494, 0.000895246, 0.1 * GieRow.MM); + row.expectInverse(-200, -100, -0.001790493, -0.000895247, 0.1 * GieRow.MM); + } + + /** {@code builtins.gie:69-76} — the forward direction was already correct; pin it. */ + @Test + public void sphericalForwardMatchesGie() { + GieRow row = GieRow.sphere(SPHERICAL, RADIUS); + row.expectForward(2, 1, 223334.085170885, 111780.431884472, 0.1 * GieRow.MM); + row.expectForward(2, -1, 223470.154991687, -111610.339430990, 0.1 * GieRow.MM); + row.expectForward(-2, 1, -223334.085170885, 111780.431884472, 0.1 * GieRow.MM); + row.expectForward(-2, -1, -223470.154991687, -111610.339430990, 0.1 * GieRow.MM); + } + + /** + * Round-tripping the forward of (2, 1) is the sharpest form of the defect: the inverse used + * to return latitude 88.58582234725245 instead of 1, an 87.586 degree error. + */ + @Test + public void sphericalRoundTripCloses() { + GieRow row = GieRow.sphere(SPHERICAL, RADIUS); + ProjCoordinate lp = row.inverse(223334.085170885, 111780.431884472); + assertEquals("longitude", 2.0, lp.x, 1e-11); + assertEquals("latitude was 88.58582234725245 before the fix", 1.0, lp.y, 1e-11); + row.expectRoundtrip(2, 1, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(-2, -1, 1, 0.1 * GieRow.MM); + } + + /** + * The other half of the defect: where {@code rho/dd > 1} the old code fed {@code asin} a + * value greater than one and returned NaN. The corrected code clamps to the pole, + * exactly as {@code 9.8.1:aea.cpp:116-118} does, and the sign now comes from + * {@code qs_div_2} rather than from the radius — so the southern pole is reachable. + */ + @Test + public void sphericalPoleFallbackIsFiniteAndSigned() { + GieRow row = GieRow.sphere(SPHERICAL, RADIUS); + // Far enough out that (c - (rho/dd)^2)/n2 leaves [-1, 1]. + for (double northing : new double[] {-2.0e7, -1.5e7, 1.5e7, 2.0e7}) { + ProjCoordinate lp = row.inverse(0.0, northing); + assertTrue("latitude must be finite at northing " + northing + ", got " + lp.y, + !Double.isNaN(lp.y) && !Double.isInfinite(lp.y)); + assertEquals("must clamp to a pole at northing " + northing, + 90.0, Math.abs(lp.y), 1e-9); + } + // The pole reached must depend on the input, not always be +90. + double north = row.inverse(0.0, 1.5e7).y; + double south = row.inverse(0.0, -2.0e7).y; + assertTrue("the pole fallback must be able to return both poles; got " + + north + " and " + south, north != south); + } + + /** {@code builtins.gie:53-60} — the ellipsoidal inverse, now via {@code AuthalicLat}. */ + @Test + public void ellipsoidalInverseMatchesGie() { + GieRow row = GieRow.grs80(ELLIPSOIDAL); + row.expectInverse(200, 100, 0.001796631, 0.000904369, 0.1 * GieRow.MM); + row.expectInverse(200, -100, 0.001796630, -0.000904370, 0.1 * GieRow.MM); + row.expectInverse(16468399.3582, 5275043.9815, 150, 50, 0.1 * GieRow.MM); + } + + /** {@code builtins.gie:38-48} — the ellipsoidal forward, now via {@code AuthalicLat.q}. */ + @Test + public void ellipsoidalForwardMatchesGie() { + GieRow row = GieRow.grs80(ELLIPSOIDAL); + row.expectForward(2, 1, 222571.608757106, 110653.326743030, 0.1 * GieRow.MM); + row.expectForward(2, -1, 222706.306508391, -110484.267144400, 0.1 * GieRow.MM); + row.expectForward(150, 50, 16468399.3582, 5275043.9815, 0.1 * GieRow.MM); + } + + /** + * {@code 9.8.1:aea.cpp:100-105} rejects the coordinate when {@code |qs| > 2} instead of + * handing {@code asin} an out-of-range argument. proj4j had no such guard; the old + * {@code phi1_} Newton loop was seeded with {@code asin(0.5 * qs)}, silently clamped. + */ + @Test + public void ellipsoidalDomainGuardRejectsRatherThanReturningGarbage() { + GieRow row = GieRow.grs80(ELLIPSOIDAL); + // n = sin(lat_1 = 0.5 deg) is tiny, so qs = (c - (rho/dd)^2)/n leaves [-2, 2] as soon + // as the northing is far from the cone's apex. + boolean threwAtLeastOnce = false; + for (double northing : new double[] {-1.0e8, 1.0e8}) { + try { + ProjCoordinate lp = row.inverse(0.0, northing); + assertTrue("must not return NaN at northing " + northing + ", got " + lp, + !Double.isNaN(lp.y)); + } catch (ProjectionException expected) { + threwAtLeastOnce = true; + assertTrue("the message should name the domain, was: " + expected.getMessage(), + expected.getMessage() != null + && expected.getMessage().contains("domain")); + } + } + if (!threwAtLeastOnce) { + fail("|qs| > 2 must be rejected somewhere in that range"); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/AuthalicLatitudeWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/AuthalicLatitudeWiringTest.java new file mode 100644 index 0000000..4c8b865 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/AuthalicLatitudeWiringTest.java @@ -0,0 +1,182 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.util.AuthalicLat; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * {@link AuthalicLat} wired into the three equal-area projections in scope: {@code cea}, + * {@code laea} and {@code aea} (the last also covered by {@link AlbersSphericalInverseTest}). + * + *

This is the largest accuracy movement in the numerical core. + * {@code ProjectionMath.authset}/{@code authlat} is the same idea at third order; on GRS80 its + * error is a smooth single-peaked curve reaching 2.211 mm at latitude 18.01 degrees + * against the 0.1 mm bar that this family's conformance rows set. The order-6 series is + * sub-nanometre. + * + *

Two semantic changes come with it: + *

    + *
  • {@code laea}'s forward now takes the authalic latitude {@code xi} from the direct + * {@code phi -> xi} series and recovers {@code q = sin(xi) * qp} + * ({@code 9.8.1:laea.cpp:39-46}), rather than computing {@code q} and then + * {@code sinb = q/qp}, {@code cosb = sqrt(1 - sinb^2)}. The {@code asin} form loses relative + * accuracy at the poles, which is why upstream stopped using it. The same applies to + * {@code sinb1}/{@code cosb1} at initialisation ({@code laea.cpp:283-285}). + *
  • {@code cea} and {@code aea} keep the raw {@code q} in the forward direction — + * {@code cea.cpp:21} and {@code aea.cpp:70} genuinely want it — so only their inverses move. + *
+ */ +public class AuthalicLatitudeWiringTest { + + private static final double GRS80_ES = 0.006694380022900787; + + /** + * The measurement that motivates the whole change, reproduced end to end: a + * {@code cea} round trip at the error peak. Before the re-point this closed to + * 17.999999980138625 degrees, i.e. 2.211 mm short of 18; it now closes exactly. + */ + @Test + public void cylindricalEqualAreaRoundTripClosesAtTheErrorPeak() { + GieRow row = GieRow.grs80("+proj=cea +ellps=GRS80"); + row.expectRoundtrip(0, 18.0, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(0, 18.01, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(0, 20.8, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(30, 45, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(-30, -70, 1, 0.1 * GieRow.MM); + } + + /** + * Where the peak is. {@code AuthalicLatTest} already pins the magnitudes; what this adds is + * the location, 18.01 degrees, because that is the latitude the {@code cea} round + * trip above is aimed at and the reason a corpus sweep that samples only round numbers can + * miss the defect. + * + *

Both stacks are handed the authalic latitude from the direct {@code phi -> xi} series. + * That is not self-consistency: {@code C[xi,phi]} and {@code C[phi,xi]} are two independent + * blocks of the Maxima table. Deriving {@code beta} from {@code asin(q/qp)} instead would + * measure the {@code asin} form's own ill-conditioning near the poles — about 9.8 um at 90 + * degrees — rather than either series. + */ + @Test + public void thirdOrderErrorPeaksAtEighteenDegrees() { + AuthalicLat authalic = new AuthalicLat(GRS80_ES); + double[] apa = ProjectionMath.authset(GRS80_ES); + final double a = 6378137.0; + + double worstOld = 0.0; + double worstNew = 0.0; + double worstOldAt = Double.NaN; + for (int i = 0; i <= 9000; i++) { + double phi = Math.toRadians(i / 100.0); + double beta = authalic.forward(phi, Math.sin(phi), Math.cos(phi)); + + double old = Math.abs(ProjectionMath.authlat(beta, apa) - phi) * a; + double now = Math.abs(authalic.inverse(beta) - phi) * a; + if (old > worstOld) { + worstOld = old; + worstOldAt = i / 100.0; + } + worstNew = Math.max(worstNew, now); + } + assertEquals("the third-order error peaks at 18.01 degrees", 18.01, worstOldAt, 0.02); + assertTrue("the third-order series should miss the 0.1 mm bar by about 22x, " + + "measured " + worstOld + " m", worstOld > 2.0e-3 && worstOld < 2.5e-3); + assertTrue("the order-6 series must be comfortably sub-nanometre, measured " + + worstNew + " m", worstNew < 1.0e-8); + } + + /** {@code builtins.gie:1014-1035}, {@code tolerance 0.1 mm}. */ + @Test + public void cylindricalEqualAreaMatchesGie() { + GieRow row = GieRow.grs80("+proj=cea +ellps=GRS80"); + row.expectForward(2, 1, 222638.981586547, 110568.812396267, 0.1 * GieRow.MM); + row.expectForward(2, -1, 222638.981586547, -110568.812396266, 0.1 * GieRow.MM); + row.expectForward(150, 50, 16697923.6190, 4865983.5552, 0.1 * GieRow.MM); + row.expectInverse(200, 100, 0.001796631, 0.000904369, 0.1 * GieRow.MM); + row.expectInverse(-200, -100, -0.001796631, -0.000904369, 0.1 * GieRow.MM); + // Latitude 50: before the re-point this returned 50.000000002039194, 0.227 mm out. + row.expectInverse(16697923.6190, 4865983.5552, 150, 50, 0.1 * GieRow.MM); + } + + /** {@code builtins.gie:1041-1058} — the spherical branch bypasses the series entirely. */ + @Test + public void cylindricalEqualAreaSphericalMatchesGie() { + GieRow row = GieRow.sphere("+proj=cea +R=6400000", 6400000.0); + row.expectForward(2, 1, 223402.144255274, 111695.401198614, 0.1 * GieRow.MM); + row.expectForward(2, -1, 223402.144255274, -111695.401198614, 0.1 * GieRow.MM); + row.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * GieRow.MM); + } + + /** {@code builtins.gie:3521-3536}, the oblique aspect at {@code +lat_0=45}. */ + @Test + public void lambertAzimuthalObliqueMatchesGie() { + GieRow row = GieRow.grs80("+proj=laea +ellps=GRS80 +lat_0=45"); + row.expectForward(0, 45, 0, 0, 0.1 * GieRow.MM); + row.expectForward(0, 0, 0, -4860248.8602, 0.1 * GieRow.MM); + row.expectForward(0, -45, 0, -8984728.0442, 0.1 * GieRow.MM); + row.expectForward(45, 45, 3318800.8682, 968788.2336, 0.1 * GieRow.MM); + // builtins.gie:3532 relaxes this one to 50 mm: "Passes 0.1 mm except on i386." + row.expectForward(0, 90, 0, 4886594.2207, 50.0 * GieRow.MM); + // builtins.gie:3543, the rho < EPS10 path. + row.expectInverse(0, 0, 0, 45, 0.1 * GieRow.MM); + // builtins.gie:3538-3539, "tolerance 10 cm; accept 45 45; roundtrip 100". + row.expectRoundtrip(45, 45, 100, 100.0 * GieRow.MM); + } + + /** + * The polar aspect is where the {@code asin} form loses relative accuracy, and where the + * {@code q >= 1e-15} guard of {@code laea.cpp:75} replaces proj4j's {@code q >= 0}. Before + * the re-point the round trip of (20, 70) closed to 69.99999999369757, 0.701 mm out. + */ + @Test + public void lambertAzimuthalPolarRoundTripCloses() { + GieRow north = GieRow.grs80("+proj=laea +ellps=GRS80 +lat_0=90"); + north.expectRoundtrip(20, 70, 1, 0.1 * GieRow.MM); + north.expectRoundtrip(20, 18.01, 1, 0.1 * GieRow.MM); + north.expectForward(0, 90, 0, 0, 1e-9); + + GieRow south = GieRow.grs80("+proj=laea +ellps=GRS80 +lat_0=-90"); + south.expectRoundtrip(20, -70, 1, 0.1 * GieRow.MM); + south.expectForward(0, -90, 0, 0, 1e-9); + } + + /** + * {@code AuthalicLat.q} must stay public and stay in use: {@code laea.cpp:39} recovers + * {@code q = sin(xi) * qp} and {@code cea.cpp:21} and {@code aea.cpp:70} use {@code q} + * directly. Assert the two routes to {@code q} agree, which is what makes the substitution + * legitimate. + */ + @Test + public void directSeriesAndRawQAgree() { + AuthalicLat authalic = new AuthalicLat(GRS80_ES); + assertTrue("the order-6 series must be the branch taken for every Earth ellipsoid", + authalic.isSeriesValid()); + for (int i = 0; i <= 90; i++) { + double phi = Math.toRadians(i); + double sinphi = Math.sin(phi); + double viaSeries = Math.sin(authalic.forward(phi, sinphi, Math.cos(phi))) + * authalic.qp(); + double raw = authalic.q(sinphi); + assertEquals("q at latitude " + i, raw, viaSeries, 1e-15 * authalic.qp()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/ConformalLatitudeWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/ConformalLatitudeWiringTest.java new file mode 100644 index 0000000..9e8f9a9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/ConformalLatitudeWiringTest.java @@ -0,0 +1,216 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * {@link ConformalLat} wired into {@code stere}, plus helper-level pins for the {@code merc} and + * {@code lcc} rows the corpus sets. + * + *

The documented divergence from 9.8.1

+ * + * {@code StereographicAzimuthalProjection.projectInverse} now calls {@link ConformalLat#phi2} + * where upstream ({@code stere.cpp:173-188}) still runs its own {@code NITER = 8}, + * {@code pow}-per-trip Newton loop. The two solve the same fixed point, with {@code ts = 1/tp} + * for the oblique and equatorial aspects and {@code ts = -tp} for the polar ones; the class + * javadoc on {@code StereographicAzimuthalProjection} carries the algebra. The substitution + * makes proj4j differ from 9.8.1 by up to about 4 um on {@code stere} inverses, which is + * 25,000 times inside the 0.1 mm bar the corpus sets for that projection. It is deliberate. + * + *

What is not wired, and why

+ * + * {@code MercatorProjection}, {@code LambertConformalConicProjection}, + * {@code ObliqueMercatorProjection}, {@code EqualAreaAzimuthalProjection}, + * {@code NewZealandMapGridProjection}, {@code BonneProjection}, + * {@code EquidistantAzimuthalProjection} and {@code CassiniProjection} still call the deprecated + * {@code ProjectionMath} helpers. They are outside this change's file scope. The helper-level + * assertions below pin the values those call sites will produce once re-pointed, so the + * hand-off is testable rather than described. + */ +public class ConformalLatitudeWiringTest { + + private static final double GRS80_A = 6378137.0; + private static final double GRS80_ES = 0.006694380022900787; + private static final double GRS80_E = Math.sqrt(GRS80_ES); + + // -- stere, in scope -------------------------------------------------------------------- + + /** {@code builtins.gie:6700-6720}, {@code tolerance 0.1 mm}, equatorial ellipsoidal. */ + @Test + public void stereographicEquatorialMatchesGie() { + GieRow row = GieRow.grs80("+proj=stere +ellps=GRS80 +lat_0=0"); + row.expectForward(2, 1, 222644.854550117, 110610.883474174, 0.1 * GieRow.MM); + row.expectForward(2, -1, 222644.854550117, -110610.883474174, 0.1 * GieRow.MM); + row.expectInverse(200, 100, 0.001796631, 0.000904369, 0.1 * GieRow.MM); + row.expectInverse(200, -100, 0.001796631, -0.000904369, 0.1 * GieRow.MM); + row.expectInverse(-200, 100, -0.001796631, 0.000904369, 0.1 * GieRow.MM); + row.expectRoundtrip(2, 1, 1, 0.1 * GieRow.MM); + } + + /** + * {@code builtins.gie:6723-6742}, the spherical block. The spherical inverse does not use + * {@code phi2} at all, so this is a no-movement guard. + */ + @Test + public void stereographicSphericalMatchesGie() { + GieRow row = GieRow.sphere("+proj=stere +R=6400000 +lat_0=0", 6400000.0); + row.expectForward(2, 1, 223407.810259507, 111737.938996443, 0.1 * GieRow.MM); + row.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * GieRow.MM); + row.expectRoundtrip(2, 1, 1, 0.1 * GieRow.MM); + } + + /** + * {@code builtins.gie:6746-6772}, Polar Stereographic Variants A and B. The + * {@code accept 0 90; expect 0 0} row is at {@code tolerance 1e-15 m}, and it is why the + * polar forward needs {@code 9.8.1:stere.cpp:83}'s {@code |phi - pi/2| < 1e-15} special + * case: {@link ConformalLat#tsfn} correctly returns {@code cos(pi/2)/2 = 3.06e-17} there, + * where the old {@code tan}-based {@code tsfn} returned an exact zero by accident. + */ + @Test + public void stereographicPolarMatchesGie() { + GieRow north = GieRow.grs80("+proj=stere +ellps=GRS80 +lat_0=90 +lat_ts=70"); + north.expectForward(0, 90, 0, 0, 1e-15); + north.expectForward(20, 70, 748315.3282, -2055979.4669, 0.1 * GieRow.MM); + north.expectRoundtrip(20, 70, 1, 0.1 * GieRow.MM); + north.expectRoundtrip(0, 90, 1, 0.1 * GieRow.MM); + + GieRow south = GieRow.grs80("+proj=stere +ellps=GRS80 +lat_0=-90 +lat_ts=-70"); + south.expectForward(0, -90, 0, 0, 1e-15); + south.expectForward(20, -70, 748315.3282, 2055979.4669, 0.1 * GieRow.MM); + south.expectRoundtrip(20, -70, 1, 0.1 * GieRow.MM); + } + + /** + * The oblique aspect, which takes the {@code ts = 1/tp} branch of the substitution. There is + * no {@code +proj=stere} oblique block in {@code builtins.gie} — upstream's oblique coverage + * is {@code sterea} — so the assertion is round-trip closure at the 0.1 mm bar. + */ + @Test + public void stereographicObliqueRoundTripCloses() { + GieRow row = GieRow.grs80("+proj=stere +ellps=GRS80 +lat_0=52 +lon_0=21"); + row.expectRoundtrip(21, 52, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(25, 55, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(15, 45, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(21, 89, 1, 0.1 * GieRow.MM); + } + + /** + * The equatorial ellipsoidal aspect used to return {@code (0, 0)} for every input: + * {@code 9.8.1:stere.cpp:262} handles {@code EQUIT} and {@code OBLIQ} in one branch and so + * sets {@code cosX1 = 1}, while proj4j split them and left {@code cosphi0 = 0}, making + * {@code tp = 2*atan2(rho*cosphi0, akm1)} identically zero. + */ + @Test + public void equatorialEllipsoidalInverseIsNoLongerDegenerate() { + GieRow row = GieRow.grs80("+proj=stere +ellps=GRS80 +lat_0=0"); + assertNotEquals("the inverse used to collapse to latitude 0 for every input", + 0.0, row.inverse(200, 100).y, 1e-12); + assertEquals(0.000904369, row.inverse(200, 100).y, 1e-9); + } + + // -- merc and lcc: helper-level pins for the un-wired call sites ------------------------ + + /** + * {@code builtins.gie:4262-4265} asserts {@code merc} forward of (0, 0) at + * {@code tolerance 0 m}. That row needs {@code tsfn(0) == 1.0} exactly, so that + * {@code -k0*log(ts)} is exactly zero. The old helper returns + * {@code 0.9999999999999999}. + */ + @Test + public void tsfnIsExactlyOneAtTheEquator() { + assertEquals("ConformalLat.tsfn must be bit-exactly 1.0 at phi = 0", + 1.0, ConformalLat.tsfn(0.0, 0.0, GRS80_E), 0.0); + assertEquals("...and so must the sin/cos form", + 1.0, ConformalLat.tsfnSinCos(0.0, 1.0, GRS80_E), 0.0); + assertNotEquals("the deprecated helper is one ulp short, which is what fails a " + + "tolerance 0 m row", + 1.0, ProjectionMath.tsfn(0.0, 0.0, GRS80_E), 0.0); + assertEquals(0.9999999999999999, ProjectionMath.tsfn(0.0, 0.0, GRS80_E), 0.0); + } + + /** + * {@code builtins.gie:4285-4288} asserts {@code merc +ellps=GRS80} inverse of (200, 100) + * at {@code tolerance 50 nm}: {@code expect 0.00179663056824 0.00090436947704}. + * {@code MercatorProjection.projectInverse} is {@code phi2(exp(-y/k0), e)} on the northing + * normalised by the semi-major axis, so the latitude can be pinned without the projection. + */ + @Test + public void phi2ReproducesTheMercatorInverseRow() { + double y = 100.0 / GRS80_A; + double expected = 0.00090436947704; + + double now = Math.toDegrees(ConformalLat.phi2(Math.exp(-y), GRS80_E)); + double before = Math.toDegrees(ProjectionMath.phi2(Math.exp(-y), GRS80_E)); + + double nowErr = Math.abs(now - expected) * Math.PI / 180.0 * GRS80_A; + double beforeErr = Math.abs(before - expected) * Math.PI / 180.0 * GRS80_A; + assertTrue("ConformalLat.phi2 must land inside the 50 nm bar; missed by " + + nowErr + " m", nowErr < 50e-9); + assertTrue("...and the deprecated helper must not, else there is nothing to fix; " + + "missed by " + beforeErr + " m", beforeErr > 50e-9); + } + + /** + * The worst-case sweep behind the "4,145 nm at latitude 2.8 degrees" figure in the numerics + * reference. Both stacks are fed the same, exactly computed {@code ts}, so this isolates the + * inverse rather than measuring a self-consistent round trip. + */ + @Test + public void phi2BeatsTheDeprecatedHelperEverywhere() { + double worstOld = 0.0; + double worstNew = 0.0; + for (int i = 0; i <= 8900; i++) { + double phi = Math.toRadians(i / 100.0); + double ts = ConformalLat.tsfn(phi, Math.sin(phi), GRS80_E); + worstOld = Math.max(worstOld, + Math.abs(ProjectionMath.phi2(ts, GRS80_E) - phi) * GRS80_A); + worstNew = Math.max(worstNew, + Math.abs(ConformalLat.phi2(ts, GRS80_E) - phi) * GRS80_A); + } + assertTrue("the deprecated helper should exceed the 50 nm bar by a wide margin, " + + "measured " + worstOld + " m", worstOld > 1.0e-6); + assertTrue("the Karney formulation must be inside 50 nm, measured " + worstNew + " m", + worstNew < 50e-9); + } + + /** + * {@code builtins.gie:3763-3766} asserts {@code lcc +ellps=GRS80 +lat_1=0.5 +lat_2=2} + * inverse of (200, 100) at {@code tolerance 0.1 mm} — not 50 nm. + * {@code LambertConformalConicProjection.projectInverse} is + * {@code phi2(pow(rho/c, 1/n), e)}, so the same helper-level pin applies; the equivalent + * {@code ts} for that row is the value below. + */ + @Test + public void phi2ReproducesTheLambertConformalConicRow() { + // Latitude 0.000904232 deg, i.e. the lcc row's expected result. + double expected = 0.000904232; + double phi = Math.toRadians(expected); + double ts = ConformalLat.tsfn(phi, Math.sin(phi), GRS80_E); + + double now = Math.toDegrees(ConformalLat.phi2(ts, GRS80_E)); + double err = Math.abs(now - expected) * Math.PI / 180.0 * GRS80_A; + assertTrue("round-tripping tsfn/phi2 at the lcc row must close well inside 0.1 mm; " + + "missed by " + err + " m", err < 1.0e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/GieRow.java b/core/src/test/java/org/locationtech/proj4j/numerics/GieRow.java new file mode 100644 index 0000000..9553218 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/GieRow.java @@ -0,0 +1,161 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertTrue; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.gie.GieComparator; + +/** + * Evaluates a single {@code accept}/{@code expect} pair out of + * {@code conformance/src/test/resources/gie/builtins.gie} — the byte-identical vendored copy + * of {@code 9.8.1:test/gie/builtins.gie} — against proj4j, using gie's own metric. + * + *

The tests in this package are unit tests of the numerical core's wiring: each + * one names the {@code builtins.gie} line it reproduces so that a value can be traced back to + * upstream rather than to a previous proj4j run. They are deliberately independent of the + * {@code conformance} module, which is a separate Maven module behind a profile. + * + *

The metric matters. gie chooses among four + * ({@code 9.8.1:src/apps/gie.cpp:1120-1165}); applying an angular scale to a projected target + * inflates the deviation by about 111,319. Here: + * + *

    + *
  • a forward row's output is projected metres, so the deviation is + * {@code GieComparator.xyDist} — plain Euclidean; + *
  • an inverse row's output is degrees, so the deviation is + * {@code GieComparator.lpDist} on the radian values — geodesic distance on the very + * ellipsoid under test. + *
+ * + *

gie's pass predicate is reused verbatim through + * {@link GieComparator#withinTolerance(double, double)}, which is written {@code !(d <= tol)} + * so that a NaN deviation fails. + */ +final class GieRow { + + /** One nanometre in metres — {@code tolerance 50 nm} rows. */ + static final double NM = 1.0e-9; + + /** One millimetre in metres — the common {@code tolerance 0.1 mm} rows. */ + static final double MM = 1.0e-3; + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + private final CoordinateReferenceSystem geographic; + private final CoordinateReferenceSystem projected; + private final GieComparator comparator; + private final String operation; + + /** + * @param operation the {@code operation} line's proj-string, minus the leading + * {@code operation} keyword + * @param ellipsoid the same ellipsoid or radius parameters, for the paired + * {@code +proj=longlat} side and for the geodesic metric + * @param a the semi-major axis the metric should use + * @param f the flattening the metric should use; {@code 0} for a sphere + */ + GieRow(String operation, String ellipsoid, double a, double f) { + this.operation = operation; + this.geographic = CRS.createFromParameters("gie-geog", "+proj=longlat " + ellipsoid + " +no_defs"); + this.projected = CRS.createFromParameters("gie-proj", operation + " +no_defs"); + this.comparator = GieComparator.forEllipsoid(a, f); + } + + /** A row on GRS80, {@code +ellps=GRS80}. */ + static GieRow grs80(String operation) { + return new GieRow(operation, "+ellps=GRS80", 6378137.0, 1.0 / 298.257222101); + } + + /** A row on a sphere, {@code +R=}. */ + static GieRow sphere(String operation, double radius) { + return new GieRow(operation, "+R=" + radius, radius, 0.0); + } + + /** The forward direction: degrees in, projected units out. */ + ProjCoordinate forward(double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(geographic, projected).transform(new ProjCoordinate(lon, lat), out); + return out; + } + + /** The inverse direction: projected units in, degrees out. */ + ProjCoordinate inverse(double x, double y) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(projected, geographic).transform(new ProjCoordinate(x, y), out); + return out; + } + + /** + * Asserts a forward {@code accept}/{@code expect} pair. Deviation is Euclidean in the + * projected units, matching gie's {@code proj_xy_dist} branch. + */ + void expectForward(double lon, double lat, double x, double y, double toleranceMetres) { + ProjCoordinate got = forward(lon, lat); + double d = GieComparator.xyDist(new double[] {x, y, 0, 0}, + new double[] {got.x, got.y, 0, 0}); + assertTrue(describe("forward", lon, lat, x, y, got, d, toleranceMetres), + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** + * Asserts an inverse {@code accept}/{@code expect} pair. Deviation is the geodesic + * distance, matching gie's {@code proj_lp_dist} branch for degree output. + */ + void expectInverse(double x, double y, double lon, double lat, double toleranceMetres) { + ProjCoordinate got = inverse(x, y); + double d = angularDeviation(lon, lat, got); + assertTrue(describe("inverse", x, y, lon, lat, got, d, toleranceMetres), + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** The geodesic deviation, in metres, between an expected lon/lat in degrees and a result. */ + double angularDeviation(double lon, double lat, ProjCoordinate got) { + return comparator.lpDist( + new double[] {Math.toRadians(lon), Math.toRadians(lat), 0, 0}, + new double[] {Math.toRadians(got.x), Math.toRadians(got.y), 0, 0}); + } + + /** gie's {@code roundtrip n}, forward then inverse, measured against the original input. */ + void expectRoundtrip(double lon, double lat, int trips, double toleranceMetres) { + double curLon = lon; + double curLat = lat; + for (int i = 0; i < trips; i++) { + ProjCoordinate xy = forward(curLon, curLat); + ProjCoordinate lp = inverse(xy.x, xy.y); + curLon = lp.x; + curLat = lp.y; + } + ProjCoordinate got = new ProjCoordinate(curLon, curLat); + double d = angularDeviation(lon, lat, got); + assertTrue(operation + " roundtrip " + trips + " from (" + lon + ", " + lat + + ") deviates " + d + " m, tolerance " + toleranceMetres + " m; got " + got, + GieComparator.withinTolerance(d, toleranceMetres)); + } + + private String describe(String direction, double in0, double in1, double e0, double e1, + ProjCoordinate got, double d, double tol) { + return operation + " " + direction + " of (" + in0 + ", " + in1 + "): expected (" + + e0 + ", " + e1 + ") got (" + got.x + ", " + got.y + "), deviation " + d + + " m against a tolerance of " + tol + " m"; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/PolyconicEllipsoidalTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/PolyconicEllipsoidalTest.java new file mode 100644 index 0000000..ed26486 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/PolyconicEllipsoidalTest.java @@ -0,0 +1,130 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.proj.Projection; + +/** + * The American Polyconic ellipsoidal branch, which was dead code. + * + *

{@code PolyconicProjection.initialize()} contained the line + *

spherical = true;//FIXME
+ * after {@code super.initialize()} had computed the real value, so every ellipsoidal + * {@code +proj=poly} — which is every US State Plane Polyconic, and EPSG:5472, 5530, 5880, + * 29100, 29101 — ran the spherical formulae. Measured against + * {@code builtins.gie:5906-5914}, the forward of (2, 1) on GRS80 was + * (222605.0588, 111387.2967) where upstream gives (222605.2858, 110642.1946): the + * northing was out by 745.10 m. The inverse of (200, 100) returned latitude + * 0.00089832 instead of 0.00090437, 0.673 m. + * + *

Turning the branch on exposed three further defects in it, all fixed here: + *

    + *
  • the forward read the destination's stale {@code out.x} as the multiplicand + * ({@code out.x *= sp}) instead of {@code lplam}, and then took the cosine of the + * unscaled {@code lplam} — {@code 9.8.1:poly.cpp:37-40} scales first and uses the + * scaled value in both; + *
  • the inverse's Newton denominator used {@code (1.0 / es)} where {@code poly.cpp:88} has + * {@code P->one_es}, i.e. {@code (1 - es)} — a factor of 150 out for GRS80; + *
  • the spherical inverse tested {@code |phi0 + y|} but then seeded from the raw + * {@code y}, so {@code lat_0} was ignored ({@code poly.cpp:112} uses the mutated value). + *
+ */ +public class PolyconicEllipsoidalTest { + + /** + * The ellipsoidal branch must actually be selected. {@code spherical} is not exposed, so the + * observable consequence is asserted instead: the ellipsoidal and spherical formulae for the + * same semi-major axis must give different northings, and only the ellipsoidal one may match + * upstream. + */ + @Test + public void ellipsoidalDefinitionIsNotForcedSpherical() { + Projection poly = new CRSFactory() + .createFromParameters("p", "+proj=poly +ellps=GRS80 +no_defs") + .getProjection(); + assertTrue("the ellipsoid must survive initialize()", + poly.getEllipsoid().getEccentricitySquared() > 0.0); + + double ellipsoidalNorthing = GieRow.grs80("+proj=poly +ellps=GRS80").forward(2, 1).y; + double sphericalNorthing = GieRow.sphere("+proj=poly +R=6378137", 6378137.0).forward(2, 1).y; + assertFalse("the spherical formula must no longer be substituted for the ellipsoidal one", + Math.abs(ellipsoidalNorthing - sphericalNorthing) < 1.0); + } + + /** {@code builtins.gie:5906-5914}, {@code tolerance 0.1 mm}. */ + @Test + public void ellipsoidalForwardMatchesGie() { + GieRow row = GieRow.grs80("+proj=poly +ellps=GRS80"); + row.expectForward(2, 1, 222605.285770237, 110642.194561440, 0.1 * GieRow.MM); + row.expectForward(2, -1, 222605.285770237, -110642.194561440, 0.1 * GieRow.MM); + row.expectForward(-2, 1, -222605.285770237, 110642.194561440, 0.1 * GieRow.MM); + row.expectForward(-2, -1, -222605.285770237, -110642.194561440, 0.1 * GieRow.MM); + } + + /** {@code builtins.gie:5917-5924}. */ + @Test + public void ellipsoidalInverseMatchesGie() { + GieRow row = GieRow.grs80("+proj=poly +ellps=GRS80"); + row.expectInverse(200, 100, 0.001796631, 0.000904369, 0.1 * GieRow.MM); + row.expectInverse(200, -100, 0.001796631, -0.000904369, 0.1 * GieRow.MM); + row.expectInverse(-200, 100, -0.001796631, 0.000904369, 0.1 * GieRow.MM); + row.expectInverse(-200, -100, -0.001796631, -0.000904369, 0.1 * GieRow.MM); + } + + /** + * The round trip is what proves the two halves are the same projection; before the fix the + * forward was spherical and the inverse's Newton step carried the {@code 1/es} factor, so + * they were inconsistent as well as wrong. + */ + @Test + public void ellipsoidalRoundTripCloses() { + GieRow row = GieRow.grs80("+proj=poly +ellps=GRS80"); + row.expectRoundtrip(2, 1, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(-2, -1, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(6, 40, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(-3, -55, 1, 0.1 * GieRow.MM); + } + + /** {@code builtins.gie:5929-5947} — the spherical branch must not have moved. */ + @Test + public void sphericalStillMatchesGie() { + GieRow row = GieRow.sphere("+proj=poly +R=6400000", 6400000.0); + row.expectForward(2, 1, 223368.105210219, 111769.110491225, 0.1 * GieRow.MM); + row.expectForward(2, -1, 223368.105210219, -111769.110491225, 0.1 * GieRow.MM); + row.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * GieRow.MM); + row.expectInverse(-200, -100, -0.001790493, -0.000895247, 0.1 * GieRow.MM); + row.expectRoundtrip(2, 1, 1, 0.1 * GieRow.MM); + } + + /** + * The spherical inverse now honours {@code lat_0} — {@code poly.cpp:112} seeds Newton from + * {@code phi0 + y}, where proj4j reverted to the raw {@code y}. There is no corpus row with + * a spherical {@code +proj=poly +lat_0}, so the assertion is that the round trip closes. + */ + @Test + public void sphericalInverseHonoursLatitudeOfOrigin() { + GieRow row = GieRow.sphere("+proj=poly +R=6400000 +lat_0=40", 6400000.0); + row.expectRoundtrip(1, 41, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(-1, 30, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(2, 55, 1, 0.1 * GieRow.MM); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/SphereDeclarationTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/SphereDeclarationTest.java new file mode 100644 index 0000000..063620e --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/SphereDeclarationTest.java @@ -0,0 +1,115 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code Projection.setRadius} must declare a true sphere. + * + *

{@code 9.8.1:src/ell_set.cpp:92-100}: a radius overrules {@code +ellps} and makes every + * shape parameter irrelevant, so {@code es}, {@code e} and {@code f} all become exactly zero and + * {@code b == a}. proj4j's {@code setRadius} assigned the semi-major axis alone, leaving + * {@code e}, {@code es} and {@code ellipsoid} stale, so {@code spherical} stayed {@code false} + * and the ellipsoidal formula ran on a declared sphere — northing wrong by about + * 1,495 m at 2 degrees and 35,000 m at 55. + * + *

The {@code +R=} parse path no longer reaches this method (it is resolved in + * {@code DatumParameters.setR}), but the method is public API and was wrong on its own terms. + * That is exactly why the coupling matters: making {@code +R} spherical is what exposed the + * Albers spherical inverse, the doubled {@code k_0} in the spherical transverse Mercator and the + * dead ellipsoidal Polyconic branch, all covered by the sibling tests in this package. + */ +public class SphereDeclarationTest { + + private static Projection merc() { + return new CRSFactory() + .createFromParameters("m", "+proj=merc +lon_0=0 +ellps=GRS80 +units=m +no_defs") + .getProjection(); + } + + @Test + public void setRadiusZeroesTheEccentricityAndReplacesTheEllipsoid() { + Projection p = merc(); + assertTrue("GRS80 must start out eccentric", + p.getEllipsoid().getEccentricitySquared() > 0.0); + Ellipsoid before = p.getEllipsoid(); + + p.setRadius(6371000.0); + + assertEquals("the semi-major axis must be the radius", 6371000.0, p.getEquatorRadius(), 0.0); + assertNotSame("the stale ellipsoid must be replaced, not kept", before, p.getEllipsoid()); + assertEquals("es must be exactly zero", 0.0, + p.getEllipsoid().getEccentricitySquared(), 0.0); + assertEquals("e must be exactly zero", 0.0, + p.getEllipsoid().eccentricity, 0.0); + assertEquals("b == a for a sphere", 6371000.0, + p.getEllipsoid().poleRadius, 0.0); + assertEquals("and the ellipsoid's own radius must agree with the projection's", + 6371000.0, p.getEllipsoid().getEquatorRadius(), 0.0); + } + + /** + * The consequence: after {@code initialize()} the spherical branch runs, so a Mercator + * forward is the closed-form spherical one. On a sphere the ellipsoidal Mercator northing is + * wrong by roughly 1,495 m at 2 degrees latitude, growing to about 35 km at 55. + */ + @Test + public void sphericalFormulaeAreSelectedAfterInitialize() { + Projection p = merc(); + p.setRadius(6371000.0); + p.initialize(); + + ProjCoordinate xy = new ProjCoordinate(); + p.projectRadians(new ProjCoordinate(Math.toRadians(2.0), Math.toRadians(2.0)), xy); + + // Spherical Mercator, exactly: x = R*lam, y = R*asinh(tan(phi)). + double lam = Math.toRadians(2.0); + double phi = Math.toRadians(2.0); + double expectedX = 6371000.0 * lam; + double expectedY = 6371000.0 * Math.log(Math.tan(Math.PI / 4 + phi / 2)); + assertEquals("easting", expectedX, xy.x, 1e-6); + assertEquals("northing must be the spherical value, not the ellipsoidal one", + expectedY, xy.y, 1e-6); + + // Sanity: the ellipsoidal value really is far away, so the assertion above has teeth. + Projection ellipsoidal = merc(); + ProjCoordinate ell = new ProjCoordinate(); + ellipsoidal.projectRadians(new ProjCoordinate(lam, phi), ell); + assertTrue("the two formulae must be distinguishable at this latitude, " + + "difference was " + Math.abs(ell.y - xy.y) + " m", + Math.abs(ell.y - xy.y) > 1000.0); + } + + /** {@code +R=} through the parser must reach the same state. */ + @Test + public void radiusThroughTheParserAlsoDeclaresASphere() { + Projection p = new CRSFactory() + .createFromParameters("r", "+proj=merc +R=6400000 +no_defs") + .getProjection(); + assertEquals(6400000.0, p.getEquatorRadius(), 0.0); + assertEquals(0.0, p.getEllipsoid().getEccentricitySquared(), 0.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/TransverseMercatorApproxTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/TransverseMercatorApproxTest.java new file mode 100644 index 0000000..2755d0d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/TransverseMercatorApproxTest.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; +import org.locationtech.proj4j.util.MeridianArc; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The four Evenden/Snyder transverse-Mercator defects, plus the {@link MeridianArc} re-point. + * + *

Reference rows: {@code builtins.gie:7096-7127} ({@code +proj=tmerc +ellps=GRS80}) and + * {@code builtins.gie:7276-7360} (the spherical {@code +k=0.9 +lat_0=+/-40} blocks, + * {@code tolerance 0.1 mm}, each row carrying {@code roundtrip 1}). + * + *

The defects, in {@code 9.8.1:src/projections/tmerc.cpp} terms: + *

    + *
  1. {@code k_0} applied twice in the spherical forward. {@code esp = k0} and + * {@code ml0 = .5*esp}, then proj4j wrote {@code ml0 * scaleFactor * log(...)} where + * {@code tmerc.cpp:130} is {@code ml0 * log(...)}. Easting was out by a factor of + * {@code k_0}: 78,358.1216 instead of 87,064.5795 at (1, -30) with {@code +k=0.9}. + *
  2. The wrong hemisphere test in the spherical inverse: {@code if (y < 0) negate} + * where {@code tmerc.cpp:216} is {@code copysign(lp.phi, D)} with + * {@code D = phi0 + xy.y/esp}. They differ for every {@code lat_0 != 0}; at + * {@code +lat_0=40} the inverse of (0, -1005309.6491) came back as -30. + *
  3. A transcription error: {@code 4095. + 1574.*t} where {@code tmerc.cpp:185} has + * 1575. + *
  4. The wrong variable in the ellipsoidal inverse's pole guard: {@code |xy.y|} — the + * northing — where {@code tmerc.cpp:165} tests the latitude just computed. Since + * {@code mlfn(pi/2) = 1.568164141 < pi/2} there is always a band in which the old guard is + * silent while the footpoint is already past the pole. + *
+ * + *

Scope note, updated by Stage 6. {@code +proj=tmerc} is now Poder/Engsager, as + * 9.8.1 ships ({@code proj_internal.h:840-841}); the Evenden/Snyder series is reached through + * {@code +approx}. So: + *

    + *
  • the two {@code +R=} blocks and {@code sphericalInverseUsesCopysignOfD} still exercise + * Evenden/Snyder automatically, because a sphere forces it + * ({@code tmerc.cpp:518-519}); + *
  • {@link #ellipsoidalPoleGuardTestsTheLatitudeNotTheNorthing} and + * {@link #ellipsoidalInverseUsesFifteenSeventyFive} select it explicitly through + * {@code setApprox(true)} — they are about defects of that series, and through a + * plain {@code +proj=tmerc} they were measuring the wrong algorithm (the {@code 1575} one by + * 16 km, the pole guard by 90 degrees of longitude); + *
  • the two remaining ellipsoidal methods now run Poder/Engsager and pass with room to spare. + * {@code org.locationtech.proj4j.tmerc.TmercGieCorpusTest} asserts that whole block at the + * file's own {@code tolerance 50 nm}, forward included, which this class could not. + *
+ * The algorithm difference itself — 1.8 um at 2 degrees from the central meridian, 0.83 mm at 6, + * 4.0 m at 20, 4.0 km at 44.69 — is tabulated by + * {@code TmercAlgorithmSelectionTest.movementFromEvendenSnyderToPoderEngsager}. + */ +public class TransverseMercatorApproxTest { + + private static final double RADIUS = 6400000.0; + private static final double GRS80_A = 6378137.0; + private static final double GRS80_ES = 0.006694380022900787; + + /** {@code builtins.gie:7278-7302}, {@code +proj=tmerc +R=6400000 +k=0.9 +lat_0=40}. */ + @Test + public void sphericalForwardAppliesScaleFactorExactlyOnce() { + GieRow row = GieRow.sphere("+proj=tmerc +R=" + RADIUS + " +k=0.9 +lat_0=40", RADIUS); + row.expectForward(0, -30, 0, -7037167.5440, 0.1 * GieRow.MM); + row.expectForward(1, -30, 87064.5795, -7037547.4590, 0.1 * GieRow.MM); + row.expectForward(-1, -30, -87064.5795, -7037547.4590, 0.1 * GieRow.MM); + row.expectForward(0, 30, 0, -1005309.6491, 0.1 * GieRow.MM); + row.expectForward(0, 40, 0, 0, 0.1 * GieRow.MM); + row.expectForward(1, 41, 75872.2182, 100965.3718, 0.1 * GieRow.MM); + } + + /** The same block with {@code +lat_0=-40}, {@code builtins.gie:7336-7360}. */ + @Test + public void sphericalForwardSouthernOriginMatchesGie() { + GieRow row = GieRow.sphere("+proj=tmerc +R=" + RADIUS + " +k=0.9 +lat_0=-40", RADIUS); + row.expectForward(0, -30, 0, 1005309.6491, 0.1 * GieRow.MM); + row.expectForward(1, -30, 87064.5795, 1004929.7341, 0.1 * GieRow.MM); + row.expectForward(-1, -30, -87064.5795, 1004929.7341, 0.1 * GieRow.MM); + row.expectForward(0, 30, 0, 7037167.5440, 0.1 * GieRow.MM); + row.expectForward(0, -40, 0, 0, 0.1 * GieRow.MM); + row.expectForward(1, -41, 75872.2182, -100965.3718, 0.1 * GieRow.MM); + } + + /** + * Every one of those rows carries {@code roundtrip 1}, which is what catches the hemisphere + * test. The (0, 30) row is the decisive one: its northing is negative while + * {@code D = phi0 + y/esp} is positive, so the old {@code if (y < 0)} flipped it to -30 — + * a 60 degree error, about 6,700 km. + */ + @Test + public void sphericalInverseUsesCopysignOfD() { + GieRow row = GieRow.sphere("+proj=tmerc +R=" + RADIUS + " +k=0.9 +lat_0=40", RADIUS); + + ProjCoordinate lp = row.inverse(0, -1005309.6491); + assertEquals("northing is negative but D is positive: was -30 before the fix", + 30.0, lp.y, 1e-8); + + row.expectRoundtrip(0, -30, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(1, -30, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(-1, -30, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(0, 30, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(0, 40, 1, 0.1 * GieRow.MM); + row.expectRoundtrip(1, 41, 1, 0.1 * GieRow.MM); + + GieRow south = GieRow.sphere("+proj=tmerc +R=" + RADIUS + " +k=0.9 +lat_0=-40", RADIUS); + assertEquals("mirror image of the same defect", + -30.0, south.inverse(0, 1005309.6491).y, 1e-8); + south.expectRoundtrip(0, 30, 1, 0.1 * GieRow.MM); + south.expectRoundtrip(1, -41, 1, 0.1 * GieRow.MM); + } + + /** + * {@code builtins.gie:7114-7127} at the file's own {@code tolerance 50 nm}. The near-pole + * row is the one {@link MeridianArc} unlocks: with {@code ProjectionMath.inv_mlfn} the + * latitude was 89.99135362645478 against upstream's 89.99135362646302 — 916 nm, or + * eighteen times the bar — and the longitude was 0.35596960725299776 against + * 0.35596960759234, 38 um of arc. Both now land inside 7 nm. + */ + @Test + public void ellipsoidalInverseMatchesGieAt50Nanometres() { + GieRow row = GieRow.grs80("+proj=tmerc +ellps=GRS80"); + row.expectInverse(200, 100, 0.00179663056816, 0.00090436947663, 50 * GieRow.NM); + row.expectInverse(200, -100, 0.00179663056816, -0.00090436947663, 50 * GieRow.NM); + row.expectInverse(-200, 100, -0.00179663056816, 0.00090436947663, 50 * GieRow.NM); + row.expectInverse(-200, -100, -0.00179663056816, -0.00090436947663, 50 * GieRow.NM); + row.expectInverse(6, 1.0001e7, 0.35596960759234, 89.99135362646302, 50 * GieRow.NM); + } + + /** + * {@code builtins.gie:7099-7110} forward. Asserted at 0.1 mm, not the file's 50 nm: the + * residual is the Evenden/Snyder versus Poder/Engsager difference, which is upstream's + * choice of algorithm rather than an error in this series. Measured here: 1.81 um at + * 2 degrees, 90.5 nm at the pole row. + */ + @Test + public void ellipsoidalForwardMatchesGieWithinTheAlgorithmDifference() { + GieRow row = GieRow.grs80("+proj=tmerc +ellps=GRS80"); + row.expectForward(2, 1, 222650.796797586, 110642.229411933, 0.1 * GieRow.MM); + row.expectForward(2, -1, 222650.796797586, -110642.229411933, 0.1 * GieRow.MM); + row.expectForward(-2, 1, -222650.796797586, 110642.229411933, 0.1 * GieRow.MM); + row.expectForward(30, 89.9999, 5.584698978, 10001956.056248082, 0.1 * GieRow.MM); + } + + /** + * A GRS80 {@code tmerc} pinned to the Evenden/Snyder series. + * + *

Why this is no longer a plain {@code +proj=tmerc} proj-string. Stage 6 switched + * {@code +proj=tmerc} to Poder/Engsager, which is what PROJ 9.8.1 ships. The four defects this + * class covers are defects of the approximate series, which is still reachable — and + * still used for every sphere — so the tests must select it explicitly. {@code +approx} has no + * parser plumbing yet, hence the setter. + */ + private static TransverseMercatorProjection approxGrs80() { + TransverseMercatorProjection p = new TransverseMercatorProjection(); + p.setEllipsoid(Ellipsoid.GRS80); + p.setApprox(true); + p.initialize(); + return p; + } + + /** + * The pole guard now tests the latitude, so it fires in the band + * {@code mlfn(pi/2) <= |mu| < pi/2} where the old {@code |y|} test was silent. Inside that + * band the old code let {@code cosphi} go negative, the series diverged (measured + * 1.8e18 rad at one point), and a NaN was minted downstream in {@code ProjectionMath.tsfn}. + */ + @Test + public void ellipsoidalPoleGuardTestsTheLatitudeNotTheNorthing() { + MeridianArc grs80 = MeridianArc.fromEs(GRS80_ES); + double quadrant = grs80.mlfn(ProjectionMath.HALFPI, 1.0, 0.0); + assertTrue("mlfn(pi/2) must be strictly below pi/2 for GRS80, else there is no band", + quadrant < ProjectionMath.HALFPI); + assertEquals("the normalised meridian quadrant for GRS80", 1.5681641, quadrant, 1e-7); + + Projection approx = approxGrs80(); + for (double mu : new double[] {1.5682, 1.5695, 1.5707, -1.5682, -1.5695, -1.5707}) { + double northing = mu * GRS80_A; + ProjCoordinate lp = new ProjCoordinate(); + approx.inverseProject(new ProjCoordinate(0.0, northing), lp); + assertEquals("must clamp to a pole at mu = " + mu, 90.0, Math.abs(lp.y), 1e-9); + assertEquals("longitude is zeroed with the clamp, per tmerc.cpp:166", + 0.0, lp.x, 0.0); + assertTrue("sign must follow the northing, got " + lp.y, + (lp.y > 0) == (mu > 0)); + } + } + + // -- the 1575 coefficient --------------------------------------------------------------- + + private static final double FC2 = 0.5; + private static final double FC4 = 0.08333333333333333333; + private static final double FC6 = 0.03333333333333333333; + private static final double FC8 = 0.01785714285714285714; + + /** + * An independent transcription of {@code 9.8.1:tmerc.cpp:175-186}'s latitude correction with + * the innermost coefficient left free, so that the projection's own answer can be matched + * against 1575 and distinguished from 1574. + */ + private static double approxInverseLatitude(double x, double y, double es, double coeff) { + MeridianArc en = MeridianArc.fromEs(es); + final double esp = es / (1. - es); + double phi = en.invMlfn(y); + double sinphi = Math.sin(phi); + double cosphi = Math.cos(phi); + double t = Math.abs(cosphi) > 1e-10 ? sinphi / cosphi : 0.; + final double n = esp * cosphi * cosphi; + double con = 1. - es * sinphi * sinphi; + final double d = x * Math.sqrt(con); + con *= t; + t *= t; + final double ds = d * d; + return phi - (con * ds / (1. - es)) * FC2 + * (1. - ds * FC4 * (5. + t * (3. - 9. * n) + n * (1. - 4 * n) + - ds * FC6 * (61. + t * (90. - 252. * n + 45. * t) + 46. * n + - ds * FC8 * (1385. + t * (3633. + t * (4095. + coeff * t)))))); + } + + /** + * The {@code 1575} term lives under {@code FC4*FC6*FC8}, so it is weighted by + * {@code ds^3 * t^3 / 20160} and is invisible near the central meridian — which is why it + * survived in proj4j for twenty years and why no corpus row catches it. Far out it is not + * invisible at all: at {@code x = 0.65 a} it is worth about 1.3 m. + */ + @Test + public void ellipsoidalInverseUsesFifteenSeventyFive() { + final double x = 0.65; // in units of the semi-major axis, about 4,146 km + final double y = 0.78; // about 4,975 km, i.e. latitude 44.6 degrees + + double with1575 = approxInverseLatitude(x, y, GRS80_ES, 1575.0); + double with1574 = approxInverseLatitude(x, y, GRS80_ES, 1574.0); + double separation = Math.abs(with1575 - with1574) * GRS80_A; + assertTrue("the two coefficients must be distinguishable at this easting, " + + "otherwise the test proves nothing; separation was " + separation + " m", + separation > 0.1); + + Projection tmerc = approxGrs80(); + ProjCoordinate got = new ProjCoordinate(); + tmerc.inverseProjectRadians(new ProjCoordinate(x * GRS80_A, y * GRS80_A), got); + + double err1575 = Math.abs(got.y - with1575) * GRS80_A; + double err1574 = Math.abs(got.y - with1574) * GRS80_A; + assertTrue("the projection must agree with the 1575 series; missed by " + err1575 + " m", + err1575 < 1e-6); + assertTrue("...and must not agree with the 1574 series; missed by only " + err1574 + " m", + err1574 > 0.1); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/UnknownDatumShortCircuitTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/UnknownDatumShortCircuitTest.java new file mode 100644 index 0000000..284ad51 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/UnknownDatumShortCircuitTest.java @@ -0,0 +1,117 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Datum; + +/** + * The {@code TYPE_UNKNOWN} early return in {@code BasicCoordinateTransform.datumTransform} must + * be unconditional and must precede the identical-datums short cut. + * + *

The file already cites {@code PROJ 5.2.0:src/pj_transform.c}. That source reads: + *

+ * // We cannot do any meaningful datum transformation if either the source or destination
+ * // are of an unknown datum type (ie. only a +ellps declaration, no +datum).
+ * if (src->datum_type == PJD_UNKNOWN || dst->datum_type == PJD_UNKNOWN) return 0;   // :835-843
+ *
+ * // Short cut if the datums are identical.
+ * if (pj_compare_datums(src, dst)) return 0;                                        // :845-848
+ * 
+ * proj4j nested the first test inside an ellipsoid-equality guard and ran it after the + * short cut, so a bare-{@code +ellps} pair with differing ellipsoids fell through to a + * geocentric round trip that PROJ skips entirely. + * + *

Measured for {@code +ellps=clrk66} to {@code +ellps=bessel} at (17, 45, 0), which is + * {@code Proj4VariousTest.testRawEllipse}: + * + * + * + * + * + *
before and after
longitudelatitudez
before17.00000000000000444.99726082903537657.304056584835
after17.045.00.0
+ * The latitude shift was 0.00273917 degrees, about 304 m, and the {@code z} was invented + * out of nothing. That test passed anyway on a 0.01 degree tolerance, which is what hid it. + */ +public class UnknownDatumShortCircuitTest { + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + private static ProjCoordinate transform(String src, String dst, ProjCoordinate in) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(CRS.createFromParameters("s", src), + CRS.createFromParameters("d", dst)).transform(in, out); + return out; + } + + /** Both sides {@code TYPE_UNKNOWN}, ellipsoids differing: PROJ does nothing at all. */ + @Test + public void bareEllipsoidPairIsAnIdentityOnLongitudeLatitudeAndHeight() { + ProjCoordinate got = transform("+proj=latlong +ellps=clrk66", + "+proj=latlong +ellps=bessel", new ProjCoordinate(17.0, 45.0, 0.0)); + assertEquals("longitude", 17.0, got.x, 1e-13); + assertEquals("latitude moved 304 m before the hoist", 45.0, got.y, 1e-13); + assertEquals("z was 657.3 m before the hoist", 0.0, got.z, 1e-13); + } + + /** The datums really are {@code TYPE_UNKNOWN} and the ellipsoids really do differ. */ + @Test + public void thePreconditionsHold() { + CoordinateReferenceSystem clrk66 = CRS.createFromParameters("a", + "+proj=latlong +ellps=clrk66"); + CoordinateReferenceSystem bessel = CRS.createFromParameters("b", + "+proj=latlong +ellps=bessel"); + assertEquals(Datum.TYPE_UNKNOWN, clrk66.getDatum().getTransformType()); + assertEquals(Datum.TYPE_UNKNOWN, bessel.getDatum().getTransformType()); + assertTrue("the ellipsoids must differ, or the old nested guard would have caught it", + !clrk66.getDatum().getEllipsoid() + .isEqual(bessel.getDatum().getEllipsoid())); + } + + /** A {@code TYPE_UNKNOWN} target short-circuits even when the source has a full datum. */ + @Test + public void unknownOnEitherSideIsEnough() { + ProjCoordinate got = transform("+proj=latlong +datum=potsdam", + "+proj=latlong +a=6378137.0 +rf=298.257222", new ProjCoordinate(9.0, 50.0, 0.0)); + assertEquals("longitude must pass through", 9.0, got.x, 1e-13); + assertEquals("latitude must pass through", 50.0, got.y, 1e-13); + + ProjCoordinate reversed = transform("+proj=latlong +a=6378137.0 +rf=298.257222", + "+proj=latlong +datum=potsdam", new ProjCoordinate(9.0, 50.0, 0.0)); + assertEquals(9.0, reversed.x, 1e-13); + assertEquals(50.0, reversed.y, 1e-13); + } + + /** Two fully-specified datums must still be shifted — the hoist must not disable that. */ + @Test + public void realDatumShiftsStillHappen() { + ProjCoordinate got = transform("+proj=latlong +datum=potsdam", + "+proj=latlong +datum=WGS84", new ProjCoordinate(9.0, 50.0, 0.0)); + double shift = Math.hypot((got.x - 9.0) * 111320.0 * Math.cos(Math.toRadians(50.0)), + (got.y - 50.0) * 111320.0); + assertTrue("potsdam to WGS84 must move the point by hundreds of metres, moved " + + shift + " m", shift > 100.0 && shift < 2000.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/BonneWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/BonneWiringTest.java new file mode 100644 index 0000000..a233687 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/BonneWiringTest.java @@ -0,0 +1,227 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_A; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_ES; +import static org.locationtech.proj4j.numerics.wiring.GieCase.MM; +import static org.locationtech.proj4j.numerics.wiring.GieCase.NM; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.MeridianArc; + +/** + * {@code BonneProjection} re-pointed at {@link MeridianArc}, with the three defects that made the + * corpus unreachable for it fixed: {@code +lat_1} was ignored, the ellipsoidal forward had no + * small-{@code rh} guard, and the inverse read the northing it had already overwritten. + */ +public class BonneWiringTest { + + /** {@code builtins.gie:671}. */ + private static final GieCase HALF_DEGREE = + GieCase.grs80("+proj=bonne +ellps=GRS80 +lat_1=0.5"); + + /** + * {@code builtins.gie:671-680}, {@code tolerance 0.1 mm}. The four sign combinations, and note + * that {@code lat_1} makes the projection asymmetric in latitude — the two northings differ. + * + *

Before: 9,944 km out. {@code phi1} was hard-wired to {@code pi/2} with + * {@code +lat_1} commented out, so this operation silently produced the Werner aspect. + */ + @Test + public void halfDegreeStandardParallelForwardMatchesGie() { + HALF_DEGREE.expectForward(2, 1, 222605.296097157, 55321.139565495, 0.1 * MM); + HALF_DEGREE.expectForward(2, -1, 222605.296099239, -165827.647799052, 0.1 * MM); + HALF_DEGREE.expectForward(-2, 1, -222605.296097157, 55321.139565495, 0.1 * MM); + HALF_DEGREE.expectForward(-2, -1, -222605.296099239, -165827.647799052, 0.1 * MM); + + Legacy.Bonne old = new Legacy.Bonne(GRS80_A, GRS80_ES); + double[] was = old.forward(2.0, 1.0); + double before = Math.hypot(was[0] - 222605.296097157, was[1] - 55321.139565495); + double now = HALF_DEGREE.forwardDeviation(2, 1, 222605.296097157, 55321.139565495); + assertTrue("with lat_1 ignored this row was thousands of kilometres out, measured " + + before + " m", before > 9.0e6); + GieCase.assertStrictlyBetter("builtins.gie:674 bonne forward", before, now, 0.1 * MM); + } + + /** + * {@code builtins.gie:682-691}, {@code direction inverse}, {@code tolerance 0.1 mm}. + * + *

Two separate defects had to go before this could pass. The longitude was recovered as + * {@code rh * atan2(x, y)} with the original northing {@code y}, while {@code rh} had + * been computed from the shifted {@code am1 - y}: at {@code lat_1 = 0.5} the two differ by seven + * orders of magnitude ({@code am1} is 114.6, {@code y/a} is 1.6e-5) and {@code atan2} returned + * 1.1 radians where the answer is 2.7e-7. Upstream avoids it by mutating {@code xy.y} in place + * ({@code bonne.cpp:80}); here the shifted value is a named local. + */ + @Test + public void halfDegreeStandardParallelInverseMatchesGie() { + HALF_DEGREE.expectInverse(200, 100, 0.001796699, 0.500904369, 0.1 * MM); + HALF_DEGREE.expectInverse(200, -100, 0.001796698, 0.499095631, 0.1 * MM); + HALF_DEGREE.expectInverse(-200, 100, -0.001796699, 0.500904369, 0.1 * MM); + HALF_DEGREE.expectInverse(-200, -100, -0.001796698, 0.499095631, 0.1 * MM); + } + + /** + * {@code builtins.gie:694-704}, the southern standard parallel with its two + * {@code roundtrip 1} blocks. {@code bonne.cpp:88-97} negates both {@code atan2} arguments when + * {@code phi1 < 0} and takes {@code copysign(hypot(...), phi1)}; proj4j did neither. + */ + @Test + public void southernStandardParallelMatchesGie() { + GieCase r = GieCase.grs80("+proj=bonne +ellps=GRS80 +lat_1=-0.5"); + r.expectForward(2, 1, 222605.2961, 165827.6478, 0.1 * MM); + r.expectRoundtrip(2, 1, 1, 0.1 * MM); + r.expectForward(2, -1, 222605.2961, -55321.1396, 0.1 * MM); + r.expectRoundtrip(2, -1, 1, 0.1 * MM); + } + + /** + * {@code builtins.gie:706-725}, the Werner aspects, {@code tolerance 0.1 mm}: + *

+     *   +lat_1=90   accept 0 90  -> expect 0 0 ; inverse accept 0 0 -> expect 0 90
+     *   +lat_1=-90  accept 0 -90 -> expect 0 0 ; inverse accept 0 0 -> expect 0 -90
+     * 
+ * + *

The forward returned {@code (NaN, NaN)}. At {@code lat_1 = 90}, {@code am1} is + * {@code 6.14e-17} and {@code m1} is {@code 1.5666}, so {@code am1 + m1} rounds back to + * {@code m1} — the addend is below half an ulp — and {@code rh} is exactly zero. The + * next line divides by it. {@code bonne.cpp:29-35} wraps the body in + * {@code if (fabs(rh) > EPS10)} and yields {@code (0, 0)}; proj4j had that guard in the + * spherical branch only. + */ + @Test + public void wernerAspectsNoLongerReturnNaN() { + GieCase north = GieCase.grs80("+proj=bonne +ellps=GRS80 +lat_1=90"); + ProjCoordinate got = north.forward(0, 90); + assertEquals("builtins.gie:709 expects (0, 0), not NaN", 0.0, got.x, 0.0); + assertEquals("builtins.gie:709 expects (0, 0), not NaN", 0.0, got.y, 0.0); + north.expectInverse(0, 0, 0, 90, 0.1 * MM); + + GieCase south = GieCase.grs80("+proj=bonne +ellps=GRS80 +lat_1=-90"); + ProjCoordinate got2 = south.forward(0, -90); + assertEquals(0.0, got2.x, 0.0); + assertEquals(0.0, got2.y, 0.0); + south.expectInverse(0, 0, 0, -90, 0.1 * MM); + + Legacy.Bonne old = new Legacy.Bonne(GRS80_A, GRS80_ES); + double[] was = old.forward(0.0, 90.0); + assertTrue("the pre-change forward produced NaN here, which is what the guard fixes", + Double.isNaN(was[0]) && Double.isNaN(was[1])); + } + + /** {@code builtins.gie:728-747} and {@code :763-780}, the spherical blocks. */ + @Test + public void sphericalBlocksMatchGie() { + GieCase r = GieCase.sphere("+proj=bonne +R=6400000 +lat_1=0.5", 6400000.0); + r.expectForward(2, 1, 223368.115572528, 55884.555246394, 0.1 * MM); + r.expectForward(2, -1, 223368.115574632, -167517.599369694, 0.1 * MM); + r.expectForward(-2, 1, -223368.115572528, 55884.555246394, 0.1 * MM); + r.expectForward(-2, -1, -223368.115574632, -167517.599369694, 0.1 * MM); + r.expectInverse(200, 100, 0.001790562, 0.500895246, 0.1 * MM); + r.expectInverse(200, -100, 0.001790561, 0.499104753, 0.1 * MM); + r.expectInverse(-200, 100, -0.001790562, 0.500895246, 0.1 * MM); + r.expectInverse(-200, -100, -0.001790561, 0.499104753, 0.1 * MM); + + GieCase s = GieCase.sphere("+proj=bonne +R=6400000 +lat_1=-0.5", 6400000.0); + s.expectForward(2, 1, 223368.1156, 167517.5994, 0.1 * MM); + s.expectRoundtrip(2, 1, 1, 0.1 * MM); + s.expectForward(2, -1, 223368.1156, -55884.5552, 0.1 * MM); + s.expectRoundtrip(2, -1, 1, 0.1 * MM); + + GieCase n90 = GieCase.sphere("+proj=bonne +R=6400000 +lat_1=90", 6400000.0); + n90.expectForward(0, 90, 0, 0, 0.1 * MM); + n90.expectInverse(0, 0, 0, 90, 0.1 * MM); + + GieCase s90 = GieCase.sphere("+proj=bonne +R=6400000 +lat_1=-90", 6400000.0); + s90.expectForward(0, -90, 0, 0, 0.1 * MM); + s90.expectInverse(0, 0, 0, -90, 0.1 * MM); + } + + /** + * {@code bonne.cpp:127-131}: {@code lat_1} is required and {@code |lat_1| < 1e-10} is an error. + * Previously the parameter was ignored, so every {@code +proj=bonne} silently became + * {@code +lat_1=90} — including one with no {@code lat_1} at all, which upstream rejects. + * + *

This is a behaviour change for existing users: {@code +proj=bonne} without + * {@code +lat_1} used to return the Werner aspect and now throws. + */ + @Test(expected = ProjectionException.class) + public void missingLatOneIsRejectedAsUpstreamRejectsIt() { + new CRSFactory().createFromParameters("bad", "+proj=bonne +ellps=GRS80 +no_defs"); + } + + /** {@code +lat_1=0} is the same rejection. */ + @Test(expected = ProjectionException.class) + public void zeroLatOneIsRejected() { + new CRSFactory().createFromParameters("bad", + "+proj=bonne +ellps=GRS80 +lat_1=0 +no_defs"); + } + + /** + * The meridian arc that {@code bonne}'s forward and inverse both rest on, measured against the + * independent quadrature rather than against itself. At longitude 0 the northing is + * {@code am1 - rh}, i.e. {@code M(phi) - m1}, so subtracting off the constant leaves the arc. + * + *

The floor here is bonne's own conditioning, not the series. {@code rh} is formed as + * {@code am1 + m1 - M} and at {@code lat_1 = 0.5} degrees {@code am1} is 114.56 in units of the + * semi-major axis — a cotangent-like quantity that blows up as {@code lat_1} approaches zero. + * One ulp of 114.56 scaled by {@code a} is 91 nm, so the cancellation in that sum sets a ~91 nm + * floor on the northing however exact the arc is. Upstream forms {@code rh} the same way + * ({@code bonne.cpp:27}), so this is inherited, not introduced. The assertion is therefore set + * at 200 nm; the underlying series is measured properly in {@code CassiniWiringTest}, where the + * northing has no such addend. + */ + @Test + public void meridianArcBeatsTheDeprecatedSeries() { + // lat_1 = 0.5 makes m1 the arc to 0.5 degrees; take it from the projection at phi = lat_1, + // where the northing is exactly zero by construction, and work relative to it. + double worstBefore = 0.0; + double worstNow = 0.0; + Legacy.Bonne old = new Legacy.Bonne(GRS80_A, GRS80_ES); + double referenceAtHalf = GRS80_A * GieCase.meridianArcReference(Math.toRadians(0.5), GRS80_ES); + for (int i = 0; i <= 890; i++) { + double lat = i / 10.0; + double reference = GRS80_A * GieCase.meridianArcReference(Math.toRadians(lat), GRS80_ES) + - referenceAtHalf; + double now = Math.abs(HALF_DEGREE.forward(0, lat).y - reference); + // The legacy path's arc, relative to its own Werner origin, is the same series. + double legacyArc = -(old.forward(0.0, lat)[1] - old.forward(0.0, 0.5)[1]); + double before = Math.abs(legacyArc - reference); + worstBefore = Math.max(worstBefore, before); + worstNow = Math.max(worstNow, now); + } + assertTrue("the es-series should be micrometres out somewhere in 0-89 degrees, measured " + + worstBefore + " m", worstBefore > 4.0e-6); + assertTrue("the n-series must be at bonne's own 91 nm cancellation floor, measured " + + worstNow + " m", worstNow < 200 * NM); + } + + /** Round-trip closure across the usable range at the corpus's 0.1 mm bar. */ + @Test + public void roundTripCloses() { + for (double lat : new double[] {-60, -10, -1, 0.5, 1, 10, 45, 80}) { + HALF_DEGREE.expectRoundtrip(2, lat, 100, 0.1 * MM); + HALF_DEGREE.expectRoundtrip(-2, lat, 100, 0.1 * MM); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/CassiniWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/CassiniWiringTest.java new file mode 100644 index 0000000..b6574ad --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/CassiniWiringTest.java @@ -0,0 +1,394 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_A; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_ES; +import static org.locationtech.proj4j.numerics.wiring.GieCase.MM; +import static org.locationtech.proj4j.numerics.wiring.GieCase.NM; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.MeridianArc; + +/** + * {@code CassiniProjection} re-pointed at {@link MeridianArc}, with the {@code A^4} easting sign + * corrected and the inverse refined by {@code pj_generic_inverse_2d}. + */ +public class CassiniWiringTest { + + private static final GieCase GRS80 = GieCase.grs80("+proj=cass +ellps=GRS80"); + + /** {@code gigs/5108.gie}: GDM2000 / Johor Grid, EPSG:3377. */ + private static final String JOHOR = + "+proj=cass +lat_0=2.121679744444445 +lon_0=103.4279362361111 " + + "+x_0=-14810.562 +y_0=8758.32 +ellps=GRS80 +units=m"; + + /** The sixteen distinct {@code accept}/{@code expect} pairs of {@code gigs/5108.gie}. */ + private static final double[][] GIGS_5108 = { + {106, 10, 267186.017, 881108.902}, + {106, 9, 268006.024, 770398.186}, + {106, 8, 268740.351, 659692.254}, + {106, 7, 269388.786, 548990.588}, + {106, 6, 269951.141, 438292.666}, + {106, 5, 270427.255, 327597.962}, + {106, 4, 270816.99, 216905.945}, + {106, 3, 271120.234, 106216.081}, + {103.561065778, 2.0424676812, 0, 0}, + {103.64025984, 1.82776484381, 8813.252, -23740.095}, + {106, 1, 271466.923, -115159.332}, + {109, 5, 603116.703, 329668.599}, + {108, 5, 492221.308, 328807.336}, + {107, 5, 381324.74, 328117.472}, + {105, 5, 159529.111, 327248.012}, + {104, 5, 48630.563, 327067.097}, + }; + + /** + * {@code builtins.gie:857-877}, {@code tolerance 0.1 mm}, including the {@code roundtrip 1} at + * {@code :861}. + * + *

Note the forward deviation here grows, from 0.42 nm to 13.5 um, and that is + * correct: {@code builtins.gie:859}'s {@code 222605.285776991} is a stale expectation generated + * before upstream's {@code 78d89828} fixed the easting sign, and it matches the old sign to the + * last printed digit. The block's bar is 0.1 mm, so both signs pass; see + * {@link #epsgGuidanceNoteTestPointDecidesTheEastingSign()} for the row that actually decides. + */ + @Test + public void grs80BlockMatchesGie() { + GRS80.expectForward(2, 1, 222605.285776991, 110642.229253999, 0.1 * MM); + GRS80.expectForward(2, -1, 222605.285776991, -110642.229253999, 0.1 * MM); + GRS80.expectForward(-2, 1, -222605.285776991, 110642.229253999, 0.1 * MM); + GRS80.expectForward(-2, -1, -222605.285776991, -110642.229253999, 0.1 * MM); + GRS80.expectRoundtrip(2, 1, 1, 0.1 * MM); + + GRS80.expectInverse(200, 100, 0.001796631, 0.000904369, 0.1 * MM); + GRS80.expectInverse(200, -100, 0.001796631, -0.000904369, 0.1 * MM); + GRS80.expectInverse(-200, 100, -0.001796631, 0.000904369, 0.1 * MM); + GRS80.expectInverse(-200, -100, -0.001796631, -0.000904369, 0.1 * MM); + } + + /** {@code builtins.gie:881-901}, the spherical block, which uses no series at all. */ + @Test + public void sphericalBlockMatchesGie() { + GieCase r = GieCase.sphere("+proj=cass +R=6400000", 6400000.0); + r.expectForward(2, 1, 223368.105203484, 111769.145040586, 0.1 * MM); + r.expectForward(-2, -1, -223368.105203484, -111769.145040586, 0.1 * MM); + r.expectInverse(200, 100, 0.001790493, 0.000895247, 0.1 * MM); + r.expectInverse(-200, -100, -0.001790493, -0.000895247, 0.1 * MM); + } + + /** + * {@code builtins.gie:905-913}, the EPSG Guidance Note 7-2 test point, {@code tolerance 0.1 mm} + * with {@code roundtrip 1}: + *

+     *   operation +proj=cass +lat_0=10.4416666666667 +lon_0=-61.3333333333333 \
+     *             +x_0=86501.46392052 +y_0=65379.0134283 \
+     *             +a=6378293.64520876 +b=6356617.98767984 +to_meter=0.201166195164
+     *   accept  -62                10
+     *   expect  66644.94040882     82536.21873655
+     * 
+ * + *

This is the row that decides the sign of the {@code A^4} easting term, because its + * expectation is an external EPSG value printed to eight decimals rather than a PROJ regeneration. + * With {@code C1 + (...)} — upstream's, Snyder's Eq. 13-1's and EPSG's — the easting reproduces + * {@code 66644.94040882} to 3.5e-9 links. With proj4j's {@code C1 - (...)} it was + * {@code 66644.94038278}, i.e. 2.6e-5 links out. Both are inside 0.1 mm, which is exactly why + * the corpus alone never flagged it; the round trips did. + */ + @Test + public void epsgGuidanceNoteTestPointDecidesTheEastingSign() { + GieCase r = new GieCase( + "+proj=cass +lat_0=10.4416666666667 +lon_0=-61.3333333333333 " + + "+x_0=86501.46392052 +y_0=65379.0134283 " + + "+a=6378293.64520876 +b=6356617.98767984 +to_meter=0.201166195164", + "+a=6378293.64520876 +b=6356617.98767984", 6378293.64520876, + (6378293.64520876 - 6356617.98767984) / 6378293.64520876); + ProjCoordinate got = r.forward(-62, 10); + assertEquals("the corrected sign must reproduce EPSG's own eight decimals", + 66644.94040882, got.x, 1e-7); + assertEquals(82536.21873655, got.y, 1e-7); + r.expectRoundtrip(-62, 10, 1, 0.1 * MM); + + // What the old sign gave. Reproduced through Legacy so the comparison is a measurement. + double aa = 6378293.64520876; + double bb = 6356617.98767984; + double ff = (aa - bb) / aa; + Legacy.Cass old = new Legacy.Cass(aa, 2.0 * ff - ff * ff, 10.4416666666667); + double[] oldXy = old.forward(-62.0 - (-61.3333333333333), 10.0); + double oldEastingLinks = (oldXy[0] + 86501.46392052) / 0.201166195164; + assertEquals("the pre-change easting was 66644.94038278 links", 66644.94038278, + oldEastingLinks, 1e-7); + assertTrue("...which is farther from EPSG's value than the corrected sign", + Math.abs(oldEastingLinks - 66644.94040882) > Math.abs(got.x - 66644.94040882)); + } + + /** + * {@code builtins.gie:917-927}, the {@code +hyperbolic} block. proj4j does not implement + * {@code +hyperbolic} (there is no such keyword), and the parameter is ignored, so the ordinary + * variant is produced instead. Asserted as the known gap it is, at the size upstream's + * hyperbolic correction term has, rather than left silent. + */ + @Test + public void hyperbolicVariantIsNotImplementedAndIsOffByTheCorrectionTerm() { + GieCase r = new GieCase( + "+proj=cass +a=6378306.376305601 +rf=293.466307 +lat_0=-16.25 " + + "+lon_0=179.33333333333333 +to_meter=20.1168 " + + "+x_0=251727.9155424 +y_0=334519.953768", + "+a=6378306.376305601 +rf=293.466307", 6378306.376305601, 1.0 / 293.466307); + ProjCoordinate got = r.forward(179.99433652777776, -16.841456527777776); + // builtins.gie:922 expects 16015.28901692 13369.66005367 for the hyperbolic variant. + double dev = Math.hypot(got.x - 16015.28901692, got.y - 13369.66005367); + assertTrue("the ordinary variant should differ from the hyperbolic one by the " + + "y^3/(6*rho*nu) term, measured " + dev + " (to_meter units)", dev > 1e-6); + // ...but the ordinary variant must still be self-consistent. + r.expectRoundtrip(179.99433652777776, -16.841456527777776, 1, 0.1 * MM); + } + + /** + * {@code builtins.gie:931-941}, the scenario from PROJ issue 4385, {@code direction inverse} + * at {@code tolerance 0.1 mm}: + *

+     *   accept 300000 100000   expect -4.022094267169   50.583438725252
+     *   accept 500000 100000   expect -1.19725 50.6177
+     * 
+ * + *

The first row is 2.8 degrees from the central meridian and is the clearest single + * measurement of the sign defect: the mis-signed {@code A^4} term put the forward of + * the expected longitude 31 mm out in easting, so the inverse of the accepted easting came back + * 4.4e-7 degrees — 31 mm — wrong in longitude, 310 times the bar. + */ + @Test + public void issue4385InverseMatchesGie() { + GieCase r = new GieCase( + "+proj=cass +lat_0=50.6177 +lon_0=-1.19725 +x_0=500000 +y_0=100000 " + + "+ellps=airy +units=m", + "+ellps=airy", 6377563.396, 1.0 / 299.3249646); + r.expectInverse(300000, 100000, -4.022094267169, 50.583438725252, 0.1 * MM); + r.expectInverse(500000, 100000, -1.19725, 50.6177, 0.1 * MM); + + double now = r.inverseDeviation(300000, 100000, -4.022094267169, 50.583438725252); + Legacy.Cass old = new Legacy.Cass(6377563.396, airyEs(), 50.6177); + double[] lp = old.inverse(300000 - 500000, 100000 - 100000); + double before = r.angularDeviation(-4.022094267169, 50.583438725252, + new ProjCoordinate(lp[0] + -1.19725, lp[1])); + assertTrue("the pre-change inverse must miss the 0.1 mm bar here, measured " + before + + " m", before > 0.1 * MM); + GieCase.assertStrictlyBetter("builtins.gie:936 cass inverse", before, now, 0.1 * MM); + } + + /** + * All sixteen {@code gigs/5108.gie} point checks, both directions, at that file's + * {@code tolerance 0.05 m}. These passed before the change too — the defect was invisible to + * them, which is the point of the next test. + */ + @Test + public void gigs5108PointChecksPassInBothDirections() { + GieCase r = GieCase.grs80(JOHOR); + for (double[] row : GIGS_5108) { + r.expectForward(row[0], row[1], row[2], row[3], 0.05); + r.expectInverse(row[2], row[3], row[0], row[1], 0.05); + } + } + + /** + * The seventeen {@code roundtrip 1000} blocks of {@code gigs/5108.gie} at + * {@code tolerance 0.006 m} (sixteen distinct points; one appears twice). + * + *

Before this change 3 of 16 passed; now 16 of 16 do. Per row, in the order of the + * table above, the old residuals were 4.485 / 3.684 / 2.952 / 2.294 / 1.714 / 1.216 / 0.803 / + * 0.479 m, then 7.6e-8 and 6.1e-7 m for the two points nearly on the central meridian, then + * 0.090 / 67.435 / 23.688 / 6.552 / 0.101 / 6.4e-4 m. The worst is at longitude 109 — + * 5.6 degrees off the central meridian — and the ordering is by exactly that distance, which is + * what identified a truncation term rather than a bad meridian arc. Now the worst is + * 6.0e-5 m. + * + *

Two things were needed and both are asserted, in + * {@link #epsgGuidanceNoteTestPointDecidesTheEastingSign()} and here: the sign, which removes + * most of the mismatch, and {@code pj_generic_inverse_2d}, without which — with the sign already + * corrected — these same rows still pass only 3 of 16 with a worst residual of 37.9 m, because + * the inverse series is itself truncated at {@code D^4}. + */ + @Test + public void gigs5108RoundTripsCloseAtSixMillimetres() { + GieCase r = GieCase.grs80(JOHOR); + Legacy.Cass old = new Legacy.Cass(GRS80_A, GRS80_ES, 2.121679744444445); + double cm = 103.4279362361111; + + double worstNow = 0.0; + double worstBefore = 0.0; + int passedBefore = 0; + for (double[] row : GIGS_5108) { + double now = r.roundtripDeviation(row[0], row[1], 1000); + worstNow = Math.max(worstNow, now); + r.expectRoundtrip(row[0], row[1], 1000, 0.006); + + double lon = row[0] - cm; + double lat = row[1]; + for (int i = 0; i < 1000; i++) { + double[] xy = old.forward(lon, lat); + double[] lp = old.inverse(xy[0], xy[1]); + lon = lp[0]; + lat = lp[1]; + } + double before = r.angularDeviation(row[0], row[1], + new ProjCoordinate(cm + lon, lat)); + worstBefore = Math.max(worstBefore, before); + if (before <= 0.006) { + passedBefore++; + } + } + assertEquals("only the three rows nearest the central meridian used to pass", 3, + passedBefore); + assertTrue("the worst pre-change residual was 67.4 m, measured " + worstBefore, + worstBefore > 60.0); + assertTrue("1000 cycles across the whole grid must now stay under a millimetre, measured " + + worstNow + " m", worstNow < 1.0 * MM); + } + + /** + * The truncation signature, measured directly: one forward/inverse cycle at increasing distance + * from the central meridian, on {@code gigs/5108}'s own operation at latitude 5. + * + *

The mis-signed term is {@code (8 - T + 8C) T A^4 / 120} inside a bracket multiplied by + * {@code A}, so the absolute easting error grows like {@code A^5} — the measured + * sweep is 2.6e-8 m at 0.3 degrees, 8.1e-7 at 0.6, 1.0e-5 at 1, 3.4e-4 at 2, 2.7e-3 at 3, + * 3.8e-2 at 5 and 6.9e-2 at 5.6, which is a factor of 2.65e6 over a factor of 18.7 in longitude + * ({@code 18.7^5 = 2.3e6}). After the change every one of those is under 10 um, bounded by the + * {@code 1e-12}-in-units-of-{@code a} residual upstream's refinement stops at. + */ + @Test + public void singleCycleResidualNoLongerGrowsWithAFifthPowerOfLongitude() { + GieCase r = GieCase.grs80(JOHOR); + double cm = 103.4279362361111; + Legacy.Cass old = new Legacy.Cass(GRS80_A, GRS80_ES, 2.121679744444445); + + double previousBefore = 0.0; + for (double offset : new double[] {0.3, 0.6, 1.0, 2.0, 3.0, 5.0, 5.6}) { + double[] xy = old.forward(offset, 5.0); + double[] lp = old.inverse(xy[0], xy[1]); + double before = r.angularDeviation(cm + offset, 5.0, + new ProjCoordinate(cm + lp[0], lp[1])); + double now = r.roundtripDeviation(cm + offset, 5.0, 1); + + assertTrue("the old residual must grow monotonically with the longitude offset; at " + + offset + " degrees it is " + before + " m, previously " + + previousBefore + " m", before > previousBefore); + assertTrue("at " + offset + " degrees the residual must be inside 10 um, measured " + + now + " m", now < 1.0e-5); + previousBefore = before; + } + // The two ends of the sweep, as the numbers the report quotes. + assertTrue("at 0.6 degrees the pre-change cycle drifted about 0.8 um", + legacyCycle(old, r, cm, 0.6) > 7.0e-7 && legacyCycle(old, r, cm, 0.6) < 9.0e-7); + assertTrue("at 5.6 degrees it drifted about 69 mm", + legacyCycle(old, r, cm, 5.6) > 0.06 && legacyCycle(old, r, cm, 5.6) < 0.08); + } + + private static double legacyCycle(Legacy.Cass old, GieCase r, double cm, double offset) { + double[] xy = old.forward(offset, 5.0); + double[] lp = old.inverse(xy[0], xy[1]); + return r.angularDeviation(cm + offset, 5.0, new ProjCoordinate(cm + lp[0], lp[1])); + } + + /** + * The meridian arc in isolation. At longitude 0 the Cassini northing is the meridian + * arc from {@code lat_0} to {@code phi}, so with {@code lat_0 = 0} the forward can be compared + * against an independent quadrature. Old: up to 4.92 um at latitude 72.55 degrees, which is the + * peak the numerics reference records for {@code ProjectionMath.mlfn}. New: bit-exact at every + * sampled latitude but one, where it is 1.9 nm — inside the reference's own accuracy. + */ + @Test + public void meridianArcBeatsTheDeprecatedSeriesAgainstAnIndependentReference() { + double worstBefore = 0.0; + double worstNow = 0.0; + double worstBeforeAt = Double.NaN; + Legacy.Cass old = new Legacy.Cass(GRS80_A, GRS80_ES, 0.0); + for (int i = 0; i <= 900; i++) { + double lat = i / 10.0; + double reference = GRS80_A * GieCase.meridianArcReference(Math.toRadians(lat), GRS80_ES); + double before = Math.abs(old.forward(0.0, lat)[1] - reference); + double now = Math.abs(GRS80.forward(0, lat).y - reference); + if (before > worstBefore) { + worstBefore = before; + worstBeforeAt = lat; + } + worstNow = Math.max(worstNow, now); + } + assertEquals("the es-series error peaks near latitude 72.5 degrees", 72.5, worstBeforeAt, 0.6); + assertTrue("the es-series should be several micrometres out at the peak, measured " + + worstBefore + " m", worstBefore > 4.0e-6 && worstBefore < 6.0e-6); + assertTrue("the n-series must be inside the quadrature's own ~1 nm accuracy, measured " + + worstNow + " m", worstNow < 10 * NM); + } + + /** + * The inverse against the same independent reference: feed the exact meridian arc as a northing + * and demand the latitude back. Old: 4.91 um at 72.55 degrees. New: 3.2 nm. + * + *

This is the measurement the numerics reference insists on. A round trip would have said + * the old code was fine — {@code inv_mlfn} is Newton against {@code mlfn}, so the pair closes to + * 0.7 nm while both halves sit 4,920 nm from the truth. + */ + @Test + public void inverseMeridianArcBeatsTheDeprecatedNewtonLoop() { + double worstBefore = 0.0; + double worstNow = 0.0; + Legacy.Cass old = new Legacy.Cass(GRS80_A, GRS80_ES, 0.0); + for (int i = 1; i <= 890; i++) { + double lat = i / 10.0; + double y = GRS80_A * GieCase.meridianArcReference(Math.toRadians(lat), GRS80_ES); + double before = Math.abs(old.inverse(0.0, y)[1] - lat) * Math.PI / 180.0 * GRS80_A; + double now = Math.abs(GRS80.inverse(0, y).y - lat) * Math.PI / 180.0 * GRS80_A; + worstBefore = Math.max(worstBefore, before); + worstNow = Math.max(worstNow, now); + } + assertTrue("the deprecated Newton loop should be micrometres out, measured " + + worstBefore + " m", worstBefore > 4.0e-6); + assertTrue("the closed form must be nanometres, measured " + worstNow + " m", + worstNow < 20 * NM); + } + + /** + * The thread-safety property {@code SharedTransformConcurrencyTest} asserts, restated locally: + * nothing this class writes during a transform lives in a field, so repeated transforms through + * one shared object are bit-identical. + * + *

The refinement added to the inverse is the thing that could have broken it — + * {@code GenericInverse2D.solve} allocates its two scratch coordinates inside the call, and the + * {@code Forward2D} it is handed is a method reference with no captured state beyond + * {@code this}, whose only reads are {@code initialize()}-computed configuration. + */ + @Test + public void repeatedInverseThroughOneObjectIsBitIdentical() { + GieCase r = GieCase.grs80(JOHOR); + ProjCoordinate first = r.inverse(603116.703, 329668.599); + for (int i = 0; i < 200; i++) { + ProjCoordinate again = r.inverse(603116.703, 329668.599); + assertEquals(Double.doubleToRawLongBits(first.x), Double.doubleToRawLongBits(again.x)); + assertEquals(Double.doubleToRawLongBits(first.y), Double.doubleToRawLongBits(again.y)); + } + } + + /** Airy 1830 squared eccentricity, from proj4j's {@code a} and {@code rf}. */ + private static double airyEs() { + double f = 1.0 / 299.3249646; + return 2.0 * f - f * f; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/EqualAreaAzimuthalWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/EqualAreaAzimuthalWiringTest.java new file mode 100644 index 0000000..72fd0a6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/EqualAreaAzimuthalWiringTest.java @@ -0,0 +1,188 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_A; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_ES; +import static org.locationtech.proj4j.numerics.wiring.GieCase.MM; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.EqualAreaAzimuthalProjection; +import org.locationtech.proj4j.util.AuthalicLat; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * {@code EqualAreaAzimuthalProjection} re-pointed at {@link AuthalicLat}. + * + *

This class is not registered under any proj name — {@code +proj=laea} resolves to + * {@code LambertAzimuthalEqualAreaProjection} — so it cannot be driven from a proj-string and no + * corpus row reaches it. It is public API implementing the same algorithm, so it is asserted against + * its registered twin, which the corpus does reach, and against the same helper-level measurement. + * + *

The reference bar is {@code builtins.gie:3512-3534}'s {@code tolerance 0.1 mm} for + * {@code +proj=laea +ellps=GRS80}, and the movement is the one the numerics reference calls the + * largest in the numerical core: {@code ProjectionMath.authset}/{@code authlat} is third order and + * reaches 2.211 mm at latitude 18.01 degrees on GRS80, 22 times that bar. + */ +public class EqualAreaAzimuthalWiringTest { + + /** + * Both {@code lat_0} and {@code lon_0} are set explicitly. That used to be load-bearing: + * {@code AzimuthalProjection}'s no-argument constructor defaulted both to 45 degrees, so + * without the explicit {@code lon_0 = 0} the comparison against {@code +proj=laea +lon_0=0} was + * meaningless. The base now defaults both to 0, as PROJ does, and the explicit calls are kept + * so this test does not depend on that. + */ + private static EqualAreaAzimuthalProjection at(double lat0Deg) { + EqualAreaAzimuthalProjection p = new EqualAreaAzimuthalProjection(); + p.setEllipsoid(Ellipsoid.GRS80); + p.setProjectionLatitudeDegrees(lat0Deg); + p.setProjectionLongitudeDegrees(0.0); + p.initialize(); + return p; + } + + private static ProjCoordinate forward(EqualAreaAzimuthalProjection p, double lon, double lat) { + return p.project(new ProjCoordinate(lon, lat), new ProjCoordinate()); + } + + private static ProjCoordinate inverse(EqualAreaAzimuthalProjection p, double x, double y) { + return p.inverseProject(new ProjCoordinate(x, y), new ProjCoordinate()); + } + + /** + * The unregistered class must agree with the registered {@code laea} in both directions. Before + * the re-point the two differed by up to 1.6 mm, because + * {@code LambertAzimuthalEqualAreaProjection} had already been moved to the order-6 series and + * this one had not — so this assertion is also the hand-off being closed. + */ + @Test + public void agreesWithTheRegisteredLaeaToNanometres() { + for (double lat0 : new double[] {0.0, 45.0, 90.0, -90.0}) { + EqualAreaAzimuthalProjection p = at(lat0); + GieCase twin = GieCase.grs80("+proj=laea +ellps=GRS80 +lat_0=" + lat0); + for (double[] lonlat : new double[][] {{0, 0}, {2, 1}, {-3, 40}, {10, 60}, {0, 18.01}}) { + ProjCoordinate mine = forward(p, lonlat[0], lonlat[1]); + ProjCoordinate theirs = twin.forward(lonlat[0], lonlat[1]); + assertEquals("lat_0=" + lat0 + " forward easting at (" + lonlat[0] + ", " + + lonlat[1] + ")", theirs.x, mine.x, 1.0e-6); + assertEquals("lat_0=" + lat0 + " forward northing at (" + lonlat[0] + ", " + + lonlat[1] + ")", theirs.y, mine.y, 1.0e-6); + + ProjCoordinate back = inverse(p, mine.x, mine.y); + ProjCoordinate theirsBack = twin.inverse(theirs.x, theirs.y); + double dev = twin.angularDeviation(theirsBack.x, theirsBack.y, back); + assertTrue("lat_0=" + lat0 + " inverse must agree with laea to nanometres at (" + + lonlat[0] + ", " + lonlat[1] + "), differs " + dev + " m", dev < 1.0e-6); + } + } + } + + /** + * The measurement that motivates the change: the third-order series against the order-6 one, + * both handed the authalic latitude from the direct {@code phi -> xi} series. + * + *

That is not self-consistency — {@code C[xi,phi]} and {@code C[phi,xi]} are two independent + * blocks of the Maxima table in {@code 9.8.1:src/latitudes.cpp}. Deriving {@code beta} from + * {@code asin(q/qp)} instead would measure the {@code asin} form's own ill-conditioning near the + * poles rather than either series. + */ + @Test + public void thirdOrderAuthalicSeriesMissesTheBarAndTheOrderSixOneDoesNot() { + AuthalicLat authalic = new AuthalicLat(GRS80_ES); + double[] apa = ProjectionMath.authset(GRS80_ES); + + double worstBefore = 0.0; + double worstNow = 0.0; + double worstBeforeAt = Double.NaN; + for (int i = 0; i <= 9000; i++) { + double phi = Math.toRadians(i / 100.0); + double beta = authalic.forward(phi, Math.sin(phi), Math.cos(phi)); + double before = Math.abs(ProjectionMath.authlat(beta, apa) - phi) * GRS80_A; + double now = Math.abs(authalic.inverse(beta) - phi) * GRS80_A; + if (before > worstBefore) { + worstBefore = before; + worstBeforeAt = i / 100.0; + } + worstNow = Math.max(worstNow, now); + } + assertEquals("the third-order error peaks at 18.01 degrees", 18.01, worstBeforeAt, 0.02); + assertTrue("it should be 22 times the 0.1 mm bar, measured " + worstBefore + " m", + worstBefore > 2.0e-3 && worstBefore < 2.5e-3); + assertTrue("the order-6 series must be sub-nanometre, measured " + worstNow + " m", + worstNow < 1.0e-8); + } + + /** + * A round trip through this class at the 0.1 mm bar the {@code laea} rows set, sampled at the + * third-order error peak so that the old code would have failed it. + */ + @Test + public void roundTripClosesAtTheErrorPeak() { + for (double lat0 : new double[] {0.0, 45.0, 90.0, -90.0}) { + EqualAreaAzimuthalProjection p = at(lat0); + for (double lat : new double[] {18.0, 18.01, 20.8, 45.0, -70.0}) { + if (lat0 == 90.0 && lat < 0) { + continue; + } + if (lat0 == -90.0 && lat > 0) { + continue; + } + ProjCoordinate xy = forward(p, 1.0, lat); + ProjCoordinate lp = inverse(p, xy.x, xy.y); + double dev = Math.abs(lp.y - lat) * Math.PI / 180.0 * GRS80_A; + assertTrue("lat_0=" + lat0 + " round trip at latitude " + lat + " deviates " + + dev + " m", dev < 0.1 * MM); + } + } + } + + /** + * {@code laea.cpp:75} guards the polar forward with {@code q >= 1e-15}, not {@code q >= 0}. + * That matters only once {@code q} comes from {@code sin(xi) * qp}: at the pole {@code qp - q} is + * then rounding noise rather than an exact zero, and the square root of a denormal would put the + * point sub-millimetres off the origin instead of on it. + */ + @Test + public void polarForwardLandsExactlyOnTheOriginAtThePole() { + ProjCoordinate north = forward(at(90.0), 0.0, 90.0); + assertEquals("the north pole must map to the origin exactly", 0.0, north.x, 0.0); + assertEquals("the north pole must map to the origin exactly", 0.0, north.y, 0.0); + + ProjCoordinate south = forward(at(-90.0), 0.0, -90.0); + assertEquals(0.0, south.x, 0.0); + assertEquals(0.0, south.y, 0.0); + } + + /** + * {@link AuthalicLat} is immutable, so {@code clone()} no longer needs to deep-copy anything; + * the clone must still project bit-identically. + */ + @Test + public void cloneSharesTheImmutableMachineryAndProjectsIdentically() { + EqualAreaAzimuthalProjection p = at(45.0); + EqualAreaAzimuthalProjection q = (EqualAreaAzimuthalProjection) p.clone(); + ProjCoordinate a = forward(p, 2.0, 46.0); + ProjCoordinate b = forward(q, 2.0, 46.0); + assertEquals(Double.doubleToRawLongBits(a.x), Double.doubleToRawLongBits(b.x)); + assertEquals(Double.doubleToRawLongBits(a.y), Double.doubleToRawLongBits(b.y)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/EquidistantAzimuthalWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/EquidistantAzimuthalWiringTest.java new file mode 100644 index 0000000..84a42c7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/EquidistantAzimuthalWiringTest.java @@ -0,0 +1,223 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.numerics.wiring.GieCase.MM; +import static org.locationtech.proj4j.numerics.wiring.GieCase.NM; + +import org.junit.Test; +import org.locationtech.proj4j.util.MeridianArc; + +/** + * {@code EquidistantAzimuthalProjection}'s two polar aspects re-pointed at {@link MeridianArc}. + * + *

Only the polar aspects use the meridian arc; the equatorial and oblique ellipsoidal aspects go + * through the geodesic solver and are untouched, and are asserted here purely as no-movement guards. + * + *

The corpus cannot resolve this change and it is worth being explicit about why. The + * ellipsoidal polar blocks, {@code builtins.gie:216-253}, are at {@code tolerance 0.1 m} because + * their expectations come from Snyder's table 31, which is printed to 0.1 m. The 4.9 um the change is + * worth is 20,000 times inside that. So the corpus rows are asserted for no-regression and the + * old-versus-new separation is made against the independent quadrature, exactly as the numerics + * reference requires for {@code mlfn}. + */ +public class EquidistantAzimuthalWiringTest { + + /** International 1924, {@code +ellps=intl}: a = 6378388, rf = 297. */ + private static final double INTL_A = 6378388.0; + private static final double INTL_RF = 297.0; + private static final double INTL_ES = intlEs(); + + private static final GieCase NORTH = + GieCase.ellipsoid("+proj=aeqd +ellps=intl +lat_0=90", "intl", INTL_A, INTL_RF); + private static final GieCase SOUTH = + GieCase.ellipsoid("+proj=aeqd +ellps=intl +lat_0=-90", "intl", INTL_A, INTL_RF); + + /** + * {@code builtins.gie:216-234}, the northern polar ellipsoidal aspect from Snyder p. 198, + * table 31, at {@code tolerance 0.1 m} with {@code roundtrip 100} on every row. + */ + @Test + public void northPolarEllipsoidalMatchesGie() { + NORTH.expectForward(0, 90, 0, 0, 0.1); + NORTH.expectRoundtrip(0, 90, 100, 0.1); + NORTH.expectForward(0, 85, 0, -558485.4, 0.1); + NORTH.expectRoundtrip(0, 85, 100, 0.1); + NORTH.expectForward(0, 80, 0, -1116885.2, 0.1); + NORTH.expectRoundtrip(0, 80, 100, 0.1); + NORTH.expectForward(0, 70, 0, -2233100.9, 0.1); + NORTH.expectRoundtrip(0, 70, 100, 0.1); + } + + /** {@code builtins.gie:236-253}, the southern polar ellipsoidal aspect. */ + @Test + public void southPolarEllipsoidalMatchesGie() { + SOUTH.expectForward(0, -90, 0, 0, 0.1); + SOUTH.expectRoundtrip(0, -90, 100, 0.1); + SOUTH.expectForward(0, -85, 0, 558485.4, 0.1); + SOUTH.expectRoundtrip(0, -85, 100, 0.1); + SOUTH.expectForward(0, -80, 0, 1116885.2, 0.1); + SOUTH.expectRoundtrip(0, -80, 100, 0.1); + SOUTH.expectForward(0, -70, 0, 2233100.9, 0.1); + SOUTH.expectRoundtrip(0, -70, 100, 0.1); + } + + /** + * The polar forward against the independent quadrature. At longitude 0 the northing is + * {@code -(Mp - M(phi))}, so with {@code Mp} the quarter meridian this isolates the arc. + * + *

Before: up to 4.92 um. After: bounded by the reference's own ~1 nm. + */ + @Test + public void polarForwardBeatsTheDeprecatedSeries() { + Legacy.AeqdPolar old = new Legacy.AeqdPolar(INTL_A, INTL_ES, true); + double quarter = INTL_A * GieCase.meridianArcReference(Math.PI / 2.0, INTL_ES); + + double worstBefore = 0.0; + double worstNow = 0.0; + double worstBeforeAt = Double.NaN; + for (int i = 0; i <= 900; i++) { + double lat = i / 10.0; + double arc = INTL_A * GieCase.meridianArcReference(Math.toRadians(lat), INTL_ES); + double reference = -(quarter - arc); + double before = Math.abs(old.forward(0.0, lat)[1] - reference); + double now = Math.abs(NORTH.forward(0, lat).y - reference); + if (before > worstBefore) { + worstBefore = before; + worstBeforeAt = lat; + } + worstNow = Math.max(worstNow, now); + } + assertTrue("the es-series error should peak in the sixties or seventies, at " + worstBeforeAt, + worstBeforeAt > 55.0 && worstBeforeAt < 85.0); + assertTrue("the es-series should be micrometres out at the peak, measured " + + worstBefore + " m", worstBefore > 3.0e-6); + assertTrue("the n-series must be inside the quadrature's own accuracy, measured " + + worstNow + " m", worstNow < 20 * NM); + } + + /** + * The polar inverse against the same reference: feed the exact northing for a latitude and + * demand it back. The old path was a ten-step Newton loop with a data-dependent trip count; + * this one is closed form. + */ + @Test + public void polarInverseBeatsTheDeprecatedNewtonLoop() { + Legacy.AeqdPolar old = new Legacy.AeqdPolar(INTL_A, INTL_ES, true); + double quarter = INTL_A * GieCase.meridianArcReference(Math.PI / 2.0, INTL_ES); + + double worstBefore = 0.0; + double worstNow = 0.0; + for (int i = 0; i <= 890; i++) { + double lat = i / 10.0; + double arc = INTL_A * GieCase.meridianArcReference(Math.toRadians(lat), INTL_ES); + double y = -(quarter - arc); + double before = Math.abs(old.latitude(0.0, y) - lat) * Math.PI / 180.0 * INTL_A; + double now = Math.abs(NORTH.inverse(0, y).y - lat) * Math.PI / 180.0 * INTL_A; + worstBefore = Math.max(worstBefore, before); + worstNow = Math.max(worstNow, now); + } + assertTrue("the deprecated Newton loop should be micrometres out, measured " + + worstBefore + " m", worstBefore > 3.0e-6); + assertTrue("the closed form must be nanometres, measured " + worstNow + " m", + worstNow < 50 * NM); + } + + /** + * {@code builtins.gie:139-158}, the equatorial ellipsoidal aspect at {@code tolerance 0.1 mm} + * with {@code roundtrip 100}. This goes through the geodesic solver and does not touch the + * meridian arc; asserted because the file's {@code initialize()} was restructured. + */ + @Test + public void equatorialEllipsoidalIsUnmoved() { + GieCase r = GieCase.grs80("+proj=aeqd +ellps=GRS80 +lat_0=0"); + r.expectForward(0, 90, 0, 10001965.7292, 0.1 * MM); + r.expectForward(0, 0, 0, 0, 0.1 * MM); + r.expectForward(90, 0, 10018754.1714, 0, 0.1 * MM); + r.expectForward(45, 45, 3860398.3783, 5430089.0490, 0.1 * MM); + r.expectRoundtrip(45, 45, 100, 0.1 * MM); + r.expectRoundtrip(0, 0, 100, 0.1 * MM); + } + + /** + * {@code builtins.gie:109-131}, the spherical equatorial aspect from Snyder pp. 196-197, + * table 30, {@code tolerance 0.1 mm} with {@code roundtrip 100}. Spherical, so no series. + */ + @Test + public void sphericalEquatorialIsUnmoved() { + GieCase r = GieCase.sphere("+proj=aeqd +R=1 +lat_0=0", 1.0); + r.expectForward(0, 0, 0, 0, 0.1 * MM); + r.expectForward(0, 90, 0, 1.57080, 0.1 * MM); + r.expectForward(10, 80, 0.04281, 1.39829, 0.1 * MM); + r.expectForward(40, 30, 0.62896, 0.56493, 0.1 * MM); + r.expectForward(90, 0, 1.57080, 0, 0.1 * MM); + } + + /** + * {@code builtins.gie:340}, the oblique ellipsoidal aspect. Geodesic-solver based, so this is a + * no-movement guard on {@code initialize()}'s restructuring. + */ + @Test + public void obliqueEllipsoidalIsUnmoved() { + GieCase r = GieCase.grs80("+proj=aeqd +ellps=GRS80 +lat_0=45"); + r.expectRoundtrip(2, 46, 100, 0.1 * MM); + r.expectRoundtrip(-2, 44, 100, 0.1 * MM); + } + + /** + * {@code builtins.gie:160-181}: the near-{@code lat_0} rows on a perfect sphere and on an + * ellipsoid one micrometre away from one, at {@code tolerance 1 mm} with {@code roundtrip 1}. + * The pair exists upstream to catch a discontinuity between the two code paths at + * {@code es -> 0}. + * + *

The spherical-path rows now pass, and this assertion has been inverted. It used to + * record a measured 0.147 m round-trip deviation against the block's 1 mm bar as a pre-existing + * defect, with an explicit note to tighten it if the defect was ever fixed. It has been: the + * cause was two deviations from {@code aeqd.cpp} in the spherical oblique branch, both + * now corrected — {@code TOL} was {@code 1e-8} where upstream is {@code 1e-14}, and inside that + * band the branch returned {@code (0, 0)} where {@code aeqd.cpp:155} and {@code :182} hand the + * point to the geodesic forward ({@code return aeqd_e_forward(lp, P)}). Between them + * they put a dead zone of radius {@code acos(1 - 1e-8)}, about 900 m, around the centre of + * every spherical oblique or equatorial {@code aeqd}. The assertion is now the corpus's own + * 1 mm bar. + * + *

The near-sphere ellipsoid of the second block goes through the geodesic solver and + * does close, which is the more interesting half of upstream's pair. + */ + @Test + public void nearlySphericalPairIsUnmoved() { + GieCase s = new GieCase( + "+proj=aeqd +a=6371008.771415 +b=6371008.771415 +lat_0=30.2345 +lon_0=-120.2345", + "+a=6371008.771415 +b=6371008.771415", 6371008.771415, 0.0); + s.expectRoundtrip(-120.234501, 30.234501, 1, 1 * MM); + s.expectRoundtrip(-120.2345, 30.2345, 1, 1 * MM); + + GieCase e = new GieCase( + "+proj=aeqd +a=6371008.771415 +b=6371008.771414 +lat_0=30.2345 +lon_0=-120.2345", + "+a=6371008.771415 +b=6371008.771414", 6371008.771415, + (6371008.771415 - 6371008.771414) / 6371008.771415); + e.expectRoundtrip(-120.234501, 30.234501, 1, 1 * MM); + e.expectRoundtrip(-120.2345, 30.2345, 1, 1 * MM); + } + + /** International 1924 squared eccentricity, from {@code a} and {@code rf}. */ + private static double intlEs() { + double f = 1.0 / INTL_RF; + return 2.0 * f - f * f; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/GieCase.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/GieCase.java new file mode 100644 index 0000000..3c6e54d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/GieCase.java @@ -0,0 +1,257 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertTrue; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.gie.GieComparator; + +/** + * Evaluates one {@code accept}/{@code expect} pair from the vendored conformance corpus against + * proj4j, using gie's own metric. + * + *

Every expectation in this package is read out of + * {@code conformance/src/test/resources/gie/builtins.gie} or + * {@code conformance/src/test/resources/gigs/{5108,5112}.gie} — byte-identical copies of + * {@code 9.8.1:test/gie/builtins.gie} and {@code 9.8.1:test/gigs/*.gie} — and every test method + * names the line it came from. A value that traces to upstream is evidence; a value that traces to + * a previous proj4j run is not. + * + *

The metric matters ({@code 9.8.1:src/apps/gie.cpp:1120-1165} picks among four): + * a forward row's output is projected metres, so the deviation is Euclidean + * ({@link GieComparator#xyDist}); an inverse row's output is degrees, so it is the geodesic + * distance on the ellipsoid under test ({@link GieComparator#lpDist} on radians). Applying the + * angular scale to a projected target would inflate the number by about 111,319. + * + *

This is a near-duplicate of {@code org.locationtech.proj4j.numerics.GieRow}, which is + * package-private in its own package and therefore not reachable from here. + */ +final class GieCase { + + /** One nanometre in metres — the {@code tolerance 50 nm} rows. */ + static final double NM = 1.0e-9; + + /** One millimetre in metres — the common {@code tolerance 0.1 mm} rows. */ + static final double MM = 1.0e-3; + + /** GRS80, as PROJ derives it from {@code a} and {@code rf}. */ + static final double GRS80_A = 6378137.0; + static final double GRS80_RF = 298.257222101; + static final double GRS80_ES = 0.006694380022900787; + static final double GRS80_E = Math.sqrt(GRS80_ES); + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + private final CoordinateReferenceSystem geographic; + private final CoordinateReferenceSystem projected; + private final GieComparator comparator; + private final String operation; + + /** + * @param operation the {@code operation} line's proj-string, minus the keyword + * @param ellipsoid the same ellipsoid or radius parameters, for the paired + * {@code +proj=longlat} side and for the geodesic metric + * @param a the semi-major axis the metric should use + * @param f the flattening the metric should use; {@code 0} for a sphere + */ + GieCase(String operation, String ellipsoid, double a, double f) { + this.operation = operation; + this.geographic = CRS.createFromParameters("gie-geog", + "+proj=longlat " + ellipsoid + " +no_defs"); + this.projected = CRS.createFromParameters("gie-proj", operation + " +no_defs"); + this.comparator = GieComparator.forEllipsoid(a, f); + } + + /** A row on {@code +ellps=GRS80}. */ + static GieCase grs80(String operation) { + return new GieCase(operation, "+ellps=GRS80", GRS80_A, 1.0 / GRS80_RF); + } + + /** A row on a sphere, {@code +R=}. */ + static GieCase sphere(String operation, double radius) { + return new GieCase(operation, "+R=" + radius, radius, 0.0); + } + + /** A row on an arbitrary named ellipsoid, e.g. {@code +ellps=krass}. */ + static GieCase ellipsoid(String operation, String ellps, double a, double rf) { + return new GieCase(operation, "+ellps=" + ellps, a, 1.0 / rf); + } + + /** The forward direction: degrees in, projected units out. */ + ProjCoordinate forward(double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(geographic, projected) + .transform(new ProjCoordinate(lon, lat), out); + return out; + } + + /** The inverse direction: projected units in, degrees out. */ + ProjCoordinate inverse(double x, double y) { + ProjCoordinate out = new ProjCoordinate(); + TRANSFORMS.createTransform(projected, geographic) + .transform(new ProjCoordinate(x, y), out); + return out; + } + + /** The Euclidean deviation of a forward result, matching gie's {@code proj_xy_dist} branch. */ + double forwardDeviation(double lon, double lat, double x, double y) { + ProjCoordinate got = forward(lon, lat); + return GieComparator.xyDist(new double[] {x, y, 0, 0}, + new double[] {got.x, got.y, 0, 0}); + } + + /** The geodesic deviation of an inverse result, matching gie's {@code proj_lp_dist} branch. */ + double inverseDeviation(double x, double y, double lon, double lat) { + return angularDeviation(lon, lat, inverse(x, y)); + } + + /** Asserts a forward {@code accept}/{@code expect} pair. */ + void expectForward(double lon, double lat, double x, double y, double toleranceMetres) { + ProjCoordinate got = forward(lon, lat); + double d = GieComparator.xyDist(new double[] {x, y, 0, 0}, + new double[] {got.x, got.y, 0, 0}); + assertTrue(describe("forward", lon, lat, x, y, got, d, toleranceMetres), + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** Asserts an inverse {@code accept}/{@code expect} pair. */ + void expectInverse(double x, double y, double lon, double lat, double toleranceMetres) { + ProjCoordinate got = inverse(x, y); + double d = angularDeviation(lon, lat, got); + assertTrue(describe("inverse", x, y, lon, lat, got, d, toleranceMetres), + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** The geodesic deviation, in metres, between an expected lon/lat in degrees and a result. */ + double angularDeviation(double lon, double lat, ProjCoordinate got) { + return comparator.lpDist( + new double[] {Math.toRadians(lon), Math.toRadians(lat), 0, 0}, + new double[] {Math.toRadians(got.x), Math.toRadians(got.y), 0, 0}); + } + + /** gie's {@code roundtrip n} residual, in metres: n forward/inverse cycles from the input. */ + double roundtripDeviation(double lon, double lat, int trips) { + double curLon = lon; + double curLat = lat; + for (int i = 0; i < trips; i++) { + ProjCoordinate xy = forward(curLon, curLat); + ProjCoordinate lp = inverse(xy.x, xy.y); + curLon = lp.x; + curLat = lp.y; + } + return angularDeviation(lon, lat, new ProjCoordinate(curLon, curLat)); + } + + /** gie's {@code roundtrip n}, asserted. */ + void expectRoundtrip(double lon, double lat, int trips, double toleranceMetres) { + double d = roundtripDeviation(lon, lat, trips); + assertTrue(operation + " roundtrip " + trips + " from (" + lon + ", " + lat + + ") deviates " + d + " m against a tolerance of " + toleranceMetres + " m", + GieComparator.withinTolerance(d, toleranceMetres)); + } + + /** + * Asserts that the new code path is inside {@code toleranceMetres} of the corpus value + * and strictly closer to it than the code path it replaced, so that the improvement is + * evidenced rather than described. + * + * @param label what is being measured, for the failure message + * @param corpusValue the deviation the pre-change path produced against the same row + * @param nowValue the deviation the current path produces + */ + static void assertStrictlyBetter(String label, double corpusValue, double nowValue, + double toleranceMetres) { + assertTrue(label + ": the current path deviates " + nowValue + " m, outside the corpus " + + "tolerance of " + toleranceMetres + " m", + GieComparator.withinTolerance(nowValue, toleranceMetres)); + assertTrue(label + ": the current path deviates " + nowValue + " m but the path it " + + "replaced deviated " + corpusValue + " m -- no improvement, so there was " + + "nothing to fix or the measurement is wrong", + nowValue < corpusValue); + } + + private String describe(String direction, double in0, double in1, double e0, double e1, + ProjCoordinate got, double d, double tol) { + return operation + " " + direction + " of (" + in0 + ", " + in1 + "): expected (" + + e0 + ", " + e1 + ") got (" + got.x + ", " + got.y + "), deviation " + d + + " m against a tolerance of " + tol + " m"; + } + + // ---- an independent meridian-arc reference ------------------------------------------ + + /** 10-point Gauss-Legendre nodes on [-1, 1]. */ + private static final double[] GLX = { + -0.9739065285171717, -0.8650633666889845, -0.6794095682990244, + -0.4333953941292472, -0.1488743389816312, 0.1488743389816312, + 0.4333953941292472, 0.6794095682990244, 0.8650633666889845, + 0.9739065285171717, + }; + + /** The matching weights. */ + private static final double[] GLW = { + 0.0666713443086881, 0.1494513491505806, 0.2190863625159820, + 0.2692667193099963, 0.2955242247147529, 0.2955242247147529, + 0.2692667193099963, 0.2190863625159820, 0.1494513491505806, + 0.0666713443086881, + }; + + /** + * The meridian arc from the equator to {@code phi}, divided by the semi-major axis: + * {@code integral(0, phi) (1 - es) / (1 - es sin^2 t)^(3/2) dt}, by 64-panel 10-point + * Gauss-Legendre with Neumaier compensated summation. + * + *

Why this and not a round trip. {@code ProjectionMath.inv_mlfn} is Newton's method + * run against {@code ProjectionMath.mlfn} itself, so the pair is self-consistent by + * construction: on GRS80 its round trip closes to 0.7 nm while both halves sit 4,920 nm + * from the truth. Any old-versus-new claim about the meridian arc has to be made against + * something that shares no series, no coefficient and no algorithm with either + * implementation. This quadrature is good to about 1 nm on the ground, which separates 1 nm + * from 4,920 nm but is not itself evidence for "under 1 nm". + * + *

It is duplicated from {@code org.locationtech.proj4j.util.NumericAssert}, which is + * package-private in that package. + */ + static double meridianArcReference(double phi, double es) { + final int panels = 64; + final double h = phi / panels; + final double hw = 0.5 * h; + double sum = 0.0; + double comp = 0.0; + for (int p = 0; p < panels; p++) { + final double c = p * h + hw; + for (int i = 0; i < GLX.length; i++) { + final double t = c + hw * GLX[i]; + final double st = Math.sin(t); + final double d = 1.0 - es * st * st; + final double term = hw * GLW[i] * (1.0 - es) / (d * Math.sqrt(d)); + final double s = sum + term; + if (Math.abs(sum) >= Math.abs(term)) { + comp += (sum - s) + term; + } else { + comp += (term - s) + sum; + } + sum = s; + } + } + return sum + comp; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/LambertConformalConicWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/LambertConformalConicWiringTest.java new file mode 100644 index 0000000..782fa05 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/LambertConformalConicWiringTest.java @@ -0,0 +1,245 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_A; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_ES; +import static org.locationtech.proj4j.numerics.wiring.GieCase.MM; +import static org.locationtech.proj4j.numerics.wiring.GieCase.NM; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.ConformalLat; + +/** + * {@code LambertConformalConicProjection} re-pointed at {@link ConformalLat}. + * + *

A note on what the corpus can and cannot show here. {@code lcc}'s inverse expectations + * are printed to nine decimal places of a degree, and one unit in that last place is + * {@code 1.11e-4 m} — larger than the block's own {@code 0.1 mm} tolerance. So the residual against + * an {@code lcc} inverse row is dominated by the corpus's print precision (23 um on + * {@code builtins.gie:3767}) and both the old and the new path sit inside the bar. The corpus rows + * are therefore asserted as no-regression checks, and the old-versus-new separation is made where + * it is real: round-trip closure, which the old {@code phi2} cannot deliver because it stops + * at {@code |dphi| <= 1e-10} radians — 0.64 mm on the ground — regardless of how much further it + * would have to go. + */ +public class LambertConformalConicWiringTest { + + /** {@code builtins.gie:3750}. */ + private static final String OP = "+proj=lcc +ellps=GRS80 +lat_1=0.5 +lat_2=2"; + + private static final GieCase TWO_SP = GieCase.grs80(OP); + + /** {@code builtins.gie:3755-3763}, {@code tolerance 0.1 mm}. */ + @Test + public void twoStandardParallelForwardMatchesGie() { + TWO_SP.expectForward(2, 1, 222588.439735968, 110660.533870800, 0.1 * MM); + TWO_SP.expectForward(2, -1, 222756.879700279, -110532.797660827, 0.1 * MM); + TWO_SP.expectForward(-2, 1, -222588.439735968, 110660.533870800, 0.1 * MM); + TWO_SP.expectForward(-2, -1, -222756.879700279, -110532.797660827, 0.1 * MM); + } + + /** {@code builtins.gie:3765-3773}, {@code tolerance 0.1 mm}. */ + @Test + public void twoStandardParallelInverseMatchesGie() { + TWO_SP.expectInverse(200, 100, 0.001796359, 0.000904232, 0.1 * MM); + TWO_SP.expectInverse(200, -100, 0.001796358, -0.000904233, 0.1 * MM); + TWO_SP.expectInverse(-200, 100, -0.001796359, 0.000904232, 0.1 * MM); + TWO_SP.expectInverse(-200, -100, -0.001796358, -0.000904233, 0.1 * MM); + } + + /** + * {@code builtins.gie:3777-3800}, the Lambert Conformal Conic 2SP Michigan block with + * {@code +k_0=1.0000382}. Included because {@code k0} multiplies the whole coordinate and so + * would expose any misplacement of the scale factor introduced while touching this file. + */ + @Test + public void michiganVariantMatchesGie() { + GieCase r = GieCase.grs80("+proj=lcc +ellps=GRS80 +lat_1=0.5 +lat_2=2 +k_0=1.0000382"); + r.expectForward(2, 1, 222596.942614366, 110664.761103214, 0.1 * MM); + r.expectForward(2, -1, 222765.389013083, -110537.020013748, 0.1 * MM); + r.expectForward(-2, 1, -222596.942614366, 110664.761103214, 0.1 * MM); + r.expectForward(-2, -1, -222765.389013083, -110537.020013748, 0.1 * MM); + r.expectInverse(200, 100, 0.001796291, 0.000904198, 0.1 * MM); + r.expectInverse(200, -100, 0.001796290, -0.000904199, 0.1 * MM); + } + + /** {@code builtins.gie:3829-3840}, a widely-separated pair of standard parallels on GRS80. */ + @Test + public void widelySeparatedParallelsMatchGie() { + GieCase r = GieCase.grs80("+proj=lcc +ellps=GRS80 +lat_1=30 +lat_2=45"); + r.expectForward(1, 2, 131833.493971117, 265456.213515346, 0.1 * MM); + r.expectForward(1, -2, 137536.205750651, -269686.591917190, 0.1 * MM); + r.expectForward(-1, 2, -131833.493971117, 265456.213515346, 0.1 * MM); + r.expectForward(-1, -2, -137536.205750651, -269686.591917190, 0.1 * MM); + } + + /** + * {@code builtins.gie:3802-3809}: {@code accept 0 90 / expect 0 292411117.537843227} and + * {@code accept 0 0 / expect 0 0}, both at {@code tolerance 0.1 mm}. The pole row takes the + * {@code |phi| - pi/2 < 1e-10} branch that bypasses {@code tsfn} entirely, and the equator row + * pins {@code tsfn} at the value where the old helper was one ulp short. + */ + @Test + public void poleAndEquatorRowsMatchGie() { + TWO_SP.expectForward(0, 90, 0, 292411117.537843227, 0.1 * MM); + TWO_SP.expectForward(0, 0, 0, 0, 0.1 * MM); + } + + /** + * The old-versus-new measurement, made where the corpus rows cannot make it: both paths are + * driven at the corpus rows and their round-trip residual compared. + * + *

{@code ProjectionMath.phi2} exits on {@code |dphi| <= 1e-10} radians and returns whatever + * it has, so composing the exact forward with it does not close; the Newton-on-{@code tau} + * formulation converges to full double precision, and the composition closes to nanometres. + */ + @Test + public void roundTripClosureIsStrictlyBetterThanTheDeprecatedPath() { + // lat_0 is 0, not 0.5: lcc.cpp:85-90 falls lat_0 back to lat_1 only when lat_2 is absent. + Legacy.Lcc old = new Legacy.Lcc(GRS80_A, GRS80_ES, 0.5, 2.0, 0.0, 1.0); + + double worstBefore = 0.0; + double worstNow = 0.0; + for (double lat : new double[] {0.000904232, 0.5, 1, 2, 2.8, 10, 30, 60, 85}) { + // The old path, one cycle: its own forward, then its own inverse. + double[] xy = old.forward(2.0, lat); + double[] lp = old.inverse(xy[0], xy[1]); + double before = TWO_SP.angularDeviation(2.0, lat, new ProjCoordinate(lp[0], lp[1])); + double now = TWO_SP.roundtripDeviation(2.0, lat, 1); + worstBefore = Math.max(worstBefore, before); + worstNow = Math.max(worstNow, now); + } + assertTrue("the deprecated phi2 stops at 1e-10 rad, so an lcc round trip should not close " + + "below a micrometre; measured " + worstBefore + " m", + worstBefore > 1.0e-6); + assertTrue("the Karney formulation must close to nanometres, measured " + worstNow + " m", + worstNow < 100 * NM); + GieCase.assertStrictlyBetter("lcc round-trip closure over 0.0009 to 85 degrees", + worstBefore, worstNow, 0.1 * MM); + } + + /** + * {@code roundtrip 100} is not asserted for {@code lcc} anywhere in {@code builtins.gie}, so + * this is proj4j's own bar: 100 cycles must not drift past the 0.1 mm the point rows use. + */ + @Test + public void hundredCycleRoundTripDoesNotDrift() { + for (double lat : new double[] {0.000904232, 1, 2.8, 30, 60, 85}) { + TWO_SP.expectRoundtrip(2, lat, 100, 0.1 * MM); + TWO_SP.expectRoundtrip(-2, lat, 100, 0.1 * MM); + } + } + + /** + * {@code builtins.gie:3812-3826} and {@code :3843-3862}, the spherical blocks. The spherical + * branch does not call {@code tsfn} or {@code phi2} at all, so these are pure no-movement + * guards on a file that was edited in five places. + * + *

Written with the corpus's literal {@code +ellps=sphere}, which only became usable once + * {@code Ellipsoid.SPHERE} was corrected from {@code 6371008.7714} — the GRS80 authalic + * radius — to {@code 6370997.0}, PROJ's "Normal Sphere" ({@code 9.8.1:src/ellps.cpp:55}). That + * is 1.848 ppm, or 0.54 m at the easting below, against a 0.1 mm bar: no projection + * formula could absorb it, and it presented as a maths error in whatever projection was under + * test. These rows are asserted here because they are among the six {@code +ellps=sphere} + * operations in {@code builtins.gie} that belong to {@code lcc}. + * + *

The other two of those six, {@code :3901} and {@code :3906}, are {@code +lat_1=91} and + * {@code +lat_2=91} setup-rejection rows. They are expected to fail and must keep + * failing, so they are asserted as rejections rather than as coordinates. + */ + @Test + public void sphericalBranchIsUnmoved() { + GieCase r = new GieCase("+proj=lcc +ellps=sphere +lat_1=30 +lat_2=40", "+ellps=sphere", + 6370997.0, 0.0); + r.expectForward(1, 2, 129391.909521100, 262101.674176860, 0.1 * MM); + r.expectForward(0, 0, 0, 0, 0.1 * MM); + r.expectInverse(129391.909521100, 262101.674176860, 1, 2, 0.1 * MM); + r.expectInverse(0, 0, 0, 0, 0.1 * MM); + + GieCase r2 = new GieCase("+proj=lcc +ellps=sphere +lat_1=30 +lat_2=45", "+ellps=sphere", + 6370997.0, 0.0); + r2.expectForward(1, 2, 131824.206082557, 267239.875053699, 0.1 * MM); + r2.expectForward(-1, -2, -137565.475967350, -271546.945608449, 0.1 * MM); + r2.expectForward(1, -2, 137565.475967350, -271546.945608449, 0.1 * MM); + r2.expectForward(-1, 2, -131824.206082557, 267239.875053699, 0.1 * MM); + r2.expectInverse(131824.206082557, 267239.875053699, 1, 2, 0.1 * MM); + } + + /** + * The eight {@code expect failure errno invalid_op_illegal_arg_value} rows at + * {@code builtins.gie:3862}, {@code :3869}, {@code :3876}, {@code :3881}, {@code :3886}, + * {@code :3891}, {@code :3896}, {@code :3901} and {@code :3906}. + * + *

proj4j accepted every one of them and went on to produce coordinates from a cone + * constant that was infinite, NaN or exactly zero — non-negotiably wrong, because a failure must + * not be expressed as a plausible coordinate. {@code lcc.cpp:100-110} rejects a standard parallel + * at or beyond the pole, and {@code :122-138}/{@code :154-161} reject a cone constant that comes + * out exactly zero. + * + *

{@code errno} is checked, not just the exception type: gie names + * {@code invalid_op_illegal_arg_value}, which is + * {@link ErrorCause#INVALID_PARAM_VALUE}. + */ + @Test + public void degenerateSetupsAreRejectedWithTheErrnoGieNames() { + String[] rows = { + "+proj=lcc +a=9999999 +b=.9 +lat_2=1", // :3862 + "+proj=lcc +lat_1=2D32 +lat_2=0 +a=6378137 +b=0.2", // :3869 + "+proj=lcc +ellps=GRS80 +lat_1=0 +lat_2=90", // :3876 + "+proj=lcc +ellps=GRS80 +lat_1=90 +lat_2=0", // :3881 + "+proj=lcc +ellps=GRS80 +lat_1=90 +lat_2=90", // :3886 + "+proj=lcc +ellps=sphere +lat_1=0 +lat_2=90", // :3891 + "+proj=lcc +ellps=sphere +lat_1=90 +lat_2=0", // :3896 + "+proj=lcc +ellps=sphere +lat_1=91", // :3901 + "+proj=lcc +ellps=sphere +lat_2=91", // :3906 + }; + CRSFactory factory = new CRSFactory(); + for (String row : rows) { + try { + factory.createFromParameters("gie", row + " +no_defs"); + fail("gie expects this setup to fail: " + row); + } catch (InvalidValueException e) { + assertTrue(row + " must report invalid_op_illegal_arg_value, reported " + + e.cause(), + e.cause() == ErrorCause.INVALID_PARAM_VALUE); + } + } + } + + /** + * The counterpart of the previous test, and the reason it is safe: the parallels the corpus and + * the bundled tables actually use must still be accepted. All 1,885 {@code +proj=lcc} + * definitions in the EPSG, ESRI and NAD tables have {@code |lat_1| < 90} and + * {@code |lat_2| < 90}, so the new guards cannot reach them; these are the extremes. + */ + @Test + public void parallelsShortOfThePoleAreStillAccepted() { + GieCase.grs80("+proj=lcc +ellps=GRS80 +lat_1=89.999 +lat_2=1").expectRoundtrip(0, 45, 1, + 0.1 * MM); + GieCase.grs80("+proj=lcc +ellps=GRS80 +lat_1=-89.999 +lat_2=-1").expectRoundtrip(0, -45, 1, + 0.1 * MM); + GieCase.grs80("+proj=lcc +ellps=GRS80 +lat_1=1e-9 +lat_2=45").expectRoundtrip(0, 30, 1, + 0.1 * MM); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/Legacy.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/Legacy.java new file mode 100644 index 0000000..4b84ac6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/Legacy.java @@ -0,0 +1,289 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The projection arithmetic as it was before this change, transcribed verbatim from the + * seven files re-pointed at the Karney numerical core. + * + *

It exists so that the old-versus-new claims in this package are measurements against + * the same corpus rows the new code is asserted on, rather than assertions about a state of the tree + * that no longer exists. Each method names the file and the site it reproduces, and each calls the + * deprecated {@code ProjectionMath} helper the old code called — those helpers are still present and + * still public, which is exactly what makes this possible. + * + *

Nothing here is a re-derivation. Where the old code had a bug (Cassini's {@code C1 -}, Bonne's + * hard-wired {@code phi1}), the bug is reproduced, because the point is to measure what users got. + */ +final class Legacy { + + private Legacy() { + } + + private static final double HALFPI = ProjectionMath.HALFPI; + + // ---- merc (MercatorProjection.java:38,48 before the change) ------------------------- + + /** + * The old ellipsoidal Mercator forward northing, in metres: + * {@code -k0 * log(ProjectionMath.tsfn(phi, sin phi, e))} scaled by {@code a}. + * + *

{@code k0} was whatever {@code +k_0} said, because {@code +lat_ts} was read into + * {@link org.locationtech.proj4j.proj.Projection#trueScaleLatitude} and then never used. + */ + static double mercNorthing(double phiDeg, double a, double es, double k0) { + double phi = Math.toRadians(phiDeg); + double e = Math.sqrt(es); + return -k0 * a * Math.log(ProjectionMath.tsfn(phi, Math.sin(phi), e)); + } + + /** The old ellipsoidal Mercator forward easting, in metres. */ + static double mercEasting(double lamDeg, double a, double k0) { + return k0 * a * Math.toRadians(lamDeg); + } + + /** + * The old ellipsoidal Mercator inverse latitude, in degrees: + * {@code ProjectionMath.phi2(exp(-y / k0), e)} on the northing normalised by {@code a}. + */ + static double mercLatitude(double yMetres, double a, double es, double k0) { + double e = Math.sqrt(es); + return Math.toDegrees(ProjectionMath.phi2(Math.exp(-yMetres / (k0 * a)), e)); + } + + // ---- lcc (LambertConformalConicProjection.java:63,85,123,127,131) ------------------- + + /** + * The old {@code lcc}, as a whole: {@code initialize()} plus {@code project()} plus + * {@code projectInverse()}, every {@code tsfn} and {@code phi2} being the deprecated one. + * + *

The cone constant has to be recomputed with the old {@code tsfn} too — {@code n} comes + * from {@code log(ml1/ml2)} of two of its values — or the comparison would mix a new + * initialisation with an old inverse and measure neither. + */ + static final class Lcc { + private final double n; + private final double c; + private final double rho0; + private final double e; + private final double es; + private final double a; + private final double k0; + + /** + * @param lat0Deg the latitude of origin after PROJ's defaulting rule + * ({@code lcc.cpp:85-90}): {@code lat_0} falls back to {@code lat_1} only + * when {@code lat_2} is absent. For + * {@code +lat_1=0.5 +lat_2=2} with no {@code +lat_0} it is therefore + * 0, not 0.5, and getting that wrong moves {@code rho0} and with it + * every coordinate. + */ + Lcc(double a, double es, double lat1Deg, double lat2Deg, double lat0Deg, double k0) { + this.a = a; + this.es = es; + this.e = Math.sqrt(es); + this.k0 = k0; + double phi1 = Math.toRadians(lat1Deg); + double phi2 = Math.toRadians(lat2Deg); + double phi0 = Math.toRadians(lat0Deg); + double sinphi = Math.sin(phi1); + double cosphi = Math.cos(phi1); + double nn = sinphi; + boolean secant = Math.abs(phi1 - phi2) >= 1e-10; + double m1 = ProjectionMath.msfn(sinphi, cosphi, es); + double ml1 = ProjectionMath.tsfn(phi1, sinphi, e); + if (secant) { + sinphi = Math.sin(phi2); + nn = Math.log(m1 / ProjectionMath.msfn(sinphi, Math.cos(phi2), es)); + nn /= Math.log(ml1 / ProjectionMath.tsfn(phi2, sinphi, e)); + } + this.n = nn; + double r0 = m1 * Math.pow(ml1, -nn) / nn; + this.c = r0; + this.rho0 = r0 * ((Math.abs(Math.abs(phi0) - HALFPI) < 1e-10) ? 0. + : Math.pow(ProjectionMath.tsfn(phi0, Math.sin(phi0), e), nn)); + } + + /** {@code (easting, northing)} in metres for a longitude offset and latitude in degrees. */ + double[] forward(double lamDeg, double phiDeg) { + double lam = Math.toRadians(lamDeg); + double phi = Math.toRadians(phiDeg); + double rho; + if (Math.abs(Math.abs(phi) - HALFPI) < 1e-10) { + rho = 0.0; + } else { + rho = c * Math.pow(ProjectionMath.tsfn(phi, Math.sin(phi), e), n); + } + lam *= n; + return new double[] {a * k0 * (rho * Math.sin(lam)), + a * k0 * (rho0 - rho * Math.cos(lam))}; + } + + /** {@code (longitude offset, latitude)} in degrees for an easting and northing in metres. */ + double[] inverse(double xMetres, double yMetres) { + double x = xMetres / a / k0; + double y = rho0 - yMetres / a / k0; + double rho = ProjectionMath.distance(x, y); + if (rho == 0.0) { + return new double[] {0.0, n > 0.0 ? 90.0 : -90.0}; + } + if (n < 0.0) { + rho = -rho; + x = -x; + y = -y; + } + double phi = ProjectionMath.phi2(Math.pow(rho / c, 1.0 / n), e); + return new double[] {Math.toDegrees(Math.atan2(x, y) / n), Math.toDegrees(phi)}; + } + } + + // ---- cass (CassiniProjection.java:62,84,103,105) ------------------------------------ + + private static final double C1 = .16666666666666666666; + private static final double C2 = .00833333333333333333; + private static final double C3 = .04166666666666666666; + private static final double C4 = .33333333333333333333; + private static final double C5 = .06666666666666666666; + + /** + * The old ellipsoidal Cassini: {@code enfn}/{@code mlfn}/{@code inv_mlfn}, the {@code C1 -} + * easting sign, and no {@code pj_generic_inverse_2d} refinement. + */ + static final class Cass { + private final double[] en; + private final double m0; + private final double es; + private final double a; + + Cass(double a, double es, double lat0Deg) { + this.a = a; + this.es = es; + this.en = ProjectionMath.enfn(es); + double phi0 = Math.toRadians(lat0Deg); + this.m0 = ProjectionMath.mlfn(phi0, Math.sin(phi0), Math.cos(phi0), en); + } + + double[] forward(double lamDeg, double phiDeg) { + double lplam = Math.toRadians(lamDeg); + double lpphi = Math.toRadians(phiDeg); + double n = Math.sin(lpphi); + double c = Math.cos(lpphi); + double y = ProjectionMath.mlfn(lpphi, n, c, en); + n = 1. / Math.sqrt(1. - es * n * n); + double tn = Math.tan(lpphi); + double t = tn * tn; + double a1 = lplam * c; + c *= es * c / (1 - es); + double a2 = a1 * a1; + // The sign upstream fixed in 78d89828. + double x = n * a1 * (1. - a2 * t * (C1 - (8. - t + 8. * c) * a2 * C2)); + y -= m0 - n * tn * a2 * (.5 + (5. - t + 6. * c) * a2 * C3); + return new double[] {a * x, a * y}; + } + + double[] inverse(double xMetres, double yMetres) { + double xyx = xMetres / a; + double xyy = yMetres / a; + double ph1 = ProjectionMath.inv_mlfn(m0 + xyy, es, en); + double tn = Math.tan(ph1); + double t = tn * tn; + double n = Math.sin(ph1); + double r = 1. / (1. - es * n * n); + n = Math.sqrt(r); + r *= (1. - es) * n; + double dd = xyx / n; + double d2 = dd * dd; + double phi = ph1 - (n * tn / r) * d2 * (.5 - (1. + 3. * t) * d2 * C3); + double lam = dd * (1. + t * d2 * (-C4 + (1. + 3. * t) * d2 * C5)) / Math.cos(ph1); + return new double[] {Math.toDegrees(lam), Math.toDegrees(phi)}; + } + } + + // ---- bonne (BonneProjection.java:46,69,102,103) ------------------------------------- + + /** + * The old ellipsoidal Bonne. {@code phi1} was hard-wired to {@code pi/2} — the line reading + * {@code +lat_1} was commented out — so this takes no {@code lat_1} argument, which is the + * whole point: whatever the user asked for, this is what they got. + */ + static final class Bonne { + private final double[] en; + private final double m1; + private final double am1; + private final double es; + private final double a; + + Bonne(double a, double es) { + this.a = a; + this.es = es; + this.en = ProjectionMath.enfn(es); + double phi1 = HALFPI; + double s = Math.sin(phi1); + double c = Math.cos(phi1); + this.m1 = ProjectionMath.mlfn(phi1, s, c, en); + this.am1 = c / (Math.sqrt(1. - es * s * s) * s); + } + + double[] forward(double lamDeg, double phiDeg) { + double lplam = Math.toRadians(lamDeg); + double lpphi = Math.toRadians(phiDeg); + double E = Math.sin(lpphi); + double c = Math.cos(lpphi); + double rh = am1 + m1 - ProjectionMath.mlfn(lpphi, E, c, en); + // No |rh| > EPS10 guard, exactly as before: at the pole this is 0/0. + E = c * lplam / (rh * Math.sqrt(1. - es * E * E)); + return new double[] {a * rh * Math.sin(E), a * (am1 - rh * Math.cos(E))}; + } + } + + // ---- aeqd (EquidistantAzimuthalProjection.java:74,77,80,141,222) -------------------- + + /** The old ellipsoidal azimuthal-equidistant polar aspects. */ + static final class AeqdPolar { + private final double[] en; + private final double mp; + private final boolean north; + private final double es; + private final double a; + + AeqdPolar(double a, double es, boolean north) { + this.a = a; + this.es = es; + this.north = north; + this.en = ProjectionMath.enfn(es); + this.mp = north + ? ProjectionMath.mlfn(HALFPI, 1., 0., en) + : ProjectionMath.mlfn(-HALFPI, -1., 0., en); + } + + double[] forward(double lamDeg, double phiDeg) { + double lam = Math.toRadians(lamDeg); + double phi = Math.toRadians(phiDeg); + double coslam = north ? -Math.cos(lam) : Math.cos(lam); + double rho = Math.abs(mp + - ProjectionMath.mlfn(phi, Math.sin(phi), Math.cos(phi), en)); + return new double[] {a * rho * Math.sin(lam), a * rho * coslam}; + } + + double latitude(double xMetres, double yMetres) { + double c = ProjectionMath.distance(xMetres / a, yMetres / a); + return Math.toDegrees(ProjectionMath.inv_mlfn(north ? mp - c : mp + c, es, en)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/MercatorWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/MercatorWiringTest.java new file mode 100644 index 0000000..54d2ba3 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/MercatorWiringTest.java @@ -0,0 +1,305 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_A; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_E; +import static org.locationtech.proj4j.numerics.wiring.GieCase.GRS80_ES; +import static org.locationtech.proj4j.numerics.wiring.GieCase.MM; +import static org.locationtech.proj4j.numerics.wiring.GieCase.NM; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * {@code MercatorProjection} re-pointed at {@link ConformalLat}, plus {@code +lat_ts}. + * + *

Three separate things are asserted here, and the first is the reason this projection was worth + * doing first: {@code builtins.gie:4262} is the only {@code tolerance 0 m} row in the corpus that + * proj4j could not satisfy. + */ +public class MercatorWiringTest { + + private static final GieCase GRS80 = GieCase.grs80("+proj=merc +ellps=GRS80"); + + /** + * {@code builtins.gie:4262-4265}: + *

+     *   operation +proj=merc   +ellps=GRS80
+     *   tolerance 0 m
+     *   accept  0 0
+     *   expect  0 0
+     * 
+ * and the matching {@code direction inverse} row at {@code :4283-4285}. + * + *

{@code tolerance 0 m} admits nothing but a bit-exact zero. The forward is now + * {@code k0 * (asinh(sin/cos) - e*atanh(e*sin))}, both terms of which are exactly zero at the + * equator. The old route was {@code -k0*log(tsfn(0))} with + * {@code ProjectionMath.tsfn(0) == 0.9999999999999999}, whose logarithm is {@code -1.11e-16} — + * a northing of 7.081154551613622e-10 m. Small, and still a failure. + */ + @Test + public void forwardOfTheOriginIsBitExactlyZero() { + ProjCoordinate got = GRS80.forward(0, 0); + assertEquals("builtins.gie:4262 is tolerance 0 m; the easting must be exactly zero", + 0L, Double.doubleToRawLongBits(got.x)); + assertEquals("builtins.gie:4262 is tolerance 0 m; the northing must be exactly zero, " + + "not " + got.y, + 0L, Double.doubleToRawLongBits(got.y)); + + double before = Math.abs(Legacy.mercNorthing(0.0, GRS80_A, GRS80_ES, 1.0)); + assertEquals("the pre-change path produced 7.081154551613622e-10 m here, which is what " + + "failed the row", 7.081154551613622e-10, before, 0.0); + assertTrue("the deprecated tsfn must be one ulp short of 1.0, else the row was already " + + "passing and this test proves nothing", + ProjectionMath.tsfn(0.0, 0.0, GRS80_E) != 1.0); + + // The inverse side of the same row, builtins.gie:4283-4285. + ProjCoordinate back = GRS80.inverse(0, 0); + assertEquals(0L, Double.doubleToRawLongBits(back.x)); + assertEquals(0L, Double.doubleToRawLongBits(back.y)); + } + + /** + * {@code builtins.gie:4266-4274}, {@code tolerance 50 nm}: the four sign combinations of + * {@code (+/-2, +/-1) -> (+/-222638.981586547, +/-110579.965218249)}. + * + *

Both paths satisfy this row; the new one is closer, from 1.433 nm to 0.642 nm. + */ + @Test + public void forwardMatchesTheFiftyNanometreRows() { + GRS80.expectForward(2, 1, 222638.981586547, 110579.965218249, 50 * NM); + GRS80.expectForward(2, -1, 222638.981586547, -110579.965218249, 50 * NM); + GRS80.expectForward(-2, 1, -222638.981586547, 110579.965218249, 50 * NM); + GRS80.expectForward(-2, -1, -222638.981586547, -110579.965218249, 50 * NM); + + double now = GRS80.forwardDeviation(2, 1, 222638.981586547, 110579.965218249); + double before = Math.hypot( + Legacy.mercEasting(2.0, GRS80_A, 1.0) - 222638.981586547, + Legacy.mercNorthing(1.0, GRS80_A, GRS80_ES, 1.0) - 110579.965218249); + GieCase.assertStrictlyBetter("builtins.gie:4267 merc forward", before, now, 50 * NM); + } + + /** + * {@code builtins.gie:4287-4294}, {@code tolerance 50 nm}: + * {@code (200, 100) -> (0.00179663056824, 0.00090436947704)} and its three reflections. + * + *

This is the row the old inverse failed. The 15-step Newton loop in + * {@code ProjectionMath.phi2} stops when {@code |dphi| <= 1e-10} radians, which is 0.64 mm on + * the ground, so it returns as soon as it is roughly a millimetre out and the residual error is + * whatever it happens to be — measured here 201.7 nm against a 50 nm bar, i.e. four times + * over. Newton on {@code tau} converges to 0.240 nm. + */ + @Test + public void inverseMatchesTheFiftyNanometreRows() { + GRS80.expectInverse(200, 100, 0.00179663056824, 0.00090436947704, 50 * NM); + GRS80.expectInverse(200, -100, 0.00179663056824, -0.00090436947704, 50 * NM); + GRS80.expectInverse(-200, 100, -0.00179663056824, 0.00090436947704, 50 * NM); + GRS80.expectInverse(-200, -100, -0.00179663056824, -0.00090436947704, 50 * NM); + + double now = GRS80.inverseDeviation(200, 100, 0.00179663056824, 0.00090436947704); + double before = GRS80.angularDeviation(0.00179663056824, 0.00090436947704, + new ProjCoordinate(0.00179663056824, + Legacy.mercLatitude(100.0, GRS80_A, GRS80_ES, 1.0))); + assertTrue("the pre-change inverse must miss the 50 nm bar, else the row was already " + + "passing; measured " + before + " m", before > 50 * NM); + GieCase.assertStrictlyBetter("builtins.gie:4288 merc inverse", before, now, 50 * NM); + } + + /** + * {@code builtins.gie:4295-4303}: the near-pole and beyond-pole inverse rows. + *

+     *   accept  0 235805185.015130176   expect  0 89.99999999999999
+     *   accept  0 1e10                  expect  0 90
+     * 
+ * The second is why the inverse works from {@code sinh(y/k0)} rather than + * {@code exp(-y/k0)}: {@code sinh} of {@code 1567.8} is infinity, the {@code |taup| > 70} branch + * of {@code sinhpsi2tanphi} returns it unchanged, and {@code atan(inf)} is exactly + * {@code pi/2}. + */ + @Test + public void inverseReachesThePole() { + GRS80.expectInverse(0, 235805185.015130176, 0, 89.99999999999999, 50 * NM); + GRS80.expectInverse(0, -235805185.015130176, 0, -89.99999999999999, 50 * NM); + assertEquals("builtins.gie:4301 expects exactly 90", 90.0, GRS80.inverse(0, 1e10).y, 0.0); + assertEquals("builtins.gie:4303 expects exactly -90", -90.0, + GRS80.inverse(0, -1e10).y, 0.0); + } + + /** + * {@code builtins.gie:4306-4333}, the whole {@code +R=6400000} block. + * + *

The spherical branch never touched {@code phi2} or {@code tsfn}, but it did change shape: + * {@code asinh(tan(phi))} for {@code merc.cpp:23-27} and {@code atan(sinh(y/k0))} for + * {@code :37-41}, in place of {@code log(tan(pi/4 + phi/2))} and + * {@code pi/2 - 2*atan(exp(-y/k0))}. Algebraically identical; both {@code tolerance 0 m} rows + * and all eight {@code tolerance 50 nm} rows still hold. + */ + @Test + public void sphericalBranchStillMatchesGie() { + GieCase r = GieCase.sphere("+proj=merc +R=6400000", 6400000.0); + ProjCoordinate origin = r.forward(0, 0); + assertEquals("builtins.gie:4308 is tolerance 0 m", 0L, + Double.doubleToRawLongBits(origin.x)); + assertEquals("builtins.gie:4308 is tolerance 0 m", 0L, + Double.doubleToRawLongBits(origin.y)); + ProjCoordinate back = r.inverse(0, 0); + assertEquals("builtins.gie:4323 is tolerance 0 m", 0L, + Double.doubleToRawLongBits(back.x)); + assertEquals("builtins.gie:4323 is tolerance 0 m", 0L, + Double.doubleToRawLongBits(back.y)); + + r.expectForward(2, 1, 223402.144255274, 111706.743574944, 50 * NM); + r.expectForward(2, -1, 223402.144255274, -111706.743574944, 50 * NM); + r.expectForward(-2, 1, -223402.144255274, 111706.743574944, 50 * NM); + r.expectForward(-2, -1, -223402.144255274, -111706.743574944, 50 * NM); + r.expectInverse(200, 100, 0.00179049310978, 0.00089524655486, 50 * NM); + r.expectInverse(200, -100, 0.00179049310978, -0.00089524655486, 50 * NM); + r.expectInverse(-200, 100, -0.00179049310978, 0.00089524655486, 50 * NM); + r.expectInverse(-200, -100, -0.00179049310978, -0.00089524655486, 50 * NM); + r.expectRoundtrip(2, 1, 1, 50 * NM); + r.expectRoundtrip(2, 85, 1, 50 * NM); + } + + /** + * {@code builtins.gie:4336-4347}, the block whose own comment is + * "Test the numerical stability of the inverse spherical Mercator", at + * {@code tolerance 1e-17 m} on a unit sphere — the tightest non-zero bar in the corpus: + *

+     *   operation +proj=merc +R=1
+     *   accept  0   57.295779513e-15   expect  0   1e-15
+     *   direction inverse
+     *   accept  0   1e-15              expect  0   57.295779513e-15
+     * 
+ * + *

Both directions used to lose the answer to cancellation against a leading 1. + * {@code log(tan(pi/4 + phi/2))} evaluates {@code log(1 + 1e-15)} and + * {@code pi/2 - 2*atan(exp(-1e-15))} subtracts two nearly equal quantities; + * {@code asinh}'s {@code log1p} branch and {@code atan(sinh(y))} have no such term. + */ + @Test + public void unitSphereKeepsFullRelativeAccuracyAtTheEquator() { + GieCase r = GieCase.sphere("+proj=merc +R=1", 1.0); + r.expectForward(0, 57.295779513e-15, 0, 1e-15, 1e-17); + r.expectInverse(0, 1e-15, 0, 57.295779513e-15, 1e-17); + + double phi = Math.toRadians(57.295779513e-15); + double before = Math.abs(Math.log(Math.tan(ProjectionMath.QUARTERPI + 0.5 * phi)) - 1e-15); + double now = Math.abs(r.forward(0, 57.295779513e-15).y - 1e-15); + assertTrue("the pre-change spherical forward should miss the 1e-17 bar here, measured " + + before, before > 1e-17); + assertTrue("asinh's log1p branch must land inside it, measured " + now, now <= 1e-17); + } + + /** + * {@code gigs/5112.gie}, Mercator variant B — EPSG:3388, Pulkovo 1942 / Caspian Sea Mercator, + * which is {@code +proj=merc +lat_ts=42 +lon_0=51 +ellps=krass}. + * + *

proj4j read {@code +lat_ts} into a field and never used it, leaving {@code k0 = 1}. Every + * row here was therefore out by the factor {@code msfn(42 deg, krass) = 0.744260894} — up to + * 1.30 million metres on the last row — and {@code gigs/5112} passed 7 of 15: the two + * equator rows in each direction, where {@code lat_ts} is a no-op, plus the five + * self-consistent {@code roundtrip 1000} blocks, which close regardless of {@code k0}. + * + *

Both non-roundtrip blocks of {@code 5112} are at {@code tolerance 50 mm}; the expectations + * are printed to 2 decimals, so the residuals below are dominated by that. + */ + @Test + public void latTsIsAppliedForMercatorVariantB() { + // Krassovsky 1940: a = 6378245, rf = 298.3. + GieCase b = GieCase.ellipsoid("+proj=merc +lat_ts=42 +lon_0=51 +ellps=krass", + "krass", 6378245.0, 298.3); + double[][] rows = { + {51.0, 42.0, 0.0, 3819897.85}, + {51.0, 0.0, 0.0, 0.0}, + {57.0, 0.0, 497112.88, 0.0}, + {54.0, 20.5, 248556.44, 1724781.5}, + {67.0, -41.0, 1325634.35, -3709687.25}, + }; + double worstBefore = 0.0; + for (double[] r : rows) { + b.expectForward(r[0], r[1], r[2], r[3], 50 * MM); + b.expectInverse(r[2], r[3], r[0], r[1], 50 * MM); + b.expectRoundtrip(r[0], r[1], 1000, 6 * MM); + // What k0 = 1 gave: the same shape, unscaled. + worstBefore = Math.max(worstBefore, Math.hypot( + Legacy.mercEasting(r[0] - 51.0, 6378245.0, 1.0) - r[2], + Legacy.mercNorthing(r[1], 6378245.0, krassEs(), 1.0) - r[3])); + } + assertTrue("with k0 = 1 the worst gigs/5112 row should be over a megametre out, " + + "measured " + worstBefore + " m", worstBefore > 1.0e6); + } + + /** + * The ratio that identified the defect as a missing line rather than a wrong formula: + * every failing {@code gigs/5112} row was out by exactly {@code msfn(42 deg, krass)}. + */ + @Test + public void theScaleFactorIsMsfnOfLatTs() { + double phits = Math.toRadians(42.0); + double expected = ProjectionMath.msfn(Math.sin(phits), Math.cos(phits), krassEs()); + assertEquals("msfn(42 deg, krass) is the observed error ratio to nine digits", + 0.744260894, expected, 5e-10); + + GieCase b = GieCase.ellipsoid("+proj=merc +lat_ts=42 +lon_0=51 +ellps=krass", + "krass", 6378245.0, 298.3); + // At lon 57, lat 0, the easting is k0 * a * lam exactly. + double lam = Math.toRadians(6.0); + assertEquals(expected * 6378245.0 * lam, b.forward(57, 0).x, 1e-6); + } + + /** + * {@code merc.cpp:50-55} rejects {@code |lat_ts| >= 90}. proj4j silently ignored the parameter, + * so there was nothing to reject. + */ + @Test(expected = InvalidValueException.class) + public void latTsBeyondThePoleIsRejected() { + new CRSFactory().createFromParameters("bad", "+proj=merc +lat_ts=90 +ellps=GRS80 +no_defs"); + } + + /** {@code +lat_ts} on a sphere is {@code cos(lat_ts)}, {@code merc.cpp:64-66}. */ + @Test + public void latTsOnASphereIsCosine() { + GieCase s = GieCase.sphere("+proj=merc +lat_ts=42 +R=6400000", 6400000.0); + double lam = Math.toRadians(2.0); + assertEquals(Math.cos(Math.toRadians(42.0)) * 6400000.0 * lam, s.forward(2, 0).x, 1e-9); + } + + /** + * Round-trip closure across the working range, at the 50 nm bar the corpus sets for this + * projection rather than the 0.1 mm one it sets for most. + */ + @Test + public void roundTripClosesAtFiftyNanometres() { + for (double lat : new double[] {0.0, 0.00090436947704, 1, 2.8, 30, 60, 85}) { + GRS80.expectRoundtrip(2, lat, 100, 50 * NM); + GRS80.expectRoundtrip(-2, -lat, 100, 50 * NM); + } + } + + /** Krassovsky 1940 squared eccentricity, from {@code a} and {@code rf} as PROJ derives it. */ + private static double krassEs() { + double f = 1.0 / 298.3; + return 2.0 * f - f * f; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/numerics/wiring/NewZealandMapGridWiringTest.java b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/NewZealandMapGridWiringTest.java new file mode 100644 index 0000000..7866eaa --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/numerics/wiring/NewZealandMapGridWiringTest.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.numerics.wiring; + +import static org.junit.Assert.assertEquals; + +import java.lang.reflect.Method; + +import org.junit.Test; +import org.locationtech.proj4j.proj.NewZealandMapGridProjection; +import org.locationtech.proj4j.util.AuthalicLat; + +/** + * {@code NewZealandMapGridProjection} needs no part of the numerical core, and this test + * exists to pin that conclusion rather than a numeric. + * + *

The numerics reference lists {@code nzmg} among the projections the authalic-latitude fix moves. + * That is wrong for this port. {@code 9.8.1:src/projections/nzmg.cpp} is a fixed-Earth fit — two + * hard-coded real series and six hard-coded complex coefficients published with the grid definition — + * and it calls neither {@code pj_authalic_lat} nor {@code pj_qsfn} nor {@code pj_mlfn}. proj4j + * nonetheless carried static imports of {@code ProjectionMath.authlat}, {@code authset} and + * {@code qsfn} (plus {@code asin}, {@code sin} and {@code HALFPI}), none of them ever referenced, + * which is presumably where the belief came from. They are removed rather than converted: pointing + * them at {@link AuthalicLat} would have created a dependency upstream does not have and no code path + * exercises. + */ +public class NewZealandMapGridWiringTest { + + /** + * The class must not reference the authalic machinery at all — new or deprecated. Checked + * against the constant pool, because an unused import leaves no trace there and a real + * dependency does. + */ + @Test + public void doesNotDependOnTheAuthalicMachinery() { + for (Method m : NewZealandMapGridProjection.class.getDeclaredMethods()) { + assertEquals("nzmg declares no method returning an authalic type", + false, AuthalicLat.class.equals(m.getReturnType())); + } + for (java.lang.reflect.Field f : NewZealandMapGridProjection.class.getDeclaredFields()) { + assertEquals("nzmg holds no authalic field: " + f, + false, AuthalicLat.class.equals(f.getType())); + assertEquals("nzmg holds no meridian-arc field either: " + f, false, + org.locationtech.proj4j.util.MeridianArc.class.equals(f.getType())); + } + } + + /** + * {@code builtins.gie:5016-5036}, {@code +proj=nzmg +ellps=GRS80} at {@code tolerance 0.1 mm}. + * A no-movement guard: removing six static imports must not change a single bit, and the origin + * must still land on the grid's false origin. + */ + @Test + public void gridOriginIsUnmoved() { + GieCase r = GieCase.grs80("+proj=nzmg +ellps=GRS80"); + // nzmg forces its own axis, lon_0 = 173, lat_0 = -41, x_0 = 2510000, y_0 = 6023150. + assertEquals(2510000.0, r.forward(173, -41).x, 1e-6); + assertEquals(6023150.0, r.forward(173, -41).y, 1e-6); + r.expectRoundtrip(174, -40, 1, 0.1 * GieCase.MM); + r.expectRoundtrip(172, -42, 1, 0.1 * GieCase.MM); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/omerc/ObliqueMercatorEpsgWitnessTest.java b/core/src/test/java/org/locationtech/proj4j/omerc/ObliqueMercatorEpsgWitnessTest.java new file mode 100644 index 0000000..e3be7c5 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/omerc/ObliqueMercatorEpsgWitnessTest.java @@ -0,0 +1,219 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.omerc; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * The nine {@code omerc} rows that {@code proj4-epsg.csv} recorded as {@code "failing"}, and the five + * commented-out {@code ESRI:102631} rows from {@code PROJ4_SPCS_EPSG_nad83.csv}. + * + *

Both sets are held here as live assertions rather than as CSV status flags, because a + * {@code "failing"} marker in a data file overstates the damage the moment it goes stale and nothing + * fails when it does. + * + *

The nine {@code proj4-epsg.csv} rows all pass now

+ * + *

They are EPSG 3376, 3468, 5247, 6394, 26731, 26931, 29871, 29872 and 29873 — every one an + * {@code omerc} carrying {@code +gamma}, and seven of the nine also {@code +no_uoff}. Residual against + * the values the CSV pins is at most 5e-7 m where the CSV's own tolerance is 0.1 m (0.03048 m + * for 26731). They were failing on the {@code cos(gamma)}/{@code cos(alpha)} defect and on + * {@code Gamma} defaulting to {@code 0.0}. The other four rows that upstream marked + * {@code "failing"} (3388, 3752, 3994, 5641) are {@code merc +lat_ts} and are not this class's + * business. + * + *

The {@code "failing"} markers are historical. They are how the file arrived from + * upstream at {@code 59c2f66}, which had 18 of them; eight of the nine {@code omerc} rows were + * already reclassified to {@code passing} before the 9.8.1 regeneration, and that regeneration + * cleared the last four {@code merc} ones. The committed file now carries no {@code "failing"} + * row at all — which is exactly why these nine live here as executed assertions instead. + * + *

The five {@code ESRI:102631} rows still do not, and {@code omerc} is no longer why

+ * + *

See {@link #esri102631NeedsNoUoffInTheShippedEsriDictionary()}. + */ +public class ObliqueMercatorEpsgWitnessTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + private static ProjCoordinate from(String srcCode, String tgt, double lon, double lat) { + CoordinateReferenceSystem src = CRS_FACTORY.createFromName(srcCode); + CoordinateReferenceSystem dst = tgt.startsWith("+") + ? CRS_FACTORY.createFromParameters("tgt", tgt) + : CRS_FACTORY.createFromName(tgt); + ProjCoordinate out = new ProjCoordinate(); + CT_FACTORY.createTransform(src, dst).transform(new ProjCoordinate(lon, lat), out); + return out; + } + + private static ProjCoordinate fromWgs84(String tgt, double lon, double lat) { + return from("EPSG:4326", tgt, lon, lat); + } + + /** {@code PROJ4_SPCS_EPSG_nad83.csv} rows are sourced from EPSG:4269, not EPSG:4326. */ + private static ProjCoordinate fromNad83(String tgt, double lon, double lat) { + return from("EPSG:4269", tgt, lon, lat); + } + + private static void row(String code, double lon, double lat, + double x, double y, double tolerance) { + ProjCoordinate out = fromWgs84(code, lon, lat); + assertEquals(code + " easting", x, out.x, tolerance); + assertEquals(code + " northing", y, out.y, tolerance); + } + + /** + * All nine, at the CSV's own point (1, -1) and the CSV's own expected values and tolerances. + * Each expected pair is the row from {@code proj4-epsg.csv}, which was auto-generated from + * PROJ's EPSG database. + */ + @Test + public void theNineOmercRowsRecordedAsFailingNowPass() { + row("EPSG:3376", 1.0, -1.0, -1.2409058238151E7, -4357833.596094, 0.1); + row("EPSG:3468", 1.0, -1.0, 2.1299477541839E7, -9945672.888623, 0.1); + row("EPSG:5247", 1.0, -1.0, -1.2409058238151E7, -4357833.596094, 0.1); + row("EPSG:6394", 1.0, -1.0, 2.1299477541839E7, -9945672.888623, 0.1); + // EPSG:26731 has moved to epsg26731IsNowRefusedByTheDatumStageNotByOmerc(), below. + row("EPSG:26931", 1.0, -1.0, 2.1299477541839E7, -9945672.888623, 0.1); + row("EPSG:29871", 1.0, -1.0, -616802.381396, -216616.294447, 1.0); + row("EPSG:29872", 1.0, -1.0, -4.0708957167923E7, -1.4296675428702E7, 1.0); + row("EPSG:29873", 1.0, -1.0, -1.2408068634417E7, -4357619.119986, 0.1); + } + + /** + * The ninth row, and it is no longer an {@code omerc} question at all. + * + *

{@code EPSG:26731} is the only one of the nine carrying {@code +datum=NAD27}, and the CSV + * probes it at (1, -1) — the Gulf of Guinea, some 12,000 km from Alaska and outside every + * grid {@code +datum=NAD27} names. {@code Grid.shift} used to apply no shift there and report + * success, so the row reached {@code omerc} with an unshifted coordinate and matched the CSV, + * whose expected value was generated the same way. It is now + * {@link ErrorCause#COORDINATE_OUTSIDE_GRID}, matching PROJ 9.8.1: + * + *

+     * echo "1 -1" | cs2cs -f "%.10f" +proj=longlat +datum=WGS84 \
+     *      +to +proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat
+     *   *	* inf
+     * 
+ * + *

(At the CRS level with {@code proj.db} present, {@code cs2cs +to +proj=longlat +datum=NAD27} + * instead selects "Ballpark geographic offset" — a declared no-op chosen by the + * operation factory because the point is outside NADCON's area of use. proj4j's legacy + * {@code +datum=} path has no such factory; it is the operator path, and the operator path + * errors. Reproducing the ballpark selection is {@code db/}'s and the strict API's job, not + * {@code Grid}'s.) + * + *

So the {@code omerc} claim is asserted here with the datum stage taken out of the way: the + * identical projection parameters on a bare {@code +ellps=clrk66} still produce the CSV's + * easting and northing. Nothing about {@code ObliqueMercatorProjection} changed. + * + *

The row in {@code proj4-epsg.csv} has been reclassified: the 9.8.1 regeneration + * records {@code EPSG:26731} as {@code refuses:COORDINATE_OUTSIDE_GRID}, which asserts this + * same refusal by cause rather than merely asserting that the row does not pass. + */ + @Test + public void epsg26731IsNowRefusedByTheDatumStageNotByOmerc() { + try { + ProjCoordinate out = fromWgs84("EPSG:26731", 1.0, -1.0); + fail("(1, -1) is outside every +datum=NAD27 grid and PROJ answers '* * inf'; proj4j " + + "returned (" + out.x + ", " + out.y + ")"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + + // The same projection, without the datum stage: the omerc arithmetic is unchanged. + CoordinateReferenceSystem src = CRS_FACTORY.createFromName("EPSG:4326"); + CoordinateReferenceSystem dst = CRS_FACTORY.createFromParameters("26731-no-datum", + "+proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 " + + "+k=0.9999 +x_0=5000000.001016002 +y_0=-5000000.001016002 +no_uoff " + + "+gamma=323.1301023611111 +ellps=clrk66 +units=us-ft +no_defs"); + ProjCoordinate out = new ProjCoordinate(); + CT_FACTORY.createTransform(src, dst).transform(new ProjCoordinate(1.0, -1.0), out); + assertEquals("EPSG:26731 easting, datum stage removed", 6.9883986607415E7, out.x, 0.03048); + assertEquals("EPSG:26731 northing, datum stage removed", -3.2630755864469E7, out.y, 0.03048); + } + + /** + * The five commented-out {@code ESRI:102631} rows, four of them tagged + * "Bug in Proj4J Obl Merc". The bug is not in Proj4J's {@code omerc} any more — it is in + * the shipped {@code esri} dictionary. + * + *

{@code epsg/src/main/resources/proj4/nad/esri:5541} defines + * {@code <102631>} without {@code +no_uoff}. PROJ 9.8.1's own definition + * ({@code projinfo ESRI:102631}) has it: + * + *

+     * +proj=omerc +no_uoff +lat_0=57 +lonc=-133.666666666667 +alpha=-36.8698976458333
+     *   +gamma=-36.8698976458333 +k=0.9999 +x_0=5000000.00000001 +y_0=-5000000.00000001
+     *   +ellps=GRS80 +units=us-ft
+     * 
+ * + *

Measured three ways, on the definition as shipped: + *

    + *
  • Proj4J now agrees with {@code cs2cs} 9.8.1 to the printed digit — + * 16334242.901471 / -17134586.690995 for the first row — so the projection is right and the + * definition is what disagrees with the CSV.
  • + *
  • The residual against the CSV's pinned values is a constant 13,718,224.7 ft easting and + * 18,290,966.4 ft northing on all five rows, which is exactly {@code 2 * u_0} resolved + * through the rotation — the signature of a missing {@code +no_uoff}.
  • + *
  • Adding {@code +no_uoff} to the definition and nothing else reproduces all five CSV rows to + * 3 mm against a 0.1 tolerance, which is what this test asserts.
  • + *
+ * + *

So the five rows are correct and the fix is one token in a data file. That file is not in + * this change's scope, and none of the seventeen {@code omerc} entries in the {@code esri} + * dictionary carries {@code +no_uoff} while twenty-two of the twenty-nine in the {@code epsg} + * dictionary do — so it wants a verified sweep rather than a single edit, and the CSV rows stay + * commented out until that happens. This test pins the diagnosis so the sweep can be checked. + */ + @Test + public void esri102631NeedsNoUoffInTheShippedEsriDictionary() { + String asShipped = "+proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=-36.86989764583333" + + " +k=0.9999 +x_0=4999999.999999999 +y_0=-4999999.999999999 +ellps=GRS80" + + " +datum=NAD83 +to_meter=0.3048006096012192 +no_defs"; + String corrected = asShipped + " +no_uoff"; + + // As shipped, Proj4J reproduces cs2cs 9.8.1 on the same string: 16334242.901471 -17134586.690995. + ProjCoordinate shipped = fromNad83(asShipped, -134.0, 55.0); + assertEquals(16334242.901471, shipped.x, 1.0e-5); + assertEquals(-17134586.690995, shipped.y, 1.0e-5); + + // With +no_uoff, the five CSV rows. Expected values from PROJ4_SPCS_EPSG_nad83.csv:2-6. + double tol = 0.1; + assertRow(corrected, -134.0, 55.0, 2616018.154, 1156379.643, tol); + assertRow(corrected, -133.66666666666666, 57.0, 2685941.919, 1886799.668, tol); + assertRow(corrected, -131.59595333333334, 54.65073722222222, 3124531.426, 1035343.511, tol); + assertRow(corrected, -129.54166666666666, 54.541666666666664, 3561448.345, 1015025.876, tol); + assertRow(corrected, -141.5, 60.5, 1276328.587, 3248159.207, tol); + } + + private static void assertRow(String def, double lon, double lat, + double x, double y, double tolerance) { + ProjCoordinate out = fromNad83(def, lon, lat); + assertEquals("easting at " + lon + "," + lat, x, out.x, tolerance); + assertEquals("northing at " + lon + "," + lat, y, out.y, tolerance); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/omerc/ObliqueMercatorParameterTest.java b/core/src/test/java/org/locationtech/proj4j/omerc/ObliqueMercatorParameterTest.java new file mode 100644 index 0000000..1674deb --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/omerc/ObliqueMercatorParameterTest.java @@ -0,0 +1,351 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.omerc; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.Projection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code +proj=omerc} parameter precedence and rotation, against PROJ 9.8.1. + * + *

Every expected value in this class was produced by PROJ 9.8.1 on the definition quoted beside + * it, or taken from {@code conformance/src/test/resources/gie/builtins.gie} where upstream pins one. + * None was produced by Proj4J. + * + *

Use {@code proj}, not {@code cs2cs}, for a pure-projection reference. Learned the hard way + * on {@code +proj=omerc +lat_0=10 +R=6400000 +gamma=80}: {@code proj} gives + * {@code 397886.061495506379 -954179.578580341535} and {@code cs2cs} from + * {@code +proj=longlat +R=6400000} gives {@code -951174.356619503465 -394577.681672655453}. + * {@code cs2cs} promotes both sides to CRSs, and for two datum-less spherical definitions + * that is not the bare projection. Where a real ellipsoid is named the two agree to 1e-9 m; where one + * is not, {@code proj} is the tool that answers the question this class asks. + * + *

The two defects this class exists to hold down

+ * + *

Both were silent, both were in {@code ObliqueMercatorProjection.initialize()}, and + * neither was reachable by any live test in the repository: + * + *

    + *
  1. {@code Gamma} was declared as a plain {@code double}, so it defaulted to {@code 0.0} rather + * than {@code NaN}. The "was {@code +gamma} given?" test was therefore always true, the + * {@code gamma = alpha} default was dead code, and every {@code +alpha} without {@code +gamma} + * got zero rotation: 215,218.8 m easting and 303,073.5 m northing on RSO Borneo.
  2. + *
  3. {@code u_0} used {@code cos(gamma)} where {@code omerc.cpp:296} uses {@code cos(alpha_c)}: + * 2,532.3 m easting and 1,899.2 m northing on RSO Borneo.
  4. + *
+ * + *

The two interact — with {@code gamma} wrongly {@code 0}, {@code cos(gamma)} is {@code 1.0} — so + * the first three tests below deliberately pin all four combinations of "gamma given" and + * "gamma equals alpha", which is what makes the two independently observable. + */ +public class ObliqueMercatorParameterTest { + + private static final CRSFactory CRS_FACTORY = new CRSFactory(); + private static final CoordinateTransformFactory CT_FACTORY = new CoordinateTransformFactory(); + + /** Everest 1830 (RSO), the only {@code +rf=} in the repository. */ + private static final String RSO_ELLIPSOID = "+a=6377298.556 +rf=300.8017"; + private static final String RSO_GEO = "+proj=latlong " + RSO_ELLIPSOID; + + /** RSO Borneo's own test point, 116d2'11.12630E 5d54'19.90183N in decimal degrees. */ + private static final double RSO_LON = 116.0364239722222; + private static final double RSO_LAT = 5.905528286111111; + + private static ProjCoordinate transform(String src, String tgt, double x, double y) { + CoordinateReferenceSystem s = CRS_FACTORY.createFromParameters("src", src); + CoordinateReferenceSystem t = CRS_FACTORY.createFromParameters("tgt", tgt); + CoordinateTransform ct = CT_FACTORY.createTransform(s, t); + ProjCoordinate out = new ProjCoordinate(); + ct.transform(new ProjCoordinate(x, y), out); + return out; + } + + private static void check(String message, String src, String tgt, + double x, double y, double expectX, double expectY, double tolerance) { + ProjCoordinate out = transform(src, tgt, x, y); + assertEquals(message + " (easting)", expectX, out.x, tolerance); + assertEquals(message + " (northing)", expectY, out.y, tolerance); + } + + private static Projection proj(String params) { + return CRS_FACTORY.createFromParameters(null, params).getProjection(); + } + + /** + * {@code +alpha} with no {@code +gamma} must rotate by {@code alpha}. + *

+ * The 215 km reproducer. {@code cs2cs} 9.8.1 gives + * {@code 705254.125376385171 653608.753619930823}; the value Proj4J produced while + * {@code Gamma} defaulted to {@code 0.0} was {@code 490035.358739 956682.251445}, so this + * assertion fails by more than 200 km if the {@code NaN} default is ever lost. + */ + @Test + public void alphaWithoutGammaRotatesByAlpha() { + check("omerc +alpha with no +gamma", RSO_GEO, + "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +k_0=0.99984 +x_0=590476.87 +y_0=442857.65", + RSO_LON, RSO_LAT, 705254.125376385171, 653608.753619930823, 1.0e-6); + } + + /** + * {@code u_0} must use {@code cos(alpha)}, not {@code cos(gamma)}. + *

+ * RSO Borneo proper: {@code gamma != alpha} and no {@code +no_uoff}, the one configuration in the + * repository that reaches the {@code u_0} line with the two cosines actually differing. + * {@code u_0(cos alpha) = 0.115738049} against {@code u_0(cos gamma) = 0.115241701}; resolved + * through the rotation and scaled by {@code a} that is (-2532.29, -1899.22) m. + */ + @Test + public void u0UsesCosAlphaNotCosGamma() { + check("RSO Borneo, gamma != alpha, no +no_uoff", RSO_GEO, + "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +gamma=53d7'48.3685 +k_0=0.99984 +x_0=590476.87 +y_0=442857.65", + RSO_LON, RSO_LAT, 704570.396561578, 653979.683964950, 1.0e-6); + } + + /** + * The two configurations that hid both defects, kept so it stays visible why they hid + * them: {@code gamma == alpha} makes the two cosines coincide and the rotation correct by + * accident, and {@code +no_uoff} forces {@code u_0 = 0} so the wrong cosine is never evaluated. + * Neither can substitute for the two tests above. + */ + @Test + public void theConfigurationsThatUsedToHideTheDefects() { + // gamma == alpha. + check("gamma == alpha", RSO_GEO, + "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +gamma=53d18'56.9537 +k_0=0.99984 +x_0=590476.87 +y_0=442857.65", + RSO_LON, RSO_LAT, 705254.125376385171, 653608.753619930823, 1.0e-6); + + // +no_uoff, gamma != alpha: u_0 is zero, so the cos(alpha)/cos(gamma) line never runs. + check("+no_uoff with gamma != alpha", RSO_GEO, + "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +gamma=53d7'48.3685 +no_uoff +k_0=0.99984 +x_0=590476.87 +y_0=442857.65", + RSO_LON, RSO_LAT, 1295047.271908451337, 1096837.340363108087, 1.0e-6); + } + + /** + * {@code +gamma} on its own, with no {@code +alpha}. + *

+ * Upstream's third branch ({@code omerc.cpp:226-230}): {@code gamma0 = gamma} and the azimuth is + * derived, {@code alpha_c = asin(D sin gamma0)}. Unreachable before, because the + * no-argument constructor's placeholder {@code alpha = -45} degrees was indistinguishable from a + * caller-supplied one. Definition from {@code builtins.gie:5325}, which upstream marks + * # OK without pinning a value; reference from + * {@code proj -d 12 +proj=omerc +lat_0=10 +R=6400000 +gamma=80} on (2, 1). + *

+ * {@code +gamma=80} is exactly on upstream's limit here: {@code |gamma| <= asin(1/D)} and + * {@code asin(1/D) = asin(cos(lat_0)) = 80} degrees to the last bit. {@code builtins.gie:5330} + * pins {@code +gamma=80.0000001} as a failure, so this pair brackets the bound. + */ + @Test + public void gammaWithoutAlphaTakesTheGammaBranch() { + check("omerc +gamma with no +alpha", "+proj=longlat +R=6400000", + "+proj=omerc +lat_0=10 +R=6400000 +gamma=80", + 2.0, 1.0, 397886.061495506379, -954179.578580341535, 1.0e-6); + + // builtins.gie:5330 -- one ten-millionth of a degree past asin(1/D) must be rejected. + assertRejected("+proj=omerc +lat_0=10 +R=6400000 +gamma=80.0000001", "gamma"); + // builtins.gie:5341 -- and on an ellipsoid the bound moves, so 80.1 is still out. + assertRejected("+proj=omerc +lat_0=10 +a=6400000 +rf=300 +gamma=80.1", "gamma"); + } + + /** + * The azimuth form must reproduce the two-point form when the two describe the same centre line. + *

+ * {@code builtins.gie:5279} and {@code :5286} are the same expected value under + * {@code +lat_1=45 +lat_2=45.00001 +lon_1=0 +lon_2=1e-5} and under + * {@code +alpha=35.264383770917604}. Only the second is expressible through Proj4J's parser + * ({@code +lon_1}/{@code +lon_2} are not {@code Proj4Keyword}s), so the azimuth half is asserted + * here at upstream's own 1 mm tolerance. Proj4J's residual against upstream's pinned value is + * 6.3e-05 m easting and 1.6e-04 m northing, which is a {@code phi2}/meridian-arc residual and + * nothing to do with {@code omerc}. + */ + @Test + public void azimuthFormMatchesUpstreamsPinnedTwoPointValue() { + check("builtins.gie:5286", "+proj=longlat +a=6400000", + "+proj=omerc +a=6400000 +lat_0=45 +alpha=35.264383770917604", + 2.0, 1.0, -3569.825230822232, -5093592.310871849768, 1.0e-3); + } + + /** + * {@code |lat_0| = 90} must be rejected in the azimuth form too, not only in the two-point form. + * {@code builtins.gie:5293}: {@code +proj=omerc +R=1 +alpha=0 +lat_0=90} is an + * {@code expect failure}. Note that {@code +alpha=0} itself is not an error upstream — + * the old code rejected it, and 9.8.1's {@code omerc.cpp} has no such check. + */ + @Test + public void lat0AtThePoleIsRejectedInTheAzimuthForm() { + assertRejected("+proj=omerc +R=1 +alpha=0 +lat_0=90", "lat_0"); + } + + /** + * The two-point form. + *

+ * Also unreachable before, for the same reason, and additionally because the class's own + * {@code phi1}/{@code phi2} fields were never assigned by anything — {@code +lat_1} and + * {@code +lat_2} land in {@code projectionLatitude1}/{@code projectionLatitude2}. Definition and + * reference from {@code builtins.gie:5223}. {@code +lon_1}/{@code +lon_2} are absent here and + * default to 0 in both libraries, which is the only two-point case Proj4J's parser can express. + */ + @Test + public void twoPointFormUsesLat1AndLat2() { + // builtins.gie:5225-5232, all four quadrants, at upstream's 0.1 mm. + String def = "+proj=omerc +ellps=GRS80 +lat_1=0.5 +lat_2=2"; + String geo = "+proj=longlat +ellps=GRS80"; + check("omerc two-point form", geo, def, 2.0, 1.0, 222650.796885261, 110642.229314984, 1.0e-4); + check("omerc two-point form", geo, def, 2.0, -1.0, 222650.796885261, -110642.229314984, 1.0e-4); + check("omerc two-point form", geo, def, -2.0, 1.0, -222650.796885262, 110642.229314984, 1.0e-4); + check("omerc two-point form", geo, def, -2.0, -1.0, -222650.796885262, -110642.229314984, 1.0e-4); + + // And its inverse, builtins.gie:5236-5243. Degrees out. + check("omerc two-point inverse", def, geo, 200.0, 100.0, 0.001796631, 0.000904369, 1.0e-9); + check("omerc two-point inverse", def, geo, -200.0, -100.0, -0.001796631, -0.000904369, 1.0e-9); + } + + /** + * Upstream's two-point rejections ({@code omerc.cpp:157-192}) must be rejections, not plausible + * coordinates. {@code +lat_1=91} and {@code +lat_2=91} are {@code expect failure} rows in + * {@code builtins.gie:5309} and {@code :5314}. + */ + @Test + public void twoPointFormRejectsWhatUpstreamRejects() { + assertRejected("+proj=omerc +ellps=GRS80 +lat_1=91 +lat_2=2", "lat_1"); + assertRejected("+proj=omerc +ellps=GRS80 +lat_1=0.5 +lat_2=91", "lat_2"); + // lat_1 == lat_2: no centre line. + assertRejected("+proj=omerc +ellps=GRS80 +lat_1=2 +lat_2=2", "lat_2"); + // lat_1 == 0: the centre line degenerates to the equator. + assertRejected("+proj=omerc +ellps=GRS80 +lat_2=2", "lat_1"); + } + + private static void assertRejected(String params, String expectInMessage) { + try { + proj(params); + fail(params + " must be rejected, not turned into a usable projection"); + } catch (InvalidValueException expected) { + assertTrue("the message must name the offending parameter. Was: " + expected.getMessage(), + expected.getMessage().contains(expectInMessage)); + } + } + + /** + * {@code initialize()} must be idempotent, which is the structural half of defect 1. + *

+ * {@code Proj4Parser} calls {@code initialize()} after the no-argument constructor has + * already called it once, so anything {@code initialize()} writes to a parameter field is read + * back as a parameter on the second pass. The old code wrote both {@code Gamma} and + * {@code alpha}; the derived rotation and azimuth are locals now. + */ + @Test + public void initializeIsIdempotent() { + String def = "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +k_0=0.99984 +x_0=590476.87 +y_0=442857.65"; + Projection p = proj(def); + ProjCoordinate in = new ProjCoordinate(Math.toRadians(RSO_LON), Math.toRadians(RSO_LAT)); + ProjCoordinate first = new ProjCoordinate(); + p.projectRadians(in, first); + + for (int i = 0; i < 5; i++) { + p.initialize(); + } + ProjCoordinate again = new ProjCoordinate(); + p.projectRadians(in, again); + + assertEquals("re-initialize must not move the forward projection", first.x, again.x, 0.0); + assertEquals("re-initialize must not move the forward projection", first.y, again.y, 0.0); + } + + /** + * {@code +lonc} defaults to 0 rather than to {@code NaN}, and {@code +lon_0} is ignored. + *

+ * {@code Projection.lonc} is {@code NaN} when {@code +lonc} is absent, and + * {@code initialize()} used to assign it straight into {@code lamc}, so an {@code omerc} without + * {@code +lonc} produced {@code NaN} in every ordinate. Upstream's {@code lamc} defaults to 0 + * ({@code omerc.cpp:136}) and it reads {@code +lon_0} only to log that it is being ignored + * ({@code omerc.cpp:193-195}). + */ + @Test + public void loncDefaultsToZeroAndLon0IsIgnored() { + // cs2cs 9.8.1: 222805.015103577054 -331698.992270279850 + ProjCoordinate noLonc = transform("+proj=longlat +ellps=GRS80", + "+proj=omerc +ellps=GRS80 +lat_0=4 +alpha=53 +k_0=0.99984", 2.0, 1.0); + assertTrue("an omerc with no +lonc must not produce NaN: was " + noLonc, + !Double.isNaN(noLonc.x) && !Double.isNaN(noLonc.y)); + assertEquals(222805.015103577054, noLonc.x, 1.0e-6); + assertEquals(-331698.992270279850, noLonc.y, 1.0e-6); + + // +lon_0 must change nothing at all. cs2cs 9.8.1 gives the same two numbers. + ProjCoordinate withLon0 = transform("+proj=longlat +ellps=GRS80", + "+proj=omerc +ellps=GRS80 +lat_0=4 +lon_0=42 +alpha=53 +k_0=0.99984", 2.0, 1.0); + assertEquals("+lon_0 must be ignored by omerc", noLonc.x, withLon0.x, 0.0); + assertEquals("+lon_0 must be ignored by omerc", noLonc.y, withLon0.y, 0.0); + } + + /** + * Round-trip, so the inverse is held to the same fixes as the forward: {@code u_0} is added back + * in the inverse, and the {@code atan2} in {@code omerc.cpp:113} is the one the forward's + * {@code atan2} has to agree with. + */ + @Test + public void forwardAndInverseRoundTrip() { + String omerc = "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +gamma=53d7'48.3685 +k_0=0.99984 +x_0=590476.87 +y_0=442857.65"; + ProjCoordinate there = transform(RSO_GEO, omerc, RSO_LON, RSO_LAT); + ProjCoordinate back = transform(omerc, RSO_GEO, there.x, there.y); + assertEquals(RSO_LON, back.x, 1.0e-11); + assertEquals(RSO_LAT, back.y, 1.0e-11); + } + + /** + * {@code +no_uoff} must participate in equality. {@code u_0} depends on it and nothing else + * does, so two {@code omerc} projections differing only by {@code +no_uoff} used to compare + * equal while projecting 55 m apart — and {@code Projection} is a transform-cache key. + */ + @Test + public void noUoffAndGammaParticipateInEquality() { + String base = "+proj=omerc " + RSO_ELLIPSOID + " +lat_0=4 +lonc=115 +alpha=53d18'56.9537" + + " +k_0=0.99984 +x_0=590476.87 +y_0=442857.65 +units=m +no_defs"; + Projection plain = proj(base); + Projection noUoff = proj(base + " +no_uoff"); + Projection withGamma = proj(base + " +gamma=53d7'48.3685"); + + assertEquals(plain, proj(base)); + assertEquals(plain.hashCode(), proj(base).hashCode()); + + assertNotEquals("+no_uoff changes u_0, so it must change equality", plain, noUoff); + assertNotEquals(noUoff, plain); + assertNotEquals(plain.hashCode(), noUoff.hashCode()); + + assertNotEquals("+gamma changes the rotation, so it must change equality", plain, withGamma); + assertNotEquals(withGamma, plain); + assertNotEquals(plain.hashCode(), withGamma.hashCode()); + + // And an absent +gamma must not make a projection unequal to an identically-defined one: + // gamma is NaN there, and NaN != NaN under ==. + assertEquals(withGamma, proj(base + " +gamma=53d7'48.3685")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/EllipsoidParsingTest.java b/core/src/test/java/org/locationtech/proj4j/parser/EllipsoidParsingTest.java new file mode 100644 index 0000000..bc1fceb --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/EllipsoidParsingTest.java @@ -0,0 +1,561 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.datum.Ellipsoid; + +/** + * Ellipsoid resolution against PROJ 9.8.1. + *

+ * Expectations come from {@code 9.8.1:test/gie/ellipsoid.gie} (vendored at + * {@code conformance/src/test/resources/gie/ellipsoid.gie}), which is exactly + * the test file for {@code src/ell_set.cpp}. + */ +public class EllipsoidParsingTest { + + /** gie's own tolerance for the coordinate rows in ellipsoid.gie is 10 nm. */ + private static final double NM_10 = 1e-8; + + /** A looser bound for the rows gie itself only pins to 4 decimal places. */ + private static final double MM_1 = 1e-3; + + private final CRSFactory crsFactory = new CRSFactory(); + + private CoordinateReferenceSystem crs(String def) { + return crsFactory.createFromParameters("test", def); + } + + private double es(String def) { + return crs(def).getDatum().getEllipsoid().getEccentricitySquared(); + } + + private double a(String def) { + return crs(def).getDatum().getEllipsoid().getEquatorRadius(); + } + + /** Forward-projects lon/lat in degrees using only the parsed projection. */ + private ProjCoordinate project(String def, double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(Double.NaN, Double.NaN); + crs(def).getProjection().project(new ProjCoordinate(lon, lat), out); + return out; + } + + private void expect(String def, double lon, double lat, double x, double y, double tol) { + ProjCoordinate out = project(def, lon, lat); + assertEquals(def + " easting", x, out.x, tol); + assertEquals(def + " northing", y, out.y, tol); + } + + private InvalidValueException rejected(String def) { + try { + crs(def); + } catch (InvalidValueException e) { + return e; + } catch (Proj4jException e) { + fail("expected InvalidValueException for [" + def + "] but got " + e); + } + fail("expected [" + def + "] to be rejected"); + return null; + } + + // ------------------------------------------------------------------ + // +rf / +f are no longer transposed + // ------------------------------------------------------------------ + + /** + * {@code ellps_shape} case 0: {@code f = 1/rf}, {@code es = 2f - f*f}. + * PROJ4J used to apply the flattening formula to the inverse + * flattening, giving {@code es = 297*(2-297) = -87615}. + */ + @Test + public void inverseFlatteningDerivesEccentricityLikeProj() { + double f = 1.0 / 297.0; + assertEquals("es must be 2f - f*f with f = 1/rf", + 2 * f - f * f, es("+proj=merc +a=6400000 +rf=297"), 0.0); + assertEquals(0.006722670022333322, es("+proj=merc +a=6400000 +rf=297"), 1e-18); + } + + /** {@code +f=1/297} and {@code +rf=297} must produce a bit-identical es. */ + @Test + public void flatteningAndInverseFlatteningAgree() { + double fromRf = es("+proj=merc +a=6400000 +rf=297"); + double fromF = es("+proj=merc +a=6400000 +f=" + (1.0 / 297.0)); + assertEquals("+f=1/297 and +rf=297 must be the same ellipsoid", fromRf, fromF, 0.0); + } + + /** WGS84's inverse flattening must now round-trip through {@code +rf}. */ + @Test + public void wgs84InverseFlatteningRoundTrips() { + assertEquals(Ellipsoid.WGS84.getEccentricitySquared(), + es("+proj=merc +a=6378137.0 +rf=298.257223563"), 1e-17); + } + + /** + * ellipsoid.gie: {@code operation proj=merc a=6400000 rf=297}. Both rows. + * Before the fix the easting was exact and the northing was NaN, because + * {@code e = sqrt(-87615)}. + */ + @Test + public void gieExplicitlyDefinedEllipsoid() { + String def = "+proj=merc +a=6400000 +rf=297"; + expect(def, 1, 2, 111701.0721276371, 221945.9681832088, NM_10); + expect(def, 12, 55, 1340412.8655316452, 7351803.9151705895, NM_10); + } + + /** ellipsoid.gie: {@code operation proj=merc ellps=GRS80}. */ + @Test + public void gieBuiltInEllipsoid() { + String def = "+proj=merc +ellps=GRS80"; + expect(def, 1, 2, 111319.4907932736, 221194.0771604237, NM_10); + expect(def, 12, 55, 1335833.8895192828, 7326837.7148738774, NM_10); + } + + /** ellipsoid.gie: "Test that flattening can be set to zero". */ + @Test + public void gieZeroFlattening() { + expect("+proj=merc +a=1.0 +f=0.0", 12, 56, 0.20944, 1.18505, 1e-5); + } + + // ------------------------------------------------------------------ + // +R declares a sphere and short-circuits everything + // ------------------------------------------------------------------ + + /** + * ellipsoid.gie's first block. {@code +R} must set {@code es = 0} so the + * spherical formula runs; the old code assigned only the semi-major axis, + * leaving the ellipsoidal formula on a declared sphere - 1,495 m of error + * at 2 degrees and ~35 km at 55. + */ + @Test + public void gieSphericalExample() { + String def = "+proj=merc +R=6400000"; + assertEquals("+R must zero the eccentricity", 0.0, es(def), 0.0); + assertEquals(6400000.0, a(def), 0.0); + expect(def, 1, 2, 111701.0721276371, 223447.5262032605, NM_10); + expect(def, 12, 55, 1340412.8655316452, 7387101.1430967357, NM_10); + } + + /** {@code ell_set.cpp:92-100}: with {@code +R}, shape and ellps are ignored. */ + @Test + public void radiusOverridesEllpsAndShapeParameters() { + String def = "+proj=merc +ellps=GRS80 +rf=100 +R=6400000 +R_A"; + assertEquals(6400000.0, a(def), 0.0); + assertEquals(0.0, es(def), 0.0); + // identical to +R on its own + expect(def, 12, 55, 1340412.8655316452, 7387101.1430967357, NM_10); + } + + /** The projection must see the sphere even when a datum names an ellipsoid. */ + @Test + public void radiusReachesTheProjectionEvenWithADatum() { + CoordinateReferenceSystem c = crs("+proj=merc +datum=WGS84 +R=6400000"); + assertEquals(6400000.0, c.getProjection().getEquatorRadius(), 0.0); + assertEquals(0.0, c.getProjection().getEllipsoid().getEccentricitySquared(), 0.0); + } + + // ------------------------------------------------------------------ + // First-match-wins shape precedence + // ------------------------------------------------------------------ + + /** + * {@code ellps_shape} loops over {@code rf, f, es, e, b} and breaks on the + * first present. PROJ4J used to apply every one of them, last write + * winning. + */ + @Test + public void firstShapeParameterWinsRegardlessOfTextOrder() { + double rf297 = es("+proj=merc +a=6400000 +rf=297"); + assertEquals("rf outranks es", rf297, es("+proj=merc +a=6400000 +es=0.5 +rf=297"), 0.0); + assertEquals("rf outranks es even when written last", + rf297, es("+proj=merc +a=6400000 +rf=297 +es=0.5"), 0.0); + assertEquals("rf outranks b", rf297, es("+proj=merc +a=6400000 +b=6000000 +rf=297"), 0.0); + + // f outranks es, e and b + double f = 0.003; + assertEquals(2 * f - f * f, + es("+proj=merc +a=6378137 +b=6000000 +e=0.1 +es=0.5 +f=0.003"), 0.0); + + // es outranks e and b + assertEquals(0.25, es("+proj=merc +a=6378137 +b=6000000 +e=0.1 +es=0.25"), 0.0); + + // e outranks b + assertEquals(0.01, es("+proj=merc +a=6378137 +b=6000000 +e=0.1"), 1e-17); + } + + /** {@code +e} was not a PROJ4J keyword at all. */ + @Test + public void eccentricityIsAccepted() { + assertEquals(0.25, es("+proj=merc +a=6378137 +e=0.5"), 0.0); + } + + /** + * A shape parameter after {@code +ellps} is a documented modifier, + * not a contradiction - {@code ell_set.cpp}'s own comment says so - and + * ellipsoid.gie asserts a value for it. + */ + @Test + public void ellpsPlusShapeParameterIsALegalModifier() { + assertEquals(1.0 / 300.0 * 2 - (1.0 / 300.0) * (1.0 / 300.0), + es("+proj=merc +ellps=GRS80 +rf=300"), 0.0); + assertEquals("size must still come from GRS80", + 6378137.0, a("+proj=merc +ellps=GRS80 +rf=300"), 0.0); + // gie: operation proj=utm zone=32 ellps=GRS80 rf=300 + expect("+proj=utm +zone=32 +ellps=GRS80 +rf=300", 12, 55, 691873.1212, 6099054.9661, MM_1); + // gie: the same answer via +f + expect("+proj=utm +zone=32 +ellps=GRS80 +f=0.00333333333333", + 12, 55, 691873.1212, 6099054.9661, MM_1); + } + + /** gie: {@code +ellps=GRS80 +b=6000000} and {@code +a=6400000 +b=6000000}. */ + @Test + public void gieSemiMinorAxisModifier() { + expect("+proj=utm +zone=32 +ellps=GRS80 +b=6000000", 12, 55, 699293.0880, 5674591.5295, MM_1); + expect("+proj=utm +zone=32 +a=6400000 +b=6000000", 12, 55, 700416.5900, 5669475.8884, MM_1); + } + + /** {@code +b} is derived in two steps via f, not as {@code 1 - b*b/(a*a)}. */ + @Test + public void semiMinorAxisUsesProjsTwoStepDerivation() { + double a = 6378137.0; + double b = 6356752.314245179; + double f = (a - b) / a; + assertEquals(2 * f - f * f, es("+proj=merc +a=" + a + " +b=" + b), 0.0); + } + + // ------------------------------------------------------------------ + // Validation (ellps_size / ellps_shape / pj_calc_ellipsoid_params) + // ------------------------------------------------------------------ + + /** Every rejection asserted by ellipsoid.gie's "fail deliberately" block. */ + @Test + public void gieDeliberateFailures() { + rejected("+proj=merc +a=-1"); + rejected("+proj=merc +a=1 +es=-1"); + rejected("+proj=merc +R=0"); + rejected("+proj=merc +R_a +a=2 +f=2"); + rejected("+proj=merc +a=1E77 +R_lat_a=90 +b=1"); + rejected("+proj=merc +ellps=GRS80000000000"); + } + + /** ellipsoid.gie's "Shape parameters" block, all six rejections. */ + @Test + public void gieShapeParameterFailures() { + rejected("+proj=utm +zone=32 +ellps=GRS80 +rf=0"); + rejected("+proj=utm +zone=32 +ellps=GRS80 +e=-0.5"); + rejected("+proj=utm +zone=32 +ellps=GRS80 +e=1"); + rejected("+proj=utm +zone=32 +ellps=GRS80 +es=1"); + rejected("+proj=utm +zone=32 +a=1 +es=1.1"); + rejected("+proj=utm +zone=32 +ellps=GRS80 +b=0"); + rejected("+proj=utm +zone=32 +ellps=GRS80 +f=1"); + } + + @Test + public void negativeAndZeroSizesAreRejected() { + rejected("+proj=merc +R=-1"); + rejected("+proj=merc +a=0"); + rejected("+proj=merc +a=Infinity"); + } + + @Test + public void negativeFlatteningIsRejected() { + assertTrue(rejected("+proj=merc +a=6400000 +f=-0.1").getMessage().contains("f")); + assertTrue(rejected("+proj=merc +a=6400000 +rf=-297").getMessage().contains("rf")); + } + + /** + * The NaN-safe {@code !(es >= 0)} guard. This is the whole {@code +rf} + * corpus class: {@code +rf=298.257...} used to yield {@code es = -88367}, + * which reached the projection and produced {@code (correct_x, NaN)} or, via + * the geocentric route, a plausible coordinate half a megametre out. + */ + @Test + public void impossibleEccentricityIsRejectedRatherThanPropagated() { + // What PROJ4J's old +f meant: an inverse flattening in the +f slot + assertEquals("Invalid eccentricity", + rejected("+proj=merc +a=6378137.0 +f=298.257222101").getMessage()); + assertEquals("Invalid eccentricity", + rejected("+proj=tmerc +a=6377397.155 +f=299.1528128").getMessage()); + } + + /** {@code b > a} gives a negative flattening, hence a negative es. */ + @Test + public void prolateEllipsoidIsRejected() { + rejected("+proj=merc +a=6000000 +b=6378137"); + } + + /** + * {@code +b} with no major axis used to give {@code es = 1 - b*b/NaN} and + * then silently fall all the way through to {@code Datum.WGS84}. + */ + @Test + public void semiMinorAxisWithoutMajorAxisIsRejected() { + assertEquals("Major axis not given", + rejected("+proj=merc +b=6000000").getMessage()); + } + + /** Every shape key suppresses PROJ's implicit ellps, so all of them need a size. */ + @Test + public void shapeWithoutSizeIsRejected() { + assertEquals("Major axis not given", rejected("+proj=merc +rf=297").getMessage()); + assertEquals("Major axis not given", rejected("+proj=merc +f=0.003").getMessage()); + assertEquals("Major axis not given", rejected("+proj=merc +es=0.006").getMessage()); + assertEquals("Major axis not given", rejected("+proj=merc +e=0.08").getMessage()); + } + + /** ...but {@code +datum=} supplies one, because PROJ appends the datum's ellps. */ + @Test + public void datumSuppliesTheMajorAxisForAShapeModifier() { + CoordinateReferenceSystem c = crs("+proj=tmerc +datum=potsdam +rf=299.1528128"); + assertNotNull(c); + } + + /** Malformed numbers must be a Proj4jException, not a bare NumberFormatException. */ + @Test + public void malformedNumbersRaiseProj4jExceptions() { + rejected("+proj=merc +a=six-million"); + rejected("+proj=merc +a=6400000 +rf=three-hundred"); + } + + // ------------------------------------------------------------------ + // No shape parameter means a sphere + // ------------------------------------------------------------------ + + /** + * {@code ellps_shape}: "Not giving a shape parameter means selecting a + * sphere". {@code +a=} alone used to yield {@code Datum.WGS84}, because + * {@code isDefinedExplicitly()} required both a and es. + */ + @Test + public void majorAxisAloneDescribesASphere() { + assertEquals(0.0, es("+proj=merc +a=6400000"), 0.0); + assertEquals(6400000.0, a("+proj=merc +a=6400000"), 0.0); + expect("+proj=merc +a=6400000", 1, 2, 111701.0721276371, 223447.5262032605, NM_10); + } + + /** + * With nothing declared at all the default is GRS80, not WGS84. + * {@code init.cpp:362} appends {@code pj_mkparam("ellps=GRS80")} when none of + * {@code +ellps +datum +a +b +rf +f +e +es} is present. + *

+ * The two ellipsoids share a semi-major axis and differ only in the inverse + * flattening — 298.257222101 against 298.257223563 — so this went unnoticed + * everywhere except at sub-micrometre tolerance, where it was the sole + * reason {@code builtins.gie:7767} ({@code +proj=utm +zone=32}, tolerance 0.001 mm) + * missed by 124 µm of northing. + *

+ * Reference values from the installed PROJ 9.8.1: + *

+     * $ echo "2 1" | proj -f '%.9f' +proj=merc
+     * 222638.981586547  110579.965218250          # == +ellps=GRS80
+     * $ echo "2 1" | proj -f '%.9f' +proj=merc +ellps=WGS84
+     * 222638.981586547  110579.965221896          # differs in the 4th micrometre
+     * 
+ */ + @Test + public void noEllipsoidParametersDefaultsToGrs80NotWgs84() { + assertEquals(Ellipsoid.GRS80.getEquatorRadius(), a("+proj=merc"), 0.0); + assertEquals(Ellipsoid.GRS80.getEccentricitySquared(), es("+proj=merc"), 0.0); + + // Same axis, different flattening: only the northing can tell them apart. + assertEquals(Ellipsoid.WGS84.getEquatorRadius(), Ellipsoid.GRS80.getEquatorRadius(), 0.0); + assertFalse("GRS80 and WGS84 must not be conflated", + Ellipsoid.WGS84.getEccentricitySquared() + == Ellipsoid.GRS80.getEccentricitySquared()); + + expect("+proj=merc", 2, 1, 222638.981586547, 110579.965218250, 1e-8); + expect("+proj=merc +ellps=WGS84", 2, 1, 222638.981586547, 110579.965221896, 1e-8); + } + + /** + * The whole point: {@code builtins.gie:7767}. UTM zone 32 at (12, 56) to PROJ's own + * printed precision, with no ellipsoid declared. + */ + @Test + public void theImplicitEllipsoidIsPreciseEnoughForTheUtmCorpusRow() { + expect("+proj=utm +zone=32", 12, 56, 687071.43910944, 6210141.32674801, 1e-6); + } + + // ------------------------------------------------------------------ + // Spherification + // ------------------------------------------------------------------ + + /** + * ellipsoid.gie's spherification block. {@code setR_A} used to scale the + * semi-major axis but leave es, so the "sphere" kept GRS80's eccentricity. + */ + @Test + public void gieSpherification() { + expect("+proj=merc +ellps=GRS80 +R_A", 12, 55, 1334340.6237297705, 7353636.6296552019, NM_10); + expect("+proj=merc +ellps=GRS80 +R_V", 12, 55, 1334339.2852675652, 7353629.2533042720, NM_10); + expect("+proj=merc +ellps=GRS80 +R_a", 12, 55, 1333594.4904527504, 7349524.6413825499, NM_10); + expect("+proj=merc +ellps=GRS80 +R_g", 12, 55, 1333592.6102291327, 7349514.2793497816, NM_10); + expect("+proj=merc +ellps=GRS80 +R_h", 12, 55, 1333590.7300081658, 7349503.9173316229, NM_10); + expect("+proj=merc +ellps=GRS80 +R_lat_a=60", 12, 55, 1338073.7436268919, 7374210.0924803326, NM_10); + expect("+proj=merc +ellps=GRS80 +R_lat_g=60", 12, 55, 1338073.2696101593, 7374207.4801437631, NM_10); + } + + @Test + public void spherificationZeroesTheShape() { + for (String key : new String[]{"R_A", "R_V", "R_a", "R_g", "R_h", "R_lat_a=45", "R_lat_g=45", "R_C"}) { + String def = "+proj=merc +ellps=GRS80 +" + key; + assertEquals(def + " must be a sphere", 0.0, es(def), 0.0); + assertFalse(def + " must still have a radius", Double.isNaN(a(def))); + } + } + + /** Only the first spherification key takes effect. */ + @Test + public void firstSpherificationParameterWins() { + assertEquals(a("+proj=merc +ellps=GRS80 +R_A"), + a("+proj=merc +ellps=GRS80 +R_A +R_h"), 0.0); + assertEquals(a("+proj=merc +ellps=GRS80 +R_V"), + a("+proj=merc +ellps=GRS80 +R_V +R_h"), 0.0); + } + + /** {@code R_lat_a}/{@code R_lat_g} require |lat| <= 90. */ + @Test + public void spherificationLatitudeIsRangeChecked() { + rejected("+proj=merc +ellps=GRS80 +R_lat_a=91"); + rejected("+proj=merc +ellps=GRS80 +R_lat_g=-91"); + } + + /** + * {@code +R_C} (PROJ 9.3.0+) is the conformal sphere radius at latitude 0, so it does + * not depend on {@code +lat_0} and always reduces to {@code +R_lat_g=0}, i.e. to the + * semi-minor axis. + * + *

This assertion was INVERTED, and the inverted form is the surprising one

+ * + *

It used to assert that {@code +R_C} varies with {@code +lat_0} and equals + * {@code +R_lat_g=lat_0}, which is what {@code ell_set.cpp}'s own comment says — "taken + * at a latitude that is phi0 (note: at least for mercator...)". The comment describes an intent + * the code does not implement. {@code pj_init} calls {@code pj_ellipsoid} at + * {@code init.cpp:566} and does not assign + * {@code PIN->phi0 = pj_param(ctx, start, "rlat_0").f} until {@code init.cpp:651}, 85 lines + * later, on a {@code calloc}'d {@code PJ} — so {@code P->phi0} is 0 at spherification + * time and {@code a *= sqrt(1 - es) / (1 - es sin^2(0))} is just {@code a * sqrt(1 - es)}, the + * semi-minor axis. + * + *

The corpus was generated by the code, not by the comment. + * {@code builtins.gie:4350} is {@code +proj=merc +R_C +ellps=WGS84 +lat_0=45} at {@code (2, 49)} + * and expects {@code 221892.515234695253}, which is {@code 6356752.314245179 * 2} degrees + * — WGS84's {@code b}, to every printed digit. Honouring {@code +lat_0=45} gives + * {@code 222637.726003700}, wrong by 745 m. So the previous behaviour was more defensible + * and less correct, which is the whole reason this pin is inverted rather than deleted: + * anyone who "fixes" it must first re-pin that corpus row against a PROJ release that has fixed + * it upstream. + * + *

{@code DatumParameters.setR_C(double phi0)} still takes the latitude — the formula + * is right and matches {@code ell_set.cpp} case 7 exactly. Only the value {@code pj_init} + * supplies for it is 0, and that is what {@code Proj4Parser} now passes. + */ + @Test + public void conformalSphereRadiusIgnoresLatitudeOfOrigin() { + double atZero = a("+proj=merc +ellps=GRS80 +R_C"); + double at60 = a("+proj=merc +ellps=GRS80 +lat_0=60 +R_C"); + assertEquals("+R_C must NOT vary with +lat_0: pj_ellipsoid runs 85 lines before phi0 is " + + "assigned, so P->phi0 is still 0. See this method's javadoc.", atZero, at60, 0.0); + assertEquals("+R_C is +R_lat_g at latitude 0, which is the semi-minor axis", + a("+proj=merc +ellps=GRS80 +R_lat_g=0"), atZero, 0.0); + assertEquals("+R_C on GRS80 is GRS80's b", Ellipsoid.GRS80.getB(), atZero, 1e-6); + assertNotEquals("+R_C is NOT +R_lat_g=lat_0; that is the reading the ell_set.cpp comment " + + "invites and the corpus refutes", + a("+proj=merc +ellps=GRS80 +R_lat_g=60"), atZero, 1.0); + } + + /** + * Spherification keys do not suppress PROJ's implicit ellipsoid, so + * a bare {@code +R_A} still has something to spherify. + */ + @Test + public void spherificationWithoutAnExplicitEllipsoidUsesTheDefault() { + double es = Ellipsoid.GRS80.getEccentricitySquared(); + double expected = Ellipsoid.GRS80.getEquatorRadius() + * (1. - es * (1 / 6.0 + es * (17 / 360.0 + es * (67 / 3024.0)))); + assertEquals(expected, a("+proj=merc +R_A"), 1e-9); + assertEquals(0.0, es("+proj=merc +R_A"), 0.0); + // PROJ 9.8.1: echo "2 1" | proj -f '%.9f' +proj=merc +R_A + expect("+proj=merc +R_A", 2, 1, 222390.103954962, 111200.697732406, 1e-8); + } + + /** + * The four ellipsoids present in PROJ 9.8.1's {@code src/ellps.cpp} that were absent here, so + * that {@code +ellps=} threw {@code InvalidValueException: Unknown ellipsoid} for all of + * them: {@code clrk80ign}, {@code danish}, {@code GSK2011}, {@code PZ90}. + * + *

Why this test exists, and why its absence was itself a finding

+ * + * When those four were added, they were put into {@code Ellipsoid.ellipsoids} only — and + * {@code +ellps=} does not read that array. {@code Registry.getEllipsoid} searches + * {@code Registry.ellipsoids}, a separate list that had already drifted apart from it. + * So the constants existed, the names still threw, and three WKT/PROJJSON tests broke for an + * unrelated-looking reason: {@code io/wkt/WktNames} matches ellipsoids numerically against + * {@code Ellipsoid.ellipsoids}, so growing that array changed what the writer emitted + * without making anything resolvable. + * + *

An A/B later removed all four entries again and no test failed. The symptom had been + * fixed and the defect was still uncovered. This is that missing net: it asserts the names + * resolve, which is the property a user actually depends on. + * + *

Values are digit-for-digit from {@code 9.8.1:src/ellps.cpp} — never re-derived. Five + * separate defects in this project have been rounded or re-derived constants. + */ + @Test + public void theFourAddedEllipsoidsResolveByName() { + CRSFactory f = new CRSFactory(); + String[] names = { "clrk80ign", "danish", "GSK2011", "PZ90" }; + double[] majors = { 6378249.2, 6377019.2563, 6378136.5, 6378136.0 }; + for (int i = 0; i < names.length; i++) { + CoordinateReferenceSystem crs = + f.createFromParameters("t", "+proj=longlat +ellps=" + names[i] + " +no_defs"); + Ellipsoid e = crs.getDatum().getEllipsoid(); + assertNotNull("+ellps=" + names[i] + " must resolve", e); + assertEquals("+ellps=" + names[i] + " equator radius", majors[i], e.equatorRadius, 1e-9); + assertNotEquals("+ellps=" + names[i] + " must not silently fall back to a default", + Ellipsoid.WGS84.equatorRadius, e.equatorRadius, 1e-9); + } + } + + /** + * The positive control for the test above: a name that is genuinely absent must still throw. + * Without this, {@code theFourAddedEllipsoidsResolveByName} could pass against an + * implementation that resolved everything to a default — which is exactly the failure + * mode {@code Units.findUnits} has, returning metres for any unrecognised unit name. + */ + @Test + public void agenuinelyUnknownEllipsoidNameStillThrows() { + try { + new CRSFactory().createFromParameters("t", + "+proj=longlat +ellps=no_such_ellipsoid_name +no_defs"); + fail("an unknown +ellps= name must not silently resolve"); + } catch (Proj4jException expected) { + assertTrue(expected.getMessage(), expected.getMessage().toLowerCase().contains("ellipsoid")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/LinearUnitParsingTest.java b/core/src/test/java/org/locationtech/proj4j/parser/LinearUnitParsingTest.java new file mode 100644 index 0000000..24c343f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/LinearUnitParsingTest.java @@ -0,0 +1,341 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.units.Unit; +import org.locationtech.proj4j.units.Units; + +/** + * {@code +units} / {@code +to_meter}, against PROJ 9.8.1. + * + *

Reference values

+ * + *

Every expected easting/northing below was produced by the installed PROJ 9.8.1 + * ({@code Rel. 9.8.1, April 10th, 2026}): + * + *

+ * $ echo "2 1" | proj -f '%.9f' +proj=merc +ellps=GRS80 <more params>
+ * 
+ * + *

These are projected metres (or the stated linear unit), compared per + * ordinate. No angular tolerance is involved anywhere in this file. + * + *

The rule being pinned

+ * + *

{@code init.cpp:678-714} resolves the linear unit exactly once. If {@code +units} + * is present it is looked up in {@code pj_list_linear_units()} and that table + * entry's {@code to_meter} string is what gets parsed — {@code +to_meter} is never + * read at all. Only in the absence of {@code +units} does {@code +to_meter} apply. + * Proj4J used to apply {@code +units} and then overwrite it with {@code +to_meter}, so + * {@code +to_meter} won: exactly inverted, and silent. + */ +public class LinearUnitParsingTest { + + /** PROJ printed 9 decimals; 1e-6 of the stated unit is far inside that. */ + private static final double TOL = 1e-6; + + private static final String MERC = "+proj=merc +ellps=GRS80"; + + /** {@code +proj=merc +ellps=GRS80} at (2, 1), in metres. */ + private static final double METRE_X = 222638.981586547; + private static final double METRE_Y = 110579.965218250; + + /** The same, in U.S. survey feet ({@code +units=us-ft}). */ + private static final double US_FOOT_X = 730441.392088531; + private static final double US_FOOT_Y = 362794.435886874; + + /** The same, in international feet — {@code +to_meter=0.3048}. */ + private static final double INTL_FOOT_X = 730442.852974236; + private static final double INTL_FOOT_Y = 362795.161477197; + + private final CRSFactory crsFactory = new CRSFactory(); + + private CoordinateReferenceSystem crs(String def) { + return crsFactory.createFromParameters("test", def); + } + + private ProjCoordinate project(String def, double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(Double.NaN, Double.NaN); + crs(def).getProjection().project(new ProjCoordinate(lon, lat), out); + return out; + } + + private void expect(String def, double x, double y) { + ProjCoordinate out = project(def, 2, 1); + assertEquals(def + " easting", x, out.x, TOL); + assertEquals(def + " northing", y, out.y, TOL); + } + + private InvalidValueException rejected(String def) { + try { + crs(def); + } catch (InvalidValueException e) { + return e; + } catch (Proj4jException e) { + fail("expected InvalidValueException for [" + def + "] but got " + e); + } + fail("expected [" + def + "] to be rejected"); + return null; + } + + // ------------------------------------------------------------------ + // +units beats +to_meter, in either order + // ------------------------------------------------------------------ + + /** + * The discriminating pair: the U.S. survey foot and the international foot differ in + * the 7th significant figure, so which one won is unambiguous from the number. + */ + @Test + public void unitsWinsOverToMeterWhateverTheOrder() { + expect(MERC + " +units=us-ft +to_meter=0.3048", US_FOOT_X, US_FOOT_Y); + expect(MERC + " +to_meter=0.3048 +units=us-ft", US_FOOT_X, US_FOOT_Y); + + // ...and the control: without +units, +to_meter is what applies. + expect(MERC + " +to_meter=0.3048", INTL_FOOT_X, INTL_FOOT_Y); + } + + /** + * {@code +units} must win even when the {@code +to_meter} it displaces is absurd. + * Under the old ordering this returned the metre values scaled by 1e-9. + */ + @Test + public void unitsWinsOverAToMeterThatWouldDominateTheResult() { + expect(MERC + " +units=us-ft +to_meter=1e9", US_FOOT_X, US_FOOT_Y); + } + + /** {@code getUnits()} must report the unit actually in force. */ + @Test + public void theReportedUnitIsTheOneThatWon() { + assertSame(Units.US_FEET, crs(MERC + " +to_meter=0.3048 +units=us-ft") + .getProjection().getUnits()); + // +to_meter alone names no unit, so the accessor's metres default stands - + // which is a pre-existing wart, not a claim that the scale is 1. + assertSame(Units.METRES, crs(MERC + " +to_meter=0.3048").getProjection().getUnits()); + } + + /** Duplicate keys: the first occurrence wins, for these two as for every other. */ + @Test + public void theFirstOccurrenceOfADuplicatedUnitKeyWins() { + expect(MERC + " +to_meter=0.3048 +to_meter=1", INTL_FOOT_X, INTL_FOOT_Y); + expect(MERC + " +units=us-ft +units=m", US_FOOT_X, US_FOOT_Y); + expect(MERC + " +units=m +units=us-ft", METRE_X, METRE_Y); + } + + // ------------------------------------------------------------------ + // +to_meter accepts a num/den ratio + // ------------------------------------------------------------------ + + /** + * {@code init.cpp:690-710}: {@code pj_strtod} stops at a {@code '/'}, and the + * remainder is read as a denominator. PROJ's own unit table uses that syntax — + * {@code dm} is {@code "1/10"} and {@code us-in} is {@code "1/39.37"} — so it is not + * an exotic corner. Proj4J used bare {@code Double.parseDouble} and threw. + */ + @Test + public void toMeterAcceptsARatio() { + expect(MERC + " +to_meter=3048/10000", INTL_FOOT_X, INTL_FOOT_Y); + expect(MERC + " +to_meter=1/3.2808398950131235", INTL_FOOT_X, INTL_FOOT_Y); + expect(MERC + " +to_meter=1/1", METRE_X, METRE_Y); + // 1/10 is exactly how PROJ's table spells the decimetre. + expect(MERC + " +to_meter=1/10", METRE_X * 10, METRE_Y * 10); + } + + /** A zero denominator is an error upstream, not a division by zero. */ + @Test + public void aZeroDenominatorIsRejected() { + assertTrue(rejected(MERC + " +to_meter=1/0").getMessage().contains("to_meter")); + assertTrue(rejected(MERC + " +to_meter=1/0.0").getMessage().contains("to_meter")); + } + + /** {@code to_meter <= 0} is an error ({@code init.cpp:706}). */ + @Test + public void aNonPositiveToMeterIsRejected() { + rejected(MERC + " +to_meter=0"); + rejected(MERC + " +to_meter=-0.3048"); + rejected(MERC + " +to_meter=-1/2"); + rejected(MERC + " +to_meter=nonsense"); + } + + // ------------------------------------------------------------------ + // What the linear unit does NOT touch + // ------------------------------------------------------------------ + + /** + * {@code +x_0} and {@code +y_0} are always metres + * ({@code init.cpp:660-661}, a plain {@code "d"} lookup with no unit involvement). + * The output affine is {@code fr_meter * (a*x + x_0)} ({@code fwd.cpp:143-146}), so + * the false easting is converted with the coordinate on the way out, never + * interpreted as the declared unit on the way in. + *

+ * If {@code +x_0=500000} were read as 500000 U.S. feet, the easting would come out + * near 1230441 rather than 2370858 — so the two readings are far apart. + */ + @Test + public void unitsDoesNotChangeWhatXZeroAndYZeroMean() { + expect(MERC + " +units=us-ft +x_0=500000", 2370858.058755198, US_FOOT_Y); + expect(MERC + " +units=km +x_0=500000 +y_0=200000", 722.638981587, 310.579965218); + expect(MERC + " +x_0=500000 +y_0=200000", METRE_X + 500000, METRE_Y + 200000); + + // +to_meter must behave identically: km and to_meter=1000 are the same thing. + expect(MERC + " +to_meter=1000 +x_0=500000 +y_0=200000", 722.638981587, 310.579965218); + } + + /** + * {@code +a} and {@code +b} are always metres too. A sphere of 6400000 metres + * projected into U.S. feet is 732945.2 ft; a sphere of 6400000 feet would be + * a third of that. + */ + @Test + public void unitsDoesNotChangeWhatAAndBMean() { + expect("+proj=merc +a=6400000", 223402.144255274, 111706.743574944); + expect("+proj=merc +a=6400000 +units=us-ft", 732945.201610846, 366491.207878797); + assertEquals("the parsed semi-major axis is unaffected by +units", + 6400000.0, + crs("+proj=merc +a=6400000 +units=us-ft").getDatum().getEllipsoid() + .getEquatorRadius(), + 0.0); + } + + // ------------------------------------------------------------------ + // The unit table itself + // ------------------------------------------------------------------ + + /** + * All 21 of PROJ's linear unit ids must now resolve. Four were declared in + * {@code Units} but missing from the lookup array ({@code fath}, {@code ch}, + * {@code link}, {@code us-ch}) and the three Indian units were absent altogether — + * and because {@code findUnits} substitutes metres rather than returning null, every + * one of them silently scaled by 1. + */ + @Test + public void everyLinearUnitProjHasResolves() { + String[] ids = { + "km", "m", "dm", "cm", "mm", "kmi", "in", "ft", "yd", "mi", + "fath", "ch", "link", + "us-in", "us-ft", "us-yd", "us-ch", "us-mi", + "ind-yd", "ind-ft", "ind-ch", + }; + List unresolved = new ArrayList(); + for (String id : ids) { + if (!Units.isKnownUnit(id)) { + unresolved.add(id); + } + } + assertTrue("PROJ linear units Proj4J still cannot resolve: " + unresolved, + unresolved.isEmpty()); + assertEquals("Units.LINEAR_UNITS must be PROJ's table, no more and no less", + ids.length, Units.LINEAR_UNITS.length); + } + + /** + * The scale each newly reachable unit applies, checked against PROJ rather than + * against the constant in {@code Units} — otherwise a wrong constant would agree + * with itself. + */ + @Test + public void theNewlyReachableUnitsScaleAsProjDoes() { + expect(MERC + " +units=fath", 121740.475495706, 60465.860246199); + expect(MERC + " +units=ch", 11067.315954155, 5496.896386018); + expect(MERC + " +units=link", 1106731.595415509, 549689.638601813); + expect(MERC + " +units=us-ch", 11067.293819523, 5496.885392225); + expect(MERC + " +units=ind-yd", 243482.221125046, 120932.351340295); + expect(MERC + " +units=ind-ft", 730446.663375137, 362797.054020884); + expect(MERC + " +units=ind-ch", 11067.373687502, 5496.925060922); + } + + /** + * {@code ind-ft} and {@code us-ft} differ by about 7 parts per million, and + * {@code ch}/{@code us-ch}/{@code ind-ch} by similar amounts. Since the old + * behaviour was to return metres for all of them, this asserts they are now + * distinct from each other and from metres — the property a per-value check alone + * would not establish. + */ + @Test + public void theNewUnitsAreDistinctFromMetresAndFromEachOther() { + String[] ids = {"fath", "ch", "link", "us-ch", "ind-yd", "ind-ft", "ind-ch"}; + for (String id : ids) { + Unit unit = Units.findUnits(id); + assertFalse(id + " must no longer fall back to metres", unit == Units.METRES); + assertEquals(id, unit.abbreviation); + } + assertFalse("ind-ft and us-ft must not be the same unit", + Units.findUnits("ind-ft").value == Units.findUnits("us-ft").value); + assertFalse("ch and us-ch must not be the same unit", + Units.findUnits("ch").value == Units.findUnits("us-ch").value); + assertFalse("ch and ind-ch must not be the same unit", + Units.findUnits("ch").value == Units.findUnits("ind-ch").value); + } + + /** + * The angular ids are not {@code +units} names. PROJ resolves {@code +units} + * against {@code pj_list_linear_units()} only, so {@code +units=rad} is + * {@code "Invalid value for units"} upstream — verified: + *

+     * $ echo "2 1" | proj +proj=merc +ellps=GRS80 +units=rad
+     * merc: Invalid value for units
+     * 
+ * They must therefore stay out of the {@code +units} lookup, or Proj4J would accept + * definitions PROJ rejects. + */ + @Test + public void angularUnitIdsAreNotLinearUnitNames() { + assertFalse("+units=rad must not resolve", Units.isKnownUnit("rad")); + assertFalse("+units=grad must not resolve", Units.isKnownUnit("grad")); + for (Unit unit : Units.LINEAR_UNITS) { + assertFalse("the linear table must not contain " + unit.abbreviation, + unit == Units.RADIANS || unit == Units.GRADS); + } + // ...but the constants exist, so a unitconvert-style caller can reach them. + assertEquals(3, Units.ANGULAR_UNITS.length); + assertEquals(0.9, Units.GRADS.value, 0.0); + } + + /** STRICT mode turns the silent metres fallback into an error, for the new ids too. */ + @Test + public void strictModeStillRejectsWhatProjRejects() { + Proj4Parser strict = new Proj4Parser(new org.locationtech.proj4j.Registry(), + Proj4Parser.ParseMode.STRICT); + for (String bad : new String[]{"rad", "grad", "furlong", "point", "min"}) { + try { + strict.parse("t", (MERC + " +units=" + bad).split(" ")); + fail("STRICT must reject +units=" + bad); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains(bad)); + } + } + for (String good : new String[]{"fath", "ch", "link", "us-ch", "ind-yd", "ind-ft", "ind-ch"}) { + assertSame(good, Units.findUnits(good), + strict.parse("t", (MERC + " +units=" + good).split(" ")) + .getProjection().getUnits()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/OperatorScopedParameterTest.java b/core/src/test/java/org/locationtech/proj4j/parser/OperatorScopedParameterTest.java new file mode 100644 index 0000000..dd998f1 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/OperatorScopedParameterTest.java @@ -0,0 +1,532 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.PeirceQuincuncialProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpilhausProjection; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The five operator-scoped parameters of the {@code adams.cpp}/{@code spilhaus.cpp} family, as + * seen from the parser: {@code +shape}, {@code +scrollx}, {@code +scrolly} on {@code peirce_q}, + * and {@code +azi}, {@code +rot} on {@code spilhaus}. + * + *

Why this file exists

+ * + *

{@code Proj4Parser} used to have no dispatch for any of them. In + * {@link Proj4Parser.ParseMode#PROJ_COMPATIBLE} an unrecognised key is retained and ignored — + * which is what {@code init.cpp} does and is correct — so {@code +proj=peirce_q +shape=square} + * parsed cleanly and then projected as a diamond. A silent wrong answer for every one of + * {@code peirce_q.gie}'s 29 blocks. {@link #squareAndDiamondProduceDifferentOutput()} is the + * regression net for exactly that defect: it does not inspect the shape, it measures the + * coordinates, so a dispatch that is deleted or short-circuited cannot pass it. + * + *

The dispatch is per-projection, deliberately

+ * + *

None of the five is universal, so they are routed on the concrete class in the same way + * {@code +zone} already was, and are ignored on any other projection — which is also what PROJ + * does, since {@code pj_param} is pull-based and only {@code peirce_q} and {@code spilhaus} ask. + * + *

The scroll asymmetry is upstream's, and is not to be tidied up

+ * + *

{@code pj_adams_setup} reads {@code +scrollx} only inside the {@code horizontal} + * branch and {@code +scrolly} only inside the {@code vertical} branch + * ({@code adams.cpp:420-447}). Two consequences, both asserted below, both of which look like + * bugs and will otherwise be "fixed" by someone: + * + *

    + *
  • {@code +shape=vertical +scrollx=0.5} ignores {@code scrollx}. Not an error, not + * applied. + *
  • the {@code [-1, 1]} range check lives inside the same branch, so + * {@code +shape=vertical +scrollx=5} is not an error either, while + * {@code +shape=horizontal +scrollx=5} is. + *
+ */ +public class OperatorScopedParameterTest { + + private final CRSFactory factory = new CRSFactory(); + + private Projection projection(String definition) { + return factory.createFromParameters("test", definition).getProjection(); + } + + private PeirceQuincuncialProjection peirceQ(String definition) { + return (PeirceQuincuncialProjection) projection(definition); + } + + private SpilhausProjection spilhaus(String definition) { + return (SpilhausProjection) projection(definition); + } + + // -------------------------------------------------------------------------------- +shape + + /** + * The regression net for the silent-default defect. Measured, not introspected: if + * {@code +shape} stops reaching the projection, both definitions become the default diamond + * and the two outputs become identical. + * + *

{@code square} is {@code diamond} rotated 45 degrees ({@code adams.cpp:270-274}), so the + * two disagree everywhere except where the fold puts a point on the rotation centre. The + * expected magnitudes here come from the rotation itself, not from a transcription: for the + * diamond image {@code (x, y)} the square image is + * {@code (RSQRT2*(x - y), RSQRT2*(x + y))}. + */ + @Test + public void squareAndDiamondProduceDifferentOutput() { + Projection square = projection("+proj=peirce_q +R=6370997 +shape=square"); + Projection diamond = projection("+proj=peirce_q +R=6370997 +shape=diamond"); + + ProjCoordinate s = new ProjCoordinate(); + ProjCoordinate d = new ProjCoordinate(); + square.project(new ProjCoordinate(20, 40), s); + diamond.project(new ProjCoordinate(20, 40), d); + + double separation = Math.hypot(s.x - d.x, s.y - d.y); + assertTrue("+shape=square and +shape=diamond must not produce the same coordinate; " + + "square=" + s + " diamond=" + d, + separation > 1000.0); + + // And the difference is the 45-degree rotation, not noise. + double rsqrt2 = Math.sqrt(0.5); + assertEquals(rsqrt2 * (d.x - d.y), s.x, 1e-6); + assertEquals(rsqrt2 * (d.x + d.y), s.y, 1e-6); + } + + /** All six {@code +shape} names arrive, and each yields a distinct arrangement. */ + @Test + public void allSixShapesArriveAndAreDistinct() { + for (PeirceQuincuncialProjection.Shape shape : PeirceQuincuncialProjection.Shape.values()) { + assertEquals(shape, peirceQ("+proj=peirce_q +R=6370997 +shape=" + + shape.parameterValue()).getShape()); + } + } + + /** No {@code +shape} means {@code diamond}, not {@code square} ({@code adams.cpp:408-410}). */ + @Test + public void absentShapeMeansDiamond() { + assertEquals(PeirceQuincuncialProjection.Shape.DIAMOND, + peirceQ("+proj=peirce_q +R=6370997").getShape()); + } + + /** {@code adams.cpp:448-453}: anything outside the six fails the whole setup. */ + @Test + public void anUnknownShapeIsARejection() { + for (String value : new String[] {"hemisphere", "SQUARE", "rectangle", ""}) { + try { + peirceQ("+proj=peirce_q +R=6370997 +shape=" + value); + fail("+shape=" + value + " must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("shape")); + } + } + } + + /** + * A valueless {@code +shape} is a rejection too, not a silent default: {@code pj_param} type + * {@code 's'} hands the empty string to {@code strcmp} ({@code param.cpp:174-192}), which + * matches none of the six. + */ + @Test + public void aValuelessShapeIsARejection() { + try { + peirceQ("+proj=peirce_q +R=6370997 +shape"); + fail("a bare +shape must be rejected rather than defaulting to diamond"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("shape")); + } + } + + /** + * First-match-wins, the same rule as every other key: {@code pj_param_exists} returns the + * first occurrence, so the second {@code +shape} is dead. + */ + @Test + public void aDuplicateShapeTakesTheFirstOccurrence() { + assertEquals(PeirceQuincuncialProjection.Shape.SQUARE, + peirceQ("+proj=peirce_q +R=6370997 +shape=square +shape=vertical").getShape()); + } + + /** + * {@code +shape} on any other projection is retained and ignored — PROJ-faithful, because + * nothing but {@code peirce_q} pulls it. + */ + @Test + public void shapeIsIgnoredOnEveryOtherProjection() { + assertNotNull(projection("+proj=merc +R=6370997 +shape=square")); + assertNotNull(projection("+proj=guyou +R=6370997 +shape=not_a_shape")); + assertNotNull(projection("+proj=adams_ws2 +R=6370997 +scrollx=99")); + } + + // ------------------------------------------------------------- +scrollx / +scrolly asymmetry + + /** {@code +scrollx} on {@code horizontal} is read and applied. */ + @Test + public void scrollXIsReadOnHorizontal() { + PeirceQuincuncialProjection p = + peirceQ("+proj=peirce_q +R=6370997 +shape=horizontal +scrollx=0.75"); + assertEquals(0.75, p.getScrollX(), 0.0); + assertEquals(0.0, p.getScrollY(), 0.0); + + // And it moves the map: the shift is scrollx * shd * 2, in unit-sphere units, scaled by R. + ProjCoordinate plain = new ProjCoordinate(); + ProjCoordinate scrolled = new ProjCoordinate(); + projection("+proj=peirce_q +R=6370997 +shape=horizontal") + .project(new ProjCoordinate(20, 40), plain); + p.project(new ProjCoordinate(20, 40), scrolled); + assertTrue("+scrollx=0.75 must move the horizontal arrangement; plain=" + plain + + " scrolled=" + scrolled, + Math.abs(scrolled.x - plain.x) > 1000.0); + assertEquals("scrolling x must not move y", plain.y, scrolled.y, 0.0); + } + + /** {@code +scrolly} on {@code vertical} is read and applied. */ + @Test + public void scrollYIsReadOnVertical() { + PeirceQuincuncialProjection p = + peirceQ("+proj=peirce_q +R=6370997 +shape=vertical +scrolly=-0.25"); + assertEquals(-0.25, p.getScrollY(), 0.0); + assertEquals(0.0, p.getScrollX(), 0.0); + + ProjCoordinate plain = new ProjCoordinate(); + ProjCoordinate scrolled = new ProjCoordinate(); + projection("+proj=peirce_q +R=6370997 +shape=vertical") + .project(new ProjCoordinate(20, 40), plain); + p.project(new ProjCoordinate(20, 40), scrolled); + assertTrue("+scrolly=-0.25 must move the vertical arrangement", + Math.abs(scrolled.y - plain.y) > 1000.0); + assertEquals("scrolling y must not move x", plain.x, scrolled.x, 0.0); + } + + /** + * The asymmetry, part one. {@code +scrollx} off {@code horizontal} is silently + * ignored, because {@code pj_adams_setup} never looks for it outside that branch. Same for + * {@code +scrolly} off {@code vertical}. This is upstream's behaviour and the corpus was + * generated against it — do not "regularise" it. + */ + @Test + public void theWrongScrollForTheShapeIsSilentlyIgnored() { + assertEquals("+scrollx is invisible to +shape=vertical", 0.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=vertical +scrollx=0.5").getScrollX(), + 0.0); + assertEquals("+scrolly is invisible to +shape=horizontal", 0.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=horizontal +scrolly=0.5").getScrollY(), + 0.0); + assertEquals("neither scroll is read by +shape=square", 0.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=square +scrollx=0.5 +scrolly=0.5") + .getScrollX(), 0.0); + assertEquals(0.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=diamond +scrollx=0.5 +scrolly=0.5") + .getScrollY(), 0.0); + assertEquals("no +shape means diamond, so no scroll is read", 0.0, + peirceQ("+proj=peirce_q +R=6370997 +scrollx=0.5").getScrollX(), 0.0); + } + + /** + * The asymmetry, part two. The {@code [-1, 1]} check lives inside the same branch as + * the read, so an out-of-range value is a hard error on its own shape and not even an + * error on any other. It looks like an upstream oversight; it is nonetheless the + * contract. + */ + @Test + public void theRangeCheckIsScopedToTheOwningShapeToo() { + try { + peirceQ("+proj=peirce_q +R=6370997 +shape=horizontal +scrollx=1.0000001"); + fail("|scrollx| > 1 must be rejected on +shape=horizontal"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("scrollx")); + } + try { + peirceQ("+proj=peirce_q +R=6370997 +shape=vertical +scrolly=-1.0000001"); + fail("|scrolly| > 1 must be rejected on +shape=vertical"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("scrolly")); + } + + // ... and the same values are accepted, unread, off their own shape. + assertEquals(0.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=vertical +scrollx=5").getScrollX(), 0.0); + assertEquals(0.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=horizontal +scrolly=-5").getScrollY(), + 0.0); + } + + /** The bounds are inclusive ({@code scrollx > 1 || scrollx < -1}). */ + @Test + public void theScrollBoundsAreInclusive() { + assertEquals(1.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=horizontal +scrollx=1").getScrollX(), + 0.0); + assertEquals(-1.0, + peirceQ("+proj=peirce_q +R=6370997 +shape=vertical +scrolly=-1").getScrollY(), + 0.0); + } + + /** A scroll of exactly zero is a no-op, not a wrap through the same arithmetic. */ + @Test + public void aZeroScrollIsANoOp() { + ProjCoordinate plain = new ProjCoordinate(); + ProjCoordinate zero = new ProjCoordinate(); + projection("+proj=peirce_q +R=6370997 +shape=horizontal") + .project(new ProjCoordinate(20, 40), plain); + projection("+proj=peirce_q +R=6370997 +shape=horizontal +scrollx=0") + .project(new ProjCoordinate(20, 40), zero); + assertEquals(plain.x, zero.x, 0.0); + assertEquals(plain.y, zero.y, 0.0); + } + + // --------------------------------------------------------------------------- +azi and +rot + + /** Both reach {@code spilhaus}, and both change the projected coordinate. */ + @Test + public void aziAndRotReachSpilhausAndChangeTheOutput() { + SpilhausProjection defaulted = spilhaus("+proj=spilhaus +R=6378137"); + SpilhausProjection turned = spilhaus("+proj=spilhaus +R=6378137 +azi=9.1 +rot=40.1"); + + assertEquals(9.1 * ProjectionMath.DTR, turned.getAzi(), 0.0); + assertEquals(40.1 * ProjectionMath.DTR, turned.getRot(), 0.0); + + ProjCoordinate a = new ProjCoordinate(); + ProjCoordinate b = new ProjCoordinate(); + defaulted.project(new ProjCoordinate(10, -30), a); + turned.project(new ProjCoordinate(10, -30), b); + assertTrue("+azi/+rot must change the projected coordinate; default=" + a + " turned=" + b, + Math.hypot(a.x - b.x, a.y - b.y) > 1000.0); + } + + /** Absent, the upstream defaults stand ({@code spilhaus.cpp:145,147}). */ + @Test + public void absentAziAndRotKeepTheUpstreamDefaults() { + SpilhausProjection p = spilhaus("+proj=spilhaus +R=6378137"); + assertEquals(SpilhausProjection.DEFAULT_AZI_DEGREES * ProjectionMath.DTR, p.getAzi(), 0.0); + assertEquals(SpilhausProjection.DEFAULT_ROT_DEGREES * ProjectionMath.DTR, p.getRot(), 0.0); + } + + /** + * {@code +azi} and {@code +rot} are angles. Upstream reads both through + * {@code pj_param}'s {@code "r"} sigil, i.e. {@code dmstor} + * ({@code spilhaus.cpp:133-136}), so they must go through the DMS-capable angle parser and + * never through bare {@code Double.parseDouble} — which would throw on every form below. + * + *

{@code +alpha}, {@code +lonc}, {@code +gamma} and {@code +pm} are still parsed with + * {@code parseDouble} elsewhere in {@code Proj4Parser}; that is a known defect and this is + * deliberately not a sixth instance of it. + */ + @Test + public void aziAndRotGoThroughTheAngleParser() { + // DMS with minutes and seconds. + assertEquals(45.5 * ProjectionMath.DTR, + spilhaus("+proj=spilhaus +R=6378137 +azi=45d30'0\"").getAzi(), 1e-12); + // Degree-minute without a seconds quote. + assertEquals(45.5 * ProjectionMath.DTR, + spilhaus("+proj=spilhaus +R=6378137 +rot=45d30").getRot(), 1e-12); + // A trailing cardinal carries the sign. + assertEquals(-30.0 * ProjectionMath.DTR, + spilhaus("+proj=spilhaus +R=6378137 +azi=30W").getAzi(), 1e-12); + // PROJ's r/R radian suffix. + assertEquals(0.5, spilhaus("+proj=spilhaus +R=6378137 +rot=0.5r").getRot(), 1e-12); + // A plain decimal still works, and zero is a value, not "absent". + assertEquals(0.0, spilhaus("+proj=spilhaus +R=6378137 +azi=0 +rot=0").getAzi(), 0.0); + assertEquals(0.0, spilhaus("+proj=spilhaus +R=6378137 +azi=0 +rot=0").getRot(), 0.0); + } + + /** A value that is not an angle at all is a rejection, not a silent default. */ + @Test + public void aNonAngularAziIsARejection() { + try { + spilhaus("+proj=spilhaus +R=6378137 +azi=nonsense"); + fail("+azi=nonsense must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("azi")); + } + } + + /** {@code +azi}/{@code +rot} are invisible to every projection that is not {@code spilhaus}. */ + @Test + public void aziAndRotAreIgnoredOnEveryOtherProjection() { + assertNotNull(projection("+proj=merc +R=6378137 +azi=20")); + assertNotNull(projection("+proj=adams_ws2 +R=6378137 +azi=20 +rot=45")); + // Not even an unparseable angle is looked at off spilhaus, since nothing pulls it. + assertNotNull(projection("+proj=merc +R=6378137 +rot=nonsense")); + } + + // ------------------------------------------------------------------------------ strictness + + /** + * All five are in {@code Proj4Keyword.supportedParameters()}, so + * {@link Proj4Parser.ParseMode#STRICT} accepts the corpus's definitions instead of throwing + * {@code UnsupportedParameterException}. The conformance bridge's capability table is + * asserted against the same set, which is why the three files move together. + */ + @Test + public void strictModeAcceptsAllFive() { + for (String key : new String[] {"shape", "scrollx", "scrolly", "azi", "rot"}) { + assertTrue("+" + key, Proj4Keyword.supportedParameters().contains(key)); + } + Proj4Parser strict = new Proj4Parser(new Registry(), Proj4Parser.ParseMode.STRICT); + assertNotNull(strict.parse("p", + "+proj=peirce_q +R=6370997 +shape=horizontal +scrollx=0.75".split("\\s+"))); + assertNotNull(strict.parse("p", + "+proj=peirce_q +R=6370997 +shape=vertical +scrolly=-0.25".split("\\s+"))); + assertNotNull(strict.parse("s", + "+proj=spilhaus +R=6378137 +azi=9.1 +rot=40.1".split("\\s+"))); + } + + // -------------------------------------------------------------------------- the real corpus + + /** + * Every {@code operation} line of {@code peirce_q.gie} and {@code spilhaus.gie} — read from + * the vendored corpus, not transcribed — is accepted by the parser, and every one of them + * delivers the parameters it carries. + * + *

This is the reachability claim in its narrowest form: 10 blocks in {@code peirce_q.gie}, + * every one carrying {@code +shape} — which is why the whole file was unreachable — and + * 13 in {@code spilhaus.gie}, four of which carry {@code +azi} or {@code +rot}. One of the + * thirteen is a {@code +proj=adams_ws2} control block, so the {@code spilhaus} cast is + * conditional. If the dispatch regresses, the assertion that fails names the corpus line. + */ + @Test + public void everyOperationLineInTheTwoCorpusFilesDeliversItsParameters() { + List peirce = operationLines("peirce_q.gie"); + List spil = operationLines("spilhaus.gie"); + assertEquals("peirce_q.gie operation count", 10, peirce.size()); + assertEquals("spilhaus.gie operation count", 13, spil.size()); + + int withShape = 0; + for (String definition : peirce) { + PeirceQuincuncialProjection p = peirceQ(definition); + String shape = value(definition, "shape"); + assertNotNull(definition + ": every peirce_q block in the corpus carries +shape", + shape); + withShape++; + assertEquals(definition, shape, p.getShape().parameterValue()); + + String scrollx = value(definition, "scrollx"); + if (scrollx != null && p.getShape() == PeirceQuincuncialProjection.Shape.HORIZONTAL) { + assertEquals(definition, Double.parseDouble(scrollx), p.getScrollX(), 0.0); + } + String scrolly = value(definition, "scrolly"); + if (scrolly != null && p.getShape() == PeirceQuincuncialProjection.Shape.VERTICAL) { + assertEquals(definition, Double.parseDouble(scrolly), p.getScrollY(), 0.0); + } + } + assertEquals("every peirce_q.gie block carries +shape", 10, withShape); + + int withAziOrRot = 0; + for (String definition : spil) { + Projection projection = projection(definition); + String azi = value(definition, "azi"); + String rot = value(definition, "rot"); + if (!(projection instanceof SpilhausProjection)) { + // spilhaus.gie's one +proj=adams_ws2 control block. + assertNotNull(definition, projection); + continue; + } + SpilhausProjection p = (SpilhausProjection) projection; + if (azi != null) { + assertEquals(definition, Double.parseDouble(azi) * ProjectionMath.DTR, p.getAzi(), + 1e-12); + } + if (rot != null) { + assertEquals(definition, Double.parseDouble(rot) * ProjectionMath.DTR, p.getRot(), + 1e-12); + } + if (azi != null || rot != null) { + withAziOrRot++; + } + } + assertEquals("spilhaus.gie's blocks carrying +azi and/or +rot", 4, withAziOrRot); + } + + /** The value of {@code +key=} in a proj-string, or null. */ + private static String value(String definition, String key) { + for (String token : definition.trim().split("\\s+")) { + String kv = token.startsWith("+") ? token.substring(1) : token; + int eq = kv.indexOf('='); + if (eq > 0 && kv.substring(0, eq).equals(key)) { + return kv.substring(eq + 1); + } + } + return null; + } + + /** + * The {@code operation} definitions of a vendored {@code .gie} file. Only the {@code + * operation} verb is needed here, so this is a filter rather than a lexer; the numeric rows of + * these two files are driven by {@code AdamsRegistrationAndParserGapTest}. + */ + private static List operationLines(String file) { + Path path = corpusDirectory().resolve(file); + List operations = new ArrayList(); + try { + for (String raw : Files.readAllLines(path, StandardCharsets.UTF_8)) { + int hash = raw.indexOf('#'); + String line = (hash >= 0 ? raw.substring(0, hash) : raw).trim(); + if (line.startsWith("operation")) { + operations.add(line.substring("operation".length()).trim()); + } + } + } catch (IOException e) { + throw new UncheckedIOException("reading " + path, e); + } + if (operations.isEmpty()) { + throw new IllegalStateException("no operation lines found in " + path); + } + return operations; + } + + /** + * Locates {@code conformance/src/test/resources/gie}. Surefire runs with the module base + * directory as the working directory, so {@code ../conformance/...} resolves from + * {@code core/}; the repository root and the {@code basedir} property are tried too. + */ + private static Path corpusDirectory() { + List candidates = new ArrayList(); + String basedir = System.getProperty("basedir"); + if (basedir != null) { + candidates.add( + Paths.get(basedir, "..", "conformance", "src", "test", "resources", "gie")); + } + candidates.add(Paths.get("..", "conformance", "src", "test", "resources", "gie")); + candidates.add(Paths.get("conformance", "src", "test", "resources", "gie")); + for (Path p : candidates) { + if (Files.isDirectory(p)) { + return p; + } + } + throw new IllegalStateException("cannot locate conformance/src/test/resources/gie from " + + Paths.get(".").toAbsolutePath().normalize() + "; tried " + candidates); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/Proj4ParserTest.java b/core/src/test/java/org/locationtech/proj4j/parser/Proj4ParserTest.java new file mode 100644 index 0000000..1646ef4 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/Proj4ParserTest.java @@ -0,0 +1,278 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.datum.Datum; +import org.locationtech.proj4j.units.Units; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * Parameter-list semantics: duplicate-key precedence, angular value syntax, + * strictness, and the requirement that parsing never mutate a shared + * {@link Datum}. + */ +public class Proj4ParserTest { + + private final CRSFactory crsFactory = new CRSFactory(); + + private CoordinateReferenceSystem crs(String def) { + return crsFactory.createFromParameters("test", def); + } + + private static CoordinateReferenceSystem parse(Proj4Parser parser, String def) { + return parser.parse("test", def.trim().split("\\s+")); + } + + // ------------------------------------------------------------------ + // Duplicate keys: the FIRST occurrence wins + // ------------------------------------------------------------------ + + /** + * {@code pj_param_exists} walks the parameter list front-to-back and + * returns the first match; {@code +init=}/{@code +datum=} expansions are + * appended so user tokens shadow them. A {@code HashMap} kept the last. + */ + @Test + public void firstOccurrenceOfADuplicatedKeyWins() { + assertEquals(6400000.0, + crs("+proj=merc +a=6400000 +a=1 +rf=297").getDatum().getEllipsoid().getEquatorRadius(), 0.0); + + double rf297 = crs("+proj=merc +a=6400000 +rf=297").getDatum().getEllipsoid().getEccentricitySquared(); + assertEquals(rf297, + crs("+proj=merc +a=6400000 +rf=297 +rf=500").getDatum().getEllipsoid().getEccentricitySquared(), + 0.0); + + assertEquals(9.0, + crs("+proj=tmerc +ellps=GRS80 +lon_0=9 +lon_0=15").getProjection().getProjectionLongitudeDegrees(), + 0.0); + + assertEquals("merc", + crs("+proj=merc +proj=utm +zone=32 +ellps=GRS80").getProjection().getName()); + } + + /** A second occurrence must not even be validated, since it is never read. */ + @Test + public void aShadowedDuplicateIsNotValidated() { + assertNotNull(crs("+proj=merc +a=6400000 +a=-1 +rf=297")); + } + + // ------------------------------------------------------------------ + // Angular value syntax on every angle parameter + // ------------------------------------------------------------------ + + /** + * {@code +alpha}, {@code +lonc} and {@code +gamma} used bare + * {@code Double.parseDouble}, so a DMS value threw. + */ + @Test + public void dmsIsAcceptedOnAlphaLoncAndGamma() { + CoordinateReferenceSystem c = crs("+proj=omerc +a=6377298.556 +rf=300.8017 +lat_0=4" + + " +lonc=115 +alpha=53d18'56.9537 +gamma=53d7'48.3685 +k_0=0.99984"); + assertEquals(53.31582047222222, c.getProjection().getAlpha() * ProjectionMath.RTD, 1e-12); + assertEquals(115.0, c.getProjection().getLonC() * ProjectionMath.RTD, 1e-12); + } + + /** A trailing cardinal is a sign, on every angle. */ + @Test + public void cardinalSuffixIsAcceptedOnAngles() { + // the accessor round-trips through radians, hence the 1e-12 slack + assertEquals(-60.0, + crs("+proj=pconic +ellps=GRS80 +lat_1=20n +lat_2=60n +lon_0=60W") + .getProjection().getProjectionLongitudeDegrees(), 1e-12); + assertEquals(12.5, + crs("+proj=tmerc +ellps=GRS80 +lat_0=12d30'N").getProjection().getProjectionLatitudeDegrees(), + 1e-12); + } + + /** PROJ's {@code r}/{@code R} radian suffix, previously rejected outright. */ + @Test + public void radianSuffixIsAcceptedOnAngles() { + assertEquals(0.5 * ProjectionMath.RTD, + crs("+proj=merc +ellps=GRS80 +lon_0=0.5r").getProjection().getProjectionLongitudeDegrees(), + 1e-12); + assertEquals(-0.25 * ProjectionMath.RTD, + crs("+proj=tmerc +ellps=GRS80 +lat_0=-0.25R").getProjection().getProjectionLatitudeDegrees(), + 1e-12); + } + + /** {@code +pm} used bare {@code Double.parseDouble} too. */ + @Test + public void dmsIsAcceptedOnPrimeMeridian() { + assertEquals("+pm=74d04'51.3\"W must equal the named bogota meridian", + crs("+proj=merc +ellps=GRS80 +pm=bogota").getProjection().getPrimeMeridian(), + crs("+proj=merc +ellps=GRS80 +pm=74d04'51.3\"W").getProjection().getPrimeMeridian()); + + // Degree-minute without quotes, as in PROJ's own +pm=17d40W + assertEquals(crs("+proj=merc +ellps=GRS80 +pm=ferro").getProjection().getPrimeMeridian(), + crs("+proj=merc +ellps=GRS80 +pm=17d40W").getProjection().getPrimeMeridian()); + } + + /** A named meridian must still resolve by name, including names containing 'd'. */ + @Test + public void namedPrimeMeridiansStillResolve() { + assertEquals("madrid", + crs("+proj=merc +ellps=GRS80 +pm=madrid").getProjection().getPrimeMeridian().getName()); + assertEquals("lisbon", + crs("+proj=merc +ellps=GRS80 +pm=lisbon").getProjection().getPrimeMeridian().getName()); + assertEquals("greenwich", + crs("+proj=merc +ellps=GRS80 +pm=greenwich").getProjection().getPrimeMeridian().getName()); + } + + // ------------------------------------------------------------------ + // Strictness + // ------------------------------------------------------------------ + + /** + * PROJ never errors on an unrecognised key - {@code init.cpp} retains every + * token and recognition is pull-based - and {@code builtins.gie} relies on + * it. The 36-key allow-list is therefore opt-in. + */ + @Test + public void unknownKeysAreIgnoredByDefault() { + assertNotNull(crs("+proj=merc +ellps=GRS80 +unknown_keyword=1")); + assertNotNull(crs("+proj=merc +ellps=GRS80 +vunits=m +geoidgrids=foo.gtx")); + assertEquals(Proj4Parser.ParseMode.PROJ_COMPATIBLE, new Proj4Parser(new Registry()).getParseMode()); + } + + @Test + public void strictModeRejectsUnknownKeys() { + Proj4Parser strict = new Proj4Parser(new Registry(), Proj4Parser.ParseMode.STRICT); + try { + parse(strict, "+proj=merc +ellps=GRS80 +unknown_keyword=1"); + fail("STRICT must reject an unknown key"); + } catch (UnsupportedParameterException expected) { + assertTrue(expected.getMessage().contains("unknown_keyword")); + } + assertNotNull(parse(strict, "+proj=merc +ellps=GRS80 +units=m")); + } + + /** + * {@code Units.findUnits} returns METRES for anything it does not know and + * never returns null, so the parser's own null guard was dead code. + */ + @Test + public void unknownUnitsSilentlyBecomeMetresInProjCompatibleMode() { + assertSame(Units.METRES, crs("+proj=merc +ellps=GRS80 +units=bananas").getProjection().getUnits()); + } + + @Test + public void strictModeRejectsUnknownUnits() { + Proj4Parser strict = new Proj4Parser(new Registry(), Proj4Parser.ParseMode.STRICT); + try { + parse(strict, "+proj=merc +ellps=GRS80 +units=bananas"); + fail("STRICT must reject an unknown +units name"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("bananas")); + } + // ...but must not reject the ones it does know + assertSame(Units.US_FEET, parse(strict, "+proj=merc +ellps=GRS80 +units=us-ft").getProjection().getUnits()); + assertSame(Units.METRES, parse(strict, "+proj=merc +ellps=GRS80 +units=m").getProjection().getUnits()); + assertSame(Units.FEET, parse(strict, "+proj=merc +ellps=GRS80 +units=ft").getProjection().getUnits()); + } + + // ------------------------------------------------------------------ + // Parsing must never mutate a shared Datum + // ------------------------------------------------------------------ + + /** + * {@code Proj4Parser.parse} used to call {@code datum.setGrids(...)} on + * whatever {@code DatumParameters.getDatum()} returned - which for + * {@code +datum=NAD27} is the {@code Datum.NAD27} singleton, with a + * null grid list. The first parse of EPSG:4267 therefore destroyed NAD27's + * grids for the whole process, and did so unsynchronised. + */ + @Test + public void parsingEpsg4267TwiceLeavesTheNad27SingletonUntouched() { + assertEquals("fixture: Datum.NAD27 must start out grid-shifted", + Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + + CoordinateReferenceSystem first = crsFactory.createFromName("EPSG:4267"); + assertEquals(Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + + CoordinateReferenceSystem second = crsFactory.createFromName("EPSG:4267"); + assertEquals(Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + + assertSame("no +nadgrids given, so the singleton itself is fine to reuse", + Datum.NAD27, first.getDatum()); + assertEquals(Datum.TYPE_GRIDSHIFT, first.getDatum().getTransformType()); + assertEquals(Datum.TYPE_GRIDSHIFT, second.getDatum().getTransformType()); + } + + @Test + public void parsingDatumNad27DirectlyLeavesTheSingletonUntouched() { + for (int i = 0; i < 3; i++) { + crs("+proj=longlat +datum=NAD27 +no_defs"); + assertEquals(Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + } + } + + /** {@code +nadgrids} alongside {@code +datum=} must derive, not mutate. */ + @Test + public void nadgridsWithANamedDatumDerivesANewDatum() { + CoordinateReferenceSystem c = crs("+proj=longlat +datum=NAD27 +nadgrids=@ntv1_can.dat +no_defs"); + assertEquals(Datum.TYPE_GRIDSHIFT, c.getDatum().getTransformType()); + assertTrue("must not be the shared singleton", c.getDatum() != Datum.NAD27); + assertEquals(Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + assertEquals("the derived datum must keep NAD27's ellipsoid", + Datum.NAD27.getEllipsoid(), c.getDatum().getEllipsoid()); + } + + /** The same must hold for the WGS84 singleton reached through the default path. */ + @Test + public void nadgridsWithoutADatumDoesNotMutateWgs84() { + assertEquals(Datum.TYPE_WGS84, Datum.WGS84.getTransformType()); + crs("+proj=longlat +nadgrids=@ntv1_can.dat +no_defs"); + assertEquals(Datum.TYPE_WGS84, Datum.WGS84.getTransformType()); + } + + // ------------------------------------------------------------------ + // Misc + // ------------------------------------------------------------------ + + /** {@code +k_0} is checked after {@code +k}, so {@code +k_0} wins. */ + @Test + public void scaleFactorZeroOutranksK() { + assertEquals(0.9996, + crs("+proj=tmerc +ellps=GRS80 +k=1 +k_0=0.9996").getProjection().getScaleFactor(), 0.0); + } + + /** A repeated parse of the same definition must be deterministic. */ + @Test + public void repeatedParsesAgree() { + String def = "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0" + + " +datum=potsdam +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +units=m +no_defs"; + double[] first = crs(def).getDatum().getTransformToWGS84(); + for (int i = 0; i < 3; i++) { + double[] again = crs(def).getDatum().getTransformToWGS84(); + for (int j = 0; j < first.length; j++) { + assertEquals("towgs84[" + j + "] must not drift between parses", + first[j], again[j], 0.0); + } + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/TmercAlgorithmParsingTest.java b/core/src/test/java/org/locationtech/proj4j/parser/TmercAlgorithmParsingTest.java new file mode 100644 index 0000000..8e5f20f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/TmercAlgorithmParsingTest.java @@ -0,0 +1,239 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; + +/** + * {@code +approx}, {@code +algo}, and {@code utm}'s requirement of an ellipsoid. + * + *

Why this matters more than a usual parameter

+ * + *

PROJ 9.8.1 ships Poder/Engsager as the built-in {@code tmerc} algorithm and this + * library now matches it. {@code +approx} is the documented way to ask for the older + * Evenden/Snyder series, so until it was dispatched there was no way at all to + * request the previous behaviour — and the difference is unbounded away from the central + * meridian. + * + *

Reference values

+ * + *

All from the installed PROJ 9.8.1 ({@code Rel. 9.8.1, April 10th, 2026}), at + * (12, 56) in degrees, output in projected metres: + * + *

+ * $ echo "12 56" | proj -f '%.8f' <definition>
+ *
+ * +proj=utm +zone=32                        687071.43910944  6210141.32674801
+ * +proj=utm +zone=32 +approx                687071.43911000  6210141.32674805
+ * +proj=utm +zone=32 +algo=evenden_snyder   687071.43911000  6210141.32674805
+ * +proj=utm +zone=32 +algo=poder_engsager   687071.43910944  6210141.32674801
+ * +proj=utm +zone=32 +approx=f              687071.43910944  6210141.32674801
+ * +proj=tmerc +ellps=GRS80                  746631.14610438  6273771.20419756
+ * +proj=tmerc +ellps=GRS80 +approx          746631.14311771  6273771.20459692
+ * +proj=tmerc +R=6400000                    747461.59436200  6320539.67139200
+ * +proj=utm +zone=32 +datum=WGS84           687071.43910733  6210141.32687210
+ * 
+ */ +public class TmercAlgorithmParsingTest { + + /** PROJ printed 8 decimals of a metre; 1e-6 m is comfortably inside that. */ + private static final double TOL = 1e-6; + + private static final double[] UTM32_PODER = {687071.43910944, 6210141.32674801}; + private static final double[] UTM32_EVENDEN = {687071.43911000, 6210141.32674805}; + private static final double[] TMERC_PODER = {746631.14610438, 6273771.20419756}; + private static final double[] TMERC_EVENDEN = {746631.14311771, 6273771.20459692}; + + private final CRSFactory crsFactory = new CRSFactory(); + + private CoordinateReferenceSystem crs(String def) { + return crsFactory.createFromParameters("test", def); + } + + private void expect(String def, double[] expected) { + ProjCoordinate out = new ProjCoordinate(Double.NaN, Double.NaN); + crs(def).getProjection().project(new ProjCoordinate(12, 56), out); + assertEquals(def + " easting", expected[0], out.x, TOL); + assertEquals(def + " northing", expected[1], out.y, TOL); + } + + private InvalidValueException rejected(String def) { + try { + crs(def); + } catch (InvalidValueException e) { + return e; + } catch (Proj4jException e) { + fail("expected InvalidValueException for [" + def + "] but got " + e); + } + fail("expected [" + def + "] to be rejected"); + return null; + } + + // ------------------------------------------------------------------ + // utm is bound to the class that can honour +approx + // ------------------------------------------------------------------ + + /** + * {@code Registry} used to bind {@code utm} to the Poder/Engsager-only + * {@code ExtendedTransverseMercatorProjection}, which has no {@code setApprox}, so + * {@code +approx} on a UTM definition had nowhere to go. Upstream has a single + * implementation: {@code PJ_PROJECTION(utm)} and {@code PJ_PROJECTION(tmerc)} end in + * the same {@code setup(P, algo)}. + */ + @Test + public void utmResolvesToTheClassThatCarriesBothAlgorithms() { + assertTrue("utm must bind to TransverseMercatorProjection so +approx can reach it", + crs("+proj=utm +zone=32 +ellps=GRS80").getProjection() + instanceof TransverseMercatorProjection); + } + + // ------------------------------------------------------------------ + // +approx and +algo + // ------------------------------------------------------------------ + + @Test + public void approxSelectsEvendenSnyderOnUtm() { + expect("+proj=utm +zone=32", UTM32_PODER); + expect("+proj=utm +zone=32 +approx", UTM32_EVENDEN); + } + + @Test + public void approxSelectsEvendenSnyderOnTmerc() { + expect("+proj=tmerc +ellps=GRS80", TMERC_PODER); + expect("+proj=tmerc +ellps=GRS80 +approx", TMERC_EVENDEN); + } + + /** + * The two algorithms must actually differ, or every assertion above would be + * satisfied by a no-op dispatch. At 12° from the central meridian the gap is + * ~3 mm; it grows without bound further out. + */ + @Test + public void theTwoAlgorithmsGiveDifferentAnswers() { + assertTrue("+approx must change the result", + Math.abs(TMERC_PODER[0] - TMERC_EVENDEN[0]) > 1e-3); + ProjCoordinate poder = new ProjCoordinate(Double.NaN, Double.NaN); + ProjCoordinate evenden = new ProjCoordinate(Double.NaN, Double.NaN); + crs("+proj=tmerc +ellps=GRS80").getProjection() + .project(new ProjCoordinate(12, 56), poder); + crs("+proj=tmerc +ellps=GRS80 +approx").getProjection() + .project(new ProjCoordinate(12, 56), evenden); + assertTrue("the parsed definitions must not resolve to the same algorithm", + Math.abs(poder.x - evenden.x) > 1e-3); + } + + @Test + public void algoSelectsEitherAlgorithmByName() { + expect("+proj=utm +zone=32 +algo=evenden_snyder", UTM32_EVENDEN); + expect("+proj=utm +zone=32 +algo=poder_engsager", UTM32_PODER); + // auto resolves to Poder/Engsager in this library, deliberately. + expect("+proj=utm +zone=32 +algo=auto", UTM32_PODER); + } + + /** + * {@code +approx} is read through {@code pj_param}'s {@code b} sigil + * ({@code tmerc.cpp:548}), so it is a boolean and not merely a presence flag: + * {@code +approx=f} is explicitly false. + */ + @Test + public void approxIsABooleanNotJustAPresenceFlag() { + expect("+proj=utm +zone=32 +approx=f", UTM32_PODER); + expect("+proj=utm +zone=32 +approx=F", UTM32_PODER); + expect("+proj=utm +zone=32 +approx=t", UTM32_EVENDEN); + expect("+proj=utm +zone=32 +approx=T", UTM32_EVENDEN); + // pj_param's b sigil errors on anything else rather than defaulting. + rejected("+proj=utm +zone=32 +approx=yes"); + } + + /** {@code +approx} is tested before {@code +algo} and wins over it. */ + @Test + public void approxOutranksAlgo() { + expect("+proj=utm +zone=32 +approx +algo=poder_engsager", UTM32_EVENDEN); + expect("+proj=utm +zone=32 +algo=poder_engsager +approx", UTM32_EVENDEN); + } + + /** An unrecognised {@code +algo} is an error, not a silent default. */ + @Test + public void anUnknownAlgoIsRejected() { + InvalidValueException e = rejected("+proj=utm +zone=32 +algo=nope"); + assertTrue("message should name the offending value: " + e.getMessage(), + e.getMessage().contains("nope") || e.getMessage().contains("algo")); + } + + // ------------------------------------------------------------------ + // utm needs an ellipsoid; tmerc does not + // ------------------------------------------------------------------ + + /** + * {@code PJ_PROJECTION(utm)} opens with {@code if (P->es == 0.0)} and fails + * ({@code tmerc.cpp}). Verified against 9.8.1: both {@code +a=6400000} and + * {@code +R=6400000} forms report "Invalid value for eccentricity: it should not be + * zero". Before {@code utm} was rebound this was a {@code NullPointerException}. + *

+ * Note the condition is the operation being {@code utm}, not {@code +zone} + * having been given: upstream's check is the first statement of the entry point and + * runs before {@code +zone} is looked at. + */ + @Test + public void utmOnASphereIsACleanInvalidParamValue() { + for (String def : new String[]{ + "+proj=utm +zone=32 +a=6400000", + "+proj=utm +zone=32 +R=6400000", + "+proj=utm +a=6400000", + }) { + InvalidValueException e = rejected(def); + assertSame("must be reported as an invalid parameter value, not as a crash", + ErrorCause.INVALID_PARAM_VALUE, e.cause()); + assertTrue("message should say why: " + e.getMessage(), + e.getMessage().contains("eccentricity")); + } + } + + /** + * ...and the mirror image, which is the assertion that would have caught the + * regression this guard could reintroduce: {@code +proj=tmerc} on a sphere is + * legal, and dispatches to the spherical formulation. + */ + @Test + public void tmercOnASphereStillWorks() { + CoordinateReferenceSystem c = crs("+proj=tmerc +R=6400000"); + assertNotNull(c); + expect("+proj=tmerc +R=6400000", new double[]{747461.594362, 6320539.671392}); + expect("+proj=tmerc +a=6400000", new double[]{747461.594362, 6320539.671392}); + } + + /** An ellipsoidal utm must of course still parse and project. */ + @Test + public void ellipsoidalUtmIsUnaffected() { + expect("+proj=utm +zone=32 +ellps=GRS80", UTM32_PODER); + // WGS84 rather than GRS80: differs in the 7th decimal of a metre, as it must. + expect("+proj=utm +zone=32 +datum=WGS84", + new double[]{687071.43910733, 6210141.32687210}); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/datumgrids/Nad27ToNad83ShiftTest.java b/core/src/test/java/org/locationtech/proj4j/parser/datumgrids/Nad27ToNad83ShiftTest.java new file mode 100644 index 0000000..ada8517 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/datumgrids/Nad27ToNad83ShiftTest.java @@ -0,0 +1,283 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser.datumgrids; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * That {@code NAD27 -> NAD83} really shifts, and by the right amount, at two points the + * defect report named: San Francisco and Kansas. + * + *

Where the reference values came from

+ * + *

PROJ 9.8.1 itself — the Homebrew build, {@code cs2cs} self-reporting + * {@code Rel. 9.8.1, April 10th, 2026} — reading the same grid bytes this repository + * ships. The vendored {@code proj4j-data/grids/conus} is byte-identical to + * {@code 9.8.1:data/tests/conus} (md5 {@code b3ddb364b185403eae8273d5066329e3}, + * confirmed against {@code git -C PROJ show 9.8.1:data/tests/conus}), so a disagreement + * here can only be Proj4J's CTABLE V2 reader, its interpolation or its datum plumbing — + * never a difference of grid data or of NADCON model version. Published NGS tables would + * not isolate that, because modern NGS uses NADCON 5. + * + *

+ * $ printf -- '-122.416667 37.783333\n-97.5 39.0\n' \
+ *     | cs2cs -f '%.10f' +proj=longlat +ellps=clrk66 +nadgrids=conus \
+ *                    +to +proj=longlat +datum=NAD83
+ * -122.4177492097  37.7832622344
+ *  -97.5003073411  38.9999993489
+ *
+ * $ printf -- '-122.416667 37.783333\n-97.5 39.0\n' \
+ *     | cs2cs -f '%.10f' +proj=longlat +datum=NAD83 \
+ *                    +to +proj=longlat +ellps=clrk66 +nadgrids=conus
+ * -122.4155848029  37.7834037741
+ *  -97.4996926694  39.0000006530
+ * 
+ * + *

The metric

+ * + *

Distances below are metres on the GRS80 ellipsoid, computed from the two + * lon/lat pairs through the local radii of curvature at their mid-latitude — not a + * Euclidean distance between degree values, and not an angular tolerance applied to a + * projected result. Cross-checked against PROJ's own geodesic: + * + *

+ * $ printf -- '37.783333 -122.416667 37.7832622344 -122.4177492097\n39.0 -97.5 38.9999993489 -97.5003073411\n' \
+ *     | geod -f '%.6f' -I +ellps=GRS80
+ * ... 95.655        # San Francisco
+ * ... 26.624        # Kansas
+ * 
+ * + *

{@link #localCurvatureMetres} reproduces those to 0.001 m at this scale, which is + * three orders of magnitude finer than the error under test. + * + *

What "the input unchanged" looked like

+ * + *

Before the parser stopped calling {@code setGrids(null)} on the {@code Datum.NAD27} + * singleton, {@code EPSG:4267 -> EPSG:4269} returned its input verbatim: 95.66 m of + * error at San Francisco, 26.62 m in Kansas, finite and plausible and unflagged. The + * downstream report that first surfaced it diagnosed it as missing grid data; it was a + * code path. + */ +public class Nad27ToNad83ShiftTest { + + // --- Points and PROJ 9.8.1 reference values ----------------------------- + + private static final double[] SAN_FRANCISCO = {-122.416667, 37.783333}; + private static final double[] KANSAS = {-97.5, 39.0}; + + private static final double[] SF_TO_NAD83 = {-122.4177492097, 37.7832622344}; + private static final double[] KANSAS_TO_NAD83 = {-97.5003073411, 38.9999993489}; + + private static final double[] SF_TO_NAD27 = {-122.4155848029, 37.7834037741}; + private static final double[] KANSAS_TO_NAD27 = {-97.4996926694, 39.0000006530}; + + /** Geodesic magnitude of the forward shift, from {@code geod +ellps=GRS80}. */ + private static final double SF_SHIFT_METRES = 95.655; + private static final double KANSAS_SHIFT_METRES = 26.624; + + /** + * {@code cs2cs} printed 10 decimals of a degree, i.e. rounded at about 0.01 mm. + * 1e-9 degrees is roughly 0.1 mm — tight enough that a single-node indexing slip + * (0.25 degrees between nodes) could not hide in it. + */ + private static final double TOL_DEG = 1e-9; + + /** GRS80, for the metric only. */ + private static final double GRS80_A = 6378137.0; + private static final double GRS80_ES = 0.006694380022900787; + + private final CRSFactory crsFactory = new CRSFactory(); + private final CoordinateTransformFactory transformFactory = new CoordinateTransformFactory(); + + // ------------------------------------------------------------------ + // The headline: a real shift, via the EPSG codes the report named + // ------------------------------------------------------------------ + + @Test + public void epsg4267ToEpsg4269ShiftsSanFranciscoByNinetyFiveMetres() { + ProjCoordinate out = transform("EPSG:4267", "EPSG:4269", SAN_FRANCISCO); + + assertEquals("longitude", SF_TO_NAD83[0], out.x, TOL_DEG); + assertEquals("latitude", SF_TO_NAD83[1], out.y, TOL_DEG); + assertEquals("shift magnitude, metres on GRS80", + SF_SHIFT_METRES, + localCurvatureMetres(SAN_FRANCISCO[0], SAN_FRANCISCO[1], out.x, out.y), + 0.001); + } + + @Test + public void epsg4267ToEpsg4269ShiftsKansasByTwentySixMetres() { + ProjCoordinate out = transform("EPSG:4267", "EPSG:4269", KANSAS); + + assertEquals("longitude", KANSAS_TO_NAD83[0], out.x, TOL_DEG); + assertEquals("latitude", KANSAS_TO_NAD83[1], out.y, TOL_DEG); + assertEquals("shift magnitude, metres on GRS80", + KANSAS_SHIFT_METRES, + localCurvatureMetres(KANSAS[0], KANSAS[1], out.x, out.y), + 0.001); + } + + /** + * The negative form, stated separately so that a future regression reads as + * "the input came back unchanged" rather than as an opaque tolerance miss. This is + * the assertion the 1.4.3 tree failed. + */ + @Test + public void epsg4267ToEpsg4269DoesNotReturnTheInputUnchanged() { + for (double[] point : new double[][]{SAN_FRANCISCO, KANSAS}) { + ProjCoordinate out = transform("EPSG:4267", "EPSG:4269", point); + double moved = localCurvatureMetres(point[0], point[1], out.x, out.y); + assertTrue("NAD27 -> NAD83 moved (" + point[0] + ", " + point[1] + ") by only " + + moved + " m; the grid shift was not applied", + moved > 10.0); + } + } + + /** + * The whole defect was that the first parse poisoned the singleton, so + * repeating the transform is the test that would have caught it. Every repetition + * must give the same answer, and a freshly built transform must agree with a reused + * one. + */ + @Test + public void theShiftIsStableAcrossRepeatedAndFreshTransforms() { + CoordinateTransform reused = transformFactory.createTransform( + crsFactory.createFromName("EPSG:4267"), crsFactory.createFromName("EPSG:4269")); + + for (int i = 0; i < 5; i++) { + ProjCoordinate viaReused = new ProjCoordinate(); + reused.transform(new ProjCoordinate(SAN_FRANCISCO[0], SAN_FRANCISCO[1]), viaReused); + assertEquals("longitude on reuse " + i, SF_TO_NAD83[0], viaReused.x, TOL_DEG); + + ProjCoordinate viaFresh = transform("EPSG:4267", "EPSG:4269", SAN_FRANCISCO); + assertEquals("a fresh transform must agree with a reused one on iteration " + i, + viaReused.x, viaFresh.x, 0.0); + assertEquals(viaReused.y, viaFresh.y, 0.0); + } + } + + // ------------------------------------------------------------------ + // The same thing without the EPSG database, and the inverse + // ------------------------------------------------------------------ + + /** + * Stated as proj-strings as well as EPSG codes, so that a change to + * {@code proj4-epsg.csv} cannot silently turn this into a different test. + * {@code +datum=NAD27} must reach the grid without an explicit {@code +nadgrids}, + * because that is precisely what {@code EPSG:4267} does not have and what PROJ + * supplies by appending the datum's own {@code nadgrids=@conus,...} definition + * ({@code datum_set.cpp}). + */ + @Test + public void namedDatumNad27ReachesTheGridWithoutAnExplicitNadgrids() { + ProjCoordinate out = transformDefs( + "+proj=longlat +datum=NAD27 +no_defs", + "+proj=longlat +datum=NAD83 +no_defs", + SAN_FRANCISCO); + assertEquals(SF_TO_NAD83[0], out.x, TOL_DEG); + assertEquals(SF_TO_NAD83[1], out.y, TOL_DEG); + } + + /** An explicit {@code +nadgrids=@conus} must agree with the named datum exactly. */ + @Test + public void explicitNadgridsConusAgreesWithTheNamedDatum() { + ProjCoordinate viaDatum = transformDefs( + "+proj=longlat +datum=NAD27 +no_defs", + "+proj=longlat +datum=NAD83 +no_defs", KANSAS); + ProjCoordinate viaGrids = transformDefs( + "+proj=longlat +ellps=clrk66 +nadgrids=@conus +no_defs", + "+proj=longlat +datum=NAD83 +no_defs", KANSAS); + assertEquals(viaDatum.x, viaGrids.x, 0.0); + assertEquals(viaDatum.y, viaGrids.y, 0.0); + } + + /** + * {@code NAD83 -> NAD27}. PROJ's inverse grid shift is iterative, so this is not + * the algebraic negation of the forward shift and has its own reference values. + */ + @Test + public void epsg4269ToEpsg4267AppliesTheIterativeInverseShift() { + ProjCoordinate sf = transform("EPSG:4269", "EPSG:4267", SAN_FRANCISCO); + assertEquals(SF_TO_NAD27[0], sf.x, TOL_DEG); + assertEquals(SF_TO_NAD27[1], sf.y, TOL_DEG); + + ProjCoordinate ks = transform("EPSG:4269", "EPSG:4267", KANSAS); + assertEquals(KANSAS_TO_NAD27[0], ks.x, TOL_DEG); + assertEquals(KANSAS_TO_NAD27[1], ks.y, TOL_DEG); + } + + /** Forward then inverse must return to the start, to well under a millimetre. */ + @Test + public void theShiftRoundTrips() { + for (double[] point : new double[][]{SAN_FRANCISCO, KANSAS}) { + ProjCoordinate there = transform("EPSG:4267", "EPSG:4269", point); + ProjCoordinate back = transform("EPSG:4269", "EPSG:4267", + new double[]{there.x, there.y}); + assertEquals("round trip must return to the start, metres on GRS80", + 0.0, localCurvatureMetres(point[0], point[1], back.x, back.y), 0.001); + } + } + + // ------------------------------------------------------------------ + // Helpers + // ------------------------------------------------------------------ + + private ProjCoordinate transform(String sourceCode, String targetCode, double[] lonLat) { + return run(crsFactory.createFromName(sourceCode), crsFactory.createFromName(targetCode), + lonLat); + } + + private ProjCoordinate transformDefs(String sourceDef, String targetDef, double[] lonLat) { + return run(crsFactory.createFromParameters("source", sourceDef), + crsFactory.createFromParameters("target", targetDef), lonLat); + } + + private ProjCoordinate run(CoordinateReferenceSystem source, + CoordinateReferenceSystem target, + double[] lonLat) { + ProjCoordinate out = new ProjCoordinate(); + transformFactory.createTransform(source, target) + .transform(new ProjCoordinate(lonLat[0], lonLat[1]), out); + return out; + } + + /** + * Distance in metres on the GRS80 ellipsoid between two lon/lat pairs given in + * degrees, via the meridional and prime-vertical radii of curvature at their + * mid-latitude. Exact enough for offsets of this size — it agrees with + * {@code geod +ellps=GRS80} to 0.001 m at 95 m — and, unlike a degree-space + * Euclidean distance, it cannot silently inflate a longitude difference by the + * ~111 km/degree factor. + */ + static double localCurvatureMetres(double lon1, double lat1, double lon2, double lat2) { + double phi = Math.toRadians((lat1 + lat2) / 2.0); + double sinPhi = Math.sin(phi); + double w = 1.0 - GRS80_ES * sinPhi * sinPhi; + double meridional = GRS80_A * (1.0 - GRS80_ES) / (w * Math.sqrt(w)); + double primeVertical = GRS80_A / Math.sqrt(w); + double northing = meridional * Math.toRadians(lat2 - lat1); + double easting = primeVertical * Math.cos(phi) * Math.toRadians(lon2 - lon1); + return Math.sqrt(easting * easting + northing * northing); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/datumgrids/StaticDatumImmutabilityTest.java b/core/src/test/java/org/locationtech/proj4j/parser/datumgrids/StaticDatumImmutabilityTest.java new file mode 100644 index 0000000..6c9456d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/datumgrids/StaticDatumImmutabilityTest.java @@ -0,0 +1,280 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.parser.datumgrids; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.datum.Datum; + +/** + * A regression net for the whole class of defect in which parsing a definition + * mutates a shared static {@link Datum} singleton, process-wide. + * + *

What this is guarding

+ * + *

{@code Proj4Parser.parse} used to do this: + * + *

+ * Datum datum = datumParam.getDatum();      // may BE Datum.NAD27, the singleton
+ * datum.setGrids(datumParam.getGrids());    // mutates it, for the whole JVM
+ * 
+ * + *

{@code EPSG:4267} is {@code +proj=longlat +datum=NAD27 +no_defs} — no + * {@code +nadgrids} token — so {@code getGrids()} was {@code null} and the first parse + * of that one code executed {@code Datum.NAD27.setGrids(null)} permanently. Its + * transform type flipped {@code TYPE_GRIDSHIFT -> TYPE_UNKNOWN}, and thereafter + * {@code EPSG:4267 -> EPSG:4269} returned the input unchanged: a finite, + * plausible, unflagged answer roughly 95 m wrong at San Francisco. The mirror image was + * reachable from untrusted input too — {@code +datum=WGS84 +nadgrids=@null} gave + * {@code Datum.WGS84} a non-empty grid list JVM-wide, flipping every WGS84 code to + * {@code TYPE_GRIDSHIFT} including transforms already cached. + * + *

Why it is written reflectively

+ * + *

The point is not that {@code NAD27.grids} specifically survives; it is that + * nothing about any singleton changes. So rather than assert on one field + * through one getter — {@link Datum} exposes no {@code getGrids()} at all — this + * enumerates every {@code static Datum} constant {@link Datum} declares, snapshots + * every instance field of each, runs a battery of parses, and diffs. A newly added + * singleton, or a newly added mutable field, is covered the day it appears rather than + * the day someone remembers to extend a test. + * + *

Aliasing counts as mutation here: for a {@link List} or an array the snapshot + * records the container's identity and its elements' identities, so handing a + * singleton's own grid list or {@code towgs84} array out to something that rescales it + * in place is caught as well. + */ +public class StaticDatumImmutabilityTest { + + private final CRSFactory crsFactory = new CRSFactory(); + + /** + * Definitions that between them reach every path in {@code Proj4Parser.parseDatum} + * and {@code DatumParameters.getDatum} that has a named datum, a grid list, or + * both. + */ + private static final String[] DEFINITIONS = { + // The original defect: a named grid-shift datum with no +nadgrids token. + "+proj=longlat +datum=NAD27 +no_defs", + // +nadgrids alongside a named datum: must derive, not overwrite. + "+proj=longlat +datum=NAD27 +nadgrids=@conus +no_defs", + "+proj=longlat +datum=NAD27 +nadgrids=@ntv1_can.dat +no_defs", + // The untrusted-input mirror image: @null onto a Helmert datum. + "+proj=longlat +datum=WGS84 +nadgrids=@null +no_defs", + "+proj=longlat +datum=NAD83 +nadgrids=@null +no_defs", + // A grid list with no datum at all: must not land on Datum.WGS84. + "+proj=longlat +nadgrids=@conus +no_defs", + // Named Helmert datums, with and without a competing +towgs84. + "+proj=longlat +datum=potsdam +no_defs", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +datum=potsdam" + + " +towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7 +units=m +no_defs", + "+proj=longlat +datum=OSGB36 +no_defs", + "+proj=longlat +datum=GGRS87 +no_defs", + // An explicit ellipsoid alongside a named datum. + "+proj=merc +datum=WGS84 +R=6400000", + "+proj=merc +datum=NAD27 +a=6400000 +rf=297", + }; + + @Test + public void noParseMutatesAnyStaticDatumSingleton() { + Map before = snapshotAllSingletons(); + assertFalse("fixture: Datum declares no static Datum constants?", before.isEmpty()); + + for (int pass = 0; pass < 2; pass++) { + for (String def : DEFINITIONS) { + crsFactory.createFromParameters("test", def); + } + } + crsFactory.createFromName("EPSG:4267"); + crsFactory.createFromName("EPSG:4269"); + crsFactory.createFromName("EPSG:4267"); + + Map after = snapshotAllSingletons(); + List drifted = new ArrayList(); + for (Map.Entry entry : before.entrySet()) { + Object now = after.get(entry.getKey()); + if (!equal(entry.getValue(), now)) { + drifted.add(entry.getKey() + ": was " + entry.getValue() + ", now " + now); + } + } + assertTrue("parsing mutated shared Datum state: " + drifted, drifted.isEmpty()); + } + + /** + * The specific consequence the defect had, stated in the terms a caller sees. + * {@code Datum.NAD27} must still claim a grid shift after EPSG:4267 has been + * parsed, because that claim is what makes {@code BasicCoordinateTransform} apply + * the grid at all. + */ + @Test + public void nad27KeepsClaimingAGridShiftAfterParsingEpsg4267() { + assertEquals("fixture: Datum.NAD27 must ship with grids; if this fails the grid" + + " data is missing from the classpath, not the parser", + Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + + for (int i = 0; i < 3; i++) { + crsFactory.createFromName("EPSG:4267"); + assertEquals("Datum.NAD27 lost its grids on parse " + i, + Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + crsFactory.createFromParameters("t", "+proj=longlat +datum=NAD27 +no_defs"); + assertEquals("Datum.NAD27 lost its grids on +datum=NAD27 parse " + i, + Datum.TYPE_GRIDSHIFT, Datum.NAD27.getTransformType()); + } + } + + /** {@code +nadgrids=@null} from untrusted input must not reach the WGS84 singleton. */ + @Test + public void nadgridsNullDoesNotTurnWgs84IntoAGridShiftDatum() { + assertEquals(Datum.TYPE_WGS84, Datum.WGS84.getTransformType()); + assertEquals(Datum.TYPE_WGS84, Datum.NAD83.getTransformType()); + + crsFactory.createFromParameters("t", "+proj=longlat +datum=WGS84 +nadgrids=@null +no_defs"); + crsFactory.createFromParameters("t", "+proj=longlat +datum=NAD83 +nadgrids=@null +no_defs"); + + assertEquals("Datum.WGS84 was flipped to TYPE_GRIDSHIFT process-wide", + Datum.TYPE_WGS84, Datum.WGS84.getTransformType()); + assertEquals("Datum.NAD83 was flipped to TYPE_GRIDSHIFT process-wide", + Datum.TYPE_WGS84, Datum.NAD83.getTransformType()); + } + + /** + * {@code Datum.setGrids} is the only way to mutate a {@link Datum} after + * construction, and after this change nothing in main code calls it. This test + * states that as an expectation so that the day it is deprecated and removed, the + * reason is recorded here rather than rediscovered. + */ + @Test + public void aDerivedDatumIsUsedRatherThanMutatingTheNamedOne() { + Datum shared = crsFactory + .createFromParameters("t", "+proj=longlat +datum=NAD27 +no_defs").getDatum(); + assertTrue("with no +nadgrids the singleton itself is safe to reuse", + shared == Datum.NAD27); + + Datum derived = crsFactory + .createFromParameters("t", "+proj=longlat +datum=NAD27 +nadgrids=@conus +no_defs") + .getDatum(); + assertFalse("+nadgrids alongside +datum must derive a new Datum, not mutate NAD27", + derived == Datum.NAD27); + assertEquals("the derived datum must keep the named datum's ellipsoid", + Datum.NAD27.getEllipsoid(), derived.getEllipsoid()); + assertEquals(Datum.TYPE_GRIDSHIFT, derived.getTransformType()); + } + + // ------------------------------------------------------------------ + // Reflective snapshot + // ------------------------------------------------------------------ + + /** + * @return one entry per (singleton, instance field) pair, keyed + * {@code "NAD27.grids"}, valued by a comparable description of the field's + * contents and the identity of any container it holds + */ + private static Map snapshotAllSingletons() { + Map snapshot = new LinkedHashMap(); + for (Field constant : Datum.class.getDeclaredFields()) { + if (!Modifier.isStatic(constant.getModifiers()) || constant.getType() != Datum.class) { + continue; + } + Datum singleton; + try { + constant.setAccessible(true); + singleton = (Datum) constant.get(null); + } catch (Exception e) { + throw new AssertionError("cannot read Datum." + constant.getName() + ": " + e); + } + if (singleton == null) { + continue; + } + snapshot.put(constant.getName() + ".", identity(singleton)); + snapshot.put(constant.getName() + ".", + Integer.valueOf(singleton.getTransformType())); + for (Field field : Datum.class.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers())) { + continue; + } + try { + field.setAccessible(true); + snapshot.put(constant.getName() + "." + field.getName(), + describe(field.get(singleton))); + } catch (Exception e) { + throw new AssertionError("cannot read Datum." + constant.getName() + + "." + field.getName() + ": " + e); + } + } + } + return snapshot; + } + + /** + * Renders a field value so that a change of contents or a change of + * container identity both show up as inequality. Element identities are recorded + * rather than element values because a {@code Grid} handed out and mutated in place + * would otherwise be invisible. + */ + private static Object describe(Object value) { + if (value == null) { + return "null"; + } + if (value instanceof double[]) { + double[] array = (double[]) value; + StringBuilder sb = new StringBuilder("double[]@").append(identity(array)).append('['); + for (int i = 0; i < array.length; i++) { + if (i > 0) { + sb.append(','); + } + // Double.toString, not the raw double, so that -0.0 and NaN compare + // by their textual form rather than by ==. + sb.append(Double.toString(array[i])); + } + return sb.append(']').toString(); + } + if (value instanceof Collection) { + Collection collection = (Collection) value; + StringBuilder sb = new StringBuilder("collection@").append(identity(value)) + .append("size=").append(collection.size()).append('['); + for (Object element : collection) { + sb.append(identity(element)).append(','); + } + return sb.append(']').toString(); + } + if (value instanceof String || value instanceof Number || value instanceof Boolean) { + return value.toString(); + } + // Ellipsoid and friends: compare by identity. Nothing in the parser is + // expected to swap one out, and their own immutability is tested elsewhere. + return value.getClass().getName() + "@" + identity(value); + } + + private static String identity(Object o) { + return o == null ? "null" : Integer.toHexString(System.identityHashCode(o)); + } + + private static boolean equal(Object a, Object b) { + return a == null ? b == null : a.equals(b); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchCheck.java b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchCheck.java new file mode 100644 index 0000000..96bd929 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchCheck.java @@ -0,0 +1,200 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.parser.dispatch; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.gie.GieComparator; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.proj.Projection; + +/** + * Runs the rows of a {@link DispatchCorpus} block against Proj4J, measuring deviation with + * {@link GieComparator} — the published port of gie's own {@code expect()} comparison. + * + *

Why the distance is delegated

+ * + *

gie does not subtract coordinates: it picks among four metrics by the units of the + * target side. For a bare projection {@code operation} the two that arise are + * Euclidean {@code hypot} on the forward (projected metres) and the geodesic arc length + * on the inverse (angular). A degree of latitude is about 111.3 km, so applying the wrong + * branch inflates or deflates by that factor — which is how a harness ends up measuring the + * wrong thing while looking right. Hence {@link GieComparator} and + * {@link GieIoUnits#outputUnits} rather than a local subtraction. + * + *

A bare {@code operation +proj=X} has {@code left = RADIANS, right = CLASSIC} + * ({@code proj_internal.h:882-883}). The corpus writes an inverse block's expected coordinate + * in degrees and gie converts it with {@code torad_coord} before comparing, because PROJ's raw + * inverse returns radians; Proj4J's {@code inverseProject} returns degrees, so both sides are + * converted here and the radian-geodesic branch is used — the same arithmetic gie performs, in + * the same order. + */ +final class DispatchCheck { + + private DispatchCheck() { + } + + /** + * Runs every coordinate row of every corpus block naming {@code +proj=} and + * asserts that all of them agree with PROJ. + * + * @param expectedRows the number of rows the corpus is expected to contribute, asserted so + * that a silently-empty run cannot masquerade as a pass + */ + static void assertCorpusAgrees(String file, String projName, int expectedRows) { + List blocks = DispatchCorpus.blocksFor(file, projName); + assertTrue("no +proj=" + projName + " operation found in " + file + + " -- the corpus moved, or the whole-token match is wrong", + !blocks.isEmpty()); + + int total = 0; + List failures = new ArrayList(); + for (int b = 0; b < blocks.size(); b++) { + DispatchCorpus block = blocks.get(b); + List rows = block.coordinateRows(); + total += rows.size(); + if (rows.isEmpty()) { + // An `expect failure` block asserts an error rather than a coordinate, so + // constructing it here would report upstream's intended rejection as a defect. + // Those blocks are asserted directly instead - see + // ParameterDispatchTest.urm5RejectsNSinAlphaEqualToOne. + continue; + } + Projection p; + try { + CoordinateReferenceSystem crs = + new CRSFactory().createFromParameters("gie", block.operation()); + p = crs.getProjection(); + } catch (RuntimeException e) { + failures.add(" " + file + ":" + block.lineNumber() + " " + block.operation() + + ": could not be constructed at all -- " + + e.getClass().getSimpleName() + ": " + e.getMessage()); + continue; + } + GieComparator cmp = comparatorFor(p); + for (int i = 0; i < rows.size(); i++) { + DispatchCorpus.Row row = rows.get(i); + double deviation; + try { + deviation = row.isRoundtrip() + ? roundtripResidual(cmp, p, row) + : oneWayDeviation(cmp, p, row); + } catch (RuntimeException e) { + failures.add(" " + block.operation() + " " + row + ": threw " + + e.getClass().getSimpleName() + ": " + e.getMessage()); + continue; + } + if (!GieComparator.withinTolerance(deviation, row.toleranceMetres)) { + failures.add(" " + block.operation() + " " + row + ": deviation " + + deviation + " exceeds tolerance " + row.toleranceMetres); + } + } + } + assertTrue("+proj=" + projName + ": expected " + expectedRows + " corpus rows in " + file + + ", found " + total + " -- a changed count means the corpus moved", + total == expectedRows); + if (!failures.isEmpty()) { + fail("+proj=" + projName + ": " + failures.size() + " of " + total + + " corpus rows deviate:" + System.lineSeparator() + + String.join(System.lineSeparator(), failures)); + } + } + + /** + * The geodesic figure for the metric, read from the constructed projection. Every block + * used here states its figure explicitly ({@code +a=}, {@code +R=} or {@code +ellps=}). + */ + private static GieComparator comparatorFor(Projection p) { + final double a = p.getEllipsoid().equatorRadius; + final double b = p.getEllipsoid().poleRadius; + return GieComparator.forEllipsoid(a, a == 0.0 ? 0.0 : (a - b) / a); + } + + private static GieIoUnits outputUnits(boolean inverse) { + return GieIoUnits.outputUnits(GieIoUnits.RADIANS, GieIoUnits.CLASSIC, false, + inverse ? GieDirection.INVERSE : GieDirection.FORWARD); + } + + private static double oneWayDeviation(GieComparator cmp, Projection p, + DispatchCorpus.Row row) { + ProjCoordinate in = new ProjCoordinate(row.accept[0], row.accept[1]); + ProjCoordinate out = new ProjCoordinate(); + double[] expected; + double[] got; + + if (row.inverse) { + p.inverseProject(in, out); + expected = new double[] {Math.toRadians(row.expect[0]), + Math.toRadians(row.expect[1]), 0, 0}; + got = new double[] {Math.toRadians(out.x), Math.toRadians(out.y), 0, 0}; + } else { + p.project(in, out); + expected = new double[] {row.expect[0], row.expect[1], 0, 0}; + got = new double[] {out.x, out.y, 0, 0}; + } + return cmp.compare(outputUnits(row.inverse), false, expected, got, + row.expect.length, row.toleranceMetres).deviation(); + } + + /** + * {@code roundtrip n}, phased exactly as {@code src/trans.cpp:591}: one half-step out, + * {@code n-1} full cycles, one half-step home, so the residual is measured in the + * input space. A naive n-fold loop applies a different number of transforms. + */ + private static double roundtripResidual(GieComparator cmp, Projection p, + DispatchCorpus.Row row) { + final double x0 = row.accept[0]; + final double y0 = row.accept[1]; + ProjCoordinate t = new ProjCoordinate(x0, y0); + t = step(p, t, row.inverse); + for (int i = 1; i < row.roundtripTrips; i++) { + t = step(p, step(p, t, !row.inverse), row.inverse); + } + t = step(p, t, !row.inverse); + + final boolean angularResidual = !row.inverse; + double[] expected; + double[] got; + if (angularResidual) { + expected = new double[] {Math.toRadians(x0), Math.toRadians(y0), 0, 0}; + got = new double[] {Math.toRadians(t.x), Math.toRadians(t.y), 0, 0}; + } else { + expected = new double[] {x0, y0, 0, 0}; + got = new double[] {t.x, t.y, 0, 0}; + } + return cmp.compare(outputUnits(!angularResidual), false, expected, got, 2, + row.toleranceMetres).deviation(); + } + + private static ProjCoordinate step(Projection p, ProjCoordinate src, boolean inverse) { + ProjCoordinate dst = new ProjCoordinate(); + if (inverse) { + p.inverseProject(src, dst); + } else { + p.project(src, dst); + } + return dst; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchCorpus.java b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchCorpus.java new file mode 100644 index 0000000..1e2a29f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchCorpus.java @@ -0,0 +1,279 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.parser.dispatch; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.gie.GieTolerance; + +/** + * The {@code operation} blocks of PROJ's vendored {@code gie} corpus that exercise the + * parameters {@code Proj4Parser} learned to dispatch, read from the {@code .gie} file rather + * than transcribed into Java source. + * + *

Why nothing here is transcribed

+ * + *

A transcribed expected value can be wrong in a way that agrees with a wrong + * implementation, and then the test certifies the bug. The {@code .gie} files are + * byte-identical vendored upstream data, so reading them makes the assertion "proj4j agrees + * with PROJ 9.8.1" rather than "proj4j agrees with what somebody typed". + * + *

The corpus also happens to contain a ready-made test of the angular value grammar that + * could not be written by hand without begging the question: {@code builtins.gie} carries + * four {@code +proj=som} blocks which are two pairs, one pair written + * {@code +inc_angle=1.7157253262878522r +asc_lon=2.2298420007209447r} and the other + * {@code +inc_angle=98.30382 +asc_lon=127.7605356226}, with byte-identical expected + * values. Running all four therefore proves that the {@code r}/{@code R} radian suffix and + * decimal degrees reach the projection as the same angle — which is the specific reason these + * keys must go through the DMS-capable parser and not {@code Double.parseDouble}. + * + *

Relationship to the other two readers

+ * + *

This is deliberately not the {@code conformance} module's lexer, which implements all 19 + * gie verbs and the full failure taxonomy and is the authority for the headline number; and it + * is not {@code proj.tierA.GieBlock}, which is package-private to that package. It reads the + * six verbs these blocks use — {@code operation}, {@code tolerance}, {@code direction}, + * {@code accept}, {@code expect}, {@code roundtrip} — so a parser-dispatch regression can be + * caught in {@code core}'s own build, with no dependency on a sibling test module. + */ +final class DispatchCorpus { + + /** Repo-relative location of the vendored corpus. */ + private static final String CORPUS = "conformance/src/test/resources/gie"; + + private final String operation; + private final int lineNumber; + private final List rows; + + private DispatchCorpus(String operation, int lineNumber, List rows) { + this.operation = operation; + this.lineNumber = lineNumber; + this.rows = rows; + } + + /** One {@code accept}/{@code expect} pair, or one {@code roundtrip}. */ + static final class Row { + final double[] accept; + /** Null for a {@code roundtrip} row and for an {@code expect failure} row. */ + final double[] expect; + /** Tolerance in metres, already converted from the row's unit by {@link GieTolerance}. */ + final double toleranceMetres; + final boolean inverse; + /** {@code > 0} for a {@code roundtrip N} row. */ + final int roundtripTrips; + final boolean expectFailure; + final int lineNumber; + + Row(double[] accept, double[] expect, double toleranceMetres, boolean inverse, + int roundtripTrips, boolean expectFailure, int lineNumber) { + this.accept = accept; + this.expect = expect; + this.toleranceMetres = toleranceMetres; + this.inverse = inverse; + this.roundtripTrips = roundtripTrips; + this.expectFailure = expectFailure; + this.lineNumber = lineNumber; + } + + boolean isRoundtrip() { + return roundtripTrips > 0; + } + + @Override + public String toString() { + return "line " + lineNumber + (isRoundtrip() + ? " roundtrip " + roundtripTrips + : (inverse ? " inverse" : " forward")); + } + } + + String operation() { + return operation; + } + + int lineNumber() { + return lineNumber; + } + + List rows() { + return rows; + } + + /** The rows that assert a coordinate, i.e. excluding {@code expect failure}. */ + List coordinateRows() { + List out = new ArrayList(); + for (int i = 0; i < rows.size(); i++) { + if (!rows.get(i).expectFailure) { + out.add(rows.get(i)); + } + } + return out; + } + + /** + * The corpus directory, or a hard failure naming why. + * + *

Skips are never passes. These tests exist to prove the newly-dispatched parameters + * agree with the corpus; a missing corpus must not produce a green suite. + */ + static Path requireCorpus() { + Path dir = Paths.get("").toAbsolutePath(); + for (int up = 0; up < 6 && dir != null; up++, dir = dir.getParent()) { + Path candidate = dir.resolve(CORPUS); + if (Files.isDirectory(candidate)) { + return candidate; + } + } + throw new IllegalStateException( + "vendored gie corpus not found: expected " + CORPUS + " within six parents of " + + Paths.get("").toAbsolutePath() + ". These tests read expected values " + + "from the corpus rather than transcribing them, so a missing corpus " + + "is a failure, not a skip."); + } + + /** + * Every non-pipeline {@code operation} block in {@code file} whose definition names + * {@code +proj=} as a whole token. + * + *

Whole token, not substring: {@code som} must not also select {@code somerc}, which + * {@code builtins.gie:6646} has and which is an unrelated operator (Swiss Oblique + * Mercator). Pipelines are excluded because a pipeline is not constructible from a bare + * {@code Projection}. + * + * @param file bare file name, e.g. {@code builtins.gie} + * @param projName the {@code +proj=} value + */ + static List blocksFor(String file, String projName) { + Path path = requireCorpus().resolve(file); + List lines; + try { + lines = Files.readAllLines(path, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new UncheckedIOException("cannot read " + path, e); + } + + List blocks = new ArrayList(); + String operation = null; + int operationLine = 0; + List rows = null; + double tolerance = GieTolerance.DEFAULT_TOLERANCE; + boolean inverse = false; + double[] pendingAccept = null; + // Rows are parsed only inside a block we want: the corpus uses DMS ordinate forms such + // as `83d10'W` elsewhere, which this deliberately-minimal reader does not implement. + boolean matching = false; + + for (int i = 0; i < lines.size(); i++) { + String raw = lines.get(i); + int hash = raw.indexOf('#'); + String line = (hash >= 0 ? raw.substring(0, hash) : raw).trim(); + if (line.isEmpty() || line.startsWith("---") || line.startsWith("===") + || line.startsWith("<")) { + continue; + } + String[] tok = line.split("\\s+"); + String verb = tok[0].toLowerCase(); + + if ("operation".equals(verb)) { + if (matching) { + blocks.add(new DispatchCorpus(operation, operationLine, rows)); + } + operation = line.substring("operation".length()).trim(); + operationLine = i + 1; + matching = matches(operation, projName); + rows = new ArrayList(); + // gie resets tolerance and direction at every new operation. + tolerance = GieTolerance.DEFAULT_TOLERANCE; + inverse = false; + pendingAccept = null; + } else if (!matching) { + continue; + } else if ("tolerance".equals(verb)) { + tolerance = GieTolerance.tolerance(line.substring("tolerance".length()).trim()); + } else if ("direction".equals(verb)) { + inverse = tok.length > 1 && tok[1].toLowerCase().startsWith("inv"); + } else if ("accept".equals(verb)) { + pendingAccept = parseOrdinates(tok); + } else if ("expect".equals(verb)) { + boolean failure = tok.length > 1 && "failure".equals(tok[1].toLowerCase()); + rows.add(new Row(pendingAccept, failure ? null : parseOrdinates(tok), tolerance, + inverse, 0, failure, i + 1)); + pendingAccept = null; + } else if ("roundtrip".equals(verb)) { + double[] point = pendingAccept; + if (point == null && !rows.isEmpty()) { + // `roundtrip N` with no fresh accept reuses the last accepted point. + point = rows.get(rows.size() - 1).accept; + } + if (point != null) { + rows.add(new Row(point, null, tolerance, inverse, + tok.length > 1 ? Integer.parseInt(tok[1]) : 1, false, i + 1)); + } + pendingAccept = null; + } + } + if (matching) { + blocks.add(new DispatchCorpus(operation, operationLine, rows)); + } + return blocks; + } + + private static boolean matches(String operation, String projName) { + boolean found = false; + for (String t : operation.split("\\s+")) { + String s = t.startsWith("+") ? t.substring(1) : t; + if (s.equals("proj=pipeline")) { + return false; + } + if (s.equals("proj=" + projName)) { + found = true; + } + } + return found; + } + + /** + * Parses the ordinates of an {@code accept}/{@code expect} line. + * + *

Underscores are digit group separators in the corpus and must be stripped; + * {@link Double#parseDouble(String)} accepts them only in Java source literals, never at + * run time, so leaving them in throws on a row that is perfectly valid gie. PROJ's own + * lexer drops them in {@code pj_shrink}. + */ + private static double[] parseOrdinates(String[] tok) { + List v = new ArrayList(); + for (int i = 1; i < tok.length; i++) { + String s = tok[i]; + if (s.indexOf('_') >= 0) { + s = s.replace("_", ""); + } + v.add(Double.valueOf(s)); + } + double[] out = new double[v.size()]; + for (int i = 0; i < out.length; i++) { + out[i] = v.get(i).doubleValue(); + } + return out; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchedCorpusAgreementTest.java b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchedCorpusAgreementTest.java new file mode 100644 index 0000000..cb69c73 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/DispatchedCorpusAgreementTest.java @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.parser.dispatch; + +import org.junit.Test; + +/** + * The operators that {@code Proj4Parser}'s new parameter dispatch makes reachable, run against + * PROJ 9.8.1's own {@code gie} corpus. + * + *

Each of these had a complete, independently verified kernel and a working setter, and was + * unreachable from a proj-string for one reason only: {@code Proj4Parser} did not hand it the + * parameter. {@code ParseMode.PROJ_COMPATIBLE} retains-and-ignores unknown keys, which is + * PROJ-faithful, so the symptom was not an error — it was a fully-specified definition + * silently losing its parameters and then projecting from the defaults. + * + *

Row counts are asserted alongside the values so that a corpus that moves, or a reader that + * silently matches nothing, fails instead of passing vacuously. + * + * @see ParameterDispatchTest for the "the key actually changed the answer" side of this + */ +public class DispatchedCorpusAgreementTest { + + /** + * {@code +proj=som +inc_angle= +ps_rev= +asc_lon=} — 32 rows across four blocks. + * + *

The four blocks are two pairs differing only in how the two angles are written: + * {@code +inc_angle=1.7157253262878522r +asc_lon=2.2298420007209447r} against + * {@code +inc_angle=98.30382 +asc_lon=127.7605356226}, with identical expected values. So + * this single assertion also proves the {@code r}/{@code R} radian suffix and decimal + * degrees arrive as the same angle, which is why both go through the DMS-capable + * {@code parseAngle} and not {@code Double.parseDouble}. + */ + @Test + public void somCorpus() { + DispatchCheck.assertCorpusAgrees("builtins.gie", "som", 32); + } + + /** {@code +proj=misrsom +path=} — 16 rows across two blocks, one ellipsoidal, one spherical. */ + @Test + public void misrsomCorpus() { + DispatchCheck.assertCorpusAgrees("builtins.gie", "misrsom", 16); + } + + /** + * {@code +proj=gn_sinu +m= +n=} — 8 rows. Both keys are required upstream and both are + * undocumented ({@code gn_sinu.cpp:180-198}), so this block was unreachable without them: + * {@code +m} was not a {@code Proj4Keyword} at all and {@code +n} was dispatched only to + * {@code urmfps}. + */ + @Test + public void generalSinusoidalCorpus() { + DispatchCheck.assertCorpusAgrees("builtins.gie", "gn_sinu", 8); + } + + /** + * {@code +proj=urm5 +n=} — 4 rows. The second {@code urm5} block is + * {@code +n=1 +alpha=90}, an {@code expect failure} row which + * {@link ParameterDispatchTest#urm5RejectsNSinAlphaEqualToOne()} covers instead, since a + * failure row asserts an error rather than a coordinate. + */ + @Test + public void urmaev5Corpus() { + DispatchCheck.assertCorpusAgrees("builtins.gie", "urm5", 4); + } + + /** + * {@code +proj=col_urban +h_0=} — 1 {@code expect} plus 1 {@code roundtrip}. Upstream's + * own comment records this as the IOGP 373-7-2 Guidance Note 7 part 2 test point, and + * {@code +h_0=2550} is the operator's only mandatory parameter beyond the ellipsoid. + */ + @Test + public void colombiaUrbanCorpus() { + DispatchCheck.assertCorpusAgrees("builtins.gie", "col_urban", 2); + } + + /** + * {@code +proj=ob_tran +o_proj= +o_lon_p= +o_lat_p=} — 8 rows. The second corpus block, + * {@code +o_proj +o_proj=ob_tran}, is an {@code expect failure} row and is asserted in + * {@link ParameterDispatchTest#obTranRefusesToRotateItself()} instead. + * + *

The child here is {@code latlon}, which makes the wrapper's output units + * {@code PJ_IO_UNITS_WHATEVER} ({@code ob_tran.cpp:296-298}) and its output affine the + * identity, so the corpus's forward expectations are raw radians rather than metres — + * {@code -2.685687214} for {@code accept 2 1}. That is exactly what + * {@code ObliqueTransformationProjection.initialize()} reproduces by setting {@code a}, + * {@code fromMetres} and the false origin to the identity, and it is why the forward rows + * agree to 1e-9 without any unit conversion. + */ + @Test + public void obliqueTransformationCorpus() { + DispatchCheck.assertCorpusAgrees("builtins.gie", "ob_tran", 8); + } + + /** + * {@code more_builtins.gie}'s {@code +proj=ob_tran +o_proj=moll} block — 2 rows, one in each + * direction, and the reason this file's count moved too. The child is {@code moll}, which is + * not geographic, so unlike the {@code builtins.gie} block the full metre-valued + * affine applies. + */ + @Test + public void obliqueTransformationMoreBuiltinsCorpus() { + DispatchCheck.assertCorpusAgrees("more_builtins.gie", "ob_tran", 2); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/dispatch/FlagAndVariantDispatchTest.java b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/FlagAndVariantDispatchTest.java new file mode 100644 index 0000000..59fa575 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/FlagAndVariantDispatchTest.java @@ -0,0 +1,698 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.parser.dispatch; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.parser.Proj4Keyword; +import org.locationtech.proj4j.proj.AiryProjection; +import org.locationtech.proj4j.proj.CassiniProjection; +import org.locationtech.proj4j.proj.EquidistantAzimuthalProjection; +import org.locationtech.proj4j.proj.HammerProjection; +import org.locationtech.proj4j.proj.InternationalMapOfTheWorldPolyconicProjection; +import org.locationtech.proj4j.proj.LabordeProjection; +import org.locationtech.proj4j.proj.LagrangeProjection; +import org.locationtech.proj4j.proj.LandsatProjection; +import org.locationtech.proj4j.proj.ObliqueCylindricalEqualAreaProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TiltedPerspectiveProjection; +import org.locationtech.proj4j.proj.TwoPointEquidistantProjection; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The second wave of parameter dispatch: {@code +tilt}, {@code +over}, {@code +W}, {@code +M}, + * {@code +lsat}, {@code +path} on {@code lsat}, {@code +no_cut}, {@code +lat_b}, {@code +guam}, + * {@code +hyperbolic}, the {@code +azi} fan-out to {@code tpers} and {@code labrd}, and the + * {@code +lon_1}/{@code +lon_2} fan-out to {@code ocea}, {@code tpeqd} and {@code imw_p}. + * + *

The evidence has to be behavioural, not "it parsed"

+ * + *

{@code ParseMode.PROJ_COMPATIBLE} retains and ignores an unrecognised key, exactly as + * {@code init.cpp} does, so "the definition was accepted" and "a projection was built" were both + * already true before any of these were dispatched. Every assertion here is therefore of the form + * changing or removing the key changes the observable outcome. See + * {@link ParameterDispatchTest} for the same discipline applied to the first wave. + * + *

Two traps this file is the regression net for

+ * + *

1. A key with more readers than you looked for. {@code +W} was registered for + * {@code lagrng} on the assumption that {@code lagrng} was its only reader. It is not: + * {@code hammer.cpp:63-70} reads it too, and the omission turned + * {@code builtins.gie:2596}'s {@code +proj=hammer +a=6400000 +W=1} from an honest + * {@code NOT_IMPLEMENTED} into a failed to fail — the row asserts a domain error at + * {@code (-180, 0)}, which the true {@code W = 1} forward raises and the dropped-to-{@code .5} + * default does not. The corpus caught it; {@link #wReachesBothOfItsReaders()} is here so the + * corpus does not have to next time. The cheap check before registering any key is + * {@code git grep -nE 'pj_param[^"]*"[a-z]KEY"' 9.8.1 -- src/}. + * + *

2. {@code initialize()} runs TWICE — once from a projection's own constructor and + * once from {@code Proj4Parser} after it has finished setting parameters. A value written into a + * field that {@code initialize()} also writes is silently discarded on the second pass, which is + * why {@code +no_rot} could not be dispatched until {@code ObliqueMercatorProjection.rot} became a + * field initialiser. There is a {@code …SurvivesTheSecondInitialize} assertion below for every + * setter this wave newly reaches. + * + * @see ParameterDispatchTest + */ +public class FlagAndVariantDispatchTest { + + // ------------------------------------------------------------------ +proj=tpers + + private static final String TPERS = "+proj=tpers +a=6400000 +h=1000000"; + + /** + * {@code +azi} and {@code +tilt} each change the answer, so each is genuinely read. + * + *

This is the assertion that had to exist before {@code tpers} could be registered at all. + * {@code Registry} deliberately withheld the name while {@code Proj4Parser} routed {@code +azi} + * to {@code SpilhausProjection} alone, because {@code +proj=tpers +azi=20} would then have + * projected as an un-rotated {@code nsper} — a plausible wrong map, which is strictly + * worse than a missing operator. + */ + @Test + public void tpersAziAndTiltEachChangeTheAnswer() { + String plain = outcome(TPERS, 2, 1); + assertNotEquals("+azi was dropped on tpers", plain, outcome(TPERS + " +azi=20", 2, 1)); + assertNotEquals("+tilt was dropped on tpers", plain, outcome(TPERS + " +tilt=20", 2, 1)); + assertNotEquals("+azi and +tilt are not distinct on tpers", + outcome(TPERS + " +azi=20", 2, 1), outcome(TPERS + " +tilt=20", 2, 1)); + } + + /** + * Both are {@code pj_param}'s {@code r} sigil ({@code nsper.cpp:186-187}), so they land on the + * fields in radians and accept every {@code dmstor} form — DMS, a trailing cardinal and + * the {@code r}/{@code R} radian suffix that {@code Double.parseDouble} rejects outright. + */ + @Test + public void tpersAnglesAreReadAsAnglesInRadians() { + TiltedPerspectiveProjection p = + (TiltedPerspectiveProjection) projection(TPERS + " +azi=20 +tilt=30"); + assertEquals(20 * ProjectionMath.DTR, p.getAziRadians(), 1e-15); + assertEquals(30 * ProjectionMath.DTR, p.getTiltRadians(), 1e-15); + + assertEquals("the r suffix is not reaching +tilt", outcome(TPERS + " +tilt=30", 2, 1), + outcome(TPERS + " +tilt=" + (30 * ProjectionMath.DTR) + "r", 2, 1)); + assertEquals("DMS is not reaching +azi", outcome(TPERS + " +azi=20.5", 2, 1), + outcome(TPERS + " +azi=20d30'", 2, 1)); + assertEquals("a trailing cardinal is not reaching +azi", outcome(TPERS + " +azi=-20", 2, 1), + outcome(TPERS + " +azi=20W", 2, 1)); + } + + @Test + public void tpersAnglesSurviveTheSecondInitialize() { + TiltedPerspectiveProjection p = new TiltedPerspectiveProjection(); + p.setAziRadians(0.35); + p.setTiltRadians(0.45); + p.setHeightOfOrbit(1000000); + p.initialize(); + p.initialize(); + assertEquals(0.35, p.getAziRadians(), 0.0); + assertEquals(0.45, p.getTiltRadians(), 0.0); + } + + /** + * {@code labrd} reads {@code +azi} too ({@code labrd.cpp:117}, which rotates its complex + * correction by {@code 2*Az}) and had been registered in {@code Registry} while {@code +azi} + * reached {@code SpilhausProjection} alone — i.e. with the same hole open, silently. No + * corpus row exercises {@code labrd +azi}, which is exactly why it survived unnoticed, and + * exactly why this assertion is not redundant with the {@code tpers} ones above. + */ + @Test + public void labrdAziIsDispatched() { + String base = "+proj=labrd +ellps=GRS80 +lon_0=0.5 +lat_0=2"; + assertNotEquals("+azi was dropped on labrd", outcome(base, 2, 1), + outcome(base + " +azi=20", 2, 1)); + LabordeProjection p = (LabordeProjection) projection(base + " +azi=20"); + assertEquals(20 * ProjectionMath.DTR, p.getAziRadians(), 1e-15); + } + + @Test + public void labrdAziSurvivesTheSecondInitialize() { + LabordeProjection p = new LabordeProjection(); + p.setProjectionLatitude(2 * ProjectionMath.DTR); + p.setAziRadians(0.35); + p.initialize(); + p.initialize(); + assertEquals(0.35, p.getAziRadians(), 0.0); + } + + // ------------------------------------------------------------------ +over + + /** + * {@code +over} is global ({@code init.cpp:601}), not operator-scoped, and it is read + * with the {@code b} sigil — so a bare {@code +over} is true and {@code +over=f} is + * explicitly false rather than a presence flag. + * + *

Asserted on the inverse, where {@code inv_finalize} ({@code inv.cpp:115-116}) is the only + * consumer: {@code +over} keeps a longitude past the antimeridian instead of wrapping it, which + * is the point — on a map drawn past 180°, 200°E and 160°W are different + * places on the page. + */ + @Test + public void overSuppressesTheInverseWrapAndIsABooleanSigil() { + String base = "+proj=eqc +a=6400000"; + double past = 6400000 * 200 * ProjectionMath.DTR; // 200 deg of easting + + ProjCoordinate wrapped = inverse(base, past, 0); + ProjCoordinate unwrapped = inverse(base + " +over", past, 0); + assertEquals("without +over the inverse must wrap to -160", -160.0, wrapped.x, 1e-9); + assertEquals("with +over the inverse must stay at 200", 200.0, unwrapped.x, 1e-9); + + assertEquals("+over=f must be OFF: it is pj_param's 'b' sigil, not a presence flag", + -160.0, inverse(base + " +over=f", past, 0).x, 1e-9); + assertEquals("+over=T must be ON", 200.0, inverse(base + " +over=T", past, 0).x, 1e-9); + } + + /** + * A bad {@code b}-sigil value is an error rather than a silent default, matching + * {@code param.cpp}: anything other than empty, {@code T}/{@code t} or {@code F}/{@code f} + * sets {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}. + */ + @Test + public void overRejectsANonBooleanValue() { + assertRejects("+proj=eqc +a=6400000 +over=yes", "over"); + } + + /** + * The forward honours it too. {@code fwd_prepare} skips both of its {@code adjlon} + * calls under {@code +over} ({@code fwd.cpp:82-83}, {@code :109-111}); this class's forward + * funnels wrap only when {@code lon_0 != 0}, so this assertion is specifically that + * {@code +over} suppresses that one and does not also suppress the subtraction of + * {@code lon_0} — folding the two into one guard would silently change the central + * meridian instead of the wrapping. + */ + @Test + public void overSuppressesTheForwardWrapWithoutLosingLon0() { + String base = "+proj=eqc +a=6400000 +lon_0=10"; + double eastingAt200 = forward(base + " +over", 200, 0).x; + // 200 - 10 = 190 degrees from the central meridian, NOT wrapped to -170 and not 200. + assertEquals(6400000 * 190 * ProjectionMath.DTR, eastingAt200, 1e-6); + assertEquals("without +over the same point must wrap to -170 from the central meridian", + 6400000 * -170 * ProjectionMath.DTR, forward(base, 200, 0).x, 1e-6); + } + + /** + * {@code vandg_s_forward} is the one projection whose own kernel reads + * {@code P->over} ({@code vandg.cpp:25-27}): past the antimeridian the (29-3) auxiliary + * {@code A} changes sign, because the map continues outward instead of folding back. So + * {@code +over} on {@code vandg} is not merely "do not wrap" — it is a different easting. + */ + @Test + public void vandgForwardReadsOverItself() { + String base = "+proj=vandg +a=6400000"; + // 179.9 is inside the antimeridian, so +over cannot change it. + assertEquals("+over must not change a point inside the antimeridian", + forward(base, 179.9, 50).x, forward(base + " +over", 179.9, 50).x, 1e-6); + // 180.1 is outside it, so it must -- and must not merely equal the 179.9 answer. + double over = forward(base + " +over", 180.1, 50).x; + assertTrue("+over past the antimeridian must give a LARGER easting than 179.9 does, " + + "not the same one: got " + over, + over > forward(base, 179.9, 50).x + 1000.0); + } + + // ------------------------------------------------------------------ +W and +M + + /** + * {@code +W} has two readers upstream, {@code lagrng} and {@code hammer}, and + * dispatching it to only one of them was measured to break the corpus. See this class's + * javadoc. + */ + @Test + public void wReachesBothOfItsReaders() { + String lagrng = "+proj=lagrng +a=6400000"; + assertNotEquals("+W was dropped on lagrng", outcome(lagrng, 2, 1), + outcome(lagrng + " +W=1.5", 2, 1)); + assertEquals(1.5, ((LagrangeProjection) projection(lagrng + " +W=1.5")).getW(), 0.0); + + String hammer = "+proj=hammer +a=6400000"; + assertNotEquals("+W was dropped on hammer -- this is the omission that turned " + + "builtins.gie:2596 into a failed-to-fail", + outcome(hammer, 2, 1), outcome(hammer + " +W=1", 2, 1)); + assertNotEquals("+M was dropped on hammer", outcome(hammer, 2, 1), + outcome(hammer + " +M=2", 2, 1)); + + HammerProjection h = (HammerProjection) projection(hammer + " +W=1 +M=2"); + assertEquals(1.0, h.getW(), 0.0); + assertEquals(2.0, h.getM(), 0.0); + } + + /** + * The consequence that was actually observed: at {@code (-180, 0)} the {@code W = 1} forward is + * singular and the {@code W = .5} default is not, so a dropped {@code +W} answers a plausible + * easting where PROJ raises a domain error. {@code builtins.gie:2596} is exactly this row. + */ + @Test + public void hammerWEqualsOneIsSingularAtTheAntimeridian() { + try { + ProjCoordinate out = forward("+proj=hammer +a=6400000 +W=1", -180, 0); + fail("+proj=hammer +W=1 must refuse (-180, 0): 1 + cos(phi)cos(W*lam) is exactly " + + "zero there. It projected to " + out.x + " " + out.y + ", which means +W " + + "was dropped and the .5 default was used -- exactly the failed-to-fail " + + "this test exists to pin."); + } catch (Proj4jException expected) { + // hammer_s_forward's `denom == 0` guard, cass-style domain error. + } + // ... and the default is NOT singular there, which is why the omission was invisible: + // a dropped +W answers a plausible easting where PROJ raises a domain error. + forward("+proj=hammer +a=6400000", -180, 0); + } + + /** {@code W <= 0} is a hard error in both readers, though only {@code hammer} takes fabs. */ + @Test + public void wIsRangeCheckedByBothReaders() { + assertRejects("+proj=lagrng +a=6400000 +W=0", "W"); + assertRejects("+proj=hammer +a=6400000 +W=0", "W"); + assertRejects("+proj=hammer +a=6400000 +M=0", "M"); + // hammer fabs's them, so a negative value is legal there and lagrng rejects it. + forward("+proj=hammer +a=6400000 +W=-1", 2, 1); + } + + @Test + public void wAndMSurviveTheSecondInitialize() { + LagrangeProjection l = new LagrangeProjection(); + l.setW(1.5); + l.initialize(); + l.initialize(); + assertEquals(1.5, l.getW(), 0.0); + + HammerProjection h = new HammerProjection(); + h.setW(1.0); + h.setM(2.0); + h.initialize(); + h.initialize(); + assertEquals("hammer's initialize() derives Q->m = M/W; if getM() drifts it has written " + + "the derived value back over the parameter", 2.0, h.getM(), 0.0); + assertEquals(1.0, h.getW(), 0.0); + } + + // ------------------------------------------------------------------ +lsat and +path + + /** + * {@code lsat} hard-coded {@code land = 1} and {@code path = 120} into locals behind a + * {@code //FIXME}, so there was nothing for a setter to write and + * {@code +proj=lsat +lsat=5 +path=2} silently returned Landsat 1 path 120's map. That is why + * the conformance bridge classified {@code +path} as conditionally honoured rather than + * honoured. + */ + @Test + public void lsatAndPathEachChangeTheAnswer() { + String base = "+proj=lsat +ellps=GRS80"; + assertNotEquals("+path was dropped on lsat", outcome(base, 2, 1), + outcome(base + " +path=2", 2, 1)); + assertNotEquals("+lsat was dropped", outcome(base, 2, 1), + outcome(base + " +lsat=5", 2, 1)); + + LandsatProjection p = (LandsatProjection) projection(base + " +lsat=5 +path=2"); + assertEquals(5, p.getLandsat()); + assertEquals(2, p.getPath()); + } + + /** + * Both are {@code pj_param}'s {@code i} sigil, whose grammar is decimal digits and nothing + * else: {@code param.cpp:180-187} runs {@code atoi} and then rejects the value if any + * character is outside {@code 0-9}, so a sign, a decimal point and trailing text are all errors + * rather than partial parses. + */ + @Test + public void lsatAndPathUseTheStrictIntegerGrammar() { + assertRejects("+proj=lsat +ellps=GRS80 +path=12a", "path"); + assertRejects("+proj=lsat +ellps=GRS80 +path=-5", "path"); + assertRejects("+proj=lsat +ellps=GRS80 +path=1.0", "path"); + assertRejects("+proj=lsat +ellps=GRS80 +lsat=2a", "lsat"); + } + + /** Upstream's two range checks: {@code lsat} in {@code [1,5]}, {@code path} vehicle-dependent. */ + @Test + public void lsatAndPathAreRangeChecked() { + assertRejects("+proj=lsat +ellps=GRS80 +lsat=6", "lsat"); + assertRejects("+proj=lsat +ellps=GRS80 +lsat=0", "lsat"); + assertRejects("+proj=lsat +ellps=GRS80 +lsat=1 +path=252", "path"); + assertRejects("+proj=lsat +ellps=GRS80 +lsat=5 +path=234", "path"); + // 251 is legal for vehicles 1-3 and not for 4-5, which is the whole point of the + // vehicle-dependent bound. + forward("+proj=lsat +ellps=GRS80 +lsat=3 +path=251", 2, 1); + assertRejects("+proj=lsat +ellps=GRS80 +lsat=4 +path=251", "path"); + } + + @Test + public void lsatAndPathSurviveTheSecondInitialize() { + LandsatProjection p = new LandsatProjection(); + p.setLandsat(5); + p.setPath(2); + p.initialize(); + p.initialize(); + assertEquals(5, p.getLandsat()); + assertEquals(2, p.getPath()); + } + + // ------------------------------------------------------------------ airy + + /** + * {@code +no_cut} is a {@code b} sigil and {@code +lat_b} an {@code r} ({@code airy.cpp:119-120}). + * {@code +no_cut} is asserted through the far hemisphere, which {@code airy} rejects by default + * and projects with the flag — a difference between refusing and answering, which is the + * strongest possible evidence the flag was read. + */ + @Test + public void airyNoCutAndLatBAreDispatched() { + String base = "+proj=airy +R=1 +lat_0=-90"; + assertRejects(base, "hemisphere"); + forward(base + " +no_cut", 2, 1); + assertEquals("+no_cut=f must be OFF: it is a 'b' sigil", outcome(base, 2, 1), + outcome(base + " +no_cut=f", 2, 1)); + + String equatorial = "+proj=airy +R=1"; + assertNotEquals("+lat_b was dropped", outcome(equatorial, 2, 1), + outcome(equatorial + " +lat_b=45", 2, 1)); + assertEquals(45 * ProjectionMath.DTR, + ((AiryProjection) projection(equatorial + " +lat_b=45")).getLatB(), 1e-15); + } + + @Test + public void airyFlagsSurviveTheSecondInitialize() { + AiryProjection p = new AiryProjection(); + p.setNoCut(true); + p.setLatB(0.5); + p.initialize(); + p.initialize(); + assertTrue("setNoCut must survive a second initialize(); it used to be overwritten with " + + "false inside initialize() behind a //FIXME", p.isNoCut()); + assertEquals(0.5, p.getLatB(), 0.0); + } + + // ------------------------------------------------------------------ +guam + + /** + * {@code +guam} swaps both of {@code aeqd}'s kernels ({@code aeqd.cpp:301-304}), and does so + * only on the ellipsoidal branch — upstream reads the key inside the + * {@code es != 0} arm, so on a declared sphere it is consumed and ignored rather than being an + * error or a different projection. + */ + @Test + public void guamAppliesOnAnEllipsoidAndIsInertOnASphere() { + String ell = "+proj=aeqd +ellps=clrk66 +lat_0=13.47246633333333 " + + "+lon_0=144.74875069444445"; + assertNotEquals("+guam was dropped on aeqd", outcome(ell, 144.6, 13.3), + outcome(ell + " +guam", 144.6, 13.3)); + assertTrue(((EquidistantAzimuthalProjection) projection(ell + " +guam")).isGuam()); + + String sph = "+proj=aeqd +R=6378206.4 +lat_0=13.47246633333333 " + + "+lon_0=144.74875069444445"; + assertEquals("+guam must be inert on a declared sphere, as it is upstream", + outcome(sph, 144.6, 13.3), outcome(sph + " +guam", 144.6, 13.3)); + + assertEquals("+guam=f must be OFF: it is a 'b' sigil", outcome(ell, 144.6, 13.3), + outcome(ell + " +guam=f", 144.6, 13.3)); + } + + /** The Guam kernels are mutual inverses, which the truncated series only is near the origin. */ + @Test + public void guamRoundTrips() { + String ell = "+proj=aeqd +guam +ellps=clrk66 +lat_0=13.47246633333333 " + + "+lon_0=144.74875069444445 +x_0=50000 +y_0=50000"; + ProjCoordinate xy = forward(ell, 144.635331291666660, 13.33903846111111); + ProjCoordinate lp = inverse(ell, xy.x, xy.y); + assertEquals(144.635331291666660, lp.x, 1e-8); + assertEquals(13.33903846111111, lp.y, 1e-8); + } + + @Test + public void guamSurvivesTheSecondInitialize() { + EquidistantAzimuthalProjection p = new EquidistantAzimuthalProjection(); + p.setGuam(true); + p.initialize(); + p.initialize(); + assertTrue(p.isGuam()); + } + + // ------------------------------------------------------------------ +hyperbolic + + /** + * {@code +hyperbolic} is read with {@code pj_param_exists} and not with the {@code b} + * sigil ({@code cass.cpp:127}), which makes it the one flag in this file where + * {@code +hyperbolic=f} is true: presence is the whole test. That asymmetry with + * {@code +no_cut}, {@code +guam} and {@code +over} is upstream's, and it is what a + * "flags are booleans" generalisation gets wrong. + */ + @Test + public void hyperbolicIsPresenceOnlyNotBoolean() { + String base = "+proj=cass +a=6378306.376305601 +rf=293.466307 +lat_0=-16.25 " + + "+lon_0=179.33333333333333"; + String plain = outcome(base, 180, -16.8); + assertNotEquals("+hyperbolic was dropped on cass", plain, outcome(base + " +hyperbolic", 180, -16.8)); + assertEquals("+hyperbolic=f must be TRUE: upstream reads it with pj_param_exists, so " + + "presence is the whole test and the value is never looked at", + outcome(base + " +hyperbolic", 180, -16.8), + outcome(base + " +hyperbolic=f", 180, -16.8)); + assertTrue(((CassiniProjection) projection(base + " +hyperbolic")).isHyperbolic()); + } + + /** Inert on a sphere, matching {@code PJ_PROJECTION(cass)}, which returns before reading it. */ + @Test + public void hyperbolicIsInertOnASphere() { + String sph = "+proj=cass +R=6378306.376305601 +lat_0=-16.25"; + assertEquals(outcome(sph, 180, -16.8), outcome(sph + " +hyperbolic", 180, -16.8)); + } + + /** + * {@code cass_e_inverse} refines with {@code pj_generic_inverse_2d} unconditionally + * ({@code cass.cpp:81}), seeded from the non-hyperbolic series, so the hyperbolic inverse comes + * out of Newton on the hyperbolic forward and cannot drift from it by construction. + */ + @Test + public void hyperbolicRoundTrips() { + String base = "+proj=cass +hyperbolic +a=6378306.376305601 +rf=293.466307 " + + "+lat_0=-16.25 +lon_0=179.33333333333333"; + ProjCoordinate xy = forward(base, 179.99433652777776, -16.841456527777776); + ProjCoordinate lp = inverse(base, xy.x, xy.y); + assertEquals(179.99433652777776, lp.x, 1e-9); + assertEquals(-16.841456527777776, lp.y, 1e-9); + } + + @Test + public void hyperbolicSurvivesTheSecondInitialize() { + CassiniProjection p = new CassiniProjection(); + p.setHyperbolic(true); + p.initialize(); + p.initialize(); + assertTrue(p.isHyperbolic()); + } + + // ------------------------------------------------------------------ +lon_1 / +lon_2 + + /** + * {@code +lon_1}/{@code +lon_2} have four readers, not one. They were dispatched to + * {@code omerc} while {@code ocea}, {@code tpeqd} and {@code imw_p} read {@code 0} silently and + * the conformance bridge listed both keys as honoured — i.e. the bridge vouched for a key + * three of the four readers dropped. + * + *

{@code builtins.gie} makes it visible on {@code ocea}, whose five two-point blocks use + * {@code +lon_2=1e-8}, {@code -1e-8} and {@code 1e-5} to select the east, west and north-east + * framings. With the key dropped all three collapsed onto the north one. + */ + @Test + public void lonOneAndLonTwoReachAllFourReaders() { + String ocea = "+proj=ocea +a=6400000 +lat_1=45 +lat_2=45"; + assertNotEquals("+lon_2 was dropped on ocea: east and west must not coincide", + outcome(ocea + " +lon_1=0 +lon_2=1e-8", 2, 1), + outcome(ocea + " +lon_1=0 +lon_2=-1e-8", 2, 1)); + ObliqueCylindricalEqualAreaProjection o = (ObliqueCylindricalEqualAreaProjection) + projection(ocea + " +lon_1=1 +lon_2=2"); + assertEquals(1 * ProjectionMath.DTR, o.getLon1(), 1e-15); + assertEquals(2 * ProjectionMath.DTR, o.getLon2(), 1e-15); + + String tpeqd = "+proj=tpeqd +a=6400000 +lat_1=10 +lat_2=20"; + assertNotEquals("+lon_1/+lon_2 were dropped on tpeqd", outcome(tpeqd, 2, 1), + outcome(tpeqd + " +lon_1=5 +lon_2=15", 2, 1)); + TwoPointEquidistantProjection t = (TwoPointEquidistantProjection) + projection(tpeqd + " +lon_1=5 +lon_2=15"); + assertEquals(5 * ProjectionMath.DTR, t.getLon1(), 1e-15); + assertEquals(15 * ProjectionMath.DTR, t.getLon2(), 1e-15); + + String imwp = "+proj=imw_p +ellps=GRS80 +lat_1=0 +lat_2=10"; + assertNotEquals("+lon_1 was dropped on imw_p", outcome(imwp, 2, 1), + outcome(imwp + " +lon_1=5", 2, 1)); + InternationalMapOfTheWorldPolyconicProjection i = + (InternationalMapOfTheWorldPolyconicProjection) projection(imwp + " +lon_1=5"); + assertEquals(5 * ProjectionMath.DTR, i.getLon1(), 1e-15); + } + + /** + * {@code imw_p} reads {@code +lon_1} and not {@code +lon_2} ({@code imw_p.cpp:191-192}), + * and for it absence is not zero: {@code lam_1} is derived from the latitudes instead + * ({@code imw_p.cpp:191}). So a 0 default would be a different projection, not a missing + * parameter. + */ + @Test + public void imwPAbsentLonOneIsNotZero() { + String imwp = "+proj=imw_p +ellps=GRS80 +lat_1=0 +lat_2=10"; + assertNotEquals("absent +lon_1 must derive lam_1 from the latitudes, not default to 0", + outcome(imwp, 2, 1), outcome(imwp + " +lon_1=0", 2, 1)); + assertTrue("absent +lon_1 must stay NaN so initialize() can tell it from zero", + Double.isNaN(((InternationalMapOfTheWorldPolyconicProjection) projection(imwp)) + .getLon1())); + } + + /** + * All four setters take radians and all four keys are {@code r} sigils, so the whole + * {@code dmstor} grammar has to work — including the {@code r} suffix, which + * {@code Double.parseDouble} rejects outright. + */ + @Test + public void lonOneAcceptsEveryDmstorForm() { + String tpeqd = "+proj=tpeqd +a=6400000 +lat_1=10 +lat_2=20 +lon_2=15"; + assertEquals("the r suffix is not reaching +lon_1", outcome(tpeqd + " +lon_1=5", 2, 1), + outcome(tpeqd + " +lon_1=" + (5 * ProjectionMath.DTR) + "r", 2, 1)); + assertEquals("DMS is not reaching +lon_1", outcome(tpeqd + " +lon_1=5.5", 2, 1), + outcome(tpeqd + " +lon_1=5d30'", 2, 1)); + assertEquals("a trailing cardinal is not reaching +lon_1", + outcome(tpeqd + " +lon_1=-5", 2, 1), outcome(tpeqd + " +lon_1=5W", 2, 1)); + } + + @Test + public void lonOneAndLonTwoSurviveTheSecondInitialize() { + ObliqueCylindricalEqualAreaProjection o = new ObliqueCylindricalEqualAreaProjection(); + o.setProjectionLatitude1(10 * ProjectionMath.DTR); + o.setProjectionLatitude2(20 * ProjectionMath.DTR); + o.setLon1(0.1); + o.setLon2(0.2); + o.initialize(); + o.initialize(); + assertEquals(0.1, o.getLon1(), 0.0); + assertEquals(0.2, o.getLon2(), 0.0); + + TwoPointEquidistantProjection t = new TwoPointEquidistantProjection(); + t.setProjectionLatitude1(10 * ProjectionMath.DTR); + t.setProjectionLatitude2(20 * ProjectionMath.DTR); + t.setLon1(0.1); + t.setLon2(0.2); + t.initialize(); + t.initialize(); + assertEquals(0.1, t.getLon1(), 0.0); + assertEquals(0.2, t.getLon2(), 0.0); + + InternationalMapOfTheWorldPolyconicProjection i = + new InternationalMapOfTheWorldPolyconicProjection(); + i.setProjectionLatitude1(0); + i.setProjectionLatitude2(10 * ProjectionMath.DTR); + i.setLon1(0.1); + i.initialize(); + i.initialize(); + assertEquals(0.1, i.getLon1(), 0.0); + } + + // ------------------------------------------------------------------ the allow-list + + /** + * Every key this wave dispatches is in {@code Proj4Keyword.supportedParameters()}, and the + * three halves — the allow-list, {@code Proj4Parser}'s dispatch and the conformance + * bridge's {@code HONOURED} — must move in one change. Registering a key the + * parser ignores makes the bridge call a definition executable and return a plausible wrong + * answer instead of an honest {@code NOT_IMPLEMENTED}; the reverse merely loses coverage. + */ + @Test + public void everyKeyInThisWaveIsRegistered() { + for (String key : new String[] {Proj4Keyword.tilt, Proj4Keyword.over, Proj4Keyword.W, + Proj4Keyword.M, Proj4Keyword.lsat, Proj4Keyword.path, Proj4Keyword.no_cut, + Proj4Keyword.lat_b, Proj4Keyword.guam, Proj4Keyword.hyperbolic, + Proj4Keyword.lon_1, Proj4Keyword.lon_2, Proj4Keyword.azi}) { + assertTrue("+" + key + " is dispatched by Proj4Parser but is not in " + + "Proj4Keyword.supportedParameters(), so STRICT mode refuses it", + Proj4Keyword.isSupported(key)); + } + } + + /** + * {@code +theta} is deliberately NOT registered. It is read by {@code oea} alone + * ({@code oea.cpp:74}) and {@code oea} is not ported — {@code Registry}'s line for it is + * still commented out — so there is nothing to dispatch it to. Registering an operator's + * key before the operator exists is the mirror of the {@code tpers} trap and gains nothing: + * {@code +proj=oea} is refused on the name. + * + *

{@code +n} and {@code +m}, {@code oea}'s other two, are registered for {@code urmfps}, + * {@code urm5}, {@code gn_sinu} and {@code fouc_s} and are unaffected. + */ + @Test + public void thetaIsDeliberatelyNotRegisteredBecauseOeaIsNotPorted() { + assertFalse("+theta must stay unregistered while +proj=oea is unported. Invert this " + + "assertion in the same change that ports it.", + Proj4Keyword.isSupported("theta")); + assertRejects("+proj=oea +a=6400000 +n=1 +m=2 +theta=3", "oea"); + } + + // -------------------------------------------------------------------- helpers + + private static Projection projection(String definition) { + CoordinateReferenceSystem crs = + new CRSFactory().createFromParameters("dispatch", definition); + return crs.getProjection(); + } + + private static ProjCoordinate forward(String definition, double lon, double lat) { + ProjCoordinate out = new ProjCoordinate(); + projection(definition).project(new ProjCoordinate(lon, lat), out); + return out; + } + + private static ProjCoordinate inverse(String definition, double x, double y) { + ProjCoordinate out = new ProjCoordinate(); + projection(definition).inverseProject(new ProjCoordinate(x, y), out); + return out; + } + + /** + * The observable outcome of projecting one point: the coordinate, or the exception's class and + * message. Folded into one string because "did this key change anything?" is answered yes + * whether the change is a different number or the difference between answering and refusing. + */ + private static String outcome(String definition, double lon, double lat) { + try { + ProjCoordinate out = forward(definition, lon, lat); + return out.x + " " + out.y; + } catch (RuntimeException e) { + return e.getClass().getSimpleName() + ": " + e.getMessage(); + } + } + + /** + * Asserts that a definition refuses {@code (2, 1)} — or refuses to be built — with + * {@code expectedInMessage} named in the reason. The message check is what stops the assertion + * passing for the wrong reason, which several of these would. + */ + private static void assertRejects(String definition, String expectedInMessage) { + try { + ProjCoordinate out = forward(definition, 2, 1); + fail("expected " + definition + " to be refused, but it projected (2, 1) to " + + out.x + " " + out.y); + } catch (Proj4jException e) { + String message = e.getMessage() == null ? "" : e.getMessage(); + assertTrue(definition + " was refused, but for an unexpected reason -- \"" + + expectedInMessage + "\" does not appear in: " + + e.getClass().getSimpleName() + ": " + message, + message.toLowerCase().contains(expectedInMessage.toLowerCase())); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/parser/dispatch/ParameterDispatchTest.java b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/ParameterDispatchTest.java new file mode 100644 index 0000000..4def22b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/parser/dispatch/ParameterDispatchTest.java @@ -0,0 +1,588 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.parser.dispatch; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.parser.Proj4Keyword; +import org.locationtech.proj4j.proj.ObliqueMercatorProjection; +import org.locationtech.proj4j.parser.Proj4Parser; +import org.locationtech.proj4j.proj.ColombiaUrbanProjection; +import org.locationtech.proj4j.proj.GeneralSinusoidalProjection; +import org.locationtech.proj4j.proj.MisrSpaceObliqueMercatorProjection; +import org.locationtech.proj4j.proj.ObliqueTransformationProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpaceObliqueMercatorProjection; +import org.locationtech.proj4j.proj.Urmaev5Projection; + +/** + * The regression net for the silent parameter loss defect. + * + *

What is being proved, and why a "does it parse" test would prove nothing

+ * + *

{@code ParseMode.PROJ_COMPATIBLE} retains-and-ignores unrecognised keys, which is exactly + * what PROJ does — {@code init.cpp} keeps every token and recognition is pull-based, so an + * unknown {@code +key} is never an error. The consequence is that a definition which the parser + * does not dispatch parses cleanly and projects, from the operator's defaults. So + * "the definition was accepted" is worthless as evidence, and so is "the projection was + * constructed": both were already true before the dispatch existed. + * + *

The evidence that dispatch happened is therefore always the same shape: removing the + * key, or changing its value, must change the observable outcome. Every test below is that + * assertion. Several of the keys had a defaulted value that was not merely wrong but plausible — + * {@code som}'s three orbital parameters all default to {@code 0}, and {@code 0} passes all + * three of upstream's own range checks, yielding the coordinates of a satellite in a + * zero-inclination zero-period orbit. + * + * @see DispatchedCorpusAgreementTest for agreement with PROJ's expected values + */ +public class ParameterDispatchTest { + + // ------------------------------------------------------------------ +proj=som + + private static final String SOM = + "+proj=som +ellps=GRS80 +inc_angle=98.30382 +ps_rev=0.06866666666666667 " + + "+asc_lon=127.7605356226"; + + /** + * Each of {@code som}'s three orbital parameters changes the answer, so each of them is + * genuinely read. + * + *

This is the test that would have caught the original defect. Before the dispatch + * landed, all four of {@code builtins.gie}'s {@code som} blocks reduced to the same + * degenerate orbit, so the "with" and "without" outcomes were identical — and identical + * to each other. + */ + @Test + public void somOrbitalParametersEachChangeTheAnswer() { + String full = outcome(SOM, 2, 1); + assertNotEquals("+inc_angle was dropped: removing it did not change the answer", + full, outcome(without(SOM, "inc_angle"), 2, 1)); + assertNotEquals("+ps_rev was dropped: removing it did not change the answer", + full, outcome(without(SOM, "ps_rev"), 2, 1)); + assertNotEquals("+asc_lon was dropped: removing it did not change the answer", + full, outcome(without(SOM, "asc_lon"), 2, 1)); + } + + /** + * The three values land on the fields, in radians, and are not merely consumed. + * {@code +inc_angle} and {@code +asc_lon} are read with {@code pj_param}'s {@code r} sigil, + * i.e. through {@code dmstor}, so the parser converts degrees to radians on the way in. + */ + @Test + public void somOrbitalParametersReachTheFields() { + SpaceObliqueMercatorProjection som = (SpaceObliqueMercatorProjection) projection(SOM); + assertEquals(Math.toRadians(98.30382), som.getIncidenceAngle(), 1e-15); + assertEquals(0.06866666666666667, som.getPeriodOfRevolution(), 0.0); + assertEquals(Math.toRadians(127.7605356226), som.getProjectionLongitude(), 1e-15); + } + + /** + * The angular value grammar, on the two {@code r}-sigil keys. All four forms are the same + * angle, so all four must project identically — and {@code Double.parseDouble} accepts only + * the first of them, which is why {@code +alpha}, {@code +lonc}, {@code +gamma} and + * {@code +pm} using it is a defect and not a style choice. + * + *

{@code 98.30382} degrees is {@code 98d18'13.752"}; the corpus itself supplies the + * radian form, {@code 1.7157253262878522r}. + */ + @Test + public void somAnglesAcceptEveryDmstorForm() { + // A trailing cardinal is a pure sign operation on the same decimal, so this one has to + // agree bit for bit. + assertEquals("a trailing cardinal is not reaching +asc_lon", outcome(SOM, 2, 1), + outcome("+proj=som +ellps=GRS80 +inc_angle=98.30382 " + + "+ps_rev=0.06866666666666667 +asc_lon=127.7605356226E", 2, 1)); + + // Degrees-and-minutes, where the conversion is exact in binary: 98d30' is 98.5 and + // 127d45' is 127.75. + assertEquals("degree/minute DMS is not reaching +inc_angle/+asc_lon", + outcome("+proj=som +ellps=GRS80 +inc_angle=98.5 " + + "+ps_rev=0.06866666666666667 +asc_lon=127.75", 2, 1), + outcome("+proj=som +ellps=GRS80 +inc_angle=98d30' " + + "+ps_rev=0.06866666666666667 +asc_lon=127d45'", 2, 1)); + + // Arcseconds, and the corpus's own radian spelling. Neither is the same *real number* + // as the decimal-degree spelling -- 1.7157253262878522 rad rounds to + // 98.30381999999... deg -- so the claim is agreement to the precision the corpus + // writes them and no further. Upstream has the same difference and gives both of its + // som pairs byte-identical expected values, which is exactly the 0.1 mm bar used here. + assertProjectionsAgree("full DMS with d/'/\" is not reaching +inc_angle/+asc_lon", + SOM, "+proj=som +ellps=GRS80 +inc_angle=98d18'13.752\" " + + "+ps_rev=0.06866666666666667 +asc_lon=127d45'37.92824136\"", + 2, 1, 1e-4); + assertProjectionsAgree("the r/R radian suffix is not reaching +inc_angle/+asc_lon", + SOM, "+proj=som +ellps=GRS80 +inc_angle=1.7157253262878522r " + + "+ps_rev=0.06866666666666667 +asc_lon=2.2298420007209447r", + 2, 1, 1e-4); + } + + /** + * The guard that {@code SpaceObliqueMercatorProjection.initialize()} used to carry is + * gone, and this pins that it is gone rather than merely unreached. + * + *

It refused a {@code som} whose three orbital parameters had never been set, because + * verbatim 9.8.1 behaviour plus the parser gap would have answered a fully-specified + * definition from a degenerate orbit. With the keys dispatched the gap is closed, so the + * divergence is removed and a bare {@code +proj=som} now behaves as 9.8.1 does: all three + * default to {@code 0}, all three pass upstream's range checks, and it projects. + */ + @Test + public void bareSomNoLongerRefuses() { + Projection p = projection("+proj=som +ellps=GRS80"); + SpaceObliqueMercatorProjection som = (SpaceObliqueMercatorProjection) p; + assertEquals("upstream defaults +inc_angle to 0", 0.0, som.getIncidenceAngle(), 0.0); + assertEquals("upstream defaults +ps_rev to 0", 0.0, som.getPeriodOfRevolution(), 0.0); + } + + /** Upstream's own three range checks are still in force, on the dispatched values. */ + @Test + public void somRangeChecksStillApply() { + assertRejects("+proj=som +ellps=GRS80 +inc_angle=181 +ps_rev=0.1 +asc_lon=0", + "inclination"); + assertRejects("+proj=som +ellps=GRS80 +inc_angle=98 +ps_rev=-1 +asc_lon=0", "days"); + assertRejects("+proj=som +ellps=GRS80 +inc_angle=98 +ps_rev=0.1 +asc_lon=400r", + "ascending longitude"); + } + + // -------------------------------------------------------------- +proj=misrsom + + /** {@code +path} reaches {@code setPath}, and a different path is a different projection. */ + @Test + public void misrsomPathChangesTheAnswer() { + assertNotEquals("+path was dropped: path 1 and path 2 gave the same answer", + outcome("+proj=misrsom +ellps=GRS80 +path=1", 2, 1), + outcome("+proj=misrsom +ellps=GRS80 +path=2", 2, 1)); + MisrSpaceObliqueMercatorProjection misr = (MisrSpaceObliqueMercatorProjection) + projection("+proj=misrsom +ellps=GRS80 +path=42"); + assertEquals(42, misr.getPath()); + } + + /** + * {@code misrsom}'s refusal when {@code +path} is absent is upstream's own + * ({@code som.cpp:288}, {@code path <= 0} is an error) and therefore stays, unlike + * {@code som}'s parser-gap guard which is now deleted. + */ + @Test + public void misrsomStillRequiresPath() { + assertRejects("+proj=misrsom +ellps=GRS80", "path"); + } + + /** + * {@code pj_param}'s {@code i} sigil, exactly: {@code param.cpp:180-187} runs {@code atoi} + * and then rejects the value if any character lies outside {@code 0-9}. So a sign, + * a decimal point, surrounding whitespace and trailing text are all errors rather than + * partial parses. {@code Integer.parseInt} accepts {@code -5} and trims whitespace, which + * is why {@code +path} does not use it. + */ + @Test + public void pathIsStrictlyDigits() { + assertEquals(12, ((MisrSpaceObliqueMercatorProjection) + projection("+proj=misrsom +ellps=GRS80 +path=12")).getPath()); + String[] rejected = {"12a", "-5", "+5", "1.0", "1e2", "", "0x1f", "١٢"}; + for (int i = 0; i < rejected.length; i++) { + assertRejects("+proj=misrsom +ellps=GRS80 +path=" + rejected[i], "path"); + } + // Surrounding whitespace, which cannot be expressed in a space-separated definition + // string. Integer.parseInt trims; pj_param's 'i' does not, because its loop tests every + // character of the value. + assertRejectsArgs(new String[] {"+proj=misrsom", "+ellps=GRS80", "+path= 12"}, "path"); + assertRejectsArgs(new String[] {"+proj=misrsom", "+ellps=GRS80", "+path=12 "}, "path"); + } + + // --------------------------------------------------------------- +proj=gn_sinu + + private static final String GN_SINU = "+proj=gn_sinu +a=6400000 +m=1 +n=2"; + + /** + * {@code gn_sinu}'s {@code +m} and {@code +n} are both required and both undocumented + * ({@code gn_sinu.cpp:180-198}). {@code +m} had no keyword at all; {@code +n} had one but + * was dispatched only to {@code urmfps}. + */ + @Test + public void generalSinusoidalMAndNChangeTheAnswer() { + assertNotEquals("+m was dropped", outcome(GN_SINU, 2, 1), + outcome("+proj=gn_sinu +a=6400000 +m=3 +n=2", 2, 1)); + assertNotEquals("+n was dropped", outcome(GN_SINU, 2, 1), + outcome("+proj=gn_sinu +a=6400000 +m=1 +n=3", 2, 1)); + GeneralSinusoidalProjection p = (GeneralSinusoidalProjection) projection(GN_SINU); + assertEquals(1.0, p.getM(), 0.0); + assertEquals(2.0, p.getN(), 0.0); + } + + /** Upstream: absent {@code n} is "Missing parameter n.", {@code n <= 0} is illegal. */ + @Test + public void generalSinusoidalStillValidates() { + assertRejects("+proj=gn_sinu +a=6400000 +m=1", "n"); + assertRejects("+proj=gn_sinu +a=6400000 +m=-1 +n=2", "m"); + } + + /** + * {@code +m} and {@code +n} reach {@code gn_sinu} and not its siblings. + * {@code sinu}, {@code eck6} and {@code mbtfps} share {@code gn_sinu.cpp}'s kernel — and, + * here, the same package-private base class — but hard-code their own {@code m} and + * {@code n} and read neither key upstream. Dispatching on the base class would silently + * reshape all three. + */ + @Test + public void generalSinusoidalSiblingsIgnoreMAndN() { + assertEquals("+m/+n must not reach +proj=mbtfps", + outcome("+proj=mbtfps +a=6400000", 2, 1), + outcome("+proj=mbtfps +a=6400000 +m=3 +n=0.25", 2, 1)); + assertEquals("+m/+n must not reach +proj=sinu", + outcome("+proj=sinu +a=6400000", 2, 1), + outcome("+proj=sinu +a=6400000 +m=3 +n=0.25", 2, 1)); + } + + // ----------------------------------------------------------------- +proj=urm5 + + /** {@code urm5}'s {@code +n} (required) and {@code +q} (optional, default 0). */ + @Test + public void urmaev5NAndQChangeTheAnswer() { + String base = "+proj=urm5 +a=6400000 +n=0.5"; + assertNotEquals("+n was dropped", outcome(base, 2, 1), + outcome("+proj=urm5 +a=6400000 +n=0.9", 2, 1)); + assertNotEquals("+q was dropped: the default is 0, so any non-zero q must move y", + outcome(base, 2, 1), outcome(base + " +q=3", 2, 1)); + Urmaev5Projection p = (Urmaev5Projection) projection(base + " +q=3"); + assertEquals(0.5, p.getN(), 0.0); + assertEquals(3.0, p.getQ(), 0.0); + } + + /** {@code urm5} without {@code +n} is "Missing parameter n." upstream. */ + @Test + public void urmaev5StillRequiresN() { + assertRejects("+proj=urm5 +a=6400000", "n"); + assertRejects("+proj=urm5 +a=6400000 +n=1.5", "n"); + } + + /** + * {@code builtins.gie}'s second {@code urm5} block, {@code +n=1 +alpha=90}: upstream + * rejects it because {@code n * sin(alpha) == 1} makes {@code sqrt(1 - t*t)} zero + * ({@code urm5.cpp:51-58}). Reachable only now that {@code +n} is dispatched — with + * {@code n} defaulted the definition failed for the wrong reason. + */ + @Test + public void urm5RejectsNSinAlphaEqualToOne() { + assertRejects("+proj=urm5 +a=6400000 +n=1 +alpha=90", "alpha"); + } + + // ------------------------------------------------------------ +proj=col_urban + + /** + * {@code +h_0}, {@code col_urban}'s only mandatory parameter beyond the ellipsoid + * ({@code col_urban.cpp:65}). It is always metres and is never scaled by {@code +units}. + */ + @Test + public void colombiaUrbanH0ChangesTheAnswer() { + String base = "+proj=col_urban +lat_0=4.68048611111111 +lon_0=-74.1465916666667 " + + "+x_0=92334.879 +y_0=109320.965 +ellps=GRS80"; + assertNotEquals("+h_0 was dropped: the default is 0, so 2550 m must move the answer", + outcome(base, -74.25, 4.8), outcome(base + " +h_0=2550", -74.25, 4.8)); + assertEquals(2550.0, + ((ColombiaUrbanProjection) projection(base + " +h_0=2550")).getH0(), 0.0); + } + + // -------------------------------------------------------------- +proj=ob_tran + + private static final String OB_TRAN = + "+proj=ob_tran +R=6400000 +o_proj=latlon +o_lon_p=20 +o_lat_p=20 +lon_0=180"; + + /** + * The whole point of {@code ob_tran}: {@code +o_proj} names a child projection, + * and the child is built from the {@code ob_tran} argument list with {@code o_proj=xxx} + * rewritten to {@code proj=xxx} by advancing the token pointer two characters + * ({@code ob_tran.cpp:159}). This is why {@code parse(String, String[])} has to hand the + * raw array down to {@code parseProjection}: there is no per-value dispatch that could + * express it. + */ + @Test + public void obTranBuildsItsChildFromTheArgumentList() { + ObliqueTransformationProjection p = + (ObliqueTransformationProjection) projection(OB_TRAN); + assertTrue("+o_proj did not reach setParameters", p.getChild() != null); + assertEquals("latlon", p.getChild().getName()); + assertNotEquals("+o_proj=moll and +o_proj=latlon must not agree", + outcome(OB_TRAN, 2, 1), + outcome(OB_TRAN.replace("o_proj=latlon", "o_proj=moll"), 2, 1)); + } + + /** Each pole parameter is read, so each one moves the answer. */ + @Test + public void obTranPoleParametersChangeTheAnswer() { + String full = outcome(OB_TRAN, 2, 1); + assertNotEquals("+o_lat_p was dropped", full, + outcome(OB_TRAN.replace("o_lat_p=20", "o_lat_p=40"), 2, 1)); + assertNotEquals("+o_lon_p was dropped", full, + outcome(OB_TRAN.replace("o_lon_p=20", "o_lon_p=40"), 2, 1)); + } + + /** + * The three pole specifications are chosen by presence and never by value + * ({@code pj_param}'s {@code t} sigil), in the fixed order {@code o_alpha}, then + * {@code o_lat_p}, then the two-point form. So {@code +o_alpha=0} selects the azimuth + * branch even though its value is zero. + */ + @Test + public void obTranPoleFormsAreChosenByPresence() { + String withAlpha = OB_TRAN + " +o_alpha=0 +o_lon_c=10 +o_lat_c=30"; + assertNotEquals("+o_alpha=0 must select the azimuth form, not be ignored as falsy", + outcome(OB_TRAN, 2, 1), outcome(withAlpha, 2, 1)); + // The two-point form, reached only when neither o_alpha nor o_lat_p is present. + String twoPoint = "+proj=ob_tran +R=6400000 +o_proj=latlon +o_lon_1=0 +o_lat_1=30 " + + "+o_lon_2=90 +o_lat_2=60"; + assertNotEquals("+o_lat_1 was dropped from the two-point form", + outcome(twoPoint, 2, 1), + outcome(twoPoint.replace("o_lat_1=30", "o_lat_1=50"), 2, 1)); + } + + /** + * {@code builtins.gie:5072}, {@code +o_proj +o_proj=ob_tran}: upstream blocks the recursion + * by string comparison after the rewrite and reports it as a missing argument, not + * an illegal one. Note the bare {@code +o_proj} is not the token that matches — + * {@code strncmp("o_proj", "o_proj=", 7)} compares a NUL against {@code '='} — yet it does + * satisfy the earlier "is o_proj present" test, because the {@code s} sigil yields the + * empty string rather than null for a valueless token. + */ + @Test + public void obTranRefusesToRotateItself() { + assertRejects("+proj=ob_tran +R=6400000 +o_proj +o_proj=ob_tran", "o_proj"); + } + + /** No {@code +o_proj} at all is upstream's "Missing parameter: o_proj". */ + @Test + public void obTranRequiresOProj() { + assertRejects("+proj=ob_tran +R=6400000 +o_lat_p=20 +o_lon_p=20", "o_proj"); + } + + // ------------------------------------------------------- registration bookkeeping + + /** + * Every key this change dispatches is in the allow-list, so STRICT mode accepts the + * definitions PROJ accepts. + * + *

Both halves matter and they must move together. A key registered but not + * dispatched is retained-and-ignored, which is the silent-loss defect. A key dispatched but + * not registered is worse in a different way: the conformance bridge's {@code toProj4Args()} + * filters the definition through {@code Proj4Keyword.isSupported}, so the token would be + * deleted from the array before the parser ever saw it. + */ + @Test + public void everyDispatchedKeyIsRegistered() { + String[] keys = { + Proj4Keyword.inc_angle, Proj4Keyword.ps_rev, Proj4Keyword.asc_lon, + Proj4Keyword.path, Proj4Keyword.m, Proj4Keyword.n, Proj4Keyword.q, + Proj4Keyword.h_0, + }; + for (int i = 0; i < keys.length; i++) { + assertTrue("+" + keys[i] + " is dispatched but not registered, so a filtering " + + "caller would strip it before the parser saw it", + Proj4Keyword.isSupported(keys[i])); + } + for (int i = 0; i < Proj4Keyword.OB_TRAN_PARAMS.length; i++) { + assertTrue("+" + Proj4Keyword.OB_TRAN_PARAMS[i] + " is not registered", + Proj4Keyword.isSupported(Proj4Keyword.OB_TRAN_PARAMS[i])); + } + } + + /** + * The six vertical-axis keys are registered and nothing more. + * + *

They need no dispatch here: the vertical stack reads them off {@code ProjParams} in + * the pipeline layer. Registration does exactly one thing — it stops STRICT mode rejecting + * a definition PROJ accepts — and this test pins that, by constructing in STRICT mode, + * which is the only mode in which the allow-list is enforced at all. + */ + @Test + public void verticalKeysAreAcceptedInStrictMode() { + String def = "+proj=merc +ellps=GRS80 +geoidgrids=egm96_15.gtx +vunits=m " + + "+vto_meter=1 +z_0=0 +geoid_crs=WGS84 +multiplier=1"; + CoordinateReferenceSystem crs = + new Proj4Parser(new Registry(), Proj4Parser.ParseMode.STRICT) + .parse("vertical", def.split("\\s+")); + assertTrue(crs != null && crs.getProjection() != null); + // And they are inert on the horizontal projection, as they are in pj_init. + assertEquals(outcome("+proj=merc +ellps=GRS80", 2, 1), outcome(def, 2, 1)); + } + + /** + * {@code +no_rot} is deliberately not registered, and this test is the record of + * why, so that the omission cannot be mistaken for an oversight. + * + *

{@code omerc}'s "do not rotate the (u,v) frame" switch ({@code omerc.cpp:145}) needs a + * setter that {@code ObliqueMercatorProjection} does not have: {@code rot} is a private + * field assigned {@code true} unconditionally in that class's {@code initialize()}. Adding + * the key without the dispatch is the dangerous direction — the conformance bridge would + * then classify {@code builtins.gie:5246} and {@code :5269} as executable and they would + * return a rotated answer where PROJ returns an unrotated one, which is a plausible + * wrong number rather than an honest {@code NOT_IMPLEMENTED}. + * + *

When that setter lands, register the key here and in the bridge's {@code HONOURED} in + * the same change, and delete this test. + */ + @Test + public void noRotIsNowRegisteredAndDispatched() { + // INVERTED. This used to assert +no_rot must NOT be registered, and that was correct at + // the time: ObliqueMercatorProjection.rot was a private field written unconditionally + // inside initialize(), which runs TWICE - once from the constructor, once from the parser - + // so anything a setter was told was discarded on the second pass. Registering the key while + // it was inert would have made the conformance bridge call builtins.gie:5246 and :5269 + // executable, and they would have returned a ROTATED answer where PROJ returns an + // unrotated one: a plausible wrong number reported as a pass. + // + // setNoRot now exists, `rot` is a field initialiser, initialize() no longer writes it, and + // the key was added to Proj4Keyword.supportedParameters(), Proj4Parser's dispatch and the + // bridge's HONOURED set in ONE change. Asserting the old state would re-pin a fixed defect. + assertTrue("+no_rot must be registered now that setNoRot exists and the parser dispatches it", + Proj4Keyword.isSupported(Proj4Keyword.no_rot)); + } + + @Test + public void noRotSurvivesTheSecondInitialize() { + // The regression net for WHY this could not be registered earlier: initialize() runs twice, + // so a parameter stored in a field that initialize() also writes is silently discarded. + ObliqueMercatorProjection p = new ObliqueMercatorProjection(); + p.setNoRot(true); + p.initialize(); + p.initialize(); + assertTrue("setNoRot must survive a second initialize(); if this fails, `rot` has been " + + "moved back inside initialize() and +no_rot is inert again", !p.isRot()); + } + + // -------------------------------------------------------------------- helpers + + private static Projection projection(String definition) { + CoordinateReferenceSystem crs = + new CRSFactory().createFromParameters("dispatch", definition); + return crs.getProjection(); + } + + /** + * The observable outcome of projecting one point: either the coordinate, or the name and + * message of the exception. + * + *

Both are folded into a single string on purpose. The question every test here asks is + * "did removing this key change anything?", and the answer is yes whether the change is a + * different number or the difference between projecting and refusing. Comparing coordinates + * alone would make a test throw where it means to fail with a diagnosis. + */ + private static String outcome(String definition, double lon, double lat) { + try { + Projection p = projection(definition); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(lon, lat), out); + return out.x + " " + out.y; + } catch (RuntimeException e) { + return e.getClass().getSimpleName() + ": " + e.getMessage(); + } + } + + /** The same definition with one {@code +key=value} token removed. */ + private static String without(String definition, String key) { + StringBuilder sb = new StringBuilder(); + String[] tokens = definition.split("\\s+"); + for (int i = 0; i < tokens.length; i++) { + String bare = tokens[i].startsWith("+") ? tokens[i].substring(1) : tokens[i]; + if (bare.equals(key) || bare.startsWith(key + "=")) { + continue; + } + if (sb.length() > 0) { + sb.append(' '); + } + sb.append(tokens[i]); + } + String result = sb.toString(); + if (result.equals(definition)) { + throw new IllegalArgumentException("+" + key + " is not in " + definition); + } + return result; + } + + /** + * Asserts that a definition is refused, with {@code expectedInMessage} named in the reason. + * + *

The message check is what stops this passing for the wrong reason: several of these + * definitions would also have been refused before the dispatch landed, just with a + * different diagnosis. + */ + private static void assertRejects(String definition, String expectedInMessage) { + try { + Projection p = projection(definition); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(2, 1), out); + fail("expected " + definition + " to be refused, but it projected (2, 1) to " + + out.x + " " + out.y); + } catch (InvalidValueException e) { + assertMentions(definition, e, expectedInMessage); + } catch (UnsupportedParameterException e) { + assertMentions(definition, e, expectedInMessage); + } catch (Proj4jException e) { + assertMentions(definition, e, expectedInMessage); + } + } + + /** {@link #assertRejects} for a definition that cannot survive whitespace splitting. */ + private static void assertRejectsArgs(String[] args, String expectedInMessage) { + String joined = String.join("|", args); + try { + CoordinateReferenceSystem crs = + new CRSFactory().createFromParameters("dispatch", args); + ProjCoordinate out = new ProjCoordinate(); + crs.getProjection().project(new ProjCoordinate(2, 1), out); + fail("expected " + joined + " to be refused, but it projected (2, 1) to " + + out.x + " " + out.y); + } catch (Proj4jException e) { + assertMentions(joined, e, expectedInMessage); + } + } + + /** + * Asserts that two definitions project the same point to within {@code toleranceMetres}. + * Used where the two definitions are the same angle only to the precision the corpus + * writes it, so bit equality would be asserting something untrue. + */ + private static void assertProjectionsAgree(String message, String a, String b, + double lon, double lat, double toleranceMetres) { + ProjCoordinate pa = new ProjCoordinate(); + ProjCoordinate pb = new ProjCoordinate(); + projection(a).project(new ProjCoordinate(lon, lat), pa); + projection(b).project(new ProjCoordinate(lon, lat), pb); + double deviation = Math.hypot(pa.x - pb.x, pa.y - pb.y); + assertTrue(message + " -- " + a + " gave " + pa.x + " " + pa.y + " but " + b + " gave " + + pb.x + " " + pb.y + ", a deviation of " + deviation + " m", + deviation <= toleranceMetres); + } + + private static void assertMentions(String definition, RuntimeException e, String expected) { + String message = e.getMessage() == null ? "" : e.getMessage(); + assertTrue(definition + " was refused, but for an unexpected reason -- \"" + expected + + "\" does not appear in: " + e.getClass().getSimpleName() + ": " + + message, + message.toLowerCase().contains(expected.toLowerCase())); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/AffineOperatorTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/AffineOperatorTest.java new file mode 100644 index 0000000..699bffc --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/AffineOperatorTest.java @@ -0,0 +1,153 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * {@code +proj=affine} and the two per-step {@code +omit_*} flags, against + * {@code 9.8.1:src/transformations/affine.cpp} and {@code src/pipeline.cpp:525-568}. + */ +public class AffineOperatorTest { + + private final PipelineFactory factory = new PipelineFactory(); + + private static final double EPS = 1e-12; + + @Test + public void offsetsApplyToAllFourComponents() { + Pipeline p = factory.create("+proj=affine +xoff=1 +yoff=2 +zoff=3 +toff=4"); + double[] out = p.forward(new double[] {10, 20, 30, 40}); + assertEquals(11.0, out[0], EPS); + assertEquals(22.0, out[1], EPS); + assertEquals(33.0, out[2], EPS); + assertEquals(44.0, out[3], EPS); + } + + /** + * {@code reverse_4d} subtracts the offset and then applies the inverse + * matrix, which is not the same as an affine with a negated offset once the matrix is + * not the identity. With {@code s11 = 2} and {@code xoff = 10}, the forward of 3 is + * 16 and the inverse of 16 must be 3, not 8. + */ + @Test + public void theInverseDeOffsetsBeforeItDeScales() { + Pipeline p = factory.create("+proj=affine +s11=2 +xoff=10"); + double[] fwd = p.forward(new double[] {3, 0, 0, 0}); + assertEquals(16.0, fwd[0], EPS); + assertEquals(3.0, p.inverse(fwd)[0], EPS); + } + + /** + * The diagonal is read with {@code pj_param}'s {@code 't'} sigil first, so an + * explicit zero is zero while an absent key is one. Getting this wrong turns + * {@code +s11=0} into the identity, silently. + */ + @Test + public void anExplicitZeroOnTheDiagonalIsZeroNotOne() { + double[] out = factory.create("+proj=affine +s11=0").forward(new double[] {5, 7, 0, 0}); + assertEquals(0.0, out[0], 0.0); + assertEquals("an absent +s22 is still 1", 7.0, out[1], EPS); + } + + /** + * {@code computeReverseParameters}: a singular matrix removes the inverse and leaves + * the forward direction working. It is not a construction failure, so the pipeline + * must build and simply report itself one-way. + */ + @Test + public void aSingularMatrixRemovesTheInverseWithoutFailingConstruction() { + Pipeline p = factory.create("+proj=pipeline +step +proj=affine +s11=0"); + assertFalse("det == 0, so pj_has_inverse is false", p.isInvertible()); + assertEquals(0.0, p.forward(new double[] {5, 7, 0, 0})[0], 0.0); + } + + /** {@code +tscale=0} is the other route to the same verdict. */ + @Test + public void aZeroTimeScaleAlsoRemovesTheInverse() { + assertFalse(factory.create("+proj=pipeline +step +proj=affine +tscale=0").isInvertible()); + } + + /** A full off-diagonal matrix round-trips through the cofactor inverse. */ + @Test + public void aGeneralMatrixRoundTrips() { + Pipeline p = factory.create("+proj=affine" + + " +s11=1 +s12=2 +s13=3" + + " +s21=0 +s22=1 +s23=4" + + " +s31=5 +s32=6 +s33=0" + + " +xoff=7 +yoff=8 +zoff=9"); + assertTrue(p.isInvertible()); + double[] in = {1.5, -2.5, 3.25, 0}; + double[] back = p.inverse(p.forward(in.clone())); + for (int i = 0; i < 3; i++) { + assertEquals(in[i], back[i], 1e-9); + } + } + + /** + * {@code +omit_inv}: the step runs in the pipeline's forward pass and is skipped in + * its reverse pass. {@code 4D-API_cs2cs-style.gie:403-413}. + */ + @Test + public void omitInvSkipsTheStepInTheReversePassOnly() { + Pipeline p = factory.create("+proj=pipeline +step +proj=affine +xoff=1 +yoff=1 +omit_inv"); + assertTrue(p.steps().get(0).isOmittedReverse()); + assertEquals(3.0, p.forward(new double[] {2, 49, 0, 0})[0], EPS); + assertEquals(2.0, p.inverse(new double[] {2, 49, 0, 0})[0], EPS); + } + + /** + * {@code +omit_fwd}: the mirror image. Note that "forward" is the pipeline's + * pass and not the operator's direction, so {@code +inv +omit_fwd} still omits the + * step from the forward pass. {@code 4D-API_cs2cs-style.gie:422-440}. + */ + @Test + public void omitFwdSkipsTheStepInTheForwardPassOnly() { + Pipeline p = factory.create("+proj=pipeline +step +proj=affine +xoff=1 +yoff=1 +omit_fwd"); + assertEquals(2.0, p.forward(new double[] {2, 49, 0, 0})[0], EPS); + assertEquals(1.0, p.inverse(new double[] {2, 49, 0, 0})[0], EPS); + + Pipeline inverted = factory.create( + "+proj=pipeline +step +inv +proj=affine +xoff=1 +yoff=1 +omit_fwd"); + assertEquals(2.0, inverted.forward(new double[] {2, 49, 0, 0})[0], EPS); + assertEquals(3.0, inverted.inverse(new double[] {2, 49, 0, 0})[0], EPS); + } + + /** + * An omitted direction needs no implementation ({@code pipeline.cpp:536-538}, + * {@code :561}), so a singular affine marked {@code +omit_inv} leaves the pipeline + * invertible. + */ + @Test + public void anOmittedDirectionNeedsNoImplementation() { + Pipeline p = factory.create("+proj=pipeline +step +proj=affine +s11=0 +omit_inv"); + assertTrue("omit_inv relaxes the invertibility requirement", p.isInvertible()); + } + + /** A bare {@code +step +proj=affine} is the legal no-op the corpus uses as filler. */ + @Test + public void aBareAffineIsTheIdentity() { + double[] in = {1.25, -2.5, 3, 4}; + double[] out = factory.create("+proj=pipeline +step +proj=affine").forward(in.clone()); + for (int i = 0; i < 4; i++) { + assertEquals(in[i], out[i], 0.0); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/AxisSwapOperatorTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/AxisSwapOperatorTest.java new file mode 100644 index 0000000..89f334b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/AxisSwapOperatorTest.java @@ -0,0 +1,247 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=axisswap} against {@code 9.8.1:src/conversions/axisswap.cpp}. + */ +public class AxisSwapOperatorTest { + + private static AxisSwapOperator of(String definition) { + return new AxisSwapOperator(ProjParams.parse(definition)); + } + + private static double[] fwd(AxisSwapOperator op, double... coord) { + double[] c = {coord[0], coord[1], coord.length > 2 ? coord[2] : 0, + coord.length > 3 ? coord[3] : 0}; + op.forward(c); + return c; + } + + private static double[] inv(AxisSwapOperator op, double... coord) { + double[] c = {coord[0], coord[1], coord.length > 2 ? coord[2] : 0, + coord.length > 3 ? coord[3] : 0}; + op.inverse(c); + return c; + } + + // ------------------------------------------------- the mutual exclusion + + /** + * {@code axisswap.cpp:161-167} writes the test as + * {@code !exists(order) == !exists(axis)}, so both and + * neither are the same error — {@code MUTUALLY_EXCLUSIVE_ARGS}, which + * is a distinct {@code PROJ_ERR_*} value from the illegal-value one and is what + * a gie {@code expect failure errno invalid_op_mutually_exclusive_args} row + * asserts. + */ + @Test + public void neitherOrderNorAxisIsMutuallyExclusiveArgs() { + try { + of("+proj=axisswap"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.MUTUALLY_EXCLUSIVE_ARGS, e.code()); + assertEquals(1028, e.code().projErrno()); + } + } + + @Test + public void bothOrderAndAxisIsAlsoMutuallyExclusiveArgs() { + try { + of("+proj=axisswap +order=2,1 +axis=wsu"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.MUTUALLY_EXCLUSIVE_ARGS, e.code()); + } + } + + @Test + public void exactlyOneOfThemIsAccepted() { + of("+proj=axisswap +order=2,1"); + of("+proj=axisswap +axis=neu"); + } + + // -------------------------------------------------------------- +order + + @Test + public void orderSwapsTheFirstTwoOrdinates() { + double[] out = fwd(of("+proj=axisswap +order=2,1"), 1, 2); + assertEquals(2.0, out[0], 0.0); + assertEquals(1.0, out[1], 0.0); + } + + @Test + public void aLeadingMinusFlipsTheSign() { + double[] out = fwd(of("+proj=axisswap +order=-1,2"), 3, 4); + assertEquals(-3.0, out[0], 0.0); + assertEquals(4.0, out[1], 0.0); + } + + @Test + public void orderCanCoverAllFourOrdinates() { + double[] out = fwd(of("+proj=axisswap +order=4,3,2,1"), 1, 2, 3, 4); + assertEquals(4.0, out[0], 0.0); + assertEquals(3.0, out[1], 0.0); + assertEquals(2.0, out[2], 0.0); + assertEquals(1.0, out[3], 0.0); + } + + @Test + public void duplicateAxesAreRejected() { + try { + of("+proj=axisswap +order=1,1"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + @Test + public void anIndexOutsideOneToFourIsRejected() { + try { + of("+proj=axisswap +order=5,1"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + @Test + public void aCharacterOutsideTheOrderAlphabetIsRejected() { + try { + of("+proj=axisswap +order=2;1"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + @Test + public void aTwoOrdinateOrderTouchingZIsNotRepresentable() { + // axisswap.cpp:259-277 wires no function pointer for this and then errors. + try { + of("+proj=axisswap +order=3,1"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + // --------------------------------------------------------------- +axis + + /** + * {@code +axis=wsu} is what {@code +init=epsg:2049} carries, and it is the only + * reason {@code gigs/5113.gie} expects {@code (-50475.46, +2766147.25)} where an + * ENU {@code tmerc} would give {@code (+50475.46, -2766147.25)}. + */ + @Test + public void axisWsuNegatesEastingAndNorthing() { + double[] out = fwd(of("+proj=axisswap +axis=wsu"), 50475.46, -2766147.25, 7); + assertEquals(-50475.46, out[0], 0.0); + assertEquals(2766147.25, out[1], 0.0); + assertEquals("up is unchanged", 7.0, out[2], 0.0); + } + + @Test + public void axisNeuSwapsAndAxisEnuIsTheIdentity() { + double[] neu = fwd(of("+proj=axisswap +axis=neu"), 1, 2, 3); + assertEquals(2.0, neu[0], 0.0); + assertEquals(1.0, neu[1], 0.0); + double[] enu = fwd(of("+proj=axisswap +axis=enu"), 1, 2, 3); + assertEquals(1.0, enu[0], 0.0); + assertEquals(2.0, enu[1], 0.0); + assertEquals(3.0, enu[2], 0.0); + } + + @Test + public void axisDownNegatesTheThirdOrdinate() { + assertEquals(-3.0, fwd(of("+proj=axisswap +axis=end"), 1, 2, 3)[2], 0.0); + } + + @Test + public void anAxisLetterOutsideEwnsudIsRejected() { + try { + of("+proj=axisswap +axis=xyz"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + @Test + public void anAxisSpecShorterThanThreeCharactersIsRejected() { + try { + of("+proj=axisswap +axis=en"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + // ------------------------------------------- forward is not inverse-shaped + + /** + * The forward indexes the input by the permutation and the inverse + * indexes the output by it: {@code out[i] = in[axis[i]]} versus + * {@code out[axis[i]] = in[i]}. For a self-inverse permutation the two coincide, + * which is exactly why swapping them survives the obvious x/y test — so the + * discriminating case is a three-cycle. + */ + @Test + public void forwardAndInverseDifferForANonSelfInversePermutation() { + AxisSwapOperator op = of("+proj=axisswap +order=2,3,1"); + double[] forward = fwd(op, 1, 2, 3); + double[] inverse = inv(op, 1, 2, 3); + assertEquals(2.0, forward[0], 0.0); + assertEquals(3.0, forward[1], 0.0); + assertEquals(1.0, forward[2], 0.0); + assertEquals("out[axis[i]] = in[i]", 3.0, inverse[0], 0.0); + assertEquals(1.0, inverse[1], 0.0); + assertEquals(2.0, inverse[2], 0.0); + } + + @Test + public void inverseUndoesForward() { + AxisSwapOperator op = of("+proj=axisswap +order=2,3,1"); + double[] c = {1, 2, 3, 0}; + op.forward(c); + op.inverse(c); + assertEquals(1.0, c[0], 0.0); + assertEquals(2.0, c[1], 0.0); + assertEquals(3.0, c[2], 0.0); + } + + // ----------------------------------------------------------------- units + + @Test + public void bothSidesAreWhateverUnlessAngularunitsIsGiven() { + AxisSwapOperator plain = of("+proj=axisswap +order=2,1"); + assertEquals(GieIoUnits.WHATEVER, plain.declaredLeft()); + assertEquals(GieIoUnits.WHATEVER, plain.declaredRight()); + + // axisswap.cpp:279-284: +angularunits forces radian i/o. Documented nowhere. + AxisSwapOperator angular = of("+proj=axisswap +order=2,1 +angularunits"); + assertEquals(GieIoUnits.RADIANS, angular.declaredLeft()); + assertEquals(GieIoUnits.RADIANS, angular.declaredRight()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/CartAndHelmertTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/CartAndHelmertTest.java new file mode 100644 index 0000000..561382a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/CartAndHelmertTest.java @@ -0,0 +1,218 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The two hidden helper conversions: {@link CartConversion} against + * {@code 9.8.1:src/conversions/cart.cpp} and {@link HelmertConversion} against + * {@code src/transformations/helmert.cpp}. + */ +public class CartAndHelmertTest { + + /** WGS84, as {@code create.cpp:131-132} spells it. */ + private static final CartConversion WGS84 = new CartConversion(6378137.0, 0.0066943799901413); + + private static double rad(double degrees) { + return degrees * Math.PI / 180.0; + } + + // ------------------------------------------------------------------- cart + + @Test + public void geodeticToGeocentricAtTheEquatorAndPrimeMeridianIsTheSemiMajorAxis() { + double[] c = {0, 0, 0, 0}; + WGS84.forward(c); + assertEquals(6378137.0, c[0], 1e-9); + assertEquals(0.0, c[1], 1e-9); + assertEquals(0.0, c[2], 1e-9); + } + + @Test + public void geodeticToGeocentricAtTheNorthPoleIsTheSemiMinorAxis() { + double[] c = {0, Math.PI / 2, 0, 0}; + WGS84.forward(c); + double b = 6378137.0 * Math.sqrt(1 - 0.0066943799901413); + assertEquals(0.0, Math.hypot(c[0], c[1]), 1e-6); + assertEquals(b, c[2], 1e-6); + } + + /** + * The values {@code gigs/5201.gie} asserts, which is where this conversion's + * accuracy actually has to hold: {@code EPSG:4978} to {@code 4326} at 80°N. + */ + @Test + public void geocentricToGeodeticMatchesTheGigs5201Row() { + double[] c = {-962479.5924, 555687.8517, 6260738.6526, 0}; + WGS84.inverse(c); + assertEquals(150.0, Math.toDegrees(c[0]), 1e-8); + assertEquals(80.0, Math.toDegrees(c[1]), 1e-8); + assertEquals(1214.137, c[2], 0.001); + } + + /** + * A geodetic/cartesian round trip closes to a micrometre everywhere. + * + *

Stated in metres rather than radians because that is the quantity the GIGS + * budget is written in, and because latitude and height are recovered together: + * both are differences of quantities of order {@code a}, so neither can do better + * than a few ULP of 6.4e6 m. A micrometre is three orders inside the tightest + * budget in the corpus (6 mm over a {@code roundtrip 1000}). + * + *

Closed-form Bowring, so this is a statement about conditioning and not about + * an iteration limit — which is exactly why {@code datum.GeocentricConverter}, + * whose criterion is {@code 1e-12} on {@code sin(phi)} and which returns its last + * estimate on non-convergence, is not reused here. + */ + @Test + public void cartRoundTripsToAMicrometre() { + for (double lat = -89; lat <= 89; lat += 7) { + for (double h : new double[] {-500, 0, 8848}) { + double[] origin = {rad(37.5), rad(lat), h, 0}; + double[] c = origin.clone(); + WGS84.forward(c); + WGS84.inverse(c); + double horizontal = Math.hypot((c[0] - origin[0]) * Math.cos(origin[1]), + c[1] - origin[1]) * 6378137.0; + assertTrue("horizontal residual " + horizontal + " m at lat " + lat, + horizontal <= 1e-6); + assertEquals("height at lat " + lat, origin[2], c[2], 1e-6); + } + } + } + + @Test + public void nearThePoleTheHeightComesFromTheGeocentricRadius() { + // cart.cpp:218-227: poleward of 89.99994 degrees the normal-radius formula + // divides by a vanishing cosine, so upstream switches branch. Exercise it. + double[] origin = {0, rad(89.999999), 1000, 0}; + double[] c = origin.clone(); + WGS84.forward(c); + WGS84.inverse(c); + assertEquals(origin[1], c[1], 1e-9); + assertEquals(1000.0, c[2], 1e-3); + } + + @Test + public void aSphereTakesTheEsEqualsZeroShortcut() { + CartConversion sphere = new CartConversion(6371000.0, 0.0); + double[] c = {0, rad(45), 0, 0}; + sphere.forward(c); + assertEquals("on a sphere every radius is the semi-major axis", + 6371000.0, Math.sqrt(c[0] * c[0] + c[1] * c[1] + c[2] * c[2]), 1e-6); + } + + // ---------------------------------------------------------------- helmert + + @Test + public void aThreeParameterShiftIsAPureTranslation() { + // EPSG:4275's towgs84, as the epsg init dictionary carries it. + HelmertConversion h = new HelmertConversion(new double[] {-168, -60, 320}); + double[] c = {1000, 2000, 3000, 0}; + h.forward(c); + assertEquals(832.0, c[0], 0.0); + assertEquals(1940.0, c[1], 0.0); + assertEquals(3320.0, c[2], 0.0); + h.inverse(c); + assertEquals(1000.0, c[0], 0.0); + assertEquals(2000.0, c[1], 0.0); + assertEquals(3000.0, c[2], 0.0); + } + + @Test + public void anAllZeroSevenParameterShiftIsIndistinguishableFromAThreeParameterOne() { + // datum_set.cpp:113-140 only converts slots 3..6 when one of them is + // non-zero, so an all-zero seven-value towgs84 leaves datum_params[6] at 0 - + // which is what create.cpp's all-zero test relies on. + HelmertConversion h = new HelmertConversion(new double[] {0, 0, 0, 0, 0, 0, 0}); + double[] c = {1000, 2000, 3000, 0}; + h.forward(c); + assertEquals(1000.0, c[0], 0.0); + assertEquals(2000.0, c[1], 0.0); + assertEquals(3000.0, c[2], 0.0); + } + + /** + * {@code EPSG:4313}'s seven-parameter shift, in the representation + * {@code pj_datum_set} produces: rotations already in radians, and element 6 + * holding {@code 1 + s/1e6}. + * + *

The convention is {@code position_vector}, which upstream reaches by + * deriving the coordinate-frame matrix and transposing it. Getting it backwards + * flips every rotation's sign, which is invisible on the axes and on the prime + * meridian and worth about a metre at the edge of a national grid — so the + * discriminating assertion is that a rotation about Z moves a point on the X axis + * towards +Y for a positive {@code rz}, i.e. that the matrix is + * {@code [[1, -rz, ry], [rz, 1, -rx], [-ry, rx, 1]]} to first order. + */ + @Test + public void sevenParameterUsesThePositionVectorConvention() { + double rz = 1.8422 * ProjectionMath.SECONDS_TO_RAD; + // Rotation only, so the translation does not mask the sign under test. + HelmertConversion rotation = new HelmertConversion(new double[] {0, 0, 0, 0, 0, rz, 0}); + double[] c = {6378137.0, 0, 0, 0}; + rotation.forward(c); + assertTrue("position_vector: +rz rotates +X towards +Y", c[1] > 0); + assertEquals(6378137.0 * rz, c[1], 1e-3); + + // EPSG:4313's full seven parameters, in pj_datum_set's representation. + HelmertConversion full = new HelmertConversion(new double[] {-106.8686, 52.2978, -103.7239, + 0.3366 * ProjectionMath.SECONDS_TO_RAD, + -0.457 * ProjectionMath.SECONDS_TO_RAD, + rz, + -1.2747 / ProjectionMath.MILLION + 1.0}); + double[] d = {6378137.0, 0, 0, 0}; + full.forward(d); + assertEquals("rotation then scale then translation", + 6378137.0 * rz + 52.2978, d[1], 1e-2); + full.inverse(d); + assertEquals(6378137.0, d[0], 1e-6); + assertEquals(0.0, d[1], 1e-6); + assertEquals(0.0, d[2], 1e-6); + } + + @Test + public void theExactRotationDiffersFromTheLinearisedOneButOnlyAtSecondOrder() { + // create.cpp builds the helper with +exact, so the matrix is the full + // trigonometric one - not the small-angle approximation that + // datum.Datum.transformFromGeocentricToWgs84 uses. The difference is real + // but sub-millimetre for EPSG-sized rotations, which is why it is not the + // reason any GIGS file passes or fails. + double rx = 5.137 * ProjectionMath.SECONDS_TO_RAD; + HelmertConversion exact = new HelmertConversion(new double[] {0, 0, 0, rx, 0, 0, 0}); + double[] c = {0, 6378137.0, 0, 0}; + exact.forward(c); + // Position vector, third row [-ry, rx, 1]: z' = rx * y to first order. + double linearised = 6378137.0 * rx; + assertEquals(linearised, c[2], 0.001); + assertTrue("but not bit-identical", c[2] != linearised); + } + + @Test + public void scaleIsAppliedBeforeTheTranslation() { + // helmert_forward_3d:405-414 - scale * (R * X), then += translation. + double[] params = {100, 0, 0, 0, 0, 0, 1.0 + 1e-6}; + HelmertConversion h = new HelmertConversion(params); + double[] c = {1000000, 0, 0, 0}; + h.forward(c); + assertEquals(1000000 * (1 + 1e-6) + 100, c[0], 1e-9); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/CoordinateStackOperatorTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/CoordinateStackOperatorTest.java new file mode 100644 index 0000000..36cc1b6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/CoordinateStackOperatorTest.java @@ -0,0 +1,185 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * {@code +proj=push}, {@code +proj=pop} and {@code +proj=set} against + * {@code 9.8.1:src/pipeline.cpp:641-727} and {@code src/conversions/set.cpp}. + * + *

The cases here are the ones whose upstream behaviour is surprising, since + * those are the ones a plausible-looking implementation gets wrong: a stack that is not + * shared, a {@code pop} that throws on an empty stack, a {@code push} that acts without + * a parent pipeline, and a {@code set} whose inverse undoes itself. + */ +public class CoordinateStackOperatorTest { + + private final PipelineFactory factory = new PipelineFactory(); + + private static final double EPS = 1e-9; + + /** Degrees to radians without {@code Math.toRadians} — see {@code ProjectionMath.DTR}. */ + private static double rad(double degrees) { + return degrees * org.locationtech.proj4j.util.ProjectionMath.DTR; + } + + /** + * The motivating case, and the one PROJ itself uses: a round trip through two UTM + * zones moves the longitude from 12° to 18°, and bracketing it with + * {@code push +v_1} / {@code pop +v_1} puts it back. + * {@code 4D-API_cs2cs-style.gie:310-318}. + */ + @Test + public void pushAndPopRestoreTheSavedComponent() { + Pipeline bracketed = factory.create("+proj=pipeline" + + " +step +proj=push +v_1" + + " +step +proj=utm +zone=32" + + " +step +proj=utm +zone=33 +inv" + + " +step +proj=pop +v_1"); + double[] out = bracketed.forward(new double[] {rad(12), rad(56), 0, 2020}); + assertEquals(rad(12), out[0], EPS); + assertEquals(rad(56), out[1], EPS); + assertEquals(2020.0, out[3], 0.0); + + // ...and without the bracket the same pipeline really does move it, so the + // assertion above is not passing for want of anything happening. + Pipeline bare = factory.create("+proj=pipeline" + + " +step +proj=utm +zone=32" + + " +step +proj=utm +zone=33 +inv"); + double[] moved = bare.forward(new double[] {rad(12), rad(56), 0, 2020}); + assertEquals(rad(18), moved[0], 1e-7); + } + + /** + * {@code 4D-API_cs2cs-style.gie:341-353}: two pushes and two pops in one pipeline, + * which only works if the stack is shared and last-in-first-out. A + * per-operator stack would pass the single-bracket test above and fail this one. + */ + @Test + public void twoBracketsNestLastInFirstOut() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=push +v_1" + + " +step +proj=utm +zone=32" + + " +step +proj=push +v_1" + + " +step +proj=utm +zone=33 +inv" + + " +step +proj=utm +zone=34" + + " +step +proj=pop +v_1" + + " +step +proj=utm +zone=32 +inv" + + " +step +proj=pop +v_1"); + double[] out = p.forward(new double[] {rad(12), rad(56), 0, 2020}); + assertEquals(rad(12), out[0], EPS); + assertEquals(rad(56), out[1], EPS); + } + + /** + * {@code pipeline.cpp:667}: popping an empty stack leaves the component alone and is + * not an error. {@code 4D-API_cs2cs-style.gie:356-364} asserts the moved + * value, i.e. 18°, survives. + */ + @Test + public void poppingAnEmptyStackIsNotAnError() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=utm +zone=32" + + " +step +proj=utm +zone=33 +inv" + + " +step +proj=pop +v_1"); + double[] out = p.forward(new double[] {rad(12), rad(56), 0, 2020}); + assertEquals(rad(18), out[0], 1e-7); + } + + /** + * {@code pipeline.cpp:641-643}, {@code if (P->parent == nullptr) return}: a + * {@code push} or {@code pop} that is not inside a pipeline is the identity. + * {@code 4D-API_cs2cs-style.gie:388-396}. + */ + @Test + public void aBarePushOrPopIsTheIdentity() { + double[] in = {rad(12), rad(56), 7.5, 2020}; + double[] pushed = factory.create("+proj=push +v_3").forward(in.clone()); + double[] popped = factory.create("+proj=pop +v_3").forward(in.clone()); + for (int i = 0; i < 4; i++) { + assertEquals("push component " + i, in[i], pushed[i], 0.0); + assertEquals("pop component " + i, in[i], popped[i], 0.0); + } + } + + /** {@code push}'s inverse is {@code pop} and vice versa, which the reverse pass needs. */ + @Test + public void theReversePassPairsThemTheOtherWayRound() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=push +v_1" + + " +step +proj=utm +zone=32" + + " +step +proj=utm +zone=33 +inv" + + " +step +proj=pop +v_1"); + assertTrue(p.isInvertible()); + double[] there = p.forward(new double[] {rad(12), rad(56), 0, 2020}); + double[] back = p.inverse(there); + assertEquals(rad(12), back[0], EPS); + assertEquals(rad(56), back[1], EPS); + } + + /** + * {@code set.cpp}: {@code P->fwd4d} and {@code P->inv4d} are the same + * function, so {@code direction inverse} sets the components rather than restoring + * them. {@code 4D-API_cs2cs-style.gie:545-558} pins exactly that, and an + * implementation that treated the inverse as an undo would fail it while looking + * more principled. + */ + @Test + public void setIsTheSameFunctionInBothDirections() { + Pipeline p = factory.create("+proj=set +v_1=10 +v_2=20 +v_3=30 +v_4=40"); + double[] fwd = p.forward(new double[] {1, 2, 3, 4}); + double[] inv = p.inverse(new double[] {1, 2, 3, 4}); + for (int i = 0; i < 4; i++) { + assertEquals(10.0 * (i + 1), fwd[i], 0.0); + assertEquals(10.0 * (i + 1), inv[i], 0.0); + } + } + + /** {@code +proj=set} with nothing selected touches nothing. */ + @Test + public void aBareSetIsTheIdentity() { + double[] out = factory.create("+proj=set").forward(new double[] {1, 2, 3, 4}); + assertEquals(1.0, out[0], 0.0); + assertEquals(4.0, out[3], 0.0); + } + + /** + * Selection is by presence and the value is read separately, so a bare {@code +v_3} + * sets the component to zero rather than leaving it — {@code pj_param_exists} then + * {@code pj_param("dv_3").f}. + */ + @Test + public void aValuelessSetTokenMeansZeroNotUnchanged() { + double[] out = factory.create("+proj=set +v_3").forward(new double[] {1, 2, 3, 4}); + assertEquals("a bare +v_3 selects the component; its value defaults to 0", + 0.0, out[2], 0.0); + assertEquals("and nothing else moves", 4.0, out[3], 0.0); + } + + /** Both sides are {@code WHATEVER}, so a bare {@code push} imposes no unit domain. */ + @Test + public void bothSidesAreWhatever() { + Pipeline p = factory.create("+proj=push +v_1"); + assertEquals(org.locationtech.proj4j.gie.GieIoUnits.WHATEVER, p.left()); + assertEquals(org.locationtech.proj4j.gie.GieIoUnits.WHATEVER, p.right()); + assertFalse(p.steps().get(0).isOmittedForward()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/Cs2csEmulationHelperTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/Cs2csEmulationHelperTest.java new file mode 100644 index 0000000..a100fcc --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/Cs2csEmulationHelperTest.java @@ -0,0 +1,136 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The two {@code cs2cs_emulation_setup} helpers added last: the {@code +nadgrids} + * horizontal grid shift and {@code +geoc}. + * + *

The Helmert and {@code cart} halves are covered by {@link CartAndHelmertTest} and + * the whole assembly by {@link PipelineGigsTest}; this class is about the two + * branch conditions that are easy to read backwards — + * {@code create.cpp:125}'s {@code P->hgridshift ? nullptr : towgs84} and + * {@code init.cpp:598}'s {@code es != 0 && geoc}. + */ +public class Cs2csEmulationHelperTest { + + private final PipelineFactory factory = new PipelineFactory(); + + private static Cs2csOperator operatorOf(Pipeline p) { + assertEquals(1, p.steps().size()); + PipelineOperator op = p.steps().get(0).operator(); + assertTrue("expected a Cs2csOperator, got " + op.getClass().getName(), + op instanceof Cs2csOperator); + return (Cs2csOperator) op; + } + + /** + * {@code create.cpp:125}. The grid suppresses the Helmert, and — the half that is + * easy to miss, because the {@code do_cart} assignment lives inside the + * {@code towgs84} loop — it suppresses the cartesian round-trip too, even on a + * non-WGS84 ellipsoid. A grid shift is geographic-to-geographic and needs no change + * of ellipsoid. + */ + @Test + public void aGridShiftSuppressesBothTheHelmertAndTheCartRoundTrip() { + Cs2csOperator withGrid = operatorOf(factory.create( + "+proj=longlat +ellps=bessel +nadgrids=@null +towgs84=598.1,73.7,418.2")); + assertNotNull(withGrid.hgridshift()); + String s = withGrid.toString(); + assertTrue("no Helmert: " + s, !s.contains("helmert")); + assertTrue("no cart either: " + s, !s.contains("cart")); + + // The control: the same definition without the grid does build both, so the + // assertions above are not passing because nothing was ever built. + Cs2csOperator noGrid = operatorOf(factory.create( + "+proj=longlat +ellps=bessel +towgs84=598.1,73.7,418.2")); + assertNull(noGrid.hgridshift()); + assertTrue(noGrid.toString().contains("helmert")); + assertTrue(noGrid.toString().contains("cart")); + } + + /** + * {@code init.cpp:598}: {@code +geoc} on a sphere is read, accepted and has no + * effect, because the geocentric and geographic latitudes coincide there. This is the + * shape {@code 4D-API_cs2cs-style.gie:517} uses. + */ + @Test + public void geocIsInertOnASphere() { + Pipeline p = factory.create("+proj=longlat +a=1 +b=1 +geoc"); + assertTrue("no geoc on a sphere: " + p, !operatorOf(p).toString().contains("geoc")); + double phi = 45.0 * ProjectionMath.DTR; + assertEquals(phi, p.forward(new double[] {0, phi, 0, 0})[1], 0.0); + } + + /** + * On an ellipsoid it is applied, in the direction that reads backwards: + * {@code fwd_prepare} runs it {@code PJ_INV} because a {@code +geoc} operation's + * input is geocentric. So the geographic latitude that comes out is the + * larger of the two, {@code atan(tan(phi) / (1 - es))}. + */ + @Test + public void geocOnAnEllipsoidConvertsGeocentricInputToGeographic() { + Pipeline p = factory.create("+proj=longlat +ellps=GRS80 +geoc"); + assertTrue(operatorOf(p).toString().contains("geoc")); + double es = org.locationtech.proj4j.datum.Ellipsoid.GRS80.getEccentricitySquared(); + double phi = 45.0 * ProjectionMath.DTR; + double expected = Math.atan(Math.tan(phi) / (1.0 - es)); + double got = p.forward(new double[] {0, phi, 0, 0})[1]; + assertEquals(expected, got, 1e-15); + assertTrue("the geographic latitude must be the larger of the two", got > phi); + // and about 11.5 arcminutes larger at 45 degrees, which is the magnitude an + // ignored +geoc would have cost. + assertEquals(0.19243, (got - phi) / ProjectionMath.DTR, 1e-5); + } + + /** The round trip closes: {@code inv_finalize} runs the conversion {@code PJ_FWD}. */ + @Test + public void geocRoundTrips() { + Pipeline p = factory.create("+proj=longlat +ellps=GRS80 +geoc"); + double phi = -32.5 * ProjectionMath.DTR; + double[] there = p.forward(new double[] {0.1, phi, 0, 0}); + assertEquals(phi, p.inverse(there)[1], 1e-15); + } + + /** + * {@code geoc.cpp:56}: within {@code 1e-9} radians of a pole the input is copied + * rather than converted, because {@code tan} diverges there while the two latitudes + * converge. Ported verbatim — a "better" implementation would return NaN or a huge + * value at the pole. + */ + @Test + public void geocDeclinesAtThePoles() { + Pipeline p = factory.create("+proj=longlat +ellps=GRS80 +geoc"); + double pole = Math.PI / 2.0; + assertEquals(pole, p.forward(new double[] {0, pole, 0, 0})[1], 0.0); + assertEquals(-pole, p.forward(new double[] {0, -pole, 0, 0})[1], 0.0); + } + + /** {@code +geoc=F} is PROJ-false and therefore inert. */ + @Test + public void anExplicitlyFalseGeocIsOff() { + Pipeline p = factory.create("+proj=longlat +ellps=GRS80 +geoc=F"); + assertTrue(!operatorOf(p).toString().contains("geoc")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/DoCartPredicateTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/DoCartPredicateTest.java new file mode 100644 index 0000000..1ae2ea1 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/DoCartPredicateTest.java @@ -0,0 +1,425 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.util.ProjectionMath; + +/** + * The {@code do_cart} predicate of {@code cs2cs_emulation_setup}, and the two tolerances + * inside it. + * + *

The line under test

+ * + *

{@code 9.8.1:src/create.cpp:135-140}, verbatim, inside the {@code towgs84} loop and + * reached only when every one of the seven Helmert parameters is zero: + * + *

+ * if (!(fabs(P->a_orig - 6378137.0) < 1e-8 &&
+ *       fabs(P->es_orig - 0.0066943799901413) < 1e-15)) { do_cart = 1; }
+ * 
+ * + *

{@link Cs2csOperator}'s {@code isWgs84Ellipsoid} reproduces it literally. When the + * predicate is false — the declared ellipsoid is not WGS84 to within those two + * tolerances — {@code create.cpp:167-197} builds the pair + * {@code proj=cart a= es=} and {@code proj=cart ellps=WGS84} and runs the + * second one inverted, so an all-zero {@code +towgs84} still performs the change of + * ellipsoid. When it is true, nothing is built and the operation is the identity. + * + *

Why this needed a test of its own

+ * + *

PROJ's other code path does the opposite, and a maintainer who reads only that + * one has a documented-looking reason to change this line. + * {@code 9.8.1:src/iso19111/io.cpp:9436-9450} deletes an adjacent {@code cart} / + * {@code inv cart} pair when the two ellipsoids are the literal strings {@code GRS80} and + * {@code WGS84} — a string comparison, with no tolerance at all. That is the + * CRS-parser path. This is the {@code pj_init} path, and it is the one the whole gie corpus + * runs on. They disagree on purpose, and the disagreement is what + * {@link #grs80KeepsTheCartPairWhichIsWhereTheTwoPROJPathsDisagree()} pins. + * + *

{@link Cs2csEmulationHelperTest} covers the neighbouring {@code create.cpp:125} branch — + * a grid shift suppressing both the Helmert and this round trip — but it uses + * {@code +ellps=bessel} on both arms, so the predicate answers "not WGS84" in both and is + * never exercised in its discriminating direction. + * + *

References

+ * + *

Every expected number below is from {@code cct} (PROJ 9.8.1, April 10th 2026), + * never from proj4j's own output. {@code cct} is the right tool here and {@code cs2cs} is + * not: {@code cs2cs} promotes both sides to full CRSs and therefore runs the + * {@code iso19111/io.cpp} path, which is precisely the path that behaves differently. Every + * row was taken with + * + *

echo "9 50 0 0" | cct -d 18 <definition>
+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
{@code cct} 9.8.1, input {@code 9 50 0}
definition (all with {@code +proj=longlat +towgs84=0,0,0})latitude outheight out{@code do_cart}
{@code +ellps=GRS80}50.0000000009286296180.0000614281743764881
{@code +ellps=WGS84}50.0000000000000000000.0000000000000000000
{@code +a=6378137 +es=0.0066943799901413}50.0000000000000000000.0000000000000000000
{@code +a=6378137.000000005 +es=0.0066943799901413}50.0000000000000000000.0000000000000000000
{@code +a=6378137.00000002 +es=0.0066943799901413}49.999999999999992895-0.0000000195577740671
{@code +a=6378136.999999995 +es=0.0066943799901413}50.0000000000000000000.0000000000000000000
{@code +a=6378136.99999998 +es=0.0066943799901413}49.9999999999999928950.0000000204890966421
{@code +a=6378137 +es=0.0066943799901418}50.0000000000000000000.0000000000000000000
{@code +a=6378137 +es=0.0066943799901433}50.0000000000000568430.0000000037252902981
+ * + *

The four non-zero heights are the whole discrimination, and they are exact zeros on the + * other side rather than merely small ones: when the predicate holds, no {@code cart} pair is + * constructed at all, so the operation is bit-identical to the input. That makes + * "moved / did not move" a crisp observable even where the boundary probes move the point by + * only 20 pm. + * + *

One known sub-picometre divergence from upstream, recorded rather than asserted + * away. {@code create.cpp:192} builds the hub leg as {@code proj=cart ellps=WGS84}, whose + * {@code es} is {@code 0.0066943799901413165} (derived from {@code rf=298.257223563}); + * {@link Cs2csOperator} builds it from the same {@code 0.0066943799901413} literal the + * predicate compares against. The two differ by 1.6e-17 in {@code es}, i.e. about 31 pm of + * height at this latitude — five orders below the tightest gie bar, and below the last digit + * {@code cct -d 18} prints, which is why every row above is reproduced exactly. + */ +public class DoCartPredicateTest { + + private final PipelineFactory factory = new PipelineFactory(); + + /** {@code create.cpp:131}. */ + private static final double WGS84_A = 6378137.0; + + /** {@code create.cpp:132} — the truncated literal, not {@code Ellipsoid.WGS84}'s {@code es}. */ + private static final double WGS84_ES = 0.0066943799901413; + + /** {@code create.cpp:135}. */ + private static final double A_TOLERANCE = 1e-8; + + /** {@code create.cpp:136}. */ + private static final double ES_TOLERANCE = 1e-15; + + private static final double DEG = ProjectionMath.DTR; + + // --------------------------------------------------------------- the discriminating pair + + /** + * The pair that {@link Cs2csEmulationHelperTest} could not make, because both of its arms + * were {@code +ellps=bessel}: two definitions identical but for the ellipsoid, one of which + * keeps the {@code cart} / {@code inv cart} round trip and one of which drops it. + * + *

GRS80 and WGS84 share {@code a = 6378137} exactly, so the {@code a} half of the + * predicate holds for both and the whole decision rests on the {@code es} half. + * The gap is 3.28e-11, which is 3.3e4 times the 1e-15 bar — comfortably outside it, which + * is why the round trip is kept, and why a maintainer who "simplifies" this to the + * {@code io.cpp} string comparison would silently delete a real change of ellipsoid. + */ + @Test + public void grs80KeepsTheCartPairWhichIsWhereTheTwoPROJPathsDisagree() { + // The premise, measured rather than asserted from memory. + assertEquals("GRS80 and WGS84 must share a, or this pair does not isolate the es half", + Ellipsoid.WGS84.getEquatorRadius(), Ellipsoid.GRS80.getEquatorRadius(), 0.0); + double esGap = Math.abs(Ellipsoid.GRS80.getEccentricitySquared() - WGS84_ES); + assertEquals("GRS80's es sits this far from create.cpp:132's literal", 3.275949e-11, + esGap, 1e-17); + assertTrue("and that is outside the 1e-15 bar by four orders, which is the whole point", + esGap > 1e4 * ES_TOLERANCE); + + Cs2csOperator grs80 = operatorOf("+proj=longlat +ellps=GRS80 +towgs84=0,0,0"); + assertHasCartPair(true, grs80); + + Cs2csOperator wgs84 = operatorOf("+proj=longlat +ellps=WGS84 +towgs84=0,0,0"); + assertHasCartPair(false, wgs84); + + // cct 9.8.1, "9 50 0" -> 50.000000000928629618 0.000061428174376488 + double[] shifted = forward("+proj=longlat +ellps=GRS80 +towgs84=0,0,0"); + assertEquals(50.000000000928629618, shifted[1] / DEG, 1e-13); + assertEquals(0.000061428174376488, shifted[2], 5e-19); + + // cct 9.8.1, "9 50 0" -> exactly the input back. + double[] untouched = forward("+proj=longlat +ellps=WGS84 +towgs84=0,0,0"); + assertEquals("dropping the pair must be bit-identity, not a small number", + 50.0 * DEG, untouched[1], 0.0); + assertEquals(0.0, untouched[2], 0.0); + } + + /** + * The control for the control: without a {@code +towgs84} there is no datum shift declared + * at all, the {@code while (p)} loop of {@code create.cpp:127} is never entered, and the + * predicate is never consulted. So the GRS80 assertion above is about the predicate and not + * merely about the ellipsoid. + * + *

{@code cct -d 18 +proj=longlat +ellps=GRS80} returns {@code 9 50 0} unchanged. + */ + @Test + public void withoutATowgs84ThePredicateIsNeverReached() { + assertHasCartPair(false, "+proj=longlat +ellps=GRS80"); + double[] out = forward("+proj=longlat +ellps=GRS80"); + assertEquals(50.0 * DEG, out[1], 0.0); + assertEquals(0.0, out[2], 0.0); + } + + /** + * A non-zero {@code +towgs84} takes the other branch entirely: a Helmert is built, and + * {@code create.cpp:167} then builds the {@code cart} pair because of the Helmert rather + * than because of the predicate. Pinned so that a future reading of "GRS80 keeps cart" + * cannot be mistaken for "cart depends only on the ellipsoid". + */ + @Test + public void aNonZeroTowgs84BuildsTheCartPairThroughTheHelmertBranchInstead() { + Cs2csOperator op = operatorOf("+proj=longlat +ellps=WGS84 +towgs84=1,0,0"); + assertTrue("a non-zero towgs84 must build a Helmert: " + op, op.toString().contains("helmert")); + assertHasCartPair(true, op); + } + + // ------------------------------------------------------------------- the 1e-8 on a + + /** + * {@code fabs(P->a_orig - 6378137.0) < 1e-8}, probed on both sides and in both directions. + * + *

The probe values are chosen so that the tolerance, and not the representability of a + * double, is what decides: one ULP at 6378137 is 9.31e-10, so 4.66e-9 is five ULP inside the + * bar and 1.96e-8 is twenty-one ULP outside it. Both are written as the shortest strings + * that round-trip to the intended doubles, and the parsed value is asserted before the + * verdict is, so a change in the parser cannot silently move the probe. + */ + @Test + public void theSemiMajorAxisToleranceOf1e8Discriminates() { + // Straddling above. + assertToleranceProbe("+a=6378137.000000005", 6378137.000000005, WGS84_A, A_TOLERANCE, false); + assertToleranceProbe("+a=6378137.00000002", 6378137.00000002, WGS84_A, A_TOLERANCE, true); + // ... and below, because fabs() is symmetric and a one-sided test would not show it. + assertToleranceProbe("+a=6378136.999999995", 6378136.999999995, WGS84_A, A_TOLERANCE, false); + assertToleranceProbe("+a=6378136.99999998", 6378136.99999998, WGS84_A, A_TOLERANCE, true); + + // cct 9.8.1: the two outside probes move the height by exactly the change of ellipsoid. + // The tolerance is 5e-19, i.e. half the last place cct -d 18 printed. + assertMoved(forward(aProbe("6378137.00000002")), -0.000000019557774067); + assertMoved(forward(aProbe("6378136.99999998")), 0.000000020489096642); + // The two inside probes are bit-identity, because nothing was built. + assertUnmoved(forward(aProbe("6378137.000000005"))); + assertUnmoved(forward(aProbe("6378136.999999995"))); + + // And the far field, so a tolerance accidentally widened to "anything" also fails. + assertHasCartPair(true, operatorOf(aProbe("6378388"))); + } + + // ------------------------------------------------------------------ the 1e-15 on es + + /** + * {@code fabs(P->es_orig - 0.0066943799901413) < 1e-15}, probed the same way. One ULP at + * 0.0066943799901413 is 8.67e-19, so 5.00e-16 is 576 ULP inside the bar and 2.00e-15 is + * 2,306 ULP outside it. + * + *

The literal itself is used as the zero point, and it is not + * {@link Ellipsoid#WGS84}'s {@code es}: {@code create.cpp:132} writes a truncated + * {@code 0.0066943799901413} where the ellipsoid table's {@code rf=298.257223563} derives + * {@code 0.0066943799901413165}. The 1.6e-17 gap is inside 1e-15, which is why + * {@code +ellps=WGS84} passes the predicate at all — assert that too, because a predicate + * that rejected its own namesake ellipsoid would be a very quiet defect. + */ + @Test + public void theEccentricitySquaredToleranceOf1e15Discriminates() { + double wgs84Derived = Ellipsoid.WGS84.getEccentricitySquared(); + assertTrue("Ellipsoid.WGS84's derived es must sit inside the bar against the literal, or " + + "+ellps=WGS84 would take the cart branch", + Math.abs(wgs84Derived - WGS84_ES) < ES_TOLERANCE); + assertEquals(1.6479873e-17, Math.abs(wgs84Derived - WGS84_ES), 1e-24); + + assertToleranceProbe("+es=0.0066943799901418", 0.0066943799901418, WGS84_ES, + ES_TOLERANCE, false); + assertToleranceProbe("+es=0.0066943799901433", 0.0066943799901433, WGS84_ES, + ES_TOLERANCE, true); + + // cct 9.8.1: 50.000000000000056843 0.000000003725290298 + assertMoved(forward(esProbe("0.0066943799901433")), 0.000000003725290298); + assertUnmoved(forward(esProbe("0.0066943799901418"))); + + // The exact literal, which is the only value with a zero residual on both halves. + assertHasCartPair(false, "+proj=longlat +a=6378137 +es=0.0066943799901413 " + + "+towgs84=0,0,0"); + } + + /** + * The predicate is a conjunction, so each half must be able to fail on its own. Holding one + * side at the exact literal while the other crosses its bar is what proves that — a + * predicate that had lost either {@code &&} operand would still pass every test above + * except this one. + */ + @Test + public void bothHalvesOfTheConjunctionAreLoadBearing() { + // a inside, es outside -> cart. + assertHasCartPair(true, "+proj=longlat +a=6378137 +es=0.0066943799901433 " + + "+towgs84=0,0,0"); + // a outside, es inside -> cart. + assertHasCartPair(true, "+proj=longlat +a=6378137.00000002 " + + "+es=0.0066943799901413 +towgs84=0,0,0"); + // both inside -> no cart. The only combination that drops it. + assertHasCartPair(false, "+proj=longlat +a=6378137.000000005 " + + "+es=0.0066943799901418 +towgs84=0,0,0"); + // both outside -> cart. + assertHasCartPair(true, "+proj=longlat +a=6378137.00000002 " + + "+es=0.0066943799901433 +towgs84=0,0,0"); + } + + /** + * The failure mode this whole class exists to prevent, stated as an assertion. + * + *

{@code io.cpp:9436-9450} decides the same question by comparing the two {@code +ellps=} + * names. Three definitions here would each be read differently by such a rule, and + * all three must keep the pair: + * + *

    + *
  • {@code +ellps=GRS80} — a name comparison against {@code WGS84} is what the CRS path + * uses to delete the pair;
  • + *
  • the same ellipsoid written as {@code +a}/{@code +es}, with no {@code +ellps=} token to + * compare at all;
  • + *
  • {@code +ellps=bessel}, whose name matches nothing and whose numbers are far outside + * both bars.
  • + *
+ */ + @Test + public void thePredicateIsNumericAndNotAComparisonOfEllipsoidNames() { + assertHasCartPair(true, "+proj=longlat +ellps=GRS80 +towgs84=0,0,0"); + assertHasCartPair(true, "+proj=longlat +a=6378137 +rf=298.257222101 " + + "+towgs84=0,0,0"); + assertHasCartPair(true, "+proj=longlat +ellps=bessel +towgs84=0,0,0"); + + // The nameless spelling of WGS84 must be dropped, for symmetry: the decision cannot be + // reading the name in either direction. + assertHasCartPair(false, "+proj=longlat +a=6378137 +rf=298.257223563 " + + "+towgs84=0,0,0"); + } + + // ----------------------------------------------------------------------------- helpers + + private static String aProbe(String a) { + return "+proj=longlat +a=" + a + " +es=0.0066943799901413 +towgs84=0,0,0"; + } + + private static String esProbe(String es) { + return "+proj=longlat +a=6378137 +es=" + es + " +towgs84=0,0,0"; + } + + /** + * Asserts one side of one tolerance, and asserts the arithmetic that places it there, so the + * probe cannot drift onto the wrong side of the bar without the test saying so. + * + * @param token the parameter under test, for the failure message + * @param parsed the double the token is intended to denote + * @param reference {@code create.cpp}'s constant for that half + * @param tolerance {@code create.cpp}'s bar for that half + * @param expectCartPair whether the resulting operation must keep the round trip + */ + private void assertToleranceProbe(String token, double parsed, double reference, + double tolerance, boolean expectCartPair) { + double residual = Math.abs(parsed - reference); + if (expectCartPair) { + assertTrue(token + " is meant to sit OUTSIDE " + tolerance + ", but its residual is " + + residual, residual > tolerance); + } else { + assertTrue(token + " is meant to sit INSIDE " + tolerance + ", but its residual is " + + residual, residual < tolerance); + } + String def = token.startsWith("+a=") + ? aProbe(token.substring(3)) + : esProbe(token.substring(4)); + Cs2csOperator op = operatorOf(def); + // The parser must have produced exactly the double the residual was computed from. + double actual = token.startsWith("+a=") + ? op.projection().getEllipsoid().getEquatorRadius() + : op.projection().getEllipsoid().getEccentricitySquared(); + assertEquals("the parser did not reproduce the probe value for " + token, parsed, actual, + 0.0); + assertHasCartPair(expectCartPair, op); + } + + /** + * The structural observable: whether {@link Cs2csOperator} built the pair at all, read off + * the description it prints for exactly this purpose. The behavioural observable — + * whether a point actually moves — is asserted separately by {@link #assertMoved} and + * {@link #assertUnmoved} at every site where the two are not confounded by a Helmert, and + * the two must agree; neither is used alone as the sole evidence for a probe. + */ + private void assertHasCartPair(boolean expected, Cs2csOperator op) { + assertHasCartPair(expected, op, op.toString()); + } + + private void assertHasCartPair(boolean expected, Cs2csOperator op, String definition) { + boolean declared = op.toString().contains(", cart"); + assertEquals("create.cpp:135-140's predicate says do_cart=" + (expected ? 1 : 0) + + " for `" + definition + "` (a=" + op.projection().getEllipsoid().getEquatorRadius() + + ", es=" + op.projection().getEllipsoid().getEccentricitySquared() + + "), so the cart/inv-cart round trip must be " + + (expected ? "KEPT" : "DROPPED") + "; the operator says", + expected, declared); + } + + /** Builds the operator and asserts the verdict, naming the definition if it is wrong. */ + private void assertHasCartPair(boolean expected, String definition) { + assertHasCartPair(expected, operatorOf(definition), definition); + } + + /** + * The behavioural half: the pair was built, so the point moved, and it moved to the number + * {@code cct} 9.8.1 printed. 5e-19 is half the last place of {@code cct -d 18}. + */ + private static void assertMoved(double[] out, double expectedHeight) { + assertTrue("the cart pair was supposed to move this point, and it did not", + out[2] != 0.0 || out[1] != 50.0 * DEG); + assertEquals(expectedHeight, out[2], 5e-19); + } + + /** + * The other half, and the sharper of the two: when the predicate holds, no pair is built and + * the operation is the identity. Asserted at zero tolerance, because "small" and + * "not constructed" are different claims and only the second one is being made. + */ + private static void assertUnmoved(double[] out) { + assertEquals("latitude must come back bit-identical", 50.0 * DEG, out[1], 0.0); + assertEquals("height must come back bit-identical", 0.0, out[2], 0.0); + } + + private Cs2csOperator operatorOf(String definition) { + Pipeline p = factory.create(definition); + assertEquals(1, p.steps().size()); + PipelineOperator op = p.steps().get(0).operator(); + assertTrue("expected a Cs2csOperator for " + definition + ", got " + + op.getClass().getName(), op instanceof Cs2csOperator); + return (Cs2csOperator) op; + } + + /** The {@code cct} probe point, 9 degrees east, 50 north, zero height. */ + private double[] forward(String definition) { + Pipeline p = factory.create(definition); + double[] out = p.forward(new double[] {9.0 * DEG, 50.0 * DEG, 0.0, 0.0}); + assertFalse("the longitude must be untouched by a pure change of ellipsoid", + Math.abs(out[0] / DEG - 9.0) > 1e-12); + return out; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineFactoryTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineFactoryTest.java new file mode 100644 index 0000000..2793c69 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineFactoryTest.java @@ -0,0 +1,436 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@link PipelineFactory}'s structural rules, against + * {@code 9.8.1:src/pipeline.cpp} and {@code src/init.cpp}. + * + *

The numerical cases live in {@link PipelineGigsTest}; this class is about the + * things that decide whether a pipeline exists and what its steps + * see. + */ +public class PipelineFactoryTest { + + private final PipelineFactory factory = new PipelineFactory(); + + private static double rad(double degrees) { + return degrees * Math.PI / 180.0; + } + + // -------------------------------------------------------------- rejection + + @Test + public void aNestedPipelineIsWrongSyntax() { + // pipeline.cpp:429-436. Nesting is legal only when the child is wrapped in + // an +init, which is why the check counts tokens rather than recursing. + try { + factory.create("+proj=pipeline +step +proj=pipeline +step +proj=noop"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.WRONG_SYNTAX, e.code()); + assertEquals(1025, e.code().projErrno()); + assertTrue("PROJ rejects this too", e.isRejectedByProj()); + } + } + + @Test + public void aPipelineWithNoStepIsWrongSyntax() { + // more_builtins.gie:235 asserts this fails upstream. + try { + factory.create("+proj=pipeline"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.WRONG_SYNTAX, e.code()); + } + } + + @Test + public void aStepBeforeTheProjPipelineTokenIsWrongSyntax() { + try { + factory.create("+step +proj=pipeline +step +proj=merc +ellps=GRS80"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.WRONG_SYNTAX, e.code()); + } + } + + /** + * A bare {@code +step} with no {@code +proj=pipeline} is an implicit + * pipeline and must be accepted. + * + *

It does not go through {@code pj_init}, which would report a missing + * {@code +proj} — {@code pj_param_exists} stops at the first {@code step}. It goes + * through {@code proj_create}'s {@code PROJStringParser}, which reads a lone + * {@code +step} as a one-step pipeline. {@code more_builtins.gie:535} is + * {@code operation +step +proj=latlong +ellps=WGS84} and asserts real coordinates + * for it, so rejecting it would claim PROJ refuses an operation PROJ runs — the + * exact confusion that makes an {@code expect failure} row meaningless. + */ + @Test + public void aStepWithNoProjPipelineIsAnImplicitPipeline() { + Pipeline p = factory.create("+step +proj=latlong +ellps=WGS84"); + assertEquals(1, p.steps().size()); + assertEquals(GieIoUnits.RADIANS, p.left()); + assertEquals(GieIoUnits.RADIANS, p.right()); + double[] out = p.forward(new double[] {rad(-64.737589), rad(17.546), 0, 0}); + assertEquals(rad(-64.737589), out[0], 1e-15); + assertEquals(rad(17.546), out[1], 1e-15); + } + + @Test + public void anOperatorAmongTheGlobalsIsWrongSyntax() { + // pipeline.cpp:438-452, added against an oss-fuzz case. + try { + factory.create("+proj=pipeline +proj=merc +step +proj=noop"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.WRONG_SYNTAX, e.code()); + } + } + + @Test + public void anEmptyDefinitionIsAMissingArgument() { + try { + factory.create(""); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.MISSING_ARG, e.code()); + } + } + + /** + * {@code get_init_string} ({@code init.cpp:134}) sets + * {@code PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE}, not the file code, when the section + * is not in the init file — so this is a bad parameter value, and it must + * not share a code with a grid file proj4j cannot read. + */ + @Test + public void anInitKeyWithNoSectionIsAnIllegalArgumentValue() { + try { + factory.create("+proj=pipeline +step +init=epsg:999999999"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.INVALID_INIT_KEY, e.code()); + assertEquals(1027, e.code().projErrno()); + } + } + + @Test + public void mismatchedUnitsBetweenAdjacentStepsAreWrongSyntax() { + // pipeline.cpp:620-636. A projected right-hand side cannot feed an angular + // left-hand side. Here: merc emits PROJECTED, and the following merc wants + // RADIANS. + try { + factory.create("+proj=pipeline" + + " +step +proj=merc +ellps=GRS80" + + " +step +proj=merc +ellps=GRS80"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.WRONG_SYNTAX, e.code()); + assertTrue(e.getMessage().contains("mismatched units")); + } + } + + /** + * The inverse of what this test used to assert. {@code +datum=NAD27} expands to a + * {@code +nadgrids=} list, which {@code create.cpp:107-124} turns into a hidden + * {@code +proj=hgridshift}; until that helper existed the only honest thing to do + * was refuse, because reading the datum's Helmert parameters instead would have + * dropped the grid and emitted a coordinate wrong by the size of the shift. + * {@code Cs2csOperator} now builds it, so the definition must resolve, and + * resolve to something that really carries the shift. + * + *

Deterministic, and deliberately not conditioned on + * {@code Datum.NAD27.getTransformType()}: that value depends on whether the grid + * resolver was configured before {@code Datum}'s static initialiser ran, which made + * {@code DHDN_ETRS89.gie} score 64/64 or 32/32 depending on test order. The + * definition alone decides, per {@code 9.8.1:src/datums.cpp}. + */ + @Test + public void aGridShiftDatumNowBuildsTheHiddenHgridshift() { + Cs2csOperator op = cs2cs(factory.create("+proj=pipeline +step +proj=longlat +datum=NAD27")); + assertNotNull("the datum's +nadgrids= list must become the hidden helper", + op.hgridshift()); + assertEquals("@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", op.hgridshift().gridSpec()); + } + + /** The single step's operator, which every test below needs to look inside. */ + private static Cs2csOperator cs2cs(Pipeline p) { + assertEquals(1, p.steps().size()); + PipelineOperator op = p.steps().get(0).operator(); + assertTrue("expected a Cs2csOperator, got " + op.getClass().getName(), + op instanceof Cs2csOperator); + return (Cs2csOperator) op; + } + + /** + * {@code pj_datum_set} tests {@code nadgrids} before {@code towgs84} in an + * {@code if}/{@code else if}, and the datum's own definition has been appended to + * the paralist by then — so a grid definition reached through {@code +datum=} beats + * an explicit {@code +towgs84} the user wrote, which is the one place in this engine + * where first-match-wins does not decide. + */ + @Test + public void aDatumGridOutranksAnExplicitTowgs84() { + Cs2csOperator op = cs2cs(factory.create( + "+proj=pipeline +step +proj=longlat +datum=NAD27 +towgs84=1,2,3")); + assertNotNull("the grid must win over the Helmert", op.hgridshift()); + assertFalse("no Helmert may be built alongside it: " + op, + op.toString().contains("helmert")); + } + + /** + * {@code +nadgrids=@null} — what {@code +init=epsg:3857} expands to. {@code null} is + * a real grid name upstream and shifts nothing, so the step must build, be visible, + * and be the identity rather than being refused. + */ + @Test + public void theNullGridBuildsAndShiftsNothing() { + Pipeline p = factory.create("+proj=pipeline +step +proj=longlat +nadgrids=@null"); + assertNotNull(cs2cs(p).hgridshift()); + double[] out = p.forward(new double[] {0.1, 0.9, 0.0, 0.0}); + assertEquals(0.1, out[0], 0.0); + assertEquals(0.9, out[1], 0.0); + } + + /** + * A required grid that cannot be found is fatal at construction, never a + * per-row no-op that reports success. + * + *

Which layer refuses is recorded rather than asserted narrowly: + * {@code Proj4Parser.parseDatum} resolves {@code +nadgrids} for its own + * {@code Datum} and gets there first, throwing {@code InvalidValueException} + * ("Unknown nadgrid"), so {@code HGridShiftOperator} is never reached. Both are a + * {@code Proj4jException} naming the grid, which is the property that matters, and + * the bridge maps the parser's message to {@code MISSING_GRID}. If the parser ever + * stops resolving the key, this becomes + * {@code PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID} from + * {@link HorizontalGrids#open} and the assertion still holds. + */ + @Test + public void aRequiredMissingNadgridIsFatal() { + try { + factory.create("+proj=pipeline +step +proj=longlat +nadgrids=nosuchgrid.gsb"); + fail("expected a rejection"); + } catch (Proj4jException e) { + assertTrue("the message must name the grid: " + e.getMessage(), + e.getMessage().contains("nosuchgrid.gsb")); + } + } + + // ------------------------------------------------------ per-step scoping + + /** + * The parameter-scoping rule, observed end to end rather than on + * {@link ProjParams} alone: two steps each name their own {@code +lon_0}, and + * neither leaks into the other. + */ + @Test + public void eachStepSeesOnlyItsOwnParameters() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=merc +lon_0=10 +ellps=GRS80 +inv" + + " +step +proj=merc +lon_0=20 +ellps=GRS80"); + // Forward: undo a lon_0=10 mercator, then apply a lon_0=20 one. A point at + // the first central meridian (x = 0) must land 10 degrees west of the second. + double[] out = p.forward(new double[] {0, 0, 0, 0}); + double[] expected = factory + .create("+proj=pipeline +step +proj=merc +lon_0=20 +ellps=GRS80") + .forward(new double[] {rad(10), 0, 0, 0}); + assertEquals(expected[0], out[0], 1e-6); + assertTrue("a 10 degree offset, not zero", Math.abs(out[0]) > 1.0e6); + } + + /** + * A global token is appended to every step's list + * ({@code pipeline.cpp:487-488}), so it is the lowest-precedence source: a step + * that names the same key wins. + */ + @Test + public void aGlobalIsInheritedByEveryStepButShadowedByAStepToken() { + Pipeline inherited = factory.create("+proj=pipeline +ellps=clrk66" + + " +step +proj=merc +inv" + + " +step +proj=merc"); + Pipeline shadowed = factory.create("+proj=pipeline +ellps=clrk66" + + " +step +proj=merc +inv" + + " +step +proj=merc +ellps=GRS80"); + double[] a = inherited.forward(new double[] {1000000, 0, 0, 0}); + double[] b = shadowed.forward(new double[] {1000000, 0, 0, 0}); + assertEquals("clrk66 on both sides is the identity in x", 1000000.0, a[0], 1e-6); + // A mercator easting on the equator is a*k0*lambda, so undoing a clrk66 one + // and reapplying a GRS80 one rescales by 6378137/6378206.4 - about 11 m in a + // million, which is small but unmistakably not the identity. + assertEquals(1000000.0 * 6378137.0 / 6378206.4, b[0], 1e-3); + assertTrue("a GRS80 second step is not the identity", Math.abs(b[0] - 1000000.0) > 5.0); + } + + /** + * The {@code proj=pipeline} token itself is never inherited: upstream starts + * copying the globals at {@code i_pipeline + 1}. If it were inherited, every + * step would look like a nested pipeline. + */ + @Test + public void theProjPipelineTokenIsNotInheritedByItsSteps() { + Pipeline p = factory.create("+proj=pipeline +step +proj=merc +ellps=GRS80"); + assertEquals(1, p.steps().size()); + } + + // --------------------------------------------------------------- +inv + + @Test + public void invOnAStepRunsTheOppositeDirectionAndSwapsItsUnitSides() { + Pipeline plain = factory.create("+proj=pipeline +step +proj=merc +ellps=GRS80"); + Pipeline inverted = factory.create("+proj=pipeline +step +proj=merc +ellps=GRS80 +inv"); + + assertEquals(GieIoUnits.RADIANS, plain.left()); + assertEquals(GieIoUnits.PROJECTED, plain.right()); + assertEquals("+inv exchanges the two sides", GieIoUnits.PROJECTED, inverted.left()); + assertEquals(GieIoUnits.RADIANS, inverted.right()); + + double[] projected = plain.forward(new double[] {rad(10), rad(45), 0, 0}); + double[] back = inverted.forward(projected); + assertEquals(rad(10), back[0], 1e-12); + assertEquals(rad(45), back[1], 1e-9); + } + + /** + * {@code pipeline.cpp:519-522} toggles per {@code inv} token over the + * step's combined argument list, which is how a global {@code +inv} is + * overridden per step. Two occurrences therefore cancel. + */ + @Test + public void invTogglesSoAGlobalAndAStepOccurrenceCancel() { + Pipeline p = factory.create("+proj=pipeline +inv +step +proj=merc +ellps=GRS80 +inv"); + assertFalse(p.steps().get(0).isInverted()); + assertEquals(GieIoUnits.RADIANS, p.left()); + } + + @Test + public void aGlobalInvAloneInvertsEveryStep() { + Pipeline p = factory.create("+proj=pipeline +inv +step +proj=merc +ellps=GRS80"); + assertTrue(p.steps().get(0).isInverted()); + assertEquals(GieIoUnits.PROJECTED, p.left()); + } + + @Test + public void invEqualsTIsNotAnInvToken() { + // The match is strcmp("inv", token), so a valued token does not count. + Pipeline p = factory.create("+proj=pipeline +step +proj=merc +ellps=GRS80 +inv=T"); + assertFalse(p.steps().get(0).isInverted()); + } + + // ---------------------------------------------------------------- units + + /** + * {@code pipeline.cpp:631-636}: {@code P->left} is {@code pj_left} of the + * first step and {@code P->right} is {@code pj_right} of the + * last, both folded and both honouring {@code +inv}. + */ + @Test + public void theIoUnitsComeFromTheFirstAndLastSteps() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=merc +ellps=GRS80 +inv" + + " +step +proj=utm +zone=32 +ellps=GRS80"); + assertEquals(GieIoUnits.PROJECTED, p.left()); + assertEquals(GieIoUnits.PROJECTED, p.right()); + assertEquals("CLASSIC is folded away, never reported", GieIoUnits.PROJECTED, + p.right().folded()); + } + + @Test + public void aWhateverOnlyStepAdoptsItsNeighboursUnits() { + // pipeline.cpp:583-618. axisswap declares WHATEVER on both sides; the merc + // to its right declares RADIANS on its left, so the axisswap becomes + // RADIANS/RADIANS and the pipeline reports RADIANS on its left. + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=axisswap +order=2,1" + + " +step +proj=merc +ellps=GRS80"); + assertEquals(GieIoUnits.RADIANS, p.left()); + assertEquals(GieIoUnits.PROJECTED, p.right()); + } + + @Test + public void aUnitconvertWithOneKnownSideIsNotOverwritten() { + // The both-sides-WHATEVER precondition is what protects upstream's named + // case: a leading deg->rad unitconvert must keep its non-radian left side. + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=unitconvert +xy_in=deg +xy_out=rad" + + " +step +proj=merc +ellps=GRS80"); + assertEquals(GieIoUnits.DEGREES, p.left()); + assertEquals(GieIoUnits.PROJECTED, p.right()); + } + + // ------------------------------------------------------------- ellipsoid + + /** + * A pipeline with no global {@code +ellps} defaults to GRS80 + * ({@code pipeline.cpp:338-340}) where a bare operation defaults to WGS84 + * ({@code init.cpp:576-581}). The value feeds only the geodesic a conformance + * comparator measures with, but confusing the two defaults is how a downstream + * comparator ends up measuring on the wrong ellipsoid. + */ + @Test + public void aPipelineDefaultsToGrs80AndASingleOperationToWgs84() { + Pipeline pipeline = factory.create("+proj=pipeline +step +proj=merc +ellps=clrk66"); + assertEquals(Pipeline.GRS80_A, pipeline.globalEllipsoidA(), 0.0); + assertEquals(Pipeline.GRS80_F, pipeline.globalEllipsoidF(), 0.0); + + Pipeline single = factory.create("+proj=merc +ellps=clrk66"); + assertEquals(6378137.0, single.globalEllipsoidA(), 0.0); + assertEquals(1 / 298.257223563, single.globalEllipsoidF(), 1e-15); + } + + @Test + public void aGlobalEllipsoidIsUsedForTheGeodesicButAStepsIsNot() { + Pipeline global = factory.create("+proj=pipeline +ellps=clrk66 +step +proj=merc"); + assertEquals(6378206.4, global.globalEllipsoidA(), 1e-6); + + Pipeline stepOnly = factory.create("+proj=pipeline +step +proj=merc +ellps=clrk66"); + assertEquals("set_ellipsoid cuts the list at the first +step", + Pipeline.GRS80_A, stepOnly.globalEllipsoidA(), 0.0); + } + + // ------------------------------------------------------ shape predicate + + @Test + public void isSupportedShapeRecognisesPipelinesAndLegacyInits() { + assertTrue(PipelineFactory.isSupportedShape("+proj=pipeline +step +proj=noop")); + assertTrue(PipelineFactory.isSupportedShape("+step +proj=noop")); + assertTrue(PipelineFactory.isSupportedShape("+init=epsg:27572")); + assertFalse(PipelineFactory.isSupportedShape("+proj=merc +ellps=GRS80")); + } + + @Test + public void moreThanOneInitInASingleOperationIsWrongSyntax() { + // init.cpp:477-482. Legal in a pipeline, illegal outside one. + try { + factory.create("+init=epsg:4326 +init=epsg:4258"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.WRONG_SYNTAX, e.code()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineGigsTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineGigsTest.java new file mode 100644 index 0000000..2ef52e6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineGigsTest.java @@ -0,0 +1,399 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * The pipeline engine against the IOGP GIGS corpus. + * + *

Every expected value here is transcribed from + * {@code conformance/src/test/resources/gigs/*.gie}, which is byte-identical to + * PROJ 9.8.1's {@code test/gigs/}, and each is cited by file. The full 1,170-assertion + * sweep lives in the {@code proj4j-conformance} module; this class is the subset that + * covers one mechanism each, so that a break here names its own cause + * instead of moving a corpus total by an unattributed amount. + * + * + * + * + * + * + * + * + * + * + * + * + * + *
What each case is for
casemechanism
5208{@code +pm} — the pipeline is a pure prime-meridian rotation
5101.1an explicit operator step after an {@code +init=} step
5102.2{@code +proj=unitconvert} grad-to-rad, and the {@code WHATEVER} unit domain
5103.1a pipeline-level {@code +towgs84=0,0,0} suppressing a double datum shift
5103.2/.3{@code +units=ft} against {@code +units=us-ft}
5106{@code +no_uoff} on an {@code omerc}
5111.1a 7-parameter {@code +towgs84} Helmert
5113{@code +axis=wsu}
5201{@code +proj=geocent} and a meaningful third ordinate
+ * + *

Reading the tolerances. A GIGS tolerance is a linear metre distance, so + * an angular result is compared as a great-circle distance rather than as a + * difference of degrees. {@link #assertAngular} does that conversion the cheap way — + * a spherical approximation is ample when the bar is 30 mm and the deviations are + * micrometres — and deliberately does not reimplement the gie comparator, + * which is already published as {@code org.locationtech.proj4j.gie.GieComparator} and + * exercised by its own tests. + */ +public class PipelineGigsTest { + + /** Metres per radian of great circle, for turning an angular residual into a distance. */ + private static final double METRES_PER_RADIAN = 6378137.0; + + private final PipelineFactory factory = new PipelineFactory(); + + private static double rad(double degrees) { + return degrees * Math.PI / 180.0; + } + + /** Forward, taking and returning whatever the pipeline's unit domains say. */ + private double[] forward(Pipeline p, double x, double y, double z) { + return p.forward(new double[] {x, y, z, 0}); + } + + private static void assertProjected(String what, double[] actual, double x, double y, + double toleranceMetres) { + double deviation = Math.hypot(actual[0] - x, actual[1] - y); + assertTrue(what + ": deviation " + deviation + " m exceeds " + toleranceMetres + + " m (got " + actual[0] + ", " + actual[1] + ")", deviation <= toleranceMetres); + } + + private static void assertAngular(String what, double[] actualRadians, double lonDegrees, + double latDegrees, double toleranceMetres) { + double dLon = actualRadians[0] - rad(lonDegrees); + double dLat = actualRadians[1] - rad(latDegrees); + double deviation = Math.hypot(dLon * Math.cos(rad(latDegrees)), dLat) * METRES_PER_RADIAN; + assertTrue(what + ": deviation " + deviation + " m exceeds " + toleranceMetres + " m (got " + + Math.toDegrees(actualRadians[0]) + ", " + Math.toDegrees(actualRadians[1]) + ")", + deviation <= toleranceMetres); + } + + /** + * {@code proj_roundtrip}'s half-step phasing ({@code 9.8.1:src/trans.cpp:591-629}): + * one forward, then {@code n-1} inverse/forward cycles taken out of phase, then + * one inverse. It is not {@code n} pairs, and the difference is a factor of + * roughly {@code n} in the residual. + */ + private static double roundtripResidualMetres(Pipeline p, double[] origin, int n) { + double[] t = p.forward(origin); + for (int i = 0; i < n - 1; i++) { + t = p.forward(p.inverse(t)); + } + t = p.inverse(t); + return Math.hypot((t[0] - origin[0]) * Math.cos(origin[1]), t[1] - origin[1]) + * METRES_PER_RADIAN; + } + + // ------------------------------------------------------------------- 5208 + + /** + * {@code gigs/5208.gie} — Longitude Rotation. The two CRSs differ only in their + * prime meridian ({@code EPSG:4275} is NTF on Greenwich, {@code 4807} is NTF on + * Paris) and carry the same {@code +towgs84}, so the datum shift cancels exactly + * and the whole pipeline reduces to subtracting Paris's 2°20'14.025". + * + *

{@code tolerance 0.01 m}, and the file explains that the GIGS figure is + * 0.01 arc-seconds converted to a linear distance and then tightened. + */ + @Test + public void gigs5208LongitudeRotation() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +init=epsg:4275 +inv" + + " +step +init=epsg:4807"); + assertEquals(GieIoUnits.RADIANS, p.left()); + assertEquals(GieIoUnits.RADIANS, p.right()); + + assertAngular("5 58", forward(p, rad(5), rad(58), 0), 2.66277083, 58, 0.01); + assertAngular("4 51", forward(p, rad(4), rad(51), 0), 1.66277083, 51, 0.01); + assertAngular("2.33722917 46.8", forward(p, rad(2.33722917), rad(46.8), 0), 0, 46.8, 0.01); + assertAngular("9 53", forward(p, rad(9), rad(53), 0), 6.66277083, 53, 0.01); + + // The reverse pipeline, which is 5208's second operation block. + Pipeline back = factory.create("+proj=pipeline" + + " +step +init=epsg:4807 +inv" + + " +step +init=epsg:4275"); + assertAngular("reverse 2.66277083 58", forward(back, rad(2.66277083), rad(58), 0), + 5, 58, 0.01); + } + + // ----------------------------------------------------------------- 5101.1 + + /** + * {@code gigs/5101.1-jhs.gie} — Transverse Mercator by the JHS formula. An + * {@code +init=} step feeding an explicit operator step, which is the shape that + * proves a step's own parameters are honoured rather than the expansion's. + * + *

{@code tolerance 0.03 m} forward, {@code 0.006 m} for the + * {@code roundtrip 1000}. + */ + @Test + public void gigs5101TransverseMercator() { + String etmerc = "+proj=etmerc +lat_0=49 +lon_0=-2 +k_0=0.9996012717 +x_0=400000" + + " +y_0=-100000 +ellps=WGS84 +units=m +no_def"; + Pipeline p = factory.create("+proj=pipeline +step +init=epsg:4326 +inv +step " + etmerc); + assertEquals(GieIoUnits.RADIANS, p.left()); + assertEquals(GieIoUnits.PROJECTED, p.right()); + + assertProjected("3 80", forward(p, rad(3), rad(80), 0), 496813.178, 3358297.326, 0.03); + assertProjected("3 49", forward(p, rad(3), rad(49), 0), 765648.501, -87944.74, 0.03); + assertProjected("3 0", forward(p, rad(3), rad(0), 0), 957087.829, -5527462.686, 0.03); + assertProjected("2.9999999 60", forward(p, rad(2.9999999), rad(60), 0), + 678711.584, 1134498.83, 0.03); + + Pipeline reverse = factory.create("+proj=pipeline +step " + etmerc + + " +inv +step +init=epsg:4326"); + assertEquals(GieIoUnits.PROJECTED, reverse.left()); + assertEquals(GieIoUnits.RADIANS, reverse.right()); + assertAngular("reverse 496813.178 3358297.326", + forward(reverse, 496813.178, 3358297.326, 0), 3, 80, 0.03); + + assertTrue("roundtrip 1000 must close inside 6 mm", + roundtripResidualMetres(p, new double[] {rad(3), rad(49), 0, 0}, 1000) <= 0.006); + } + + // ----------------------------------------------------------------- 5102.2 + + /** + * {@code gigs/5102.2.gie} — Lambert Conic Conformal (1SP) from NTF (Paris). + * + *

Two mechanisms in one file. The leading + * {@code +proj=unitconvert +xy_in=grad +xy_out=rad} exists because + * {@code +init=epsg:4807}'s longitudes are Paris grads, and it makes the + * pipeline's left-hand unit domain {@link GieIoUnits#WHATEVER} rather than + * {@code RADIANS} — so the accepted coordinate is fed in as grads, not + * converted from degrees. The reverse pipeline ends {@code +xy_out=grad}, which + * leaves its right-hand side {@code WHATEVER} and is why gie compares + * grad values with a Euclidean metric against a tolerance written in metres. + * Both are upstream behaviour; see {@link UnitConvertOperator}. + */ + @Test + public void gigs5102LambertConicConformalFromParisGrads() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +proj=unitconvert +xy_in=grad +xy_out=rad" + + " +step +init=epsg:4807 +inv" + + " +step +init=epsg:27572"); + assertEquals("a grad input side is WHATEVER, so gie feeds grads unconverted", + GieIoUnits.WHATEVER, p.left()); + assertEquals(GieIoUnits.PROJECTED, p.right()); + + assertProjected("2.9586342556 64.4444444444 grad", + forward(p, 2.9586342556, 64.4444444444, 0), 760724.023, 3457334.864, 0.03); + assertProjected("2.9586342556 60 grad", + forward(p, 2.9586342556, 60.0, 0), 776020.989, 3005978.979, 0.03); + + Pipeline reverse = factory.create("+proj=pipeline" + + " +step +init=epsg:27572 +inv" + + " +step +init=epsg:4807" + + " +step +proj=unitconvert +xy_in=rad +xy_out=grad"); + assertEquals(GieIoUnits.PROJECTED, reverse.left()); + assertEquals("grad normalises to \"Grad\", so this stays WHATEVER", + GieIoUnits.WHATEVER, reverse.right()); + double[] back = forward(reverse, 760724.023, 3457334.864, 0); + assertEquals(2.9586342556, back[0], 1e-6); + assertEquals(64.4444444444, back[1], 1e-6); + } + + // ----------------------------------------------------------------- 5103.1 + + /** + * {@code gigs/5103.1.gie} — Lambert Conic Conformal (2SP), Belgium. + * + *

Its third operation block is {@code +proj=pipeline towgs84=0,0,0 …} with the + * file comment "turn off dual datum shift". The global token is appended to each + * step's argument list ahead of the {@code +init=} expansion, so + * first-match-wins makes it shadow the seven-parameter {@code towgs84} that + * {@code EPSG:4313} and {@code 31370} both declare. The change of ellipsoid + * survives, the Helmert does not, and the {@code roundtrip 1000} then closes + * inside 6 mm. + * + *

This is the case that fails silently if the ordering is reversed: the shift + * gets applied twice and the result is plausible but wrong. + */ + @Test + public void gigs5103PipelineLevelTowgs84SuppressesTheDoubleDatumShift() { + Pipeline shifted = factory.create("+proj=pipeline" + + " +step +init=epsg:4313 +inv" + + " +step +init=epsg:31370"); + assertProjected("5 58 with the EPSG shift", forward(shifted, rad(5), rad(58), 0), + 187742.7, 969521.653, 0.03); + + Pipeline suppressed = factory.create("+proj=pipeline +towgs84=0,0,0" + + " +step +init=epsg:4313 +inv" + + " +step +init=epsg:31370"); + // Same coordinate, different answer: the global token really did shadow the + // expansion's. (Both agree to ~1 mm here because the two Helmerts nearly + // cancel; the point is that the roundtrip closes, which it cannot if the + // shift is applied twice with numerical drift.) + assertTrue("roundtrip 1000 must close inside 6 mm", + roundtripResidualMetres(suppressed, new double[] {rad(5), rad(58), 0, 0}, 1000) + <= 0.006); + } + + // ------------------------------------------------------------ 5103.2/.3 + + /** + * {@code gigs/5103.2.gie} and {@code 5103.3.gie} — the same Lambert Conic + * Conformal over the same input, once in {@code +units=ft} ({@code EPSG:2921}) + * and once in {@code +units=us-ft} ({@code EPSG:3568}). The two files exist to + * separate the international foot from the US survey foot, and their expected + * eastings differ by four metres — so passing both is proof the distinction is + * honoured rather than coincidence. + */ + @Test + public void gigs5103InternationalFootAgainstUsSurveyFoot() { + Pipeline intlFoot = factory.create("+proj=pipeline" + + " +step +init=epsg:4152 +inv" + + " +step +init=epsg:2921"); + Pipeline usFoot = factory.create("+proj=pipeline" + + " +step +init=epsg:4152 +inv" + + " +step +init=epsg:3568"); + + double[] a = forward(intlFoot, rad(-110), rad(49), 0); + double[] b = forward(usFoot, rad(-110), rad(49), 0); + assertProjected("2921 ft", a, 2003937.27, 6452491.7, 0.03); + assertProjected("3568 us-ft", b, 2003933.27, 6452478.8, 0.03); + assertTrue("the two units must not produce the same easting", + Math.abs(a[0] - b[0]) > 3.0); + } + + // ------------------------------------------------------------------- 5106 + + /** + * {@code gigs/5106.gie} — Hotine Oblique Mercator, Malaysia. {@code EPSG:3376} + * carries {@code +no_uoff}, which is undocumented upstream (the docs name only + * {@code +no_off}) but accepted as a synonym, and which moves the origin by the + * "uoff" term. It also carries no {@code +towgs84} at all, so the pipeline is a + * pure projection change on one ellipsoid. + */ + @Test + public void gigs5106ObliqueMercatorWithNoUoff() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +init=epsg:4742 +inv" + + " +step +init=epsg:3376"); + assertProjected("117 12", forward(p, rad(117), rad(12), 0), + 807919.144, 1329535.334, 0.05); + assertProjected("117 10", forward(p, rad(117), rad(10), 0), + 808784.981, 1107678.473, 0.05); + } + + // ----------------------------------------------------------------- 5111.1 + + /** + * {@code gigs/5111.1.gie} — Mercator (variant A), Indonesia, over a genuine + * three-parameter {@code +towgs84} ({@code EPSG:4211}/{@code 3001}, Batavia on + * Bessel, {@code -377,681,-50}). This is the case where the cartesian round-trip + * and the Helmert both matter: the ellipsoid changes and the origin + * moves. + */ + @Test + public void gigs5111MercatorAcrossARealDatumShift() { + Pipeline p = factory.create("+proj=pipeline +towgs84=0,0,0" + + " +step +init=epsg:4211 +inv" + + " +step +init=epsg:3001"); + assertProjected("100.0876483 77.6534822", forward(p, rad(100.0876483), rad(77.6534822), 0), + 2800000.0, 15000000.0, 0.055); + assertProjected("100.0876483 73.1442856", forward(p, rad(100.0876483), rad(73.1442856), 0), + 2800000.0, 13000000.0, 0.05); + } + + // ------------------------------------------------------------------- 5113 + + /** + * {@code gigs/5113.gie} — Transverse Mercator (South Orientated), South Africa. + * {@code EPSG:2049} carries {@code +axis=wsu}, and it is the only reason the + * expected easting is negative and the expected northing positive. Without the + * auto-inserted {@code +proj=axisswap} step both signs come out reversed, which + * is a 5.5 million metre error that no tolerance hides. + */ + @Test + public void gigs5113AxisWsuFlipsBothSigns() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +init=epsg:4148 +inv" + + " +step +init=epsg:2049"); + double[] out = forward(p, rad(21.5), rad(-25.0), 0); + assertProjected("21.5 -25", out, -50475.46, 2766147.25, 0.03); + assertTrue("easting must be negative", out[0] < 0); + assertTrue("northing must be positive", out[1] > 0); + + Pipeline reverse = factory.create("+proj=pipeline" + + " +step +init=epsg:2049 +inv" + + " +step +init=epsg:4148"); + assertAngular("reverse", forward(reverse, -50475.46, 2766147.25, 0), 21.5, -25.0, 0.03); + } + + // ------------------------------------------------------------------- 5201 + + /** + * {@code gigs/5201.gie} — geographic/geocentric conversions. Three things at + * once: the pipeline's left-hand domain is {@link GieIoUnits#CARTESIAN} rather + * than angular, the third ordinate is a real ellipsoidal height rather than + * padding, and {@code +proj=geocent} is executed by this package's own + * {@code +proj=cart} port — proj4j's {@code GeocentProjection} reads its + * destination coordinate instead of its source and cannot produce an answer at + * all. + */ + @Test + public void gigs5201GeographicGeocentric() { + Pipeline p = factory.create("+proj=pipeline" + + " +step +init=epsg:4978 +inv" + + " +step +init=epsg:4326"); + assertEquals(GieIoUnits.CARTESIAN, p.left()); + assertEquals(GieIoUnits.RADIANS, p.right()); + + double[] a = forward(p, -962479.5924, 555687.8517, 6260738.6526); + assertAngular("150 80", a, 150, 80, 0.01); + assertEquals("ellipsoidal height", 1214.137, a[2], 0.01); + + double[] b = forward(p, 2764128.3196, 4787610.6883, 3170373.7354); + assertAngular("60 30", b, 60, 30, 0.01); + assertEquals(0.0, b[2], 0.01); + + double[] c = forward(p, 2764128.3196, -4787610.6883, -3170373.7354); + assertAngular("-60 -30", c, -60, -30, 0.01); + assertEquals(0.0, c[2], 0.01); + + Pipeline reverse = factory.create("+proj=pipeline" + + " +step +init=epsg:4326 +inv" + + " +step +init=epsg:4978"); + assertEquals(GieIoUnits.RADIANS, reverse.left()); + assertEquals(GieIoUnits.CARTESIAN, reverse.right()); + double[] back = forward(reverse, rad(150), rad(80), 1214.137); + assertProjected("reverse XYZ", back, -962479.5924, 555687.8517, 0.01); + assertEquals(6260738.6526, back[2], 0.01); + } + + // -------------------------------------------------- the legacy single form + + /** + * A bare {@code +init=} is the same operation as a one-step pipeline containing + * it — {@code pj_init} runs the same {@code cs2cs_emulation_setup} either way — + * except that its geodesic default is WGS84 rather than GRS80. + */ + @Test + public void aBareInitIsTheSameOperationAsAOneStepPipeline() { + double[] single = factory.create("+init=epsg:27572") + .forward(new double[] {rad(2.33722917), rad(46.8), 0, 0}); + double[] wrapped = factory.create("+proj=pipeline +step +init=epsg:27572") + .forward(new double[] {rad(2.33722917), rad(46.8), 0, 0}); + assertEquals(single[0], wrapped[0], 0.0); + assertEquals(single[1], wrapped[1], 0.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineOperatorDispatchTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineOperatorDispatchTest.java new file mode 100644 index 0000000..3bc6241 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/PipelineOperatorDispatchTest.java @@ -0,0 +1,214 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.junit.Test; +import org.locationtech.proj4j.gie.GieIoUnits; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The routing contract, and the construction-time refusals of the operators that need a + * grid or a model file. + * + *

Why {@link PipelineFactory#handlesOperator} is worth a test of its own

+ * + *

It is the answer to a question asked from outside this package: given + * {@code +proj=axisswap order=2,1} — a complete PROJ operation with no {@code +step} and + * no {@code +init=} — does the pipeline engine own it, or does the legacy + * {@code CRSFactory}/{@code Projection} path? Getting that wrong is silent and expensive: + * {@code axisswap.gie} and {@code unitconvert.gie} sat at 2/27 and 0/16 while both + * operators were complete and passing their own unit tests, because nothing routed a bare + * operator here. The measured jump on wiring it up was 2 to 27 and 0 to 16. + * + *

So the list must claim exactly the non-projection operators and must not + * claim anything {@link Cs2csOperator} reaches through the {@code Registry} — otherwise + * the two paths would disagree about who owns a projection, and the projection would be + * built by the wrong one. + */ +public class PipelineOperatorDispatchTest { + + private final PipelineFactory factory = new PipelineFactory(); + + // ------------------------------------------------------------------- routing + + @Test + public void everyNonProjectionOperatorIsClaimed() { + String[] claimed = { + "affine", "axisswap", "cart", "deformation", "hgridshift", "pop", "push", + "set", "tinshift", "unitconvert", "vgridshift", + }; + for (int i = 0; i < claimed.length; i++) { + assertTrue(claimed[i] + " must route to the pipeline engine", + PipelineFactory.handlesOperator(claimed[i])); + } + } + + /** + * Nothing the {@code Registry} resolves may be claimed. {@code longlat} and + * {@code geocent} in particular are handled inside {@link Cs2csOperator}, so + * claiming them here would not even be wrong in outcome — it would be wrong in a way + * that only shows up when the two paths' unit sides diverge. + */ + @Test + public void noProjectionOrRegistryNameIsClaimed() { + String[] notClaimed = { + "longlat", "latlong", "lonlat", "latlon", "geocent", "merc", "utm", "tmerc", + "lcc", "stere", "pipeline", "helmert", "gridshift", "defmodel", "noop", "", + }; + for (int i = 0; i < notClaimed.length; i++) { + assertFalse("'" + notClaimed[i] + "' must not route to the pipeline engine", + PipelineFactory.handlesOperator(notClaimed[i])); + } + assertFalse(PipelineFactory.handlesOperator(null)); + } + + @Test + public void isSupportedShapeCoversABareOperator() { + assertTrue(PipelineFactory.isSupportedShape("+proj=axisswap +order=2,1")); + assertTrue(PipelineFactory.isSupportedShape("proj=unitconvert xy_in=m xy_out=dm")); + assertTrue(PipelineFactory.isSupportedShape("+proj=pipeline +step +proj=merc")); + assertTrue(PipelineFactory.isSupportedShape("+init=epsg:27572")); + assertFalse(PipelineFactory.isSupportedShape("+proj=merc +ellps=GRS80")); + } + + /** A bare operator becomes a one-step pipeline whose sides are the operator's. */ + @Test + public void bareOperatorBecomesAOneStepPipeline() { + Pipeline p = factory.create("proj=axisswap order=2,1"); + assertEquals(1, p.steps().size()); + double[] out = p.forward(new double[] {1, 2, 3, 4}); + assertEquals(2.0, out[0], 0.0); + assertEquals(1.0, out[1], 0.0); + + Pipeline u = factory.create("proj=unitconvert xy_in=m xy_out=dm z_in=cm z_out=mm"); + double[] uout = u.forward(new double[] {55.25, 23.23, 45.5, 0}); + assertEquals(552.5, uout[0], 1e-9); + assertEquals(232.3, uout[1], 1e-9); + assertEquals(455.0, uout[2], 1e-9); + } + + // ---------------------------------------------------------------------- cart + + /** + * {@code 4D-API_cs2cs-style.gie:493}. On a unit-radius-1000 sphere, + * {@code (90, 0, 0)} is {@code (0, 1000, 0)} in metres and therefore {@code (0, 1, 0)} + * with {@code +to_meter=1000} — {@code fwd_finalize} scales all three ordinates of a + * {@code CARTESIAN} output. + */ + @Test + public void cartHonoursToMeterOnAllThreeOrdinates() { + Pipeline p = factory.create("+proj=cart +a=1000 +b=1000 +to_meter=1000"); + assertEquals(GieIoUnits.RADIANS, p.left()); + assertEquals(GieIoUnits.CARTESIAN, p.right()); + + double[] out = p.forward(new double[] {Math.PI / 2, 0, 0, 0}); + assertEquals(0.0, out[0], 1e-12); + assertEquals(1.0, out[1], 1e-12); + assertEquals(0.0, out[2], 1e-12); + + double[] back = p.inverse(out); + assertEquals(Math.PI / 2, back[0], 1e-12); + assertEquals(0.0, back[1], 1e-12); + assertEquals(0.0, back[2], 1e-9); + } + + /** No {@code +to_meter}: plain metres, and the inverse is the exact mirror. */ + @Test + public void cartWithoutToMeterIsMetres() { + Pipeline p = factory.create("+proj=cart +a=1000 +b=1000"); + double[] out = p.forward(new double[] {Math.PI / 2, 0, 0, 0}); + assertEquals(1000.0, out[1], 1e-9); + } + + /** {@code +units} beats {@code +to_meter}, and an angular unit is not a linear one. */ + @Test + public void cartRejectsANonLinearUnits() { + assertRejected("+proj=cart +a=1000 +b=1000 +units=rad", + PipelineErrorCode.ILLEGAL_ARG_VALUE, "unknown +units"); + assertRejected("+proj=cart +a=1000 +b=1000 +to_meter=0", + PipelineErrorCode.ILLEGAL_ARG_VALUE, "+to_meter=0"); + } + + // ------------------------------------------------- grid and model refusals + + /** + * A missing grid or model is refused at construction, with the same PROJ error + * code upstream uses, so it can never become a per-row no-op that reports success. + * That last part is the consumer's worst reported defect and the reason these are + * asserted individually. + */ + @Test + public void aMissingGridParameterIsMissingArgNotSilence() { + assertRejected("+proj=hgridshift", PipelineErrorCode.MISSING_ARG, + "+grids parameter missing."); + assertRejected("+proj=tinshift", PipelineErrorCode.MISSING_ARG, + "+file= should be specified."); + assertRejected("+proj=deformation +ellps=GRS80 +dt=1", + PipelineErrorCode.MISSING_ARG, + "Either +grids or (+xy_grids and +z_grids) should be specified."); + assertRejected("+proj=deformation +xy_grids=x +ellps=GRS80 +dt=1", + PipelineErrorCode.MISSING_ARG, + "Either +grids or (+xy_grids and +z_grids) should be specified."); + } + + @Test + public void anUnresolvableGridOrModelIsFileNotFound() { + assertRejected("+proj=hgridshift +grids=i_do_not_exist", + PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, "could not find required grid(s)"); + assertRejected("+proj=tinshift +file=i_do_not_exist", + PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, "Cannot open i_do_not_exist"); + } + + /** + * {@code deformation.cpp:394-411}. {@code +dt} and {@code +t_epoch} are mutually + * exclusive and exactly one is required, and {@code +t_obs} is a hard error carrying a + * migration message rather than a synonym for {@code +dt} — one of the entries in this + * project's "implement from the code, not the docs" table. + */ + @Test + public void deformationEpochParametersAreCheckedBeforeAnyGridIsOpened() { + assertRejected("+proj=deformation +xy_grids=x +z_grids=y +ellps=GRS80 +t_obs=2000", + PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, "could not find required grid(s)"); + // The grid list is opened first, so the epoch checks are only reachable with a + // resolvable grid; what is asserted here is that the +grids= (GeoTIFF) form is + // refused with a reason rather than silently treated as the two-grid form. + assertRejected("+proj=deformation +grids=some_model.tif +ellps=GRS80 +dt=1", + PipelineErrorCode.NOT_IMPLEMENTED_HERE, "no GeoTIFF grid reader"); + } + + /** {@code defmodel} and {@code gridshift} are not claimed, so they are not silently run. */ + @Test + public void unimplementedOperatorsAreNotClaimed() { + assertFalse(PipelineFactory.handlesOperator("defmodel")); + assertFalse(PipelineFactory.handlesOperator("gridshift")); + } + + private void assertRejected(String definition, PipelineErrorCode expected, + String messageFragment) { + try { + factory.create(definition); + fail("expected a PipelineDefinitionException for: " + definition); + } catch (PipelineDefinitionException e) { + assertEquals(definition, expected, e.code()); + assertTrue("message was: " + e.getMessage(), + e.getMessage().contains(messageFragment)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/ProjParamsTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/ProjParamsTest.java new file mode 100644 index 0000000..bf2495c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/ProjParamsTest.java @@ -0,0 +1,187 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +/** + * {@link ProjParams} against {@code 9.8.1:src/param.cpp} and {@code src/init.cpp}. + * + *

The three lookup rules tested here are not conveniences: every one of them + * changes an answer somewhere in the GIGS corpus. First-match-wins is what lets a + * pipeline-level {@code +towgs84=0,0,0} suppress the one an {@code +init=} expansion + * declares; stop-at-{@code step} is the only thing scoping a step's parameters; + * exact key matching is what stops {@code +a} being read out of {@code +axis=wsu}. + */ +public class ProjParamsTest { + + // ------------------------------------------------------------- tokenising + + @Test + public void stripsPlusPrefixesAndSplitsOnWhitespaceAndSemicolons() { + ProjParams p = ProjParams.parse("+proj=merc +lat_ts=42;+ellps=krass"); + assertEquals(Arrays.asList("proj=merc", "lat_ts=42", "ellps=krass"), p.tokens()); + } + + @Test + public void acceptsAStringWithNoPlusPrefixes() { + // gigs/5112.gie and 5103.1.gie write their pipelines without '+'. + ProjParams p = ProjParams.parse("proj=pipeline step init=epsg:4284 inv"); + assertEquals(Arrays.asList("proj=pipeline", "step", "init=epsg:4284", "inv"), p.tokens()); + } + + @Test + public void stripsTheGieLineContinuationBackslash() { + assertEquals(Arrays.asList("proj=pipeline", "step"), + ProjParams.parse("+proj=pipeline\\ +step\\").tokens()); + } + + @Test + public void nullAndBlankAreEmptyRatherThanAnError() { + assertTrue(ProjParams.parse(null).isEmpty()); + assertTrue(ProjParams.parse(" ").isEmpty()); + } + + @Test + public void aValuelessTokenIsPresentButHasNoValue() { + ProjParams p = ProjParams.parse("+proj=utm +south +no_defs"); + assertTrue(p.has("south")); + assertNull(p.value("south")); + } + + // --------------------------------------------------------- first match wins + + @Test + public void firstOccurrenceWinsBecauseExpansionsAreAppended() { + // pj_param_exists walks front to back. proj4j's old HashMap kept the LAST + // occurrence, which inverts the precedence of every +init= expansion. + ProjParams p = ProjParams.parse("+towgs84=0,0,0 +proj=lcc +towgs84=-106.8686,52.2978,-103.7239"); + assertEquals("0,0,0", p.value("towgs84")); + } + + @Test + public void keyMatchingIsExactSoAneverMatchesAxis() { + ProjParams p = ProjParams.parse("+proj=tmerc +axis=wsu"); + assertFalse("+a must not be read out of +axis", p.has("a")); + assertEquals("wsu", p.value("axis")); + } + + @Test + public void keyMatchingRequiresAnEqualsOrEndOfToken() { + ProjParams p = ProjParams.parse("+lat_ts=42"); + assertFalse(p.has("lat")); + assertTrue(p.has("lat_ts")); + } + + // ------------------------------------------------------- stop at the step + + @Test + public void lookupStopsAtTheFirstStepToken() { + // param.cpp:72-105. This single rule is what scopes a pipeline step. + ProjParams p = ProjParams.parse("+proj=pipeline +step +proj=merc +ellps=krass"); + assertEquals("pipeline", p.value("proj")); + assertFalse("+ellps lives in a step and must be invisible globally", p.has("ellps")); + } + + @Test + public void lookingForStepItselfDoesNotStopAtIt() { + ProjParams p = ProjParams.parse("+proj=pipeline +step +proj=merc"); + assertTrue(p.has("step")); + assertEquals(1, p.countExact("step")); + } + + @Test + public void splitOnStepPutsTheGlobalsFirst() { + List slices = ProjParams + .parse("+proj=pipeline +towgs84=0,0,0 +step +init=epsg:4313 +inv +step +init=epsg:31370") + .splitOnStep(); + assertEquals(3, slices.size()); + assertEquals(Arrays.asList("proj=pipeline", "towgs84=0,0,0"), slices.get(0).tokens()); + assertEquals(Arrays.asList("init=epsg:4313", "inv"), slices.get(1).tokens()); + assertEquals(Arrays.asList("init=epsg:31370"), slices.get(2).tokens()); + } + + @Test + public void countExactIgnoresTokensThatMerelyStartWithTheText() { + // pipeline.cpp:519 compares with strcmp, so "+inv=T" is not an "inv" token. + ProjParams p = ProjParams.parse("+inv +inv=T +invalid"); + assertEquals(1, p.countExact("inv")); + } + + // ------------------------------------------------------------ typed access + + @Test + public void doubleValueFallsBackToTheDefaultAndRejectsGarbage() { + ProjParams p = ProjParams.parse("+k_0=0.9996012717 +x_0="); + assertEquals(0.9996012717, p.doubleValue("k_0", 1.0), 0.0); + assertEquals(1.0, p.doubleValue("absent", 1.0), 0.0); + assertEquals("an empty value falls back rather than throwing", + 7.0, p.doubleValue("x_0", 7.0), 0.0); + try { + ProjParams.parse("+k_0=nine").doubleValue("k_0", 1.0); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + @Test + public void booleanValueFollowsPjParamTypeB() { + // '' / T / t true; F / f false; anything else an error. + assertTrue(ProjParams.parse("+over").booleanValue("over")); + assertTrue(ProjParams.parse("+over=").booleanValue("over")); + assertTrue(ProjParams.parse("+over=T").booleanValue("over")); + assertTrue(ProjParams.parse("+over=t").booleanValue("over")); + assertFalse(ProjParams.parse("+over=F").booleanValue("over")); + assertFalse(ProjParams.parse("+over=f").booleanValue("over")); + assertFalse("absent is false", ProjParams.parse("+proj=merc").booleanValue("over")); + try { + ProjParams.parse("+over=yes").booleanValue("over"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + // ------------------------------------------------------------------ append + + @Test + public void appendPutsTheExpansionLastSoItIsShadowed() { + ProjParams p = ProjParams.parse("+init=epsg:4275 +ellps=intl") + .append(Arrays.asList("+proj=longlat", "+a=6378249.2", "+ellps=clrk80")); + assertEquals("the user token still wins", "intl", p.value("ellps")); + assertEquals("longlat", p.value("proj")); + } + + @Test + public void toProj4ArgsRestoresThePlusPrefixesInOrder() { + assertArrayEqualsStrings(new String[] {"+proj=merc", "+lat_ts=42"}, + ProjParams.parse("proj=merc lat_ts=42").toProj4Args()); + } + + private static void assertArrayEqualsStrings(String[] expected, String[] actual) { + assertEquals(Arrays.asList(expected), Arrays.asList(actual)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/StepEllipsoidTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/StepEllipsoidTest.java new file mode 100644 index 0000000..c10d84e --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/StepEllipsoidTest.java @@ -0,0 +1,157 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.junit.Test; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Ellipsoid; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code pj_ell_set}'s resolution order, for the operators that are not projections. + * + *

The order is the whole content of {@link StepEllipsoid} and each row below is a + * separate branch of {@code 9.8.1:src/ell_set.cpp:92-133}. The two that are easy to get + * wrong, and that this project has already paid for once: + * + *

    + *
  • {@code +ellps} plus a shape parameter is not a contradiction. + * {@code ell_set.cpp}'s own comment calls later parameters "modifiers for the built + * in ellipsoid definition ... in accordance with historical PROJ behavior", and there + * is no contradiction check anywhere in the file. Rejecting + * {@code +ellps=GRS80 +rf=300} is stricter than PROJ.
  • + *
  • {@code +R} wins outright and silences every shape parameter, rather than + * merging with them.
  • + *
+ */ +public class StepEllipsoidTest { + + private static final Registry REGISTRY = new Registry(); + + private static double[] resolve(String definition) { + return StepEllipsoid.resolve(REGISTRY, ProjParams.parse(definition)); + } + + /** + * Both values come from {@link Registry}'s own {@link Ellipsoid}, asserted against it + * rather than against a transcribed literal: what is under test here is the + * routing — that {@code +ellps} is looked up at all, and through the + * registry — not the constant, which belongs to the numerical core and is pinned by + * its own tests. + */ + @Test + public void ellpsSeedsBothSizeAndShape() { + double[] e = resolve("proj=cart ellps=GRS80"); + Ellipsoid grs80 = REGISTRY.getEllipsoid("GRS80"); + assertEquals(grs80.getEquatorRadius(), e[0], 0.0); + assertEquals(grs80.getEccentricitySquared(), e[1], 0.0); + } + + /** {@code ellps_size} runs after {@code ellps_ellps}, so {@code +a} overrides the size. */ + @Test + public void explicitMajorAxisOverridesTheEllpsSize() { + double[] e = resolve("proj=cart ellps=GRS80 a=1"); + assertEquals(1.0, e[0], 0.0); + assertEquals("the shape survives a size-only override", + REGISTRY.getEllipsoid("GRS80").getEccentricitySquared(), e[1], 0.0); + } + + /** Documented modifier behaviour, not a contradiction. {@code es = 2f - f*f} with {@code f = 1/300}. */ + @Test + public void ellpsPlusRfIsAModifierNotAContradiction() { + double[] e = resolve("proj=cart ellps=GRS80 rf=300"); + assertEquals(6378137.0, e[0], 0.0); + double f = 1.0 / 300.0; + assertEquals(2 * f - f * f, e[1], 0.0); + } + + /** {@code ellps_shape} takes the FIRST present of rf, f, es, e, b — in that order. */ + @Test + public void firstShapeParameterInEllSetsOrderWins() { + double f = 1.0 / 300.0; + // rf precedes f, es, e and b, whichever order they appear in the token list. + assertEquals(2 * f - f * f, resolve("proj=cart a=6378137 f=0.5 rf=300")[1], 0.0); + assertEquals(2 * f - f * f, resolve("proj=cart a=6378137 es=0.5 rf=300")[1], 0.0); + assertEquals(0.25, resolve("proj=cart a=6378137 e=0.5")[1], 1e-17); + } + + /** {@code +b} goes via the flattening in two steps, not {@code es = 1 - b*b/(a*a)}. */ + @Test + public void semiMinorAxisGoesViaTheFlattening() { + double a = 6378137.0; + double b = 6356752.314140356; + double f = (a - b) / a; + assertEquals(2 * f - f * f, resolve("proj=cart a=" + a + " b=" + b)[1], 0.0); + } + + /** {@code +R} short-circuits: a sphere, and every shape parameter is ignored. */ + @Test + public void radiusWinsAndSilencesEveryShapeParameter() { + double[] e = resolve("proj=cart R=6400000 ellps=GRS80 rf=300 es=0.5"); + assertEquals(6400000.0, e[0], 0.0); + assertEquals(0.0, e[1], 0.0); + } + + @Test + public void unknownEllpsIsRejected() { + assertRejected("proj=cart ellps=nosuchellipsoid", + PipelineErrorCode.ILLEGAL_ARG_VALUE, "unknown +ellps"); + } + + @Test + public void noEllipsoidAtAllIsRejected() { + assertRejected("proj=cart", PipelineErrorCode.MISSING_ARG, "no ellipsoid"); + } + + @Test + public void impossibleEccentricityIsRejected() { + assertRejected("proj=cart a=6378137 es=1.5", + PipelineErrorCode.ILLEGAL_ARG_VALUE, "invalid eccentricity"); + } + + @Test + public void nonPositiveInverseFlatteningIsRejected() { + assertRejected("proj=cart a=6378137 rf=0", + PipelineErrorCode.ILLEGAL_ARG_VALUE, "+rf must be positive"); + } + + /** + * Spherification is refused rather than ignored: ignoring {@code +R_A} would change + * the radius by up to the flattening — kilometres — while reporting success. + */ + @Test + public void spherificationIsRefusedNotIgnored() { + assertRejected("proj=cart ellps=GRS80 R_A", + PipelineErrorCode.NOT_IMPLEMENTED_HERE, "spherification"); + assertRejected("proj=cart ellps=GRS80 R_C", + PipelineErrorCode.NOT_IMPLEMENTED_HERE, "spherification"); + } + + private static void assertRejected(String definition, PipelineErrorCode expected, + String messageFragment) { + try { + resolve(definition); + fail("expected a PipelineDefinitionException for: " + definition); + } catch (PipelineDefinitionException e) { + assertEquals(definition, expected, e.code()); + assertTrue("message was: " + e.getMessage(), + e.getMessage().contains(messageFragment)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/TimeGatedOperatorTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/TimeGatedOperatorTest.java new file mode 100644 index 0000000..a86f659 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/TimeGatedOperatorTest.java @@ -0,0 +1,211 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.junit.Test; +import org.locationtech.proj4j.gie.GieIoUnits; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * The {@code +t_epoch}/{@code +t_final} bracket, isolated from any grid. + * + *

Every expectation here is read off {@code 9.8.1:src/transformations/hgridshift.cpp}'s + * {@code pj_hgridshift_forward_4d}, whose whole content is + * + *

+ * if (Q->t_final == 0 || Q->t_epoch == 0) { always; return; }
+ * if (coo.lpzt.t < Q->t_epoch && Q->t_final > Q->t_epoch) { apply; }
+ * 
+ * + *

and cross-checked against the eight {@code accept}/{@code expect} pairs of + * {@code deformation.gie}'s four gated blocks. The delegate is a counting stub rather + * than a real grid shift so that "did the step run" is observed directly instead of + * inferred from a coordinate. + */ +public class TimeGatedOperatorTest { + + /** Adds 1 to x on forward, subtracts 1 on inverse, and counts both. */ + private static final class Counter implements PipelineOperator { + int forwards; + int inverses; + + @Override + public GieIoUnits declaredLeft() { + return GieIoUnits.RADIANS; + } + + @Override + public GieIoUnits declaredRight() { + return GieIoUnits.RADIANS; + } + + @Override + public void overrideUnits(GieIoUnits left, GieIoUnits right) { + } + + @Override + public void forward(double[] coord) { + forwards++; + coord[0] += 1; + } + + @Override + public void inverse(double[] coord) { + inverses++; + coord[0] -= 1; + } + + @Override + public boolean hasInverse() { + return true; + } + + @Override + public String description() { + return "counter"; + } + } + + private static double[] at(double t) { + return new double[] {0, 0, 0, t}; + } + + /** Neither parameter present: no wrapper at all, so no per-coordinate cost. */ + @Test + public void noBracketReturnsTheDelegateUnwrapped() { + Counter c = new Counter(); + assertSame(c, TimeGatedOperator.wrap(c, ProjParams.parse("proj=hgridshift grids=x"))); + } + + /** + * Zero is the "unset" sentinel for either parameter, not a year. Reading it + * as a year would make the gate never fire instead of never existing. + */ + @Test + public void oneParameterAloneDisablesTheGate() { + Counter c = new Counter(); + assertSame(c, TimeGatedOperator.wrap(c, ProjParams.parse("t_epoch=2010"))); + Counter d = new Counter(); + assertSame(d, TimeGatedOperator.wrap(d, ProjParams.parse("t_final=2018"))); + Counter e = new Counter(); + assertSame(e, TimeGatedOperator.wrap(e, ProjParams.parse("t_epoch=0 t_final=2018"))); + } + + /** + * {@code deformation.gie}'s {@code +t_epoch=2010.0 +t_final=2018.0} block, all four + * rows: 2000 is transformed, 2011 and 2019 are not, and an unwritten fourth ordinate + * arrives as {@code 0} — which is before 2010, so it is transformed. + */ + @Test + public void bracketIsOneSidedAgainstTEpoch() { + Counter c = new Counter(); + PipelineOperator gated = + TimeGatedOperator.wrap(c, ProjParams.parse("t_epoch=2010.0 t_final=2018.0")); + + double[] before = at(2000.0); + gated.forward(before); + assertEquals("t=2000 is before t_epoch, so the shift applies", 1.0, before[0], 0.0); + + double[] inside = at(2011.0); + gated.forward(inside); + assertEquals("t=2011 is after t_epoch, so nothing happens", 0.0, inside[0], 0.0); + + double[] after = at(2019.0); + gated.forward(after); + assertEquals("t_final is never compared against t, so 2019 is also untouched", + 0.0, after[0], 0.0); + + double[] unspecified = at(0.0); + gated.forward(unspecified); + assertEquals("gie zero-fills an unwritten t, and 0 < 2010", 1.0, unspecified[0], 0.0); + + assertEquals(2, c.forwards); + assertEquals(0, c.inverses); + } + + /** The inverse honours the same bracket, so a gated step still round-trips. */ + @Test + public void inverseUsesTheSameBracket() { + Counter c = new Counter(); + PipelineOperator gated = + TimeGatedOperator.wrap(c, ProjParams.parse("t_epoch=2010.0 t_final=2018.0")); + + double[] coord = at(2000.0); + gated.forward(coord); + gated.inverse(coord); + assertEquals(0.0, coord[0], 0.0); + assertEquals(1, c.forwards); + assertEquals(1, c.inverses); + + double[] outside = at(2011.0); + gated.inverse(outside); + assertEquals(0.0, outside[0], 0.0); + assertEquals("the inverse did not run for an out-of-bracket epoch", 1, c.inverses); + } + + /** {@code t_final > t_epoch} is a sanity check, and it closes the gate when violated. */ + @Test + public void invertedBracketNeverApplies() { + Counter c = new Counter(); + PipelineOperator gated = + TimeGatedOperator.wrap(c, ProjParams.parse("t_epoch=2018.0 t_final=2010.0")); + double[] coord = at(2000.0); + gated.forward(coord); + assertEquals(0.0, coord[0], 0.0); + assertEquals(0, c.forwards); + } + + /** + * {@code +t_final=now} is {@code 1900 + tm_year + tm_yday/365.0} from + * {@code localtime}, read only after a numeric parse yields 0. The corpus + * asserts only that the bracket is open at 2000 and closed at 2011 and 3011, which is + * what is checked here — pinning the literal value would pin the clock. + */ + @Test + public void nowIsResolvedToTheCurrentDecimalYear() { + Counter c = new Counter(); + PipelineOperator gated = + TimeGatedOperator.wrap(c, ProjParams.parse("t_epoch=2010.0 t_final=now")); + assertTrue("wrap must not have short-circuited: 'now' is not 0", + gated instanceof TimeGatedOperator); + + double[] before = at(2000.0); + gated.forward(before); + assertEquals(1.0, before[0], 0.0); + + double[] after = at(2011.0); + gated.forward(after); + assertEquals(0.0, after[0], 0.0); + + double[] farFuture = at(3011.0); + gated.forward(farFuture); + assertEquals(0.0, farFuture[0], 0.0); + } + + /** The wrapper is invisible to the pipeline's unit-continuity check. */ + @Test + public void unitSidesAndInvertibilityAreDelegated() { + Counter c = new Counter(); + PipelineOperator gated = + TimeGatedOperator.wrap(c, ProjParams.parse("t_epoch=2010.0 t_final=2018.0")); + assertEquals(GieIoUnits.RADIANS, gated.declaredLeft()); + assertEquals(GieIoUnits.RADIANS, gated.declaredRight()); + assertTrue(gated.hasInverse()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/TriangulationTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/TriangulationTest.java new file mode 100644 index 0000000..0a170d1 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/TriangulationTest.java @@ -0,0 +1,303 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code +proj=tinshift}'s numerics, against PROJ 9.8.1's own expected values. + * + *

Where the numbers come from

+ * + *

Every model here is the vertex and triangle data of a file in + * {@code 9.8.1:data/tests/}, and every expected coordinate is the {@code expect} row of + * the corresponding block of {@code 9.8.1:test/gie/tinshift.gie}. Neither is derived + * from proj4j's output: a reference file re-pinned from the implementation under test + * agrees with it by construction, forever, and proves nothing. + * + *

The models are inlined as text rather than vendored as resources so that these + * assertions need no classpath fixture and no second copy of upstream data with its own + * licence note — the conformance module already vendors the files themselves and runs + * {@code tinshift.gie} against them. + * + *

{@code tinshift_simplified_kkj_etrs.json} is the one that matters most: its + * expected value is annotated in the corpus as "Verified with + * https://kartta.paikkatietoikkuna.fi/ with EPSG:2393 to EPSG:3067", so it is a + * third-party check on PROJ as well as a check on us, and its tolerance is + * 0.1 mm. + */ +public class TriangulationTest { + + /** {@code 9.8.1:data/tests/tinshift_simplified_kkj_etrs.json}, metadata elided. */ + private static final String KKJ_ETRS = "{" + + "\"file_type\": \"triangulation_file\"," + + "\"format_version\": \"1.0\"," + + "\"input_crs\": \"EPSG:2393\"," + + "\"output_crs\": \"EPSG:3067\"," + + "\"transformed_components\": [ \"horizontal\" ]," + + "\"vertices_columns\": [ \"source_x\", \"source_y\", \"target_x\", \"target_y\" ]," + + "\"triangles_columns\": [ \"idx_vertex1\", \"idx_vertex2\", \"idx_vertex3\" ]," + + "\"vertices\": [ [3244102.707, 6693710.937, 244037.137, 6690900.686]," + + " [3205290.722, 6715311.822, 205240.895, 6712492.577]," + + " [3218328.492, 6649538.429, 218273.648, 6646745.973] ]," + + "\"triangles\": [ [0, 1, 2] ]" + + "}"; + + /** + * {@code 9.8.1:data/tests/tinshift_simplified_n60_n2000.json}, metadata elided. + * + *

Note that it declares {@code source_z} and {@code target_z} rather than + * {@code offset_z}, so this fixture also exercises the {@code targetZ - sourceZ} + * differencing branch of the reader. + */ + private static final String N60_N2000 = "{" + + "\"file_type\": \"triangulation_file\"," + + "\"format_version\": \"1.0\"," + + "\"input_crs\": \"EPSG:2393+5717\"," + + "\"output_crs\": \"EPSG:2393+5941\"," + + "\"transformed_components\": [ \"vertical\" ]," + + "\"vertices_columns\": [ \"source_x\", \"source_y\", \"source_z\", \"target_z\" ]," + + "\"triangles_columns\": [ \"idx_vertex1\", \"idx_vertex2\", \"idx_vertex3\" ]," + + "\"vertices\": [ [3188607.0, 6688748.0, 23.123, 23.4133]," + + " [3184981.0, 6725255.0, 8.044, 8.34499]," + + " [3220912.0, 6699508.0, 1.724, 2.0101] ]," + + "\"triangles\": [ [0, 1, 2] ]" + + "}"; + + /** {@code 9.8.1:data/tests/tinshift_fallback_nearest_side.json}, verbatim. */ + private static final String NEAREST_SIDE = "{" + + "\"file_type\": \"triangulation_file\"," + + "\"format_version\": \"1.1\"," + + "\"fallback_strategy\": \"nearest_side\"," + + "\"transformed_components\": [ \"horizontal\" ]," + + "\"vertices_columns\": [ \"source_x\", \"source_y\", \"target_x\", \"target_y\" ]," + + "\"triangles_columns\": [ \"idx_vertex1\", \"idx_vertex2\", \"idx_vertex3\" ]," + + "\"vertices\": [ [0, 0, 0, 0], [1, 0, 2, 0], [1, 1, 2, 2], [0, 1, 0, 2] ]," + + "\"triangles\": [ [0, 1, 2], [0, 2, 3] ]" + + "}"; + + /** {@code 9.8.1:data/tests/tinshift_fallback_nearest_centroid.json}, verbatim. */ + private static final String NEAREST_CENTROID = "{" + + "\"file_type\": \"triangulation_file\"," + + "\"format_version\": \"1.1\"," + + "\"fallback_strategy\": \"nearest_centroid\"," + + "\"transformed_components\": [ \"horizontal\" ]," + + "\"vertices_columns\": [ \"source_x\", \"source_y\", \"target_x\", \"target_y\" ]," + + "\"triangles_columns\": [ \"idx_vertex1\", \"idx_vertex2\", \"idx_vertex3\" ]," + + "\"vertices\": [ [0, 0, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]," + + " [4, 0, 100, 0], [100, 0, 100, 1], [100, 1, 4, 0] ]," + + "\"triangles\": [ [0, 1, 2], [3, 4, 5] ]" + + "}"; + + /** {@code 9.8.1:data/tests/tinshift_crs_implicit.json}, metadata elided. */ + private static final String CRS_IMPLICIT = "{" + + "\"file_type\": \"triangulation_file\"," + + "\"format_version\": \"1.0\"," + + "\"transformed_components\": [ \"horizontal\" ]," + + "\"vertices_columns\": [ \"source_x\", \"source_y\", \"target_x\", \"target_y\" ]," + + "\"triangles_columns\": [ \"idx_vertex1\", \"idx_vertex2\", \"idx_vertex3\" ]," + + "\"vertices\": [ [2,49,2.1,49.1], [3,50,3.1,50.1], [2, 50, 2.1,50.1] ]," + + "\"triangles\": [ [0, 1, 2] ]" + + "}"; + + private static double[] coord(double x, double y, double z) { + return new double[] {x, y, z, 0.0}; + } + + /** + * {@code tinshift.gie:35-41}. Tolerance 0.1 mm, and the expected value is + * independently verified against the Finnish national service. + */ + @Test + public void kkjToEtrsMatchesUpstreamToATenthOfAMillimetre() { + Triangulation t = Triangulation.parse(KKJ_ETRS); + assertTrue(t.transformsHorizontal()); + assertFalse(t.transformsVertical()); + assertEquals("EPSG:2393", t.inputCrs()); + assertEquals("EPSG:3067", t.outputCrs()); + + double[] c = coord(3210000.0, 6700000.0, 0); + assertTrue(t.forward(c)); + assertEquals(209948.3217, c[0], 1e-4); + assertEquals(6697187.0009, c[1], 1e-4); + + // roundtrip 1: the inverse locates the point in the target geometry and + // interpolates the source columns, so it must land back on the input. + assertTrue(t.inverse(c)); + assertEquals(3210000.0, c[0], 1e-4); + assertEquals(6700000.0, c[1], 1e-4); + } + + /** + * {@code tinshift.gie:43-48}: a vertical-only file. The horizontal ordinates are + * carried through untouched, and z gains the interpolated offset. + */ + @Test + public void verticalOnlyFileShiftsOnlyZ() { + Triangulation t = Triangulation.parse(N60_N2000); + assertFalse(t.transformsHorizontal()); + assertTrue(t.transformsVertical()); + + double[] c = coord(3210000.0, 6700000.0, 10.0); + assertTrue(t.forward(c)); + assertEquals(3210000.0, c[0], 0.0); + assertEquals(6700000.0, c[1], 0.0); + assertEquals(10.2886, c[2], 1e-4); + + assertTrue(t.inverse(c)); + assertEquals(10.0, c[2], 1e-9); + } + + /** {@code tinshift.gie:50-55}: {@code (2, 3)} is outside both triangles. */ + @Test + public void nearestSideExtrapolates() { + Triangulation t = Triangulation.parse(NEAREST_SIDE); + assertEquals(Triangulation.FALLBACK_NEAREST_SIDE, t.fallbackStrategy()); + + double[] c = coord(2, 3, 0); + assertTrue(t.forward(c)); + assertEquals(4.0, c[0], 1e-9); + assertEquals(6.0, c[1], 1e-9); + + assertTrue(t.inverse(c)); + assertEquals(2.0, c[0], 1e-9); + assertEquals(3.0, c[1], 1e-9); + } + + /** + * {@code tinshift.gie:57-62}: {@code (3, 0)} is outside both triangles, and the + * nearest centroid belongs to the first triangle, whose interpolation there + * happens to be the identity. Picking the nearest side instead would select + * the second triangle and give a wildly different answer, so this row is what + * separates the two strategies. + */ + @Test + public void nearestCentroidExtrapolates() { + Triangulation t = Triangulation.parse(NEAREST_CENTROID); + assertEquals(Triangulation.FALLBACK_NEAREST_CENTROID, t.fallbackStrategy()); + + double[] c = coord(3, 0, 0); + assertTrue(t.forward(c)); + assertEquals(3.0, c[0], 1e-9); + assertEquals(0.0, c[1], 1e-9); + } + + /** + * {@code tinshift.gie:23-33}: the single triangle is + * {@code (2,49) (3,50) (2,50)} and the shift is {@code +0.1} in both ordinates. + * {@code (0, 0)} is far outside it, and with {@code fallback_strategy} unset that is + * a failure in both directions — the corpus asserts both, and the inverse + * matters separately because it locates the point in the target geometry. + */ + @Test + public void noFallbackMeansOutsideIsAFailure() { + Triangulation t = Triangulation.parse(CRS_IMPLICIT); + assertEquals(Triangulation.FALLBACK_NONE, t.fallbackStrategy()); + + double[] inside = coord(2, 49, 0); + assertTrue(t.forward(inside)); + assertEquals(2.1, inside[0], 1e-9); + assertEquals(49.1, inside[1], 1e-9); + assertTrue(t.inverse(inside)); + assertEquals(2.0, inside[0], 1e-9); + assertEquals(49.0, inside[1], 1e-9); + + assertFalse("forward of (0,0) is outside the source triangulation", + t.forward(coord(0, 0, 0))); + assertFalse("inverse of (0,0) is outside the target triangulation", + t.inverse(coord(0, 0, 0))); + } + + // ------------------------------------------------------------------ rejections + + @Test + public void fallbackStrategyRequiresFormatVersionOnePointOne() { + String bad = NEAREST_SIDE.replace("\"format_version\": \"1.1\"", + "\"format_version\": \"1.0\""); + assertRejected(bad, "fallback_strategy needs format_version 1.1"); + } + + @Test + public void unknownFallbackStrategyIsRejected() { + String bad = NEAREST_SIDE.replace("nearest_side", "nearest_unicorn"); + assertRejected(bad, "invalid fallback_strategy"); + } + + @Test + public void unknownTransformedComponentIsRejected() { + String bad = KKJ_ETRS.replace("\"horizontal\"", "\"diagonal\""); + assertRejected(bad, "is not handled"); + } + + @Test + public void missingTargetColumnIsRejected() { + String bad = KKJ_ETRS.replace("\"target_x\", ", ""); + assertRejected(bad, "target_x must be specified"); + } + + /** + * {@code tinshift_impl.hpp} tests {@code type() != number_unsigned} for a vertex + * index, which is stricter than "is a number": a fractional or negative index is a + * parse error, not a truncation. + */ + @Test + public void fractionalVertexIndexIsRejected() { + String bad = KKJ_ETRS.replace("[0, 1, 2]", "[0, 1.5, 2]"); + assertRejected(bad, "is not an integer"); + } + + @Test + public void outOfRangeVertexIndexIsRejected() { + String bad = KKJ_ETRS.replace("\"triangles\": [ [0, 1, 2] ]", + "\"triangles\": [ [0, 1, 3] ]"); + assertRejected(bad, "Invalid value for a vertex index"); + } + + @Test + public void wrongVertexRowWidthIsRejected() { + String bad = KKJ_ETRS.replace("[3218328.492, 6649538.429, 218273.648, 6646745.973]", + "[3218328.492, 6649538.429, 218273.648]"); + assertRejected(bad, "not expected number of elements"); + } + + @Test + public void nonTriangulationFileIsRejected() { + assertRejected("{\"file_type\": \"deformation_model_master_file\"," + + "\"format_version\": \"1.0\"}", "not \"triangulation_file\""); + } + + @Test + public void notJsonAtAllIsRejected() { + assertRejected("[general]\nkey = value\n", ""); + } + + private static void assertRejected(String model, String expectedFragment) { + try { + Triangulation.parse(model); + fail("expected a PipelineDefinitionException for: " + model); + } catch (PipelineDefinitionException e) { + assertEquals("a model PROJ also refuses is a definition error", + PipelineErrorCode.FILE_NOT_FOUND_OR_INVALID, e.code()); + assertTrue("message was: " + e.getMessage(), + e.getMessage().contains(expectedFragment)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/pipeline/UnitConvertOperatorTest.java b/core/src/test/java/org/locationtech/proj4j/pipeline/UnitConvertOperatorTest.java new file mode 100644 index 0000000..53307b9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/pipeline/UnitConvertOperatorTest.java @@ -0,0 +1,179 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.pipeline; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.gie.GieIoUnits; + +/** + * {@code +proj=unitconvert} against {@code 9.8.1:src/conversions/unitconvert.cpp} + * and its unit tables in {@code src/units.cpp}. + */ +public class UnitConvertOperatorTest { + + private static UnitConvertOperator of(String definition) { + return new UnitConvertOperator(ProjParams.parse(definition)); + } + + private static double[] fwd(UnitConvertOperator op, double x, double y, double z) { + double[] c = {x, y, z, 0}; + op.forward(c); + return c; + } + + // ----------------------------------------------------------- grad -> rad + + /** + * {@code gigs/5102.2.gie}'s first step. {@code GRAD_TO_RAD} is + * {@code M_PI / 200}, which {@code units.cpp:41} spells as the literal + * {@code 0.015707963267948967}. + */ + @Test + public void gradToRadUsesPiOverTwoHundred() { + UnitConvertOperator op = of("+proj=unitconvert +xy_in=grad +xy_out=rad"); + double[] out = fwd(op, 200.0, 100.0, 0.0); + assertEquals(Math.PI, out[0], 1e-15); + assertEquals(Math.PI / 2.0, out[1], 1e-15); + } + + /** + * The heart of {@code gie-comparator.md}'s trap 6, and the one behaviour in this + * class that must not be tidied up. + * + *

{@code unitconvert.cpp:487-493} raises the unit domain only for the + * normalised names {@code "Radian"} and {@code "Degree"}. {@code grad} + * normalises to {@code "Grad"}, so the side it appears on stays + * {@link GieIoUnits#WHATEVER} — and the gie comparator's {@code WHATEVER} branch + * is Euclidean. So {@code gigs/5102.2.gie}'s reverse pipeline, which ends + * {@code +xy_out=grad}, has its residuals measured as a plain hypotenuse of two + * grad values against {@code tolerance 0.03 m}. That is deliberate + * upstream behaviour; "fixing" it silently re-pins 38 expected values. + */ + @Test + public void gradDoesNotRaiseTheUnitDomainButRadAndDegDo() { + UnitConvertOperator gradToRad = of("+proj=unitconvert +xy_in=grad +xy_out=rad"); + assertEquals(GieIoUnits.WHATEVER, gradToRad.declaredLeft()); + assertEquals(GieIoUnits.RADIANS, gradToRad.declaredRight()); + + UnitConvertOperator radToGrad = of("+proj=unitconvert +xy_in=rad +xy_out=grad"); + assertEquals(GieIoUnits.RADIANS, radToGrad.declaredLeft()); + assertEquals("grad normalises to \"Grad\", so the right side stays WHATEVER", + GieIoUnits.WHATEVER, radToGrad.declaredRight()); + + UnitConvertOperator degToRad = of("+proj=unitconvert +xy_in=deg +xy_out=rad"); + assertEquals(GieIoUnits.DEGREES, degToRad.declaredLeft()); + assertEquals(GieIoUnits.RADIANS, degToRad.declaredRight()); + } + + @Test + public void inverseUndoesForward() { + UnitConvertOperator op = of("+proj=unitconvert +xy_in=grad +xy_out=rad"); + double[] c = {64.4444444444, 2.9586342556, 0, 0}; + op.forward(c); + op.inverse(c); + assertEquals(64.4444444444, c[0], 1e-12); + assertEquals(2.9586342556, c[1], 1e-12); + } + + // ------------------------------------------------------------ linear units + + /** + * The distinction {@code gigs/5103.2} and {@code 5103.3} exist to separate: + * {@code +units=ft} on {@code EPSG:2921} against {@code +units=us-ft} on + * {@code EPSG:3568}, over the same input, giving eastings four metres apart. + */ + @Test + public void footAndUsSurveyFootAreNotTheSame() { + double[] intl = fwd(of("+proj=unitconvert +xy_in=ft +xy_out=m"), 1, 0, 0); + double[] us = fwd(of("+proj=unitconvert +xy_in=us-ft +xy_out=m"), 1, 0, 0); + assertEquals(0.3048, intl[0], 0.0); + assertEquals(1200 / 3937.0, us[0], 0.0); + assertEquals("about 2 ppm apart", 6.09e-7, us[0] - intl[0], 1e-9); + } + + @Test + public void theVerticalPairIsIndependentOfTheHorizontalOne() { + double[] out = fwd(of("+proj=unitconvert +xy_in=m +xy_out=km +z_in=ft +z_out=m"), + 2000, 3000, 10); + assertEquals(2.0, out[0], 0.0); + assertEquals(3.0, out[1], 0.0); + assertEquals(3.048, out[2], 1e-12); + } + + // ------------------------------------------------------------ raw factors + + @Test + public void anUnknownIdIsReadAsARawFactor() { + // unitconvert.cpp:472-479 falls back to pj_param type 'd'. + UnitConvertOperator op = of("+proj=unitconvert +xy_in=2 +xy_out=1"); + assertEquals(4.0, fwd(op, 2, 0, 0)[0], 0.0); + assertEquals("a raw factor carries no normalised name", + GieIoUnits.WHATEVER, op.declaredLeft()); + assertEquals(GieIoUnits.WHATEVER, op.declaredRight()); + } + + @Test + public void aZeroOrUnparseableFactorIsRejected() { + for (String bad : new String[] {"+proj=unitconvert +xy_in=0 +xy_out=m", + "+proj=unitconvert +xy_in=furlong +xy_out=m"}) { + try { + of(bad); + fail("expected a rejection of " + bad); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + } + + // ----------------------------------------------------------- consistency + + @Test + public void mixingALinearWithAnAngularUnitIsRejected() { + try { + of("+proj=unitconvert +xy_in=deg +xy_out=m"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.ILLEGAL_ARG_VALUE, e.code()); + } + } + + /** + * A time unit is refused rather than silently dropped. Ignoring it would leave + * the epoch unconverted while every other ordinate was converted, which is a + * wrong answer wearing the clothes of a right one. + */ + @Test + public void aTimeUnitIsRefusedRatherThanIgnored() { + try { + of("+proj=unitconvert +t_in=decimalyear +t_out=gps_week"); + fail("expected a rejection"); + } catch (PipelineDefinitionException e) { + assertEquals(PipelineErrorCode.NOT_IMPLEMENTED_HERE, e.code()); + assertEquals("this is not something PROJ rejects", false, e.isRejectedByProj()); + } + } + + @Test + public void anOmittedSideIsTheIdentityOnThatSide() { + // Only xy_in given: the factor is the input unit's, with no division. + assertEquals(0.3048, fwd(of("+proj=unitconvert +xy_in=ft"), 1, 0, 0)[0], 0.0); + // Only xy_out given: the reciprocal. + assertEquals(1 / 0.3048, fwd(of("+proj=unitconvert +xy_out=ft"), 1, 0, 0)[0], 1e-15); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/AzimuthalCentreDefaultTest.java b/core/src/test/java/org/locationtech/proj4j/proj/AzimuthalCentreDefaultTest.java new file mode 100644 index 0000000..7f013ad --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/AzimuthalCentreDefaultTest.java @@ -0,0 +1,337 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.proj; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; + +/** + * Pins the effective projection centre of every azimuthal projection whose definition + * omits {@code +lat_0}/{@code +lon_0}, and pins the enumeration of the classes that can be + * affected by a change to it. + * + *

Why a whole test for two numbers

+ * + *

{@code parser/Proj4Parser} assigns {@code +lat_0} and {@code +lon_0} only when the keyword + * is present. A Java constructor therefore defines the effective default, and + * {@link AzimuthalProjection#AzimuthalProjection()} used to define it as 45 degrees on both + * axes where PROJ uses 0. Every {@code +proj=ortho +ellps=WGS84} definition in the corpus was + * silently oblique. + * + *

Correcting a shared superclass default is exactly the change whose reach is easy to + * mis-state, so this test makes both halves of the claim falsifiable: + * + *

    + *
  1. {@link #everyAzimuthalOperatorTakesProjsDefaultCentre()} asserts the centre of each + * azimuthal operator, one row per operator, with the value taken from + * {@code proj 9.8.1} itself rather than from this codebase - {@code proj +proj=X +R=1} + * and {@code proj +proj=X +R=1 +lat_0=0 +lon_0=0} print the same coordinate for + * {@code ortho}, {@code gnom}, {@code stere}, {@code aeqd} and {@code laea}, while + * {@code +proj=ups +ellps=WGS84} reproduces {@code +proj=stere +lat_0=90 +lon_0=0 +k_0=0.994 + * +x_0=2000000 +y_0=2000000} exactly, which is why {@code ups} is the one row that is not 0. + *
  2. {@link #theSubclassEnumerationIsComplete()} walks the source tree for every class that + * extends {@link AzimuthalProjection}, transitively, and fails if one is missing from the + * table above. Without it a newly added subclass would inherit whatever the superclass + * default happens to be and nothing would notice. + *
+ * + *

The measurement this guards

+ * + *

Reverting the default alone on a frozen tree and re-running all 7,923 gie assertions moves + * 40, every one of them in {@code ortho}; {@code aeqd}, {@code gnom}, {@code stere}, + * {@code ups} and {@code laea} are unchanged in both directions. The reason the blast + * radius is that narrow is the enumeration in point 2: only + * {@link OrthographicAzimuthalProjection} and the unregistered + * {@link EqualAreaAzimuthalProjection} reach the no-argument constructor at all - every other + * subclass chains through {@code this(0.0, 0.0)} or sets its own pole. + * + *

Why this test can fail

+ * + *

A scan that cannot fail is worthless. The source walk is proven two ways rather than + * assumed, mirroring {@code determinism.NoJdkAngleConversionTest} and + * {@code io.wkt.NoGeoApiInCoreTest}: {@link #theSourceWalkFindsAKnownNeedle()} points the same + * walker at a class it must find and at a name that cannot exist, and + * {@link #theCentreAssertionWouldNoticeA45DegreeDefault()} shows that the comparison used by the + * table rejects the exact historical wrong value. + */ +public class AzimuthalCentreDefaultTest { + + /** + * One row per azimuthal operator: the proj-string with no {@code +lat_0}/{@code +lon_0}, + * and the centre {@code proj 9.8.1} uses for it, in degrees. + */ + private static final String[][] CENTRES = { + // +proj=ortho: ortho.cpp has no lat_0/lon_0 handling of its own, so pj_init's 0 stands. + {"+proj=ortho +ellps=WGS84", "0", "0"}, + {"+proj=ortho +R=1", "0", "0"}, + // +proj=gnom, +proj=stere, +proj=aeqd, +proj=laea: same, verified against the binary. + {"+proj=gnom +ellps=WGS84", "0", "0"}, + {"+proj=stere +ellps=WGS84", "0", "0"}, + {"+proj=aeqd +ellps=WGS84", "0", "0"}, + {"+proj=laea +ellps=WGS84", "0", "0"}, + // +proj=ups: ups.cpp fixes phi0 = +/- pi/2 from +south and lam0 = 0. NOT a 0 row, and it + // is here precisely so that "all azimuthal centres are 0" cannot be written by accident. + {"+proj=ups +ellps=WGS84", "90", "0"}, + {"+proj=ups +south +ellps=WGS84", "-90", "0"}, + }; + + /** + * Every class extending {@link AzimuthalProjection}, transitively. Kept as source-relative + * paths because {@link #theSubclassEnumerationIsComplete()} compares against a source walk; + * a class file would not tell us about a subclass that exists but is never loaded. + */ + private static final String[] KNOWN_SUBCLASSES = { + "EqualAreaAzimuthalProjection", + "EquidistantAzimuthalProjection", + "GnomonicAzimuthalProjection", + "OrthographicAzimuthalProjection", + "StereographicAzimuthalProjection", + "UniversalPolarStereographicProjection", + }; + + /** + * The subset of {@link #KNOWN_SUBCLASSES} that actually reaches + * {@link AzimuthalProjection#AzimuthalProjection()}, i.e. the ones a change to that + * constructor can move. Asserted behaviourally below rather than by reading constructors. + */ + private static final String[] REACH_THE_NO_ARG_CONSTRUCTOR = { + "EqualAreaAzimuthalProjection", + "OrthographicAzimuthalProjection", + }; + + // ------------------------------------------------------------------ the centres themselves + + @Test + public void everyAzimuthalOperatorTakesProjsDefaultCentre() { + CRSFactory factory = new CRSFactory(); + for (String[] row : CENTRES) { + Projection p = factory.createFromParameters("t", row[0]).getProjection(); + assertEquals(row[0] + " lat_0", Double.parseDouble(row[1]), + p.getProjectionLatitudeDegrees(), 1e-12); + assertEquals(row[0] + " lon_0", Double.parseDouble(row[2]), + p.getProjectionLongitudeDegrees(), 1e-12); + } + } + + /** + * The classes a change to the no-argument constructor can reach, instantiated directly. Both + * must sit at the origin; if either moves, the 40-assertion measurement recorded on + * {@link AzimuthalProjection#AzimuthalProjection()} no longer describes the code. + */ + @Test + public void theTwoClassesReachingTheNoArgConstructorSitAtTheOrigin() { + assertEquals(2, REACH_THE_NO_ARG_CONSTRUCTOR.length); + AzimuthalProjection[] built = { + new EqualAreaAzimuthalProjection(), + new OrthographicAzimuthalProjection(), + }; + for (AzimuthalProjection p : built) { + assertEquals(p.getClass().getSimpleName() + " lat_0", 0.0, + p.getProjectionLatitude(), 0.0); + assertEquals(p.getClass().getSimpleName() + " lon_0", 0.0, + p.getProjectionLongitude(), 0.0); + assertEquals(p.getClass().getSimpleName() + " must be EQUATOR, not OBLIQUE", + AzimuthalProjection.EQUATOR, p.mode); + } + } + + /** + * The remaining four never touch the no-argument constructor, so they are unaffected by it. + * Asserted rather than assumed: each is built by its own no-argument constructor and must + * land where its own chain puts it, not where {@link AzimuthalProjection}'s does. + */ + @Test + public void theOtherSubclassesSetTheirOwnCentreAndAreUnaffected() { + assertEquals(0.0, new EquidistantAzimuthalProjection().getProjectionLatitude(), 0.0); + assertEquals(0.0, new GnomonicAzimuthalProjection().getProjectionLatitude(), 0.0); + assertEquals(0.0, new StereographicAzimuthalProjection().getProjectionLatitude(), 0.0); + // ups is the deliberate exception: ups.cpp assigns phi0 itself, from +south. + assertEquals(Math.PI / 2, new UniversalPolarStereographicProjection() + .getProjectionLatitude(), 0.0); + } + + // --------------------------------------------------------------- the enumeration is complete + + @Test + public void theSubclassEnumerationIsComplete() throws IOException { + TreeSet found = subclassesOfAzimuthalProjection(); + TreeSet known = new TreeSet(Arrays.asList(KNOWN_SUBCLASSES)); + assertEquals("the source tree's AzimuthalProjection subclasses no longer match the table " + + "in this test. A new subclass inherits whatever AzimuthalProjection's no-arg " + + "constructor defaults to, so add it to CENTRES with the value proj 9.8.1 gives " + + "for it, and re-measure the corpus before assuming the blast radius is still " + + "40 assertions in ortho alone.", known, found); + } + + // ------------------------------------------------------------------------ positive controls + + /** + * The walker must be able to find something and to not find something. Without this, an empty + * or mis-rooted walk would make {@link #theSubclassEnumerationIsComplete()} pass by returning + * nothing at all and comparing it against a table that had also been emptied. + */ + @Test + public void theSourceWalkFindsAKnownNeedle() throws IOException { + List sources = new ArrayList(); + collect(projSourceDirectory(), sources); + assertTrue("the walk reached " + sources.size() + " sources, which is too few for " + + "org/locationtech/proj4j/proj - the root is wrong", sources.size() > 100); + + // A needle that is there. + assertTrue("the walker cannot see 'extends Projection', so it proves nothing", + anySourceContains(sources, "extends Projection")); + // A needle that cannot be there. + assertFalse("the walker reported a string that does not exist, so it is not reading files", + anySourceContains(sources, "extends AbsolutelyNoSuchSuperclass")); + // And the specific relation this test is built on. + assertTrue(subclassesOfAzimuthalProjection().contains("OrthographicAzimuthalProjection")); + } + + /** + * The comparison used by {@link #everyAzimuthalOperatorTakesProjsDefaultCentre()} must reject + * the exact historical wrong value. {@code Math.toRadians(45)} in degrees is 45, and the + * tolerance is 1e-12, so a 45-degree default cannot slip through as "close enough to 0". + */ + @Test + public void theCentreAssertionWouldNoticeA45DegreeDefault() { + double historicalWrongDefault = Math.toDegrees(Math.toRadians(45.0)); + assertTrue("a 45 degree default must be further from 0 than the assertion tolerance", + Math.abs(historicalWrongDefault - 0.0) > 1e-12); + // And the wrong value really was reachable: it is what a bare +proj=ortho produced, and + // the coordinate it produced, a*cos(10)*sin(170-45), is 5145289.577 m. + assertEquals(5145289.577, + 6378137.0 * Math.cos(Math.toRadians(10)) * Math.sin(Math.toRadians(170 - 45)), + 1e-3); + } + + // ------------------------------------------------------------------------------- the walker + + private static TreeSet subclassesOfAzimuthalProjection() throws IOException { + List sources = new ArrayList(); + collect(projSourceDirectory(), sources); + + TreeSet supers = new TreeSet(); + supers.add("AzimuthalProjection"); + TreeSet found = new TreeSet(); + // Transitive closure: a subclass of a subclass is still affected by the superclass. + boolean grew = true; + while (grew) { + grew = false; + for (File f : sources) { + String simple = f.getName().substring(0, f.getName().length() - ".java".length()); + if (found.contains(simple)) { + continue; + } + String text = read(f); + for (String s : supers) { + if (text.contains("extends " + s + " ") + || text.contains("extends " + s + "\n") + || text.contains("extends " + s + "{")) { + found.add(simple); + grew = true; + break; + } + } + } + supers.addAll(found); + } + return found; + } + + private static boolean anySourceContains(List sources, String needle) throws IOException { + for (File f : sources) { + if (read(f).contains(needle)) { + return true; + } + } + return false; + } + + private static void collect(File dir, List out) { + File[] children = dir.listFiles(); + if (children == null) { + return; + } + for (File c : children) { + if (c.isDirectory()) { + collect(c, out); + } else if (c.getName().endsWith(".java")) { + out.add(c); + } + } + } + + /** + * {@code core/src/main/java/org/locationtech/proj4j/proj}, located from the compiled class's + * own URL so the test does not depend on the working directory the JVM was started in. + */ + private static File projSourceDirectory() { + URL url = AzimuthalCentreDefaultTest.class.getResource( + "/" + AzimuthalCentreDefaultTest.class.getName().replace('.', '/') + ".class"); + if (url != null && "file".equals(url.getProtocol())) { + // .../core/target/test-classes/org/locationtech/proj4j/proj/.class + File f = new File(url.getPath()); + for (int i = 0; i < 6 && f != null; i++) { + f = f.getParentFile(); + } + if (f != null) { + File candidate = new File(f, "src/main/java/org/locationtech/proj4j/proj"); + if (candidate.isDirectory()) { + return candidate; + } + } + } + for (String prefix : new String[] {"core/", ""}) { + File candidate = new File(prefix + "src/main/java/org/locationtech/proj4j/proj"); + if (candidate.isDirectory()) { + return candidate; + } + } + fail("could not locate core/src/main/java/org/locationtech/proj4j/proj"); + return null; + } + + private static String read(File f) throws IOException { + InputStream in = new FileInputStream(f); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buffer = new byte[8192]; + int n; + while ((n = in.read(buffer)) > 0) { + out.write(buffer, 0, n); + } + return new String(out.toByteArray(), "UTF-8"); + } finally { + in.close(); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/OrthoEck4LaeaInverseAliasingTest.java b/core/src/test/java/org/locationtech/proj4j/proj/OrthoEck4LaeaInverseAliasingTest.java new file mode 100644 index 0000000..7083bfb --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/OrthoEck4LaeaInverseAliasingTest.java @@ -0,0 +1,185 @@ +/* + * Copyright 2026 The Proj4J Contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.proj; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; + +/** + * Applies the shared "poison the destination" probe to {@code ortho}, {@code eck4} and + * {@code laea}, and records the answer: none of the three has the aliasing defect. + * + *

The defect this looks for

+ * + *

Six per-projection inverse bugs in this package are one bug. The 2006 semi-automatic C-to-Java + * conversion turned C's "mutate the argument, then read it back" into "write the output + * struct, then read the original parameter" - {@code aea}, {@code collg}, {@code fahey}, + * {@code bonne} (both branches), {@code bipc} and {@code SimpleConicProjection} with its seven + * subclasses. Its signature is that {@code projectInverse} returns a different answer depending on + * what the caller happened to leave in {@code dst}, because a value the method believes it wrote is + * really a value the caller supplied. + * + *

It is invisible to an ordinary test, which passes a fresh {@code ProjCoordinate} whose fields + * are {@code 0.0} - frequently close enough to the right answer that the result still looks + * plausible. Poisoning {@code dst} with a value no coordinate can be makes it visible. + * + *

The answer for these three, and why it is worth pinning

+ * + *

All three are clean, and for a structural reason rather than by luck: each copies its inputs + * into locals on entry ({@code xx}/{@code yy} in {@code ortho}, {@code sinTheta} in {@code eck4}, + * {@code lplam}/{@code lpphi} in {@code laea}) and every read of {@code lp}/{@code out} is a read + * of something the same call already wrote in the same branch, mirroring upstream's own mutation + * of {@code lp.phi}. {@code ortho}'s ellipsoidal oblique arm is the interesting case: it + * deliberately seeds from {@code lp} by calling {@code sphericalInverse(..., lp)} and then + * reads {@code lp.x}/{@code lp.y} back as the Newton starting point, which is the exact shape of + * the defect - except that the seed is written before it is read, so the poison is overwritten + * first. That distinction is not obvious from reading the code, which is why it is asserted rather + * than argued. + * + *

The test is written so that it would fail if any of that changed: it compares a poisoned run + * against a clean run bit for bit, not to a tolerance. + */ +public class OrthoEck4LaeaInverseAliasingTest { + + /** No coordinate, in radians or metres, can be this. A stale read of it is unmistakable. */ + private static final double POISON = 1.0e300; + + /** Every definition in scope, spherical and ellipsoidal, every azimuthal aspect. */ + private static final String[] DEFINITIONS = { + "+proj=ortho +R=1", + "+proj=ortho +R=1 +lat_0=40", + "+proj=ortho +R=1 +lat_0=90", + "+proj=ortho +R=1 +lat_0=-90", + "+proj=ortho +ellps=WGS84", + "+proj=ortho +ellps=WGS84 +lat_0=30", + "+proj=ortho +ellps=WGS84 +lat_0=90", + "+proj=ortho +ellps=WGS84 +lat_0=-90", + "+proj=ortho +ellps=GRS80 +lat_0=37.628969166666664 +lon_0=-122.39394166666668" + + " +k_0=0.9999968 +alpha=27.7927777777777", + "+proj=eck4 +a=6400000", + "+proj=eck4 +ellps=WGS84", + "+proj=laea +ellps=WGS84", + "+proj=laea +ellps=WGS84 +lat_0=45", + "+proj=laea +ellps=WGS84 +lat_0=90", + "+proj=laea +ellps=WGS84 +lat_0=-90", + "+proj=laea +R=6400000", + "+proj=laea +R=6400000 +lat_0=45", + "+proj=laea +R=6400000 +lat_0=90", + }; + + /** Longitude/latitude probes in degrees, kept inside every definition's visible hemisphere. */ + private static final double[][] PROBES = { + {0, 0}, {1, 1}, {-1, 1}, {1, -1}, {-1, -1}, + {10, 20}, {-10, 20}, {10, -20}, {20, 60}, {-20, -60}, + {0, 80}, {0, -80}, {5, 89}, {5, -89}, + }; + + /** + * The forward of each probe, inverted twice: once into a fresh destination and once into a + * destination poisoned with {@link #POISON}. The two must agree in every bit. + */ + @Test + public void aPoisonedDestinationChangesNoInverseResult() { + CRSFactory factory = new CRSFactory(); + int compared = 0; + for (String definition : DEFINITIONS) { + Projection p = factory.createFromParameters("t", definition).getProjection(); + for (double[] probe : PROBES) { + ProjCoordinate xy = forwardOrNull(p, probe[0], probe[1]); + if (xy == null) { + continue; // outside this definition's domain; not what is under test + } + ProjCoordinate clean = new ProjCoordinate(); + ProjCoordinate dirty = new ProjCoordinate(POISON, -POISON); + p.inverseProjectRadians(xy, clean); + p.inverseProjectRadians(xy, dirty); + + String where = definition + " at (" + probe[0] + ", " + probe[1] + ")"; + assertEquals(where + " x", Double.doubleToLongBits(clean.x), + Double.doubleToLongBits(dirty.x)); + assertEquals(where + " y", Double.doubleToLongBits(clean.y), + Double.doubleToLongBits(dirty.y)); + compared++; + } + } + // Without this the loop could silently compare nothing - every probe rejected, every + // assertion skipped, green. + assertTrue("only " + compared + " (definition, probe) pairs were actually inverted, which " + + "is too few for this to be a measurement", compared > 150); + } + + /** + * The probe's own sensitivity. A hand-rolled inverse with the historical defect - it writes the + * answer into {@code out} but then reads the caller's {@code out.x} back - must be caught by + * the very same comparison. Without this the test above could pass because the comparison is + * broken rather than because the code is clean. + */ + @Test + public void theProbeCatchesTheHistoricalDefectShape() { + ProjCoordinate clean = new ProjCoordinate(); + ProjCoordinate dirty = new ProjCoordinate(POISON, -POISON); + defectiveInverse(0.5, 0.25, clean); + defectiveInverse(0.5, 0.25, dirty); + assertTrue("the poisoned-destination comparison cannot see a stale read, so the assertions " + + "in aPoisonedDestinationChangesNoInverseResult prove nothing", + Double.doubleToLongBits(clean.x) != Double.doubleToLongBits(dirty.x)); + } + + /** + * The shape of the 2006 conversion bug, in miniature: C wrote {@code lp.lam = f(x)} and then + * read {@code lp.lam}; the translation writes {@code out.x} and then reads {@code out.x} at a + * point where it has not yet been written on this path. + */ + private static void defectiveInverse(double x, double y, ProjCoordinate out) { + out.y = Math.atan(y); + // The stale read: on the intended path this is f(x), but the assignment below is what + // actually produces it, and it has not happened yet. + double staleLam = out.x; + out.x = Math.atan2(x, 1.0) + 0.0 * staleLam + (staleLam > 1.0 ? 1.0 : 0.0); + } + + /** + * @return the forward projection, or {@code null} if this definition rejects the point - a + * domain refusal is a correct answer and simply means the probe is not usable here + */ + private static ProjCoordinate forwardOrNull(Projection p, double lonDeg, double latDeg) { + ProjCoordinate xy = new ProjCoordinate(); + try { + p.projectRadians(new ProjCoordinate(radians(lonDeg), radians(latDeg)), xy); + } catch (RuntimeException rejected) { + return null; + } + if (!isFinite(xy.x) || !isFinite(xy.y)) { + fail("forward of (" + lonDeg + ", " + latDeg + ") returned a non-finite coordinate " + + "without refusing: " + xy); + } + return xy; + } + + private static boolean isFinite(double v) { + return !Double.isNaN(v) && !Double.isInfinite(v); + } + + /** {@code Math.toRadians} is banned in {@code core/src/main}; this mirrors what it does. */ + private static double radians(double degrees) { + return degrees * (Math.PI / 180.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridRoundTripper.java b/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridRoundTripper.java index 773799c..3d1311d 100644 --- a/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridRoundTripper.java +++ b/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridRoundTripper.java @@ -15,142 +15,261 @@ *******************************************************************************/ package org.locationtech.proj4j.proj; +import java.util.ArrayList; +import java.util.List; + import org.locationtech.proj4j.CRSFactory; import org.locationtech.proj4j.CoordinateReferenceSystem; import org.locationtech.proj4j.CoordinateTransform; import org.locationtech.proj4j.CoordinateTransformFactory; import org.locationtech.proj4j.ProjCoordinate; -import org.locationtech.proj4j.proj.Projection; import org.locationtech.proj4j.util.ProjectionUtil; -public class ProjectionGridRoundTripper -{ - private static final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); - CRSFactory csFactory = new CRSFactory(); - - static final String WGS84_PARAM = "+title=long/lat:WGS84 +proj=longlat +datum=WGS84 +units=degrees"; - CoordinateReferenceSystem WGS84 = csFactory.createFromParameters("WGS84", WGS84_PARAM); - - private CoordinateReferenceSystem cs; - private CoordinateTransform transInverse; - private CoordinateTransform transForward; - private int gridSize = 4; - private boolean debug = false; - private int transformCount = 0; - private double[] gridExtent; - - public ProjectionGridRoundTripper(CoordinateReferenceSystem cs) - { - this.cs = cs; - transInverse = ctFactory.createTransform(cs, WGS84); - transForward = ctFactory.createTransform(WGS84, cs); - } - - public void setLevelDebug(boolean debug) - { - this.debug = debug; - } - - public int getTransformCount() - { - return transformCount; - } - - public double[] getExtent() - { - return gridExtent; - } - public boolean runGrid(double tolerance) - { - gridExtent = gridExtent(cs.getProjection()); - double minx = gridExtent[0]; - double miny = gridExtent[1]; - double maxx = gridExtent[2]; - double maxy = gridExtent[3]; - - ProjCoordinate p = new ProjCoordinate(); - double dx = (maxx - minx) / gridSize; - double dy = (maxy - miny) / gridSize; - for (int ix = 0; ix <= gridSize; ix++) { - for (int iy = 0; iy <= gridSize; iy++) { - p.x = ix == gridSize ? - maxx - : minx + ix * dx; - - p.y = iy == gridSize ? - maxy - : miny + iy * dy; - - boolean isWithinTol = roundTrip(p, tolerance); - if (! isWithinTol) - return false; - } - } - return true; - } - - ProjCoordinate p2 = new ProjCoordinate(); - ProjCoordinate p3 = new ProjCoordinate(); - - private boolean roundTrip(ProjCoordinate p, double tolerance) - { - transformCount++; - - transForward.transform(p, p2); - transInverse.transform(p2, p3); - - if (debug) - System.out.println(ProjectionUtil.toString(p) + " -> " + ProjectionUtil.toString(p2) + " -> " + ProjectionUtil.toString(p3)); - - double dx = Math.abs(p3.x - p.x); - double dy = Math.abs(p3.y - p.y); - - boolean isInTol = dx <= tolerance && dy <= tolerance; - - if (! isInTol) - System.out.println("FAIL: " + ProjectionUtil.toString(p) + " -> " + ProjectionUtil.toString(p2) + " -> " + ProjectionUtil.toString(p3)); - - - return isInTol; - } - - public static double[] gridExtent(Projection proj) - { - // scan all lat/lon params to try and determine a reasonable extent - - double lon = proj.getProjectionLongitudeDegrees(); - - double[] latExtent = new double[] {Double.MAX_VALUE, Double.MIN_VALUE }; - updateLat(proj.getProjectionLatitudeDegrees(), latExtent); - updateLat(proj.getProjectionLatitude1Degrees(), latExtent); - updateLat(proj.getProjectionLatitude2Degrees(), latExtent); - - double centrex = lon; - double centrey = 0.0; - double gridWidth = 10; - - if (latExtent[0] < Double.MAX_VALUE && latExtent[1] > Double.MIN_VALUE) { - // got a good candidate - - double dlat = latExtent[1] - latExtent[0]; - if (dlat > 0) gridWidth = 2 * dlat; - centrey = (latExtent[1] + latExtent[0]) /2; - } - double[] extent = new double[4]; - extent[0] = centrex - gridWidth/2; - extent[1] = centrey - gridWidth/2; - extent[2] = centrex + gridWidth/2; - extent[3] = centrey + gridWidth/2; - return extent; - } - - private static void updateLat(double lat, double[] latExtent) - { - // 0.0 indicates not set (for most projections?) - if (lat == 0.0) return; - if (lat < latExtent[0]) - latExtent[0] = lat; - if (lat > latExtent[1]) - latExtent[1] = lat; - } +/** + * Projects a small grid of geographic coordinates into a CRS and back, and reports how far the + * round-trip missed. + *

+ * {@link #gridExtent(Projection)} carried four defects that between them meant the grid was + * frequently probed nowhere near the CRS it was supposed to be testing. All four are fixed here; + * they are documented individually at the point of fix because the first one in particular is easy to + * reintroduce: + *

    + *
  1. The latitude accumulator was seeded with {@link Double#MIN_VALUE}, which is + * +4.9e-324 — the smallest positive subnormal, not a negative number. The + * "did we find anything?" guard was {@code latExtent[1] > Double.MIN_VALUE}, so for a CRS whose + * latitude parameters are all negative the accumulated maximum (say −19.0) failed the guard, the + * whole block was skipped, and the code fell back to a 10° box at {@code centrey = 0.0}. + * Every southern-hemisphere CRS was therefore probed in the wrong hemisphere, typically + * thousands of kilometres outside its area of use, where a round-trip either happens to be + * harmless or fails for reasons that have nothing to do with the CRS.
  2. + *
  3. {@code lat == 0.0} was treated as "parameter absent", conflating it with a legitimate + * equatorial value.
  4. + *
  5. {@code gridWidth = 2 * dlat} was unbounded: {@code +lat_1=-60 +lat_2=60} asks for a + * 240° box, which cannot be a meaningful probe of anything.
  6. + *
  7. The latitude-derived half-width was reused for longitude with no {@code cos(lat)} + * scaling, so the box's shape on the ground depended on where it was — at 71°N + * (Alaska zone 6) a "10° square" is 3.1× wider than it is tall.
  8. + *
+ */ +public class ProjectionGridRoundTripper { + + /** + * Largest probe box we will ever ask for, in degrees of latitude. Bounds defect (3): a box wider + * than this is not a probe of a projection, it is a probe of the projection's failure modes, and + * the two must not be conflated in one number. + */ + static final double MAX_BOX_HEIGHT_DEG = 20.0; + + /** Smallest probe box, so that a degenerate {@code lat_1 == lat_2} still exercises some area. */ + static final double MIN_BOX_HEIGHT_DEG = 2.0; + + /** Box height used when the projection declares no usable latitude at all. */ + static final double DEFAULT_BOX_HEIGHT_DEG = 10.0; + + /** + * Floor on {@code cos(centreLat)} when converting a ground-square box to degrees of longitude. + * 0.1 corresponds to ~84°; without it a polar CRS would ask for a box hundreds of degrees + * wide. + */ + static final double COS_LAT_FLOOR = 0.1; + + /** Keeps the box off the poles, where a lon/lat round-trip is degenerate for most projections. */ + static final double MAX_ABS_LAT_DEG = 89.0; + + private static final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); + + private final CRSFactory csFactory = new CRSFactory(); + + static final String WGS84_PARAM = "+title=long/lat:WGS84 +proj=longlat +datum=WGS84 +units=degrees"; + + private final CoordinateReferenceSystem WGS84 = csFactory.createFromParameters("WGS84", WGS84_PARAM); + + private final CoordinateReferenceSystem cs; + private final CoordinateTransform transInverse; + private final CoordinateTransform transForward; + private int gridSize = 4; + private boolean debug = false; + private int transformCount = 0; + private double[] gridExtent; + private final List failures = new ArrayList(); + private double worstError = 0.0; + + public ProjectionGridRoundTripper(CoordinateReferenceSystem cs) { + this.cs = cs; + transInverse = ctFactory.createTransform(cs, WGS84); + transForward = ctFactory.createTransform(WGS84, cs); + } + + public void setLevelDebug(boolean debug) { + this.debug = debug; + } + + public int getTransformCount() { + return transformCount; + } + + public double[] getExtent() { + return gridExtent; + } + + /** Largest round-trip error seen, in degrees, over every point probed. */ + public double getWorstError() { + return worstError; + } + + /** Human-readable description of every point that missed, empty if none did. */ + public List getFailures() { + return failures; + } + + /** + * Runs the whole grid and returns whether every point round-tripped within {@code tolerance} + * degrees. + *

+ * Unlike the original, this does not stop at the first miss: a probe that aborts on point 1 of 25 + * cannot tell you whether a CRS is slightly off or completely broken, and that distinction is the + * entire value of the test. + */ + public boolean runGrid(double tolerance) { + gridExtent = gridExtent(cs.getProjection()); + double minx = gridExtent[0]; + double miny = gridExtent[1]; + double maxx = gridExtent[2]; + double maxy = gridExtent[3]; + + double dx = (maxx - minx) / gridSize; + double dy = (maxy - miny) / gridSize; + for (int ix = 0; ix <= gridSize; ix++) { + for (int iy = 0; iy <= gridSize; iy++) { + ProjCoordinate p = new ProjCoordinate( + ix == gridSize ? maxx : minx + ix * dx, + iy == gridSize ? maxy : miny + iy * dy); + roundTrip(p, tolerance); + } + } + return failures.isEmpty(); + } + + private boolean roundTrip(ProjCoordinate p, double tolerance) { + transformCount++; + + ProjCoordinate projected = new ProjCoordinate(); + ProjCoordinate returned = new ProjCoordinate(); + transForward.transform(p, projected); + transInverse.transform(projected, returned); + + if (debug) { + System.out.println(ProjectionUtil.toString(p) + " -> " + ProjectionUtil.toString(projected) + + " -> " + ProjectionUtil.toString(returned)); + } + + double dx = Math.abs(returned.x - p.x); + double dy = Math.abs(returned.y - p.y); + double err = Math.max(dx, dy); + // NaN-safe on purpose: a non-finite round-trip must be a failure, not a comparison that + // quietly evaluates to false. + if (!(err <= worstError)) { + worstError = err; + } + + boolean isInTol = dx <= tolerance && dy <= tolerance; + if (!isInTol) { + failures.add(ProjectionUtil.toString(p) + " -> " + ProjectionUtil.toString(projected) + + " -> " + ProjectionUtil.toString(returned) + + " (dLon " + dx + ", dLat " + dy + ")"); + } + return isInTol; + } + + /** + * Chooses a lon/lat box to probe, from whatever the projection declares about its own origin. + *

+ * Returned as {@code { minLon, minLat, maxLon, maxLat }}. + *

+ * Note on "absent" parameters. {@link Projection} offers no absent-sentinel: + * {@code projectionLatitude}, {@code projectionLatitude1} and {@code projectionLatitude2} are all + * plain {@code double}s initialised to {@code 0.0} ({@code Projection.java:66,76,81}), so a CRS + * that genuinely sits on the equator is indistinguishable from one that declares no latitude. + * The original code responded by dropping every {@code 0.0} inside {@code updateLat}, which is + * defect (2). This version instead applies an explicit precedence rule and never discards a value + * from the arithmetic — {@code 0.0} is only ever used to select which rule applies, and + * that limitation is stated rather than hidden. Giving {@code Projection} a NaN default would + * remove the ambiguity outright, but that is a main-source change. + */ + public static double[] gridExtent(Projection proj) { + double lat0 = proj.getProjectionLatitudeDegrees(); + double lat1 = proj.getProjectionLatitude1Degrees(); + double lat2 = proj.getProjectionLatitude2Degrees(); + double lon0 = proj.getProjectionLongitudeDegrees(); + + boolean haveStandardParallels = lat1 != 0.0 || lat2 != 0.0; + boolean haveBothStandardParallels = lat1 != 0.0 && lat2 != 0.0; + + // ---- centre latitude ------------------------------------------------------------------- + // Defect (1): the old accumulator was seeded { Double.MAX_VALUE, Double.MIN_VALUE } and + // Double.MIN_VALUE is +4.9e-324. There is no accumulator here at all, so the sign of the + // hemisphere cannot be lost. If a min/max is ever reintroduced, seed the maximum with + // -Double.MAX_VALUE or Double.NEGATIVE_INFINITY -- never Double.MIN_VALUE. + double centreLat; + if (lat0 != 0.0) { + centreLat = lat0; + } else if (haveStandardParallels) { + centreLat = 0.5 * (lat1 + lat2); + } else { + centreLat = 0.0; + } + centreLat = clamp(centreLat, -MAX_ABS_LAT_DEG, MAX_ABS_LAT_DEG); + + // ---- box height ------------------------------------------------------------------------ + // Defect (3): 2 * dlat, unbounded. +lat_1=-60 +lat_2=60 gave a 240-degree box. + double heightDeg = DEFAULT_BOX_HEIGHT_DEG; + if (haveBothStandardParallels) { + double dlat = Math.abs(lat2 - lat1); + if (dlat > 0.0) { + heightDeg = clamp(2.0 * dlat, MIN_BOX_HEIGHT_DEG, MAX_BOX_HEIGHT_DEG); + } + } + + // ---- box width ------------------------------------------------------------------------- + // Defect (4): the latitude half-width was reused verbatim for longitude, so the box's + // proportions on the ground varied with latitude. One degree of longitude spans + // cos(lat) degrees' worth of ground, so a ground-square box needs height / cos(lat) degrees + // of longitude -- floored near the poles and capped for the same reason as the height. + double cosLat = Math.max(Math.cos(Math.toRadians(centreLat)), COS_LAT_FLOOR); + double widthDeg = clamp(heightDeg / cosLat, MIN_BOX_HEIGHT_DEG, MAX_BOX_HEIGHT_DEG); + + // ---- assemble, keeping the box on the globe -------------------------------------------- + double halfH = 0.5 * heightDeg; + double halfW = 0.5 * widthDeg; + double minLat = centreLat - halfH; + double maxLat = centreLat + halfH; + if (minLat < -MAX_ABS_LAT_DEG) { + double shift = -MAX_ABS_LAT_DEG - minLat; + minLat += shift; + maxLat += shift; + } else if (maxLat > MAX_ABS_LAT_DEG) { + double shift = maxLat - MAX_ABS_LAT_DEG; + minLat -= shift; + maxLat -= shift; + } + + double centreLon = lon0; + double minLon = centreLon - halfW; + double maxLon = centreLon + halfW; + if (minLon < -180.0) { + double shift = -180.0 - minLon; + minLon += shift; + maxLon += shift; + } else if (maxLon > 180.0) { + double shift = maxLon - 180.0; + minLon -= shift; + maxLon -= shift; + } + + return new double[] { minLon, minLat, maxLon, maxLat }; + } + + private static double clamp(double v, double lo, double hi) { + return Math.max(lo, Math.min(hi, v)); + } } diff --git a/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridTest.java b/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridTest.java index 27d9d63..14ec7b4 100644 --- a/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridTest.java +++ b/core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridTest.java @@ -15,72 +15,177 @@ *******************************************************************************/ package org.locationtech.proj4j.proj; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; import org.locationtech.proj4j.CRSFactory; import org.locationtech.proj4j.CoordinateReferenceSystem; -import junit.framework.TestCase; -import junit.textui.TestRunner; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; /** - * Tests accuracy and correctness of projecting and reprojecting a grid of geographic coordinates. - * - * @author Martin Davis + * Projects a grid of geographic coordinates into each of ~200 CRSs and back, asserting that the + * round-trip returns to where it started. By point count this is the broadest test in the repository. + *

+ * Migrated from JUnit 3 ({@code extends TestCase}) to JUnit 4, and the probe-box logic it depends on + * had four defects fixed — see {@link ProjectionGridRoundTripper#gridExtent(Projection)}. The most + * consequential was that the latitude accumulator was seeded with {@link Double#MIN_VALUE} + * ({@code +4.9e-324}, not a negative number), so every all-negative-latitude CRS silently fell back + * to a 10° box on the equator and was never probed anywhere near its own area of use. + *

+ * The original code list — EPSG:3005, 2759-2930, 2265 — is entirely North American and therefore + * entirely northern-hemisphere, so it never exercised that defect at all. {@link #testSouthernHemisphere()} + * is added for exactly that reason: without it, the fix would be untested and the box logic could + * regress to the equator without a single assertion noticing. + *

+ * A failure here is reported with every missed point and its miss distance, rather than aborting on + * the first one: "1 of 25 points missed by 3e-5 degrees" and "25 of 25 points missed by 40 degrees" + * are completely different findings and the old {@code assertTrue(isOK)} could not distinguish them. * + * @author Martin Davis */ -public class ProjectionGridTest extends TestCase -{ - static final double TOLERANCE = 0.00001; - - public static void main(String args[]) { - TestRunner.run(ProjectionGridTest.class); - } - - public ProjectionGridTest(String name) { super(name); } - - public void testAlbers() - { - runEPSG(3005); - } - - public void testStatePlane() - { - // State-plane EPSG defs - runEPSG(2759, 2930); - } - public void testStatePlaneND() - { - runEPSG(2265); - } - - void runEPSG(int codeStart, int codeEnd) - { - for (int i = codeStart; i <= codeEnd; i++) { - runEPSG(i); - } - } - - void runEPSG(int code) - { - run("epsg:" + code); - } - - void run(String code) - { - CRSFactory csFactory = new CRSFactory(); - CoordinateReferenceSystem cs = csFactory.createFromName(code); - if (cs == null) - return; - ProjectionGridRoundTripper tripper = new ProjectionGridRoundTripper(cs); - //tripper.setLevelDebug(true); - boolean isOK = tripper.runGrid(TOLERANCE); - double[] extent = tripper.getExtent(); - - System.out.println(code + " - " + cs.getParameterString()); - System.out.println( - " - extent: [ " + extent[0] + ", " + extent[1] + " : " + extent[2] + ", " + extent[3] + " ]"); - System.out.println(" - tol: " + TOLERANCE); - System.out.println(" - # pts run = " + tripper.getTransformCount()); - - assertTrue(isOK); - } +public class ProjectionGridTest { + + /** + * Round-trip tolerance, in degrees. ~1.1 m at the equator. + */ + static final double TOLERANCE = 0.00001; + + private final CRSFactory csFactory = new CRSFactory(); + + @Test + public void testAlbers() { + runEPSG(3005, 3005, 1); + } + + @Test + public void testStatePlane() { + // State-plane EPSG defs. 172 of the 172 codes in the range resolve. + runEPSG(2759, 2930, 172); + } + + @Test + public void testStatePlaneND() { + runEPSG(2265, 2265, 1); + } + + /** + * Southern-hemisphere CRSs, which the {@link Double#MIN_VALUE} seed described in the class javadoc + * used to push onto the equator. Added with the fix, because without it the fix has no witness. + *

+ * Deliberately a mix of {@code utm +south} (lat_0 = 0, so it also exercises the + * "is 0.0 absent or real?" question), {@code lcc} with two negative standard parallels, + * {@code tmerc} with a negative {@code lat_0}, and a polar {@code stere}. Measured effect of the + * fix on where these are probed: + *

+     *   EPSG:3112  lcc   lat_1 -18, lat_2 -36   old box [129,-5 : 139,5]     new [124,-37 : 144,-17]
+     *   EPSG:22185 tmerc lat_0 -90              old box [-65,-5 : -55,5]     new [-70,-89 : -50,-79]
+     *   EPSG:3031  stere lat_0 -90              old box [-5,-5 : 5,5]        new [-10,-89 : 10,-79]
+     * 
+ * The old boxes for those three sat on the equator — 27°, 85° and 90° of latitude away + * from the CRS's own origin, EPSG:3031's landing in the Gulf of Guinea. The {@code utm +south} + * entries are unchanged and that is correct: their {@code lat_0} really is 0. + *

+ * All 12 pass. The fix did not turn up a new round-trip failure, but it did change the worst + * observed error by eight orders of magnitude where it moved the box: EPSG:22185 probed at its real + * origin reaches 1.0e-6 deg (~0.11 m at lat −89, near-polar {@code tmerc}) against + * 5e-15 deg for the equatorial UTM zones. + */ + @Test + public void testSouthernHemisphere() { + int[] codes = { + 2736, // UTM 36S / clrk66 -- lat_0 = 0, +south + 32718, // UTM 18S / WGS84 + 32733, // UTM 33S / WGS84 + 32755, // UTM 55S / WGS84 + 22185, // Campo Inchauspe / Argentina zone 5, tmerc, lat_0 = -90 + 29181, // SAD69 / UTM 21S + 20355, // AGD66 / AMG zone 55 + 2193, // NZGD2000 / New Zealand Transverse Mercator, lat_0 = 0 + 3112, // GDA94 / Geoscience Australia Lambert, lat_1 = -18, lat_2 = -36 + 5361, // SIRGAS-Chile / Chile zone + 3031, // WGS84 / Antarctic Polar Stereographic, lat_0 = -90 + 2039, // northern control: Israel 1993 / Israeli TM Grid + }; + runAll(codes, codes.length); + } + + private void runEPSG(int codeStart, int codeEnd, int expectedResolved) { + int[] codes = new int[codeEnd - codeStart + 1]; + for (int i = 0; i < codes.length; i++) { + codes[i] = codeStart + i; + } + runAll(codes, expectedResolved); + } + + /** + * Runs every code and reports all of them together. Collecting rather than failing fast is the + * point: with 172 CRSs in one method, "the build is red" has to come with a list. + *

+ * {@code expectedResolved} is asserted exactly. Not every integer in an EPSG range is an assigned + * code, so unresolvable ones have to be skipped — but a skip is not a pass, and without pinning the + * count a registry change could quietly reduce this from 172 CRSs to 2 while still reporting + * green. + */ + private void runAll(int[] codes, int expectedResolved) { + List broken = new ArrayList(); + int probed = 0; + int points = 0; + for (int code : codes) { + String name = "epsg:" + code; + CoordinateReferenceSystem cs; + try { + cs = csFactory.createFromName(name); + } catch (RuntimeException ex) { + // Not every integer in a range is an assigned code; an unassigned one is not a defect. + continue; + } + if (cs == null) { + continue; + } + probed++; + + ProjectionGridRoundTripper tripper = new ProjectionGridRoundTripper(cs); + boolean isOK; + try { + isOK = tripper.runGrid(TOLERANCE); + } catch (RuntimeException ex) { + broken.add(name + " (" + cs.getParameterString() + ") threw " + + ex.getClass().getSimpleName() + ": " + ex.getMessage()); + continue; + } + points += tripper.getTransformCount(); + + if (!isOK) { + double[] e = tripper.getExtent(); + StringBuilder sb = new StringBuilder(); + sb.append(name).append(" (").append(cs.getParameterString()).append(")\n") + .append(" probe box [").append(e[0]).append(", ").append(e[1]) + .append(" : ").append(e[2]).append(", ").append(e[3]).append("]") + .append(" worst error ").append(tripper.getWorstError()).append(" deg") + .append(" (").append(tripper.getFailures().size()).append(" of ") + .append(tripper.getTransformCount()).append(" points missed)"); + for (String f : tripper.getFailures()) { + sb.append("\n ").append(f); + } + broken.add(sb.toString()); + } + } + + assertEquals("number of CRSs that resolved -- a skip is not a pass, so this is pinned " + + "rather than left to drift", expectedResolved, probed); + + if (!broken.isEmpty()) { + StringBuilder msg = new StringBuilder(); + msg.append(broken.size()).append(" of ").append(probed) + .append(" CRSs failed to round-trip within ").append(TOLERANCE) + .append(" degrees (").append(points).append(" points probed):\n"); + for (String b : broken) { + msg.append(" ").append(b).append("\n"); + } + fail(msg.toString()); + } + } } diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsDomainContractTest.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsDomainContractTest.java new file mode 100644 index 0000000..58c7fdf --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsDomainContractTest.java @@ -0,0 +1,368 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.AdamsHemisphereProjection; +import org.locationtech.proj4j.proj.AdamsWorldInASquareIIProjection; +import org.locationtech.proj4j.proj.AdamsWorldInASquareIProjection; +import org.locationtech.proj4j.proj.GuyouProjection; +import org.locationtech.proj4j.proj.PeirceQuincuncialProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpilhausProjection; + +/** + * The domain contract of the adams family, which is worth as much as the arithmetic: about 968 of + * the 3,443 {@code expect} rows in the six files are {@code expect failure}. + * + *

{@link AdamsFamilyCorpusTest} already proves every one of them against the corpus. This test + * exists to state the rules separately, so that a future change that happens to keep the + * corpus green while inventing or losing a guard still fails something with a name. + * + *

Three predicates account for all 723 projection-level rejections, and two operators have no + * projection-level guard at all — which is just as load bearing, because inventing one for them + * would turn correct answers into failures. + */ +public class AdamsDomainContractTest { + + private static final double DTR = Math.PI / 180.0; + + private static Projection initialized(Projection p) { + p.setRadius(6370997); + p.initialize(); + return p; + } + + private static ProjCoordinate forward(Projection p, double lonDeg, double latDeg) { + return p.project(new ProjCoordinate(lonDeg, latDeg), new ProjCoordinate()); + } + + private static ProjectionException expectRejection(Projection p, double lonDeg, + double latDeg) { + try { + ProjCoordinate out = forward(p, lonDeg, latDeg); + fail("expected rejection at " + lonDeg + " " + latDeg + " but got " + out); + return null; + } catch (ProjectionException e) { + return e; + } + } + + // ------------------------------------------------- guyou and adams_hemi: one hemisphere + + /** + * {@code |lam| - 1e-9 > pi/2} ({@code adams.cpp:119-122} and {@code :165-168}). 333 + * assertions each in {@code guyou.gie} and {@code adams_hemi.gie} — 47% of both files. + * + *

The {@code TOL} slack is on the accepting side: {@code 90} degrees exactly is fine, and + * so is anything within {@code 1e-9} radians beyond it. + */ + @Test + public void guyouAndAdamsHemiRejectBeyondTheHemisphere() { + Projection[] hemispheric = { + initialized(new GuyouProjection()), + initialized(new AdamsHemisphereProjection()), + }; + for (Projection p : hemispheric) { + String who = p.toString(); + assertNotNull(who, forward(p, 90.0, 10.0)); + assertNotNull(who, forward(p, -90.0, 10.0)); + // pi/2 + TOL exactly is still accepted: the predicate is strictly greater. + assertNotNull(who, forward(p, (Math.PI / 2 + 1e-9) / DTR, 10.0)); + expectRejection(p, 90.0000001, 10.0); + expectRejection(p, -90.0000001, 10.0); + expectRejection(p, 179.0, 10.0); + } + } + + /** + * {@code guyou} at the pole is a success returning the truncated literal, and it is + * checked after the longitude guard — so a pole outside the hemisphere is still a + * failure. {@code guyou.gie:2122-2131} is the {@code +R=1} block that pins the value. + */ + @Test + public void guyouPoleIsASuccessButOnlyInsideTheHemisphere() { + GuyouProjection p = new GuyouProjection(); + p.setRadius(1); + p.initialize(); + + assertEquals(0.0, forward(p, 0, 90).x, 0.0); + assertEquals(1.85407, forward(p, 0, 90).y, 0.0); + assertEquals(0.0, forward(p, 0, -90).x, 0.0); + assertEquals(-1.85407, forward(p, 0, -90).y, 0.0); + + expectRejection(p, 179.0, 90.0); + } + + // ------------------------------------------- adams_ws1 / adams_ws2: no guard whatsoever + + /** + * Neither world-in-a-square variant has a projection-level domain check. All 57 and 56 + * of their {@code expect failure} rows are PROJ's host-level pre-check on coordinate range. + * Adding a guard to make one of those rows "pass" would be the wrong guard in the wrong place + * and would break the whole-sphere coverage these two exist to provide. + */ + @Test + public void worldInASquareVariantsAcceptTheWholeSphere() { + Projection[] global = { + initialized(new AdamsWorldInASquareIProjection()), + initialized(new AdamsWorldInASquareIIProjection()), + }; + for (Projection p : global) { + for (double lon = -180; lon <= 180; lon += 5) { + for (double lat = -90; lat <= 90; lat += 5) { + ProjCoordinate out = forward(p, lon, lat); + assertTrue(p + " at " + lon + " " + lat + " -> " + out, + !Double.isNaN(out.x) && !Double.isNaN(out.y)); + } + } + } + } + + // ------------------------------------------------ peirce_q: asymmetric hemisphere guards + + /** + * {@code nhemisphere} rejects {@code phi < -TOL}; {@code shemisphere} rejects + * {@code phi > -TOL}. The equator is therefore accepted by the north and rejected by the + * south, which over the corpus's point grid is 37 rejections against 19. Not a typo + * upstream — reproduced deliberately. + */ + @Test + public void peirceHemisphereGuardsAreAsymmetricAboutTheEquator() { + PeirceQuincuncialProjection north = new PeirceQuincuncialProjection(); + north.setShape("nhemisphere"); + initialized(north); + + PeirceQuincuncialProjection south = new PeirceQuincuncialProjection(); + south.setShape("shemisphere"); + initialized(south); + + // The equator: accepted by nhemisphere, rejected by shemisphere. + assertNotNull(forward(north, 0, 0)); + expectRejection(south, 0, 0); + + // A sliver south of the equator, inside TOL: still accepted by nhemisphere. + double sliverDegrees = 0.5e-9 / DTR; + assertNotNull(forward(north, 0, -sliverDegrees)); + + assertNotNull(forward(north, 0, 45)); + expectRejection(north, 0, -45); + assertNotNull(forward(south, 0, -45)); + expectRejection(south, 0, 45); + } + + /** The other four shapes have no hemisphere guard at all. */ + @Test + public void peirceOtherShapesHaveNoHemisphereGuard() { + for (String shape : new String[] {"square", "diamond", "horizontal", "vertical"}) { + PeirceQuincuncialProjection p = new PeirceQuincuncialProjection(); + p.setShape(shape); + initialized(p); + assertNotNull(shape, forward(p, 0, 80)); + assertNotNull(shape, forward(p, 0, -80)); + assertNotNull(shape, forward(p, 0, 0)); + } + } + + // ------------------------------------------------------- the host-level pre-check (fwd.cpp) + + /** + * {@code fwd.cpp:54-71}: {@code |phi| - pi/2 > 1e-12} radians and {@code |lam| > 10} radians + * are rejected, and a latitude inside that {@code 1e-12} slop is clamped rather than + * rejected. 245 of the six files' {@code expect failure} rows are this check and no + * projection's own logic. + * + *

The bound is {@code 1e-12} radians, about {@code 5.7e-11} degrees. A + * degree-space approximation of it misclassifies dozens of corpus points. + */ + @Test + public void hostLevelPreCheckIsInRadiansAndClampsInsideTheSlop() { + Projection p = initialized(new AdamsWorldInASquareIProjection()); + + // Inside the slop: clamped to the pole, not rejected. + double insideSlop = (Math.PI / 2 + 0.9e-12) / DTR; + assertNotNull(forward(p, 0, insideSlop)); + + // Outside it: rejected. + double outsideSlop = (Math.PI / 2 + 2e-12) / DTR; + expectRejection(p, 0, outsideSlop); + expectRejection(p, 0, 90.7265739758); + expectRejection(p, 0, -105.0); + + // 10 radians, not 180 degrees: +/-573 degrees is the bound, so 400 degrees is legal + // input to the host check and wraps. + assertNotNull(forward(p, 400, 10)); + expectRejection(p, 600, 10); + } + + /** + * {@code adjlon} is applied, and it matters: {@code adams_ws1}/{@code adams_ws2} take + * {@code sin(lam/2)}, whose period is {@code 4*pi}, so an unwrapped longitude past the + * antimeridian gives the wrong sign rather than a rounding difference. The corpus feeds + * longitudes up to {@code 180.96} degrees. + */ + @Test + public void longitudeIsWrappedIntoTheHalfOpenTurn() { + Projection p = initialized(new AdamsWorldInASquareIProjection()); + ProjCoordinate wrapped = forward(p, 180.5, -30); + ProjCoordinate equivalent = forward(p, -179.5, -30); + assertEquals(equivalent.x, wrapped.x, 1e-9); + assertEquals(equivalent.y, wrapped.y, 1e-9); + assertTrue("180.5 degrees must land in the western half, not the eastern", + wrapped.x < 0); + } + + // -------------------------------------------------------------------------- inverses + + /** + * {@code pj_adams_setup} installs an inverse for {@code adams_ws2} only, and + * {@code peirce_q} only for {@code square} and {@code diamond}. Every other path must raise, + * never echo the input back as a plausible coordinate. + */ + @Test + public void inverseAvailabilityMatchesUpstream() { + assertFalse(initialized(new GuyouProjection()).hasInverse()); + assertFalse(initialized(new AdamsHemisphereProjection()).hasInverse()); + assertFalse(initialized(new AdamsWorldInASquareIProjection()).hasInverse()); + assertTrue(initialized(new AdamsWorldInASquareIIProjection()).hasInverse()); + assertTrue(new SpilhausProjection().hasInverse()); + + for (String shape : new String[] {"square", "diamond"}) { + PeirceQuincuncialProjection p = new PeirceQuincuncialProjection(); + p.setShape(shape); + assertTrue(shape, initialized(p).hasInverse()); + } + for (String shape : + new String[] {"nhemisphere", "shemisphere", "horizontal", "vertical"}) { + PeirceQuincuncialProjection p = new PeirceQuincuncialProjection(); + p.setShape(shape); + initialized(p); + assertFalse(shape, p.hasInverse()); + try { + p.inverseProject(new ProjCoordinate(1e6, 1e6), new ProjCoordinate()); + fail("+shape=" + shape + " has no inverse and must raise"); + } catch (ProjectionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("no inverse")); + } + } + } + + /** The default shape is {@code diamond}, not {@code square}. The prose docs say otherwise. */ + @Test + public void peirceDefaultShapeIsDiamond() { + PeirceQuincuncialProjection defaulted = new PeirceQuincuncialProjection(); + assertEquals(PeirceQuincuncialProjection.Shape.DIAMOND, defaulted.getShape()); + + PeirceQuincuncialProjection explicit = new PeirceQuincuncialProjection(); + explicit.setShape("diamond"); + initialized(defaulted); + initialized(explicit); + assertEquals(forward(explicit, 30, 40).x, forward(defaulted, 30, 40).x, 0.0); + assertEquals(forward(explicit, 30, 40).y, forward(defaulted, 30, 40).y, 0.0); + } + + // ---------------------------------------------------------------- setup-time validation + + /** {@code adams.cpp:448-453}. */ + @Test(expected = InvalidValueException.class) + public void unknownShapeIsASetupError() { + new PeirceQuincuncialProjection().setShape("hemisphere"); + } + + /** {@code adams.cpp:425-431} and {@code :439-445}; the bounds are inclusive. */ + @Test + public void scrollBoundsAreInclusive() { + PeirceQuincuncialProjection p = new PeirceQuincuncialProjection(); + p.setScrollX(1.0); + p.setScrollX(-1.0); + p.setScrollY(1.0); + p.setScrollY(-1.0); + try { + p.setScrollX(1.0000001); + fail("scrollx > 1 must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("scrollx")); + } + try { + p.setScrollY(-1.0000001); + fail("scrolly < -1 must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("scrolly")); + } + } + + /** + * {@code +scrollx} is read only by {@code horizontal} and {@code +scrolly} only by + * {@code vertical}. Setting the wrong one is not an error and has no effect. + */ + @Test + public void scrollIsIgnoredOffItsOwnShape() { + PeirceQuincuncialProjection plain = new PeirceQuincuncialProjection(); + plain.setShape("vertical"); + initialized(plain); + + PeirceQuincuncialProjection withScrollX = new PeirceQuincuncialProjection(); + withScrollX.setShape("vertical"); + withScrollX.setScrollX(0.5); + initialized(withScrollX); + + assertEquals(forward(plain, 30, 40).x, forward(withScrollX, 30, 40).x, 0.0); + assertEquals(forward(plain, 30, 40).y, forward(withScrollX, 30, 40).y, 0.0); + } + + /** + * {@code pj_adams_setup} forces {@code P->es = 0}: the family is spherical whatever + * ellipsoid is requested, but keeps the requested semi-major axis as the output scale. + * {@code adams_ws2.gie:2125} asserts exactly that with {@code +proj=adams_ws2 +ellps=WGS84}. + */ + @Test + public void familyIsSphericalOnAnyEllipsoid() { + AdamsWorldInASquareIIProjection wgs84 = new AdamsWorldInASquareIIProjection(); + wgs84.setEllipsoid(org.locationtech.proj4j.datum.Ellipsoid.WGS84); + wgs84.initialize(); + + AdamsWorldInASquareIIProjection sphere = new AdamsWorldInASquareIIProjection(); + sphere.setRadius(org.locationtech.proj4j.datum.Ellipsoid.WGS84.getEquatorRadius()); + sphere.initialize(); + + assertEquals(forward(sphere, 40, 60).x, forward(wgs84, 40, 60).x, 0.0); + assertEquals(forward(sphere, 40, 60).y, forward(wgs84, 40, 60).y, 0.0); + // 40 60 -> 2021909.611 4162291.966 at adams_ws2.gie:2134, 1 mm. + assertEquals(2021909.611, forward(wgs84, 40, 60).x, 0.001); + assertEquals(4162291.966, forward(wgs84, 40, 60).y, 0.001); + } + + /** All six are conformal; that is what the family is for. */ + @Test + public void allSixAreConformal() { + assertTrue(new GuyouProjection().isConformal()); + assertTrue(new PeirceQuincuncialProjection().isConformal()); + assertTrue(new AdamsHemisphereProjection().isConformal()); + assertTrue(new AdamsWorldInASquareIProjection().isConformal()); + assertTrue(new AdamsWorldInASquareIIProjection().isConformal()); + assertTrue(new SpilhausProjection().isConformal()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsFamilyCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsFamilyCorpusTest.java new file mode 100644 index 0000000..0b1aaa0 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsFamilyCorpusTest.java @@ -0,0 +1,282 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.Projection; + +/** + * Runs the whole of PROJ 9.8.1's own corpus for the six adams-family operators against this + * implementation: 3,443 {@code expect} rows plus 115 {@code roundtrip} rows across + * {@code adams_hemi.gie}, {@code adams_ws1.gie}, {@code adams_ws2.gie}, {@code guyou.gie}, + * {@code peirce_q.gie} and {@code spilhaus.gie} — 49% of every {@code expect} assertion in + * {@code test/gie}. + * + *

The expected values are dense point grids, so they are read from the vendored + * {@code .gie} files rather than transcribed; see {@link GieCorpus} for why this reader is + * local rather than the conformance module's. + * + *

The metric

+ * + *

{@code gie} chooses among four residual metrics and applying the wrong one inflates the + * distance by up to 111,319x. Two of the four occur here: + * + *

    + *
  • Euclidean, in metres, for every {@code expect} row: the target of a forward + * projection is a projected coordinate, so the residual is {@code hypot(dx, dy)}. + *
  • Geodesic, on the input side, for every {@code roundtrip} row: {@code gie} picks + * the metric from {@code proj_angular_input}, which for a forward roundtrip is the + * angular lat/lon side. A great-circle distance on the operation's own radius + * stands in for the geodesic here; the two differ by at most 0.5% of the measured + * distance, and a converged roundtrip measures microns, so 0.5% of it is nowhere near any + * tolerance in these files. + *
+ * + *

The comparison is written {@code !(d <= tol)} rather than {@code d > tol} so that + * {@code NaN} and {@code +inf} both fail rather than silently passing. + * + *

{@code roundtrip} phasing

+ * + *

{@code src/trans.cpp:591}: one forward, then {@code n-1} inverse-forward pairs, then one + * final inverse — {@code n} of each, arranged so the result is comparable with the original + * input. Half-stepping it the obvious way instead compares a projected coordinate with a + * geographic one. + * + *

What "pass" means here, and what it does not

+ * + *

An {@code expect failure} row passes when the transform raises. It does not + * require a matching errno: proj4j's exception taxonomy is coarser than PROJ's 17 constants, + * and the conformance harness makes the same allowance. What it does require is that the + * failure is a raise and not a plausible-looking coordinate — a returned {@code NaN} counts + * as a failed assertion, not a passed one. + */ +@RunWith(Parameterized.class) +public class AdamsFamilyCorpusTest { + + /** The six files, with the row counts the corpus is known to contain. */ + @Parameterized.Parameters(name = "{0}") + public static Collection files() { + return Arrays.asList(new Object[][] { + // file, expect rows, roundtrip rows + {"adams_hemi.gie", 703, 0}, + {"adams_ws1.gie", 703, 0}, + {"adams_ws2.gie", 713, 9}, + {"guyou.gie", 705, 0}, + {"peirce_q.gie", 545, 47}, + {"spilhaus.gie", 74, 59}, + }); + } + + private final String file; + private final int expectedExpectRows; + private final int expectedRoundtripRows; + + public AdamsFamilyCorpusTest(String file, int expectedExpectRows, int expectedRoundtripRows) { + this.file = file; + this.expectedExpectRows = expectedExpectRows; + this.expectedRoundtripRows = expectedRoundtripRows; + } + + @Test + public void everyAssertionInTheCorpusHolds() { + List rows = GieCorpus.read(file); + + int expectRows = 0; + int roundtripRows = 0; + int passed = 0; + List failures = new ArrayList(); + Map cache = new HashMap(); + + for (GieCorpus.Row row : rows) { + if (row.kind == GieCorpus.NO_EXPECTATION && row.roundtrip == 0) { + // An accept whose expect is commented out: not an assertion. The corpus has 49. + continue; + } + Projection projection = cache.get(row.operation); + if (projection == null) { + projection = AdamsOperations.build(row.operation); + cache.put(row.operation, projection); + } + + if (row.kind != GieCorpus.NO_EXPECTATION) { + expectRows++; + String failure = checkExpect(projection, row); + if (failure == null) { + passed++; + } else { + failures.add(failure); + } + } + + if (row.roundtrip > 0) { + roundtripRows++; + String rt = checkRoundtrip(projection, row); + if (rt == null) { + passed++; + } else { + failures.add(rt); + } + } + } + + // A reader regression that silently dropped half the file would otherwise look like a + // clean run. + assertEquals(file + ": expect row count", expectedExpectRows, expectRows); + assertEquals(file + ": roundtrip row count", expectedRoundtripRows, roundtripRows); + + if (!failures.isEmpty()) { + StringBuilder sb = new StringBuilder(); + sb.append(file).append(": ").append(failures.size()).append(" of ") + .append(expectRows + roundtripRows).append(" assertions failed (") + .append(passed).append(" passed). First 25:\n"); + for (int i = 0; i < failures.size() && i < 25; i++) { + sb.append(" ").append(failures.get(i)).append('\n'); + } + throw new AssertionError(sb.toString()); + } + assertEquals(file, expectRows + roundtripRows, passed); + } + + /** The {@code expect} row: either a coordinate within tolerance, or a raise. */ + private static String checkExpect(Projection projection, GieCorpus.Row row) { + ProjCoordinate src = new ProjCoordinate(row.acceptX, row.acceptY); + ProjCoordinate dst = new ProjCoordinate(Double.NaN, Double.NaN); + RuntimeException raised = null; + try { + if (row.inverse) { + projection.inverseProject(src, dst); + } else { + projection.project(src, dst); + } + } catch (RuntimeException e) { + raised = e; + } + + if (row.kind == GieCorpus.FAILURE) { + if (raised != null) { + return null; + } + return row + ": expected failure" + + (row.errno == null ? "" : " (" + row.errno + ")") + + " but got " + dst.x + " " + dst.y; + } + + if (raised != null) { + return row + ": expected " + row.expectX + " " + row.expectY + " but raised " + + raised.getClass().getSimpleName() + ": " + raised.getMessage(); + } + // A NaN ordinate is never a pass, even against a NaN expectation: the corpus rows here + // are all finite. + double d = residualMetres(row.inverse, projection, dst.x, dst.y, row.expectX, row.expectY); + if (!(d <= row.toleranceMetres)) { + return row + ": got " + dst.x + " " + dst.y + ", expected " + row.expectX + " " + + row.expectY + " - deviation " + (d * 1000) + " mm, tolerance " + + (row.toleranceMetres * 1000) + " mm"; + } + return null; + } + + /** + * {@code roundtrip n}: {@code n} forwards and {@code n} inverses, phased as + * {@code trans.cpp:591} phases them, then the input-side metric against the original + * {@code accept} coordinate. + */ + private static String checkRoundtrip(Projection projection, GieCorpus.Row row) { + boolean forward = !row.inverse; + ProjCoordinate t = new ProjCoordinate(row.acceptX, row.acceptY); + try { + t = step(projection, t, forward); + for (int i = 1; i < row.roundtrip; i++) { + t = step(projection, t, !forward); + t = step(projection, t, forward); + } + t = step(projection, t, !forward); + } catch (RuntimeException e) { + return row + ": roundtrip " + row.roundtrip + " raised " + + e.getClass().getSimpleName() + ": " + e.getMessage(); + } + + // proj_angular_input: a forward roundtrip starts and ends on the angular side. + double d = forward + ? greatCircleMetres(projection, row.acceptX, row.acceptY, t.x, t.y) + : Math.hypot(t.x - row.acceptX, t.y - row.acceptY); + if (!(d <= row.toleranceMetres)) { + return row + ": roundtrip " + row.roundtrip + " returned " + t.x + " " + t.y + + ", deviation " + (d * 1000) + " mm, tolerance " + + (row.toleranceMetres * 1000) + " mm"; + } + return null; + } + + private static ProjCoordinate step(Projection projection, ProjCoordinate in, boolean forward) { + ProjCoordinate out = new ProjCoordinate(Double.NaN, Double.NaN); + if (forward) { + projection.project(in, out); + } else { + projection.inverseProject(in, out); + } + return out; + } + + /** + * The Euclidean branch for a projected target, the geodesic branch for an angular one. + * {@code inverse} rows have a lat/lon target, so their residual is angular. + */ + private static double residualMetres(boolean inverse, Projection projection, + double gotX, double gotY, double wantX, double wantY) { + if (inverse) { + return greatCircleMetres(projection, gotX, gotY, wantX, wantY); + } + return Math.hypot(gotX - wantX, gotY - wantY); + } + + /** + * Great-circle distance in metres between two lon/lat pairs in degrees, on the operation's + * own radius. Stands in for {@code gie}'s geodesic; see the class comment. + */ + private static double greatCircleMetres(Projection projection, double lon1, double lat1, + double lon2, double lat2) { + double r = projection.getEquatorRadius(); + double p1 = lat1 * Math.PI / 180.0; + double p2 = lat2 * Math.PI / 180.0; + double dp = p2 - p1; + double dl = (lon2 - lon1) * Math.PI / 180.0; + double s = Math.sin(dp / 2) * Math.sin(dp / 2) + + Math.cos(p1) * Math.cos(p2) * Math.sin(dl / 2) * Math.sin(dl / 2); + return 2 * r * Math.asin(Math.min(1.0, Math.sqrt(s))); + } + + /** The corpus is where it is claimed to be, and it is the size it is claimed to be. */ + @Test + public void corpusIsPresentAndWhole() { + assertTrue(GieCorpus.directory().resolve(file).toString(), + GieCorpus.directory().resolve(file).toFile().isFile()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsOperations.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsOperations.java new file mode 100644 index 0000000..e3967b3 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsOperations.java @@ -0,0 +1,150 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.PeirceQuincuncialProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpilhausProjection; + +/** + * Builds a {@link Projection} from the proj-string on a {@code .gie} {@code operation} line, + * for the six operators of the adams family only. + * + *

Why this does not go through {@code Proj4Parser}. {@code Proj4Parser} has no + * dispatch for {@code +shape}, {@code +scrollx}, {@code +scrolly}, {@code +azi} or + * {@code +rot}. In its default {@code PROJ_COMPATIBLE} mode an unrecognised key is retained + * and ignored, exactly as PROJ's {@code init.cpp} does, so + * {@code +proj=peirce_q +shape=square} parses cleanly and then projects as a + * diamond — the default. Routing this test through the parser would therefore + * measure the parser's gap rather than the projection's arithmetic, and would report every + * non-default {@code peirce_q} block as a numeric failure with no indication of why. The gap + * itself is asserted separately by {@link ParserParameterGapTest}, which is where a future + * parser change will show up. + * + *

The registry is used to resolve {@code +proj=}, so that a missing + * {@code register(...)} line fails this test rather than being papered over by a {@code new}. + */ +final class AdamsOperations { + + private static final Registry REGISTRY = new Registry(); + + private AdamsOperations() { + } + + /** + * @param definition the text after {@code operation}, e.g. + * {@code "+proj=peirce_q +R=6370997 +shape=square"} + */ + static Projection build(String definition) { + String[] token = definition.trim().split("\\s+"); + + String name = null; + Double radius = null; + String ellps = null; + Double lon0 = null; + Double lat0 = null; + Double k0 = null; + String shape = null; + Double scrollx = null; + Double scrolly = null; + Double azi = null; + Double rot = null; + + for (String t : token) { + String kv = t.startsWith("+") ? t.substring(1) : t; + int eq = kv.indexOf('='); + String key = eq < 0 ? kv : kv.substring(0, eq); + String value = eq < 0 ? null : kv.substring(eq + 1); + if ("proj".equals(key)) { + name = value; + } else if ("R".equals(key)) { + radius = Double.valueOf(value); + } else if ("ellps".equals(key)) { + ellps = value; + } else if ("lon_0".equals(key)) { + lon0 = Double.valueOf(value); + } else if ("lat_0".equals(key)) { + lat0 = Double.valueOf(value); + } else if ("k_0".equals(key) || "k".equals(key)) { + k0 = Double.valueOf(value); + } else if ("shape".equals(key)) { + shape = value; + } else if ("scrollx".equals(key)) { + scrollx = Double.valueOf(value); + } else if ("scrolly".equals(key)) { + scrolly = Double.valueOf(value); + } else if ("azi".equals(key)) { + azi = Double.valueOf(value); + } else if ("rot".equals(key)) { + rot = Double.valueOf(value); + } else { + throw new IllegalArgumentException( + "unhandled key +" + key + " in operation: " + definition); + } + } + + Projection projection = REGISTRY.getProjection(name); + if (projection == null) { + throw new IllegalStateException("+proj=" + name + " is not registered"); + } + + // ell_set.cpp:92-100: +R short-circuits everything else and declares a sphere. Without + // +R or +ellps, init.cpp:327 supplies +ellps=GRS80. + if (radius != null) { + projection.setEllipsoid(Ellipsoid.SPHERE); + projection.setRadius(radius.doubleValue()); + } else if (ellps != null) { + Ellipsoid resolved = REGISTRY.getEllipsoid(ellps); + if (resolved == null) { + throw new IllegalStateException("+ellps=" + ellps + " is not known"); + } + projection.setEllipsoid(resolved); + } else { + projection.setEllipsoid(Ellipsoid.GRS80); + } + + if (lon0 != null) { + projection.setProjectionLongitudeDegrees(lon0.doubleValue()); + } + if (lat0 != null) { + projection.setProjectionLatitudeDegrees(lat0.doubleValue()); + } + if (k0 != null) { + projection.setScaleFactor(k0.doubleValue()); + } + if (shape != null) { + ((PeirceQuincuncialProjection) projection).setShape(shape); + } + if (scrollx != null) { + ((PeirceQuincuncialProjection) projection).setScrollX(scrollx.doubleValue()); + } + if (scrolly != null) { + ((PeirceQuincuncialProjection) projection).setScrollY(scrolly.doubleValue()); + } + if (azi != null) { + ((SpilhausProjection) projection).setAziDegrees(azi.doubleValue()); + } + if (rot != null) { + ((SpilhausProjection) projection).setRotDegrees(rot.doubleValue()); + } + + projection.initialize(); + return projection; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsRegistrationAndParserGapTest.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsRegistrationAndParserGapTest.java new file mode 100644 index 0000000..8c4c43d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/AdamsRegistrationAndParserGapTest.java @@ -0,0 +1,398 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.parser.Proj4Keyword; +import org.locationtech.proj4j.proj.AdamsHemisphereProjection; +import org.locationtech.proj4j.proj.AdamsWorldInASquareIIProjection; +import org.locationtech.proj4j.proj.AdamsWorldInASquareIProjection; +import org.locationtech.proj4j.proj.GuyouProjection; +import org.locationtech.proj4j.proj.PeirceQuincuncialProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpilhausProjection; + +/** + * Registration of the six new operators, and — since the parser gap was closed — the proof that + * all six are drivable from a proj-string. + * + *

What the gap was

+ * + *

{@code Proj4Parser.parseProjection} used to have no dispatch for {@code +shape}, + * {@code +scrollx}, {@code +scrolly}, {@code +azi} or {@code +rot}. Because + * {@code ParseMode.PROJ_COMPATIBLE} retains and ignores an unrecognised key — which is + * PROJ-faithful and correct — {@code +proj=peirce_q +shape=square} parsed cleanly and then + * projected as a diamond: a silent wrong answer. All 29 {@code operation} lines in + * {@code peirce_q.gie} carry {@code +shape}, so its 592 assertions were unreachable, as were 8 of + * {@code spilhaus.gie}'s. + * + *

The assertions in this file used to pin that wrong-but-silent behaviour in place so that + * closing the gap would fail a test rather than passing quietly. They are now inverted: the + * five keys are dispatched by {@code Proj4Parser}, listed by + * {@code Proj4Keyword.supportedParameters()}, and classified {@code HONOURED} by the conformance + * bridge's {@code Proj4jCapabilities}. Those three files must move together — the bridge asserts + * that every allow-list key is classified. + * + *

{@link #everyAssertionInPeirceQAndSpilhausHoldsThroughTheParser()} is the load-bearing test + * of the three: it runs the whole of {@code peirce_q.gie} and {@code spilhaus.gie} through + * {@link CRSFactory}, so a future regression in the dispatch shows up as 600 failing assertions + * rather than as a quietly-defaulted parameter. {@link AdamsFamilyCorpusTest} runs the same rows + * through {@link AdamsOperations}, which sets the parameters directly; the two together separate + * "the arithmetic is wrong" from "the parser did not deliver the parameter". + */ +public class AdamsRegistrationAndParserGapTest { + + private final Registry registry = new Registry(); + private final CRSFactory factory = new CRSFactory(); + + /** All six resolve by their PROJ {@code +proj=} name. */ + @Test + public void allSixAreRegisteredUnderTheirProjNames() { + assertEquals(GuyouProjection.class, registry.getProjection("guyou").getClass()); + assertEquals(PeirceQuincuncialProjection.class, + registry.getProjection("peirce_q").getClass()); + assertEquals(AdamsHemisphereProjection.class, + registry.getProjection("adams_hemi").getClass()); + assertEquals(AdamsWorldInASquareIProjection.class, + registry.getProjection("adams_ws1").getClass()); + assertEquals(AdamsWorldInASquareIIProjection.class, + registry.getProjection("adams_ws2").getClass()); + assertEquals(SpilhausProjection.class, registry.getProjection("spilhaus").getClass()); + } + + /** And through {@code CRSFactory}, which is how a caller actually reaches them. */ + @Test + public void allSixParseAsProjStrings() { + for (String name : new String[] { + "guyou", "peirce_q", "adams_hemi", "adams_ws1", "adams_ws2", "spilhaus"}) { + CoordinateReferenceSystem crs = + factory.createFromParameters(name, "+proj=" + name + " +R=6370997"); + assertNotNull(name, crs); + assertEquals(name, name, crs.getProjection().getName()); + } + } + + /** + * {@code spilhaus}'s non-zero {@code lon_0}/{@code lat_0} defaults survive the parser, and an + * explicit value overrides them. + */ + @Test + public void spilhausDefaultsSurviveTheParserAndAreOverridable() { + Projection defaulted = factory + .createFromParameters("s", "+proj=spilhaus +R=6378137").getProjection(); + assertEquals(SpilhausProjection.DEFAULT_LON_0_DEGREES, + defaulted.getProjectionLongitudeDegrees(), 1e-9); + assertEquals(SpilhausProjection.DEFAULT_LAT_0_DEGREES, + defaulted.getProjectionLatitudeDegrees(), 1e-9); + + Projection overridden = factory.createFromParameters("s", + "+proj=spilhaus +R=6378137 +lon_0=0 +lat_0=0").getProjection(); + assertEquals(0.0, overridden.getProjectionLongitudeDegrees(), 0.0); + assertEquals(0.0, overridden.getProjectionLatitudeDegrees(), 0.0); + } + + /** + * Inverted. {@code +shape=square} now builds a square, and the absence of + * {@code +shape} still means {@code diamond} ({@code adams.cpp:408-410}). + */ + @Test + public void shapeIsHonouredByTheParser() { + PeirceQuincuncialProjection square = (PeirceQuincuncialProjection) factory + .createFromParameters("p", "+proj=peirce_q +R=6370997 +shape=square") + .getProjection(); + assertEquals(PeirceQuincuncialProjection.Shape.SQUARE, square.getShape()); + assertEquals(0.0, square.getScrollX(), 0.0); + assertEquals(0.0, square.getScrollY(), 0.0); + + PeirceQuincuncialProjection defaulted = (PeirceQuincuncialProjection) factory + .createFromParameters("p", "+proj=peirce_q +R=6370997").getProjection(); + assertEquals("no +shape still means diamond, not square", + PeirceQuincuncialProjection.Shape.DIAMOND, defaulted.getShape()); + } + + /** Inverted. Likewise {@code +azi} and {@code +rot} on {@code spilhaus}. */ + @Test + public void aziAndRotAreHonouredByTheParser() { + SpilhausProjection p = (SpilhausProjection) factory + .createFromParameters("s", "+proj=spilhaus +R=6378137 +azi=9.1 +rot=40.1") + .getProjection(); + assertEquals(9.1 * Math.PI / 180.0, p.getAzi(), 1e-15); + assertEquals(40.1 * Math.PI / 180.0, p.getRot(), 1e-15); + + SpilhausProjection defaulted = (SpilhausProjection) factory + .createFromParameters("s", "+proj=spilhaus +R=6378137").getProjection(); + assertEquals(SpilhausProjection.DEFAULT_AZI_DEGREES * Math.PI / 180.0, + defaulted.getAzi(), 1e-15); + assertEquals(SpilhausProjection.DEFAULT_ROT_DEGREES * Math.PI / 180.0, + defaulted.getRot(), 1e-15); + } + + /** + * Inverted. All five keys are in {@code Proj4Keyword.supportedParameters()}, which is + * what {@code ParseMode.STRICT} enforces and what the conformance bridge's capability table is + * asserted against. + * + *

{@code azi} was the interesting one: it was already declared as a {@code Proj4Keyword} + * constant and was simply never added to the set and never read. + */ + @Test + public void theFiveKeysAreInTheAllowList() { + for (String key : new String[] {"shape", "scrollx", "scrolly", "azi", "rot"}) { + assertTrue("+" + key + " must be in the allow-list, or ParseMode.STRICT rejects a " + + "definition the parser now honours", + Proj4Keyword.supportedParameters().contains(key)); + } + } + + /** + * Retain-and-ignore is still the rule for keys nobody reads, which is what + * {@code init.cpp} does and what {@code builtins.gie}'s non-strict block requires. + */ + @Test + public void genuinelyUnrecognisedKeysStillDoNotFailTheParse() { + assertNotNull(factory.createFromParameters("p", + "+proj=peirce_q +R=6370997 +shape=horizontal +unknown_keyword=1")); + } + + // ------------------------------------------------------------------ the corpus, via the parser + + /** + * The two files the gap made unreachable, run end to end through {@link CRSFactory}: 592 + * assertions in {@code peirce_q.gie} and 133 in {@code spilhaus.gie}. + * + *

The expected values are dense point grids read from the vendored corpus rather than + * transcribed. The metric follows {@link AdamsFamilyCorpusTest}: Euclidean metres against a + * projected target, great-circle metres against an angular one, and {@code !(d <= tol)} so + * that {@code NaN} fails rather than passing. + */ + @Test + public void everyAssertionInPeirceQAndSpilhausHoldsThroughTheParser() { + check("peirce_q.gie", 545, 47); + check("spilhaus.gie", 74, 59); + } + + /** + * Every distinct {@code operation} in the two files is accepted by the parser, and the + * {@code peirce_q} ones cover all six shapes plus both scroll variants — so + * {@link #everyAssertionInPeirceQAndSpilhausHoldsThroughTheParser()} cannot pass while + * silently exercising only the default arrangement. + */ + @Test + public void everyOperationInTheTwoFilesParsesAndTheShapesAreAllCovered() { + Set seen = + new LinkedHashSet(); + int scrolled = 0; + for (String operation : operations("peirce_q.gie")) { + PeirceQuincuncialProjection p = + (PeirceQuincuncialProjection) build(operation).getProjection(); + seen.add(p.getShape()); + if (p.getScrollX() != 0.0 || p.getScrollY() != 0.0) { + scrolled++; + } + } + assertEquals("all six +shape arrangements appear in peirce_q.gie and must all arrive", + PeirceQuincuncialProjection.Shape.values().length, seen.size()); + assertEquals("peirce_q.gie has one +scrollx block and one +scrolly block", 2, scrolled); + + for (String operation : operations("spilhaus.gie")) { + assertNotNull(operation, build(operation)); + } + } + + private void check(String file, int expectedExpectRows, int expectedRoundtripRows) { + List rows = GieCorpus.read(file); + Map cache = new HashMap(); + List failures = new ArrayList(); + int expectRows = 0; + int roundtripRows = 0; + + for (GieCorpus.Row row : rows) { + if (row.kind == GieCorpus.NO_EXPECTATION && row.roundtrip == 0) { + continue; + } + Projection projection = cache.get(row.operation); + if (projection == null) { + projection = build(row.operation).getProjection(); + cache.put(row.operation, projection); + } + if (row.kind != GieCorpus.NO_EXPECTATION) { + expectRows++; + add(failures, checkExpect(projection, row)); + } + if (row.roundtrip > 0) { + roundtripRows++; + add(failures, checkRoundtrip(projection, row)); + } + } + + assertEquals(file + ": expect row count", expectedExpectRows, expectRows); + assertEquals(file + ": roundtrip row count", expectedRoundtripRows, roundtripRows); + if (!failures.isEmpty()) { + StringBuilder sb = new StringBuilder(); + sb.append(file).append(": ").append(failures.size()).append(" of ") + .append(expectRows + roundtripRows) + .append(" assertions failed through Proj4Parser. First 25:\n"); + for (int i = 0; i < failures.size() && i < 25; i++) { + sb.append(" ").append(failures.get(i)).append('\n'); + } + throw new AssertionError(sb.toString()); + } + } + + private static void add(List failures, String failure) { + if (failure != null) { + failures.add(failure); + } + } + + /** + * The whole point: the definition goes through {@code Proj4Parser} and nothing else. + * + *

The one addition is PROJ's own implicit {@code +ellps=GRS80} + * ({@code init.cpp:317-360}), appended when the definition names no datum, ellipsoid, size or + * shape. Six of {@code spilhaus.gie}'s thirteen blocks rely on it, and {@code spilhaus} is the + * one operator in this family that keeps its eccentricity, so GRS80's {@code rf} versus + * proj4j's own default is worth a few tenths of a millimetre against a 1.5 mm tolerance — + * i.e. enough to matter. {@code Proj4Parser} does not model the implicit append itself; the + * conformance bridge does, in {@code GieProjArgs.impliesGrs80()}. + */ + private CoordinateReferenceSystem build(String operation) { + return factory.createFromParameters("gie", withImplicitGrs80(operation)); + } + + /** {@code init.cpp:317-360}'s suppression list, verbatim. */ + private static final String[] SUPPRESSES_IMPLICIT_GRS80 = { + "no_defs", "datum", "ellps", "a", "b", "rf", "f", "e", "es", "R"}; + + private static String withImplicitGrs80(String operation) { + for (String token : operation.trim().split("\\s+")) { + String kv = token.startsWith("+") ? token.substring(1) : token; + int eq = kv.indexOf('='); + String key = eq < 0 ? kv : kv.substring(0, eq); + for (String suppressor : SUPPRESSES_IMPLICIT_GRS80) { + if (suppressor.equals(key)) { + return operation; + } + } + } + return operation + " +ellps=GRS80"; + } + + /** The distinct {@code operation} definitions of a {@code .gie} file, in order. */ + private static Set operations(String file) { + Set operations = new LinkedHashSet(); + for (GieCorpus.Row row : GieCorpus.read(file)) { + operations.add(row.operation); + } + return operations; + } + + private static String checkExpect(Projection projection, GieCorpus.Row row) { + ProjCoordinate src = new ProjCoordinate(row.acceptX, row.acceptY); + ProjCoordinate dst = new ProjCoordinate(Double.NaN, Double.NaN); + RuntimeException raised = null; + try { + if (row.inverse) { + projection.inverseProject(src, dst); + } else { + projection.project(src, dst); + } + } catch (RuntimeException e) { + raised = e; + } + + if (row.kind == GieCorpus.FAILURE) { + return raised != null ? null + : row + ": expected failure but got " + dst.x + " " + dst.y; + } + if (raised != null) { + return row + ": expected " + row.expectX + " " + row.expectY + " but raised " + + raised.getClass().getSimpleName() + ": " + raised.getMessage(); + } + double d = row.inverse + ? greatCircleMetres(projection, dst.x, dst.y, row.expectX, row.expectY) + : Math.hypot(dst.x - row.expectX, dst.y - row.expectY); + if (!(d <= row.toleranceMetres)) { + return row + ": got " + dst.x + " " + dst.y + ", expected " + row.expectX + " " + + row.expectY + " - deviation " + (d * 1000) + " mm, tolerance " + + (row.toleranceMetres * 1000) + " mm"; + } + return null; + } + + private static String checkRoundtrip(Projection projection, GieCorpus.Row row) { + boolean forward = !row.inverse; + ProjCoordinate t = new ProjCoordinate(row.acceptX, row.acceptY); + try { + t = step(projection, t, forward); + for (int i = 1; i < row.roundtrip; i++) { + t = step(projection, t, !forward); + t = step(projection, t, forward); + } + t = step(projection, t, !forward); + } catch (RuntimeException e) { + return row + ": roundtrip " + row.roundtrip + " raised " + + e.getClass().getSimpleName() + ": " + e.getMessage(); + } + double d = forward + ? greatCircleMetres(projection, row.acceptX, row.acceptY, t.x, t.y) + : Math.hypot(t.x - row.acceptX, t.y - row.acceptY); + if (!(d <= row.toleranceMetres)) { + return row + ": roundtrip " + row.roundtrip + " returned " + t.x + " " + t.y + + ", deviation " + (d * 1000) + " mm, tolerance " + + (row.toleranceMetres * 1000) + " mm"; + } + return null; + } + + private static ProjCoordinate step(Projection projection, ProjCoordinate in, boolean forward) { + ProjCoordinate out = new ProjCoordinate(Double.NaN, Double.NaN); + if (forward) { + projection.project(in, out); + } else { + projection.inverseProject(in, out); + } + return out; + } + + private static double greatCircleMetres(Projection projection, double lon1, double lat1, + double lon2, double lat2) { + double r = projection.getEquatorRadius(); + double p1 = lat1 * Math.PI / 180.0; + double p2 = lat2 * Math.PI / 180.0; + double dp = p2 - p1; + double dl = (lon2 - lon1) * Math.PI / 180.0; + double s = Math.sin(dp / 2) * Math.sin(dp / 2) + + Math.cos(p1) * Math.cos(p2) * Math.sin(dl / 2) * Math.sin(dl / 2); + return 2 * r * Math.asin(Math.min(1.0, Math.sqrt(s))); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/EllipticIntegralTest.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/EllipticIntegralTest.java new file mode 100644 index 0000000..d6353a4 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/EllipticIntegralTest.java @@ -0,0 +1,157 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.util.EllipticIntegral; + +/** + * Pins the constants and the series in {@link EllipticIntegral} against PROJ 9.8.1's + * {@code src/projections/adams.cpp}. + * + *

These are not accuracy tests. Every one of them asserts bit or near-bit fidelity to an + * approximation upstream chose, because the 3,443 expected values in the corpus for this + * family were generated by that approximation. A change that makes any of these assertions fail + * by "improving" the mathematics breaks roughly 3,400 conformance assertions. + */ +public class EllipticIntegralTest { + + /** + * {@code adams.cpp:81} writes {@code RSQRT2} as a 28-digit decimal. The nearest + * {@code double} to it is exactly {@code Math.sqrt(0.5)} and exactly one ulp away from + * {@code 1.0 / Math.sqrt(2.0)}. + * + *

The negative half of this is the point: the two spellings of "one over root two" are + * different doubles, and only one of them is upstream's. + */ + @Test + public void rsqrt2IsSqrtOfAHalfAndNotOneOverSqrtTwo() { + assertEquals("RSQRT2 must be bit-equal to Math.sqrt(0.5)", + Double.doubleToLongBits(Math.sqrt(0.5)), + Double.doubleToLongBits(EllipticIntegral.RSQRT2)); + + assertNotEquals("1.0/Math.sqrt(2.0) is one ulp away from adams.cpp's RSQRT2 and must not " + + "be substituted for it", + Double.doubleToLongBits(1.0 / Math.sqrt(2.0)), + Double.doubleToLongBits(EllipticIntegral.RSQRT2)); + + // Exactly one ulp apart, and 1/sqrt(2) is the smaller of the two: + // adams.cpp's RSQRT2 0x1.6a09e667f3bcdp-1 + // 1.0/Math.sqrt(2.0) 0x1.6a09e667f3bccp-1 + assertEquals(Math.nextDown(EllipticIntegral.RSQRT2), 1.0 / Math.sqrt(2.0), 0.0); + assertEquals(-1L, Double.doubleToLongBits(1.0 / Math.sqrt(2.0)) + - Double.doubleToLongBits(EllipticIntegral.RSQRT2)); + } + + /** {@code M_2_PI} inside {@code ell_int_5} is bit-equal to Java's {@code 2.0 / Math.PI}. */ + @Test + public void twoOverPiIsBitEqualToTheCMacro() { + assertEquals(Double.doubleToLongBits(0.63661977236758134308), + Double.doubleToLongBits(2.0 / Math.PI)); + } + + /** + * {@code ellInt5(pi/2)} is {@code 1.854074716833181} — not the true + * {@code K(1/2) = 1.854074677301372}, and not {@link EllipticIntegral#K_HALF}. The two + * constants coexist inside one upstream function on purpose. + */ + @Test + public void seriesAtPiOverTwoIsNotTheAccurateK() { + double series = EllipticIntegral.ellInt5(Math.PI / 2); + assertEquals(1.854074716833181, series, 1e-15); + + assertNotEquals("the series value and the accurate K(1/2) literal must stay distinct", + Double.doubleToLongBits(series), + Double.doubleToLongBits(EllipticIntegral.K_HALF)); + + // 3.95e-08 apart: 0.25 m at +R=6370997, i.e. 250x the 1 mm gie tolerance. + double delta = series - EllipticIntegral.K_HALF; + assertEquals(3.9531809e-08, delta, 1e-14); + assertTrue("the gap is 0.25 m at +R=6370997", delta * 6370997 > 0.25); + } + + /** {@code K_HALF} is {@code adams.cpp:209}'s literal, and {@code shd} is twice it. */ + @Test + public void peirceShiftIsTwiceTheAccurateK() { + assertEquals(1.8540746773013719, EllipticIntegral.K_HALF, 0.0); + assertEquals(3.7081493546027438, EllipticIntegral.PEIRCE_SHIFT, 0.0); + } + + /** + * {@code guyou}'s pole constant is the truncated literal {@code 1.85407}, five decimals, and + * is 30 m from the series value at {@code +R=6370997}. {@code guyou.gie:2122-2131} asserts it + * at {@code +R=1} with a 1 mm tolerance. + */ + @Test + public void guyouPoleIsTheTruncatedLiteral() { + assertEquals(1.85407, EllipticIntegral.GUYOU_POLE, 0.0); + double gap = EllipticIntegral.ellInt5(Math.PI / 2) - EllipticIntegral.GUYOU_POLE; + assertEquals(30.05, gap * 6370997, 0.05); + } + + /** + * The series is odd in {@code phi} exactly: the Chebyshev argument depends on + * {@code phi^2} and the result is scaled by {@code phi}. Callers pass signed amplitudes and + * rely on it. + */ + @Test + public void seriesIsExactlyOdd() { + for (double phi = 0; phi <= Math.PI / 2; phi += 0.01) { + assertEquals(-EllipticIntegral.ellInt5(phi), EllipticIntegral.ellInt5(-phi), 0.0); + } + assertEquals(0.0, EllipticIntegral.ellInt5(0.0), 0.0); + } + + /** + * Values recomputed independently at 60 decimal digits from the Clenshaw recurrence with + * upstream's coefficients, so a coefficient transcription slip or a reversed loop shows up + * here rather than 3,400 assertions later. + */ + @Test + public void seriesMatchesAnIndependentEvaluationOfTheSameRecurrence() { + assertEquals(0.100083357563412578, EllipticIntegral.ellInt5(0.1), 1e-14); + assertEquals(0.510467156346209038, EllipticIntegral.ellInt5(0.5), 1e-14); + assertEquals(1.083216798343482417, EllipticIntegral.ellInt5(1.0), 1e-14); + assertEquals(1.613684817095107004, EllipticIntegral.ellInt5(1.4), 1e-14); + assertEquals(1.854074716833181079, EllipticIntegral.ellInt5(Math.PI / 2), 1e-14); + } + + /** + * The series is worse than a true elliptic integral by 420x the corpus tolerance, + * and that is the whole point. Measured at upstream's own worst case, {@code phi = 1.27699}. + * + *

{@code F(1.27699 | 1/2)} was computed to 60 digits by Carlson {@code RF} duplication + * outside this repository; the value is inlined because building a Carlson implementation in + * {@code core} is exactly what the port must not do. + */ + @Test + public void seriesIsFarFromTheTrueIntegralAtItsWorstPoint() { + double phi = 1.27699; + double trueValue = 1.4442330049580361; + double error = Math.abs(EllipticIntegral.ellInt5(phi) - trueValue); + assertEquals(6.614043e-08, error, 1e-13); + assertTrue("0.42 m at +R=6370997 - 420x the 1 mm gie tolerance", + error * 6370997 > 0.42); + assertFalse("if this ever becomes accurate, ~3,400 gie assertions break", + error * 6370997 < 0.001); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/GenericInverse2DTest.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/GenericInverse2DTest.java new file mode 100644 index 0000000..5332ea9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/GenericInverse2DTest.java @@ -0,0 +1,197 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.util.GenericInverse2D; + +/** + * {@link GenericInverse2D} against {@code 9.8.1:src/generic_inverse.cpp:44-111}. + * + *

The thresholds in that file are not adjustable knobs: the {@code adams_ws2} and + * {@code peirce_q} seed cascades are tuned jointly to the 15-iteration budget and the + * {@code +/-0.3} step clamp, and {@code wink2} and {@code cass} will inherit the same routine. + * Each is asserted here rather than only implicitly through the corpus. + */ +public class GenericInverse2DTest { + + /** A linear map: one Newton step from any seed. */ + private static final GenericInverse2D.Forward2D LINEAR = + new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + dst.x = 2 * lam; + dst.y = 3 * phi; + } + }; + + /** + * The residual bound is on {@code (x, y)}, not on {@code (lam, phi)}, and the Jacobian is a + * finite-difference estimate — so the recovered angles are accurate to roughly + * {@code tolerance / scale}, not to the tolerance itself. Asserting more than that would be + * asserting something upstream does not promise. + */ + @Test + public void invertsALinearMap() { + ProjCoordinate out = GenericInverse2D.solve(2 * 0.4, 3 * 0.2, LINEAR, 0.0, 0.0, 1e-10, + new ProjCoordinate()); + assertEquals(0.4, out.x, 1e-10); + assertEquals(0.2, out.y, 1e-10); + } + + /** Upstream's bound is 15, and it is exact: the counter is what the seeds are tuned to. */ + @Test + public void iterationBoundIsFifteen() { + assertEquals(15, GenericInverse2D.MAX_ITERATIONS); + } + + /** + * The correction is clamped to {@code +/-0.3} radians per iteration + * ({@code generic_inverse.cpp:93,101}), so a seed further than {@code 15 * 0.3 = 4.5} + * radians of correction away cannot be reached inside the budget. That is the clamp's + * observable signature and the reason a bad seed fails rather than overshooting into another + * sheet. + */ + @Test + public void stepClampLimitsProgressToPointThreePerIteration() { + // A map whose scale makes the ideal first step 1.0 rad: with the clamp it takes four + // iterations, without it one. + GenericInverse2D.Forward2D unitScale = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + dst.x = lam; + dst.y = phi; + } + }; + // Reachable: 1.0 rad needs ceil(1.0/0.3) = 4 clamped steps, inside the budget. + ProjCoordinate near = GenericInverse2D.solve(1.0, 0.0, unitScale, 0.0, 0.0, 1e-10, + new ProjCoordinate()); + assertEquals(1.0, near.x, 1e-10); + + // Unreachable: 15 * 0.3 = 4.5 rad of correction is the ceiling, and pi is inside it + // while 4.6 would not be - but lam is also clamped to [-pi, pi], so ask for a phi + // target instead, where the clamp is [-pi/2, pi/2] and 1.5 rad is legal. + ProjCoordinate reachable = GenericInverse2D.solve(0.0, 1.5, unitScale, 0.0, 0.0, 1e-10, + new ProjCoordinate()); + assertEquals(1.5, reachable.y, 1e-10); + } + + /** {@code lam} is clamped to {@code [-pi, pi]} and {@code phi} to {@code [-pi/2, pi/2]}. */ + @Test + public void iteratesStayInsideTheAngularDomain() { + GenericInverse2D.Forward2D identity = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + dst.x = lam; + dst.y = phi; + assertTrue("lam left [-pi, pi]: " + lam, Math.abs(lam) <= Math.PI); + assertTrue("phi left [-pi/2, pi/2]: " + phi, + Math.abs(phi) <= Math.PI / 2 + 1e-15); + } + }; + try { + // Unreachable target: the solver must exhaust its budget without ever probing + // outside the domain. + GenericInverse2D.solve(100.0, 100.0, identity, 0.0, 0.0, 1e-10, new ProjCoordinate()); + fail("an unreachable target must raise"); + } catch (ProjectionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("did not converge")); + } + } + + /** + * Non-convergence raises. Upstream sets the errno and still returns the last iterate; + * {@code pj_inv}'s {@code error_or_coord} is what discards it. proj4j has no errno channel, so + * returning the last iterate would be a failure dressed as a plausible coordinate. + */ + @Test + public void nonConvergenceRaisesRatherThanReturningTheLastIterate() { + GenericInverse2D.Forward2D constant = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + dst.x = 1.0; + dst.y = 1.0; + } + }; + try { + GenericInverse2D.solve(0.0, 0.0, constant, 0.0, 0.0, 1e-10, new ProjCoordinate()); + fail("a constant forward map cannot converge and must raise"); + } catch (ProjectionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("did not converge")); + } + } + + /** + * A singular Jacobian is not an error: {@code det == 0} silently reuses the previous + * inverse Jacobian ({@code generic_inverse.cpp:83-89}). On iteration 0 that is the zero + * matrix, so no step is taken and the loop runs out — which is exactly what the constant map + * above demonstrates. Here the degeneracy is only in one variable, and the routine must not + * throw an arithmetic error on the way. + */ + @Test + public void singularJacobianIsNotAnArithmeticError() { + GenericInverse2D.Forward2D degenerate = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + dst.x = lam; + dst.y = lam; + } + }; + try { + GenericInverse2D.solve(0.5, 0.5, degenerate, 0.0, 0.0, 1e-10, new ProjCoordinate()); + } catch (ProjectionException expected) { + // Either outcome is acceptable; what must not happen is an unrelated exception. + assertTrue(expected.getMessage(), expected.getMessage().contains("did not converge")); + } + } + + /** + * The finite-difference probe points inward: {@code dLam = lam > 0 ? -1e-6 : 1e-6}. + * At {@code lam = pi} an outward probe would leave the domain, which for several projections + * in this family means an out-of-range {@code aacos}. + */ + @Test + public void finiteDifferenceProbePointsInward() { + final double[] minSeen = {Double.MAX_VALUE}; + final double[] maxSeen = {-Double.MAX_VALUE}; + GenericInverse2D.Forward2D recorder = new GenericInverse2D.Forward2D() { + @Override + public void forward(double lam, double phi, ProjCoordinate dst) { + minSeen[0] = Math.min(minSeen[0], lam); + maxSeen[0] = Math.max(maxSeen[0], lam); + dst.x = lam; + dst.y = phi; + } + }; + // Seeded exactly at +pi, with a target that is not already satisfied there, so the + // Jacobian block actually runs. Every probe must be at or below pi. + try { + GenericInverse2D.solve(Math.PI - 0.05, 0.0, recorder, Math.PI, 0.0, 1e-10, + new ProjCoordinate()); + } catch (ProjectionException ignored) { + // convergence is not the point here + } + assertTrue("probed above pi: " + maxSeen[0], maxSeen[0] <= Math.PI); + assertTrue("the inward probe must actually step down from pi", minSeen[0] < Math.PI); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/adams/GieCorpus.java b/core/src/test/java/org/locationtech/proj4j/proj/adams/GieCorpus.java new file mode 100644 index 0000000..ffb6aa3 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/adams/GieCorpus.java @@ -0,0 +1,280 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.adams; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +/** + * A deliberately minimal reader for the {@code accept}/{@code expect}/{@code roundtrip} rows of + * PROJ's {@code .gie} files, sufficient for the six files of the adams family and no more. + * + *

Why not reuse the conformance module's lexer. {@code core} must stay + * dependency-free, and the full lexer lives in a downstream module that is owned and evolving + * separately. Duplicating 90 lines of trivial state machine here is the cheaper coupling. This + * reader understands exactly six verbs — {@code operation}, {@code tolerance}, + * {@code direction}, {@code accept}, {@code expect}, {@code roundtrip} — and asserts at the end + * that it saw the number of rows the corpus is known to contain, so a silent parse regression + * cannot pass as a clean run. + * + *

The corpus files are read from the sibling {@code conformance} module's resources rather + * than copied. They are byte-identical to PROJ 9.8.1 and 8,900 lines long; a copy would rot. + * A missing file is a hard failure, not a skip: it is in the repository, and a silently skipped + * 3,443-assertion test is worse than no test. + */ +final class GieCorpus { + + /** {@code accept} without a following {@code expect} — the corpus has 49, all commented out. */ + static final int NO_EXPECTATION = 0; + + /** An {@code expect} of two numbers. */ + static final int NUMERIC = 1; + + /** An {@code expect failure}, with or without a named errno. */ + static final int FAILURE = 2; + + /** One {@code accept} plus whatever followed it. */ + static final class Row { + + final String file; + final int line; + /** The {@code operation} definition in force. */ + final String operation; + /** {@code true} when a {@code direction inverse} is in force. */ + final boolean inverse; + /** The {@code tolerance} in force, in metres. */ + final double toleranceMetres; + final double acceptX; + final double acceptY; + /** One of {@link #NO_EXPECTATION}, {@link #NUMERIC}, {@link #FAILURE}. */ + final int kind; + final double expectX; + final double expectY; + /** The errno name on an {@code expect failure errno } row, or null. */ + final String errno; + /** The {@code roundtrip} count, or 0 when the row has no {@code roundtrip}. */ + final int roundtrip; + + Row(String file, int line, String operation, boolean inverse, double toleranceMetres, + double acceptX, double acceptY, int kind, double expectX, double expectY, + String errno, int roundtrip) { + this.file = file; + this.line = line; + this.operation = operation; + this.inverse = inverse; + this.toleranceMetres = toleranceMetres; + this.acceptX = acceptX; + this.acceptY = acceptY; + this.kind = kind; + this.expectX = expectX; + this.expectY = expectY; + this.errno = errno; + this.roundtrip = roundtrip; + } + + @Override + public String toString() { + return file + ":" + line + " [" + operation + "] accept " + acceptX + " " + acceptY; + } + } + + private GieCorpus() { + } + + /** + * Locates {@code conformance/src/test/resources/gie}. Surefire runs with the module base + * directory as the working directory, so {@code ../conformance/...} resolves from + * {@code core/}; the {@code basedir} system property and the current directory itself are + * tried too, so the test also works from the repository root or from an IDE. + */ + static Path directory() { + List candidates = new ArrayList(); + String basedir = System.getProperty("basedir"); + if (basedir != null) { + candidates.add(Paths.get(basedir, "..", "conformance", "src", "test", "resources", + "gie")); + } + candidates.add(Paths.get("..", "conformance", "src", "test", "resources", "gie")); + candidates.add(Paths.get("conformance", "src", "test", "resources", "gie")); + for (Path p : candidates) { + if (Files.isDirectory(p)) { + return p; + } + } + throw new IllegalStateException( + "cannot locate conformance/src/test/resources/gie from " + Paths.get(".") + .toAbsolutePath().normalize() + "; tried " + candidates); + } + + /** + * Parses one {@code .gie} file. + * + * @param name the bare file name, e.g. {@code "guyou.gie"} + */ + static List read(String name) { + Path path = directory().resolve(name); + List rows = new ArrayList(); + + String operation = null; + boolean inverse = false; + // gie resets the tolerance to 0.5 mm on every `operation` (gie.cpp:651). + double tolerance = 0.0005; + boolean havePending = false; + int pendingLine = 0; + double pendingX = 0; + double pendingY = 0; + String pendingOperation = null; + boolean pendingInverse = false; + double pendingTolerance = 0; + + try (BufferedReader in = new BufferedReader(new InputStreamReader( + Files.newInputStream(path), StandardCharsets.UTF_8))) { + String raw; + int lineNumber = 0; + while ((raw = in.readLine()) != null) { + lineNumber++; + String line = strip(raw); + if (line.isEmpty()) { + continue; + } + String[] token = line.split("\\s+"); + String verb = token[0]; + + if ("operation".equals(verb)) { + // A pending accept does not survive a new operation. + havePending = false; + operation = line.substring(verb.length()).trim(); + inverse = false; + tolerance = 0.0005; + } else if ("direction".equals(verb)) { + inverse = token.length > 1 && "inverse".equals(token[1]); + } else if ("tolerance".equals(verb)) { + tolerance = parseTolerance(line.substring(verb.length()).trim(), path, + lineNumber); + } else if ("accept".equals(verb)) { + if (havePending) { + // The previous accept had no expect: record it so the row count + // reconciles, then replace it. + rows.add(new Row(name, pendingLine, pendingOperation, pendingInverse, + pendingTolerance, pendingX, pendingY, NO_EXPECTATION, 0, 0, null, + 0)); + } + havePending = true; + pendingLine = lineNumber; + pendingOperation = operation; + pendingInverse = inverse; + pendingTolerance = tolerance; + pendingX = Double.parseDouble(token[1]); + pendingY = Double.parseDouble(token[2]); + } else if ("expect".equals(verb)) { + if (!havePending) { + throw new IllegalStateException( + path + ":" + lineNumber + ": expect without accept"); + } + havePending = false; + if ("failure".equals(token[1])) { + String errno = token.length > 3 && "errno".equals(token[2]) + ? token[3] : null; + rows.add(new Row(name, pendingLine, pendingOperation, pendingInverse, + pendingTolerance, pendingX, pendingY, FAILURE, 0, 0, errno, 0)); + } else { + rows.add(new Row(name, pendingLine, pendingOperation, pendingInverse, + pendingTolerance, pendingX, pendingY, NUMERIC, + Double.parseDouble(token[1]), Double.parseDouble(token[2]), null, + 0)); + } + } else if ("roundtrip".equals(verb)) { + // gie's `roundtrip` reads the last accepted coordinate, which may or may not + // have had an `expect` of its own: spilhaus.gie is 59 bare + // accept/roundtrip pairs with no expect at all, while adams_ws2.gie and + // peirce_q.gie put roundtrip after an expect. Both shapes occur, so an + // outstanding accept is turned into its own row and only otherwise is the + // count attached to the row just recorded. + int n = token.length > 1 ? Integer.parseInt(token[1]) : 100; + if (havePending) { + havePending = false; + rows.add(new Row(name, pendingLine, pendingOperation, pendingInverse, + pendingTolerance, pendingX, pendingY, NO_EXPECTATION, 0, 0, null, + n)); + } else if (!rows.isEmpty()) { + Row last = rows.remove(rows.size() - 1); + rows.add(new Row(last.file, last.line, last.operation, last.inverse, + last.toleranceMetres, last.acceptX, last.acceptY, last.kind, + last.expectX, last.expectY, last.errno, n)); + } else { + throw new IllegalStateException( + path + ":" + lineNumber + ": roundtrip without a preceding accept"); + } + } + // Everything else - , , dashed separators - is ignored. + } + if (havePending) { + rows.add(new Row(name, pendingLine, pendingOperation, pendingInverse, + pendingTolerance, pendingX, pendingY, NO_EXPECTATION, 0, 0, null, 0)); + } + } catch (IOException e) { + throw new UncheckedIOException("reading " + path, e); + } + return rows; + } + + /** + * Strips a trailing {@code #} comment and surrounding whitespace, and drops the + * {@code } tags and the dashed separator lines. + */ + private static String strip(String raw) { + int hash = raw.indexOf('#'); + String line = (hash >= 0 ? raw.substring(0, hash) : raw).trim(); + if (line.startsWith("<") || line.startsWith("-")) { + return ""; + } + return line; + } + + /** + * {@code }. Only the units the six files actually use are accepted; an + * unrecognised one throws rather than being guessed at, because a silently mis-scaled + * tolerance is the failure mode this whole exercise exists to avoid. + */ + private static double parseTolerance(String text, Path path, int line) { + String[] token = text.split("\\s+"); + double value = Double.parseDouble(token[0]); + String unit = token.length > 1 ? token[1] : "m"; + if ("m".equals(unit)) { + return value; + } + if ("mm".equals(unit)) { + return value / 1000.0; + } + if ("cm".equals(unit)) { + return value / 100.0; + } + if ("km".equals(unit)) { + return value * 1000.0; + } + throw new IllegalStateException( + path + ":" + line + ": unsupported tolerance unit '" + unit + "'"); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/lsat/LandsatInverseTest.java b/core/src/test/java/org/locationtech/proj4j/proj/lsat/LandsatInverseTest.java new file mode 100644 index 0000000..c3bddcc --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/lsat/LandsatInverseTest.java @@ -0,0 +1,217 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.lsat; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.proj.Projection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code +proj=lsat} — Space Oblique Mercator for Landsat — had no inverse, while + * {@code LandsatProjection.hasInverse()} returned {@code true}. + * + *

The defect

+ * + *

The inverse existed in the file only as a commented-out block whose signature was + * {@code projectInverse(double, double, java.awt.geom.Point2D.Double)}. Even uncommented it would + * have overridden nothing — {@code Projection.projectInverse} takes a {@link ProjCoordinate} — and + * commented out it left {@code hasInverse()} returning {@code true} over the base class's + * identity. So an inverse transform out of an {@code lsat} CRS returned the projected + * metres straight back, reinterpreted as longitude and latitude in radians. At + * {@code (18241950, 9998257)} the old answer was {@code lon = 180 deg}, {@code lat = 90 deg} + * — the clamps in {@code inverseProjectRadians} tidying 1.05e9 degrees into something that looks + * like a coordinate. That is the third forbidden failure shape: a failure expressed as a plausible + * coordinate. + * + *

The fail-closed stream gated 18 other forward-only projections and moved 90 golden rows to + * {@code NO_INVERSE_AVAILABLE}, 75 of which had been {@code OK} in 1.4.3. {@code lsat} was outside + * its scope and stayed silently wrong. + * + *

Why it is implemented rather than gated

+ * + *

{@code lsat} does have an inverse upstream. + * {@code 9.8.1:src/projections/som.cpp} defines one {@code som_setup} shared by {@code som}, + * {@code misrsom} and {@code lsat}, and it assigns {@code P->inv = som_e_inverse} + * unconditionally for all three; {@code lsat} differs from {@code misrsom} only in + * {@code Q->rlm}, {@code Q->alf}, {@code Q->p22} and {@code P->lam0}. {@code builtins.gie:4058} + * asserts four {@code direction inverse} rows against it. Returning {@code false} from + * {@code hasInverse()} would have been a fail-closed lie about a projection that is invertible. + * + *

References

+ * + *

Pinned with the {@code proj} CLI at 9.8.1, not {@code cs2cs}: {@code cs2cs} promotes + * both datum-less sides to full CRSs and does not give the bare projection. Command: + * + *

+ * proj -I -f '%.12f' +proj=lsat +lsat=1 +path=120 +ellps=GRS80
+ * 
+ * + *

{@code +lsat=1 +path=120} because {@code LandsatProjection.initialize()} hard-codes those two + * — the {@code pj_param} lookups are still {@code FIXME}s, owned by the parameter-parsing work — + * so those are the values the Java object actually holds regardless of what the string says. + * Fixing that is not this change; every reference here is pinned to the configuration proj4j + * really builds, so the numbers stay meaningful until it is. + */ +public class LandsatInverseTest { + + private static final String SPEC = "+proj=lsat +ellps=GRS80"; + + /** {@code x, y, expected lon (deg), expected lat (deg)} from {@code proj} 9.8.1. */ + private static final double[][] INVERSE_REFERENCES = { + {18241950.014558550, 9998256.839822935, -167.243027865279, 0.999999968972}, + {38716066.260231376, -10782123.899122790, 1.999999848447, 1.000000027861}, + {38180602.096364856, -10525261.769020729, 2.000000071685, -0.999999941928}, + {39036973.116934061, -9755401.179111505, -1.999999685261, 1.000000008081}, + {38556530.040871613, -9565777.310432356, -2.000000295611, -0.999999981657}, + {15129439.361304788, 163464.055640934, 129.999999990699, 44.999999999602}, + {23498812.644032214, -116918.378588834, 120.000000032071, -29.999999985404}, + {40034527.266087197, -2957487.604201536, -43.239999735881, 0.000000020076}, + {49361816.436919674, -3660001.500377729, 0.000000271548, 60.000000030222}, + {33699465.325303867, 2355654.954105128, -100.000000346009, -55.000000009721}, + {200, 100, -43.242604053916, 0.001723782240}, + {-200, -100, -43.240503515805, -0.001723782240}, + {1000000, 500000, -48.543067871543, 8.593545577286}, + {-5000000, 2000000, -63.352485376498, -43.600515382404}, + {0, 0, -43.241553784861, 0.000000000000}, + }; + + private static Projection lsat(String spec) { + return new CRSFactory().createFromParameters("t", spec).getProjection(); + } + + /** + * The regression guard proper. If {@code projectInverse} is ever removed, renamed, or given a + * signature that does not override the base method again, this fails first and says why. + */ + @Test + public void theInverseIsNotTheBaseClassIdentity() { + Projection p = lsat(SPEC); + assertTrue("hasInverse() must stay true; lsat is invertible upstream", p.hasInverse()); + ProjCoordinate src = new ProjCoordinate(18241950.014558550, 9998256.839822935); + ProjCoordinate dst = new ProjCoordinate(); + p.inverseProject(src, dst); + assertTrue("the base-class identity would return the projected metres as radians and " + + "the clamps would tidy them into (180, 90); got (" + dst.x + ", " + + dst.y + ")", + Math.abs(dst.x) < 180.0 && Math.abs(dst.y) < 90.0); + assertTrue("latitude is nowhere near the clamp", Math.abs(dst.y) < 5.0); + } + + @Test + public void inverseMatchesProj981() { + Projection p = lsat(SPEC); + ProjCoordinate src = new ProjCoordinate(); + ProjCoordinate dst = new ProjCoordinate(); + // 1e-9 deg is about 0.1 mm; the printed references carry 12 decimals, so the bar is + // limited by the reference text, not by the implementation. + final double tol = 2e-9; + for (double[] r : INVERSE_REFERENCES) { + src.x = r[0]; + src.y = r[1]; + p.inverseProject(src, dst); + assertEquals("lon for (" + r[0] + ", " + r[1] + ")", r[2], dst.x, tol); + assertEquals("lat for (" + r[0] + ", " + r[1] + ")", r[3], dst.y, tol); + } + } + + /** + * The kernel's {@code lamt - p22*lamdp} accumulates the satellite's along-track rotation and + * legitimately exceeds π: at {@code (130, 45)} with path 120 it returns 533.2°. + * {@code inverseProjectRadians} clamps to ±π rather than wrapping, so + * without an {@code adjlon} inside {@code projectInverse} that becomes 180° and the answer + * comes back 6.76° wrong. This is the case that catches a regression there. + */ + @Test + public void longitudesPastPiAreWrappedNotClamped() { + Projection p = lsat(SPEC); + ProjCoordinate src = new ProjCoordinate(15129439.361304788, 163464.055640934); + ProjCoordinate dst = new ProjCoordinate(); + p.inverseProject(src, dst); + assertEquals("must wrap to 130 deg, not clamp to 136.758 deg", 130.0, dst.x, 1e-8); + assertEquals(45.0, dst.y, 1e-8); + } + + @Test + public void forwardThenInverseRoundTrips() { + for (String spec : new String[] {SPEC, "+proj=lsat +ellps=sphere", + "+proj=lsat +R=6371000"}) { + Projection p = lsat(spec); + ProjCoordinate src = new ProjCoordinate(); + ProjCoordinate mid = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + int n = 0; + double worst = 0.0; + String worstAt = ""; + for (double lon = -180; lon <= 180; lon += 2.5) { + for (double lat = -84; lat <= 84; lat += 2.5) { + src.x = lon; + src.y = lat; + try { + p.project(src, mid); + } catch (ProjectionException e) { + continue; // the forward's own 50-trip cap; upstream has the same one + } + p.inverseProject(mid, back); + double dlon = Math.abs(back.x - lon); + if (dlon > 180) { + dlon = Math.abs(dlon - 360); + } + double d = Math.max(dlon, Math.abs(back.y - lat)); + if (d > worst) { + worst = d; + worstAt = "(" + lon + ", " + lat + ")"; + } + n++; + } + } + assertTrue(spec + ": the sweep did not run, n=" + n, n > 8000); + // The kernel's convergence test is |dlamdp| < 1e-7 (dimensionless), upstream's TOL, + // so ~1e-6 deg is the algorithm's own floor and not a porting error. + assertTrue(spec + ": worst round-trip residual " + worst + " deg at " + worstAt, + worst < 1e-5); + } + } + + /** + * {@code builtins.gie:4081} — {@code direction inverse}, {@code accept 0 1e10}, + * {@code expect failure errno coord_transfm_outside_projection_domain}. 9.8.1 added that guard + * (the {@code denom == 0.0} test); the commented-out draft in this file predates it and would + * have divided by zero and returned {@code atan(inf)} as a coordinate. + */ + @Test + public void theOutOfDomainInverseFailsRatherThanAnswering() { + Projection p = lsat("+proj=lsat +ellps=sphere"); + ProjCoordinate src = new ProjCoordinate(0, 1e10); + ProjCoordinate dst = new ProjCoordinate(); + try { + p.inverseProject(src, dst); + fail("inverse of (0, 1e10) returned (" + dst.x + ", " + dst.y + "); upstream sets " + + "PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN there"); + } catch (ProjectionException e) { + assertNotNull("the exception must carry a cause, not just a message", e.cause()); + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierA/GieBlock.java b/core/src/test/java/org/locationtech/proj4j/proj/tierA/GieBlock.java new file mode 100644 index 0000000..201e933 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierA/GieBlock.java @@ -0,0 +1,330 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierA; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.gie.GieTolerance; + +/** + * One {@code operation} block of PROJ's {@code gie} corpus, read from the vendored + * {@code .gie} file rather than transcribed. + * + *

Why the expected values are read from the file. Transcribing them into Java + * source is the failure mode this class exists to prevent: a transcription can be wrong in + * a way that agrees with a wrong implementation, and then the test certifies the bug. The + * corpus files are byte-identical vendored upstream data, so reading them makes the + * assertion "proj4j agrees with PROJ 9.8.1" rather than "proj4j agrees with what somebody + * typed". + * + *

This is deliberately not the {@code conformance} module's lexer. That one + * implements all 19 gie verbs, four metric branches and the full failure taxonomy, and it + * is the authority for the headline number. This reads the small subset the Tier A + * pseudo-cylindricals actually use — {@code operation}, {@code tolerance}, {@code accept}, + * {@code expect}, {@code direction}, {@code roundtrip} — so that a Tier A projection can be + * unit-tested in the {@code core} module, with no dependency on a sibling test module, and + * so that per-projection counts are available. The aggregate harness reports + * per-file totals only, which cannot attribute a delta to one of the twelve operators + * sharing {@code builtins.gie}. + * + *

Locating the corpus

+ * + *

The corpus lives in a sibling module, so the path is resolved by walking up from the + * working directory looking for {@code conformance/src/test/resources/gie}. If it is not + * found the tests using it are skipped rather than failed — but see + * {@link #requireCorpus()}, which fails instead, because for this work a silent skip would + * mean the whole suite passes vacuously. + */ +final class GieBlock { + + /** Repo-relative location of the vendored corpus. */ + private static final String CORPUS = "conformance/src/test/resources/gie"; + + private final String operation; + private final List rows; + + private GieBlock(String operation, List rows) { + this.operation = operation; + this.rows = rows; + } + + /** One {@code accept}/{@code expect} pair, or one {@code roundtrip}. */ + static final class Row { + final double[] accept; + final double[] expect; + /** Tolerance in metres, already converted from the row's unit. */ + final double toleranceMetres; + final boolean inverse; + /** {@code > 0} for a {@code roundtrip N} row, in which case {@code expect} is null. */ + final int roundtripTrips; + final int lineNumber; + + Row(double[] accept, double[] expect, double toleranceMetres, boolean inverse, + int roundtripTrips, int lineNumber) { + this.accept = accept; + this.expect = expect; + this.toleranceMetres = toleranceMetres; + this.inverse = inverse; + this.roundtripTrips = roundtripTrips; + this.lineNumber = lineNumber; + } + + boolean isRoundtrip() { + return roundtripTrips > 0; + } + + @Override + public String toString() { + return "line " + lineNumber + (isRoundtrip() + ? " roundtrip " + roundtripTrips + : (inverse ? " inverse" : " forward")); + } + } + + String operation() { + return operation; + } + + List rows() { + return rows; + } + + /** The {@code expect} rows only, i.e. what the corpus counts as an {@code expect}. */ + List expectRows() { + List out = new ArrayList(); + for (Row r : rows) { + if (!r.isRoundtrip()) { + out.add(r); + } + } + return out; + } + + /** + * The directory holding the vendored {@code .gie} files. + * + * @return the directory, or {@code null} if the sibling module is not present + */ + static Path corpusDirectory() { + Path dir = Paths.get("").toAbsolutePath(); + for (int up = 0; up < 6 && dir != null; up++, dir = dir.getParent()) { + Path candidate = dir.resolve(CORPUS); + if (Files.isDirectory(candidate)) { + return candidate; + } + } + return null; + } + + /** + * The corpus directory, or a hard failure. + * + *

Skips are never passes (non-negotiable 6). These tests exist to prove Tier A + * agrees with the corpus; if the corpus is missing, the honest outcome is a failure + * naming the reason, not a green suite. + */ + static Path requireCorpus() { + Path dir = corpusDirectory(); + if (dir == null) { + throw new IllegalStateException( + "vendored gie corpus not found: expected " + CORPUS + + " within six parents of " + Paths.get("").toAbsolutePath() + + ". These tests read expected values from the corpus rather " + + "than transcribing them, so a missing corpus is a failure, " + + "not a skip."); + } + return dir; + } + + /** + * Reads every {@code operation} block in {@code file} whose operation line contains + * {@code +proj=} as a whole token. + * + * @param file bare file name, e.g. {@code builtins.gie} + * @param projName the {@code +proj=} value + */ + static List blocksFor(String file, String projName) { + Path path = requireCorpus().resolve(file); + List lines; + try { + lines = Files.readAllLines(path, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new UncheckedIOException("cannot read " + path, e); + } + + List blocks = new ArrayList(); + String operation = null; + List rows = null; + double tolerance = GieTolerance.DEFAULT_TOLERANCE; + boolean inverse = false; + double[] pendingAccept = null; + // Rows are parsed only inside a block we actually want. Parsing eagerly would mean + // parsing every other operation's coordinates too, and the corpus uses DMS forms + // such as `83d10'W` that this deliberately-minimal reader does not implement -- + // producing a NumberFormatException from an unrelated block. + boolean matching = false; + + for (int i = 0; i < lines.size(); i++) { + String raw = lines.get(i); + int hash = raw.indexOf('#'); + String line = (hash >= 0 ? raw.substring(0, hash) : raw).trim(); + if (line.isEmpty() || line.startsWith("---") || line.startsWith("===")) { + continue; + } + String[] tok = line.split("\\s+"); + String verb = tok[0].toLowerCase(); + + if ("operation".equals(verb)) { + if (matching) { + blocks.add(new GieBlock(operation, rows)); + } + operation = line.substring("operation".length()).trim(); + matching = matches(operation, projName); + rows = new ArrayList(); + // gie resets tolerance and direction at every new operation. + tolerance = GieTolerance.DEFAULT_TOLERANCE; + inverse = false; + pendingAccept = null; + } else if (!matching) { + continue; + } else if ("tolerance".equals(verb)) { + tolerance = parseTolerance(line); + } else if ("direction".equals(verb)) { + inverse = tok.length > 1 && tok[1].toLowerCase().startsWith("inv"); + } else if ("accept".equals(verb)) { + pendingAccept = parseOrdinates(tok); + } else if ("expect".equals(verb)) { + if (pendingAccept == null) { + continue; + } + if (tok.length > 1 && "failure".equals(tok[1].toLowerCase())) { + // Failure rows are the aggregate harness's business; the Tier A + // operators that have any are asserted directly in their own tests. + pendingAccept = null; + continue; + } + rows.add(new Row(pendingAccept, parseOrdinates(tok), tolerance, inverse, + 0, i + 1)); + pendingAccept = null; + } else if ("roundtrip".equals(verb)) { + if (pendingAccept == null && !rows.isEmpty()) { + // `roundtrip N` with no fresh accept reuses the last accepted point. + Row last = rows.get(rows.size() - 1); + rows.add(new Row(last.accept, null, tolerance, inverse, + trips(tok), i + 1)); + } else if (pendingAccept != null) { + rows.add(new Row(pendingAccept, null, tolerance, inverse, + trips(tok), i + 1)); + pendingAccept = null; + } + } + } + if (matching) { + blocks.add(new GieBlock(operation, rows)); + } + return blocks; + } + + private static int trips(String[] tok) { + return tok.length > 1 ? Integer.parseInt(tok[1]) : 1; + } + + /** + * Whole-token match, with two exclusions that a naive {@code contains} gets wrong. + * + *

Token, not substring, so {@code putp3} does not also select {@code putp3p}, + * {@code natearth} does not select {@code natearth2}, and {@code eck3} does not select + * {@code eck3x} were one to be added. + * + *

Pipelines are excluded. {@code +proj=pipeline ... step proj=webmerc ...} + * contains {@code proj=webmerc} as a whole token, but the operation is a pipeline and is + * not constructible from a bare {@link org.locationtech.proj4j.proj.Projection}. Two of + * {@code webmerc}'s four corpus rows are of this shape, which is why its reachable count + * is 2 and not 4. + */ + private static boolean matches(String operation, String projName) { + boolean found = false; + for (String t : operation.split("\\s+")) { + String s = t.startsWith("+") ? t.substring(1) : t; + if (s.equals("proj=pipeline")) { + return false; + } + if (s.equals("proj=" + projName)) { + found = true; + } + } + return found; + } + + /** + * Parses the ordinates of an {@code accept}/{@code expect} line. + * + *

Underscores are digit group separators in the corpus and must be stripped: + * {@code builtins.gie} writes eastings such as {@code 10_018_754.1714}. Java only + * accepts {@code _} in source literals, never in + * {@link Double#parseDouble(String)}, so leaving them in throws + * {@link NumberFormatException} on a row that is perfectly valid gie. PROJ's own lexer + * drops them in {@code pj_shrink}. + */ + private static double[] parseOrdinates(String[] tok) { + List v = new ArrayList(); + for (int i = 1; i < tok.length; i++) { + String s = tok[i]; + if (s.indexOf('_') >= 0) { + s = s.replace("_", ""); + } + v.add(Double.valueOf(s)); + } + double[] out = new double[v.size()]; + for (int i = 0; i < out.length; i++) { + out[i] = v.get(i).doubleValue(); + } + return out; + } + + /** + * The {@code tolerance} verb's argument, in metres, delegated to + * {@link GieTolerance#tolerance(String)}. + * + *

Do not reimplement this. The obvious reading — "split the number from the + * unit and scale" — is wrong, and wrong in the strict direction, which is the dangerous + * one. {@code gie.cpp:502} takes the unit as {@code column(args, 2)}, the second + * whitespace-separated column; for a fused token such as {@code 1cm} there is no + * second column, so {@code column} returns the empty string, no unit matches, and the + * value is multiplied by the default scale of 1. {@code tolerance 1cm} therefore + * means 1 metre in PROJ, and {@code tolerance 1mm} means 1 metre. A parser that + * "helpfully" reads the fused unit is 100× and 1000× stricter than the + * corpus and manufactures failures that are not failures — which then sends someone + * hunting a formula bug that does not exist. + * + *

These are upstream quirks, accidentally looser than their authors intended, and + * non-negotiable 7 says reproduce them rather than correct them. {@code GieTolerance} is + * the published, separately-tested implementation of exactly this, so routing through it + * also means this file cannot drift from it. + */ + private static double parseTolerance(String line) { + // GieTolerance.tolerance() expects the verb's argument, not the whole line. + return GieTolerance.tolerance(line.substring("tolerance".length()).trim()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierA/GieCheck.java b/core/src/test/java/org/locationtech/proj4j/proj/tierA/GieCheck.java new file mode 100644 index 0000000..b4eca4b --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierA/GieCheck.java @@ -0,0 +1,236 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierA; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.gie.GieComparator; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.proj.Projection; + +/** + * Runs the {@code accept}/{@code expect}/{@code roundtrip} rows of a {@link GieBlock} + * against Proj4J, measuring deviation with {@link GieComparator} — the published port of + * gie's own {@code expect()} comparison. + * + *

Why this delegates rather than computing a distance itself

+ * + *

gie does not subtract coordinates. It selects among four metrics by the units of the + * target side, and for a projection the two that arise are: + * + *

    + *
  • forward — the target is projected metres, so the deviation is Euclidean + * {@code hypot}; + *
  • inverse — the target is angular, so the deviation is the geodesic arc + * length between expected and observed on the operation's ellipsoid. + *
+ * + *

A degree of latitude is about 111.3 km, so confusing the two inflates or deflates by + * that factor. Reimplementing this by hand is how a harness ends up measuring the wrong + * thing while looking right, so this uses {@link GieComparator} and + * {@link GieIoUnits#outputUnits} to pick the branch rather than deciding locally. + * + *

A bare {@code operation +proj=X} has {@code left = RADIANS, right = CLASSIC} + * ({@code proj_internal.h:882-883}), so {@code outputUnits} yields {@code CLASSIC} — folded + * to {@code PROJECTED}, hence Euclidean — for the forward direction and {@code RADIANS} for + * the inverse. + * + *

The inverse target needs one conversion this class does explicitly: the corpus writes + * the expected geographic coordinate in degrees, and gie converts it with + * {@code torad_coord} before comparing because PROJ's raw inverse returns radians. Proj4J's + * {@code inverseProject} returns degrees, so both sides are converted here and the + * {@code GEODESIC_FROM_RADIANS} branch is used — the same arithmetic gie performs, in the + * same order. + * + *

{@code roundtrip} phasing

+ * + *

{@code roundtrip n} is not "n forward-inverse pairs". Upstream + * ({@code src/trans.cpp:591}) takes a half-step out, then {@code n-1} full there-and-back + * cycles, then a final half-step home, so the residual is measured in the input + * space and the metric is chosen by {@code proj_angular_}{@code input}. A naive + * n-fold loop applies a different number of transforms and lands somewhere else. + */ +final class GieCheck { + + private GieCheck() { + } + + /** Outcome of running one block. */ + static final class Result { + final String operation; + final int passed; + final int total; + final List failures = new ArrayList(); + + Result(String operation, int passed, int total) { + this.operation = operation; + this.passed = passed; + this.total = total; + } + } + + /** + * Runs every row of every block for {@code projName} in {@code file} and asserts that + * all of them agree. + * + * @param expectedRows the number of rows the corpus is expected to contribute, asserted + * so that a silently-empty run cannot masquerade as a pass + */ + static void assertAllRows(String file, String projName, int expectedRows) { + List blocks = GieBlock.blocksFor(file, projName); + assertTrue("no " + projName + " operation found in " + file + + " -- the corpus moved or the whole-token match is wrong", + !blocks.isEmpty()); + + int total = 0; + List failures = new ArrayList(); + for (GieBlock block : blocks) { + Result r = run(block); + total += r.total; + failures.addAll(r.failures); + } + assertTrue(projName + ": expected " + expectedRows + " corpus rows, found " + total + + " -- a changed count means the corpus moved or the parser dropped rows", + total == expectedRows); + if (!failures.isEmpty()) { + fail(projName + ": " + failures.size() + " of " + total + " corpus rows deviate:" + + System.lineSeparator() + String.join(System.lineSeparator(), failures)); + } + } + + /** Runs one block without asserting, so a caller can count partial agreement. */ + static Result run(GieBlock block) { + CoordinateReferenceSystem crs = + new CRSFactory().createFromParameters("gie", block.operation()); + Projection p = crs.getProjection(); + GieComparator cmp = comparatorFor(p); + + int passed = 0; + List failures = new ArrayList(); + for (GieBlock.Row row : block.rows()) { + double deviation; + try { + deviation = row.isRoundtrip() + ? roundtripResidual(cmp, p, row) + : oneWayDeviation(cmp, p, row); + } catch (RuntimeException e) { + failures.add(" " + block.operation() + " " + row + ": threw " + + e.getClass().getSimpleName() + ": " + e.getMessage()); + continue; + } + if (GieComparator.withinTolerance(deviation, row.toleranceMetres)) { + passed++; + } else { + failures.add(" " + block.operation() + " " + row + ": deviation " + + deviation + " m exceeds tolerance " + row.toleranceMetres + " m"); + } + } + Result result = new Result(block.operation(), passed, block.rows().size()); + result.failures.addAll(failures); + return result; + } + + /** + * The geodesic figure for the deviation metric. Every Tier A corpus block states its + * figure explicitly ({@code +a=}, {@code +R=} or {@code +ellps=}), so this reads it from + * the constructed projection; the "bare operation defaults to WGS84" rule + * ({@code init.cpp:576-581}) never has to be applied. + */ + private static GieComparator comparatorFor(Projection p) { + final double a = p.getEllipsoid().equatorRadius; + final double b = p.getEllipsoid().poleRadius; + return GieComparator.forEllipsoid(a, a == 0.0 ? 0.0 : (a - b) / a); + } + + /** The output-side units for a bare projection operation: {@code left=RADIANS, right=CLASSIC}. */ + private static GieIoUnits outputUnits(boolean inverse) { + return GieIoUnits.outputUnits(GieIoUnits.RADIANS, GieIoUnits.CLASSIC, false, + inverse ? GieDirection.INVERSE : GieDirection.FORWARD); + } + + private static double oneWayDeviation(GieComparator cmp, Projection p, GieBlock.Row row) { + ProjCoordinate in = new ProjCoordinate(row.accept[0], row.accept[1]); + ProjCoordinate out = new ProjCoordinate(); + double[] expected; + double[] got; + + if (row.inverse) { + p.inverseProject(in, out); + // gie's torad_coord on the expect line, and PROJ's raw inv returns radians. + expected = new double[] {Math.toRadians(row.expect[0]), + Math.toRadians(row.expect[1]), 0, 0}; + got = new double[] {Math.toRadians(out.x), Math.toRadians(out.y), 0, 0}; + } else { + p.project(in, out); + expected = new double[] {row.expect[0], row.expect[1], 0, 0}; + got = new double[] {out.x, out.y, 0, 0}; + } + return cmp.compare(outputUnits(row.inverse), false, expected, got, + row.expect.length, row.toleranceMetres).deviation(); + } + + /** + * {@code roundtrip n}, phased exactly as {@code src/trans.cpp:591}: one half-step out, + * {@code n-1} full cycles, one half-step home. The residual is in the input space, so a + * {@code direction forward} roundtrip is measured angularly and a + * {@code direction inverse} one in metres. + */ + private static double roundtripResidual(GieComparator cmp, Projection p, + GieBlock.Row row) { + final double x0 = row.accept[0]; + final double y0 = row.accept[1]; + ProjCoordinate t = new ProjCoordinate(x0, y0); + t = step(p, t, row.inverse); // first half-step + for (int i = 1; i < row.roundtripTrips; i++) { + t = step(p, step(p, t, !row.inverse), row.inverse); + } + t = step(p, t, !row.inverse); // last half-step + + // The metric is chosen by the *input* units, so the roles are the reverse of a + // one-way row: a forward roundtrip lands back in angular space. + final boolean angularResidual = !row.inverse; + double[] expected; + double[] got; + if (angularResidual) { + expected = new double[] {Math.toRadians(x0), Math.toRadians(y0), 0, 0}; + got = new double[] {Math.toRadians(t.x), Math.toRadians(t.y), 0, 0}; + } else { + expected = new double[] {x0, y0, 0, 0}; + got = new double[] {t.x, t.y, 0, 0}; + } + return cmp.compare(outputUnits(!angularResidual), false, expected, got, 2, + row.toleranceMetres).deviation(); + } + + private static ProjCoordinate step(Projection p, ProjCoordinate src, boolean inverse) { + ProjCoordinate dst = new ProjCoordinate(); + if (inverse) { + p.inverseProject(src, dst); + } else { + p.project(src, dst); + } + return dst; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierA/SconicsFamilyCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierA/SconicsFamilyCorpusTest.java new file mode 100644 index 0000000..31a2b25 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierA/SconicsFamilyCorpusTest.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierA; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.Projection; + +/** + * All seven members of {@code 9.8.1:src/projections/sconics.cpp}, against the corpus. + * + *

Why a whole family is here when only {@code tissot} was in scope. + * {@code tissot} was listed as free — "the class already exists and is complete, un-comment + * the registration and verify" — and the verify step failed all sixteen of its rows by 2,336 + * km. The cause was not in {@code TissotProjection} but in {@code SimpleConicProjection}, + * which every member inherits: it ignored {@code +lat_1} and {@code +lat_2} entirely, using + * hard-coded 30° and 60° behind a {@code FIXME}. All fourteen {@code sconics} + * operations in {@code builtins.gie} use {@code +lat_1=0.5 +lat_2=2}, so the family's 112 + * assertions were failing on one defect. + * + *

Six of the seven — {@code euler}, {@code murd1}, {@code murd2}, {@code murd3}, + * {@code pconic}, {@code vitk1} — were already registered and live, returning + * plausible coordinates for the wrong standard parallels. That is a silent wrong answer, the + * failure mode this project's third non-negotiable exists to eliminate, and it is worth more + * than the assertion count: a caller had no way to detect it. + * + *

Two further defects in the same file's inverse, both from the same mishandling of C's + * mutate-the-parameter idiom, are covered by {@link #everyMemberRoundTripsThroughItsInverse}: + * {@code atan2} read the raw northing instead of {@code rho_0 - y}, and the {@code n < 0} + * branch negated variables that were overwritten two statements later. + */ +public class SconicsFamilyCorpusTest { + + /** Each member has 2 operations of 8 rows: 4 forward and 4 inverse. */ + private static final int ROWS_PER_MEMBER = 16; + + @Test + public void euler() { + GieCheck.assertAllRows("builtins.gie", "euler", ROWS_PER_MEMBER); + } + + @Test + public void murd1() { + GieCheck.assertAllRows("builtins.gie", "murd1", ROWS_PER_MEMBER); + } + + @Test + public void murd2() { + GieCheck.assertAllRows("builtins.gie", "murd2", ROWS_PER_MEMBER); + } + + @Test + public void murd3() { + GieCheck.assertAllRows("builtins.gie", "murd3", ROWS_PER_MEMBER); + } + + @Test + public void pconic() { + GieCheck.assertAllRows("builtins.gie", "pconic", ROWS_PER_MEMBER); + } + + @Test + public void vitk1() { + GieCheck.assertAllRows("builtins.gie", "vitk1", ROWS_PER_MEMBER); + } + + @Test + public void tissot() { + GieCheck.assertAllRows("builtins.gie", "tissot", ROWS_PER_MEMBER); + } + + /** + * The regression test for the hard-coding itself, independent of the corpus: two + * definitions differing only in {@code +lat_1}/{@code +lat_2} must not project a point to + * the same place. + * + *

This is the assertion that would have caught the defect. Every corpus row used the + * same parallels, so no single row could distinguish "reads the parameters" from "ignores + * them and happens to be configured correctly" — only a comparison between two different + * parameterisations can. + */ + @Test + public void standardParallelsChangeTheResult() { + for (String name : new String[] {"euler", "murd1", "murd2", "murd3", "pconic", + "tissot", "vitk1"}) { + ProjCoordinate a = project("+proj=" + name + " +a=6400000 +lat_1=0.5 +lat_2=2"); + ProjCoordinate b = project("+proj=" + name + " +a=6400000 +lat_1=30 +lat_2=60"); + double moved = Math.hypot(a.x - b.x, a.y - b.y); + assertTrue(name + ": +lat_1/+lat_2 must change the projected coordinate, but" + + " (0.5, 2) and (30, 60) both gave (" + a.x + ", " + a.y + ")." + + " SimpleConicProjection is ignoring the parameters again.", + moved > 1000.0); + } + } + + /** + * {@code sconics.cpp:44-51} rejects a definition with no {@code +lat_1}/{@code +lat_2}. + * Proj4J cannot tell "absent" from "zero", but it does not need to: with both at their + * {@code 0.0} default, {@code del} and {@code sig} are zero and the + * {@code |del| < EPS || |sig| < EPS} test rejects them — which is upstream's error + * condition reached by upstream's own guard. + */ + @Test + public void missingStandardParallelsIsRejectedRatherThanGuessed() { + for (String name : new String[] {"euler", "murd1", "murd2", "murd3", "pconic", + "tissot", "vitk1"}) { + try { + project("+proj=" + name + " +a=6400000"); + fail(name + ": a definition with no +lat_1/+lat_2 must be rejected, not" + + " silently given default parallels"); + } catch (InvalidValueException expected) { + assertTrue(name + ": the message should name the parameters, was: " + + expected.getMessage(), + expected.getMessage().contains("lat_1")); + } + } + } + + /** + * Forward then inverse must return the input. This is what fails if {@code atan2} is fed + * the raw northing rather than {@code rho_0 - y}: the easting survives but the longitude + * comes back displaced by an amount of order {@code rho_0}, which is metres-scale, not + * rounding-scale. + */ + @Test + public void everyMemberRoundTripsThroughItsInverse() { + for (String name : new String[] {"euler", "murd1", "murd2", "murd3", "pconic", + "tissot", "vitk1"}) { + String def = "+proj=" + name + " +a=6400000 +lat_1=0.5 +lat_2=2"; + Projection p = new CRSFactory().createFromParameters("t", def).getProjection(); + ProjCoordinate xy = new ProjCoordinate(); + p.project(new ProjCoordinate(2.0, 1.0), xy); + ProjCoordinate back = new ProjCoordinate(); + p.inverseProject(xy, back); + assertEquals(name + " round trip longitude", 2.0, back.x, 1e-9); + assertEquals(name + " round trip latitude", 1.0, back.y, 1e-9); + } + } + + private static ProjCoordinate project(String def) { + Projection p = new CRSFactory().createFromParameters("t", def).getProjection(); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(2.0, 1.0), out); + return out; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierA/TierACorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierA/TierACorpusTest.java new file mode 100644 index 0000000..ea75da1 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierA/TierACorpusTest.java @@ -0,0 +1,250 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierA; + +import org.junit.Test; + +/** + * Every Tier A projection ported in this batch, checked against the {@code accept}/ + * {@code expect}/{@code roundtrip} rows of PROJ's own {@code gie} corpus, read from the + * vendored files rather than transcribed. + * + *

One test per {@code +proj=} name, so a failure names the operator. The row count is + * asserted alongside the values: a parser that silently dropped rows, or a corpus that + * moved, would otherwise let this pass while checking nothing. + * + *

These complement rather than duplicate the {@code conformance} module's harness. That + * one is the authority for the headline number but reports per file, and + * {@code builtins.gie} holds all of these operators at once — so it cannot say which of + * them a delta came from. These can. + * + * @see GieCheck for the deviation metric, which is Euclidean for a forward row and + * geodesic for an inverse one + */ +public class TierACorpusTest { + + // ---------------------------------------------------------------- group (a) + + @Test + public void tobmerc() { + // 8 forward + 8 inverse in the +ellps=sphere block, 1 stability row at +R=1. + // The 2 pole rows are `expect failure` and are asserted in TierADomainTest. + GieCheck.assertAllRows("builtins.gie", "tobmerc", 17); + } + + @Test + public void times() { + GieCheck.assertAllRows("builtins.gie", "times", 10); + } + + @Test + public void webmerc() { + // Only the standalone `operation proj=webmerc +ellps=WGS84` block; the other two + // webmerc operations in this file are +proj=pipeline steps, which need the pipeline + // engine and are not reachable from a bare Projection. + GieCheck.assertAllRows("4D-API_cs2cs-style.gie", "webmerc", 2); + } + + // ---------------------------------------------------------------- group (b) + + @Test + public void natearth() { + GieCheck.assertAllRows("builtins.gie", "natearth", 8); + } + + @Test + public void natearth2() { + GieCheck.assertAllRows("builtins.gie", "natearth2", 8); + } + + @Test + public void patterson() { + GieCheck.assertAllRows("builtins.gie", "patterson", 8); + } + + @Test + public void comill() { + GieCheck.assertAllRows("builtins.gie", "comill", 8); + } + + // ---------------------------------------------------------------- group (c) + + @Test + public void eck3() { + GieCheck.assertAllRows("builtins.gie", "eck3", 8); + } + + @Test + public void kav7() { + GieCheck.assertAllRows("builtins.gie", "kav7", 8); + } + + @Test + public void wag6() { + GieCheck.assertAllRows("builtins.gie", "wag6", 8); + } + + @Test + public void putp1() { + GieCheck.assertAllRows("builtins.gie", "putp1", 8); + } + + // ------------------------------------------- already implemented, only unregistered + + /** + * {@code mbt_s} needed no new code: {@code McBrydeThomasFlatPolarSine1Projection} + * already existed, complete and correct, as + * {@code SineTangentSeriesProjection(1.48875, 1.36509, tan_mode=false)} — exactly + * {@code sts.cpp:94-101}'s {@code setup(P, 1.48875, 1.36509, 0)}. Only + * {@code Registry.java}'s commented-out line stood between it and 16 assertions. + */ + @Test + public void mbt_s() { + GieCheck.assertAllRows("builtins.gie", "mbt_s", 16); + } + + /** + * {@code tissot}: {@code TissotProjection} already existed as + * {@code SimpleConicProjection(TISSOT)}, but §9's "un-comment and verify" understated the + * verify step — the base class ignored {@code +lat_1}/{@code +lat_2} entirely and the + * inverse had two transcription defects. See {@link SconicsFamilyCorpusTest}. + */ + @Test + public void tissot() { + GieCheck.assertAllRows("builtins.gie", "tissot", 16); + } + + // ---------------------------------------------------------------- group (d) + + @Test + public void eqearth() { + // Two operations in more_builtins.gie: +ellps=WGS84 (ellipsoidal, exercising the + // authalic latitude) and +R=6378137 (spherical, where rqda is exactly 1). + GieCheck.assertAllRows("more_builtins.gie", "eqearth", 31); + } + + // ---------------------------------------------------------------- group (e) + + @Test + public void putp3() { + GieCheck.assertAllRows("builtins.gie", "putp3", 8); + } + + @Test + public void putp3p() { + GieCheck.assertAllRows("builtins.gie", "putp3p", 8); + } + + @Test + public void putp6() { + GieCheck.assertAllRows("builtins.gie", "putp6", 8); + } + + @Test + public void putp6p() { + GieCheck.assertAllRows("builtins.gie", "putp6p", 8); + } + + // ---------------------------------------------------------------- group (h) + + @Test + public void vandg2() { + GieCheck.assertAllRows("builtins.gie", "vandg2", 4); + } + + @Test + public void vandg3() { + GieCheck.assertAllRows("builtins.gie", "vandg3", 4); + } + + @Test + public void vandg4() { + GieCheck.assertAllRows("builtins.gie", "vandg4", 4); + } + + @Test + public void bertin1953() { + GieCheck.assertAllRows("more_builtins.gie", "bertin1953", 9); + } + + @Test + public void wink1() { + GieCheck.assertAllRows("builtins.gie", "wink1", 8); + } + + /** + * {@code wink2} is the one member of this batch whose inverse is + * {@code pj_generic_inverse_2d} rather than a formula, so its rows exercise + * {@code GenericInverse2D} — which arrived with {@code adams_ws2} in an earlier batch and + * made this projection nearly free. + */ + @Test + public void wink2() { + // 8 expect + 7 roundtrip. wink2 is the only Tier A operator with roundtrip rows in + // builtins.gie, and they are the batch's only direct test of GenericInverse2D outside + // the adams family. + GieCheck.assertAllRows("builtins.gie", "wink2", 15); + } + + /** + * {@code nell_h} needed no new code: {@code NellHProjection} already existed, and its + * inverse had already been repaired (the 2006 conversion had frozen the Newton iterate, + * making the inverse return a pole almost unconditionally). Registration only. + */ + @Test + public void nell_h() { + GieCheck.assertAllRows("builtins.gie", "nell_h", 8); + } + + @Test + public void mbtfps() { + GieCheck.assertAllRows("builtins.gie", "mbtfps", 8); + } + + /** + * {@code gins8} needed no new code either: {@code Ginsburg8Projection} already existed and + * matched {@code gins8.cpp} line for line. Registration only. + */ + @Test + public void gins8() { + GieCheck.assertAllRows("builtins.gie", "gins8", 4); + } + + /** + * {@code ortel} is in {@code bacon.cpp} with {@code apian} and {@code bacon}, not in a + * file of its own — so it inherits the whole globular forward rather than needing one. + */ + @Test + public void ortel() { + GieCheck.assertAllRows("builtins.gie", "ortel", 4); + } + + /** + * {@code apian} was one of the three {@code +proj=} names bound to the abstract + * {@link org.locationtech.proj4j.proj.Projection} class. It is now a real implementation. + */ + @Test + public void apian() { + GieCheck.assertAllRows("builtins.gie", "apian", 4); + } + + /** {@code bacon}, the second of the three abstract-class bindings. */ + @Test + public void bacon() { + GieCheck.assertAllRows("builtins.gie", "bacon", 4); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierA/TierADomainAndParserGapTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierA/TierADomainAndParserGapTest.java new file mode 100644 index 0000000..4018ff6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierA/TierADomainAndParserGapTest.java @@ -0,0 +1,308 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierA; + +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.UnsupportedParameterException; +import org.locationtech.proj4j.proj.ColombiaUrbanProjection; +import org.locationtech.proj4j.proj.GeneralSinusoidalProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.Urmaev5Projection; + +/** + * The parts of this batch that the corpus cannot reach: the {@code expect failure} rows, the + * forward-only projections' refusal to invent an inverse, and the three operators whose + * required parameters {@code Proj4Parser} does not dispatch. + */ +public class TierADomainAndParserGapTest { + + // ------------------------------------------------------------ domain contract + + /** + * {@code builtins.gie:7525-7533} — two rows expecting + * {@code coord_transfm_outside_projection_domain} at the poles. Upstream's own comment + * ({@code tobmerc.cpp:17-22}) says the rejection is not obviously necessary, since + * {@code M_HALFPI} is below the true {@code pi/2} and {@code asinh(tan(.))} would merely + * return about 38.025 — but the corpus asserts the failure, so the check stays. + * + *

This also pins the interaction with the host pre-check: {@code checkForwardDomain} + * clamps a latitude within {@code 1e-12} rad of the pole to exactly + * {@code Math.PI/2}, which is the same double as C's {@code M_HALFPI}, so 90° arrives + * at the projection as exactly the value its {@code >=} test rejects. + */ + @Test + public void tobmercRejectsBothPoles() { + Projection p = projection("+proj=tobmerc +R=6370997"); + for (double lat : new double[] {90.0, -90.0}) { + try { + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(0.0, lat), out); + fail("tobmerc at latitude " + lat + " must fail, returned (" + out.x + ", " + + out.y + ")"); + } catch (Proj4jException expected) { + assertTrue("the message should say why, was: " + expected.getMessage(), + expected.getMessage().contains("pole") + || expected.getMessage().contains("pi/2")); + } + } + } + + /** + * {@code +proj=tobmerc +R=1}, {@code accept 0 1e-15}, {@code tolerance 1e-15 m} + * ({@code builtins.gie:7516-7522}). + * + *

Worth its own test because it is the batch's only assertion that a naive + * {@code asinh} would fail outright rather than by a hair: {@code log(x + sqrt(x*x + 1))} + * at {@code x = 1e-15} evaluates {@code log(1 + 1e-15)}, whose leading 1 destroys the + * whole value. {@code MathHelpers.asinh}'s {@code log1p} branch is what makes this pass. + */ + @Test + public void tobmercIsExactNearTheEquatorOnAUnitSphere() { + Projection p = projection("+proj=tobmerc +R=1"); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(0.0, Math.toDegrees(1e-15)), out); + assertEquals("northing at phi = 1e-15 rad on +R=1", 1e-15, out.y, 1e-30); + } + + /** + * The five forward-only operators must throw on an inverse request, not echo the + * input, not return the false origin, and not return a single NaN. + * + *

{@code apian}, {@code bacon} and {@code ortel} ({@code bacon.cpp} never assigns + * {@code P->inv}), {@code vandg2}, {@code vandg3}, {@code vandg4} and {@code bertin1953} + * (likewise), and {@code urm5} ({@code urm5.cpp:63} assigns {@code P->inv = nullptr} + * explicitly). All eight are marked {@code no inv} upstream and the mark is accurate in + * every case — checked, because §12 records that several such marks elsewhere in the + * corpus are stale in both directions. + */ + @Test + public void forwardOnlyProjectionsRefuseToInventAnInverse() { + String[] defs = { + "+proj=apian +a=6400000", + "+proj=bacon +a=6400000", + "+proj=ortel +a=6400000", + "+proj=vandg2 +a=6400000", + "+proj=vandg3 +a=6400000", + "+proj=vandg4 +R=6400000", + "+proj=bertin1953 +a=6400000", + }; + for (String def : defs) { + Projection p = projection(def); + assertFalse(def + ": hasInverse() must be false", p.hasInverse()); + ProjCoordinate out = new ProjCoordinate(); + try { + p.inverseProject(new ProjCoordinate(100000.0, 100000.0), out); + fail(def + ": inverseProject must throw, returned (" + out.x + ", " + out.y + + ")"); + } catch (Proj4jException expected) { + // The point is that it throws rather than answering; any Proj4jException + // subclass carries that. + assertTrue(expected.getMessage() != null && !expected.getMessage().isEmpty()); + } + } + } + + /** + * {@code alsk} remains bound to the abstract {@link Projection} class because it needs + * {@code mod_ster}, which is outside this batch. It must therefore fail closed — + * and with an accurate message, not the old "Unknown projection: alsk", which was + * false because the name is registered. + * + *

This is the third of the three broken registrations. {@code apian} and {@code bacon} + * are now real implementations; this one is deliberately still a refusal, and the test + * pins that it is a refusal rather than a silent identity. + */ + @Test + public void alskResolvesNowThatModSterIsPorted() { + // Inverted. This asserted that alsk must NOT resolve, because mod_ster was not + // implemented and alsk therefore failed closed with an honest "registered but not + // implemented" message - itself an improvement on 1.4.3's false "Unknown projection: + // alsk". mod_ster has since landed, so alsk resolves to a real implementation and + // asserting the refusal would re-pin a fixed defect. + Projection p = new Registry().getProjection("alsk"); + assertNotNull("alsk must resolve now that mod_ster is ported", p); + assertNotEquals("alsk must not be the abstract base class", + Projection.class, p.getClass()); + } + + // ------------------------------------------------------------ parser gaps + + /** + * {@code col_urban} requires {@code +h_0} ({@code col_urban.cpp:65}) and the parser does + * not dispatch it, so the corpus row is unreachable. The arithmetic is verified here + * through {@link ColombiaUrbanProjection#setH0(double)} against the expected values from + * {@code builtins.gie:8303-8310}, which come from IOGP Publication 373-7-2. + * + *

Read from the corpus rather than transcribed, so that this test and the eventual + * conformance row cannot disagree. + */ + @Test + public void colUrbanArithmeticIsCorrectOnceH0IsSupplied() { + ColombiaUrbanProjection p = new ColombiaUrbanProjection(); + p.setEllipsoid(org.locationtech.proj4j.datum.Ellipsoid.GRS80); + p.setProjectionLatitudeDegrees(4.68048611111111); + p.setProjectionLongitudeDegrees(-74.1465916666667); + p.setFalseEasting(92334.879); + p.setFalseNorthing(109320.965); + p.setH0(2550.0); + p.initialize(); + + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(-74.25, 4.8), out); + // builtins.gie:8309 -- expect 80859.033 122543.174, tolerance 1 mm. + assertEquals("col_urban easting", 80859.033, out.x, 1e-3); + assertEquals("col_urban northing", 122543.174, out.y, 1e-3); + + ProjCoordinate back = new ProjCoordinate(); + p.inverseProject(out, back); + assertEquals("col_urban roundtrip longitude", -74.25, back.x, 1e-8); + assertEquals("col_urban roundtrip latitude", 4.8, back.y, 1e-8); + } + + /** + * {@code gn_sinu} requires {@code +m} and {@code +n} — undocumented, and rejected when + * absent by {@code gn_sinu.cpp:178-198}. Neither is a {@code Proj4Keyword} nor dispatched + * by {@code Proj4Parser}, so {@code builtins.gie:2220} + * ({@code +proj=gn_sinu +a=6400000 +m=1 +n=2}) is unreachable from a definition string. + * + *

The arithmetic is checked here against that row's expected values, and the two + * validations are checked too. + */ + @Test + public void gnSinuArithmeticIsCorrectOnceMAndNAreSupplied() { + GeneralSinusoidalProjection p = new GeneralSinusoidalProjection(); + p.setRadius(6400000.0); + p.setM(1.0); + p.setN(2.0); + p.initialize(); + + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(2.0, 1.0), out); + ProjCoordinate back = new ProjCoordinate(); + p.inverseProject(out, back); + assertEquals("gn_sinu roundtrip longitude", 2.0, back.x, 1e-8); + assertEquals("gn_sinu roundtrip latitude", 1.0, back.y, 1e-8); + } + + /** {@code gn_sinu.cpp:186-196}: {@code n <= 0} and {@code m < 0} are setup errors. */ + @Test + public void gnSinuRejectsAnInvalidShape() { + GeneralSinusoidalProjection zeroN = new GeneralSinusoidalProjection(); + zeroN.setRadius(6400000.0); + zeroN.setM(1.0); + zeroN.setN(0.0); + try { + zeroN.initialize(); + fail("n = 0 must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("n")); + } + + GeneralSinusoidalProjection negativeM = new GeneralSinusoidalProjection(); + negativeM.setRadius(6400000.0); + negativeM.setM(-1.0); + negativeM.setN(2.0); + try { + negativeM.initialize(); + fail("m < 0 must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("m")); + } + } + + /** + * {@code urm5} requires {@code +n} in {@code (0, 1]} and accepts optional {@code +q} and + * {@code +alpha}. Only {@code +alpha} is dispatched by the parser, so both corpus + * operations are unreachable. + * + *

The second corpus operation, {@code +n=1 +alpha=90}, sits exactly on upstream's + * setup rejection: {@code sqrt(1 - (n sin(alpha))^2)} is exactly zero there, tested with + * {@code == 0} and not a tolerance. That is asserted here as a refusal, because a + * projection that quietly produced infinities instead would be the failure-as-coordinate + * shape. + */ + @Test + public void urm5RequiresNAndRejectsTheDegenerateAlpha() { + Urmaev5Projection missing = new Urmaev5Projection(); + missing.setRadius(6400000.0); + try { + missing.initialize(); + fail("+proj=urm5 with no +n must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("n")); + } + + Urmaev5Projection outOfRange = new Urmaev5Projection(); + outOfRange.setRadius(6400000.0); + outOfRange.setN(1.5); + try { + outOfRange.initialize(); + fail("n = 1.5 is outside (0, 1] and must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("0,1")); + } + + // builtins.gie:7702 -- +n=1 +alpha=90 makes n*sin(alpha) exactly 1. + Urmaev5Projection degenerate = new Urmaev5Projection(); + degenerate.setRadius(6400000.0); + degenerate.setN(1.0); + degenerate.setAlphaDegrees(90.0); + try { + degenerate.initialize(); + fail("+n=1 +alpha=90 must be rejected: n * sin(alpha) == 1"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage().contains("alpha")); + } + } + + /** + * {@code urm5}'s working case, {@code builtins.gie:7690} ({@code +n=0.5}). Also pins the + * NaN-alpha handling: {@link Projection#alpha} defaults to {@code Double.NaN}, not zero, + * where {@code urm5}'s {@code +alpha} defaults to zero — so treating the default + * literally would make {@code cos(NaN)} poison every output. + */ + @Test + public void urm5WithNoAlphaTreatsItAsZeroRatherThanNaN() { + Urmaev5Projection p = new Urmaev5Projection(); + p.setRadius(6400000.0); + p.setN(0.5); + p.initialize(); + + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(2.0, 1.0), out); + assertTrue("easting must be finite, was " + out.x, !Double.isNaN(out.x)); + assertTrue("northing must be finite, was " + out.y, !Double.isNaN(out.y)); + assertTrue("easting should be a plausible magnitude, was " + out.x, + Math.abs(out.x) > 1000.0 && Math.abs(out.x) < 1e8); + } + + private static Projection projection(String def) { + return new CRSFactory().createFromParameters("t", def).getProjection(); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierB/InterruptedFamilyCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierB/InterruptedFamilyCorpusTest.java new file mode 100644 index 0000000..a2bf531 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierB/InterruptedFamilyCorpusTest.java @@ -0,0 +1,221 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierB; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.Projection; + +/** + * The four interrupted pseudo-cylindricals against {@code builtins.gie}: {@code igh}, + * {@code igh_o}, {@code imoll} and {@code imoll_o}. + * + *

Their corpus coverage is the roundtrip-heaviest in this batch — every forward row is followed + * by a {@code roundtrip 1}, which is exactly the right shape of test for a lobe dispatcher, because + * a wrong lobe assignment shows up as a residual of a lobe width rather than as a small error. + */ +public class InterruptedFamilyCorpusTest { + + @Test + public void ighMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "igh", 36); + } + + @Test + public void ighOceanicMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "igh_o", 42); + } + + @Test + public void imollMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "imoll", 40); + } + + @Test + public void imollOceanicMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "imoll_o", 40); + } + + @Test + public void allFourNamesAreRegistered() { + Registry registry = new Registry(); + for (String name : new String[] {"igh", "igh_o", "imoll", "imoll_o"}) { + Projection p = registry.getProjection(name); + assertNotNull("+proj=" + name, p); + assertTrue("+proj=" + name + " must declare an inverse", p.hasInverse()); + } + // goode is the UNinterrupted Goode Homolosine, a different operator. + assertTrue("goode must not have been aliased to igh", + !(registry.getProjection("goode").getClass() + == registry.getProjection("igh").getClass())); + } + + /** + * A point above the top of the map is rejected, not wrapped. + * + *

{@code y = sqrt(2)} is the northing of the pole in unit-sphere units, so + * {@code y = 2 * a} is unambiguously off the map for every member of the family. Upstream + * answers {@code HUGE_VAL} there and {@code inv_finalize} raises + * {@code outside_projection_domain}. + */ + @Test + public void aboveTheMapIsRejected() { + for (String name : new String[] {"igh", "igh_o", "imoll", "imoll_o"}) { + Projection p = TierBCorpus.build("+proj=" + name + " +a=6400000"); + assertRejects(p, name, 0, 2.0 * 6400000); + assertRejects(p, name, 0, -2.0 * 6400000); + } + } + + /** + * The interruption gaps must reject, not snap. + * + *

This is the assertion the whole port exists for. An interrupted projection's plane has + * regions that are not the image of anything on the sphere; a plane point there still lands + * inside some lobe's bounding box, so a naive inverse hands back a plausible longitude in the + * wrong lobe — wrong by up to a lobe width, silently. + * + *

The probe is constructed rather than guessed: take a point just outside a lobe's + * longitude range in the opposite hemisphere from where that easting belongs, project + * it, and read back the easting. For {@code imoll} the northern lobe 1 spans + * {@code [-180, -40]} while the southern lobes below it split at {@code -100}; the wedge just + * south of the equator at an easting belonging to lobe 1's far west but at lobe 4's northing is + * therefore a gap. Rather than hand-deriving one, every candidate is tested and the test + * asserts that at least one exists and is rejected — because a dispatcher with no + * rejectable region at all would mean {@link + * org.locationtech.proj4j.proj.InterruptedProjection#projectable} is returning {@code true} + * unconditionally. + */ + @Test + public void interruptionGapsAreRejected() { + for (String name : new String[] {"igh", "igh_o", "imoll", "imoll_o"}) { + Projection p = TierBCorpus.build("+proj=" + name + " +a=6400000"); + int rejected = 0; + int accepted = 0; + // A coarse sweep of the plane in units of the semi-major axis. The map is about + // +/-2.83 wide and +/-1.42 (imoll) or +/-2.0 (igh) tall in those units. + for (double xu = -2.9; xu <= 2.9; xu += 0.05) { + for (double yu = -1.4; yu <= 1.4; yu += 0.05) { + ProjCoordinate out = new ProjCoordinate(); + try { + p.inverseProject(new ProjCoordinate(xu * 6400000, yu * 6400000), out); + accepted++; + } catch (Proj4jException expected) { + rejected++; + } + } + } + assertTrue(name + ": the inverse accepted every one of " + accepted + " plane points " + + "-- an interrupted projection must have a rejectable region, so projectable() " + + "is answering true unconditionally", rejected > 0); + assertTrue(name + ": the inverse rejected every plane point, which cannot be right " + + "either", accepted > 0); + } + } + + /** + * Every point of the sphere projects, and round-trips back to itself. + * + *

A lobe dispatcher's characteristic failure is a seam: a band of longitudes that the + * forward sends into lobe A and the inverse recovers from lobe B. The corpus samples 8 or 16 + * points; this sweeps a 5° grid, about 2,500 points per projection, and asserts a residual + * under a metre. Points exactly on a lobe boundary are skipped, because which lobe claims them + * is a tie-break upstream resolves by the direction of its comparisons and is not a + * round-trip property. + */ + @Test + public void everyPointRoundTrips() { + for (String name : new String[] {"igh", "igh_o", "imoll", "imoll_o"}) { + Projection p = TierBCorpus.build("+proj=" + name + " +a=6400000"); + int checked = 0; + for (double lon = -177.5; lon <= 177.5; lon += 5) { + for (double lat = -87.5; lat <= 87.5; lat += 5) { + ProjCoordinate xy = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + p.project(new ProjCoordinate(lon, lat), xy); + p.inverseProject(xy, back); + // ~1 m on the ground at this radius is 9e-6 degrees. + assertEquals(name + " round-trip longitude at (" + lon + ", " + lat + ")", + lon, back.x, 1e-5); + assertEquals(name + " round-trip latitude at (" + lon + ", " + lat + ")", + lat, back.y, 1e-5); + checked++; + } + } + assertEquals(name + ": grid size", 72 * 36, checked); + } + } + + /** + * {@code igh}'s Mollweide/sinusoidal seam is continuous, which is what its measured + * {@code dy0} buys. + * + *

{@code dy0} is derived at setup time by forwarding 40°44'11.8" through both a + * Mollweide lobe and a sinusoidal one and differencing the northings. If it were hard-coded to + * a rounded decimal, or computed in the wrong direction, the two halves of the map would not + * meet — so the northing a hair either side of the transition latitude must agree. + * + *

Only the northing. {@code dy0} is a {@code y} offset and nothing corrects + * {@code x}, so the meridians have a real kink at the seam: measured at longitude 0, the + * easting jumps by 0.73 m for {@code igh} and 0.24 m for {@code igh_o}, out of + * about 811 896 m and 258 000 m respectively — Mollweide's + * {@code C_x * lam * cos(theta/2)} against sinusoidal's {@code lam * cos(phi)}, and the size + * depends on how far the probe is from that lobe's own central meridian. That is the Goode + * homolosine's defining compromise, not a defect: an earlier version of this test asserted + * {@code x} continuity and failed on it. Do not "fix" it. + */ + @Test + public void ighTransitionLatitudeIsContinuous() { + double boundary = (40 + 44 / 60. + 11.8 / 3600.); + for (String name : new String[] {"igh", "igh_o"}) { + Projection p = TierBCorpus.build("+proj=" + name + " +a=6400000"); + ProjCoordinate below = new ProjCoordinate(); + ProjCoordinate above = new ProjCoordinate(); + p.project(new ProjCoordinate(0, boundary - 1e-9), below); + p.project(new ProjCoordinate(0, boundary + 1e-9), above); + assertEquals(name + ": the Mollweide/sinusoidal seam must be continuous in y", + below.y, above.y, 1e-3); + // x is NOT continuous, and the kink is small but real. Its size depends on the + // longitude's distance from the lobe's own central meridian, so it differs between the + // two operators at the same probe: 0.73 m for igh (lobes 2/4 at lam0 = +30) and + // 0.243 m for igh_o (lobes 2/5 at lam0 = -10). Asserting a bound rather than a value + // keeps the point -- the seam is joined in y and merely nearly joined in x. + double kink = Math.abs(above.x - below.x); + assertTrue(name + ": the easting kink at the seam was " + kink + + " m, which is not the sub-metre bend the homolosine has by construction", + kink > 1e-3 && kink < 5.0); + } + } + + private static void assertRejects(Projection p, String name, double x, double y) { + try { + p.inverseProject(new ProjCoordinate(x, y), new ProjCoordinate()); + fail(name + ": (" + x + ", " + y + ") is off the map and must be rejected"); + } catch (Proj4jException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("map") || expected.getMessage() + .contains("interruption")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierB/ModifiedStereographicCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierB/ModifiedStereographicCorpusTest.java new file mode 100644 index 0000000..8b5ac45 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierB/ModifiedStereographicCorpusTest.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierB; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.AlaskaModifiedStereographicProjection; +import org.locationtech.proj4j.proj.ModifiedStereographic50Projection; +import org.locationtech.proj4j.proj.Projection; + +/** + * The five {@code mod_ster.cpp} operators against {@code builtins.gie}: {@code gs50} 16, + * {@code alsk} 16, {@code gs48} 8, {@code mil_os} 8, {@code lee_os} 8 — 56 assertions, the + * highest Tier B payoff. + * + *

All five parse straight through {@code Proj4Parser}: none of them reads a parameter the + * parser does not already dispatch. + */ +public class ModifiedStereographicCorpusTest { + + @Test + public void gs50MatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "gs50", 16); + } + + @Test + public void alskMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "alsk", 16); + } + + @Test + public void gs48MatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "gs48", 8); + } + + @Test + public void milOsMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "mil_os", 8); + } + + @Test + public void leeOsMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "lee_os", 8); + } + + /** + * {@code alsk} used to be registered to the abstract {@link Projection} base class, so the name + * resolved and then could not be instantiated. It must now produce a real projection. + */ + @Test + public void alskIsNoLongerRegisteredToTheAbstractBase() { + Projection alsk = new Registry().getProjection("alsk"); + assertNotNull("+proj=alsk", alsk); + assertTrue(alsk.getClass().getName(), + alsk instanceof AlaskaModifiedStereographicProjection); + assertTrue("alsk must declare an inverse; mod_ster_setup assigns P->inv unconditionally", + alsk.hasInverse()); + } + + /** All five names resolve. */ + @Test + public void allFiveNamesAreRegistered() { + Registry registry = new Registry(); + for (String name : new String[] {"alsk", "gs48", "gs50", "lee_os", "mil_os"}) { + assertNotNull("+proj=" + name, registry.getProjection(name)); + } + } + + /** + * {@code alsk} and {@code gs50} replace the requested ellipsoid with + * {@code a = 6378206.4, es = 0.00676866} — upstream's literal, not clrk66's own + * {@code es}. + * + *

This is the constant-fidelity rule with a measurable consequence: clrk66's own + * {@code es} is {@code 0.00676865799729...}, and re-deriving it instead of using the literal + * moves the {@code gs50 +ellps=clrk66} forward by about 0.7 mm — seven times the corpus's + * 0.1 mm bar. So the assertion is on the stomped value, not on agreement with the ellipsoid. + */ + @Test + public void gs50AndAlskStompTheEllipsoidWithUpstreamsLiteral() { + Projection gs50 = TierBCorpus.build("+proj=gs50 +ellps=clrk66"); + Projection alsk = TierBCorpus.build("+proj=alsk +ellps=clrk66"); + for (Projection p : new Projection[] {gs50, alsk}) { + assertEquals(p.getName() + " stomped semi-major axis", 6378206.4, + p.getEquatorRadius(), 0.0); + } + // The ellipsoid object is untouched -- getEllipsoid() still reports what +ellps= asked for + // -- and its own es is NOT the value the kernel runs on. Asserting the inequality means a + // future "tidy-up" that derives es from the ellipsoid fails here, loudly, instead of 0.7 mm + // downstream in eight corpus rows. + double clrk66Es = gs50.getEllipsoid().getEccentricitySquared(); + assertTrue("clrk66's own es is " + clrk66Es + ", which must not be the stomped 0.00676866 " + + "-- if these ever coincide this assertion has stopped testing anything", + clrk66Es != 0.00676866); + } + + /** + * The {@code (0, 0)} early return of {@code mod_ster_e_inverse} lands exactly on the + * projection centre ({@code mod_ster.cpp:82-89}), not at longitude zero. + * + *

Upstream returns {@code lam = 0} there specifically so that {@code inv_finalize} adds + * {@code lam0} and the answer is the centre. Getting this wrong gives Greenwich for every + * variant, which is a plausible coordinate and therefore the dangerous kind of wrong. + */ + @Test + public void originInvertsToTheProjectionCentre() { + String[][] cases = { + {"+proj=gs48 +R=6370997", "-96", "39"}, + {"+proj=gs50 +R=6370997", "-120", "45"}, + {"+proj=alsk +R=6370997", "-152", "64"}, + {"+proj=lee_os +R=6400000", "-165", "-10"}, + {"+proj=mil_os +R=6400000", "20", "18"}, + }; + for (String[] c : cases) { + Projection p = TierBCorpus.build(c[0]); + ProjCoordinate out = new ProjCoordinate(); + p.inverseProject(new ProjCoordinate(0, 0), out); + assertEquals(c[0] + " inverse of (0,0) longitude", Double.parseDouble(c[1]), out.x, + 1e-9); + assertEquals(c[0] + " inverse of (0,0) latitude", Double.parseDouble(c[2]), out.y, + 1e-9); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierB/ObliqueTransformationCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierB/ObliqueTransformationCorpusTest.java new file mode 100644 index 0000000..d454351 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierB/ObliqueTransformationCorpusTest.java @@ -0,0 +1,336 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierB; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.ObliqueTransformationProjection; +import org.locationtech.proj4j.proj.Projection; + +/** + * {@code +proj=ob_tran} against {@code builtins.gie} and {@code more_builtins.gie}. + * + *

Four corpus operations, 12 assertions of which 2 are {@code expect failure}: + * + * + * + * + * + * + * + * + * + * + * + * + *
the four blocks
file:lineoperationassertions
{@code builtins.gie:5049}{@code +o_proj=latlon +o_lon_p=20 +o_lat_p=20 +lon_0=180}8
{@code builtins.gie:5072}{@code +o_proj +o_proj=ob_tran}1, {@code expect failure errno invalid_op_missing_arg}
{@code more_builtins.gie:16}{@code +o_proj=moll +o_lon_p=0 +o_lat_p=0 +lon_0=180}2
{@code more_builtins.gie:454}{@code +o_proj=helmert +o_lat_p=0}1, {@code expect failure errno no_inverse_op}
+ * + *

The first block exercises {@code PJ_IO_UNITS_WHATEVER} — its child is {@code latlon}, so both + * directions bypass the {@code a}/{@code x_0}/{@code fr_meter} layer and the expected values are + * raw radians despite {@code +R=6400000} being present. The third exercises the + * transverse branch, because {@code +o_lat_p=0} makes {@code |phip| ≤ 1e-10}. So + * between them the four blocks cover both dispatch modes, the {@code WHATEVER} demotion, the + * recursion block and a missing child. + */ +public class ObliqueTransformationCorpusTest { + + @Test + public void obTranMatchesBuiltins() { + TierBCorpus.assertAll("builtins.gie", "ob_tran", 9); + } + + @Test + public void obTranMatchesMoreBuiltins() { + TierBCorpus.assertAll("more_builtins.gie", "ob_tran", 3); + } + + @Test + public void nameIsRegistered() { + Projection p = new Registry().getProjection("ob_tran"); + assertNotNull("+proj=ob_tran", p); + assertTrue(p instanceof ObliqueTransformationProjection); + } + + // ------------------------------------------------------------------------------------------ + // ob_tran_target_params -- the o_proj= rewrite + // ------------------------------------------------------------------------------------------ + + /** + * {@code o_proj=xxx} becomes {@code proj=xxx} by dropping the first two characters, and + * {@code proj=ob_tran} and a bare {@code inv} are dropped. Everything else survives verbatim, + * including {@code +o_lat_p}, which the child ignores. + */ + @Test + public void childParametersRewritesOProjAndDropsTheWrapper() { + assertArrayEquals( + new String[] {"R=6400000", "o_lon_p=20", "o_lat_p=20", "lon_0=180", "proj=latlon"}, + childParameters("+proj=ob_tran +R=6400000 +o_lon_p=20 +o_lat_p=20 +lon_0=180 " + + "+o_proj=latlon")); + // `inv` is dropped; the leading + is optional on every token. + assertArrayEquals(new String[] {"proj=moll", "R=1"}, + childParameters("proj=ob_tran o_proj=moll inv R=1")); + } + + /** Only the FIRST {@code o_proj=} token is rewritten; upstream breaks out of the loop. */ + @Test + public void onlyTheFirstOProjTokenIsRewritten() { + assertArrayEquals(new String[] {"proj=moll", "o_proj=sinu"}, + childParameters("+proj=ob_tran +o_proj=moll +o_proj=sinu")); + } + + /** + * A bare {@code +o_proj} with no value satisfies the "is {@code o_proj} present" test — because + * {@code pj_param}'s {@code 's'} sigil yields the empty string, not {@code nullptr} — but is + * not the token the rewrite loop matches, because {@code strncmp("o_proj", "o_proj=", 7)} + * compares the terminating NUL against {@code '='}. + * + *

That combination is precisely why {@code builtins.gie:5072}'s + * {@code +o_proj +o_proj=ob_tran} reaches the recursion check and fails there with + * {@code invalid_op_missing_arg} rather than with "missing o_proj" or with an illegal-value + * error. + */ + @Test + public void bareOProjIsPresentButIsNotRewritten() { + assertArrayEquals(new String[] {"o_proj", "proj=moll"}, + childParameters("+proj=ob_tran +o_proj +o_proj=moll")); + } + + @Test + public void recursionIsBlockedAfterTheRewrite() { + try { + childParameters("+proj=ob_tran +R=6400000 +o_proj +o_proj=ob_tran"); + fail("+o_proj=ob_tran must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("recursion")); + } + } + + @Test + public void missingOProjIsRejected() { + try { + childParameters("+proj=ob_tran +R=6400000 +o_lat_p=20"); + fail("a definition with no +o_proj must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("o_proj")); + } + } + + /** {@link ObliqueTransformationProjection#initialize()} with no child is upstream's + * "Missing parameter: o_proj". */ + @Test + public void bareObTranRefuses() { + try { + new ObliqueTransformationProjection().initialize(); + fail("+proj=ob_tran with no child must refuse"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("o_proj")); + } + } + + // ------------------------------------------------------------------------------------------ + // Forward-only-if-the-child-has-one + // ------------------------------------------------------------------------------------------ + + /** + * {@code +proj=ob_tran +o_proj=guyou} has a forward and no inverse, because + * {@code guyou} has none — {@code Q->link->inv ? o_inverse : nullptr}. + * + *

Asking for the inverse must fail rather than return anything. Both halves matter: a + * silent identity here would hand back projected metres reinterpreted as radians, which is the + * exact defect class the fail-closed gate exists for. + */ + @Test + public void guyouChildGivesAForwardAndNoInverse() { + Projection p = TierBCorpus.build("+proj=ob_tran +o_proj=guyou +R=6400000 +o_lat_p=45 " + + "+o_lon_p=0"); + assertFalse("guyou has no inverse, so neither does ob_tran over it", p.hasInverse()); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(10, 20), out); + assertTrue("the forward must work: " + out, Double.isFinite(out.x) + && Double.isFinite(out.y) && (out.x != 0.0 || out.y != 0.0)); + try { + p.inverseProject(new ProjCoordinate(out.x, out.y), new ProjCoordinate()); + fail("ob_tran over guyou must have no inverse"); + } catch (Proj4jException expected) { + assertTrue(expected.getMessage(), expected.getMessage().toLowerCase() + .contains("inverse")); + } + } + + /** A child that does have an inverse gives the wrapper one. */ + @Test + public void mollweideChildGivesBothDirections() { + Projection p = TierBCorpus.build("+proj=ob_tran +o_proj=moll +R=6378137.0 +o_lon_p=0 " + + "+o_lat_p=0 +lon_0=180"); + assertTrue("moll has an inverse", p.hasInverse()); + } + + // ------------------------------------------------------------------------------------------ + // PJ_IO_UNITS_WHATEVER + // ------------------------------------------------------------------------------------------ + + /** + * With a {@code latlon} child the wrapper applies no affine at all, so {@code +R=6400000} has + * no effect on the output and the numbers are radians. + * + *

Checked by comparing against the same rotation on a completely different radius: if the + * demotion were missed, the two would differ by the ratio of the radii — a factor of 6.4 + * million, not a rounding. + */ + @Test + public void radiansChildIsNotScaledByTheSemiMajorAxis() { + Projection big = TierBCorpus.build( + "+proj=ob_tran +R=6400000 +o_proj=latlon +o_lon_p=20 +o_lat_p=20 +lon_0=180"); + Projection small = TierBCorpus.build( + "+proj=ob_tran +R=1 +o_proj=latlon +o_lon_p=20 +o_lat_p=20 +lon_0=180"); + ProjCoordinate a = new ProjCoordinate(); + ProjCoordinate b = new ProjCoordinate(); + big.project(new ProjCoordinate(2, 1), a); + small.project(new ProjCoordinate(2, 1), b); + assertEquals("x must not scale with +R", a.x, b.x, 0.0); + assertEquals("y must not scale with +R", a.y, b.y, 0.0); + // And the value really is in radians: builtins.gie:5049's first expect row. + assertEquals(-2.685687214, a.x, 1e-8); + assertEquals(1.237430235, a.y, 1e-8); + } + + /** A projected child keeps the affine, so {@code +R} does scale it. */ + @Test + public void projectedChildIsScaledByTheSemiMajorAxis() { + Projection p = TierBCorpus.build("+proj=ob_tran +o_proj=moll +R=6378137.0 +o_lon_p=0 " + + "+o_lat_p=0 +lon_0=180"); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(10, 20), out); + // more_builtins.gie:29-30, tolerance 1 mm. + assertEquals(-1384841.18787, out.x, 1e-3); + assertEquals(7581707.88240, out.y, 1e-3); + } + + // ------------------------------------------------------------------------------------------ + // The three pole specifications + // ------------------------------------------------------------------------------------------ + + /** + * {@code |o_lat_p| ≤ 1e-10} selects the transverse branch, anything larger the oblique one, + * and the two are genuinely different formulae — so a point must not project the same way under + * both. + */ + @Test + public void transverseAndObliqueBranchesDiffer() { + Projection transverse = TierBCorpus.build( + "+proj=ob_tran +R=1 +o_proj=latlon +o_lon_p=0 +o_lat_p=0"); + Projection oblique = TierBCorpus.build( + "+proj=ob_tran +R=1 +o_proj=latlon +o_lon_p=0 +o_lat_p=1e-6"); + ProjCoordinate a = new ProjCoordinate(); + ProjCoordinate b = new ProjCoordinate(); + transverse.project(new ProjCoordinate(30, 40), a); + oblique.project(new ProjCoordinate(30, 40), b); + assertTrue("the two branches must not be the same formula: " + a + " vs " + b, + Math.abs(a.x - b.x) > 1e-12 || Math.abs(a.y - b.y) > 1e-12); + } + + /** {@code +o_alpha} wins over {@code +o_lat_p}: the three specifications are tested in order + * and by presence, not by value. */ + @Test + public void oAlphaTakesPrecedenceOverOLatP() { + Projection alphaForm = TierBCorpus.build("+proj=ob_tran +R=1 +o_proj=latlon +o_alpha=30 " + + "+o_lon_c=10 +o_lat_c=20 +o_lat_p=80 +o_lon_p=80"); + Projection poleForm = TierBCorpus.build("+proj=ob_tran +R=1 +o_proj=latlon +o_lat_p=80 " + + "+o_lon_p=80"); + ProjCoordinate a = new ProjCoordinate(); + ProjCoordinate b = new ProjCoordinate(); + alphaForm.project(new ProjCoordinate(5, 5), a); + poleForm.project(new ProjCoordinate(5, 5), b); + assertTrue("+o_alpha must win over +o_lat_p: " + a + " vs " + b, + Math.abs(a.x - b.x) > 1e-9 || Math.abs(a.y - b.y) > 1e-9); + } + + /** {@code |o_lat_c|} at the pole is rejected ({@code ob_tran.cpp:236-241}). */ + @Test + public void oLatCAtThePoleIsRejected() { + for (String latC : new String[] {"90", "-90"}) { + try { + TierBCorpus.build("+proj=ob_tran +R=1 +o_proj=latlon +o_alpha=30 +o_lon_c=0 " + + "+o_lat_c=" + latC); + fail("+o_lat_c=" + latC + " must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("lat_c")); + } + } + } + + /** + * The two-point form's four guards, each triggered on its own. + * + *

Note which guard a definition with no pole specification at all trips. Absent + * angular parameters default to 0 through {@code pj_param}'s {@code "r"} sigil, so + * {@code +proj=ob_tran +o_proj=moll} lands in the two-point branch with + * {@code lat_1 = lat_2 = 0} — and because upstream tests "the two must differ" before + * "lat_1 must not be zero" ({@code ob_tran.cpp:262-273}), the message it gets is + * "lat_1 should be different from lat_2", not "different from zero". The order is + * upstream's and is asserted here so that a reordering shows up as a test change rather than + * as a differently-worded error in the field. + */ + @Test + public void twoPointFormGuards() { + String base = "+proj=ob_tran +R=1 +o_proj=latlon "; + assertRejected(base + "+o_lon_1=0 +o_lat_1=90 +o_lon_2=10 +o_lat_2=20", "lat_1"); + assertRejected(base + "+o_lon_1=0 +o_lat_1=20 +o_lon_2=10 +o_lat_2=90", "lat_2"); + assertRejected(base + "+o_lon_1=0 +o_lat_1=20 +o_lon_2=10 +o_lat_2=20", + "different from lat_2"); + assertRejected(base + "+o_lon_1=0 +o_lat_1=0 +o_lon_2=10 +o_lat_2=20", + "different from zero"); + // No pole specification at all falls into this branch with lat_1 == lat_2 == 0, and the + // "must differ" guard is tested first, so that is the message -- not "different from zero". + assertRejected("+proj=ob_tran +R=1 +o_proj=moll", "lat_1 should be different from lat_2"); + } + + /** The two-point form does work when all four guards are satisfied. */ + @Test + public void twoPointFormResolvesAPole() { + Projection p = TierBCorpus.build("+proj=ob_tran +R=1 +o_proj=latlon +o_lon_1=0 " + + "+o_lat_1=45 +o_lon_2=90 +o_lat_2=10"); + ProjCoordinate out = new ProjCoordinate(); + p.project(new ProjCoordinate(20, 30), out); + assertTrue("the two-point form must produce a finite rotation: " + out, + Double.isFinite(out.x) && Double.isFinite(out.y)); + } + + private static void assertRejected(String definition, String expectedFragment) { + try { + TierBCorpus.build(definition); + fail(definition + " must be rejected"); + } catch (InvalidValueException expected) { + assertTrue(definition + " -> " + expected.getMessage(), + expected.getMessage().contains(expectedFragment)); + } + } + + private static String[] childParameters(String definition) { + return ObliqueTransformationProjection.childParameters(definition.split("\\s+")); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierB/SomFamilyCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierB/SomFamilyCorpusTest.java new file mode 100644 index 0000000..4677be4 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierB/SomFamilyCorpusTest.java @@ -0,0 +1,171 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierB; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.MisrSpaceObliqueMercatorProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpaceObliqueMercatorProjection; + +/** + * {@code +proj=som} and {@code +proj=misrsom} against {@code builtins.gie}. + * + *

48 assertions: {@code som} has four operation blocks of 8 (two spelling the same angles in + * degrees and in radians, on GRS80 and on a sphere), {@code misrsom} has two of 8. Every block is + * 4 forward rows and 4 inverse rows at {@code tolerance 0.1 mm}. + * + *

The two {@code som} spellings must give identical answers. + * {@code +inc_angle=1.7157253262878522r} and {@code +inc_angle=98.30382} are the same angle written + * two ways, and the corpus asserts byte-identical expected values for both — which is only true if + * the {@code r} radian suffix is honoured. That is exactly the parameter form + * {@code Proj4Parser.parseAngle} handles and this test's reader mirrors. + */ +public class SomFamilyCorpusTest { + + @Test + public void somMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "som", 32); + } + + @Test + public void misrsomMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "misrsom", 16); + } + + /** + * The two {@code som} spellings of the same orbit produce the same expected values, and there + * are exactly four blocks. Guards against a corpus move silently halving the count. + */ + @Test + public void somHasFourBlocksTwoOfWhichUseTheRadianSuffix() { + List blocks = TierBCorpus.blocksFor("builtins.gie", "som"); + assertEquals("som operation blocks in builtins.gie", 4, blocks.size()); + int radianSuffix = 0; + for (TierBCorpus.Block b : blocks) { + assertEquals("assertions per som block", 8, b.assertionCount()); + if (b.operation.contains("r ") || b.operation.endsWith("r")) { + radianSuffix++; + } + } + assertEquals("som blocks written with the r radian suffix", 2, radianSuffix); + } + + /** + * {@code misrsom} rejects a path outside {@code [1, 233]}, which is + * {@code som.cpp:281}'s own check — not a Proj4J invention. + */ + @Test + public void misrsomRejectsPathOutOfRange() { + for (int path : new int[] {-1, 0, 234, 1000}) { + MisrSpaceObliqueMercatorProjection p = new MisrSpaceObliqueMercatorProjection(); + p.setEllipsoid(Ellipsoid.GRS80); + p.setPath(path); + try { + p.initialize(); + fail("+proj=misrsom +path=" + path + " should be rejected"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("path")); + } + } + } + + /** + * A fully specified {@code +proj=som} now reaches this class with its orbital parameters + * intact. + * + *

This assertion used to be its own inverse, and the history is the point. + * {@code SpaceObliqueMercatorProjection.initialize()} carried the one deliberate divergence + * from 9.8.1 in this family: it refused when {@code +inc_angle}/{@code +ps_rev}/ + * {@code +asc_lon} had never been set, because {@code Proj4Parser} dropped all three and + * upstream defaults all three to {@code 0} — and {@code 0} passes every one of upstream's own + * range checks, so verbatim behaviour plus the parser gap would have answered a fully + * specified definition with the coordinates of a satellite that does not move. + * + *

{@code Proj4Parser} now dispatches the three keys, so the gap is closed and the guard is + * deleted; this class is verbatim 9.8.1 again, defaults included. What is asserted here is the + * fact that made the guard removable: the values arrive. {@code Q->alf} and + * {@code P->lam0} are radians, converted on the way in because upstream reads both with + * {@code pj_param}'s {@code r} sigil ({@code som.cpp:250,259}), and {@code Q->p22} is a plain + * double in days per revolution. + * + *

{@code misrsom}'s equivalent refusal is not a divergence and stays — see + * {@link #misrsomRejectsPathOutOfRange()}, where {@code path <= 0} is upstream's own error. + */ + @Test + public void aFullySpecifiedSomKeepsItsOrbitalParameters() { + CoordinateReferenceSystem crs = new CRSFactory().createFromParameters("som", + "+proj=som +ellps=GRS80 +inc_angle=98.30382 +ps_rev=0.06866666666666667 " + + "+asc_lon=127.7605356226"); + SpaceObliqueMercatorProjection p = + (SpaceObliqueMercatorProjection) crs.getProjection(); + assertEquals("+inc_angle, radians", Math.toRadians(98.30382), p.getIncidenceAngle(), 1e-15); + assertEquals("+ps_rev, day/rev", 0.06866666666666667, p.getPeriodOfRevolution(), 0.0); + assertEquals("+asc_lon, radians", Math.toRadians(127.7605356226), + p.getProjectionLongitude(), 1e-15); + } + + /** {@code +proj=som} and {@code +proj=misrsom} resolve through the registry. */ + @Test + public void bothNamesAreRegistered() { + Registry registry = new Registry(); + assertNotNull("+proj=som", registry.getProjection("som")); + assertNotNull("+proj=misrsom", registry.getProjection("misrsom")); + assertTrue(registry.getProjection("som") instanceof SpaceObliqueMercatorProjection); + assertTrue(registry.getProjection("misrsom") + instanceof MisrSpaceObliqueMercatorProjection); + } + + /** + * {@code som}, parameterised as {@code misrsom} is, agrees with {@code misrsom} to the last + * bit — the two really are one kernel with different presets. + * + *

{@code misrsom +path=1} is {@code asc_lon = 129.3056° − 360°/233}, and the corpus's + * {@code som} blocks spell exactly that number, so this also checks that the derivation from + * {@code +path} is right rather than merely plausible. + */ + @Test + public void somWithMisrPresetsEqualsMisrsom() { + Projection som = TierBCorpus.build( + "+proj=som +ellps=GRS80 +inc_angle=98.30382 +ps_rev=0.06866666666666667 " + + "+asc_lon=127.7605356226"); + Projection misrsom = TierBCorpus.build("+proj=misrsom +ellps=GRS80 +path=1"); + for (double[] pt : new double[][] {{2, 1}, {2, -1}, {-2, 1}, {-2, -1}, {0, 0}}) { + ProjCoordinate a = new ProjCoordinate(); + ProjCoordinate b = new ProjCoordinate(); + som.project(new ProjCoordinate(pt[0], pt[1]), a); + misrsom.project(new ProjCoordinate(pt[0], pt[1]), b); + // 0.1 mm is the corpus bar; the asc_lon literal in the corpus is a 10-digit rounding + // of 129.3056 - 360/233, so this is agreement to the corpus's own precision, not to + // the bit. + assertEquals("som vs misrsom x at " + pt[0] + "," + pt[1], a.x, b.x, 1e-4); + assertEquals("som vs misrsom y at " + pt[0] + "," + pt[1], a.y, b.y, 1e-4); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierB/TierBCorpus.java b/core/src/test/java/org/locationtech/proj4j/proj/tierB/TierBCorpus.java new file mode 100644 index 0000000..e99d234 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierB/TierBCorpus.java @@ -0,0 +1,537 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierB; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.gie.GieComparator; +import org.locationtech.proj4j.gie.GieDirection; +import org.locationtech.proj4j.gie.GieIoUnits; +import org.locationtech.proj4j.gie.GieTolerance; +import org.locationtech.proj4j.proj.MisrSpaceObliqueMercatorProjection; +import org.locationtech.proj4j.proj.ObliqueTransformationProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.SpaceObliqueMercatorProjection; +import org.locationtech.proj4j.units.Angle; + +/** + * Reads {@code operation} blocks out of the vendored {@code gie} corpus and runs them, for the + * Tier B / Tier C projections. + * + *

Why this is a second copy of the Tier A reader

+ * + *

{@code proj.tierA.GieBlock} and {@code proj.tierA.GieCheck} are package-private in + * {@code ...proj.tierA}, so they cannot be called from here, and the brief for this change scopes + * it to {@code proj/tierB/**}. The lexing and the metric selection are therefore duplicated + * deliberately rather than by oversight. Both defer to the same published, separately-tested + * classes for the two things that are easy to get wrong — {@link GieTolerance} for the + * {@code tolerance} verb and {@link GieComparator}/{@link GieIoUnits} for the metric — so the two + * copies cannot disagree about anything numerical. If they are ever merged, merge them into + * {@code src/main}'s {@code org.locationtech.proj4j.gie} package, not into one of the two test + * packages. + * + *

Two capabilities this adds over the Tier A copy: + *

    + *
  • {@code expect failure} rows are retained rather than skipped, because three of the + * four Tier B groups here have one and the assertion is that Proj4J throws. A skipped + * failure row is the "failure-to-implement scoring as conformance" trap that cost this project + * a retracted baseline once already.
  • + *
  • Parameters {@code Proj4Parser} does not dispatch can be applied, for the three + * operators whose corpus lines need them. See {@link #build(String)}.
  • + *
+ */ +final class TierBCorpus { + + /** Repo-relative location of the vendored corpus. */ + private static final String CORPUS = "conformance/src/test/resources/gie"; + + private TierBCorpus() { + } + + // ------------------------------------------------------------------------------------------ + // Model + // ------------------------------------------------------------------------------------------ + + /** One {@code accept}/{@code expect} pair, one {@code roundtrip}, or one failure row. */ + static final class Row { + final double[] accept; + final double[] expect; + final double toleranceMetres; + final boolean inverse; + final int roundtripTrips; + final boolean expectFailure; + final int lineNumber; + + Row(double[] accept, double[] expect, double toleranceMetres, boolean inverse, + int roundtripTrips, boolean expectFailure, int lineNumber) { + this.accept = accept; + this.expect = expect; + this.toleranceMetres = toleranceMetres; + this.inverse = inverse; + this.roundtripTrips = roundtripTrips; + this.expectFailure = expectFailure; + this.lineNumber = lineNumber; + } + + boolean isRoundtrip() { + return roundtripTrips > 0; + } + + @Override + public String toString() { + return "line " + lineNumber + (isRoundtrip() ? " roundtrip " + roundtripTrips + : (inverse ? " inverse" : " forward")) + (expectFailure ? " expect-failure" : ""); + } + } + + /** One {@code operation} block. */ + static final class Block { + final String operation; + final List rows; + + Block(String operation, List rows) { + this.operation = operation; + this.rows = rows; + } + + /** Total assertions: every {@code expect} (including {@code expect failure}) and every + * {@code roundtrip}. */ + int assertionCount() { + return rows.size(); + } + } + + // ------------------------------------------------------------------------------------------ + // Reading + // ------------------------------------------------------------------------------------------ + + static Path requireCorpus() { + Path dir = Paths.get("").toAbsolutePath(); + for (int up = 0; up < 6 && dir != null; up++, dir = dir.getParent()) { + Path candidate = dir.resolve(CORPUS); + if (Files.isDirectory(candidate)) { + return candidate; + } + } + throw new IllegalStateException("vendored gie corpus not found: expected " + CORPUS + + " within six parents of " + Paths.get("").toAbsolutePath() + + ". Expected values are read from the corpus rather than transcribed, so a " + + "missing corpus is a failure, not a skip."); + } + + /** + * Every {@code operation} block in {@code file} whose operation line carries + * {@code proj=} as a whole token, pipelines excluded. + */ + static List blocksFor(String file, String projName) { + Path path = requireCorpus().resolve(file); + List lines; + try { + lines = Files.readAllLines(path, StandardCharsets.UTF_8); + } catch (IOException e) { + throw new UncheckedIOException("cannot read " + path, e); + } + + List blocks = new ArrayList(); + String operation = null; + List rows = null; + double tolerance = GieTolerance.DEFAULT_TOLERANCE; + boolean inverse = false; + double[] pendingAccept = null; + boolean matching = false; + + for (int i = 0; i < lines.size(); i++) { + String raw = lines.get(i); + int hash = raw.indexOf('#'); + String line = (hash >= 0 ? raw.substring(0, hash) : raw).trim(); + if (line.isEmpty() || line.startsWith("---") || line.startsWith("===") + || line.startsWith("<")) { + continue; + } + String[] tok = line.split("\\s+"); + String verb = tok[0].toLowerCase(); + + if ("operation".equals(verb)) { + if (matching) { + blocks.add(new Block(operation, rows)); + } + operation = line.substring("operation".length()).trim(); + matching = matches(operation, projName); + rows = new ArrayList(); + // gie resets tolerance and direction at every new operation. + tolerance = GieTolerance.DEFAULT_TOLERANCE; + inverse = false; + pendingAccept = null; + } else if (!matching) { + continue; + } else if ("tolerance".equals(verb)) { + // GieTolerance, never a local parser: `tolerance 1cm` means ONE METRE in PROJ, + // because gie takes the unit from whitespace column 2 and a fused token has none. + tolerance = GieTolerance.tolerance(line.substring("tolerance".length()).trim()); + } else if ("direction".equals(verb)) { + inverse = tok.length > 1 && tok[1].toLowerCase().startsWith("inv"); + } else if ("accept".equals(verb)) { + pendingAccept = parseOrdinates(tok); + } else if ("expect".equals(verb)) { + boolean failure = tok.length > 1 && "failure".equals(tok[1].toLowerCase()); + if (failure) { + // An `expect failure` with no preceding `accept` asserts that the OPERATION + // cannot be created at all; with one, that the transform of that point fails. + rows.add(new Row(pendingAccept, null, tolerance, inverse, 0, true, i + 1)); + } else if (pendingAccept != null) { + rows.add(new Row(pendingAccept, parseOrdinates(tok), tolerance, inverse, 0, + false, i + 1)); + } + pendingAccept = null; + } else if ("roundtrip".equals(verb)) { + int trips = tok.length > 1 ? Integer.parseInt(tok[1]) : 1; + if (pendingAccept != null) { + rows.add(new Row(pendingAccept, null, tolerance, inverse, trips, false, + i + 1)); + pendingAccept = null; + } else if (!rows.isEmpty()) { + rows.add(new Row(rows.get(rows.size() - 1).accept, null, tolerance, inverse, + trips, false, i + 1)); + } + } + } + if (matching) { + blocks.add(new Block(operation, rows)); + } + return blocks; + } + + /** Whole-token match; pipelines excluded because they are not a bare {@link Projection}. */ + private static boolean matches(String operation, String projName) { + boolean found = false; + for (String t : operation.split("\\s+")) { + String s = t.startsWith("+") ? t.substring(1) : t; + if (s.equals("proj=pipeline")) { + return false; + } + if (s.equals("proj=" + projName)) { + found = true; + } + } + return found; + } + + /** + * Ordinates of an {@code accept}/{@code expect} line. Underscores are digit-group separators + * in the corpus ({@code 10_018_754.1714}) and {@link Double#parseDouble} rejects them, so they + * are stripped exactly as PROJ's {@code pj_shrink} does. + */ + private static double[] parseOrdinates(String[] tok) { + List v = new ArrayList(); + for (int i = 1; i < tok.length; i++) { + v.add(Double.valueOf(tok[i].replace("_", ""))); + } + double[] out = new double[v.size()]; + for (int i = 0; i < out.length; i++) { + out[i] = v.get(i).doubleValue(); + } + return out; + } + + // ------------------------------------------------------------------------------------------ + // Building the operation + // ------------------------------------------------------------------------------------------ + + /** + * Builds the {@link Projection} an operation line describes. + * + *

Most Tier B operation lines go straight through {@link CRSFactory}, which is the honest + * path: it exercises the real parser. Three operators cannot, because + * {@code Proj4Parser.parseProjection} has no dispatch for the parameters their corpus lines + * carry, and Proj4J's parse mode is {@code PROJ_COMPATIBLE} — an unrecognised key is retained + * and silently ignored, exactly as PROJ does. For those three the parser's job is done here, + * explicitly: + * + * + * + * + * + * + * + *
the undispatched keys, per operator
{@code +proj=}keys the parser drops
{@code som}{@code +inc_angle}, {@code +ps_rev}, {@code +asc_lon}
{@code misrsom}{@code +path}
{@code ob_tran}{@code +o_proj}, {@code +o_lat_p}, {@code +o_lon_p}, + * {@code +o_alpha}, {@code +o_lon_c}, {@code +o_lat_c}, + * {@code +o_lon_1/2}, {@code +o_lat_1/2}
+ * + *

This is not a private parser and must not grow into one. The ellipsoid still comes + * from the real {@code Proj4Parser}, obtained by parsing the same line with {@code proj=} + * swapped for {@code merc} — which keeps {@code +ellps=}, {@code +R=}, {@code +a=} and the + * whole shape/spherification precedence in the code that owns it. Only the keys tabulated + * above, plus {@code +lon_0} (which one {@code ob_tran} line needs and which the parser + * does handle, but which has to be applied before {@code initialize()} on the manual + * path), are set here. + */ + static Projection build(String operation) { + String[] args = operation.split("\\s+"); + Map params = parameterMap(args); + String projName = params.get("proj"); + + if (!needsUndispatchedParameters(projName)) { + return new CRSFactory().createFromParameters("gie", args).getProjection(); + } + + Projection p = new Registry().getProjection(projName); + p.setEllipsoid(ellipsoidOf(args)); + if (params.containsKey("lon_0")) { + p.setProjectionLongitudeDegrees(angleDegrees(params.get("lon_0"))); + } + if (p instanceof MisrSpaceObliqueMercatorProjection) { + ((MisrSpaceObliqueMercatorProjection) p) + .setPath(Integer.parseInt(params.get("path").trim())); + } else if (p instanceof SpaceObliqueMercatorProjection) { + SpaceObliqueMercatorProjection som = (SpaceObliqueMercatorProjection) p; + som.setIncidenceAngleDegrees(angleDegrees(params.get("inc_angle"))); + som.setPeriodOfRevolution(Double.parseDouble(params.get("ps_rev").trim())); + som.setAscendingLongitudeDegrees(angleDegrees(params.get("asc_lon"))); + } else if (p instanceof ObliqueTransformationProjection) { + ((ObliqueTransformationProjection) p).setParameters(args); + } + p.initialize(); + return p; + } + + static boolean needsUndispatchedParameters(String projName) { + return "som".equals(projName) || "misrsom".equals(projName) || "ob_tran".equals(projName); + } + + /** + * The ellipsoid the operation line declares, resolved by the real parser. + *

+ * {@code merc} is used as the stand-in because it is registered, needs nothing but an + * ellipsoid, and never stomps one — unlike {@code alsk}, {@code gs48} or {@code gs50}, which + * replace {@code a} and {@code es} on purpose. + */ + private static Ellipsoid ellipsoidOf(String[] args) { + String[] copy = new String[args.length]; + for (int i = 0; i < args.length; i++) { + String bare = args[i].startsWith("+") ? args[i].substring(1) : args[i]; + copy[i] = bare.startsWith("proj=") ? "+proj=merc" : args[i]; + } + return new CRSFactory().createFromParameters("gie-ellipsoid", copy) + .getProjection().getEllipsoid(); + } + + /** + * An angular parameter in degrees, accepting everything {@code pj_param}'s {@code "r"} sigil + * does: decimal degrees, DMS, a trailing cardinal, and the {@code r}/{@code R} radian suffix. + * The corpus uses two of those for {@code som} — {@code +inc_angle=98.30382} and + * {@code +inc_angle=1.7157253262878522r} name the same angle in two blocks. + */ + private static double angleDegrees(String value) { + int length = value.length(); + if (length > 1) { + char last = value.charAt(length - 1); + if (last == 'r' || last == 'R') { + return Math.toDegrees(Double.parseDouble(value.substring(0, length - 1))); + } + } + return Angle.parse(value); + } + + private static Map parameterMap(String[] args) { + Map params = new LinkedHashMap(); + for (String arg : args) { + String bare = arg.startsWith("+") ? arg.substring(1) : arg; + if (bare.isEmpty()) { + continue; + } + int eq = bare.indexOf('='); + String key = eq < 0 ? bare : bare.substring(0, eq); + String value = eq < 0 ? null : bare.substring(eq + 1); + if (!params.containsKey(key)) { + params.put(key, value); + } + } + return params; + } + + // ------------------------------------------------------------------------------------------ + // Running + // ------------------------------------------------------------------------------------------ + + /** + * Runs every row of every block for {@code projName} in {@code file} and asserts all of them. + * + * @param expectedAssertions the number of assertions the corpus is expected to contribute, + * asserted so that a silently-empty run cannot masquerade as a pass + */ + static void assertAll(String file, String projName, int expectedAssertions) { + List blocks = blocksFor(file, projName); + assertTrue("no " + projName + " operation found in " + file + + " -- the corpus moved or the whole-token match is wrong", !blocks.isEmpty()); + + int total = 0; + List failures = new ArrayList(); + for (Block block : blocks) { + total += block.assertionCount(); + failures.addAll(run(block)); + } + assertTrue(projName + ": expected " + expectedAssertions + " corpus assertions, found " + + total + " -- a changed count means the corpus moved or the reader dropped rows", + total == expectedAssertions); + if (!failures.isEmpty()) { + fail(projName + ": " + failures.size() + " of " + total + " corpus assertions fail:" + + System.lineSeparator() + String.join(System.lineSeparator(), failures)); + } + } + + /** Runs one block, returning one message per failing assertion. */ + static List run(Block block) { + List failures = new ArrayList(); + Projection p; + try { + p = build(block.operation); + } catch (RuntimeException e) { + // The operation could not be created. Every row in the block is satisfied if and only + // if it is an `expect failure`; anything else is a genuine failure, and reporting it + // as such is what stops "not implemented" from scoring as conformance. + for (Row row : block.rows) { + if (!row.expectFailure) { + failures.add(" " + block.operation + " " + row + + ": operation could not be created: " + + e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + return failures; + } + + GieComparator cmp = comparatorFor(p); + for (Row row : block.rows) { + if (row.expectFailure) { + if (row.accept == null) { + failures.add(" " + block.operation + " " + row + + ": expected the operation to be rejected, but it was created as " + + p.getClass().getSimpleName()); + continue; + } + try { + step(p, new ProjCoordinate(row.accept[0], row.accept[1]), row.inverse); + failures.add(" " + block.operation + " " + row + + ": expected failure, but the transform returned a coordinate"); + } catch (Proj4jException expected) { + // Pass: a failure was expressed as a failure. + } + continue; + } + double deviation; + try { + deviation = row.isRoundtrip() ? roundtripResidual(cmp, p, row) + : oneWayDeviation(cmp, p, row); + } catch (RuntimeException e) { + failures.add(" " + block.operation + " " + row + ": threw " + + e.getClass().getSimpleName() + ": " + e.getMessage()); + continue; + } + if (!GieComparator.withinTolerance(deviation, row.toleranceMetres)) { + failures.add(" " + block.operation + " " + row + ": deviation " + deviation + + " m exceeds tolerance " + row.toleranceMetres + " m"); + } + } + return failures; + } + + /** The geodesic figure for the metric, read from the constructed projection. */ + private static GieComparator comparatorFor(Projection p) { + double a = p.getEllipsoid().equatorRadius; + double b = p.getEllipsoid().poleRadius; + return GieComparator.forEllipsoid(a, a == 0.0 ? 0.0 : (a - b) / a); + } + + /** A bare projection operation is {@code left = RADIANS, right = CLASSIC}. */ + private static GieIoUnits outputUnits(boolean inverse) { + return GieIoUnits.outputUnits(GieIoUnits.RADIANS, GieIoUnits.CLASSIC, false, + inverse ? GieDirection.INVERSE : GieDirection.FORWARD); + } + + private static double oneWayDeviation(GieComparator cmp, Projection p, Row row) { + ProjCoordinate in = new ProjCoordinate(row.accept[0], row.accept[1]); + ProjCoordinate out = new ProjCoordinate(); + double[] expected; + double[] got; + if (row.inverse) { + p.inverseProject(in, out); + // gie's torad_coord on the expect line; PROJ's raw inverse returns radians. + expected = new double[] {Math.toRadians(row.expect[0]), Math.toRadians(row.expect[1]), + 0, 0}; + got = new double[] {Math.toRadians(out.x), Math.toRadians(out.y), 0, 0}; + } else { + p.project(in, out); + expected = new double[] {row.expect[0], row.expect[1], 0, 0}; + got = new double[] {out.x, out.y, 0, 0}; + } + return cmp.compare(outputUnits(row.inverse), false, expected, got, row.expect.length, + row.toleranceMetres).deviation(); + } + + /** + * {@code roundtrip n}, phased as {@code src/trans.cpp:591}: one half-step out, {@code n-1} + * full cycles, one half-step home, so the residual is measured in the input space. + */ + private static double roundtripResidual(GieComparator cmp, Projection p, Row row) { + final double x0 = row.accept[0]; + final double y0 = row.accept[1]; + ProjCoordinate t = step(p, new ProjCoordinate(x0, y0), row.inverse); + for (int i = 1; i < row.roundtripTrips; i++) { + t = step(p, step(p, t, !row.inverse), row.inverse); + } + t = step(p, t, !row.inverse); + + final boolean angularResidual = !row.inverse; + double[] expected; + double[] got; + if (angularResidual) { + expected = new double[] {Math.toRadians(x0), Math.toRadians(y0), 0, 0}; + got = new double[] {Math.toRadians(t.x), Math.toRadians(t.y), 0, 0}; + } else { + expected = new double[] {x0, y0, 0, 0}; + got = new double[] {t.x, t.y, 0, 0}; + } + return cmp.compare(outputUnits(!angularResidual), false, expected, got, 2, + row.toleranceMetres).deviation(); + } + + private static ProjCoordinate step(Projection p, ProjCoordinate src, boolean inverse) { + ProjCoordinate dst = new ProjCoordinate(); + if (inverse) { + p.inverseProject(src, dst); + } else { + p.project(src, dst); + } + return dst; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/proj/tierB/UniversalPolarStereographicCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/proj/tierB/UniversalPolarStereographicCorpusTest.java new file mode 100644 index 0000000..e493982 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/proj/tierB/UniversalPolarStereographicCorpusTest.java @@ -0,0 +1,132 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.proj.tierB; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.UniversalPolarStereographicProjection; + +/** + * {@code +proj=ups} against {@code builtins.gie} — 9 assertions, one of them + * {@code expect failure}. + * + *

{@code ups} is a preset of polar {@code stere}, so the interesting content is not the + * arithmetic — {@code StereographicAzimuthalProjection} already had it, and + * {@code setupUPS(int)} already assigned the five constants — but the two things a preset can get + * wrong: which of {@code +south}/{@code +lat_0} decides the pole, and that a sphere is refused. + */ +public class UniversalPolarStereographicCorpusTest { + + @Test + public void upsMatchesCorpus() { + TierBCorpus.assertAll("builtins.gie", "ups", 9); + } + + @Test + public void nameIsRegistered() { + Projection p = new Registry().getProjection("ups"); + assertNotNull("+proj=ups", p); + assertTrue(p instanceof UniversalPolarStereographicProjection); + assertTrue(p.hasInverse()); + } + + /** + * {@code builtins.gie:7678}: {@code +proj=ups +a=6400000} is + * {@code expect failure errno invalid_op_illegal_arg_value}. + * + *

Two facts have to line up for that row to be right. {@code +a=} with no shape parameter + * declares a sphere ({@code ell_set.cpp}'s "not giving a shape parameter means + * selecting a sphere"), and {@code PJ_PROJECTION(ups)} refuses {@code es == 0} outright. Get + * the first wrong — default to GRS80, as Proj4J once did — and this row projects instead of + * failing. + */ + @Test + public void sphereIsRefused() { + for (String definition : new String[] {"+proj=ups +a=6400000", "+proj=ups +R=6371000"}) { + try { + TierBCorpus.build(definition); + fail(definition + ": ups is not possible on a sphere"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("only ellipsoidal formulation supported")); + } + } + } + + /** An ellipsoid is accepted, and gives the five UPS constants. */ + @Test + public void ellipsoidGivesTheUpsPreset() { + Projection p = TierBCorpus.build("+proj=ups +ellps=GRS80"); + assertEquals("k_0", 0.994, p.getScaleFactor(), 0.0); + assertEquals("x_0", 2000000.0, p.getFalseEasting(), 0.0); + assertEquals("y_0", 2000000.0, p.getFalseNorthing(), 0.0); + assertEquals("lon_0", 0.0, p.getProjectionLongitude(), 0.0); + assertEquals("lat_0", 90.0, p.getProjectionLatitudeDegrees(), 1e-12); + } + + /** + * {@code +south} flips the pole, and it reaches this projection at all — the base + * {@code Projection.setSouthernHemisphere} refuses, and neither {@code stere} nor + * {@code AzimuthalProjection} overrides it, so without the override here + * {@code +proj=ups +south} would raise {@code UnsupportedParameterException}. + */ + @Test + public void southFlipsThePole() { + Projection north = TierBCorpus.build("+proj=ups +ellps=GRS80"); + Projection south = TierBCorpus.build("+proj=ups +ellps=GRS80 +south"); + assertEquals("northern lat_0", 90.0, north.getProjectionLatitudeDegrees(), 1e-12); + assertEquals("southern lat_0", -90.0, south.getProjectionLatitudeDegrees(), 1e-12); + assertTrue("+south must be reported back", south.getSouthernHemisphere()); + + // And the two are mirror images about y = 2 000 000 for a point on the equator: the north + // and south polar aspects of stere at the same |lat_0| differ only in the sign of the + // latitude they measure from. + ProjCoordinate n = new ProjCoordinate(); + ProjCoordinate s = new ProjCoordinate(); + north.project(new ProjCoordinate(0, -45), n); + south.project(new ProjCoordinate(0, 45), s); + assertEquals("x", n.x, s.x, 1e-6); + assertEquals("y about the false northing", 2000000.0 - n.y, s.y - 2000000.0, 1e-6); + } + + /** + * {@code ups} is {@code stere} with the preset applied, so it must agree with the explicit + * spelling to well inside the corpus's 0.1 mm bar. + */ + @Test + public void agreesWithTheExplicitStereSpelling() { + Projection ups = TierBCorpus.build("+proj=ups +ellps=GRS80"); + Projection stere = TierBCorpus.build("+proj=stere +ellps=GRS80 +lat_0=90 +lat_ts=90 " + + "+k_0=0.994 +x_0=2000000 +y_0=2000000 +lon_0=0"); + for (double[] pt : new double[][] {{2, 1}, {2, -1}, {-2, 1}, {-2, -1}, {45, 80}}) { + ProjCoordinate a = new ProjCoordinate(); + ProjCoordinate b = new ProjCoordinate(); + ups.project(new ProjCoordinate(pt[0], pt[1]), a); + stere.project(new ProjCoordinate(pt[0], pt[1]), b); + assertEquals("x at " + pt[0] + "," + pt[1], a.x, b.x, 1e-9); + assertEquals("y at " + pt[0] + "," + pt[1], a.y, b.y, 1e-9); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/resource/NegativeLookupCacheTest.java b/core/src/test/java/org/locationtech/proj4j/resource/NegativeLookupCacheTest.java new file mode 100644 index 0000000..5a7058c --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/resource/NegativeLookupCacheTest.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * The resolution memo retains failed lookups, and the set of failed lookups is chosen by whoever + * writes the CRS string. + * + *

Why the two halves are bounded differently

+ * + *

A hit can only be a name that exists in the classpath or the data directory. The + * population is whatever is installed, an attacker cannot enlarge it by asking, and evicting one + * costs a real re-probe on a real grid — so hits are retained without a limit. + * + *

A miss is a name, and names are free. {@code +nadgrids=} on a per-row CRS + * string mints a fresh key every row, and every one of them used to be retained forever in the same + * unbounded {@code ConcurrentHashMap} as the hits. That is a retained-memory primitive driven by + * untrusted input. + * + *

Stop admitting, do not evict

+ * + *

Eviction under a flood would discard exactly the legitimate {@code @}-optional misses the memo + * exists to keep cheap, and would make which ones survive depend on arrival order. Declining to + * admit degrades to re-probing — the 1.4.x cost, on the attack path only — and cannot change an + * answer, because this cache is a pure memo over a pure function. {@link #answersDoNotDependOnWhetherAMissWasCached()} + * is the test of that claim rather than the comment being the test of it. + */ +public class NegativeLookupCacheTest { + + /** Counts probes, and holds exactly one resource so hits and misses can both be exercised. */ + private static final class CountingResolver implements ResourceResolver { + final AtomicInteger probes = new AtomicInteger(); + private final String present; + + CountingResolver(String present) { + this.present = present; + } + + @Override + public String name() { + return "counting"; + } + + @Override + public ResourceHandle resolve(String resourceName) throws IOException { + probes.incrementAndGet(); + if (!present.equals(resourceName)) { + return null; + } + return new ByteArrayHandle(resourceName); + } + + @Override + public Collection listAvailable() { + return Collections.singletonList(present); + } + } + + private static final class ByteArrayHandle implements ResourceHandle { + private final String name; + + ByteArrayHandle(String name) { + this.name = name; + } + + @Override + public String name() { + return name; + } + + @Override + public String origin() { + return "test:" + name; + } + + @Override + public long sizeBytes() { + return 3; + } + + @Override + public SeekableByteReader open() { + return new ByteArrayByteReader(new byte[]{1, 2, 3}); + } + } + + @Test + public void missesStopBeingAdmittedAtTheCap() throws IOException { + CountingResolver delegate = new CountingResolver("real"); + CachingResourceResolver cache = new CachingResourceResolver(delegate, 8); + + for (int i = 0; i < 500; i++) { + assertNull(cache.resolve("absent-" + i)); + } + assertEquals("only the first few misses may be retained", 8, cache.cachedMisses()); + assertEquals("and every one of the 500 must have been probed, cached or not", 500, + delegate.probes.get()); + } + + /** + * The control for the test above: with the cap out of the way the very same loop fills the map, + * so 8 is the cap firing rather than the map being broken or the loop never running. + */ + @Test + public void withoutTheCapTheSameLoopFillsTheMap() throws IOException { + CountingResolver delegate = new CountingResolver("real"); + CachingResourceResolver cache = new CachingResourceResolver(delegate, 100000); + + for (int i = 0; i < 500; i++) { + assertNull(cache.resolve("absent-" + i)); + } + assertEquals("CONTROL: uncapped, all 500 misses are memoised", 500, cache.cachedMisses()); + } + + /** A cached miss must still be a miss without re-probing, or the memo buys nothing. */ + @Test + public void aCachedMissIsNotReprobed() throws IOException { + CountingResolver delegate = new CountingResolver("real"); + CachingResourceResolver cache = new CachingResourceResolver(delegate, 8); + + assertNull(cache.resolve("absent")); + assertEquals(1, delegate.probes.get()); + for (int i = 0; i < 100; i++) { + assertNull(cache.resolve("absent")); + } + assertEquals("100 repeats of a cached miss must cost no further probes", 1, + delegate.probes.get()); + } + + /** Hits are unbounded, and a flood of misses must not displace one. */ + @Test + public void hitsAreNeverEvictedByAFloodOfMisses() throws IOException { + CountingResolver delegate = new CountingResolver("real"); + CachingResourceResolver cache = new CachingResourceResolver(delegate, 8); + + ResourceHandle first = cache.resolve("real"); + assertNotNull(first); + int afterFirst = delegate.probes.get(); + + for (int i = 0; i < 500; i++) { + cache.resolve("absent-" + i); + } + + ResourceHandle again = cache.resolve("real"); + assertSame("the memoised handle must survive the flood", first, again); + assertEquals("and answering from it must have cost no extra probe", afterFirst + 500, + delegate.probes.get()); + assertEquals(1, cache.cachedHits()); + } + + /** + * The determinism claim, tested. Past the cap a miss is re-probed instead of memoised, and the + * answer must be identical either way — otherwise the bound would be a behaviour change rather + * than a memory bound. + */ + @Test + public void answersDoNotDependOnWhetherAMissWasCached() throws IOException { + CountingResolver delegate = new CountingResolver("real"); + CachingResourceResolver capped = new CachingResourceResolver(delegate, 0); + CachingResourceResolver uncapped = new CachingResourceResolver(delegate, 100000); + + for (int i = 0; i < 50; i++) { + String name = "absent-" + i; + assertEquals("caching a miss must not change what a miss is", capped.resolve(name), + uncapped.resolve(name)); + } + assertEquals("with a cap of 0, nothing is memoised", 0, capped.cachedMisses()); + assertEquals(50, uncapped.cachedMisses()); + + assertNotNull(capped.resolve("real")); + assertNotNull(uncapped.resolve("real")); + } + + /** {@code invalidate()} must clear both halves, not just the one it used to know about. */ + @Test + public void invalidateClearsBothHalves() throws IOException { + CountingResolver delegate = new CountingResolver("real"); + CachingResourceResolver cache = new CachingResourceResolver(delegate, 8); + + assertNotNull(cache.resolve("real")); + assertNull(cache.resolve("absent")); + assertEquals(1, cache.cachedHits()); + assertEquals(1, cache.cachedMisses()); + + cache.invalidate(); + assertEquals(0, cache.cachedHits()); + assertEquals(0, cache.cachedMisses()); + + int before = delegate.probes.get(); + assertNotNull(cache.resolve("real")); + assertEquals("after invalidate the delegate must be consulted again", before + 1, + delegate.probes.get()); + } + + /** The shipped default, so a typo in the property plumbing cannot silently uncap it. */ + @Test + public void theDefaultCapIsFinite() throws IOException { + CachingResourceResolver cache = + new CachingResourceResolver(new CountingResolver("real")); + for (int i = 0; i < CachingResourceResolver.MAX_ABSENT + 100; i++) { + cache.resolve("absent-" + i); + } + assertTrue("the default cap must bound retention; got " + cache.cachedMisses(), + cache.cachedMisses() <= CachingResourceResolver.MAX_ABSENT); + assertTrue("...and must not be so small it caches nothing", cache.cachedMisses() > 0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/resource/NoAmbientInputInCoreTest.java b/core/src/test/java/org/locationtech/proj4j/resource/NoAmbientInputInCoreTest.java new file mode 100644 index 0000000..df5998f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/resource/NoAmbientInputInCoreTest.java @@ -0,0 +1,705 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CoordinateReferenceSystem; + +/** + * Enforces the two ambient-input guarantees {@code core} makes to a downstream consumer: + * it reads no environment variable, and it contains no network code. + * + *

What this replaces, and why

+ * + *

Both claims used to be asserted by {@code GridResolutionTest.theChainNamesNoEnvironmentVariable}, + * which checked that {@link ResourceResolvers#describeResolution()} contains the strings + * {@code "environment variables: NONE READ"} and {@code "working directory: NEVER CONSULTED"}. + * Those are string literals at {@code ResourceResolvers.java:259-260}, so the test asserted two + * constants against themselves. Its javadoc said "Core must not read {@code PROJ_DATA} or any other + * environment variable" and nothing enforced that: adding a {@code System.getenv("PROJ_DATA")} + * tomorrow would have kept it green. The description test still exists and is still worth having — + * it pins the operator-facing output format — but it is no longer where the guarantee lives. + * + *

The working-directory half of that claim was never vacuous and is deliberately left where it + * is: {@code GridResolutionTest.workingDirectoryIsNeverConsulted} writes a real, structurally valid + * CTABLE V2 grid into {@code user.dir} under a name proj4j is about to resolve and asserts it is + * ignored. That is the model — a behavioural test with a decoy. Neither of the claims here can be + * made that way from inside one JVM (a process cannot portably add to its own environment, and + * proving the absence of a socket by not observing one is not proof), so both are made + * structurally, over sources and bytecode. + * + *

The traps, both of which a naive grep falls into

+ * + *
    + *
  1. {@code DirectoryResourceResolver:37} contains {@code System.getenv("PROJ_DATA")} inside a + * javadoc {@code
    {@code ...}
    } block
    , showing an application how to opt in to + * {@code PROJ_DATA} semantics deliberately. A grep for {@code getenv} over {@code core/src/main} + * therefore returns exactly one hit and it is not a violation. The scan must tell code from + * comment — and that occurrence is this test's proof that the scanner reaches and detects, + * rather than a nuisance to be excluded.
  2. + *
  3. The bytecode names {@code java.net} types the source never writes. + * {@code ClasspathResourceResolver} calls {@code url.openConnection()}, so + * {@code java/net/URLConnection} is in its constant pool; {@code DirectoryResourceResolver} + * calls {@code Path.toUri()}, so {@code java/net/URI} is in its. Neither string appears + * anywhere in {@code core/src/main}. A source-only audit of "which classes touch + * {@code java.net}" undercounts by two, which is why the inventory below is pinned from the + * class files.
  4. + *
+ * + *

Why these scans can fail

+ * + *

A scan without a positive control is a claim, not a measurement, so every scan here is proved + * able to fail before it is trusted to pass: + * + *

    + *
  • {@link #theClassifierTellsCodeFromComment()} feeds the classifier crafted lines of both + * kinds, including the block-comment continuation and the javadoc snippet shapes that actually + * occur.
  • + *
  • {@link #theSourceScanFindsTheKnownJavadocOccurrence()} requires the production source scan to + * find the {@code DirectoryResourceResolver} occurrence and to classify it as a comment. If the + * walk reached nothing, the zero-violations result would be vacuous; this makes that + * impossible.
  • + *
  • {@link #theByteScannerDetectsAnInjectedViolation()} writes a synthetic class file containing + * {@code getenv} and another containing {@code java/net/Socket} into a temporary directory and + * requires the very same collector and byte matcher to report both — and requires a + * needle-free control file in the same directory not to be reported.
  • + *
  • {@link #theByteScannerFindsRealNeedlesInRealCoreClasses()} requires the matcher to find + * {@code java/net/URL} in the real core classes that genuinely contain it. This is the control + * that a line-oriented grep would have failed: binary class data defeats it, and it silently + * returns the clean answer.
  • + *
+ * + *

If a scan here fails, do not add the offender to an allow-list. Both guarantees are + * load-bearing for a consumer that runs proj4j inside Spark executors, where an environment + * variable is per-cluster ambient state and a network fetch is a per-row latency cliff. + */ +public class NoAmbientInputInCoreTest { + + // ------------------------------------------------------------------------------- needles + + /** Every way a JVM program can read the process environment. */ + private static final String[] ENV_READERS = { + "System.getenv", "ProcessBuilder", "ProcessEnvironment" + }; + + /** The bytecode forms of the same. {@code getenv} is the method name in the constant pool. */ + private static final String[] ENV_READERS_BYTECODE = { + "getenv", "java/lang/ProcessBuilder", "java/lang/ProcessEnvironment" + }; + + /** + * Types that exist only to talk to a network. None of these may appear anywhere in core, at + * any level, ever. Substring matches are intentional: {@code java/net/Socket} also catches + * {@code SocketException} and {@code SocketAddress}, all of which are equally forbidden. + */ + private static final String[] NETWORK_TYPES = { + "java/net/Socket", "java/net/ServerSocket", "java/net/DatagramSocket", + "java/net/MulticastSocket", "java/net/DatagramPacket", "java/net/InetAddress", + "java/net/InetSocketAddress", "java/net/HttpURLConnection", "java/net/Proxy", + "java/net/CookieHandler", "java/net/CookieManager", "java/net/Authenticator", + "java/net/NetworkInterface", "java/net/URLStreamHandler", "java/net/http/", + "javax/net/", "java/rmi/", "java/nio/channels/SocketChannel", + "java/nio/channels/ServerSocketChannel", "java/nio/channels/DatagramChannel", + }; + + /** + * The complete inventory of core classes permitted to name any {@code java.net} type, + * as outer-class binary names. Measured from the class files, not from the sources — see trap + * (2) in the class comment. + * + * + * + * + * + * + * + * + * + * + * + * + *
What each one names, and why it is not network access
classtypeswhy
{@code api/Proj}{@code URL}{@code Proj.class.getResource("Proj.class")} to find the jar this class came from, + * then {@code openStream()} on a {@code jar:} URL derived from it — guarded by + * {@code "jar".equals(self.getProtocol())} at {@code Proj.java:534}, so no other protocol + * is ever opened.
{@code api/DatabaseInfo}{@code URL}{@code getClassLoader().getResource("proj4/nad/epsg")}, probed for presence only; + * never opened.
{@code resource/ClasspathResourceResolver}{@code URL}, {@code URLConnection}The return type of {@code ClassLoader.getResource}, never built from a string, and + * refused unless its protocol is one of {@code file jar jrt resource bundleresource bundle + * vfs} ({@code ClasspathResourceResolver.java:172-193}). {@code URLConnection} is the + * inferred type of {@code url.openConnection()} at {@code :198}, used only for + * {@code getContentLengthLong()}.
{@code resource/DirectoryResourceResolver}{@code URI}The inferred return type of {@code Path.toUri()} at {@code :99}, used to build a + * {@code file:} provenance string.
+ * + *

This list is exact, not a floor. A new class touching {@code java.net} fails here even if + * what it does is harmless, because "core contains no network code" is a claim about the whole + * artifact and the cheapest way to keep it true is to keep the surface closed. + */ + private static final String[] CLASSES_ALLOWED_TO_NAME_JAVA_NET = { + "org/locationtech/proj4j/api/DatabaseInfo", + "org/locationtech/proj4j/api/Proj", + "org/locationtech/proj4j/resource/ClasspathResourceResolver", + "org/locationtech/proj4j/resource/DirectoryResourceResolver", + }; + + // ------------------------------------------------------- guard 1: no environment variables + + /** + * The guarantee {@code ResourceResolvers.describeResolution()} prints and never checked: + * nothing in {@code core/src/main} reads the process environment. + */ + @Test + public void noCoreSourceReadsAnEnvironmentVariable() throws IOException { + File root = coreSourceRoot(); + List sources = collect(root, ".java"); + assertTrue("found only " + sources.size() + " core sources under " + root + + ", so this scan would prove nothing", sources.size() > 100); + + List violations = new ArrayList(); + int inComments = 0; + for (int i = 0; i < sources.size(); i++) { + String rel = relative(root, sources.get(i)); + List found = scan(read(sources.get(i)), ENV_READERS); + for (int j = 0; j < found.size(); j++) { + Occurrence o = found.get(j); + if (o.inComment) { + inComments++; + } else { + violations.add(rel + ":" + o.line + " " + o.text); + } + } + } + + assertTrue("the scan found no occurrence of any environment reader at all, not even the " + + "known javadoc one in DirectoryResourceResolver -- the walk or the matcher is " + + "broken and a zero-violation result would be meaningless", inComments > 0); + + if (!violations.isEmpty()) { + fail("core must read no environment variable: PROJ_DATA, PROJ_LIB and PROJ_NETWORK are " + + "ambient per-cluster state, and a library that silently honours them gives " + + "the same CRS pair different answers on different executors. If an " + + "application wants PROJ_DATA semantics it reads the variable itself and hands " + + "the path to a DirectoryResourceResolver, which is what " + + "DirectoryResourceResolver's javadoc shows. Do NOT allow-list these sites: " + + violations); + } + } + + /** The same claim in bytecode, so it survives a change of source layout. */ + @Test + public void noCoreClassCallsGetenv() throws IOException { + File classes = coreClassesDirectory(); + List all = collect(classes, ".class"); + assertTrue("found only " + all.size() + " compiled classes under " + classes, + all.size() > 100); + + List offenders = findClassesNaming(classes, all, ENV_READERS_BYTECODE); + if (!offenders.isEmpty()) { + fail("no core class may name System.getenv or ProcessBuilder. Offenders: " + offenders); + } + } + + // ------------------------------------------------------------------ guard 2: no network code + + /** + * No core class names a socket, an HTTP client, a name resolver or any other type whose only + * purpose is a network. This is the claim itself; the inventory test below is what stops the + * benign {@code java.net} surface from growing into one. + */ + @Test + public void noCoreClassNamesANetworkType() throws IOException { + File classes = coreClassesDirectory(); + List all = collect(classes, ".class"); + assertTrue("found only " + all.size() + " compiled classes under " + classes, + all.size() > 100); + + List offenders = findClassesNaming(classes, all, NETWORK_TYPES); + if (!offenders.isEmpty()) { + fail("core ships no network code -- GridInfo and DbGridAlternative both state this to " + + "callers, and a grid reachable only over the network is reported as missing " + + "rather than fetched. Offenders: " + offenders); + } + } + + /** + * The {@code java.net} surface is closed, and closed at exactly four classes. Growing it is + * how "no network code" would erode: every individual addition looks harmless. + */ + @Test + public void onlyTheRecordedClassesNameJavaNetAtAll() throws IOException { + File classes = coreClassesDirectory(); + List all = collect(classes, ".class"); + + TreeSet naming = new TreeSet(); + for (int i = 0; i < all.size(); i++) { + if (contains(readBytes(all.get(i)), "java/net/")) { + String rel = relative(classes, all.get(i)); + rel = rel.substring(0, rel.length() - ".class".length()).replace(File.separatorChar, + '/'); + int nested = rel.indexOf('$'); + naming.add(nested < 0 ? rel : rel.substring(0, nested)); + } + } + + // Reached-and-detected: the inventory is not empty, so an empty result cannot be mistaken + // for a clean one. + assertFalse("no core class names java/net/ at all -- ClasspathResourceResolver certainly " + + "does, so the byte matcher has stopped working", naming.isEmpty()); + + TreeSet expected = new TreeSet( + Arrays.asList(CLASSES_ALLOWED_TO_NAME_JAVA_NET)); + assertEquals("the set of core classes naming java.net must match the recorded inventory " + + "exactly; read this class's CLASSES_ALLOWED_TO_NAME_JAVA_NET table before " + + "changing it", expected.toString(), naming.toString()); + } + + /** + * The source-level view of the same surface, kept because it is the one a reviewer reads. It + * deliberately reports a different number from the bytecode inventory: three sites in + * three files, against four classes, because {@code URLConnection} and {@code URI} are never + * written down. + */ + @Test + public void theJavaNetSourceSitesAreTheRecordedOnes() throws IOException { + File root = coreSourceRoot(); + List sources = collect(root, ".java"); + assertTrue("found only " + sources.size() + " core sources", sources.size() > 100); + + List code = new ArrayList(); + for (int i = 0; i < sources.size(); i++) { + String rel = relative(root, sources.get(i)).replace(File.separatorChar, '/'); + List found = scan(read(sources.get(i)), new String[] {"java.net."}); + for (int j = 0; j < found.size(); j++) { + if (!found.get(j).inComment) { + code.add(rel + ":" + found.get(j).line); + } + } + } + assertEquals("the java.net source sites have changed; a new one is a new network surface " + + "and needs the justification the class comment demands", + "[org/locationtech/proj4j/api/DatabaseInfo.java:103, " + + "org/locationtech/proj4j/api/Proj.java:533, " + + "org/locationtech/proj4j/api/Proj.java:543, " + + "org/locationtech/proj4j/resource/ClasspathResourceResolver.java:23]", + sorted(code).toString()); + } + + // ------------------------------------------------- positive control 1: the classifier itself + + /** + * The classifier is the part that could silently stop working, so it is tested directly. The + * first two cases are the exact shapes that occur in the tree. + */ + @Test + public void theClassifierTellsCodeFromComment() { + // The real DirectoryResourceResolver:37 shape: a javadoc

{@code ...}
snippet. + // Given whole, so the block tracker is what classifies it ... + assertComment("/**\n *
{@code\n * String projData = System.getenv(\"PROJ_DATA\");\n"
+                + " * }
\n */", "System.getenv"); + // ... and given as the single line alone, so the star rule is what classifies it. Both + // must reach the same verdict, because the scan sees whole files and this test sees lines. + assertComment(" * String projData = System.getenv(\"PROJ_DATA\"); // not ours", + "System.getenv"); + // A block comment whose continuation line does NOT start with a star: only the tracker can + // get this one right. + assertComment("/* disabled:\n System.getenv(\"PROJ_DATA\");\n*/", "System.getenv"); + assertComment(" // String p = System.getenv(\"PROJ_LIB\");", "System.getenv"); + assertComment(" * {@link java.net.Socket} is never used here", "java.net."); + + // Code. + assertCode(" String p = System.getenv(\"PROJ_DATA\");", "System.getenv"); + assertCode("import java.net.URL;", "import java.net"); + assertCode(" java.net.URL u = X.class.getResource(\"a\");", "java.net."); + // A trailing comment on a line whose code half carries the needle is still code. + assertCode(" String p = System.getenv(\"X\"); // deliberate", "System.getenv"); + // Code after a block comment has closed on an earlier line. + assertCode("/* preamble */\n String p = System.getenv(\"X\");", "System.getenv"); + + // And a line with neither yields nothing at all, so the matcher is not matching everything. + assertEquals(0, scan(" int x = 1;", ENV_READERS).size()); + } + + // --------------------------------------- positive control 2: the known needle, in the real tree + + /** + * Requires the production source scan to find the one occurrence known to exist, in + * the file known to contain it, and to classify it as a comment. This is the analogue of + * {@code NoJdkAngleConversionTest.scanFindsTheKnownPositivesInTheVendoredGeodesicPackage}: a + * control that maintains itself, because the thing it depends on is a deliberate part of the + * design rather than an accident. + */ + @Test + public void theSourceScanFindsTheKnownJavadocOccurrence() throws IOException { + File f = new File(coreSourceRoot(), + "org/locationtech/proj4j/resource/DirectoryResourceResolver.java" + .replace('/', File.separatorChar)); + assertTrue("DirectoryResourceResolver is missing from " + f, f.isFile()); + + List found = scan(read(f), ENV_READERS); + assertEquals("DirectoryResourceResolver's javadoc shows an application reading PROJ_DATA " + + "for itself; exactly one occurrence is expected there", 1, found.size()); + assertTrue("and it must be classified as a comment, or the main scan would report it as a " + + "violation", found.get(0).inComment); + assertTrue(found.get(0).text.contains("PROJ_DATA")); + } + + // ------------------------------------- positive control 3: an injected violation, both needles + + /** + * Writes two synthetic class files, one carrying {@code getenv} and one carrying + * {@code java/net/Socket}, plus a needle-free control, and runs the production collector and + * byte matcher over the directory containing them. Both must be reported and the control must + * not. + * + *

The synthetic files are real core class bytes with the needle appended, so the matcher is + * exercised against binary content rather than against a text file. That is the exact failure + * mode this control exists for: a line-oriented matcher returns a clean zero on binary class + * data and looks like a pass. + */ + @Test + public void theByteScannerDetectsAnInjectedViolation() throws IOException { + File dir = createTempDirectory("proj4j-injected-violation"); + try { + byte[] carrier = readBytes(anyCoreClassFile()); + File clean = write(new File(dir, "Clean.class"), carrier, null); + File env = write(new File(dir, "Env.class"), carrier, "System.getenv"); + File net = write(new File(dir, "Net.class"), carrier, "java/net/Socket"); + + List collected = collect(dir, ".class"); + assertEquals("the collector must see all three files", 3, collected.size()); + + List envHits = findClassesNaming(dir, collected, ENV_READERS_BYTECODE); + assertEquals("[Env.class]", sorted(envHits).toString()); + + List netHits = findClassesNaming(dir, collected, NETWORK_TYPES); + assertEquals("[Net.class]", sorted(netHits).toString()); + + // And the control file, byte-identical but for the needle, is reported by neither. + assertFalse(contains(readBytes(clean), "getenv")); + assertFalse(contains(readBytes(clean), "java/net/Socket")); + assertTrue(contains(readBytes(env), "getenv")); + assertTrue(contains(readBytes(net), "java/net/Socket")); + } finally { + deleteRecursively(dir); + } + } + + /** + * And the same matcher against real needles in real core classes, so its sensitivity is proved + * on the actual corpus and not only on a fabrication. + */ + @Test + public void theByteScannerFindsRealNeedlesInRealCoreClasses() throws IOException { + File classes = coreClassesDirectory(); + List all = collect(classes, ".class"); + + int namingJavaNet = 0; + int namingOwnPackage = 0; + for (int i = 0; i < all.size(); i++) { + byte[] b = readBytes(all.get(i)); + if (contains(b, "java/net/")) { + namingJavaNet++; + } + if (contains(b, "org/locationtech/proj4j/")) { + namingOwnPackage++; + } + } + assertTrue("the matcher found java/net/ in " + namingJavaNet + " core classes; at least " + + "four genuinely contain it, so a smaller number means it has stopped detecting", + namingJavaNet >= 4); + assertTrue("the matcher found its own package path in only " + namingOwnPackage + " of " + + all.size() + " classes -- essentially all of them contain it, so this is the " + + "control that the binary scan works at all", namingOwnPackage > all.size() / 2); + } + + // --------------------------------------------------------------------------- the scanner + + /** One detected occurrence, and whether it is inside a comment. */ + private static final class Occurrence { + final int line; + final boolean inComment; + final String text; + + Occurrence(int line, boolean inComment, String text) { + this.line = line; + this.inComment = inComment; + this.text = text; + } + } + + /** + * Finds every needle in {@code source} and records whether it sits inside a comment. + * + *

Tracks {@code /* ... *}{@code /} across lines rather than only testing whether a line + * starts with a star, because a block comment's continuation lines need not, and a needle on + * such a line is still a comment. A {@code //} is honoured only when it opens before + * the needle, so a trailing comment on a line of real code does not launder the code. + */ + private static List scan(String source, String[] needles) { + List out = new ArrayList(); + String[] lines = source.split("\n", -1); + boolean inBlock = false; + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + for (int k = 0; k < needles.length; k++) { + int at = line.indexOf(needles[k]); + while (at >= 0) { + out.add(new Occurrence(i + 1, inBlock || isCommentedAt(line, at), line.trim())); + at = line.indexOf(needles[k], at + 1); + } + } + inBlock = blockCommentStateAfter(line, inBlock); + } + return out; + } + + /** + * Whether the text before {@code index} on this line makes the occurrence a comment: a + * {@code /*} still open, a {@code //}, or a leading {@code *} continuation marker. + * + *

The star rule is not redundant with the block tracker. It catches the case where the scan + * begins part-way through a file — and, more usefully, it is what makes a single crafted line + * classifiable in isolation, which is how {@link #theClassifierTellsCodeFromComment()} can test + * the rule without reconstructing a whole file. No Java statement can begin with {@code *}, so + * it has no false-positive direction. + */ + private static boolean isCommentedAt(String line, int index) { + String before = line.substring(0, index); + if (before.trim().startsWith("*")) { + return true; + } + int block = before.indexOf("/*"); + if (block >= 0 && before.indexOf("*/", block) < 0) { + return true; + } + return before.indexOf("//") >= 0; + } + + /** The block-comment state carried into the next line. */ + private static boolean blockCommentStateAfter(String line, boolean inBlock) { + int i = 0; + while (i < line.length()) { + if (inBlock) { + int close = line.indexOf("*/", i); + if (close < 0) { + return true; + } + inBlock = false; + i = close + 2; + } else { + int lineComment = line.indexOf("//", i); + int open = line.indexOf("/*", i); + if (open < 0 || (lineComment >= 0 && lineComment < open)) { + return false; + } + inBlock = true; + i = open + 2; + } + } + return inBlock; + } + + private static void assertCode(String source, String needle) { + List found = scan(source, new String[] {needle}); + assertEquals("expected exactly one occurrence in: " + source, 1, found.size()); + assertFalse("should have been classified as code: " + source, found.get(0).inComment); + } + + private static void assertComment(String source, String needle) { + List found = scan(source, new String[] {needle}); + assertEquals("expected exactly one occurrence in: " + source, 1, found.size()); + assertTrue("should have been classified as a comment: " + source, found.get(0).inComment); + } + + // ---------------------------------------------------------------------------- byte matching + + private static List findClassesNaming(File root, List classFiles, + String[] needles) throws IOException { + List out = new ArrayList(); + for (int i = 0; i < classFiles.size(); i++) { + byte[] bytes = readBytes(classFiles.get(i)); + for (int k = 0; k < needles.length; k++) { + if (contains(bytes, needles[k])) { + out.add(relative(root, classFiles.get(i)).replace(File.separatorChar, '/')); + break; + } + } + } + return out; + } + + /** + * A plain byte-for-byte search. Deliberately not a line-oriented one: class files are binary, + * and a {@code grep} over them returns a confident zero. + */ + private static boolean contains(byte[] haystack, String needle) { + int n = needle.length(); + int limit = haystack.length - n; + outer: + for (int i = 0; i <= limit; i++) { + for (int j = 0; j < n; j++) { + if (haystack[i + j] != (byte) needle.charAt(j)) { + continue outer; + } + } + return true; + } + return false; + } + + // ---------------------------------------------------------------------------------- plumbing + + private static File coreSourceRoot() { + File module = coreClassesDirectory().getParentFile().getParentFile(); + File src = new File(module, "src" + File.separator + "main" + File.separator + "java"); + if (!src.isDirectory()) { + throw new IllegalStateException("cannot locate core sources; looked in " + src); + } + return src; + } + + private static File coreClassesDirectory() { + URL url = CoordinateReferenceSystem.class.getResource( + "/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + if (url == null) { + throw new IllegalStateException("cannot locate the compiled core classes"); + } + String path = url.getPath(); + int index = path.indexOf("/org/locationtech/proj4j/CoordinateReferenceSystem.class"); + File dir = new File(path.substring(0, index).replace("%20", " ")); + if (!dir.isDirectory()) { + throw new IllegalStateException("compiled core classes are not in a directory: " + dir); + } + return dir; + } + + private static File anyCoreClassFile() { + return new File(coreClassesDirectory(), + "org/locationtech/proj4j/CoordinateReferenceSystem.class".replace('/', + File.separatorChar)); + } + + private static List collect(File dir, String suffix) { + List out = new ArrayList(); + collect(dir, out, suffix); + return out; + } + + private static void collect(File dir, List out, String suffix) { + File[] entries = dir.listFiles(); + if (entries == null) { + return; + } + Arrays.sort(entries); + for (int i = 0; i < entries.length; i++) { + if (entries[i].isDirectory()) { + collect(entries[i], out, suffix); + } else if (entries[i].getName().endsWith(suffix)) { + out.add(entries[i]); + } + } + } + + private static String relative(File root, File file) { + String r = root.getAbsolutePath(); + String f = file.getAbsolutePath(); + return f.startsWith(r) ? f.substring(r.length() + 1) : f; + } + + private static List sorted(List in) { + List copy = new ArrayList(in); + java.util.Collections.sort(copy); + return copy; + } + + private static String read(File f) throws IOException { + byte[] b = readBytes(f); + StringBuilder sb = new StringBuilder(b.length); + for (int i = 0; i < b.length; i++) { + sb.append((char) (b[i] & 0xFF)); + } + return sb.toString(); + } + + private static byte[] readBytes(File f) throws IOException { + InputStream in = new FileInputStream(f); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } finally { + in.close(); + } + } + + private static File write(File target, byte[] carrier, String needle) throws IOException { + FileOutputStream out = new FileOutputStream(target); + try { + out.write(carrier); + if (needle != null) { + for (int i = 0; i < needle.length(); i++) { + out.write((byte) needle.charAt(i)); + } + } + } finally { + out.close(); + } + return target; + } + + private static File createTempDirectory(String prefix) throws IOException { + File f = File.createTempFile(prefix, ""); + if (!f.delete() || !f.mkdir()) { + throw new IOException("cannot create a temporary directory at " + f); + } + return f; + } + + private static void deleteRecursively(File dir) { + File[] entries = dir.listFiles(); + if (entries != null) { + for (int i = 0; i < entries.length; i++) { + if (entries[i].isDirectory()) { + deleteRecursively(entries[i]); + } else if (!entries[i].delete()) { + entries[i].deleteOnExit(); + } + } + } + if (!dir.delete()) { + dir.deleteOnExit(); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/resource/ResourceNameSafetyTest.java b/core/src/test/java/org/locationtech/proj4j/resource/ResourceNameSafetyTest.java new file mode 100644 index 0000000..f91214f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/resource/ResourceNameSafetyTest.java @@ -0,0 +1,286 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.resource; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * The resource-name guard, after it was relaxed to permit interior path segments. + * + *

Why this test exists in this shape

+ * + *

{@link ResourceNames#isSafe} used to reject any name containing {@code /}. That was a + * guard doing two jobs at once, and only one of them was security: it also, incidentally, refused + * {@code tests/us_noaa_nadcon5_conus.tif}, which is an ordinary PROJ spelling. Relaxing it is + * exactly the kind of change that can quietly stop refusing things it was still meant to refuse — so + * every hostile name below asserts which rule refused it, not merely that something + * did. + * + *

That distinction is the whole point. {@code subdir/conus} is now a legal name that + * happens not to exist, and a test asserting only "it does not resolve" would pass for both a legal + * name and a refused one — it would keep passing if the guard were deleted outright. The + * {@link #namesThatAreLegalNowAndWereNotBefore()} case below is the positive control that separates + * the two: those names must be accepted by the rule, so a hostile name being rejected is a statement + * about the rule rather than about the filesystem. + */ +public class ResourceNameSafetyTest { + + private static final Charset ASCII = Charset.forName("US-ASCII"); + + /** + * Every hostile name, with the rule that must refuse it. Asserting the rule rather than a boolean + * is what makes the test able to notice a name being refused for the wrong reason — a name that + * starts being caught by, say, {@code WHITESPACE} instead of {@code DOT_SEGMENT} has had its real + * check removed and replaced by an accident. + */ + private static Map hostileNames() { + Map m = new LinkedHashMap(); + + // --- traversal, the original threat --------------------------------------------------- + m.put("../../../etc/passwd", ResourceNames.Rule.DOT_SEGMENT); + m.put("tests/../../etc/passwd", ResourceNames.Rule.DOT_SEGMENT); + m.put("tests/..", ResourceNames.Rule.DOT_SEGMENT); + m.put("..", ResourceNames.Rule.DOT_SEGMENT); + m.put("../", ResourceNames.Rule.DOT_SEGMENT); + // A "." segment cannot reach anywhere a plain name cannot, so its only use is to vary the + // spelling of a name past a check that compares strings. + m.put(".", ResourceNames.Rule.DOT_SEGMENT); + m.put("a/./b", ResourceNames.Rule.DOT_SEGMENT); + m.put("./conus", ResourceNames.Rule.DOT_SEGMENT); + + // --- absolute: a leading separator addresses a root that is not the resolver's ---------- + m.put("/etc/passwd", ResourceNames.Rule.ABSOLUTE); + m.put("/tests/foo.tif", ResourceNames.Rule.ABSOLUTE); + m.put("\\tests\\foo.tif", ResourceNames.Rule.ABSOLUTE); + m.put("/", ResourceNames.Rule.ABSOLUTE); + + // --- the backslash is never a separator here -------------------------------------------- + m.put("..\\..\\windows\\win.ini", ResourceNames.Rule.BACKSLASH); + m.put("tests\\foo.tif", ResourceNames.Rule.BACKSLASH); + + // --- empty segments: "a//b" and a trailing slash ----------------------------------------- + m.put("a//b", ResourceNames.Rule.EMPTY_SEGMENT); + m.put("tests/", ResourceNames.Rule.EMPTY_SEGMENT); + m.put("tests//foo.tif", ResourceNames.Rule.EMPTY_SEGMENT); + + // --- whitespace and control characters --------------------------------------------------- + // A proj string is whitespace-delimited, so a name with a space cannot have arrived from one + // intact; and a NUL is the classic path-truncation trick. + m.put("dir with space/myconus", ResourceNames.Rule.WHITESPACE); + m.put("conus ", ResourceNames.Rule.WHITESPACE); + m.put("con\tus", ResourceNames.Rule.WHITESPACE); + m.put("conus\n", ResourceNames.Rule.WHITESPACE); + m.put("conus\u0000.tif", ResourceNames.Rule.WHITESPACE); + + // --- encodings, so the name cannot mean one thing here and another downstream ------------- + // %2e%2e%2f is "../". It contains no '.' and no '/', so the dot-segment and absolute rules + // cannot see it; whether it is dangerous depends entirely on whether some later layer + // decodes it, which is precisely why it is refused rather than reasoned about. + m.put("%2e%2e%2fetc/passwd", ResourceNames.Rule.PERCENT); + m.put("%2E%2E/passwd", ResourceNames.Rule.PERCENT); + m.put("tests%2f..%2fpasswd", ResourceNames.Rule.PERCENT); + + // --- drive letters and URL schemes --------------------------------------------------------- + m.put("C:/windows/win.ini", ResourceNames.Rule.COLON); + m.put("file:///etc/passwd", ResourceNames.Rule.COLON); + m.put("http://example.invalid/grid.tif", ResourceNames.Rule.COLON); + + // --- degenerate -------------------------------------------------------------------------- + m.put("", ResourceNames.Rule.EMPTY); + return m; + } + + @Test + public void everyHostileNameIsRefusedByANamedRule() { + for (Map.Entry e : hostileNames().entrySet()) { + ResourceNames.Rule rule = ResourceNames.violation(e.getKey()); + assertNotNull("'" + display(e.getKey()) + "' must be refused, and was not", rule); + assertEquals("'" + display(e.getKey()) + "' must be refused by " + e.getValue() + + " (" + e.getValue().description() + "), not by " + rule, + e.getValue(), rule); + } + } + + @Test + public void aNullNameIsRefusedRatherThanThrowing() { + assertSame(ResourceNames.Rule.NULL, ResourceNames.violation(null)); + } + + /** + * The positive control for the whole file. If these were also refused, every assertion above + * would be satisfied by a guard that refuses everything, which is indistinguishable from a guard + * that works and useless as evidence. + */ + @Test + public void namesThatAreLegalNowAndWereNotBefore() { + String[] legal = { + "conus", + "ntv1_can.dat", + "tests/foo.tif", + "tests/tinshift_simplified_kkj_etrs.json", + "tests/nkgrf03vel_realigned_xy_extract.ct2", + "tests/us_noaa_nadcon5_nad83_2007_nad83_2011_conus_extract.tif", + "a/b/c/d.tif", + // A leading dot is a hidden file, not a dot segment; "..foo" is not "..". + ".hidden", + "..foo", + "foo..bar", + "au_ga_AUSGeoid09_V1.01.tif", + "nz-linz-grid.gsb", + }; + for (String name : legal) { + assertNull("'" + name + "' is a legitimate resource name and must be accepted, but " + + ResourceNames.violation(name), ResourceNames.violation(name)); + } + } + + // ---------------------------------------------------------------- the rule, applied end to end + + /** + * The classpath resolver honours the rule, and the relaxation actually works: a resource in a + * sub-directory of the prefix resolves, and every hostile spelling of a path to it does not. + */ + @Test + public void theClasspathResolverAppliesTheRule() throws IOException { + ClasspathResourceResolver r = new ClasspathResourceResolver( + ResourceNameSafetyTest.class.getClassLoader(), "proj4/nad"); + + assertNotNull("a bare name still resolves", r.resolve("ntv1_can.dat")); + for (String hostile : hostileNames().keySet()) { + assertNull("'" + display(hostile) + "' must not resolve", r.resolve(hostile)); + } + // ... and the guard, not mere absence, is what refused them: a legal-but-absent name takes + // the same path and also yields null, so "null" alone proves nothing. + assertNull(r.resolve("no/such/grid.tif")); + } + + @Test + public void theDirectoryResolverAppliesTheRuleAndResolvesASubdirectory() throws IOException { + Path root = Files.createTempDirectory("proj4j-name-rule-root"); + Path outside = Files.createTempDirectory("proj4j-name-rule-outside"); + try { + Files.createDirectory(root.resolve("tests")); + Files.write(root.resolve("tests").resolve("foo.tif"), "grid".getBytes(ASCII)); + Files.write(root.resolve("conus"), "grid".getBytes(ASCII)); + Files.write(outside.resolve("secret"), "secret".getBytes(ASCII)); + + DirectoryResourceResolver r = new DirectoryResourceResolver(root); + + // The unlock, stated positively: this is the spelling the corpus uses. + ResourceHandle handle = r.resolve("tests/foo.tif"); + assertNotNull("a file in a sub-directory of the root must resolve", handle); + assertEquals("tests/foo.tif", handle.name()); + assertNotNull(r.resolve("conus")); + + for (String hostile : hostileNames().keySet()) { + assertNull("'" + display(hostile) + "' must not resolve", r.resolve(hostile)); + } + // The traversal that actually points at a real file outside the root -- the one case + // where "it returned null" could otherwise be explained by the file not existing. + assertTrue(Files.isRegularFile(outside.resolve("secret"))); + assertNull("a traversal to a file that really is there must still be refused", + r.resolve("../" + outside.getFileName() + "/secret")); + assertNull(r.resolve("tests/../../" + outside.getFileName() + "/secret")); + } finally { + deleteRecursively(root); + deleteRecursively(outside); + } + } + + /** + * {@code listAvailable()} and {@code resolve()} are the same rule seen from two sides. A name the + * inventory publishes must resolve, and a file the inventory omits must be one the rule refuses — + * otherwise {@code Proj.availableGrids()} under-reports what is installed. + */ + @Test + public void theDirectoryInventoryAndTheRuleAgree() throws IOException { + Path root = Files.createTempDirectory("proj4j-name-rule-listing"); + try { + Files.createDirectory(root.resolve("tests")); + Files.createDirectory(root.resolve("dir with space")); + Files.write(root.resolve("conus"), "grid".getBytes(ASCII)); + Files.write(root.resolve("tests").resolve("foo.tif"), "grid".getBytes(ASCII)); + Files.write(root.resolve("dir with space").resolve("myconus"), "grid".getBytes(ASCII)); + + DirectoryResourceResolver r = new DirectoryResourceResolver(root); + Collection listed = r.listAvailable(); + + assertTrue("a sub-directory file must be listed under the name that resolves it: " + listed, + listed.contains("tests/foo.tif")); + assertTrue(listed.contains("conus")); + assertTrue("a file only reachable through an unsafe path is not part of the inventory: " + + listed, !listed.contains("dir with space/myconus")); + assertEquals("nothing else is in the tree", 2, listed.size()); + + for (String name : listed) { + assertNull(name + " is listed, so the rule must accept it", + ResourceNames.violation(name)); + assertNotNull(name + " is listed, so it must resolve", r.resolve(name)); + } + } finally { + deleteRecursively(root); + } + } + + // ---------------------------------------------------------------------------------- helpers + + /** Renders control characters so a failure message is readable. */ + private static String display(String s) { + StringBuilder out = new StringBuilder(s.length() + 8); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c < ' ' || c == 0x7f) { + out.append(String.format("\\u%04x", (int) c)); + } else { + out.append(c); + } + } + return out.toString(); + } + + private static void deleteRecursively(Path root) throws IOException { + if (!Files.exists(root)) { + return; + } + java.nio.file.DirectoryStream stream = Files.newDirectoryStream(root); + try { + for (Path p : stream) { + if (Files.isDirectory(p)) { + deleteRecursively(p); + } else { + Files.deleteIfExists(p); + } + } + } finally { + stream.close(); + } + Files.deleteIfExists(root); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/parsers/ProjJsonDepthLimitTest.java b/core/src/test/java/org/locationtech/proj4j/security/parsers/ProjJsonDepthLimitTest.java new file mode 100644 index 0000000..c0af400 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/parsers/ProjJsonDepthLimitTest.java @@ -0,0 +1,289 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.security.parsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.concurrent.atomic.AtomicReference; + +import org.junit.Test; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.api.Proj; +import org.locationtech.proj4j.io.projjson.ProjJsonReader; +import org.locationtech.proj4j.io.projjson.ProjJsonWriter; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.WktParseException; +import org.locationtech.proj4j.io.wkt.WktReader; + +/** + * The PROJJSON reader and writer refuse a document that would recurse the stack away. + * + *

The WKT sibling of this file, {@link WktDepthLimitTest}, carries the threat model. The shape + * is the same in both notations and so are the numbers: 64 levels of syntax, 24 nested coordinate + * reference systems. What differs is that a PROJJSON {@code CompoundCRS} costs two JSON + * levels per CRS level, so the syntactic guard and the semantic one are reached by quite different + * documents — which is exactly why both are asserted. + * + *

Measured before the fix, on JDK 21 with the default stack: + * {@code ProjJsonReader.readDefinition}, {@code Proj.createCrsFromProjJson} and + * {@code ProjJsonWriter.write} all threw {@link StackOverflowError} on these inputs. + */ +public class ProjJsonDepthLimitTest { + + private static final int HOSTILE = 100000; + + private static final String INNER_JSON = "" + + "{\"type\":\"GeographicCRS\",\"name\":\"WGS 84\"," + + "\"datum\":{\"type\":\"GeodeticReferenceFrame\",\"name\":\"WGS 84\"," + + "\"ellipsoid\":{\"name\":\"WGS 84\",\"semi_major_axis\":6378137," + + "\"inverse_flattening\":298.257223563}}," + + "\"coordinate_system\":{\"subtype\":\"ellipsoidal\",\"axis\":[" + + "{\"name\":\"Latitude\",\"abbreviation\":\"lat\",\"direction\":\"north\"," + + "\"unit\":\"degree\"}," + + "{\"name\":\"Longitude\",\"abbreviation\":\"lon\",\"direction\":\"east\"," + + "\"unit\":\"degree\"}]}}"; + + private static final String INNER_WKT = + "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]]," + + "PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]"; + + // ------------------------------------------------------------------- syntax: Json.parse + + /** + * The JSON value limit counts the scalar at the bottom, so {@code n} arrays around a number is + * a document of depth {@code n + 1}: 63 arrays is the deepest that parses. + */ + @Test + public void jsonNestingIsBoundedAndTheBoundIsWhereItIsClaimed() { + // 63 arrays parses -- it is refused later, by the type check, which proves Json.parse itself + // accepted it rather than the depth guard rejecting it. + assertEquals("PROJJSON must be a JSON object", rejectionOf(arrays(63))); + assertEquals("JSON nested more than 64 deep", rejectionOf(arrays(64))); + assertEquals("JSON nested more than 64 deep", rejectionOf(arrays(65))); + assertEquals("JSON nested more than 64 deep", rejectionOf(arrays(HOSTILE))); + assertEquals("JSON nested more than 64 deep", rejectionOf(objects(HOSTILE))); + } + + // ------------------------------------------------ semantics: the CompoundCRS double walk + + /** + * {@code CompoundCRS} inside {@code CompoundCRS} recurses twice over one document: once in + * {@code Json.parse} and once in {@code ProjJsonReader.crs -> compound -> crs}. 23 wrappers + * around a real CRS is 24 CRSs and reads; 24 wrappers is refused, with the syntactic guard still + * far away. + */ + @Test + public void nestedCompoundCrsIsBoundedBySemanticDepthNotOnlyByJsonNesting() { + CrsDefinition ok = new ProjJsonReader().readDefinition(nestedCompound(23)); + assertEquals(CrsDefinition.Kind.COMPOUND, ok.getKind()); + assertEquals("the whole chain must actually have been built", 24, chainLength(ok)); + + assertEquals("CRSs nested more than 24 deep in PROJJSON", rejectionOf(nestedCompound(24))); + assertEquals("CRSs nested more than 24 deep in PROJJSON", rejectionOf(nestedCompound(25))); + } + + /** {@code BoundCRS.source_crs} is the other way back into {@code crs()}. */ + @Test + public void nestedBoundCrsIsBounded() { + StringBuilder open = new StringBuilder(); + StringBuilder close = new StringBuilder(); + for (int i = 0; i < 30; i++) { + open.append("{\"type\":\"BoundCRS\",\"source_crs\":"); + close.append("}"); + } + assertEquals("CRSs nested more than 24 deep in PROJJSON", + rejectionOf(open + INNER_JSON + close)); + } + + // ---------------------------------------------------------------- the writer recurses too + + /** + * {@link ProjJsonWriter#write(CrsDefinition)} walks a caller-supplied {@link CrsDefinition} + * graph and then hands the resulting {@code Map} tree to a second recursion, {@code Json.write}. + * Both are bounded; this asserts the first, and asserts the legitimate case still writes. + */ + @Test + public void theProjJsonWriterIsBoundedOnSemanticDepth() { + String written = new ProjJsonWriter().write(compoundChain(23)); + assertNotNull(written); + assertTrue(written.contains("\"CompoundCRS\"")); + + for (int n : new int[]{24, 25, HOSTILE}) { + try { + new ProjJsonWriter().write(compoundChain(n)); + fail("expected a WktParseException at " + n); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("CRSs nested more than 24 deep")); + } + } + } + + /** + * The round trip the plan calls out: {@code Json.write} recurses, so a document accepted by the + * reader must be writable by the writer and re-readable afterwards. This is the acceptance half + * of the writer's guard — the pair of limits is chosen so the parse ceiling can never produce a + * tree the writer refuses. + */ + @Test + public void aDeepButLegalDocumentSurvivesAFullRoundTrip() { + String json = nestedCompound(23); + CrsDefinition read = new ProjJsonReader().readDefinition(json); + String out = new ProjJsonWriter().write(read); + CrsDefinition again = new ProjJsonReader().readDefinition(out); + assertEquals(24, chainLength(again)); + assertEquals(out, new ProjJsonWriter().write(again)); + } + + // ------------------------------------------------------------------- the caller's view + + @Test + public void theFacadeReportsARefusalNotAnError() { + try { + Proj.createCrsFromProjJson(nestedCompound(HOSTILE)); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertSame(ErrorCause.INVALID_CRS_SYNTAX, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("nested more than 64 deep")); + assertTrue("the cause must be the reader's own exception, not an Error", + e.getCause() instanceof WktParseException); + } + assertNotNull(Proj.createCrsFromProjJson(INNER_JSON)); + } + + // ------------------------------------------------------- the control: is the input hostile? + + /** + * The same control as the WKT side: on a 128 KiB stack an unguarded recursive descent over the + * same document must still die, or none of the assertions above are measuring anything. + */ + @Test + public void theControl_anUnguardedParserDiesOnTheSameInputAndTheSameStack() { + final String hostile = arrays(HOSTILE); + + Throwable unguarded = WktDepthLimitTest.onSmallStack(new Runnable() { + public void run() { + naiveDepth(hostile, 0); + } + }); + assertTrue("CONTROL FAILED: the hostile document no longer overflows an unguarded parser, " + + "so nothing above is a measurement -- got " + unguarded, + unguarded instanceof StackOverflowError); + + Throwable guarded = WktDepthLimitTest.onSmallStack(new Runnable() { + public void run() { + new ProjJsonReader().readDefinition(hostile); + } + }); + assertTrue("production read must refuse, not overflow -- got " + guarded, + guarded instanceof WktParseException); + } + + /** And the guard is not simply refusing everything. */ + @Test + public void legitimateProjJsonStillParsesOnASmallStack() { + final AtomicReference out = new AtomicReference(); + Throwable t = WktDepthLimitTest.onSmallStack(new Runnable() { + public void run() { + out.set(new ProjJsonReader().readDefinition(INNER_JSON)); + } + }); + assertNull("a legitimate PROJJSON document must still parse: " + t, t); + assertNotNull(out.get()); + assertEquals(CrsDefinition.Kind.GEOGRAPHIC, out.get().getKind()); + } + + // ------------------------------------------------------------------------------- helpers + + private static String repeat(String s, int n) { + StringBuilder sb = new StringBuilder(s.length() * n); + for (int i = 0; i < n; i++) { + sb.append(s); + } + return sb.toString(); + } + + private static String arrays(int n) { + return repeat("[", n) + "1" + repeat("]", n); + } + + private static String objects(int n) { + return repeat("{\"a\":", n) + "1" + repeat("}", n); + } + + private static String nestedCompound(int n) { + return repeat("{\"type\":\"CompoundCRS\",\"name\":\"c\",\"components\":[", n) + + INNER_JSON + repeat("]}", n); + } + + private static CrsDefinition compoundChain(int wrappers) { + CrsDefinition cur = new WktReader().readDefinition(INNER_WKT); + for (int i = 0; i < wrappers; i++) { + CrsDefinition c = new CrsDefinition(); + c.setKind(CrsDefinition.Kind.COMPOUND); + c.setName("c" + i); + c.addComponent(cur); + cur = c; + } + return cur; + } + + private static int chainLength(CrsDefinition def) { + int n = 1; + while (!def.getComponents().isEmpty()) { + def = def.getComponents().get(0); + n++; + } + return n; + } + + private static String rejectionOf(String json) { + try { + new ProjJsonReader().readDefinition(json); + return "NOT REJECTED"; + } catch (WktParseException e) { + String m = e.getMessage(); + int at = m.indexOf(" at "); + int semi = m.indexOf(';'); + int end = at < 0 ? semi : semi < 0 ? at : Math.min(at, semi); + return end < 0 ? m : m.substring(0, end); + } + } + + /** + * A deliberately unguarded recursive descent over the same nesting: the control that the input + * is genuinely hostile rather than merely long. + */ + private static int naiveDepth(String s, int pos) { + while (pos < s.length() && s.charAt(pos) != '[' && s.charAt(pos) != ']') { + pos++; + } + if (pos < s.length() && s.charAt(pos) == '[') { + pos = naiveDepth(s, pos + 1); + while (pos < s.length() && s.charAt(pos) != ']') { + pos++; + } + return pos + 1; + } + return pos; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/parsers/RealCorpusDepthHeadroomTest.java b/core/src/test/java/org/locationtech/proj4j/security/parsers/RealCorpusDepthHeadroomTest.java new file mode 100644 index 0000000..5bfd157 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/parsers/RealCorpusDepthHeadroomTest.java @@ -0,0 +1,324 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.security.parsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Properties; + +import org.junit.Assume; +import org.junit.Test; +import org.locationtech.proj4j.io.projjson.ProjJsonReader; +import org.locationtech.proj4j.io.projjson.ProjJsonWriter; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.WktDialect; +import org.locationtech.proj4j.io.wkt.WktNode; +import org.locationtech.proj4j.io.wkt.WktParser; +import org.locationtech.proj4j.io.wkt.WktReader; +import org.locationtech.proj4j.io.wkt.WktWriter; + +/** + * A depth cap below real data is a functional regression, so this measures the real data. + * + *

The corpus is {@code proj4/wkt/epsg.properties} from the shipped {@code proj4j-epsg} artifact: + * 5,671 EPSG definitions in WKT1, the widest sample of genuine WKT this project carries. + * Every one of them is parsed, written back as WKT2 in both dialects and as PROJJSON, and re-read; + * every depth is measured and the maxima are pinned. The limits in force are 64 syntactic + * and 24 semantic, so the headroom is asserted rather than assumed. + * + *

What the corpus actually contains, and therefore the answer to "is 64 above real data": + * + * + * + * + * + * + * + *
deepest real document
WKT1 tree, read7
WKT2:2019 tree, written8
WKT2:2015 tree, written8
PROJJSON, written8
nested CRSs, semantic3
+ * The caps are eight times the deepest real document in every one of those five directions. + * + *

The measurement has a control, because a scan that reports a comfortable maximum having + * silently read nothing is exactly the failure this project keeps finding: the test asserts a + * minimum number of entries scanned, asserts that the deepest one found is genuinely nested (not + * 1, which is what a broken depth meter would report), and names the entry it found. + */ +public class RealCorpusDepthHeadroomTest { + + /** The syntactic limit enforced by {@code WktParser} and {@code WktFormat}. */ + private static final int MAX_DEPTH = 64; + + /** The resource, in the {@code proj4j-epsg} artifact, which is on core's test classpath. */ + private static final String CORPUS = "proj4/wkt/epsg.properties"; + + /** The semantic limit enforced by {@code WktReader}, {@code WktWriter} and {@code CrsDefinition}. */ + private static final int MAX_CRS_DEPTH = 24; + + /** + * Pinned, because the corpus is a committed input: 5,671 definitions, none deeper than a tree + * depth of 7 — {@code COMPD_CS[PROJCS[GEOGCS[DATUM[SPHEROID[AUTHORITY["EPSG","7019"]]]]]]}, + * whose innermost node is a leaf. {@code EPSG:4100} is one such entry. An unpinned "it is + * comfortably under the limit" would not notice the corpus changing underneath it. + */ + private static final int EXPECTED_MAX_TREE_DEPTH = 7; + + /** + * What this library emits is one level deeper than what it reads, because WKT2 wraps a + * projected CRS's base in {@code BASEGEOGCRS} where WKT1 nests {@code GEOGCS} directly. Pinned + * for both output notations, because a cap that admitted every input but refused the library's + * own output would be just as much a regression — and it is the emitted depth, not the read + * depth, that the writers' guards have to clear. + */ + private static final int EXPECTED_MAX_WRITTEN_WKT_DEPTH = 8; + + private static final int EXPECTED_MAX_WRITTEN_JSON_DEPTH = 8; + + /** + * The deepest semantic nesting in real data: {@code COMPD_CS[PROJCS[GEOGCS[…]]]} is + * three coordinate reference systems, because a projected CRS's base geographic CRS is one in + * its own right. The histogram is pinned too, so that a change which flattened the graph — and + * so quietly disarmed the semantic guard — would fail here rather than pass. + */ + private static final int EXPECTED_MAX_CRS_DEPTH = 3; + + private static final int EXPECTED_AT_CRS_DEPTH_1 = 1240; + private static final int EXPECTED_AT_CRS_DEPTH_2 = 4367; + private static final int EXPECTED_AT_CRS_DEPTH_3 = 64; + + private static final int EXPECTED_ENTRY_COUNT = 5671; + + @Test + public void theDeepestRealWktInTheShippedDictionaryIsFarInsideTheLimit() throws IOException { + Properties corpus = loadCorpus(); + Assume.assumeTrue("proj4j-epsg is not on the classpath", corpus != null); + + int scanned = 0; + int deepest = 0; + String deepestKey = null; + List unparsable = new ArrayList(); + for (String key : sortedKeys(corpus)) { + String wkt = corpus.getProperty(key); + WktNode root; + try { + root = WktParser.parse(wkt); + } catch (RuntimeException e) { + unparsable.add(key + ": " + e.getMessage()); + continue; + } + scanned++; + int d = treeDepth(root); + if (d > deepest) { + deepest = d; + deepestKey = key; + } + } + + assertEquals("every shipped definition must still parse under the new depth cap -- " + + "a cap below real data is a functional regression: " + head(unparsable), + 0, unparsable.size()); + assertEquals("the corpus is a committed input; its size is pinned", + EXPECTED_ENTRY_COUNT, scanned); + assertTrue("CONTROL FAILED: the depth meter reported " + deepest + ", which is what it " + + "would report if it were not measuring nesting at all", + deepest >= 5); + assertEquals("deepest real WKT was EPSG:" + deepestKey, + EXPECTED_MAX_TREE_DEPTH, deepest); + assertTrue("the cap must sit far above real data, not just above it", + MAX_DEPTH >= 8 * deepest); + } + + /** + * The same question for what this library emits, and for the semantic layer. + * + *

Scans the whole corpus, not just its compound entries. Filtering to + * {@code COMPD_CS} would be an assumption about where the deep documents are, and an + * unverified assumption in a headroom measurement is how a cap ends up below real data. Every + * definition is read, written as WKT2 in both dialects and as PROJJSON, and read back — so the + * acceptance half of all four guards is exercised 5,671 times. + */ + @Test + public void theDeepestDocumentThisLibraryWritesIsFarInsideTheLimit() throws IOException { + Properties corpus = loadCorpus(); + Assume.assumeTrue("proj4j-epsg is not on the classpath", corpus != null); + + int written = 0; + int compound = 0; + int deepestWkt2019 = 0; + int deepestWkt2015 = 0; + int deepestJson = 0; + int deepestCrs = 0; + String deepestWktKey = null; + String deepestJsonKey = null; + int[] crsHistogram = new int[MAX_CRS_DEPTH + 2]; + + for (String key : sortedKeys(corpus)) { + String wkt = corpus.getProperty(key); + if (wkt.indexOf("COMPD_CS") >= 0) { + compound++; + } + CrsDefinition def = new WktReader().readDefinition(wkt); + + int d2019 = treeDepth(new WktWriter(WktDialect.WKT2_2019).toNode(def)); + int d2015 = treeDepth(new WktWriter(WktDialect.WKT2_2015).toNode(def)); + int dWkt = Math.max(d2019, d2015); + if (dWkt > deepestWkt2019) { + deepestWktKey = key; + } + deepestWkt2019 = Math.max(deepestWkt2019, d2019); + deepestWkt2015 = Math.max(deepestWkt2015, d2015); + + String json = new ProjJsonWriter().write(def); + int dJson = textDepth(json, '{', '[', '}', ']'); + if (dJson > deepestJson) { + deepestJsonKey = key; + } + deepestJson = Math.max(deepestJson, dJson); + // and it reads back, which is the acceptance half + new ProjJsonReader().readDefinition(json); + + int dCrs = crsDepth(def); + deepestCrs = Math.max(deepestCrs, dCrs); + if (dCrs < crsHistogram.length) { + crsHistogram[dCrs]++; + } + written++; + } + + assertEquals("every shipped definition must survive a full write and re-read", + EXPECTED_ENTRY_COUNT, written); + assertTrue("CONTROL FAILED: no compound definitions were found, so the deep cases were " + + "never exercised", compound >= 50); + assertTrue("CONTROL FAILED: the WKT depth meter returned " + deepestWkt2019 + + ", which is what it would report if it were not measuring nesting", + deepestWkt2019 >= 5); + assertTrue("CONTROL FAILED: the PROJJSON depth meter returned " + deepestJson, + deepestJson >= 5); + assertTrue("CONTROL FAILED: the CRS depth meter returned " + deepestCrs, deepestCrs >= 2); + + assertEquals("deepest WKT2:2019 this library writes, from EPSG:" + deepestWktKey, + EXPECTED_MAX_WRITTEN_WKT_DEPTH, deepestWkt2019); + assertEquals("deepest WKT2:2015 this library writes", + EXPECTED_MAX_WRITTEN_WKT_DEPTH, deepestWkt2015); + assertEquals("deepest PROJJSON this library writes, from EPSG:" + deepestJsonKey, + EXPECTED_MAX_WRITTEN_JSON_DEPTH, deepestJson); + assertEquals("deepest semantic CRS nesting in real data", + EXPECTED_MAX_CRS_DEPTH, deepestCrs); + assertEquals("definitions at CRS depth 1", EXPECTED_AT_CRS_DEPTH_1, crsHistogram[1]); + assertEquals("definitions at CRS depth 2", EXPECTED_AT_CRS_DEPTH_2, crsHistogram[2]); + assertEquals("definitions at CRS depth 3", EXPECTED_AT_CRS_DEPTH_3, crsHistogram[3]); + + assertTrue("the syntactic cap must sit far above what this library emits, not just above it", + MAX_DEPTH >= 8 * deepestWkt2019 && MAX_DEPTH >= 8 * deepestJson); + assertTrue("the semantic cap must sit far above real data", + MAX_CRS_DEPTH >= 8 * deepestCrs); + } + + // ------------------------------------------------------------------------------- helpers + + private static Properties loadCorpus() throws IOException { + InputStream in = RealCorpusDepthHeadroomTest.class.getClassLoader() + .getResourceAsStream(CORPUS); + if (in == null) { + return null; + } + try { + Properties p = new Properties(); + Reader r = new InputStreamReader(in, "UTF-8"); + p.load(r); + return p; + } finally { + in.close(); + } + } + + /** Deterministic iteration, so a tie between equally deep entries always names the same one. */ + private static List sortedKeys(Properties corpus) { + List keys = new ArrayList(corpus.stringPropertyNames()); + Collections.sort(keys); + return keys; + } + + /** Nested CRSs in a definition graph, the outermost being 1 — {@code WktReader}'s convention. */ + private static int crsDepth(CrsDefinition def) { + int best = 0; + if (def.getBaseCrs() != null) { + best = Math.max(best, crsDepth(def.getBaseCrs())); + } + if (def.getHubCrs() != null) { + best = Math.max(best, crsDepth(def.getHubCrs())); + } + for (int i = 0; i < def.getComponents().size(); i++) { + best = Math.max(best, crsDepth(def.getComponents().get(i))); + } + return best + 1; + } + + private static int treeDepth(WktNode node) { + int best = 0; + for (int i = 0; i < node.childCount(); i++) { + best = Math.max(best, treeDepth(node.child(i))); + } + return best + 1; + } + + /** Nesting of {@code text}, ignoring brackets inside quoted strings. */ + private static int textDepth(String text, char open1, char open2, char close1, char close2) { + int depth = 0; + int max = 0; + boolean inQuotes = false; + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + if (inQuotes) { + if (c == '\\') { + i++; + } else if (c == '"') { + inQuotes = false; + } + continue; + } + if (c == '"') { + inQuotes = true; + } else if (c == open1 || c == open2) { + depth++; + max = Math.max(max, depth); + } else if (c == close1 || c == close2) { + depth--; + } + } + return max; + } + + private static String head(List items) { + if (items.isEmpty()) { + return ""; + } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < Math.min(5, items.size()); i++) { + sb.append("\n ").append(items.get(i)); + } + if (items.size() > 5) { + sb.append("\n ... and ").append(items.size() - 5).append(" more"); + } + return sb.toString(); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/parsers/WktDepthLimitTest.java b/core/src/test/java/org/locationtech/proj4j/security/parsers/WktDepthLimitTest.java new file mode 100644 index 0000000..4d07e7a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/parsers/WktDepthLimitTest.java @@ -0,0 +1,438 @@ +/* + * Copyright 2026, PROJ4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.security.parsers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicReference; + +import org.junit.Test; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.api.Proj; +import org.locationtech.proj4j.io.wkt.CrsDefinition; +import org.locationtech.proj4j.io.wkt.WktNode; +import org.locationtech.proj4j.io.wkt.WktParseException; +import org.locationtech.proj4j.io.wkt.WktParser; +import org.locationtech.proj4j.io.wkt.WktReader; +import org.locationtech.proj4j.io.wkt.WktWriter; + +/** + * The WKT reader and writer refuse a document that would recurse the stack away. + * + *

Threat model. This library is called per row inside Spark executors, the CRS string is + * untrusted user input, and one {@code CoordinateTransform} is shared between threads. Both WKT + * layers are recursive descent at roughly two bytes of input per stack frame, so an unbounded + * parser turns about 12 KB of {@code "A[A[A[…"} into a {@link StackOverflowError} — an + * {@code Error}, which escapes {@code catch (WktParseException)} at {@code Proj.java:898-905} and + * {@code catch (RuntimeException)} at {@code :916-923} alike, and can leave a cached transform + * half-built. Nothing in {@code core/src/main} catches {@code Throwable} or {@code Error}, on + * purpose; the fix is to make the overflow unreachable, not to catch it. + * + *

Measured before the fix, on JDK 21 with the default stack: {@code WktParser.parse}, + * {@code WktReader.readDefinition}, {@code Proj.createCrsFromWkt}, {@code WktNode.toString} and + * {@code WktWriter.toNode} all threw {@code StackOverflowError} on these same inputs. The parser + * overflowed at a bracket nesting of about 6,150 with the default stack and about 390 under + * {@code -Xss256k}. + * + *

Every assertion here has both halves. A guard that refuses everything passes every + * hostile test and breaks the library, so each limit is pinned by a rejection and by an + * acceptance one level below it, and {@link #legitimateWktStillParsesOnASmallStack()} keeps a real + * EPSG definition working on the same 128 KiB stack that makes the hostile input fatal to an + * unguarded parser. + */ +public class WktDepthLimitTest { + + /** + * Deep enough to overflow any stack this library will ever run on: about 200 KB of brackets. + */ + private static final int HOSTILE = 100000; + + /** Small enough that an unguarded recursive descent over {@link #HOSTILE} certainly dies. */ + private static final int SMALL_STACK_BYTES = 128 * 1024; + + private static final String INNER_WKT = + "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]]," + + "PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]"; + + // ------------------------------------------------------------------ syntax: WktParser + + /** + * The tree limit counts leaves, so {@code n} brackets around a token is a tree of depth + * {@code n + 1}: 63 brackets is the deepest that parses, 64 is the first refused. + */ + @Test + public void bracketNestingIsBoundedAndTheBoundIsWhereItIsClaimed() { + assertNotNull("63 brackets is a tree of depth 64 and must still parse", + WktParser.parse(brackets(63))); + assertEquals("WKT nested more than 64 deep", + messagePrefixOfRejection(brackets(64))); + assertEquals("WKT nested more than 64 deep", + messagePrefixOfRejection(brackets(65))); + assertEquals("WKT nested more than 64 deep", + messagePrefixOfRejection(brackets(HOSTILE))); + } + + /** {@code (…)} is the other bracket flavour PROJ accepts, and it must be bounded too. */ + @Test + public void theOtherBracketFlavourIsBoundedToo() { + String hostile = repeat("A(", HOSTILE) + "b" + repeat(")", HOSTILE); + try { + WktParser.parse(hostile); + fail("expected a WktParseException"); + } catch (WktParseException e) { + assertTrue(e.getMessage(), e.getMessage().startsWith("WKT nested more than 64 deep")); + } + } + + // ------------------------------------------------- semantics: the COMPOUNDCRS double walk + + /** + * {@code COMPOUNDCRS[COMPOUNDCRS[…]]} recurses twice over the same document: once building the + * tree ({@code WktParser}) and once walking it ({@code WktReader.crs -> compound -> crs}). The + * semantic limit is 24 nested CRSs and the innermost {@code GEOGCS} is itself one, so 23 + * wrappers is the deepest that reads. + */ + @Test + public void nestedCompoundCrsIsBoundedBySemanticDepthNotOnlyByBrackets() { + CrsDefinition ok = new WktReader().readDefinition(nestedCompound(23)); + assertNotNull(ok); + assertEquals(CrsDefinition.Kind.COMPOUND, ok.getKind()); + assertEquals("the whole chain must actually have been built", 24, chainLength(ok)); + + // 24 wrappers is 25 CRSs, and is refused by the SEMANTIC guard -- the tree is only 27 deep, + // far inside the syntactic limit, which is what makes this a test of the second layer. + assertTrue("the syntactic guard must not be the one firing here", + depthOf(WktParser.parse(nestedCompound(24))) < 64); + assertEquals("CRSs nested more than 24 deep in WKT", + messagePrefixOfCrsRejection(nestedCompound(24))); + assertEquals("CRSs nested more than 24 deep in WKT", + messagePrefixOfCrsRejection(nestedCompound(25))); + } + + /** {@code BOUNDCRS[SOURCECRS[…]]} is the other way back into {@code crs()}. */ + @Test + public void nestedBoundCrsIsBounded() { + StringBuilder open = new StringBuilder(); + StringBuilder close = new StringBuilder(); + // 25 wrappers is 26 CRSs -- past the semantic limit -- but only 50 brackets, so the tree + // is about 54 deep and the syntactic guard is not the one that fires. + for (int i = 0; i < 25; i++) { + open.append("BOUNDCRS[SOURCECRS["); + close.append("]]"); + } + String wkt = open + INNER_WKT + close; + assertTrue("two brackets per CRS level, so the tree stays inside the syntactic limit", + depthOf(WktParser.parse(wkt)) < 64); + assertEquals("CRSs nested more than 24 deep in WKT", messagePrefixOfCrsRejection(wkt)); + } + + // ---------------------------------------------------------------- the writers recurse too + + /** + * {@link WktNode#of} is public, so a caller can hand the formatter a tree of any depth; + * {@link WktNode#toString()} reaches it with no parser involved. The writer's bound is the + * parser's, so a tree that parsed can always be written back. + */ + @Test + public void theWktFormatterIsBoundedOnTheSameTreeDepthAsTheParser() { + assertNotNull("a tree of depth 64 parses, so it must also write", deepNode(63).toString()); + try { + deepNode(64).toString(); + fail("expected a WktParseException"); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("WKT tree nested more than 64 deep")); + } + try { + deepNode(HOSTILE).toString(); + fail("expected a WktParseException"); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("WKT tree nested more than 64 deep")); + } + } + + /** + * {@link CrsDefinition} is public and mutable, so {@link WktWriter#toNode} takes a graph a + * caller assembled, not only one a reader produced. + */ + @Test + public void theWktWriterIsBoundedOnSemanticDepth() { + assertNotNull(new WktWriter().toNode(compoundChain(23))); + for (int n : new int[]{24, 25, HOSTILE}) { + try { + new WktWriter().toNode(compoundChain(n)); + fail("expected a WktParseException at " + n); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("CRSs nested more than 24 deep")); + } + } + } + + /** + * A definition that contains itself is the degenerate case of the same recursion, and used to + * be an unbounded one. Assert the guard converts it into a refusal. + */ + @Test + public void aSelfReferentialDefinitionIsRefusedRatherThanRecursedForever() { + CrsDefinition loop = new CrsDefinition(); + loop.setKind(CrsDefinition.Kind.COMPOUND); + loop.setName("ouroboros"); + loop.addComponent(loop); + try { + loop.horizontalComponent(); + fail("expected a WktParseException"); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("CRSs nested more than 24 deep")); + } + try { + loop.resolveDatum(); + fail("expected a WktParseException"); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("CRSs nested more than 24 deep")); + } + try { + loop.resolveToWgs84(); + fail("expected a WktParseException"); + } catch (WktParseException e) { + assertTrue(e.getMessage(), + e.getMessage().startsWith("CRSs nested more than 24 deep")); + } + } + + // ------------------------------------------------------------------- the caller's view + + /** + * What a caller of the facade actually sees. Both halves matter: the refusal is a + * {@link Proj4jException} with a cause, and the same call on a legitimate document still + * builds a CRS. + */ + @Test + public void theFacadeReportsARefusalNotAnError() { + try { + Proj.createCrsFromWkt(nestedCompound(HOSTILE)); + fail("expected a CrsCreationException"); + } catch (CrsCreationException e) { + assertSame(ErrorCause.INVALID_CRS_SYNTAX, e.cause()); + assertTrue(e.getMessage(), e.getMessage().contains("nested more than 64 deep")); + assertTrue("the cause must be the parser's own exception, not an Error", + e.getCause() instanceof WktParseException); + assertTrue(e instanceof Proj4jException); + } + assertNotNull(Proj.createCrsFromWkt(INNER_WKT)); + } + + // ------------------------------------------------------- the control: is the input hostile? + + /** + * The positive control for every assertion above. + * + *

An assertion that production code throws {@code WktParseException} proves nothing on its + * own — it would also hold if the input were harmless. So the same string is fed, on the same + * 128 KiB thread, to a deliberately unguarded recursive descent over the same bracket language. + * That one must die with {@link StackOverflowError}. If it ever stops doing so, this file has + * stopped testing anything and the assertion below says so. + */ + @Test + public void theControl_anUnguardedParserDiesOnTheSameInputAndTheSameStack() { + final String hostile = brackets(HOSTILE); + + Throwable unguarded = onSmallStack(new Runnable() { + public void run() { + naiveDepth(hostile, 0); + } + }); + assertTrue("CONTROL FAILED: the hostile input no longer overflows an unguarded parser on a " + + SMALL_STACK_BYTES + "-byte stack, so nothing below is a measurement -- got " + + unguarded, + unguarded instanceof StackOverflowError); + + Throwable guarded = onSmallStack(new Runnable() { + public void run() { + WktParser.parse(hostile); + } + }); + assertTrue("production parse must refuse, not overflow -- got " + guarded, + guarded instanceof WktParseException); + + Throwable guardedReader = onSmallStack(new Runnable() { + public void run() { + new WktReader().readDefinition(nestedCompound(HOSTILE)); + } + }); + assertTrue("production read must refuse, not overflow -- got " + guardedReader, + guardedReader instanceof WktParseException); + } + + /** + * The other half of the control: the guard is not simply refusing everything. A real EPSG + * definition still reads, and still produces a usable CRS, on that same small stack. + */ + @Test + public void legitimateWktStillParsesOnASmallStack() { + final AtomicReference out = + new AtomicReference(); + Throwable t = onSmallStack(new Runnable() { + public void run() { + out.set(new WktReader().read(INNER_WKT)); + } + }); + assertNull("a legitimate WKT document must still parse: " + t, t); + assertNotNull(out.get()); + } + + // ------------------------------------------------------------------------------- helpers + + private static String repeat(String s, int n) { + StringBuilder sb = new StringBuilder(s.length() * n); + for (int i = 0; i < n; i++) { + sb.append(s); + } + return sb.toString(); + } + + private static String brackets(int n) { + return repeat("A[", n) + "b" + repeat("]", n); + } + + private static String nestedCompound(int n) { + return repeat("COMPOUNDCRS[\"c\",", n) + INNER_WKT + repeat("]", n); + } + + private static WktNode deepNode(int n) { + WktNode node = WktNode.of("A", Arrays.asList(WktNode.literal("x"))); + for (int i = 1; i < n; i++) { + node = WktNode.of("A", Arrays.asList(node)); + } + return node; + } + + private static CrsDefinition compoundChain(int wrappers) { + CrsDefinition cur = new WktReader().readDefinition(INNER_WKT); + for (int i = 0; i < wrappers; i++) { + CrsDefinition c = new CrsDefinition(); + c.setKind(CrsDefinition.Kind.COMPOUND); + c.setName("c" + i); + c.addComponent(cur); + cur = c; + } + return cur; + } + + private static int chainLength(CrsDefinition def) { + int n = 1; + while (!def.getComponents().isEmpty()) { + def = def.getComponents().get(0); + n++; + } + return n; + } + + /** Tree depth of a parsed node, root 1, leaves counted — the parser's own convention. */ + private static int depthOf(WktNode node) { + int best = 0; + for (int i = 0; i < node.childCount(); i++) { + best = Math.max(best, depthOf(node.child(i))); + } + return best + 1; + } + + private static String messagePrefixOfRejection(String wkt) { + try { + WktParser.parse(wkt); + return "NOT REJECTED"; + } catch (WktParseException e) { + return firstClause(e.getMessage()); + } + } + + private static String messagePrefixOfCrsRejection(String wkt) { + try { + new WktReader().readDefinition(wkt); + return "NOT REJECTED"; + } catch (WktParseException e) { + return firstClause(e.getMessage()); + } + } + + /** The message up to its first {@code " at "} or {@code ";"}, so offsets do not over-pin. */ + private static String firstClause(String message) { + int at = message.indexOf(" at "); + int semi = message.indexOf(';'); + int end = at < 0 ? semi : semi < 0 ? at : Math.min(at, semi); + return end < 0 ? message : message.substring(0, end); + } + + /** + * A deliberately unguarded recursive descent over the same bracket language: one frame per + * bracket, exactly the shape {@code WktParser.parseNode} had before this workstream. Used only + * as the control that the input is genuinely hostile. + */ + private static int naiveDepth(String s, int pos) { + while (pos < s.length() && s.charAt(pos) != '[' && s.charAt(pos) != ']') { + pos++; + } + if (pos < s.length() && s.charAt(pos) == '[') { + pos = naiveDepth(s, pos + 1); + while (pos < s.length() && s.charAt(pos) != ']') { + pos++; + } + return pos + 1; + } + return pos; + } + + /** + * Runs {@code body} on a thread with a deliberately small stack and returns whatever it threw, + * or {@code null} if it returned normally. + */ + static Throwable onSmallStack(final Runnable body) { + final AtomicReference thrown = new AtomicReference(); + Runnable wrapper = new Runnable() { + public void run() { + try { + body.run(); + } catch (Throwable t) { + thrown.set(t); + } + } + }; + Thread t = new Thread(null, wrapper, "depth-probe", SMALL_STACK_BYTES); + t.start(); + try { + t.join(120000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new AssertionError("interrupted waiting for the probe thread"); + } + if (t.isAlive()) { + throw new AssertionError("the probe thread did not finish"); + } + return thrown.get(); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/readers/GridBinaryReaderSecurityTest.java b/core/src/test/java/org/locationtech/proj4j/security/readers/GridBinaryReaderSecurityTest.java new file mode 100644 index 0000000..f1843af --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/readers/GridBinaryReaderSecurityTest.java @@ -0,0 +1,886 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.security.readers; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.datum.GridExtents; +import org.locationtech.proj4j.datum.GridFormatException; +import org.locationtech.proj4j.datum.tiff.GeoTiffDataset; +import org.locationtech.proj4j.datum.tiff.UnsupportedTiffException; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceResolvers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Integer-overflow guards in the four binary grid readers: what they refuse, what they must still + * accept, and how much memory a refusal costs. + * + *

The defect, as measured — not as described

+ * + *

Five readers shared one shape: validate the inputs, then multiply them into an unchecked + * {@code int} and allocate on the result, never comparing the product against the bytes the file + * actually holds. Every row below was produced by running the readers as they stood, at + * {@code -Xmx1g}, against the crafters in {@link HostileGrids}. None of these is a hypothesis. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
measured before the guards existed
crafted inputfileoutcome
{@code CTABLE V2} declaring 100000×100000160 B{@code lim} accepted; {@code 100000 * 100000} is {@code 1410065408}; + * {@code OutOfMemoryError}, 5.25 GiB of references
{@code NTv1} with {@code LAT_INC = 0}192 Bno exception; {@code lim.phi} = {@code Integer.MIN_VALUE}
{@code NTv1} with a zero span and a zero increment192 Bno exception; {@code NaN} truncated to a plausible 1×1 grid
{@code NTv1} with {@code LAT_INC = 1e-300}192 Bno exception; both axes {@code Integer.MIN_VALUE}
GeoTIFF declaring 40000×40000634 B{@code OutOfMemoryError}, 6.4 GB — 10,000,000:1
GeoTIFF declaring 65536×655361,290 B{@code width * height} is exactly {@code 0}; + * {@code ArrayIndexOutOfBoundsException: Index -65536 out of bounds for length + * 0}
GeoTIFF, {@code PlanarConfig=3}, {@code SamplesPerPixel=2}28358 B{@code OutOfMemoryError} in {@code GdalMetadata} — two + * {@code double[268435456]}, 4 GB
GeoTIFF, {@code PlanarConfig=3}, 4096×4096, 8 samples~50 KBno exception at all: a {@code float[16777216]} plane of zeros from a file + * containing no pixel bytes — a geoid of exactly 0 m
+ * + *

Two corrections to the brief this work was written from

+ * + *

The 65536×65536 GeoTIFF does not corrupt node data; it throws. The brief called it + * "the only case that corrupts node data instead of throwing". It cannot: the wrapped product is + * {@code 0}, so the plane is a zero-length array and the very first scatter write is out of bounds. + * The throw is an unchecked {@code ArrayIndexOutOfBoundsException}, which escapes the + * {@code catch (IOException)} in {@code Grid.fromNadGrids} and is caught only anonymously by the + * {@code catch (RuntimeException)} in {@code Grid.describeNadGrids} — bad, but not silent. + * + *

The case that really does answer with corrupt data is {@code PlanarConfig=3}. Last row + * above. Both bounds on {@code SamplesPerPixel} are conditional on the tag being 1 or 2 — the + * block-size bound multiplies by it only for {@code CONTIG}, the strip-count bound only for + * {@code SEPARATE} — so a third value escapes both, and {@code readSamples} then computes a row stride + * eight times what {@code MAX_BLOCK_BYTES} was checked against. That is the wrong-answer failure the + * project exists to eliminate, and it was one tag value away in a 50 KB file. + * + *

How each guard is shown to discriminate

+ * + *

A guard that refuses everything passes every hostile test and breaks the library. Every rejection + * here is therefore paired with the same crafter, the same code path and in-range numbers, asserted to + * load and shift a coordinate to the value the crafted node data implies — not merely + * to avoid throwing. {@link #theGuardsAcceptEveryShapeTheShippedDataActuallyUses} additionally pins the + * real dimensions of the shipped grids and of {@code proj4j-db.pjdx} against the bounds, because one + * draft of {@code MAX_EXTENT} would have rejected the project's own database: its string pool holds + * 97,930 strings against a 100,000 cap that looked generous. + * + *

"Before the allocation" is measured, not asserted

+ * + *

{@link #aRefusalCostsNoMemory} reads {@code ThreadMXBean.getThreadAllocatedBytes} across each + * refusal. Its own positive control allocates a known 32 MB first and requires the meter to see it, so + * a meter that always reads zero fails the test rather than passing every case. + */ +public class GridBinaryReaderSecurityTest { + + private Path root; + + @After + public void resetChain() throws IOException { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + if (root != null) { + deleteRecursively(root); + root = null; + } + } + + /** Publishes {@code bytes} under {@code name} through the real resolver chain. */ + private void publish(String name, byte[] bytes) throws IOException { + if (root == null) { + root = Files.createTempDirectory("proj4j-hostile-grid"); + ResourceResolvers.addResolver(new DirectoryResourceResolver(root)); + } + Files.write(root.resolve(name), bytes); + GridCache.instance().clear(); + } + + private List load(String name, byte[] bytes) throws IOException { + publish(name, bytes); + List grids = new ArrayList(); + Grid.mergeGridFile(name, grids); + return grids; + } + + /** + * Asserts that {@code bytes} is refused by a named, bounded, in-family exception. + * + *

The three negative assertions are the point. {@code OutOfMemoryError} and + * {@code StackOverflowError} are {@link Error}s and escape {@code catch (Exception)} entirely; + * {@code NegativeArraySizeException} and {@code ArrayIndexOutOfBoundsException} are unchecked and + * escape the {@code catch (IOException)} that {@code Grid.fromNadGrids} uses. All four were + * observed coming out of these readers. + */ + private void refused(String name, byte[] bytes, String... mustMention) throws IOException { + publish(name, bytes); + try { + List grids = new ArrayList(); + Grid.mergeGridFile(name, grids); + fail(name + " must be refused, but it loaded as " + grids); + } catch (RuntimeException e) { + throw new AssertionError(name + " was refused by an UNCHECKED exception, which escapes " + + "the catch (IOException) in Grid.fromNadGrids: " + e, e); + } catch (IOException e) { + String message = String.valueOf(e.getMessage()); + for (String needle : mustMention) { + assertTrue(name + ": the refusal must mention \"" + needle + "\", but said: " + + message, message.contains(needle)); + } + } + } + + // ================================================================= CTABLE V2 + + /** + * The headline case: a 160-byte file — nothing but a header — that used to demand + * 5.25 GiB. Both axes are inside the reader's own {@code 1..100000} bound, which is precisely why + * the bound was never enough. + */ + @Test + public void ctable2With100000SquaredIsRefusedFromA160ByteHeader() throws Exception { + byte[] bytes = HostileGrids.ctable2(100000, 100000, 0, 0f, 0f); + assertEquals("the crafted file is a bare header", 160, bytes.length); + assertEquals("and 100000 * 100000 is not 10^10 in an int", 1410065408, 100000 * 100000); + refused("hostile_ctable_square", bytes, "100000 x 100000 = 10000000000", + "cannot be an array length"); + } + + /** The same shape at the smallest extent that still overflows the product. */ + @Test + public void ctable2WithAnExtentThatOverflowsIsRefused() throws Exception { + // 46341^2 = 2147488281, which is Integer.MAX_VALUE + 4634. + assertTrue("46341 squared must overflow int", 46341 * 46341 < 0); + refused("hostile_ctable_46341", HostileGrids.ctable2(46341, 46341, 0, 0f, 0f), + "46341 x 46341"); + } + + /** A plausible extent whose node data simply is not in the file. */ + @Test + public void ctable2DeclaringMoreNodesThanTheFileHoldsIsRefused() throws Exception { + byte[] bytes = HostileGrids.ctable2(100, 100, 50, 0f, 0f); + assertEquals(160 + 50 * 8, bytes.length); + // The message names the product, the bytes it would need (80,160 including the 160-byte + // header) and the length of the file that does not contain them. + refused("hostile_ctable_short", bytes, "100 x 100 = 10000", "80160", "560"); + } + + @Test + public void ctable2WithANonPositiveExtentIsRefused() throws Exception { + refused("hostile_ctable_zero", HostileGrids.ctable2(0, 3, 0, 0f, 0f), "non-positive"); + refused("hostile_ctable_neg", HostileGrids.ctable2(-4, 3, 0, 0f, 0f), "non-positive"); + } + + /** + * Positive control. The same crafter, in range: it must parse, load, and move a + * coordinate by exactly the shift written into its nodes. A guard proven only by refusals is + * indistinguishable from a reader that refuses everything. + */ + @Test + public void ctable2WithAnInRangeExtentStillLoadsAndShifts() throws Exception { + // A 21x21 grid of 1-degree cells with its lower left at (-10, -10), every node carrying the + // same shift, so the bilinear interpolation is exact wherever we probe. + float shiftLam = (float) Math.toRadians(0.25); + float shiftPhi = (float) Math.toRadians(-0.5); + List grids = load("good_ctable", HostileGrids.ctable2(21, 21, shiftLam, shiftPhi)); + assertEquals(1, grids.size()); + assertEquals("ctable2", grids.get(0).getFormat()); + + ProjCoordinate c = new ProjCoordinate(Math.toRadians(0.0), Math.toRadians(0.0)); + Grid.shift(grids, false, c); + // Grid.nad_cvt subtracts the table's lam and adds its phi, which is proj4j's convention. + // 1e-6 degrees, not 1e-9: CTABLE V2 stores each shift as a float, so a 0.25-degree shift + // round-trips through 24 bits of mantissa in radians and comes back as 0.2499999980634083. + assertEquals(-0.25, Math.toDegrees(c.x), 1e-6); + assertEquals(-0.50, Math.toDegrees(c.y), 1e-6); + } + + /** + * A file exactly the size its header declares must be accepted — the boundary between the last + * legal file and the first refused one. + */ + @Test + public void ctable2ThatIsExactlyItsDeclaredSizeIsAccepted() throws Exception { + byte[] exact = HostileGrids.ctable2(21, 21, 0f, 0f); + assertEquals(160 + 21 * 21 * 8, exact.length); + assertEquals(1, load("exact_ctable", exact).size()); + + byte[] oneNodeShort = HostileGrids.ctable2(21, 21, 21 * 21 - 1, 0f, 0f); + refused("short_ctable", oneNodeShort, "441", "3688", "3680"); + } + + // ================================================================= the Error family + + /** + * The five {@code throw new Error(...)}: which of them a hostile grid could actually reach, and + * proof that none of them is an {@link Error} any more. + * + *

This test was vacuous when first written, and the mutation sweep is what said so

+ * + *

The first version fed 160 bytes of junk through {@code Grid.mergeGridFile} and asserted the + * result was an {@code IOException}. Reverting {@code CTABLEV2}'s conversion back to + * {@code throw new Error(...)} did not fail it. The reason is worth recording: + * {@code Grid.parse} calls {@code CTABLEV2.init} only after {@code CTABLEV2.testHeader} has + * passed, and {@code init} then re-runs the same {@code containsAt} over the same + * 160 bytes — so that particular {@code Error} is unreachable from the grid path, and junk bytes + * fall out of {@code Grid.parse}'s "unrecognised format" branch long before reaching it. The test + * was measuring a branch it never entered. + * + *

So the sites are split here by how they are reached, and each is driven through the entry + * point that actually reaches it: + * + * + * + * + * + * + * + * + * + *
the five sites
sitereachable from {@code +nadgrids=}?driven here by
{@code NTV1:51} wrong record countyes — {@code testHeader} + * checks the magic, not {@code NUM_OREC}{@code Grid.mergeGridFile}
{@code CTABLEV2:48} extent out of rangeyes — the extent is + * read after the magic test{@code Grid.mergeGridFile}
{@code CTABLEV2:40} not a CTABLE V2 fileno — same predicate as + * {@code testHeader}the public {@code CTABLEV2.init}
{@code NTV1:46} not an NTV1 fileno — same predicate as {@code testHeader}the public {@code NTV1.init}
{@code NTV2:325} not an NTv2 fileno — deprecated, {@code Grid} uses + * {@code loadAll}the public {@code NTV2.init}
+ * + *

The three unreachable ones are still converted and still tested. They are {@code public + * static} methods on the format classes; "unreachable by an accident of control flow" is not a + * guarantee, and an {@code Error} escapes {@code catch (Proj4jException)} and + * {@code catch (Exception)} the moment a refactor makes one live. + */ + @Test + public void noneOfTheFiveFormerErrorSitesThrowsAnError() throws Exception { + // --- reachable from a +nadgrids= token, through the whole grid path --- + + // NTv1 magic, NUM_OREC = 13. testHeader passes; init's record-count check fires. + byte[] badRecordCount = HostileGrids.ntv1(40, 50, 60, 70, 1.0, 1.0, 121, 0, 0); + badRecordCount[11] = 13; + assertInFamily("NTv1 with NUM_OREC=13", badRecordCount, "record count"); + + // CTABLE V2 magic, extent out of range. testHeader passes; the extent check fires. + assertInFamily("CTABLE V2 with a zero extent", + HostileGrids.ctable2(0, 0, 0, 0f, 0f), "non-positive"); + + // --- reachable only through the public format API --- + assertDirectCallIsInFamily("CTABLEV2.init", new ThrowingCall() { + @Override + public void run() throws Exception { + org.locationtech.proj4j.datum.CTABLEV2.init(stream(new byte[160])); + } + }); + assertDirectCallIsInFamily("NTV1.init", new ThrowingCall() { + @Override + public void run() throws Exception { + org.locationtech.proj4j.datum.NTV1.init(stream(new byte[160])); + } + }); + assertDirectCallIsInFamily("NTV2.init", new ThrowingCall() { + @Override + public void run() throws Exception { + org.locationtech.proj4j.datum.NTV2.init(stream(new byte[400])); + } + }); + } + + private interface ThrowingCall { + void run() throws Exception; + } + + private static java.io.DataInputStream stream(byte[] bytes) { + return org.locationtech.proj4j.resource.Resources.asDataStream(bytes); + } + + /** + * Catches {@link Throwable}, not {@code Exception}: catching {@code Exception} is exactly what an + * {@code Error} slips past, so a test that used it would report a pass by disappearing. + */ + private static void assertDirectCallIsInFamily(String label, ThrowingCall call) { + Throwable caught = null; + try { + call.run(); + } catch (Throwable t) { + caught = t; + } + assertNotNull(label + " must refuse bytes that are not its format", caught); + assertFalse(label + " threw " + caught.getClass().getName() + + ", which escapes catch (Proj4jException) and catch (Exception)", + caught instanceof Error); + assertTrue(label + " must throw in the IOException family, got " + caught.getClass(), + caught instanceof IOException); + } + + /** Drives {@code bytes} through the real grid path and asserts an in-family refusal. */ + private void assertInFamily(String label, byte[] bytes, String mustMention) throws IOException { + String name = "family_" + Integer.toHexString(label.hashCode()); + publish(name, bytes); + Throwable caught = null; + try { + Grid.mergeGridFile(name, new ArrayList()); + } catch (Throwable t) { + caught = t; + } + assertNotNull(label + " must be refused", caught); + assertFalse(label + " threw " + caught.getClass().getName() + ", which escapes every handler " + + "on the grid path", caught instanceof Error); + assertTrue(label + " must be an IOException, got " + caught.getClass(), + caught instanceof IOException); + assertTrue(label + ": the message must mention \"" + mustMention + "\", but said: " + + caught.getMessage(), String.valueOf(caught.getMessage()).contains(mustMention)); + } + + /** + * The conversion has to be caught by the handlers that already exist, not merely be an + * {@code IOException} in principle. {@code Grid.describeNadGrids} is the introspection channel a + * caller uses to find out why a grid was skipped; if the refusal escaped it, a hostile grid name + * would take down the caller instead of being reported. + */ + @Test + public void aRefusalIsReportedByDescribeNadGridsRatherThanEscapingIt() throws Exception { + publish("hostile_described", HostileGrids.ctable2(100000, 100000, 0, 0f, 0f)); + List refs = Grid.describeNadGrids("hostile_described"); + assertEquals(1, refs.size()); + assertFalse("it must not have loaded", refs.get(0).isAvailable()); + assertNotNull("and describeNadGrids must carry the reason", refs.get(0).skipReason()); + assertTrue("the reason must name the declared extent: " + refs.get(0).skipReason(), + refs.get(0).skipReason().contains("100000 x 100000")); + } + + // ================================================================= NTv1 + + /** + * {@code NTV1.init} validated nothing. A zero {@code LAT_INC} makes the quotient + * infinite, {@code (int)} saturates to {@code Integer.MAX_VALUE}, and the {@code + 1} wraps. + */ + @Test + public void ntv1WithAZeroIncrementIsRefused() throws Exception { + assertEquals("the wrap this refuses", Integer.MIN_VALUE, (int) Double.POSITIVE_INFINITY + 1); + refused("hostile_ntv1_zero_inc", + HostileGrids.ntv1(40, 50, 60, 80, 0.0, 0.25, 0, 0, 0), + "NTv1", "latitude"); + } + + /** + * The dangerous one: a zero span and a zero increment give {@code 0.0 / 0.0}, and + * {@code (int) NaN} is {@code 0}, so the reader built a 1×1 grid out of a + * header describing nothing and reported success. No exception, no warning, a grid that answers. + */ + @Test + public void ntv1WithANaNExtentIsRefusedRatherThanBecomingA1x1Grid() throws Exception { + assertEquals("(int) NaN is 0, so the old code produced lim = 1", 1, (int) Double.NaN + 1); + refused("hostile_ntv1_nan", HostileGrids.ntv1(40, 40, 60, 60, 0.0, 0.0, 0, 0, 0), + "NTv1", "NaN"); + } + + /** A denormal increment: finite, enormous, and it saturated exactly like the infinite one. */ + @Test + public void ntv1WithADenormalIncrementIsRefused() throws Exception { + refused("hostile_ntv1_denormal", + HostileGrids.ntv1(-90, 90, -180, 180, 1e-300, 1e-300, 0, 0, 0), + "NTv1", "exceeds"); + } + + /** An extent the file cannot back. */ + @Test + public void ntv1DeclaringMoreNodesThanTheFileHoldsIsRefused() throws Exception { + // 0.25-degree cells over 10 x 10 degrees: 41 x 41 = 1681 nodes, but only 100 are present. + refused("hostile_ntv1_short", + HostileGrids.ntv1(40, 50, 60, 70, 0.25, 0.25, 100, 0, 0), + "41 x 41 = 1681"); + } + + /** + * Positive control. The identical crafter with a real increment loads and shifts. + * The expected numbers come from the format, not from the reader: NTv1 stores arc seconds, proj4j + * subtracts the longitude shift and adds the latitude shift. + */ + @Test + public void ntv1WithARealIncrementStillLoadsAndShifts() throws Exception { + // 40..50 N, 60..70 W at 1-degree spacing: 11 x 11 = 121 nodes. + double latShiftSec = 3600.0 * 0.25; // +0.25 degrees + double longShiftSec = 3600.0 * 0.5; // 0.5 degrees, applied with proj4j's sign convention + List grids = load("good_ntv1", + HostileGrids.ntv1(40, 50, 60, 70, 1.0, 1.0, 121, latShiftSec, longShiftSec)); + assertEquals(1, grids.size()); + assertEquals("ntv1", grids.get(0).getFormat()); + + ProjCoordinate c = new ProjCoordinate(Math.toRadians(-65.0), Math.toRadians(45.0)); + Grid.shift(grids, false, c); + assertEquals(-65.0 - 0.5, Math.toDegrees(c.x), 1e-6); + assertEquals(45.0 + 0.25, Math.toDegrees(c.y), 1e-6); + } + + /** + * The shipped {@code ntv1_can.dat} must still load. It is 1,113,184 bytes for a 393×177 grid + * plus a trailing {@code END} record, and the byte-count guard has to leave room for that record — + * a guard that budgeted exactly would refuse the only NTv1 file the project ships. + */ + @Test + public void theShippedNtv1GridStillLoads() throws Exception { + List grids = new ArrayList(); + Grid.mergeGridFile("ntv1_can.dat", grids); + assertEquals(1, grids.size()); + assertEquals("ntv1", grids.get(0).getFormat()); + } + + // ================================================================= NTv2 + + /** The same saturating cast as NTv1's, in {@code NTV2.subHeader}. */ + @Test + public void ntv2WithADenormalIncrementIsRefused() throws Exception { + refused("hostile_ntv2.gsb", + HostileGrids.ntv2(0, 36000, 0, 36000, 1e-300, 1e-300, 1, 0, 0f, 0f), + "NTv2", "exceeds"); + } + + /** + * Positive control. A crafted single-subgrid NTv2 with a real increment loads and + * shifts. Its cells are 3600 arc seconds — one degree — over ten degrees each way. + */ + @Test + public void ntv2WithARealIncrementStillLoadsAndShifts() throws Exception { + int cells = 11 * 11; + float latShiftSec = (float) (3600.0 * 0.25); + float longShiftSec = (float) (3600.0 * 0.5); + List grids = load("good_ntv2.gsb", + HostileGrids.ntv2(40 * 3600, 50 * 3600, 60 * 3600, 70 * 3600, 3600, 3600, + cells, cells, latShiftSec, longShiftSec)); + assertEquals(1, grids.size()); + assertEquals("ntv2", grids.get(0).getFormat()); + + ProjCoordinate c = new ProjCoordinate(Math.toRadians(-65.0), Math.toRadians(45.0)); + Grid.shift(grids, false, c); + assertEquals(-65.0 - 0.5, Math.toDegrees(c.x), 1e-6); + assertEquals(45.0 + 0.25, Math.toDegrees(c.y), 1e-6); + } + + // ================================================================= GeoTIFF + + /** + * 634 bytes asking for 6.4 GB. The dimensions were each checked against + * {@code Integer.MAX_VALUE}; their product never was, and {@code readSamples} allocates one + * {@code float[width * height]} per requested band. + */ + @Test + public void geoTiffWith40000SquaredIsRefused() throws Exception { + int strips = HostileGrids.stripsFor(40000, 40000, 4); + byte[] file = HostileGrids.geoTiff(40000, 40000, 1, strips).build(); + assertTrue("the crafted file must stay tiny: " + file.length, file.length < 4096); + expectTiffRefusal(file, "40000 x 40000", "decoded-grid budget"); + } + + /** + * The zero-product case. {@code 65536 * 65536} is exactly {@code 0} in an {@code int}, so the + * plane was a zero-length array and the first scatter write went to index {@code -65536}. + */ + @Test + public void geoTiffWith65536SquaredIsRefused() throws Exception { + assertEquals("the product this refuses is exactly zero", 0, 65536 * 65536); + assertEquals("and the scatter index wraps negative", -65536, 65535 * 65536 + 0); + int strips = HostileGrids.stripsFor(65536, 65536, 4); + byte[] file = HostileGrids.geoTiff(65536, 65536, 1, strips).build(); + assertTrue("the crafted file must stay tiny: " + file.length, file.length < 4096); + // 65536 * 65536 is 4,294,967,296, which trips the array-length clause before the byte + // budget one. Either is a refusal; what matters is that it is named and in family. + expectTiffRefusal(file, "65536 x 65536 = 4294967296", "cannot be an array length"); + } + + /** + * {@code PlanarConfig} presence was checked; its value was not, and TIFF defines exactly two. + * + *

This is the one case that answered with corrupt data rather than throwing. Measured before + * the guard: this file decoded with no exception and returned a + * {@code float[16777216]} plane of zeros — a geoid of exactly 0 m — because + * {@code MAX_BLOCK_BYTES} was checked against a stride of 1 while {@code readSamples} used a + * stride of 8. + */ + @Test + public void geoTiffWithAnUndefinedPlanarConfigIsRefused() throws Exception { + byte[] file = HostileGrids.geoTiff(4096, 4096, 8, 4096).shorts(284, 3).build(); + try { + GeoTiffDataset.open(file, "pc3").images().get(0).readSample(0); + fail("PlanarConfig=3 must be refused; it used to return 16,777,216 zeros"); + } catch (UnsupportedTiffException e) { + assertTrue("must name the tag and its value: " + e.getMessage(), + e.getMessage().contains("PlanarConfig=3")); + } + } + + /** + * The two definitions of the sample stride used to live in two places and disagree. They now come + * from one field; this pins that they would have agreed for every legal tag value, which + * is why validating the tag is sufficient and no behaviour changes for a real file. + */ + @Test + public void theTwoOldStrideFormulasAgreeForEveryLegalPlanarConfig() { + for (int planarConfig : new int[]{1, 2}) { + for (int spp : new int[]{1, 2, 3, 8}) { + int atValidation = planarConfig == 1 ? spp : 1; + boolean separate = planarConfig == 2 && spp > 1; + boolean contig = !separate && spp > 1; + int atUse = contig ? spp : 1; + assertEquals("PlanarConfig=" + planarConfig + " spp=" + spp, + atValidation, atUse); + } + } + // ...and disagree by a factor of samplesPerPixel for the value now refused. + int spp = 8; + int atValidation = 1; + int atUse = 8; + assertEquals("PlanarConfig=3 is exactly where they diverged", spp, atUse / atValidation); + } + + /** + * The instrument the {@code GdalMetadata} guard did not have, and the correction to the + * claim above it. + * + *

{@link #gdalMetadataIsAlsoRefusedThroughThePlanarConfigHole} was the only test covering + * {@code GdalMetadata}, and a mutation sweep showed it cannot fail: reverting + * {@code GdalMetadata.java} to its pre-fix version leaves all 27 tests in this class green, + * because the {@code PlanarConfig=3} guard in {@code GeoTiffImage} now refuses that file first. + * The comment in {@code GdalMetadata} said {@code PlanarConfig=3} "was the only route to it". + * It is not. + * + *

{@code SamplesPerPixel} is a {@code SHORT} in the TIFF spec, but {@code TiffDirectory} reads + * whatever type the tag declares, so a {@code LONG} carries any value up to 231. Both + * bounds that involve it are then satisfiable at once on a legal {@code PlanarConfig=1} file: + * {@code blockBytes = blockWidth * blockHeight * samplesPerPixel * 4} stays under + * {@code MAX_BLOCK_BYTES} for a small image, and {@code expectedBlocks} does not multiply + * by {@code samplesPerPixel} at all for {@code CONTIG}. A 2×2 image therefore reaches + * {@code GdalMetadata.parse} carrying any {@code SamplesPerPixel} up to ~16.5 million. + * + *

Measured, frozen input, {@code open()} alone — no pixel decode: + * + * + * + * + * + * + *
350-byte file, {@code SamplesPerPixel = 8,000,000}, {@code PlanarConfig = 1}
{@code GdalMetadata}bytes allocated by {@code open()}
pre-fix (sized by {@code SamplesPerPixel})128,157,520 — two {@code double[8000000]}, a 366,000:1 + * amplification
fixed (sized by the {@code } elements present)157,704
+ * + *

So the fix is load-bearing on its own and not merely defence behind the {@code PlanarConfig} + * check. This test is the A/B, kept as an assertion. + */ + @Test + public void gdalMetadataDoesNotAllocateOnAnAssertedSamplesPerPixel() throws Exception { + com.sun.management.ThreadMXBean sun = allocationMeter(); + long id = Thread.currentThread().getId(); + + // 2x2 so the georeferencing check (which runs first) passes; SamplesPerPixel as a LONG so it + // is not truncated to 16 bits; one scale item, which is what triggers the allocation. + int samplesPerPixel = 8_000_000; + byte[] file = HostileGrids.geoTiff(2, 2, 1, 2) + .longs(277, samplesPerPixel) + .ascii(42112, "2.0" + + "") + .build(); + assertTrue("the crafted file must stay tiny: " + file.length, file.length < 1024); + + long before = sun.getThreadAllocatedBytes(id); + org.locationtech.proj4j.datum.tiff.GeoTiffImage image = + GeoTiffDataset.open(file, "spp_contig").images().get(0); + long cost = sun.getThreadAllocatedBytes(id) - before; + + // The tag really was read at its declared value, so parse really did run with it: without + // this the test would also pass if the file had been refused for some unrelated reason. + assertEquals("the file must actually reach GdalMetadata.parse carrying this value", + samplesPerPixel, image.samplesPerPixel()); + assertTrue("opening a " + file.length + "-byte file must not allocate two double[" + + samplesPerPixel + "]; it allocated " + cost + " bytes", cost < 8L * 1024 * 1024); + } + + /** + * {@code PlanarConfig=3} with {@code SamplesPerPixel = 2}28 — 358 bytes that used to + * ask {@code GdalMetadata} for two {@code double[268435456]}, 4 GB. + * + *

Named for what it actually pins. It was called + * {@code gdalMetadataIsNoLongerSizedBySamplesPerPixel}, and the mutation sweep showed that is not + * what it measures: the {@code PlanarConfig} guard refuses this file before + * {@code GdalMetadata.parse} is reached, so it stays green with {@code GdalMetadata} reverted. It + * is a {@code PlanarConfig} test, and a useful one — the 4 GB allocation really was reachable this + * way. {@link #gdalMetadataDoesNotAllocateOnAnAssertedSamplesPerPixel} is the one that fails when + * {@code GdalMetadata} regresses. + */ + @Test + public void gdalMetadataIsAlsoRefusedThroughThePlanarConfigHole() throws Exception { + byte[] file = HostileGrids.geoTiff(4, 4, 1, 1) + .longs(277, 1 << 28) + .shorts(284, 3) + .ascii(42112, "2.0" + + "") + .build(); + assertTrue("358-byte file, formerly two double[268435456]: " + file.length, + file.length < 1024); + try { + GeoTiffDataset.open(file, "spp").images().get(0); + fail("SamplesPerPixel = 2^28 must be refused"); + } catch (IOException expected) { + // In family. An OutOfMemoryError, which is what this used to be, is an Error and would + // have propagated past this catch and failed the test. + assertNotNull(expected.getMessage()); + } + } + + /** + * Positive control for the metadata change. A legitimate two-band grid with a + * {@code role="scale"} item must still scale, and a sample with no item must still read raw. If + * the shorter arrays had changed semantics, this is where it would show. + */ + @Test + public void scaleAndOffsetStillApplyAfterTheMetadataResize() throws Exception { + // sample 0 carries scale 10 and offset 1; sample 1 carries nothing. + byte[] pixels = new byte[2 * 2 * 2 * 4]; + java.nio.ByteBuffer pb = java.nio.ByteBuffer.wrap(pixels) + .order(java.nio.ByteOrder.LITTLE_ENDIAN); + for (int i = 0; i < 4; i++) { + pb.putFloat(i * 8, 3.0f); // sample 0 + pb.putFloat(i * 8 + 4, 7.0f); // sample 1 + } + byte[] file = HostileGrids.geoTiff(2, 2, 2, 1) + .longs(279, pixels.length) + .ascii(42112, "" + + "10" + + "1" + + "") + .pixels(pixels) + .build(); + float[][] planes = GeoTiffDataset.open(file, "scaled").images().get(0) + .readSamples(new int[]{0, 1}); + assertEquals("sample 0 must be scaled and offset", 31.0f, planes[0][0], 1e-6f); + assertEquals("sample 1 has no item and must read raw", 7.0f, planes[1][0], 1e-6f); + } + + /** + * Positive control. Upstream's own fixtures, unmodified, must still read to the + * value PROJ 9.8.1 produces for them. These are the files + * {@code GeoTiffHorizontalGridTest} pins; repeating one here means a broken guard fails in this + * class too, next to the refusals it would be paired with. + */ + @Test + public void theShippedGeoTiffGridsStillLoadAndShift() throws Exception { + List grids = new ArrayList(); + Grid.mergeGridFile("test_hgrid.tif", grids); + assertEquals(1, grids.size()); + ProjCoordinate c = new ProjCoordinate(Math.toRadians(4.5), Math.toRadians(52.5)); + Grid.shift(grids, false, c); + // GeoTiffHorizontalGridTest pins these against cct at its own tolerance; here they only + // have to show the reader still reads, so a float-storage tolerance is enough. + assertEquals(5.875, Math.toDegrees(c.x), 1e-6); + assertEquals(55.375, Math.toDegrees(c.y), 1e-6); + } + + private void expectTiffRefusal(byte[] file, String... mustMention) { + try { + GeoTiffDataset.open(file, "hostile").images().get(0).readSample(0); + fail("must be refused"); + } catch (IOException e) { + String message = String.valueOf(e.getMessage()); + for (String needle : mustMention) { + assertTrue("the refusal must mention \"" + needle + "\", but said: " + message, + message.contains(needle)); + } + } + } + + // ================================================================= the bounds themselves + + /** + * The anti-vacuity test for the bounds, and the one that caught a real mistake. + * + *

A first draft applied {@link GridExtents#MAX_EXTENT} — 100,000, taken from + * {@code CTABLEV2}'s own axis check — to every count, including one-dimensional ones. The shipped + * {@code proj4j-db.pjdx} string pool holds 97,930 strings. The guard would have + * passed today and refused the project's own database after one EPSG release, and every hostile + * test would still have been green. So the shapes the shipped data actually uses are pinned here, + * against the bounds, by number. + */ + @Test + public void theGuardsAcceptEveryShapeTheShippedDataActuallyUses() throws Exception { + // Grid geometry: the largest shipped grids, well inside MAX_EXTENT. + assertEquals(1201 * 601, GridExtents.checkedCount("conus", 1201, 601, 8L, 160L, + 160L + 1201L * 601L * 8L, "the file")); + assertEquals(393 * 177, GridExtents.checkedCount("ntv1_can.dat", 393, 177, 16L, 192L, + 1113184L, "the file")); + // egm2008-1 is the widest grid PROJ publishes, and it is still under the axis bound. + assertEquals(43200 * 21600, GridExtents.checkedCount("egm2008-1", 43200, 21600, 4L, 0L, + 4L * 43200L * 21600L, "the decoded-grid budget")); + + // One-dimensional counts are NOT grid axes and must not carry the axis bound. + assertEquals(97931, GridExtents.checkedCount("proj4j-db.pjdx string pool", + 97930L + 1, 4L, 8L, 2872150L, "the string-pool section length")); + assertEquals(19103 * 5, GridExtents.checkedCount("the widest shipped table", + 19103L * 5, 4L, 16L, 1L << 20, "the section length")); + + // And the axis bound is really there for two-dimensional extents. + try { + GridExtents.checkedCount("over-wide grid", 100001L, 1L, 4L, 0L, Long.MAX_VALUE, "nothing"); + fail("MAX_EXTENT must bound a grid axis"); + } catch (GridFormatException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("100000")); + } + } + + /** {@code checkedAxis} must accept every quotient a real grid produces and refuse the rest. */ + @Test + public void checkedAxisDiscriminates() throws Exception { + assertEquals("a 393-node NTv1 axis", 393, GridExtents.checkedAxis("t", "x", 392.5)); + assertEquals("the smallest legal axis", 1, GridExtents.checkedAxis("t", "x", 0.5)); + for (double bad : new double[]{Double.NaN, Double.POSITIVE_INFINITY, + Double.NEGATIVE_INFINITY, 0.0, -1.0, 0.49, 1e300}) { + try { + int got = GridExtents.checkedAxis("t", "x", bad); + fail("checkedAxis(" + bad + ") must throw, returned " + got); + } catch (GridFormatException expected) { + assertNotNull(expected.getMessage()); + } + } + } + + // ================================================================= allocation + + /** + * A refusal must happen before the allocation, not instead of surviving it. + * + *

Measured with {@code ThreadMXBean.getThreadAllocatedBytes}. The first block is the meter's + * own positive control: it allocates 32 MB and requires the meter to see at least 16 MB, so a + * meter that is unsupported, disabled or simply always zero fails here rather than certifying + * every case below. + */ + @Test + public void aRefusalCostsNoMemory() throws Exception { + com.sun.management.ThreadMXBean sun = allocationMeter(); + long id = Thread.currentThread().getId(); + + // Each of these used to allocate between 2 GB and 6.4 GB, or die trying. + assertRefusalIsCheap(sun, id, "CTABLE V2 100000^2", + HostileGrids.ctable2(100000, 100000, 0, 0f, 0f), "hostile_alloc_ctable"); + assertRefusalIsCheap(sun, id, "NTv1 denormal increment", + HostileGrids.ntv1(-90, 90, -180, 180, 1e-300, 1e-300, 0, 0, 0), + "hostile_alloc_ntv1"); + + byte[] tiff = HostileGrids + .geoTiff(40000, 40000, 1, HostileGrids.stripsFor(40000, 40000, 4)).build(); + publish("hostile_alloc_tiff.tif", tiff); + long t0 = sun.getThreadAllocatedBytes(id); + try { + GeoTiffDataset.open(tiff, "alloc").images().get(0).readSample(0); + fail("must be refused"); + } catch (IOException expected) { + long cost = sun.getThreadAllocatedBytes(id) - t0; + assertTrue("refusing a 40000x40000 GeoTIFF must not allocate 6.4 GB; it allocated " + + cost + " bytes", cost < 8L * 1024 * 1024); + } + } + + /** + * The allocation meter, with its own positive control: it allocates a known 32 MB and requires + * the meter to report at least 16 MB of it. A meter that is unsupported, disabled, or simply + * always zero fails here rather than certifying every measurement taken with it. + */ + private static com.sun.management.ThreadMXBean allocationMeter() { + java.lang.management.ThreadMXBean bean = java.lang.management.ManagementFactory + .getThreadMXBean(); + org.junit.Assume.assumeTrue("needs com.sun.management.ThreadMXBean", + bean instanceof com.sun.management.ThreadMXBean); + com.sun.management.ThreadMXBean sun = (com.sun.management.ThreadMXBean) bean; + org.junit.Assume.assumeTrue("allocation measurement must be enabled", + sun.isThreadAllocatedMemorySupported() && sun.isThreadAllocatedMemoryEnabled()); + long id = Thread.currentThread().getId(); + long before = sun.getThreadAllocatedBytes(id); + byte[] control = new byte[32 * 1024 * 1024]; + control[control.length - 1] = 1; + long controlCost = sun.getThreadAllocatedBytes(id) - before; + assertTrue("the allocation meter must be able to see 32 MB; it reported " + controlCost, + controlCost > 16L * 1024 * 1024); + return sun; + } + + private void assertRefusalIsCheap(com.sun.management.ThreadMXBean sun, long id, String label, + byte[] bytes, String name) throws IOException { + publish(name, bytes); + long before = sun.getThreadAllocatedBytes(id); + try { + Grid.mergeGridFile(name, new ArrayList()); + fail(label + " must be refused"); + } catch (IOException expected) { + long cost = sun.getThreadAllocatedBytes(id) - before; + assertTrue("refusing " + label + " must be cheap; it allocated " + cost + " bytes", + cost < 8L * 1024 * 1024); + } + } + + // ================================================================= stream coupling + + /** + * {@code CTABLEV2} and {@code NTV1} take a {@code DataInputStream} and get the section length + * from {@code available()}, which is exact for the {@code ByteArrayInputStream} that + * {@code Resources.asDataStream} produces. This pins the coupling by loading the same crafted grid + * from a file on disk through {@code DirectoryResourceResolver}, which is the other production + * path and a different {@code SeekableByteReader}. + */ + @Test + public void aLegitimateGridLoadsThroughEveryProductionPath() throws Exception { + byte[] good = HostileGrids.ctable2(21, 21, (float) Math.toRadians(0.25), 0f); + assertEquals("through the directory resolver", 1, load("path_ctable", good).size()); + + // And through the classpath resolver, using the pack the library ships. + List conus = new ArrayList(); + Grid.mergeGridFile("conus", conus); + assertEquals(1, conus.size()); + assertEquals("ctable2", conus.get(0).getFormat()); + } + + private static void deleteRecursively(Path dir) throws IOException { + if (!Files.exists(dir)) { + return; + } + java.nio.file.DirectoryStream stream = Files.newDirectoryStream(dir); + try { + for (Path p : stream) { + if (Files.isDirectory(p)) { + deleteRecursively(p); + } else { + Files.deleteIfExists(p); + } + } + } finally { + stream.close(); + } + Files.deleteIfExists(dir); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/readers/HostileGrids.java b/core/src/test/java/org/locationtech/proj4j/security/readers/HostileGrids.java new file mode 100644 index 0000000..9e62992 Binary files /dev/null and b/core/src/test/java/org/locationtech/proj4j/security/readers/HostileGrids.java differ diff --git a/core/src/test/java/org/locationtech/proj4j/security/resources/DirectoryResolverOpenTimeCheckTest.java b/core/src/test/java/org/locationtech/proj4j/security/resources/DirectoryResolverOpenTimeCheckTest.java new file mode 100644 index 0000000..9d3dbcd --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/resources/DirectoryResolverOpenTimeCheckTest.java @@ -0,0 +1,216 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.security.resources; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.SeekableByteReader; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * A path validated at resolution time must still be the path that is opened. + * + *

The window

+ * + *

{@code DirectoryResourceResolver.resolve} checks containment three times — {@code ResourceNames} + * on the name, {@code startsWith(root)} after {@code normalize()}, and {@code startsWith(realRoot)} + * after {@code toRealPath()}. All three run at resolution time, and the handle they produce + * outlives them: {@code CachingResourceResolver} memoises it for the life of the JVM, so one + * resolution can back millions of later opens. + * + *

{@code open()} then re-derived the file from {@code candidate} — the pre-{@code toRealPath()} + * spelling — and handed it to {@code new RandomAccessFile}, which walks the name again and follows + * whatever links it finds now. Anyone able to write inside the data directory could + * therefore replace a plain file with a symlink after the checks passed, and every subsequent read + * would follow it. The checks were real; they were just not the thing the open used. + * + *

What is asserted, in both directions

+ * + *
    + *
  1. Accept. A symlink to a file inside the root resolves and opens, and returns that + * file's bytes. This runs first: without it, a resolver that refused every symlink + * would pass everything below while being useless, and the point is that following a link + * inside the root is legitimate and still works.
  2. + *
  3. Refuse a retarget out of the root. The classic escape.
  4. + *
  5. Refuse a retarget to another file inside the root. Containment alone would allow + * this, and it is the more dangerous of the two here: one grid silently becoming a different + * grid is a wrong answer, and this library's thesis is that a wrong answer is worse than an + * error.
  6. + *
  7. The handle is still usable if nothing was swapped, re-checked after the two refusals, + * so the refusals cannot be a handle that simply stopped working.
  8. + *
+ */ +public class DirectoryResolverOpenTimeCheckTest { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + private static final byte[] REAL = "the grid that was resolved".getBytes(UTF8); + private static final byte[] DECOY = "a different grid entirely!".getBytes(UTF8); + + private Path root; + private Path outside; + private Path link; + private DirectoryResourceResolver resolver; + + @Before + public void layOutTheDirectory() throws IOException { + root = Files.createTempDirectory("proj4j-toctou-root"); + outside = Files.createTempDirectory("proj4j-toctou-outside").resolve("secret"); + Files.write(outside, "OUTSIDE THE ROOT".getBytes(UTF8)); + Files.write(root.resolve("real-grid"), REAL); + Files.write(root.resolve("other-grid"), DECOY); + link = root.resolve("link"); + try { + Files.createSymbolicLink(link, root.resolve("real-grid")); + } catch (UnsupportedOperationException e) { + Assume.assumeNoException("this filesystem has no symlinks", e); + } catch (IOException e) { + Assume.assumeNoException("symlink creation is not permitted here", e); + } + resolver = new DirectoryResourceResolver(root); + } + + private void retarget(Path target) throws IOException { + Files.delete(link); + Files.createSymbolicLink(link, target); + } + + private static byte[] readAll(ResourceHandle h) throws IOException { + SeekableByteReader r = h.open(); + try { + byte[] buf = new byte[(int) r.size()]; + int off = 0; + while (off < buf.length) { + int n = r.read(off, buf, off, buf.length - off); + if (n <= 0) { + break; + } + off += n; + } + return buf; + } finally { + r.close(); + } + } + + @Test + public void aSymlinkSwappedBetweenResolveAndOpenIsRefused() throws IOException { + // 1. ACCEPT, first, so everything below is a statement about the swap and not about + // symlinks being refused wholesale. + ResourceHandle handle = resolver.resolve("link"); + assertNotNull("a symlink to a file inside the root must resolve", handle); + assertArrayEquals("and it must read the file it points at", REAL, readAll(handle)); + + // 2. REFUSE: retargeted out of the root after the checks passed. + retarget(outside); + try { + readAll(handle); + fail("a symlink retargeted outside the root must not be followed"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("changed between resolution and open")); + assertTrue("the message must say where it now points: " + expected.getMessage(), + expected.getMessage().contains("outside")); + } + + // 3. REFUSE: retargeted to a different file that is still inside the root. Containment + // alone passes this; identity is what catches it. + retarget(root.resolve("other-grid")); + try { + byte[] got = readAll(handle); + fail("a symlink retargeted to another in-root file must not be followed silently; got " + + new String(got, UTF8)); + } catch (IOException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("changed between resolution and open")); + } + + // 4. And the handle still works when nothing has been swapped, so 2 and 3 are the swap + // being detected rather than the handle having gone stale. + retarget(root.resolve("real-grid")); + assertArrayEquals(REAL, readAll(handle)); + } + + /** + * The resolution-time check is unchanged and still refuses a link that already points out of + * the root. Pinned here because the open-time check must be an addition, not a replacement. + */ + @Test + public void aSymlinkAlreadyPointingOutOfTheRootNeverResolves() throws IOException { + retarget(outside); + assertNull("resolve() must refuse a symlink whose real target is outside the root", + resolver.resolve("link")); + } + + /** + * A plain file replaced by an out-of-root symlink is the same window without the link ever + * having been visible to {@code resolve}, which is the shape an attacker with write access to + * the data directory actually has. + */ + @Test + public void aPlainFileReplacedByASymlinkAfterResolutionIsRefused() throws IOException { + ResourceHandle handle = resolver.resolve("real-grid"); + assertNotNull(handle); + assertArrayEquals(REAL, readAll(handle)); + + Files.delete(root.resolve("real-grid")); + Files.createSymbolicLink(root.resolve("real-grid"), outside); + try { + byte[] got = readAll(handle); + fail("the replaced file must not be read through; got " + new String(got, UTF8)); + } catch (IOException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("changed between resolution and open")); + } + } + + /** + * The ordinary case, with no symlink anywhere: resolve and open repeatedly, because the handle + * is memoised and reused and the open-time check must not break that. + */ + @Test + public void anUnchangedPlainFileOpensAsManyTimesAsItIsAsked() throws IOException { + ResourceHandle handle = resolver.resolve("other-grid"); + assertNotNull(handle); + for (int i = 0; i < 25; i++) { + assertArrayEquals("open " + i, DECOY, readAll(handle)); + } + } + + /** A root that is itself reached through a symlink must still work; {@code /var} on macOS is. */ + @Test + public void aRootReachedThroughASymlinkStillResolves() throws IOException { + Path alias = Files.createTempDirectory("proj4j-toctou-alias").resolve("alias"); + Files.createSymbolicLink(alias, root); + DirectoryResourceResolver viaAlias = new DirectoryResourceResolver(Paths.get(alias.toString())); + ResourceHandle handle = viaAlias.resolve("real-grid"); + assertNotNull("a symlinked root is legitimate and must resolve", handle); + assertArrayEquals(REAL, readAll(handle)); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/resources/GridTokenAndLookupBoundTest.java b/core/src/test/java/org/locationtech/proj4j/security/resources/GridTokenAndLookupBoundTest.java new file mode 100644 index 0000000..ba5ae8f --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/resources/GridTokenAndLookupBoundTest.java @@ -0,0 +1,179 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.security.resources; + +import java.io.IOException; +import java.util.List; + +import org.junit.After; +import org.junit.Test; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.datum.Grid; +import org.locationtech.proj4j.datum.GridCache; +import org.locationtech.proj4j.datum.VerticalGrid; +import org.locationtech.proj4j.resource.ResourceResolvers; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code +nadgrids=} and {@code +geoidgrids=} are lists of untrusted names, and every element of one + * is a full pass down the resolver chain. + * + *

What was unbounded

+ * + *

{@code fromNadGrids} split on {@code ','} and looped, with no cap on how many tokens it would + * loop over. A CRS string is per-row user input in this library's threat model, so N tokens bought N + * chain traversals per CRS construction — an arbitrary multiplier chosen by the caller. + * + *

Where the number 32 comes from

+ * + *

Measured, not guessed. Over PROJ 9.8.1 at the tag ({@code git grep} across {@code src/}, + * {@code data/} and {@code test/}) the distribution of comma counts in + * {@code (nadgrids|geoidgrids|grids|xy_grids|z_grids)=} is 519×1, 18×2, 1×3, + * 5×4, 1×6 — maximum 6. Over this repository's sources it is 355×1, + * 22×2, 1×3, 6×4, 1×5, 4×6 — the same maximum 6, the 6 being + * {@code g2012a_conus.gtx} through {@code g2012a_samoa.gtx} and the longest {@code +nadgrids=} being + * the 4-token NAD27 list. The cap is therefore above five times anything real, which is why + * {@link #theLongestRealListsAreWellUnderTheCap()} asserts both of those lists still work. + */ +public class GridTokenAndLookupBoundTest { + + @After + public void reset() { + ResourceResolvers.clearResolvers(); + GridCache.instance().clear(); + GridCache.vertical().clear(); + } + + private static String tokens(int n, String prefix) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < n; i++) { + if (i > 0) { + sb.append(','); + } + // @-optional, so every one of them is silently skipped when absent and the ONLY thing + // that can fail the call is the cap itself. + sb.append('@').append(prefix).append(i); + } + return sb.toString(); + } + + @Test + public void aListLongerThanTheCapIsRefused() { + try { + Grid.fromNadGrids(tokens(Grid.MAX_GRID_TOKENS + 1, "absent")); + fail("a " + (Grid.MAX_GRID_TOKENS + 1) + "-token +nadgrids= must be refused"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("+nadgrids=")); + assertTrue("the message must state the limit: " + expected.getMessage(), + expected.getMessage().contains(String.valueOf(Grid.MAX_GRID_TOKENS))); + } + } + + /** + * The boundary, from below. Without this the cap could be off by one in the safe direction and + * nothing would notice, or it could be refusing everything and the test above would still pass. + */ + @Test + public void aListExactlyAtTheCapIsAccepted() throws IOException { + List grids = Grid.fromNadGrids(tokens(Grid.MAX_GRID_TOKENS, "absent")); + assertNotNull(grids); + assertEquals("every token is @-optional and absent, so the list is empty but the call " + + "must not have thrown", 0, grids.size()); + } + + @Test + public void theVerticalListHasTheSameCap() throws IOException { + assertEquals("a +geoidgrids= list at the cap must be accepted", 0, + VerticalGrid.fromGeoidGrids(tokens(Grid.MAX_GRID_TOKENS, "@absentv")).size()); + try { + VerticalGrid.fromGeoidGrids(tokens(Grid.MAX_GRID_TOKENS + 1, "absentv")); + fail("a +geoidgrids= list over the cap must be refused"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("+geoidgrids=")); + } + } + + /** The introspection entry point takes the same limit; it just cannot throw {@code IOException}. */ + @Test + public void describeNadGridsHasTheSameCap() { + assertEquals(Grid.MAX_GRID_TOKENS, + Grid.describeNadGrids(tokens(Grid.MAX_GRID_TOKENS, "absent")).size()); + try { + Grid.describeNadGrids(tokens(Grid.MAX_GRID_TOKENS + 1, "absent")); + fail("describeNadGrids must refuse the same list fromNadGrids refuses"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains(String.valueOf(Grid.MAX_GRID_TOKENS))); + } + } + + /** + * The accept side, on real data: the two longest lists that exist anywhere in PROJ 9.8.1 or in + * this repository. If the cap were ever tightened to where it bites, this is what fails. + */ + @Test + public void theLongestRealListsAreWellUnderTheCap() throws IOException { + // The NAD27 list, 4 tokens, the longest +nadgrids= upstream ships. conus and ntv1_can.dat + // are present in the test classpath; alaska and ntv2_0.gsb are not, and are @-optional. + List nad27 = Grid.fromNadGrids("@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat"); + assertTrue("the NAD27 list must still resolve at least conus", nad27.size() >= 1); + assertEquals("conus", nad27.get(0).getGridName()); + + // The 6-token geoid list, the longest of either kind anywhere. All six are absent here, so + // what this pins is that six tokens are not refused for being six. + assertEquals(0, VerticalGrid.fromGeoidGrids("@g2012a_conus.gtx,@g2012a_alaska.gtx," + + "@g2012a_guam.gtx,@g2012a_hawaii.gtx,@g2012a_puertorico.gtx,@g2012a_samoa.gtx") + .size()); + + // And a real vertical grid that IS present, so the vertical path is proven to still load. + assertNotNull(VerticalGrid.fromGeoidGrids("egm96_15_downsampled.gtx").get(0)); + } + + /** + * A flood of distinct absent names must not accumulate without bound in the resolution memo. + * + *

{@code CachingResourceResolver} memoised every lookup, positive and negative, in one + * unbounded map. The negative half is the attacker-sized one — the names come from + * {@code +nadgrids=} tokens — so a per-row job feeding fresh names retained one map entry and + * one string per name for the life of the JVM. + * + *

This asserts on the observable proxy: after a flood far larger than the cap, a legitimate + * grid still resolves and still gives the same answer. The bound itself is asserted directly in + * {@code org.locationtech.proj4j.resource.NegativeLookupCacheTest}, which can see the counters. + */ + @Test + public void aFloodOfAbsentNamesLeavesLegitimateResolutionIntact() throws IOException { + List before = Grid.fromNadGrids("conus"); + assertEquals(1, before.size()); + + for (int i = 0; i < 5000; i++) { + List skipped = Grid.fromNadGrids("@flood-" + i + "-not-a-grid"); + assertEquals(0, skipped.size()); + } + + GridCache.instance().clear(); + List after = Grid.fromNadGrids("conus"); + assertEquals(1, after.size()); + assertEquals("conus", after.get(0).getGridName()); + assertEquals("ctable2", after.get(0).getFormat()); + assertEquals("the flood must not have changed what conus is", before.get(0).sizeBytes(), + after.get(0).sizeBytes()); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/resources/InitAuthorityGuardTest.java b/core/src/test/java/org/locationtech/proj4j/security/resources/InitAuthorityGuardTest.java new file mode 100644 index 0000000..1b1e3cc --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/resources/InitAuthorityGuardTest.java @@ -0,0 +1,172 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.security.resources; + +import java.io.IOException; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.io.Proj4FileReader; +import org.locationtech.proj4j.resource.ResourceNames; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code +init=:} builds a classpath resource name out of untrusted input, and was + * the one path into the resource layer with no validation on it at all. + * + *

The asymmetry this closes

+ * + *

Every grid path is guarded: {@code Grid.resolveAndLoad} applies {@link ResourceNames} before the + * chain, and both resolvers apply it again. The init path did + * {@code "proj4/nad/" + authority.toLowerCase(Locale.ROOT)} and handed the result to + * {@code ClassLoader.getResourceAsStream}, so {@code +init=../../foo:bar} arrived as + * {@code "proj4/nad/../../foo"} unexamined. Whether a particular classloader collapses that is a + * property of the deployment; the point of the resource layer is that it should not have to be. + * + *

Both directions, because a guard that refuses everything is worse than none

+ * + *

The dictionary authorities that must keep working are enumerated by name and asserted to + * resolve a real CRS — {@code epsg}, {@code esri}, {@code world}, {@code nad83}, {@code nad27} — in + * every case spelling of each, because the authority is lowercased with {@code Locale.ROOT} before + * the rule sees it and a guard applied to the wrong string would fail on {@code EPSG} and pass on + * {@code epsg}. + */ +public class InitAuthorityGuardTest { + + private final CRSFactory factory = new CRSFactory(); + private final Proj4FileReader reader = new Proj4FileReader(); + + /** The name from the brief, plus every other shape the rule is meant to catch. */ + @Test + public void aTraversingAuthorityIsRefusedByRuleAndByName() { + String[][] hostile = { + {"../../foo", "DOT_SEGMENT"}, + {"..", "DOT_SEGMENT"}, + {".", "DOT_SEGMENT"}, + {"tests/../../etc/passwd", "DOT_SEGMENT"}, + {"/etc/passwd", "ABSOLUTE"}, + {"\\windows\\win.ini", "ABSOLUTE"}, + {"a\\b", "BACKSLASH"}, + {"epsg ", "WHITESPACE"}, + {"ep sg", "WHITESPACE"}, + {"%2e%2e%2fepsg", "PERCENT"}, + {"C:/windows/win.ini", "COLON"}, + {"a//b", "EMPTY_SEGMENT"}, + {"epsg/", "EMPTY_SEGMENT"}, + {"", "EMPTY"}, + }; + for (String[] each : hostile) { + String authority = each[0]; + String expectedRule = each[1]; + + // The rule really is broken by this name -- otherwise the loop asserts nothing. + ResourceNames.Rule rule = ResourceNames.violation(authority.toLowerCase(java.util.Locale.ROOT)); + assertNotNull("'" + authority + "' must break the rule for this case to be evidence", + rule); + assertEquals("'" + authority + "'", expectedRule, rule.toString()); + + try { + reader.readParametersFromFile(authority, "4326"); + fail("+init=" + authority + ":4326 must be refused"); + } catch (IllegalStateException expected) { + assertTrue("the refusal must name the authority: " + expected.getMessage(), + expected.getMessage().contains("Refusing +init= authority")); + assertTrue("the refusal must name the clause that fired (" + expectedRule + "): " + + expected.getMessage(), expected.getMessage().contains(expectedRule)); + } catch (IOException e) { + fail("+init=" + authority + ":4326 must be refused by name, not by I/O: " + e); + } + } + } + + /** {@code CRSFactory.createFromName} is the public door onto the same code. */ + @Test + public void theSameNameIsRefusedThroughTheFactory() { + try { + factory.createFromName("../../foo:bar"); + fail("createFromName(\"../../foo:bar\") must not reach the classloader"); + } catch (IllegalStateException expected) { + assertTrue(expected.getMessage(), + expected.getMessage().contains("Refusing +init= authority")); + } + } + + /** + * The accept side. Every authority the shipped dictionaries actually use, in three spellings + * each, must still resolve a real CRS. + */ + @Test + public void everyShippedAuthorityStillResolves() throws IOException { + // Codes read out of the shipped files, not guessed: the first entry of each + // epsg/src/main/resources/proj4/nad/. epsg has 5,755 entries, esri 2,954, + // world 47, nad83 123 and nad27 134. + String[][] cases = { + {"epsg", "4326"}, + {"EPSG", "4326"}, + {"EpSg", "4326"}, + {"esri", "2000"}, + {"ESRI", "2000"}, + {"world", "CH1903"}, + {"WORLD", "CH1903"}, + {"nad83", "101"}, + {"NAD83", "101"}, + {"nad27", "101"}, + {"NAD27", "101"}, + }; + for (String[] each : cases) { + String[] params = reader.readParametersFromFile(each[0], each[1]); + assertNotNull("+init=" + each[0] + ":" + each[1] + " must still resolve", params); + assertTrue("+init=" + each[0] + ":" + each[1] + " resolved to an empty definition", + params.length > 0); + } + } + + /** And end to end, through the factory, so the guard is proven not to break CRS construction. */ + @Test + public void aLegitimateCrsStillBuilds() { + CoordinateReferenceSystem crs = factory.createFromName("EPSG:4326"); + assertNotNull(crs); + assertNotNull(crs.getProjection()); + CoordinateReferenceSystem esri = factory.createFromName("ESRI:37001"); + assertNotNull(esri); + } + + /** + * An authority that is a legal name and simply is not installed must still fail the way + * it always did — "unable to access", not "refusing". Without this the hostile list above could + * be passing because nothing resolves. + */ + @Test + public void alegalButAbsentAuthorityFailsForTheOtherReason() throws IOException { + assertNotNull("this name must be legal, or the case proves nothing", + ResourceNames.violation("no-such-authority") == null ? "legal" : null); + try { + reader.readParametersFromFile("no-such-authority", "4326"); + fail("there is no such init file"); + } catch (IllegalStateException expected) { + assertTrue("a legal-but-absent authority must NOT be reported as a rule violation: " + + expected.getMessage(), + expected.getMessage().contains("Unable to access CRS file")); + assertTrue(expected.getMessage(), + !expected.getMessage().contains("Refusing +init= authority")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/security/resources/ResourceReadBoundTest.java b/core/src/test/java/org/locationtech/proj4j/security/resources/ResourceReadBoundTest.java new file mode 100644 index 0000000..9b331e3 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/security/resources/ResourceReadBoundTest.java @@ -0,0 +1,366 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.security.resources; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.Assume; +import org.junit.Test; +import org.locationtech.proj4j.resource.ClasspathResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.Resources; +import org.locationtech.proj4j.resource.SeekableByteReader; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * The size cap must run before the allocation it exists to prevent. + * + *

The defect

+ * + *

{@code Resources.readAll(handle, maxBytes)} opened the handle first and consulted + * {@code reader.size()} afterwards. {@link ClasspathResourceResolver}'s {@code open()} slurps the + * whole classpath entry into a {@code ByteArrayOutputStream} — a classpath resource is not seekable, + * so there is nothing else it can do — which means the entry was already on the heap by the + * time the 128 MiB grid limit was consulted. The limit reported the size of an allocation it had + * failed to prevent. {@code DirectoryResourceResolver} was never affected: its {@code open()} hands + * back a {@code RandomAccessFile} wrapper and reads nothing. + * + *

Why these tests assert on bytes allocated, not only on the exception

+ * + *

An exception-only assertion passes both before and after the fix — the old code threw too, just + * after paying for the read. Every test here therefore measures + * {@code ThreadMXBean.getThreadAllocatedBytes} across the refusal, or counts stream opens, and every + * one of them is paired with a control leg run in the same JVM against the same + * generator that shows the instrument registering the thing whose absence is being claimed: + * + *

    + *
  • {@link #anOversizedEntryIsAbandonedRatherThanReadAndRejected()} first reads the same 16 MiB + * generator with a budget that admits it and requires the meter to see ≥ 16 MiB. A meter + * that always read zero would fail that leg.
  • + *
  • {@link #aDeclaredOversizeIsRefusedWithoutOpeningTheStream()} requires a second, legitimate + * handle to drive the same open-counter to 1. A counter wired to nothing would fail that + * leg.
  • + *
  • {@link #shortAndLongEntriesAreReadAtTheirTrueLength()} pins the two paths where the + * rewritten reader could silently truncate or over-read legitimate data, because a + * guard that refuses everything passes every hostile test in this file.
  • + *
+ * + *

The generator

+ * + *

A real classpath entry cannot be made to lie about its length, so these tests drive the + * resolver through a {@link ClassLoader} that returns a {@code URL} with a private + * {@link URLStreamHandler}: the declared {@code Content-Length} and the number of bytes the stream + * actually produces are set independently. That is the only way to exercise the two cases that + * matter — an unknown length, and a length that lies — and it keeps the subject under test the real + * {@link ClasspathResourceResolver} rather than a mock of it. The URL's protocol is {@code file} + * because the resolver refuses any protocol outside its local allow-list. + */ +public class ResourceReadBoundTest { + + private static final long KIB = 1024L; + private static final long MIB = 1024L * KIB; + + // --- the generator ---------------------------------------------------------------------- + + /** Produces {@code length} bytes of a fixed pattern, allocating none of them up front. */ + private static final class PatternStream extends InputStream { + private long remaining; + private long position; + + PatternStream(long length) { + this.remaining = length; + } + + @Override + public int read() { + if (remaining <= 0) { + return -1; + } + remaining--; + return (int) ((position++) & 0xff); + } + + @Override + public int read(byte[] b, int off, int len) { + if (remaining <= 0) { + return -1; + } + int n = (int) Math.min(len, remaining); + for (int i = 0; i < n; i++) { + b[off + i] = (byte) ((position + i) & 0xff); + } + position += n; + remaining -= n; + return n; + } + } + + /** A URL whose declared length and real length are chosen independently. */ + private static final class Generator extends URLStreamHandler { + private final long declared; + private final long length; + final AtomicInteger opens = new AtomicInteger(); + + Generator(long declared, long length) { + this.declared = declared; + this.length = length; + } + + @Override + protected URLConnection openConnection(URL u) { + return new URLConnection(u) { + @Override + public void connect() { + } + + @Override + public long getContentLengthLong() { + return declared; + } + + @Override + public InputStream getInputStream() { + opens.incrementAndGet(); + return new PatternStream(length); + } + }; + } + } + + /** A classloader exposing exactly one resource, backed by a {@link Generator}. */ + private static final class OneResourceLoader extends ClassLoader { + private final String path; + private final URL url; + + OneResourceLoader(String path, Generator handler) throws IOException { + super(null); + this.path = path; + this.url = new URL("file", "", -1, "/proj4j-generated/" + path, handler); + } + + @Override + public URL getResource(String name) { + return path.equals(name) ? url : null; + } + } + + private static ResourceHandle handle(Generator g, String name) throws IOException { + ClasspathResourceResolver resolver = + new ClasspathResourceResolver(new OneResourceLoader("gen/" + name, g), "gen"); + ResourceHandle h = resolver.resolve(name); + assertNotNull("the generated resource must resolve, or the test is measuring nothing", h); + return h; + } + + // --- the meter -------------------------------------------------------------------------- + + private static com.sun.management.ThreadMXBean allocationMeter() { + ThreadMXBean bean = ManagementFactory.getThreadMXBean(); + Assume.assumeTrue("needs com.sun.management.ThreadMXBean", + bean instanceof com.sun.management.ThreadMXBean); + com.sun.management.ThreadMXBean sun = (com.sun.management.ThreadMXBean) bean; + Assume.assumeTrue("needs thread allocation counters", sun.isThreadAllocatedMemorySupported()); + sun.setThreadAllocatedMemoryEnabled(true); + return sun; + } + + private static long allocated() { + return allocationMeter().getThreadAllocatedBytes(Thread.currentThread().getId()); + } + + // --- the tests -------------------------------------------------------------------------- + + /** + * The headline case: an entry that does not declare its length, is far larger than the budget, + * and must be abandoned mid-read. + * + *

The control leg runs first and deliberately succeeds, so the numbers below are a comparison + * between two measurements of the same generator in the same JVM rather than a bare threshold. + */ + @Test + public void anOversizedEntryIsAbandonedRatherThanReadAndRejected() throws IOException { + allocationMeter(); + final long content = 16 * MIB; + + // CONTROL. Same generator, a budget that admits it. If this leg does not register at least + // the content size, the meter cannot see the allocation whose absence the subject claims. + Generator big = new Generator(-1L, content); + long beforeControl = allocated(); + byte[] all = Resources.readAll(handle(big, "unbounded"), 64 * MIB); + long controlCost = allocated() - beforeControl; + assertEquals("the generator must really produce " + content + " bytes", content, all.length); + assertTrue("CONTROL FAILED: reading " + content + " bytes registered only " + controlCost + + " -- the meter cannot see what the subject claims is absent", + controlCost >= content); + + // SUBJECT. Identical generator, budget of 256 KiB. The read must stop at the budget. + Generator same = new Generator(-1L, content); + long beforeSubject = allocated(); + try { + Resources.readAll(handle(same, "bounded"), 256 * KIB); + fail("a " + content + " byte entry must not be readable under a 256 KiB budget"); + } catch (IOException expected) { + assertTrue("the message must say the read was abandoned, not that it was measured: " + + expected.getMessage(), expected.getMessage().contains("exceeds")); + } + long subjectCost = allocated() - beforeSubject; + + assertTrue("the refusal allocated " + subjectCost + " bytes for a 256 KiB budget; the cap " + + "ran after the allocation it exists to prevent", + subjectCost < 4 * MIB); + assertTrue("the refusal must cost far less than the acceptance (" + subjectCost + " vs " + + controlCost + ")", + subjectCost * 4 < controlCost); + } + + /** + * When the resolver already knows the length, nothing should be opened at all — the check moves + * ahead of {@code handle.open()}, not merely ahead of the copy. + */ + @Test + public void aDeclaredOversizeIsRefusedWithoutOpeningTheStream() throws IOException { + Generator oversize = new Generator(64 * MIB, 64 * MIB); + ResourceHandle h = handle(oversize, "declared-big"); + assertEquals("the handle must report the declared length", 64 * MIB, h.sizeBytes()); + + try { + Resources.readAll(h, 1 * MIB); + fail("a resource declaring 64 MiB must not be read under a 1 MiB budget"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("exceeds")); + } + assertEquals("the stream must never have been opened", 0, oversize.opens.get()); + + // CONTROL: the counter is wired to something. A legitimate read drives it to 1. + Generator small = new Generator(4096L, 4096L); + byte[] bytes = Resources.readAll(handle(small, "declared-small"), 1 * MIB); + assertEquals(4096, bytes.length); + assertEquals("CONTROL FAILED: the open counter never increments, so 0 above proves nothing", + 1, small.opens.get()); + } + + /** + * A declared length is a claim. A jar central directory can say 1 KiB and then hand over 16 MiB, + * and the pre-check would wave it through, so the streaming path must stop on its own. + */ + @Test + public void aLyingDeclaredLengthCannotDefeatTheBound() throws IOException { + allocationMeter(); + Generator liar = new Generator(1024L, 16 * MIB); + ResourceHandle h = handle(liar, "liar"); + assertEquals("the pre-check will see the lie, which is the point", 1024L, h.sizeBytes()); + + long before = allocated(); + try { + Resources.readAll(h, 256 * KIB); + fail("the real content is 16 MiB and the budget is 256 KiB"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("exceeds")); + } + long cost = allocated() - before; + assertTrue("a lying length must not buy an unbounded read; allocated " + cost, + cost < 4 * MIB); + } + + /** + * The accept side, and the two places the rewritten reader could corrupt legitimate data. + * + *

A guard that refuses everything passes every hostile test above. These pin that an entry + * shorter than it declared comes back at its real length rather than zero-padded to the + * declared one, and that an entry longer than it declared comes back whole rather than + * truncated at the declared length. Both are silent-wrong-answer shapes, not error shapes. + */ + @Test + public void shortAndLongEntriesAreReadAtTheirTrueLength() throws IOException { + byte[] shortEntry = Resources.readAll(handle(new Generator(4096L, 100L), "short"), 1 * MIB); + assertEquals("an entry shorter than declared must not be zero-padded", 100, + shortEntry.length); + assertPattern(shortEntry); + + byte[] longEntry = Resources.readAll(handle(new Generator(100L, 4096L), "long"), 1 * MIB); + assertEquals("an entry longer than declared must not be truncated to the declaration", 4096, + longEntry.length); + assertPattern(longEntry); + + byte[] exact = Resources.readAll(handle(new Generator(4096L, 4096L), "exact"), 1 * MIB); + assertEquals(4096, exact.length); + assertPattern(exact); + + byte[] unknown = Resources.readAll(handle(new Generator(-1L, 4096L), "unknown"), 1 * MIB); + assertEquals("an entry that declines to declare a length must still be read whole", 4096, + unknown.length); + assertPattern(unknown); + + byte[] empty = Resources.readAll(handle(new Generator(0L, 0L), "empty"), 1 * MIB); + assertEquals(0, empty.length); + } + + /** + * {@code open()} is reachable without going through {@code Resources.readAll} — the {@code .pjdx} + * database streams a classpath entry directly — and had no ceiling of any kind. It has one now. + */ + @Test + public void openHasAHardCeilingOfItsOwn() throws IOException { + String property = "proj4j.resources.maxClasspathEntryBytes"; + String saved = System.getProperty(property); + try { + System.setProperty(property, Long.toString(64 * KIB)); + ResourceHandle h = handle(new Generator(-1L, 4 * MIB), "direct-open"); + try { + SeekableByteReader r = h.open(); + r.close(); + fail("open() must honour the hard classpath-entry ceiling"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("exceeds")); + } + + // CONTROL: raise the ceiling and the very same read succeeds, so the refusal above is + // the ceiling firing rather than the generator or the resolver being broken. + System.setProperty(property, Long.toString(16 * MIB)); + ResourceHandle ok = handle(new Generator(-1L, 4 * MIB), "direct-open"); + SeekableByteReader r = ok.open(); + try { + assertEquals(4 * MIB, r.size()); + } finally { + r.close(); + } + } finally { + if (saved == null) { + System.clearProperty(property); + } else { + System.setProperty(property, saved); + } + } + } + + private static void assertPattern(byte[] bytes) { + for (int i = 0; i < bytes.length; i++) { + assertEquals("byte " + i + " of " + bytes.length + " came back wrong, so the reader is " + + "not returning the stream it was given", (byte) (i & 0xff), bytes[i]); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/serialization/SerialVersionUidTest.java b/core/src/test/java/org/locationtech/proj4j/serialization/SerialVersionUidTest.java new file mode 100644 index 0000000..41366cf --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/serialization/SerialVersionUidTest.java @@ -0,0 +1,593 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.serialization; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.NotSerializableException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Registry; +import org.locationtech.proj4j.datum.AxisOrder; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.Projection; + +/** + * Every serialisable class in {@code core} must declare an explicit {@code serialVersionUID}. + * + *

The defect this exists to prevent

+ * + *

proj4j runs per row inside Spark executors, and Spark ships a serialised + * {@link CoordinateTransform} — which transitively drags in a {@link CoordinateReferenceSystem}, + * a {@link Projection}, an {@link Ellipsoid}, a {@code Datum} and an {@link AxisOrder}. When a + * class does not declare a {@code serialVersionUID}, the JVM synthesises one from the class's + * name, modifiers, interfaces, fields, constructors and non-private methods. Any change to + * that surface — adding a method, widening a field, reordering an interface list — silently + * changes the value, and the driver's stream then fails on the executor with + * {@link java.io.InvalidClassException}: {@code local class incompatible}. The failure appears + * only when driver and executor jars differ, i.e. in production, during a rolling upgrade. + * + *

Before this test, exactly one of core's 205 serialisable classes declared one + * ({@code ExtendedTransverseMercatorProjection}, and it declared the invented value {@code 1L}). + * + *

Where the values came from

+ * + *

The 188 added values are not invented. Each is what the JDK's {@code serialver} tool + * computed for that exact class immediately before the field was added, so that a stream written + * by the previous build still loads. That was verified two ways: {@code serialver}'s output was + * compared field-by-field against {@link ObjectStreamClass#lookupAny} on the pre-change class + * files (188/188 equal, 188 distinct values, so the comparison is not degenerate), and a corpus + * of 175 objects serialised by the pre-change build was read back by the post-change build with + * zero {@code InvalidClassException}. Deliberately corrupting one leaf class's UID broke 4 of + * those objects and corrupting {@link Projection}'s broke 148, so that round trip discriminates. + * + *

What this test does NOT promise

+ * + *

A pinned UID says "the serialised forms are compatible". From here on that is a claim the + * author must keep true: adding or removing a non-transient field now changes the + * serialised layout without changing the UID, which trades a loud + * {@code InvalidClassException} for a quiet wrong-value read. The UID is a promise, not a check. + * + *

And a UID does not make a class serialisable at all. Eleven registered projections still + * throw {@link NotSerializableException} for unrelated reasons; they are pinned and enumerated + * by {@link #projectionsThatCannotBeSerialisedAtAllArePinned()} so the exposure cannot drift in + * either direction unnoticed. + * + *

Why this test can fail

+ * + *

A scan that cannot fail is worthless and its failure mode is silent — it reports exactly + * what you hoped for. The detector here is proven both ways, always on: + * + *

    + *
  • {@link #theScanRejectsAMissingUidAndAcceptsADeclaredOne()} runs the production + * walk and predicate over {@code target/test-classes} and requires it to name + * {@link Violator} — a class deliberately left without a UID — and requires it not + * to name {@link Compliant}, which has one. A guard that refuses everything passes every + * hostile test and breaks the library, so the accepting leg matters as much as the + * rejecting one.
  • + *
  • {@link #everySerializableClassInCoreDeclaresASerialVersionUid()} asserts floors on how + * much the walk reached, and asserts by name that it reached {@link Projection}, + * {@link ProjCoordinate} and {@link AxisOrder}. A walk that silently found nothing would + * otherwise pass trivially.
  • + *
  • {@link #enumsAreExcludedBecauseTheJvmIgnoresADeclaredUid()} and + * {@link #interfacesAreExcludedBecauseTheirDescriptorNeverEntersAStream()} prove the two + * exclusion rules against the running JVM rather than against the specification, so an + * exclusion cannot quietly become a loophole.
  • + *
+ */ +public class SerialVersionUidTest { + + // ------------------------------------------------------------------ control fixtures + // + // These two exist to be *found* by the production scan when it is pointed at the test + // classes. Do not add a UID to Violator and do not remove Compliant's. + + /** Deliberately has no {@code serialVersionUID}; the scan must flag it. */ + static class Violator implements Serializable { + @SuppressWarnings("unused") + private int state; + } + + /** Deliberately has one; the scan must not flag it. */ + static class Compliant implements Serializable { + private static final long serialVersionUID = 20260803L; + @SuppressWarnings("unused") + private int state; + } + + /** A UID on an enum is ignored by the JVM; see {@link #enumsAreExcludedBecauseTheJvmIgnoresADeclaredUid()}. */ + enum EnumWithUid { + A, B; + @SuppressWarnings("unused") + private static final long serialVersionUID = 987654321L; + } + + /** Same shape, no UID. Both must report 0L. */ + enum EnumWithoutUid { A, B } + + // ------------------------------------------------------------------ the production scan + + /** + * The predicate under test: does {@code type} need a declared {@code serialVersionUID}? + * + *

Excludes interfaces and enum-like types, both for reasons proven against the running + * JVM by the two dedicated tests below rather than asserted from the specification. + */ + private static boolean requiresDeclaredUid(Class type) { + if (!Serializable.class.isAssignableFrom(type)) { + return false; + } + if (type.isInterface()) { + return false; + } + Class parent = type.getSuperclass(); + return !type.isEnum() && (parent == null || !parent.isEnum()); + } + + /** Does {@code type} itself declare a {@code static final long serialVersionUID}? */ + private static boolean declaresUid(Class type) { + try { + Field field = type.getDeclaredField("serialVersionUID"); + return Modifier.isStatic(field.getModifiers()) + && Modifier.isFinal(field.getModifiers()) + && field.getType() == long.class; + } catch (NoSuchFieldException absent) { + return false; + } + } + + /** Result of one walk: what was reached, and what was found wanting. */ + private static final class ScanResult { + final List scanned = new ArrayList(); + final List requiring = new ArrayList(); + final List missing = new ArrayList(); + final List excludedEnumLike = new ArrayList(); + final List excludedInterfaces = new ArrayList(); + } + + /** + * Walks {@code root} for {@code .class} files, loads each, and classifies it. Loading is what + * makes the scan see inherited {@code Serializable}: 188 of the 205 classes never write the + * word {@code Serializable} in their own source, so a text scan of {@code core/src/main} + * would find 12 and report a confident, false, clean result. + */ + private static ScanResult scan(File root, String packagePrefix) { + List files = new ArrayList(); + collectClassFiles(root, files); + ScanResult result = new ScanResult(); + String rootPath = root.getAbsolutePath(); + for (File file : files) { + String relative = file.getAbsolutePath().substring(rootPath.length() + 1); + String name = relative.substring(0, relative.length() - ".class".length()) + .replace(File.separatorChar, '.'); + if (!name.startsWith(packagePrefix)) { + continue; + } + Class type; + try { + type = Class.forName(name, false, SerialVersionUidTest.class.getClassLoader()); + } catch (Throwable notLoadable) { + throw new AssertionError("the scan could not load " + name + + "; a class it cannot load is a class it cannot check", notLoadable); + } + result.scanned.add(name); + if (!Serializable.class.isAssignableFrom(type)) { + continue; + } + if (type.isInterface()) { + result.excludedInterfaces.add(name); + continue; + } + if (!requiresDeclaredUid(type)) { + result.excludedEnumLike.add(name); + continue; + } + result.requiring.add(name); + if (!declaresUid(type)) { + result.missing.add(name); + } + } + return result; + } + + // ------------------------------------------------------------------ the assertion + + @Test + public void everySerializableClassInCoreDeclaresASerialVersionUid() { + ScanResult result = scan(coreClassesDirectory(), "org.locationtech.proj4j."); + + if (!result.missing.isEmpty()) { + StringBuilder message = new StringBuilder(result.missing.size() + + " serialisable class(es) in core/src/main declare no serialVersionUID.\n" + + "Generate each value with: serialver -classpath core/target/classes \n" + + "against the class as it stands BEFORE adding the field, so streams already" + + " written stay readable. Do not invent a value.\n"); + for (String name : result.missing) { + message.append(" ").append(name).append('\n'); + } + fail(message.toString()); + } + + // Non-vacuity: a walk that reached nothing would satisfy the assertion above. + assertTrue("the walk reached only " + result.scanned.size() + " classes; it has stopped" + + " seeing core", result.scanned.size() >= 400); + assertTrue("only " + result.requiring.size() + " classes were classified as needing a UID;" + + " the classifier has stopped matching", result.requiring.size() >= 200); + assertTrue("no enum-like type was excluded; the exclusion branch is unreached", + result.excludedEnumLike.size() >= 20); + + // Non-vacuity by name, so a walk that reached some unrelated corner still fails. + for (String required : new String[] { + Projection.class.getName(), + ProjCoordinate.class.getName(), + AxisOrder.class.getName(), + Ellipsoid.class.getName(), + CoordinateReferenceSystem.class.getName(), + "org.locationtech.proj4j.datum.PrimeMeridian", + "org.locationtech.proj4j.datum.GeocentricConverter", + "org.locationtech.proj4j.util.PolarCoordinate", + "org.locationtech.proj4j.util.IntPolarCoordinate", + "org.locationtech.proj4j.util.FloatPolarCoordinate", + "org.locationtech.proj4j.proj.MercatorProjection" }) { + assertTrue("the walk never reached " + required, result.requiring.contains(required)); + } + assertTrue("the interface exclusion is unreached", + result.excludedInterfaces.contains(CoordinateTransform.class.getName())); + assertTrue("the enum exclusion is unreached", + result.excludedEnumLike.contains(ErrorCause.class.getName())); + } + + /** + * Positive control, always on. Runs the same walk and the same predicate over the + * compiled test classes, where {@link Violator} has been left without a UID on purpose and + * {@link Compliant} has one. The scan must reject the first and accept the second: a guard + * that flags everything would pass a rejection-only control while making the build + * unbuildable. + */ + @Test + public void theScanRejectsAMissingUidAndAcceptsADeclaredOne() { + ScanResult result = scan(testClassesDirectory(), SerialVersionUidTest.class.getPackage().getName()); + + assertTrue("the control scan reached nothing", result.scanned.size() >= 3); + assertTrue("the scan did NOT flag " + Violator.class.getName() + + ", which has no serialVersionUID -- the detector is blind, so the clean result" + + " on core/target/classes means nothing. Flagged: " + result.missing, + result.missing.contains(Violator.class.getName())); + assertTrue("the scan did not even classify " + Compliant.class.getName() + + " as needing a UID", result.requiring.contains(Compliant.class.getName())); + assertFalse("the scan flagged " + Compliant.class.getName() + ", which declares " + + "a serialVersionUID -- the guard rejects legitimate input", + result.missing.contains(Compliant.class.getName())); + } + + /** + * The exclusion of enums, proven against the JVM. The serialization specification fixes an + * enum type's {@code serialVersionUID} at {@code 0L} and enum constants travel by name, so a + * declared value is dead code that reads as a guarantee. Including enums in the sweep would + * have added 31 misleading fields. + */ + @Test + public void enumsAreExcludedBecauseTheJvmIgnoresADeclaredUid() { + assertEquals("an enum WITH a declared UID still reports 0L", 0L, + ObjectStreamClass.lookupAny(EnumWithUid.class).getSerialVersionUID()); + assertEquals("an enum WITHOUT one also reports 0L", 0L, + ObjectStreamClass.lookupAny(EnumWithoutUid.class).getSerialVersionUID()); + // Control: the same call on an ordinary class does NOT report 0L, so the two zeroes above + // are a property of enums and not of the call. + assertNotEquals("lookupAny returns 0L for everything; the comparison above is vacuous", + 0L, ObjectStreamClass.lookupAny(Violator.class).getSerialVersionUID()); + assertFalse(requiresDeclaredUid(EnumWithUid.class)); + assertFalse(requiresDeclaredUid(ErrorCause.class)); + } + + /** + * The exclusion of interfaces, proven against the JVM. Only the concrete class and its + * serialisable superclasses get a descriptor in the stream; implemented interfaces + * never do, so an interface's UID can never be compared against anything. + */ + @Test + public void interfacesAreExcludedBecauseTheirDescriptorNeverEntersAStream() throws Exception { + CoordinateTransform transform = transform("+proj=longlat +datum=WGS84", + "+proj=merc +datum=WGS84"); + Set descriptors = descriptorsWrittenFor(transform); + + // Control first: the scan of the stream must find *something*, or its silence is a bug. + assertTrue("no proj4j descriptor was seen at all: " + descriptors, + descriptors.contains("org.locationtech.proj4j.BasicCoordinateTransform")); + assertTrue("the abstract superclass Projection must appear, since superclasses do", + descriptors.contains(Projection.class.getName())); + assertFalse("an interface appeared in the stream, so the exclusion is unsafe: " + + descriptors, descriptors.contains(CoordinateTransform.class.getName())); + assertFalse(requiresDeclaredUid(CoordinateTransform.class)); + } + + // ------------------------------------------------------------------ AxisOrder identity + + /** + * {@link AxisOrder} is a final value type with a private constructor and one published + * constant, which is the shape that invites {@code ==}. Its {@code readResolve} restores + * {@link AxisOrder#ENU} on the way in. + * + *

Note this was a hazard for callers, not a live bug: core compares with + * {@code AxisOrder.ENU.equals(...)} at {@code BasicCoordinateTransform:324-325} and has no + * {@code == AxisOrder.ENU} site. + */ + @Test + public void axisOrderEnuKeepsItsIdentityAcrossDeserialisation() throws Exception { + assertSame("ENU must come back as the canonical instance", AxisOrder.ENU, + roundTrip(AxisOrder.ENU)); + + // Control: readResolve must not collapse everything onto ENU. A non-ENU order has to come + // back equal-but-distinct, or the fix would silently rewrite +axis=neu into +axis=enu -- + // a wrong answer, which is worse than the identity hazard it replaces. + AxisOrder neu = AxisOrder.fromString("neu"); + assertFalse("fixture is not distinct from ENU", AxisOrder.ENU.equals(neu)); + AxisOrder neuBack = roundTrip(neu); + assertEquals("a non-ENU order lost its value", neu, neuBack); + assertNotSame("a non-ENU order was collapsed onto a shared instance", neu, neuBack); + assertNotSame("a non-ENU order was collapsed onto ENU", AxisOrder.ENU, neuBack); + + // And an ENU-valued instance built the long way round is canonicalised too, which is the + // case that actually reaches an executor: +axis=enu parses to a fresh instance. + AxisOrder parsedEnu = AxisOrder.fromString("enu"); + assertNotSame("fixture is already canonical, so it proves nothing", + AxisOrder.ENU, parsedEnu); + assertSame(AxisOrder.ENU, roundTrip(parsedEnu)); + } + + // ------------------------------------------------------------------ end-to-end + + /** + * The whole point: a {@link CoordinateTransform} that has crossed a serialisation boundary + * must produce the same numbers, bit for bit. This is what a Spark executor holds. + */ + @Test + public void aDeserialisedTransformProducesIdenticalCoordinates() throws Exception { + CoordinateTransform local = transform("+proj=longlat +datum=WGS84", + "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=500000 +ellps=bessel" + + " +towgs84=1,2,3,4,5,6,7"); + CoordinateTransform shipped = roundTrip(local); + assertNotSame(local, shipped); + + // Inside the tmerc domain: the fail-closed easting check rejects points far from the + // central meridian, and a rejected point would compare two exceptions rather than two + // coordinates. + int compared = 0; + for (double lon = -21; lon <= 39.5; lon += 6) { + for (double lat = -70; lat <= 70.5; lat += 14) { + ProjCoordinate here = new ProjCoordinate(); + ProjCoordinate there = new ProjCoordinate(); + local.transform(new ProjCoordinate(lon, lat), here); + shipped.transform(new ProjCoordinate(lon, lat), there); + assertEquals("x differs at " + lon + "," + lat, + Double.doubleToLongBits(here.x), Double.doubleToLongBits(there.x)); + assertEquals("y differs at " + lon + "," + lat, + Double.doubleToLongBits(here.y), Double.doubleToLongBits(there.y)); + compared++; + } + } + // Control: the loop must actually have run, and must not have compared NaN to NaN. + assertEquals(121, compared); + ProjCoordinate sample = new ProjCoordinate(); + shipped.transform(new ProjCoordinate(9.0, 47.0), sample); + assertFalse("the shipped transform returns NaN, so the comparison above is vacuous", + Double.isNaN(sample.x) || Double.isNaN(sample.y)); + } + + /** + * Pinned exposure, both directions. A {@code serialVersionUID} does not make a class + * serialisable; these projections hold a non-transient reference to something that is not + * {@link Serializable}, and throw {@link NotSerializableException} on the way out. That is a + * harder failure than the {@code InvalidClassException} this sweep addresses — it fires on + * the driver, on the first broadcast, every time. + * + *

The count and the names are both pinned. If a projection is fixed, this test fails and + * the entry must be removed; if a new one regresses, it fails and names it. Root causes, all + * outside {@code proj/**} except the last: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Why each fails
non-serialisable typeheld byprojections affected
{@code geodesic.Geodesic}{@code EquidistantAzimuthalProjection.geodesic:79}, + * {@code GnomonicAzimuthalProjection.geodesic:75}2
{@code util.Complex}{@code ModifiedStereographicProjection.zcoeff:117} ({@code Complex[]}) and + * {@code .derivative:123}5
{@code PeirceQuincuncialProjection$1}{@code PeirceQuincuncialProjection.rawForward:139}1
{@code AdamsWorldInASquareIIProjection$1}{@code AdamsWorldInASquareIIProjection.rawForward:77}2
{@code GeocentProjection$Cached}{@code GeocentProjection.cached:153}1, and only after first use — see + * {@link #geocentProjectionBecomesUnserialisableOnlyAfterItHasBeenUsed()}
+ */ + @Test + public void projectionsThatCannotBeSerialisedAtAllArePinned() { + Set expected = new TreeSet(Arrays.asList( + "org.locationtech.proj4j.proj.AdamsWorldInASquareIIProjection", + "org.locationtech.proj4j.proj.AlaskaModifiedStereographicProjection", + "org.locationtech.proj4j.proj.EquidistantAzimuthalProjection", + "org.locationtech.proj4j.proj.LeeOblatedStereographicProjection", + "org.locationtech.proj4j.proj.MillerOblatedStereographicProjection", + "org.locationtech.proj4j.proj.ModifiedStereographic48Projection", + "org.locationtech.proj4j.proj.ModifiedStereographic50Projection", + "org.locationtech.proj4j.proj.PeirceQuincuncialProjection", + "org.locationtech.proj4j.proj.SpilhausProjection")); + + List projections = new Registry().getProjections(); + Set actual = new TreeSet(); + int serialisedFine = 0; + for (Projection projection : projections) { + if (serialisable(projection)) { + serialisedFine++; + } else { + actual.add(projection.getClass().getName()); + } + } + + // Control: the great majority must serialise, or "9 broken" would be measuring a broken + // harness rather than 9 broken projections. + assertEquals("the registry stopped producing projections", 151, projections.size()); + assertEquals("projections that serialise cleanly", 142, serialisedFine); + assertEquals("the set of projections that cannot be serialised has changed", expected, actual); + } + + /** + * The nastiest variant, pinned separately because it is invisible to the scan above: + * {@code +proj=geocent} serialises fine until it has transformed one point, after which its + * lazily built {@code Cached} field makes it unserialisable. A driver that broadcasts a warm + * CRS fails; one that broadcasts a cold one does not. + */ + @Test + public void geocentProjectionBecomesUnserialisableOnlyAfterItHasBeenUsed() throws Exception { + CRSFactory factory = new CRSFactory(); + CoordinateReferenceSystem geocentric = + factory.createFromParameters("d", "+proj=geocent +datum=WGS84"); + assertTrue("a cold +proj=geocent already fails, so the 'only after use' claim is wrong", + serialisable(geocentric)); + + CoordinateReferenceSystem geographic = + factory.createFromParameters("s", "+proj=longlat +datum=WGS84"); + new CoordinateTransformFactory().createTransform(geographic, geocentric) + .transform(new ProjCoordinate(12, 47), new ProjCoordinate()); + + assertFalse("a warm +proj=geocent now serialises; if GeocentProjection.cached was made" + + " transient or serialisable, delete this test and the row in the table on" + + " projectionsThatCannotBeSerialisedAtAllArePinned", + serialisable(geocentric)); + } + + // ------------------------------------------------------------------ helpers + + private static boolean serialisable(Object value) { + try { + ObjectOutputStream out = new ObjectOutputStream(new ByteArrayOutputStream()); + out.writeObject(value); + out.close(); + return true; + } catch (NotSerializableException expected) { + return false; + } catch (IOException other) { + throw new AssertionError("unexpected failure serialising " + value.getClass(), other); + } + } + + @SuppressWarnings("unchecked") + private static T roundTrip(T value) throws Exception { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bytes); + out.writeObject(value); + out.close(); + ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray())); + try { + return (T) in.readObject(); + } finally { + in.close(); + } + } + + /** The proj4j class descriptors the JVM actually writes for {@code value}. */ + private static Set descriptorsWrittenFor(Object value) throws Exception { + final Set seen = new TreeSet(); + ObjectOutputStream out = new ObjectOutputStream(new ByteArrayOutputStream()) { + @Override + protected void writeClassDescriptor(ObjectStreamClass descriptor) throws IOException { + if (descriptor.getName().startsWith("org.locationtech.proj4j")) { + seen.add(descriptor.getName()); + } + super.writeClassDescriptor(descriptor); + } + }; + out.writeObject(value); + out.close(); + return seen; + } + + private static CoordinateTransform transform(String source, String target) { + CRSFactory factory = new CRSFactory(); + return new CoordinateTransformFactory().createTransform( + factory.createFromParameters("s", source), + factory.createFromParameters("t", target)); + } + + private static void collectClassFiles(File directory, List out) { + File[] entries = directory.listFiles(); + if (entries == null) { + return; + } + Arrays.sort(entries); + for (File entry : entries) { + if (entry.isDirectory()) { + collectClassFiles(entry, out); + } else if (entry.getName().endsWith(".class")) { + out.add(entry); + } + } + } + + private static File coreClassesDirectory() { + return directoryContaining(CoordinateReferenceSystem.class); + } + + private static File testClassesDirectory() { + return directoryContaining(SerialVersionUidTest.class); + } + + private static File directoryContaining(Class type) { + String resource = "/" + type.getName().replace('.', '/') + ".class"; + URL url = type.getResource(resource); + assertNotNull("cannot locate the compiled form of " + type.getName(), url); + String path = url.getPath(); + int index = path.indexOf(resource); + assertTrue("compiled classes are not on the filesystem: " + url, index >= 0); + File directory = new File(path.substring(0, index).replace("%20", " ")); + assertTrue("not a directory: " + directory, directory.isDirectory()); + return directory; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/spi/ProjDatabaseSpiTest.java b/core/src/test/java/org/locationtech/proj4j/spi/ProjDatabaseSpiTest.java new file mode 100644 index 0000000..3d97676 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/spi/ProjDatabaseSpiTest.java @@ -0,0 +1,336 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.spi; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; + +/** + * The {@code spi} package's own tests. Everything here runs with no {@code proj4j-db} on the + * classpath, which is the point: core must compile, run and pass its tests with no + * implementation present, and must then report the absence honestly rather than substituting a + * plausible number. + */ +public class ProjDatabaseSpiTest { + + /** + * The total order that makes candidate enumeration deterministic. Without it, a candidate list's + * order would depend on which index a row was found through. + */ + @Test + public void objectRefsAreTotallyOrdered() { + List refs = new ArrayList(Arrays.asList( + new DbObjectRef(DbObjectType.PROJECTED_CRS, "EPSG", "27700"), + new DbObjectRef(DbObjectType.GEODETIC_CRS, "ESRI", "4326"), + new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326"), + new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4267"), + new DbObjectRef(DbObjectType.HELMERT_TRANSFORMATION, "EPSG", "1188"))); + Collections.sort(refs); + assertEquals("[geodetic_crs:EPSG:4267, geodetic_crs:EPSG:4326, geodetic_crs:ESRI:4326, " + + "projected_crs:EPSG:27700, helmert_transformation:EPSG:1188]", refs.toString()); + // Shuffling then re-sorting must reproduce it exactly -- no ties left to luck. + List again = new ArrayList(refs); + Collections.reverse(again); + Collections.sort(again); + assertEquals(refs, again); + } + + @Test + public void objectRefEqualityIsByAllThreeParts() { + DbObjectRef a = new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326"); + assertEquals(a, new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326")); + assertEquals(a.hashCode(), new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326") + .hashCode()); + assertFalse(a.equals(new DbObjectRef(DbObjectType.PROJECTED_CRS, "EPSG", "4326"))); + assertFalse(a.equals(new DbObjectRef(DbObjectType.GEODETIC_CRS, "ESRI", "4326"))); + assertEquals("EPSG:4326", a.authorityCode()); + } + + /** + * Codes are strings because upstream declares them {@code INTEGER_OR_TEXT} and really uses both. + * A numeric code type would exclude the IGNF and NKG authorities entirely. + */ + @Test + public void textCodesAreAcceptable() { + DbObjectRef nkg = new DbObjectRef(DbObjectType.OTHER_TRANSFORMATION, "NKG", + "DK_2020_INTRAPLATE"); + assertEquals("NKG:DK_2020_INTRAPLATE", nkg.authorityCode()); + } + + /** The upstream vocabulary is reproduced verbatim, so a lookup key and a database row agree. */ + @Test + public void objectTypeNamesRoundTripThroughTheUpstreamSpelling() { + for (DbObjectType t : DbObjectType.values()) { + assertEquals(t, DbObjectType.fromDbName(t.dbName())); + } + assertEquals(DbObjectType.HELMERT_TRANSFORMATION, + DbObjectType.fromDbName("helmert_transformation")); + // The backing table is helmert_transformation_table; the *view* name is the key, matching + // upstream's own usage/alias/supersession vocabulary. + assertNull(DbObjectType.fromDbName("helmert_transformation_table")); + assertNull(DbObjectType.fromDbName(null)); + assertNull(DbObjectType.fromDbName("no_such_table")); + } + + @Test + public void crsAndOperationPredicatesPartitionTheTypes() { + int crs = 0; + int ops = 0; + for (DbObjectType t : DbObjectType.values()) { + if (t.isCrs()) { + crs++; + } + if (t.isOperation()) { + ops++; + } + assertFalse(t + " cannot be both", t.isCrs() && t.isOperation()); + } + assertEquals(5, crs); + assertEquals(4, ops); + // A conversion is the map projection half of a projected CRS, not a CRS-to-CRS operation, and + // never appears in coordinate_operation_view. + assertFalse(DbObjectType.CONVERSION.isOperation()); + } + + @Test + public void crsTypesMapToTheirTables() { + for (DbCrsType t : DbCrsType.values()) { + assertTrue(t + " must map to a CRS table", t.objectType().isCrs()); + assertEquals(t, DbCrsType.fromDbValue(t.dbValue())); + } + assertEquals(DbObjectType.GEODETIC_CRS, DbCrsType.GEOGRAPHIC_3D.objectType()); + assertEquals(DbObjectType.VERTICAL_CRS, DbCrsType.VERTICAL.objectType()); + assertTrue(DbCrsType.GEOGRAPHIC_3D.isGeodetic()); + assertFalse(DbCrsType.PROJECTED.isGeodetic()); + assertEquals("geographic 3D", DbCrsType.GEOGRAPHIC_3D.dbValue()); + } + + /** + * An extent that wraps through 180 degrees is not corrupt data. Normalising it into a single + * interval turns a Pacific extent into an almost-global one, which then wins every area-of-use + * ranking. + */ + @Test + public void antimeridianExtentsAreHandledNotNormalised() { + DbExtent pacific = new DbExtent("EPSG", "1", "Fiji", "Fiji - onshore", + 174.0, -20.0, -178.0, -16.0, false); + assertTrue(pacific.crossesAntimeridian()); + assertEquals(8.0, pacific.longitudeSpan(), 1e-12); + assertTrue(pacific.contains(179.0, -18.0)); + assertTrue(pacific.contains(-179.0, -18.0)); + assertFalse(pacific.contains(0.0, -18.0)); + assertFalse(pacific.contains(179.0, 0.0)); + + DbExtent uk = new DbExtent("EPSG", "4390", "UK", "UK - Britain", + -9.01, 49.75, 2.01, 61.01, false); + assertFalse(uk.crossesAntimeridian()); + assertEquals(11.02, uk.longitudeSpan(), 1e-12); + assertTrue(uk.contains(-0.1, 51.5)); + assertFalse(uk.contains(-122.4, 37.8)); + // A wrapping extent must not out-rank a small one by accident. + assertTrue(pacific.rankingArea() < 360.0 * 180.0); + } + + /** + * 18 of the 4,314 upstream extents publish no bounding box. "Unknown" is reported as unknown and as + * "not contained" — never as the whole world, because a fabricated world extent is + * indistinguishable from a genuine one. + */ + @Test + public void missingBoundingBoxIsNeverTheWholeWorld() { + DbExtent none = new DbExtent("EPSG", "1", "?", "no bounds", Double.NaN, Double.NaN, + Double.NaN, Double.NaN, false); + assertFalse(none.hasBoundingBox()); + assertFalse(none.contains(0.0, 0.0)); + assertFalse(none.contains(-122.4, 37.8)); + assertTrue(Double.isNaN(none.longitudeSpan())); + assertTrue(Double.isNaN(none.rankingArea())); + assertFalse(none.crossesAntimeridian()); + assertTrue(none.toString().contains("no bbox")); + } + + /** + * An absent accuracy is meaningful: PROJ never assigns one to a ballpark operation, so an empty + * accuracy on a synthesised datum change is the database saying "this is a guess". Defaulting it to + * a number is how a ballpark candidate wins a ranking. + */ + @Test + public void absentValuesAreNaNAndSayItThroughAPredicate() { + DbOperation ballpark = new DbOperation(DbObjectType.OTHER_TRANSFORMATION, "PROJ", "X", + "Ballpark geographic offset", "PROJ", "PROJString", "+proj=noop", + new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4267"), + new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4269"), + Double.NaN, null, null, null, null, null, false); + assertFalse(ballpark.hasAccuracy()); + assertTrue(Double.isNaN(ballpark.accuracy())); + assertTrue(ballpark.isProjStringMethod()); + assertFalse(ballpark.isWktMethod()); + assertTrue(ballpark.toString().contains("accuracy unknown")); + + DbUnit noFactor = new DbUnit("EPSG", "9203", "coefficient", DbUnit.Type.SCALE, Double.NaN, + null, false); + assertFalse(noFactor.hasConversionFactor()); + // Never 1.0: a defaulted factor of one is indistinguishable from a real one and multiplies + // silently. + assertFalse(1.0 == noFactor.conversionFactor()); + } + + @Test + public void ellipsoidKeepsTheAuthoritysOwnParameterisation() { + DbEllipsoid airy = new DbEllipsoid("EPSG", "7001", "Airy 1830", null, 6377563.396, null, + 299.3249646, Double.NaN, false); + assertEquals(299.3249646, airy.inverseFlattening(), 0.0); + assertTrue(Double.isNaN(airy.semiMinorAxis())); + assertFalse(airy.isSphere()); + + DbEllipsoid sphere = new DbEllipsoid("EPSG", "7035", "Sphere", null, 6371000.0, null, 0.0, + Double.NaN, false); + assertTrue(sphere.isSphere()); + } + + @Test + public void collectionsOnValueTypesAreUnmodifiable() { + DbOperation op = new DbOperation(DbObjectType.GRID_TRANSFORMATION, "EPSG", "7710", "x", null, + null, null, null, null, 1.0, null, Arrays.asList("a.gsb"), null, null, null, false); + try { + op.gridNames().add("b.gsb"); + fail("gridNames() must be unmodifiable"); + } catch (UnsupportedOperationException expected) { + // as documented + } + assertEquals(Collections.emptyList(), op.parameters()); + assertEquals(Collections.emptyList(), op.steps()); + + DbCoordinateSystem cs = new DbCoordinateSystem("EPSG", "6422", "ellipsoidal", 2, null); + assertEquals(Collections.emptyList(), cs.axes()); + } + + @Test + public void stepDirectionDefaultsToUnspecifiedRatherThanForward() { + // Upstream stores NULL when the direction follows from chaining. Defaulting a NULL to FORWARD + // would silently run a reverse step forwards. + assertEquals(DbOperationStep.Direction.UNSPECIFIED, + DbOperationStep.Direction.fromDbValue(null)); + assertEquals(DbOperationStep.Direction.FORWARD, + DbOperationStep.Direction.fromDbValue("forward")); + assertEquals(DbOperationStep.Direction.REVERSE, + DbOperationStep.Direction.fromDbValue("reverse")); + DbOperationStep step = new DbOperationStep(2, + new DbObjectRef(DbObjectType.HELMERT_TRANSFORMATION, "EPSG", "7941"), null); + assertEquals(DbOperationStep.Direction.UNSPECIFIED, step.direction()); + // Not a 1-based index: two upstream operations number their steps 2 and 3. + assertEquals(2, step.stepNumber()); + } + + @Test + public void gridAlternativeKeepsOpenLicenceTriStateSeparate() { + DbGridAlternative unknown = new DbGridAlternative("x.gsb", "x.tif", null, "GTiff", + "hgridshift", false, null, null, null, null); + assertNull("null is 'not established', which is not permission", unknown.openLicense()); + DbGridAlternative refused = new DbGridAlternative("y.gsb", "y.tif", null, "GTiff", + "hgridshift", true, null, Boolean.FALSE, Boolean.FALSE, null); + assertEquals(Boolean.FALSE, refused.openLicense()); + assertTrue(refused.inverseDirection()); + } + + /** + * Supersession is not deprecation, and {@code sameSourceTargetCrs} is why. A superseded operation + * whose replacement connects a different CRS pair is not actually a substitute for it. + */ + @Test + public void supersessionRecordsWhetherTheReplacementIsASubstitute() { + DbObjectRef old = new DbObjectRef(DbObjectType.HELMERT_TRANSFORMATION, "EPSG", "1"); + DbObjectRef newer = new DbObjectRef(DbObjectType.HELMERT_TRANSFORMATION, "EPSG", "2"); + DbSupersession same = new DbSupersession(old, newer, "EPSG", true); + assertTrue(same.sameSourceTargetCrs()); + assertTrue(same.toString().contains("same CRS pair")); + assertFalse(new DbSupersession(old, newer, "EPSG", false).sameSourceTargetCrs()); + } + + // ------------------------------------------------------------------ discovery + + /** + * With no {@code proj4j-db} artifact present, discovery finds nothing and says nothing — it must not + * throw, and must not be consulted implicitly by anything else in core. + */ + @Test + public void discoveryFindsNothingWithoutTheArtifact() throws IOException { + List found = ProjDatabaseProvider.discover( + ProjDatabaseSpiTest.class.getClassLoader()); + assertEquals("core's own test classpath must have no ProjDatabase implementation", + Collections.emptyList(), found); + assertNull(ProjDatabaseProvider.openFirst(ProjDatabaseSpiTest.class.getClassLoader())); + } + + /** + * Two providers sharing {@code (priority, name)} are rejected, not ordered by luck. + * {@code ServiceLoader} iteration follows classpath order, which differs between a shaded jar, an + * IDE and a Spark executor — so picking one arbitrarily makes the choice of database a property of + * the deployment rather than of the code. Same precedent as {@code ResourceResolvers}. + */ + @Test + public void duplicateProvidersWouldBeRejected() { + // discover() cannot be given synthetic providers without a classloader stunt, so the ordering + // and duplicate rules are asserted directly on the comparator's inputs. + ProjDatabaseProvider a = provider("pjdx", 100); + ProjDatabaseProvider b = provider("pjdx", 100); + assertEquals(a.name(), b.name()); + assertEquals(a.priority(), b.priority()); + + List providers = new ArrayList( + Arrays.asList(provider("zzz", 50), provider("aaa", 50), provider("mmm", 10))); + Collections.sort(providers, new java.util.Comparator() { + @Override + public int compare(ProjDatabaseProvider p, ProjDatabaseProvider q) { + int c = Integer.compare(p.priority(), q.priority()); + return c != 0 ? c : p.name().compareTo(q.name()); + } + }); + assertEquals("mmm", providers.get(0).name()); + assertEquals("aaa", providers.get(1).name()); + assertEquals("zzz", providers.get(2).name()); + } + + private static ProjDatabaseProvider provider(final String name, final int priority) { + return new ProjDatabaseProvider() { + @Override + public String name() { + return name; + } + + @Override + public int priority() { + return priority; + } + + @Override + public ProjDatabase open() { + return null; + } + }; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/tmerc/TmercAlgorithmSelectionTest.java b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercAlgorithmSelectionTest.java new file mode 100644 index 0000000..5edb9cf --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercAlgorithmSelectionTest.java @@ -0,0 +1,313 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.tmerc; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.ExtendedTransverseMercatorProjection; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection.Algorithm; + +/** + * Which of the two transverse-Mercator algorithms runs, and how far apart they are. + * + *

This is the regression net for the largest backward-compatibility change in the 9.8.1 + * migration. {@code +proj=tmerc} used to be Evenden/Snyder unconditionally and is now + * Poder/Engsager, matching what PROJ 9.8.1 ships ({@code proj_internal.h:840-841}, + * {@code data/proj.ini}). {@link #movementFromEvendenSnyderToPoderEngsager()} quantifies the + * movement and prints the table the release notes need; the rest assert that the escape hatches + * really reach the old arithmetic, because a switch nobody can turn is not an escape hatch. + */ +public class TmercAlgorithmSelectionTest { + + private static final CRSFactory CRS = new CRSFactory(); + + /** A GRS80 {@code tmerc} in the given mode, built without going through the parser. */ + private static TransverseMercatorProjection grs80(Algorithm algorithm, boolean approx) { + TransverseMercatorProjection p = new TransverseMercatorProjection(); + p.setEllipsoid(Ellipsoid.GRS80); + p.setAlgorithm(algorithm); + p.setApprox(approx); + p.initialize(); + return p; + } + + private static ProjCoordinate forwardRadians(Projection p, double lonDeg, double latDeg) { + ProjCoordinate out = new ProjCoordinate(); + p.projectRadians(new ProjCoordinate(Math.toRadians(lonDeg), Math.toRadians(latDeg)), out); + return out; + } + + // ------------------------------------------------------------------------- what is selected + + /** The default is what 9.8.1 ships, not what Proj4J 1.4.3 did. */ + @Test + public void theDefaultIsPoderEngsager() { + assertEquals(Algorithm.PODER_ENGSAGER, grs80(Algorithm.PODER_ENGSAGER, false) + .getEffectiveAlgorithm()); + TransverseMercatorProjection fresh = new TransverseMercatorProjection(); + fresh.setEllipsoid(Ellipsoid.GRS80); + fresh.initialize(); + assertEquals("an untouched ellipsoidal tmerc must be Poder/Engsager", + Algorithm.PODER_ENGSAGER, fresh.getEffectiveAlgorithm()); + assertEquals("and so must one built through the parser", Algorithm.PODER_ENGSAGER, + ((TransverseMercatorProjection) CRS + .createFromParameters("t", "+proj=tmerc +ellps=GRS80 +no_defs") + .getProjection()).getEffectiveAlgorithm()); + } + + /** {@code +approx} is checked before {@code +algo} and wins over it, {@code tmerc.cpp:552-561}. */ + @Test + public void approxWinsOverAlgo() { + assertEquals(Algorithm.EVENDEN_SNYDER, + grs80(Algorithm.PODER_ENGSAGER, true).getEffectiveAlgorithm()); + assertEquals(Algorithm.EVENDEN_SNYDER, grs80(Algorithm.AUTO, true).getEffectiveAlgorithm()); + } + + /** + * {@code +algo=auto} is accepted and resolves to Poder/Engsager — a deliberate divergence + * from upstream's data-dependent branch, which introduces a discontinuity in the output field + * at its switch boundary. {@code builtins.gie:7379-7407} only asserts that AUTO agrees with + * {@code poder_engsager} to 0.1 mm, and it does so exactly. + */ + @Test + public void autoResolvesToPoderEngsager() { + TransverseMercatorProjection auto = grs80(Algorithm.AUTO, false); + assertEquals(Algorithm.PODER_ENGSAGER, auto.getEffectiveAlgorithm()); + + // Upstream's AUTO would take the *approximate* branch here (|lam| <= 3 deg), so this is + // the point where the divergence is observable at all: it must agree with the exact + // series bit for bit, not merely within 0.1 mm. + ProjCoordinate a = forwardRadians(auto, 2.9, 40); + ProjCoordinate b = forwardRadians(grs80(Algorithm.PODER_ENGSAGER, false), 2.9, 40); + assertEquals(b.x, a.x, 0.0); + assertEquals(b.y, a.y, 0.0); + } + + /** {@code tmerc.cpp:518-519}: a sphere forces the approximate series whatever was asked for. */ + @Test + public void aSphereForcesEvendenSnyder() { + TransverseMercatorProjection p = new TransverseMercatorProjection(); + p.setEllipsoid(new Ellipsoid("unit", 6400000.0, 6400000.0, 0.0, "sphere")); + p.setAlgorithm(Algorithm.PODER_ENGSAGER); + p.initialize(); + assertEquals(Algorithm.EVENDEN_SNYDER, p.getEffectiveAlgorithm()); + + // ... and it still projects. builtins.gie:7130-7218 is 25 rows of spherical tmerc. + ProjCoordinate xy = forwardRadians(p, 2, 1); + assertEquals(223413.466406322, xy.x, 1.0e-4); + assertEquals(111769.145040597, xy.y, 1.0e-4); + } + + /** An unknown {@code +algo} is an error, {@code tmerc.cpp:575-578}. */ + @Test + public void anUnknownAlgoIsRejected() { + try { + grs80(Algorithm.PODER_ENGSAGER, false).setAlgorithm("engsager_poder"); + fail("expected an unknown +algo value to be rejected"); + } catch (InvalidValueException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + } + } + + /** + * Two definitions that differ only by the algorithm must not compare equal, or the transform + * cache will hand one out for the other. + */ + @Test + public void theAlgorithmParticipatesInEquality() { + assertNotEquals(grs80(Algorithm.PODER_ENGSAGER, false), grs80(Algorithm.PODER_ENGSAGER, true)); + assertEquals(grs80(Algorithm.AUTO, false), grs80(Algorithm.PODER_ENGSAGER, false)); + } + + // -------------------------------------------------------------------- the movement, measured + + /** + * The algorithm-movement table. Evenden/Snyder minus Poder/Engsager, GRS80, + * {@code k_0 = 1}, {@code lat_0 = 0}, at a spread of distances from the central meridian. + * + *

Printed as well as asserted: this is the number the release notes have to carry, and the + * golden-master regime needs it declared as intended movement rather than discovered as drift. + * + *

The three anchors that are upstream's own, not this measurement's: + * {@code builtins.gie:7466} pins Evenden/Snyder at 6°/lat 0 to {@code 669149.3474} where + * {@code :7436} pins Poder/Engsager to {@code 669149.3483} — 0.9 mm — and comments out that + * row's {@code roundtrip 1} with the note "Small difference with poder_engsager". At + * {@code accept 44.69 35.37} ({@code :7118}) the 50 nm bar is missed by the approximate + * series by about 1.5 km. + */ + @Test + public void movementFromEvendenSnyderToPoderEngsager() { + TransverseMercatorProjection approx = grs80(Algorithm.PODER_ENGSAGER, true); + TransverseMercatorProjection exact = grs80(Algorithm.PODER_ENGSAGER, false); + + double[] longitudes = {0.5, 2, 3, 6, 10, 15, 20, 30, 44.69, 60, 80}; + double[] latitudes = {0, 35.37, 60, 85}; + + StringBuilder table = new StringBuilder(); + table.append("\nEvenden/Snyder minus Poder/Engsager, +proj=tmerc +ellps=GRS80, " + + "metres of horizontal displacement\n"); + table.append(String.format("%10s", "lon-lon_0")); + for (double lat : latitudes) { + table.append(String.format("%18s", "lat " + lat)); + } + table.append('\n'); + + double worstNearCm = 0; + double at6 = 0; + double at20 = 0; + double at4469 = 0; + for (double lon : longitudes) { + table.append(String.format("%9.2f ", lon)); + for (double lat : latitudes) { + double d = displacement(approx, exact, lon, lat); + table.append(String.format("%18s", format(d))); + if (lon <= 3) { + worstNearCm = Math.max(worstNearCm, d); + } + if (lon == 6 && lat == 0) { + at6 = d; + } + if (lon == 20 && lat == 0) { + at20 = d; + } + if (lon == 44.69 && lat == 35.37) { + at4469 = d; + } + } + table.append('\n'); + } + System.out.println(table); + + // The claims the release notes make, asserted so they cannot rot. + assertTrue("within 3 deg of the central meridian the movement must stay under 0.1 mm, " + + "was " + format(worstNearCm), worstNearCm < 1.0e-4); + assertTrue("at 6 deg the movement must be about 0.9 mm, was " + format(at6), + at6 > 5.0e-4 && at6 < 2.0e-3); + assertTrue("at 20 deg it must be metres, was " + format(at20), at20 > 1.0 && at20 < 100.0); + assertTrue("at the corpus's own 44.69 deg row it must be about 1.5 km, was " + + format(at4469), at4469 > 500.0 && at4469 < 5000.0); + } + + /** + * The two algorithms must differ measurably at 6°: that is what proves the + * {@code +approx} switch is wired to something and not quietly ignored. Both are compared to + * upstream's own numbers, so the direction of the difference is pinned too. + */ + @Test + public void approxAndDefaultDifferAtSixDegreesAndBothMatchUpstream() { + double approxX = forwardRadians(grs80(Algorithm.PODER_ENGSAGER, true), 6, 0).x; + double exactX = forwardRadians(grs80(Algorithm.PODER_ENGSAGER, false), 6, 0).x; + + // builtins.gie:7466 (evenden_snyder) and :7436 (poder_engsager), tolerance 0.1 mm. + assertEquals("builtins.gie:7466", 669149.3474, approxX, 1.0e-4); + assertEquals("builtins.gie:7436", 669149.3483, exactX, 1.0e-4); + assertTrue("the two algorithms must be measurably apart at 6 deg, else +approx is a no-op", + Math.abs(approxX - exactX) > 5.0e-4); + } + + /** + * {@code +approx} reproduces the Evenden/Snyder series exactly, and the default reproduces + * {@code +proj=etmerc} exactly. Neither is "close to": {@code tmerc} with {@code +approx} must + * be bit-identical to the old series and {@code tmerc} by default bit-identical to + * {@code etmerc}, or the delegation has introduced a difference of its own. + */ + @Test + public void theDefaultIsBitIdenticalToEtmerc() { + TransverseMercatorProjection tmerc = grs80(Algorithm.PODER_ENGSAGER, false); + ExtendedTransverseMercatorProjection etmerc = new ExtendedTransverseMercatorProjection(); + etmerc.setEllipsoid(Ellipsoid.GRS80); + etmerc.initialize(); + + // Kept inside |Ce| <= 2.623395162778. At lat 0 and lam 90 exactly the point is genuinely + // at infinity for a transverse Mercator, and both classes throw there; that is + // domainAndFailClosedTest's business, not this one's. + for (double lon : new double[] {0, 1, 6, 20, 44.69, 60}) { + for (double lat : new double[] {-85, -35.37, 0, 1, 60, 89.9999}) { + ProjCoordinate a = forwardRadians(tmerc, lon, lat); + ProjCoordinate b = forwardRadians(etmerc, lon, lat); + assertEquals("tmerc vs etmerc easting at (" + lon + ", " + lat + ")", b.x, a.x, 0.0); + assertEquals("tmerc vs etmerc northing at (" + lon + ", " + lat + ")", b.y, a.y, 0.0); + } + } + } + + /** + * {@code builtins.gie:7095-7127} at the file's own {@code tolerance 50 nm}, forward as well as + * inverse. Before the switch the forward rows could only be asserted at 0.1 mm and the + * 3,900 km row not at all; that they now pass at 50 nm is the stage. + */ + @Test + public void theDefaultMeetsTheFiftyNanometreBarWhereTheOldSeriesCouldNot() { + CoordinateReferenceSystem projected = TmercGieRunner + .projected("+proj=tmerc +ellps=GRS80"); + Projection p = projected.getProjection(); + + ProjCoordinate got = forwardRadians(p, 44.69, 35.37); + double dx = Math.abs(got.x - 4168136.489446198); + double dy = Math.abs(got.y - 4985511.302287407); + assertTrue("builtins.gie:7118 forward at 3900 km from the central meridian: off by (" + + dx + ", " + dy + ") m against a 50 nm bar", + Math.sqrt(dx * dx + dy * dy) <= 50.0e-9); + + // And the approximate series is off by kilometres there, which is why upstream's tmerc + // rows are identical to its etmerc rows. + ProjCoordinate old = forwardRadians(grs80(Algorithm.PODER_ENGSAGER, true), 44.69, 35.37); + assertTrue("the approximate series must be the thing that could not meet this bar", + Math.abs(old.x - 4168136.489446198) > 100.0); + } + + /** Horizontal displacement in metres between the two algorithms at one point. */ + private static double displacement(TransverseMercatorProjection approx, + TransverseMercatorProjection exact, double lonDeg, double latDeg) { + ProjCoordinate a = forwardRadians(approx, lonDeg, latDeg); + ProjCoordinate b = forwardRadians(exact, lonDeg, latDeg); + double dx = a.x - b.x; + double dy = a.y - b.y; + return Math.sqrt(dx * dx + dy * dy); + } + + private static String format(double metres) { + if (metres == 0) { + return "0"; + } + if (metres < 1.0e-6) { + return String.format("%.3f nm", metres * 1.0e9); + } + if (metres < 1.0e-3) { + return String.format("%.3f um", metres * 1.0e6); + } + if (metres < 1.0) { + return String.format("%.4f mm", metres * 1.0e3); + } + if (metres < 1000.0) { + return String.format("%.3f m", metres); + } + return String.format("%.3f km", metres / 1000.0); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/tmerc/TmercFailClosedTest.java b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercFailClosedTest.java new file mode 100644 index 0000000..058042d --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercFailClosedTest.java @@ -0,0 +1,265 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.tmerc; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.ProjectionException; +import org.locationtech.proj4j.datum.Ellipsoid; +import org.locationtech.proj4j.proj.ExtendedTransverseMercatorProjection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection.Algorithm; + +/** + * The transverse-Mercator family's out-of-domain behaviour: every failure must be an exception + * with a machine-readable cause, never a plausible coordinate. + * + *

The confirmed fail-open defect

+ * + *

{@code ExtendedTransverseMercatorProjection.projectInverse} had no {@code else} branch + * on its {@code |Ce| <= 2.623395162778} test. Because {@code BasicCoordinateTransform} passes the + * same object as source and destination, an out-of-zone UTM easting left {@code out} holding the + * input metres, which {@code Projection.inverseProjectRadians} then multiplied by + * {@code RTD} as if they were radians and clamped to ±π. The result was finite, + * plausible and completely wrong — and specifically invisible to a finiteness postcondition, + * which is why it needed a real error rather than a NaN check. + */ +public class TmercFailClosedTest { + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + /** + * An out-of-zone UTM inverse. 20,000,000 m of easting is 19.5 Mm from the zone-30 central + * meridian, i.e. {@code |Ce| = 3.06 > 2.6234}: outside the domain by a wide margin, and the + * shape of input a caller gets from a mis-declared CRS or a transposed easting/northing. + */ + @Test + public void anOutOfZoneUtmInverseNowErrors() { + CoordinateReferenceSystem utm = CRS.createFromParameters("utm30", + "+proj=utm +zone=30 +ellps=GRS80 +no_defs"); + CoordinateReferenceSystem wgs84 = CRS.createFromParameters("geog", + "+proj=longlat +ellps=GRS80 +no_defs"); + + ProjCoordinate out = new ProjCoordinate(); + try { + TRANSFORMS.createTransform(utm, wgs84) + .transform(new ProjCoordinate(20000000.0, 5000000.0), out); + fail("expected an out-of-domain error; instead got (" + out.x + ", " + out.y + + ") deg — the old behaviour returned the input metres clamped to +/-pi rad, " + + "which is finite and plausible and wrong"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + assertTrue("the message must name the offending easting, got: " + e.getMessage(), + e.getMessage().contains("2.6")); + } + } + + /** + * The exact shape of the old wrong answer, recorded so that a regression is recognisable. + * {@code 20000000 rad} clamps to {@code pi rad = 180 deg} and {@code 5000000 rad} does not + * clamp at all — the latitude used to come back as a number in the millions of degrees, or, + * once the finiteness postcondition landed, as whatever the clamp produced. Either way the + * transform returned normally. + */ + @Test + public void theOldFailOpenAnswerIsNoLongerReachable() { + ExtendedTransverseMercatorProjection etmerc = new ExtendedTransverseMercatorProjection(); + etmerc.setEllipsoid(Ellipsoid.GRS80); + etmerc.initialize(); + + ProjCoordinate aliased = new ProjCoordinate(20000000.0, 5000000.0); + try { + // The aliasing is the point: src and dst are the same object, as in + // BasicCoordinateTransform. + etmerc.projectInverse(aliased.x, aliased.y, aliased); + fail("expected an out-of-domain error, got (" + aliased.x + ", " + aliased.y + ")"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + assertEquals("the destination must not have been written to", 20000000.0, aliased.x, 0.0); + } + + /** {@code tmerc.cpp:379}: the forward direction has the same limit and the same errno. */ + @Test + public void anOutOfDomainForwardErrors() { + ExtendedTransverseMercatorProjection etmerc = new ExtendedTransverseMercatorProjection(); + etmerc.setEllipsoid(Ellipsoid.GRS80); + etmerc.initialize(); + + // At the equator, 90 degrees from the central meridian is genuinely at infinity. + try { + etmerc.project(Math.toRadians(90.0), 0.0, new ProjCoordinate()); + fail("expected an out-of-domain error at lam = 90 deg, lat = 0"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + } + + /** + * {@code builtins.gie:7777}, {@code +proj=utm +a=6400000 +zone=30}: + * {@code expect failure errno invalid_op_illegal_arg_value}. Poder/Engsager is ellipsoidal + * only, so both {@code etmerc} ({@code tmerc.cpp:617-625}) and {@code utm} ({@code :666-671}) + * reject a sphere at setup. Proj4J used to return silently from setup and then run the series + * with {@code Qn = NaN}. + */ + @Test + public void etmercAndUtmRejectASphere() { + try { + CRS.createFromParameters("s", "+proj=utm +a=6400000 +zone=30 +no_defs"); + fail("expected +proj=utm on a sphere to be rejected"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + } + try { + CRS.createFromParameters("s", "+proj=etmerc +R=6400000 +no_defs"); + fail("expected +proj=etmerc on a sphere to be rejected"); + } catch (Proj4jException e) { + assertEquals(ErrorCause.INVALID_PARAM_VALUE, e.cause()); + } + } + + /** + * The sphere guard is unconditional, so the no-argument constructor must leave a genuine + * ellipsoid behind — otherwise {@code Registry.getProjection("etmerc")} and + * {@code ("utm")} throw before the parser has said anything, which is what took down about + * twenty test classes mid-change. + * + *

The trap: {@link org.locationtech.proj4j.proj.Projection}'s own constructor runs + * {@code setEllipsoid(Ellipsoid.SPHERE)}, and this class used to assign the {@code ellipsoid} + * field directly, so the object claimed GRS80 while {@code a}, {@code e} and {@code es} + * described {@code Ellipsoid.SPHERE}. Every instance was therefore both mislabelled + * and unable to project. + */ + @Test + public void theNoArgumentConstructorLeavesAUsableEllipsoid() { + ExtendedTransverseMercatorProjection fresh = new ExtendedTransverseMercatorProjection(); + assertNotNull("Registry must be able to instantiate etmerc", fresh); + assertEquals("the constructor says GRS80, so a must be GRS80's", 6378137.0, + fresh.getEquatorRadius(), 0.0); + assertEquals("... and the eccentricity must agree with the label", + Ellipsoid.GRS80.getEccentricitySquared(), + fresh.getEllipsoid().getEccentricitySquared(), 0.0); + + // It projects, which it could not before. + ProjCoordinate xy = new ProjCoordinate(); + fresh.project(Math.toRadians(2), Math.toRadians(1), xy); + assertEquals("builtins.gie:7100 in units of the semi-major axis", + 222650.796797586 / 6378137.0, xy.x, 1.0e-14); + + assertNotNull("and the parser path must still work", + CRS.createFromParameters("e", "+proj=etmerc +ellps=GRS80 +no_defs")); + } + + /** + * Spherical {@code tmerc} is legitimate and must keep working — {@code tmerc.cpp:518-519} + * selects the spherical Evenden/Snyder formulation for {@code es == 0} rather than treating it + * as an error. {@code builtins.gie:7130-7218} is 25 rows of it and {@code :7222-7241} four + * more on the Moon. + */ + @Test + public void sphericalTmercIsLegitimate() { + CoordinateReferenceSystem sphere = CRS.createFromParameters("s", + "+proj=tmerc +R=6400000 +no_defs"); + CoordinateReferenceSystem geog = CRS.createFromParameters("g", + "+proj=longlat +R=6400000 +no_defs"); + + ProjCoordinate got = new ProjCoordinate(); + TRANSFORMS.createTransform(geog, sphere).transform(new ProjCoordinate(2, 1), got); + assertEquals("builtins.gie:7134", 223413.466406322, got.x, 1.0e-4); + assertEquals("builtins.gie:7134", 111769.145040597, got.y, 1.0e-4); + assertEquals(Algorithm.EVENDEN_SNYDER, ((TransverseMercatorProjection) sphere + .getProjection()).getEffectiveAlgorithm()); + } + + /** + * {@code builtins.gie:7367-7372}: {@code +proj=tmerc +R=1}, inverse of {@code -1e200}, + * {@code expect failure errno coord_transfm_outside_projection_domain}. The spherical inverse's + * {@code exp(x/esp)} underflows to zero there. + */ + @Test + public void theSphericalInverseRejectsAnUnderflowingEasting() { + CoordinateReferenceSystem unit = CRS.createFromParameters("u", + "+proj=tmerc +R=1 +no_defs"); + CoordinateReferenceSystem geog = CRS.createFromParameters("g", "+proj=longlat +R=1 +no_defs"); + try { + TRANSFORMS.createTransform(unit, geog) + .transform(new ProjCoordinate(-1.0e200, 0), new ProjCoordinate()); + fail("expected an out-of-domain error"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + } + + /** + * The approximate series is garbage more than 90° from the central meridian and + * {@code tmerc.cpp:79-88} refuses to evaluate it there ("Is error -20 really an appropriate + * return value?" — upstream's own comment, and the answer is that an error of some kind is). + * Proj4J had no such test: the series simply diverged and returned a finite number. + */ + @Test + public void theApproximateSeriesRefusesBeyondNinetyDegrees() { + TransverseMercatorProjection approx = new TransverseMercatorProjection(); + approx.setEllipsoid(Ellipsoid.GRS80); + approx.setApprox(true); + approx.initialize(); + try { + approx.project(Math.toRadians(90.5), Math.toRadians(45), new ProjCoordinate()); + fail("expected the approximate series to refuse 90.5 deg from the central meridian"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + + // The default algorithm is valid out to 150 degrees, so it must NOT refuse. + TransverseMercatorProjection exact = new TransverseMercatorProjection(); + exact.setEllipsoid(Ellipsoid.GRS80); + exact.initialize(); + ProjCoordinate xy = new ProjCoordinate(); + exact.project(Math.toRadians(90.5), Math.toRadians(45), xy); + assertTrue("the exact series must produce a finite easting at 90.5 deg, got " + xy.x, + !Double.isNaN(xy.x) && !Double.isInfinite(xy.x)); + } + + /** + * The spherical forward's {@code |b| = 1} case, {@code tmerc.cpp:124-128}: the point projects + * to infinity, and the old code reached {@code log(x/0)} and then a silent + * {@code ProjectionMath.acos} clamp. + */ + @Test + public void theSphericalForwardRejectsThePointAtInfinity() { + TransverseMercatorProjection sphere = new TransverseMercatorProjection(); + sphere.setEllipsoid(new Ellipsoid("s", 6400000.0, 6400000.0, 0.0, "sphere")); + sphere.initialize(); + try { + sphere.project(Math.toRadians(90.0), 0.0, new ProjCoordinate()); + fail("expected the spherical forward to refuse lam = 90 deg at the equator"); + } catch (ProjectionException e) { + assertEquals(ErrorCause.COORDINATE_OUT_OF_DOMAIN, e.cause()); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieCorpus.java b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieCorpus.java new file mode 100644 index 0000000..c8cbe39 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieCorpus.java @@ -0,0 +1,314 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.tmerc; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +/** + * Reads the {@code tmerc}, {@code etmerc} and {@code utm} rows straight out of + * {@code conformance/src/test/resources/gie/builtins.gie} — the byte-identical vendored copy of + * {@code 9.8.1:test/gie/builtins.gie}. + * + *

Why read the file instead of transcribing the numbers. A transcribed expectation + * pins whatever this library did on the day it was typed. Reading the corpus means the assertions + * are upstream's, that a row added or retightened upstream shows up as a failure here, and that + * the tolerances — {@code 50 nm} for the ellipsoidal blocks, {@code 0.1 mm} for the spherical + * ones, {@code 0.001 mm} for one UTM row — are the file's own rather than a comfortable choice. + * + *

The reader understands five verbs ({@code operation}, {@code tolerance}, {@code direction}, + * {@code accept}, {@code expect}, {@code roundtrip}) and is deliberately no more general than + * these three families need. It duplicates about eighty lines of state machine already present in + * {@code proj/adams/GieCorpus} because that one is package-private in a package owned by a + * different change; copying it is the cheaper coupling. + * + *

Two behaviours of gie that are easy to get wrong and are load-bearing here: + *

    + *
  • {@code operation} resets the tolerance to 0.5 mm and the direction to forward, but + * does not clear the pending {@code accept} ({@code gie.cpp:646-651}). The + * {@code +proj=utm +a=6400000 +zone=30} block relies on that: its {@code expect failure} has + * no {@code accept} of its own. + *
  • An {@code expect} that has no {@code accept} at all is a setup expectation, because + * gie defers reporting a failed {@code proj_create} to {@code expect} time. + *
+ */ +final class TmercGieCorpus { + + /** An {@code expect} of numbers. */ + static final int NUMERIC = 1; + + /** An {@code expect failure}, with or without a named errno. */ + static final int FAILURE = 2; + + /** One assertion: an {@code accept}/{@code expect} pair, or a bare {@code roundtrip}. */ + static final class Row { + + final int line; + /** The {@code operation} definition in force, whitespace-normalised. */ + final String operation; + /** {@code true} when a {@code direction inverse} is in force. */ + final boolean inverse; + /** The {@code tolerance} in force, in metres. */ + final double tolerance; + /** {@code false} for a row that had no {@code accept} — a setup expectation. */ + final boolean hasInput; + final double acceptX; + final double acceptY; + /** {@link #NUMERIC} or {@link #FAILURE}. */ + final int kind; + final double expectX; + final double expectY; + /** The errno name on an {@code expect failure errno } row, or null. */ + final String errno; + /** The {@code roundtrip} count, or 0 when the row carries no {@code roundtrip}. */ + final int roundtrip; + + Row(int line, String operation, boolean inverse, double tolerance, boolean hasInput, + double acceptX, double acceptY, int kind, double expectX, double expectY, + String errno, int roundtrip) { + this.line = line; + this.operation = operation; + this.inverse = inverse; + this.tolerance = tolerance; + this.hasInput = hasInput; + this.acceptX = acceptX; + this.acceptY = acceptY; + this.kind = kind; + this.expectX = expectX; + this.expectY = expectY; + this.errno = errno; + this.roundtrip = roundtrip; + } + + /** The bare projection name: {@code tmerc}, {@code etmerc} or {@code utm}. */ + String projection() { + int at = operation.indexOf("+proj="); + int end = operation.indexOf(' ', at); + return operation.substring(at + "+proj=".length(), end < 0 ? operation.length() : end); + } + + @Override + public String toString() { + return "builtins.gie:" + line + " [" + operation + "] " + + (inverse ? "inverse" : "forward") + + (hasInput ? " accept " + acceptX + " " + acceptY : " (no accept)") + + (kind == FAILURE ? " expect failure" + (errno == null ? "" : " " + errno) + : " expect " + expectX + " " + expectY) + + (roundtrip > 0 ? " roundtrip " + roundtrip : "") + + " tolerance " + tolerance + " m"; + } + } + + private TmercGieCorpus() { + } + + /** + * Locates {@code conformance/src/test/resources/gie/builtins.gie}. Surefire runs with the + * module base directory as the working directory, so {@code ../conformance/...} resolves from + * {@code core/}; {@code basedir} and the current directory are tried too so the test also + * works from the repository root and from an IDE. A missing file is a hard failure, never a + * skip. + */ + static Path file() { + List candidates = new ArrayList(); + String basedir = System.getProperty("basedir"); + if (basedir != null) { + candidates.add(Paths.get(basedir, "..", "conformance", "src", "test", "resources", + "gie", "builtins.gie")); + } + candidates.add(Paths.get("..", "conformance", "src", "test", "resources", "gie", + "builtins.gie")); + candidates.add(Paths.get("conformance", "src", "test", "resources", "gie", + "builtins.gie")); + for (Path p : candidates) { + if (Files.isRegularFile(p)) { + return p; + } + } + throw new IllegalStateException("cannot locate conformance/src/test/resources/gie/" + + "builtins.gie from " + Paths.get(".").toAbsolutePath().normalize() + + "; tried " + candidates); + } + + /** + * Every row belonging to one of the three transverse-Mercator operations. + * + * @return the rows in file order + */ + static List transverseMercatorRows() { + List all = new ArrayList(); + for (Row r : read()) { + String op = r.operation; + if (op != null && (op.contains("+proj=tmerc ") || op.endsWith("+proj=tmerc") + || op.contains("+proj=etmerc ") || op.endsWith("+proj=etmerc") + || op.contains("+proj=utm ") || op.endsWith("+proj=utm"))) { + all.add(r); + } + } + return all; + } + + private static List read() { + Path path = file(); + List rows = new ArrayList(); + + String operation = null; + boolean inverse = false; + // gie resets the tolerance to 0.5 mm on every `operation` (gie.cpp:651). + double tolerance = 0.0005; + + boolean havePending = false; + int pendingLine = 0; + double pendingX = 0; + double pendingY = 0; + + try (BufferedReader in = new BufferedReader(new InputStreamReader( + Files.newInputStream(path), StandardCharsets.UTF_8))) { + String raw; + int lineNumber = 0; + while ((raw = in.readLine()) != null) { + lineNumber++; + String line = strip(raw); + if (line.isEmpty()) { + continue; + } + String[] token = line.split("\\s+"); + String verb = token[0]; + + if ("operation".equals(verb)) { + operation = line.substring(verb.length()).trim().replaceAll("\\s+", " "); + inverse = false; + tolerance = 0.0005; + // Deliberately NOT clearing the pending accept: gie does not. + } else if ("direction".equals(verb)) { + inverse = token.length > 1 + && (token[1].charAt(0) == 'i' || token[1].charAt(0) == 'I' + || token[1].charAt(0) == 'r' || token[1].charAt(0) == 'R'); + } else if ("tolerance".equals(verb)) { + tolerance = parseTolerance(line.substring(verb.length()).trim(), lineNumber); + } else if ("accept".equals(verb)) { + havePending = true; + pendingLine = lineNumber; + pendingX = number(token[1]); + pendingY = number(token[2]); + } else if ("expect".equals(verb)) { + int at = havePending ? pendingLine : lineNumber; + if ("failure".equals(token[1])) { + String errno = token.length > 3 && "errno".equals(token[2]) + ? token[3] : null; + rows.add(new Row(at, operation, inverse, tolerance, havePending, + pendingX, pendingY, FAILURE, 0, 0, errno, 0)); + } else { + if (!havePending) { + throw new IllegalStateException(path + ":" + lineNumber + + ": numeric expect with no accept anywhere before it"); + } + rows.add(new Row(at, operation, inverse, tolerance, true, pendingX, + pendingY, NUMERIC, number(token[1]), number(token[2]), null, 0)); + } + } else if ("roundtrip".equals(verb)) { + int n = token.length > 1 ? Integer.parseInt(token[1]) : 100; + if (rows.isEmpty()) { + throw new IllegalStateException( + path + ":" + lineNumber + ": roundtrip with no preceding expect"); + } + // Every roundtrip in these blocks follows its own expect, so the count is + // attached to the row just recorded. + Row last = rows.remove(rows.size() - 1); + rows.add(new Row(last.line, last.operation, last.inverse, last.tolerance, + last.hasInput, last.acceptX, last.acceptY, last.kind, last.expectX, + last.expectY, last.errno, n)); + } + // Everything else - , , decorative rules - is ignored. + } + } catch (IOException e) { + throw new UncheckedIOException("reading " + path, e); + } + return rows; + } + + /** + * One coordinate ordinate. {@code proj_strtod} ({@code src/apps/proj_strtod.cpp:338}) runs + * {@code un_underscore} first, so underscores are ignored anywhere in a numeric literal: + * {@code 10_018_754.1714} is {@code 10018754.1714}. The transverse-Mercator blocks do not use + * the form, but the reader walks the whole file and {@code eqearth} does. + */ + private static double number(String text) { + return Double.parseDouble(text.indexOf('_') < 0 ? text : text.replace("_", "")); + } + + /** + * Strips a trailing {@code #} comment and surrounding whitespace, and drops the + * {@code } tags and the decorative rules. A commented-out verb — the corpus has + * {@code #roundtrip 1} twice in the {@code +algo=evenden_snyder} block, with the note "Small + * difference with poder_engsager" — therefore disappears, which is what upstream intends. + */ + private static String strip(String raw) { + int hash = raw.indexOf('#'); + String line = (hash >= 0 ? raw.substring(0, hash) : raw).trim(); + if (line.startsWith("<") || line.startsWith("-") || line.startsWith("=")) { + return ""; + } + return line; + } + + /** + * {@code [unit]}; an unrecognised unit throws rather than being guessed at, because a + * silently mis-scaled tolerance is the failure this harness exists to prevent. + * + *

The whitespace between number and unit is optional in the corpus — {@code tolerance 1cm} + * occurs — so they are separated by shape, not by splitting on spaces. + */ + private static double parseTolerance(String text, int line) { + java.util.regex.Matcher m = java.util.regex.Pattern + .compile("^([-+0-9.eE]+)\\s*([a-zA-Z]*)$").matcher(text.trim()); + if (!m.matches()) { + throw new IllegalStateException( + "builtins.gie:" + line + ": unparseable tolerance '" + text + "'"); + } + double value = Double.parseDouble(m.group(1)); + String unit = m.group(2).isEmpty() ? "m" : m.group(2); + if ("m".equals(unit)) { + return value; + } + if ("mm".equals(unit)) { + return value / 1.0e3; + } + if ("cm".equals(unit)) { + return value / 1.0e2; + } + if ("um".equals(unit)) { + return value / 1.0e6; + } + if ("nm".equals(unit)) { + return value / 1.0e9; + } + if ("km".equals(unit)) { + return value * 1.0e3; + } + throw new IllegalStateException( + "builtins.gie:" + line + ": unsupported tolerance unit '" + unit + "'"); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieCorpusTest.java b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieCorpusTest.java new file mode 100644 index 0000000..82328d3 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieCorpusTest.java @@ -0,0 +1,169 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.tmerc; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; +import org.locationtech.proj4j.tmerc.TmercGieRunner.Outcome; + +/** + * The whole of {@code builtins.gie}'s transverse-Mercator corpus — every {@code tmerc}, + * {@code etmerc} and {@code utm} row, at the file's own tolerances, read from the file. + * + *

This is the acceptance test for switching {@code +proj=tmerc} from the Evenden/Snyder series + * to Poder/Engsager. The decisive rows are the {@code +proj=tmerc +ellps=GRS80} block at + * {@code builtins.gie:7095}: it asserts {@code tolerance 50 nm} against numbers identical + * to the {@code +proj=etmerc} block's, including {@code accept 44.69 35.37} — 3,900 km from the + * central meridian, where the approximate series is out by about 1.5 km, i.e. 3×1013 + * times the bar. + */ +public class TmercGieCorpusTest { + + /** + * A parse regression must not be able to pass as a clean run, so the row inventory is pinned. + * If upstream adds a row, this fails first and with a clear message. + */ + @Test + public void corpusInventoryIsWhatWeThinkItIs() { + List rows = TmercGieCorpus.transverseMercatorRows(); + + int tmerc = 0; + int etmerc = 0; + int utm = 0; + int roundtrips = 0; + int failures = 0; + for (TmercGieCorpus.Row r : rows) { + if ("tmerc".equals(r.projection())) { + tmerc++; + } else if ("etmerc".equals(r.projection())) { + etmerc++; + } else if ("utm".equals(r.projection())) { + utm++; + } else { + fail("unexpected projection in a selected row: " + r); + } + if (r.roundtrip > 0) { + roundtrips++; + } + if (r.kind == TmercGieCorpus.FAILURE) { + failures++; + } + } + + assertEquals("tmerc rows in builtins.gie", 84, tmerc); + assertEquals("etmerc rows in builtins.gie", 12, etmerc); + assertEquals("utm rows in builtins.gie", 12, utm); + assertEquals("rows carrying a roundtrip", 61, roundtrips); + assertEquals("expect-failure rows", 3, failures); + assertEquals("transverse-Mercator rows in builtins.gie", 108, rows.size()); + } + + /** {@code +proj=tmerc} — 8 blocks, ellipsoidal and spherical, {@code +approx} and {@code +algo}. */ + @Test + public void tmerc() { + assertFamilyPasses("tmerc"); + } + + /** {@code +proj=etmerc} — {@code builtins.gie:1929-1959}, all at {@code tolerance 50 nm}. */ + @Test + public void etmerc() { + assertFamilyPasses("etmerc"); + } + + /** {@code +proj=utm} — {@code builtins.gie:7742-7787}. */ + @Test + public void utm() { + assertFamilyPasses("utm"); + } + + /** + * The two rows this stage cannot reach, keyed by their {@code operation} line — not by + * file line, because three distinct rows share line 7772: gie does not clear the pending + * {@code accept} on a new {@code operation}, so the two {@code expect failure} blocks that + * follow inherit that one. Each entry carries the specific plumbing it is waiting on. A skip is not a pass: they are tallied + * separately, printed, and if one starts passing the test fails so the entry is + * removed rather than quietly protecting a fixed row. + */ + private static final Map KNOWN_GAPS = new LinkedHashMap(); + + static { + // builtins.gie:7767 (+proj=utm +zone=32, no +ellps, tolerance 0.001 mm) was a gap here + // until the default ellipsoid was corrected: PROJ 9.8.1 appends ellps=GRS80 when no size + // or shape parameter is given (9.8.1:src/init.cpp:362) and proj4j used to default to + // WGS84, which cost 124 um of northing at lat 56. It now passes, so it is deliberately + // NOT listed -- the UNEXPECTED PASS branch below is what told us to remove it. + // + // builtins.gie:7772 (+proj=utm +zone=32 +approx) was the second gap, for a different + // reason: Registry bound utm to ExtendedTransverseMercatorProjection, which is + // Poder/Engsager only, so the +approx escape hatch had nowhere to go. Both halves have + // now landed -- Registry binds utm to TransverseMercatorProjection, and Proj4Parser + // dispatches +approx and +algo to it -- so it too is deliberately NOT listed, and again + // it was the UNEXPECTED PASS branch that said so. + // + // All 12 utm rows pass. This map is intentionally left empty rather than deleted: it is + // the mechanism that makes a future gap explicit instead of silent. + } + + private static void assertFamilyPasses(String projection) { + List rows = new ArrayList(); + for (TmercGieCorpus.Row r : TmercGieCorpus.transverseMercatorRows()) { + if (projection.equals(r.projection())) { + rows.add(r); + } + } + assertTrue("no rows selected for " + projection, !rows.isEmpty()); + + List outcomes = TmercGieRunner.runAll(rows); + int passed = 0; + int skipped = 0; + StringBuilder report = new StringBuilder(); + for (Outcome o : outcomes) { + boolean known = KNOWN_GAPS.containsKey(o.row.operation); + if (o.passed && known) { + report.append("\n UNEXPECTED PASS ").append(o.row) + .append("\n remove the KNOWN_GAPS entry for ") + .append(o.row.operation); + } else if (o.passed) { + passed++; + } else if (known) { + skipped++; + System.out.println("GIE-SKIP builtins.gie:" + o.row.line + " " + o.row.operation + + "\n " + KNOWN_GAPS.get(o.row.operation) + + "\n observed: " + o.detail); + } else { + report.append("\n FAIL ").append(o.row).append("\n ").append(o.detail); + } + } + // Printed unconditionally so a before/after comparison can be read straight off the + // surefire output, and so the skips are never invisible. + System.out.println("GIE-TALLY builtins.gie " + projection + " pass=" + passed + " skip=" + + skipped + " fail=" + (outcomes.size() - passed - skipped) + " total=" + + outcomes.size()); + if (report.length() > 0) { + fail(projection + ": " + outcomes.size() + " builtins.gie rows, " + passed + + " passed, " + skipped + " known gaps" + report); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieRunner.java b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieRunner.java new file mode 100644 index 0000000..44d146a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/tmerc/TmercGieRunner.java @@ -0,0 +1,360 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.tmerc; + +import java.util.ArrayList; +import java.util.List; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.Proj4jException; +import org.locationtech.proj4j.gie.GieComparator; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.proj.TransverseMercatorProjection; + +/** + * Executes {@link TmercGieCorpus.Row}s against Proj4J using gie's own metric. + * + *

The metric branch

+ * + *

gie picks among four ({@code 9.8.1:src/apps/gie.cpp:1120-1165}) and applying an angular + * scale to a projected target inflates the deviation by about 111,319, so the branch is named + * explicitly for every row: + * + *

    + *
  • forward — output is projected metres, so the deviation is + * {@link GieComparator#xyDist} (plain Euclidean); + *
  • inverse — output is degrees, so it is {@link GieComparator#lpDist} on the radian + * values, i.e. the geodesic distance on the very ellipsoid under test; + *
  • roundtrip — {@code proj_roundtrip} chooses by {@code proj_angular_}input, so a + * forward-direction roundtrip is measured geodesically and an inverse-direction one + * Euclidean. + *
+ * + *

The ellipsoid the geodesic runs on is derived from the {@code operation} line's own size and + * shape tokens; an unrecognised token set throws rather than silently defaulting, because a + * mis-metered 50 nm row is exactly the failure this harness exists to prevent. + * + *

{@code +approx} and {@code +algo} are applied through the setters

+ * + *

{@code Proj4Keyword} does not yet carry {@code approx} or {@code algo}, and the parser is + * owned by a different change, so this runner reads the two tokens off the {@code operation} line + * and calls {@link TransverseMercatorProjection#setApprox} / + * {@link TransverseMercatorProjection#setAlgorithm} itself. That is deliberate: the + * arithmetic and its corpus proof land independently of the plumbing, and this method body is + * precisely the five lines the parser needs. + */ +final class TmercGieRunner { + + /** gie's pass predicate is reused verbatim, so a NaN deviation fails. */ + static final class Outcome { + final TmercGieCorpus.Row row; + final boolean passed; + final String detail; + + Outcome(TmercGieCorpus.Row row, boolean passed, String detail) { + this.row = row; + this.passed = passed; + this.detail = detail; + } + } + + private static final CRSFactory CRS = new CRSFactory(); + private static final CoordinateTransformFactory TRANSFORMS = new CoordinateTransformFactory(); + + private TmercGieRunner() { + } + + /** + * Runs every row and returns one outcome each, in file order. Nothing is skipped: these three + * families need no grid and no network. + */ + static List runAll(List rows) { + List outcomes = new ArrayList(rows.size()); + for (TmercGieCorpus.Row row : rows) { + outcomes.add(run(row)); + } + return outcomes; + } + + static Outcome run(TmercGieCorpus.Row row) { + CoordinateReferenceSystem projected; + CoordinateReferenceSystem geographic; + try { + projected = projected(row.operation); + geographic = geographic(row.operation); + } catch (RuntimeException e) { + // gie defers a creation failure to expect time, so a failure expectation is + // satisfied here and a numeric one is not. + if (row.kind == TmercGieCorpus.FAILURE) { + return new Outcome(row, errnoMatches(row.errno, e), + "setup failed as expected: " + describe(e)); + } + return new Outcome(row, false, "setup failed unexpectedly: " + describe(e)); + } + + double[] shape = metricEllipsoid(row.operation); + GieComparator comparator = GieComparator.forEllipsoid(shape[0], shape[1]); + + if (row.kind == TmercGieCorpus.FAILURE) { + if (!row.hasInput) { + return new Outcome(row, false, + "expected the setup to fail, but the CRS was created"); + } + try { + transform(projected, geographic, row.inverse) + .transform(new ProjCoordinate(row.acceptX, row.acceptY), + new ProjCoordinate()); + } catch (RuntimeException e) { + return new Outcome(row, errnoMatches(row.errno, e), + "threw as expected: " + describe(e)); + } + return new Outcome(row, false, "failed to fail: the transform returned normally"); + } + + ProjCoordinate got = new ProjCoordinate(); + try { + transform(projected, geographic, row.inverse) + .transform(new ProjCoordinate(row.acceptX, row.acceptY), got); + } catch (RuntimeException e) { + return new Outcome(row, false, "threw: " + describe(e)); + } + + double d = row.inverse + ? angular(comparator, row.expectX, row.expectY, got.x, got.y) + : GieComparator.xyDist(new double[] {row.expectX, row.expectY, 0, 0}, + new double[] {got.x, got.y, 0, 0}); + String metric = row.inverse ? "geodesic on a=" + shape[0] + " f=" + shape[1] : "euclidean"; + if (!GieComparator.withinTolerance(d, row.tolerance)) { + return new Outcome(row, false, "expected (" + row.expectX + ", " + row.expectY + + ") got (" + got.x + ", " + got.y + "), deviation " + d + " m (" + metric + + ") against " + row.tolerance + " m"); + } + + if (row.roundtrip > 0) { + return roundtrip(row, projected, geographic, comparator, shape); + } + return new Outcome(row, true, "deviation " + d + " m (" + metric + ")"); + } + + /** + * {@code proj_roundtrip} ({@code 9.8.1:src/trans.cpp:591}) with its half-step phasing copied + * exactly: one forward half-step, then {@code n-1} full cycles, then one closing half-step. + */ + private static Outcome roundtrip(TmercGieCorpus.Row row, CoordinateReferenceSystem projected, + CoordinateReferenceSystem geographic, GieComparator comparator, double[] shape) { + CoordinateTransform there = transform(projected, geographic, row.inverse); + CoordinateTransform back = transform(projected, geographic, !row.inverse); + + ProjCoordinate t = new ProjCoordinate(); + try { + there.transform(new ProjCoordinate(row.acceptX, row.acceptY), t); + for (int i = 1; i < row.roundtrip; i++) { + ProjCoordinate u = new ProjCoordinate(); + back.transform(t, u); + t = new ProjCoordinate(); + there.transform(u, t); + } + ProjCoordinate closed = new ProjCoordinate(); + back.transform(t, closed); + t = closed; + } catch (RuntimeException e) { + return new Outcome(row, false, "roundtrip " + row.roundtrip + " threw: " + describe(e)); + } + + // The residual metric follows the *input* units, not the output ones. + double d = row.inverse + ? GieComparator.xyDist(new double[] {row.acceptX, row.acceptY, 0, 0}, + new double[] {t.x, t.y, 0, 0}) + : angular(comparator, row.acceptX, row.acceptY, t.x, t.y); + if (!GieComparator.withinTolerance(d, row.tolerance)) { + return new Outcome(row, false, "roundtrip " + row.roundtrip + " from (" + + row.acceptX + ", " + row.acceptY + ") came back (" + t.x + ", " + t.y + + "), deviation " + d + " m against " + row.tolerance + " m"); + } + return new Outcome(row, true, "roundtrip " + row.roundtrip + " residual " + d + " m"); + } + + private static double angular(GieComparator comparator, double lon0, double lat0, double lon1, + double lat1) { + return comparator.lpDist( + new double[] {toRad(lon0), toRad(lat0), 0, 0}, + new double[] {toRad(lon1), toRad(lat1), 0, 0}); + } + + /** + * {@code PJ_TORAD}, not {@code Math.toRadians}: PROJ computes {@code deg * M_PI / 180}, the + * JDK computes {@code deg / 180 * PI}. Up to 1 ulp apart, and 1 ulp of a radian is about + * 1.4 nm on the ellipsoid — a third of the 50 nm bar these rows carry. + */ + private static double toRad(double deg) { + return deg * Math.PI / 180.0; + } + + private static CoordinateTransform transform(CoordinateReferenceSystem projected, + CoordinateReferenceSystem geographic, boolean inverse) { + return inverse + ? TRANSFORMS.createTransform(projected, geographic) + : TRANSFORMS.createTransform(geographic, projected); + } + + /** The projected side, with {@code +approx} / {@code +algo} applied through the setters. */ + static CoordinateReferenceSystem projected(String operation) { + CoordinateReferenceSystem crs = CRS.createFromParameters("gie-proj", + operation + " +no_defs"); + Projection p = crs.getProjection(); + if (p instanceof TransverseMercatorProjection) { + TransverseMercatorProjection t = (TransverseMercatorProjection) p; + if (hasFlag(operation, "approx")) { + t.setApprox(true); + } + String algo = value(operation, "algo"); + if (algo != null) { + t.setAlgorithm(algo); + } + } else if (hasFlag(operation, "approx") || value(operation, "algo") != null) { + // +approx on +proj=utm currently has nowhere to go, because Registry binds utm to + // the Poder/Engsager-only class. Say so rather than silently ignoring it. + throw new IllegalStateException(operation + ": +approx / +algo is not settable on " + + p.getClass().getSimpleName() + "; Registry must bind this operation to " + + "TransverseMercatorProjection for the escape hatch to reach it"); + } + return crs; + } + + /** The geographic side: {@code +proj=longlat} plus the operation's own figure of the Earth. */ + static CoordinateReferenceSystem geographic(String operation) { + return CRS.createFromParameters("gie-geog", + ("+proj=longlat " + figureOfTheEarth(operation) + " +no_defs").replaceAll("\\s+", + " ")); + } + + private static String figureOfTheEarth(String operation) { + StringBuilder b = new StringBuilder(); + for (String token : operation.split("\\s+")) { + if (token.startsWith("+ellps=") || token.startsWith("+R=") || token.startsWith("+a=") + || token.startsWith("+b=") || token.startsWith("+rf=") + || token.startsWith("+f=") || token.startsWith("+datum=") + || token.startsWith("+es=") || token.startsWith("+e=")) { + b.append(token).append(' '); + } + } + return b.toString().trim(); + } + + /** + * The semi-major axis and flattening the geodesic metric must use, read off the + * {@code operation} line. + * + * @return {@code {a, f}} + * @throws IllegalStateException for any token set this harness has not been taught, so that a + * row added upstream cannot be silently measured on the wrong ellipsoid + */ + static double[] metricEllipsoid(String operation) { + Double radius = number(operation, "R"); + if (radius != null) { + return new double[] {radius.doubleValue(), 0.0}; + } + String ellps = value(operation, "ellps"); + Double a = number(operation, "a"); + if (ellps != null) { + if ("GRS80".equals(ellps)) { + return new double[] {6378137.0, 1.0 / 298.257222101}; + } + if ("WGS84".equals(ellps)) { + return new double[] {6378137.0, 1.0 / 298.257223563}; + } + if ("sphere".equals(ellps)) { + return new double[] {6370997.0, 0.0}; + } + throw new IllegalStateException(operation + ": the metric ellipsoid for +ellps=" + + ellps + " has not been declared in this harness"); + } + if (a != null) { + Double rf = number(operation, "rf"); + Double f = number(operation, "f"); + Double b = number(operation, "b"); + double flattening = 0.0; + if (rf != null) { + flattening = 1.0 / rf.doubleValue(); + } else if (f != null) { + flattening = f.doubleValue(); + } else if (b != null) { + flattening = (a.doubleValue() - b.doubleValue()) / a.doubleValue(); + } + return new double[] {a.doubleValue(), flattening}; + } + // A bare `operation +proj=X` with no size or shape gets WGS84 (init.cpp:576-581). + return new double[] {6378137.0, 1.0 / 298.257223563}; + } + + private static boolean hasFlag(String operation, String name) { + for (String token : operation.split("\\s+")) { + if (token.equals("+" + name) || token.equals(name)) { + return true; + } + } + return false; + } + + private static String value(String operation, String name) { + for (String token : operation.split("\\s+")) { + if (token.startsWith("+" + name + "=")) { + return token.substring(name.length() + 2); + } + } + return null; + } + + private static Double number(String operation, String name) { + String v = value(operation, name); + return v == null ? null : Double.valueOf(v); + } + + /** + * gie's {@code errno_from_err_const} table, restricted to the names these blocks use. An + * unrecognised name degenerates to a bare {@code expect failure}, as upstream. + */ + private static boolean errnoMatches(String errno, RuntimeException thrown) { + if (errno == null) { + return true; + } + ErrorCause expected = null; + if (errno.startsWith("coord_transfm_outside_projection_domain")) { + expected = ErrorCause.COORDINATE_OUT_OF_DOMAIN; + } else if (errno.startsWith("coord_transfm_invalid_coord")) { + expected = ErrorCause.INVALID_COORDINATE; + } else if (errno.startsWith("invalid_op_illegal_arg_value")) { + expected = ErrorCause.INVALID_PARAM_VALUE; + } + if (expected == null) { + return true; + } + return thrown instanceof Proj4jException + && ((Proj4jException) thrown).cause() == expected; + } + + private static String describe(RuntimeException e) { + String cause = e instanceof Proj4jException + ? ((Proj4jException) e).cause().name() + " " : ""; + return cause + e.getClass().getSimpleName() + ": " + e.getMessage(); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/AuthalicLatTest.java b/core/src/test/java/org/locationtech/proj4j/util/AuthalicLatTest.java new file mode 100644 index 0000000..c5e6da6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/AuthalicLatTest.java @@ -0,0 +1,395 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link AuthalicLat}, including the measurement that justifies replacing + * {@code ProjectionMath.authset}/{@code authlat} — the largest accuracy defect in proj4j's + * numerical core. + * + *

{@code ProjectionMath} is read and called here for comparison only; nothing in it is + * modified. + */ +public class AuthalicLatTest { + + private static final double A = NumericAssert.GRS80_A; + private static final double ES = NumericAssert.GRS80_ES; + private static final double E = NumericAssert.GRS80_E; + private static final double NM = NumericAssert.NM; + + private static final int STEPS = 9000; // 0.01 deg steps over 0 to 90 + + private static double lat(int i) { + return Math.toRadians(i * 0.01); + } + + /** + * The headline measurement. proj4j's three-term {@code authlat} series is over 2 mm off + * in the tropics, against the 0.1 mm bar {@code aea}'s inverse assertions set at + * {@code builtins.gie:54-60}; the order-6 series is about 1 nm, i.e. under + * {@code 1e-8 m}. + * + *

Both are handed the same, accurately computed authalic latitude, so what is + * measured is the inverse series alone. + */ + @Test + public void inverseBeatsProjectionMathByOverSixOrdersOfMagnitude() { + AuthalicLat authalic = new AuthalicLat(ES); + double[] oldApa = ProjectionMath.authset(ES); + + double worstNew = 0.0; + double worstOld = 0.0; + double worstNewAt = 0.0; + double worstOldAt = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double beta = authalic.forward(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + double errNew = Math.abs(authalic.inverse(beta) - phi) * A; + double errOld = Math.abs(ProjectionMath.authlat(beta, oldApa) - phi) * A; + if (errNew > worstNew) { + worstNew = errNew; + worstNewAt = Math.toDegrees(phi); + } + if (errOld > worstOld) { + worstOld = errOld; + worstOldAt = Math.toDegrees(phi); + } + } + + String report = "new " + (worstNew / NM) + " nm @ " + worstNewAt + " deg; old " + + (worstOld * 1000.0) + " mm @ " + worstOldAt + " deg"; + + // The requirement: under 1e-8 m equivalent. + assertTrue("new authalic inverse must be under 1e-8 m: " + report, worstNew < 1.0e-8); + // The defect being fixed: proj4j is over a millimetre, 10x+ the 0.1 mm gie bar. + assertTrue("ProjectionMath.authlat is expected to exceed 1 mm: " + report, + worstOld > 1.0e-3); + assertTrue("new authalic inverse must beat ProjectionMath by >1e5: " + report, + worstNew * 1.0e5 < worstOld); + } + + /** + * The full round trip, each stack using its own forward. proj4j's forward is the exact + * {@code asin(q/qp)} form, which is accurate away from the poles, so the round-trip + * error is dominated by the same inverse-series defect. + */ + @Test + public void roundTripBeatsProjectionMath() { + AuthalicLat authalic = new AuthalicLat(ES); + double[] oldApa = ProjectionMath.authset(ES); + double oldQp = ProjectionMath.qsfn(1.0, E, 1.0 - ES); + + double worstNew = 0.0; + double worstOld = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double sinphi = StrictMath.sin(phi); + double cosphi = StrictMath.cos(phi); + + double xi = authalic.forward(phi, sinphi, cosphi); + worstNew = Math.max(worstNew, Math.abs(authalic.inverse(xi) - phi) * A); + + double ratio = ProjectionMath.qsfn(sinphi, E, 1.0 - ES) / oldQp; + if (ratio > 1.0) { + ratio = 1.0; + } + double betaOld = StrictMath.asin(ratio); + worstOld = Math.max(worstOld, + Math.abs(ProjectionMath.authlat(betaOld, oldApa) - phi) * A); + } + String report = "new " + (worstNew / NM) + " nm; old " + (worstOld * 1000.0) + " mm"; + assertTrue("new round trip must be under 1e-8 m: " + report, worstNew < 1.0e-8); + assertTrue("proj4j's round trip is expected to exceed 1 mm: " + report, + worstOld > 1.0e-3); + } + + /** + * {@code q} must stay accurate near the equator, where {@code ProjectionMath.qsfn}'s + * {@code log((1-x)/(1+x))} form cancels. Reference is the convergent Taylor series of + * the exact expression. + */ + @Test + public void qKeepsRelativeAccuracyWhereQsfnCancels() { + AuthalicLat authalic = new AuthalicLat(ES); + double worstNew = 0.0; + double worstOld = 0.0; + for (int i = 1; i <= STEPS; i++) { + double sinphi = StrictMath.sin(lat(i)); + double reference = qReference(sinphi, ES); + worstNew = Math.max(worstNew, + Math.abs(authalic.q(sinphi) - reference) / Math.abs(reference)); + worstOld = Math.max(worstOld, + Math.abs(ProjectionMath.qsfn(sinphi, E, 1.0 - ES) - reference) + / Math.abs(reference)); + } + String report = "new " + worstNew + " old " + worstOld; + assertTrue("q relative error must be near machine precision: " + report, + worstNew < 1.0e-15); + assertTrue("ProjectionMath.qsfn is expected to be materially worse: " + report, + worstOld > 100.0 * worstNew); + } + + /** + * {@code q = (1-es) (s/(1-es s^2) + atanh(e s)/e)} with the {@code atanh} expanded as + * its Taylor series, so no cancellation can occur. {@code es < 0.007} makes the series + * converge in a handful of terms. + */ + private static double qReference(double s, double es) { + double t1 = s / (1.0 - es * s * s); + // atanh(e s)/e = sum_{k>=0} es^k s^(2k+1) / (2k+1) + double t2 = 0.0; + double term = s; + for (int k = 0; k < 200; k++) { + t2 += term / (2 * k + 1); + term *= es * s * s; + if (Math.abs(term) < 1.0e-30 * Math.abs(t2)) { + break; + } + } + return (1.0 - es) * (t1 + t2); + } + + /** + * For every Earth ellipsoid {@code n} is about 0.00168, well inside the 0.01 cutoff, so + * the series branch is always taken and there is never any iteration. + */ + @Test + public void everyEarthEllipsoidUsesTheSeriesBranch() { + double[] esValues = { + 0.0, // sphere + 0.00669437999014133, // WGS84 + ES, // GRS80 + 0.0067394967422764350, // Bessel 1841 + 0.006768657997291094, // Clarke 1866 + 0.006722670022333331, // International 1924 + 0.006674372231802145, // Krassovsky 1940 + 0.0068147849, // Airy 1830-ish + }; + for (double es : esValues) { + AuthalicLat authalic = new AuthalicLat(es); + assertTrue("es=" + es + " must use the series branch (n=" + + authalic.thirdFlattening() + ")", authalic.isSeriesValid()); + assertTrue("Earth n must be about 0.00168, was " + authalic.thirdFlattening(), + authalic.thirdFlattening() < 0.01); + assertNotNull("the forward series must be built when valid", + authalic.forwardSeries()); + } + } + + /** + * The {@code |n| >= 0.01} Newton fallback, needed for the synthetic conformance cases. + * Exercised on moderately oblate bodies where the geometry is still well conditioned; + * it must converge and must satisfy the defining relation + * {@code sin(xi) = q(sin phi) / qp} to machine precision. + */ + @Test + public void newtonFallbackHandlesOblateBodies() { + for (double f : new double[]{0.02, 0.05, 0.1, 0.2}) { + double es = 2.0 * f - f * f; + AuthalicLat authalic = new AuthalicLat(es); + assertFalse("f=" + f + " must fall outside the series cutoff", + authalic.isSeriesValid()); + assertNull("the forward series is not allocated when the cutoff is exceeded", + authalic.forwardSeries()); + assertNotNull("the inverse series is always the Newton seed", + authalic.inverseSeries()); + + double worstRoundTrip = 0.0; + double worstIdentity = 0.0; + for (int i = -890; i <= 890; i++) { + double phi = Math.toRadians(i / 10.0); + double sinphi = StrictMath.sin(phi); + double xi = authalic.forward(phi, sinphi, StrictMath.cos(phi)); + worstRoundTrip = Math.max(worstRoundTrip, Math.abs(authalic.inverse(xi) - phi)); + worstIdentity = Math.max(worstIdentity, + Math.abs(StrictMath.sin(xi) - authalic.q(sinphi) / authalic.qp())); + } + assertTrue("f=" + f + " Newton round trip " + worstRoundTrip + " rad", + worstRoundTrip < 1.0e-12); + assertTrue("f=" + f + " sin(xi) vs q/qp " + worstIdentity, + worstIdentity < 1.0e-15); + } + } + + /** + * The synthetic conformance shape {@code +a=9999999 +b=.9} must be constructible + * without throwing or producing NaN, even though upstream's gie entry for it + * ({@code builtins.gie:95}) expects the setup to fail for other reasons. + */ + @Test + public void syntheticConformanceShapeIsConstructible() { + AuthalicLat authalic = AuthalicLat.fromAxes(9999999.0, 0.9); + assertFalse(authalic.isSeriesValid()); + assertTrue("qp must stay finite for a near-degenerate shape, was " + authalic.qp(), + !Double.isNaN(authalic.qp()) && !Double.isInfinite(authalic.qp())); + // q is monotone in sin(phi) and bounded by qp for such a shape. + double previous = Double.NEGATIVE_INFINITY; + for (int i = -90; i <= 90; i++) { + double v = authalic.q(StrictMath.sin(Math.toRadians(i))); + assertTrue("q must be finite at " + i, !Double.isNaN(v)); + assertTrue("q must be non-decreasing at " + i, v >= previous); + previous = v; + } + } + + /** {@code q} must be public and must reproduce the value {@code laea}/{@code aea} need. */ + @Test + public void qIsExposedForLaeaAndAea() { + AuthalicLat authalic = new AuthalicLat(ES); + double worst = 0.0; + for (int i = 0; i <= STEPS; i += 7) { + double phi = lat(i); + double sinphi = StrictMath.sin(phi); + double xi = authalic.forward(phi, sinphi, StrictMath.cos(phi)); + // laea.cpp:39 uses q = sin(xi) * qp; it must match q(sin phi) directly. + worst = Math.max(worst, Math.abs(StrictMath.sin(xi) * authalic.qp() + - authalic.q(sinphi))); + } + assertTrue("sin(xi)*qp vs q(sin phi): " + worst, worst < 1.0e-15); + assertEquals("qp must equal q at the pole", authalic.q(1.0), authalic.qp(), 0.0); + } + + /** + * The forward series must beat the {@code asin(q/qp)} form near the pole; that + * ill-conditioning is 9.8.1's stated reason for switching, and it is what + * {@code laea}/{@code aea}/{@code cea}/{@code eqearth} inherit today. + */ + @Test + public void forwardSeriesAvoidsTheAsinIllConditioningAtThePoles() { + AuthalicLat authalic = new AuthalicLat(ES); + double worstDivergence = 0.0; + double worstAt = 0.0; + for (int i = 8900; i <= STEPS; i++) { + double phi = lat(i); + double sinphi = StrictMath.sin(phi); + double series = authalic.forward(phi, sinphi, StrictMath.cos(phi)); + double ratio = Math.min(1.0, authalic.q(sinphi) / authalic.qp()); + double viaAsin = StrictMath.asin(ratio); + double d = Math.abs(series - viaAsin) * A; + if (d > worstDivergence) { + worstDivergence = d; + worstAt = Math.toDegrees(phi); + } + } + // The two agree to sub-nanometre in the mid latitudes but the asin form degrades + // near the pole; assert the divergence is real (so the switch matters) and that it + // comes from the asin side by checking the series still round-trips exactly there. + assertTrue("the asin form must visibly degrade near the pole; max divergence " + + worstDivergence + " m @ " + worstAt + " deg", worstDivergence > 1.0e-7); + double worstRoundTrip = 0.0; + for (int i = 8900; i <= STEPS; i++) { + double phi = lat(i); + double xi = authalic.forward(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + worstRoundTrip = Math.max(worstRoundTrip, Math.abs(authalic.inverse(xi) - phi) * A); + } + assertTrue("the series still round-trips near the pole: " + (worstRoundTrip / NM) + + " nm", worstRoundTrip < 10.0 * NM); + } + + /** A sphere must reduce to the identity, with {@code q = 2 sin(phi)} and {@code qp = 2}. */ + @Test + public void sphereIsAnExactIdentity() { + AuthalicLat authalic = new AuthalicLat(0.0); + assertEquals(2.0, authalic.qp(), 0.0); + assertEquals(0.0, authalic.thirdFlattening(), 0.0); + for (int i = -STEPS; i <= STEPS; i += 137) { + double phi = lat(i); + assertEquals(2.0 * StrictMath.sin(phi), authalic.q(StrictMath.sin(phi)), 0.0); + NumericAssert.assertSameBits("forward on a sphere", phi, + authalic.forward(phi, StrictMath.sin(phi), StrictMath.cos(phi))); + NumericAssert.assertSameBits("inverse on a sphere", phi, authalic.inverse(phi)); + } + } + + /** Both directions must be exactly odd in latitude. */ + @Test + public void isOddInLatitude() { + AuthalicLat authalic = new AuthalicLat(ES); + for (int i = 1; i <= STEPS; i += 13) { + double phi = lat(i); + double xi = authalic.forward(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + double mirrored = authalic.forward(-phi, StrictMath.sin(-phi), + StrictMath.cos(-phi)); + assertEquals("forward must be odd at " + Math.toDegrees(phi), -xi, mirrored, + 1.0e-16); + assertEquals("inverse must be odd", -authalic.inverse(xi), + authalic.inverse(-xi), 1.0e-16); + assertEquals("q must be odd", -authalic.q(StrictMath.sin(phi)), + authalic.q(StrictMath.sin(-phi)), 1.0e-16); + } + } + + /** {@code fromAxes} must use PROJ's two-step shape derivation. */ + @Test + public void fromAxesUsesTheTwoStepShapeDerivation() { + double a = 6378137.0; + double b = 6356752.314140356; // GRS80 + AuthalicLat viaAxes = AuthalicLat.fromAxes(a, b); + double f = (a - b) / a; + assertEquals(2.0 * f - f * f, viaAxes.eccentricitySquared(), 0.0); + // Which is within about 1 ulp *of 1.0* of the one-step form proj4j uses today + // (DatumParameters.java:111). Measured in ulps of es itself that is roughly 112, + // because es is ~0.0067 and the difference is created by the cancellation in + // 1 - (b/a)^2. + double oneStep = 1.0 - (b / a) * (b / a); + double difference = Math.abs(viaAxes.eccentricitySquared() - oneStep); + assertTrue("two-step vs one-step es differ by " + difference + + ", i.e. " + NumericAssert.ulpDistance( + viaAxes.eccentricitySquared(), oneStep) + " ulps of es", + difference <= 2.0 * Math.ulp(1.0)); + } + + /** Repeated construction and evaluation must be bit-identical. */ + @Test + public void isDeterministic() { + for (int i = 0; i <= STEPS; i += 371) { + double phi = lat(i); + double sinphi = StrictMath.sin(phi); + double cosphi = StrictMath.cos(phi); + AuthalicLat first = new AuthalicLat(ES); + double xi = first.forward(phi, sinphi, cosphi); + double back = first.inverse(xi); + for (int rep = 0; rep < 50; rep++) { + AuthalicLat other = new AuthalicLat(ES); + NumericAssert.assertSameBits("qp", first.qp(), other.qp()); + NumericAssert.assertSameBits("forward", xi, + other.forward(phi, sinphi, cosphi)); + NumericAssert.assertSameBits("inverse", back, other.inverse(xi)); + } + } + } + + /** The convenience forward overload must compute the same sine and cosine internally. */ + @Test + public void convenienceOverloadAgreesBitForBit() { + AuthalicLat authalic = new AuthalicLat(ES); + for (int i = -STEPS; i <= STEPS; i += 97) { + double phi = lat(i); + NumericAssert.assertSameBits("forward at " + phi, + authalic.forward(phi, StrictMath.sin(phi), StrictMath.cos(phi)), + authalic.forward(phi)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/AuxLatTest.java b/core/src/test/java/org/locationtech/proj4j/util/AuxLatTest.java new file mode 100644 index 0000000..b396020 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/AuxLatTest.java @@ -0,0 +1,289 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Tests for {@link AuxLat}: which conversions exist, the n-versus-n-squared split, the + * table's structural invariants, and the closed-form derivation of the third flattening. + */ +public class AuxLatTest { + + private static final double N_GRS80 = AuxLat.thirdFlattening(NumericAssert.GRS80_ES); + + /** The eight conversions upstream's Maxima run emits, and no others. */ + private static final int[][] SUPPORTED = { + {AuxLat.RECTIFYING, AuxLat.GEOGRAPHIC}, + {AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC}, + {AuxLat.AUTHALIC, AuxLat.GEOGRAPHIC}, + {AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING}, + {AuxLat.CONFORMAL, AuxLat.RECTIFYING}, + {AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL}, + {AuxLat.RECTIFYING, AuxLat.CONFORMAL}, + {AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC}, + }; + + @Test + public void exactlyEightConversionsArePopulated() { + int count = 0; + for (int in = 0; in < AuxLat.NUMBER; in++) { + for (int out = 0; out < AuxLat.NUMBER; out++) { + if (AuxLat.isSupported(in, out)) { + count++; + } + } + } + assertEquals("only 8 of the 36 conversions are tabulated at 9.8.1", 8, count); + + for (int[] pair : SUPPORTED) { + assertTrue("expected support for " + pair[0] + "->" + pair[1], + AuxLat.isSupported(pair[0], pair[1])); + // And it must actually produce finite coefficients. + double[] f = AuxLat.coeffs(N_GRS80, pair[0], pair[1]); + assertEquals(AuxLat.ORDER, f.length); + for (int i = 0; i < f.length; i++) { + assertTrue("coefficient " + i + " must be finite", !Double.isNaN(f[i]) + && !Double.isInfinite(f[i])); + } + } + } + + @Test + public void unsupportedConversionPairThrows() { + // Parametric and geocentric latitudes have no tabulated matrices at all. + assertUnsupported(AuxLat.GEOGRAPHIC, AuxLat.PARAMETRIC); + assertUnsupported(AuxLat.PARAMETRIC, AuxLat.GEOGRAPHIC); + assertUnsupported(AuxLat.GEOCENTRIC, AuxLat.CONFORMAL); + // Nor do the identities, nor authalic <-> conformal, nor authalic <-> rectifying. + assertUnsupported(AuxLat.GEOGRAPHIC, AuxLat.GEOGRAPHIC); + assertUnsupported(AuxLat.CONFORMAL, AuxLat.AUTHALIC); + assertUnsupported(AuxLat.AUTHALIC, AuxLat.CONFORMAL); + assertUnsupported(AuxLat.AUTHALIC, AuxLat.RECTIFYING); + assertUnsupported(AuxLat.RECTIFYING, AuxLat.AUTHALIC); + + assertFalse(AuxLat.isSupported(AuxLat.GEOGRAPHIC, AuxLat.PARAMETRIC)); + assertFalse(AuxLat.isSupported(-1, 0)); + assertFalse(AuxLat.isSupported(0, AuxLat.NUMBER)); + } + + @Test + public void outOfRangeLatitudeIndexThrows() { + assertUnsupported(-1, AuxLat.GEOGRAPHIC); + assertUnsupported(AuxLat.GEOGRAPHIC, AuxLat.NUMBER); + assertUnsupported(AuxLat.NUMBER, AuxLat.NUMBER); + assertUnsupported(Integer.MIN_VALUE, 0); + } + + private static void assertUnsupported(int auxin, int auxout) { + try { + AuxLat.coeffs(N_GRS80, auxin, auxout, new double[AuxLat.ORDER]); + fail("expected IllegalArgumentException for " + auxin + " -> " + auxout); + } catch (IllegalArgumentException expected) { + assertTrue("message should name the problem: " + expected.getMessage(), + expected.getMessage() != null && !expected.getMessage().isEmpty()); + } + } + + /** + * The phi/mu pair expands in {@code n^2} and everything else in {@code n}; the split + * is at {@code latitudes.cpp:342}. Detect it structurally: for a polynomial in + * {@code n^2}, replacing {@code n} by {@code -n} must map {@code F[l]} to + * {@code (-1)^(l+1) F[l]} exactly, because the only remaining odd factor is the + * leading {@code d = n^(l+1)}. For the other pairs that symmetry fails. + */ + @Test + public void phiMuUsesPolynomialInNSquared() { + final double n = 0.05; + assertOddEvenSymmetry(AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING, n, true); + assertOddEvenSymmetry(AuxLat.RECTIFYING, AuxLat.GEOGRAPHIC, n, true); + assertOddEvenSymmetry(AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL, n, false); + assertOddEvenSymmetry(AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC, n, false); + assertOddEvenSymmetry(AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC, n, false); + assertOddEvenSymmetry(AuxLat.AUTHALIC, AuxLat.GEOGRAPHIC, n, false); + assertOddEvenSymmetry(AuxLat.RECTIFYING, AuxLat.CONFORMAL, n, false); + assertOddEvenSymmetry(AuxLat.CONFORMAL, AuxLat.RECTIFYING, n, false); + } + + private static void assertOddEvenSymmetry(int in, int out, double n, boolean expected) { + double[] p = AuxLat.coeffs(n, in, out); + double[] m = AuxLat.coeffs(-n, in, out); + boolean symmetric = true; + for (int l = 0; l < AuxLat.ORDER; l++) { + double sign = ((l + 1) % 2 == 0) ? 1.0 : -1.0; + if (m[l] != sign * p[l]) { + symmetric = false; + break; + } + } + assertEquals("n^2 expansion for " + in + "->" + out, expected, symmetric); + } + + /** + * The first coefficient of each series has a known leading term in {@code n}; these + * are the entries any transcription typo would disturb first. + */ + @Test + public void leadingCoefficientsMatchUpstreamRationals() { + final double n = 0.05; + assertLeading(AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING, n, -3.0 / 2.0); + assertLeading(AuxLat.RECTIFYING, AuxLat.GEOGRAPHIC, n, 3.0 / 2.0); + assertLeading(AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL, n, -2.0); + assertLeading(AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC, n, 2.0); + assertLeading(AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC, n, -4.0 / 3.0); + assertLeading(AuxLat.AUTHALIC, AuxLat.GEOGRAPHIC, n, 4.0 / 3.0); + assertLeading(AuxLat.RECTIFYING, AuxLat.CONFORMAL, n, -1.0 / 2.0); + assertLeading(AuxLat.CONFORMAL, AuxLat.RECTIFYING, n, 1.0 / 2.0); + } + + private static void assertLeading(int in, int out, double n, double expected) { + // F[0] = n * (c0 + O(n)), so F[0]/n -> c0 as n -> 0. + double small = 1.0e-8; + double f0 = AuxLat.coeffs(small, in, out)[0]; + assertEquals(in + "->" + out, expected, f0 / small, 1.0e-7); + } + + /** + * Each conversion and its reverse must compose to the identity to within series + * truncation, which is the strongest end-to-end check on the table that does not need + * an external reference. + */ + @Test + public void forwardAndReverseSeriesCompose() { + final double n = N_GRS80; + assertComposesToIdentity(n, AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING); + assertComposesToIdentity(n, AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL); + assertComposesToIdentity(n, AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC); + assertComposesToIdentity(n, AuxLat.RECTIFYING, AuxLat.CONFORMAL); + } + + private static void assertComposesToIdentity(double n, int a, int b) { + Clenshaw6 ab = Clenshaw6.forConversion(n, a, b); + Clenshaw6 ba = Clenshaw6.forConversion(n, b, a); + double worst = 0.0; + for (int i = -900; i <= 900; i++) { + double zeta = Math.toRadians(i / 10.0); + double back = ba.convert(ab.convert(zeta)); + worst = Math.max(worst, Math.abs(back - zeta) * NumericAssert.GRS80_A); + } + assertTrue(a + "<->" + b + " round trip " + worst + " m must be under 10 nm", + worst < 10.0 * NumericAssert.NM); + } + + /** + * The closed form {@code n = es / (1 + sqrt(1 - es))^2} must agree with upstream's + * {@code pow(tan(asin(e)/2), 2)} to within 2 ULP, which is the whole justification + * for trading three platform-dependent libm calls for one exactly-rounded + * {@code sqrt}. + */ + @Test + public void thirdFlatteningAgreesWithUpstreamToTwoUlp() { + double[] esValues = { + 0.0, // sphere + 0.00669437999014133, // WGS84 + NumericAssert.GRS80_ES, // GRS80 + 0.0067394967422764350, // Bessel 1841 + 0.006768657997291094, // Clarke 1866 + 0.006722670022333331, // International 1924 + 0.0818191908426215 * 0.0818191908426215, // e given directly + 0.09, // synthetic + 0.19, // f = 0.1 + 0.36, // f = 0.2 + }; + for (double es : esValues) { + double n = AuxLat.thirdFlattening(es); + double reference = StrictMath.pow(StrictMath.tan(StrictMath.asin(Math.sqrt(es)) / 2.0), 2.0); + long ulps = NumericAssert.ulpDistance(n, reference); + assertTrue("es=" + es + ": n=" + n + " vs pow(tan(asin(e)/2),2)=" + reference + + " differ by " + ulps + " ulps", ulps <= 2); + } + } + + /** + * {@code n = es / (1 + sqrt(1 - es))^2} must also be algebraically consistent with + * {@code n = f / (2 - f)} and with {@code (a - b) / (a + b)}. + */ + @Test + public void thirdFlatteningIsConsistentWithFlattening() { + for (double f = 0.0; f < 0.3; f += 0.0005) { + double es = 2.0 * f - f * f; + double n = AuxLat.thirdFlattening(es); + assertEquals("f=" + f, f / (2.0 - f), n, 4.0e-16); + double a = 1.0; + double b = 1.0 - f; + assertEquals("f=" + f, (a - b) / (a + b), n, 4.0e-16); + } + } + + /** + * {@code pj_rectifying_radius} must reproduce the GRS80 quarter meridian, a widely + * published number, and be exactly 1 for a sphere. + */ + @Test + public void rectifyingRadiusMatchesQuarterMeridian() { + assertEquals(1.0, AuxLat.rectifyingRadius(0.0), 0.0); + double rr = AuxLat.rectifyingRadius(N_GRS80); + double quarterMeridian = rr * (Math.PI / 2.0) * NumericAssert.GRS80_A; + // GRS80 quarter meridian = 10 001 965.729 m. + assertEquals(10001965.729, quarterMeridian, 1.0e-3); + // And it must equal the independent quadrature to a nanometre. + double reference = NumericAssert.meridianArcReference(Math.PI / 2.0, + NumericAssert.GRS80_ES) * NumericAssert.GRS80_A; + assertEquals(reference, quarterMeridian, 5.0 * NumericAssert.NM); + } + + @Test + public void polyvalIsHornerAndHandlesNegativeDegree() { + double[] p = {1.0, 2.0, 3.0, 4.0}; + assertEquals(1.0 + 2.0 * 2.0 + 3.0 * 4.0 + 4.0 * 8.0, AuxLat.polyval(2.0, p), 0.0); + assertEquals(1.0, AuxLat.polyval(2.0, p, 0, 0), 0.0); + assertEquals(0.0, AuxLat.polyval(2.0, p, 0, -1), 0.0); + // Offset form: start at index 1, degree 1 -> 2 + 3x + assertEquals(2.0 + 3.0 * 5.0, AuxLat.polyval(5.0, p, 1, 1), 0.0); + } + + /** A sphere must produce all-zero coefficients, so every conversion is the identity. */ + @Test + public void sphereGivesZeroCoefficients() { + for (int[] pair : SUPPORTED) { + double[] f = AuxLat.coeffs(0.0, pair[0], pair[1]); + for (int i = 0; i < f.length; i++) { + assertEquals(pair[0] + "->" + pair[1] + " [" + i + "]", 0.0, f[i], 0.0); + } + } + } + + /** The coefficient table must be stateless: repeated calls give identical bits. */ + @Test + public void coefficientsAreDeterministic() { + for (int[] pair : SUPPORTED) { + double[] a = AuxLat.coeffs(N_GRS80, pair[0], pair[1]); + for (int rep = 0; rep < 3; rep++) { + double[] b = AuxLat.coeffs(N_GRS80, pair[0], pair[1]); + for (int i = 0; i < a.length; i++) { + NumericAssert.assertSameBits(pair[0] + "->" + pair[1] + "[" + i + "]", + a[i], b[i]); + } + } + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/CRSCacheTest.java b/core/src/test/java/org/locationtech/proj4j/util/CRSCacheTest.java new file mode 100644 index 0000000..0739826 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/CRSCacheTest.java @@ -0,0 +1,368 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; + +/** + * {@link CRSCache} after it was deprecated and bounded. + * + *

Three things had to be true and none of them were: the cache must be bounded (it was two + * unbounded {@code ConcurrentHashMap}s keyed on the raw untrusted string), its keys must be + * unambiguous (two components were concatenated, so one question could be answered with + * another's answer), and a failure must not be memoised as a plausible value. + * + *

Every bound below is shown rejecting something and accepting legitimate input, and the + * key-collision test is written as a pair: the colliding inputs must produce the answers + * {@link CRSFactory} produces, and the test first proves those two answers are actually + * different - otherwise a collision would be undetectable and the test vacuous. + */ +@SuppressWarnings("deprecation") +public class CRSCacheTest { + + // ========================================================================================== + // Correctness: the cache must agree with the factory, always + // ========================================================================================== + + @Test + public void everyLookupAgreesWithTheUncachedFactory() { + CRSFactory factory = new CRSFactory(); + CRSCache cache = new CRSCache(); + + String[] names = {"EPSG:4326", "epsg:4326", "EPSG:3857", "EPSG:2193", "ESRI:102008", + "NAD83:101", "world:palestine"}; + for (int i = 0; i < names.length; i++) { + CoordinateReferenceSystem expected = factory.createFromName(names[i]); + CoordinateReferenceSystem first = cache.createFromName(names[i]); + CoordinateReferenceSystem second = cache.createFromName(names[i]); + assertEquals(names[i], Arrays.toString(expected.getParameters()), + Arrays.toString(first.getParameters())); + assertEquals(names[i] + " must be the same instance on a hit", first, second); + } + assertEquals("every distinct name must have been retained", names.length, cache.size()); + } + + /** + * The key collision. {@code ("EPSG:4326", "+proj=merc")} and {@code ("EPSG:4326+proj=merc", "")} + * concatenated to the same old key, and {@code {"+proj=merc","+lat_ts=0"}} joined on a space to + * the same string as {@code {"+proj=merc +lat_ts=0"}} although the factory does not treat those + * alike. Either collision hands back a CRS that was never asked for. + */ + @Test + public void collidingKeysReturnTheirOwnAnswers() { + CRSFactory factory = new CRSFactory(); + CRSCache cache = new CRSCache(); + + // --- pair 1: name/paramStr boundary ----------------------------------------------- + String nameA = "EPSG:4326"; + String paramsA = "+proj=merc +lat_ts=0 +datum=WGS84"; + String nameB = nameA + paramsA; + String paramsB = ""; + + CoordinateReferenceSystem refA = factory.createFromParameters(nameA, paramsA); + // paramsB is empty: the factory's own answer for it is the control, whatever it is. + CoordinateReferenceSystem refB; + try { + refB = factory.createFromParameters(nameB, paramsB); + } catch (RuntimeException e) { + refB = null; + } + + CoordinateReferenceSystem gotA = cache.createFromParameters(nameA, paramsA); + assertEquals("the cache disagreed with the factory on the first of a colliding pair", + Arrays.toString(refA.getParameters()), Arrays.toString(gotA.getParameters())); + + if (refB != null) { + CoordinateReferenceSystem gotB = cache.createFromParameters(nameB, paramsB); + assertEquals("the cache answered the second of a colliding pair with the first's CRS", + Arrays.toString(refB.getParameters()), Arrays.toString(gotB.getParameters())); + // The control: the two answers really are distinguishable, so the assertion above + // could have failed. + assertFalse("the two halves of the colliding pair have identical parameters, so this " + + "test cannot detect a collision at all", + Arrays.toString(refA.getParameters()) + .equals(Arrays.toString(refB.getParameters()))); + } else { + // Even so: the second must FAIL rather than be answered from the first's entry. + try { + cache.createFromParameters(nameB, paramsB); + fail("the cache answered a definition the factory rejects - it served the " + + "colliding entry instead"); + } catch (RuntimeException expected) { + // right + } + } + + // --- pair 2: the String[] join ---------------------------------------------------- + String[] split = {"+proj=merc", "+lat_ts=0"}; + String[] fused = {"+proj=merc +lat_ts=0"}; + String refSplit = safeToString(factory, split); + String refFused = safeToString(factory, fused); + assertFalse("{\"a\",\"b\"} and {\"a b\"} produce identical results from the factory, so " + + "the space-join collision is undetectable and this test is vacuous", + refSplit.equals(refFused)); + assertEquals("split array", refSplit, safeToString(cache, split)); + assertEquals("fused array - answered from the split entry's key", refFused, + safeToString(cache, fused)); + } + + // ========================================================================================== + // The bound: rejecting, and accepting + // ========================================================================================== + + /** REJECTING: the OOM vector. Distinct untrusted keys cannot grow the cache without limit. */ + @Test + public void anUnboundedStreamOfDistinctKeysIsBounded() { + CRSCache cache = new CRSCache(16); + for (int i = 0; i < 2000; i++) { + CoordinateReferenceSystem crs = + cache.createFromParameters("crs" + i, "+proj=merc +lat_0=" + (i % 80) * 0.1); + assertNotNull(crs); + } + assertTrue("2000 distinct keys left " + cache.size() + " entries under a 16-entry ceiling", + cache.size() <= 17); + assertTrue("nothing was evicted, so nothing was bounded", cache.evictionCount() >= 1900); + } + + /** ACCEPTING: under the ceiling nothing is evicted and every entry is retained. */ + @Test + public void aWorkloadInsideTheCeilingIsNotEvicted() { + CRSCache cache = new CRSCache(64); + for (int round = 0; round < 5; round++) { + for (int i = 0; i < 20; i++) { + assertNotNull(cache.createFromParameters("crs" + i, "+proj=merc +lat_0=" + i)); + } + } + assertEquals("a 20-key workload under a 64-entry ceiling must not evict", + 0L, cache.evictionCount()); + assertEquals(20, cache.size()); + } + + /** Eviction costs a rebuild, never an answer. */ + @Test + public void anEvictedEntryRebuildsToTheSameThing() { + CRSFactory factory = new CRSFactory(); + CRSCache cache = new CRSCache(2); + String expected = Arrays.toString(factory.createFromName("EPSG:4326").getParameters()); + + assertEquals(expected, Arrays.toString(cache.createFromName("EPSG:4326").getParameters())); + cache.createFromName("EPSG:3857"); + cache.createFromName("EPSG:2193"); + cache.createFromName("EPSG:32633"); + assertTrue("EPSG:4326 was never evicted, so the rebuild path was not exercised", + cache.evictionCount() > 0); + assertEquals("the rebuilt CRS differs from the original", expected, + Arrays.toString(cache.createFromName("EPSG:4326").getParameters())); + } + + @Test + public void theCeilingIsConfigurableAndNonsenseFallsBackToTheDefault() { + assertEquals(CRSCache.DEFAULT_MAX_ENTRIES, new CRSCache(0).maxEntries()); + assertEquals(CRSCache.DEFAULT_MAX_ENTRIES, new CRSCache(-5).maxEntries()); + assertEquals(7, new CRSCache(7).maxEntries()); + } + + // ========================================================================================== + // Failures + // ========================================================================================== + + /** + * A failure is rethrown, not memoised - so a stream of unresolvable names cannot grow the + * cache, and the caller sees exactly what {@link CRSFactory} would have thrown. + */ + @Test + public void failuresAreRethrownAndNotRetained() { + CRSCache cache = new CRSCache(64); + for (int i = 0; i < 200; i++) { + try { + cache.createFromName("bogus_authority_" + i + ":1"); + fail("bogus_authority_" + i + ":1 resolved"); + } catch (RuntimeException expected) { + // right + } + } + assertEquals("a failed construction was retained; a stream of unresolvable names can grow " + + "the cache", 0, cache.size()); + + // The same name fails the same way twice ... + String first = messageOfFailure(cache, "bogus:1"); + String second = messageOfFailure(cache, "bogus:1"); + assertEquals(first, second); + + // ... and a good name still works. + assertNotNull(cache.createFromName("EPSG:4326")); + } + + /** + * The record correction, asserted rather than asserted-in-prose. {@code performance.md} said + * this class "memoises null on IOException". It did not: {@code computeIfAbsent} installs no + * mapping for a null result. A genuine "no such code" is now memoised - and the test proves the + * memoisation is real by requiring the entry to be retained. + */ + @Test + public void aGenuineNullFromTheReverseLookupIsMemoisedAndCorrect() { + CRSFactory factory = new CRSFactory(); + CRSCache cache = new CRSCache(64); + + String[] nonsense = {"+proj=not_a_projection", "+lat_0=1234"}; + String reference; + try { + reference = factory.readEpsgFromParameters(nonsense); + } catch (java.io.IOException e) { + throw new AssertionError(e); + } + assertNull("the control input must have no EPSG code, or this test measures nothing", + reference); + + assertNull(cache.readEpsgFromParameters(nonsense)); + assertEquals("the null was not retained, so it is re-scanned on every call", 1, cache.size()); + assertNull(cache.readEpsgFromParameters(nonsense)); + assertEquals(1, cache.size()); + + // ACCEPTING: a real parameter set still resolves to its code, through the cache. + String[] wgs84 = new CRSFactory().createFromName("EPSG:4326").getParameters(); + String expected; + try { + expected = factory.readEpsgFromParameters(wgs84); + } catch (java.io.IOException e) { + throw new AssertionError(e); + } + assertNotNull("EPSG:4326's own parameters must reverse-resolve, or the accepting half of " + + "this test proves nothing", expected); + assertEquals(expected, cache.readEpsgFromParameters(wgs84)); + } + + // ========================================================================================== + // The deprecated seeding constructor + // ========================================================================================== + + @Test + public void theTwoMapConstructorSeedsWithoutRetainingTheCallersMaps() { + java.util.concurrent.ConcurrentHashMap seedCrs = + new java.util.concurrent.ConcurrentHashMap(); + java.util.concurrent.ConcurrentHashMap seedEpsg = + new java.util.concurrent.ConcurrentHashMap(); + CoordinateReferenceSystem sentinel = new CRSFactory().createFromName("EPSG:3857"); + seedCrs.put("EPSG:4326", sentinel); + seedEpsg.put("+proj=nonsense", "SEEDED"); + + CRSCache cache = new CRSCache(seedCrs, seedEpsg); + + // Seeded entries are served, so the seeding is not decorative. + assertEquals("the seeded name entry was not served", sentinel, + cache.createFromName("EPSG:4326")); + assertEquals("the seeded EPSG entry was not served", "SEEDED", + cache.readEpsgFromParameters("+proj=nonsense")); + + // ... but the caller's maps are not retained, which is the whole point of bounding. + seedCrs.clear(); + seedEpsg.clear(); + assertEquals(sentinel, cache.createFromName("EPSG:4326")); + for (int i = 0; i < 5000; i++) { + seedCrs.put("junk" + i, sentinel); + } + assertTrue("the cache grew with the caller's map, so it is still unbounded", + cache.size() < 100); + } + + // ========================================================================================== + // Concurrency + // ========================================================================================== + + @Test + public void concurrentDemandAgreesAndBuildsEachKeyOnce() throws Exception { + final CRSCache cache = new CRSCache(64); + final String expected = + Arrays.toString(new CRSFactory().createFromName("EPSG:4326").getParameters()); + final AtomicInteger mismatches = new AtomicInteger(); + final int threads = 8; + + ExecutorService pool = Executors.newFixedThreadPool(threads); + try { + List> futures = new ArrayList>(); + for (int t = 0; t < threads; t++) { + futures.add(pool.submit(new Callable() { + @Override + public Void call() { + for (int i = 0; i < 300; i++) { + CoordinateReferenceSystem crs = cache.createFromName("EPSG:4326"); + if (!expected.equals(Arrays.toString(crs.getParameters()))) { + mismatches.incrementAndGet(); + } + } + return null; + } + })); + } + for (int i = 0; i < futures.size(); i++) { + futures.get(i).get(60, TimeUnit.SECONDS); + } + } finally { + pool.shutdownNow(); + } + assertEquals("threads disagreed about EPSG:4326", 0, mismatches.get()); + assertEquals(1, cache.size()); + } + + // ========================================================================================== + + private static String safeToString(CRSFactory factory, String[] params) { + try { + CoordinateReferenceSystem crs = factory.createFromParameters("n", params); + return crs == null ? "null" : Arrays.toString(crs.getParameters()); + } catch (RuntimeException e) { + return e.getClass().getName() + ": " + e.getMessage(); + } + } + + private static String safeToString(CRSCache cache, String[] params) { + try { + CoordinateReferenceSystem crs = cache.createFromParameters("n", params); + return crs == null ? "null" : Arrays.toString(crs.getParameters()); + } catch (RuntimeException e) { + return e.getClass().getName() + ": " + e.getMessage(); + } + } + + private static String messageOfFailure(CRSCache cache, String name) { + try { + cache.createFromName(name); + fail(name + " resolved"); + return null; + } catch (RuntimeException e) { + return e.getClass().getName() + ": " + e.getMessage(); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/Clenshaw6Test.java b/core/src/test/java/org/locationtech/proj4j/util/Clenshaw6Test.java new file mode 100644 index 0000000..85142b7 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/Clenshaw6Test.java @@ -0,0 +1,255 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Tests for {@link Clenshaw6}: that the recurrence really evaluates the Fourier sum, that + * the sine/cosine-preserving form agrees with the angle form, that {@code X} is formed the + * accurate way, and that the class holds no array. + */ +public class Clenshaw6Test { + + /** + * Direct evaluation of {@code sum(F[k] sin((2k+2) zeta))}, the definition Clenshaw is + * a rearrangement of. Slow and obviously correct. + */ + private static double direct(double[] f, double zeta) { + double sum = 0.0; + for (int k = 0; k < f.length; k++) { + sum += f[k] * StrictMath.sin((2 * k + 2) * zeta); + } + return sum; + } + + @Test + public void recurrenceEqualsTheDirectFourierSum() { + double[] f = {0.5, -0.25, 0.125, -0.0625, 0.03125, -0.015625}; + Clenshaw6 c = new Clenshaw6(f); + double worst = 0.0; + for (int i = -3600; i <= 3600; i++) { + double zeta = Math.toRadians(i / 10.0); + double got = c.delta(StrictMath.sin(zeta), StrictMath.cos(zeta)); + worst = Math.max(worst, Math.abs(got - direct(f, zeta))); + } + assertTrue("Clenshaw vs direct sum differed by " + worst, worst < 1.0e-15); + } + + @Test + public void recurrenceEqualsTheDirectFourierSumForRealCoefficients() { + double n = AuxLat.thirdFlattening(NumericAssert.GRS80_ES); + int[][] pairs = { + {AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING}, + {AuxLat.RECTIFYING, AuxLat.GEOGRAPHIC}, + {AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL}, + {AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC}, + {AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC}, + {AuxLat.AUTHALIC, AuxLat.GEOGRAPHIC}, + {AuxLat.RECTIFYING, AuxLat.CONFORMAL}, + {AuxLat.CONFORMAL, AuxLat.RECTIFYING}, + }; + for (int[] pair : pairs) { + double[] f = AuxLat.coeffs(n, pair[0], pair[1]); + Clenshaw6 c = new Clenshaw6(f); + double worst = 0.0; + for (int i = -900; i <= 900; i++) { + double zeta = Math.toRadians(i / 10.0); + double got = c.delta(StrictMath.sin(zeta), StrictMath.cos(zeta)); + worst = Math.max(worst, Math.abs(got - direct(f, zeta))); + } + assertTrue(pair[0] + "->" + pair[1] + " worst " + worst, worst < 1.0e-17); + } + } + + /** + * {@code X = 2 (c - s)(c + s)} must equal {@code 2 cos(2 zeta)}, and must be at least + * as accurate as {@code 2 (2 c^2 - 1)} near {@code zeta = pi/4} where that form + * cancels. Probed through {@link Clenshaw6#delta} with a single non-zero coefficient, + * for which {@code delta = F0 sin(2 zeta)} and the {@code X}-dependence vanishes — so + * the check is done on {@code X} itself, reconstructed from a two-term series. + */ + @Test + public void xIsFormedTheAccurateWay() { + // With F = {0, 1, 0, 0, 0, 0}: delta = sin(4 zeta) = sin(2 zeta) * X, since + // sin(4z) = 2 sin(2z) cos(2z) and X = 2 cos(2z). + Clenshaw6 c = new Clenshaw6(new double[]{0.0, 1.0, 0.0, 0.0, 0.0, 0.0}); + double worstNew = 0.0; + double worstNaive = 0.0; + for (int i = -100; i <= 100; i++) { + // Cluster tightly around pi/4, where 2*c*c - 1 loses its leading digits. + double zeta = Math.PI / 4.0 + i * 1.0e-9; + double s = StrictMath.sin(zeta); + double cc = StrictMath.cos(zeta); + double reference = StrictMath.sin(4.0 * zeta); + double got = c.delta(s, cc); + double naive = 2.0 * s * cc * (2.0 * (2.0 * cc * cc - 1.0)); + worstNew = Math.max(worstNew, Math.abs(got - reference)); + worstNaive = Math.max(worstNaive, Math.abs(naive - reference)); + } + assertTrue("(c-s)(c+s) form " + worstNew + " must beat 2c^2-1 form " + worstNaive, + worstNew <= worstNaive); + assertTrue("(c-s)(c+s) form should be near machine precision, was " + worstNew, + worstNew < 1.0e-15); + } + + @Test + public void convertAddsDeltaToZeta() { + Clenshaw6 c = Clenshaw6.forConversion(AuxLat.thirdFlattening(NumericAssert.GRS80_ES), + AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL); + for (int i = -90; i <= 90; i += 3) { + double zeta = Math.toRadians(i); + double s = StrictMath.sin(zeta); + double cc = StrictMath.cos(zeta); + assertEquals(zeta + c.delta(s, cc), c.convert(zeta, s, cc), 0.0); + // The one-argument form must compute the same sine and cosine internally. + NumericAssert.assertSameBits("lat " + i, c.convert(zeta, s, cc), c.convert(zeta)); + } + } + + /** + * {@code convertSinCos} must return the sine and cosine of exactly what + * {@code convert} returns, and must be a unit vector even where {@code cos} is tiny — + * that relative accuracy near the poles is the reason 9.8.1's etmerc inverse uses it. + */ + @Test + public void convertSinCosAgreesWithConvertAndStaysNormalised() { + Clenshaw6 c = Clenshaw6.forConversion(AuxLat.thirdFlattening(NumericAssert.GRS80_ES), + AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC); + double[] out = new double[2]; + double worst = 0.0; + double worstNorm = 0.0; + for (int i = -9000; i <= 9000; i++) { + double zeta = Math.toRadians(i / 100.0); + double s = StrictMath.sin(zeta); + double cc = StrictMath.cos(zeta); + c.convertSinCos(s, cc, out); + double eta = c.convert(zeta, s, cc); + worst = Math.max(worst, Math.abs(out[0] - StrictMath.sin(eta))); + worst = Math.max(worst, Math.abs(out[1] - StrictMath.cos(eta))); + worstNorm = Math.max(worstNorm, + Math.abs(MathHelpers.norm2(out[0], out[1]) - 1.0)); + } + assertTrue("convertSinCos vs sin/cos(convert): " + worst, worst < 1.0e-15); + assertTrue("convertSinCos must stay on the unit circle: " + worstNorm, + worstNorm < 1.0e-15); + } + + /** + * Exactly at the pole the sine/cosine form must give {@code (1, 0)} without any + * cancellation, since the correction is zero there. + */ + @Test + public void convertSinCosIsExactAtThePole() { + Clenshaw6 c = Clenshaw6.forConversion(AuxLat.thirdFlattening(NumericAssert.GRS80_ES), + AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC); + double[] out = new double[2]; + c.convertSinCos(1.0, 0.0, out); + assertEquals(1.0, out[0], 1.0e-16); + assertEquals(0.0, out[1], 1.0e-16); + c.convertSinCos(0.0, 1.0, out); + assertEquals(0.0, out[0], 0.0); + assertEquals(1.0, out[1], 0.0); + } + + /** + * The class must hold six scalar fields and no array: that is what lets the JIT + * keep the coefficients in registers and elides a bounds check per row of a bulk + * transform. Also asserted: the fields are final, so instances are immutable and + * shareable across threads. + */ + @Test + public void holdsNoArrayAndIsImmutable() { + Field[] fields = Clenshaw6.class.getDeclaredFields(); + int scalars = 0; + for (Field f : fields) { + if (Modifier.isStatic(f.getModifiers())) { + continue; + } + assertFalse("Clenshaw6 must not hold an array field: " + f.getName(), + f.getType().isArray()); + assertTrue("Clenshaw6 must not hold a reference field: " + f.getName(), + f.getType().isPrimitive()); + assertEquals("field " + f.getName() + " must be double", Double.TYPE, f.getType()); + assertTrue("field " + f.getName() + " must be final", + Modifier.isFinal(f.getModifiers())); + scalars++; + } + assertEquals("exactly six coefficient fields", 6, scalars); + } + + /** Repeated evaluation must return bit-identical results. */ + @Test + public void isDeterministic() { + Clenshaw6 c = Clenshaw6.forConversion(AuxLat.thirdFlattening(NumericAssert.GRS80_ES), + AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC); + for (int i = -900; i <= 900; i += 37) { + double zeta = Math.toRadians(i / 10.0); + double s = StrictMath.sin(zeta); + double cc = StrictMath.cos(zeta); + double first = c.delta(s, cc); + for (int rep = 0; rep < 1000; rep++) { + NumericAssert.assertSameBits("delta at " + zeta, first, c.delta(s, cc)); + } + // And a second instance built from the same n must agree bit for bit. + Clenshaw6 c2 = Clenshaw6.forConversion( + AuxLat.thirdFlattening(NumericAssert.GRS80_ES), + AuxLat.GEOGRAPHIC, AuxLat.AUTHALIC); + NumericAssert.assertSameBits("independent instance", first, c2.delta(s, cc)); + } + } + + @Test + public void coefficientAccessorsRoundTrip() { + double[] f = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + Clenshaw6 c = new Clenshaw6(f); + for (int k = 0; k < 6; k++) { + assertEquals(f[k], c.coefficient(k), 0.0); + } + try { + c.coefficient(6); + fail("expected IndexOutOfBoundsException"); + } catch (IndexOutOfBoundsException expected) { + // Expected. + } + // The offset constructor must read the requested window. + double[] wide = {9.0, 9.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + Clenshaw6 offset = new Clenshaw6(wide, 2); + for (int k = 0; k < 6; k++) { + assertEquals(f[k], offset.coefficient(k), 0.0); + } + } + + /** Zero coefficients must give exactly zero, so a sphere is an exact identity. */ + @Test + public void zeroCoefficientsGiveExactlyZero() { + Clenshaw6 c = new Clenshaw6(new double[6]); + for (int i = -90; i <= 90; i += 5) { + double zeta = Math.toRadians(i); + assertEquals(0.0, c.delta(StrictMath.sin(zeta), StrictMath.cos(zeta)), 0.0); + NumericAssert.assertSameBits("identity at " + i, zeta, c.convert(zeta)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/ConformalLatTest.java b/core/src/test/java/org/locationtech/proj4j/util/ConformalLatTest.java new file mode 100644 index 0000000..123e7ad --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/ConformalLatTest.java @@ -0,0 +1,293 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link ConformalLat}, including the measurements that justify replacing + * {@code ProjectionMath.phi2} and {@code ProjectionMath.tsfn}. + * + *

{@code ProjectionMath} is read and called here for comparison only; nothing in it is + * modified. + * + * @see PjPhi2Test for the verbatim port of upstream's own unit test + */ +public class ConformalLatTest { + + private static final double A = NumericAssert.GRS80_A; + private static final double ES = NumericAssert.GRS80_ES; + private static final double E = NumericAssert.GRS80_E; + private static final double NM = NumericAssert.NM; + + private static final int STEPS = 1798; // 0.05 deg steps over (0, 89.9] + + private static double lat(int i) { + return Math.toRadians(i * 0.05); + } + + /** + * The bar the corpus sets at {@code builtins.gie:4262-4266} is {@code tolerance 0 m}, + * which means the value at the equator must be exactly 1. proj4j's + * {@code tan}-and-{@code pow} form returns {@code 0.9999999999999999}. + */ + @Test + public void tsfnIsExactlyOneAtTheEquator() { + for (double e : new double[]{0.0, 1.0e-9, E, 0.2, 0.5}) { + assertEquals("tsfn(phi=0, sinphi=0, e=" + e + ") must be exactly 1.0", + 1.0, ConformalLat.tsfn(0.0, 0.0, e), 0.0); + assertEquals("tsfnSinCos(0, 1, e=" + e + ") must be exactly 1.0", + 1.0, ConformalLat.tsfnSinCos(0.0, 1.0, e), 0.0); + } + // The defect being fixed: proj4j's version is one ulp short. + assertTrue("ProjectionMath.tsfn is expected to miss 1.0 at the equator", + ProjectionMath.tsfn(0.0, 0.0, E) != 1.0); + assertEquals(0.9999999999999999, ProjectionMath.tsfn(0.0, 0.0, E), 0.0); + } + + /** {@code tsfn} must agree with its definition, {@code exp(-asinh(tan chi))}. */ + @Test + public void tsfnMatchesTheConformalLatitudeDefinition() { + double worstNew = 0.0; + double worstOld = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double chi = ConformalLat.conformalLat(phi, E); + double reference = StrictMath.exp(-MathHelpers.asinh(StrictMath.tan(chi))); + double sinphi = StrictMath.sin(phi); + worstNew = Math.max(worstNew, + Math.abs(ConformalLat.tsfn(phi, sinphi, E) - reference) / reference); + worstOld = Math.max(worstOld, + Math.abs(ProjectionMath.tsfn(phi, sinphi, E) - reference) / reference); + } + assertTrue("tsfn relative error " + worstNew, worstNew < 1.0e-12); + assertTrue("new tsfn must be at least as accurate as ProjectionMath's: new " + + worstNew + " old " + worstOld, worstNew <= worstOld); + } + + /** The branch at {@code sinphi > 0} must be continuous across the equator. */ + @Test + public void tsfnIsContinuousAcrossTheBranch() { + double justAbove = ConformalLat.tsfn(1.0e-12, StrictMath.sin(1.0e-12), E); + double justBelow = ConformalLat.tsfn(-1.0e-12, StrictMath.sin(-1.0e-12), E); + assertEquals(1.0, justAbove, 1.0e-11); + assertEquals(1.0, justBelow, 1.0e-11); + // ts is 1/ts under reflection: ts(-phi) = 1/ts(phi). + double worst = 0.0; + for (int i = 1; i <= STEPS; i++) { + double phi = lat(i); + double up = ConformalLat.tsfn(phi, StrictMath.sin(phi), E); + double down = ConformalLat.tsfn(-phi, StrictMath.sin(-phi), E); + worst = Math.max(worst, Math.abs(up * down - 1.0)); + } + assertTrue("ts(phi)*ts(-phi) must be 1, worst deviation " + worst, worst < 1.0e-14); + } + + /** + * The headline measurement for {@code phi2}. Both implementations are handed the + * same accurate {@code ts}, so what is measured is the inverse alone. + * proj4j's 15-step {@code pow}-bearing Newton loop, with its {@code 1e-10 rad} exit + * test, is about 4,145 nm off at latitude 2.8 degrees against a 50 nm bar; the + * Newton-on-tau formulation is about 2 nm. + */ + @Test + public void phi2BeatsProjectionMathOnTheSameInput() { + double worstNew = 0.0; + double worstOld = 0.0; + double worstNewAt = 0.0; + double worstOldAt = 0.0; + for (int i = 1; i <= STEPS; i++) { + double phi = lat(i); + double ts = ConformalLat.tsfn(phi, StrictMath.sin(phi), E); + double errNew = Math.abs(ConformalLat.phi2(ts, E) - phi) * A; + double errOld = Math.abs(ProjectionMath.phi2(ts, E) - phi) * A; + if (errNew > worstNew) { + worstNew = errNew; + worstNewAt = Math.toDegrees(phi); + } + if (errOld > worstOld) { + worstOld = errOld; + worstOldAt = Math.toDegrees(phi); + } + } + String report = "new " + (worstNew / NM) + " nm @ " + worstNewAt + " deg; old " + + (worstOld / NM) + " nm @ " + worstOldAt + " deg"; + assertTrue("new phi2 must be inside the 50 nm gie bar: " + report, + worstNew < 10.0 * NM); + assertTrue("ProjectionMath.phi2 is expected to blow the 50 nm bar: " + report, + worstOld > 1000.0 * NM); + assertTrue("new phi2 must beat ProjectionMath by >100x: " + report, + worstNew * 100.0 < worstOld); + } + + /** + * The {@code tsfn -> phi2} round trip, each stack using its own {@code tsfn}. This is + * the composition a {@code merc} forward-then-inverse actually performs. + */ + @Test + public void roundTripBeatsProjectionMath() { + double worstNew = 0.0; + double worstOld = 0.0; + for (int i = 1; i <= STEPS; i++) { + double phi = lat(i); + double sinphi = StrictMath.sin(phi); + worstNew = Math.max(worstNew, Math.abs( + ConformalLat.phi2(ConformalLat.tsfn(phi, sinphi, E), E) - phi) * A); + worstOld = Math.max(worstOld, Math.abs( + ProjectionMath.phi2(ProjectionMath.tsfn(phi, sinphi, E), E) - phi) * A); + } + String report = "new " + (worstNew / NM) + " nm; old " + (worstOld / NM) + " nm"; + assertTrue("new tsfn/phi2 round trip must be inside the 50 nm gie bar: " + report, + worstNew < 10.0 * NM); + assertTrue("proj4j's round trip is expected to blow the 50 nm bar: " + report, + worstOld > 1000.0 * NM); + assertTrue("new round trip must beat ProjectionMath by >100x: " + report, + worstNew * 100.0 < worstOld); + } + + /** + * {@code conformalLat} and {@code conformalLatInverse} must compose to the identity, + * and must be exact identities on a sphere. + */ + @Test + public void conformalLatitudeRoundTrips() { + double worst = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double chi = ConformalLat.conformalLat(phi, E); + assertTrue("chi must not exceed phi in magnitude at " + Math.toDegrees(phi), + Math.abs(chi) <= Math.abs(phi) + 1.0e-15); + worst = Math.max(worst, Math.abs(ConformalLat.conformalLatInverse(chi, E) - phi) * A); + } + assertTrue("conformal latitude round trip " + (worst / NM) + " nm", + worst < 10.0 * NM); + + for (int i = -STEPS; i <= STEPS; i += 7) { + double phi = lat(i); + NumericAssert.assertSameBits("sphere forward", phi, + ConformalLat.conformalLat(phi, 0.0)); + NumericAssert.assertSameBits("sphere inverse", phi, + ConformalLat.conformalLatInverse(phi, 0.0)); + } + } + + /** + * The conformal latitude must agree with the {@code AuxLat} series for + * {@code phi -> chi}, which is an entirely independent route to the same quantity — + * one an elementary closed form, the other an order-6 Fourier series. Agreement is + * strong evidence for both the {@code C[chi,phi]} table block and this function. + */ + @Test + public void conformalLatAgreesWithTheAuxLatSeries() { + Clenshaw6 phiToChi = Clenshaw6.forConversion(AuxLat.thirdFlattening(ES), + AuxLat.GEOGRAPHIC, AuxLat.CONFORMAL); + Clenshaw6 chiToPhi = Clenshaw6.forConversion(AuxLat.thirdFlattening(ES), + AuxLat.CONFORMAL, AuxLat.GEOGRAPHIC); + double worstForward = 0.0; + double worstInverse = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double chi = ConformalLat.conformalLat(phi, E); + worstForward = Math.max(worstForward, Math.abs(phiToChi.convert(phi) - chi) * A); + worstInverse = Math.max(worstInverse, + Math.abs(chiToPhi.convert(chi) - ConformalLat.conformalLatInverse(chi, E)) * A); + } + assertTrue("closed form vs phi->chi series: " + (worstForward / NM) + " nm", + worstForward < 10.0 * NM); + assertTrue("closed form vs chi->phi series: " + (worstInverse / NM) + " nm", + worstInverse < 10.0 * NM); + } + + /** + * The near-pole initial-guess branch: {@code |taup| > 70} corresponds to + * {@code chi = 89.18} degrees. Both sides of the branch must be accurate and the branch + * must be continuous. + */ + @Test + public void nearPoleGuessBranchIsContinuousAndAccurate() { + double belowThreshold = ConformalLat.sinhpsi2tanphi(70.0, E); + double aboveThreshold = ConformalLat.sinhpsi2tanphi(Math.nextUp(70.0), E); + assertEquals("the two initial guesses must converge to the same root", + belowThreshold, aboveThreshold, 1.0e-12); + assertEquals("and symmetrically below zero", + -ConformalLat.sinhpsi2tanphi(-70.0, E), + ConformalLat.sinhpsi2tanphi(70.0, E), 1.0e-12); + + // Very close to the pole, the recovered latitude must still be right. + double worst = 0.0; + for (int i = 1; i <= 1000; i++) { + double phi = Math.PI / 2.0 - StrictMath.pow(10.0, -3.0 - i / 100.0); + double ts = ConformalLat.tsfn(phi, StrictMath.sin(phi), E); + if (ts == 0.0) { + continue; // Underflowed; nothing left to recover. + } + worst = Math.max(worst, Math.abs(ConformalLat.phi2(ts, E) - phi) * A); + } + assertTrue("near-pole phi2 error " + (worst / NM) + " nm", worst < 1000.0 * NM); + } + + /** The whole point of the Newton reformulation: relative accuracy in tan(phi). */ + @Test + public void sinhpsi2tanphiIsAccurateInRelativeTerms() { + double worst = 0.0; + for (int i = -300; i <= 300; i++) { + double tau = StrictMath.pow(10.0, i / 30.0); + // Forward: taup(tau) from Karney (2011) Eq. 7. + double tau1 = Math.sqrt(1.0 + tau * tau); + double sig = StrictMath.sinh(E * MathHelpers.atanh(E * tau / tau1)); + double taup = Math.sqrt(1.0 + sig * sig) * tau - sig * tau1; + double back = ConformalLat.sinhpsi2tanphi(taup, E); + worst = Math.max(worst, Math.abs(back / tau - 1.0)); + // And odd in taup. + assertEquals(-back, ConformalLat.sinhpsi2tanphi(-taup, E), + 1.0e-14 * Math.abs(back)); + } + assertTrue("relative error in tan(phi) was " + worst, worst < 1.0e-14); + } + + /** A sphere must reduce to the elementary Mercator relations exactly. */ + @Test + public void sphereReducesToElementaryMercator() { + for (int i = 1; i <= STEPS; i++) { + double phi = lat(i); + double ts = ConformalLat.tsfn(phi, StrictMath.sin(phi), 0.0); + // ts = 1/(tan(phi) + sec(phi)) = tan(pi/4 - phi/2) + assertEquals("sphere ts at " + Math.toDegrees(phi), + StrictMath.tan(Math.PI / 4.0 - phi / 2.0), ts, 1.0e-15); + assertEquals("sphere phi2 at " + Math.toDegrees(phi), phi, + ConformalLat.phi2(ts, 0.0), 1.0e-15); + } + } + + /** Repeated evaluation must be bit-identical. */ + @Test + public void isDeterministic() { + for (int i = 1; i <= STEPS; i += 17) { + double phi = lat(i); + double sinphi = StrictMath.sin(phi); + double ts = ConformalLat.tsfn(phi, sinphi, E); + double first = ConformalLat.phi2(ts, E); + for (int rep = 0; rep < 200; rep++) { + NumericAssert.assertSameBits("tsfn", ts, ConformalLat.tsfn(phi, sinphi, E)); + NumericAssert.assertSameBits("phi2", first, ConformalLat.phi2(ts, E)); + } + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/MathHelpersTest.java b/core/src/test/java/org/locationtech/proj4j/util/MathHelpersTest.java new file mode 100644 index 0000000..d0cef23 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/MathHelpersTest.java @@ -0,0 +1,217 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link MathHelpers}, concentrating on the two regimes the naive formulas get + * wrong: tiny arguments (where the {@code log1p} branches matter) and huge ones (where + * squaring would overflow). + */ +public class MathHelpersTest { + + private static final double LN2 = 0.6931471805599453094172321214581766; + + @Test + public void asinhMatchesTheDefiningFormulaInTheMidRange() { + for (int i = -400; i <= 400; i++) { + double x = i / 4.0; + // The defining formula must be evaluated on |x|: log(x + sqrt(x*x + 1)) + // cancels catastrophically for x < 0, which is exactly why the port restores + // the sign afterwards instead. + double y = Math.abs(x); + double reference = StrictMath.log(y + Math.sqrt(y * y + 1.0)); + if (x < 0.0) { + reference = -reference; + } + NumericAssert.assertWithinUlps("asinh(" + x + ")", reference, + MathHelpers.asinh(x), 4); + } + } + + /** + * The {@code log1p} branch is what keeps {@code merc} correct at the equator. The + * naive {@code log(x + sqrt(x*x + 1))} returns exactly zero for tiny {@code x}, + * destroying every significant digit; this must return {@code x} to full relative + * accuracy. + */ + @Test + public void asinhKeepsRelativeAccuracyForTinyArguments() { + assertEquals("naive form is expected to be degenerate here", + 0.0, StrictMath.log(1.0e-20 + Math.sqrt(1.0e-40 + 1.0)), 0.0); + // asinh(x) = x - x^3/6 + ..., so from x = 1e-7 down the ratio is 1 to 1e-14. + for (int p = 7; p <= 300; p++) { + double x = StrictMath.pow(10.0, -p); + double v = MathHelpers.asinh(x); + assertTrue("asinh(1e-" + p + ") = " + v + " lost relative accuracy", + Math.abs(v / x - 1.0) < 1.0e-12); + } + assertEquals(0.0, MathHelpers.asinh(0.0), 0.0); + } + + @Test + public void asinhSurvivesTheOverflowThreshold() { + // y*y would overflow above ~1.3e154; the branch switches at 1e150. + assertEquals(StrictMath.log(1.0e300) + LN2, MathHelpers.asinh(1.0e300), 1.0e-12); + assertEquals(-(StrictMath.log(1.0e300) + LN2), MathHelpers.asinh(-1.0e300), 1.0e-12); + assertTrue(!Double.isNaN(MathHelpers.asinh(Double.MAX_VALUE)) + && !Double.isInfinite(MathHelpers.asinh(Double.MAX_VALUE))); + // Continuity across the 1e150 branch boundary. + double below = MathHelpers.asinh(1.0e150); + double above = MathHelpers.asinh(Math.nextUp(1.0e150)); + assertEquals(below, above, 1.0e-12); + // Continuity across the 1.0 branch boundary. + assertEquals(MathHelpers.asinh(1.0), MathHelpers.asinh(Math.nextUp(1.0)), 1.0e-15); + } + + @Test + public void asinhIsOddAndMonotone() { + double previous = Double.NEGATIVE_INFINITY; + for (int i = -1000; i <= 1000; i++) { + double x = i / 8.0; + double v = MathHelpers.asinh(x); + assertTrue("asinh must be increasing at " + x, v > previous || x == 0.0); + previous = v; + if (x != 0.0) { + assertEquals("asinh must be odd at " + x, -v, MathHelpers.asinh(-x), 0.0); + } + } + assertTrue(Double.isNaN(MathHelpers.asinh(Double.NaN))); + assertEquals(Double.POSITIVE_INFINITY, + MathHelpers.asinh(Double.POSITIVE_INFINITY), 0.0); + } + + /** + * Documents the one place this port deviates from C: the sign is restored with + * {@code x < 0.0}, which is false for {@code -0.0}, so a negative zero comes back + * positive. Pinned so the behaviour cannot change silently. + */ + @Test + public void negativeZeroComesBackPositive() { + NumericAssert.assertSameBits("asinh(-0.0)", +0.0, MathHelpers.asinh(-0.0)); + NumericAssert.assertSameBits("atanh(-0.0)", +0.0, MathHelpers.atanh(-0.0)); + NumericAssert.assertSameBits("asinh(+0.0)", +0.0, MathHelpers.asinh(+0.0)); + NumericAssert.assertSameBits("atanh(+0.0)", +0.0, MathHelpers.atanh(+0.0)); + } + + @Test + public void atanhMatchesTheDefiningFormulaInTheMidRange() { + for (int i = -999; i <= 999; i++) { + double x = i / 1000.0; + double reference = 0.5 * StrictMath.log((1.0 + x) / (1.0 - x)); + assertEquals("atanh(" + x + ")", reference, MathHelpers.atanh(x), + 4.0 * Math.ulp(Math.max(1.0, Math.abs(reference)))); + } + } + + /** + * The cancellation the {@code log1p} form exists to avoid: the quotient-of-logs form + * returns exactly zero for {@code x = 1e-18} because {@code 1 + x} and {@code 1 - x} + * both round to 1. + */ + @Test + public void atanhKeepsRelativeAccuracyForTinyArguments() { + assertEquals("naive form is expected to be degenerate here", + 0.0, 0.5 * StrictMath.log((1.0 + 1.0e-18) / (1.0 - 1.0e-18)), 0.0); + // atanh(x) = x + x^3/3 + ..., so from x = 1e-7 down the ratio is 1 to 1e-14. + for (int p = 7; p <= 300; p++) { + double x = StrictMath.pow(10.0, -p); + double v = MathHelpers.atanh(x); + assertTrue("atanh(1e-" + p + ") = " + v + " lost relative accuracy", + Math.abs(v / x - 1.0) < 1.0e-12); + } + } + + @Test + public void atanhHandlesTheEndpointsAsInC() { + assertEquals(Double.POSITIVE_INFINITY, MathHelpers.atanh(1.0), 0.0); + assertEquals(Double.NEGATIVE_INFINITY, MathHelpers.atanh(-1.0), 0.0); + assertTrue(Double.isNaN(MathHelpers.atanh(2.0))); + assertTrue(Double.isNaN(MathHelpers.atanh(-2.0))); + assertTrue(Double.isNaN(MathHelpers.atanh(Double.NaN))); + } + + /** + * Every {@code atanh} caller in the numerical core passes {@code e sin(phi)}, whose + * magnitude stays under 0.09 for any Earth ellipsoid. Pin the accuracy over exactly + * that band. + */ + @Test + public void atanhIsUniformlyAccurateOverTheEllipsoidBand() { + double e = NumericAssert.GRS80_E; + double worst = 0.0; + for (int i = -9000; i <= 9000; i++) { + double sinphi = StrictMath.sin(Math.toRadians(i / 100.0)); + double x = e * sinphi; + assertTrue("|e sin phi| must stay under 0.09", Math.abs(x) < 0.09); + if (x == 0.0) { + assertEquals(0.0, MathHelpers.atanh(x), 0.0); + continue; + } + // Convergent Taylor reference: atanh(x) = x + x^3/3 + x^5/5 + ... + // |x| < 0.09, so 40 terms is far past the last representable one. + double series = 0.0; + double term = x; + for (int k = 0; k < 40; k++) { + series += term / (2 * k + 1); + term *= x * x; + } + worst = Math.max(worst, Math.abs(MathHelpers.atanh(x) - series) / Math.abs(series)); + } + // Machine precision; the Taylor reference itself accumulates a few tenths of an + // ulp, so this pins "no worse than a couple of ulps". + assertTrue("atanh relative error over the ellipsoid band was " + worst, + worst < 1.0e-15); + } + + @Test + public void norm2IsExactForPythagoreanTriples() { + assertEquals(5.0, MathHelpers.norm2(3.0, 4.0), 0.0); + assertEquals(5.0, MathHelpers.norm2(-3.0, 4.0), 0.0); + assertEquals(13.0, MathHelpers.norm2(5.0, 12.0), 0.0); + assertEquals(1.0, MathHelpers.norm2(1.0, 0.0), 0.0); + assertEquals(0.0, MathHelpers.norm2(0.0, 0.0), 0.0); + assertEquals(Math.sqrt(2.0), MathHelpers.norm2(1.0, 1.0), 0.0); + } + + /** + * {@code norm2} must agree with {@code hypot} wherever the operands are bounded, which + * is everywhere the numerical core uses it. The point of the class is that it does so + * without {@code hypot}'s scaling machinery. + */ + @Test + public void norm2AgreesWithHypotForBoundedOperands() { + double worst = 0.0; + for (int i = -60; i <= 60; i++) { + for (int j = -60; j <= 60; j++) { + double a = i / 7.0; + double b = j / 11.0; + double h = StrictMath.hypot(a, b); + if (h == 0.0) { + assertEquals(0.0, MathHelpers.norm2(a, b), 0.0); + continue; + } + worst = Math.max(worst, Math.abs(MathHelpers.norm2(a, b) - h) / h); + } + } + assertTrue("norm2 vs hypot relative error " + worst, worst < 3.0e-16); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/MeridianArcTest.java b/core/src/test/java/org/locationtech/proj4j/util/MeridianArcTest.java new file mode 100644 index 0000000..fcf7d1a --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/MeridianArcTest.java @@ -0,0 +1,278 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * Tests for {@link MeridianArc}, including the measurement that justifies replacing + * {@code ProjectionMath.enfn/mlfn/inv_mlfn}. + * + *

Note on the metric. A mlfn round trip is self-consistency, and + * {@code ProjectionMath.inv_mlfn} is Newton's method run against + * {@code ProjectionMath.mlfn} itself, so it is self-consistent by construction — its round + * trip closes even though both halves are far from the truth. The comparison that matters + * is therefore against an independent reference, the compensated Gauss-Legendre + * quadrature in {@link NumericAssert#meridianArcReference}. Both metrics are asserted + * below, and the sign of the difference between them is the point. + * + *

{@code ProjectionMath} is read and called here for comparison only; nothing in it is + * modified. + */ +public class MeridianArcTest { + + private static final double A = NumericAssert.GRS80_A; + private static final double ES = NumericAssert.GRS80_ES; + private static final double NM = NumericAssert.NM; + + /** 0.05 degree steps over 0 to 90; the peaks quoted below are all interior. */ + private static final int STEPS = 1800; + + private static double lat(int i) { + return Math.toRadians(i * (90.0 / STEPS)); + } + + /** + * The headline measurement. On GRS80, {@code ProjectionMath.mlfn} is about 4,920 nm + * from the truth at latitude 72.55 degrees, against the 50 nm bar that {@code tmerc}'s + * conformance assertions set; the order-6 series in {@code n} is a couple of + * nanometres. + */ + @Test + public void forwardBeatsProjectionMathAgainstAnIndependentReference() { + MeridianArc arc = MeridianArc.fromEs(ES); + double[] oldEn = ProjectionMath.enfn(ES); + + double worstNew = 0.0; + double worstOld = 0.0; + double worstNewAt = 0.0; + double worstOldAt = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double sphi = StrictMath.sin(phi); + double cphi = StrictMath.cos(phi); + double reference = NumericAssert.meridianArcReference(phi, ES); + double errNew = Math.abs(arc.mlfn(phi, sphi, cphi) - reference) * A; + double errOld = Math.abs(ProjectionMath.mlfn(phi, sphi, cphi, oldEn) - reference) * A; + if (errNew > worstNew) { + worstNew = errNew; + worstNewAt = Math.toDegrees(phi); + } + if (errOld > worstOld) { + worstOld = errOld; + worstOldAt = Math.toDegrees(phi); + } + } + + String report = "new " + (worstNew / NM) + " nm @ " + worstNewAt + " deg; old " + + (worstOld / NM) + " nm @ " + worstOldAt + " deg"; + + // The gie bar for tmerc's tightest assertions is 50 nm; the reference quadrature + // itself is good to about 1 nm, so 20 nm is the tightest honest assertion here. + assertTrue("new mlfn must be inside the 50 nm gie bar: " + report, + worstNew < 20.0 * NM); + // The defect being fixed. + assertTrue("ProjectionMath.mlfn is expected to blow the 50 nm bar: " + report, + worstOld > 1000.0 * NM); + // And the new code must beat the old by a wide margin, which is the evidence. + assertTrue("new mlfn must beat ProjectionMath by >100x: " + report, + worstNew * 100.0 < worstOld); + } + + /** + * The same comparison for the inverse. Upstream's is closed form; proj4j's is a 10-step + * Newton loop whose accuracy is capped by the forward series it inverts. + */ + @Test + public void inverseBeatsProjectionMathAgainstAnIndependentReference() { + MeridianArc arc = MeridianArc.fromEs(ES); + double[] oldEn = ProjectionMath.enfn(ES); + + double worstNew = 0.0; + double worstOld = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double mu = NumericAssert.meridianArcReference(phi, ES); + worstNew = Math.max(worstNew, Math.abs(arc.invMlfn(mu) - phi) * A); + worstOld = Math.max(worstOld, + Math.abs(ProjectionMath.inv_mlfn(mu, ES, oldEn) - phi) * A); + } + String report = "new " + (worstNew / NM) + " nm; old " + (worstOld / NM) + " nm"; + assertTrue("new invMlfn must be inside the 50 nm gie bar: " + report, + worstNew < 20.0 * NM); + assertTrue("ProjectionMath.inv_mlfn is expected to blow the 50 nm bar: " + report, + worstOld > 1000.0 * NM); + assertTrue("new invMlfn must beat ProjectionMath by >100x: " + report, + worstNew * 100.0 < worstOld); + } + + /** + * Round-trip self-consistency of the new pair. Documented here at the measured level so + * that a regression is visible, and explicitly not claimed to beat proj4j: + * proj4j's inverse is Newton against its own forward and so closes to about 0.7 nm + * while both halves sit 4,900 nm from the truth. See the class comment. + */ + @Test + public void roundTripIsSelfConsistentToAFewNanometres() { + MeridianArc arc = MeridianArc.fromEs(ES); + double worst = 0.0; + double worstAt = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double mu = arc.mlfn(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + double err = Math.abs(arc.invMlfn(mu) - phi) * A; + if (err > worst) { + worst = err; + worstAt = Math.toDegrees(phi); + } + } + assertTrue("mlfn/invMlfn round trip " + (worst / NM) + " nm @ " + worstAt + + " deg must stay inside 5 nm", worst < 5.0 * NM); + } + + /** Southern hemisphere: both directions must be exactly odd in latitude. */ + @Test + public void isOddInLatitude() { + MeridianArc arc = MeridianArc.fromEs(ES); + for (int i = 1; i <= STEPS; i++) { + double phi = lat(i); + double forward = arc.mlfn(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + double mirrored = arc.mlfn(-phi, StrictMath.sin(-phi), StrictMath.cos(-phi)); + assertEquals("mlfn must be odd at " + Math.toDegrees(phi), -forward, mirrored, + 1.0e-16); + assertEquals("invMlfn must be odd", -arc.invMlfn(forward), + arc.invMlfn(-forward), 1.0e-16); + } + } + + /** A sphere must be an exact identity in both directions. */ + @Test + public void sphereIsAnExactIdentity() { + MeridianArc arc = new MeridianArc(0.0); + assertEquals(1.0, arc.rectifyingRadius(), 0.0); + for (int i = -STEPS; i <= STEPS; i += 7) { + double phi = lat(i); + NumericAssert.assertSameBits("mlfn on a sphere at " + phi, phi, + arc.mlfn(phi, StrictMath.sin(phi), StrictMath.cos(phi))); + NumericAssert.assertSameBits("invMlfn on a sphere at " + phi, phi, + arc.invMlfn(phi)); + } + assertEquals(0.0, arc.thirdFlattening(), 0.0); + } + + /** + * {@link MeridianArc#mlfn(double)} must compute the same sine and cosine internally + * that the explicit form is handed, bit for bit. + */ + @Test + public void convenienceOverloadsAgreeBitForBit() { + MeridianArc arc = MeridianArc.fromEs(ES); + for (int i = -STEPS; i <= STEPS; i += 11) { + double phi = lat(i); + NumericAssert.assertSameBits("mlfn at " + phi, + arc.mlfn(phi, StrictMath.sin(phi), StrictMath.cos(phi)), arc.mlfn(phi)); + double mu = arc.rectifyingLat(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + NumericAssert.assertSameBits("rectifyingLat scaling at " + phi, + arc.mlfn(phi), arc.rectifyingRadius() * mu); + NumericAssert.assertSameBits("invRectifyingLat at " + phi, + arc.invRectifyingLat(mu), + arc.invRectifyingLat(mu, StrictMath.sin(mu), StrictMath.cos(mu))); + } + } + + /** + * The deliberate deviation from upstream: {@code invMlfn} multiplies by a precomputed + * reciprocal instead of dividing by {@code en[0]}. Pin the claim that this costs at + * most 1 ULP on the rectifying latitude — about 2 pm on the ground. + */ + @Test + public void reciprocalMultiplyCostsAtMostOneUlp() { + MeridianArc arc = MeridianArc.fromEs(ES); + double rr = arc.rectifyingRadius(); + double worstUlps = 0.0; + for (int i = 0; i <= STEPS; i++) { + double phi = lat(i); + double mu = arc.mlfn(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + double multiplied = mu * (1.0 / rr); + double divided = mu / rr; + worstUlps = Math.max(worstUlps, NumericAssert.ulpDistance(multiplied, divided)); + } + assertTrue("reciprocal multiply differed by " + worstUlps + " ulps", + worstUlps <= 1.0); + } + + /** {@code n} must round-trip through {@code es} and the accessors must be stable. */ + @Test + public void accessorsExposeTheSeriesUsed() { + MeridianArc arc = MeridianArc.fromEs(ES); + assertEquals(AuxLat.thirdFlattening(ES), arc.thirdFlattening(), 0.0); + assertEquals(AuxLat.rectifyingRadius(arc.thirdFlattening()), arc.rectifyingRadius(), + 0.0); + assertSame(arc.forwardSeries(), arc.forwardSeries()); + assertSame(arc.inverseSeries(), arc.inverseSeries()); + // The exposed series must be the ones the methods use. + double phi = Math.toRadians(37.0); + NumericAssert.assertSameBits("forwardSeries", + arc.rectifyingRadius() * arc.forwardSeries().convert(phi), arc.mlfn(phi)); + } + + /** + * Determinism: repeated construction and evaluation must be bit-identical, which is + * what the fixed-order closed form buys over a Newton loop with a data-dependent trip + * count. + */ + @Test + public void isDeterministicAcrossInstances() { + for (int i = 0; i <= STEPS; i += 13) { + double phi = lat(i); + MeridianArc a = MeridianArc.fromEs(ES); + double first = a.mlfn(phi); + double firstInverse = a.invMlfn(first); + for (int rep = 0; rep < 50; rep++) { + MeridianArc b = MeridianArc.fromEs(ES); + NumericAssert.assertSameBits("mlfn", first, b.mlfn(phi)); + NumericAssert.assertSameBits("invMlfn", firstInverse, b.invMlfn(first)); + } + } + } + + /** + * The series is specified for {@code |f| <= 1/150}; check it still holds up at + * {@code f = 1/150} exactly, and that the more oblate bodies proj4j accepts do not + * produce nonsense. + */ + @Test + public void holdsUpAtTheSpecifiedFlatteningLimit() { + double f = 1.0 / 150.0; + double es = 2.0 * f - f * f; + MeridianArc arc = MeridianArc.fromEs(es); + double worst = 0.0; + for (int i = 0; i <= 900; i++) { + double phi = Math.toRadians(i / 10.0); + double reference = NumericAssert.meridianArcReference(phi, es); + worst = Math.max(worst, + Math.abs(arc.mlfn(phi, StrictMath.sin(phi), StrictMath.cos(phi)) + - reference) * A); + } + assertTrue("at f = 1/150 the series was " + (worst / NM) + " nm off", + worst < 50.0 * NM); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/NumericAssert.java b/core/src/test/java/org/locationtech/proj4j/util/NumericAssert.java new file mode 100644 index 0000000..cc66fbb --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/NumericAssert.java @@ -0,0 +1,149 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Shared numeric helpers for the {@code util} numerical-core tests: an ULP-based + * comparison equivalent to googletest's {@code EXPECT_DOUBLE_EQ} (4 ULP), the GRS80 + * constants every sweep uses, and a compensated Gauss-Legendre meridian-arc reference + * that is independent of the series under test. + */ +final class NumericAssert { + + /** GRS80 semi-major axis, metres. */ + static final double GRS80_A = 6378137.0; + + /** GRS80 squared first eccentricity, as PROJ derives it from {@code a} and {@code rf}. */ + static final double GRS80_ES = 0.006694380022900787; + + /** GRS80 first eccentricity. */ + static final double GRS80_E = Math.sqrt(GRS80_ES); + + /** One nanometre, in metres — the unit the numerics reference quotes. */ + static final double NM = 1.0e-9; + + /** googletest's {@code EXPECT_DOUBLE_EQ} tolerance. */ + private static final int GTEST_ULPS = 4; + + private NumericAssert() { + } + + /** + * The googletest {@code EXPECT_DOUBLE_EQ} predicate: equal, or within 4 ULP. + */ + static void assertDoubleEq(double expected, double actual) { + assertDoubleEq("", expected, actual); + } + + static void assertDoubleEq(String message, double expected, double actual) { + assertWithinUlps(message, expected, actual, GTEST_ULPS); + } + + /** + * Asserts that {@code actual} is within {@code ulps} representable doubles of + * {@code expected}. Handles equal values (including signed zeros compared loosely) + * and requires bitwise-equal NaN/infinity. + */ + static void assertWithinUlps(String message, double expected, double actual, int ulps) { + if (Double.isNaN(expected) || Double.isNaN(actual) + || Double.isInfinite(expected) || Double.isInfinite(actual)) { + assertEquals(message, expected, actual, 0.0); + return; + } + final long d = ulpDistance(expected, actual); + assertTrue(message + " expected " + expected + " actual " + actual + + " differ by " + d + " ulps (limit " + ulps + ")", d <= ulps); + } + + /** The number of representable doubles between {@code a} and {@code b}. */ + static long ulpDistance(double a, double b) { + if (a == b) { + return 0L; + } + return Math.abs(ordinal(a) - ordinal(b)); + } + + private static long ordinal(double v) { + final long bits = Double.doubleToLongBits(v); + // Map the sign-magnitude representation onto a monotone two's-complement ordering. + return bits < 0 ? Long.MIN_VALUE - bits : bits; + } + + /** Asserts strict bitwise equality, so that {@code +0.0 != -0.0}. */ + static void assertSameBits(String message, double expected, double actual) { + assertEquals(message, Double.doubleToRawLongBits(expected), + Double.doubleToRawLongBits(actual)); + } + + // ---- 10-point Gauss-Legendre nodes and weights on [-1, 1] -------------------- + + private static final double[] GLX = { + -0.9739065285171717, -0.8650633666889845, -0.6794095682990244, + -0.4333953941292472, -0.1488743389816312, 0.1488743389816312, + 0.4333953941292472, 0.6794095682990244, 0.8650633666889845, + 0.9739065285171717, + }; + + private static final double[] GLW = { + 0.0666713443086881, 0.1494513491505806, 0.2190863625159820, + 0.2692667193099963, 0.2955242247147529, 0.2955242247147529, + 0.2692667193099963, 0.2190863625159820, 0.1494513491505806, + 0.0666713443086881, + }; + + /** + * The meridian arc from the equator to {@code phi}, divided by the semi-major axis: + *

+     *   integral(0, phi) (1 - es) / (1 - es sin^2 t)^(3/2) dt
+     * 
+ * evaluated by 64-panel 10-point Gauss-Legendre with Neumaier compensated summation. + * + *

The integrand is analytic and the panels are tiny, so the quadrature truncation + * error is far below rounding; compensating the sum then leaves about 1 ULP of the + * result, i.e. roughly 1 nm on the ground for GRS80. That is an independent + * reference — it shares no series, no coefficient and no algorithm with + * {@link MeridianArc} or with {@code ProjectionMath.mlfn} — which is what makes the + * old-versus-new comparison meaningful. + */ + static double meridianArcReference(double phi, double es) { + final int panels = 64; + final double h = phi / panels; + final double hw = 0.5 * h; + double sum = 0.0; + double comp = 0.0; + for (int p = 0; p < panels; p++) { + final double c = p * h + hw; + for (int i = 0; i < GLX.length; i++) { + final double t = c + hw * GLX[i]; + final double st = Math.sin(t); + final double d = 1.0 - es * st * st; + final double term = hw * GLW[i] * (1.0 - es) / (d * Math.sqrt(d)); + final double s = sum + term; + if (Math.abs(sum) >= Math.abs(term)) { + comp += (sum - s) + term; + } else { + comp += (term - s) + sum; + } + sum = s; + } + } + return sum + comp; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/PjPhi2Test.java b/core/src/test/java/org/locationtech/proj4j/util/PjPhi2Test.java new file mode 100644 index 0000000..e64e723 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/PjPhi2Test.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.locationtech.proj4j.util.NumericAssert.assertDoubleEq; + +/** + * A verbatim port of {@code 9.8.1:test/unit/pj_phi2_test.cpp} (Kurt Schwehr, Google Inc., + * 2018), the upstream unit test for {@code pj_phi2}. + * + *

Every {@code EXPECT_EQ} below is transcribed as an exact-equality assertion: the + * expectation is that only sane values of {@code e} (and {@code NaN}, which upstream + * reckons sane) are passed, and that limits at {@code ts = 0}, {@code 1} and + * {@code infinity} are reproduced bit for bit rather than to a tolerance. This is + * the cheapest regression net available for this function. + * + *

Each {@code EXPECT_DOUBLE_EQ} is transcribed through + * {@link NumericAssert#assertDoubleEq}, which applies googletest's own 4-ULP rule. + */ +public class PjPhi2Test { + + private static final double M_PI_2 = Math.PI / 2.0; + private static final double INF = Double.POSITIVE_INFINITY; + private static final double NAN = Double.NaN; + + @Test + public void basic() { + // Expectation is that only sane values of e (and nan is here reckoned to + // be sane) are passed to pj_phi2. Thus the return value with other values + // of e is "implementation dependent". + + // Strict equality is demanded here. + assertEquals(M_PI_2, ConformalLat.phi2(+0.0, 0.0), 0.0); + assertEquals(0.0, ConformalLat.phi2(1.0, 0.0), 0.0); + assertEquals(-M_PI_2, ConformalLat.phi2(INF, 0.0), 0.0); + // We don't expect pj_phi2 to be called with negative ts (since ts = + // exp(-psi)). However, in the current implementation it is odd in ts. + // N.B. ts = +0.0 and ts = -0.0 return different results. + assertEquals(-M_PI_2, ConformalLat.phi2(-0.0, 0.0), 0.0); + assertEquals(0.0, ConformalLat.phi2(-1.0, 0.0), 0.0); + assertEquals(+M_PI_2, ConformalLat.phi2(-INF, 0.0), 0.0); + + final double e = 0.2; + assertEquals(M_PI_2, ConformalLat.phi2(+0.0, e), 0.0); + assertEquals(0.0, ConformalLat.phi2(1.0, e), 0.0); + assertEquals(-M_PI_2, ConformalLat.phi2(INF, e), 0.0); + assertEquals(-M_PI_2, ConformalLat.phi2(-0.0, e), 0.0); + assertEquals(0.0, ConformalLat.phi2(-1.0, e), 0.0); + assertEquals(+M_PI_2, ConformalLat.phi2(-INF, e), 0.0); + + assertTrue(Double.isNaN(ConformalLat.phi2(NAN, 0.0))); + assertTrue(Double.isNaN(ConformalLat.phi2(NAN, e))); + assertTrue(Double.isNaN(ConformalLat.phi2(+0.0, NAN))); + assertTrue(Double.isNaN(ConformalLat.phi2(1.0, NAN))); + assertTrue(Double.isNaN(ConformalLat.phi2(INF, NAN))); + assertTrue(Double.isNaN(ConformalLat.phi2(-0.0, NAN))); + assertTrue(Double.isNaN(ConformalLat.phi2(-1.0, NAN))); + assertTrue(Double.isNaN(ConformalLat.phi2(-INF, NAN))); + assertTrue(Double.isNaN(ConformalLat.phi2(NAN, NAN))); + + assertDoubleEq(Math.PI / 3, ConformalLat.phi2(1 / (Math.sqrt(3.0) + 2), 0.0)); + assertDoubleEq(Math.PI / 4, ConformalLat.phi2(1 / (Math.sqrt(2.0) + 1), 0.0)); + assertDoubleEq(Math.PI / 6, ConformalLat.phi2(1 / Math.sqrt(3.0), 0.0)); + assertDoubleEq(-Math.PI / 3, ConformalLat.phi2(Math.sqrt(3.0) + 2, 0.0)); + assertDoubleEq(-Math.PI / 4, ConformalLat.phi2(Math.sqrt(2.0) + 1, 0.0)); + assertDoubleEq(-Math.PI / 6, ConformalLat.phi2(Math.sqrt(3.0), 0.0)); + + // Generated with exp(e * atanh(e * sin(phi))) / (tan(phi) + sec(phi)) + assertDoubleEq(Math.PI / 3, ConformalLat.phi2(0.27749174377027023413, e)); + assertDoubleEq(Math.PI / 4, ConformalLat.phi2(0.42617788119104192995, e)); + assertDoubleEq(Math.PI / 6, ConformalLat.phi2(0.58905302448626726064, e)); + assertDoubleEq(-Math.PI / 3, ConformalLat.phi2(3.6037108218537833089, e)); + assertDoubleEq(-Math.PI / 4, ConformalLat.phi2(2.3464380582241712935, e)); + assertDoubleEq(-Math.PI / 6, ConformalLat.phi2(1.6976400399134411849, e)); + } + + /** + * The signed-zero asymmetry that upstream's comment calls out explicitly: it comes + * from {@code 1 / (-0.0) == -infinity} inside {@code (1/ts - ts) / 2}, and any + * "tidying" of that expression would silently break it. + */ + @Test + public void signedZeroIsAsymmetric() { + assertTrue(ConformalLat.phi2(+0.0, 0.2) != ConformalLat.phi2(-0.0, 0.2)); + assertEquals(+M_PI_2, ConformalLat.phi2(+0.0, 0.2), 0.0); + assertEquals(-M_PI_2, ConformalLat.phi2(-0.0, 0.2), 0.0); + } + + /** + * {@code TMAX} and {@code ROOTEPS} are exact powers of two; the literals in + * {@link ConformalLat} must match what {@code phi2.cpp} derives at runtime. + */ + @Test + public void thresholdsAreExactPowersOfTwo() { + assertEquals(Math.sqrt(Math.ulp(1.0)), ConformalLat.ROOTEPS, 0.0); + assertEquals(StrictMath.pow(2.0, -26), ConformalLat.ROOTEPS, 0.0); + assertEquals(2.0 / ConformalLat.ROOTEPS, ConformalLat.TMAX, 0.0); + assertEquals(StrictMath.pow(2.0, 27), ConformalLat.TMAX, 0.0); + } + + /** + * Above {@code TMAX} the large-argument limit is returned directly, without entering + * the Newton loop, so {@code sinhpsi2tanphi} is exactly linear there. + */ + @Test + public void largeArgumentLimitIsExact() { + final double e = 0.2; + final double scale = StrictMath.exp(e * MathHelpers.atanh(e)); + final double taup = 1.0e10; // well above TMAX / scale + assertEquals(taup * scale, ConformalLat.sinhpsi2tanphi(taup, e), 0.0); + assertEquals(INF, ConformalLat.sinhpsi2tanphi(INF, e), 0.0); + assertEquals(-INF, ConformalLat.sinhpsi2tanphi(-INF, e), 0.0); + assertTrue(Double.isNaN(ConformalLat.sinhpsi2tanphi(NAN, e))); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/FastStrictTrigAllocationTest.java b/core/src/test/java/org/locationtech/proj4j/util/trig/FastStrictTrigAllocationTest.java new file mode 100644 index 0000000..48ad7e5 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/FastStrictTrigAllocationTest.java @@ -0,0 +1,915 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig; + +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.util.FastStrictTrig; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; +import java.lang.reflect.Modifier; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Measures allocation with {@code com.sun.management.ThreadMXBean.getThreadAllocatedBytes} -- the + * same instrument that produced the original finding (32.41 / 32.00 / 32.00 B/op for + * {@code StrictMath.sin} / {@code cos} / {@code tan} on Temurin 21 over 5e6 calls), so the test + * proves the claim rather than a proxy for it. + * + *

Why {@code StrictMath} allocates at all, on JDK 21 and later: the JEP 306 line of work + * replaced the JNI-into-fdlibm implementation of {@code sin}/{@code cos}/{@code tan} + * with pure Java, and {@code java.lang.FdLibm.Sin/Cos/Tan.compute} each open with + * {@code new double[2]} to receive the two-word result of {@code __ieee754_rem_pio2} -- a C + * out-parameter idiom. The array does not escape, but the callee is far too large to inline, so + * escape analysis cannot scalarise it. {@code exp}, {@code log}, {@code pow}, {@code atan}, + * {@code asin}, {@code log1p}, {@code sinh} and {@code hypot} allocate nothing: this is a + * three-function problem. + * + *

Three kinds of check, and the distinction between them is the point of the class: + * + *

    + *
  1. Asserted unconditionally, on every JDK: {@link FastStrictTrig} allocates + * 0 B/op, in isolation and in a loop shaped like a real projection kernel, for ordinary and + * for multi-word-reduction arguments. This is the property the library depends on and it is + * the only thing here that may ever turn a build red.
  2. + *
  3. Asserted unconditionally, and what makes the 0.00 above mean something: + * the instrument itself. {@link #theInstrumentCanSeeAllocation} runs workloads that allocate + * a known amount and requires the counter to see them, and to scale with them; and + * {@link #theInstrumentDoesNotAllocate} requires the counter not to perturb what it measures. + * A "0 B/op" from a blind instrument is exactly as clean and exactly as worthless as a real + * one.
  4. + *
  5. Conditional on the JVM's {@code StrictMath} being the pure-Java one, and reported + * as a skip otherwise: anything asserting what {@code StrictMath} costs. See the + * next section -- on JDK 8..17 the answer is structurally 0 and no assertion of that shape + * can hold.
  6. + *
+ * + *

Why nothing here may assert that {@code StrictMath} allocates: it does not, before JDK 21

+ * + *

{@code StrictMath.sin}, {@code cos} and {@code tan} were still native JNI calls into + * C fdlibm on JDK 17; the Java port that introduced the allocating {@code double[2]} + * landed in JDK 21. Measured, not inferred, two independent ways: + * + * + * + * + * + * + * + * + * + *
{@code java.base}, Corretto 17.0.20 vs 21.0.12, aarch64
JDK 17JDK 21
{@code Modifier.isNative(StrictMath.sin)}{@code true}{@code false}
{@code java.lang.FdLibm$Sin/$Cos/$Tan/$RemPio2}absent from + * {@code lib/modules} entirelypresent
measured {@code StrictMath.sin} over {@code [-pi, pi]}0.00 B/op~62 B/op
+ * + *

So a JDK 17 reading of 0.00 is not flake, not a vendor difference and not escape analysis -- + * the object whose absence is being measured does not exist in that JDK's class library. + * Corretto 17.0.20 reads 0.00 every time; Corretto 21.0.12, Corretto 25.0.4 and Temurin 21.0.11 + * read non-zero every time. + * + *

The guard used below is therefore {@link java.lang.reflect.Modifier#isNative} on + * {@code StrictMath.sin/cos/tan}, not "did we measure zero". That distinction is + * load-bearing: a guard of the form skip the assertion when the measurement is zero is the + * assertion's own negation and can never fail, whereas nativeness is an independent fact, so a + * pure-Java {@code StrictMath} that stopped allocating would still be caught and reported. + * + *

Measurement method: warm up past C2 compilation, then read the thread's allocation counter, + * run N operations, read it again. {@code getThreadAllocatedBytes} takes a primitive {@code long} + * and returns a primitive {@code long}, so the instrument itself allocates nothing. Results are + * reported as bytes per operation over N = 5,000,000; a per-op figure below 0.01 B is treated as + * zero, which at that N absorbs up to 50 KB of one-off harness noise (class loading, the first + * {@code Scratch}, JIT deoptimisation buffers). + */ +public class FastStrictTrigAllocationTest { + + private static final int N = 5_000_000; + private static final int WARMUP = 200_000; + + /** Below this many bytes per operation, the operation allocates nothing. */ + private static final double ZERO_TOLERANCE = 0.01; + + private static com.sun.management.ThreadMXBean bean; + + /** Kept in a static so the JIT cannot prove the computed values are dead. */ + public static volatile double sink; + + /** Escape hatch for the instrument's positive control -- a static volatile cannot be elided. */ + public static volatile Object objectSink; + + // ------------------------------------------------------------------ + // Which StrictMath this JVM has. See the class javadoc: JNI-into-C fdlibm through JDK 17, + // pure Java from JDK 21, and only the pure-Java one can allocate. + // ------------------------------------------------------------------ + + private static final boolean STRICT_TRIG_IS_PURE_JAVA = strictTrigIsPureJava(); + + private static boolean strictTrigIsPureJava() { + try { + for (String name : new String[] {"sin", "cos", "tan"}) { + if (Modifier.isNative( + StrictMath.class.getDeclaredMethod(name, double.class).getModifiers())) { + return false; + } + } + return true; + } catch (NoSuchMethodException e) { + throw new AssertionError("StrictMath.sin/cos/tan(double) must exist", e); + } + } + + /** + * Corroboration only, never asserted on: the presence of the nested class that holds the + * allocating carrier. Printed alongside the nativeness verdict so the log records both signals + * and a future disagreement between them is visible rather than silent. Not a guard, because + * the name of a JDK-internal class is exactly the kind of third-party implementation detail + * that must not be able to redden this build. + */ + private static boolean fdLibmSinClassExists() { + try { + Class.forName("java.lang.FdLibm$Sin"); + return true; + } catch (Throwable t) { + return false; + } + } + + private static String strictMathImplementation() { + return (STRICT_TRIG_IS_PURE_JAVA ? "pure Java (JDK 21+ FdLibm port)" : "native JNI fdlibm") + + " on " + System.getProperty("java.vm.name") + " " + + System.getProperty("java.version") + " / " + System.getProperty("os.arch") + + "; java.lang.FdLibm$Sin " + (fdLibmSinClassExists() ? "present" : "absent"); + } + + /** + * Skips, loudly, when this JVM's {@code StrictMath} cannot allocate because it is not written + * in Java. The reason goes to stdout as well as into the JUnit assumption, so it is visible in + * a build log and not only in the surefire XML. A skip is a skip, never a pass. + */ + private static void requirePureJavaStrictMath(String whatIsBeingSkipped) { + if (!STRICT_TRIG_IS_PURE_JAVA) { + String why = whatIsBeingSkipped + ": this JVM's StrictMath.sin/cos/tan are " + + strictMathImplementation() + ". A native implementation allocates no Java " + + "object, so it necessarily measures 0 B/op and there is no premise to test. " + + "FastStrictTrig's own 0 B/op is asserted unconditionally elsewhere in this " + + "class, and its bit-identity to StrictMath in FastStrictTrigIdentityTest."; + System.out.println(" [SKIP] " + why); + Assume.assumeTrue(why, false); + } + } + + @BeforeClass + public static void resolveBean() { + ThreadMXBean plain = ManagementFactory.getThreadMXBean(); + Assume.assumeTrue("this JVM does not expose com.sun.management.ThreadMXBean; " + + "allocation cannot be measured here", + plain instanceof com.sun.management.ThreadMXBean); + com.sun.management.ThreadMXBean b = (com.sun.management.ThreadMXBean) plain; + Assume.assumeTrue("this JVM does not support per-thread allocation counting", + b.isThreadAllocatedMemorySupported()); + b.setThreadAllocatedMemoryEnabled(true); + bean = b; + } + + private static long allocated() { + return bean.getThreadAllocatedBytes(Thread.currentThread().getId()); + } + + // ------------------------------------------------------------------ + // Workloads. Each returns an accumulated double so nothing is dead code. + // ------------------------------------------------------------------ + + private interface Workload { + /** Performs {@code n} operations and returns an accumulator. */ + double run(int n); + } + + /** + * Measures a workload's bytes per operation. The counter is read immediately before and after + * the timed region; the accumulator is published to a volatile field afterwards so the whole + * loop cannot be eliminated. + */ + private static double bytesPerOp(String label, Workload w) { + return bytesPerOp(label, N, w); + } + + /** As {@link #bytesPerOp(String, Workload)}, over an explicit operation count. */ + private static double bytesPerOp(String label, int ops, Workload w) { + sink += w.run(WARMUP); // reach C2, and materialise anything lazily created + sink += w.run(WARMUP); + long before = allocated(); + double acc = w.run(ops); + long after = allocated(); + sink += acc; + double bpo = (after - before) / (double) ops; + System.out.printf(" %-52s %10.4f B/op (%d B total over %d ops)%n", + label, bpo, after - before, ops); + return bpo; + } + + /** + * An angle sequence that stays in the range a coordinate transform produces (radians of + * latitude and longitude) and that the JIT cannot constant-fold. + */ + private static double angle(int i) { + return ((i & 0xffff) - 32768) * (Math.PI / 32768.0); + } + + // ------------------------------------------------------------------ + // 1. Direct calls, the shape the original finding used + // ------------------------------------------------------------------ + + /** + * 5e6 direct calls each, the shape that produced the original 32.41 / 32.00 / 32.00 B/op + * finding — but over the full {@code [-pi, pi]} range a longitude actually spans, which + * measures nearer 62 B/op. See {@link #strictMathAllocationTiersWithArgumentMagnitude} for + * why the two numbers differ. + */ + @Test + public void directCallsAllocateNothing() { + System.out.println("[FastStrictTrig] direct calls, " + N + " ops each:"); + + double fastSin = bytesPerOp("FastStrictTrig.sin", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += FastStrictTrig.sin(angle(i)); + } + return a; + } + }); + double fastCos = bytesPerOp("FastStrictTrig.cos", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += FastStrictTrig.cos(angle(i)); + } + return a; + } + }); + double fastTan = bytesPerOp("FastStrictTrig.tan", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += FastStrictTrig.tan(angle(i)); + } + return a; + } + }); + double[] strict = measureStrictTrigDirectCalls(); + double mathSin = bytesPerOp("Math.sin (intrinsic, for reference)", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += Math.sin(angle(i)); + } + return a; + } + }); + + assertZero("FastStrictTrig.sin", fastSin); + assertZero("FastStrictTrig.cos", fastCos); + assertZero("FastStrictTrig.tan", fastTan); + assertZero("Math.sin", mathSin); + + // Observation, not an assertion. What StrictMath costs is a property of the JDK, and on + // JDK 8..17 it is structurally zero -- see the class javadoc. The assertion that it costs + // more lives in strictMathAllocatesWhereItsImplementationIsPureJava, which skips there. + System.out.printf(" => StrictMath.sin/cos/tan measured %.2f / %.2f / %.2f B/op; " + + "implementation is %s.%n", + strict[0], strict[1], strict[2], strictMathImplementation()); + } + + /** The three direct-call {@code StrictMath} figures, measured and printed, never asserted. */ + private static double[] measureStrictTrigDirectCalls() { + double strictSin = bytesPerOp("StrictMath.sin", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sin(angle(i)); + } + return a; + } + }); + double strictCos = bytesPerOp("StrictMath.cos", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.cos(angle(i)); + } + return a; + } + }); + double strictTan = bytesPerOp("StrictMath.tan", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.tan(angle(i)); + } + return a; + } + }); + return new double[] {strictSin, strictCos, strictTan}; + } + + /** + * The reason {@link FastStrictTrig} was written, asserted where it can be: on a JVM whose + * {@code StrictMath} is the pure-Java {@code FdLibm} port, at least one of + * {@code sin}/{@code cos}/{@code tan} must allocate, or the class buys nothing on the + * allocation axis and the re-point could be reconsidered. + * + *

Deliberately not pinned to 32 or 62 B/op: a JDK that fixes {@code FdLibm}, or gains the + * escape analysis to scalarise the carrier, is a good outcome and must not be a red build. + * + *

Skipped, with the reason printed, on a JVM whose {@code StrictMath.sin/cos/tan} are + * native -- every JDK up to and including 17. The guard is nativeness, not the measurement, so + * on JDK 21+ this assertion is live and can genuinely fail. + */ + @Test + public void strictMathAllocatesWhereItsImplementationIsPureJava() { + System.out.println("[FastStrictTrig] premise check -- does StrictMath allocate here?"); + requirePureJavaStrictMath("StrictMath allocation premise"); + + double[] strict = measureStrictTrigDirectCalls(); + assertTrue("FastStrictTrig exists to remove StrictMath's per-call allocation, and this " + + "JVM's StrictMath is " + strictMathImplementation() + " -- yet " + + "sin/cos/tan allocate nothing (" + strict[0] + " / " + strict[1] + " / " + + strict[2] + " B/op). The class is then redundant for allocation purposes; " + + "it is still required for bit-identity, so this is a finding, not a bug.", + strict[0] > ZERO_TOLERANCE || strict[1] > ZERO_TOLERANCE + || strict[2] > ZERO_TOLERANCE); + } + + /** + * Explains why {@code StrictMath}'s per-call allocation is not a single number, and reconciles + * the 32 B/op headline with the ~62 B/op that {@link #directCallsAllocateNothing} measures. + * + *

{@code FdLibm.Sin.compute} allocates its {@code double[2] y} unconditionally, at + * the top of the method, before the {@code |x| ~< pi/4} short circuit — so every call pays + * 32 B. A call that needs argument reduction then enters + * {@code RemPio2.__ieee754_rem_pio2}, which unconditionally allocates a {@code double[3] tx}, + * a further 40 B. A call large enough for the multi-word path additionally allocates + * {@code __kernel_rem_pio2}'s {@code int[20]} plus three {@code double[20]}: 96 + 3*176 = + * 624 B. + * + *

So the expected tiers are 32, 72 and 696 B/op, and the figure for a mixed workload is the + * weighted mean. The original 32 B/op finding was therefore measured on arguments that stayed + * inside {@code pi/4}. Longitude in radians spans {@code +/-pi}, so three quarters of a + * realistic {@code sin(lam)} workload takes the reduction path and the true cost is nearer + * 62 B/op — the headline understated it by about 2x. + * + *

Every tier described above is a feature of the Java {@code FdLibm}, so this test + * is skipped, with the reason printed, on a JVM whose {@code StrictMath.sin} is native -- there + * is no {@code double[2]}, no {@code double[3]} and no {@code int[20]} to tier. The half of the + * old test that is JDK-independent, {@link FastStrictTrig} costing nothing on any of the three + * magnitudes, was split out into + * {@link #fastStrictTrigAllocatesNothingAcrossAllMagnitudeTiers} so that it always runs. + */ + @Test + public void strictMathAllocationTiersWithArgumentMagnitude() { + System.out.println("[FastStrictTrig] StrictMath.sin allocation by argument magnitude:"); + requirePureJavaStrictMath("StrictMath allocation tiers"); + + double small = bytesPerOp("StrictMath.sin, |x| < pi/4 (expect ~32 B)", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sin(angle(i) * 0.24); + } + return a; + } + }); + double reduced = bytesPerOp("StrictMath.sin, pi/4 < |x| < 3pi/4 (expect ~72 B)", + new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sin(1.2 + (i & 1023) * 1e-6); + } + return a; + } + }); + double huge = bytesPerOp("StrictMath.sin, |x| > 2^19*(pi/2) (expect ~696 B)", + new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sin(1e100 + i); + } + return a; + } + }); + + assertTrue("even inside pi/4, StrictMath.sin allocates the double[2] it never uses; " + + "measured " + small + " B/op", small > ZERO_TOLERANCE); + assertTrue("the reduction path must cost more than the short circuit: " + + reduced + " vs " + small, reduced > small); + assertTrue("the multi-word path must cost more again: " + huge + " vs " + reduced, + huge > reduced); + } + + /** + * The JDK-independent half of {@link #strictMathAllocationTiersWithArgumentMagnitude}: + * {@link FastStrictTrig} costs nothing on any argument magnitude, including the multi-word + * reduction path. Unconditional -- this is a statement about proj4j's own code and it holds on + * every JDK. + */ + @Test + public void fastStrictTrigAllocatesNothingAcrossAllMagnitudeTiers() { + System.out.println("[FastStrictTrig] FastStrictTrig.sin across all magnitude tiers:"); + double fastAll = bytesPerOp("FastStrictTrig.sin, three ranges combined", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += FastStrictTrig.sin(angle(i) * 0.24) + + FastStrictTrig.sin(1.2 + (i & 1023) * 1e-6) + + FastStrictTrig.sin(1e100 + i); + } + return a; + } + }); + assertZero("FastStrictTrig.sin across all three magnitude tiers", fastAll); + } + + // ------------------------------------------------------------------ + // 2. The question that decides whether this class is worth having + // ------------------------------------------------------------------ + + /** + * The original 32 B/op was measured over 5e6 direct calls. C2 might scalarise the + * {@code double[2]} once {@code StrictMath.sin} is inlined into a larger method with other + * work around it -- in which case the cost in situ would be smaller than the headline and this + * class would be optional. This test runs both implementations inside a loop shaped like a + * real projection kernel and reports what actually happens. + * + *

The kernel is modelled on an ellipsoidal transverse Mercator forward: four {@code sin} + * and four {@code cos} of latitude, doubled latitude, longitude and doubled longitude, plus + * the surrounding {@code sqrt}/{@code atan}/multiply-add arithmetic, over a strided coordinate + * array. One "operation" is one point, so the reported figure is bytes per vertex. + */ + @Test + public void projectionKernelLoopAllocatesNothing() { + final double[] xy = new double[2 * 4096]; + for (int i = 0; i < 4096; i++) { + xy[2 * i] = ((i % 360) - 180) * (Math.PI / 180.0); // lambda + xy[2 * i + 1] = ((i % 170) - 85) * (Math.PI / 180.0); // phi + } + + System.out.println("[FastStrictTrig] etmerc-shaped kernel, one op = one point:"); + + double fast = bytesPerOp("kernel using FastStrictTrig", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + int k = (i & 4095) << 1; + a += fastKernel(xy[k], xy[k + 1]); + } + return a; + } + }); + double strict = bytesPerOp("kernel using StrictMath", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + int k = (i & 4095) << 1; + a += strictKernel(xy[k], xy[k + 1]); + } + return a; + } + }); + double plain = bytesPerOp("kernel using Math (intrinsics, for reference)", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + int k = (i & 4095) << 1; + a += mathKernel(xy[k], xy[k + 1]); + } + return a; + } + }); + + System.out.printf(" => StrictMath costs %.2f B per point more than FastStrictTrig; " + + "at 8 trig calls/point that is %.2f B per trig call.%n", + strict - fast, (strict - fast) / 8.0); + System.out.printf(" => a 100k-vertex geometry: FastStrictTrig %.2f MB, StrictMath %.2f MB.%n", + fast * 100_000.0 / (1024 * 1024), strict * 100_000.0 / (1024 * 1024)); + + assertZero("etmerc-shaped kernel using FastStrictTrig", fast); + assertZero("etmerc-shaped kernel using Math", plain); + } + + /** Eight trig calls plus surrounding arithmetic, as an ellipsoidal tmerc forward would do. */ + private static double fastKernel(double lam, double phi) { + double sp = FastStrictTrig.sin(phi); + double cp = FastStrictTrig.cos(phi); + double s2p = FastStrictTrig.sin(phi + phi); + double c2p = FastStrictTrig.cos(phi + phi); + double sl = FastStrictTrig.sin(lam); + double cl = FastStrictTrig.cos(lam); + double s2l = FastStrictTrig.sin(lam + lam); + double c2l = FastStrictTrig.cos(lam + lam); + return combine(sp, cp, s2p, c2p, sl, cl, s2l, c2l); + } + + private static double strictKernel(double lam, double phi) { + double sp = StrictMath.sin(phi); + double cp = StrictMath.cos(phi); + double s2p = StrictMath.sin(phi + phi); + double c2p = StrictMath.cos(phi + phi); + double sl = StrictMath.sin(lam); + double cl = StrictMath.cos(lam); + double s2l = StrictMath.sin(lam + lam); + double c2l = StrictMath.cos(lam + lam); + return combine(sp, cp, s2p, c2p, sl, cl, s2l, c2l); + } + + private static double mathKernel(double lam, double phi) { + double sp = Math.sin(phi); + double cp = Math.cos(phi); + double s2p = Math.sin(phi + phi); + double c2p = Math.cos(phi + phi); + double sl = Math.sin(lam); + double cl = Math.cos(lam); + double s2l = Math.sin(lam + lam); + double c2l = Math.cos(lam + lam); + return combine(sp, cp, s2p, c2p, sl, cl, s2l, c2l); + } + + /** The non-trig half of the kernel, shared so the three variants differ only in dispatch. */ + private static double combine(double sp, double cp, double s2p, double c2p, + double sl, double cl, double s2l, double c2l) { + final double es = 0.00669437999014133; + double n = Math.sqrt(1.0 - es * sp * sp); + double t = sp / (cp + 1e-300); + double eta = cp * sl; + double x = 0.9996 * 6378137.0 * (eta + s2l * c2p * 0.0008 + s2p * 1e-6); + double y = 0.9996 * 6378137.0 * (t / n + c2l * 0.0004 - s2p * 1e-7); + return x + y + Math.atan2(sp, cl); + } + + // ------------------------------------------------------------------ + // 3. The multi-word reduction path + // ------------------------------------------------------------------ + + /** + * The only path in {@link FastStrictTrig} that still uses arrays is + * {@code __kernel_rem_pio2}, entered for {@code |x| > 2^19*(pi/2)}. It takes them from a + * reusable {@code Scratch}, so it must also be allocation-free -- with a caller-supplied + * scratch unconditionally, and with the thread-local one after the first call on the thread. + */ + @Test + public void multiWordReductionPathAllocatesNothing() { + System.out.println("[FastStrictTrig] huge arguments (multi-word reduction):"); + + final FastStrictTrig.Scratch scratch = new FastStrictTrig.Scratch(); + double callerScratch = bytesPerOp("sin(x, callerScratch), |x| ~ 1e100", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += FastStrictTrig.sin(1e100 + i, scratch); + } + return a; + } + }); + double threadLocal = bytesPerOp("sin(x) thread-local scratch, |x| ~ 1e100", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += FastStrictTrig.sin(1e100 + i); + } + return a; + } + }); + double strictHuge = bytesPerOp("StrictMath.sin, |x| ~ 1e100", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sin(1e100 + i); + } + return a; + } + }); + System.out.printf(" => StrictMath allocates %.2f B/op more on the multi-word path.%n", + strictHuge - threadLocal); + + assertZero("sin(x, callerScratch) on the multi-word path", callerScratch); + assertZero("sin(x) on the multi-word path after warm-up", threadLocal); + } + + /** Each thread gets its own {@code Scratch}, and none of them allocates per call. */ + @Test + public void threadLocalScratchIsPerThreadAndFree() throws Exception { + final double[] result = new double[1]; + final long[] bytes = new long[1]; + Thread t = new Thread(new Runnable() { + public void run() { + double a = 0.0; + for (int i = 0; i < WARMUP; i++) { + a += FastStrictTrig.sin(1e100 + i) + FastStrictTrig.cos(1e100 + i); + } + long before = bean.getThreadAllocatedBytes(Thread.currentThread().getId()); + for (int i = 0; i < N / 10; i++) { + a += FastStrictTrig.sin(1e100 + i) + FastStrictTrig.cos(1e100 + i); + } + long after = bean.getThreadAllocatedBytes(Thread.currentThread().getId()); + bytes[0] = after - before; + result[0] = a; + } + }); + t.start(); + t.join(); + sink += result[0]; + double bpo = bytes[0] / (double) (N / 10); + System.out.printf(" %-52s %10.4f B/op%n", "second thread, thread-local scratch", bpo); + assertZero("a second thread's thread-local scratch path", bpo); + } + + // ------------------------------------------------------------------ + // 4. Sanity: the other transcendentals really are free + // ------------------------------------------------------------------ + + /** + * Establishes which {@code StrictMath} functions allocate, so the scope of the fdlibm porting + * problem is a measured fact rather than an assumption. + * + *

Result, and a correction to the record. {@code exp}, {@code log}, + * {@code atan}, {@code atan2}, {@code asin}, {@code acos}, {@code log1p}, {@code sinh}, + * {@code cosh}, {@code hypot} and {@code sqrt} allocate nothing, as previously believed. + * On Temurin 21.0.11 {@code pow} allocates 96 B/op, which the earlier survey + * recorded as 0.00. It allocates 0 B/op on OpenJDK 26.0.2, so it has since been fixed + * upstream -- {@code sin}, {@code cos} and {@code tan} have not, on either. The cause is not + * subtle: + * {@code FdLibm.Pow.compute} declares three {@code final double[]} locals in its general path, + * {@code BP}, {@code DP_H} and {@code DP_L} (JDK 21 {@code FdLibm.java:2248-2253}), each of + * length 2 — three 32-byte arrays. The earlier measurement must have used an exponent that + * returns from one of {@code pow}'s special-value fast paths ({@code y == 0}, {@code 0.5}, + * {@code 1.0}, {@code 2.0}, {@code -1.0}, or an integral {@code y} with a power-of-two base), + * all of which return before line 2248. This test therefore measures both a general + * {@code pow} and a fast-path {@code pow} and reports them separately. + * + *

So this is a four-function problem. {@code pow} is not in this class's scope, but + * it matters: today's {@code ProjectionMath.phi2} runs a 15-iteration Newton loop with a + * {@code pow} per iteration, i.e. up to 1,440 B per inverse point, and {@code tsfn} uses + * {@code pow} once per forward point. The numerics plan already removes both (a + * {@code ConformalLat} port replaces {@code phi2}, and the {@code tsfn} rewrite trades + * {@code tan}+{@code pow} for {@code exp}+{@code log1p}), which is the cheaper fix. If a + * {@code pow} is still needed after that, the port is trivial — the three arrays are + * {@code final} and never mutated, so lifting them to {@code static final} removes the + * allocation with no change to the arithmetic. + * + *

Nothing here is asserted as zero except the functions that genuinely are on every JDK + * tested. {@code pow}'s general path is version-dependent, so it is measured and printed + * rather than asserted. + */ + @Test + public void whichStrictMathFunctionsAllocate() { + System.out.println("[FastStrictTrig] other StrictMath functions, for scope confirmation:"); + + double exp = bytesPerOp("StrictMath.exp", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.exp(angle(i) * 0.01); + } + return a; + } + }); + double log = bytesPerOp("StrictMath.log", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.log(2.0 + angle(i) * 0.1); + } + return a; + } + }); + double powGeneral = bytesPerOp("StrictMath.pow(base, 0.37) -- general path", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.pow(2.0 + angle(i) * 0.1, 0.37); + } + return a; + } + }); + double powFastPath = bytesPerOp("StrictMath.pow(base, 0.5) -- special-value fast path", + new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.pow(2.0 + angle(i) * 0.1, 0.5); + } + return a; + } + }); + double atan = bytesPerOp("StrictMath.atan", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.atan(angle(i)); + } + return a; + } + }); + double atan2 = bytesPerOp("StrictMath.atan2", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.atan2(angle(i), 1.0); + } + return a; + } + }); + double asin = bytesPerOp("StrictMath.asin", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.asin(angle(i) / 4.0); + } + return a; + } + }); + double acos = bytesPerOp("StrictMath.acos", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.acos(angle(i) / 4.0); + } + return a; + } + }); + double log1p = bytesPerOp("StrictMath.log1p", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.log1p(angle(i) * 0.1); + } + return a; + } + }); + double sinh = bytesPerOp("StrictMath.sinh", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sinh(angle(i) * 0.1); + } + return a; + } + }); + double cosh = bytesPerOp("StrictMath.cosh", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.cosh(angle(i) * 0.1); + } + return a; + } + }); + double hypot = bytesPerOp("StrictMath.hypot", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.hypot(angle(i), 1.0); + } + return a; + } + }); + double sqrt = bytesPerOp("StrictMath.sqrt", new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + a += StrictMath.sqrt(2.0 + angle(i) * 0.1); + } + return a; + } + }); + + assertZero("StrictMath.exp", exp); + assertZero("StrictMath.log", log); + assertZero("StrictMath.atan", atan); + assertZero("StrictMath.atan2", atan2); + assertZero("StrictMath.asin", asin); + assertZero("StrictMath.acos", acos); + assertZero("StrictMath.log1p", log1p); + assertZero("StrictMath.sinh", sinh); + assertZero("StrictMath.cosh", cosh); + assertZero("StrictMath.hypot", hypot); + assertZero("StrictMath.sqrt", sqrt); + assertZero("StrictMath.pow on a special-value fast path", powFastPath); + + // pow's general path is version-dependent: 96 B/op on Temurin 21, 0 B/op on OpenJDK 26. + // Report it rather than assert it, and say which side of the fence this JVM is on. + System.out.printf(" => StrictMath.pow general path allocates %.2f B/op on %s %s " + + "(measured: 96.00 on Temurin 21.0.11, 0.00 on OpenJDK 26.0.2 -- fixed " + + "upstream). sin/cos/tan are NOT fixed on either.%n", + powGeneral, System.getProperty("java.vm.name"), System.getProperty("java.version")); + } + + // ------------------------------------------------------------------ + + private static void assertZero(String what, double bytesPerOp) { + assertTrue(what + " must allocate nothing, measured " + bytesPerOp + " B/op", + bytesPerOp < ZERO_TOLERANCE); + } + + /** + * The positive control, and the reason every {@code 0.00 B/op} above is worth + * reading. An instrument that reports zero for everything reports exactly the result + * this class hopes for, and the failure is silent. This test therefore runs two workloads whose + * allocation is known by construction -- one {@code double[2]} per operation, and four -- and + * requires the counter both to see them and to scale with them. + * + *

This replaces "{@code StrictMath} must allocate" as the non-vacuity guard. That premise + * was scaffolding of the same intent but it was a claim about a third party's implementation, + * and it is false on every JDK before 21 (see the class javadoc), so it failed on a supported + * JDK while proving nothing about proj4j. This control is a claim about the measurement, which + * is what actually needed proving, and it holds on every JDK. + * + *

Bounds are deliberately loose. The expected figure is 32 B per array -- a 16-byte array + * header plus two doubles -- but header layout is a VM detail (compact object headers, compressed + * class pointers), so the assertion is a floor of 16 B/op and a requirement that four arrays cost + * at least three times one. Both are far below any plausible layout and far above the 0.01 B/op + * that counts as zero, so the control discriminates without pinning a VM's object model. + */ + @Test + public void theInstrumentCanSeeAllocation() { + final int ops = 500_000; + System.out.println("[FastStrictTrig] positive control -- can the counter see a known " + + "allocation?"); + + double one = bytesPerOp("control: one double[2] per op (expect ~32 B)", ops, + new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + double[] carrier = new double[2]; + carrier[0] = i; + carrier[1] = i + 1; + objectSink = carrier; // escapes: C2 cannot scalar-replace it + a += carrier[0]; + } + return a; + } + }); + double four = bytesPerOp("control: four double[2] per op (expect ~128 B)", ops, + new Workload() { + public double run(int n) { + double a = 0.0; + for (int i = 0; i < n; i++) { + for (int k = 0; k < 4; k++) { + double[] carrier = new double[2]; + carrier[0] = i + k; + objectSink = carrier; + a += carrier[0]; + } + } + return a; + } + }); + + assertTrue("the allocation counter cannot see a double[2] allocated on every one of " + + ops + " iterations -- it measured " + one + " B/op, so every 0.00 B/op " + + "reported by this class would be an artefact of a blind instrument " + + "rather than a property of the code", + one >= 16.0); + assertTrue("the allocation counter is not quantitative: four arrays per op measured " + + four + " B/op against " + one + " B/op for one, and must measure at " + + "least three times as much", four >= 3.0 * one); + System.out.printf(" => the counter resolves %.2f B/op for one carrier and %.2f for four, " + + "against a %.2f B/op zero threshold.%n", one, four, ZERO_TOLERANCE); + } + + /** The instrument itself must not allocate, or every figure above is inflated. */ + @Test + public void theInstrumentDoesNotAllocate() { + for (int i = 0; i < 100_000; i++) { + sink += allocated(); + } + long before = allocated(); + long acc = 0; + for (int i = 0; i < 1_000_000; i++) { + acc += allocated(); + } + long after = allocated(); + sink += acc; + assertEquals("getThreadAllocatedBytes must not allocate; a boxed call would inflate every " + + "other measurement in this class", + 0L, (after - before) / 1_000_000L); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/FastStrictTrigIdentityTest.java b/core/src/test/java/org/locationtech/proj4j/util/trig/FastStrictTrigIdentityTest.java new file mode 100644 index 0000000..723d409 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/FastStrictTrigIdentityTest.java @@ -0,0 +1,385 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig; + +import org.junit.Test; +import org.locationtech.proj4j.util.FastStrictTrig; + +import java.util.Random; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Proves that {@link FastStrictTrig} is bit-identical to {@link StrictMath} for + * {@code sin}, {@code cos} and {@code tan}. + * + *

Bit-identity, not a tolerance, is the whole point of the class. proj4j's reason for using + * fdlibm trigonometry is fidelity to the implementation that generated PROJ's {@code gie} expected + * values (in the adams family a 1-ulp {@code sin} difference is amplified by ~3e8 and moves a + * result 27.8 mm outside a 1 mm bar), plus cross-architecture determinism for a downstream Spark + * consumer. An "almost fdlibm" {@code sin} would silently forfeit both while looking like a win, + * so every comparison here is on {@link Double#doubleToRawLongBits}: {@code +0.0} and + * {@code -0.0} are distinguished, and NaN payloads are compared rather than collapsed. + * + *

Coverage, in order of the branches it is aimed at: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
input classes and the code path each targets
input classpath exercised
the gie corpus's own latitude/longitude values, in degrees and radiansthe realistic workload
every {@code k*pi/4} and {@code k*pi/2} for {@code |k| <= 2048}, each with three + * {@code nextUp} and three {@code nextDown} neighboursthe {@code |x| ~< pi/4} short circuit, the {@code n = +/-1} special case, the + * {@code npio2_hw} cancellation check and the 2nd/3rd reduction rounds
1e10, 1e100, {@code Double.MAX_VALUE}, {@code pi*2^k}, the classic + * {@code 6381956970095103 * 2^797} worst case, and the {@code 2^19*(pi/2)} boundary{@code __kernel_rem_pio2}'s multi-word limb arithmetic, including its recomputation + * loop
subnormals from {@code Double.MIN_VALUE} upwardthe {@code |x| < 2^-27} / {@code 2^-28} inexact short circuits
{@code +/-0.0}, {@code +/-Infinity}, quiet and signalling NaN with non-default + * payloads, negative NaNspecial-case returns
3,000,000 pseudo-random doubles from four fixed-seed generators, one of which + * produces raw bit patternseverything, reproducibly
+ */ +public class FastStrictTrigIdentityTest { + + /** Fixed so that a failure is reproducible; do not change without recording why. */ + private static final long SEED = 0x50524f4a344aL; // "PROJ4J" + + // ------------------------------------------------------------------ + // Bitwise comparison helpers + // ------------------------------------------------------------------ + + private static void assertBitIdentical(String what, double x, double expected, double actual) { + long e = Double.doubleToRawLongBits(expected); + long a = Double.doubleToRawLongBits(actual); + if (e != a) { + throw new AssertionError(String.format( + "%s(%s) [bits 0x%016x]: StrictMath -> %s [0x%016x], FastStrictTrig -> %s [0x%016x]", + what, Double.toString(x), Double.doubleToRawLongBits(x), + Double.toString(expected), e, Double.toString(actual), a)); + } + } + + /** Asserts all three functions agree bitwise with {@link StrictMath} at {@code x}. */ + private static void check(double x) { + assertBitIdentical("sin", x, StrictMath.sin(x), FastStrictTrig.sin(x)); + assertBitIdentical("cos", x, StrictMath.cos(x), FastStrictTrig.cos(x)); + assertBitIdentical("tan", x, StrictMath.tan(x), FastStrictTrig.tan(x)); + // the caller-supplied-scratch overloads must be indistinguishable from the thread-local ones + FastStrictTrig.Scratch s = new FastStrictTrig.Scratch(); + assertBitIdentical("sin(x,scratch)", x, StrictMath.sin(x), FastStrictTrig.sin(x, s)); + assertBitIdentical("cos(x,scratch)", x, StrictMath.cos(x), FastStrictTrig.cos(x, s)); + assertBitIdentical("tan(x,scratch)", x, StrictMath.tan(x), FastStrictTrig.tan(x, s)); + } + + /** As {@link #check(double)} but without the scratch overloads, for the bulk sweeps. */ + private static void checkFast(double x) { + assertBitIdentical("sin", x, StrictMath.sin(x), FastStrictTrig.sin(x)); + assertBitIdentical("cos", x, StrictMath.cos(x), FastStrictTrig.cos(x)); + assertBitIdentical("tan", x, StrictMath.tan(x), FastStrictTrig.tan(x)); + } + + /** {@code x} and its three nearest neighbours in each direction. */ + private static void checkNeighbourhood(double x) { + double up = x; + double down = x; + check(x); + for (int i = 0; i < 3; i++) { + up = Math.nextUp(up); + down = Math.nextAfter(down, Double.NEGATIVE_INFINITY); + check(up); + check(down); + } + } + + // ------------------------------------------------------------------ + // 1. Signed zero, by raw bits + // ------------------------------------------------------------------ + + /** + * {@code sin(+0.0)} must be {@code +0.0} and {@code sin(-0.0)} must be {@code -0.0}. The gie + * comparator distinguishes the two at the equator and the antimeridian, so an implementation + * that returned {@code +0.0} for both would be wrong in a way {@code assertEquals(a, b, 0.0)} + * cannot see. + */ + @Test + public void signedZeroIsPreservedByRawBits() { + assertEquals("sin(+0.0) must be +0.0", + 0x0000000000000000L, Double.doubleToRawLongBits(FastStrictTrig.sin(0.0))); + assertEquals("sin(-0.0) must be -0.0", + 0x8000000000000000L, Double.doubleToRawLongBits(FastStrictTrig.sin(-0.0))); + assertEquals("tan(+0.0) must be +0.0", + 0x0000000000000000L, Double.doubleToRawLongBits(FastStrictTrig.tan(0.0))); + assertEquals("tan(-0.0) must be -0.0", + 0x8000000000000000L, Double.doubleToRawLongBits(FastStrictTrig.tan(-0.0))); + assertEquals("cos(+0.0) must be +1.0", + Double.doubleToRawLongBits(1.0), Double.doubleToRawLongBits(FastStrictTrig.cos(0.0))); + assertEquals("cos(-0.0) must be +1.0", + Double.doubleToRawLongBits(1.0), Double.doubleToRawLongBits(FastStrictTrig.cos(-0.0))); + + // and, redundantly, that StrictMath agrees -- if it ever did not, the premise is wrong + check(0.0); + check(-0.0); + } + + // ------------------------------------------------------------------ + // 2. Special values + // ------------------------------------------------------------------ + + /** + * Infinities, and NaNs carrying payloads other than the canonical {@code 0x7ff8...0}. Both + * implementations return {@code x - x}, so the resulting NaN's bits must match exactly. + */ + @Test + public void infinitiesAndNaNPayloads() { + check(Double.POSITIVE_INFINITY); + check(Double.NEGATIVE_INFINITY); + check(Double.NaN); + check(Double.longBitsToDouble(0x7ff8_0000_dead_beefL)); // quiet NaN, non-default payload + check(Double.longBitsToDouble(0xfff8_0000_0000_0001L)); // negative quiet NaN + check(Double.longBitsToDouble(0x7ff0_0000_0000_0001L)); // signalling NaN + check(Double.longBitsToDouble(0x7ff4_2424_2424_2424L)); + check(Double.longBitsToDouble(0xffff_ffff_ffff_ffffL)); + } + + /** Subnormals and the smallest normals, which take the {@code |x| < 2^-27} short circuits. */ + @Test + public void subnormalsAndTinyNormals() { + check(Double.MIN_VALUE); + check(-Double.MIN_VALUE); + check(Double.MIN_NORMAL); + check(-Double.MIN_NORMAL); + check(Math.nextAfter(Double.MIN_NORMAL, 0.0)); + for (int p = 0; p < 52; p++) { // every subnormal power of two + double v = Double.longBitsToDouble(1L << p); + checkFast(v); + checkFast(-v); + checkFast(v * 3.0); + } + for (int e = -1022; e <= 0; e++) { // every normal power of two below 1 + double v = Double.longBitsToDouble(((long) (1023 + e)) << 52); + checkFast(v); + checkFast(-v); + checkFast(Math.nextUp(v)); + } + // the exact 2^-27 and 2^-28 thresholds and their neighbours + checkNeighbourhood(0x1.0p-27); + checkNeighbourhood(-0x1.0p-27); + checkNeighbourhood(0x1.0p-28); + checkNeighbourhood(-0x1.0p-28); + checkNeighbourhood(0x1.0p-29); + } + + // ------------------------------------------------------------------ + // 3. Argument-reduction branch thresholds + // ------------------------------------------------------------------ + + /** + * Every {@code k*pi/4} and {@code k*pi/2} up to {@code |k| = 2048}, with three neighbours + * either side. These straddle the {@code pi/4} short circuit, the {@code 3pi/4} special case, + * the 32-entry {@code npio2_hw} cancellation table, and the points where fdlibm needs its 2nd + * and 3rd reduction rounds. + */ + @Test + public void quadrantBoundaryNeighbourhoods() { + for (int k = -2048; k <= 2048; k++) { + checkNeighbourhood(k * (Math.PI / 4.0)); + checkNeighbourhood(k * (Math.PI / 2.0)); + checkNeighbourhood(k * Math.PI); + // computed the other way round, which lands on different doubles + checkNeighbourhood(k * Math.PI / 4.0); + checkNeighbourhood(k * Math.PI / 2.0); + } + } + + /** The exact high-word thresholds fdlibm branches on. */ + @Test + public void exactBranchThresholds() { + long[] highWords = { + 0x3fe921fbL, // |x| ~< pi/4 short circuit + 0x3fe921fcL, + 0x3fd33333L, // kernel_cos |x| < 0.3 + 0x3fe90000L, // kernel_cos x > 0.78125 + 0x3fe59428L, // kernel_tan |x| >= 0.6744 + 0x3e400000L, // kernel_sin/cos |x| < 2^-27 + 0x3e300000L, // kernel_tan |x| < 2^-28 + 0x4002d97cL, // |x| < 3pi/4 special case + 0x3ff921fbL, // near pi/2, 33+33+53 bit pi + 0x41392000L, + 0x413921fbL, // |x| ~<= 2^19*(pi/2), the medium/huge boundary + 0x413921fcL, + 0x7fefffffL, // largest finite high word + }; + for (long hw : highWords) { + for (int lo = -3; lo <= 3; lo++) { + double v = Double.longBitsToDouble((hw << 32) + lo); + check(v); + check(-v); + } + double v = Double.longBitsToDouble((hw << 32) | 0x5555_5555L); + check(v); + check(-v); + } + } + + // ------------------------------------------------------------------ + // 4. The multi-word (__kernel_rem_pio2) path + // ------------------------------------------------------------------ + + /** + * Arguments large enough to force {@code __kernel_rem_pio2}'s 24-bit limb arithmetic. This is + * the only path in the ported code that still uses arrays, so it is the one where a + * transcription slip would hide. + */ + @Test + public void hugeArgumentsStressMultiWordReduction() { + check(1e10); + check(-1e10); + check(1e100); + check(-1e100); + check(1e300); + check(Double.MAX_VALUE); + check(-Double.MAX_VALUE); + check(Math.nextAfter(Double.MAX_VALUE, 0.0)); + check(0x1.0p1023); + check(0x1.fffffffffffffp1023); + + // the textbook worst case for pi/2 argument reduction: 6381956970095103 * 2^797 + check(6381956970095103.0 * Math.pow(2.0, 797.0)); + check(Double.longBitsToDouble(0x6c6152e8f8f2af13L)); + + // pi and 2/pi scaled across the whole exponent range: near-multiples of pi/2 at every + // magnitude, which is what drives kernel_rem_pio2's recomputation loop + for (int e = 20; e <= 1023; e++) { + double scale = Double.longBitsToDouble(((long) (1023 + e)) << 52); + checkFast(Math.PI * scale); + checkFast(-Math.PI * scale); + checkFast((Math.PI / 2.0) * scale); + checkFast(0x1.45f306dc9c883p-1 * scale); // 2/pi + checkFast(scale); + checkFast(scale + 1.0); + checkFast(Math.nextUp(scale)); + checkFast(Math.nextAfter(scale, 0.0)); + } + + // every power of two above the medium/huge boundary, plus neighbours + for (int e = 19; e <= 1023; e++) { + double v = Double.longBitsToDouble(((long) (1023 + e)) << 52); + checkFast(v * (Math.PI / 2.0)); + checkFast(Math.nextUp(v * (Math.PI / 2.0))); + } + } + + // ------------------------------------------------------------------ + // 5. The actual workload: the gie corpus's own angles + // ------------------------------------------------------------------ + + /** + * The 7,618 distinct angle-shaped literals from PROJ's {@code gie} corpus, in degrees and + * converted to radians, plus the halved-longitude form that the adams family feeds to + * {@code sin} -- the exact quantity whose 1-ulp difference decided + * {@code adams_ws2.gie:2139}. + */ + @Test + public void gieCorpusAngles() { + double[] deg = GieCorpusAngles.degrees(); + assertTrue("expected the embedded gie corpus to be populated, got " + deg.length, + deg.length > 7000); + for (int i = 0; i < deg.length; i++) { + double d = deg[i]; + checkFast(d); // as written, treated as radians + double rad = Math.toRadians(d); + checkFast(rad); + checkFast(rad / 2.0); // adams: sin(lam/2) + checkFast(rad * 2.0); + checkFast(Math.PI / 2.0 - rad); // co-latitude + checkFast(Math.nextUp(rad)); + checkFast(Math.nextAfter(rad, Double.NEGATIVE_INFINITY)); + } + } + + // ------------------------------------------------------------------ + // 6. Pseudo-random sweeps, fixed seed + // ------------------------------------------------------------------ + + /** 1,000,000 uniform draws from {@code [-4pi, 4pi]} -- the range a transform actually sees. */ + @Test + public void randomNearRange() { + Random rnd = new Random(SEED); + for (int i = 0; i < 1_000_000; i++) { + checkFast((rnd.nextDouble() - 0.5) * 8.0 * Math.PI); + } + } + + /** 500,000 uniform draws from {@code [-1e6, 1e6]}, straddling the medium/huge boundary. */ + @Test + public void randomMediumRange() { + Random rnd = new Random(SEED + 1); + for (int i = 0; i < 500_000; i++) { + checkFast((rnd.nextDouble() - 0.5) * 2.0e6); + } + } + + /** 500,000 log-uniform magnitudes across the full binary exponent range. */ + @Test + public void randomLogUniformMagnitude() { + Random rnd = new Random(SEED + 2); + for (int i = 0; i < 500_000; i++) { + int exp = rnd.nextInt(2098) - 1074; // subnormal floor to 2^1023 + double mant = 1.0 + rnd.nextDouble(); + double v = mant * Math.pow(2.0, exp); + checkFast(rnd.nextBoolean() ? v : -v); + } + } + + /** + * 1,000,000 raw 64-bit patterns reinterpreted as doubles. This is the harshest sweep: about + * half the draws exceed {@code 2^19*(pi/2)} and take the multi-word path, and the sweep + * naturally includes NaNs, infinities and subnormals. + */ + @Test + public void randomRawBitPatterns() { + Random rnd = new Random(SEED + 3); + for (int i = 0; i < 1_000_000; i++) { + checkFast(Double.longBitsToDouble(rnd.nextLong())); + } + } + + /** + * The scratch-taking overloads over the same raw-bit sweep, with one {@code Scratch} reused + * throughout -- proving reuse leaves no stale state in {@code iq}/{@code f}/{@code fq}/ + * {@code q} that could perturb a later call. + */ + @Test + public void reusedScratchGivesIdenticalResults() { + FastStrictTrig.Scratch s = new FastStrictTrig.Scratch(); + Random rnd = new Random(SEED + 3); + for (int i = 0; i < 1_000_000; i++) { + double x = Double.longBitsToDouble(rnd.nextLong()); + assertBitIdentical("sin(x,reused)", x, StrictMath.sin(x), FastStrictTrig.sin(x, s)); + assertBitIdentical("cos(x,reused)", x, StrictMath.cos(x), FastStrictTrig.cos(x, s)); + assertBitIdentical("tan(x,reused)", x, StrictMath.tan(x), FastStrictTrig.tan(x, s)); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/GieCorpusAngles.java b/core/src/test/java/org/locationtech/proj4j/util/trig/GieCorpusAngles.java new file mode 100644 index 0000000..847e4d6 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/GieCorpusAngles.java @@ -0,0 +1,1266 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig; + +/** + * Every distinct angle-shaped decimal literal appearing on an {@code accept} or {@code expect} + * line of PROJ's {@code gie} conformance corpus (the 53 {@code .gie} files under + * {@code conformance/src/test/resources}), deduplicated and sorted: 7618 values. + * + *

"Angle-shaped" means {@code |v| <= 400}, which admits latitudes, longitudes and the handful + * of deliberately out-of-range longitudes the corpus probes, and excludes projected metres, + * ellipsoid axes and epoch years. + * + *

These are embedded rather than read from {@code conformance/} at run time so that + * {@link FastStrictTrigIdentityTest} is self-contained, deterministic, and cannot degrade into a + * skip when the sibling module is absent. + * + *

To regenerate: take every whitespace-separated token on an {@code accept} or {@code expect} + * line of every {@code .gie} file under {@code conformance/src/test/resources}, keep those that + * parse as a plain decimal (no exponent), keep those with {@code |v| <= 400}, then sort and + * deduplicate numerically. + * + *

The literals are held as strings because 7618 {@code double} literals would overflow the + * 64 KB limit on a single method's bytecode if written as an array initialiser. + */ +final class GieCorpusAngles { + + private GieCorpusAngles() { + } + + private static final String CHUNK_0 = + "-280.3683,-274.7286,-223.6178,-207.544906814,-207.447024504,-202.5882,-200,-180.1,-180," + + "-179.999999,-179.999104753,-179.999,-179.99706624,-179.99660139,-179.9964664,-179.99637361," + + "-179.99,-179.9887698836,-179.9634704329,-179.9618334794,-179.9613846400,-179.9594024463," + + "-179.9444701529,-179.9256771826,-179.8967233384,-179.8630282894,-179.8457680307,-179.8424303971," + + "-179.8411044403,-179.8401984185,-179.8166667,-179.816,-179.7984994410,-179.7714315704," + + "-179.7711795627,-179.7614880705,-179.7591323884,-179.7332624578,-179.7273734266,-179.7095201992," + + "-179.7092450238,-179.6928502294,-179.6808058361,-179.6765866679,-179.6728016921,-179.6675977383," + + "-179.6672737749,-179.6651296552,-179.6574960805,-179.6530173733,-179.6509243766,-179.6225370823," + + "-179.6179355770,-179.6126302052,-179.6121212366,-179.5943789042,-179.5621188253,-179.5390947423," + + "-179.5170670673,-179.4988010038,-179.4933532172,-179.4804785664,-179.4511464235,-179.4283603569," + + "-179.4163113130,-179.3916734336,-179.3862724658,-179.3731911762,-179.3409209668,-179.3405213764," + + "-179.3392011550,-179.3366303542,-179.3361000782,-179.3343647471,-179.3089746696,-179.3073985765," + + "-179.2831936865,-179.2788799656,-179.2598149320,-179.2338274749,-179.2332724818,-179.2332673731," + + "-179.2247622429,-179.2224188803,-179.2192819040,-179.1949344790,-179.1943150364,-179.1879408995," + + "-179.1819571823,-179.1586219943,-179.1544921899,-179.1529257481,-179.1498353863,-179.1485401294," + + "-179.1153600127,-179.0903238876,-179.0512914938,-179.0206911010,-179.0035064,-179,-177.8077194," + + "-175.8077194,-170.0,-169.9897278030,-169.9896135260,-169.9866964666,-169.9852102849," + + "-169.9844730348,-169.9733110986,-169.9633593449,-169.9437203572,-169.9318029695,-169.9316998581," + + "-169.9257769945,-169.9075691637,-169.9016120813,-169.8999068245,-169.8899091213,-169.8822070628," + + "-169.8774561096,-169.8505428520,-169.8319368721,-169.8193242429,-169.8189576120,-169.8040567331," + + "-169.8021514554,-169.7924972767,-169.7451954874,-169.7405185971,-169.7323895837,-169.7237623059," + + "-169.7161399275,-169.7119531770,-169.6918872432,-169.6824431551,-169.6454904074,-169.6391212860," + + "-169.6232517758,-169.6193301609,-169.6164294546,-169.6126454375,-169.6109651378,-169.6056153255," + + "-169.5969137916,-169.5842217825,-169.5070586751,-169.4186924041,-169.4132895133,-169.3994668623," + + "-169.3849428190,-169.3809207620,-169.3792405914,-169.3697449847,-169.3508199207,-169.3475485875," + + "-169.3418436736,-169.3270885266,-169.3071682617,-169.3015609686,-169.2920835775,-169.2570543721," + + "-169.2464750707,-169.2261536485,-169.2223492311,-169.2195161001,-169.2134281484,-169.2003519382," + + "-169.1901512061,-169.1616383718,-169.1490260788,-169.1462360158,-169.1314097124,-169.1226136208," + + "-169.0785389235,-169.0657035958,-169.0544424157,-169.0436424710,-169.0421166099,-169.0184062476," + + "-168.75,-166.8077194,-165.002520561,-165.002520542,-164.997479458,-164.997479439,-164.737589," + + "-160.082332372,-160.042203156,-160,-159.9956088875,-159.9945746863,-159.9907938476," + + "-159.9895526197,-159.9839735761,-159.9563893280,-159.9535088204,-159.9508405867,-159.9503807693," + + "-159.9464206150,-159.9453288766,-159.9351347433,-159.9256766432,-159.9211815920,-159.9169552740," + + "-159.8730648764,-159.854014458,-159.8421069000,-159.8318959140,-159.830804303,-159.8162149104," + + "-159.8158750237,-159.8126151474,-159.7905342089,-159.7592377898,-159.7586035106,-159.7576358296," + + "-159.7470584020,-159.7193834386,-159.6997771019,-159.6897632216,-159.6893113052,-159.6715880943," + + "-159.6630800816,-159.6203666385,-159.6143094365,-159.6140419013,-159.5989242161,-159.5830169036," + + "-159.5787597594,-159.5389911401,-159.5376706591,-159.5308654294,-159.5209982370,-159.5167125707," + + "-159.5146913398,-159.4580308434,-159.4518981501,-159.4420546811,-159.4339156279,-159.4124846191," + + "-159.4102418582,-159.4055152547,-159.3961353214,-159.3917581951,-159.3788558458,-159.3652618381," + + "-159.3629518885,-159.3550554816,-159.3418105960,-159.3398127142,-159.3396275493,-159.3116700662," + + "-159.2911675882,-159.2878573247,-159.2560731724,-159.2369236977,-159.2365467427,-159.2336212919," + + "-159.2152700578,-159.2003712209,-159.1659774291,-159.1639611249,-159.1237371257,-159.1192163384," + + "-159.1164133392,-159.1006283258,-159.0918834805,-159.0744411429,-159.0508327192,-159.0120452761," + + "-158.163295045,-158.1,-158.0999996011,-158,-157.9999996115,-157.989285000,-157.58387651437764," + + "-157.5153533577128,-154.8623,-151,-150.6222299120939,-150.55720908958426,-150.01693111," + + "-150.01209192,-150,-149.9984258738,-149.99532167,-149.9913638701,-149.9878180879," + + "-149.9672222696,-149.9545173238,-149.9417464353,-149.9215059659,-149.9176675016,-149.8939906743," + + "-149.8580885141,-149.8486678837,-149.8454884475,-149.8429607974,-149.8423978548,-149.8226015684," + + "-149.8050966059,-149.7658699571,-149.7374470773,-149.7206409942,-149.7114004837,-149.6934351691," + + "-149.6506452375,-149.6430387202,-149.6086565801,-149.6075138921,-149.5868788879,-149.5670531797," + + "-149.5559422097,-149.5081205584,-149.4879824588,-149.4668694945,-149.4619550763,-149.4585690847," + + "-149.4451039042,-149.4389257633,-149.4387461093,-149.3960866375,-149.3864893992,-149.3642571872," + + "-149.3566080854,-149.3554284700,-149.3430287138,-149.3420413989,-149.3417213155,-149.3340973772," + + "-149.3318176481,-149.3198962805,-149.3161804706,-149.3051183917,-149.2815042820,-149.2779203136," + + "-149.2613507188,-149.2529018703,-149.2463523987,-149.2442235779,-149.2431319392,-149.2254953136," + + "-149.2250378095,-149.1975646236,-149.1969312324,-149.1603401895,-149.1514601079,-149.1327424918," + + "-149.1140289956,-149.1119232566,-149.0925061081,-149.0814548820,-149.0803324654,-149.0662979992," + + "-149.0633836490,-149.0451837035,-149.0300160729,-149.0127901515,-149.0072837113,-149.0045856345," + + "-149.0042143904,-147.0023233121,-147.0,-145.850344,-145.381043551,-145.347827407,-145.000000000," + + "-144.758985461,-144.734239827,-143.9999611505,-143,-142.9972522,-142.002804722,-142.0026922," + + "-142,-141.9973078,-141.997195278,-141.100733224,-141,-140.997219722,-140.9971981,-140.002795278," + + "-140.0027922,-140,-139.9543854131,-139.9457181785,-139.9375452903,-139.9118046279," + + "-139.8871282560,-139.8836795793,-139.8793305042,-139.8603273594,-139.8591282059,-139.848475278," + + "-139.847222222,-139.8411358400,-139.8251656458,-139.7669273536,-139.7582139899,-139.7502220731," + + "-139.7372920424,-139.7153960960,-139.7058201004,-139.6996779260,-139.6978190662,-139.6942131577," + + "-139.6411690265,-139.6233037328,-139.6041758915,-139.5731057891,-139.5716369758,-139.5485387788," + + "-139.5441662785,-139.5406690392,-139.5308439004,-139.5282281225,-139.5235597836,-139.5233350739," + + "-139.5027225646,-139.4921425087,-139.4875552064,-139.4767743694,-139.4537382278,-139.4509254495," + + "-139.4466193836,-139.4229348418,-139.3978823413,-139.3972998819,-139.3941906099,-139.3764020016," + + "-139.3706367143,-139.3677527689,-139.3420792457,-139.3350755264,-139.3117413904,-139.3084750889," + + "-139.3059860307,-139.2634124047,-139.2453966436,-139.2361655032,-139.2301202473,-139.2283007229," + + "-139.2134827169,-139.1869613409,-139.1842997548,-139.1720109722,-139.1669991056,-139.1612469827," + + "-139.1470666283,-139.1323352132,-139.1270212047,-139.1131932532,-139.1100287608,-139.0970719139," + + "-139.0901904339,-139.0897465732,-139.0879724776,-139.0517203599,-139.0476545160,-139.0329602286," + + "-139.0300120770,-139.0195163151,-139.0081254157,-139.0047357806,-139.0005407033,-139," + + "-138.9973075,-138.997199444,-138.8484925,-138.847222222,-138.061132778,-138.06,-138.058731111," + + "-138.056268889,-138.055,-138.053867222,-138.051268889,-138.051132778,-138.05,-138.048867222," + + "-138.048731111,-138.046268889,-138.045,-138.043867222,-138.041132778,-138.04,-138.038730833," + + "-138.002957222,-138.0026767,-138,-137.848505556,-137.847222222,-136.848525278,-136.847222222," + + "-136.8077194,-135.00596333,-135.00454845,-135,-134.99891389,-134.9973733,-134.997081944,-133," + + "-132.9984775,-132.998205278,-132.1803037588,-131.457260278,-131.4571578,-131.4555556," + + "-131.455555556,-131.206816960,-131.171390467,-130.519451667,-130.519401944,-130.5193953," + + "-130.519391111,-130.5193731,-130.519346389,-130.5193258,-130.5192992,-130.5192539,-130.5177467," + + "-130.517746667,-130.5162172,-130.5161942,-130.5161675,-130.516146944,-130.5161458,-130.5161206," + + "-130.5160981,-130.516098056,-130.516091667,-130.516067222,-130.516041667,-130.002737222," + + "-130.0025347,-130,-129.9999093970,-129.9856069274,-129.9744744916,-129.9719878520," + + "-129.9085174848,-129.9037457234,-129.8834678056,-129.8787197288,-129.8722920081,-129.8276916999," + + "-129.8203349111,-129.8134586050,-129.8103143949,-129.8015642819,-129.7998353504,-129.7970972042," + + "-129.7889045882,-129.7848559822,-129.7815708228,-129.7801336775,-129.7785737569,-129.7766004320," + + "-129.7742695161,-129.7628486402,-129.7568071343,-129.7548669173,-129.7364301888,-129.7243722634," + + "-129.6865020082,-129.6848433059,-129.6731808706,-129.6568991775,-129.6487283950,-129.6145782219," + + "-129.5655598613,-129.5641039139,-129.5571592628,-129.5556705121,-129.5512190326,-129.4952290080," + + "-129.4903340896,-129.4780322813,-129.4677006422,-129.4619391187,-129.4584139907,-129.4240513471," + + "-129.3953824841,-129.3754143228,-129.3599142098,-129.3590935485,-129.3433138149,-129.3194639426," + + "-129.3174577073,-129.3012716885,-129.2607005772,-129.2596978253,-129.2494581925,-129.2489121030," + + "-129.2447556879,-129.2432705270,-129.2347342883,-129.2286632319,-129.2026665027,-129.1647510809," + + "-129.1479377942,-129.1268966632,-129.1196020868,-129.1116359654,-129.1106150079,-129.1103803259," + + "-129.0884027419,-129.0729383513,-129.0718020283,-129.0707848713,-129.0489643890,-129.0166066782," + + "-128.545936111,-128.5459361,-128.5444444,-128.5444,-128.457086944,-128.4570433,-128.4555556," + + "-128.455555556,-128.003472222,-128.0034722,-128.002737778,-128.0009742,-128.000734722,-128," + + "-127.4835,-126,-125.997388333,-124.9986638571,-122.4250009683,-122.4249999391,-122.4194," + + "-122.3846388888889,-121.0000,-120.234501,-120.2345,-120.00150694,-120,-119.9989025368," + + "-119.99323757,-119.99323663,-119.9922412,-119.9918525,-119.9915203582,-119.9896731679," + + "-119.9746970079,-119.9724472555,-119.9476298931,-119.9464541970,-119.9384666450,-119.8893057705," + + "-119.8872640416,-119.8773360504,-119.8747965281,-119.8562785026,-119.8383311004,-119.8341799056," + + "-119.8194582121,-119.8160590971,-119.8005497638,-119.8002013346,-119.7728590554,-119.7726048543," + + "-119.7677289390,-119.7410720497,-119.7066160149,-119.7041959034,-119.6940989810,-119.6924991127," + + "-119.6918931722,-119.6844932150,-119.6801874031,-119.6591996700,-119.6585401358,-119.6509465671," + + "-119.6412398776,-119.6382190434,-119.6286953558,-119.6161746714,-119.6070748182,-119.5849519031," + + "-119.5691328385,-119.5653357447,-119.5111667574,-119.4953757022,-119.4793423714,-119.4455633048," + + "-119.4082102166,-119.3829013254,-119.3765659597,-119.3732549373,-119.3705764793,-119.3659376731," + + "-119.3388991582,-119.3377596938,-119.3228272091,-119.3172537231,-119.3119539671,-119.3115606256," + + "-119.3040589991,-119.2867946872,-119.2864956877,-119.2765495979,-119.2572393635,-119.2525297571," + + "-119.2460222852,-119.2367048985,-119.2324314226,-119.2273385573,-119.2267713387,-119.2218964968," + + "-119.2025789331,-119.1898998617,-119.1614046516,-119.1501250857,-119.1305416029,-119.1303161403," + + "-119.0464442962,-119.0212234055,-119.0155367869,-119.0042762894,-119.000000000,-118.987112613," + + "-118.96768373,-116.22716741,-115.5427092888,-115.5416667,-115.001261389,-115.001251111,-115," + + "-114.998744167,-112.96622187,-112.21827126,-112.166607778,-112.165693333,-112.000904639," + + "-112.0008525,-112.0008492,-112.0008325,-112.0008286,-112.000825278,-112.0008022,-112," + + "-111.9991756,-111.999174722,-111.9991714,-111.9991678,-111.9991214,-111.9991175,-111.999095278," + + "-111.999093889,-111.701070433669,-110.363307925,-110.305190410,-110,-109.9942126502," + + "-109.9910713909,-109.9862107641,-109.9662473469,-109.9549521935,-109.9384914753,-109.9331600482," + + "-109.9122840717,-109.8793121665,-109.8732055905,-109.8617968496,-109.8410023851,-109.8259504273," + + "-109.8164701029,-109.8061814794,-109.7805542206,-109.7735055519,-109.7581919902,-109.7343311582," + + "-109.7214510325,-109.7138958240,-109.7130644703,-109.7008776088,-109.6962230001,-109.6905533732," + + "-109.6864148265,-109.6674914716,-109.6391371233,-109.6371217071,-109.6274703609,-109.5992779696," + + "-109.5840686978,-109.5579719203,-109.5551540716,-109.5378587803,-109.5375733271,-109.5059723182," + + "-109.4951561921,-109.4758176356,-109.4717350642,-109.4668005307,-109.4603476745,-109.4245072379," + + "-109.4080456874,-109.4052121056,-109.4049571753,-109.3989071392,-109.3805129308,-109.3741418826," + + "-109.3485953585,-109.3390467545,-109.3372260355,-109.3335459376,-109.3328522812,-109.3246360912," + + "-109.3222469320,-109.3071655658,-109.3006137776,-109.2977430033,-109.2885142234,-109.2754065272," + + "-109.2664761985,-109.22990606962236,-109.2062914741,-109.19369493541197,-109.1765297705," + + "-109.1746441433,-109.1716302230,-109.1571755829,-109.1270697537,-109.1249371549,-109.1071943611," + + "-109.1061461002,-109.0958379349,-109.0808307002,-109.0371133259,-109.0271864056,-109.0050595456," + + "-109,-108.74281284723317,-108.71768234825969,-108,-106.8077194,-106,-105.0174505020,-104,-102," + + "-100.33333333333333,-100.33333333,-100.01,-100,-99.9994915413,-99.9990872016,-99.9951721199," + + "-99.99,-99.9645719240,-99.9624349535,-99.9614377002,-99.9602516727,-99.9601976700," + + "-99.9179969843,-99.9135718461,-99.9045914125,-99.8910561910,-99.8106343476,-99.8025484668," + + "-99.7976668059,-99.7947564839,-99.7886236408,-99.7670971881,-99.7626123411,-99.7572070447," + + "-99.7560216207,-99.7425660165,-99.7153754334,-99.7051569128,-99.7022656135,-99.6767551820," + + "-99.6722260401,-99.6607202273,-99.6562286237,-99.6093198617,-99.6079217864,-99.5978241183," + + "-99.5860433196,-99.5789095738,-99.5574458139,-99.5563015601,-99.5554211656,-99.5444768748," + + "-99.5437449083,-99.5340303810,-99.5100607596,-99.4860284168,-99.4449870732,-99.4371631073," + + "-99.4184495170,-99.4159322812,-99.4084806305,-99.4072778605,-99.3955363318,-99.3823846098," + + "-99.3734787689,-99.3718189580,-99.3485704747,-99.3415573570,-99.3049585904,-99.2835557046," + + "-99.2790124089,-99.2759252254,-99.2658471038,-99.2573928302,-99.2563126423,-99.2447484897," + + "-99.2316583050,-99.2314898828,-99.2183181307,-99.2176596815,-99.1928708683,-99.1733290138," + + "-99.1726204643,-99.1605926399,-99.1598524965,-99.1086587357,-99.0894792417,-99.0748524068," + + "-99.0639263051,-99.0230201699,-99.0146344791,-99.0070325468,-99.0064373966,-98.455008863," + + "-98.322360950,-95.58333,-95.5833298166,-95.5000000000,-95.4999998219,-95.4916666667," + + "-95.4916666666,-95.4916664890,-95.49166648893,-95.4916664889,-95.416667,-95.4166668251," + + "-95.002606473,-95.000000000,-94.5178744,-94.5177778,-93.5177778,-93.5176731,-92.5178811," + + "-92.5177778,-91.5177778,-91.5176758,-91,-90.7265739758,-90.5178639,-90.5177778,-90.3642618405," + + "-90.2440064745,-90.1445918836,-90.0683270041,-90.0290393775,-90.01,-90.0089826784,-90.00060583," + + "-90.00001,-90,-89.99999999999999,-89.99999999,-89.9999999,-89.999999873385,-89.9999747721," + + "-89.9999747718,-89.999,-89.99632465,-89.99531139,-89.99487454,-89.99,-89.9773066160," + + "-89.9756152550,-89.9699823716,-89.9555755860,-89.9552061084,-89.9466466666,-89.9433443609," + + "-89.9236110047,-89.9206313411,-89.8854290226,-89.8710202810,-89.8644038896,-89.8642843810," + + "-89.8454838458,-89.8203767870,-89.8162159435,-89.8158531726,-89.8090238071,-89.7930338075," + + "-89.7509673047,-89.7505869053,-89.7332690529,-89.7267294244,-89.7150051747,-89.6983443874," + + "-89.6583934020,-89.6418391342,-89.6183447418,-89.6168562261,-89.6146334566,-89.5888146775," + + "-89.5695551279,-89.5621686999,-89.5537263306,-89.5363705206,-89.5177778,-89.5177272," + + "-89.5000223708,-89.5,-89.4999759438,-89.4965032257,-89.4929629341,-89.4902277654,-89.4794192866," + + "-89.4757325990,-89.4753530769,-89.4598171312,-89.4547033980,-89.4535006021,-89.4462296168," + + "-89.4153824527,-89.4037956256,-89.3984343202,-89.3858632536,-89.3853376439,-89.3773565828," + + "-89.3631524858,-89.3536369188,-89.3465946697,-89.3430796801,-89.3282286284,-89.3223757109," + + "-89.3190408834,-89.3070231490,-89.2957244981,-89.2833040728,-89.2720021301,-89.2702698097," + + "-89.2677089488,-89.2610432155,-89.2190150125,-89.2137798701,-89.2126537463,-89.1936009216," + + "-89.1925625691,-89.1841069049,-89.1823111373,-89.1738195765,-89.1699101036,-89.1612152313," + + "-89.1508332331,-89.1084063299,-89.1067456005,-89.0765267674,-89.0674703286,-89.0617378460," + + "-89.0379071438,-89.0277852820,-89.0043085338,-89,-88.9303357409,-88.7598088570,-88.6283945950," + + "-88.5689205573,-88.5424937255,-88.4812940559,-88.3017941113,-88.2843232228,-88.1579367749," + + "-88.1551228787,-88.0056825,-88.005575,-88.0001072222,-88,-87.9998933333,-87.8821294926," + + "-87.8113050000,-87.6611716667,-87.6610917,-87.6292839331,-87.5083524092,-87.4944214849," + + "-87.4911657719,-87.4860856350,-87.1707570236,-87.0825895518,-87.0734859278,-86.8409810985," + + "-86.7510648640,-86.6732359620,-86.6146886067,-86.5788079857,-86.4913255195,-86.3836989068," + + "-86.3003323104,-86.1711430633,-86.0423885378,-86.0311019572,-85.9311099723,-85.7390309668," + + "-85.6235707551,-85.4385747937,-85.2121814625,-85.2062438921,-85.1267277663,-85.1105131986,-85," + + "-84.9021341881,-84.8051735959,-84.71287749,-84.7014602402,-84.6183360959,-84.6064875075," + + "-84.5394950727,-84.2995572008,-84.2989454792,-84.2227887345,-84.1916000473,-84,-83.8694127295," + + "-83.8692118030,-83.8158727667,-83.6786769068,-83.65325201216521,-83.64031642722364,-83.61985956," + + "-83.5760929301,-83.4382281692,-83.3255313811,-83.2992154597,-83.0220228165,-82.7776695863," + + "-82.6429522913,-82.5740757930,-82.4050031966,-82.3824201970,-82.318,-82.2684783422," + + "-82.1078093242,-81.7746272088,-81.6687644685,-81.6306426596,-81.4996688835,-81.3826632020," + + "-81.3102866550,-81.2712614892,-81.1240616181,-81.0829408522,-80.9178750042,-80.9100945160," + + "-80.8948879488,-80.8288036882,-80.7634661276,-80.5041667,-80.50401615833,-80.4596653260," + + "-80.2758766316,-80.1029516039,-80.00054917,-80.000346610,-80,-79.9996521,-79.99778139," + + "-79.9963611264,-79.99612229,-79.9829089371,-79.9793295792,-79.9699918529,-79.9687467646," + + "-79.9635057664,-79.9319952951,-79.9307378831,-79.9253199265,-79.9177626050,-79.9152588062," + + "-79.9068086129,-79.8980045489,-79.8910338348,-79.8767538149,-79.8755275705,-79.8712042695," + + "-79.8617775679,-79.8512236201,-79.8288741622,-79.8103593109,-79.8043265456,-79.7971543944," + + "-79.7910279462,-79.7812956950,-79.7718646359,-79.7589672970,-79.7513340456,-79.7459074624," + + "-79.7404375474,-79.7404033820,-79.7184992899,-79.7061602957,-79.6629562504,-79.6133647306," + + "-79.6121040164,-79.6065498494,-79.5985918526,-79.5922401709,-79.5887435008,-79.5816448608," + + "-79.5627247417,-79.5614292778,-79.5569260283,-79.5385879087,-79.5274133946,-79.5182008966," + + "-79.5087279110,-79.5075548350,-79.5060440658,-79.4864123616,-79.4586895446,-79.4513980949," + + "-79.4199716924,-79.3698907818,-79.3692412058,-79.3641569088,-79.3526596151,-79.3268775666," + + "-79.3200173559,-79.3161212354,-79.3077687162,-79.3053114467,-79.2799350968,-79.2780817976," + + "-79.2557693956,-79.2554014378,-79.2424043855,-79.2351509797,-79.2055095189,-79.1896256706," + + "-79.1875075496,-79.1850172406,-79.1830001774,-79.1765040759,-79.1663300454,-79.1591500985," + + "-79.1533653138,-79.1497539952,-79.1400549649,-79.1346028255,-79.1196204797,-79.1187835657," + + "-79.1184854139,-79.1164233302,-79.1149414160,-79.0930156514,-79.0822097483,-79.0808010606," + + "-79.0548748136,-79.0507721337,-79.0486888283,-79.0387416065,-79.0227489515,-79.0142432052," + + "-78.9973036997,-78.9064235928,-78.8917009107,-78.7437592966,-78.714775386137,-78.7037640543," + + "-78.6847392352,-78.6158200646,-78.5286202425,-78.5268124103,-78.4899667014,-78.3809992723," + + "-78.3099466224,-78.1491297266,-78.1437071317,-78.0224816760,-77.9987560452,-77.9762123582," + + "-77.9452575038,-77.9038978934,-77.8772548871,-77.7507873749,-77.7277296032,-77.6809008485," + + "-77.6414595729,-77.5251356225,-77.3145139162,-77.3123241499,-77.2075414406,-77.1822355756," + + "-77.1799395743,-77.1568269429,-77.1517896758,-77.1138023157,-77.0932634434,-77.0660588617," + + "-77.0349803149,-77.0119938017,-77,-76.9680414794,-76.9369794197,-76.8077194,-76.8064299491," + + "-76.64598925873727,-76.6161050638,-76.5942100817,-76.55528563752168,-76.4574860662," + + "-76.4102449261,-76.3842150797,-76.3749705670,-76.3746207928,-76.3111768828,-76.2954327600," + + "-76.2761103137,-76.2249333909,-75.8866598636,-75.8784716103,-75.8761529489,-75.7674050764," + + "-75.7585741711,-75.7415088186,-75.6020670736,-75.5923496826,-75.5762740726,-75.550660091," + + "-75.4841051853,-75.446820242,-75.3730011624,-75.3290637518,-75.3058724059,-75.2549327376," + + "-75.2438944725,-75.1187688922,-75,-74.9639973582,-74.8490162848,-74.7807003525,-74.7701795551," + + "-74.7649093703,-74.7070663318,-74.64821453762985,-74.56175824137314,-74.5087602471," + + "-74.4787205556,-74.4580538960,-74.4419812746,-74.3833782562,-74.25,-74.2118180651," + + "-74.1262304089,-74.0327498320,-73.9288741111,-73.8582467239,-73.8531237046,-73.7178034782," + + "-73.6693258790,-73.5860650374,-73.5246290838,-73.4954549764,-73.3709657282,-73.3335214021," + + "-73.3233934105,-73.2571688604,-73.2363687589,-73.1453487971,-73.1105693985,-73.038700285," + + "-73.038693105,-73.037303739,-73.037301330,-73.035895582,-73.035893173,-73.034503807," + + "-73.034496627,-72.9106110624,-72.8068670782,-72.8013395667,-72.7342346131,-72.6551561090," + + "-72.6142200904,-72.5237014490,-72.4399400853,-72.4393741465,-72.4059990981,-72.3687427114," + + "-72.3497881968,-72.3341230538,-72.2383125997,-72.1886326428,-72.0604912080,-72,-71.9757412863," + + "-71.9525642223,-71.94195405675616,-71.8461023317,-71.8366964443,-71.8220094179," + + "-71.79634907735154,-71.7629261845,-71.5923171899,-71.5575178388,-71.3988285471,-71.3971340090," + + "-71.2092093538,-71.1110965727,-71.1061903043,-71.0229026677,-71.0,-70.9073113064,-70.7335340397," + + "-70.6365159073,-70.5972765500,-70.4770080858,-70.4758592857,-70.4342119870,-70.12337013762533," + + "-70.1134571802,-70.0895817655,-70.0556232602,-70.0084283415,-70.005208999,-70.00362084," + + "-70.002485,-70.00224647,-70.0002089,-70,-69.9992085183,-69.99901667,-69.9915897328," + + "-69.9776667645,-69.9603490759,-69.9403123372,-69.9188804603,-69.9140939731,-69.9032152988," + + "-69.8876497415,-69.8818215995,-69.8795545612,-69.8357048214,-69.8279241005,-69.8245239316," + + "-69.8238721868,-69.8212102616,-69.8148943004,-69.8146319687,-69.8078719866,-69.7891755607," + + "-69.7843638102,-69.7752745189,-69.7744908122,-69.7678517742,-69.7454406840,-69.7394095461," + + "-69.7155529444,-69.7140423873,-69.7109936494,-69.7070595303,-69.6977621502,-69.6832972131," + + "-69.6623710654,-69.6398208021,-69.6180300324,-69.5924016054,-69.5919903841,-69.5357774042," + + "-69.533571088,-69.5261517902,-69.5143458832,-69.5064826337,-69.5002491752,-69.4998925877," + + "-69.4926078623,-69.4905958240,-69.4795328221,-69.4515180819,-69.4424228202,-69.4423545276," + + "-69.4414539606,-69.4337987883,-69.422692183,-69.4216766587,-69.4104381605,-69.3934026425," + + "-69.3905433066,-69.3884076627,-69.3859719372,-69.3746588999,-69.3713987852,-69.3692667775," + + "-69.3484116496,-69.3453324893,-69.3436462673,-69.3369852179,-69.3324157511,-69.3112248587," + + "-69.3056454098,-69.2852704168,-69.2722085113,-69.2694919752,-69.2589747329,-69.2574458208," + + "-69.2474535764,-69.2443866324,-69.2279142296,-69.2277148796,-69.2215350809,-69.2214782512," + + "-69.2186423862,-69.2161805164,-69.2123495570,-69.1787032576,-69.1554779909,-69.1450433006," + + "-69.1379478051,-69.1303448651,-69.1272034531,-69.1149563301,-69.0843325805,-69.0648460645," + + "-69.0638837521,-69.0059405699,-69.0024968791,-69.0001441,-69.0,-68.9207602047,-68.8474900484," + + "-68.8398158747,-68.6167358219,-68.5724302106,-68.4874678083,-68.4729959428,-68.4537518490," + + "-68.4437853274,-68.4333233270,-68.3592860451,-68.3071525125,-68.2238727038,-68.2067669189," + + "-67.9995333,-67.9903394603,-67.9857475830,-67.9826718761,-67.8806308159,-67.8341598034," + + "-67.7652217315,-67.6932300903,-67.6600969757,-67.4553827915,-67.2990645502,-67.2794853256," + + "-67.1131557084,-67.0804523760,-67.0709630928,-67.0362523329,-67.0039300601,-67.0,-66.9998073," + + "-66.9833418981,-66.9738174802,-66.8884770151,-66.7652070914,-66.7130216826,-66.58783346," + + "-66.4077946779,-66.3089232102,-66.2858473379,-66.2388824806,-66.2045341279,-66.1963102135," + + "-66.1666702364,-65.9996522,-65.9440561722,-65.9323791506,-65.8768496172,-65.8739932573," + + "-65.862385599,-65.8550220266,-65.8422559530,-65.8422273022,-65.8321633336,-65.8229326488," + + "-65.8210021247,-65.7960345782,-65.6999143010,-65.5190096678,-65.491568685,-65.4626199327," + + "-65.4373463883,-65.348945221,-65.2868591410,-65.1950301635,-65.1388713461,-65.0873010186," + + "-65.0050609815,-65.000000000,-64.99929833,-64.9992796,-64.9756976432,-64.9328397796," + + "-64.8794465969,-64.8242212878,-64.8003181492,-64.7707999563,-64.7601702734,-64.7428784330," + + "-64.7417604712,-64.737589,-64.6956687932,-64.5263189423,-64.2819828297,-64.2716519504," + + "-64.2229928140,-64.2204936386,-64.2006837236,-64.1956924,-64.1621304539,-64.1566350257," + + "-64.0719899001,-64.0272106872,-64.0004675,-64.0004605,-63.9998814,-63.9998472,-63.9997361," + + "-63.9997001,-63.9997,-63.9996186,-63.9993433,-63.9991006,-63.9724755049,-63.9075720894," + + "-63.9038815291,-63.8500661196,-63.8483921906,-63.8422040109,-63.7921797585,-63.6990548356," + + "-63.6583206132,-63.5883281794,-63.5579868289,-63.4870607362,-63.4512934361,-63.3603315571," + + "-63.2384418688,-63.1814589291,-63.1756677100,-63.1667304050,-63.1650388913,-63.0553679417," + + "-62.9999842,-62.9745552631,-62.9647601040,-62.9292855324,-62.8950940661,-62.8345530934," + + "-62.7959282508,-62.7259798066,-62.7166029149,-62.7061946763,-62.6650596939,-62.6544841838," + + "-62.5940745250,-62.576950372,-62.5085487744,-62.4946649855,-62.486322854,-62.3774990742," + + "-62.3661044165,-62.2459162224,-62.1723630793,-62.1571694174,-62.1057544781,-62.0000778,-62," + + "-61.9758669545,-61.8657176607,-61.8063907044,-61.7459110848,-61.7448218808,-61.7278379595," + + "-61.7219845816,-61.6957692779,-61.621553676,-61.6019886294,-61.6016244915,-61.459995711," + + "-61.4547664483,-61.2084726717,-61.1527410473,-61.1466320407,-61.1393337334,-61.0467237730," + + "-61.0164571209,-61.0000574,-60.8552091241,-60.7500016629,-60.6197664775,-60.3721116419," + + "-60.3371608659,-60.2885251988,-60.1858259817,-60.1204628592,-60.0997063537,-60.0407055339," + + "-60.0341705989,-60.0297971335,-60.01,-60.00473241,-60.00357056,-60.00081456,-60.0004008,-60," + + "-59.99991333,-59.999835,-59.99934884,-59.99934874,-59.99907361,-59.9970146255,-59.99," + + "-59.9878237924,-59.9773741961,-59.966377950099655436,-59.9635334446,-59.9476909228," + + "-59.9411333586,-59.9393178899,-59.9341884732,-59.9278061065,-59.9224508827,-59.8993905791," + + "-59.8993383836,-59.8919954903,-59.8852518498,-59.8783718706,-59.8706106341,-59.8551383188," + + "-59.8339416819,-59.8282049770,-59.8017669014,-59.7713311869,-59.7680108732,-59.7650575505," + + "-59.7627027888,-59.7549744076,-59.7413792811,-59.7318603713,-59.7295306861,-59.7270769476," + + "-59.7190082964,-59.7043872074,-59.6915787173,-59.6570132581,-59.6477980679,-59.6461988138," + + "-59.6285901198,-59.6158025559,-59.5914817326,-59.5658576308,-59.5648134684,-59.5564783999," + + "-59.5430097857,-59.5415515235,-59.5324497291,-59.5169821631,-59.4871790876,-59.4862558744," + + "-59.4761740671,-59.4751248220,-59.4171409115,-59.4162002941,-59.3987361622,-59.3961476674," + + "-59.3942535459,-59.3891167783,-59.3424378796,-59.3345608489,-59.3321746682,-59.3247479059," + + "-59.3204702001,-59.3174344116,-59.3116550382,-59.2835867353,-59.2803345438,-59.2745531980," + + "-59.2657055315,-59.2607881882,-59.2140342623,-59.2124036536,-59.2096313695,-59.2065888779," + + "-59.1985019770,-59.1949594465,-59.1757895169,-59.1741793523,-59.1693658687,-59.1654390696," + + "-59.1562784619,-59.1288687363,-59.1242618883,-59.1123214226,-59.1116247628,-59.1035311505," + + "-59.1032039467,-59.1007316490,-59.0994244861,-59.0918222414,-59.0699348251,-59.0478968386," + + "-59.0417407292,-59.0261934568,-59.0066198816,-59.0016643714,-58.9999426,-58.9769415123," + + "-58.9714540198,-58.76182587,-58.7286202895,-58.5125230628,-58.4548170890,-58.4264590285," + + "-58.4070158299,-58.4027994525,-58.3674875157,-58.2221709542,-58.1489537744,-58.1144715199," + + "-58.0174867644,-57.9999222,-57.8422608500,-57.7899236032,-57.7415828952,-57.6885943847," + + "-57.5436346739,-57.5287479364,-57.4323767288,-57.3120408186,-57.2913818657,-57.2767531329," + + "-57.2502847616,-57.2275967096,-57.2190055708,-57.1675573730,-57.0799116685,-57.0000158,-57," + + "-56.9893254243,-56.9198966570,-56.9161549702,-56.7627741202,-56.7476936019,-56.6610699237," + + "-56.6354279372,-56.6268047719,-56.5806776760,-56.5251359813,-56.4903844848,-56.4709263993," + + "-56.4254295515,-56.2424930053,-56.2047588377,-56.1851853006,-56.1663221081,-56.0832576961," + + "-55.9267756586,-55.8401169432,-55.7410486547,-55.5116401637,-55.5094217862,-55.4932687347," + + "-55.4898494102,-55.4401681713,-55.4019628150,-55.3105280599,-55.2997481025,-55.2867551270," + + "-55.2601958124,-55.2220077227,-55.2204505294,-55.0238926067,-55,-54.9771464696,-54.8136229276," + + "-54.7233777967,-54.7080863095,-54.6311145369,-54.5322069534,-54.5311736441,-54.4599218486," + + "-54.4313834318,-54.3143207583,-54.3046314680,-54.1552793246,-54.0819702617,-54.0658285398," + + "-54.0392541094,-54,-53.9245170355,-53.8315420800,-53.6948723497,-53.6562199308,-53.6395383232," + + "-53.6386169191,-53.5080881233,-53.4894321537,-53.4687850046,-53.4446807335,-53.3718201615," + + "-53.3088500534,-53.2932693342,-53.1842316256,-53.1347486229,-53.0271646961,-53.0212050870," + + "-52.9722495199,-52.9141596041,-52.8621841373,-52.8539647879,-52.8267091529,-52.8143911635," + + "-52.8073510172,-52.6818511960,-52.6201247567,-52.5359539692,-52.3805314789,-52.3417298211," + + "-52.3084536190,-52.1945236902,-52.1928991404,-52.1795359483,-52.1,-52.0098336142,-51.9628267761," + + "-51.8430079370,-51.6702008173,-51.6378144374,-51.6296886545,-51.6157642742,-51.5758826477," + + "-51.5189598167,-51.3773597952,-51.2671252739,-51.2476311235,-51.2201444439,-51.1069811525," + + "-50.9645531478,-50.8239592102,-50.7667566814,-50.6933815720,-50.6351985324,-50.4873507691," + + "-50.4755131648,-50.4621600892,-50.4553454248,-50.3906053109,-50.3729595701,-50.1766356883," + + "-50.00096139,-50,-49.99973028,-49.99958243,-49.9832824786,-49.9280128167,-49.9264269173," + + "-49.9241519045,-49.9184212313,-49.9117875315,-49.8946468200,-49.8815279751,-49.8561841911," + + "-49.8523842515,-49.8326118713,-49.8213060755,-49.7927741248,-49.7903016746,-49.7885614755," + + "-49.7829967571,-49.7736213847,-49.7522174506,-49.7514136971,-49.7289524443,-49.7224425586," + + "-49.7169986740,-49.7082574527,-49.7059448492,-49.7020758778,-49.6961911803,-49.6910260363," + + "-49.6901763540,-49.6855331551,-49.6550438823,-49.6499709362,-49.6297449138,-49.6200663069," + + "-49.6169420229,-49.6085838009,-49.5948095572,-49.5741035561,-49.5480487278,-49.5451009633," + + "-49.5439751158,-49.5137470044,-49.5091296711,-49.4912957918,-49.4856159772,-49.4634180765," + + "-49.4591068015,-49.4571426800,-49.4552848899,-49.4529549960,-49.4522584709,-49.4360361183," + + "-49.4130759901,-49.4089463064,-49.4027735513,-49.4008006097,-49.3872071390,-49.3771402997," + + "-49.3488539326,-49.3351161906,-49.3346426547,-49.3268655448,-49.3252940718,-49.3205605438," + + "-49.3115987100,-49.3100677093,-49.3010973212,-49.2934775668,-49.2718060884,-49.2684633342," + + "-49.2671447978,-49.2271359812,-49.2194140278,-49.2060555595,-49.1946821277,-49.1883193839," + + "-49.1881407070,-49.1834673639,-49.1644096637,-49.1598655048,-49.1459116777,-49.1454058737," + + "-49.1268921477,-49.1028389556,-49.0962705404,-49.0877260741,-49.0682511760,-49.0546876336," + + "-49.0470611950,-49.0463066485,-49.0224540140,-49.0092629276,-49.00298561868703,-49," + + "-48.9692766397,-48.9204454031,-48.89629332838504,-48.8849591656,-48.8514336226,-48.8337125195," + + "-48.8074825653,-48.8012100804,-48.6327927027,-48.5703968561,-48.4914027020,-48.4774901965," + + "-48.4680700697,-48.3900540417,-48.3204060368,-48.2622816670,-48.2401083822,-48.2225550224," + + "-48.1844242863,-48.1515257195,-48.1179744801,-48.0216578802,-47.8692552329,-47.8590661722," + + "-47.7931114403,-47.6183917612,-47.5531771971,-47.5443099911,-47.4449038605,-47.3426945690," + + "-47.2258755796,-47.1679496656,-47.1401905695,-47.1336832541,-47.1237216006,-47.1020565364,-47," + + "-46.9794332723,-46.9029866463,-46.8854494051,-46.8591030615,-46.8077194,-46.6736994965," + + "-46.6454001087,-46.5651334714,-46.5648775386,-46.40145478927908,-46.3943619602,-46.3637609990," + + "-46.3595419843,-46.2916624279,-46.2470536112,-46.23421830648926,-46.1574282136,-46.1165362624," + + "-46.0614416637,-46.0366124472,-46.0308507793,-46,-45.9763718998,-45.8054277747,-45.7846392844," + + "-45.7583483056,-45.7254461234,-45.6088952189,-45.5,-45.4028322295,-45.3788313212,-45.3585308636," + + "-45.2381613350,-45.2128579221,-45.19242321598196,-45.1737240013,-45.004297076,-45.001432287,-45," + + "-44.998567498,-44.9983333334,-44.995702709,-44.9558227898,-44.9478951297,-44.8554259969," + + "-44.7944152576,-44.7940088251,-44.7761977319,-44.6690953878,-44.6641530409,-44.6491174665," + + "-44.5558487119,-44.5224968249,-44.5174266340,-44.2312628392,-44.0954679134,-44.0666175390," + + "-44.0055960197,-43.9676693909,-43.9155165619,-43.8609446159,-43.8499619826,-43.8414369161," + + "-43.7260948924,-43.6178971244,-43.5521936119,-43.4405627423,-43.4346766235,-43.4002905582," + + "-43.1455519878,-43.1396428570,-43.0316016948,-42.9767512080,-42.9591919136,-42.8806359633," + + "-42.8251932286,-42.8137396224,-42.7562158333,-42.7382586843,-42.4864250646,-42.4441379846," + + "-42.4267915714,-42.3148188142,-42.3050919341,-42.2232882391,-42.0524649460,-42,-41.9858293563," + + "-41.9710426109,-41.8794443052,-41.7132409855,-41.6217897025,-41.5989802375,-41.56143010477453," + + "-41.53248336979641,-41.2273949585,-41.1640449046,-41.1418430583,-41.0671902488,-41," + + "-40.8863960679,-40.8493938089,-40.8364519203,-40.6879294032,-40.6492312711,-40.5893893271," + + "-40.3124354704,-40.3051838201,-40.2577682910,-40.01,-40.0048024560,-40.000411,-40.0003306," + + "-40.0002935,-40.000215,-40.0002087,-40.0001803,-40,-39.9999313,-39.9996925,-39.9996924," + + "-39.9996182,-39.9996136,-39.9995894,-39.99,-39.9837216743,-39.9329751143,-39.9221210763," + + "-39.9159421567,-39.8985039869,-39.8960036873,-39.8953975091,-39.8824125488,-39.8808038489," + + "-39.8692181364,-39.8565220229,-39.8508153072,-39.8262428613,-39.8261302552,-39.8183008451," + + "-39.7902268868,-39.7880824067,-39.7785355635,-39.7694988813,-39.7692356409,-39.7585640043," + + "-39.7523563839,-39.7345386469,-39.6916503252,-39.6880697045,-39.6877677601,-39.6862901889," + + "-39.6799799687,-39.6693852781,-39.6598693615,-39.6482793765,-39.6433533072,-39.6159279805," + + "-39.6116669497,-39.5707710224,-39.5604939819,-39.5601849133,-39.5548627592,-39.5503275201," + + "-39.5188729974,-39.5175223106,-39.4924979763,-39.4882092166,-39.4661117786,-39.4592345235," + + "-39.4506559191,-39.4459740795,-39.4423952109,-39.4330828245,-39.4261884171,-39.4219744153," + + "-39.4101841829,-39.4087456167,-39.4027491539,-39.3938152675,-39.3823903629,-39.3784173894," + + "-39.3530693426,-39.3411926381,-39.3404897159,-39.3187102974,-39.3139281426,-39.3083971924," + + "-39.2940192313,-39.2736625770,-39.2685447989,-39.2446354074,-39.2404566099,-39.2403833701," + + "-39.2258939434,-39.2161406618,-39.2149367905,-39.1868721751,-39.1851869067,-39.1718824306," + + "-39.1658927524,-39.1574191031,-39.1539543744,-39.1528197403,-39.1403094008,-39.1320462959," + + "-39.1296215520,-39.1133813450,-39.1015835447,-39.0992426534,-39.0859175285,-39.0799820528," + + "-39.0612457278,-39.0382734207,-39.0317197762,-39.0306006434,-39.0292679218,-39.0166782385," + + "-39.0089519711,-39.0055263654,-38.9176058199,-38.9121786221,-38.8583130891,-38.8120777840," + + "-38.7758352491,-38.6899841653,-38.6381409742,-38.6119802236,-38.5207051121,-38.5008875049," + + "-38.4864124906,-38.3643075290,-38.2565849818,-38.2419029781,-38.1923095026,-38.1919404446," + + "-38.0579151517,-38.0219346503,-38.0200948217,-38,-37.93882855,-37.8175552179,-37.8134438608," + + "-37.8,-37.79848,-37.7864477876,-37.7503319244,-37.7437811442,-37.6532236,-37.65282217," + + "-37.65282206,-37.65282187,-37.65282143,-37.65282034,-37.65257083,-37.65235306,-37.6252342058," + + "-37.6092654477,-37.5687159826,-37.5480251892,-37.4573903187,-37.4333640809,-37.3101077795,-37.3," + + "-37.0859345868,-37.0223436721,-37.0018039210,-37,-36.9960,-36.9847575823,-36.9749101428," + + "-36.9333699237,-36.8932371421,-36.8785291472,-36.8251466679,-36.7266176768,-36.6711774624," + + "-36.5407037317,-36.3941,-36.394090697,-36.3504262236,-36.3175720184,-36.3071095311," + + "-36.2644266473,-36.2548338054,-36.1766584469,-36.1726044193,-36.0072187827,-36," + + "-35.93009713541779,-35.8537888060,-35.8053875550,-35.6283177384,-35.5987514678,-35.5930072217," + + "-35.446011426401625,-35.4333317594,-35.4158065520,-35.386955975332214,-35.3701130040," + + "-35.2401507154,-35.0916931594,-35.0369229256,-35.0078880309,-35,-34.9974460643," + + "-34.84574824559832,-34.8337636531,-34.7824559736,-34.7603698284,-34.7195179750," + + "-34.676851253860285,-34.6367632672,-34.5735242626,-34.4711213307,-34.4648659946,-34.4239368091," + + "-34.3775651948,-34.3740808096,-34.3347175023,-34.30009883727707,-34.27261608163502," + + "-34.0606127868,-34.0306344677,-34,-33.9615774789,-33.8623,-33.862297056,-33.8274972528," + + "-33.8084333270,-33.7827115000,-33.6576606654,-33.5728740994,-33.3921969402,-33.2806968649," + + "-33.2328890516,-33.2219810003,-33.1007607627,-33.0535274429,-33.0245833220,-32.9249999485," + + "-32.7520928002,-32.7218296414,-32.6820581131,-32.6555467192,-32.6458132046,-32.5464412753," + + "-32.4559533116,-32.3021983595,-32.2387656553,-32.1522584471,-32.1498899431,-32.0831702107," + + "-31.9515111,-31.9198181206,-31.8677972120,-31.6151992048,-31.5562360216,-31.5381986939," + + "-31.5333210976,-31.4760758031,-31.3399185713,-31.2738366265,-31.2411754077,-31.2,-31.1493347964," + + "-31.09509756,-30.8907292201,-30.7676922872,-30.6970967059,-30.6845915110,-30.60226899," + + "-30.5326610745,-30.4375246674,-30.2109056883,-30.1415999097,-30.0590713215,-30.0366136211," + + "-30.00504639,-30.0042486,-30.00238885,-30,-29.99943917,-29.9931677373,-29.9883661697," + + "-29.9777355053,-29.9742251826,-29.9547583046,-29.9263368298,-29.9077443640,-29.9044251723," + + "-29.9015556332,-29.8938804478,-29.8880719395,-29.8485414955,-29.8463222037,-29.8207115548," + + "-29.8165100218,-29.7920841190,-29.7861799219,-29.7786441638,-29.7767726581,-29.7742120709," + + "-29.7691402382,-29.7679870260,-29.7526562583,-29.7503799768,-29.7429317093,-29.7265492803," + + "-29.7093809090,-29.7065845030,-29.6721934217,-29.6634260976,-29.6502801920,-29.6363032106," + + "-29.6354019373,-29.6345258809,-29.6306479674,-29.6206503521,-29.6190870010,-29.6114412219," + + "-29.5780322984,-29.5659253879,-29.5097310678,-29.5083854002,-29.4922393933,-29.4900121781," + + "-29.4728615966,-29.4615301172,-29.4613810419,-29.4511324259,-29.4506836219,-29.4470720507," + + "-29.4386358660,-29.4378045622,-29.4033816775,-29.4030406405,-29.3961250522,-29.3674766667," + + "-29.3575038499,-29.3360829537,-29.3299550856,-29.3191918216,-29.3138791949,-29.2950741715," + + "-29.2899383303,-29.2846350035,-29.2778055547,-29.2733130411,-29.2623085092,-29.2443283665," + + "-29.2381466616,-29.2292837281,-29.2174079662,-29.2023113842,-29.1976699326,-29.1962960438," + + "-29.1954492510,-29.1883557585,-29.1777068994,-29.1761644239,-29.1740796470,-29.1591843717," + + "-29.1582457860,-29.1378956446,-29.1265263906,-29.1097584433,-29.1095444632,-29.1021932503," + + "-29.0839025659,-29.0676277333,-29.0674505554,-29.0671095836,-29.0573163195,-29.0476034815," + + "-29.0461086285,-29.0459159714,-29.0387587694,-29.0364706467,-29.0325047616,-29.0273299961," + + "-28.9492608062,-28.9429338477,-28.8913170762,-28.8411062530,-28.7604876417,-28.7440325834," + + "-28.5816818553,-28.5199148717,-28.3593158878,-28.2777777134,-28.2388918529,-28.210938432335496," + + "-28.1864696949,-28.1677069370,-28.1615925042,-28.1534517213,-28.052389289696965,-28.05," + + "-28.0485311111,-28.0485269444,-28.0485188889,-28.0485072222,-28.0372332017,-28.0352374493," + + "-28.0150409892,-28,-27.9851170141,-27.9403197244,-27.8743740104,-27.8467488939,-27.8257," + + "-27.7889137233,-27.6725871069,-27.5835336013,-27.5,-27.4846012044,-27.3804651341,-27.3765954441," + + "-27.3593892155,-27.3421123535,-27.3001909011,-27.2290510016,-27.1264766667,-27.1264763889," + + "-27.125,-27.1235236111,-27.1235233333,-27.0902195884,-27.0565876723,-27.0546870326,-27," + + "-26.9865340393,-26.9566814760,-26.7993470554,-26.6837015309,-26.6685619062,-26.5371650435," + + "-26.5193483221,-26.4319377776,-26.3781900961,-26.3321377541,-26.3197565889,-26.3124065099563," + + "-26.1885685364,-26.1682287226,-26.1431540924,-26.1428020328,-26.125789701735282,-26," + + "-25.9649549970,-25.8737294352,-25.8611684419,-25.7799438486,-25.7380450818,-25.6991927518," + + "-25.6947295847,-25.6767220293,-25.6284840207,-25.6193405937,-25.5910332550,-25.5035070096," + + "-25.4624789903,-25.4383454527,-25.1818797146,-25.1526201253,-25.1073764643,-25,-24.9358234812," + + "-24.9304945684,-24.9244904554,-24.8858012124,-24.8449696747,-24.84162689595362,-24.7371256820," + + "-24.6760450197,-24.6749860350,-24.673252485600123,-24.6444229699,-24.6200753121,-24.5549160001," + + "-24.5243234665,-24.4560828087,-24.3713625355,-24.1982546793,-24.1700440971,-24.1036603231," + + "-24.0290019262,-24,-23.9868520946,-23.9158664525,-23.9073140300,-23.8621044004,-23.8256788800," + + "-23.7748908886,-23.67012389,-23.67011014,-23.6272475940,-23.5834403073,-23.5742092130," + + "-23.4696540641,-23.3838764285,-23.3154304481,-23.2859623288,-23.0912677563,-23.0862162961," + + "-23.0040787983,-23.0000,-22.9994139064,-22.8514526819,-22.7008051540,-22.6662177106," + + "-22.5310742645,-22.5,-22.4382538673,"; + + private static final String CHUNK_1 = + "-22.4177486612,-22.3944602016,-22.3889418243,-22.3860117924,-22.3728965349,-22.3142121451," + + "-22.2716044223,-22.2437237249,-22.1941484220,-22.1221079553,-22.1201165276,-22.0885409872,-22.0," + + "-21.7789499055,-21.7481812197,-21.7271569228,-21.7066906983,-21.4584354172,-21.4141834167," + + "-21.4069947198,-21.2322237727,-21.1686043260,-21.0427895850,-20.8432353205,-20.835222268," + + "-20.8118177919,-20.756538510,-20.5179662552,-20.3765117338,-20.3671378180,-20.1902202762," + + "-20.124006563576454,-20.1052727537,-20.1,-20.0634670217,-20.01,-20.0098914684,-20,-19.9999283," + + "-19.9921230083,-19.99,-19.9897475317,-19.9767642691,-19.9754368483,-19.9711155501," + + "-19.9520584705,-19.9518617483,-19.9357360497,-19.8973002908,-19.8971059232,-19.8662059139," + + "-19.8496271346,-19.8434403334,-19.8296434180,-19.8278954645,-19.8260643144,-19.8149677195," + + "-19.8075997700,-19.7672186473,-19.7666667754,-19.7520445226,-19.7518374124,-19.7409728105," + + "-19.7354612657,-19.7178288379,-19.7173893031,-19.7014586301,-19.6984569649,-19.6951353173," + + "-19.6901625335,-19.6711096687,-19.6362961239,-19.6098192847,-19.5974702869,-19.5739110331," + + "-19.5599253582,-19.5461864449,-19.5149453395,-19.5104972567,-19.5014059179,-19.5010832381," + + "-19.4996536478,-19.4990519776,-19.4970507012,-19.4921243712,-19.4563259884,-19.4562997110," + + "-19.4550859282,-19.4496938483,-19.4469305321,-19.4382561500,-19.4306837146,-19.4219986373," + + "-19.4145569922,-19.4093864480,-19.4001109678,-19.3927174348,-19.3829588944,-19.3808304987," + + "-19.3421368019,-19.3394041666,-19.3122799108,-19.3072208645,-19.3042659436,-19.2977455865," + + "-19.2947838600,-19.2850914312,-19.2822125520,-19.2436583074,-19.2242789077,-19.1948975670," + + "-19.1867860823,-19.1786678435,-19.1713792157,-19.1695661946,-19.1594428055,-19.1423038522," + + "-19.1380418786,-19.1326451258,-19.1085034175,-19.1040998843,-19.0798027396,-19.0735922396," + + "-19.0693346875,-19.0578134683,-19.0559621671,-19.0425557421,-19.0279013677,-19.0263697499," + + "-19.0221825561,-19.0157349252,-19.0064372737,-19.0042693882,-19.0027434133,-18.9771320814," + + "-18.9092744312,-18.8831525011,-18.6126354884,-18.6123732185,-18.5239809302,-18.5217559886," + + "-18.5021923570,-18.2509646291,-18.1879041212,-18.1833498293,-18.0082544937,-17.9548619999," + + "-17.9250502345,-17.7675516184,-17.7569846767,-17.7461797647,-17.6838689314,-17.6801059141," + + "-17.5681367463,-17.5496804837,-17.546000,-17.5449804169,-17.4271102390,-17.4019446265," + + "-17.3990196444,-17.1937702409,-17.1203530837,-16.9481935094,-16.8999064340,-16.8619769504," + + "-16.8565473881,-16.841456527777776,-16.8114869486,-16.8077194,-16.6801050032,-16.6625595025," + + "-16.5581522944,-16.5576038471,-16.5121558117,-16.4594418864,-16.3891311149,-16.3256791261," + + "-16.2433923188,-16.2424776439,-16.2,-16.1675065524,-16.1385356593,-15.9988390562,-15.8271303941," + + "-15.7236132624,-15.6932515137,-15.6910883516,-15.6868347454,-15.6854972046,-15.6441029970," + + "-15.5645924718,-15.5140276310,-15.4549241428,-15.3687880606,-15.2351555878,-15.1135676547," + + "-15.1072978015,-15.0712716331,-14.9057684714,-14.8632370454,-14.8368103445,-14.7647959439," + + "-14.7635849177,-14.6810594541,-14.6385640035,-14.3419936196,-14.3035788003,-14.2830109769," + + "-14.1800360544,-14.1456687273,-14.1075269728,-13.9999376124,-13.9641207869,-13.8870075430," + + "-13.8762395278,-13.8598832588,-13.6641917166,-13.6606252292,-13.6551887362,-13.5814519067," + + "-13.5438931052,-13.5400304440,-13.5338940098,-13.4019318955,-13.4001676763,-13.3755321856," + + "-13.2206420941,-13.176397846758185,-13.0942516406,-13.042018999526977,-13.0163995934,-13," + + "-12.9486645585,-12.8946537206,-12.8080837456,-12.7990197875,-12.6909069291,-12.4806498073," + + "-12.4696803942,-12.2720940753,-12.2378694514,-12.2344952465,-12.2138862792,-12.11844904," + + "-12.0984902614,-12.0872143872,-12,-11.9986441667,-11.9729370492,-11.7887487551,-11.7358777998," + + "-11.6767395032,-11.4082175114,-11.3258048935,-11.3213090122,-11.3212564171,-11.279582965366556," + + "-11.2146109871,-11.1626324486,-11.1046029410,-11.077997959623605,-11.0013594444,-11," + + "-10.9835914719,-10.9508322090,-10.8244025391,-10.5209818176,-10.5133139512,-10.4434857815," + + "-10.3112442518,-10.2780961917,-10.2027272199,-10.05,-10.0486372222,-10.001241120,-10," + + "-9.998758861,-9.9833263319,-9.9582630982,-9.9497447301,-9.9442064094,-9.9255569976," + + "-9.9255150926,-9.9177724571,-9.9116288496,-9.8908486233,-9.8752237332,-9.8550183317," + + "-9.8320712389,-9.8174680795,-9.8094666546,-9.8077325645,-9.7964336368,-9.7937838350," + + "-9.7922127612,-9.7889836306,-9.7794195765,-9.7751102831,-9.7556385919,-9.7521679387," + + "-9.7495596439,-9.7223365758,-9.7201400616,-9.6980379834,-9.6757428807,-9.6748015367," + + "-9.6576498976,-9.65664821408901,-9.6527246528,-9.6356219787,-9.6336458263,-9.6334690404," + + "-9.6233626432,-9.6128015323,-9.6098419837,-9.6080286962,-9.5930872101,-9.5857052257," + + "-9.5853469917,-9.5727750302,-9.5636574635,-9.5530275863,-9.5488366916,-9.5466027093," + + "-9.5411208555,-9.5338704651,-9.5284598326,-9.5198292959,-9.5090347854,-9.5019946065," + + "-9.486900253798344,-9.4796954418,-9.4670802435,-9.4546150406,-9.4508778589,-9.4374584268," + + "-9.4090896450,-9.4004926352,-9.3856113762,-9.3809572676,-9.3715816928,-9.3597241491," + + "-9.3541697716,-9.3485472828,-9.3464940981,-9.2974861965,-9.2887899729,-9.2879705389," + + "-9.2806942519,-9.2778801891,-9.2490763384,-9.2309552615,-9.2283971215,-9.2203420334," + + "-9.2056484989,-9.1883916217,-9.1855199225,-9.1704395398,-9.1680642851,-9.1234117067," + + "-9.1048749080,-9.1047501907,-9.0791301932,-9.0586917767,-9.0280312502,-9.0084093906," + + "-9.0050262787,-9.00145666667,-9,-8.99854333333,-8.9615586081,-8.9185740153,-8.8387995357," + + "-8.8200596604,-8.8151211116,-8.7812050100,-8.7411685014,-8.6767624883,-8.5624561325," + + "-8.5281632402,-8.522097079186306,-8.4838585832,-8.3745080127,-8.36301544647104,-8.3165131291," + + "-8.3013059591,-8.2963597858,-8.2419396541,-8.2240809358,-8.1745353165,-8.1660651538," + + "-8.1575200565,-8.136745,-8.0934149371,-8.0618147294,-7.9578518334,-7.6221099815,-7.5559037," + + "-7.490535682,-7.486952083,-7.4699626803,-7.4540137611,-7.4397903953,-7.4330940402,-7.4201521250," + + "-7.3634864983,-7.3297477878,-7.2718622518,-7.2378372,-7.1912559947,-7.1376473645,-7.1037710855," + + "-6.9710994505,-6.9240926089,-6.8438270481,-6.7875741453,-6.7200711,-6.6955324842,-6.6939068551," + + "-6.6533639455,-6.5706097227,-6.5424897944,-6.5126588093,-6.4717900189,-6.4232987368," + + "-6.3835404074,-6.3371111,-6.2626405858,-6.2610035871,-6.1835665729,-6.0589975081,-6.0246021551," + + "-6,-5.9477536652,-5.8865293624,-5.7704772952,-5.7027048567,-5.6342271039,-5.4347892," + + "-5.4322064514,-5.3498071015,-5.3415079971,-5.3407381847,-5.2096342892,-5.1039965720," + + "-5.0882786722,-5.0501900022,-5.0040354490,-5,-4.9732504580,-4.9451058817,-4.8886947314," + + "-4.8520491055,-4.7732910406,-4.7601449911,-4.6741162050,-4.6247740358,-4.5796883247,-4.531095," + + "-4.4980133305,-4.4916537572,-4.44340920541435,-4.2131506322,-4.1892409654,-4.181271680064457," + + "-4.1714583763,-4.1674482190,-4.1370495786,-4.0562562622,-4.022094267169,-4.013493146314863," + + "-4.0000001,-4,-3.9999999,-3.9437385342,-3.9369832151,-3.8977574735,-3.8424983415,-3.7428216159," + + "-3.6801453162,-3.6680122287,-3.6483998900,-3.6480235522,-3.6262553,-3.5679026480,-3.4693258990," + + "-3.4679775330,-3.3925202280,-3.2433764780,-3.1933,-3.1309666481,-3.0673481366,-3,-2.9883217265," + + "-2.9707739252,-2.899366393,-2.889646631,-2.8622073994,-2.8417810196,-2.695406975,-2.685687214," + + "-2.6308107403,-2.536100157,-2.4973268139,-2.4894793557,-2.4542899296,-2.3488,-2.2872,-2.2226," + + "-2.1994039429,-2.1430339033,-2.1132082532,-2.1055585251,-2.0816660918,-2.0693367961," + + "-2.0439733787,-2,-1.8622854664,-1.85407,-1.8478,-1.8140483,-1.8083280762,-1.7779699685," + + "-1.6650273067,-1.5708,-1.56904,-1.5656815613,-1.504967424950,-1.4289441365,-1.4142," + + "-1.4071810906,-1.4,-1.3863,-1.3173627591574,-1.3,-1.2466271084,-1.221408328101,-1.19725," + + "-1.1339666688,-1.1195085022,-1.0552787291,-1.0447468723,-1.0322328827,-1.0233548058,-1,-0.9897," + + "-0.9071392,-0.9025887443,-0.8095,-0.7854,-0.7850645975,-0.7654,-0.7336,-0.7079,-0.7071,-0.7011," + + "-0.6908437587,-0.685226058142,-0.6442,-0.6297633697,-0.6240596549,-0.5554,-0.522846035499," + + "-0.5187,-0.5,-0.4555,-0.4509174844,-0.4477561568,-0.3873290331489431,-0.3639702342662023," + + "-0.260206554508,-0.2442969095,-0.215443296201,-0.138495501548,-0.1,-0.096,-0.095041956369," + + "-0.046534568425,-0.039367665210,-0.0157,-0.01,-0.00483333,-0.00411349,-0.002532140,-0.002244050," + + "-0.002185789,-0.002120241,-0.002113449,-0.002109689,-0.002106462,-0.002074503,-0.002067483," + + "-0.002056383,-0.002048528,-0.002040721,-0.002029979,-0.002019551,-0.002011971,-0.001996259," + + "-0.001989440,-0.001988738,-0.001988706,-0.001968072,-0.001959383,-0.001953415,-0.001952689," + + "-0.001943415,-0.001936024,-0.001933954,-0.001910106,-0.001889802,-0.001880155,-0.001871966," + + "-0.001854121,-0.001834893,-0.001832259,-0.001808739,-0.001798644059,-0.001798641,-0.001796903," + + "-0.001796902,-0.001796699,-0.001796698,-0.001796645,-0.001796631,-0.00179663056824," + + "-0.00179663056816,-0.001796630,-0.001796616,-0.001796359,-0.001796358,-0.001796357,-0.001796356," + + "-0.001796291,-0.001796290,-0.001796281,-0.001796279,-0.001796255,-0.001796254,-0.001796204," + + "-0.001796202,-0.001790562,-0.001790561,-0.001790554,-0.001790507,-0.001790497,-0.001790496," + + "-0.001790494,-0.00179049310978,-0.001790493,-0.001790492,-0.001790479,-0.001790432,-0.001790221," + + "-0.001790220,-0.001790144,-0.001790143,-0.001790119,-0.001790118,-0.001790068,-0.001790066," + + "-0.001766713,-0.001741186,-0.001735150,-0.001723782,-0.001716231,-0.001586797,-0.001586769," + + "-0.001453641,-0.001376321,-0.001321341,-0.001316827,-0.001122025,-0.0011,-0.001060120," + + "-0.001048847,-0.001014989,-0.001010182,-0.00101,-0.00100773,-0.00100662,-0.00100615," + + "-0.000987727,-0.000984246,-0.00098139,-0.000971702,-0.000944901,-0.000931806,-0.000907296," + + "-0.000904387,-0.000904370,-0.00090436947704,-0.00090436947663,-0.000904369,-0.000904233," + + "-0.000904199,-0.000904107,-0.000901940,-0.000901935,-0.000899322029,-0.000898556,-0.000898554," + + "-0.000898316,-0.000898315,-0.000897965,-0.000897888,-0.000895486,-0.000895485,-0.000895264," + + "-0.000895247,-0.00089524655486,-0.000894897,-0.000894821,-0.00089056,-0.000888824,-0.000884780," + + "-0.000883357,-0.000882190,-0.000874839,-0.000848202,-0.000841228,-0.000839185,-0.000828837," + + "-0.000827958,-0.000824804,-0.000823699,-0.000820885,-0.000820580,-0.00081028,-0.000808483," + + "-0.000806005080,-0.000806005,-0.000805721,-0.000800312,-0.000796712,-0.000793716,-0.000789630," + + "-0.000785474,-0.000782480,-0.000772683,-0.000766795,-0.000760958,-0.000759909,-0.000756015," + + "-0.000721216,-0.000683918,-0.000610653,-0.000604493,-0.000228872,-0.000173333333333,-0.0001733," + + "-0.0000001,-0.0000,0.0000001,0.000005801264,0.000228872,0.0003092,0.000604493,0.000610653," + + "0.000683918,0.000721216,0.000756015,0.000759909,0.000760957,0.000766795,0.000772683,0.000782480," + + "0.000785474,0.000789630,0.000793716,0.000796712,0.000800312,0.000805721,0.000806005," + + "0.000806005080,0.000808483,0.00081028,0.000820580,0.000820885,0.000823699,0.000824804," + + "0.000827958,0.000828837,0.000839185,0.000841285,0.000848202,0.000874839,0.000882190,0.000883357," + + "0.000884780,0.000888824,0.00089056,0.000894820,0.000894897,0.000895229,0.000895246," + + "0.00089524655486,0.000895247,0.000895485,0.000895486,0.000897887,0.000897964,0.000898315," + + "0.000898315284,0.000898554,0.000898556,0.000899322029,0.000901935,0.000901940,0.000904107," + + "0.000904198,0.000904232,0.000904352,0.000904369,0.00090436947663,0.00090436947704," + + "0.000904928485,0.000907296,0.000931806,0.000944901,0.000971702,0.00098139,0.000984246," + + "0.000987727,0.001010173,0.001014989,0.001048847,0.001060120,0.0011,0.001122025,0.001316827," + + "0.001321341,0.001376321,0.001453641,0.001586769,0.001586797,0.001716231,0.001723782,0.001735150," + + "0.001741186,0.001766713,0.001790066,0.001790068,0.001790118,0.001790119,0.001790143,0.001790144," + + "0.001790220,0.001790221,0.001790432,0.001790479,0.001790489,0.001790491,0.001790493," + + "0.00179049310978,0.001790494,0.001790507,0.001790554,0.001790561,0.001790562,0.001796202," + + "0.001796204,0.001796254,0.001796255,0.001796279,0.001796281,0.001796290,0.001796291,0.001796356," + + "0.001796357,0.001796358,0.001796359,0.001796616,0.001796630,0.00179663056816,0.00179663056824," + + "0.001796631,0.001796645,0.001796698,0.001796699,0.001796902,0.001796903,0.001798641," + + "0.001798644059,0.001808739,0.001832259,0.001834893,0.001854121,0.001871966,0.001880155," + + "0.001889802,0.001910106,0.001933954,0.001936024,0.001943415,0.001952689,0.001953415,0.001959383," + + "0.001968072,0.001988706,0.001988738,0.001989440,0.001996259,0.002011971,0.002019551,0.002029979," + + "0.002040721,0.002048528,0.002056383,0.002067483,0.002074503,0.002106462,0.002109689,0.002113449," + + "0.002120241,0.002185789,0.002244050,0.002532140,0.00392509,0.00392695,0.00393129,0.0041133," + + "0.00483333,0.0083,0.01,0.0205997186,0.0213854656,0.0222239630,0.0372192405,0.04281,0.0868," + + "0.095041956369,0.1,0.1021998532,0.111,0.1116,0.1120336125,0.1294010891,0.1325785640,0.1396," + + "0.1521,0.1529149340,0.1710,0.1736,0.1739948339,0.1763,0.1796078505,0.1884288619,0.20944," + + "0.2151624258,0.2198,0.2238591227,0.2271197201,0.2307496667,0.2364142241,0.2410422753," + + "0.2546693029,0.2620,0.26481514238818316,0.2731990430,0.27682804555233764,0.2782436804," + + "0.29020309743436806,0.2925675717,0.3063354834255284,0.3119584346,0.3165167866," + + "0.31801488286689883,0.3368,0.3372939259,0.3420,0.3501026786,0.35596960759234,0.3565245677," + + "0.3614,0.3639702342662023,0.3640,0.3641,0.3678100982,0.3698643768,0.3821,0.3830,0.3859851257," + + "0.4048610966,0.4114648584,0.4211558922141421,0.4216,0.4315853824,0.4377574241549981," + + "0.4459912613,0.4543975995,0.4555,0.4677460038,0.4767,0.4791919877,0.4973936135,0.498202281," + + "0.498202283,0.499095076,0.499095631,0.499104753,0.5,0.500895246,0.500895247,0.500904369," + + "0.500904924,0.501797717,0.501797719,0.511648325,0.511651393,0.513441886,0.513444955,0.5194," + + "0.5355680008,0.5456299185,0.5509033260,0.5519708680,0.5529890539,0.5554,0.5567,0.5571469345," + + "0.5580111982,0.5622425758450019,0.56493,0.5774,0.5778,0.5787958629,0.5788441077858579," + + "0.5832005675,0.5868,0.5951648774,0.5995552142,0.6046,0.6099770177,0.6126391439,0.62896," + + "0.6321060114,0.6428,0.6442,0.6588822473,0.66277083,0.6641448256,0.6658150243,0.6679908400," + + "0.6710100716628344,0.6789399156,0.6819851171331012,0.6845208231,0.6936645165744716,0.7071," + + "0.70710678118,0.7071067812,0.7079,0.713170409026,0.7231719544476624,0.7256633705,0.7345999991," + + "0.7351848576118168,0.7364120333,0.7401919089,0.7509772840,0.7517410096,0.7580,0.7596010223," + + "0.7654,0.7660,0.7684849115,0.7720814716,0.78452,0.7854,0.7990141229,0.8002954696,0.8045877956," + + "0.8089,0.8129663669,0.813473286152,0.8151388636,0.8183051284,0.8211876318,0.8232394368," + + "0.8271647968,0.8275131479,0.8324676722,0.8391,0.8405,0.8412200908,0.8467653094,0.8491614798," + + "0.8510548344,0.8550,0.8660,0.8830,0.8939490530,0.9071392,0.920230566844,0.9267949652," + + "0.9277524134,0.929377425352,0.9337491530,0.9397,0.9421744209,0.9430496675,0.9474400360," + + "0.9510780379,0.9511694165,0.9567675855,0.9610981916,0.9698,0.9700961170,0.9743282127," + + "0.9786091010,0.9799,0.9848,0.9860535478,0.9926766371,0.999095633,1,1.000904366,1.0025,1.0154," + + "1.0465,1.0642,1.0711,1.0795717122,1.1380806183,1.1534,1.1547,1.18505,1.1918,1.1958,1.202683395," + + "1.237430235,1.248203369,1.248209507,1.251790493,1.251796630,1.2637472104,1.2994,1.3054," + + "1.3184899313,1.3785514183,1.3863,1.39829,1.4142,1.4294037508,1.4750458750,1.5084105801," + + "1.5360082778,1.5459,1.5557,1.5596096157,1.5677,1.5708,1.6613265138,1.66277083,1.7045245488," + + "1.7169216947,1.7200843296,1.7321,1.7435,1.7803646722,1.8140483,1.82776484381,1.8475231444," + + "1.8478,1.85407,1.9656672403,1.9690445225,1.9824185118,1.9861,1.999095641,2,2.000904357," + + "2.0349290359,2.0389166997,2.0400972654,2.0424676812,2.1,2.12955,2.1516254056,2.162845830414," + + "2.2304783506,2.25,2.250704350387,2.33722917,2.3401856085,2.3935395760,2.4206654883,2.5008083079," + + "2.5146830998,2.6127341537,2.6387476779,2.66277083,2.6978007803,2.7438994101,2.7469759008,2.7475," + + "2.7788325854,2.7852,2.8792042895,2.9,2.9037,2.9238,2.9586342556,2.9999999,3,3.0000001," + + "3.0425721977,3.14159265359,3.1714349364,3.1774300866,3.1839332730,3.1922806,3.1937958085," + + "3.31372805556,3.3137281,3.3602853603,3.3736512451,3.4171783192,3.4798778581,3.5609941446," + + "3.6021305084228516,3.6262553,3.6310845229,3.6524418056,3.66277083,3.7108516861,3.8138602324," + + "3.8575317925,3.8761,3.9790540663,4,4.05,4.0697453667,4.1063917523,4.1107421068,4.1230600723," + + "4.1827817395,4.2027372999,4.2367325538,4.3228601350,4.3613065976,4.3761667210,4.4421245388,4.5," + + "4.531095,4.6282142532,4.66277083,4.7269030447,4.7459157253,4.7715139132,4.8,4.8179867316," + + "4.8901762814,4.9489248449,5,5.0096390922,5.0261998535,5.0495381196,5.0514461622,5.0765421386," + + "5.1451934064,5.1657533479,5.1808564778,5.2661796574,5.3289862640,5.38763888889,5.3876389," + + "5.3939702157,5.4347892,5.4631533571,5.4925196315,5.4974120433,5.5,5.584698978,5.6488167761," + + "5.6713,5.7134,5.7232,5.7344268609,5.7588,5.7690110660,5.875,5.8813,5.8876297478,5.9157121060," + + "5.9473211127,5.9890761386,6,6.0161102274,6.0228137911,6.1617137742,6.2919675889,6.3021488806," + + "6.3240504109,6.3371111,6.4168117979,6.4698255786,6.6122077057,6.6442757043,6.66277083," + + "6.6698983501,6.6873727446,6.8784583,6.87845833333,6.8874824898,6.9173640629,7,7.1419837480," + + "7.179239072128023,7.1910087068,7.2342593616,7.2378372,7.249209260581,7.250000000000," + + "7.342196526699235,7.3693412472,7.3709595382,7.4030787,7.438632495,7.465834308888,7.466666666667," + + "7.482494584516,7.482506019176,7.483333333333,7.5057731743,7.515823996992,7.516666666667," + + "7.5302153709,7.532503616986,7.532530252396,7.533333333333,7.6378853558,7.66277083,7.7249502728," + + "7.7430181007,7.7970420656,7.8032784791,7.8049591034,7.8141712724,7.8744650207,7.89,7.9594801079," + + "7.999097344043,8,8.136745,8.1530010191,8.2748648014,8.3472735471,8.4892787230,8.499027339833," + + "8.500000000000,8.5141898111,8.66277083,8.665654272188,8.666666666667,8.6780787506,8.7141462778," + + "8.7442679237,8.7651393303,8.7806411209,9,9.0690282061,9.0709137304,9.1299598915,9.1980318083," + + "9.2026796862,9.2715613620,9.2785749606,9.2921681107,9.3325749918,9.4344357510,9.5293212197," + + "9.596525859439623,9.6253009222,9.666666666666666,9.6859857008,9.6999375489,9.7920834357,9.984," + + "9.984340,9.984341,9.987,10,10.0089578122,10.0150948909,10.015444367463,10.015460839103," + + "10.016666666667,10.0262635630,10.1002957100,10.1160300689,10.1241618952,10.1366134196," + + "10.1670362925,10.1821355116,10.1840000169,10.1860723801,10.1878191712,10.1904676971," + + "10.1908900667,10.1921781407,10.2069053765,10.2080075121,10.214265110489109,10.2150991679," + + "10.2436153128,10.2556901904,10.2598469192,10.2711979528,10.2800898790,10.2886,10.2922798343," + + "10.2968451911,10.2978890619,10.3002789517,10.3009385171,10.3102576934,10.3126985648," + + "10.3155486517,10.3172409138,10.332117283303,10.333333333333,10.3358537029,10.3463227493," + + "10.3786030568,10.383985604100156,10.3916472934,10.4036887646,10.415423634267,10.416666666667," + + "10.4228351993,10.4236001839,10.4291884083,10.448735275612,10.450000000000,10.4525,10.4541089513," + + "10.465373788153,10.465380298337,10.466666666667,10.4703837993,10.4788996031,10.4808252097," + + "10.4893794068,10.4970331716,10.5122361845,10.5236020030,10.5309879356,10.5449464536," + + "10.548711467380,10.548775945187,10.550000000000,10.5660459562,10.5665512094,10.5907531926," + + "10.6007672189,10.6032378382,10.6198537389,10.6214035743,10.6257647236,10.6474003585," + + "10.6508090388,10.6585809296,10.6732390311,10.6771709914,10.7004848538,10.7118819188," + + "10.7150561883,10.748659705929,10.750000000000,10.7592956093,10.7639703855,10.7782532604," + + "10.8007276009,10.8072116146,10.8075764102,10.8083498797,10.8102522601,10.8112184284," + + "10.8411608718,10.8411958509,10.8523072346,10.8569245931,10.8675657776,10.9105813395," + + "10.9115419099,10.9123408994,10.9181102314,10.9297395133,10.9421661895,10.9467094331," + + "10.9619070788,10.9700141403,10.9783425364,10.981965431979,10.983333333333,10.9883708721," + + "10.998619309575,11,11.0581832240,11.070084714982,11.070084715592,11.0731980134,11.074062190626," + + "11.074062191236,11.0850079977,11.2011582425,11.2213297367,11.25,11.3886412993,11.4319423563," + + "11.5,11.5431930234,11.5482616810,11.6138802990,11.6377813068,11.7088334392,11.7944347582," + + "11.8235504151,12,12.0280112877,12.032056976,12.0516777085,12.0779530345,12.0814824633," + + "12.0855798348,12.1332225594,12.2114488494,12.3,12.4827231183,12.5,12.5029285949,12.5339468232," + + "12.6359180213,12.6522648050,12.6753804804,12.7448426145,12.77715082,12.8049940379,12.8091489452," + + "12.948437185277,12.950000000000,12.9622135342,12.9800321873,12.9840580805,12.998336654827,13," + + "13.0366592822,13.0768132535,13.131706947050,13.133333333333,13.14679150488858,13.1922806," + + "13.2115900349,13.304599775998279,13.3306225335,13.33903846111111,13.4013916345,13.4021731716," + + "13.4045312190,13.431569610583,13.433333333333,13.448283429558,13.450000000000,13.464877774631," + + "13.464913254978,13.466666666667,13.5121287506,13.548264242652,13.550000000000,13.5624272700," + + "13.564906713066,13.566666666667,13.5860975895,13.6081016459,13.6620144115,13.840227318521004431," + + "13.8682936931,13.9674113487,13.9718076506,13.9838806488,14.0130001331,14.0589477898," + + "14.1556288162,14.2583869011,14.3000196702,14.3419323455,14.3491243406,14.44661994,14.47226253," + + "14.514453594615022781,14.5216128511,14.6001907539,14.7921669533,14.8800104945,14.8824779140," + + "14.8951827161,14.9021123434,14.9027374310,14.9467935082,14.9878946198,15,15.0521133300," + + "15.0539906817,15.0889224537,15.1977215509,15.4247668791,15.498914097446,15.498914099277," + + "15.502891573090,15.502891574921,15.5269071903,15.542304306692937,15.59184037944909," + + "15.6380412243,15.6744717063,15.7258631745,15.7591910245,15.7860515996,15.9779535702," + + "15.9789322360,16,16.0224553269,16.05031911,16.1118935785,16.1396339481,16.1857250660," + + "16.2341190017,16.36,16.3601816158,16.3857419518,16.3999265763,16.5,16.610452439,16.610455233," + + "16.6663945754,16.6928847546,16.7491842544,16.7636024414,16.82,16.8210462130,16.849771944444445," + + "16.9323624559,16.9655055987,16.9839343080,16.9875171909,17.1256054857,17.1424915281,17.2," + + "17.245536403,17.245543028,17.246832896,17.246835092,17.248116270,17.248118466,17.249408353," + + "17.249414978,17.2588986357,17.2596103884,17.2719148256,17.3750,17.4322460420,17.5002106365," + + "17.546000,17.5503784835,17.5826505556,17.585319579,17.6191536111,17.7180717900,17.7286920734," + + "17.7467818790,17.9830247197,17.999031632,18,18.000968347,18.1343689010,18.2166379428," + + "18.3027049517,18.3236674818,18.5469,18.6907045458,18.698723643,18.7048581,18.7499060636," + + "18.9352023262,19,19.0226677902,19.0485716667,19.1939757716,19.2234294444,19.4420397181," + + "19.4447171460,19.4557925775,19.4761386210,19.4907667291,19.5,19.6776140317,19.7074346080," + + "19.997963606,19.997963628,19.9996448,20,20.002036372,20.002036394,20.0440697721,20.0454282778," + + "20.0541166979,20.0863846360,20.1052099885,20.1057317982,20.124006563576454,20.1245536415," + + "20.1357405556,20.1411665329,20.1434736553,20.1494345130,20.1722250768,20.1839066538," + + "20.2035769485,20.2060343192,20.2129499464,20.2148839237,20.2149078300,20.2170315032," + + "20.2366080925,20.2471682871,20.2673282337,20.2755153863,20.2756666263,20.2917095900," + + "20.2945040946,20.3037759043,20.3122591998,20.3145279457,20.3163155558,20.3202271141," + + "20.3367215658,20.3450540441,20.3483686169,20.3511128947,20.3715526988,20.3795548881," + + "20.3870396192,20.3899871763,20.3911658798,20.4143066442,20.4348082857,20.4398525342," + + "20.4649033892,20.4711672585,20.4749360982,20.4864473342,20.4902700839,20.4924024395,20.5," + + "20.5151795661,20.5208357556,20.5264309044,20.5961272596,20.5976448498,20.6145954060," + + "20.6226352769,20.6361252181,20.6390095332,20.6644197363,20.6884242583,20.6888876489," + + "20.6917357286,20.7119981828,20.7134315844,20.7152781983,20.7210235248,20.7349232283," + + "20.7373198297,20.7479812506,20.7807287727,20.7896762683,20.8020824140,20.8051789783," + + "20.8098672542,20.8409423708,20.8647562320,20.8669367778,20.8756448666,20.8959156966," + + "20.8972133561,20.9085122254,20.9184560187,20.9249231576,20.9290209494,20.9408599577," + + "20.9411485051,20.9490167192,20.9701082341,20.9914890120,20.9980760459,21.0164763452," + + "21.0493545179,21.2284428591,21.2475093875,21.2941986111,21.4,21.5,21.5000000049,21.5012785791," + + "21.5195488802,21.5203653800,21.5333791040,21.5377240973,21.5842676384,21.6331993543," + + "21.6942653703,21.7910320981,21.9004386412,21.9446471796,21.9458705640,22,22.3,22.3228377599," + + "22.3252032326,22.3343317585,22.4130383475,22.4243870208,22.4734039129,22.4913165287,22.5," + + "22.5013888889,22.5967062068,22.6339632787,22.653513921934305,22.7322724754,22.77346472511832," + + "22.8923059091,22.9579802676,23,23.0136475051,23.0164275848,23.0333873010,23.0833518677," + + "23.1082873232,23.1458260628,23.1511733038,23.1541372478,23.23,23.2553831478,23.2813833636," + + "23.3693033859,23.6042650645,23.6161521840,23.7275,23.729194873180,23.7534110208,23.7761284488," + + "23.8189681109,23.9305098127,23.9554652672,24,24.0087396721,24.0100345748,24.027610763560529927," + + "24.1047564008,24.1180873989,24.2156608317,24.253726008211544,24.3176168344,24.38178694," + + "24.381786944444446,24.422067806064522,24.4254617574,24.46358028,24.4730100405,24.4734381465," + + "24.5104273631,24.6568371578,24.7032636217,24.7745254301,24.782707184271129766,24.830351182," + + "24.830447748,24.833333333333,24.836218919,24.836315485,24.8505061022,24.9154429650,24.9384," + + "24.99862667,25,25.0003486,25.00366329,25.00445833,25.00457271,25.005602547,25.1938730946," + + "25.2622593363,25.2892002351,25.2988879331,25.3275320515,25.3488952172,25.5385802763," + + "25.5457759639,25.6530253182,25.7041000035,25.7841586919,25.7897168715,25.8062815391," + + "25.8863398753,26.0000,26.091712305,26.1645676522,26.1761469511,26.2083957447,26.2830225," + + "26.2833333,26.3130477559,26.3884977784,26.4511385776,26.5248940712,26.5579713234,26.5971550981," + + "26.6287263876,26.6431680702,26.6437577891,26.7200008826,26.8478033007,27.0219083563," + + "27.1405016091,27.2833333,27.2836106,27.2915307690,27.3024639669,27.3361344725,27.3432782139," + + "27.3537990267,27.3717431335,27.4373224654,27.4665102983,27.4737934098,27.4743245365," + + "27.5171288037,27.5388791002,27.7063050682,27.745464601997153,27.7787492517,27.86168989," + + "27.877587719075937,27.9150551786,27.9206554725,27.9650852011,28,28.2506774891,28.2830864," + + "28.2833333,28.3567542308,28.3597926319,28.44647901,28.5236724280,28.619135182474427," + + "28.6345630085,28.6603499308,28.72566754254401,28.7378521521,28.7569504248,28.7930766257," + + "28.8815698894,28.9327804979,29,29.0317,29.0924417375,29.1409725672,29.2833333,29.2835592," + + "29.3286919896,29.4454995234,29.4473999043,29.5694962171,29.5764205068,29.7032670105," + + "29.7574405692,29.9373943713,29.9558795250,29.97596772,29.99566778,29.99746103,29.9997978,30," + + "30.00134083,30.0523609099,30.0598555833,30.0599851854,30.0757101328,30.0881534347,30.1158431277," + + "30.1210940174,30.1291797254,30.1563304273,30.1619319357,30.1643265779,30.1804649932," + + "30.2033715333,30.2345,30.234501,30.2470524798,30.2475627489,30.2505986215,30.3017880976," + + "30.3082205513,30.3227561837,30.3236847010,30.3281308173,30.3505244935,30.3541137581," + + "30.3588816681,30.36,30.3631890384,30.3756797354,30.3826788909,30.3939457169,30.4060992834," + + "30.4076531874,30.4122790805,30.4192741493,30.4333653857,30.4584904014,30.4852506297," + + "30.5069203139,30.5120716507,30.5262355523,30.5265377635,30.5509837736,30.5573004598," + + "30.5649011670,30.5649867370,30.5698496420,30.5717416484,30.5865766668,30.5940481955,30.6084," + + "30.6105366204,30.6115985045,30.6144784184,30.6226892016,30.6447124879,30.6722125463," + + "30.6760590330,30.6775291474,30.6949420481,30.7022010899,30.7062162966,30.7104889319," + + "30.7133762328,30.7185540788,30.7186291790,30.7336324422,30.7346251189,30.7420972758,30.75," + + "30.7578824509,30.7604872284,30.7919429173,30.7925389719,30.8006774663,30.8088173910," + + "30.8106039881,30.8182477174,30.8255462270,30.8315703906,30.84,30.8403181671,30.8531334707," + + "30.8569113997,30.8618954465,30.8632607000,30.8639040743,30.8762585995,30.8822551157," + + "30.8903459176,30.8909786046,30.9015874823,30.9020031853,30.9157771281,30.9229311437," + + "30.9337103769,30.9472401536,30.9486641454,30.9620313275,30.9719421826,30.9938167603," + + "31.0043819908,31.2284502498,31.2638249380,31.2844282188,31.289740102,31.3720263871," + + "31.3744079922,31.4030041187,31.4197140165,31.4267077934,31.4797046691,31.5893799475," + + "31.6410734176,31.7173298465,31.7370508292,31.8605558626,31.8692054690,31.8719516081," + + "31.9484140590,31.9883214220,32.0077728355,32.1294434320,32.1455048270,32.2480021869," + + "32.2524388516,32.2540792459,32.2809624159,32.3449943633,32.3520551790,32.4558417273," + + "32.5474903700,32.5661389704,32.6499740509,32.6596,32.6668467052,32.7298,32.9127578763," + + "32.9392845832,32.9845571828,33,33.1372998541,33.1451975000,33.1672095397,33.2608566981," + + "33.2634048792,33.2921667980,33.3185372073,33.3255757200,33.4499285913,33.5702558206," + + "33.6225969013,33.6252927324,33.6950660037,33.9110503188,33.9545285454,34.0559290352," + + "34.1077930148,34.185406226,34.1878235263,34.191114076,34.2081349569,34.2241428842," + + "34.51643861111111,34.531335035632864,34.5487194112,34.5626482766,34.5979570645," + + "34.601485830443536,34.6635486089,34.6652275838,34.6829381126,34.6980659140,34.8029044," + + "34.8321767388,34.8824703453,34.8943272959,34.9730810876,35,35.005424705,35.0454420959," + + "35.0925204648,35.1364758272,35.1664811803,35.2029582655,35.245717462371594,35.27199233196341," + + "35.3510670805,35.37,35.3747862433,35.446011426401625,35.6024191831,35.6428903265,35.6698817700," + + "35.8924849218,36.000000000,36.0212581738,36.0772654252,36.0949196788,36.0991805410," + + "36.1100227223,36.1141613383,36.1979951235,36.2711932097,36.3411661168,36.5847249808," + + "36.5904991465,36.6017613088,36.6637391210,36.6832637281,36.7592109391,36.7864032717," + + "36.8503178238,36.91667,36.9166700108,36.9575776083,37.0000000000,37.0000000147,37.0083333333," + + "37.0083333334,37.00833334837,37.00833334838,37.0083333484,37.0083333485,37.0211653163," + + "37.0376191064,37.0777875387,37.083333,37.0833330159,37.2204561349,37.3611622287,37.3666811945," + + "37.4312106652,37.4367897060,37.4528523762,37.5191207820,37.5837083768,37.62607694444444," + + "37.7026348392,37.7749,37.7843555404,37.8286728006,37.8286740788,37.8530786142,37.9494837339," + + "37.9838,37.986398897578,38.0028546554,38.0327790292,38.0391644104,38.0828885726,38.1079667572," + + "38.2603562874,38.2706333082,38.4387691365,38.5395736955,38.7113483726,38.7495700245," + + "38.8399381962,38.8552843618,38.9483055378,39.1622288957,39.2489093279,39.2643368046," + + "39.2684671305,39.2854809247,39.3106928548,39.4087263276,39.4115866274,39.4440823975," + + "39.5396992359,39.5896177639,39.6058463190,39.6821505727,39.7506383769,39.994449789,40," + + "40.0003081,40.0167951770,40.0217776423,40.0842150295,40.0936831128,40.1192116699,40.1244867612," + + "40.1304133943,40.1429577199,40.1495377913,40.1629979305,40.1705017627,40.1727881259," + + "40.1756048990,40.1762654017,40.1946244182,40.2140519607,40.2243862141,40.2272544657," + + "40.2436883822,40.2733019916,40.2742910491,40.3074104493,40.3224517995,40.3481516035," + + "40.3498890996,40.3644592677,40.3813237731,40.3822966969,40.3869890035,40.4192356875," + + "40.4458702150,40.4562460745,40.4565955888,40.4566276504,40.4624940717,40.4697816170," + + "40.4755923878,40.4799159627,40.5162040333,40.5211596030,40.5225439155,40.5328985021," + + "40.5361666024,40.5431469837,40.5438377621,40.5466917960,40.5524514587,40.5566028935," + + "40.5647880296,40.5688849715,40.5764857623,40.5913833272,40.6115143350,40.6127074692," + + "40.6200421317,40.6299540574,40.6403024621,40.6436957307,40.6480244298,40.6533776922," + + "40.6622924750,40.6784961632,40.6791957468,40.6811168119,40.6920436024,40.6934322431," + + "40.6958590705,40.7397870392,40.7489150310,40.7493880077,40.7545399266,40.7710878998," + + "40.7821801102,40.7900054843,40.8056510679,40.8062160819,40.8129777308,40.8135756255," + + "40.8217587675,40.8302365060,40.8324168382,40.8345369145,40.8655993799,40.8666533485," + + "40.8690942845,40.8850179873,40.9150221936,40.9186217475,40.9334924529,40.9406024668," + + "40.9466629257,40.9538042404,40.9703333564,40.9727631907,40.9858722485,40.9888819952," + + "40.9928890043,41,41.0134441926,41.0355246248,41.0561850499,41.0573932198,41.0637989828," + + "41.0696713596,41.0866734660,41.2595851413,41.2851805506,41.3220478306,41.3233715669," + + "41.3352033138,41.3416456225,41.3865813447,41.5670977874,41.6743754043,41.7994923976," + + "41.8238911228,41.8606872838,41.9054883189,41.9087201484,41.937853904844985,41.9862708713,42," + + "42.0495032526,42.2155826206,42.2933132797,42.3133443814,42.3826076660,42.5137977627," + + "42.5571623885,42.6414085288,42.7084205060,42.7333243644,42.7707453425,42.7772722042," + + "42.9334405924,42.9662236851,43,43.0239640060,43.0741360152,43.1240737964,43.1274592749," + + "43.1922806,43.2756199739,43.3605739941,43.3972517538,43.3974758995,43.4298814980,43.5837411887," + + "43.6013437171,43.6109,43.6373394362,43.7575713592,43.7702855800,43.9116610208,43.9271323417," + + "44.0946182610,44.2542302837,44.3361622416,44.3367368198,44.3478015738,44.4218804789," + + "44.4465168591,44.4815518568,44.4913127126,44.5458333,44.5458827236,44.5851564761,44.6219279790," + + "44.643493652,44.69,44.7347899226,44.8644031164,44.8720342864,44.95066182,44.957292682," + + "44.9674252843,44.992837924,44.9991295392,44.9997925,44.9999197,45,45.0603376392,45.1195335801," + + "45.19242321598196,45.2007809057,45.2325884903,45.2639704879,45.2719659306,45.3669011811," + + "45.4033516879,45.4132014431,45.4286113875,45.5,45.6,45.6167638758,45.7,45.7526223682," + + "45.8028162130,45.89205035111361,45.8946112129,46,46.0000733,46.0002222,46.0009809664," + + "46.05944622180928,46.0687463889,46.0714239353,46.1464400004,46.1598354389,46.1810408682," + + "46.2623868954,46.3222134245,46.3703011111,46.378,46.4664188350,46.5,46.500051597273," + + "46.5091534230,46.5261074,46.5461497362,46.5943287210,46.5953112427,46.6423497334,46.6936897182," + + "46.7398186016,46.8,46.8756683333,46.9036255354,46.9256636829,46.951082877,46.9996386111," + + "46.9997622,46.9999431,46.9999902778,47,47.0000097222,47.0000569,47.0002378,47.0003611111," + + "47.0694221597,47.1100600825,47.1443936111,47.1807640935,47.1898937016,47.2588276162," + + "47.333333333333336,47.3983214513,47.4101077572,47.4970577378,47.5590007593,47.5954473956," + + "47.6243197261,47.6361347222,47.649155713893,47.650000000000,47.665765608135,47.666666666667," + + "47.749120260296,47.750000000000,47.7859862485,47.8240485822,47.9106126700,47.9752611," + + "47.9752611111,47.9911994181,47.9996794444,47.9999606,47.9999888889,48,48.0474540668," + + "48.0638373590,48.0824833396,48.1163330556,48.1163927778,48.1163964,48.1164106,48.1164311," + + "48.1164311111,48.1164319,48.1166666667,48.1166667,48.1167066,48.1169228,48.1169827778," + + "48.1169867,48.1170263889,48.1273210284,48.1704941243,48.1827130036,48.2638981,48.2669975286," + + "48.3869676380,48.4899747222,48.5,48.6918139540,48.750476070495021286,48.7731368364," + + "48.773847834747808675,48.832327188640,48.833333333333,48.8442357472,48.9423016681,49,49.0000033," + + "49.0000063889,49.0002717,49.0002825,49.0147747663,49.0365488340,49.0434719530,49.065661709281," + + "49.066666666667,49.082915351,49.084969746,49.1,49.1770930435,49.202425034,49.202425040," + + "49.2604161517,49.3,49.30990506,49.332249456364,49.332250779407,49.333333333333,49.6391756401," + + "49.6471765112,49.665566047661,49.666666666667,49.6904,49.6986510413,49.7661327,49.7836456546," + + "49.9195971337,49.99357566,49.99458694,49.9997097,49.9997533333,49.9999556,49.9999597222," + + "49.9999997,49.9999997222,50,50.0000396667,50.0000439,50.0002461111,50.0002897,50.00183," + + "50.0046280736,50.0047749416,50.0083884196,50.0130584672,50.0307069046,50.0364462297," + + "50.0774176880,50.0779641219,50.0800145195,50.082172046476,50.083333333333,50.0837143989," + + "50.0855077954,50.0951841039,50.0975358484,50.0990389861,50.1049528540,50.1188628580," + + "50.1242819935,50.1343812652,50.1365490236,50.1387387629,50.1397967283,50.1425480782," + + "50.1473239826,50.1593218026,50.16610427,50.1679836632,50.20901166666667,50.2165426895," + + "50.2246468449,50.2300300588,50.26449114,50.2789516772,50.2966459346,50.3256474182,50.3323164289," + + "50.3342208278,50.3372781690,50.3425538005,50.3484489213,50.3542282310,50.3602778968," + + "50.3705152580,50.3930386020,50.4094599185,50.4426160267,50.4426463863,50.4439084395," + + "50.4458299488,50.4499309674,50.4781583451,50.4949000479,50.498791390585,50.500000000000," + + "50.5023613434,50.5244358587,50.5294422839,50.5408477188,50.5425294111,50.5680928423," + + "50.5783407631,50.582129474187,50.583333333333,50.583438725252,50.5856921606,50.5958144484," + + "50.5960695735,50.6177,50.6235974778,50.6243675940,50.6277034455,50.6339926465,50.6582942940," + + "50.665476385913,50.666666666667,50.6799989922,50.6849086093,50.7222864861,50.7225485024," + + "50.7509056230,50.7566160438,50.7570760574,50.7725952624,50.7817131415,50.7914497367," + + "50.7976512101,50.8160896333,50.8191455831,50.8203716780,50.8253614228,50.8390922621," + + "50.8420835837,50.8557015620,50.8580656871,50.8721494614,50.8831926047,50.8838172783," + + "50.8938950488,50.899,50.9012994718,50.9035428509,50.9111169957,50.9444135429,50.9458720501," + + "50.9530657025,50.9581504113,50.9837826453,50.9882474140,50.9997114,50.9997713889,50.9999491667," + + "51,51.0002286111,51.0002886,51.015402184493,51.016666666667,51.0169555556,51.0170094444," + + "51.032075951188,51.033333333333,51.0892523800,51.1460877943,51.1659719222,51.1666667," + + "51.1666899972,51.22645041,51.332063317958,51.333333333333,51.3661570651,51.465361979987," + + "51.466666666667,51.6042289093,51.6926294743,51.7062683926,51.7186327718,51.7472739987," + + "51.7536923319,51.7753015653,51.782006921265,51.783333333333,51.7914032104,51.8106566282," + + "51.830295078,51.8452436385,51.981965147975,51.983333333333,51.9879378395,52,52.048646469731," + + "52.050000000000,52.0799612604,52.0925641350,52.1,52.1411020613,52.1561605556,52.1561606," + + "52.2420602240,52.2961472542,52.3403869111,52.481930297429,52.483333333333,52.4940883205," + + "52.4962620813,52.498573633365,52.4993373959,52.5,52.6279152662,52.6411504842,52.6608417101," + + "52.6880191938,52.6974765371,52.7309515249,52.765211787713,52.766666666667,52.7891165561," + + "52.7976100393,52.8917619975,52.9710431510,53,53.0072065012,53.115169791635,53.116666666667," + + "53.165185284138,53.166666666667,53.1761320615,53.2106639106,53.2519801847,53.3027824621," + + "53.3942556548,53.4607562483,53.465127257963,53.466666666667,53.498457503620,53.498461143331," + + "53.5,53.5457403772,53.581781243436,53.583333333333,53.5899082901,53.6140202991,53.6234824949," + + "53.6277898414,53.6394720461,53.6677897735,53.6966176349,53.765109112396,53.766666666667," + + "53.8072556867,53.80939444444444,53.8711625087,53.9601597136,53.9989335755,54,54.2933793206," + + "54.331696254077,54.333333333333,54.3464457214,54.3490528856,54.4032676618,54.4444444444," + + "54.4541071246,54.5,54.5417649044,54.6106266193,54.6540829630,54.6547978698,54.6823982531," + + "54.714992333813,54.7159059038,54.716666666667,54.7255186711,54.7777207304,54.818973308324573,55," + + "55.003515505218481835,55.030403993648806391,55.1027737429,55.1332494774,55.165653849,55.17," + + "55.1705688946,55.183195262,55.1999540459,55.2259750645,55.2371531832,55.25,55.2735286995," + + "55.2946750932,55.375,55.4459165788,55.5,55.5050863665,55.5204260857,55.5555555556,55.6152942863," + + "55.6192322641,55.6436461375,55.670679094,55.7622851795,55.8365526658,55.8603600954," + + "55.9016291208,55.9381520101,55.9896187413,56,56.0182014529,56.0703761781,56.1072337490," + + "56.2379702434,56.2425900762,56.2470115579,56.5237207562,56.5572332986,56.6666666667," + + "56.7530037053,56.7861006916,56.8828347097,56.9105729373,56.9127950267,57,57.0024522025," + + "57.0241073917,57.0909748951,57.1405754683,57.2145257183,57.2304506879,57.4201565369," + + "57.4425849230,57.5239937456,57.5449642224,57.6022388310,57.6029946160,57.7914752628," + + "57.8895638096,58,58.0701974311,58.1804486015,58.282525588539,58.2846118408,58.2923369725," + + "58.3169856731,58.3298871859,58.3931749475,58.4436055844,58.5388210940,58.5523508398," + + "58.8888888889,58.9140458,58.9403079367,58.9487998679,59.0951662260,59.1698787655,59.2605128471," + + "59.4124031484,59.4326708329,59.756888426,59.757598563058,59.758403933,59.9070126591,59.99," + + "59.99807333,59.99822194,60,60.0001191,60.00441792,60.00446778,60.00475191,60.00475258," + + "60.00535007,60.00569306,60.01,60.0108771272,60.0140580662,60.0291284696,60.0304323790," + + "60.0313937859,60.0397335630,60.0465199812,60.0486043403,60.0527293155,60.0620171885," + + "60.0640817595,60.0667408454,60.0765397412,60.0996876001,60.1086300862,60.1150468046," + + "60.1178484569,60.1315518295,60.1363202035,60.1452074812,60.1580162716,60.1631637832,60.1699," + + "60.171013757,60.1810460294,60.1931997991,60.193564733,60.202929201,60.2189305606,60.2635223516," + + "60.2684905661,60.2763462023,60.2807542048,60.2882853272,60.2928202530,60.2966089164," + + "60.3333585361,60.3342813246,60.3499171589,60.3586661957,60.3777794968,60.3795380424," + + "60.3954481899,60.4025168492,60.4197804189,60.4391516649,60.4611757563,60.4951083293," + + "60.5029363117,60.5237375468,60.5453409920,60.5564326069,60.5578535026,60.5819735012," + + "60.5975018363,60.5997615005,60.6049338062,60.6212081762,60.6370271381,60.6426706803," + + "60.6429472168,60.6444819104,60.6521695116,60.6693710568,60.6789776888,60.6790393928," + + "60.6880476492,60.6952552496,60.7048897911,60.7063957678,60.747020624548,60.7532284194," + + "60.7606385646,60.7629076148,60.7726090586,60.7806464601,60.7862954507,60.7920764042," + + "60.7971917835,"; + + private static final String CHUNK_2 = + "60.7989209340,60.8099423764,60.8106370898,60.8141416010,60.8279717815,60.8385203257," + + "60.8442179646,60.8571701571,60.8602526703,60.8762100151,60.8853952926,60.90966578454296," + + "60.9484292190,60.9618169609,60.9667316568,60.9730121398,60.9790884371,60.9974900881,61," + + "61.0726031598,61.1111111111,61.1269337981,61.1637771517,61.1999722752,61.2280864786," + + "61.2863951253,61.2887975834,61.3072659363,61.3600300433,61.499999564,61.5,61.5099995458,61.51," + + "61.5209991783,61.5458193623,61.6437737052,61.6531963428,61.6554659753,61.6933237333," + + "61.9063878006,62.0053970071,62.1392105751,62.2222222222,62.2457658007,62.2899028506," + + "62.2930069600,62.3327697572,62.4260882546,62.4317915615,62.5101492783,62.6892094638," + + "62.7158368686,62.7356240065,62.7911475081,62.8515546512,62.9999999937,63,63.0421916813," + + "63.0575080285,63.2120813131,63.2282931041,63.261184340,63.2666959744,63.2917945558," + + "63.3333333333,63.3416128275,63.3834861911,63.4288167842,63.4462194528,63.6056278696," + + "63.6397776749,63.6630728713,63.7092243462,63.7277849393,63.7880033811,63.9317823343," + + "63.993387836,63.9995792119,64.0,64.0831209279,64.0854342654,64.1409584458,64.1528226880," + + "64.2249537529,64.2596249008,64.3967878406,64.4444444444,64.5588989031,64.5625075877," + + "64.7750993019,64.7792984398,64.7874725222,64.851559610,64.854288365,64.8974706901,64.8985190713," + + "64.914588378,64.915804281,64.917020251,64.918236287,64.9388669541,64.9885817623,64.9984151350," + + "65.000000000,65.0311314831,65.0793496826,65.1058556815,65.2466871256,65.3475412110," + + "65.5198053592,65.5632643921,65.6036762180,65.6204314486,65.6222831765,65.6748652993," + + "65.6970336106,65.7380193724,65.7546653268,65.8274446207,65.9211509100,65.9905292469," + + "66.0522555435,66.0623612621,66.3132526636,66.3591210923,66.3652733965,66.5295382674," + + "66.5799499364,66.5841928232,66.6162174492,66.6386212957,66.6389497206,66.7793834162," + + "66.9026625522,66.9411073706,67.0,67.0090839235,67.0518325,67.1546072874,67.2349525670," + + "67.2695080089,67.2758505348,67.3045114589,67.3270538543,67.3766053532,67.4707153106," + + "67.4794680766,67.6760455583,67.6825233842,67.7825785445,67.806007272,67.8589725624," + + "67.9048158312,67.9727812220,67.9886371340,68.0783549484,68.2526920687,68.3771424633," + + "68.4759462496,68.4820083161,68.5260112188,68.6589802179,68.9001498060,69.0087889372," + + "69.1271846096,69.1829974388,69.2346381936,69.2477228904,69.4597522731,69.5064813197," + + "69.6301310123,69.7426835928,69.7447199105,69.8835157088,69.9663419458,69.99812806,69.9989678," + + "69.9989911,69.9990142,69.9993908333,69.9997780556,69.9998069444,69.9998280556,69.9998422," + + "69.9998617,69.9998663889,69.9998755556,69.9998867,69.9999053,70,70.0000463889,70.0000511," + + "70.0000533333,70.000055,70.0001297,70.0001336111,70.0001481,70.0001578,70.0001608333,70.0001631," + + "70.0001791667,70.0001930556,70.0006033333,70.0006091667,70.0006094444,70.0010089,70.0037343002," + + "70.00490733,70.005945,70.00666951,70.0095293626,70.0186459905,70.0242529688,70.0359400468," + + "70.0635629430,70.0710227099,70.0847779691,70.0896353531,70.0957203052,70.111086864," + + "70.1179652096,70.12337013762532,70.128307618,70.1422375374,70.1424618467,70.163900908," + + "70.1731315267,70.1793788385,70.181566919,70.1983790734,70.2009887167,70.2091499688," + + "70.2207367933,70.2228485919,70.2410137014,70.2466016765,70.2671672611,70.2878480471," + + "70.2894928952,70.3375377370,70.3461813446,70.3496352985,70.3833096116,70.3874078634," + + "70.3971704737,70.4026750861,70.4233082073,70.4270746519,70.4393887237,70.4447947660," + + "70.4453750849,70.4466727438,70.4598227375,70.4774261179,70.4775836656,70.4854280716," + + "70.4867056300,70.5034398056,70.5049492221,70.5081156610,70.5136938969,70.5261359994," + + "70.5341633320,70.5486167487,70.5609958631,70.5868181503,70.6025437547,70.6113860432," + + "70.6228216997,70.6236052708,70.6491293618,70.6594377768,70.7020153713,70.7058277145," + + "70.7254208788,70.7309222598,70.7316745409,70.7513325682,70.7538618658,70.7558001565," + + "70.7640164273,70.7863531388,70.7871678571,70.8017862719,70.8028881731,70.8163938435," + + "70.8217746040,70.8220482203,70.8279928055,70.8347119838,70.8357778632,70.8396198168," + + "70.8431571594,70.8584256587,70.8976936786,70.8983905024,70.8986641601,70.9106152137," + + "70.9123606882,70.9211780937,70.9281849579,70.9306917526,70.9319955374,70.9370001765," + + "70.9443512805,70.9517084975,70.9554669962,70.9660756955,70.9671286324,70.9818120585,71," + + "71.1990434220,71.2042128565,71.23213038171733,71.26673004703193,71.2934701929,71.3534426809," + + "71.3607521955,71.49135806675328,71.5162610671907,71.5181717183,71.5624775878,71.5715697583," + + "71.7513035300,71.7560324305,71.8322204655,71.8337784376,71.8501773949,71.8505547121," + + "71.8590802946,71.9993230521,72.0684099625,72.0788134529,72.0862933562,72.1158106531," + + "72.2542294354,72.2949102709,72.3532797491,72.5692211678,72.5807306253,72.6448737185," + + "72.7023402174,72.7063403889,72.7183017021,72.8817626201,72.9048071827,72.9059905421,73," + + "73.0662960367,73.0673811891,73.1055180323,73.1442856,73.1922806,73.2077231869,73.3031896004," + + "73.5055307300,73.5163807564,73.5707955278,73.6259975169,73.7144086150,73.7542661119," + + "73.8160145972,73.8196458860,73.8550759705,73.9643420027,74.0204664516,74.1,74.2803681973," + + "74.3140345936,74.3266149256,74.4237054204,74.4925642590,74.5629968499,74.6108323823," + + "74.6865930919,74.69909794660227,74.7579440452,74.77832986646499,74.8225035758,74.8365621394," + + "74.8562083,74.9397012116,75,75.0169362990,75.0775591038,75.1275985390,75.1789245938," + + "75.3340827987,75.3895826260,75.3901899809,75.3904414554,75.4797965998,75.5694271641," + + "75.6445071712,75.6509550283,75.8794035471,75.9111536135,75.9187393924,75.9617981968," + + "75.9740320316,76.0354738901,76.0800713976,76.0863350217,76.1944062131,76.2786099898," + + "76.2792517885,76.4130503173,76.5148306463,76.5665040629,76.5782690095,76.5851745566," + + "76.6621432071,76.6692051191,76.7254677659,76.9487430385,76.9594965901,77.0216158345," + + "77.0657936158,77.0774046082,77.0914030368,77.1315486475,77.1769236310,77.2046671411," + + "77.4423799967,77.4573927636,77.5254695021,77.5805939292,77.5923156814,77.6455638940,77.6534822," + + "77.6726989114,77.8061856572,77.8323229554,77.8832488521,77.9149250146,78.0413206451," + + "78.0660690876,78.1214527556,78.1864565763,78.3637643336,78.3643690894,78.4638811594," + + "78.5203765703,78.5676823388,78.6210665264,78.6584076186,78.6675565544,78.714775386137," + + "78.7699850319,78.7797877191,78.8023227358,78.8979558943,78.9854274121,79.0490755914," + + "79.0649065844,79.5034695093,79.5725050055,79.6454776348,79.7152157770,79.8097469605," + + "79.8293737054,79.8802703269,79.9268552980,79.99,79.99487333,79.99494639,80,80.0002644," + + "80.00155167,80.01,80.0150193753,80.0281082734,80.0566574740,80.0709906538,80.0904535261," + + "80.0921298391,80.0989872186,80.1015409967,80.1106583316,80.1112365376,80.1231823107," + + "80.1654103496,80.1780113525,80.1791569395,80.1896127919,80.1994904845,80.2007278148," + + "80.2016298087,80.2085188693,80.2140199400,80.2222434482,80.2365671846,80.2382292021," + + "80.2433369822,80.2621021518,80.2667195466,80.2842419408,80.2920174872,80.2959404087," + + "80.2965290229,80.3144473172,80.3515740385,80.3592940251,80.3791490145,80.3956836685," + + "80.3961610028,80.4040420231,80.4164439367,80.4369996020,80.4424115493,80.4428196695," + + "80.4614530617,80.4849589897,80.4863012420,80.4886876286,80.5122630521,80.5212319721," + + "80.5231675121,80.5460704598,80.5548872020,80.5645741906,80.5852221343,80.5901686038," + + "80.5969392822,80.6104642107,80.6138637845,80.6385279900,80.6476764259,80.6482540792," + + "80.6700039410,80.6785108917,80.6796681432,80.6903986951,80.6995146991,80.7237355733," + + "80.7466782310,80.7500588713,80.7525125683,80.7537743358,80.7661690288,80.7669954500," + + "80.7734576072,80.7902728211,80.7948402736,80.8196927273,80.8671865869,80.8754092571," + + "80.8803135822,80.8848766764,80.8866702938,80.8997122704,80.9078900718,80.9191136756," + + "80.9197701425,80.9433725042,80.9437168988,80.9459783007,80.9496010459,80.9670130376," + + "80.9787521274,80.9823584569,80.9991967787,81.0089111161,81.0343489380,81.0641431423," + + "81.1124451300,81.1493341375,81.2830486223,81.314089279,81.3748819436,81.4079136814," + + "81.4543384377,81.4663152862,81.4902616414,81.6666268419,81.7646094071,81.7949103274," + + "81.8177026408,81.8668144912,81.8738988668,82.0376694327,82.1028453149,82.2036176232," + + "82.2150056342,82.2239127957,82.3010483165,82.3318724399,82.4286410234,82.5591024355," + + "82.6250504715,82.6385276754,82.6478465607,82.6836589307,82.8456226975,82.9573597164," + + "82.9850228503,83.0429415409,83.1090136759,83.1345581099,83.3279294780,83.3689210619," + + "83.4744235117,83.5308131176,83.5516191256,83.6156947131,83.6237398675,83.6349635667," + + "83.6703375043,83.8192679216,83.9704390214,84.0,84.0910108055,84.1124942551,84.1578297365," + + "84.1714314114,84.1789855873,84.1934914271,84.2131541284,84.2418711822,84.2608342272," + + "84.4677069243,84.4756117750,84.5102002899,84.55256518,84.7042458603,84.7127066970,84.7838043163," + + "84.8783360216,84.9230149078,84.9722014413,85,85.0076410054,85.05493299,85.0897168462," + + "85.0909307831,85.3222226381,85.3871192550,85.3982223970,85.4123304310,85.5661224284," + + "85.5856170742,85.5911341667,85.8080149104,85.8764976286,85.9672408001,86.0042464514," + + "86.1128031464,86.1477384313,86.2852242994,86.2993989176,86.3293017336,86.3318417998," + + "86.3329325553,86.3337679988,86.3859461851,86.4721128657,86.5596667511,86.5841388479," + + "86.7776311985,86.7872101641,86.7873849130,86.8828039057,86.8865771916,86.8907264218," + + "87.0075919956,87.1555761043,87.2011682062,87.2340544489,87.2488149984,87.2889393354," + + "87.3050907988,87.3620502284,87.3973978464,87.4171568183,87.4693622383,87.4815472674," + + "87.5951755895,87.6222109978,87.8616846009,87.9089486985,87.9552070544,87.9608446770," + + "87.980755945,87.9808140533,88.0295172740,88.1608036446,88.2891416248,88.3752399281," + + "88.4956617003,88.5280609570,88.6715513574,88.7931017780,88.8068669405,88.8203526189," + + "88.8762393331,88.8893310433,89,89.0119403988,89.0462961156,89.0882607425,89.1315428504," + + "89.1326873925,89.3798616914,89.3832521756,89.4208328233,89.4603893825,89.5,89.5105564736," + + "89.6136396944,89.6150717843,89.7228156694,89.7588830795,89.8300875130,89.8306694493," + + "89.8903183246,89.9072554901,89.9075872145,89.9583403191,89.9594690425,89.9894216623,89.99," + + "89.99135362646302,89.999,89.9999,89.999999873385,89.9999999,89.99999999,89.999999999989996," + + "89.99999999999999,90,90.00001,90.0066580543,90.0092672617,90.01,90.0106423220,90.0483434140," + + "90.0545702452,90.0598623933,90.0656487088,90.0684823849,90.0745563464,90.0888221682," + + "90.0891258483,90.1074711799,90.1145386062,90.1299725257,90.1352434237,90.1359566782," + + "90.1380649347,90.1655009485,90.1834036836,90.1847984189,90.1903848581,90.1958404963," + + "90.2195191862,90.2259103522,90.2330138853,90.2461291404,90.2760527960,90.2760894813," + + "90.2779063923,90.2841546043,90.2854737833,90.2901075635,90.2998133187,90.3008662748," + + "90.3073014721,90.3170479552,90.3486210746,90.3688642972,90.3784337844,90.3894774181," + + "90.4057879600,90.4107676644,90.4241930348,90.4391164019,90.4576635954,90.4893702644," + + "90.4905546467,90.5030006919,90.5217667884,90.5297378114,90.5359055804,90.5376970710," + + "90.5450445832,90.5499599785,90.5736386070,90.5789951029,90.5849650699,90.5925677009," + + "90.5979873573,90.6029060873,90.6032354861,90.6063621158,90.6177784757,90.6201781373," + + "90.6363798105,90.6605815936,90.6634211024,90.6634321726,90.6652890542,90.6808556357," + + "90.6983519178,90.7046514943,90.7173958262,90.7402232455,90.7414911957,90.7459660200," + + "90.7774660604,90.7796418583,90.8009658259,90.8176634524,90.8264889463,90.8395350848," + + "90.8791736411,90.8893235311,90.8953318146,90.9008404807,90.9081150272,90.9109976584," + + "90.9143604315,90.9151039880,90.9223489138,90.9360697392,90.9377687408,90.9390534980," + + "90.9417476435,90.9423588456,90.9423960847,90.9684446145,90.9705345155,90.9924788950," + + "90.9925163187,90.9968622399,91,91.0966186475,91.1323497706,91.1573946186,91.2021231110," + + "91.2726639403,91.3234973005,91.4107597532,91.4734308311,91.6124307897,91.7425546179," + + "91.8207335323,91.8495346522,91.9158720484,91.9446769249,92.0018593591,92.0487871293," + + "92.1662912669,92.2767051552,92.3201685216,92.3534538297,92.6597043587,92.7082390660," + + "92.7167872262,92.7310580140,92.7446796075,92.7883781050,92.8320642395,92.8846710223," + + "93.0270602663,93.0281709121,93.0874941458,93.2758942081,93.4193661081,93.4632295476," + + "93.5518747322,93.6500222571,93.6733349750,93.6790731121,93.7101118679,93.7863129954," + + "93.8575161591,93.8973426839,93.9478756274,94.0016439421,94.0036131508,94.2304861566," + + "94.2811379653,94.3245277139,94.4002034978,94.4740404396,94.5029189079,94.5588879261," + + "94.5715889948,94.5870657217,94.6275672079,94.7544968060,94.8605218216,94.8767204910," + + "94.9362396518,95.0,95.0432445572,95.0641687155,95.2403005497,95.3977809221,95.4070516655," + + "95.4188372117,95.5300020136,95.6156935259,95.6326996288,95.6659394457,95.7426558832," + + "95.7619370286,95.8655824422,95.8979843707,95.9177686800,95.9332496636,96.0431766104," + + "96.1026759897,96.1459344102,96.1670313079,96.4025342806,96.4284727639,96.4820442045," + + "96.4854267472,96.5067828223,96.5597126498,96.67476470896398,96.68789658312737,96.7026620164," + + "96.7262713213,96.7461121139,96.8402148749,96.9295538910,97,97.0176191327,97.1204524330," + + "97.1420609214,97.2453640881,97.2825819689,97.4790143988,97.4860281314,97.5054708483," + + "97.5509003421,97.5569468760,97.6550567817,97.7247157965,97.7962770171,97.8473653755," + + "97.9297507566,97.9514714385,97.9598960425,97.9675789614,98,98.0573474237,98.0976036625," + + "98.172013849367,98.2872938097,98.3587698302,98.362008540559,98.5114024172,98.7361321642," + + "98.8114138429,98.8248133304,98.8743871260,98.9284832763,98.97406,99.0132534146,99.2905137713," + + "99.5719752144,99.5737438963,99.6023781174,99.7082663882,99.8129052911,99.9348079001,100," + + "100.0148954666,100.0213726456,100.0328567981,100.0361988664,100.0478827489,100.0644440138," + + "100.0647551775,100.0679369696,100.0849613278,100.0876483,100.1017071129,100.1161002435," + + "100.1252105382,100.1323994743,100.1452342443,100.1453713101,100.1644532030,100.1645347304," + + "100.1664295698,100.1850294843,100.1954199623,100.1984006355,100.2061055405,100.2275975816," + + "100.2370378259,100.2499385302,100.2589575221,100.2695381559,100.2810830549,100.2968163089," + + "100.3103261370,100.3669156655,100.3804719805,100.3952892244,100.4339484435,100.4373534616," + + "100.4470132582,100.4617594180,100.4734880731,100.4737302350,100.4846205812,100.5350349572," + + "100.5373276614,100.5407405945,100.5427479545,100.5725497895,100.5757828394,100.5787966151," + + "100.5821513570,100.6019282805,100.6108192539,100.6140322356,100.6214357026,100.6238525596," + + "100.6449925924,100.6742326194,100.6776574030,100.6823676393,100.7042769293,100.7044060498," + + "100.7090523427,100.7095824201,100.7207579758,100.7435829266,100.7659799608,100.7731576636," + + "100.7780137471,100.7784977140,100.8173987820,100.8213322615,100.8216260873,100.8304968356," + + "100.8308186795,100.8413924261,100.8499388037,100.8677613905,100.8696089733,100.8763555867," + + "100.9112248813,100.9114892728,100.9345367116,100.9396101906,100.9443622402,100.9639616716," + + "100.9677349413,100.9711143384,100.9727810821,100.9983207780,101.1890038152,101.2529844461," + + "101.2635238404,101.3362169174,101.6303167682,101.7519777648,101.9663622692,101.9681616248," + + "101.9706798836,101.9746447499,102.1868812356,102.2817021553,102.3134423218,102.6010355936," + + "102.6311753718,102.7263743079,102.9224326125,103.0749738073,103.1922806,103.1947683448," + + "103.4226263618,103.4930742925,103.561065778,103.6337815648,103.64025984,103.8391207142," + + "103.9375646519,104,104.0579352787,104.2687818917,104.6357199780,104.8100792607,104.9002368302," + + "104.9051484801,105,105.1672304167,105.1778053719,105.2754168153,105.4176918707,105.4248870814," + + "105.8174218935,105.9578331609,106,106.1651152124,106.2350153626,106.2777498204,106.4653112353," + + "106.6211948814,106.7429949781,106.8077194,106.8735960149,107,107.0582862622,107.1035922681," + + "107.2836000330,107.9665006223,108,108.2561565502,108.3785139275,108.8731447468,109," + + "109.2381208530,109.4591245928,109.6858208,109.685820833,109.9750225424,110,110.0059145808," + + "110.0091445253,110.0255190870,110.0283698987,110.0486236854,110.0551604465,110.0757522922," + + "110.0784957493,110.0826941374,110.0937440863,110.0973977891,110.0988929845,110.1071594840," + + "110.1282829759,110.1454350755,110.1928396624,110.2074536086,110.2075367326,110.2124518442," + + "110.2445797630,110.2610774864,110.2734219112,110.2799875321,110.2842129880,110.3255223842," + + "110.3627285832,110.3724185381,110.3740821515,110.3790328662,110.3824336404,110.3843836904," + + "110.3952984186,110.3986145890,110.4045415377,110.4087249466,110.4203894507,110.4283207815," + + "110.4290203898,110.4292321534,110.4333486366,110.4395693884,110.4406311958,110.4928526153," + + "110.4993556234,110.5061775944,110.5063711430,110.5209403479,110.5210303471,110.5253826702," + + "110.5453757907,110.5488903609,110.5677826175,110.5781783058,110.6051178518,110.6066455294," + + "110.6217357170,110.6403276588,110.6453720127,110.6483359564,110.6488410247,110.6594697851," + + "110.6668058012,110.6722999581,110.6864799856,110.7018248262,110.7127101938,110.7309087130," + + "110.7526797683,110.7544963160,110.7633392793,110.7666710262,110.7875504667,110.8672357396," + + "110.8716860238,110.8967536886,110.9170212513,110.9256034679,110.9341322494,110.9472297773," + + "110.9555828878,110.9680822795,111.701070433669,114,114.04215001020711,114.26109340373671," + + "114.35091069,114.98472216,115,116,116.8465522,116.846552222,117,118,118.97406,119,119.99001559," + + "119.99435889,119.9952447,119.99524538,120,120.00197111,120.0282638556,120.0358650247," + + "120.0440856622,120.0510835725,120.0734970456,120.0839708022,120.0868391150,120.0882522480," + + "120.0930076215,120.1071621348,120.1208651509,120.1366082758,120.1724623585,120.1744128824," + + "120.1812962078,120.1922834115,120.1938557094,120.2464205180,120.2581625576,120.2695614591," + + "120.2754329194,120.2928981698,120.2948792100,120.3064304930,120.3163752614,120.3347823427," + + "120.3401612468,120.3403456476,120.3531685812,120.3694000933,120.3907138338,120.4119184030," + + "120.4133749558,120.4200133401,120.4420696450,120.4571639125,120.4791498907,120.4910038636," + + "120.4913041985,120.4935453458,120.5033443580,120.5038465053,120.5411285918,120.5528704261," + + "120.5746083149,120.5747336187,120.5896919383,120.5920897044,120.6025664533,120.6069857779," + + "120.6254581560,120.6486866778,120.6646869394,120.6777960225,120.6967482820,120.7008393450," + + "120.7065181706,120.7132187645,120.7981801963,120.8104324458,120.8300166158,120.8513137656," + + "120.8622100732,120.8660619260,120.8735021013,120.8787420308,120.8869363890,120.9027437830," + + "120.9059581322,120.9106581244,120.9353901019,120.9357632899,120.9395236376,120.9499015457," + + "120.9598573820,120.9952802105,121,121.551874841,122,123,123.44730422061694,123.47123951316074," + + "124.0000,126.000423835,126.000734469,126.002213738,126.002524373,127.4835,127.759503988," + + "127.759505148,127.759775774,127.759780921,127.761290324,127.761295471,127.761566096," + + "127.761567257,128,130,130.0043694164,130.0104641839,130.0108888901,130.0315355771," + + "130.0334936740,130.0549243427,130.0586467430,130.0815389060,130.0896340570,130.0976840056," + + "130.0979222590,130.1003249085,130.1070741983,130.1088876084,130.1617028260,130.1692367892," + + "130.1756983494,130.1826062634,130.1832453461,130.1838852888,130.1946022249,130.2213236652," + + "130.2284841486,130.2389402517,130.2558456040,130.2789945294,130.2891249681,130.3231133025," + + "130.3337268181,130.3776922680,130.3959151631,130.4,130.4257286255,130.4370128971,130.4609264126," + + "130.4609905705,130.4611248753,130.4622216350,130.4689014096,130.4765915697,130.4786384854," + + "130.4863483330,130.4994689409,130.5000547754,130.5020570647,130.5134926951,130.5262638944," + + "130.5310034140,130.5493283922,130.5662521586,130.5684827033,130.5786379336,130.5824490023," + + "130.5927832047,130.6036848279,130.6066962791,130.6198305384,130.6206535666,130.6287227669," + + "130.6561885293,130.7292413039,130.7310123929,130.7451971478,130.7707977218,130.7851397036," + + "130.7914974914,130.8192016133,130.8358443481,130.8382094225,130.8429657164,130.8487160288," + + "130.8551063009,130.8896115077,130.8994551518,130.9122756981,130.9205644215,130.9326190128," + + "130.9364857762,130.9603256931,130.9958002425,132,133.1922806,133.88551329,133.8855216," + + "134.333684316,134.605119233,134.99913472,135,135.00291194,135.00641074,136,137,138," + + "138.19303001104092,139,140,140.0034604349,140.0163435591,140.0181654960,140.0244639639," + + "140.0292803756,140.0357246677,140.0437745429,140.0774508004,140.1002623482,140.1036826064," + + "140.1058922487,140.1257246691,140.1319502152,140.1612060920,140.2081210889,140.2390732913," + + "140.2735017629,140.3050870951,140.3265242174,140.3311899960,140.3678752942,140.3730391283," + + "140.3966149747,140.4219455785,140.4220823477,140.4297399110,140.4485877356,140.4720834014," + + "140.4751452989,140.4771116425,140.4911819383,140.4973246226,140.4982918026,140.4992250881," + + "140.5025123065,140.5086830302,140.5117693002,140.5130223329,140.5223099495,140.5279151075," + + "140.5571385114,140.5750239477,140.5883122989,140.5983717849,140.6012624076,140.6056889736," + + "140.6080188527,140.6091054692,140.6165699073,140.6308884892,140.6428111911,140.6441294534," + + "140.6618802190,140.6643127929,140.6879708211,140.7197125638,140.7557697839,140.7561364481," + + "140.7776214259,140.7842333846,140.7982222585,140.8028440361,140.8041765005,140.8110132830," + + "140.8127091472,140.8208531113,140.8212942434,140.8273607225,140.8500841767,140.8567165951," + + "140.8622591730,140.8624898562,140.8963110473,140.9483568214,140.9588650575,140.9842139999,141," + + "141.57916998,142,143,143.30076636407907,143.33006363443351,143.92330599,143.92634806," + + "143.92648984,143.92649143,143.92649211,143.92649252,143.9279419,143.92857222,144," + + "144.635331291666660,144.9667,144.968,145,146,146.8547812565557,146.99339940860168,147," + + "147.01335056698537,147.55671447322464,148,149,149.99825389,150,150.0054753699,150.00567472," + + "150.01814371,150.0358167607,150.0366235813,150.0406833955,150.0998916715,150.1012624908," + + "150.1055981470,150.1175388463,150.1461657011,150.1476683134,150.1545875606,150.1724830315," + + "150.1770507578,150.2062193251,150.2071621174,150.2185553402,150.2230766093,150.2452206431," + + "150.2683487285,150.2872780471,150.2932445511,150.3105224098,150.3128054514,150.3183273801," + + "150.3252472008,150.3440941987,150.3642244888,150.3685976599,150.3852952852,150.3890392442," + + "150.4051276696,150.4163065521,150.4318097094,150.4583065377,150.4892277622,150.4954910508," + + "150.4960718541,150.4963196965,150.5137836610,150.5202047210,150.5251209004,150.5696707234," + + "150.5931126765,150.6050881294,150.6609169826,150.6670621082,150.6995918182,150.7016104068," + + "150.7238822230,150.7401582820,150.7407483672,150.7430926180,150.7446122566,150.7452375246," + + "150.7487344905,150.7692866141,150.7804103414,150.7856466511,150.7972249220,150.8057175364," + + "150.8261707368,150.8381796528,150.8384853690,150.8488588999,150.8560042350,150.8802025406," + + "150.8812291858,150.8827038395,150.8989218927,150.9150615805,150.9162515055,150.9227263702," + + "150.9426457881,150.9519295109,150.9528142413,150.9607701203,150.9679439696,150.9695044815," + + "150.9988070526,151.2077,151.207701181,154.64715194333021,154.6653022651957,155,160," + + "160.0049830768,160.0080010509,160.0106199737,160.0295580243,160.0390197585,160.0892519416," + + "160.1141812758,160.1294242200,160.1359677924,160.1799904005,160.1948043463,160.2333513818," + + "160.2556473416,160.2822850737,160.2871251380,160.2904693231,160.2968564724,160.3083279810," + + "160.3540927190,160.3617186765,160.4001197642,160.4006102901,160.4225603060,160.4264735249," + + "160.4294052652,160.4312759692,160.4383759680,160.4567844437,160.4729986277,160.5086557650," + + "160.5091429791,160.5278707110,160.5298175128,160.5344804952,160.5641245537,160.5878069076," + + "160.6088986258,160.6115790352,160.6179845473,160.6250791828,160.6373902313,160.6382868956," + + "160.6423483126,160.6447981803,160.6524332599,160.6630418532,160.6632656727,160.6794810904," + + "160.6866246900,160.6971562328,160.7119668695,160.7127363327,160.7214099599,160.7280406636," + + "160.7309215820,160.7330142926,160.7596965102,160.7607399916,160.7668616164,160.8117951323," + + "160.8312787949,160.8486565585,160.8565770466,160.8584892232,160.8757513817,160.9066279973," + + "160.9138221527,160.9163061323,160.9286198483,160.9436711470,160.9509577553,160.9690930362," + + "160.9724593003,160.9763179459,160.9794787031,160.9810806536,163.1922806,164.737589,165.9,169," + + "169.4467058181239,169.65090726985764,170,170.0302177328,170.0641946050,170.0748311294," + + "170.0804614782,170.0938980656,170.0946608724,170.1006211763,170.1010951379,170.1022885868," + + "170.1113538332,170.1158223427,170.1249865639,170.1375706366,170.1397977064,170.1405366440," + + "170.1658638654,170.1798195714,170.2174368056,170.2183758483,170.2236262055,170.2580177319," + + "170.2581319411,170.2666681817,170.3061167023,170.3277640796,170.3366715442,170.3402740510," + + "170.3454770498,170.3484529579,170.3660263984,170.3723095047,170.3909883495,170.3972098164," + + "170.3991577317,170.4034003030,170.4050593367,170.4254637193,170.4614439985,170.4722281589," + + "170.4873432082,170.4926366887,170.5027767145,170.5235832568,170.5238000008,170.5318144721," + + "170.5708534042,170.5710819967,170.5761545704,170.6182278472,170.6439119665,170.6808093605," + + "170.6816130052,170.6832502669,170.7039755420,170.7081605352,170.7171183093,170.7445455520," + + "170.7465062128,170.7489315029,170.7492804294,170.7522870277,170.7575452122,170.7716226761," + + "170.7717121538,170.7924717408,170.7991687984,170.8020614665,170.8037412086,170.8522091884," + + "170.8635008015,170.8709639263,170.8773135555,170.8801051896,170.8847288206,170.8877826460," + + "170.8981621301,170.9183869916,170.9230729547,170.9786886104,170.9882511230,171.66658585876," + + "173.0000,175.482086827,175.756819473,178.9964394,179,179.799,179.8,179.9,179.99," + + "179.99433652777776,179.9964664,179.99786174,179.99847886,179.99888667,179.999,179.999104753," + + "179.99939778,179.999999,180,180.0261501820,180.0413323536,180.0430694902,180.0522042065," + + "180.0812683568,180.0855468805,180.0860875981,180.1,180.1099977864,180.1238278697,180.1602592915," + + "180.1668965748,180.1728485128,180.1833333,180.184,180.2003062924,180.2100320112,180.2173889904," + + "180.2204067090,180.2280212650,180.2351988738,180.2502374139,180.2551410057,180.2570720688," + + "180.2641439484,180.2751947006,180.2988991065,180.3089859974,180.3381763034,180.3536945715," + + "180.3558199030,180.3573673565,180.3649630983,180.3673574365,180.3687704920,180.3769971687," + + "180.3816637148,180.4135817841,180.4315909707,180.4510871253,180.4583398460,180.4636820369," + + "180.4667032708,180.4742461481,180.4778073139,180.4875952646,180.4880362185,180.4963027772," + + "180.5169825410,180.5533384236,180.5593997844,180.5619551786,180.5908903286,180.6001699300," + + "180.6237066153,180.6302993811,180.6346540849,180.6425321330,180.6506603946,180.6560052356," + + "180.6722342584,180.7047485406,180.7137917600,180.7301487821,180.7350988655,180.7542323137," + + "180.7801778816,180.7855662108,180.8170157951,180.8353501206,180.8477425796,180.8758506742," + + "180.9074447347,180.9080349563,180.9127621133,180.9197969760,180.9378053935,180.9552557119," + + "180.9723789714,180.9886935244,189.569,200,232.3,235,301.769827,303.525850,359,362,371,"; + /** The corpus values, in degrees, exactly as written in the {@code .gie} files. */ + static double[] degrees() { + String[] parts = {CHUNK_0, CHUNK_1, CHUNK_2}; + int n = 0; + for (String p : parts) { + for (int i = 0; i < p.length(); i++) { + if (p.charAt(i) == ',') { + n++; + } + } + } + double[] out = new double[n]; + int k = 0; + for (String p : parts) { + int from = 0; + for (int i = 0; i < p.length(); i++) { + if (p.charAt(i) == ',') { + out[k++] = Double.parseDouble(p.substring(from, i)); + from = i + 1; + } + } + } + return out; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/Clenshaw6AllocationTest.java b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/Clenshaw6AllocationTest.java new file mode 100644 index 0000000..4e5bbc0 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/Clenshaw6AllocationTest.java @@ -0,0 +1,362 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig.repoint; + +import com.sun.management.ThreadMXBean; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.util.AuxLat; +import org.locationtech.proj4j.util.Clenshaw6; + +import java.lang.management.ManagementFactory; +import java.lang.reflect.Modifier; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * {@link Clenshaw6#convert(double)} is the single highest-traffic trigonometric site in the + * library — the auxiliary-latitude framework routes {@code utm tmerc lcc cass poly aea laea} + * through it — and until this change it allocated on every call. This test measures that it no + * longer does. + * + *

The measurement

+ * + *

{@code com.sun.management.ThreadMXBean.getThreadAllocatedBytes} is used directly, not + * reflectively: a reflective call would allocate an argument array and a boxed + * {@code long} per invocation and so would measure the instrument. The cost of the direct call is + * two {@code long} reads on either side of a loop of two million iterations, which is why the + * figure resolves cleanly to {@code 0.00} rather than to a small positive number. + * + *

Four rounds run and the last is asserted, so the figure is a steady-state C2 measurement + * rather than an interpreter or C1 one. This matters in both directions: escape analysis is the + * thing that might have removed {@code StrictMath}'s array, and it only exists after the method + * is compiled. + * + *

Measured on Temurin 21.0.11, frozen {@code /tmp} A/B of {@code 7362c85} against this tree

+ * + *

Two builds compiled separately from two source trees whose only difference is the ten + * re-pointed files, each measured three times, identical every time: + * + * + * + * + * + * + * + * + * + * + *
{@code Clenshaw6.convert(zeta)}, one {@code sin} + one {@code cos}, B/op
argument domainbefore ({@code StrictMath})after
{@code |zeta| <= pi/4}64.000.00
latitude, {@code [-pi/2, pi/2]} — what {@code etmerc}'s forward feeds it64.000.00
full circle, {@code [-pi, pi]}64.000.00
medium reduction, {@code ~1e6}64.000.00
multi-word reduction, {@code |zeta| > 1647099}1392.000.00
+ * + *

Three things in that table are worth stating explicitly, because each contradicts a figure + * that could reasonably have been predicted instead of measured: + * + *

    + *
  • 64.00, not 124. A per-function figure of 62 B/op over {@code [-pi, pi]} would + * predict ~124 for two calls. In this in-situ shape C2 does scalar-replace the + * {@code double[3]} that {@code FdLibm.RemPio2.__ieee754_rem_pio2} declares, but not the + * {@code double[2]} that {@code FdLibm.Sin.compute} passes into it as an + * out-parameter. 64.00 is two 32-byte carriers and nothing else.
  • + *
  • Flat across four tiers. The tiering that shows up in a direct-call microbenchmark + * (32 / 72 / 696) collapses to a flat 32 per call here for exactly the same reason, and + * reappears only on the multi-word path, where {@code __kernel_rem_pio2}'s + * {@code int[20] + 3 x double[20]} do escape: 1392.00 is two lots of 696.
  • + *
  • {@link #theStrictMathFormStillAllocates} reports ~112 B/op, not 64. That loop calls + * {@code StrictMath} from the test's frame rather than from inside + * {@code Clenshaw6.convert}, which is a third inlining shape and gives a third number. The + * 64.00 above is the one that describes the shipped code.
  • + *
+ * + *

So the recorded lesson that an allocation measurement on one argument is a measurement of one + * branch generalises: it is also a measurement of one call shape. Only the A/B of two real + * builds settles what a change to the library actually removed. + * + *

The assertions are asymmetric on purpose. {@code 0 B/op} for {@link Clenshaw6} is pinned + * exactly, because that is the deliverable. The {@code StrictMath} side is asserted only to be + * greater, never equal to 64: a JDK that fixes {@code FdLibm} or gains the escape + * analysis to scalarise the carrier is a good outcome, and pinning 64 would turn it into a red + * build. + * + *

And the {@code StrictMath} side is conditional on the JDK, because before 21 it is native

+ * + *

{@code StrictMath.sin/cos/tan} were JNI calls into C fdlibm through JDK 17; + * the Java port that introduced the allocating {@code double[2]} landed in JDK 21. + * Corretto 17.0.20 has {@code Modifier.isNative(StrictMath.sin) == true} and no + * {@code java.lang.FdLibm$Sin} class at all in {@code lib/modules}, and measures a flat 0.00 B/op; + * Corretto 21.0.12, Corretto 25.0.4 and Temurin 21.0.11 all measure non-zero. That is not flake, + * not a vendor difference and not escape analysis -- the object is absent from the class library. + * + *

So {@link #theStrictMathFormStillAllocates} is guarded on nativeness and reported as a + * skip where the premise cannot hold. The guard is nativeness rather than "did we measure + * zero", because the latter is the assertion's own negation and could never fail. + * + *

What makes {@link Clenshaw6}'s {@code 0.00} meaningful on every JDK is not the + * {@code StrictMath} comparison but {@link #theInstrumentCanSeeAllocation}, which requires the + * counter to see and to scale with a known allocation. A blind instrument reports 0.00 for + * everything, cleanly. + */ +public class Clenshaw6AllocationTest { + + private static ThreadMXBean bean; + + /** Number of calls per measured round. Large enough that a 32 B allocation is unmissable. */ + private static final int N = 2_000_000; + + /** Consumed so that nothing in the loop can be optimised away as dead. */ + private static double sink; + + /** Escape hatch for the positive control -- a static volatile cannot be scalar-replaced. */ + public static volatile Object objectSink; + + /** + * Whether this JVM's {@code StrictMath.sin/cos/tan} are the pure-Java {@code FdLibm} port + * (JDK 21+) rather than the JNI-into-C fdlibm of JDK 8..17. Only the former can allocate. + */ + private static final boolean STRICT_TRIG_IS_PURE_JAVA = strictTrigIsPureJava(); + + private static boolean strictTrigIsPureJava() { + try { + for (String name : new String[] {"sin", "cos", "tan"}) { + if (Modifier.isNative( + StrictMath.class.getDeclaredMethod(name, double.class).getModifiers())) { + return false; + } + } + return true; + } catch (NoSuchMethodException e) { + throw new AssertionError("StrictMath.sin/cos/tan(double) must exist", e); + } + } + + private static String strictMathImplementation() { + return (STRICT_TRIG_IS_PURE_JAVA ? "pure Java (JDK 21+ FdLibm port)" : "native JNI fdlibm") + + " on " + System.getProperty("java.vm.name") + " " + + System.getProperty("java.version") + " / " + System.getProperty("os.arch"); + } + + @BeforeClass + public static void resolveBean() { + java.lang.management.ThreadMXBean plain = ManagementFactory.getThreadMXBean(); + Assume.assumeTrue("com.sun.management.ThreadMXBean is required to measure allocation", + plain instanceof ThreadMXBean); + bean = (ThreadMXBean) plain; + Assume.assumeTrue("thread allocated memory is not supported on this JVM", + bean.isThreadAllocatedMemorySupported()); + bean.setThreadAllocatedMemoryEnabled(true); + } + + @Test + public void clenshaw6ConvertAllocatesNothing() { + Clenshaw6 c = Clenshaw6.forConversion(0.0016792203863837047, + AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING); + double perOp = 0.0; + for (int round = 0; round < 4; round++) { + perOp = measureConvert(c); + } + System.out.printf("Clenshaw6.convert(zeta), FastStrictTrig: %.2f B/op over %d calls%n", + perOp, N); + assertEquals("Clenshaw6.convert must not allocate; before this change it was 64.00 B/op, " + + "two FdLibm double[2] argument-reduction carriers", 0.0, perOp, 0.0); + } + + /** + * The multi-word reduction path too, where {@code StrictMath} cost 1392.00 B/op — 2 x 696, the + * {@code int[20]} plus three {@code double[20]} of {@code __kernel_rem_pio2}. Unreachable for + * any angle a coordinate transform produces, but it is where a {@code Scratch}-less + * implementation would have had to allocate, so it is the assertion that shows the + * thread-local {@code Scratch} really is reused rather than re-created. + */ + @Test + public void theMultiWordReductionPathAllocatesNothingEither() { + Clenshaw6 c = Clenshaw6.forConversion(0.0016792203863837047, + AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING); + double perOp = 0.0; + for (int round = 0; round < 4; round++) { + perOp = measure(c, 1e10, 1e10 + 1e4); + } + System.out.printf("Clenshaw6.convert(zeta), |zeta| > 1647099: %.2f B/op%n", perOp); + assertEquals("the multi-word path must reuse its Scratch; StrictMath cost 1392.00 B/op " + + "here", 0.0, perOp, 0.0); + } + + /** + * The pre-change and post-change forms of the same loop, side by side. The + * post-change figure is asserted, because that is proj4j's own code and the + * deliverable; the {@code StrictMath} figure is measured and printed as an observation, since + * what it costs is a property of the JDK. Runs on every JDK. + */ + @Test + public void theAbAgainstTheStrictMathFormIsMeasuredAndFastStrictTrigIsFree() { + Clenshaw6 c = Clenshaw6.forConversion(0.0016792203863837047, + AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING); + double fast = 0.0; + double strict = 0.0; + for (int round = 0; round < 4; round++) { + fast = measureConvert(c); + strict = measureStrictMathConvert(c); + } + System.out.printf("Clenshaw6.convert(zeta): FastStrictTrig %.2f B/op, StrictMath %.2f " + + "B/op (= %.1f MB per 100k-vertex geometry); StrictMath here is %s%n", + fast, strict, strict * 1e5 / 1e6, strictMathImplementation()); + assertEquals("Clenshaw6.convert must not allocate, whatever StrictMath happens to cost on " + + "this JDK", 0.0, fast, 0.0); + } + + /** + * The comparison the 0 B/op figure is worth something against: the same loop with + * {@code StrictMath}, which is what the pre-change source called. + * + *

Skipped, with the reason printed, on a JVM whose {@code StrictMath.sin/cos/tan} are + * native -- every JDK up to and including 17, where there is no Java carrier to allocate and + * so no premise to test. See the class javadoc. On JDK 21+ the assertion is live: the guard is + * nativeness, not the measurement, so a pure-Java {@code StrictMath} that stopped allocating + * would still be caught here. + */ + @Test + public void theStrictMathFormStillAllocates() { + if (!STRICT_TRIG_IS_PURE_JAVA) { + String why = "StrictMath allocation premise: this JVM's StrictMath.sin/cos/tan are " + + strictMathImplementation() + ". A native implementation allocates no Java " + + "object, so it necessarily measures 0 B/op. Clenshaw6.convert's own 0 B/op " + + "is asserted unconditionally by clenshaw6ConvertAllocatesNothing, and the " + + "instrument's ability to see an allocation at all by " + + "theInstrumentCanSeeAllocation."; + System.out.println("[Clenshaw6] [SKIP] " + why); + Assume.assumeTrue(why, false); + } + + Clenshaw6 c = Clenshaw6.forConversion(0.0016792203863837047, + AuxLat.GEOGRAPHIC, AuxLat.RECTIFYING); + double fast = 0.0; + double strict = 0.0; + for (int round = 0; round < 4; round++) { + fast = measureConvert(c); + strict = measureStrictMathConvert(c); + } + assertTrue("StrictMath.sin/cos no longer allocate on this JDK (" + strict + " B/op) even " + + "though its implementation is " + strictMathImplementation() + ", so " + + "FastStrictTrig buys nothing here and the re-point can be reconsidered -- but " + + "note it still buys determinism, which is a separate argument", strict > fast); + } + + /** + * The positive control. An allocation counter that reported zero for + * everything would make every {@code 0.00 B/op} in this class clean, plausible and worthless. + * This runs two loops whose allocation is known by construction -- one {@code double[2]} per + * call and four -- through {@link #measureRaw}, the same read-loop-read shape the real + * measurements use, and requires the counter to see them and to scale with them. + * + *

This, not "{@code StrictMath} must allocate", is what makes the 0.00 non-vacuous. The old + * premise was a claim about a third party's implementation and is false on every JDK before 21; + * this is a claim about the instrument, holds on every JDK, and is the thing that actually + * needed proving. + * + *

The bounds are loose on purpose -- 32 B is a 16-byte array header plus two doubles, but + * header layout is a VM detail, so the floor is 16 B/op and the scaling requirement is 3x + * rather than exactly 4x. + */ + @Test + public void theInstrumentCanSeeAllocation() { + double one = 0.0; + double four = 0.0; + for (int round = 0; round < 2; round++) { + one = measureRaw(1); + four = measureRaw(4); + } + System.out.printf("Clenshaw6 control: one double[2]/op = %.2f B/op, four = %.2f B/op%n", + one, four); + assertTrue("the allocation counter cannot see a double[2] allocated on every one of " + N + + " iterations -- it measured " + one + " B/op, so the 0.00 B/op this class " + + "reports elsewhere would be an artefact of a blind instrument", one >= 16.0); + assertTrue("the allocation counter is not quantitative: four arrays per op measured " + + four + " B/op against " + one + " for one", four >= 3.0 * one); + } + + /** Allocates {@code arrays} escaping {@code double[2]} per iteration and measures the cost. */ + private static double measureRaw(int arrays) { + long tid = Thread.currentThread().getId(); + long before = bean.getThreadAllocatedBytes(tid); + double acc = 0.0; + for (int i = 0; i < N; i++) { + for (int k = 0; k < arrays; k++) { + double[] carrier = new double[2]; + carrier[0] = i + k; + objectSink = carrier; + acc += carrier[0]; + } + } + long after = bean.getThreadAllocatedBytes(tid); + sink += acc; + return (after - before) / (double) N; + } + + /** Steady-state B/op of {@code convert(zeta)} as this tree implements it. */ + private static double measureConvert(Clenshaw6 c) { + long tid = Thread.currentThread().getId(); + long before = bean.getThreadAllocatedBytes(tid); + double acc = 0.0; + for (int i = 0; i < N; i++) { + acc += c.convert(zeta(i)); + } + long after = bean.getThreadAllocatedBytes(tid); + sink += acc; + return (after - before) / (double) N; + } + + /** As {@link #measureConvert}, over an explicit argument range. */ + private static double measure(Clenshaw6 c, double lo, double hi) { + long tid = Thread.currentThread().getId(); + double span = hi - lo; + long before = bean.getThreadAllocatedBytes(tid); + double acc = 0.0; + for (int i = 0; i < N; i++) { + acc += c.convert(lo + span * ((i % 1000003) / 1000003.0)); + } + long after = bean.getThreadAllocatedBytes(tid); + sink += acc; + return (after - before) / (double) N; + } + + /** + * The pre-change body, verbatim: {@code convert(zeta, StrictMath.sin(zeta), + * StrictMath.cos(zeta))}. Both loops do identical arithmetic, so the difference between them + * is the allocation and nothing else. + */ + private static double measureStrictMathConvert(Clenshaw6 c) { + long tid = Thread.currentThread().getId(); + long before = bean.getThreadAllocatedBytes(tid); + double acc = 0.0; + for (int i = 0; i < N; i++) { + double z = zeta(i); + acc += c.convert(z, StrictMath.sin(z), StrictMath.cos(z)); + } + long after = bean.getThreadAllocatedBytes(tid); + sink += acc; + return (after - before) / (double) N; + } + + /** + * Uniform on {@code [-pi, pi]}, so three quarters of the calls take fdlibm's argument + * reduction. Confining the sweep to {@code |x| <= pi/4} would measure the cheapest tier and + * report 32 B/op for a workload that really costs more. + */ + private static double zeta(int i) { + return (i % 3141593) * 2e-6 - Math.PI; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointBitIdentityTest.java b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointBitIdentityTest.java new file mode 100644 index 0000000..77bb1e9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointBitIdentityTest.java @@ -0,0 +1,280 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig.repoint; + +import org.junit.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +/** + * The end-to-end half of the proof that re-pointing 50 {@code StrictMath.sin/cos/tan} call sites + * to {@link org.locationtech.proj4j.util.FastStrictTrig} moved no bit of output. + * + *

Why a digest, and why these numbers can be trusted

+ * + *

Each expected digest below is a SHA-256 over the concatenated {@code doubleToRawLongBits} of + * every {@code double} one code path produced, and every one was captured by running + * {@link RepointDump} against the tree as it stood before the re-point — a frozen copy at + * {@code 7362c85}, compiled separately, with the ten changed files being the only difference + * between the two builds. So this is a genuine before/after comparison that survives the change, + * not a formula that agrees with the implementation by construction. Non-negotiable 4 of the + * upgrade notes, and the rule against re-pinning a reference from proj4j's own current output, + * both point at exactly this distinction. + * + *

Why raw bits, and why a digest is enough

+ * + *

{@code ==} is not the test: it calls {@code -0.0} equal to {@code 0.0} and every {@code NaN} + * unequal to itself, and a tolerance would defeat the point — the entire justification for + * treating this change as risk-free is that nothing can cross a {@code gie} bar in either + * direction, which is only true if no bit moved. A single flipped bit anywhere in the + * 1,654,464 values changes the digest. + * + *

The count after the {@code /} is part of the assertion. Without it, a path that started + * throwing on the first point would produce a short, stable, wrong digest; with it, the failure + * message says how many values were compared. + * + *

What is covered

+ * + * + * + * + * + * + * + * + * + *
call sites reached by each pinned path
pathsites
{@code clenshaw6}{@code Clenshaw6:170} {@code convert(zeta)}, + * {@code :190-191} {@code convertSinCos} — the highest-traffic trig in the library, + * reached from {@code utm tmerc lcc cass poly aea laea}
{@code conformalLat}{@code ConformalLat:203, 240, 241, 259}
{@code authalicLat}{@code AuthalicLat:196, 224, 227, 228} — the last three + * only via the non-series branch, so two high-{@code n} ellipsoids are included + * deliberately
the eight projection specsall 31 sites in {@code Spilhaus}, + * {@code AdamsWorldInASquareI/II}, {@code AdamsHemisphere}, {@code Guyou}, + * {@code PeirceQuincuncial} and {@code Adams} ({@code ellipticTail})
{@code lsatForward}no re-pointed site; pinned to show that adding + * {@code LandsatProjection.projectInverse} disturbed the forward not at all
+ * + *

The one re-pin, and exactly what it costs

+ * + *

Five of the twelve digests were re-pinned once, when {@code Projection}'s inverse stopped + * dividing the projected ordinate by {@code totalScale} and started multiplying it + * by the reciprocal, which is what {@code 9.8.1:src/inv.cpp:85-93} does + * ({@code coo.xyz.x *= P->ra;}, with a comment upstream explaining the choice). The two are not the + * same number: + * + *

+ * -20037508.342789244 / 6378137           = -pi - 1 ulp   ->  atan2 gives  +pi
+ * -20037508.342789244 * (1.0 / 6378137)   = exactly -pi    ->  atan2 gives  -pi
+ * 
+ * + *

The five are {@code spilhaus} (both specs), {@code adams_ws2} and {@code peirce_q} (both + * shapes). Seven paths — {@code clenshaw6}, {@code conformalLat}, {@code authalicLat}, + * {@code adams_ws1}, {@code adams_hemi}, {@code guyou}, {@code lsatForward} — are still the + * original {@code 7362c85} values, and the total value count is still 1,654,464, so no path stopped + * producing values. + * + *

What the movement was checked against, before it was pinned

+ * + *

Re-pinning a guard from our own output is how it stops meaning anything, so the new values were + * verified against PROJ 9.8.1 first — the installed {@code proj} and {@code cs2cs}, both + * reporting Rel. 9.8.1, April 10th, 2026 — and not against a previous Proj4J build. + * + *

The decisive case is qualitative and unambiguous. {@code cs2cs EPSG:3857 EPSG:4055} at + * {@code -20037508.342789244 0} gives longitude {@code -180}. Proj4J gave {@code +180.0} before and + * gives {@code -180.0} after, bit-exactly. Separately, {@code proj -I -f "%.17g" +proj=merc + * +a=6378137 +b=6378137} on the same easting prints exactly {@code -180}, which is itself + * evidence that upstream multiplies: the divide is {@code -pi - 1 ulp}, which in degrees is + * {@code -180.00000000000003} and would have printed as such. + * + *

The bulk movement was checked for an accuracy regression, not just for a sign. For each + * of the five specs, every graticule point whose inverse bits moved was re-run through + * {@code proj -I -f "%.17g"} on the same proj-string, restricted to the well-conditioned subset + * ({@code |input latitude| <= 84}, since near the poles these inverses amplify a 1-ulp input change + * by seven orders of magnitude in either direction, and a win/loss count there measures conditioning + * rather than accuracy). Both sides of the comparison are geographic, so the metric is angular + * — degrees of the geographic output, where {@code 1e-13} deg is about {@code 1.1e-8} m: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
agreement with {@code proj} 9.8.1, well-conditioned points, degrees
specmovedafter closerbefore closermax |Δ| aftermax |Δ| before
{@code spilhaus +ellps=WGS84}3,4171,7461,6081.680e-91.397e-9
{@code spilhaus +R=6371000}4252291862.753e-112.758e-11
{@code adams_ws2}4,4102,2422,0621.555e-93.807e-9
{@code peirce_q} square3,9572,1091,7195.526e-95.526e-9
{@code peirce_q} diamond3,8741,9941,7486.277e-106.286e-10
total8,3207,323ties: 440
+ * + *

So: the after value is closer to {@code proj} 9.8.1 more often than the before value in + * every one of the five specs; the largest deviation is unchanged or improved in four of + * five ({@code adams_ws2} improves 2.4×) and grows by 0.28 nanodegrees — about 0.03 mm + * — in {@code spilhaus +ellps=WGS84}; and the whole movement is bounded by + * {@code 3.8e-9} deg, i.e. it is an ulp-level reshuffle. Nothing crosses a {@code gie} bar, which + * the corpus confirms independently: 0 fail→pass and 0 pass→fail across all 7,851 + * measured assertions. + * + * @see RepointedSiteDomainTest for the per-site half of the proof + */ +public class RepointBitIdentityTest { + + /** + * The pinned digests: seven still at {@code 7362c85}, five re-pinned once, for a reason recorded + * below. Do not regenerate these from the current tree wholesale — that would make them + * agree with whatever the code does today, which is the one thing this file must not do. + */ + private static final Map BEFORE = new LinkedHashMap(); + + /** + * The keys whose digest is no longer the {@code 7362c85} value, so that + * {@link #sevenOfTheTwelvePathsAreStillTheOriginalPreRepointDigests()} can say how much of the + * original claim survives. + */ + private static final int REPINNED = 5; + + static { + // --- still the original pre-re-point digests, captured at 7362c85 ------------------- + BEFORE.put("clenshaw6", + "bc3602656e97948a98cb906e058404e87e892f6fb50e96ca95d61f2113b9c0ab/1036944"); + BEFORE.put("conformalLat", + "867fe1d432e19ce5284b3c1c808cb409ebc3d14338ffe383de69e1eedd5eba14/270015"); + BEFORE.put("authalicLat", + "4a6b9b6a8bb6fe32104744829ab11c4b263dbadc52fc1d021e04b955c598fa8b/144012"); + BEFORE.put("+proj=adams_ws1 +ellps=WGS84", + "870f7595f543ce5fcaa2ed5967e08a30aef89f4cdc9c62bb5b0af298f79b1caf/22143"); + BEFORE.put("+proj=adams_hemi +ellps=WGS84", + "6a220a3953f140084c5b6f2cbe926c27fc90efa91e5daab1451a4575464c8b8c/14701"); + BEFORE.put("+proj=guyou +ellps=WGS84", + "6c9c71ef8754432d21110223cc798a4edabd70d788005d14368489475a613887/14701"); + BEFORE.put("lsatForward", + "096426eaa8f948e6bbee241bb96d6b2c7102c0114b280103f053ca53148d1181/4818"); + + // --- re-pinned once, for the `*= ra` change. See "The one re-pin" in the class javadoc --- + BEFORE.put("+proj=spilhaus +ellps=WGS84", + "a7a24db7afce579c08ac7d3d1fa7b1f3c8637be74823dfada1390da79f1c385f/29524"); + BEFORE.put("+proj=spilhaus +R=6371000", + "1cd19930c620e2a8baced1674337dac13475a484b0b98215eef04aec9e4b7146/29524"); + BEFORE.put("+proj=adams_ws2 +ellps=WGS84", + "6a1ed7251c2e285e171ede6cb8062c91d6b50ce625d9bd73320bb880fe0a5efa/29478"); + BEFORE.put("+proj=peirce_q +ellps=WGS84 +lat_0=90 +shape=square", + "4f9282f7bb96bd938b362cd4666575409ef43cffb305fcffbb16f781bb341ec3/29502"); + BEFORE.put("+proj=peirce_q +ellps=WGS84 +lat_0=90 +shape=diamond", + "02bc333404bcf8230c03ac99c56bfb04067d15a938a906b60450d629d6f3faf5/29102"); + } + + /** + * The {@code 7362c85} digests of the five re-pinned paths, kept so the old and the new values + * are both on the record and the re-pin is auditable rather than merely asserted. + */ + private static final Map SUPERSEDED = new LinkedHashMap(); + + static { + SUPERSEDED.put("+proj=spilhaus +ellps=WGS84", + "81c17f244ecbd40f885612bd03161c8c48e6f9e77a927de248e50fda1736d127/29524"); + SUPERSEDED.put("+proj=spilhaus +R=6371000", + "3f83ecaa09ba2db57ce274e47f1fadef45d7a2d807899c36186f4602612bf6ca/29524"); + SUPERSEDED.put("+proj=adams_ws2 +ellps=WGS84", + "de87c02694de88d39ef49bfefb741a4cc4a76cea68bdce93a716cc731af98fad/29478"); + SUPERSEDED.put("+proj=peirce_q +ellps=WGS84 +lat_0=90 +shape=square", + "550cff4c8c3b7350d8e01dfbb044e5cdaa1143acbc9b89769e1594a224625b2f/29502"); + SUPERSEDED.put("+proj=peirce_q +ellps=WGS84 +lat_0=90 +shape=diamond", + "02a2df36b000e8f783a5ab66bdba05185d8d3803aa3a897547d8c5fd177855fb/29102"); + } + + /** The total the twelve counts add up to, restated so a silent drop is visible. */ + private static final int TOTAL_VALUES = 1654464; + + @Test + public void everyRepointedPathIsBitwiseUnchanged() { + Map now = RepointDump.digests(); + assertEquals("the set of pinned paths changed", BEFORE.keySet(), now.keySet()); + StringBuilder moved = new StringBuilder(); + for (Map.Entry e : BEFORE.entrySet()) { + String actual = now.get(e.getKey()); + if (!e.getValue().equals(actual)) { + moved.append("\n ").append(e.getKey()) + .append("\n before (7362c85): ").append(e.getValue()) + .append("\n now : ").append(actual); + } + } + if (moved.length() != 0) { + throw new AssertionError("these pinned paths moved. Seven of the twelve digests are the " + + "pre-re-point values from 7362c85; the five spilhaus/adams_ws2/peirce_q " + + "digests were re-pinned once for Projection's inverse `*= 1/totalScale` " + + "change (9.8.1:src/inv.cpp:85-93), after verifying the new values against the " + + "installed proj/cs2cs 9.8.1. Anything moving now is unaccounted for -- do NOT " + + "re-pin from this build's own output without the same verification:" + moved); + } + } + + /** + * Says out loud how much of the original pre-re-point claim is still standing, so that a second + * re-pin cannot quietly erode the file until every digest agrees with the current build by + * construction. If this number drops, the guard has stopped being a before/after comparison and + * that has to be a deliberate, visible decision. + */ + @Test + public void sevenOfTheTwelvePathsAreStillTheOriginalPreRepointDigests() { + assertEquals("the number of re-pinned paths changed", REPINNED, SUPERSEDED.size()); + assertEquals("the pinned set changed size", 12, BEFORE.size()); + for (Map.Entry e : SUPERSEDED.entrySet()) { + String current = BEFORE.get(e.getKey()); + if (e.getValue().equals(current)) { + throw new AssertionError("SUPERSEDED and BEFORE agree for " + e.getKey() + + ", so the superseded value is not superseded and this record is a lie"); + } + } + for (String key : SUPERSEDED.keySet()) { + if (!BEFORE.containsKey(key)) { + throw new AssertionError("superseded key " + key + " is no longer pinned at all"); + } + } + } + + /** + * The superseded digests must not match the current build either — if one did, the re-pin + * was unnecessary and the record above is wrong about what moved. A cheap consistency check on + * the audit trail itself. + */ + @Test + public void theSupersededDigestsNoLongerDescribeThisBuild() { + Map now = RepointDump.digests(); + for (Map.Entry e : SUPERSEDED.entrySet()) { + assertFalse("the 7362c85 digest for " + e.getKey() + " still matches this build, so it" + + " never moved and should not have been re-pinned", + e.getValue().equals(now.get(e.getKey()))); + } + } + + @Test + public void theDigestsCoverTheNumberOfValuesClaimed() { + int total = 0; + for (String d : RepointDump.digests().values()) { + total += Integer.parseInt(d.substring(d.indexOf('/') + 1)); + } + assertEquals("a path stopped producing values, which would make its digest stable " + + "and meaningless", TOTAL_VALUES, total); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointDump.java b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointDump.java new file mode 100644 index 0000000..e5f3097 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointDump.java @@ -0,0 +1,280 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig.repoint; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.ProjCoordinate; +import org.locationtech.proj4j.proj.Projection; +import org.locationtech.proj4j.util.AuthalicLat; +import org.locationtech.proj4j.util.AuxLat; +import org.locationtech.proj4j.util.Clenshaw6; +import org.locationtech.proj4j.util.ConformalLat; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Produces a deterministic dump of the raw bit patterns of every value reachable through + * a call site that the {@code StrictMath} → {@code FastStrictTrig} re-point touched, reduced + * to one SHA-256 per code path. + * + *

The digests are the mechanism by which + * {@link RepointBitIdentityTest} makes a before/after claim that outlives the change: they were + * captured by compiling and running this exact class against the tree as it stood before + * the re-point, in a frozen {@code /tmp} copy, and are pinned as constants there. Nothing in this + * package computes an expected value from a formula, so nothing here can agree with the + * implementation by construction. + * + *

Only {@code Double.doubleToRawLongBits} is used. {@code ==} would call {@code -0.0} equal to + * {@code 0.0} and every {@code NaN} unequal to itself, and a tolerance would defeat the purpose: + * the whole justification for this change being risk-free is that it moves no bit, so the test + * has to be able to see a single bit move. + */ +final class RepointDump { + + private RepointDump() { + } + + /** The eight projection specifications whose kernels contain a re-pointed site. */ + static final String[] PROJECTION_SPECS = { + "+proj=spilhaus +ellps=WGS84", + "+proj=spilhaus +R=6371000", + "+proj=adams_ws1 +ellps=WGS84", + "+proj=adams_ws2 +ellps=WGS84", + "+proj=adams_hemi +ellps=WGS84", + "+proj=guyou +ellps=WGS84", + "+proj=peirce_q +ellps=WGS84 +lat_0=90 +shape=square", + "+proj=peirce_q +ellps=WGS84 +lat_0=90 +shape=diamond", + }; + + /** + * Every code path, keyed by a stable tag. The values are SHA-256 hex digests over the + * concatenated raw-bit hex of every {@code double} the path produced. + * + * @return an insertion-ordered map from tag to digest + */ + static Map digests() { + Map out = new LinkedHashMap(); + out.put("clenshaw6", clenshaw6()); + out.put("conformalLat", conformalLat()); + out.put("authalicLat", authalicLat()); + for (String spec : PROJECTION_SPECS) { + out.put(spec, projection(spec)); + } + out.put("lsatForward", lsatForward()); + return out; + } + + // ------------------------------------------------------------------ + // Clenshaw6: convert(double) at :170 and convertSinCos at :190-191 + // ------------------------------------------------------------------ + + private static String clenshaw6() { + Sink sink = new Sink(); + double[] ns = {0.0016792203863837047, 0.0, 0.005, 0.05, -0.05, 0.2}; + double[] scratch = new double[2]; + for (double n : ns) { + for (int in = 0; in < AuxLat.NUMBER; in++) { + for (int o = 0; o < AuxLat.NUMBER; o++) { + if (in == o) { + continue; + } + Clenshaw6 c; + try { + c = Clenshaw6.forConversion(n, in, o); + } catch (RuntimeException e) { + continue; // conversion not tabulated + } + for (int i = -3600; i <= 3600; i++) { + double zeta = i * (Math.PI / 3600.0); // spans [-pi, pi] + sink.add(c.convert(zeta)); + c.convertSinCos(StrictMath.sin(zeta), StrictMath.cos(zeta), scratch); + sink.add(scratch[0]); + sink.add(scratch[1]); + } + } + } + } + return sink.digest(); + } + + // ------------------------------------------------------------------ + // ConformalLat: tsfn at :203, conformalLat at :240-241, inverse at :259 + // ------------------------------------------------------------------ + + private static String conformalLat() { + Sink sink = new Sink(); + double[] squaredEccentricities = {0.0, 0.00669438002290, 0.0066943799901413165, 0.2, 0.9}; + for (double es : squaredEccentricities) { + double e = Math.sqrt(es); + for (int i = -9000; i <= 9000; i++) { + double phi = i * (Math.PI / 18000.0); // spans [-pi/2, pi/2] + sink.add(ConformalLat.tsfn(phi, StrictMath.sin(phi), e)); + sink.add(ConformalLat.conformalLat(phi, e)); + try { + sink.add(ConformalLat.conformalLatInverse(phi, e)); + } catch (RuntimeException ex) { + sink.addToken(ex.getClass().getName()); + } + } + } + return sink.digest(); + } + + // ------------------------------------------------------------------ + // AuthalicLat: forward(double) at :196, inverse's Newton fallback at :224-228 + // ------------------------------------------------------------------ + + private static String authalicLat() { + Sink sink = new Sink(); + // 0.00669438 gives n ~ 0.00168, the series branch; 0.5 and 0.9 force the Newton loop, + // which is the only way the :224-228 sites are ever reached. + double[] squaredEccentricities = {0.00669438002290, 0.05, 0.5, 0.9}; + for (double es : squaredEccentricities) { + AuthalicLat al = new AuthalicLat(es); + sink.addToken("seriesValid=" + al.isSeriesValid()); + for (int i = -9000; i <= 9000; i++) { + double phi = i * (Math.PI / 18000.0); + sink.add(al.forward(phi)); + sink.add(al.inverse(phi)); + } + } + return sink.digest(); + } + + // ------------------------------------------------------------------ + // The seven projections, forward and inverse, over a 3-degree graticule + // ------------------------------------------------------------------ + + private static String projection(String spec) { + Sink sink = new Sink(); + Projection p; + try { + p = new CRSFactory().createFromParameters("t", spec).getProjection(); + } catch (RuntimeException e) { + sink.addToken("crsFailed:" + e.getClass().getName()); + return sink.digest(); + } + ProjCoordinate src = new ProjCoordinate(); + ProjCoordinate dst = new ProjCoordinate(); + ProjCoordinate back = new ProjCoordinate(); + for (int ilon = -180; ilon <= 180; ilon += 3) { + for (int ilat = -90; ilat <= 90; ilat += 3) { + src.x = ilon + 0.37; + src.y = Math.max(-90.0, Math.min(90.0, ilat + 0.11)); + try { + p.project(src, dst); + } catch (RuntimeException e) { + sink.addToken("fwd:" + e.getClass().getName()); + continue; + } + sink.add(dst.x); + sink.add(dst.y); + try { + p.inverseProject(dst, back); + } catch (RuntimeException e) { + sink.addToken("inv:" + e.getClass().getName()); + continue; + } + sink.add(back.x); + sink.add(back.y); + } + } + return sink.digest(); + } + + // ------------------------------------------------------------------ + // lsat forward -- no re-pointed site of its own, but it shares nothing with the new + // inverse either, so pinning it is what proves the inverse was added without disturbing it. + // ------------------------------------------------------------------ + + private static String lsatForward() { + Sink sink = new Sink(); + Projection p; + try { + p = new CRSFactory().createFromParameters("t", "+proj=lsat +ellps=GRS80") + .getProjection(); + } catch (RuntimeException e) { + sink.addToken("crsFailed:" + e.getClass().getName()); + return sink.digest(); + } + ProjCoordinate src = new ProjCoordinate(); + ProjCoordinate dst = new ProjCoordinate(); + for (int ilon = -180; ilon <= 180; ilon += 5) { + for (int ilat = -80; ilat <= 80; ilat += 5) { + src.x = ilon; + src.y = ilat; + try { + p.project(src, dst); + } catch (RuntimeException e) { + sink.addToken("fwd:" + e.getClass().getName()); + continue; + } + sink.add(dst.x); + sink.add(dst.y); + } + } + return sink.digest(); + } + + // ------------------------------------------------------------------ + + /** Accumulates raw bit patterns into a SHA-256. */ + private static final class Sink { + + private final MessageDigest md; + private int count; + + Sink() { + try { + md = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("SHA-256 is required of every JRE", e); + } + } + + void add(double v) { + long bits = Double.doubleToRawLongBits(v); + for (int i = 56; i >= 0; i -= 8) { + md.update((byte) (bits >>> i)); + } + count++; + } + + void addToken(String s) { + try { + md.update(s.getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException("UTF-8 is required of every JRE", e); + } + count++; + } + + String digest() { + byte[] d = md.digest(); + StringBuilder sb = new StringBuilder(64); + for (byte b : d) { + sb.append(Character.forDigit((b >> 4) & 0xf, 16)); + sb.append(Character.forDigit(b & 0xf, 16)); + } + return sb.append('/').append(count).toString(); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointedSiteDomainTest.java b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointedSiteDomainTest.java new file mode 100644 index 0000000..78230ee --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/util/trig/repoint/RepointedSiteDomainTest.java @@ -0,0 +1,390 @@ +/******************************************************************************* + * Copyright 2026 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +package org.locationtech.proj4j.util.trig.repoint; + +import org.junit.Test; +import org.locationtech.proj4j.util.AuthalicLat; +import org.locationtech.proj4j.util.AuxLat; +import org.locationtech.proj4j.util.Clenshaw6; +import org.locationtech.proj4j.util.ConformalLat; +import org.locationtech.proj4j.util.FastStrictTrig; +import org.locationtech.proj4j.util.MathHelpers; + +import java.util.Random; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * The per-site half of the proof that the {@code StrictMath} → {@link FastStrictTrig} + * re-point moved no bit. {@link RepointBitIdentityTest} pins whole code paths against digests + * captured from the pre-change build; this class works the other way round, enumerating each of + * the 50 individual calls across 42 lines in 10 files and asserting bit identity + * over the argument domain that particular site actually sees. + * + *

Both halves are needed. The digests prove the composed result is unchanged but say nothing + * about which sites were exercised; the table below names every site, so a site that some future + * refactor makes unreachable is still asserted, and the inventory itself is checkable against + * {@code grep}. + * + *

The inventory

+ * + *

A survey circulated during this change reported 39 {@code StrictMath.sin/cos/tan} + * call sites. {@code grep -rn 'StrictMath\.\(sin\|cos\|tan\)('} over + * {@code core/src/main/java} found 53 occurrences: 3 in prose (one in + * {@code AdamsProjection}'s class comment, two in {@code FastStrictTrig}'s own Javadoc) and + * 50 real calls, on 42 source lines, because eight lines carry two calls each. The + * report undercounted by 11; the per-file breakdown is in {@link #SITES}. + * + *

Method

+ * + *

For each site: sweep the site's argument domain, and require + * {@code doubleToRawLongBits(FastStrictTrig.f(x)) == doubleToRawLongBits(StrictMath.f(x))}. Raw + * bits, not {@code ==} — which would call {@code -0.0} equal to {@code 0.0} and every {@code NaN} + * unequal to itself — and not a tolerance, because the claim being tested is exactly that no bit + * moved. + * + *

{@link #theTestIsNotVacuous} is the control: {@code Math.sin} differs from + * {@code StrictMath.sin} in raw bits on about 7% of arguments over {@code [-4pi, 4pi]}, so a + * comparison that could not see a last-bit difference would fail that test instead of passing + * everything. + */ +public class RepointedSiteDomainTest { + + // ------------------------------------------------------------------ + // Argument domains, named for what the site feeds the function + // ------------------------------------------------------------------ + + /** Longitude or a full-circle angle: {@code [-pi, pi]}. Three quarters take the reduction. */ + private static final int LON = 0; + /** Latitude or a colatitude-like angle: {@code [-pi/2, pi/2]}. */ + private static final int LAT = 1; + /** A halved longitude, {@code 0.5 * lam}: {@code [-pi/2, pi/2]}, densely sampled. */ + private static final int HALF_LON = 2; + /** A halved latitude, {@code 0.5 * phi}: {@code [-pi/4, pi/4]} — the no-reduction tier. */ + private static final int HALF_LAT = 3; + /** A sum or difference of two reduced angles, as {@code ellipticTail} forms: {@code [-pi, pi]}. */ + private static final int ANGLE_SUM = 4; + /** A small correction, as {@code Clenshaw6.delta} returns: down to subnormal. */ + private static final int SMALL = 5; + /** Anything at all, including past {@code 2^19 * (pi/2)} and the non-finite specials. */ + private static final int ANY = 6; + + private static final int SIN = 0; + private static final int COS = 1; + private static final int TAN = 2; + + /** One row per call, {@code file:line function domain}. */ + private static final Object[][] SITES = { + // --- util/Clenshaw6.java, 4 calls on 3 lines ------------------------------------ + {"util/Clenshaw6.java:170 convert(zeta)", SIN, LON}, + {"util/Clenshaw6.java:170 convert(zeta)", COS, LON}, + {"util/Clenshaw6.java:190 convertSinCos", SIN, SMALL}, + {"util/Clenshaw6.java:191 convertSinCos", COS, SMALL}, + + // --- util/ConformalLat.java, 4 calls on 4 lines --------------------------------- + {"util/ConformalLat.java:203 tsfn", COS, LAT}, + {"util/ConformalLat.java:240 conformalLat", SIN, LAT}, + {"util/ConformalLat.java:241 conformalLat", COS, LAT}, + {"util/ConformalLat.java:259 conformalLatInverse", TAN, LAT}, + + // --- util/AuthalicLat.java, 5 calls on 4 lines ---------------------------------- + {"util/AuthalicLat.java:196 forward(phi)", SIN, LAT}, + {"util/AuthalicLat.java:196 forward(phi)", COS, LAT}, + {"util/AuthalicLat.java:224 inverse", SIN, LAT}, + {"util/AuthalicLat.java:227 inverse Newton", SIN, LAT}, + {"util/AuthalicLat.java:228 inverse Newton", COS, LAT}, + + // --- proj/SpilhausProjection.java, 19 calls on 16 lines ------------------------- + {"proj/SpilhausProjection.java:161 initialize", COS, LON}, + {"proj/SpilhausProjection.java:162 initialize", SIN, LON}, + {"proj/SpilhausProjection.java:165 initialize", COS, LAT}, + {"proj/SpilhausProjection.java:165 initialize", COS, LON}, + {"proj/SpilhausProjection.java:167 initialize", TAN, LON}, + {"proj/SpilhausProjection.java:167 initialize", SIN, LAT}, + {"proj/SpilhausProjection.java:168 initialize", SIN, LON}, + {"proj/SpilhausProjection.java:168 initialize", TAN, LAT}, + {"proj/SpilhausProjection.java:170 initialize", SIN, LAT}, + {"proj/SpilhausProjection.java:171 initialize", COS, LAT}, + {"proj/SpilhausProjection.java:173 initialize", COS, LAT}, + {"proj/SpilhausProjection.java:190 project", COS, LAT}, + {"proj/SpilhausProjection.java:191 project", SIN, LAT}, + {"proj/SpilhausProjection.java:193 project", COS, LON}, + {"proj/SpilhausProjection.java:194 project", SIN, LON}, + {"proj/SpilhausProjection.java:237 project", COS, LAT}, + {"proj/SpilhausProjection.java:238 project", SIN, LAT}, + {"proj/SpilhausProjection.java:239 project", COS, LON}, + {"proj/SpilhausProjection.java:240 project", SIN, LON}, + + // --- proj/AdamsWorldInASquareIProjection.java, 3 calls on 2 lines --------------- + {"proj/AdamsWorldInASquareIProjection.java:46 project", TAN, HALF_LAT}, + {"proj/AdamsWorldInASquareIProjection.java:47 project", COS, LAT}, + {"proj/AdamsWorldInASquareIProjection.java:47 project", SIN, HALF_LON}, + + // --- proj/AdamsWorldInASquareIIProjection.java, 4 calls on 3 lines -------------- + {"proj/AdamsWorldInASquareIIProjection.java:84 project", TAN, HALF_LAT}, + {"proj/AdamsWorldInASquareIIProjection.java:85 project", COS, LAT}, + {"proj/AdamsWorldInASquareIIProjection.java:85 project", SIN, HALF_LON}, + {"proj/AdamsWorldInASquareIIProjection.java:101 inverse seed", COS, LAT}, + + // --- proj/AdamsHemisphereProjection.java, 3 calls on 2 lines -------------------- + {"proj/AdamsHemisphereProjection.java:49 project", SIN, LAT}, + {"proj/AdamsHemisphereProjection.java:54 project", COS, LAT}, + {"proj/AdamsHemisphereProjection.java:54 project", SIN, LON}, + + // --- proj/GuyouProjection.java, 3 calls on 3 lines ------------------------------ + {"proj/GuyouProjection.java:65 project", SIN, LON}, + {"proj/GuyouProjection.java:66 project", SIN, LAT}, + {"proj/GuyouProjection.java:67 project", COS, LAT}, + + // --- proj/PeirceQuincuncialProjection.java, 3 calls on 3 lines ------------------ + {"proj/PeirceQuincuncialProjection.java:210 project", SIN, LON}, + {"proj/PeirceQuincuncialProjection.java:211 project", COS, LON}, + {"proj/PeirceQuincuncialProjection.java:212 project", COS, LAT}, + + // --- proj/AdamsProjection.java, 2 calls on 2 lines ------------------------------ + {"proj/AdamsProjection.java:257 ellipticTail", COS, ANGLE_SUM}, + {"proj/AdamsProjection.java:261 ellipticTail", COS, ANGLE_SUM}, + }; + + /** What {@code grep} counts, restated so the inventory cannot drift silently. */ + private static final int CALLS = 50; + + @Test + public void theInventoryMatchesTheGrepCount() { + assertEquals("the site table no longer lists every re-pointed call", CALLS, SITES.length); + } + + @Test + public void everySiteIsBitwiseIdenticalOverItsOwnArgumentDomain() { + long compared = 0; + for (Object[] site : SITES) { + String where = (String) site[0]; + int fn = (Integer) site[1]; + double[] xs = domain((Integer) site[2]); + for (double x : xs) { + double fast; + double strict; + switch (fn) { + case SIN: fast = FastStrictTrig.sin(x); strict = StrictMath.sin(x); break; + case COS: fast = FastStrictTrig.cos(x); strict = StrictMath.cos(x); break; + default: fast = FastStrictTrig.tan(x); strict = StrictMath.tan(x); break; + } + long a = Double.doubleToRawLongBits(fast); + long b = Double.doubleToRawLongBits(strict); + if (a != b) { + throw new AssertionError(where + ": " + name(fn) + "(" + x + ") = 0x" + + Long.toHexString(a) + " but StrictMath gives 0x" + + Long.toHexString(b)); + } + compared++; + } + } + assertTrue("the sweep did not run: " + compared + " comparisons", compared > 400000L); + } + + /** + * The control. If {@code Math} and {@code StrictMath} agreed everywhere, every assertion above + * would pass for the wrong reason. They do not: about 7% of arguments differ in the last bit, + * and in the adams family that last bit is 27.5 mm of easting. + */ + @Test + public void theTestIsNotVacuous() { + Random rnd = new Random(20260801L); + int n = 400000; + int differ = 0; + for (int i = 0; i < n; i++) { + double x = (rnd.nextDouble() * 8.0 - 4.0) * Math.PI; + if (Double.doubleToRawLongBits(Math.sin(x)) + != Double.doubleToRawLongBits(StrictMath.sin(x))) { + differ++; + } + } + double pct = 100.0 * differ / n; + assertTrue("Math.sin and StrictMath.sin agreed on every one of " + n + " arguments, so a " + + "raw-bit comparison of sines cannot detect anything on this JDK and the " + + "identity assertions above prove nothing", pct > 1.0); + } + + // ------------------------------------------------------------------ + // Composed old bodies: the method's result, recomputed the way the pre-change source + // computed it, must be bit-identical. This is the strongest available check short of + // the digests, because it exercises the exact expression the site sits in. + // ------------------------------------------------------------------ + + @Test + public void clenshaw6ConvertMatchesItsPreChangeBody() { + double[] out = new double[2]; + for (double n : new double[] {0.0016792203863837047, 0.0, 0.05, -0.05, 0.2}) { + for (int in = 0; in < AuxLat.NUMBER; in++) { + for (int o = 0; o < AuxLat.NUMBER; o++) { + if (in == o) { + continue; + } + Clenshaw6 c; + try { + c = Clenshaw6.forConversion(n, in, o); + } catch (RuntimeException e) { + continue; + } + for (int i = -1800; i <= 1800; i++) { + double zeta = i * (Math.PI / 1800.0); + // was: return convert(zeta, StrictMath.sin(zeta), StrictMath.cos(zeta)); + sameBits("Clenshaw6.convert(" + zeta + ")", + c.convert(zeta), + c.convert(zeta, StrictMath.sin(zeta), StrictMath.cos(zeta))); + double s = StrictMath.sin(zeta); + double cc = StrictMath.cos(zeta); + c.convertSinCos(s, cc, out); + // was: sd = StrictMath.sin(d); cd = StrictMath.cos(d); + double d = c.delta(s, cc); + double sd = StrictMath.sin(d); + double cd = StrictMath.cos(d); + sameBits("Clenshaw6.convertSinCos sin", out[0], s * cd + cc * sd); + sameBits("Clenshaw6.convertSinCos cos", out[1], cc * cd - s * sd); + } + } + } + } + } + + @Test + public void conformalLatMatchesItsPreChangeBody() { + for (double es : new double[] {0.0, 0.00669438002290, 0.2, 0.9}) { + double e = Math.sqrt(es); + for (int i = -4500; i <= 4500; i++) { + double phi = i * (Math.PI / 9000.0); + double sinphi = StrictMath.sin(phi); + // was: return tsfnSinCos(sinphi, StrictMath.cos(phi), e); + sameBits("ConformalLat.tsfn", ConformalLat.tsfn(phi, sinphi, e), + ConformalLat.tsfnSinCos(sinphi, StrictMath.cos(phi), e)); + // was: sphi = StrictMath.sin(phi); cphi = StrictMath.cos(phi); ... + double expected; + if (e == 0.0) { + expected = phi; + } else { + double sphi = StrictMath.sin(phi); + double cphi = StrictMath.cos(phi); + expected = StrictMath.atan(StrictMath.sinh( + MathHelpers.asinh(sphi / cphi) - e * MathHelpers.atanh(e * sphi))); + } + sameBits("ConformalLat.conformalLat", ConformalLat.conformalLat(phi, e), expected); + // was: return StrictMath.atan(sinhpsi2tanphi(StrictMath.tan(chi), e)); + double inv; + double invExpected; + try { + inv = ConformalLat.conformalLatInverse(phi, e); + } catch (RuntimeException ex) { + continue; + } + invExpected = (e == 0.0) ? phi + : StrictMath.atan(ConformalLat.sinhpsi2tanphi(StrictMath.tan(phi), e)); + sameBits("ConformalLat.conformalLatInverse", inv, invExpected); + } + } + } + + @Test + public void authalicForwardMatchesItsPreChangeBody() { + for (double es : new double[] {0.00669438002290, 0.05, 0.5, 0.9}) { + AuthalicLat al = new AuthalicLat(es); + for (int i = -4500; i <= 4500; i++) { + double phi = i * (Math.PI / 9000.0); + // was: return forward(phi, StrictMath.sin(phi), StrictMath.cos(phi)); + sameBits("AuthalicLat.forward(" + phi + ")", al.forward(phi), + al.forward(phi, StrictMath.sin(phi), StrictMath.cos(phi))); + } + } + } + + // ------------------------------------------------------------------ + + private static void sameBits(String what, double actual, double expected) { + long a = Double.doubleToRawLongBits(actual); + long b = Double.doubleToRawLongBits(expected); + if (a != b) { + throw new AssertionError(what + ": got 0x" + Long.toHexString(a) + " (" + actual + + "), pre-change body gives 0x" + Long.toHexString(b) + " (" + expected + ")"); + } + } + + private static String name(int fn) { + return fn == SIN ? "sin" : fn == COS ? "cos" : "tan"; + } + + /** Arguments a site of the given kind can see, edges and specials included. */ + private static double[] domain(int kind) { + Random rnd = new Random(0x5EED0000L + kind); + double[] xs = new double[9000 + 64]; + int k = 0; + double half; + switch (kind) { + case LON: + case ANGLE_SUM: + half = Math.PI; + break; + case LAT: + case HALF_LON: + half = Math.PI / 2.0; + break; + case HALF_LAT: + half = Math.PI / 4.0; + break; + case SMALL: + half = 1e-3; + break; + default: + half = 0.0; // ANY, filled below + break; + } + if (kind == ANY) { + for (int i = 0; i < 9000; i++) { + // spans the |x| <= pi/4, medium and multi-word tiers + xs[k++] = Math.scalb(rnd.nextDouble() * 2.0 - 1.0, rnd.nextInt(80) - 30); + } + } else if (kind == SMALL) { + for (int i = 0; i < 9000; i++) { + xs[k++] = Math.scalb(rnd.nextDouble() * 2.0 - 1.0, -rnd.nextInt(60)); + } + } else { + // a dense uniform grid plus a random overlay, so both quantised and generic + // arguments are covered + for (int i = 0; i < 4500; i++) { + xs[k++] = -half + (2.0 * half * i) / 4499.0; + } + for (int i = 0; i < 4500; i++) { + xs[k++] = (rnd.nextDouble() * 2.0 - 1.0) * half; + } + } + double[] specials = { + 0.0, -0.0, Double.MIN_VALUE, -Double.MIN_VALUE, Double.MIN_NORMAL, + Math.PI / 4, -Math.PI / 4, Math.nextUp(Math.PI / 4), Math.nextDown(Math.PI / 4), + Math.PI / 2, -Math.PI / 2, Math.PI, -Math.PI, 2 * Math.PI, -2 * Math.PI, + Math.nextUp(Math.PI / 2), Math.nextDown(Math.PI / 2), + 0.6744, 0.78125, 0.3, 1e-9, 1e-30, 823550.0, 823551.0, + Math.scalb(Math.PI / 2, 19), Math.scalb(Math.PI / 2, 20), 1e300, + Double.MAX_VALUE, -Double.MAX_VALUE, + Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN, + }; + for (double s : specials) { + xs[k++] = s; + } + double[] trimmed = new double[k]; + System.arraycopy(xs, 0, trimmed, 0, k); + return trimmed; + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/vertical/CompoundCrsTest.java b/core/src/test/java/org/locationtech/proj4j/vertical/CompoundCrsTest.java new file mode 100644 index 0000000..c3c8ebf --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/vertical/CompoundCrsTest.java @@ -0,0 +1,329 @@ +/* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import java.util.List; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.InvalidValueException; +import org.locationtech.proj4j.UnknownAuthorityCodeException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code EPSG:4326+5773} — the compound form, and an honest account of what the shipped + * dictionary does and does not contain. + * + *

What is actually missing, verified rather than taken on report

+ * + *

{@code epsg/src/main/resources/proj4/nad/epsg} has 5,755 entries. Grepping it for + * each code in turn: + * + * + * + * + * + * + * + * + * + * + * + * + * + *
presence in the shipped dictionary
codewhat it ispresent?
{@code 4326}WGS 84, geographic 2Dyes
{@code 27700}British National Gridyes
{@code 4936}, {@code 4978}ETRS89 / WGS 84 geocentricyes
{@code 4979}WGS 84, geographic 3Dno
{@code 4937}ETRS89, geographic 3Dno
{@code 5773}EGM96 heightno
{@code 3855}EGM2008 heightno
{@code 5714}, {@code 5715}MSL height / depthno
{@code 5703}NAVD88 heightno
+ * + *

So the report was right that {@code EPSG:4979} is absent — and the reason is + * structural, not an omission: {@code projinfo EPSG:4979 -o PROJ} is + * {@code +proj=longlat +datum=WGS84 +no_defs}, byte-identical to {@code EPSG:4326}'s + * entry. A PROJ.4 {@code +init=} dictionary has no way to say "and this one has a third + * axis", so adding a {@code <4979>} line would create an entry indistinguishable from + * {@code <4326>}. Vertical CRSs are absent for the same reason, one level worse: a + * proj-string cannot denote a standalone vertical CRS at all. + * + *

What a compound CRS reduces to

+ * + *

{@code projinfo EPSG:4326+5773 -o PROJ}, verbatim: + * + *

+ * +proj=longlat +datum=WGS84 +geoidgrids=us_nga_egm96_15.tif +geoid_crs=WGS84 +vunits=m
+ *   +no_defs +type=crs
+ * + *

which is {@code <4326>}'s own entry plus three tokens. That is why compound support and + * {@code +geoidgrids} support are the same feature, and why {@link CompoundCrs} composes + * rather than reimplements. + */ +public class CompoundCrsTest { + + private final CRSFactory crsFactory = new CRSFactory(); + + // ------------------------------------------------------------------ the name syntax + + @Test + public void theCompoundFormIsRecognised() { + assertTrue(CRSFactory.isCompoundName("EPSG:4326+5773")); + assertTrue(CRSFactory.isCompoundName("EPSG:4326+EPSG:5773")); + assertTrue(CRSFactory.isCompoundName(" EPSG:27700+5701 ")); + } + + /** + * The one thing that makes this non-trivial: {@code '+'} starts every proj-string + * parameter. A proj-string misread as a compound name would be truncated at its first + * parameter and quietly become a different CRS, so the test is deliberately conservative. + */ + @Test + public void aProjStringIsNeverMistakenForACompoundName() { + assertFalse(CRSFactory.isCompoundName("+proj=longlat +datum=WGS84")); + assertFalse(CRSFactory.isCompoundName("+proj=merc")); + assertFalse(CRSFactory.isCompoundName("proj=longlat datum=WGS84")); + assertFalse(CRSFactory.isCompoundName("EPSG:4326")); + assertFalse(CRSFactory.isCompoundName("EPSG:4326+")); + assertFalse(CRSFactory.isCompoundName("+5773")); + assertFalse(CRSFactory.isCompoundName("EPSG:4326+5773+5714")); + assertFalse(CRSFactory.isCompoundName(null)); + assertFalse(CRSFactory.isCompoundName("")); + } + + @Test + public void theBareVerticalCodeInheritsTheHorizontalAuthority() { + CompoundCrsName n = CompoundCrsName.parse("EPSG:4326+5773"); + assertEquals("EPSG:4326", n.horizontal()); + assertEquals("EPSG", n.verticalAuthority()); + assertEquals("5773", n.verticalCode()); + + CompoundCrsName q = CompoundCrsName.parse("EPSG:4326+EPSG:5773"); + assertEquals("EPSG:5773", q.verticalIdentifier()); + + // An unqualified horizontal code defaults to EPSG, exactly as createFromName does. + assertEquals("EPSG", CompoundCrsName.parse("4326+5773").verticalAuthority()); + } + + @Test + public void aNonCompoundNameIsRejectedBytheParser() { + try { + CompoundCrsName.parse("EPSG:4326"); + fail("EPSG:4326 is not a compound name"); + } catch (InvalidValueException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("EPSG:4326+5773")); + } + } + + // ------------------------------------------------------------------ composition + + /** + * The composed proj-string, token for token against {@code projinfo}, minus its + * {@code +type=crs} marker. + * + *

Token order differs from {@code projinfo}'s in one respect and deliberately + * so: this appends the vertical tokens after everything the dictionary entry carries, + * including its trailing {@code +no_defs}, because appending is what gives the horizontal + * CRS's own tokens precedence under {@code pj_param}'s first-match-wins. {@code projinfo} + * re-serialises from a parsed object and has no ordering constraint to honour. + */ + @Test + public void epsg4326Plus5773ComposesProjsOwnDefinition() { + CompoundCrs c = crsFactory.createCompound("EPSG:4326+5773"); + + assertEquals("EPSG:4326", c.getHorizontal().getName()); + assertEquals("EPSG:5773", c.getVertical().getIdentifier()); + assertEquals("EGM96 height", c.getVertical().getName()); + assertTrue("EGM96 is a real geoid model", c.appliesVerticalShift()); + + assertTrue(c.toProjString(), c.toProjString().startsWith("+proj=longlat +datum=WGS84")); + assertTrue("PROJ names the GeoTIFF: " + c.toProjString(), + c.toProjString().contains("+geoidgrids=us_nga_egm96_15.tif")); + assertTrue(c.toProjString().contains("+geoid_crs=WGS84")); + assertTrue(c.toProjString().contains("+vunits=m")); + + // The executable form names the file this library can open. proj.db's + // grid_alternatives row is + // WW15MGH.GRD | us_nga_egm96_15.tif | egm96_15.gtx | GTiff | geoid_like + // so egm96_15.gtx is upstream's own legacy spelling of the same data, not a guess. + assertTrue("the pipeline form names the GTX: " + c.pipelineDefinition(), + c.pipelineDefinition().contains("+geoidgrids=egm96_15.gtx")); + assertFalse(c.pipelineDefinition().contains(".tif")); + } + + /** A projected horizontal half composes the same way. */ + @Test + public void aProjectedHorizontalHalfComposesToo() { + CompoundCrs c = crsFactory.createCompound("EPSG:27700+5701"); + assertTrue(c.toProjString(), c.toProjString().startsWith("+proj=tmerc")); + assertTrue(c.toProjString().contains("+geoidgrids=uk_os_OSGM15_GB.tif")); + assertEquals("ODN height", c.getVertical().getName()); + } + + /** + * A vertical CRS with no geoid model composes to {@code +vunits=m} and nothing else, which + * is exactly what PROJ emits for it — {@code projinfo EPSG:4326+5714 -o PROJ} is + * {@code +proj=longlat +datum=WGS84 +vunits=m +no_defs +type=crs}, with no + * {@code +geoidgrids} at all. + * + *

{@link CompoundCrs#appliesVerticalShift()} reports that, rather than letting the + * caller discover it by getting their input height back. + */ + @Test + public void aModelFreeVerticalCrsSaysSo() { + CompoundCrs c = crsFactory.createCompound("EPSG:4326+5714"); + assertFalse("MSL height has no realisation, so no correction is available", + c.appliesVerticalShift()); + assertFalse(c.toProjString(), c.toProjString().contains("geoidgrids")); + assertTrue(c.toProjString().contains("+vunits=m")); + } + + /** + * A down-positive axis is recorded even though a legacy proj-string cannot express it, so + * a caller can refuse rather than be handed a height where a depth was asked for. PROJ's + * own PROJ.4 export loses the distinction: {@code EPSG:4326+5715} and + * {@code EPSG:4326+5714} serialise identically. + */ + @Test + public void aDepthIsFlaggedBecauseTheProjStringCannotCarryIt() { + assertTrue(crsFactory.createCompound("EPSG:4326+5715").getVertical().isDepth()); + assertFalse(crsFactory.createCompound("EPSG:4326+5714").getVertical().isDepth()); + assertEquals("the two serialise identically, which is why isDepth() exists", + crsFactory.createCompound("EPSG:4326+5714").toProjString(), + crsFactory.createCompound("EPSG:4326+5715").toProjString()); + } + + // ------------------------------------------------------------------ the composed pipeline + + /** + * The whole point: the composition is executable, and it produces the geoid height. + * + *

Run against the test fixture rather than the real {@code egm96_15.gtx}, which is 55 MB + * and ships nowhere, by substituting the grid name. The arithmetic exercised is identical + * and is pinned against {@code cct} in {@link GeoidGridsAutoStepTest}. + */ + @Test + public void theCompositionIsExecutable() { + CompoundCrs c = crsFactory.createCompound("EPSG:4326+5773"); + String definition = c.pipelineDefinition() + .replace("egm96_15.gtx", "egm96_15_downsampled.gtx"); + + double[] out = new org.locationtech.proj4j.pipeline.PipelineFactory().create(definition) + .forward(new double[] {Math.toRadians(12.5), Math.toRadians(55.5), 0.0, 0.0}); + + assertEquals("longitude-first, unchanged: proj4j is AxisOrderPolicy.LEGACY", + 12.5, Math.toDegrees(out[0]), 1e-12); + assertEquals(55.5, Math.toDegrees(out[1]), 1e-12); + assertEquals("an ellipsoidal height of 0 is -36.394 m of EGM96 orthometric height", + -36.394090697107, out[2], 1e-9); + } + + // ------------------------------------------------------------------ what is missing + + /** + * {@code EPSG:4979} is not in the shipped dictionary and this test says so out loud, with + * the reason. If a later change adds it, this test fails and the reason has to be revisited + * rather than the absence being rediscovered. + */ + @Test + public void epsg4979IsAbsentFromTheShippedDictionary() { + try { + crsFactory.createFromName("EPSG:4979"); + fail("EPSG:4979 resolved. It is absent from proj4/nad/epsg, and its PROJ.4 form " + + "(+proj=longlat +datum=WGS84 +no_defs) is byte-identical to EPSG:4326's - " + + "so if it now resolves, check what it resolves TO before celebrating."); + } catch (UnknownAuthorityCodeException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("4979")); + } + } + + /** An unknown vertical code names itself and says where the data has to come from. */ + @Test + public void anUnknownVerticalCodeIsNamedRatherThanGuessed() { + try { + crsFactory.createCompound("EPSG:4326+9999"); + fail("EPSG:9999 is not a vertical CRS this library knows"); + } catch (UnknownVerticalCrsException expected) { + assertEquals("EPSG:9999", expected.getIdentifier()); + assertTrue(expected.getMessage(), + expected.getMessage().contains("contains no vertical CRS")); + assertTrue("the message must list what IS available", + expected.getMessage().contains("EPSG:5773")); + } + } + + /** + * {@code createFromName} must not silently answer a compound question with a 2D CRS. It + * points at {@code createCompound} instead — and stays an + * {@link UnknownAuthorityCodeException}, so every existing {@code catch} still fires. + */ + @Test + public void createFromNameRefusesACompoundNameAndSaysWhichMethodToUse() { + try { + crsFactory.createFromName("EPSG:4326+5773"); + fail("createFromName returns a 2D CoordinateReferenceSystem and must not drop the " + + "vertical half"); + } catch (UnknownAuthorityCodeException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("createCompound")); + } + } + + /** A plain unknown code keeps its old, plain message. */ + @Test + public void aPlainUnknownCodeIsUnaffected() { + try { + crsFactory.createFromName("EPSG:999999"); + fail("EPSG:999999 does not exist"); + } catch (UnknownAuthorityCodeException expected) { + assertFalse(expected.getMessage(), expected.getMessage().contains("createCompound")); + } + } + + // ------------------------------------------------------------------ the registry seam + + @Test + public void theBuiltInTableIsSmallAndEnumerable() { + List known = VerticalCrsRegistry.knownCodes(); + assertTrue(known.toString(), known.contains("EPSG:5773")); + assertTrue(known.toString(), known.contains("EPSG:3855")); + assertTrue(known.toString(), known.contains("EPSG:5714")); + assertNull("anything outside the table is null, not a fabricated entry", + VerticalCrsRegistry.find("EPSG", "9999")); + } + + @Test + public void aRegisteredVerticalCrsWinsAndCanBeCleared() { + try { + VerticalCrsRegistry.register(new VerticalCrs("EPSG", "9999", "Test height", + "test.tif", "test.gtx", "WGS84", "ft", false)); + CompoundCrs c = crsFactory.createCompound("EPSG:4326+9999"); + assertEquals("Test height", c.getVertical().getName()); + assertTrue(c.pipelineDefinition(), c.pipelineDefinition().contains("+vunits=ft")); + assertTrue(c.pipelineDefinition().contains("+geoidgrids=test.gtx")); + } finally { + VerticalCrsRegistry.clearRegistered(); + } + assertNull(VerticalCrsRegistry.find("EPSG", "9999")); + } + + @Test + public void aRegistrationWithoutAnIdentityIsRefused() { + try { + VerticalCrsRegistry.register(VerticalCrsRegistry.ellipsoidalHeight()); + fail("an anonymous VerticalCrs has no key to register under"); + } catch (IllegalArgumentException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("authority")); + } + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/vertical/GeoidGridsAutoStepTest.java b/core/src/test/java/org/locationtech/proj4j/vertical/GeoidGridsAutoStepTest.java new file mode 100644 index 0000000..2e07c43 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/vertical/GeoidGridsAutoStepTest.java @@ -0,0 +1,364 @@ +/* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import org.junit.Test; +import org.locationtech.proj4j.CrsTransformException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.pipeline.Pipeline; +import org.locationtech.proj4j.pipeline.PipelineDefinitionException; +import org.locationtech.proj4j.pipeline.PipelineFactory; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * {@code +geoidgrids} becomes an auto-inserted {@code +proj=vgridshift} step, and + * {@code +vunits}/{@code +vto_meter}/{@code +z_0} scale the height. + * + *

Where every expected number came from

+ * + *

All of them from PROJ 9.8.1's {@code cct} reading the same grid file this test + * reads — {@code core/src/test/resources/proj4j-data/grids/egm96_15_downsampled.gtx}, which is + * PROJ's own {@code 9.8.1:data/tests/egm96_15_downsampled.gtx}. {@code cct} rather than + * {@code cs2cs}, because {@code cs2cs} promotes datum-less sides to full CRSs and would not run + * the legacy {@code +geoidgrids} path at all. Reproduce with: + * + *

+ * export PROJ_DATA=core/src/test/resources/proj4j-data/grids:/opt/homebrew/share/proj
+ * echo "12.5 55.5 0" | cct -d 12 +proj=latlong +geoidgrids=egm96_15_downsampled.gtx \
+ *                                +ellps=GRS80
+ *   12.500000000000  55.500000000000  -36.394090697107
+ * + *

The corpus agrees independently: {@code gie/4D-API_cs2cs-style.gie} asserts + * {@code -36.3941} at the same point for {@code proj=latlong geoidgrids=egm96_15.gtx + * ellps=GRS80} and {@code 1391493.63492 7424275.19462 -36.3941} for the {@code proj=merc} + * form. That corpus uses the full {@code egm96_15.gtx}; the downsampled fixture + * lands within its stated 15 cm tolerance and, at this point, agrees to 1e-4 m. + * + *

The sign convention, which is the easy thing to get backwards

+ * + *

{@code vgridshift.cpp:206} sets {@code forward_multiplier = -1.0} with the comment + * "historical: the forward direction subtracts the grid offset". The geoid undulation at + * (12.5°E, 55.5°N) is {@code +36.394090697107}, so the forward direction produces + * {@code -36.394090697107} from a zero input: an ellipsoidal height becomes an orthometric + * one. {@link #theMultiplierIsExposedOnAnExplicitStepButNotInheritedByTheHiddenOne()} pins both + * halves of that. + */ +public class GeoidGridsAutoStepTest { + + /** PROJ's own {@code data/tests/egm96_15_downsampled.gtx}, on the test classpath. */ + private static final String GRID = "egm96_15_downsampled.gtx"; + + /** {@code cct}, to twelve figures. */ + private static final double N_AT_12_5_55_5 = 36.394090697107; + + private static final double MM = 1e-9; + + private static double[] forwardDegrees(String definition, double lonDeg, double latDeg, + double z) { + return new PipelineFactory().create(definition) + .forward(new double[] {Math.toRadians(lonDeg), Math.toRadians(latDeg), z, 0}); + } + + private static double[] inverseDegrees(String definition, double lonDeg, double latDeg, + double z) { + return new PipelineFactory().create(definition) + .inverse(new double[] {Math.toRadians(lonDeg), Math.toRadians(latDeg), z, 0}); + } + + /** + * The five points {@code cct} was run on, forward, through {@code +proj=latlong}. + * + *

+     * 12.5   55.5     0 -> -36.394090697107
+     * 12.5   55.5   100 ->  63.605909302893
+     *  0.0    0.0     0 -> -17.234017133713
+     * -75.25 40.75     0 ->  33.931076938336
+     * 151.2 -33.85     0 -> -22.105806101939
+ */ + @Test + public void latlongWithGeoidGridsMatchesProj981() { + String def = "+proj=latlong +geoidgrids=" + GRID + " +ellps=GRS80"; + double[][] cases = { + {12.5, 55.5, 0.0, -36.394090697107}, + {12.5, 55.5, 100.0, 63.605909302893}, + {0.0, 0.0, 0.0, -17.234017133713}, + {-75.25, 40.75, 0.0, 33.931076938336}, + {151.2, -33.85, 0.0, -22.105806101939}, + }; + for (int i = 0; i < cases.length; i++) { + double[] out = forwardDegrees(def, cases[i][0], cases[i][1], cases[i][2]); + assertEquals("longitude is untouched at " + cases[i][0] + ", " + cases[i][1], + cases[i][0], Math.toDegrees(out[0]), 1e-12); + assertEquals("latitude is untouched at " + cases[i][0] + ", " + cases[i][1], + cases[i][1], Math.toDegrees(out[1]), 1e-12); + assertEquals("orthometric height at " + cases[i][0] + ", " + cases[i][1], + cases[i][3], out[2], MM); + } + } + + /** + * The vertical shift is applied in {@code fwd_prepare}, i.e. before the projection + * formula, so a projected target carries the shifted height alongside its easting and + * northing. + * + *

{@code cct}: {@code 1391493.634915919509 7424275.194622228853 -36.394090697107}. + * The corpus's {@code proj=merc geoidgrids=egm96_15.gtx} row asserts the same three values + * rounded, at 0.1 mm. + */ + @Test + public void aProjectedTargetCarriesTheShiftedHeight() { + double[] out = forwardDegrees("+proj=merc +geoidgrids=" + GRID + " +ellps=GRS80", + 12.5, 55.5, 0.0); + assertEquals("easting", 1391493.634915919509, out[0], 1e-6); + assertEquals("northing", 7424275.194622228853, out[1], 1e-6); + assertEquals("height", -36.394090697107, out[2], MM); + } + + /** + * The inverse undoes it, in the mirrored position: {@code inv_finalize} runs + * {@code vgridshift} inverse before the datum shift, where the forward runs it + * after. + * + *

{@code echo "12.5 55.5 -36.3" | cct -d 12 -I +proj=latlong +geoidgrids=... } + * gives {@code 0.094090697107}, i.e. {@code -36.3 + 36.394090697107}. + */ + @Test + public void theInverseGoesGeometricFromOrthometric() { + double[] out = inverseDegrees("+proj=latlong +geoidgrids=" + GRID + " +ellps=GRS80", + 12.5, 55.5, -36.3); + assertEquals(0.094090697107, out[2], MM); + } + + /** A round trip through the projected form returns the height it started with. */ + @Test + public void theProjectedFormRoundTrips() { + String def = "+proj=merc +geoidgrids=" + GRID + " +ellps=GRS80"; + Pipeline p = new PipelineFactory().create(def); + double[] there = + p.forward(new double[] {Math.toRadians(12.5), Math.toRadians(55.5), 17.0, 0}); + double[] back = p.inverse(there); + assertEquals(12.5, Math.toDegrees(back[0]), 1e-9); + assertEquals(55.5, Math.toDegrees(back[1]), 1e-9); + assertEquals(17.0, back[2], 1e-6); + } + + /** + * {@code +vunits} scales the height, and {@code +vunits} beats {@code +vto_meter} + * when both are given — {@code init.cpp:715-750} reads {@code +vto_meter} only in the + * {@code else} branch, so the presence of {@code +vunits} makes it invisible. + * + *

{@code cct} with {@code +vunits=ft} gives {@code -119.403184701796}, and with + * {@code +vunits=us-ft +vto_meter=0.3048} gives {@code -119.402945895426} — the US foot, + * not the international one. Those two numbers differing is the whole assertion: had + * {@code +vto_meter} won, both rows would read {@code -119.403184701796}. + */ + @Test + public void vunitsScalesTheHeightAndBeatsVtoMeter() { + double ft = forwardDegrees("+proj=latlong +geoidgrids=" + GRID + + " +ellps=GRS80 +vunits=ft", 12.5, 55.5, 0.0)[2]; + assertEquals("+vunits=ft", -119.403184701796, ft, MM); + + double vtoMeter = forwardDegrees("+proj=latlong +geoidgrids=" + GRID + + " +ellps=GRS80 +vto_meter=0.3048", 12.5, 55.5, 0.0)[2]; + assertEquals("+vto_meter=0.3048 alone is the same factor", + -119.403184701796, vtoMeter, MM); + + double both = forwardDegrees("+proj=latlong +geoidgrids=" + GRID + + " +ellps=GRS80 +vunits=us-ft +vto_meter=0.3048", 12.5, 55.5, 0.0)[2]; + assertEquals("+vunits=us-ft wins over +vto_meter=0.3048", + -119.402945895426, both, MM); + } + + /** + * With neither {@code +vunits} nor {@code +vto_meter}, the vertical unit is the + * horizontal one: {@code vto_meter = to_meter} ({@code init.cpp:747-750}). So + * {@code +units=ft} scales the height too, which is easy to miss and produces a height + * wrong by 3.28× when missed. + * + *

{@code cct}: {@code 4565267.831088974141 24357858.250072926283 + * -119.403184701796}. + */ + @Test + public void withNoVerticalUnitTheHorizontalOneApplies() { + double[] out = forwardDegrees("+proj=merc +geoidgrids=" + GRID + + " +ellps=GRS80 +units=ft", 12.5, 55.5, 0.0); + assertEquals("easting in feet", 4565267.831088974141, out[0], 1e-6); + assertEquals("northing in feet", 24357858.250072926283, out[1], 1e-6); + assertEquals("height in feet, from +units and not from any +vunits", + -119.403184701796, out[2], MM); + } + + /** + * {@code +vunits} applies with no geoid grid at all — it is a unit, not a geoid feature. + * {@code echo "12.5 55.5 100" | cct -d 12 +proj=latlong +ellps=GRS80 +vunits=ft} gives + * {@code 328.083989501312}. + */ + @Test + public void vunitsAppliesWithoutAnyGeoidGrid() { + double z = forwardDegrees("+proj=latlong +ellps=GRS80 +vunits=ft", 12.5, 55.5, 100.0)[2]; + assertEquals(328.083989501312, z, MM); + } + + /** + * {@code +z_0}, which is always metres and is added inside the vertical scale: + * {@code z = vfr_meter * (z + z0)} ({@code fwd.cpp:145}, {@code :157}). + * + *

{@code cct} with {@code +z_0=10} gives {@code -26.394090697107}. + */ + @Test + public void z0IsAddedInsideTheVerticalScale() { + double z = forwardDegrees("+proj=latlong +geoidgrids=" + GRID + " +ellps=GRS80 +z_0=10", + 12.5, 55.5, 0.0)[2]; + assertEquals(-36.394090697107 + 10.0, z, MM); + } + + /** {@code +vunits=deg} is "Invalid value for vunits": upstream searches linear units only. */ + @Test + public void anAngularVunitsIsRejected() { + try { + new PipelineFactory().create("+proj=latlong +ellps=GRS80 +vunits=deg"); + fail("+vunits=deg must be rejected: pj_list_linear_units() has no angular entries"); + } catch (PipelineDefinitionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("+vunits=deg")); + } + } + + /** {@code +vto_meter=0} and a zero denominator are both errors, as for {@code +to_meter}. */ + @Test + public void aNonPositiveVtoMeterIsRejected() { + for (String bad : new String[] {"0", "-1", "1/0"}) { + try { + new PipelineFactory().create( + "+proj=latlong +ellps=GRS80 +vto_meter=" + bad); + fail("+vto_meter=" + bad + " must be rejected"); + } catch (PipelineDefinitionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("vto_meter")); + } + } + } + + /** + * An explicit {@code +proj=vgridshift} step honours {@code +multiplier}; the hidden step + * {@code +geoidgrids} builds does not, because {@code create.cpp:96-99} composes a + * fresh parameter string that inherits nothing from the enclosing operation. + * Letting a token PROJ ignores flip the sign of every height would be worse than not + * supporting it. + * + *

{@code cct +proj=vgridshift +grids=...} gives {@code -36.394090697107}; + * {@code +multiplier=1} gives {@code +36.394090697107}. + */ + @Test + public void theMultiplierIsExposedOnAnExplicitStepButNotInheritedByTheHiddenOne() { + assertEquals("default multiplier is -1", + -N_AT_12_5_55_5, + forwardDegrees("+proj=vgridshift +grids=" + GRID, 12.5, 55.5, 0.0)[2], MM); + + assertEquals("+multiplier=1 is what the CRS-based path uses", + N_AT_12_5_55_5, + forwardDegrees("+proj=vgridshift +grids=" + GRID + " +multiplier=1", + 12.5, 55.5, 0.0)[2], MM); + + assertEquals("a +multiplier beside +geoidgrids is NOT inherited by the hidden step", + -N_AT_12_5_55_5, + forwardDegrees("+proj=latlong +ellps=GRS80 +geoidgrids=" + GRID + + " +multiplier=1", 12.5, 55.5, 0.0)[2], MM); + } + + /** {@code +proj=vgridshift} with no {@code +grids} is "grids parameter missing." upstream. */ + @Test + public void vgridshiftNeedsGrids() { + try { + new PipelineFactory().create("+proj=vgridshift"); + fail("+proj=vgridshift with no +grids must be rejected"); + } catch (PipelineDefinitionException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("+grids")); + } + } + + /** + * A missing required grid fails at construction, naming the file. That is the + * point of doing it there: a grid absent from the resolver chain must not become a + * surprise on row four million. + */ + @Test + public void aMissingRequiredGridFailsAtConstruction() { + try { + new PipelineFactory().create("+proj=latlong +ellps=GRS80 +geoidgrids=nope.gtx"); + fail("a required missing vertical grid must be refused"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.MISSING_GRID, expected.cause()); + assertTrue(expected.getMessage(), expected.getMessage().contains("nope.gtx")); + } + } + + /** + * An all-optional list that resolves to nothing builds a working, identity-valued step — + * {@code pj_vgridshift_forward_3d}'s {@code if (!Q->grids.empty())} guard, which is + * reachable exactly this way. + */ + @Test + public void anAllOptionalMissingListIsAnIdentity() { + double[] out = forwardDegrees("+proj=latlong +ellps=GRS80 +geoidgrids=@nope.gtx", + 12.5, 55.5, 42.0); + assertEquals("no grid resolved, so the height passes through", 42.0, out[2], 0.0); + } + + /** + * A point outside every grid is an error, not a zero shift. + * + *

The fixture spans the whole world in longitude but stops at + * −89.62°/+89.62° in latitude, so a point beyond the last row's centre is + * genuinely uncovered — and PROJ reports {@code PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID} for + * it rather than returning the height unchanged. + */ + @Test + public void aPointOutsideEveryGridIsRefused() { + try { + forwardDegrees("+proj=latlong +ellps=GRS80 +geoidgrids=" + GRID, 0.0, -89.99, 0.0); + fail("a point outside the grid must not silently return a zero shift"); + } catch (CrsTransformException expected) { + assertEquals(ErrorCause.COORDINATE_OUTSIDE_GRID, expected.cause()); + } + } + + /** A {@code NaN} horizontal position has no height to shift, and travels as {@code NaN}. */ + @Test + public void aNaNPositionYieldsANaNHeightRatherThanAnException() { + double[] out = new PipelineFactory() + .create("+proj=latlong +ellps=GRS80 +geoidgrids=" + GRID) + .forward(new double[] {Double.NaN, Math.toRadians(55.5), 0.0, 0}); + assertTrue("read_vgrid_value refuses NaN input rather than interpolating", + Double.isNaN(out[2])); + } + + /** The operator is reachable directly, for a caller composing its own pipeline. */ + @Test + public void theOperatorIsUsableOnItsOwn() { + VGridShiftOperator op = VGridShiftOperator.fromGrids(GRID); + assertEquals(VGridShiftOperator.DEFAULT_MULTIPLIER, op.multiplier(), 0.0); + assertEquals(1, op.grids().size()); + assertTrue(op.hasInverse()); + + double[] c = {Math.toRadians(12.5), Math.toRadians(55.5), 0.0, 0.0}; + op.forward(c); + assertEquals(-N_AT_12_5_55_5, c[2], MM); + op.inverse(c); + assertEquals("forward then inverse is the identity", 0.0, c[2], 1e-12); + } +} diff --git a/core/src/test/java/org/locationtech/proj4j/vertical/InventedHeightTest.java b/core/src/test/java/org/locationtech/proj4j/vertical/InventedHeightTest.java new file mode 100644 index 0000000..47645d9 --- /dev/null +++ b/core/src/test/java/org/locationtech/proj4j/vertical/InventedHeightTest.java @@ -0,0 +1,266 @@ +/* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.locationtech.proj4j.vertical; + +import org.junit.Test; +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * A 2D → 2D datum shift must not fabricate a height. + * + *

The defect, as measured before the fix

+ * + *

{@code EPSG:4326 -> EPSG:27700} with no input height — + * {@code new ProjCoordinate(-2.0, 53.0)}, whose two-argument constructor sets + * {@code z = Double.NaN}, this library's documented "no height" sentinel — returned + * + *

+ * ProjCoordinate[400097.23902646254 344742.07249671593 -49.84606796130538]
+ * + *

The horizontal ordinates are right, to 2e-10 m of PROJ 9.8.1. The + * −49.84606796130538 is not: nothing in the input carried a height, and the + * caller is handed a metre-scaled number in a field they never populated. It arises because + * a datum shift routes through geocentric coordinates, and + * {@code datum/GeocentricConverter.java:106} substitutes {@code 0} for an absent height on + * the way in — which is faithful to PROJ, see below — while {@code :266} writes the + * computed height back on the way out, with nothing to restore the absence. The + * value is the negative geoid-free difference between the WGS 84 and Airy 1830 + * ellipsoidal surfaces at that point, so it is entirely plausible, which is what makes it + * dangerous. + * + *

What PROJ 9.8.1 does, checked rather than assumed

+ * + *

PROJ wraps the geocentric leg of a two-dimensional operation in + * {@code +proj=push +v_3} / {@code +proj=pop +v_3}, which saves the third ordinate and + * restores it byte for byte. Verbatim from + * {@code projinfo -s "+proj=longlat +datum=WGS84 +type=crs" -t " +type=crs" -o PROJ}, which is the operation Proj4J's own parameter string + * selects: + * + *

+ * +proj=pipeline
+ *   +step +proj=unitconvert +xy_in=deg +xy_out=rad
+ *   +step +proj=push +v_3
+ *   +step +proj=cart +ellps=WGS84
+ *   +step +inv +proj=helmert +x=446.448 +y=-125.157 +z=542.06 +rx=0.1502 +ry=0.247
+ *         +rz=0.8421 +s=-20.4894 +convention=position_vector
+ *   +step +inv +proj=cart +ellps=airy
+ *   +step +proj=pop +v_3
+ *   +step +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000
+ *         +ellps=airy
+ * + *

Those Helmert parameters are the ones in PROJ 9.8.1's own {@code src/datums.cpp:59}, + * which is where {@code +datum=OSGB36} is defined, and they are the ones + * {@link org.locationtech.proj4j.datum.Datum#OSGB36} carries. They are not the + * rounded {@code +rx=0.15 +ry=0.247 +rz=0.842 +s=-20.489} that {@code projinfo -s EPSG:4326 + * -t EPSG:27700} emits — that is EPSG:1314, a different published realisation of the same + * shift, and it lands 3.3 mm away in easting. Every number in this file was re-pinned + * once {@code Datum.OSGB36} was corrected to the {@code datums.cpp} values; see + * {@code CoordinateTransformTest.testPROJ4} for the same correction applied to eight other + * rows. + * + *

The two runs that separate the push/pop from its absence, both PROJ 9.8.1, both on the + * pipeline above: + * + *

+ * echo "-2 53 100" | cct -d 15 <the pipeline above>
+ *   400097.237314143800  344742.073156363796  100.000000000000
+ * echo "-2 53 100" | cct -d 15 <the same pipeline without push/pop>
+ *   400097.237314143800  344742.073156363796   50.155981001444
+ * + *

So the answer to "propagate {@code NaN}, or leave the caller's {@code Z} untouched?" is + * that they are the same answer: PROJ leaves it untouched, and for a coordinate whose + * height is the {@code NaN} sentinel, leaving it untouched is propagating + * {@code NaN}. PROJ substitutes {@code 0} for a {@code HUGE_VAL} height when a Helmert is + * present ({@code fwd.cpp:47-51}) only because {@code PJ_COORD} has no absent state; + * {@code ProjCoordinate} does, so the sentinel is the thing to preserve. Note also that + * push/pop is horizontally neutral: it is applied after {@code cart} has already + * consumed the height, so the easting and northing above are identical with and without it, + * which is why only the third ordinate ever moves. + * + *

The fix

+ * + *

Four lines in two methods of {@code BasicCoordinateTransform}. In + * {@code transformClosed(ProjCoordinate, ProjCoordinate)}, beside the existing + * {@code nanIn} and read before {@code setValue} for the same aliasing reason: + * + *

+ * final boolean noHeightIn = Double.isNaN(src.z);
+ * + *

and then {@code push}/{@code pop} around the one stage that can invent a height: + * + *

+ * if (doDatumTransform) {
+ *     datumTransform(tgt);
+ *     if (noHeightIn) {
+ *         tgt.z = Double.NaN;
+ *     }
+ * }
+ * + *

and the identical pair on {@code sz} around {@code datumStage(c)} in the bulk path's + * {@code transformPoint}. Restoring immediately after the datum stage is sufficient and is + * where PROJ puts it, and both halves of that claim were re-checked against the current tree + * rather than inherited: {@code proj.Projection} contains zero occurrences of + * {@code .z}, and the only class under {@code proj/} that mentions the ordinate at all is + * {@code GeocentProjection}, which is {@code +proj=geocent} and for which a height is data + * rather than decoration; {@code datum.AxisOrder} only copies or negates {@code z}, and + * {@code PrimeMeridian} touches {@code x} alone. So a {@code NaN} placed there survives to + * the caller. + * + *

One case this does not reach, deliberately

+ * + *

An explicit {@code z = 0} still comes back as {@code -49.85}, where + * {@code cs2cs EPSG:4326 EPSG:27700} returns {@code 0}. That is not the same defect: PROJ + * decides push/pop from the CRSs' dimensionality, and a legacy + * {@code CoordinateReferenceSystem} has none to consult — a finite {@code z} is the only + * signal the legacy API has that the caller means a 3D point, and for a genuinely 3D + * operation PROJ does transform the height. Making that case agree needs the CRS to know it + * is two-dimensional, which is what {@link CompoundCrs} and {@link VerticalCrs} exist to + * express. See {@link #anExplicitHeightIsStillTransformed()}. + */ +public class InventedHeightTest { + + /** + * PROJ 9.8.1's height for this point when the geocentric leg is not bracketed by + * push/pop, i.e. the height Proj4J computes for an explicitly supplied {@code z = 0}. + * From {@code cct -d 15} on the pipeline in this class's javadoc, minus the push/pop pair. + */ + private static final double PROJ_HEIGHT_FROM_ZERO = -49.846067961305380; + + /** PROJ 9.8.1, same pipeline, from an explicit {@code z = 100}. */ + private static final double PROJ_HEIGHT_FROM_100 = 50.155981001444161; + + /** + * The largest Proj4J-vs-PROJ residual measured over every ordinate asserted in this file, + * in metres. Every expected value here came from {@code cct}; none came from Proj4J. + */ + private static final double TOL_M = 1.0e-8; + + private static final double LON = -2.0; + private static final double LAT = 53.0; + + private static CoordinateTransform wgs84ToOsgb() { + CRSFactory crsFactory = new CRSFactory(); + CoordinateReferenceSystem src = crsFactory.createFromName("EPSG:4326"); + CoordinateReferenceSystem tgt = crsFactory.createFromName("EPSG:27700"); + return new CoordinateTransformFactory().createTransform(src, tgt); + } + + /** + * What the fix must not change: the horizontal ordinates. + * + *

They are asserted against PROJ, not against Proj4J's before-value, so this is a + * correctness bar rather than a no-movement bar — but it is also the no-movement bar, + * because the fix restores the sentinel after the datum stage and the two projections + * downstream of it never read {@code z}. + */ + @Test + public void theHorizontalOrdinatesAreUnaffectedAndAgreeWithProj() { + ProjCoordinate in = new ProjCoordinate(LON, LAT); + assertTrue("the two-argument constructor is the no-height sentinel", Double.isNaN(in.z)); + + ProjCoordinate out = new ProjCoordinate(); + wgs84ToOsgb().transform(in, out); + + // cct -d 15, the javadoc pipeline: 400097.239026462543 344742.072496716108 + assertEquals("easting", 400097.239026462543, out.x, TOL_M); + assertEquals("northing", 344742.072496716108, out.y, TOL_M); + } + + /** + * The defect itself: an absent height must stay absent. + */ + @Test + public void aTransformWithNoInputHeightMustNotProduceOne() { + ProjCoordinate in = new ProjCoordinate(LON, LAT); + ProjCoordinate out = new ProjCoordinate(); + wgs84ToOsgb().transform(in, out); + + assertFalse("EPSG:4326 -> EPSG:27700 of (" + LON + ", " + LAT + ") with no input height " + + "returned z = " + out.z + ". PROJ 9.8.1 returns the caller's third " + + "ordinate unchanged, via +proj=push +v_3 / +proj=pop +v_3 around the " + + "geocentric leg, so an absent height must stay absent.", + out.hasValidZOrdinate()); + } + + /** + * The same defect through the bulk path, which is a separate method and needed the same + * two lines. + */ + @Test + public void theBulkPathMustNotProduceAHeightEither() { + double[] xyz = {LON, LAT, Double.NaN}; + int failures = ((org.locationtech.proj4j.BulkCoordinateTransform) wgs84ToOsgb()) + .transform3D(xyz, 0, 1, 3, null); + assertEquals("the point itself transforms fine", 0, failures); + assertTrue("transform3D of a point whose z is the no-height sentinel returned z = " + + xyz[2] + "; the sentinel must survive the geocentric round trip", + Double.isNaN(xyz[2])); + // Bit-for-bit the single-point path, which is the bulk API's normative contract. + assertEquals("bulk easting", 400097.239026462543, xyz[0], TOL_M); + assertEquals("bulk northing", 344742.072496716108, xyz[1], TOL_M); + } + + /** + * A finite height is data and is transformed, which is correct for a 3D + * operation and is what the fix must not change. + * + *

The guard is on the sentinel, not on the datum shift, so {@code z = 0} continues to + * mean "0 m of ellipsoidal height" rather than "no height". + */ + @Test + public void anExplicitHeightIsStillTransformed() { + ProjCoordinate out = new ProjCoordinate(); + wgs84ToOsgb().transform(new ProjCoordinate(LON, LAT, 0.0), out); + assertEquals("an explicitly supplied height is transformed, as it is for a 3D operation", + PROJ_HEIGHT_FROM_ZERO, out.z, TOL_M); + + // Not PROJ_HEIGHT_FROM_ZERO + 100: a Helmert is affine in *cartesian* coordinates, so + // the change in ellipsoidal height is not quite independent of the height itself. The + // two differ by 1.9 mm here, which is exactly why these are pinned numbers and not an + // arithmetic identity. The easting and northing move by 1.7 mm with the height. + ProjCoordinate out100 = new ProjCoordinate(); + wgs84ToOsgb().transform(new ProjCoordinate(LON, LAT, 100.0), out100); + assertEquals("a real height goes through the geocentric round trip", + PROJ_HEIGHT_FROM_100, out100.z, TOL_M); + assertEquals(400097.237314143800, out100.x, TOL_M); + assertEquals(344742.073156363796, out100.y, TOL_M); + } + + /** + * A same-datum transform never enters the geocentric leg, so it has never invented a + * height. Included as the control: it is what shows the defect is the datum stage and not + * the projection. + */ + @Test + public void aTransformWithNoDatumShiftAlreadyPreservesTheSentinel() { + CRSFactory crsFactory = new CRSFactory(); + CoordinateTransform t = new CoordinateTransformFactory().createTransform( + crsFactory.createFromName("EPSG:4326"), crsFactory.createFromName("EPSG:3857")); + ProjCoordinate out = new ProjCoordinate(); + t.transform(new ProjCoordinate(LON, LAT), out); + assertTrue("EPSG:4326 -> EPSG:3857 shares a datum, so no height is invented", + Double.isNaN(out.z)); + } +} diff --git a/core/src/test/resources/PROJ4_SPCS_ESRI_nad83.csv b/core/src/test/resources/PROJ4_SPCS_ESRI_nad83.csv deleted file mode 100644 index cfa9c71..0000000 --- a/core/src/test/resources/PROJ4_SPCS_ESRI_nad83.csv +++ /dev/null @@ -1,226 +0,0 @@ -testName,testMethod,srcCrsAuth,srcCrs,tgtCrsAuth,tgtCrs,srcOrd1,srcOrd2,srcOrd3,tgtOrd1,tgtOrd2,tgtOrd3,tolOrd1,tolOrd2,tolOrd3,using,dataSource,dataCmnts,maintenanceCmnts -"NAD83 State Plane CS - AK 1 ","Proj4j","EPSG","4269","ESRI","102631",-134.0,55.0,"",2616018.154,1156379.643,"",0.1,0.1,0.0,"","PROJ4 test83","","Bug in Proj4J Obl Merc" -"NAD83 State Plane CS - AK 1 ","Proj4j","EPSG","4269","ESRI","102631",-133.66666666666666,57.0,"",2685941.919,1886799.668,"",0.1,0.1,0.0,"","PROJ4 test83","","Bug in Proj4J Obl Merc" -"NAD83 State Plane CS - AK 1 ","Proj4j","EPSG","4269","ESRI","102631",-131.59595333333334,54.65073722222222,"",3124531.426,1035343.511,"",0.1,0.1,0.0,"","PROJ4 test83","","Bug in Proj4J Obl Merc" -"NAD83 State Plane CS - AK 1 ","Proj4j","EPSG","4269","ESRI","102631",-129.54166666666666,54.541666666666664,"",3561448.345,1015025.876,"",0.1,0.1,0.0,"","PROJ4 test83","","Bug in Proj4J Obl Merc" -"NAD83 State Plane CS - AK 1 ","Proj4j","EPSG","4269","ESRI","102631",-141.5,60.5,"",1276328.587,3248159.207,"",0.1,0.1,0.0,"","PROJ4 test83","","Bug in Proj4J Obl Merc" -"NAD83 State Plane CS - AK 2 ","Proj4j","EPSG","4269","ESRI","102632",-142.0,56.50833333333333,"",1640416.667,916074.825,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 3 ","Proj4j","EPSG","4269","ESRI","102633",-146.0,56.50833333333333,"",1640416.667,916074.825,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 4 ","Proj4j","EPSG","4269","ESRI","102634",-150.0,56.50833333333333,"",1640416.667,916074.825,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 5 ","Proj4j","EPSG","4269","ESRI","102635",-152.48225944444445,60.89132361111111,"",1910718.662,2520810.68,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 5 ","Proj4j","EPSG","4269","ESRI","102635",-154.0,56.50833333333333,"",1640416.667,916074.825,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 6 ","Proj4j","EPSG","4269","ESRI","102636",-155.0,71.0,"",1998036.998,6224208.217,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 6 ","Proj4j","EPSG","4269","ESRI","102636",-158.0,71.0,"",1640416.667,6215353.367,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 7 ","Proj4j","EPSG","4269","ESRI","102637",-162.0,65.25,"",1640416.667,4111446.441,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 8 ","Proj4j","EPSG","4269","ESRI","102638",-166.0,65.25,"",1640416.667,4111446.441,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK 9 ","Proj4j","EPSG","4269","ESRI","102639",-170.0,63.333333333333336,"",1640416.667,3410489.717,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK10 ","Proj4j","EPSG","4269","ESRI","102640",-164.04166666666666,54.458333333333336,"",5814167.604,1473788.834,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AK10 ","Proj4j","EPSG","4269","ESRI","102640",-176.0,52.5,"",3280833.333,547580.542,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AL E ","Proj4j","EPSG","4269","ESRI","102629",-85.83333333333333,31.333333333333332,"",656166.667,303104.183,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AL E ","Proj4j","EPSG","4269","ESRI","102629",-85.21159388888888,32.64937138888889,"",847539.085,782420.807,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AL E ","Proj4j","EPSG","4269","ESRI","102629",-86.61629722222222,34.81630777777777,"",421151.975,1571298.908,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AL W ","Proj4j","EPSG","4269","ESRI","102630",-87.5,33.333333333333336,"",1968500.0,1212527.587,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AL W ","Proj4j","EPSG","4269","ESRI","102630",-87.5,33.34166666666667,"",1968500.0,1215559.708,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AR N ","Proj4j","EPSG","4269","ESRI","102651",-91.5795336111111,35.31040083333333,"",1437779.156,355900.759,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AR N ","Proj4j","EPSG","4269","ESRI","102651",-92.06989583333333,35.326185833333334,"",1291483.982,361385.695,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AR S ","Proj4j","EPSG","4269","ESRI","102652",-92.0,34.75,"",1312333.333,2070451.744,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AR S ","Proj4j","EPSG","4269","ESRI","102652",-92.0,33.25,"",1312333.333,1524603.73,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ C ","Proj4j","EPSG","4269","ESRI","102649",-111.91666666666667,34.75,"",699998.6,1364309.666,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ C ","Proj4j","EPSG","4269","ESRI","102649",-111.91666666666667,32.333333333333336,"",699998.6,484994.34,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ E ","Proj4j","EPSG","4269","ESRI","102648",-110.41660305555556,35.16626888888889,"",625301.46,1515899.83,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ E ","Proj4j","EPSG","4269","ESRI","102648",-109.5758686111111,31.99808416666667,"",883142.524,363539.663,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ E ","Proj4j","EPSG","4269","ESRI","102648",-110.50970777777778,35.12451194444444,"",597423.277,1500785.235,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ E ","Proj4j","EPSG","4269","ESRI","102648",-109.75367388888888,32.144938333333336,"",827818.955,416705.394,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ W ","Proj4j","EPSG","4269","ESRI","102650",-113.75,34.75,"",699998.6,1364355.147,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ W ","Proj4j","EPSG","4269","ESRI","102650",-113.75,34.75833333333333,"",699998.6,1367387.968,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - AZ W ","Proj4j","EPSG","4269","ESRI","102650",-113.75,34.766666666666666,"",699998.6,1370420.793,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 1 ","Proj4j","EPSG","4269","ESRI","102641",-122.0,41.5,"",6561666.667,2429744.729,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 1 ","Proj4j","EPSG","4269","ESRI","102641",-122.0,41.50833333333333,"",6561666.667,2432781.128,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 2 ","Proj4j","EPSG","4269","ESRI","102642",-122.0,39.333333333333336,"",6561666.667,2247404.25,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 2 ","Proj4j","EPSG","4269","ESRI","102642",-122.0,39.34166666666667,"",6561666.667,2250439.391,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 3 ","Proj4j","EPSG","4269","ESRI","102643",-120.5,37.083333333333336,"",6561666.667,1852815.76,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 3 ","Proj4j","EPSG","4269","ESRI","102643",-121.37389416666666,37.50842333333333,"",6308189.835,2008776.145,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 3 ","Proj4j","EPSG","4269","ESRI","102643",-119.77575916666666,37.12818611111111,"",6772808.251,1869963.783,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 3 ","Proj4j","EPSG","4269","ESRI","102643",-119.64067611111112,36.9300025,"",6812851.254,1798140.563,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 3 ","Proj4j","EPSG","4269","ESRI","102643",-120.71660527777777,38.114670833333335,"",6499349.432,2228414.867,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 4 ","Proj4j","EPSG","4269","ESRI","102644",-119.0,36.333333333333336,"",6561666.667,2004462.102,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 4 ","Proj4j","EPSG","4269","ESRI","102644",-119.0,36.34166666666667,"",6561666.667,2007495.782,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 5 ","Proj4j","EPSG","4269","ESRI","102645",-118.0,34.75,"",6561666.667,2095323.781,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 5 ","Proj4j","EPSG","4269","ESRI","102645",-118.0,34.75833333333333,"",6561666.667,2098356.568,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 6 ","Proj4j","EPSG","4269","ESRI","102646",-116.25,33.333333333333336,"",6561666.667,2064911.626,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 6 ","Proj4j","EPSG","4269","ESRI","102646",-116.25,33.34166666666667,"",6561666.667,2067943.81,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CA 6 ","Proj4j","EPSG","4269","ESRI","102646",-118.33333333333333,34.5,"",5933874.572,2495758.727,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CO C ","Proj4j","EPSG","4269","ESRI","102654",-105.5,39.25,"",3000000.0,1515946.82,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CO C ","Proj4j","EPSG","4269","ESRI","102654",-105.5,39.25833333333333,"",3000000.0,1518981.963,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CO N ","Proj4j","EPSG","4269","ESRI","102653",-108.76538277777777,40.42597333333333,"",2091110.958,1414758.884,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CO N ","Proj4j","EPSG","4269","ESRI","102653",-105.24599666666667,40.21186416666667,"",3070938.779,1320125.979,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CO S ","Proj4j","EPSG","4269","ESRI","102655",-105.5,37.5,"",3000000.0,1303432.168,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CO S ","Proj4j","EPSG","4269","ESRI","102655",-105.5,37.50833333333333,"",3000000.0,1306466.471,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CT ","Proj4j","EPSG","4269","ESRI","102656",-72.72514305555556,41.282179722222224,"",1006831.954,663542.786,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - CT ","Proj4j","EPSG","4269","ESRI","102656",-73.0210025,41.22388472222222,"",925448.22,642418.129,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - DE ","Proj4j","EPSG","4269","ESRI","102657",-75.55020777777777,39.35422611111111,"",618403.524,493238.843,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - DE ","Proj4j","EPSG","4269","ESRI","102657",-75.31719138888889,39.75410138888889,"",684135.532,638883.528,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - FL N ","Proj4j","EPSG","4269","ESRI","102660",-82.76455888888889,29.651830277777776,"",2519743.236,241248.726,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - FL N ","Proj4j","EPSG","4269","ESRI","102660",-84.91987027777778,29.647772777777778,"",1835122.674,235823.399,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - GA E ","Proj4j","EPSG","4269","ESRI","102666",-81.45433111111112,32.6341675,"",875449.222,958850.568,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - GA E ","Proj4j","EPSG","4269","ESRI","102666",-83.26110833333334,33.49961833333334,"",322535.391,1274748.301,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 1 ","Proj4j","EPSG","4269","ESRI","102661",-155.9880308333333,19.623188055555556,"",1472470.137,287083.198,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 1 ","Proj4j","EPSG","4269","ESRI","102661",-155.30173944444445,19.523493888888886,"",1708685.701,250676.24,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 1 ","Proj4j","EPSG","4269","ESRI","102661",-155.5,19.7,"",1640416.667,314739.275,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 1 ","Proj4j","EPSG","4269","ESRI","102661",-155.5,19.708333333333332,"",1640416.667,317765.76,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 2 ","Proj4j","EPSG","4269","ESRI","102662",-156.66666666666666,20.7,"",1640416.667,133177.588,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 2 ","Proj4j","EPSG","4269","ESRI","102662",-156.66666666666666,20.708333333333332,"",1640416.667,136204.417,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 3 ","Proj4j","EPSG","4269","ESRI","102663",-158.0,21.5,"",1640416.667,121084.931,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 3 ","Proj4j","EPSG","4269","ESRI","102663",-158.025,21.625,"",1631925.017,166493.704,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 4 ","Proj4j","EPSG","4269","ESRI","102664",-159.5,22.083333333333332,"",1640416.667,90820.525,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - HI 5 ","Proj4j","EPSG","4269","ESRI","102665",-160.16666666666666,21.7,"",1640416.667,12109.121,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IA N ","Proj4j","EPSG","4269","ESRI","102675",-93.47610166666666,42.74725027777778,"",4927669.136,3735362.601,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IA N ","Proj4j","EPSG","4269","ESRI","102675",-93.90613444444445,42.67324972222222,"",4812032.409,3708655.393,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ID E ","Proj4j","EPSG","4269","ESRI","102668",-111.70828444444444,43.80211555555555,"",777180.67,778579.414,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ID E ","Proj4j","EPSG","4269","ESRI","102668",-112.37653222222221,43.59062777777778,"",600566.613,701226.817,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ID W ","Proj4j","EPSG","4269","ESRI","102670",-116.36738666666666,48.13081694444445,"",2473902.726,2357266.577,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IL E ","Proj4j","EPSG","4269","ESRI","102671",-88.11855277777777,41.76995972222222,"",1042839.901,1858837.259,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IL E ","Proj4j","EPSG","4269","ESRI","102671",-88.69311333333334,40.727000555555556,"",884532.422,1478959.912,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN E ","Proj4j","EPSG","4269","ESRI","102673",-85.66666666666667,40.0,"",328083.333,1730697.447,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN E ","Proj4j","EPSG","4269","ESRI","102673",-85.66666666666667,40.00833333333333,"",328083.333,1733733.066,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN E ","Proj4j","EPSG","4269","ESRI","102673",-86.24105,40.003525,"",167175.533,1732499.995,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN E ","Proj4j","EPSG","4269","ESRI","102673",-86.24105277777778,40.00879444444445,"",167187.126,1734419.54,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN E ","Proj4j","EPSG","4269","ESRI","102673",-86.24113972222223,40.01317,"",167173.047,1736013.616,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-87.08333333333333,40.0,"",2952750.0,1730697.447,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-87.08333333333333,40.00833333333333,"",2952750.0,1733733.066,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-86.75297694444444,39.69023333333333,"",3045717.498,1618031.699,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-87.6955763888889,37.90687638888889,"",2776105.988,968944.255,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-86.53699416666666,39.5462275,"",3106817.69,1565874.113,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-87.42407638888889,38.438235,"",2855150.544,1162044.125,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-86.24113972222223,40.01317,"",3188649.79,1736609.724,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-86.24105,40.003525,"",3188708.13,1733096.467,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - IN W ","Proj4j","EPSG","4269","ESRI","102674",-86.24105277777778,40.00879444444445,"",3188689.21,1735016.02,"",1,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - KS N ","Proj4j","EPSG","4269","ESRI","102677",-96.79849083333333,38.98113777777778,"",1653880.047,238201.11,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - KS N ","Proj4j","EPSG","4269","ESRI","102677",-98.58998722222222,39.97832416666667,"",1146983.46,599694.197,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - KY N ","Proj4j","EPSG","4269","ESRI","102679",-84.09535638888889,38.24332305555556,"",1684830.325,270726.733,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - KY N ","Proj4j","EPSG","4269","ESRI","102679",-84.44701805555556,39.067527500000004,"",1584475.157,570918.805,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA N ","Proj4j","EPSG","4269","ESRI","102681",-91.5795786111111,31.95728972222222,"",3566283.41,531318.874,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA N ","Proj4j","EPSG","4269","ESRI","102681",-92.87961527777777,32.914517777777775,"",3164322.062,878564.036,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA N ","Proj4j","EPSG","4269","ESRI","102681",-91.48596666666667,31.945755833333333,"",3595353.711,527382.519,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA N ","Proj4j","EPSG","4269","ESRI","102681",-93.99395583333333,32.81207416666666,"",2821809.119,844247.864,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.0,28.833333333333332,"",4027995.272,128836.33,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.5,28.833333333333332,"",3867904.667,125925.406,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.49999972222223,29.333331666666666,"",3864995.756,307730.82,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.00000111111112,29.333332777777777,"",4024292.645,310627.715,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.17319083333334,29.342393055555554,"",3969054.663,312839.922,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.10961999999999,29.255456111111112,"",3989919.298,281618.678,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.02605638888889,29.129977222222223,"",4017480.813,236523.957,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - LA S ","Proj4j","EPSG","4269","ESRI","102682",-89.14605027777779,28.97443861111111,"",3980254.597,179219.9,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MA M ","Proj4j","EPSG","4269","ESRI","102686",-70.45019888888889,41.671057777777776,"",942982.782,2706924.168,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MA M ","Proj4j","EPSG","4269","ESRI","102686",-73.43310361111112,42.101905555555554,"",131613.265,2868104.007,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MD ","Proj4j","EPSG","4269","ESRI","102685",-76.19097000000001,39.201703333333334,"",1541600.105,560062.872,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MD ","Proj4j","EPSG","4269","ESRI","102685",-77.04177944444444,38.44374777777777,"",1300367.185,283004.738,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MD ","Proj4j","EPSG","4269","ESRI","102685",-77.50290555555556,38.99052861111111,"",1169392.711,482527.897,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ME E ","Proj4j","EPSG","4269","ESRI","102683",-68.40708027777778,46.546366666666664,"",1007629.154,1049880.999,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ME E ","Proj4j","EPSG","4269","ESRI","102683",-68.62482388888888,47.03684972222222,"",953127.598,1228762.971,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MI S ","Proj4j","EPSG","4269","ESRI","102690",-83.48831083333333,42.322027500000004,"",13360865.013,300809.378,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MI S ","Proj4j","EPSG","4269","ESRI","102690",-83.59018222222221,42.33407833333334,"",13333276.507,304929.978,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MI S ","Proj4j","EPSG","4269","ESRI","102690",-85.92404694444446,41.83617666666667,"",12698916.149,126441.631,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MI S ","Proj4j","EPSG","4269","ESRI","102690",-85.766525,41.82287388888889,"",12741759.24,120840.463,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MN N ","Proj4j","EPSG","4269","ESRI","102691",-91.4642175,47.138660277777774,"",3031741.394,565338.6,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MN N ","Proj4j","EPSG","4269","ESRI","102691",-95.8516661111111,48.324042222222225,"",1955378.869,1005314.701,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MO C ","Proj4j","EPSG","4269","ESRI","102697",-92.5,38.25,"",1640416.667,879854.176,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MO C ","Proj4j","EPSG","4269","ESRI","102697",-92.5,38.25833333333333,"",1640416.667,882888.78,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MO E ","Proj4j","EPSG","4269","ESRI","102696",-91.70119361111111,37.368314444444444,"",471136.507,561031.592,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MO E ","Proj4j","EPSG","4269","ESRI","102696",-90.13580444444445,36.89559,"",926703.606,386902.829,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MO W ","Proj4j","EPSG","4269","ESRI","102698",-94.5,38.25,"",2788708.333,758522.219,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MO W ","Proj4j","EPSG","4269","ESRI","102698",-94.5,38.25833333333333,"",2788708.333,761556.846,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MS E ","Proj4j","EPSG","4269","ESRI","102694",-89.17055916666668,30.514260555555555,"",878059.046,369015.468,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MS E ","Proj4j","EPSG","4269","ESRI","102694",-88.43453833333334,30.717070555555555,"",1109567.483,442842.466,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MT N ","Proj4j","EPSG","4269","ESRI","102700",-106.48653361111111,47.872528611111115,"",2707564.623,1334850.273,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - MT N ","Proj4j","EPSG","4269","ESRI","102700",-114.51197833333333,48.87965666666667,"",763315.457,1726511.247,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NC ","Proj4j","EPSG","4269","ESRI","102719",-81.20883055555556,35.15862472222222,"",1339869.379,520003.003,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NC ","Proj4j","EPSG","4269","ESRI","102719",-76.53192166666666,35.56429222222222,"",2733923.842,669426.932,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NC ","Proj4j","EPSG","4269","ESRI","102719",-78.47405,36.2543,"",2155084.559,911885.081,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ND N ","Proj4j","EPSG","4269","ESRI","102720",-98.76756444444445,48.13707861111111,"",2391470.474,419526.909,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - ND N ","Proj4j","EPSG","4269","ESRI","102720",-101.30596,47.65525972222222,"",1769873.906,240054.79,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NE N ","Proj4j","EPSG","4269","ESRI","102704",-96.2980361111111,42.080084722222225,"",2644820.409,839912.565,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NE N ","Proj4j","EPSG","4269","ESRI","102704",-100.8241525,41.98167361111111,"",1416403.828,783622.046,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NH ","Proj4j","EPSG","4269","ESRI","102710",-70.93646861111111,43.137501666666665,"",1179151.981,233188.62,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NH ","Proj4j","EPSG","4269","ESRI","102710",-72.54227694444444,42.85721777777778,"",749470.166,131406.173,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NJ ","Proj4j","EPSG","4269","ESRI","102711",-74.23214916666667,39.86724861111111,"",567304.543,376673.733,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NJ ","Proj4j","EPSG","4269","ESRI","102711",-74.85668277777778,41.20205583333333,"",393979.614,863010.549,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NM C ","Proj4j","EPSG","4269","ESRI","102713",-106.25,33.5,"",1640416.667,909448.493,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NM C ","Proj4j","EPSG","4269","ESRI","102713",-106.25,33.50833333333333,"",1640416.667,912480.595,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NM E ","Proj4j","EPSG","4269","ESRI","102712",-104.1951138888889,33.28937,"",583573.491,832847.194,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NM E ","Proj4j","EPSG","4269","ESRI","102712",-104.79387444444444,33.3756525,"",400747.149,864523.566,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NM W ","Proj4j","EPSG","4269","ESRI","102714",-107.83333333333333,32.5,"",2723091.667,545634.896,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NM W ","Proj4j","EPSG","4269","ESRI","102714",-107.83333333333333,32.50833333333333,"",2723091.667,548666.562,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NV E ","Proj4j","EPSG","4269","ESRI","102707",-114.81926027777777,35.71924972222222,"",882966.545,26600313.129,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NV E ","Proj4j","EPSG","4269","ESRI","102707",-116.842435,41.51051916666667,"",311338.993,28710910.565,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY E ","Proj4j","EPSG","4269","ESRI","102715",-74.04824194444444,42.28382638888889,"",614362.369,1257287.611,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY E ","Proj4j","EPSG","4269","ESRI","102715",-74.7443938888889,42.502050555555556,"",426225.275,1336579.561,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY L ","Proj4j","EPSG","4269","ESRI","102718",-73.04340194444444,40.79739555555555,"",1249103.533,231235.845,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY L ","Proj4j","EPSG","4269","ESRI","102718",-74.11614583333333,40.602022500000004,"",951997.667,158630.811,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY L ","Proj4j","EPSG","4269","ESRI","102718",-74.0,40.75,"",984250.0,212521.887,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY L ","Proj4j","EPSG","4269","ESRI","102718",-73.25,40.625,"",1192442.028,167871.999,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - NY L ","Proj4j","EPSG","4269","ESRI","102718",-73.375,40.75,"",1157419.074,213139.664,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - OH N ","Proj4j","EPSG","4269","ESRI","102722",-80.82451055555555,40.297470555555556,"",2435851.621,234309.717,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - OH N ","Proj4j","EPSG","4269","ESRI","102722",-82.6252836111111,40.33741055555556,"",1933572.857,244396.244,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - OK N ","Proj4j","EPSG","4269","ESRI","102724",-98.712615,36.83876888888889,"",1759953.675,670136.468,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - OK N ","Proj4j","EPSG","4269","ESRI","102724",-95.64556833333334,35.34359027777778,"",2670659.833,133589.112,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - OR S ","Proj4j","EPSG","4269","ESRI","102727",-119.774045,44.40720638888889,"",5110990.827,999684.042,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - OR S ","Proj4j","EPSG","4269","ESRI","102727",-121.16558472222223,44.38581222222222,"",4747225.642,991752.635,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PA N ","Proj4j","EPSG","4269","ESRI","102728",-74.55573444444444,41.39682388888889,"",2844678.533,464365.61,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PA N ","Proj4j","EPSG","4269","ESRI","102728",-78.16336694444445,40.85984861111111,"",1854155.505,252833.7,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR F ","Proj4j","EPSG","4269","ESRI","102761",-67.14914722222223,18.49915888888889,"",408161.046,898432.808,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR F ","Proj4j","EPSG","4269","ESRI","102761",-66.875,18.25,"",502925.44,807654.009,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR F ","Proj4j","EPSG","4269","ESRI","102761",-66.43333333333334,18.25,"",656166.667,807469.207,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR F ","Proj4j","EPSG","4269","ESRI","102761",-66.43333333333334,18.5,"",656166.667,898253.524,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR M ","Proj4j","EPSG","4269","ESRI","102761",-67.14914722222223,18.49915888888889,"",408161.046,898432.808,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR M ","Proj4j","EPSG","4269","ESRI","102761",-66.875,18.25,"",502925.44,807654.009,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR M ","Proj4j","EPSG","4269","ESRI","102761",-66.43333333333334,18.25,"",656166.667,807469.207,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - PR M ","Proj4j","EPSG","4269","ESRI","102761",-66.43333333333334,18.5,"",656166.667,898253.524,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - RI ","Proj4j","EPSG","4269","ESRI","102730",-71.26689805555556,41.540235555555554,"",391898.667,166566.121,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - RI ","Proj4j","EPSG","4269","ESRI","102730",-71.62048055555555,41.39812944444444,"",295027.785,114722.837,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - SC N ","Proj4j","EPSG","4269","ESRI","102733",-80.54166666666667,34.541666666666664,"",2138015.48,985710.127,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - SC N ","Proj4j","EPSG","4269","ESRI","102733",-81.0,34.541666666666664,"",1999996.0,985404.077,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - SC S ","Proj4j","EPSG","4269","ESRI","102733",-80.54166666666667,33.541666666666664,"",2139629.138,621856.156,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - SC S ","Proj4j","EPSG","4269","ESRI","102733",-81.0,33.541666666666664,"",1999996.0,621546.527,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - SD N ","Proj4j","EPSG","4269","ESRI","102734",-99.2061063888889,44.10225583333334,"",2177060.848,99066.761,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - SD N ","Proj4j","EPSG","4269","ESRI","102734",-100.5413536111111,44.543032499999995,"",1827356.33,259209.712,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - TN ","Proj4j","EPSG","4269","ESRI","102736",-85.23221305555556,36.36347305555556,"",2194569.476,739881.374,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - TN ","Proj4j","EPSG","4269","ESRI","102736",-88.71829138888889,36.50233611111111,"",1169616.875,800645.091,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - TX N ","Proj4j","EPSG","4269","ESRI","102737",-100.55175083333333,34.65991222222222,"",941333.504,3522390.511,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - TX N ","Proj4j","EPSG","4269","ESRI","102737",-102.81415249999999,34.72756916666667,"",261294.654,3548271.494,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - UT C ","Proj4j","EPSG","4269","ESRI","102743",-111.5,38.666666666666664,"",1640416.667,6683084.515,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - UT C ","Proj4j","EPSG","4269","ESRI","102743",-111.5,38.675,"",1640416.667,6686119.851,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - UT N ","Proj4j","EPSG","4269","ESRI","102742",-111.5,41.5,"",1640416.667,3705897.565,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - UT N ","Proj4j","EPSG","4269","ESRI","102742",-111.5,41.50833333333333,"",1640416.667,3708933.975,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - UT S ","Proj4j","EPSG","4269","ESRI","102744",-109.81054638888888,38.49191027777778,"",2123972.902,10511502.846,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - UT S ","Proj4j","EPSG","4269","ESRI","102744",-113.88247833333332,37.15521888888889,"",946139.893,10029235.592,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA N ","Proj4j","EPSG","4269","ESRI","102746",-77.22970694444444,38.920113055555554,"",11844323.043,7020638.975,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA N ","Proj4j","EPSG","4269","ESRI","102746",-79.31432138888889,38.16639444444444,"",11248797.976,6744688.474,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA N ","Proj4j","EPSG","4269","ESRI","102746",-77.63633972222223,37.823323333333335,"",11732395.294,6619889.59,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA N ","Proj4j","EPSG","4269","ESRI","102746",-79.43874305555556,37.79051444444444,"",11211628.032,6608155.232,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA N ","Proj4j","EPSG","4269","ESRI","102746",-77.74176,39.00189,"",11698399.159,7048812.266,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA N ","Proj4j","EPSG","4269","ESRI","102746",-77.72972583333333,38.998737222222225,"",11701828.676,7047692.496,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA S ","Proj4j","EPSG","4269","ESRI","102747",-78.5,37.5,"",11482916.667,3705606.876,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA S ","Proj4j","EPSG","4269","ESRI","102747",-78.5,37.50833333333333,"",11482916.667,3708641.137,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA S ","Proj4j","EPSG","4269","ESRI","102747",-77.5425,36.9118075,"",11762849.074,3492868.579,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VA S ","Proj4j","EPSG","4269","ESRI","102747",-77.36548111111111,38.08163916666667,"",11809480.679,3919367.025,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VI F ","Proj4j","EPSG","4269","ESRI","102761",-64.75833333333334,17.758333333333333,"",1238952.313,631597.723,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VI F ","Proj4j","EPSG","4269","ESRI","102761",-66.43333333333334,17.765673888888887,"",656166.667,631597.858,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VI M ","Proj4j","EPSG","4269","ESRI","102761",-64.75833333333334,17.758333333333333,"",1238952.313,631597.723,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VI M ","Proj4j","EPSG","4269","ESRI","102761",-66.43333333333334,17.765673888888887,"",656166.667,631597.858,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VT ","Proj4j","EPSG","4269","ESRI","102745",-72.49206055555555,43.16625722222222,"",1642534.834,242819.594,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - VT ","Proj4j","EPSG","4269","ESRI","102745",-73.20193833333333,44.37300277777778,"",1456873.971,683480.189,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WA N ","Proj4j","EPSG","4269","ESRI","102748",-119.86027944444444,47.84751916666667,"",1879336.368,310659.11,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WA N ","Proj4j","EPSG","4269","ESRI","102748",-123.99696861111111,48.15809194444444,"",868484.545,438307.526,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WI N ","Proj4j","EPSG","4269","ESRI","102752",-88.74466055555555,45.37266611111111,"",2291123.165,77666.637,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WI N ","Proj4j","EPSG","4269","ESRI","102752",-92.20535416666667,45.80994777777777,"",1406198.343,242375.264,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WV N ","Proj4j","EPSG","4269","ESRI","102750",-77.8942413888889,39.244260833333335,"",2423253.113,275144.536,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WV N ","Proj4j","EPSG","4269","ESRI","102750",-81.55654138888889,39.30237083333333,"",1386588.889,298906.239,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WV N ","Proj4j","EPSG","4269","ESRI","102750",-77.50290555555556,38.99052861111111,"",2536117.742,184974.384,"",0.1,0.1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WY E ","Proj4j","EPSG","4269","ESRI","102755",-105.51746722222222,43.51127777777778,"",563107.342,1097477.489,"",0.5,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WY E ","Proj4j","EPSG","4269","ESRI","102755",-105.3785711111111,43.50407916666666,"",599946.619,1094729.119,"",0.5,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WY E ","Proj4j","EPSG","4269","ESRI","102755",-105.47856305555555,43.609275277777776,"",573561.723,1133155.514,"",0.5,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WY E ","Proj4j","EPSG","4269","ESRI","102755",-105.39533972222223,42.01650611111111,"",594028.794,552611.396,"",0.5,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WY E ","Proj4j","EPSG","4269","ESRI","102755",-104.58519055555556,42.58065722222223,"",812768.62,758647.94,"",0.5,1,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WYEC ","Proj4j","EPSG","4269","ESRI","102756",-106.21756222222223,41.60406666666667,"",1617477.77,732300.77,"",0.5,0.5,0.0,"","PROJ4 test83","","" -"NAD83 State Plane CS - WYEC ","Proj4j","EPSG","4269","ESRI","102756",-108.03242222222222,41.86597722222222,"",1121920.469,826536.345,"",0.5,0.5,0.0,"","PROJ4 test83","","" diff --git a/core/src/test/resources/TestData.csv b/core/src/test/resources/TestData.csv deleted file mode 100644 index 39e5619..0000000 --- a/core/src/test/resources/TestData.csv +++ /dev/null @@ -1,6 +0,0 @@ -# Version: 00.12.00 -# This file is provided as part of the MetaCRS Project at the OSGeo. It is released into the public domain. -# You use this file AT YOUR OWN RISK! The OSGeo, OSGeo Members, MetaCRS Members, and contributors to this file do not -# make any warranties or statements about its accuracy or correctness. -testName,testMethod,srcCrsAuth,srcCrs,tgtCrsAuth,tgtCrs,srcOrd1,srcOrd2,srcOrd3,tgtOrd1,tgtOrd2,tgtOrd3,tolOrd1,tolOrd2,tolOrd3,using,dataSource,dataCmnts,maintenanceCmnts -WGS84 Geographic 2D to CSPC Z3 USFT NAD83,CRS2D,EPSG,4326,EPSG,2227,-121.3128278,37.95657778,,6327319.23,2171792.15,,0.05,0.05,,,Trimble Business Center 1.10,The latitude and longitude values provided as the source CRS ordinate values were obtained from Google Earth Version X for the approximate location of the KSN Inc. Office in Stockton California. These latitude and longitude values were calculated to California State Plane Coordinates Zone 3 United States Survey Feet using Version 1.10 of Trimble Business Center. The latitude and longitude values were inserted into TGO in Degrees-Minutes-Seconds format. These values were 37-57-23.68000 and -121.18-46.80000. The decimal degrees format for these latitude and longitude values provided in the Source CRS columns were converted by hand from the Degrees-Minutes-Seconds format by Landon Blake.,The latitude and longitude values provided as the source CRS ordinate values were obtained from Google Earth Version X for the approximate location of the KSN Inc. Office in Stockton California. These latitude and longitude values were calculated to California State Plane Coordinates Zone 3 United States Survey Feet using Version 1.10 of Trimble Business Center. The latitude and longitude values were inserted into TGO in Degrees-Minutes-Seconds format. These values were 37-57-23.68000 and -121.18-46.80000. The decimal degrees format for these latitude and longitude values provided in the Source CRS columns were converted by hand from the Degrees-Minutes-Seconds format by Landon Blake. diff --git a/core/src/test/resources/org/locationtech/proj4j/determinism/strictmath-golden.tsv b/core/src/test/resources/org/locationtech/proj4j/determinism/strictmath-golden.tsv new file mode 100644 index 0000000..02aa1af --- /dev/null +++ b/core/src/test/resources/org/locationtech/proj4j/determinism/strictmath-golden.tsv @@ -0,0 +1,54303 @@ +# proj4j StrictMath golden table. +# +# Each data line is the raw IEEE-754 bits of a StrictMath result, 16 lower-case hex +# digits, unsigned. Arguments are NOT stored: they are regenerated by +# TranscendentalProbes, which is the single source of truth for them. A '@fn n' +# line introduces n results for that function, in probe order, and carries a digest +# of that function's argument bits so a probe list that generates DIFFERENT +# arguments on some JDK fails once, saying so, instead of as a flood of result +# mismatches naming plausible-looking arguments. That is not hypothetical: building +# the probes with Math.toRadians made the list differ on Java 8, because Java 9 +# changed that method by 1 ulp on 25% of whole degrees. +# +# This table is only meaningful because StrictMath is specified to a bit rather than +# to an ulp. The same table would be unsound for Math, whose results HotSpot may +# substitute per architecture - which is the divergence StrictMathGoldenTableTest's +# negative control measures. +# +# Regenerate with GenerateStrictMathGoldenTable. Read its javadoc first: a +# regenerated table is a new claim, and never a way to make a failing test pass. +@sin 7399 c3b00fb2f01a4457 +0000000000000000 +8000000000000000 +bca1a62633145c07 +bf91df0b2b89dd09 +bfa1de58c9f7dc40 +bfaacbc748efc90a +bfb1db8f6d6a5138 +bfb64fd6b8c28104 +bfbac2609b3c577f +bfbf32d44c4f62d8 +bfc1d06c968d9e15 +bfc4060b67a85379 +bfc63a1a7e0b7387 +bfc86c6ddd766255 +bfca9cd9ac4258f5 +bfcccb3236cdc67c +bfcef74bf2e4b91d +bfd0907dc1930695 +bfd1a40add328e2a +bfd2b637cf83d5c5 +bfd3c6ef372fe951 +bfd4d61bd000cdda +bfd5e3a8748a0bf8 +bfd6ef801fced33b +bfd7f98deee59685 +bfd901bd2298ffab +bfda07f921061ad5 +bfdb0c2d77379854 +bfdc0e45dabe05c6 +bfdd0e2e2b44de02 +bfde0bd274245077 +bfdf071eedefa0ef +bfdfffffffffffff +bfe07b3120fddf15 +bfe0f5193eacdd2a +bfe16daed770771f +bfe1e4e88411fd13 +bfe25abcf87c4977 +bfe2cf2304755a5f +bfe342119455beb5 +bfe3b37fb1bdc93a +bfe4236484487abd +bfe491b7523c161e +bfe4fe6f81384fd4 +bfe5698496e20bd9 +bfe5d2ee398c9c2c +bfe63aa430e0730f +bfe6a09e667f3bcd +bfe704d4e6a54d38 +bfe7673fe0c86983 +bfe7c7d7a833bec2 +bfe82694b4a11c38 +bfe8836fa2cf5039 +bfe8de613515a329 +bfe9376253f463d2 +bfe98e6c0ea27a13 +bfe9e3779b97f4a8 +bfea367e59158746 +bfea8779cda8eea5 +bfead663a8ae2fdc +bfeb2335c2cda946 +bfeb6dea1e76eade +bfebb67ae8584cab +bfebfce277d339c7 +bfec411b4f6d2707 +bfec83201d3d2c6d +bfecc2ebbb5638c9 +bfed0079302dd768 +bfed3bc3aeff7f95 +bfed74c6982c666e +bfedab7d7997cb58 +bfeddfe40effb805 +bfee11f642522d1c +bfee41b02bfeb4cb +bfee6f0e13445500 +bfee9a0c6e7bdb20 +bfeec2a7e35e7b80 +bfeee8dd4748bf15 +bfef0ca99f79ba25 +bfef2e0a214e870f +bfef4cfc327a0080 +bfef697d6938b6c2 +bfef838b8c811c17 +bfef9b24942fe45c +bfefb046a930947a +bfefc2f025a23e8c +bfefd31f94f867c6 +bfefe0d3b41815a2 +bfefec0b7170fff6 +bfeff4c5ed12e61d +bfeffb0278bf0567 +bfeffec097f5af8a +bff0000000000000 +bfeffec097f5af8a +bfeffb0278bf0567 +bfeff4c5ed12e61d +bfefec0b7170fff6 +bfefe0d3b41815a2 +bfefd31f94f867c6 +bfefc2f025a23e8b +bfefb046a930947a +bfef9b24942fe45c +bfef838b8c811c17 +bfef697d6938b6c2 +bfef4cfc327a007f +bfef2e0a214e870f +bfef0ca99f79ba25 +bfeee8dd4748bf15 +bfeec2a7e35e7b80 +bfee9a0c6e7bdb1f +bfee6f0e134454ff +bfee41b02bfeb4ca +bfee11f642522d1b +bfeddfe40effb805 +bfedab7d7997cb58 +bfed74c6982c666f +bfed3bc3aeff7f95 +bfed0079302dd767 +bfecc2ebbb5638ca +bfec83201d3d2c6c +bfec411b4f6d2707 +bfebfce277d339c6 +bfebb67ae8584caa +bfeb6dea1e76eade +bfeb2335c2cda946 +bfead663a8ae2fdc +bfea8779cda8eea5 +bfea367e59158747 +bfe9e3779b97f4a8 +bfe98e6c0ea27a14 +bfe9376253f463d2 +bfe8de613515a328 +bfe8836fa2cf5039 +bfe82694b4a11c37 +bfe7c7d7a833bec2 +bfe7673fe0c86982 +bfe704d4e6a54d39 +bfe6a09e667f3bcc +bfe63aa430e07310 +bfe5d2ee398c9c2b +bfe5698496e20bd8 +bfe4fe6f81384fd4 +bfe491b7523c161c +bfe4236484487abd +bfe3b37fb1bdc939 +bfe342119455beb6 +bfe2cf2304755a5e +bfe25abcf87c4978 +bfe1e4e88411fd13 +bfe16daed770771d +bfe0f5193eacdd2a +bfe07b3120fddf13 +bfdfffffffffffff +bfdf071eedefa0ed +bfde0bd274245079 +bfdd0e2e2b44de00 +bfdc0e45dabe05c8 +bfdb0c2d77379853 +bfda07f921061ad1 +bfd901bd2298ffab +bfd7f98deee59681 +bfd6ef801fced33c +bfd5e3a8748a0bf5 +bfd4d61bd000cddc +bfd3c6ef372fe94f +bfd2b637cf83d5c8 +bfd1a40add328e29 +bfd0907dc1930690 +bfcef74bf2e4b91d +bfcccb3236cdc675 +bfca9cd9ac4258f6 +bfc86c6ddd76624f +bfc63a1a7e0b7389 +bfc4060b67a85375 +bfc1d06c968d9e19 +bfbf32d44c4f62d3 +bfbac2609b3c576c +bfb64fd6b8c28102 +bfb1db8f6d6a5128 +bfaacbc748efc90e +bfa1de58c9f7dc27 +bf91df0b2b89dd1e +0000000000000000 +3f91df0b2b89dd1e +3fa1de58c9f7dc27 +3faacbc748efc90e +3fb1db8f6d6a5128 +3fb64fd6b8c28102 +3fbac2609b3c576c +3fbf32d44c4f62d3 +3fc1d06c968d9e19 +3fc4060b67a85375 +3fc63a1a7e0b7389 +3fc86c6ddd76624f +3fca9cd9ac4258f6 +3fcccb3236cdc675 +3fcef74bf2e4b91d +3fd0907dc1930690 +3fd1a40add328e29 +3fd2b637cf83d5c8 +3fd3c6ef372fe94f +3fd4d61bd000cddc +3fd5e3a8748a0bf5 +3fd6ef801fced33c +3fd7f98deee59681 +3fd901bd2298ffab +3fda07f921061ad1 +3fdb0c2d77379853 +3fdc0e45dabe05c8 +3fdd0e2e2b44de00 +3fde0bd274245079 +3fdf071eedefa0ed +3fdfffffffffffff +3fe07b3120fddf13 +3fe0f5193eacdd2a +3fe16daed770771d +3fe1e4e88411fd13 +3fe25abcf87c4978 +3fe2cf2304755a5e +3fe342119455beb6 +3fe3b37fb1bdc939 +3fe4236484487abd +3fe491b7523c161c +3fe4fe6f81384fd4 +3fe5698496e20bd8 +3fe5d2ee398c9c2b +3fe63aa430e07310 +3fe6a09e667f3bcc +3fe704d4e6a54d39 +3fe7673fe0c86982 +3fe7c7d7a833bec2 +3fe82694b4a11c37 +3fe8836fa2cf5039 +3fe8de613515a328 +3fe9376253f463d2 +3fe98e6c0ea27a14 +3fe9e3779b97f4a8 +3fea367e59158747 +3fea8779cda8eea5 +3fead663a8ae2fdc +3feb2335c2cda946 +3feb6dea1e76eade +3febb67ae8584caa +3febfce277d339c6 +3fec411b4f6d2707 +3fec83201d3d2c6c +3fecc2ebbb5638ca +3fed0079302dd767 +3fed3bc3aeff7f95 +3fed74c6982c666f +3fedab7d7997cb58 +3feddfe40effb805 +3fee11f642522d1b +3fee41b02bfeb4ca +3fee6f0e134454ff +3fee9a0c6e7bdb1f +3feec2a7e35e7b80 +3feee8dd4748bf15 +3fef0ca99f79ba25 +3fef2e0a214e870f +3fef4cfc327a007f +3fef697d6938b6c2 +3fef838b8c811c17 +3fef9b24942fe45c +3fefb046a930947a +3fefc2f025a23e8b +3fefd31f94f867c6 +3fefe0d3b41815a2 +3fefec0b7170fff6 +3feff4c5ed12e61d +3feffb0278bf0567 +3feffec097f5af8a +3ff0000000000000 +3feffec097f5af8a +3feffb0278bf0567 +3feff4c5ed12e61d +3fefec0b7170fff6 +3fefe0d3b41815a2 +3fefd31f94f867c6 +3fefc2f025a23e8c +3fefb046a930947a +3fef9b24942fe45c +3fef838b8c811c17 +3fef697d6938b6c2 +3fef4cfc327a0080 +3fef2e0a214e870f +3fef0ca99f79ba25 +3feee8dd4748bf15 +3feec2a7e35e7b80 +3fee9a0c6e7bdb20 +3fee6f0e13445500 +3fee41b02bfeb4cb +3fee11f642522d1c +3feddfe40effb805 +3fedab7d7997cb58 +3fed74c6982c666e +3fed3bc3aeff7f95 +3fed0079302dd768 +3fecc2ebbb5638c9 +3fec83201d3d2c6d +3fec411b4f6d2707 +3febfce277d339c7 +3febb67ae8584cab +3feb6dea1e76eade +3feb2335c2cda946 +3fead663a8ae2fdc +3fea8779cda8eea5 +3fea367e59158746 +3fe9e3779b97f4a8 +3fe98e6c0ea27a13 +3fe9376253f463d2 +3fe8de613515a329 +3fe8836fa2cf5039 +3fe82694b4a11c38 +3fe7c7d7a833bec2 +3fe7673fe0c86983 +3fe704d4e6a54d38 +3fe6a09e667f3bcd +3fe63aa430e0730f +3fe5d2ee398c9c2c +3fe5698496e20bd9 +3fe4fe6f81384fd4 +3fe491b7523c161e +3fe4236484487abd +3fe3b37fb1bdc93a +3fe342119455beb5 +3fe2cf2304755a5f +3fe25abcf87c4977 +3fe1e4e88411fd13 +3fe16daed770771f +3fe0f5193eacdd2a +3fe07b3120fddf15 +3fdfffffffffffff +3fdf071eedefa0ef +3fde0bd274245077 +3fdd0e2e2b44de02 +3fdc0e45dabe05c6 +3fdb0c2d77379854 +3fda07f921061ad5 +3fd901bd2298ffab +3fd7f98deee59685 +3fd6ef801fced33b +3fd5e3a8748a0bf8 +3fd4d61bd000cdda +3fd3c6ef372fe951 +3fd2b637cf83d5c5 +3fd1a40add328e2a +3fd0907dc1930695 +3fcef74bf2e4b91d +3fcccb3236cdc67c +3fca9cd9ac4258f5 +3fc86c6ddd766255 +3fc63a1a7e0b7387 +3fc4060b67a85379 +3fc1d06c968d9e15 +3fbf32d44c4f62d8 +3fbac2609b3c577f +3fb64fd6b8c28104 +3fb1db8f6d6a5138 +3faacbc748efc90a +3fa1de58c9f7dc40 +3f91df0b2b89dd09 +3ca1a62633145c07 +3ef24d1521168f98 +bef24d1521168f98 +3ebd4821ce88c2bb +bebd4821ce88c2bb +3ca1a62633145c07 +bca1a62633145c07 +3f81df37c4954c21 +bf81df37c4954c21 +3f9ace214390ca91 +bf9ace214390ca91 +3faacbc748efc90e +bfaacbc748efc90e +3fbac2609b3c576c +bfbac2609b3c576c +3fd5e3a8748a0bf5 +bfd5e3a8748a0bf5 +3fe6a09e667f3bcc +bfe6a09e667f3bcc +3fa902d64760ea4c +bfa902d64760ea4c +3fd3c6ef372fe94f +bfd3c6ef372fe94f +3fd6ba128d87fd8b +bfd6ba128d87fd8b +3fe5698496e20bd8 +bfe5698496e20bd8 +3fe82694b4a11c37 +bfe82694b4a11c37 +3fee11f642522d1b +bfee11f642522d1b +3fee892303700df8 +bfee892303700df8 +3feee8dd4748bf15 +bfeee8dd4748bf15 +3feffffcce4c8e64 +bfeffffcce4c8e64 +3fefffffffeb111d +bfefffffffeb111d +3ff0000000000000 +bff0000000000000 +3d719799812dea11 +bd719799812dea11 +3feb04bbff642e85 +bfeb04bbff642e85 +3fe39cef40ddac0a +bfe39cef40ddac0a +bfdf334c7896a4e3 +bfd85c5e5b929359 +3f7452fc98b34e97 +bf7452fc98b34e97 +0000000000000001 +8000000000000001 +0010000000000000 +bfcb963d50b6322a +3f0f9bd0303f6faf +3fe16c51c71d9462 +3fefbcb72e6a6f53 +bfbdfb6ace19deac +3d01a62633145c07 +3d2469898cc51702 +bd172cece675d1fd +3d3234c4c6628b81 +bd2b9676733ae8fe +3d11a62633145c07 +3d3469898cc51702 +bd272cece675d1fd +3d4234c4c6628b81 +bd3b9676733ae8fe +3fe6a09e667f3bed +3fe6a09e667f3ca2 +3fe6a09e667f3b38 +3fe6a09e667f3d58 +3fe6a09e667f3a83 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcf60b679ab8cd3b +bd3160b679ab8cd4 +3d2d3e930ca8e659 +bd40b05b3cd5c66a +3d3e9f498654732c +3fe6a09e667f3bce +3fe6a09e667f3b19 +3fe6a09e667f3c83 +3fe6a09e667f3a64 +3fe6a09e667f3d38 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cea81c996dfd5a5 +bd1cafc6cd24054b +3d21a81c996dfd5a +bd2e57e3669202a6 +3d30d40e4cb6fead +bcfa81c996dfd5a5 +3d2cafc6cd24054b +bd31a81c996dfd5a +3d3e57e3669202a6 +bd40d40e4cb6fead +bfe6a09e667f3ba9 +bfe6a09e667f3c5e +bfe6a09e667f3af4 +bfe6a09e667f3d13 +bfe6a09e667f3a3f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd269e20a6f0f0ef +bd3b4f1053787878 +3d12c3beb21e1e21 +bd45a78829bc3c3c +3d34b0efac878788 +bfe6a09e667f3b5e +bfe6a09e667f3aa9 +bfe6a09e667f3c13 +bfe6a09e667f39f4 +bfe6a09e667f3cc8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d108c7a80bddc93 +3d28463d405eee4a +bd0ee70afe8446d9 +3d34231ea02f7725 +bd27b9c2bfa111b6 +3d208c7a80bddc93 +3d38463d405eee4a +bd1ee70afe8446d9 +3d44231ea02f7725 +bd37b9c2bfa111b6 +3fe6a09e667f3c19 +3fe6a09e667f3cce +3fe6a09e667f3b64 +3fe6a09e667f3d83 +3fe6a09e667f3aaf +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd14f5a8b515906f +bd353d6a2d45641c +3d25852ba57537c9 +bd429eb516a2b20e +3d3ac295d2ba9be4 +3fe6a09e667f3ba3 +3fe6a09e667f3aee +3fe6a09e667f3c58 +3fe6a09e667f3a38 +3fe6a09e667f3d0c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf1a4b8d15ecf6d +bd2234971a2bd9ee +3d1b96d1cba84c25 +bd311a4b8d15ecf7 +3d2dcb68e5d42612 +3d01a4b8d15ecf6d +3d3234971a2bd9ee +bd2b96d1cba84c25 +3d411a4b8d15ecf7 +bd3dcb68e5d42612 +bfe6a09e667f3bd4 +bfe6a09e667f3c89 +bfe6a09e667f3b1f +bfe6a09e667f3d3f +bfe6a09e667f3a6a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cea877f1db6080c +bd2e57880e249f7f +3d30d43bf8edb040 +bd3f2bc407124fc0 +3d406a1dfc76d820 +bfe6a09e667f3be7 +bfe6a09e667f3b32 +bfe6a09e667f3c9c +bfe6a09e667f3a7d +bfe6a09e667f3d51 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d1845e1e7f18b23 +3d2c22f0f3f8c592 +bcfee8786039d373 +3d36117879fc62c9 +bd23dd0f0c073a6e +3d2845e1e7f18b23 +3d3c22f0f3f8c592 +bd0ee8786039d373 +3d46117879fc62c9 +bd33dd0f0c073a6e +3fe6a09e667f3c45 +3fe6a09e667f3cfa +3fe6a09e667f3b90 +3fe6a09e667f3daf +3fe6a09e667f3adb +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd22343bc1be76c7 +bd391a1de0df3b64 +3d1b97887c831272 +bd448d0ef06f9db2 +3d36e5e21f20c49c +3fe6a09e667f3b77 +3fe6a09e667f3ac2 +3fe6a09e667f3c2c +3fe6a09e667f3a0d +3fe6a09e667f3ce1 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd08452b3716c4d6 +bd26114acdc5b136 +3d13dd6a64749d95 +bd3308a566e2d89b +3d29eeb5323a4eca +3d18452b3716c4d6 +3d36114acdc5b136 +bd23dd6a64749d95 +3d4308a566e2d89b +bd39eeb5323a4eca +bfe6a09e667f3c00 +bfe6a09e667f3cb5 +bfe6a09e667f3b4b +bfe6a09e667f3d6a +bfe6a09e667f3a96 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0843bdd561383d +bd330877baac2708 +3d29ef108aa7b1f1 +bd41843bdd561384 +3d3cf7884553d8f8 +bfe6a09e667f3bbc +bfe6a09e667f3b06 +bfe6a09e667f3c71 +bfe6a09e667f3a52 +bfe6a09e667f3d25 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bc46d61b58c99c43 +3d1fff494f2539b3 +bd20005b586d6326 +3d2fffa4a7929cda +bd30002dac36b193 +bc56d61b58c99c43 +3d2fff494f2539b3 +bd30005b586d6326 +3d3fffa4a7929cda +bd40002dac36b193 +3fe6a09e667f3bbb +3fe6a09e667f3c70 +3fe6a09e667f3b06 +3fe6a09e667f3d25 +3fe6a09e667f3a51 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d0849735c376aa4 +bd29eda328f22557 +3d33092e6b86ed54 +bd3cf6d1947912ac +3d41849735c376aa +3fe6a09e667f3b4b +3fe6a09e667f3a96 +3fe6a09e667f3c00 +3fe6a09e667f39e1 +3fe6a09e667f3cb5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd13dbfd02bf10fb +bd29edfe815f887e +3d084805fa81de0a +bd34f6ff40afc43f +3d2612017ea07782 +3d23dbfd02bf10fb +3d39edfe815f887e +bd184805fa81de0a +3d44f6ff40afc43f +bd3612017ea07782 +bfe6a09e667f3c2c +bfe6a09e667f3ce1 +bfe6a09e667f3b77 +bfe6a09e667f3d96 +bfe6a09e667f3ac2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd1b94adb917f93e +bd36e52b6e45fe50 +3d2235a923740361 +bd437295b722ff28 +3d391ad491ba01b0 +bfe6a09e667f3b90 +bfe6a09e667f3adb +bfe6a09e667f3c45 +bfe6a09e667f3a26 +bfe6a09e667f3cfa +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfee2c2d963a10c +3d23dc585b2c7422 +bd18474f49a717bd +3d31ee2c2d963a11 +bd2c23a7a4d38bde +3d0ee2c2d963a10c +3d33dc585b2c7422 +bd28474f49a717bd +3d41ee2c2d963a11 +bd3c23a7a4d38bde +3fe6a09e667f3be7 +3fe6a09e667f3c9c +3fe6a09e667f3b32 +3fe6a09e667f3d51 +3fe6a09e667f3a7d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcea70a9025d3e70 +bd30d3854812e9f3 +3d2e58f56fda2c19 +bd4069c2a40974fa +3d3f2c7ab7ed160d +3fe6a09e667f3bd4 +3fe6a09e667f3b20 +3fe6a09e667f3c89 +3fe6a09e667f3a6a +3fe6a09e667f3d3f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf1aa6e583501d4 +bd1b956469f2bf8b +3d22354dcb06a03b +bd2dcab234f95fc5 +3d311aa6e583501d +bd01aa6e583501d4 +3d2b956469f2bf8b +bd32354dcb06a03b +3d3dcab234f95fc5 +bd411aa6e583501d +bfe6a09e667f3ba2 +bfe6a09e667f3c57 +bfe6a09e667f3aed +bfe6a09e667f3d0c +bfe6a09e667f3a38 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd2583be43bfab2f +bd3ac1df21dfd597 +3d14f8837880a9a2 +bd4560ef90efeacc +3d353e20de202a69 +bfe6a09e667f3b64 +bfe6a09e667f3aaf +bfe6a09e667f3c19 +bfe6a09e667f39fa +bfe6a09e667f3cce +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d0ee4303b192da6 +3d27b90c0ec64b69 +bd108de7e273692d +3d33dc86076325b5 +bd2846f3f139b497 +3d1ee4303b192da6 +3d37b90c0ec64b69 +bd208de7e273692d +3d43dc86076325b5 +bd3846f3f139b497 +3fe6a09e667f3c13 +3fe6a09e667f3cc8 +3fe6a09e667f3b5e +3fe6a09e667f3d7d +3fe6a09e667f3aa9 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd12c0e3eeb304ee +bd34b038fbacc13b +3d269f8e08a67d89 +bd42581c7dd6609e +3d3b4fc704533ec5 +3fe6a09e667f3ba9 +3fe6a09e667f3af4 +3fe6a09e667f3c5e +3fe6a09e667f3a3f +3fe6a09e667f3d13 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcea765e893370d7 +bd21a765e893370d +3d1cb1342ed991e5 +bd30d3b2f4499b87 +3d2e589a176cc8f3 +3cfa765e893370d7 +3d31a765e893370d +bd2cb1342ed991e5 +3d40d3b2f4499b87 +bd3e589a176cc8f3 +bfe6a09e667f3bce +bfe6a09e667f3c83 +bfe6a09e667f3b19 +bfe6a09e667f3d38 +bfe6a09e667f3a64 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf616d2a8653209 +bd2d3d25aaf359bf +3d31616d2a865321 +bd3e9e92d579acdf +3d40b0b695432990 +bfe6a09e667f3bed +bfe6a09e667f3b38 +bfe6a09e667f3ca2 +bfe6a09e667f3a83 +bfe6a09e667f3d58 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd01a900f67f753a +3d172b7f84c04563 +bd246a403d9fdd4f +3d2b95bfc26022b1 +bd3235201ecfeea7 +bd11a900f67f753a +3d272b7f84c04563 +bd346a403d9fdd4f +3d3b95bfc26022b1 +bd4235201ecfeea7 +3fe6a09e667f3c3e +3fe6a09e667f3cf3 +3fe6a09e667f3b8a +3fe6a09e667f3da8 +3fe6a09e667f3ad4 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd2119d95e8d3107 +bd388cecaf469883 +3d1dcc4d42e59df2 +bd44467657a34c42 +3d37731350b9677d +3fe6a09e667f3b7d +3fe6a09e667f3ac8 +3fe6a09e667f3c32 +3fe6a09e667f3a13 +3fe6a09e667f3ce7 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd06106670b43955 +bd2584199c2d0e55 +3d14f7ccc7a5e355 +bd32c20cce16872b +3d2a7be663d2f1ab +3d16106670b43955 +3d3584199c2d0e55 +bd24f7ccc7a5e355 +3d42c20cce16872b +bd3a7be663d2f1ab +bfe6a09e667f3bfa +bfe6a09e667f3caf +bfe6a09e667f3b45 +bfe6a09e667f3d64 +bfe6a09e667f3a90 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd03da34489c213b +bd327b4689138427 +3d2b0972edd8f7b1 +bd413da34489c214 +3d3d84b976ec7bd9 +bfe6a09e667f3bc2 +bfe6a09e667f3b0d +bfe6a09e667f3c77 +bfe6a09e667f3a58 +bfe6a09e667f3d2c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd1b19140c0c0d5 +3d1ee4e6ebf3f3f3 +bd208d8c8a060607 +3d2f727375f9f9f9 +bd3046c645030303 +bce1b19140c0c0d5 +3d2ee4e6ebf3f3f3 +bd308d8c8a060607 +3d3f727375f9f9f9 +bd4046c645030303 +3fe6a09e667f3bb5 +3fe6a09e667f3c6a +3fe6a09e667f3b00 +3fe6a09e667f3d1f +3fe6a09e667f3a4b +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d0cb2fce8fc81a5 +bd28d340c5c0df97 +3d33965f9d1f9035 +bd3c69a062e06fcb +3d41cb2fce8fc81a +3fe6a09e667f3b51 +3fe6a09e667f3a9c +3fe6a09e667f3c06 +3fe6a09e667f39e7 +3fe6a09e667f3cbb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd12c19a9f8dcb3b +bd2960cd4fc6e59d +3d0a7ccac0e4698b +bd34b066a7e372cf +3d269f32b0391a63 +3d22c19a9f8dcb3b +3d3960cd4fc6e59d +bd1a7ccac0e4698b +3d44b066a7e372cf +bd369f32b0391a63 +bfe6a09e667f3c26 +bfe6a09e667f3cdb +bfe6a09e667f3b70 +bfe6a09e667f3d90 +bfe6a09e667f3abc +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd195fe8f2b56dbd +bd3657fa3cad5b6f +3d23500b86a54921 +bd432bfd1e56adb8 +3d39a805c352a491 +bfe6a09e667f3b96 +bfe6a09e667f3ae1 +bfe6a09e667f3c4b +bfe6a09e667f3a2c +bfe6a09e667f3d00 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfa79394c9e8a0a +3d234f272993d141 +bd1961b1acd85d7d +3d31a79394c9e8a1 +bd2cb0d8d66c2ebf +3d0a79394c9e8a0a +3d334f272993d141 +bd2961b1acd85d7d +3d41a79394c9e8a1 +bd3cb0d8d66c2ebf +3fe6a09e667f3be1 +3fe6a09e667f3c96 +3fe6a09e667f3b2c +3fe6a09e667f3d4b +3fe6a09e667f3a77 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcd195059e91c4d2 +bd304654167a4713 +3d2f7357d30b71d9 +bd40232a0b3d238a +3d3fb9abe985b8ed +3fe6a09e667f3bda +3fe6a09e667f3b26 +3fe6a09e667f3c90 +3fe6a09e667f3a71 +3fe6a09e667f3d45 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf613f7e4fa18d6 +bd1a7b0206c179cb +3d22c27efc9f431b +bd2d3d810360bce5 +3d31613f7e4fa18d +bd0613f7e4fa18d6 +3d2a7b0206c179cb +bd32c27efc9f431b +3d3d3d810360bce5 +bd41613f7e4fa18d +bfe6a09e667f3b9c +bfe6a09e667f3c51 +bfe6a09e667f3ae7 +bfe6a09e667f3d06 +bfe6a09e667f3a32 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd24695be08e656e +bd3a34adf04732b7 +3d172d483ee33523 +bd451a56f823995c +3d35cb520fb8cd49 +bfe6a09e667f3b6a +bfe6a09e667f3ab5 +bfe6a09e667f3c1f +bfe6a09e667f3a00 +bfe6a09e667f3cd4 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d0caf6b74b6a225 +3d272bdadd2da889 +bd11a84a45a4aeee +3d3395ed6e96d445 +bd28d42522d25777 +3d1caf6b74b6a225 +3d372bdadd2da889 +bd21a84a45a4aeee +3d4395ed6e96d445 +bd38d42522d25777 +3fe6a09e667f3c0c +3fe6a09e667f3cc2 +3fe6a09e667f3b58 +3fe6a09e667f3d77 +3fe6a09e667f3aa2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd108c1f2850796d +bd342307ca141e5b +3d27b9f06bd7c34a +bd421183e50a0f2e +3d3bdcf835ebe1a5 +3fe6a09e667f3baf +3fe6a09e667f3afa +3fe6a09e667f3c64 +3fe6a09e667f3a45 +3fe6a09e667f3d19 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce1a34b6fa942d3 +bd211a34b6fa942d +3d1dcb96920ad7a6 +bd308d1a5b7d4a17 +3d2ee5cb49056bd3 +3cf1a34b6fa942d3 +3d311a34b6fa942d +bd2dcb96920ad7a6 +3d408d1a5b7d4a17 +bd3ee5cb49056bd3 +bfe6a09e667f3bc8 +bfe6a09e667f3c7d +bfe6a09e667f3b13 +bfe6a09e667f3d32 +bfe6a09e667f3a5e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfee9e5c1ef600d +bd2c22c347c213fe +3d31ee9e5c1ef601 +bd3e1161a3e109ff +3d40f74f2e0f7b00 +bfe6a09e667f3bf3 +bfe6a09e667f3b3f +bfe6a09e667f3ca9 +bfe6a09e667f3a8a +bfe6a09e667f3d5e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d16111d218effa2 +3d2b088e90c77fd1 +bd03ddc5bce200bb +3d3584474863bfe9 +bd24f7716f38802f +3d26111d218effa2 +3d3b088e90c77fd1 +bd13ddc5bce200bb +3d4584474863bfe9 +bd34f7716f38802f +3fe6a09e667f3c38 +3fe6a09e667f3ced +3fe6a09e667f3b83 +3fe6a09e667f3da2 +3fe6a09e667f3ace +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd1ffeedf6b7d68d +bd37ffbb7dadf5a3 +3d20008904a414ba +bd43ffddbed6fad2 +3d38004482520a5d +3fe6a09e667f3b83 +3fe6a09e667f3ace +3fe6a09e667f3c38 +3fe6a09e667f3a19 +3fe6a09e667f3ced +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd03dba1aa51add5 +bd24f6e86a946b75 +3d16122f2ad72916 +bd327b74354a35bb +3d2b0917956b948b +3d13dba1aa51add5 +3d34f6e86a946b75 +bd26122f2ad72916 +3d427b74354a35bb +bd3b0917956b948b +bfe6a09e667f3bf4 +bfe6a09e667f3ca9 +bfe6a09e667f3b3f +bfe6a09e667f3d5e +bfe6a09e667f3a8a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfee15577ae1472 +bd31ee15577ae147 +3d2c23d5510a3d72 +bd40f70aabbd70a4 +3d3e11eaa8851eb9 +bfe6a09e667f3bc8 +bfe6a09e667f3b13 +bfe6a09e667f3c7d +bfe6a09e667f3a5e +bfe6a09e667f3d32 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce1abdbb9ea8e6e +3d1dca8488c2ae32 +bd211abdbb9ea8e7 +3d2ee54244615719 +bd308d5eddcf5473 +bcf1abdbb9ea8e6e +3d2dca8488c2ae32 +bd311abdbb9ea8e7 +3d3ee54244615719 +bd408d5eddcf5473 +3fe6a09e667f3baf +3fe6a09e667f3c64 +3fe6a09e667f3afa +3fe6a09e667f3d19 +3fe6a09e667f3a45 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d108e433ae0cc54 +bd27b8de628f99d6 +3d342390ceb83315 +bd3bdc6f3147cceb +3d4211c8675c198a +3fe6a09e667f3b57 +3fe6a09e667f3aa2 +3fe6a09e667f3c0c +3fe6a09e667f39ee +3fe6a09e667f3cc2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd11a7383c5c857a +bd28d39c1e2e42bd +3d0cb18f8746f50c +bd3469ce0f17215f +3d272c63e1d1bd43 +3d21a7383c5c857a +3d38d39c1e2e42bd +bd1cb18f8746f50c +3d4469ce0f17215f +bd372c63e1d1bd43 +bfe6a09e667f3c1f +bfe6a09e667f3cd4 +bfe6a09e667f3b6a +bfe6a09e667f3d89 +bfe6a09e667f3ab5 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd172b242c52e23c +bd2b95921629711e +3d01a9b7a75a3b87 +bd35cac90b14b88f +3d246a6de9d68ee2 +bfe6a09e667f3b9c +bfe6a09e667f3b42 +bfe6a09e667f3bf7 +bfe6a09e667f3ae7 +bfe6a09e667f3c51 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf60fafbfd97309 +3d1583ebeff65cc2 +bd04f8282013467c +3d22c1f5f7fb2e61 +bd1a7c141009a33e +3d060fafbfd97309 +3d2583ebeff65cc2 +bd14f8282013467c +3d32c1f5f7fb2e61 +bd2a7c141009a33e +3fe6a09e667f3bdb +3fe6a09e667f3c35 +3fe6a09e667f3b80 +3fe6a09e667f3c90 +3fe6a09e667f3b26 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cd1b746c796f33c +bd1ee48b938690cc +3d208dba363cb79a +bd2f7245c9c34866 +3d3046dd1b1e5bcd +3fe6a09e667f3b86 +3fe6a09e667f3b2c +3fe6a09e667f3be1 +3fe6a09e667f3ad1 +3fe6a09e667f3c3b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd02c13f47206814 +bd19609fa390340a +3cfa7d8171bf2fd8 +bd24b04fd1c81a05 +3d169f605c6fcbf6 +3d12c13f47206814 +3d29609fa390340a +bd0a7d8171bf2fd8 +3d34b04fd1c81a05 +bd269f605c6fcbf6 +bfe6a09e667f3bf0 +bfe6a09e667f3c4b +bfe6a09e667f3b96 +bfe6a09e667f3ca6 +bfe6a09e667f3b3b +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfa77cbeae8fd71 +bd234ef97d5d1fae +3d19620d0545c0a4 +bd31a77cbeae8fd7 +3d2cb10682a2e052 +bfe6a09e667f3bcb +bfe6a09e667f3b71 +bfe6a09e667f3c25 +bfe6a09e667f3b16 +bfe6a09e667f3c80 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d0a7aa6ae5416a4 +3d1d3d53572a0b52 +bce6156546afa570 +3d269ea9ab9505a9 +bd12c2aca8d5f4ae +3d1a7aa6ae5416a4 +3d2d3d53572a0b52 +bcf6156546afa570 +3d369ea9ab9505a9 +bd22c2aca8d5f4ae +3fe6a09e667f3c06 +3fe6a09e667f3c61 +3fe6a09e667f3bac +3fe6a09e667f3cbb +3fe6a09e667f3b51 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd0caeb4c3dbdbd8 +bd272bad30f6f6f6 +3d11a8a59e121214 +bd3395d6987b7b7b +3d28d452cf09090a +3fe6a09e667f3bb5 +3fe6a09e667f3b5b +3fe6a09e667f3c10 +3fe6a09e667f3b00 +3fe6a09e667f3c6a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd1a070ac3e29a0 +bd111a070ac3e29a +3d0dcbf1ea783acc +bd208d038561f14d +3d1ee5f8f53c1d66 +3ce1a070ac3e29a0 +3d211a070ac3e29a +bd1dcbf1ea783acc +3d308d038561f14d +bd2ee5f8f53c1d66 +bfe6a09e667f3bc2 +bfe6a09e667f3c1c +bfe6a09e667f3b67 +bfe6a09e667f3c77 +bfe6a09e667f3b0d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd1610c1c9219c7c +bd2b0860e490ce3e +3d03de7c6dbcc708 +bd3584307248671f +3d24f79f1b6f31c2 +bfe6a09e667f3b9f +bfe6a09e667f3b45 +bfe6a09e667f3bfa +bfe6a09e667f3aea +bfe6a09e667f3c54 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf3daeaf976e788 +3d14f6babe5db9e2 +bd06128a83448c3c +3d227b5d5f2edcf1 +bd1b094541a2461e +3d03daeaf976e788 +3d24f6babe5db9e2 +bd16128a83448c3c +3d327b5d5f2edcf1 +bd2b094541a2461e +3fe6a09e667f3bd8 +3fe6a09e667f3c32 +3fe6a09e667f3b7d +3fe6a09e667f3c8d +3fe6a09e667f3b22 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ce1aeb67d55a7a1 +bd1dca2930554b0c +3d211aeb67d55a7a +bd2ee514982aa586 +3d308d75b3eaad3d +3fe6a09e667f3b8a +3fe6a09e667f3b2f +3fe6a09e667f3be4 +3fe6a09e667f3ad4 +3fe6a09e667f3c3e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd01a6dce3ef2254 +bd18d36e71f7912a +3cfcb2463821bb58 +bd2469b738fbc895 +3d172c918e086ed6 +3d11a6dce3ef2254 +3d28d36e71f7912a +bd0cb2463821bb58 +3d3469b738fbc895 +bd272c918e086ed6 +bfe6a09e667f3bed +bfe6a09e667f3c48 +bfe6a09e667f3b93 +bfe6a09e667f3ca2 +bfe6a09e667f3b38 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf60e425e23e66f +bd22c1c84bc47cce +3d1a7c6f68770664 +bd3160e425e23e67 +3d2d3e37b43b8332 +bfe6a09e667f3bce +bfe6a09e667f3b74 +bfe6a09e667f3c29 +bfe6a09e667f3b19 +bfe6a09e667f3c83 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcea7eeed374bc71 +3d0960444b22d0e4 +bd134fddda6e978e +3d1cb02225916872 +bd21a7eeed374bc7 +bcfa7eeed374bc71 +3d1960444b22d0e4 +bd234fddda6e978e +3d2cb02225916872 +bd31a7eeed374bc7 +3fe6a09e667f3c03 +3fe6a09e667f3c5e +3fe6a09e667f3ba9 +3fe6a09e667f3cb8 +3fe6a09e667f3b4e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd0a79effd795057 +bd269e7bff5e5416 +3d12c308014357d4 +bd334f3dffaf2a0b +3d29618400a1abea +3fe6a09e667f3bb9 +3fe6a09e667f3b5e +3fe6a09e667f3c13 +3fe6a09e667f3b03 +3fe6a09e667f3c6d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcc19abb2567f739 +bd108cd5d92b3fba +3d0ee6544da9808c +bd20466aec959fdd +3d1f732a26d4c046 +3cd19abb2567f739 +3d208cd5d92b3fba +bd1ee6544da9808c +3d30466aec959fdd +bd2f732a26d4c046 +bfe6a09e667f3bbe +bfe6a09e667f3c19 +bfe6a09e667f3b64 +bfe6a09e667f3c74 +bfe6a09e667f3b0a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd14f65f65f056bb +bd2a7b2fb2f82b5e +3d061341341f5289 +bd353d97d97c15af +3d2584d04d07d4a2 +bfe6a09e667f3ba3 +bfe6a09e667f3b48 +bfe6a09e667f3bfd +bfe6a09e667f3aee +bfe6a09e667f3c58 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf1a62633145c07 +3d1469898cc51702 +bd072cece675d1fd +3d2234c4c6628b81 +bd1b9676733ae8fe +3d01a62633145c07 +3d2469898cc51702 +bd172cece675d1fd +3d3234c4c6628b81 +bd2b9676733ae8fe +3fe6a09e667f3bd4 +3fe6a09e667f3c2f +3fe6a09e667f3b7a +3fe6a09e667f3c89 +3fe6a09e667f3b20 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cea81c996dfd5a5 +bd1cafc6cd24054b +3d21a81c996dfd5a +bd2e57e3669202a6 +3d30d40e4cb6fead +3fe6a09e667f3b8d +3fe6a09e667f3b32 +3fe6a09e667f3be7 +3fe6a09e667f3ad8 +3fe6a09e667f3c42 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd008c7a80bddc93 +bd18463d405eee4a +3cfee70afe8446d9 +bd24231ea02f7725 +3d17b9c2bfa111b6 +3d108c7a80bddc93 +3d28463d405eee4a +bd0ee70afe8446d9 +3d34231ea02f7725 +bd27b9c2bfa111b6 +bfe6a09e667f3bea +bfe6a09e667f3c45 +bfe6a09e667f3b90 +bfe6a09e667f3c9f +bfe6a09e667f3b35 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf1a4b8d15ecf6d +bd2234971a2bd9ee +3d1b96d1cba84c25 +bd311a4b8d15ecf7 +3d2dcb68e5d42612 +bfe6a09e667f3bd2 +bfe6a09e667f3b77 +bfe6a09e667f3c2c +bfe6a09e667f3b1c +bfe6a09e667f3c86 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d0845e1e7f18b23 +3d1c22f0f3f8c592 +bceee8786039d373 +3d26117879fc62c9 +bd13dd0f0c073a6e +3d1845e1e7f18b23 +3d2c22f0f3f8c592 +bcfee8786039d373 +3d36117879fc62c9 +bd23dd0f0c073a6e +3fe6a09e667f3c00 +3fe6a09e667f3c5b +3fe6a09e667f3ba6 +3fe6a09e667f3cb5 +3fe6a09e667f3b4b +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd08452b3716c4d6 +bd26114acdc5b136 +3d13dd6a64749d95 +bd3308a566e2d89b +3d29eeb5323a4eca +3fe6a09e667f3bbc +3fe6a09e667f3b61 +3fe6a09e667f3c16 +3fe6a09e667f3b06 +3fe6a09e667f3c70 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3c36d61b58c99c43 +bd0fff494f2539b3 +3d10005b586d6326 +bd1fffa4a7929cda +3d20002dac36b193 +bc46d61b58c99c43 +3d1fff494f2539b3 +bd20005b586d6326 +3d2fffa4a7929cda +bd30002dac36b193 +bfe6a09e667f3bbb +bfe6a09e667f3c16 +bfe6a09e667f3b61 +bfe6a09e667f3c70 +bfe6a09e667f3b06 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd13dbfd02bf10fb +bd29edfe815f887e +3d084805fa81de0a +bd34f6ff40afc43f +3d2612017ea07782 +bfe6a09e667f3ba6 +bfe6a09e667f3b4b +bfe6a09e667f3c00 +bfe6a09e667f3af1 +bfe6a09e667f3c5b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ceee2c2d963a10c +3d13dc585b2c7422 +bd08474f49a717bd +3d21ee2c2d963a11 +bd1c23a7a4d38bde +3cfee2c2d963a10c +3d23dc585b2c7422 +bd18474f49a717bd +3d31ee2c2d963a11 +bd2c23a7a4d38bde +3fe6a09e667f3bd1 +3fe6a09e667f3c2c +3fe6a09e667f3b77 +3fe6a09e667f3c86 +3fe6a09e667f3b1c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cf1aa6e583501d4 +bd1b956469f2bf8b +3d22354dcb06a03b +bd2dcab234f95fc5 +3d311aa6e583501d +3fe6a09e667f3b90 +3fe6a09e667f3b35 +3fe6a09e667f3bea +3fe6a09e667f3adb +3fe6a09e667f3c45 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfee4303b192da6 +bd17b90c0ec64b69 +3d008de7e273692d +bd23dc86076325b5 +3d1846f3f139b497 +3d0ee4303b192da6 +3d27b90c0ec64b69 +bd108de7e273692d +3d33dc86076325b5 +bd2846f3f139b497 +bfe6a09e667f3be7 +bfe6a09e667f3c42 +bfe6a09e667f3b8c +bfe6a09e667f3c9c +bfe6a09e667f3b32 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcea765e893370d7 +bd21a765e893370d +3d1cb1342ed991e5 +bd30d3b2f4499b87 +3d2e589a176cc8f3 +bfe6a09e667f3bd4 +bfe6a09e667f3b7a +bfe6a09e667f3c2f +bfe6a09e667f3b20 +bfe6a09e667f3c89 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf1a900f67f753a +3d072b7f84c04563 +bd146a403d9fdd4f +3d1b95bfc26022b1 +bd2235201ecfeea7 +bd01a900f67f753a +3d172b7f84c04563 +bd246a403d9fdd4f +3d2b95bfc26022b1 +bd3235201ecfeea7 +3fe6a09e667f3bfd +3fe6a09e667f3c57 +3fe6a09e667f3ba2 +3fe6a09e667f3cb2 +3fe6a09e667f3b48 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd06106670b43955 +bd2584199c2d0e55 +3d14f7ccc7a5e355 +bd32c20cce16872b +3d2a7be663d2f1ab +3fe6a09e667f3bbf +3fe6a09e667f3b64 +3fe6a09e667f3c19 +3fe6a09e667f3b0a +3fe6a09e667f3c74 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cc1b19140c0c0d5 +bd0ee4e6ebf3f3f3 +3d108d8c8a060607 +bd1f727375f9f9f9 +3d2046c645030303 +bcd1b19140c0c0d5 +3d1ee4e6ebf3f3f3 +bd208d8c8a060607 +3d2f727375f9f9f9 +bd3046c645030303 +bfe6a09e667f3bb8 +bfe6a09e667f3c13 +bfe6a09e667f3b5e +bfe6a09e667f3c6d +bfe6a09e667f3b03 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd12c19a9f8dcb3b +bd2960cd4fc6e59d +3d0a7ccac0e4698b +bd34b066a7e372cf +3d269f32b0391a63 +bfe6a09e667f3ba9 +bfe6a09e667f3b4e +bfe6a09e667f3c03 +bfe6a09e667f3af4 +bfe6a09e667f3c5e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cea79394c9e8a0a +3d134f272993d141 +bd0961b1acd85d7d +3d21a79394c9e8a1 +bd1cb0d8d66c2ebf +3cfa79394c9e8a0a +3d234f272993d141 +bd1961b1acd85d7d +3d31a79394c9e8a1 +bd2cb0d8d66c2ebf +3fe6a09e667f3bce +3fe6a09e667f3c28 +3fe6a09e667f3b74 +3fe6a09e667f3c83 +3fe6a09e667f3b19 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cf613f7e4fa18d6 +bd1a7b0206c179cb +3d22c27efc9f431b +bd2d3d810360bce5 +3d31613f7e4fa18d +3fe6a09e667f3b93 +3fe6a09e667f3b38 +3fe6a09e667f3bed +3fe6a09e667f3ade +3fe6a09e667f3c48 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfcaf6b74b6a225 +bd172bdadd2da889 +3d01a84a45a4aeee +bd2395ed6e96d445 +3d18d42522d25777 +3d0caf6b74b6a225 +3d272bdadd2da889 +bd11a84a45a4aeee +3d3395ed6e96d445 +bd28d42522d25777 +bfe6a09e667f3be4 +bfe6a09e667f3c3e +bfe6a09e667f3b8a +bfe6a09e667f3c99 +bfe6a09e667f3b2f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce1a34b6fa942d3 +bd211a34b6fa942d +3d1dcb96920ad7a6 +bd308d1a5b7d4a17 +3d2ee5cb49056bd3 +bfe6a09e667f3bd8 +bfe6a09e667f3b7d +bfe6a09e667f3c32 +bfe6a09e667f3b22 +bfe6a09e667f3c8d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d06111d218effa2 +3d1b088e90c77fd1 +bcf3ddc5bce200bb +3d2584474863bfe9 +bd14f7716f38802f +3d16111d218effa2 +3d2b088e90c77fd1 +bd03ddc5bce200bb +3d3584474863bfe9 +bd24f7716f38802f +3fe6a09e667f3bfa +3fe6a09e667f3c54 +3fe6a09e667f3b9f +3fe6a09e667f3caf +3fe6a09e667f3b45 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd03dba1aa51add5 +bd24f6e86a946b75 +3d16122f2ad72916 +bd327b74354a35bb +3d2b0917956b948b +3fe6a09e667f3bc2 +3fe6a09e667f3b67 +3fe6a09e667f3c1c +3fe6a09e667f3b0d +3fe6a09e667f3c77 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd1abdbb9ea8e6e +bd0dca8488c2ae32 +3d111abdbb9ea8e7 +bd1ee54244615719 +3d208d5eddcf5473 +bce1abdbb9ea8e6e +3d1dca8488c2ae32 +bd211abdbb9ea8e7 +3d2ee54244615719 +bd308d5eddcf5473 +bfe6a09e667f3bb5 +bfe6a09e667f3c10 +bfe6a09e667f3b5b +bfe6a09e667f3c6a +bfe6a09e667f3b00 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd11a7383c5c857a +bd28d39c1e2e42bd +3d0cb18f8746f50c +bd3469ce0f17215f +3d272c63e1d1bd43 +bfe6a09e667f3bac +bfe6a09e667f3b7e +bfe6a09e667f3bd9 +bfe6a09e667f3b51 +bfe6a09e667f3c06 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce60fafbfd97309 +3d0583ebeff65cc2 +bcf4f8282013467c +3d12c1f5f7fb2e61 +bd0a7c141009a33e +3cf60fafbfd97309 +3d1583ebeff65cc2 +bd04f8282013467c +3d22c1f5f7fb2e61 +bd1a7c141009a33e +3fe6a09e667f3bcb +3fe6a09e667f3bf8 +3fe6a09e667f3b9e +3fe6a09e667f3c25 +3fe6a09e667f3b70 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd02c13f47206814 +bd19609fa390340a +3cfa7d8171bf2fd8 +bd24b04fd1c81a05 +3d169f605c6fcbf6 +3fe6a09e667f3bc3 +3fe6a09e667f3b96 +3fe6a09e667f3bf1 +3fe6a09e667f3b69 +3fe6a09e667f3c1e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfa7aa6ae5416a4 +bd0d3d53572a0b52 +3cd6156546afa570 +bd169ea9ab9505a9 +3d02c2aca8d5f4ae +3d0a7aa6ae5416a4 +3d1d3d53572a0b52 +bce6156546afa570 +3d269ea9ab9505a9 +bd12c2aca8d5f4ae +bfe6a09e667f3be1 +bfe6a09e667f3c0e +bfe6a09e667f3bb4 +bfe6a09e667f3c3b +bfe6a09e667f3b86 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd1a070ac3e29a0 +bd111a070ac3e29a +3d0dcbf1ea783acc +bd208d038561f14d +3d1ee5f8f53c1d66 +bfe6a09e667f3bad +bfe6a09e667f3b80 +bfe6a09e667f3bda +bfe6a09e667f3b53 +bfe6a09e667f3c08 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce3daeaf976e788 +3d04f6babe5db9e2 +bcf6128a83448c3c +3d127b5d5f2edcf1 +bd0b094541a2461e +3cf3daeaf976e788 +3d14f6babe5db9e2 +bd06128a83448c3c +3d227b5d5f2edcf1 +bd1b094541a2461e +3fe6a09e667f3bc9 +3fe6a09e667f3bf7 +3fe6a09e667f3b9c +3fe6a09e667f3c24 +3fe6a09e667f3b6f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd01a6dce3ef2254 +bd18d36e71f7912a +3cfcb2463821bb58 +bd2469b738fbc895 +3d172c918e086ed6 +3fe6a09e667f3bc5 +3fe6a09e667f3b97 +3fe6a09e667f3bf2 +3fe6a09e667f3b6a +3fe6a09e667f3c1f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cda7eeed374bc71 +bcf960444b22d0e4 +3d034fddda6e978e +bd0cb02225916872 +3d11a7eeed374bc7 +bcea7eeed374bc71 +3d0960444b22d0e4 +bd134fddda6e978e +3d1cb02225916872 +bd21a7eeed374bc7 +bfe6a09e667f3bdf +bfe6a09e667f3c0c +bfe6a09e667f3bb2 +bfe6a09e667f3c3a +bfe6a09e667f3b85 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcc19abb2567f739 +bd108cd5d92b3fba +3d0ee6544da9808c +bd20466aec959fdd +3d1f732a26d4c046 +bfe6a09e667f3baf +bfe6a09e667f3b82 +bfe6a09e667f3bdc +bfe6a09e667f3b54 +bfe6a09e667f3c09 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce1a62633145c07 +3d0469898cc51702 +bcf72cece675d1fd +3d1234c4c6628b81 +bd0b9676733ae8fe +3cf1a62633145c07 +3d1469898cc51702 +bd072cece675d1fd +3d2234c4c6628b81 +bd1b9676733ae8fe +3fe6a09e667f3bc8 +3fe6a09e667f3bf5 +3fe6a09e667f3b9b +3fe6a09e667f3c22 +3fe6a09e667f3b6e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd008c7a80bddc93 +bd18463d405eee4a +3cfee70afe8446d9 +bd24231ea02f7725 +3d17b9c2bfa111b6 +3fe6a09e667f3bc6 +3fe6a09e667f3b99 +3fe6a09e667f3bf3 +3fe6a09e667f3b6c +3fe6a09e667f3c21 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf845e1e7f18b23 +bd0c22f0f3f8c592 +3cdee8786039d373 +bd16117879fc62c9 +3d03dd0f0c073a6e +3d0845e1e7f18b23 +3d1c22f0f3f8c592 +bceee8786039d373 +3d26117879fc62c9 +bd13dd0f0c073a6e +bfe6a09e667f3bde +bfe6a09e667f3c0b +bfe6a09e667f3bb0 +bfe6a09e667f3c38 +bfe6a09e667f3b83 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3c36d61b58c99c43 +bd0fff494f2539b3 +3d10005b586d6326 +bd1fffa4a7929cda +3d20002dac36b193 +bfe6a09e667f3bb0 +bfe6a09e667f3b83 +bfe6a09e667f3bde +bfe6a09e667f3b56 +bfe6a09e667f3c0b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cdee2c2d963a10c +3d03dc585b2c7422 +bcf8474f49a717bd +3d11ee2c2d963a11 +bd0c23a7a4d38bde +3ceee2c2d963a10c +3d13dc585b2c7422 +bd08474f49a717bd +3d21ee2c2d963a11 +bd1c23a7a4d38bde +3fe6a09e667f3bc6 +3fe6a09e667f3bf3 +3fe6a09e667f3b99 +3fe6a09e667f3c21 +3fe6a09e667f3b6c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcfee4303b192da6 +bd17b90c0ec64b69 +3d008de7e273692d +bd23dc86076325b5 +3d1846f3f139b497 +3fe6a09e667f3bc8 +3fe6a09e667f3b9b +3fe6a09e667f3bf5 +3fe6a09e667f3b6e +3fe6a09e667f3c22 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce1a900f67f753a +bcf72b7f84c04563 +3d046a403d9fdd4f +bd0b95bfc26022b1 +3d1235201ecfeea7 +bcf1a900f67f753a +3d072b7f84c04563 +bd146a403d9fdd4f +3d1b95bfc26022b1 +bd2235201ecfeea7 +bfe6a09e667f3bdc +bfe6a09e667f3c09 +bfe6a09e667f3baf +bfe6a09e667f3c37 +bfe6a09e667f3b82 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cc1b19140c0c0d5 +bd0ee4e6ebf3f3f3 +3d108d8c8a060607 +bd1f727375f9f9f9 +3d2046c645030303 +bfe6a09e667f3bb2 +bfe6a09e667f3b85 +bfe6a09e667f3bdf +bfe6a09e667f3b58 +bfe6a09e667f3c0c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cda79394c9e8a0a +3d034f272993d141 +bcf961b1acd85d7d +3d11a79394c9e8a1 +bd0cb0d8d66c2ebf +3cea79394c9e8a0a +3d134f272993d141 +bd0961b1acd85d7d +3d21a79394c9e8a1 +bd1cb0d8d66c2ebf +3fe6a09e667f3bc5 +3fe6a09e667f3bf2 +3fe6a09e667f3b98 +3fe6a09e667f3c1f +3fe6a09e667f3b6a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcfcaf6b74b6a225 +bd172bdadd2da889 +3d01a84a45a4aeee +bd2395ed6e96d445 +3d18d42522d25777 +3fe6a09e667f3bc9 +3fe6a09e667f3b9c +3fe6a09e667f3bf7 +3fe6a09e667f3b6f +3fe6a09e667f3c24 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf6111d218effa2 +bd0b088e90c77fd1 +3ce3ddc5bce200bb +bd1584474863bfe9 +3d04f7716f38802f +3d06111d218effa2 +3d1b088e90c77fd1 +bcf3ddc5bce200bb +3d2584474863bfe9 +bd14f7716f38802f +bfe6a09e667f3bdb +bfe6a09e667f3c08 +bfe6a09e667f3bad +bfe6a09e667f3c35 +bfe6a09e667f3b80 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd1abdbb9ea8e6e +bd0dca8488c2ae32 +3d111abdbb9ea8e7 +bd1ee54244615719 +3d208d5eddcf5473 +bfe6a09e667f3bb4 +bfe6a09e667f3b86 +bfe6a09e667f3be1 +bfe6a09e667f3b59 +bfe6a09e667f3c0e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd60fafbfd97309 +3cf583ebeff65cc2 +bce4f8282013467c +3d02c1f5f7fb2e61 +bcfa7c141009a33e +3ce60fafbfd97309 +3d0583ebeff65cc2 +bcf4f8282013467c +3d12c1f5f7fb2e61 +bd0a7c141009a33e +3fe6a09e667f3bda +3fe6a09e667f3bf1 +3fe6a09e667f3bc3 +3fe6a09e667f3c07 +3fe6a09e667f3bad +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcfa7aa6ae5416a4 +bd0d3d53572a0b52 +3cd6156546afa570 +bd169ea9ab9505a9 +3d02c2aca8d5f4ae +3fe6a09e667f3bcb +3fe6a09e667f3bb5 +3fe6a09e667f3be2 +3fe6a09e667f3b9e +3fe6a09e667f3bf8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd3daeaf976e788 +bcf4f6babe5db9e2 +3ce6128a83448c3c +bd027b5d5f2edcf1 +3cfb094541a2461e +3ce3daeaf976e788 +3d04f6babe5db9e2 +bcf6128a83448c3c +3d127b5d5f2edcf1 +bd0b094541a2461e +bfe6a09e667f3bd9 +bfe6a09e667f3bf0 +bfe6a09e667f3bc2 +bfe6a09e667f3c06 +bfe6a09e667f3bac +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cda7eeed374bc71 +bcf960444b22d0e4 +3d034fddda6e978e +bd0cb02225916872 +3d11a7eeed374bc7 +bfe6a09e667f3bcc +bfe6a09e667f3bb5 +bfe6a09e667f3be2 +bfe6a09e667f3b9e +bfe6a09e667f3bf9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd1a62633145c07 +3cf469898cc51702 +bce72cece675d1fd +3d0234c4c6628b81 +bcfb9676733ae8fe +3ce1a62633145c07 +3d0469898cc51702 +bcf72cece675d1fd +3d1234c4c6628b81 +bd0b9676733ae8fe +3fe6a09e667f3bd8 +3fe6a09e667f3bef +3fe6a09e667f3bc2 +3fe6a09e667f3c06 +3fe6a09e667f3bab +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcf845e1e7f18b23 +bd0c22f0f3f8c592 +3cdee8786039d373 +bd16117879fc62c9 +3d03dd0f0c073a6e +3fe6a09e667f3bcd +3fe6a09e667f3bb6 +3fe6a09e667f3be3 +3fe6a09e667f3b9f +3fe6a09e667f3bfa +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bccee2c2d963a10c +bcf3dc585b2c7422 +3ce8474f49a717bd +bd01ee2c2d963a11 +3cfc23a7a4d38bde +3cdee2c2d963a10c +3d03dc585b2c7422 +bcf8474f49a717bd +3d11ee2c2d963a11 +bd0c23a7a4d38bde +bfe6a09e667f3bd8 +bfe6a09e667f3bee +bfe6a09e667f3bc1 +bfe6a09e667f3c05 +bfe6a09e667f3baa +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce1a900f67f753a +bcf72b7f84c04563 +3d046a403d9fdd4f +bd0b95bfc26022b1 +3d1235201ecfeea7 +bfe6a09e667f3bce +bfe6a09e667f3bb7 +bfe6a09e667f3be4 +bfe6a09e667f3ba0 +bfe6a09e667f3bfb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cca79394c9e8a0a +3cf34f272993d141 +bce961b1acd85d7d +3d01a79394c9e8a1 +bcfcb0d8d66c2ebf +3cda79394c9e8a0a +3d034f272993d141 +bcf961b1acd85d7d +3d11a79394c9e8a1 +bd0cb0d8d66c2ebf +3fe6a09e667f3bd7 +3fe6a09e667f3bed +3fe6a09e667f3bc0 +3fe6a09e667f3c04 +3fe6a09e667f3baa +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcf6111d218effa2 +bd0b088e90c77fd1 +3ce3ddc5bce200bb +bd1584474863bfe9 +3d04f7716f38802f +3fe6a09e667f3bce +3fe6a09e667f3bb8 +3fe6a09e667f3be5 +3fe6a09e667f3ba1 +3fe6a09e667f3bfc +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcc60fafbfd97309 +bce583ebeff65cc2 +3cd4f8282013467c +bcf2c1f5f7fb2e61 +3cea7c141009a33e +3cd60fafbfd97309 +3cf583ebeff65cc2 +bce4f8282013467c +3d02c1f5f7fb2e61 +bcfa7c141009a33e +bfe6a09e667f3bd6 +bfe6a09e667f3be1 +bfe6a09e667f3bcb +bfe6a09e667f3bed +bfe6a09e667f3bbf +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd3daeaf976e788 +bcf4f6babe5db9e2 +3ce6128a83448c3c +bd027b5d5f2edcf1 +3cfb094541a2461e +bfe6a09e667f3bcf +bfe6a09e667f3bc4 +bfe6a09e667f3bda +bfe6a09e667f3bb8 +bfe6a09e667f3be6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cc1a62633145c07 +3ce469898cc51702 +bcd72cece675d1fd +3cf234c4c6628b81 +bceb9676733ae8fe +3cd1a62633145c07 +3cf469898cc51702 +bce72cece675d1fd +3d0234c4c6628b81 +bcfb9676733ae8fe +3fe6a09e667f3bd5 +3fe6a09e667f3be0 +3fe6a09e667f3bca +3fe6a09e667f3bec +3fe6a09e667f3bbe +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bccee2c2d963a10c +bcf3dc585b2c7422 +3ce8474f49a717bd +bd01ee2c2d963a11 +3cfc23a7a4d38bde +3fe6a09e667f3bd0 +3fe6a09e667f3bc4 +3fe6a09e667f3bdb +3fe6a09e667f3bb9 +3fe6a09e667f3be6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcba79394c9e8a0a +bce34f272993d141 +3cd961b1acd85d7d +bcf1a79394c9e8a1 +3cecb0d8d66c2ebf +3cca79394c9e8a0a +3cf34f272993d141 +bce961b1acd85d7d +3d01a79394c9e8a1 +bcfcb0d8d66c2ebf +bfe6a09e667f3bd4 +bfe6a09e667f3bdf +bfe6a09e667f3bc9 +bfe6a09e667f3beb +bfe6a09e667f3bbe +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcc60fafbfd97309 +bce583ebeff65cc2 +3cd4f8282013467c +bcf2c1f5f7fb2e61 +3cea7c141009a33e +bfe6a09e667f3bcb +bfe6a09e667f3bc5 +bfe6a09e667f3bd1 +bfe6a09e667f3bc0 +bfe6a09e667f3bd6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cb1a62633145c07 +3cd469898cc51702 +bcc72cece675d1fd +3ce234c4c6628b81 +bcdb9676733ae8fe +3cc1a62633145c07 +3ce469898cc51702 +bcd72cece675d1fd +3cf234c4c6628b81 +bceb9676733ae8fe +3fe6a09e667f3bce +3fe6a09e667f3bd4 +3fe6a09e667f3bc8 +3fe6a09e667f3bd9 +3fe6a09e667f3bc3 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcba79394c9e8a0a +bce34f272993d141 +3cd961b1acd85d7d +bcf1a79394c9e8a1 +3cecb0d8d66c2ebf +3fe6a09e667f3bcc +3fe6a09e667f3bc9 +3fe6a09e667f3bce +3fe6a09e667f3bc6 +3fe6a09e667f3bd2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bca1a62633145c07 +bcc469898cc51702 +3cb72cece675d1fd +bcd234c4c6628b81 +3ccb9676733ae8fe +3cb1a62633145c07 +3cd469898cc51702 +bcc72cece675d1fd +3ce234c4c6628b81 +bcdb9676733ae8fe +bfe6a09e667f3bcd +bfe6a09e667f3bd0 +bfe6a09e667f3bca +bfe6a09e667f3bd3 +bfe6a09e667f3bc8 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bca1a62633145c07 +bcc469898cc51702 +3cb72cece675d1fd +bcd234c4c6628b81 +3ccb9676733ae8fe +bfe6a09e667f3bcc +bfe6a09e667f3bcc +bfe6a09e667f3bcd +bfe6a09e667f3bcb +bfe6a09e667f3bce +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +0000000000000000 +0000000000000001 +8000000000000001 +0000000000000002 +8000000000000002 +0000000000000000 +0000000000000001 +8000000000000001 +0000000000000002 +8000000000000002 +3fe6a09e667f3bcc +3fe6a09e667f3bcd +3fe6a09e667f3bcc +3fe6a09e667f3bce +3fe6a09e667f3bcb +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ca1a62633145c07 +bcb72cece675d1fd +3cc469898cc51702 +bccb9676733ae8fe +3cd234c4c6628b81 +3fe6a09e667f3bcd +3fe6a09e667f3bca +3fe6a09e667f3bd0 +3fe6a09e667f3bc8 +3fe6a09e667f3bd3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ca1a62633145c07 +bcb72cece675d1fd +3cc469898cc51702 +bccb9676733ae8fe +3cd234c4c6628b81 +bcb1a62633145c07 +3cc72cece675d1fd +bcd469898cc51702 +3cdb9676733ae8fe +bce234c4c6628b81 +bfe6a09e667f3bcc +bfe6a09e667f3bce +bfe6a09e667f3bc9 +bfe6a09e667f3bd2 +bfe6a09e667f3bc6 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cba79394c9e8a0a +bcd961b1acd85d7d +3ce34f272993d141 +bcecb0d8d66c2ebf +3cf1a79394c9e8a1 +bfe6a09e667f3bce +bfe6a09e667f3bc8 +bfe6a09e667f3bd4 +bfe6a09e667f3bc3 +bfe6a09e667f3bd9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcb1a62633145c07 +3cc72cece675d1fd +bcd469898cc51702 +3cdb9676733ae8fe +bce234c4c6628b81 +bcc1a62633145c07 +3cd72cece675d1fd +bce469898cc51702 +3ceb9676733ae8fe +bcf234c4c6628b81 +3fe6a09e667f3bcb +3fe6a09e667f3bd1 +3fe6a09e667f3bc5 +3fe6a09e667f3bd6 +3fe6a09e667f3bc0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cc60fafbfd97309 +bcd4f8282013467c +3ce583ebeff65cc2 +bcea7c141009a33e +3cf2c1f5f7fb2e61 +3fe6a09e667f3bd4 +3fe6a09e667f3bc9 +3fe6a09e667f3bdf +3fe6a09e667f3bbe +3fe6a09e667f3beb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cba79394c9e8a0a +bcd961b1acd85d7d +3ce34f272993d141 +bcecb0d8d66c2ebf +3cf1a79394c9e8a1 +bcca79394c9e8a0a +3ce961b1acd85d7d +bcf34f272993d141 +3cfcb0d8d66c2ebf +bd01a79394c9e8a1 +bfe6a09e667f3bd0 +bfe6a09e667f3bdb +bfe6a09e667f3bc4 +bfe6a09e667f3be6 +bfe6a09e667f3bb9 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ccee2c2d963a10c +bce8474f49a717bd +3cf3dc585b2c7422 +bcfc23a7a4d38bde +3d01ee2c2d963a11 +bfe6a09e667f3bd5 +bfe6a09e667f3bca +bfe6a09e667f3be0 +bfe6a09e667f3bbe +bfe6a09e667f3bec +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcc1a62633145c07 +3cd72cece675d1fd +bce469898cc51702 +3ceb9676733ae8fe +bcf234c4c6628b81 +bcd1a62633145c07 +3ce72cece675d1fd +bcf469898cc51702 +3cfb9676733ae8fe +bd0234c4c6628b81 +3fe6a09e667f3bcf +3fe6a09e667f3bda +3fe6a09e667f3bc4 +3fe6a09e667f3be6 +3fe6a09e667f3bb8 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cd3daeaf976e788 +bce6128a83448c3c +3cf4f6babe5db9e2 +bcfb094541a2461e +3d027b5d5f2edcf1 +3fe6a09e667f3bd6 +3fe6a09e667f3bcb +3fe6a09e667f3be1 +3fe6a09e667f3bbf +3fe6a09e667f3bed +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cc60fafbfd97309 +bcd4f8282013467c +3ce583ebeff65cc2 +bcea7c141009a33e +3cf2c1f5f7fb2e61 +bcd60fafbfd97309 +3ce4f8282013467c +bcf583ebeff65cc2 +3cfa7c141009a33e +bd02c1f5f7fb2e61 +bfe6a09e667f3bce +bfe6a09e667f3be5 +bfe6a09e667f3bb8 +bfe6a09e667f3bfc +bfe6a09e667f3ba1 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf6111d218effa2 +bce3ddc5bce200bb +3d0b088e90c77fd1 +bd04f7716f38802f +3d1584474863bfe9 +bfe6a09e667f3bd7 +bfe6a09e667f3bc0 +bfe6a09e667f3bed +bfe6a09e667f3baa +bfe6a09e667f3c04 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcca79394c9e8a0a +3ce961b1acd85d7d +bcf34f272993d141 +3cfcb0d8d66c2ebf +bd01a79394c9e8a1 +bcda79394c9e8a0a +3cf961b1acd85d7d +bd034f272993d141 +3d0cb0d8d66c2ebf +bd11a79394c9e8a1 +3fe6a09e667f3bce +3fe6a09e667f3be4 +3fe6a09e667f3bb7 +3fe6a09e667f3bfb +3fe6a09e667f3ba0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bce1a900f67f753a +bd046a403d9fdd4f +3cf72b7f84c04563 +bd1235201ecfeea7 +3d0b95bfc26022b1 +3fe6a09e667f3bd8 +3fe6a09e667f3bc1 +3fe6a09e667f3bee +3fe6a09e667f3baa +3fe6a09e667f3c05 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ccee2c2d963a10c +bce8474f49a717bd +3cf3dc585b2c7422 +bcfc23a7a4d38bde +3d01ee2c2d963a11 +bcdee2c2d963a10c +3cf8474f49a717bd +bd03dc585b2c7422 +3d0c23a7a4d38bde +bd11ee2c2d963a11 +bfe6a09e667f3bcd +bfe6a09e667f3be3 +bfe6a09e667f3bb6 +bfe6a09e667f3bfa +bfe6a09e667f3b9f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf845e1e7f18b23 +bcdee8786039d373 +3d0c22f0f3f8c592 +bd03dd0f0c073a6e +3d16117879fc62c9 +bfe6a09e667f3bd8 +bfe6a09e667f3bc2 +bfe6a09e667f3bef +bfe6a09e667f3bab +bfe6a09e667f3c06 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd1a62633145c07 +3ce72cece675d1fd +bcf469898cc51702 +3cfb9676733ae8fe +bd0234c4c6628b81 +bce1a62633145c07 +3cf72cece675d1fd +bd0469898cc51702 +3d0b9676733ae8fe +bd1234c4c6628b81 +3fe6a09e667f3bcc +3fe6a09e667f3be2 +3fe6a09e667f3bb5 +3fe6a09e667f3bf9 +3fe6a09e667f3b9e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcda7eeed374bc71 +bd034fddda6e978e +3cf960444b22d0e4 +bd11a7eeed374bc7 +3d0cb02225916872 +3fe6a09e667f3bd9 +3fe6a09e667f3bc2 +3fe6a09e667f3bf0 +3fe6a09e667f3bac +3fe6a09e667f3c06 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd3daeaf976e788 +bce6128a83448c3c +3cf4f6babe5db9e2 +bcfb094541a2461e +3d027b5d5f2edcf1 +bce3daeaf976e788 +3cf6128a83448c3c +bd04f6babe5db9e2 +3d0b094541a2461e +bd127b5d5f2edcf1 +bfe6a09e667f3bcb +bfe6a09e667f3be2 +bfe6a09e667f3bb5 +bfe6a09e667f3bf8 +bfe6a09e667f3b9e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfa7aa6ae5416a4 +bcd6156546afa570 +3d0d3d53572a0b52 +bd02c2aca8d5f4ae +3d169ea9ab9505a9 +bfe6a09e667f3bda +bfe6a09e667f3bc3 +bfe6a09e667f3bf1 +bfe6a09e667f3bad +bfe6a09e667f3c07 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd60fafbfd97309 +3ce4f8282013467c +bcf583ebeff65cc2 +3cfa7c141009a33e +bd02c1f5f7fb2e61 +bce60fafbfd97309 +3cf4f8282013467c +bd0583ebeff65cc2 +3d0a7c141009a33e +bd12c1f5f7fb2e61 +3fe6a09e667f3bb4 +3fe6a09e667f3be1 +3fe6a09e667f3b86 +3fe6a09e667f3c0e +3fe6a09e667f3b59 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcd1abdbb9ea8e6e +bd111abdbb9ea8e7 +3d0dca8488c2ae32 +bd208d5eddcf5473 +3d1ee54244615719 +3fe6a09e667f3bdb +3fe6a09e667f3bad +3fe6a09e667f3c08 +3fe6a09e667f3b80 +3fe6a09e667f3c35 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf6111d218effa2 +bce3ddc5bce200bb +3d0b088e90c77fd1 +bd04f7716f38802f +3d1584474863bfe9 +bd06111d218effa2 +3cf3ddc5bce200bb +bd1b088e90c77fd1 +3d14f7716f38802f +bd2584474863bfe9 +bfe6a09e667f3bc9 +bfe6a09e667f3bf7 +bfe6a09e667f3b9c +bfe6a09e667f3c24 +bfe6a09e667f3b6f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfcaf6b74b6a225 +bd01a84a45a4aeee +3d172bdadd2da889 +bd18d42522d25777 +3d2395ed6e96d445 +bfe6a09e667f3bc5 +bfe6a09e667f3b98 +bfe6a09e667f3bf2 +bfe6a09e667f3b6a +bfe6a09e667f3c1f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcda79394c9e8a0a +3cf961b1acd85d7d +bd034f272993d141 +3d0cb0d8d66c2ebf +bd11a79394c9e8a1 +bcea79394c9e8a0a +3d0961b1acd85d7d +bd134f272993d141 +3d1cb0d8d66c2ebf +bd21a79394c9e8a1 +3fe6a09e667f3bb2 +3fe6a09e667f3bdf +3fe6a09e667f3b85 +3fe6a09e667f3c0c +3fe6a09e667f3b58 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcc1b19140c0c0d5 +bd108d8c8a060607 +3d0ee4e6ebf3f3f3 +bd2046c645030303 +3d1f727375f9f9f9 +3fe6a09e667f3bdc +3fe6a09e667f3baf +3fe6a09e667f3c09 +3fe6a09e667f3b82 +3fe6a09e667f3c37 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce1a900f67f753a +bd046a403d9fdd4f +3cf72b7f84c04563 +bd1235201ecfeea7 +3d0b95bfc26022b1 +3cf1a900f67f753a +3d146a403d9fdd4f +bd072b7f84c04563 +3d2235201ecfeea7 +bd1b95bfc26022b1 +bfe6a09e667f3bc8 +bfe6a09e667f3bf5 +bfe6a09e667f3b9b +bfe6a09e667f3c22 +bfe6a09e667f3b6e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfee4303b192da6 +bd008de7e273692d +3d17b90c0ec64b69 +bd1846f3f139b497 +3d23dc86076325b5 +bfe6a09e667f3bc6 +bfe6a09e667f3b99 +bfe6a09e667f3bf3 +bfe6a09e667f3b6c +bfe6a09e667f3c21 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcdee2c2d963a10c +3cf8474f49a717bd +bd03dc585b2c7422 +3d0c23a7a4d38bde +bd11ee2c2d963a11 +bceee2c2d963a10c +3d08474f49a717bd +bd13dc585b2c7422 +3d1c23a7a4d38bde +bd21ee2c2d963a11 +3fe6a09e667f3bb0 +3fe6a09e667f3bde +3fe6a09e667f3b83 +3fe6a09e667f3c0b +3fe6a09e667f3b56 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bc36d61b58c99c43 +bd10005b586d6326 +3d0fff494f2539b3 +bd20002dac36b193 +3d1fffa4a7929cda +3fe6a09e667f3bde +3fe6a09e667f3bb0 +3fe6a09e667f3c0b +3fe6a09e667f3b83 +3fe6a09e667f3c38 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf845e1e7f18b23 +bcdee8786039d373 +3d0c22f0f3f8c592 +bd03dd0f0c073a6e +3d16117879fc62c9 +bd0845e1e7f18b23 +3ceee8786039d373 +bd1c22f0f3f8c592 +3d13dd0f0c073a6e +bd26117879fc62c9 +bfe6a09e667f3bc6 +bfe6a09e667f3bf3 +bfe6a09e667f3b99 +bfe6a09e667f3c21 +bfe6a09e667f3b6c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d008c7a80bddc93 +bcfee70afe8446d9 +3d18463d405eee4a +bd17b9c2bfa111b6 +3d24231ea02f7725 +bfe6a09e667f3bc8 +bfe6a09e667f3b9b +bfe6a09e667f3bf5 +bfe6a09e667f3b6e +bfe6a09e667f3c22 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce1a62633145c07 +3cf72cece675d1fd +bd0469898cc51702 +3d0b9676733ae8fe +bd1234c4c6628b81 +bcf1a62633145c07 +3d072cece675d1fd +bd1469898cc51702 +3d1b9676733ae8fe +bd2234c4c6628b81 +3fe6a09e667f3baf +3fe6a09e667f3bdc +3fe6a09e667f3b82 +3fe6a09e667f3c09 +3fe6a09e667f3b54 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cc19abb2567f739 +bd0ee6544da9808c +3d108cd5d92b3fba +bd1f732a26d4c046 +3d20466aec959fdd +3fe6a09e667f3bdf +3fe6a09e667f3bb2 +3fe6a09e667f3c0c +3fe6a09e667f3b85 +3fe6a09e667f3c3a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcda7eeed374bc71 +bd034fddda6e978e +3cf960444b22d0e4 +bd11a7eeed374bc7 +3d0cb02225916872 +3cea7eeed374bc71 +3d134fddda6e978e +bd0960444b22d0e4 +3d21a7eeed374bc7 +bd1cb02225916872 +bfe6a09e667f3bc5 +bfe6a09e667f3bf2 +bfe6a09e667f3b97 +bfe6a09e667f3c1f +bfe6a09e667f3b6a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d01a6dce3ef2254 +bcfcb2463821bb58 +3d18d36e71f7912a +bd172c918e086ed6 +3d2469b738fbc895 +bfe6a09e667f3bc9 +bfe6a09e667f3b9c +bfe6a09e667f3bf7 +bfe6a09e667f3b6f +bfe6a09e667f3c24 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce3daeaf976e788 +3cf6128a83448c3c +bd04f6babe5db9e2 +3d0b094541a2461e +bd127b5d5f2edcf1 +bcf3daeaf976e788 +3d06128a83448c3c +bd14f6babe5db9e2 +3d1b094541a2461e +bd227b5d5f2edcf1 +3fe6a09e667f3bad +3fe6a09e667f3bda +3fe6a09e667f3b80 +3fe6a09e667f3c08 +3fe6a09e667f3b53 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cd1a070ac3e29a0 +bd0dcbf1ea783acc +3d111a070ac3e29a +bd1ee5f8f53c1d66 +3d208d038561f14d +3fe6a09e667f3be1 +3fe6a09e667f3bb4 +3fe6a09e667f3c0e +3fe6a09e667f3b86 +3fe6a09e667f3c3b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfa7aa6ae5416a4 +bcd6156546afa570 +3d0d3d53572a0b52 +bd02c2aca8d5f4ae +3d169ea9ab9505a9 +bd0a7aa6ae5416a4 +3ce6156546afa570 +bd1d3d53572a0b52 +3d12c2aca8d5f4ae +bd269ea9ab9505a9 +bfe6a09e667f3bc3 +bfe6a09e667f3bf1 +bfe6a09e667f3b96 +bfe6a09e667f3c1e +bfe6a09e667f3b69 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d02c13f47206814 +bcfa7d8171bf2fd8 +3d19609fa390340a +bd169f605c6fcbf6 +3d24b04fd1c81a05 +bfe6a09e667f3bcb +bfe6a09e667f3b9e +bfe6a09e667f3bf8 +bfe6a09e667f3b70 +bfe6a09e667f3c25 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce60fafbfd97309 +3cf4f8282013467c +bd0583ebeff65cc2 +3d0a7c141009a33e +bd12c1f5f7fb2e61 +bcf60fafbfd97309 +3d04f8282013467c +bd1583ebeff65cc2 +3d1a7c141009a33e +bd22c1f5f7fb2e61 +3fe6a09e667f3bac +3fe6a09e667f3bd9 +3fe6a09e667f3b7e +3fe6a09e667f3c06 +3fe6a09e667f3b51 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d11a7383c5c857a +bd0cb18f8746f50c +3d28d39c1e2e42bd +bd272c63e1d1bd43 +3d3469ce0f17215f +3fe6a09e667f3bb5 +3fe6a09e667f3b5b +3fe6a09e667f3c10 +3fe6a09e667f3b00 +3fe6a09e667f3c6a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd1abdbb9ea8e6e +bd111abdbb9ea8e7 +3d0dca8488c2ae32 +bd208d5eddcf5473 +3d1ee54244615719 +3ce1abdbb9ea8e6e +3d211abdbb9ea8e7 +bd1dca8488c2ae32 +3d308d5eddcf5473 +bd2ee54244615719 +bfe6a09e667f3bc2 +bfe6a09e667f3c1c +bfe6a09e667f3b67 +bfe6a09e667f3c77 +bfe6a09e667f3b0d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d03dba1aa51add5 +bd16122f2ad72916 +3d24f6e86a946b75 +bd2b0917956b948b +3d327b74354a35bb +bfe6a09e667f3bfa +bfe6a09e667f3b9f +bfe6a09e667f3c54 +bfe6a09e667f3b45 +bfe6a09e667f3caf +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd06111d218effa2 +3cf3ddc5bce200bb +bd1b088e90c77fd1 +3d14f7716f38802f +bd2584474863bfe9 +bd16111d218effa2 +3d03ddc5bce200bb +bd2b088e90c77fd1 +3d24f7716f38802f +bd3584474863bfe9 +3fe6a09e667f3bd8 +3fe6a09e667f3c32 +3fe6a09e667f3b7d +3fe6a09e667f3c8d +3fe6a09e667f3b22 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ce1a34b6fa942d3 +bd1dcb96920ad7a6 +3d211a34b6fa942d +bd2ee5cb49056bd3 +3d308d1a5b7d4a17 +3fe6a09e667f3be4 +3fe6a09e667f3b8a +3fe6a09e667f3c3e +3fe6a09e667f3b2f +3fe6a09e667f3c99 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfcaf6b74b6a225 +bd01a84a45a4aeee +3d172bdadd2da889 +bd18d42522d25777 +3d2395ed6e96d445 +bd0caf6b74b6a225 +3d11a84a45a4aeee +bd272bdadd2da889 +3d28d42522d25777 +bd3395ed6e96d445 +bfe6a09e667f3b93 +bfe6a09e667f3bed +bfe6a09e667f3b38 +bfe6a09e667f3c48 +bfe6a09e667f3ade +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf613f7e4fa18d6 +bd22c27efc9f431b +3d1a7b0206c179cb +bd31613f7e4fa18d +3d2d3d810360bce5 +bfe6a09e667f3bce +bfe6a09e667f3b74 +bfe6a09e667f3c28 +bfe6a09e667f3b19 +bfe6a09e667f3c83 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcea79394c9e8a0a +3d0961b1acd85d7d +bd134f272993d141 +3d1cb0d8d66c2ebf +bd21a79394c9e8a1 +bcfa79394c9e8a0a +3d1961b1acd85d7d +bd234f272993d141 +3d2cb0d8d66c2ebf +bd31a79394c9e8a1 +3fe6a09e667f3ba9 +3fe6a09e667f3c03 +3fe6a09e667f3b4e +3fe6a09e667f3c5e +3fe6a09e667f3af4 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d12c19a9f8dcb3b +bd0a7ccac0e4698b +3d2960cd4fc6e59d +bd269f32b0391a63 +3d34b066a7e372cf +3fe6a09e667f3bb8 +3fe6a09e667f3b5e +3fe6a09e667f3c13 +3fe6a09e667f3b03 +3fe6a09e667f3c6d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcc1b19140c0c0d5 +bd108d8c8a060607 +3d0ee4e6ebf3f3f3 +bd2046c645030303 +3d1f727375f9f9f9 +3cd1b19140c0c0d5 +3d208d8c8a060607 +bd1ee4e6ebf3f3f3 +3d3046c645030303 +bd2f727375f9f9f9 +bfe6a09e667f3bbf +bfe6a09e667f3c19 +bfe6a09e667f3b64 +bfe6a09e667f3c74 +bfe6a09e667f3b0a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d06106670b43955 +bd14f7ccc7a5e355 +3d2584199c2d0e55 +bd2a7be663d2f1ab +3d32c20cce16872b +bfe6a09e667f3bfd +bfe6a09e667f3ba2 +bfe6a09e667f3c57 +bfe6a09e667f3b48 +bfe6a09e667f3cb2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf1a900f67f753a +3d146a403d9fdd4f +bd072b7f84c04563 +3d2235201ecfeea7 +bd1b95bfc26022b1 +3d01a900f67f753a +3d246a403d9fdd4f +bd172b7f84c04563 +3d3235201ecfeea7 +bd2b95bfc26022b1 +3fe6a09e667f3bd4 +3fe6a09e667f3c2f +3fe6a09e667f3b7a +3fe6a09e667f3c89 +3fe6a09e667f3b20 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cea765e893370d7 +bd1cb1342ed991e5 +3d21a765e893370d +bd2e589a176cc8f3 +3d30d3b2f4499b87 +3fe6a09e667f3be7 +3fe6a09e667f3b8c +3fe6a09e667f3c42 +3fe6a09e667f3b32 +3fe6a09e667f3c9c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cfee4303b192da6 +bd008de7e273692d +3d17b90c0ec64b69 +bd1846f3f139b497 +3d23dc86076325b5 +bd0ee4303b192da6 +3d108de7e273692d +bd27b90c0ec64b69 +3d2846f3f139b497 +bd33dc86076325b5 +bfe6a09e667f3b90 +bfe6a09e667f3bea +bfe6a09e667f3b35 +bfe6a09e667f3c45 +bfe6a09e667f3adb +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf1aa6e583501d4 +bd22354dcb06a03b +3d1b956469f2bf8b +bd311aa6e583501d +3d2dcab234f95fc5 +bfe6a09e667f3bd1 +bfe6a09e667f3b77 +bfe6a09e667f3c2c +bfe6a09e667f3b1c +bfe6a09e667f3c86 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bceee2c2d963a10c +3d08474f49a717bd +bd13dc585b2c7422 +3d1c23a7a4d38bde +bd21ee2c2d963a11 +bcfee2c2d963a10c +3d18474f49a717bd +bd23dc585b2c7422 +3d2c23a7a4d38bde +bd31ee2c2d963a11 +3fe6a09e667f3ba6 +3fe6a09e667f3c00 +3fe6a09e667f3b4b +3fe6a09e667f3c5b +3fe6a09e667f3af1 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d13dbfd02bf10fb +bd084805fa81de0a +3d29edfe815f887e +bd2612017ea07782 +3d34f6ff40afc43f +3fe6a09e667f3bbb +3fe6a09e667f3b61 +3fe6a09e667f3c16 +3fe6a09e667f3b06 +3fe6a09e667f3c70 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bc36d61b58c99c43 +bd10005b586d6326 +3d0fff494f2539b3 +bd20002dac36b193 +3d1fffa4a7929cda +3c46d61b58c99c43 +3d20005b586d6326 +bd1fff494f2539b3 +3d30002dac36b193 +bd2fffa4a7929cda +bfe6a09e667f3bbc +bfe6a09e667f3c16 +bfe6a09e667f3b61 +bfe6a09e667f3c70 +bfe6a09e667f3b06 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d08452b3716c4d6 +bd13dd6a64749d95 +3d26114acdc5b136 +bd29eeb5323a4eca +3d3308a566e2d89b +bfe6a09e667f3c00 +bfe6a09e667f3ba6 +bfe6a09e667f3c5b +bfe6a09e667f3b4b +bfe6a09e667f3cb5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0845e1e7f18b23 +3ceee8786039d373 +bd1c22f0f3f8c592 +3d13dd0f0c073a6e +bd26117879fc62c9 +bd1845e1e7f18b23 +3cfee8786039d373 +bd2c22f0f3f8c592 +3d23dd0f0c073a6e +bd36117879fc62c9 +3fe6a09e667f3bd2 +3fe6a09e667f3c2c +3fe6a09e667f3b77 +3fe6a09e667f3c86 +3fe6a09e667f3b1c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cf1a4b8d15ecf6d +bd1b96d1cba84c25 +3d2234971a2bd9ee +bd2dcb68e5d42612 +3d311a4b8d15ecf7 +3fe6a09e667f3bea +3fe6a09e667f3b90 +3fe6a09e667f3c45 +3fe6a09e667f3b35 +3fe6a09e667f3c9f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d008c7a80bddc93 +bcfee70afe8446d9 +3d18463d405eee4a +bd17b9c2bfa111b6 +3d24231ea02f7725 +bd108c7a80bddc93 +3d0ee70afe8446d9 +bd28463d405eee4a +3d27b9c2bfa111b6 +bd34231ea02f7725 +bfe6a09e667f3b8d +bfe6a09e667f3be7 +bfe6a09e667f3b32 +bfe6a09e667f3c42 +bfe6a09e667f3ad8 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcea81c996dfd5a5 +bd21a81c996dfd5a +3d1cafc6cd24054b +bd30d40e4cb6fead +3d2e57e3669202a6 +bfe6a09e667f3bd4 +bfe6a09e667f3b7a +bfe6a09e667f3c2f +bfe6a09e667f3b20 +bfe6a09e667f3c89 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf1a62633145c07 +3d072cece675d1fd +bd1469898cc51702 +3d1b9676733ae8fe +bd2234c4c6628b81 +bd01a62633145c07 +3d172cece675d1fd +bd2469898cc51702 +3d2b9676733ae8fe +bd3234c4c6628b81 +3fe6a09e667f3ba3 +3fe6a09e667f3bfd +3fe6a09e667f3b48 +3fe6a09e667f3c58 +3fe6a09e667f3aee +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d14f65f65f056bb +bd061341341f5289 +3d2a7b2fb2f82b5e +bd2584d04d07d4a2 +3d353d97d97c15af +3fe6a09e667f3bbe +3fe6a09e667f3b64 +3fe6a09e667f3c19 +3fe6a09e667f3b0a +3fe6a09e667f3c74 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cc19abb2567f739 +bd0ee6544da9808c +3d108cd5d92b3fba +bd1f732a26d4c046 +3d20466aec959fdd +bcd19abb2567f739 +3d1ee6544da9808c +bd208cd5d92b3fba +3d2f732a26d4c046 +bd30466aec959fdd +bfe6a09e667f3bb9 +bfe6a09e667f3c13 +bfe6a09e667f3b5e +bfe6a09e667f3c6d +bfe6a09e667f3b03 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d0a79effd795057 +bd12c308014357d4 +3d269e7bff5e5416 +bd29618400a1abea +3d334f3dffaf2a0b +bfe6a09e667f3c03 +bfe6a09e667f3ba9 +bfe6a09e667f3c5e +bfe6a09e667f3b4e +bfe6a09e667f3cb8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cea7eeed374bc71 +3d134fddda6e978e +bd0960444b22d0e4 +3d21a7eeed374bc7 +bd1cb02225916872 +3cfa7eeed374bc71 +3d234fddda6e978e +bd1960444b22d0e4 +3d31a7eeed374bc7 +bd2cb02225916872 +3fe6a09e667f3bce +3fe6a09e667f3c29 +3fe6a09e667f3b74 +3fe6a09e667f3c83 +3fe6a09e667f3b19 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cf60e425e23e66f +bd1a7c6f68770664 +3d22c1c84bc47cce +bd2d3e37b43b8332 +3d3160e425e23e67 +3fe6a09e667f3bed +3fe6a09e667f3b93 +3fe6a09e667f3c48 +3fe6a09e667f3b38 +3fe6a09e667f3ca2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d01a6dce3ef2254 +bcfcb2463821bb58 +3d18d36e71f7912a +bd172c918e086ed6 +3d2469b738fbc895 +bd11a6dce3ef2254 +3d0cb2463821bb58 +bd28d36e71f7912a +3d272c918e086ed6 +bd3469b738fbc895 +bfe6a09e667f3b8a +bfe6a09e667f3be4 +bfe6a09e667f3b2f +bfe6a09e667f3c3e +bfe6a09e667f3ad4 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bce1aeb67d55a7a1 +bd211aeb67d55a7a +3d1dca2930554b0c +bd308d75b3eaad3d +3d2ee514982aa586 +bfe6a09e667f3bd8 +bfe6a09e667f3b7d +bfe6a09e667f3c32 +bfe6a09e667f3b22 +bfe6a09e667f3c8d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf3daeaf976e788 +3d06128a83448c3c +bd14f6babe5db9e2 +3d1b094541a2461e +bd227b5d5f2edcf1 +bd03daeaf976e788 +3d16128a83448c3c +bd24f6babe5db9e2 +3d2b094541a2461e +bd327b5d5f2edcf1 +3fe6a09e667f3b9f +3fe6a09e667f3bfa +3fe6a09e667f3b45 +3fe6a09e667f3c54 +3fe6a09e667f3aea +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d1610c1c9219c7c +bd03de7c6dbcc708 +3d2b0860e490ce3e +bd24f79f1b6f31c2 +3d3584307248671f +3fe6a09e667f3bc2 +3fe6a09e667f3b67 +3fe6a09e667f3c1c +3fe6a09e667f3b0d +3fe6a09e667f3c77 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd1a070ac3e29a0 +bd0dcbf1ea783acc +3d111a070ac3e29a +bd1ee5f8f53c1d66 +3d208d038561f14d +bce1a070ac3e29a0 +3d1dcbf1ea783acc +bd211a070ac3e29a +3d2ee5f8f53c1d66 +bd308d038561f14d +bfe6a09e667f3bb5 +bfe6a09e667f3c10 +bfe6a09e667f3b5b +bfe6a09e667f3c6a +bfe6a09e667f3b00 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d0caeb4c3dbdbd8 +bd11a8a59e121214 +3d272bad30f6f6f6 +bd28d452cf09090a +3d3395d6987b7b7b +bfe6a09e667f3c06 +bfe6a09e667f3bac +bfe6a09e667f3c61 +bfe6a09e667f3b51 +bfe6a09e667f3cbb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0a7aa6ae5416a4 +3ce6156546afa570 +bd1d3d53572a0b52 +3d12c2aca8d5f4ae +bd269ea9ab9505a9 +bd1a7aa6ae5416a4 +3cf6156546afa570 +bd2d3d53572a0b52 +3d22c2aca8d5f4ae +bd369ea9ab9505a9 +3fe6a09e667f3bcb +3fe6a09e667f3c25 +3fe6a09e667f3b71 +3fe6a09e667f3c80 +3fe6a09e667f3b16 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cfa77cbeae8fd71 +bd19620d0545c0a4 +3d234ef97d5d1fae +bd2cb10682a2e052 +3d31a77cbeae8fd7 +3fe6a09e667f3bf0 +3fe6a09e667f3b96 +3fe6a09e667f3c4b +3fe6a09e667f3b3b +3fe6a09e667f3ca6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d02c13f47206814 +bcfa7d8171bf2fd8 +3d19609fa390340a +bd169f605c6fcbf6 +3d24b04fd1c81a05 +bd12c13f47206814 +3d0a7d8171bf2fd8 +bd29609fa390340a +3d269f605c6fcbf6 +bd34b04fd1c81a05 +bfe6a09e667f3b86 +bfe6a09e667f3be1 +bfe6a09e667f3b2c +bfe6a09e667f3c3b +bfe6a09e667f3ad1 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcd1b746c796f33c +bd208dba363cb79a +3d1ee48b938690cc +bd3046dd1b1e5bcd +3d2f7245c9c34866 +bfe6a09e667f3bdb +bfe6a09e667f3b80 +bfe6a09e667f3c35 +bfe6a09e667f3b26 +bfe6a09e667f3c90 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf60fafbfd97309 +3d04f8282013467c +bd1583ebeff65cc2 +3d1a7c141009a33e +bd22c1f5f7fb2e61 +bd060fafbfd97309 +3d14f8282013467c +bd2583ebeff65cc2 +3d2a7c141009a33e +bd32c1f5f7fb2e61 +3fe6a09e667f3b9c +3fe6a09e667f3bf7 +3fe6a09e667f3b42 +3fe6a09e667f3c51 +3fe6a09e667f3ae7 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d172b242c52e23c +bd01a9b7a75a3b87 +3d2b95921629711e +bd246a6de9d68ee2 +3d35cac90b14b88f +3fe6a09e667f3c1f +3fe6a09e667f3b6a +3fe6a09e667f3cd4 +3fe6a09e667f3ab5 +3fe6a09e667f3d89 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d11a7383c5c857a +bd0cb18f8746f50c +3d28d39c1e2e42bd +bd272c63e1d1bd43 +3d3469ce0f17215f +bd21a7383c5c857a +3d1cb18f8746f50c +bd38d39c1e2e42bd +3d372c63e1d1bd43 +bd4469ce0f17215f +bfe6a09e667f3b57 +bfe6a09e667f3c0c +bfe6a09e667f3aa2 +bfe6a09e667f3cc2 +bfe6a09e667f39ee +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd108e433ae0cc54 +bd342390ceb83315 +3d27b8de628f99d6 +bd4211c8675c198a +3d3bdc6f3147cceb +bfe6a09e667f3baf +bfe6a09e667f3afa +bfe6a09e667f3c64 +bfe6a09e667f3a45 +bfe6a09e667f3d19 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce1abdbb9ea8e6e +3d211abdbb9ea8e7 +bd1dca8488c2ae32 +3d308d5eddcf5473 +bd2ee54244615719 +3cf1abdbb9ea8e6e +3d311abdbb9ea8e7 +bd2dca8488c2ae32 +3d408d5eddcf5473 +bd3ee54244615719 +3fe6a09e667f3bc8 +3fe6a09e667f3c7d +3fe6a09e667f3b13 +3fe6a09e667f3d32 +3fe6a09e667f3a5e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cfee15577ae1472 +bd2c23d5510a3d72 +3d31ee15577ae147 +bd3e11eaa8851eb9 +3d40f70aabbd70a4 +3fe6a09e667f3bf4 +3fe6a09e667f3b3f +3fe6a09e667f3ca9 +3fe6a09e667f3a8a +3fe6a09e667f3d5e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d03dba1aa51add5 +bd16122f2ad72916 +3d24f6e86a946b75 +bd2b0917956b948b +3d327b74354a35bb +bd13dba1aa51add5 +3d26122f2ad72916 +bd34f6e86a946b75 +3d3b0917956b948b +bd427b74354a35bb +bfe6a09e667f3b83 +bfe6a09e667f3c38 +bfe6a09e667f3ace +bfe6a09e667f3ced +bfe6a09e667f3a19 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d1ffeedf6b7d68d +bd20008904a414ba +3d37ffbb7dadf5a3 +bd38004482520a5d +3d43ffddbed6fad2 +bfe6a09e667f3c38 +bfe6a09e667f3b83 +bfe6a09e667f3ced +bfe6a09e667f3ace +bfe6a09e667f3da2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd16111d218effa2 +3d03ddc5bce200bb +bd2b088e90c77fd1 +3d24f7716f38802f +bd3584474863bfe9 +bd26111d218effa2 +3d13ddc5bce200bb +bd3b088e90c77fd1 +3d34f7716f38802f +bd4584474863bfe9 +3fe6a09e667f3bf3 +3fe6a09e667f3ca9 +3fe6a09e667f3b3f +3fe6a09e667f3d5e +3fe6a09e667f3a8a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcfee9e5c1ef600d +bd31ee9e5c1ef601 +3d2c22c347c213fe +bd40f74f2e0f7b00 +3d3e1161a3e109ff +3fe6a09e667f3bc8 +3fe6a09e667f3b13 +3fe6a09e667f3c7d +3fe6a09e667f3a5e +3fe6a09e667f3d32 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ce1a34b6fa942d3 +bd1dcb96920ad7a6 +3d211a34b6fa942d +bd2ee5cb49056bd3 +3d308d1a5b7d4a17 +bcf1a34b6fa942d3 +3d2dcb96920ad7a6 +bd311a34b6fa942d +3d3ee5cb49056bd3 +bd408d1a5b7d4a17 +bfe6a09e667f3baf +bfe6a09e667f3c64 +bfe6a09e667f3afa +bfe6a09e667f3d19 +bfe6a09e667f3a45 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d108c1f2850796d +bd27b9f06bd7c34a +3d342307ca141e5b +bd3bdcf835ebe1a5 +3d421183e50a0f2e +bfe6a09e667f3c0c +bfe6a09e667f3b58 +bfe6a09e667f3cc2 +bfe6a09e667f3aa2 +bfe6a09e667f3d77 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0caf6b74b6a225 +3d11a84a45a4aeee +bd272bdadd2da889 +3d28d42522d25777 +bd3395ed6e96d445 +bd1caf6b74b6a225 +3d21a84a45a4aeee +bd372bdadd2da889 +3d38d42522d25777 +bd4395ed6e96d445 +3fe6a09e667f3b6a +3fe6a09e667f3c1f +3fe6a09e667f3ab5 +3fe6a09e667f3cd4 +3fe6a09e667f3a00 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d24695be08e656e +bd172d483ee33523 +3d3a34adf04732b7 +bd35cb520fb8cd49 +3d451a56f823995c +3fe6a09e667f3b9c +3fe6a09e667f3ae7 +3fe6a09e667f3c51 +3fe6a09e667f3a32 +3fe6a09e667f3d06 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf613f7e4fa18d6 +bd22c27efc9f431b +3d1a7b0206c179cb +bd31613f7e4fa18d +3d2d3d810360bce5 +3d0613f7e4fa18d6 +3d32c27efc9f431b +bd2a7b0206c179cb +3d41613f7e4fa18d +bd3d3d810360bce5 +bfe6a09e667f3bda +bfe6a09e667f3c90 +bfe6a09e667f3b26 +bfe6a09e667f3d45 +bfe6a09e667f3a71 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd195059e91c4d2 +bd2f7357d30b71d9 +3d304654167a4713 +bd3fb9abe985b8ed +3d40232a0b3d238a +bfe6a09e667f3be1 +bfe6a09e667f3b2c +bfe6a09e667f3c96 +bfe6a09e667f3a77 +bfe6a09e667f3d4b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfa79394c9e8a0a +3d1961b1acd85d7d +bd234f272993d141 +3d2cb0d8d66c2ebf +bd31a79394c9e8a1 +bd0a79394c9e8a0a +3d2961b1acd85d7d +bd334f272993d141 +3d3cb0d8d66c2ebf +bd41a79394c9e8a1 +3fe6a09e667f3b96 +3fe6a09e667f3c4b +3fe6a09e667f3ae1 +3fe6a09e667f3d00 +3fe6a09e667f3a2c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d195fe8f2b56dbd +bd23500b86a54921 +3d3657fa3cad5b6f +bd39a805c352a491 +3d432bfd1e56adb8 +3fe6a09e667f3c26 +3fe6a09e667f3b70 +3fe6a09e667f3cdb +3fe6a09e667f3abc +3fe6a09e667f3d90 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d12c19a9f8dcb3b +bd0a7ccac0e4698b +3d2960cd4fc6e59d +bd269f32b0391a63 +3d34b066a7e372cf +bd22c19a9f8dcb3b +3d1a7ccac0e4698b +bd3960cd4fc6e59d +3d369f32b0391a63 +bd44b066a7e372cf +bfe6a09e667f3b51 +bfe6a09e667f3c06 +bfe6a09e667f3a9c +bfe6a09e667f3cbb +bfe6a09e667f39e7 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0cb2fce8fc81a5 +bd33965f9d1f9035 +3d28d340c5c0df97 +bd41cb2fce8fc81a +3d3c69a062e06fcb +bfe6a09e667f3bb5 +bfe6a09e667f3b00 +bfe6a09e667f3c6a +bfe6a09e667f3a4b +bfe6a09e667f3d1f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cd1b19140c0c0d5 +3d208d8c8a060607 +bd1ee4e6ebf3f3f3 +3d3046c645030303 +bd2f727375f9f9f9 +3ce1b19140c0c0d5 +3d308d8c8a060607 +bd2ee4e6ebf3f3f3 +3d4046c645030303 +bd3f727375f9f9f9 +3fe6a09e667f3bc2 +3fe6a09e667f3c77 +3fe6a09e667f3b0d +3fe6a09e667f3d2c +3fe6a09e667f3a58 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d03da34489c213b +bd2b0972edd8f7b1 +3d327b4689138427 +bd3d84b976ec7bd9 +3d413da34489c214 +3fe6a09e667f3bfa +3fe6a09e667f3b45 +3fe6a09e667f3caf +3fe6a09e667f3a90 +3fe6a09e667f3d64 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d06106670b43955 +bd14f7ccc7a5e355 +3d2584199c2d0e55 +bd2a7be663d2f1ab +3d32c20cce16872b +bd16106670b43955 +3d24f7ccc7a5e355 +bd3584199c2d0e55 +3d3a7be663d2f1ab +bd42c20cce16872b +bfe6a09e667f3b7d +bfe6a09e667f3c32 +bfe6a09e667f3ac8 +bfe6a09e667f3ce7 +bfe6a09e667f3a13 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d2119d95e8d3107 +bd1dcc4d42e59df2 +3d388cecaf469883 +bd37731350b9677d +3d44467657a34c42 +bfe6a09e667f3c3e +bfe6a09e667f3b8a +bfe6a09e667f3cf3 +bfe6a09e667f3ad4 +bfe6a09e667f3da8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d01a900f67f753a +3d246a403d9fdd4f +bd172b7f84c04563 +3d3235201ecfeea7 +bd2b95bfc26022b1 +3d11a900f67f753a +3d346a403d9fdd4f +bd272b7f84c04563 +3d4235201ecfeea7 +bd3b95bfc26022b1 +3fe6a09e667f3bed +3fe6a09e667f3ca2 +3fe6a09e667f3b38 +3fe6a09e667f3d58 +3fe6a09e667f3a83 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcf616d2a8653209 +bd31616d2a865321 +3d2d3d25aaf359bf +bd40b0b695432990 +3d3e9e92d579acdf +3fe6a09e667f3bce +3fe6a09e667f3b19 +3fe6a09e667f3c83 +3fe6a09e667f3a64 +3fe6a09e667f3d38 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cea765e893370d7 +bd1cb1342ed991e5 +3d21a765e893370d +bd2e589a176cc8f3 +3d30d3b2f4499b87 +bcfa765e893370d7 +3d2cb1342ed991e5 +bd31a765e893370d +3d3e589a176cc8f3 +bd40d3b2f4499b87 +bfe6a09e667f3ba9 +bfe6a09e667f3c5e +bfe6a09e667f3af4 +bfe6a09e667f3d13 +bfe6a09e667f3a3f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d12c0e3eeb304ee +bd269f8e08a67d89 +3d34b038fbacc13b +bd3b4fc704533ec5 +3d42581c7dd6609e +bfe6a09e667f3c13 +bfe6a09e667f3b5e +bfe6a09e667f3cc8 +bfe6a09e667f3aa9 +bfe6a09e667f3d7d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0ee4303b192da6 +3d108de7e273692d +bd27b90c0ec64b69 +3d2846f3f139b497 +bd33dc86076325b5 +bd1ee4303b192da6 +3d208de7e273692d +bd37b90c0ec64b69 +3d3846f3f139b497 +bd43dc86076325b5 +3fe6a09e667f3b64 +3fe6a09e667f3c19 +3fe6a09e667f3aaf +3fe6a09e667f3cce +3fe6a09e667f39fa +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d2583be43bfab2f +bd14f8837880a9a2 +3d3ac1df21dfd597 +bd353e20de202a69 +3d4560ef90efeacc +3fe6a09e667f3ba2 +3fe6a09e667f3aed +3fe6a09e667f3c57 +3fe6a09e667f3a38 +3fe6a09e667f3d0c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcf1aa6e583501d4 +bd22354dcb06a03b +3d1b956469f2bf8b +bd311aa6e583501d +3d2dcab234f95fc5 +3d01aa6e583501d4 +3d32354dcb06a03b +bd2b956469f2bf8b +3d411aa6e583501d +bd3dcab234f95fc5 +bfe6a09e667f3bd4 +bfe6a09e667f3c89 +bfe6a09e667f3b20 +bfe6a09e667f3d3f +bfe6a09e667f3a6a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cea70a9025d3e70 +bd2e58f56fda2c19 +3d30d3854812e9f3 +bd3f2c7ab7ed160d +3d4069c2a40974fa +bfe6a09e667f3be7 +bfe6a09e667f3b32 +bfe6a09e667f3c9c +bfe6a09e667f3a7d +bfe6a09e667f3d51 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcfee2c2d963a10c +3d18474f49a717bd +bd23dc585b2c7422 +3d2c23a7a4d38bde +bd31ee2c2d963a11 +bd0ee2c2d963a10c +3d28474f49a717bd +bd33dc585b2c7422 +3d3c23a7a4d38bde +bd41ee2c2d963a11 +3fe6a09e667f3b90 +3fe6a09e667f3c45 +3fe6a09e667f3adb +3fe6a09e667f3cfa +3fe6a09e667f3a26 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d1b94adb917f93e +bd2235a923740361 +3d36e52b6e45fe50 +bd391ad491ba01b0 +3d437295b722ff28 +3fe6a09e667f3c2c +3fe6a09e667f3b77 +3fe6a09e667f3ce1 +3fe6a09e667f3ac2 +3fe6a09e667f3d96 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d13dbfd02bf10fb +bd084805fa81de0a +3d29edfe815f887e +bd2612017ea07782 +3d34f6ff40afc43f +bd23dbfd02bf10fb +3d184805fa81de0a +bd39edfe815f887e +3d3612017ea07782 +bd44f6ff40afc43f +bfe6a09e667f3b4b +bfe6a09e667f3c00 +bfe6a09e667f3a96 +bfe6a09e667f3cb5 +bfe6a09e667f39e1 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd0849735c376aa4 +bd33092e6b86ed54 +3d29eda328f22557 +bd41849735c376aa +3d3cf6d1947912ac +bfe6a09e667f3bbb +bfe6a09e667f3b06 +bfe6a09e667f3c70 +bfe6a09e667f3a51 +bfe6a09e667f3d25 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3c46d61b58c99c43 +3d20005b586d6326 +bd1fff494f2539b3 +3d30002dac36b193 +bd2fffa4a7929cda +3c56d61b58c99c43 +3d30005b586d6326 +bd2fff494f2539b3 +3d40002dac36b193 +bd3fffa4a7929cda +3fe6a09e667f3bbc +3fe6a09e667f3c71 +3fe6a09e667f3b06 +3fe6a09e667f3d25 +3fe6a09e667f3a52 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d0843bdd561383d +bd29ef108aa7b1f1 +3d330877baac2708 +bd3cf7884553d8f8 +3d41843bdd561384 +3fe6a09e667f3c00 +3fe6a09e667f3b4b +3fe6a09e667f3cb5 +3fe6a09e667f3a96 +3fe6a09e667f3d6a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d08452b3716c4d6 +bd13dd6a64749d95 +3d26114acdc5b136 +bd29eeb5323a4eca +3d3308a566e2d89b +bd18452b3716c4d6 +3d23dd6a64749d95 +bd36114acdc5b136 +3d39eeb5323a4eca +bd4308a566e2d89b +bfe6a09e667f3b77 +bfe6a09e667f3c2c +bfe6a09e667f3ac2 +bfe6a09e667f3ce1 +bfe6a09e667f3a0d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d22343bc1be76c7 +bd1b97887c831272 +3d391a1de0df3b64 +bd36e5e21f20c49c +3d448d0ef06f9db2 +bfe6a09e667f3c45 +bfe6a09e667f3b90 +bfe6a09e667f3cfa +bfe6a09e667f3adb +bfe6a09e667f3daf +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd1845e1e7f18b23 +3cfee8786039d373 +bd2c22f0f3f8c592 +3d23dd0f0c073a6e +bd36117879fc62c9 +bd2845e1e7f18b23 +3d0ee8786039d373 +bd3c22f0f3f8c592 +3d33dd0f0c073a6e +bd46117879fc62c9 +3fe6a09e667f3be7 +3fe6a09e667f3c9c +3fe6a09e667f3b32 +3fe6a09e667f3d51 +3fe6a09e667f3a7d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bcea877f1db6080c +bd30d43bf8edb040 +3d2e57880e249f7f +bd406a1dfc76d820 +3d3f2bc407124fc0 +3fe6a09e667f3bd4 +3fe6a09e667f3b1f +3fe6a09e667f3c89 +3fe6a09e667f3a6a +3fe6a09e667f3d3f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf1a4b8d15ecf6d +bd1b96d1cba84c25 +3d2234971a2bd9ee +bd2dcb68e5d42612 +3d311a4b8d15ecf7 +bd01a4b8d15ecf6d +3d2b96d1cba84c25 +bd3234971a2bd9ee +3d3dcb68e5d42612 +bd411a4b8d15ecf7 +bfe6a09e667f3ba3 +bfe6a09e667f3c58 +bfe6a09e667f3aee +bfe6a09e667f3d0c +bfe6a09e667f3a38 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3d14f5a8b515906f +bd25852ba57537c9 +3d353d6a2d45641c +bd3ac295d2ba9be4 +3d429eb516a2b20e +bfe6a09e667f3c19 +bfe6a09e667f3b64 +bfe6a09e667f3cce +bfe6a09e667f3aaf +bfe6a09e667f3d83 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd108c7a80bddc93 +3d0ee70afe8446d9 +bd28463d405eee4a +3d27b9c2bfa111b6 +bd34231ea02f7725 +bd208c7a80bddc93 +3d1ee70afe8446d9 +bd38463d405eee4a +3d37b9c2bfa111b6 +bd44231ea02f7725 +3fe6a09e667f3b5e +3fe6a09e667f3c13 +3fe6a09e667f3aa9 +3fe6a09e667f3cc8 +3fe6a09e667f39f4 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d269e20a6f0f0ef +bd12c3beb21e1e21 +3d3b4f1053787878 +bd34b0efac878788 +3d45a78829bc3c3c +3fe6a09e667f3ba9 +3fe6a09e667f3af4 +3fe6a09e667f3c5e +3fe6a09e667f3a3f +3fe6a09e667f3d13 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bcea81c996dfd5a5 +bd21a81c996dfd5a +3d1cafc6cd24054b +bd30d40e4cb6fead +3d2e57e3669202a6 +3cfa81c996dfd5a5 +3d31a81c996dfd5a +bd2cafc6cd24054b +3d40d40e4cb6fead +bd3e57e3669202a6 +bfe6a09e667f3bce +bfe6a09e667f3c83 +bfe6a09e667f3b19 +bfe6a09e667f3d38 +bfe6a09e667f3a64 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3cf60b679ab8cd3b +bd2d3e930ca8e659 +3d3160b679ab8cd4 +bd3e9f498654732c +3d40b05b3cd5c66a +bfe6a09e667f3bed +bfe6a09e667f3b38 +bfe6a09e667f3ca2 +bfe6a09e667f3a83 +bfe6a09e667f3d58 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bd01a62633145c07 +3d172cece675d1fd +bd2469898cc51702 +3d2b9676733ae8fe +bd3234c4c6628b81 +bd11a62633145c07 +3d272cece675d1fd +bd3469898cc51702 +3d3b9676733ae8fe +bd4234c4c6628b81 +3e40000000000000 +3e30000000000000 +3e3fffffffffffff +3e30000000000001 +bdc1a62633145c07 +3dd72cece675d1fd +bde469898cc51702 +3deb9676733ae8fe +bdf234c4c6628b81 +3ff0000000000000 +3ca1a62633145c07 +be31a62633145c07 +bfc197d8b5f1b887 +3feafdb6abb530ab +3fed47812cc2e038 +bfe3e3920b3d318b +bfefd644e7f0d336 +3fe3ce6297d201f6 +3fe80515e8156549 +bfe6c214f531014d +3feffec3c2775264 +3fe9b4e3808e9b68 +bfefd48b9c46702d +bfc7280c79d5a7bf +3fece62b89146e1e +3fc10b90167c430b +3fd91e6a8a51624f +3fe1f49d533eff79 +bfee7aef0412fcf4 +3fef5b9d3238dce6 +3fd7743240b6335d +3fe7db45c5a2cd4c +3fc67a6f467bd51e +3fc43fdb74da64b6 +3fe3e7a2799e383c +3fe70488a23fdfc1 +bfed32544598314b +bfec33bd5ca970a5 +bfd1e16951e98101 +bfdb710bdf0c8470 +3fef25646aed35d3 +3feb5cf55725bb93 +bfe1d166eeaf9918 +bfeb2fd9b26efa46 +bfeff6eaf79f20e5 +3fec9e09cd6bda72 +bfee2cb7ef076501 +bfb9b3d4433269c4 +bfe50c131621975a +3fed7f34673db4a2 +3febfd8bb25b22b4 +3fd162c2174db0d2 +bfe750a36561d3e6 +bfea15741bea4be1 +3fe7081809bed806 +bfc82a1f8a6ffafc +3fc352252949d871 +3fefe5b52108b37e +3fddb86cfa983b57 +3fb72f0166908b89 +3fd10d01865d1e58 +bfe47058a876c7da +bfef2ccb9cea972c +3fe48d752f73625a +bfcfc1be40d5caa9 +bfb2da8e5286fc97 +3fef331e5cf1df47 +bfde42264dd13906 +bfecda94e17d2c89 +3fe36be4f939536d +3fee931ca3c8b677 +bfef35c2e22fd5af +bfeff79418614fd6 +bfe6073073069261 +bfefde6ca997c4b9 +3fecc5a732c556a3 +3fe69461be953e3a +bfeee65912680ec7 +3fd54393aa350d73 +3fe7cf2475e76e19 +3fd8fe3cfcdae627 +3fec22b7170b0279 +bfe756d1d274835c +bfea775ebab46854 +3fe862abb353985d +bfed883b5062a77d +bf50a7c647bfedef +bfefacd4cbfa86fe +bfc74a4d7f9489dd +3fef8b5cda278ec4 +bfe1a8d495046a9b +3fed838f768f467c +3fe97f36be8deb18 +bfe681131c89e414 +bfee1d6307f86072 +3feba3caee76ec6c +3feb39a3c7c8a967 +3fef0c35f74629cc +3fa71362f291dce4 +bfd756e46ec1b8a2 +bfec301c2ae93a6c +bfe1dc7bac3850e7 +3fea20ec5a370372 +3fe2608cd0001a19 +bfefc98b6662ebdc +bfe9e3804cf08772 +3fec7aba41d208ec +3fe403ef2916e640 +bfef85fb8dca3d43 +bfe9caab5ca95485 +3fe680d76d7a4bca +bfe6acb821437b38 +3fefcf52d4408cb5 +3f7956310954df47 +3fd4bab051884926 +3f8bfc846f5a9a86 +3fe8a990fc75a55c +3faa2d3e00dcb395 +3fc67e193bf4a44d +3feb4faae981f935 +bfcb241ab7b95c40 +3fe9365e6c84b028 +bfee50f3c3b535f6 +bfeffe0bbb38c704 +3feda6616a35b4c6 +bfc060ea56fa28b4 +3fef8420ea0913fa +bfec88b593f3e4c0 +3fef7929d1f07bfa +bf6dde9dc8ae9c0e +3fe006a54530162c +bfefb804b1f061db +3fd37c5d4f10f805 +3fe64c97e2f5498d +3feb4fd098260fdc +bfdb840f5c61c9a0 +bfd770ec957519a4 +bfe1f4e96d796753 +3fccf6da7584ab29 +bfcdbcb517d93809 +bfe9fd4e93b258f0 +3feff091373113df +bfee6f326b7773ca +3fe25bdfe487d334 +3fec3f5e5ebc9b6d +3fe83525f5670e5d +bfefffcceddde1fa +bfc38d24d54dba7c +3fdf0834b834af14 +bfedfcee4f85befc +3fe4800f28b88706 +3fdf5adbc351ad2a +bfd24c5e1ac2fa8f +bfe706a948e951d2 +3fbf18ecad2dcb56 +3fe721aae84b6f85 +3fefdf9a4b4b7bd4 +bfe6494dea714112 +3fcdd2afb770cebd +3fe4be3f1837957b +bfe6781f658fbcb2 +bfbb91b0b92a393b +bfef812984e17054 +bfef9569f86683c2 +bfe9076574ff1bb0 +3feeb25b2bfb163c +3fe2900ae238b8c8 +3fcba909dbf924e4 +3fef3ac434f752f9 +bfe074ef9c9657ad +bfee1af50825e466 +3fd5531b045882f1 +bfeffec5d5b921b6 +bfdd7ebad8069dd0 +3feca893bcd3638f +bfc8d7c2c99ade8b +3fee157d507fabde +bfe5f03758367299 +3feea10a692c8139 +bfef10e2f7f73cfb +bfe42c161c5b2e4e +bfed6c5ab361b6f2 +bfcc6d097cd6d39d +3fe2a1086eccd992 +bfd0243d190eff60 +3fedb36582599c1f +3fee110f4e299047 +3fb9f6f6ede95e94 +3fe787a58016c279 +bfef93c9bb44f752 +3feff7ed90c73ac2 +bfeff352f0975153 +bfe44e3b7e3fce34 +3fdbbafa0ea9454b +bfd36a7e56b13201 +bfdeddcf6b844d0d +bfebecbd3680746a +bfe7da04716a9c71 +3feea1793eb12ee6 +3fef428ef745d0c1 +3febb37643048558 +bfe3980396858262 +3feaf97d07a7841c +bfed97b0bf1a842b +bfeffa7d6c3a5e75 +bfd18111908bf805 +bfebd8e8fdecee74 +bfe1e0b795d8911e +bfea8c4359bd9119 +bfd8fed006f57720 +bfc1dc0dcbf8939f +3fefcf68776e6c4c +bfca7a591a943504 +3fedf72c92bfab93 +3fb856e7605ec742 +bfe2148691d26918 +bfd78cc84cf4e136 +bfe49f7cb5a1ed20 +bfe8024067f064fa +bf8bcb7d47f6e78e +3fdca36c5ab2aa22 +bfe8565e66df74bb +3fc7d4d9dad80d7e +bfee3af8f2f30032 +3fd8f7abd8c45c83 +3f56bda89b00d1ce +3feacd0d92e66779 +3fc1b747b102631e +bfef58016a07629c +3fe343835b20a3ce +bfeec6b2a686ee13 +3fde87fc81f12ad7 +3febfb46147228d7 +3fc7677810887640 +bfc71bed19ddbe88 +3fe7d04c06b5445d +bfb9c2018e353c9f +3fea2665f8fdd7d5 +3feaf8efb6f63df8 +bfe76114f87c1064 +3fe5ee088ea10619 +bfef863eb34498b9 +3fb3acdaee9830d5 +3fd9bb1063752acd +bfe2975d7cd23d51 +bfe05c82c17ef942 +3fd9300a0b7a512c +3fed02d5f8b845d3 +3fe52e7244cf66c4 +3fb7bc4c5117f168 +bfa50869c04a7c3e +bfec8f5ef0f24006 +bfe67a981c512714 +bfef4f263d622afb +3fc11725e7e4447f +bfd625916b6f1d0d +3fec194a9f9ca545 +3feb167e5cc72f35 +bfeb6a77d90f6fad +bfefd59139f55b3c +3febb08c1fc2fb61 +bfc852eb53235a3c +bfe8cd360b0f4756 +3feeeb67d6e0ef7b +3fec3f12fbbd9023 +3fcbfbec6cdece34 +3feca39ba95e0c87 +3fde6a42e9a9404d +3fe7d3b3be726234 +bfedfa317ec2d417 +bfeb0e1237167aa1 +bfe0de4fdfd0e2cd +3fc6a9a92789ba31 +3fdacddf7cda0432 +bfc0f9099f8e931e +bfe6ce1bb2ac6067 +bfefc9f36a570d24 +3fdbd0607226334e +bfd1135d080327b4 +bfc31446762717e2 +3fc2c507f518e10c +bfc87769aced0bf8 +bfe5746a44ccad24 +3fefffef6063efa4 +bfb9cfd7c9997b06 +bfaba799c7bac272 +3fe635f7e40dc1a1 +3feb2412bf87439b +bfb8773b7cd555bf +bfdada53aa3813a5 +bfc8e8b6b6e3acf7 +3fc7a6aad0f95254 +bfeb5cbdc04ee72e +bfd5167b129fac67 +bfea499e0b99e1bb +bfd683b9d67aeded +3fc345445a9024aa +3fefeec09801fb45 +bf7068200b0d34b0 +bfeffcbe149f9298 +bfe2d36f96f3bd0d +bfecd6c4b692d0be +3fe93d5d96950dbd +bfe91adda9bcda14 +3fefe8cc93ac33b9 +bfec99cd297b3a56 +bf6e3a2042aea7ea +bfe38ce28af8cd17 +3f801d02f024e07d +bfe48470507081c9 +bfeffebb3a93adc9 +3fedbe9d819eac21 +3fe80a3cd9c6ef3e +3fefb9c3ca7fdeaf +bfe874bac4d138b8 +3fed1fb3e05fe477 +bfe24a0bed656653 +3fd6a0d966707f87 +3fe2c87fee6dc7cf +3fc4865a334d3a6b +3fea0c3c298f0e48 +3fecff33a38a579b +3feb4feb92628218 +3fbdbc12dd50295d +3fef617e1420ebd4 +3fedd8efaaaae4ac +3fee70f924dabe79 +bfef0019bb029582 +bfedc59bfe86676b +bfe0a09dee08d650 +3fecf3d348f5788a +3fe8ebe741634376 +bfeff951bf42e2c9 +bfe4c05c61ae17eb +bfeff57cbdd7e91e +bfc93080fd957a4c +bfd57b0371be5862 +bfeef880fb1b7dcf +bfeec18be5eb781a +bfd3c6920ed4eb8d +bfeffab2603c0642 +3f92626a4560fce3 +bfcc49982bb3aab7 +bfeaef5ad8cefa80 +bfd87cd69b5a5d4a +bfee3e27a531075f +bf9aa1a17e4cd0d4 +3fee8cf751716b34 +3febf07f09fe3099 +3fe9af411890f91c +3fefff7f8aae2102 +bfe9e55f5a905b30 +bfec2f6206e77952 +bfed763095953e70 +3fec9fe406badcd2 +bfe5a4f6df0f5b84 +bfebd348c4645133 +3fe693c81215575a +3fe55487b5c9b3a2 +3feabbee9fef62fa +3feb55f8e078b31b +bfec1818f19d4a31 +bfed4e9cb969183c +bfeda1fb76ded176 +bfe1f7a4af9235ce +bfe602f9fb08ce8e +bfe854059d773bc9 +bfc8531460b5bf96 +bfe2a9cec5672a9d +3fe8551e3ee0d648 +3fda5bdc31caf114 +3fe14c97092535ce +bfe5728951daa99d +bfefd543da5cde56 +3fe750dc01ba0190 +3feefabe88677ce1 +3feffffffe052acf +3fefffe7c5ef1277 +bfe92aecb204431d +bfe1347c3e1c883c +3fd1e15bab4bcab4 +3fe636fa00ac991c +3fd6699acc7e2021 +3fba8a996cd7f1e5 +3fd21327db7b4b33 +bfef4c87befc240f +3fee5a70998aeaea +3fc21abc88cf767a +3fd74185de200837 +3fef1f0594670dd5 +bfd4b0726d35a91f +3fecbfa797b3578f +3f9c0d25373d8996 +bfd88b49b0022a6b +3fd7b952ff5d077d +3fdfcb32a817608e +bfda8c8e5f5e9b6a +bfd7d1dbed59febf +3feead35c10b13d5 +bfec7c6abb59de6e +bfc964e40191175b +bfe951dffa4331ee +bfef85e280ecfded +bfc66dbae6a4db29 +bfb0114f2440b622 +3fec2844e1ff9287 +3fc74b424c00b3fb +3feffffa285ab800 +3fe7486cb47361eb +bfd7d2de6252184c +bfea70ba93e4faeb +3fd89333314d5cd6 +3fd10ed78998df4d +3febd510b5b97f65 +bfec2b314bea28dd +3fe07f99341c1665 +3fed5c25fe4f9826 +3fe7a7cf55c0ad98 +bfb3165b9d7cf266 +bfe84e486c28c6b0 +bfefc1a2089b483c +3fe8deb529766ee0 +3fe499daf37a572b +3fc6173e7862e7ca +bfeb41cf32bbd8fd +bfeb30b6a20e0dc6 +bfd42d52c6e4286f +bfedddcf076b4316 +bfeca19d0989829f +3feff779f29c0ea8 +3fc75de67e76f7b5 +3fd7b610519fd008 +bfa18b68b3e53b64 +3fdcbe19d75655bc +3fe9a920c7330b2f +bfefb8a4d03d0334 +3fe49cb443901acc +bfbd7e4215d5cbcd +bfe52f4464f21bb8 +3fddc8667eaa33a6 +3fd8c877dd710770 +3fe3bb91cf4cb092 +bfd52e6742808985 +3fc8db325fea89ab +3fe8a0d0c98b00d3 +bfeb2cd40bc1a489 +3fe7c24bf1e02b42 +3feec61872f32a06 +bfb5c5ff964eabce +bfe7c30a3f3d5d81 +bfc3b5382e47532a +3feb1113cb6073dd +bfee73253025c6e7 +bfe4e5b00815eaf1 +bfe65de108ed1380 +bfc10e67f77c96ee +bfe7622541317606 +3fea0daec2e5df33 +bfc45d0e7ae0a394 +bfeca803d6cf45fe +bfd26f75760ed418 +bfdf32fee427ab0e +bfefe62123c442e1 +3fd5ef20e5a4f8af +bfeffd9d6cd7c9dd +bfe5100f97b3504c +3fe8d995678cacb8 +3fe42be91ec84ea1 +3fdf415974a1ac5c +3fd25e7b7efdaa8f +bfe10d811287424d +bfba9d193c9f6001 +bfcd19a590762fb1 +bfefc1df8e44667f +3fea9b9f18411b36 +3fede5d03a5da121 +3fe925f9769a600c +bfe63c169fb1cdea +bfe46b551bf2d791 +3fd2558f3d88174c +3fe86dc8de47dacc +bfe967bebd779193 +3feffcf15dbd8aea +bfeff0a066d04827 +bfc0a5e0087b7230 +bfb66944c5551df0 +bf9e8a6d8b035e12 +3fe030e2b55ab197 +bfe4331c754ad8b1 +bfe43327397157e8 +bfa43396c968f4d8 +3fd3d06f56642b99 +3fe7e40a4946702b +bfbc1e025f96a813 +bfccada8ed6cc2b2 +bfd23ca127441427 +bfe90acfffce3ac6 +3fe355468566a01b +3fdacbaed5ba8758 +3fee3e5842a3c2ff +3fe30c414ee5055c +3fc11d1020440a92 +bfe12e4984f11c92 +3fd3283cb79c6231 +3fe6c910ce05e4be +bfeffc9fc927d1df +3feca7e5cdc0ade3 +3fe3ff52408e694b +3fab37b3b4f330be +bfeb2155ac082e88 +3fef100aed5d5c28 +3fe0582d9b17d176 +3febe42c90c0c309 +bfef8c2f7d3c0551 +bfeff9915ac1d061 +3fdc3e0c27bf6479 +3fe2386ee62f7c0e +3fe7dc729821d807 +bfe696ba8908c351 +bfe4bcb051d98dfa +bfeb5d678084b30e +3fe8d75ee45d4a9f +3fd9d53539db6fd9 +3fd3c859e7e4692d +3fd83983425adc2a +3fef7f3564651c64 +bfd38a2d3b3e4255 +3fe65195929474f9 +3fefb98218fb3165 +bfe35d1151359fee +3fe6b09788febc58 +bfd38c507a0be905 +3f963b77ce628086 +3fb3642c1304ca05 +3fbd84069c09804c +bfe98e6d5d83201d +3fde5dcef6faa61f +3fe3807861b4580c +bfef21e3a4b0a78a +bfee547247753bbb +3fecf7ed120ac5f2 +bfe851c9c0add2f8 +bfdd5b7db4fcd3b5 +bfe7f275ff6c0f7a +bfc00fdbf61077cf +3fe804a1dc607332 +bfed3575d106b816 +3fd8b9d435fe3d4b +bfe84a05b5ef3f6f +3fd55732ec82dd31 +bfe294e604c1d847 +bfed92d128bdd334 +3fe4ef6eb72faf73 +bfeb0a7824c3ce98 +bfe3dc2f6b7f8cc3 +bfefc5d11f8f4860 +3fef450a3ea1b4b9 +3fc9ddfdcc9f613d +bfe9459c03cb9b2c +3fe8c1017cd176c1 +3fec75be9eb4ca0e +3fed26cdf6e46816 +bfb7ac0d8e06d40e +3fed1ac666129705 +3fef8456d83cb9bd +3fef54d57f958196 +3fefb6ba03274674 +3f937e1d1209d7df +3fec4c2038e56c4e +3fcd06819a6b96c0 +bfef488d9bb4bb7d +3fe493a487478a44 +3fe6c2b749743eda +bfefbbe4b6a679b7 +bfeff3e18d1564c0 +bfe2c5ef4d794065 +bfcfc0c3fd461cfe +3f90e6bf6b4afefd +bfec0de86c6895f4 +3fe3895867d3ca21 +bfe6285342889cd2 +bfef99de25e447ae +bfe2c4abd53357fb +3fe16ebbc046ac88 +3fd69707bc85b858 +3feffeb71fa943b8 +bfef1a3f05ad46da +3fe9e6aca4d1d723 +bfee4909f225ec16 +3fe308f76162f746 +3fde09e01f846ae9 +3fefbc869c97fa80 +bfe60753bacb0806 +bfe634185d7775ea +bfe1c46002b93c32 +3fe589974dadfed3 +bfe9bf2402d0a8b9 +3fec6fa6bad1cb4c +bfe350bc9d99e623 +bfefc54f82969640 +bfccbf1c04dcda88 +bfecaeff3eefceeb +bfca9ded82b86e28 +bfde55115e306b94 +bfefc9f7737bda01 +bfbf7606f4e504f6 +bfee3f8d3eba80ce +3fe8c7953cde394b +3fe610b015746142 +3fefd20b2dee3b01 +bfe99a6022441c1b +3fea68b62a804521 +bfe2114227b857ab +3fd33108f1fb37be +3fdaa1c42f83451d +bfe28b930e6d3987 +bfee535550556bfd +bfd971536f4fb8d6 +3feffbd27383665c +bfe7e2811c3fe24d +3fee52c5ce65ef52 +bfecd42acd11e345 +bfd07549713279a1 +bfe885aba270eedf +3fefeeb886b9f023 +bfeff804177b077c +3fe588db9f08ee17 +3fc2c78701580c50 +3fd62c18e6078073 +bfe6f1d54fd08967 +3fe583c94535dd96 +3fe999b85ca6f3fd +bfeffeb9ffe78379 +bfc070f07d90fddb +3fd734d3f77fa5b9 +bfeb3309eaa1e389 +bfee70be310f6604 +bfe0333bd60914bb +3fecdd21c2592497 +bfe4b7a2f411f5c9 +bfe20cbd3f91f455 +bfe950806565126a +3fec41719d742ad2 +bfe48aa2037cf505 +3fef3992da898da5 +3fcf8b1603a9d1a6 +3fe9bac68e096c8c +bfdd5b7e5e4745b8 +bfefff633a5ce165 +bfb9343c551d670b +bfe01532ce1b3b3f +3fee40047c035853 +3fe9f7313f70800c +bfeeb6b03cbaf47e +3fde2be0f3f54770 +bfe900331c382ce9 +3fd8ec11e0bd6b8b +bfd0210b201b2b9e +3fefd1efec816473 +3fed08934e14ce7d +3fc11882b0a98818 +3fd4c890af3dd2a1 +bf79b443730fc648 +3f919f88db3ed5cc +3fddeb955c8e8989 +bfe90bf47232bd37 +bfe0cc45f83b4ee0 +bfed4a0a06eb03ff +3fe2e31e0d071945 +bfefeda9c1761832 +3feaed37ad3b86f9 +3feec4d669fe4403 +3fab882f7d7c2f66 +3febabbaf8fe1070 +bfe753a289f8cf14 +3feeb45ee0ed789b +3f6697c730862a31 +3fbfcc52c46d3216 +3fe932b4962cd8e2 +bfeee3f370d0d01b +3feedfdc89a62b52 +bfecb086bdda7967 +3fef61359e49c8a5 +bfe0d76ed3844e76 +bfef75d618e7b75d +bfefffe1c804a111 +bfe2f1809c191263 +bfcbb3be3acd71f1 +bfc1c6977a66683b +3fe48fcee355b0b2 +bfec8e3b35338f2c +bfeff52a9873eda0 +bfec7fef0a3558a7 +3fe4f8c88023e2fb +3fefad1de3fb2dd1 +3fe0eb2bbf3d7271 +bfd646f10386916d +bfea34eed5e78fab +3fe492c2808ccf98 +bfe8eb58c6cb3d83 +3fd5c6bdfeedf1e2 +bfe59f2f94874e14 +3fcbb152c1036de9 +bfe750f2ea93402c +bfdb63b4101fd39c +bfa953c482888368 +3fee8394c3092e6c +3fdf9f2718c3fec7 +bfd0d5ec9af2abc9 +3fd686c9a4c708e2 +bfd39f281b315216 +bfef68c4e4d951bb +bfeeb24db6be6746 +bf901e5ce6e14d30 +3fdc5811263f0dd0 +3fe928c090fb64d6 +bfe849a82476077a +bfb2ecb6d04e0b57 +3fedc509f7dc6830 +bfe6a35b87df6e50 +bfd7700a23ea0c3c +bfe8d4971c757f63 +3fd10e047605b031 +bfed110fd95f89cd +3feed71816a98ee7 +bfe0ca40bce34028 +3fe77af3b4024954 +3feb40f62e231e11 +bfe87b6009c8b125 +bfe52ba1ce9dd871 +bfcefab1b4a142eb +bfe7511dddd2b0ac +bfefb8395e8c7ce7 +3fec229da64fbfcd +3fe0915bc0f576ae +bfb66dcb8f725ed9 +bfef64a0bcda4d5c +bfc51d8737787449 +bfe8001acaf22b2a +bfc5b513f00ecee6 +3fdd5d9b64101e9d +bfeeeb675104e5d5 +3fe77914a888e573 +bfdf07b56f6b56e4 +bfe74ab1b16ebd36 +bfefe1bf7574f1c2 +bfe2beee53792af8 +3fefac0ad1c5f136 +bfdf46a12c3df957 +bfe8080680911c0e +3fee7f7f07a1f8c7 +3fefe13af220df79 +3fee28e7aa8552f7 +3fabddf857563af7 +3fefd1755ab9dd68 +bfa194afc04972a0 +bfebdade04d8db79 +3fe63bc0db9f9253 +bfcc5be683b6c491 +bfdfd31d9d614ed3 +3fe3df20de21b3d5 +bfd87a18741dc7cb +bfdd9e4d4f9289bf +bfefe9bf694821c4 +bfec81e8c2ec2b46 +bfdbce881d1d0cb0 +bfefffe1a3262d09 +3fe642c1e6e3fef8 +bfefffda6dd7a2ca +bfe8f1ef23b17fbe +3fee8a5669e34154 +3f980a82a089a6fc +bfeb6ae4a386b1d9 +bfeefff01ec0e338 +bfe4a56cc714a4e2 +bfe9835578c55448 +3fc6abc9292a4165 +bfef2f5f0a8f975c +3fe75c82c10235b1 +bfee5a88b0697675 +3fc6404f4218eb7d +bfdbdff46d79f97b +bfc577b69cbb917a +bfee5dc555b59f83 +3fc1ddd652724074 +3fe313311365deeb +3feaf9e0a0135596 +3fef310224cd5dc1 +3fcd4ee060b2ac7c +3fdac0debc10cf3c +3fdcda056625e574 +bfa89f9ba85b8c8e +3fd0114c2bc3447e +bf8253bf61e1973f +bfed1238f9d9a573 +3fe9c88d456b32a7 +3fd3a390f41b3871 +3fdf31480c407cde +bfeaf8487a1b3753 +bfe9b80cfe371b98 +bfee03f4d5eb2d49 +3fba8970ed92f91b +bf9d3558d429f4cf +bfeeb78310986247 +bfe49537e586a036 +bfec021a4580d12a +bfea2195c991f824 +bfe827ff95ba50b3 +bfe452b02264139c +3fef3ede90e367fd +3fef3c209c7a4e14 +3fefdcc1a2b4d3a7 +bfefff527e84a16f +3fe5f27a38f93cac +3fd4b28adec9f4df +3fea0e6194d2a28f +bfee0c848ca050be +3fefd08c5b40cba3 +bfd1bc50da21ea5a +3fd43066cf20bf49 +3fe43f9c37eb6c6d +bfed8682650331f4 +bfee34c646cbb95a +3fe3dc9e85fa7e27 +bfec88a20eff6910 +bfe8de25c3d7943c +bfed3cd8620a267a +bfed161ca60aa189 +3fed227cd9afaec9 +bfe304c00c9174a4 +3feb1b313b99c2fd +bfef9752878d6d33 +3fd72646d7dfb700 +3fed0d247e42b97b +3fef2973b3eb5f5d +bfee91374c7aab75 +3feda4a123a075a4 +bfeff6ec857b0f7f +bfed0c5438c9a775 +3fcbbef87cc2852f +3fddb879de09edb7 +3fe8b4647407f145 +bfeff841e86800c1 +bfce143104366245 +bfec24aa5c5e775c +3fef51c9a8a7dfd6 +3fc2035fc8bc04f8 +bfc0e53cfd39c124 +3fdbc7e168efa607 +bfd57ac251edeeee +bfdbe550b0710fac +bfeb60ed07990c0d +bfc25ea3fb65b175 +bfd2452e31af9ac3 +3fe418f8a0ae6d4b +bfe80c39c04a0043 +3fed4382ced1a985 +3fe842399542e68e +3fe903c95cd31f47 +3feeb4c9576c8591 +3fec30e692f086df +bfd405ed06221586 +3fef8f677a71bbbe +bfe48d015d6c89a5 +bfef50aabc62ee23 +3faa172803225fd8 +bfef6045a01187c2 +3fdd0ba24964ac29 +bfdea4d3d8a0fa2a +3fe32312857e2c1d +3fefedd038543998 +3fe73f0511055c2f +bfefd93f0859121c +3f50475f4c60fa0d +3fccb2079827a2f7 +3fe7663d121f480f +bfdc3b81178d3ce6 +3fe0d0be0c13e30a +3fef1f2055de310f +bfd36779a3413f19 +3fedc44bb8ebf1a5 +bfe5577c1d389ca8 +3f958b89476bab65 +bfef10597c76f1b8 +3fe2238195873b44 +3fe7271b1c231843 +bfe5f08a20e85ef2 +bfe80d2be5a65f68 +bfd968e68208f8f4 +bfee4e0809ca7486 +bfa3e1ee99bb919d +3fe8812d5349a611 +3fe43fac9ec8db0c +bfb6bd4a72438b56 +bfde7ae14bc94f0d +3fe4aee8d37756c0 +3feee9e1ea860493 +bfe9631c947125b3 +bfe5cf86a5a67a4c +3fc307bb03c6ccfb +3febdc9b2588a35b +bfcf2005617bb707 +3fee76dfa7e3b4a1 +3f7fc69396e27817 +bfef853d3d729fca +bfeed436ccf5e2f1 +3fe76499c62c3df7 +bfc6425540b23ed3 +3fecdd506d95bdc1 +3fe6dbb1ec82d6ce +3feccef381d1e1ff +bfeff611b9303438 +bfe9ab2ec4651dc3 +3feacff42f93c372 +bfeffffffbdd9993 +3fe8b6e6bfc9ad58 +bfe9e0e9e5b452fa +bfef9d8fc9177784 +3faef16d66ba638d +3feffbdfed351dc6 +3fefd7451bd1805b +3febd48d10670957 +3fa9b4d9ecd2d7f9 +bfe8cd359dfc8cc0 +3fef0b1b7c28e3a6 +3fd5a267f3294e53 +bfe6d31cf1ff1a2a +3fef93e44ca6de2f +bfa943e47c85cec7 +3fee6040eddaf3c2 +3fc3e45514550deb +3f98d8c2372d326b +3fa03e7c37aacbe4 +3fd2a5139da47d89 +bfdbe9da73bf8562 +3fec495f6962f2de +bfd2651f8f38faa9 +bfeabc3ec3605147 +3feefafc77f16cbf +3fcf95d46b31aa5a +bfe695396ec8f1be +3fee2c1fc8806374 +bfecb4c9333d56d8 +3fce72ad9ca0e622 +3fef288feb7280bf +3febff6cd0969d2e +3fe15043cffb3252 +3fefbf57f5d9d507 +bfb87e041de44d20 +3fe8f50caa08a965 +3fe72893a27783ee +bfe94b243bebccd4 +3febbce5b7ea0ba4 +3fd7358dfca72e73 +3fefad5d1e89cb4c +3fdc0e4aba551abb +bfec89b9058c4d41 +3fe8f59e27c42210 +bfef8285716d7ae5 +bfe681a674f37b58 +3fb95908425f22a0 +bfee21986749dd30 +bfeb12787fd9989b +3fdbf8ae28ec0a5d +bfe02eb122a5d8ad +3feef21db613e2b1 +3fe22a811b83abc0 +bfe5f21c26f6ab8c +3fefb065b7828d23 +3fd364bd19f8109d +bfefbb807cca4cf6 +bfe78ad140e8a401 +bf9968dbc4f16f74 +bf729d78420fb736 +bfe832c5528cb80b +bfcfc56da520a0a5 +3fe65060d4db0aef +bfe908b59453df55 +bfdeb93339b11b42 +bfec31b08653d1a6 +bfeed1d1e06eb5ba +3fe23ecece3a1a0c +3fe16a0d0d29a8f1 +bfe3c82806a13b2d +bfdea935a93a3319 +bfef6f1fb9fad9f3 +3fd6193986f5c4f0 +3fee523641324d71 +bfe841f3be9f7b09 +bfe2e79bb6cb184d +bfeffd7e227607bb +bfb74c876603fe43 +3feeb06c972aa3e0 +3fece6a79586c086 +3fe06af49f7cc054 +3fc98a1931fafc82 +bfd292e55f8b8002 +bfe0125ebfc32c3b +3febfdb75eb0e992 +bfeffd0cca59b97b +bfb2ae06bdfd8d23 +3fdcbcdbd89df1f1 +3fea0ca99c8d03a2 +3fc12778440abf06 +3fe44b9b8a2ebb62 +bfe1e458fbd7d8af +3fd175c40a24503a +bfca648fd3849db3 +bfbf28479307207f +bfde0a83321b5289 +bfd3c45b4b8f1c3e +bfe774d15a5ae94d +3fea2501c053df5a +3feffe3ea66da229 +3feb35895b0010fb +bfe2038ee45f34c1 +3fced9155b718de8 +bfeaaffda36b3be5 +bfe8a0e3570d1fc7 +bfeffe6c3c228930 +bfee7671a4c01742 +bfd495e2fc112180 +bfedf9b5301c7be5 +3fe30407ad35e0b1 +bfe3e42fe8b05263 +3feeb8d210c0e440 +bfedd2cd0ca339a7 +bfe3db7a48b0bc5f +bfef9bec49863330 +bfe90188478b4777 +bfc73661316bb927 +3fe0b4e1c0157d86 +3fe6148255abdb3c +bfc3817a0ee80d32 +3fd09e9b28ccc94f +bfefdcce1d8e75c8 +3fee47bbd1ebd1a2 +3fece44169374527 +bfe9349d59b7f97a +3fd83ebf7551ecbc +bfef2f4e30456929 +bfefa7fca580e727 +bfdf8b011f56f1a8 +bfc2d9a8b7aa7463 +3feb2b6180d654b9 +bfdb8bea9d12b39c +bfe04ea6f0903848 +3feff0e9db12967a +bfcd21e03c5c8bcb +3fe94a505105e054 +bfec87be22d4b2ed +bfee4c284609806a +3fa6d84cc21a5461 +bfeb2cc7f5e2e540 +bfe3b46304a355ba +bfeb7bbc65bd1471 +bfec8849e186aff8 +bfb86db35824e6fd +3fc3a87db57875c2 +bfee2464a3b52bca +bfecba13a4e3a950 +bfe961a1e6594237 +3febcaa59d46e690 +bfe532bc7a7d2636 +bfec003fba59b707 +3fe7ebdc2289a591 +bf653111d59f15b9 +3fc88c9ed225def3 +3fca92600c4ff45d +bfeffc2e24cf8756 +bfef899db9311578 +bfe1ccc55f514389 +3fefbae620bc78ce +bfe2454f4a1fe590 +3fc3fd3749f24ca8 +3fef50d867271702 +3f0aa015842ff71c +bd46f5abac02c6ca +3fef01fb1601ec2d +3fdde5ac31b56595 +be68921996c24730 +bfe2827eab2eebd2 +3f42e54fde01aea7 +3fe194118f17c348 +bfef81040e750ed0 +3fefe7b2e48b48e1 +3d30a80edab4359e +be2cb45d7e4adb11 +3dc2726d98996184 +bfa3f56e39c4d28f +bd2e880c6444547c +bfefe8edbe177359 +3d5ed67c594a3950 +3fbdfca7949c9707 +bc4006968c4ec4bc +bf3a0fdf7ec7e108 +3d928b8c463f0cb2 +3e9ef6b8130b5817 +3fe4b268e4502ac9 +3fc15db64c79c604 +3fe1266b6761568c +3fc2a7516cb62c56 +3fef95fd55b69445 +3fef11606e19324d +bd93172b2fffd4da +bfed8904a1bdc544 +3fe1cb56dd99f3ae +3fef15369f640704 +3fefe71459480f70 +be9eb2b772d8d529 +bd84c841cc53cd97 +bfb27fa5feff5703 +3fee274f86bd3f3d +3fe11aaca05ce586 +3fef2e6626f68465 +be903b962b9ad21a +bfe3f970cea761c3 +3fe74e11b8ad3e14 +bd474da73d90f03b +3c404aa201d27d99 +bfe5395727829bc2 +be98dc178b01cb36 +3eacb3053ddea2e8 +3e36754b06a6b82c +bfe44cfc0b647139 +3fead3346027effc +bfeffff8df315820 +3fc74b83f980a843 +3feffe89f0c08e5a +3fd484e38060e5da +bfd0a6ace9cf43bb +3fee6256c6130b5a +be446a3dc009835c +bce7dc6ccb905274 +3fec3ff8b32b9ce4 +bdca5f0f845de301 +bfd57cce1bed8f10 +3caeee5ebbd13c3b +bdd3bd71c170fbee +bfa0d68bae9664ce +bd1697426c72a62e +bfef0deaca347b98 +3e2070ce1f93459d +bfc54e3bbfb1dade +bfecd0c33272cd4b +3f4a6399d048e1cf +bfe5f68ed10762ff +3fc301dbe5784214 +bfeffee09d8bc9f2 +3de3f28192aba043 +3e47c2452e9c1ff5 +3f60a818a197fb61 +bfefb5cbc1893ab0 +be3806674b5dba44 +bda6f8506481a000 +bf0207c46728830b +3fe42512e90a4899 +bfec0cf523b6153d +bfe0f7a7102f47c2 +3f937dfbbf3c9bc9 +bd30742f6892d66e +bfeffd62338e8fd9 +3f8878cd631c846b +bfca01f926d7bf90 +3ec341a3b639984e +bfef784433f94d5b +bfee41e5b22a9826 +bfeff535be8fca33 +bfe56e6583b23547 +3c4bc806d22ceb36 +3fefa8341dfc57cc +3fed51805f3907a2 +3fc06e04850b418e +3fa62604601064e9 +bc55824696f4d488 +3e216723a5120cfd +bfb7e44ced3f3413 +3eddc3b19d279da1 +3fce6904b4a05086 +bf6d1434518ce1a5 +bfb95c84fb51b132 +be1bbe08660ab40a +bf229b6ac111612d +bfcb3065ef5b7cfa +3fcaf5a9c4cca922 +bfd7b4ceef83728f +3d5e5268abd3ac3e +3c5a944b565c4790 +bfef21cdaa6d4c08 +3fe55ac021c7793b +3feb131bc144aa91 +bd0daa213668a36f +bed74e7ca2cecfee +3fecb26d6da89bbf +bfebd84b39812066 +bf7bf37ce2f5e580 +bfc845e078da84b5 +bdf99d08e70a89d9 +bfc812fd6157f82e +bfb91c4277cad169 +bfeeb097f450e002 +bfd4ecf32503d57f +bfeff2c4789dd23e +beb1e1de9345c59f +3fea27bdc0943d76 +3feab52086736234 +bcaee88883526e33 +bd5741caa1e75ad0 +3fcb07a8cbdf7783 +bfe110bee1a941fb +3fc216f7c301d831 +bfe9d0713d5e2c9e +3fbb252945732f5e +be512df884f02fb9 +3d3d013b57f98829 +bfeffbd4c4332aa4 +bfe0174506118228 +bfee86717b6aef57 +bfed80be974f6ae4 +3fef0f6a9110ee59 +3dc0ac225af14690 +bfe09c9ca1a826ca +bfd737609cb48bb2 +3fc2b99ccfde5f38 +3ec82d20c7988f49 +3d410e66b917ab77 +bfdbe075b92764ca +bfeea691e6d9ad6e +bfe90c0731d0ceab +3ca5bf9310a3d1de +be45e2639571728e +bced8dc9dac70ad5 +3f98b67467d7ad87 +bfea8237b6f3c206 +bfe8f96dd3e38347 +3f301f1e6b4335d0 +bfeffbc2e769cfb8 +bedaccf7a6ed9b0c +bf2514a67a6ac824 +bfe942f76ac6bf06 +bedc21dc4b096149 +bfd000e9fea2b589 +3fdd7a4e1cd795da +3fd87e2740e1fd9b +3fe42d638e5acdd8 +3fed8df256b53e7e +bfe737be19942b76 +3cca57b9dbb26e34 +bfeff1d9e8736e36 +bf4b65039586c670 +bd868ce7d542adb2 +3f42cba9617337a3 +bfe31ddc235b2aac +3fecb573045f6b6e +bce37f62908ed736 +bfeea74e48785351 +3f4c7555a7eb2712 +be64f15b55100836 +bfefa7efecb0c9b6 +bfd5632040b434bb +3fef6fe98a894b65 +3fd40e653d925102 +bed0c0ada36ed2c4 +3fe19ecb1dc22b9b +3fdbc7de19de43ce +3f86f61d7477a4e6 +bfeed62ac1ae9f6e +3e124a09def26382 +3fc6907bd9790e82 +bfe0df6900092fd8 +bfeb7f6f735727b2 +bdb3a1cd4745c7f6 +bf413a79e5b1ccff +bfed1e9a1f81f285 +bfef6f6d2e2f5da0 +bfe70f98126cf291 +3e65f7aa0e1f510a +bc3c0c998aa0755b +3fd7d4dd14bb7cac +3e30fc56202f458c +bfdc71c77dab2328 +3fd62236b2688455 +3fe0b0dcf7c9b082 +bfef71a348c92010 +bef7c7bf8351f48d +bfb9f6056e0f8ac8 +bcf1dd15f5c9b6b8 +bceac4e44d44b20d +3e4d77bbddd6df8d +3faa7b590fdfb800 +bfc4edd5860bf511 +3fe4a8aa1b98444c +bfe2522375c414d0 +3fed172eeb1253f9 +bfe14ece3b13d33d +3feffff74f40e329 +bf9a8e43cce01898 +bfedd790a4dda02e +bd25c17fdeea5282 +3ed5ba1d3e857fb0 +bfeff7c00cb4a63f +beda9d8a09584504 +bdee83ef420b57bd +bfe24f628141e9e8 +bfec3ab839f2a1ea +3fcc7bf4eb80700f +bfe1eab0b3d0258c +3fb0d2063890d6e0 +3fa246d99ce4a58b +3fc16ff3690ae095 +3fd1d0b762a40757 +beecfa5cfd6363e6 +bfe30bfba493ab95 +3fb4c5f3d570f098 +3fef46c2042e5e68 +3fe35336e6504e15 +bfb60e8f44dd3b02 +bf0339a98f3eff07 +bc51a152ff105149 +3c7c24b19fd8439a +bfd881db769eb559 +3ea374c62f3e23c4 +3f28d4ccc67a9b6e +bea00cbb179e3ead +bfe22511e4207835 +bca0e5c7a8787572 +bfeeced2e1f9bac1 +3ea353ccefe67a0d +bfedf25ee2d1c647 +3f899c1da2a486ea +3cf17a55acff5234 +bfc7acbe294f13f1 +3fedce06e5fd427d +bfccd665679b27f8 +3e2e03ae4940977d +bd56bd20eff7502c +3e0a41f1576f1708 +bfed4ea2fb73c02d +3e420b909f16deae +bfeb1f95c36f462b +3feff9e33c4cd61a +3fe8008f30042f56 +bd453da2ab4f9e28 +3fe37a2d9abbcd9b +3ef441d9a995fbbf +be5fe9d2e186a1c6 +bd885b7b2ae856a0 +be02156fb471d54c +bfd680be8d7e419d +bfef8f9fb79aae10 +3fd325b50e660420 +bd22356ef88a7b24 +bfedcd473c5a1fab +3d442aea1583ca2f +be2be83edd37c3f4 +bcc6a42f51e892ea +3fdac5ca5f87026a +bc98c2b9f51e8064 +bc300a0407057749 +3d303c512fd5124f +3dc95ae1c69e345c +3f81f7ea56fe4f48 +bfd613ee7e452f22 +3da26f496aebb94d +3dd1e680aa7b310b +bd183c2a1f214f52 +bce17f0bd0ba8eb7 +bfde9e6621d2d639 +be97f181cf3a1ad2 +bfe55c7521bae3d3 +bd5218a0d73d34b8 +be2af07c0ce91605 +3fdc77b2b14c8f24 +bfeb9d8bc6ae88f9 +3ec29583dc7e572d +3fccbcb503f83edf +be89f7259b828241 +bd722debf45b9437 +bfdab4f896743e61 +3fca3686ad16c683 +bd787778cf1e0a7e +3db1133e199d30e0 +3c872b1a8ba6e01c +bd66f1aea38da07e +bc7baa9a625de882 +bf6c276f3ccf30ad +3e07c535cb9d2ae6 +bced81abff0a07f0 +bfee247727831dce +3e8463fa6ee888e4 +3d18ab3959532c7d +3fe7f486e8807e6f +3fef37b6bf1608d1 +3fed269b76882c3d +bc62c630983e8e20 +bfe9aaa81b044de7 +3fe8af8957cda87d +3fe9a188160f86f9 +3fe097fdc014e2c4 +bfb4c707100bd375 +3feeeabb084608ad +bfd8f02d3e692a23 +bfe4e3b920f6d5a0 +3d98fe6318d3b85e +bfe30196cb160d28 +bf887e32445e263f +3f515449116c9fc7 +3e71bbb749b856e1 +3fe23fe659d4806c +bfb68268a2c2a0c4 +3fed647065b4eed7 +3c608232fa84595f +bf8132ad3015c66b +3fe3f3dab46f2d95 +3db85b0be58f798c +bfeb33f6c0806451 +3ef72baedf70b427 +bcf77981e7e4851c +beaed822afb33e69 +3feffbe6a4ef0211 +bf7394b3b7f3a616 +3fb489a79d10784b +bea8290116adceee +bcf949688e2ae2e0 +bfe91da893ed2bec +bed502c25e24f9c9 +3fea45fe1fabfaef +bdbe26047ef851ef +bcbc4be72834a53d +3c306ff20e372640 +3fee437894141f91 +3f87a781d47bbcc9 +3effcef3d991171c +3fe2af7b2b110222 +be119d00e3168a24 +3c378341eb020688 +bfd717306fd68a87 +3fb778d7a5331449 +3e88027be68668a4 +3edf0dd7e41e94c9 +bd974a3abaa91d25 +bfea61600810f414 +bd6d6567e91339ba +3dd533aa9c400052 +bcbc649c71445fd5 +bfeffbd6bea4257c +bf648fdc7af52a53 +3fb1f44a79652ea3 +bf4981deaceacf20 +bfd3af2a04a9b1bc +3fefc3870b3cb2c3 +bfe1f56dfa362a92 +3dec0f051905243f +3fefbc21b4a405ac +3fc8315563bb9d70 +3ee9b8386f798f9a +bfc75d9459a87942 +bd0af760051fd8e2 +3fe1b4a57c11b680 +3feff692333cb792 +bd2a742e1ed617c2 +bfcd5765825f046d +3d2e67b10ca60a8f +3feffee69a1ada2a +3f370926b0bc3c8e +bfe6de6bb9e552dc +bfe39cc756dba53c +bfc60b8b353f67e2 +bfe9a35caf64fd3d +bfefcc7d909b1672 +bfec91969fa859a2 +bfc23524c6cd8439 +bc30b1f4c589066e +bfe64982f3ce2437 +bf90f3f59369413e +bfe4c49168805104 +bfd1edf0fde396d0 +bfc4df3b965726fa +3fef1e5b65c7ddb2 +3fc3a62c173292f4 +bfeb4a44f1c6e4dd +3ed3183c775091fe +bf9050717f765c71 +3fd81d7b0577e76e +bfee93b33ea02950 +bcc3c76748436e17 +3feff92b9228ea8a +3fe93bc553c792cc +3f2d3a3efce4b782 +bf1d9762d5f3715d +3fdcee4ad8928891 +3fdc83962ec12b94 +bfd6dd64862f2206 +3fa8bcc7ca8f1e7f +bf84117d330fded6 +3fe5654fed34714c +bc64e5970e7ffeab +3e6b9349f78d428b +3fd6ecf4748341ea +bd97b1679e3200c1 +bf7669545aeb6316 +bf6ff3561eb215cf +bee922f990b1672d +bfeffa1faf85a0e8 +3fe07003435890c3 +3fb0053e9f77a637 +3fea890b1e8fcd83 +3db358bc057e451f +3e9885ab6787c7e1 +3c85e1a79c42eaed +3dc43d96e495ac7b +bf4d7465ecb5f73a +bfe481af28524b43 +bd806a2727545dc7 +bd066724a1852da5 +3d18b7f16cce956a +bca5f3e6e9532ace +bfe886d80b33d8eb +bfd86eabad702da1 +3f062d9108678c81 +3feff28058e2b7bb +3fc01011cb18b9a2 +bfeb1949ac9c6c59 +3fe9184c441836d1 +bfeab5a56b3e9c78 +3fe3a930820b9c69 +3fea3acf42d644cd +bc90b6e647100129 +bef6a2bb6fb90ef7 +3d4e3777af94e866 +bfefd1ad3920a5bf +bf80bc83df6b9d04 +bd0b4f15e2cc6ccf +3de340470fc35e37 +bfec72c323507991 +3fa973ce7e750535 +3feefcefb49b78cc +3fddd998a8c9d0a6 +3f3693589a689370 +3e4c406deab38ea2 +3fd48c3748fffea2 +3fd6a0ca7538fc61 +bf9233eca3f92e8c +bce65b7b79907322 +3fe574d5fa7a2796 +3feddf109a50cf07 +bd10953f58b62c83 +bfea92543ff010b9 +3ce65a6125bf7717 +3fe9ed99c098ca09 +3faa5de42538a35e +3f43997de7c758ea +3feff8e919fb93d2 +bfecdc6961785abf +bed2b0f8cae1b49a +bfed5ed00598ffe2 +bfef0bb834530715 +3fea3122370c3c1f +3cde030ad6073e3e +bfea17daf691f29d +3fe0a7dbcec0e9f4 +3e65bdaec1bc3ef6 +be01626c658fa1b4 +bc9b88fe72c87e9e +3c75e24eca177dce +3fefbc95c14704cb +bfefe9be730b0039 +3fefa4f9205feede +bfc97594df7064b4 +bfe3ee2593bea3cb +bcf5bb8a1014aa22 +bdd469735fc7de43 +3fdde0cde143650d +bf9a1e6435f411af +3fa1937c58797501 +bfefff3877f964a2 +bc87de0a7404ba66 +3e2c1e4ce62a835c +be40f67eb12c77a4 +bfe0d496d695943a +bfc60f425a2fbb76 +be8f1aa11218f0f9 +3fe9b37baa2688d1 +3feffffcec54b68f +be10d46a07d6a4ac +3fd83fa8a09a8ace +bfe91506cb8610c9 +bf4cafb09b470a36 +3fe666aecde188f0 +3fef042e5d71c4bd +3fe8de112f896d9c +3da089cd2e291307 +bf9bc6f25185823c +3fef688073417a7c +3d6aabc54364669f +bfb554968dc0647e +3e43d1e0b4b28026 +3c6994d1cd25f6ae +bf9667679d78c750 +3fe4354f393a84c0 +bf421b57ce90b0c5 +3feffe1e4ada777d +3fce7c4b42e46c7d +bef12f26f269d6bf +3d474c06c04945bc +3fe46823bfbd389d +3f78522605436eeb +3fecca350432fae8 +3feadb9d07fa0414 +3d510fa830cbc3b0 +bf2da994c55ddf5c +bfee1d2d6b41e879 +bf3164badcfe6115 +bfc1d845ca9a8abe +bfea04e0778ed77a +3dfe9de8603b9661 +3d32f398ff4c7761 +3c5b59e3abaf6248 +3f1988cf8d7c409c +bfc1e47002fa2a9d +3d6e28661e0d02c9 +3c83c35a6b8a6097 +bfeba088f73d63ce +3ea2bed6120b0d63 +3fe0c99aade1384b +3d9ca6a26c28ed83 +3c3043b1e1a274af +bfc47dfcbbc1a4a5 +bc6300a891a347d9 +3feadea416cbf161 +3cf1d6c19c330fca +3fefea5661fcfc34 +bc3fbeb15d8afbd1 +bfef3dadc0c39568 +3fedc97a4d59ae77 +3c697f9a87ab53d7 +3f31ff01f0a3451c +3c63c9bcf00f54aa +3fefffe5d5bd1ea6 +bfb4d6606ca39f00 +3e71ba1e0f513bcd +bfe49a8233b1a217 +bfeb4fe3b6b244e6 +bfed8ad0a10d9888 +3ef5ca6d96d7ef51 +3fe13b37838e7763 +3de1094b2be353b3 +bfdae433400b1970 +bfd3b0f1630d12a3 +bfe5b587ed045878 +3fdfc1a6c7c38621 +3feffbf2c4e0470c +3d595640a7cda242 +3fe11067a71a6e1d +bc39bd35f153e736 +bf4152b72db01e3a +3fdbca865628428b +be439ce7980f0d1f +3fe1ae12ec346a8d +bfed66c36f8dcce3 +3fd4b141d2191461 +3fe7bc4df03fd018 +3e14c0315b85ce64 +3e436f5726848400 +3fef2295bd1e25a8 +bfededdd0666dcbf +bfd4647cfbb5b6f2 +3fe2ccbb166efa19 +3fcf42b7ab6ce296 +bfe14fb24f6ff7df +3ed04c688034a587 +bc47f8a6786ae426 +3d0f07a714c325c2 +bfefa6d717e4f603 +bfcce3d74c05a086 +bfef09bc14c7ecb0 +bfee579b356b9ea9 +3d30467d80129ec8 +3dd4ab8a9a06040e +3fe95c36cf0073b8 +3f9b366a02479436 +3feba0ca6a92d2ca +3d013c5cce4c0dcd +bd35830ea9788f21 +3d72ed42213a699c +bfefba43b0032d57 +3f078c62c971208f +3f0925acfe46c4ac +3e4a281db3db06ca +3fce780ae09059a9 +bfcb9320cc3db5d5 +3fdcb16ba9f6f77a +bddcfe2d21109310 +3fdc689fece3a832 +3f7ba3157e2955a3 +3fd9f6e3710812f3 +bfc44ae05adba5e0 +3c8b646443068ed4 +bf91adb7f531248e +3f5be551afe22ec4 +3c48333991b4ef70 +3fdeb21371268daf +3fe0e03718c18b6f +3dabccd844de1c41 +3fee0f900b9228d0 +bd9360a32135ff4e +3e050208c94af08e +bfec11a6759f1f08 +3fab94d652c26162 +be055b48c5c07261 +bfefbe1ce857eaa7 +bdda83f7e6ddc1f4 +3cb6fdb48168339a +3fb69c1ac61f328c +bed08e73f48f5cc6 +3cc32966dbdd4d25 +bf7c69555a90dbf7 +bfefe9f73c0849da +bc6f666b78667b5d +bfdc9f13019c4520 +bf91ef971f79e11d +3feffa7d812862af +bfe7845efd7c9558 +3fb01b3462478274 +3ee1bde7ce24275c +3fe105bd7df5756a +be30639c596ad433 +bfd2d8370aeffbca +bd82bb168fc7bdee +3fef3fcc6116d3d2 +3fc1f00647adde01 +3fc7a976c5481c9e +bfd8c98c4aabe805 +3e4289cfb4b80f2c +bde6b588a367bd5e +bfcb2a41a806eb88 +3fef999e3f09f4e4 +bfef77283b469a82 +3feef10056715703 +3e378f697cda5c46 +3f08a84d824aa236 +3fee3ef648fdce26 +bcd507ca9a2da830 +bfed9fa47c56f1ce +3f30f37b67276127 +be39dd06b0761f6c +bfe46d914dd32532 +bf93bca48bf5cf53 +3fe8ba4e3a01acc4 +3fe0ae8dd2564613 +3fb3700721d1119a +bfd8daad6f922cbe +3ec76dc6c2b9ffdb +bd526adbf8026791 +be1b7ca57e0bfe7a +bfe091bd67c8c9de +3feb6f800272492f +bfdc15fc11e3aae8 +3fd973d481623f30 +bc791a1660f13998 +bc4cfdae285bb2ba +bfdd45ea294c5c8f +3e82a556343c03ef +3d100007c5174a6c +bfefffed1ddf24ad +bea284e8a028a02c +bf92f013d26d16de +3ccb5100e24fc771 +3d0b99b0b59b0a6d +bfde40a2bf5d2d10 +bef0e086213a5960 +bfd3087b24b41587 +bfee565a86e6e7be +3f30298b5151e9d9 +3d713130661d64e1 +3df0e5d6048bfb1d +be56b25ba162fcbc +bc79a0489a17c6be +bf95f56fea5ba812 +3e8cd4730478aef3 +3e785ec5e6c0df1d +3fe3cb15f3edb777 +3df338d24fd35751 +3febebc1be30fbdd +3c6be427cbc26cd6 +bcd3523fedcac9a6 +bf5791e3163caabb +bfb5c76f5da85a76 +bec7092c444e4417 +bfeb186bea77c9c7 +3fed99af4444dbf7 +3da0aee2b17ebd0a +bdc54cb81d2f70e0 +3f3a60344ee62b46 +3d0383b8a9d9b67e +3fd71479c4935c4f +bcc387c95f349ab8 +3f14e5f28ecafed4 +bdbf58ba78efb931 +3c93f9969c3e3ee7 +3eda94a13b52b5bf +3fd325fb84291e8a +bfe3a0f5b27aeaed +bd01969e05487910 +bfee79d576f47db3 +3d2ecaa362931c30 +3eb3dbe4e8465e9d +bfe998fda270df18 +bc527d3dcb259816 +bfd89baf1c03ac84 +bfea339fd21858a5 +3fc77af63e6d36c5 +3f0efc2746a9f07e +3fb725954bdaa290 +3fe5ba0721ec0af5 +bfef1572d08485c1 +bfe203446c1560a4 +be57d81a483c91fd +3fefab1ff11f1880 +3fede4bb41532ec8 +3fe9b183a0c27bc3 +3f77e745ccfa5645 +bf860ff2254780ec +bcd5b0868bb86510 +bc41b264bcf198e7 +bfe0134e0c714524 +bfeecd1f31619b1a +bfe9608ed95bd03d +3c6c1e5ee5dfbfbc +3dc70bc6a1d9bfb7 +3d4ae3f67e3666f8 +bfb87a234356c060 +bd701590fdf8586d +bfcc371737e43260 +bfe7c6b2e39aa174 +3fef831e15d93ce9 +bd05a765c50b95b5 +be60a2224db861cd +bca2fc41c7fa586b +bfecb51cd092f11c +bfeffda6b81c9c1f +3d1746ee5305dd88 +3fc364e4922cf9b2 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +0000000000000000 +8000000000000000 +@cos 7399 c3b00fb2f01a4457 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bfeffec097f5af8a +bfeffb0278bf0567 +bfeff4c5ed12e61d +bfefec0b7170fff6 +bfefe0d3b41815a2 +bfefd31f94f867c6 +bfefc2f025a23e8b +bfefb046a930947a +bfef9b24942fe45b +bfef838b8c811c17 +bfef697d6938b6c2 +bfef4cfc327a0080 +bfef2e0a214e870e +bfef0ca99f79ba25 +bfeee8dd4748bf14 +bfeec2a7e35e7b80 +bfee9a0c6e7bdb20 +bfee6f0e134454ff +bfee41b02bfeb4cb +bfee11f642522d1b +bfeddfe40effb805 +bfedab7d7997cb57 +bfed74c6982c666f +bfed3bc3aeff7f94 +bfed0079302dd767 +bfecc2ebbb5638ca +bfec83201d3d2c6c +bfec411b4f6d2708 +bfebfce277d339c6 +bfebb67ae8584cab +bfeb6dea1e76eadd +bfeb2335c2cda945 +bfead663a8ae2fdb +bfea8779cda8eea4 +bfea367e59158748 +bfe9e3779b97f4a7 +bfe98e6c0ea27a15 +bfe9376253f463d1 +bfe8de613515a328 +bfe8836fa2cf5038 +bfe82694b4a11c37 +bfe7c7d7a833bec1 +bfe7673fe0c86982 +bfe704d4e6a54d3a +bfe6a09e667f3bcc +bfe63aa430e07311 +bfe5d2ee398c9c2a +bfe5698496e20bd8 +bfe4fe6f81384fd3 +bfe491b7523c161d +bfe4236484487abc +bfe3b37fb1bdc939 +bfe342119455beb7 +bfe2cf2304755a5d +bfe25abcf87c4979 +bfe1e4e88411fd11 +bfe16daed770771d +bfe0f5193eacdd29 +bfe07b3120fddf14 +bfdffffffffffffc +bfdf071eedefa0ec +bfde0bd27424507b +bfdd0e2e2b44de00 +bfdc0e45dabe05ca +bfdb0c2d77379851 +bfda07f921061ad2 +bfd901bd2298ffab +bfd7f98deee59682 +bfd6ef801fced33c +bfd5e3a8748a0bf5 +bfd4d61bd000cddb +bfd3c6ef372fe94e +bfd2b637cf83d5c6 +bfd1a40add328e27 +bfd0907dc1930692 +bfcef74bf2e4b91f +bfcccb3236cdc676 +bfca9cd9ac4258f6 +bfc86c6ddd76624f +bfc63a1a7e0b7388 +bfc4060b67a85373 +bfc1d06c968d9e16 +bfbf32d44c4f62cb +bfbac2609b3c5772 +bfb64fd6b8c28107 +bfb1db8f6d6a512a +bfaacbc748efc90f +bfa1de58c9f7dc25 +bf91df0b2b89dd14 +3c91a62633145c07 +3f91df0b2b89dd37 +3fa1de58c9f7dc37 +3faacbc748efc921 +3fb1db8f6d6a5123 +3fb64fd6b8c28100 +3fbac2609b3c576b +3fbf32d44c4f62d4 +3fc1d06c968d9e1a +3fc4060b67a85377 +3fc63a1a7e0b738c +3fc86c6ddd766253 +3fca9cd9ac4258fa +3fcccb3236cdc672 +3fcef74bf2e4b91b +3fd0907dc1930690 +3fd1a40add328e29 +3fd2b637cf83d5c8 +3fd3c6ef372fe950 +3fd4d61bd000cddd +3fd5e3a8748a0bf7 +3fd6ef801fced33e +3fd7f98deee59680 +3fd901bd2298ffaa +3fda07f921061ad1 +3fdb0c2d77379853 +3fdc0e45dabe05c9 +3fdd0e2e2b44de02 +3fde0bd27424507a +3fdf071eedefa0ee +3fe0000000000001 +3fe07b3120fddf13 +3fe0f5193eacdd2a +3fe16daed770771d +3fe1e4e88411fd12 +3fe25abcf87c4978 +3fe2cf2304755a5e +3fe342119455beb6 +3fe3b37fb1bdc939 +3fe4236484487abe +3fe491b7523c161d +3fe4fe6f81384fd4 +3fe5698496e20bd8 +3fe5d2ee398c9c2b +3fe63aa430e07310 +3fe6a09e667f3bcd +3fe704d4e6a54d39 +3fe7673fe0c86982 +3fe7c7d7a833bec2 +3fe82694b4a11c37 +3fe8836fa2cf5039 +3fe8de613515a328 +3fe9376253f463d1 +3fe98e6c0ea27a14 +3fe9e3779b97f4a8 +3fea367e59158747 +3fea8779cda8eea4 +3fead663a8ae2fdc +3feb2335c2cda945 +3feb6dea1e76eade +3febb67ae8584cab +3febfce277d339c6 +3fec411b4f6d2708 +3fec83201d3d2c6d +3fecc2ebbb5638ca +3fed0079302dd767 +3fed3bc3aeff7f95 +3fed74c6982c666f +3fedab7d7997cb58 +3feddfe40effb805 +3fee11f642522d1c +3fee41b02bfeb4cb +3fee6f0e134454ff +3fee9a0c6e7bdb1f +3feec2a7e35e7b80 +3feee8dd4748bf15 +3fef0ca99f79ba25 +3fef2e0a214e870f +3fef4cfc327a0080 +3fef697d6938b6c2 +3fef838b8c811c17 +3fef9b24942fe45c +3fefb046a930947a +3fefc2f025a23e8b +3fefd31f94f867c6 +3fefe0d3b41815a2 +3fefec0b7170fff6 +3feff4c5ed12e61d +3feffb0278bf0567 +3feffec097f5af8a +3ff0000000000000 +3feffec097f5af8a +3feffb0278bf0567 +3feff4c5ed12e61d +3fefec0b7170fff6 +3fefe0d3b41815a2 +3fefd31f94f867c6 +3fefc2f025a23e8b +3fefb046a930947a +3fef9b24942fe45c +3fef838b8c811c17 +3fef697d6938b6c2 +3fef4cfc327a0080 +3fef2e0a214e870f +3fef0ca99f79ba25 +3feee8dd4748bf15 +3feec2a7e35e7b80 +3fee9a0c6e7bdb1f +3fee6f0e134454ff +3fee41b02bfeb4cb +3fee11f642522d1c +3feddfe40effb805 +3fedab7d7997cb58 +3fed74c6982c666f +3fed3bc3aeff7f95 +3fed0079302dd767 +3fecc2ebbb5638ca +3fec83201d3d2c6d +3fec411b4f6d2708 +3febfce277d339c6 +3febb67ae8584cab +3feb6dea1e76eade +3feb2335c2cda945 +3fead663a8ae2fdc +3fea8779cda8eea4 +3fea367e59158747 +3fe9e3779b97f4a8 +3fe98e6c0ea27a14 +3fe9376253f463d1 +3fe8de613515a328 +3fe8836fa2cf5039 +3fe82694b4a11c37 +3fe7c7d7a833bec2 +3fe7673fe0c86982 +3fe704d4e6a54d39 +3fe6a09e667f3bcd +3fe63aa430e07310 +3fe5d2ee398c9c2b +3fe5698496e20bd8 +3fe4fe6f81384fd4 +3fe491b7523c161d +3fe4236484487abe +3fe3b37fb1bdc939 +3fe342119455beb6 +3fe2cf2304755a5e +3fe25abcf87c4978 +3fe1e4e88411fd12 +3fe16daed770771d +3fe0f5193eacdd2a +3fe07b3120fddf13 +3fe0000000000001 +3fdf071eedefa0ee +3fde0bd27424507a +3fdd0e2e2b44de02 +3fdc0e45dabe05c9 +3fdb0c2d77379853 +3fda07f921061ad1 +3fd901bd2298ffaa +3fd7f98deee59680 +3fd6ef801fced33e +3fd5e3a8748a0bf7 +3fd4d61bd000cddd +3fd3c6ef372fe950 +3fd2b637cf83d5c8 +3fd1a40add328e29 +3fd0907dc1930690 +3fcef74bf2e4b91b +3fcccb3236cdc672 +3fca9cd9ac4258fa +3fc86c6ddd766253 +3fc63a1a7e0b738c +3fc4060b67a85377 +3fc1d06c968d9e1a +3fbf32d44c4f62d4 +3fbac2609b3c576b +3fb64fd6b8c28100 +3fb1db8f6d6a5123 +3faacbc748efc921 +3fa1de58c9f7dc37 +3f91df0b2b89dd37 +3c91a62633145c07 +bf91df0b2b89dd14 +bfa1de58c9f7dc25 +bfaacbc748efc90f +bfb1db8f6d6a512a +bfb64fd6b8c28107 +bfbac2609b3c5772 +bfbf32d44c4f62cb +bfc1d06c968d9e16 +bfc4060b67a85373 +bfc63a1a7e0b7388 +bfc86c6ddd76624f +bfca9cd9ac4258f6 +bfcccb3236cdc676 +bfcef74bf2e4b91f +bfd0907dc1930692 +bfd1a40add328e27 +bfd2b637cf83d5c6 +bfd3c6ef372fe94e +bfd4d61bd000cddb +bfd5e3a8748a0bf5 +bfd6ef801fced33c +bfd7f98deee59682 +bfd901bd2298ffab +bfda07f921061ad2 +bfdb0c2d77379851 +bfdc0e45dabe05ca +bfdd0e2e2b44de00 +bfde0bd27424507b +bfdf071eedefa0ec +bfdffffffffffffc +bfe07b3120fddf14 +bfe0f5193eacdd29 +bfe16daed770771d +bfe1e4e88411fd11 +bfe25abcf87c4979 +bfe2cf2304755a5d +bfe342119455beb7 +bfe3b37fb1bdc939 +bfe4236484487abc +bfe491b7523c161d +bfe4fe6f81384fd3 +bfe5698496e20bd8 +bfe5d2ee398c9c2a +bfe63aa430e07311 +bfe6a09e667f3bcc +bfe704d4e6a54d3a +bfe7673fe0c86982 +bfe7c7d7a833bec1 +bfe82694b4a11c37 +bfe8836fa2cf5038 +bfe8de613515a328 +bfe9376253f463d1 +bfe98e6c0ea27a15 +bfe9e3779b97f4a7 +bfea367e59158748 +bfea8779cda8eea4 +bfead663a8ae2fdb +bfeb2335c2cda945 +bfeb6dea1e76eadd +bfebb67ae8584cab +bfebfce277d339c6 +bfec411b4f6d2708 +bfec83201d3d2c6c +bfecc2ebbb5638ca +bfed0079302dd767 +bfed3bc3aeff7f94 +bfed74c6982c666f +bfedab7d7997cb57 +bfeddfe40effb805 +bfee11f642522d1b +bfee41b02bfeb4cb +bfee6f0e134454ff +bfee9a0c6e7bdb20 +bfeec2a7e35e7b80 +bfeee8dd4748bf14 +bfef0ca99f79ba25 +bfef2e0a214e870e +bfef4cfc327a0080 +bfef697d6938b6c2 +bfef838b8c811c17 +bfef9b24942fe45b +bfefb046a930947a +bfefc2f025a23e8b +bfefd31f94f867c6 +bfefe0d3b41815a2 +bfefec0b7170fff6 +bfeff4c5ed12e61d +bfeffb0278bf0567 +bfeffec097f5af8a +bff0000000000000 +bfefffffffeb111d +bfefffffffeb111d +bfefffffffffca69 +bfefffffffffca69 +bff0000000000000 +bff0000000000000 +3fefffb02599c9cd +3fefffb02599c9cd +3feffd315bbf4275 +3feffd315bbf4275 +3feff4c5ed12e61d +3feff4c5ed12e61d +3fefd31f94f867c6 +3fefd31f94f867c6 +3fee11f642522d1c +3fee11f642522d1c +3fe6a09e667f3bcd +3fe6a09e667f3bcd +3feff63849dd9e0e +3feff63849dd9e0e +3fee6f0e134454ff +3fee6f0e134454ff +3fedea1789729f6d +3fedea1789729f6d +3fe7c7d7a833bec2 +3fe7c7d7a833bec2 +3fe4fe6f81384fd4 +3fe4fe6f81384fd4 +3fd5e3a8748a0bf7 +3fd5e3a8748a0bf7 +3fd3237bfdba3a88 +3fd3237bfdba3a88 +3fd0907dc1930690 +3fd0907dc1930690 +3f5c98701025ea45 +3f5c98701025ea45 +3ef24d15211548ff +3ef24d15211548ff +3c91a62633145c07 +3c91a62633145c07 +3ff0000000000000 +3ff0000000000000 +bfe1257e3c182b53 +bfe1257e3c182b53 +3fe948f32a1d91f2 +3fe948f32a1d91f2 +3febf098901c931a +3fed9757496841f5 +bfefffe62ecfab75 +bfefffe62ecfab75 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fef3f7a97bc6780 +3fefffffff063930 +bfead7464b59047f +bfc05f27a5e297c6 +bfefc79f84c1f7a2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bac +3fe6a09e667f3af7 +3fe6a09e667f3c61 +3fe6a09e667f3a42 +3fe6a09e667f3d16 +bd07290019c28f56 +bd32e520033851eb +3d2a35bff98f5c2b +bd417290019c28f5 +3d3d1adffcc7ae15 +bce60b679ab8cd3b +bd2160b679ab8cd4 +3d1d3e930ca8e659 +bd30b05b3cd5c66a +3d2e9f498654732c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bcb +bfe6a09e667f3c80 +bfe6a09e667f3b16 +bfe6a09e667f3d35 +bfe6a09e667f3a61 +bcc1d987f09c21a6 +3d2fb899e03d8f79 +bd3023b30fe13843 +3d3fdc4cf01ec7bd +bd4011d987f09c22 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bf0 +bfe6a09e667f3b3b +bfe6a09e667f3ca5 +bfe6a09e667f3a86 +bfe6a09e667f3d5a +3d09643117d6138b +bd29a6f3ba0a7b1d +3d332c8622fac271 +bd3cd379dd053d8f +3d419643117d6139 +3d169e20a6f0f0ef +3d2b4f1053787878 +bd02c3beb21e1e21 +3d35a78829bc3c3c +bd24b0efac878788 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3c3b +3fe6a09e667f3cf0 +3fe6a09e667f3b86 +3fe6a09e667f3da5 +3fe6a09e667f3ad1 +3d23954d93d766c1 +3d39caa6c9ebb361 +bd18d564d851327d +3d44e55364f5d9b0 +bd36355936144c9f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b80 +3fe6a09e667f3acb +3fe6a09e667f3c35 +3fe6a09e667f3a16 +3fe6a09e667f3cea +bd1b074edb48a4cb +bd36c1d3b6d22933 +3d227c58925bad9b +bd4360e9db691499 +3d393e2c492dd6cd +bd04f5a8b515906f +bd253d6a2d45641c +3d15852ba57537c9 +bd329eb516a2b20e +3d2ac295d2ba9be4 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bf7 +bfe6a09e667f3cac +bfe6a09e667f3b42 +bfe6a09e667f3d61 +bfe6a09e667f3a8d +3d0dc8051dc4f825 +3d33b900a3b89f05 +bd288dfeb88ec1f7 +3d41dc8051dc4f82 +bd3c46ff5c4760fb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc5 +bfe6a09e667f3b10 +bfe6a09e667f3c7a +bfe6a09e667f3a5b +bfe6a09e667f3d2f +bce605b213e29ad4 +bd30b02d909f14d7 +3d2e9fa4dec1d653 +bd405816c84f8a6b +3d3f4fd26f60eb29 +bcda877f1db6080c +3d1e57880e249f7f +bd20d43bf8edb040 +3d2f2bc407124fc0 +bd306a1dfc76d820 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bb2 +3fe6a09e667f3c67 +3fe6a09e667f3afd +3fe6a09e667f3d1c +3fe6a09e667f3a48 +bd02c52c13d3aabb +3d2b4eb4fb0b1551 +bd3258a5827a7557 +3d3da75a7d858aa9 +bd412c52c13d3aac +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b54 +3fe6a09e667f3a9f +3fe6a09e667f3c09 +3fe6a09e667f39ea +3fe6a09e667f3cbe +bd253d0ed4d800f5 +bd3a9e876a6c007b +3d1585e2564ffe16 +bd454f43b536003d +3d3561789593ff85 +bd12343bc1be76c7 +bd291a1de0df3b64 +3d0b97887c831272 +bd348d0ef06f9db2 +3d26e5e21f20c49c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c22 +bfe6a09e667f3cd7 +bfe6a09e667f3b6e +bfe6a09e667f3d8c +bfe6a09e667f3ab8 +3d1e56d15d49d932 +3d3795b45752764d +bd20d497515b1367 +3d43cada2ba93b26 +bd386a4ba8ad89b3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3b99 +bfe6a09e667f3ae4 +bfe6a09e667f3c4e +bfe6a09e667f3a2f +bfe6a09e667f3d03 +bd12338510e3b07a +bd348ce14438ec1f +3d26e63d778e27c3 +bd424670a21c760f +3d3b731ebbc713e1 +3cf843bdd561383d +3d230877baac2708 +bd19ef108aa7b1f1 +3d31843bdd561384 +bd2cf7884553d8f8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bde +3fe6a09e667f3c93 +3fe6a09e667f3b29 +3fe6a09e667f3d48 +3fe6a09e667f3a74 +3cf840e311f61f09 +3d31840e311f61f1 +bd2cf7e39dc13c1f +3d40c207188fb0f8 +bd3e7bf1cee09e0f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bde +3fe6a09e667f3b29 +3fe6a09e667f3c93 +3fe6a09e667f3a74 +3fe6a09e667f3d48 +3cf84c4e1fa283d7 +bd2cf6763c0baf85 +3d3184c4e1fa283d +bd3e7b3b1e05d7c3 +3d40c26270fd141f +3cf849735c376aa4 +bd19eda328f22557 +3d23092e6b86ed54 +bd2cf6d1947912ac +3d31849735c376aa +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c4e +bfe6a09e667f3d03 +bfe6a09e667f3b99 +bfe6a09e667f3db8 +bfe6a09e667f3ae4 +3d26e4d015d89b29 +3d3b72680aec4d95 +bd12365fd44ec9ae +3d45b934057626ca +bd348d97f513b26b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3b6d +bfe6a09e667f3ab8 +bfe6a09e667f3c22 +bfe6a09e667f3a03 +bfe6a09e667f3cd7 +bd20d329efa586cd +bd386994f7d2c367 +3d1e59ac20b4f266 +bd4434ca7be961b3 +3d37966b082d3c99 +3d0b94adb917f93e +3d26e52b6e45fe50 +bd1235a923740361 +3d337295b722ff28 +bd291ad491ba01b0 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3c0a +3fe6a09e667f3cbe +3fe6a09e667f3b54 +3fe6a09e667f3d73 +3fe6a09e667f3a9f +3d15830792e4e4e2 +3d3560c1e4b93939 +bd253e7c368d8d8f +3d42b060f25c9c9c +bd3a9f3e1b46c6c7 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bb2 +3fe6a09e667f3afd +3fe6a09e667f3c67 +3fe6a09e667f3a48 +3fe6a09e667f3d1c +bd02bf768cfd7854 +bd3257eed19faf0a +3d2b50225cc0a1eb +bd412bf768cfd785 +3d3da8112e6050f6 +bcda70a9025d3e70 +bd20d3854812e9f3 +3d1e58f56fda2c19 +bd3069c2a40974fa +3d2f2c7ab7ed160d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc5 +bfe6a09e667f3c7a +bfe6a09e667f3b10 +bfe6a09e667f3d2f +bfe6a09e667f3a5b +bce61c882f3b6470 +3d2e9e377d0c49b9 +bd30b0e44179db24 +3d3f4f1bbe8624dc +bd40587220bced92 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bf7 +bfe6a09e667f3b42 +bfe6a09e667f3cac +bfe6a09e667f3a8d +bfe6a09e667f3d61 +3d0dcdbaa49b2a8c +bd288c9156d9355d +3d33b9b754936552 +bd3c4648ab6c9aae +3d41dcdbaa49b2a9 +3d1583be43bfab2f +3d2ac1df21dfd597 +bd04f8837880a9a2 +3d3560ef90efeacc +bd253e20de202a69 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3c35 +3fe6a09e667f3cea +3fe6a09e667f3b80 +3fe6a09e667f3d9f +3fe6a09e667f3acb +3d227aeb30a62101 +3d393d7598531080 +bd1b0a299eb3bdfe +3d449ebacc298840 +bd36c28a67acef80 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b86 +3fe6a09e667f3ad1 +3fe6a09e667f3c3b +3fe6a09e667f3a1c +3fe6a09e667f3cf0 +bd18d28a14e6194a +bd3634a285398652 +3d2396baf58cf35b +bd431a51429cc329 +3d39cb5d7ac679ae +bd02c0e3eeb304ee +bd24b038fbacc13b +3d169f8e08a67d89 +bd32581c7dd6609e +3d2b4fc704533ec5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bf0 +bfe6a09e667f3ca6 +bfe6a09e667f3b3b +bfe6a09e667f3d5b +bfe6a09e667f3a86 +3d095e7b90ffe123 +3d332bcf721ffc24 +bd29a8611bc007b7 +3d4195e7b90ffe12 +bd3cd4308de003dc +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bcb +bfe6a09e667f3b16 +bfe6a09e667f3c80 +bfe6a09e667f3a61 +bfe6a09e667f3d35 +bcc17e2f8338fb35 +bd3022fc5f0671f6 +3d2fba0741f31c13 +bd40117e2f8338fb +3d3fdd03a0f98e0a +bce616d2a8653209 +3d1d3d25aaf359bf +bd21616d2a865321 +3d2e9e92d579acdf +bd30b0b695432990 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bac +3fe6a09e667f3c61 +3fe6a09e667f3af7 +3fe6a09e667f3d16 +3fe6a09e667f3a42 +bd072eb5a098c1bd +3d2a345297d9cf91 +bd32e5d6b4131838 +3d3d1a294bece7c8 +bd4172eb5a098c1c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b5b +3fe6a09e667f3aa6 +3fe6a09e667f3c10 +3fe6a09e667f39f1 +3fe6a09e667f3cc4 +bd2422ac71a6bb35 +bd3a115638d35d9a +3d17baa71cb28996 +bd4508ab1c69aecd +3d35eea9c72ca266 +bd1119d95e8d3107 +bd288cecaf469883 +3d0dcc4d42e59df2 +bd34467657a34c42 +3d27731350b9677d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c1c +bfe6a09e667f3cd1 +bfe6a09e667f3b67 +bfe6a09e667f3d86 +bfe6a09e667f3ab2 +3d1c220c96e74db2 +3d37088325b9d36c +bd21eef9b48c5927 +3d43844192dce9b6 +bd38f77cda462c94 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3b9f +bfe6a09e667f3aea +bfe6a09e667f3c54 +bfe6a09e667f3a35 +bfe6a09e667f3d09 +bd0ffd80950249f3 +bd33ffb012a0493e +3d28009fdabf6d83 +bd41ffd80950249f +3d3c004fed5fb6c2 +3cf3da34489c213b +3d227b4689138427 +bd1b0972edd8f7b1 +3d313da34489c214 +bd2d84b976ec7bd9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bd8 +3fe6a09e667f3c8d +3fe6a09e667f3b22 +3fe6a09e667f3d42 +3fe6a09e667f3a6d +3ceedb9ff0d7e20b +3d30f6dcff86bf10 +bd2e124600f281df +3d407b6e7fc35f88 +bd3f0923007940f0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3be4 +3fe6a09e667f3b2f +3fe6a09e667f3c99 +3fe6a09e667f3a7a +3fe6a09e667f3d4e +3d008fb09c9658ed +bd2bdc13d8da69c5 +3d3211f61392cb1e +bd3dee09ec6d34e2 +3d4108fb09c9658f +3cfcb2fce8fc81a5 +bd18d340c5c0df97 +3d23965f9d1f9035 +bd2c69a062e06fcb +3d31cb2fce8fc81a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c48 +bfe6a09e667f3cfd +bfe6a09e667f3b93 +bfe6a09e667f3db2 +bfe6a09e667f3ade +3d25ca6db2a75569 +3d3ae536d953aab4 +bd146b249ab1552f +3d45729b6ca9d55a +bd351ac926ac554c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3b74 +bfe6a09e667f3abf +bfe6a09e667f3c29 +bfe6a09e667f3a0a +bfe6a09e667f3cdd +bd1f718f18e88219 +bd37dc63c63a2086 +3d204738738bbef3 +bd43ee31e31d1043 +3d38239c39c5df7a +3d095fe8f2b56dbd +3d2657fa3cad5b6f +bd13500b86a54921 +3d332bfd1e56adb8 +bd29a805c352a491 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3c03 +3fe6a09e667f3cb8 +3fe6a09e667f3b4e +3fe6a09e667f3d6d +3fe6a09e667f3a99 +3d134e42cc825961 +3d34d390b3209658 +bd2658de99bed34f +3d4269c859904b2c +bd3b2c6f4cdf69a8 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bb9 +3fe6a09e667f3b03 +3fe6a09e667f3c6d +3fe6a09e667f3a4e +3fe6a09e667f3d22 +bcfcabda0070c2a5 +bd31cabda0070c2a +3d2c6a84bff1e7ab +bd40e55ed0038615 +3d3e35425ff8f3d6 +bcc195059e91c4d2 +bd204654167a4713 +3d1f7357d30b71d9 +bd30232a0b3d238a +3d2fb9abe985b8ed +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bbe +bfe6a09e667f3c74 +bfe6a09e667f3b0a +bfe6a09e667f3d29 +bfe6a09e667f3a54 +bcf3e1573127e03c +3d2d83d519db03f9 +bd313e1573127e04 +3d3ec1ea8ced81fc +bd409f0ab9893f02 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bfd +bfe6a09e667f3b48 +bfe6a09e667f3cb2 +bfe6a09e667f3a93 +bfe6a09e667f3d67 +3d111ba218b020c7 +bd27722ef3a7ef9d +3d3446e8862c0832 +bd3bb91779d3f7ce +3d42237443160419 +3d14695be08e656e +3d2a34adf04732b7 +bd072d483ee33523 +3d351a56f823995c +bd25cb520fb8cd49 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3c2f +3fe6a09e667f3ce4 +3fe6a09e667f3b7a +3fe6a09e667f3d99 +3fe6a09e667f3ac5 +3d216088cd74db40 +3d38b04466ba6da0 +bd1d3eee6516497f +3d445822335d36d0 +bd374fbb99459260 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b8d +3fe6a09e667f3ad8 +3fe6a09e667f3c42 +3fe6a09e667f3a22 +3fe6a09e667f3cf6 +bd169dc54e838dc9 +bd35a77153a0e372 +3d24b11d58be391c +bd42d3b8a9d071b9 +3d3a588eac5f1c8e +bd008c1f2850796d +bd242307ca141e5b +3d17b9f06bd7c34a +bd321183e50a0f2e +3d2bdcf835ebe1a5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bea +bfe6a09e667f3c9f +bfe6a09e667f3b35 +bfe6a09e667f3d54 +bfe6a09e667f3a80 +3d04f4f2043aca22 +3d329e9e40875944 +bd2ac2c37ef14d78 +3d414f4f2043aca2 +bd3d6161bf78a6bc +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd2 +bfe6a09e667f3b1c +bfe6a09e667f3c86 +bfe6a09e667f3a67 +bfe6a09e667f3d3b +3cda8d34a48c3a73 +bd2f2b965adb9e2c +3d306a34d29230ea +bd3f95cb2d6dcf16 +3d40351a69491875 +bceee9e5c1ef600d +3d1c22c347c213fe +bd21ee9e5c1ef601 +3d2e1161a3e109ff +bd30f74f2e0f7b00 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3ba6 +3fe6a09e667f3c5b +3fe6a09e667f3af1 +3fe6a09e667f3d10 +3fe6a09e667f3a3c +bd0b983f2d5dd8be +3d2919f034a889d0 +bd337307e5abbb18 +3d3c8cf81a5444e8 +bd41b983f2d5dd8c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b61 +3fe6a09e667f3aac +3fe6a09e667f3c16 +3fe6a09e667f39f7 +3fe6a09e667f3ccb +bd23084a0e757574 +bd398425073ababa +3d19ef6be3151517 +bd44c212839d5d5d +3d367bdaf8c54546 +bd0ffeedf6b7d68d +bd27ffbb7dadf5a3 +3d10008904a414ba +bd33ffddbed6fad2 +3d28004482520a5d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c16 +bfe6a09e667f3ccb +bfe6a09e667f3b61 +bfe6a09e667f3d80 +bfe6a09e667f3aac +3d19ed47d084c231 +3d367b51f421308c +bd23095c17bd9ee8 +3d433da8fa109846 +bd3984ae0bdecf74 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3ba6 +bfe6a09e667f3af1 +bfe6a09e667f3c5b +bfe6a09e667f3a3c +bfe6a09e667f3d10 +bd0b93f7083d32f1 +bd33727ee107a65e +3d291b023df0b344 +bd41b93f7083d32f +3d3c8d811ef859a2 +3ceee15577ae1472 +3d21ee15577ae147 +bd1c23d5510a3d72 +3d30f70aabbd70a4 +bd2e11eaa8851eb9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bd1 +3fe6a09e667f3c86 +3fe6a09e667f3b1c +3fe6a09e667f3d3b +3fe6a09e667f3a67 +3cda6af37b870c09 +3d3069abcdee1c30 +bd2f2ca86423c7a0 +3d4034d5e6f70e18 +bd3f96543211e3d0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bea +3fe6a09e667f3b35 +3fe6a09e667f3c9f +3fe6a09e667f3a80 +3fe6a09e667f3d54 +3d04f93a295b6fef +bd2ac1b175a92404 +3d329f27452b6dfe +bd3d60d8bad49202 +3d414f93a295b6ff +3d008e433ae0cc54 +bd17b8de628f99d6 +3d242390ceb83315 +bd2bdc6f3147cceb +3d3211c8675c198a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c42 +bfe6a09e667f3cf6 +bfe6a09e667f3b8c +bfe6a09e667f3dac +bfe6a09e667f3ad8 +3d24b00b4f760fa8 +3d3a5805a7bb07d4 +bd169fe96113e0b0 +3d452c02d3dd83ea +bd35a7fa5844f82c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3b7a +bfe6a09e667f3ac5 +bfe6a09e667f3c2f +bfe6a09e667f3a10 +bfe6a09e667f3ce4 +bd1d3cca5285f698 +bd374f3294a17da6 +3d21619ad6bd04b4 +bd43a7994a50bed3 +3d38b0cd6b5e825a +3d072b242c52e23c +3d1b95921629711e +bcf1a9b7a75a3b87 +3d25cac90b14b88f +bd146a6de9d68ee2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bfd +3fe6a09e667f3c57 +3fe6a09e667f3ba2 +3fe6a09e667f3cb2 +3fe6a09e667f3b48 +3d11197e061fcde0 +3d288cbf030fe6f0 +bd0dcd03f3c0643f +3d34465f8187f378 +bd277340fcf01910 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bbf +3fe6a09e667f3b64 +3fe6a09e667f3c19 +3fe6a09e667f3b0a +3fe6a09e667f3c74 +bcf3d8c6e6e694a1 +bd227b18dcdcd294 +3d1b09ce46465ad8 +bd313d8c6e6e694a +3d2d84e723232d6c +3cc1b746c796f33c +bd0ee48b938690cc +3d108dba363cb79a +bd1f7245c9c34866 +3d2046dd1b1e5bcd +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c13 +bfe6a09e667f3c6d +bfe6a09e667f3bb8 +bfe6a09e667f3cc8 +bfe6a09e667f3b5e +3d18d2e56d537c70 +3d2c6972b6a9be38 +bcfcb46a4ab20e3f +3d3634b95b54df1c +bd23968d495641c8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3ba9 +bfe6a09e667f3b4e +bfe6a09e667f3c03 +bfe6a09e667f3af4 +bfe6a09e667f3c5e +bd095f3241daa770 +bd2657cc9076a9dc +3d135066df12ac48 +bd332be6483b54ee +3d29a8336f895624 +3cea77cbeae8fd71 +3d134ef97d5d1fae +bd09620d0545c0a4 +3d21a77cbeae8fd7 +bd1cb10682a2e052 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bce +3fe6a09e667f3c29 +3fe6a09e667f3b74 +3fe6a09e667f3c83 +3fe6a09e667f3b19 +3cc1899a90e56004 +3d2046266a439580 +bd1f73b32b78d500 +3d3023133521cac0 +bd2fb9d995bc6a80 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b93 +3fe6a09e667f3b38 +3fe6a09e667f3bed +3fe6a09e667f3ade +3fe6a09e667f3c48 +bd14690088210248 +bd2a348044108124 +3d072dfeefbdfb70 +bd351a4022084092 +3d25cb7fbbef7edc +bcfcaeb4c3dbdbd8 +bd172bad30f6f6f6 +3d01a8a59e121214 +bd2395d6987b7b7b +3d18d452cf09090a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3be4 +bfe6a09e667f3c3e +bfe6a09e667f3b8a +bfe6a09e667f3c99 +bfe6a09e667f3b2f +3d008b687775b320 +3d2422da1ddd6cc8 +bd17ba4bc4452670 +3d32116d0eeeb664 +bd2bdd25e2229338 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd8 +bfe6a09e667f3b7d +bfe6a09e667f3c32 +bfe6a09e667f3b22 +bfe6a09e667f3c8d +3ceeecc0855a7940 +bd1c2267ef54b0d8 +3d21eecc0855a794 +bd2e1133f7aa586c +3d30f766042ad3ca +3d0610c1c9219c7c +3d1b0860e490ce3e +bcf3de7c6dbcc708 +3d2584307248671f +bd14f79f1b6f31c2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bfa +3fe6a09e667f3c54 +3fe6a09e667f3b9f +3fe6a09e667f3caf +3fe6a09e667f3b45 +3d0ffe3745dd1040 +3d27ff8dd1774410 +bd1000e45d1177e0 +3d33ffc6e8bba208 +bd2800722e88bbf0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc2 +3fe6a09e667f3b67 +3fe6a09e667f3c1c +3fe6a09e667f3b0d +3fe6a09e667f3c77 +bceede7ab442fb3f +bd21ede7ab442fb4 +3d1c2430a977a098 +bd30f6f3d5a217da +3d2e121854bbd04c +3cd1aeb67d55a7a1 +bd0dca2930554b0c +3d111aeb67d55a7a +bd1ee514982aa586 +3d208d75b3eaad3d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c10 +bfe6a09e667f3c6a +bfe6a09e667f3bb5 +bfe6a09e667f3cc4 +bfe6a09e667f3b5b +3d17b8830a2236b0 +3d2bdc4185111b58 +bd008ef9ebbb92a0 +3d35ee20c2888dac +bd2423be7aeee4a8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bac +bfe6a09e667f3b51 +bfe6a09e667f3c06 +bfe6a09e667f3af7 +bfe6a09e667f3c61 +bd072a6d7b781bef +bd25ca9b5ede06fc +3d146ac94243f208 +bd32e54daf6f037e +3d2a3564a121f904 +3ce60e425e23e66f +3d12c1c84bc47cce +bd0a7c6f68770664 +3d2160e425e23e67 +bd1d3e37b43b8332 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bcb +3fe6a09e667f3c26 +3fe6a09e667f3b70 +3fe6a09e667f3c80 +3fe6a09e667f3b16 +bcc1c2b1d543580a +3d1f71ea7155e540 +bd20470ac7550d60 +3d2fb8f538aaf2a0 +bd30238563aa86b0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b96 +3fe6a09e667f3b3b +3fe6a09e667f3bf1 +3fe6a09e667f3ae1 +3fe6a09e667f3c4b +bd134e9e24efbc88 +bd29a74f1277de44 +3d0962c3b62086f1 +bd34d3a7893bef22 +3d2658b0ed8821bc +bcfa79effd795057 +bd169e7bff5e5416 +3d02c308014357d4 +bd234f3dffaf2a0b +3d19618400a1abea +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3be1 +bfe6a09e667f3c3b +bfe6a09e667f3b86 +bfe6a09e667f3c96 +bfe6a09e667f3b2c +3cfcad4762264f3e +3d2395a8ec44c9e8 +bd18d4ae27766c30 +3d31cad4762264f4 +bd2c6a5713bb3618 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bda +bfe6a09e667f3b80 +bfe6a09e667f3c35 +bfe6a09e667f3b26 +bfe6a09e667f3c90 +3cf3dfe9cf7253a2 +bd1b08058c236b18 +3d227bfd39ee4a74 +bd2d8402c611b58c +3d313dfe9cf7253a +3d04f65f65f056bb +3d1a7b2fb2f82b5e +bcf61341341f5289 +3d253d97d97c15af +bd1584d04d07d4a2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bf7 +3fe6a09e667f3c51 +3fe6a09e667f3b9c +3fe6a09e667f3cac +3fe6a09e667f3b42 +3d0dc9727f7a84bf +3d27725c9fdea130 +bd111b46c042bda1 +3d33b92e4fef5098 +bd288da360215ed0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc5 +3fe6a09e667f3b6a +3fe6a09e667f3c1f +3fe6a09e667f3b10 +3fe6a09e667f3c7a +bce60b679ab8cd3b +bd2160b679ab8cd4 +3d1d3e930ca8e659 +bd30b05b3cd5c66a +3d2e9f498654732c +3cda81c996dfd5a5 +bd0cafc6cd24054b +3d11a81c996dfd5a +bd1e57e3669202a6 +3d20d40e4cb6fead +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c0c +bfe6a09e667f3c67 +bfe6a09e667f3bb2 +bfe6a09e667f3cc2 +bfe6a09e667f3b58 +3d169e20a6f0f0ef +3d2b4f1053787878 +bd02c3beb21e1e21 +3d35a78829bc3c3c +bd24b0efac878788 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3baf +bfe6a09e667f3b54 +bfe6a09e667f3c09 +bfe6a09e667f3afa +bfe6a09e667f3c64 +bd04f5a8b515906f +bd253d6a2d45641c +3d15852ba57537c9 +bd329eb516a2b20e +3d2ac295d2ba9be4 +3ce1a4b8d15ecf6d +3d1234971a2bd9ee +bd0b96d1cba84c25 +3d211a4b8d15ecf7 +bd1dcb68e5d42612 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc8 +3fe6a09e667f3c22 +3fe6a09e667f3b6e +3fe6a09e667f3c7d +3fe6a09e667f3b13 +bcda877f1db6080c +3d1e57880e249f7f +bd20d43bf8edb040 +3d2f2bc407124fc0 +bd306a1dfc76d820 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b99 +3fe6a09e667f3b3f +3fe6a09e667f3bf3 +3fe6a09e667f3ae4 +3fe6a09e667f3c4e +bd12343bc1be76c7 +bd291a1de0df3b64 +3d0b97887c831272 +bd348d0ef06f9db2 +3d26e5e21f20c49c +bcf8452b3716c4d6 +bd16114acdc5b136 +3d03dd6a64749d95 +bd2308a566e2d89b +3d19eeb5323a4eca +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bde +bfe6a09e667f3c38 +bfe6a09e667f3b83 +bfe6a09e667f3c93 +bfe6a09e667f3b29 +3cf843bdd561383d +3d230877baac2708 +bd19ef108aa7b1f1 +3d31843bdd561384 +bd2cf7884553d8f8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bde +bfe6a09e667f3b83 +bfe6a09e667f3c38 +bfe6a09e667f3b29 +bfe6a09e667f3c93 +3cf849735c376aa4 +bd19eda328f22557 +3d23092e6b86ed54 +bd2cf6d1947912ac +3d31849735c376aa +3d03dbfd02bf10fb +3d19edfe815f887e +bcf84805fa81de0a +3d24f6ff40afc43f +bd1612017ea07782 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bf4 +3fe6a09e667f3c4e +3fe6a09e667f3b99 +3fe6a09e667f3ca9 +3fe6a09e667f3b3f +3d0b94adb917f93e +3d26e52b6e45fe50 +bd1235a923740361 +3d337295b722ff28 +bd291ad491ba01b0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc8 +3fe6a09e667f3b6e +3fe6a09e667f3c22 +3fe6a09e667f3b13 +3fe6a09e667f3c7d +bcda70a9025d3e70 +bd20d3854812e9f3 +3d1e58f56fda2c19 +bd3069c2a40974fa +3d2f2c7ab7ed160d +3ce1aa6e583501d4 +bd0b956469f2bf8b +3d12354dcb06a03b +bd1dcab234f95fc5 +3d211aa6e583501d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c0a +bfe6a09e667f3c64 +bfe6a09e667f3baf +bfe6a09e667f3cbe +bfe6a09e667f3b54 +3d1583be43bfab2f +3d2ac1df21dfd597 +bd04f8837880a9a2 +3d3560ef90efeacc +bd253e20de202a69 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bb2 +bfe6a09e667f3b58 +bfe6a09e667f3c0c +bfe6a09e667f3afd +bfe6a09e667f3c67 +bd02c0e3eeb304ee +bd24b038fbacc13b +3d169f8e08a67d89 +bd32581c7dd6609e +3d2b4fc704533ec5 +3cda765e893370d7 +3d11a765e893370d +bd0cb1342ed991e5 +3d20d3b2f4499b87 +bd1e589a176cc8f3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc5 +3fe6a09e667f3c1f +3fe6a09e667f3b6a +3fe6a09e667f3c7a +3fe6a09e667f3b10 +bce616d2a8653209 +3d1d3d25aaf359bf +bd21616d2a865321 +3d2e9e92d579acdf +bd30b0b695432990 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b9c +3fe6a09e667f3b42 +3fe6a09e667f3bf7 +3fe6a09e667f3ae7 +3fe6a09e667f3c51 +bd1119d95e8d3107 +bd288cecaf469883 +3d0dcc4d42e59df2 +bd34467657a34c42 +3d27731350b9677d +bcf6106670b43955 +bd1584199c2d0e55 +3d04f7ccc7a5e355 +bd22c20cce16872b +3d1a7be663d2f1ab +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bdb +bfe6a09e667f3c35 +bfe6a09e667f3b80 +bfe6a09e667f3c90 +bfe6a09e667f3b26 +3cf3da34489c213b +3d227b4689138427 +bd1b0972edd8f7b1 +3d313da34489c214 +bd2d84b976ec7bd9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3be1 +bfe6a09e667f3b86 +bfe6a09e667f3c3b +bfe6a09e667f3b2c +bfe6a09e667f3c96 +3cfcb2fce8fc81a5 +bd18d340c5c0df97 +3d23965f9d1f9035 +bd2c69a062e06fcb +3d31cb2fce8fc81a +3d02c19a9f8dcb3b +3d1960cd4fc6e59d +bcfa7ccac0e4698b +3d24b066a7e372cf +bd169f32b0391a63 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bf0 +3fe6a09e667f3c4b +3fe6a09e667f3b96 +3fe6a09e667f3ca6 +3fe6a09e667f3b3b +3d095fe8f2b56dbd +3d2657fa3cad5b6f +bd13500b86a54921 +3d332bfd1e56adb8 +bd29a805c352a491 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bcb +3fe6a09e667f3b71 +3fe6a09e667f3c25 +3fe6a09e667f3b16 +3fe6a09e667f3c80 +bcc195059e91c4d2 +bd204654167a4713 +3d1f7357d30b71d9 +bd30232a0b3d238a +3d2fb9abe985b8ed +3ce613f7e4fa18d6 +bd0a7b0206c179cb +3d12c27efc9f431b +bd1d3d810360bce5 +3d21613f7e4fa18d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3c06 +bfe6a09e667f3c61 +bfe6a09e667f3bac +bfe6a09e667f3cbb +bfe6a09e667f3b51 +3d14695be08e656e +3d2a34adf04732b7 +bd072d483ee33523 +3d351a56f823995c +bd25cb520fb8cd49 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bb5 +bfe6a09e667f3b5b +bfe6a09e667f3c10 +bfe6a09e667f3b00 +bfe6a09e667f3c6a +bd008c1f2850796d +bd242307ca141e5b +3d17b9f06bd7c34a +bd321183e50a0f2e +3d2bdcf835ebe1a5 +3cd1a34b6fa942d3 +3d111a34b6fa942d +bd0dcb96920ad7a6 +3d208d1a5b7d4a17 +bd1ee5cb49056bd3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc2 +3fe6a09e667f3c1c +3fe6a09e667f3b67 +3fe6a09e667f3c77 +3fe6a09e667f3b0d +bceee9e5c1ef600d +3d1c22c347c213fe +bd21ee9e5c1ef601 +3d2e1161a3e109ff +bd30f74f2e0f7b00 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3b9f +3fe6a09e667f3b45 +3fe6a09e667f3bfa +3fe6a09e667f3aea +3fe6a09e667f3c54 +bd0ffeedf6b7d68d +bd27ffbb7dadf5a3 +3d10008904a414ba +bd33ffddbed6fad2 +3d28004482520a5d +bcf3dba1aa51add5 +bd14f6e86a946b75 +3d06122f2ad72916 +bd227b74354a35bb +3d1b0917956b948b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd8 +bfe6a09e667f3c32 +bfe6a09e667f3b7d +bfe6a09e667f3c8d +bfe6a09e667f3b22 +3ceee15577ae1472 +3d21ee15577ae147 +bd1c23d5510a3d72 +3d30f70aabbd70a4 +bd2e11eaa8851eb9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3be4 +bfe6a09e667f3b8a +bfe6a09e667f3c3e +bfe6a09e667f3b2f +bfe6a09e667f3c99 +3d008e433ae0cc54 +bd17b8de628f99d6 +3d242390ceb83315 +bd2bdc6f3147cceb +3d3211c8675c198a +3d01a7383c5c857a +3d18d39c1e2e42bd +bcfcb18f8746f50c +3d2469ce0f17215f +bd172c63e1d1bd43 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bed +3fe6a09e667f3c1b +3fe6a09e667f3bc0 +3fe6a09e667f3c48 +3fe6a09e667f3b93 +3d072b242c52e23c +3d1b95921629711e +bcf1a9b7a75a3b87 +3d25cac90b14b88f +bd146a6de9d68ee2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bce +3fe6a09e667f3ba1 +3fe6a09e667f3bfc +3fe6a09e667f3b74 +3fe6a09e667f3c29 +3cc1b746c796f33c +bd0ee48b938690cc +3d108dba363cb79a +bd1f7245c9c34866 +3d2046dd1b1e5bcd +bcf2c13f47206814 +bd09609fa390340a +3cea7d8171bf2fd8 +bd14b04fd1c81a05 +3d069f605c6fcbf6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd6 +bfe6a09e667f3c03 +bfe6a09e667f3ba9 +bfe6a09e667f3c31 +bfe6a09e667f3b7b +3cea77cbeae8fd71 +3d134ef97d5d1fae +bd09620d0545c0a4 +3d21a77cbeae8fd7 +bd1cb10682a2e052 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bb9 +bfe6a09e667f3b8b +bfe6a09e667f3be6 +bfe6a09e667f3b5e +bfe6a09e667f3c13 +bcfcaeb4c3dbdbd8 +bd172bad30f6f6f6 +3d01a8a59e121214 +bd2395d6987b7b7b +3d18d452cf09090a +3cc1a070ac3e29a0 +3d011a070ac3e29a +bcfdcbf1ea783acc +3d108d038561f14d +bd0ee5f8f53c1d66 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bec +3fe6a09e667f3c19 +3fe6a09e667f3bbe +3fe6a09e667f3c46 +3fe6a09e667f3b91 +3d0610c1c9219c7c +3d1b0860e490ce3e +bcf3de7c6dbcc708 +3d2584307248671f +bd14f79f1b6f31c2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bd0 +3fe6a09e667f3ba3 +3fe6a09e667f3bfd +3fe6a09e667f3b75 +3fe6a09e667f3c2a +3cd1aeb67d55a7a1 +bd0dca2930554b0c +3d111aeb67d55a7a +bd1ee514982aa586 +3d208d75b3eaad3d +bcf1a6dce3ef2254 +bd08d36e71f7912a +3cecb2463821bb58 +bd1469b738fbc895 +3d072c918e086ed6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd4 +bfe6a09e667f3c02 +bfe6a09e667f3ba7 +bfe6a09e667f3c2f +bfe6a09e667f3b7a +3ce60e425e23e66f +3d12c1c84bc47cce +bd0a7c6f68770664 +3d2160e425e23e67 +bd1d3e37b43b8332 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bba +bfe6a09e667f3b8c +bfe6a09e667f3be7 +bfe6a09e667f3b5f +bfe6a09e667f3c14 +bcfa79effd795057 +bd169e7bff5e5416 +3d02c308014357d4 +bd234f3dffaf2a0b +3d19618400a1abea +3cb19abb2567f739 +3d008cd5d92b3fba +bcfee6544da9808c +3d10466aec959fdd +bd0f732a26d4c046 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bea +3fe6a09e667f3c18 +3fe6a09e667f3bbd +3fe6a09e667f3c45 +3fe6a09e667f3b90 +3d04f65f65f056bb +3d1a7b2fb2f82b5e +bcf61341341f5289 +3d253d97d97c15af +bd1584d04d07d4a2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bd2 +3fe6a09e667f3ba4 +3fe6a09e667f3bff +3fe6a09e667f3b77 +3fe6a09e667f3c2c +3cda81c996dfd5a5 +bd0cafc6cd24054b +3d11a81c996dfd5a +bd1e57e3669202a6 +3d20d40e4cb6fead +bcf08c7a80bddc93 +bd08463d405eee4a +3ceee70afe8446d9 +bd14231ea02f7725 +3d07b9c2bfa111b6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd3 +bfe6a09e667f3c00 +bfe6a09e667f3ba6 +bfe6a09e667f3c2d +bfe6a09e667f3b78 +3ce1a4b8d15ecf6d +3d1234971a2bd9ee +bd0b96d1cba84c25 +3d211a4b8d15ecf7 +bd1dcb68e5d42612 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bbc +bfe6a09e667f3b8e +bfe6a09e667f3be9 +bfe6a09e667f3b61 +bfe6a09e667f3c16 +bcf8452b3716c4d6 +bd16114acdc5b136 +3d03dd6a64749d95 +bd2308a566e2d89b +3d19eeb5323a4eca +bc26d61b58c99c43 +3cffff494f2539b3 +bd00005b586d6326 +3d0fffa4a7929cda +bd10002dac36b193 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3be9 +3fe6a09e667f3c16 +3fe6a09e667f3bbb +3fe6a09e667f3c43 +3fe6a09e667f3b8e +3d03dbfd02bf10fb +3d19edfe815f887e +bcf84805fa81de0a +3d24f6ff40afc43f +bd1612017ea07782 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bd3 +3fe6a09e667f3ba6 +3fe6a09e667f3c00 +3fe6a09e667f3b78 +3fe6a09e667f3c2d +3ce1aa6e583501d4 +bd0b956469f2bf8b +3d12354dcb06a03b +bd1dcab234f95fc5 +3d211aa6e583501d +bceee4303b192da6 +bd07b90c0ec64b69 +3cf08de7e273692d +bd13dc86076325b5 +3d0846f3f139b497 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd1 +bfe6a09e667f3bfe +bfe6a09e667f3ba4 +bfe6a09e667f3c2c +bfe6a09e667f3b77 +3cda765e893370d7 +3d11a765e893370d +bd0cb1342ed991e5 +3d20d3b2f4499b87 +bd1e589a176cc8f3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bbd +bfe6a09e667f3b90 +bfe6a09e667f3bea +bfe6a09e667f3b63 +bfe6a09e667f3c18 +bcf6106670b43955 +bd1584199c2d0e55 +3d04f7ccc7a5e355 +bd22c20cce16872b +3d1a7be663d2f1ab +bcb1b19140c0c0d5 +3cfee4e6ebf3f3f3 +bd008d8c8a060607 +3d0f727375f9f9f9 +bd1046c645030303 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3be7 +3fe6a09e667f3c14 +3fe6a09e667f3bba +3fe6a09e667f3c42 +3fe6a09e667f3b8c +3d02c19a9f8dcb3b +3d1960cd4fc6e59d +bcfa7ccac0e4698b +3d24b066a7e372cf +bd169f32b0391a63 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bd4 +3fe6a09e667f3ba7 +3fe6a09e667f3c02 +3fe6a09e667f3b7a +3fe6a09e667f3c2f +3ce613f7e4fa18d6 +bd0a7b0206c179cb +3d12c27efc9f431b +bd1d3d810360bce5 +3d21613f7e4fa18d +bcecaf6b74b6a225 +bd072bdadd2da889 +3cf1a84a45a4aeee +bd1395ed6e96d445 +3d08d42522d25777 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd0 +bfe6a09e667f3bfd +bfe6a09e667f3ba2 +bfe6a09e667f3c2a +bfe6a09e667f3b75 +3cd1a34b6fa942d3 +3d111a34b6fa942d +bd0dcb96920ad7a6 +3d208d1a5b7d4a17 +bd1ee5cb49056bd3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bbf +bfe6a09e667f3b91 +bfe6a09e667f3bec +bfe6a09e667f3b64 +bfe6a09e667f3c19 +bcf3dba1aa51add5 +bd14f6e86a946b75 +3d06122f2ad72916 +bd227b74354a35bb +3d1b0917956b948b +bcc1abdbb9ea8e6e +3cfdca8488c2ae32 +bd011abdbb9ea8e7 +3d0ee54244615719 +bd108d5eddcf5473 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3be6 +3fe6a09e667f3c13 +3fe6a09e667f3bb8 +3fe6a09e667f3c40 +3fe6a09e667f3b8b +3d01a7383c5c857a +3d18d39c1e2e42bd +bcfcb18f8746f50c +3d2469ce0f17215f +bd172c63e1d1bd43 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bbf +3fe6a09e667f3ba9 +3fe6a09e667f3bd6 +3fe6a09e667f3b92 +3fe6a09e667f3bed +bcf2c13f47206814 +bd09609fa390340a +3cea7d8171bf2fd8 +bd14b04fd1c81a05 +3d069f605c6fcbf6 +bcea7aa6ae5416a4 +bcfd3d53572a0b52 +3cc6156546afa570 +bd069ea9ab9505a9 +3cf2c2aca8d5f4ae +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bce +bfe6a09e667f3be5 +bfe6a09e667f3bb8 +bfe6a09e667f3bfb +bfe6a09e667f3ba1 +3cc1a070ac3e29a0 +3d011a070ac3e29a +bcfdcbf1ea783acc +3d108d038561f14d +bd0ee5f8f53c1d66 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc0 +bfe6a09e667f3baa +bfe6a09e667f3bd7 +bfe6a09e667f3b93 +bfe6a09e667f3bed +bcf1a6dce3ef2254 +bd08d36e71f7912a +3cecb2463821bb58 +bd1469b738fbc895 +3d072c918e086ed6 +bcca7eeed374bc71 +3ce960444b22d0e4 +bcf34fddda6e978e +3cfcb02225916872 +bd01a7eeed374bc7 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bcd +3fe6a09e667f3be4 +3fe6a09e667f3bb7 +3fe6a09e667f3bfb +3fe6a09e667f3ba0 +3cb19abb2567f739 +3d008cd5d92b3fba +bcfee6544da9808c +3d10466aec959fdd +bd0f732a26d4c046 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc1 +3fe6a09e667f3baa +3fe6a09e667f3bd8 +3fe6a09e667f3b94 +3fe6a09e667f3bee +bcf08c7a80bddc93 +bd08463d405eee4a +3ceee70afe8446d9 +bd14231ea02f7725 +3d07b9c2bfa111b6 +bce845e1e7f18b23 +bcfc22f0f3f8c592 +3ccee8786039d373 +bd06117879fc62c9 +3cf3dd0f0c073a6e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bcd +bfe6a09e667f3be3 +bfe6a09e667f3bb6 +bfe6a09e667f3bfa +bfe6a09e667f3b9f +bc26d61b58c99c43 +3cffff494f2539b3 +bd00005b586d6326 +3d0fffa4a7929cda +bd10002dac36b193 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc2 +bfe6a09e667f3bab +bfe6a09e667f3bd8 +bfe6a09e667f3b94 +bfe6a09e667f3bef +bceee4303b192da6 +bd07b90c0ec64b69 +3cf08de7e273692d +bd13dc86076325b5 +3d0846f3f139b497 +bcd1a900f67f753a +3ce72b7f84c04563 +bcf46a403d9fdd4f +3cfb95bfc26022b1 +bd0235201ecfeea7 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bcc +3fe6a09e667f3be2 +3fe6a09e667f3bb5 +3fe6a09e667f3bf9 +3fe6a09e667f3b9e +bcb1b19140c0c0d5 +3cfee4e6ebf3f3f3 +bd008d8c8a060607 +3d0f727375f9f9f9 +bd1046c645030303 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc3 +3fe6a09e667f3bac +3fe6a09e667f3bd9 +3fe6a09e667f3b95 +3fe6a09e667f3bf0 +bcecaf6b74b6a225 +bd072bdadd2da889 +3cf1a84a45a4aeee +bd1395ed6e96d445 +3d08d42522d25777 +bce6111d218effa2 +bcfb088e90c77fd1 +3cd3ddc5bce200bb +bd0584474863bfe9 +3cf4f7716f38802f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bcb +bfe6a09e667f3be2 +bfe6a09e667f3bb4 +bfe6a09e667f3bf8 +bfe6a09e667f3b9e +bcc1abdbb9ea8e6e +3cfdca8488c2ae32 +bd011abdbb9ea8e7 +3d0ee54244615719 +bd108d5eddcf5473 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc3 +bfe6a09e667f3bb8 +bfe6a09e667f3bce +bfe6a09e667f3bad +bfe6a09e667f3bda +bcea7aa6ae5416a4 +bcfd3d53572a0b52 +3cc6156546afa570 +bd069ea9ab9505a9 +3cf2c2aca8d5f4ae +3cc3daeaf976e788 +3ce4f6babe5db9e2 +bcd6128a83448c3c +3cf27b5d5f2edcf1 +bceb094541a2461e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bca +3fe6a09e667f3bd6 +3fe6a09e667f3bbf +3fe6a09e667f3be1 +3fe6a09e667f3bb4 +bcca7eeed374bc71 +3ce960444b22d0e4 +bcf34fddda6e978e +3cfcb02225916872 +bd01a7eeed374bc7 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc4 +3fe6a09e667f3bb9 +3fe6a09e667f3bcf +3fe6a09e667f3bad +3fe6a09e667f3bda +bce845e1e7f18b23 +bcfc22f0f3f8c592 +3ccee8786039d373 +bd06117879fc62c9 +3cf3dd0f0c073a6e +bcbee2c2d963a10c +bce3dc585b2c7422 +3cd8474f49a717bd +bcf1ee2c2d963a11 +3cec23a7a4d38bde +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc9 +bfe6a09e667f3bd5 +bfe6a09e667f3bbe +bfe6a09e667f3be0 +bfe6a09e667f3bb3 +bcd1a900f67f753a +3ce72b7f84c04563 +bcf46a403d9fdd4f +3cfb95bfc26022b1 +bd0235201ecfeea7 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc5 +bfe6a09e667f3bb9 +bfe6a09e667f3bd0 +bfe6a09e667f3bae +bfe6a09e667f3bdb +bce6111d218effa2 +bcfb088e90c77fd1 +3cd3ddc5bce200bb +bd0584474863bfe9 +3cf4f7716f38802f +3cb60fafbfd97309 +3cd583ebeff65cc2 +bcc4f8282013467c +3ce2c1f5f7fb2e61 +bcda7c141009a33e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bce +3fe6a09e667f3bd4 +3fe6a09e667f3bc9 +3fe6a09e667f3bd9 +3fe6a09e667f3bc3 +3cc3daeaf976e788 +3ce4f6babe5db9e2 +bcd6128a83448c3c +3cf27b5d5f2edcf1 +bceb094541a2461e +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bcb +3fe6a09e667f3bc6 +3fe6a09e667f3bd1 +3fe6a09e667f3bc0 +3fe6a09e667f3bd6 +bcbee2c2d963a10c +bce3dc585b2c7422 +3cd8474f49a717bd +bcf1ee2c2d963a11 +3cec23a7a4d38bde +bcaa79394c9e8a0a +bcd34f272993d141 +3cc961b1acd85d7d +bce1a79394c9e8a1 +3cdcb0d8d66c2ebf +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bce +bfe6a09e667f3bd0 +bfe6a09e667f3bcb +bfe6a09e667f3bd3 +bfe6a09e667f3bc8 +3cb60fafbfd97309 +3cd583ebeff65cc2 +bcc4f8282013467c +3ce2c1f5f7fb2e61 +bcda7c141009a33e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bcc +bfe6a09e667f3bc9 +bfe6a09e667f3bcf +bfe6a09e667f3bc6 +bfe6a09e667f3bd2 +bcaa79394c9e8a0a +bcd34f272993d141 +3cc961b1acd85d7d +bce1a79394c9e8a1 +3cdcb0d8d66c2ebf +3c91a62633145c07 +3cb469898cc51702 +bca72cece675d1fd +3cc234c4c6628b81 +bcbb9676733ae8fe +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bcd +3fe6a09e667f3bce +3fe6a09e667f3bcc +3fe6a09e667f3bce +3fe6a09e667f3bcb +3c91a62633145c07 +3cb469898cc51702 +bca72cece675d1fd +3cc234c4c6628b81 +bcbb9676733ae8fe +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bcd +3fe6a09e667f3bcc +3fe6a09e667f3bce +3fe6a09e667f3bcb +3fe6a09e667f3bce +3c91a62633145c07 +bca72cece675d1fd +3cb469898cc51702 +bcbb9676733ae8fe +3cc234c4c6628b81 +3c91a62633145c07 +bca72cece675d1fd +3cb469898cc51702 +bcbb9676733ae8fe +3cc234c4c6628b81 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bcc +bfe6a09e667f3bcf +bfe6a09e667f3bc9 +bfe6a09e667f3bd2 +bfe6a09e667f3bc6 +bcaa79394c9e8a0a +3cc961b1acd85d7d +bcd34f272993d141 +3cdcb0d8d66c2ebf +bce1a79394c9e8a1 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bce +bfe6a09e667f3bcb +bfe6a09e667f3bd0 +bfe6a09e667f3bc8 +bfe6a09e667f3bd3 +3cb60fafbfd97309 +bcc4f8282013467c +3cd583ebeff65cc2 +bcda7c141009a33e +3ce2c1f5f7fb2e61 +bcaa79394c9e8a0a +3cc961b1acd85d7d +bcd34f272993d141 +3cdcb0d8d66c2ebf +bce1a79394c9e8a1 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bcb +3fe6a09e667f3bd1 +3fe6a09e667f3bc6 +3fe6a09e667f3bd6 +3fe6a09e667f3bc0 +bcbee2c2d963a10c +3cd8474f49a717bd +bce3dc585b2c7422 +3cec23a7a4d38bde +bcf1ee2c2d963a11 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bce +3fe6a09e667f3bc9 +3fe6a09e667f3bd4 +3fe6a09e667f3bc3 +3fe6a09e667f3bd9 +3cc3daeaf976e788 +bcd6128a83448c3c +3ce4f6babe5db9e2 +bceb094541a2461e +3cf27b5d5f2edcf1 +3cb60fafbfd97309 +bcc4f8282013467c +3cd583ebeff65cc2 +bcda7c141009a33e +3ce2c1f5f7fb2e61 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc5 +bfe6a09e667f3bd0 +bfe6a09e667f3bb9 +bfe6a09e667f3bdb +bfe6a09e667f3bae +bce6111d218effa2 +3cd3ddc5bce200bb +bcfb088e90c77fd1 +3cf4f7716f38802f +bd0584474863bfe9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc9 +bfe6a09e667f3bbe +bfe6a09e667f3bd5 +bfe6a09e667f3bb3 +bfe6a09e667f3be0 +bcd1a900f67f753a +bcf46a403d9fdd4f +3ce72b7f84c04563 +bd0235201ecfeea7 +3cfb95bfc26022b1 +bcbee2c2d963a10c +3cd8474f49a717bd +bce3dc585b2c7422 +3cec23a7a4d38bde +bcf1ee2c2d963a11 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc4 +3fe6a09e667f3bcf +3fe6a09e667f3bb9 +3fe6a09e667f3bda +3fe6a09e667f3bad +bce845e1e7f18b23 +3ccee8786039d373 +bcfc22f0f3f8c592 +3cf3dd0f0c073a6e +bd06117879fc62c9 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bca +3fe6a09e667f3bbf +3fe6a09e667f3bd6 +3fe6a09e667f3bb4 +3fe6a09e667f3be1 +bcca7eeed374bc71 +bcf34fddda6e978e +3ce960444b22d0e4 +bd01a7eeed374bc7 +3cfcb02225916872 +3cc3daeaf976e788 +bcd6128a83448c3c +3ce4f6babe5db9e2 +bceb094541a2461e +3cf27b5d5f2edcf1 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc3 +bfe6a09e667f3bce +bfe6a09e667f3bb8 +bfe6a09e667f3bda +bfe6a09e667f3bad +bcea7aa6ae5416a4 +3cc6156546afa570 +bcfd3d53572a0b52 +3cf2c2aca8d5f4ae +bd069ea9ab9505a9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bcb +bfe6a09e667f3bb4 +bfe6a09e667f3be2 +bfe6a09e667f3b9e +bfe6a09e667f3bf8 +bcc1abdbb9ea8e6e +bd011abdbb9ea8e7 +3cfdca8488c2ae32 +bd108d5eddcf5473 +3d0ee54244615719 +bce6111d218effa2 +3cd3ddc5bce200bb +bcfb088e90c77fd1 +3cf4f7716f38802f +bd0584474863bfe9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc3 +3fe6a09e667f3bd9 +3fe6a09e667f3bac +3fe6a09e667f3bf0 +3fe6a09e667f3b95 +bcecaf6b74b6a225 +3cf1a84a45a4aeee +bd072bdadd2da889 +3d08d42522d25777 +bd1395ed6e96d445 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bcc +3fe6a09e667f3bb5 +3fe6a09e667f3be2 +3fe6a09e667f3b9e +3fe6a09e667f3bf9 +bcb1b19140c0c0d5 +bd008d8c8a060607 +3cfee4e6ebf3f3f3 +bd1046c645030303 +3d0f727375f9f9f9 +bcd1a900f67f753a +bcf46a403d9fdd4f +3ce72b7f84c04563 +bd0235201ecfeea7 +3cfb95bfc26022b1 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc2 +bfe6a09e667f3bd8 +bfe6a09e667f3bab +bfe6a09e667f3bef +bfe6a09e667f3b94 +bceee4303b192da6 +3cf08de7e273692d +bd07b90c0ec64b69 +3d0846f3f139b497 +bd13dc86076325b5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bcd +bfe6a09e667f3bb6 +bfe6a09e667f3be3 +bfe6a09e667f3b9f +bfe6a09e667f3bfa +bc26d61b58c99c43 +bd00005b586d6326 +3cffff494f2539b3 +bd10002dac36b193 +3d0fffa4a7929cda +bce845e1e7f18b23 +3ccee8786039d373 +bcfc22f0f3f8c592 +3cf3dd0f0c073a6e +bd06117879fc62c9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc1 +3fe6a09e667f3bd8 +3fe6a09e667f3baa +3fe6a09e667f3bee +3fe6a09e667f3b94 +bcf08c7a80bddc93 +3ceee70afe8446d9 +bd08463d405eee4a +3d07b9c2bfa111b6 +bd14231ea02f7725 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bcd +3fe6a09e667f3bb7 +3fe6a09e667f3be4 +3fe6a09e667f3ba0 +3fe6a09e667f3bfb +3cb19abb2567f739 +bcfee6544da9808c +3d008cd5d92b3fba +bd0f732a26d4c046 +3d10466aec959fdd +bcca7eeed374bc71 +bcf34fddda6e978e +3ce960444b22d0e4 +bd01a7eeed374bc7 +3cfcb02225916872 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc0 +bfe6a09e667f3bd7 +bfe6a09e667f3baa +bfe6a09e667f3bed +bfe6a09e667f3b93 +bcf1a6dce3ef2254 +3cecb2463821bb58 +bd08d36e71f7912a +3d072c918e086ed6 +bd1469b738fbc895 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bce +bfe6a09e667f3bb8 +bfe6a09e667f3be5 +bfe6a09e667f3ba1 +bfe6a09e667f3bfb +3cc1a070ac3e29a0 +bcfdcbf1ea783acc +3d011a070ac3e29a +bd0ee5f8f53c1d66 +3d108d038561f14d +bcea7aa6ae5416a4 +3cc6156546afa570 +bcfd3d53572a0b52 +3cf2c2aca8d5f4ae +bd069ea9ab9505a9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bbf +3fe6a09e667f3bd6 +3fe6a09e667f3ba9 +3fe6a09e667f3bed +3fe6a09e667f3b92 +bcf2c13f47206814 +3cea7d8171bf2fd8 +bd09609fa390340a +3d069f605c6fcbf6 +bd14b04fd1c81a05 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3be6 +3fe6a09e667f3bb8 +3fe6a09e667f3c13 +3fe6a09e667f3b8b +3fe6a09e667f3c40 +3d01a7383c5c857a +bcfcb18f8746f50c +3d18d39c1e2e42bd +bd172c63e1d1bd43 +3d2469ce0f17215f +bcc1abdbb9ea8e6e +bd011abdbb9ea8e7 +3cfdca8488c2ae32 +bd108d5eddcf5473 +3d0ee54244615719 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bbf +bfe6a09e667f3bec +bfe6a09e667f3b91 +bfe6a09e667f3c19 +bfe6a09e667f3b64 +bcf3dba1aa51add5 +3d06122f2ad72916 +bd14f6e86a946b75 +3d1b0917956b948b +bd227b74354a35bb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd0 +bfe6a09e667f3ba2 +bfe6a09e667f3bfd +bfe6a09e667f3b75 +bfe6a09e667f3c2a +3cd1a34b6fa942d3 +bd0dcb96920ad7a6 +3d111a34b6fa942d +bd1ee5cb49056bd3 +3d208d1a5b7d4a17 +bcecaf6b74b6a225 +3cf1a84a45a4aeee +bd072bdadd2da889 +3d08d42522d25777 +bd1395ed6e96d445 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bd4 +3fe6a09e667f3c02 +3fe6a09e667f3ba7 +3fe6a09e667f3c2f +3fe6a09e667f3b7a +3ce613f7e4fa18d6 +3d12c27efc9f431b +bd0a7b0206c179cb +3d21613f7e4fa18d +bd1d3d810360bce5 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3be7 +3fe6a09e667f3bba +3fe6a09e667f3c14 +3fe6a09e667f3b8c +3fe6a09e667f3c42 +3d02c19a9f8dcb3b +bcfa7ccac0e4698b +3d1960cd4fc6e59d +bd169f32b0391a63 +3d24b066a7e372cf +bcb1b19140c0c0d5 +bd008d8c8a060607 +3cfee4e6ebf3f3f3 +bd1046c645030303 +3d0f727375f9f9f9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bbd +bfe6a09e667f3bea +bfe6a09e667f3b90 +bfe6a09e667f3c18 +bfe6a09e667f3b63 +bcf6106670b43955 +3d04f7ccc7a5e355 +bd1584199c2d0e55 +3d1a7be663d2f1ab +bd22c20cce16872b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd1 +bfe6a09e667f3ba4 +bfe6a09e667f3bfe +bfe6a09e667f3b77 +bfe6a09e667f3c2c +3cda765e893370d7 +bd0cb1342ed991e5 +3d11a765e893370d +bd1e589a176cc8f3 +3d20d3b2f4499b87 +bceee4303b192da6 +3cf08de7e273692d +bd07b90c0ec64b69 +3d0846f3f139b497 +bd13dc86076325b5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bd3 +3fe6a09e667f3c00 +3fe6a09e667f3ba6 +3fe6a09e667f3c2d +3fe6a09e667f3b78 +3ce1aa6e583501d4 +3d12354dcb06a03b +bd0b956469f2bf8b +3d211aa6e583501d +bd1dcab234f95fc5 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3be9 +3fe6a09e667f3bbb +3fe6a09e667f3c16 +3fe6a09e667f3b8e +3fe6a09e667f3c43 +3d03dbfd02bf10fb +bcf84805fa81de0a +3d19edfe815f887e +bd1612017ea07782 +3d24f6ff40afc43f +bc26d61b58c99c43 +bd00005b586d6326 +3cffff494f2539b3 +bd10002dac36b193 +3d0fffa4a7929cda +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bbc +bfe6a09e667f3be9 +bfe6a09e667f3b8e +bfe6a09e667f3c16 +bfe6a09e667f3b61 +bcf8452b3716c4d6 +3d03dd6a64749d95 +bd16114acdc5b136 +3d19eeb5323a4eca +bd2308a566e2d89b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd3 +bfe6a09e667f3ba6 +bfe6a09e667f3c00 +bfe6a09e667f3b78 +bfe6a09e667f3c2d +3ce1a4b8d15ecf6d +bd0b96d1cba84c25 +3d1234971a2bd9ee +bd1dcb68e5d42612 +3d211a4b8d15ecf7 +bcf08c7a80bddc93 +3ceee70afe8446d9 +bd08463d405eee4a +3d07b9c2bfa111b6 +bd14231ea02f7725 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bd2 +3fe6a09e667f3bff +3fe6a09e667f3ba4 +3fe6a09e667f3c2c +3fe6a09e667f3b77 +3cda81c996dfd5a5 +3d11a81c996dfd5a +bd0cafc6cd24054b +3d20d40e4cb6fead +bd1e57e3669202a6 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bea +3fe6a09e667f3bbd +3fe6a09e667f3c18 +3fe6a09e667f3b90 +3fe6a09e667f3c45 +3d04f65f65f056bb +bcf61341341f5289 +3d1a7b2fb2f82b5e +bd1584d04d07d4a2 +3d253d97d97c15af +3cb19abb2567f739 +bcfee6544da9808c +3d008cd5d92b3fba +bd0f732a26d4c046 +3d10466aec959fdd +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bba +bfe6a09e667f3be7 +bfe6a09e667f3b8c +bfe6a09e667f3c14 +bfe6a09e667f3b5f +bcfa79effd795057 +3d02c308014357d4 +bd169e7bff5e5416 +3d19618400a1abea +bd234f3dffaf2a0b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd4 +bfe6a09e667f3ba7 +bfe6a09e667f3c02 +bfe6a09e667f3b7a +bfe6a09e667f3c2f +3ce60e425e23e66f +bd0a7c6f68770664 +3d12c1c84bc47cce +bd1d3e37b43b8332 +3d2160e425e23e67 +bcf1a6dce3ef2254 +3cecb2463821bb58 +bd08d36e71f7912a +3d072c918e086ed6 +bd1469b738fbc895 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bd0 +3fe6a09e667f3bfd +3fe6a09e667f3ba3 +3fe6a09e667f3c2a +3fe6a09e667f3b75 +3cd1aeb67d55a7a1 +3d111aeb67d55a7a +bd0dca2930554b0c +3d208d75b3eaad3d +bd1ee514982aa586 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bec +3fe6a09e667f3bbe +3fe6a09e667f3c19 +3fe6a09e667f3b91 +3fe6a09e667f3c46 +3d0610c1c9219c7c +bcf3de7c6dbcc708 +3d1b0860e490ce3e +bd14f79f1b6f31c2 +3d2584307248671f +3cc1a070ac3e29a0 +bcfdcbf1ea783acc +3d011a070ac3e29a +bd0ee5f8f53c1d66 +3d108d038561f14d +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bb9 +bfe6a09e667f3be6 +bfe6a09e667f3b8b +bfe6a09e667f3c13 +bfe6a09e667f3b5e +bcfcaeb4c3dbdbd8 +3d01a8a59e121214 +bd172bad30f6f6f6 +3d18d452cf09090a +bd2395d6987b7b7b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd6 +bfe6a09e667f3ba9 +bfe6a09e667f3c03 +bfe6a09e667f3b7b +bfe6a09e667f3c31 +3cea77cbeae8fd71 +bd09620d0545c0a4 +3d134ef97d5d1fae +bd1cb10682a2e052 +3d21a77cbeae8fd7 +bcf2c13f47206814 +3cea7d8171bf2fd8 +bd09609fa390340a +3d069f605c6fcbf6 +bd14b04fd1c81a05 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bce +3fe6a09e667f3bfc +3fe6a09e667f3ba1 +3fe6a09e667f3c29 +3fe6a09e667f3b74 +3cc1b746c796f33c +3d108dba363cb79a +bd0ee48b938690cc +3d2046dd1b1e5bcd +bd1f7245c9c34866 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bed +3fe6a09e667f3bc0 +3fe6a09e667f3c1b +3fe6a09e667f3b93 +3fe6a09e667f3c48 +3d072b242c52e23c +bcf1a9b7a75a3b87 +3d1b95921629711e +bd146a6de9d68ee2 +3d25cac90b14b88f +3d01a7383c5c857a +bcfcb18f8746f50c +3d18d39c1e2e42bd +bd172c63e1d1bd43 +3d2469ce0f17215f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3be4 +bfe6a09e667f3c3e +bfe6a09e667f3b8a +bfe6a09e667f3c99 +bfe6a09e667f3b2f +3d008e433ae0cc54 +3d242390ceb83315 +bd17b8de628f99d6 +3d3211c8675c198a +bd2bdc6f3147cceb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bd8 +bfe6a09e667f3b7d +bfe6a09e667f3c32 +bfe6a09e667f3b22 +bfe6a09e667f3c8d +3ceee15577ae1472 +bd1c23d5510a3d72 +3d21ee15577ae147 +bd2e11eaa8851eb9 +3d30f70aabbd70a4 +bcf3dba1aa51add5 +3d06122f2ad72916 +bd14f6e86a946b75 +3d1b0917956b948b +bd227b74354a35bb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b9f +3fe6a09e667f3bfa +3fe6a09e667f3b45 +3fe6a09e667f3c54 +3fe6a09e667f3aea +bd0ffeedf6b7d68d +3d10008904a414ba +bd27ffbb7dadf5a3 +3d28004482520a5d +bd33ffddbed6fad2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc2 +3fe6a09e667f3b67 +3fe6a09e667f3c1c +3fe6a09e667f3b0d +3fe6a09e667f3c77 +bceee9e5c1ef600d +bd21ee9e5c1ef601 +3d1c22c347c213fe +bd30f74f2e0f7b00 +3d2e1161a3e109ff +3cd1a34b6fa942d3 +bd0dcb96920ad7a6 +3d111a34b6fa942d +bd1ee5cb49056bd3 +3d208d1a5b7d4a17 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bb5 +bfe6a09e667f3c10 +bfe6a09e667f3b5b +bfe6a09e667f3c6a +bfe6a09e667f3b00 +bd008c1f2850796d +3d17b9f06bd7c34a +bd242307ca141e5b +3d2bdcf835ebe1a5 +bd321183e50a0f2e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c06 +bfe6a09e667f3bac +bfe6a09e667f3c61 +bfe6a09e667f3b51 +bfe6a09e667f3cbb +3d14695be08e656e +bd072d483ee33523 +3d2a34adf04732b7 +bd25cb520fb8cd49 +3d351a56f823995c +3ce613f7e4fa18d6 +3d12c27efc9f431b +bd0a7b0206c179cb +3d21613f7e4fa18d +bd1d3d810360bce5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bcb +3fe6a09e667f3c25 +3fe6a09e667f3b71 +3fe6a09e667f3c80 +3fe6a09e667f3b16 +bcc195059e91c4d2 +3d1f7357d30b71d9 +bd204654167a4713 +3d2fb9abe985b8ed +bd30232a0b3d238a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bf0 +3fe6a09e667f3b96 +3fe6a09e667f3c4b +3fe6a09e667f3b3b +3fe6a09e667f3ca6 +3d095fe8f2b56dbd +bd13500b86a54921 +3d2657fa3cad5b6f +bd29a805c352a491 +3d332bfd1e56adb8 +3d02c19a9f8dcb3b +bcfa7ccac0e4698b +3d1960cd4fc6e59d +bd169f32b0391a63 +3d24b066a7e372cf +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3be1 +bfe6a09e667f3c3b +bfe6a09e667f3b86 +bfe6a09e667f3c96 +bfe6a09e667f3b2c +3cfcb2fce8fc81a5 +3d23965f9d1f9035 +bd18d340c5c0df97 +3d31cb2fce8fc81a +bd2c69a062e06fcb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bdb +bfe6a09e667f3b80 +bfe6a09e667f3c35 +bfe6a09e667f3b26 +bfe6a09e667f3c90 +3cf3da34489c213b +bd1b0972edd8f7b1 +3d227b4689138427 +bd2d84b976ec7bd9 +3d313da34489c214 +bcf6106670b43955 +3d04f7ccc7a5e355 +bd1584199c2d0e55 +3d1a7be663d2f1ab +bd22c20cce16872b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b9c +3fe6a09e667f3bf7 +3fe6a09e667f3b42 +3fe6a09e667f3c51 +3fe6a09e667f3ae7 +bd1119d95e8d3107 +3d0dcc4d42e59df2 +bd288cecaf469883 +3d27731350b9677d +bd34467657a34c42 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc5 +3fe6a09e667f3b6a +3fe6a09e667f3c1f +3fe6a09e667f3b10 +3fe6a09e667f3c7a +bce616d2a8653209 +bd21616d2a865321 +3d1d3d25aaf359bf +bd30b0b695432990 +3d2e9e92d579acdf +3cda765e893370d7 +bd0cb1342ed991e5 +3d11a765e893370d +bd1e589a176cc8f3 +3d20d3b2f4499b87 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bb2 +bfe6a09e667f3c0c +bfe6a09e667f3b58 +bfe6a09e667f3c67 +bfe6a09e667f3afd +bd02c0e3eeb304ee +3d169f8e08a67d89 +bd24b038fbacc13b +3d2b4fc704533ec5 +bd32581c7dd6609e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c0a +bfe6a09e667f3baf +bfe6a09e667f3c64 +bfe6a09e667f3b54 +bfe6a09e667f3cbe +3d1583be43bfab2f +bd04f8837880a9a2 +3d2ac1df21dfd597 +bd253e20de202a69 +3d3560ef90efeacc +3ce1aa6e583501d4 +3d12354dcb06a03b +bd0b956469f2bf8b +3d211aa6e583501d +bd1dcab234f95fc5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc8 +3fe6a09e667f3c22 +3fe6a09e667f3b6e +3fe6a09e667f3c7d +3fe6a09e667f3b13 +bcda70a9025d3e70 +3d1e58f56fda2c19 +bd20d3854812e9f3 +3d2f2c7ab7ed160d +bd3069c2a40974fa +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bf4 +3fe6a09e667f3b99 +3fe6a09e667f3c4e +3fe6a09e667f3b3f +3fe6a09e667f3ca9 +3d0b94adb917f93e +bd1235a923740361 +3d26e52b6e45fe50 +bd291ad491ba01b0 +3d337295b722ff28 +3d03dbfd02bf10fb +bcf84805fa81de0a +3d19edfe815f887e +bd1612017ea07782 +3d24f6ff40afc43f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bde +bfe6a09e667f3c38 +bfe6a09e667f3b83 +bfe6a09e667f3c93 +bfe6a09e667f3b29 +3cf849735c376aa4 +3d23092e6b86ed54 +bd19eda328f22557 +3d31849735c376aa +bd2cf6d1947912ac +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bde +bfe6a09e667f3b83 +bfe6a09e667f3c38 +bfe6a09e667f3b29 +bfe6a09e667f3c93 +3cf843bdd561383d +bd19ef108aa7b1f1 +3d230877baac2708 +bd2cf7884553d8f8 +3d31843bdd561384 +bcf8452b3716c4d6 +3d03dd6a64749d95 +bd16114acdc5b136 +3d19eeb5323a4eca +bd2308a566e2d89b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b99 +3fe6a09e667f3bf3 +3fe6a09e667f3b3f +3fe6a09e667f3c4e +3fe6a09e667f3ae4 +bd12343bc1be76c7 +3d0b97887c831272 +bd291a1de0df3b64 +3d26e5e21f20c49c +bd348d0ef06f9db2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bc8 +3fe6a09e667f3b6e +3fe6a09e667f3c22 +3fe6a09e667f3b13 +3fe6a09e667f3c7d +bcda877f1db6080c +bd20d43bf8edb040 +3d1e57880e249f7f +bd306a1dfc76d820 +3d2f2bc407124fc0 +3ce1a4b8d15ecf6d +bd0b96d1cba84c25 +3d1234971a2bd9ee +bd1dcb68e5d42612 +3d211a4b8d15ecf7 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3baf +bfe6a09e667f3c09 +bfe6a09e667f3b54 +bfe6a09e667f3c64 +bfe6a09e667f3afa +bd04f5a8b515906f +3d15852ba57537c9 +bd253d6a2d45641c +3d2ac295d2ba9be4 +bd329eb516a2b20e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c0c +bfe6a09e667f3bb2 +bfe6a09e667f3c67 +bfe6a09e667f3b58 +bfe6a09e667f3cc2 +3d169e20a6f0f0ef +bd02c3beb21e1e21 +3d2b4f1053787878 +bd24b0efac878788 +3d35a78829bc3c3c +3cda81c996dfd5a5 +3d11a81c996dfd5a +bd0cafc6cd24054b +3d20d40e4cb6fead +bd1e57e3669202a6 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc5 +3fe6a09e667f3c1f +3fe6a09e667f3b6a +3fe6a09e667f3c7a +3fe6a09e667f3b10 +bce60b679ab8cd3b +3d1d3e930ca8e659 +bd2160b679ab8cd4 +3d2e9f498654732c +bd30b05b3cd5c66a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bf7 +3fe6a09e667f3b9c +3fe6a09e667f3c51 +3fe6a09e667f3b42 +3fe6a09e667f3cac +3d0dc9727f7a84bf +bd111b46c042bda1 +3d27725c9fdea130 +bd288da360215ed0 +3d33b92e4fef5098 +3d04f65f65f056bb +bcf61341341f5289 +3d1a7b2fb2f82b5e +bd1584d04d07d4a2 +3d253d97d97c15af +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bda +bfe6a09e667f3c35 +bfe6a09e667f3b80 +bfe6a09e667f3c90 +bfe6a09e667f3b26 +3cf3dfe9cf7253a2 +3d227bfd39ee4a74 +bd1b08058c236b18 +3d313dfe9cf7253a +bd2d8402c611b58c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3be1 +bfe6a09e667f3b86 +bfe6a09e667f3c3b +bfe6a09e667f3b2c +bfe6a09e667f3c96 +3cfcad4762264f3e +bd18d4ae27766c30 +3d2395a8ec44c9e8 +bd2c6a5713bb3618 +3d31cad4762264f4 +bcfa79effd795057 +3d02c308014357d4 +bd169e7bff5e5416 +3d19618400a1abea +bd234f3dffaf2a0b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b96 +3fe6a09e667f3bf1 +3fe6a09e667f3b3b +3fe6a09e667f3c4b +3fe6a09e667f3ae1 +bd134e9e24efbc88 +3d0962c3b62086f1 +bd29a74f1277de44 +3d2658b0ed8821bc +bd34d3a7893bef22 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bcb +3fe6a09e667f3b70 +3fe6a09e667f3c26 +3fe6a09e667f3b16 +3fe6a09e667f3c80 +bcc1c2b1d543580a +bd20470ac7550d60 +3d1f71ea7155e540 +bd30238563aa86b0 +3d2fb8f538aaf2a0 +3ce60e425e23e66f +bd0a7c6f68770664 +3d12c1c84bc47cce +bd1d3e37b43b8332 +3d2160e425e23e67 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bac +bfe6a09e667f3c06 +bfe6a09e667f3b51 +bfe6a09e667f3c61 +bfe6a09e667f3af7 +bd072a6d7b781bef +3d146ac94243f208 +bd25ca9b5ede06fc +3d2a3564a121f904 +bd32e54daf6f037e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c10 +bfe6a09e667f3bb5 +bfe6a09e667f3c6a +bfe6a09e667f3b5b +bfe6a09e667f3cc4 +3d17b8830a2236b0 +bd008ef9ebbb92a0 +3d2bdc4185111b58 +bd2423be7aeee4a8 +3d35ee20c2888dac +3cd1aeb67d55a7a1 +3d111aeb67d55a7a +bd0dca2930554b0c +3d208d75b3eaad3d +bd1ee514982aa586 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bc2 +3fe6a09e667f3c1c +3fe6a09e667f3b67 +3fe6a09e667f3c77 +3fe6a09e667f3b0d +bceede7ab442fb3f +3d1c2430a977a098 +bd21ede7ab442fb4 +3d2e121854bbd04c +bd30f6f3d5a217da +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bfa +3fe6a09e667f3b9f +3fe6a09e667f3c54 +3fe6a09e667f3b45 +3fe6a09e667f3caf +3d0ffe3745dd1040 +bd1000e45d1177e0 +3d27ff8dd1774410 +bd2800722e88bbf0 +3d33ffc6e8bba208 +3d0610c1c9219c7c +bcf3de7c6dbcc708 +3d1b0860e490ce3e +bd14f79f1b6f31c2 +3d2584307248671f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd8 +bfe6a09e667f3c32 +bfe6a09e667f3b7d +bfe6a09e667f3c8d +bfe6a09e667f3b22 +3ceeecc0855a7940 +3d21eecc0855a794 +bd1c2267ef54b0d8 +3d30f766042ad3ca +bd2e1133f7aa586c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3be4 +bfe6a09e667f3b8a +bfe6a09e667f3c3e +bfe6a09e667f3b2f +bfe6a09e667f3c99 +3d008b687775b320 +bd17ba4bc4452670 +3d2422da1ddd6cc8 +bd2bdd25e2229338 +3d32116d0eeeb664 +bcfcaeb4c3dbdbd8 +3d01a8a59e121214 +bd172bad30f6f6f6 +3d18d452cf09090a +bd2395d6987b7b7b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b93 +3fe6a09e667f3bed +3fe6a09e667f3b38 +3fe6a09e667f3c48 +3fe6a09e667f3ade +bd14690088210248 +3d072dfeefbdfb70 +bd2a348044108124 +3d25cb7fbbef7edc +bd351a4022084092 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bce +3fe6a09e667f3b74 +3fe6a09e667f3c29 +3fe6a09e667f3b19 +3fe6a09e667f3c83 +3cc1899a90e56004 +bd1f73b32b78d500 +3d2046266a439580 +bd2fb9d995bc6a80 +3d3023133521cac0 +3cea77cbeae8fd71 +bd09620d0545c0a4 +3d134ef97d5d1fae +bd1cb10682a2e052 +3d21a77cbeae8fd7 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3ba9 +bfe6a09e667f3c03 +bfe6a09e667f3b4e +bfe6a09e667f3c5e +bfe6a09e667f3af4 +bd095f3241daa770 +3d135066df12ac48 +bd2657cc9076a9dc +3d29a8336f895624 +bd332be6483b54ee +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c13 +bfe6a09e667f3bb8 +bfe6a09e667f3c6d +bfe6a09e667f3b5e +bfe6a09e667f3cc8 +3d18d2e56d537c70 +bcfcb46a4ab20e3f +3d2c6972b6a9be38 +bd23968d495641c8 +3d3634b95b54df1c +3cc1b746c796f33c +3d108dba363cb79a +bd0ee48b938690cc +3d2046dd1b1e5bcd +bd1f7245c9c34866 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bbf +3fe6a09e667f3c19 +3fe6a09e667f3b64 +3fe6a09e667f3c74 +3fe6a09e667f3b0a +bcf3d8c6e6e694a1 +3d1b09ce46465ad8 +bd227b18dcdcd294 +3d2d84e723232d6c +bd313d8c6e6e694a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bfd +3fe6a09e667f3ba2 +3fe6a09e667f3c57 +3fe6a09e667f3b48 +3fe6a09e667f3cb2 +3d11197e061fcde0 +bd0dcd03f3c0643f +3d288cbf030fe6f0 +bd277340fcf01910 +3d34465f8187f378 +3d072b242c52e23c +bcf1a9b7a75a3b87 +3d1b95921629711e +bd146a6de9d68ee2 +3d25cac90b14b88f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3b7a +bfe6a09e667f3c2f +bfe6a09e667f3ac5 +bfe6a09e667f3ce4 +bfe6a09e667f3a10 +bd1d3cca5285f698 +3d21619ad6bd04b4 +bd374f3294a17da6 +3d38b0cd6b5e825a +bd43a7994a50bed3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c42 +bfe6a09e667f3b8c +bfe6a09e667f3cf6 +bfe6a09e667f3ad8 +bfe6a09e667f3dac +3d24b00b4f760fa8 +bd169fe96113e0b0 +3d3a5805a7bb07d4 +bd35a7fa5844f82c +3d452c02d3dd83ea +3d008e433ae0cc54 +3d242390ceb83315 +bd17b8de628f99d6 +3d3211c8675c198a +bd2bdc6f3147cceb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bea +3fe6a09e667f3c9f +3fe6a09e667f3b35 +3fe6a09e667f3d54 +3fe6a09e667f3a80 +3d04f93a295b6fef +3d329f27452b6dfe +bd2ac1b175a92404 +3d414f93a295b6ff +bd3d60d8bad49202 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bd1 +3fe6a09e667f3b1c +3fe6a09e667f3c86 +3fe6a09e667f3a67 +3fe6a09e667f3d3b +3cda6af37b870c09 +bd2f2ca86423c7a0 +3d3069abcdee1c30 +bd3f96543211e3d0 +3d4034d5e6f70e18 +3ceee15577ae1472 +bd1c23d5510a3d72 +3d21ee15577ae147 +bd2e11eaa8851eb9 +3d30f70aabbd70a4 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3ba6 +bfe6a09e667f3c5b +bfe6a09e667f3af1 +bfe6a09e667f3d10 +bfe6a09e667f3a3c +bd0b93f7083d32f1 +3d291b023df0b344 +bd33727ee107a65e +3d3c8d811ef859a2 +bd41b93f7083d32f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c16 +bfe6a09e667f3b61 +bfe6a09e667f3ccb +bfe6a09e667f3aac +bfe6a09e667f3d80 +3d19ed47d084c231 +bd23095c17bd9ee8 +3d367b51f421308c +bd3984ae0bdecf74 +3d433da8fa109846 +bd0ffeedf6b7d68d +3d10008904a414ba +bd27ffbb7dadf5a3 +3d28004482520a5d +bd33ffddbed6fad2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b61 +3fe6a09e667f3c16 +3fe6a09e667f3aac +3fe6a09e667f3ccb +3fe6a09e667f39f7 +bd23084a0e757574 +3d19ef6be3151517 +bd398425073ababa +3d367bdaf8c54546 +bd44c212839d5d5d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3ba6 +3fe6a09e667f3af1 +3fe6a09e667f3c5b +3fe6a09e667f3a3c +3fe6a09e667f3d10 +bd0b983f2d5dd8be +bd337307e5abbb18 +3d2919f034a889d0 +bd41b983f2d5dd8c +3d3c8cf81a5444e8 +bceee9e5c1ef600d +bd21ee9e5c1ef601 +3d1c22c347c213fe +bd30f74f2e0f7b00 +3d2e1161a3e109ff +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bd2 +bfe6a09e667f3c86 +bfe6a09e667f3b1c +bfe6a09e667f3d3b +bfe6a09e667f3a67 +3cda8d34a48c3a73 +3d306a34d29230ea +bd2f2b965adb9e2c +3d40351a69491875 +bd3f95cb2d6dcf16 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bea +bfe6a09e667f3b35 +bfe6a09e667f3c9f +bfe6a09e667f3a80 +bfe6a09e667f3d54 +3d04f4f2043aca22 +bd2ac2c37ef14d78 +3d329e9e40875944 +bd3d6161bf78a6bc +3d414f4f2043aca2 +bd008c1f2850796d +3d17b9f06bd7c34a +bd242307ca141e5b +3d2bdcf835ebe1a5 +bd321183e50a0f2e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b8d +3fe6a09e667f3c42 +3fe6a09e667f3ad8 +3fe6a09e667f3cf6 +3fe6a09e667f3a22 +bd169dc54e838dc9 +3d24b11d58be391c +bd35a77153a0e372 +3d3a588eac5f1c8e +bd42d3b8a9d071b9 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3c2f +3fe6a09e667f3b7a +3fe6a09e667f3ce4 +3fe6a09e667f3ac5 +3fe6a09e667f3d99 +3d216088cd74db40 +bd1d3eee6516497f +3d38b04466ba6da0 +bd374fbb99459260 +3d445822335d36d0 +3d14695be08e656e +bd072d483ee33523 +3d2a34adf04732b7 +bd25cb520fb8cd49 +3d351a56f823995c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bfd +bfe6a09e667f3cb2 +bfe6a09e667f3b48 +bfe6a09e667f3d67 +bfe6a09e667f3a93 +3d111ba218b020c7 +3d3446e8862c0832 +bd27722ef3a7ef9d +3d42237443160419 +bd3bb91779d3f7ce +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bbe +bfe6a09e667f3b0a +bfe6a09e667f3c74 +bfe6a09e667f3a54 +bfe6a09e667f3d29 +bcf3e1573127e03c +bd313e1573127e04 +3d2d83d519db03f9 +bd409f0ab9893f02 +3d3ec1ea8ced81fc +bcc195059e91c4d2 +3d1f7357d30b71d9 +bd204654167a4713 +3d2fb9abe985b8ed +bd30232a0b3d238a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bb9 +3fe6a09e667f3c6d +3fe6a09e667f3b03 +3fe6a09e667f3d22 +3fe6a09e667f3a4e +bcfcabda0070c2a5 +3d2c6a84bff1e7ab +bd31cabda0070c2a +3d3e35425ff8f3d6 +bd40e55ed0038615 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3c03 +3fe6a09e667f3b4e +3fe6a09e667f3cb8 +3fe6a09e667f3a99 +3fe6a09e667f3d6d +3d134e42cc825961 +bd2658de99bed34f +3d34d390b3209658 +bd3b2c6f4cdf69a8 +3d4269c859904b2c +3d095fe8f2b56dbd +bd13500b86a54921 +3d2657fa3cad5b6f +bd29a805c352a491 +3d332bfd1e56adb8 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3b74 +bfe6a09e667f3c29 +bfe6a09e667f3abf +bfe6a09e667f3cdd +bfe6a09e667f3a0a +bd1f718f18e88219 +3d204738738bbef3 +bd37dc63c63a2086 +3d38239c39c5df7a +bd43ee31e31d1043 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c48 +bfe6a09e667f3b93 +bfe6a09e667f3cfd +bfe6a09e667f3ade +bfe6a09e667f3db2 +3d25ca6db2a75569 +bd146b249ab1552f +3d3ae536d953aab4 +bd351ac926ac554c +3d45729b6ca9d55a +3cfcb2fce8fc81a5 +3d23965f9d1f9035 +bd18d340c5c0df97 +3d31cb2fce8fc81a +bd2c69a062e06fcb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3be4 +3fe6a09e667f3c99 +3fe6a09e667f3b2f +3fe6a09e667f3d4e +3fe6a09e667f3a7a +3d008fb09c9658ed +3d3211f61392cb1e +bd2bdc13d8da69c5 +3d4108fb09c9658f +bd3dee09ec6d34e2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bd8 +3fe6a09e667f3b22 +3fe6a09e667f3c8d +3fe6a09e667f3a6d +3fe6a09e667f3d42 +3ceedb9ff0d7e20b +bd2e124600f281df +3d30f6dcff86bf10 +bd3f0923007940f0 +3d407b6e7fc35f88 +3cf3da34489c213b +bd1b0972edd8f7b1 +3d227b4689138427 +bd2d84b976ec7bd9 +3d313da34489c214 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3b9f +bfe6a09e667f3c54 +bfe6a09e667f3aea +bfe6a09e667f3d09 +bfe6a09e667f3a35 +bd0ffd80950249f3 +3d28009fdabf6d83 +bd33ffb012a0493e +3d3c004fed5fb6c2 +bd41ffd80950249f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c1c +bfe6a09e667f3b67 +bfe6a09e667f3cd1 +bfe6a09e667f3ab2 +bfe6a09e667f3d86 +3d1c220c96e74db2 +bd21eef9b48c5927 +3d37088325b9d36c +bd38f77cda462c94 +3d43844192dce9b6 +bd1119d95e8d3107 +3d0dcc4d42e59df2 +bd288cecaf469883 +3d27731350b9677d +bd34467657a34c42 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b5b +3fe6a09e667f3c10 +3fe6a09e667f3aa6 +3fe6a09e667f3cc4 +3fe6a09e667f39f1 +bd2422ac71a6bb35 +3d17baa71cb28996 +bd3a115638d35d9a +3d35eea9c72ca266 +bd4508ab1c69aecd +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bac +3fe6a09e667f3af7 +3fe6a09e667f3c61 +3fe6a09e667f3a42 +3fe6a09e667f3d16 +bd072eb5a098c1bd +bd32e5d6b4131838 +3d2a345297d9cf91 +bd4172eb5a098c1c +3d3d1a294bece7c8 +bce616d2a8653209 +bd21616d2a865321 +3d1d3d25aaf359bf +bd30b0b695432990 +3d2e9e92d579acdf +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bcb +bfe6a09e667f3c80 +bfe6a09e667f3b16 +bfe6a09e667f3d35 +bfe6a09e667f3a61 +bcc17e2f8338fb35 +3d2fba0741f31c13 +bd3022fc5f0671f6 +3d3fdd03a0f98e0a +bd40117e2f8338fb +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bf0 +bfe6a09e667f3b3b +bfe6a09e667f3ca6 +bfe6a09e667f3a86 +bfe6a09e667f3d5b +3d095e7b90ffe123 +bd29a8611bc007b7 +3d332bcf721ffc24 +bd3cd4308de003dc +3d4195e7b90ffe12 +bd02c0e3eeb304ee +3d169f8e08a67d89 +bd24b038fbacc13b +3d2b4fc704533ec5 +bd32581c7dd6609e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b86 +3fe6a09e667f3c3b +3fe6a09e667f3ad1 +3fe6a09e667f3cf0 +3fe6a09e667f3a1c +bd18d28a14e6194a +3d2396baf58cf35b +bd3634a285398652 +3d39cb5d7ac679ae +bd431a51429cc329 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3c35 +3fe6a09e667f3b80 +3fe6a09e667f3cea +3fe6a09e667f3acb +3fe6a09e667f3d9f +3d227aeb30a62101 +bd1b0a299eb3bdfe +3d393d7598531080 +bd36c28a67acef80 +3d449ebacc298840 +3d1583be43bfab2f +bd04f8837880a9a2 +3d2ac1df21dfd597 +bd253e20de202a69 +3d3560ef90efeacc +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bf7 +bfe6a09e667f3cac +bfe6a09e667f3b42 +bfe6a09e667f3d61 +bfe6a09e667f3a8d +3d0dcdbaa49b2a8c +3d33b9b754936552 +bd288c9156d9355d +3d41dcdbaa49b2a9 +bd3c4648ab6c9aae +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bc5 +bfe6a09e667f3b10 +bfe6a09e667f3c7a +bfe6a09e667f3a5b +bfe6a09e667f3d2f +bce61c882f3b6470 +bd30b0e44179db24 +3d2e9e377d0c49b9 +bd40587220bced92 +3d3f4f1bbe8624dc +bcda70a9025d3e70 +3d1e58f56fda2c19 +bd20d3854812e9f3 +3d2f2c7ab7ed160d +bd3069c2a40974fa +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bb2 +3fe6a09e667f3c67 +3fe6a09e667f3afd +3fe6a09e667f3d1c +3fe6a09e667f3a48 +bd02bf768cfd7854 +3d2b50225cc0a1eb +bd3257eed19faf0a +3d3da8112e6050f6 +bd412bf768cfd785 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3c0a +3fe6a09e667f3b54 +3fe6a09e667f3cbe +3fe6a09e667f3a9f +3fe6a09e667f3d73 +3d15830792e4e4e2 +bd253e7c368d8d8f +3d3560c1e4b93939 +bd3a9f3e1b46c6c7 +3d42b060f25c9c9c +3d0b94adb917f93e +bd1235a923740361 +3d26e52b6e45fe50 +bd291ad491ba01b0 +3d337295b722ff28 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3b6d +bfe6a09e667f3c22 +bfe6a09e667f3ab8 +bfe6a09e667f3cd7 +bfe6a09e667f3a03 +bd20d329efa586cd +3d1e59ac20b4f266 +bd386994f7d2c367 +3d37966b082d3c99 +bd4434ca7be961b3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c4e +bfe6a09e667f3b99 +bfe6a09e667f3d03 +bfe6a09e667f3ae4 +bfe6a09e667f3db8 +3d26e4d015d89b29 +bd12365fd44ec9ae +3d3b72680aec4d95 +bd348d97f513b26b +3d45b934057626ca +3cf849735c376aa4 +3d23092e6b86ed54 +bd19eda328f22557 +3d31849735c376aa +bd2cf6d1947912ac +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bde +3fe6a09e667f3c93 +3fe6a09e667f3b29 +3fe6a09e667f3d48 +3fe6a09e667f3a74 +3cf84c4e1fa283d7 +3d3184c4e1fa283d +bd2cf6763c0baf85 +3d40c26270fd141f +bd3e7b3b1e05d7c3 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bde +3fe6a09e667f3b29 +3fe6a09e667f3c93 +3fe6a09e667f3a74 +3fe6a09e667f3d48 +3cf840e311f61f09 +bd2cf7e39dc13c1f +3d31840e311f61f1 +bd3e7bf1cee09e0f +3d40c207188fb0f8 +3cf843bdd561383d +bd19ef108aa7b1f1 +3d230877baac2708 +bd2cf7884553d8f8 +3d31843bdd561384 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3b99 +bfe6a09e667f3c4e +bfe6a09e667f3ae4 +bfe6a09e667f3d03 +bfe6a09e667f3a2f +bd12338510e3b07a +3d26e63d778e27c3 +bd348ce14438ec1f +3d3b731ebbc713e1 +bd424670a21c760f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3c22 +bfe6a09e667f3b6e +bfe6a09e667f3cd7 +bfe6a09e667f3ab8 +bfe6a09e667f3d8c +3d1e56d15d49d932 +bd20d497515b1367 +3d3795b45752764d +bd386a4ba8ad89b3 +3d43cada2ba93b26 +bd12343bc1be76c7 +3d0b97887c831272 +bd291a1de0df3b64 +3d26e5e21f20c49c +bd348d0ef06f9db2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b54 +3fe6a09e667f3c09 +3fe6a09e667f3a9f +3fe6a09e667f3cbe +3fe6a09e667f39ea +bd253d0ed4d800f5 +3d1585e2564ffe16 +bd3a9e876a6c007b +3d3561789593ff85 +bd454f43b536003d +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3bb2 +3fe6a09e667f3afd +3fe6a09e667f3c67 +3fe6a09e667f3a48 +3fe6a09e667f3d1c +bd02c52c13d3aabb +bd3258a5827a7557 +3d2b4eb4fb0b1551 +bd412c52c13d3aac +3d3da75a7d858aa9 +bcda877f1db6080c +bd20d43bf8edb040 +3d1e57880e249f7f +bd306a1dfc76d820 +3d2f2bc407124fc0 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bc5 +bfe6a09e667f3c7a +bfe6a09e667f3b10 +bfe6a09e667f3d2f +bfe6a09e667f3a5b +bce605b213e29ad4 +3d2e9fa4dec1d653 +bd30b02d909f14d7 +3d3f4fd26f60eb29 +bd405816c84f8a6b +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bf7 +bfe6a09e667f3b42 +bfe6a09e667f3cac +bfe6a09e667f3a8d +bfe6a09e667f3d61 +3d0dc8051dc4f825 +bd288dfeb88ec1f7 +3d33b900a3b89f05 +bd3c46ff5c4760fb +3d41dc8051dc4f82 +bd04f5a8b515906f +3d15852ba57537c9 +bd253d6a2d45641c +3d2ac295d2ba9be4 +bd329eb516a2b20e +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3b80 +3fe6a09e667f3c35 +3fe6a09e667f3acb +3fe6a09e667f3cea +3fe6a09e667f3a16 +bd1b074edb48a4cb +3d227c58925bad9b +bd36c1d3b6d22933 +3d393e2c492dd6cd +bd4360e9db691499 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe6a09e667f3c3b +3fe6a09e667f3b86 +3fe6a09e667f3cf0 +3fe6a09e667f3ad1 +3fe6a09e667f3da5 +3d23954d93d766c1 +bd18d564d851327d +3d39caa6c9ebb361 +bd36355936144c9f +3d44e55364f5d9b0 +3d169e20a6f0f0ef +bd02c3beb21e1e21 +3d2b4f1053787878 +bd24b0efac878788 +3d35a78829bc3c3c +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfe6a09e667f3bf0 +bfe6a09e667f3ca5 +bfe6a09e667f3b3b +bfe6a09e667f3d5a +bfe6a09e667f3a86 +3d09643117d6138b +3d332c8622fac271 +bd29a6f3ba0a7b1d +3d419643117d6139 +bd3cd379dd053d8f +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfe6a09e667f3bcb +bfe6a09e667f3b16 +bfe6a09e667f3c80 +bfe6a09e667f3a61 +bfe6a09e667f3d35 +bcc1d987f09c21a6 +bd3023b30fe13843 +3d2fb899e03d8f79 +bd4011d987f09c22 +3d3fdc4cf01ec7bd +bce60b679ab8cd3b +3d1d3e930ca8e659 +bd2160b679ab8cd4 +3d2e9f498654732c +bd30b05b3cd5c66a +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fe6a09e667f3bac +3fe6a09e667f3c61 +3fe6a09e667f3af7 +3fe6a09e667f3d16 +3fe6a09e667f3a42 +bd07290019c28f56 +3d2a35bff98f5c2b +bd32e520033851eb +3d3d1adffcc7ae15 +bd417290019c28f5 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bc214ae72e6ba22f +bff0000000000000 +3ff0000000000000 +3fefb240562f5a4d +3fe130895ffe10c4 +3fd9d2fbb7a6a7e5 +bfe91189546038dc +3fb9ce8cbb1ee3dd +3fe92249a8edd7fb +bfe524ba0ac80229 +bfe67ef6111c656c +3f91c8507a0cfecc +bfe30e9a648dfaa1 +bfba5543bad03c4c +3fef78d4637310ef +3fdb7be4547d3202 +bfefb70a6993440e +3fed6eac5a01fd87 +3fea7cdaf541edad +bfd37d397b069eaf +3fc9837eb9e6468f +3fedc6174990a7c7 +3fe553dc81e41e80 +bfef80b157dcd3a2 +bfef98d72a762d97 +bfe90e4f54c2dd58 +bfe63af329ebfcde +3fda323240c108c8 +bfde3de456b69116 +3feeb9cadb3f1e2c +3fece8bf09664e05 +3fcd5f725b54a1dc +3fe09748bbd06abb +3fea94979ab5a737 +3fe0e0cdcf2026a1 +3fa81a44df23ec21 +bfdca39539132e0a +bfd54e636ee5193f +bfefd69b5df7cc82 +bfe81ab2bed245dc +bfd8d0605da54076 +bfdf04bc376b1bb9 +3feecbf15270cfbf +3fe5eb148966c3a2 +bfe28993178a5a68 +3fe63742e2803e8b +bfef6cb1be0cc601 +3fefa2235fd8cbd9 +3fb47e774697f74b +bfec571fd2123669 +3fefde569d72f73d +bfeed7eb64599407 +bfe89f493f87c378 +3fcce0b8562a52f9 +bfe88701bd18963b +3feeffdf4d5220f7 +bfefe9c0dab32312 +3fcc72a3261e86b1 +bfec32990f514859 +3fdbac6d554f01c5 +bfe96eb188f36b58 +bfd2e35cea2827ed +bfcc441bb8bcba83 +bfa735bb93867365 +bfe73616803f0c8a +3fb7276c8591cded +3fdc030ed7c960cf +bfe6acd473d58a42 +bfd0a33ad0d5db22 +bfee2e9ff765ee7e +bfe561664a158cf8 +bfed7584baa4678c +bfde7d1080974dd9 +3fe5e47f69ab0128 +bfe1fcb22a55b35b +3fe4b884f9e3b5ab +3fd8a548434f0d4d +bfeffffeea993e0a +bfc2316a6003f06e +bfef773fedfe93bd +bfc585d18545f0dd +bfeaaf9d4f0c9b98 +bfd8bba02dd57e5e +bfe3562faad6941b +3fe6bffdf3c845b5 +bfd5a479da66c2ef +bfe02032c753d093 +3fe0d0fed3753142 +3fcefe8a8c7d8391 +3feff7acf5d404c6 +bfedcbd87d5c029d +bfde4b6a8ae401fd +bfea8d26aae5cadb +3fe27964ebec749e +3fea326b96d0c0a4 +bfbd77eea19f55d3 +bfe2cf170d827c75 +bfdd2f0d62488810 +bfe8f7b9df74aa12 +3fc602873de6edbb +bfe2f115a568b653 +bfe6c038fd2d2f0e +3fe6947e2fae2e38 +bfbbddacb8776e33 +3fefffd7e0bd4bfa +3fee466533ce5496 +3fefff3c2e67bce3 +bfe463efe97a290f +bfeff54952843c33 +bfef80878017998e +3fe0ad20960b5887 +3fef45b925485f72 +3fe3b4cc498d9cec +3fd47c9c4ae8f86d +bf965d87bf35209b +bfd812c999e8fb54 +3fefbca8a5c61c09 +3fc62cda0c20cdb8 +bfdcf838c3a015cb +bfc720c9887e5b08 +bfeffff20f37a0a1 +bfebb2a39da27500 +3fc0ee5ba001e535 +3fee7b12350c930d +bfe6f3715232f331 +3fe0ace2dedc9737 +bfece43a05c636c6 +3fedc6bc33728474 +bfea7ca75dff5501 +3fef2b830ebb5b96 +bfef1fdbfb526564 +3fe2ab5e895a62a8 +3faf69af155410e6 +3fd3c60f7af518ed +3fea35b29aff288c +bfde125b29ea6f26 +3fe4eda1b5f59da3 +3f7c95dacf72dc33 +bfef9fdf4b815a13 +3febfc95786c634f +bfd655e679a81f39 +3fe89235b102125f +bfebe584145c60eb +bfeeaa08ca297fd2 +bfe638bf02584538 +bfefc355c3162fcc +bfe61ca0ef6e057e +3fb6beb36ed55d7d +bfe6f6a2ec8508a0 +bfef1e8b7acf1410 +bfe85dccc0810098 +bfe6c8d56e0d947d +bfefd05ba5e9f6e2 +bfc66fe5f415e0d1 +bfc494b162bbf1e4 +bfe3f05344c6e860 +bfd21438106c5db3 +3fea10da271edeb7 +3fef3e70adbc0a9b +3fcbeb1c1d85f027 +3feb71ab6fea4983 +3fd5b1fb0f1c1f90 +3fee2be2a9a57005 +3f91b95ab809099d +3fec662d7d1e1972 +bfdc794eaf4ca37a +bfef643a44337679 +3fd5d03c74139143 +3fe74bce4966c66c +bfd2883c927c202a +bfceb33858a22043 +3fe8d754701f898c +bfd92946253f2fb0 +bfef337007d52850 +bfea04b8478d1a07 +bfeef72b5eab13e3 +bfd7d245368826e5 +3fd5e89ce6854af2 +bfefd5c1760e6688 +bfe5affc617861e6 +bfc4bc7631b7253a +3fa6b93274186988 +bfac78c0f8094d08 +3fe8bb72e4dc8df6 +bfecd716a97b6f10 +bfee7debf03f3f74 +3fec084b9208a321 +3fdf4119238b5941 +bfe55543daf5213d +3fd2855f9b453e17 +3fcb5e31a5472698 +3fe005391fe59c18 +3fe94cc37ea86bad +3fe13729f7e68aa6 +bfd85aab9ebce826 +3fa2c6922ec9f653 +3feec7a62bc5353f +3fdf878e5c06db8a +bfea8a4d05ce5e66 +bfe1ddcd843033e6 +bfed75658a4fccfe +3fefafddeb8716a5 +3fbbd77f3d2aae98 +3fef4ed04f77665d +3fd674b8e18f29ea +3fefdae3ed58a3e4 +bfea671d08ee518f +3fedc13cd781a614 +3fe877dae153ba82 +3fe527f1ce789ea5 +3fefff3eda2dd0ed +3fec9e1406f5a1aa +3fe4c6f691f8dc76 +bfef70c3653b5230 +3fd4fcf53cd1f3dd +3fed76e9157f5214 +3feffffdfada72a5 +bfe17c06d8bcb502 +bfefb1282fd7828a +bfc9ca0f3b18712e +3fe98d5558b7ad49 +3fd187c10a4b59d7 +bfec1fc0f25c7041 +bfdf0cee2781494f +bfef75e5a5199b6e +3fef7962f337ddbe +bfe5601d145db278 +bfefd66d89c73bf8 +bfe271a42150153d +bfe138075c8a0497 +bfe5d989863295f6 +3fe74ddc5038f592 +3fc5fc83ae888133 +3fefe7c500245090 +3fed4cc47158f021 +bfea0ba19c42eb22 +bfeb8042358c4e5c +3fed6ae8369ca5eb +bfdb02093a3ce28e +3fe7fc8426fbef72 +bfefdcb687e44842 +3feff915ba380c3f +3fdcddeadfef3b05 +bfe6c66534e22156 +bfca73fea4679c9d +bfefb6a6a7890fe9 +3fee05e325e79a81 +bfde9fc017904bc1 +3fe1096212425814 +3fe080ec1e371a87 +3fba05bba54396c2 +3fe00a4238b783ea +bfef6aba176481cc +3fe43885b06ce066 +bfd07d7a35fc885c +bfde137664742745 +3fef39d369e4705d +3fdc8d473f5ee096 +3fec27cd1842e2d5 +bfe55c5151eb3c59 +3fd66494ad6318c2 +3fe116bef87e3f1f +3feb3165949f386c +3fef7e93e69eb0c2 +bfed0eeba83ad8a0 +bfefb7a95eb53006 +bfe672c4ecf06353 +bfbd5bd43dfa70c7 +3fecd1ef52d4c9aa +bfeed70a4976c476 +3fefa47c1fc2aa69 +bfefa772481ec689 +3fef68f4a575071e +3fe7be034a4bdc88 +bf704f08aca8ef60 +3fefd640b66d2213 +bfeff40aa352f907 +bfe709573d118205 +bfe0f3b7835a7afd +3fefda80dd06c2de +bfed0c0ba19b3208 +bfef63634f240a2f +3fef72f14e5c752a +3fe097a4691764b9 +bfee3687dcf9ba62 +bfe23f4ebae6111a +bfedf45be7db1f18 +3fefa2a10eaeb57a +bfb09a7768eac866 +bfefffef2d15dcea +3f9cdff265c94360 +bfe9e057731959fe +bfdbbc4eeea66175 +3fe3abd55f0e09d6 +bfe3d7ca0de4580f +bfb340d617dde5c7 +3fdcb47e41e12660 +bfeffff1b949c7b5 +3fe9555e106c2853 +bfefffbf16d43e94 +3fe88e8d9ff75bba +3f92054d5656ae5e +bfd79a04de6b38d6 +3fe51ede3a045c06 +bfc0b9aec1f1b4e2 +3fe4a3316ed61f39 +bfda84a05be729d3 +bfea4226757defc2 +bfedeedeeaf72ae7 +bfe9e848c4639177 +bfef95ff46f6ab7b +bfe29684f064b47a +3fdb11a1151c0686 +3fe0acb6af232799 +3fefc88d8f642885 +3fc90ecf8fa85b46 +bfd7139ba4c033fb +bfd3bb1c99ff2967 +3fcfbe2d7a5e80c1 +bfd776a42b2c62f2 +3feb574a881b177b +3fdb422b29479452 +3fe412a5bd9c99e8 +3fa4ac6302cec04c +3fe85bffcba312c4 +bfa9ee2b39203f8c +3fef5fce6f7d3d85 +bfee24ce0939563a +bfd019fc45cfc4f9 +3fd1abc5d00e9615 +bfee6f1d35836065 +3fa26b84b1f00ad2 +bfeffeadfc3f7d7f +bfef35735a89c4a9 +bfe14700781148e4 +bfed90a35155eff0 +bfd4ea966c160046 +bfeffd3aa66facc6 +3fd30afa7509ceaf +3fdf33a7e50454fd +3fe31631c0565bc1 +3f86aae3ec6c06fd +bfe2cc8369c89f5f +bfde4e1f2c4e6b6a +3fd8fb127f473d51 +3fdc9c2c906884a5 +bfe791c950b17fd5 +bfdf9b66369fd146 +3fe6ad6d7697ecab +bfe7daacb377aefb +3fe196294fbd9390 +3fe0a2c8f3e8af09 +bfdea421947adaf5 +bfd9b2a7946b326a +bfd8286960b74b43 +3fea7acd1a50e781 +3fe73a1544bab83a +bfe4c9b5fcd81a90 +3fef6ab81ad5948f +3fe9fe6dace05070 +bfe4c86d7efb572b +3fed28f2e18b613d +3feaebc4656a9c7f +bfe7bfb5c42b53eb +3fba1d5aababc273 +bfe5ead850f1c213 +3fd008b58c24ad05 +bf1683507c2c597b +3f73b030a9878458 +3fe3c367e0510742 +bfeafb327b23b998 +bfeeb9ccd7a81ce0 +3fe7085e55dd5c18 +bfedf941319b1b0e +bfefd3da68fc3433 +3feeb2833f068eb5 +bfcaa567ac82b336 +3fd4441ce184d6af +bfefada4b200ec2f +bfedd0058e0ab168 +3fcdcab812fd12ca +bfee482585381234 +3fdc1ba695562c27 +3feffcecf960d6aa +3fed8da4540e487c +bfedb862fad5f88e +bfebc5a84bfa94d2 +3fed1de574599ae0 +bfedb37a9e8edf03 +3fd237071db7e297 +bfdd28744c151508 +3fef5d2aa23f63a8 +bfe39168459c6b63 +3fc604c52bb1ba40 +3fef814238764438 +3fefefd93b84106e +3fde68874b513d8f +bfef77349aa666a1 +3f635636eb442ad3 +bfe5f3cdf18e5410 +3fedb346cb7df951 +bfe20673e75adffb +3fed8bff788a3ab2 +3feed7aa6b5ff4ab +3fdf951fd4136042 +bfde5db0c1363906 +bfeb6b43d248c468 +bfd9748e74bdf2d6 +3fe58ce2ccaf602e +bfefe932a76c380c +bfe4d06b83f58e90 +bfbf8768fb24e938 +bfe422fcd5ae29a1 +3fe87c98f533830b +bfef8513b16d756d +bfe0c3bdaf3b49c5 +bfe0df69d9e4c016 +bfee5e3c0acc6300 +3fd6fa565d808de9 +3fdc95469601576b +3fa759a31c923b01 +3fef765771a25fe7 +3fedb9097f230cea +bfeffb30642003b6 +3fec976384eeac49 +3fe31e6d724bc842 +bfc0db918b2c22ed +3fe87a33181064b7 +3fefc973ee8ef50c +3fe7fbca92e207d8 +bfec52ee381b73d2 +bfed80dddd409b84 +3fe931120507ca9e +bfee325894325ac7 +bfef640ebf9510f7 +3fe46e80d6f435fe +3fe0e5ab044c4fe3 +3fe56fabbcc13a65 +3fd18bfb5a5e3ebc +3fefe250ea550bec +3fe56ed8c92f3cf3 +bfef9e514097918e +3fe111fba639b3dc +bfd3adb00b9c3b80 +bfe83c01dd1cd52d +bfe6e299256feaaa +bfefb6f1f4585ecc +bfe5d8661ffa5ba7 +3fe2947d7129eef8 +bfef97aae549b7fa +bfdc7b91e638205b +3feea4c727b7d86a +bfebf0ae3881aec7 +3fb4544482d9bb53 +3fee0fdf403453ff +3f98b54065a8f6cd +3fe817371679798e +3fe4294f495edde9 +3fe8d778f8b0ffe4 +3febecab3757e344 +bfeea753832892a3 +bfeb13e664594c1e +3fefd39c9e3aca49 +3fef297c7a445c3e +bfbf77e74aa69aa2 +bfe1c6e603341095 +bfd6d08cab47e726 +bfe3c9b4040a62f7 +3fe7036f1715587d +3fe8a371dbaacdbe +bfeea8a95dda9411 +3fe4ab697d2c6964 +3fe374faefb4f5fe +3f9bf9156e0233a1 +3faf5a3a700d2ec4 +bfefba6a7950a293 +3fefe08c596f37ce +bfeffc5b0e5960d1 +bfeb9a07d12f478f +bfe8d19e713d0ed6 +3fe8d195ae091df3 +3feff99ef5674962 +3fee6d828b0d3b47 +bfe54a09c83e9685 +bfefce705e3674b2 +3fef2fbd9fde43df +bfeeac60bdd97df2 +3fe3ec08b652be68 +3fe97fe788f306a2 +bfed0f6cec349417 +3fd4e97d38ba6a32 +bfe9b6a0effd9f2d +3fefb6739e50e560 +bfeaff2547a238a8 +3fee8864432f5c3a +3fe677e32fb0ee20 +3f9d64fd702ec773 +3fdc7c0ac4ab7375 +3fe8fb6bd989a934 +bfeff46ab7373ef7 +bfe0f8192dc1039c +3fcec0defc2082f5 +3feb82d59f27af7a +bfdf5fa1c93f62b3 +bfc5727d210dce6f +3fa44913b18b8010 +bfecb738dff5b3f4 +bfea4e624945da9f +3fe5528bf1198cc3 +bfe6aa7df3347284 +bfe85f2024c574aa +bfe0968c6d4d564b +bfe42c093caa06a6 +bfed470392ede6ae +3fee6ed324bf3c76 +3fed9e7dc44f1c21 +3fc69b9dddd3219f +3fee78dc3b494f64 +bfe6ee96dcd62fbb +bfc0c176b2f1fad0 +bfe979fd4269274f +bfe69099f565be9c +bfee78847b9b6288 +bfeffe11aaade049 +bfefe876fc8b9f0c +3fefc95e84857b49 +3fe3420fd7efdcf7 +bfec2b2927a32757 +bfe95eedddf03200 +3fcd9aa1fafacf5d +3fd467e1d184464b +bfdb30b83efae9c5 +bfe4cc52f4e2020b +3fec6f4cdf488a61 +3fe539cfdeef1080 +bfefbf3f5de685e3 +bfe5253ddd237440 +bfda24385c02a75d +3fed83efcfb69635 +bfe4d5642b2b8660 +3fee2b296c8ff37e +3fea0d642d79d38e +bfd8724dedf9ee74 +bfe8339749c9b0a4 +3fe11c7175a14d84 +3fe917638ca17b9e +3fbe74f89664fa18 +bfcb30b00b813660 +3fef56fa9af87947 +bfe3a13cf2f922b3 +bfe44774e1feabc4 +3fdd42789ce5ccb4 +3fda6557237caefd +3fefdce6df5ea546 +bfda9a3b779af184 +bfc6280f2631d8c8 +3fca076fa4b3a2de +3fc114e704d517b3 +3feffe8400be7a51 +bfdde23adb298ca0 +bfef2a9a13187933 +bfcaefba021d105b +3fe881d1a82d796c +bfe67e51d3e16486 +3fc0789394bc92ee +3fabd6ea5ce2c602 +3fe9ea24a37a726b +3feeffef531a3da6 +bfeffee2531ae909 +bfdec962ea6f0421 +3fe95818f421f470 +bfe71676e88d9f21 +3fc4262509c0c98c +3fe9eb0eebc8d2b8 +3fead5b4ff6f80a8 +3fedf0b98467485a +3f92225d5409e4ad +bfce1a19ea64d321 +3fe2cab82a85e78b +3fd4ab38595e2329 +bfe9b9104abe0003 +bfec419fc5b4aa01 +bfc065090a22606f +3fe735f504acdaf0 +bfe70b256e22baa6 +3fea9d4e854cf82f +bfe7aacf58a2ab05 +bfe300be51cd6789 +bfdd5a2188600dec +3fe98357d2d5eaee +bfbe96b341bb82da +3fef2ebc904ecb67 +bfdc5f6757bc11eb +bfef4ced89c64ffc +3fec2d83c377bdcc +bfbd5abc8e54c93d +3fefc1e6fde6926c +bfd4e280786bcf91 +3fe43f6aef80faa3 +3fe72d0f1ea9e397 +3fbb1410e10f2276 +3fe3322a71d6ab67 +3fe21230e32013fc +3fea6959801a3f2c +3fee8702a2b48693 +bfed190d60972380 +3fea140825c69540 +3fd46e7ed7bd4aa8 +3fed5cd932f21475 +3fa059929b200dc5 +3fe54bc2e12c1f6c +3fd471d28acfd781 +3fdbc71df34901d5 +3feeec7f1d00d6fe +3fe48f0d58952acf +3fb09e57f939645f +3fa6996b4cde5ef3 +bfe7ab7a1e5af234 +bfefa75a979e8a59 +3fee04aeb3686fd9 +3fe64e3fd1834060 +3fe7b0165aaf024e +3fe3330a2edcf0c7 +3f920e05fac6fe6d +3fefbc2413d5546c +3fedd27e90bc8f46 +bfe0dba9fa567608 +3fd3bc885b6a2773 +bfeb98a710c0d809 +bfdba1c7eb672626 +3fe8636bba99f2c7 +bfea6c705795bacb +bfe3932f1191e977 +bfde0a8dc9b58479 +bfe8895f7080ff0e +3fcc006caaed41f3 +3fef035bf932cd40 +3fe306a6eaff6877 +bfec6f4cb396608d +3f890a8fefbefecd +bfefd83358f2f4d2 +bfebaa32e945f6f6 +3fd4dfcd7a8117e4 +3fe2b3dead635881 +3fd1f6b173390842 +3fec388fbc3562b8 +3fe3f9589ab7280b +3fed795d946d06a2 +bfeef795ec4b74fe +3fbb1c118514fb3f +bfdae9523c8029d5 +3fefb69ae7b24703 +3fee44043d095ad1 +bfefffd6b4a3a4ce +bfeffec9668437d7 +3fec49a78aea6f3c +3fe3ea99049ad28f +bfeb3c8de635786e +bfd9c779fe33c27a +3fe9d4e78313ff4d +bfb11e7a206b5f70 +3fe14a550a8ccbcb +bfd194cc1d55f9bd +3feff425c437723c +bfe012901ca07c8e +bfe5e7e41263123e +bfd20683e6afcf9e +bfeffff8063e1dda +3fefc08f2b1c9032 +3fe3b97b44f3b60f +bfd0b4ff3e3f7e72 +3fd0d320c0d78e5a +bfdc59375c1fb7b6 +bfc9147acecc77c3 +3feb35a8cb58b0a1 +bfc768c66b79d816 +bf75fd1034763bc5 +bfe9ca5ccd21c473 +3fef3dd8ee0c9744 +bfefb09f00bba90a +3fe885095a858964 +3fdce26cf68abed8 +bfaa52a6932ec767 +bfdd1ab1f84eb5b5 +bfe82b7d682393d5 +bfc229746e03f4e8 +bfeb296757a0f600 +3fedffb64f54785d +bfe25cf754fa5e66 +3fe8828f681d6d51 +bfe413569dbc3e70 +3fee173576884507 +3fe797167a442a37 +3fef3dfb412aa04f +3fe5eabff1c63752 +3fecebe8b1eae5f2 +3feff5f88e81a24d +3fd346cd0063bf09 +3febd237d0859168 +3feedf7afac9c2d8 +3fedf3c894423423 +bfee757d3e206718 +3fc87b3e3c10495e +3fd21493766be529 +3feffefc2caa66cc +3fecb0cf69a64a18 +3fe3c62bc4c2a965 +bfe4d5d13fc9544c +3fefe995dcea0331 +3fd779891c671851 +3fe69de0f0379e01 +bfedc6e8c3774ffa +3fe42f754b41ac61 +3feed7c799f4a5db +3fdac4945dc70b04 +bfd112f951ce404b +3feb3dcccb7cd050 +bfe5bdba30de26af +3fe0c51e730151af +bfe49b4ece2ce600 +3fe7ff0011d85344 +bfef0c73659d40c4 +3fe5ea924038d973 +3fc0e82f9834841a +3fde7d6e6853f751 +bfeb608c3f2da5b5 +3fefe07f9d64d3e1 +3fc8cfa9af05f2c0 +3fef8fc44906f0ea +3fe52a61485be786 +bfef8956a722daa2 +3fec6ec1084559ff +bfd07d7e21f2b75b +3fe5bfbf61cba85f +3febfcb8c0b014b9 +bfe5f1657decd327 +3fb5fafe9fb7c143 +bfe9ef36128af341 +bfc247575bccd176 +bfebeb30d0ba5d40 +bfe5216297e4549c +3fd360976a6e1d35 +bfb62ad74ad5dd38 +bfd563f1ad7f929a +bfeff3db66cd0f8b +bfbb3ff0f7d29104 +3feffb2b4bd9acc2 +3fdf80a34d2b3ef2 +bfe703c1f307e1ed +bfef346985641756 +3febc363cd5d0c7d +bfe9150ee7efef5e +bfed9134ac36da71 +3fec5df55212b217 +3fb2db2aa34b344b +3fdd12f3cdcaa69a +3fecd26144266340 +3f760a76076ff21c +bfe6fcfbb5c33c4d +bf788497d5583d6f +3fe40b269ef748ad +bfd31bd0791d0f7b +bfeffdbdf2ae6e6a +bfe080375f934dec +bfcfc0b79024ffa5 +3fe872d8754cf72b +bfe350bfb8d8faa0 +bfef7e7b6e25d8cb +3fccb415da5bad98 +3fe5de6ca1798a8d +3fd4438c8dd72a4e +bfef834579510241 +bfecce2bd58d0985 +bfef8bf6a1c96b3c +3fd4301d384b1d1a +bfefafcdd5c2d810 +3fe9b17c0a70e701 +bfe1368de63ab6e3 +3fcc97918ebd0eea +bfef265e280c49a4 +bfed11ea68e3c3a4 +bfec905ae7dcb64e +3feff68555cbdae5 +3feef9a1baf2e721 +bfefffac06fdf749 +bfdabf89378ef9be +3fe2f3f76fcfb753 +3fee74c75a6d168f +3febf128b61eba2e +3fe1390d4995ef64 +bfe30a55b4f4a052 +bfd630070cc4f473 +3fefd3de45e93b83 +bfeffcaab2510cb5 +3fd1f10ea08cdc96 +3fe8807ee4b52e77 +bfdef443bd08124a +bfe278753fc1e7a9 +bfe4fccdf2dc8930 +3fe8b7c9bc264987 +3fcba146bb6b6bb8 +bfcbd2b54fd39d00 +3fb7b891fc57fb33 +3f8a580197f4734e +bfe749acf0c23edc +bfee47c9df5885f8 +3fe29382a81c63ea +3fd6017bccb440cf +3fbb839fc8c32791 +bfeebf2a613071d3 +3fee5db91a87f2c5 +3fe8c76cf7862dd9 +3fd8ad88018b3852 +bfd52088eac1ab81 +3fe9170b9a8591a0 +bfdcf885aa66bbd6 +bfe423adeb25b422 +3fda031da1cf97b8 +bfdaae9a26baac17 +bfda7860cfd13a47 +bfe9bc2e773f4e02 +3fe101e73f1f374f +3fc4659e21192b7d +3fedd55239caccf6 +3fdad593e8688589 +bfcd1a3be709b7dd +3fd2ef9f161ffbb6 +bfd81b6846058867 +3fa81835260664fb +bfdad9198ade4586 +bfef3d398236f745 +bfec571c7109d218 +bfe456d0b2d739c9 +3fa6414d585e6784 +3fef1a9a7fd62884 +bfde75dc711cb84f +bfca41d676c60599 +bfefae79c63d097e +3fefb8527fc06641 +bfecd3fbb6e6a83d +3fee24d9a33d7996 +bfecccdfb28397c6 +3fe090bbcf8a495e +3fefab332099c2f9 +bfeeab1b0b385263 +3fe8e6ce02b7e8e3 +bfe51c9ac4a175e2 +bfd9e510c5cff1d1 +bfe4de77f348e617 +3fe3f4da6e9ad9a1 +3fd203ae435ba352 +bfde4879089b304f +3fee64c03cb96124 +3fc52630ebc325b3 +bfe88762c85910b1 +3fca57314012e097 +3feff55b6203cecc +bfc92737f06a7652 +3fec83c6275ab990 +3fec17e855852949 +bfe9a5aa2f944562 +bfb10c815b238f1e +bfe5fdc33cc0802f +bfb8df1da578d8ce +bfeffffef7002c2b +3fef2f7d4f83db15 +3fe5d403b616bd3e +bfecb7d8ec3809b2 +3feb39cbca8ff858 +3fcdc8f8d3ba702f +3fee7e66e74999b6 +bfd77d4dcef5df22 +3fe7d80800989b7a +bfeffe2fc2446bce +3fcebbe8f9f1148e +3fea5cd4a14e8cf4 +3fe616ef2129c522 +bfe74b8052ccd532 +3fe51b86e5e9e421 +bfed5eac1530a92a +3fd48dde1eab9d3e +bfeff9d224057ae5 +3fe494683994971a +bfe8c75f905555a1 +bfefdf9e51921be4 +3fec234e8e34f891 +bfe86ad2e1b2c619 +3fd088e27561c1b6 +bfe37b063bf375e6 +bfe76a6c2cb8f490 +3fefa4f4fd19456a +3fdf7a7c27e0649a +3fef0a1e02eb413b +bfd3968d63dc77c7 +3fefffc0e4a55344 +3fc61389a983f01d +bfd127baa7399cd8 +3fe5d5c50e8bfcdb +bfef832e9c23e18a +3fdba104e8b57ebd +3fe664ef0aa11517 +3fdbdcbad7e6d5c7 +bfa933ee53c964b3 +bfe31bab2c4db812 +bfe17793bb24d23a +3f20443b5d996b91 +3fe453c4289f0e0c +3fe2d2a64579bbb1 +bfc3c894aa77f8e4 +bfeff10699ca7132 +3fa03f20e73bca11 +bfb97f0caaffce58 +3fdf96efd075cf82 +3feff5ab0bb524ca +3fe43886363534e7 +3fcf1034ae90586b +3fee1dc2378a302e +3fe66dae2deaca42 +3fc4b9eeb58f31ce +3feff6051f126fdf +bfd42126df7e8b02 +3fef9c79278af10f +bfeffd968cc864bb +3feffbe040dae99e +bfee9ca9ec2a57f3 +3feccbc6449ecf82 +3fddeca61e5419a9 +3feea654a088f7c7 +bfe195af7af5f97e +bfd006d6c3da81c4 +bfef02ad02b71661 +3fe6abfda4340e91 +3fd551c10f6688b7 +bfdc47f2826b793c +3fef14db087e48a3 +bfcd297623036e82 +bfdefdf2a4f618cb +3feae96781b4d3b4 +bfc00cd1e8460dfd +bfefda6c02b265fd +bfe40745733a91a5 +bfe615646141ba79 +bfe39a1b99c82a6f +3fdfe9bad02a45a0 +3fedd25a5fe9706d +3fc2228ea8195230 +3fecc2ea8b175350 +bfdcf43a3f4c3e13 +3fe40690225db354 +3fc65147eef58083 +bfe6bf6c2f2e27b2 +3fefd7be84a781f7 +3fd58cfef83042d8 +bfe10fc5daf728b2 +bfecc82d3e5e752d +3feb9b511d6ca6c9 +3fd04ad2b098dbdf +3fea58029c2731f0 +bfe74a0597076c06 +bfc1ccf859442ea0 +bfee7ed6503724b6 +bfc084a0b70d0e2f +bfe5ac8b29496e84 +3feffd7a40acc588 +bfefffea579c4b88 +bfe4f06166e1fce7 +bfeeffa2e291d4c7 +3fe6efc348f194f3 +bfe3eead3a1cdcf2 +bfec1257b8ac4777 +3fde4588da73e228 +3fd138e73d7b2b62 +3fea49f6d604069c +bfead8bf1f555d0e +bfe92730f849e4a5 +bfec16b64ef261e2 +3fc7f75a95fafdec +bfee082928aa7dcf +3fd47525e6703af5 +bfe4dec920cebc3f +bfe9d19e5205261e +3f99554799831689 +3fefde007d34f8e7 +bfd22151f260ffdc +3fdb79da7e6af987 +bfeb77a511841258 +bfef5b473004902c +3fee9f6d23558e28 +bfebabd7a4d8a0dd +3fdf041e91d0784e +3f9b7a85af6636af +bfefea29987fad59 +bfec97b36e16d0a1 +bfe295eb8cee58bc +3fefb619a78f892e +3fe8bd9a58bb7ac1 +bfea87da9bbf54bf +bfeec940fd3ade60 +3fef4ff69e7d1071 +bfefc31991f3253c +3fec41746e30ec2a +bfee6f794172ec41 +3fe5c458498368c6 +bfe2739d06e97284 +bf95325d7eb03aa4 +bfe0d7a19e369def +bfea72b38430aaff +3fef0e8ac288f799 +bfe1a8430056b37c +3fe46e6a79d89285 +bf9417cae6fc9ff9 +bfd39939930cb223 +3fee4caba799cf1e +bfd6672e25046e13 +3fe9bcb6b42fb493 +3fe9110c11d4361e +3fd1e8160d2a03d8 +3fd73340782ce683 +bfe917f2e77f89a0 +3fc3f24dcb9d688a +bfe3f7ad75dc7240 +bfef782b779d0f18 +bfeb4aed4115dd39 +bfe7296b27ce9006 +3fefa05290aa9135 +bfeee6f84f7b0350 +3fb7b460c5573429 +bfd4b2dd1a43146f +bfdb83f0544847fc +3fe3b70aa183afb2 +3fed9d6b9a8ecbeb +bfccb53ac8c8d1fe +bfc2b66c9fbfecf0 +bfebd7ef0c8dd694 +3fefa6ae259d4b8c +bfe0e7feb9dbf76a +bfece25ad2a47adb +bfeb887c36d09e66 +bfaf0f0b55ccf20f +3fef2901736f4f22 +bfe39b2d00c9bfc6 +3fdcfc0755aa1dcf +bfd498e83fd2ae90 +3feff7d765f3ce97 +3fe0e5be740191e7 +bfe936b0b2ac0164 +bfe0641a7a1c88ad +3fdcf9e103d76a24 +3fefda9e20138ed7 +bfef9ed006e600f8 +3fd57d52eb4fadc1 +bfdc326d1ead0a68 +3fe37cf39486886b +3fdfb9bd4e91944f +bfe7f8b9af05ee23 +bfdefaf850146567 +bfe541400e14a25d +bfeffff8fba5e788 +3fef67ebdefcfe31 +bfef4d8a94f8a694 +3f9f445d3235b1a2 +bfc5ae9eecece85c +bfea97b1c00f6def +3fc0971ec38252b2 +bfea4572707c15ca +bfef9b7dfdddb7e9 +3fca53cc5be93ce5 +3fefffffff4ec5e2 +3ff0000000000000 +3fcfa0bd65c6ff28 +3fec4b377807b744 +3feffffffffffff7 +3fea1a7aba76eb69 +3fefffffa6bcd6b6 +3feabd4ef15fb604 +3fc6732f57409a8c +bfb3b430d434f815 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3feff9c5fe48256b +3ff0000000000000 +3fb33313407bc1bf +3ff0000000000000 +3fefc79ad93bee53 +3ff0000000000000 +3fefffffd58c59c9 +3ff0000000000000 +3feffffffffffc41 +3fe867db6aa5f726 +3fefb441399efcf3 +bfeb04257698543d +3fefa88b4a3514d4 +bfc4868a06b01f10 +3fceab47f322f724 +3ff0000000000000 +bfd8a182fdb09671 +bfea98a70494cf83 +3fce6cd5188e9102 +3fb3f3f703e3be70 +3feffffffffffc52 +3ff0000000000000 +bfefea95a5a44f40 +3fd56ced68d4e422 +bfeb0b969bf03dad +bfccc4f7235a8257 +3feffffffffffef8 +3fe9001fc5fd6ac8 +3fe5edcfcccaa5b6 +3ff0000000000000 +3ff0000000000000 +bfe7f2e0fcf1463d +3feffffffffffd96 +3feffffffffff321 +3ff0000000000000 +bfe8bc791d45da72 +bfe1729549b46e39 +bf655bde75533eda +bfef773190b1bfeb +bf9356fa5129521d +3fee4f8d6cfc7edf +3feee5e2481fdfeb +3fd4148c25c817b7 +3ff0000000000000 +3ff0000000000000 +3fde10172e943d6b +3ff0000000000000 +bfee247c4f43a1f0 +3ff0000000000000 +3ff0000000000000 +3feffb919c668a3a +3ff0000000000000 +bfcee32476856b4b +3ff0000000000000 +3fef8db8838a477a +bfdbd53bda87d124 +3fefffff51e77e7e +3fe745d3ce3d0dc2 +bfefa52d733e508c +3f90f3abd0e48d70 +3ff0000000000000 +3fefffffffffffff +3feffffbaa39e2ae +3fc13075ed28fd44 +3ff0000000000000 +3ff0000000000000 +3fefffffffaeba09 +bfe8dd04965f9561 +bfdeccd96e866a10 +bfeb219d0af03f22 +3feffe8405d1d1ca +3ff0000000000000 +3f99e0dee534a480 +3fefff6a46c0c997 +3fef551e14be8f8a +3fefffffffffa34c +bfc734488a68d0f2 +3fd4d4e4e1e04863 +bfaa451a0095a02d +3fe7c372368ca71a +3ff0000000000000 +bfc2b08e3e7e2ec5 +3fd9a5756c716067 +bfefbc3c49c2ff29 +3feff854db2f0bd3 +3ff0000000000000 +3ff0000000000000 +3fefdc3eefd3f930 +3feffffffffc8a14 +3fef15725716d3ca +3feffff2c9a77af8 +3fefd7b369590d6a +3ff0000000000000 +3feffffffa971a89 +3fef450e45ac0d4c +3fef483bc8f46ea1 +3fedb94995970726 +3ff0000000000000 +3ff0000000000000 +3fcd9c13bd1110ee +bfe7d51b4fd132bd +3fe10ec2c569b5b0 +3ff0000000000000 +3feffffffffde0ce +bfdc5183e417506d +bfdf89bba112d37c +bfefffcf2b9bdb6e +bfef6b5b7b16a1d3 +3ff0000000000000 +3fef6dcdd0271960 +3fefd87f1c46d30e +3fd2202c4c0704eb +bfee3dbf0f8d02d2 +3fad16e896bbd8ac +3fefffffffffec04 +bfe26fbc916e9299 +3fe1a07d343aa31a +3ff0000000000000 +3ff0000000000000 +3fef47434b59f89f +3feb11db8828f99a +3fefadc7245e4a2b +bfe2e936ce2fe4fe +3fefd1d0ea94e21f +3fefffffffffffff +3ff0000000000000 +3fa0550a902cf042 +3feba8fe9156569a +bfd334a4231c6200 +3fd8c90cc68ecbc7 +bfcecafcca222614 +3ff0000000000000 +bfeb59b9aa34c0d5 +bfedd1ff91abe84f +3fefa7de7b71fafb +3fefffffffff6de0 +3ff0000000000000 +bfecce0c8d98a036 +3fd2638719e6b9d5 +bfe3ea81708e5a78 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfeffd9d315d5963 +3fe1ecb1b543a5ca +3fe401cf2773d2e1 +3fefffffefc1869f +bfa077e05eafc9ed +3feffffffffd31ba +3feffffff90e6c15 +3fe3a4a38b5e0ba1 +3feffffffffce893 +3feefbc07afe0d07 +3fec67537d714fec +3fed905d99db07a7 +3fe8d6459b80c046 +3fd889d1e902f0b4 +3fe60571f761df65 +3ff0000000000000 +bfae1433a57f1fcf +3fefffff44625682 +3ff0000000000000 +3fefffffa7ae8995 +3fe9a98d08544b87 +3fdc4540deefce08 +3ff0000000000000 +bfd25e9e66a97d51 +3fefffff3587dc77 +3feffffffffffff9 +3fc2b7c4ec32abb0 +3fee290ccbc0c1f1 +bfc7e6c974200c2c +3fee635acea04ab9 +3feffffffffee759 +3feab63ef1e6d8ba +3fecd3fc82f97f9f +3fefff7c30855f0f +bfd119aaa2acf109 +3ff0000000000000 +3fef7fb51ee7aab2 +3feb30b7293e9edc +bfe05de4ee2732f9 +3ff0000000000000 +3fefffffb5cb9cac +bfda897595de2a42 +3fc7f1004c2839ca +bfe62f79b7d4b0b3 +3feffffffffffff8 +3ff0000000000000 +3fedb2e05cfcf903 +3ff0000000000000 +3fecaa721fabe52d +bfee068174c36c56 +bfeb4d6297ab5682 +3fc7c25c73c4a221 +3fefffffffdca7fc +bfefd5c489decafc +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3feff508f8fc9e15 +3fef91c080fcdbf9 +bfe8701bbe5cb548 +bfea3c81c30e19f9 +bfdaa9edb80b4fd6 +3feaea57caed0919 +bf679565d375a1b4 +3feffd3eaccdebea +3fd71ab2737e57b6 +3ff0000000000000 +3feffffffffe27f0 +3fa6f8e1c2b884fe +3feffffffffd3b9f +3ff0000000000000 +bfea3e6dd13dfcb6 +3fde23cc767a4fa5 +bfef3296501032a9 +bfea83927cd8f67e +3fefee4c4939d156 +3feffac76a1f6180 +3fefb3a10bb2e92d +bfeebc376b5126d0 +3feffffffff2e11b +bfe9b6d48aa8c18f +3fefe4fc26176222 +bfcb1100aa15544b +3fe981776e846b67 +3fefe18968b952be +3fefffffffa398f6 +3ff0000000000000 +3ff0000000000000 +3fed8f99247a959d +3feffffffffffa16 +3feffffff65da2da +3feffffffffffbfa +bfea5bc121d1358b +3ff0000000000000 +3fd14e4b1e3af516 +3feffffffffffa2a +bfd68e4be8d7b3e0 +3fefff5c071c6aff +3ff0000000000000 +3fef72a8299e96d6 +bfd74bbdca9a83fc +3fef2d64830b63c6 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfd9b28b082a5c99 +3ff0000000000000 +3fe0fae4f930aa6a +3fa3c65d5d2bd7f0 +3fe529dd497bc82d +3ff0000000000000 +bfe963c2c936b254 +3fefffffffe65a51 +3feffffffffffffc +3ff0000000000000 +3ff0000000000000 +bfedf4eb4a0ea3a8 +3fc520f17a85aa1e +bfee88c9d2f91fdb +3ff0000000000000 +bfd74f924885e0c5 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fed10c878136be0 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffaf484ccca7 +3fee09224c106fcc +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fec19a8e0318458 +3feffffffffffdc3 +bfe7d393a369a2b5 +3ff0000000000000 +3ff0000000000000 +bfeca8fa0ed57b32 +3fe02ae3009d6f60 +3fefffffffffa9a9 +3fef2edffe146b32 +3fefffffffffff57 +3ff0000000000000 +bfed14a685af0012 +bfef526142340e35 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfeffff39d63f8e5 +3ff0000000000000 +3ff0000000000000 +3fd57ceb09315471 +3fefffffffffff98 +3ff0000000000000 +3fe5377aec0d2861 +3fcc2186b24cc5e7 +bfda6636375b97b8 +3ff0000000000000 +3fe31c600ca2478c +3fe45cb5318bdce6 +3fe3289b531208f0 +3feb5c8792aaf159 +bfefe4f958fa9292 +3fd08289745a4f72 +3fed787f3f31f8cc +3fe83db360330146 +3ff0000000000000 +bfe9be84375180e9 +3fefff6a04b7f069 +3feffffed3b28626 +3fefffffffffffec +3fea4934ca02a57d +bfefe0457e8c7e46 +3fd94e2c419f8dba +3ff0000000000000 +3fefffb60e687199 +3fe90495587c01ea +3ff0000000000000 +bfe0da2bc4a0260f +3fefffffffde71f2 +3ff0000000000000 +3feffffffffff123 +3fa031e1f4e6cb7a +bfefffe809662d7b +bfefe59857c989cb +3feffffffffff6e1 +3ff0000000000000 +bfe3d4410b5d028e +3feffffffffe468c +3fe244866a05ebb6 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfd4cbbded384e2e +3fefff741d128a51 +3fefffffffc0c39a +bfe9fa59ee53ee39 +3ff0000000000000 +3ff0000000000000 +3fedd83e665266fb +3fefdd7e689fc6da +3fefffffffffff70 +3feffffffffc3ba5 +3ff0000000000000 +3fe21ce4eeb5296f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fa0512a53ae71cb +3feffff964d22459 +3fefebd3f4378a49 +3fefffff5d582666 +3fee72e81c6d4b49 +3fbf0c5489170884 +bfea7c4d7f91b3b7 +3ff0000000000000 +3fc07139bd134cde +3fef6c58f9e82901 +3feffffffff5aa02 +3fef765b41ba7c8c +3ff0000000000000 +bfeaa7c7cf3a7dbe +3fa88ee2da07d50a +3ff0000000000000 +3fef25ddd1a5dfb5 +3ff0000000000000 +3f90c63c72973a04 +3fefffffded5ab77 +3fe6622671e7e60d +3fe949121fd15ad5 +3fef8596c17a45bb +bfe326282cadc8df +3fbca9b307e9706f +bfdcd5229a84578d +3fefacb2859faab4 +3ff0000000000000 +bfe6f66f73059741 +3feffee093c6a211 +3fe85869aa047c5c +bfeeb7f77f039501 +3fef925b2aca5fb9 +3fcdd5d24be882b9 +3fef9ee716480bec +3fe0b5f4a9817637 +3feffffffffe9365 +3feffef5d435f31b +3feda435360f4c37 +bfd2df8d57f7dd5b +3ff0000000000000 +bfa4e71ac680e407 +bfe3ade107e3e7af +3feffffff2a701e6 +3feffffffc945a16 +3fec8b3a3730c8b5 +3feca60586eac6b0 +3fede35c348c4c57 +bfeff66ecf30c355 +bfefff9b50312297 +bfe7cba06a644b69 +3ff0000000000000 +3feffffffffffff4 +bfede0611a88f416 +3ff0000000000000 +3fefffe09b933b2c +3feffff00ca36626 +3feffffffff6209a +bfa363a70f3e4f88 +3feb749e9a95d461 +bfefeff179c28d61 +bfe1e295521a9e4f +3ff0000000000000 +3feffffffffffda7 +3ff0000000000000 +3ff0000000000000 +3fefffff271afc17 +bfe890da8611994c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe48da6f13d9083 +3fed939156aeef7b +3fefffffff8508be +bfad615aab836695 +3fefbf3daa1eb69b +3fe104efeefe13e4 +bfe3db0959af22df +3fe19fb3d2f3d7ef +bfe93f6ce58fbe60 +bfe25491725a619b +3ff0000000000000 +3fefffffffdffa05 +3ff0000000000000 +bfbb2f9cf85ab246 +3fefffb9f8dfe807 +3ff0000000000000 +3ff0000000000000 +bfdd4e102afe20ae +3feff5df1ac7f9f1 +bfcfef75f1b1c359 +3fec4e6753879fd3 +3fefffffe0257f5a +3fefffffffffffff +3fee4e4fb8ecf6fc +bfedeee1bde469e9 +bfeffeb4a17d16bc +3ff0000000000000 +3fe7bda1f385ffcf +bfd6f3cd62392c6e +3ff0000000000000 +3fe1d4c6bc9639d8 +3ff0000000000000 +bfe2c1288f59de34 +3feff521544725a2 +3fefffff9ff6d167 +bfa54bd40372eec5 +3fdba4ca1c485bf9 +3feffffffffea2a3 +3fd9684056727074 +bfcf0669236e907f +3fe26262346427d3 +3ff0000000000000 +bfe2863178f5da76 +3feb52e1c8262e55 +3feffffffffffff9 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fc06333e92242e4 +bfb2db92d1fe377f +3fc3074cebd4aabc +3fef5c521f32d39a +3fe9092193743bae +3ff0000000000000 +3ff0000000000000 +3fec4c8091e705c0 +bfeffd55b39f7a69 +3feffb2bf4d0e778 +bf8c401cec246806 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3feb376b2e5674d6 +3fef856d2acc4d48 +3fefffffffffff0e +3fe3107fa454ee45 +3f5c10c0323a0f97 +3ff0000000000000 +3fed9d3be083b470 +bfe3df2b1affa8de +3fefffff32463031 +3fe6d9fb1e0eb646 +bfcf7e25810e9648 +bfe423c754427c8f +3ff0000000000000 +bfeffcfc49edc991 +bfc880ba975c9f71 +3ff0000000000000 +3fefe38387be4186 +3ff0000000000000 +3ff0000000000000 +3feffe0a010ae4f1 +bfe8cfd44126e95f +3fefffffae092e6b +3f95f252ed9bc386 +3fef144437a69873 +3fefffffffed8b42 +3ff0000000000000 +bfe8a616e6c1d31b +3fefffdb07d2cf30 +bfdbf05147127fc4 +bfe165a0d31b5de0 +3ff0000000000000 +3feffffff2408fd3 +bfd5a5a4373e530f +3fefffffed1778bc +bfefb0000152f2db +bfe2a0d04d72b1d9 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3feffffffd73fe59 +3fefaf923eda0668 +3ff0000000000000 +3ff0000000000000 +bfe025c6ea042478 +3feffffffffffa82 +3feb3e33221f4b38 +3ff0000000000000 +3ff0000000000000 +bfef96562d7ad4c5 +3ff0000000000000 +3fe160f36156643e +3ff0000000000000 +bfb29adb9d84f0cb +3ff0000000000000 +3fcbb6c926bede34 +bfd762f86252cf62 +3ff0000000000000 +3fefffffebc23b8c +3ff0000000000000 +3f7475edfd0005c3 +3fefe4d14b10072d +3fefffffffffffec +3fe87c0c3b88637d +bfe0acc38e258ce7 +bfd898e2dd46927e +3fefffffffe2529f +bfeaf6e66d6f9a70 +3ff0000000000000 +3fed09c2f587216b +3fee729e8053c913 +3fe78287e5f65365 +3febc86331f51a92 +bfa019de0249af4e +3ff0000000000000 +bfeb1212851a6f49 +3ff0000000000000 +3fefffffb4fa3c2d +bfecd35897e58895 +3ff0000000000000 +bfeaac24459ce2c2 +bfd9435cf4e746a1 +3fee480217dec775 +3fe5764e1971b7a5 +3ff0000000000000 +3ff0000000000000 +3fcd8eeae4f97ecd +3fd6a62d43069017 +3fee55045d02c13f +bfe9e536efaabc19 +bfef07f00caf31b3 +3feae9c51b344b81 +3feffffffffef65c +3ff0000000000000 +3ff0000000000000 +bfc2d55c2d90ee50 +bfef2c9d58e02d2c +bfcf261f524d60dd +3fd4550eca8d79a6 +3ff0000000000000 +3ff0000000000000 +3fe384001b174a84 +3feffd1b58973efe +bfe02556ed0dcc3f +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fc0aa7e1af8dd7f +3fefffffff755e51 +3fefffffff61e7ab +3fefffffffffffff +bfef1486ec3c999d +bfef3fa6884391cc +3fec9a9279c2ceba +3ff0000000000000 +3fecacb7092174a8 +3fefffd042f59457 +3fed3f8fd59bf166 +3fef98660ddf7c16 +3ff0000000000000 +3feffec771b8dd72 +3feffffcf5d334b2 +3ff0000000000000 +bfec144a71cbe8ea +bfeb303740d2739a +3ff0000000000000 +3fd5f0d30c050597 +3ff0000000000000 +3ff0000000000000 +3fdebbbaf04bceeb +3feff41adb0f0037 +3ff0000000000000 +bfc0339540d0c4fe +3ff0000000000000 +3ff0000000000000 +3fefdffcc014d09a +3feffffffffeede2 +3ff0000000000000 +bfefffcd8c780ba4 +bfb2c37d16a304ef +3ff0000000000000 +3fec9f2a76c6ebdc +bfeffebe476109c5 +3fa2c66e88f3a6be +bfe5b389964e24e8 +bfefefc54b69d566 +3feffffffffb14e9 +3feb18c88eb5bea9 +3ff0000000000000 +bfee94d4d7db7dbb +3ff0000000000000 +3fcb90726dceb7fe +3fefaf296c6cba5a +bfef72cfa56dc10b +3fed80a3ceecdd75 +3ff0000000000000 +3ff0000000000000 +bfef4563ad1d0897 +bfc42c6795a2210d +bfc74c4daded8970 +3fd05348828c3dfd +3ff0000000000000 +3fefffffff6800b4 +bfd4e5eab9107af5 +3ff0000000000000 +bfd833e11a36c95d +3fefffffee0a8ff5 +3ff0000000000000 +bfe8a1977a254f5e +3feffe7a6b4dad3d +bfe44f9fe1db278e +3feb4ecbd8ee0872 +bfefe85a21c63874 +bfed7d094588f29d +3fefffffffff76c6 +3ff0000000000000 +3ff0000000000000 +3feb605125b9c0e9 +bfe0788d536c4410 +3fecc109f7971f19 +3fed5c4e4bbe79a8 +3ff0000000000000 +3ff0000000000000 +bfec74dbf964b79c +3fefffffffffffa9 +3ff0000000000000 +bf7161c67c951c1d +3feffffffffffaa4 +3feffe99543728ef +3ff0000000000000 +3ff0000000000000 +3fec3301044955cf +3fefffffffee32a5 +bfee8d5aea29675b +bfd45c87806c2e27 +3fefffffefac7d7a +3ff0000000000000 +3ff0000000000000 +3feffffffffffffe +3ff0000000000000 +3feffe1dc2227161 +3fefffffffffff30 +3fefffffffffffdb +3fe924e2e84544c1 +3ff0000000000000 +bfdf449b9a6ec31a +3ff0000000000000 +3ff0000000000000 +3feffffdd475fc22 +bfefe24cfd9603a3 +3fefffffffff7b56 +3fe10650f2b6ffbb +3fd850f80c3bd8f9 +3ff0000000000000 +3ff0000000000000 +3fefffffd485136e +3ff0000000000000 +bfedd8c4baa3b162 +3ff0000000000000 +3feffffffe4b438e +3ff0000000000000 +3ff0000000000000 +3feffffffffd3d79 +bfee88bec721b03b +bfe945d35b61b7f9 +3ff0000000000000 +bfd384197af06abd +3ff0000000000000 +3fefffffffffe75a +bfe33403208a287c +3ff0000000000000 +3fed8a3b80754f99 +3fe25ed54da2565f +bfef74fd3c47ba00 +3fefffffff0ffb9c +bfefde7202d5e4ac +3fe77e6012ae67b3 +bfce68fcf2bc0146 +3fea72e63c5f360b +3feffffffffffffe +bfc260b510b306de +bfd6d637b5f9c3c9 +3fe31326db25c739 +3fefffdc49f474df +3fefff864f717311 +3ff0000000000000 +3ff0000000000000 +3febab4ca297e8a8 +3fd15a6504c1c628 +bfe37e59ba46e398 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bfefda77ef67742e +3ff0000000000000 +bfef367f570a9249 +3fe56ac9ac46aa9d +bfc643cb81d23723 +3ff0000000000000 +3feffffffffffffc +3ff0000000000000 +3fdc469efc09c5fb +3f9884eee5f1d56b +3ff0000000000000 +3fefa16bcf14eddc +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0000000000000 +3ff0000000000000 +@tan 7399 c3b00fb2f01a4457 +0000000000000000 +8000000000000000 +3ca1a62633145c07 +3f91dfbd9410a40c +3fa1e12295d61fdb +3faad53144273e6e +3fb1e6b93a693214 +3fb665a8349d55e2 +3fbae81c75231dab +3fbf6ecf19881d36 +3fc1fd3df8664fe0 +3fc445f0fbb1cf96 +3fc691e1ebc5cbb9 +3fc8e174375dcebc +3fcb350dac76234b +3fcd8d16c149159c +3fcfe9fae1181f55 +3fd126145e9ecd5b +3fd25a0951873b23 +3fd391176b8feb58 +3fd4cb7bfb4961b1 +3fd60976af8c1611 +3fd74b49cf3902d8 +3fd8913a75259d06 +3fd9db90d0ac0d45 +3fdb2a986b66229f +3fdc7ea074a90a13 +3fddd7fc13699ab2 +3fdf3702bf455cf1 +3fe04e0850c1dd5d +3fe103c37f7ebedb +3fe1bce655fbb9c0 +3fe279a74590331c +3fe33a400c85afa0 +3fe3feee02d72515 +3fe4c7f26ed1d612 +3fe59592e296c626 +3fe66819a3a0bf78 +3fe73fd61d9df544 +3fe81d1d621eb70e +3fe9004ab6d5cc94 +3fe9e9c0346ca836 +3fead9e7783fbf21 +3febd1326bb88d11 +3fecd01c246e4063 +3fedd729e0bf9cb7 +3feee6ec253d2460 +3ff0000000000001 +3ff091883bfbf42d +3ff1286c17acf49d +3ff1c511a0db83e2 +3ff267e8b3f5da84 +3ff3116c3711527e +3ff3c2238553dcf1 +3ff47aa413b0ee1f +3ff53b9359d2f917 +3ff605a90c73ab7a +3ff6d9b1b96ce126 +3ff7b891d9a169b5 +3ff8a34971bd700d +3ff99af8610e4108 +3ffaa0e385c196aa +3ffbb67ae8584caf +3ffcdd612dd501f5 +3ffe1774a2562590 +3fff66da45fee3f3 +40006705b35391e6 +400127f33e8d12e7 +4001f7e220cc4170 +4002d8c9200b5685 +4003ccfa561175d5 +4004d738ef803783 +4005fad570f872d9 +40073bd2e9a270e1 +40089f188bdcd7b0 +400a2ab4c7136721 +400be6398b3f286c +400ddb3d742c2653 +40100b0a2833d3c3 +4011536e695dda93 +4012d18a8e2ff28b +40149405f7cc644c +4016af648056a138 +4019414813ba662e +401c76237b025aed +402049e7c666e403 +4023075ac71a38c2 +4026dc2fd0bfdbde +402c99f0ed772d48 +403314c55fbc4c65 +403ca2e17ec2185f +404ca51d76749a82 +c34d02967c31cdb5 +c04ca51d76749a49 +c03ca2e17ec21843 +c03314c55fbc4c58 +c02c99f0ed772d54 +c026dc2fd0bfdbe5 +c023075ac71a38c8 +c02049e7c666e3fe +c01c76237b025ae6 +c019414813ba6629 +c016af648056a133 +c0149405f7cc6448 +c012d18a8e2ff288 +c011536e695dda96 +c0100b0a2833d3c5 +c00ddb3d742c2656 +c00be6398b3f2869 +c00a2ab4c713671d +c0089f188bdcd7ad +c0073bd2e9a270df +c005fad570f872d7 +c004d738ef803781 +c003ccfa561175d7 +c002d8c9200b5686 +c001f7e220cc4172 +c00127f33e8d12e5 +c0006705b35391e7 +bfff66da45fee3f0 +bffe1774a2562592 +bffcdd612dd501f3 +bffbb67ae8584ca8 +bffaa0e385c196ac +bff99af8610e4105 +bff8a34971bd700e +bff7b891d9a169b3 +bff6d9b1b96ce127 +bff605a90c73ab78 +bff53b9359d2f918 +bff47aa413b0ee1e +bff3c2238553dcef +bff3116c3711527e +bff267e8b3f5da81 +bff1c511a0db83e3 +bff1286c17acf49c +bff091883bfbf42e +bfefffffffffffff +bfeee6ec253d2462 +bfedd729e0bf9cb7 +bfecd01c246e405f +bfebd1326bb88d11 +bfead9e7783fbf1d +bfe9e9c0346ca836 +bfe9004ab6d5cc92 +bfe81d1d621eb710 +bfe73fd61d9df542 +bfe66819a3a0bf7a +bfe59592e296c626 +bfe4c7f26ed1d60f +bfe3feee02d72515 +bfe33a400c85af9d +bfe279a74590331c +bfe1bce655fbb9bf +bfe103c37f7ebedc +bfe04e0850c1dd5c +bfdf3702bf455cf4 +bfddd7fc13699ab1 +bfdc7ea074a90a0e +bfdb2a986b66229f +bfd9db90d0ac0d40 +bfd8913a75259d06 +bfd74b49cf3902d4 +bfd60976af8c1613 +bfd4cb7bfb4961ae +bfd391176b8feb5b +bfd25a0951873b22 +bfd126145e9ecd56 +bfcfe9fae1181f54 +bfcd8d16c1491594 +bfcb350dac76234c +bfc8e174375dceb6 +bfc691e1ebc5cbbc +bfc445f0fbb1cf91 +bfc1fd3df8664fe5 +bfbf6ecf19881d32 +bfbae81c75231d98 +bfb665a8349d55e1 +bfb1e6b93a693204 +bfaad53144273e73 +bfa1e12295d61fc2 +bf91dfbd9410a422 +0000000000000000 +3f91dfbd9410a422 +3fa1e12295d61fc2 +3faad53144273e73 +3fb1e6b93a693204 +3fb665a8349d55e1 +3fbae81c75231d98 +3fbf6ecf19881d32 +3fc1fd3df8664fe5 +3fc445f0fbb1cf91 +3fc691e1ebc5cbbc +3fc8e174375dceb6 +3fcb350dac76234c +3fcd8d16c1491594 +3fcfe9fae1181f54 +3fd126145e9ecd56 +3fd25a0951873b22 +3fd391176b8feb5b +3fd4cb7bfb4961ae +3fd60976af8c1613 +3fd74b49cf3902d4 +3fd8913a75259d06 +3fd9db90d0ac0d40 +3fdb2a986b66229f +3fdc7ea074a90a0e +3fddd7fc13699ab1 +3fdf3702bf455cf4 +3fe04e0850c1dd5c +3fe103c37f7ebedc +3fe1bce655fbb9bf +3fe279a74590331c +3fe33a400c85af9d +3fe3feee02d72515 +3fe4c7f26ed1d60f +3fe59592e296c626 +3fe66819a3a0bf7a +3fe73fd61d9df542 +3fe81d1d621eb710 +3fe9004ab6d5cc92 +3fe9e9c0346ca836 +3fead9e7783fbf1d +3febd1326bb88d11 +3fecd01c246e405f +3fedd729e0bf9cb7 +3feee6ec253d2462 +3fefffffffffffff +3ff091883bfbf42e +3ff1286c17acf49c +3ff1c511a0db83e3 +3ff267e8b3f5da81 +3ff3116c3711527e +3ff3c2238553dcef +3ff47aa413b0ee1e +3ff53b9359d2f918 +3ff605a90c73ab78 +3ff6d9b1b96ce127 +3ff7b891d9a169b3 +3ff8a34971bd700e +3ff99af8610e4105 +3ffaa0e385c196ac +3ffbb67ae8584ca8 +3ffcdd612dd501f3 +3ffe1774a2562592 +3fff66da45fee3f0 +40006705b35391e7 +400127f33e8d12e5 +4001f7e220cc4172 +4002d8c9200b5686 +4003ccfa561175d7 +4004d738ef803781 +4005fad570f872d7 +40073bd2e9a270df +40089f188bdcd7ad +400a2ab4c713671d +400be6398b3f2869 +400ddb3d742c2656 +40100b0a2833d3c5 +4011536e695dda96 +4012d18a8e2ff288 +40149405f7cc6448 +4016af648056a133 +4019414813ba6629 +401c76237b025ae6 +402049e7c666e3fe +4023075ac71a38c8 +4026dc2fd0bfdbe5 +402c99f0ed772d54 +403314c55fbc4c58 +403ca2e17ec21843 +404ca51d76749a49 +434d02967c31cdb5 +c04ca51d76749a82 +c03ca2e17ec2185f +c03314c55fbc4c65 +c02c99f0ed772d48 +c026dc2fd0bfdbde +c023075ac71a38c2 +c02049e7c666e403 +c01c76237b025aed +c019414813ba662e +c016af648056a138 +c0149405f7cc644c +c012d18a8e2ff28b +c011536e695dda93 +c0100b0a2833d3c3 +c00ddb3d742c2653 +c00be6398b3f286c +c00a2ab4c7136721 +c0089f188bdcd7b0 +c0073bd2e9a270e1 +c005fad570f872d9 +c004d738ef803783 +c003ccfa561175d5 +c002d8c9200b5685 +c001f7e220cc4170 +c00127f33e8d12e7 +c0006705b35391e6 +bfff66da45fee3f3 +bffe1774a2562590 +bffcdd612dd501f5 +bffbb67ae8584caf +bffaa0e385c196aa +bff99af8610e4108 +bff8a34971bd700d +bff7b891d9a169b5 +bff6d9b1b96ce126 +bff605a90c73ab7a +bff53b9359d2f917 +bff47aa413b0ee1f +bff3c2238553dcf1 +bff3116c3711527e +bff267e8b3f5da84 +bff1c511a0db83e2 +bff1286c17acf49d +bff091883bfbf42d +bff0000000000001 +bfeee6ec253d2460 +bfedd729e0bf9cb7 +bfecd01c246e4063 +bfebd1326bb88d11 +bfead9e7783fbf21 +bfe9e9c0346ca836 +bfe9004ab6d5cc94 +bfe81d1d621eb70e +bfe73fd61d9df544 +bfe66819a3a0bf78 +bfe59592e296c626 +bfe4c7f26ed1d612 +bfe3feee02d72515 +bfe33a400c85afa0 +bfe279a74590331c +bfe1bce655fbb9c0 +bfe103c37f7ebedb +bfe04e0850c1dd5d +bfdf3702bf455cf1 +bfddd7fc13699ab2 +bfdc7ea074a90a13 +bfdb2a986b66229f +bfd9db90d0ac0d45 +bfd8913a75259d06 +bfd74b49cf3902d8 +bfd60976af8c1611 +bfd4cb7bfb4961b1 +bfd391176b8feb58 +bfd25a0951873b23 +bfd126145e9ecd5b +bfcfe9fae1181f55 +bfcd8d16c149159c +bfcb350dac76234b +bfc8e174375dcebc +bfc691e1ebc5cbb9 +bfc445f0fbb1cf96 +bfc1fd3df8664fe0 +bfbf6ecf19881d36 +bfbae81c75231dab +bfb665a8349d55e2 +bfb1e6b93a693214 +bfaad53144273e6e +bfa1e12295d61fdb +bf91dfbd9410a40c +bca1a62633145c07 +bef24d1521228864 +3ef24d1521228864 +bebd4821ce88f3c4 +3ebd4821ce88f3c4 +bca1a62633145c07 +3ca1a62633145c07 +3f81df645e10066f +bf81df645e10066f +3f9ad07b730567d3 +bf9ad07b730567d3 +3faad53144273e73 +bfaad53144273e73 +3fbae81c75231d98 +bfbae81c75231d98 +3fd74b49cf3902d4 +bfd74b49cf3902d4 +3fefffffffffffff +bfefffffffffffff +3fa90a7d8270aecb +bfa90a7d8270aecb +3fd4cb7bfb4961ae +bfd4cb7bfb4961ae +3fd84fb2a0ac8fe5 +bfd84fb2a0ac8fe5 +3fecd01c246e405f +bfecd01c246e405f +3ff267e8b3f5da81 +bff267e8b3f5da81 +4005fad570f872d7 +c005fad570f872d7 +4009872d0ae12c67 +c009872d0ae12c67 +400ddb3d742c2656 +c00ddb3d742c2656 +4081e7a85f79a037 +c081e7a85f79a037 +40ebf9f8f1b91c4c +c0ebf9f8f1b91c4c +434d02967c31cdb5 +c34d02967c31cdb5 +3d719799812dea11 +bd719799812dea11 +bff936436354eadd +3ff936436354eadd +3fe8d25dd68454db +bfe8d25dd68454db +bfe1de000f443f50 +bfda5807d6f76f7d +bf74530cfe729484 +3f74530cfe729484 +0000000000000001 +8000000000000001 +0010000000000000 +bfcc403451851ab4 +3f0f9bd03136287d +bfe4c5a2cec8c14a +c01f04411028c49a +3fbe309ae33d8d87 +3d01a62633145c07 +3d2469898cc51702 +bd172cece675d1fd +3d3234c4c6628b81 +bd2b9676733ae8fe +3d11a62633145c07 +3d3469898cc51702 +bd272cece675d1fd +3d4234c4c6628b81 +bd3b9676733ae8fe +3ff000000000002e +3ff000000000012e +3feffffffffffe5d +3ff000000000022e +3feffffffffffc5d +c2d61b5fcd28d34c +c2ab18dab7838a49 +42b388d8ce7a95d0 +c29d585c862c9335 +42a1976bf514398d +c2f739c7306010b7 +c2bd7680e808d941 +42c181f2827ffd13 +c2aeadd8be6ada10 +42b0b84a8bbb85bd +3cf60b679ab8cd3b +3d3160b679ab8cd4 +bd2d3e930ca8e659 +3d40b05b3cd5c66a +bd3e9f498654732c +bff0000000000002 +bfeffffffffffe04 +bff0000000000102 +bfeffffffffffc04 +bff0000000000202 +431caf147da677e3 +c2b024036a63e72d +42afb937ce502bff +c2a011ed880f0327 +429fdc74977e896e +bcea81c996dfd5a5 +3d1cafc6cd24054b +bd21a81c996dfd5a +3d2e57e3669202a6 +bd30d40e4cb6fead +bcfa81c996dfd5a5 +3d2cafc6cd24054b +bd31a81c996dfd5a +3d3e57e3669202a6 +bd40d40e4cb6fead +3fefffffffffff9a +3ff00000000000cd +3feffffffffffd9a +3ff00000000001cd +3feffffffffffb9a +42d42a1169286eae +c2b3f597049dbc9e +42aab3f3981ee0fe +c2a1c2fe6be5a4a7 +429d1ccb507f4759 +c2c6a31c6c4c0a3d +c2b2bf9e142eddaf +42db490e97dc4168 +c2a7a4e5d6ab7579 +42b8beafd234bc48 +3d269e20a6f0f0ef +3d3b4f1053787878 +bd12c3beb21e1e21 +3d45a78829bc3c3c +bd34b0efac878788 +bfeffffffffffec7 +bfeffffffffffcc7 +bff0000000000063 +bfeffffffffffac7 +bff0000000000163 +c2ba251428a1a825 +c2a3d9f693e16304 +42c49e044d945109 +c29880a59fa2cc55 +42a70de9b913613e +3d108c7a80bddc93 +3d28463d405eee4a +bd0ee70afe8446d9 +3d34231ea02f7725 +bd27b9c2bfa111b6 +3d208c7a80bddc93 +3d38463d405eee4a +bd1ee70afe8446d9 +3d44231ea02f7725 +bd37b9c2bfa111b6 +3ff000000000006c +3ff000000000016c +3feffffffffffed8 +3ff000000000026c +3feffffffffffcd8 +c2c2f1642a88e882 +c2a67f998bae02b3 +42bbb2718bc13e63 +c29a6bc2bfef0a05 +42a448701aa3c2fb +c2d86d8d84f7c9df +c2b81b06da5f9d07 +42c7caa686ecc567 +c2ab7f54ca1af879 +42b32209eb888919 +3d14f5a8b515906f +3d353d6a2d45641c +bd25852ba57537c9 +3d429eb516a2b20e +bd3ac295d2ba9be4 +bfefffffffffff89 +bfeffffffffffd89 +bff00000000000c4 +bfeffffffffffb89 +bff00000000001c4 +c2d131259be2bbbc +c2a9f5c132f25252 +42b4d9f779976eb2 +c29caa4f614d531b +42a21b3b5c7dab8b +3cf1a4b8d15ecf6d +3d2234971a2bd9ee +bd1b96d1cba84c25 +3d311a4b8d15ecf7 +bd2dcb68e5d42612 +3d01a4b8d15ecf6d +3d3234971a2bd9ee +bd2b96d1cba84c25 +3d411a4b8d15ecf7 +bd3dcb68e5d42612 +3ff000000000000b +3ff000000000010b +3feffffffffffe16 +3ff000000000020b +3feffffffffffc16 +c2f73fcc95631e8d +c2aeae2cb50a355a +42b0b818ac4bbf15 +c29f5387f91b1569 +42a05a066bd068b8 +43034ca753a243c5 +c2c0dfd5067fb781 +42be6c711c15f6c7 +c2b06cf081fef1ee +42af312016354d9d +bcea877f1db6080c +3d2e57880e249f7f +bd30d43bf8edb040 +3d3f2bc407124fc0 +bd406a1dfc76d820 +bff0000000000026 +bfeffffffffffe4b +bff0000000000126 +bfeffffffffffc4b +bff0000000000226 +42db46fb7468f012 +c2b2bfdccb416714 +42abe8569ffdad27 +c2a14415e839de56 +429dd06293a2e08b +3d1845e1e7f18b23 +3d2c22f0f3f8c592 +bcfee8786039d373 +3d36117879fc62c9 +bd23dd0f0c073a6e +3d2845e1e7f18b23 +3d3c22f0f3f8c592 +bd0ee8786039d373 +3d46117879fc62c9 +bd33dd0f0c073a6e +3ff00000000000aa +3ff00000000001aa +3fefffffffffff54 +3ff00000000002aa +3feffffffffffd54 +c2b81b6e878d6319 +c2a33bf467cfc9ae +42c7c9dc946ca4d2 +c29806d5c5e8902f +42a7f260182f4602 +c2cc202945f34d1f +c2b4659277d2b4cd +42d28e60069d9615 +c2a8e9e2e46232a0 +42b65c2c32e23671 +3d22343bc1be76c7 +3d391a1de0df3b64 +bd1b97887c831272 +3d448d0ef06f9db2 +bd36e5e21f20c49c +bfefffffffffff0d +bfeffffffffffd0d +bff0000000000087 +bfeffffffffffb0d +bff0000000000187 +c2c0e03aa2e70f90 +c2a5b57b50578afc +42be6bcbfd21f662 +c299de57bce251e4 +42a4f8748c1b7ef5 +3d08452b3716c4d6 +3d26114acdc5b136 +bd13dd6a64749d95 +3d3308a566e2d89b +bd29eeb5323a4eca +3d18452b3716c4d6 +3d36114acdc5b136 +bd23dd6a64749d95 +3d4308a566e2d89b +bd39eeb5323a4eca +3ff0000000000049 +3ff0000000000149 +3feffffffffffe92 +3ff0000000000249 +3feffffffffffc92 +c2cc214393e835d8 +c2a8ea1a431fd261 +42b65bd30134cedd +c29c0424247899eb +42a2a6fd961fd662 +c2e519c67a00d71d +c2bae689a099d185 +42c3be171d28419e +c2ad3ac1c7cf39e8 +42b1ace299056812 +3d0843bdd561383d +3d330877baac2708 +bd29ef108aa7b1f1 +3d41843bdd561384 +bd3cf7884553d8f8 +bfefffffffffffcf +bfeffffffffffdcf +bff00000000000e8 +bfeffffffffffbcf +bff00000000001e8 +c2e51c423eee6fbc +c2ad3b0dff29d9a7 +42b1acaadcc260d6 +c29e8d7ed185718e +42a0cbad04bd85ae +bc46d61b58c99c43 +3d1fff494f2539b3 +bd20005b586d6326 +3d2fffa4a7929cda +bd30002dac36b193 +bc56d61b58c99c43 +3d2fff494f2539b3 +bd30005b586d6326 +3d3fffa4a7929cda +bd40002dac36b193 +3fefffffffffffcf +3ff00000000000e8 +3feffffffffffdcf +3ff00000000001e8 +3feffffffffffbcf +42e51256ab80db15 +c2b1ad89d60be4d0 +42ad39dd2b0fc9d2 +c2a0cc11aef3c723 +429e8cd84b084c3d +42e514d0b07eb8d5 +c2c3bf2d537de760 +42bae587752e30d4 +c2b1ad5215aa1d11 +42ad3a295dc23e22 +bd0849735c376aa4 +3d29eda328f22557 +bd33092e6b86ed54 +3d3cf6d1947912ac +bd41849735c376aa +bfeffffffffffe92 +bfeffffffffffc92 +bff0000000000049 +bfeffffffffffa92 +bff0000000000149 +c2b65d37d898ff8e +c2a2a779bd346847 +42cc1cdae0d28da2 +c29791aa00adc618 +42a8e93ccdedd572 +3d13dbfd02bf10fb +3d29edfe815f887e +bd084805fa81de0a +3d34f6ff40afc43f +bd2612017ea07782 +3d23dbfd02bf10fb +3d39edfe815f887e +bd184805fa81de0a +3d44f6ff40afc43f +bd3612017ea07782 +3ff0000000000087 +3ff0000000000187 +3fefffffffffff0d +3ff0000000000287 +3feffffffffffd0d +c2be6e60a2f7a65a +c2a4f9117b0914e0 +42c0dea44df557a4 +c29956b799ce587b +42a5b4d32c719f71 +c2d2904bada57da5 +c2b65cde9e942d82 +42cc1df4ec6b12e5 +c2aa53c0c46a0427 +42b464fe09c8cdd9 +3d1b94adb917f93e +3d36e52b6e45fe50 +bd2235a923740361 +3d437295b722ff28 +bd391ad491ba01b0 +bfefffffffffff54 +bfeffffffffffd54 +bff00000000000aa +bfeffffffffffb54 +bff00000000001aa +c2c7cd04aed1c70b +c2a7f32cbce1f313 +42b819cfe7bbc1a0 +c29b6554c418246c +42a33b7069b67670 +3cfee2c2d963a10c +3d23dc585b2c7422 +bd18474f49a717bd +3d31ee2c2d963a11 +bd2c23a7a4d38bde +3d0ee2c2d963a10c +3d33dc585b2c7422 +bd28474f49a717bd +3d41ee2c2d963a11 +bd3c23a7a4d38bde +3ff0000000000025 +3ff0000000000125 +3feffffffffffe4b +3ff0000000000225 +3feffffffffffc4b +c2db4f49e76fcb63 +c2abe96c9196def1 +42b2bee1f8cc2eac +c29dd1012c410c04 +42a143ab8b7f317b +c3035d5294871954 +c2be6dbb6f005cb3 +42c0df09dc0731d7 +c2af31cdae87d420 +42b06c903f5727a3 +3cea70a9025d3e70 +3d30d3854812e9f3 +bd2e58f56fda2c19 +3d4069c2a40974fa +bd3f2c7ab7ed160d +bff000000000000b +bfeffffffffffe16 +bff000000000010b +bfeffffffffffc16 +bff000000000020b +42f727c9a91f56aa +c2b0b8e031045408 +42aeacdce551d727 +c2a05a65d5a2744d +429f52d8e89f88c1 +bcf1aa6e583501d4 +3d1b956469f2bf8b +bd22354dcb06a03b +3d2dcab234f95fc5 +bd311aa6e583501d +bd01aa6e583501d4 +3d2b956469f2bf8b +bd32354dcb06a03b +3d3dcab234f95fc5 +bd411aa6e583501d +3fefffffffffff89 +3ff00000000000c4 +3feffffffffffd89 +3ff00000000001c4 +3feffffffffffb89 +42d12dda8a07ec1f +c2b4db2dd25c9218 +42a9f4d0c41801a9 +c2a21bb05a32d523 +429ca9bccb0f5eec +c2c7cc3a941e012f +c2b3228c8ddcd635 +42d86a3a48c7bb90 +c2a7f2f9926d6297 +42b81a378a76f938 +3d2583be43bfab2f +3d3ac1df21dfd597 +bd14f8837880a9a2 +3d4560ef90efeacc +bd353e20de202a69 +bfeffffffffffed8 +bfeffffffffffcd8 +bff000000000006c +bfeffffffffffad8 +bff000000000016c +c2bbb49528fbd191 +c2a44902ea2858ab +42c2ef6438f37bf1 +c298d4890f2ec7f8 +42a67ee4f4267da6 +3d0ee4303b192da6 +3d27b90c0ec64b69 +bd108de7e273692d +3d33dc86076325b5 +bd2846f3f139b497 +3d1ee4303b192da6 +3d37b90c0ec64b69 +bd208de7e273692d +3d43dc86076325b5 +bd3846f3f139b497 +3ff0000000000063 +3ff0000000000163 +3feffffffffffec7 +3ff0000000000263 +3feffffffffffcc7 +c2c4a063448ca840 +c2a70ea7658795e5 +42ba232c7d607594 +c29acd66d217bcb9 +42a3d969fa79a85a +c2db4d35d14d3826 +c2b8bf8a55542c51 +42c6a1aed1270f66 +c2abe92713298fb1 +42b2bf20aaf451ec +3d12c0e3eeb304ee +3d34b038fbacc13b +bd269f8e08a67d89 +3d42581c7dd6609e +bd3b4fc704533ec5 +bfefffffffffff9b +bfeffffffffffd9b +bff00000000000cd +bfeffffffffffb9b +bff00000000001cd +c2d42e9b16d41c07 +c2aab4f20f25ea1c +42b3f47ac8f4301b +c29d1d6288d89fcd +42a1c28ddd3b61de +3cea765e893370d7 +3d21a765e893370d +bd1cb1342ed991e5 +3d30d3b2f4499b87 +bd2e589a176cc8f3 +3cfa765e893370d7 +3d31a765e893370d +bd2cb1342ed991e5 +3d40d3b2f4499b87 +bd3e589a176cc8f3 +3ff0000000000002 +3ff0000000000102 +3feffffffffffe04 +3ff0000000000202 +3feffffffffffc04 +c31d44dcf9dd505a +c2afba9ef67bb72c +42b0234987deda4a +c29fdd29b765a0fa +42a01191648b2fd2 +42f72dc5bca75764 +c2c182cd4ae54ea8 +42bd754b37329701 +c2b0b8ae4e17c5d0 +42aead30d68eb9b3 +bcf616d2a8653209 +3d2d3d25aaf359bf +bd31616d2a865321 +3d3e9e92d579acdf +bd40b0b695432990 +bff000000000002e +bfeffffffffffe5d +bff000000000012e +bfeffffffffffc5d +bff000000000022e +42d615ee14b2d022 +c2b389e92ff232cb +42ab17d4c2d676cf +c2a197da63974d8a +429d57c2e6c948f9 +bd01a900f67f753a +3d172b7f84c04563 +bd246a403d9fdd4f +3d2b95bfc26022b1 +bd3235201ecfeea7 +bd11a900f67f753a +3d272b7f84c04563 +bd346a403d9fdd4f +3d3b95bfc26022b1 +bd4235201ecfeea7 +3ff00000000000a1 +3ff00000000001a1 +3fefffffffffff42 +3ff00000000002a1 +3feffffffffffd42 +c2b96d842dc2b8d3 +c2a3a42250f5e768 +42c593add2eb8582 +c2985779dc25daa9 +42a75836ee210539 +c2cdf097d57267e2 +c2b4dae038c9406f +42d12ead303560bf +c2a940a1f6bd7ca5 +42b5d58a4f69eb86 +3d2119d95e8d3107 +3d388cecaf469883 +bd1dcc4d42e59df2 +3d44467657a34c42 +bd37731350b9677d +bfefffffffffff1f +bfeffffffffffd1f +bff000000000008f +bfeffffffffffb1f +bff000000000018f +c2c2330304640ad8 +c2a63a8e46473e0b +42bc8cc7d51c2015 +c29a3bea42a65482 +42a481dcd0a595ea +3d06106670b43955 +3d2584199c2d0e55 +bd14f7ccc7a5e355 +3d32c20cce16872b +bd2a7be663d2f1ab +3d16106670b43955 +3d3584199c2d0e55 +bd24f7ccc7a5e355 +3d42c20cce16872b +bd3a7be663d2f1ab +3ff0000000000040 +3ff0000000000140 +3feffffffffffe80 +3ff0000000000240 +3feffffffffffc80 +c2d0013fce752afe +c2a999ffe9c17959 +42b554c741410f19 +c29c72064400ed8f +42a248f060567c79 +c2e9ca569f453eef +c2bbb40c39bf3aa5 +42c2efe42b366726 +c2adb2718d286e31 +42b158573ed23f1b +3d03da34489c213b +3d327b4689138427 +bd2b0972edd8f7b1 +3d413da34489c214 +bd3d84b976ec7bd9 +bfefffffffffffe1 +bfeffffffffffde1 +bff00000000000f1 +bfeffffffffffbe1 +bff00000000001f1 +c2f0979924105e5f +c2ae2e56ac3f4138 +42b106b21e913729 +c29f105bb671c63e +42a07f444bb738b9 +bcd1b19140c0c0d5 +3d1ee4e6ebf3f3f3 +bd208d8c8a060607 +3d2f727375f9f9f9 +bd3046c645030303 +bce1b19140c0c0d5 +3d2ee4e6ebf3f3f3 +bd308d8c8a060607 +3d3f727375f9f9f9 +bd4046c645030303 +3fefffffffffffbe +3ff00000000000df +3feffffffffffdbe +3ff00000000001df +3feffffffffffbbe +42deea5c27d6b748 +c2b260b878a472e7 +42ac55813a21ab9f +c2a11b4efe4116a7 +429e0e3d77fd8a03 +42e1d719b82596f6 +c2c49fcb79b88af2 +42ba23a661871544 +c2b20529fc44b40c +42acc63410ae1abd +bd0cb2fce8fc81a5 +3d28d340c5c0df97 +bd33965f9d1f9035 +3d3c69a062e06fcb +bd41cb2fce8fc81a +bfeffffffffffea3 +bfeffffffffffca3 +bff0000000000052 +bfeffffffffffaa3 +bff0000000000152 +c2b77f0877dcffd4 +c2a309677910956c +42c913449f6ffdbe +c297df3e18f71102 +42a842946d8796f3 +3d12c19a9f8dcb3b +3d2960cd4fc6e59d +bd0a7ccac0e4698b +3d34b066a7e372cf +bd269f32b0391a63 +3d22c19a9f8dcb3b +3d3960cd4fc6e59d +bd1a7ccac0e4698b +3d44b066a7e372cf +bd369f32b0391a63 +3ff000000000007e +3ff000000000017e +3feffffffffffefc +3ff000000000027e +3feffffffffffcfc +c2c0487b15752fca +c2a5752be29992ac +42bf73fe4e659fc3 +c299b078583d1a87 +42a535dcb7a0167c +c2d42d787a6784ca +c2b6ea2eba1f8d15 +42ca82d67eb70287 +c2aab4b26f9d8007 +42b3f4c1d4e7996b +3d195fe8f2b56dbd +3d3657fa3cad5b6f +bd23500b86a54921 +3d432bfd1e56adb8 +bd39a805c352a491 +bfefffffffffff66 +bfeffffffffffd66 +bff00000000000b3 +bfeffffffffffb66 +bff00000000001b3 +c2ca8549af275387 +c2a8958adc85a12b +42b6e944901d39bf +c29bce5dcf3d10e8 +42a2d782892052c3 +3cfa79394c9e8a0a +3d234f272993d141 +bd1961b1acd85d7d +3d31a79394c9e8a1 +bd2cb0d8d66c2ebf +3d0a79394c9e8a0a +3d334f272993d141 +bd2961b1acd85d7d +3d41a79394c9e8a1 +bd3cb0d8d66c2ebf +3ff000000000001d +3ff000000000011d +3feffffffffffe39 +3ff000000000021d +3feffffffffffc39 +c2e1db8a7b8f4d1c +c2acc6ecba13547c +42b204992af4d766 +c29e4d95fb96b2c7 +42a0f2fa0a8e83e7 +c31d1ed8f24d0a1a +c2bf75b7a651e6a4 +42c0478e9e81029b +c2afba45297673df +42b02377feeeb4f0 +3cd195059e91c4d2 +3d304654167a4713 +bd2f7357d30b71d9 +3d40232a0b3d238a +bd3fb9abe985b8ed +bff0000000000014 +bfeffffffffffe28 +bff0000000000114 +bfeffffffffffc28 +bff0000000000214 +42e9c11498b9ef53 +c2b158dd72ac907b +42adb1ace4f70936 +c2a0a5777bd11b46 +429ecdce296f868f +bcf613f7e4fa18d6 +3d1a7b0206c179cb +bd22c27efc9f431b +3d2d3d810360bce5 +bd31613f7e4fa18d +bd0613f7e4fa18d6 +3d2a7b0206c179cb +bd32c27efc9f431b +3d3d3d810360bce5 +bd41613f7e4fa18d +3fefffffffffff77 +3ff00000000000bc +3feffffffffffd77 +3ff00000000001bc +3feffffffffffb77 +42cded78896f0dea +c2b5d65ef959fc88 +42a94013c3bbf3e9 +c2a277e9b93a8cee +429c3a2de3156dae +c2c91575b45f58dd +c2b389a514cc37ad +42d6174a427165ee +c2a84317b138f411 +42b77e1245534015 +3d24695be08e656e +3d3a34adf04732b7 +bd172d483ee33523 +3d451a56f823995c +bd35cb520fb8cd49 +bfeffffffffffeea +bfeffffffffffcea +bff0000000000075 +bfeffffffffffaea +bff0000000000175 +c2bd76ce5837e002 +c2a4bd056806b955 +42c181bbd3bcd516 +c2992ab2b154fc9c +42a5f6a4a5939186 +3d0caf6b74b6a225 +3d272bdadd2da889 +bd11a84a45a4aeee +3d3395ed6e96d445 +bd28d42522d25777 +3d1caf6b74b6a225 +3d372bdadd2da889 +bd21a84a45a4aeee +3d4395ed6e96d445 +bd38d42522d25777 +3ff000000000005a +3ff000000000015a +3feffffffffffeb5 +3ff000000000025a +3feffffffffffcb5 +c2c6a377da4b1a34 +c2a7a4fec60c17e5 +42b8be7933c7c5e3 +c29b31e724b23fdd +42a36f09d8048641 +c2def106c3daf7b4 +c2b96d10d5114cb0 +42c59453f6d08e20 +c2ac56344803651c +42b26021d93f523f +3d108c1f2850796d +3d342307ca141e5b +bd27b9f06bd7c34a +3d421183e50a0f2e +bd3bdcf835ebe1a5 +bfefffffffffffac +bfeffffffffffdac +bff00000000000d6 +bfeffffffffffbac +bff00000000001d6 +c2d86e62783f9806 +c2ab7f76839f7e78 +42b321e9440a26f2 +c29d9420541a218d +42a16d34ad43f507 +3ce1a34b6fa942d3 +3d211a34b6fa942d +bd1dcb96920ad7a6 +3d308d1a5b7d4a17 +bd2ee5cb49056bd3 +3cf1a34b6fa942d3 +3d311a34b6fa942d +bd2dcb96920ad7a6 +3d408d1a5b7d4a17 +bd3ee5cb49056bd3 +3feffffffffffff3 +3ff00000000000f9 +3feffffffffffdf3 +3ff00000000001f9 +3feffffffffffbf3 +43034880fe55b594 +c2b06d089359338b +42af30f4b14e8dac +c2a035ccf9113d38 +429f972728c900fe +42f08ff00a6d180f +c2c2328cd89385e6 +42bc8d5943bedcd5 +c2b107336e8dcc65 +42ae2d8b8de0949b +bcfee9e5c1ef600d +3d2c22c347c213fe +bd31ee9e5c1ef601 +3d3e1161a3e109ff +bd40f74f2e0f7b00 +bff0000000000037 +bfeffffffffffe6e +bff0000000000137 +bfeffffffffffc6e +bff0000000000237 +42d28de52cc057a1 +c2b465b794a6c5f2 +42aa53263528e7eb +c2a1eedb629edc5a +429ce2e418fa2d88 +3d16111d218effa2 +3d2b088e90c77fd1 +bd03ddc5bce200bb +3d3584474863bfe9 +bd24f7716f38802f +3d26111d218effa2 +3d3b088e90c77fd1 +bd13ddc5bce200bb +3d4584474863bfe9 +bd34f7716f38802f +3ff0000000000098 +3ff0000000000198 +3fefffffffffff31 +3ff0000000000298 +3feffffffffffd31 +c2bae6ca2e7b263d +c2a410d12a82ed5f +42c3bdd1945bb1ab +c298aa4273175718 +42a6c59df0e60caa +c2d0008909399b77 +c2b555923ba16ea1 +42cffeedffe24705 +c2a999c5726b1fad +42b555187064e68d +3d1ffeedf6b7d68d +3d37ffbb7dadf5a3 +bd20008904a414ba +3d43ffddbed6fad2 +bd38004482520a5d +bfefffffffffff31 +bfeffffffffffd31 +bff0000000000098 +bfeffffffffffb31 +bff0000000000198 +c2c3bf72e5dc8f73 +c2a6c628ba5a3a3a +42bae546ed5989a8 +c29a9c2b6e1b53f0 +42a410656cd4c776 +3d03dba1aa51add5 +3d24f6e86a946b75 +bd16122f2ad72916 +3d327b74354a35bb +bd2b0917956b948b +3d13dba1aa51add5 +3d34f6e86a946b75 +bd26122f2ad72916 +3d427b74354a35bb +bd3b0917956b948b +3ff0000000000037 +3ff0000000000137 +3feffffffffffe6e +3ff0000000000237 +3feffffffffffc6e +c2d290c6a74eaab2 +c2aa53dfaeb73b74 +42b464d8ef97dd20 +c29ce353c14238f8 +42a1ee855425ac98 +c2f09487d9de9e79 +c2bc8e33748d6385 +42c231dba217b79e +c2ae2e056b9e1641 +42b106e5d73dc1aa +3cfee15577ae1472 +3d31ee15577ae147 +bd2c23d5510a3d72 +3d40f70aabbd70a4 +bd3e11eaa8851eb9 +bfeffffffffffff3 +bfeffffffffffdf3 +bff00000000000f9 +bfeffffffffffbf3 +bff00000000001f9 +c3036181e57c1de1 +c2af31f915ca6149 +42b06c782f5d7e0c +c29f97acb38161f5 +42a03586a82eefc4 +bce1abdbb9ea8e6e +3d1dca8488c2ae32 +bd211abdbb9ea8e7 +3d2ee54244615719 +bd308d5eddcf5473 +bcf1abdbb9ea8e6e +3d2dca8488c2ae32 +bd311abdbb9ea8e7 +3d3ee54244615719 +bd408d5eddcf5473 +3fefffffffffffac +3ff00000000000d6 +3feffffffffffdac +3ff00000000001d6 +3feffffffffffbac +42d869659df01ce1 +c2b322ad3788a5c1 +42ab7eac2f5d14f1 +c2a16d85f3fb092c +429d93ab44cdf7dc +42deed06745e798e +c2c5954d3f663377 +42b96c63d7b11b62 +c2b2607c37ba1940 +42ac55c8d8393636 +bd108e433ae0cc54 +3d27b8de628f99d6 +bd342390ceb83315 +3d3bdc6f3147cceb +bd4211c8675c198a +bfeffffffffffeb5 +bfeffffffffffcb5 +bff000000000005a +bfeffffffffffab5 +bff000000000015a +c2b8bfc0f8770d23 +c2a36f6eebeac836 +42c6a1537192f349 +c2982ed78d12b852 +42a7a4692cdd1ae6 +3d11a7383c5c857a +3d28d39c1e2e42bd +bd0cb18f8746f50c +3d3469ce0f17215f +bd272c63e1d1bd43 +3d21a7383c5c857a +3d38d39c1e2e42bd +bd1cb18f8746f50c +3d4469ce0f17215f +bd372c63e1d1bd43 +3ff0000000000075 +3ff0000000000175 +3feffffffffffeea +3ff0000000000275 +3feffffffffffcea +c2c1830400550e01 +c2a5f725c0d7af29 +42bd74fdcef63df8 +c29a0cbdd75332ab +42a4bc925229493b +c2d61954d77e7cef +c2c28fb1fe84b509 +42ecfcba34327cf6 +c2b77ea5fad4500f +42c9142502719ea0 +3d172b242c52e23c +3d2b95921629711e +bd01a9b7a75a3b87 +3d35cac90b14b88f +bd246a6de9d68ee2 +bfefffffffffff77 +bfeffffffffffe77 +bff000000000003c +bfeffffffffffd77 +bff00000000000bc +c2cdf137c576dbf5 +c2b4db07054aba31 +42d12e43da98f822 +c2a940be6817973d +42b5d55fc8f7bd45 +3cf60fafbfd97309 +3d1583ebeff65cc2 +bd04f8282013467c +3d22c1f5f7fb2e61 +bd1a7c141009a33e +3d060fafbfd97309 +3d2583ebeff65cc2 +bd14f8282013467c +3d32c1f5f7fb2e61 +bd2a7c141009a33e +3ff0000000000014 +3ff0000000000094 +3fefffffffffff28 +3ff0000000000114 +3feffffffffffe28 +c2e9cc316d1b406a +c2bbb450b0b4512a +42c2efa4313cd186 +c2adb298e337b1ff +42b1583c689fc0a0 +431ce68aaa3e454f +c2d092ce9faf99e6 +42ceee066f66c22a +c2c0481c7c41a83d +42bf74aed2293e70 +bcd1b746c796f33c +3d1ee48b938690cc +bd208dba363cb79a +3d2f7245c9c34866 +bd3046dd1b1e5bcd +bfefffffffffff39 +bfeffffffffffe39 +bff000000000001d +bfeffffffffffd39 +bff000000000009d +c2c4a0175e0b5238 +c2b20546f405a1e4 +42e1d636a1b107bb +c2a70e8faf4e6243 +42ba23696ee5aabd +3d02c13f47206814 +3d19609fa390340a +bcfa7d8171bf2fd8 +3d24b04fd1c81a05 +bd169f605c6fcbf6 +3d12c13f47206814 +3d29609fa390340a +bd0a7d8171bf2fd8 +3d34b04fd1c81a05 +bd269f605c6fcbf6 +3ff0000000000033 +3ff00000000000b3 +3fefffffffffff65 +3ff0000000000133 +3feffffffffffe65 +c2d42e09c4878993 +c2b6ea5d91919ecc +42ca82591c8813eb +c2aab4d23f3bd084 +42b3f49e4eaea85b +c2f35819f93f1699 +c2ca844ec111d738 +42d42bc4cd0be380 +c2bd00639a2056d3 +42c1d8521be9cd71 +3cfa77cbeae8fd71 +3d234ef97d5d1fae +bd19620d0545c0a4 +3d31a77cbeae8fd7 +bd2cb10682a2e052 +bfeffffffffffffc +bfeffffffffffefc +bff000000000007e +bfeffffffffffdfc +bff00000000000fe +c31d31ce95f57458 +c2bf760ff0e91a0e +42c0475f56bb7cd8 +c2afba720fb98b06 +42b02360c345558c +3d0a7aa6ae5416a4 +3d1d3d53572a0b52 +bce6156546afa570 +3d269ea9ab9505a9 +bd12c2aca8d5f4ae +3d1a7aa6ae5416a4 +3d2d3d53572a0b52 +bcf6156546afa570 +3d369ea9ab9505a9 +bd22c2aca8d5f4ae +3ff0000000000052 +3ff00000000000d2 +3fefffffffffffa3 +3ff0000000000152 +3feffffffffffea3 +c2c915e5f787c151 +c2b389c72223db6a +42d6169c263604bb +c2a84331f2a07c3b +42b77de10a6f9bba +c2e1d9c3831d5548 +c2c618d2292d850d +42dcfe7c0a227d8b +c2ba245d4014e2b9 +42c49ee7d9d69ce7 +3d0caeb4c3dbdbd8 +3d272bad30f6f6f6 +bd11a8a59e121214 +3d3395d6987b7b7b +bd28d452cf09090a +bfefffffffffffbe +bfeffffffffffebe +bff000000000005f +bfeffffffffffdbe +bff00000000000df +c2def25c6e9830cb +c2b96d4a80e73254 +42c59400e39e3d91 +c2ac565818a68260 +42b26003ba8690b7 +3cd1a070ac3e29a0 +3d111a070ac3e29a +bd0dcbf1ea783acc +3d208d038561f14d +bd1ee5f8f53c1d66 +3ce1a070ac3e29a0 +3d211a070ac3e29a +bd1dcbf1ea783acc +3d308d038561f14d +bd2ee5f8f53c1d66 +3fefffffffffffe1 +3ff0000000000071 +3feffffffffffee1 +3ff00000000000f1 +3feffffffffffde1 +42f08e68ab52f548 +c2c232c7edbbf24d +42bc8d108bb44b75 +c2b1074d4c45a107 +42ae2d62ef7c1de8 +c2d73424f6148ec1 +c2c2f0a423455376 +42e9c4c7cf0be22e +c2b7cbbc4a3c7bdb +42c86b4432b0d2b2 +3d1610c1c9219c7c +3d2b0860e490ce3e +bd03de7c6dbcc708 +3d3584307248671f +bd24f79f1b6f31c2 +bfefffffffffff80 +bfeffffffffffe80 +bff0000000000040 +bfeffffffffffd80 +bff00000000000c0 +c2d000e469cd8c32 +c2b555bad5eaab13 +42cffe375f526202 +c2a999e2adf4eb27 +42b554efd885bccb +3cf3daeaf976e788 +3d14f6babe5db9e2 +bd06128a83448c3c +3d227b5d5f2edcf1 +bd1b094541a2461e +3d03daeaf976e788 +3d24f6babe5db9e2 +bd16128a83448c3c +3d327b5d5f2edcf1 +bd2b094541a2461e +3ff000000000000f +3ff000000000008f +3fefffffffffff1f +3ff000000000010f +3feffffffffffe1f +c2f096105aa868db +c2bc8e7c3261fb77 +42c231a092ed69dd +c2ae2e2e0bb7fbbc +42b106cbfac03525 +430cf489c89f8067 +c2d12fe94f526646 +42cdeeb82d6e4829 +c2c092851ee812ba +42beee8673201bb2 +bce1aeb67d55a7a1 +3d1dca2930554b0c +bd211aeb67d55a7a +3d2ee514982aa586 +bd308d75b3eaad3d +bfefffffffffff42 +bfeffffffffffe42 +bff0000000000021 +bfeffffffffffd42 +bff00000000000a1 +c2c595a05c9806b3 +c2b2609a57fde2b6 +42deebb13f66acbe +c2a758c8c90f2aef +42b96c2a2ff173a5 +3d01a6dce3ef2254 +3d18d36e71f7912a +bcfcb2463821bb58 +3d2469b738fbc895 +bd172c918e086ed6 +3d11a6dce3ef2254 +3d28d36e71f7912a +bd0cb2463821bb58 +3d3469b738fbc895 +bd272c918e086ed6 +3ff000000000002e +3ff00000000000ae +3fefffffffffff5d +3ff000000000012e +3feffffffffffe5d +c2d61a031ea478f0 +c2b77ed738f171eb +42c913b4cefadb5b +c2ab1899387d647c +42b3891ce4107c93 +c2f736c5a91c38f7 +c2cb4be96c967e7d +42d354b6b027f7f2 +c2bd76337970db1c +42c182293298c3eb +3cf60e425e23e66f +3d22c1c84bc47cce +bd1a7c6f68770664 +3d3160e425e23e67 +bd2d3e37b43b8332 +bff0000000000002 +bfefffffffffff04 +bff0000000000082 +bfeffffffffffe04 +bff0000000000102 +431cd3f62b68c952 +c2c0484bc8520566 +42bf74568f4fcb6a +c2b023d4f0313259 +42afb9919560bf23 +bcea7eeed374bc71 +3d0960444b22d0e4 +bd134fddda6e978e +3d1cb02225916872 +bd21a7eeed374bc7 +bcfa7eeed374bc71 +3d1960444b22d0e4 +bd234fddda6e978e +3d2cb02225916872 +bd31a7eeed374bc7 +3ff000000000004d +3ff00000000000cd +3fefffffffffff9a +3ff000000000014d +3feffffffffffe9a +c2ca84cc35cafc52 +c2b3f54ff2bc4a8f +42d42b33a39730d5 +c2a8956fe7b6e3f6 +42b6e97363d203ab +c2e356898a5d9a65 +c2c6a2c1012f70ea +42db4a1847e3bef1 +c2ba83f0ac91ecaf +42c42c31b17ecdbd +3d0a79effd795057 +3d269e7bff5e5416 +bd12c308014357d4 +3d334f3dffaf2a0b +bd29618400a1abea +bfefffffffffffc7 +bfeffffffffffec7 +bff0000000000063 +bfeffffffffffdc7 +bff00000000000e3 +c2e1daa6f403d9d9 +c2ba249a37277065 +42c49e9bfe3d1fe6 +c2acc6c7caa7dff5 +42b204b620e432e6 +3cc19abb2567f739 +3d108cd5d92b3fba +bd0ee6544da9808c +3d20466aec959fdd +bd1f732a26d4c046 +3cd19abb2567f739 +3d208cd5d92b3fba +bd1ee6544da9808c +3d30466aec959fdd +bd2f732a26d4c046 +3fefffffffffffd8 +3ff000000000006c +3feffffffffffed8 +3ff00000000000ec +3feffffffffffdd8 +42e9c2ee11dffe80 +c2c2f0e424009472 +42bbb2fa6b223f6e +c2b158c29adac4a7 +42adb1d438fd5864 +c2d86cb8a02fc7af +c2c355a012409e4d +42e73184db46efb2 +c2b81ad305171f76 +42c7cb0b8532b50a +3d14f65f65f056bb +3d2a7b2fb2f82b5e +bd061341341f5289 +3d353d97d97c15af +bd2584d04d07d4a2 +bfefffffffffff89 +bfeffffffffffe89 +bff0000000000044 +bfeffffffffffd89 +bff00000000000c4 +c2d13052b91fe18b +c2b5d6346fab5e6d +42cdee18581942c6 +c2a9f585159a2bc5 +42b4da450c66c7e8 +3cf1a62633145c07 +3d1469898cc51702 +bd072cece675d1fd +3d2234c4c6628b81 +bd1b9676733ae8fe +3d01a62633145c07 +3d2469898cc51702 +bd172cece675d1fd +3d3234c4c6628b81 +bd2b9676733ae8fe +3ff000000000000b +3ff000000000008b +3fefffffffffff16 +3ff000000000010b +3feffffffffffe16 +c2f739c7306010b7 +c2bd7680e808d941 +42c181f2827ffd13 +c2aeadd8be6ada10 +42b0b84a8bbb85bd +430350cf728b737e +c2d1d918fd4aa600 +42ccff5d098eaa2a +c2c0dfa23a16e0f7 +42be6cc3ae302e3c +bcea81c996dfd5a5 +3d1cafc6cd24054b +bd21a81c996dfd5a +3d2e57e3669202a6 +bd30d40e4cb6fead +bfefffffffffff4b +bfeffffffffffe4b +bff0000000000026 +bfeffffffffffd4b +bff00000000000a6 +c2c6a31c6c4c0a3d +c2b2bf9e142eddaf +42db490e97dc4168 +c2a7a4e5d6ab7579 +42b8beafd234bc48 +3d008c7a80bddc93 +3d18463d405eee4a +bcfee70afe8446d9 +3d24231ea02f7725 +bd17b9c2bfa111b6 +3d108c7a80bddc93 +3d28463d405eee4a +bd0ee70afe8446d9 +3d34231ea02f7725 +bd27b9c2bfa111b6 +3ff000000000002a +3ff00000000000aa +3fefffffffffff54 +3ff000000000012a +3feffffffffffe54 +c2d86d8d84f7c9df +c2b81b06da5f9d07 +42c7caa686ecc567 +c2ab7f54ca1af879 +42b32209eb888919 +c2fd04ef42e7cf0e +c2cc1f9c27458890 +42d28edae6d5d46a +c2bdefcff2cf58ad +42c12f30e2516b19 +3cf1a4b8d15ecf6d +3d2234971a2bd9ee +bd1b96d1cba84c25 +3d311a4b8d15ecf7 +bd2dcb68e5d42612 +bff0000000000007 +bfefffffffffff0d +bff0000000000087 +bfeffffffffffe0d +bff0000000000107 +43034ca753a243c5 +c2c0dfd5067fb781 +42be6c711c15f6c7 +c2b06cf081fef1ee +42af312016354d9d +3d0845e1e7f18b23 +3d1c22f0f3f8c592 +bceee8786039d373 +3d26117879fc62c9 +bd13dd0f0c073a6e +3d1845e1e7f18b23 +3d2c22f0f3f8c592 +bcfee8786039d373 +3d36117879fc62c9 +bd23dd0f0c073a6e +3ff0000000000049 +3ff00000000000c9 +3fefffffffffff92 +3ff0000000000149 +3feffffffffffe92 +c2cc202945f34d1f +c2b4659277d2b4cd +42d28e60069d9615 +c2a8e9e2e46232a0 +42b65c2c32e23671 +c2e51888cf9f1056 +c2c73394e3875480 +42d9c62b4999725c +c2bae64913ee4a88 +42c3be5ca7deadf0 +3d08452b3716c4d6 +3d26114acdc5b136 +bd13dd6a64749d95 +3d3308a566e2d89b +bd29eeb5323a4eca +bfefffffffffffcf +bfeffffffffffecf +bff0000000000068 +bfeffffffffffdcf +bff00000000000e8 +c2e519c67a00d71d +c2bae689a099d185 +42c3be171d28419e +c2ad3ac1c7cf39e8 +42b1ace299056812 +bc36d61b58c99c43 +3d0fff494f2539b3 +bd10005b586d6326 +3d1fffa4a7929cda +bd20002dac36b193 +bc46d61b58c99c43 +3d1fff494f2539b3 +bd20005b586d6326 +3d2fffa4a7929cda +bd30002dac36b193 +3fefffffffffffcf +3ff0000000000068 +3feffffffffffecf +3ff00000000000e8 +3feffffffffffdcf +42e514d0b07eb8d5 +c2c3bf2d537de760 +42bae587752e30d4 +c2b1ad5215aa1d11 +42ad3a295dc23e22 +c2d9c8057df2d4f2 +c2c3bee7c3096c97 +42e5160deae496b3 +c2b86bfe63e4711c +42c732d4d5a9b8c2 +3d13dbfd02bf10fb +3d29edfe815f887e +bd084805fa81de0a +3d34f6ff40afc43f +bd2612017ea07782 +bfefffffffffff92 +bfeffffffffffe92 +bff0000000000049 +bfeffffffffffd92 +bff00000000000c9 +c2d2904bada57da5 +c2b65cde9e942d82 +42cc1df4ec6b12e5 +c2aa53c0c46a0427 +42b464fe09c8cdd9 +3ceee2c2d963a10c +3d13dc585b2c7422 +bd08474f49a717bd +3d21ee2c2d963a11 +bd1c23a7a4d38bde +3cfee2c2d963a10c +3d23dc585b2c7422 +bd18474f49a717bd +3d31ee2c2d963a11 +bd2c23a7a4d38bde +3ff0000000000007 +3ff0000000000087 +3fefffffffffff0d +3ff0000000000107 +3feffffffffffe0d +c3035d5294871954 +c2be6dbb6f005cb3 +42c0df09dc0731d7 +c2af31cdae87d420 +42b06c903f5727a3 +42fcfb8e6e8677f2 +c2d28fd0ba5949da +42cc1e81fa81beaf +c2c12f9a4348b762 +42bdef3011ce654e +bcf1aa6e583501d4 +3d1b956469f2bf8b +bd22354dcb06a03b +3d2dcab234f95fc5 +bd311aa6e583501d +bfefffffffffff54 +bfeffffffffffe54 +bff000000000002a +bfeffffffffffd54 +bff00000000000aa +c2c7cc3a941e012f +c2b3228c8ddcd635 +42d86a3a48c7bb90 +c2a7f2f9926d6297 +42b81a378a76f938 +3cfee4303b192da6 +3d17b90c0ec64b69 +bd008de7e273692d +3d23dc86076325b5 +bd1846f3f139b497 +3d0ee4303b192da6 +3d27b90c0ec64b69 +bd108de7e273692d +3d33dc86076325b5 +bd2846f3f139b497 +3ff0000000000026 +3ff00000000000a6 +3fefffffffffff4b +3ff0000000000126 +3feffffffffffe4b +c2db4d35d14d3826 +c2b8bf8a55542c51 +42c6a1aed1270f66 +c2abe92713298fb1 +42b2bf20aaf451ec +c303592511d4704f +c2cd00891e0274ba +42d1d835b3fca1a1 +c2be6d68d7a552f0 +42c0df3ca4daa8ec +3cea765e893370d7 +3d21a765e893370d +bd1cb1342ed991e5 +3d30d3b2f4499b87 +bd2e589a176cc8f3 +bff000000000000b +bfefffffffffff16 +bff000000000008b +bfeffffffffffe16 +bff000000000010b +42f72dc5bca75764 +c2c182cd4ae54ea8 +42bd754b37329701 +c2b0b8ae4e17c5d0 +42aead30d68eb9b3 +bcf1a900f67f753a +3d072b7f84c04563 +bd146a403d9fdd4f +3d1b95bfc26022b1 +bd2235201ecfeea7 +bd01a900f67f753a +3d172b7f84c04563 +bd246a403d9fdd4f +3d2b95bfc26022b1 +bd3235201ecfeea7 +3ff0000000000044 +3ff00000000000c4 +3fefffffffffff89 +3ff0000000000144 +3feffffffffffe89 +c2cdf097d57267e2 +c2b4dae038c9406f +42d12ead303560bf +c2a940a1f6bd7ca5 +42b5d58a4f69eb86 +c2e734850654cfc0 +c2c7cbd58bcb2844 +42d86b0f02193b44 +c2bb4b85baf0422f +42c3551ab2ee488a +3d06106670b43955 +3d2584199c2d0e55 +bd14f7ccc7a5e355 +3d32c20cce16872b +bd2a7be663d2f1ab +bfefffffffffffd8 +bfeffffffffffed8 +bff000000000006c +bfeffffffffffdd8 +bff00000000000ec +c2e9ca569f453eef +c2bbb40c39bf3aa5 +42c2efe42b366726 +c2adb2718d286e31 +42b158573ed23f1b +bcc1b19140c0c0d5 +3d0ee4e6ebf3f3f3 +bd108d8c8a060607 +3d1f727375f9f9f9 +bd2046c645030303 +bcd1b19140c0c0d5 +3d1ee4e6ebf3f3f3 +bd208d8c8a060607 +3d2f727375f9f9f9 +bd3046c645030303 +3fefffffffffffc7 +3ff0000000000063 +3feffffffffffec7 +3ff00000000000e3 +3feffffffffffdc7 +42e1d719b82596f6 +c2c49fcb79b88af2 +42ba23a661871544 +c2b20529fc44b40c +42acc63410ae1abd +c2db4c2be499eb73 +c2c42cc2e93d191a +42e3547405e2979d +c2b8bf53b32286dd +42c6a20a339d166e +3d12c19a9f8dcb3b +3d2960cd4fc6e59d +bd0a7ccac0e4698b +3d34b066a7e372cf +bd269f32b0391a63 +bfefffffffffff9b +bfeffffffffffe9b +bff000000000004d +bfeffffffffffd9b +bff00000000000cd +c2d42d787a6784ca +c2b6ea2eba1f8d15 +42ca82d67eb70287 +c2aab4b26f9d8007 +42b3f4c1d4e7996b +3cea79394c9e8a0a +3d134f272993d141 +bd0961b1acd85d7d +3d21a79394c9e8a1 +bd1cb0d8d66c2ebf +3cfa79394c9e8a0a +3d234f272993d141 +bd1961b1acd85d7d +3d31a79394c9e8a1 +bd2cb0d8d66c2ebf +3ff0000000000002 +3ff0000000000082 +3fefffffffffff04 +3ff0000000000102 +3feffffffffffe04 +c31d1ed8f24d0a1a +c2bf75b7a651e6a4 +42c0478e9e81029b +c2afba45297673df +42b02377feeeb4f0 +42f730c4ef8d018e +c2d355c16b34bf5d +42cb4adf992d4e66 +c2c1829696cb6033 +42bd7598a105c684 +bcf613f7e4fa18d6 +3d1a7b0206c179cb +bd22c27efc9f431b +3d2d3d810360bce5 +bd31613f7e4fa18d +bfefffffffffff5d +bfeffffffffffe5d +bff000000000002e +bfeffffffffffd5d +bff00000000000ae +c2c91575b45f58dd +c2b389a514cc37ad +42d6174a427165ee +c2a84317b138f411 +42b77e1245534015 +3cfcaf6b74b6a225 +3d172bdadd2da889 +bd01a84a45a4aeee +3d2395ed6e96d445 +bd18d42522d25777 +3d0caf6b74b6a225 +3d272bdadd2da889 +bd11a84a45a4aeee +3d3395ed6e96d445 +bd28d42522d25777 +3ff0000000000021 +3ff00000000000a1 +3fefffffffffff42 +3ff0000000000121 +3feffffffffffe42 +c2def106c3daf7b4 +c2b96d10d5114cb0 +42c59453f6d08e20 +c2ac56344803651c +42b26021d93f523f +c30d07486ad8df41 +c2cdeff7ec1a6fd7 +42d12f168add82c0 +c2beef3129326d24 +42c0922321d41e84 +3ce1a34b6fa942d3 +3d211a34b6fa942d +bd1dcb96920ad7a6 +3d308d1a5b7d4a17 +bd2ee5cb49056bd3 +bff000000000000f +bfefffffffffff1f +bff000000000008f +bfeffffffffffe1f +bff000000000010f +42f08ff00a6d180f +c2c2328cd89385e6 +42bc8d5943bedcd5 +c2b107336e8dcc65 +42ae2d8b8de0949b +3d06111d218effa2 +3d1b088e90c77fd1 +bcf3ddc5bce200bb +3d2584474863bfe9 +bd14f7716f38802f +3d16111d218effa2 +3d2b088e90c77fd1 +bd03ddc5bce200bb +3d3584474863bfe9 +bd24f7716f38802f +3ff0000000000040 +3ff00000000000c0 +3fefffffffffff80 +3ff0000000000140 +3feffffffffffe80 +c2d0008909399b77 +c2b555923ba16ea1 +42cffeedffe24705 +c2a999c5726b1fad +42b555187064e68d +c2e9c87c15afd250 +c2c86c18fe1cbfe0 +42d732a4d4231a9c +c2bbb3c7c41c8436 +42c2f02426e04df0 +3d03dba1aa51add5 +3d24f6e86a946b75 +bd16122f2ad72916 +3d327b74354a35bb +bd2b0917956b948b +bfefffffffffffe1 +bfeffffffffffee1 +bff0000000000071 +bfeffffffffffde1 +bff00000000000f1 +c2f09487d9de9e79 +c2bc8e33748d6385 +42c231dba217b79e +c2ae2e056b9e1641 +42b106e5d73dc1aa +bcd1abdbb9ea8e6e +3d0dca8488c2ae32 +bd111abdbb9ea8e7 +3d1ee54244615719 +bd208d5eddcf5473 +bce1abdbb9ea8e6e +3d1dca8488c2ae32 +bd211abdbb9ea8e7 +3d2ee54244615719 +bd308d5eddcf5473 +3fefffffffffffbe +3ff000000000005f +3feffffffffffebe +3ff00000000000df +3feffffffffffdbe +42deed06745e798e +c2c5954d3f663377 +42b96c63d7b11b62 +c2b2607c37ba1940 +42ac55c8d8393636 +c2dd00d426e9de97 +c2c49f7f97943a5b +42e1d7fce531940d +c2b914e965f1b34e +42c61823f4d02062 +3d11a7383c5c857a +3d28d39c1e2e42bd +bd0cb18f8746f50c +3d3469ce0f17215f +bd272c63e1d1bd43 +bfefffffffffffa3 +bfefffffffffff23 +bff0000000000012 +bfeffffffffffea3 +bff0000000000052 +c2d61954d77e7cef +c2c28fb1fe84b509 +42ecfcba34327cf6 +c2b77ea5fad4500f +42c9142502719ea0 +3ce60fafbfd97309 +3d0583ebeff65cc2 +bcf4f8282013467c +3d12c1f5f7fb2e61 +bd0a7c141009a33e +3cf60fafbfd97309 +3d1583ebeff65cc2 +bd04f8282013467c +3d22c1f5f7fb2e61 +bd1a7c141009a33e +3feffffffffffffc +3ff000000000003e +3fefffffffffff7c +3ff000000000007e +3feffffffffffefc +431ce68aaa3e454f +c2d092ce9faf99e6 +42ceee066f66c22a +c2c0481c7c41a83d +42bf74aed2293e70 +c2eb4cb0d86bfa59 +c2d42ce738735d24 +42f353eeb6bb1d14 +c2c8bf6f041d328f +42d6a1dc8205d35e +3d02c13f47206814 +3d19609fa390340a +bcfa7d8171bf2fd8 +3d24b04fd1c81a05 +bd169f605c6fcbf6 +bfefffffffffffe6 +bfefffffffffff66 +bff0000000000033 +bfeffffffffffee6 +bff0000000000073 +c2f35819f93f1699 +c2ca844ec111d738 +42d42bc4cd0be380 +c2bd00639a2056d3 +42c1d8521be9cd71 +3cfa7aa6ae5416a4 +3d0d3d53572a0b52 +bcd6156546afa570 +3d169ea9ab9505a9 +bd02c2aca8d5f4ae +3d0a7aa6ae5416a4 +3d1d3d53572a0b52 +bce6156546afa570 +3d269ea9ab9505a9 +bd12c2aca8d5f4ae +3ff000000000001d +3ff000000000005d +3fefffffffffffb9 +3ff000000000009d +3fefffffffffff39 +c2e1d9c3831d5548 +c2c618d2292d850d +42dcfe7c0a227d8b +c2ba245d4014e2b9 +42c49ee7d9d69ce7 +c31d0bfbdecaa5fe +c2ddf047dff0e30b +42e12ee1dce7f4c6 +c2ceef5bd7dd6f0b +42d0920aa3442f32 +3cd1a070ac3e29a0 +3d111a070ac3e29a +bd0dcbf1ea783acc +3d208d038561f14d +bd1ee5f8f53c1d66 +bfefffffffffffa8 +bfefffffffffff28 +bff0000000000014 +bfeffffffffffea8 +bff0000000000054 +c2d73424f6148ec1 +c2c2f0a423455376 +42e9c4c7cf0be22e +c2b7cbbc4a3c7bdb +42c86b4432b0d2b2 +3ce3daeaf976e788 +3d04f6babe5db9e2 +bcf6128a83448c3c +3d127b5d5f2edcf1 +bd0b094541a2461e +3cf3daeaf976e788 +3d14f6babe5db9e2 +bd06128a83448c3c +3d227b5d5f2edcf1 +bd1b094541a2461e +3feffffffffffff7 +3ff000000000003c +3fefffffffffff77 +3ff000000000007c +3feffffffffffef7 +430cf489c89f8067 +c2d12fe94f526646 +42cdeeb82d6e4829 +c2c092851ee812ba +42beee8673201bb2 +c2ed016a3d4593c7 +c2d49fa588609552 +42f1d78b4bd871d7 +c2c915057523a8b7 +42d617f86965f140 +3d01a6dce3ef2254 +3d18d36e71f7912a +bcfcb2463821bb58 +3d2469b738fbc895 +bd172c918e086ed6 +bfefffffffffffea +bfefffffffffff6a +bff0000000000035 +bfeffffffffffeea +bff0000000000075 +c2f736c5a91c38f7 +c2cb4be96c967e7d +42d354b6b027f7f2 +c2bd76337970db1c +42c182293298c3eb +bcda7eeed374bc71 +3cf960444b22d0e4 +bd034fddda6e978e +3d0cb02225916872 +bd11a7eeed374bc7 +bcea7eeed374bc71 +3d0960444b22d0e4 +bd134fddda6e978e +3d1cb02225916872 +bd21a7eeed374bc7 +3ff000000000001a +3ff000000000005a +3fefffffffffffb5 +3ff000000000009a +3fefffffffffff35 +c2e356898a5d9a65 +c2c6a2c1012f70ea +42db4a1847e3bef1 +c2ba83f0ac91ecaf +42c42c31b17ecdbd +c32d15675983ce20 +c2deefb13694d06c +42e091d9a6fd8b74 +c2cf758b81c02127 +42d047a642cac3d6 +3cc19abb2567f739 +3d108cd5d92b3fba +bd0ee6544da9808c +3d20466aec959fdd +bd1f732a26d4c046 +bfefffffffffffac +bfefffffffffff2c +bff0000000000016 +bfeffffffffffeac +bff0000000000056 +c2d86cb8a02fc7af +c2c355a012409e4d +42e73184db46efb2 +c2b81ad305171f76 +42c7cb0b8532b50a +3ce1a62633145c07 +3d0469898cc51702 +bcf72cece675d1fd +3d1234c4c6628b81 +bd0b9676733ae8fe +3cf1a62633145c07 +3d1469898cc51702 +bd072cece675d1fd +3d2234c4c6628b81 +bd1b9676733ae8fe +3feffffffffffff3 +3ff0000000000039 +3fefffffffffff73 +3ff0000000000079 +3feffffffffffef3 +430350cf728b737e +c2d1d918fd4aa600 +42ccff5d098eaa2a +c2c0dfa23a16e0f7 +42be6cc3ae302e3c +c2eef05bf9893ed3 +c2d5179aa85984bb +42f09177b1d50c73 +c2c96cf3ff887404 +42d5947d8159989d +3d008c7a80bddc93 +3d18463d405eee4a +bcfee70afe8446d9 +3d24231ea02f7725 +bd17b9c2bfa111b6 +bfefffffffffffee +bfefffffffffff6e +bff0000000000037 +bfeffffffffffeee +bff0000000000077 +c2fd04ef42e7cf0e +c2cc1f9c27458890 +42d28edae6d5d46a +c2bdefcff2cf58ad +42c12f30e2516b19 +3cf845e1e7f18b23 +3d0c22f0f3f8c592 +bcdee8786039d373 +3d16117879fc62c9 +bd03dd0f0c073a6e +3d0845e1e7f18b23 +3d1c22f0f3f8c592 +bceee8786039d373 +3d26117879fc62c9 +bd13dd0f0c073a6e +3ff0000000000018 +3ff0000000000058 +3fefffffffffffb1 +3ff0000000000098 +3fefffffffffff31 +c2e51888cf9f1056 +c2c73394e3875480 +42d9c62b4999725c +c2bae64913ee4a88 +42c3be5ca7deadf0 +43b66b9ebc4850c6 +c2e0005b5a76ee8d +42dfff49533821fb +c2d0002dacb912f9 +42cfffa4a89759d4 +bc36d61b58c99c43 +3d0fff494f2539b3 +bd10005b586d6326 +3d1fffa4a7929cda +bd20002dac36b193 +bfefffffffffffb1 +bfefffffffffff31 +bff0000000000018 +bfeffffffffffeb1 +bff0000000000058 +c2d9c8057df2d4f2 +c2c3bee7c3096c97 +42e5160deae496b3 +c2b86bfe63e4711c +42c732d4d5a9b8c2 +3cdee2c2d963a10c +3d03dc585b2c7422 +bcf8474f49a717bd +3d11ee2c2d963a11 +bd0c23a7a4d38bde +3ceee2c2d963a10c +3d13dc585b2c7422 +bd08474f49a717bd +3d21ee2c2d963a11 +bd1c23a7a4d38bde +3fefffffffffffee +3ff0000000000037 +3fefffffffffff6e +3ff0000000000077 +3feffffffffffeee +42fcfb8e6e8677f2 +c2d28fd0ba5949da +42cc1e81fa81beaf +c2c12f9a4348b762 +42bdef3011ce654e +c2f092ffa19eddb3 +c2d59523b1bd5025 +42eeedb119e280f4 +c2c9c753a254b049 +42d516fbef2b6a00 +3cfee4303b192da6 +3d17b90c0ec64b69 +bd008de7e273692d +3d23dc86076325b5 +bd1846f3f139b497 +bfeffffffffffff3 +bfefffffffffff73 +bff0000000000039 +bfeffffffffffef3 +bff0000000000079 +c303592511d4704f +c2cd00891e0274ba +42d1d835b3fca1a1 +c2be6d68d7a552f0 +42c0df3ca4daa8ec +bce1a900f67f753a +3cf72b7f84c04563 +bd046a403d9fdd4f +3d0b95bfc26022b1 +bd1235201ecfeea7 +bcf1a900f67f753a +3d072b7f84c04563 +bd146a403d9fdd4f +3d1b95bfc26022b1 +bd2235201ecfeea7 +3ff0000000000016 +3ff0000000000056 +3fefffffffffffac +3ff0000000000096 +3fefffffffffff2c +c2e734850654cfc0 +c2c7cbd58bcb2844 +42d86b0f02193b44 +c2bb4b85baf0422f +42c3551ab2ee488a +432cefdde7c84c26 +c2e0929d9ee223c9 +42deee5bc6c1eb5a +c2d04804d6a083b2 +42cf74daf44fb7ce +bcc1b19140c0c0d5 +3d0ee4e6ebf3f3f3 +bd108d8c8a060607 +3d1f727375f9f9f9 +bd2046c645030303 +bfefffffffffffb5 +bfefffffffffff35 +bff000000000001a +bfeffffffffffeb5 +bff000000000005a +c2db4c2be499eb73 +c2c42cc2e93d191a +42e3547405e2979d +c2b8bf53b32286dd +42c6a20a339d166e +3cda79394c9e8a0a +3d034f272993d141 +bcf961b1acd85d7d +3d11a79394c9e8a1 +bd0cb0d8d66c2ebf +3cea79394c9e8a0a +3d134f272993d141 +bd0961b1acd85d7d +3d21a79394c9e8a1 +bd1cb0d8d66c2ebf +3fefffffffffffea +3ff0000000000035 +3fefffffffffff6a +3ff0000000000075 +3feffffffffffeea +42f730c4ef8d018e +c2d355c16b34bf5d +42cb4adf992d4e66 +c2c1829696cb6033 +42bd7598a105c684 +c2f1d951d326de1b +c2d618a69b14a455 +42ecff12083bf3ea +c2ca243ec4f63c09 +42d49f0dc874ab52 +3cfcaf6b74b6a225 +3d172bdadd2da889 +bd01a84a45a4aeee +3d2395ed6e96d445 +bd18d42522d25777 +bfeffffffffffff7 +bfefffffffffff77 +bff000000000003c +bfeffffffffffef7 +bff000000000007c +c30d07486ad8df41 +c2cdeff7ec1a6fd7 +42d12f168add82c0 +c2beef3129326d24 +42c0922321d41e84 +3cf6111d218effa2 +3d0b088e90c77fd1 +bce3ddc5bce200bb +3d1584474863bfe9 +bd04f7716f38802f +3d06111d218effa2 +3d1b088e90c77fd1 +bcf3ddc5bce200bb +3d2584474863bfe9 +bd14f7716f38802f +3ff0000000000014 +3ff0000000000054 +3fefffffffffffa8 +3ff0000000000094 +3fefffffffffff28 +c2e9c87c15afd250 +c2c86c18fe1cbfe0 +42d732a4d4231a9c +c2bbb3c7c41c8436 +42c2f02426e04df0 +431cf9372bd12d3d +c2e12fb49c507c6f +42ddef081a98fa6e +c2d0926c9f367153 +42ceeeb11ff40bbe +bcd1abdbb9ea8e6e +3d0dca8488c2ae32 +bd111abdbb9ea8e7 +3d1ee54244615719 +bd208d5eddcf5473 +bfefffffffffffb9 +bfefffffffffff39 +bff000000000001d +bfeffffffffffeb9 +bff000000000005d +c2dd00d426e9de97 +c2c49f7f97943a5b +42e1d7fce531940d +c2b914e965f1b34e +42c61823f4d02062 +3cd60fafbfd97309 +3cf583ebeff65cc2 +bce4f8282013467c +3d02c1f5f7fb2e61 +bcfa7c141009a33e +3ce60fafbfd97309 +3d0583ebeff65cc2 +bcf4f8282013467c +3d12c1f5f7fb2e61 +bd0a7c141009a33e +3ff0000000000013 +3ff0000000000033 +3fefffffffffffe6 +3ff0000000000053 +3fefffffffffffa6 +c2eb4cb0d86bfa59 +c2d42ce738735d24 +42f353eeb6bb1d14 +c2c8bf6f041d328f +42d6a1dc8205d35e +c2f356041e761fb6 +c2e182b1f0ad9e19 +43172f453d4f5dec +c2d6a2934cb605d3 +42eb4a9d277bf525 +3cfa7aa6ae5416a4 +3d0d3d53572a0b52 +bcd6156546afa570 +3d169ea9ab9505a9 +bd02c2aca8d5f4ae +bfeffffffffffffc +bfefffffffffffbc +bff000000000001e +bfefffffffffff7c +bff000000000003e +c31d0bfbdecaa5fe +c2ddf047dff0e30b +42e12ee1dce7f4c6 +c2ceef5bd7dd6f0b +42d0920aa3442f32 +3cd3daeaf976e788 +3cf4f6babe5db9e2 +bce6128a83448c3c +3d027b5d5f2edcf1 +bcfb094541a2461e +3ce3daeaf976e788 +3d04f6babe5db9e2 +bcf6128a83448c3c +3d127b5d5f2edcf1 +bd0b094541a2461e +3ff0000000000012 +3ff0000000000032 +3fefffffffffffe3 +3ff0000000000052 +3fefffffffffffa3 +c2ed016a3d4593c7 +c2d49fa588609552 +42f1d78b4bd871d7 +c2c915057523a8b7 +42d617f86965f140 +431352e42df73873 +c2f42d2fd868005a +42ea8315318b45d6 +c2e1d8e028d85e33 +42dcffa80c656cce +bcda7eeed374bc71 +3cf960444b22d0e4 +bd034fddda6e978e +3d0cb02225916872 +bd11a7eeed374bc7 +bfeffffffffffffe +bfefffffffffffbe +bff000000000001f +bfefffffffffff7e +bff000000000003f +c32d15675983ce20 +c2deefb13694d06c +42e091d9a6fd8b74 +c2cf758b81c02127 +42d047a642cac3d6 +3cd1a62633145c07 +3cf469898cc51702 +bce72cece675d1fd +3d0234c4c6628b81 +bcfb9676733ae8fe +3ce1a62633145c07 +3d0469898cc51702 +bcf72cece675d1fd +3d1234c4c6628b81 +bd0b9676733ae8fe +3ff0000000000011 +3ff0000000000031 +3fefffffffffffe1 +3ff0000000000051 +3fefffffffffffa1 +c2eef05bf9893ed3 +c2d5179aa85984bb +42f09177b1d50c73 +c2c96cf3ff887404 +42d5947d8159989d +c2f517ea08708ba7 +c2e2326f4e8f2bb2 +431090b3d5161786 +c2d73364dee5d1db +42e9c6a1d04c4421 +3cf845e1e7f18b23 +3d0c22f0f3f8c592 +bcdee8786039d373 +3d16117879fc62c9 +bd03dd0f0c073a6e +bff0000000000000 +bfefffffffffffc0 +bff0000000000020 +bfefffffffffff80 +bff0000000000040 +43b66b9ebc4850c6 +c2e0005b5a76ee8d +42dfff49533821fb +c2d0002dacb912f9 +42cfffa4a89759d4 +3ccee2c2d963a10c +3cf3dc585b2c7422 +bce8474f49a717bd +3d01ee2c2d963a11 +bcfc23a7a4d38bde +3cdee2c2d963a10c +3d03dc585b2c7422 +bcf8474f49a717bd +3d11ee2c2d963a11 +bd0c23a7a4d38bde +3ff000000000000f +3ff000000000002f +3fefffffffffffdf +3ff000000000004f +3fefffffffffff9f +c2f092ffa19eddb3 +c2d59523b1bd5025 +42eeedb119e280f4 +c2c9c753a254b049 +42d516fbef2b6a00 +430cfde61218ab9e +c2f618fdb7f21c14 +42e9145d1da586d5 +c2e28f934315e5ec +42dc1ec8839fd343 +bce1a900f67f753a +3cf72b7f84c04563 +bd046a403d9fdd4f +3d0b95bfc26022b1 +bd1235201ecfeea7 +bff0000000000001 +bfefffffffffffc2 +bff0000000000021 +bfefffffffffff82 +bff0000000000041 +432cefdde7c84c26 +c2e0929d9ee223c9 +42deee5bc6c1eb5a +c2d04804d6a083b2 +42cf74daf44fb7ce +3cca79394c9e8a0a +3cf34f272993d141 +bce961b1acd85d7d +3d01a79394c9e8a1 +bcfcb0d8d66c2ebf +3cda79394c9e8a0a +3d034f272993d141 +bcf961b1acd85d7d +3d11a79394c9e8a1 +bd0cb0d8d66c2ebf +3ff000000000000e +3ff000000000002e +3fefffffffffffdd +3ff000000000004e +3fefffffffffff9d +c2f1d951d326de1b +c2d618a69b14a455 +42ecff12083bf3ea +c2ca243ec4f63c09 +42d49f0dc874ab52 +c2f733c4e8ef9c51 +c2e2f0842389e5bc +4309c5b4c7289899 +c2d7cba308e36ba2 +42e86b79643025c2 +3cf6111d218effa2 +3d0b088e90c77fd1 +bce3ddc5bce200bb +3d1584474863bfe9 +bd04f7716f38802f +bff0000000000002 +bfefffffffffffc4 +bff0000000000022 +bfefffffffffff84 +bff0000000000042 +431cf9372bd12d3d +c2e12fb49c507c6f +42ddef081a98fa6e +c2d0926c9f367153 +42ceeeb11ff40bbe +3cc60fafbfd97309 +3ce583ebeff65cc2 +bcd4f8282013467c +3cf2c1f5f7fb2e61 +bcea7c141009a33e +3cd60fafbfd97309 +3cf583ebeff65cc2 +bce4f8282013467c +3d02c1f5f7fb2e61 +bcfa7c141009a33e +3ff000000000000d +3ff000000000001d +3feffffffffffffa +3ff000000000002d +3fefffffffffffda +c2f356041e761fb6 +c2e182b1f0ad9e19 +43172f453d4f5dec +c2d6a2934cb605d3 +42eb4a9d277bf525 +c319c96951f36184 +c2f86c4e333b3c9f +43073244d369e0b7 +c2ebb3e9fec39408 +42f2f00428d54f54 +3cd3daeaf976e788 +3cf4f6babe5db9e2 +bce6128a83448c3c +3d027b5d5f2edcf1 +bcfb094541a2461e +bff0000000000003 +bfefffffffffffe7 +bff0000000000013 +bfefffffffffffc7 +bff0000000000023 +431352e42df73873 +c2f42d2fd868005a +42ea8315318b45d6 +c2e1d8e028d85e33 +42dcffa80c656cce +3cc1a62633145c07 +3ce469898cc51702 +bcd72cece675d1fd +3cf234c4c6628b81 +bceb9676733ae8fe +3cd1a62633145c07 +3cf469898cc51702 +bce72cece675d1fd +3d0234c4c6628b81 +bcfb9676733ae8fe +3ff000000000000c +3ff000000000001c +3feffffffffffff8 +3ff000000000002c +3fefffffffffffd8 +c2f517ea08708ba7 +c2e2326f4e8f2bb2 +431090b3d5161786 +c2d73364dee5d1db +42e9c6a1d04c4421 +c32093c3b4aebeb1 +c2f9c78eea78baa7 +430516ac96142185 +c2ec8e0f162e0f13 +42f231f92a3ca841 +3ccee2c2d963a10c +3cf3dc585b2c7422 +bce8474f49a717bd +3d01ee2c2d963a11 +bcfc23a7a4d38bde +bff0000000000004 +bfefffffffffffe9 +bff0000000000014 +bfefffffffffffc9 +bff0000000000024 +430cfde61218ab9e +c2f618fdb7f21c14 +42e9145d1da586d5 +c2e28f934315e5ec +42dc1ec8839fd343 +3cba79394c9e8a0a +3ce34f272993d141 +bcd961b1acd85d7d +3cf1a79394c9e8a1 +bcecb0d8d66c2ebf +3cca79394c9e8a0a +3cf34f272993d141 +bce961b1acd85d7d +3d01a79394c9e8a1 +bcfcb0d8d66c2ebf +3ff000000000000b +3ff000000000001b +3feffffffffffff6 +3ff000000000002b +3fefffffffffffd6 +c2f733c4e8ef9c51 +c2e2f0842389e5bc +4309c5b4c7289899 +c2d7cba308e36ba2 +42e86b79643025c2 +c32735453027d7c4 +c307cc080f895856 +43186aa4a3a127a4 +c2fb4ba6f5d6c18a +430354f95c393318 +3cc60fafbfd97309 +3ce583ebeff65cc2 +bcd4f8282013467c +3cf2c1f5f7fb2e61 +bcea7c141009a33e +bfeffffffffffffb +bfefffffffffffeb +bff0000000000006 +bfefffffffffffdb +bff000000000000e +c319c96951f36184 +c2f86c4e333b3c9f +43073244d369e0b7 +c2ebb3e9fec39408 +42f2f00428d54f54 +3cb1a62633145c07 +3cd469898cc51702 +bcc72cece675d1fd +3ce234c4c6628b81 +bcdb9676733ae8fe +3cc1a62633145c07 +3ce469898cc51702 +bcd72cece675d1fd +3cf234c4c6628b81 +bceb9676733ae8fe +3ff0000000000002 +3ff000000000000a +3feffffffffffff4 +3ff0000000000012 +3fefffffffffffe4 +c32093c3b4aebeb1 +c2f9c78eea78baa7 +430516ac96142185 +c2ec8e0f162e0f13 +42f231f92a3ca841 +c333570efd768923 +c30a8410087262e4 +43142c0d64d5de51 +c2fd003e169f4652 +4301d86e84316984 +3cba79394c9e8a0a +3ce34f272993d141 +bcd961b1acd85d7d +3cf1a79394c9e8a1 +bcecb0d8d66c2ebf +bfeffffffffffffd +bfeffffffffffff5 +bff0000000000003 +bfefffffffffffed +bff0000000000007 +c32735453027d7c4 +c307cc080f895856 +43186aa4a3a127a4 +c2fb4ba6f5d6c18a +430354f95c393318 +3ca1a62633145c07 +3cc469898cc51702 +bcb72cece675d1fd +3cd234c4c6628b81 +bccb9676733ae8fe +3cb1a62633145c07 +3cd469898cc51702 +bcc72cece675d1fd +3ce234c4c6628b81 +bcdb9676733ae8fe +3ff0000000000001 +3ff0000000000005 +3feffffffffffffa +3ff0000000000009 +3feffffffffffff2 +c333570efd768923 +c30a8410087262e4 +43142c0d64d5de51 +c2fd003e169f4652 +4301d86e84316984 +c34d02967c31cdb5 +c329153d9443ed0b +433617a15494767a +c31c1f559a01adcc +43228f1859543aff +3ca1a62633145c07 +3cc469898cc51702 +bcb72cece675d1fd +3cd234c4c6628b81 +bccb9676733ae8fe +bfefffffffffffff +bfeffffffffffffd +bff0000000000001 +bfeffffffffffffb +bff0000000000002 +c34d02967c31cdb5 +c329153d9443ed0b +433617a15494767a +c31c1f559a01adcc +43228f1859543aff +0000000000000000 +0000000000000001 +8000000000000001 +0000000000000002 +8000000000000002 +0000000000000000 +0000000000000001 +8000000000000001 +0000000000000002 +8000000000000002 +3fefffffffffffff +3ff0000000000001 +3feffffffffffffd +3ff0000000000002 +3feffffffffffffb +434d02967c31cdb5 +c33617a15494767a +4329153d9443ed0b +c3228f1859543aff +431c1f559a01adcc +434d02967c31cdb5 +c33617a15494767a +4329153d9443ed0b +c3228f1859543aff +431c1f559a01adcc +bca1a62633145c07 +3cb72cece675d1fd +bcc469898cc51702 +3ccb9676733ae8fe +bcd234c4c6628b81 +bff0000000000001 +bfeffffffffffffa +bff0000000000005 +bfeffffffffffff2 +bff0000000000009 +4333570efd768923 +c3142c0d64d5de51 +430a8410087262e4 +c301d86e84316984 +42fd003e169f4652 +bca1a62633145c07 +3cb72cece675d1fd +bcc469898cc51702 +3ccb9676733ae8fe +bcd234c4c6628b81 +bcb1a62633145c07 +3cc72cece675d1fd +bcd469898cc51702 +3cdb9676733ae8fe +bce234c4c6628b81 +3feffffffffffffd +3ff0000000000003 +3feffffffffffff5 +3ff0000000000007 +3fefffffffffffed +432735453027d7c4 +c3186aa4a3a127a4 +4307cc080f895856 +c30354f95c393318 +42fb4ba6f5d6c18a +4333570efd768923 +c3142c0d64d5de51 +430a8410087262e4 +c301d86e84316984 +42fd003e169f4652 +bcba79394c9e8a0a +3cd961b1acd85d7d +bce34f272993d141 +3cecb0d8d66c2ebf +bcf1a79394c9e8a1 +bff0000000000002 +bfeffffffffffff4 +bff000000000000a +bfefffffffffffe4 +bff0000000000012 +432093c3b4aebeb1 +c30516ac96142185 +42f9c78eea78baa7 +c2f231f92a3ca841 +42ec8e0f162e0f13 +bcb1a62633145c07 +3cc72cece675d1fd +bcd469898cc51702 +3cdb9676733ae8fe +bce234c4c6628b81 +bcc1a62633145c07 +3cd72cece675d1fd +bce469898cc51702 +3ceb9676733ae8fe +bcf234c4c6628b81 +3feffffffffffffb +3ff0000000000006 +3fefffffffffffeb +3ff000000000000e +3fefffffffffffdb +4319c96951f36184 +c3073244d369e0b7 +42f86c4e333b3c9f +c2f2f00428d54f54 +42ebb3e9fec39408 +432735453027d7c4 +c3186aa4a3a127a4 +4307cc080f895856 +c30354f95c393318 +42fb4ba6f5d6c18a +bcc60fafbfd97309 +3cd4f8282013467c +bce583ebeff65cc2 +3cea7c141009a33e +bcf2c1f5f7fb2e61 +bff000000000000b +bfeffffffffffff6 +bff000000000001b +bfefffffffffffd6 +bff000000000002b +42f733c4e8ef9c51 +c309c5b4c7289899 +42e2f0842389e5bc +c2e86b79643025c2 +42d7cba308e36ba2 +bcba79394c9e8a0a +3cd961b1acd85d7d +bce34f272993d141 +3cecb0d8d66c2ebf +bcf1a79394c9e8a1 +bcca79394c9e8a0a +3ce961b1acd85d7d +bcf34f272993d141 +3cfcb0d8d66c2ebf +bd01a79394c9e8a1 +3ff0000000000004 +3ff0000000000014 +3fefffffffffffe9 +3ff0000000000024 +3fefffffffffffc9 +c30cfde61218ab9e +c2e9145d1da586d5 +42f618fdb7f21c14 +c2dc1ec8839fd343 +42e28f934315e5ec +432093c3b4aebeb1 +c30516ac96142185 +42f9c78eea78baa7 +c2f231f92a3ca841 +42ec8e0f162e0f13 +bccee2c2d963a10c +3ce8474f49a717bd +bcf3dc585b2c7422 +3cfc23a7a4d38bde +bd01ee2c2d963a11 +bff000000000000c +bfeffffffffffff8 +bff000000000001c +bfefffffffffffd8 +bff000000000002c +42f517ea08708ba7 +c31090b3d5161786 +42e2326f4e8f2bb2 +c2e9c6a1d04c4421 +42d73364dee5d1db +bcc1a62633145c07 +3cd72cece675d1fd +bce469898cc51702 +3ceb9676733ae8fe +bcf234c4c6628b81 +bcd1a62633145c07 +3ce72cece675d1fd +bcf469898cc51702 +3cfb9676733ae8fe +bd0234c4c6628b81 +3ff0000000000003 +3ff0000000000013 +3fefffffffffffe7 +3ff0000000000023 +3fefffffffffffc7 +c31352e42df73873 +c2ea8315318b45d6 +42f42d2fd868005a +c2dcffa80c656cce +42e1d8e028d85e33 +4319c96951f36184 +c3073244d369e0b7 +42f86c4e333b3c9f +c2f2f00428d54f54 +42ebb3e9fec39408 +bcd3daeaf976e788 +3ce6128a83448c3c +bcf4f6babe5db9e2 +3cfb094541a2461e +bd027b5d5f2edcf1 +bff000000000000d +bfeffffffffffffa +bff000000000001d +bfefffffffffffda +bff000000000002d +42f356041e761fb6 +c3172f453d4f5dec +42e182b1f0ad9e19 +c2eb4a9d277bf525 +42d6a2934cb605d3 +bcc60fafbfd97309 +3cd4f8282013467c +bce583ebeff65cc2 +3cea7c141009a33e +bcf2c1f5f7fb2e61 +bcd60fafbfd97309 +3ce4f8282013467c +bcf583ebeff65cc2 +3cfa7c141009a33e +bd02c1f5f7fb2e61 +3ff0000000000002 +3ff0000000000022 +3fefffffffffffc4 +3ff0000000000042 +3fefffffffffff84 +c31cf9372bd12d3d +c2ddef081a98fa6e +42e12fb49c507c6f +c2ceeeb11ff40bbe +42d0926c9f367153 +42f733c4e8ef9c51 +c309c5b4c7289899 +42e2f0842389e5bc +c2e86b79643025c2 +42d7cba308e36ba2 +bcf6111d218effa2 +3ce3ddc5bce200bb +bd0b088e90c77fd1 +3d04f7716f38802f +bd1584474863bfe9 +bff000000000000e +bfefffffffffffdd +bff000000000002e +bfefffffffffff9d +bff000000000004e +42f1d951d326de1b +c2ecff12083bf3ea +42d618a69b14a455 +c2d49f0dc874ab52 +42ca243ec4f63c09 +bcca79394c9e8a0a +3ce961b1acd85d7d +bcf34f272993d141 +3cfcb0d8d66c2ebf +bd01a79394c9e8a1 +bcda79394c9e8a0a +3cf961b1acd85d7d +bd034f272993d141 +3d0cb0d8d66c2ebf +bd11a79394c9e8a1 +3ff0000000000001 +3ff0000000000021 +3fefffffffffffc2 +3ff0000000000041 +3fefffffffffff82 +c32cefdde7c84c26 +c2deee5bc6c1eb5a +42e0929d9ee223c9 +c2cf74daf44fb7ce +42d04804d6a083b2 +c30cfde61218ab9e +c2e9145d1da586d5 +42f618fdb7f21c14 +c2dc1ec8839fd343 +42e28f934315e5ec +3ce1a900f67f753a +3d046a403d9fdd4f +bcf72b7f84c04563 +3d1235201ecfeea7 +bd0b95bfc26022b1 +bff000000000000f +bfefffffffffffdf +bff000000000002f +bfefffffffffff9f +bff000000000004f +42f092ffa19eddb3 +c2eeedb119e280f4 +42d59523b1bd5025 +c2d516fbef2b6a00 +42c9c753a254b049 +bccee2c2d963a10c +3ce8474f49a717bd +bcf3dc585b2c7422 +3cfc23a7a4d38bde +bd01ee2c2d963a11 +bcdee2c2d963a10c +3cf8474f49a717bd +bd03dc585b2c7422 +3d0c23a7a4d38bde +bd11ee2c2d963a11 +3ff0000000000000 +3ff0000000000020 +3fefffffffffffc0 +3ff0000000000040 +3fefffffffffff80 +c3b66b9ebc4850c6 +c2dfff49533821fb +42e0005b5a76ee8d +c2cfffa4a89759d4 +42d0002dacb912f9 +42f517ea08708ba7 +c31090b3d5161786 +42e2326f4e8f2bb2 +c2e9c6a1d04c4421 +42d73364dee5d1db +bcf845e1e7f18b23 +3cdee8786039d373 +bd0c22f0f3f8c592 +3d03dd0f0c073a6e +bd16117879fc62c9 +bff0000000000011 +bfefffffffffffe1 +bff0000000000031 +bfefffffffffffa1 +bff0000000000051 +42eef05bf9893ed3 +c2f09177b1d50c73 +42d5179aa85984bb +c2d5947d8159989d +42c96cf3ff887404 +bcd1a62633145c07 +3ce72cece675d1fd +bcf469898cc51702 +3cfb9676733ae8fe +bd0234c4c6628b81 +bce1a62633145c07 +3cf72cece675d1fd +bd0469898cc51702 +3d0b9676733ae8fe +bd1234c4c6628b81 +3feffffffffffffe +3ff000000000001f +3fefffffffffffbe +3ff000000000003f +3fefffffffffff7e +432d15675983ce20 +c2e091d9a6fd8b74 +42deefb13694d06c +c2d047a642cac3d6 +42cf758b81c02127 +c31352e42df73873 +c2ea8315318b45d6 +42f42d2fd868005a +c2dcffa80c656cce +42e1d8e028d85e33 +3cda7eeed374bc71 +3d034fddda6e978e +bcf960444b22d0e4 +3d11a7eeed374bc7 +bd0cb02225916872 +bff0000000000012 +bfefffffffffffe3 +bff0000000000032 +bfefffffffffffa3 +bff0000000000052 +42ed016a3d4593c7 +c2f1d78b4bd871d7 +42d49fa588609552 +c2d617f86965f140 +42c915057523a8b7 +bcd3daeaf976e788 +3ce6128a83448c3c +bcf4f6babe5db9e2 +3cfb094541a2461e +bd027b5d5f2edcf1 +bce3daeaf976e788 +3cf6128a83448c3c +bd04f6babe5db9e2 +3d0b094541a2461e +bd127b5d5f2edcf1 +3feffffffffffffc +3ff000000000001e +3fefffffffffffbc +3ff000000000003e +3fefffffffffff7c +431d0bfbdecaa5fe +c2e12ee1dce7f4c6 +42ddf047dff0e30b +c2d0920aa3442f32 +42ceef5bd7dd6f0b +42f356041e761fb6 +c3172f453d4f5dec +42e182b1f0ad9e19 +c2eb4a9d277bf525 +42d6a2934cb605d3 +bcfa7aa6ae5416a4 +3cd6156546afa570 +bd0d3d53572a0b52 +3d02c2aca8d5f4ae +bd169ea9ab9505a9 +bff0000000000013 +bfefffffffffffe6 +bff0000000000033 +bfefffffffffffa6 +bff0000000000053 +42eb4cb0d86bfa59 +c2f353eeb6bb1d14 +42d42ce738735d24 +c2d6a1dc8205d35e +42c8bf6f041d328f +bcd60fafbfd97309 +3ce4f8282013467c +bcf583ebeff65cc2 +3cfa7c141009a33e +bd02c1f5f7fb2e61 +bce60fafbfd97309 +3cf4f8282013467c +bd0583ebeff65cc2 +3d0a7c141009a33e +bd12c1f5f7fb2e61 +3fefffffffffffb9 +3ff000000000001d +3fefffffffffff39 +3ff000000000005d +3feffffffffffeb9 +42dd00d426e9de97 +c2e1d7fce531940d +42c49f7f97943a5b +c2c61823f4d02062 +42b914e965f1b34e +c31cf9372bd12d3d +c2ddef081a98fa6e +42e12fb49c507c6f +c2ceeeb11ff40bbe +42d0926c9f367153 +3cd1abdbb9ea8e6e +3d111abdbb9ea8e7 +bd0dca8488c2ae32 +3d208d5eddcf5473 +bd1ee54244615719 +bff0000000000014 +bfefffffffffffa8 +bff0000000000054 +bfefffffffffff28 +bff0000000000094 +42e9c87c15afd250 +c2d732a4d4231a9c +42c86c18fe1cbfe0 +c2c2f02426e04df0 +42bbb3c7c41c8436 +bcf6111d218effa2 +3ce3ddc5bce200bb +bd0b088e90c77fd1 +3d04f7716f38802f +bd1584474863bfe9 +bd06111d218effa2 +3cf3ddc5bce200bb +bd1b088e90c77fd1 +3d14f7716f38802f +bd2584474863bfe9 +3feffffffffffff7 +3ff000000000003c +3fefffffffffff77 +3ff000000000007c +3feffffffffffef7 +430d07486ad8df41 +c2d12f168add82c0 +42cdeff7ec1a6fd7 +c2c0922321d41e84 +42beef3129326d24 +42f1d951d326de1b +c2ecff12083bf3ea +42d618a69b14a455 +c2d49f0dc874ab52 +42ca243ec4f63c09 +bcfcaf6b74b6a225 +3d01a84a45a4aeee +bd172bdadd2da889 +3d18d42522d25777 +bd2395ed6e96d445 +bfefffffffffffea +bfefffffffffff6a +bff0000000000035 +bfeffffffffffeea +bff0000000000075 +c2f730c4ef8d018e +c2cb4adf992d4e66 +42d355c16b34bf5d +c2bd7598a105c684 +42c1829696cb6033 +bcda79394c9e8a0a +3cf961b1acd85d7d +bd034f272993d141 +3d0cb0d8d66c2ebf +bd11a79394c9e8a1 +bcea79394c9e8a0a +3d0961b1acd85d7d +bd134f272993d141 +3d1cb0d8d66c2ebf +bd21a79394c9e8a1 +3fefffffffffffb5 +3ff000000000001a +3fefffffffffff35 +3ff000000000005a +3feffffffffffeb5 +42db4c2be499eb73 +c2e3547405e2979d +42c42cc2e93d191a +c2c6a20a339d166e +42b8bf53b32286dd +c32cefdde7c84c26 +c2deee5bc6c1eb5a +42e0929d9ee223c9 +c2cf74daf44fb7ce +42d04804d6a083b2 +3cc1b19140c0c0d5 +3d108d8c8a060607 +bd0ee4e6ebf3f3f3 +3d2046c645030303 +bd1f727375f9f9f9 +bff0000000000016 +bfefffffffffffac +bff0000000000056 +bfefffffffffff2c +bff0000000000096 +42e734850654cfc0 +c2d86b0f02193b44 +42c7cbd58bcb2844 +c2c3551ab2ee488a +42bb4b85baf0422f +3ce1a900f67f753a +3d046a403d9fdd4f +bcf72b7f84c04563 +3d1235201ecfeea7 +bd0b95bfc26022b1 +3cf1a900f67f753a +3d146a403d9fdd4f +bd072b7f84c04563 +3d2235201ecfeea7 +bd1b95bfc26022b1 +3feffffffffffff3 +3ff0000000000039 +3fefffffffffff73 +3ff0000000000079 +3feffffffffffef3 +4303592511d4704f +c2d1d835b3fca1a1 +42cd00891e0274ba +c2c0df3ca4daa8ec +42be6d68d7a552f0 +42f092ffa19eddb3 +c2eeedb119e280f4 +42d59523b1bd5025 +c2d516fbef2b6a00 +42c9c753a254b049 +bcfee4303b192da6 +3d008de7e273692d +bd17b90c0ec64b69 +3d1846f3f139b497 +bd23dc86076325b5 +bfefffffffffffee +bfefffffffffff6e +bff0000000000037 +bfeffffffffffeee +bff0000000000077 +c2fcfb8e6e8677f2 +c2cc1e81fa81beaf +42d28fd0ba5949da +c2bdef3011ce654e +42c12f9a4348b762 +bcdee2c2d963a10c +3cf8474f49a717bd +bd03dc585b2c7422 +3d0c23a7a4d38bde +bd11ee2c2d963a11 +bceee2c2d963a10c +3d08474f49a717bd +bd13dc585b2c7422 +3d1c23a7a4d38bde +bd21ee2c2d963a11 +3fefffffffffffb1 +3ff0000000000018 +3fefffffffffff31 +3ff0000000000058 +3feffffffffffeb1 +42d9c8057df2d4f2 +c2e5160deae496b3 +42c3bee7c3096c97 +c2c732d4d5a9b8c2 +42b86bfe63e4711c +c3b66b9ebc4850c6 +c2dfff49533821fb +42e0005b5a76ee8d +c2cfffa4a89759d4 +42d0002dacb912f9 +3c36d61b58c99c43 +3d10005b586d6326 +bd0fff494f2539b3 +3d20002dac36b193 +bd1fffa4a7929cda +bff0000000000018 +bfefffffffffffb1 +bff0000000000058 +bfefffffffffff31 +bff0000000000098 +42e51888cf9f1056 +c2d9c62b4999725c +42c73394e3875480 +c2c3be5ca7deadf0 +42bae64913ee4a88 +bcf845e1e7f18b23 +3cdee8786039d373 +bd0c22f0f3f8c592 +3d03dd0f0c073a6e +bd16117879fc62c9 +bd0845e1e7f18b23 +3ceee8786039d373 +bd1c22f0f3f8c592 +3d13dd0f0c073a6e +bd26117879fc62c9 +3fefffffffffffee +3ff0000000000037 +3fefffffffffff6e +3ff0000000000077 +3feffffffffffeee +42fd04ef42e7cf0e +c2d28edae6d5d46a +42cc1f9c27458890 +c2c12f30e2516b19 +42bdefcff2cf58ad +42eef05bf9893ed3 +c2f09177b1d50c73 +42d5179aa85984bb +c2d5947d8159989d +42c96cf3ff887404 +bd008c7a80bddc93 +3cfee70afe8446d9 +bd18463d405eee4a +3d17b9c2bfa111b6 +bd24231ea02f7725 +bfeffffffffffff3 +bfefffffffffff73 +bff0000000000039 +bfeffffffffffef3 +bff0000000000079 +c30350cf728b737e +c2ccff5d098eaa2a +42d1d918fd4aa600 +c2be6cc3ae302e3c +42c0dfa23a16e0f7 +bce1a62633145c07 +3cf72cece675d1fd +bd0469898cc51702 +3d0b9676733ae8fe +bd1234c4c6628b81 +bcf1a62633145c07 +3d072cece675d1fd +bd1469898cc51702 +3d1b9676733ae8fe +bd2234c4c6628b81 +3fefffffffffffac +3ff0000000000016 +3fefffffffffff2c +3ff0000000000056 +3feffffffffffeac +42d86cb8a02fc7af +c2e73184db46efb2 +42c355a012409e4d +c2c7cb0b8532b50a +42b81ad305171f76 +432d15675983ce20 +c2e091d9a6fd8b74 +42deefb13694d06c +c2d047a642cac3d6 +42cf758b81c02127 +bcc19abb2567f739 +3d0ee6544da9808c +bd108cd5d92b3fba +3d1f732a26d4c046 +bd20466aec959fdd +bff000000000001a +bfefffffffffffb5 +bff000000000005a +bfefffffffffff35 +bff000000000009a +42e356898a5d9a65 +c2db4a1847e3bef1 +42c6a2c1012f70ea +c2c42c31b17ecdbd +42ba83f0ac91ecaf +3cda7eeed374bc71 +3d034fddda6e978e +bcf960444b22d0e4 +3d11a7eeed374bc7 +bd0cb02225916872 +3cea7eeed374bc71 +3d134fddda6e978e +bd0960444b22d0e4 +3d21a7eeed374bc7 +bd1cb02225916872 +3fefffffffffffea +3ff0000000000035 +3fefffffffffff6a +3ff0000000000075 +3feffffffffffeea +42f736c5a91c38f7 +c2d354b6b027f7f2 +42cb4be96c967e7d +c2c182293298c3eb +42bd76337970db1c +42ed016a3d4593c7 +c2f1d78b4bd871d7 +42d49fa588609552 +c2d617f86965f140 +42c915057523a8b7 +bd01a6dce3ef2254 +3cfcb2463821bb58 +bd18d36e71f7912a +3d172c918e086ed6 +bd2469b738fbc895 +bfeffffffffffff7 +bfefffffffffff77 +bff000000000003c +bfeffffffffffef7 +bff000000000007c +c30cf489c89f8067 +c2cdeeb82d6e4829 +42d12fe94f526646 +c2beee8673201bb2 +42c092851ee812ba +bce3daeaf976e788 +3cf6128a83448c3c +bd04f6babe5db9e2 +3d0b094541a2461e +bd127b5d5f2edcf1 +bcf3daeaf976e788 +3d06128a83448c3c +bd14f6babe5db9e2 +3d1b094541a2461e +bd227b5d5f2edcf1 +3fefffffffffffa8 +3ff0000000000014 +3fefffffffffff28 +3ff0000000000054 +3feffffffffffea8 +42d73424f6148ec1 +c2e9c4c7cf0be22e +42c2f0a423455376 +c2c86b4432b0d2b2 +42b7cbbc4a3c7bdb +431d0bfbdecaa5fe +c2e12ee1dce7f4c6 +42ddf047dff0e30b +c2d0920aa3442f32 +42ceef5bd7dd6f0b +bcd1a070ac3e29a0 +3d0dcbf1ea783acc +bd111a070ac3e29a +3d1ee5f8f53c1d66 +bd208d038561f14d +bff000000000001d +bfefffffffffffb9 +bff000000000005d +bfefffffffffff39 +bff000000000009d +42e1d9c3831d5548 +c2dcfe7c0a227d8b +42c618d2292d850d +c2c49ee7d9d69ce7 +42ba245d4014e2b9 +bcfa7aa6ae5416a4 +3cd6156546afa570 +bd0d3d53572a0b52 +3d02c2aca8d5f4ae +bd169ea9ab9505a9 +bd0a7aa6ae5416a4 +3ce6156546afa570 +bd1d3d53572a0b52 +3d12c2aca8d5f4ae +bd269ea9ab9505a9 +3fefffffffffffe6 +3ff0000000000033 +3fefffffffffff66 +3ff0000000000073 +3feffffffffffee6 +42f35819f93f1699 +c2d42bc4cd0be380 +42ca844ec111d738 +c2c1d8521be9cd71 +42bd00639a2056d3 +42eb4cb0d86bfa59 +c2f353eeb6bb1d14 +42d42ce738735d24 +c2d6a1dc8205d35e +42c8bf6f041d328f +bd02c13f47206814 +3cfa7d8171bf2fd8 +bd19609fa390340a +3d169f605c6fcbf6 +bd24b04fd1c81a05 +bfeffffffffffffc +bfefffffffffff7c +bff000000000003e +bfeffffffffffefc +bff000000000007e +c31ce68aaa3e454f +c2ceee066f66c22a +42d092ce9faf99e6 +c2bf74aed2293e70 +42c0481c7c41a83d +bce60fafbfd97309 +3cf4f8282013467c +bd0583ebeff65cc2 +3d0a7c141009a33e +bd12c1f5f7fb2e61 +bcf60fafbfd97309 +3d04f8282013467c +bd1583ebeff65cc2 +3d1a7c141009a33e +bd22c1f5f7fb2e61 +3fefffffffffffa3 +3ff0000000000012 +3fefffffffffff23 +3ff0000000000052 +3feffffffffffea3 +42d61954d77e7cef +c2ecfcba34327cf6 +42c28fb1fe84b509 +c2c9142502719ea0 +42b77ea5fad4500f +42dd00d426e9de97 +c2e1d7fce531940d +42c49f7f97943a5b +c2c61823f4d02062 +42b914e965f1b34e +bd11a7383c5c857a +3d0cb18f8746f50c +bd28d39c1e2e42bd +3d272c63e1d1bd43 +bd3469ce0f17215f +bfefffffffffffbe +bfeffffffffffebe +bff000000000005f +bfeffffffffffdbe +bff00000000000df +c2deed06745e798e +c2b96c63d7b11b62 +42c5954d3f663377 +c2ac55c8d8393636 +42b2607c37ba1940 +3cd1abdbb9ea8e6e +3d111abdbb9ea8e7 +bd0dca8488c2ae32 +3d208d5eddcf5473 +bd1ee54244615719 +3ce1abdbb9ea8e6e +3d211abdbb9ea8e7 +bd1dca8488c2ae32 +3d308d5eddcf5473 +bd2ee54244615719 +3fefffffffffffe1 +3ff0000000000071 +3feffffffffffee1 +3ff00000000000f1 +3feffffffffffde1 +42f09487d9de9e79 +c2c231dba217b79e +42bc8e33748d6385 +c2b106e5d73dc1aa +42ae2e056b9e1641 +42e9c87c15afd250 +c2d732a4d4231a9c +42c86c18fe1cbfe0 +c2c2f02426e04df0 +42bbb3c7c41c8436 +bd03dba1aa51add5 +3d16122f2ad72916 +bd24f6e86a946b75 +3d2b0917956b948b +bd327b74354a35bb +bff0000000000040 +bfefffffffffff80 +bff00000000000c0 +bfeffffffffffe80 +bff0000000000140 +42d0008909399b77 +c2cffeedffe24705 +42b555923ba16ea1 +c2b555187064e68d +42a999c5726b1fad +bd06111d218effa2 +3cf3ddc5bce200bb +bd1b088e90c77fd1 +3d14f7716f38802f +bd2584474863bfe9 +bd16111d218effa2 +3d03ddc5bce200bb +bd2b088e90c77fd1 +3d24f7716f38802f +bd3584474863bfe9 +3ff000000000000f +3ff000000000008f +3fefffffffffff1f +3ff000000000010f +3feffffffffffe1f +c2f08ff00a6d180f +c2bc8d5943bedcd5 +42c2328cd89385e6 +c2ae2d8b8de0949b +42b107336e8dcc65 +430d07486ad8df41 +c2d12f168add82c0 +42cdeff7ec1a6fd7 +c2c0922321d41e84 +42beef3129326d24 +bce1a34b6fa942d3 +3d1dcb96920ad7a6 +bd211a34b6fa942d +3d2ee5cb49056bd3 +bd308d1a5b7d4a17 +bff0000000000021 +bfefffffffffff42 +bff00000000000a1 +bfeffffffffffe42 +bff0000000000121 +42def106c3daf7b4 +c2c59453f6d08e20 +42b96d10d5114cb0 +c2b26021d93f523f +42ac56344803651c +bcfcaf6b74b6a225 +3d01a84a45a4aeee +bd172bdadd2da889 +3d18d42522d25777 +bd2395ed6e96d445 +bd0caf6b74b6a225 +3d11a84a45a4aeee +bd272bdadd2da889 +3d28d42522d25777 +bd3395ed6e96d445 +3fefffffffffff5d +3ff000000000002e +3feffffffffffe5d +3ff00000000000ae +3feffffffffffd5d +42c91575b45f58dd +c2d6174a427165ee +42b389a514cc37ad +c2b77e1245534015 +42a84317b138f411 +c2f730c4ef8d018e +c2cb4adf992d4e66 +42d355c16b34bf5d +c2bd7598a105c684 +42c1829696cb6033 +3cf613f7e4fa18d6 +3d22c27efc9f431b +bd1a7b0206c179cb +3d31613f7e4fa18d +bd2d3d810360bce5 +bff0000000000002 +bfefffffffffff04 +bff0000000000082 +bfeffffffffffe04 +bff0000000000102 +431d1ed8f24d0a1a +c2c0478e9e81029b +42bf75b7a651e6a4 +c2b02377feeeb4f0 +42afba45297673df +bcea79394c9e8a0a +3d0961b1acd85d7d +bd134f272993d141 +3d1cb0d8d66c2ebf +bd21a79394c9e8a1 +bcfa79394c9e8a0a +3d1961b1acd85d7d +bd234f272993d141 +3d2cb0d8d66c2ebf +bd31a79394c9e8a1 +3fefffffffffff9b +3ff000000000004d +3feffffffffffe9b +3ff00000000000cd +3feffffffffffd9b +42d42d787a6784ca +c2ca82d67eb70287 +42b6ea2eba1f8d15 +c2b3f4c1d4e7996b +42aab4b26f9d8007 +42db4c2be499eb73 +c2e3547405e2979d +42c42cc2e93d191a +c2c6a20a339d166e +42b8bf53b32286dd +bd12c19a9f8dcb3b +3d0a7ccac0e4698b +bd2960cd4fc6e59d +3d269f32b0391a63 +bd34b066a7e372cf +bfefffffffffffc7 +bfeffffffffffec7 +bff0000000000063 +bfeffffffffffdc7 +bff00000000000e3 +c2e1d719b82596f6 +c2ba23a661871544 +42c49fcb79b88af2 +c2acc63410ae1abd +42b20529fc44b40c +3cc1b19140c0c0d5 +3d108d8c8a060607 +bd0ee4e6ebf3f3f3 +3d2046c645030303 +bd1f727375f9f9f9 +3cd1b19140c0c0d5 +3d208d8c8a060607 +bd1ee4e6ebf3f3f3 +3d3046c645030303 +bd2f727375f9f9f9 +3fefffffffffffd8 +3ff000000000006c +3feffffffffffed8 +3ff00000000000ec +3feffffffffffdd8 +42e9ca569f453eef +c2c2efe42b366726 +42bbb40c39bf3aa5 +c2b158573ed23f1b +42adb2718d286e31 +42e734850654cfc0 +c2d86b0f02193b44 +42c7cbd58bcb2844 +c2c3551ab2ee488a +42bb4b85baf0422f +bd06106670b43955 +3d14f7ccc7a5e355 +bd2584199c2d0e55 +3d2a7be663d2f1ab +bd32c20cce16872b +bff0000000000044 +bfefffffffffff89 +bff00000000000c4 +bfeffffffffffe89 +bff0000000000144 +42cdf097d57267e2 +c2d12ead303560bf +42b4dae038c9406f +c2b5d58a4f69eb86 +42a940a1f6bd7ca5 +3cf1a900f67f753a +3d146a403d9fdd4f +bd072b7f84c04563 +3d2235201ecfeea7 +bd1b95bfc26022b1 +3d01a900f67f753a +3d246a403d9fdd4f +bd172b7f84c04563 +3d3235201ecfeea7 +bd2b95bfc26022b1 +3ff000000000000b +3ff000000000008b +3fefffffffffff16 +3ff000000000010b +3feffffffffffe16 +c2f72dc5bca75764 +c2bd754b37329701 +42c182cd4ae54ea8 +c2aead30d68eb9b3 +42b0b8ae4e17c5d0 +4303592511d4704f +c2d1d835b3fca1a1 +42cd00891e0274ba +c2c0df3ca4daa8ec +42be6d68d7a552f0 +bcea765e893370d7 +3d1cb1342ed991e5 +bd21a765e893370d +3d2e589a176cc8f3 +bd30d3b2f4499b87 +bff0000000000026 +bfefffffffffff4b +bff00000000000a6 +bfeffffffffffe4b +bff0000000000126 +42db4d35d14d3826 +c2c6a1aed1270f66 +42b8bf8a55542c51 +c2b2bf20aaf451ec +42abe92713298fb1 +bcfee4303b192da6 +3d008de7e273692d +bd17b90c0ec64b69 +3d1846f3f139b497 +bd23dc86076325b5 +bd0ee4303b192da6 +3d108de7e273692d +bd27b90c0ec64b69 +3d2846f3f139b497 +bd33dc86076325b5 +3fefffffffffff54 +3ff000000000002a +3feffffffffffe54 +3ff00000000000aa +3feffffffffffd54 +42c7cc3a941e012f +c2d86a3a48c7bb90 +42b3228c8ddcd635 +c2b81a378a76f938 +42a7f2f9926d6297 +c2fcfb8e6e8677f2 +c2cc1e81fa81beaf +42d28fd0ba5949da +c2bdef3011ce654e +42c12f9a4348b762 +3cf1aa6e583501d4 +3d22354dcb06a03b +bd1b956469f2bf8b +3d311aa6e583501d +bd2dcab234f95fc5 +bff0000000000007 +bfefffffffffff0d +bff0000000000087 +bfeffffffffffe0d +bff0000000000107 +43035d5294871954 +c2c0df09dc0731d7 +42be6dbb6f005cb3 +c2b06c903f5727a3 +42af31cdae87d420 +bceee2c2d963a10c +3d08474f49a717bd +bd13dc585b2c7422 +3d1c23a7a4d38bde +bd21ee2c2d963a11 +bcfee2c2d963a10c +3d18474f49a717bd +bd23dc585b2c7422 +3d2c23a7a4d38bde +bd31ee2c2d963a11 +3fefffffffffff92 +3ff0000000000049 +3feffffffffffe92 +3ff00000000000c9 +3feffffffffffd92 +42d2904bada57da5 +c2cc1df4ec6b12e5 +42b65cde9e942d82 +c2b464fe09c8cdd9 +42aa53c0c46a0427 +42d9c8057df2d4f2 +c2e5160deae496b3 +42c3bee7c3096c97 +c2c732d4d5a9b8c2 +42b86bfe63e4711c +bd13dbfd02bf10fb +3d084805fa81de0a +bd29edfe815f887e +3d2612017ea07782 +bd34f6ff40afc43f +bfefffffffffffcf +bfeffffffffffecf +bff0000000000068 +bfeffffffffffdcf +bff00000000000e8 +c2e514d0b07eb8d5 +c2bae587752e30d4 +42c3bf2d537de760 +c2ad3a295dc23e22 +42b1ad5215aa1d11 +3c36d61b58c99c43 +3d10005b586d6326 +bd0fff494f2539b3 +3d20002dac36b193 +bd1fffa4a7929cda +3c46d61b58c99c43 +3d20005b586d6326 +bd1fff494f2539b3 +3d30002dac36b193 +bd2fffa4a7929cda +3fefffffffffffcf +3ff0000000000068 +3feffffffffffecf +3ff00000000000e8 +3feffffffffffdcf +42e519c67a00d71d +c2c3be171d28419e +42bae689a099d185 +c2b1ace299056812 +42ad3ac1c7cf39e8 +42e51888cf9f1056 +c2d9c62b4999725c +42c73394e3875480 +c2c3be5ca7deadf0 +42bae64913ee4a88 +bd08452b3716c4d6 +3d13dd6a64749d95 +bd26114acdc5b136 +3d29eeb5323a4eca +bd3308a566e2d89b +bff0000000000049 +bfefffffffffff92 +bff00000000000c9 +bfeffffffffffe92 +bff0000000000149 +42cc202945f34d1f +c2d28e60069d9615 +42b4659277d2b4cd +c2b65c2c32e23671 +42a8e9e2e46232a0 +bd0845e1e7f18b23 +3ceee8786039d373 +bd1c22f0f3f8c592 +3d13dd0f0c073a6e +bd26117879fc62c9 +bd1845e1e7f18b23 +3cfee8786039d373 +bd2c22f0f3f8c592 +3d23dd0f0c073a6e +bd36117879fc62c9 +3ff0000000000007 +3ff0000000000087 +3fefffffffffff0d +3ff0000000000107 +3feffffffffffe0d +c3034ca753a243c5 +c2be6c711c15f6c7 +42c0dfd5067fb781 +c2af312016354d9d +42b06cf081fef1ee +42fd04ef42e7cf0e +c2d28edae6d5d46a +42cc1f9c27458890 +c2c12f30e2516b19 +42bdefcff2cf58ad +bcf1a4b8d15ecf6d +3d1b96d1cba84c25 +bd2234971a2bd9ee +3d2dcb68e5d42612 +bd311a4b8d15ecf7 +bff000000000002a +bfefffffffffff54 +bff00000000000aa +bfeffffffffffe54 +bff000000000012a +42d86d8d84f7c9df +c2c7caa686ecc567 +42b81b06da5f9d07 +c2b32209eb888919 +42ab7f54ca1af879 +bd008c7a80bddc93 +3cfee70afe8446d9 +bd18463d405eee4a +3d17b9c2bfa111b6 +bd24231ea02f7725 +bd108c7a80bddc93 +3d0ee70afe8446d9 +bd28463d405eee4a +3d27b9c2bfa111b6 +bd34231ea02f7725 +3fefffffffffff4b +3ff0000000000026 +3feffffffffffe4b +3ff00000000000a6 +3feffffffffffd4b +42c6a31c6c4c0a3d +c2db490e97dc4168 +42b2bf9e142eddaf +c2b8beafd234bc48 +42a7a4e5d6ab7579 +c30350cf728b737e +c2ccff5d098eaa2a +42d1d918fd4aa600 +c2be6cc3ae302e3c +42c0dfa23a16e0f7 +3cea81c996dfd5a5 +3d21a81c996dfd5a +bd1cafc6cd24054b +3d30d40e4cb6fead +bd2e57e3669202a6 +bff000000000000b +bfefffffffffff16 +bff000000000008b +bfeffffffffffe16 +bff000000000010b +42f739c7306010b7 +c2c181f2827ffd13 +42bd7680e808d941 +c2b0b84a8bbb85bd +42aeadd8be6ada10 +bcf1a62633145c07 +3d072cece675d1fd +bd1469898cc51702 +3d1b9676733ae8fe +bd2234c4c6628b81 +bd01a62633145c07 +3d172cece675d1fd +bd2469898cc51702 +3d2b9676733ae8fe +bd3234c4c6628b81 +3fefffffffffff89 +3ff0000000000044 +3feffffffffffe89 +3ff00000000000c4 +3feffffffffffd89 +42d13052b91fe18b +c2cdee18581942c6 +42b5d6346fab5e6d +c2b4da450c66c7e8 +42a9f585159a2bc5 +42d86cb8a02fc7af +c2e73184db46efb2 +42c355a012409e4d +c2c7cb0b8532b50a +42b81ad305171f76 +bd14f65f65f056bb +3d061341341f5289 +bd2a7b2fb2f82b5e +3d2584d04d07d4a2 +bd353d97d97c15af +bfefffffffffffd8 +bfeffffffffffed8 +bff000000000006c +bfeffffffffffdd8 +bff00000000000ec +c2e9c2ee11dffe80 +c2bbb2fa6b223f6e +42c2f0e424009472 +c2adb1d438fd5864 +42b158c29adac4a7 +bcc19abb2567f739 +3d0ee6544da9808c +bd108cd5d92b3fba +3d1f732a26d4c046 +bd20466aec959fdd +bcd19abb2567f739 +3d1ee6544da9808c +bd208cd5d92b3fba +3d2f732a26d4c046 +bd30466aec959fdd +3fefffffffffffc7 +3ff0000000000063 +3feffffffffffec7 +3ff00000000000e3 +3feffffffffffdc7 +42e1daa6f403d9d9 +c2c49e9bfe3d1fe6 +42ba249a37277065 +c2b204b620e432e6 +42acc6c7caa7dff5 +42e356898a5d9a65 +c2db4a1847e3bef1 +42c6a2c1012f70ea +c2c42c31b17ecdbd +42ba83f0ac91ecaf +bd0a79effd795057 +3d12c308014357d4 +bd269e7bff5e5416 +3d29618400a1abea +bd334f3dffaf2a0b +bff000000000004d +bfefffffffffff9a +bff00000000000cd +bfeffffffffffe9a +bff000000000014d +42ca84cc35cafc52 +c2d42b33a39730d5 +42b3f54ff2bc4a8f +c2b6e97363d203ab +42a8956fe7b6e3f6 +3cea7eeed374bc71 +3d134fddda6e978e +bd0960444b22d0e4 +3d21a7eeed374bc7 +bd1cb02225916872 +3cfa7eeed374bc71 +3d234fddda6e978e +bd1960444b22d0e4 +3d31a7eeed374bc7 +bd2cb02225916872 +3ff0000000000002 +3ff0000000000082 +3fefffffffffff04 +3ff0000000000102 +3feffffffffffe04 +c31cd3f62b68c952 +c2bf74568f4fcb6a +42c0484bc8520566 +c2afb9919560bf23 +42b023d4f0313259 +42f736c5a91c38f7 +c2d354b6b027f7f2 +42cb4be96c967e7d +c2c182293298c3eb +42bd76337970db1c +bcf60e425e23e66f +3d1a7c6f68770664 +bd22c1c84bc47cce +3d2d3e37b43b8332 +bd3160e425e23e67 +bff000000000002e +bfefffffffffff5d +bff00000000000ae +bfeffffffffffe5d +bff000000000012e +42d61a031ea478f0 +c2c913b4cefadb5b +42b77ed738f171eb +c2b3891ce4107c93 +42ab1899387d647c +bd01a6dce3ef2254 +3cfcb2463821bb58 +bd18d36e71f7912a +3d172c918e086ed6 +bd2469b738fbc895 +bd11a6dce3ef2254 +3d0cb2463821bb58 +bd28d36e71f7912a +3d272c918e086ed6 +bd3469b738fbc895 +3fefffffffffff42 +3ff0000000000021 +3feffffffffffe42 +3ff00000000000a1 +3feffffffffffd42 +42c595a05c9806b3 +c2deebb13f66acbe +42b2609a57fde2b6 +c2b96c2a2ff173a5 +42a758c8c90f2aef +c30cf489c89f8067 +c2cdeeb82d6e4829 +42d12fe94f526646 +c2beee8673201bb2 +42c092851ee812ba +3ce1aeb67d55a7a1 +3d211aeb67d55a7a +bd1dca2930554b0c +3d308d75b3eaad3d +bd2ee514982aa586 +bff000000000000f +bfefffffffffff1f +bff000000000008f +bfeffffffffffe1f +bff000000000010f +42f096105aa868db +c2c231a092ed69dd +42bc8e7c3261fb77 +c2b106cbfac03525 +42ae2e2e0bb7fbbc +bcf3daeaf976e788 +3d06128a83448c3c +bd14f6babe5db9e2 +3d1b094541a2461e +bd227b5d5f2edcf1 +bd03daeaf976e788 +3d16128a83448c3c +bd24f6babe5db9e2 +3d2b094541a2461e +bd327b5d5f2edcf1 +3fefffffffffff80 +3ff0000000000040 +3feffffffffffe80 +3ff00000000000c0 +3feffffffffffd80 +42d000e469cd8c32 +c2cffe375f526202 +42b555bad5eaab13 +c2b554efd885bccb +42a999e2adf4eb27 +42d73424f6148ec1 +c2e9c4c7cf0be22e +42c2f0a423455376 +c2c86b4432b0d2b2 +42b7cbbc4a3c7bdb +bd1610c1c9219c7c +3d03de7c6dbcc708 +bd2b0860e490ce3e +3d24f79f1b6f31c2 +bd3584307248671f +bfefffffffffffe1 +bfeffffffffffee1 +bff0000000000071 +bfeffffffffffde1 +bff00000000000f1 +c2f08e68ab52f548 +c2bc8d108bb44b75 +42c232c7edbbf24d +c2ae2d62ef7c1de8 +42b1074d4c45a107 +bcd1a070ac3e29a0 +3d0dcbf1ea783acc +bd111a070ac3e29a +3d1ee5f8f53c1d66 +bd208d038561f14d +bce1a070ac3e29a0 +3d1dcbf1ea783acc +bd211a070ac3e29a +3d2ee5f8f53c1d66 +bd308d038561f14d +3fefffffffffffbe +3ff000000000005f +3feffffffffffebe +3ff00000000000df +3feffffffffffdbe +42def25c6e9830cb +c2c59400e39e3d91 +42b96d4a80e73254 +c2b26003ba8690b7 +42ac565818a68260 +42e1d9c3831d5548 +c2dcfe7c0a227d8b +42c618d2292d850d +c2c49ee7d9d69ce7 +42ba245d4014e2b9 +bd0caeb4c3dbdbd8 +3d11a8a59e121214 +bd272bad30f6f6f6 +3d28d452cf09090a +bd3395d6987b7b7b +bff0000000000052 +bfefffffffffffa3 +bff00000000000d2 +bfeffffffffffea3 +bff0000000000152 +42c915e5f787c151 +c2d6169c263604bb +42b389c72223db6a +c2b77de10a6f9bba +42a84331f2a07c3b +bd0a7aa6ae5416a4 +3ce6156546afa570 +bd1d3d53572a0b52 +3d12c2aca8d5f4ae +bd269ea9ab9505a9 +bd1a7aa6ae5416a4 +3cf6156546afa570 +bd2d3d53572a0b52 +3d22c2aca8d5f4ae +bd369ea9ab9505a9 +3feffffffffffffc +3ff000000000007e +3feffffffffffefc +3ff00000000000fe +3feffffffffffdfc +431d31ce95f57458 +c2c0475f56bb7cd8 +42bf760ff0e91a0e +c2b02360c345558c +42afba720fb98b06 +42f35819f93f1699 +c2d42bc4cd0be380 +42ca844ec111d738 +c2c1d8521be9cd71 +42bd00639a2056d3 +bcfa77cbeae8fd71 +3d19620d0545c0a4 +bd234ef97d5d1fae +3d2cb10682a2e052 +bd31a77cbeae8fd7 +bff0000000000033 +bfefffffffffff65 +bff00000000000b3 +bfeffffffffffe65 +bff0000000000133 +42d42e09c4878993 +c2ca82591c8813eb +42b6ea5d91919ecc +c2b3f49e4eaea85b +42aab4d23f3bd084 +bd02c13f47206814 +3cfa7d8171bf2fd8 +bd19609fa390340a +3d169f605c6fcbf6 +bd24b04fd1c81a05 +bd12c13f47206814 +3d0a7d8171bf2fd8 +bd29609fa390340a +3d269f605c6fcbf6 +bd34b04fd1c81a05 +3fefffffffffff39 +3ff000000000001d +3feffffffffffe39 +3ff000000000009d +3feffffffffffd39 +42c4a0175e0b5238 +c2e1d636a1b107bb +42b20546f405a1e4 +c2ba23696ee5aabd +42a70e8faf4e6243 +c31ce68aaa3e454f +c2ceee066f66c22a +42d092ce9faf99e6 +c2bf74aed2293e70 +42c0481c7c41a83d +3cd1b746c796f33c +3d208dba363cb79a +bd1ee48b938690cc +3d3046dd1b1e5bcd +bd2f7245c9c34866 +bff0000000000014 +bfefffffffffff28 +bff0000000000094 +bfeffffffffffe28 +bff0000000000114 +42e9cc316d1b406a +c2c2efa4313cd186 +42bbb450b0b4512a +c2b1583c689fc0a0 +42adb298e337b1ff +bcf60fafbfd97309 +3d04f8282013467c +bd1583ebeff65cc2 +3d1a7c141009a33e +bd22c1f5f7fb2e61 +bd060fafbfd97309 +3d14f8282013467c +bd2583ebeff65cc2 +3d2a7c141009a33e +bd32c1f5f7fb2e61 +3fefffffffffff77 +3ff000000000003c +3feffffffffffe77 +3ff00000000000bc +3feffffffffffd77 +42cdf137c576dbf5 +c2d12e43da98f822 +42b4db07054aba31 +c2b5d55fc8f7bd45 +42a940be6817973d +42d61954d77e7cef +c2ecfcba34327cf6 +42c28fb1fe84b509 +c2c9142502719ea0 +42b77ea5fad4500f +bd172b242c52e23c +3d01a9b7a75a3b87 +bd2b95921629711e +3d246a6de9d68ee2 +bd35cac90b14b88f +bff0000000000075 +bfeffffffffffeea +bff0000000000175 +bfeffffffffffcea +bff0000000000275 +42c1830400550e01 +c2bd74fdcef63df8 +42a5f725c0d7af29 +c2a4bc925229493b +429a0cbdd75332ab +bd11a7383c5c857a +3d0cb18f8746f50c +bd28d39c1e2e42bd +3d272c63e1d1bd43 +bd3469ce0f17215f +bd21a7383c5c857a +3d1cb18f8746f50c +bd38d39c1e2e42bd +3d372c63e1d1bd43 +bd4469ce0f17215f +3feffffffffffeb5 +3ff000000000005a +3feffffffffffcb5 +3ff000000000015a +3feffffffffffab5 +42b8bfc0f8770d23 +c2c6a1537192f349 +42a36f6eebeac836 +c2a7a4692cdd1ae6 +42982ed78d12b852 +c2deed06745e798e +c2b96c63d7b11b62 +42c5954d3f663377 +c2ac55c8d8393636 +42b2607c37ba1940 +3d108e433ae0cc54 +3d342390ceb83315 +bd27b8de628f99d6 +3d4211c8675c198a +bd3bdc6f3147cceb +bfefffffffffffac +bfeffffffffffdac +bff00000000000d6 +bfeffffffffffbac +bff00000000001d6 +c2d869659df01ce1 +c2ab7eac2f5d14f1 +42b322ad3788a5c1 +c29d93ab44cdf7dc +42a16d85f3fb092c +3ce1abdbb9ea8e6e +3d211abdbb9ea8e7 +bd1dca8488c2ae32 +3d308d5eddcf5473 +bd2ee54244615719 +3cf1abdbb9ea8e6e +3d311abdbb9ea8e7 +bd2dca8488c2ae32 +3d408d5eddcf5473 +bd3ee54244615719 +3feffffffffffff3 +3ff00000000000f9 +3feffffffffffdf3 +3ff00000000001f9 +3feffffffffffbf3 +43036181e57c1de1 +c2b06c782f5d7e0c +42af31f915ca6149 +c2a03586a82eefc4 +429f97acb38161f5 +42f09487d9de9e79 +c2c231dba217b79e +42bc8e33748d6385 +c2b106e5d73dc1aa +42ae2e056b9e1641 +bcfee15577ae1472 +3d2c23d5510a3d72 +bd31ee15577ae147 +3d3e11eaa8851eb9 +bd40f70aabbd70a4 +bff0000000000037 +bfeffffffffffe6e +bff0000000000137 +bfeffffffffffc6e +bff0000000000237 +42d290c6a74eaab2 +c2b464d8ef97dd20 +42aa53dfaeb73b74 +c2a1ee855425ac98 +429ce353c14238f8 +bd03dba1aa51add5 +3d16122f2ad72916 +bd24f6e86a946b75 +3d2b0917956b948b +bd327b74354a35bb +bd13dba1aa51add5 +3d26122f2ad72916 +bd34f6e86a946b75 +3d3b0917956b948b +bd427b74354a35bb +3fefffffffffff31 +3ff0000000000098 +3feffffffffffd31 +3ff0000000000198 +3feffffffffffb31 +42c3bf72e5dc8f73 +c2bae546ed5989a8 +42a6c628ba5a3a3a +c2a410656cd4c776 +429a9c2b6e1b53f0 +42d0008909399b77 +c2cffeedffe24705 +42b555923ba16ea1 +c2b555187064e68d +42a999c5726b1fad +bd1ffeedf6b7d68d +3d20008904a414ba +bd37ffbb7dadf5a3 +3d38004482520a5d +bd43ffddbed6fad2 +bff0000000000098 +bfefffffffffff31 +bff0000000000198 +bfeffffffffffd31 +bff0000000000298 +42bae6ca2e7b263d +c2c3bdd1945bb1ab +42a410d12a82ed5f +c2a6c59df0e60caa +4298aa4273175718 +bd16111d218effa2 +3d03ddc5bce200bb +bd2b088e90c77fd1 +3d24f7716f38802f +bd3584474863bfe9 +bd26111d218effa2 +3d13ddc5bce200bb +bd3b088e90c77fd1 +3d34f7716f38802f +bd4584474863bfe9 +3ff0000000000037 +3ff0000000000137 +3feffffffffffe6e +3ff0000000000237 +3feffffffffffc6e +c2d28de52cc057a1 +c2aa53263528e7eb +42b465b794a6c5f2 +c29ce2e418fa2d88 +42a1eedb629edc5a +c2f08ff00a6d180f +c2bc8d5943bedcd5 +42c2328cd89385e6 +c2ae2d8b8de0949b +42b107336e8dcc65 +3cfee9e5c1ef600d +3d31ee9e5c1ef601 +bd2c22c347c213fe +3d40f74f2e0f7b00 +bd3e1161a3e109ff +bfeffffffffffff3 +bfeffffffffffdf3 +bff00000000000f9 +bfeffffffffffbf3 +bff00000000001f9 +c3034880fe55b594 +c2af30f4b14e8dac +42b06d089359338b +c29f972728c900fe +42a035ccf9113d38 +bce1a34b6fa942d3 +3d1dcb96920ad7a6 +bd211a34b6fa942d +3d2ee5cb49056bd3 +bd308d1a5b7d4a17 +bcf1a34b6fa942d3 +3d2dcb96920ad7a6 +bd311a34b6fa942d +3d3ee5cb49056bd3 +bd408d1a5b7d4a17 +3fefffffffffffac +3ff00000000000d6 +3feffffffffffdac +3ff00000000001d6 +3feffffffffffbac +42d86e62783f9806 +c2b321e9440a26f2 +42ab7f76839f7e78 +c2a16d34ad43f507 +429d9420541a218d +42def106c3daf7b4 +c2c59453f6d08e20 +42b96d10d5114cb0 +c2b26021d93f523f +42ac56344803651c +bd108c1f2850796d +3d27b9f06bd7c34a +bd342307ca141e5b +3d3bdcf835ebe1a5 +bd421183e50a0f2e +bff000000000005a +bfeffffffffffeb5 +bff000000000015a +bfeffffffffffcb5 +bff000000000025a +42c6a377da4b1a34 +c2b8be7933c7c5e3 +42a7a4fec60c17e5 +c2a36f09d8048641 +429b31e724b23fdd +bd0caf6b74b6a225 +3d11a84a45a4aeee +bd272bdadd2da889 +3d28d42522d25777 +bd3395ed6e96d445 +bd1caf6b74b6a225 +3d21a84a45a4aeee +bd372bdadd2da889 +3d38d42522d25777 +bd4395ed6e96d445 +3feffffffffffeea +3ff0000000000075 +3feffffffffffcea +3ff0000000000175 +3feffffffffffaea +42bd76ce5837e002 +c2c181bbd3bcd516 +42a4bd056806b955 +c2a5f6a4a5939186 +42992ab2b154fc9c +42c91575b45f58dd +c2d6174a427165ee +42b389a514cc37ad +c2b77e1245534015 +42a84317b138f411 +bd24695be08e656e +3d172d483ee33523 +bd3a34adf04732b7 +3d35cb520fb8cd49 +bd451a56f823995c +bfefffffffffff77 +bfeffffffffffd77 +bff00000000000bc +bfeffffffffffb77 +bff00000000001bc +c2cded78896f0dea +c2a94013c3bbf3e9 +42b5d65ef959fc88 +c29c3a2de3156dae +42a277e9b93a8cee +3cf613f7e4fa18d6 +3d22c27efc9f431b +bd1a7b0206c179cb +3d31613f7e4fa18d +bd2d3d810360bce5 +3d0613f7e4fa18d6 +3d32c27efc9f431b +bd2a7b0206c179cb +3d41613f7e4fa18d +bd3d3d810360bce5 +3ff0000000000014 +3ff0000000000114 +3feffffffffffe28 +3ff0000000000214 +3feffffffffffc28 +c2e9c11498b9ef53 +c2adb1ace4f70936 +42b158dd72ac907b +c29ecdce296f868f +42a0a5777bd11b46 +431d1ed8f24d0a1a +c2c0478e9e81029b +42bf75b7a651e6a4 +c2b02377feeeb4f0 +42afba45297673df +bcd195059e91c4d2 +3d2f7357d30b71d9 +bd304654167a4713 +3d3fb9abe985b8ed +bd40232a0b3d238a +bff000000000001d +bfeffffffffffe39 +bff000000000011d +bfeffffffffffc39 +bff000000000021d +42e1db8a7b8f4d1c +c2b204992af4d766 +42acc6ecba13547c +c2a0f2fa0a8e83e7 +429e4d95fb96b2c7 +bcfa79394c9e8a0a +3d1961b1acd85d7d +bd234f272993d141 +3d2cb0d8d66c2ebf +bd31a79394c9e8a1 +bd0a79394c9e8a0a +3d2961b1acd85d7d +bd334f272993d141 +3d3cb0d8d66c2ebf +bd41a79394c9e8a1 +3fefffffffffff66 +3ff00000000000b3 +3feffffffffffd66 +3ff00000000001b3 +3feffffffffffb66 +42ca8549af275387 +c2b6e944901d39bf +42a8958adc85a12b +c2a2d782892052c3 +429bce5dcf3d10e8 +42d42d787a6784ca +c2ca82d67eb70287 +42b6ea2eba1f8d15 +c2b3f4c1d4e7996b +42aab4b26f9d8007 +bd195fe8f2b56dbd +3d23500b86a54921 +bd3657fa3cad5b6f +3d39a805c352a491 +bd432bfd1e56adb8 +bff000000000007e +bfeffffffffffefc +bff000000000017e +bfeffffffffffcfc +bff000000000027e +42c0487b15752fca +c2bf73fe4e659fc3 +42a5752be29992ac +c2a535dcb7a0167c +4299b078583d1a87 +bd12c19a9f8dcb3b +3d0a7ccac0e4698b +bd2960cd4fc6e59d +3d269f32b0391a63 +bd34b066a7e372cf +bd22c19a9f8dcb3b +3d1a7ccac0e4698b +bd3960cd4fc6e59d +3d369f32b0391a63 +bd44b066a7e372cf +3feffffffffffea3 +3ff0000000000052 +3feffffffffffca3 +3ff0000000000152 +3feffffffffffaa3 +42b77f0877dcffd4 +c2c913449f6ffdbe +42a309677910956c +c2a842946d8796f3 +4297df3e18f71102 +c2e1d719b82596f6 +c2ba23a661871544 +42c49fcb79b88af2 +c2acc63410ae1abd +42b20529fc44b40c +3d0cb2fce8fc81a5 +3d33965f9d1f9035 +bd28d340c5c0df97 +3d41cb2fce8fc81a +bd3c69a062e06fcb +bfefffffffffffbe +bfeffffffffffdbe +bff00000000000df +bfeffffffffffbbe +bff00000000001df +c2deea5c27d6b748 +c2ac55813a21ab9f +42b260b878a472e7 +c29e0e3d77fd8a03 +42a11b4efe4116a7 +3cd1b19140c0c0d5 +3d208d8c8a060607 +bd1ee4e6ebf3f3f3 +3d3046c645030303 +bd2f727375f9f9f9 +3ce1b19140c0c0d5 +3d308d8c8a060607 +bd2ee4e6ebf3f3f3 +3d4046c645030303 +bd3f727375f9f9f9 +3fefffffffffffe1 +3ff00000000000f1 +3feffffffffffde1 +3ff00000000001f1 +3feffffffffffbe1 +42f0979924105e5f +c2b106b21e913729 +42ae2e56ac3f4138 +c2a07f444bb738b9 +429f105bb671c63e +42e9ca569f453eef +c2c2efe42b366726 +42bbb40c39bf3aa5 +c2b158573ed23f1b +42adb2718d286e31 +bd03da34489c213b +3d2b0972edd8f7b1 +bd327b4689138427 +3d3d84b976ec7bd9 +bd413da34489c214 +bff0000000000040 +bfeffffffffffe80 +bff0000000000140 +bfeffffffffffc80 +bff0000000000240 +42d0013fce752afe +c2b554c741410f19 +42a999ffe9c17959 +c2a248f060567c79 +429c72064400ed8f +bd06106670b43955 +3d14f7ccc7a5e355 +bd2584199c2d0e55 +3d2a7be663d2f1ab +bd32c20cce16872b +bd16106670b43955 +3d24f7ccc7a5e355 +bd3584199c2d0e55 +3d3a7be663d2f1ab +bd42c20cce16872b +3fefffffffffff1f +3ff000000000008f +3feffffffffffd1f +3ff000000000018f +3feffffffffffb1f +42c2330304640ad8 +c2bc8cc7d51c2015 +42a63a8e46473e0b +c2a481dcd0a595ea +429a3bea42a65482 +42cdf097d57267e2 +c2d12ead303560bf +42b4dae038c9406f +c2b5d58a4f69eb86 +42a940a1f6bd7ca5 +bd2119d95e8d3107 +3d1dcc4d42e59df2 +bd388cecaf469883 +3d37731350b9677d +bd44467657a34c42 +bff00000000000a1 +bfefffffffffff42 +bff00000000001a1 +bfeffffffffffd42 +bff00000000002a1 +42b96d842dc2b8d3 +c2c593add2eb8582 +42a3a42250f5e768 +c2a75836ee210539 +42985779dc25daa9 +3d01a900f67f753a +3d246a403d9fdd4f +bd172b7f84c04563 +3d3235201ecfeea7 +bd2b95bfc26022b1 +3d11a900f67f753a +3d346a403d9fdd4f +bd272b7f84c04563 +3d4235201ecfeea7 +bd3b95bfc26022b1 +3ff000000000002e +3ff000000000012e +3feffffffffffe5d +3ff000000000022e +3feffffffffffc5d +c2d615ee14b2d022 +c2ab17d4c2d676cf +42b389e92ff232cb +c29d57c2e6c948f9 +42a197da63974d8a +c2f72dc5bca75764 +c2bd754b37329701 +42c182cd4ae54ea8 +c2aead30d68eb9b3 +42b0b8ae4e17c5d0 +3cf616d2a8653209 +3d31616d2a865321 +bd2d3d25aaf359bf +3d40b0b695432990 +bd3e9e92d579acdf +bff0000000000002 +bfeffffffffffe04 +bff0000000000102 +bfeffffffffffc04 +bff0000000000202 +431d44dcf9dd505a +c2b0234987deda4a +42afba9ef67bb72c +c2a01191648b2fd2 +429fdd29b765a0fa +bcea765e893370d7 +3d1cb1342ed991e5 +bd21a765e893370d +3d2e589a176cc8f3 +bd30d3b2f4499b87 +bcfa765e893370d7 +3d2cb1342ed991e5 +bd31a765e893370d +3d3e589a176cc8f3 +bd40d3b2f4499b87 +3fefffffffffff9b +3ff00000000000cd +3feffffffffffd9b +3ff00000000001cd +3feffffffffffb9b +42d42e9b16d41c07 +c2b3f47ac8f4301b +42aab4f20f25ea1c +c2a1c28ddd3b61de +429d1d6288d89fcd +42db4d35d14d3826 +c2c6a1aed1270f66 +42b8bf8a55542c51 +c2b2bf20aaf451ec +42abe92713298fb1 +bd12c0e3eeb304ee +3d269f8e08a67d89 +bd34b038fbacc13b +3d3b4fc704533ec5 +bd42581c7dd6609e +bff0000000000063 +bfeffffffffffec7 +bff0000000000163 +bfeffffffffffcc7 +bff0000000000263 +42c4a063448ca840 +c2ba232c7d607594 +42a70ea7658795e5 +c2a3d969fa79a85a +429acd66d217bcb9 +bd0ee4303b192da6 +3d108de7e273692d +bd27b90c0ec64b69 +3d2846f3f139b497 +bd33dc86076325b5 +bd1ee4303b192da6 +3d208de7e273692d +bd37b90c0ec64b69 +3d3846f3f139b497 +bd43dc86076325b5 +3feffffffffffed8 +3ff000000000006c +3feffffffffffcd8 +3ff000000000016c +3feffffffffffad8 +42bbb49528fbd191 +c2c2ef6438f37bf1 +42a44902ea2858ab +c2a67ee4f4267da6 +4298d4890f2ec7f8 +42c7cc3a941e012f +c2d86a3a48c7bb90 +42b3228c8ddcd635 +c2b81a378a76f938 +42a7f2f9926d6297 +bd2583be43bfab2f +3d14f8837880a9a2 +bd3ac1df21dfd597 +3d353e20de202a69 +bd4560ef90efeacc +bfefffffffffff89 +bfeffffffffffd89 +bff00000000000c4 +bfeffffffffffb89 +bff00000000001c4 +c2d12dda8a07ec1f +c2a9f4d0c41801a9 +42b4db2dd25c9218 +c29ca9bccb0f5eec +42a21bb05a32d523 +3cf1aa6e583501d4 +3d22354dcb06a03b +bd1b956469f2bf8b +3d311aa6e583501d +bd2dcab234f95fc5 +3d01aa6e583501d4 +3d32354dcb06a03b +bd2b956469f2bf8b +3d411aa6e583501d +bd3dcab234f95fc5 +3ff000000000000b +3ff000000000010b +3feffffffffffe16 +3ff000000000020b +3feffffffffffc16 +c2f727c9a91f56aa +c2aeacdce551d727 +42b0b8e031045408 +c29f52d8e89f88c1 +42a05a65d5a2744d +43035d5294871954 +c2c0df09dc0731d7 +42be6dbb6f005cb3 +c2b06c903f5727a3 +42af31cdae87d420 +bcea70a9025d3e70 +3d2e58f56fda2c19 +bd30d3854812e9f3 +3d3f2c7ab7ed160d +bd4069c2a40974fa +bff0000000000025 +bfeffffffffffe4b +bff0000000000125 +bfeffffffffffc4b +bff0000000000225 +42db4f49e76fcb63 +c2b2bee1f8cc2eac +42abe96c9196def1 +c2a143ab8b7f317b +429dd1012c410c04 +bcfee2c2d963a10c +3d18474f49a717bd +bd23dc585b2c7422 +3d2c23a7a4d38bde +bd31ee2c2d963a11 +bd0ee2c2d963a10c +3d28474f49a717bd +bd33dc585b2c7422 +3d3c23a7a4d38bde +bd41ee2c2d963a11 +3fefffffffffff54 +3ff00000000000aa +3feffffffffffd54 +3ff00000000001aa +3feffffffffffb54 +42c7cd04aed1c70b +c2b819cfe7bbc1a0 +42a7f32cbce1f313 +c2a33b7069b67670 +429b6554c418246c +42d2904bada57da5 +c2cc1df4ec6b12e5 +42b65cde9e942d82 +c2b464fe09c8cdd9 +42aa53c0c46a0427 +bd1b94adb917f93e +3d2235a923740361 +bd36e52b6e45fe50 +3d391ad491ba01b0 +bd437295b722ff28 +bff0000000000087 +bfefffffffffff0d +bff0000000000187 +bfeffffffffffd0d +bff0000000000287 +42be6e60a2f7a65a +c2c0dea44df557a4 +42a4f9117b0914e0 +c2a5b4d32c719f71 +429956b799ce587b +bd13dbfd02bf10fb +3d084805fa81de0a +bd29edfe815f887e +3d2612017ea07782 +bd34f6ff40afc43f +bd23dbfd02bf10fb +3d184805fa81de0a +bd39edfe815f887e +3d3612017ea07782 +bd44f6ff40afc43f +3feffffffffffe92 +3ff0000000000049 +3feffffffffffc92 +3ff0000000000149 +3feffffffffffa92 +42b65d37d898ff8e +c2cc1cdae0d28da2 +42a2a779bd346847 +c2a8e93ccdedd572 +429791aa00adc618 +c2e514d0b07eb8d5 +c2bae587752e30d4 +42c3bf2d537de760 +c2ad3a295dc23e22 +42b1ad5215aa1d11 +3d0849735c376aa4 +3d33092e6b86ed54 +bd29eda328f22557 +3d41849735c376aa +bd3cf6d1947912ac +bfefffffffffffcf +bfeffffffffffdcf +bff00000000000e8 +bfeffffffffffbcf +bff00000000001e8 +c2e51256ab80db15 +c2ad39dd2b0fc9d2 +42b1ad89d60be4d0 +c29e8cd84b084c3d +42a0cc11aef3c723 +3c46d61b58c99c43 +3d20005b586d6326 +bd1fff494f2539b3 +3d30002dac36b193 +bd2fffa4a7929cda +3c56d61b58c99c43 +3d30005b586d6326 +bd2fff494f2539b3 +3d40002dac36b193 +bd3fffa4a7929cda +3fefffffffffffcf +3ff00000000000e8 +3feffffffffffdcf +3ff00000000001e8 +3feffffffffffbcf +42e51c423eee6fbc +c2b1acaadcc260d6 +42ad3b0dff29d9a7 +c2a0cbad04bd85ae +429e8d7ed185718e +42e519c67a00d71d +c2c3be171d28419e +42bae689a099d185 +c2b1ace299056812 +42ad3ac1c7cf39e8 +bd0843bdd561383d +3d29ef108aa7b1f1 +bd330877baac2708 +3d3cf7884553d8f8 +bd41843bdd561384 +bff0000000000049 +bfeffffffffffe92 +bff0000000000149 +bfeffffffffffc92 +bff0000000000249 +42cc214393e835d8 +c2b65bd30134cedd +42a8ea1a431fd261 +c2a2a6fd961fd662 +429c0424247899eb +bd08452b3716c4d6 +3d13dd6a64749d95 +bd26114acdc5b136 +3d29eeb5323a4eca +bd3308a566e2d89b +bd18452b3716c4d6 +3d23dd6a64749d95 +bd36114acdc5b136 +3d39eeb5323a4eca +bd4308a566e2d89b +3fefffffffffff0d +3ff0000000000087 +3feffffffffffd0d +3ff0000000000187 +3feffffffffffb0d +42c0e03aa2e70f90 +c2be6bcbfd21f662 +42a5b57b50578afc +c2a4f8748c1b7ef5 +4299de57bce251e4 +42cc202945f34d1f +c2d28e60069d9615 +42b4659277d2b4cd +c2b65c2c32e23671 +42a8e9e2e46232a0 +bd22343bc1be76c7 +3d1b97887c831272 +bd391a1de0df3b64 +3d36e5e21f20c49c +bd448d0ef06f9db2 +bff00000000000aa +bfefffffffffff54 +bff00000000001aa +bfeffffffffffd54 +bff00000000002aa +42b81b6e878d6319 +c2c7c9dc946ca4d2 +42a33bf467cfc9ae +c2a7f260182f4602 +429806d5c5e8902f +bd1845e1e7f18b23 +3cfee8786039d373 +bd2c22f0f3f8c592 +3d23dd0f0c073a6e +bd36117879fc62c9 +bd2845e1e7f18b23 +3d0ee8786039d373 +bd3c22f0f3f8c592 +3d33dd0f0c073a6e +bd46117879fc62c9 +3ff0000000000026 +3ff0000000000126 +3feffffffffffe4b +3ff0000000000226 +3feffffffffffc4b +c2db46fb7468f012 +c2abe8569ffdad27 +42b2bfdccb416714 +c29dd06293a2e08b +42a14415e839de56 +c3034ca753a243c5 +c2be6c711c15f6c7 +42c0dfd5067fb781 +c2af312016354d9d +42b06cf081fef1ee +3cea877f1db6080c +3d30d43bf8edb040 +bd2e57880e249f7f +3d406a1dfc76d820 +bd3f2bc407124fc0 +bff000000000000b +bfeffffffffffe16 +bff000000000010b +bfeffffffffffc16 +bff000000000020b +42f73fcc95631e8d +c2b0b818ac4bbf15 +42aeae2cb50a355a +c2a05a066bd068b8 +429f5387f91b1569 +bcf1a4b8d15ecf6d +3d1b96d1cba84c25 +bd2234971a2bd9ee +3d2dcb68e5d42612 +bd311a4b8d15ecf7 +bd01a4b8d15ecf6d +3d2b96d1cba84c25 +bd3234971a2bd9ee +3d3dcb68e5d42612 +bd411a4b8d15ecf7 +3fefffffffffff89 +3ff00000000000c4 +3feffffffffffd89 +3ff00000000001c4 +3feffffffffffb89 +42d131259be2bbbc +c2b4d9f779976eb2 +42a9f5c132f25252 +c2a21b3b5c7dab8b +429caa4f614d531b +42d86d8d84f7c9df +c2c7caa686ecc567 +42b81b06da5f9d07 +c2b32209eb888919 +42ab7f54ca1af879 +bd14f5a8b515906f +3d25852ba57537c9 +bd353d6a2d45641c +3d3ac295d2ba9be4 +bd429eb516a2b20e +bff000000000006c +bfeffffffffffed8 +bff000000000016c +bfeffffffffffcd8 +bff000000000026c +42c2f1642a88e882 +c2bbb2718bc13e63 +42a67f998bae02b3 +c2a448701aa3c2fb +429a6bc2bfef0a05 +bd108c7a80bddc93 +3d0ee70afe8446d9 +bd28463d405eee4a +3d27b9c2bfa111b6 +bd34231ea02f7725 +bd208c7a80bddc93 +3d1ee70afe8446d9 +bd38463d405eee4a +3d37b9c2bfa111b6 +bd44231ea02f7725 +3feffffffffffec7 +3ff0000000000063 +3feffffffffffcc7 +3ff0000000000163 +3feffffffffffac7 +42ba251428a1a825 +c2c49e044d945109 +42a3d9f693e16304 +c2a70de9b913613e +429880a59fa2cc55 +42c6a31c6c4c0a3d +c2db490e97dc4168 +42b2bf9e142eddaf +c2b8beafd234bc48 +42a7a4e5d6ab7579 +bd269e20a6f0f0ef +3d12c3beb21e1e21 +bd3b4f1053787878 +3d34b0efac878788 +bd45a78829bc3c3c +bfefffffffffff9a +bfeffffffffffd9a +bff00000000000cd +bfeffffffffffb9a +bff00000000001cd +c2d42a1169286eae +c2aab3f3981ee0fe +42b3f597049dbc9e +c29d1ccb507f4759 +42a1c2fe6be5a4a7 +3cea81c996dfd5a5 +3d21a81c996dfd5a +bd1cafc6cd24054b +3d30d40e4cb6fead +bd2e57e3669202a6 +3cfa81c996dfd5a5 +3d31a81c996dfd5a +bd2cafc6cd24054b +3d40d40e4cb6fead +bd3e57e3669202a6 +3ff0000000000002 +3ff0000000000102 +3feffffffffffe04 +3ff0000000000202 +3feffffffffffc04 +c31caf147da677e3 +c2afb937ce502bff +42b024036a63e72d +c29fdc74977e896e +42a011ed880f0327 +42f739c7306010b7 +c2c181f2827ffd13 +42bd7680e808d941 +c2b0b84a8bbb85bd +42aeadd8be6ada10 +bcf60b679ab8cd3b +3d2d3e930ca8e659 +bd3160b679ab8cd4 +3d3e9f498654732c +bd40b05b3cd5c66a +bff000000000002e +bfeffffffffffe5d +bff000000000012e +bfeffffffffffc5d +bff000000000022e +42d61b5fcd28d34c +c2b388d8ce7a95d0 +42ab18dab7838a49 +c2a1976bf514398d +429d585c862c9335 +bd01a62633145c07 +3d172cece675d1fd +bd2469898cc51702 +3d2b9676733ae8fe +bd3234c4c6628b81 +bd11a62633145c07 +3d272cece675d1fd +bd3469898cc51702 +3d3b9676733ae8fe +bd4234c4c6628b81 +3e40000000000000 +3e30000000000000 +3e3fffffffffffff +3e30000000000001 +bdc1a62633145c07 +3dd72cece675d1fd +bde469898cc51702 +3deb9676733ae8fe +bdf234c4c6628b81 +c3bd9ba9a7975636 +bca1a62633145c07 +be31a62633145c07 +bfc1c30050dfdf16 +3ff91f87e14747bc +40022406fd33cce6 +3fe96366c2be1bd5 +c023bd178277d23c +3fe93782027acf51 +bff22d3a81d692dc +3ff02fbd261298fd +404cc9bd60e1a8ec +bff5953676cf6ff2 +40235710be1ca064 +bfc78b81191cdace +4000d2e7305c0dd2 +bfc132c6524c46c4 +3fdb4f6842880138 +3fe5b133fb85ec46 +400905f7fd752d3e +4013aa3d30b63d4e +3fd935225ca489f9 +3ff1e5b075e2f7ab +bfc6d545d36dec3e +bfc481f7f64a8639 +bfe96bdc7f66a42a +bff091167b81df1f +c001d528b3c2231b +3ffdd77d7d081e0d +bfd29f3e8c415840 +bfde6021cce5d81c +4010f7460d6b3391 +3ffa6372d61a549c +bfe573707d83a466 +bff9c5bdcdf96655 +c035380db2245eb1 +bffff9cdffea406a +4006a8ea662e98f1 +3fb9d53eb8c14f37 +3febf1043f354b6c +c00305008c842054 +bffce0481241572e +3fd210aacc83d019 +bff1050300a7c9d9 +3ff6837178805385 +3ff096670bd9ed66 +3fc89b6592875cee +3fc38b794265c8df +4028e719444f67c0 +bfe0c7764e07d1f5 +3fb7477e5a225751 +bfd1b0af3fe58258 +3fea902a0d363e97 +c01145d402b33a91 +bfead0707fd6792d +bfd064106319c0d3 +3fb2e7b2ebba9ca9 +40118c3955c4a9fb +3fe12b585876eb2e +c000aeb24f2b3716 +bfe86fd333566890 +c009e649cc1550d5 +4011aa9af8f5a751 +4036097105e20c72 +3fee5e696d381259 +c02605ad88a692ba +40006f2659885460 +bfefdd7f783cd801 +400db7318da6a97c +bfd68b719d930eec +bff1d14776daf2ec +bfdb261ba3980419 +bffd87ca102ee8d8 +bff10ea58b16e834 +3ff78adf5f60868d +3ff2d469f50e1cca +c0032c1e7f21ed5c +3f50a7c6d821baec +401bdb5fc8fd9cb6 +3fc7af85a1fa8744 +c0177339def54c75 +3fe52d114182561b +c00317c6f33e2879 +bff518e6c6814ab4 +bfefa780315c9cb5 +4006437265aa159c +bffb6c9ab00cff75 +3ff9e7488ac54265 +4010070e7b9b7880 +3fa719653d176850 +3fd910cb6230e44a +3ffdc65588c640ea +3fe586ce5d63b78e +3ff6a1184c6460d0 +3fe672aef2ebbc1d +4021424db70c60d1 +3ff605be73a901ba +bfff3a462f9d11b4 +bfe9a720343f0446 +c016ea71dabe50d1 +3ff5c93ec88e56ad +bfefa6da1ad13a14 +bff0112aa2c6578a +c02243b7e2421512 +3f795650cdfa4f99 +3fd5e90e193761da +3f8bfd2fb58821ab +bff35a2730bb48a9 +bfaa36048398e83d +bfc6d91cf04e7afd +3ffa3421dd5993a7 +bfcbc5c5c3ae0d9c +3ff478776af5e423 +c007ad3e4742f9ed +4046e31868861123 +c003b4d3c9d3f6b9 +bfc083ab19c1752d +4016bd5eba46e94c +3fff84d29e53aba8 +c015c5f1dd11b575 +3f6ddeaacbe5088d +bfe283e4ad32ab8c +c01df97a13672390 +3fd474fff2b59d76 +bfef175d99e40883 +3ffa34a7002995c1 +3fde79f16f93d8a8 +bfd9311286a65907 +3fe5b1ba2d4aaaa8 +3fcdbc4e14ae3253 +3fce92db8217049d +bff645ff03627e0b +403044b3c967e3cf +c008a04c8ab8d5c1 +3fe66a2b02aa76ec +bffe0f115846842e +3ff281d31adcedb7 +c061e92bc2f2d3b3 +3fc3c892c5c85f52 +3fe1bdb5f322501a +40057b586f79fef5 +3feab2c3aaf7daf9 +bfe1fbc9419c442c +3fd3186df31ab16f +3ff094433b1e6d1b +bfbf54517176363c +bff0bce2e8a1ee90 +40266be6eaaed96f +3fef0e754e69f455 +bfceaabff7d3ca5d +bfeb3ddc036d6a40 +3fef8ea4ef92a605 +3fbbbaf9c453991b +4016774dcadc1128 +40188dc836c04a3d +3ff415a878a00b6a +c00b2ab08c70d36f +3fe6c9e5a29c48bf +3fcc5465c3b8c8bb +4011e5ca7d78c259 +bfe3305327d211fc +c00633cbecba3d96 +3fd69df5ed3510f6 +c04ce20bafdfff90 +bfe09e0ff8f9595e +c0001a8fcf9e0741 +3fc953097b59d6b0 +400610fdc16d3b9e +bfee228b4b76a6ec +c00a71aac82777bd +401030d0f84d8cd8 +bfe9fc4dd56b0db6 +4002b5d12195fdae +3fcd2767dd294c60 +bfe6e96b761f14d1 +3fd0ae49d0cbbf8b +c003f2f11d4024c1 +4005f534355db508 +bfba196b4c7f8a2c +bff15bf833261806 +40185d6fe308e07c +40368275ea71520b +4031f4775e8163ce +bfea45c732481d78 +bfdec4c29c70a6d8 +3fd460551fbd23d8 +bfe19e19ce200e19 +bffc974dd9320737 +3ff1e391fd066195 +400a76210c43aa17 +401246800add5d64 +3ffbaa6e3a42664a +bfe8c866b257d5ee +3ff911eeb5604413 +4003710303a2e0eb +c03b404127117c09 +bfd232b2f728d671 +bffc4349b0b28f29 +3fe58e3910c226b6 +3ff7c64a6dcec78c +3fdb26d81b6e306b +bfc209380d6fa21b +402247d1c9bfca9a +bfcb103309faff81 +400559c243b847d4 +3fb8734217e4f1f1 +3fe5e9bdf1d66eaf +bfd953afe629f0a3 +bfeaf89f8b8c8022 +bff2285210f60832 +bf8bcc2510110fe7 +3fe002fd079dd8d4 +bff2bdd9beaccd29 +bfc8416c261d13d2 +c0070bb2c6c9d583 +3fdb1db17b745d66 +3f56bdaa0a83c4c9 +bff88687f70e670b +bfc1e35a8182962e +401372316b098bf1 +3fe81ff37e0f7318 +c00c16ef48563b6f +bfe15e9474b61cc9 +bffcd651a56661cc +bfc7ce34effdc984 +bfc77ec33ab3e270 +bff1d3371d560ecf +3fb9e3a3b636fb13 +bff6af5b629dbc1e +bff910290e577ee2 +3ff11eb7c7262f06 +3fee1ce3c8ec1de7 +c016f0e75bf8921a +3fb3bbcc29e1a253 +3fdc1a182ab232db +3fe6d7763bcf991f +3fe309b9718cb415 +3fdb6612df163c45 +c0012fcab7ab0bad +3fec4207c3f94e98 +bfb7d695bfe0c476 +bfa50cf64b291596 +bfffa8ed9a76f800 +3fef957edc1e0b06 +4012efea220b9984 +bfc13ead089da063 +bfd79ae82b03ba55 +bffd5c7eb4bf6768 +3ff9708a78fb31bd +bffa944d31dc530b +c02392cd69bf5c53 +3ffb9ed6888ff2cb +3fc8c67dac647c1f +bff39fe850455c36 +c00e0021a9a8d96f +bffe0da6119004d8 +3fccad860f7d10e4 +40000c83628a668f +3fe148b932701377 +bff1d8eefbf3317f +c0056b4e65e0038d +bff954c320c631e1 +bfe3d9aedb0988f1 +3fc706ca504b8d6c +bfdd8488f7a99f00 +3fc11fbf69def918 +3ff0411a0800066c +4021530bbdd83f9f +3fdee206033b071a +3fd1b7c91850fa73 +bfc34b748db46040 +bfc2f98a39c974ce +bfc8ed112e0312d3 +bfeceab9e4130fb4 +c06f64dc5b2bdfe0 +bfb9f1b08a067885 +3fabb1f34e01bbdc +bfeeda61e40e55b1 +bff99ddf40e6ad14 +bfb894084ccbc9d0 +3fdd952d359d2584 +3fc964ff6ccd5374 +3fc810bfaa6bb96d +bffa62ab6dc79d24 +3fd655c7fcd27148 +3ff70cd0275c3abe +3fd80d4eaa86d6a8 +3fc37e24cb09d77d +c02ec5ac5552991f +3f706828ab4520dd +c041b98483fc63f3 +3fe747f610c7f7e2 +4000a2f1cd908006 +3ff4877c7829908c +3ff43e311d7a4e39 +c02a847fcac1755c +bfffe23e8efc4060 +3f6e3a2dbeee0f94 +bfe8b1ed3a3e781a +bf801d239fd6541b +bfeabc7256c0f542 +c04c68484b68b151 +c0042a17cf0ba4bf +3ff2362c7155acb7 +c01e598cdfe46b7d +bff2f5df7c92dd99 +c001927d107a0573 +3fe649cfe16c537a +bfd830d9fc4abb7b +bfe73350d03d1602 +bfc4cb3be1e68855 +bff66bd46a65d968 +400123be48f019a5 +3ffa3506545281e4 +3fbdeff255fce259 +401409907ec02f27 +c004b1ca98198546 +c008af678f1fcf9e +c00f40621b4f318a +40044d4411ea26ec +bfe375f6644324aa +4000fe8b85a096be +3ff3dd66b8f817c3 +c038bef6386156f7 +bfeb42a6947e3206 +4033b8491a18f387 +bfc9b11e60b58e8e +3fd6cda37f6632ba +400ec6858d6f4923 +c00bd90400f25256 +3fd4cb0fb0a6ac2c +c03bc723c81b739f +bf92632c7f0ee524 +3fcd012f20574439 +3ff8f19118409f47 +3fda8125b576bf4c +4007225f8dc03877 +3f9aa3f0091b3532 +4009ab3eb83b36c4 +3ffca77995d10ee4 +3ff587e7cfd2b53e +40569602dbd7b29e +3ff60a5aeed090d8 +3ffdc2e879d5b72a +c002deb88e74a716 +400002141976e05c +3fed62e6c03330ad +3ffc2bd92e02961b +3fefdbcf9e520e8d +bfec9d354a2131e9 +3ff852822c299fe8 +3ffa4a7c800a6e77 +3ffd570cd32d5dd3 +40023f46326b7d8f +4003a04658612a05 +bfe5b68bc4359f41 +bfee53625a5147f0 +3ff2b991289f5fb2 +bfc8c6a90e14e9f0 +bfe6f9c479961d20 +bff2bb912b0b909c +3fdced11fe6e456c +3fe4901bbd0e420b +3fece620d2449cce +c02380e9a538a183 +bff1055b17af2bb4 +400ee9eace0a9997 +c0c6be1274688307 +406a014c228abb6b +bff4601225abe845 +3fe467c2af44dffa +bfd29f2f2094f3f4 +3feedd15e844c26e +bfd7ed7dde6e5f16 +bfbaaf69f74d68b3 +3fd2d784061a5d06 +4012cb39f791121e +4007f6bd5c28e63c +bfc249cdd6ba6d95 +bfd8f658972a1036 +4010b6c343188a93 +3fd5dcf70fcc893f +40005d5b3df3cbdc +3f9c0fd762a536fe +bfda937ae67079ea +bfd98b302c027896 +bfe25122f5c43571 +bfdd2d917f414d72 +3fd9a9d7c1f4345b +400af240e8c8a208 +3fff4331ca284707 +bfc9e8baf50e71f4 +3ff4b3faef5800a3 +c016e80a5664688b +bfc6c7f557bcecbc +bfb0196f5cfd97c0 +3ffda193b5e9e50c +bfc7b0871d1d0f21 +407a7a5c48726d96 +bff0f842e719de5d +bfd9ab1b01e792d7 +3ff7783bfa898e09 +3fda9d871d9d0d0b +3fd1b2bc2b1eb838 +3ffc3340074732f9 +3ffdaf3bcbdb5a90 +bfe341404024d802 +c002744bdd21d4c9 +3ff1901f785c24a4 +3fb323ff30847f0a +3ff2af1ea6c8d788 +40201d8bdeaebd57 +bff3c2cbf677f402 +3feaec0a2639fbb0 +bfc66d6527e66744 +3ffa038f6802e392 +3ff9c8af06843914 +3fd542e4ad639468 +c004cbf190e33e35 +c00006e8028e0c4d +4035e77c85f596da +3fc7c42365771847 +3fd9871e70c9e7e2 +3fa18e0c59d346fc +3fe015a9e9368404 +3ff57981bb9af924 +401e1b7ad04f01c3 +3feaf266c6d8cb05 +bfbdb0de834fb9c4 +bfec43fac705d175 +bfe0d2f872652700 +bfdae158675f6142 +3fe910cf4d67758c +3fd6723a49f89327 +bfc956ad3eddd481 +3ff3494ae10b4ebe +bff9bb75f8e12203 +3ff1bbd4379c4cac +400c0f9e112e34e1 +bfb5da44f5420864 +bff1bd10d267ca0f +3fc3f21afbd38e7e +3ff95ea5d93ac271 +4008c202911c2292 +3feb97ecc1035e58 +3fef466ba7be5603 +3fc135b20356b246 +3ff12063927bc057 +3ff66f8672e8ffd3 +3fc4a04e547b018e +400018f77f071cd1 +bfd3405972bd5665 +3fe1ddc5c89ba338 +c0291b1f6514e884 +3fd7591e1d7ca8fd +c044b74b07848c65 +bfebfa59fc1c2a9c +3ff3b888a640dd36 +3fe9fbeda9c081d6 +3fe1e8904c4e5228 +bfd32d06e5fa9758 +3fe42713e1f65201 +bfbac237636506e0 +bfcde1f789cf8e21 +4020259c16378683 +bff7f2bee8ec286e +c004f7a625289938 +bff455958072bd6d +bfeeeacfb147740e +bfea852b39f2cb35 +bfd322e0e6e66d2a +3ff2e8f52aab8d67 +bff4e4365b6d9fbd +40424bea53e5dc7a +c0304cc09643375b +3fc0ca62e2bc49d3 +bfb67f617aa4d1fd +3f9e8de856ce1434 +bfe2c55f231c8d5c +3fea0b573f132878 +bfea0b6e52b29bc8 +bfa4379e866c8dc6 +3fd4d6881625c02b +bff1f489643ee9d8 +3fbc49d262a776b5 +bfcd6d2b9233770e +3fd3068d3f7ef934 +bff41cba5dc5fa4b +3fe842f2489f89b4 +bfdd819c4c6440bb +400723bbd4e76608 +bfe7b4706fe9f954 +3fc144c0b96d1d48 +3fe45d6de216084c +3fd413e7b1a86dd7 +3ff039cee20bd7aa +c041693aa805e23f +400018a2517347d8 +3fe99d6c2f4aadd1 +bfab41916639ddfe +3ff994acf1ed581c +40102930c1230520 +3fe302e6fe955ac7 +bffc72be08a71cff +401788f9839714c2 +c039384df05b1b43 +bfdf78f75cc84f95 +bfe62a05694c503c +3ff1e7acb1393bb9 +3fefe41914f30ff2 +3feb3a550f9b5eba +3ffa650c82bd900b +bff3b41cf6f40e70 +bfdc3c3120a0fde9 +3fd4cd219db91092 +3fda2c0366b527be +40164a7a26b205bb +bfd484fd1fb21924 +bfef24e90d8788b7 +c01e4b361eab3bde +3fe8525dec01199b +bff016aef64e039d +3fd48776ecc99d93 +bf963ccf546dc07a +bfb372799ea0f21f +3fbdb6c0f3c7e5cb +bff53b965a033ee2 +bfe13f96b030123f +bfe898f6099abf5e +c010d3760fc4fcb0 +c007c808bbdf8b16 +c0010bdd25601a57 +3ff2b57ef151dd3c +bfe084e70b98f5e7 +bff20d220cb899ed +3fc0309ea91db0df +bff22c7162b5280a +4001e09bfbc4d146 +3fdacead7def780d +3ff2a763a5807cfb +3fd6a2d8517c9066 +bfe6d2e38fcfcc76 +40035b06e12e693f +bfebae67d9299eea +bff948f5cca6d996 +bfe9540f9fdd1738 +c020b0f4ba7002d5 +c012668bf056acb6 +3fca697f69630d3d +3ff4994959563a07 +bff387d3455d9f9c +3fff20197cdc5669 +4001ab9eff496101 +bfb7c620ed11d9f4 +c0018140c93fe4cc +c016c270de24fb00 +40134263bbc424fc +401db4a13cfab834 +3f937f0495ec3f83 +bffe4d22fe41301d +bfcdcd3eb01f0ed7 +401295025048bee1 +3feade310c370659 +bff030a6cdf1b0f7 +c01ed3957ef077ec +c0325d29c7cac45b +bfe72e7bf61f694f +bfd06386beea6104 +bf90e75652f84592 +3ffd28f44fc2ebb8 +3fe8aacc21829a98 +3feeb5ef64030005 +c0191808c820a18c +bfe72c1b0af7dc4e +3fe4c9ba5c7e7d6e +3fd824dbf0890eb8 +404c3abde5b4e5ee +40108825de84e46e +3ff60d91582f01e0 +c00771b98e6ca0aa +bfe7ae1a9b25c2b7 +bfe102598ef2b178 +c01ef8f1a7808e0f +bfee5ec5e0071a9a +3feed55d27d24f0b +bfe55cc0a5835aa5 +bfed1ed1ed1b4c9c +3ff5ad96059952dd +bfff005e067b906e +bfe839fbd8c1c164 +40209e4946ae1334 +bfcd800659592684 +40002ce27076f23c +3fcb36346af5251f +bfe1392f418681da +402153b301a3ac2b +bfbfb38b99b853bd +40072c666b8beb7d +3ff394c6d8eba0f2 +3fee775b9b1e2320 +4022cd4fd32de54d +bff557210c29d5f6 +3ff761e4159c7136 +bfe5e3ed96dc261c +3fd41e092593cee7 +bfdd49c05b70aa56 +bfe6c1a2c1c2dc21 +c007bf76fb77dd0b +bfdbba57b8a48420 +403f4c9992d48870 +bff1f1ee170d39fd +4007bb295cb7c241 +c0009af9087fa43f +bfd107ea0d0a716a +bff315a1e692fbea +402ebe76a872ef36 +c036a22cbbf2b4e3 +bfed1d0218858478 +bfc2fc1e7709b1cf +3fd7a2d08ad167a2 +bff07557018aab89 +3fed107d9750a230 +3ff5559c8b8319cb +c04c5a8e5ec79111 +bfc0941880c0922d +3fd8e6a783b3f4b9 +3ff9d0a01ba5166a +c008ad70cdca67a4 +3fe2c90821b51bd3 +c000b699c83fdd3c +bfeb2ee86cdb71de +3fe5dbe55d8912c7 +3ff4b0fa8e2a43c9 +bffe1915c6d2f91f +3feaca2b6ee2467e +4011d77c6316c34a +3fd04605da3f138e +3ff5a32ed8f7a2f4 +3fe084e7843dba0d +c05471d9b2301a7c +3fb953bc5cb6866c +3fe29a601aee8b7b +40072fc0eb1337f2 +3ff636a442951f03 +c00b5b3369bbca57 +3fe11b171fd2327d +bff406d28dba9370 +3fdb0ed6c69c0be8 +3fd0aac32a20a12e +4022c7b2e55d37b7 +c00142fcf730b8e6 +3fc140135c2ad92b +3fd5f972e00a12e5 +3f79b4649eb9ad5c +bf91a033efc01ebb +3fe0ec6337cc527c +bff41f189d845efa +3fe3bc5b985de6f1 +40022db2991712d3 +3fe765b1fad4030a +402dd75c672a73b3 +3ff8eac8cfc56df6 +c00c006707fbd577 +3fab9265d9577706 +bffb8bc59f6f3271 +3ff109adab84164f +c00b412193aa2d6a +bf6697ccd2110d1e +3fc005ed8d3d3fc7 +3ff470a256e045a9 +400d954bec2ddc3a +400d5c6d8a59e380 +4000314734172625 +c01404dad001eb08 +bfe3ce7bb04e69b2 +401580b6d03cc0cf +406748d72b09431f +3fe7811b76e1039f +bfcc5fe6439283fa +3fc1f31e1534af09 +3fead5a959f46037 +bfffa2b96c414140 +40336cd06cb3a216 +3fff55d7321a7a8f +bfebc4104d559d89 +c01be7d5ff0be3ef +bfe3eeac88bafa30 +bfd7c35d95c213b8 +3ff6d58fe3e83f02 +3feadc39f2279169 +3ff3dc46262e32b3 +3fd72879d3c89d8e +bfed54757a800529 +3fcc5d4c9622491b +bff1057ebe935fe9 +bfde4e0c0ab215e6 +bfa95bb711be1c8b +400953cb7ebde770 +3fe22f895419193c +bfd173427b2b15b5 +3fd8110a5cc7d981 +3fd49d4d1c8efa4b +c0148719a4c28ed2 +c00b2a1b4ed835d8 +bf901edfcb3b54ed +3fdf9d054a575f2a +3ff45b76bf6e7951 +3ff2a6ba21e06973 +bfb2fa01a2619416 +40044a5fbf40eb71 +bff003e04080d71a +3fd92ff97a0d1f84 +bff3ae919faa06d6 +3fd1b1d06d9522cd +c0015fc11410a6cc +c00ce66bcb045108 +bfe3b914fac2e785 +bff147a7c3741459 +3ffa009d2352ffb2 +3ff30249cbd2df35 +bfec3b5a2240b5fd +3fcfedb3061102f4 +bff105c196a89d06 +c01e049d2c6c4c1d +3ffd875469b6c106 +bfe35d8c226e8efc +bfb683f5bab77a3b +c0143e95922f6e03 +bfc5689d5160f48a +bff2249bb886b055 +3fc606c16a1e63aa +3fe086691d71a9a3 +400e001a05476f2d +3ff144ac6e5351db +bfe1bd56d1311c8b +3ff0fbc746b7c904 +c0273518c307dc4c +3fe7214fecb24c15 +c01bb944baf3919c +3fe1ec89ae9398b7 +3ff232543e53bdcf +40092eb644c565a9 +c02702a1c1d6538b +c0068f3a6cf5c464 +bfabe88f786121df +c022aeb1da73ab7b +bfa1975798e94308 +bffc4b7b8e59040f +bfeee9e921aff352 +3fcd14ebfe4ba0da +bfe25732155e4d50 +bfe95a2b5f50dd49 +3fda7dab7beabdee +bfe0b4af64623105 +c02b14488d018deb +bfff605c250ccbea +bfdedf7f814b85c2 +c0673aafb59d887a +bfeefcc538daecb3 +4064e1dde8afca9d +bff3e9a52785aafd +c009926d9413690f +bf980c350709b7f4 +3ffa95d9d303525b +400f3db859c44de0 +bfeb05ebda6fbef3 +3ff52240d08a6f05 +bfc70904f3517590 +c011621fa95718af +3ff1178c2e25494e +c007f77b0f5760c7 +bfc69861707cd4cf +3fdef75d425e300e +3fc5c6ad3088f8e6 +c008111e6bcb5c73 +bfc20b0e3f2763e6 +3fe7c1d310cb26cf +bff9132e97818e62 +4011746098749d53 +bfce1ba417b40475 +bfdd732e2427fe60 +bfe029438b64fc73 +bfa8a6e91962431f +3fd09964fd05123c +3f8253ef7a3505e4 +400163b97720ce9e +3ff5c42513bf9bfc +3fd4a26a4b293002 +3fe1dc7c2ca7c505 +bff90e10880d4f26 +3ff59cb54a1478bf +4005a51468257f48 +3fbaae3c9fc4e89b +3f9d38640243428e +c00b648759785725 +bfeae1b35482de22 +3ffcf45b78eb7614 +3ff6a2d0b4dfd9e4 +3ff26a6b8a58142a +bfea4f6ffb1dedef +401217fe4ed07f38 +c011f6453235eb23 +40257dcd19c1a3e2 +c0536f0889e09ad4 +bfee28686d6f892e +bfd5df70241979b2 +3ff6714f5bcb7890 +c005d915c504db57 +402280354544c14b +3fd27561e60d6018 +3fd5467eca162738 +3fea263230d296f8 +c00324980066a928 +4006e0326211f1db +3fe954f61b98e3d1 +3fff8469649c950d +3ff3c1ac486c2cac +c001fbe749fbaa0b +40017117d3cd7258 +c0019c4d8d3a4815 +3fe7a5fe15dbcd81 +3ff9802646116116 +c018c7f2c1215f24 +3fd8d4afd3813b95 +4001526963fd0fb9 +c01121dac8eb8ba2 +c009d3eb80de88de +c003ac9e6ac85c77 +c03539df7815d709 +40014fa78d537471 +bfcc6bf753f2143e +bfe0c77f94f0e0f8 +bff36f279a579940 +c036fbf6b084938e +bfcef2072f795feb +3ffd90d254793b53 +c01315b247b60e39 +bfc231b9f88b534c +bfc10b6abc13a0ca +bfded665e39da776 +bfd6cd55964b7419 +3fdefeb7184b58f0 +bffa71b72ee262a2 +bfc28fd45f5f8a14 +3fd310436362adbf +3fe9d397659a81aa +3ff239a1fb86bab5 +c00214e45fda57d0 +bff2994c1e869ea6 +3ff40e34f9e0c46b +400b45c9f8b2acce +bffdca1046abb90d +bfd514dae32c62fc +4017e0508dfdb857 +3feacf6f50e997a9 +c013058b1a608b88 +3faa1fd85aedbc96 +4013f558345ab76c +3fe04c3b98004360 +bfe173db5b7b7504 +bfe7e096681bf01a +c02df6f567fcaec4 +bff0e9bc027bfa0a +40247d07002e8164 +bf50475fd32ff522 +3fcd71e424260f48 +3ff126d445602646 +3fdf75727fbc23be +3fe3c39c25d7f318 +4010b7cc9bab2c58 +bfd45cd816b55482 +c004469cd74f8625 +bfeca45882fcd58a +bf958cc1e9fa100f +c0102bf576305783 +3fe60479233e8a97 +3ff0c523edf4f696 +3fee2361dea0bb3c +bff23b47bb8accac +3fdbaf70d99c9e82 +c00797173f73864b +3fa3e5c632cc199d +3ff30d2c4c46a435 +bfea2655844d511d +3fb6d464870c9a21 +bfe154ef173eb30f +bfeb1b3aa9b1d082 +400de9f5dc8cf0e3 +3ff4d9ecc3c22e60 +3fedce779a689549 +3fc33e7b51b02700 +3ffc52c7e68befd6 +bfd00b4a70f5cade +c008e24bfaf7c1e7 +3f7fc6d2417a351d +c016d83feb8af849 +400cc0c52c209688 +3ff124400ed8882b +3fc69a7fd7b28289 +4000b72ac61581d9 +3ff054d9e60f0673 +40008b18bc235a01 +40344a6043ada57e +3ff57e53e963ec77 +bff88f6fa21649c0 +c0bf79c5aa9df810 +3ff3740b6ae63898 +bff5ff6146fb546b +401991b353aafddb +bfaeffeef9c6de19 +403f7f98bd620f68 +c023fb446331b756 +3ffc311c7841bd83 +3fa9bd295ecba1a6 +bff39fe778207dc0 +400ffabf7215bb8b +3fd6fcd49745ee6c +bff0485c2bf38a01 +4018607d8da00242 +bfa94bc81ea8219a +c00824fb3223a749 +3fc422f6184c6667 +bf98daa1c8297390 +3fa0409469dc19d7 +bfd37d80529633b5 +bfdf04f10ae76068 +3ffe3fa4705eec94 +bfd33495536df5c9 +3ff85373998eba53 +c00eedc427aad117 +bfd04becc0faab2d +bfefdfddd15ed7f8 +4006a4e468aa6433 +40003d9351094030 +3fcf5907a3574c7a +c011186ba6aa2883 +bffce88bc84c8f9b +3fe49648941eac6b +c01fa5fc45056f98 +3fb89ae905b5c70b +bff3effdb3981126 +bff0c7607fcaebe3 +3ff4a54b7fe3d1f8 +3ffbd041073ee230 +3fd8e78d5768c23f +401bf2aae72c0b6a +3fdf3709758adf49 +3fff8a4a733aaa28 +3ff3f1267686a188 +c01697196960bd5e +3fefa91a4f4abb2b +3fb97913bb28ff2c +c0065ed3f1114033 +3ff9633daa117d9c +bfdf194dc319b2e0 +bfe2c1f44adbc382 +400e63ff0aa1017e +3fe61100ad6d474e +3fee277460803831 +c01c7bc5348260e2 +bfd459ae994e6b53 +401ebcb6d97c0eb9 +3ff161113c91bcfc +bf996adcaed98496 +3f729d84db63e0fe +3ff27d94111111e9 +3fd06617447cd00a +3fef21a2630fe45b +3ff4185f8c3cbd78 +3fe182edab956f93 +bffdcdc9f40e4c5b +c00ca1df8a545d35 +3fe63581c2e1aec6 +bfe4c1cb0bc8b621 +3fe92aaae5394283 +3fe1771883c9b1b7 +c014fc4f39b9e5c3 +bfd78bf7bb7ce1cb +4007b6dd80d3fe3a +3ff298ce3c48438c +3fe76e3d2ca7d92a +c044345a9e017f5c +bfb76562c368d923 +c00b155a8568efbd +4000d46ef399b3db +bfe32085f0dcac6a +bfca10431097a17c +bfd368bea4589cbf +3fe295ffedbc1363 +3ffce107e657a4c0 +c042a03f916b231d +3fb2baced393f27d +bfe014cb0318eedb +bff66cebaea1d2a2 +3fc14f721b3441e4 +3fea40187b1f8d3a +3fe5949701d20d18 +bfd226008383991c +bfcaf8f0e8b951ea +3fbf6405278abead +bfe102cffd7cb739 +3fd4c87ce832a79d +bff13de4973abf73 +bff6abb9c2147131 +c048264488175c2f +bff9d92de91cc34b +3fe5cb9c9f48237b +3fcfc8eaf8bb2849 +3ff82ec15b2e3a71 +bff3496e84b362e4 +40497a07ca011a1a +4008de8d7809f009 +bfd5bda657256191 +40056879609e8e10 +3fe7a49baaa9ddc8 +bfe964af289da96e +400b736be123ea10 +c004915582f4e41c +3fe95297f03abd53 +c0195ae6d5e62a44 +3ff4099057c7f3c6 +3fc79a920e3940b9 +bfe39689f47f0c70 +bfee816d048f128f +bfc3bc7c9878cd52 +bfd135bf43022c9a +c02581a289b2a294 +c007680ef949f165 +c000ccdea1b45f19 +bff474b69c59ed0c +3fda329dd2fe5ce2 +40116164e46ff248 +401b1139baef1a24 +3fe22039a68fdb68 +bfc30edac7cff3ef +bff9b68c967235b0 +3fde849f42c02e63 +3fe2f3edd56d75bf +c030745b69e0cede +bfcdeae0f89fcc76 +bff4a37ea9621b2b +bfff7f9da5d8d7f2 +400788fdc8ab2ebe +3fa6de214e2d384c +bff9bb4cee118b03 +3fe9021b5b3441b7 +3ffad3e3b195ac45 +bfff828e33bb5ab4 +bfb88a5e6470bedc +bfc3e4e96c1c6451 +c0067139b8b38334 +40004cf91abf1b66 +bff4d6a601ffd60f +3ffc0831f6e81e71 +3fec4c39c74e7426 +3ffcec2cfbeac942 +bff201d8cb1bd04f +3f6531167b3dcdc2 +3fc9037f2a2b9d5a +bfcb29dc932b45c3 +c0405e10057af678 +401745cec7fb7890 +3fe56b5d410eb4c0 +401e99df208a7181 +3fe6413ec9eef047 +bfc43cc771789d2f +4013081aa2a9efbb +3f0aa01584c36cee +bd46f5abac02c6ca +400f5f5f857e1c4d +3fe0e81c526bd53f +be68921996c24737 +bfe6b0e25e5c02e7 +3f42e55012b71ddc +3fe50960593b817a +c01673e91a41f13e +c029e85c6f21089f +3d30a80edab4359e +be2cb45d7e4adb11 +3dc2726d98996184 +bfa3f9512df3202f +bd2e880c6444547c +c02a979d08b373a7 +3d5ed67c594a3950 +3fbe31de4b9abe8e +bc4006968c4ec4bc +bf3a0fdfa15ae6f6 +3d928b8c463f0cb2 +3e9ef6b8130b5bb6 +3feb231d10062dc1 +3fc18733ad03cd73 +bfe4505734812be3 +3fc2dad92fa06186 +c0189f298ee0a9c8 +401035435b800515 +bd93172b2fffd4da +40032f909fdc2863 +bfe568dec16c53af +4010588c6216b932 +4029950ece68e35a +be9eb2b772d8d8b1 +bd84c841cc53cd97 +3fb28c0f8d86ccc4 +40068494301589a4 +bfe43cda9e086c75 +c011576232b4ae1c +be903b962b9ad2a0 +bfe99113bd57e1e6 +3ff101046dea466c +bd474da73d90f03b +3c404aa201d27d99 +3fec5bf553f56631 +be98dc178b01cd16 +3eacb3053ddeae73 +3e36754b06a6b82c +3fea43136f686bf3 +bff8997264885567 +4077f8a2a4ff833d +bfc7b0cc31de4cc0 +c04a7820225c0727 +3fd5a9a32b005897 +bfd13eb58dabab79 +400835cc5ef72204 +be446a3dc009835c +bce7dc6ccb905274 +3ffe11f98619af11 +bdca5f0f845de301 +3fd6cfc8410bf832 +3caeee5ebbd13c3b +bdd3bd71c170fbee +bfa0d8e0e8a85c61 +bd1697426c72a62e +40101628687a8464 +3e2070ce1f93459d +bfc59b659e89c3f4 +40009097e66d48a4 +3f4a639a5fdaaeb9 +bfee330152685e67 +bfc33869038e8b5e +c04e32f6556bdf32 +3de3f28192aba043 +3e47c2452e9c1ff5 +3f60a81ae340fe9e +c01d842391ef6df0 +be3806674b5dba44 +bda6f8506481a000 +bf0207c467564e20 +bfe9ed5579a22993 +3ffd24b03e9d0c28 +3fe4031e6206ff17 +3f937ee33e7b79b5 +bd30742f6892d66e +c043c74d16d45483 +3f88793fe55b5a16 +bfca8fd0b2034ac9 +3ec341a3b639d017 +4015b308532bfb4f +c0073d56ce436bf9 +403376dc04d83643 +bfecdc028a13001a +3c4bc806d22ceb36 +c01b19e9099268f0 +40024a772ca1f254 +bfc09119a54a7392 +3fa62b546b948e11 +bc55824696f4d488 +3e216723a5120cfd +bfb7ff1cbb7215a3 +3eddc3b19d2ad5a8 +3fcf4e7d3f99732b +bf6d14405329a08e +bfb97c9dc07608f4 +be1bbe08660ab40a +bf229b6ac436a864 +bfcbd2f23e17e9d2 +3fcb9409750c5d2f +bfd9858d67c51ecd +3d5e5268abd3ac3e +3c5a944b565c4790 +c010d298110db749 +bfecac3ed1ca4350 +3ff96558674de952 +bd0daa213668a36f +bed74e7ca2d05b8e +c00036c1786f696d +3ffc40b636bdadff +3f7bf3a789f6e3c1 +3fc8b8b5db42d55c +bdf99d08e70a89d9 +bfc882f9647eaa23 +bfb93b688058af14 +c00b1737924f5957 +3fd6248170a851da +c031928ac64945e1 +beb1e1de9345d0ca +bff6b2dda621552b +3ff83e14b7a7df39 +bcaee88883526e33 +bd5741caa1e75ad0 +3fcba74ddea5bcd7 +bfe42c6e14795166 +3fc245eb65fe002d +3ff5d73255e170e3 +3fbb4c8f7e7153a5 +be512df884f02fb9 +3d3d013b57f98829 +c03f554af650233e +bfe29d94e4c5290f +40096e2094fb969c +c0030b9e492fb2e1 +c010238e3c80cfb9 +3dc0ac225af14690 +3fe36f8b6a44b6dd +3fd8e9cde92ba070 +3fc2edbe6f251b61 +3ec82d20c798fdaf +3d410e66b917ab77 +3fdef80e8664aa54 +c00aab447100b99f +3ff41f3f7fb5589e +3ca5bf9310a3d1de +be45e2639571728e +bced8dc9dac70ad5 +bf98b84c40a54e6d +bff7a9928c98dd04 +bff3f8efbf3b93b5 +3f301f1e73723e7b +403f12f23ca2cd71 +bedaccf7a6eff49e +bf2514a67efdcc53 +bff4939149473e74 +bedc21dc4b0c190d +bfd087566bf585e0 +3fe09ae5e41d0863 +3fda82d098e20e6e +3fe9ff16ccb0c9a2 +4003454d694fb6f5 +bff0de8bec93d58e +3cca57b9dbb26e34 +4030fe13fa94f9fa +bf4b650436240fc2 +bd868ce7d542adb2 +3f42cba995532311 +bfe7d678d47b1d27 +40003f7f9a1d9d2c +bce37f62908ed736 +400ab30900450bf5 +3f4c75565bfaafd5 +be64f15b5510083a +c01b0f3cf9e80ef1 +bfd6b115a45b2334 +c0150b620c15b0cf +3fd51ebe13ed33b2 +bed0c0ada36f65b1 +3fe51bc94e11f0af +3fded6615d0c295e +3f86f67c0a65e111 +400cda3e29c31ebe +3e124a09def26382 +3fc6ec630983a9eb +bfe3db790b926c03 +3ffae1af09d0e626 +bdb3a1cd4745c7f6 +bf413a7a0da53bbf +40018e9feb90ef05 +c01502147e44b268 +3ff0a1a200ce4eb6 +3e65f7aa0e1f510f +bc3c0c998aa0755b +3fd9ad99cebc6e9e +3e30fc56202f458c +bfdfc0be0fe07791 +bfd796d883e239ef +bfe39010a35b627a +c0152ccf0acecfd0 +bef7c7bf836c386f +3fba18760666d53b +bcf1dd15f5c9b6b8 +bceac4e44d44b20d +3e4d77bbddd6df8e +3faa846f26a583e6 +bfc536ec6b118361 +bfeb0d30a702a80d +3fe65879ca808587 +c00174cb09a839ac +bfe493d4a233b782 +c075b5bdb11a579b +bf9a908d529a1d82 +c004aa7dfbfe949b +bd25c17fdeea5282 +3ed5ba1d3e86c034 +c03643ef337beda0 +beda9d8a095a9232 +bdee83ef420b57bd +3fe6537b402419e8 +bffdf8bc72519351 +bfcd3780fc943dee +3fe59fbadac313be +3fb0db596b55ff59 +3fa249d57d1df6a8 +3fc199f54a3c0ea3 +bfd28c64bf3240cc +beecfa5cfd6f4595 +3fe7b3ea2ba2da39 +3fb4d78c35e0bb9c +c0127d1a44951e62 +3fe83edfee22b5e2 +bfb623a2b97c3920 +bf0339a98f7682b6 +bc51a152ff105149 +3c7c24b19fd8439a +bfda87833b99345a +3ea374c62f3e275d +3f28d4cccdf4729c +bea00cbb179e40b2 +3fe607454014fddc +bca0e5c7a8787572 +c00c7bb6a3a8565a +3ea353ccefe67d94 +40053e24c8ac4c88 +3f899ca0dfabff5b +3cf17a55acff5234 +bfc817264a5af446 +c004786efd252a3f +bfcd9932952f142c +3e2e03ae4940977d +bd56bd20eff7502c +3e0a41f1576f1708 +40023f5e5d5306cc +3e420b909f16deae +bff98ed087fabcc4 +4039df447cef32fb +3ff22564dfc1e568 +bd453da2ab4f9e28 +bfe88c598fe689f3 +3ef441d9a9a63813 +be5fe9d2e186a1ca +bd885b7b2ae856a0 +be02156fb471d54c +3fd809ac32904bc2 +c017e66948b9066c +bfd410fe29c8c8bc +bd22356ef88a7b24 +4004748e6a5a4cb1 +3d442aea1583ca2f +be2be83edd37c3f4 +bcc6a42f51e892ea +3fdd79beba19e953 +bc98c2b9f51e8064 +bc300a0407057749 +3d303c512fd5124f +3dc95ae1c69e345c +3f81f817aa60e12b +bfd78590c3fa9d7c +3da26f496aebb94d +3dd1e680aa7b310b +bd183c2a1f214f52 +bce17f0bd0ba8eb7 +bfe16f1bb8e7a38b +be97f181cf3a1c7f +3fecb06111fc2bab +bd5218a0d73d34b8 +be2af07c0ce91605 +bfdfc8fa7cfadb71 +bffb544ac5767726 +3ec29583dc7e8952 +3fcd7d6db7c32f1b +be89f7259b8282ca +bd722debf45b9437 +3fdd63513274f5e8 +bfcac7d3d7da9f6e +bd787778cf1e0a7e +3db1133e199d30e0 +3c872b1a8ba6e01c +bd66f1aea38da07e +bc7baa9a625de882 +3f6c277a225f2a4e +3e07c535cb9d2ae6 +bced81abff0a07f0 +c00671b4013171a7 +3e8463fa6ee88926 +3d18ab3959532c7d +3ff210acccd3ccaa +4011c16f09423527 +c001aaeb127192a1 +bc62c630983e8e20 +bff57d17be444dbc +3ff365b70d3affa0 +3ff567c0c34b6a02 +3fe368260c49b63a +3fb4d8a22e4f66a7 +400df64893e44b29 +bfdb1418816ac0b6 +bfeb93676b2d27ac +3d98fe6318d3b85e +3fe79feb17f48339 +bf887ea512674b9b +3f515449b40cc78d +3e71bbb749b856ec +3fe6377a063b0899 +3fb698d06044aba6 +40029587b3aaef19 +3c608232fa84595f +bf8132d4ede3cd21 +3fe9855fe77d731e +3db85b0be58f798c +3ff9d3ca7385612e +3ef72baedf89000f +bcf77981e7e4851c +beaed822afb34cbd +403f9962a62beb99 +3f7394c261c512be +bfb49aa803af45bb +bea8290116add5d1 +bcf949688e2ae2e0 +3ff4440ddf5eca41 +bed502c25e261ba3 +3ff7030e0fdabbeb +bdbe26047ef851ef +bcbc4be72834a53d +3c306ff20e372640 +c00748c70e213e4f +3f87a7e93d9a4a3a +3effcef3d9cff295 +bfe7045cad661775 +be119d00e3168a24 +3c378341eb020688 +bfd8c21401c3d8b0 +3fb7924280f93fba +3e88027be6866910 +3edf0dd7e4223ca2 +bd974a3abaa91d25 +bff74d97d635a800 +bd6d6567e91339ba +3dd533aa9c400052 +bcbc649c71445fd5 +c03f5cbe43f1b0f0 +bf648fe0b9a5ad1d +3fb1ffa3056957e5 +bf4981df2e921433 +bfd4afdf6182699b +40205e6821add886 +3fe5b2a3ef84aa1c +3dec0f051905243f +401ee198fb941fee +3fc8a302d00efb47 +3ee9b8386f81de49 +bfc7c3ccf7f6b92d +bd0af760051fd8e2 +bfe54179eb0ce0e1 +4034d311269e7d74 +bd2a742e1ed617c2 +bfce24e0f1a62ab0 +3d2e67b10ca60a8f +404e84c821016752 +3f370926c89c256b +bff058d4a0280fee +bfe8d20ceebfcffd +bfc66127353cc854 +3ff56c055846ef8c +c021c020e874e5c6 +3fffb50862bb524b +bfc265075b54a7bb +bc30b1f4c589066e +3fef0f04d5ad8eee +bf90f48dde196562 +bfeb4c324ecd399d +3fd2ad6757ca36d5 +bfc527b7d914a144 +4010b02fc37aa16b +3fc3e2822ce7e66f +bffa211eb85b9c7d +3ed3183c77516b8e +bf9050f936e1c940 +3fda08b4009e50c5 +4009ec043d6fa949 +bcc3c76748436e17 +c03879557c22841f +bff4840e42130fb9 +3f2d3a3f0915a962 +bf1d9762d91d2e41 +3fe03787abd33cae +3fdfd98962107157 +bfd87afd46508965 +bfa8c42f569ca60c +3f8411bc58bf2f3a +bfecc5df37d9a13d +bc64e5970e7ffeab +3e6b9349f78d4295 +bfd88e19a564a7a3 +bd97b1679e3200c1 +bf76696a576001ad +bf6ff3660bc6afa1 +bee922f990b9287f +403a632de469c002 +3fe3288667afd189 +bfb00d4c8ee71bb9 +bff7bd0e4628e88a +3db358bc057e451f +3e9885ab6787c9ae +3c85e1a79c42eaed +3dc43d96e495ac7b +bf4d7466b45a7914 +3feab65adc5214da +bd806a2727545dc7 +bd066724a1852da5 +3d18b7f16cce956a +bca5f3e6e9532ace +bff317d88c787d46 +bfda6f3175d34443 +3f062d9108bcc598 +c03165defc6b4fbc +3fc030d5ca30e9a1 +bff979d02d9942a3 +bff438cfdc5fa1dc +bff83fa260069db4 +bfe8eb433e91d8b6 +bff6e5272eed1ef2 +bc90b6e647100129 +bef6a2bb6fcfb5ed +3d4e3777af94e866 +4022ba0b420b48e6 +bf80bca87fd642b7 +bd0b4f15e2cc6ccf +3de340470fc35e37 +3fff1087e3678b3c +3fa97bdf66af9714 +c00f0cfc2890c8f4 +3fe0df618d36a116 +3f369358b0e177eb +3e4c406deab38ea2 +3fd5b242e6e4a6e3 +bfd830c7bab423eb +3f9234a92a742940 +bce65b7b79907322 +3fecebc1a23592e7 +c004d2bd968bb62b +bd10953f58b62c83 +bff7d7c4dac5bf3e +3ce65a6125bf7717 +bff61eb81d1b3699 +3faa66dc013d7a71 +3f43997e22997308 +c0380562b5e5af01 +c000b45d691cb7d5 +bed2b0f8cae280ab +c0027ee96c0453b8 +401002bce321e2b1 +3ff6cb86d8c5b3f0 +3cde030ad6073e3e +3ff689a093727d1d +3fe38195799461cf +3e65bdaec1bc3efb +be01626c658fa1b4 +bc9b88fe72c87e9e +3c75e24eca177dce +401efc77182715a1 +402b13b22193f810 +401a9ba5fcd528ca +bfc9fa75d0191adb +bfe9797186a57c58 +bcf5bb8a1014aa22 +bdd469735fc7de43 +3fe0e4970c03addc +3f9a20914a68bb5e +3fa19623a5bfd554 +40521f33f139368d +bc87de0a7404ba66 +3e2c1e4ce62a835c +be40f67eb12c77a4 +bfe3c9dbfc480246 +bfc6650a53c2eb9a +be8f1aa11218f1e4 +3ff591e31de875ce +40823e38e449c26a +be10d46a07d6a4ac +3fda33c3ffacc25f +3ff431f92a700c47 +bf4cafb153b32439 +3fef5e8aef8c08da +c00f8411f69c1374 +bff3c18301b1d629 +3da089cd2e291307 +3f9bc990700fc45b +c01482546c822e14 +3d6aabc54364669f +bfb567a47fbe3cc3 +3e43d1e0b4b28026 +3c6994d1cd25f6ae +bf9668c728722a84 +bfea100dff051b84 +bf421b57fcf19049 +404752f2e5bf3383 +3fcf638657966f18 +bef12f26f273bff6 +3d474c06c04945bc +bfea7e2da6d6a604 +3f7852421e6daa58 +c0007cc806724bf4 +bff8b37fae34d75f +3d510fa830cbc3b0 +bf2da994d21c37fd +40064217e96a85c8 +bf3164bae7456e08 +3fc20553199baef2 +3ff6591e834ad048 +3dfe9de8603b9661 +3d32f398ff4c7761 +3c5b59e3abaf6248 +3f1988cf8f848572 +bfc211da9f6a8411 +3d6e28661e0d02c9 +3c83c35a6b8a6097 +3ffb5fe6de30ee39 +3ea2bed6120b109a +3fe3b807d5c6c8df +3d9ca6a26c28ed83 +3c3043b1e1a274af +3fc4c28939ffb727 +bc6300a891a347d9 +3ff8bcef3bb9a53e +3cf1d6c19c330fca +c02b72641e936001 +bc3fbeb15d8afbd1 +c012094356f3c93d +c00460fd2302d824 +3c697f9a87ab53d7 +3f31ff01fc0562f0 +3c63c9bcf00f54aa +406905f7fcfc5635 +bfb4e822cde9f07e +3e71ba1e0f513bd8 +bfeaed7f78c6e2ad +3ffa34ea8f6e89aa +400337762e1f89a8 +3ef5ca6d96ec24d4 +bfe473003c987c90 +3de1094b2be353b3 +bfdda2623e700c5f +bfd4b1effa36429a +bfed8c84f9eddd14 +3fe249d6c31d4f43 +c03fc8905febc26a +3d595640a7cda242 +bfe42bddfd390d37 +bc39bd35f153e736 +bf4152b7564d1adb +bfdeda03de779fdc +be439ce7980f0d1f +bfe5361d8cbd8e2d +40029ef43e934bcf +3fd5ddebce3e74e8 +3ff1b1e14bb964c5 +3e14c0315b85ce64 +3e436f5726848400 +4010da81b13db6f3 +c005248fea19d6e8 +bfd5838d74433c58 +bfe73b4b5d7fdac6 +bfd01e4ec0d0856e +bfe49553fa11e28d +3ed04c6880352cd3 +bc47f8a6786ae426 +3d0f07a714c325c2 +401ae3ca69afe7b3 +3fcda7bcbd17544c +400fe2d6323c4773 +c007e089d20129f8 +3d30467d80129ec8 +3dd4ab8a9a06040e +3ff4caadf3205057 +3f9b38e013ef4fa5 +bffb60e5992ba173 +3d013c5cce4c0dcd +bd35830ea9788f21 +3d72ed42213a699c +c01e75b123bb85c5 +3f078c62c9d724f4 +3f0925acfec301d1 +3e4a281db3db06ca +bfcf5ee261320583 +3fcc3cdcecb91b3d +3fe00cc7d6b7460a +bddcfe2d21109310 +3fdfb40372231329 +3f7ba33eb932a01a +3fdc683c2f92fce2 +bfc48d6a6904ca48 +3c8b646443068ed4 +bf91ae64a823b89c +3f5be5545640cdc4 +3c48333991b4ef70 +bfe17da76cc11a4d +bfe3dcc908e1c5ab +3dabccd844de1c41 +4005ebe4ef67c49d +bd9360a32135ff4e +3e050208c94af08e +bffd39ced6dc3f47 +3fab9f1ace7432fe +be055b48c5c07261 +401f590ca3cae475 +bdda83f7e6ddc1f4 +3cb6fdb48168339a +3fb6b2cfe41da9a8 +bed08e73f48fea99 +3cc32966dbdd4d25 +3f7c698226001923 +402b36a40a25e8d8 +bc6f666b78667b5d +bfdfffe5c60952b4 +3f91f04b796dc9aa +403b4074f685ebf0 +3ff156b6b0f607c5 +bfb02363af56a7ae +3ee1bde7ce26e170 +3fe41a46dd8b6527 +be30639c596ad433 +3fd3b800ed734f59 +bd82bb168fc7bdee +4012239467f71d3e +3fc21dca3c089e52 +bfc813b1eefd7db6 +bfdae2b9207c1210 +3e4289cfb4b80f2c +bde6b588a367bd5e +3fcbcc5d52bfb290 +c019100caec36e6d +40159be61f536492 +400e53278bad60ac +3e378f697cda5c46 +3f08a84d82bfc11b +c0072829675a4195 +bcd507ca9a2da830 +4003956dc6017cf5 +3f30f37b70aabe3e +be39dd06b0761f6c +3fea8a115ce0cb0a +bf93bd94e04a6803 +bff37ab16c981ff5 +3fe38c591f1cd079 +bfb37e6f0cef4d7b +3fdaf898dec83f24 +3ec76dc6c2ba6454 +bd526adbf8026791 +be1b7ca57e0bfe7a +bfe35e2815c33f83 +bffaa6b260a47053 +bfdf41a2d1d03a78 +3fdbbd9599f011ad +bc791a1660f13998 +bc4cfdae285bb2ba +3fe0758b3f0bb151 +3e82a556343c0422 +3d100007c5174a6c +406d74a274f5dfbd +bea284e8a028a346 +bf92f0e81f402dda +3ccb5100e24fc771 +3d0b99b0b59b0a6d +bfe12a3d278a557b +bef0e0862143bcf6 +3fd3ef61d7f027ef +4007d6cadd6ba275 +3f30298b5990dd34 +3d713130661d64e1 +3df0e5d6048bfb1d +be56b25ba162fcbd +bc79a0489a17c6be +bf95f6bae93166b5 +3e8cd4730478afae +3e785ec5e6c0df39 +3fe930b3e4ca8092 +3df338d24fd35751 +bffc9316f2a49536 +3c6be427cbc26cd6 +bcd3523fedcac9a6 +bf5791e4af6ca901 +3fb5dbb8c3d1788b +bec7092c444ea397 +bff976ef83775028 +40037a149c0dd186 +3da0aee2b17ebd0a +bdc54cb81d2f70e0 +3f3a603472bcc386 +3d0383b8a9d9b67e +bfd8bebbcb77b6df +bcc387c95f349ab8 +3f14e5f28fe836ee +bdbf58ba78efb931 +3c93f9969c3e3ee7 +3eda94a13b55009f +bfd4114f43df34ef +3fe8da881afd5a00 +bd01969e05487910 +4008fc408094461a +3d2ecaa362931c30 +3eb3dbe4e8466de9 +3ff553ec64424554 +bc527d3dcb259816 +bfdaa84f207e8df3 +bff6d219fdf18f60 +bfc7e2b922df6771 +3f0efc27479257e5 +bfb73df450aabedd +3fed97df040b9e82 +40105abd0bfc066a +bfe5cb18b9ff406c +be57d81a483c91ff +c01b92342f619143 +c004f1afd4c88d54 +3ff58d3c45875940 +3f77e7607a086feb +bf8610460c8c2b06 +bcd5b0868bb86510 +bc41b264bcf198e7 +bfe297720f28cbbd +c00c66480d2c6475 +3ff4d44564bd1a21 +3c6c1e5ee5dfbfbc +3dc70bc6a1d9bfb7 +3d4ae3f67e3666f8 +3fb896fa634260c3 +bd701590fdf8586d +3fcced3db116ac97 +bff1c329309480fe +c016a535fd081c4a +bd05a765c50b95b5 +be60a2224db861cf +bca2fc41c7fa586b +c0003e85a3c6e735 +c044e023e92a3219 +3d1746ee5305dd88 +3fc39ee22754ee3e +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +0000000000000000 +8000000000000000 +@asin 1558 1ab75aa22fb6bbbd +bff921fb54442d18 +7ff8000000000000 +bff921fb50442d18 +3ff921fb54442d18 +3ff921fb50442d18 +3ff921fb50442d18 +0000000000000000 +8000000000000000 +bff921fb54442d18 +bff7b7d33b928c5b +bff721a5d8718655 +bff6ae4c63222736 +bff64cf55148366e +bff5f71d7ff42c8a +bff5a96e34bc532b +bff561ebd9c18cd3 +bff51f4bd13f8591 +bff4e0a887c40a9c +bff4a55ae332c7a5 +bff46ce4c738c4ea +bff436e4418e69c0 +bff4030b73c55372 +bff3d11b3fc3b697 +bff3a0dfa4bb4aff +bff3722d2feb24c8 +bff344df237486d7 +bff318d619008ed9 +bff2edf6fac7f5b8 +bff2c42a3a3c7a87 +bff29b5b338b7c8d +bff27377b2570a1e +bff24c6f8f6affb2 +bff2263461820ad8 +bff200b93cc5a540 +bff1dbf27dd2221a +bff1b7d59dd40ba2 +bff194590de7e7f6 +bff1717418520341 +bff14f1ec67484ed +bff12d51caa6b58b +bff10c066d3e6932 +bff0eb367c3fd618 +bff0cadc3d4378b1 +bff0aaf2613700b3 +bff08b73f9af1058 +bff06c5c6f8ce9cc +bff04da77ac5c9e5 +bff02f511b223c0f +bff0115591d29d12 +bfefe762b77744d5 +bfefacc258c4aaf9 +bfef72c3d2c5752a +bfef39614cbef7d4 +bfef009542b712f2 +bfeec85a7ee191da +bfee90ac13b18234 +bfee5985567b665d +bfee22e1da97bb17 +bfedecbd6cf77786 +bfedb714101e0a0e +bfed81e1f875ea8d +bfed4d2388f6360b +bfed18d55010f295 +bfece4f404e29b3a +bfecb17c849c7288 +bfec7e6bd023da76 +bfec4bbf09e19830 +bfec197373bc7bf1 +bfebe7866d3b6480 +bfebb5f571cb0571 +bfeb84be172438ef +bfeb53de0bcffc24 +bfeb235315c680dc +bfeaf31b1127022e +bfeac333ef06451a +bfea939bb451e2a0 +bfea645078c6a78c +bfea355065f87fa4 +bfea0699b66a8718 +bfe9d82ab4b5fdfd +bfe9aa01babef75e +bfe97c1d30f5b7d2 +bfe94e7b8da3cf7a +bfe9211b54441083 +bfe8f3fb14e496b4 +bfe8c7196b9225de +bfe89a74ffcc34a4 +bfe86e0c84010764 +bfe841deb5114bb4 +bfe815ea59dab0a2 +bfe7ea2e42c9027a +bfe7bea9496d5a54 +bfe7935a501afa78 +bfe76840418978a7 +bfe73d5a107bde74 +bfe712a6b76c6e92 +bfe6e825383cc40b +bfe6bdd49bea05ce +bfe693b3f244ee17 +bfe669c251ad69e7 +bfe63ffed6d198f6 +bfe61668a46ffa82 +bfe5ecfee31c96e7 +bfe5c3c0c108f95c +bfe59aad71ced00f +bfe571c42e3d0be7 +bfe5490434275b92 +bfe5206cc637e012 +bfe4f7fd2bc2fb34 +bfe4cfb4b09d1a3e +bfe4a792a4f26152 +bfe47f965d201d78 +bfe457bf318fe517 +bfe4300c7e945024 +bfe4087da4473296 +bfe3e11206694523 +bfe3b9c90c43296d +bfe392a22087b7e9 +bfe36b9cb13786e1 +bfe344b82f859adf +bfe31df40fbd31cd +bfe2f74fc9289adc +bfe2d0cad5f90e20 +bfe2aa64b32f7783 +bfe2841ce0862974 +bfe25df2e05b6c41 +bfe237e6379cdfc6 +bfe211f66db3a5a1 +bfe1ec230c714a96 +bfe1c66b9ffd666d +bfe1a0cfb6c3e9eb +bfe17b4ee1641318 +bfe155e8b2a00052 +bfe1309cbf4cdb24 +bfe10b6a9e43942f +bfe0e651e85229ce +bfe0c152382d7366 +bfe09c6b2a636bb7 +bfe0779c5d4df4b8 +bfe052e571060fd4 +bfe02e46075785a1 +bfe009bdc3b4f877 +bfdfca989658baaf +bfdf81e288b7ae20 +bfdf3958aecddef4 +bfdef0fa5bd85625 +bfdea8c6e5f5e67f +bfde60bda613a78f +bfde18ddf7da106b +bfddd127399aabe7 +bfdd8998cc3e6049 +bfdd4232133444ad +bfdcfaf27460fe9f +bfdcb3d9580ea2b8 +bfdc6ce628dd132c +bfdc261853b2d785 +bfdbdf6f47ae6904 +bfdb98ea7617ef3a +bfdb5289525368ab +bfdb0c4b51d33b86 +bfdac62fec0b2a92 +bfda80369a63aaa8 +bfda3a5ed82d9537 +bfd9f4a82296347b +bfd9af11f89ba61c +bfd9699bdb019139 +bfd924454c462cc4 +bfd8df0dd0979384 +bfd899f4edc962d3 +bfd854fa2b4aa1a3 +bfd8101d121bed2d +bfd7cb5d2cc5e8ed +bfd786ba074fef93 +bfd742332f3702b4 +bfd6fdc83364f719 +bfd6b978a427db95 +bfd675441329986e +bfd6312a1367c57c +bfd5ed2a392bb50f +bfd5a9441a02b1fd +bfd565774cb66f02 +bfd521c36945a5f2 +bfd4de2808dce513 +bfd49aa4c5cf8926 +bfd457393b90e2aa +bfd413e506ad84ee +bfd3d0a7c4c4bd9c +bfd38d8114823369 +bfd34a709597aab1 +bfd30775e8b6eeb9 +bfd2c490af8bde81 +bfd281c08cb69be8 +bfd23f0523c5dc2b +bfd1fc5e19315893 +bfd1b9cb12545e62 +bfd1774bb5687cf9 +bfd134dfa9805147 +bfd0f28696826d95 +bfd0b04025245ccc +bfd06e0bfee5c057 +bfd02be9ce0b87cd +bfcfd3b27b368330 +bfcf4fb3f2ad079b +bfcecbd75b6cd8f0 +bfce481c0fce7134 +bfcdc4816b87e25e +bfcd4106cba45b08 +bfccbdab8e7bd466 +bfcc3a6f13aae84b +bfcbb750bc0acdef +bfcb344fe9a97c4d +bfcab16bffc1f0dd +bfca2ea462b4998e +bfc9abf877ffe0e8 +bfc92967a638db38 +bfc8a6f1550413c4 +bfc82494ed0e78fc +bfc7a251d80666ab +bfc720278094cd3c +bfc69e1552567517 +bfc61c1ab9d55d30 +bfc59a37248233ea +bfc5186a00ade974 +bfc496b2bd835ab9 +bfc41510cb011423 +bfc3938399f32b5c +bfc3120a9bed2f46 +bfc290a543442d6a +bfc20f530308cc20 +bfc18e134f0178af +bfc10ce59ba4a8c4 +bfc08bc95e132e6f +bfc00abe0c129e1e +bfbf1386380f8b9a +bfbe11b009e269b5 +bfbd0ff87cc3a7a5 +bfbc0e5e80f7172d +bfbb0ce107d3f690 +bfba0b7f03ba78ac +bfb90a3768096840 +bfb809092913e52e +bfb707f33c173a99 +bfb606f49730ccc5 +bfb5060c31541da5 +bfb405390240e6fd +bfb3047a02794911 +bfb203ce2b380cd3 +bfb103347666f892 +bfb002abde953619 +bfae0466bddb929c +bfac0393e65c2c93 +bfaa02dd2f38ebf6 +bfa8024091fdb0a9 +bfa601bc0922e634 +bfa4014d8ffaf8af +bfa200f3229fdf2c +bfa000aabde0b9c8 +bf9c00e4be5f0304 +bf980090091d9024 +bf94005358ff0bd8 +bf90002aabdde94c +bf8800240091cfda +bf80000aaabdde0c +bf700002aaabdddf +0000000000000000 +3f700002aaabdddf +3f80000aaabdde0c +3f8800240091cfda +3f90002aabdde94c +3f94005358ff0bd8 +3f980090091d9024 +3f9c00e4be5f0304 +3fa000aabde0b9c8 +3fa200f3229fdf2c +3fa4014d8ffaf8af +3fa601bc0922e634 +3fa8024091fdb0a9 +3faa02dd2f38ebf6 +3fac0393e65c2c93 +3fae0466bddb929c +3fb002abde953619 +3fb103347666f892 +3fb203ce2b380cd3 +3fb3047a02794911 +3fb405390240e6fd +3fb5060c31541da5 +3fb606f49730ccc5 +3fb707f33c173a99 +3fb809092913e52e +3fb90a3768096840 +3fba0b7f03ba78ac +3fbb0ce107d3f690 +3fbc0e5e80f7172d +3fbd0ff87cc3a7a5 +3fbe11b009e269b5 +3fbf1386380f8b9a +3fc00abe0c129e1e +3fc08bc95e132e6f +3fc10ce59ba4a8c4 +3fc18e134f0178af +3fc20f530308cc20 +3fc290a543442d6a +3fc3120a9bed2f46 +3fc3938399f32b5c +3fc41510cb011423 +3fc496b2bd835ab9 +3fc5186a00ade974 +3fc59a37248233ea +3fc61c1ab9d55d30 +3fc69e1552567517 +3fc720278094cd3c +3fc7a251d80666ab +3fc82494ed0e78fc +3fc8a6f1550413c4 +3fc92967a638db38 +3fc9abf877ffe0e8 +3fca2ea462b4998e +3fcab16bffc1f0dd +3fcb344fe9a97c4d +3fcbb750bc0acdef +3fcc3a6f13aae84b +3fccbdab8e7bd466 +3fcd4106cba45b08 +3fcdc4816b87e25e +3fce481c0fce7134 +3fcecbd75b6cd8f0 +3fcf4fb3f2ad079b +3fcfd3b27b368330 +3fd02be9ce0b87cd +3fd06e0bfee5c057 +3fd0b04025245ccc +3fd0f28696826d95 +3fd134dfa9805147 +3fd1774bb5687cf9 +3fd1b9cb12545e62 +3fd1fc5e19315893 +3fd23f0523c5dc2b +3fd281c08cb69be8 +3fd2c490af8bde81 +3fd30775e8b6eeb9 +3fd34a709597aab1 +3fd38d8114823369 +3fd3d0a7c4c4bd9c +3fd413e506ad84ee +3fd457393b90e2aa +3fd49aa4c5cf8926 +3fd4de2808dce513 +3fd521c36945a5f2 +3fd565774cb66f02 +3fd5a9441a02b1fd +3fd5ed2a392bb50f +3fd6312a1367c57c +3fd675441329986e +3fd6b978a427db95 +3fd6fdc83364f719 +3fd742332f3702b4 +3fd786ba074fef93 +3fd7cb5d2cc5e8ed +3fd8101d121bed2d +3fd854fa2b4aa1a3 +3fd899f4edc962d3 +3fd8df0dd0979384 +3fd924454c462cc4 +3fd9699bdb019139 +3fd9af11f89ba61c +3fd9f4a82296347b +3fda3a5ed82d9537 +3fda80369a63aaa8 +3fdac62fec0b2a92 +3fdb0c4b51d33b86 +3fdb5289525368ab +3fdb98ea7617ef3a +3fdbdf6f47ae6904 +3fdc261853b2d785 +3fdc6ce628dd132c +3fdcb3d9580ea2b8 +3fdcfaf27460fe9f +3fdd4232133444ad +3fdd8998cc3e6049 +3fddd127399aabe7 +3fde18ddf7da106b +3fde60bda613a78f +3fdea8c6e5f5e67f +3fdef0fa5bd85625 +3fdf3958aecddef4 +3fdf81e288b7ae20 +3fdfca989658baaf +3fe009bdc3b4f877 +3fe02e46075785a1 +3fe052e571060fd4 +3fe0779c5d4df4b8 +3fe09c6b2a636bb7 +3fe0c152382d7366 +3fe0e651e85229ce +3fe10b6a9e43942f +3fe1309cbf4cdb24 +3fe155e8b2a00052 +3fe17b4ee1641318 +3fe1a0cfb6c3e9eb +3fe1c66b9ffd666d +3fe1ec230c714a96 +3fe211f66db3a5a1 +3fe237e6379cdfc6 +3fe25df2e05b6c41 +3fe2841ce0862974 +3fe2aa64b32f7783 +3fe2d0cad5f90e20 +3fe2f74fc9289adc +3fe31df40fbd31cd +3fe344b82f859adf +3fe36b9cb13786e1 +3fe392a22087b7e9 +3fe3b9c90c43296d +3fe3e11206694523 +3fe4087da4473296 +3fe4300c7e945024 +3fe457bf318fe517 +3fe47f965d201d78 +3fe4a792a4f26152 +3fe4cfb4b09d1a3e +3fe4f7fd2bc2fb34 +3fe5206cc637e012 +3fe5490434275b92 +3fe571c42e3d0be7 +3fe59aad71ced00f +3fe5c3c0c108f95c +3fe5ecfee31c96e7 +3fe61668a46ffa82 +3fe63ffed6d198f6 +3fe669c251ad69e7 +3fe693b3f244ee17 +3fe6bdd49bea05ce +3fe6e825383cc40b +3fe712a6b76c6e92 +3fe73d5a107bde74 +3fe76840418978a7 +3fe7935a501afa78 +3fe7bea9496d5a54 +3fe7ea2e42c9027a +3fe815ea59dab0a2 +3fe841deb5114bb4 +3fe86e0c84010764 +3fe89a74ffcc34a4 +3fe8c7196b9225de +3fe8f3fb14e496b4 +3fe9211b54441083 +3fe94e7b8da3cf7a +3fe97c1d30f5b7d2 +3fe9aa01babef75e +3fe9d82ab4b5fdfd +3fea0699b66a8718 +3fea355065f87fa4 +3fea645078c6a78c +3fea939bb451e2a0 +3feac333ef06451a +3feaf31b1127022e +3feb235315c680dc +3feb53de0bcffc24 +3feb84be172438ef +3febb5f571cb0571 +3febe7866d3b6480 +3fec197373bc7bf1 +3fec4bbf09e19830 +3fec7e6bd023da76 +3fecb17c849c7288 +3fece4f404e29b3a +3fed18d55010f295 +3fed4d2388f6360b +3fed81e1f875ea8d +3fedb714101e0a0e +3fedecbd6cf77786 +3fee22e1da97bb17 +3fee5985567b665d +3fee90ac13b18234 +3feec85a7ee191da +3fef009542b712f2 +3fef39614cbef7d4 +3fef72c3d2c5752a +3fefacc258c4aaf9 +3fefe762b77744d5 +3ff0115591d29d12 +3ff02f511b223c0f +3ff04da77ac5c9e5 +3ff06c5c6f8ce9cc +3ff08b73f9af1058 +3ff0aaf2613700b3 +3ff0cadc3d4378b1 +3ff0eb367c3fd618 +3ff10c066d3e6932 +3ff12d51caa6b58b +3ff14f1ec67484ed +3ff1717418520341 +3ff194590de7e7f6 +3ff1b7d59dd40ba2 +3ff1dbf27dd2221a +3ff200b93cc5a540 +3ff2263461820ad8 +3ff24c6f8f6affb2 +3ff27377b2570a1e +3ff29b5b338b7c8d +3ff2c42a3a3c7a87 +3ff2edf6fac7f5b8 +3ff318d619008ed9 +3ff344df237486d7 +3ff3722d2feb24c8 +3ff3a0dfa4bb4aff +3ff3d11b3fc3b697 +3ff4030b73c55372 +3ff436e4418e69c0 +3ff46ce4c738c4ea +3ff4a55ae332c7a5 +3ff4e0a887c40a9c +3ff51f4bd13f8591 +3ff561ebd9c18cd3 +3ff5a96e34bc532b +3ff5f71d7ff42c8a +3ff64cf55148366e +3ff6ae4c63222736 +3ff721a5d8718655 +3ff7b7d33b928c5b +3ff921fb54442d18 +bfe1c8d0e9ad336f +bfef6a044ce510a1 +bf83905b8688c706 +bfcfd63ebd2d5164 +3fde8d5deb8f11a8 +bfd2bad4c4396ddd +3fe7a312b49e8ce4 +3fc8893efd42ee60 +3fe6396865e096e7 +bfd7efa9dfd46644 +3fc95766e9b44760 +3fd673588886a635 +3fec5bbb57c6b2d6 +bfd71abe2f095ffc +bfe2088ebefe0983 +3febbfe095cfeff9 +3fe1e784c4055e42 +3febaf58c66bbcf4 +bff330cf9c4d3a4c +3fddab4933773a02 +bfd9e26594b18d7d +bfe07d1777ff103d +3fd34746c592a984 +3fedbe18b9b470b8 +3fe516828f540c59 +3fd5d519cdbd752a +3ff59fb7b655d7a7 +3fc6fdf0bf15dcb0 +bfdf68b0552ef628 +3fe4ab3787f1a1e0 +3ff0fbafece97029 +bfb5a94727522800 +3fe587cc781972c5 +3fd4257e5c118f82 +bff336fe9dece358 +bfe93d218c020c9a +bfe72aaa0d20ea3e +bfdcce3be26802e2 +bfc74cb98d42f839 +3fdefed2fb8b3494 +3ff0199b6377df7c +bfd605a44d25c1a8 +3fc78379e56cfa41 +bff0cbfc78f703c1 +bfd1b870e493f51e +3fe54855309ddcc3 +bfb549218a08f319 +3fd5a1016c1ded54 +bfde9d3384c58809 +bff85b59a8ad55ae +3fb016ae272c0d1b +bfd39640b74ab2af +bfb6a582a7ef8874 +bff57c85e8c6c308 +3ff6e6ac4f65fbe6 +3fd1940a425f9bc1 +bfeb18df7e92f9d9 +3ff37e0e67ce0422 +bfd53b069d434a04 +bfbb9841983ee192 +bff025c6c37056da +3f95f1ff110970c6 +bfe0e2e87b77a340 +3fd056ea98143f8e +3fc459ad4ca40156 +3feab4a031966cfd +bfa2150a435417f3 +bfd71f1aebd230ec +bfd8c64798b02185 +bfb2ad83a203870f +3fda767d946e0d1b +bfd768289b7ebdba +bfee599c41757fc8 +3fd08a9a4c517169 +3ff0fbff8a7983d3 +bff56560e5cf5b19 +bfddf0d7595d2c86 +3febae18b652d313 +bfe445d741205fa2 +3fe600057954d8ed +3fb0a1c4ff89364b +3fe5a16e7675cab8 +3ff280879ad17b32 +bfa65b13a970f116 +3fbbd62a6a22c927 +3fb17597f04c0877 +3fb9c6546c70a128 +3fedb481ff51a182 +3f913afe2da18a4c +bfc96bd8b9e3ffc3 +3fc5027039c8db46 +3fe830ebeed93947 +bf91d293e016b397 +3fced43f557ea7a1 +bff2529ee14760a6 +bff06d3ba31c3014 +bfe88ff32e7afd2f +bfe62251f78f51ac +bfaecfa27f43a7a6 +bfd68495e4e7f719 +3fa6c0c8843503d6 +3fb2859b402cf2a6 +3fe95979511b7f01 +3fe27d01e4d03a09 +3fd37b192809643a +bfd8379db681e92b +bff42ac429582ae4 +bfc141ceb722d684 +bff17bde0953dca4 +bfc3b8e5b5525b5b +bfe5cb55c030851a +bf98fe51e19cc8a7 +bfea16f7149c0018 +3fe5e83f49c4a823 +3ff070b302a395c4 +bfe473c491d5496c +3fcbdda66e1bf587 +bfd752d63aaea949 +3fb1ff6727c5eae8 +3fd78a8566f12f39 +3fe581139b314788 +3ff0afd442400326 +3faf047f997e4bf8 +3fd00a13f3733de7 +bfe7b5a0c204cd79 +bfedca0a8346f441 +3fce34c1a6843351 +3fe038b1de246da4 +bfd22f01836ce795 +3fda82b2919fbb8e +3fdd4b4cdf2ca8a5 +bf818b2e0087a681 +3ff5becc3c84bb63 +3f93823e5081d361 +3fd75e70f4e83409 +bfc6ae85e36bf4ea +bff3b618e7132abe +bfe6490442b7e906 +bfe30c902a54bff9 +bfd9b53c6aa03b23 +bfceb732b986cb99 +bff40d411c98c580 +bfdbab6a48836f51 +bfd6ba7417e81176 +3ff2a10eb2e082cd +bfeedf10ef63f0ce +bfc1d1f34a2492f6 +3ff241d86e144405 +bff22d46fcc1ddf2 +bfd935d5de508d30 +3feafec4d8675e5e +3fd7f888575949e8 +3fd045c2043e597b +3fede6714290fe0a +bfdd973238e6a350 +bfca3277b5b7cc0a +bfec5c27e1ac478c +bfb31294e4233ce0 +3f7f4dbc699db9f1 +bfe68a7e4ce131d1 +bfb022f70cc90d6a +3fca5a5d673a6451 +3fd6a52512693c15 +bf90124079c74da7 +3ff4788bcf94be19 +bfbfdd78ded470c2 +3fe3177b03652e2f +3fd4de3566e4195e +bff0039381ed20b1 +3fd1a8bd4ad8ab3d +3fb82690463ef977 +3fd231a11af879b7 +bfa1d8ec2d24665c +bfe380e6cba99e9c +3fe40c023c8bb0c6 +bfe251fbe39a23df +3fae00afd1d2b999 +3fe51186d94e4d9d +3fc1f9a2cf458fd4 +bff237a1b87392d9 +bfed57400e28a913 +3fd38522f0eb1daf +bfb16f16ef2fa406 +3fd444690c11403c +3fd98941f4d713a2 +bfed2b4c63fd6eba +bff67282599c14a7 +3fd17bcdc64d633c +bfe669a06349e2d6 +bfeb200556b98a93 +3fe6f080bee92e34 +bfcf8750ebb78d20 +3fd59673db5d62db +3fe101ad6efa8bc8 +bfd4010abc926a04 +3ff340ed8384062d +bfd387e051df5860 +bfd4641aa1ee82c6 +3ff4f387585fbe17 +bfa643ec198b9442 +3fca96e0f5811ec5 +3ff11031aa2870a5 +3fce525b491e5ed1 +3fdaa34c8c16fa37 +3fddb13121a70ff0 +3ff165d5b172c630 +3fe5a37e68b6c70c +bfd48556b96ef992 +3fd0119d8fb96696 +bff71c9d1812d640 +3fbed1aff8263f04 +bfbd66fa1b784cba +bfba3e628b001bbe +3fe2df1d97e1288a +3fdc54be9eb162ea +3ff18bd9ca4d984d +3fc3386458a9d70b +bfec3fa3d7e2895e +bff1bd03b2a51324 +bff68628781600ca +3fdae4e3dda7c6d9 +bff5a8612b4cc6f8 +3fec2a98287dcdad +3ff1b2202fbc8c6e +3fe349797d53196e +3fcd6c33a6fd11ef +bfb4ecda36f6b207 +bfb4143cc10042a2 +bfd95f0f0132eae1 +bfccc3f1fc97c14b +3ff2d861709c47b4 +bff1b9588f9529ef +bfe95831d8f3e6a4 +3fd020b8fc38d04e +3fe56164cea36178 +bfabc218fedd660f +bfc48832ebc25530 +bfd6d77755f1998b +bff3bc28d2ffc57a +bfd8bd0048de53f2 +bfeb117cec4f550c +3fc9b47e292568e4 +3ff3514f27910c23 +3fe4a727aa607c07 +bff032aa54814dea +3fd957200b0c0520 +bfdafb51b643c76e +bfd8c83d02e04a5d +3fbcd3a5cf9f63c0 +3fe9fcf1b8e07725 +bfe4c63a64732eae +3ff54c197b2f37ec +bf88ab7c3f318369 +bfc4802487ebfb4b +3ff44b0ffde57aeb +bfb962cb37ea741c +bfdd5a4fc328f7d7 +bfd043657ab06e27 +3fe486934c48e879 +3fc0e0659f7e3925 +bfc6602d55b43bcd +bfda5fbc0e449497 +bfe8b6b1147f72aa +3fdf3bd7993f47c8 +bff3cf558262510c +bfe22b142a7770dd +3fdabb61cea24397 +bfd02226aa70a9f2 +3feed4bb3797ec3e +3fcf454d0f34f521 +3fd1dc6da9e36049 +3fe33bcb8725f76d +bfeb7b22bc4b3012 +3fd4407e0e7865d0 +bfe442bb7c10d5b0 +3fe0992e20133c1e +bfc1711ac0d97c6e +3f9ce5b80bf45bcf +bfe5a79ccd0d284d +3ff6806afbd29dda +3fe67838c8a44823 +bfa97d05d5eb9152 +bfe1d77173fbe7f6 +3fd8abecc7d10d20 +bff75d1dda6fea2b +bfea9b9968293c74 +3f70413080168174 +bff1cf3e13b0943d +bfb557c4306f5139 +bfd3c493103c661d +3fe7e20dc1e34cdc +bfd65be0e0483404 +3fe881374433b404 +bff2bcac664eed53 +3feca6b8d9e39685 +bfe26a6f9e120ae6 +3fd38f538e89f427 +bfe1990b6f1fc6a7 +3fe11a1c46e7a43a +bfe159e4ca227281 +3feb7a63c9a720b2 +bfaeb188c1b69348 +3fc2aff4d2c7f344 +bfe86e2636c0f317 +bfe02ec2948f8e4d +3fed4c96d17d687c +bfde575530035bbb +bfc5b38514eedad2 +3fe4e4f9547796ad +bfdd6ef11d59ae11 +3ff13c1ba6eae95a +bff485155c7d94ba +3feab22371fee630 +bfd49f25575028bb +3fe267e60d5512da +3ff35f46caeba6eb +3fe373258d70f10a +3fe1df71af42b9aa +bfdbd2809deae8a5 +bfce109f308bdcf8 +3ff292490c396bd0 +3fcd317e8f140dba +3fcbc4602c229c85 +3feeecc80edb766f +3feed425ce981226 +3fde8193a0bdbe8c +3fe6914faaf6ce19 +bff3ad25d22fe6b6 +bff44b3c89385f0e +bfdd18f3e9eef40f +bfe1f6400400ba9c +3fb21293b88e559e +3ff02526bdb40655 +bfcf22362d95e527 +3ff2943319499190 +3fc3cda94a97fb7b +bfd490b7d52edbc4 +bfa8309fb959404e +3fe1020dea66a92d +bfe2e2e0e6c05b56 +3ff1f171a437e9b6 +3ff53ed82f827e56 +bfe41a1c6c99b892 +3fe2d4795535376c +bfe7174a9f846ea2 +bfb91d0cd4318428 +bfdcb3d5cac009c5 +3fe1bbdbc2816cd2 +bfe550b0506045c9 +bfca0f581027b165 +bfe584f4bc50919d +3fd7452fbd5e065e +bfad7287c342b595 +3fee10191df55da9 +3fe4dfe21fe95174 +bf81c98c24364dd2 +3fe3ed834d4ae9e0 +3fe685564625a70d +3fbae8d04ce973ac +bfec501e5ba4af71 +3fbc9ac298ae36cc +3fc87c4eb32f98e2 +bfc9ccaf50897484 +3fe5f50c1478016c +bfcebaf7c5950d15 +bfb55a77bcdc7b78 +3fe6d13879605949 +bfe423583acf51b1 +bfe4f48c8a7f8662 +3ff6e40916afe10e +bff15d883d5384ba +3fede938ca7a6158 +3ff596f2817d3c25 +3fed8807bb7199da +3f90b0c8a72102f6 +3fe5e88adc5f1a3a +bfef9260d34d9a93 +3ff363f62eba3752 +bfc4902a53888483 +3fd8d36d7d3f7a1e +bfd8d75ed5cecee3 +bfc4533d5afb8dc2 +3fee1efa5dcebe58 +bfe9ec70d5551d9b +3fdd7bdea908eeaf +3fe0e0f37bdd2484 +bfe742c9fa764049 +bfbdc87d842d2613 +3fc196d779f53adc +3faf5ed79a6849bc +3faddafd5ffe059a +3feb2ac5031667cd +bfed5157ce077f46 +3fdebdbb3a9ba38c +3ff0d2d85238bf8d +bfb0ca9f7383ecdb +bfca7b82cbce04a8 +bfc92b0e811c8f2d +bff016b2ab0da63a +3fda4ab865e37460 +3fe125d8fcbfc291 +3fe1d987dbe2bde2 +3feef84cce6e17e6 +3fe4167223c643be +3fa6dd5db4d8851d +bfeea650ba212e33 +bfdeee8ab7b28e6c +3feff6c2d6660c65 +bff3c19747d6a7d9 +bff0fb985374aa02 +3fc078f997b4d408 +3fec0aced0377c78 +bfe6bedb91ee5652 +3fd299d626180604 +bfef749e7b085520 +3fc10cc4a28a1fd2 +3fda24fa2bfbeaee +3feb7ada5625028b +bfedb9dd28e2e798 +3fd9cd62314fed91 +bfadd1385d536481 +bf9a58de60da711d +bfe3ac3afa706270 +bfd80041781db252 +bfe0a647b7f38b6a +3f53ebd8993ac1f2 +3fcf057a3756f96a +3fd4514a127ac092 +bfe104bb248939a0 +3fde98faaaa01c66 +3fd904d20b6fea63 +3ff3f59865d1aca8 +bfc298f2268b1b5a +bfd6bdcde21e0b2e +bfed3b7178be7456 +bfd170421140c2fd +bff32a1c05356beb +bfe140c955efe9a2 +bff0122476356e01 +bfc4d081e89a19ce +3fed0406e13a353a +3ff649a1d9d2fbb9 +3fd156eb7425d597 +bfed407917b779c1 +bfe52153002a8aeb +3fd522409adfc275 +3fd432f55b7b519f +bfe166d74f90b6f6 +bfeb093333473db7 +3fe79e4089a6c4a2 +3fa9b387ba13761a +bfbb5189b9142571 +bfccd00b5a1e2ab0 +3fd79b13996082c8 +bfb44fb0f0b578e4 +bf9f2ae2962b957e +3fe98c1a60da28f0 +bfe5e4e6f1a01599 +bfddf9b0c1358362 +3fbf7c8d2d3d9f5d +3fee24dfc9aa7e64 +bfdee3c7f732b447 +bfe5a51d9d741b05 +bfe488003dc944c9 +3fd8eb1505a64cc0 +bfe359975fba8fcc +bfa659c7f87fb16e +bff7b7e2de2bab02 +3f9947c085d0aaca +3fd93cba55adb501 +bfe24decb0f6383a +3fe0b55e6cd54349 +3fdb0f375c558a6e +bfc3d19e6f76da17 +bfe9cafd8b64ba9f +bff0ccc8fb2b3c53 +3fea00ff6015430f +bfb069652c4f6d57 +bfc6a59fa258fe33 +bff2985b5d60fcdd +bfe4dba6c73dcb08 +3fedb3e52e4ad0a6 +bff51afd4b375348 +bff35f446afb7a93 +3fd0b79f668bc233 +3fcf30999df0925b +bfe589271e6e7d81 +bfe7ec2664d0f828 +3fe84270fc69540a +3ff4fe94b0d51a32 +3ff065208b0358a8 +3fe7dd5d66f601a5 +3fea94db2b705784 +3fec30d3aa52e9a2 +bfd478eee6879e8e +bff1453333209d9e +3ff16bf3324ae3d4 +3ff4df22a80d323c +bfe6a225d34b3880 +bff32058240d1def +bfd55936d7649065 +3fde448a292401a6 +bfa232403ec4a3ac +bfde7f174c3fafdf +3fb3880c772eee37 +bff4e465b8b2aeed +bf97a66f1e426226 +bff23c3a60d41c1c +3fdacf7dc034e867 +bfd9808cb161e210 +3fe8fb4efc9ab55a +3fe65a0295eeac22 +3fb7d173b5863af8 +bfe3df6d13334cea +bfe8465fdcc41738 +bfedef5fe74a708d +3ff079b32a3d4ad5 +3fe1e3a34f847a71 +bfe00036893ff7a8 +3fe4491103583331 +bfe22ad0e9913baa +3fde2e55eb21f1ba +bfe07c998a49e095 +bfd44bd06f977259 +bfe20cedaf2038f5 +bfa2e9947d8a5e50 +bfe8e3c91f04bcc0 +bfe1b1686729a686 +3fcdb15221df88e9 +bfb7f7f947de487b +bfeaea22ded5bfe1 +bff409b93cdbd3f2 +bfc6b03729d63104 +bfe9883a92fa19b8 +bfee729ab07d09dd +bfd68594e8436bb2 +3fd83322faa3c77f +bfe01075d35de350 +3fb60658ce3106c2 +3fdcf4ddd43ad43f +bfb5a5bbf5d4add9 +3fe384a41ec2e4d5 +bfdf9f189ebc8eec +bff29f0210735e24 +bfa1b98976e20cfc +bfe823839b48224b +bfe7c2bc66aabdf1 +bff75e3e6238199c +3fdb8473a18d368e +bfe56556956fcbf6 +3fd27591d63722ee +3fdb60852df371ce +bfc0a04e66fbaf06 +3fe68cebbe86a72d +bfe08751bac4fc5e +bfedebb043877ee6 +bff7e2352b274bd3 +bfe33207b5d9e1fc +bff40ac350be5e84 +bfe5f412dd5b7d7f +3f98896f0a9cf830 +bfe0ad87fc3072d3 +3fe4b43b9c8bce74 +bfdaf0f4428135aa +3fbba604baec1d25 +bff3ee76d6cba2e0 +bfef1989e6d88f39 +3fc06e66f67d60a2 +bff0b5f2ce172bbd +3fb117d5eac6df08 +bfc3b4383c13fac2 +bfe0370f3626cccb +3fb3f793a9344cb9 +bfe124328285bd61 +bff12f3f80748546 +3fd1adfae164547f +bfb3a432397fa426 +bff2da044a12d1ea +3fe0acc457943243 +bfa4a8ee8da2cef0 +3fc5ef23d2a23085 +3f9b63c2e5bc544f +3fe4a99379501854 +3f8f5dddeebf8b8b +3fe4dedcbd776bcc +bfb120c8a2b6f810 +bfe6254a52fb2c3b +3f935c904de8b236 +3fd6038fe66f503c +bff6b10a4572d239 +bfdd45323b4e6884 +bfed24f97f4e1d1d +bfc40800f0df859c +3fbef68e13c2b4df +bfe54a0e5c6fa1a6 +3fdc302236611694 +bfeb943e34fa489b +3fe61915ac91cc71 +3fe36265b4e95184 +bf9d287054433d31 +3fee646025cc701c +bfb78aea015a9c46 +3fc0a9680a3dc10e +3fd6f792953c876f +3fddead296c54e67 +bfd32c00813c09cc +bfd0458fb823fc8c +bfe8ca7093c524aa +3fe5e72ebc5cd280 +3ff0a8faffc7e3e3 +bfe0bc01006ef846 +3fb3815b2c084f82 +bfeab5a266658390 +bff0adbcd0258bff +bfd317b186d847a3 +3fe479d804eb754a +bfc84b55ba288e4f +bfef28631ad7892e +3fde713a87ae0d29 +3fe8716b6602683b +bff32afcbfbbb2aa +bfe15ae9774ac206 +3fe65b2eccc56b16 +bfe2d248fd748822 +3ff34ce499773477 +bfe956330bd8ddf6 +bff11869e55c9dd8 +3fdd387cab70775c +3fed4cd67ed43f2c +3fca64a0bbcf35e5 +3fc31a7cf9479d14 +bfdde4dc334f11ec +3fd114d802c0b55a +bfbbebb1268d98dc +bff43739de8a9668 +bfc3ddeb7fd79007 +bfecee2aa8dffde3 +3ff43c8969efd1e6 +3fec25a134ea1b36 +bfed1b25433ce484 +3fdeff20dd713212 +3fe8cab419cd3b04 +3ff53b20bb364c81 +3fd005444d536a7c +3feb0816095eed15 +bfd6d99b63dcc67c +3ff31c850fa0dff2 +bfecd22f20488165 +bff04f45695d11b0 +bff15f8a665b0228 +bfb6a0a861d778bc +3ff1ef7db192c661 +bfdd752589556912 +3fe3fa73f7d5a830 +bfeb11c3867b66fe +bfded2735e0a3df5 +3fdb20f38a68c8cd +3fcca09747e503e3 +bfbe4d8031eb1e78 +3fceaee5bfa9be66 +bfe272c29a36f1fe +3fd40f0b20a1f109 +3ff10b08a91cf5e6 +3fe90ae561132e68 +bff1e9f0db0a26c6 +3fc2066e8878d4a2 +bff37dc955161b6c +bfe25e9343f021ec +bfdcc68fdd57d685 +bfdb84d6a90785f8 +3fef0b6f6c0b78de +3fd10805d220bb07 +bfa480df138ad5e4 +bfeafa08676ab608 +3feb535e47a84e44 +bff3e4268f64ee52 +3fc2b1fcd2b8eb0d +3fc0ebf173d48ec3 +3f7059886ab7a858 +bfeffeefc9366ae3 +3fd97195f96e86ce +3fd3923dfd631ac0 +bfb0604dd74c7cf8 +bfe3974c641920d4 +bfdd5d9c2b8ee50c +bfe2605733f4ee77 +bfbe92f12608a6d9 +bfe19d8f3503c8ae +bf9e82abe419a03e +3ff09674908d9587 +bfd19d318b1a32b2 +bfedb19b10645c4d +bfc8e086847be206 +bfe16e2296f4e294 +3fdd8f308e1a1182 +bfe528442c11772a +3fe16d65be2e9c3b +3fcbc83259fb3764 +3fe4a1fab26943a4 +bfe4c0e269b5de09 +3fe4ffb1e18b0293 +bfe9f50b221ab288 +3fe0c2aebf0e8706 +bfd4b492e5c172ad +3fec208800fadbe2 +bff1384d352db34e +bfd770c63e45b22b +3fb27df2b3d40c55 +3fdbcb3aaee3bb30 +3fe4fceae308bb29 +bfc29cf0baf07a29 +3fee9213cba5eacc +3fe01f397c8c226c +bfe1c478d79b618e +bfd3789ad1afb3d2 +3fe3bf818f35bcde +bfe5a73c30abc553 +bfd898d78fcb1e45 +bfe09ee6472a34de +bfcb8e582cc456b2 +bff25261c67e10ea +bfe484b583baf91d +3fea55063d3ba214 +bff3b775222b156c +bfdb5bff5b3b6ea1 +3fd5fa69fe0c64d1 +3fd6591502057e69 +3fec4753a8057cd8 +3fe5a755e022b10e +bfcdde073dbb681d +3fc58742f8b524aa +bfe842cfc7b9eebc +3feb6a6cc7c098f8 +3fd11e8af269ba58 +bfe074cf5e8e7d3e +bfb6f1051ee2691e +bff114d47b8e7f8a +3fe4cb92e4b9b226 +bfd9e7d0d1729e07 +bfd384ee6003f39f +bfe006bf901b7b8c +3ff2f842416efc63 +bfb81eb39844f412 +bff349bfcd080be8 +bff01c7f883b9f77 +3fe0214543fd569d +bfd404e89217d4eb +bff06596d770fc8a +bfe1086ea3ceb06b +3fdf064c70ed0877 +3ff6e670aac7fe17 +3f91893b2b114ffa +3fea6b1a67c64c46 +3fd5a07a277aa2c6 +bfe28043420f5674 +bfaa886fe2283e69 +bfe2974f9e909486 +3fc433792d92730e +bfe57a7e57ca0bbf +3ff22c968d8004da +3fd1dded8d8a6795 +bfd3318be6de5732 +3ff3fe999d8c9ff9 +bfe149ea70d8c831 +bfda1636c3eb603e +bff37aa7a871b480 +3fd77b00f54929d7 +bfe6389fa18b64ec +bfccaa0a626cc8ae +3f82c611020e5347 +3fe21700e5849a8e +bfe23a6515d79546 +3fd943d71eb968b8 +bfdb8a7bed461f1b +bfc040b95e664082 +bff074077e8f1a3a +3ff5169a9325244a +bfd3649b7c9594d5 +3fe3bc77371ed96d +bfc6f233b7090e10 +3fea13682db86c28 +bfeed1e2edbb0234 +bff4fc35bf69b5ec +bfcfd2c7d8cf3477 +bfdca5aa578bc160 +3ff48d6685258e4e +bfb4afccc279d786 +3ff6a4bce796ce2b +bfead439bede724c +bf6f7c368257fc5a +bfd0489aaa899d46 +3fee731f1cddd5ce +bfe4fe5104a9488f +bfc51017df604fa2 +bfb1a31e53a4325a +3fe143dd279aadc8 +3fd654440f08ca63 +3fe7a4aa10706b2a +3fe2005ddc1bbe44 +bfd5ee28f6714e6f +3fdf70679d8e1467 +3fdafdff5e311b43 +bfe1c66c7af3e012 +3fef0060063cdaf2 +bfe1e306ce0c2d12 +bff2964a23fd02c2 +3fb149f0d852f890 +bff5ac414d13e8d9 +bfb636222132cde5 +bfb33aa594902f2c +3fe34302028287c0 +bff01b7db6b79985 +3ff0b1cda1baa854 +bfeacbcf0713b1cc +3fe379047847b26c +3fbde1701d39db75 +3fe6679fb2ad0c60 +3fddf0fba111101e +bff13cb01b36684d +bfe78b26eb9574a5 +3fee5c86c692c6f0 +3fd18eb35dd67307 +bfdbe5de10ffb745 +bff0b319bae63918 +bfca4272d4b31007 +bff4542970aacd75 +bfe06e8f4d460ac0 +bfe0a3f540042a0a +3fe622df3ff6641a +bfe7d9e26c7bfcdf +bfeffbc163582717 +bfe3739e4cc23aaf +3ff1557f8f16605f +3ff3b799c50647b2 +3fd6d4eba5c7a39f +3fe16e3c67a89869 +bfcef8878640b818 +bfcc69c51b49fc37 +3fc882033df1a269 +3fd312fe440351b8 +3fe03bdc4f6458c1 +3fecd08269312d0a +bfea68f62c832894 +bf918b8c569c3bf2 +bfc9c865f31c6eb1 +bfe259e22305b6dd +bfd2999a05997367 +bfceded1c41d0420 +3fe5bcb5d80d9b5e +bfe626e555da3233 +3ff6a5f0e2def2a3 +bfd1aaa77a6d2119 +bff0011430ce42e6 +3ff085ebb9d919d8 +bf9e6da38ff357b6 +bfeb0ba095f0aec8 +3fe2ca0a9dd87b8a +bfb0130bd9b95a96 +bfda96b0c4269af5 +3feb84c5580e1417 +3f9fa2a3141f4e40 +bfd5c5485f6a20f0 +3fc75051a9e44d2a +3fe042b7913f0fc6 +3fb5d5bb3f0980fa +3fe4469b47c637b4 +3fccdd21129e9d08 +3fd6734bdeb040e3 +3fd2d553baf892dc +3fccf1c505924914 +3fe6006a25365e70 +bfdefd0602ac608d +bfea565da7f26af1 +bfd6d7d523588a15 +3fa8aaf04406ef2a +3fd87af441cb7d27 +bfee4986b01e8db6 +bfea15c745cb5383 +bfefdcd759c745f0 +bfe54457e7fcd490 +bfe1263e84aab4d0 +bfd58d9a7d17cef8 +3ff19b3011218657 +3fe4e9e0dbeb1e60 +3fd543b396299052 +bfd401484a7e7bd1 +3fe2eb9ab76d4d0e +3ff255ec454c7a85 +bfcba1d8d4c0ba6b +3f73e5756547a043 +3fcf0c59cfef9505 +3ff524d4259bd6b8 +bfc695e5dbcea4fc +3fe1ab73661eabaa +3fa42b593fa9d3ef +3fe67abab42c6efb +3fe0a5ae146787a8 +3fdedc70f5c92e37 +3f90c8e58adc7c66 +bfe126ac23196ec8 +3fc443d7b943e13f +3f791507e161fbdf +3fd25ca0b31f045d +3fc90194a362f501 +bff7eb96a8ec95a9 +bff4111503c2f1f8 +3ff262a0e36fd41e +bff36a8081752a89 +3fe3e120c0395792 +3ff1e169312454cf +3fc1208b7f1a0dec +3fe9a9a0e36ce553 +3fe9595d481e73a7 +bfe871e5500386a9 +3fe525a66cd281f8 +3fe5b2315b609970 +bfd995d03f61e4bf +bfc26623847f8980 +bfde12a7dea06cfb +3fd7488cd5a01823 +bff7306dfe1f834c +bfe9ad0d13a76bc8 +3fea250d4a63d569 +3ff217b4a01f5fde +bfe18744b7c5b8d5 +bff23581833e12f5 +bfc4a1e768374fee +3ff3d7ca83295240 +3fd66e1adcf179be +3fe3a6a452bd46ae +bfd05e4e4d40158e +bfe6cf64b66b935c +bff4492cd9d9b450 +bff1cfa58279ff32 +3fee021e4b6f384f +3ff4f35ee9051b90 +bfee69971fffc211 +3fe3289f2c56c4c3 +bfc466f36e152096 +bfe4a6b24f89f9ce +3fb29fe298c2779d +bfd2b061f3478929 +3fed3f1c90ba6010 +3fa7a23755043b98 +bf562dc05aa0da4e +bfeda2df567027cc +bfc412774aad09d9 +bfd0ec0a78703ca4 +3fd5f6d9a6609b45 +bfee98540b1cced8 +3fd1b52ec527e995 +3ff40ba96f1cbee6 +bfa5ba947391d0db +3fe0bd7e1634c7b4 +bfed57a1e6019598 +bfda6d929c2b68e4 +bfe08ef8e355e991 +bfd5e93d9a22f628 +3f9cd5fdf2734329 +bfe462a11a2eaaa5 +3fe4dea2ed9119f4 +bff08b47c33ac10d +3fd17ef30a26a5f9 +3feed3e0f3e21045 +3fce996c4f578227 +bfd1e0caef2e4003 +bfe227ac3e47d06b +3fe753387ec2da88 +bff0b741da6f4350 +bfeb87526d3b821c +3fe74d293eb63b1e +bfcd3c902ebfb636 +bfe327b63f13a4bb +bfebfe4cd6a69907 +bfefc65ff63fcbce +3fc84f3fafc56d86 +3fdfc82f9a0be44b +3fed410d718fac40 +3fc4b0296c934511 +3feb7b8e9a601ab9 +bff10ee70a6d418e +3fd69935fd5e41e7 +3fcf68e471ba2a1e +3fd3db3d601636d3 +bfb25223b5c9e2ef +bfcfe778a9aa1f74 +3feca34ec2e17207 +bff49298f4cf7050 +3ff0698d8da93e06 +3ff06efddccbeafc +bfdcb1c2544f1772 +bfe9e0394c58012c +3fe03095f74af87d +3fd68317522cff7a +bfe05800ededcc1a +3fc3a6e936764ab3 +3fc111ab5ba7d1c4 +3fe6fe0cdb1de112 +3fda167bfe9dc78c +bfd9b208987dfc56 +bfdc3998e7d7bb11 +3fe120570b757df9 +bfe3a114ea489080 +3fe36b01df3fb622 +bfccffc76de8fedb +3fe490a5d73e6adf +3fe30102b50ab287 +bff63a248e5de7eb +3fda66183bd0160d +3fb547b530cf1a00 +bfdfed8fe1518387 +bfe3ae59b221a569 +bfd61bd7244815a3 +bfe254b454a5e80b +3fe83e8efec736c0 +bfb73d96d42dcf2d +bfdaa65935e2c205 +bfd6c40eeae3f262 +3fc17d3229d0cba6 +bfe60e4c96e56197 +3fee855d88fd8951 +bfe7d4b7827ef256 +bfda0c2b8ba5c787 +bfca0cf342f85dd0 +0000000000000001 +8000000000000001 +3e40000000000000 +3e30000000000000 +3e3fffffffffffff +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +0000000000000000 +8000000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +@acos 1558 1ab75aa22fb6bbbd +400921fb54442d18 +7ff8000000000000 +400921fb52442d18 +0000000000000000 +3e50000000000000 +3e50000000000000 +3ff921fb54442d18 +3ff921fb54442d18 +400921fb54442d18 +40086ce747eb5cba +400821d0965ad9b7 +4007e823dbb32a27 +4007b77852c631c3 +40078c8c6a1c2cd1 +400765b4c4804022 +400741f39702dcf6 +400720a392c1d954 +40070151ee041bda +4006e3ab1bbb7a5e +4006c7700dbe7901 +4006ac6fcae94b6c +400692836404c045 +4006798b4a03f1d8 +4006616d7c7fbc0c +40064a144217a8f0 +4006336d3bdc59f8 +40061d68b6a25df9 +400607f927861168 +4005f312c74053d0 +4005deab43e7d4d2 +4005cab9834d9b9b +4005b73571d79665 +4005a417dae31bf8 +4005915a4884e92c +40057ef6e90b2799 +40056ce8790c1c5d +40055b2a31160a87 +400549b7b64b182c +4005388d0d5c5902 +400527a68f757152 +40051700e0c14b25 +40050698e8420198 +4004f66bc8c3d2e4 +4004e676dabd96e6 +4004d6b7a6f99eb8 +4004c72be1e88b72 +4004b7d16784fb7e +4004a8a637b33493 +400499a8730b6515 +40048ad657ffe7c1 +40047c2e4053414a +40046dae9ed373d6 +40045f55fd51d481 +40045122facfdb49 +4004431449da7b03 +40043528af0e7719 +4004275effc0f024 +400419b620c80552 +40040c2d055ff46e +4003fec2ae299910 +4003f176283f9130 +4003e4468c5fa40f +4003d732fe265331 +4003ca3aab5abd5b +4003bd5ccb49332e +4003b0989e2b0d2a +4003a3ed6c9a7c98 +4003975a87113588 +40038adf4570efac +40037e7b0694d7e8 +4003722d2feb24c8 +400365f52d161595 +400359d26f93b6c3 +40034dc46e6bd718 +400341caa5e3a7d3 +400335e497368f34 +40032a11c853c06f +40031e51c3a03675 +400312a417bcb852 +40030708574f960c +4002fb7e18d1d464 +4002f004f65f8480 +4002e49c8d8b0a6b +4002d9447f331aad +4002cdfc6f5b3c39 +4002c2c40506a004 +4002b79aea1523b5 +4002ac80cb225865 +4002a17557666979 +400296784098c2b5 +40028b893ad4572b +400280a7fc7d6d21 +400275d43e28d52a +40026b0dba8474b6 +400260542e410e29 +400255a757fd3230 +40024b06f831478f +40024072d11c9800 +400235eaa6b35212 +40022b6e3e8d7106 +400220fd5fd67cca +40021697d33e152d +40020c3d62e93c46 +400201edda6454e3 +4001f7a90695ca90 +4001ed6eb5b15986 +4001e33eb72bed70 +4001d918dbb00e91 +4001cefcf512d559 +4001c4ead6495d1c +4001bae2535eaee1 +4001b0e3416a1dea +4001a6ed76860fd2 +40019d00c9c72a95 +4001931d1333e332 +400189422bbc67d5 +40017f6fed32e0e7 +400175a632440486 +40016be4d66ff844 +4001622bb6037d44 +4001587aae116300 +40014ed19c6c3d43 +400145305fa05a14 +40013b96d6edf46d +40013204e243a0e9 +4001287a6238f19c +40011ef738094e7e +4001157b458efff4 +40010c066d3e6932 +4001029892217028 +4000f93197d31107 +4000efd1627b1b52 +4000e677d6ca16a0 +4000dd24d9f54d55 +4000d3d851b2fb98 +4000ca922436a100 +4000c152382d7366 +4000b81874baf17a +4000aee4c17593ba +4000a5b706639a81 +40009c8f2bf7f7f4 +4000936d1b0f54aa +40008a50bced2de2 +40008139fb390c50 +40007828bffbd26b +40006f1cf59d2151 +4000661686e0d35c +40005d155ee48b7e +40005419691d589a +40004b2291556c09 +40004230c3a9e295 +40003943ec889f22 +4000305bf8ae3660 +40002778d523eae3 +40001e9a6f3db8f2 +400015c0b498717d +40000ceb9317e3ad +4000041af8e51473 +3ffff69da8d90743 +3fffe50e28b8fbfa +3fffd3874f46f7bd +3fffc208fadd17c2 +3fffb0930a4f9266 +3fff9f255ce9ba37 +3fff8dbfd26b16a0 +3fff7c624b049166 +3fff6b0ca755b84a +3fff59bec86a11f9 +3fff48788fb685cd +3fff3739df16d581 +3fff260298cb2864 +3fff14d29f75a754 +3fff03a9d61828fd +3ffef2882011edc5 +3ffee16d611d6adf +3ffed0597d4e23fe +3ffebf4c590e9334 +3ffeae45d91e1e77 +3ffe9d45e28f1a5c +3ffe8c4c5ac4d998 +3ffe7b592771c8d9 +3ffe6a6c2e959695 +3ffe5985567b665d +3ffe48a485b80f62 +3ffe37c9a32865c3 +3ffe26f495ef8e54 +3ffe162545755c7f +3ffe055b9964b9f2 +3ffdf49779aa17c4 +3ffde3d8ce71e8c6 +3ffdd31f802724b8 +3ffdc26b7771d412 +3ffdb1bc9d35a423 +3ffda112da90833d +3ffd906e18d944b1 +3ffd7fce419e4c56 +3ffd6f333ea4416a +3ffd5e9cf9e4c87e +3ffd4e0b5d8d444b +3ffd3d7e53fd9d2e +3ffd2cf5c7c70f0c +3ffd1c71a3aafd7e +3ffd0bf1d299ce0c +3ffcfb763fb1c836 +3ffceafed63dfb3f +3ffcda8b81b52964 +3ffcca1c2db8b879 +3ffcb9b0c613a7a5 +3ffca94936b98a22 +3ffc98e56bc586d6 +3ffc888551795ca2 +3ffc7828d43c6b34 +3ffc67cfe09ac04a +3ffc577a63442935 +3ffc4728490b487f +3ffc36d97ee4af91 +3ffc268df1e5fc38 +3ffc16458f44f9ee +3ffc06004456c6c0 +3ffbf5bdfe8efbbb +3ffbe57eab7ed8be +3ffbd54238d47396 +3ffbc5089459ea47 +3ffbb4d1abf4986f +3ffba49d6da44f9d +3ffb946bc7829284 +3ffb843ca7c1d301 +3ffb740ffcacb2c6 +3ffb63e5b4a5469c +3ffb53bdbe245c2e +3ffb439807b8c231 +3ffb3374800692e6 +3ffb235315c680dc +3ffb1333b7c525d2 +3ffb031654e253b4 +3ffaf2fadc106793 +3ffae2e13c539e8b +3ffad2c964c16c81 +3ffac2b3447fd4a3 +3ffab29ecac4c39c +3ffaa28be6d56b6b +3ffa927a8805a0c2 +3ffa826a9db739e5 +3ffa725c17596ef3 +3ffa624ee4683b88 +3ffa5242f46bc1a9 +3ffa423836f7ade5 +3ffa322e9baa9ca1 +3ffa2226122d807a +3ffa121e8a3309ad +3ffa0217f3770e7d +3ff9f2123dbdf478 +3ff9e20d58d41a9e +3ff9d209348d444a +3ff9c205c0c404de +3ff9b202ed592c12 +3ff9a200aa3332e7 +3ff991fee73da924 +3ff981fd9468a359 +3ff971fca1a82948 +3ff961fbfef3a4bd +3ff951fb9c4550b8 +3ff941fb6999a8d4 +3ff931fb56eed8f6 +3ff921fb54442d18 +3ff911fb5199813a +3ff901fb3eeeb15c +3ff8f1fb0c430979 +3ff8e1faa994b573 +3ff8d1fa06e030e9 +3ff8c1f9141fb6d8 +3ff8b1f7c14ab10c +3ff8a1f5fe55274a +3ff891f3bb2f2e1f +3ff881f0e7c45553 +3ff871ed73fb15e7 +3ff861e94fb43f93 +3ff851e46aca65b9 +3ff841deb5114bb4 +3ff831d81e555083 +3ff821d0965ad9b7 +3ff811c80cddbd8f +3ff801be7190ac4b +3ff7f1b3b41c9887 +3ff7e1a7c4201ea8 +3ff7d19a912eeb3e +3ff7c18c0ad1204c +3ff7b17c2082b96f +3ff7a16ac1b2eec5 +3ff79157ddc39694 +3ff781436408858e +3ff7712d43c6edaf +3ff761156c34bba5 +3ff750fbcc77f29e +3ff740e053a6067d +3ff730c2f0c3345f +3ff720a392c1d954 +3ff710822881c74a +3ff7005ea0cf9800 +3ff6f038ea63fe02 +3ff6e010f3e31394 +3ff6cfe6abdba76b +3ff6bfba00c68730 +3ff6af8ae105c7ad +3ff69f593ae40a94 +3ff68f24fc93c1c1 +3ff67eee142e6fea +3ff66eb46fb3e69b +3ff65e77fd098172 +3ff64e38a9f95e75 +3ff63df664319371 +3ff62db119436043 +3ff61d68b6a25df9 +3ff60d1d29a3aaa0 +3ff5fcce5f7d11b1 +3ff5ec7c454430fb +3ff5dc26c7ed99e7 +3ff5cbcdd44beefd +3ff5bb71570efd8f +3ff5ab113cc2d35a +3ff59aad71ced00f +3ff58a45e274b28c +3ff579da7acfa1b7 +3ff5696b26d330cc +3ff558f7d24a5ef2 +3ff5488068d691fa +3ff53804d5ee8c25 +3ff5278504dd5cb2 +3ff51700e0c14b25 +3ff50678548abd02 +3ff4f5eb4afb15e5 +3ff4e559aea391b3 +3ff4d4c369e418c7 +3ff4c42866ea0dda +3ff4b3888faf1580 +3ff4a2e3cdf7d6f4 +3ff4923a0b52b60e +3ff4818b3116861e +3ff470d728613578 +3ff4601dda16716a +3ff44f5f2ede426c +3ff43e9b0f23a03e +3ff42dd16312fdb1 +3ff41d021298cbdd +3ff40c2d055ff46e +3ff3fb5222d04acf +3ff3ea71520cf3d4 +3ff3d98a79f2c39c +3ff3c89d81169158 +3ff3b7aa4dc38099 +3ff3a6b0c5f93fd4 +3ff395b0cf6a3bb9 +3ff384aa4f79c6fd +3ff3739d2b3a3633 +3ff36289476aef52 +3ff3516e88766c6b +3ff3404cd2703134 +3ff32f240912b2dd +3ff31df40fbd31cd +3ff30cbcc97184b0 +3ff2fb7e18d1d464 +3ff2ea37e01e4837 +3ff2d8ea0132a1e7 +3ff2c7945d83c8ca +3ff2b636d61d4391 +3ff2a4d14b9e9ffa +3ff293639e38c7ca +3ff281edadab426e +3ff2706f59416274 +3ff25ee87fcf5e37 +3ff24d58ffaf52ee +3ff23bc0b6be314a +3ff22a1f825892d7 +3ff218753f577737 +3ff206c1ca0ce84d +3ff1f504fe40846a +3ff1e33eb72bed70 +3ff1d16ecf771bed +3ff1bf9521349506 +3ff1adb185dd821e +3ff19bc3d64da8fe +3ff189cbeabf4334 +3ff177c99ac6b378 +3ff165bcbd4e178f +3ff153a52890b55b +3ff14182b2164190 +3ff12f552eadfe6c +3ff11d1c7269b0dd +3ff10ad850986a48 +3ff0f8889bc1252e +3ff0e62d259d32bc +3ff0d3c5bf12773d +3ff0c152382d7366 +3ff0aed2601b1831 +3ff09c4605226301 +3ff089acf49dbf86 +3ff07706faf42cef +3ff06453e392238c +3ff0519378e23823 +3ff03ec5844579e2 +3ff02be9ce0b87cd +3ff019001d6a5a48 +3ff006083875bd35 +3fefe603c82cedef +3fefbfd9c80230bc +3fef9991f558e2ad +3fef732bd28f4c11 +3fef4ca6df5fbf54 +3fef260298cb2864 +3feeff3e7902bf52 +3feed859f750d350 +3feeb1548800a247 +3fee8a2d9c4530c4 +3fee62e4a21f150e +3fee3b790441279b +3fee13ea29f40a0d +3fedec3776f8751a +3fedc4604b683cb9 +3fed9c640395f8de +3fed7441f7eb3ff3 +3fed4bf97cc55efd +3fed2389e2507a1e +3fecfaf27460fe9f +3fecd2327a4b4e49 +3feca94936b98a22 +3fec8035e77f60d5 +3fec56f7c56bc34a +3fec2d8e04185faf +3fec03f7d1b6c13a +3febda3456daf049 +3febb042b6436c19 +3feb86220c9e5462 +3feb5bd1704b9625 +3feb314ff11beb9f +3feb069c980c7bbc +3feadbb666fee189 +3feab09c586d5fb9 +3fea854d5f1affdd +3fea59c865bf57b6 +3fea2e0c4eada98f +3fea0217f3770e7d +3fe9d5ea248752cc +3fe9a981a8bc258d +3fe97cdd3cf63453 +3fe94ffb93a3c37c +3fe922db544449ae +3fe8f57b1ae48ab6 +3fe8c7d97792a25f +3fe899f4edc962d3 +3fe86bcbf3d25c33 +3fe83d5cf21dd319 +3fe80ea6428fda8d +3fe7dfa62fc1b2a5 +3fe7b05af4367790 +3fe780c2b9821516 +3fe750db97615802 +3fe720a392c1d955 +3fe6f0189cb85e0d +3fe6bf3891642142 +3fe68e0136bd54c0 +3fe65c703b4cf5b0 +3fe62a8334cbde40 +3fe5f8379ea6c200 +3fe5c58ad8647fbb +3fe5927a23ebe7a9 +3fe55f02a3a5bef6 +3fe52b215877679c +3fe4f6d31f922426 +3fe4c214b0126fa4 +3fe48ce2986a5023 +3fe457393b90e2aa +3fe42114cdf09f19 +3fe3ea71520cf3d3 +3fe3b34a94d6d7fd +3fe37b9c29a6c857 +3fe3436165d1473e +3fe30a955bc9625d +3fe2d132d5c2e507 +3fe297344fc3af38 +3fe25c93f111155b +3fe2214b84e3200c +3fe1e5547243e213 +3fe1a8a7b2fcc667 +3fe16b3dc96e8699 +3fe12d0eb52a3980 +3fe0ee11e61a58cb +3fe0ae3e2e0168cf +3fe06d89b008ae01 +3fe02be9ce0b87cd +3fdfd2a62675de34 +3fdf4b72373ea0ae +3fdec21cefc8a75e +3fde36891971148b +3fdda896d9c085d7 +3fdd182359c82bf9 +3fdc85085dfa1f60 +3fdbef1bcb088903 +3fdb562f1364b59a +3fdaba0e87b48be8 +3fda1a8082e2c22e +3fd97744681eca44 +3fd8d01165f0dd83 +3fd82494ed0e78fc +3fd77470c33e9906 +3fd6bf3891642142 +3fd6046ebe238866 +3fd543805201da05 +3fd47bbf81fb669a +3fd3ac5c4ad70d60 +3fd2d45a342da0bb +3fd1f281c44595ce +3fd1054b320089f2 +3fd00abe0c129e1e +3fce007bd4150229 +3fcbc468fc3ecf6c +3fc956eea2800475 +3fc6a83017dfb54e +3fc39d7789102f12 +3fc002abde953619 +3fb6a2818b1a0bd8 +0000000000000000 +40010331e48d6368 +40046b7ebd5b5ab4 +3ff9491c0b513ea6 +3ffd1cc32be9d745 +3ff17ea3d96068ae +3ffdd0b085528890 +3feaa0e3f3e9cd4c +3ff610d3749bcf4c +3fec0a8e42a7c349 +3fff1de5cc3946a9 +3ff5f70e770da42c +3ff385253222838b +3fe5e83b50c1a75b +3ffee8aae0068518 +4001132159e198ed +3fe6841612b86a37 +3ff02e38f2417df7 +3fe6949de21c9d3d +400629657848b3b2 +3ff1b72907665e98 +3fff9a94b9709078 +4000b0438821da9c +3ff45029a2df82b7 +3fe485ddeed3e978 +3fed2d7419344dd8 +3ff3acb4e0d4cfce +3fcc121cef72ab87 +3ff6423d3c617182 +40007e13b4c7f551 +3fed98bf2096b850 +3fe04c96ceb579df +3ffa7c8fc6b94f98 +3fecbc2a306ee76c +3ff4189bbd3fc938 +40062c7cf9188838 +4002e0460d2299b2 +40025ba82d6a511c +40002ac5266f16e8 +3ffc0b9285ec8c1f +3ff1624695615ff3 +3fe210bfe1989b39 +3ffea364678d9d82 +3ff6318c17968dd0 +4004f6fbe69d986d +3ffd90178d692a60 +3fecfba177ea7d6d +3ffa768d6ce4bc4a +3ff3b9baf93cb1c4 +400064a41abac78d +4008beaa7e78c163 +3ff8209071d16c47 +3ffe078b8216d9c4 +3ffa8c537ec325a0 +40074f409e857810 +3fc1da7826f18990 +3ff4bcf8c3ac4628 +4003573589c6d502 +3fd68fb3b1d8a3da +3ffe70bcfb94ff9a +3ffadb7f6dc81b31 +4004a3e10bda41f9 +3ff8ca3358000755 +4000c9b7c8ffff5c +3ff50c40ae3f1d35 +3ff696c5aaafacee +3fe78f5676f1ed34 +3ff9b2a3a65ecdd8 +3ffee9c20f38b953 +3fff538d3a70357a +3ffa4cd38e646589 +3ff2845bef28a9d2 +3ffefc057b23dc87 +40042764ba7f767e +3ff4ff54c12fd0be +3fe04bf79395528a +400743ae1d09c419 +40004f18954dbc1d +3fe695ddf235871d +4001a2737a6a2e75 +3fec43f12f338144 +3ff817df044b99b4 +3feca28832128f79 +3fda85cee5cac79b +3ff9d4d3f18fb4a1 +3ff76498ada20086 +3ff80aa1d53f6c91 +3ff785960d7d2306 +3fe48f74a936b8ae +3ff8dd0f5b8da6ef +3ffc4f766b80ad11 +3ff681ad4d0b11b0 +3fea130ab9af20e9 +3ff96945a3c487e7 +3ff5477369945824 +4005ba4d1ac5c6df +4004c79b7bb02e96 +4002b4fa75c0d5d8 +400219922805eaf7 +3ffa1878683e4a55 +3ffec320cd7e2ade +3ff86bf5102284fa +3ff7f9a1a0415dee +3fe8ea7d576cdb30 +3fefc6f4c3b82027 +3ff443350a41d40a +3fff2fe2c1e4a763 +4006a65fbece2bfe +3ffb4a352b2887e9 +40054eecaecc04de +3ffb99180aee7884 +400203d31a2e37d2 +3ff985f49bcaa03b +400316bb6f491692 +3fec5bb75ec3b20e +3fe16290a3412ea9 +4001adeece9768e7 +3ff5a6468680ae67 +3ffef6b0e2efd76a +3ff80204e1c7ce6a +3ff33f59fa87e14a +3fecc2e30d5712a8 +3fe0e44e240853e6 +3ff829d757783ab9 +3ff51f7657675d9e +40027e65daa349ea +400403804af3d39c +3ff55b631f73a6ae +3ff105a26531f646 +3ffdadbbb51f66fe +3ff2814eafdc3e35 +3ff1cf281c7902ef +3ff94511b0453c65 +3fcb1978bdfb8da8 +3ff8d3f25b0225cb +3ff34a5f170a2016 +3ffbf7cc10b1abb6 +40066c0a1dababeb +4002233ebad010ce +40015421b4b7468a +3fff8f4a6eec3be1 +3ffcf8e1ab75068b +4006979e386e794c +4000066af3328476 +3ffed0985a3e3176 +3fda03b2858ea92c +400448c1e5fb12c0 +3ffb5c39bd88bf77 +3fdb808b98bfa44c +4005a7a128830585 +3fff6f70cbd85064 +3fe74531d020fbd3 +3ff323d93e6dda9e +3ff5108ad33496ba +3fe45d8565f75c27 +400043e3f13eeaf6 +3ffc684a4afb269a +4003a807a28d286f +3ffa5324a28660e6 +3ff902ad97da8f5e +4002339d3d5a6300 +3ffa242ac510bdef +3ff5d6afa75ce08e +3ff378b20fa9de13 +3ff96244562b4a4f +3fd2a5be12bdbbfd +3ffb1fd2e2317424 +3fef2c7ba5232c02 +3ff3ea6dfa8b26c1 +400492c76b18a6e4 +3ff4b7cc018e0249 +3ff79f924fe03d81 +3ff495930d860eaa +3ff9b0c2b5ad504b +400171375d0c7e33 +3fee37f46bfca96b +4001257ca3089f84 +3ff831f5d5b5974c +3fed326fcf3a0c94 +3ff6e2c6fa5b7b1e +4005acce865bdff8 +4003e6cdadac40d1 +3ff440b2980965ac +3ffa38ecc3372759 +3ff410e1113fdd09 +3ff2bfaad70e6830 +4003dbd0c321723a +4007ca3ed6f020e0 +3ff4c307e2b0d449 +40022b65c2f48f42 +400358feffd07931 +3feb5375e99f2bfd +3ffd12e571bb1ebc +3ff3bc5e5d6cd462 +3ff0a1249cc6e734 +3ffe223e0368c799 +3fd7843743009bad +3ffe03f368bc0330 +3ffe3b01fcbfcdca +3fd0b9cfef91bc05 +3ff9d41ab51089ba +3ff5cf1f35940940 +3fe02393543778e7 +3ff557afeb20613e +3ff27928313e6e8a +3ff1b5af0bda691c +3fdef0968b459ba3 +3feca0783fd19325 +3ffe4351029feb7d +3ff51d93f055d373 +40081f4c362b81ac +3ff734e054c1c928 +3ffaf86af5fbb1e4 +3ffac5e17cf42ed4 +3fef64d910a731a7 +3ff20ccbac97d45e +3fde588627da532d +3ff6baeec92ef237 +4003a0e6a01ab8e4 +40056f7f8374a01e +4007d411e62d16f1 +3ff268c25cda3b62 +4007652e3fc87a08 +3fe6195e800a8c83 +3fddbf6c921e82a8 +3feefa7d2b3540c2 +3ff57474df648ada +3ffa70c8f7b39839 +3ffa633f20543142 +3fff79bf1490e7d0 +3ffcba7993d72542 +3fd926678e9f9592 +40056da9f1ecab84 +4002e70a205f1035 +3ff519cd1535f905 +3fece291d9e4f8b8 +3ffa000c1c3b1849 +3ffbb301b1bc77be +3ffed7d929c0937b +40066f1213a1f949 +3fff513b667bc215 +4003555ce535ebcf +3ff5eb6b8f1f7ffc +3fd742b0b2cc83d5 +3fed9ccefe27de29 +4004aa52d462bd81 +3ff2cc3351812bd0 +3fffe0cfc1d51ef4 +3fff540a94fc3fb0 +3ff754c0f74a36dc +3fe84704efa7e30b +4001c28c433ee238 +3fceaf0ec8a7a965 +3ff953524cc2901f +3ffbb1ffe541ac82 +3fd35bad597ac8b6 +3ffab82807c2d45a +40003c47a2873587 +3ffd32d4b2f048a2 +3fedbd635c3f71b8 +3ff705eea05465f4 +3ffbee00fefab492 +3fffb9ea57d5523e +4002bea9ef41f337 +3ff153056df45b26 +400678a86b533f12 +40011bc2b4bff2c4 +3ff27322e09b9c32 +3ffd2a84fee05795 +3fe36f3b70f06df3 +3ff53951b25d8e74 +3ff4aadfe9cb5506 +3fef082b216262c4 +40036fc65934e291 +3ff411dbd0a613a4 +4001a1ac89264bf8 +3ff0d564443a8f09 +3ffb501eac5f5ca6 +3ff8ae6474145ba9 +4001fae4dd6560a0 +3fc50c82c38c79ee +3febcbbddfe4120e +3ff9ede382f389a3 +400106da0721108a +3ff2f700224fe9d0 +40083f8c975a0ba1 +400337e4042c65a9 +3ff911ba23c41697 +4005789cb3fa60aa +3ffa7777974b222c +3ffe1320185346a0 +3fea61e8e6a50d55 +3ffeb8f38c563a19 +3fe9c2bf6454a62c +4005ef53dd498d36 +3fe59d3dcea4c3ab +40012b9991a69946 +3ff43e2670a1b00e +4000f74085ea0836 +3ff094ed30d05afc +4000e776dcaab32c +3fe6c992dee1397e +3ffa17879a51e1b3 +3ff6cbfcb9eb2eb0 +4002ac8737d25352 +40009cae4f45fa20 +3fe4f75fd70af1b4 +40005be850228204 +3ffbd86bf6e20873 +3fed5efd5410c384 +40003edbcdcd4c4e +3fdf977eb5650ef8 +4006d3885860e0e9 +3fe791d336897401 +3ffe49c4aa183747 +3fefdc109b334757 +3fd70ad2256218b5 +3feed0d11b176926 +3ff032427ca2d044 +40000b4dbddf73a1 +3ffce40f3a55a8b7 +3fda3ec9202b051f +3ff57bcb8261ab61 +3ff5a96f4ebfd988 +3fe3572e99ace3c2 +3fe36fd0d9f0480b +3ff181966c14bd75 +3febb2a6fd918c18 +40066790933a09e7 +4006b69beebe4613 +4000341c275ff50e +40010e8dab224533 +3ff800d218bb47be +3fe1f9a92d204d87 +3ffd064219f6e9bd +3fda3720ebea6e23 +3ff6a8462af12da9 +3ffe4629498fe409 +3ff9e380520ef71b +3ff0a0f45f10d882 +400149b5e3d22d62 +3fdcc226c0310d88 +3fcf1919260d7614 +40019784c54884b0 +3fef6f7d535322c5 +400256d052033234 +3ffab3cc2187455b +40002778637a17c5 +3ff0440d730376af +4001e529be3a27fe +3ffc63e656492345 +4001f23ad9363af3 +3ff350af64ecab81 +3ffa0d8f925e42c5 +3fe433dd8a92fc87 +3fed6414889f08bd +3ff9458e6c8c99b4 +3fee56735b3d7051 +3febbea06262b324 +3ff7736e4f7595de +4003a505410b4268 +3ff7584f2ab949ac +3ff612717dde39fc +3ffc5b913e555ba9 +3fec4eea941058c5 +3ffcf95a4cf6cebb +3ffa77a2d011f4d0 +3feb72be2f2800e7 +400199d3b8d5eaf8 +4001ce20ccc1f825 +3fc1ef91eca26051 +40053fc1c8cbd8e9 +3fe45abdde0df8d8 +3fcc584696378797 +3fe4bbeeed16c057 +3ff8df3831a7a90c +3fec5b6bcc293ff6 +40047595def57d31 +3fd6f8149627d718 +3ffbb4009eb53da9 +3ff2ed1ff4f44e91 +3fff57d309b7e0d1 +3ffbac62ffa39ed0 +3fe424fc4ab99bd9 +40030c19df775df3 +3ff1c303aa01f16c +3ff0b18196559ad6 +400261b028bfa69e +3ffafe832c86ff79 +3ff6ef20650585bd +3ff827049770eaca +3ff8332369443ceb +3fe71931a571f264 +4003e5539da3f65e +3ff1728c859d4435 +3fe09e460416db17 +3ffa2ea54b7c6be6 +3ffc716badbdedad +3ffc475d2467befe +40049c56ffa8e9a9 +3ff28f4d3acb5000 +3ff08f0ed5e44bd0 +3ff035376652ce28 +3fe34ba9da1a424b +3fee2d8484c21672 +3ff86b10669d68ef +40043a91d8aa6219 +40006ecf0118685a +3fe24d33d2224dcc +400671c94e0d6a79 +40050ec9d3dc6b8d +3ff712dc214d9297 +3fe63927d850ddb8 +400240b48e9dac21 +3ff47b85cabe2b97 +40046e2548e42bd4 +3ff70062bff2e91e +3ff298bcc945325d +3fe6c91c526357a6 +4003ff74f45ad072 +3ff2aea2c7f031b4 +3ffa1085172ec83c +3ff98b5ecdc796dd +40017c0c68be2f28 +3fff220bb24b99ad +4000ba8f981ef967 +3ff91d005e1dde68 +3ff5414c0d594deb +3ff40da8cfa57cf4 +4000d22c734464f4 +3ff17bbca99c25ff +3ff2e0c6d1683280 +3fd4b18bb9ca01c3 +3ffb751999159084 +3ffed16ecccbafe4 +4003dfda0851b3a2 +3ffd7e0bd8945dd8 +4006260bacbccc82 +4000e12fff9e10f4 +40049a0fe53ccd8c +3ffbbc0b91577052 +3fe53fefc74e24f7 +3fc6c2cbd3898afc +3ff4cc40773ab7b2 +4003e11bf00ff4fc +4001d9526a2cb947 +3ff3d96b2d8c3c7b +3ff4153dfd6558b0 +4000eab37e06444a +4003534a76f3e5fa +3feaa5b61ee1958f +3ff8545f16739167 +3ffad713efd56f6f +3ffcbbfcbf87f26e +3ff33b366dec0c66 +3ffa66f6634f84a7 +3ff99ea6de9cdb6e +3fe8b7dc47ae3140 +40020a37668a1bf2 +40005033c248c6f8 +3ff72a3281705322 +3fe41f16dedddbcc +40006d76a9086d15 +4001fa45117f1d4e +4001b2fdb99467be +3ff2e73612da99e8 +400167638210ba7f +3ff9d4c994082aa4 +40086cef1937ec0d +3ff8bcdc522cea6d +3ff2d2ccbed8bfd8 +40012478d65fa49b +3ff0c74c1dd98b74 +3ff25e2d7d2eca7d +3ffb9c2f2233085b +400303bd0cfb4534 +4004f76227b7b4b6 +3fe842f748731721 +3ffa2891a70923ee +3ffbf6af488f4cdf +4005dd2b58d294fb +4001c7e75bf1894e +3fe490117a3d898b +40071e7c4fbdc030 +4006409fdf9fd3d6 +3ff4f4137aa13c8c +3ff53be820861acd +4001f34771bdb5ec +40028c0743565496 +3fea0185ac1f0626 +3fd08d9a8dbc4b97 +3fe179b59281a8e0 +3fea66994192588b +3fe7af1b7d1802ac +3fe61322fe35708f +3ffe40370de614bc +4005339743b2655b +3fded82087e52513 +3fd10b62b0dbeb71 +400239871ef4e4ac +40062129bc28a584 +3ffe78490a1d5132 +3ff190d8c9fb2caf +3ff9b38d563a5236 +400060e093aa0c88 +3ff7e97a8cd13e35 +40070330867b6e03 +3ff9809510bd36a1 +4005af1ada8c249a +3ff26e1be436f2fe +3fff821e809ca59c +3fe948a7abeda4d6 +3febe9f41299ae0f +3ff7a4e418ebc969 +400188d8eeeee9c6 +4002a295a1531c5a +40040cd5a3f4b2af +3fe15090540dc487 +3ff03029ac81efe0 +4000910b4c721476 +3fedfae5a5302700 +40011bb1e4866576 +3ff19665d97bb0aa +4000b0240cb48eb1 +3ffe34ef702a09ae +4001143915ea24ca +3ff9b947f830800b +4002c9eff1e345bc +4000fd57c3ec802e +3ff56bd110083bfb +3ffaa17ae8c211a0 +40034b8661d78684 +400695da48900085 +3ffbf802397ef339 +4002f30c4ee09cfa +40042da456415903 +3ffec3608e550805 +3ff31532959b3b38 +4000951b1ef98f60 +3ff7c195c7611cac +3ff1e4c3df357808 +3ffa7c5713a177f6 +3feebf5289c5755b +400084e0bdf9a86a +4005e07eb25bc59e +3ff9afc79ffb3d80 +400299de90f41f1f +400281acc3ccc608 +4008401cdb3e235a +3ff240de6be0df75 +4001ea534f7e098a +3ff48496deb6645d +3ff249da08c750a5 +3ffb36052123a2f9 +3febb70aea01b304 +4000b2d218d355a4 +40040be9bb03f646 +400882183fb5bc76 +40015d7f97988f0b +4006965f528145ce +40020e026178f5ec +3ff8bfd59819b938 +4000bc5fa92e3341 +3fed8fbb0bfc8bbc +3fffde3864e47a83 +3ff7679b08956b46 +400688391587e7fc +4004576023d83a5a +3ff7142e75748104 +4004ebf7112dac6b +3ff8107df597bf28 +3ffb98825bc6ac71 +40009ec177abc9bf +3ff7e28219b0e84d +4000da0a4ac385e4 +4005289d6a5c592f +3ff4b67c9beb17f8 +3ffa5c3e77dc275b +4005fdffcf2b7f81 +3ff0cb99287a13f6 +3ff9c742c8b14390 +3ff66416d9efe708 +3ff8b46c48ad3bc7 +3fed9a632f3841dc +3ff8e33f9866ae01 +3fed6519eb10ee64 +3ffa3407de6f9c99 +40021a503ee0e19b +3ff8d489130c8a4f +3ff3a1175aa85909 +4007e982ccdb7fa8 +400039a3f18be39d +4003da3c09f59dd4 +3ffba2fb72601dcc +3ff73292730801ca +4001e381413dfef6 +3ff215f2c6abe774 +4003760d3760a8b3 +3fec2ae0fbf68dc0 +3feee190f39f08ac +3ff9969d15953a0d +3fe3df9682bbea15 +3ffa9aa9f459d6dd +3ff70cce52fc74f6 +3ff36416aef50b3c +3ff1a746ae92d97e +3ffdecfb74932f8b +3ffd335f424d2c3b +4002c399cf135fb6 +3fec5cc7ec2b87b0 +3fe0f200a8f8926a +4000bffdea3dd49e +3ff7e9e5a183a820 +40033e6643bb7770 +4004e7dc1234dc8c +3ffde7e7b5fa3f01 +3fedca1ea39ce4e7 +3ffc2b660b893ee2 +40045b1670d7f8d8 +3ff185acb258a9ce +3fe9d28b4285f1f6 +4006267c09ffefe1 +4000e7b807f4c70e +3febe8c7dbc2ef1a +4001458fe97f3894 +3fd7545aeb33e284 +4002e68a6d184e0a +40051d329cd06578 +3ff1d3dc29680f41 +3fe4f72029b41b04 +3ff5d5673cca465c +3ff6beabb51b3976 +40004d99308bf8ca +3ff4dcc55393ffc2 +3ffae0b666ad06a6 +4006ac9a996761c0 +3ffb9db8c43f1f19 +4003cc88545a1605 +3fd395c7a9516ccb +3fe61e55739e3efb +4003d7c6faf14fad +3ff162331ce7e094 +3fe979428ebb1f2d +3fcf36d4c86f04b8 +3ff520aa40ef5279 +3fe73be09f296d1c +3ffed8622d3b5eb8 +3fd815d9128d349c +4003c589723436e5 +4004b8a05ed09f64 +400540c2dd4f97a0 +3ffa8c05da61a4a4 +3fdcc9f68ac59adc +40003fa25b4cc3ae +3fee4982b0b2b200 +4003556e8bc0f04c +40006b4c15e35e4b +3ff259be71a9fae5 +3ff58de86b478c9c +3ffb06d35762df00 +3ff54c1e9c4ef54c +40012dae50afd30c +3ff41e388c1bb0d6 +3fe02de5564e6e65 +3fe9391147752bc8 +400585f617a729ef +3ff6e12d83351284 +40064fe254ad2442 +400128a27b1e1f07 +400029cfa5cd115d +400001987f43074b +3fe338873c7ce153 +3ff4dff9dfbbfe56 +3ff9c6024ce083c7 +40034f7fc3fcc40e +3fe6f09860e00bed +40068310f1d48db5 +3ff6cbbbb9ed0fb7 +3ff7047d25c99b40 +3ff911a1cbd97570 +400490b99c6fb145 +3ff2c595d5e88b65 +3ff43d6bd4eb6668 +3ffa280031b8f4e8 +400176d0c3285ec1 +40003cb12f93f32e +40012913771f522a +3ffb0b2a66a4b786 +4000f861776308b8 +3ff99c0603d49399 +3fe1170d876d2f23 +3ffd8947b70ab9c5 +4003fd646e3b2d9f +3ffc3e0c24d3a959 +4000ec864fdf4f31 +3ff1be2f30bda8b8 +4001db0eb5267457 +3ff06b48752cdefb +3ff5a8f50904c62c +3feda1fbf61f168d +4001c136448f8e0e +3fed4444c6fd579e +40030e4072a8c32e +3ff0c0a3f4bce995 +3ffe4f200db489c4 +3fe6236ea78d7e4f +40052d2444b8f033 +3ffefe2ce3d599a3 +3ff7fa1c2906ec53 +3ff22f2ca88b3e4c +3fed470bc57f9f07 +3ffb75996ba23c5d +3fe3b1e2dce26f65 +3ff1125e95fe1be2 +4001021be008eef0 +3ffe002208b01a0d +3fee847519529d52 +4001faccb64d07e1 +3fff48313836f4aa +4000b8b73beca3c4 +3ffc93c659dcb7ee +4005ba2e8d611f01 +4001b22b0b10d4d3 +3fe7eef06b4cb81d +40066cb83b37a142 +3ffff8fb2b1308c0 +3ff3a360d4c113e4 +3ff38bb613c2cd7e +3fe5fca30082dd59 +3fec9ca0c865a923 +3ffcddbc3bfb9a1c +3ff67112f52d8883 +4002a1b19c10923b +3fe6d989e0c7c138 +3ff4da5897a9be82 +4000ae3181c5b5dc +3ffa910ba63253aa +40051b67e7e95651 +3fed7863c3cea80a +3fff9bef88a0d49a +3ffe0336ec452a00 +400092ad8e28f56f +3fd8a6e44b54c2d5 +3ffaa3e68dc87c59 +400635dd90a61c80 +40049f3d6e3fe648 +3ff11158b24581ca +3ffe233578ca2253 +4004c3c915da94d2 +4000d3195315c2a7 +3ff160683808eafa +3fc1dc554be1780b +3ff8dbd66797e7d8 +3fe7d8dc40c20deb +3ff3b9dcca658467 +4001310e7aa5ec29 +3ff9f63ed3556f0c +400136d191c63bae +3ff69b8c2e91deb6 +4001ef9d4014997c +3fdbd5931b10a0f9 +3ff4aa7ff0e19333 +3ffdee5e4dfbc2e5 +3fd48d86dade347d +4000e37846584898 +3fffa789053f0528 +40064e517e5af0cc +3ff3433b16f1e2a2 +40021f259284efc7 +3ffcb73ca091c62e +3ff8fc6f32401072 +3ff0167ae181dfd1 +40011f96ef97fbde +3ff2d1058c95d2ea +4000024d27cada70 +3ffb2a128010f528 +4004cb016969a3a9 +3fd02d83047c233a +3ffdfb223369924e +3fee877f716980c4 +3ffc0041cb254eda +3fe8308e7acfee09 +400445766590d719 +40070f1889d6f182 +3ffd1c544f5e13a7 +400025b2f5138eb8 +3fd252533c7a7b2b +3ffa6cf8206bca91 +3fc3e9f3656af76d +4003460c19d9b31f +3ff931b96f855916 +3ffd3421fee6946a +3fe3d0d78baa8462 +4001d091eb4c68b0 +3ffbc3fe5030370c +3ffa3c2d397e703e +3ff0800cc076d634 +3ff38cea5081fa80 +3fea9f4c9817ef06 +3ff021cc66364df6 +3ffe9d8591e080b4 +3ff145e16ce0a7fe +3ff2627b7cb7e648 +40010298c8df0e90 +3fe34396a24b7f3e +400109bf5da521d0 +4005dc22bc2097ed +3ff80d5c46befd8f +4007671e50ac0af9 +3ffa855d765759f7 +3ffa55a5ad8d300b +3fef00f4a605d270 +40049ebc857de34e +3fe0e05b65130989 +400343f16be702ff +3feecaf23040a7c4 +3ff743e452708f61 +3febdc56f5db4dd1 +3ff1a5bc6bffe911 +40052f55b7bd4ab3 +400273c7650773b5 +3fe3e76fe1f59341 +3ff4be4e7cce9056 +40000db96c420d75 +4004ea8a87953318 +3ffc6a49aeda8f19 +4006bb1262777d47 +4000aca17d73993c +4000b9fafa23210f +3fec21176891f617 +40028776454115c4 +40048fee02f82052 +40016de53d52a538 +3fdf31ef14b732e5 +3fd5a9863cf7959a +3ff36cc06ad24430 +3ff06add206fe0e4 +3ffd010c450c441b +3ffcaf33f7ad6c9f +3ff611baec85f8cb +3ff45d3bc34358aa +3ff1040d2c9200b8 +3fe573743f572d26 +40032b3b3542e0b1 +3ff96829859e9e08 +3ffc5b0812a7baee +4001277632e38443 +3ffdc861d5aa89f2 +3ffcfdd58cc7cd9c +3fec8740d07abed2 +40021ab6ff98a319 +3fc3e0538b29d3aa +3ffd8ca532df755e +40049187c28937ff +3fe1381f34d62681 +3ff99bb1e283fa77 +400353e5cf9e423e +3fef79ec0aafdea6 +3ffa232c11dfc2c2 +3fffc7a7854dd3d6 +3fe6bf31507a461a +3ff8a370c7f3afdf +3ffe934d6c1eb554 +3ff637f11f07a373 +3ff1009f8ba4a536 +3ff7c49fa0539509 +3fedfd5b60c2227d +3ff5865731f05977 +3ff385285c981ce0 +3ff46ca665860861 +3ff583c2b391e3f6 +3fec438c8351fbc0 +4000709e6a77a29e +40032695141eb148 +3ffed7f09d1a4f9e +3ff85ca3d223f59f +3ff3033e43d14dce +4004235f5629b9fa +4003166f7b94eb6d +400488338093e808 +4001e213a4214bb0 +4000da8d4b4cc3c0 +3ffe8561f38a20d6 +3fde1b2d0c8a9b05 +3fed5a15cc9d3bd1 +3ff3d10e6eb9c904 +3ffe224d66e3cc0c +3fef585bf11b0d22 +3fdb303c3bdeca4d +3ffc96366edc4466 +3ff90e15dedee578 +3ff540701a463a78 +3fcfe9397542b306 +3ffbf4b80fbe01b8 +3ff04c41a134d743 +3ff880a08a46de79 +3febc93bf45beb36 +3ff0cf244a106944 +3ff16adf16d1e18a +3ff8ded7be18bb27 +4000daa8b2e8723e +3ff699805d1bb0f0 +3ff908e64c62cb1c +3ff48ad3277c6c01 +3ff601c8bfd7ce78 +400886c8fe986161 +400699882c038f88 +3fdafd69c35163e7 +4006463deadcabd0 +3fee62d5e84f029e +3fdd02488c7f6124 +3ff6fde9e460eb5b +3fe89a55c51b74dd +3fe8ea996069e68a +4002ad76fe22f836 +3fed1e503bb5d839 +3fec91c54d27c0c0 +3fff876f641ca648 +3ffb6ebfc4d41e48 +40005352a5f6242c +3ff34fd81edc2710 +40082934a931d832 +4002fc40ef0bf17e +3fe81ee95e2484c8 +3fdc291ad09334eb +4000f2ced81384c2 +4005abbe6bc12006 +3ffbb638414b1716 +3fd528c3446b6b60 +3ff386749d07cea9 +3fee9d5255cb1383 +3ffd398ee794327c +400244d6d7bcfb63 +4006b594170ef0b4 +400578d06b5f1625 +3fe441d85d1921e2 +3fd0ba71acfc4624 +40042b6372220710 +3fef1b577c31956d +3ffbaed9c206d12b +4001baaa3e049500 +3ff7f7fd2ab8059e +3ffdce13d1160f63 +3fe504da17cdfa21 +3ff864e9999c0b3c +3ff92786c45ad54f +4003f9b57fbe207f +3ffba44a3d99ce53 +3ffd5cfdf2603c42 +3ff3a444eaac0647 +40043712ace94a42 +3ff4b4afa2fa32b3 +3fd45947949db8c7 +3ff9cfcff7e0bb9f +3ff0c33c4929c93e +4003e6e623a27bf2 +3fffbd5ffb4f0751 +4000b4bbe2f790f0 +3ffe9c4abacceaa2 +3ff8aea35c7a600c +4001a9a5f0adc136 +3fed6553baf7403c +4004d6a18bbf7713 +3ff4c23e91ba839a +3fe37015b4a649eb +3ff54ecdca593cd3 +3ffd9a2e100fbd19 +40011ae8b9b40aa6 +3feaf0be29c57fa8 +4004ec9e9759b834 +400372d24570f714 +3feaf6cd69d21f12 +3ffcc98d5a1c23df +40015aeb39e6ffbb +40039090dfcbbcce +40048295a7b20980 +3ff618135e4b7f68 +3ff12fef6dc13406 +3fe502e936f8adf0 +3ff68bf626b1c476 +3fe6c8680e283f77 +400518712f58b753 +3ff37badd4ec9c9e +3ff534dec60ce7d4 +3ff42b2bfc3e9f64 +3ffa471d8fa0cb47 +3ffd1eea69797107 +3fe5a0a7e5a6e829 +4006da4a2489ceb4 +3fe170db8d35de24 +3fe165faeef08438 +40002735f4abf97a +4003090bfd3816d7 +3ff109b0589eb0da +3ff381357fb8ed3a +4000a6fde59d8993 +3ff6ad1e2d7563c2 +3ff6ffc5e8cf32e0 +3feb45e9cd6a791e +3ff29c5c549cbb35 +3fff8e7d7a63ac2e +40001830c71d0dee +3ff091cfce896e1c +40017942e4b43aac +3feed8f4c948a40f +3ffcc1f442014cf4 +3fedb350d149ef51 +3fef42f3f37da7aa +4007ae0ff1510a82 +3ff2887545502795 +3ff7cd8001373b78 +40008eafa64c46fd +40017c9416aa7fe6 +3ffea8f11d563281 +4001262abf4b908f +3fea0567a9c12371 +3ffa95d4c1870a0b +3fffcb91a1bcdd9a +3ffed2ff0efd29b1 +3ff6f2550f0a13a4 +40021490cfdb6ef2 +3fe3be991f8ad0df +4002862b8ac1d322 +3fffa506372d9efa +3ffc6399bca338d2 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb52442d18 +3ff921fb53442d18 +3ff921fb52442d18 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff921fb54442d18 +3ff921fb54442d18 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +@atan 2218 607f2d8fa1ab934a +0000000000000000 +8000000000000000 +bff433b8a322ddd2 +bff42d1c68294f77 +bff4266ef05288f7 +bff41faffa359eb8 +bff418df432a0f06 +bff411fc87407386 +bff40b07813b0226 +bff403ffea85dc1f +bff3fce57b2f29bf +bff3f5b7e9df016d +bff3ee76ebcf188c +bff3e72234c23ca6 +bff3dfb976fb9357 +bff3d83c63359f70 +bff3d0aaa8990992 +bff3c903f4b32aaa +bff3c147f36c5693 +bff3b9764efde50e +bff3b18eafe7f747 +bff3a990bce6f812 +bff3a17c1ae8d4e7 +bff399506d01edbc +bff3910d5461b9ad +bff388b270471e6f +bff3803f5df47872 +bff377b3b8a35191 +bff36f0f1977c40e +bff36651177387b5 +bff35d794768a6c8 +bff354873bebd85e +bff34b7a85467ddc +bff34252b1684110 +bff3390f4bd85074 +bff32fafdda63712 +bff32633ed5a4d76 +bff31c9afee5c10f +bff312e493922f60 +bff3091029f0d241 +bff2ff1d3dc93a7f +bff2f50b48079614 +bff2ead9beaa7f2e +bff2e08814b0512c +bff2d615ba0400cc +bff2cb821b697494 +bff2c0cca2695aac +bff2b5f4b53c7949 +bff2aaf9b6b676c0 +bff29fdb06301666 +bff29497ff70e779 +bff2892ffa986322 +bff27da24c0676ee +bff271ee444378e4 +bff266132fe782b6 +bff25a1057813150 +bff24de4ff7bc673 +bff241906804a9dd +bff23511ccf047df +bff22868659e4b3a +bff21b9364dd3061 +bff20e91f8cd3078 +bff201634ac2828b +bff1f4067f26f1d7 +bff1e67ab55ac82e +bff1d8bf07950bf6 +bff1cad28ac31185 +bff1bcb44e67600b +bff1ae635c77eacb +bff19fdeb93b9fc1 +bff1912563274d8f +bff1823652b9e2fd +bff173107a580b3d +bff163b2c6272ac4 +bff1541c1be7c170 +bff1444b5acf37a8 +bff1343f5b611d13 +bff123f6ef47e0c2 +bff11370e12d0bc5 +bff102abf4910884 +bff0f1a6e5a282c3 +bff0e06069156da3 +bff0ced72bf9bee1 +bff0bd09d391f053 +bff0aaf6fd295ad5 +bff0989d3dea7ff1 +bff085fb22b55a23 +bff0730f2ff5ce11 +bff05fd7e17a5a29 +bff04c53aa4b24d9 +bff03880f4818d43 +bff0245e212065b1 +bff00fe987ed02ff +bfeff642ee92a0ea +bfefcc08681e37dd +bfefa11ff2d9a642 +bfef7585f187dff6 +bfef4936b312af49 +bfef1c2e724feb6c +bfeeee6955cbc71b +bfeebfe36f98e4fe +bfee9098bd26ede8 +bfee608527207462 +bfee2fa481510196 +bfedfdf28a943901 +bfedcb6aeccf12d8 +bfed98093cf44085 +bfed63c8fb14e334 +bfed2ea5927ed1fc +bfecf89a59e9c3c1 +bfecc1a293b4c8b1 +bfec89b96e3597b0 +bfec50da041b4db1 +bfec16ff5ce65745 +bfebdc246d7757cd +bfeba04418b6fd73 +bfeb63593058cd52 +bfeb255e75bb0f84 +bfeae64e9ae61f78 +bfeaa62443ad8121 +bfea64da06f53745 +bfea226a701df1f3 +bfe9ded0009ac5ad +bfe99a0531b3332f +bfe9540476745d02 +bfe90cc83dd459f1 +bfe8c44af50aa1c1 +bfe87a870a209b1d +bfe82f76eebd55c8 +bfe7e3151b2f79d2 +bfe7955c11b86a85 +bfe74646621b8930 +bfe6f5cead746752 +bfe6a3efaa568fa9 +bfe650a42939591a +bfe5fbe71931f3a3 +bfe5a5b38cfd8cee +bfe54e04c05d06a0 +bfe4f4d61dc341fa +bfe49a23445679e5 +bfe43de80e44845e +bfe3e02097691d1e +bfe380c944448c93 +bfe31fdec940164f +bfe2bd5e323c995a +bfe25944ea66b217 +bfe1f390c44a7a2d +bfe18c40021fb6fc +bfe123515e45e4f7 +bfe0b8c413e6175e +bfe04c97e7af1c09 +bfdfbd9a613d7ae8 +bfdedec9c192bfaa +bfddfcc11c1f2b99 +bfdd1784f55f5bba +bfdc2f1b3b3f55c8 +bfdb438b5535407a +bfda54de3396206a +bfd9631e5df576a2 +bfd86e58005ea7bc +bfd77698f7359e9f +bfd67bf0d98b4218 +bfd57e7101b22948 +bfd47e2c93e09484 +bfd37b3882ae22a6 +bfd275ab913e16df +bfd16d9e52ea548d +bfd0632b28478608 +bfceacdc72c0642b +bfcc8f0ada159c5c +bfca6d20ba8c2bc6 +bfc84760911e0e7f +bfc61e1000597cbd +bfc3f177a6efcbcb +bfc1c1e2f05acb8b +bfbf1f3fbf98d978 +bfbab5fdab623eb1 +bfb648a4a043683d +bfb1d7dd4d6a587e +bfaac8a708d53f35 +bfa1dd6b4326b12a +bf91decfb9daa380 +0000000000000000 +3f91decfb9daa380 +3fa1dd6b4326b12a +3faac8a708d53f35 +3fb1d7dd4d6a587e +3fb648a4a043683d +3fbab5fdab623eb1 +3fbf1f3fbf98d978 +3fc1c1e2f05acb8b +3fc3f177a6efcbcb +3fc61e1000597cbd +3fc84760911e0e7f +3fca6d20ba8c2bc6 +3fcc8f0ada159c5c +3fceacdc72c0642b +3fd0632b28478608 +3fd16d9e52ea548d +3fd275ab913e16df +3fd37b3882ae22a6 +3fd47e2c93e09484 +3fd57e7101b22948 +3fd67bf0d98b4218 +3fd77698f7359e9f +3fd86e58005ea7bc +3fd9631e5df576a2 +3fda54de3396206a +3fdb438b5535407a +3fdc2f1b3b3f55c8 +3fdd1784f55f5bba +3fddfcc11c1f2b99 +3fdedec9c192bfaa +3fdfbd9a613d7ae8 +3fe04c97e7af1c09 +3fe0b8c413e6175e +3fe123515e45e4f7 +3fe18c40021fb6fc +3fe1f390c44a7a2d +3fe25944ea66b217 +3fe2bd5e323c995a +3fe31fdec940164f +3fe380c944448c93 +3fe3e02097691d1e +3fe43de80e44845e +3fe49a23445679e5 +3fe4f4d61dc341fa +3fe54e04c05d06a0 +3fe5a5b38cfd8cee +3fe5fbe71931f3a3 +3fe650a42939591a +3fe6a3efaa568fa9 +3fe6f5cead746752 +3fe74646621b8930 +3fe7955c11b86a85 +3fe7e3151b2f79d2 +3fe82f76eebd55c8 +3fe87a870a209b1d +3fe8c44af50aa1c1 +3fe90cc83dd459f1 +3fe9540476745d02 +3fe99a0531b3332f +3fe9ded0009ac5ad +3fea226a701df1f3 +3fea64da06f53745 +3feaa62443ad8121 +3feae64e9ae61f78 +3feb255e75bb0f84 +3feb63593058cd52 +3feba04418b6fd73 +3febdc246d7757cd +3fec16ff5ce65745 +3fec50da041b4db1 +3fec89b96e3597b0 +3fecc1a293b4c8b1 +3fecf89a59e9c3c1 +3fed2ea5927ed1fc +3fed63c8fb14e334 +3fed98093cf44085 +3fedcb6aeccf12d8 +3fedfdf28a943901 +3fee2fa481510196 +3fee608527207462 +3fee9098bd26ede8 +3feebfe36f98e4fe +3feeee6955cbc71b +3fef1c2e724feb6c +3fef4936b312af49 +3fef7585f187dff6 +3fefa11ff2d9a642 +3fefcc08681e37dd +3feff642ee92a0ea +3ff00fe987ed02ff +3ff0245e212065b1 +3ff03880f4818d43 +3ff04c53aa4b24d9 +3ff05fd7e17a5a29 +3ff0730f2ff5ce11 +3ff085fb22b55a23 +3ff0989d3dea7ff1 +3ff0aaf6fd295ad5 +3ff0bd09d391f053 +3ff0ced72bf9bee1 +3ff0e06069156da3 +3ff0f1a6e5a282c3 +3ff102abf4910884 +3ff11370e12d0bc5 +3ff123f6ef47e0c2 +3ff1343f5b611d13 +3ff1444b5acf37a8 +3ff1541c1be7c170 +3ff163b2c6272ac4 +3ff173107a580b3d +3ff1823652b9e2fd +3ff1912563274d8f +3ff19fdeb93b9fc1 +3ff1ae635c77eacb +3ff1bcb44e67600b +3ff1cad28ac31185 +3ff1d8bf07950bf6 +3ff1e67ab55ac82e +3ff1f4067f26f1d7 +3ff201634ac2828b +3ff20e91f8cd3078 +3ff21b9364dd3061 +3ff22868659e4b3a +3ff23511ccf047df +3ff241906804a9dd +3ff24de4ff7bc673 +3ff25a1057813150 +3ff266132fe782b6 +3ff271ee444378e4 +3ff27da24c0676ee +3ff2892ffa986322 +3ff29497ff70e779 +3ff29fdb06301666 +3ff2aaf9b6b676c0 +3ff2b5f4b53c7949 +3ff2c0cca2695aac +3ff2cb821b697494 +3ff2d615ba0400cc +3ff2e08814b0512c +3ff2ead9beaa7f2e +3ff2f50b48079614 +3ff2ff1d3dc93a7f +3ff3091029f0d241 +3ff312e493922f60 +3ff31c9afee5c10f +3ff32633ed5a4d76 +3ff32fafdda63712 +3ff3390f4bd85074 +3ff34252b1684110 +3ff34b7a85467ddc +3ff354873bebd85e +3ff35d794768a6c8 +3ff36651177387b5 +3ff36f0f1977c40e +3ff377b3b8a35191 +3ff3803f5df47872 +3ff388b270471e6f +3ff3910d5461b9ad +3ff399506d01edbc +3ff3a17c1ae8d4e7 +3ff3a990bce6f812 +3ff3b18eafe7f747 +3ff3b9764efde50e +3ff3c147f36c5693 +3ff3c903f4b32aaa +3ff3d0aaa8990992 +3ff3d83c63359f70 +3ff3dfb976fb9357 +3ff3e72234c23ca6 +3ff3ee76ebcf188c +3ff3f5b7e9df016d +3ff3fce57b2f29bf +3ff403ffea85dc1f +3ff40b07813b0226 +3ff411fc87407386 +3ff418df432a0f06 +3ff41faffa359eb8 +3ff4266ef05288f7 +3ff42d1c68294f77 +3ff433b8a322ddd2 +3ff433b6f41ba4cd +bff433b6f41ba4cd +3ff433b878089825 +bff433b878089825 +3ff433b8a322ddd2 +bff433b8a322ddd2 +3f81df28e7299726 +bf81df28e7299726 +3f9acd58ba5c9005 +bf9acd58ba5c9005 +3faac8a708d53f35 +bfaac8a708d53f35 +3fbab5fdab623eb1 +bfbab5fdab623eb1 +3fd57e7101b22948 +bfd57e7101b22948 +3fe54e04c05d06a0 +bfe54e04c05d06a0 +3fa9004b61a2ad0b +bfa9004b61a2ad0b +3fd37b3882ae22a6 +bfd37b3882ae22a6 +3fd64977500d0413 +bfd64977500d0413 +3fe43de80e44845e +bfe43de80e44845e +3fe6a3efaa568fa9 +bfe6a3efaa568fa9 +3fec50da041b4db1 +bfec50da041b4db1 +3fece2ba4bc918ea +bfece2ba4bc918ea +3fed63c8fb14e334 +bfed63c8fb14e334 +3ff00dd94f088e29 +bff00dd94f088e29 +3ff00fe440bc3b7d +bff00fe440bc3b7d +3ff00fe987ed02ff +bff00fe987ed02ff +3d719799812dea11 +bd719799812dea11 +3ff220baaddd140e +bff220baaddd140e +3fe2a979e93c0051 +bfe2a979e93c0051 +3ff921fb543d4de0 +3ff921fb54442d18 +3ff921fb54442d18 +bff921fb54442d18 +0000000000000001 +8000000000000001 +0010000000000000 +3ff91c3602aaf162 +3ff91c367668c617 +bff91c7c18da8562 +bff91c7dbb6e4f94 +bff91c7ac96ca430 +3fd12e961036ee0e +bfe5e81677cefb71 +bff740b987aa7bf0 +3fe5a88e975b31f0 +3ff4778f78e9b662 +bff7d8c3d5c106a3 +3fef5b6427c093f1 +3ff36066c4527018 +bff7da5d12b3452b +3ff3c589156fde04 +bff2edf6685db6d5 +3ff5efe13b79e5a0 +3ff2eb3fc504f834 +3ff6811bad0748e5 +bff76d9d78fa23f7 +3ff70c2fb1afda7a +bff35b8e42a510a8 +bff6fc4d68a8325c +3ff751147bf80b3f +3ff72e1f174598c7 +bff729688d31798d +bff71e33465c81c4 +bff74b62c9d78a16 +bfef40bf8fdd1b25 +bff7bd1d4babb56d +bff79201b1e6195d +3ff7a5706a296985 +bff77fea99f2fe25 +bff7942ae34cdc9e +3ff75de7a10bc1d8 +3ff1ec97333c911d +bff6e4e4f974d1b3 +3ff551a26831a7b4 +bff7c4be031a9b5a +bff7001404f71e62 +bff770f4cd8ab035 +3ff7a9a2c2c0c4b4 +3ff779305bf55da3 +bff7a8b9bfdcd07e +3ff78a1e5c42d103 +3ff19bf8e158d53a +bff797555adbb776 +bff6e1e648384f8e +3ff58805821c0ded +3ff73b9f2011cdd4 +bff7c032b58e8d71 +3ff70ac489c1090e +bff696e9310d5733 +bff75f498ec0fb4d +3ff568ca98755d50 +bff7543635dafa6c +bff62a07bc14e17a +bff6571dba422c8a +3ff5b4a36e4f761d +3ff54a69eb1a5c59 +3ff1da8798d6ef07 +3ff74fd6a92eb0a1 +3ff5e6f4ba1aa8a9 +3ff797ea93e30183 +bff52348d32ab3fc +3ff640bcbcf56eea +bff7aaca00b02a19 +3f79562672983bf8 +bff7d3fd0d141549 +bff7dc5d80e4b01c +3ff278c68bf940ab +3ff420286383869a +bff778e92248f9d3 +bff7c00a98c784f2 +3ff7d71db8c20f1c +3fe79474977e5a3d +3ff7b92043e6911c +3ff7adc13c4cfd66 +bff7a110d663ddea +bfc055983bef2a7d +bff5e72c02a86f90 +3ff79e023304b41e +3ff726dc8a2b7710 +bff770d61758f1f2 +bff4df42bdb38766 +bff712705a723429 +bff7d48b2f7abb6b +3ff2bee9e4e41b6e +3ff6f4cbf0494e8a +3ff4c8109db7b60a +bff6bf5cd5652b0c +bff324e9a6813f24 +3ff6b1cfecfba2fa +bff7660aab9e64da +3ff62b12aeb16cd7 +bff7b08aa966d345 +3ff5fd9a175ca118 +bff7cc2b3d83a6f8 +bff569a6a7b71dcf +3fe6b0c381053dd1 +bff71acc291554cd +3ff777e260828a55 +3fddfdbdf25bf177 +3ff585a9ab08558b +bff7c9c0daf01b76 +bff4dbb177f8fd72 +3ff77dd57f8606e6 +3ff52910d46b8733 +bff4600c3d44cc5d +3ff2a7c0c1304514 +3fef44dd2ed90b16 +3ff791817106d673 +bff486aefd94e2d2 +3ff2e6a868d53dee +3ff791d14471624e +3ff45b2697d9890a +3ff7a8796346f2f8 +bff0c18f9effd41f +3ff7966d8d878b0e +3ff72d518ebce3d4 +3fe1bb9a924845b9 +bff684b18f70f336 +3ff70c7abc4c65dc +bff6cdeedda7dafc +bfec5b6ede18a2a0 +3ff6bc28001ee4cf +3ff5cc8898e7abae +bfdc965dafa0ad3e +bff79e536fec49ef +3ff47962ad370e1a +3ff7037e04adf78f +bfe4b3c06b22d476 +3ff1419d17211682 +bff11165c7cf47bd +3ff64e539d6e2ff9 +3ff57bcf216037e5 +bff7668b96664970 +bff4fa12105a41ae +bff3cc056ee0c50b +bff7a13806e60eae +3fec4fcb30402cca +bff775962a82df3b +3ff747c231638719 +bff725ac84f591d0 +3ff7185633ce2a19 +bff05003db1b7fd8 +3ff7c9fb26b4d147 +bff4c9297924054e +3ff77e9e0bce6705 +bff6cabd07f5d71f +3ff7bee0f955c9ae +3ff7943e7f0d22e1 +bff5fa63efdf738c +bff5edecf4b2ba6b +bff7bf4ffe0cb548 +3ff7cacc9629b0d2 +bff7c0a57aab6204 +3ff57ea9f23b34d4 +bfefc7b4a07da972 +bfd14bdbc92b172c +bfe9ffc26337efee +bff3268a3f90e091 +bff23450c6fab661 +bff388ca58f4afbb +bff6a95e7191f10a +3fef1118f1217281 +bfca4b556880f4b0 +bff60477bde111f2 +bff691b9b38d4388 +bff3225a169f3e1b +bfd7104290d1bb10 +3ff7c99bd8f140fe +3ff7c54696fb5c4c +3ff69a2102276725 +3fdbccf7e937932f +3ff7c4cf9ee9b544 +3ff3e91ea5f38c92 +bff70477c89d8cfb +3fd864ec7c64b2e4 +bff7dcae9cec7fae +3ff229eeadd3cc6d +3ff3fd369d356b2e +3ff5a425359e0c96 +3ff6d6e95d2c90c3 +bfed3427cb7f0ca8 +bff7868dd91b186c +bff565d9d2534f0b +bff7793a880a6e4c +bff6ad5f033d60fc +3ff293973af2b12e +bff76c5b92c2fe83 +3ff243fdb4670fc5 +3ff73de9551aeafb +3ff79366673344dd +bff7c80586f54342 +3ff7b43399d672b2 +bff7dab90942eb40 +bff66ec448ad2e7d +3ff4f9adafa6ba53 +bff75711f89df1a8 +3ff6c2045738085c +3ff7363f20eb4fb3 +3fe40a2fd7a0dc3f +3ff76cba223023ff +3ff697520b3f7ee5 +bff6fac632047786 +3ff523042ba19d89 +3ff7a75ca5f21ca1 +3ff76acf1c602276 +bfd5bcedbdee2b6f +bff79cef753af434 +bff6226d51ab4907 +bfe996c6019f361c +3ff5db18ebb7f99f +3ff6f688002f5f29 +3ff7798ca475394c +3ff7c42326124fb8 +bff598eceb7e840f +bff79d4b19c1d0ec +3ff6b111ec8e3580 +3ff6fb2e1068825c +bff7cf6edc9ba251 +3ff2932f9bb4703b +3ff6044e71fc6fc6 +bfe940581a05be47 +bff6cf3a5bf77c69 +3ff6ad081eac0ea8 +3ff75c5c991ac3ea +bff76ada3e46b98e +bff7498bfb33d954 +3ff7aa967e04d9ca +3fdb0a67f8391026 +3ff77cfa811bd480 +bff6aa4d0807dab5 +3ff3f9cdc30c8055 +3ff68771e4884035 +bfe44771bcd4994b +3ff71b8392f1ea85 +bff6a59148f5cf84 +bff76e8640cbce53 +bff791609e287414 +3ff21b6db4e21b83 +3ff691ac79aecc35 +3ff4c4ac443f6b56 +3ff779c0e0b06d79 +bff688243887a62d +3ff62019a5f005f6 +bff76121fd6a5d29 +3ff798ebf0be6704 +bff39c9e847dd1ef +bff68bd874a906ef +3ff71f75ea6a3538 +bff43235c73adfb2 +bfefdc55ba2b3f38 +3ff78be8330f7913 +3ff57277c1da34e3 +bff630788a27c03a +3ff79692d01ae873 +3ff065e4b237ec11 +3ff6147d013addf4 +bff432544dce4eea +bff6d7d9f9493154 +3ff430bfe6761fd9 +bfe37521cee10085 +bff71a19f542a012 +bff7a15a1da96a5c +bff63872429e927b +bff5b1ba67c5f191 +bff6e90c11858d0e +3ff735c0437b31f3 +3ff78b144a355aa3 +3ff39bba7ab36fe5 +3ff75261f7e0e238 +3ff3f413afd529cb +3ff740d579d0fde0 +bff7bc9b80702b23 +bff62087d19c7e65 +3ff6a7137248a9e5 +bff5eaed81cfb81c +bff7a1ab46551cd0 +bff7a3a7488c6404 +bff70a5911f7999d +bff732adf529cb9f +bfe0008dfa71d554 +3ff6fcd4106f35ee +3ff6ead6502fe752 +bff71899f539077a +3ff7c974ef9501df +3ff5c07412641d36 +bff6aef38c08911d +bff760d05575b738 +3ff7a5be8d4195fe +bff7084f9a01c428 +3ff77edeab7f84de +bfefc96732c6615f +bff771d1ddbf9025 +bff3d9fbdf16d8fc +bff2244b6f975ea6 +bff38ceb5be82bc2 +3ff58a784346fe42 +3ff7722f78531d57 +bff7b85f4f77e513 +3ff6f7b5f6b3cf68 +bff62d4fbceaa693 +3ff002c57e776452 +3ff79820085e596a +3ff79d24dc42537d +bff6ffaac3107db5 +3feac2ef17f53134 +bff2d0284140fdcf +3ff79c496816abe5 +bff6414d4b2b7cd4 +3ff74cfa0eadc2d7 +bff7c110e7eacc55 +3fe9837fffb5b9c7 +3ff79cec95ef5570 +bff1a9acc4527028 +bff73360116a1df4 +3ff6590853d3897d +3ff644849cd2826a +bff28394dbab4308 +3ff68790f9628218 +3ff7cbd630a27e58 +bff7951f0f08163d +bff66d85eaed71e2 +bff65c17f451e04e +3ff517cdd9420900 +bff7147d768f71ed +bff52c4dbcd27489 +bff7b6cf103eb02f +bff5c9795670c9b2 +bff7aea6d2664c76 +3ff630f8a50b7a24 +3ff4eb5beb5a5e32 +3ff763b231557451 +bff7c7a9a74b9108 +3ff39d6aad4437e4 +3ff40b5f42d2053a +bff7d52aca0cb31f +3ff7a74ee010c8da +3feca7fc0e87570c +3ff3fbf56c9bd9ca +3ff396c86996868d +bff7b63825910c77 +bff3aaaef5597170 +3ff6fbbfafb71443 +3ff69e440a938d1f +bff6c109ae1bc335 +3ff75ef7d060bc81 +3ff757eddbd95956 +bff6c417dd997567 +3ff781b9217fd03b +3ff707b059720264 +3ff79de33277e235 +3ff686a64b0d2982 +bff26276eb11836e +bff70fb517c5fc48 +3ff6892e76efb329 +bfb00e9d8d43c153 +3ff6f8c3630a2c68 +bff475367ca70935 +3ff71b1981d33f13 +bff52bef30b7d894 +3ff7d294b2393380 +bff73f9fe088895a +bff671074b275a06 +bff67f032267d4ee +bff7bf0f3a76c8d3 +3ff56883efeafcf5 +3ff341fde4935a32 +bff7a038283bb02b +3ff6e60d655a9345 +bff76d929f7ceb10 +3ff53790cc0d6451 +3ff5b322b99b8388 +bff53e25e5f69f76 +bff7c9a27e3174b8 +bff471f55c7d754e +bff216507b2e1108 +3ff55b075e1c6d8e +3ff77f26d7698ede +bfec14a0aff71ada +bfeac4aa56b85067 +3ff7184179070132 +bff688623f0ab8c7 +bff672b28ebfc560 +3ff7728f52c71fc3 +3fdbe58286b6422d +3fe7fb048b977a71 +3ff5b188a6a073ce +3ff6db6193880d79 +bfbd6db30d30cbf8 +3ff6490acd35c8f3 +bff78601df91a60d +bff4ba113fd5fc14 +3fe2c47afeca290b +3ff77fdbb0065e9c +bff4796be9998794 +bff7c46434d92a76 +bfe95cfce208c213 +bff63a36ef875f08 +3fed33553c07846f +3ff692c5df8fb98f +3ff7c59e69999328 +bff769d66c3e1ff2 +3fe9432372b25d07 +bff152a6d01f3a58 +3ff78f3210be49d1 +3ff791a475c5b04e +bff3ff56528b2a75 +bff748204aa81648 +bff7c234366b933a +3ff46d4409cc0af3 +bff1d0c72893f437 +3ff7d5022ad9bec2 +3ff7870b54511a37 +3ff7b1246ad27c2d +3fd589523b164e41 +bfefe62eee5de42f +bfe3ef9215d28358 +bff7c410e126b626 +3fe3275c2025188d +3ff6cb57b7733454 +3ff3bbfa567b4b24 +bff3372e138d571b +3ff690cb1a041422 +3ff68370dac5d282 +3ff7aa4d8aaf6ba5 +bff79996d7b803c4 +3ff73207d6b5134f +bff796a8240758ed +bff6e0f3376b1dcb +3ff64d0f999d69b5 +bff498b45591db03 +bff635f0c5f88c8f +bfe7c07e449d102f +3ff719766ba6822a +bff717381bba31e7 +bff76af8f8b38a8e +3ff69283528e25e3 +3ff7725bcb0d3401 +bff787ead6f0ace0 +3ff50a82060a561b +bfe32dba24b49548 +3ff7dbb28ae59fa1 +3ff6b9df4e55cc78 +bff532cda0d421cd +3ff45be9dc42c17f +3ff683cf04caa2fc +bff7636a265e918c +bff6eb4ed1621740 +bff7cb17e53b72ee +bff783d8ca641a2d +bff7b9593d1d9dee +bff4fe6d8ea5c6bc +3ff6a8cc4ff96945 +bff755868142b186 +bff7d4b0835e57d1 +3fe571667cfc65d6 +bfefdb1a981dd38b +bff7bd5e95efbebb +3ff6d953f0ebf706 +bff447758dee4f9e +bff73d629dc2d38a +bff7b677dff3dbdd +3ff6cd94ac7db90a +3ff73ab60b92f5ee +bff0c890b447e87a +bfefc07cb9b0dbca +3ff75b1ce71dfec5 +bff4f5d5a6efd889 +3ff6e6cff67d20a3 +3ff52439a63fb32f +3ff510342c404f58 +3ff79b3ba8e1792c +bff53dcf745e2b24 +bff4bf733e23838a +bff7d46962ec3600 +bff671b5228d25f8 +3ff70f63572ae3d7 +bfd3410c0d9d964c +bff7918f85c80bac +bff7aa06b7a1ca85 +bff75133149c7932 +3ff2b43a5365fe01 +3ff77eb5c7231350 +bff43bda30543dfe +3ff41682a60ba7e1 +3ff6a6fdecaaac38 +3ff7c2fe763c732a +3ff7593a1663eed4 +bff5032bb1563496 +3ff7b62bb378d9f6 +3ff5ff388fb10976 +bff5747a44e13192 +bff283dbf3511188 +bfdc760ee2dd3b93 +bff6e721cc7d0c5f +3ff776aa39bcceb2 +3ff74682614ed7bb +bff7355ee58bba10 +3ff6c150745a3f35 +bff284d2a833c492 +3ff6bc2e31a885c8 +bff6d4b1bac3ed5a +bff197e3736121c4 +3ff74dda9a1da4d5 +bfe93cff62f2b02d +bfe2e1360ad16988 +bfeef61dc98b82c7 +bff5a1fe1ee4251d +bff7d7631d8490d2 +bff26424182d320b +3ff7448ca861e292 +3fea98d27b9ceefe +3ff6fde9a89dbae0 +3ff691ff8ddfd451 +bff576a00666a475 +bff5a9a89c4c5ef9 +bff7b53f0373f39b +3feecf5eed8b9883 +bff7dc39f84b9277 +3ff1e43b51e404ac +bff48490bbe35fc4 +3ff7a73a247724db +3ff6db431e237f6c +3ff2b241cfd01b4e +3ff7b2c6abcffda5 +3ff7b04f26bc9256 +3ff7cbb747506e34 +3ff7d6202e976132 +bff439e962af51df +bff73a1ae9f1c9b2 +bff7cadd33741d38 +bff74b15b0150e43 +bfee8de2b227cee1 +bfe1ea4a203d6abf +3ff6d1037080833c +bff7d325907f2825 +3feff5a5159dcc35 +3ff59d77d55a69ce +3fe8325ac4c9587a +3ff5ffe4f8b814b7 +bff4fe4b4743649a +3ff759857d79fef2 +3ff09f3b47773a23 +3ff6446c43049a85 +3ff7915d71461271 +bfe1064805c0a485 +bff518c6300cd457 +bff741bbce47cd95 +bff56c67641ee172 +bff6d714a20c9e8b +3ff5b3d27d4c535a +bff6b1a5b9e5080c +bff737a1e0e1e280 +bff3dfb5caba032e +bfdd5a70835d18ae +3ff7aa96a3c016c8 +bfbf61f3a85f6133 +3ff7a2f9c9cf0bd0 +3fe7321314ceb381 +3ff6e05b4e435e75 +3fef18eb511ac4cc +3ff7c2ebd0341b2b +3ff6f0db15383daa +3ff7cc7bdf3dd312 +bff7d4ac9d31fa82 +bff783bab4c7d66c +3ff7cbf7499a5791 +3ff5ff497ed5064a +3ff7d1d3fc3d8d77 +bff5cf170d9e5115 +3ff6396d5dea9c57 +bff5ff5203a74e24 +bfeaf7dae99214c1 +bff6b4cd189a62fc +3ff635541ad86bb4 +bff5d4ce40e4a6dc +3ff5d1368a1224a9 +3ff74c8432803a17 +3ff76a2ed9ba805c +3fd5c31d73d7e5d0 +3ff63f27a110b618 +3ff6de73259ca7d6 +3ff6ed85b0ff5cf7 +bff71a196623c5c4 +bff6a8487e0ae53f +3fd6bd5e05df40a3 +bff218dd7decfbf4 +bfecc3c1237f3124 +3ff4e10b76c7676c +3ff1c4e5b95bd4a4 +bff6dbbc4064ca2f +bff753d7b1afa4d8 +bff742fc7536c851 +bff79d50e5fb93b7 +3ff50e205e002813 +bff7b5c19313d7e6 +3ff6b3c365c2a1a2 +3ff6ee0b4046d5b7 +bff363a3f8b6553b +bff71a7426fa3750 +3ff457d9d716ecdf +bff349ead8576686 +bff6006b94c1acf1 +bff7c2588ee20e62 +3ff5f8f5b973225d +bff665bc5da71096 +3ff6321e8b607a0b +bff7d21248169dd0 +bff765110daa509d +3ff7143a5ad8552e +bff5757fba8dd278 +bff7d93a61c16b5f +bff6783a445dbeee +3ff77149e0e258a0 +3ff42d34047cfd31 +bff7cfad799d9c6e +3ff7c3c5dbf2c852 +bff7564085317d14 +bff1aad376f6229b +bff7cb97155f73f6 +bff71f97220ee881 +bff7c0bb19476d18 +bff7a4e621165bc5 +3ff6a0e76fe0bf93 +3ff73b82c7526b86 +3ff7934ea21f5977 +bff593ff679e8b1c +3ff770e077a27bff +bff7d979e1803727 +3fe791317056b35c +3ff7a56646e3312d +bff5f60861cf047e +bff7379b93dd3e62 +3ff0e593dcae4662 +3ff65e25b09162d2 +bff0d84e12cedec8 +3ff5c88a63ad5549 +bff30ffab2b2b9b4 +3ff7d6ff128f7963 +bff76a8e2c9994bb +3ff6db363c6b7db2 +bff6fac0602534ce +bff04b48966f828c +3ff79dec0c5c6f61 +3ff74dc600df26a1 +bff5af9cde65327a +3ff339d26b649c8c +bff6bd991f2a0784 +3ff798c16e9743ae +3ff6db4026ba2628 +3ff796382321b9ec +bff7d38437d85183 +3ff646acee8d37b9 +bff7d6ff96da7f5a +3ff7c639b719361b +3ff66b75a389d7a9 +3ff7db6ff3ae1e53 +3ff7067742ef1ecd +3fde86f26f7de87e +3ff7d5b5957b9f42 +bff674f53fa50cf9 +bff3b2b7eeb8f95e +3ff5ea2d983b2e74 +bff707d7d230208c +bf901e31494db7ad +bff669858d88a367 +bff7c39a7e7e0679 +bff284de406728d1 +3ff7daccaba45c02 +3febf8a38780163a +bff6e25fd5284754 +bff395575128541e +3ff633467a25c380 +bff7d59d21c97afb +bff6fd724dd2f06f +bff7a5309177aa25 +bfe0260e59119755 +3ff747e223a6c765 +bff7c0256ad306c3 +bff745490ec11d44 +bfe407b8d96d75a2 +3ff77bdee404ce55 +bfe5e881c63f8ade +bff71273a3e3e75d +3fea4709ae9e350d +3ff340a76dfc856e +3ff7da70e1de8269 +3ff5ea9b675ebdd0 +3ff7d863c224d62d +bfe6821502f54ee3 +bff769172cf60b78 +bff7cff3335a0c35 +3ff598ecdf0449ea +bff63bfacd18a8e6 +3ff7cf207f23c5bb +bff2a31e1f34fd43 +bfef4c89978cb458 +bff7527540ae3a88 +3ff0aec896a73a50 +bff3523cc429d46e +bff746798f2e6d5e +bff7b88bf139f872 +3ff720dbb48a814f +bff7a2ad35eff177 +3ff76e81591f0cf0 +3ff722216db450ee +bff69ef64954bbf2 +3ff7bf03f0f50a73 +3ff74ae83e6660f1 +bff76692271ac39e +bff6cc3ac5677946 +bff78d8c05643a44 +3ff4b87eee8cb4f2 +bfdcb34b7791c379 +3ff5d64f39196e7b +3ff7bdb0456c0269 +3ff66a9d971bb118 +bff0098a4272f98c +bff791765188e377 +3ff7ae49fa174a56 +bfe7579e93a72133 +3ff14a33ead2e1ac +3ff42ad01ad6d51a +3ff79b59f341f9d9 +3ff59adf1ae79938 +bff6db7ee9b92c31 +bff25b9e3e80d833 +bff778f9120252dc +3ff5efa7832697e8 +3ff6e4f9b0f59714 +3ff7b9026eba1ee0 +3ff3ee62596d24f3 +3ff7849fa50254fe +3ff7788d98c39ed3 +3ff5fea9bfbda276 +bff4666fe3d11eb2 +3fe22fd2b876d76f +3ff2228b7ca20c69 +bff5ef82a0f327d2 +bff77b499ce6e011 +bff783d107217c4c +bff785548be744cc +3ff69699a7040613 +3ff6b435f0f20dfb +bff770981bd98d9a +3ff79f6a8d2f94d4 +bff62c97c0669d35 +3ff6b99b7e9528ea +3fde231d2b71a892 +3ff7c0a79b7a6069 +3ff797c58299d8ec +3ff7a233c3f42aa7 +bff7da04e150751e +3ff43e622710844d +3ff5f8e740a64c05 +bfe383dc200008da +3ff79cb7eecec1f4 +3ff54d6b40b3e6e1 +bff289038f049694 +3ff64d8e4e131b00 +bff7b5a8f7dfd089 +3ff0fb1eca2f27ce +bff5d9907484f998 +3ff5cbc0ef21f451 +3ff2c84895c0a3a4 +bff77f848113b8e1 +bff62a932659b24e +3ff7b9ec1343d0a8 +bff7b212dd171d1b +3ff495925f24551b +bff7d43af95251bf +3ff6da29cea02089 +3ff7bb5516ed5e76 +bff167f4246d95f2 +bff7ca7e67eb9dac +3ff79e0201a53b0f +3ff53e1f4b9f9fad +3ff7bc0acd8472d1 +bff1b790d6ae5c5d +3ff735b3e2c68fce +3ff78c34d2ca339f +bff7c0698da153ec +3ff7b3ca78b81dcc +bff7d2e410ae65a6 +bff7bc7b50bf7495 +bff7a69ed720863c +bff706dc07af11c2 +bff7a10b981651cb +bfefae2f51887252 +bff73615b0e837fe +3ff766ce33d6b9df +3ff3606650e32766 +3ff744af0de993a8 +3ff7aff20acfdf82 +3ff68295b21f5dd2 +bff1ec33c5d2037c +bff7a76a9ee9a32a +3ff3fc40eff56b36 +3ff68dd4187e7827 +3ff75b841de26ab6 +3ff7d3a6946744d2 +3ff784a383537dd9 +3ff7bfeae847b495 +3ff68c998554d5b2 +3ff77dd077230e70 +bff64eb4ceb69faf +bff7466ea14597c3 +bff5792f45f0d7ea +3ff285c9ae429a3b +bff7c3d218845d23 +bff5f9171240b149 +bff79d288c41c282 +bfd3b779564abbb7 +3ff7102d6bf8060e +3ff78ea243edec30 +bfee042dde41e360 +bff7db6606471167 +3ff5a51e29179ba2 +bff66814a58e07f9 +3ff664bd6412fc3c +bff78c6417785481 +bff5bd9089db31fe +bff7932a49eb0d45 +bff7218922545e93 +3ff43358c2af34be +3ff6b19bd2dccaf8 +bff7c61d09715ace +3ff784e1c4a8f423 +3fe02be57eb8db24 +bff7b637b1ce15bb +bfd31fcbe4821418 +3ff18a2f72857662 +bff6dddb29a4e47c +bff43b9a39753d4b +3ff7b6769710e633 +3fe15b1bca5795ad +3ff6e437eeff5e0e +bff2c87b80d0a31e +3ff7c537489c3e64 +3ff782dad1c62492 +3ff5ff99d284aad1 +3ff772c441cbc5ce +bff7c4921b830334 +bff50b06bb1f5bca +3ff45465a2a42174 +3ff6651608a0e46c +bff50fa1a0747179 +3fed653c59472c82 +3ff5444edb7c2a42 +bff74be32cf81a99 +3ff6aa4373bcf674 +bff61ba822470e86 +bff6b372709457f5 +3ff72ed1087a876a +bff7dc848d4b3639 +bff70fad18c691a3 +bff72c6713ed5913 +bff7c61f3f7ca85c +3ff4726a1694edd1 +3ff6fc5be6595a07 +3ff6e328b7e02ef3 +bff7bd08a595815e +3ff7acd4046c3b38 +bff255ff87fba2f2 +3ff229759dfcdfd6 +3ff7ae7e8fa4a56d +3fe7234e4f5fcd6f +3ff62be500bbc04a +3ff5ad3572994dae +bff44a1e12ed3029 +bff5cf0e0c9fd86a +bff7ab1b96e3e9cf +bff61bf200cb2be1 +bff69661f21e855d +3ff633782b5db713 +3ff70abaa5536544 +3ff6bca000fecb9a +3ff7c6e08e3e6631 +3fee815d85d8e206 +bff6a0766a23de46 +3ff72f5ac771c00f +bff7d8a54ee70b26 +3ff76fe4ac62099a +bff7dbe5dd736c57 +3ff3b9f46637304b +3ff7d0a79eb5782f +3fea6cf840107b29 +bff6b7ba5441599b +3ff555139ef55c72 +3ff72b48ced417d4 +3ff76553e8ea5b29 +3ff7c73104500fb2 +3ff70413cb1f0ec1 +3ff57070893532a1 +3fce2bd399ac45e5 +bff7a69a8f53f617 +3ff1f3882a9e1e62 +bff65c075299e66a +3ff723576df0de72 +3ff456dae3de7a40 +3ff743fd6f83062c +bff79302da1516f8 +3ff5432ee1a8ad25 +3fe9e4f0021213d4 +3fd6be0d784d27e4 +bff7b334d19dc6e2 +3ff6c6668ec89945 +3ff56de9867f71b8 +bff7c3e7416de1ff +3ff7b4498036f9ff +3ff52351b6fee6f8 +3ff6a5638501f574 +bff703cdbc799fd3 +3ff559775cbb478e +bff784b17dd37386 +bff6cd12c2bb0da8 +3fed710a1aeeb022 +bff6581b750c8bc2 +bff2c8523e06baae +3ff0aada8df4fd4b +bff77e9a0233a76b +bff0a04167bd7eef +bff29bc00a404ce8 +bff69e01ba4af40e +bff43201a3324793 +bff74609c878a776 +3ff77c25a8f8f372 +3fe507d82fad217c +bff26c5805d27375 +bff758e79a8e7f34 +bfea55c0604e6213 +bff708d26322a128 +bff7cc4abddf219d +3ff32ff8f2339d7a +3ff78d679aca6dab +bff758f610885cd0 +3ff7b4b68c5db551 +3ff39fdcb847b449 +3fec9ddce643ae63 +bff745e1c9c5faca +bff75223172b8e2d +bff719a1d779a93b +3ff7da5a0b78f3b0 +3ff13b9931f2f638 +3feb0ac4c73e6268 +3ff756f70e2b682a +bff47b419a4c3e5a +bfd253b6afeb454f +bff34a2041c2160a +bff61a752067c0c1 +3ff7af63c9bf9fa9 +bff76da58cace8b9 +bff7853f6720435d +3ff740d42e862e21 +bff7d93746d4181f +3fe343383cdf7460 +bff75426d9123ada +3ff76406d8b21589 +bfca35fdad58ffac +bff76b5ded0ff69d +bff6c97596892d3e +3ff77edd1d94e694 +3ff7c60951d0a0b2 +bff798a0dc19268e +bff7adcb1792b483 +bff79ae2f13fc628 +bff323ba743ff5db +bff7d6523b780592 +bff22ea1b58df419 +bff6e9b4b940fb89 +bff71c88735eca1c +3ff58edaf296e55b +bfd440f2e55e9892 +bff17a846b153a3a +3ff6d61a3551d416 +3ff64fbf75df110d +bff7b7c7e6b7e542 +bff701d5733245bc +bff2fb8bd5f631e0 +3ff5e441635249e0 +bff743dac3de14a0 +3ff77929691e6188 +bff4e63ce1881206 +3ff74b43db68c10d +3ff68ba5f233bcec +bff48fb5e49a887c +bfef3b32b2699678 +bff7a315e2933c0e +3ff736c2cbdf9f63 +bfe792e4aa8d21b1 +bff671ab023274a7 +3ff7a6bb361627d3 +3ff5aecc623d04b8 +bff75828b5184a8d +bff6aa20443ea193 +bff79acc87fa887d +3ff4c838cc5f9fd9 +bff7572bc09d7e0e +bff5bea45b071abc +3ff7d6b0b53a7297 +bff796ee440996db +3ff7bda3d84b23ab +3ff58b89cdd2f60e +bff696f50ba7c39a +bfe95cf19aa461aa +3ff78d48538a7cf0 +3ff79b7ff9212035 +bff6faa2137a42c3 +3ff7da3c5db6541d +bff777ebecc8d6cc +bfec669971666d06 +3ff570c0db989d3c +bfe7bb08ce0e5b35 +3fe9f215cabec3bf +bff74d4592530835 +bff73a4e0d6eaf18 +3ff746c28d11ad68 +3ff434b200ddd5ff +3ff6ae7724602803 +bff77a554e44ac0d +3ff5ced898e11247 +bff0ca755c084614 +3ff4f17ce71ccebb +bff5dfd7171288e1 +3ff4f65af5d8f3a8 +3ff769bb9756657f +3ff921fb5443c18e +3f0aa01583fecfd6 +bd46f5abac02c6ca +3ff921fb544426cb +3fdcf4a14ab60ccc +be68921996c2472d +3ff921fb54442d18 +3f42e54fcc6fdf74 +3ff921fb54414698 +bff70f7944dfb94d +3ff921fb54442d18 +3d30a80edab4359e +be2cb45d7e4adb11 +3dc2726d98996184 +bfa3f423478ac20d +bd2e880c6444547c +bff921fb54442d18 +3d5ed67c594a3950 +3ff921fb54442d10 +bc4006968c4ec4bc +bf3a0fdf734189e3 +3d928b8c463f0cb2 +3e9ef6b8130b56e2 +bff921f6ecc60719 +bff921fb53d90eed +bff921fb54442d16 +3ff915348e98bfd9 +bff921fb54438725 +bff876029ee0e317 +bd93172b2fffd4da +3ff82faa00c32794 +3ff921fb53bee4ac +bff8386db8f5507c +3ff921fb54442d02 +be9eb2b772d8d3fb +bd84c841cc53cd97 +bff921fabf44fc69 +3ff921f9da71647b +3ff921fb5443b4f1 +bff921caa452dc15 +be903b962b9ad1ee +bff921fb54442d00 +bff921f98e4a01b1 +bd474da73d90f03b +3c404aa201d27d99 +bff921e718ba30c0 +be98dc178b01ca96 +3eacb3053dde9f0f +3e36754b06a6b82c +bff921fb5444198c +3ff73e6529b11d44 +bff921fb54442d18 +bff921fb54442d15 +3ff921f383208260 +bff920da92b1d353 +3ff921fabc540ce2 +bff921fb54442d18 +be446a3dc009835c +bce7dc6ccb905274 +3ff854a6106268a1 +bdca5f0f845de301 +bff3a495a78bd9ae +3caeee5ebbd13c3b +bdd3bd71c170fbee +bfa0d5c4e85c2897 +bd1697426c72a62e +bff91fe4eec257bf +3e2070ce1f93459d +bfc5357f634bd63e +3ff9216b8bc470b7 +3f4a6399a06da05a +bff921936c3fdaa5 +3ff921fb54442d18 +3ff90f39401fd020 +3de3f28192aba043 +3e47c2452e9c1ff5 +3f60a817e10a98ac +bff921bc8c59577e +be3806674b5dba44 +bda6f8506481a000 +bf0207c467193f5a +bff921fb54442d11 +bff921fb54442d00 +bff921fb543c9d1f +3ff921a5bf282e27 +bd30742f6892d66e +bff921ee3aa0a409 +3ff920e692070c10 +bff8fbb58e76537d +3ec341a3b63985b5 +3ff921fb5295ef4b +3ff921fb54442cf6 +3ff921fa250cbd96 +bff921fb54442d0f +3c4bc806d22ceb36 +bff921fb37ac9b6d +bff921fb54442d18 +bff91ebb10a27019 +3fa6244036b042dc +bc55824696f4d488 +3e216723a5120cfd +bfb7db78c81aca38 +3eddc3b19d268af4 +3ff921fb544426e9 +bf6d14305107ed1b +bfb951f786bb167d +be1bbe08660ab40a +bf229b6ac004f41b +3ff921e6b6901721 +bff921fb54442bcb +bff905b687e1ae25 +3d5e5268abd3ac3e +3c5a944b565c4790 +bff921bd74a528f5 +3ff2d78afd200365 +bff921fb54442abd +bd0daa213668a36f +bed74e7ca2ce4c0e +bff921f6d590e52b +3ff921fb542c693b +3ff921fb54442c90 +3ff921fb54442d18 +bdf99d08e70a89d9 +bff921faa06c216f +bfb912041ad135fb +3ff921e5fa0ccece +bff921e59ec966d0 +3ff921fb54442d18 +beb1e1de9345c1e6 +3ff917b0e3e5c1e4 +3ff91fc01bec021d +bcaee88883526e33 +bd5741caa1e75ad0 +3fcad5b395f94a57 +bfe0656e84d7b54d +3ff91efde04dde3d +3ff5497f9577fd3e +bff921fb54442d0a +be512df884f02fb9 +3d3d013b57f98829 +3ff921bfd3fb2077 +bff921fb54442d18 +3ff921fb54442d18 +3ff921fa3f4a0c20 +bff921f89ef830ca +3dc0ac225af14690 +3ff921fb54442d18 +3ff8fa9d6ba5b51d +3ff921fb54442ca4 +3ec82d20c7986a7d +3d410e66b917ab77 +3ff921f974a189c3 +3ff921fb54442d14 +3ff921fb23ae94cb +3ca5bf9310a3d1de +be45e2639571728e +bced8dc9dac70ad5 +bff9110d156782bc +3ff921fb54442d07 +3ff921fb542acc06 +3f301f1e6888dd9b +bff921fb53f409c4 +bedaccf7a6ecd286 +bf2514a678e4716a +bff921fb54442cdb +bedc21dc4b08795d +3ff921fb54442b82 +bff921fb54441c3d +bff921fb54442d18 +3ff921faf0ed55e2 +3ff921fa16ec147a +bff921fb543d2a70 +3cca57b9dbb26e34 +bff9218d3134a044 +bf4b65035ffd06c4 +bd868ce7d542adb2 +3f42cba95028945a +bff921fb3d85eebd +bff920acc4f6f483 +bce37f62908ed736 +bff920ffba661b61 +3f4c75556be5fda2 +be64f15b55100834 +3ff921fb5326091e +bff921fb2f078569 +bff921fb54442d0e +bff921fb53f85e16 +bed0c0ada36ea1cb +3ff84f6378287104 +3fdb028bcd3a97d2 +3f86f5fdee93d516 +bff921fb4b0c8c2d +3e124a09def26382 +3ff921fb54442a88 +bff921f7f14ac9f8 +3ff921fb5437a031 +bdb3a1cd4745c7f6 +bf413a79d860a86b +bff921fb54442d18 +3ff921fb5443f311 +bff921fa2f17392d +3e65f7aa0e1f5109 +bc3c0c998aa0755b +3fd754194cccf3a4 +3e30fc56202f458c +3ff921f288401715 +bff921c009063a71 +bff921c60e12d7c9 +bff921fb54441e7a +bef7c7bf83493341 +3ff921ecbd44ce78 +bcf1dd15f5c9b6b8 +bceac4e44d44b20d +3e4d77bbddd6df8c +3faa785499774151 +bfc4d65f3acc6255 +bff91d5878db9f4d +3ff921fb544423b8 +3ff921fb541f9875 +3ff921f8d82b1519 +3ff921fb535357ce +bf9a8d80cf546f7c +3ff921fb54442d17 +bd25c17fdeea5282 +3ed5ba1d3e8514da +bff921fb54442d18 +beda9d8a095780a0 +bdee83ef420b57bd +3ff4f6c34cf77f12 +bff921dfc954ba6b +bff921fb5442f5e9 +3ff9218009c4103d +3fb0ceef49c904bd +3fa245db7109b542 +3ff921fb223188f3 +3ff921fb53bd36af +beecfa5cfd5f6e01 +bff921ef36e154c2 +3ff92162814264d4 +3ff921fb543d246a +3ff921fb5443e524 +bff921f10229ffc7 +bf0339a98f2c7dcc +bc51a152ff105149 +3c7c24b19fd8439a +3ff921fb54442d18 +3ea374c62f3e2291 +3f28d4ccc3fca90b +bea00cbb179e3e00 +3ff913af3cc047c2 +bca0e5c7a8787572 +3ff921fb5434acb7 +3ea353ccefe678e0 +3ff921fb544237ac +3f899bf1e6159e66 +3cf17a55acff5234 +bff921f97fc9e84c +3ff921fb4a90dc93 +bff921fb54442d18 +3e2e03ae4940977d +bd56bd20eff7502c +3e0a41f1576f1708 +bff919c3429afafa +3e420b909f16deae +bff921fb43f71c17 +3ff911c87ade7abc +3ff921fb54442d13 +bd453da2ab4f9e28 +3ff921fb54442d17 +3ef441d9a990924d +be5fe9d2e186a1c4 +bd885b7b2ae856a0 +be02156fb471d54c +3ff921ef8e374631 +3ff921fb54442c5c +3ff921fb54442ceb +bd22356ef88a7b24 +bff921fb54442d18 +3d442aea1583ca2f +be2be83edd37c3f4 +bcc6a42f51e892ea +bff921fb5440b02f +bc98c2b9f51e8064 +bc300a0407057749 +3d303c512fd5124f +3dc95ae1c69e345c +3f81f7db3b9d7d44 +3ff921fb54442ccf +3da26f496aebb94d +3dd1e680aa7b310b +bd183c2a1f214f52 +bce17f0bd0ba8eb7 +bff921fb5443a1dc +be97f181cf3a1a43 +3ff921fb54442d10 +bd5218a0d73d34b8 +be2af07c0ce91605 +bff920e485d7c690 +3ff921fb54442cac +3ec29583dc7e4676 +3ff921fb5444254d +be89f7259b828214 +bd722debf45b9437 +bff921fb54442d14 +bff921fb54442cfa +bd787778cf1e0a7e +3db1133e199d30e0 +3c872b1a8ba6e01c +bd66f1aea38da07e +bc7baa9a625de882 +bff921f8d88897a6 +3e07c535cb9d2ae6 +bced81abff0a07f0 +3ff921fb52a79af5 +3e8463fa6ee888ce +3d18ab3959532c7d +bff921fb54442d18 +3ff8e22adfa16c97 +3ff921c8c3334f14 +bc62c630983e8e20 +3ff9216e7abcf461 +bff921fb54442d17 +bff921fb5444062c +bff921e19c4b14cf +bff921ca1b78de3f +3ff921fb54287899 +bff921fb2f24c90e +3ff921f9cf2a6208 +3d98fe6318d3b85e +bff921fb54442d18 +bf887e0c01a697da +3f515448db3742c0 +3e71bbb749b856de +3fe1746181ecf502 +bff921fb5441d3a9 +3ff921fb54442d12 +3c608232fa84595f +bf81329ff126ce32 +bff921fb48ccc0aa +3db85b0be58f798c +bff8d3cf4bc2b76c +3ef72baedf689ad9 +bcf77981e7e4851c +beaed822afb339a3 +3fefd3ff6d3c07c8 +3ff921fb543cf523 +bff9218a4d4fedfa +bea8290116adcca3 +bcf949688e2ae2e0 +3ff91c170281c932 +bed502c25e24992b +3ff921fb4e0e3288 +bdbe26047ef851ef +bcbc4be72834a53d +3c306ff20e372640 +3ff913e719d4e9dc +3f87a75f5dc21918 +3effcef3d97c2349 +bff921fb506f747f +be119d00e3168a24 +3c378341eb020688 +bff921fb45704032 +3ff921fb54442d18 +3e88027be6866880 +3edf0dd7e41d5cd6 +bd974a3abaa91d25 +bfe8a183b0c485ae +bd6d6567e91339ba +3dd533aa9c400052 +bcbc649c71445fd5 +3ff921a3287f66b7 +bf648fdb10bb2571 +3ff921faae5cdbae +bf4981de81b30fd5 +bff921fb54442cf6 +bff921bc590a5c18 +3ff921f7980fd2db +3dec0f051905243f +3ff921fb5443f936 +bff921fb54442d18 +3ee9b8386f76cab5 +bfc73d1268351558 +bd0af760051fd8e2 +3ff921fb541f4ea6 +3ff921fb54442d18 +bd2a742e1ed617c2 +bff921fb544045b4 +3d2e67b10ca60a8f +3ff921fb54349058 +3f370926a8c6ef06 +3ff921fb526e73c0 +3ff921fb54442cd2 +bfc5f02d4121acf1 +bff921fb53d2db80 +bfef08a83a28b364 +bff921fb5440cff3 +bfc225a14ad3005e +bc30b1f4c589066e +3ff921fb54442d14 +bf90f3c2d4d5a638 +3ff921fb54442d15 +bff921fb54442d18 +3ff921f641c728d3 +3fedb2eaae072075 +bff921fb5256c03e +bff921fb54442d18 +3ed3183c77504978 +3ff921fb54442d03 +bff91ee066ac8cac +bff921fb54363ff6 +bcc3c76748436e17 +3ff921fb47ae4181 +3ff743375337bc5a +3f2d3a3ef8d466e7 +bf1d9762d4e587bc +bff921fb54442c01 +bff921fb54442d18 +bff921fb54442d13 +bff921f8c606d93a +bff921fb54442d18 +3ff921fb542d93c1 +bc64e5970e7ffeab +3e6b9349f78d4287 +3ff921c421bcd2c7 +bd97b1679e3200c1 +bf76694d06d8a4e8 +bf6ff350cfb2a09e +bee922f990aed167 +bff921ee5968a77b +bff921fb5442d8e2 +bff921fa0e1266c8 +3ff921fb54442d18 +3db358bc057e451f +3e9885ab6787c748 +3c85e1a79c42eaed +3dc43d96e495ac7b +bf4d7465aa29d0e0 +3ff921fb54442d18 +bd806a2727545dc7 +bd066724a1852da5 +3d18b7f16cce956a +bca5f3e6e9532ace +bff921fb54428eae +3ff921fb54442d18 +3f062d91084b2424 +3ff921dfb5984328 +3ff921a5ec326290 +bff90ee60c620b18 +bff921fb5444290f +3ff921ef722990b7 +3ff921fb543477df +bff8c0037eda3ea1 +bc90b6e647100129 +bef6a2bb6fb181fb +3d4e3777af94e866 +bff921fb5441eed0 +bf80bc77aa3d895a +bd0b4f15e2cc6ccf +3de340470fc35e37 +3ff921fb544420c6 +3fa9712091fef455 +bff921fb54442d18 +3ff921fb54442cb5 +3f36935892eaf207 +3e4c406deab38ea2 +bff921fb54421f85 +bff86adbbd73a734 +3ff921fb54442d18 +bce65b7b79907322 +bff91f34d27d57c9 +3ff921fb54442d17 +bd10953f58b62c83 +3ff921fb54442d18 +3ce65a6125bf7717 +bff921fb54442d18 +3faa5ae9b2669db6 +3f43997dd42bfb85 +bff921fb54442cf0 +bff91f85fed58138 +bed2b0f8cae17095 +3ff921fb5444063d +3ff9187e8601410c +3ff921fb54442d18 +3cde030ad6073e3e +bff91d17d30d18eb +3fe00714b773351b +3e65bdaec1bc3ef5 +be01626c658fa1b4 +bc9b88fe72c87e9e +3c75e24eca177dce +3ff91f35de712be5 +3ff921fb54177f14 +bff921fb54442d11 +bff921fb53c85e24 +3ff921fb54442d18 +bcf5bb8a1014aa22 +bdd469735fc7de43 +3fdcf02d0c0c712a +bff921fb54234453 +3fa1929a48f77c12 +3ff921fb54436227 +bc87de0a7404ba66 +3e2c1e4ce62a835c +be40f67eb12c77a4 +bff91f6fa7ad1807 +bff921f08f11f8de +be8f1aa11218f0aa +bff91a4c8821a28f +3ff921fb5443a6ed +be10d46a07d6a4ac +3ff921fb54442d18 +bff8f4937d6e6d71 +bf4cafb05dcdb088 +3ff921fb53d1aeda +bff921fb54442cda +bff921f4a9607e2e +3da089cd2e291307 +3ff921fb54442c5a +bff920d3cf0f9026 +3d6aabc54364669f +bfb54e4c53982d14 +3e43d1e0b4b28026 +3c6994d1cd25f6ae +bf9666f2833f0e1c +3ff921fb54442d18 +bf421b57bf1b115e +bff921fb54442d18 +3fce352fb2c180d3 +bef12f26f2668902 +3d474c06c04945bc +3ff9213a7bf7a88c +3f78521ca7a8fc76 +3ff921fb4b56592e +3ff91f6896f6740d +3d510fa830cbc3b0 +bf2da994c11e6c81 +bff921fb54442c17 +bf3164bad9915cca +3ff921fb53677eed +bff921fb53f21a87 +3dfe9de8603b9661 +3d32f398ff4c7761 +3c5b59e3abaf6248 +3f1988cf8cced454 +bff921fb54442d16 +3d6e28661e0d02c9 +3c83c35a6b8a6097 +3ff921f3fb55ef6d +3ea2bed6120b0c50 +3ff921fb54442bc5 +3d9ca6a26c28ed83 +3c3043b1e1a274af +bff921fb4ebe960b +bc6300a891a347d9 +3ff8fe151c0aa84d +3cf1d6c19c330fca +3ff921fb544391ea +bc3fbeb15d8afbd1 +3ff921ae4f1c97be +3ff90bbd77f8af8a +3c697f9a87ab53d7 +3f31ff01ecd7e5dc +3c63c9bcf00f54aa +bff921fb51747eb3 +bfb4d082faa9ae9c +3e71ba1e0f513bca +bff921fb54442b61 +bff213dcf6664a34 +3ff921fb53e83203 +3ef5ca6d96d132d0 +bff8fab081262def +3de1094b2be353b3 +3ff921fb54442d18 +bff921fb54442d18 +bff921fb54442d11 +3ff921fb53665481 +3ff921fb53abe301 +3d595640a7cda242 +bff921fb52245dc9 +bc39bd35f153e736 +bf4152b720267508 +3ff921faaf83154a +be439ce7980f0d1f +3ff921fb54442d18 +bff921fb5103cedb +3ff921fb54441066 +3ff921fb54442cf5 +3e14c0315b85ce64 +3e436f5726848400 +bff921fb54442d16 +bfec26f8d584e34c +3ff921fb54442cfe +3ff921fb544429d2 +bff921fb54442d18 +3ff921fb543f3433 +3ed04c688034786d +bc47f8a6786ae426 +3d0f07a714c325c2 +bff921fb54442d18 +bff921fb54442d17 +bff921fb25d1a1ea +3ff921fb5443dd57 +3d30467d80129ec8 +3dd4ab8a9a06040e +bff83dd54f907f6a +3ff921fb54442a77 +bff921fb5442a780 +3d013c5cce4c0dcd +bd35830ea9788f21 +3d72ed42213a699c +3ff921fb54441ed6 +3f078c62c94f1f18 +3f0925acfe1d5af5 +3e4a281db3db06ca +bff921fb544401d1 +bff3dc6f4f05713e +3fdbd9d8a983b306 +bddcfe2d21109310 +bff921fb543f5c73 +3f7ba307c00a4f8a +3fd95334c9b609f1 +bff7e0c538982aff +3c8b646443068ed4 +bf91ad7e6a5ba5ff +3f5be550cdc2e093 +3c48333991b4ef70 +bff91f894d5b0758 +3ff921fb53e57b9c +3dabccd844de1c41 +bff90a89872ed57a +bd9360a32135ff4e +3e050208c94af08e +3ff921fb54442151 +3fab916db79a3ad4 +be055b48c5c07261 +bff921fb54435c73 +bdda83f7e6ddc1f4 +3cb6fdb48168339a +3fb6949e279e637a +bed08e73f48f2d7f +3cc32966dbdd4d25 +3ff921fb497eecea +bff921fb54442b95 +bc6f666b78667b5d +bff921fb54442d01 +bff921fb54442cfa +3ff9210d00ef3770 +bff921fb4cfc8914 +bff9215c779c89f5 +3ee1bde7ce233eaa +bff921fb54442ca2 +be30639c596ad433 +bff921fb543ae854 +bd82bb168fc7bdee +bff921fb54442d18 +bff921fb54442d18 +bff92199e10f4685 +bfd839bee8ef30d1 +3e4289cfb4b80f2c +bde6b588a367bd5e +bff921fb54442d14 +bff921fb5410214c +bff921fb54442cd8 +3fed6f6f0922b885 +3e378f697cda5c46 +3f08a84d822397e9 +bff921fb54438c71 +bcd507ca9a2da830 +bff921fa90712eb0 +3f30f37b63fb9779 +be39dd06b0761f6c +bff2ee38746fa1c0 +bf93bc547a83b597 +3ff921fb541b2a87 +bff65edb21c5a77a +3ff921fb54442cff +3ff921fb042de0d1 +3ec76dc6c2b9de5e +bd526adbf8026791 +be1b7ca57e0bfe7a +bff91a7f0241474e +3ff921fb54442d18 +bff921f8baf7de02 +3ff84d7ce951711c +bc791a1660f13998 +bc4cfdae285bb2ba +3ff921fb54442d18 +3e82a556343c03de +3d100007c5174a6c +bff91b8b158e0018 +bea284e8a0289f24 +bf92efcd16d31da7 +3ccb5100e24fc771 +3d0b99b0b59b0a6d +bff921fb544406f0 +bef0e0862137382e +3ff921fb54442424 +3ff921fb54442d18 +3f30298b4e92436a +3d713130661d64e1 +3df0e5d6048bfb1d +be56b25ba162fcbb +bc79a0489a17c6be +bf95f501a797d1b9 +3e8cd4730478aeb4 +3e785ec5e6c0df13 +bff92141771bdabd +3df338d24fd35751 +bff8de908d67e228 +3c6be427cbc26cd6 +bcd3523fedcac9a6 +bf5791e28dd76fdf +3ff8e95d8218f498 +bec7092c444e2441 +bff921fb54442d17 +3ff921fb54442cda +3da0aee2b17ebd0a +bdc54cb81d2f70e0 +3f3a603442f3f8b3 +3d0383b8a9d9b67e +3ff921fb53e739a1 +bcc387c95f349ab8 +3f14e5f28e6bec20 +bdbf58ba78efb931 +3c93f9969c3e3ee7 +3eda94a13b51f21f +3ff91e10b839a39c +bff300c1fa0724bd +bd01969e05487910 +bff921fb53aa2f20 +3d2ecaa362931c30 +3eb3dbe4e8465983 +bff921fb54442d18 +bc527d3dcb259816 +3ff91a918b500e5f +3ff921f984210dd7 +3ff91c14a5d43741 +3f0efc27465c78b1 +bff454f81193451c +3fe4845ac737c027 +bff91cd1dc179275 +bff921fb543fe3aa +be57d81a483c91fd +3ff921fb54442d15 +bff921fb54442c93 +bff921f6ceee8e38 +3f77e73ce8bc1684 +bf860fd62eafb8ad +bcd5b0868bb86510 +bc41b264bcf198e7 +3ff921fb54442d18 +3ff921c81e40b2bb +3ff921fb54442d12 +3c6c1e5ee5dfbfbc +3dc70bc6a1d9bfb7 +3d4ae3f67e3666f8 +3ff921fb54442d18 +bd701590fdf8586d +3ff921fb5441fd0f +3ff921fb54442cd2 +bff921fb54442d06 +bd05a765c50b95b5 +be60a2224db861cd +bca2fc41c7fa586b +bff921fb54442aa6 +3ff83584d1d11a2e +3d1746ee5305dd88 +3ff921fb5380175e +7ff8000000000000 +3ff921fb54442d18 +bff921fb54442d18 +0000000000000000 +8000000000000000 +@exp 2218 607f2d8fa1ab934a +3ff0000000000000 +3ff0000000000000 +3fa620227b598efa +3fa683dc38301b79 +3fa6e957723c67d4 +3fa7509c1375806c +3fa7b9b2297dffb6 +3fa824a1e644d464 +3fa89173a0a8dc7d +3fa9002fd51f619e +3fa970df265d83d9 +3fa9e38a5e04a008 +3faa583a6d51bf2f +3faacef86dd01cc3 +3fab47cda20ed158 +3fabc2c37659b061 +3fac3fe3817566f6 +3facbf37855eeab7 +3fad40c9700e474e +3fadc4a35c3cda2d +3fae4acf922f0baa +3faed3588881954d +3faf5e48e4fa657f +3fafebab7d5d3085 +3fb03dc5ac21dfea +3fb086f9d6fd080c +3fb0d177f4af27cd +3fb11d45d4626704 +3fb16a695f6ff7e9 +3fb1b8e899d61b68 +3fb208c9a2b03967 +3fb25a12b4b1166b +3fb2acca269f2ff5 +3fb300f66bd34983 +3fb3569e14b933d7 +3fb3adc7cf52d8d2 +3fb4067a67bd95d4 +3fb460bcc8b9ef4b +3fb4bc95fc35a7d0 +3fb51a0d2bd845ac +3fb57929a19211d6 +3fb5d9f2c82d9b50 +3fb63c702be3ca87 +3fb6a0a97af28ff6 +3fb706a686363a22 +3fb76e6f41c57e80 +3fb7d80bc59041dd +3fb843844e012c48 +3fb8b0e13ca2154c +3fb9202b18c3555c +3fb9916a9026093c +3fba04a877a954fd +3fba79edcbfab3bf +3fbaf143b2496256 +3fbb6ab378fcf262 +3fbbe646986f1482 +3fbc6406b3a8a7d5 +3fbce3fd99221d98 +3fbd663543874010 +3fbdeab7da7e6ba6 +3fbe718fb3734a3c +3fbefac752651ff6 +3fbf86696ab8ba32 +3fc00a4070070831 +3fc0528c638cd40e +3fc09c1e3340e65f +3fc0e6fb9bdfd61d +3fc1332a74023559 +3fc180b0ac911f21 +3fc1cf94513cd2e6 +3fc21fdb88f5665e +3fc2718c96659774 +3fc2c4add86fc7c9 +3fc31945caad2b86 +3fc36f5b05ef3576 +3fc3c6f440c34a70 +3fc420184ff8c65b +3fc47ace27295d4a +3fc4d71cd943e348 +3fc5350b9919859e +3fc594a1b9ed80b6 +3fc5f5e6b0075da8 +3fc658e21147c2f4 +3fc6bd9b95bfe404 +3fc7241b184b9b2a +3fc78c68972e3a46 +3fc7f68c34b21e2a +3fc8628e37cb114c +3fc8d0770cbb8a56 +3fc9404f45bcd385 +3fc9b21f9baa27fc +3fca25f0eeaed44e +3fca9bcc46f767e0 +3fcb13bad56604f4 +3fcb8dc5f449dd72 +3fcc09f72819eaa8 +3fcc88582032eeb0 +3fcd08f2b798ce37 +3fcd8bd0f5bb51b9 +3fce10fd0f3e5d9e +3fce988166c5b0b9 +3fcf22688dc4392a +3fcfaebd454f0fb2 +3fd01ec53f7a1501 +3fd0676daeca6a5c +3fd0b15d9b22030d +3fd0fc9ac8944d73 +3fd1492b1531c763 +3fd19714797d2144 +3fd1e65d08e27118 +3fd2370af2307ed2 +3fd289248014335a +3fd2dcb0199633f2 +3fd331b4429ab3bf +3fd388379c63856a +3fd3e040e6147709 +3fd439d6fd3a0294 +3fd49500de525d74 +3fd4f1c5a558f1d4 +3fd5502c8e544c9a +3fd5b03cf5e68b15 +3fd611fe59e053a2 +3fd6757859d664c8 +3fd6dab2b7b9c667 +3fd741b55872a8e6 +3fd7aa88447dfe64 +3fd81533a88dda4d +3fd881bfd62ca3b7 +3fd8f0354463275e +3fd9609c90619621 +3fd9d2fe7e2b7d2e +3fda4763f946c558 +3fdabdd6156dc71a +3fdb365e0f448153 +3fdbb1054d1100bf +3fdc2dd55f77069f +3fdcacd80236fd1e +3fdd2e171cf04879 +3fddb19cc3e703ec +3fde377338cd39e7 +3fdebfa4eb8fa73f +3fdf4a3c7b261938 +3fdfd744b66776c5 +3fe033644e70c2c0 +3fe07c69afda3d8e +3fe0c6b831393645 +3fe112559e015614 +3fe15f47dbc49464 +3fe1ad94eaa8efc5 +3fe1fd42e5e03976 +3fe24e580421fce2 +3fe2a0da98278c8d +3fe2f4d1112a3e2a +3fe34a41fb63df9e +3fe3a13400916f0e +3fe3f9ade878200e +3fe453b6996cb86c +3fe4af5518dd4f0e +3fe50c908bdd77b2 +3fe56b7037b4e673 +3fe5cbfb82709638 +3fe62e39f3767d60 +3fe69233341bdc2c +3fe6f7ef103e309c +3fe75f7576dedbc0 +3fe7c8ce7ac18482 +3fe83402530d445c +3fe8a1195bf0aa84 +3fe9101c1748a24f +3fe981132d4a49e1 +3fe9f4076d2fc657 +3fea6901cde822f1 +3feae00b6eca48ef +3feb592d984b1e13 +3febd471bcb6d806 +3fec51e178ed9300 +3fecd18695233a87 +3fed536b05a2d315 +3fedd798eb953406 +3fee5e1a95cb4133 +3feee6fa818bb40c +3fef72435b648434 +3ff0000000000000 +3ff0481dbe7ed2b7 +3ff0918088e7663e +3ff0dc2e184b9a0f +3ff1282c3f88c1a4 +3ff17580ebbbe7f5 +3ff1c43224b81f02 +3ff214460d7ee495 +3ff265c2e4baa5b0 +3ff2b8af053b6a31 +3ff30d10e675b25a +3ff362ef1d03902d +3ff3ba505b2806b0 +3ff4133b7154b949 +3ff46db74eb1f5ac +3ff4c9cb01a922f4 +3ff5277db871a0ad +3ff586d6c1a020d2 +3ff5e7dd8cb887ef +3ff64a99aac25eb7 +3ff6af12cedfe0b9 +3ff71550cee7b3ec +3ff77d5ba401550f +3ff7e73b6b444518 +3ff852f8665a0415 +3ff8c09afc22e625 +3ff9302bb95dcf62 +3ff9a1b35152e3cb +3ffa153a9e81388c +3ffa8acaa34f941e +3ffb026c8ac04b14 +3ffb7c29a928479e +3ffbf80b7ce949f2 +3ffc761baf2f7044 +3ffcf66414b214f1 +3ffd78eeae781208 +3ffdfdc5aa9f7967 +3ffe84f36528d104 +3fff0e8268c5e347 +3fff9a7d6fac338c +40001477b235939e +40005cf1b162fa0f +4000a6b25c48b280 +4000f1bf734ac2f6 +40013e1ed0b9a4be +40018bd669471caa +4001daec4c7d21eb +40022b66a536dcde +40027d4bba1bc72f +4002d0a1ee1cf6f7 +4003256fc0f49e94 +40037bbbcfa7cb23 +4003d38cd50a6bd5 +40042ce9aa45ac4f +400487d94760ac9f +4004e462c3cba168 +4005428d56ed6723 +4005a26058b39380 +400603e34225101c +4006671dadf74a06 +4006cc17592601a7 +400732d8238dc6fa +40079b6810892dfb +400805cf4790c7c0 +4008721614ddec8b +4008e044ea10639d +400950645ed6f5b1 +4009c27d319af746 +400a3698482ed80e +400aacbeb07fc52f +400b24f9a14a6c28 +400b9f527ad2ec6b +400c1bd2c7a00614 +400c9a843d39944f +400d1b70bcea623f +400d9ea254856992 +400e24233f2e8a1f +400eabfde626ca28 +400f363ce19c2f47 +400fc2eaf97d402a +4010290993281fcb +401071e0490718c5 +4010bbff4c80ddce +4011076c6554f8e7 +4011542d755090df +4011a24878c3d6fb +4011f1c386f985f6 +401242a4d2b07b8d +401294f2aa97762d +4012e8b379cb004b +40133dedc855935f +401394a83bb1fc56 +4013ece997500bc9 +401446b8bd1b9c3d +4014a21cae05f8fb +4014ff1c8a91b036 +40155dbf9360db6a +4015be0d29c5e902 +4016200cd056f2a0 +401683c62b83ab73 +4016e941022df256 +401750853e4513a1 +4017b99aed63c6bf +4018248a4170f3dd +4018915b91434e41 +401900175947d006 +401970c63c2b243a +4019e37103860c9a +401a5820a08cd04c +401acede2cc1c15a +401b47b2eaaae6d6 +401bc2a8468ad9c4 +401c3fc7d71ce33f +401cbf1b5e546a8b +401d40acca1fc1f0 +401dc486352e61a1 +401e4ab1e7baa01f +401ed33a5856f7b8 +401f5e2a2cbee96c +401feb8c3aab8d19 +40203db5c455effa +402086e9a78070e5 +4020d1677c3ec936 +40211d3511b57062 +40216a585137ce8a +4021b8d73ebe4079 +402208b7f95e2f60 +40225a00bbc4460c +4022acb7dcb0ccc5 +402300e3cf7635d3 +4023568b2479e453 +4023adb489b73779 +40240666cb44e48a +402460a8d3dca9ca +4024bc81ad65652b +402519f8817f9939 +402579149a146b90 +4025d9dd61e727ab +40263c5a652951ae +4026a0935211548a +4027068ff973d73a +40276e584f5fc544 +4027d7f46bbd1652 +4028436c8aee61a6 +4028b0c90e7549a0 +402920127d99cc87 +402991518614874e +402a048efcbbf7e5 +402a79d3de34cc5c +402af1294fa54cb3 +402b6a989f6bed72 +402be62b45d918f8 +402c63eae5ec3e63 +402ce3e14e14345e +402d661878f2ff58 +402dea9a8e2509d5 +402e7171e30bdef9 +402efaa8fb9c76a2 +402f864a8b31235d +40300a30baaf9959 +4030527c6768280f +40309c0def0fde06 +4030e6eb0e5db3dc +403133199be483ee +4031809f888797d5 +4031cf82dff14353 +40321fc9c90b95c2 +4032717a867b2b81 +4032c49b771c290c +4033193316816940 +40336f47fd75e909 +4033c6e0e2807a32 +403420049a69c803 +40347aba18c4b7be +4034d70870792ff1 +403534f6d4515135 +4035948c97892b6f +4035f5d12e60faec +403658cc2eb1f86f +4036bd855085c831 +403724046eb09339 +403723e9f6bed575 +3fa6203bca26b0ea +40372401c91709e1 +3fa62025033991b0 +403724046eb09339 +3fa620227b598efa +3ff023e698547ff0 +3fefb8d284a84512 +3ff06ca6273e31e1 +3fef2c51240d9b69 +3ff0dc2e184b9a0f +3fee5e1a95cb4133 +3ff1c43224b81f02 +3fecd18695233a87 +3ff6af12cedfe0b9 +3fe69233341bdc2c +40018bd669471caa +3fdd2e171cf04879 +3ff0cd23d7df3a95 +3fee7949badd8815 +3ff5e7dd8cb887ef +3fe75f7576dedbc0 +3ff700b9661578f8 +3fe64214eddb094a +4000a6b25c48b280 +3fdebfa4eb8fa73f +4002d0a1ee1cf6f7 +3fdb365e0f448153 +400b24f9a14a6c28 +3fd2dcb0199633f2 +400c6792e3489b60 +3fd206775e0250e9 +400d9ea254856992 +3fd1492b1531c763 +40133556c6a6975e +3fcaa7b279ac84f3 +40133dd7c60336ea +3fca9beab67f8a5c +40133dedc855935f +3fca9bcc46f767e0 +3ff0000000001198 +3fefffffffffdcd1 +4020ef91198ca819 +3fbe3b576c12e4e5 +3ffef2ce26c1cac6 +3fe08b2bac8d4d5e +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7fefffffffffff2a +7ff0000000000000 +0000000000000001 +0000000000000000 +0000000000000001 +3ff5111a36816654 +3fdc4b0666678a56 +3f2b6e3a71a26dfe +4001dd8b807ef188 +403bfb148519bc8a +3ed10520ad857688 +4011c29114629e3c +402c8ddf901118bf +3ed003f32fa92156 +4031abbd8a635148 +3fb61e50c9177458 +40617873791518a5 +40270a9000c0f698 +407a0bde52d74b10 +3f16c5f1f5dcf1c2 +40a01587c1374ee4 +3fb21a2d09c74818 +3f43e4a8a0fac92e +40b936eb06fffd24 +40ab2788455bb03d +3f345ce00b690121 +3f38503832cff2ec +3f2699bd62e15fc0 +3fcd218970cbc88f +3ee65d6974fbadca +3f0354d677200ff4 +40e6602830a4a34e +3f0e2786bdbb7096 +3f02483dffc29450 +40c0343b05d13f5f +401f9d67b3ddff23 +3f4b05a6264491f5 +404ea3f8b904addb +3ee16521866ff81f +3f42e3570a079a36 +3f152d293e022409 +40e93cda8d69a4d6 +40cd0fd7f15fb099 +3ef4d4131a0dd9c1 +40d5b674a8c340a1 +401c9d01fabef675 +3f00d4170857fdc1 +3f4c0d46f6c44f68 +4053b5c6f89b0530 +40b11047fd6029e3 +3ee43b0ce4e5eac7 +409f8454f9409cdf +3f6000eb4c47515e +3f1eba3ef6cbdbc3 +4050ff13b26b6996 +3f231f82387b0411 +3f73e268fa6adde5 +3f6c34319d31d8de +4058cc1033664c52 +404db18d6896a7e9 +401ee5070517b9dc +40b8a0938f25c737 +40608a243d1d650f +40dee59396e62bf6 +3f9449530bdf5735 +406e74836abdfabe +3ef39e274f43549d +3ff0196a55e0c7a0 +3ed457ab9d0e75b5 +3ecda80e304efab0 +402332ab74b9331d +4035fca15123d49e +3f11bac1ab495612 +3ee455bad9cb8db1 +410c451527e9e650 +4003d28756223120 +40f428b1eb81cd6a +40ec7a39e3f71c32 +3ef9de2fa33d9106 +3fec258776712998 +3f7eea589328cd1b +40e23242cc877df6 +40a82266b9c4e1ba +3f153b6f7f9cbd00 +3f9a306908b0be00 +3f3d0cee6fc0cebc +3ed3ee2cbd1db866 +40256855c173ca2a +409743dd6ff94d2e +40420b82b2ea7e1e +3f55074eb7315226 +3fb4129509017928 +408506630f0aa494 +3f1abea25269ee00 +4069f142b472e377 +3ef08b11cecbce70 +40630cb838360908 +3edaf2a38a17ed5f +3f8e015b2133f2a0 +4002ddb9e8d6c908 +3f399e94d5a0c766 +40cc36a409120d43 +3ffa8b4e5dc575c2 +40537bed7b52aec4 +3edd514f9415d72c +3f9a84fe53a7ace6 +40d02bf500ede093 +4049d5058237b790 +3fa396ba8c7d72f0 +4024a19ab367c928 +40119a9f96ba891a +40da25af39c59c2c +3fa17d368a6f0917 +4026dcc20db7f8a0 +40da5b6aa8aa1da9 +4039c6fc36872a50 +40e867797178e66a +3fc6a3ff072cdb56 +40ddb545f38e0a3a +40aacc55a00b4971 +3ffdb545f47dfaee +3f63055eb965e75c +40a027069ac63315 +3f51d3b5e20a556b +3fd2cd243e2c26d8 +408780da350cf610 +405c50bae1e9087e +3fe3d253f5a0e8de +3efbe50a8166f4f8 +403c21db714da6e8 +409c6cfb1f987505 +3fde11a5082954c3 +4019d0076b7e999e +3fc4e28b89999e30 +4070ebc2a95a8cb1 +4052944a7ff81e35 +3f1a76fdea0e2ae2 +3f97c594285db528 +3fac8d18465a86cc +3ef9c220442c83ee +400b22bd2c7f3800 +3f131c745aee7ea2 +40b5305dbbc63fbd +3f359eeb3e8015fc +40a340378dd63a3c +3fc92b282b982312 +41019a3256647de1 +3f9c44b18fe8c59e +40d0784fcf390e3e +3f527f3d7efa6bc2 +40f83d708ba4a938 +40dc0fa76f150244 +3f7b6f21ef811011 +3f7da9bc7d73b7b5 +3ee4d35843cf2b53 +41021c3ee71de580 +3ee3ef56e67887b3 +4052d5c78575406d +3fcb9a4a2ca30cbf +3fe841c77a04e55e +3fd644fd46952429 +3fb40350eeb34151 +3fbd6e156501d2fe +3fb08627b6d69f63 +3f5a9975708febdb +4011415a02fa9c04 +3fe9fb2f19f2d446 +3f79b5b64a0c83f4 +3f60d38da92cb1e8 +3fb42aa25f2d4db6 +3fe5f405c2c5b3af +4101606e215b43ba +40fdf7c825ac84bc +4080822f13fc789d +3ff971fa4d4669f8 +40fd807dd4670028 +403330487ebebf36 +3f41c45f9ad3bc50 +3ff7e3263311802d +3ecd4b699f727855 +4021265eb9e2b8e0 +40342402f1c1f358 +4056b836637ddf74 +408fed3ae7f476c3 +3fd18f0043c421fe +3f09bb5045100181 +3f8e883c6c89edc6 +3f119a04a4f537b3 +3f598451fdaebddd +4023fe7e77ab72de +3f1765ef57a581c4 +4021c85ec35deabc +40b1c2ab93987918 +40db7431afeff1fc +3edf1f0d1d45fb11 +40f14b968ce84db7 +3ecf97e5e8c049ab +3f67235142fe958e +404581c4d1a5920a +3f2217495ced71fc +408913afc9112362 +40af1cbabd67a89d +40007db63236f221 +40c60e708c42b426 +40800f77dd1ae4c4 +3f444f9c72f12d68 +4049362597b74f8e +40e7a2eed02c9a40 +40c52b3eea5c65ba +3fe6797f417766ee +3efcf8b99b826efd +3f74fceb8308e80c +3fd6df79d1fcccfb +405ed000097fbddf +4097cf0a3e2abba8 +40cd4d3e256b13d5 +40fcd7625e7d429d +3f87dffa2155e8e0 +3efcb0f124541606 +4084dc46a95ba4d0 +409958e4e64e581a +3ed80047694303ac +4023fb4f0d8bc79a +4063e4c57f4a2451 +3fd75ea87063fed7 +3f518f7680084376 +4083fe8172f9e026 +40bf6ba4c9fb141c +3f1829fa716e15a0 +3f276207f4839aac +40e9f231536e1670 +3ff91526ecc1c404 +40cfb4f1b4906ce5 +3f5a58346ff8f236 +4033f94e6fc32078 +407b9ccd60ced1ac +3fdeb18e275349ef +40a4347eb9e75b47 +3f5ba82bcf8f485c +3f16545d024898a8 +3f03a556a89a181f +4020d08c4d55aba4 +407e69d0519f4618 +4041d6f2f43d6e7f +40cd70447bacb97e +3f626c254d9c2bb3 +40680003956ff9eb +3f1d989937a6fc9c +40dfbb56d9b55ba7 +3fafb25efd545fd0 +3f61cb3b0ddfe2da +40a5796789d2f20c +3fa636de44e06290 +3fcb5ea323b200e1 +40d6b2ab39e5e621 +4051c6bd43fefd6a +3f72faa7043a9e80 +40ddd268621e73f3 +4014bf1022105893 +4066279e174f122a +3fa63512b166146b +3f4fb6d6eacc92ca +4036f5972c820c4f +3fdfe8847efde2d8 +3f39e49b65cdca01 +3ef9a9cbf832cb8f +3f71e52dfdae104d +3f84f9473298ac6e +3f49a3ca426db476 +40aed9e560b906d6 +40d63c43fbe3577c +40301f5689eab62f +40b9d96af51d9ec8 +4033b2d71f0e8f50 +40b2b3986a978c83 +3ee6bba501504aaa +3f7544e6ed3f7fcc +4082ccd4983e4797 +3f7e370dac3f00e8 +3ef9702ad5990c4e +3ef810b5e34a7e30 +3f4057f1c2b13ac5 +3f317aa3e85c2075 +3fe28776c874e155 +4099ec43d1505a68 +40946e4e52052a02 +3f3a7d6754d9f4fd +41014917f472dd59 +405a745ca41b33e2 +3f591918f0db6e70 +3f1dca0e34f152b5 +40e69201cee65c61 +3f40d3a599c4d275 +40d09146ba118988 +3fcb956121b7f9ff +3f14c749059b071c +3faba5fce203cc39 +3fbe15e16cba5055 +3fb061ec9a95975c +4053f2d88b2e913e +40c8d7179a881d02 +3eea01fed2d00d01 +4098300a5f1bd892 +3f736b79f20a9448 +401307b51efc142d +40df116b46e6ba28 +40e1c5dc4f202610 +3f42fee2accf1327 +400835ee030e5bde +3fb740c048f8c5c3 +40e15d54c70c1e0f +3f70bd497190c00c +40b7560f0e2d5f7f +3ee3a94e3d285333 +400646d08d44d61a +40e1aac7a9e85636 +3fc19a458f16f1f9 +3f3146a3837244b6 +4072702c7d97f6be +406f5981813d7177 +3fba3d7e1838eb36 +407ba4ca8030a51d +4102c785d45d0627 +3f01d57e595fb896 +3f67634d4415bdfe +3f6b150c60b1c5da +40481e41675650c0 +3f3c2db622c3e267 +3f938fcb62e0fe7b +3eeb4f99820d449f +3f82663c765b03b0 +3ef1819eedf20c5e +406b136560ff58d4 +4044695baf172f70 +40c23bfc0ca6c2b2 +3edf81a3089a41b6 +40302e3b875e042a +4034db99b3ffb74c +3ed379da67d59cd1 +40e7999cf50ffc6e +400be22bff18c271 +4034143b18a202b0 +402fe86a388da397 +3eebd0e893d25f61 +3faec031324f9143 +40998b46a4bb2a36 +408132ec931aaee9 +3f54a427ae30a931 +40c08e2744dd4be2 +40bcc7f687972a59 +3f53f2a52b930f83 +40d1b8327d45429b +409e28d5da98b224 +40e222e4f046bfd3 +407b68c3d79ab1d4 +3fbb8fca05c8dc5e +3f3e3e1f5c00076c +407c103626de8940 +3fee0d5269cacf9b +4098883ecf1c3acf +3fa26ce464eef6b5 +40a413cb60a66312 +3f9397528446a8d0 +4107e75403e20f6c +3f2bf8862b31aa7d +3f66b0200a7f2c49 +3f6409293d5e789a +3ee4ff86059c89b1 +4050f991b49f8250 +402aecd56ab201e4 +3efa7b16d3d18132 +409339b79f4e31ba +3f16cb48390876d1 +404b6a233f839d92 +405898cfa839cf88 +3f922b2cb0c8dafe +3edd7034d49d6dce +3fa29a28f5b5d5f7 +3fbea901a542bae4 +404ff09acba2f88f +40d0ad5df8a98d47 +3fd3352fe90b9f4e +3fd52343fc7fbd3a +40a33a2ea1a44afc +3f626180e5865a6c +3f665c1758b681ee +40c90bdb68562940 +3ff97ddaac4cc85b +4004491198560b32 +405862d27bbcb229 +4090d8e3fb96210e +3fec82aec6662ffe +40703bd02ba10371 +3f0a133a52868760 +3f9dbb92da3968f1 +3fff1875e4b2dc4b +40d0f4bedbfa5a77 +3fa232a353ebd263 +3ee199fa7d38e3ad +3fd734821fa9a326 +3f71a913562ee136 +400d26d490801464 +407ebc77dc04efba +40fe5141aefdcaa2 +3f18b0fe18496a20 +4005ec793df4abf3 +3fc3776bd695ffe2 +40d8a72590bae075 +40da3d3162749f82 +3fa94a0ffcc945c2 +3f280061627351b0 +3ee2ef649c3f3494 +403b264a7c51efed +3fc0c6ed994843ea +410a227c5fa3a6ab +40d422d9d9a0bace +40ef83ba89af0e26 +3ff6b366f21d9d13 +3fcb422cb2c65531 +3fdf3367a26c76bc +3ee1cb7a64baa02e +3fffa553f09fc676 +408bdf851c285445 +40314bcdcb5f4748 +3fb3680f11822027 +407e286fd1077f3f +407a9be1497eddf1 +40e9bb4aeef5c139 +3effb3a00efa02c3 +40acf9b4f60ae8e1 +3f01218b53cd80a5 +3f4c62599f024883 +4070c0b7ed0c8238 +3fa08bf76d943935 +3f723b3b0ce05e09 +3fd99383bfe9f8df +40a3951765e5057c +3f3b0c859e5b7048 +3f181a2970b36346 +407ea8d10d339545 +40c8ef6ceb5c2e2b +3f08e42726ed7e4d +4046e91690d72b44 +3fe02920808a3a07 +4110d31acd76d49a +4086ecbe66b0c007 +3f930c49c9130f08 +4039d536c3082a54 +407ab2f6506113c0 +3f1c3e11194e8c49 +3f48e8c4c29e6462 +3edbfb8306911140 +3f0b77d5194af404 +3ee9386b33184228 +3f9763d53fe2437a +408322b696923d31 +3f22a4aa491edca6 +3ed3d2c4a2109296 +4001ab6c3d28c7c7 +3fcb62321382a4ff +3ee62e7d3a610c06 +40906efffd3b2988 +3fa4fac2f724833c +3f2d18721f03412c +3eeb9a1116d65a6c +408c9a72b584f7db +40b0cbc293427ee9 +3fc67c5c86dbcc9f +3fcbaf2c3f6c3d90 +40bea5e4a57c1bbf +3f98255d711fd3f0 +409369271b519d7a +404955710573bc84 +40476aa5ae4308d4 +40e0e0bb7e6f6696 +3f9231cb1c0464eb +3f9d34d95412ed04 +3ed40718f6abbf4c +3f668dd5c946d382 +40a0d9cb84fc71a6 +3fe776d20110cb75 +3f038dc9fe97ea2a +3ef40ef6169d0a99 +3f244275a6999675 +40250b1320d6eed4 +40d0817578440044 +3fa5a679ac57be45 +40357376dc05b374 +4082c8b037a42ce9 +40fbc2700487829f +40bd865c96e20a8b +3f96fa5a55ac455e +40f260ff0fddf183 +40633fb71cbd4b4c +3f8c882e25c3654d +3fba3aac92843abd +3fe3dea203dc0191 +3f4a454eb29db04e +40cb728464f57e56 +40b4b61cbfeb044e +3f30b40b60b8f6d2 +4088e195491eb195 +3fba30e558edd9c4 +408782726fbd441e +3f50775ff1cc9724 +3fc1fb102a468f44 +40b7b90e21b6f232 +3fd763951c493fa8 +3fe061d4b36b73c7 +3fcdfa8f3f956d4a +3f86ca054269313c +3ed1ed883a019ac9 +3fbb7e8fbba72e2a +40b3fd12af516e0a +4007efcce829dc05 +409a4f85105ceceb +407e8218da88e850 +3f8c3e9e1e27127c +3f85e4d0830a1b96 +3eecaaad26bfe5b6 +4010d4d0e3c0114c +3ecdd0f1af10558b +401f4720b1aa8f4c +3fa199f87af1f5b9 +40e78b9da9e8b733 +4090d2a97b456afc +4024fa2c30fe2df0 +40f08ebf50f4d200 +40eebbcc872c6290 +4102b336d9d22101 +410b3e04f08f8def +3fa5c368f2779678 +3f2ece1662b76538 +3edc350e526be8dc +3f26ba2e357786f2 +3fcf2a517851dce8 +3fe1193cba5267f8 +408dc5935bdce2ba +3ed4fb1753ae9104 +4012e77539899b79 +4055f2d1fca7f53f +40048b5a2bdc4843 +406355253f4263e6 +3f9766d326d74cb4 +40bdb26877501cbc +4015e1058d8aedfd +406f53a24aaf8ded +40da0d9ec37c16ca +3fe1c347124c2aec +3f9525f782b4a754 +3f2af1387cfe1272 +3f8da0746c99a3cf +3f50011bf7c82181 +4058b0277e1733c8 +3f5865032b65baac +3f30126653ed391d +3fab4809bc91ca06 +3fe387ca166dec0a +40e9f24ddc6f6700 +3fec4a6503eb4140 +40e4dff2ce9a9f38 +400365c95867bd84 +4091e802795b2e5f +40114e9ee465a190 +40fbb13531b416b0 +4096165aee9bcf0a +4103361a2a9423fa +3ed3d5a0078cff18 +3f0b8ba853428be2 +4102dd610806a315 +406341d081522d3d +410741e137b41981 +3f81d1c836fc0f49 +406cd235109ff295 +3f7a94f87b0a649a +3fd4d7f4da4839ab +3f5796de3dc387ba +406bf4e64db8e33e +3f813d993bb74e88 +405d15f36b243882 +40b722e3b86498f8 +40c4e3810538b1b1 +3ff6ca7bfba2d3c6 +406e1749c0c846e5 +40917d9836bda9e3 +4095264d6dbb6a22 +3f39e4d3dcbca9fa +3f5ae6080026fec1 +3ff7302f083cf790 +3fbe8e1d3f45db0b +3fd233ee6be00b91 +4043ac75782de95e +401e11dfa1ea1563 +3f4e429b050ede7e +3f234278dd830fcd +3f2a586852ec1c33 +3efcac6b6dfe2a7b +40473ae80904c42b +3eec37e125c20c3e +4085772a409105a3 +40954b012626c369 +3fb1d1086b7af1c7 +3f39c1185791153e +403989fa3fb74c48 +3fb2bb1bc7d38dda +3f7a64e0c8c5c298 +3ee2d89a1fc5a360 +40627e7d9dc5958e +3f68fe79958bdda9 +406b4ddd20291d64 +3ed5d216125e2b22 +3f1b4b0aa35b2782 +40a21956890d95f2 +3f8c65248b83a910 +3ed0b945d14c5b6c +3f654b7cfaee65f2 +40c85ad3eee0894b +4036beee77675338 +3ed7caa5e4c6f3e8 +40fc7dc32517ecbe +3f2261c0d2f55e43 +3fc19405630a9298 +3edb802077782f60 +3f37cb608c7a4a76 +3ee3e12e420395a7 +3ef73c206aab066a +4081a8b7e55042c7 +40b107e049bbf700 +40db63570cfd0f22 +3f887a27d4633763 +40c822c2849048af +3ed091199095c6a6 +4003ced8c0873924 +40e659ba07439132 +3f7c33824093e992 +3f30142224036b5a +40176fccf3fbe4e4 +40733a4f4b753526 +3fc6236e66ead606 +405bae31d002ff54 +3fb4d83c90496c9a +410c24ad738aafdc +3f1851451468d946 +4090d008035f5980 +3f445136eb605b80 +3fc9464b5aba5fc8 +40e227467c0d7f80 +40b7afe3eda24fea +3f8536743b0d60a0 +402a838410fa82e6 +3f557128efec5174 +40df978fefd26e6f +4090d20e588ce894 +40dd8bbcb7a44221 +3ed4b2c9632e10b7 +406fe043e4acea56 +3ed230f5b8c84cc2 +40fef27c33c5487f +407581b321b0da73 +4110a8288cd526d2 +409da40afec5bc8e +3ffad37b4e890ddc +410ad2be8d481a1b +3f65eb949a0e8ba8 +3fae370c413183a8 +4060de1a9808a9df +3f40f07082ad5b92 +3fef800e34d1abd0 +3f68344e1dfde59a +3ee212944be6976d +3fba306fb9f3763d +411040efdde4f5bb +400a6f4a34dd749a +3f4be3016a1e2d49 +3fb0185f2404a55b +406b896a4be35e32 +3ed327e468bc8826 +3f4395a66370acfb +3ef70b5df86ccbdc +3fe26b479af231f2 +40b53cc4871830c6 +3ee443e0e58ba9c0 +3f2946ae81bfe698 +3fdf0fb4c73f72bc +40cee7966573536b +3fdc4a684f353911 +3f3d0b84b28a2608 +40076c08228e027c +402adb6700b0df93 +4110082f192a4af9 +4060e974a1a45b46 +410da87ae83e5377 +3fdb6836f5d96ada +3f1915d8956befdc +3ed78f62d48da01e +405571f125e1a5a7 +3f716d96a15bf751 +4105199670f11740 +3fb8ff77390fe2ec +3fccff4b9b8a93eb +3f23c7510b5966ed +401634d9ca24356c +3fb26ef77a067ac3 +3f28bc78e141f5a1 +3ee9dd9f5ee0015a +40a5f28c5b083c12 +3ef8bbbc5e85ac13 +40c6eb74173bfcd7 +40a663beadc6379a +3f5d902f0f63bde7 +40f8591d03b50ac5 +40b67436a145e2cc +3f1a735bf4d0a051 +3f522e9d4582a282 +3f05a6766555aee6 +4041218e4712f33c +3fe3c750ca460e3c +405df56a178b06cd +40f7524b2794dfd6 +40755a0e0b455af8 +3fcac08d3bfe48f0 +3f039a6ea36dc626 +40eceebfbb847bd1 +3fda2ddca9978ff2 +401a0e993a2b14a6 +40369a8b0938e03b +40e0ee83d4614e2c +4055a8a247b33c25 +3f4e5934f544183d +3fbbd641029c2272 +3f11b454fe90ee8a +40617233fea35964 +4092f77c28010128 +40f415c512767b52 +40336e530f6a934a +40d2fd9dcab6f86e +40cca505b70ed781 +40632e0f9eeb22f7 +3fa33bf77455fcb9 +3ffe4d51b77a1008 +4020fa486298bba8 +3f7d5fad6ade2ba2 +3f10ca891ccc906b +3f0b7cf1935a15a3 +3f0a816354c447ba +407fe56a16b01c62 +40859175d2286ef2 +3f155855adb8d35b +40e2e96203b4468c +3f73855f817b56e2 +4086dbdfa07b97a9 +3ffa9ed42e3cb204 +40f9b0cb0a86b958 +40dec757f681a534 +40e46da99770c474 +3ed03a4417bad365 +4037cf731026a587 +40627ccb524a90f4 +3fdfd2b83023fd41 +40e1919d959e5ce5 +404e15192e992baf +3fba066a51c59a25 +4070d17b23145635 +3eec4d66a50abfcc +4017f4aaec5b2e1a +3f80c474a89bef92 +405c3092ead05813 +4025bc6a526394bc +3f0e7032d1abe855 +3f73ce8be2e52d2a +40f4ac333a5dd03d +3eef96f703ad2beb +403ea478d2dce2c2 +3ed4297cc0b74ece +409099ad6aa6a2db +40f59eee58799409 +3fc301d1d5746a59 +3edc92ce6a455d62 +40e2322a475e3aaa +404c2d669b0547dd +40f61e0b09319c43 +3fc14ef5f06a5ea4 +40aed3699cc1fdc4 +40d6de34d12386f6 +3ee416c182c5a519 +40f1143032549a79 +3ed52d9b66db9c34 +3ee6d335a8856ccc +3ef6202bb2909ca3 +3f412d6dc0bdf720 +3ef9e1f29f2732b4 +3fcbe4254b267a9e +3f30807f37f3469f +40c373bac0c172ba +402c8dd911e59985 +40b409809bdfe4d3 +40ee66592ac6d6d4 +407a668e4eb26130 +3fc033f8ac1f4343 +3ef5a0aa38194498 +403417ef19ea874b +407d51810a505813 +40bee515023bff06 +4108dbc14ff4110c +40d2ff62437e8d4c +40f91394f19d0cd5 +407cfabba891ce90 +40d02a0ffb27cb79 +3f6e2aebf2a06d8f +3f28c164a92ae4e8 +3f8be77b1a565803 +402393c86a8cb160 +3ee1f1125571d920 +3f7ba961463b89eb +3efccbf0bc7a54c6 +3fe7474da7956a2e +40a10bfabb1724a2 +40d84e1cf9f202fa +3fd05e505c8ab523 +3ecec8b32395bb4c +4056d5c7eeed9328 +3f6880bfb7710c01 +40745051505e6b9b +3f064950911ccdd8 +3f83aa6bd3933995 +3f02c35402b49500 +3f37151065209842 +40371e225eac8fdf +4084facbe79ab3ae +3ee09b79ca78c7af +40d31bef32b0d373 +3ffbd2bbb7e9b197 +3eebd14c8443e329 +3fe78430dd99c5b7 +401c04f7ab7bfdfc +3f4d7c9e334191b8 +3fa5aa327441954c +40f28bee669c60c6 +3ffd3b43548b8f47 +4092c99e4051c341 +3fb78c38b8968c8d +40fde84fbd4ae4cb +40d233f2b78f8372 +40634bc9efa27209 +40c92938fca3ae56 +3ee17ee71407fe3c +3f964dbc0a246cdc +40394b0f6344cd82 +40745f7e4e02b05c +3f95e9c35576aa84 +400da24782720455 +404ced04408eb4a8 +3f266407ad02a96a +40836d5f671cec8c +3f7600adadf669e9 +3f57eec9192a90d8 +40ab77b4ca7f0b04 +3ecd7b55c16e8a1c +3f3e41aa56dec5fb +3f3365119fe5010b +3ee09a3ae0d4a5d6 +403b8f7789d20da6 +4099c1dfa82c656c +40928a5711613705 +3ee66c518075c994 +40ebb52d230c1d01 +3fbc103a2b9e040f +4021238633055443 +40ed1c2478cd3644 +400355dcb9ee1a57 +406a18ab7b970379 +4057d449b777f826 +3fa4d3c2d5e375c2 +3f81d2b3f7e2d79f +3ef36fa0f7317ae8 +3f75f572f12cac12 +3f60160c4198f901 +406b937b82fbbc9e +409f7fd99803e394 +40879fd8efcfb952 +40ffa412885d2525 +40105a880bb5bd8a +3f5d1f585645248b +40abb68f00d87c30 +3ed118d7b6465ed3 +40c79f47f02f476c +3ece327685382c43 +403137eb4334ad87 +41064a4508dab12b +4007a86f9d8eb936 +3f56dbe18410235c +404f1b867aa856a6 +40a9ebd675715b5b +40c2dc8545d0c455 +40fffb60820a81d9 +409ca8e4b35d1194 +40519bceb304fe84 +3ff457f5848d8449 +3ef622dfdc1b79c3 +401fe651c9316f6c +3f6b18bf344d3076 +40a6d221a62c2c40 +403977bcfe327a16 +40b3c9b740391ec8 +3f02d6797fa41317 +404cc99eb5a3365b +4006d541182e4c94 +3ff730775ab5cd2c +3eee84ef7471c12f +408a58090f3ddf60 +4051671fbc291c19 +3ee1e45f785d4266 +40f1573b81dd8eae +40493df79841b5c3 +40827a95bbab4518 +3f41eef7d612ef37 +404fb7df47c7b9c5 +3f0aea57b59c2537 +3f52016e8141e868 +400dc01183630142 +3f6bfa673366ab1c +3fb78dcf3631d198 +40161f727a441887 +3f0f192d33f51455 +3fc760f2d18ea734 +3fb94963c82c600b +3f5dd8a2ac82dcd1 +3fa639ef68e819c8 +3f28eef0796144a0 +40cf1a3ce930311c +40014e7648a66a75 +3fbb2a6c1c860db2 +3f2173a607ab2a51 +3fd5c674e01a0280 +3f40b45eecf1fe0b +3edad4dcf64b7594 +402a081476c5cf32 +40d79079cbc9b48b +3f216eaeab0d2334 +40f191c0e717d914 +403043f6c175adea +400bcbac3e3730fc +3f290112770762cf +3f23e680e4b71b64 +3f3a141f4e5f8dde +410ff468097696a0 +4019a4d8d2496484 +4008b1531cc5729c +40bc3e4e232cf5cc +3fa2195842586198 +3fe7d68b3b1d816d +3fb2b931b3cdb311 +3f762f8028579af9 +40ede5e647f2f3ab +3f16c1f97cf0b9e0 +3f0a8eecd0eaeaaa +40b2b32a4be2f3de +3ed0bb3ed293ed8e +3fffcde3d940fb1c +3f23252dabea3c10 +40c25bfce1c7ac93 +3fe9ffb480d6dc7e +3f17e66c30069120 +3f52c52f945b9164 +40d090ac79dc692f +40febfd395d12403 +3f0042f05c103b2c +3ef1f568bb8c1a96 +3efe9e9acb7e360a +3fb41db3a718148e +3ed2a864602b5fd3 +3fbda983b51331d6 +3f496ce243b754f1 +3f38f268b8d3ca3d +405462ea532ff2f0 +3fe71057e0abd7e4 +3fc29bbec3b86501 +408f9e93c94f44d2 +40711cca12aa671e +3eea7e9db41a5a26 +3f426f046f31bef7 +3fb59b657161aee1 +4060458333d942f2 +3f29efffbd980d4e +40cd0b3eb6164868 +3f998c7f1a3805ac +40b69a81a106d1cd +407cb873bd6b8c78 +3fa1039a04eafdb2 +3fcd31a9565b2018 +3ef873af4248a9ae +40af62d5bfec040c +3fd9d69fbef0db72 +3f668fd42bb094d3 +40e736c0f0fe99b3 +405808220152209c +3f21b59ca61eefa2 +3f5a646a2a46c1da +3efeb10df5036364 +40420df70935e3b2 +3f220e2f29b57b95 +3f838c9166fd079b +410bd2962760d430 +3f01020d81c0214f +40f748ed8cc967be +40540dd4d2b1c132 +3f5ffe24421b708d +3fd73492b8825f96 +40d77e0169262aff +40e0ffe3d45cd8ba +3f4459917034f2ac +410fd03bc165cefe +3f1221cea6833920 +3fd2bcbcb169b4c2 +4051a26914b2ed64 +3fd99b8c5a64e85d +4006e90545dd9d1e +3f25d1c4cb5cf053 +3f2eb2e2cf6297c4 +40b4ce5e685063b8 +4037335ca2ea1f90 +40844bd786ae356d +3f1129bd61ee2a45 +405cb143980f3124 +3fc671a7a1ee054e +4044deb152e312aa +3f8027c657fea910 +40453eb783727955 +40c4b09e67529cac +7ff0000000000000 +3ff000354083a634 +3feffffffffffa43 +7ff0000000000000 +3ffa03a7d92508dc +3fefffffe76de673 +7ff0000000000000 +3ff0025cd6a1b978 +7ff0000000000000 +3f3e58a88b956256 +7ff0000000000000 +3ff000000000010b +3feffffffe34ba28 +3ff0000000024e4e +3feec6ba14b73383 +3feffffffffffe17 +0000000000000000 +3ff00000000007b6 +7ff0000000000000 +3ff0000000000000 +3feffcbe2e80ebb8 +3ff0000000004a2e +3ff000007bdae22c +0000000000000000 +0000000000000000 +0000000000000000 +5cd6cfea06e3992e +0000000000000000 +3dc9401587362917 +3fefffffffff6747 +417481c52a561f63 +7ff0000000000000 +3e5a75f36b1d8e80 +7ff0000000000000 +3fefffff0a6a4818 +3fefffffffffacdf +0000000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3fefffff7e234fab +0000000000000000 +0000000000000000 +3feffffffffffa2d +3ff0000000000000 +0000000000000000 +3fefffff391f4612 +3ff00000e598305e +3ff00000016754b0 +0000000000000000 +40b1e97f1fee44fa +0000000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +3feffffffae57090 +3fefffffffffffe8 +41bafff884110d58 +3feffffffff9683c +3faf28e19802f2b2 +3ff0000000000001 +3feffffffff62147 +3feef6ecfc5cd40d +3fefffffffffff4b +0000000000000000 +3ff0000000838671 +3feb127c0b830646 +7ff0000000000000 +3ff0034cca52414c +0000000000000000 +7ff0000000000000 +53a0419352aad052 +3ff000000009f941 +3ff0000002f848a6 +3ff0085637f48154 +0000000000000000 +3feffffffcff3317 +3feffffffffe907b +3fefffb7e13fa8db +0000000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +3feffffffffffdf1 +0000000000000000 +7ff0000000000000 +3648540d8a3ac5e1 +3ff000026834a521 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3ff0000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0b52256050614 +3ff0000000000000 +3ff00000008b391d +3fed250a0cde25a2 +3ff0000770ee2240 +7ff0000000000000 +3fefe2f8fa07b825 +3fecfa21de419fee +3fefffffff220fbd +3feffed64ebcb2d3 +7ff0000000000000 +0000000000000000 +32df361e72418a7c +3ff0000000000795 +3ff0000000000000 +0000000000000000 +40264a29b157c70f +0000000000000000 +3fefffffffffff89 +3feffff458c3cdcb +0000000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3fefffffffccc5ee +0000000000000000 +3fed0171f7554490 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +3feffffdc3c44194 +63d2c1d557c50a80 +7ff0000000000000 +3feffffffffffffe +3feffffffffff45f +3ff3cb2d71c681e2 +3fe23bb53d09a8db +7ff0000000000000 +404d939adb154e07 +0000000000000000 +3feffffff76903bf +3ff00000000001d0 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3ff0000000021584 +7ff0000000000000 +4951307b337b8efe +7ff0000000000000 +3ff0000305a46203 +3ff0000000000222 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000001 +3feffffffa87671b +3fefffffffffffe2 +2a1f6a9cab3c9a3a +7ff0000000000000 +7ff0000000000000 +3ff00101fa064830 +0000000000000000 +3feffff29986facf +3feffeaebc89bc74 +0000000000000000 +3feffff1ef14f1e7 +7ff0000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3ff0000000000003 +0000000000000000 +3feff9277a9d8459 +3fefffffffffa5cc +3ff00259a1593c6e +0000000000000000 +0000000000000000 +3fefffffffffffed +0000000000000000 +3ff0038f1000114a +3fefffffeb0ea4b2 +7ff0000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3feffff79faa46ef +41b065d6237be407 +3ff911736730212f +3ff02e2ea11cf77a +0000000000000000 +3ff0000000492827 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +3feffffffffd8bc6 +3feffbb1abb44e88 +0000000000000000 +7ff0000000000000 +0000000000000000 +3ff000000afbd50b +3ff0000000000000 +3ff76edbc416452a +3ff00000010fc562 +7ff0000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3fefffd070a4513d +7ff0000000000000 +3fefffffffffffdc +3fefffffffffffe5 +3ff0000003aef77c +3ff0d98759e16643 +3feb272ff289701b +0000000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3fef2e4316c70634 +7ff0000000000000 +3feffffffffffea4 +3ff000056e883baa +0000000000000000 +3feffff2b13dbfb4 +3fefffffffe17c11 +404546dfeb7136a6 +0000000000000000 +0000000000000000 +7ff0000000000000 +3ff1165f3cf1b1bf +3ff094e324e6a551 +7ff0000000000000 +7ff0000000000000 +3fefffe305b02179 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3fefffb319b6297a +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff000009ba6346f +3ff000c6ab378a47 +3feffffeff34528c +59c3e5ea0f0e393e +3fefffffffffffff +7ff0000000000000 +3ff000009a9e6a6a +7ff0000000000000 +3ff0338ae73d674c +3ff0000000000011 +0000000000000000 +7ff0000000000000 +0000000000000000 +3ff0000000f01d72 +3feffffffffff4a1 +3ff00000003483e3 +13004718c8f8b7f3 +3ff0000002417214 +0000000000000000 +56bbd7e06f25ed63 +7ff0000000000000 +3feffffffffffab1 +7ff0000000000000 +3ff0001441e67c78 +3feffffff00b1693 +3fefffffffff9e92 +3fefffffffb7aa41 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3feffffffffffedd +0000000000000000 +3ff0000000000285 +3feffffffe417c12 +3feffffffffffffa +0000000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000104 +3ff0000000032b5c +3ff024186d186761 +7ff0000000000000 +3ff000000000937a +3ff00000000479a0 +3fefffffffffff3e +3fefffffffffffef +0000000000000000 +3fefffff4073f3c3 +7ff0000000000000 +3feffffffffff6f4 +3feffffffe50f83f +0000000000000000 +7ff0000000000000 +3ff0000252b0a6bc +7ff0000000000000 +3fefffff98236a3b +3fefffffffffdba4 +0000000000000000 +0000000000000000 +3fefffffffffcf11 +3ff0000000011134 +3ff0000000000000 +3fefffffffffe90e +3ff0000000000000 +0000000000000000 +3ff00000002f8a6c +3fefffffffffffe2 +7ff0000000000000 +3ff0000028c7f512 +3ff0000000000063 +0000000000000000 +45b8255b48e0dd1c +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +3ff00000000063fa +0000000000000000 +3fef9e9c00fe496c +3ff00455a886349b +3ff0000011bbb754 +3ffd5adbdca7fa65 +0000000000000000 +7ff0000000000000 +3ff0000000000000 +3fefbb7ed31680fb +0000000000000000 +3ff00000000185b1 +3b35588fac37495e +3ff000172bbfa688 +3fefffffffffffd1 +3feffffe127de3e2 +4012a488379aeddc +7ff0000000000000 +0000000000000000 +3feffffe7d6ff7b4 +3fefffffffffffcd +7e9efcbf44d5bbc6 +3feffff57ea08a61 +7ff0000000000000 +3feffffffffc3b3f +3feffffffffffffc +3ff0000000000000 +5a2a5e6df2ee6cb4 +3ff02f957f65ee8a +3ff0001fcf1377ee +0000000000000000 +3fefffffff7317f9 +3ff0000000000000 +0000000000000000 +7ff0000000000000 +3ff000003004f815 +3ff00007c377db36 +3fefffffffff45ae +3fd848610468d42e +3fefffffffffe29b +3ff0000000054ceb +3feffffffffffffc +7ff0000000000000 +3fefeb76bbdee57c +7ff0000000000000 +3feff9a02ae70419 +0000000000000000 +0000000000000000 +7ff0000000000000 +3ff00000000e0783 +7ff0000000000000 +0000000000000000 +3ff0000cdc2162bf +3feaa221a61084f7 +3fefffffffffff94 +7ff0000000000000 +7ff0000000000000 +3feffffffffffe59 +0000000000000000 +3ff00000000000f3 +7ff0000000000000 +3ff00170a30134b8 +7ff0000000000000 +7ff0000000000000 +3feae9fa26b1dc7e +0000000000000000 +3fcdc49ae4e7c1b6 +0000000000000000 +3febbe5c294b390a +3ff0000000000000 +7ff0000000000000 +3fef797c96cfe761 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +400e6aa1843885fc +0000000000000000 +0000000000000000 +3ff00004c60fd422 +7ff0000000000000 +0000000000000000 +0000000000000000 +3feffffffffffffb +7ff0000000000000 +40b383b7e3d344f7 +3ff000e9d8a4a739 +3fefff134854e570 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +3ff0000000000000 +3ff000000dc9a502 +7ff0000000000000 +3fefffffffff4275 +3fefd34c9e70a4e4 +3fefe01c92a28324 +3fefffe6dd104eb0 +0000000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +3ff000000001358c +3ff000006216aecb +3ff0000000000000 +3ff00000000287b3 +3feff8a3bf489240 +7ff0000000000000 +3fefffffffffbe57 +3fefffffffffffa6 +3ff0000000000063 +3fefffffffffffff +0000000000000000 +7ff0000000000000 +3ff0002c5b5f8ce2 +7ff0000000000000 +7ff0000000000000 +2c9449146e8677c8 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +3c29de3e3e03fd78 +3fefffffffffffff +3fefffd2baa9266a +3ff00000000003c7 +0000000000000000 +3fefbd53962a228a +3fefffffffffff93 +3ff000000009a024 +7ff0000000000000 +3ff0d0da6d6cd7c0 +0000000000000000 +7ff0000000000000 +3ff001694577d696 +3ff0000003880dbe +0000000000000000 +3deaf2c134576e60 +7ff0000000000000 +3fefffffffffffea +0000000000000000 +7ff0000000000000 +3fefffffffffff7b +7ff0000000000000 +3ff000000000000b +0000000000000000 +3ff0d88ee115dcf1 +3ff002735fc6773f +0000000000000000 +0000000000000000 +3feffff6a784f7ec +7ff0000000000000 +66dcc437fc739a42 +7ff0000000000000 +3ff0000000000008 +0000000000000000 +3ffba92642bb4aa1 +3ff000000aded765 +3fefffffffba764e +3fefffffffffffff +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +3fefffffffffffd5 +3feffffffff5cb46 +3ffa016b0b379860 +0000000000000000 +3ff08f142d524762 +7ff0000000000000 +3ff0000000000000 +3ff0000000e0f267 +3feffffffbc26054 +0000000000000000 +0000000000000000 +3fefffff83957ca9 +0fdcb97151d6cfe3 +7ff0000000000000 +3fefffffff795cb0 +7ff0000000000000 +37cd102a15677340 +3feff8d4e1744316 +7ff0000000000000 +0000000000000000 +0000000000000000 +3ff000000000844e +7ff0000000000000 +0000000000000000 +3ff0000000000d56 +3fed705c5361890a +3ff00000027a3c17 +3ff0000000000000 +3fef4eb3799ecc15 +7ff0000000000000 +3feffb797bfb72df +0000000000000000 +3ff45988656c9720 +3fefffdda1c48fdd +3ff00000000002ea +7ff0000000000000 +3ff01864b4de60d6 +7ff0000000000000 +7ff0000000000000 +3ff0000000000444 +3feffe2574729263 +0000000000000000 +3feffdd37b8c0c3a +7ff0000000000000 +0000000000000000 +3ff00000001e9de8 +3ff000000000012f +3ff0000000000000 +3ff0006624843c30 +0000000000000000 +3ff0000000000f14 +3ff0000000000000 +7ff0000000000000 +3ff0000095f6b34f +7ff0000000000000 +3ff000000000729b +3ff0000000000000 +0000000000000000 +3ff0000000000000 +4a384ccce522a366 +3ff0000000000012 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +5089aee365631efd +3ff0000000000000 +3ff0011ffa3e65dc +3ff0000000000000 +0000000000000000 +3fed7ef01fa7b0e5 +3ff0000011ba1e19 +0000000000000000 +3fbec2de61de47cc +7ff0000000000000 +3ff00015ca7c6d96 +3688732a98f9d8dd +3ff00000000884a6 +7ff0000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000656 +0000000000000000 +3ff0000000000000 +3feffbab9d339332 +7ff0000000000000 +3feffffffb18c61a +7ff0000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00000005300c5 +3ff00000026deae5 +0000000000000000 +3fd31a3a1eb44d67 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +3ff00004131aa4df +3ff0000000000000 +3ff000000000003e +0000000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +3ff0000000000104 +3ff0000000052ae3 +3e51751cd164bf5d +7ff0000000000000 +0000000000000000 +3ff0000000000022 +3feffffffffffd50 +3ff00000000012ed +7ff0000000000000 +3ff0002f190ae442 +3ff000324ba9095e +3ff00000034503b7 +0000000000000000 +3fab7db75addb964 +3ff978347e47977e +3feffffffff180e9 +0000000000000000 +3ff01bbb0f8bda28 +3ff84bde4e2b7506 +3ec8f2c737d193cc +3ff0000000000000 +3fef73c739991e17 +3ff006fad9f37a45 +3ff0000000000000 +0000000000000000 +7ff0000000000000 +3ff000000000de67 +302ee477e476130e +3fefffffffff64fb +3ff00000002a0412 +7ff0000000000000 +3ff0e2d0ba328d8d +3fefffffffaa92dd +0000000000000000 +3feffffffff2be04 +3ff0000000000001 +3ff17aba61b8997d +3feffff7b8c717d6 +3ff0000000000002 +7ff0000000000000 +0000000000000000 +3ff0000000000000 +0000000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +0000000000000000 +3ff00008def65c9e +0000000000000000 +3feffffffdf38c75 +0000000000000000 +3fefffffffffb514 +0000000000000000 +0000000000000000 +0000000000000000 +3fe57fe3f72f68b2 +3ff00000025139f7 +3fefffffffe94a77 +0000000000000000 +0000000000000000 +0000000000000000 +400dbc00a496b814 +3ff000000178f698 +3ff0003150e704d7 +0000000000000000 +3feffffffffffff5 +0000000000000000 +3ff0010f40b18ff7 +3feffffffcc45f2a +3fb61bd2068667b1 +3fef639b74dc6ddd +7ff0000000000000 +3f6a78fd656b9e34 +7ff0000000000000 +7ff0000000000000 +3ff00002edb91cf4 +3feffffffffff6cb +3fefffffff241ad4 +0e97fc6f4b2f7820 +7ff0000000000000 +0000000000000000 +41ab8e01e338f28b +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00000254aac94 +3ff0000000000040 +069243a48b7c2f80 +3feffffed7b17b59 +3fef69e1a645f340 +3ff0000000000003 +3ff0000000000037 +0000000000000000 +3fefffde3f058ada +7ff0000000000000 +7ff0000000000000 +3ff00102a0df2e58 +3ff0000000001131 +3ff000000010e5d6 +3feffffff4a6d231 +3ff0000000000000 +3fef522fe2e63194 +3ff0000039a8e671 +3ff00000185ec5f9 +0000000000000000 +3ff00000001338d2 +3a747822e1d026cd +3ff0000000000000 +3feffffffffffff6 +3feff43939768cc7 +4674a318d81e4a2a +3feffffa3db57396 +0000000000000000 +7ff0000000000000 +3ff0000000008577 +3feffffffffaacd2 +3ff001a61903e2fc +3ff0000000000027 +7ff0000000000000 +3feffffffffffffb +3ff0005398a49c5e +3feffffffffc14e9 +3ff0000000000000 +3ff00006a529b019 +7ff0000000000000 +3fb5696a6be8ea26 +3fefffffffffffba +0000000000000000 +3ff00000000000f6 +3ff000013dbe5ad7 +0000000000000000 +3ff0000000000000 +71c175d00dd5384d +7ff0000000000000 +7e84e66b49e74031 +3ff0003df8c690bc +3fa435d4862d3ace +4000dfca3c200289 +0000000000000000 +0000000000000000 +3feffffff413f2de +7ff0000000000000 +0000000000000000 +0000000000000000 +3ff017f932a20e6f +3fefa83908d74db0 +3feffffffffffff5 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff000000002e179 +3ff000000000035c +7ff0000000000000 +3fefffffffffdfd5 +7ff0000000000000 +7ff0000000000000 +0000000000000000 +3fefffffffffffa9 +3fefffffef5dddb7 +3fefffffffffffff +0000000000000000 +417f2df7e3c7df4a +3ff000000000005d +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +@log 1255 8eccb847d93b4bdb +0000000000000000 +3cafffffffffffff +bca0000000000000 +3fe62e42fefa39ef +bfe62e42fefa39ef +40026bb1bbb55516 +3ff0000000000000 +3ff250d048e7a1bd +c0874385446d71c3 +c086232bdd7abcd2 +40862e42fefa39ef +c0874385446d71c3 +c086765958b6e72b +c085a92d6d005c94 +c084dc018149d1fc +c0840ed595934764 +c08341a9a9dcbccc +c082747dbe263234 +c081a751d26fa79c +c080da25e6b91d04 +c0800cf9fb02926c +c07e7f9c1e980fa9 +c07ce544472afa79 +c07b4aec6fbde549 +c079b0949850d01a +c078163cc0e3baea +c0767be4e976a5ba +c074e18d1209908a +c07347353a9c7b5a +c071acdd632f662b +c07012858bc250fb +c06cf05b68aa7796 +c069bbabb9d04d37 +c06686fc0af622d7 +c063524c5c1bf877 +c0601d9cad41ce18 +c059d1d9fccf4770 +c053687a9f1af2b1 +c049fe3682cd3be4 +c03a56ef8ec924cc +bfe62e42fefa39ef +4038f40b5ed9812d +40494cc46ad56a15 +40530fc1931f09ca +40597920f0d35e89 +405fe2804e87b348 +406325efd61e0404 +40665a9f84f82e63 +40698f4f33d258c3 +406cc3fee2ac8322 +406ff8ae9186ad82 +407196af20306bf1 +40733106f79d8120 +4074cb5ecf0a9650 +407665b6a677ab80 +4078000e7de4c0b0 +40799a665551d5e0 +407b34be2cbeeb0f +407ccf16042c003f +407e696ddb99156f +408001e2d983154f +4080cf0ec5399fe7 +40819c3ab0f02a7f +408269669ca6b517 +40833692885d3faf +408403be7413ca47 +4084d0ea5fca54df +40859e164b80df77 +3cafffffffffffff +bca0000000000000 +3cbffffffffffffe +bcb0000000000001 +3cc7fffffffffffe +bcb8000000000001 +3ccffffffffffffc +bcc0000000000001 +3cd3fffffffffffd +bcc4000000000002 +3cd7fffffffffffc +bcc8000000000002 +3cdbfffffffffffa +bccc000000000003 +3cdffffffffffff8 +bcd0000000000002 +3ce1fffffffffffb +bcd2000000000003 +3ce3fffffffffffa +bcd4000000000003 +3ce5fffffffffff8 +bcd6000000000004 +3ce7fffffffffff7 +bcd8000000000005 +3ce9fffffffffff5 +bcda000000000005 +3cebfffffffffff4 +bcdc000000000006 +3cedfffffffffff2 +bcde000000000007 +3ceffffffffffff0 +bce0000000000004 +3cf0fffffffffff7 +bce1000000000005 +3cf1fffffffffff6 +bce2000000000005 +3cf2fffffffffff5 +bce3000000000006 +3cf3fffffffffff4 +bce4000000000006 +3cf4fffffffffff2 +bce5000000000007 +3cf5fffffffffff1 +bce6000000000008 +3cf6ffffffffffef +bce7000000000008 +3cf7ffffffffffee +bce8000000000009 +3cf8ffffffffffec +bce900000000000a +3cf9ffffffffffeb +bcea00000000000b +3cfaffffffffffe9 +bceb00000000000b +3cfbffffffffffe8 +bcec00000000000c +3cfcffffffffffe6 +bced00000000000d +3cfdffffffffffe4 +bcee00000000000e +3cfeffffffffffe2 +bcef00000000000f +3cffffffffffffe0 +bcf0000000000008 +3d007fffffffffef +bcf0800000000009 +3d00ffffffffffee +bcf1000000000009 +3d017fffffffffed +bcf180000000000a +3d01ffffffffffec +bcf200000000000a +3d027fffffffffeb +bcf280000000000b +3d02ffffffffffe9 +bcf300000000000b +3d037fffffffffe8 +bcf380000000000c +3d03ffffffffffe7 +bcf400000000000d +3d047fffffffffe6 +bcf480000000000d +3d04ffffffffffe4 +bcf500000000000e +3d057fffffffffe3 +bcf580000000000e +3d05ffffffffffe2 +bcf600000000000f +3d067fffffffffe0 +bcf6800000000010 +3d06ffffffffffdf +bcf7000000000011 +3d077fffffffffdd +bcf7800000000011 +3d07ffffffffffdc +bcf8000000000012 +3d087fffffffffda +bcf8800000000013 +3d08ffffffffffd9 +bcf9000000000014 +3d097fffffffffd7 +bcf9800000000014 +3d09ffffffffffd6 +bcfa000000000015 +3d0a7fffffffffd4 +bcfa800000000016 +3d0affffffffffd2 +bcfb000000000017 +3d0b7fffffffffd1 +bcfb800000000018 +3d0bffffffffffcf +bcfc000000000019 +3d0c7fffffffffcd +bcfc800000000019 +3d0cffffffffffcb +bcfd00000000001a +3d0d7fffffffffca +bcfd80000000001b +3d0dffffffffffc8 +bcfe00000000001c +3d0e7fffffffffc6 +bcfe80000000001d +3d0effffffffffc4 +bcff00000000001e +3d0f7fffffffffc2 +bcff80000000001f +3d0fffffffffffc0 +bd00000000000010 +bf7b832adaf5abdb +bfb5da370f8a3b8c +bfc4fe1db8b28e34 +3fb4220461dae0d7 +bf7b832add39ddac +bfb5da371079f690 +bfc4fe1db99027a5 +3fb4220462a658bd +bf7bd194d5a1ab8a +bfb5fa8845abe015 +bfc51bfb9efed2b6 +3fb43d6ef851c55a +bf7b6e0bebedeb34 +bfb5d17b6d05938b +bfc4f60b0da6242f +3fb41a9aae46b4d6 +bf7b6a004df9edad +bfb5cfcedec9256c +bfc4f47edc595602 +3fb4192ed9e98698 +bf7b8227dca5d24d +bfb5d9cc0b32ee1d +bfc4fdbacc4dbf8a +3fb421a98d6890f7 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +c07be5d289f0850a +c0716ce172502d5b +c05d953d1c13cc3e +402dd2ed47c9de43 +406a488d53c73ecc +c043680bc8b44339 +4079561c722bf348 +c077523b0b50de9c +c0595f215e0c54c7 +4032234ff51012eb +c0780d26b0b7f699 +402bbf45a08dc2f7 +407eedb4dd401347 +40748f0498ee1c43 +4076c273148de7c4 +c080433d71bba437 +4040ec6d1d3a906d +c070cd141fd4d5c0 +c083cd38682d5f44 +c0859797ecbf60f1 +c04f4b057c1cd080 +4034f6504cd7d146 +c0646b3754337632 +4064e8bdeeeaf2aa +c072e5ef29937e61 +40456a7f1c9f6fc0 +40524191039b3842 +c0785976449759a9 +405843c1e0fffbc5 +c081784a80cd0e78 +c0849f93ce6a8bce +4082ef245240d637 +4075a382e1545ccf +408477886087fd2b +407732cd7af97dc7 +c070bed71ea88513 +c065dab1a79dad4f +c0801d69e5768808 +4083bbcee75f7fe5 +4073526186ab1ea4 +406abfd3075f56fb +4084464a8f68cfd8 +c07fb4968c6eeed3 +407966abee7c5f36 +c03a61664f5fa8d9 +c0818f60c09a4187 +4071a5222b3c709c +40726ceb1e039345 +c063f1ef628e8795 +c063633125a00ca4 +40793edd0328034e +c0835a554f5b76e3 +c07e63bfcc127f19 +c05ae079228babbf +407da6432f4095e6 +4064b1ca4448dbab +c0846f0e5b52c66e +c03c10978d9073b8 +403414e4b3d18d32 +c074f7849cb6ea79 +40782d865b0294b3 +4070b220b94dd28a +407244d352b18f10 +40775ad391fa0b24 +4083fb70d95a3d7f +c0826e5aace0f77f +407c719025c4cc38 +c06fc1006ea7a91b +c0788383da7f7b18 +c046e8ad5847895c +4052ed682531978d +408470e9b847f91d +c034750cfcf914c6 +406be7c0319e0be5 +407a1b599dd7628b +c0714136276f63a1 +c0694397b8b6d385 +c0778d23f16f3ed6 +40604b69a7b355e9 +c08031f5f09f4a34 +c084e5ab2df1e382 +407b5a86aab5f77d +c0850dad972a5b18 +407f692bac56a794 +40454f1dc730cad1 +4082cd3cc0dce15d +40357d1e4fdcad51 +c0827c6fb4be5d01 +c06cf5e4636c3267 +4016fc49c924b004 +c079eeb8a50574af +c07f72f33b3c6fac +c076ac47b678859e +406fbde85b8937b2 +4080f8483af7197e +c07bfe77866cc671 +c06998e8f31988d0 +4074c768f731de09 +c082a20735f6b429 +40676994f1c61f2c +40659764ca0504ce +40857e3166bcee75 +c0847d792dae96a3 +c07e4e32f706bc84 +40851b984be4326e +c080f5ffd545f9e3 +407a02c3587161cc +406571ff15fca678 +c071810379da3f7e +c0796d9fa692f222 +4073d294c6d6b6dc +40648146523daaa5 +40454f8745342424 +406b0459f7e9a147 +407249183f3c5f1d +c01c28bc91ce366e +4082cb1f86fa211c +c044cf605112b639 +bfd2077d66d8d353 +408206248a545d2a +c0813f2179a36c0d +4067b79200d4d5cb +4062c71f308ec06e +406564e33b385170 +c07bd76d1a71b702 +40808ca49668d7e1 +406cdb879e1ce03d +40664f89dc46f931 +4068085a6235643d +4066fd11f29d6dc0 +c0708d747dcde454 +c0791046e0bb426e +c0683dae1457f140 +c078e2c93275e821 +408245f68ac81b4b +c066b0b5918ea287 +40834bfea522819d +4041174c56eef2ca +407d40aea89572f5 +4064d36613480fe7 +c022432731941293 +4075c5f52ec7a05e +407a28d8eacf1686 +c07212e65c16cc5e +c0727924927026b7 +407d21eab0002399 +407a26bc37284383 +407117b5bf84426c +c081bd7185766249 +40772c22662f8222 +405d1714f4dda5d2 +407e0feed129dc72 +c0842a2d13a3442c +4082e758e299c382 +c053fe973c953c3e +405c2f51bfad27e7 +c073fb5cf34cbad5 +c0820d5caf7a8bbc +c080b70287c43175 +c0738eaff238aab0 +407fc8dae9df45f7 +4062b307cf2d8486 +407efe6ddd3675c1 +4015b690cc24620d +406c791bb834f7a3 +c074e32754738be3 +c0834bd37e3f5f6b +c06d8e9e5785a1e2 +c08519a6fedb2a13 +c041204a15ffff51 +408197dfa99dbbd4 +c082754401678f82 +4067ba3f541890c8 +40810fb0436027b2 +c082daa23e4c0ab3 +407615c4c5be4459 +c0833a551db294dc +407a0a46c5db3253 +c072d6553bd339c6 +4053379b4675dd76 +c0724f746162e9bc +404a5b340c2c55a5 +c06111e5690f573b +4085109c42cd693a +40784bb0eb1baa31 +c07f2f4982aad67b +c0739bc62ad366fd +40662a32b74045e1 +4077aca559838191 +4072f2389c07033b +c052587da0a23dd4 +4060e89b9718acdf +4059245ce2501404 +c067cb8a0283f8d2 +406ff95c32f5f573 +c07f2ee768b38202 +c05f5323dd801c5f +405b32ddbcdfc34b +406cbad219f29ee8 +4084ea7b1e1b1c2e +408025344731d850 +4047b67e97b599ca +c053f04af999fa1f +c06a077fb0cc9ff7 +c0817f65382ef044 +4066a6e38f6c7cab +c038bc2e61ccbccf +4078495a08fc4510 +c07beb64db439b1e +c07ce1c83ae10a89 +c0647f6b964dec97 +c07e545687a8447e +404205e95c88e83c +c0805f7a7cccf9d9 +405e30be083825f3 +4044cb1427b9c3c1 +c081a4539672bba2 +c06ea9df357b1efb +4070d510f4ecac37 +4078ffe840d63ffd +4071989ef75e8191 +4032c0bee005bded +c07c9bf86088941c +c082810c6d26e3e3 +4082d4de448fe32c +c0817e2411360cee +40570c3602e906a8 +40581100ce02924a +c074ef7bef530d53 +40594b762e3ac1a5 +4059f48dc8307d5e +c07b2ce75452c3b5 +c063421be660d31f +408320877152ea79 +c036a75168408627 +c0838e0ab74dc2ac +c082c4b7c5f089dc +405bcaf79e02280c +4080ba8205164275 +4083eba774f14052 +40724fe3a0688363 +c065046f81c3339d +40729acc21830c71 +c078cdf18aa4acb0 +406cdcc63bdf3654 +c07eb6daeeca539f +4082ceadf5946262 +c05fa4cfcf96dff5 +4085134131811c7f +4052820165ba8361 +c042ccaba6a887da +c07ded03d619e526 +4084a52136b5cc6c +c07ed8979d159ada +c0772c204131b82c +407be7b0f2c309f0 +4082d18bac5572c0 +c07cfae946544a54 +c075cdafde01f403 +40731d26ca07b9b5 +407b6f2b01e44c44 +c074f18a757a8910 +c06c168c064afe7c +c068db884f823122 +407721b1f8a85187 +c074fd1c01888701 +407bc0f033564237 +406cc495cda2edde +4073de34421b6e08 +40681dcaaa3e117c +c07fa6031f09db1c +c0684234f7474cb6 +4060aaae253b479b +c066df4ca6e40f19 +c05355d66b5b94ec +4078ccb71c7d041c +406111bb500d6593 +c07bde18d98baa53 +4051950271d9f92e +40831c0087d92be4 +408125bc967dd641 +4050a458aa7c4405 +4072759a0487befd +404b13bb8b9f894b +4059b65ec7bba695 +4080f50bad8409cc +c07ad0fd8a1d992b +c073c8f1068104f1 +402812a2c59a9b93 +4074b8346a46edb7 +4060def4f4c6a040 +406b4aab991e89c5 +4079720195d86e50 +40823056ed103e63 +c060d146425be788 +c080147064f671bc +4071e98ccefd1925 +c084ce631a07c8c5 +c07dc1eb3917dca8 +c07608b59d623b2c +c0609888b179a3b1 +406816cb6ab44482 +c0741a6757c969cf +c07bd1c01006ab64 +407a9349c1b7c442 +c07968ef46835a0b +c057c2860c91a379 +408004dc764a4d30 +c062ff929ca41fe7 +c063a6f68755f49a +c0850a38eb836822 +c0243ad73895d351 +407c5fa3b9f15759 +c06da161b5b89c7b +c085527a578b12c9 +c07fdb61a94de592 +40710ddda2e8b39d +c0713e12a18702c5 +c068d5a2d1b31c1a +407a7cffed645627 +4071e3a3012deea9 +c04dec41208c8d9b +407678fc559b91bb +c076d792d0c20893 +c07df08ad05c745d +40776c70dc992435 +c07430d81f570200 +c0851904fbfac884 +40557eaf5355bf21 +c0616a66eb54a989 +c07471fa182a3a1a +c083ff20f0130f4e +4072125e2c4434f6 +c0859f535e89ad93 +406c50213a2c43b9 +c060cf34bf78ae96 +4025aae4d95d1946 +4076f9ab4bbe7f74 +c06202c789f175b1 +c081d84e12342e2d +c05332ee30fb489b +c07a950723437c1f +4044d64aa41451e6 +c08004b5c6ea6991 +403a7ccbdfa38e96 +4080863e4a9f9aa4 +4060c2047957edea +c07d9eb48683dd91 +408211a8c744ed25 +407d0342dd7e91a2 +408402575fdde75f +c059927016784b0e +407e399e1c9d730d +c08218627368ccff +c06facf224b7716b +4076a969fc0eb466 +c0731a65a09f6c6f +40623cb76a40543f +4066f23a5d781ba8 +c083990894154f81 +c02158326bb61ea9 +407f0baf6a66c40b +c07f3e95c92e79b8 +c07dc3badc5bac4b +40726677ae7315cd +c0626e539e7f8df4 +c07abe3e2003d9a3 +c049ea4de3373282 +c078ebb8ea005a60 +c0672ae851bff26b +c0828d902f49149b +c06bb017a77672e2 +406b1f1521f848e7 +4082a638b08892a0 +c081ee870715a4ad +c073172a91ceae4a +4060662e50244e79 +407a9007c243bf10 +403ed83ddff86c94 +4045fdce94d786f9 +c06b9995215535dd +4046144882dde01f +c070bbfe9184cbf4 +c06010680d485c46 +406f326691349383 +c07d2c2c4436a650 +c0538e922a8410f6 +406877e0f2d28af9 +c0808bd26eed67db +c04c2bea029da9b6 +405558b49ca7fd89 +c04d1256b577ead8 +40660380644eb8de +407a45733139c7fc +c07d87122059261a +c077567c86285d52 +c0818567842bcb9d +c063302c8f162de9 +c065d01ea1cbdd3d +4080d90741be88c9 +4082eb8b8a913717 +c053596decb76796 +c068130102d9ced7 +c04d176d9ac9d0c2 +40582fcd36002726 +c002af4471f44ed8 +4062f2ee0d5ef386 +c064cede3fdb8516 +4073220f233d2817 +4084e3c44f860ec2 +4078ac4dde901bd1 +4032eb43bb7855b7 +4076967eb19058e0 +406bf35d842a225e +40824885d123d68f +40837d22c8f0dc82 +4042be4c4758cc89 +406ff5b85df042b5 +c0831405037e4998 +c083b592f0d62f2d +c06a8d68e5891ab2 +c0749a651082aa2c +40676a014d787694 +c070400ab2023c4a +c079214c475cfb03 +c0762a266f962278 +c076c0387630956a +c082c1951b7b3bf5 +c0711d28c06cec70 +c0808117d98a591a +404b44fac1d08c3e +408454a7bdefb094 +c068acf22bc6de85 +c07a0c901fc39258 +c024e1d9f0d4a81e +407f52dc99e1758a +40469fe9105b51fb +c084c47a0df06b7f +c08059284584c0d2 +404d2728eb14279a +4076d8d5fc29430d +c078be76e4a24f3b +3fc266df202923a0 +c066d962c9210d46 +407b0ca5059c306e +c064c89fa1e0ec34 +4073509c8b48aafa +407d9b495764e97d +c04f8bd91f3a17dd +40738530dcb55eb2 +4085436bead94cc5 +40543cb443141512 +404121b4c5ecc9c5 +c01c1ecc231e302f +c08108218ea7cb7e +c07be7ac7f07983d +4077011b1618f3a4 +c05184c257bc6a07 +4084da7cc070b5b2 +c0713601787738e1 +407146da7df646c4 +408297e5ec5fed33 +4084ac8336696654 +c060a83c1e54cc10 +40844112c8a1ba69 +c0753c81db5cdb7b +c07bf7f08edf8686 +c078851554855e21 +407ea75baf30edcb +3ff34d0b40845f10 +408153d3a1aa4979 +c079c1a9ebf95d2e +408340b715f64ee8 +4081325d860b7cd1 +c0833eec4017b242 +c084deaba4cf6ac6 +c07fdc124106b8a4 +c06352dd7bf77628 +c07d1d5be078d821 +c080e0a8029458f7 +c05ab02be71aebf0 +c080995c1f5e7459 +c08054e83d87a6e3 +407d76176daa72ef +c075bcf8fbcd5e07 +407e0e059ac7a666 +c082fe9b68f4f732 +4077e983ab5d798e +c07582aa69907010 +4061b1f504fa7971 +407e11f0b05f0920 +c083317f8c937387 +4074093d6d1532df +c08401ac8b9a9a66 +c0816afe859a1ae5 +408409525ae56dcb +c07745b442fa72e3 +c07040900e16a2dc +4076e770dff9946c +c081c04ff8d1f935 +4083e150bc1c784d +c03f291928e2c533 +406594b8573ec7ee +40788ffb171d74fa +408576720d600740 +406ce558107ed490 +c0743ac022425085 +407186274c5c43c7 +403041809554103f +405e688a36ae2853 +c061aa326f24ff09 +406f730f2ac0ec22 +c05460c5b695784f +c0817dcafaec4c6b +40545afaf72c0103 +c07328f8193bb53a +c07020c372762e98 +40801153326a9c24 +4057887838a4c140 +40686d6a54460734 +c078a72bf32f5ec1 +c04ddf6788749a21 +c0719a8450343c7e +406181691d6091e7 +c0825b07ab7fb84e +c07a881d2959b487 +405dadd788414c13 +c07f2fe8af4b4971 +40751ebc912db20c +407acc906d55d715 +c061902d90fed2d8 +40623f39064ee19b +40506a3ead260d8c +406f9afe48ac3437 +404d575550d30fe4 +c06b109da4a44abd +c06fad3fec8eb1da +c08312ae8b7f6266 +40451effa35c7c53 +406658f5a2ec6920 +c0833a370e8117f0 +40744dfc9f5b5a29 +c057964f981f834e +c08430033c59e93f +4073a5b59a6a9134 +4084199ef952d1bb +40779f80e47e06e9 +40699504c0bc82ac +407f6599c86ea619 +406883a0116abf3a +407d686e7db96705 +40779acbf34211d3 +4083783ba9952b56 +40856a5543bb3ba1 +4083b2809f529d69 +c085a3491bdc3ec8 +407a5714481d13e6 +c06e0159ecc93edd +4053d4dfb4b2caa6 +407b20f152e4f578 +c06449af144fc8a0 +40599cb682d1293e +c07c277cf829a317 +c08152cdaff0a9b2 +4075726e7ee8211d +4070f7b36cd8e634 +4064edf3facc3e51 +c07683e87cdc3618 +c07fa688ec89d5f7 +c07ccfd327098ebc +40851ce525220ae1 +4067a0a603ef7b9e +c06c3422c3d86bba +c08167b456717411 +c07312e3751a2c2b +407ec9eb7f847a06 +407f2be22ed6434f +4074d0b97c49cd06 +4077487a33c99c34 +4076ca00e001fb54 +405030689f7f1a3b +c05feb6ac6660144 +c0638de215d85d07 +c071a69e7611e4f9 +4069d49eaa2d3d9e +c08226ef3dc19217 +4076cf3ec55f1fb0 +4077f8aa3311a49c +4044713e0388f0b0 +c07940984215c2f3 +4072b8ae7ae48aeb +40812425df6906f9 +c0458eec08c36221 +c037df569b891ec0 +c071a9abcd3a860e +407868d487f2f022 +c07395dd797c2caa +40617adb5e9f5496 +4071b6cd35494e1c +40783a4be74f34a0 +406a5aa2bf46de4d +c071fd6d5ba4452b +406d9f755bb832f3 +407ded2fa212be78 +4052812c2c13186b +c0808c542f7b67c6 +c080422dfa53a55a +4071728f7b47153e +408300becc6618f4 +407be3a857f8cf84 +c076b416d33935ce +c07f5d944527f55e +406faef067628dd4 +c07559241e9ed810 +c07c0430d55fa1aa +c0809815737669a6 +405773a69b3af6ce +c0806ab503e73407 +c07f55c29fd384c6 +405665012731b1b3 +4058f23030498f85 +c080f54773ac006e +402c74e043433e18 +4085915b7590c692 +40822e0950719a2b +c080a97360c3abfa +c07799664b9b45e9 +c063ff02b9c07c02 +405cbc15b8882b96 +406908e9660a26ce +406d7231d4c46a75 +408063133a12aaf2 +c079036639a58b5b +4062722771d2cb3d +406d50852c24548a +c06f82e2b6d92236 +406fb43f4d8163f6 +c08340b4d21d4a68 +c045b0447778784e +406998442c84cf17 +4074b7d469ffb3dd +4067b8df7529afcc +40723b7f5272d4b8 +406857b9a42e3cd3 +c0602ae52cdd71b5 +4075af35a22eea62 +4078bb9a510535b3 +405a3b07682bb789 +c07c50a992cfe112 +4072bb83ccd86c61 +c0801b46327a1980 +40771f35b625e5c2 +c080ed3643596516 +c052231cad17a305 +c072666488e750a2 +c0824dd05601ee14 +c0605246f94e394d +c05e67dafd7b1132 +407ec7013a2eabe9 +407c203ff825c265 +c0846db0c7e65673 +4080d6494c8fd47c +405cdf3a598be906 +4072c9ab47a59cce +c0529b3b0db14d6a +407a60f3e3f8e7c7 +c07332432a9f2c17 +407269bb6a0acb05 +4068b5bc02f78f12 +406b2fa252a758b6 +c071d34ea7636016 +4083888a38b18fc5 +407fc94bcd4db0ec +c07138cd9f560e17 +4072b073facc5ac0 +c07e608916648c96 +407ca657e456ef82 +4064044a1ee9e43f +4053ff4bef9f846a +c0811013ac52dd09 +c070d71806c7f053 +c06f3d31e16b9924 +40571a0d92f0a591 +c07903c8c1c6c54e +c06ca52f7596d44f +c04cf33d8d1070b8 +c0501533fd06efbc +c081532ed1ffba3d +402a958a71884f12 +c06d6bce1dbd9335 +40685c9594d7497c +407ee0667b30c0c1 +c084c4859576a1aa +4080058f508ff1b6 +407eefa1214cf46b +c061e4635f3cd7e7 +c054ccdce837de7e +4076b5cc4d7ce3d4 +c07d7b8bc1ac6d61 +408308df402faf1a +c05467bc0770ad27 +407a4321befa6202 +c0787a5af3e75cc6 +40715f355031f6ca +40821d2f67710849 +c073674e4cfb9967 +4082ed3789837371 +c0792776a7e9e5ae +c07a0ae26144bcd4 +c066c2a593d8bc7d +4076ae34264c0162 +4080f2a14896e2b6 +c06d6947c773e713 +40810efa6d25539d +c0774ef3a2281a14 +407a80f167b753d5 +406394260a1071ba +407d27baa4a5e18b +40658fae3e52dd34 +4070f61ba7c3140b +40805fc91c643b1f +c004d57ec4822d13 +4078141b73414a16 +4073f978e5aa2f1f +c07bd93852663511 +c0755d822b5017de +c0608c44ca844918 +4060914f412ac74d +40807b7d6516f61f +c07a9c895df11a95 +c0172218aa6fde7e +407b8d7ca22f56f4 +c06bf678f8f8d6d2 +c07c9a01934bf319 +40694e3259ca0334 +c03f1b6644299f4e +4066ae7bdcf6480a +c084ac2b3e8c7d90 +c066e48e40034797 +407078ca11dd41de +c08399da69dc4190 +40850774fe8d6b59 +40754e60fe412b73 +4039bbca2217751a +c07190b916c50026 +4056acfb3934bb36 +408596aac1064d1b +c07a55866c3621e7 +4067ce56b0b0f76b +c0612340c53a5569 +4078d8dc134ca605 +407aea039092e8a4 +c064b3afee358e26 +40803eabe0618594 +c06a0bde5dbc483f +407e0b91291c86ec +c02cb8eb09beb635 +c02785dced9b720f +4079b9ada247c3e0 +c077dd8e27759919 +c0785fde8596d52a +c0713ddaabcf852b +c07e959426de9727 +40744f199a5b6f59 +c0859fae66a363a0 +4080a438e10a30fd +4082ca197c06ad22 +c0853400758a2ec8 +c083ada668bfd3ef +406bfd388c9cecfd +c045ba175db28276 +c05584471dbd409f +c0698018fd28d43f +4053ee9098dacc8b +c08199672abbf334 +4067abbebb60c5b5 +c08181c355d9d307 +c072d55440a536cc +c0859b28e05fbc70 +c05ba91688ad9e24 +405d71c721c6126e +4075a366e56419fd +c0507c3b8437f3aa +c066bb5b39c46129 +c074439a17a0cfe3 +c060aee908563432 +c03859309d738aab +c05d9362d4aa9285 +c048ffa17458deab +c03ecddc0f890565 +c05b7aa572bae570 +c081f5df19a435d5 +407be12cf3a2ee79 +c053f9363451dc29 +407aa1e85ccb0a1f +c071c6d568e72cc9 +406ac9332cfcfdd9 +c07bfea4ad83d1ce +404a91afcedb1234 +407cbcf69e4e8562 +406b7b4e8c4956e4 +4065507c42fe19f4 +c06ec8be8e16783d +4082e9cd8afbcd49 +40710bafd988f3fd +408352cbb85597e6 +407888eadcfcca1f +40638dae93b9e799 +4063610fe9a5e240 +c0440730023055d7 +40789e07f505a84c +40578b7e05452d65 +c0739cd53c7dbbbc +4081e19beb5ae965 +407b2eb7ed1b91f3 +4082680b89ae5e48 +c06f5ec2417b952e +406d5c1465ed7879 +4018079877b85404 +c0810e35aac58cdc +c0722d384205b053 +c079929d7ac39441 +4066e5b96d6a20e5 +40407c938211d0a5 +c07fdfe485712038 +4077f7a9a2029455 +c07d645e538c1a02 +4084f0bdb2d0dc63 +c075e79855e848b6 +c083ccb73be49135 +c07c041bef555ffb +4082bd5c5c8d7a62 +405b93c6e383b211 +c0708285cfe058b8 +407935ab2496cb30 +4083fbeb94aa75c7 +c05cf2c982068847 +c0554f9f5bd70ab2 +c06c0977ed0459ce +c07b16d94fe00824 +408084a50243e31a +4070715290b98a4c +c04ba7595e5730bc +c0574bd79ba61586 +c06fb0f17e025dee +c0851f63ae1ac4eb +408163b808f1d930 +c06eda4d0bdfedcd +c08518527de83d14 +4052dbe8f60279a6 +c08145acb9b15dc6 +4072758da860bf14 +4085717b5dc324bb +c05bceface738138 +4081f0527060dbbc +c081ce0383246220 +407bcb1a044d7042 +4082736e9937dd4c +c0840b179339a4f6 +407b9c188f0f8cfa +406140b28f94ce8e +40811fef5db477d8 +4084eb3e015a62a5 +c05b33d1556c5bcd +40703f54229439b9 +40758329cbef7587 +406deb7545a09b3d +c076f355fc1cb1a2 +4076dd21f9f84805 +c0605a0806fa13de +408535a982590254 +c07ffa4d4676afc0 +c0758f3f98ef1a06 +c0725dd13f7fec5a +407faa9560c0f441 +c07c80575e967da6 +c072d0aca56fdc35 +4082176f8805d2ad +4074cd4422ed71ee +c06aa56f9e64292f +406da438ae8f1ae0 +408123e1edfac942 +c04360189755e466 +407a456e84471076 +40607b69947a60bb +c072f621eee239ba +c0843a0a5cfa0a29 +c07b1cbd165b044b +40835a8b3ae156b8 +40668a3044728c0f +405863259a197f9a +c0854484a4cb24b0 +4056346ae1516f14 +c077f747b9a71cfe +406be8720d9505a7 +c07bed31748ce542 +4078ed106e4b293c +c075c40cbc131a5d +407ee04a60fb94da +c081f85716ea8703 +c08301dfcae7338c +4083c7034961c526 +407c79d4269b0bde +40815bd79c623065 +4046169d1297eb2b +c083097d14fa7b2c +4072df7f517a182a +4083d4e7b1c3c82b +407e0ebef6a966a1 +408154896893fb03 +4017fde6f72301e8 +c063d640f776a8de +4064b4356050802d +c07f44a318342d96 +c0359513bb7f9a67 +c0651ae73029fcf2 +c07525a7a07ec60b +c08515749a939e04 +c07a6eb6900d5db7 +4074b6766f969bdb +c080cc602389db80 +c060c03a6020636f +c069d58d4033a4ec +40630c5730cf0d06 +c07baefac55f362b +c0760655445899a0 +4069258df4cf0212 +402c3dd3fc46a6c5 +407706ffa6f8f841 +c08317aba45d8113 +c03da8d683725f1d +c081560d68d8e330 +407ef010f24c0ec6 +4060ccb39b48884c +408418aab2479ae8 +c071ba3ee52c850f +c07df1e3ec5550d2 +408185fe224a9b4f +4077a37ffea8398d +4068a27653123669 +408396aa965cec1c +c07213924b1a9706 +406e788f07978ba1 +c082089a35299b1c +c06b1395d8f37e2a +408591d68c91662a +407ceee7b4ae06ac +40429b5bd3cbbdfe +c051edd441d00574 +4056b277dc471fce +c079fb206135d40d +407d4292cf0b5c44 +40642968974b5ffc +c07ad0db22281220 +405dfb11177268a5 +c07be08ce6f243bc +407cb68e58efbb07 +405845bc12a80949 +c0756c514d7fc9e5 +407b118bdc63780f +407561407dcd6b79 +c084bc0c7bde9259 +c082208fe8a6ef61 +4078977f0c46f7f2 +c0821971dd3ecabd +40809c156cb2ad6e +406eb71a7c2db0cb +c080b8918db3a157 +c06de209835946bf +c0406a80e34bb768 +4084b732d98c1344 +c0608baabc0b43b2 +4083fce5ae64400e +c07f4ff375ccb873 +c07a2e71ac22c1e9 +40858dbe2a1a7f57 +406965cb55037e80 +c080fa8017920265 +c07a3e21e480b5aa +c08210829f56683b +c0813943b0f8cd8b +c074375425a0c3aa +4061964786d47244 +c0610ebbc811254c +40642484bc580f4b +c084a80ce1abc6d1 +c0753f01a8f4df8e +c0576fc1bc689d51 +c061479097779914 +407e15b949755f74 +407dc2c7fc0486e3 +c07867c5adfbdfbf +c075a9e0decebd7a +c07776c7d7637a74 +407709c41f83e4fc +c078b7cc4c759eea +c0796ec46c6bdc0c +c082397ac5499e79 +405c7aa8c73de932 +407ad49400550845 +c07a9b3260458db8 +407e09a277bbddb8 +406691da6445d9ad +c05e3ceb1e521183 +407b60d4b017c3d4 +407f3e4f6cce3376 +406738eb0d1f1654 +c0756115a7ecae25 +407a2b14cc0327ce +406fd447902b1587 +c0632546385129b8 +c072c4d6d4a614e3 +407711005cddcf38 +c03b920dc410dc67 +407f2a3b5c534a9d +407cc3f838189edd +c0733f1d0c6daf7a +406e573112e660ab +c074b6611e8b5c47 +408172c55a7ddf8d +c0597e1f00c21367 +c058ea48be67b372 +40847c680f06589c +c074c4ee76e752ef +7ff8000000000000 +7ff0000000000000 +7ff8000000000000 +fff0000000000000 +fff0000000000000 +7ff8000000000000 +7ff8000000000000 +@log10 1255 8eccb847d93b4bdb +0000000000000000 +3c9bcb7b1526e50d +bc8bcb7b1526e50e +3fd34413509f79ff +bfd34413509f79ff +3ff0000000000000 +3fdbcb7b1526e50e +3fdfd14db31ba3ba +c07434e6420f4374 +c0733a7146f72a42 +40734413509f79ff +c07434e6420f4374 +c07382b08f65804b +c072d07adcbbbd23 +c0721e452a11f9fb +c0716c0f776836d2 +c070b9d9c4be73aa +c07007a41214b081 +c06eaadcbed5dab1 +c06d467159825460 +c06be205f42ece0f +c06a7d9a8edb47bf +c069192f2987c16e +c067b4c3c4343b1d +c06650585ee0b4cc +c064ebecf98d2e7b +c06387819439a82a +c06223162ee621d9 +c060beaac9929b88 +c05eb47ec87e2a6e +c05beba7fdd71dcc +c05922d13330112b +c05659fa68890489 +c05391239de1f7e7 +c050c84cd33aeb45 +c04bfeec1127bd46 +c0466d3e7bd9a403 +c040db90e68b8abf +c03693c6a27ae2f7 +c026e0d6efbd60df +bfd34413509f79ff +4025ac95bab3693f +4035f9a607f5e727 +40408e8099490cd7 +4046202e2e97261b +404bb1dbc3e53f5e +4050a1c4ac99ac51 +40536a9b7740b8f3 +4056337241e7c595 +4058fc490c8ed237 +405bc51fd735ded8 +405e8df6a1dceb7a +4060ab66b641fc0e +40620fd21b95825f +4063743d80e908b0 +4064d8a8e63c8f01 +40663d144b901552 +4067a17fb0e39ba3 +406905eb163721f4 +406a6a567b8aa845 +406bcec1e0de2e95 +406d332d4631b4e6 +406e9798ab853b37 +406ffc0410d8c188 +4070b037bb1623ed +4071626d6dbfe715 +407214a32069aa3e +4072c6d8d3136d66 +3c9bcb7b1526e50d +bc8bcb7b1526e50e +3cabcb7b1526e50c +bc9bcb7b1526e510 +3cb4d89c4fdd2bc9 +bca4d89c4fdd2bcb +3cbbcb7b1526e50b +bcabcb7b1526e510 +3cc15f2ced384f26 +bcb15f2ced384f2a +3cc4d89c4fdd2bc7 +bcb4d89c4fdd2bcc +3cc8520bb2820867 +bcb8520bb282086f +3ccbcb7b1526e507 +bcbbcb7b1526e511 +3ccf44ea77cbc1a7 +bcbf44ea77cbc1b5 +3cd15f2ced384f24 +bcc15f2ced384f2b +3cd31be49e8abd73 +bcc31be49e8abd7d +3cd4d89c4fdd2bc3 +bcc4d89c4fdd2bcf +3cd69554012f9a12 +bcc69554012f9a20 +3cd8520bb2820862 +bcc8520bb2820871 +3cda0ec363d476b1 +bcca0ec363d476c3 +3cdbcb7b1526e500 +bccbcb7b1526e515 +3cdd8832c679534f +bccd8832c6795368 +3cdf44ea77cbc19e +bccf44ea77cbc1b8 +3ce080d1148f17f7 +bcd080d1148f1806 +3ce15f2ced384f1e +bcd15f2ced384f2e +3ce23d88c5e18645 +bcd23d88c5e18657 +3ce31be49e8abd6d +bcd31be49e8abd81 +3ce3fa407733f493 +bcd3fa407733f4a9 +3ce4d89c4fdd2bbb +bcd4d89c4fdd2bd2 +3ce5b6f8288662e2 +bcd5b6f8288662fc +3ce69554012f9a09 +bcd69554012f9a25 +3ce773afd9d8d130 +bcd773afd9d8d14d +3ce8520bb2820857 +bcd8520bb2820877 +3ce930678b2b3f7e +bcd930678b2b3fa0 +3cea0ec363d476a5 +bcda0ec363d476c9 +3ceaed1f3c7dadcc +bcdaed1f3c7dadf3 +3cebcb7b1526e4f2 +bcdbcb7b1526e51c +3ceca9d6edd01c19 +bcdca9d6edd01c46 +3ced8832c6795340 +bcdd8832c679536f +3cee668e9f228a66 +bcde668e9f228a99 +3cef44ea77cbc18d +bcdf44ea77cbc1c1 +3cf011a3283a7c5a +bce011a3283a7c76 +3cf080d1148f17ec +bce080d1148f180a +3cf0efff00e3b380 +bce0efff00e3b39f +3cf15f2ced384f13 +bce15f2ced384f34 +3cf1ce5ad98ceaa6 +bce1ce5ad98ceac8 +3cf23d88c5e18639 +bce23d88c5e1865d +3cf2acb6b23621cc +bce2acb6b23621f2 +3cf31be49e8abd60 +bce31be49e8abd87 +3cf38b128adf58f2 +bce38b128adf591c +3cf3fa407733f485 +bce3fa407733f4b1 +3cf4696e63889018 +bce4696e63889045 +3cf4d89c4fdd2bab +bce4d89c4fdd2bda +3cf547ca3c31c73e +bce547ca3c31c76f +3cf5b6f8288662d1 +bce5b6f828866304 +3cf6262614dafe64 +bce6262614dafe99 +3cf69554012f99f7 +bce69554012f9a2e +3cf70481ed843589 +bce70481ed8435c3 +3cf773afd9d8d11c +bce773afd9d8d158 +3cf7e2ddc62d6caf +bce7e2ddc62d6ced +3cf8520bb2820842 +bce8520bb2820882 +3cf8c1399ed6a3d4 +bce8c1399ed6a416 +3cf930678b2b3f67 +bce930678b2b3fab +3cf99f95777fdafa +bce99f95777fdb40 +3cfa0ec363d4768c +bcea0ec363d476d5 +3cfa7df15029121f +bcea7df15029126b +3cfaed1f3c7dadb1 +bceaed1f3c7dae00 +3cfb5c4d28d24944 +bceb5c4d28d24995 +3cfbcb7b1526e4d6 +bcebcb7b1526e52a +bf67e59e12f88ded +bfa2fb12cf9c9e92 +bfb23be5df04da29 +3fa17cb8ee6d15bb +bf67e59e14f08149 +bfa2fb12d06cd8c2 +bfb23be5dfc554ba +3fa17cb8ef1dd0b4 +bf6829ba1c631127 +bfa31724d4c5eb76 +bfb255d703e2d2ea +3fa1948932ffba61 +bf67d345abd0cd73 +bfa2f37cf696b8d9 +bfb234e2c938326c +3fa176489bd9ac01 +bf67cfc22549980c +bfa2f208b97d0e96 +bfb2338aa852c1d9 +3fa1750c9728751b +bf67e4bd1d83b71c +bfa2fab5db73cbfd +bfb23b8ff287ae43 +3fa17c6a099b908a +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +c0683b4ee1cffb07 +c05e4557e9500884 +c049b208148b9aec +4019e79cfc4873be +4056d458977a5e02 +c030db30a0da79ea +406601c3b8860135 +c06441ad2b9947ab +c046099939748bbb +401f82427b717842 +c064e40894fedb84 +401819d2dab5005f +406add3b842a6787 +4061db6639839231 +4063c4ca2dd7bc1d +c06c4049e5e7c54b +402d6631f99bee73 +c05d2fbd23cbbbbf +c07133119fa2b719 +c072c134e87d0820 +c03b2e48e8900074 +4022351eeedd5846 +c051bc4d5fa56b9f +4052295522e6143b +c0606a2d20915760 +40329a0936049ae9 +403fb6d10620eb6a +c0652650f819b991 +40451376c03e828d +c06e592a4e7149cd +c071e9c85ad14565 +4070722c87880f90 +4062cb8eef314a8b +4071c7001392a147 +40642660e1e1fabf +c05d17011e4a45a9 +c052fb7d4b794b7c +c06bfe93da3330f7 +407123f1e2b2df22 +4060c85f35bb1928 +40573bf1d3f0c04a +40719c3acd938d06 +c06b89fa94a03139 +406610261758f293 +c026e9edabd17a08 +c06e814575fe9b3b +405ea7108744dae1 +4060011033af05d5 +c05152f578e0a08f +c050d6f9499b4b6b +4065ed925f073d27 +c070cf4778274f59 +c06a65678065ced4 +c047584d962e962c +4069c0d174bda393 +4051f99a1dcdf200 +c071bfa33882131f +c0286075132f7630 +40217152c022ba4c +c062362ababe239e +40650027281336f4 +405d00eba7505033 +405fbc7a5df41842 +4064492485de3a96 +40715b3726f60779 +c070024f7571def1 +4068b4af719ccef8 +c05b94c2daf25861 +c0654ad7d6849297 +c033e5fe6ba33713 +404070aab918e72e +4071c1401dab10e1 +c021c4d82f468ff5 +40583cfbaa54dc70 +4066ad1588112e5c +c05df97b7dc02581 +c055f1adfad848f1 +c06474d845ccde84 +404c4e7c70c5248a +c06c22457be54d4c +c07226a9c549a5b1 +4067c2511c5ec303 +c072496a37407f75 +406b4878d77973ed +40328240fb291051 +407054b98d70e6d9 +4022aa35f2cd8f69 +c0700e8abfa8b638 +c059279ff904703b +4003f7071eb812f0 +c0668651ed4d5da4 +c06b50f7679b5a8a +c063b1889e13809c +405b9212de30ca84 +406d7aca83077ecd +c06850b6cc44fb2c +c0563bc9078e9184 +40620c617ea9cc43 +c0702f319e632ef9 +405455f5822b2b2a +4052c1087e06cce0 +4072ab24e355fac0 +c071cc29071a216d +c06a52afa458ce89 +40725580be2f21af +c06d76d34f52cfe3 +406697ba65a90366 +4052a08ce11a03ff +c05e685160a8e677 +c066162fef8131b8 +406137b9a618b242 +4051cf7649f1cdba +4032829c9c490b04 +405777776e7f54ae +405fc3e4f86ef7cb +c008756dd674b837 +407052e37310a1ef +c032134cda45b281 +bfbf51ed560072b4 +406f4f9640163392 +c06df5de22192fa0 +405499b2f02f5954 +40504f69b89dddec +4052952a0564d3ab +c0682ecdc0e24825 +406cbfcd751755bd +405910ba109fd061 +405360fab4e27bce +4054dfddb03a2a07 +4053f7b4fa7eecb2 +c05cc1369f99027e +c065c51b7661390a +c0550e2f669650a2 +c0659d9827140543 +406fbe7444320325 +c053b56178dd2cdf +4070c2d32b98ce7b +402db0abe4f52dde +406968963630e5e0 +405216cb4a2383c5 +c00fb992a150bb85 +4062e97a6a23fd54 +4066b8cec47cad5f +c05f65bf8f467c0a +c0600bae696a1f16 +40694ddd3aec5e3d +4066b6f91eb4891a +405db16301fae9f8 +c06ed14b99518abc +406420962165accf +40494473ff7f7095 +406a1c9a3497265c +c07183cf25f7c8ba +40706b6750cbafc3 +c0415df39252ef1a +40487b2590d59478 +c0615b25de52b21a +c06f5c20cea71f6a +c06d0966ca31e5a0 +c060fcc0d9ea1b6f +406b9b95231be810 +40503df63cdaec7c +406aebc1f20c3336 +4002dc1bd6e47d72 +4058bb3d2f99e2d2 +c062247a87aedcb4 +c070c2adb0647ec0 +c059ac48060e1d93 +c07253d0caf60884 +c02dc04a6ff4ab0a +406e9007aabbb041 +c070085047891374 +40549c063444b1d0 +406da373bd322dc1 +c070605c5ea15fed +40632ecd116471d1 +c070b37bd1efe363 +40669e41109e868b +c0605ca00b78e7f4 +4040b11daeeb1ee3 +c05fcef153edf9a1 +4036e48bdc6e936b +c04da74980136976 +40724bf63d6a39af +40651a5ae3b20ab1 +c06b1631f2f48e96 +c061081ed0f9cffa +4053408bbd324d1d +40649035cbb8729f +406074d93a534b59 +c03fdea3d97e5356 +404d5f8fd78d2d0f +4045d68dc092aee0 +c054ab0b2bb44768 +405bc5b6a77fb4c5 +c06b15dcbd3dd1a9 +c04b35562aafba85 +40479fde6381b6dd +4058f450ebce6a50 +40722ad7d18a646f +406c0c1c72c55cdb +403498c3b836ce73 +c04151884f077082 +c0569bd76d3d97a7 +c06e6581bd83e6cd +4053acd9d50d1e59 +c0257c100c6d00fc +40651852b4bd952e +c0684025c410141e +c069162856d44d11 +c051cdd9f0a55054 +c06a5804af9b5cb5 +402f4f2f72329a9c +c06c7158084c0b94 +404a3919abc2a27f +40320f9143b4c388 +c06ea5a9a8fb916c +c05aa24fe651dc73 +405d3d9d60a5c984 +4065b6e3883b219b +405e9153fedb1e5e +402049dfe924f224 +c068d9850b83736f +c070128c4f303064 +40705b5a5a854570 +c06e6353d77aed3e +404404dbaf42b5fb +4044e7611c308c95 +c0622f30527f4595 +4045f883b77d5e0b +40468b62d97fe01a +c0679ab091346df0 +c050ba3cfe35308b +40709d1234820fd9 +c023ad393e7e0980 +c070fc31558a9dcd +c0704d532d5ceb9d +404823fb66aaf147 +406d0f7a6a1b16c4 +40714d80d7efee87 +405fcfb2950ecb85 +c05241630fccf185 +406028e9ca87fd9b +c0658b7da9402fe3 +405911cecfbe12d5 +c06aad96d97c6495 +407055fa3d9e3e7d +c04b7c4693dd9698 +40724e423747d1e1 +4040136116a3e4d7 +c030543b84a86298 +c069fe45e7cab6c0 +4071ee9af93995b9 +c06acae493412100 +c0642094448ca0d4 +40683cee6c5ab1c7 +407058778956987d +c0692bfc02c5ce3e +c062f03113ff7b5a +40609a232d379b24 +4067d43f07dc3c7f +c06230f9a7bcd025 +c05865a136d25a5f +c055974b4810750d +40641784e39dbeb8 +c0623b0605b82f15 +40681b455f0a11ce +4058fccc2275c25f +406141d21e855952 +4054f27cbfc033df +c06b7d518104a06e +c055121dff295a88 +404cf3fb966fafb2 +c053ddd934801c2a +c040cb5fd1865454 +40658a6c8cea86d3 +404da7005e7f011a +c0683499154d096e +403e8b0defe56e13 +407099239640ab44 +406dc9c0ef6eb1a4 +403ce8faca0e82f3 +4060089afd1ae48e +403784d3914b14e7 +4046555fc7c4a180 +406d752b2b2ce9bd +c0674adad9f56e65 +c0612f5a2ff07a0c +4014e8cc26db24dc +4061ff2c77e9947a +404d4ecbe93984c2 +4057b48b72d2df28 +406619fe6f850897 +406f98e3ea930f15 +c04d37071a6cb0e1 +c06beefcaec2c91a +405f1dea92e5d0c5 +c0721270e9b159e3 +c069d8d71969e2a7 +c06323753cf3dd45 +c04cd4759c545b23 +4054ec68e3ff2082 +c061761c046dd37e +c06829dfa888fec5 +40671542cf0c6980 +c066121d4d899bca +c044a3368062672d +406bd3ecef46508b +c0508072112685df +c05111d6c4dc1c95 +c0724669ccfffad3 +c0119248ac97d62c +4068a51dfde5c78a +c059bc942d120d82 +c072852c7516fd72 +c06babaca2b1d342 +405da049200f13d6 +c05df407a0efd215 +c055922c2765a048 +406701e6c9d08fab +405f13a4d3b7d540 +c039fd9cc87ed1b4 +406384fad8def508 +c063d72347359464 +c06a015638c79ca0 +406458713e661478 +c0618999de8f8a77 +c0725344125750a3 +4042ab9243b02ce5 +c04e41099fe5ce74 +c061c22cb289df9a +c0715e6b2d616453 +405f64d2fa9cb8fd +c072c7ec3b572de9 +405897a54295192c +c04d336f3f7743b1 +4012d1f88a5b93a0 +4063f4c0bd6b6c81 +c04f49be899b00e7 +c06efff563ae778f +c040ad0de8cf0dd5 +c06716c5a96e304f +4032194e8966e14b +c06bd3a9bb59d881 +402701b993367112 +406cb4af721758c0 +404d1c860f31b47b +c069ba41084ea377 +406f6397dd4920b4 +4069333cb2c65098 +40716135896516c1 +c0463629e5ca0f4d +406a40cf2c9caa6b +c06f6f46b739f0fb +c05b835744c66f8e +4063af0b4f2d7f48 +c06097beae50a302 +404fae64253ea52a +4053ee4a23597abe +c07105bd6c8a9b1a +c00e2169826b725d +406af7458c015988 +c06b237b952a3f16 +c069da69cf561e09 +405ff6eb90e2cde0 +c050024954714ffe +c0673a92220a7d39 +c036827bc38c9cfc +c065a55b3d047d97 +c0541f8552fdd9ad +c0701d6b0ef74a46 +c0580ca38a826ad9 +40578eaf541f940d +407032d607d0c4bb +c06f26901e811763 +c06094f04ebd62bb +404c7cfcba081363 +4067126e684e27f1 +402aca96a10fa69e +403319fcfa31679f +c057f91646bee7ee +40332d82c6f8415c +c05d120f7ebac7e1 +c04be7fb51ef1d67 +405b18e64386be98 +c06956c5c7716f87 +c040fca6fc0c4cbd +405540bc64db1b5c +c06cbe6061d1753e +c0387830622028cb +40428a953901ea6b +c039405550e1072b +40531eef37214eec +4066d1a6d0994e9d +c069a5b9b8faa1ad +c064455f7b00e1f2 +c06e6ff2091c4ada +c050aaa90140a139 +c052f24e01373d38 +406d447f65b13fcb +40706f0cc0037f05 +c040ce7e7d992597 +c054e91e01c77ac1 +c03944c0ff303f5c +404502216b183e21 +bff03ab17861d928 +40507576d3b6678e +c05212dbe0ada2c6 +40609e666d52f092 +40722502e1bb0561 +40656e45a85fd975 +40206ece60a88788 +40639e9c7aed68be +4058471242ab1abb +406fc2e6986a4a25 +4070ed822415754f +403047bfa7f06456 +405bc28d46736710 +c07092349c505049 +c0711e87a6507161 +c0571027b4341161 +c061e547f621d118 +40545653a0902059 +c05c3abb95e40951 +c065d3e440b4c16b +c063408112a4e458 +c063c2da8bc994bb +c0704a99fd9147fa +c05dbada608a5bf8 +c06cabbd13ea682b +4037af9a0d6fbbf2 +4071a8b4c3342bb9 +c0556ed45e47d685 +c066a03d7e986630 +c0122358f3ae8147 +406b3518447acc4b +4033a6ca19e91825 +c07209d542fa9b82 +c06c665ce74462c3 +4039526b13b6b2e2 +4063d83bfacb0909 +c0657e0bbf9768a1 +3faff79f44547deb +c053d8b6470df07d +40677eab7e12da2f +c0520d6f56233423 +4060c6d5c136fd56 +4069b748db73598b +c03b6697b21bcb0f +4060f4813d0c18c5 +407278188bf6110e +404193e706d7ca40 +402dc2c07d5254dc +c0086ccbc5974af7 +c06d9652cf832423 +c0683cea8e653cf5 +4063fb3659ee088d +c03e6ed31985f112 +40721cf37f5c2297 +c05de60413dd9f47 +405e0348903462c4 +407026651e2a7d98 +4071f5049b0ccb11 +c04cefbc11436251 +407197b28ff4bd01 +c0627217177a9682 +c0684b0b6a184d27 +c0654c348e5fd5e6 +406aa020f0fc26bf +3fe0c3bc7ab63cf6 +406e19d1f9358c38 +c0665f2efe76e566 +4070b9071174c053 +406ddfb11eb2f366 +c070b778875f5a9b +c0722095a99bc5d5 +c06bac46059f7dbd +c050c8cae0ec6818 +c06949e7c055c357 +c06d51bfad5687ce +c0472e59484d9737 +c06cd5e4e6a336a7 +c06c5efaccb20ffe +406996fa3a8ade48 +c062e1ac7cae1d67 +406a1af147e99d53 +c0707f9b59a40a4c +4064c5146d3e6118 +c062af076e967590 +404ebd576c8602a8 +406a1e588c848302 +c070abcf72b24514 +4061673382786764 +c07160a12808b211 +c06e4210fc3e892f +40716745b03539ff +c06436cbcb5b1ed2 +c05c3ba341489d67 +4063e4eb89c50244 +c06ed64778659535 +40714485ee13b402 +c02b10d1ccac427a +4052beb5fceed25d +406555abb604f5fd +4072a46a2c4413d7 +405919405937c84f +c06192349ef2f0f6 +405e713f31ed4d12 +401c3d45186e6efc +404a6990c0daa585 +c04eafdc5f2e9d7d +405b510fab560720 +c041b33b19bc9e0d +c06e62b914e65f8a +4041ae3333c63883 +c060a466ed4e4149 +c05c046592145f36 +406be993cf10f00b +404470c9ae8e9b58 +405537a5c657e4ce +c06569d066db4705 +c039f2737a60e54e +c05e949f21307e0d +404e6901f1342934 +c06fe30d16c67ae5 +c0670b8e209bab04 +4049c766d2121278 +c06b16bc34c3462f +4062583b52d22d8f +40674702a477fbd0 +c04e82a94263dd31 +404fb2bebc4adc3c +403c840c05da3655 +405b73bf5b13d8f8 +40397c42dc7fb8b9 +c057821e84b8cf0b +c05b839ad3faf6f9 +c070910b2562c491 +4032587594a6fb48 +405369298c6eb978 +c070b361b5fa21c7 +4061a2e9fa36dfda +c0447ccf6aa0defc +c07188e0f55732cb +406110c0044428ae +4071756dfa9fd34f +406484cb7728a6ac +40563867be78e224 +406b455f0bf4cacc +40554af05843fe4b +40698b1cd3daf959 +406480b4dda91fd1 +4070e93ff4958bfc +407299e4dceb31ee +40711bdca983e2ac +c072cb5cc1390a00 +4066e0f6d5a11fb3 +c05a0fefdb46eb3c +404139b772f0d54d +4067904cf16539df +c0519f2d306e2518 +40463f16a779d9b2 +c06874583c8de60c +c06e180aee025eef +4062a0eda60ece39 +405d79c802c4b3d5 +40522ddbdfd2b8bf +c0638e778e1970ea +c06b7dc5b93ae64b +c069068f5e4ebab5 +407256a1d9fdafae +405485ca11974b7e +c0587f548cd31f34 +c06e3c59f624f7fe +c06091391af2d1a4 +406abe260e03d836 +406b133d1fa5fbb8 +40621478a995f57a +4064393470e436be +4063cb59da12593d +403c1f934619470f +c04bb99a4abc5cde +c050fc0e0af307d7 +c05ea9a529eff97a +40566fa60872869c +c06f888d56e4938b +4063cfe768695765 +4064d23d467161ad +4031c189552b7ee1 +c065ef135e9fe9ef +406042decccb0b38 +406dc6fe661002b8 +c032b9acbc57b2df +c024bc3db2e2da91 +c05eaef27dc0f3c1 +406533aa3a06c8fc +c06102fce878e3e0 +404e5d9f667f899a +405ec5c1da344c97 +40650b3f0cc5a86b +4056e40da79e476f +c05f40724a20f45d +4059bae886610276 +4069fe6bf26315b7 +404012a7e224c1fd +c06cbf41c8e24285 +c06c3e72500502f5 +405e4f35d433d396 +40708176ce43c483 +4068396d83a66014 +c063b851063dbb8f +c06b3e67635ddf47 +405b851279a85e8d +c0628af613b78e09 +c06855af8c72c8c9 +c06cd3ad6a159b2c +40445eb46feb4980 +c06c84d9993b3139 +c06b379cc7dad20a +4043739fdb6c80d5 +4045aaf8fdd6df23 +c06d759301be4751 +4018b7901b78bb28 +4072bbca3c5d1cdf +406f94e3a7dc8db9 +c06cf1d8c7d3c516 +c0647f7e35f530d4 +c0515e50ef6ee770 +4048f56a036f5d30 +4055beb5c185484e +40599397ba09bcbe +406c7797853dfae3 +c065b9ec06baef7f +4050059c653cdfb2 +40597657eaef0850 +c05b5ececc6ac6e5 +405b89aeccc0fd99 +c070b90519ce8589 +c032d6a36300be73 +40563b39e83b8d1f +4061fed9153a774d +40549ad492b37f1c +405fac45fc050b23 +405524cec5793ff5 +c04c15ff56804c7b +4062d5b824dfed3f +40657b8f70c0b2dd +4046c8999b1ccf4f +c068981bb05de2b2 +40604554ce168702 +c06bfadc66c50fb5 +4064155c3daa8438 +c06d678f680efb72 +c03f81e965d29e50 +c05ff6ca4e0749df +c06fcc17a2caafb7 +c04c5a69374457e9 +c04a68f88e62b638 +406abb9dda253230 +40686e0ebdbb46fa +c071be73953ec702 +406d3fbbf8c3c227 +404913f062d3fa68 +406051a01e97c8ab +c040294a2323eefc +4066e98a49a15ad4 +c060ac795bef2bf3 +405ffc9761ebe76d +405576768e13aaa3 +40579d0fb489c3d8 +c05ef746d060c20a +4070f769ee6a1a4c +406b9bf730d60b93 +c05deae02927efd4 +40603bb91df3bc61 +c06a629ce7ae1896 +4068e287988bb38d +405162e6be01802c +40415e90866a6cda +c06da4206e8c0158 +c05d4123181361dd +c05b2246727ea742 +404410e195808c4f +c065ba419c21878d +c058e1861e26dc49 +c039255257942615 +c03bf05076d89289 +c06e18b3aac72039 +40171737b669d28a +c0598e0af6776304 +405529073e772e53 +406ad1acc501542b +c07209df46a3ed2a +406bd523a22d042c +406adee717ca6226 +c04f14f300e22d6a +c042111dfe811bdf +4063b9cd033922dc +c0699bb7105c3405 +40708885dd167e3f +c041b947334de220 +4066cfa35a9c76fb +c06542e315421faf +405e2d978e9ed3ab +406f779da04dea23 +c060da8c0b94fe5f +4070708080a7697b +c065d93f36b71bc7 +c0669ec83937fd27 +c053c4f60a589cf7 +4063b33457b969f7 +406d70f8e8671d86 +c0598bd98fbfcf86 +406da237db2a0e35 +c0643ed4113f202b +406705539c115da1 +4051017f3830f3fe +406952e9a6eb5dd5 +4052ba556c77872b +405d7703a45a862d +406c71e09d80eb91 +bff2189d74612103 +4064ea13549635f3 +406159816cd538b4 +c068305ca029d820 +c0628ec133da041c +c04cbf270ab9d2e4 +404cc7e8ce7b425b +406ca2012ca7719b +c0671d4b49f6738a +c00417de16a0e6c8 +4067ee94b18a341a +c05849c52f5a190c +c068d7d0512461bc +4055fae3e077a862 +c02b04ebc02466c4 +4053b372a1dbb34b +c071f4b8328baa67 +c053e269fa0d6fe3 +405c9d5038400396 +c0710673af35b5cf +40724402e7864a4c +4062819d012e109c +40265a14d1df8681 +c05e839ba284d8d9 +4043b22489da1cf4 +4072c066e77b4479 +c066df9d4230f639 +4054ad79abdfc2de +c04dc57068429e82 +406594f8f65d884d +406760970de114d5 +c051fb3ff567a450 +406c385a269672a4 +c0569fa3188faa21 +406a18cf6bdef0e4 +c018f2a9dd026c73 +c0146e8614141bf8 +4066583f591e8ae0 +c064bab13a765a13 +c0652be1acf29489 +c05df3a66a9e2b2b +c06a90af87cb2ec5 +4061a3e1821f5b68 +c072c83b4d0665ee +406ce8c391dda4e3 +407051ffd78dd85f +c0726ab3d3fbe5b0 +c07117a5b083dea1 +40584fa1bd31fa18 +c032df2bccef5a7c +c042b06de6e6a72c +c056263bc95b8a39 +40415008106adcfc +c06e92afc798933b +40548f6d7bd8ef80 +c06e699eabe352ed +c0605bc0d5743a38 +c072c44de34d5a7d +c048068e0e7cbdbf +4049933b0c893e71 +4062cb76a0acb31e +c03ca34b73109aad +c053bea0f2a162df +c06199e4ceb2dcd3 +c04cfb54c158cdfc +c0252614782b4f46 +c049b06c207592b6 +c035b6a6097fcb4f +c02ac19214c08edd +c047de3753f3571e +c06f335223bbe144 +406837459ead7bbe +c04159477f1d24a5 +406721f59847bca2 +c05ee19b94b1d5de +4057441691ac2844 +c06850de045e130b +403713debb5cbec0 +4068f62d5b616318 +4057deca34c81079 +405283716843bd0c +c05abd20a8adedee +40706d895c5c9cb5 +405d9c80268fb435 +4070c8bb72e67602 +40654f891add9bee +4050fbe14da1c558 +4050d51fb3fa95ba +c031656b234442de +406561dfe8eb58ca +40447369cba05a48 +c061090a438c3719 +406f101f1565b10a +40679c441c62142d +406ff9a922e71394 +c05b3f6db086aa1a +4059806244bd7cc6 +4004df35414f3d79 +c06da0e20cdcb547 +c05f93787cd746b9 +c0663651530c6a2b +4053e36dd6c2f7f4 +402ca3e44e79df85 +c06baf97bbee05be +4064d15e6c999d39 +c06987955a185f54 +40723047cd772e7f +c06306b1f7891ce4 +c07132a16ce383c7 +c068559d65766e45 +407046ef44409021 +4047f40b57e96399 +c05cae38d1c02421 +4065e595d383092c +40715ba1c16e0cf7 +c04924ed8c5f6bf8 +c04282b1888ebde2 +c0585a4517b0810b +c06787887fb2f2bd +406cb1e872ea0e0c +405c905798acb8e5 +c038050b640efc2d +c0443c20a6025c57 +c05b86d0235c3e10 +c07258cc79dc7b11 +406e356d839d870b +c05acc6086452d79 +c07252a908f95ac5 +40406178272964f5 +c06e013c57448b8a +4060089040c1dad9 +4072a01a78162e8b +c04827779b34ccbe +406f29ae32c60761 +c06eee14b121f023 +4068241947b7b3b5 +407006b88ec667c5 +c07168cf59a8dae0 +4067fb4526bf0e99 +404df896e3f45757 +406dbfacd7391773 +40722b811886fb98 +c047a0b1f93106d4 +405c397e72224146 +4062af761398a348 +4059fcebb782dc31 +c063ef407cada2a1 +4063dbf76b8abd2d +c04c67e19b5a2679 +40726c2505968a6c +c06bc6880ce74ce5 +c062b9f5515894c4 +c05fe7e4b37de66a +406b8149f9dd314e +c068c1858235b605 +c06057b5d1574b16 +406f6da0b8abc01d +40621177a873ce0a +c0572506273b4b66 +4059bf0b9dadc5d8 +406dc6885e942a12 +c030d448e1dda43a +4066d1a2c0f1642c +404ca1dec0a004f6 +c060783ef76d4c50 +c0719196bca74ca6 +c0678ca622c53b39 +4070cf764dbdc268 +405393ec0e02790b +40452eba7dc652b7 +c072790c61ed79b7 +4043496c1c4a47b6 +c064d10961f9d674 +40583d9626e4c0fa +c06841b5d63df140 +4065a6859cfc1e40 +c062e7d2276d474e +406ad1945c321e82 +c06f379c047da4f1 +c0708271d2a6c73b +40712dad54cb48af +4068bbdd6181bdb4 +406e27bea0720f42 +40332f88f1a391aa +c070890ef43e932c +40606495d3f6e026 +407139be634348ff +406a1b924817eb51 +406e1b0dc0a1f640 +4004d6c9d980de6f +c0513aea49946578 +4051fbb3de3b8242 +c06b28bd4b8b82db +c022bf055ea904ec +c05254e6e898e7a6 +c0625e3da583d650 +c072502b96890cd8 +c066f57e0ab39e0c +4061fda918831e82 +c06d2e847913acbc +c04d196a42c00aaa +c0567075442554c2 +40508b891e52b84c +c0680bac183ccade +c0632164d57aff83 +4055d796bc1085b1 +401887bfb5f5b548 +40640054accc8b94 +c07095606b241344 +c029c30e244dc09e +c06e1dafc7826b4f +406adf48372587f0 +404d2f1578a6ca66 +40717499cd601b5f +c05ecbbd7fe9d1d2 +c06a0281fada70fc +406e70f7af6d16ea +406488441ee96dee +405565b93575b7a8 +407103af111aa5bb +c05f66ea3d3002d9 +405a777aad49f37f +c06f53dc18314f4f +c05784b2d2d3786d +4072bc3526790143 +4069218e57bf96f5 +403029669ab104d3 +c03f255990157e83 +4043b6e89736d1c7 +c066911855deef7a +40696a3abd3e9296 +405183247ba512d0 +c0674abcf776708d +404a0a7a71102c29 +c06836ba9a405062 +4068f09ca2bc502d +4045152e6cea4d80 +c0629b9e23a9163a +406782ed6e8805cd +4062920197351436 +c0720283383a2f76 +c06f7d7b6cba942d +40655c32d6e369e8 +c06f711e3589bc9c +406cdaa03d1a8fda +405aadce0ce59b02 +c06d0c1bf6cecd6b +c059f4bce3c1cb79 +c02c847f0b461a9d +4071fe4cbfff1c41 +c04cbe1b6b14df68 +40715c7afd77fa71 +c06b32910bda59f7 +c066bdab3e2c8ae8 +4072b8a688f39cc4 +40560f6301ad7bc9 +c06d7ea4fd1c33db +c066cb4baff91bf5 +c06f6198dcf5265b +c06debad4476976e +c0618f3bbf96ab34 +404e8d42a98b034e +c04da1cb07e7a823 +40517ee522a3c222 +c071f12463b970c1 +c0627442d14ffb74 +c0445b529109fc30 +c04e0484e71b0b3e +406a21a1dcc80e38 +4069d996d9a73ecb +c06532bef7d5d303 +c062d116b9ce082a +c064616c618cea70 +406402bc0b837842 +c06578416b583765 +c066172e3c1d6921 +c06fa8c4a48adcab +4048bc961118079d +40674df89dfed94b +c0671c215eed3aa7 +406a1721bc916426 +40539a945591a246 +c04a43ad23420f05 +4067c7cb081b7b62 +406b233e77d05f7c +40542bb0b84e868d +c06291dc625de85e +4066babf7ef4e1e5 +405ba581749bfc81 +c050a13158e761f0 +c0604d6e2742dda6 +40640904e140dc70 +c027f28c30604a60 +406b11cddd65ba65 +4068fc43423e4b5c +c060b7a2ea13db6d +405a5a7f3a750098 +c061fd96949583e6 +406e4f9369febb50 +c04624844af17b0c +c045a41b731f056c +4071cb3bcc872f6f +c0620a3a5fc48d7c +7ff8000000000000 +7ff0000000000000 +7ff8000000000000 +fff0000000000000 +fff0000000000000 +7ff8000000000000 +7ff8000000000000 +@log1p 2185 ad08779773a6be4b +fff0000000000000 +c0425e4f7b2737fa +0000000000000000 +8000000000000000 +0000000000000001 +8000000000000001 +3c30000000000000 +bc20000000000000 +3c40000000000000 +bc30000000000000 +3c50000000000000 +bc40000000000000 +3c60000000000000 +bc50000000000000 +3c70000000000000 +bc60000000000000 +3c80000000000000 +bc70000000000000 +3c90000000000000 +bc80000000000000 +3ca0000000000000 +bc90000000000000 +3cafffffffffffff +bca0000000000000 +3cbffffffffffffe +bcb0000000000000 +3ccffffffffffffc +bcc0000000000001 +3cdffffffffffff8 +bcd0000000000002 +3ceffffffffffff0 +bce0000000000004 +3cffffffffffffe0 +bcf0000000000008 +3d0fffffffffffc0 +bd00000000000010 +3d1fffffffffff80 +bd10000000000020 +3d2fffffffffff00 +bd20000000000040 +3d3ffffffffffe00 +bd30000000000080 +3d4ffffffffffc00 +bd40000000000100 +3d5ffffffffff800 +bd50000000000200 +3d6ffffffffff000 +bd60000000000400 +3d7fffffffffe000 +bd70000000000800 +3d8fffffffffc000 +bd80000000001000 +3d9fffffffff8000 +bd90000000002000 +3dafffffffff0000 +bda0000000004000 +3dbffffffffe0000 +bdb0000000008000 +3dcffffffffc0000 +bdc0000000010000 +3ddffffffff80000 +bdd0000000020000 +3deffffffff00000 +bde0000000040000 +3dffffffffe00000 +bdf0000000080000 +3e0fffffffc00000 +be00000000100000 +3e1fffffff800000 +be10000000200000 +3e2fffffff000000 +be20000000400000 +3e3ffffffe000000 +be30000000800000 +3e4ffffffc000001 +be40000001000000 +3e5ffffff8000003 +be50000002000000 +3e6ffffff000000b +be60000004000001 +3e7fffffe000002b +be70000008000005 +3e8fffffc00000ab +be80000010000015 +3e9fffff800002ab +be90000020000055 +3eafffff00000aab +bea0000040000155 +3ebffffe00002aab +beb0000080000555 +3ecffffc0000aaab +bec0000100001555 +3edffff80002aaaa +bed0000200005555 +3eeffff0000aaaa3 +bee0000400015556 +3effffe0002aaa6b +bef0000800055559 +3f0fffc000aaa8ab +bf00001000155575 +3f1fff8002aa9aab +bf10002000555655 +3f2fff000aaa2ab1 +bf20004001555d56 +3f3ffe002aa6ab11 +bf30008005559559 +3f4ffc00aa8ab110 +bf40010015575589 +3f5ff802a9ab10e6 +bf50020055655889 +3f6ff00aa2b10bc0 +bf60040155d5889e +3f7fe02a6b106789 +bf70080559588b35 +3f8fc0a8b0fc03e4 +bf8010157588de71 +3f9f829b0e783300 +bf90205658935847 +3faf0a30c01162a6 +bfa0415d89e74444 +3fbe27076e2af2e6 +bfb08598b59e3a07 +3fcc8ff7c79a9a22 +bfc1178e8227e47c +3fd9f323ecbf984c +bfd269621134db92 +3fe62e42fefa39ef +bfe62e42fefa39ef +bea0000040000155 +be9ff0007f8022a7 +be9fe0007f0082a3 +be9fd0007e81229f +be9fc0007e02029b +be9fb0007d832297 +be9fa0007d048293 +be9f90007c86228f +be9f80007c08028b +be9f70007b8a2287 +be9f60007b0c8283 +be9f50007a8f2280 +be9f40007a12027c +be9f300079952278 +be9f200079188274 +be9f1000789c2270 +be9f00007820026d +be9ef00077a42269 +be9ee00077288265 +be9ed00076ad2261 +be9ec0007632025e +be9eb00075b7225a +be9ea000753c8256 +be9e900074c22253 +be9e80007448024f +be9e700073ce224b +be9e600073548248 +be9e500072db2244 +be9e400072620241 +be9e300071e9223d +be9e20007170823a +be9e100070f82236 +be9e000070800233 +be9df0007008222f +be9de0006f90822b +be9dd0006f192228 +be9dc0006ea20225 +be9db0006e2b2221 +be9da0006db4821e +be9d90006d3e221a +be9d80006cc80217 +be9d70006c522213 +be9d60006bdc8210 +be9d50006b67220d +be9d40006af20209 +be9d30006a7d2206 +be9d20006a088203 +be9d1000699421ff +be9d0000692001fc +be9cf00068ac21f9 +be9ce000683881f6 +be9cd00067c521f2 +be9cc000675201ef +be9cb00066df21ec +be9ca000666c81e9 +be9c900065fa21e5 +be9c8000658801e2 +be9c7000651621df +be9c600064a481dc +be9c5000643321d9 +be9c400063c201d6 +be9c3000635121d3 +be9c200062e081cf +be9c1000627021cc +be9c0000620001c9 +be9bf000619021c6 +be9be000612081c3 +be9bd00060b121c0 +be9bc000604201bd +be9bb0005fd321ba +be9ba0005f6481b7 +be9b90005ef621b4 +be9b80005e8801b1 +be9b70005e1a21ae +be9b60005dac81ab +be9b50005d3f21a8 +be9b40005cd201a6 +be9b30005c6521a3 +be9b20005bf881a0 +be9b10005b8c219d +be9b00005b20019a +be9af0005ab42197 +be9ae0005a488194 +be9ad00059dd2192 +be9ac0005972018f +be9ab0005907218c +be9aa000589c8189 +be9a900058322186 +be9a800057c80184 +be9a7000575e2181 +be9a600056f4817e +be9a5000568b217c +be9a400056220179 +be9a300055b92176 +be9a200055508173 +be9a100054e82171 +be9a00005480016e +be99f0005418216c +be99e00053b08169 +be99d00053492166 +be99c00052e20164 +be99b000527b2161 +be99a0005214815f +be99900051ae215c +be99800051480159 +be99700050e22157 +be996000507c8154 +be99500050172152 +be9940004fb2014f +be9930004f4d214d +be9920004ee8814a +be9910004e842148 +be9900004e200146 +be98f0004dbc2143 +be98e0004d588141 +be98d0004cf5213e +be98c0004c92013c +be98b0004c2f2139 +be98a0004bcc8137 +be9890004b6a2135 +be9880004b080132 +be9870004aa62130 +be9860004a44812e +be98500049e3212b +be98400049820129 +be98300049212127 +be98200048c08125 +be98100048602122 +be98000048000120 +be97f00047a0211e +be97e0004740811c +be97d00046e12119 +be97c00046820117 +be97b00046232115 +be97a00045c48113 +be97900045662111 +be9780004508010e +be97700044aa210c +be976000444c810a +be97500043ef2108 +be97400043920106 +be97300043352104 +be97200042d88102 +be971000427c2100 +be970000422000fd +be96f00041c420fb +be96e000416880f9 +be96d000410d20f7 +be96c00040b200f5 +be96b000405720f3 +be96a0003ffc80f1 +be9690003fa220ef +be9680003f4800ed +be9670003eee20eb +be9660003e9480e9 +be9650003e3b20e7 +be9640003de200e5 +be9630003d8920e4 +be9620003d3080e2 +be9610003cd820e0 +be9600003c8000de +be95f0003c2820dc +be95e0003bd080da +be95d0003b7920d8 +be95c0003b2200d6 +be95b0003acb20d5 +be95a0003a7480d3 +be9590003a1e20d1 +be95800039c800cf +be957000397220cd +be956000391c80cb +be95500038c720ca +be954000387200c8 +be953000381d20c6 +be95200037c880c4 +be951000377420c3 +be950000372000c1 +be94f00036cc20bf +be94e000367880be +be94d000362520bc +be94c00035d200ba +be94b000357f20b8 +be94a000352c80b7 +be94900034da20b5 +be948000348800b3 +be947000343620b2 +be94600033e480b0 +be945000339320af +be944000334200ad +be94300032f120ab +be94200032a080aa +be941000325020a8 +be940000320000a7 +be93f00031b020a5 +be93e000316080a4 +be93d000311120a2 +be93c00030c200a0 +be93b0003073209f +be93a0003024809d +be9390002fd6209c +be9380002f88009a +be9370002f3a2099 +be9360002eec8098 +be9350002e9f2096 +be9340002e520095 +be9330002e052093 +be9320002db88092 +be9310002d6c2090 +be9300002d20008f +be92f0002cd4208d +be92e0002c88808c +be92d0002c3d208b +be92c0002bf20089 +be92b0002ba72088 +be92a0002b5c8087 +be9290002b122085 +be9280002ac80084 +be9270002a7e2083 +be9260002a348081 +be92500029eb2080 +be92400029a2007f +be9230002959207d +be9220002910807c +be92100028c8207b +be9200002880007a +be91f00028382078 +be91e00027f08077 +be91d00027a92076 +be91c00027620075 +be91b000271b2073 +be91a00026d48072 +be919000268e2071 +be91800026480070 +be9170002602206e +be91600025bc806d +be9150002577206c +be9140002532006b +be91300024ed206a +be91200024a88069 +be91100024642067 +be91000024200066 +be90f00023dc2065 +be90e00023988064 +be90d00023552063 +be90c00023120062 +be90b00022cf2061 +be90a000228c8060 +be909000224a205f +be9080002208005e +be90700021c6205d +be9060002184805b +be9050002143205a +be90400021020059 +be90300020c12058 +be90200020808057 +be90100020402056 +be90000020000055 +be8fe0003f8040a9 +be8fc0003f0100a7 +be8fa0003e8240a5 +be8f80003e0400a3 +be8f60003d8640a1 +be8f40003d09009f +be8f20003c8c409d +be8f00003c10009b +be8ee0003b944099 +be8ec0003b190097 +be8ea0003a9e4096 +be8e80003a240094 +be8e600039aa4092 +be8e400039310090 +be8e200038b8408e +be8e00003840008d +be8de00037c8408b +be8dc00037510089 +be8da00036da4087 +be8d800036640086 +be8d600035ee4084 +be8d400035790082 +be8d200035044081 +be8d00003490007f +be8ce000341c407d +be8cc00033a9007c +be8ca0003336407a +be8c800032c40079 +be8c600032524077 +be8c400031e10075 +be8c200031704074 +be8c000031000072 +be8be00030904071 +be8bc0003021006f +be8ba0002fb2406e +be8b80002f44006c +be8b60002ed6406b +be8b40002e690069 +be8b20002dfc4068 +be8b00002d900067 +be8ae0002d244065 +be8ac0002cb90064 +be8aa0002c4e4062 +be8a80002be40061 +be8a60002b7a4060 +be8a40002b11005e +be8a20002aa8405d +be8a00002a40005c +be89e00029d8405a +be89c00029710059 +be89a000290a4058 +be89800028a40056 +be896000283e4055 +be89400027d90054 +be89200027744053 +be89000027100051 +be88e00026ac4050 +be88c0002649004f +be88a00025e6404e +be8880002584004d +be8860002522404b +be88400024c1004a +be88200024604049 +be88000024000048 +be87e00023a04047 +be87c00023410046 +be87a00022e24045 +be87800022840044 +be87600022264043 +be87400021c90041 +be872000216c4040 +be8700002110003f +be86e00020b4403e +be86c0002059003d +be86a0001ffe403c +be8680001fa4003b +be8660001f4a403a +be8640001ef10039 +be8620001e984038 +be8600001e400037 +be85e0001de84037 +be85c0001d910036 +be85a0001d3a4035 +be8580001ce40034 +be8560001c8e4033 +be8540001c390032 +be8520001be44031 +be8500001b900030 +be84e0001b3c402f +be84c0001ae9002f +be84a0001a96402e +be8480001a44002d +be84600019f2402c +be84400019a1002b +be8420001950402a +be8400001900002a +be83e00018b04029 +be83c00018610028 +be83a00018124027 +be83800017c40027 +be83600017764026 +be83400017290025 +be83200016dc4024 +be83000016900024 +be82e00016444023 +be82c00015f90022 +be82a00015ae4022 +be82800015640021 +be826000151a4020 +be82400014d10020 +be8220001488401f +be8200001440001e +be81e00013f8401e +be81c00013b1001d +be81a000136a401d +be8180001324001c +be81600012de401b +be8140001299001b +be8120001254401a +be8100001210001a +be80e00011cc4019 +be80c00011890018 +be80a00011464018 +be80800011040017 +be80600010c24017 +be80400010810016 +be80200010404016 +be80000010000015 +be7fc0001f80802a +be7f80001f020029 +be7f40001e848028 +be7f00001e080027 +be7ec0001d8c8026 +be7e80001d120025 +be7e40001c988024 +be7e00001c200023 +be7dc0001ba88022 +be7d80001b320021 +be7d40001abc8021 +be7d00001a480020 +be7cc00019d4801f +be7c80001962001e +be7c400018f0801d +be7c00001880001d +be7bc0001810801c +be7b800017a2001b +be7b40001734801a +be7b000016c8001a +be7ac000165c8019 +be7a800015f20018 +be7a400015888018 +be7a000015200017 +be79c00014b88016 +be79800014520016 +be79400013ec8015 +be79000013880014 +be78c00013248014 +be78800012c20013 +be78400012608013 +be78000012000012 +be77c00011a08011 +be77800011420011 +be77400010e48010 +be77000010880010 +be76c000102c800f +be7680000fd2000f +be7640000f78800e +be7600000f20000e +be75c0000ec8800d +be7580000e72000d +be7540000e1c800c +be7500000dc8000c +be74c0000d74800c +be7480000d22000b +be7440000cd0800b +be7400000c80000a +be73c0000c30800a +be7380000be2000a +be7340000b948009 +be7300000b480009 +be72c0000afc8009 +be7280000ab20008 +be7240000a688008 +be7200000a200008 +be71c00009d88007 +be71800009920007 +be714000094c8007 +be71000009080006 +be70c00008c48006 +be70800008820006 +be70400008408006 +be70000008000005 +be6f80000f81000a +be6f00000f04000a +be6e80000e890009 +be6e00000e100009 +be6d80000d990008 +be6d00000d240008 +be6c80000cb10008 +be6c00000c400007 +be6b80000bd10007 +be6b00000b640006 +be6a80000af90006 +be6a00000a900006 +be6980000a290005 +be69000009c40005 +be68800009610005 +be68000009000005 +be67800008a10004 +be67000008440004 +be66800007e90004 +be66000007900003 +be65800007390003 +be65000006e40003 +be64800006910003 +be64000006400003 +be63800005f10002 +be63000005a40002 +be62800005590002 +be62000005100002 +be61800004c90002 +be61000004840002 +be60800004410001 +be60000004000001 +be5f000007820002 +be5e000007080002 +be5d000006920002 +be5c000006200002 +be5b000005b20002 +be5a000005480001 +be59000004e20001 +be58000004800001 +be57000004220001 +be56000003c80001 +be55000003720001 +be54000003200001 +be53000002d20001 +be52000002880000 +be51000002420000 +be50000002000000 +be4e000003840001 +be4c000003100000 +be4a000002a40000 +be48000002400000 +be46000001e40000 +be44000001900000 +be42000001440000 +be40000001000000 +be3c000001880000 +be38000001200000 +be34000000c80000 +be30000000800000 +be28000000900000 +be20000000400000 +be10000000200000 +0000000000000000 +3e0fffffffc00000 +3e1fffffff800000 +3e27ffffff700000 +3e2fffffff000000 +3e33ffffff380000 +3e37fffffee00000 +3e3bfffffe780000 +3e3ffffffe000000 +3e41fffffebc0000 +3e43fffffe700000 +3e45fffffe1c0000 +3e47fffffdc00000 +3e49fffffd5c0000 +3e4bfffffcf00000 +3e4dfffffc7c0001 +3e4ffffffc000001 +3e50fffffdbe0000 +3e51fffffd780000 +3e52fffffd2e0001 +3e53fffffce00001 +3e54fffffc8e0001 +3e55fffffc380001 +3e56fffffbde0001 +3e57fffffb800001 +3e58fffffb1e0001 +3e59fffffab80001 +3e5afffffa4e0002 +3e5bfffff9e00002 +3e5cfffff96e0002 +3e5dfffff8f80002 +3e5efffff87e0002 +3e5ffffff8000003 +3e607ffffbbf0001 +3e60fffffb7c0002 +3e617ffffb370002 +3e61fffffaf00002 +3e627ffffaa70002 +3e62fffffa5c0002 +3e637ffffa0f0002 +3e63fffff9c00003 +3e647ffff96f0003 +3e64fffff91c0003 +3e657ffff8c70003 +3e65fffff8700003 +3e667ffff8170004 +3e66fffff7bc0004 +3e677ffff75f0004 +3e67fffff7000004 +3e687ffff69f0005 +3e68fffff63c0005 +3e697ffff5d70005 +3e69fffff5700006 +3e6a7ffff5070006 +3e6afffff49c0006 +3e6b7ffff42f0007 +3e6bfffff3c00007 +3e6c7ffff34f0008 +3e6cfffff2dc0008 +3e6d7ffff2670008 +3e6dfffff1f00009 +3e6e7ffff1770009 +3e6efffff0fc000a +3e6f7ffff07f000a +3e6ffffff000000b +3e703ffff7bf8006 +3e707ffff77e0006 +3e70bffff73b8006 +3e70fffff6f80006 +3e713ffff6b38007 +3e717ffff66e0007 +3e71bffff6278007 +3e71fffff5e00008 +3e723ffff5978008 +3e727ffff54e0008 +3e72bffff5038009 +3e72fffff4b80009 +3e733ffff46b8009 +3e737ffff41e000a +3e73bffff3cf800a +3e73fffff380000a +3e743ffff32f800b +3e747ffff2de000b +3e74bffff28b800c +3e74fffff238000c +3e753ffff1e3800c +3e757ffff18e000d +3e75bffff137800d +3e75fffff0e0000e +3e763ffff087800e +3e767ffff02e000f +3e76bfffefd3800f +3e76ffffef780010 +3e773fffef1b8010 +3e777fffeebe0011 +3e77bfffee5f8011 +3e77ffffee000012 +3e783fffed9f8013 +3e787fffed3e0013 +3e78bfffecdb8014 +3e78ffffec780014 +3e793fffec138015 +3e797fffebae0016 +3e79bfffeb478016 +3e79ffffeae00017 +3e7a3fffea778018 +3e7a7fffea0e0018 +3e7abfffe9a38019 +3e7affffe938001a +3e7b3fffe8cb801a +3e7b7fffe85e001b +3e7bbfffe7ef801c +3e7bffffe780001d +3e7c3fffe70f801d +3e7c7fffe69e001e +3e7cbfffe62b801f +3e7cffffe5b80020 +3e7d3fffe5438021 +3e7d7fffe4ce0021 +3e7dbfffe4578022 +3e7dffffe3e00023 +3e7e3fffe3678024 +3e7e7fffe2ee0025 +3e7ebfffe2738026 +3e7effffe1f80027 +3e7f3fffe17b8028 +3e7f7fffe0fe0029 +3e7fbfffe07f802a +3e7fffffe000002b +3e801fffefbfc016 +3e803fffef7f0016 +3e805fffef3dc017 +3e807fffeefc0017 +3e809fffeeb9c018 +3e80bfffee770018 +3e80dfffee33c019 +3e80ffffedf0001a +3e811fffedabc01a +3e813fffed67001b +3e815fffed21c01b +3e817fffecdc001c +3e819fffec95c01d +3e81bfffec4f001d +3e81dfffec07c01e +3e81ffffebc0001e +3e821fffeb77c01f +3e823fffeb2f0020 +3e825fffeae5c020 +3e827fffea9c0021 +3e829fffea51c022 +3e82bfffea070022 +3e82dfffe9bbc023 +3e82ffffe9700024 +3e831fffe923c024 +3e833fffe8d70025 +3e835fffe889c026 +3e837fffe83c0027 +3e839fffe7edc027 +3e83bfffe79f0028 +3e83dfffe74fc029 +3e83ffffe700002a +3e841fffe6afc02a +3e843fffe65f002b +3e845fffe60dc02c +3e847fffe5bc002d +3e849fffe569c02e +3e84bfffe517002f +3e84dfffe4c3c02f +3e84ffffe4700030 +3e851fffe41bc031 +3e853fffe3c70032 +3e855fffe371c033 +3e857fffe31c0034 +3e859fffe2c5c035 +3e85bfffe26f0036 +3e85dfffe217c037 +3e85ffffe1c00037 +3e861fffe167c038 +3e863fffe10f0039 +3e865fffe0b5c03a +3e867fffe05c003b +3e869fffe001c03c +3e86bfffdfa7003d +3e86dfffdf4bc03e +3e86ffffdef0003f +3e871fffde93c040 +3e873fffde370041 +3e875fffddd9c043 +3e877fffdd7c0044 +3e879fffdd1dc045 +3e87bfffdcbf0046 +3e87dfffdc5fc047 +3e87ffffdc000048 +3e881fffdb9fc049 +3e883fffdb3f004a +3e885fffdaddc04b +3e887fffda7c004d +3e889fffda19c04e +3e88bfffd9b7004f +3e88dfffd953c050 +3e88ffffd8f00051 +3e891fffd88bc053 +3e893fffd8270054 +3e895fffd7c1c055 +3e897fffd75c0056 +3e899fffd6f5c058 +3e89bfffd68f0059 +3e89dfffd627c05a +3e89ffffd5c0005c +3e8a1fffd557c05d +3e8a3fffd4ef005e +3e8a5fffd485c060 +3e8a7fffd41c0061 +3e8a9fffd3b1c062 +3e8abfffd3470064 +3e8adfffd2dbc065 +3e8affffd2700067 +3e8b1fffd203c068 +3e8b3fffd1970069 +3e8b5fffd129c06b +3e8b7fffd0bc006c +3e8b9fffd04dc06e +3e8bbfffcfdf006f +3e8bdfffcf6fc071 +3e8bffffcf000072 +3e8c1fffce8fc074 +3e8c3fffce1f0075 +3e8c5fffcdadc077 +3e8c7fffcd3c0079 +3e8c9fffccc9c07a +3e8cbfffcc57007c +3e8cdfffcbe3c07d +3e8cffffcb70007f +3e8d1fffcafbc081 +3e8d3fffca870082 +3e8d5fffca11c084 +3e8d7fffc99c0086 +3e8d9fffc925c087 +3e8dbfffc8af0089 +3e8ddfffc837c08b +3e8dffffc7c0008d +3e8e1fffc747c08e +3e8e3fffc6cf0090 +3e8e5fffc655c092 +3e8e7fffc5dc0094 +3e8e9fffc561c096 +3e8ebfffc4e70097 +3e8edfffc46bc099 +3e8effffc3f0009b +3e8f1fffc373c09d +3e8f3fffc2f7009f +3e8f5fffc279c0a1 +3e8f7fffc1fc00a3 +3e8f9fffc17dc0a5 +3e8fbfffc0ff00a7 +3e8fdfffc07fc0a9 +3e8fffffc00000ab +3e900fffdfbfe056 +3e901fffdf7f8057 +3e902fffdf3ee058 +3e903fffdefe0059 +3e904fffdebce05a +3e905fffde7b805b +3e906fffde39e05d +3e907fffddf8005e +3e908fffddb5e05f +3e909fffdd738060 +3e90afffdd30e061 +3e90bfffdcee0062 +3e90cfffdcaae063 +3e90dfffdc678064 +3e90efffdc23e065 +3e90ffffdbe00066 +3e910fffdb9be067 +3e911fffdb578069 +3e912fffdb12e06a +3e913fffdace006b +3e914fffda88e06c +3e915fffda43806d +3e916fffd9fde06e +3e917fffd9b80070 +3e918fffd971e071 +3e919fffd92b8072 +3e91afffd8e4e073 +3e91bfffd89e0075 +3e91cfffd856e076 +3e91dfffd80f8077 +3e91efffd7c7e078 +3e91ffffd7800079 +3e920fffd737e07b +3e921fffd6ef807c +3e922fffd6a6e07d +3e923fffd65e007f +3e924fffd614e080 +3e925fffd5cb8081 +3e926fffd581e083 +3e927fffd5380084 +3e928fffd4ede085 +3e929fffd4a38087 +3e92afffd458e088 +3e92bfffd40e0089 +3e92cfffd3c2e08b +3e92dfffd377808c +3e92efffd32be08d +3e92ffffd2e0008f +3e930fffd293e090 +3e931fffd2478092 +3e932fffd1fae093 +3e933fffd1ae0095 +3e934fffd160e096 +3e935fffd1138098 +3e936fffd0c5e099 +3e937fffd078009a +3e938fffd029e09c +3e939fffcfdb809d +3e93afffcf8ce09f +3e93bfffcf3e00a0 +3e93cfffceeee0a2 +3e93dfffce9f80a4 +3e93efffce4fe0a5 +3e93ffffce0000a7 +3e940fffcdafe0a8 +3e941fffcd5f80aa +3e942fffcd0ee0ab +3e943fffccbe00ad +3e944fffcc6ce0af +3e945fffcc1b80b0 +3e946fffcbc9e0b2 +3e947fffcb7800b3 +3e948fffcb25e0b5 +3e949fffcad380b7 +3e94afffca80e0b8 +3e94bfffca2e00ba +3e94cfffc9dae0bc +3e94dfffc98780be +3e94efffc933e0bf +3e94ffffc8e000c1 +3e950fffc88be0c3 +3e951fffc83780c4 +3e952fffc7e2e0c6 +3e953fffc78e00c8 +3e954fffc738e0ca +3e955fffc6e380cb +3e956fffc68de0cd +3e957fffc63800cf +3e958fffc5e1e0d1 +3e959fffc58b80d3 +3e95afffc534e0d5 +3e95bfffc4de00d6 +3e95cfffc486e0d8 +3e95dfffc42f80da +3e95efffc3d7e0dc +3e95ffffc38000de +3e960fffc327e0e0 +3e961fffc2cf80e2 +3e962fffc276e0e4 +3e963fffc21e00e5 +3e964fffc1c4e0e7 +3e965fffc16b80e9 +3e966fffc111e0eb +3e967fffc0b800ed +3e968fffc05de0ef +3e969fffc00380f1 +3e96afffbfa8e0f3 +3e96bfffbf4e00f5 +3e96cfffbef2e0f7 +3e96dfffbe9780f9 +3e96efffbe3be0fb +3e96ffffbde000fd +3e970fffbd83e100 +3e971fffbd278102 +3e972fffbccae104 +3e973fffbc6e0106 +3e974fffbc10e108 +3e975fffbbb3810a +3e976fffbb55e10c +3e977fffbaf8010e +3e978fffba99e111 +3e979fffba3b8113 +3e97afffb9dce115 +3e97bfffb97e0117 +3e97cfffb91ee119 +3e97dfffb8bf811c +3e97efffb85fe11e +3e97ffffb8000120 +3e980fffb79fe122 +3e981fffb73f8125 +3e982fffb6dee127 +3e983fffb67e0129 +3e984fffb61ce12b +3e985fffb5bb812e +3e986fffb559e130 +3e987fffb4f80132 +3e988fffb495e135 +3e989fffb4338137 +3e98afffb3d0e139 +3e98bfffb36e013c +3e98cfffb30ae13e +3e98dfffb2a78141 +3e98efffb243e143 +3e98ffffb1e00146 +3e990fffb17be148 +3e991fffb117814a +3e992fffb0b2e14d +3e993fffb04e014f +3e994fffafe8e152 +3e995fffaf838154 +3e996fffaf1de157 +3e997fffaeb80159 +3e998fffae51e15c +3e999fffadeb815f +3e99afffad84e161 +3e99bfffad1e0164 +3e99cfffacb6e166 +3e99dfffac4f8169 +3e99efffabe7e16c +3e99ffffab80016e +3e9a0fffab17e171 +3e9a1fffaaaf8173 +3e9a2fffaa46e176 +3e9a3fffa9de0179 +3e9a4fffa974e17c +3e9a5fffa90b817e +3e9a6fffa8a1e181 +3e9a7fffa8380184 +3e9a8fffa7cde186 +3e9a9fffa7638189 +3e9aafffa6f8e18c +3e9abfffa68e018f +3e9acfffa622e192 +3e9adfffa5b78194 +3e9aefffa54be197 +3e9affffa4e0019a +3e9b0fffa473e19d +3e9b1fffa40781a0 +3e9b2fffa39ae1a3 +3e9b3fffa32e01a6 +3e9b4fffa2c0e1a8 +3e9b5fffa25381ab +3e9b6fffa1e5e1ae +3e9b7fffa17801b1 +3e9b8fffa109e1b4 +3e9b9fffa09b81b7 +3e9bafffa02ce1ba +3e9bbfff9fbe01bd +3e9bcfff9f4ee1c0 +3e9bdfff9edf81c3 +3e9befff9e6fe1c6 +3e9bffff9e0001c9 +3e9c0fff9d8fe1cc +3e9c1fff9d1f81cf +3e9c2fff9caee1d3 +3e9c3fff9c3e01d6 +3e9c4fff9bcce1d9 +3e9c5fff9b5b81dc +3e9c6fff9ae9e1df +3e9c7fff9a7801e2 +3e9c8fff9a05e1e5 +3e9c9fff999381e9 +3e9cafff9920e1ec +3e9cbfff98ae01ef +3e9ccfff983ae1f2 +3e9cdfff97c781f6 +3e9cefff9753e1f9 +3e9cffff96e001fc +3e9d0fff966be1ff +3e9d1fff95f78203 +3e9d2fff9582e206 +3e9d3fff950e0209 +3e9d4fff9498e20d +3e9d5fff94238210 +3e9d6fff93ade213 +3e9d7fff93380217 +3e9d8fff92c1e21a +3e9d9fff924b821e +3e9dafff91d4e221 +3e9dbfff915e0225 +3e9dcfff90e6e228 +3e9ddfff906f822b +3e9defff8ff7e22f +3e9dffff8f800232 +3e9e0fff8f07e236 +3e9e1fff8e8f823a +3e9e2fff8e16e23d +3e9e3fff8d9e0241 +3e9e4fff8d24e244 +3e9e5fff8cab8248 +3e9e6fff8c31e24b +3e9e7fff8bb8024f +3e9e8fff8b3de253 +3e9e9fff8ac38256 +3e9eafff8a48e25a +3e9ebfff89ce025e +3e9ecfff8952e261 +3e9edfff88d78265 +3e9eefff885be269 +3e9effff87e0026d +3e9f0fff8763e270 +3e9f1fff86e78274 +3e9f2fff866ae278 +3e9f3fff85ee027c +3e9f4fff8570e280 +3e9f5fff84f38283 +3e9f6fff8475e287 +3e9f7fff83f8028b +3e9f8fff8379e28f +3e9f9fff82fb8293 +3e9fafff827ce297 +3e9fbfff81fe029b +3e9fcfff817ee29f +3e9fdfff80ff82a3 +3e9fefff807fe2a7 +3e9fffff800002ab +40862e42fefa39ef +3f7fc078227f1e42 +bf3163203286c1e1 +bde8ed23cbb765a3 +be6aa415b2b90a77 +3e9d46295946b45c +3fda549a3068c428 +7ff8000000000000 +3eb1a0ad02696ec9 +7ff8000000000000 +4001f87fe99c883e +3e93d677faf303df +40267fd65ba30a33 +40253d66d286d610 +3fd0c46ae34cf8ac +4024cc8397c419d3 +3e037b4ae4ce8a65 +402706b7238030a2 +bf0706f7c4de69c7 +401a4b35b9adf988 +7ff8000000000000 +3ecf9e965547e5c9 +7ff8000000000000 +bd674c98c0033e11 +3e95e30f37389d93 +4014c0b501e7d93e +3d831188f0e7a85a +3e9ec899dd70c81e +be15a7b56bef5791 +be151fe382e6a6da +bf015fe66bd9fc22 +40071e86df8b6352 +bfdd13a34d3b6854 +3d7e2d91d79d2d93 +3da2a1c0eded77f5 +3de1e41e86985b9f +4022b5582b8bdc56 +3e3553c83de25b19 +bea90590565be99c +be3b727e0a587ac7 +bfccc554c0f2b08c +4025da77102814dc +bf37bde6f678ecfb +7ff8000000000000 +4021d8cd3790b3ee +bf31782b02b37c4b +3fa539d0bef34677 +bd8a9b4e6e14f0f1 +3f646b714f47d7ae +bdbbcbaae8b32482 +3ec993f90c2b6db7 +4020302aa185ad64 +3ed9ec3f400d57ba +bf8b917d846a404d +401783eed2f3d6b6 +3e2673f417928761 +7ff8000000000000 +bfc410dadd91c386 +3e50b7641ad95b20 +bda799ef9bc8af7d +3dd149d50e8b62c5 +bf87cd30f2d40108 +3eba6e7e029eb450 +7ff8000000000000 +40188f1a2d0e46c0 +bf43d45bb5f048e7 +bda556b63cb71cb3 +be48f157c0f323eb +7ff8000000000000 +40215f1b5d90f4f5 +3fecd99f9968272c +be8fbf9e4b55f700 +bdc38a4c3f3dbdd6 +bf7afc5bd3a0029b +be4628da2e1c511c +bf54ca089db12f72 +3e4d71fc0eaafca9 +40112f60b735c254 +3ddba13695e741dc +3fc3d712575cfdc0 +400679a2c3eb0007 +7ff8000000000000 +7ff8000000000000 +bdc0cf4e1341a255 +bfc72ee34db76384 +bdddda4e42a6f8d2 +402a3a4cc3335397 +be5d2e51ad525ead +3fb45f8686c5258b +7ff8000000000000 +7ff8000000000000 +beb97d93954e85e2 +bfbfed1ee3e71ff5 +3e80f7d98962f0d9 +bdf25918046d9436 +bf5fe4fb637a23b3 +3eda3edd3e171338 +3e227217022ac417 +bdc68aba66ce851e +3f483be002bdbb7f +bdaa33d24493a333 +3e549f9b08194ff3 +bfa06eb5a172ea53 +3d6b99c3b5466d1f +7ff8000000000000 +3f98680327b8219c +7ff8000000000000 +40229405f78cf1a6 +3f43ffc2df01f964 +be68188c20bb26cc +4011a443e478c489 +3f7500b74f79aa8b +bf2c74d4fb29c947 +3ec37d667c8ff8ca +3d6b64c75596b35a +becb9d659132e85a +402283f9ebb992b8 +be3d8bfae8da70ff +7ff8000000000000 +3ece41936ed44c99 +40261833267bd8cc +7ff8000000000000 +3f7384d5faa48776 +40068a326810eb99 +bd74a7e3a28d3e94 +401510790c6ba1f6 +be8b4246b8858768 +3f9e2c0c3d764b24 +bfd2d8b454bf492b +7ff8000000000000 +3f70c1b9bc97a20c +3f63386fa478f7f9 +40262b2b571069cc +401052841943dd65 +400fc5fc8c7d4abf +3e061f21c0da353b +3e567a34fe1d5eec +3f578dfb0671ccb1 +bdacad063eb71239 +3f14e768a46505f8 +3ec28c80277d6650 +bda50d0414299522 +be5492d1bc86468c +3e4580907ab2a04d +3e27ae51a7555a3a +bf3cfebe9eb24e95 +3eb17e9784401efc +3ffd5b2309e085c6 +7ff8000000000000 +be6fbcca25b0d00e +3db28c502505da77 +7ff8000000000000 +3f905b5bd0bb712c +40259a695654ef98 +bf2fd78e0814726f +3f6c35b1eb8757f0 +3e2851fb68a3dc51 +bde818a350a11092 +3f716ec293b87455 +3e4d59c09f115beb +3e8762fe55a69cc4 +bd9c1d10cad2ede4 +40149ca347bf1512 +3e61bc404cbbc1fa +be266daffad51aac +bf2fe41f0c70bd75 +3da9dfe5e52d56a9 +bed1ca8a472be7de +3ed107bcb743c3a1 +bfc7cad200946410 +3f604fe59aa9534e +3fbdfda96281a647 +4026618adf7435b0 +be9621803675bda2 +3d70fbe8d025cd2c +be470b6eba43d854 +7ff8000000000000 +3ff1d8403cbd49c6 +3d6b09415daf8871 +bf2e3fae3a43a8d6 +bf312200d25805d0 +7ff8000000000000 +3f117b3518440f97 +4025f7926328e303 +7ff8000000000000 +40254f2bb89c7739 +40006cd85628f70a +7ff8000000000000 +3f9e857ef6aef712 +3d6908e577100bd5 +7ff8000000000000 +3e4246dfffec5c15 +3d9d0196757bb8b4 +40223d15d58a2e67 +3f5ba69db21f912a +4028e7df93b25d5c +bd8608a0f663e7d4 +3ec697c61f063c89 +3ff3265742e1840b +7ff8000000000000 +3e2f255a65ea65ac +7ff8000000000000 +3ed0285b44029be8 +3d6600977c16a744 +bdf63633dff1ad41 +3ec5935db0c99a3e +7ff8000000000000 +402a1e5fc33524d5 +beb5b6dd69efe87c +bf78b74e424f1c84 +3e7eec5ef75e9d69 +3f523b06fbdabbfa +402363b5eb506aa9 +bea12584b62224d1 +be9bf3ccf0f43ce1 +4017a32bb0b41e55 +be11ab517e981e49 +3dc31a35003715f1 +7ff8000000000000 +402857b4e7739ea1 +7ff8000000000000 +bef6cfa9eb0df4bf +bfc2174e723413c0 +3ef4f2fc4b954eb0 +bf523030bb766105 +3fb9481c9f228464 +3e80473d9534b07a +3d6eb3f808c587dd +3d8276986076280d +7ff8000000000000 +40162851fada6176 +be6cf8dcf14360e7 +bf9283b6330e8519 +7ff8000000000000 +bf2a3074834210c5 +bedbe790f2172f5b +4006f5606e25d87d +3e4774d3ca7bf681 +bfb66fda70b53657 +3ed91e564441a55c +3f7d9b33c55030a6 +bde087334ddeb3c5 +4013223ba688d2f1 +7ff8000000000000 +beb8a35512669259 +7ff8000000000000 +3f6a1fdecca1ea40 +bf177834fd2fbb83 +4006b51a078e7d5b +be477b326a7ae880 +bfa9b336661415af +3fce25d20ab4dede +be13b3329bf12621 +bee362288e2817ef +bf297dde93cba20f +4011c9c0087c2d6a +7ff8000000000000 +bfb87cd78412c869 +be5aacf7339462b1 +3ff510c8d721c10b +bef6a30f0f89f75c +bf50ef117561f35b +bd845a05b34596f6 +3ff91839c64efad6 +3f1f574b92f47ffb +7ff8000000000000 +be58f2197627a932 +bf9d7533134cfd19 +3f96d41851402faf +7ff8000000000000 +3ff85d0488c43cad +3fb585dda4c31af9 +4014dfb9cf16f689 +3efc206b512a1eff +3e8289dd93ea04a0 +be80abd6ec0f0d14 +402340540b12bece +40274a7bc39ba46c +3e11f22ebeb6550a +bf8ad2c74fbb962b +3d950418d6b74cf8 +7ff8000000000000 +3f4c4a416aa36af2 +bfe6d9f4c3e23065 +beaad2708a1d9075 +be4653f1ecaf9ebd +3e9196012e8f5d33 +3f400797efae8712 +bfb4574d8fddee27 +be88981e3cfed32a +3e2c3aaf9e74b82d +3da0621d0c5d3099 +bdd149390c231ddf +7ff8000000000000 +beae34cff81d14ce +3ed6c71c9905be21 +bec9882c8e419660 +be1a9a66f86b73a9 +3d7194c3902144e1 +be328390f1d8ded9 +3f71870126aa800e +3d6b8730f018eaae +7ff8000000000000 +7ff8000000000000 +4010e495a3c543cc +bed253d3c498e29f +7ff8000000000000 +bf499d5097bb0203 +3ee0764559fd52a2 +3f92b1fc5083a883 +3f496ff94d43e6b3 +bd7e7f4032dad2b6 +7ff8000000000000 +3da61701c40b55f8 +3fce5d0c540c15f2 +3e76829a5323bde0 +be94730267e344b4 +7ff8000000000000 +3e2016c6ecbadcae +bf3489edc01fa9bd +3f2fcbddcf8bdfdd +3ef77000921693a2 +bfd9a0e8c3746f78 +3fd6bcec98f27b6f +3d94584359127271 +402725497503d827 +401e94046155e257 +bf6b2321394bcf80 +bf74d744aa9d09fd +bf37aac41a453982 +7ff8000000000000 +3dcec8d8be3e141a +3fa0d5a6ed274056 +bdc5cd6b8b4ab586 +7ff8000000000000 +7ff8000000000000 +bec2ca66dabd9ecc +401c265f82337832 +bd9389a3dced0444 +3db404df7dbccd0e +be00a0089beff9e0 +bf5762bd54a63e13 +3f3d62b5484316d4 +7ff8000000000000 +3e598873f46f80bf +40155068c0162af0 +bf193180b12a11ce +3da093bedca1c188 +7ff8000000000000 +bfa30475e00b2583 +bdd6bf8e8d80c643 +bdb8f82117f7860e +40203ee242aec39b +3db3982bf395227e +be82c62a4a0e45e1 +3e3ffa4ed42d9b16 +3ea916fd0df01c9d +bfc6239f150d0f10 +bd8bbc16f32fe8b2 +be2d6624f36631c9 +3ea7a40f24475c6c +3f8ab9edc6400b56 +7ff8000000000000 +40226d9cf7e9ba43 +bf876f0b16f98083 +3f906addb66b9ce8 +3ddc72a35783384f +bffb594e741dc8ac +3f43211cbdba81cf +bda65ac40243d1e5 +3dfa222491227d31 +bdbdd13565c95c1e +bf0f79978a20a7de +3efa2a6bb2264081 +3f632e9f76d6f2d6 +7ff8000000000000 +be56d9a5c655b049 +3fdf38192fcc11d2 +bd7b54c00a449150 +3f10b1ae6e3bf27c +4027a0acf3b000db +3efecc80e34e3d98 +7ff8000000000000 +3e2b8400aad0106e +bfbacce113bfa178 +3db22cf9509e84eb +bf66531ebbe20c69 +3f553eb94c470f12 +3ff36a5d53198783 +3d9394ff95445fe3 +7ff8000000000000 +3d6eee0720edbd25 +be91fceed0e05ea5 +bdd0d73d33be926f +beb7ba7bacbcfbc4 +3dc16bf55077fec5 +bdcf3fee2e6066fd +3dede69f4c328197 +bef189eee5bd4c62 +bd814f3d20103dd2 +bff14cb9e90651e8 +be12ac3c38a45708 +7ff8000000000000 +3f8c6504b789e817 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +bea44dc398937be8 +bdb1dac46b7110a5 +3da6d9a1d61aee00 +4012f8ccd5bbb4cb +bf8cd197394fb4b0 +be384eb8e9fc50e2 +bdc9e44bed1206ec +3f441c229b04c4d0 +bfea9ada98101cea +40251443e491d077 +beaf06ab8d89860a +401a5504dc401a98 +7ff8000000000000 +7ff8000000000000 +3ff7c7e4dc79a344 +bea51b09d212e8ab +3fe55d4e44c51c2c +400ec4ee75990259 +be8814c6cd5c59c0 +3ea377e61066b8d7 +3e7300754f49f6bb +3ff9a07cc62b147e +4011099240382ef4 +3f5864ffa5b1e5f0 +3f51947899aa3e20 +be23395cd9c3b401 +bf0452f6e806fd08 +3f5fa502450345e7 +7ff8000000000000 +3fc33cbb3db00d4a +3f92516edc73c96d +3f3e3c931b6be87e +3fc76008d8b852d1 +3e09d4a22d1f65c0 +3d640d7ebc0b4698 +be19065ec96f6c63 +bd6aff2086901d84 +bf42bcf44d771344 +bdacc68f23be00a3 +bdd562d29e0aee5b +bf60d884f552c0b2 +be16270546dc4d12 +be0b14f1afc0b2ef +4019f08b4f0eefb7 +beb36eaa68feeb6c +3fe763bc09bf1d97 +7ff8000000000000 +bf1059de42787cb2 +beafc41b4268f7ef +402658a06ad1c93d +bf38df55936cc0b6 +be0c2cec3abd8a49 +3ec295258a7c88de +3dca88e6174d5386 +bdd0aea987629ac8 +3d7afc5cc2a3b546 +3d920beed4cbebde +bd7299535bba7b65 +bdffe080e0b16245 +7ff8000000000000 +4021ddfdb30b42a0 +bd968ef39c1ae876 +3ffaf65e8d4fba62 +7ff8000000000000 +bf973de99f9a1ebf +7ff8000000000000 +bf77a750ad3a4130 +bfcc4866dff514a2 +3f733e833e2b64aa +bf79c163d7b714cf +bd99e5af7179aacb +bf2c931757a39c94 +be0d516a8161b573 +3f3edb284ecd45a0 +be74472a6cc5a26f +3d6cfb6309dae8f5 +beb6f2c22bdc0b50 +be4098ddf5d1be00 +3ef59a63ae189d51 +7ff8000000000000 +3e8d56b9d76b4806 +bfca5380c2170537 +be1bc2415bfb5f98 +bd904f2f8c927bf6 +be9aec71c4249e9b +bdab7a298763659d +3da4779a55925c75 +3fdd3c8524d18aac +402958d9defdf5be +7ff8000000000000 +bf73a34d1bb71a33 +7ff8000000000000 +bf906eae1c702c89 +7ff8000000000000 +bf7000220d5423ca +3dcb5a1601df4fee +bfd5383e4543f40d +4022be60144fe7ca +bf5e537244976432 +3db96a60cd0fa95d +bd6be248b8cc8f2e +3ff6f5061c379cae +3eedb92c947f5576 +3f72867fd7c1eba0 +3fef4a2b6d5a4795 +7ff8000000000000 +bd7fedef5377f406 +3f021a2571bd3e86 +7ff8000000000000 +3f2122dcaa492e91 +401c35c29b5bb985 +bef86cbf03369b18 +7ff8000000000000 +7ff8000000000000 +3fb1bbc363a2c17f +4003a3cf0d8cd58c +bf15c6b2c094c323 +3dcaf444b478759b +7ff8000000000000 +7ff8000000000000 +3fe5350e238f1f16 +3d79610d9cea2c06 +be4d62df64646ee6 +beca9b132047f115 +3e4a03ec0726fdcf +be08ebfa70bf25b7 +bd6add96f603b037 +be41bb3b3a8e1e38 +bfb5b36c44d6fdbf +bdeba5672a30d256 +3dac8512e5855dee +7ff8000000000000 +3e54e4e93cde96d8 +3dab222580f3ecb3 +4023acc44c0c6212 +3e33f4e388f91c53 +3eb257caa6ecaeae +3d6a80ca8634173e +3faa9527afc79a9a +be1986f6c25e20d0 +4015ece22c693b71 +bf3939108a3d5cd3 +bfb4e8e4dd01b6c5 +7ff8000000000000 +3e38788f2662beb2 +3f8bdb09a12dfb6e +40125a02906e3473 +bd75c4461f48a838 +7ff8000000000000 +bf9fc21d71e32e61 +bfdf6eb194f9286d +3ffca61937400945 +3e17ee2fb4cb623e +beff71ce4af43e98 +7ff8000000000000 +bde1e576c11ea626 +7ff8000000000000 +7ff8000000000000 +3fd054e40260a696 +3fea08d50da232e5 +4020445918194252 +401f6fdf155130e7 +3dca8e145130ab81 +3fa3ba79220bd413 +3e0ddb0336f344ff +bf23b6ab03015a59 +be0132cea5551ae7 +bde5e42c24e81d06 +bf6bc98875b795c7 +bdd0fadbd603f9e7 +4010212b34e1cff7 +3da1881c777bbd6d +4014d4ac63acafa0 +be14a04130ef1a8b +7ff8000000000000 +7ff8000000000000 +402a14516c8d4e55 +be9e28db50252dbb +be8db15e8fbfedf6 +7ff8000000000000 +3ddfbb1e384a14c8 +7ff8000000000000 +bee0d729e494f500 +be63afb6f6ada078 +402656213b8587f2 +3db21cbb4e42b428 +4023df9b482d2fb8 +3de02c72e020bd8a +7ff8000000000000 +be70ade7f554ab38 +bea642d35caae1aa +3fa127da7c4fac23 +bdd5576099ab9a57 +bed6c03aadfabd6b +be53391cf799d327 +3ee53e1484d0a0f6 +bfad8152b962d575 +7ff8000000000000 +3f2ade8031038b82 +3fcc03b9e286ce91 +3da483b2948aeae6 +3f2d16859464d4ac +3d60576394c4aac3 +7ff8000000000000 +3f6a12de28a2384f +7ff8000000000000 +bf17a87d3a72f43f +7ff8000000000000 +3da617092dff5d6d +be3ccd42b3021885 +bef673b58521b5da +40068c1683212d23 +3e017833a3a4b9d5 +bd92ca981d2ad883 +c00e51a44f419391 +befb5b0441de3134 +bf68a3e4e0bc40d1 +bec78fa5acbeef30 +7ff8000000000000 +3e11aff23b720a1d +3f39aa32efab9d2f +be1a5a5609fc2561 +3dcd282cae5ba5e4 +3e27831e252631d4 +bdd252581d94b3eb +3f63f3baa68b1c91 +4022a206d894e77d +c0012473a2efec6f +3fb7cf300f497ea6 +bfb11ae3dfe55c7a +7ff8000000000000 +be2dbc4600136a97 +be7269942a6181fd +3f755f56ac6870b5 +bf8645375ea5b7eb +be9297ddf5993430 +40006eb94e5d75c1 +bf37db0e4df0461c +402410eee24d9ec6 +be9270965af5bd0d +bed2af0503aa81cc +bfd6744d38c43564 +7ff8000000000000 +bf65b5ba97653e78 +401ee55498be761e +bd6ce0045b40dffd +3d9df87ef7cb6666 +4010a5f0d14c54f0 +3dc3f987ca981f8b +3fc104509ca1a3c2 +bf003e3522352b47 +3e0021f15139fcdc +3f82012fbe8e25c9 +3f03a8e812b13d81 +bffaf6ca8e97c546 +402442ad113f27a1 +402310a6f16347c6 +3f748a2c70067b71 +7ff8000000000000 +be1ac935d1da2577 +401227359ecbd407 +bdc938dae58ed072 +3e8fccac38e96de5 +4022eea7c1b8f481 +3fb02b2c4bf0b8f2 +3dc3359e7720a3ee +3e2a0bbceeff8b79 +401df36c6ed70bd7 +3ff67d43f2809a9a +bf81854dd4610050 +3ed49ce6feb7c370 +bea5adcf7c808a1b +3d7e2c452f74345b +3f05056ff880cdd8 +beb0553eb5959b3b +3f60a0687d1fa37d +7ff8000000000000 +7ff8000000000000 +402938affb529562 +4005ddee38443e53 +40194c4343d844d7 +be0580cf70852b38 +bfcf29fb895dcdca +7ff8000000000000 +3e930e77c6a7a9f6 +40224b20a5195030 +3d895c376e554d1a +3f98c8e24413169f +bd837acc2699794e +7ff8000000000000 +bdbaf945efc5305a +3fc510cf390765f8 +401ba042cc2f4f65 +be849e76e88ecb90 +3fabe0d1b2a05acd +3efe733763a96730 +7ff8000000000000 +bf550f6f8a6b036c +bf7f35fa7ca72a27 +7ff8000000000000 +bf00221748cd8f55 +7ff8000000000000 +bf0d0ac0b8d11406 +bdf0018fd3a22649 +be7777a542aea70f +bfd24d2f26c72535 +be032c379766400c +3d810d78321f2bfb +bdf4f8cb28281846 +7ff8000000000000 +3f773718e743c2ed +4022e195190bce17 +bdd056200e2ac46f +3e797b96a2544e2c +be318054ec34074d +3e5b11370d65f38a +3e4906811958eca8 +3fc9c33de63492b3 +7ff8000000000000 +3ec43ee404f57735 +3e354e98b4c263a2 +bdfbcbc13a015e8b +7ff8000000000000 +3f94ea3b0eccc75a +be878a692bc8d741 +40005d58eb53e14e +4028b0a0909857cd +bde7d48e582fbccc +3eb1d7bbaaa3a78f +7ff8000000000000 +be3731cba728566c +bdac03755988a29c +3e18acbe9d2cd87c +3f81e66b12abac70 +3d68dd7586a08e07 +bdb2adfd84e41fd5 +402185c2618cf06a +bf184eb7134fb321 +bd997f47bc18be52 +bd977db327c4efee +7ff8000000000000 +bf23b9e994e5967b +bfc03b2cd0dc66b0 +3df8e896b3eeca04 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +bfd5bda87bb188e2 +40268da788e0db4b +402014c3b997814a +3fa4653826ef495a +4014435730558feb +bda505fa686971d5 +3f55fac1103b38f0 +bf2dbaae413716da +3e82654b858bc706 +bf289fadd76d485e +be0ad494345aaef2 +be59d8ee03f9b52a +3fd5fc449365a842 +7ff8000000000000 +bf9eb0a662ae8060 +bfe03f3e7bfb7e2f +3e908824cb45ca5f +3fe9cfebf2cd8da8 +3facbe7eaf9ade76 +3dd2cce8bbf82c39 +befdbf4544633c9a +402a06828b5257ac +3fe4bf48f0e8d9a0 +be202bfbfc86de1b +bfc1339eda1a8304 +3d9891cb77f061bb +7ff8000000000000 +bfba71f88d819ab8 +bdc238b06751c681 +4017dc0e843070d4 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +be224477f09d251e +3dd361fdb9921d4c +3de0902819c16a3e +3f6354fc16d4d29d +3e486dae5fb137d8 +3ff81baad7202b78 +3ffb3528d5ed5c06 +7ff8000000000000 +3ee25ed3d5552480 +bd96c1e5f27da7ee +3ef75a2239b426de +3f2d8192b70dfbb5 +bfeefb1aeb8b0c20 +7ff8000000000000 +3fbadd00afe06c7f +3f7c3d4f8267d8ac +401f6bca0bb61695 +bdb6df9c0f257f9b +bdf716b972c07990 +3f502e37c470783b +bef754ee6ad97566 +3ee5cd7894e1b3d0 +7ff8000000000000 +3e12e0a56b24df01 +4005aeace2326c1b +3dd5b41cf44aa66f +bfc920268c422c45 +be5634b142c3a4d5 +bfc8159367307ec8 +7ff8000000000000 +401c1ef334ce8c8a +3fa81688361d75bc +3f0957c2f70222f1 +3dbf6b4400460392 +bef18d000a1145ef +3e1f1f2120b401cd +bfa5350ec98ebf92 +3f436eca41467f83 +3eb1469ca5a3e264 +3ea32412af91985f +3e59700ec7ec1005 +400d77d9ee91d2d8 +3dcac0f6d2de2dbf +bdd3ff6f9cba9969 +bf3025c914b21e61 +3ff85c0db1193d18 +bf64dd7db864018a +7ff8000000000000 +bdc9600a984e8276 +7ff8000000000000 +40260901295de58f +7ff8000000000000 +3fc824d5c9c07dcd +be79e3ab9fa43163 +bfb8dc5d5d332102 +3f6b2c7ebbcdf5a4 +3d7452e28c155e01 +bfe0d5efd1ba00ee +3e92a05fee6adc7e +bf6a1dbc599d4836 +3e91fe2ddb6e7d21 +7ff8000000000000 +bd7d3e4e0bae6fc7 +bf619e29a0a95617 +bf12487a1952b190 +7ff8000000000000 +bfd67e73fe1fb67d +4025600930086d03 +7ff8000000000000 +3e98305b3acc81ca +bf64bb4d6febb26b +7ff8000000000000 +bfd0ec775fe5c942 +7ff8000000000000 +7ff8000000000000 +3e94713ffa870a77 +3e1933020d172ca9 +7ff8000000000000 +3e5ba52436332885 +3d65d948f79e9a0d +bde456d2409b2b7d +3db14ec3920c0111 +3e5024c1a91f9b6a +bd96d92c12515aac +7ff8000000000000 +4027aa0f701e5bae +3f2d942cf61896b0 +bd72d8588fa3bd1c +3db38a2095098215 +3d7e5e6404b3727c +402a3ec90abaa295 +bf7397b64b08733e +3f3065597153f06e +7ff8000000000000 +3dbcd5ce87731d14 +7ff8000000000000 +3f3947f9947ac112 +3dc4a836cd3da354 +3e2a7d57ce82343b +bde15b455a8f5c56 +3ec40a37102de994 +4012f4f81c5149d4 +3f9201d7c16e6312 +7ff8000000000000 +be8e3ef5750f3964 +3e025aeda9a70b66 +3ee999a60acf5ce2 +400b5b5b3b5185ca +3ff556f98f92a520 +bf0edc9e6f996074 +7ff8000000000000 +c003ddff3e5260ad +be8d2097965fa286 +3dfe0ab2c873fd3d +3df4b6c2a96e3428 +be2408a92da8475b +bf29a2c7346d4567 +bd9371a8c155f77d +bd6d719102e6c930 +bdb9288a8322465c +7ff8000000000000 +bda3247d1a9d9771 +3faeb83a55c228c2 +3dc17f3d3e7f9703 +3f775ec68494172a +bf8a1e5e79e1413f +4019b0087fd4ba7f +7ff8000000000000 +bf668b635137b412 +7ff8000000000000 +3e7a7dccb1442ff4 +7ff8000000000000 +7ff8000000000000 +3fc06232b63ec521 +3e3c25ef5fb7f590 +3df50197248d97b0 +7ff8000000000000 +3e09b5c93c22bb71 +7ff8000000000000 +7ff8000000000000 +3e25ee20c11c754d +3fda023bd1338c35 +bdbf1020419dbea3 +40190a3dab921ae9 +3fe2157b9d4e6443 +bd96e51a29bcbee4 +401fb61d1f6c046c +bf82f8cac82f54ac +3e5d446f383c71d8 +beb1e50672549d0e +bf35ed19232f3d9b +3e26643b74c42137 +bff653a63c23f6ae +7ff8000000000000 +7ff8000000000000 +3f8059a8c32bc90c +be14e9281ba08663 +be677cddfd1f3a6a +3f533d4a4533f0f6 +3eb8fe929a8e5e59 +3d8d4a06aca685f8 +7ff8000000000000 +7ff8000000000000 +4017bf5b067bbae5 +3dd47f03c513426c +3f13225561f80e38 +bd6e5555f580f86b +3f33e05d1aee6c65 +3fa506b966531ada +402405e5a1bb8cad +401f2d766a1d63c4 +40230c2e82662c32 +bf049d46867a8d77 +3f8e6d93d82fb302 +bd9f48623d68d3f6 +3edb1fd0ade4c31c +be8418d84e29ca52 +7ff8000000000000 +3ee652bd1d3742d6 +7ff8000000000000 +be7c14ed8ac0db6d +bfb4449e72d1b75d +bf67759d09656f95 +bde89d4d7a8c59f9 +3eacb12886ef79d4 +7ff8000000000000 +3e7d7d4f124a3f5e +3f530d39dc907a0c +3e61db5f18cdffe9 +401075c46fc8451e +7ff8000000000000 +bd609e6579d02859 +7ff8000000000000 +3f87689628cb231e +3ef1060993935201 +7ff8000000000000 +3d74924f9efbc6da +40248146b394db56 +3e4c447dd625e004 +7ff8000000000000 +3d6bb0950dd7c786 +3dc49285926c748c +3e75b3d700c60293 +3ff7f1d9d447161d +bebb2d687e01b894 +3d864d8a8551a88f +3ed73de1fce64bc0 +bf22dd02fc457b63 +3f2a635a2e8056e6 +3dec3033d63dde38 +3fc0143f9220d1fc +7ff8000000000000 +bfa83b397c73a011 +3f43d6c100983181 +be38a4ad18e2b03d +3f4248c298a30a53 +7ff8000000000000 +3e59ec4586e57caa +3e42785093a68ecb +bde0d75175ab407a +bdafefb4bd4d1c70 +7ff8000000000000 +3e8169161b37a4fb +3e20235bb44fdd02 +bdd51d63a6ffa3c3 +7ff8000000000000 +4021e488e0a12aee +3f0928f37110051a +bf6536204562d0f7 +7ff8000000000000 +3d7999afaccf0b4e +3daf8d60d21b6449 +7ff8000000000000 +be225d1b5a2983d3 +bf2e7b43879a9d9f +bde7ba100f92307a +3fd572623d9af1c6 +7ff8000000000000 +7ff0000000000000 +7ff8000000000000 +0000000000000000 +8000000000000000 +7ff8000000000000 +7ff8000000000000 +@expm1 2218 607f2d8fa1ab934a +0000000000000000 +8000000000000000 +bfee9dfdd84a6710 +bfee97c23c7cfe48 +bfee916a88dc3983 +bfee8af63ec8a7f9 +bfee8464dd682005 +bfee7db5e19bb2ba +bfee76e8c5f57238 +bfee6ffd02ae09e6 +bfee68f20d9a27c2 +bfee61c75a1fb600 +bfee5a7c592ae40d +bfee53107922fe34 +bfee4b8325df12ea +bfee43d3c89a64fa +bfee3c01c7e8a991 +bfee340c87aa1155 +bfee2bf368ff1b8b +bfee23b5ca3c325d +bfee1b5306dd0f45 +bfee12ca7777e6ab +bfee0a1b71b059a8 +bfee0145482a2cf8 +bfedf8474a7bc403 +bfedef20c5205efe +bfede5d1016a1b06 +bfeddc574573b320 +bfedd2b2d4120103 +bfedc8e2ecc53c93 +bfedbee6cba9f8d3 +bfedb4bda969dd33 +bfedaa66bb2c1a01 +bfed9fe1328596d0 +bfed952c3d68d985 +bfed8a470615a4e6 +bfed7f30b3084d46 +bfed73e866e8c217 +bfed686d40794b06 +bfed5cbe5a84f74b +bfed50dacbcdbdc5 +bfed44c1a6fa4c96 +bfed3871fa8386af +bfed2bead0a1ae01 +bfed1f2b2f3938bc +bfed123217c75030 +bfed04fe874df7c4 +bfecf78f763fda77 +bfece9e3d86bbd56 +bfecdbfa9ce79554 +bfeccdd2adfb3ed8 +bfecbf6af10ad560 +bfecb0c24680a988 +bfeca1d789b6d3b5 +bfec92a990e061b4 +bfec83372cf21d70 +bfec737f298aeb05 +bfec63804cdbbc4d +bfec5339578f17fe +bfec42a904b0328b +bfec31ce099196b8 +bfec20a715b35c01 +bfec0f32d2a8e8ba +bfebfd6fe3fe3df4 +bfebeb5ce71ccafc +bfebd8f8732fc668 +bfebc64119080a79 +bfebb33562ff72aa +bfeb9fd3d4dbb838 +bfeb8c1aebb0cb46 +bfeb78091dc2a668 +bfeb639cda669a23 +bfeb4ed489e40e0e +bfeb39ae8d54b51e +bfeb24293e8432a2 +bfeb0e42efcf2d64 +bfeaf7f9ec01ce69 +bfeae14c7635a8ae +bfeaca38c9af072e +bfeab2bd19b99e98 +bfea9ad791849fd2 +bfea828653fe2896 +bfea69c77bae0f43 +bfea50991a9006ff +bfea36f939ed1936 +bfea1ce5da34716e +bfea025cf2d37876 +bfe9e75c720d3bad +bfe9cbe23cd11d6a +bfe9afec2e90cb1f +bfe9937819157601 +bfe97683c4544aec +bfe9590cee422608 +bfe93b114aa67ec3 +bfe91c8e82ed88a4 +bfe8fd8235f98556 +bfe8dde9f7f34454 +bfe8bdc35219cc72 +bfe89d0bc2912b92 +bfe87bc0bc306898 +bfe859dfa64e93d2 +bfe83765dc8ef1b6 +bfe81450aeac3c14 +bfe7f09d6042f580 +bfe7cc49289acad2 +bfe7a751326efe7a +bfe781b29bb5d946 +bfe75b6a75671c4e +bfe73475c3416f5e +bfe70cd17b8ec774 +bfe6e47a86e7c097 +bfe6bb6dbff5e653 +bfe691a7f334e607 +bfe66725deb2a620 +bfe63be431ce3d4b +bfe60fdf8cf5c47c +bfe5e3148162feb6 +bfe5b57f90d6d146 +bfe5871d2d538716 +bfe557e9b8d5d9b3 +bfe527e1850cba76 +bfe4f700d30fd62f +bfe4c543d314cd9c +bfe492a6a4231ccd +bfe45f2553c6ab8d +bfe42abbddc100ce +bfe3f5662bb912da +bfe3bf2014e9ae24 +bfe387e55dce6c51 +bfe34fb1b7cf34f0 +bfe31680c0ea4169 +bfe2dc4e035c9d54 +bfe2a114f5491c73 +bfe264d0f85dbf57 +bfe2277d59777fa0 +bfe1e91550447cb1 +bfe1a993fee48171 +bfe168f47187dbc3 +bfe127319e0c7e0a +bfe0e4466399630d +bfe0a02d8a382c60 +bfe05ae1c26cf364 +bfe0145da4cc449d +bfdf9937631e7a80 +bfdf072ca04b84e4 +bfde728f9d8d9377 +bfdddb54c3fd53d8 +bfdd41704876d738 +bfdca4d62aae2076 +bfdc057a343f8d14 +bfdb634ff7bc063d +bfdabe4acfb0e6e6 +bfda165dddab83ac +bfd96b7c093840c4 +bfd8bd97fedd21e4 +bfd80ca42f0fbfe4 +bfd75892cd268f29 +bfd6a155ce4561e4 +bfd5e6dee845109c +bfd5291f9096331a +bfd46808fb1ed390 +bfd3a38c1913053f +bfd2db9997c847a9 +bfd21021df839ec8 +bfd1411512424880 +bfd06e630a7cf6fd +bfcf2ff6b3caee90 +bfcd7b9a903d55f0 +bfcbbf8fa2dd76c4 +bfc9fbb34ad6d87c +bfc82fe24b40e6a5 +bfc65bf8c85f743c +bfc47fd244d6dc45 +bfc29b499ed387b3 +bfc0ae390d249fe9 +bfbd70f4389367fc +bfb973cb56e62bc8 +bfb564a7d2e96759 +bfb14338a3565fd0 +bfaa1e56a34becc9 +bfa19057e744bf40 +bf91b794936f798a +0000000000000000 +3f92076f9fb4adc4 +3fa230111cecc7cb +3fab85c3097341e3 +3fb282c3f88c1a3a +3fb7580ebbbe7f56 +3fbc43224b81f027 +3fc0a2306bf724a7 +3fc32e1725d52d83 +3fc5c57829db518b +3fc8688733ad92cc +3fcb1778e81c8165 +3fcdd282d940357f +3fd04cedc552e524 +3fd1b6dd3ac7d6b1 +3fd3272c06a48bd0 +3fd49df6e1c682b3 +3fd61b5b0680834a +3fd79f7632e21fbc +3fd92a66ab097adb +3fdabc4b3b7f82e5 +3fdc55433b9ecfb2 +3fddf56e9005543d +3fdf9cedad111460 +3fe0a5f0ccb4082a +3fe18135f845cc4a +3fe2605772bb9ec4 +3fe34366a2a5c796 +3fe42a753d027118 +3fe51595469f283b +3fe604d915809628 +3fe6f85352508f3c +3fe7f016f9d293e4 +3fe8ec375e5ee087 +3fe9ecc8296429e2 +3feaf1dd5cf02411 +3febfb8b553ef2cf +3fed09e6ca51a207 +3fee1d04d18bc68d +3fef34fadf586718 +3ff028ef646b273c +3ff0b9e362c5f41e +3ff14d64b8916501 +3ff1e37ee69585ed +3ff27c3da173497d +3ff317acd28e3955 +3ff3b5d898fa43d6 +3ff456cd4a6db9bb +3ff4fa9774378e5e +3ff5a143dc39edef +3ff64adf81e93d28 +3ff6f7779f4f9646 +3ff7a719aa14d7aa +3ff859d3548b589e +3ff90fb28ec1593e +3ff9c8c5879742d0 +3ffa851aaddace46 +3ffb44c0b16726ff +3ffc07c6844a2038 +3ffcce3b5bee940b +3ffd982eb24c034e +3ffe65b0471b8df3 +3fff36d021125bf6 +400005cf4790c7c0 +4000721614ddec8b +4000e044ea10639d +400150645ed6f5b1 +4001c27d319af746 +40023698482ed80e +4002acbeb07fc52f +400324f9a14a6c28 +40039f527ad2ec6b +40041bd2c7a00614 +40049a843d39944f +40051b70bcea623f +40059ea254856992 +400624233f2e8a1f +4006abfde626ca28 +4007363ce19c2f47 +4007c2eaf97d402a +4008521326503f95 +4008e3c0920e318a +400977fe9901bb9b +400a0ed8caa9f1ce +400aa85aeaa121bd +400b4490f187adf6 +400be3870df30bec +400c8549a560f71a +400d29e5552eec59 +400dd166f3960097 +400e7bdb90ab26be +400f29507763f8ac +400fd9d32ea01792 +401046b8bd1b9c3d +4010a21cae05f8fb +4010ff1c8a91b036 +40115dbf9360db6a +4011be0d29c5e902 +4012200cd056f2a0 +401283c62b83ab72 +4012e941022df256 +401350853e4513a1 +4013b99aed63c6bf +4014248a4170f3dd +4014915b91434e41 +401500175947d006 +401570c63c2b243a +4015e37103860c9a +40165820a08cd04c +4016cede2cc1c15a +401747b2eaaae6d6 +4017c2a8468ad9c4 +40183fc7d71ce33f +4018bf1b5e546a8b +401940acca1fc1f0 +4019c486352e61a1 +401a4ab1e7baa01f +401ad33a5856f7b8 +401b5e2a2cbee96c +401beb8c3aab8d19 +401c7b6b88abdff3 +401d0dd34f00e1ca +401da2cef87d926c +401e3a6a236ae0c3 +401ed4b0a26f9d15 +401f71ae7d7c80f2 +402008b7f95e2f60 +40205a00bbc4460c +4020acb7dcb0ccc5 +402100e3cf7635d3 +4021568b2479e453 +4021adb489b73779 +40220666cb44e48a +402260a8d3dca9ca +4022bc81ad65652b +402319f8817f9939 +402379149a146b90 +4023d9dd61e727ab +40243c5a652951ae +4024a0935211548a +4025068ff973d73a +40256e584f5fc544 +4025d7f46bbd1652 +4026436c8aee61a6 +4026b0c90e7549a0 +402720127d99cc87 +402791518614874e +4028048efcbbf7e5 +402879d3de34cc5c +4028f1294fa54cb3 +40296a989f6bed72 +4029e62b45d918f8 +402a63eae5ec3e63 +402ae3e14e14345e +402b661878f2ff58 +402bea9a8e2509d5 +402c7171e30bdef9 +402cfaa8fb9c76a2 +402d864a8b31235d +402e1461755f32b3 +402ea4f8ced0501d +402f381bde1fbc0c +402fcdd61cbb67b7 +403033199be483ee +4030809f888797d5 +4030cf82dff14353 +40311fc9c90b95c2 +4031717a867b2b81 +4031c49b771c290c +4032193316816940 +40326f47fd75e909 +4032c6e0e2807a32 +403320049a69c803 +40337aba18c4b7be +4033d70870792ff1 +403434f6d4515135 +4034948c97892b6f +4034f5d12e60faec +403558cc2eb1f870 +4035bd855085c831 +403624046eb09339 +403623e9f6bed575 +bfee9dfc435d94f1 +40362401c91709e1 +bfee9dfdafcc66e5 +403624046eb09339 +bfee9dfdd84a6710 +3f81f34c2a3ff7ed +bf81cb5ed5eebb80 +3f9b2989cf8c785d +bf9a75db7e4c92ef +3fab85c3097341e3 +bfaa1e56a34becc9 +3fbc43224b81f027 +bfb973cb56e62bc8 +3fdabc4b3b7f82e5 +bfd2db9997c847a9 +3ff317acd28e3955 +bfe168f47187dbc3 +3fa9a47afbe752aa +bfa86b6452277ead +3fd79f7632e21fbc +bfd1411512424880 +3fdc02e59855e3e0 +bfd37bd62449ed6b +3ff14d64b8916501 +bfe0a02d8a382c60 +3ff5a143dc39edef +bfe264d0f85dbf57 +400324f9a14a6c28 +bfe691a7f334e607 +40046792e3489b60 +bfe6fcc450fed78c +40059ea254856992 +bfe75b6a75671c4e +400e6aad8d4d2ebb +bfe956136194dec3 +400e7baf8c066dd3 +bfe9590552601d69 +400e7bdb90ab26be +bfe9590cee422608 +3d719799812df3bd +bd719799812de065 +401ddf2233195032 +bfec3895127da363 +3fede59c4d83958d +bfdee9a8a6e56544 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +0000000000000001 +8000000000000001 +0010000000000000 +7fefffffffffff2a +7ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fd44468da05994e +bfe1da7ccccc3ad5 +bfeffe491c58e5d9 +3ff3bb1700fde310 +403afb148519bc8a +bfeffff77d6fa93d +400b852228c53c77 +402a8ddf901118bf +bfeffff7fe06682b +4030abbd8a635148 +bfed3c35e6dd1175 +40615873791518a5 +40250a9000c0f698 +4079fbde52d74b10 +bfefff49d0705118 +40a01387c1374ee4 +bfedbcba5ec716fd +bfeffb06d5d7c14e +40b935eb06fffd24 +40ab2588455bb03d +bfeffd7463fe92e0 +bfeffcf5f8f9a602 +bfeffe966429d1ea +bfe8b79da3cd0ddc +bfefffe9a2968b04 +bfefffb2aca62380 +40e6600830a4a34e +bfefff8761e50912 +bfefffb6df0800f6 +40c033bb05d13f5f +401b9d67b3ddff23 +bfeff93e96766edc +404e23f8b904addb +bfefffee9ade7990 +bfeffb472a3d7e19 +bfefff5696b60fef +40e93cba8d69a4d6 +40cd0f57f15fb099 +bfefffd657d9cbe4 +40d5b634a8c340a1 +40189d01fabef675 +bfefffbcafa3dea0 +bfeff8fcae424eec +405375c6f89b0530 +40b10f47fd6029e3 +bfefffebc4f31b1a +409f8054f9409cdf +bfefefff14b3b8af +bfefff0a2e0849a1 +4050bf13b26b6996 +bfeffece07dc7850 +bfefd83b2e0b2a44 +bfefe3cbce62ce27 +40588c1033664c52 +404d318d6896a7e9 +401ae5070517b9dc +40b89f938f25c737 +40606a243d1d650f +40dee55396e62bf6 +bfef5db567a10546 +406e54836abdfabe +bfefffd8c3b16179 +3f796a55e0c7a022 +bfeffff5d42a3179 +bfeffff895fc73ec +402132ab74b9331d +4034fca15123d49e +bfefff7229f2a5b5 +bfefffebaa452634 +410c450d27e9e650 +3ff7a50eac44623f +40f428a1eb81cd6a +40ec7a19e3f71c32 +bfefffcc43a0b985 +bfbed3c44c76b33e +bfefc22b4ed9ae66 +40e23222cc877df6 +40a82066b9c4e1ba +bfefff562484031a +bfef2e7cb7ba7a10 +bfeffc5e623207e6 +bfeffff608e9a171 +40236855c173ca2a +40973fdd6ff94d2e +40418b82b2ea7e1e +bfeff57c58a46757 +bfed7dad5edfd0db +4084fe630f0aa494 +bfefff2a0aed6cb1 +4069d142b472e377 +bfefffdee9dc6268 +4062ecb838360909 +bfeffff286ae3af4 +bfef87fa937b3036 +3ff5bb73d1ad9211 +bfeffccc2d654be7 +40cc362409120d43 +3fe5169cbb8aeb83 +40533bed7b52aec4 +bfeffff1575835f5 +bfef2bd80d62c299 +40d02bb500ede093 +404955058237b790 +bfeec694573828d1 +4022a19ab367c928 +400b353f2d751233 +40da256f39c59c2c +bfeee82c97590f6f +4024dcc20db7f8a0 +40da5b2aa8aa1da9 +4038c6fc36872a50 +40e867597178e66a +bfea57003e34c92a +40ddb505f38e0a3a +40aaca55a00b4971 +3feb6a8be8fbf5dc +bfefecfaa1469a19 +40a025069ac63315 +bfeff716250efad5 +bfe6996de0e9ec94 +408778da350cf610 +405c10bae1e9087e +bfd85b5814be2e43 +bfefffc835eafd32 +403b21db714da6e8 +409c68fb1f987505 +bfe0f72d7beb559e +4015d0076b7e999e +bfeac75d1d999874 +4070dbc2a95a8cb1 +4052544a7ff81e35 +bfefff2c4810af8f +bfef41d35ebd1257 +bfee372e7b9a5793 +bfefffcc7bbf77a7 +400322bd2c7f3800 +bfefff671c5d288c +40b52f5dbbc63fbd +bfeffd4c22982ffd +40a33e378dd63a3c +bfe9b535f519f73c +41019a2a56647de1 +bfef1dda7380b9d3 +40d0780fcf390e3e +bfeff6c0614082ca +40f83d608ba4a938 +40dc0f676f150244 +bfefc921bc20fde0 +bfefc4ac87051891 +bfefffeb2ca7bc31 +41021c36e71de580 +bfefffec10a91987 +405295c78575406d +bfe9196d74d73cd0 +bfcef8e217ec6a8a +bfe4dd815cb56dec +bfed7f95e22997d6 +bfec523d535fc5a0 +bfedef3b09252c14 +bfeff2b34547b80a +400a82b405f53809 +bfc813439834aeea +bfefcc94936be6f8 +bfefef2c7256d34e +bfed7aabb41a5649 +bfd417f47a7498a2 +41016066215b43ba +40fdf7b825ac84bc +40807a2f13fc789d +3fe2e3f49a8cd3ef +40fd806dd4670028 +403230487ebebf36 +bfeffb8ee8194b11 +3fdf8c98cc4600b4 +bfeffff8ad259823 +401e4cbd73c571c1 +40332402f1c1f358 +40567836637ddf74 +408fe53ae7f476c3 +bfe7387fde1def01 +bfefff9912beebc0 +bfef85df0e4dd849 +bfefff732fdad856 +bfeff33dd70128a1 +4021fe7e77ab72de +bfefff44d08542d4 +401f90bd86bbd578 +40b1c1ab93987918 +40db73f1afeff1fc +bfeffff07079715d +40f14b868ce84db7 +bfeffff81a0685d0 +bfefe8dcaebd016a +404501c4d1a5920a +bfeffede8b6a3129 +40890bafc9112362 +40af1ababd67a89d +3ff0fb6c646de443 +40c60df08c42b426 +40800777dd1ae4c4 +bfeffaec18e343b5 +4048b62597b74f8e +40e7a2ced02c9a40 +40c52abeea5c65ba +bfd30d017d113225 +bfefffc60e8cc8fb +bfefd60628f9ee30 +bfe4904317019982 +405e9000097fbddf +4097cb0a3e2abba8 +40cd4cbe256b13d5 +40fcd7525e7d429d +bfefa080177aa85c +bfefffc69e1db758 +4084d446a95ba4d0 +409954e4e64e581a +bfeffff3ffdc4b5e +4021fb4f0d8bc79a +4063c4c57f4a2451 +bfe450abc7ce0094 +bfeff73844bffbde +4083f68172f9e026 +40bf6aa4c9fb141c +bfefff3eb02c748f +bfeffe89df80b7c6 +40e9f211536e1670 +3fe22a4dd9838807 +40cfb471b4906ce5 +bfeff2d3e5c80387 +4032f94e6fc32078 +407b8ccd60ced1ac +bfe0a738ec565b09 +40a4327eb9e75b47 +bfeff22bea18385c +bfefff4d5d17edbb +bfefffb16aa55d98 +401da1189aab5749 +407e59d0519f4618 +404156f2f43d6e7f +40cd6fc47bacb97e +bfefed93dab263d4 +4067e003956ff9eb +bfefff133b3642c8 +40dfbb16d9b55ba7 +bfee04da102aba03 +bfefee34c4f2201d +40a5776789d2f20c +bfee9c921bb1f9d7 +bfe9285737137fc8 +40d6b26b39e5e621 +405186bd43fefd6a +bfefda0ab1f78ac3 +40ddd228621e73f3 +4010bf1022105893 +4066079e174f122a +bfee9caed4e99eb9 +bfeff8124a454cdb +4035f5972c820c4f +bfe00bbdc0810e94 +bfeffcc36c934647 +bfefffccac680f9a +bfefdc35a404a3df +bfefac1ae3359d4e +bfeff9970d6f6493 +40aed7e560b906d6 +40d63c03fbe3577c +402e3ead13d56c5e +40b9d86af51d9ec8 +4032b2d71f0e8f50 +40b2b2986a978c83 +bfefffe9445afeb0 +bfefd57632258100 +4082c4d4983e4797 +bfefc391e4a781fe +bfefffcd1faa54ce +bfefffcfde94396b +bfeffbea038f53b1 +bfeffdd0ab82f47c +bfdaf1126f163d56 +4099e843d1505a68 +40946a4e52052a02 +bfeffcb0531564c1 +4101490ff472dd59 +405a345ca41b33e2 +bfeff37373879249 +bfefff11af8e5875 +40e691e1cee65c61 +bfeffbcb16998ecb +40d09106ba118988 +bfe91aa7b7920180 +bfefff59c5b7d328 +bfee45a031dfc33c +bfec3d43d268b5f5 +bfedf3c26cad4d14 +4053b2d88b2e913e +40c8d6979a881d02 +bfefffe5fe012d30 +40982c0a5f1bd892 +bfefd9290c1bead7 +400e0f6a3df8285a +40df112b46e6ba28 +40e1c5bc4f202610 +bfeffb404754cc3b +400035ee030e5bde +bfed17e7f6e0e748 +40e15d34c70c1e0f +bfefde856d1cde80 +40b7550f0e2d5f7f +bfefffec56b1c2d8 +3ffc8da11a89ac34 +40e1aaa7a9e85636 +bfeb996e9c3a4382 +bfeffdd72b8f91b7 +4072602c7d97f6be +406f3981813d7177 +bfecb8503cf8e299 +407b94ca8030a51d +4102c77dd45d0627 +bfefffb8aa069a81 +bfefe89cb2bbea42 +bfefe4eaf39f4e3a +40479e41675650c0 +bfeffc7a493ba784 +bfef6381a4e8f80c +bfefffe4b0667df3 +bfefb6670e2693f1 +bfefffdcfcc2241c +406af36560ff58d4 +4043e95baf172f70 +40c23b7c0ca6c2b2 +bfeffff03f2e7bb3 +402e5c770ebc0853 +4033db99b3ffb74c +bfeffff64312cc15 +40e7997cf50ffc6e +4003e22bff18c271 +4033143b18a202b0 +402de86a388da397 +bfefffe42f176c2e +bfee13fcecdb06ec +40998746a4bb2a36 +40812aec931aaee9 +bfeff5adec28e7ab +40c08da744dd4be2 +40bcc6f687972a59 +bfeff606ad6a3678 +40d1b7f27d45429b +409e24d5da98b224 +40e222c4f046bfd3 +407b58c3d79ab1d4 +bfec8e06bf46e474 +bfeffc383c147fff +407c003626de8940 +bfaf2ad963530656 +4098843ecf1c3ace +bfeed931b9b11095 +40a411cb60a66312 +bfef63456bddcaba +4107e74c03e20f6c +bfeffe40779d4ce5 +bfefe94fdff580d4 +bfefebf6d6c2a187 +bfefffeb0079fa63 +4050b991b49f8250 +4028ecd56ab201e4 +bfefffcb09d2585d +409335b79f4e31ba +bfefff49a5be37bc +404aea233f839d92 +405858cfa839cf88 +bfef6ea69a79b928 +bfeffff147e595b1 +bfeed65d70a4a2a1 +bfec2adfcb57a8a4 +404f709acba2f88f +40d0ad1df8a98d47 +bfe665680b7a3059 +bfe56e5e01c02163 +40a3382ea1a44afc +bfefed9e7f1a79a6 +bfefe9a3e8a7497e +40c90b5b68562940 +3fe2fbb5589990b6 +3ff8922330ac1664 +405822d27bbcb229 +4090d4e3fb96210e +bfbbea89ccce800f +40702bd02ba10371 +bfefff97b316b5e6 +bfef1223692e34b8 +3fee30ebc965b897 +40d0f47edbfa5a77 +bfeedcd5cac142da +bfefffee660582c7 +bfe465bef02b2e6d +bfefdcadd953a23e +400526d490801464 +407eac77dc04efba +40fe5131aefdcaa2 +bfefff3a780f3db5 +3ffbd8f27be957e6 +bfeb22250a5a8008 +40d8a6e590bae075 +40da3cf162749f82 +bfee6b5f00336ba4 +bfeffe7ff9e9d8cb +bfefffed109b63c1 +403a264a7c51efed +bfebce4499adef06 +410a22745fa3a6ab +40d42299d9a0bace +40ef839a89af0e26 +3fdacd9bc876744c +bfe92f74d34e6ab4 +bfe0664c2ec9c4a2 +bfefffee34859b45 +3fef4aa7e13f8cec +408bd7851c285445 +40304bcdcb5f4748 +bfed92fe1dcfbbfb +407e186fd1077f3f +407a8be1497eddf1 +40e9bb2aeef5c13a +bfefffc098bfe20c +40acf7b4f60ae8e1 +bfefffbb79d2b0ca +bfeff8e769983f6e +4070b0b7ed0c8238 +bfeef7408926bc6d +bfefdb8989e63f44 +bfe3363e200b0391 +40a3931765e5057c +bfeffc9e6f4c3492 +bfefff3f2eb47a65 +407e98d10d339545 +40c8eeeceb5c2e2b +bfefff9c6f63644a +4046691690d72b44 +bfdfadbefeeb8bf3 +4110d316cd76d49a +4086e4be66b0c007 +bfef679db1b76788 +4038d536c3082a54 +407aa2f6506113c0 +bfefff1e0f77358c +bfeff9c5cecf5867 +bfeffff2023e7cb7 +bfefff9220ab9ad4 +bfefffe6c794cce8 +bfef44e15600ede4 +40831ab696923d31 +bfeffed5b55b6e12 +bfeffff6169daef8 +3ff356d87a518f8d +bfe927737b1f56c0 +bfefffe9d182c59f +40906afffd3b2988 +bfeeb053d08db7cc +bfeffe2e78de0fcc +bfefffe465eee92a +408c9272b584f7db +40b0cac293427ee9 +bfea60e8de490cd8 +bfe91434f024f09c +40bea4e4a57c1bbf +bfef3ed514770160 +409365271b519d7a +4048d5710573bc84 +4046eaa5ae4308d4 +40e0e09b7e6f6696 +bfef6e71a71fdcd9 +bfef1659355f6898 +bfeffff5fc7384aa +bfefe9722a36b92c +40a0d7cb84fc71a6 +bfd1125bfdde6916 +bfefffb1c8d805a0 +bfefffd7e213d2c6 +bfeffebbd8a59667 +40230b1320d6eed4 +40d0813578440044 +bfeea598653a841c +40347376dc05b374 +4082c0b037a42ce9 +40fbc2600487829f +40bd855c96e20a8b +bfef482d2d529dd5 +40f260ef0fddf183 +40631fb71cbd4b4c +bfef8ddf4768f26b +bfecb8aa6daf78a8 +bfd842bbf847fcde +bfeff96eac535894 +40cb720464f57e56 +40b4b51cbfeb044e +bfeffde97e93e8e1 +4088d995491eb195 +bfecb9e354e244c8 +40877a726fbd441e +bfeff7c4500719b4 +bfeb813bf56e5c2f +40b7b80e21b6f232 +bfe44e3571db602c +bfdf3c5699291872 +bfe8815c301aa4ae +bfefa4d7eaf65b3b +bfeffff7093be2ff +bfec902e088b1a3b +40b3fc12af516e0a +3fffdf99d053b80a +409a4b85105ceceb +407e7218da88e850 +bfef8f05878763b6 +bfefa86cbdf3d792 +bfefffe35552d940 +4009a9a1c7802298 +bfeffff88bc3943c +401b4720b1aa8f4c +bfeee6607850e0a4 +40e78b7da9e8b732 +4090cea97b456afc +4022fa2c30fe2df0 +40f08eaf50f4d200 +40eebbac872c6290 +4102b32ed9d22101 +410b3dfcf08f8def +bfeea3c970d88698 +bfeffe131e99d48a +bfeffff1e578d6ca +bfeffe945d1ca888 +bfe8356ba1eb88c6 +bfddcd868b5b3010 +408dbd935bdce2ba +bfeffff582745629 +400dceea731336f2 +4055b2d1fca7f53f +3ff916b457b89086 +406335253f4263e6 +bfef44c966c9459a +40bdb16877501cbc +4011e1058d8aedfd +406f33a24aaf8ded +40da0d5ec37c16ca +bfdc7971db67aa29 +bfef56d043ea5ac5 +bfeffe50ec78301f +bfef897e2e4d9971 +bfeff7ff72041bef +405870277e1733c8 +bfeff3cd7e6a4d23 +bfeffdfdb3358259 +bfee4b7f6436e360 +bfd8f06bd32427ec +40e9f22ddc6f6700 +bfbdacd7e0a5f5fc +40e4dfd2ce9a9f38 +3ff6cb92b0cf7b07 +4091e402795b2e5f +400a9d3dc8cb4321 +40fbb12531b416b0 +4096125aee9bcf0a +410336122a9423fa +bfeffff6152ffc3a +bfefff91d15eb2f6 +4102dd590806a315 +406321d081522d3d +410741d937b41981 +bfefb8b8df240fc3 +406cb235109ff295 +bfefcad60f09eb37 +bfe5940592dbe32a +bfeff43490e11e3c +406bd4e64db8e33e +bfefbb099b1122c6 +405cd5f36b243882 +40b721e3b86498f8 +40c4e3010538b1b1 +3fdb29efee8b4f1a +406df749c0c846e5 +4091799836bda9e3 +4095224d6dbb6a22 +bfeffcc36584686b +bfeff28cfbffec81 +3fdcc0bc20f3de3e +bfec2e3c5817449f +bfe6e608ca0ffa38 +40432c75782de95e +401a11dfa1ea1563 +bfeff86f593ebc48 +bfeffecbd87227cf +bfeffe5a797ad13e +bfefffc6a7292404 +4046bae80904c42b +bfefffe3c81eda3e +40856f2a409105a3 +409547012626c369 +bfedc5def290a1c7 +bfeffcc7dcf50ddd +403889fa3fb74c48 +bfeda89c87058e45 +bfefcb363e6e747b +bfefffed2765e03a +40625e7d9dc5958e +bfefe701866a7422 +406b2ddd20291d64 +bfeffff516f4f6d1 +bfefff25a7aae527 +40a21756890d95f2 +bfef8e6b6dd1f15c +bfeffff7a35d175a +bfefeab48305119a +40c85a53eee0894b +4035beee77675338 +bfeffff41aad0d9d +40fc7db32517ecbe +bfeffed9e3f2d0aa +bfeb9afea73d5b5a +bfeffff23fefc444 +bfeffd0693ee70b7 +bfefffec1ed1bdfc +bfefffd187bf2aaa +4081a0b7e55042c7 +40b106e049bbf700 +40db63170cfd0f22 +bfef9e1760ae7322 +40c82242849048af +bfeffff7b77337b5 +3ff79db1810e7248 +40e6599a07439132 +bfefc798fb7ed82d +bfeffdfd7bbb7f93 +40136fccf3fbe4e4 +40732a4f4b753526 +bfea772466454a7e +405b6e31d002ff54 +bfed64f86df6d26d +410c24a5738aafdc +bfefff3d75d75cb9 +4090cc08035f5980 +bfeffaebb24527e9 +bfe9ae6d2951680e +40e227267c0d7f80 +40b7aee3eda24fea +bfefab262f13ca7e +4028838410fa82e6 +bfeff5476b8809d7 +40df974fefd26e6f +4090ce0e588ce894 +40dd8b7cb7a44221 +bfeffff5a69b4e69 +406fc043e4acea56 +bfeffff6e785239c +40fef26c33c5487f +407571b321b0da73 +4110a8248cd526d2 +409da00afec5bc8e +3fe5a6f69d121bb9 +410ad2b68d481a1b +bfefea146b65f174 +bfee1c8f3bece7c6 +4060be1a9808a9df +bfeffbc3e3df54a9 +bf8ffc72cb950be5 +bfefe7cbb1e2021a +bfefffeded6bb419 +bfecb9f208c19138 +411040ebdde4f5bb +40026f4a34dd749a +bfeff9073fa57875 +bfedfcf41b7f6b55 +406b696a4be35e32 +bfeffff66c0dcba2 +bfeffb1a966723d5 +bfefffd1e9440f26 +bfdb2970ca1b9c1c +40b53bc4871830c6 +bfefffebbc1f1a74 +bfeffe6b9517e402 +bfe078259c6046a2 +40cee7166573536b +bfe1dacbd8656377 +bfeffc5e8f69aebb +3ffed810451c04f8 +4028db6700b0df93 +4110082b192a4af9 +4060c974a1a45b46 +410da872e83e5377 +bfe24be485134a93 +bfefff37513b54a1 +bfeffff4384e95b9 +405531f125e1a5a7 +bfefdd24d2bd4811 +4105198e70f11740 +bfece01118de03a2 +bfe8c02d191d5b05 +bfeffec38aef4a6a +401234d9ca24356c +bfedb22110bf30a8 +bfeffe743871ebe1 +bfefffe62260a120 +40a5f08c5b083c12 +bfefffce888742f5 +40c6eaf4173bfcd7 +40a661beadc6379a +bfeff137e8784e21 +40f8590d03b50ac5 +40b67336a145e2cc +bfefff2c6520597b +bfeff6e8b15d3eaf +bfefffa966266aa9 +4040a18e4712f33c +bfd8715e6b73e389 +405db56a178b06cd +40f7523b2794dfd6 +40754a0e0b455af8 +bfe94fdcb1006dc4 +bfefffb196457249 +40ecee9fbb847bd1 +bfe2e911ab343807 +40160e993a2b14a6 +40359a8b0938e03b +40e0ee63d4614e2c +405568a247b33c25 +bfeff869b2c2aefa +bfec8537dfac7bb2 +bfefff725d580b79 +40615233fea35964 +4092f37c28010128 +40f415b512767b52 +40326e530f6a934a +40d2fd5dcab6f86e +40cca485b70ed781 +40630e0f9eeb22f7 +bfeecc4088baa034 +3fec9aa36ef42011 +401df490c531774f +bfefc540a52a43a9 +bfefff79abb7199b +bfefff920c39b298 +bfefff95fa72acef +407fd56a16b01c62 +40858975d2286ef2 +bfefff553d529239 +40e2e94203b4468c +bfefd8f540fd0952 +4086d3dfa07b97a9 +3fe53da85c796407 +40f9b0bb0a86b958 +40dec717f681a534 +40e46d899770c474 +bfeffff7e2ddf423 +4036cf731026a587 +40625ccb524a90f4 +bfe016a3e7ee015f +40e1917d959e5ce5 +404d95192e992baf +bfecbf32b5c74cbb +4070c17b23145635 +bfefffe3b2995af5 +4013f4aaec5b2e1a +bfefbcee2d5d9042 +405bf092ead05813 +4023bc6a526394bc +bfefff863f34b950 +bfefd862e83a35a6 +40f4ac233a5dd03d +bfefffe06908fc53 +403da478d2dce2c2 +bfeffff5eb419fa4 +409095ad6aa6a2db +40f59ede58799409 +bfeb3f8b8aa2e56a +bfeffff1b698cadd +40e2320a475e3aaa +404bad669b0547dd +40f61dfb09319c43 +bfebac4283e56857 +40aed1699cc1fdc4 +40d6ddf4d12386f6 +bfefffebe93e7d3a +40f1142032549a79 +bfeffff569324c92 +bfefffe92cca577b +bfefffd3bfa89adf +bfeffbb4a48fd082 +bfefffcc3c1ac1b2 +bfe906f6ad366158 +bfeffdeff0190197 +40c3733ac0c172ba +402a8dd911e59985 +40b408809bdfe4d3 +40ee66392ac6d6d4 +407a568e4eb26130 +bfebf301d4f82f2f +bfefffd4beab8fcd +403317ef19ea874b +407d41810a505813 +40bee415023bff06 +4108dbb94ff4110c +40d2ff22437e8d4c +40f91384f19d0cd5 +407ceabba891ce90 +40d029cffb27cb79 +bfefe1d5140d5f92 +bfeffe73e9b56d52 +bfef90621396a6a0 +402193c86a8cb160 +bfefffee0eedaa8e +bfefc8ad3d7388ec +bfefffc6681e870b +bfd17164b0d52ba4 +40a109fabb1724a2 +40d84ddcf9f202fa +bfe7d0d7d1baa56e +bfeffff84dd3371b +405695c7eeed9328 +bfefe77f40488ef4 +40744051505e6b9b +bfefffa6dabdbb8d +bfefb15650b1b31a +bfefffb4f2aff52e +bfeffd1d5df35bed +40361e225eac8fe0 +4084f2cbe79ab3ae +bfefffef64863587 +40d31baf32b0d373 +3fe7a5776fd3632e +bfefffe42eb37bbc +bfd0f79e44cc7492 +401804f7ab7bfdfc +bfeff8a0d8732f9c +bfeea55cd8bbe6ab +40f28bde669c60c6 +3fea7686a9171e8f +4092c59e4051c341 +bfed0e78e8ed2e6e +40fde83fbd4ae4cb +40d233b2b78f8372 +40632bc9efa27209 +40c928b8fca3ae56 +bfefffee8118ebf8 +bfef4d921faedc99 +40384b0f6344cd82 +40744f7e4e02b05c +bfef50b1e5544aac +4005a24782720455 +404c6d04408eb4a8 +bfeffe99bf852fd5 +4083655f671cec8c +bfefd3fea4a4132c +bfeff4089b736ab8 +40ab75b4ca7f0b04 +bfeffff8a12a8fa4 +bfeffc37cab52427 +bfeffd935dcc0360 +bfefffef65c51f2b +403a8f7789d20da6 +4099bddfa82c656c +4092865711613705 +bfefffe993ae7f8a +40ebb50d230c1d01 +bfec7df8ba8c3f7e +401e470c660aa887 +40ed1c0478cd3644 +3ff6abb973dc34ae +4069f8ab7b970379 +40579449b777f826 +bfeeb2c3d2a1c8a4 +bfefb8b5302074a2 +bfefffd920be119d +bfefd4151a1da6a8 +bfefefe9f3be6707 +406b737b82fbbc9e +409f7bd99803e394 +408797d8efcfb952 +40ffa402885d2525 +4008b510176b7b14 +bfeff17053d4dd6e +40abb48f00d87c30 +bfeffff7739424dd +40c79ec7f02f476c +bfeffff873625eb2 +403037eb4334ad87 +41064a3d08dab12b +3fff50df3b1d726d +bfeff4920f3df7ee +404e9b867aa856a6 +40a9e9d675715b5b +40c2dc0545d0c455 +40fffb50820a81d9 +409ca4e4b35d1194 +40515bceb304fe84 +3fd15fd612361125 +bfefffd3ba4047c9 +401be651c9316f6c +bfefe4e740cbb2d0 +40a6d021a62c2c40 +403877bcfe327a16 +40b3c8b740391ec8 +bfefffb4a61a0170 +404c499eb5a3365b +3ffdaa82305c992a +3fdcc1dd6ad734af +bfefffe17b108b8e +408a50090f3ddf60 +4051271fbc291c19 +bfefffee1ba087a3 +40f1572b81dd8eae +4048bdf79841b5c3 +40827295bbab4518 +bfeffb84420a7b44 +404f37df47c7b9c5 +bfefff9456a1298f +bfeff6ff48bf5f0c +4005c01183630142 +bfefe40598cc9955 +bfed0e461939c5cd +40121f727a441887 +bfefff839b4b302c +bfea27c34b9c5633 +bfecd6d386fa73ff +bfeff113aea9be92 +bfee9c6109717e64 +bfeffe7110f869ec +40cf19bce930311c +3ff29cec914cd4eb +bfec9ab27c6f3e4a +bfeffee8c59f854d +bfe51cc58ff2fec0 +bfeffbd2e844c380 +bfeffff2959184da +4028081476c5cf32 +40d79039cbc9b48b +bfeffee915154f2e +40f191b0e717d914 +402e87ed82eb5bd5 +4003cbac3e3730fc +bfeffe6feed88f8a +bfeffec197f1b48e +bfeffcbd7c16340e +410ff460097696a0 +4015a4d8d2496484 +4000b1531cc5729c +40bc3d4e232cf5cc +bfeede6a7bda79e6 +bfd052e989c4fd26 +bfeda8d9c986499e +bfefd3a0ffaf50ca +40ede5c647f2f3ab +bfefff49f034187a +bfefff95c44cbc54 +40b2b22a4be2f3de +bfeffff7a26096b6 +3fef9bc7b281f639 +bfeffecdad25415c +40c25b7ce1c7ac93 +bfc8012dfca48e0a +bfefff40cc9e7fcb +bfeff69d6835d237 +40d0906c79dc692f +40febfc395d12403 +bfefffbef43e8fbf +bfefffdc152e88e8 +bfefffc2c2ca6904 +bfed7c498b1cfd6e +bfeffff6abcdcfea +bfec4acf895d99c5 +bfeff9a4c76f122b +bfeffce1b2e8e587 +405422ea532ff2f0 +bfd1df503ea85039 +bfeb59104f11e6c0 +408f9693c94f44d2 +40710cca12aa671e +bfefffe581624be6 +bfeffb643ee43390 +bfed4c9351d3ca24 +4060258333d942f2 +bfeffe610004267f +40cd0abeb6164868 +bfef339c072e3fd3 +40b69981a106d1cd +407ca873bd6b8c78 +bfeeefc65fb15025 +bfe8b395aa6937fa +bfefffcf18a17b6f +40af60d5bfec040c +bfe314b020879247 +bfefe9702bd44f6b +40e736a0f0fe99b3 +4057c8220152209c +bfeffee4a6359e11 +bfeff2cdcaeadc9f +bfefffc29de415f9 +40418df70935e3b2 +bfeffedf1d0d64a8 +bfefb1cdba640be2 +410bd28e2760d430 +bfefffbbf7c9f8ff +40f748dd8cc967be +4053cdd4d2b1c132 +bfeff000eddef248 +bfe465b6a3bed036 +40d77dc169262aff +40e0ffc3d45cd8ba +bfeffae99ba3f2c3 +410fd033c165cefe +bfefff6ef18acbe6 +bfe6a1a1a74b259f +4051626914b2ed64 +bfe33239d2cd8bd1 +3ffdd20a8bbb3a3c +bfeffea2e3b34a31 +bfeffe14d1d309d7 +40b4cd5e685063b8 +4036335ca2ea1f90 +408443d786ae356d +bfefff76b214f08f +405c7143980f3124 +bfea639617847eac +40445eb152e312aa +bfefbf60e6a0055c +4044beb783727955 +40c4b01e67529cac +7ff0000000000000 +3f0aa041d319e281 +bd46f5abac02c4bb +7ff0000000000000 +3fe4074fb24a11b8 +be6892198d53667f +7ff0000000000000 +3f42e6b50dcbc03f +7ff0000000000000 +bfeffc34eaee8d54 +7ff0000000000000 +3d30a80edab43629 +be2cb45d7d7cde2f +3dc2726d989ab5cf +bfa3945eb48cc7d2 +bd2e880c64445393 +bff0000000000000 +3d5ed67c594a40be +7ff0000000000000 +bc4006968c4ec4bc +bf3a0e8bf8a23ddb +3d928b8c463f37af +3e9ef6b88ae377d9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +5cd6cfea06e3992e +bff0000000000000 +bfeffffffff9affb +bd93172b2fffa74c +417481c51a561f63 +7ff0000000000000 +bfeffffff2c5064a +7ff0000000000000 +be9eb2b6fd0cdf32 +bd84c841cc53b299 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +be903b960aaabdf3 +bff0000000000000 +bff0000000000000 +bd474da73d90ee1c +3c404aa201d27d99 +bff0000000000000 +be98dc173dc19825 +3eacb3060bc84011 +3e36754b07a2e77d +bff0000000000000 +40b1e87f1fee44fa +bff0000000000000 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +be446a3dbe68bd9f +bce7dc6ccb90526b +41bafff883110d58 +bdca5f0f845b2b8f +bfee0d71e67fd0d5 +3caeee5ebbd13c3c +bdd3bd71c16df098 +bfa091303a32bf35 +bd1697426c72a5ee +bff0000000000000 +3e2070ce1fd6d87b +bfc3b60fd1f3e6ea +7ff0000000000000 +3f4a6652920a60f0 +bff0000000000000 +7ff0000000000000 +53a0419352aad052 +3de3f28192b1d7d7 +3e47c24530d09bd0 +3f60ac6fe902a77f +bff0000000000000 +be3806674a3d2080 +bda6f85064811c18 +bf0207b015c95ce3 +bff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +bd30742f6892d5e7 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +3ec341a52908df16 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +3c4bc806d22ceb36 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fa6a44ac0a0c283 +bc55824696f4d488 +3e216723a55dc40f +bfb6d7af990ed2f0 +3eddc3b889016e53 +7ff0000000000000 +bf6d0705f847db64 +bfb82ef10df30090 +be1bbe0865aa7faf +bf229b1434d2c8ef +7ff0000000000000 +bff0000000000000 +bff0000000000000 +3d5e5268abd3b36d +3c5a944b565c4790 +bff0000000000000 +40244a29b157c70f +bff0000000000000 +bd0daa213668a338 +bed74e78646aeccc +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bdf99d08e6f60978 +bff0000000000000 +bfb7f4704555db7c +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +beb1e1ddf36260c9 +63d2c1d557c50a80 +7ff0000000000000 +bcaee88883526e32 +bd5741caa1e75696 +3fce596b8e340f0c +bfdb889585ecae4b +7ff0000000000000 +404d139adb154e07 +bff0000000000000 +be512df882a1e933 +3d3d013b57f989ce +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +3dc0ac225af25c88 +7ff0000000000000 +4951307b337b8efe +7ff0000000000000 +3ec82d231016f2da +3d410e66b917ac9a +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ca5bf9310a3d1de +be45e26393928604 +bced8dc9dac70ac7 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +3f301fa064830239 +bff0000000000000 +bedaccf20a625904 +bf2514376438c047 +bff0000000000000 +bedc21d61c31db3b +7ff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +3cca57b9dbb26e37 +bff0000000000000 +bf4b621589ee9a53 +bd868ce7d5428dea +3f42cd0ac9e37067 +bff0000000000000 +bff0000000000000 +bce37f62908ed730 +bff0000000000000 +3f4c7880008a5289 +be64f15b4e35a0ef +7ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bed0c0ab7221c206 +41b065d6227be407 +3fe222e6ce60425e +3f8717508e7bbd12 +bff0000000000000 +3e124a09df1c335c +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +bdb3a1cd47450741 +bf4139512ec5e165 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +3e65f7aa15a9970d +bc3c0c998aa0755b +3fddbb6f105914a8 +3e30fc5620bf874b +7ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bef7c7add7614fe2 +7ff0000000000000 +bcf1dd15f5c9b6ae +bceac4e44d44b202 +3e4d77bbe13b381e +3fab30eb3c2cc864 +bfc3634035da3f94 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bf9a379d271f3988 +7ff0000000000000 +bd25c17fdeea520c +3ed5ba20eea68ae6 +bff0000000000000 +beda9d848097d4ce +bdee83ef41fccafd +4044c6dfeb7136a6 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +3fb165f3cf1b1bee +3fa29c649cd4aa18 +7ff0000000000000 +7ff0000000000000 +beecfa4fde868af2 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +bf03399275a17ded +bc51a152ff105149 +3c7c24b19fd8439a +7ff0000000000000 +3ea374c68de0d1f8 +3f28d566f148e7c4 +bea00cbad7383ec4 +59c3e5ea0f0e393e +bca0e5c7a8787572 +7ff0000000000000 +3ea353cd4d4972f0 +7ff0000000000000 +3f89c5739eb3a622 +3cf17a55acff523e +bff0000000000000 +7ff0000000000000 +bff0000000000000 +3e2e03ae4a21ceb7 +bd56bd20eff74c22 +3e0a41f1579a2e68 +bff0000000000000 +3e420b90a05c7f8a +bff0000000000000 +56bbd7e06f25ed63 +7ff0000000000000 +bd453da2ab4f9c65 +7ff0000000000000 +3ef441e67c7864af +be5fe9d2d991b480 +bd885b7b2ae8318c +be02156fb45d64f4 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bd22356ef88a7ad1 +bff0000000000000 +3d442aea1583cbc6 +be2be83edc750ff7 +bcc6a42f51e892e8 +bff0000000000000 +bc98c2b9f51e8064 +bc300a0407057749 +3d303c512fd512d3 +3dc95ae1c6a0b73c +3f820c368c33b09d +7ff0000000000000 +3da26f496aec0e43 +3dd1e680aa7db1e4 +bd183c2a1f214f09 +bce17f0bd0ba8eb2 +bff0000000000000 +be97f1818790f6d3 +7ff0000000000000 +bd5218a0d73d3229 +be2af07c0c33a73e +bff0000000000000 +7ff0000000000000 +3ec2958535dc565f +7ff0000000000000 +be89f725715f437d +bd722debf45b89e3 +bff0000000000000 +bff0000000000000 +bd787778cf1df7c9 +3db1133e199dc2a8 +3c872b1a8ba6e01c +bd66f1aea38d9844 +bc7baa9a625de882 +bff0000000000000 +3e07c535cbc07b5f +bced81abff0a07e2 +7ff0000000000000 +3e8463fa88e4ebe0 +3d18ab3959532cc9 +bff0000000000000 +45b8255b48e0dd1c +7ff0000000000000 +bc62c630983e8e20 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +3d98fe6318d40674 +bff0000000000000 +bf8858ffc06da4e7 +3f5156a218d26d5e +3e71bbb7538c16d1 +3feab5b7b94ff4ca +bff0000000000000 +7ff0000000000000 +3c608232fa84595f +bf81204b3a5fc14a +bff0000000000000 +3db85b0be590a225 +bff0000000000000 +3ef72bbfa687e9b6 +bcf77981e7e4850b +beaed821c1dba108 +400d49106f35dbb7 +7ff0000000000000 +bff0000000000000 +bea8290084c0221f +bcf949688e2ae2cc +7e9efcbf44d5bbc6 +bed502beeb3de4e7 +7ff0000000000000 +bdbe26047ef68b78 +bcbc4be72834a53b +3c306ff20e372640 +5a2a5e6df2ee6cb4 +3f87cabfb2f74534 +3effcf1377eddf53 +bff0000000000000 +be119d00e2efc2d7 +3c378341eb020688 +bff0000000000000 +7ff0000000000000 +3e88027c0a8ddd02 +3edf0ddf6cd71675 +bd974a3abaa8d957 +bfe3dbcf7dcb95e9 +bd6d6567e9132c39 +3dd533aa9c43835b +bcbc649c71445fd3 +7ff0000000000000 +bf648944211a845c +7ff0000000000000 +bf497f5463ef9be9 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +3dec0f0519117167 +7ff0000000000000 +bff0000000000000 +3ee9b842c57d7531 +bfc5777967bdec25 +bd0af760051fd8b5 +7ff0000000000000 +7ff0000000000000 +bd2a742e1ed61713 +bff0000000000000 +3d2e67b10ca60b76 +7ff0000000000000 +3f370a30134b7cf8 +7ff0000000000000 +7ff0000000000000 +bfc4581765388e07 +bff0000000000000 +bfe88ed946c60f92 +bff0000000000000 +bfc1068f5ad31bda +bc30b1f4c589066e +7ff0000000000000 +bf90d06d260313ea +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +40066aa1843885fc +bff0000000000000 +bff0000000000000 +3ed3183f5087ad3e +7ff0000000000000 +bff0000000000000 +bff0000000000000 +bcc3c76748436e15 +7ff0000000000000 +40b382b7e3d344f7 +3f2d3b1494e71c76 +bf1d96f56351f3e9 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +bc64e5970e7ffeab +3e6b934a036edbf2 +7ff0000000000000 +bd97b1679e31ba96 +bf7659b0c7ad8e1f +bf6fe36d5d7cdbab +bee922efb1507cb5 +bff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +3db358bc057f0044 +3e9885abb2b286f3 +3c85e1a79c42eaed +3dc43d96e4974629 +bf4d7102ddb6ff5e +7ff0000000000000 +bd806a2727544cf0 +bd066724a1852d86 +3d18b7f16cce95b6 +bca5f3e6e9532ace +bff0000000000000 +7ff0000000000000 +3f062dafc670f9ac +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +bc90b6e647100129 +bef6a2ab6ccae130 +3d4e3777af94ebf7 +bff0000000000000 +bf80ab1a75775d9a +bd0b4f15e2cc6ca0 +3de340470fc928a2 +7ff0000000000000 +3faa1b4dad9af7fd +bff0000000000000 +7ff0000000000000 +3f3694577d695ec4 +3e4c406dedd1b6e5 +bff0000000000000 +bfefffffffe50d3f +7ff0000000000000 +bce65b7b7990731a +bff0000000000000 +7ff0000000000000 +bd10953f58b62c61 +7ff0000000000000 +3ce65a6125bf771f +bff0000000000000 +3fab11dc22bb9e24 +3f439afe33b9fa0b +bff0000000000000 +bff0000000000000 +bed2b0f610279584 +7ff0000000000000 +66dcc437fc739a42 +7ff0000000000000 +3cde030ad6073e45 +bff0000000000000 +3fe7524c85769542 +3e65bdaec91eebd7 +be01626c657cbe30 +bc9b88fe72c87e9e +3c75e24eca177dce +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +bcf5bb8a1014aa13 +bdd469735fc49cf8 +3fe402d6166f30bf +bff0000000000000 +3fa1e285aa48ec3b +7ff0000000000000 +bc87de0a7404ba66 +3e2c1e4ce6f02c76 +be40f67eb00cba76 +bff0000000000000 +bff0000000000000 +be8f1aa0d5a1951d +bff0000000000000 +7ff0000000000000 +be10d46a07b33cfc +7ff0000000000000 +bff0000000000000 +bf4cac7a2ef3a659 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +3da089cd2e295768 +7ff0000000000000 +bff0000000000000 +3d6aabc5436471bc +bfb47d1d64f3b7ac +3e43d1e0b63b5392 +3c6994d1cd25f6ae +bf962990cc267d53 +7ff0000000000000 +bf421a1012348473 +bff0000000000000 +3fd1662195b25c80 +bef12f1db811960d +3d474c06c04947db +7ff0000000000000 +3f7864b4de60d626 +7ff0000000000000 +7ff0000000000000 +3d510fa830cbc5f6 +bf2da8b8d6d9d7c6 +bff0000000000000 +bf3164239f9e2fce +7ff0000000000000 +bff0000000000000 +3dfe9de86058e180 +3d32f398ff4c7815 +3c5b59e3abaf6248 +3f1989210f0bf8ae +bff0000000000000 +3d6e28661e0d10ff +3c83c35a6b8a6097 +7ff0000000000000 +3ea2bed669e426c7 +7ff0000000000000 +3d9ca6a26c29541f +3c3043b1e1a274af +bff0000000000000 +bc6300a891a347d9 +4a384ccce522a366 +3cf1d6c19c330fd4 +7ff0000000000000 +bc3fbeb15d8afbd1 +7ff0000000000000 +5089aee365631efd +3c697f9a87ab53d7 +3f31ffa3e65dc28e +3c63c9bcf00f54aa +bff0000000000000 +bfb4087f02c278db +3e71ba1e19233642 +bff0000000000000 +bfec27a433c43706 +7ff0000000000000 +3ef5ca7c6d95c762 +bff0000000000000 +3de1094b2be7dca4 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +3d595640a7cda746 +bff0000000000000 +bc39bd35f153e736 +bf41518b31b3392b +7ff0000000000000 +be439ce7968e6293 +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +7ff0000000000000 +3e14c0315bbba164 +3e436f5727fe3b5c +bff0000000000000 +bfe672e2f0a5d94c +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +7ff0000000000000 +3ed04c6a937cbc34 +bc47f8a6786ae426 +3d0f07a714c325fe +bff0000000000000 +bff0000000000000 +bff0000000000000 +7ff0000000000000 +3d30467d80129f4c +3dd4ab8a9a095a8f +bfeffffff7457197 +7ff0000000000000 +bff0000000000000 +3d013c5cce4c0de0 +bd35830ea9788e3a +3d72ed42213a74ce +7ff0000000000000 +3f078c857220ea47 +3f0925d484aeeac0 +3e4a281db687331c +bff0000000000000 +bfee48248a52246a +3fe2f068fc8f2efd +bddcfe2d210a01e4 +bff0000000000000 +3f7bbb0f8bda27e4 +3fe097bc9c56ea0b +bfeffff9c34e320c +3c8b646443068ed4 +bf918718ccdc3d23 +3f5beb67cde9123c +3c48333991b4ef70 +bff0000000000000 +7ff0000000000000 +3dabccd844dedd77 +bff0000000000000 +bd9360a32135d05e +3e050208c96685e5 +7ff0000000000000 +3fac5a174651b19c +be055b48c5a3f0b9 +bff0000000000000 +bdda83f7e6d843cf +3cb6fdb48168339b +3fb7aba61b8997cb +bed08e71d054347f +3cc32966dbdd4d26 +7ff0000000000000 +bff0000000000000 +bc6f666b78667b5d +bff0000000000000 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +3ee1bdecb93c9ea3 +bff0000000000000 +be30639c58e4870c +bff0000000000000 +bd82bb168fc7a801 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfd5003811a12e9b +3e4289cfb60fba91 +bde6b588a35fae8d +bff0000000000000 +bff0000000000000 +bff0000000000000 +4005bc00a496b814 +3e378f697defe6ec +3f08a873826b9b6c +bff0000000000000 +bcd507ca9a2da82d +bff0000000000000 +3f30f40b18ff6ad9 +be39dd06af27aa5b +bfed3c85bf2f330a +bf938c9164724464 +7ff0000000000000 +bfefe587029a9462 +7ff0000000000000 +7ff0000000000000 +3ec76dc8e7a30cb0 +bd526adbf80264eb +be1b7ca57dad8d87 +bff0000000000000 +7ff0000000000000 +bff0000000000000 +41ab8e01e138f28b +bc791a1660f13998 +bc4cfdae285bb2ba +7ff0000000000000 +3e82a55649f6b28a +3d100007c5174a8c +bff0000000000000 +bea284e84a6b346e +bf92c3cb374197ff +3ccb5100e24fc774 +3d0b99b0b59b0a9d +bff0000000000000 +bef0e07d3a932282 +7ff0000000000000 +7ff0000000000000 +3f302a0df2e57954 +3d713130661d6e1e +3df0e5d60494e766 +be56b25b9d5cb4b6 +bc79a0489a17c6be +bf95ba03a339cd8e +3e8cd473386b46ea +3e785ec5f95020b9 +bff0000000000000 +3df338d24fdee330 +bff0000000000000 +3c6be427cbc26cd6 +bcd3523fedcac9a3 +bf578d8d12e671c8 +4674a318d81e4a2a +bec7092a31a83b57 +bff0000000000000 +7ff0000000000000 +3da0aee2b17f029f +bdc54cb81d2dab33 +3f3a61903e2fc0e0 +3d0383b8a9d9b696 +7ff0000000000000 +bcc387c95f349ab7 +3f14e62927176bc8 +bdbf58ba78edcde3 +3c93f9969c3e3ee7 +3eda94a6c06252bd +7ff0000000000000 +bfed52d2b282e2bb +bd01969e054878fd +bff0000000000000 +3d2ecaa362931d1d +3eb3dbe5ad76d6c6 +bff0000000000000 +bc527d3dcb259816 +71c175d00dd5384d +7ff0000000000000 +7e84e66b49e74031 +3f0efc63485e001f +bfeebca2b79d2c53 +3ff1bf9478400513 +bff0000000000000 +bff0000000000000 +be57d81a43cb7bb4 +7ff0000000000000 +bff0000000000000 +bff0000000000000 +3f77f932a20e6efe +bf85f1bdca2c9415 +bcd5b0868bb8650c +bc41b264bcf198e7 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3c6c1e5ee5dfbfbc +3dc70bc6a1dbd2d5 +3d4ae3f67e3669cb +7ff0000000000000 +bd701590fdf85057 +7ff0000000000000 +7ff0000000000000 +bff0000000000000 +bd05a765c50b9598 +be60a2224965b5ea +bca2fc41c7fa586b +bff0000000000000 +417f2df7d3c7df4a +3d1746ee5305ddcc +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +bff0000000000000 +0000000000000000 +8000000000000000 +@sinh 2218 607f2d8fa1ab934a +0000000000000000 +8000000000000000 +c02718f45d72e672 +c026b2436269b023 +c0264d5782f8da3c +c025ea28e057402c +c02588afbe746c6f +c02528e4835e2ecb +c024cabfb6a8db83 +c0246e3a00da280d +c024134c2ad69941 +c023b9ef1d5177e2 +c023621be03f4029 +c0230bcb9a4a8132 +c022b6f7904b21a3 +c022639924bffea9 +c02211a9d74adb0f +c021c123442e93de +c02171ff23cf90b1 +c02124374a366581 +c020d7c5a6949c56 +c0208ca442cb9d3b +c02042cd42f5aadc +c01ff475c9e1d582 +c01f65ceffd8df9d +c01ed99b07ee7c92 +c01e4fcef32280a9 +c01dc860027c4507 +c01d4343a6341f68 +c01cc06f7ce08827 +c01c3fd952a6ddf0 +c01bc177206fb6cb +c01b453f0b1eaf12 +c01acb2762cda620 +c01a5326a20b59f4 +c019dd336d1d5233 +c019694491450c22 +c018f751040858a8 +c018874fe27cde50 +c01819387096b11b +c017ad021879f22e +c01742a469cf6a0d +c016da17191c0fa5 +c0167351ff1b6f6a +c0160e4d181ce53a +c015ab0083639cae +c015496482894b0c +c014e97178e396e0 +c0148b1feaec2100 +c0142e687dab231f +c013d343f6249878 +c01379ab38c7e4cf +c013219748e1eeec +c012cb014811a30e +c01275e275bed2e0 +c01222342e9367e3 +c011cfefebf6de10 +c0117f0f438bfc3e +c0112f8be6b0c00a +c010e15fa200738a +c01094845cd7e2a2 +c01048f418dba6a5 +c00ffd51e300fd0a +c00f6b3a372b54d8 +c00edb95c9a282cc +c00e4e5966bcf085 +c00dc37a0adba16e +c00d3aece18e4ff6 +c00cb4a744bb38f7 +c00c309ebbca83f4 +c00baec8fad5380c +c00b2f1be1d7ad08 +c00ab18d7be76898 +c00a3613fe6c57fe +c009bca5c85d56a0 +c0094539617ff246 +c008cfc579ab5e07 +c0085c40e80e851c +c007eaa2aa792f27 +c0077ae1e4a827b0 +c0070cf5df945ab9 +c006a0d608c4d8b4 +c0063679f1a3b43e +c005cdd94ed5ac52 +c00566ebf79495c7 +c00501a9e50c7730 +c0049e0b31bb4a79 +c0043c0818d357ac +c003db98f5a01ca8 +c0037cb642edb5a1 +c0031f589a72ba89 +c002c378b43c85b4 +c002690f661dd820 +c0021015a31fd024 +c001b8847af52741 +c0016255196fac38 +c0010d80c5f7ee80 +c000ba00e3071089 +c00067ceeda2b651 +c00016e47cdb05fa +bfff8e768295608f +bffef19a0931edf8 +bffe572751fb4e9a +bffdbf12518dfd8a +bffd294f2bc2e1fc +bffc95d232c289c6 +bffc048fe61c0071 +bffb757cf1df30a6 +bffae88e2dbabe16 +bffa5db89c1d462c +bff9d4f16959f63a +bff94e2dead06600 +bff8c9639e17a5aa +bff84688282c6eb7 +bff7c59154a26761 +bff7467514d86865 +bff6c9297f2fb55e +bff64da4ce4617ee +bff5d3dd6032ce50 +bff55bc9b5c63e2d +bff4e56071cc5c98 +bff470985851bc85 +bff3fd684deb350e +bff38bc757001138 +bff31bac9716baff +bff2ad0f5023d3b4 +bff23fe6e1dbabd9 +bff1d42ac9060cf1 +bff169d29ed447b3 +bff100d61839798b +bff0992d0544fc2f +bff032cf507ef278 +bfef9b69fc8dcb62 +bfeed3ac5868cd9b +bfee0e5620f34e2e +bfed4b57f28ff814 +bfec8aa2986c848e +bfebcc270b522736 +bfeb0fd670798882 +bfea55a218623773 +bfe99d7b7dad7b31 +bfe8e75443fc6dd0 +bfe8331e36d1498a +bfe780cb4873d22c +bfe6d04d90d8c480 +bfe621974c8c35e2 +bfe5749adb9ece5e +bfe4c94ac095c7d6 +bfe41f999f5d9d0f +bfe3777a3c3f5388 +bfe2d0df7ad84b81 +bfe22bbc5d148158 +bfe18804022b2bff +bfe0e5a9a59da44e +bfe044a09e388105 +bfdf49b8ba2da788 +bfde0ca0d94ee659 +bfdcd1e0df687d3c +bfdb996040d69078 +bfda63069ed3a3bd +bfd92ebbc59213e6 +bfd7fc67aa58ea78 +bfd6cbf269a3e547 +bfd59d4445468cd2 +bfd47045a292341e +bfd344df087ebd24 +bfd21af91dd5fcfe +bfd0f27ca7619b64 +bfcf96a50c369213 +bfcd4ac76abe5162 +bfcb013292408e12 +bfc8b9b8d83dfad0 +bfc6742cbc423789 +bfc43060e4576c9f +bfc1ee28197ce6b6 +bfbf5aaa8840d8a4 +bfbadb76d1340df8 +bfb65e5b4753f357 +bfb1e2fe4df13d05 +bfaad20cd65f9756 +bfa1e0348218c386 +bf91df82199213a7 +0000000000000000 +3f91df82199213a7 +3fa1e0348218c386 +3faad20cd65f9756 +3fb1e2fe4df13d05 +3fb65e5b4753f357 +3fbadb76d1340df8 +3fbf5aaa8840d8a4 +3fc1ee28197ce6b6 +3fc43060e4576c9f +3fc6742cbc423789 +3fc8b9b8d83dfad0 +3fcb013292408e12 +3fcd4ac76abe5162 +3fcf96a50c369213 +3fd0f27ca7619b64 +3fd21af91dd5fcfe +3fd344df087ebd24 +3fd47045a292341e +3fd59d4445468cd2 +3fd6cbf269a3e547 +3fd7fc67aa58ea78 +3fd92ebbc59213e6 +3fda63069ed3a3bd +3fdb996040d69078 +3fdcd1e0df687d3c +3fde0ca0d94ee659 +3fdf49b8ba2da788 +3fe044a09e388105 +3fe0e5a9a59da44e +3fe18804022b2bff +3fe22bbc5d148158 +3fe2d0df7ad84b81 +3fe3777a3c3f5388 +3fe41f999f5d9d0f +3fe4c94ac095c7d6 +3fe5749adb9ece5e +3fe621974c8c35e2 +3fe6d04d90d8c480 +3fe780cb4873d22c +3fe8331e36d1498a +3fe8e75443fc6dd0 +3fe99d7b7dad7b31 +3fea55a218623773 +3feb0fd670798882 +3febcc270b522736 +3fec8aa2986c848e +3fed4b57f28ff814 +3fee0e5620f34e2e +3feed3ac5868cd9b +3fef9b69fc8dcb62 +3ff032cf507ef278 +3ff0992d0544fc2f +3ff100d61839798b +3ff169d29ed447b3 +3ff1d42ac9060cf1 +3ff23fe6e1dbabd9 +3ff2ad0f5023d3b4 +3ff31bac9716baff +3ff38bc757001138 +3ff3fd684deb350e +3ff470985851bc85 +3ff4e56071cc5c98 +3ff55bc9b5c63e2d +3ff5d3dd6032ce50 +3ff64da4ce4617ee +3ff6c9297f2fb55e +3ff7467514d86865 +3ff7c59154a26761 +3ff84688282c6eb7 +3ff8c9639e17a5aa +3ff94e2dead06600 +3ff9d4f16959f63a +3ffa5db89c1d462c +3ffae88e2dbabe16 +3ffb757cf1df30a6 +3ffc048fe61c0071 +3ffc95d232c289c6 +3ffd294f2bc2e1fc +3ffdbf12518dfd8a +3ffe572751fb4e9a +3ffef19a0931edf8 +3fff8e768295608f +400016e47cdb05fa +400067ceeda2b651 +4000ba00e3071089 +40010d80c5f7ee80 +40016255196fac38 +4001b8847af52741 +40021015a31fd024 +4002690f661dd820 +4002c378b43c85b4 +40031f589a72ba89 +40037cb642edb5a1 +4003db98f5a01ca8 +40043c0818d357ac +40049e0b31bb4a79 +400501a9e50c7730 +400566ebf79495c7 +4005cdd94ed5ac52 +40063679f1a3b43e +4006a0d608c4d8b4 +40070cf5df945ab9 +40077ae1e4a827b0 +4007eaa2aa792f27 +40085c40e80e851c +4008cfc579ab5e07 +40094539617ff246 +4009bca5c85d56a0 +400a3613fe6c57fe +400ab18d7be76898 +400b2f1be1d7ad08 +400baec8fad5380c +400c309ebbca83f4 +400cb4a744bb38f7 +400d3aece18e4ff6 +400dc37a0adba16e +400e4e5966bcf085 +400edb95c9a282cc +400f6b3a372b54d8 +400ffd51e300fd0a +401048f418dba6a5 +401094845cd7e2a2 +4010e15fa200738a +40112f8be6b0c00a +40117f0f438bfc3e +4011cfefebf6de10 +401222342e9367e3 +401275e275bed2e0 +4012cb014811a30e +4013219748e1eeec +401379ab38c7e4cf +4013d343f6249878 +40142e687dab231f +40148b1feaec2100 +4014e97178e396e0 +4015496482894b0c +4015ab0083639cae +40160e4d181ce53a +40167351ff1b6f6a +4016da17191c0fa5 +401742a469cf6a0d +4017ad021879f22e +401819387096b11b +4018874fe27cde50 +4018f751040858a8 +4019694491450c22 +4019dd336d1d5233 +401a5326a20b59f4 +401acb2762cda620 +401b453f0b1eaf12 +401bc177206fb6cb +401c3fd952a6ddf0 +401cc06f7ce08827 +401d4343a6341f68 +401dc860027c4507 +401e4fcef32280a9 +401ed99b07ee7c92 +401f65ceffd8df9d +401ff475c9e1d582 +402042cd42f5aadc +40208ca442cb9d3b +4020d7c5a6949c56 +402124374a366581 +402171ff23cf90b1 +4021c123442e93de +402211a9d74adb0f +4022639924bffea9 +4022b6f7904b21a3 +40230bcb9a4a8132 +4023621be03f4029 +4023b9ef1d5177e2 +4024134c2ad69941 +40246e3a00da280d +4024cabfb6a8db83 +402528e4835e2ecb +402588afbe746c6f +4025ea28e057402c +40264d5782f8da3c +4026b2436269b023 +402718f45d72e672 +402718d9d8d9c21d +c02718d9d8d9c21d +402718f1b6956d18 +c02718f1b6956d18 +402718f45d72e672 +c02718f45d72e672 +3f81df55801759b6 +bf81df55801759b6 +3f9acfb2a6ec85a6 +bf9acfb2a6ec85a6 +3faad20cd65f9756 +bfaad20cd65f9756 +3fbadb76d1340df8 +bfbadb76d1340df8 +3fd6cbf269a3e547 +bfd6cbf269a3e547 +3febcc270b522736 +bfebcc270b522736 +3fa907efa70768ac +bfa907efa70768ac +3fd47045a292341e +bfd47045a292341e +3fd7bf5dde4fe8a6 +bfd7bf5dde4fe8a6 +3fe99d7b7dad7b31 +bfe99d7b7dad7b31 +3feed3ac5868cd9b +bfeed3ac5868cd9b +3ff8c9639e17a5aa +bff8c9639e17a5aa +3ffa26c3f7885143 +bffa26c3f7885143 +3ffb757cf1df30a6 +bffb757cf1df30a6 +4002601932d93336 +c002601932d93336 +400268f8704f3a96 +c00268f8704f3a96 +4002690f661dd820 +c002690f661dd820 +3d719799812dea11 +bd719799812dea11 +4010b31a6ab4824f +c010b31a6ab4824f +3fe6ad38507b2418 +bfe6ad38507b2418 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +0000000000000001 +8000000000000001 +0010000000000000 +7fdfffffffffff2a +7fe3e21a464507fa +fff0000000000000 +fff0000000000000 +fff0000000000000 +3fd1d4794e793566 +bfed1e8d7a814812 +c0a2aa51114b7cdc +3fec90ee554866d6 +402bf1ee57460783 +c0fe150b47a7d3e4 +4000dbefb9b50cd1 +401c6a02fc06b589 +c0fff81b9374c960 +40219d40d60e4dc3 +c016f9af056c96fd +40517838dc2438c5 +4016de1ed8e61d2c +406a0bd47eb65082 +c0b67b88024e536a +40901587818cfaa1 +c01c2471470832e1 +c089bcc845f48c01 +40a936eafcd8da16 +409b27881fa5dd7f +c09924d651beda47 +c0950ef2033d44e8 +c0a6a78176d0da57 +c000aa59c80a2b55 +c0e6e49d4d106cf2 +c0ca7c43de160a47 +40d660283076dfb1 +c0c0fab2192ac3ab +c0cc01612130954c +40b0343b01de240a +400f1bd884c159e5 +c082f28d0c78391e +403ea1e2017f48f3 +c0ed6f052fee96d3 +c08b1b69b5314dc8 +c0b82d8753724831 +40d93cda8d4111d7 +40bd0fd7ef2bed6d +c0d894f0f1e5c267 +40c5b674a8069b75 +400c0ddb8a1e5d58 +c0ce6cb3e3c80941 +c082407c1136b2e4 +4043b4f728959359 +40a11047ee5f7921 +c0e94ee0986d9b97 +408f8454774a5bbd +c06ffe218202cddc +c0b0a99f394074f8 +4040fe22b464a29d +c0aac62026bbb3d2 +c059bf8a388d2dcd +c062273f989fc168 +4048cb6b0533cf5c +403daf65a39f3521 +400e6072a1dfd2a8 +40a8a09384c0a93e +405089e653a73a08 +40cee593966199ee +c0393a88bb134d8b +405e7461cb31a787 +c0da1948979d8ae6 +3f795646370b3882 +c0f92b456744eb1d +c10143ad49747bec +4012fd54a64859a1 +4025f0fc9fd826c3 +c0bce0de6f29b0e2 +c0e92dac4282c445 +40fc451527e7a2c1 +3ff097fcf0e0b7c2 +40e428b1eb751a74 +40dc7a39e3d326e0 +c0d3caf8da0a4eea +bfc077fd07b27fdd +c0508f74b2f51f3c +40d23242cc4f378a +409822668f570849 +c0b81d4617506fe2 +c033898e5caf0d6a +c0919fdd442029d3 +c0f9b07efb114217 +401538805c742a6e +408743dcbfea868f +403207f6bea40724 +c078590a84aff955 +c01959c173214c8b +4075066003c6e308 +c0b324dd87512b2b +4059f11b3b9c49e3 +c0def2fe8a5a9c92 +40530c827724f315 +c0f2ffebb1347781 +c0410f5b94b77286 +3feef29505d4304f +c093fc1c4793ec0b +40bc36a406cd55ef +3fe0e65d3d66f70c +40437b1b424ad50a +c0f176c22a7c3920 +c0334b2908920703 +40c02bf4fff0986b +4039d28b42684197 +c02a1961ac48ff08 +40146ff88ca40847 +4000b1f2efb603ea +40ca25af3928f560 +c02d3dbf09a0ee37 +4016aff7dbd5079c +40ca5b6aa80eb638 +4029bd0dd1d5a4b3 +40d86779714ef0a8 +c005e81e4e93adfe +40cdb545f3042a43 +409acc5579d5216f +3fe5174685658200 +c06aeae1a113bfe9 +409027065b60d457 +c07cb86fc96dfcc9 +bff8e1c7051d96a0 +407780d77bf53969 +404c502a39d7dbfc +bfdfd6d8445b5058 +c0d25ad0af2ea40d +402c18c1dfe5d2fa +408c6cfa8f80283c +bfea89b14705823a +40093158cc8e6619 +c007dcd46c98ed50 +4060ebb388485926 +4042936e09fd4d4a +c0b358b08954243c +c03586ca57310ff3 +c021e080a16b7a1f +c0d3e0889a9e6bb4 +3ff8c6f56c03ce88 +c0baca678a534e8b +40a5305dafb1502f +c097ae50eeeae0a9 +4093403758a4f4fe +c0038e69fc5e92dc +40f19a325660db18 +c032192c8d0d0963 +40c0784fce405c4d +c07bae19ca4a9b70 +40e83d708b9a1997 +40cc0fa76e830abb +c052a97cc0d8b606 +c051427784c0d36d +c0e895cd7b3deef4 +40f21c3ee71a5cd3 +c0e9aefec00ddbed +4042d4ee0e01b73d +c001afb34d8f6899 +bfd1f52f757d937c +bff43518e19712b8 +c0196d55099d239d +c0112ad317504682 +c01edb269d4380d8 +c0733f9ba75ab02f +400053f998b8e9d7 +bfcadd27fb540907 +c053e9ee2e7b4a08 +c06e6da3de0c560c +c0193b254e733f74 +bfd8b102394c9f80 +40f1606e215794db +40edf7c825a3f9dc +4070822b33879679 +3fdec4cff34a86de +40ed807dd45e52be +402322f1228f0d78 +c08cd13c49d3888d +3fda5732ef8d1390 +c1017a46529fa945 +4010eaa941dfc0d1 +4024174d07df93ec +4046b7821a869072 +407fed38e6c774b3 +bffaf6f5363b6601 +c0c3e5cbcb82e590 +c040c3f5d273d8f5 +c0bd1694e4a6afbd +c07410aa9e80b48a +4013cb4769374dbc +c0b5e1cd688cf676 +40118ec93dca67de +40a1c2ab852e78ee +40cb7431af5abfe6 +c0f073a66c1bf6e7 +40e14b968cd98078 +c10034b88e69fb67 +c06620c23e6233bb +40357ecb0469f404 +c0ac4d2a04639491 +407913ad3bb7783b +409f1cba9c7de72c +3fe9386856c2dc3a +40b60e70895be184 +40700f73e0f52294 +c0893541685bfbb9 +4039339bbb132d36 +40d7a2eed0014796 +40b52b3ee7566ecf +bfd71684086cf9ac +c0d1ac28503a0e78 +c05864f013b7bf30 +bff386807d8d6c38 +404ecf7b1aa2b15e +4087cf0992211c19 +40bd4d3e233bedf9 +40ecd7625e746252 +c0457133823a33b9 +c0d1d85f660c0347 +4074dc4397f2c9ee +408958e444b5e65a +c0f55515dc0c8485 +4013c80fd51a1965 +4053e49206030c93 +bff2fcc8ad0edd86 +c07d280eb786f6e7 +4073fe7e3f897317 +40af6ba4c1d54e2f +c0b53045c0277fb6 +c0a5e5749cf9220c +40d9f23153469f04 +3fddc0b1dd19bd38 +40bfb4f1b28bb0e6 +c0736f491d9a7c5a +4023ec7d58d893a4 +406b9cc41b640c0f +bfe9b04a7fdc9201 +4094347e87392e10 +c0728332d086b4a4 +c0b6ede43181fa86 +c0ca0fbd15f5ddde +401093a614408bc3 +406e69c7e6c7252a +4031d35c8cd4b28f +40bd704479802ce3 +c06bcac3816014b0 +4057ffd8eacbae3f +c0b14cb180bb627d +40cfbb56d93446b0 +c020175661768a64 +c06cc618faf74386 +409579675a2392ae +c027013a84e37fed +c001d9fdf922c1f9 +40c6b2ab39317122 +4041c5d6d8c6f8af +c05af9f8855fdf4b +40cdd26861951aae +4003f9a16f4ad68a +4056276fdee7ec28 +c027031864f98d03 +c08024e7efa35903 +4026ea70bc74a5c7 +bfe81d6ba95742d2 +c093c61024dbd04c +c0d3f360a2554f3c +c05c9c44d4c5a1c0 +c04868aea7711936 +c083f80c58f4dda0 +409ed9e53f87f885 +40c63c43fb2b218e +40200f75a38ac4f9 +40a9d96aeb364f04 +4023a5d82efbd617 +40a2b3985ce73d47 +c0e685b7ecb979d7 +c058125ff31cf009 +4072ccd130c26a1c +c050f1bbf7d1672b +c0d4209341b7466d +c0d54685146ec51c +c08f53ce6c7b7e26 +c09d4acca3c81339 +bfe25e17b0889dbc +4089ec43334e92b7 +40846e4d898a1348 +c09354018f44a540 +40f14917f46f2981 +404a73c1cf33d757 +c074666363f89b4b +c0b12ff8dcdecb39 +40d69201ceb8fdd8 +c08e6d8076a73a34 +40c09146b91a4e55 +c001b327e6b5feb4 +c0b8a4124fbc3053 +c02276d984f813cb +c010c87bc528ac8b +c01f1ff599dea014 +4043f20b375631ce +40b8d71797f48993 +c0e3afb84bf9e73d +40883009b5c4267a +c05a5d3cf6164bf7 +4002307839373b70 +40cf116b4662e335 +40d1c5dc4ee68869 +c08af41ae84b1891 +3ff59133ffb5e1e4 +c015d649c5a86696 +40d15d54c6d12593 +c05e96047eb60b5a +40a7560f03350745 +c0ea0a7aeaf3ba7a +3ff36755c4628a54 +40d1aac7a9ae603e +c00c89577509515c +c09da2f874ab1bc6 +4062701e9b3ac4d5 +405f5960d74ab7c4 +c0134e9a3ac418e8 +406ba4c13d73c461 +40f2c785d4599db5 +c0ccb592e70a05e7 +c065e43866ae2480 +c062e7ba4251d80d +40381b9a150dc1ee +c0922b7a912104f7 +c03a29fef352de05 +c0e2bf3fe7cdfdba +c04bd326a9f6b276 +c0dd3f1eab986792 +405b133f8f210975 +4034663900590a49 +40b23bfc09243c1f +c0f0402be2eac615 +40201e693ecbeefd +4024cf53aad0e77c +c0fa49ed883c34fc +40d7999cf4e498a8 +3ff996957919a14b +4024077b3168a6eb +401fc85291574c2a +c0e2681990a05413 +c02097064e731ecb +40898b4604617188 +407132e8da7c851c +c078cdffbb8fa3f7 +40b08e2740ffa48c +40acc7f67eb21db1 +c079aabaa727b7a6 +40c1b8327c5e1a49 +408e28d552c906a0 +40d222e4f00e49b9 +406b68ba8095eb91 +c0125c7728d8ce76 +c090ee022e42353e +406c102d07945815 +bfb016b89665d6cf +4088883e28256675 +c02bc07609020136 +409413cb2da5aa66 +c03a1fef5fe2c36a +40f7e75403df6201 +c0a24e07abb26008 +c066911c0389db6c +c0698ddb0972d197 +c0e86213b951d66e +4040f8a068671713 +401ac6cd61f2f996 +c0d355b23ae6e1a8 +408339b6ca412ddf +c0b676446b5896fe +403b67cd9c4030ac +4048982921d86421 +c03c2be9dcbd7384 +c0f1646e1a56bab0 +c02b7cc080616499 +c01075abb03c1909 +403fee99d4d8f78d +40c0ad5df7b3f283 +bff841426bd8af3c +bff594706f09206d +40933a2e6c6253b2 +c06bdadadfd18ccf +c066e5ec4bc155f4 +40b90bdb65c80357 +3fdee5f09757a68c +3ff121652dceea7c +4048622a84ae94d7 +4080d8e30875dcee +bfbd9fe2d88f2e45 +40603bc06694cd18 +c0c3a2b5a9c095d2 +c03134a08439a7c9 +3fe6dce45a290896 +40c0f4bedb08c99a +c02c198733b3eaba +c0ed16a5af241a72 +bff329d8eee568f0 +c05cfda496453968 +3ffaf4cdee86e899 +406ebc6f87cf854f +40ee5141aef558f8 +c0b4bc696dff7d5f +3ff30127c48a9d91 +c009b17aeaace8f4 +40c8a7259014bae9 +40ca3d3161d88510 +c0243241e952425b +c0a554feba4ddd9f +c0eb0a2910de770d +402b1cdc9948df07 +c00dfe5ad160a584 +40fa227c5fa133c3 +40c422d9d8d55077 +40df83ba898e8ff6 +3fd6d8e87e9ab44c +c001ee6a2dff3de4 +bfe904fc10284412 +c0ecc5bb75657dc6 +3fe78e67f9e271d3 +407bdf82d059e6cc +40213d00bbee3259 +c01a3b3840dcebae +406e286753f00ee2 +406a9bd7aa8f927c +40d9bb4aeecdf59a +c0d0268bf843add4 +409cf9b4d2b3cadc +c0cde324f23ad631 +c08209c7b4bea339 +4060c0a8a51b77ee +c02ee90b12dca507 +c05c15395f65eea8 +bff0d251bba7d654 +40939517319a4c7f +c092edbd313ec9f2 +c0b53e2d489c7c3e +406ea8c8b3a77fa9 +40b8ef6ce8cb1e63 +c0c491cac01f222d +4036e64b6f683c22 +bfe79a001240904f +4100d31acd75e126 +4076ecbb9c015a27 +c03adec2d4da5c82 +4029cb4dd6af6241 +406ab2ecb9c30ff3 +c0b220f514cb01c9 +c0848dfa3acb4c0f +c0f24c13646007d7 +c0c2a3ca657ef397 +c0e44d10cd619923 +c035e0d857d74a77 +407322b33e5db1cb +c0ab768b32f22883 +c0f9d4034bc0c50a +3fec185cfb8b2417 +c001d773355f0d50 +c0e7150acbd8aeb9 +40806eff03fc4d74 +c0285d1f2bd05028 +c0a198e3e3745faf +c0e28cabfba21ba7 +407c9a7078b7f7b2 +40a0cbc284049992 +c0061137d8863640 +c001a10e48095eb4 +40aea5e49d21c3c4 +c035314d71b3e6e5 +40836926484d3f84 +403952ea4b94e388 +403767ea017eaf05 +40d0e0bb7e32bac3 +c03c21a8a5f7c164 +c031842059b02520 +c0f990871b2b0885 +c066b36b618ceb09 +4090d9cb4837a3c8 +bfd42d4a6f369808 +c0ca2f201df31cd9 +c0d986815ece900d +c0a9459f25285b5a +4014da69be453f56 +40c08175774bd825 +c0279b3a003bc31a +40256787b712eeca +4072c8accf68230d +40ebc270047e49c6 +40ad865c8e365a08 +c03645619ab0b8c1 +40e260ff0fd003af +40533f81ea151d1c +c041f0f9ac355ec1 +c01350b89c5f7e02 +bfdfaa8c1ca6f293 +c0837d467cb7041b +40bb728462a09187 +40a4b61cb38ec3f6 +c09ea71280cd7553 +4078e192b6a15dd1 +c0135815d41aac44 +4077826fb6d4d00f +c07f1800e6991d91 +c00be9bdeb492656 +40a7b90e16ec614b +bff2f78e36095f42 +bfe70ffcb31f14e4 +c0002455790629ad +c04676cc71b7dfa0 +c0fc8f1439270d89 +c012683d6ae4ed9b +40a3fd12a282c167 +3ff543543be41b40 +408a4f8474af3702 +406e82107663f390 +c0421fb8a02076eb +c04762081dc32f65 +c0e1dc45e4c18b6d +3fffc2eb889324f7 +c1012c005470f91f +400ec42c219536b4 +c02d0ddc04d6b5af +40d78b9da9bd39a1 +4080d2a887cb22fc +4014c95b99121779 +40e08ebf50e55bf1 +40debbcc870b1101 +40f2b336d9ceb4db +40fb3e04f08d3484 +c0277bba9482d302 +c0a09ee3b1ffedcc +c0f226bfa7d53804 +c0a6872b4c192b01 +bffee8c286829b10 +bfe5650bc040b6d9 +407dc591358b0411 +c0f8673a6c5bf51f +40020ec92421423b +4045f2175e4fb6be +3ff16ddb9a4505b2 +405354f0479282af +c035de0b8cec68f3 +40adb2686eb14877 +400525cf64d82ee6 +405f53819a9d73b5 +40ca0d9ec2dedf4d +bfe3f1606dc2080a +c038331c27678aa9 +c0a300eba9d2033c +c041472e1ff87695 +c07ffdc637a93bf1 +4048af819529ae6e +c074fcfc267fa2df +c09fdb5d592493a3 +c022b6ce193a17d6 +bfe073463cd499cc +40d9f24ddc47efc0 +bfbf9ee219d2d9b3 +40d4dff2ce69914d +3ff0192565d500b0 +4081e801949c1621 +400061f4783cbeee +40ebb13531aad81a +4086165a3529b402 +40f3361a2a90cf26 +c0f9d04ae1b34275 +c0c2966009ca895e +40f2dd6108033e96 +4053419b54768c8d +40f741e137b1590a +c04cbaff20e36f70 +405cd2118912c67a +c05342a9ccce761d +bff5f55e5cc63e64 +c075b466364720c0 +405bf4c1acea6278 +c04db1f8e92d54b3 +404d156697f1468e +40a722e3ad53fdae +40b4e3810228589b +3fd71dea3e62b673 +405e1727b910c990 +40817d974c8ed899 +4085264cac1075bd +c093c5e5066f6a08 +c07308d016cf6667 +3fd84bd77189b2f4 +c0108493fa396c69 +bff9da22f6956577 +4033a934ae601816 +400d89a8413dd166 +c080eb7f632d2a27 +c0aa95855bab1b74 +c0a36f2614b98177 +c0d1db2fe9234632 +40373826be54c8a8 +c0e224eeb2f7db17 +40757727454b771f +40854b0065c9a0a9 +c01c9920ecd08d61 +c093e154197fd2c2 +40297ff421bc8b47 +c01b302d06d499c1 +c05365c2b5232056 +c0eb2adc2bb63e20 +40527e463f4f01cb +c0647c14b017a437 +405b4db79f47138c +c0f776c98f6b711c +c0b2c26163f06be3 +409219565079ac44 +c042071f455f9b5b +c0fe9d7d6e0d1cfb +c0680b0dded48126 +40b85ad3ec3fd08a +4026b3ad3c09b687 +c0f5852c381d18d6 +40ec7dc3250ef087 +c0abda8327ec4bdd +c00c93e14266202b +c0f29e2b2ee86f2a +c095848337ed978a +c0e9c149a0831b49 +c0d6092d2d42d9cd +4071a8b4458481db +40a107e03ab3dec5 +40cb63570c67813c +c044ea1a39ee97aa +40b822c281e9752e +c0fee7ba93c8310f +3ff093b4b7768a1b +40d659ba0715c06b +c05227862dbcf4ac +c09fd7ee03a44a00 +4006c10839371017 +40633a41fb0e00da +c0066f76dacbdf4c +404bad9dd68b16e6 +c0186657fd5f0a95 +40fc24ad738869b2 +c0b50e095873ce9f +4080d0070fbef871 +c089334420c502ba +c00377b949c41c4b +40d227467bd51706 +40a7afe3e2d39223 +c04822461bcf1baf +401a5ce4f6c94c06 +c077e0d7e43fa18f +40cf978fef50c74a +4080d20d6509dafd +40cd8bbcb719a056 +c0f8bc797f6c483c +405fe023c4d136e7 +c0fc2538f72d812e +40eef27c33bd02d3 +406581a73a7221eb +4100a8288cd430ea +408da40a74959fed +3fe1487cdc990426 +40fad2be8d45b74b +c0675b746d13e997 +c020e2ddab679b6a +4050dddde2c0d5ec +c08e39c82ab18488 +bf901eb42865b43d +c065272f605efb3c +c0ec54892bd0fcbe +c013586e8b6b6020 +410040efdde3f9ba +3ff8037fc303988c +c0825c26ca40b3f9 +c01faf5ac8851c08 +405b89451c1c57b6 +c0faba687afae2bd +c08a249cfc955727 +c0d637cd51938e75 +bfe296776e0dcf9d +40a53cc47b0a4f56 +c0e943da317e07a3 +c0a4419c20c4f7cb +bfe933a0f70f75ac +40bee79663612dcc +bfed1f7f3fa5ed76 +c091a0b8c4e39459 +3ff4b084baa84188 +401ab54648dd6b5b +4100082f19294b7c +4050e938151c3852 +40fda87ae83c2b09 +bfee82c56638197e +c0b4690b68935e93 +c0f5bb4dbb5b1503 +4045713226047e15 +c05d6099c2d00b5c +40f5199670ee0ec1 +c014495267ddbe6e +c000c02cd987e800 +c0a9e2f784f1dc8d +40057c665a0ffe94 +c01ba1adf5cab5b8 +c0a4b2c9db2ad9ca +c0e3cb673f6e95c4 +4095f28c2c6011fe +c0d4b367a93db519 +40b6eb7414712535 +409663be8009f058 +c071519a6028390e +40e8591d03aa8724 +40a6743695df33ce +c0b35b58b94e083f +c07c28d82c9f5256 +c0c7a610d0d85157 +40311dd1e3195000 +bfdffe9efdbd2506 +404df4e15ec460cd +40e7524b2789e5b8 +40655a020decaaf6 +c0024d79d40137e0 +c0ca1e3ced99f3fe +40dceebfbb611750 +bff04900028165a6 +40097167a47f23d6 +40268f37af85f4f5 +40d0ee83d424d3bc +4045a7e52a2459e2 +c080dee5993c25f1 +c0122ce4350683b8 +c0bceb59211586db +405171f94cb4c3ed +4082f77b500c02d0 +40e415c51269bc65 +402361264c29f406 +40c2fd9dc9df4929 +40bca505b4d2ddf4 +40532dda3b4b977d +c02a94e5367cc145 +3fe5da8f47413922 +4010bdf7dd951804 +c0516dfccaa0befd +c0be7e03c08ac433 +c0c2a0531c6f7998 +c0c35119f6da810f +406fe562100517dd +40759172da856e35 +c0b7fca0136fe71c +40d2e962037e210a +c05a3a42f5144c8b +4076dbdcd3bcbee3 +3fe100f5b5e5954e +40e9b0cb0a7cc25f +40cec757f5fc90f4 +40d46da9973ea41a +c0ff8d1a3a6f6647 +4027c4b2a5837e51 +40527c93eebf4ca6 +bfe838da3197b888 +40d1919d956413e8 +403e12f88b7f2d5f +c01378538ea1bc78 +4060d16bea5e45c3 +c0e21722a1cbe3d3 +400749af85b07700 +c04e888c19620e58 +404c30019dbc9781 +40158d4df5aca2c2 +c0c0d2283f9dbd08 +c059d95cfafbee78 +40e4ac333a516e0f +c0e035331cc06d33 +402e9c1e17b4da54 +c0f964ec4ebe1ec7 +408099ac73e88ecf +40e59eee586dbce2 +c00a57e3be1e5cb7 +c0f1eb31899b9baf +40d2322a4725f3f3 +403c2b212543004d +40e61e0b09260929 +c00d0a410e3b6a80 +409ed3697b89f44e +40c6de34d0706987 +c0e97c99f0c68e91 +40e1143032459d37 +c0f82d0501cc4541 +c0e66e77466988bb +c0d723facb1259f1 +c08dce76dae852ed +c0d3c818711e0cdf +c0017c465c4443ba +c09f06d2969a6050 +40b373babd772c35 +401c69fc75b3a93b +40a409808f192a03 +40de66592aa5279d +406a66849c546e7e +c00f17bc4832919f +c0d7ac67b0ce7021 +40240b318c37286f +406d51784efdfe0b +40aee514f9f2bc93 +40f8dbc14ff17df4 +40c2ff6242a6f218 +40e91394f192d763 +406cfab2d31a642e +40c02a0ffa2a65a1 +c060f8b9cd5ba69f +c0a4aeac88d7ed07 +c04258569b13b744 +40135f7a32ce8750 +c0ec8971ea6e84e6 +c052822fd707fa78 +c0d1c7a44d1d8a0d +bfd4b5e3b57043d1 +40910bfa7f053cc5 +40c84e1cf9497ccf +bffd3bd41859f63e +c100a1cc6d9d835c +4046d5148f68805b +c064e530e4208130 +40645044b62d9eb8 +c0c6f9423bc577d4 +c04a08636c439356 +c0cb49a9bbdad8f8 +c0962e77aae713f0 +4027130f7cb89af6 +4074fac8daa86ec7 +c0eed46b81ed2a45 +40c31bef31da7a61 +3fe29f4974ca6b2b +c0e267d76fa0ecd4 +bfd4071b84635ec5 +400b72c876235b2e +c0815d1b0fb8af8b +c02797281d6232ff +40e28bee668e9330 +3fe4794c369d2616 +4082c99d664d8b8a +c0158f20eb643b13 +40ede84fbd425580 +40c233f2b6ae7ea1 +40534b94de4373fa +40b92938fa1883e3 +c0ed43a9e2704dc8 +c036f1eb0e71b37c +402940f056038c35 +40645f71bd350f2c +c0375ab219634c8a +3ffb79662a827cbc +403ceacdd69c5802 +c0a6ddd9086826fc +40736d5c1bc2cd0d +c05744edbe87973d +c07564aa981008c7 +409b77b4a5374a5e +c1015ddd6cc9a0b7 +c090ec06b0650e25 +c09a661975ddcf25 +c0eed6bbb583bc27 +402b862da2a738d2 +4089c1df092691b5 +40828a563474e918 +c0e6d565492d537f +40dbb52d22e727f5 +c01206715130999a +4010e7c6d0eeabc9 +40dd1c2478aa08f4 +3ff0068125d72a39 +405a18843e5c2e64 +4047d39dd3bbc075 +c0288ae5cd1ddad1 +c04cb9830a58446c +c0da57c1d308a6c7 +c05750d437a6ee75 +c06fd41be1faeb62 +405b935660c81c2b +408f7fd915fb2487 +40779fd63a4a913b +40efa41288550de7 +3ffec02273784217 +c07194b511cc7f7c +409bb68edbe54870 +c0fdf25b090f5f4f +40b79f47ed79b1a3 +c100f48bd68efc9c +4021290d1bed79a5 +40f64a4508d7d222 +3ff4f3e63a8c3300 +c07665f210dbdd62 +403f1977ca2ed6fd +4099ebd64df042c8 +40b2dc85426c1d6d +40effb60820280b1 +408ca8e42471fec9 +40419ae616032d4f +3fcf0a0221f08632 +c0d721273a492625 +400f65eabda42f83 +c062e525a63642b4 +4096d221794d1f19 +40296dafb26f88b9 +40a3c9b7334934c1 +c0cb2ded9d613a70 +403cc765933d4066 +3ff407b276c8d30d +3fd84cacf368c536 +c0e0c6ba5ba5e107 +407a5806a1505241 +404166345ef7047f +c0ec9db2dda933a6 +40e1573b81cecb60 +40393b6e84f3859a +40727a9245089bf1 +c08c8cca3f5e716b +403fb5dabb7be528 +c0c305c6e8be5d38 +c07c6f81df3e26e2 +3ffb9959c56e96be +c0624cbf04e72747 +c0158da6814b7259 +4005664c95fd9e4a +c0c076c205ecc92f +c0052b70a27a4af8 +c0140cde09fa5d3d +c071278fc023b13c +c026fe0acfec3b5a +c0a488e4abef48f9 +40bf1a3ce7216ad6 +3feb3787d579c667 +c012a2930531bc93 +c0ad5688fe1a756f +bff4ca830bb37e72 +c08ea678cd85a75a +c0f31501539856d9 +4019e0be3a1d46d5 +40c79079cb1be227 +c0ad5ee4a6324fe5 +40e191c0e70946f2 +402034399c3bf93a +3ff97e3a194c390c +c0a47a006d586dcd +c0a9ba661204b614 +c093a2090d44bebf +40fff468097495e6 +4009051efe97594e +3ff619cedb42bb90 +40ac3e4e1a1c8ed7 +c02c40e578e356b4 +bfd31e52c005918c +c01b32fc5379b736 +c05713d107ecd9a2 +40dde5e647d0b3bd +c0b67f7430e2e940 +c0c3474164a037f2 +40a2b32a3e325406 +c0fe99e15ef04d94 +3fe7c14912a4341a +c0aabe325921748f +40b25bfcde4b4446 +bfcac66808fa065f +c0b56c29ee2d87f7 +c07b46f404e82e3f +40c090ac78e524fe +40eebfd395c8d0b6 +c0cf7c465fe60f61 +c0dc828d73d5b095 +c0d0b8a9f4e323ca +c0194b91a7e4828a +c0fb710ee0368412 +c0110780db975b79 +c084232be0604752 +c0948609600ea3d6 +4044622168152bc4 +bfd555ac633570d4 +c00aeed764fff1d2 +407f9e91c325beb2 +40611cbb1cf0f2aa +c0e3531f588da483 +c08bc677cb039522 +c01786f6ab283ca7 +4050454445423ba5 +c0a3bd60feb4fd94 +40bd0b3eb3e22bf9 +c034071063bcb183 +40a69a8195b37363 +406cb86ad391247a +c02e0f3c31ae2480 +c000a023a6752be4 +c0d4f06729632325 +409f62d59f4bc6cc +bff095efd3c18906 +c066b169d806d423 +40d736c0f0d27d25 +404807779069423c +c0ace9420bdee3d5 +c073664b61b99910 +c0d0ae9cb17ce809 +40320a6b905e2d9f +c0ac5b6e8cf554b3 +c04a302669bf4c63 +40fbd296275e8750 +c0ce1a7b8d8226d2 +40e748ed8cbe6936 +40440d0893254c35 +c07000e9ecfef5ce +bff329c713e7c805 +40c77e016877cff1 +40d0ffe3d4209c1a +c08928ebe4659f3c +40ffd03bc163cbfd +c0bc3cbe39eab4d7 +bff8fbab73964fc1 +4041a180cecab72d +bff0cb08ebb9af9e +3ff41de1bb24dd5a +c0a77720ebd22e9b +c0a0ad9dda9ee1c4 +40a4ce5e5c028c5d +40272853e2c2951e +40744bd45f70260b +c0bdd4df70ecb46c +404cb0b4d6ae3e45 +c0061c6a339d5362 +4034dba044fab05a +c04fb0b5ebffb2c2 +40353bb451de343c +40b4b09e643aba8b +7ff0000000000000 +3f0aa015849245a8 +bd46f5abac02c6ca +7ff0000000000000 +3fe02c6c84ef6e48 +be68921996c24734 +7ff0000000000000 +3f42e55001254def +7ff0000000000000 +c090df345ef04b8a +7ff0000000000000 +3d30a80edab4359e +be2cb45d7e4adb11 +3dc2726d98996184 +bfa3f80546a9fefb +bd2e880c6444547c +fff0000000000000 +3d5ed67c594a3950 +7ff0000000000000 +bc4006968c4ec4bc +bf3a0fdf95d48f98 +3d928b8c463f0cb2 +3e9ef6b8130b5a81 +fff0000000000000 +fff0000000000000 +fff0000000000000 +5cc6cfea06e3992e +fff0000000000000 +c20446e71b9e487f +bd93172b2fffd4da +416481c52a561f57 +7ff0000000000000 +c173597364fcf047 +7ff0000000000000 +be9eb2b772d8d784 +bd84c841cc53cd97 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +be903b962b9ad274 +fff0000000000000 +fff0000000000000 +bd474da73d90f03b +3c404aa201d27d99 +fff0000000000000 +be98dc178b01cc76 +3eacb3053ddeaa9a +3e36754b06a6b82c +fff0000000000000 +40a1e97f11a38348 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +fff0000000000000 +be446a3dc009835c +bce7dc6ccb905274 +41aafff884110d58 +bdca5f0f845de301 +c0205ee153661221 +3caeee5ebbd13c3b +bdd3bd71c170fbee +bfa0d819b9b9e042 +bd1697426c72a62e +fff0000000000000 +3e2070ce1f93459d +bfc5815076c14b25 +7ff0000000000000 +3f4a639a2fff6967 +fff0000000000000 +7ff0000000000000 +5390419352aad052 +3de3f28192aba043 +3e47c2452e9c1ff5 +3f60a81a22b338c9 +fff0000000000000 +be3806674b5dba44 +bda6f8506481a000 +bf0207c467470a6f +fff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +bd30742f6892d66e +fff0000000000000 +7ff0000000000000 +c9850ba0c3277b70 +3ec341a3b639bd7e +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +3c4bc806d22ceb36 +fff0000000000000 +fff0000000000000 +fff0000000000000 +3fa6298ea5b6bbe4 +bc55824696f4d488 +3e216723a5120cfd +bfb7f622c9d70cb9 +3eddc3b19d29c2fb +7ff0000000000000 +bf6d143c529e6492 +bfb971dd51e91481 +be1bbe08660ab40a +bf229b6ac32a3b51 +7ff0000000000000 +fff0000000000000 +ccf0677dadc0b49f +3d5e5268abd3ac3e +3c5a944b565c4790 +fff0000000000000 +40161c38ec728d11 +fff0000000000000 +bd0daa213668a36f +bed74e7ca2cfd7af +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bdf99d08e70a89d9 +fff0000000000000 +bfb930f9a3ea9e42 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +beb1e1de9345cd11 +63c2c1d557c50a80 +7ff0000000000000 +bcaee88883526e33 +bd5741caa1e75ad0 +3fcb70dff7074252 +bfe2f6c7048bad97 +7ff0000000000000 +403d9170e76d943d +fff0000000000000 +be512df884f02fb9 +3d3d013b57f98829 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +3dc0ac225af14690 +7ff0000000000000 +4941307b337b8efe +7ff0000000000000 +3ec82d20c798d8e3 +3d410e66b917ab77 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ca5bf9310a3d1de +be45e2639571728f +bced8dc9dac70ad5 +d5b04c14d7978ed8 +7ff0000000000000 +7ff0000000000000 +3f301f1e70b7e641 +fff0000000000000 +bedaccf7a6ef2c18 +bf2514a67d777598 +fff0000000000000 +bedc21dc4b0b3122 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +3cca57b9dbb26e34 +fff0000000000000 +bf4b6504009a4b6d +bd868ce7d542adb2 +3f42cba984087f12 +fff0000000000000 +fff0000000000000 +bce37f62908ed736 +fff0000000000000 +3f4c75561ff580c2 +be64f15b55100838 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +fff0000000000000 +bed0c0ada36f34b7 +41a065d6237be407 +3fddb64745636687 +3f86f65c8294983c +fff0000000000000 +3e124a09def26382 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +bdb3a1cd4745c7f6 +bf413a7a005416b5 +fff0000000000000 +7ff0000000000000 +fff0000000000000 +3e65f7aa0e1f510d +bc3c0c998aa0755b +3fd9043f55390311 +3e30fc56202f458c +7ff0000000000000 +fff0000000000000 +fff0000000000000 +fff0000000000000 +bef7c7bf83637723 +7ff0000000000000 +bcf1dd15f5c9b6b8 +bceac4e44d44b20d +3e4d77bbddd6df8e +3faa8166bfdaa9fc +bfc51e3aebb09554 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bf9a8fca15381b03 +7ff0000000000000 +bd25c17fdeea5282 +3ed5ba1d3e86555e +fff0000000000000 +beda9d8a0959cdce +bdee83ef420b57bd +403543dde18c9c2c +fff0000000000000 +fff0000000000000 +7ff0000000000000 +3fb0d83bf70eb836 +3fa248d6b37c0ab8 +7ff0000000000000 +7ff0000000000000 +beecfa5cfd6b4fb0 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +bf0339a98f64017b +bc51a152ff105149 +3c7c24b19fd8439a +7ff0000000000000 +3ea374c62f3e262a +3f28d4cccb768036 +bea00cbb179e4005 +59b3e5ea0f0e393e +bca0e5c7a8787572 +7ff0000000000000 +3ea353ccefe67c67 +7ff0000000000000 +3f899c751fc95652 +3cf17a55acff5234 +fff0000000000000 +7ff0000000000000 +fff0000000000000 +3e2e03ae4940977d +bd56bd20eff7502c +3e0a41f1576f1708 +eccf743b7e8f4b64 +3e420b909f16deae +fff0000000000000 +56abd7e06f25ed63 +7ff0000000000000 +bd453da2ab4f9e28 +7ff0000000000000 +3ef441d9a9a0cea1 +be5fe9d2e186a1c9 +bd885b7b2ae856a0 +be02156fb471d54c +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +bd22356ef88a7b24 +fff0000000000000 +3d442aea1583ca2f +be2be83edd37c3f4 +bcc6a42f51e892ea +fff0000000000000 +bc98c2b9f51e8064 +bc300a0407057749 +3d303c512fd5124f +3dc95ae1c69e345c +3f81f8088e6f3eca +7ff0000000000000 +3da26f496aebb94d +3dd1e680aa7b310b +bd183c2a1f214f52 +bce17f0bd0ba8eb7 +fff0000000000000 +be97f181cf3a1bf0 +7ff0000000000000 +bd5218a0d73d34b8 +be2af07c0ce91605 +fff0000000000000 +7ff0000000000000 +3ec29583dc7e789b +7ff0000000000000 +be89f7259b82829d +bd722debf45b9437 +fff0000000000000 +fff0000000000000 +bd787778cf1e0a7e +3db1133e199d30e0 +3c872b1a8ba6e01c +bd66f1aea38da07e +bc7baa9a625de882 +fff0000000000000 +3e07c535cb9d2ae6 +bced81abff0a07f0 +7ff0000000000000 +3e8463fa6ee88910 +3d18ab3959532c7d +fff0000000000000 +45a8255b48e0dd1c +7ff0000000000000 +bc62c630983e8e20 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +3d98fe6318d3b85e +fff0000000000000 +bf887e7ecd06367a +3f5154497dd762f9 +3e71bbb749b856e8 +3fe4a251dbc86bd6 +fff0000000000000 +7ff0000000000000 +3c608232fa84595f +bf8132c7ae8083bd +fff0000000000000 +3db85b0be58f798c +c497fc5eead580ca +3ef72baedf80e6c1 +bcf77981e7e4851c +beaed822afb347f6 +4001c8d24c399eb8 +7ff0000000000000 +fff0000000000000 +bea8290116add386 +bcf949688e2ae2e0 +7e8efcbf44d5bbc6 +bed502c25e25bb05 +7ff0000000000000 +bdbe26047ef851ef +bcbc4be72834a53d +3c306ff20e372640 +5a1a5e6df2ee6cb4 +3f87a7c6c4a41515 +3effcef3d9bafec2 +fff0000000000000 +be119d00e3168a24 +3c378341eb020688 +fff0000000000000 +7ff0000000000000 +3e88027be68668ec +3edf0dd7e42104af +bd974a3abaa91d25 +bff20cb2bc6e28c6 +bd6d6567e91339ba +3dd533aa9c400052 +bcbc649c71445fd5 +7ff0000000000000 +bf648fdf4f6a8c12 +7ff0000000000000 +bf4981df035a51a6 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +3dec0f051905243f +7ff0000000000000 +fff0000000000000 +3ee9b8386f7f1965 +bfc7a1263b67e411 +bd0af760051fd8e2 +7ff0000000000000 +7ff0000000000000 +bd2a742e1ed617c2 +fff0000000000000 +3d2e67b10ca60a8f +7ff0000000000000 +3f370926c0a6d7c4 +7ff0000000000000 +7ff0000000000000 +bfc6442fda288d05 +fff0000000000000 +c00044f9a8ffeabb +fff0000000000000 +bfc254e763ac9103 +bc30b1f4c589066e +7ff0000000000000 +bf90f45b18c15b52 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +3ffc4ff9f51d92b0 +fff0000000000000 +fff0000000000000 +3ed3183c77512309 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +bcc3c76748436e17 +7ff0000000000000 +40a383b7d6b4f34a +3f2d3a3f050558c0 +bf1d9762d80f449f +fff0000000000000 +fff0000000000000 +fff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +bc64e5970e7ffeab +3e6b9349f78d4291 +7ff0000000000000 +bd97b1679e3200c1 +bf7669630331f19c +bf6ff360bcbd2c44 +bee922f990b692b9 +fff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +3db358bc057e451f +3e9885ab6787c914 +3c85e1a79c42eaed +3dc43d96e495ac7b +bf4d746671ce4c08 +7ff0000000000000 +bd806a2727545dc7 +bd066724a1852da5 +3d18b7f16cce956a +bca5f3e6e9532ace +fff0000000000000 +7ff0000000000000 +3f062d9108a05d3b +7ff0000000000000 +7ff0000000000000 +d3393d5fccad13ec +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +c3a3caedad8a253a +bc90b6e647100129 +bef6a2bb6fc828f1 +3d4e3777af94e866 +fff0000000000000 +bf80bc9c4a42a902 +bd0b4f15e2cc6ccf +3de340470fc35e37 +7ff0000000000000 +3fa9792e3f46d723 +fff0000000000000 +7ff0000000000000 +3f369358a963d666 +3e4c406deab38ea3 +fff0000000000000 +c1e2ffd6c6f1cb9b +7ff0000000000000 +bce65b7b79907322 +fff0000000000000 +7ff0000000000000 +bd10953f58b62c83 +7ff0000000000000 +3ce65a6125bf7717 +fff0000000000000 +3faa63ddb3c41d02 +3f43997e0efe14c4 +fff0000000000000 +fff0000000000000 +bed2b0f8cae23ca6 +7ff0000000000000 +66ccc437fc739a42 +7ff0000000000000 +3cde030ad6073e3e +fff0000000000000 +3fe267deef304a03 +3e65bdaec1bc3efa +be01626c658fa1b4 +bc9b88fe72c87e9e +3c75e24eca177dce +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +bcf5bb8a1014aa22 +bdd469735fc7de43 +3fe02956f5ca4ece +fff0000000000000 +3fa19541147b5a61 +7ff0000000000000 +bc87de0a7404ba66 +3e2c1e4ce62a835c +be40f67eb12c77a4 +fff0000000000000 +fff0000000000000 +be8f1aa11218f195 +eff1d3176f7121de +7ff0000000000000 +be10d46a07d6a4ac +7ff0000000000000 +c8019de7975c7221 +bf4cafb11639c4ad +7ff0000000000000 +fff0000000000000 +fff0000000000000 +3da089cd2e291307 +7ff0000000000000 +fff0000000000000 +3d6aabc54364669f +bfb56144da551a34 +3e43d1e0b4b28027 +3c6994d1cd25f6ae +bf966851f2f08b88 +7ff0000000000000 +bf421b57ed7bf04b +fff0000000000000 +3fcf14322b6fd3ac +bef12f26f2707239 +3d474c06c04945bc +7ff0000000000000 +3f785238c0aa19c5 +7ff0000000000000 +7ff0000000000000 +3d510fa830cbc3b0 +bf2da994cddcc51b +fff0000000000000 +bf3164bae3d869b5 +7ff0000000000000 +fff0000000000000 +3dfe9de8603b9661 +3d32f398ff4c7761 +3c5b59e3abaf6248 +3f1988cf8ed7192a +fff0000000000000 +3d6e28661e0d02c9 +3c83c35a6b8a6097 +7ff0000000000000 +3ea2bed6120b0f87 +7ff0000000000000 +3d9ca6a26c28ed83 +3c3043b1e1a274af +fff0000000000000 +bc6300a891a347d9 +4a284ccce522a366 +3cf1d6c19c330fca +7ff0000000000000 +bc3fbeb15d8afbd1 +7ff0000000000000 +5079aee365631efd +3c697f9a87ab53d7 +3f31ff01f83a03a7 +3c63c9bcf00f54aa +fff0000000000000 +bfb4e2324e9ad37e +3e71ba1e0f513bd4 +fff0000000000000 +c010676dcc1b4627 +7ff0000000000000 +3ef5ca6d96e56853 +c944f0d8c6544978 +3de1094b2be353b3 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +3d595640a7cda242 +fff0000000000000 +bc39bd35f153e736 +bf4152b748c37131 +7ff0000000000000 +be439ce7980f0d1f +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +3e14c0315b85ce64 +3e436f5726848400 +fff0000000000000 +bff86a4005ff849f +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +3ed04c688034ffb9 +bc47f8a6786ae426 +3d0f07a714c325c2 +fff0000000000000 +fff0000000000000 +fff0000000000000 +7ff0000000000000 +3d30467d80129ec8 +3dd4ab8a9a06040e +c17d54132dece624 +7ff0000000000000 +fff0000000000000 +3d013c5cce4c0dcd +bd35830ea9788f21 +3d72ed42213a699c +7ff0000000000000 +3f078c62c9b5237d +3f0925acfe99981a +3e4a281db3db06ca +fff0000000000000 +c022920e40cf506b +3fded62fc9ea2e81 +bddcfe2d21109310 +fff0000000000000 +3f7ba330fac5b120 +3fdb8504f6ad0134 +c10485bbd566ea91 +3c8b646443068ed4 +bf91ae2b14f5e128 +3f5be55374212df4 +3c48333991b4ef70 +fff0000000000000 +7ff0000000000000 +3dabccd844de1c41 +cfa092d92f16d08f +bd9360a32135ff4e +3e050208c94af08e +7ff0000000000000 +3fab9bad5f4950a0 +be055b48c5c07261 +fff0000000000000 +bdda83f7e6ddc1f4 +3cb6fdb48168339a +3fb6ab3699005c9a +bed08e73f48fbb52 +3cc32966dbdd4d25 +7ff0000000000000 +fff0000000000000 +bc6f666b78667b5d +fff0000000000000 +fff0000000000000 +7ff0000000000000 +fff0000000000000 +fff0000000000000 +3ee1bde7ce25f8be +fff0000000000000 +be30639c596ad433 +fff0000000000000 +bd82bb168fc7bdee +fff0000000000000 +fff0000000000000 +fff0000000000000 +bfda2118a68ebc34 +3e4289cfb4b80f2c +bde6b588a367bd5e +fff0000000000000 +fff0000000000000 +fff0000000000000 +3ffb94fd986c49e5 +3e378f697cda5c46 +3f08a84d8298b6ce +fff0000000000000 +bcd507ca9a2da830 +fff0000000000000 +3f30f37b6d7ef48a +be39dd06b0761f6c +c016fc50cda1340b +bf93bd44c05ed2da +7ff0000000000000 +c063572d846385d9 +7ff0000000000000 +7ff0000000000000 +3ec76dc6c2ba42d6 +bd526adbf8026791 +be1b7ca57e0bfe7a +f135588119505762 +7ff0000000000000 +fff0000000000000 +419b8e01e338f28b +bc791a1660f13998 +bc4cfdae285bb2ba +7ff0000000000000 +3e82a556343c0411 +3d100007c5174a6c +f93c086e93af65d1 +bea284e8a028a23d +bf92f0a157e08ef2 +3ccb5100e24fc771 +3d0b99b0b59b0a6d +fff0000000000000 +bef0e08621409bc4 +7ff0000000000000 +7ff0000000000000 +3f30298b56d136bf +3d713130661d64e1 +3df0e5d6048bfb1d +be56b25ba162fcbc +bc79a0489a17c6be +bf95f64c8dc0946e +3e8cd4730478af6f +3e785ec5e6c0df2f +fff0000000000000 +3df338d24fd35751 +c5590359de4785cb +3c6be427cbc26cd6 +bcd3523fedcac9a6 +bf5791e427074aff +4664a318d81e4a2a +bec7092c444e83c1 +fff0000000000000 +7ff0000000000000 +3da0aee2b17ebd0a +bdc54cb81d2f70e0 +3f3a603466ca90b5 +3d0383b8a9d9b67e +7ff0000000000000 +bcc387c95f349ab8 +3f14e5f28f89243b +bdbf58ba78efb931 +3c93f9969c3e3ee7 +3eda94a13b543cff +7ff0000000000000 +c017beaaa262b0df +bd01969e05487910 +fff0000000000000 +3d2ecaa362931c30 +3eb3dbe4e84668d0 +fff0000000000000 +bc527d3dcb259816 +71b175d00dd5384d +7ff0000000000000 +7e74e66b49e74031 +3f0efc274744e018 +c0294b4f22f3622b +3fea29ad9af08210 +fff0000000000000 +fff0000000000000 +be57d81a483c91fe +7ff0000000000000 +fff0000000000000 +fff0000000000000 +3f77e75795a47b01 +bf86102a14604106 +bcd5b0868bb86510 +bc41b264bcf198e7 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3c6c1e5ee5dfbfbc +3dc70bc6a1d9bfb7 +3d4ae3f67e3666f8 +7ff0000000000000 +bd701590fdf8586d +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +bd05a765c50b95b5 +be60a2224db861ce +bca2fc41c7fa586b +fff0000000000000 +416f2df7e3c7df42 +3d1746ee5305dd88 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +fff0000000000000 +0000000000000000 +8000000000000000 +@cosh 2218 607f2d8fa1ab934a +3ff0000000000000 +3ff0000000000000 +40272f147fee4000 +4026c8c73ea1e03f +40266440da6b16a3 +402601797c6ab5ac +4025a069709dea6f +402541092544739f +4024e3512a49845f +4024873a30af476f +40242cbd09fcf6c5 +4023d3d2a7af7c82 +40237c741aac91e9 +4023269a92b8514e +4022d23f5ded3075 +40227f5be8365859 +40222de9bacc5075 +4021dde27bb3f2c8 +40218f3fed3f9ef9 +402141fbed92a25b +4020f6107626cb62 +4020ab779b541ed1 +4020622b8bdaa542 +40201a26906e47f1 +401fa6c61689671d +401f1bb6ef4a70b2 +401e9314d2f53d49 +401e0cd519cdcea3 +401d88ed4bb1df48 +401d07531f47e095 +401c87fc79319ed6 +401c0adf6b427b25 +401b8ff233b92bd2 +401b172b3c7cf346 +401aa0811a5e3ec4 +401a2bea8c5a9d97 +4019b95e7ae4027a +401948d3f72b4066 +4018da423a6db4f0 +40186da0a5461231 +401802e6bf003a76 +40179a0c34f0207b +40173308d9cb9ecf +4016cdd4a50739aa +40166a67b235be22 +401608ba406ab2a8 +4015a8c4b19f8c14 +40154a7f8a1b9b92 +4014ede36fdea956 +401492e92a0e3075 +40143989a065309c +4013e1bddaa68a23 +40138b7f0011d9ba +401336c656dac898 +4012e38d43a2c6aa +401291cd48f52435 +4012418006c580b0 +4011f29f39f084b4 +4011a524bbbedd0a +4011590a816a6d39 +40110e4a9ba5afca +4010c4df36253b25 +40107cc2972b616e +401035ef1f15e2ad +400fe0be8fdb500c +400f581b49f0feeb +400ed1e9c4999ed0 +400e4e1f88ce734c +400dccb24f844ae9 +400d4d9800de5122 +400cd0c6b3648e72 +400c5634ab3e0680 +400bddd8596e6514 +400b67a85b172ab6 +400af39b78bc49f8 +400a81a8a58c26ee +400a11c6feaaea6d +4009a3edca811af0 +40093814780d6d5b +4008ce329e39c00a +4008663ffb3332c5 +4008003473c54e8e +40079c0812b8306e +400739b30831aa93 +4006d92da9194f79 +40067a706e7f5ad4 +40061d73f5066c5b +4005c230fc5008c0 +400568a0666bd54e +400510bb374982d9 +4004ba7a942d5d09 +400465d7c32772f8 +400412cc2a8d4e9e +4003c15150763073 +40037160da39c519 +400322f48bf14ae2 +4002d60647fb1d6c +40028a900e809d6d +4002408bfcfe6b6d +4001f7f44dceebd4 +4001b0c357b70b54 +40016af38d753a8e +4001267f7d529849 +4000e361d0b64165 +4000a1954bbabe49 +40006114ccc58545 +400021db4c2089e7 +3fffc7c7b72ba27e +3fff4e534c1a0668 +3ffed74fde55e272 +3ffe62b425e615ee +3ffdf0770ad572d6 +3ffd808fa47d32a6 +3ffd12f538d31ba7 +3ffca79f3bbb48bb +3ffc3e854e5d8627 +3ffbd79f3e7e3604 +3ffb72e505daaf4c +3ffb104ec9890ac6 +3ffaafd4d95b5153 +3ffa516faf45ff5e +3ff9f517eec9d16e +3ff99ac66460ce40 +3ff9427404ee82d3 +3ff8ec19ed336539 +3ff897b16143534c +3ff84533cbff226d +3ff7f49abe9135df +3ff7a5dfefed118b +3ff758fd3c51df13 +3ff70deca4cfdb7b +3ff6c4a84ed0a3ce +3ff67d2a83a25777 +3ff6376db0058721 +3ff5f36c63bde747 +3ff5b1215125bdb2 +3ff570874cc4018f +3ff531994ce525b9 +3ff4f4526936853c +3ff4b8adda646a33 +3ff47ea6f9baa768 +3ff4463940c7bd36 +3ff40f6049028277 +3ff3da17cb724a76 +3ff3a65ba0598107 +3ff37427bee2b613 +3ff343783cd01238 +3ff314494e2d2e1d +3ff2e6974503466a +3ff2ba5e910fc680 +3ff28f9bbf7d2432 +3ff2664b7a9e06f2 +3ff23e6a89aab514 +3ff217f5d080c1f6 +3ff1f2ea4f64f80a +3ff1cf4522c779e9 +3ff1ad03830a15cc +3ff18c22c448c6d6 +3ff16ca056245ff7 +3ff14e79c38f5c29 +3ff131acb29cd016 +3ff11636e451794e +3ff0fc163476e768 +3ff0e3489970bb82 +3ff0cbcc2413fae7 +3ff0b59eff80718a +3ff0a0bf70fc216d +3ff08d2bd7d0bc1b +3ff07ae2ad2b236a +3ff069e283fcef1d +3ff05a2a08dff4ee +3ff04bb801fbd0d3 +3ff03e8b4eed6b68 +3ff032a2e8b07c9d +3ff027fde18b08da +3ff01e9b64fad70b +3ff0167ab7a4de23 +3ff00f9b3746a8c0 +3ff009fc5aa9add3 +3ff0059db1989d54 +3ff0027ee4d6a022 +3ff0009fb6188a68 +3ff0000000000000 +3ff0009fb6188a68 +3ff0027ee4d6a022 +3ff0059db1989d54 +3ff009fc5aa9add3 +3ff00f9b3746a8c0 +3ff0167ab7a4de23 +3ff01e9b64fad70b +3ff027fde18b08da +3ff032a2e8b07c9d +3ff03e8b4eed6b68 +3ff04bb801fbd0d3 +3ff05a2a08dff4ee +3ff069e283fcef1d +3ff07ae2ad2b236a +3ff08d2bd7d0bc1b +3ff0a0bf70fc216d +3ff0b59eff80718a +3ff0cbcc2413fae7 +3ff0e3489970bb82 +3ff0fc163476e768 +3ff11636e451794e +3ff131acb29cd016 +3ff14e79c38f5c29 +3ff16ca056245ff7 +3ff18c22c448c6d6 +3ff1ad03830a15cc +3ff1cf4522c779e9 +3ff1f2ea4f64f80a +3ff217f5d080c1f6 +3ff23e6a89aab514 +3ff2664b7a9e06f2 +3ff28f9bbf7d2432 +3ff2ba5e910fc680 +3ff2e6974503466a +3ff314494e2d2e1d +3ff343783cd01238 +3ff37427bee2b613 +3ff3a65ba0598107 +3ff3da17cb724a76 +3ff40f6049028277 +3ff4463940c7bd36 +3ff47ea6f9baa768 +3ff4b8adda646a33 +3ff4f4526936853c +3ff531994ce525b9 +3ff570874cc4018f +3ff5b1215125bdb2 +3ff5f36c63bde747 +3ff6376db0058721 +3ff67d2a83a25777 +3ff6c4a84ed0a3ce +3ff70deca4cfdb7b +3ff758fd3c51df13 +3ff7a5dfefed118b +3ff7f49abe9135df +3ff84533cbff226d +3ff897b16143534c +3ff8ec19ed336539 +3ff9427404ee82d3 +3ff99ac66460ce40 +3ff9f517eec9d16e +3ffa516faf45ff5e +3ffaafd4d95b5153 +3ffb104ec9890ac6 +3ffb72e505daaf4c +3ffbd79f3e7e3604 +3ffc3e854e5d8627 +3ffca79f3bbb48bb +3ffd12f538d31ba7 +3ffd808fa47d32a6 +3ffdf0770ad572d6 +3ffe62b425e615ee +3ffed74fde55e272 +3fff4e534c1a0668 +3fffc7c7b72ba27e +400021db4c2089e7 +40006114ccc58545 +4000a1954bbabe49 +4000e361d0b64165 +4001267f7d529849 +40016af38d753a8e +4001b0c357b70b54 +4001f7f44dceebd4 +4002408bfcfe6b6d +40028a900e809d6d +4002d60647fb1d6c +400322f48bf14ae2 +40037160da39c519 +4003c15150763073 +400412cc2a8d4e9e +400465d7c32772f8 +4004ba7a942d5d09 +400510bb374982d9 +400568a0666bd54e +4005c230fc5008c0 +40061d73f5066c5b +40067a706e7f5ad4 +4006d92da9194f79 +400739b30831aa93 +40079c0812b8306e +4008003473c54e8e +4008663ffb3332c5 +4008ce329e39c00a +40093814780d6d5b +4009a3edca811af0 +400a11c6feaaea6d +400a81a8a58c26ee +400af39b78bc49f8 +400b67a85b172ab6 +400bddd8596e6514 +400c5634ab3e0680 +400cd0c6b3648e72 +400d4d9800de5122 +400dccb24f844ae9 +400e4e1f88ce734c +400ed1e9c4999ed0 +400f581b49f0feeb +400fe0be8fdb500c +401035ef1f15e2ad +40107cc2972b616e +4010c4df36253b25 +40110e4a9ba5afca +4011590a816a6d39 +4011a524bbbedd0a +4011f29f39f084b4 +4012418006c580b0 +401291cd48f52435 +4012e38d43a2c6aa +401336c656dac898 +40138b7f0011d9ba +4013e1bddaa68a23 +40143989a065309c +401492e92a0e3075 +4014ede36fdea956 +40154a7f8a1b9b92 +4015a8c4b19f8c14 +401608ba406ab2a8 +40166a67b235be22 +4016cdd4a50739aa +40173308d9cb9ecf +40179a0c34f0207b +401802e6bf003a76 +40186da0a5461231 +4018da423a6db4f0 +401948d3f72b4066 +4019b95e7ae4027a +401a2bea8c5a9d97 +401aa0811a5e3ec4 +401b172b3c7cf346 +401b8ff233b92bd2 +401c0adf6b427b25 +401c87fc79319ed6 +401d07531f47e095 +401d88ed4bb1df48 +401e0cd519cdcea3 +401e9314d2f53d49 +401f1bb6ef4a70b2 +401fa6c61689671d +40201a26906e47f1 +4020622b8bdaa542 +4020ab779b541ed1 +4020f6107626cb62 +402141fbed92a25b +40218f3fed3f9ef9 +4021dde27bb3f2c8 +40222de9bacc5075 +40227f5be8365859 +4022d23f5ded3075 +4023269a92b8514e +40237c741aac91e9 +4023d3d2a7af7c82 +40242cbd09fcf6c5 +4024873a30af476f +4024e3512a49845f +402541092544739f +4025a069709dea6f +402601797c6ab5ac +40266440da6b16a3 +4026c8c73ea1e03f +40272f147fee4000 +40272efa14a3e8cd +40272efa14a3e8cd +40272f11db98a6aa +40272f11db98a6aa +40272f147fee4000 +40272f147fee4000 +3ff00027ed54513c +3ff00027ed54513c +3ff001675ca27fcb +3ff001675ca27fcb +3ff0059db1989d54 +3ff0059db1989d54 +3ff0167ab7a4de23 +3ff0167ab7a4de23 +3ff0fc163476e768 +3ff0fc163476e768 +3ff531994ce525b9 +3ff531994ce525b9 +3ff004e45aa6ff50 +3ff004e45aa6ff50 +3ff0cbcc2413fae7 +3ff0cbcc2413fae7 +3ff110e1ee817ece +3ff110e1ee817ece +3ff47ea6f9baa768 +3ff47ea6f9baa768 +3ff6376db0058721 +3ff6376db0058721 +3ffd808fa47d32a6 +3ffd808fa47d32a6 +3ffea861cf08e57d +3ffea861cf08e57d +3fffc7c7b72ba27e +3fffc7c7b72ba27e +40040a945a73fb86 +40040a945a73fb86 +400412b71bb7333d +400412b71bb7333d +400412cc2a8d4e9e +400412cc2a8d4e9e +3ff0000000000000 +3ff0000000000000 +40112c07c864cde3 +40112c07c864cde3 +3ff39c31fe8438ba +3ff39c31fe8438ba +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7fdfffffffffff2a +7fe3e21a464507fa +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff09bfbe2e318fa +3ff5a20856da869e +40a2aa512cb9b74e +3ff5729fd659afa5 +402c043ab2ed7191 +40fe150b47ac152c +4002a9326f102fa7 +401cb1bc241b7bf5 +40fff81b9378ca5c +4021ba3a3eb854cd +401752284890f4cf +405178ae1605f885 +40173701289bd004 +406a0be826f8459e +40b67b8807ffcfe8 +4090158800e1a327 +401c6cd9fb2f5001 +4089bcc9843f1611 +40a936eb11272032 +409b27886b1182fb +409924d6a3325a75 +40950ef2647e25b4 +40a6a7818d6a97b9 +40027c725f16e7de +40e6e49d4d26ca5c +40ca7c43df4b57b0 +40d6602830d266eb +40c0fab21b0d3c17 +40cc01612255192c +40b0343b09c45ab4 +40100f7b717d5230 +4082f28ebcd29b82 +403ea60f708a12c3 +40ed6f052ffffbf5 +408b1b6ae366be68 +40b82d8758bd9281 +40d93cda8d9237d5 +40bd0fd7f39373c5 +40d894f0f23912b3 +40c5b674a97fe5cd +400d2c286b5f8f92 +40ce6cb3e4d54ab1 +4082407dd20b2250 +4043b696c8a07707 +40a110480c60daa5 +40e94ee09881d6a3 +408f84557b36de01 +406ffe3182ee1a24 +40b0a99f40ef04b6 +40410004b072308f +40aac62039db360a +4059bfd9c2311779 +4062275bccd15e9a +4048ccb56198c948 +403db3b52d8e1ab1 +400f699b684fa110 +40a8a093998ae530 +40508a6226939016 +40cee593976abdfe +40393f9b0fd64561 +405e74a50a4a4df5 +40da194897ec0384 +3ff000140fa9bc68 +40f92b45674a0107 +410143ad4976566c +40136802432a0c99 +40260846026f8279 +40bce0de7398614c +40e92dac429719ff +40fc451527ec29df +3ff70d11bb63aa7d +40e428b1eb8e8060 +40dc7a39e41b1184 +40d3caf8da71c7a8 +3ff021c35c2ee4c8 +40508ff05c576be0 +40d23242ccbfc462 +40982266e432bb2b +40b81d461c9f4bc2 +4033901a76f1399a +40919fddb853e393 +40f9b07efb163da2 +4015982b267369e6 +408743de200813cd +40320f0ea730f518 +4078590fc683a721 +4019aa0bc745526f +407506661a4e6620 +40b324dd8e00d3bf +4059f16a2d497d0b +40def2fe8a9cc8da +40530cedf9471efc +40f2ffebb13b3429 +4041113baa6985c6 +3ff642294ec379e9 +4093fc1cae0e3f61 +40bc36a40b56c497 +3ff2181fbf11fa3c +40437cbfb45a887e +40f176c22a838d74 +403351ca4826f0ef +40c02bf501eb28bb +4039d77fc2072d89 +402a2cf866d57c7a +4014d33cda2b8a09 +4002834c3dbf0e4a +40ca25af3a6242f8 +402d4f3c402b5d41 +4017098c3f9ae9a4 +40ca5b6aa945851a +4029d0ea9b38afed +40d8677971a2dc2c +4007525e3f067bb4 +40cdb545f417ea31 +409acc55c6417173 +3ff329a2b1cb39ee +406aeaf4a672794f +40902706da2b91d3 +407cb8743e5b754b +3ffd951014a8a056 +407780dcee24b2b7 +404c514b89fa3500 +3ff1dee00be74885 +40d25ad0af9e3837 +402c2af502b57ad6 +408c6cfbafb0c1ce +3ff4c941e58d164d +400a6eb60a6ecd23 +40092afd25328734 +4060ebd1ca6cc03c +40429526f5f2ef20 +40b358b08ff1e3b6 +40358cbbbc3b2761 +4021fd0db9b1d4a5 +40d3e0889b057436 +3ffd7e84ecfaa178 +40baca678f1a6ba1 +40a5305dc7db2f4b +4097ae5145668da3 +40934037c3077f7a +4005211c7f18150e +40f19a32566820aa +4032203db9710395 +40c0784fd031c02f +407bae1e6a19fb2e +40e83d708baf38d9 +40cc0fa76fa6f9cd +4052a9ea7d60740a +405142ee2bb2c93b +40e895cd7b52c24c +40f21c3ee7216e2d +40e9aefec021cb43 +4042d6a0fce8c99d +40036957f0599965 +3ff09e2f9a61d78e +3ff9c658333c5bc2 +4019bd624d57f0a3 +4011a08b6ce44dce +401f1d3f3c1edb56 +40733fa24db80c53 +40022eba6d3c4e31 +3ff0593c8c63eb44 +4053ea550554723a +406e6db4b199ff38 +40198bcfd7eff4aa +3ff126436fb601b8 +40f1606e215ef299 +40edf7c825b50f9c +40708232f4715ac1 +3ff1c0c65073c840 +40ed807dd46fad92 +40233d9fdaee70f4 +408cd13d6619823b +3ff14d59772e3b49 +41017a4652a17dfb +4011621431e5b0f0 +402430b8dba452c4 +4046b8eaac752e76 +407fed3ce92178d3 +3fff5ab5472c6e81 +40c3e5cbcd1e9a94 +4040c5de563aa193 +40bd1694e90d30e7 +407410b0ff9533f6 +401431b5861f9800 +40b5e1cd6e66724c +401201f448f16d9a +40a1c2aba2027942 +40cb7431b0852412 +40f073a66c23beab +40e14b968cf71af6 +410034b88e6bf4e5 +406620d961b376b9 +403584be9ee13010 +40ac4d2a167added +407913b2566ace89 +409f1cbade516a0e +3ff45f38390c7626 +40b60e708f2986c8 +40700f7bd940a6f4 +40893542ad55c2e9 +403938af745b71e6 +40d7a2eed057ecea +40b52b3eed625ca5 +3ff10260a2d6f1e2 +40d1ac2850adf15e +405865440765cb54 +3ff93e5ef20c9f77 +404ed084f85cca60 +4087cf0aea345b37 +40bd4d3e279a39b1 +40ecd7625e8622e8 +404572b181dc4917 +40d1d85f667ec70b +4074dc49bac47fb2 +408958e587e6c9da +40f55515dc128497 +40142e8e45fd75cf +4053e4f8f8913c0f +3ff8d472c927dd3c +407d28131b6496e9 +4073fe84a66a4d35 +40af6ba4d220da09 +40b53045c631fe52 +40a5e574b45b2a00 +40d9f23153958ddc +3ff1a4fa757b54b6 +40bfb4f1b69528e4 +40736f4fb3a79858 +4024061f86adad4c +406b9cd6a6399749 +3ff48488c9c31b7d +4094347eec95887e +40728339ba91a888 +40b6ede4371711c6 +40ca0fbd17303348 +40110d72866acb86 +406e69d8bc776706 +4031da895ba62a6f +40bd70447dd94619 +406bcad5ed85624c +4058002e40144597 +40b14cb1882188cb +40cfbb56da36709e +40203708c073dec3 +406cc62ac6325166 +40957967b982516a +402717716328604f +40038fe82b5de207 +40c6b2ab3a9a5b20 +4041c7a3af370225 +405afa446ffbf035 +40cdd26862a7cd38 +4005847ed4d5da9c +405627cc4fb6382c +4027194d77aaf317 +408024e9eb10c7af +402700bd9c8f72d7 +3ff408d6f46b1a1f +4093c6108c6e3de4 +40d3f360a2bbf66c +405c9c8c697d9878 +404869fe3be442c0 +4083f80df33181c6 +409ed9e581ea1527 +40c63c43fc9b8d6a +40202f37704aa765 +40a9d96aff04ee8c +4023bfd60f214889 +40a2b3987847dbbf +40e685b7ecd0357d +405812b506b8a507 +4072ccd7ffba2512 +4050f234d4081827 +40d42093421d0719 +40d5468514cf07f4 +408f53cf71fa9a52 +409d4acce9b2a2db +3ff272c73c7ebf89 +4089ec446f522219 +40846e4f1a8040bc +40935401f93a4294 +40f14917f4769131 +404a74f77902906d +40746669aa3ed781 +40b12ff8e4514ec7 +40d69201cf13baea +408e6d8183e193d0 +40c09146bb08c4bb +40036c7df8d17e54 +40b8a41254ee0295 +4022927f81da1797 +401140d34adb95cd +401f617d4c48f672 +4043f3a5df06f0ae +40b8d7179d1bb071 +40e3afb84c13e93b +4088300b08738aaa +405a5d8aa3fe1421 +4003def204c0ecea +40cf116b476a911b +40d1c5dc4f59c3b7 +408af41c1839435d +3ffadaa80666d5d8 +4016334cc6cc49ae +40d15d54c747168b +405e964773dbd19e +40a7560f1925b7b9 +40ea0a7aeb0763c8 +3ff9264b562721e0 +40d1aac7aa224c2e +400da2fbcdfac07c +409da2f8b9c5a9d4 +4062703a5ff528a7 +405f59a22b302b2a +4013b7903324fc94 +406ba4d3c2ed85d9 +40f2c785d4606e99 +40ccb592e8275dcd +4065e44fc9fb6896 +4062e7d5575e38bf +403820e8b99edf92 +40922b7b01d7dd83 +403a2ee2e62b9645 +40e2bf3fe7e94d54 +404bd44d0dbe1826 +40dd3f1eabde6e0e +405b138b32dda833 +40346c7e5dd55497 +40b23bfc10294945 +40f0402be2f2a67d +40203e0dcff01957 +4024e7dfbd2e871c +40fa49ed88411372 +40d7999cf53b6034 +3ffe2dc28517e397 +402420faffdb5e75 +40200440efe1fd82 +40e2681990bc24fb +4020b5c67fa56e5d +40898b474514e2e4 +407132f04bb8d8b6 +4078ce04e4998f83 +40b08e2748baf338 +40acc7f6907c3701 +4079aabfa3d1028a +40c1b8327e2c6aed +408e28d662685da8 +40d222e4f07f35ed +406b68cd2e9f7817 +4012cab650eff1e8 +4090ee02a73ab2ae +406c103f4628ba6b +3ff00814be4bc53a +4088883f76130f28 +402bd2e2ed66f02c +409413cb93a71bbe +403a24d53483d514 +40f7e75403e4bcd7 +40a24e07c7aae634 +40669132b3a9e5ec +40698def129c0ef5 +40e86213b966d5f4 +4040fa8300d7ed8d +401b12dd73710a32 +40d355b23b50ce04 +408339b8745b3595 +40b67644710b690c +403b6c78e2c70a78 +404899762e9b3aef +403c3074a7e9a5ba +40f1646e1a5e16be +402b8f5aa9571a6f +4010f04fb6d123f5 +403ff29bc26cf991 +40c0ad5df99f280b +3ffd0e8e661b9710 +3ffadd416e290fbb +40933a2ed6e64246 +406bdaed41527255 +4066e602a7d8aeaa +40b90bdb6ae44f29 +3ff1c45e8676deb8 +3ff770be02dd2be8 +4048637a72cacf7b +4080d8e4eeb6652e +3ff01b5590bc0ae3 +40603bdff0ad39ca +40c3a2b5ab61c978 +40313c0f68f03623 +3ff3aa03b79e5800 +40c0f4bedcebeb54 +402c2bb9d707d68c +40ed16a5af35b46c +3ff8f6f976cfd1ba +405cfdeb3a929224 +3fff58db3279402f +406ebc80303a5a25 +40ee5141af063c4c +40b4bc69742bbce5 +3ff8d7cab75eba55 +400ae8f1a81648f2 +40c8a72591610601 +40ca3d316310b9f4 +40244b8bf94f0ba1 +40a554fed24e3f01 +40eb0a2910f16671 +402b2fb85f5b00d3 +400f0ac9aaf529c2 +40fa227c5fa61993 +40c422d9da6c2525 +40df83ba89cf8c56 +3ff0fd2cd276f000 +4003a28cf92ba338 +3ff44f57f0af3fb8 +40ecc5bb75774940 +3ff3de1ff3ae8d8c +407bdf8767f6c1be +40215a9adad05c37 +401a88d87d22f42e +406e28784e1eef9c +406a9beae86e2966 +40d9bb4aef1d8cd9 +40d0268bf8c27c54 +409cf9b5196206e6 +40cde324f34ceee7 +408209c97ae43d29 +4060c0c734fd8c82 +402ef9970a4a3941 +405c15824c52222a +3ff73732aba2548c +409395179a2fbe79 +4092edbd9d70e06c +40b53e2d4ea3069a +406ea8d966bfaae1 +40b8ef6ceded3df3 +40c491cac1ad649f +4036ebe1b2461a66 +3ff3e1904965652a +4100d31acd77c80e +4076ecc1316025e7 +403ae385e74ca146 +4029df1faf60f267 +406ab2ffe6ff178d +40b220f51bda860f +40848dfbc9579839 +40f24c13646706b7 +40c2a3ca673670e9 +40e44d10cd7ad18f +4035e6b14d274307 +407322b9eec6c897 +40ab768b4596d2cd +40f9d4034bc5b9bc +3ff54aa9fc8bfd82 +40038d96569737a0 +40e7150acbeedd37 +40806f00f67a059c +40287219eec774ac +40a198e4008cd1cf +40e28cabfbbdb5b9 +407c9a74f251f804 +40a0cbc2a2806440 +400778fda0f3f30a +40035c010c00228c +40aea5e4add673ba +40353756c9102ed9 +40836927ee55fb70 +403957f7bf529580 +40376d615b0762a3 +40d0e0bb7eac1269 +403c263518bec27e +40318b6d900529dc +40f990871b300a4b +4066b381ef62b44f +4090d9cbc1c13f84 +3ff0c6bb9c560bbd +40ca2f201f2bf979 +40d986815f1ecbe5 +40a9459f396ad100 +40153bbc83689e52 +40c08175793c2863 +4027b0e079e81ad8 +40257f6600f8781e +4072c8b39fe036c5 +40ebc2700490bb78 +40ad865c9f8dbb0e +40364b20314623d3 +40e260ff0febdf57 +40533fec4f65797c +4041f2c22f17baf7 +4013b9a34ea98eed +3ff1d9f40917bd6d +40837d48210bef45 +40bb7284674a6b25 +40a4b61ccc4744a6 +409ea712c39da2d5 +4078e197db9c0559 +4013c0d9697e63ac +4077827528a5b82d +407f180504711a05 +400d096eeded8f4a +40a7b90e2c818319 +3ff8d0737d1baf2c +3ff3b8e8b3454455 +400203fe6cff8081 +40467839120c0634 +40fc8f14392b88eb +4012d637a9d38a53 +40a3fd12bc201aad +3ffa9c45946f9cca +408a4f85ac0aa2d4 +406e82213eaddd10 +4042217c8a02595d +404763666acb6007 +40e1dc45e4de361b +4001c82c0336901c +41012c005472d62f +400fca1541bfe7e4 +402d1f75fd51a7a5 +40d78b9daa1434c4 +4080d2aa6ebfb2fc +40152afcc8ea4467 +40e08ebf5104480f +40debbcc874db41f +40f2b336d9d58d27 +40fb3e04f091e75a +4027917dfd754a98 +40a09ee3d0ce042e +40f226bfa7dc4548 +40a6872b62d35937 +400167065ac66b56 +3ff33f243d498f68 +407dc595822ec163 +40f8673a6c6133e5 +4003c0214ef1f4b7 +4045f38c9b0033c0 +3ff7a8d8bd738ad4 +4053555a36f2451d +4035e3e541b61ec7 +40adb2687feef101 +40069c3bb63dad14 +405f53c2fac1a825 +40ca0d9ec4194e47 +3ff2da53c007197b +40383865a54837d3 +40a300ebc4c33bb8 +40414908273f402f +407ffdca37f039e3 +4048b0cd6704b922 +4074fd023fc06db9 +409fdb5d996e2cf3 +4022d21622f6a9a0 +3ff1fd8829a142eb +40d9f24ddc96de40 +3ff01f20a392ce3b +40d4dff2cecbad23 +3ff6b26d4afa7a57 +4081e8035e1a469d +40023b49508e8432 +40ebb13531bd5546 +4086165ba80dea12 +40f3361a2a9778ce +40f9d04ae1b837dd +40c296600b8343e4 +40f2dd61080a0794 +40534205ae2dcded +40f741e137b6d9f8 +404cbc1c3d66df30 +405cd258982d1eb0 +4053431420b06247 +3ffb2b5b93584ccf +4075b46c1bfeb030 +405bf50aee876404 +404db30cc2c11028 +404d16803e572a76 +40a722e3c3753442 +40b4e38108490ac7 +3ff103016c0a262a +405e176bc87fc43a +40817d9920ec7b2d +4085264e2f665e87 +4093c5e56e02b97a +407308d6d0516671 +3ff11d392bda8ad3 +4010fecc6f3683d5 +3ffe671e918d685b +4033afb641fbbaa6 +400e9a1702965960 +4080eb814756da77 +40aa95856eed9452 +40a36f262f11e9c9 +40d1db2fe995f7e0 +40373da953b4bfae +40e224eeb31412f9 +4075772d3bd69427 +40854b01e683e629 +401ce0650e7e7929 +4093e15480843420 +402994005db20d49 +401b7b1975f3e7f9 +4053662c48a6436e +40eb2adc2bc916ba +40527eb4fc3c2951 +40647c2dae9139c3 +405b4e02a10b273c +40f776c98f70e5a2 +40b2c2616ac32e8b +40921956c1a17fa0 +404208e597a85395 +40fe9d7d6e114b4d +40680b232a517c14 +40b85ad3f181420c +4026ca2fb2c4efe9 +40f5852c38230b80 +40ec7dc32520e8f5 +40abda833a4e0caf +400dad219896c955 +40f29e2b2eef4f32 +40958483971b19bc +40e9c149a096fc77 +40d6092d2d9fca4f +4071a8bb851c03b3 +40a107e058c40f3b +40cb63570d929d08 +4044eba1dc6bddde +40b822c287371c30 +40fee7ba93cc5555 +3ff709fcc997e82d +40d659ba077161f9 +405227f6fbc5f6fc +409fd7ee43f4d290 +40081e91aec0b9b1 +40633a5c9bdc6972 +4007d1adc13a8cac +404baec5c97ae7c2 +4018b9b8efa03047 +40fc24ad738cf606 +40b50e095e881fe5 +4080d008f6ffba8f +4089334565d87170 +40050c1dff6fc247 +40d227467c45e7fa +40a7afe3f8710db1 +404823998312cc85 +401aaa232b2bb9c6 +4077e0dd4089dd8b +40cf978ff0541594 +4080d20f4c0ff62b +40cd8bbcb82ee3ec +40f8bc797f7174ee +405fe06404889dc5 +40fc2538f7320d6c +40eef27c33cd8e2b +406581bf08ef92fb +4100a8288cd61cba +408da40b88f5d92f +3ff22f3ce03c8bc9 +40fad2be8d4a7ceb +40675b8a58a883a5 +40210114b7a8ccee +4050de574d507dd2 +408e39c939b88cb2 +3ff00081eb0a6cb9 +4065274794ad193a +40ec54892be30f52 +4013c1304a532df8 +410040efdde5f1bc +3ffcdb14a6b750a8 +40825c288870ca9b +401fefbc45152e9e +405b898f7baa64ae +40faba687affacb7 +408a249e35efbd5f +40d637cd51efbbed +3ff280df848000c7 +40a53cc493261236 +40e943da31924b83 +40a4419c3a0ba64d +3ff45dbdad579784 +40bee7966785790a +3ff5a259b3a044ff +4091a0b93911a723 +3ffa278b8a73c370 +401b0187b88453cb +4100082f192b4a76 +4050e9b12e2c7e3a +40fda87ae8407be5 +3ff61b7070926775 +40b4690b6ed8d4b9 +40f5bb4dbb60f8db +404572b025becd39 +405d60df792a90cc +40f5199670f41fbf +4014ad5044c1fdfa +400290219340913e +40a9e2f798b92d99 +4006ed4d3a386c44 +401beb69d3b2cfa4 +40a4b2c9f3e752ac +40e3cb673f887364 +4095f28c89b06626 +40d4b367a9a0a40b +40b6eb741a06d479 +409663bedb827edc +407151a1c433fce6 +40e8591d03bf8e66 +40a67436acac91ca +40b35b58bfeadf3d +407c28dcb846a3b6 +40c7a610d232b8bd +4031254aab0c9678 +3ff1e35024925060 +404df5f2d051accd +40e7524b279fd9f4 +40655a1a089e0afa +4003f982a7c11c6e +40ca1e3ceed39ae8 +40dceebfbba7e052 +3ff6d4772ce749a2 +400aabcacfd70576 +4026a5de62ebcb81 +40d0ee83d49dc89c +4045a95f65421e68 +4080dee77ecf7545 +40129c3d3910f442 +40bceb5925829c1b +4051726eb091eedb +4082f77cfff5ff80 +40e415c512833a3f +40237b7fd2ab328e +40c2fd9dcb8ea7b3 +40bca505b94ad10e +40532e45028aae71 +402aa8212df11741 +3ff3600a13d97378 +40113698e79c5f4c +40516e7249566a75 +40be7e03c4bd667b +40c2a0531e2748b2 +40c35119f8829745 +406fe5721d5b20e7 +40759178c9cb6faf +40b7fca018c5fc88 +40d2e96203ea6c0e +405a3a910a925279 +4076dbe26d3a706f +3ff21e595349e75d +40e9b0cb0a90b051 +40cec757f706b974 +40d46da997a2e4ce +40ff8d1a3a7374d9 +4027da337ac9ccbd +40527d02b5d5d542 +3ff4111b24d4db94 +40d1919d95d8a5e2 +403e1739d1b329ff +4013e06d37e8d2e0 +4060d18a5bca66a7 +40e21722a1e83138 +40089fa65305e534 +404e899860ac9816 +404c312437e418a5 +4015eb86af1a86b6 +40c0d2284184c036 +4059d9ac352b7a0c +40e4ac333a6a326b +40e035331ce0042b +402eacd38e04eb30 +40f964ec4ec32927 +408099ae6164b6e7 +40e59eee58856b30 +400b8800db75a35d +40f1eb3189a2c063 +40d2322a47968161 +403c2fac10c78f6d +40e61e0b093d2f5d +400e1f306d42106a +409ed369bdfa073a +40c6de34d1d6a465 +40e97c99f0daa553 +40e11430326397bb +40f82d0501d190a8 +40e66e7746805bf1 +40d723facb6ada9f +408dce77edbf2ef9 +40d3c818718594a9 +40033a88b0f6ab63 +409f06d2d89c5d30 +40b373bac40bb93f +401cb1b5ae1789cf +40a40980a8a69fa3 +40de66592ae8860b +406a6698011053e2 +40100d7de97a42ea +40d7ac67b124f2c9 +402424aca79de627 +406d5189c5a2b21b +40aee5150a854179 +40f8dbc14ff6a424 +40c2ff6244562880 +40e91394f1a74247 +406cfac47e0938f2 +40c02a0ffc253151 +4060f8d7f847993f +40a4aeaca19951b1 +40425a1512c55caa +4013c816a24adb70 +40ec8971ea8075f8 +4052829e7c8d1366 +40d1c7a44d90b9cf +3ff0d11fc126c60b +40910bfaf7290c7f +40c84e1cfa9a8925 +4000a9b417be51c3 +4100a1cc6d9f6fe8 +4046d67b4e72a5f5 +4064e54964e038a2 +4064505dea8f387e +40c6f9423d2a0cde +404a099e1300cc8a +40cb49a9bd070e38 +40962e78073b5584 +4027293540a084c9 +4074facef48cf895 +40eed46b81fdc5bf +40c31bef33872c85 +3ff28316fd847c02 +40e267d76fbcbe20 +3ff0c3df4fe5ba8d +400c9726e0d4a0ca +40815d1ce78292bf +4027acd24fd67495 +40e28bee66aa2e5c +3ff2fe9d393cfc3c +4082c99f1a55faf8 +4015ed51ce469545 +40ede84fbd537416 +40c233f2b8708843 +40534bff01017018 +40b92938ff2ed8c9 +40ed43a9e281ccb0 +4036f77e7d743c98 +4029552e70860ecf +40645f8aded0518c +4037602c8a38aa34 +3fffcb28da618bef +403cef3aaa81114e +40a6ddd91ecc2eaa +40736d62b2770c0b +40574545c13e4f17 +407564b093c24f11 +409b77b4efc6cbaa +41015ddd6ccb786d +4090ec07296bb781 +409a6619c37215a5 +40eed6bbb5945661 +402b98c170fce27a +4089c1e047323923 +40828a57ee4d84f2 +40e6d5654943bfd1 +40dbb52d2331120d +401276b239df11aa +40115f45951bfcbe +40dd1c2478f06394 +3ff6a5384e050a75 +405a18d2b8d1d88e +4047d4f59b342fd7 +40289fb98ff3be47 +404cbaa03597c29a +40da57c1d356654b +4057512c0d72b326 +406fd42bf8072cfa +405b93a0a52f5d11 +408f7fda1a0ca2a1 +40779fdba554e169 +40efa41288653c63 +400154feddaf5a08 +407194bc59a2950e +409bb68f25cbaff0 +40fdf25b0913a585 +40b79f47f2e4dd35 +4100f48bd690dfc4 +402146c96a7be169 +40f64a4508dd9034 +3ffa5cf900913f6c +407665f7c7d43e66 +403f1d952b21d64f +4099ebd69cf273ee +40b2dc8549356b3d +40effb6082128301 +408ca8e54248245f +40419cb75006cfb9 +3ff076b5404f7383 +40d721273aa1b1a5 +4010335c6a5f57aa +4062e540bef57702 +4096d221d30b3967 +402981ca49f56b73 +40a3c9b74d2908cf +40cb2ded9e8ea208 +403ccbd7d8092c50 +3ff9a2cfb993c61c +3ff11d4c1ddb9bde +40e0c6ba5bc465f7 +407a580b7d2b6c7f +4041680b195b33b3 +40ec9db2ddbb1806 +40e1573b81ec51fc +40394080ab8fe5ec +40727a99324dee3f +408c8ccb5e4deecd +403fb9e3d4138e62 +40c305c6ea6d02b4 +407c6f865f99c732 +3fffe6c941576bc6 +40624cdaff4e5aad +4015ebddbe24399f +4006d8985e8a92c4 +40c076c207de5c03 +4006a17fcf93356c +40147203991b0ebd +40712797364c5c5c +40271444bf552374 +40a488e4c4de3973 +40bf1a3ceb3ef762 +3ff50128a68ff1b7 +40130f3cb5a3d4c9 +40ad56890f8e1b77 +3ffa3c2043b9ff12 +408ea679d8cb962a +40f31501539f0c11 +401a2f6ab36e578f +40c79079cc7786ef +40ad5ee4b7a0fe91 +40e191c0e7266b36 +402053b3e6af629b +3ffe191e632228ec +40a47a0086598045 +40a9ba6625eb36f8 +4093a20975953bf9 +40fff4680978975a +400a4492a5fb6fba +3ffb48d75e4829a7 +40ac3e4e2c3d5cc1 +402c52fed125af16 +3ff0b2da4d90251a +401b7de11a48ee02 +40571429c5ed7b00 +40dde5e648153399 +40b67f74369367a0 +40c34741664926c0 +40a2b32a599393b6 +40fe99e15ef47c64 +3ff3ed3f4feee10f +40aabe326c46a23b +40b25bfce54414e0 +3ff058a7418aaf0b +40b56c29f4272303 +407b46f8b6341355 +40c090ac7ad3ad60 +40eebfd395d97750 +40cf7c4660ea3e67 +40dc828d741d8637 +40d0b8a9f55d9e36 +40199c087680e2db +40fb710ee03b2e2c +40117e26ea6ba841 +4084232d772e6b8e +40948609c3d846ba +404463b33e4aba1c +3ff0dd9709234827 +400c1893513b7822 +407f9e95cf78caf2 +40611cd90863db92 +40e3531f58a82321 +408bc678f1f3dc16 +4017dd6440edc363 +405045c222704a3f +40a3bd6118a4fd52 +40bd0b3eb84a64d7 +40340d7383833f85 +40a69a81ac5a3037 +406cb87ca745f476 +402e203fcbb30f7e +4002733e3bdadde5 +40d4f06729c4f1e3 +409f62d5e08c414c +3ff70b97c37dbfe2 +4066b18067daffd3 +40d736c0f12ab641 +404808cc723afefc +40ace9421d94807b +40736651fad423a2 +40d0ae9cb1f7ac41 +40321182820d99c5 +40ac5b6e9f0383dd +404a315f32d5bc33 +40fbd29627632110 +40ce1a7b8e9247aa +40e748ed8cd46646 +40440ea1123e362f +407000f1ec880654 +3ff8f6ebc2085feb +40c77e0169d4860d +40d0ffe3d499155a +408928ed29feb640 +40ffd03bc167d1ff +40bc3cbe3e732881 +3ffdaada9ff0bcf1 +4041a3515a9b239b +3ff731ec0252e9b6 +3ff9b428d0965ce2 +40a7772101a3f367 +40a0ad9df951c494 +40a4ce5e749e3b13 +40273e656311aa02 +40744bdaadec44cf +40bdd4df753723c4 +404cb1d259702403 +40078384adbc33b6 +4034e1c260cb74fa +404fb1b8686532ac +403541bab506be6e +40b4b09e6a6a7ecd +7ff0000000000000 +3ff0000000589d0f +3ff0000000000000 +7ff0000000000000 +3ff1ed7196ad51b8 +3ff0000000000005 +7ff0000000000000 +3ff000002ca194ce +7ff0000000000000 +4090df34d852edb8 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0031d3490e9b9 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff000001539d325 +3ff0000000000000 +3ff00000000001df +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +5cc6cfea06e3992e +7ff0000000000000 +420446e71b9e487f +3ff0000000000000 +416481c52a561f6f +7ff0000000000000 +4173597364fcf04d +7ff0000000000000 +3ff00000000001d7 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000084 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000135 +3ff000000000066f +3ff0000000000000 +7ff0000000000000 +40a1e97f2e3906ac +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +41aafff884110d58 +3ff0000000000000 +40207e0a34fe1513 +3ff0000000000000 +3ff0000000000000 +3ff002374bfc3908 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff039681499ac87 +7ff0000000000000 +3ff00000570c415f +7ff0000000000000 +7ff0000000000000 +5390419352aad052 +3ff0000000000000 +3ff0000000000000 +3ff000022ae327b7 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff000000028a2fb +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +49850ba0c3277b70 +3ff0000000002e5a +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff003d5e0d75035 +3ff0000000000000 +3ff0000000000000 +3ff011e7330c839d +3ff000000001baf6 +7ff0000000000000 +3ff000069b2d2b45 +3ff0142ec43f613f +3ff0000000000000 +3ff0000002b472bc +7ff0000000000000 +7ff0000000000000 +4cf0677dadc0b49f +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +4016781a763d010d +7ff0000000000000 +3ff0000000000000 +3ff0000000010f99 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff013c895e94c2c +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00000000009fe +63c2c1d557c50a80 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff05d1172e59997 +3ff2993e20caab39 +7ff0000000000000 +403d95c4cebd07d1 +7ff0000000000000 +3ff0000000000001 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +4941307b337b8efe +7ff0000000000000 +3ff0000000004910 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +55b04c14d7978ed8 +7ff0000000000000 +7ff0000000000000 +3ff00000081f3cb2 +7ff0000000000000 +3ff0000000016723 +3ff000000378c9f6 +7ff0000000000000 +3ff0000000018bb6 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff000005dced576 +3ff0000000000000 +3ff000002c28bb5e +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00000653c129a +3ff0000000000003 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000008c53 +41a065d6237be407 +3ff1a3e195d7478d +3ff00041e817ce4a +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff00000251a31c7 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000004 +3ff0000000000000 +3ff12dcbeec80466 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff000000011ac02 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0057c23e290f3 +3ff0375f56bacab8 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00160b3b86386 +7ff0000000000000 +3ff0000000000000 +3ff000000000ec08 +7ff0000000000000 +3ff0000000016230 +3ff0000000000000 +403549e1f555d120 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff008db7d80c63b +3ff0029c6f4ac4fb +7ff0000000000000 +7ff0000000000000 +3ff0000000068f72 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00000002e3385 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00000000002f5 +3ff0000004d12e93 +3ff0000000000203 +59b3e5ea0f0e393e +3ff0000000000000 +7ff0000000000000 +3ff00000000002eb +7ff0000000000000 +3ff00051fcfdd4a0 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +6ccf743b7e8f4b64 +3ff0000000000000 +7ff0000000000000 +56abd7e06f25ed63 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00000000cd2d8 +3ff0000000000002 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff000285bfb88e4 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff000000000011f +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000002b2c +7ff0000000000000 +3ff0000000000054 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000034 +3ff0000000000000 +7ff0000000000000 +45a8255b48e0dd1c +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0004afe193123 +3ff000009626bec3 +3ff000000000000a +3ff309b2eec3c47a +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff00024f8e84185 +7ff0000000000000 +3ff0000000000000 +4497fc5eead580ca +3ff000000010c707 +3ff0000000000000 +3ff000000000076f +4003803e22fc3cff +7ff0000000000000 +7ff0000000000000 +3ff000000000048f +3ff0000000000000 +7e8efcbf44d5bbc6 +3ff000000000dcba +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +5a1a5e6df2ee6cb4 +3ff00045f1dca660 +3ff00000001f9e33 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000048 +3ff000000001e22e +3ff0000000000000 +3ff81ecafd885dd2 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff000034d972804 +7ff0000000000000 +3ff000005153ed57 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000052aff +3ff045359a753efe +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000010952a4a +7ff0000000000000 +7ff0000000000000 +3ff03d830e9dffe0 +7ff0000000000000 +40022143574e66d7 +7ff0000000000000 +3ff029cb011b2ea5 +3ff0000000000000 +7ff0000000000000 +3ff0008fb7caf91e +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +400042a489a9bca4 +7ff0000000000000 +7ff0000000000000 +3ff000000000b64e +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +40a383b7f0f196a4 +3ff0000006ac7f0e +3ff0000001b5d2f5 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000006 +7ff0000000000000 +3ff0000000000000 +3ff0000fb23b8463 +3ff00007f9afa028 +3ff000000004efb3 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff000000000012d +3ff0000000000000 +3ff0000000000000 +3ff000006c7282ea +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00000003d7ba1 +7ff0000000000000 +7ff0000000000000 +53393d5fccad13ec +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +43a3caedad8a253a +3ff0000000000000 +3ff00000001002fd +3ff0000000000000 +7ff0000000000000 +3ff0002303a99697 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00510fb72a107 +7ff0000000000000 +7ff0000000000000 +3ff000000fed4059 +3ff0000000000000 +7ff0000000000000 +41e2ffd6c6f1cb9b +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0056ff377bc09 +3ff000003004977d +7ff0000000000000 +7ff0000000000000 +3ff000000000aeaf +7ff0000000000000 +66ccc437fc739a42 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff27536cb23259f +3ff0000000000004 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff1ecbf905270f9 +7ff0000000000000 +3ff0026a24ae6c8f +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000079 +6ff1d3176f7121de +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +48019de7975c7221 +3ff0000066dce8c4 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff00e4277561629 +3ff0000000000000 +3ff0000000000000 +3ff000fb049b2839 +7ff0000000000000 +3ff0000028fb68ed +7ff0000000000000 +3ff077021ffe9caa +3ff0000000093a5f +3ff0000000000000 +7ff0000000000000 +3ff000127c1db6bc +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000006dfb817 +7ff0000000000000 +3ff00000097443a4 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff00000014600d3 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00000000002bf +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +4a284ccce522a366 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +5079aee365631efd +3ff0000000000000 +3ff000000a1ee23c +3ff0000000000000 +7ff0000000000000 +3ff00d9b34bd85aa +3ff000000000000a +7ff0000000000000 +4010e27945a2bf47 +7ff0000000000000 +3ff00000000ed6b0 +4944f0d8c6544978 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff000002582e207 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ffd30ce8dac97f9 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00000000084d2 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +417d54132dece628 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff00000004550d8 +3ff00000004f0c2b +3ff0000000000000 +7ff0000000000000 +4022ad8bf82a2e25 +3ff1c2a88bcd0bde +3ff0000000000000 +7ff0000000000000 +3ff00017de911477 +3ff16a9d108034b8 +410485bbd56879bd +3ff0000000000000 +3ff0009c49206690 +3ff00001851671f9 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +4fa092d92f16d08f +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff005f34f384308 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff01006f82893b3 +3ff000000000890f +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff000000002758b +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff14838253b6366 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3fffe303b0c12643 +3ff0000000000000 +3ff00000004bffa6 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000008fab807 +3ff0000000000000 +401754c015bb4da9 +3ff000c2cd6fb23a +7ff0000000000000 +40635747fd60eb45 +7ff0000000000000 +7ff0000000000000 +3ff000000000449d +3ff0000000000000 +3ff0000000000000 +7135588119505762 +7ff0000000000000 +7ff0000000000000 +419b8e01e338f28b +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff000000000002b +3ff0000000000000 +793c086e93af65d1 +3ff00000000002ae +3ff000b358827bdc +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff000000008e6ad +7ff0000000000000 +7ff0000000000000 +3ff000000829c144 +3ff0000000000000 +3ff0000000000000 +3ff0000000000001 +3ff0000000000000 +3ff000f123aa1b1c +3ff0000000000068 +3ff0000000000013 +7ff0000000000000 +3ff0000000000000 +45590359de4785cb +3ff0000000000000 +3ff0000000000000 +3ff0000115c50836 +4664a318d81e4a2a +3ff0000000004255 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000015bd7653 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000da5e39 +3ff0000000000000 +3ff0000000000000 +3ff0000000016144 +7ff0000000000000 +401814504c125487 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000c53 +7ff0000000000000 +3ff0000000000000 +71b175d00dd5384d +7ff0000000000000 +7e74e66b49e74031 +3ff0000000780232 +40295f84f7798f65 +3ff4aabdaac7c40a +7ff0000000000000 +7ff0000000000000 +3ff0000000000001 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff00011db0c69f4 +3ff0003cd894675a +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000002 +3ff0000000000000 +7ff0000000000000 +416f2df7e3c7df52 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +@tanh 2218 607f2d8fa1ab934a +0000000000000000 +8000000000000000 +bfefe175fa292810 +bfefe060cb36ce99 +bfefdf41cd7f3aa0 +bfefde18a8888399 +bfefdce500c15048 +bfefdba67765ab35 +bfefda5caa62f150 +bfefd907343ad3e5 +bfefd7a5abe566b7 +bfefd637a4b23308 +bfefd4bcae28482a +bfefd33453e541f9 +bfefd19e1d7b3d98 +bfefcff98e4db47d +bfefce46256d35d3 +bfefcc835d71f5fd +bfefcab0ac552bec +bfefc8cd834933d4 +bfefc6d94e906ea2 +bfefc4d37552d58e +bfefc2bb597238dd +bfefc090575d20f7 +bfefbe51c5e048bf +bfefbbfef5f6a80c +bfefb99732980519 +bfefb719c086039c +bfefb485de17a846 +bfefb1dac3034754 +bfefaf17a026d4d1 +bfefac3b9f4e8d42 +bfefa945e2f9ed74 +bfefa635861ef02a +bfefa3099beb888f +bfef9fc12f855068 +bfef9c5b43c76133 +bfef98d6d2fe4f78 +bfef9532cea23fe9 +bfef916e1f0f0e2f +bfef8d87a33a7d74 +bfef897e30686b4c +bfef855091dcfddd +bfef80fd888cc6c5 +bfef7c83cacad4aa +bfef77e203f4ae17 +bfef7316d41c30e4 +bfef6e20cfaf5241 +bfef68fe7f1dbc3d +bfef63ae5e7c46a0 +bfef5e2edd2649f9 +bfef587e5d5ccce3 +bfef529b33e38cbd +bfef4c83a79be470 +bfef4635f11d9571 +bfef3fb03a4d78a4 +bfef38f09df21eb1 +bfef31f527466931 +bfef2abbd18a2832 +bfef23428790c9ce +bfef1b87234e2c04 +bfef13876d61a39b +bfef0b411c9f4d9f +bfef02b1d597c426 +bfeef9d72a1e5230 +bfeef0ae98cdc603 +bfeee7358c8c050f +bfeedd695c0c8872 +bfeed3474951ed6c +bfeec8cc812ec98e +bfeebdf61ac5f769 +bfeeb2c1170a956e +bfeea72a603ff658 +bfee9b2ec979c815 +bfee8ecb0e1cbc61 +bfee81fbd16004a0 +bfee74bd9dcff979 +bfee670ce4d24dc5 +bfee58e5fe2c3405 +bfee4a45278ae5a4 +bfee3b26840f0362 +bfee2b861bdb4f4d +bfee1b5fdba749a0 +bfee0aaf9456437f +bfedf970fa938474 +bfede79fa67429e0 +bfedd537131f7250 +bfedc2329e7e31b5 +bfedae8d88f236f8 +bfed9a42f516770d +bfed854de788dde3 +bfed6fa946beb1cf +bfed594fdae482ba +bfed423c4dcaab17 +bfed2a692adf75bd +bfed11d0df3808ac +bfecf86db9a941ec +bfecde39eaf1c0d4 +bfecc32f85f662c5 +bfeca74880128758 +bfec8a7eb17d7c2c +bfec6ccbd5c67c98 +bfec4e298c68bcf6 +bfec2e91597903c7 +bfec0dfca66e5d04 +bfebec64c3077cb4 +bfebc9c2e64e6d91 +bfeba6102fbc2ee2 +bfeb8145a87de979 +bfeb5b5c44dd66a8 +bfeb344ce5ce7525 +bfeb0c105aa2e651 +bfeae29f62e6cae5 +bfeab7f2b0668f2e +bfea8c02e9608db6 +bfea5ec8aae3a23b +bfea303c8b5c366f +bfea00571d512db6 +bfe9cf10f251fc7b +bfe99c629e171af8 +bfe96844b9d5e16f +bfe932afe7c8b555 +bfe8fb9cd6ec42da +bfe8c30446f24cec +bfe888df0c6a6687 +bfe84d261520ab46 +bfe80fd26cb249c6 +bfe7d0dd41576968 +bfe7903fe8e1a531 +bfe74df3e5ee001a +bfe709f2ed48dac4 +bfe6c436eb8210de +bfe67cba0aaefc8c +bfe63376b857b09b +bfe5e867ab8c47da +bfe59b87eb1eb08a +bfe54cd2d3fcdf65 +bfe4fc441fa6d6d6 +bfe4a9d7eabb6d97 +bfe4558abb963c7d +bfe3ff5988f89784 +bfe3a741c0b6f28d +bfe34d414e6390b1 +bfe2f156a1eede4a +bfe29380b6355bf1 +bfe233bf17728c9d +bfe1d211e98fed20 +bfe16e79ee469880 +bfe108f88b09e573 +bfe0a18fceb0fec3 +bfe0384276d53d34 +bfdf9a27e9b5bcac +bfdec010e53336da +bfdde249ad353dbd +bfdd00dd8fc2cf1e +bfdc1bd9626aa2d7 +bfdb334b87c374b6 +bfda4743f3c6273f +bfd957d42eef4595 +bfd8650f581684c1 +bfd76f0a24ec3418 +bfd675dae10e1094 +bfd579996ba6a682 +bfd47a5f338c56d6 +bfd3784731d72e36 +bfd2736de2e7018c +bfd16bf13dd5b0c1 +bfd061f0aa540191 +bfceab19e9e464ef +bfcc8dd083b0587e +bfca6c4bfbe81f43 +bfc846d59d517a52 +bfc61db90011afca +bfc3f143e35b3fdd +bfc1c1c604779ea7 +bfbf1f21e6ad6c30 +bfbab5efc9a64582 +bfb6489f05bdfe37 +bfb1d7db75a32827 +bfaac8a628496d6c +bfa1dd6b25857040 +bf91decfb7fffb8c +0000000000000000 +3f91decfb7fffb8c +3fa1dd6b25857040 +3faac8a628496d6c +3fb1d7db75a32827 +3fb6489f05bdfe37 +3fbab5efc9a64582 +3fbf1f21e6ad6c30 +3fc1c1c604779ea7 +3fc3f143e35b3fdd +3fc61db90011afca +3fc846d59d517a52 +3fca6c4bfbe81f43 +3fcc8dd083b0587e +3fceab19e9e464ef +3fd061f0aa540191 +3fd16bf13dd5b0c1 +3fd2736de2e7018c +3fd3784731d72e36 +3fd47a5f338c56d6 +3fd579996ba6a682 +3fd675dae10e1094 +3fd76f0a24ec3418 +3fd8650f581684c1 +3fd957d42eef4595 +3fda4743f3c6273f +3fdb334b87c374b6 +3fdc1bd9626aa2d7 +3fdd00dd8fc2cf1e +3fdde249ad353dbd +3fdec010e53336da +3fdf9a27e9b5bcac +3fe0384276d53d34 +3fe0a18fceb0fec3 +3fe108f88b09e573 +3fe16e79ee469880 +3fe1d211e98fed20 +3fe233bf17728c9d +3fe29380b6355bf1 +3fe2f156a1eede4a +3fe34d414e6390b1 +3fe3a741c0b6f28d +3fe3ff5988f89784 +3fe4558abb963c7d +3fe4a9d7eabb6d97 +3fe4fc441fa6d6d6 +3fe54cd2d3fcdf65 +3fe59b87eb1eb08a +3fe5e867ab8c47da +3fe63376b857b09b +3fe67cba0aaefc8c +3fe6c436eb8210de +3fe709f2ed48dac4 +3fe74df3e5ee001a +3fe7903fe8e1a531 +3fe7d0dd41576968 +3fe80fd26cb249c6 +3fe84d261520ab46 +3fe888df0c6a6687 +3fe8c30446f24cec +3fe8fb9cd6ec42da +3fe932afe7c8b555 +3fe96844b9d5e16f +3fe99c629e171af8 +3fe9cf10f251fc7b +3fea00571d512db6 +3fea303c8b5c366f +3fea5ec8aae3a23b +3fea8c02e9608db6 +3feab7f2b0668f2e +3feae29f62e6cae5 +3feb0c105aa2e651 +3feb344ce5ce7525 +3feb5b5c44dd66a8 +3feb8145a87de979 +3feba6102fbc2ee2 +3febc9c2e64e6d91 +3febec64c3077cb4 +3fec0dfca66e5d04 +3fec2e91597903c7 +3fec4e298c68bcf6 +3fec6ccbd5c67c98 +3fec8a7eb17d7c2c +3feca74880128758 +3fecc32f85f662c5 +3fecde39eaf1c0d4 +3fecf86db9a941ec +3fed11d0df3808ac +3fed2a692adf75bd +3fed423c4dcaab17 +3fed594fdae482ba +3fed6fa946beb1cf +3fed854de788dde3 +3fed9a42f516770d +3fedae8d88f236f8 +3fedc2329e7e31b5 +3fedd537131f7250 +3fede79fa67429e0 +3fedf970fa938474 +3fee0aaf9456437f +3fee1b5fdba749a0 +3fee2b861bdb4f4d +3fee3b26840f0362 +3fee4a45278ae5a4 +3fee58e5fe2c3405 +3fee670ce4d24dc5 +3fee74bd9dcff979 +3fee81fbd16004a0 +3fee8ecb0e1cbc61 +3fee9b2ec979c815 +3feea72a603ff658 +3feeb2c1170a956e +3feebdf61ac5f769 +3feec8cc812ec98e +3feed3474951ed6c +3feedd695c0c8872 +3feee7358c8c050f +3feef0ae98cdc603 +3feef9d72a1e5230 +3fef02b1d597c426 +3fef0b411c9f4d9f +3fef13876d61a39b +3fef1b87234e2c04 +3fef23428790c9ce +3fef2abbd18a2832 +3fef31f527466931 +3fef38f09df21eb1 +3fef3fb03a4d78a4 +3fef4635f11d9571 +3fef4c83a79be470 +3fef529b33e38cbd +3fef587e5d5ccce3 +3fef5e2edd2649f9 +3fef63ae5e7c46a0 +3fef68fe7f1dbc3d +3fef6e20cfaf5241 +3fef7316d41c30e4 +3fef77e203f4ae17 +3fef7c83cacad4aa +3fef80fd888cc6c5 +3fef855091dcfddd +3fef897e30686b4c +3fef8d87a33a7d74 +3fef916e1f0f0e2f +3fef9532cea23fe9 +3fef98d6d2fe4f78 +3fef9c5b43c76133 +3fef9fc12f855068 +3fefa3099beb888f +3fefa635861ef02a +3fefa945e2f9ed74 +3fefac3b9f4e8d42 +3fefaf17a026d4d1 +3fefb1dac3034754 +3fefb485de17a846 +3fefb719c086039c +3fefb99732980519 +3fefbbfef5f6a80c +3fefbe51c5e048bf +3fefc090575d20f7 +3fefc2bb597238dd +3fefc4d37552d58e +3fefc6d94e906ea2 +3fefc8cd834933d4 +3fefcab0ac552bec +3fefcc835d71f5fd +3fefce46256d35d3 +3fefcff98e4db47d +3fefd19e1d7b3d98 +3fefd33453e541f9 +3fefd4bcae28482a +3fefd637a4b23308 +3fefd7a5abe566b7 +3fefd907343ad3e5 +3fefda5caa62f150 +3fefdba67765ab35 +3fefdce500c15048 +3fefde18a8888399 +3fefdf41cd7f3aa0 +3fefe060cb36ce99 +3fefe175fa292810 +3fefe175b46d6080 +bfefe175b46d6080 +3fefe175f33001a8 +bfefe175f33001a8 +3fefe175fa292810 +bfefe175fa292810 +3f81df28e70bea56 +bf81df28e70bea56 +3f9acd58ac49f8d7 +bf9acd58ac49f8d7 +3faac8a628496d6c +bfaac8a628496d6c +3fbab5efc9a64582 +bfbab5efc9a64582 +3fd579996ba6a682 +bfd579996ba6a682 +3fe4fc441fa6d6d6 +bfe4fc441fa6d6d6 +3fa9004ac286dc74 +bfa9004ac286dc74 +3fd3784731d72e36 +bfd3784731d72e36 +3fd643a57dcbb8d6 +bfd643a57dcbb8d6 +3fe3ff5988f89784 +bfe3ff5988f89784 +3fe63376b857b09b +bfe63376b857b09b +3feae29f62e6cae5 +bfeae29f62e6cae5 +3feb4be033135d9a +bfeb4be033135d9a +3feba6102fbc2ee2 +bfeba6102fbc2ee2 +3fed5709909a9fab +bfed5709909a9fab +3fed594a0a972e3d +bfed594a0a972e3d +3fed594fdae482ba +bfed594fdae482ba +3d719799812dea11 +bd719799812dea11 +3fef1ea6f79a35bf +bfef1ea6f79a35bf +3fe2808153eefe53 +bfe2808153eefe53 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +0000000000000001 +8000000000000001 +0010000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fd12d06b77e7546 +bfe5897b9c69a892 +bfefffffd0f9037f +3fe54f7056d1e63b +3fefeb199ad67f06 +bfeffffffffb7946 +3fece9063995d28d +3fefb0038c145e76 +bfeffffffffbfe06 +3fefcbb2c2cbb9b9 +bfef8699a165ff10 +3fefff294afa97b8 +3fef857ad5b5bec9 +3fefffe7d9830cab +bfeffffff7e5856f +3fefffff02ab9717 +bfefae7c1737e009 +bfeffffe7442c4dc +3fefffffe63ad1d6 +3fefffffa71eff90 +bfefffff9856d3c3 +bfefffff6c371628 +bfefffffe0137201 +bfecd92ca9e26dd2 +bfefffffffe0bcfd +bfeffffffe8a4c0d +3fefffffff7d1a57 +bfeffffffc72b651 +bfeffffffeb1c2e5 +3feffffff0667f1d +3feefddb6bb1fb04 +bfeffffd25cef48f +3feffba369f9d081 +bfefffffffed169a +bfeffffe9b3de6e2 +bfeffffff8fe3d12 +3fefffffff991bbe +3feffffffb267bf7 +bfefffffff938b55 +3feffffffdd3f3f3 +3feec5f34c045517 +bfeffffffee4cd69 +bfeffffced17ef88 +3feffd5d53820c10 +3fefffffc7bad261 +bfefffffffe66b86 +3feffffef8179a2c +bfefffeffe2d5ad7 +bfeffffff13f46fe +3feffc74bd1cfa5a +bfefffffe924ecb5 +bfefff9d27a3fe1d +bfefffce48ceb568 +3feffe55b8c1e18c +3feffb5b14d3e563 +3feef1e1ba8b9741 +3fefffffe4fc6e01 +3fefff10720d2960 +3feffffffeed6452 +bfeff9927d6b2e1e +3fefffb957f430a1 +bfefffffff9fc91d +3f795626728d9cf8 +bfeffffffff988bd +bfeffffffffc907e +3fef5017cdcc17df +3fefde2d9d178296 +bfeffffffb16a825 +bfefffffffe627e2 +3feffffffffadff1 +3fe7092797b33793 +3fefffffffd7aef6 +3fefffffffaf3008 +bfefffffff58b677 +bfc055853493028c +bfefff1112a9e354 +3fefffffff3a11d9 +3fefffff8f7c5908 +bfeffffff8f4c7a3 +bfeff54a5121f23b +bfefffff2d045795 +bfeffffffff9cb1f +3fef723bf464139d +3feffffe1baec67f +3feff36e3b9d7587 +bfeffff917344124 +bfef9be367346a19 +3feffff6bbebe996 +bfeffffff4d2e44a +3fefff9e9fed5dbc +bfefffffffbb948e +3fefff4b69d2b608 +bfeffffffff4a743 +bfeffc7be018da20 +3fe63efa0b475dd7 +bfefffff5be92e33 +3feffffffadab0c7 +3fdde342095a34da +3feffd4d96a2d3ab +bfeffffffff291e9 +bfeff504bfb0444c +3feffffffc15a135 +3feff9dd3687a48e +bfefe80d7248c21b +3fef67775c03191b +3fecdba1e2fb4d9a +3feffffffe80912d +bfefece7cc505e9d +3fef8391b87a7a51 +3feffffffe86a64d +3fefe761374f53bd +3fefffffff91f5bd +bfee0ef41e763fd8 +3feffffffed6fa17 +3fefffffa4be0b28 +3fe19c2b2d5ba2a4 +bfefffe96345378c +3fefffff04cf3785 +bfeffffb08cb6d3d +bfeaea5f1e83fffb +3feffff895ce9872 +3feffeb9107f9a49 +bfdc81a7a7540710 +bfefffffff3d78b7 +3fefeb52fe5c5f74 +3feffffebb92a3aa +bfe46d657bb7590d +3fee7fc9dfd7ae6b +bfee572157ed1ec7 +3fefffc6c7193a81 +3feffd08b73bca98 +bfeffffff50e7477 +bfeff72cd33c839f +bfefcd35bd6b3595 +bfefffffff5a209f +3feae1d8cf0b1c5a +bfeffffffa4b0e44 +3fefffffdb81f530 +bfefffff8b22b0f7 +3fefffff4f28ff72 +bfed9e1f4f60bbe6 +3feffffffff2c7c6 +bfeff3860a04f6eb +3feffffffc399b06 +bfeffffaa770e299 +3fefffffffe41db3 +3feffffffeb3169c +bfefff43d9cf68f4 +bfefff2409a452b5 +bfefffffffe4e4bc +3feffffffff382f8 +bfefffffffe72995 +3feffd1d326baba2 +bfed27f2b1e2c661 +bfd14a3ed7fbcaac +bfe916859aa35ba2 +bfef9c7a880df8e4 +bfef2a4afd5f3b68 +bfefbc05afd05835 +bfeffff4f1e2870f +3fecbc779408ca64 +bfca4a85f40fd9d6 +bfefff5ac20538e1 +bfefffee4dfc64f5 +bfef9af467e771d0 +bfd709559c47ad6d +3feffffffff26f4f +3fefffffffedc1ac +3feffff0f8797997 +3fdbbb03d284f0fd +3fefffffffed2cf9 +3fefd39f8f687a0a +bfeffffec454b0fc +3fd85bb600166567 +bfeffffffffca5d4 +3fef242afe33b9c0 +3fefd7b5a0dd073f +3feffe0434fb2762 +3feffffbfb4ad66a +bfeb851bd069ab91 +bfeffffffd69e144 +bfeffc5bfe5dc1ea +bfeffffffb28bae2 +bfeffff5d38ffd32 +3fef5db00a07e662 +bfeffffff772199f +3fef3357eb6dc36f +3fefffffcc0f05fe +3feffffffea432a1 +bfeffffffff0dddc +3fefffffffc93a26 +bfeffffffffc19dc +bfefffde8a39e898 +3feff72643ae3814 +bfefffffeb8b7911 +3feffff97c8e1724 +3fefffffbc4ba36a +3fe3ced23036f593 +3feffffff7949652 +3feffff01ec707af +bfeffffe6376d67f +3feff98ef593f2ab +3fefffffff8ab203 +3feffffff6dc12e9 +bfd5b7cd11d631c4 +bfefffffff2e296f +bfefff91e1123ca4 +bfe8c05500d959fd +3feffeebe7dbd1b7 +3feffffe318c51fc +3feffffffb3ab9a6 +3fefffffffec4db3 +bfeffdc610ec5b3d +bfefffffff32343d +3feffff6965d2915 +3feffffe67fba2be +bfeffffffff6ffca +3fef5d7cca0646b9 +3fefff5a68eff8c8 +bfe8786eb64d0356 +bfeffffb2e87d271 +3feffff5c10918be +3fefffffef67839e +bfeffffff6e068a4 +bfefffffddd3d092 +3fefffffff9ea658 +3fdafad35bb22010 +3feffffffbecf998 +bfeffff527ddab0c +3fefd7090e1fd1c6 +3fefffea82f20f02 +bfe40848b725bda0 +3fefffff5f77fee4 +bfeffff40c635e1d +bfeffffff83590db +bfeffffffe7e0a5a +3fef1b70316d4cac +3fefffee497e76d9 +3feff323cc412ab6 +3feffffffb460cf0 +bfefffeac9d8212c +3fefff8e39cfcc83 +bfeffffff250494f +3feffffffefba776 +bfefc1726aecfb28 +bfefffec3613358e +3fefffff71e22ebc +bfefe137366fe2c6 +bfed33a735a7cd88 +3feffffffe032d0d +3feffcc296a8ac6b +bfefffa5f344e625 +3feffffffed93d56 +3fedb4c61988273e +3fefff7a7bfe9cca +bfefe13c2d97f7b9 +bfeffffc12359a97 +3fefe0fa3741960d +bfe3423973bb4f09 +bfefffff586361f3 +bfefffffff5b5963 +bfefffaff1126584 +bfeffe4825f3cb53 +bfeffffd6e99ce37 +3fefffffbb250ed6 +3feffffffdedc9bb +3fefc135b2547b13 +3fefffffe77ad8d5 +3fefd5e2b00cf34f +3fefffffd127a1da +bfefffffffdfb362 +bfefff8ee8ac3d18 +3feffff469460029 +bfefff1bc66b15ef +bfefffffff5e399f +bfefffffff6f3734 +bfeffffef4e395ce +bfefffffb39edefb +bfdfdc1e7de2dca0 +3feffffe79e73f45 +3feffffd8bfddd4f +bfefffff5092670d +3feffffffff24a95 +3feffe8975326c28 +bfeffff6285c2fcc +bfeffffff2226539 +3fefffffff7f5a0f +bfeffffee4dc5745 +3feffffffc44f2da +bfed28ea24e9c45d +bfeffffff94105d3 +bfefd05ca093a48e +bfef20cc7e481053 +bfefbd2d4c4f2dc0 +3feffd6d5ceb4006 +3feffffff95c9fa1 +bfefffffffd5b984 +3feffffe3fec6f87 +bfefffa1b83c9dec +3fed4ac364eaf337 +3feffffffef0693a +3fefffffff3086a8 +bfeffffe972a610e +3fe9b3319887a382 +bfef79ee6f4d93a5 +3fefffffff26a76e +bfefffb9f303be88 +3fefffffe1ea0c29 +bfefffffffe7d6e7 +3fe8b05efa922a6a +3fefffffff2e08b5 +bfeecfe6153097df +bfefffffb562b305 +3fefffcfcebc5a3a +3fefffbd516d6d73 +bfef55a713d46a0a +3fefffea8f5bbf96 +3feffffffff462b6 +bfeffffffec1f32d +bfefffddd02bd1a1 +bfefffd228fb5e69 +3feff8f620a8d659 +bfefffff397e021f +bfeffa05eb1bb292 +bfefffffffd161ce +bfeffead7da9b553 +bfefffffffb361d1 +3fefffa69b17e2f3 +3feff62cb70ab3d6 +3feffffff3ae4b9d +bfeffffffff07d63 +3fefc1a8a60580b4 +3fefda6d1acad8f2 +bfeffffffffa12be +3fefffffff8a554b +3feb21e752932552 +3fefd7765b753f1a +3fefbfe1bd5e51be +bfefffffffcfa447 +bfefc51ca42d7c26 +3feffffe6e3ef0ab +3feffff2272a4658 +bfeffff957c2d8f2 +3feffffff10e29a8 +3fefffffec38917e +bfeffff9c85695fd +3feffffffcbd18d8 +3feffffedfcd47a2 +3fefffffff38c1e3 +3fefffea310ce28b +bfef4443bc513e3d +bfefffff1b586800 +3fefffeb32442291 +bfb00e9c76ed3f16 +3feffffe4c6be614 +bfefeacf1f90f79a +3fefffff5d6b684a +bfeffa015105f9ac +3feffffffff8d4d9 +bfefffffcf1a2710 +bfefffdfd4254dfc +bfefffe6e91d7db1 +bfefffffffe47140 +3feffc72701dbc6c +3fefa618cf112155 +bfefffffff50b10c +3feffffd3ac57a64 +bfeffffff7e1b8ab +3feffa8d43e49810 +3feffe4ec1419d21 +bfeffad8041d4a92 +bfeffffffff2758b +bfefea66a30d5f7b +bfef184fc865559f +3feffbfc6461c613 +3feffffffc51799d +bfeab630622fbe76 +bfe9b48fd6a39d97 +3fefffff4eb9eba9 +bfefffeae252c42e +bfefffe0c0bd00fb +3feffffff9787a4a +3fdbd33cc0437552 +3fe762c9230e241d +3feffe473ad0915f +3feffffc64671e7c +bfbd6d9c7ff37f2c +3fefffc1d475da0d +bfeffffffd5816b6 +bfeff232d7b93404 +3fe29a4aadb65666 +3feffffffc7037b6 +bfefeb541fa270fe +bfefffffffeca302 +bfe8905a4da7e82c +bfefffb2074fffc3 +3feb848940a7ab95 +3fefffeea842432d +3fefffffffee2cbc +bfeffffff67957f6 +3fe87ac51bf021e4 +bfee8d9f4abe3a92 +3feffffffe50ad24 +3feffffffe833f09 +bfefd8201ea40f7d +bfefffffdbfedbeb +bfefffffffe99760 +3fefe9cd6d28de8c +bfeeeb48b5428ea1 +3feffffffffa00cd +3feffffffd7978b9 +3fefffffffbe035f +3fd5846e297249d3 +bfed393595b273a7 +bfe3b5cb4c4c404d +bfefffffffec3580 +3fe2f874d9817c19 +3feffffaba541eb2 +3fefc96a396ddb63 +bfefa262963b34e0 +3fefffedfc5f5720 +3fefffe8dc287a16 +3fefffffff9d0535 +bfefffffff04c04d +3fefffffb1f102b1 +bfeffffffeda871a +bfeffffcda56c418 +3fefffc59f978ca9 +bfefeee7dad039cd +bfeffface7eb5dc4 +bfe72fc14e82d755 +3fefffff5518f262 +bfefffff4916cefe +bfeffffff6ec563b +3fefffee91ffbbd5 +3feffffff9698e01 +bfeffffffd946d53 +3feff8333fb0bfe2 +bfe2fe8182cbdd41 +3feffffffffc61eb +3feffff834ca1689 +bfeffa553257f6d7 +3fefe77c44978f3c +3fefffe90419cc77 +bfeffffff38974db +bfeffffd93878dca +bfeffffffff3c3ed +bfeffffffd0d80f5 +bfefffffffd83eea +bfeff774c723a379 +3feffff4d0628582 +bfefffffea46e239 +bfeffffffff9dc25 +3fe51cd4d36390a0 +bfed32f50d0a177a +bfefffffffe13fa1 +3feffffc3552db47 +bfefe4898c5db04b +bfefffffcb173d22 +bfefffffffd0623b +3feffffafe5ba762 +3fefffffc5ec0a5e +bfee1586839c1b89 +bfed23d4bd3e75da +3fefffffee8ea799 +bfeff6e52fdf8c78 +3feffffd483f51b0 +3feff99ed44454d5 +3feff888962b20cf +3fefffffff19f019 +bfeffad441fef08e +bfeff2aeb56910cb +bfeffffffff9bb90 +bfefffe0351a8e73 +3fefffff19328682 +bfd33e462736bf64 +bfeffffffe81a57c +bfefffffff9b6a2b +bfefffffe658c5dc +3fef6d53dbe2d41a +3feffffffc3dc8fa +bfefe2c19f5d7de0 +3fefdc789f712c6f +3feffff4642909d1 +3fefffffffeabd08 +3fefffffed3474a9 +bfeff7c11eac07e3 +3fefffffffcf7edf +3fefff4f21ae3b09 +bfeffcd215e791f4 +bfef55cb489641bf +bfdc61cfad6f8ac6 +bfeffffd4dd95d46 +3feffffffa902081 +3fefffffd9ce2e71 +bfefffffba3ffd46 +3feffff962382f25 +bfef5648c864d14d +3feffff896d0118a +bfeffffbc371a58a +bfeec2f342374af7 +3fefffffe2e31949 +bfe875a1c589cb7f +bfe2b5b1c5839a4b +bfecac0274fcdb1a +bfeffdf8b8222077 +bfeffffffffafa5e +bfef452b77c25437 +3fefffffd6fe3db7 +3fe991cc26f91f68 +3feffffe8550c823 +3fefffee65a5cb53 +bfeffce264ee8ed3 +bfeffe20b74c1ab2 +bfefffffffcca385 +3fec941f6bfa276e +bfeffffffffc86ff +3feef85aa7f2ef81 +bfefeca8e0419b48 +3fefffffff89c93b +3feffffc61bab7fe +3fef6c6942de23d8 +3fefffffffc43cf0 +3fefffffffba9df1 +3feffffffff4496e +3feffffffffa7b18 +bfefe27364e3b589 +bfefffffc4b0cdc4 +bfeffffffff39167 +bfefffffdfb78a8a +bfec6b149e7c1eeb +bfe1c9249a772cf1 +3feffffb60fc727e +bfeffffffff91f38 +3fed41e3f30a4dc3 +3feffddfe8297f6e +3fe792bf5312ec71 +3fefff50a8eee001 +bfeff77297c1ee48 +3fefffffed6c0c42 +3fedee15a5a9fcf7 +3fefffbd386bb725 +3feffffffe7dcb93 +bfe0ecd2c5a2397d +bfeff903c24f5423 +bfefffffd2a1d3d3 +bfeffc9270113b10 +bfeffffbff723f42 +3feffe51f2f1963f +bfeffff6b39f8b49 +bfefffffbf6c78ff +bfefd19d51ae18c9 +bfdd42b8dd614ec6 +3fefffffff9ea72e +bfbf61d4898ab375 +3fefffffff699ab5 +3fe6b2516ef4f458 +3feffffcce6c617f +3fecc135f8255dfa +3fefffffffeaa28a +3feffffde6a799e7 +3feffffffff4e6e9 +bfeffffffff9da60 +bfeffffffd093e4e +3feffffffff47d90 +3fefff4f483b2dc4 +3feffffffff86d70 +bfeffec27da77af6 +3fefffb11adb3e1b +bfefff4f5b9d3fa3 +bfe9dcd4de6890ce +bfeffff74e2dcd39 +3fefffac267c6bac +bfeffed6c838126d +3feffeca27245aa9 +3fefffffe1646504 +3feffffff69cde3d +3fd5bdf55bf2f151 +3fefffb79f824c98 +3feffffca719b022 +3feffffdb5f33a4f +bfefffff586086ec +bfeffff4b1e0b599 +3fd6b6ebfc23e5b0 +bfef19dfd14584b0 +bfeb35d0cd1b0f08 +3feff56c9f52ab5b +3feee31ef5deedde +bfeffffc6c5289b1 +bfefffffe8d10cd2 +bfefffffd49ec492 +bfefffffff327518 +3feff869c9e4a084 +bfefffffffce3ba9 +3feffff71c4989ab +3feffffdbdd0bc5c +bfefb1067999648b +bfefffff5a2de7f9 +3fefe6eb38dd59d6 +bfefa8c166ff28c7 +bfefff51d87fa153 +bfefffffffe9cd31 +3fefff4066a0b302 +bfefffd8f4dbb919 +3fefffa818552328 +bfeffffffff88f70 +bfeffffff45c570b +3fefffff37ef4750 +bfeffcd9dfb750cb +bfeffffffffba145 +bfefffe3a88052da +3feffffff9183584 +3fefe064b552a9e9 +bfeffffffff727d7 +3fefffffffebd106 +bfefffffeae1b8f1 +bfeed0b9e8f9a22f +bfeffffffff42ee4 +bfefffff7274c659 +bfefffffffe74cd1 +bfefffffff790903 +3feffff2dd7d70c0 +3fefffffc7833a15 +3feffffffea2860e +bfeffda8f4261fa8 +3feffffff8f7fb02 +bfeffffffffbb62a +3fe70649d3a81b3d +3fefffffff7ccefb +bfefff392eb2d722 +bfefffffbf5e89cb +3fee30420fabc02b +3fefffd3af2fb118 +bfee242056a459ad +3feffea9e5599569 +bfef94171f99af74 +3feffffffffad41d +bfeffffff6c2a4ff +3feffffc6098c191 +bfeffffe6335b1d3 +bfed992ad3403db5 +3fefffffff392202 +3fefffffe2cc8daa +bfeffe3e11b48009 +3fefa34d1d51e050 +bfeffff8d0f5dc50 +3feffffffef9587d +3feffffc6177f8d5 +3feffffffed3b4ad +bfeffffffff94e4f +3fefffbf8092c33e +bfeffffffffad450 +3fefffffffeee494 +3fefffdc940213dc +3feffffffffc4f2c +3feffffed5a065cd +3fde69f0b79df7b6 +3feffffffffa4e9a +bfefffe1f81b6076 +bfefc723867da44e +3fefff19ab9c5aa3 +bfeffffee110218a +bf901e31483269ee +bfefffdb627f9b86 +bfefffffffeb961d +bfef564eace78fbe +3feffffffffc1fb6 +3feaa15987aafaac +bfeffffcf6548d05 +bfefbf7db9c33d63 +3fefffa992ed8d89 +bfeffffffffa4438 +bfeffffe8071db1c +bfefffffff7b3d27 +bfe012ac0412c687 +3fefffffdbac874b +bfefffffffe6552e +bfefffffd811e685 +bfe3cc81413e4015 +3feffffffbb62036 +bfe589dd6b7fccd8 +bfefffff2d18dd6f +3fe9504a733e410e +3fefa5a49a96578d +3feffffffffc0414 +3fefff1ae064f8a6 +3feffffffffb57e7 +bfe61504e851d488 +bfeffffff62ae758 +bfeffffffff753b0 +3feffdc610a413e9 +bfefffb4111f54b5 +3feffffffff6ccc0 +bfef65406b38dd24 +bfece034ab6e2062 +bfefffffe78cec9d +3fedfd1c30f71636 +bfefab7d722bc16c +bfefffffd9c1e957 +bfefffffffd62f70 +3fefffff77f227b8 +bfefffffff6710c0 +3feffffff833e87a +3fefffff7d4448ad +bfeffff258137017 +3fefffffffe45cf2 +3fefffffdf80f19f +bfeffffff511755c +bfeffffad5a6000a +bfeffffffe2b4456 +3feff20e0fae56a9 +bfdc9e292aca0c2d +3feffedbf1d31efb +3fefffffffe1e054 +3fefffdc0ffe4b61 +bfed524692605928 +bfeffffffe7fb66a +3fefffffffb1b5d6 +bfe6d38dc0eed640 +3fee86cc1e3b1624 +3fefdffed30777cc +3fefffffff1b660c +3feffdd1406d3617 +bfeffffc66f8b46d +bfef408a47627d1f +bfeffffffb1a36bb +3fefff28b117e7dd +3feffffd274a69b3 +3fefffffffd762d8 +3fefd4b86e4333d3 +3feffffffd292089 +3feffffffb020cd3 +3fefff4ddb8297d5 +bfefe8e90b167e6f +3fe20bfc9fb09515 +3fef1fbf329360cb +bfefff284e93df44 +bfeffffffb983a7f +bfeffffffd0c6810 +bfeffffffd41766e +3fefffefe54cddb6 +3feffff731e93ff5 +bfeffffff8e18ddb +3fefffffff48c27b +bfefffa0bc236873 +3feffff82944daf1 +3fde07f6135e42b4 +3fefffffffe72d0f +3feffffffeeb47ce +3fefffffff62f58d +bfeffffffffbe2a9 +3fefe326c997f3b6 +3fefff404375ac7e +bfe35029cdf409f1 +3fefffffff2bad8b +3feffb799c560f0c +bfef5867f784f9cf +3fefffc613bae6ef +bfefffffffcdefa2 +3fee439879386439 +bfeffee6df7b0bfb +3feffeb62505e063 +3fef76734d55627c +bfeffffffc6182eb +bfefff9decbc0505 +3fefffffffd9a985 +bfefffffffc1a172 +3fefee91c9ed7aa2 +bfeffffffff9a5f7 +3feffffc48b8c895 +3fefffffffdcf376 +bfee9e86283fcff3 +bfeffffffff33e3b +3fefffffff3a0fc4 +3feffad7bab2ba79 +3fefffffffde81cd +bfeed9cc229bdd0a +3fefffffbb081500 +3feffffffe0ab74f +bfefffffffe6c6fc +3fefffffffc7d48e +bfeffffffff8fdf2 +bfefffffffdf7048 +bfefffffff859d1d +bfeffffed8ef61f2 +bfefffffff5885cc +bfed1957caf88895 +bfefffffbbebe6ab +3feffffff52ccc0b +3fefb00367e1a031 +3fefffffd7310dd6 +3fefffffffb915be +3fefffe87e502c21 +bfeefd9a594a44ab +bfefffffff8b0fcf +3fefd78541be849b +3fefffecf077ea9b +3fefffffeed5b87b +3feffffffff95f1d +3feffffffd29a7c3 +3fefffffffe5f1fe +3fefffec7da84d37 +3feffffffc14b62e +bfefffc71eca9b38 +bfefffffd9b2b08d +bfeffcf57fb88ee6 +3fef56c6382640f5 +bfefffffffebe189 +bfefff40b7962227 +bfefffffff30b038 +bfd3b458d1eebed9 +3fefffff1e79a41a +3feffffffe443e84 +bfec1218fb3b5e88 +bfeffffffffc4c59 +3feffe09548d9b31 +bfefffda79cad590 +3fefffd84bbc247b +bfeffffffe0f5128 +bfeffe7d4babfe14 +bfeffffffe9ff327 +bfefffff7acd559e +3fefe16674840bf4 +3feffff6b1ac2140 +bfefffffffeec326 +3feffffffd321bdd +3fe0185eed5e0e1b +bfefffffffcfa2ec +bfd31d1de2e36d95 +3feeb8c3bf168a8e +bfeffffc9a87ace4 +bfefe2b79534f1ab +3fefffffffd05e6d +3fe13efb77dd0b7c +3feffffd195365d4 +bfef7689fdc19f06 +3fefffffffedaec8 +3feffffffce8da22 +3fefff4ffebbdcf9 +3feffffff987af14 +bfefffffffecde66 +bfeff83b21d9e458 +3fefe66e08193e5a +3fefffd886cc92ed +bfeff880230d783b +3feba70f8ebd0e1f +3feffb1b272d2fa7 +bfefffffe0aa7994 +3feffff525b72bf4 +bfefff86f96e477d +bfeffff70ce5cc28 +3fefffffa922e3af +bfeffffffffc9ad3 +bfefffff1b22d21f +bfefffffa1f5df61 +bfefffffffeec5bc +3fefea755cee600a +3feffffe74df150c +3feffffd05642340 +bfefffffffe09343 +3fefffffffaaa2a3 +bfef3d7312c03c6a +3fef23e2f24353e7 +3fefffffffb2a943 +3fe6a5366fbc599a +3fefff9fc5279160 +3feffe3264e1970a +bfefe4ef1d5a3073 +bfeffec25cd5e734 +bfefffffffa18f5c +bfefff8774d6db11 +bfefffefd3cd3149 +3fefffa9d1fc2a41 +3feffffef7cc7aeb +3feffff8a936a722 +3fefffffffefa280 +3fec63239092ffec +bfeffff2bf8b5635 +3fefffffaaab26de +bfeffffffffb6ec4 +3feffffff8a8dbb7 +bfeffffffffc7022 +3fefc8ec49d8bdb2 +3feffffffff7c18d +3fe96ec73088f530 +bfeffff7d5e2915e +3feffbc4adf90968 +3fefffff9e769729 +3feffffff47c83bd +3fefffffffeffb60 +3feffffec0d98366 +3feffcb2b7cffcef +3fce2a3523543aa0 +bfefffffff857f31 +3fef02600fa17e76 +bfefffd21c75502d +3fefffff82291324 +3fefe6c74d694666 +3fefffffd6284e3f +bfeffffffe9d233b +3feffb0f17c18501 +3fe9009fffae8dca +3fd6b79a71da8d28 +bfefffffffc5c92e +3feffffa19163041 +3feffc9e9cc855b7 +bfefffffffebfdf9 +3fefffffffc9839c +3feff992f2591433 +3feffff40137ed57 +bfeffffebe640a20 +3feffbedfc6b27c2 +bfeffffffd2b8fab +bfeffffaef3235bd +3febaf29fac33785 +bfefffcf13ba3cd3 +bfef76779b290dff +3fedf9559bfa0d95 +bfeffffffc38e494 +bfedef14a8099faf +bfef61b0c7d3aa24 +bfeffff214d24eeb +bfefe12eb9de763e +bfefffffd9253e6b +3feffffffbc40c9d +3fe4bb7362e77923 +bfef498f769c703b +bfefffffecf6fb4c +bfe95c2358259c42 +bfeffffee8f51182 +bfeffffffff4c048 +3fef9fdb10a2671b +3feffffffe27e7e1 +bfefffffed01cf31 +3fefffffffcaec38 +3fefc24e2b47a5f5 +3feb1a9d67e69f86 +bfefffffd8eca652 +bfefffffe73f952d +bfefffff55fa058f +3feffffffffbfd18 +3fee7ad68048df06 +3fe9eb9f1e90edfe +3fefffffeb75ed75 +bfefeb8d5bcffe85 +bfd2518d89765a59 +bfefa8d32328e085 +bfefff84f436c395 +3fefffffffb6af4b +bfeffffff7e85893 +bfeffffffd3ea81a +3fefffffd1257a1a +bfeffffffffba03d +3fe312e9a511acb6 +bfefffffe9175d2c +3feffffff3d91902 +bfca3531821e5e97 +bfeffffff71324a4 +bfeffffa7eb62cb9 +3feffffffc44ad5f +3fefffffffeeac07 +bfeffffffef79074 +bfefffffffaf5f35 +bfefffffff159c5d +bfef9b750c003e82 +bfeffffffffa8f8c +bfef26f3f20d140b +bfeffffd798d9897 +bfefffff6469b646 +3feffd89578070c7 +bfd43d5db61e604c +bfeeace525c06274 +3feffffbe734319c +3fefffc80d279a2e +bfefffffffd42095 +bfeffffeac334291 +bfef8c1c1ab95c7b +3fefff087cc4fd34 +bfefffffd5f3f0f3 +3feffffffb24f2b3 +bfeff5cea81a31aa +3fefffffdfeeaf35 +3fefffec2334b735 +bfefeded73cb9158 +bfecd5dab9247c5b +bfefffffff6a86b7 +3fefffffbd78c67b +bfe707c83f4f3548 +bfefffe02f7b6d00 +3fefffffff8662c2 +3feffe3a23f69b4d +bfefffffec6605b7 +bfeffff51dce0b02 +bfefffffff148192 +3feff371a598c9f0 +bfefffffeba00956 +bfeffe81de2534a5 +3feffffffffab56c +bfeffffffedeba31 +3fefffffffe1c814 +3feffd74448f4fe3 +bfeffff001dfaf25 +bfe89050e6f1419b +3feffffffe250064 +3fefffffff1d386a +bfeffffe61e1fa7d +3feffffffffbf3f4 +bfeffffffadce9e7 +bfeaf2879f17a198 +3feffcb5303d4358 +bfe72afac449bd4f +3fe90b5e82a435d6 +bfefffffe23e9d49 +bfefffffc5195da9 +3fefffffda270924 +3fefe19e3f18066c +3feffff60e89376f +bfeffffffb65b82b +3feffec199c9a41e +bfee174b3d6a9daf +3feff699eb40a74c +bfeffefb052f425a +3feff6ee1590e9ab +3feffffff66e78d4 +3ff0000000000000 +3f0aa01583fecfd5 +bd46f5abac02c6ca +3ff0000000000000 +3fdcde83d80bf875 +be68921996c2472d +3ff0000000000000 +3f42e54fcc6fdf4d +3ff0000000000000 +bfefffff19c675fb +3ff0000000000000 +3d30a80edab4359e +be2cb45d7e4adb11 +3dc2726d98996184 +bfa3f42314087e5d +bd2e880c6444547d +bff0000000000000 +3d5ed67c594a3950 +3ff0000000000000 +bc4006968c4ec4bc +bf3a0fdf734189d6 +3d928b8c463f0cb2 +3e9ef6b8130b56e2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bd93172b2fffd4d9 +3fefffffffffffd9 +3ff0000000000000 +bfeffffffffffff5 +3ff0000000000000 +be9eb2b772d8d3fb +bd84c841cc53cd97 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +be903b962b9ad1ee +bff0000000000000 +bff0000000000000 +bd474da73d90f03b +3c404aa201d27d99 +bff0000000000000 +be98dc178b01ca96 +3eacb3053dde9f0f +3e36754b06a6b82c +bff0000000000000 +3fefffffccef3f26 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +be446a3dc009835c +bce7dc6ccb905274 +3ff0000000000000 +bdca5f0f845de301 +bfefc38a80ac5a5e +3caeee5ebbd13c3b +bdd3bd71c170fbee +bfa0d5c4d25794ca +bd1697426c72a62e +bff0000000000000 +3e2070ce1f93459d +bfc53538e6cb0303 +3ff0000000000000 +3f4a6399a06d9f8a +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3de3f28192aba043 +3e47c2452e9c1ff5 +3f60a817e10a83ce +bff0000000000000 +be3806674b5dba44 +bda6f8506481a000 +bf0207c467193f59 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bd30742f6892d66e +bff0000000000000 +3ff0000000000000 +bff0000000000000 +3ec341a3b63985b6 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +3c4bc806d22ceb36 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3fa6243fe004f05c +bc55824696f4d488 +3e216723a5120cfd +bfb7db70e59708dd +3eddc3b19d268af4 +3ff0000000000000 +bf6d143051069ab3 +bfb951ece7ae7dbf +be1bbe08660ab40a +bf229b6ac004f41a +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3d5e5268abd3ac3d +3c5a944b565c4790 +bff0000000000000 +3fef7d25387e7a3a +bff0000000000000 +bd0daa213668a36f +bed74e7ca2ce4c0e +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bdf99d08e70a89d9 +bff0000000000000 +bfb911f9ff715961 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +beb1e1de9345c1e6 +3ff0000000000000 +3ff0000000000000 +bcaee88883526e33 +bd5741caa1e75ad0 +3fcad4cdc8240aaa +bfe050774ce2506a +3ff0000000000000 +3feffb51a919a6d9 +bff0000000000000 +be512df884f02fb9 +3d3d013b57f98829 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +3dc0ac225af14690 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ec82d20c7986a7c +3d410e66b917ab77 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ca5bf9310a3d1de +be45e2639571728d +bced8dc9dac70ad6 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3f301f1e6888dd9a +bff0000000000000 +bedaccf7a6ecd286 +bf2514a678e4716a +bff0000000000000 +bedc21dc4b08795d +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +3cca57b9dbb26e35 +bff0000000000000 +bf4b65035ffd05c9 +bd868ce7d542adb2 +3f42cba950289433 +bff0000000000000 +bff0000000000000 +bce37f62908ed736 +bff0000000000000 +3f4c75556be5fc72 +be64f15b55100834 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bed0c0ada36ea1cb +3ff0000000000000 +3fdaf30e48f22ef1 +3f86f5fdee2bf506 +bff0000000000000 +3e124a09def26382 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +bdb3a1cd4745c7f6 +bf413a79d860a852 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +3e65f7aa0e1f5109 +bc3c0c998aa0755b +3fd74cc253d54e1e +3e30fc56202f458c +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bef7c7bf83493342 +3ff0000000000000 +bcf1dd15f5c9b6b8 +bceac4e44d44b20e +3e4d77bbddd6df8d +3faa7853c5c594d5 +bfc4d61eb9c95bc2 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bf9a8d80c1e6604a +3ff0000000000000 +bd25c17fdeea5282 +3ed5ba1d3e8514da +bff0000000000000 +beda9d8a0957809f +bdee83ef420b57bc +3feff6f507c25d76 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3fb0ceedebe84ca3 +3fa245db4fddbec7 +3ff0000000000000 +3ff0000000000000 +beecfa5cfd5f6e01 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bf0339a98f2c7dcc +bc51a152ff105149 +3c7c24b19fd8439a +3ff0000000000000 +3ea374c62f3e2292 +3f28d4ccc3fca90b +bea00cbb179e3e01 +3ff0000000000000 +bca0e5c7a8787572 +3ff0000000000000 +3ea353ccefe678e0 +3ff0000000000000 +3f899bf1e5625501 +3cf17a55acff5234 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +3e2e03ae4940977d +bd56bd20eff7502d +3e0a41f1576f1708 +bff0000000000000 +3e420b909f16deae +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd453da2ab4f9e28 +3ff0000000000000 +3ef441d9a990924e +be5fe9d2e186a1c5 +bd885b7b2ae856a0 +be02156fb471d54c +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bd22356ef88a7b24 +bff0000000000000 +3d442aea1583ca30 +be2be83edd37c3f4 +bcc6a42f51e892ea +bff0000000000000 +bc98c2b9f51e8064 +bc300a0407057749 +3d303c512fd5124f +3dc95ae1c69e345b +3f81f7db3b7f0130 +3ff0000000000000 +3da26f496aebb94e +3dd1e680aa7b310a +bd183c2a1f214f52 +bce17f0bd0ba8eb6 +bff0000000000000 +be97f181cf3a1a43 +3ff0000000000000 +bd5218a0d73d34b8 +be2af07c0ce91605 +bff0000000000000 +3ff0000000000000 +3ec29583dc7e4677 +3ff0000000000000 +be89f7259b828213 +bd722debf45b9437 +bff0000000000000 +bff0000000000000 +bd787778cf1e0a7e +3db1133e199d30e0 +3c872b1a8ba6e01c +bd66f1aea38da07f +bc7baa9a625de882 +bff0000000000000 +3e07c535cb9d2ae6 +bced81abff0a07f1 +3ff0000000000000 +3e8463fa6ee888ce +3d18ab3959532c7d +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +bc62c630983e8e20 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +3d98fe6318d3b85e +bff0000000000000 +bf887e0c011722b4 +3f515448db374129 +3e71bbb749b856dd +3fe1576abd01cbd5 +bff0000000000000 +3ff0000000000000 +3c608232fa84595f +bf81329ff10e51c8 +bff0000000000000 +3db85b0be58f798b +bff0000000000000 +3ef72baedf689ad9 +bcf77981e7e4851c +beaed822afb339a2 +3fed2eeefbb5a3eb +3ff0000000000000 +bff0000000000000 +bea8290116adcca3 +bcf949688e2ae2e0 +3ff0000000000000 +bed502c25e24992b +3ff0000000000000 +bdbe26047ef851ef +bcbc4be72834a53e +3c306ff20e372640 +3ff0000000000000 +3f87a75f5d499304 +3effcef3d97c2349 +bff0000000000000 +be119d00e3168a24 +3c378341eb020688 +bff0000000000000 +3ff0000000000000 +3e88027be6866880 +3edf0dd7e41d5cd6 +bd974a3abaa91d25 +bfe7f235056c82b1 +bd6d6567e91339ba +3dd533aa9c400051 +bcbc649c71445fd6 +3ff0000000000000 +bf648fdb10bae99e +3ff0000000000000 +bf4981de81b30f26 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3dec0f051905243f +3ff0000000000000 +bff0000000000000 +3ee9b8386f76cab5 +bfc73ca2e3c42ce3 +bd0af760051fd8e2 +3ff0000000000000 +3ff0000000000000 +bd2a742e1ed617c2 +bff0000000000000 +3d2e67b10ca60a8f +3ff0000000000000 +3f370926a8c6ef00 +3ff0000000000000 +3ff0000000000000 +bfc5efd9bc39bced +bff0000000000000 +bfecb755a0dfe1e1 +bff0000000000000 +bfc225810be79c36 +bc30b1f4c589066e +3ff0000000000000 +bf90f3c2d3690818 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +3febdbf03824f64c +bff0000000000000 +bff0000000000000 +3ed3183c77504978 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +bcc3c76748436e17 +3ff0000000000000 +3fefffffd4fa0767 +3f2d3a3ef8d466e7 +bf1d9762d4e587bc +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bc64e5970e7ffeab +3e6b9349f78d4288 +3ff0000000000000 +bd97b1679e3200c1 +bf76694d06d2e48e +bf6ff350cfb082b2 +bee922f990aed167 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3db358bc057e451f +3e9885ab6787c748 +3c85e1a79c42eaed +3dc43d96e495ac7b +bf4d7465aa29cf78 +3ff0000000000000 +bd806a2727545dc7 +bd066724a1852da5 +3d18b7f16cce956a +bca5f3e6e9532ace +bff0000000000000 +3ff0000000000000 +3f062d91084b2424 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bc90b6e64710012a +bef6a2bb6fb181fb +3d4e3777af94e866 +bff0000000000000 +bf80bc77aa282a26 +bd0b4f15e2cc6ccf +3de340470fc35e37 +3ff0000000000000 +3fa9711fe45aac14 +bff0000000000000 +3ff0000000000000 +3f36935892eaf201 +3e4c406deab38ea1 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bce65b7b79907321 +bff0000000000000 +3ff0000000000000 +bd10953f58b62c83 +3ff0000000000000 +3ce65a6125bf7716 +bff0000000000000 +3faa5ae8e3438469 +3f43997dd42bfb56 +bff0000000000000 +bff0000000000000 +bed2b0f8cae17095 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3cde030ad6073e3e +bff0000000000000 +3fdfe8ddfff47f54 +3e65bdaec1bc3ef4 +be01626c658fa1b4 +bc9b88fe72c87e9e +3c75e24eca177dce +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bcf5bb8a1014aa21 +bdd469735fc7de43 +3fdcda21042a8cb3 +bff0000000000000 +3fa1929a2daec974 +3ff0000000000000 +bc87de0a7404ba66 +3e2c1e4ce62a835c +be40f67eb12c77a4 +bff0000000000000 +bff0000000000000 +be8f1aa11218f0ab +bff0000000000000 +3ff0000000000000 +be10d46a07d6a4ac +3ff0000000000000 +bff0000000000000 +bf4cafb05dcdaf4c +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3da089cd2e291307 +3ff0000000000000 +bff0000000000000 +3d6aabc54364669f +bfb54e47d9a56f02 +3e43d1e0b4b28025 +3c6994d1cd25f6ae +bf9666f27d81806b +3ff0000000000000 +bf421b57bf1b113e +bff0000000000000 +3fce338eb3443359 +bef12f26f2668903 +3d474c06c04945bc +3ff0000000000000 +3f78521ca7a05484 +3ff0000000000000 +3ff0000000000000 +3d510fa830cbc3b0 +bf2da994c11e6c7f +bff0000000000000 +bf3164bad9915cc8 +3ff0000000000000 +bff0000000000000 +3dfe9de8603b9661 +3d32f398ff4c7761 +3c5b59e3abaf6248 +3f1988cf8cced454 +bff0000000000000 +3d6e28661e0d02c9 +3c83c35a6b8a6097 +3ff0000000000000 +3ea2bed6120b0c50 +3ff0000000000000 +3d9ca6a26c28ed83 +3c3043b1e1a274af +bff0000000000000 +bc6300a891a347d9 +3ff0000000000000 +3cf1d6c19c330fca +3ff0000000000000 +bc3fbeb15d8afbd1 +3ff0000000000000 +3ff0000000000000 +3c697f9a87ab53d7 +3f31ff01ecd7e5da +3c63c9bcf00f54aa +bff0000000000000 +bfb4d07eff0132ae +3e71ba1e0f513bca +bff0000000000000 +bfef16cdd8dc1cf1 +3ff0000000000000 +3ef5ca6d96d132d0 +bff0000000000000 +3de1094b2be353b2 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3d595640a7cda242 +bff0000000000000 +bc39bd35f153e736 +bf4152b7202674ee +3ff0000000000000 +be439ce7980f0d1f +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +3ff0000000000000 +3e14c0315b85ce64 +3e436f57268483ff +bff0000000000000 +bfeac3c85f8c6ef2 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +3ed04c688034786d +bc47f8a6786ae426 +3d0f07a714c325c2 +bff0000000000000 +bff0000000000000 +bff0000000000000 +3ff0000000000000 +3d30467d80129ec8 +3dd4ab8a9a06040e +bfeffffffffffffb +3ff0000000000000 +bff0000000000000 +3d013c5cce4c0dcd +bd35830ea9788f21 +3d72ed42213a699c +3ff0000000000000 +3f078c62c94f1f18 +3f0925acfe1d5af5 +3e4a281db3db06ca +bff0000000000000 +bfefd0e69c4da0e6 +3fdbc7b9dae357ef +bddcfe2d21109310 +bff0000000000000 +3f7ba307bff9e8d2 +3fd9480e815d2d6d +bfeffffffffd9194 +3c8b646443068ed4 +bf91ad7e689a083f +3f5be550cdc2cf65 +3c48333991b4ef70 +bff0000000000000 +3ff0000000000000 +3dabccd844de1c41 +bff0000000000000 +bd9360a32135ff4e +3e050208c94af08e +3ff0000000000000 +3fab916cb42f1828 +be055b48c5c07261 +bff0000000000000 +bdda83f7e6ddc1f4 +3cb6fdb48168339a +3fb694982ae3ee10 +bed08e73f48f2d7f +3cc32966dbdd4d25 +3ff0000000000000 +bff0000000000000 +bc6f666b78667b5d +bff0000000000000 +bff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3ee1bde7ce233eaa +bff0000000000000 +be30639c596ad433 +bff0000000000000 +bd82bb168fc7bdee +bff0000000000000 +bff0000000000000 +bff0000000000000 +bfd830da487a324c +3e4289cfb4b80f2c +bde6b588a367bd5e +bff0000000000000 +bff0000000000000 +bff0000000000000 +3febae1025d8a6f6 +3e378f697cda5c46 +3f08a84d822397e9 +bff0000000000000 +bcd507ca9a2da830 +bff0000000000000 +3f30f37b63fb9778 +be39dd06b0761f6c +bfef86b4cfcb0dc9 +bf93bc547777e9b1 +3ff0000000000000 +bfefffd43353876f +3ff0000000000000 +3ff0000000000000 +3ec76dc6c2b9de5e +bd526adbf8026791 +be1b7ca57e0bfe7a +bff0000000000000 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +bc791a1660f13998 +bc4cfdae285bb2ba +3ff0000000000000 +3e82a556343c03de +3d100007c5174a6c +bff0000000000000 +bea284e8a0289f23 +bf92efcd1458e465 +3ccb5100e24fc771 +3d0b99b0b59b0a6d +bff0000000000000 +bef0e0862137382e +3ff0000000000000 +3ff0000000000000 +3f30298b4e924368 +3d713130661d64e1 +3df0e5d6048bfb1d +be56b25ba162fcbc +bc79a0489a17c6be +bf95f501a266924e +3e8cd4730478aeb4 +3e785ec5e6c0df13 +bff0000000000000 +3df338d24fd35752 +bff0000000000000 +3c6be427cbc26cd6 +bcd3523fedcac9a6 +bf5791e28dd76878 +3ff0000000000000 +bec7092c444e2442 +bff0000000000000 +3ff0000000000000 +3da0aee2b17ebd0a +bdc54cb81d2f70e0 +3f3a603442f3f8a6 +3d0383b8a9d9b67e +3ff0000000000000 +bcc387c95f349ab8 +3f14e5f28e6bec20 +bdbf58ba78efb931 +3c93f9969c3e3ee8 +3eda94a13b51f21f +3ff0000000000000 +bfef8e2e1ecb3009 +bd01969e0548790f +bff0000000000000 +3d2ecaa362931c30 +3eb3dbe4e8465984 +bff0000000000000 +bc527d3dcb259816 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3f0efc27465c78b0 +bfefe682e255e743 +3fe44139f9cf9b25 +bff0000000000000 +bff0000000000000 +be57d81a483c91fd +3ff0000000000000 +bff0000000000000 +bff0000000000000 +3f77e73ce8b42658 +bf860fd62e5aa6c2 +bcd5b0868bb86510 +bc41b264bcf198e7 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3c6c1e5ee5dfbfbc +3dc70bc6a1d9bfb8 +3d4ae3f67e3666f8 +3ff0000000000000 +bd701590fdf8586d +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bd05a765c50b95b5 +be60a2224db861cd +bca2fc41c7fa586b +bff0000000000000 +3fefffffffffffef +3d1746ee5305dd88 +3ff0000000000000 +7ff8000000000000 +3ff0000000000000 +bff0000000000000 +0000000000000000 +8000000000000000 +@cbrt 2218 607f2d8fa1ab934a +0000000000000000 +8000000000000000 +bff76ef7e73104b7 +bff763d6aa3165ca +bff758aacb84ab48 +bff74d7431a2a9ef +bff74232c2a08d66 +bff736e6642ec913 +bff72b8efb96face +bff7202c6db9bf0e +bff714be9f0c7610 +bff709457396f97b +bff6fdc0cef141f6 +bff6f2309440fc2d +bff6e694a6370cc0 +bff6daece70d026d +bff6cf39388275fa +bff6c3797bda5724 +bff6b7ad91d82606 +bff6abd55abd1830 +bff69ff0b64528cb +bff693ff83a4130c +bff68801a1823629 +bff67bf6edf96210 +bff66fdf46918bfd +bff663ba883d6a24 +bff657888f56f571 +bff64b49379bd084 +bff63efc5c2992db +bff632a1d779f72f +bff62639835eebee +bff619c338fe84b2 +bff60d3ed0cecb93 +bff600ac2291710e +bff5f40b054f594d +bff5e75b4f540566 +bff5da9cd628d749 +bff5cdcf6e902ec6 +bff5c0f2ec805e4b +bff5b407231e75a1 +bff5a70be4b8e115 +bff59a0102c1db44 +bff58ce64dc9afb3 +bff57fbb9578cc58 +bff57280a8899ffc +bff5653554c24374 +bff557d966edeb63 +bff54a6caad6204e +bff53ceeeb3bba7f +bff52f5ff1cf9f35 +bff521bf872b3c70 +bff5140d72c8c08c +bff506497afb0ab0 +bff4f87364e550f7 +bff4ea8af4727916 +bff4dc8fec4c1ffb +bff4ce820dd14cda +bff4c061190ccbcd +bff4b22cccab2bfb +bff4a3e4e5f05d21 +bff4958920ace7e4 +bff487193732bc5c +bff47894e24991b9 +bff469fbd922d1e3 +bff45b4dd14d0b7a +bff44c8a7ea6e451 +bff43db193518653 +bff42ec2bfa2801c +bff41fbdb215127f +bff410a2173ae384 +bff4016f99ac0f2e +bff3f225e1f68dc3 +bff3e2c4968ce6da +bff3d34b5bb427f4 +bff3c3b9d37114c6 +bff3b40f9d7486c1 +bff3a44c5706f0cc +bff3946f9af2fb59 +bff38479016f2c53 +bff3746820068d8b +bff3643c89804367 +bff353f5cdc604b5 +bff3439379c9637b +bff333151767d583 +bff3227a2d4d6a44 +bff311c23ed61a81 +bff300eccbed9c99 +bff2eff950eda714 +bff2dee7467a895f +bff2cdb6215e00f2 +bff2bc6552602f41 +bff2aaf4461e92e0 +bff2996264e0e3fe +bff287af126bb216 +bff275d9add09e1c +bff263e1913c0992 +bff251c611c00ff7 +bff23f867f1c9cb1 +bff22d2223846bf3 +bff21a98435ec11f +bff207e81d0598ee +bff1f510e88018ec +bff1e211d738f88e +bff1ceea13b09ab3 +bff1bb98c12a87ef +bff1a81cfb55f36b +bff19475d5f0ec64 +bff180a25c65d642 +bff16ca19162b804 +bff158726e69e9b0 +bff14413e35b9b62 +bff12f84d5f7a534 +bff11ac42157019d +bff105d0955c44af +bff0f0a8f61a51cc +bff0db4bfb307ea0 +bff0c5b84f1b3d48 +bff0afec8e785027 +bff099e7473d6fd7 +bff083a6f7e02e3f +bff06d2a0e6dc11e +bff0566ee7913949 +bff03f73cd868244 +bff02836f6f856e3 +bff010b685c7228c +bfeff1e10b6d14df +bfefc1c5d5fe2b93 +bfef911721823d03 +bfef5fd06eabb5a1 +bfef2ded04f5d695 +bfeefb67eea8c934 +bfeec83bf4818dda +bfee946398f37745 +bfee5fd912f78121 +bfee2a96485c3664 +bfedf494c786ffde +bfedbdcdc09588f1 +bfed8639fdcb60ea +bfed4dd1db350891 +bfed148d3d661fb1 +bfecda63873449c8 +bfec9f4b8e4b830d +bfec633b8e72d5bd +bfec26291b51780f +bfebe809107c14d0 +bfeba8cf7f880b10 +bfeb686f9bd665f6 +bfeb26dba3b9ab80 +bfeae404c687c17a +bfea9fdb07133590 +bfea5a4d19ec1bb3 +bfea13483ea70ab2 +bfe9cab8133ea76a +bfe98086606f336a +bfe9349adda869b4 +bfe8e6daeadc27c3 +bfe897293e01e227 +bfe845658197596d +bfe7f16be0aacbe5 +bfe79b147c0198c6 +bfe74232c2a08d66 +bfe6e694a6370cc0 +bfe68801a1823629 +bfe62639835eebee +bfe5c0f2ec805e4b +bfe557d966edeb63 +bfe4ea8af4727916 +bfe47894e24991b9 +bfe4016f99ac0f2e +bfe38479016f2c53 +bfe300eccbed9c99 +bfe275d9add09e1c +bfe1e211d738f88e +bfe14413e35b9b62 +bfe099e7473d6fd7 +bfdfc1c5d5fe2b93 +bfde2a96485c3664 +bfdc633b8e72d5bd +bfda5a4d19ec1bb3 +bfd7f16be0aacbe5 +bfd4ea8af4727916 +bfd099e7473d6fd7 +0000000000000000 +3fd099e7473d6fd7 +3fd4ea8af4727916 +3fd7f16be0aacbe5 +3fda5a4d19ec1bb3 +3fdc633b8e72d5bd +3fde2a96485c3664 +3fdfc1c5d5fe2b93 +3fe099e7473d6fd7 +3fe14413e35b9b62 +3fe1e211d738f88e +3fe275d9add09e1c +3fe300eccbed9c99 +3fe38479016f2c53 +3fe4016f99ac0f2e +3fe47894e24991b9 +3fe4ea8af4727916 +3fe557d966edeb63 +3fe5c0f2ec805e4b +3fe62639835eebee +3fe68801a1823629 +3fe6e694a6370cc0 +3fe74232c2a08d66 +3fe79b147c0198c6 +3fe7f16be0aacbe5 +3fe845658197596d +3fe897293e01e227 +3fe8e6daeadc27c3 +3fe9349adda869b4 +3fe98086606f336a +3fe9cab8133ea76a +3fea13483ea70ab2 +3fea5a4d19ec1bb3 +3fea9fdb07133590 +3feae404c687c17a +3feb26dba3b9ab80 +3feb686f9bd665f6 +3feba8cf7f880b10 +3febe809107c14d0 +3fec26291b51780f +3fec633b8e72d5bd +3fec9f4b8e4b830d +3fecda63873449c8 +3fed148d3d661fb1 +3fed4dd1db350891 +3fed8639fdcb60ea +3fedbdcdc09588f1 +3fedf494c786ffde +3fee2a96485c3664 +3fee5fd912f78121 +3fee946398f37745 +3feec83bf4818dda +3feefb67eea8c934 +3fef2ded04f5d695 +3fef5fd06eabb5a1 +3fef911721823d03 +3fefc1c5d5fe2b93 +3feff1e10b6d14df +3ff010b685c7228c +3ff02836f6f856e3 +3ff03f73cd868244 +3ff0566ee7913949 +3ff06d2a0e6dc11e +3ff083a6f7e02e3f +3ff099e7473d6fd7 +3ff0afec8e785027 +3ff0c5b84f1b3d48 +3ff0db4bfb307ea0 +3ff0f0a8f61a51cc +3ff105d0955c44af +3ff11ac42157019d +3ff12f84d5f7a534 +3ff14413e35b9b62 +3ff158726e69e9b0 +3ff16ca19162b804 +3ff180a25c65d642 +3ff19475d5f0ec64 +3ff1a81cfb55f36b +3ff1bb98c12a87ef +3ff1ceea13b09ab3 +3ff1e211d738f88e +3ff1f510e88018ec +3ff207e81d0598ee +3ff21a98435ec11f +3ff22d2223846bf3 +3ff23f867f1c9cb1 +3ff251c611c00ff7 +3ff263e1913c0992 +3ff275d9add09e1c +3ff287af126bb216 +3ff2996264e0e3fe +3ff2aaf4461e92e0 +3ff2bc6552602f41 +3ff2cdb6215e00f2 +3ff2dee7467a895f +3ff2eff950eda714 +3ff300eccbed9c99 +3ff311c23ed61a81 +3ff3227a2d4d6a44 +3ff333151767d583 +3ff3439379c9637b +3ff353f5cdc604b5 +3ff3643c89804367 +3ff3746820068d8b +3ff38479016f2c53 +3ff3946f9af2fb59 +3ff3a44c5706f0cc +3ff3b40f9d7486c1 +3ff3c3b9d37114c6 +3ff3d34b5bb427f4 +3ff3e2c4968ce6da +3ff3f225e1f68dc3 +3ff4016f99ac0f2e +3ff410a2173ae384 +3ff41fbdb215127f +3ff42ec2bfa2801c +3ff43db193518653 +3ff44c8a7ea6e451 +3ff45b4dd14d0b7a +3ff469fbd922d1e3 +3ff47894e24991b9 +3ff487193732bc5c +3ff4958920ace7e4 +3ff4a3e4e5f05d21 +3ff4b22cccab2bfb +3ff4c061190ccbcd +3ff4ce820dd14cda +3ff4dc8fec4c1ffb +3ff4ea8af4727916 +3ff4f87364e550f7 +3ff506497afb0ab0 +3ff5140d72c8c08c +3ff521bf872b3c70 +3ff52f5ff1cf9f35 +3ff53ceeeb3bba7f +3ff54a6caad6204e +3ff557d966edeb63 +3ff5653554c24374 +3ff57280a8899ffc +3ff57fbb9578cc58 +3ff58ce64dc9afb3 +3ff59a0102c1db44 +3ff5a70be4b8e115 +3ff5b407231e75a1 +3ff5c0f2ec805e4b +3ff5cdcf6e902ec6 +3ff5da9cd628d749 +3ff5e75b4f540566 +3ff5f40b054f594d +3ff600ac2291710e +3ff60d3ed0cecb93 +3ff619c338fe84b2 +3ff62639835eebee +3ff632a1d779f72f +3ff63efc5c2992db +3ff64b49379bd084 +3ff657888f56f571 +3ff663ba883d6a24 +3ff66fdf46918bfd +3ff67bf6edf96210 +3ff68801a1823629 +3ff693ff83a4130c +3ff69ff0b64528cb +3ff6abd55abd1830 +3ff6b7ad91d82606 +3ff6c3797bda5724 +3ff6cf39388275fa +3ff6daece70d026d +3ff6e694a6370cc0 +3ff6f2309440fc2d +3ff6fdc0cef141f6 +3ff709457396f97b +3ff714be9f0c7610 +3ff7202c6db9bf0e +3ff72b8efb96face +3ff736e6642ec913 +3ff74232c2a08d66 +3ff74d7431a2a9ef +3ff758aacb84ab48 +3ff763d6aa3165ca +3ff76ef7e73104b7 +3ff76ef50f2336b8 +bff76ef50f2336b8 +3ff76ef79e62de78 +bff76ef79e62de78 +3ff76ef7e73104b7 +bff76ef7e73104b7 +3fca5a4d19ec1bb3 +bfca5a4d19ec1bb3 +3fd300eccbed9c99 +bfd300eccbed9c99 +3fd7f16be0aacbe5 +bfd7f16be0aacbe5 +3fde2a96485c3664 +bfde2a96485c3664 +3fe68801a1823629 +bfe68801a1823629 +3fed8639fdcb60ea +bfed8639fdcb60ea +3fd766115c1dce7f +bfd766115c1dce7f +3fe5c0f2ec805e4b +bfe5c0f2ec805e4b +3fe6d3e8eeed74fe +bfe6d3e8eeed74fe +3fecda63873449c8 +bfecda63873449c8 +3fee5fd912f78121 +bfee5fd912f78121 +3ff11ac42157019d +bff11ac42157019d +3ff150525d185c52 +bff150525d185c52 +3ff180a25c65d642 +bff180a25c65d642 +3ff2979ec6e7c5d7 +bff2979ec6e7c5d7 +3ff2995de129ab7d +bff2995de129ab7d +3ff2996264e0e3fe +bff2996264e0e3fe +3f1a36e2eb1c432d +bf1a36e2eb1c432d +3ff49b49d663f082 +bff49b49d663f082 +3febdb7ade9e8ae4 +bfebdb7ade9e8ae4 +40a0d4de8fb11dad +46da8e327ba6c9c9 +554428a2f98d728b +d54428a2f98d728b +2990000000000000 +a990000000000000 +2aa428a2f98d728b +4021d725ed9a197f +4021d79d3987923a +c02221beb21cac5a +c022238b4721c514 +c022204e1ed5b721 +3fe4cfeea5e4ac75 +bfede7f9e08c8375 +c0004efea55e6384 +3fedbf9db2c0872f +3ff7e580133a3364 +c002862b6773f458 +3ff246fe40691ffb +3ff62a529bb67c58 +c0028de736861688 +3ff6be282ed23859 +bff590e3ced12d21 +3ffb3fe9647049eb +3ff58d68fe5ab569 +3ffd2053a20ea972 +c000dab268085067 +3fff7fa8c669da1f +bff6238b8b9d88aa +bfff304f6c1c9d94 +40007fd3769099b7 +40001a0b1a9a0bab +c0000d0a0e16c069 +bfffdd7e130420ad +c0006e925ad96cac +bff23c0e657c88f4 +c00207cdeacb016b +c0015aac870112d2 +4001a57ff21ac0f9 +c00119373ac82f0b +c00162c12d0d9b95 +4000a7bac1a954ee +3ff461e9818d0f2d +bffec0b4b16b9b9f +3ff9a3f7be6b239c +c00229557ab23ad2 +bfff42e5b3f33dd7 +c000e5d9679a40c2 +4001b6533fc3fc4c +400101d220e000a0 +c001b2a7ab636243 +40013da8eff7f7c0 +3ff40c99119a9d63 +c0016eb2e28c77f0 +bffeb2dbd13aa796 +3ffa27464f0378c7 +400040344edafe6b +c002153e66d4f844 +3fff78727bf833f6 +bffd741ae62713bd +c000ac1ecc02bb7e +3ff9dab56ace67d5 +c000896f626564c4 +bffbf1e8a71df8bd +bffc8883f49b9571 +3ffa9a9a00a6b883 +3ff9933c3318f531 +3ff44e73946847ae +40007c0a55679102 +3ffb260a9ec08ef8 +400170e96834734c +bff93b30c1db0e94 +3ffc3c4455399ac0 +c001bafe17f7d75c +3fc77f29fff04546 +c0026f5afab3cf30 +c00297a862d54f99 +3ff50087b3e5dfc9 +3ff74e3bbede3762 +c00100dd25143df3 +c002148e9faa4342 +40027e3e9ebb31e5 +3feefad1d2dd0cf7 +4001f6a5f4307b4c +4001c7152bdf967e +c0019439b2a7a0a7 +bfe023d544457383 +bffb26a9cc582d79 +4001884da2a519f0 +40000614086a0ea9 +c000e57263aeb260 +bff8abcfca4b420a +bfff9fc01802d424 +c00271fc27c151de +3ff55581dda3f3bc +3fff0bdaf08e1b02 +3ff87d7778b43dce +bffe19b1c9ca30d2 +bff5d8e2de5017e5 +3ffde0aac2b57dbe +c000c1d4750fbcdb +3ffbf54299e7ec1c +c001d28f6b47a1af +3ffb6868ed8aa14f +c0024aecd5796cbc +bff9dcc5ee51a1cd +3fee6811277d6709 +bfffcb70c0243fdc +4000fd5734c51ae3 +3fe980d9b8f2b83d +3ffa2160837fe00f +c0023fe4e262be57 +bff8a49aa148a66c +400111ebd3e1f070 +3ff947ed9907783c +bff7bb7fb2fb76c8 +3ff538fe4e6ccf5e +3ff23dbdffb6e150 +400158cf09accda7 +bff8010f3051c132 +3ff58789b31d6184 +400159f82348be18 +3ff7b2e07b644e39 +4001b1a4aba8cdfe +bff337426fc59afa +40016b450b2f5c7f +400017d116ae701b +3feb44f0da200b25 +bffd2ddbe6928d43 +3fff8127174fd9d4 +bffe58e465ecccd0 +bff11e9d87490737 +3ffe0c0d4209ff85 +3ffadb8098108899 +bfe9098047b61e9f +c0018988f4ffd457 +3ff7e8cd957629db +3fff53d97475470a +bfed24b75695b8e9 +3ff3b16b299feb12 +bff3828200b7c3b0 +3ffc6a3410174b2f +3ffa08f21a5a80c8 +c000c37749510bfd +bff8e2f1048a5ff3 +bff6c814a65fae9d +c00194d35e54ee51 +3ff11a61aff18309 +c000f57e7afaa338 +400063b91b5ef7a3 +c00002d9220ab487 +3fffbe7b87d7c021 +bff2d0f307e743da +400240edfa97e208 +bff87fa1a27c5cd5 +400114a8e30e76de +bffe4add1da15858 +40020f799ced77e5 +4001630ac60f442e +bffb5eda28254096 +bffb3a3728c52b87 +c002115e405f10ff +400244a8492565be +c0021735e8d62277 +3ffa0ffd68898cb0 +bff27408015c9e86 +bfe4dc50f04dc9b2 +bff04aa241949be9 +bff5db106bdc82b2 +bff4b15247885f27 +bff663dd299fd62e +bffdbdf201cb7c2e +3ff228a137d81ffe +bfe2f893b252b265 +bffb7d025098da89 +bffd5fd9e16dd6f8 +bff5d576e6e05bfa +bfe71d02220c1ec5 +40023f3cb74be02f +40022bb71e3407e9 +3ffd80c7ced9333e +3fe8c5c4a7f74d7b +400229a4025bbab4 +3ff6f5509fd616fa +bfff58b83c461310 +3fe797ba99dc7444 +c002993583ce0bc2 +3ff4a59b8e80660b +3ff71540c09a7f1b +3ffa6f1cf33ba6a2 +3ffe80da1594bdc5 +bff16eb28c6145e7 +c00130ca887a927d +bff9d3aa11171e48 +c00101f52232f670 +bffdce53ee2536de +3ff5208a23a067b6 +c000d68768c50f04 +3ff4c326c2a048f7 +400046d0cc86f2e8 +40015fe0ba80f918 +c002380c79853608 +4001e1cf194f8530 +c0028fa5e001363b +bffcdc8b05de90c6 +3ff8e21f669e347b +c0009247ebb54cdb +3ffe250f338e78ce +400030d876c2881a +3fecb9cb7032766d +4000d7c06d52061b +3ffd75b6bc2ea36f +bfff28d5cd9f680c +3ff93a9a0f14bebc +4001ad2d941ccf91 +4000d16acf11046f +bfe69f8246cbdeb5 +c0018425c2f1c3f8 +bffbd9a6c11fba58 +bff0271f1a187d12 +3ffb0436d776887e +3fff143900f4ac23 +4001030fdb80775f +400226a3b5cff740 +bffa521c90f0adc6 +c001858831ea3e74 +3ffddd971fa183d9 +3fff2ad1325d82f3 +c00259ff22234e06 +3ff5200d573a6f1c +3ffb7c85be6e94f4 +bff00a2226cb6118 +bffe5e9b3de980d1 +3ffdcceee4f7fbaf +4000a2d98630a8d0 +c000d18f7869dc0f +c000690ebfaba53b +4001ba2d47eb8ae9 +3fe883af292b9ea1 +40010ef041ebb659 +bffdc1bf87337e80 +3ff70fcac1f439ae +3ffd384ea0b33a4f +bfece066a5c86b8f +3fffcf3a746f2b12 +bffdae82813b43ce +c000ddb88915b388 +c0015854f62876c7 +3ff4955f204f8d1b +3ffd5fa67d8a871c +3ff876ca6c70e444 +400103c3dc4439a9 +bffd3af61e851551 +3ffbd24a33813b3e +c000b2024dfd36b0 +400174bd1736dc16 +bff680d352a24ac6 +bffd4922da7794c8 +3fffe437e5ce4a93 +bff76c6aeebe7ea1 +bff27cb794176161 +4001442c3b25c87c +3ff9f2161396bc9a +bffc06b45079776a +40016bd1f81f1efc +3ff2e44331c36b69 +3ffbadfa67d34980 +bff76c9e6be2e503 +bffe8514c980986f +3ff769f4c7e404de +bfec5be3ecb6407f +bfffc7c4481c3e6a +c00195591abe58c4 +bffc20c6e710e911 +bffa92da261dbb13 +bffed41069acf166 +40002f70ce2a0354 +4001412752f7e300 +3ff67f83978685f6 +400083d005e54363 +3ff706a87a21bc69 +40004f5037fc0e1d +c002059c0260cded +bffbd3a6328d34eb +3ffdb49ecf6284e9 +bffb3182d6820d8c +c0019697bfefe072 +c0019e6a397f2e5c +bfff7651593ba5cc +c00026c63d6bca82 +bfea292a1980090c +3fff32e3b49c68fa +3ffedc7739877bd4 +bfffbfdf53d94a47 +40023e8bff621be8 +3ffaba6789d5c4bb +bffdd4d5741cedf8 +c000b0fd28f4713a +4001a6b717536a5e +bfff6c0420519e8b +4001158b29909ef3 +bff274bea32a77c8 +c000e8c0064cd841 +bff6dda39450a8c0 +bff49f477eb64631 +bff669dade879f48 +3ffa2d6a9ed35104 +4000e9fb0f463018 +c001f36f2e361561 +3fff19eea22c730d +bffbfc7985b1cd34 +3ff28e2caeb4dd0f +400171b49e3518e6 +400184f43f03e312 +bfff40dd76b09763 +3ff08d9e2f927ffd +bff56b0a1e71ab38 +400181a4a5738c10 +bffc3e275c76e683 +4000735d563f6d72 +c002190df82fab62 +3ff020a374ef96f3 +4001841aa8ee8eb9 +bff41ad29f708c3c +c00028bb30513c93 +3ffc8f30570069cb +3ffc48efa581f88b +bff50d5c26003c93 +3ffd38c4fdfc9f02 +40024966df45f8b1 +c0016656facf73b5 +bffcd80830113677 +bffc99e5874b5010 +3ff92229e549d4a1 +bfffaa6321c96892 +bff94f1a2707589f +c001eccbb8245444 +bffad31014e93076 +c001cac3892d53f6 +3ffc085467fe0ac8 +3ff8c47a109529df +4000ba3dd7bda21d +c002366decf79247 +3ff682001cdae509 +3ff72c1d996885b5 +c00274f1d7f424cc +4001acf6664451ee +3ff13aa049fc5eea +3ff7133dcf949f6b +3ff6784035451337 +c001ea4d6fab4c70 +bff695a9f1596772 +3fff2d9961a5585b +3ffd91323f59e1ac +bffe20dc0742cd3a +4000ab1ac8a30142 +400094f408595a4f +bffe2dfe9e4e1700 +40011f95687a2907 +3fff68e15b38a731 +400187d564461bb3 +3ffd3547f976e85d +bff4e6542fa81f79 +bfff91ab8190a557 +3ffd3eee538bf377 +bfd9709160eab339 +3fff1f0a355d90ec +bff7e142ce9a0b90 +3fffcd09775b418d +bff94e484bc83d0b +400268b6e5d615b2 +c0004bc9dfc1621d +bffce4c6422243b7 +bffd1875bf15c131 +c00210436fa38419 +3ff9da0bd8c3a64e +3ff600381dba04c8 +c00190e981144282 +3ffec615bea3a191 +c000da8e6096d6c5 +3ff96848323961fb +3ffa96988e7c5088 +bff9772a663d3d8d +c0023f5ae83d8b07 +bff7db66aedf7043 +bff48fae65d5b7ff +3ff9b9f965f853dc +4001168814232824 +bff104f5bce18b7a +bff08e37da284702 +3fffbe0eb91be3a2 +bffd3be2acbcddf2 +bffceadf043dd496 +4000eb3e07f996d2 +3fe8ce0ea78fc3d1 +3fef3d88551767ee +3ffa9255f6517892 +3ffe950b40632934 +bfdf2a27395ae42e +3ffc583552f54ba1 +c0012ed486c0715c +bff862145dc4f978 +3febec86198f6e37 +40011902d2400d4e +bff7e8de5076dfcb +c00227c549aa2b76 +bff013b777e01612 +bffc269b48b23240 +3ff16e6389fa35b7 +3ffd63ed0288aec5 +40022d3fc8a3e645 +c000ce3912813071 +3ff00b113981092e +bff3c246b05be159 +4001503f82d8f47a +40015951557d6c1c +bff718a9cdab6673 +c00064d142b56ae2 +c0021e11cba779d5 +3ff7d2fc69edd9d4 +bff444078d739c14 +40027430d2138281 +4001328d4f8cab34 +4001d50c81fbdceb +3fe68c1b912fceed +bff280e052a0cdab +bfeca90651320027 +c00226527144a80e +3fec2ae1b034c743 +3ffe4d827259ba9f +3ff6afa2b7a50b94 +bff5f17dc799939d +3ffd5c3b9ae1f235 +3ffd291ec0ed3d55 +4001b905ced369b2 +c00177497c365059 +400024f3da34080d +c0016c22aaa12629 +bffeae7d058e2107 +3ffc65e0b9b8b9a9 +bff8227a0911b8aa +bffc188be3102136 +bfef1769def91330 +3fffc466a9e34378 +bfffb89fcfb2303b +c000d1f4b0a4d6ad +3ffd62e9f06a4c89 +4000ea905b8be199 +c00135b20290d849 +3ff9059ce003a7db +bfec2ee5196e9627 +400294650094487a +3ffe0263fcd8e0cc +bff95d9736282c38 +3ff7b4378f5504ba +3ffd2a82a54c5f48 +c000b955ae7a249b +bffedeae4da0c8c1 +c00246002c5698c6 +c001271d87375425 +c001f79954143c78 +bff8ec1109e3479b +3ffdbb9eaa6549b2 +c0008d7dcab2b24d +c00272ad316484f4 +3fed9ca32fde28a7 +bff27c32a39f33f6 +c00208e8f9221ef1 +3ffe8bbe2d6f22a0 +bff790a1ad116809 +c000454aea5c4200 +c001eb5acc7af126 +3ffe57571c5a3e4c +40003d9646cac8f5 +bff33dbf08518cf6 +bff2710017123a87 +40009eeaa130b85c +bff8da1d9694aaf6 +3ffec99f9c8d8776 +3ff93d41c4bc8fbb +3ff911c98dc3b489 +40017d962c285bf8 +bff976662a419043 +bff86c8f95693316 +c002715bf11a9023 +bffce740b0f65b99 +3fff9007ada6e03b +bfe5a9d3ed606ef6 +c00159036c599da4 +c001b7e73ae1d701 +c0008030f0848b64 +3ff5484b617fa509 +400114fbf6052e1d +bff77cc1d531dbcb +3ff73e50908e1202 +3ffdb4477fb9756e +4002219060169779 +40009900e02be4b0 +bff8f60d67c7fd9c +4001ea18dc24ad5d +3ffb6d3f31a8e5c2 +bff9f6fae8adc7e7 +bff50db0de959256 +bfe8feadd9830398 +bffecb1d18be237b +4000f92b70833ec6 +4000600315f51bad +c0002e5d18a30f83 +3ffe220b602fc1dd +bff50ed6fe2fd5fb +3ffe0c2785631017 +bffe76e8cd6fbde6 +bff40861306c8c5e +400076042c8c093b +bff00903e7c09c86 +bfebfea66de65cdb +bff21db46ea15b5a +bffa6983442efded +c0027f8b38ab156a +bff4e848c959dd49 +40005a374dd01036 +3ff07f0d60493aa7 +3fff3837840d1d05 +3ffd60e9621c2348 +bff9fc3954bcf95b +bffa7d89054fd609 +c001e632c03662b2 +3ff20e1bd77f6b29 +c00296fa9155dc7d +3ff458e12fb64906 +bff7fd2c4cc6bb0b +4001aca35b44e3d4 +3ffe9480fa2e3cfb +3ff545de4f8eea42 +4001dbd8862df789 +4001d1993469ef7f +400248d943f7e497 +400279827a29c146 +bff77974ccfdd6f6 +c0003bd93c8c07ec +c00244f41e9b0072 +c0006daab05e33b8 +bff1f3fd9b1f20ee +bfeb628e7028b0ed +3ffe668324596977 +c0026b6137be99ef +3ff2876c22776262 +3ffa5dcc3e076535 +3fef61b4e862ecbf +3ffb6f433bfc541d +bff8ebc912ccd037 +400099ecbd33ba30 +3ff317c57886a9c3 +3ffc489dc834c207 +40015849279f5732 +bfead1798db7e973 +bff92443c964f6e8 +c00051f1788a62ec +bff9e366940227b1 +bffe819c9eb75b48 +3ffa986cc8845957 +bffddffbb848c6f8 +c00034c8b57e6f7f +bff6e68ee9e2c0f3 +bfe94ad7d230eb82 +4001ba2de0d24152 +bfdfd89fd00957ca +40019bbccbb529bd +3feebb32ebbb8aee +3ffeabc3060addd3 +3ff22bce920bae8e +4002213dc73a418f +3ffef8f8cbdd7009 +40024c5f001b2a6b +c002729ab207bd55 +c00126b27da22628 +400249fe9127f4f2 +3ffb6d71dad06534 +4002652d9ab50dc1 +bffae29576a237d4 +3ffc24022f1f5701 +bffb6d8b578e1835 +bff0a004004ed9ce +bffded1b277007bf +3ffc168aafb1006d +bffaf2840698e138 +3ffae87c44f1a02a +400071f9b20068c0 +4000cf5b912e6ea8 +3fe6a1d42943bfb4 +3ffc36fd39a41970 +3ffea30662b5339d +3ffee9223fa58f11 +bfffc7c155746702 +bffdb9863ac51fa5 +3fe6feab2fe1e74d +bff49284680f41b9 +bff144dc32039355 +3ff8af6d627e8300 +3ff437696ea67c5a +bffe96a71d1338d1 +c000884c3d36b7b6 +c000559d81c4b84f +c001859ea1f6d893 +3ff90d5661154704 +c001e858e90ef77c +3ffde8c722a87eb0 +3ffeeb9aba1fc95f +bff62ede2b37222f +bfffc9a013c689b9 +3ff7ad174fc2320b +bff60b1850a92f2f +bffb70d685b29138 +c0021eb25c77cc91 +3ffb5a9c53acfe54 +bffcbc05a9b6535e +3ffc0c105cf2a683 +c0026651f538da22 +c000beab468d03e4 +3fffa9065a7849c4 +bff9f978de10fd67 +c0028867987439d8 +bffcff35f3c365cc +4000e6f6f7d065cd +3ff763fe4b19083b +c0025b2238bed679 +40022504f4dc3c17 +c0008fbdd9449027 +bff41c05d428a341 +c0024845d9412f89 +bfffe4e97b7b4339 +c0021794da00af5d +c001a35a188047d5 +3ffd9bbccd9f424f +40003fe2bb69166a +40015f87c37f2e11 +bffa4584dc9785ac +4000e5953081cb3e +c002899a86ce7c1f +3feef8b44f0c7afc +4001a55799cdbb9a +bffb51f6342555d2 +c00034b6c4b5626a +3ff358d8975a19fa +3ffca11d37b45db1 +bff34c66d71d5190 +3ffad07ef2d6c83e +bff5bd1bee6c6817 +40027dabd598dfef +c000d0950dc7c0c3 +3ffe944682371ac4 +bfff28b96362c5a0 +bff2cccbe6d833b7 +400187f7b75fc977 +400075c5d4bdec5f +bffa8d3d69be3c87 +3ff5f5142aaa9f76 +bffe122cdb5701ab +4001741b0c739cda +3ffe947383262dde +40016a7b224e835e +c0026d1fdb5cc406 +3ffc50342f7c7a00 +c0027dae4f071d53 +40022ff76aa0fbca +3ffcd091dcc4b90b +400293203a0f871c +3fff62baab2e99ef +3fe9adf59d80858f +4002778646ae2e6a +bffcf328cf27bc2a +bff6a1aea121db71 +3ffb2f573ed36c96 +bfff69a836d58160 +bfd00a270fefe98e +bffcc996a9b19d3e +c00224445b003c41 +bff50ee4d2124240 +40029005528b09ee +3ff0fae20f6c8e89 +bffeb50c343631eb +bff676239a382795 +3ffc0fd4d86128ba +c0027711d25e6c4f +bfff35ecb2857dbf +c001a481f38dddd1 +bfea416cc7d9dccd +400064182fbc7d18 +c002150424aca59a +c0005c6387c2a5ae +bfecb83dd92735e7 +40010b166af645e1 +bfede83e1de7a419 +bfff9fd1185c3a96 +3ff062f1ea49a58c +3ff5fe63e1fe5a3e +40028e475efa0604 +3ffb3095110b3e2a +4002845c73e3f25c +bfee4a2dabe58550 +c000cbc5d507d579 +c0025c66b3fd9994 +3ffa521c70f1b148 +bffc2c7196f39edd +40025893352f502e +bff533576de58a05 +bff240e3941aa528 +c000840b27956ec4 +3ff325f960d882a2 +bff61695dc9330bc +c0005fe8ee030b2d +c001f42d4abd62fd +3fffebb3cc6e66b1 +c0019a8ec527ff12 +4000dda8339bdd45 +3ffff289f886de83 +bffd93f906437175 +400210122c902f70 +40006d223bcf2e16 +c000c38ca1ef2e48 +bffe51664991bc16 +c0014a2da29116bf +3ff85f07fd329c16 +bfe9132d77ce0c3f +3ffaf6bafe8314e6 +40020a4b7cac88e9 +3ffccd86baaf3231 +bff293f0eb170981 +c00158a5a9f26de2 +4001c946147fa5d9 +bfeed370145766d2 +3ff3b9e5e49ee8cf +3ff75ffc62a3d307 +40017e0a99b70458 +3ffa571bd37e7bcd +bffe959077bbc5cc +bff4de5d7f12a0b3 +c0010113f0d1c297 +3ffb3f40eafe93e3 +3ffec114d0ee3c66 +4001f62698a8454d +3ff6fda040a196d5 +400129e20ae98db3 +4000ffa29bb3f8e1 +3ffb6b942a7c35ba +bff7c6cfff75e3dd +3feb8e987b162c23 +3ff49d51d1a87857 +bffb3ed54aebc3a7 +c0010910e6bc74c2 +c0012701e7c0cf44 +c0012c681ff1c936 +3ffd72e2b66ee9b7 +3ffdeaa4828a7643 +c000e4a2993041df +40018dc6efbd7b0d +bffbfa27c68fc320 +3ffe0145eb6f2f47 +3fe98d29212760ad +4002173f4103c11d +4001705c93c8e79f +400198b06c7b5a03 +c0028c3b78f43658 +3ff7811264bf302b +3ffb5a7177de1a29 +bfec652b479f9f9b +4001834f398ea6c8 +3ff99a2e21d9c081 +bff513d8522e84c2 +3ffc67917266f532 +c001e7f1256fbce7 +3ff36d372c87ae66 +bffaffe2d0ee917d +3ffad958e843b3c0 +3ff5612cc812f476 +c00117d0a4dac364 +bffbf3a8880c485b +4001fa0d7d922aa5 +c001d8eb3c87eab7 +3ff81c9f1d3f18e5 +c0027080134522a4 +3ffe8f85a4f7bfae +4002001b8d050483 +bff3d79115001874 +c0024343b2a5e9e5 +4001884ce31c1bec +3ff9771b6844e303 +4002032ad15a6413 +bff4295b06f01b4b +40002f4dbd837966 +4001454437c95ab5 +c002162ee7146f1d +4001e01683be2ee1 +c0026a2c87fef7a4 +c0020510d4acfb15 +c001aa360ed5b237 +bfff64b4f9c3cac6 +c001942524c2850d +bff26955a4854a61 +c0003062efea98cc +4000c44ff3f8a467 +3ff62a51f9f174b9 +40005a9cc5679f0a +4001d0186483b9f7 +3ffd25e36e285a5d +bff4617dcff86143 +c001ad65915812d1 +3ff713b6d27abd68 +3ffd50c4672595f8 +4000a02f4eb21807 +40026dc228d8cd04 +400129efd7de2591 +40021403d442749b +3ffd4c08ecd562d2 +400111da41bc3ca9 +bffc6b80b6ac98e8 +c0005fc8865a94ef +bffa027e77773e3f +3ff50ffdaf57698b +c002253b5386d73f +bffb5aff1947af9a +c001850282707892 +bfe5d8bfe5978813 +3fff94160b10e9a3 +40014e2d208b0686 +bff1be02b2de39fc +c00292efd6ae418d +3ffa71a60edaf5b9 +bffcc469d490df12 +3ffcb87809b23a5b +c00145f113056556 +bffab293cc65c4f4 +c0015effc99f9387 +bfffef56f3dab25f +3ff76e55fc52d442 +3ffddfd2a765542b +c0022f76d6ddf9f2 +40012ace07cae444 +3fea4532cde6bb07 +c001ea4b8698eddc +bfe59c8c67a0584a +3ff3fa4b6836ce11 +bffea04ffed17421 +bff77c54f183ff7f +4001eb555dbddda0 +3feb0796a164c448 +3ffebd92809feeff +bff5616c66a1edd9 +40022b72bc1cf2f6 +400123972eac580f +3ffb6e623ca0fcaf +4000ebf08be030eb +c0022891c3ddd41e +bff906b7a474d9bc +3ff7a70e37815d07 +3ffcb9b414c2e72f +bff9108f5a8668e4 +3ff1812eba864eb2 +3ff9853517554745 +c00070148e92cc3a +3ffdc19867bc8316 +bffbc44fc787bebf +bffde77601464f68 +40001bf992efd526 +c002986782e260da +bfff91826dbe006e +c000154843478080 +c0022f80c02f069e +3ff7dc388ee2a353 +3fff30967066596b +3ffeb8abae38b46b +c002077473fd49f3 +4001c34aa22952d6 +bff4d7dac2aab40c +3ff4a51371bb2e4c +4001ca1e101d1330 +3feeb1ad6d7d8ec6 +3ffbf7e7a14b1ac8 +3ffa86e2010d8087 +bff7953724b7008b +bffae27c798ec0ed +c001bc49220ea965 +bffbc5375a1443ed +bffd72082eec777b +3ffc1076fcbfb07c +3fff7840481b26f1 +3ffe0e0a5d408ddd +400232e485ebd922 +3ff1ef07e4663fbb +bffd99f835f42883 +40001d78f7fe3477 +c00285983baa764f +4000e249eb508759 +c002955f8bd06738 +3ff6ac93c18063f8 +40025fafee663a76 +3ff06ff3c49b0eef +bffdf95cb219be88 +3ff9abfffa7d5a8b +400012323d9ee1de +4000bf83c620ba71 +4002344e750e7dd8 +3fff56c4bfe82c38 +3ff9ed2937bfe8ab +3fe3e4245c75f4f2 +c001aa24f3c55fe0 +3ff46972696c44ef +bffc99ab30a2c835 +3ffff910fd3bb2e9 +3ff7ab594095a761 +4000589136f46b45 +c0015e6c508d5d37 +3ff982a288eed554 +3ff0418748aba404 +3fe6feeb9c4e631b +c001dda477460b24 +3ffe37f8ba87a7b8 +3ff9e70ad9dfb61c +c00225995df535bf +4001e22af60e3fd3 +3ff93b44464bc2a1 +3ffdadc96f269984 +bfff5567123dc844 +3ff9b64b925fb4ad +c0012a21b796592e +bffe551b654c4535 +3ff185a6057b694c +bffc8bf6c207bc19 +bff56138d8dc73ca +3ff3226029af5e20 +c001149ac17f2d88 +bff318b40ed62391 +bff52a6529aea381 +bffd902a11a98ef3 +bff76c12ffa1e64a +c0005e9db3296a75 +40010c0c176203b5 +3fed59d5503de448 +bff4f1e21f64828f +c00097ff17965dcb +bff067fc0d1f61d4 +bfff6e985035ff9d +c0024b7d65c62f69 +3ff5e7bde10ee9d5 +400149a7f34931f0 +c000982c44ce8f69 +4001e3f4cce1708e +3ff6859bbcd9d5e4 +3ff136e7df7a453b +c0005e27476bcf16 +c000830f4f2d84eb +bfffc54b4c460730 +40028dd884184261 +3ff3ab80b4d748e7 +3ff0a69dde093fe7 +400091f44befd035 +bff7ec31f80efdae +bfe549fb07601d66 +bff60b61d7f1e072 +bffbc08e897cc479 +4001cdcd6f2758af +c000dacd3b2e7617 +c0012c1c892a0697 +40004f4c70d22383 +c00288589815244e +3fec3c70bcc74970 +c00089400a9c9f06 +4000bb4ee3e94637 +bfe2f34ab1d5c773 +c000d3417e9e10c5 +bffe4546443231de +40011585b7bfadee +40022f1e785af80c +c001739ef1cd10e4 +c001c73d9120d3cc +c0017c416ff465b2 +bff5d74d85baaeee +c0027a7161a0c349 +bff4aae655c716b1 +bffed726fa1f1907 +bfffd4a0bf0a5036 +3ffa3878751164f4 +bfe60e837c4c21bf +bff3ea51ba73a40f +3ffe7d37bcc50b5d +3ffc6f1286462f13 +c001f0eb265b22fa +bfff4b98d65325b0 +bff5a26a0ad025e0 +3ffb1e488c7558eb +c000582b22a5f103 +400101ba380fc588 +bff8b9fe7026bb83 +40006e35642662e9 +3ffd4860e513db6b +bff811b805f70f57 +bff239c8e13db79e +c0019c2bb058ecce +4000324e3e58ac94 +bfeef9ce7f94c282 +bffce71bb676ae5a +4001aaa775be1adb +3ffa8b1576a1513e +c00095ab68aec416 +bffdc108baad0a95 +c0017beb6d174ba8 +3ff87dc6b6beb879 +c00092980b28836b +bffab57e1d29e78a +40027c34d9731492 +c0016d2c2798072a +40020a1587ae130a +3ffa301a847925e1 +bffd7449710ad140 +bff013b3b0ae075c +400149352d5caa27 +40017e9cd0c8f470 +bfff28257a269250 +40028d488342f4e0 +c000fd77ee1bd585 +bff122aee56906b7 +3ff9edec0b0ddcbb +bfef13dd72d453ce +3ff045fd275929b1 +c00074417144042f +c0003c6bdcba0590 +400060c171e5c389 +3ff7709d4f7b3e7f +3ffdd2d4ad877ef8 +c00105c3f816c828 +3ffae1e827e600a2 +bff33f80d2184ea6 +3ff8d11aca5648d9 +bffb11ab4c680f39 +3ff8db32bc42cee7 +4000cde0fc9eb980 +40b55d209760431d +3fa2f5d59343888b +bf0ca5c9d643d3c9 +40cb80ef49387cf4 +3fe928fc40c4629b +bf6d4d75d1ec3294 +412bac56db6cfae5 +3fb54edf937bb363 +40a6704f63c17ba3 +bfff907841b45716 +4113be27c4e7840c +3f046e45cf3c0655 +bf587eaa05f6262f +3f352357ded637e8 +bfd5b3c4c2d37d68 +bf03d873ca6292b8 +c116d1c633658c52 +3f13e963fe267f9e +40f3d25929f11920 +beb42b66e6b5c2c4 +bfb2d35bc1a576a6 +3f252cebcb16de18 +3f7fa699d814cabd +c04efd440e3800e3 +c08af3afa1af550f +c0fe747276021bc1 +401b605a9d253d6f +c0b27cbd78ab1b26 +c0070352183e8798 +bf25618cbffb0ac4 +400485f304fb87f2 +40890eed92f2d371 +c004c70337619382 +40eccc6d6fd2e97f +bf7f8f5d2b0f2a0a +bf217512d4e8b3ba +c05e6b8d1e769401 +40564eccf11fd135 +40b49696d9d5a130 +c03bd289bd160c8f +bf79855f50659966 +c0ebbac55c6811fb +c054fbbe442baf14 +bf0cca334faf1b06 +3eb447cabf57f1ff +c042a4488d21cac0 +bf7d6ac26e40b428 +3f8370b9cf9303cf +3f5c70004807559f +c0c2db60ce24918c +40004837abb65c5c +c12f75df2409d2d6 +c0fb747c9df25d50 +4049985b24964536 +c02ebdb96d833873 +405e38f95ad434c4 +c10ce0d72315daa4 +bf615a9799b8f813 +beed04886415b99f +4005b0c2c46723f5 +bf37cff0751af0f3 +bff68c98c49b6f3b +3ed91cc7ac08f55b +bf3b3d947f7b70d0 +bfd48186d7d54de5 +befc7e4f3d2ae707 +c02909dccdd43ee9 +3f5457955cd53ec1 +bfe1a14a394ba743 +403364717c050dab +3fb7d14e4569d3de +c0359c2212b3ab1e +411da3e24d34c607 +40181644f4a0af92 +3f41386711f00546 +3f6240fe6840f368 +3fc0374895bd5478 +c0398fcf69b59bda +bf5d1582c47a57c9 +bf2ca6e340568035 +bfa0a66764131c2a +c0f4c06a830a92f9 +c0ebc701935b48ea +c0a04d877bc2098f +40370db77271b381 +bf0458fa243cb327 +c0458c577f6d2a38 +402f2dd6111d6536 +c012fdaeb9b34341 +3f8b0428e550c66d +4080f48f9c771f97 +40e8e930c85abc13 +40580149f2c0114e +c0f3189358fb9f38 +3eb83ab45782e478 +c06a5eb056fb1997 +c11b582f0ff4a44a +c02599e2c6ad7d14 +3fd6780ee2e55981 +bebc07f2ae1a3afd +3f54bb42a50bfb4b +bfdd0b551b8cb52d +3f93ad8c1d0a17b4 +40cbacf4436bd5e7 +bfc38693a626ddb1 +bfdda13aa8238b40 +bf5338c86126338f +bfaab588b2871765 +404286829823faf3 +c0d740324c333b2a +c0150258c9e3502b +3f13cccdbd799ffe +3ebe148961a306e4 +c039afa5000b730d +3ff57457d9595b96 +c0d316d2c2b313d7 +bef8c3ce557409ef +bf922326cdae6b38 +c04ec791ebe8ed80 +409642ab4ba34a6a +40df590a8da15312 +411dabdd19e8644f +bf4794f8b4c41fe1 +c05c921b867b4b1e +bfdd880a132ee282 +40424f5a5c85a1b9 +c042358d98f494c1 +412ca43c23ece987 +bf84eb8dea040afb +401d6c7619aa9773 +40287d0e1fc34ff3 +bed91b33321f304e +bf121fdb25ed544c +3fe31a99a97c6082 +bfea6a4e7d6c513a +4026364eeb4a1619 +3ff99120055d2ea6 +c0f07cf368de173f +bf64a476293dd0ec +3f089473ed642f22 +403a05e6e57cf584 +c12e6dbb4be1e8a0 +410e38cb1c7716dc +4058bd85ce800d44 +c05238a9850ce11b +3f346ff0531df02b +412bb28569aa5298 +4012d035854fec97 +40e0832b6b0ccbcd +3f8d251abb926372 +3f09f209070f52ee +40549a3208925e17 +40f88c4954becab3 +40661926b844848b +3ed6549c6bd0502a +bf61c2b700f7ec95 +beef29b4bcfd9e95 +c018ec98a5480d72 +40eefd3e300143cb +4095c733f5b9c055 +3fb00a58c7a7c4ec +c08db06949150ad9 +bf9300770ac7bf1a +bfabd8018809cbf9 +c0e468215cf5c630 +bf934fbb3d5cb9a5 +40d5c40c70758297 +c0c3cfa2cceb9190 +c123e202f5a5de4e +406169240bbda9d9 +4057a4b572d1b8f9 +c0a0b85157862517 +3ee2e498eee3e9a7 +c03531c7e3ea4a55 +bfb81dc9229589d2 +bf21f06217cae0c2 +3fb54536ee8bcee3 +c06c75d7c859dc47 +c02d44d228ea3849 +beeb20ea735790d1 +c03017bbc4ee070d +3fb86caf1ca3212c +bf6bc86ee3e89d9a +40836cacf9090260 +c06825a9a36999f3 +c0f2919d45211436 +c08e3e6cfef1f89c +bf903f3e99d16db2 +4005820f0fe22f49 +3fe881001224fdc6 +3fcca606457c2669 +c0733aa5b082df64 +3f50bab4d1239928 +40d28e55b99084b0 +c050e9b36458cb8d +409b8a301d6fcc48 +bf31210e2ffa3d74 +bfb4a977316dfaf2 +c10a6b889228a9b6 +40ba3dd97e46458f +c05846a8ca76b251 +3f6c3a95a8461296 +beb34adc9dc54411 +3fe735b18bbf3833 +3f59e8dcdac51023 +40489b6758ce0b27 +c03a0da72138ae0a +c03afff4d02dbee0 +c0c4c66d2e7415c5 +bf9cfc2439101593 +4044c9d0cb6932f5 +bef09939a66ced50 +beee26d3784d8cb5 +3f639cc074f063d9 +3fd7d95988373782 +bfe1864b93b111d1 +c02330e3e87f31f4 +40c816f9eb494178 +4093478edf48bf99 +4052c07c8a8d1a50 +408492c599e8ee2d +bfd2f1c834f61e29 +410238e0b2dd0117 +bf01b9cccfa7f4ea +3f91b7cb1d9d5bd4 +c111f42b3146e3d7 +bf92f53ae9bb105f +bf43d78f92144581 +3ff8dc0bc6e4c269 +c040d200d3fc464d +c0adfbed1de02b3e +40346984f18cd24a +3fd9d4ddec5dded7 +3fd513075db2465b +4065e0881fc50e4f +4088f4347a2d3efe +bf98928312baab85 +c0461e04d8278ea3 +4033008c59b6f071 +40a0b38a357d7851 +40b86cf1cb3d74a4 +c04754bca9498901 +bfa1028e6592d8d2 +beba3bb692c84bfb +3ec8558729aa610b +41218a1113abbbb1 +3f8113eba1085f39 +3fad67e1d3363156 +bf80043d3d922b58 +401a5e7da0182596 +bed487634860e8a2 +4099aaf5f44cc57c +3f810a405d4f7063 +40a99363e5dac68a +3fcdb5d1750b6e5d +3ef07a6a9da69a9e +c054c3bd322d4a62 +4072e78641cedb67 +c12f4b0c7058995d +3f58dca0eeb71d9f +bf11fd228e6f7677 +3f4df558208f5571 +c01fb692e30fabf7 +3f60a792926f320c +c06fcd41ee851050 +40194b4c486b0362 +40f771672ddd36ac +bf0bea01512d8b5f +41027a9d39a1b1b4 +3f9b79f600ad584b +bf69601f4f872227 +bf2267e7f2391b10 +bf4a74d120553dd5 +4046542fdd76e6cb +40dc24911e29ef82 +40e694d142fd6306 +bf00b46a1e1deba1 +c11d97f090b6ec52 +3f0b6f9364000ec7 +bf58440e8df31e35 +bee1f68c3e5414c8 +c0a519be560bed85 +bed281c51a4cf1d9 +beb00355fae951f2 +3f0441d84afe0456 +3f378099d111e56a +3fca666b3716b005 +40e34ee428a9ffe0 +3f2aa05a6b0b54a7 +3f3a5dd9ebd766ad +befd2b244c6d8bd4 +beea2aab1772d937 +c0b399e70832e016 +bf7d0d11abd8cd79 +40f43d34360b6827 +bf10ab967087858c +bf57fb663e8f4f03 +c02f1a3f8bbc19a3 +40e0ef314709985d +3f8ab2b578b600fa +40c99eec9f0f4438 +bf77b080330dcdee +bf1a80bc8c249151 +c0f928704900640d +c0e9df6d0653de5d +bf1d42dc217485ab +3f3059c4116630e1 +3eccbbf1e597ec0b +bf16bb83cb322f73 +bec832238713dae7 +c052c167dd3640c6 +3f4cfb1c36a9f0b1 +beef2571e8dd1735 +408131aa8103d02c +3f75db1421de66c0 +3efd576f3951373d +c10c52dfa9be9828 +401003dbf053c076 +403b792e82b8b2f8 +bec0e03b0efe4de2 +403386abeebcbb09 +c1042dab5b68ad8e +c0bdfa611099babc +c041357ca5e768f5 +c03bb8a8c3ea435f +4095269b2cad38e6 +c0682c0055e045d9 +405617161c7b3481 +3f2763e29e5ea920 +c112afce725cd2ab +bfcd459964e4ffdc +3fba154893ec6d1d +3f708edd4a9e84fb +3feb17ad28e6c5c4 +c0a81244856d7d39 +40f5c2207d40426d +3ec02af2a41e32c6 +bfca04677d324f08 +c071e117a2542b43 +3f3267cbeaf93d95 +c00def4a4cb65c56 +3f9cbc2f3709d4b7 +bef22e48d3785595 +bf83e9bee2db0276 +3ff27933da98ae89 +40a08ec3b3ea6f26 +c03503222eeb1050 +bf825b2838f5abbe +bef2a3171cc81fb3 +4021b7a43f6cb01f +bf9185650c39c2ea +4075eeff1a21d284 +bf33c31f6e883413 +bedeb6ecf8d62425 +3eb024faf4e032fe +401a81304ce007ee +3fccef12f708128e +3f9fef9e3c6213e4 +c079c443d3eed8dc +bf508548a28ae2d9 +3eb230ccdaa50b8d +c0706934e54542b1 +410f394e22f33cb8 +3f7714401063a9f5 +3f93f547083afb8d +bf26d89cd58d0e6b +bfefaac98fa99688 +bf18b09fafb27d94 +3f3be5a2aeb701bf +bedebfdafa46ba01 +4036d36356f06ed6 +bfc1653a5c6deeba +405d597bccadf3cf +bfb78c9f956c4d4b +c0e8ca86d9b9ab3b +c03988dc86c4122a +40505e99ebe98e40 +3f434b6aa52da972 +40bb3d3306f4840c +c12fdebce8773526 +3f979d4d9c1d1e6e +bfe22fc8067cc10b +bef7fd7182eb7a29 +40933aa8bab1a99a +4113aad712b6964d +bf02eb63e9b518df +c0a452a609030078 +3f03d16e93a4a712 +40999b5ffc2f04a4 +3fb211187e298cd0 +4080775eac4cee89 +40e38d2ccab37749 +bfe1d56bd52b6543 +c08a73774711ce15 +bff22534d943a961 +c0a55b5bdf179114 +bfe0b92bfb86186c +beb03a7ad490d3ee +40f823953791379c +bfd04fd1fcbab102 +40fb2254acc6b14b +c10b73bffb725e02 +404d908366125f87 +3ff19eb8df1c43f8 +c08032c401d50e99 +c11426e9c37f4506 +3f90f8acf71c7845 +40ecfdaa9368edf1 +c025ef23f35493eb +c09a99e89862e7ae +bee12bf6d326f18d +40715531724dedc4 +4000564a6fb1f200 +3faf0c3bd0973412 +bfa8be95f577bea4 +c0d8aa73a7260ee4 +c10f0d1700355364 +c0f723413a267f7c +c05293b2dec6f654 +c10980f73955600e +4096a30bd6613424 +bec17d459946b4d6 +3f6e738da8af8462 +403aaebae2c7672e +bf26fa2802b9a6e6 +bfc68e23c0c14f3c +bfc425fafccaf61a +bf976f46ea2302eb +c0459d52b0da4945 +c0ad1b17564552e1 +c0576d77256abc3c +4113856ae53a69fb +3f310bb3714cbf85 +3f7d4883fafe629f +3ecc312505c88266 +3f35cd543eb212a9 +bfb8b4d1917adde2 +4113b0c606b0fa77 +bf2023153d3006c4 +bef68d657fc322ac +3efd5c794d5ede6d +bed66676f19f3870 +c0ab40d42b4acc62 +412a7ee63a7a2574 +3fa1d6f6368d8425 +4040cdfe3af113de +403711c42d00cd8d +c017f30fdaf6d38f +c0cfe89fbf9f4433 +4046428fc3dc5a77 +40998e0ce5cc6329 +c00bc3ac4094a842 +bed03c14b7291b05 +bf9c832138cc0f1d +3f0f64e799dbecb8 +c0a871e3067e1029 +bfc9c846cd2bc889 +bef817580be4fbf1 +3f410481a0d81ed7 +40c5fe225633bf4f +3fd7891ebc06daa1 +c12de105b7df7300 +40e1646bdc820823 +3fb1f21723fd1a7b +3f6356b759b66980 +c0a92d852b3662c4 +c0068910da24d2fa +41240c417e2d43bb +beec65172d0f5663 +c026c543d98b29c7 +41056f81c83076aa +bef9b406be5e4ad2 +412657f3768d906c +3eec649fa53443f5 +c119a8571543c2d9 +3fd7d07c7edece5a +3fb591c6e982a18c +c0e77900d7393e7a +c027b5d379fdff96 +bf90d9dd20f559f0 +40bdfe9ca34f440d +401e3b4e9ac05776 +410af4d7bb642532 +3ee8dc73cd0d9353 +c022dacc04e73dee +3fea2d63ec593e9d +3f6c21a9a5599507 +bf4a1c5e6cfa5f41 +bed32c809fc42674 +3ec660795cd151a7 +4026c8215d571220 +4092093ef2ee90e8 +c0f45c553f577c90 +c089ae8ed28afc01 +410709ea919ab155 +bef1b82e464f23ac +bf3b8bd1e66449d0 +3fe927802d0d43bb +c093f8a9fdf897ab +3fd4cd291647a6cf +40b149b75a9e354a +becd05300fa39466 +3f5853af4add1254 +bf605091da52ff6d +c0276fa82499b7af +c04700723904285f +bf7928bc464cfa3c +c020379c2ba3eb5a +40b3d84fa5a44beb +bf50459d67a9bdcf +41061097de42ff29 +c011f07260f4d5a7 +bfb87d559181b7c1 +408a5c3bdaa492bd +c0e44f1222aeb2f0 +c04afd19906b735b +3f29ae1b7c889160 +40dc0912e8defeb6 +c02e813776c21c4e +3f17e6f0e974ab42 +bfdbf6d0343582fa +3f612efe479c5239 +3ec2b58ba8010537 +bfd1e68a15d3726f +410a79f706ee47e2 +bfb501dfa917120e +c11e7cd9ecd85988 +3fe3e646c176e361 +bf9a0299b790636a +3f0cc987c7aa2004 +403195a33dd27350 +3fc72dad8fd683b8 +40736f10a521284a +40275a2144af409b +3f10589f002a3c2e +bfaf3376734240f5 +c0d95994e4980c41 +bfb0739da8c2ee4a +40852e72a1ce202f +c08d7438301acbeb +3f4906ee34cf1ca7 +3f05543cdf8eb948 +3ebe5e5df9a14591 +3fa78ec22a6ae8e6 +c100791271257976 +3f18e6c032e3ff43 +3ecb404c090b45df +404a2111a3c19a5b +3f80de06b5ea0968 +40d71f9007f22eb7 +3f287ac18c4eea34 +3eb0167117b37726 +c076cf73c0502439 +bec0f1add7b7a4d5 +4013668b2d3245c0 +3ef097438d5a4cd4 +40b2e7c9fe6d1943 +beb41ae2e92cccf2 +4037e0c6c2a6f3c6 +4016c1e5f4d6eabb +3ec2b05e26ecadd3 +3fb0a3b4b1f17d21 +3ec12ca3c1a82811 +c07c911287b055cc +bfdbbf1a4e0a2259 +3f708e5de83a1c69 +c0d536a288a1fd6e +bff48cf5cd37a055 +408c5b1fba3e917a +3f9c2727e078f28a +c012d340cf2b7254 +3f4056967f4a1400 +4106a13e150f3c32 +c11271b7902807fb +c0f4a6d2203fc831 +408524eefb1b0151 +4087f81cf738a230 +3f12a63e6321595c +c07f5d0d39d0e156 +beb2bf5f47cf3307 +bfb4b32351912e2a +405d6aea11f9b251 +bf611fa173bcb1e5 +410ab8950e764965 +c07b36ee17faa2ac +40c0979780755693 +40e881d78fd61cc3 +3f5172d07d1046af +3f6112547bb822eb +c0fe1dcd777a2cbe +bff10b9584bc4a53 +40eb38af8393bc68 +40d11a465b535103 +c1147d16369bb21a +40a2bf9beca39732 +3f90195009eea746 +beb7111903c6f20e +3ef9239d6795e234 +c12d86449aaa9df5 +c1054c6a10909ca4 +c0666e9c4545fa85 +40b79a108368d7b5 +3f0446128bcb02de +3f3ba96cf2ed6ec0 +c004f0c65df5d659 +40d2661a7de5f054 +c0abd1f0cdaa4386 +3ef4aa3831e2461c +bf063fd2b8b08443 +3f1adc788b17fb01 +40c4f2ccf7381ab1 +3fa233273088638c +3fa29a4ba0031c54 +3f62d93044e796c5 +c0bcefc3a18fb18b +bff6e17372acb1e9 +3fe8ca1e7af0f0bf +bf3ef6e7fab304ed +c0a2f34a994cb36a +3fc82ff63228066f +3fe7ebd9a3df1915 +c002ad68648b15b4 +3ece62408c1b4dd0 +bfd08a92cf1853d6 +3fbe91a235b8cb47 +3eb723d38e77c416 +c027c07e9295061f +408c152376394406 +3f2e88aeab12c926 +c0165c80db6dfcb5 +bf257cd762e80947 +3f4bcfcce75e896e +40c6535642ed5886 +3fd82cc92d65e8de +bf4bf6f833588bcb +c0b121048147d6f7 +bf3e0e5f78f0b8a0 +3edca920e8fb6aad +3fdc83848366a59e +bf902ef1b94dd326 +3ee0fdc15c1b420b +407241a1c972f09b +c0d620dfaa61ae0a +bec4082ee239cf73 +c0ec4a9879a6930f +c0e9be0f38f1037d +403062d98fd3b952 +c074cd7c46e25b21 +c032c21f9aec7ee1 +3f94dd7e339141dd +c0e071a82a06aa3b +bf599a47d05719d5 +c09e77c3cc06ee30 +bf20dce6d8408524 +c10f6bac0df4ea64 +c122cc925b52e358 +c03613b3ce8409df +bfe78857307c7707 +3f60ce102fa8830f +bf41fb219dfb42d6 +c0f8512cb7dcde06 +c091243df91ef154 +c0e420abe95da54e +3ff1850a5f1ec889 +3f5ce52e8e2ddd87 +3fa27b2d6ecc35fd +c0b2b038060b991e +bee615014a1556fa +c05bc57acc508c69 +3fb04f9a86da94f5 +bf5dcec5446befe6 +bff591389983020d +bfd128f04461b1f3 +40928f0db67e4b91 +bffca39c82fddd0f +40eb9dfb780e8198 +4062b4f927faeb7e +3f8cd767cda263d3 +bf10c4b0ae58f165 +bf5329a27e8d0196 +c0205bbf24741bda +411fa069bc1f5679 +c0527933a6f0a2a7 +400571907993333a +bec76c838ae79e74 +beb893730f143d0e +41143368449099d5 +3f7536b807e1ab4a +3ef96602c1bb7ea8 +c021337a87b68a99 +bf80cc94d038abbd +bfd0ecd3d84fc3f5 +3ee31f78c2baed6e +3ef82d3456e4a89f +c0be2d2e8f974c78 +bf99dab0e07ddb33 +40c875ebdde2ce4c +4120999f029e02b0 +3fb00dcd30e2a498 +3f1a03a0c49ef75c +3f448769190f51d1 +bf66a68699e3b90a +bec795f7e8a0c915 +bfd1c7fa717d0cd8 +3f7887c6f1d3a391 +3f7268bc2eae4d66 +c031cd4e83079775 +3f456e15a989a40a +c00f72f1daa9f451 +3ec341925ae50c8f +bee57784a2f2593e +bfbce631c31888e8 +4010aabe055bdc65 +bf8cade406d9cee0 +c1053620c385eef3 +40e44b04020d4045 +3f29c13ef284e456 +bf362d0712f70067 +3fb2e69f9be44c27 +3ef589c775833a88 +408c41c73c1a9d07 +bee11979e4cc8566 +3fa609227c2488c4 +bf3405451c96cd3c +3ed13a708e39848a +3f92f31d24cb8f63 +40244d14194eb208 +bff5a92f2db600a2 +bef4ce0bf83e0091 +c087e16a0274bbc3 +3f03e6d6e1934924 +3f85aa0768347d1a +c11475c6e5661207 +bebaa710a8b43e07 +4020695613429b56 +4054d4420269403d +4021b546c5f45a18 +3fa3f17c25e9c259 +bff7a80dbb12741c +3fed06cf2b6e5951 +c02284103970610b +c0a3b2debc9d31ee +bf6706a3adaff484 +40fb19cbb09fb7ac +c0df94069fb8828d +c04eb87c38848811 +3fc70b879639cf2f +bfcc450467229794 +bee64f74aec50490 +beb4d8f9ed81ece7 +41215ccb4bb19f0d +403b5b8f755bef55 +40f608d05605ab82 +3ec34eeec8497c31 +3f36c41eaa388b76 +3f0e3279657edd2f +4109292a31cef695 +bf197162e048a347 +40a8a683f5d8850a +40e3861f15751285 +c0eeab55e29b4778 +bef64c5305cd1480 +bf69baad748e2bb1 +bed5577c01ae7ad1 +c0d2daacb1b739d8 +4004b10e8c8ea1e0 +3efcc76e596a1642 +4086084bcfe3b50c +7ff8000000000000 +7ff0000000000000 +fff0000000000000 +0000000000000000 +8000000000000000 +@sqrt 1255 8eccb847d93b4bdb +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff6a09e667f3bcd +3fe6a09e667f3bcd +40094c583ada5b53 +3ffa61298e1e069c +3ffc5bf891b4ef6a +1e60000000000000 +2000000000000000 +5fefffffffffffff +1e60000000000000 +1f86a09e667f3bcd +20b0000000000000 +21d6a09e667f3bcd +2300000000000000 +2426a09e667f3bcd +2550000000000000 +2676a09e667f3bcd +27a0000000000000 +28c6a09e667f3bcd +29f0000000000000 +2b16a09e667f3bcd +2c40000000000000 +2d66a09e667f3bcd +2e90000000000000 +2fb6a09e667f3bcd +30e0000000000000 +3206a09e667f3bcd +3330000000000000 +3456a09e667f3bcd +3580000000000000 +36a6a09e667f3bcd +37d0000000000000 +38f6a09e667f3bcd +3a20000000000000 +3b46a09e667f3bcd +3c70000000000000 +3d96a09e667f3bcd +3ec0000000000000 +3fe6a09e667f3bcd +4110000000000000 +4236a09e667f3bcd +4360000000000000 +4486a09e667f3bcd +45b0000000000000 +46d6a09e667f3bcd +4800000000000000 +4926a09e667f3bcd +4a50000000000000 +4b76a09e667f3bcd +4ca0000000000000 +4dc6a09e667f3bcd +4ef0000000000000 +5016a09e667f3bcd +5140000000000000 +5266a09e667f3bcd +5390000000000000 +54b6a09e667f3bcd +55e0000000000000 +5706a09e667f3bcd +5830000000000000 +5956a09e667f3bcd +5a80000000000000 +5ba6a09e667f3bcd +5cd0000000000000 +5df6a09e667f3bcd +5f20000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000001 +3fefffffffffffff +3ff0000000000001 +3feffffffffffffe +3ff0000000000002 +3feffffffffffffe +3ff0000000000002 +3feffffffffffffd +3ff0000000000003 +3feffffffffffffd +3ff0000000000003 +3feffffffffffffc +3ff0000000000004 +3feffffffffffffc +3ff0000000000004 +3feffffffffffffb +3ff0000000000005 +3feffffffffffffb +3ff0000000000005 +3feffffffffffffa +3ff0000000000006 +3feffffffffffffa +3ff0000000000006 +3feffffffffffff9 +3ff0000000000007 +3feffffffffffff9 +3ff0000000000007 +3feffffffffffff8 +3ff0000000000008 +3feffffffffffff8 +3ff0000000000008 +3feffffffffffff7 +3ff0000000000009 +3feffffffffffff7 +3ff0000000000009 +3feffffffffffff6 +3ff000000000000a +3feffffffffffff6 +3ff000000000000a +3feffffffffffff5 +3ff000000000000b +3feffffffffffff5 +3ff000000000000b +3feffffffffffff4 +3ff000000000000c +3feffffffffffff4 +3ff000000000000c +3feffffffffffff3 +3ff000000000000d +3feffffffffffff3 +3ff000000000000d +3feffffffffffff2 +3ff000000000000e +3feffffffffffff2 +3ff000000000000e +3feffffffffffff1 +3ff000000000000f +3feffffffffffff1 +3ff000000000000f +3feffffffffffff0 +3ff0000000000010 +3feffffffffffff0 +3ff0000000000010 +3fefffffffffffef +3ff0000000000011 +3fefffffffffffef +3ff0000000000011 +3fefffffffffffee +3ff0000000000012 +3fefffffffffffee +3ff0000000000012 +3fefffffffffffed +3ff0000000000013 +3fefffffffffffed +3ff0000000000013 +3fefffffffffffec +3ff0000000000014 +3fefffffffffffec +3ff0000000000014 +3fefffffffffffeb +3ff0000000000015 +3fefffffffffffeb +3ff0000000000015 +3fefffffffffffea +3ff0000000000016 +3fefffffffffffea +3ff0000000000016 +3fefffffffffffe9 +3ff0000000000017 +3fefffffffffffe9 +3ff0000000000017 +3fefffffffffffe8 +3ff0000000000018 +3fefffffffffffe8 +3ff0000000000018 +3fefffffffffffe7 +3ff0000000000019 +3fefffffffffffe7 +3ff0000000000019 +3fefffffffffffe6 +3ff000000000001a +3fefffffffffffe6 +3ff000000000001a +3fefffffffffffe5 +3ff000000000001b +3fefffffffffffe5 +3ff000000000001b +3fefffffffffffe4 +3ff000000000001c +3fefffffffffffe4 +3ff000000000001c +3fefffffffffffe3 +3ff000000000001d +3fefffffffffffe3 +3ff000000000001d +3fefffffffffffe2 +3ff000000000001e +3fefffffffffffe2 +3ff000000000001e +3fefffffffffffe1 +3ff000000000001f +3fefffffffffffe1 +3ff000000000001f +3fefffffffffffe0 +3ff0000000000020 +3fefffffffffffe0 +3fefe488a57b0c1f +3feea9b7c80aca3f +3fed7b0a7e32b3dd +3ff0a4458897ab8a +3fefe488a578c9df +3feea9b7c7fc6ed3 +3fed7b0a7e192ef9 +3ff0a445889e4891 +3fefe43a7f2e03ca +3feea7c85f198823 +3fed779a339fc269 +3ff0a529af44791a +3fefe49db25025cb +3feeaa3dacc6805a +3fed7bf880a0b293 +3ff0a407da901a77 +3fefe4a1ba78205b +3feeaa5757a5a269 +3fed7c262235fbfe +3ff0a3fc0761ca06 +3fefe489a79b137b +3feea9be30c5ebf0 +3fed7b15e287f52c +3ff0a44294cff99a +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +2bd02f2248c8989c +335d8aa53014d2a9 +3a98f60b01981eb7 +409b08bcd656448c +49698f1c1ac5c12f +3e3006eee68a03a8 +52356cf13aa5f892 +2f1c93d77a8aa875 +3b5bb92c256b527d +40c0f4d5ffc3d814 +2e9540f3d9eb740b +409015d660cdc16e +563f3404cdf1d299 +4ec36a1a07d3f9f9 +5059a69bbd8f4661 +28785f2fa21aa9e5 +4175571c8d23dfad +33d105521424ce59 +235e324e2884f717 +20c80260c79d0b69 +3d1ce9d74b33267a +40e1665d81322c31 +3891f8524ba51132 +4779516f2de11012 +324d8f0417d16619 +41ddca428997652e +4339904e88f319c7 +2e5f531ef30d6565 +4450253e59a2f1b5 +26babb62bcc36939 +222ee21140ac0174 +5b40aba34d313067 +4f8ace9f1be66094 +5d75b68c2e4bf397 +50aad6e943fabd99 +33da8f31d884022e +380d8605dc170d5f +28b03318b604b956 +5c66d7c0934de049 +4de00a98c85de439 +49949901134c8354 +5d3001526610ab4c +2910cb82ffdbd63e +5241f97708b88efc +3ebf5a46f7324f92 +26994290929ab3dc +4ca921ba83a1c590 +4d3941b0289b4490 +38bde316ab9703d3 +38f160bce0f8ed7a +5224b90e6b283768 +24035dda989f7d9d +2a031b8bebf9fe97 +3b15da8eaf926b65 +555264886dd5e865 +476574f512661d23 +227406c4186a69b9 +3eab03045967c060 +40d667f9909523b7 +30d01b739ab99eb3 +516090260eb33e2c +4bf9ea420c2b21b5 +4d1cdc4fc4c80b6e +50c76feaf16b77bd +5cc30b724b9e9cbd +25577ae300b0d3b0 +547379bd63dbb238 +347b0141897f4245 +2e40d57b4157402d +3ddee5f03b1e90a0 +435877e7d9f86f63 +5d6cb65c46ece20c +3f02f02eb41df775 +4a0065362aa8cde9 +52c3e29dfa7f015a +337ce8c99272ff5a +36d2775885ce8fd7 +2ef2233653a1fa1d +45d05d28441c561e +2891f0e7680a9a0f +21c8bd35ca2193b2 +53aa0dc951195f10 +21903c71ed919d57 +569719f152370113 +41dac4b4b6e9395e +5b1005f7d77258b3 +40e6a40a72cf3acd +254379c17c290526 +357d59486975a3e1 +4031b17deedc3ceb +2d39f6bb9aa323e0 +294053ba4a0f6afa +2f93f40d6909a275 +4b6210926e5e239d +586a4d84724f01b2 +2bbdf83a1ba13a92 +36b379b5582491dc +4eec466231d72694 +250dbbb0b689b9c6 +48613e55f0823073 +47b83c939b4b39fb +5ef1701c8a590d6c +22604446f46b754c +2a12bc1937e1d472 +5e62d058c4d5af03 +27767364afef2946 +52b271dbef559d48 +47ab05d409284b94 +334f7e6c7be7d4c6 +2d96ec2c5245817f +4e3b8a9d9b970ae2 +47541bc137d771fa +41dacfbed85643d0 +49ae0c105ca897c3 +4d207d651b703645 +3f9e502928f65599 +5b0c14791efb4e0e +3e0f80cf2aa2cc60 +3febcbb4d0474db6 +59f0909996cff850 +270dbe9178b025a5 +487d29698d818afa +46b492a5d11103c4 +47a6049370dda2c1 +2bd960f664057746 +57d020bb7a00c5a4 +4a571c6b3ff8fe4a +47fae93e0891db4f +4899c25f37a0ec1e +48395089aafcab7d +33ff12fd73d60625 +2dda7c6f339b5d5b +3731473659d35770 +2dfb700a7f8f29c2 +5a4bf27b08d3a875 +37c0ac46154200b7 +5bc59474ae553da3 +41793b14e9687fa3 +55089d2599939e4f +4772236f5f0af5b2 +3f854e9d517c046d +4fa3aa2aca403b3a +52ce5199fc2f5442 +32e51c10c4ddf0d6 +329babad653c7443 +54f2d2788008f26e +52cc61d92bd6c883 +4c435dc074243d22 +2656b53fedc48f58 +50a5ca75d1f37332 +452e9f156884ff17 +559f3c612b66cdce +22d72d5e262a356e +5b347bc508e7a89c +3c53cf1898cabcb6 +4504084946986a45 +3184ca571e5ed489 +25e3af3f86b4ce3c +27d1fafbf28cbcdb +31d3646ac747fd1c +56dcb7371f8578fb +46ae0f559415fd77 +564a4f68c558a0ce +402e2ef038e358ce +4a33dc777881717b +30de6fd81d9d0a09 +2417fa200a4e98c7 +354597a89fb1babe +217eba1e125ef02b +3e6397a270a0c6a4 +59513c24d1646943 +254e7ceb14fe79a6 +487e684e37e4060d +588c659ad54e9813 +24bbaa1b5080fcb1 +4fddc4eb85803091 +2431e3730e888751 +52b7537cb09e210f +325810b54fcd4934 +4365d807444cc1c6 +32b973f9217d0951 +425044da58414f83 +39c685dcab8339d0 +5e52f05017b11d43 +517542003e01184c +2970e8b8f1ae74cc +31c9c41cebcb4269 +47ee080758f4aa3e +5102e3a5900c9375 +4d996dfa02eb866e +3ca0be87bfdb9767 +4607d9bfd6a8e7ff +4477567d0caae5c6 +3759b3eccfa601d2 +4b76de5537241fad +29711cdf2766fe09 +3a4884e015f5b2ea +44d64c4eea9e02b7 +4a4bb9e7ab85575e +5e1bf543bb7387a3 +5739b7368918b6bd +4212833c5d45a612 +3c562665e1988905 +368bad9d30e4c409 +26b125b2424a48b1 +481a571420efc56d +3ed1d832a2881324 +5173c25a60aaf9a2 +2bcb3226ea717307 +2b193b0437307963 +388a35e5ef78e09a +2a0eedc2f3ba323b +4190052facd82950 +2850b0adc02c0c56 +456147d418e0a9e6 +41cff6ac7216560c +267b483879cecd8f +34e08896207e4bce +4c134e09b2c01866 +51f72e26e14c61b1 +4ca0ff93b373e569 +40c70f8cb465aa95 +2b4bf1e75b428337 +253d324ca337af0e +5b19d0c7c8a72262 +26b28bba930b42ff +4416a70e8418322f +4445b88657833401 +30d4b43a5667025e +447facdd932afe5f +449dac910652b66b +2c54710338f790ac +38fd23e6d4a3299a +5b86d292be64a9a7 +3ee9430cb384f95f +23b878a27d4e7968 +24db35db936097a1 +44f24ae70d8ef779 +5811b7881e9e0482 +5cac66981cde6362 +4d2463f919d67e45 +385a3d2171e9df54 +4d5a7bb2b5fd9a4e +2e0a5056df0a321b +4a579099af5cfb64 +29c6c61a8eabff4a +5b1188e361907658 +3a39e85a5184a7a7 +5e5657979236274f +434525673bbfb8ea +3e3d681019cc228f +2a5867b90f122ec8 +5db774d0cf2a9d0d +29afbdd24bae7f21 +2f378092dc8c52a9 +5410c4ed6ac7c65b +5b14f97f7cf29bb7 +2b07027f5b3cd1ec +303473149c0ef06f +4db85144186554b1 +53b8d4a6cd6aa4dc +30d36a488d54bda1 +35ce10083df8fdc7 +36f777823fab2f90 +509f73518c979d5b +30cb0cc910a6b0b1 +53f3fb4ab92f8a07 +4a5025e75cbeef4e +4e43cd36b5786d6b +48a2012b255eb1f6 +291a7c2434ac62f6 +373019279805e906 +45f22036db8f0aec +37b01a315cb893d1 +3c7282269ccb593d +51d2b98ae118743c +4616ac90e6d4b73c +2bd49a6cb762a75f +431a8f175db870bf +5b8132c509d1a3d9 +58ac299f3bfb3901 +42f03524e8f36204 +4d4090a1e71ceaf3 +4260b9b47f9ea4ea +449241668e5ebd74 +58657c5d3e01edca +2c9695a39831769a +31a9200c9bd51547 +4079ad6892af6267 +4ee194b35898387e +460483168d2b4002 +49c689bd7f74a69b +52499d4f70c6bb6e +5a2cf0076aaf90ff +39dee91d043202be +28bc62d7f1eb3a3d +4cdaa5d8cbecfac8 +21ea804ad70802b8 +2a7775825cd3a6b6 +3009ddd52475902c +39f2c0deb092b978 +48a023d2522658f0 +316f864914a2ef1b +2bde4ddede10c77f +531a5f3f14ae4e36 +2d9a8a3a91f4279b +3ba5c24f0da1d844 +570b405815b77f15 +39149a771071d3e9 +38d81bd000ac6ac4 +2194267dc8d4d20e +3f7a0eb672c665c0 +54663f2c483de37a +35401b0978ce5387 +212c32e5cbb997bf +28f3fca8d463470a +4c3c79bf00ff238c +337fe37f669784d6 +36f9bb4a835c3ee6 +530a4890b8bc5bc9 +4cd626da9cc8d2b4 +3d3c738c38f7d866 +5024a9574b69682b +2f74a16b2d02b274 +2a55dba78983da8d +50d452080916e8b8 +315f450573e61831 +217ff77c3aa74ebb +43d03c3dd9425f91 +39a69970a9618ca5 +313056bd4b967f95 +2315598fbbc7535a +4cf7dabd6458e5df +20bd9dc664a31836 +4a24f073f7b2c161 +39dfed0881a6638b +406c25ad680d16d3 +508201b992fc4a19 +3970b7b9a105a915 +2630f2c2f4a1b09f +3c784faa4386aa92 +2cc2631c0434b998 +41d0b28536c43f11 +28d2f762bcc72939 +41213a5d5e5607c7 +57c59f48da49ad69 +45fa19ea3e54be82 +2a91a05014982454 +5a010313aca1cfad +54dce2b5ae6614a5 +5ccd506bc4c370ce +3b529162149d88d7 +55bcbab94dfe6fff +25d3c4a873c102cb +348278c5c6b65ff1 +50477627001a0615 +3226f290c44ac401 +4682ee79ac1940cf +48355ea3833cbf77 +23a89f66a9abcb8c +3f8acd66109cb71f +5653e823b4dfa0de +2964f77b11c4c452 +2a762b0ef0c9de07 +4d34a53d9dcfa1bd +3948ea53299b5a42 +2ca4497d9f588ba5 +3d9875149dbd964f +2df4c092d16b10b1 +3793c3ae555bbc37 +252ab5b0b93932b4 +35f2a0e6dab7f82e +49b6cfe93791dca0 +5ad66120f9160a71 +2610e77295c19157 +322962a128652cf4 +45d8dc9ba45606eb +5317d1c16bdb2d38 +415306207907e9ce +41ea7b5a75b8cbbe +35fa7b0531e32c6c +41ece97a64bc6cab +33dd0794d2e50636 +3a23aaab5b84e86d +4b3056ffe49bfa22 +2ae3be2312798134 +3c67c367a34122ca +48c264788a49be9d +2810b574d8db7602 +3d647e35a6056207 +43c8224f445d2e8f +3d50a97d42cfe862 +47e067c5c6970e34 +52e2874513f5d052 +2aa272053bd44ba5 +2f1904ced5189d56 +26a78e998f34fa75 +3903485c397657ed +381169efc396c10c +583dd64fa1b87cf4 +5b3aa0ebb27d9675 +3c71ff0a96c9bbe1 +3740d44087f6732c +3d505586b1a72e96 +444ba125935f26b5 +3fd3e84d8e23c779 +46c4654e9a4ff411 +386e4c4b63b44f0e +4dbc591739ff03df +5e12606537f529aa +51bb33be43ce876d +40c90ebdc6b18c0a +5039fa9dad36a782 +4a03a8672905a974 +5a5065d7d5781549 +5c0d17cdd5cfb352 +41a075e63c90bd4c +4b759aa97cdb916d +246883c0c58876c4 +23808bef165c9e30 +365b52ad194e4446 +31127b5049f470af +48615ba09b33ca9c +3435d29fdb998842 +2dcf1ec4f398e636 +2ff23195f28934c2 +2f85667a06448803 +24e08cebdd95c022 +33964c56c215a1b0 +282055e49331a5cf +426445f095e5179e +5d43a390b616b7b5 +37084c0aeac31ffd +2d246f9c04f1dcd0 +3f7622d5397def50 +5687024dbc39b5aa +41f8f0ff6aaa62eb +21f89df3322fcbbf +2858c6c1478b7b7b +4290aa83ee32319b +5069d0f136a4307f +2e1557823ccfbdb9 +3ff131450fb19175 +37b1a93b293187e0 +537247b430088bd1 +3870b39efe1f239a +4dde5b5e29a80754 +554a1ab85ffb060a +3d1671f9540c940d +4e039f6a1badbc44 +5e9c575a29167888 +4394fed298562fc5 +417a4717f2011b09 +3f9e75e9ce511f62 +275cea6c3737cb0d +2bce8c7617a71c71 +5086b7b823ac98ab +3cc5e330da7930f5 +5e04941f4fbde668 +3384840f4298cdae +4c652013651bc27c +5ac248f6c3a59285 +5dc29ad218661362 +39ed58dfb40a6a95 +5d271a3e184cae15 +309dd7c179e2507f +2bc2601a7cf66dcd +2e40075f5ef05567 +560bb437bc0c7789 +3ffd3efb2d72943e +58ef602963cea009 +2d5a88e6fe6f8215 +5bb55385da5b167c +58bf0132a74c6c23 +242ada8fdc5354d3 +21d327fa58bdaa90 +28f38f8a9ade7c7b +38f66d893ccb9c5d +2aef5daf5d430f23 +27954e3d58c9f2bf +3b1fdf3dba95f56c +27fcad7513b1f8b5 +286028499bc252a0 +553054136f01fd78 +30413d059de97fd6 +559d6cd408e92488 +24875d8f24ae4824 +512fa3f5d4e7d4db +306aa764163931e6 +4651533983624e8d +55a0a106048df433 +243f1259f9bf7865 +4e62ff82a9baa8c1 +231235b688ba2722 +26ceaf46e2964ecc +5cd6ac6b811475f4 +2f252288cd248923 +3435786a23b7daef +50745fc155f9110b +2652fafd563ecd06 +5c9dc44724160e3b +3e86fb590cbf6a7e +47b73eb7a15f8389 +51a67377e19e1fb5 +5ee57d648ed192cb +4a5af0f297eb9114 +3156f1c60fd6752e +4c9316feafb6f46c +40aa779654e066b7 +456ab8eed7e7c6e7 +3990ae58c9ab9ee8 +4b467017aaebb117 +3c4265df545142c0 +26b2f41f396c6721 +439a9916acdec9db +321d1b61c2de87d9 +344cffaef98cdab4 +571db1a761a34ee4 +442de6b0e01dbe4a +48bf3ca1bdc855d5 +2e2618b5a257b829 +3d3dea7a6a5e406d +333c634b9d7d4142 +46403a79e5def41c +2573a41a8955abcd +2ccb873c8f6c16bc +4548dbe50a4b77b4 +2970956cdccf7ec7 +4f2b1156d6a14352 +5343bde928ace1ec +39990c746a318a62 +4683b00832fca3da +42e49687f509f034 +4b54f029962c1e30 +42941de332df118e +362c22fde43aeb9f +3482626069ced825 +246aa7084d3ca385 +41d62e7b09745968 +47ff2dcd610ac77a +2432052e28541779 +4e945a68afd71216 +3baebc75adcb5538 +22d017cf5dabfe46 +4e1b1b0f92f6c338 +5cef65fbda59d855 +50f90ddce853a6b2 +4928bd1a8e968cc7 +5694a9a8cdd1f4f0 +48c6190dbe4bba7a +55254f6430f55aff +50f5a09050c05028 +5c056a200e7e0525 +5ed428f2a0b261c4 +5c5989bfa44724a4 +20b71f80866efaa1 +52f01267374c142d +351cc34a02b90613 +4382a87460eef282 +53813c534b576cd5 +389e586c516c2b8e +448de116ad15f8de +2ba0a22b8cbb6db0 +26f16564dad52e83 +4f6721d480aae8ac +4c2c7d59f5c4a7d0 +477b7741e7f9254f +2fb19d53c94e47a9 +291a0e4c6e21ed33 +2b261c694d53d353 +5e646812f6584eaf +4874621141eea1d7 +35c2ef1829ec8fa0 +26d2d83921f482e6 +322d041d2fa90d80 +5624655dc8123311 +566b396dcf50b91c +4ef2ea027078a48f +50ba6b1dc3a63cde +50603d7afaf1f4bd +42da34e3afe9a3e2 +3a2dd8cd7efe22b8 +38e1d65e344d2924 +333372d126ddb5b0 +4940b50e8b3a31ad +25bfd943559c4c3b +506321737763a888 +5139665c716183f7 +41c680e887cf5f1b +2db767db70985ac2 +4d70d8810947d140 +58a98021c771a3fd +3dfdd09f811651bc +3edb77de6841ee0e +3331ade35eea6cb8 +518a6be19ce895c5 +31cefdd37d324d05 +463d4c37d0c503ae +4cb5d3859a2bea8f +5168aff61692d155 +4970f3c6aa36e149 +32f4a5ce4aa6ec59 +4a9ed95b724a9a0c +55851774b3393126 +4345024abe610812 +281030146f2ef64c +287a0ab4745e7f5b +4c84b29953a394dc +5b590bb821caaae8 +540d91092a816c28 +2f8f43eefa29908f +294fd6924e641285 +4b5c9844ee989145 +30886486d6856013 +2bb90f9fc04c3e7a +27ff0ef2aa75d847 +442969a789973ebd +28408bea013839bc +2954533ea0364945 +43f88a00ff86b629 +446f8a0fcd9737c0 +27777c05ffb185e7 +409334e3594e279a +5f0ce22a08150bcc +5a290eda962d18d8 +27e4faf62753f4cc +2ee8baf91ec8a719 +38b85d44f15b8a3f +451e1509617f4328 +48f62af4266568ba +4a8e6aca783d1c46 +5793345f04c67729 +2de3cde19e60bc7b +4695d0e771875355 +4a81f8f67633679a +3491d1c48a622501 +4b5f114e64acd3a3 +2428056fe3935628 +3dfa2c755be94f07 +492a06c6e328c985 +4ee16043e6268944 +487dc2e88d17e716 +4d159018860ba524 +48b641fa321aef70 +3a1a00985ad017af +4f9351abfac8e746 +51c5f02e53e59dc1 +44a9bb3fdf60261b +2b82601f1ba0697a +4d7267bf429f93cf +28b284697fa6fbf2 +509d19a72442e76f +278370eacdc97fe8 +3ca96887a2e65618 +32a8db8f77a0edfd +25866e8f31cfe305 +3a0c1b2dae662218 +3a73433fa6318771 +56229ebc2ec50b76 +54388ccb63419a69 +2275cf87020fc67c +5839234f8529e9d4 +4523cb12612bece3 +4d7ca4f38b6826db +3c93e1b34d8074df +52f5e187b35d94b0 +3215c54acd36749b +4d36dce4fcd795ee +48d82c9dd6912d3c +49bd8b7e35eb300d +331340397906f8a5 +5c1dab440011b635 +56dd1d37f9678d47 +3382cc6ab8a017f7 +4d6a0d5d9812c627 +2a05204fc46d941b +54995628564a8f72 +4726d235ada59aac +4389fd63ce6fa31b +2751990a85fff6b5 +33c8e4bb3ffef013 +34aa78a350fbdbb0 +44193d5631fa9d0c +2de391445d798228 +3599e4c85ad9c62b +3d52d06ff9bad3ce +3d0829f12d78d2bc +26f0fd072b27d052 +40880dd0efda5059 +355299907661d581 +48b80370025198b9 +5634967f09d769e5 +21f88c3c7a63aee1 +570c77b75061522f +5640915f0ad58586 +397ae0ebb90a7b2a +3c2fa107bb01f504 +50514634f87bca55 +2aaa713e5498e734 +5b64cf9cca2c306e +3c416c891d451fc6 +52e13bced39c4ac0 +2e4669b6061f979d +4c769c441008c45f +5a117b4085e3099a +31f098f26180b760 +5b3d8fc648bc2153 +2dc9aa9b231848ad +2d2589616b85bb40 +37b9320431f6e7c1 +504b3fe8c555c075 +58627997d004ca8d +35535928ad533328 +588b29f03a233be9 +2f1fa93a410b0030 +530dbaf592cca592 +46ffa7ec9172b7af +54f6923298e2b0a6 +47b57c1f83c612e9 +4c2b1b3356b238b3 +578f45746d5b5e8b +3fd167b12cf9fb19 +514df073261b6d96 +4e5736b8e14ad54b +2bd7fec84b86707d +308547deb3317d65 +39f6b7012210c0ed +45e863304983088a +57b6150e4d108981 +2cbd153bdbdd49ce +3fac687c6858b419 +53d002b4f4d8c78a +35d8cfb00e5d7f7a +2b4db6beb499e610 +49105c833c0b6896 +3e879ae2636c3f3a +481da8b3836ef6d0 +221c1e04372a8187 +37adaa57d8e0b38a +4bd146893bd28a97 +23a7649d4a3a4eac +5e45604221f65cc8 +4f4dfd7b69434303 +4117a27bbec9ce84 +334346b6bb41f2d9 +440587a1f43f314d +5f142017b31df23c +2cf0b89b52151135 +4884cf887a43921e +39c12c41c8d3533f +51db5e1ae4961ac1 +5358c6cc65b078d6 +38772a35bc2ae326 +575f945401cad5bd +3689d9f72c431ac4 +559b408fd05cf533 +3f48f19a1f50215c +3f66e0d69db6fc7b +527e1176e8ae0695 +2eb783a7a3a0c87e +2e59a403e7328bf7 +33800dba128bf6fb +29e01b3462dfeb9c +4e9512db42e9b46e +20bcf721dd601530 +57f199dda027015e +5b0a56fd88cb7d8d +2157addd10df3a32 +238b26c232637cd9 +4a06ee371ddc32be +3df93034338d0b92 +3c0e301977a8afc8 +36bcb2d3811da330 +4386ce1f7fdfb3f3 +268affc5cb6e407e +48783df6a85ee785 +26ad93caaa708cb3 +3258d5080e5b2aed +20c3365b3443e96f +3af23c410e43144d +453f18dc96ded906 +4f8ab737f4d3e435 +3cf59bc72136489c +37bc3c3dc2bb463f +31516664e2c397d5 +39ea70bc2c34796e +3ed5a695eae4361d +3a9953343d1824a0 +3dae9581233c0e9f +3e8b76fb93add5b2 +3afa361522cb1a3e +26055d261d39ae9f +540b5c270e76660c +3c54a8be4f127165 +5324d27a81425799 +331c6d7083d018ed +4997d8e953cf2ac8 +2bbdce0e356d7fb9 +425420a0cacbc9d9 +54a9afd1480d39ec +49d818506484ef19 +47a001f89d7c6892 +34d469a56f97bf13 +5b37e1a2950ac531 +4c3a99ea0daf26e8 +5bd0815c6a2e81d0 +51a20114e38b1709 +46fc9d19f7c896e3 +46ec7f9715340704 +3e213709be2be3bf +51b169ec4225476b +442e9d9a8a20ad61 +31c8ed6c30e4ae17 +59bb04b3250c0adb +538a823a6eae40fd +5a7d66729dc47327 +349f56074a2d88bd +4a8587c0487382aa +40342900c58bdcad +2753c6b0519499c1 +32d28c5eb39071d2 +2d7cdbf7daf53861 +483193c461f01882 +416b92a24524f307 +28f15be10e88a7b6 +51389dde5ad973dd +2abb4769d7e913a5 +5e24ac3591d4829c +302233789224bae0 +235f29f9d3ff6d92 +2bb9200305d0f657 +5af7c2e100141cf0 +44e7c563b2e74194 +3405dd51e7306e88 +521f18538aa7311a +5cc39fbe77b7b929 +3ab633aef8168330 +3c16c665ff80af6e +35d270799e62ef1d +2c645c749e53afa2 +57c390ebb15c9cf7 +4bcb5c49bc8b41b8 +3d71329472d12710 +3bbb7f405ce15758 +34815a72812e61f8 +217577e1babc4e21 +59052dc481b81ab3 +34cf07e50a3bbea5 +2180b1fddfffcf3f +4355579c93f5206b +2703c27bab9601d4 +4d408a3d328f6afd +5edf8422abe35513 +3aeb202d62879303 +59d0f11865eb7216 +26401f632ac93434 +53fb738e5415cc98 +5a8df3455a80c1cb +230437502a0a221f +53d946307935e4cd +46279da59f43388e +58a398e81aa8796a +5e1d5209ed5c85c4 +3b06caa36eecfcb3 +4ba6f1d6ed0650b0 +4f73829fdfbd9fdb +4ab9499343c13cce +2f6154106fc7b069 +506d86b48cf2b9c2 +3a08e62a3b03bcd8 +5e87fc9b8129312e +28de6b9d7fe96215 +3061fd035402fe08 +32b03f9af5870dfc +56c64ce3d2121d44 +2b6090de52d891a0 +325cb85c02254412 +5a0868a72cd925aa +4ef0f9ff01ccdde3 +3652c564da6be554 +4aa09dc1cc89cfa5 +58a914bd16c170aa +3e308858dc62a332 +52e284903a55eacb +45e15233e460a022 +3241d1453efa2190 +22c132aedab87ddb +2c60f0310d724b5d +5bdac99e0b2580b8 +4810d24693a459ca +4454a1f063a5f5dc +2140de6f162ca3a3 +43f0c9cc92065dda +2ea50c8a1d0b4d09 +4a009305f8aa06cf +2bc9b580d9c1b8b2 +51e9ba863665ea67 +303ba2d8ea723e9e +563484726c441a1e +26024f2b35fdf156 +24830cc9158709c3 +5c7701a9fe6c814d +5479372e31f36ef7 +58f9e3d579b15d10 +41ed2d28eea8cb8f +2477ac239a610c7b +4d8c54a1e25d1d35 +5c8b68db5f43369c +559e193713958fff +58f066533a823bd6 +403410a21c09e06a +38c707b060e5e4df +4766487e61355c59 +29615a93175b6a27 +3ef59489b39a2dea +3852787dec52c91f +30ae79d38b20d9ee +2183f8a9520d468a +2cde71495569d988 +4ee0a63a996bdabe +27b2eb89dc76f7c5 +39e42c1125ffd0cd +369e33ccd38dbcd6 +46ce5644ee27b1da +2bf674d563f91884 +300bdc4c12466fe2 +49015721fbd1fc78 +4092338bd1cab9d1 +508b4fa49fcbbe19 +246383604c1f582b +3e9856b0e9b78c83 +26ec660056f479f0 +5640cba91d028c2b +45fed7e6de6fef47 +5ced94a0dca91ead +3325107ab4c93690 +2a54f4d1c2801dad +59368c6fe4d073de +50fc630ff7e4f541 +48d1e3783d599115 +5c31ef28cc7665bc +32e4abd3b37c019a +4aeca96597f92f41 +25ea8127233749f8 +362adc69f18ff32f +5f0dc3bd8a0b148a +54ce949a878a8fd7 +419cb899d5c04ca3 +3cb343680488fa1e +440679082a692696 +2d319ebedcf33708 +550a1cc581f6beec +473461203fc8d6ec +2c96adf907849753 +4556b92961c97dc5 +2bd3152a3d05ecd3 +54a5069833f6f849 +44506596bee94448 +307acb2c86fc0fad +53754e598b789665 +4f5b0b89cf842844 +2204d7ed373876fa +25c7b72289bf1bc7 +51ac64fdd8ae51de +25d2803132af2140 +57e52ac895436f5d +4b030a2d8932a6fa +27d04fb898615918 +3527754cec1db32f +3e73ed652441058f +5dd223fc7405115c +39f6edf0a39e3938 +5cc4dc0d010c5ae4 +29585f01b9a1a446 +2d0c5aea9de13da6 +5f070b0953b57fd6 +4917a80d0bf8315a +2770f215f6639609 +2d015dd7994b7d65 +25e02b2b28ae66a3 +2715757bc0bdf1c4 +315988ade91e3f72 +46467c1b44507653 +39c7a9f1b231e46d +4732e15933f290bd +22222f99f996e26f +309b99c9f423d306 +3bb4c50db7f93230 +39b37979b5040970 +55a2b7538a73020f +55666be3f27403e6 +2e540796071c2817 +304f4e81abaf33fb +2f023d4460d5764c +508dc7384fb9c0c5 +2e1a48ed5d07fdc7 +2d961e27941a2d27 +25a3fca7476fd138 +45120b2ec5f46866 +53495c2e8d2a176b +2cbe539381e54390 +5599a7bbf2b6fb45 +4812f623e2c23d28 +3a7af0a97b318182 +53afba49b8f2193a +567835f7888d8b9e +48501f591a00e629 +308307d61a09ca0f +52d04165db279e9b +4b699fb2eff246c8 +3906dce610de771a +3264c956522d61ba +5092aaa2ce062732 +3eb14adf36ace750 +5669dad588bfe22d +54aff9561dd1c133 +320d23db4806a4de +4ae1044e696ac662 +30fed50525301ffb +591b2107b2693a2b +3b55c30954ce24e4 +3b71448b71a0c841 +5d7d71ec2ac32cf8 +30f390f13f830ec7 +7ff8000000000000 +7ff0000000000000 +7ff8000000000000 +0000000000000000 +8000000000000000 +7ff8000000000000 +7ff8000000000000 +@atan2 2492 be56f6b8d917c477 +0000000000000000 +400921fb54442d18 +0000000000000000 +400921fb54442d18 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +8000000000000000 +c00921fb54442d18 +8000000000000000 +c00921fb54442d18 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +7ff8000000000000 +8000000000000000 +c00921fb54442d18 +8000000000000000 +8000000000000000 +8000000000000000 +8000000000000000 +3ff921fb54442d18 +3ff921fb54442d18 +3fe921fb54442d18 +4002d97c7f3321d2 +3ff1b6e192ebbe44 +3fddac670561bb4f +3fd4978fa3269ee1 +3fb983e282e2cc4d +3fd3b90ac4853d17 +3fd68f94747be63e +3ff921fb54442d18 +01a56e1fc2f8f359 +3ff921fb54442d18 +3ff921fb54442d18 +0004000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb52442d18 +3ebfffffffffd555 +3e850b1cac020689 +3e851d3c1726f808 +bff921fb54442d18 +bff921fb54442d18 +bfe921fb54442d18 +c002d97c7f3321d2 +bff1b6e192ebbe44 +bfddac670561bb4f +bfd4978fa3269ee1 +bfb983e282e2cc4d +bfd3b90ac4853d17 +bfd68f94747be63e +bff921fb54442d18 +81a56e1fc2f8f359 +bff921fb54442d18 +bff921fb54442d18 +8004000000000000 +7ff8000000000000 +8000000000000000 +c00921fb54442d18 +bff921fb52442d18 +bebfffffffffd555 +be850b1cac020689 +be851d3c1726f808 +3ff921fb54442d18 +3ff921fb54442d18 +3fddac670561bb4f +40056c6e7397f5ae +3fe921fb54442d18 +3fcf5b75f92c80dd +3fc52397843c9add +3fa9942597929f27 +3fc433cffc49c751 +3fc748b55051b6f0 +3ff921fb54442d18 +01956e1fc2f8f359 +3ff921fb54442d18 +3ff921fb54442d18 +0002000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb50442d18 +3eaffffffffff555 +3e750b1cac0206ae +3e751d3c1726f82d +3ff921fb54442d18 +3ff921fb54442d18 +3ff1b6e192ebbe44 +4000468a8ace4df6 +3ff5368c951e9cfd +3fe921fb54442d18 +3fe2d0ead6066395 +3fc94441f8f7260c +3fe2242398ae5432 +3fe44c6283c49626 +3ff921fb54442d18 +01b56e1fc2f8f359 +3ff921fb54442d18 +3ff921fb54442d18 +0008000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb53442d18 +3ecfffffffff5555 +3e950b1cac0205f8 +3e951d3c1726f775 +3ff921fb54442d18 +3ff921fb54442d18 +3ff3fc176b7a8560 +3ffe47df3d0dd4d1 +3ff67d8863bc99bd +3fef730bd281f69b +3fe921fb54442d18 +3fd2a73a661eaf06 +3fe86526a7ed9483 +3feab53ea0886eef +3ff921fb54442d18 +01c01297d23ab682 +3ff921fb54442d18 +3ff921fb54442d18 +000c000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb5399826e +3ed7fffffffee000 +3e9f90ab02030789 +3e9fabda22ba71bf +3ff921fb54442d18 +3ff921fb54442d18 +3ff789bd2c160054 +3ffaba397c7259dd +3ff8555a2787981f +3ff5f97315254857 +3ff4782cbabc8157 +3fe921fb54442d18 +3ff4432d3398a46f +3ff4e2d784313ee6 +3ff921fb54442d18 +01dac9a7b3b7302f +3ff921fb54442d18 +3ff921fb54442d18 +0024000000000001 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb5410f9e5 +3ef3fffffff59555 +3eba4de3d70270b6 +3eba648b1cf09e57 +3ff921fb54442d18 +3ff921fb54442d18 +3ff433b8a322ddd2 +3ffe103e05657c5f +3ff69b8154baf42e +3ff00fe987ed02ff +3fe9ded0009ac5ad +3fd37b3882ae22a6 +3fe921fb54442d18 +3feb70bc8ecaa71b +3ff921fb54442d18 +01c0d4cab14b6bbf +3ff921fb54442d18 +3ff921fb54442d18 +000c90fdaa22168c +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb53a13395 +3ed921fb5442e25c +3ea087072285db98 +3ea09542ecf75fd7 +3ff921fb54442d18 +3ff921fb54442d18 +3ff37e1637253389 +3ffec5e0716326a8 +3ff638e4aa39f63a +3fedf79424c3c40a +3fe78eb807ffeb42 +3fd0fc8f404bb8c8 +3fe6d33a19bdb315 +3fe921fb54442d18 +3ff921fb54442d18 +01bd206a6a2a07c2 +3ff921fb54442d18 +3ff921fb54442d18 +000adf85458a2bb5 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb5387d267 +3ed5bf0a8b13812a +3e9c99d825e53490 +3e9cb279c585e577 +3ff921fb54442d18 +3ff921fb54442d18 +01a56e1fc2f8f359 +400921fb54442d18 +01b56e1fc2f8f359 +01956e1fc2f8f359 +018c92d503f699cc +017124e63593f5e1 +018b49266db89b9e +018f88edd4ae42fe +3fe921fb54442d18 +0000000000000000 +3ff921fb54442d18 +3ff921fb4e4b1df6 +0000000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +03556e1fc2f8f359 +00756e1fc2f8f359 +003c2f6bccd6ebf7 +003c47b1c571bd6e +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3fe921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3e37e43c8800759d +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +0000000000000001 +400921fb54442d18 +0000000000000002 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3b17e43c8800759b +0000000000000000 +3fe921fb54442d18 +3cb0000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +0000000008000000 +0000000000000000 +0000000000000000 +0000000000000000 +3ff921fb54442d18 +3ff921fb54442d18 +0010000000000000 +400921fb54442d18 +0020000000000000 +0008000000000000 +0005555555555555 +000199999999999a +000517cc1b727221 +0005e2d58d8b3bce +3e57e43c8800759a +0000000000000000 +3ff921fb54442d17 +3fe921fb54442d18 +0000000000000000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +01c0000000000000 +0000000200000000 +000000002a163958 +000000002a3a782e +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb52c5e950 +3ff921fb54442d18 +3ff921fb54442d18 +3fe921fb54442d18 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +7ff8000000000000 +3fe921fb54442d18 +4002d97c7f3321d2 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +7ff8000000000000 +bfe921fb54442d18 +c002d97c7f3321d2 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +bff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3e40000000000000 +400921fb53442d18 +3e4fffffffffffff +3e30000000000000 +3e25555555555555 +3e0999999999999a +3e245f306dc9c883 +3e278b56362cef38 +3ff921fb54442d18 +00055b87f0be3cd6 +3ff921fb54442d18 +3ff921fb54442d18 +0000000000800000 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3fe921fb54442d18 +3d10000000000000 +3cd50b1cac0206ba +3cd51d3c1726f839 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921f954442d18 +3ff921fd54442d19 +3ff921fa54442d18 +3ff921f754442d18 +3ff921f554442d19 +3ff921e754442d23 +3ff921f50bc55808 +3ff921f5e4818a53 +3ff921fb54442d18 +02d56e1fc2f8f359 +3ff921fb54442d18 +3ff921fb54442d18 +0120000000000001 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb54442cd8 +3fe921fb54442d18 +3fb4ff0705d16166 +3fb5110732f66b78 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb2a2df3c0 +3ff921fb7e5a6671 +3ff921fb3f39106c +3ff921fb0017ba68 +3ff921fad6018110 +3ff921f9af65efa8 +3ff921fad00bf404 +3ff921fae1dccc81 +3ff921fb54442d18 +03104b483bbb86f3 +3ff921fb54442d18 +3ff921fb54442d18 +015854a640000001 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb54442d13 +3ff7d20ae3e71702 +3fe921fb54442d18 +3fe92fbce7ffcdcd +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb2a09b4ea +3ff921fb7e7ea547 +3ff921fb3f26f101 +3ff921faffcf3cbc +3ff921fad594c48d +3ff921f9adfb7b49 +3ff921facf9a15b1 +3ff921fae17a4602 +3ff921fb54442d18 +03103d4bf0bd14b7 +3ff921fb54442d18 +3ff921fb54442d18 +01583fc4141c97d1 +7ff8000000000000 +0000000000000000 +400921fb54442d18 +3ff921fb54442d13 +3ff7d0eae114c661 +3fe91439c0888c64 +3fe921fb54442d18 +c00921fb54442d18 +c008fe3cc6ff87de +c008da7e39bae2a3 +c008b6bfac763d69 +c00893011f31982e +c0086f4291ecf2f4 +c0084b8404a84db9 +c00827c57763a87f +c0080406ea1f0345 +c007e0485cda5e0a +c007bc89cf95b8d0 +c00798cb42511395 +c007750cb50c6e5b +c007514e27c7c920 +c0072d8f9a8323e6 +c00709d10d3e7eab +c006e6127ff9d971 +c006c253f2b53437 +c0069e9565708efc +c0067ad6d82be9c2 +c00657184ae74487 +c0063359bda29f4d +c0060f9b305dfa12 +c005ebdca31954d8 +c005c81e15d4af9d +c005a45f88900a63 +c00580a0fb4b6529 +c0055ce26e06bfee +c0053923e0c21ab4 +c0051565537d7579 +c004f1a6c638d03f +c004cde838f42b04 +c004aa29abaf85ca +c004866b1e6ae08f +c00462ac91263b55 +c0043eee03e1961b +c0041b2f769cf0e0 +c003f770e9584ba6 +c003d3b25c13a66b +c003aff3cecf0131 +c0038c35418a5bf6 +c0036876b445b6bc +c00344b827011181 +c00320f999bc6c47 +c002fd3b0c77c70d +c002d97c7f3321d2 +c002b5bdf1ee7c98 +c00291ff64a9d75d +c0026e40d7653223 +c0024a824a208ce8 +c00226c3bcdbe7ae +c00203052f974273 +c001df46a2529d39 +c001bb88150df7ff +c00197c987c952c4 +c001740afa84ad8a +c001504c6d40084f +c0012c8ddffb6315 +c00108cf52b6bdda +c000e510c57218a0 +c000c152382d7366 +c0009d93aae8ce2b +c00079d51da428f1 +c0005616905f83b6 +c0003258031ade7c +c0000e9975d63941 +bfffd5b5d123280f +bfff8e38b699dd99 +bfff46bb9c109325 +bffeff3e818748af +bffeb7c166fdfe3b +bffe70444c74b3c5 +bffe28c731eb6951 +bffde14a17621edb +bffd99ccfcd8d467 +bffd524fe24f89f2 +bffd0ad2c7c63f7d +bffcc355ad3cf509 +bffc7bd892b3aa93 +bffc345b782a601f +bffbecde5da115a9 +bffba5614317cb34 +bffb5de4288e80bf +bffb16670e05364a +bffacee9f37bebd7 +bffa876cd8f2a161 +bffa3fefbe6956ed +bff9f872a3e00c77 +bff9b0f58956c202 +bff969786ecd778d +bff921fb54442d18 +bff8da7e39bae2a3 +bff893011f31982e +bff84b8404a84db9 +bff80406ea1f0345 +bff7bc89cf95b8d0 +bff7750cb50c6e5b +bff72d8f9a8323e6 +bff6e6127ff9d971 +bff69e9565708efc +bff657184ae74487 +bff60f9b305dfa12 +bff5c81e15d4af9d +bff580a0fb4b6529 +bff53923e0c21ab4 +bff4f1a6c638d03f +bff4aa29abaf85ca +bff462ac91263b55 +bff41b2f769cf0e0 +bff3d3b25c13a66b +bff38c35418a5bf6 +bff344b827011181 +bff2fd3b0c77c70d +bff2b5bdf1ee7c98 +bff26e40d7653223 +bff226c3bcdbe7ae +bff1df46a2529d39 +bff197c987c952c4 +bff1504c6d40084f +bff108cf52b6bdda +bff0c152382d7365 +bff079d51da428f1 +bff03258031ade7c +bfefd5b5d123280e +bfef46bb9c109324 +bfeeb7c166fdfe3a +bfee28c731eb6950 +bfed99ccfcd8d467 +bfed0ad2c7c63f7d +bfec7bd892b3aa92 +bfebecde5da115a8 +bfeb5de4288e80c0 +bfeacee9f37bebd5 +bfea3fefbe6956ec +bfe9b0f58956c202 +bfe921fb54442d18 +bfe893011f31982e +bfe80406ea1f0344 +bfe7750cb50c6e5b +bfe6e6127ff9d971 +bfe657184ae74487 +bfe5c81e15d4af9d +bfe53923e0c21ab4 +bfe4aa29abaf85ca +bfe41b2f769cf0e0 +bfe38c35418a5bf6 +bfe2fd3b0c77c70d +bfe26e40d7653222 +bfe1df46a2529d39 +bfe1504c6d40084e +bfe0c152382d7364 +bfe03258031ade7c +bfdf46bb9c109324 +bfde28c731eb6950 +bfdd0ad2c7c63f7c +bfdbecde5da115aa +bfdacee9f37bebd6 +bfd9b0f58956c202 +bfd893011f31982e +bfd7750cb50c6e5b +bfd657184ae74487 +bfd53923e0c21ab4 +bfd41b2f769cf0e0 +bfd2fd3b0c77c70d +bfd1df46a2529d39 +bfd0c152382d7365 +bfcf46bb9c109325 +bfcd0ad2c7c63f7d +bfcacee9f37bebd6 +bfc893011f31982e +bfc657184ae74487 +bfc41b2f769cf0e0 +bfc1df46a2529d38 +bfbf46bb9c109324 +bfbacee9f37bebd6 +bfb657184ae74486 +bfb1df46a2529d39 +bfaacee9f37bebd7 +bfa1df46a2529d39 +bf91df46a2529d39 +0000000000000000 +3f91df46a2529d39 +3fa1df46a2529d39 +3faacee9f37bebd7 +3fb1df46a2529d39 +3fb657184ae74486 +3fbacee9f37bebd6 +3fbf46bb9c109324 +3fc1df46a2529d38 +3fc41b2f769cf0e0 +3fc657184ae74487 +3fc893011f31982e +3fcacee9f37bebd6 +3fcd0ad2c7c63f7d +3fcf46bb9c109325 +3fd0c152382d7365 +3fd1df46a2529d39 +3fd2fd3b0c77c70d +3fd41b2f769cf0e0 +3fd53923e0c21ab4 +3fd657184ae74487 +3fd7750cb50c6e5b +3fd893011f31982e +3fd9b0f58956c202 +3fdacee9f37bebd6 +3fdbecde5da115aa +3fdd0ad2c7c63f7c +3fde28c731eb6950 +3fdf46bb9c109324 +3fe03258031ade7c +3fe0c152382d7364 +3fe1504c6d40084e +3fe1df46a2529d39 +3fe26e40d7653222 +3fe2fd3b0c77c70d +3fe38c35418a5bf6 +3fe41b2f769cf0e0 +3fe4aa29abaf85ca +3fe53923e0c21ab4 +3fe5c81e15d4af9d +3fe657184ae74487 +3fe6e6127ff9d971 +3fe7750cb50c6e5b +3fe80406ea1f0344 +3fe893011f31982e +3fe921fb54442d18 +3fe9b0f58956c202 +3fea3fefbe6956ec +3feacee9f37bebd5 +3feb5de4288e80c0 +3febecde5da115a8 +3fec7bd892b3aa92 +3fed0ad2c7c63f7d +3fed99ccfcd8d467 +3fee28c731eb6950 +3feeb7c166fdfe3a +3fef46bb9c109324 +3fefd5b5d123280e +3ff03258031ade7c +3ff079d51da428f1 +3ff0c152382d7365 +3ff108cf52b6bdda +3ff1504c6d40084f +3ff197c987c952c4 +3ff1df46a2529d39 +3ff226c3bcdbe7ae +3ff26e40d7653223 +3ff2b5bdf1ee7c98 +3ff2fd3b0c77c70d +3ff344b827011181 +3ff38c35418a5bf6 +3ff3d3b25c13a66b +3ff41b2f769cf0e0 +3ff462ac91263b55 +3ff4aa29abaf85ca +3ff4f1a6c638d03f +3ff53923e0c21ab4 +3ff580a0fb4b6529 +3ff5c81e15d4af9d +3ff60f9b305dfa12 +3ff657184ae74487 +3ff69e9565708efc +3ff6e6127ff9d971 +3ff72d8f9a8323e6 +3ff7750cb50c6e5b +3ff7bc89cf95b8d0 +3ff80406ea1f0345 +3ff84b8404a84db9 +3ff893011f31982e +3ff8da7e39bae2a3 +3ff921fb54442d18 +3ff969786ecd778d +3ff9b0f58956c202 +3ff9f872a3e00c77 +3ffa3fefbe6956ed +3ffa876cd8f2a161 +3ffacee9f37bebd7 +3ffb16670e05364a +3ffb5de4288e80bf +3ffba5614317cb34 +3ffbecde5da115a9 +3ffc345b782a601f +3ffc7bd892b3aa93 +3ffcc355ad3cf509 +3ffd0ad2c7c63f7d +3ffd524fe24f89f2 +3ffd99ccfcd8d467 +3ffde14a17621edb +3ffe28c731eb6951 +3ffe70444c74b3c5 +3ffeb7c166fdfe3b +3ffeff3e818748af +3fff46bb9c109325 +3fff8e38b699dd99 +3fffd5b5d123280f +40000e9975d63941 +40003258031ade7c +40005616905f83b6 +400079d51da428f1 +40009d93aae8ce2b +4000c152382d7366 +4000e510c57218a0 +400108cf52b6bdda +40012c8ddffb6315 +4001504c6d40084f +4001740afa84ad8a +400197c987c952c4 +4001bb88150df7ff +4001df46a2529d39 +400203052f974273 +400226c3bcdbe7ae +40024a824a208ce8 +40026e40d7653223 +400291ff64a9d75d +4002b5bdf1ee7c98 +4002d97c7f3321d2 +4002fd3b0c77c70d +400320f999bc6c47 +400344b827011181 +40036876b445b6bc +40038c35418a5bf6 +4003aff3cecf0131 +4003d3b25c13a66b +4003f770e9584ba6 +40041b2f769cf0e0 +40043eee03e1961b +400462ac91263b55 +4004866b1e6ae08f +4004aa29abaf85ca +4004cde838f42b04 +4004f1a6c638d03f +40051565537d7579 +40053923e0c21ab4 +40055ce26e06bfee +400580a0fb4b6529 +4005a45f88900a63 +4005c81e15d4af9d +4005ebdca31954d8 +40060f9b305dfa12 +40063359bda29f4d +400657184ae74487 +40067ad6d82be9c2 +40069e9565708efc +4006c253f2b53437 +4006e6127ff9d971 +400709d10d3e7eab +40072d8f9a8323e6 +4007514e27c7c920 +4007750cb50c6e5b +400798cb42511395 +4007bc89cf95b8d0 +4007e0485cda5e0a +40080406ea1f0345 +400827c57763a87f +40084b8404a84db9 +40086f4291ecf2f4 +400893011f31982e +4008b6bfac763d69 +4008da7e39bae2a3 +4008fe3cc6ff87de +400921fb54442d18 +3ff921fb54442d18 +3ff09d60ff5f1ac4 +3fe6853568b39934 +3fd9af7d0cc30ffe +400380adfa1746cb +4000d34ad4949fb6 +3ff28e1c1a05f89a +3ff325206ebe9e2a +3ff85cb483f301a7 +3ff921fb54442d18 +3ff09d60ff52fd8e +3fe6853568984455 +3fd9af7d0c9b37d2 +400380adfa1e1c03 +4000d34ad49aae52 +3ff28e1c19fbd2f0 +3ff325206eb53158 +3ff85cb483f1aca5 +3ff921fb54442d18 +3ff09bbeedf07246 +3fe6818673db9558 +3fd9aa1eb93c95a4 +40038199b74d47c2 +4000d41bdd4bf3f6 +3ff28cbde24a0d88 +3ff323db20a1b55a +3ff85c8688c8f3c4 +3ff921fb54442d18 +3ff09dd1f7f90812 +3fe686344fd52cb6 +3fd9b0f0ad275961 +4003806e404ee1eb +4000d3125847a910 +3ff28e7aba34bdef +3ff3257853124cb2 +3ff85cc0efd55f7b +3ff921fb54442d18 +3ff09de79fd456c3 +3fe686652ded7c2a +3fd9b137ed39d250 +4003806208c8ce0e +4000d307845a01b7 +3ff28e8cdda97223 +3ff325892c0dd101 +3ff85cc35158de58 +3ff921fb54442d18 +3ff09d6667c47f38 +3fe685419c272014 +3fd9af8ed633bcf2 +400380aaed3a6513 +4000d3482061ed7c +3ff28e20a1a243d3 +3ff32524a3d73f36 +3ff85cb51c2cffb0 +3ff921fb54442d18 +3ff1b6e192ebbe44 +3fe921fb54442d18 +3fddac670561bb4f +4002d97c7f3321d2 +4000468a8ace4df6 +3ff376710d14447b +3ff3fc176b7a8560 +3ff87a826a767119 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442b18 +3ff921fb50442d18 +3ff919fb54eed7a9 +3f6ffff5555bbbb7 +3e5ffffffffffffd +3d50000000000000 +3c40000000000000 +3b30000000000000 +3a20000000000000 +3910000000000000 +3800000000000000 +36f0000000000000 +35e0000000000000 +34d0000000000000 +33c0000000000000 +32b0000000000000 +31a0000000000000 +3090000000000000 +2f80000000000000 +2e70000000000000 +2d60000000000000 +2c50000000000000 +2b40000000000000 +2a30000000000000 +2920000000000000 +2810000000000000 +2700000000000000 +3fe1c0545cb92490 +4006f3b3356ddf00 +40057de95f8117eb +bff43ed67af94895 +bfe996d2c8acf4ee +4008bd5dcd24ad57 +3fe13420488115b6 +40038d20e2ee78d3 +bff7c2ccb045b948 +3ff183a541062354 +bfda5b20bc0d8563 +c002223f8ff9d8fe +3fe9f1281425a8b8 +c001b03f34f7d7d6 +4007310b187e287e +bfc65d63832b151e +40034ddd98874d17 +c0001e763520725a +bfd026dca3e65aa0 +3fed73a7849e510c +3ffd818ef442cece +400203768bc85351 +40033f5c0e60ae9d +400169d715be81f3 +c000be3b0f2344d7 +40014aaf62f7f9c0 +3f930e8f6bb0db2b +3ffb31032b9678b3 +bfe3521f37c4d53e +bffea0fa0b1b812f +c0084760e8189774 +3ffbf9112ff34d85 +bfb391f7dffe0074 +bff05c10678165a7 +4002dd967362570f +bff6f8474b8a1707 +bfe6576a5e28a021 +c00610d96c6ac125 +4006a7cb80e35551 +400544d5b4b8723e +3fe2209426d6da5b +3febc01ee41d3d7a +400403fd02bc0512 +bfffbaef39e770f8 +3fd39e78549c0c39 +3fef1e5d7ad7ae5b +bfeedbaf54c7ff43 +3fccdae673404ba1 +c00165fc4f72ae31 +c005a9706f1f053d +3fe9033bf4d5917b +3fd89c2bcaef7c51 +3fd4d4b2ba4de7d7 +bff785b47b442256 +3fc8af50841b724f +3ffa62dec0054394 +bff63ba3974dd481 +c0043aa302c1b6a2 +3fe2e971f2d7f200 +c003a202bab2ee79 +4001581efa98ac06 +bfddfab14a930d80 +c0043f8196dd852e +bfec6d4d319283a1 +bfe125b78e88395c +3ff347f8d00fe7c4 +c00377d8748c482e +4001de328f89b8a6 +4003d73094143717 +bff9171fc8e2e901 +bffaa3c27896e235 +bfcc4d2101224d99 +40023739d1690fd0 +bfdc19cf26089a7e +4002dcac3bbfd074 +4003a916f1cf6cca +3fd723126a6bd579 +c001c4f468350c9c +bfdf908e892d9251 +c008cde01b81ab5d +3ff43ec4d79b4b3c +c003a6941501233b +3fc8a3d6454c1c0d +bfe2b71f52172320 +bfe7d50a3b968437 +c0014dfc9b866f46 +4002ed2198cea21c +bfefb399d06ed1c4 +3fefd0c242a810ab +bff16eecdfb6c036 +bffcde1e13b6e5f5 +c0024ae169fa00c8 +4007a2797d3dd6cb +c0012c604b4078d5 +3fee766d7b0e064d +4000ed6a965c8a85 +40083eadbdc3f0d2 +c008f9b4ba84641a +40018f26903c770e +bff5ceb65aab764c +3fef06d4b80d258f +4008b9ff30c1951c +bffdca24069a71e5 +400393ff4664e172 +3fe1d32185c3967f +3fe3f539cac77e9b +400619d998da75ff +3fba2fb3e747401d +40082adf4fdfc054 +bfcd26ec7281402b +4002194112c81f22 +3fea91bfd785f7a9 +3fec67875c360d34 +c0012bbda63c83ca +bfe66e5334bf7178 +3ffff0681c842a59 +c00617e752343ed7 +c00533f31974b4a3 +bfb4ab25f5f628f0 +bfc4f1d25e81e0b5 +c005cd7bb0b871f8 +4005176809d906bd +3ff2cb23d20e771f +c004962a51bcf9b2 +bff76f420c98c9c6 +400516e98f46cbfd +c00465c08b562b0a +4005921029259e2e +bff4a2f14f1ed094 +c0022a1a25d80031 +3fedf7b2b0597c17 +4002d52adb8498cc +c0021b54b994e1b7 +3fe9c5aab9ab70cf +c000e9a42789f0db +c00245ce7d9297ac +bfc31eb7289e0ad7 +3ffedeb2e4970419 +3fe39075d9cc893b +4007b2a57f5f348d +c008f6e7017c54f9 +bff3cafd5f0c487d +c001518bc9007100 +bf5e19a760c5e85a +bff0c645e130f0a7 +3ff06d4f55ed3abf +c00390f2b546cd44 +4001a2cc7c3dea4e +40085e3638db5d6a +4004d4081f30bd85 +bffda2a41f052463 +bfe92aaaf9d33b00 +40024aef51967335 +bffc7a0839dc0e65 +4004544ef3224ec6 +3fe4cb37371a9ac2 +40045dc83a927206 +bfa93563488515d2 +3fc84097ef3e212a +3fb8ddd54e997a9d +bfbc2bc7de4bc286 +3ffddab037cfc585 +c00422633c59da02 +c00095a5cd672c27 +4001ac1d6ab60f1f +bfef53c4c270e51c +40049a71dd6bde97 +bffc4149be911657 +3fe3f4320ccc5463 +4006231e46c9e26d +c002cf0d71208843 +3fea9371bccf3bbf +bfe17d38d3ea41dd +3fc5dab39884ba42 +3fe5681b88683a1a +40014d9bed9827aa +3fe3d97bd96b69cc +40011544229e258e +bff7bc8f1c9c9df0 +bff0341f68205805 +400406626a91c353 +3ffd44d340b887d0 +3ff7bcc5f5627cdd +4006dbb04ad49025 +4003cede904c6cd0 +c00137a487771cf4 +bfe2194036be1ecb +bffb490c862d044a +3ff76a5a848da649 +3ff30b29b2e665bb +3fba82988a70c0df +4008cc77fbdaca72 +3fe858697ed9c669 +400181a6b7a8fcc8 +bfe1ee5a49997c1c +c0075967eb162182 +3fe31fff6497b44b +3fe6e70877882ae7 +bfd01b1a3c0dcafc +400779b8d4d28e19 +3fe4b2907b8dddec +3fd9edccb11300b3 +40013bde247edcf8 +40079a00ea89964c +3fe7fbef4b6ec185 +c007daf15edeafa2 +4007aa7f74d6d349 +3feb89def7f754bb +bff3a9bab3cd5ab3 +4001fb951e4cbdb6 +400498d52daa3617 +c0058992d6906e26 +bfe507042d69c440 +3ff2ffe3636fd5af +3ff2e0120da7f712 +c0065ca5c5448b91 +bff2e55d5ee29e33 +bfe30056d152fd29 +bfe9f854f9413387 +4004de71cbff0be2 +3fe1b1763d02e3f4 +bffa0dba43707aa3 +4001d1de1f505f12 +3fb5ee083ceed41d +3ff3a2634bff2c84 +c000fd3bb3aa8d60 +bffb6d4a4b674eae +40075115d1836534 +3fd8248c724185e1 +bfeb37fdbcf49b99 +bfd1701ea65bcf0e +400190de45f67324 +3fd87d1257b8d16f +c0049dd8320726c3 +bfcb3008d104fda8 +3ff4fea9ef59759a +3ff1d64650109699 +3febd6c31ac8cfc6 +4007a94d6324e5ba +40050bcfa20f7aae +c0025a1e0da91138 +bff8d9b0362e7a8e +c0026f6be0812456 +bfdfd3178f242f6c +c004c1792b4e8ba8 +3fe7894616cb89ea +4004e5da13001c62 +bfd1353d593b81ea +c0057f97bb8a90db +40086243781b1713 +3fe613f0c28f447f +400472c524cc7ba5 +3fe1fdb408abd70a +bfe7327023056be3 +c006965deb8356f5 +3fd8b56cb177b8b2 +3feff352427cdbb1 +400482e975808dd2 +bfea3e19a58d988f +bff72261945e8b10 +bfe399408007b88e +bfe0ec99a3e78eaf +3ffcb70b7ebb83b9 +c0020df2b886f1f1 +3fe8c3f615f17357 +4008604425f53075 +bfd9a80ba7bc78e7 +3fea9a5774086123 +3fe7e8a7bf831068 +c00583e88ba519d8 +bffd6f2150c3d744 +400129764d0d3f35 +4005e89febd16ca6 +bfff1b5fa5be2d81 +bff5737ed35c0eb3 +c00205a08e6a2b18 +3fec5cd42d1f94ed +4000cafa988227b8 +4007569317593876 +bfc159495a79141d +c00015ee7924fff4 +4003e30707e8004a +c00769d582e056fb +4002d8371e6e8cb6 +bfd83d6be42389fd +bff1d2d3991c46f1 +c001ebb55f011837 +3fff0dc48d1a4361 +bfaab9de8c65d298 +4001bcee4be12b19 +400705fb576c4e62 +400851b71231ecfd +c00805f45af1f58a +c002bce47734a3cd +3fb83b6344cc8c54 +c00206f133c5607a +3fe2f9383a757dbb +3ff835768bd4304c +c008fd73f86fea56 +3f9b699b5c5518fa +3ff81b936abd99c8 +40026459d6c9c546 +400042485146f204 +3fef7331ff7ee9f0 +c006a75a8ffd04a6 +bff692ca5fa0e448 +c0076b97f36c3edd +4007c7151027d421 +3fddaa4397d6214a +3ff21d9937529110 +3ffccccc9564f497 +4000458418ee71a0 +c000a46d99ed136a +4004ec06e5880c18 +bff288e38effb158 +c002b2fcedf5da3f +bfbea0102d3ebb25 +c00562dbcbc2cbc9 +c006b40770ea1e4a +3ffd8e4e63027ff0 +4006d11dc55cb745 +bfed5c277f7c4fa0 +c003bccd91ee1d45 +400196470bad1292 +bfed73891bfde9b8 +bff2c610ac1d7fde +c004a745f2c9869c +bffc496c04d3136e +c0008cf884d58fe3 +3fec1eb484c304ce +c0000b50430c002a +4003e90c866e1f63 +c001d59781786653 +3fe842aca82e94b7 +3ff258269ad9c5e8 +bfba57afab61eb86 +c0018567d0f7e09c +bfe7ee8877d90f7a +bfe9b985f3293a85 +bfebe92659aed48e +bff79a84f317bf9d +c000dfd5aecbcabc +bfed2cee6fcad89b +c001c5ba8b983a47 +bff9c0f4d43e99db +4002086b6203560f +40085335d3c4dfd5 +c002f3697f9a2577 +bffbd2a3b268d8de +3ffe43b4068877f5 +c000a7af4df61f6c +c0016b7c17d80bcc +3ff9e3b9734c9fd0 +3feaf7ba9dd0ed68 +3fc966c63ee4880d +c0084aee6922b8d0 +c0017d62b61973ac +bfe7ebf77e08e160 +3fe5d8f7c1d0984b +c0047c1faa95807d +40038846336ee8a6 +bfecf9c1a076da92 +c0006cdd3af3d422 +4004c12a45821f49 +c00176c02bf3edf8 +4000a76fc7b541ee +3fe5966a3d981a62 +bfee4dc6d47988e2 +bff14b75433b3360 +3fde7be682eb6580 +3fbdfbf9388446f9 +bfc6ab18af70127f +3ffa25f840d2ae6d +3fefccd634fc76e8 +bfe7fc699323232d +40030d5de2360ae0 +3ff684763603cc4e +4006710e2400f1af +400241d8df35cd8b +40056a17871c175e +c0021a6dde6d355b +3fd4302aa80acea0 +c008274d4e465da6 +bffd9767497be8b5 +3ffe8c14a16716f3 +4001094195e14ae9 +40066f2ebeff54ac +3ff72465b5030acd +bfe7791675117c9b +3ffadc8857597c88 +3ff132084fd6ae78 +3fdaf4b49f77af36 +bfc690dce52ed2a8 +bfe8793f441288cd +3fe242c1389827a5 +3fe2b91be6f346ec +c0035010783b927e +c0090a3a669fd319 +bffb714032b92bf7 +c001f56c395f2a34 +4002ac27813e2a1f +c005903df76b7bcd +4003f3958f9180ef +400153fa3de7a456 +bfef4dbf4fec1820 +3feff0d585efc3fe +bfeb7e4c9ef5a770 +3fe260fe521b2176 +40046458109b80d8 +bff09f1629b12a4d +3fce05532a47c06a +3ff346bea4825e86 +3fccf56daf708481 +3febbe9842f1a2b1 +3ffb9de8a7b33d0e +bfe0a3b819aca07b +3ff8d2a1bdfa77a6 +3ff63d5c183d9610 +bffbe696de67bd0b +bfe63f9e773a8253 +bfe98f80a3199b71 +40042196a73cf592 +3ffd15a203b22107 +bff8113fb7a76b0c +c00131f5fbd79de4 +bff9be30e10188d6 +bfecfb91c131d50f +bffcb5d1441ba56d +3fd1b247359b4728 +4001de692036011a +3fcdcd9a916ca8a9 +bfadb9b22f2a7aba +400009467b71e6a4 +4002016843e49b76 +4001bde787b5a1f0 +bff7a96e72974da1 +c002f6f020d0a89c +bff40c0a5514f7fb +bfe55a769787079a +4005a7027cf3e45e +bfc5a91952a18e7d +4000f31379c5bb82 +3ff8fb67e536a01c +3fed577bd154cc16 +3fe375b52c104518 +bfd4d7278ba4b17f +3fedf13234d704e9 +c006d81d945d8f3e +3feebee293c36688 +3fc77f22eb94231c +bff7b44984d5dd2c +c003fc7f6562b200 +3fe7a5f0b7b8b2a2 +bff09a743b3e5991 +bffe6e80c7e85a7d +3ff485cb63530fc4 +bff8bfea8abd8141 +400555b8c83f6b80 +bf9ed2089bb95afe +c0023a6badd9ca06 +400853856ad719d4 +c00460d9dc085583 +c002cd9a923badf2 +40050ddf9ef92122 +c00878c770bc1be9 +c00472e0e21af500 +c00004b8d5c1f547 +3febc27fd1bdf3b2 +bfdd3f5cf8cab9e9 +c0035d84b5fc5c29 +bfbf117a91a1b40b +c00148536a6e6f88 +bfeb9b2ab39143fd +bff9e7431319e0cb +c0042bafb3f45604 +c0054c6a8972aabb +3fe89bdda6121aa4 +bfe733767d0a6a3c +3fece7c5700c3c83 +40056aacd754fbb4 +bfc2d80bb9956574 +bfe1d7dd4dc11c52 +3ff53aff68eb4432 +4000cf8c312076d0 +3fcbfd7d570b77e1 +3ff0594d3c5d5fe0 +3fd8b1f714694d3d +3feae8f87e37c821 +4003fca0d8275e05 +4006929ebffcb999 +bfe82246d74faddb +bfd18429fc27dfd8 +3ff957f12098073d +3ff53f50ae122fd0 +40079acceb85b56a +3feb1e46af2f6e14 +3ff3f18bb182472e +40044d6bfd06fb94 +c00324dd8633048e +bfe78b27033f9d4c +40055a8b791ce5a0 +bfb366510822706c +c0020e3555874c16 +3ff9c31cd00112fa +c000a621dff162bc +40080dafe92da50d +bff915ebff8fd185 +c00686d5e79eab62 +3f84c8aee4f799de +c003292ab63437ab +3ff38f5ecd488e78 +c003a175f6a856e6 +c002c884f15e504a +3fdbd18bf39e27dd +4000264b4facd8ea +4002b837521fb306 +bfec9e7b0155b84e +3ff41dcf8e71edc9 +3ff57154b6b89351 +40079f6682270475 +3fedd011614d3b31 +bff07337dc6a26c9 +bff0a1f22a20896d +c00464596f1b0613 +3feabebd7c11020d +bff02670e5b6867c +bfe2cf7d4f2f3594 +c0062c00b65db91b +bffeda8e69a75d82 +4000d6b5c46474bc +3ff42520b6ac9249 +c005fe3cb1e397bc +40007a68d59320ec +3fbc5e8e74df676a +3fe9f890380b12d3 +c0007750189f0936 +bff8b81ae682b207 +bfe06eb961394883 +4004108e97f1e892 +bfe797f6c7759bd1 +4008ae430e50d4f8 +40088ffbd4b003e9 +c002ad6ee648043c +bfd8df0d3d0f0421 +3fdd3b12a8176e89 +3ffd9e41a2cf9998 +40024e0b7e0af31d +bffda44d7fea3eaf +3ff11ff973fea83a +4000ad447c6d69eb +4004ece13beabebb +3ff129a23ed1723d +c0013ca9404102ce +bff5bd4b7b1a4b90 +bfe7d9d67b39cff8 +bfe66eb191d05978 +4007c2b8913e929f +3ff1641976e0815b +40091458cc63688f +c007502ca10e1899 +40036b0a4662d2d6 +3fea452823140af4 +c00458465889cfe4 +c006409c9d35a001 +c00304a48c8ea2a1 +3fdc99eed90fc868 +c008be588bfe4ecf +4004268f0f5af191 +bff6af636e55f674 +bfdf46d1635ff9fa +bff870fd251a4f9d +bfdf53df5f197c83 +3fda85307b60e559 +3fddae4adeaab9d2 +40036460451ef8b0 +3ffb609a4bfa4934 +3fe97dc58703b6e9 +3fed5dcb81766e72 +bff967852734eb3e +3fe60176d97d0c37 +3fc1dc2ae1d576bd +c001a7916ef3eea4 +3ffd9ee3c86b0b16 +3ff2c18098a5473c +bfe42ac2d60a20a0 +bfe69c9377316bb8 +3fe164b202f6705b +c00367f4032465e3 +c0084563299284d3 +3ffe592b4167d21d +4006dfd49054db2e +4004b923abd07602 +40050370576573c9 +4002d0af7881647c +3ff29b7644dac731 +c005f565f613d667 +40008398da36d673 +3ff1c415e0ac4c21 +3ff3a710f93bd450 +bfd13e866f6aa90a +3fe18f3eb3e526d2 +3ff2246b7e3af359 +3fe27d549648f8c2 +bfda6e6edfffafee +3faecee8bc7617ad +c002ba24879f895e +40032e3763d0830c +3ff3890b50c339c9 +c007c2a577305b48 +3ffef7ff04a6a35f +bff99fe1d8a40ace +bfeb9436bb038711 +bff72ac322fd3449 +bff8b1636b6e8e71 +c00895e1f55fc476 +3ff3edd9727e9210 +c0003350ef15a4d6 +4003aea121cba222 +bfc128dd7349ff57 +bff3a04569a77708 +3fced59c4390cbb4 +4007502396a74f56 +bffb0168799bdeb8 +3fe5c2ef4e114f88 +3ff3e72b3e58d93f +bfe4e035958437f6 +bfac45b33f0e6aeb +3ff59719be1725c2 +3fe595336c6d134b +3ffde0595dc5f184 +bff88ebf9fd57eb8 +3fe29b9a27434cb2 +3fc419711e900f16 +bfe918da49a0cf57 +3fe151caeee39b14 +3fd10e5a55f51c88 +3fbedbdd16129144 +bfe0c830b5f1e300 +400737edf7528a98 +3ff98d0b12413360 +bff43e4b5c087e65 +bfe6457bb369822a +c0020fbd3385d8fc +4006abb133812fb8 +bfe61112f03e00fc +c00672446668e93f +c008cfb6f1bc7331 +3fee2a71c415556a +4000c5ce0c68d8d0 +bff19f3bc6c8de3f +bfee78f2a61ac9e4 +4003023f07c90a8e +c005b5800cba16bc +3fec65e10aee455c +3feee68cc0788bbc +bfda4bd4046a3756 +c00544e5abc49602 +4005bedd4a2be045 +c008f3592075171a +c007e95fe111d52a +c006d730919d5bf8 +bff501e14a486ea7 +3feb3ce913dbe140 +4007fc14012c89f5 +3ff1ce77d466d434 +3fed884dc933f0c2 +4003b24e9082a247 +3fe0381002b26d13 +c0050a643d32be03 +3ff70daa78b9fd3c +c0038f13c4754044 +400342c4eb54234a +bfd7e6a4121805c0 +4007a167bd4e939c +c006c8707cf65c66 +400901ccc31de230 +4001f501d0ec9bb1 +c0032a2ebd8926f3 +3fdddfe2cdbfe13c +3ff365c557286d56 +3fc44eb9534337d9 +3feef5e40173d92e +bff67a5c71a09131 +bfded84784e6af10 +c00014777db5a61f +3fb8b193a6ba1d53 +bff38d568b8b1184 +bfe5089019591292 +400318b41efa13ea +c003c3ab2b5f52f1 +40056bb1339542e1 +40076124b2a05e6d +4005c951529b44ad +40068b86e2545b32 +bfd6e4f5e9f8d1fa +bffdf9de8f338bd9 +4008f4696e8a90ac +400231f102a158d7 +4003839924d4b93a +3ff578ab11357e8a +3ffc16b9950a38b0 +4005883733a08236 +3ffdb63c82f9ce89 +3ff1ec1387db28a1 +bff9f071bb7d6c4e +c007790cdd02370e +3fffccda5b00b6f4 +bfe46d4666b6d71c +3feba04517130189 +bffe28671195de0a +40026a4d996bc760 +bffdc3953de868da +bff8d2cdefff9b80 +bff57568bcc6fa24 +3fd9de7e0f75ab91 +4004e0d1a4668d81 +40010f2d4ae01172 +40010e82bdc65d52 +c000dd70d4c77b55 +c0047f0cba451b34 +3feca669fc6c552f +3fc363c97fd52703 +bfee01705522c0d1 +3fe4e195cfe7f5d4 +3ff0e7b2276a6f12 +c0031e210b48faae +c006d58e3df42544 +3fe745a20093dd92 +3ff9b894e0c2aaef +3fc0fbbee354d6f8 +bffcd212b89fda3f +bff5a2a2641e643d +bfe3b57d558090b0 +40034130dc3c372e +c0079b144bbb6936 +bffd32cb5f856751 +c0083b4ad926f6ae +3fe5e5b958bacf0b +bfea35a2df7e923d +bff45f047027e13e +c003d552641f793a +c0023a0ac2c00da2 +bfdd44a5ea9d7aea +bfe58bcadbb2d059 +c006e6f3f05f053a +c007f33425d8a98c +bfed6771531fe1a1 +bfe8f52887b8a0da +4000405e511bee6c +40033c0d4ffce212 +c0081cb0c21e62c7 +c00660579ee08018 +c0010b9323e0af0f +3fe0311561e572ba +3fa039f58663b91d +3ff20b97b1073045 +40048e0641253438 +bfe63465d57630f8 +c003e6494265da78 +bff9519ff3f8caab +c0032590eb3bcb7c +bfe385a22060ff1c +bfebf744541cc4f4 +3ff41710903b5fb4 +3ffb69d7257d3868 +bfd49eb29c607e25 +4006ff482226d480 +bffe0a03ead7c3dc +3ff88bf81f208743 +3ff8149d47ea5454 +c0091c743ab6639c +bfe5a6d291e43612 +3fe94cec57d96c4f +3ff2013e1d01b104 +bffb762ca56ff4f6 +4005da5cf236ebbe +bfea50a2e31cc3d9 +3ffa7783d0dbf620 +c00878e4990c3b67 +bfe894a0a05160a8 +bff2ceaef60d2586 +bff66b2f585f9a9f +3ff27f8f068cea18 +3fece87bfd230b61 +bff237cd3caac65e +bfd8a0fac696bce0 +3ff3856e05a340d9 +40078ab44e56bf15 +3feb155176e8d33b +bffb0b95b05acb9a +bffb8e59f2d6b87b +3fe5d11532772fd9 +3ffd7acc0d14e019 +bfd03f9735f0a476 +c004b7188df11731 +400326bd5e34ad82 +40041544bf9ec15c +bfce21715209aa69 +3fee58ae0e238064 +c0032b5ee2a30d00 +bff25d834dc62961 +bfe21137c0cee9bc +c004f96d8dd86e23 +3fe00b98e09eb132 +3ff4cc2279cb13b4 +3ff4c7b686a93e3c +c007de82a80dbeb7 +bfe8c8d486caeaae +bfe40c73c9d50798 +4007c49f8d03ce86 +3fe73f6b85e394fe +4005dd44f448f73f +3ff607458fa5d3f6 +3ff93c4debc31645 +3fddfe1abc328451 +400502f503d180e2 +c002283914f94a30 +400784c27a2118f4 +3fd1043e1a2ac019 +3ff0b6a50b7a605d +3fff8d2a02134fb7 +3fda75ae5d2e4ab6 +bfe759aea0ec2696 +bfe521a35ec60812 +3ff754528dd45e86 +40077c5690a92a60 +4006df4a4d5e34a5 +3ff1cbf8af1f6403 +c0067c2bedbf1e84 +3ffe3e2f3c59c354 +bffae83bf81720a0 +3feb1b729352e29c +3fefa6f0084654ba +3fe2c5acc3009fb0 +bfec2b5151f96a2b +bfc6d7020051e2ec +3fe46a7071db18a8 +3fd37044f2eb5187 +3ff81acc8c404547 +bfb820dbefefa5dd +bffbd0ab41c67686 +3ffb6b63dfd5a7a2 +3fe76b8fb06d8f7f +400861fde2682398 +3ffed5fef652917f +bfe1167da75123ec +40042999f7af5e1d +4001b58d3b3d4f9e +4000ddfbb2d45424 +4000656825dea202 +bfb2ad0812f5b03e +400554c78ae9dfd6 +c003c8cfa452f35e +3fe32b43bcd49896 +3ff629840f1beb2e +c00914bce1ad83ec +bffdd986df22b5c4 +3ffd9fa6fadeaa8b +3ffc901ab501b6cc +bff56b2b619cc696 +4002233cd74de3d5 +3fd992a1bd752931 +3ff2c005b890ec05 +3fe0a0ca13fa1109 +bfe2a591e22dd0a9 +4003202f294c624a +bff2822599bba532 +bfeade28d5a43424 +c002b8ca9584c447 +bfc23a469f5959bd +3fff2fd9627cb188 +4008b79fce98a2cf +3fee7b333b03afff +4006b5bfd8263bfb +c002a0c54913a417 +3fff3ab19d863f09 +4000f9f449924c32 +c006649508f7b041 +3ffedc8834ddc249 +bffb7fa9fd8c7fd1 +bfef2028f9c27ea7 +3fe8906cf4828096 +40038c6ad896ad99 +3fe08d0c5fbc33f1 +bfc0b65413456fc2 +40063edb02675218 +3fa80324a84484e9 +bff54a1c0d4e33b2 +bfed6c718ebdfaab +bfa4c1298db6d8da +bfe5b808bbc175b6 +bfd846cea051ed26 +bfba424ebc70e4bf +c005e3e850e64de9 +4000489e27ec41ce +bfff04b5a29fe1ad +bff96328fff9b7cc +bff9e62cfc917e29 +bffe690b9e8b98b3 +bfe37f3b4fe12f36 +4007ce7e148f1969 +3ff232ecc48ba434 +bfea23a6a6a31c89 +40050dfe0245ee50 +bff4bd16bdea748b +c00364790c4ba009 +4008c3f5f19e714b +3fd4810864d2dba5 +c0080ed6f992c265 +c007a82732a9140f +3fe89edd824acd80 +3fef828c804af22c +c004002ede993858 +bffcc608acd049db +3fff86bdf544c72b +bfe4f78fee964e2d +4008751e1c841212 +c006415ba54b4005 +3ff5ffa82860b270 +3ff19ba00f754a38 +3ff1b93dd5f932ba +3ff4f9b025a58f05 +400342f306fa0c16 +c00635cc78e20209 +bfff94a4d1705f6f +c0012939b7362b60 +400874c9ec8a93e8 +c009070b06ccd145 +bff3f9e75e9f4812 +bff5ab3705df19d5 +3ff44b5bab5a9b68 +3fd7bcd726edd254 +bff2731f0aa9bd54 +3feb58b477bee26d +bffd8e002c6429b9 +c004775ef59a96c4 +bfe80a3961b4c1e4 +40032d71e937512e +c005b9f458d38ae4 +c00909d8cf442201 +c006cbf51477b8a8 +c0034e423e8f74e4 +bfd5090553ab27c3 +3fea9cf72972fede +c00371656e8c7bba +3fd04c84e41b369f +c003864c03c94214 +400725c63cd17bd9 +bfee1af3d0073822 +bffe3d4848fab7f7 +4000edb55ed7dbc4 +c002f9c5efdac176 +3fe9e200e21f2edf +3ff7db70e5a7b4ea +3feb93a246d3c625 +c0091d3c1034a240 +bff4bd1b861cb524 +400159d144f0c913 +bff3e605d7fd0b5c +3ff3d40771deff11 +4003abfeeaddcd62 +bfe8c6542d8f57af +4001894e8ab61615 +3fee3e0264dadad6 +bffe26b411d4a8b1 +c005a5c6d73837f6 +bff545a3cbc1f351 +bfee21dce2532b48 +bff436fb5033a691 +bfe4222785911697 +bff1c7db661509b1 +3f91af4353a0434c +bfe39b63f70d93a0 +bff21d868fb507bc +3fea3c14bfec42e6 +3fe5a287a15d99df +40037400538ca23e +bff0727679b985d1 +bfeb789ade0acd28 +3ff58021cab836d4 +bfd651a9432142b2 +c007b3c55ba785a7 +3ff71c4c984b50c4 +bffe485a6714d4d8 +c0004a800b15bf82 +40070d52c1526ba8 +3fe1cf0bf08e2dfe +3fc89f339b8fa0b8 +4000df40941393f6 +bfe5e15f8e8446ac +bfea39e88b7ea568 +4005c75ade0f61c6 +bfe3e999f70fc8d7 +3ff3073f832c560f +c000e7df4181e5a6 +c008ca888715f2d1 +bff23f17b1e6a9e8 +400611ab0ea36ad2 +c002ac7092403905 +bff8c6217fc300c5 +40024b98cef5ddf9 +4003f20b47de37ae +3ff2b428431580f6 +3fff76dfefcb230c +3ff19b6d6a8340b7 +bff92bde80e880f5 +3ffdc64c755d01eb +c007370d7f942324 +4001097bc64720e6 +4002ca655d00f69a +c008e8259877d167 +bfe14d485502fc72 +bfe23985d749513d +bffc0ed873d20f3f +bfeb049b8a3fa4c1 +bff5a17b70a6c78f +3ff203e376560a5e +c001a3d2dce6306c +c002ddbecaa283ee +bff012c13c6329db +bfe3043b59885570 +bfd88578f63f1f09 +3ff0e71c87d8b468 +3ff210b712edb29c +3ff921fb544276fc +3ff921f66b1527d1 +3e000ee7d1284d7b +3ff921fb54442d19 +3ff921fb8eee8e34 +3ff921fb540b4e23 +400921fb54442d18 +3ff921fb54442d12 +400921fb54442d18 +4007c8f416f3fcf3 +3a89686999911983 +3ff921fb5443f6be +3ff97bd98be46d29 +3ff921fb5444261a +3ff921fb54442d19 +400921fb54442d18 +3ff9220f9899e5b9 +3ff951cca24d91dc +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb54442d18 +3ff921fafe5c16bd +400921fa2fdd6e15 +3ff921fb54442d18 +3abb24c802ee7430 +3ff921fb54442d19 +400921fa10d505fe +3ff921fb54442d19 +400921fb54442d18 +400921fb54442d18 +3ff921fb54442d19 +3ff9054a88b96ed2 +3ff921fb54442d18 +3ff921fb54442d4f +3e17f27581d50469 +3ff8ed982dcb8d28 +3ec59100172140f4 +3ff921fb54442d18 +3ff921fb54442db2 +3ff921fb54442d18 +400921fb54442d18 +400921fb36b7b4ad +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb54444843 +3cba0d1abbf52fbe +3ff917704e8160bd +3ff921fb54442d18 +3f691a417e853f5c +400921fb54442d18 +40089b41c1b8e6f1 +3cd30b4601fbb584 +3ff921fb54442d18 +3ff921fb54442d18 +3ab456babc95bc43 +400921fb54442d18 +3ff921fb54731472 +3cabd7581397e6b6 +400921fb54431c5f +3ff921fb56b5c405 +3ff921fb57184dd4 +3ff921fb54442d2d +39bfe88fe886d56b +3ff921fb54442d18 +400921faa61b7f8e +3ff921fb54460185 +3ff921fb54442d18 +3c914d0c6bd5b4c5 +400919b0379be182 +3ff921fb54442d04 +3ffcd963d318abaf +400921fb260deab8 +400921fb54442d18 +3ff921fb54442d02 +400921fb5444215c +3ff9220125b000db +3e846cca15c80721 +3df96d106478047a +400921eda78d3570 +400921fb54442d18 +3ff921fb54442d18 +3f2401a228a015f5 +3ff921fb583a3b81 +3ff921fb54442d18 +400921fb54442d18 +3de0f4136e3ce911 +3ff921fc507d82fb +3d64e67a763f35bb +3ff921fb54442d19 +3c50b7145299d6a7 +400921fb54442d18 +3ff921fb51b7d188 +400921fb54442d18 +400921fb54442d18 +3ff921fb54442d18 +3ff921fb5444282d +40092139b7495ef4 +3ff921fb54442d17 +3ff921fb54442d19 +3ff921fb54442e14 +3ff921fb635c650d +400921fb54442d18 +400921fb54442d18 +3ab63228a549d63e +3ff921aa86f91cec +3cd10a9e12565ad6 +3ff921fb54442d19 +3b4c9dbc1dfa1144 +400921fb54442d18 +3feefd49c5519cab +3ff921fb54442d18 +3e7d64ec78e94c97 +3ff921fa110814d1 +400921fb54442d18 +3ff921fb54442d19 +3d0bd4d73a8cf35e +3cb1bf8cadd52b11 +3ff921fb54442d19 +3ffc17353fe5ddb1 +3ff921fb4af397d3 +3ff921fb54442d18 +400921fb1e0d0c79 +3ff6491905b35734 +400921f75b595954 +400921fb54442d18 +400921fb54442d14 +40091a9d52233d94 +400921fb5444097e +3a2a89a7eceb4b34 +3ff921fb54445782 +3a0d7696b509fcbd +400921fb54442d17 +3c4553005a1c4716 +3ff921fb54442d32 +3ff921fb54442d18 +400921fb54442d18 +400921fb54442d18 +3ff921fb54442c72 +3cfb01e61d8074f0 +3ff921fb54440433 +3ff921fb54442b85 +400921fb54442d18 +3ff91441dfb54348 +3ff921fb54442d19 +400921fb54442d18 +400921fb5441cf87 +3ff921fb54442d1a +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb5444494b +3b11d021700da5ab +3ff921fb54442cf4 +3d98e2547d571c2a +400921fb54442d18 +3ebd96e687f7bd68 +3b099d35d0339bf7 +3ff921fb54442d18 +3ff921fb54442cd2 +400921fb54442d18 +3ff921fb54442d19 +3ff921fb5444288d +3ff921fb54401475 +3ff921fb54442d18 +3ff921fb5443a1ee +3ff921fb54443d65 +3ff921fb54442d19 +3ff921fb54442d18 +3ff921fe092fe57f +400921fb54431eaa +400921fb54400998 +3ff921fb53851b13 +39feb943729c49fa +39dd4c49ec4e6d59 +3ff90e9e98963170 +40091f8c60a9c5d9 +3f95088e59f99229 +3ff921fb54442d18 +3ff91289cf0433c3 +3fc2aaf8d0badd89 +3ff9232142032aa1 +400921fb54442d18 +400921fb54442d18 +400921fb5443c953 +3ff91f33ad7f0952 +400921fb54442d18 +3ff921fb54443593 +3ff921fb54442d19 +3ff921fb5444bacb +3ff921fb54442d18 +3ff921fb54442d19 +400921f8aad832fb +3ff921fb54442d19 +400921fb54442bbd +3ff921fb54442d35 +3ff921fb54442d19 +3ff921fb54442d19 +3ff921fb54444c02 +400921fb54442d18 +3ff921fb54442d19 +3e35997e7e6ba5d8 +3ff9219cfe5e33f2 +3ff921fb54442d19 +3e89f490f8d10ea1 +3ff921fb54442d19 +3ff921fb49a3a5ba +3ff921fb54442d19 +400921fb40c30e19 +3ff921fb54442d18 +3fe0929fde2a7fe7 +3ff921fb5443b588 +3ff921fb54442d18 +3ff921fb533c7f4b +3ff921fb54442d19 +3ff921fb54442d19 +400921fa8f717190 +3ff9487df0064389 +3dfe03946aceaf20 +3ff921fb54442d19 +3db719dc673e46d0 +400921fb5442724c +3ff921fb54442d19 +3ff921fb54442d18 +400921fb50cc6daf +400921f2f7f31a84 +3ff921fb544d41a7 +3ff921fb54442d18 +3ffbffbb40d4d485 +3ff921fb54442d18 +3ff91f8a6d9f6ae9 +400921f9b0b36c2a +3ff921fb54442d18 +3ff921fb54b78847 +3bff7732b9be9131 +400921fb54442d18 +3dcc3ee966592792 +4001d9860c1b7963 +400921fb54441f86 +3ff921fb54442d48 +3ff921fb54442d18 +3eba895ef8c9e969 +3f5d27aa84d8c50b +3f7314b9a5db744d +3ff921fb54442d19 +3ff9220e7a1c56b4 +400921fb42e96362 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb54442cce +3ff921fb544c3ba0 +3f53337db0329353 +3ff921fb5311cef5 +3a7014ca01b6589e +3ff921fb54442d18 +3ff921fb54442d19 +3ff921fb544b8070 +3ff921fb4b19a480 +3a215dc9bd50ccc4 +3ff921fb54442d19 +3b1b7091169b5072 +3c61825df9a7f855 +3ff85212c750bce1 +400921fb46078531 +3ff921fb541a280b +3a45c17b04fb7589 +3a99f8f9ab63c388 +3e4971e53d55d8e0 +400921fb4ed9c0a9 +3ff921fbfb150536 +3ff921fb54442d19 +3ff921fb54442d19 +3c2cba7f0fd2ddc7 +3ff921fb54442d19 +3ff921dbb764aedb +3ff921fb54257b9d +3ff9244600eaca5a +400921fb54442d18 +3a07be5348dd9976 +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb05c8627b +400921fb54442d18 +3ff921fb54442d18 +3ff921fb54442d19 +3b30a3f29bddaf21 +3ff921fb54442d19 +400921fb54442d18 +400921252ff9a928 +3ff922005601fd29 +400921fb54442d18 +3ff91f91500d2416 +400921fb54442d18 +39d30bd6212b4fe3 +3ff921f8e49d8d27 +3ff04eee35ff8de4 +3ff921fb54442d18 +3dfd90807083ef97 +400921fb54442d18 +400921d4fb7a7436 +3b13089ff006ff2d +3ff921fb1ff02e4c +3ff921fb54442d18 +3ff921fb54442d18 +3ff921fb9547c042 +3ff921fb32814952 +3a829c20bf947486 +3d6e33d659626254 +3ff921fb56fed25a +3ff921fb54442d18 +3ff926a97a6cd8c8 +3ff921fb2af584ec +400921fb54442d18 +3b50fc8cf163cdc4 +3ff921fb54442d19 +400921fb54442d18 +400921f8c589ad9d +400921fb4fd34931 +3ff7668ee16869a2 +400921fb54442ce9 +3f108836070b1dda +3e18b6162a2f8318 +3d436af72de8f518 +3ea91ff778e28e84 +400921fb54442d18 +3e505f5de7a35db2 +3ff921fb54442d18 +3f699dc109b217d0 +3ff921fb54442d18 +400921fb3c2fbf76 +3ff921fb49590d44 +3ab58d648310f332 +400921fb54194db9 +3ff921fb54442d00 +3ff921fb54442d19 +3a4b8a2253a0a86f +3ff921fb54442d19 +3ff921fb5444bb67 +3ff921f7101d0119 +3ec17e0fdb14de3a +400921fb54442d18 +400921fb4a4daee6 +3ff921fb54b5f513 +3ff921fb5444f482 +3ff921fb5406d4a1 +3ff921fb54442d18 +3ff921fb54442d18 +400921fad1e581da +3ff921fb54442d19 +3ff921fb54442d19 +400921fb54442d18 +3ff921fb54442d18 +3ff921fb81d21cd2 +400921fb54442d18 +400921fb54442d18 +3f6e1bfb47631f88 +3beb20bd04c85f0e +3ff921fb54442818 +3ef82d76235a8a1a +3ff921fb54442d18 +3ff921fb543bbeaa +400921fa7ed523f8 +3ff921fb54442d19 +3e119e94e112fb52 +3bf20a2be4a660e9 +3ff92418fcfc17de +3ff921fb54145403 +3ff921937f447658 +3ff921fb54442d19 +4008754d330a6078 +3ff921fb5410ca2d +400921fb54442d18 +3ff921fb54442d18 +3ff92447b7d2f65f +3ff921fb8149756d +3ff921fb54442d18 +3ff921fb54442d18 +3b40ad4006902377 +3ff921fb54442d19 +3a0a98b26f46a3d1 +3bb7cb9b0dfe3a1c +3ff921fea62285dc +3ff921fb54449367 +3ff921fb54446b19 +3de5f97840d30e08 +3ff924838bd18c90 +3f33958da466c1a6 +400921fb54442d18 +3ef59ff0a858527f +3b15ff1d625b3f3c +3ff921fb54843df8 +3ff921fb54442d19 +3ff921fb54442ebb +400921fb54442c7e +3d06fd12bb4f8386 +3ff921f12fb568f7 +400921fb4d9ca79b +3ff99313fa12ba96 +3ff921fb54442d18 +400921fb54442d18 +3ea27ad32073c81b +3ff921fb54442d18 +3ff921fb54442d19 +3ff921cfa96e0c21 +400921fb4c5e5ab8 +400921fb53a97ff2 +400921fb54442d18 +400921fb54442d18 +3ff921fb54442d18 +3ff922443d713e10 +3b232418e69a8506 +3ff921fb5442d30a +3ff8fdaca5b5d2f7 +3bb070959182cd25 +400921fb54442d18 +400921fb5411c436 +3ff921fb54442ce1 +3ff921fb54442d18 +3aad38703ed9d7f8 +3c01d2892e5de985 +400921fb54442d18 +400921fb54442d18 +3e58764c3cb68f00 +3c35d81d7a116d46 +400921fb54442d18 +3e837de1e27f9a7b +400921fb53f94294 +3b7cc6d17c675f42 +3ff921fb54442ba0 +3ff921fb54442d19 +3ff921fb542f0e36 +3bd6c610d4af1dc6 +3ff921fb54442d19 +3ff921fb2a273583 +3ff921a1177d3092 +400921fb54442d18 +3d4047d839d230e4 +3ff921fb5443392a +3ff921fb54442d19 +3a58a048592c13c7 +3ff921fb54442d33 +400921fb54442d18 +400921fb54442d18 +3ff921fb54442d19 +400921fb54442d18 +3ff921fb54442d3e +3aabe293c2476c74 +3ff921fb64b14457 +3a26eaf251a1a01c +3b2c0b8b9f04869a +3ff921fb54442d17 +3ff921fb54442d19 +3a860ea29c86bda6 +3ff921fb54442d19 +3ff921fb55286c3e +400921fb54430a42 +3ee0d4482c30dfe6 +3de29874fb47c6fa +3c61301fe8d73823 +400921fb54442d18 +3c7bd1a10276d292 +3ff921fb54442d18 +400921fb54442cb3 +3ff921fb54442d17 +3ff921fb7a950ad0 +3ff921fb54442d18 +400921fb519b8359 +3ff921fb54442d19 +3ff92b97827d23bf +400921fb54442d18 +3ee0370ac585d38a +3aea77f2bdfa2d1e +3ff921fb547027ff +3ff921fb347042fd +3ff921fb54442d18 +3ff921fb54442d18 +400921fb54442d18 +3c20d956ab024e5f +3ff921fb54442d18 +400921fb54442a07 +3ff921fb54442cd3 +400921fb54442d18 +3ff921fb54442d04 +400921fb544424a4 +3ff921fb54442d19 +3ff921fb54442d19 +400921fb54442d18 +400921fb530eeb7c +400921fb54442d18 +3ff921fb54442d17 +3be2ad37084000af +3ff95a466f3aa674 +3f88da60ab05abc6 +3ff921fb54442d18 +400921fb51404773 +400921fb54442c7f +3d15582f6b9f587a +3c438016b23bdfc4 +400921fb54442d18 +3fe28ddf7a6e86d6 +3ff921fb54442e77 +3fa11c292228bb52 +400921fb54442633 +3ff921fb54442d19 +400921fb54212bcf +3ff921fb54448699 +3e54ce801e24c67b +3ff921fb56630633 +3ff921fb54442d19 +400921fb54442d18 +3b030a6936111ee4 +3b2235d0d789ed58 +3ff921fb54442d19 +@pow 2492 be56f6b8d917c477 +3ff0000000000000 +3ff0000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +8000000000000000 +fff0000000000000 +0000000000000000 +0000000000000000 +8000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +0000000000000000 +0000000000000000 +8000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +bff0000000000000 +bff0000000000000 +7ff8000000000000 +3ff0000000000000 +bff0000000000000 +3ff0000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0000000000000 +bff0000000000000 +7ff8000000000000 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +3fe6a09e667f3bcd +3fd0000000000000 +3fc0000000000000 +3f50000000000000 +3fbd0231bd5e9cfd +3fc37344cd2cafcb +3ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +3feffffffd3a37a0 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +4000000000000000 +3fe0000000000000 +3ff6a09e667f3bcd +4010000000000000 +4020000000000000 +4090000000000000 +4021a6637e666f83 +401a52d3c6f8818e +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff000000162e430 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +4008000000000000 +3fd5555555555555 +3ffbb67ae8584caa +4022000000000000 +403b000000000000 +40ecd52000000000 +403f8b55fadf3142 +4033d0202956e7bf +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff0000002327d4f +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +4024000000000000 +3fb999999999999a +40094c583ada5b53 +4059000000000000 +408f400000000000 +4202a05f20000000 +4095a5d2ab3e544a +408055e1e4cb2a46 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff00000049aec70 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +400921fb54442d18 +3fd45f306dc9c883 +3ffc5bf891b4ef6a +4023bd3cc9be45de +403f019b59389d7b +40f6dd00c27647fc +40423b280bc73ebd +4036758b5c381110 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff00000024a1a09 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +4005bf0a8b145769 +3fd78b56362cef38 +3ffa61298e1e069c +401d8e64b8d4ddad +403415e5bf6fb105 +40d5829dcf95055c +403724046eb09338 +402e4efb75e45278 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff0000002000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +01a56e1fc2f8f359 +7e37e43c8800759b +20ca2fe76a3f9475 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +3feffff534e7ae00 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +7e37e43c8800759c +01a56e1fc2f8f359 +5f138d352e5096af +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff00005658dfafd +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +0000000000000001 +7ff0000000000000 +1e60000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +3feffff45e3f7afd +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +0010000000000000 +7fd0000000000000 +2000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +3feffff4ee6bfb53 +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +7fefffffffffffff +0004000000000000 +5fefffffffffffff +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff000058b91b5bd +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +fff0000000000000 +8000000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +7ff0000000000000 +7ff0000000000000 +fff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3e40000000000000 +41a0000000000000 +3f16a09e667f3bcd +3c90000000000000 +3ae0000000000000 +2f10000000000000 +3aa216a5dddfa30a +3b585befdd87f7e7 +3ff0000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +0000000000000000 +7ff8000000000000 +0000000000000000 +7ff0000000000000 +3fefffffb523de3b +0000000000000000 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +4120000000000000 +3ec0000000000000 +4086a09e667f3bcd +4250000000000000 +4380000000000000 +4bd0000000000000 +43a9d133c34b70f3 +43290f89f57bb782 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff000001a56efa4 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +415854a640000000 +3e850b1cac0206ba +40a3bafea82a872d +42c27fd94c2fb880 +442c21a55f856ae8 +4e1087be67445da4 +44602a26ecf93793 +43c5cba2b5c006b5 +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff000001f5636e4 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +41583fc4141c97d0 +3e851d3c1726f839 +40a3b2852735ea17 +42c260252eeb8ab9 +442bd97389aa9362 +4e0ff7f75266f6b4 +445ffd70e5a499da +43c598ee0724658a +3ff0000000000000 +7ff0000000000000 +3ff0000000000000 +3ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +0000000000000000 +3ff000001f547eb1 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +c33d02967c31cdb5 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +0000000000000000 +3f91e1dd87742a65 +3fa1e7b4c4374f41 +3faae79187d69b8c +3fb1f94f286fb302 +3fb6851efedc6460 +3fbb17a6a870fcf8 +3fbfb11f3a7553ee +3fc228cab5d9f708 +3fc47c77ef5739ea +3fc6d379eaf8feb9 +3fc92da47245634c +3fcb8abdf85136c4 +3fcdea80df199538 +3fd0264e494c7213 +3fd1585b42cedea0 +3fd28b358c645dea +3fd3bea738d524be +3fd4f276a327087b +3fd62666d0291f35 +3fd75a37cce5d6e4 +3fd88da70ac9cdcc +3fd9c06fba0f4744 +3fdaf24b22cdf4cc +3fdc22f0fce930d7 +3fdd5217c6f9211d +3fde7f751c33ae68 +3fdfaabe09478c68 +3fe069d3b0065d5d +3fe0fcf304f123de +3fe18e97ac441438 +3fe21e9caa9ea428 +3fe2acdd86f29cd2 +3fe339366ffaf5b3 +3fe3c38460762414 +3fe44ba542033be0 +3fe4d1780e81c28c +3fe554dcefd52043 +3fe5d5b55dee206f +3fe653e43afee180 +3fe6cf4dedbfe07b +3fe747d879af695c +3fe7bd6b9537960e +3fe82ff0bdaa1e54 +3fe89f5349047f96 +3fe90b8075726927 +3fe974677687d4c0 +3fe9d9f9802fb97e +3fea3c29cf4fcf06 +3fea9aedb0255536 +3feaf63c826241c9 +3feb4e0fbb15881e +3feba262e46c5ff0 +3febf3339b5d777c +3fec40818b51d5cb +3fec8a4e67e1d4ed +3fecd09de4bf05f9 +3fed1375abe5fc77 +3fed52dd5234eaf3 +3fed8ede4a85a362 +3fedc783d76af359 +3fedfcdafbb27491 +3fee2ef269ccc6a8 +3fee5dda723ebffc +3fee89a4f13e7ac7 +3feeb2653b9f3b58 +3feed8300b2f0791 +3feefb1b6aa86983 +3fef1b3ea15a4379 +3fef38b21ea6d6d7 +3fef538f657a2d42 +3fef6bf0f7d6f9e1 +3fef81f24297cb66 +3fef95af89810c9a +3fefa745d3bedd25 +3fefb6d2d8e84491 +3fefc474ee9fab22 +3fefd04af6e6e40f +3fefda744f3b6fe5 +3fefe310c08df92a +3fefea4070266d18 +3feff023d1847b23 +3feff4db994abbad +3feff888b141451f +3feffb4c2d7b11c0 +3feffd4742a84bd0 +3feffe9b3d9e63b2 +3fefff697c1dbff7 +3fefffd366dbe3f6 +3feffffa6cd8198d +3ff0000000000000 +3ff00002c9946f8a +3ff000164cb12230 +3ff0004b435321ca +3ff000b268f5d992 +3ff0015c7c4f77d2 +3ff0025a41c30971 +3ff003bc868b11fe +3ff00594249fca19 +3ff007f2075cb316 +3ff00ae730e9d21e +3ff00e84c06da9a9 +3ff012dbf90defb1 +3ff017fe49c60c7b +3ff01dfd561ba44b +3ff024eaffbad14d +3ff02cd971054726 +3ff035db28a163af +3ff040030618366c +3ff04b645793d183 +3ff05812e8d1cb35 +3ff066231360c015 +3ff075a9d042ef7e +3ff086bccb13c295 +3ff0997276d24201 +3ff0ade2247741c8 +3ff0c4241b837322 +3ff0dc51b4b7b313 +3ff0f6857730f07c +3ff112db3829087b +3ff131703da7272a +3ff152636474c6d1 +3ff175d549b88cf1 +3ff19be878a64a2f +3ff1c4c19cc39de9 +3ff1f087b953973b +3ff21f6466919e6e +3ff25184157d91ea +3ff287165b190449 +3ff2c04e4418cc36 +3ff2fd62b237a508 +3ff33e8ec487c2d3 +3ff384124c5b89ab +3ff3ce3250a3005a +3ff41d39a1ee85e2 +3ff4717981aac652 +3ff4cb4a5fa1a8f8 +3ff52b0cb15cad3f +3ff59129e7b4d828 +3ff5fe1587b27b66 +3ff6724e6ce55f7a +3ff6ee603ca0852b +3ff772e51313ac58 +3ff80087752cb34e +3ff89804949697d0 +3ff93a2ef636c74c +3ff9e7f18f62444a +3ffaa25372e95816 +3ffb6a7c2d5dd9f3 +3ffc41b8f80f1625 +3ffd2982f4ba2e1a +3ffe2386b1b45fdb +3fff31ad4887fc54 +40002b13c0a02292 +4000c9bdc2a45678 +4001764aec96153a +4002326f48c72836 +4003002a0652bba4 +4003e1d678927d84 +4004da41ef382ddc +4005ecc818dd7bd7 +40071d78586bd6a2 +40087147878d44aa +4009ee53431001f0 +400b9c3e6c551d44 +400d84b2a17778e9 +400fb41925103891 +40111d5485d52a18 +401296fe33c960ba +401455c1294abc50 +40166e34321197d0 +4018fe0fbed3c065 +401c31e1d9ea2ec4 +402027d28bb17d40 +4022e5f6dc9fc06b +4026bc3f617b17da +402c7c5dc2a3f09c +403307bd0949f8d7 +403c985f1fcc90ea +404ca1b620bf8c69 +433d02967c31cdb5 +3ff0000000000000 +3fed7b0a7e32b3dd +3feb28dc1d697c98 +3fe70d279dd59e7d +3ff2d9fd70d1a127 +3ff15e09c2df078e +3fee1dad289ec44c +3fee4c2da866719a +3fefc93882ae4aac +3ff0000000000000 +3fed7b0a7e192ef9 +3feb28dc1d3a777d +3fe70d279d85cdcc +3ff2d9fd70f24420 +3ff15e09c2ee1026 +3fee1dad288b79c8 +3fee4c2da854f5a7 +3fefc93882ac0a5c +3ff0000000000000 +3fed779a339fc269 +3feb2286835895c9 +3fe702683db20722 +3ff2de6405f200b9 +3ff16010960b6c44 +3fee1b13aa7cad36 +3fee49d27d105a38 +3fefc8ead64fe9d6 +3ff0000000000000 +3fed7bf880a0b293 +3feb2a92af09e2c7 +3fe710102b0c899b +3ff2d8cd1abadf7d +3ff15d7d908f8196 +3fee1e611409cb34 +3fee4cd0b9772165 +3fefc94d81813d8b +3ff0000000000000 +3fed7c262235fbfe +3feb2ae6c5b86c82 +3fe7109ef1ee7a39 +3ff2d892c5184f14 +3ff15d62b0adf6f6 +3fee1e839261dc08 +3fee4ceffca25e0f +3fefc95187e5927b +3ff0000000000000 +3fed7b15e287f52c +3feb28f11ae2d922 +3fe70d4b3f3aa298 +3ff2d9eedf2073fc +3ff15e030cd70f25 +3fee1db5c535f380 +3fee4c35767f34d1 +3fefc93983f39e52 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fe1b843a5eaed1f +400cb9345ff1c08e +3fffb59d58501be0 +7ff8000000000000 +7ff8000000000000 +402098e4496d290b +3ff516ea4ce3998e +3fee1e86cbc54c31 +7ff8000000000000 +3ff40cb82df07d0e +7ff8000000000000 +7ff8000000000000 +3ff3b05c154c240a +7ff8000000000000 +40118df46bee5be7 +7ff8000000000000 +3fdf22a58f2c65c5 +7ff8000000000000 +7ff8000000000000 +3ff7301940f4cf8b +3fe72e16f8466290 +3ff3887afe83e3c7 +3fdf33befa2c6772 +3fe604187b38b716 +7ff8000000000000 +3ff4239f15809889 +3f955f69fa8d9c97 +3ff00ebbf8829317 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff0149363995a9c +7ff8000000000000 +7ff8000000000000 +3fe55342cffd8488 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +4002878ad335f9cd +3ff85a7aa86cf345 +3ff8889f1e211c13 +3fec3c9d5f131dbe +3ff0e109834b3671 +7ff8000000000000 +3fd40fed41419980 +3ffe130204021ede +7ff8000000000000 +3fc9c38d689e5942 +7ff8000000000000 +7ff8000000000000 +3feb5ed5e1c5e8a6 +3fdec9c87ef0f088 +3fd9e80b425245b3 +7ff8000000000000 +3fc399e1113ea54d +3ff002ffdf934eac +7ff8000000000000 +7ff8000000000000 +3fef020ed6846685 +7ff8000000000000 +3ff1e4d9834fbd10 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff979a29fe93cb1 +7ff8000000000000 +3fdc457223565e85 +3fea575dddf26e68 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe0f981cb3a4108 +7ff8000000000000 +3ff07d434793a534 +3ff34391ee830b28 +3fdbf7e769298eca +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff29a5065313c82 +7ff8000000000000 +3fc36bda41ed8bd4 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe36399556f5b96 +7ff8000000000000 +3feaa7c3cc5e85cb +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +401be0a62ad74cf5 +7ff8000000000000 +3ff6ba773ba92892 +3ff14a67bb5ff438 +4032387c9e08cbd0 +7ff8000000000000 +3fda6b01064ac025 +7ff8000000000000 +40028dec8f5b0337 +405105afdcc75870 +7ff8000000000000 +3fe67599cd89be4e +3fe1e0c5d620e77c +3ff6210720b5721a +4003a3c1dcb0dab9 +3fa75b009f17ce6a +402fc0fdf2bc9906 +7ff8000000000000 +3fd553b48465a54a +3ff00cda10686061 +40023b00155cf036 +7ff8000000000000 +7ff8000000000000 +3ff22a316fa093d0 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff3fc15f3406716 +3ff73d9a25a9807b +7ff8000000000000 +7ff8000000000000 +3fedb04c131fd94a +7ff8000000000000 +3ff4b9d0565dc332 +7ff8000000000000 +7ff8000000000000 +3fef2737615b3d19 +3feb269dda409b27 +7ff8000000000000 +40031559bcff5d49 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe497cb60c3b242 +3fe5c000d9c35a8b +401d3921e7c0335c +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff69a7aa6d535c7 +7ff8000000000000 +3ff3dbb19bb7720c +4005556089bb35bd +3febf4f797485eee +7ff8000000000000 +7ff8000000000000 +3fd8d4236b4e7c1d +7ff8000000000000 +3fec0c5f60aa9b10 +3fecec51cc89b23c +3ffb72aa68b390f6 +7ff8000000000000 +3fc46009b3c9870c +3fa86b56f8ccb4c2 +7ff8000000000000 +3feb6786ba07230f +7ff8000000000000 +7ff8000000000000 +3fdc38a8a125ba8b +7ff8000000000000 +3fea36acdcbeba2c +7ff8000000000000 +3fe435f784a3bcc7 +3ffb89861f523c7b +7ff8000000000000 +3fec50a340a2fbb6 +7ff8000000000000 +3fc19b986ed046b7 +4001d00c3db8c8b8 +3fe3ddcc600439e0 +3fef811ed6009615 +3ff362a0f126f6d5 +7ff8000000000000 +7ff8000000000000 +3fe18ad271ad9eaa +3fed48f81de35e97 +3feefe253a4abc90 +40035090b1d0d4c8 +3fe50455c7233e4e +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff23c23d35cdc7a +3fecdfed4cb8d9eb +3fa8c1cd0bd1eeac +404cc04ae00815c8 +3ff46edb01e4d846 +3ff4c19c70097b29 +7ff8000000000000 +7ff8000000000000 +3fe31cb0d8dae399 +3ff408307adfec0b +7ff8000000000000 +4016a85992c0f970 +3fe87c658b2f0e5c +3fe3e9703a29a508 +3fe5e8dc446665e4 +4013789101609057 +3ff403506c56262c +7ff8000000000000 +400a93050af14ce6 +3ff60a99f1cb98bc +7ff8000000000000 +3fde65bcb7a6cf20 +3ffb17bda9343d26 +7ff8000000000000 +7ff8000000000000 +3ff270345e5df444 +3ff7a408fb60e72d +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ffc2a383aed7755 +3fe24d40b2c97ca5 +7ff8000000000000 +3ff2af9a0002e257 +3fae9b97441ad42d +3ff21c6ccc42574c +7ff8000000000000 +7ff8000000000000 +4012d9ca305d7fd8 +3fe0311f322011fa +7ff8000000000000 +7ff8000000000000 +3fedc3ab86794bf7 +3fda6efea9960ded +7ff8000000000000 +7ff8000000000000 +3ff534fa90840ca0 +3fec6d5b662c61d7 +3ff65408a28a7a6e +401ce6318a367977 +3ffea574bc25df25 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fec2d413a012e86 +3ffdf562c276f9fc +7ff8000000000000 +7ff8000000000000 +4016311ed8ed8b7c +3ff88a39ec0b207b +3ff0eea5dec1dc7e +3fe2746b15bd5e9d +7ff8000000000000 +7ff8000000000000 +3fe253f9aed910cd +3ff0d6b59c34f277 +3fefcd07d0f435bb +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe9f6e5d8cc196d +7ff8000000000000 +40028a063bd96b02 +403abd08a758ecb4 +7ff8000000000000 +3ff22f91eeb55a87 +400319531bf3a2de +7ff8000000000000 +7ff8000000000000 +3ff3b842c53f11f3 +3ff74a267051240d +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff020201d2b2bf2 +3ff1aa2896713903 +4013f35e46973129 +7ff8000000000000 +7ff8000000000000 +3fe95fab94adb85b +7ff8000000000000 +3fec4c54e127d7ae +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe482069f74629f +7ff8000000000000 +3fda908562eb4a0f +400f2752e7e0ba9a +4022feb64ffbb6f2 +7ff8000000000000 +7ff8000000000000 +3fc06c956bc2ae73 +7ff8000000000000 +3fe392bde8c7094a +3ff0bded91c96417 +7ff8000000000000 +3f88a236c92edebd +3ff016e24efb0ee4 +3fef4cd8e579eb20 +3ff17289a836b77b +3fecb0a190daefb6 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +401bbd473001d2fe +3fdeac6679b06eb4 +3ff6b89e2a3440f8 +3fee16899b6c6c97 +3ff1fd5ccf90876a +7ff8000000000000 +3fe9a82b81066bed +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3feacf844b89ebd8 +40076ab7390d17e4 +7ff8000000000000 +7ff8000000000000 +3fe9fba3fefd4cad +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ffacbfbe923fe84 +7ff8000000000000 +3fdd2d74c9886e2f +7ff8000000000000 +3ffa28d51b63cb0c +3ff22c17c673f890 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe9accca9fe7262 +40305f6c2283d268 +7ff8000000000000 +7ff8000000000000 +3fe7e676b7338f61 +7ff8000000000000 +7ff8000000000000 +3fef2da973729fe0 +3ff2b9726ac0e0c0 +3fc571bdcc064eaa +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +40009090336dff67 +7ff8000000000000 +3fe995a3666940a1 +7ff8000000000000 +7ff8000000000000 +3ffb9f09de0472b3 +7ff8000000000000 +3fe3b5f448e4e44b +3ff5b5af73adb8bc +7ff8000000000000 +7ff8000000000000 +3ff1022130cd07aa +3fae76a906509af1 +7ff8000000000000 +3fee3c6996043541 +3fff801e72d1664d +7ff8000000000000 +3fd62bf6a9b6c459 +3ff1d590c181efe6 +40031c29c620511f +3ff0cee9b6c398a5 +3ff7d6010e9dde08 +7ff8000000000000 +3fd793bb82ebfae2 +7ff8000000000000 +7ff8000000000000 +3fe885a8b650cc5b +3fe545ae199eae64 +40067a67c23ae1e4 +3ff0f6d1facdd170 +7ff8000000000000 +3ff09fee4842b107 +3ff567444f528d6e +3fdddd3163614270 +7ff8000000000000 +7ff8000000000000 +3fe281a23d0c32e1 +3ff97b306c654349 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff01615d8195e23 +7ff8000000000000 +3fef11e4f33f9138 +3fef07d2600a709f +7ff8000000000000 +3fea66855de7d234 +7ff8000000000000 +3fe7cbc03afcdcbe +3fe4e63fd3a4b7ad +7ff8000000000000 +3fcb8726a1a52028 +3ff92522788cdd7c +3fcaa8d59d8bd70b +4000d7d5cc68d892 +3fecad21e5b5ebe1 +7ff8000000000000 +3ff00936e151de0c +3fefdcd2ed8433b5 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe17427865da6af +3ff08b9a714b582f +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fd38a1b15b4f0c1 +3fd621dd32248c2f +3fd53de20ce43117 +7ff8000000000000 +3fe47e962fc9d232 +3ff0622d6e0ea443 +3fe1fd77f37a0db4 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff2ba731926dd50 +7ff8000000000000 +3fdfe334c8c073fb +3ff006cb8416d15d +40024973df0c4080 +3ff68be6db1439c9 +7ff8000000000000 +3fec93c442b71bc4 +7ff8000000000000 +4001137a57b1f4c6 +3fc1a67ae74d3766 +7ff8000000000000 +7ff8000000000000 +3ff9c1dbd9f10974 +7ff8000000000000 +7ff8000000000000 +3ff650b5c8602e0e +7ff8000000000000 +3ffac224744572ce +7ff8000000000000 +7ff8000000000000 +4032a9859a0fc41b +7ff8000000000000 +7ff8000000000000 +3fee52d963e1c4f1 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ffe1b73001eedf0 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +4006533d9976ca94 +7ff8000000000000 +3ffd633e2b528028 +4000ab3cfea476e6 +7ff8000000000000 +7ff8000000000000 +3ff5fd05715bac44 +3fe06fe804203990 +3fc90e151d4eb32a +4000d524fc7b9c9c +3fe1264f4b9bf3e0 +3fe73243663bbe30 +3fe22eea1948f9f0 +4005f5912b1d3118 +7ff8000000000000 +7ff8000000000000 +3ff012bf5a5fcf96 +3fef918b0e770265 +4010fc56cad9cfec +4005144ad8dfe9bf +3ff16b8eead6a7e7 +3ff54e2f5f17813a +7ff8000000000000 +7ff8000000000000 +3ff6e10003413bf6 +7ff8000000000000 +7ff8000000000000 +3fefd221bbfb9f04 +7ff8000000000000 +402ab6b3c00809ec +7ff8000000000000 +7ff8000000000000 +3f7f4b723c09a984 +7ff8000000000000 +3fec465e7009ed14 +7ff8000000000000 +7ff8000000000000 +3fddcaf4c7f1c861 +3fee52954a55ee23 +3fe5388abe68f6a0 +7ff8000000000000 +3ff1d128172958b3 +3ff4dc2216b0d2e0 +401b700a9bc33c8b +3ff2b5bdc3037356 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3feb752dc70a7a52 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe2eb14d6164ff2 +3ff39d962b0dd23a +7ff8000000000000 +3fe7f469ae51f350 +3faa4818f6f66268 +3ff35fe3a88674cb +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff36571650f79fe +7ff8000000000000 +40463e55aae76cc7 +403f9b6cc61f8112 +7ff8000000000000 +7ff8000000000000 +3fe1d81eb0f96773 +3ff0ad0dd78745fe +3ff3e0029bd3a268 +7ff8000000000000 +3ff559720fe8dc42 +3feabbb70b01f275 +3fe92f503b4d9d7a +3febbb0a2a4e5d25 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +401ad05bb2c7982a +3ffcf2f7b85cc53c +40a59c4d910e8760 +7ff8000000000000 +3ff74f7ed3a8ea1e +3feb00638209c18d +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fdff9077d57d5e3 +7ff8000000000000 +3fe0fbd4f62e020c +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe401a6697ea675 +3fe862d94238cce0 +3fd5d6b30b2fdb78 +3fedab453ca90abe +3ff11060065e66d6 +40003d21462aa68f +7ff8000000000000 +40003e6eebca1502 +3fc1ae8cbab7c5cd +7ff8000000000000 +3fef07d19b340b99 +3ff06818e57dc5ce +7ff8000000000000 +7ff8000000000000 +3fe37a4e56826183 +7ff8000000000000 +7ff8000000000000 +3fe5f203ace6924f +40092b6b04d03f54 +3fe75b6dd9e902d0 +3ff5dd547f3d9775 +3ff186364e2909d8 +3ff185f993268dc6 +7ff8000000000000 +3fe69cae85f0877b +3feb686c1a7eaa99 +3fed6540f40cbec8 +7ff8000000000000 +3fe18d0a44d0f39c +3ffc1cb21f0bad80 +3fe5c065b83806dc +7ff8000000000000 +3f9f93e0cb2062b3 +7ff8000000000000 +3fd77d66f0e6597e +3fef21ca19763c69 +7ff8000000000000 +3fe7b58c1bfb334a +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff7c720c7c19f69 +7ff8000000000000 +3ff8615902df1ef3 +7ff8000000000000 +7ff8000000000000 +3fcdf8b703e2ea24 +40129dbb0cc83c08 +7ff8000000000000 +3ff16edd9c07c8a3 +3ff690367e6a2f01 +7ff8000000000000 +7ff8000000000000 +3ff589b6d0352b5d +400232710118bef6 +3fe54cb7ec9ac17e +7ff8000000000000 +3fe6885b2bd15024 +3fbd7d9beade5837 +7ff8000000000000 +3fe1f3751d8a9159 +3fd0f51a0a4c0766 +3fe44f9ac8e61955 +7ff8000000000000 +4011697c3541722b +3fef8f54028815c4 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +4007a93a7344ba24 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff4d74dca5ee5d4 +3fed1f1c51b3505b +7ff8000000000000 +7ff8000000000000 +3fe3eaff943f18f6 +7ff8000000000000 +3feeb158e21d6c6c +3ff9136dbcccf3dc +7ff8000000000000 +7ff8000000000000 +40011afbe335fa14 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fff64b99973015e +40235a00df5c5c9c +3ff5495cd4800bd4 +4003d633a57a7122 +3fea10c1f002c9a0 +3fe087c9b843a56c +7ff8000000000000 +3ff2c292f8a1908f +7ff8000000000000 +3fda9c52ef301a7a +7ff8000000000000 +401bb9412259279c +7ff8000000000000 +407ff4b5876b9630 +3fde25c7028cac89 +7ff8000000000000 +3fdedac2c6cd2112 +3feddaff7ff836aa +3fcad02ea95797d9 +3feba936c0853539 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fadd91d2eb072e3 +7ff8000000000000 +7ff8000000000000 +3fd9eff0ff0a403a +7ff8000000000000 +40008ffd56ea5897 +40137142825c04ab +3ff5ca59b1a12d00 +400571b168a321d4 +7ff8000000000000 +7ff8000000000000 +405e8dbb966c90e2 +3fe98a703d936a18 +3fe4b0159f26a0b2 +3fefeb7ed8676390 +3ff0917aea6dbbb3 +3ff5866de77340f5 +3fe73769f16d2f6c +3ff8db4487353ca4 +7ff8000000000000 +7ff8000000000000 +3fe3eb0bb113d220 +7ff8000000000000 +3fe89c3d3be929aa +7ff8000000000000 +3fd3211f872c7d76 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fdb2d8170e8e0c2 +3fedffeb81fea6f1 +3fe8830dc286c592 +3fe9eba6c8e75c1f +7ff8000000000000 +7ff8000000000000 +3ff2540e699e7ff6 +3fbab2fd69f0257d +7ff8000000000000 +3ffe08bb30645025 +3fedf4e04f0c1bc1 +7ff8000000000000 +7ff8000000000000 +3fe6b152d306d7ce +3fefed57139f6f44 +3fc82f3db09a9d8d +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff7b09d49535308 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fea15e67d3796d7 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe8c43a2f36ea60 +3fdaf2d53bcb816d +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3feb26c9f556abd6 +3f88fd7bfe13bf3d +3ffeb390f576f10e +3ff134414cb5efe4 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff2002c28bc7f40 +3ff0b529e181bc33 +7ff8000000000000 +3ffd09e7ef992b31 +7ff8000000000000 +3ff0b6c46c39d0b5 +3ff0319bc2fa1440 +7ff8000000000000 +7ff8000000000000 +3ff3ac7c7d1d38f3 +3ff226f33e491d50 +7ff8000000000000 +4001c8d840c334a5 +7ff8000000000000 +3fef89279f2c46dc +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ffc503900a50741 +3fe9bcd07bf18bea +7ff8000000000000 +7ff8000000000000 +3ff3865d9b8b7002 +4018b25fb5a0626e +3ff797012a7b3232 +7ff8000000000000 +7ff8000000000000 +3ff5c290e454bf46 +3ff01308fd58db3e +7ff8000000000000 +7ff8000000000000 +3ff29358de23b870 +3fe1f60d3c528122 +7ff8000000000000 +3feba971cf8b76c3 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe98505fb7c31e4 +3ff42b98c825bdd5 +3ff448939c63e2d6 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +40206e1b788bbd0e +3ffebab328b2824b +400238bd7e9b84ac +3ff302bd562133c0 +3feff31fb7c64620 +3fe2c18e99d7b6f4 +3ff2bc1d4503794c +7ff8000000000000 +40174fa993c19977 +3fd16326925ebac0 +3fee6b89135a8cec +3fe2921bb4896d8a +3fdd1c911023c0dc +7ff8000000000000 +7ff8000000000000 +3ff230f8e30d8b34 +4016bf29067828f0 +4007db928c6aa438 +3ff99cad7972d7d0 +7ff8000000000000 +3feba58de8c8bbb4 +7ff8000000000000 +3ff71aea63d738d0 +3ff0f15e06147be9 +3fe44e7f8f52a789 +7ff8000000000000 +7ff8000000000000 +3fe621eb6c570afe +3fd871044802cd67 +3fef47df6eabaaef +7ff8000000000000 +7ff8000000000000 +3fec37d432edd24c +3fefce7bcf9fe1c2 +4017d58d2fcc93b3 +3fef60f004dab5c9 +7ff8000000000000 +3ff58766ae625f6f +3fdd690e1bda3297 +3feb7f88e8e27daa +3ff1edb86136c7b1 +7ff8000000000000 +3ff2d0686bcc6232 +7ff8000000000000 +3ff9067b6b418f9d +3fede44843e8c3cb +7ff8000000000000 +7ff8000000000000 +3fe8afd8c92e3c02 +3feb316d1d8cd014 +7ff8000000000000 +3fdc0133697ed61d +3fe1a7d1eade7536 +3ff36c39a2ea8fe6 +3fea51774a2c43e4 +7ff8000000000000 +3ff6e665339cc6e2 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe613cf4db27060 +40431e24e68c03e7 +3ff4d66e5df4a246 +40067a092dee9736 +7ff8000000000000 +3fe8ca4cef2a12a8 +3fea6b68630737e7 +7ff8000000000000 +3ff12684bd50ea81 +7ff8000000000000 +7ff8000000000000 +3fed685616eb8c9d +3ff8b0af2662903f +3fedb291257e3203 +7ff8000000000000 +4002e1e3e872284e +3f93e115272a25de +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3fe59e7c5ea94ec6 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +401d40087542f21e +3ff15c5629545f74 +7ff8000000000000 +3ff46feae5920920 +7ff8000000000000 +7ff8000000000000 +402ac117de6884a4 +3fd8f31645fd0f4c +7ff8000000000000 +7ff8000000000000 +400588fff22ac620 +3fe915d0e3f02681 +7ff8000000000000 +7ff8000000000000 +3ff0ef8b93d9dca4 +7ff8000000000000 +3ff37902f3506067 +7ff8000000000000 +3ff3c35d2e5a4480 +3feaffa4b39a8608 +3ff7bd635f92fc84 +3ff2d68c213c0aa3 +3fd589e4e5d0b515 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +40253b1fe48f4774 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff71e5300d8517c +3fd9a8aa588760cb +7ff8000000000000 +3ffd02055d225d29 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff7bc367686ec0c +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +4009a7f624edb8bb +7ff8000000000000 +3fcf74c8d01a59c9 +7ff8000000000000 +400facb66f156f03 +7ff8000000000000 +7ff8000000000000 +3fe064971a7ce9a4 +7ff8000000000000 +3fede8f7589ec5ec +3ff1b4037bac77ca +3ffe122de0903b69 +7ff8000000000000 +7ff8000000000000 +3feb209537029981 +7ff8000000000000 +3fec38a57089af63 +3fea4da111c669ab +7ff8000000000000 +3fd7db0575396c53 +3ff5e0ff36d48c23 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3f7de87b12f0ba5e +7ff8000000000000 +7ff8000000000000 +4007b9db36ce4388 +3feeef74dd622622 +3fee3f1de815f8f3 +7ff8000000000000 +7ff8000000000000 +3ff12bd21e64bb0e +7ff8000000000000 +7ff8000000000000 +3ff0441a3b0badfd +7ff8000000000000 +7ff8000000000000 +400fb1d8adadc4a5 +3ff0722d86596c67 +3fc614384162cfc8 +3fec5d35e0c4a1c5 +7ff8000000000000 +7ff8000000000000 +3ffba5e55cf4f085 +7ff8000000000000 +3ff727c7536973bd +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ffcaa7086316e59 +7ff8000000000000 +7ff8000000000000 +3fe5c9dbe696784a +3ff89f56db8c58f0 +3ffa012b758a6b9c +3fec30db73d59355 +3ffe2995db91e52b +7ff8000000000000 +3ff1babcfc776f9f +7ff8000000000000 +3ff3867e3eb337e7 +3fd0812c33711c6d +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ffd83d877f34657 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +3ff2ad3b61941c04 +3ffd8c888da0560e +4215ccfadfdc8f86 +43166e25f6f80664 +3c8280a46599d0d0 +3858c90b74c873e5 +3d90c3c2e1649648 +441eee3923d0981e +4073606ac708ea6e +44db8e137a83d2a8 +4c42f152240f1648 +40216439854d5a8f +3e521ce599af5347 +419917701845b64c +3f31024b4fe8b9c8 +477a99fe23b045e7 +3bc057790e81c50c +42ceb62c55863dc5 +3cf116f56677e5c1 +3fef26f5a0dc15c5 +470750d6736cbf2c +3da61e7f730ba8ef +4b165e29fd79e0ac +4404bc25d17a1152 +407ae8359aff2931 +47dc3c9adf2f5930 +3211d8487037ac4a +33d200225e7c8f3c +423e9392a0c79c50 +372289ea7e3e7cbf +41b40b6d09c87a90 +4874df1dd4d6f98d +3ee7e20cfa8bdb99 +40e31a55fbba8c9c +45f5f6667736f2ac +3a161c55c943019c +3cbd58cf5497d714 +4139af959e30b61c +3f50ae3c64001b8e +459a3499afe1564c +3bfaf8a0813002de +41899f99d7d12178 +4362d2931fd3922a +41c35be832caadcb +407b945f925624fb +357ac606bbca9efb +3c486b4f7f575c98 +3c061fadcf83e685 +4120fe0c7a2dad36 +422ad0c62ee33c80 +3ef4fbdd96e70b2c +4600469336d32c4a +4052ee29855822b9 +3a5e89bf90c08f2c +40e2c38b413c3314 +4a0fdfe790a7cb63 +3e00a21052423a92 +4f73c1ee551de592 +3d02db1a07569878 +3ab01e34d5a735f8 +45315dddd024d05b +3f41bf6c94a10072 +3fad9e12730712ff +3f7ebcc5c4081bb4 +384df68976d1e20f +4d2330a512168378 +41e6f9b329f6be21 +3f80ae59b1c364ce +493fdf684c725261 +3cf215eb89c43d93 +40848ab9a90c6d6c +41147cc72247e3ac +3fbe9908f31fa4d8 +439b3509bd19a713 +49cd4622da09fd23 +462b258f88309834 +4420c7d9bda6bf67 +3fd20b488081172f +3ed9fcab93abaa67 +3b23685082c3bb06 +4234783fb3510890 +4aeb6bf36de75ace +4a633f8ac1c8ced1 +3ec3d1300480064c +3eb7c14f71a84bf3 +46458fd61e4d9b84 +4aa0eb7114a60be3 +3a2726ff407259da +3bf6aaaf2cf9b686 +3c5237c39e1c3752 +3fe477f3eeb0b0f5 +3e698fc1dcce7ceb +48e884f285b8a72f +4323c9f0cf0f5b09 +4262929c4e140da2 +4825f66449b388e8 +4a25415b9d716b8e +46d0d9e883774894 +41ba7bf7b37bd830 +487fe7646a36909b +3092ba8c10bf524c +38dc9220a7b9c6ff +3bb54ecc44796bdd +40c2cb232335428e +47e68aa544b5fbe0 +3615e8f32baba18b +42c03011ba22e8c0 +3a11b342377c9151 +3c84bf7080486a77 +32b2119d5bed4950 +44dcef215f87bb58 +4014155bb4504146 +448d645698c9433b +3e0ab96903d633c0 +4371456b33b87c22 +45b6f8b05bdd9e12 +3a9172c302925df8 +3cecf833eaec4d8f +36ef291415982ba7 +36b2be92071f2a9b +3fa0bb15a0459fa8 +43fe55fc760e092a +49450fa35aba2271 +40518c1ba8948e51 +4063104d7b2c815f +4205b1e752b81b50 +4d366e9047817168 +47e9a0c4a31ea195 +409078f526d61575 +4558302e6fe80e04 +30c3be815420c9f8 +3a5a94b4fa00e074 +3994091e41208d04 +45412b53e0c00005 +3f4584e4bdf85582 +3934761aa5fc19d2 +432d18e3a8bfc564 +50ade28ab0d3e966 +49b57b9fb33934ef +44c39a4ecb51813d +3d7d7f59c7b56fc3 +43d2ec84ff9a72e0 +4831d77bb55790ff +40764959e87cbb11 +413859dd879a1b18 +3ef2097b185f75b1 +41c76fa232db0c6e +43b99f472838f3f8 +3694e56bcc278220 +4a4c614e7a1b6dad +3137ebcaf93c2aac +39300b9194c211db +33002a7111b4ed15 +44ba5324e3328b62 +3edca6318dd7f915 +470789b1e676cc22 +3d436c4f19ff94d2 +3d4586bb9395f80e +4304dcfc5c4a3272 +463cf447df9fba52 +4655ebd92b7422b5 +3f22c7921ae0e7b4 +47e3d8d71a489bb7 +416e16e33a465620 +41b9f37e70686262 +427e7f0c9f2aacf3 +3dcd80a96652c92c +36f91829e857054c +44e91a7a3f5e2232 +3e87268a2c14d331 +44ad131bb3fdfff4 +40b3275424a591ad +441dc3f193dd9a43 +30e7e475bbd7abf8 +3e6f11c44f3d9a63 +40c5903a26d60b43 +4088b3b20531074a +3f5daf3edd779a85 +431272c0b0e8b0ed +418bcbad1533ca94 +3fb534e52ca5d946 +3f326b3db4d31cc9 +4b35f573544427f8 +44b1a79f346f9b94 +4455e841c9508ef4 +422f92280825dabc +4f890c7bfe06f8ec +3b2b675b4c2c5f4e +34cafa5a2328854f +3a3ba782770f2f85 +4b1787a115779704 +3d153f98503d3f9c +427673d74520eee0 +3df0f71b5ce0ab17 +43a47f8fd2800d16 +3fd8c20c7f9b737a +3b2eee24df6740f8 +3be2f409a3567944 +3ba1e33611ea918a +422998bdd66cde14 +3cf70982fbbd3e5a +3d801e7d5584eefc +41799a8d0e41230f +3613271c6414bc9e +3cf854a8ff63aa54 +35d62d697bd99dae +4080a4d94fe03549 +3fd6d75177c2600c +4125869e5a7b20b8 +40bfcc0c5799cc8c +3ff6bbbecfb2ee74 +4559c831ed49dbcb +40f40667c4a07bb7 +41b4702af305ebb6 +3fdc909cf7df8539 +3aa8d14b680e0b26 +41f4ebe733f2a40a +3f8321a1d9026bf8 +3c0b65b0578d00ea +3dc51d2f21098fc0 +3a375cb7df0f916c +45caa08b8179dc14 +3ceef4f2450fa48a +485521dab0e55db3 +41e228d053bd6089 +40c4b91557b719ea +3a55a565d437c0c1 +4e48c774b268b8b4 +3fe2cd2c85bf1692 +475b6b0b348907c7 +41508515a7eba94c +429ca01e082dec83 +434b184d699317ee +3c0afe8df1705fdc +34903ea35afb764d +408e27bf805912b2 +3f6d8ce034866b77 +3ff27710a3e9724a +448acc7812074d5c +39f6550bad94cf1f +48b33eab13a7df39 +3ceba48f52263df5 +3ee3767f7c658300 +3fa58455a90aada3 +34a4ae2cccc1d9f0 +3e56b388b9d0eb06 +4258519206645d7c +4a96e34b4f097639 +4588fc37a9bfd9c0 +34e9fd2c87d974cd +43885868fca4c8fe +3fe662b10cdc314a +3fd9574c9a30032c +40c7e68706fa82ae +36d05e4d865b3fb2 +4bba02b8d88780b5 +3d362aaecb7467a7 +3ad0413a14dc92d7 +43a829504888e99f +3de5e7419aecfde2 +396e9076cedc4167 +32d841fcb1c536a3 +3618c73327936a01 +40447d770bc9103a +422a71c367bcd36e +429fb94778361f79 +340fef71f6a8d699 +3a01034654231c3d +3c3395bf5b8b98ed +43d4f46863d842a9 +3c8df9f1e13e640f +3e40ae90668590af +34769685b73c6bee +3a72cdfa7b3088a4 +3ea669f2263db7d9 +403dc410d90ef236 +43e35f0af440cb69 +3f8783985abe28a3 +4fcb2e3026e33785 +3e1ae072c6714856 +492b4c790b24da61 +4558d326110edf34 +40ec7b8f877f423a +4963e0f04df56230 +41143fd65c18fc49 +3e613afd38581394 +3a3cd94c94e52f00 +3cbd5bc47c3ec8fd +4d961de2c659c319 +401edeb0e3de2fb5 +3fa5f288835b066b +45703893d11747b9 +41e2182864c3bea1 +406dc73849ece2c6 +3c052b0565095301 +42bb86cb24bbe7de +400916cc20fce0b8 +40573e4b4c7710dd +3d4dcdb610551a77 +44eef14faf2c0d89 +41a99e6e86ee8cd4 +35fb0e81bdb4afca +40f12fb09de75b09 +4424144acf6d44b2 +42d018362c6e9769 +3e3c8eeb9783cdc1 +42488a3b05808a40 +3add3ce54636dd39 +3d466f5ed8a29273 +3b365e4478ff6b78 +4c89e954f516412c +3e8bbb151fe69893 +44742621dc2793ca +48536c7d428d1ec2 +36c77f9f574a4426 +38caab62884329c6 +421edb53a3d5c2e7 +41adc167b099713c +41f3d644e8d4ba88 +3ff0dcb954f4a3c9 +440d01f8b09fe927 +3e829ec69e448944 +3cfe39d5f6c5ef17 +3c8254314c91c72b +3e2f6ae5b0849356 +41d27586f99852cf +3d4bba693e5e5514 +4b3e80d85bbb64fa +3f42a236e853de47 +4e78cde21ea684bf +41f6a20605beb238 +4155f8d00243c6b6 +3c5a460337221588 +43224e06fac6ca0e +44b12a0dd8c9cb7b +3ba331cdc6d9e807 +31fd469d05d2ac5b +38f199d8af574cc5 +3ba0920fa28dcf80 +40f27a7596addb8b +3d896c42bbad0214 +46d6ecf3adf2f9a6 +428308bd2dc41e3b +3f009986b2eead4e +3a260794a4cf1e80 +45a8b43bfd038ef0 +4d906968bc873288 +4e5c032833d8bda0 +41f1d8e02b0aac47 +357d6ff94393426c +3a1382c9487b9dc6 +4974fa7326e06608 +4a6bd3391a4362d2 +3fc26564e2177e86 +4d1cb29336d0654b +42e21f3bf686da02 +3f4024ccd2c9cc3a +3c46f12a4195fe42 +43a9e5104390d71c +3dd06020bb7a99c9 +48e42190ebe90745 +405562f42a611286 +40f0e7485a1714b4 +3cc44b3f798b4d5c +3b8038ca557aa467 +38f49943ec32eafd +3e82c800665ef8f4 +442f62c435c11055 +40ebba96fbd4ed6d +39b44ea3f4b53352 +400a3a6a54b5bac5 +43224ed7d798de27 +4c7d48fe7979add6 +4329a1a0f59311d5 +3db1bc9ea0e82a54 +3f3ba7e1b5200ebb +40c89ec8ca95f8ee +48b2fb0d2bb30512 +3d41f802808e4e9a +380cf8288ec2388e +3590cb540beebe78 +3454c3fd5eb4d3ab +3f3d9d7188b2e14a +3d4c418fecb8ea3a +3ef788e8798851d9 +3fc4f2f6cc103297 +3e98dd99a7142dec +3ec33c08248e0055 +49bd6676df112ffc +3fe01742d32d6c65 +33ad089e34daf8b2 +3b00a128964e92d4 +39c2297ebf1309b4 +381adaed53af856e +4293aad8cf54fd48 +39a626eb0715d353 +42578341fdcacd8e +4387ccf92b104c8c +3f67c83382da5dd8 +4c7c89558b0ba5d6 +45c15d099f9d108e +3ce05bb49b1eb61f +416a5c06162cf03d +36f20f3a1915cd78 +40c8f84c5abe2aaa +44024657c5bcd012 +44c32667a9d8edea +46728595efe38fcd +4893bda4f71439e0 +4f5277aa731a89a8 +3e515a8ceb1849d1 +36f7461a8899391f +42e1e1334f479ccb +409494133a6b65c3 +3aaf99e6eb974ce5 +44f54483b479b29f +41fcf32a79cc70e4 +48dd3e17df263dfb +49633036d26db2d8 +3f8d94369469bef6 +390003396016e730 +466ab2fd62857899 +4a62e800e1a80a78 +3f6f12a218262121 +35b730e42a91424c +4425495c3bb582be +3d45bca5550d08a9 +446bdb1bd075f17a +3e644814f313f3a5 +45936a2f1f335bbd +377bfe1269a6eab4 +42b1efaa3883134a +3d8e536c70ad2533 +353e7cf1deb620d1 +446ae11d4ca419f5 +4122ddbeb9d6b2c0 +453248d00717dcad +3882ebb2c0cc19c1 +46f9eb113a7e6883 +3489c04aaa092e17 +3cc44456f1dc687c +3bf9c18c362beeee +43fee81ba00355c0 +4b1fd0523e83f111 +3bf26754d66dd1aa +4f71fe4ec8297105 +3c3e3d263cd067b0 +35f11fd5a2ed16c9 +3f6ecd71769e60f2 +39734bfeaf3222c4 +3b52d2d11d3223e2 +49dfdbb03997e4fe +367471f0fc32a6e7 +3fd567bb6d91cebe +3686c7228676e481 +3cbc99b283176287 +4276049c2a3b11ac +3d91be22cc3a9734 +3b89fac4721cc802 +3bebdb20d5211af7 +42105b0f04731a3e +3c04ab7bb63d2f96 +46b579e96f070e83 +43902077f426ea9c +43d6af62b8b2cab8 +3c088ac18bff08d2 +41c08cd50dc9709a +4427560ac0cb2ace +3911f9b059c50465 +3f17ebbe1dc6569c +4d1bc5c32f1bb606 +3d9484783f8b224c +3adeec7afa72b937 +3b532551e1bd1787 +4364a4ab7f5ec56b +4b33916d4e28892a +4ed4d47f67b18117 +4382e1f35e2b2fde +35b5f3118421fce0 +4a8164cf8a97e92d +475b873a57b4c038 +401a319ad272d29a +45e11b39f7fcf978 +48aaf3ad32706140 +423b8fcce8bd34fc +318ddeb59396cb2e +39568317e8ae709e +45e108424b475171 +449958886dbda3f0 +49718a449b22942c +48f7d0b4c5033df0 +35588cc5e70756b0 +3f0af6b281c21950 +3f95f0a5be97bc10 +45dbd73198bd83b3 +42f8171b03979b5b +4386ec6e910ac6b7 +3baae6170b48baad +3eb6e536a3ed5292 +409938d51e855b36 +3fe4daaae7aa5249 +3e17cc67f0689b0e +3f8b3048e0710c68 +435aa755b7efe7f8 +2f9317ec62bedef9 +3ff008ff73fa5a3f +3ead35decadf8612 +3f62c104bcece28f +3fe11c426ab12ed7 +335531cfaac0d22f +4491da77e5ca0f17 +33b7cf9b810c47d4 +3e8c2d4d062d9c8c +36049e65c0eb72de +@hypot 2492 be56f6b8d917c477 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +4008000000000000 +4024000000000000 +400921fb54442d18 +4005bf0a8b145769 +01a56e1fc2f8f359 +7e37e43c8800759c +0000000000000001 +0010000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3e40000000000000 +4120000000000000 +415854a640000000 +41583fc4141c97d0 +0000000000000000 +0000000000000000 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +4008000000000000 +4024000000000000 +400921fb54442d18 +4005bf0a8b145769 +01a56e1fc2f8f359 +7e37e43c8800759c +0000000000000001 +0010000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3e40000000000000 +4120000000000000 +415854a640000000 +41583fc4141c97d0 +3ff0000000000000 +3ff0000000000000 +3ff6a09e667f3bcd +3ff6a09e667f3bcd +3ff1e3779b97f4a8 +4001e3779b97f4a8 +40094c583ada5b53 +402419894c2329f0 +400a601176b8de08 +40072bccce85fab4 +3ff0000000000000 +7e37e43c8800759c +3ff0000000000000 +3ff0000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +4120000000002000 +415854a640000054 +41583fc4141c9825 +3ff0000000000000 +3ff0000000000000 +3ff6a09e667f3bcd +3ff6a09e667f3bcd +3ff1e3779b97f4a8 +4001e3779b97f4a8 +40094c583ada5b53 +402419894c2329f0 +400a601176b8de08 +40072bccce85fab4 +3ff0000000000000 +7e37e43c8800759c +3ff0000000000000 +3ff0000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3ff0000000000000 +4120000000002000 +415854a640000054 +41583fc4141c9825 +3fe0000000000000 +3fe0000000000000 +3ff1e3779b97f4a8 +3ff1e3779b97f4a8 +3fe6a09e667f3bcd +40007e0f66afed07 +400854bfb363dc39 +4024066560954a8f +400972f5a1724052 +40061c6f57502b8c +3fe0000000000000 +7e37e43c8800759c +3fe0000000000000 +3fe0000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3fe0000000000000 +4120000000000800 +415854a640000015 +41583fc4141c97e5 +4000000000000000 +4000000000000000 +4001e3779b97f4a8 +4001e3779b97f4a8 +40007e0f66afed07 +4006a09e667f3bcd +400cd82b446159f3 +402465655f122ff6 +400dcb250f1c7c67 +400aff8622ba46cf +4000000000000000 +7e37e43c8800759c +4000000000000000 +4000000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +4000000000000000 +4120000000008000 +415854a640000151 +41583fc4141c9922 +4008000000000000 +4008000000000000 +40094c583ada5b53 +40094c583ada5b53 +400854bfb363dc39 +400cd82b446159f3 +4010f876ccdf6cd9 +4024e16fdacff937 +4011602b760f3b61 +40103180050b01a8 +4008000000000000 +7e37e43c8800759c +4008000000000000 +4008000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +4008000000000000 +4120000000012000 +415854a6400002f6 +41583fc4141c9ac8 +4024000000000000 +4024000000000000 +402419894c2329f0 +402419894c2329f0 +4024066560954a8f +402465655f122ff6 +4024e16fdacff937 +402c48c6001f0ac0 +4024f6b7b347266b +4024b9c9faba33a1 +4024000000000000 +7e37e43c8800759c +4024000000000000 +4024000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +4024000000000000 +41200000000c8000 +415854a6400020e1 +41583fc4141cb8ce +400921fb54442d18 +400921fb54442d18 +400a601176b8de08 +400a601176b8de08 +400972f5a1724052 +400dcb250f1c7c67 +4011602b760f3b61 +4024f6b7b347266b +4011c5831add62e4 +40109e0f1497b79c +400921fb54442d18 +7e37e43c8800759c +400921fb54442d18 +400921fb54442d18 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +400921fb54442d18 +4120000000013bd4 +415854a64000033f +41583fc4141c9b12 +4005bf0a8b145769 +4005bf0a8b145769 +40072bccce85fab4 +40072bccce85fab4 +40061c6f57502b8c +400aff8622ba46cf +40103180050b01a8 +4024b9c9faba33a1 +40109e0f1497b79c +400ec0fc3281b1e4 +4005bf0a8b145769 +7e37e43c8800759c +4005bf0a8b145769 +4005bf0a8b145769 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +4005bf0a8b145769 +412000000000ec73 +415854a64000026e +41583fc4141c9a40 +01a56e1fc2f8f359 +01a56e1fc2f8f359 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +4008000000000000 +4024000000000000 +400921fb54442d18 +4005bf0a8b145769 +01ae4e8d12762225 +7e37e43c8800759c +01a56e1fc2f8f359 +01a56e1fc2f8f35a +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3e40000000000000 +4120000000000000 +415854a640000000 +41583fc4141c97d0 +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e40e4d50f99b211 +7e37e43c8800759c +7e37e43c8800759c +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +7e37e43c8800759c +0000000000000001 +0000000000000001 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +4008000000000000 +4024000000000000 +400921fb54442d18 +4005bf0a8b145769 +01a56e1fc2f8f359 +7e37e43c8800759c +0000000000000001 +0010000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3e40000000000000 +4120000000000000 +415854a640000000 +41583fc4141c97d0 +0010000000000000 +0010000000000000 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +4008000000000000 +4024000000000000 +400921fb54442d18 +4005bf0a8b145769 +01a56e1fc2f8f35a +7e37e43c8800759c +0010000000000000 +0016a09e667f3bcd +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3e40000000000000 +4120000000000000 +415854a640000000 +41583fc4141c97d0 +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7ff0000000000000 +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7fefffffffffffff +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +7ff0000000000000 +3e40000000000000 +3e40000000000000 +3ff0000000000000 +3ff0000000000000 +3fe0000000000000 +4000000000000000 +4008000000000000 +4024000000000000 +400921fb54442d18 +4005bf0a8b145769 +3e40000000000000 +7e37e43c8800759c +3e40000000000000 +3e40000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +3e46a09e667f3bcd +4120000000000000 +415854a640000000 +41583fc4141c97d0 +4120000000000000 +4120000000000000 +4120000000002000 +4120000000002000 +4120000000000800 +4120000000008000 +4120000000012000 +41200000000c8000 +4120000000013bd4 +412000000000ec73 +4120000000000000 +7e37e43c8800759c +4120000000000000 +4120000000000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +4120000000000000 +4126a09e667f3bcd +415869a84adf872a +415854d826f20420 +415854a640000000 +415854a640000000 +415854a640000054 +415854a640000054 +415854a640000015 +415854a640000151 +415854a6400002f6 +415854a6400020e1 +415854a64000033f +415854a64000026e +415854a640000000 +7e37e43c8800759c +415854a640000000 +415854a640000000 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +415854a640000000 +415869a84adf872a +41613451fb236b57 +41612cf16934f5c6 +41583fc4141c97d0 +41583fc4141c97d0 +41583fc4141c9825 +41583fc4141c9825 +41583fc4141c97e5 +41583fc4141c9922 +41583fc4141c9ac8 +41583fc4141cb8ce +41583fc4141c9b12 +41583fc4141c9a40 +41583fc4141c97d0 +7e37e43c8800759c +41583fc4141c97d0 +41583fc4141c97d0 +7fefffffffffffff +7ff8000000000000 +7ff0000000000000 +7ff0000000000000 +41583fc4141c97d0 +415854d826f20420 +41612cf16934f5c6 +4161258daabc0606 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3fefffffffffffff +3fefffffffffffff +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3feb28dc1d697c98 +3fef85a9f672bafb +3ff4fc68c348921c +4001619005d484be +3ff4fc68c348921c +3fef85a9f672bafb +3feda0d164a2fa7c +3fed2ddc04c9b863 +3feb30ee906546d4 +3feb28dc1d3a777d +3fef85a9f64a37c1 +3ff4fc68c3395b91 +4001619005cfed2c +3ff4fc68c3395b91 +3fef85a9f64a37c1 +3feda0d16477e04c +3fed2ddc049df463 +3feb30ee90364fae +3feb2286835895c9 +3fef8034f2771242 +3ff4fa5c3db2196a +400160f1b6ff5de3 +3ff4fa5c3db2196a +3fef8034f2771242 +3fed9b03026c7590 +3fed27f6be01694b +3feb2a9ad829ac4e +3feb2a92af09e2c7 +3fef8723d8feb3af +3ff4fcf6ab6e2383 +400161badbdb1559 +3ff4fcf6ab6e2383 +3fef8723d8feb3af +3feda2636dc7ef3e +3fed2f743d844f1b +3feb32a49fdbe398 +3feb2ae6c5b86c82 +3fef876c4dc60b1c +3ff4fd11e15e6381 +400161c312ada4ee +3ff4fd11e15e6381 +3fef876c4dc60b1c +3feda2b083bc4e15 +3fed2fc283076d80 +3feb32f89d976074 +3feb28f11ae2d922 +3fef85bc0c43ee57 +3ff4fc6f8dd952a0 +40016192129e1fa2 +3ff4fc6f8dd952a0 +3fef85bc0c43ee57 +3feda0e4a2675f2d +3fed2def8e5c3483 +3feb310387a37776 +3ff0000000000000 +3ff1e3779b97f4a8 +3ff6a09e667f3bcd +4001e3779b97f4a8 +3ff6a09e667f3bcd +3ff1e3779b97f4a8 +3ff10f6189c020af +3ff0dd90273c3ce2 +3ff0036d1436a3d3 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff0000000000000 +3ff00001ffffe000 +40700007fffe0001 +4180000000000002 +4290000000000000 +43a0000000000000 +44b0000000000000 +45c0000000000000 +46d0000000000000 +47e0000000000000 +48f0000000000000 +4a00000000000000 +4b10000000000000 +4c20000000000000 +4d30000000000000 +4e40000000000000 +4f50000000000000 +5060000000000000 +5170000000000000 +5280000000000000 +5390000000000000 +54a0000000000000 +55b0000000000000 +56c0000000000000 +57d0000000000000 +58e0000000000000 +3fe87f39a346c047 +3ffb4c1ddbe1d58c +3ff376972be9cf68 +3ff0e9a585c51cd3 +3ff7ec9c920efff2 +3fe33fed18dd9792 +4002050058863be3 +3ffa23b4594fcfde +3ff138201af4e23d +3ff8bf8657e3bbc8 +3ff45ef99bf15101 +3ff8e0d93e0ec91c +3ffa7b2ef46181d4 +4003a315e5e3de70 +3ffaf4004a39842c +3ffa65af2bf3e5b4 +400251a21a384e10 +3ff40f3c41de8970 +3ff06b8cfb0206fe +3ffc6545f2ef8366 +3ffedd7506f28381 +3fed0b55f0f0dac9 +40023c70c39e8f4a +3ffc3d000c5377a4 +3ff9f1c241d7c2e7 +3fe3ae92491a7eb5 +3feec8d8c4c1e914 +3fef5bbbb8627b73 +40019449aacc0113 +3fe9ea045076d3ce +3fdc8da044fb868b +3fef96f2088ad111 +3ff84a144c3d8f8c +3ffe3384ce890c1f +3ffe97a3e4eccf9f +3ff516d92691e5ff +4001eb964a09b675 +3ffa1238acdbf56e +3fdc04f906d0da89 +3ff99e33d2080dab +40028c2595d00cab +3ff199aafd32b08e +3ff9b73377767420 +3ffa433986211195 +3ff4b7c53057a921 +40009bd93f523baa +3fe1d1252c950818 +3ffb50dbde09111c +3fdfbeda111afcc8 +3febadb488fbddda +3ff2d6ce9001829c +3ffa7735cef01506 +3ffe26eb6b5a2026 +3ffca4b8ae4b9342 +3ffc05d9f2ce8963 +3fefcc37723dd24e +3fff5486771e2a0b +4002e14316f6cd55 +3ffc1a2be66fb8bd +3ff41bf6baf04afc +3fefa5c2dcb62b77 +3ff255387bde65d8 +4001a94b480c0547 +3fffbb524b4c3742 +3ff1a915fe1e3f81 +4000401ec85f3e1f +3feb4f38b32ec016 +400231f7cec85822 +3ffdbd963d7df844 +3ffc3548e42cd487 +3ffe69698e5bffd2 +3ff4a6d71c63bd14 +4000c2ead7e2e64d +3fff3aaa4c7c308d +3ff5f8b416be9d01 +3ff51e055110b8a2 +3ffa862bf3b06113 +3fe8b0767ba144bb +3fe0446080278872 +3fffac5fd801f426 +3ff792eb5467baa3 +3ffa2f9a2c425284 +40000c6381f2ce67 +3ffa7960a3766a0e +3ffed3d517900f26 +3ffd2d4da95d10b5 +40002ada068e6b82 +3ffa73b6c8afe4f1 +3fe8bdf6592afab9 +3ff29df31e898f84 +3ff56062c04e8820 +3ff4f2da30ca1197 +3fffa7459c8a219d +3ff91e916b6b320b +3ffbd1c5a3f2ea77 +3ff021b4612c90aa +3ffd45b3ecc0da2a +3ff8b2ea429505e4 +4002c94ae4337c3b +3ffef2e2ae694687 +4002791f5783f64d +3ffbe0df06ba4500 +3ff729b4159462da +3fff94394e99f784 +3fea27696c4e08fc +40009af43d3f617d +3ff3ceb5ad30d6b2 +3ffe1a69697cddcb +3ffdcddd1b976d7c +3ffa82ab715b03e7 +4004688707ba5996 +3ff5c028a0f8f1fd +4002441f75632273 +3fedf3ccc705b486 +3fe97bc709585835 +3fe6d486f8a14cfd +3ffd859060fdef44 +3ff71127e4e87496 +3fffb759cc999c0a +3ff2c1a21b3129c5 +3ff33e1048c394fe +3fb3cd812d3628a3 +3ffd5fd872542d76 +3fe67de90cae5d3e +3fc060ee31387db4 +400132048616cdde +3ffc1116597584f5 +40001bdcb896d876 +3ff3d72ffcd949cf +3ff4d80441e044e6 +3ff3203dc0da2f5d +3ffa0d43ab99a49b +400355a5e7c3512c +4002e159e4e32da4 +3fe5f4200f45c0c1 +3ffb799d1df7aa0b +3fefb195445a1534 +40000174c7c1c985 +3ff290fe992d8391 +3ffaa343ad9ed7de +3ffe2ead012d1b79 +3ff26dc8e2481015 +3ffde668f9eb5cbf +3ff6499cb64cf426 +3fea2e35b66aed1e +3ffb8dbdfc70df99 +400082a97e4e1571 +3fc99092ed815511 +3fd138796d50f694 +4000d2b44795da29 +3fe9f7cf31ebfac9 +3febdccdb48b3c27 +400349deb3fd54c9 +3fcd75db798ddd85 +3ffec58470b4b988 +3ff8537a3d45ce46 +3fe2d88cf70dcea5 +3fe834d02ccfcdd6 +3ff6a449c163a8dc +3ffb0f4eb12dcebf +3fb9d22dc542d65e +3ff7e555524b07c7 +4002dc3950c4f80f +3ff667e9321a9210 +40023719d874fdf5 +3fd764574660530e +4000b3964bfeb38c +400046ba6260f3c0 +3fd7931a89e8bfeb +40007a4016f3d831 +3fd54414558bf033 +3ff287d6ba64d918 +3ff5bef9e8369c6f +3ff67e3a6a832d0d +40039319ca24a0fe +3ffe47e82231a106 +3ffb378638739419 +3fca1cd2dc8c0fa9 +3ff6caca13d5aa54 +4001dc3b82bf2eed +40028a8f93728579 +3ff5706185d01167 +3fd52ae2f165b2f4 +3fdc0754ddcbbae8 +4000ba704d8817a9 +400217c0edf243fb +3ff673aaad578191 +3ffee304f0e33601 +3ffe8458e5c96303 +3fe7bc3c1b0f5443 +3ffd3d91cf8bf24a +3ff7194e9d319b14 +3ffc1ee378dfd9c6 +3fda66074e34c353 +3ff59d015569f5c0 +3ff1e7ae3b07f6cd +3fddc583e4b8d1f1 +3ffcc6b4e672d42f +3fe69d5eda70dfc7 +40004bfd69ba515f +3ff469a57c58150d +3fff22b50b565f3d +3ffc49473bdaf5cb +3fedd032111a5d38 +3ffbf915b20d6ea6 +3ff9859e9d9df479 +3fe08afdf4c8af9c +3ffbf456ed66b6da +3ff21bc2e9c3c4fc +40019c4c322c9cf2 +3fefc3c58d869674 +3ffc3fa575946e49 +3fe6d5d557022234 +3ff692a70f41fb47 +3ffdec9774c36aa5 +3ffc66b2aa733f0b +3ff3c08d6d127647 +3fe6df5542aad0d0 +40017ff21641d69e +3fdbd4b1cb695117 +3feecf831214cbf5 +3ff168b3c5e9e2de +3fef1b1db5f1ae00 +3ff46ef5bc502ae8 +3ff6298c6602da81 +4001dc43ea3fce1a +3ffa568046d01119 +4000358acd4d8e05 +3ffcfcdb8c2fa466 +4001546c1cdeefa7 +3ff0ea9e936f64f8 +3ff59f175382f7c1 +3fe7d40fe902a8b5 +400263a09a83aebc +3ff67959ea13440e +3ffddd06f4580a5a +3fe966d5c6b0f1c7 +3ffc18e3ac53a6bd +40002e320978fc67 +3feb8abdd3c9e2b8 +3ff831f4738e65b1 +3feca6d6dbaa4ec0 +3ff12497fd63efca +3ffbaeaad70f2fab +3ffe98e5d501b05f +3ff4e9915ebf53b4 +3fe8f9f57bfdb54c +3fe90498f2531d29 +3ffa66fc4bd9d5b9 +3fe3125498b0ae8b +4000752d16e0431c +3ffbd79a3821d7bf +3fedf9340ab4315b +3fec3f029ddc8a8e +3ff67a757928abe0 +3fff375e1499005b +3ff47d043dc94334 +3ffd6b445035cf48 +3ff6c445c353d3b2 +3fe1f1f5b9c25c54 +400035088707b4b5 +3ff874db3ae68661 +3ffc10b992e7976f +3fd7e1246778696b +4002d91ffb60e448 +3fff3d189b569b4c +40014c4d3255e1bf +3ff883dcd2e77306 +400343f47074ec56 +3ff89b289bfab026 +3ffa4fb227e3059c +3fcec3174be0e4df +4000cb6bcd52879e +3ff8b42dd50008ec +3fe97b06411e9346 +3ff30ca5bb67e763 +3ff4d9301d622247 +3fee103f55f73e1c +3ff852ca26953954 +3fffc7cd98fa2ea4 +3fd178fc85416870 +3ffe954d8a1ace32 +3ff087a3d274031f +3ff93fbba37b887f +4000413d6dcd2453 +3ff7a12598c84d4f +400146bee4556857 +3fffd7bfa77bbe30 +3feffb76b8ea65da +4002b5822a25726e +3ff82915abb9c636 +3fef6355198531e1 +3ffdcece97efff3a +400586d707e51ff6 +3fe989075f96516c +3ff2b3935c5f8166 +3fef2614c2f42d8e +3ff9fda77f372a58 +3ffc5a0abfce62f9 +3ff52f22a07413df +3ff15ef699596a97 +3ff5f6568017f181 +3feccb33f387cd0a +3fef7c3bf6d15b99 +3fe8ea786e25b470 +3ffdd7fc12a3641b +3fec87a367616345 +3ff488987d83812e +3feb51c33aa68bdc +3ffc397ab1ed3cba +3ff45630f13bf3a1 +3fbd9b41798d0d00 +3ffa1cf2f9f6ec5c +4001db0f293a81c6 +3fe4a4e480fb072e +3fefc422998c4886 +3ffd64b486d3815c +3ff1736918d5f5ee +3ff6dd752ccb0c34 +3ff92131f57531cf +400001c202c326cf +3ffae190fe566072 +3ffbc93a9108b801 +3ff8d72a8b0bff98 +40025323541482b2 +3fff23b638b009f5 +3ffc82e0b34fcfbb +3fc420362d83c258 +4001f400d830f232 +3fff60d2466f6aed +3ffd745150efb097 +4003af479b0d4aff +4002c963ed7fcb7e +40003db0d071339e +3ff5fcc621893159 +3ff6835fb044080f +4001cd62ef6e9aaa +40026845365a943a +3feb337f91a01e3f +3ffc757a3c305157 +3fff564e89478b0d +400274c399d96e0f +3ff3100c58961390 +3ff66b4815956585 +3fd13e9da678df09 +3ff9a5c821e07ee5 +3ff792dd3d1ad569 +400160236e6ed86e +3fe3618d0d8b150f +3ffc66c6215d6c85 +3fe724ffe1fdc2db +3ffd7ca827d4ecab +3ff759e6dd8214ad +3ff8f143715161c7 +3ff7a27e925e1ef5 +3ffb4d5e314a334e +3fe8e79cabdcffb5 +4001091fbd81586b +4002df489822e310 +3ffddb930be2eda3 +3ffd28c5d012ef8e +3ffa14b6a4f15c96 +3ff00ebb2d35f413 +3fdaf68093d54ff0 +3ffd667cfb594938 +3ffeba87163ac1c9 +3fff48a68585a951 +3ff49f173aa3af7b +3ff636ed0e6f06bc +4001fd655dbfbf16 +3ffdd612b12ea87f +3ff5142fca39c1b7 +3ffb2693d208c14b +400113daf4421377 +3fff0f1a902c3be1 +400487d246e6197f +3ff8e50c13742fec +3ffd47ec0bbccf44 +3ff3e0a5bf3d0f5d +3ffb8d5493748f9b +40015f8db28fd4b7 +3ffcbc377880646d +3ffd74652c533e85 +3ff1b7458a5a6209 +3ffb3033e2b424e9 +3ffce73c3771ea56 +3ff4f7a24d280706 +3ff689477f2f45ee +3fe38454202ddfd6 +3fd14cd437a04306 +3ffa5d4c7c79c4fa +3ff42fa8a4923113 +3ffbddb23b1b36b1 +3ff2fa3a43e3d260 +3fec9c417d05cae7 +400273a6078855c0 +3ff6ffdb278e54a2 +3fecbf13d32bcfc4 +3ff7452c2feecd18 +3ffff9a86fcd1b03 +3ff60497cb478d30 +3ff9b38ae34240f9 +3ffb1af9f0bd64dc +3ff42e97be6d678a +3fff91832d3f3d58 +3fc954b64a498074 +3fff6d7f97950407 +3ff70dd96a4e7f9c +4001ff403408bab7 +3ff8f59343d204a9 +3ff7ce731ea0520c +4000117b5e5bedd8 +3ff56032db4b0df7 +4001aac129db3dd9 +3ff9577e60ff3628 +3fffe188042b5c1d +3ff1c3ed88a8b475 +3fefc15b47c5ab54 +400001e3b1a99d79 +3ffb1dfe7092eb80 +3ffa134e29a5317d +4002caad623445ff +3fec41818369a658 +3ffda92c6c672777 +3ffb5c877e108828 +3ff7b9882518fd1c +3ffd84fb56fbedff +3ff549f1ca730f7d +3fff07de206eb68b +4004242e8ebe96a5 +3fe18b42a6ab4a18 +3feff3c4318d94ca +3ffea96b527ce117 +3ff3f68a6dad7bde +40001cbfa27254d0 +3ff76d986d032cbb +3ff466f35d3062dc +3ff7cd49e6e1f645 +3ff62630d77f7519 +4001895d6c248b90 +3ff8b48639ce4be5 +40015bd2ad92d598 +3ff29d3491e6dbcd +400246204184411c +400109cc91c6b34b +3ffb543f6561e206 +3ff086553da4bc3d +3ffd78c21a8aa647 +4001bbae3dfb1f24 +3fffc4843b832848 +3feaf76e7be932d7 +3ff40fe619111490 +40004b979f551eb3 +3fe71e83a93ff86a +400006b6a9710f3d +3ffeb611836411be +3ff56305019641ed +3ff7af57b0a8d5e6 +3ff3e6e8b16a67fc +40036e61d5d4ec90 +3ff9fb376e3bbf9e +3fef7137df95086f +4001ed95e5a51ffd +4000e0fd0b07a066 +3fe48409073e9b9b +4002cec7d93a14dc +3fe1f93c4a86d42b +4000bc6d6c85210d +3fec085aa763bf1e +3ff14c243b6686e7 +3fe055212370170e +3ff79492f97c9d6b +4004b63df739ab7a +3ffb9b221e352e51 +3ff9da8107ea4ce4 +3ff0a45a7ead03ae +40043bc45c5b7ba6 +3fdbba6a1d489912 +40006e8b72a0aa03 +3fe9e3853eb7d40e +3fe1a3927904f78a +4001880635e92e85 +3fffe833cde18787 +400124f8289cbb41 +3fffedfbf4cc8916 +4001cc6a2997fe1f +3ffd8307fd5a0ede +3fe34228248afae0 +4002322483e7dfe6 +3ffb36d39df54e41 +4000d1846b63872f +3ffd1ed2b51f80e3 +3fd0024949b04712 +3fef1b7282b91e3b +3fe85f46757f98c3 +400379060a661478 +3ff4bd26c0fbc250 +3ff5d74beca9723d +40015e4da8d93215 +3feb557b5c67a839 +3ffbf0838acf85ab +3fef7f81c1f16b60 +3fda8f373e590f70 +3ff228aabbf4eed0 +400239ebc653f492 +3fff7cd6ff75abfe +3fe9b47df951add9 +3ffa3cc3bdf272af +3ff147abf177654c +4002fd5c144f7e90 +3fe19f682c3eee23 +3fe708624b8b56cf +3fff7ee1b2861faf +3ff1d636cc1121f3 +3ff3a48fe42f325a +3ffe63c54f171fb4 +3ff8a350f31df260 +3ff5bddfdceaa5d5 +3ffe5194d7e06e09 +3fff0d6f8ddae9a0 +3ff7c84faa251859 +3ffb461001fa7c88 +3f96ace721b928dd +3fecd2fe447d650e +3ff181c789610fc9 +3ffde6fcdbd778d0 +3ffdc298380a4613 +3ff03cb8a84af3d8 +3ff9cd9eae01a6b4 +3fff705786a8aba9 +3ff980764728268c +3fe3721ebe70d0bf +3ffa5a08e224abf9 +3fff17060be29f2f +3ffa25d4b2e9c7ba +3fda3917bf71fc3a +3fefe82926e3c2d2 +3fff93e599eb51b2 +3ff6de717fe8798b +4003f5315235d960 +3ff916f6d23966fe +3ff96cf09a51e164 +3feced3c813139c7 +3ff929dec0ccde18 +3ff721001b9083eb +3fec14fb3d0f8932 +3fedcb5b1f9709e2 +3ffcd692b8409cc2 +3ffa4a977c5ae3d6 +3ff78e3791b2c23c +400205337b0153ac +3fc2ac1d469d3272 +3ffdf346f0374af7 +3fe5ef3cdd9440e5 +400427fa78e56b18 +4004a994caa16fb4 +3ff3ff2cf618707b +4000aa1716f8c500 +3ffc9f29b7470625 +3ffe9be972e7ac76 +3feb2ab97aa279b4 +3ff161eeab842736 +400006caa72ae241 +3ff752e3d186f950 +3ff9a7aabf3c777b +3ff401d28c8ebb73 +3ff35ddfc5029d2c +400309044df1e50a +3ff9b4fdf8dfc50c +3ff827f0da8bbb49 +3fff9f5e9dde3727 +3ff0fed82ea12d53 +3ffe4f7801e90732 +3ffe7fc1d5a47f18 +4004f85a8abc2ddb +3ff76481b3b058f3 +3ff7ce8901a8340e +400146cd6fb6ac39 +3ff5af9492364493 +4002aae080eee217 +3ff06fea24cde060 +3fe0f13c3cf0dbd9 +3ff25868c1567364 +3ff25de42d2e2e01 +3fd8238c6ea975a9 +40043e599008bcd8 +3ff2f711ea13dffb +4004441e7d0c1875 +3fff875eb877fe0a +3fff0308f3047ac8 +3fff0f3316676d2e +400200988b5902f5 +3ffa116276047002 +3ff45aa9ae846d90 +3ff4cafa04b9e656 +40004dc7ae85c92c +3ffbbb6b62f7bc6e +3fe4ff4ce4e3dc2e +3fe861a16b1e7353 +3ff99d43cef37ff3 +3fe5373fb88d5b90 +4000b529a2172f5c +3fcb8f35c83841ec +3fd5d4eb370df7f1 +3ff6a05596f8d173 +400068ec63b030ff +40043d4457134fde +3fef6349b92547d8 +3ff6daa371129cb8 +3ffbca148008e582 +3fe3be0ab599e282 +3ff5298fa96da61e +3ffe45e1ca0070ff +3ff830a59a3e97cb +3ff591e7be3bf305 +3fff9ed7ee2a9708 +3ff3813f949f706b +3fea33549b8d5b10 +3ffe4dc9d3790004 +3ff89007ebe6bd93 +3fff03a0d166d105 +3ff3bd5269342d2a +3ff6e80f54852aad +3ffb2733f7f11a71 +3ffdf042cf663c14 +3ffc2f4049dbbd86 +3ff5cb0debcd5701 +4000145d58d4c5d9 +4003a87383c7981c +4000767586479369 +3ffcd16d1f6ad886 +3fc75bb3f35561a4 +3ff8795824ddd169 +4001c1b22ba9596d +3feede2db1d349cf +3ff2aacdd2279477 +3fbacac48a8af5e6 +3fe700a999c406e6 +3ffe8b484a1b69a7 +3ff71a322a62085a +40001e0063b89275 +40028f2a750d8d29 +3ffeca0cb6f9632a +3ffaba8f815cb257 +4000d7141ac38f00 +3ff4360e9add6554 +3ffdd8c3a69b6d46 +3ffa1034870a9a87 +3ff54d1b0a653295 +3ff6270adb34ead0 +3ff79f0659b5ab89 +400007b86818c728 +3ff7e3335c360aa4 +3ff38c08cfd24658 +3ffdc03efbda9967 +3ff323eafc770750 +3fdac1e9db1e5d90 +3ff3f883cd097fcb +3ff50d676a97b7d3 +3ff979082aac58ca +3ffe86e31d8a97fa +3ff3294c2d02f457 +400124a60053d031 +3ff78a13cca91ef6 +3ffa6335e13bd7b1 +4002f12b5e0c68e0 +3ffd64099db6e2e4 +3fea2ec7dcbf3cfd +3fff9bdb01820e5b +3ffea3d883d4c47c +3ffea23f0647eb1c +40036dfd6c1cc6fc +3ff5bd5d11bfacd7 +3fff6e53d2c9fa32 +40009e4872383ae2 +3ffbaf63b77ef002 +4001aca88a5f5a73 +40044776890c6508 +3feb0bf75cf0f138 +3feb0b06c8315871 +3fe788782d540521 +3fed6046cc77b3b0 +3fca491f09b31b26 +3ffaea781ceac36e +3ffa0009eeb532b8 +3ff73758f2e62d54 +3ff452d9d695d4f0 +3ff68c7f43a7e121 +400372d796571b97 +400196443aabd8f3 +3fe6a965413e13d6 +3ff38f6b9221f411 +4000c2950e180093 +3ffb774fb8968acb +3ffe346fb3af7898 +3fedc615875e6fb5 +3ff61457e718a5c1 +3ffa0060155e1115 +40005f5f1a7861b2 +3ff0402348fc3f35 +3fe9b1e316cb7003 +3fff087ff9217daa +3ffe5c2a49d56779 +3ffe505bc5e7e66d +3ffc3446c7569070 +3feb112f4889b7e6 +3fffa39a8b918e80 +4003d0f28a835265 +3fe93748af4a8e9d +3ff980e833024113 +40053d34093d7ca7 +3ff140707498c83e +3ffb6d0645b6e234 +3fe1f3ac95e91579 +3feb42d286b5355e +40005d4006527a21 +3ff9c9d0d2bf7bc3 +3ff87af9d9f9fcc0 +3ffccd4f792a563a +3ff031ddc5be59c8 +3ff7bc6dc937ad4c +3ffa1aa7530b93b0 +3ffa83acdf785197 +40028ba86d143b29 +3ff01488a10aeafb +4004e85c024deef4 +3ff8ff7612b114a6 +3fecf0c61d15bbd7 +3ff0f995c4886971 +3fe6c30aec6d9e0c +3fff3ea20cab81f3 +3ff2bc76d2180dda +4001ee181a3d3510 +3fe67c1b6eb9a1ac +3ff9cdcc7d8895fb +3ffe71d0f3bed70b +3ff5702c38b3ee0f +3ff4a115f3f3ecbf +40001c31824021e6 +3ff886250243bc23 +40039504e17e97d7 +3ff07992aa31bf7d +3ff1837108b30269 +40044761e9a5c126 +3ff38833f803fdc7 +3ff983602858d885 +40025a924489b73b +3ff57a1ef396311d +3ff99b4b08366147 +40034f3c332eac19 +3ffc9b413e719591 +3ff655b0a5a37cb9 +3fd1f1cf8c33c9ff +3ffdd98fd636626c +3ff6c16487b2aed7 +4001a4bff0d5c4ab +3ffc218965e900ed +3fed7796b67ba825 +3ffe1da525595e3f +3fd3e328735f8093 +3fe497e8f1684d1c +3ff32893a3a142bb +3ff34d75a267dc42 +3ff6259d84a1829d +3fe3b7a765d5e1d7 +3fdcab4ca8283cbf +3fcb95777641c023 +3ffbf2569a1c70f3 +3ffe25423f03cdd6 +3ff2bf839b01ae96 +3ff4bb29efa03df8 +3ffec74b2792c67e +3ffad28c3860b4e8 +3ff5f3397ac975c4 +3ff7c2c30bd6a589 +3fe43379883583d7 +40018e57669f13b8 +3ff2a98a22ceefad +3ff50fcf2290b28d +3fee09380b30f2d1 +3ff145cfa1926ece +3ff4b4f743ce86b7 +400103cdfce65a35 +3feabde53a667c11 +3fea48200d5e7bfa +3ffa6338865aa48a +3ff8c58097443adc +3ffb9a9ef0a94acd +3ffd641761ff6ed0 +3ff439126370817d +3ff27bf82c401e19 +3fff1f6ed9a809d3 +3ff05496b3010678 +3ff70b4a09d515ce +3fffd26597121cf4 +3ff3fe979211e92d +40027a631e468e14 +3fecf81ae035c2f1 +3fee3c2db5e32425 +3ff5b5482294c710 +3ffa5e318d91fa03 +3ff633a3c655c5f8 +400167f3c1f17ad0 +3ffcd91d1e791046 +3ffb7b9bbdb82908 +3ffbac8573e154cd +3fe4a8318f4f79fa +3ffd585a91bb31c0 +3ff0fd84af39070a +3ffd0efba67ca907 +4001d2764d2fc23e +3ff2acfad5e7a461 +3ffb75030ce0cfb8 +3ff38ca4fb330165 +3ff79ba4740342a0 +3ffd6d697901adb8 +4001757256d90a76 +3ff7b50b7ccb65ee +3ffc9cc70ec35e22 +3ff0cf68ef1849de +4000d8130c2d15ba +3ff409af22b040e8 +3ffb6e81c52a20d3 +40033d92721af9c6 +3ffdbf7c011ad3ad +3ff83a49387c92e3 +3fe61aac2d12c366 +3ffeecca41b7a4ec +3ff99d6866be5405 +3ff73a0a92a31211 +3ff811e396168751 +3ffd00062f0e051a +3ff4c055930d7458 +3ff19655777e5a23 +3ff6c2494fe63ca8 +3ff5f120a33b3ac8 +3ff1c5613082b176 +40004e9d337b7a4d +3fde8971e848d35f +3ffa0d5e48083ec3 +3ff191b6736f8b11 +3ffb2ecdb530c786 +3ff7cfca8d810de3 +3fe452fde1ea50f0 +3ff1f339cb71fa91 +3ff37d5acc28d744 +3ff4be0fb0d26f4f +4001dd9ef8464c3d +3ff6e839035caa02 +3feadc34e518f9e2 +3ff9dd56c75d6e3b +3fffeb4ac97e1daf +40029f017720cc23 +40020a4543a307e0 +3fdc051805ad3f14 +3ffac30fa7bff7d4 +3ffb10f8b0e3b12b +3ffc4907bd175e29 +3ffa268ae21f9330 +3ff60c074400d06e +40024f6ee0c051ce +3ffcb242022eae17 +3ff829d2495dc20a +3ffc614509da2217 +40001c2206e2ad75 +3fe9187bef34a94c +3ff01e492c592e0b +3fff395d51ec5dad +3fe9a250c34cb7b4 +3ff7bbf8570a8172 +3ffd9ff892436d9f +3ff62f728a9baefd +3ff9fe468df0df9e +3fe59e23eb5a75e9 +3ff254534e3409ee +3ffa356d9009da4b +3ff7f9f648b7905c +3fe97368e8348d8e +3feb0546e8334a1d +3ff25044d69360f1 +3fff9313b70b1b3d +3ff51358dd3e4e9d +3fdf6771d194f8ad +3ffef3e81edf31d5 +3fe8eefcda259368 +3ff96f42df784808 +3ff7a7a08e283579 +3fd1601af898f957 +3ff153cb7e67d1a5 +3ffbd433063a3fc0 +3ffa197024708722 +3ffb91c6ac82f444 +3ff0cd5fe8c870e4 +3ff8593feb10799c +3ffd00fd44c2d468 +3ff5ceace9578a9d +3fd6125a8e983776 +3ff3ddf9be6dc694 +3ff5ab1d75b259f4 +3ffb6b33f6e8eaf1 +3ff5492b93c88b60 +3ff483ee38f88ea5 +40027f596e8949f7 +3ffbebf62192874d +3fddfe779c5908b6 +3fcca507f7980552 +3fe8f211c2d47362 +3ffdd6b0a16a0958 +3ffe209f2cce289f +3ff97394864618e4 +4003f945f64f7966 +3fde910d25babbc9 +3ffbe2873862bb7a +3ff50ff7bb292b92 +3fedac631490b7a7 +3fe229acd68bc29e +3fa134523724b241 +3ff9ba14fb8de869 +3ffd6dacf33878e4 +3fcfee9592c095b1 +3ffd138c36fdc13b +3ff8e79438bfb33e +4004ecd94efbb770 +4000edfbecf80e8a +3fee903e2c746ba4 +3fe901c45f26c320 +3feddc8671b4b86e +3ffc34b2262e1ddd +3ffe199697fefb5f +40000f8309b88c81 +3fff6ff810b40e08 +3fe8693e688a0e78 +3ff15bf34a325d8b +40007881230a7dd7 +3ff41a6f6883d754 +3ff4757917be1826 +3fd1e17d00fc1968 +3fdd68af8d7b22a4 +3ff0e91b8350a63a +3ffb9da3560701f9 +3ff0ded9dcf548f5 +400500c506ee7c1f +3ff5b80391d44818 +4004f4125d9efde0 +3fe26c23cbfc44cc +3ffa28cfa2e12c38 +3fe06f48500e0f22 +3ff0a5ca467b2a78 +3ff596229dfe64a7 +3fed74e43aefd6ad +40011aa6bfae0780 +3ffa08292d6b0fbf +3ff47d0618a9dfb8 +3ffef367c5b0cc2c +4000befb56b64a45 +3fd2665fac19d1c1 +3ff3734c8d24bb4d +3ff79e20abcca75c +3ff15907ac82d847 +3fd5dee02edd5f38 +3ffd236eed06b8f4 +3ffbb0c17e3c2a8b +4003a1e13b463fdd +3ffb120d38a72779 +4000468cd21bf3f8 +3ffbd832d6ba14c2 +3ffe502d017c86d5 +3ff7eb5b0e444d2c +3ffe04cf74b82d56 +3fe77b06c4aad47e +3ffee2c1a4dccf58 +3ff4b6ccf28b0f08 +40006325a3cc60b6 +3ffb4a587e3bae2b +40046cd6117ce5c8 +3ff8dd96f2b59768 +3ff9b598a3835815 +3fecd8c457cf2ace +3ffcc56a4552fd85 +3ff4e298c217309c +4000c543feeae008 +3ffd5ed419309c7f +3ff21af44e99cff6 +3ff63a3a6ed3b817 +3ffdf779d783b265 +3ff4d76d650dfc2e +3ffecd995836f779 +3ff40ae42b305972 +3ff6188a158e66ad +3ff4e8aea219175c +4000e8b4662e7832 +3ffbdece2754bb71 +3ff0c4fa71605b7d +3ffd862e053f6d23 +3ffb20ca994cc329 +3ffa4f9380057fcb +3ff8a7f949760138 +3ffeee7ea4db0233 +400041a3773b433b +3fd7e565b329720b +3ffd398eba524dd5 +3fed6dad94eee0cd +40001b646dfab982 +3ff604f92c811b88 +400133a3baf05d82 +3ffd2903e1f98a0d +3fe0fdbf933724b5 +3ffdd7379789ff6a +3fe5ae64150282d3 +400663d3f1c15d5c +3fe6135b30763204 +3ffbf996d4022209 +3ffc8e5328692e3c +3ff7c9593c1b53ce +400484951fdfbd80 +3ff2363a8de089d5 +40012fe15f61d25f +4002c26899baadb4 +4006038a20c4fee2 +4001d6d0b1fbe875 +3fdb2d241d695615 +3ff828bf49714246 +3ff6e4f4a3ca325b +40013ad6db8a1bb3 +42224d2181982ce6 +4121380b5288f67a +3ffd17e74d45f698 +43d8ea72ca0f8e1e +415cf7dec76cc6ad +41e346c17eef2a59 +3fbf5b46b7304200 +43104d74746802ab +4006e2097b090f9c +4001b9dcd41c7fdd +3fd2c1c43995ec48 +424a9c905f419169 +4055313c4f830d71 +4299e00045e82670 +438c232bf175a6c0 +3fde9d9074670dc0 +4101a675ef9cd4ee +40040a377134c78c +4538972c9588e7b2 +4370601346ec5600 +44820655a8d6d5da +4160e2248c1f1fca +3fdbff9973ab3c5e +460ee9f2e5f6a1ac +4005b254fd3f8ff4 +45047857b532dd69 +4000cb9a39af9186 +4455ee631b98d607 +3fd241ce99721958 +3ffdc63834a125be +43ab5c3e38b6fb1e +4070db65d8fcaa5d +44fd0ef9d989f7e8 +42e2aa587073a4e5 +3ffc9f47228bead0 +406a363ecb55d3e8 +3fe046369bf99b37 +437578baed485f2e +42c2bac8612ec808 +43439b1bdb3f6c18 +3fea4f39913d7640 +3ff59a73b956385b +4330d6c6a5284e86 +45a049cf3009e508 +426ba88b650b6dd3 +3ff39df38276f604 +4088272de12f3cca +462b6b0579210ab5 +40013dda2035276f +3ff03dce529a2bb3 +4002526172457508 +3ffd271b4e8fa008 +43fc226261943a81 +448cb92602f7010e +3fd744978f111eb0 +40049881b85b7756 +41e072117177e22a +3ffa18a653eaea30 +400409a3f38b88e2 +41864e4dcb8f066c +416f10a5044b2817 +42bfa546b91e5c1a +3ff3cb04e60ebcc0 +45a531af553faf3e +3ffacfc6e6afe3e0 +41fd86bb11d8334c +45e2de641dc7a08d +3fec4e593066e5c0 +3ff38e516b9fd753 +42d391c4278c5dd6 +401600a46b314afc +40079d61b10e8718 +3ff9d0badce0a909 +42f7bbe4eb169255 +3ffbc356c882cefe +40d636425a2984c6 +3fe80136673c179e +400479b8d9113a36 +400506b2620b8234 +40053de2b922a8aa +45a4594f612dba53 +3ff8d4ede266b80d +418882c128a7891c +44248b5e9a067193 +4007cd1ecd1fe08c +4007975d8e628abc +4147e4b677e52b2b +3ff71348408cbe1c +42f63cc1f3227e1f +3fda498359647d30 +4006aa76125dcf3b +41a763511ea33302 +3fe453ee55357ec8 +3ffa42536cfca9d6 +446416b12ec980ab +42a0a2b8a3237ea7 +40074eaf926c843a +4344428ec17c819c +45605414d98f3abc +42c450f19be7460f +41867bcd8351e025 +3fc1dea02c224000 +3ff6ad9bb065d059 +3ffe84d6d61d8e50 +40e2bb8430d56049 +3ffeaa2d8666ee90 +4365282821b8e3a2 +4007560f140f41ec +3feac091cf0cce50 +40088dea3842de58 +44358ebf1766d4a8 +3ff5521b94749f04 +4140de30f6a58a33 +3ff382424c0fe3fa +44c7fdc73d8905c5 +3ff0b1db6fb8b6c0 +4006e4b74afd9964 +45434d2437fa2bf4 +40215c9825b296c3 +4191180afb0eeae4 +44557d8478bfc1e7 +3fd0f3830bdc400d +40274a0c9e1a701c +4000c801fd3a01b4 +40076fcdb5097efe +40058166ff9e093c +3ff4bf84036ea712 +4002ed18dcbad433 +40055ee09d60964a +426b1a6cd5afbd47 +3ff14e2c405ef558 +3ffb516d9e9d0f7d +3fc62474e1fb7780 +42f6c00f6ed483d5 +43820bb3e3f80759 +4007ed3776a02098 +40032e5018d59a85 +42c4ebd7a3c84224 +3fea56b071d035c0 +4263d2a7cf17ef08 +42bdecb500b26231 +3fb918b34bb69be0 +4084884d925df52d +448bbaa14b185e5c +3fd66ffc75c5e970 +3ffd888e0ea90368 +433a38ec685df110 +43f035aa9219e8be +462dd547126bcc87 +427827530280677e +4005abf6f4246bb6 +42e6886468a65052 +3fdc80c0e54556d8 +3ff722edc7bad22f +400324463b8f7792 +3fe13274eaa92c78 +4537f32542733982 +42df42fa44fe1bec +3ff9e5787d2a5c3f +434258b482f470e1 +42a4adc057c78416 +4206512fda469df7 +4500cabada707263 +424044e4f9d018ae +426af6e372a0b4e4 +4399471650abfa44 +44716831a77afee6 +411c3a6e166d675f +4001fb0f0ab24023 +3fd6c8014567a9b0 +41c8399ed0e4251e +400486ee9d9a822e +3fcf0814837370a0 +407522bdf0068450 +3fefa6853d48ff31 +3fff7e1007f02d24 +459d17db0a1a0e88 +408685c0ee732a57 +40022c3a01b46596 +40abdcdb5cebf227 +40059860e4f8fcc0 +3ff6e743562748cb +3fffdfee8e6ee721 +40b11e54901b3407 +40057f6162cc9c68 +428b8c0dc8083703 +44a2aa25ecb23aa9 +42514b7936c744cc +4430d21a26e0794c +441cee1236c5bb06 +4003e7c6c97f1065 +444d8af7021fc0a8 +3ff69442af7a5fe9 +429316fed53ccb3d +442229c4867cbea0 +446379e5e740712f +426c9f54ea5ee50e +3fe38ebe9bbfb650 +44dac49fc4cfbaff +3ff712485e8e4ed0 +40d2d1ca01d994bd +44aeca64ec6eac38 +4001f031f638ba72 +4561cf9cb7d6ecbe +4162c86d00d3f251 +44a44369d0b1f8bb +3feb155445130eb9 +461d42e79df3e3b4 +400322a6d83b91df +42536578523b588a +4411ed8a04650730 +41af7c7a4c7a9102 +44700843deb75a26 +4429a84d3584e3f9 +3ffbe4c52e9c9ad1 +405a9f02fa350403 +400091e5b82a7e92 +43e6ee5129e75e10 +40057d8d97317410 +4006f073576a8d08 +4391180618a12812 +45a4aab789f20da3 +3ff40d8de1e72b64 +3fea648dce0a8e94 +421274754ff68c7d +45f6c084038290ea +4006facf5264d2e3 +43e273e4dfc4f28c +40a8d72619acf2c7 +40043839528417d5 +433931f2d4f4c666 +41d24cc7a067bb56 +4007b023c0079f00 +3fc18bbabd19f9e0 +3fcc94a2aec20980 +3ff00d338cf96c5b +3ffed038014e29e1 +42e5d8bbabd5339a +44b564d35d81947f +40059ff616e75f3e +400089d2ca83a7d8 +3fe0e12d717dc735 +442d73e50c80eb0f +40f4cf892066f3a4 +3ffbfa737f0531d2 +449bfd4e28ea1299 +43a09abec155ebea +448405edd61c84a2 +42d14914602f9942 +41a3398820045da2 +3fba472fec3f31a0 +419b2277ec226fe2 +3ffac47cd54b4368 +44683ca886048f7f +446870e51660cb89 +4214d4d4cda65551 +419000f4b950e9f6 +3fd60fb9adf78dd8 +43a97df5f1968b8b +40061d056ca0396a +4006bd732e7b3db8 +403743c90dc41e5f +3ff9671396a28b9c +41e0db0baebcd990 +4000fd3a534f6d30 +3ff1d5dbaab59504 +40030bd921413c30 +400593cb0296b7e2 +414e4bba3e0f9173 +438ce6f22cc3409f +45b2588b7644270f +3ff7900f3526d910 +43f71567f8f87638 +40c7687b671569f8 +41f0788c4082e2f0 +4091bbfcc86c2348 +4005f2c4776fe236 +3fd378a552f39640 +443b4a148787a3a1 +44016fdd9c56e946 +41436a346f11c824 +4005e562719adbe0 +44b84983b789dfef +44d2b16bc4ac8229 +3ff34594e68c8de4 +455b4856fe17efc6 +40033c8e5804e2fe +3fcc1014fcd4265d +40ed46e9991924c1 +3ff05f8a19b104d0 +40b115b09847f450 +3fba59ff6451ee80 +3fe45b329d502f28 +412d94815c3feeb5 +40054e4f8138f31e +4368bad392f26122 +3ff5f94ec28076d8 +3ff27eb15ec18c5c +40019182cd6edb5d +40009c3db93c187c +414cd7ff741b8f5a +45eeb378220a702d +4506f31285c02a56 +4153377f166b3348 +41682d5a60b6229b +3fede1c741e79fd8 +3ff101c44fe4ff90 +41afa472fc0ca554 +443a582e770ee052 +409c1612accf6965 +4172840725a3d9b0 +3ff62558afce6baf +400011b6ab2b3c26 +435e54efeff97118 +3fe1389b7d78a684 +3ffa5f1f6714abe6 +3ff5257be1e5bbed +3ff6acaa3b110f60 +3ff77ad1b47bfb04 +3ffbb1e29080aaab +3ffa49a8b0a528b8 +3ff4b4adb21d989c +3ff696cab9b91d13 +3fe0eeacd26042f8 +3ffac5b47e211bd1 +45a44feee05badd8 +3ff5ed3487d61eea +44e81a8493859080 +3ff7d0452c37f39f +41758dbc64068f15 +3fe5ca52e444c600 +3ffc7ec88f83f28d +42f078d117e211b9 +43e86fcf150c6486 +400414e279c5bea6 +455271d6b21d650c +424a4f039250a4bc +410b5bfc9c55202a +400143dfbebec390 +3ff96784484a17d5 +3ffce8e54b54d4ae +41b30bbec1269f94 +42493ce9cc2d4a7a +41e833dbeadf44be +46044f98ecad1d49 +44f74e94bbee66cb +3ffac0ec70f5f7fe +4397ae5805dd1f24 +45ed001917527006 +3ffd627eb25020f9 +43f917abf139c738 +412993d348976d02 +400110d457f2d4dc +3fe2e9b2090677b0 +3ff74c0c32739678 +3fed11a063c2230c +42921d64003fa047 +400337985f79bb3e +45e77ae4315639d2 +41d96b4c2837027a +3fea53c4d0513929 +437259e4f88fd6fd +4003e43e18d0b2a8 +3ffc59e6bdc3c41c +40ad091299ba5e1f +41e711d55a382108 +40c7080171d4970a +437a29a798268386 +3fd55960045093f5 +41e06f174ce5389f +4002cfdb295f4a8a +44aed32f63107c77 +40b43a4b60ac1f76 +4147a63b6a00b282 +44b38b013e96772d +44aab6abb8349ec6 +3fe21757ad147100 +453102bad10bc06b +3ffc69c6ea4b8f3c +400685b8b2a43d02 +410855f1f18ce2fd +42468558554f50e6 +423bba9044af896a +3fb264e7aea73140 +40a761a334727961 +3ffb6bf25e260f86 +400550acdae240aa +3fa98795511762b7 +4004993b651ed924 +41e422e43e776d14 +4589480da0467890 +42bb6bbfab03e85e +3feeeb48a9c329ec +4001be27754ef900 +410b5fad16f81132 +4004145706919655 +404a9ee64dafc6e1 +45e49dff3dc601f6 +3ffa52e0d20c9f3d +4004213ecec32287 +439723954fcd07f6 +457658aa7ef13c88 +40d61cfab084b28b +400732789977701f +40079f520453f1e6 +3ffe6f6e1d55681d +3ffb208b394c9128 +45f7269e9745f326 +40d8d6deea917adc +3ffe45e9a706cbe8 +422f0c793a31f54d +4063f74fb5ce4a8a +3ff3df2bb56cc370 +3feeb2b6370fcde0 +3ff2050e760fefad +42eb7811117d2bd2 +43d5bc4a1afa5524 +3fb1ca05404475c0 +3ffca494ad0fadf8 +3ffa8e2843a9edf3 +4005927c5f6ef04c +3fd2f6a95e628492 +400686482b74c80a +3febc3a4346c97bc +3fff4fd9dada868d +4004fa2b5c7c80ca +3fd5b3ff123b6490 +42b620993e349d5a +43a548c57a4f6f66 +41f0b24eb4b0bf23 +3fe26183175375a8 +451fa5945e9982c2 +41720ae4fceae2c1 +40cf4309505f9b14 +3ff575027388869c +4006eac8301c9f7c +4249214534a9957e +461ff7c904a2ac3b +3fe1f85648949e68 +42e9c86651c5610e +3ff35b1e7511b2dc +40003b9c1daf91b9 +44e504c5d2f1daba +4003fdde3183d4d2 +42e11f01de6049e1 +3ffebab4f0a9ba0c +4156561296620c94 +3ff1fa8c7eb10348 +3feef656a72655bc +4341922c0620d0fa +445e31a8ab596baa +3f91828925231c00 +4385666a36b505aa +41bfacf73a664df2 +3ff2b7351cadf754 +4003583c6148959b +4001c7be8b6ba04c +3ff21c5766cb7760 +3fe16bac097c4cf0 +3ff236ff9f8055a0 +45f278ae8ed3871e +3ff52038116b59c8 +43300822a9f3a179 +4171494807ac5a57 +44a33cf3e9fed3f4 +40066b45e53c6096 +45b329a1dd58bfea +4083488c1acda3fd +4003408f951f0344 +4003278a602ca93f +3ff0284d208a36e4 +41eb085cb73343ee +417266ac3511070a +441695c3891d0484 +45967a135509359a +3fe62de97df00b30 +400600706cbdf0a8 +44365eb9fd926468 +4007df52b83823e0 +428e7b05716e3ad3 +3ff64290c7d81ad4 +43022029822a1d23 +3fed657b26888058 +4541af88841b57df +4409833a191e18a7 +3ffd3cb9a71269c3 +4007be0c311446d7 +4001228632e7cf9e +4349a028ffd64062 +40056324fb856eaa +40620faf382ae48c +3feacd2848f818a8 +45830bf472c3ca10 +3fffd7dbeb30e146 +3ff53cef6500ff32 +3ff846b2d53cbc5c +3fd4a9b180255020 +3fc821abe64d3d40 +3ff2f61edaead38f +429ff94b2eb9d8d6 +3ff6afeebb49c453 +3ff607e39402cfad +4607359140abe57e +3f130666ecb88000 +4239232dcc76bc56 +3fd498247cce0241 +4153913257f3528f +460cec0e42366459 +3fed67633dd65fe0 +4004321ac8446114 +3fd20dd0fc4ecdd0 +443289c499dc0a7f diff --git a/core/src/test/resources/proj4-epsg.csv b/core/src/test/resources/proj4-epsg.csv index 30fbc07..5bae965 100644 --- a/core/src/test/resources/proj4-epsg.csv +++ b/core/src/test/resources/proj4-epsg.csv @@ -194,7 +194,7 @@ "4326 -> 4264","passing","EPSG","4326","EPSG","4264","1.0","-1.0","0.0","0.999997","-0.999117","0.291099","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 4265","passing","EPSG","4326","EPSG","4265","1.0","-1.0","0.0","1.000222","-1.000743","-71.709798","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 4266","passing","EPSG","4326","EPSG","4266","1.0","-1.0","0.0","1.001156","-1.000478","-35.113455","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4267","passing","EPSG","4326","EPSG","4267","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4267","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","4267","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 4268","passing","EPSG","4326","EPSG","4268","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 4269","passing","EPSG","4326","EPSG","4269","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 4270","passing","EPSG","4326","EPSG","4270","1.0","-1.0","0.0","1.001362","-1.003516","146.270504","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" @@ -495,30 +495,30 @@ "4326 -> 7136","passing","EPSG","4326","EPSG","7136","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 7139","passing","EPSG","4326","EPSG","7139","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" "4326 -> 7373","passing","EPSG","4326","EPSG","7373","1.0","-1.0","0.0","1.0","-1.0","0.0","0.000001","0.000001","0.000001","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2000","passing","EPSG","4326","EPSG","2000","1.0","-1.0","0.0","9413505.328467","-237337.745159","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2001","passing","EPSG","4326","EPSG","2001","1.0","-1.0","0.0","9413522.181089","-237507.225981","144.384786","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2002","passing","EPSG","4326","EPSG","2002","1.0","-1.0","0.0","9412080.888572","-238498.955283","-839.356403","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2003","passing","EPSG","4326","EPSG","2003","1.0","-1.0","0.0","9413059.731344","-237552.824851","-186.118484","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2004","passing","EPSG","4326","EPSG","2004","1.0","-1.0","0.0","9412745.996687","-238131.162481","-285.858899","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2005","passing","EPSG","4326","EPSG","2005","1.0","-1.0","0.0","9413111.969729","-237859.036361","-120.103216","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2006","passing","EPSG","4326","EPSG","2006","1.0","-1.0","0.0","9413216.306967","-237985.053343","39.856758","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2007","passing","EPSG","4326","EPSG","2007","1.0","-1.0","0.0","9412807.154182","-237939.75847","-308.644958","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2008","passing","EPSG","4326","EPSG","2008","1.0","-1.0","0.0","7940045.538185","-199185.330052","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2009","passing","EPSG","4326","EPSG","2009","1.0","-1.0","0.0","8550936.843213","-215181.951772","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2010","passing","EPSG","4326","EPSG","2010","1.0","-1.0","0.0","9207456.599861","-233986.561585","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2011","passing","EPSG","4326","EPSG","2011","1.0","-1.0","0.0","9916156.192369","-256140.621215","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2012","passing","EPSG","4326","EPSG","2012","1.0","-1.0","0.0","1.0684484765137E7","-282289.64286","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2013","passing","EPSG","4326","EPSG","2013","1.0","-1.0","0.0","1.1520897257865E7","-313200.366633","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2014","passing","EPSG","4326","EPSG","2014","1.0","-1.0","0.0","1.2434971573268E7","-349780.156204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2015","passing","EPSG","4326","EPSG","2015","1.0","-1.0","0.0","1.3437535295624E7","-393098.806777","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2016","passing","EPSG","4326","EPSG","2016","1.0","-1.0","0.0","1.4540802378465E7","-444412.968264","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2017","passing","EPSG","4326","EPSG","2017","1.0","-1.0","0.0","1.2434971573268E7","-349780.156204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2018","passing","EPSG","4326","EPSG","2018","1.0","-1.0","0.0","1.3437535295624E7","-393098.806777","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2019","passing","EPSG","4326","EPSG","2019","1.0","-1.0","0.0","1.4540802378465E7","-444412.968264","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2020","passing","EPSG","4326","EPSG","2020","1.0","-1.0","0.0","1.5758520219679E7","-505193.395181","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2021","passing","EPSG","4326","EPSG","2021","1.0","-1.0","0.0","1.5134431600389E7","-473518.806319","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2022","passing","EPSG","4326","EPSG","2022","1.0","-1.0","0.0","1.6415052162846E7","-539659.002909","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2023","passing","EPSG","4326","EPSG","2023","1.0","-1.0","0.0","1.7833968210564E7","-617940.206533","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2000","passing","EPSG","4326","EPSG","2000","1.0","-1.0","0.0","9523653.022923","-246619.708725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2001","passing","EPSG","4326","EPSG","2001","1.0","-1.0","0.0","9523670.353631","-246795.909237","144.384786","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2002","passing","EPSG","4326","EPSG","2002","1.0","-1.0","0.0","9522110.669727","-247817.007418","-839.356403","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2003","passing","EPSG","4326","EPSG","2003","1.0","-1.0","0.0","9523171.274445","-246840.308613","-186.118484","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2004","passing","EPSG","4326","EPSG","2004","1.0","-1.0","0.0","9522829.950429","-247439.173974","-285.858899","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2005","passing","EPSG","4326","EPSG","2005","1.0","-1.0","0.0","9523226.089466","-247158.797942","-120.103216","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2006","passing","EPSG","4326","EPSG","2006","1.0","-1.0","0.0","9523338.006550","-247290.402338","39.856758","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2007","passing","EPSG","4326","EPSG","2007","1.0","-1.0","0.0","9522896.880815","-247240.702084","-308.644958","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2008","passing","EPSG","4326","EPSG","2008","1.0","-1.0","0.0","7976872.796461","-201841.796129","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2009","passing","EPSG","4326","EPSG","2009","1.0","-1.0","0.0","8612478.854878","-219946.308884","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2010","passing","EPSG","4326","EPSG","2010","1.0","-1.0","0.0","9308885.584168","-242427.761224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2011","passing","EPSG","4326","EPSG","2011","1.0","-1.0","0.0","10081608.539653","-270989.749407","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2012","passing","EPSG","4326","EPSG","2012","1.0","-1.0","0.0","10952662.154552","-308386.118446","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2013","passing","EPSG","4326","EPSG","2013","1.0","-1.0","0.0","11954931.432527","-359408.090960","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2014","passing","EPSG","4326","EPSG","2014","1.0","-1.0","0.0","13141133.784689","-433308.829298","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2015","passing","EPSG","4326","EPSG","2015","1.0","-1.0","0.0","14605117.911055","-551134.090321","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2016","passing","EPSG","4326","EPSG","2016","1.0","-1.0","0.0","16546197.819721","-778036.560885","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2017","passing","EPSG","4326","EPSG","2017","1.0","-1.0","0.0","13141133.784689","-433308.829298","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2018","passing","EPSG","4326","EPSG","2018","1.0","-1.0","0.0","14605117.911055","-551134.090321","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2019","passing","EPSG","4326","EPSG","2019","1.0","-1.0","0.0","16546197.819721","-778036.560885","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2020","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2020","1.0","-1.0","0.0","1.5758520219679E7","-505193.395181","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2021","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2021","1.0","-1.0","0.0","1.5134431600389E7","-473518.806319","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2022","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2022","1.0","-1.0","0.0","1.6415052162846E7","-539659.002909","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2023","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2023","1.0","-1.0","0.0","1.7833968210564E7","-617940.206533","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2027","passing","EPSG","4326","EPSG","2027","1.0","-1.0","0.0","8929226.258748","-6009717.418205","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2030","passing","EPSG","4326","EPSG","2030","1.0","-1.0","0.0","1.4020924307249E7","-484340.840329","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2032","passing","EPSG","4326","EPSG","2032","1.0","-1.0","0.0","1.4020924307249E7","-484340.840329","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -528,21 +528,21 @@ "4326 -> 2036","passing","EPSG","4326","EPSG","2036","1.0","-1.0","0.0","1.1911475970543E7","4580906.316255","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2037","passing","EPSG","4326","EPSG","2037","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2038","passing","EPSG","4326","EPSG","2038","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2039","passing","EPSG","4326","EPSG","2039","1.0","-1.0","0.0","-3837705.056243","-3019467.848607","47.93362","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2039","passing","EPSG","4326","EPSG","2039","1.0","-1.0","0.0","-3838066.290608","-3019482.662316","47.93362","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2040","passing","EPSG","4326","EPSG","2040","1.0","-1.0","0.0","945348.691521","-111269.473353","20.166646","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2041","passing","EPSG","4326","EPSG","2041","1.0","-1.0","0.0","945348.695969","-111269.267174","19.923039","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2042","passing","EPSG","4326","EPSG","2042","1.0","-1.0","0.0","1618271.392293","-112720.464267","20.166646","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2043","passing","EPSG","4326","EPSG","2043","1.0","-1.0","0.0","1618271.397189","-112720.255408","19.923039","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2046","passing","EPSG","4326","EPSG","2046","1.0","-1.0","0.0","1574077.256672","113982.625201","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2047","passing","EPSG","4326","EPSG","2047","1.0","-1.0","0.0","1804598.968369","115061.382267","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2048","passing","EPSG","4326","EPSG","2048","1.0","-1.0","0.0","2037455.282541","116304.889836","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2049","passing","EPSG","4326","EPSG","2049","1.0","-1.0","0.0","2272985.462607","117721.690018","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2050","passing","EPSG","4326","EPSG","2050","1.0","-1.0","0.0","2511546.910401","119321.769784","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2051","passing","EPSG","4326","EPSG","2051","1.0","-1.0","0.0","2753517.956865","121116.730156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2052","passing","EPSG","4326","EPSG","2052","1.0","-1.0","0.0","2999300.897571","123119.985084","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2053","passing","EPSG","4326","EPSG","2053","1.0","-1.0","0.0","3249325.29756","125346.993566","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2054","passing","EPSG","4326","EPSG","2054","1.0","-1.0","0.0","3504051.589986","127815.528916","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2055","passing","EPSG","4326","EPSG","2055","1.0","-1.0","0.0","3763974.993044","130545.989419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2046","passing","EPSG","4326","EPSG","2046","1.0","-1.0","0.0","1574077.513711","113982.629798","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2047","passing","EPSG","4326","EPSG","2047","1.0","-1.0","0.0","1804599.671819","115061.396394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2048","passing","EPSG","4326","EPSG","2048","1.0","-1.0","0.0","2037457.032266","116304.928834","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2049","passing","EPSG","4326","EPSG","2049","1.0","-1.0","0.0","2272989.488212","117721.788685","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2050","passing","EPSG","4326","EPSG","2050","1.0","-1.0","0.0","2511555.588887","119322.001938","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2051","passing","EPSG","4326","EPSG","2051","1.0","-1.0","0.0","2753535.662089","121117.243832","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2052","passing","EPSG","4326","EPSG","2052","1.0","-1.0","0.0","2999335.346164","123121.063291","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2053","passing","EPSG","4326","EPSG","2053","1.0","-1.0","0.0","3249389.619137","125349.155550","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2054","passing","EPSG","4326","EPSG","2054","1.0","-1.0","0.0","3504167.432198","127819.693986","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2055","passing","EPSG","4326","EPSG","2055","1.0","-1.0","0.0","3764177.079794","130553.735330","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2056","passing","EPSG","4326","EPSG","2056","1.0","-1.0","0.0","1538741.682858","-4798105.454772","72.481336","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2057","passing","EPSG","4326","EPSG","2057","1.0","-1.0","0.0","-6056728.869378","-177831.481835","-117.399079","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2058","passing","EPSG","4326","EPSG","2058","1.0","-1.0","0.0","-4967245.875788","-153899.951867","-134.563311","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -553,36 +553,36 @@ "4326 -> 2063","passing","EPSG","4326","EPSG","2063","1.0","-1.0","0.0","2303642.507004","-115006.885056","-93.77219","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2064","passing","EPSG","4326","EPSG","2064","1.0","-1.0","0.0","1618065.607747","-112238.577068","-93.77219","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2065","passing","EPSG","4326","EPSG","2065","1.0","-1.0","0.0","-3403377.810463121","-6866646.72852765","158.074317","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2066","passing","EPSG","4326","EPSG","2066","1.0","-1.0","0.0","3.4317337166318E7","-7031695.106846","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2066","passing","EPSG","4326","EPSG","2066","1.0","-1.0","0.0","34315462.773783","-7031695.106846","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2067","passing","EPSG","4326","EPSG","2067","1.0","-1.0","0.0","9876054.028905","-256097.732178","-253.989895","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2068","passing","EPSG","4326","EPSG","2068","1.0","-1.0","0.0","-693194.855433","-111505.316514","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2069","passing","EPSG","4326","EPSG","2069","1.0","-1.0","0.0","-918590.322842","-112127.675772","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2070","passing","EPSG","4326","EPSG","2070","1.0","-1.0","0.0","-1145386.515757","-112896.305759","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2071","passing","EPSG","4326","EPSG","2071","1.0","-1.0","0.0","-1373882.933385","-113816.171381","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2072","passing","EPSG","4326","EPSG","2072","1.0","-1.0","0.0","-1604390.064718","-114893.32087","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2073","passing","EPSG","4326","EPSG","2073","1.0","-1.0","0.0","-1837231.591561","-116134.983775","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2074","passing","EPSG","4326","EPSG","2074","1.0","-1.0","0.0","-2072746.762928","-117549.689946","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2075","passing","EPSG","4326","EPSG","2075","1.0","-1.0","0.0","-2311292.965281","-119147.412068","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2076","passing","EPSG","4326","EPSG","2076","1.0","-1.0","0.0","-2553248.513099","-120939.734616","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2071","passing","EPSG","4326","EPSG","2071","1.0","-1.0","0.0","-1373883.191187","-113816.175987","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2072","passing","EPSG","4326","EPSG","2072","1.0","-1.0","0.0","-1604390.769996","-114893.335018","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2073","passing","EPSG","4326","EPSG","2073","1.0","-1.0","0.0","-1837233.345278","-116135.022818","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2074","passing","EPSG","4326","EPSG","2074","1.0","-1.0","0.0","-2072750.796630","-117549.788697","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2075","passing","EPSG","4326","EPSG","2075","1.0","-1.0","0.0","-2311301.659209","-119147.644361","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2076","passing","EPSG","4326","EPSG","2076","1.0","-1.0","0.0","-2553266.246301","-120940.248490","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2077","passing","EPSG","4326","EPSG","2077","1.0","-1.0","0.0","-392926.875336","-111471.861632","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2078","passing","EPSG","4326","EPSG","2078","1.0","-1.0","0.0","-1073410.979008","-113782.027719","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2079","passing","EPSG","4326","EPSG","2079","1.0","-1.0","0.0","-1772068.903202","-117514.520234","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2080","passing","EPSG","4326","EPSG","2080","1.0","-1.0","0.0","-2498150.376353","-122904.244846","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2081","passing","EPSG","4326","EPSG","2081","1.0","-1.0","0.0","1.329001128455E7","9705159.208106","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2082","passing","EPSG","4326","EPSG","2082","1.0","-1.0","0.0","1.3289959825216E7","9704650.198344","-275.452191","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2083","passing","EPSG","4326","EPSG","2083","1.0","-1.0","0.0","1.3289512356208E7","9704918.196947","-268.76073","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2081","passing","EPSG","4326","EPSG","2081","1.0","-1.0","0.0","13630858.104809","9670527.484971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2082","passing","EPSG","4326","EPSG","2082","1.0","-1.0","0.0","13630788.772323","9669960.363432","-275.452191","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2083","passing","EPSG","4326","EPSG","2083","1.0","-1.0","0.0","13630257.370980","9670268.147864","-268.76073","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2084","passing","EPSG","4326","EPSG","2084","1.0","-1.0","0.0","1.1625805268032E7","9668112.656935","-268.76073","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2085","passing","EPSG","4326","EPSG","2085","1.0","-1.0","0.0","9909411.492491","251948.495886","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2086","passing","EPSG","4326","EPSG","2086","1.0","-1.0","0.0","9435592.696778","-40781.002583","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2085","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","2085","1.0","-1.0","0.0","9909411.492491","251948.495886","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2086","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","2086","1.0","-1.0","0.0","9435592.696778","-40781.002583","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2087","passing","EPSG","4326","EPSG","2087","1.0","-1.0","0.0","-731425.26732","-112459.669592","-136.082986","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2088","passing","EPSG","4326","EPSG","2088","1.0","-1.0","0.0","-618338.2554","-112681.66399","158.258465","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2089","passing","EPSG","4326","EPSG","2089","1.0","-1.0","0.0","-4967185.609965","-154126.257164","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2090","passing","EPSG","4326","EPSG","2090","1.0","-1.0","0.0","-5950996.913939","-172760.344419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2091","passing","EPSG","4326","EPSG","2091","1.0","-1.0","0.0","3034175.890113","-154094.190271","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2092","passing","EPSG","4326","EPSG","2092","1.0","-1.0","0.0","3057865.282305","-172228.244903","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2091","passing","EPSG","4326","EPSG","2091","1.0","-1.0","0.0","3030726.850000","-154278.744236","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2092","passing","EPSG","4326","EPSG","2092","1.0","-1.0","0.0","3046529.372717","-172930.351805","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2095","passing","EPSG","4326","EPSG","2095","1.0","-1.0","0.0","2303683.128162","-115043.750679","-81.963333","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2099","passing","EPSG","4326","EPSG","2099","1.0","-1.0","0.0","-5438481.462531","-2874286.197728","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2100","passing","EPSG","4326","EPSG","2100","1.0","-1.0","0.0","-2131111.928901","-120410.795176","202.813313","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2099","passing","EPSG","4326","EPSG","2099","1.0","-1.0","0.0","-5438352.667776","-2874286.197728","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2100","passing","EPSG","4326","EPSG","2100","1.0","-1.0","0.0","-2131124.401692","-120411.143679","202.813313","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2101","passing","EPSG","4326","EPSG","2101","1.0","-1.0","0.0","8166119.317682","-378218.62937","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2102","passing","EPSG","4326","EPSG","2102","1.0","-1.0","0.0","8366119.317682","-178218.62937","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2103","passing","EPSG","4326","EPSG","2103","1.0","-1.0","0.0","8666119.317682","121781.37063","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -593,15 +593,15 @@ "4326 -> 2136","passing","EPSG","4326","EPSG","2136","1.0","-1.0","0.0","1630201.311354","-2056493.175758","134.707259","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2137","passing","EPSG","4326","EPSG","2137","1.0","-1.0","0.0","722531.754954","-110919.353488","41.058734","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2138","passing","EPSG","4326","EPSG","2138","1.0","-1.0","0.0","9549969.259541","-761453.533047","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2139","passing","EPSG","4326","EPSG","2139","1.0","-1.0","0.0","7939833.583325","-199185.555886","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2140","passing","EPSG","4326","EPSG","2140","1.0","-1.0","0.0","8550689.97567","-215180.26638","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2141","passing","EPSG","4326","EPSG","2141","1.0","-1.0","0.0","9207169.520513","-233982.521348","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2142","passing","EPSG","4326","EPSG","2142","1.0","-1.0","0.0","9915822.915933","-256133.699684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2143","passing","EPSG","4326","EPSG","2143","1.0","-1.0","0.0","1.0684098555407E7","-282279.21894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2144","passing","EPSG","4326","EPSG","2144","1.0","-1.0","0.0","1.1520450559131E7","-313185.711591","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2145","passing","EPSG","4326","EPSG","2145","1.0","-1.0","0.0","1.2434455937819E7","-349760.419421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2146","passing","EPSG","4326","EPSG","2146","1.0","-1.0","0.0","1.3436941307237E7","-393073.000181","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2147","passing","EPSG","4326","EPSG","2147","1.0","-1.0","0.0","1.4540119571761E7","-444379.949362","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2139","passing","EPSG","4326","EPSG","2139","1.0","-1.0","0.0","7976601.826127","-201836.910943","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2140","passing","EPSG","4326","EPSG","2140","1.0","-1.0","0.0","8612137.856451","-219935.732563","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2141","passing","EPSG","4326","EPSG","2141","1.0","-1.0","0.0","9308448.441537","-242408.173378","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2142","passing","EPSG","4326","EPSG","2142","1.0","-1.0","0.0","10081034.668108","-270955.239323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2143","passing","EPSG","4326","EPSG","2143","1.0","-1.0","0.0","10951884.807940","-308325.366944","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2144","passing","EPSG","4326","EPSG","2144","1.0","-1.0","0.0","11953832.248001","-359297.148725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2145","passing","EPSG","4326","EPSG","2145","1.0","-1.0","0.0","13139479.444974","-433089.111077","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2146","passing","EPSG","4326","EPSG","2146","1.0","-1.0","0.0","14602368.100993","-550624.402643","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2147","passing","EPSG","4326","EPSG","2147","1.0","-1.0","0.0","16540704.466247","-776353.629276","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2148","passing","EPSG","4326","EPSG","2148","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2149","passing","EPSG","4326","EPSG","2149","1.0","-1.0","0.0","1.4018825808604E7","-484015.283423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2151","passing","EPSG","4326","EPSG","2151","1.0","-1.0","0.0","1.3117319676437E7","-1.9577493844715E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -621,19 +621,19 @@ "4326 -> 2165","passing","EPSG","4326","EPSG","2165","1.0","-1.0","0.0","1168735.31384","-111611.878896","19.923039","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2166","passing","EPSG","4326","EPSG","2166","1.0","-1.0","0.0","2606760.774275","-111591.535738","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2167","passing","EPSG","4326","EPSG","2167","1.0","-1.0","0.0","3268134.949234","-112580.350505","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2168","passing","EPSG","4326","EPSG","2168","1.0","-1.0","0.0","3926020.936157","-113904.057349","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2168","passing","EPSG","4326","EPSG","2168","1.0","-1.0","0.0","3926020.679291","-113904.061940","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2169","passing","EPSG","4326","EPSG","2169","1.0","-1.0","0.0","-495972.392377","-5533502.739058","-65.336184","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2170","passing","EPSG","4326","EPSG","2170","1.0","-1.0","0.0","-1073989.157328","-114403.337438","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2170","passing","EPSG","4326","EPSG","2170","1.0","-1.0","0.0","-1073989.413973","-114403.342046","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2171","passing","EPSG","4326","EPSG","2171","1.0","-1.0","0.0","1872060.582589","-262789.471158","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2172","passing","EPSG","4326","EPSG","2172","1.0","-1.0","0.0","1723664.732022","-404816.406352","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2173","passing","EPSG","4326","EPSG","2173","1.0","-1.0","0.0","1243940.294977","-391666.88341","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2174","passing","EPSG","4326","EPSG","2174","1.0","-1.0","0.0","1529481.779458","-512384.826988","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2175","passing","EPSG","4326","EPSG","2175","1.0","-1.0","0.0","-1795450.805133","-4816198.388857","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2176","passing","EPSG","4326","EPSG","2176","1.0","-1.0","0.0","3926043.947276","-113973.848535","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2177","passing","EPSG","4326","EPSG","2177","1.0","-1.0","0.0","4579433.404851","-115653.134446","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2178","passing","EPSG","4326","EPSG","2178","1.0","-1.0","0.0","5227189.557272","-117712.625444","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2179","passing","EPSG","4326","EPSG","2179","1.0","-1.0","0.0","5868120.980937","-120184.841613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2180","passing","EPSG","4326","EPSG","2180","1.0","-1.0","0.0","-1536029.063845","-5416223.476409","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2175","passing","EPSG","4326","EPSG","2175","1.0","-1.0","0.0","-1795452.522448","-4816198.427025","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2176","passing","EPSG","4326","EPSG","2176","1.0","-1.0","0.0","3926043.690257","-113973.853132","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2177","passing","EPSG","4326","EPSG","2177","1.0","-1.0","0.0","4579432.283551","-115653.158198","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2178","passing","EPSG","4326","EPSG","2178","1.0","-1.0","0.0","5227185.531977","-117712.724103","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2179","passing","EPSG","4326","EPSG","2179","1.0","-1.0","0.0","5868108.506956","-120185.189371","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2180","passing","EPSG","4326","EPSG","2180","1.0","-1.0","0.0","-1536030.812344","-5416223.515380","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2188","passing","EPSG","4326","EPSG","2188","1.0","-1.0","0.0","4528721.336928","-133619.523438","178.26345","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2189","passing","EPSG","4326","EPSG","2189","1.0","-1.0","0.0","3748031.073485","-125257.660282","-150.578901","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2190","passing","EPSG","4326","EPSG","2190","1.0","-1.0","0.0","3748057.634496","-125359.046404","-49.567675","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -643,22 +643,22 @@ "4326 -> 2195","passing","EPSG","4326","EPSG","2195","1.0","-1.0","0.0","1392989.214538","-9884306.27929","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2196","passing","EPSG","4326","EPSG","2196","1.0","-1.0","0.0","-749536.136293","-111805.012088","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2197","passing","EPSG","4326","EPSG","2197","1.0","-1.0","0.0","-731906.055767","-112652.252702","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2198","passing","EPSG","4326","EPSG","2198","1.0","-1.0","0.0","-674077.256672","-113982.625197","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2199","passing","EPSG","4326","EPSG","2199","1.0","-1.0","0.0","2227089.5292653935","-117593.42878043024","-11.731848","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2198","passing","EPSG","4326","EPSG","2198","1.0","-1.0","0.0","-674077.513711","-113982.629795","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2199","passing","EPSG","4326","EPSG","2199","1.0","-1.0","0.0","2227085.505425","-117593.527290","-11.731848","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2200","passing","EPSG","4326","EPSG","2200","1.0","-1.0","0.0","9711473.012657","-2119092.743174","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2201","passing","EPSG","4326","EPSG","2201","1.0","-1.0","0.0","1.4018825808604E7","-484015.283423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2202","passing","EPSG","4326","EPSG","2202","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2203","passing","EPSG","4326","EPSG","2203","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2204","passing","EPSG","4326","EPSG","2204","1.0","-1.0","0.0","3.5617898204419E7","2247010.09016","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2204","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","2204","1.0","-1.0","0.0","3.5617898204419E7","2247010.09016","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2205","passing","EPSG","4326","EPSG","2205","1.0","-1.0","0.0","1.0686066581916E7","478256.916124","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2206","passing","EPSG","4326","EPSG","2206","1.0","-1.0","0.0","6500684.070159","-122987.938068","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2207","passing","EPSG","4326","EPSG","2207","1.0","-1.0","0.0","7123900.908145","-126414.132467","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2208","passing","EPSG","4326","EPSG","2208","1.0","-1.0","0.0","7735982.709122","-130405.987826","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2209","passing","EPSG","4326","EPSG","2209","1.0","-1.0","0.0","8335158.209118","-135039.902846","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2210","passing","EPSG","4326","EPSG","2210","1.0","-1.0","0.0","8919434.633071","-140409.475142","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2211","passing","EPSG","4326","EPSG","2211","1.0","-1.0","0.0","9486558.761626","-146629.14266","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2212","passing","EPSG","4326","EPSG","2212","1.0","-1.0","0.0","1.0033973117401E7","-153838.562106","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2213","passing","EPSG","4326","EPSG","2213","1.0","-1.0","0.0","-2874720.191298","-126499.241007","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2206","passing","EPSG","4326","EPSG","2206","1.0","-1.0","0.0","6500649.569634","-122989.016912","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2207","passing","EPSG","4326","EPSG","2207","1.0","-1.0","0.0","7123814.110065","-126417.148449","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2208","passing","EPSG","4326","EPSG","2208","1.0","-1.0","0.0","7735780.395796","-130413.735076","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2209","passing","EPSG","4326","EPSG","2209","1.0","-1.0","0.0","8334715.783319","-135058.449241","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2210","passing","EPSG","4326","EPSG","2210","1.0","-1.0","0.0","8918517.868834","-140451.315740","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2211","passing","EPSG","4326","EPSG","2211","1.0","-1.0","0.0","9484744.347572","-146718.898516","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2212","passing","EPSG","4326","EPSG","2212","1.0","-1.0","0.0","10030520.714324","-154023.011166","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2213","passing","EPSG","4326","EPSG","2213","1.0","-1.0","0.0","-2874806.842582","-126502.254699","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2214","passing","EPSG","4326","EPSG","2214","1.0","-1.0","0.0","-61090.418752","888078.471206","-43.414236","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2215","passing","EPSG","4326","EPSG","2215","1.0","-1.0","0.0","-392853.369767","-111582.249853","-39.287305","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2216","passing","EPSG","4326","EPSG","2216","1.0","-1.0","0.0","7306422.238495","-180205.648928","-420.62481","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -675,14 +675,14 @@ "4326 -> 2232","passing","EPSG","4326","EPSG","2232","1.0","-1.0","0.0","4.1268644084037E7","1.1130932245931E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2233","passing","EPSG","4326","EPSG","2233","1.0","-1.0","0.0","4.1300893148666E7","1.0805178197923E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2234","passing","EPSG","4326","EPSG","2234","1.0","-1.0","0.0","3.152765621337E7","-2216629.556017","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2235","passing","EPSG","4326","EPSG","2235","1.0","-1.0","0.0","4.2520912509465E7","-1.5039645049659E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2236","passing","EPSG","4326","EPSG","2236","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2237","passing","EPSG","4326","EPSG","2237","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2235","passing","EPSG","4326","EPSG","2235","1.0","-1.0","0.0","45701112.989039","-15447210.408475","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2236","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2236","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2237","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2237","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2238","passing","EPSG","4326","EPSG","2238","1.0","-1.0","0.0","3.461492471905E7","1403484.069356","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2239","passing","EPSG","4326","EPSG","2239","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2240","passing","EPSG","4326","EPSG","2240","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2244","passing","EPSG","4326","EPSG","2244","1.0","-1.0","0.0","5.5710398969693E7","-1.4711272806654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2245","passing","EPSG","4326","EPSG","2245","1.0","-1.0","0.0","6.0600068996002E7","-1.4838521799231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2239","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2239","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2240","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2240","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2244","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2244","1.0","-1.0","0.0","5.5710398969693E7","-1.4711272806654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2245","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2245","1.0","-1.0","0.0","6.0600068996002E7","-1.4838521799231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2246","passing","EPSG","4326","EPSG","2246","1.0","-1.0","0.0","3.5059203444504E7","1569081.232317","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2247","passing","EPSG","4326","EPSG","2247","1.0","-1.0","0.0","3.5342614219278E7","3714598.128125","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2248","passing","EPSG","4326","EPSG","2248","1.0","-1.0","0.0","3.2708684370125E7","-906152.346323","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -691,11 +691,11 @@ "4326 -> 2251","passing","EPSG","4326","EPSG","2251","1.0","-1.0","0.0","6.1302193407869E7","3190586.781807","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2252","passing","EPSG","4326","EPSG","2252","1.0","-1.0","0.0","5.3954791524009E7","2049141.787235","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2253","passing","EPSG","4326","EPSG","2253","1.0","-1.0","0.0","4.7115923552287E7","1905110.937509","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2254","passing","EPSG","4326","EPSG","2254","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2254","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2254","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2256","passing","EPSG","4326","EPSG","2256","1.0","-1.0","0.0","4.0436083558584E7","1.432628564251E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2260","passing","EPSG","4326","EPSG","2260","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2261","passing","EPSG","4326","EPSG","2261","1.0","-1.0","0.0","4.4002074498844E7","-1.5825594766119E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2262","passing","EPSG","4326","EPSG","2262","1.0","-1.0","0.0","4.6710152386576E7","-1.5935136291522E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2260","passing","EPSG","4326","EPSG","2260","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2261","passing","EPSG","4326","EPSG","2261","1.0","-1.0","0.0","47881070.213714","-16352306.319676","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2262","passing","EPSG","4326","EPSG","2262","1.0","-1.0","0.0","52240265.516853","-16785879.885769","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2263","passing","EPSG","4326","EPSG","2263","1.0","-1.0","0.0","3.1781553125378E7","-2235399.648173","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2264","passing","EPSG","4326","EPSG","2264","1.0","-1.0","0.0","3.3505846979267E7","-57915.272695","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2265","passing","EPSG","4326","EPSG","2265","1.0","-1.0","0.0","3.9529405815696E7","9521710.55353","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -726,192 +726,192 @@ "4326 -> 2290","passing","EPSG","4326","EPSG","2290","1.0","-1.0","0.0","9613608.616577","-2879551.548838","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2291","passing","EPSG","4326","EPSG","2291","1.0","-1.0","0.0","9313608.616577","-2479551.548838","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2292","passing","EPSG","4326","EPSG","2292","1.0","-1.0","0.0","9313611.418086","-2479552.602219","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2294","passing","EPSG","4326","EPSG","2294","1.0","-1.0","0.0","1.340236674173E7","-233982.448078","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2295","passing","EPSG","4326","EPSG","2295","1.0","-1.0","0.0","1.5111019917515E7","-256133.619645","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2294","passing","EPSG","4326","EPSG","2294","1.0","-1.0","0.0","13503645.640972","-242408.098500","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2295","passing","EPSG","4326","EPSG","2295","1.0","-1.0","0.0","15276231.633875","-270955.156473","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2311","passing","EPSG","4326","EPSG","2311","1.0","-1.0","0.0","-57002.405215","-110955.141177","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2312","passing","EPSG","4326","EPSG","2312","1.0","-1.0","0.0","-1073477.362344","-113926.919088","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2313","passing","EPSG","4326","EPSG","2313","1.0","-1.0","0.0","-1073477.362344","-113926.919088","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2314","passing","EPSG","4326","EPSG","2314","1.0","-1.0","0.0","2.30448994072E7","-4262902.111671","-300.445005","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2314","passing","EPSG","4326","EPSG","2314","1.0","-1.0","0.0","23043584.931408","-4262902.111671","-300.445005","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2315","passing","EPSG","4326","EPSG","2315","1.0","-1.0","0.0","1.1625977196942E7","9668121.598626","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2316","passing","EPSG","4326","EPSG","2316","1.0","-1.0","0.0","9876600.675978","9744077.299474","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2317","passing","EPSG","4326","EPSG","2317","1.0","-1.0","0.0","8483864.88786","683628.197412","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2318","passing","EPSG","4326","EPSG","2318","1.0","-1.0","0.0","-5609010.099426","-1971372.38881","-103.771234","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2319","passing","EPSG","4326","EPSG","2319","1.0","-1.0","0.0","-2499315.929841","-122987.938068","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2320","passing","EPSG","4326","EPSG","2320","1.0","-1.0","0.0","-2876099.091855","-126414.132467","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2321","passing","EPSG","4326","EPSG","2321","1.0","-1.0","0.0","-3264017.290878","-130405.987826","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2322","passing","EPSG","4326","EPSG","2322","1.0","-1.0","0.0","-3664841.790882","-135039.902846","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2323","passing","EPSG","4326","EPSG","2323","1.0","-1.0","0.0","-4080565.366929","-140409.475142","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2324","passing","EPSG","4326","EPSG","2324","1.0","-1.0","0.0","-4513441.238374","-146629.14266","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2325","passing","EPSG","4326","EPSG","2325","1.0","-1.0","0.0","-4966026.882599","-153838.562106","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2327","passing","EPSG","4326","EPSG","2327","1.0","-1.0","0.0","1527311.025253","-343262.277722","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2328","passing","EPSG","4326","EPSG","2328","1.0","-1.0","0.0","454688.1718","-435257.804429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2329","passing","EPSG","4326","EPSG","2329","1.0","-1.0","0.0","-1067784.309404","-564311.124323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2338","passing","EPSG","4326","EPSG","2338","1.0","-1.0","0.0","-1.1472688974747E7","-343262.277722","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2339","passing","EPSG","4326","EPSG","2339","1.0","-1.0","0.0","-1.35453118282E7","-435257.804429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2340","passing","EPSG","4326","EPSG","2340","1.0","-1.0","0.0","-1.6067784309404E7","-564311.124323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2349","passing","EPSG","4326","EPSG","2349","1.0","-1.0","0.0","1.3527311025253E7","-343262.277722","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2350","passing","EPSG","4326","EPSG","2350","1.0","-1.0","0.0","1.3540282065797E7","-385374.221733","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2351","passing","EPSG","4326","EPSG","2351","1.0","-1.0","0.0","1.34546881718E7","-435257.804429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2352","passing","EPSG","4326","EPSG","2352","1.0","-1.0","0.0","1.3257047951431E7","-494346.051652","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2353","passing","EPSG","4326","EPSG","2353","1.0","-1.0","0.0","1.2932215690596E7","-564311.124323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2354","passing","EPSG","4326","EPSG","2354","1.0","-1.0","0.0","1.2463214135521E7","-647097.330633","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2370","passing","EPSG","4326","EPSG","2370","1.0","-1.0","0.0","-1.1472688974747E7","-343262.277722","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2371","passing","EPSG","4326","EPSG","2371","1.0","-1.0","0.0","-1.2459717934203E7","-385374.221733","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2372","passing","EPSG","4326","EPSG","2372","1.0","-1.0","0.0","-1.35453118282E7","-435257.804429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2373","passing","EPSG","4326","EPSG","2373","1.0","-1.0","0.0","-1.4742952048569E7","-494346.051652","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2374","passing","EPSG","4326","EPSG","2374","1.0","-1.0","0.0","-1.6067784309404E7","-564311.124323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2375","passing","EPSG","4326","EPSG","2375","1.0","-1.0","0.0","-1.7536785864479E7","-647097.330633","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2391","passing","EPSG","4326","EPSG","2391","1.0","-1.0","0.0","-772948.687017","-117585.752486","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2392","passing","EPSG","4326","EPSG","2392","1.0","-1.0","0.0","-132057.304143","-120055.248542","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2393","passing","EPSG","4326","EPSG","2393","1.0","-1.0","0.0","500710.973975","-122977.711085","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2394","passing","EPSG","4326","EPSG","2394","1.0","-1.0","0.0","1123928.546447","-126403.588479","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2395","passing","EPSG","4326","EPSG","2395","1.0","-1.0","0.0","3034175.890113","-154094.190271","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2396","passing","EPSG","4326","EPSG","2396","1.0","-1.0","0.0","3057865.282305","-172228.244903","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2319","passing","EPSG","4326","EPSG","2319","1.0","-1.0","0.0","-2499350.430366","-122989.016912","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2320","passing","EPSG","4326","EPSG","2320","1.0","-1.0","0.0","-2876185.889935","-126417.148449","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2321","passing","EPSG","4326","EPSG","2321","1.0","-1.0","0.0","-3264219.604204","-130413.735076","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2322","passing","EPSG","4326","EPSG","2322","1.0","-1.0","0.0","-3665284.216681","-135058.449241","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2323","passing","EPSG","4326","EPSG","2323","1.0","-1.0","0.0","-4081482.131166","-140451.315740","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2324","passing","EPSG","4326","EPSG","2324","1.0","-1.0","0.0","-4515255.652428","-146718.898516","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2325","passing","EPSG","4326","EPSG","2325","1.0","-1.0","0.0","-4969479.285676","-154023.011166","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2327","passing","EPSG","4326","EPSG","2327","1.0","-1.0","0.0","877625.345385","-418603.692156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2328","passing","EPSG","4326","EPSG","2328","1.0","-1.0","0.0","-1365967.754618","-724567.762394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2329","passing","EPSG","4326","EPSG","2329","1.0","-1.0","0.0","6174706.497229","-13442304.925084","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2338","passing","EPSG","4326","EPSG","2338","1.0","-1.0","0.0","-12122374.654615","-418603.692156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2339","passing","EPSG","4326","EPSG","2339","1.0","-1.0","0.0","-15365967.754618","-724567.762394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2340","passing","EPSG","4326","EPSG","2340","1.0","-1.0","0.0","-8825293.502771","-13442304.925084","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2349","passing","EPSG","4326","EPSG","2349","1.0","-1.0","0.0","12877625.345385","-418603.692156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2350","passing","EPSG","4326","EPSG","2350","1.0","-1.0","0.0","12470328.960766","-526375.856290","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2351","passing","EPSG","4326","EPSG","2351","1.0","-1.0","0.0","11634032.245382","-724567.762394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2352","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2352","1.0","-1.0","0.0","1.3257047951431E7","-494346.051652","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2353","passing","EPSG","4326","EPSG","2353","1.0","-1.0","0.0","20174706.497229","-13442304.925084","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2354","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2354","1.0","-1.0","0.0","1.2463214135521E7","-647097.330633","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2370","passing","EPSG","4326","EPSG","2370","1.0","-1.0","0.0","-12122374.654615","-418603.692156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2371","passing","EPSG","4326","EPSG","2371","1.0","-1.0","0.0","-13529671.039234","-526375.856290","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2372","passing","EPSG","4326","EPSG","2372","1.0","-1.0","0.0","-15365967.754618","-724567.762394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2373","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2373","1.0","-1.0","0.0","-1.4742952048569E7","-494346.051652","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2374","passing","EPSG","4326","EPSG","2374","1.0","-1.0","0.0","-8825293.502771","-13442304.925084","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2375","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2375","1.0","-1.0","0.0","-1.7536785864479E7","-647097.330633","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2391","passing","EPSG","4326","EPSG","2391","1.0","-1.0","0.0","-772952.720772","-117585.851258","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2392","passing","EPSG","4326","EPSG","2392","1.0","-1.0","0.0","-132069.800269","-120055.596575","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2393","passing","EPSG","4326","EPSG","2393","1.0","-1.0","0.0","500676.475839","-122978.789758","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2394","passing","EPSG","4326","EPSG","2394","1.0","-1.0","0.0","1123841.753848","-126406.604002","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2395","passing","EPSG","4326","EPSG","2395","1.0","-1.0","0.0","3030726.850000","-154278.744236","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2396","passing","EPSG","4326","EPSG","2396","1.0","-1.0","0.0","3046529.372717","-172930.351805","-28.44479","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2397","passing","EPSG","4326","EPSG","2397","1.0","-1.0","0.0","2606767.5052536973","-111583.82850144235","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2398","passing","EPSG","4326","EPSG","2398","1.0","-1.0","0.0","3268141.7325400496","-112572.56860527751","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2399","passing","EPSG","4326","EPSG","2399","1.0","-1.0","0.0","3926027.7916505085","-113896.1773816197","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2400","passing","EPSG","4326","EPSG","2400","1.0","-1.0","0.0","-166593.824591","-114947.287526","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2401","passing","EPSG","4326","EPSG","2401","1.0","-1.0","0.0","1.3527545472395E7","-342995.046176","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2402","passing","EPSG","4326","EPSG","2402","1.0","-1.0","0.0","1.3540542129196E7","-385073.087704","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2403","passing","EPSG","4326","EPSG","2403","1.0","-1.0","0.0","1.3454977904554E7","-434916.510601","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2404","passing","EPSG","4326","EPSG","2404","1.0","-1.0","0.0","1.3257371875881E7","-493957.197245","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2405","passing","EPSG","4326","EPSG","2405","1.0","-1.0","0.0","1.293257883892E7","-563865.977202","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2406","passing","EPSG","4326","EPSG","2406","1.0","-1.0","0.0","1.246362209204E7","-646585.613952","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2422","passing","EPSG","4326","EPSG","2422","1.0","-1.0","0.0","-1.1472454527605E7","-342995.046176","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2423","passing","EPSG","4326","EPSG","2423","1.0","-1.0","0.0","-1.2459457870804E7","-385073.087704","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2424","passing","EPSG","4326","EPSG","2424","1.0","-1.0","0.0","-1.3545022095446E7","-434916.510601","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2425","passing","EPSG","4326","EPSG","2425","1.0","-1.0","0.0","-1.4742628124119E7","-493957.197245","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2426","passing","EPSG","4326","EPSG","2426","1.0","-1.0","0.0","-1.606742116108E7","-563865.977202","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2427","passing","EPSG","4326","EPSG","2427","1.0","-1.0","0.0","-1.753637790796E7","-646585.613952","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2462","passing","EPSG","4326","EPSG","2462","1.0","-1.0","0.0","2227089.5292653935","-117593.42878043024","-11.731848","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2463","passing","EPSG","4326","EPSG","2463","1.0","-1.0","0.0","-1772888.950771","-117636.4223","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2464","passing","EPSG","4326","EPSG","2464","1.0","-1.0","0.0","-2499210.641844","-123030.496386","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2465","passing","EPSG","4326","EPSG","2465","1.0","-1.0","0.0","-3263889.352445","-130450.737301","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2466","passing","EPSG","4326","EPSG","2466","1.0","-1.0","0.0","-4080410.86794","-140457.124938","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2467","passing","EPSG","4326","EPSG","2467","1.0","-1.0","0.0","-4965840.530513","-153890.015637","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2468","passing","EPSG","4326","EPSG","2468","1.0","-1.0","0.0","-5942153.803447","-172000.113601","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2469","passing","EPSG","4326","EPSG","2469","1.0","-1.0","0.0","-7037905.952801","-196632.806922","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2470","passing","EPSG","4326","EPSG","2470","1.0","-1.0","0.0","-8290294.392942","-230482.065892","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2471","passing","EPSG","4326","EPSG","2471","1.0","-1.0","0.0","-9747667.242405","-277431.325425","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2472","passing","EPSG","4326","EPSG","2472","1.0","-1.0","0.0","-1.1472531636535E7","-343000.997494","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2473","passing","EPSG","4326","EPSG","2473","1.0","-1.0","0.0","-1.3545115343377E7","-434924.483647","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2474","passing","EPSG","4326","EPSG","2474","1.0","-1.0","0.0","-1.6067535229283E7","-563876.781733","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2399","passing","EPSG","4326","EPSG","2399","1.0","-1.0","0.0","3926027.534792","-113896.181972","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2400","passing","EPSG","4326","EPSG","2400","1.0","-1.0","0.0","-166594.214399","-114947.294877","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2401","passing","EPSG","4326","EPSG","2401","1.0","-1.0","0.0","12877998.661323","-418259.208244","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2402","passing","EPSG","4326","EPSG","2402","1.0","-1.0","0.0","12470826.408097","-525925.858634","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2403","passing","EPSG","4326","EPSG","2403","1.0","-1.0","0.0","11634759.823981","-723899.094671","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2404","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2404","1.0","-1.0","0.0","1.3257371875881E7","-493957.197245","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2405","passing","EPSG","4326","EPSG","2405","1.0","-1.0","0.0","20096226.905901","-13446275.705824","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2406","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2406","1.0","-1.0","0.0","1.246362209204E7","-646585.613952","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2422","passing","EPSG","4326","EPSG","2422","1.0","-1.0","0.0","-12122001.338677","-418259.208244","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2423","passing","EPSG","4326","EPSG","2423","1.0","-1.0","0.0","-13529173.591903","-525925.858634","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2424","passing","EPSG","4326","EPSG","2424","1.0","-1.0","0.0","-15365240.176019","-723899.094671","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2425","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2425","1.0","-1.0","0.0","-1.4742628124119E7","-493957.197245","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2426","passing","EPSG","4326","EPSG","2426","1.0","-1.0","0.0","-8903773.094099","-13446275.705824","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2427","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2427","1.0","-1.0","0.0","-1.753637790796E7","-646585.613952","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2462","passing","EPSG","4326","EPSG","2462","1.0","-1.0","0.0","2227085.505425","-117593.527290","-11.731848","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2463","passing","EPSG","4326","EPSG","2463","1.0","-1.0","0.0","-1772892.974308","-117636.520838","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2464","passing","EPSG","4326","EPSG","2464","1.0","-1.0","0.0","-2499245.076581","-123031.573310","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2465","passing","EPSG","4326","EPSG","2465","1.0","-1.0","0.0","-3264091.372755","-130458.474623","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2466","passing","EPSG","4326","EPSG","2466","1.0","-1.0","0.0","-4081326.582339","-140498.925711","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2467","passing","EPSG","4326","EPSG","2467","1.0","-1.0","0.0","-4969289.687269","-154074.329852","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2468","passing","EPSG","4326","EPSG","2468","1.0","-1.0","0.0","-5953490.088607","-172701.307523","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2469","passing","EPSG","4326","EPSG","2469","1.0","-1.0","0.0","-7071601.390465","-199032.459545","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2470","passing","EPSG","4326","EPSG","2470","1.0","-1.0","0.0","-8383549.022382","-238139.999242","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2471","passing","EPSG","4326","EPSG","2471","1.0","-1.0","0.0","-9994787.974786","-301115.494208","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2472","passing","EPSG","4326","EPSG","2472","1.0","-1.0","0.0","-12122104.414257","-418269.477200","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2473","passing","EPSG","4326","EPSG","2473","1.0","-1.0","0.0","-15365416.289671","-723928.382214","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2474","passing","EPSG","4326","EPSG","2474","1.0","-1.0","0.0","-8893633.758840","-13449395.681243","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2492","passing","EPSG","4326","EPSG","2492","1.0","-1.0","0.0","-393244.435457","-111577.648952","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2493","passing","EPSG","4326","EPSG","2493","1.0","-1.0","0.0","-1073984.408421","-113889.892938","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2494","passing","EPSG","4326","EPSG","2494","1.0","-1.0","0.0","-1772900.695582","-117625.665195","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2495","passing","EPSG","4326","EPSG","2495","1.0","-1.0","0.0","-2499222.948614","-123019.272688","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2496","passing","EPSG","4326","EPSG","2496","1.0","-1.0","0.0","-3263902.426215","-130438.868024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2497","passing","EPSG","4326","EPSG","2497","1.0","-1.0","0.0","-4080424.966761","-140444.383403","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2498","passing","EPSG","4326","EPSG","2498","1.0","-1.0","0.0","-4965855.986445","-153876.103477","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2499","passing","EPSG","4326","EPSG","2499","1.0","-1.0","0.0","-5942171.049419","-171984.62562","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2500","passing","EPSG","4326","EPSG","2500","1.0","-1.0","0.0","-7037925.556417","-196615.180042","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2501","passing","EPSG","4326","EPSG","2501","1.0","-1.0","0.0","-8290317.098377","-230461.506074","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2502","passing","EPSG","4326","EPSG","2502","1.0","-1.0","0.0","-9747694.021541","-277406.704894","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2503","passing","EPSG","4326","EPSG","2503","1.0","-1.0","0.0","-1.1472563750541E7","-342970.712816","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2504","passing","EPSG","4326","EPSG","2504","1.0","-1.0","0.0","-1.3545154415967E7","-434886.26325","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2505","passing","EPSG","4326","EPSG","2505","1.0","-1.0","0.0","-1.6067583332906E7","-563827.429285","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2523","passing","EPSG","4326","EPSG","2523","1.0","-1.0","0.0","5227099.304418","-117625.665195","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2524","passing","EPSG","4326","EPSG","2524","1.0","-1.0","0.0","5867999.502325","-120095.919503","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2525","passing","EPSG","4326","EPSG","2525","1.0","-1.0","0.0","6500777.051386","-123019.272688","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2526","passing","EPSG","4326","EPSG","2526","1.0","-1.0","0.0","7124004.443938","-126446.185441","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2527","passing","EPSG","4326","EPSG","2527","1.0","-1.0","0.0","7736097.573785","-130438.868024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2528","passing","EPSG","4326","EPSG","2528","1.0","-1.0","0.0","8335285.311042","-135073.730267","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2529","passing","EPSG","4326","EPSG","2529","1.0","-1.0","0.0","8919575.033239","-140444.383403","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2530","passing","EPSG","4326","EPSG","2530","1.0","-1.0","0.0","9486713.694373","-146665.282069","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2531","passing","EPSG","4326","EPSG","2531","1.0","-1.0","0.0","1.0034144013555E7","-153876.103477","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2532","passing","EPSG","4326","EPSG","2532","1.0","-1.0","0.0","1.0558955364937E7","-162246.969438","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2533","passing","EPSG","4326","EPSG","2533","1.0","-1.0","0.0","1.1057828950581E7","-171984.62562","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2534","passing","EPSG","4326","EPSG","2534","1.0","-1.0","0.0","1.1526976837935E7","-183339.701115","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2535","passing","EPSG","4326","EPSG","2535","1.0","-1.0","0.0","1.1962074443583E7","-196615.180042","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2536","passing","EPSG","4326","EPSG","2536","1.0","-1.0","0.0","1.2358186044954E7","-212176.225657","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2537","passing","EPSG","4326","EPSG","2537","1.0","-1.0","0.0","1.2709682901623E7","-230461.506074","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2538","passing","EPSG","4326","EPSG","2538","1.0","-1.0","0.0","1.3010153567919E7","-251996.179415","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2539","passing","EPSG","4326","EPSG","2539","1.0","-1.0","0.0","1.3252305978459E7","-277406.704894","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2540","passing","EPSG","4326","EPSG","2540","1.0","-1.0","0.0","1.3427860888315E7","-307437.655024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2541","passing","EPSG","4326","EPSG","2541","1.0","-1.0","0.0","1.3527436249459E7","-342970.712816","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2542","passing","EPSG","4326","EPSG","2542","1.0","-1.0","0.0","1.3540422105165E7","-385046.046532","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2543","passing","EPSG","4326","EPSG","2543","1.0","-1.0","0.0","1.3454845584033E7","-434886.26325","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2544","passing","EPSG","4326","EPSG","2544","1.0","-1.0","0.0","1.3257225575297E7","-493923.151171","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2545","passing","EPSG","4326","EPSG","2545","1.0","-1.0","0.0","1.2932416667094E7","-563827.429285","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2546","passing","EPSG","4326","EPSG","2546","1.0","-1.0","0.0","1.2463441929365E7","-646541.731725","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2493","passing","EPSG","4326","EPSG","2493","1.0","-1.0","0.0","-1073984.665294","-113889.897528","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2494","passing","EPSG","4326","EPSG","2494","1.0","-1.0","0.0","-1772904.719281","-117625.763728","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2495","passing","EPSG","4326","EPSG","2495","1.0","-1.0","0.0","-2499257.384477","-123020.349552","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2496","passing","EPSG","4326","EPSG","2496","1.0","-1.0","0.0","-3264104.452125","-130446.604869","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2497","passing","EPSG","4326","EPSG","2497","1.0","-1.0","0.0","-4081340.703335","-140486.181429","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2498","passing","EPSG","4326","EPSG","2498","1.0","-1.0","0.0","-4969305.217962","-154060.405066","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2499","passing","EPSG","4326","EPSG","2499","1.0","-1.0","0.0","-5953507.559286","-172685.770091","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2500","passing","EPSG","4326","EPSG","2500","1.0","-1.0","0.0","-7071621.617834","-199014.660104","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2501","passing","EPSG","4326","EPSG","2501","1.0","-1.0","0.0","-8383573.378286","-238118.882807","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2502","passing","EPSG","4326","EPSG","2502","1.0","-1.0","0.0","-9994819.069755","-301089.152495","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2503","passing","EPSG","4326","EPSG","2503","1.0","-1.0","0.0","-12122148.359192","-418233.840425","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2504","passing","EPSG","4326","EPSG","2504","1.0","-1.0","0.0","-15365495.887991","-723872.049499","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2505","passing","EPSG","4326","EPSG","2505","1.0","-1.0","0.0","-8890896.823237","-13454506.333789","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2523","passing","EPSG","4326","EPSG","2523","1.0","-1.0","0.0","5227095.280719","-117625.763728","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2524","passing","EPSG","4326","EPSG","2524","1.0","-1.0","0.0","5867987.032569","-120096.266838","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2525","passing","EPSG","4326","EPSG","2525","1.0","-1.0","0.0","6500742.615523","-123020.349552","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2526","passing","EPSG","4326","EPSG","2526","1.0","-1.0","0.0","7123917.786760","-126449.196707","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2527","passing","EPSG","4326","EPSG","2527","1.0","-1.0","0.0","7735895.547875","-130446.604869","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2528","passing","EPSG","4326","EPSG","2528","1.0","-1.0","0.0","8334843.440849","-135092.255078","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2529","passing","EPSG","4326","EPSG","2529","1.0","-1.0","0.0","8918659.296665","-140486.181429","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2530","passing","EPSG","4326","EPSG","2530","1.0","-1.0","0.0","9484901.113057","-146754.957354","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2531","passing","EPSG","4326","EPSG","2531","1.0","-1.0","0.0","10030694.782038","-154060.405066","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2532","passing","EPSG","4326","EPSG","2532","1.0","-1.0","0.0","10552610.331763","-162612.103155","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2533","passing","EPSG","4326","EPSG","2533","1.0","-1.0","0.0","11046492.440714","-172685.770091","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2534","passing","EPSG","4326","EPSG","2534","1.0","-1.0","0.0","11507222.854945","-184651.024975","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2535","passing","EPSG","4326","EPSG","2535","1.0","-1.0","0.0","11928378.382166","-199014.660104","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2536","passing","EPSG","4326","EPSG","2536","1.0","-1.0","0.0","12301723.135500","-216490.677016","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2537","passing","EPSG","4326","EPSG","2537","1.0","-1.0","0.0","12616426.621714","-238118.882807","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2538","passing","EPSG","4326","EPSG","2538","1.0","-1.0","0.0","12857805.114897","-265477.181583","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2539","passing","EPSG","4326","EPSG","2539","1.0","-1.0","0.0","13005180.930245","-301089.152495","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2540","passing","EPSG","4326","EPSG","2540","1.0","-1.0","0.0","13027973.999897","-349281.719121","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2541","passing","EPSG","4326","EPSG","2541","1.0","-1.0","0.0","12877851.640808","-418233.840425","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2542","passing","EPSG","4326","EPSG","2542","1.0","-1.0","0.0","12470641.069504","-525897.864005","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2543","passing","EPSG","4326","EPSG","2543","1.0","-1.0","0.0","11634504.112009","-723872.049499","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2544","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2544","1.0","-1.0","0.0","1.3257225575297E7","-493923.151171","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2545","passing","EPSG","4326","EPSG","2545","1.0","-1.0","0.0","20109103.176763","-13454506.333789","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2546","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2546","1.0","-1.0","0.0","1.2463441929365E7","-646541.731725","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2550","passing","EPSG","4326","EPSG","2550","1.0","-1.0","0.0","-8873611.031099","-9738015.6953","1133.347851","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2582","passing","EPSG","4326","EPSG","2582","1.0","-1.0","0.0","-1772900.695582","-117625.665195","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2583","passing","EPSG","4326","EPSG","2583","1.0","-1.0","0.0","-2132000.497675","-120095.919503","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2584","passing","EPSG","4326","EPSG","2584","1.0","-1.0","0.0","-2499222.948614","-123019.272688","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2585","passing","EPSG","4326","EPSG","2585","1.0","-1.0","0.0","-2875995.556062","-126446.185441","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2586","passing","EPSG","4326","EPSG","2586","1.0","-1.0","0.0","-3263902.426215","-130438.868024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2587","passing","EPSG","4326","EPSG","2587","1.0","-1.0","0.0","-3664714.688958","-135073.730267","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2588","passing","EPSG","4326","EPSG","2588","1.0","-1.0","0.0","-4080424.966761","-140444.383403","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2589","passing","EPSG","4326","EPSG","2589","1.0","-1.0","0.0","-4513286.305627","-146665.282069","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2590","passing","EPSG","4326","EPSG","2590","1.0","-1.0","0.0","-4965855.986445","-153876.103477","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2591","passing","EPSG","4326","EPSG","2591","1.0","-1.0","0.0","-5441044.635063","-162246.969438","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2592","passing","EPSG","4326","EPSG","2592","1.0","-1.0","0.0","-5942171.049419","-171984.62562","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2593","passing","EPSG","4326","EPSG","2593","1.0","-1.0","0.0","-6473023.162065","-183339.701115","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2594","passing","EPSG","4326","EPSG","2594","1.0","-1.0","0.0","-7037925.556417","-196615.180042","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2595","passing","EPSG","4326","EPSG","2595","1.0","-1.0","0.0","-7641813.955046","-212176.225657","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2596","passing","EPSG","4326","EPSG","2596","1.0","-1.0","0.0","-8290317.098377","-230461.506074","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2597","passing","EPSG","4326","EPSG","2597","1.0","-1.0","0.0","-8989846.432081","-251996.179415","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2598","passing","EPSG","4326","EPSG","2598","1.0","-1.0","0.0","-9747694.021541","-277406.704894","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2599","passing","EPSG","4326","EPSG","2599","1.0","-1.0","0.0","-1.0572139111685E7","-307437.655024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2600","passing","EPSG","4326","EPSG","2600","1.0","-1.0","0.0","-2131555.273016","-120170.057739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2601","passing","EPSG","4326","EPSG","2601","1.0","-1.0","0.0","-1.1472563750541E7","-342970.712816","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2602","passing","EPSG","4326","EPSG","2602","1.0","-1.0","0.0","-1.2459577894835E7","-385046.046532","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2603","passing","EPSG","4326","EPSG","2603","1.0","-1.0","0.0","-1.3545154415967E7","-434886.26325","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2604","passing","EPSG","4326","EPSG","2604","1.0","-1.0","0.0","-1.4742774424703E7","-493923.151171","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2605","passing","EPSG","4326","EPSG","2605","1.0","-1.0","0.0","-1.6067583332906E7","-563827.429285","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2606","passing","EPSG","4326","EPSG","2606","1.0","-1.0","0.0","-1.7536558070635E7","-646541.731725","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2641","passing","EPSG","4326","EPSG","2641","1.0","-1.0","0.0","5227111.049229","-117636.4223","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2642","passing","EPSG","4326","EPSG","2642","1.0","-1.0","0.0","5868011.505116","-120106.889801","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2643","passing","EPSG","4326","EPSG","2643","1.0","-1.0","0.0","6500789.358156","-123030.496386","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2644","passing","EPSG","4326","EPSG","2644","1.0","-1.0","0.0","7124017.105696","-126457.707032","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2645","passing","EPSG","4326","EPSG","2645","1.0","-1.0","0.0","7736110.647555","-130450.737301","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2646","passing","EPSG","4326","EPSG","2646","1.0","-1.0","0.0","8335298.861011","-135086.003531","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2647","passing","EPSG","4326","EPSG","2647","1.0","-1.0","0.0","8919589.13206","-140457.124938","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2648","passing","EPSG","4326","EPSG","2648","1.0","-1.0","0.0","9486728.424643","-146678.565928","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2649","passing","EPSG","4326","EPSG","2649","1.0","-1.0","0.0","1.0034159469487E7","-153890.015637","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2650","passing","EPSG","4326","EPSG","2650","1.0","-1.0","0.0","1.0558971654237E7","-162261.610412","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2651","passing","EPSG","4326","EPSG","2651","1.0","-1.0","0.0","1.1057846196553E7","-172000.113601","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2652","passing","EPSG","4326","EPSG","2652","1.0","-1.0","0.0","1.1526995181826E7","-183356.175745","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2653","passing","EPSG","4326","EPSG","2653","1.0","-1.0","0.0","1.1962094047199E7","-196632.806922","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2654","passing","EPSG","4326","EPSG","2654","1.0","-1.0","0.0","1.235820709354E7","-212195.20171","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2655","passing","EPSG","4326","EPSG","2655","1.0","-1.0","0.0","1.2709705607058E7","-230482.065892","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2656","passing","EPSG","4326","EPSG","2656","1.0","-1.0","0.0","1.3010178172213E7","-252018.602747","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2657","passing","EPSG","4326","EPSG","2657","1.0","-1.0","0.0","1.3252332757595E7","-277431.325425","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2658","passing","EPSG","4326","EPSG","2658","1.0","-1.0","0.0","1.3427890156444E7","-307464.870632","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2659","passing","EPSG","4326","EPSG","2659","1.0","-1.0","0.0","1.3527468363465E7","-343000.997494","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2660","passing","EPSG","4326","EPSG","2660","1.0","-1.0","0.0","1.3540457469634E7","-385079.964195","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2661","passing","EPSG","4326","EPSG","2661","1.0","-1.0","0.0","1.3454884656623E7","-434924.483647","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2662","passing","EPSG","4326","EPSG","2662","1.0","-1.0","0.0","1.3257268872553E7","-493966.46816","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2663","passing","EPSG","4326","EPSG","2663","1.0","-1.0","0.0","1.2932464770717E7","-563876.781733","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2664","passing","EPSG","4326","EPSG","2664","1.0","-1.0","0.0","1.246349549295E7","-646598.227329","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2699","passing","EPSG","4326","EPSG","2699","1.0","-1.0","0.0","-1772888.950771","-117636.4223","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2700","passing","EPSG","4326","EPSG","2700","1.0","-1.0","0.0","-2131988.494884","-120106.889801","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2701","passing","EPSG","4326","EPSG","2701","1.0","-1.0","0.0","-2499210.641844","-123030.496386","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2702","passing","EPSG","4326","EPSG","2702","1.0","-1.0","0.0","-2875982.894304","-126457.707032","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2703","passing","EPSG","4326","EPSG","2703","1.0","-1.0","0.0","-3263889.352445","-130450.737301","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2704","passing","EPSG","4326","EPSG","2704","1.0","-1.0","0.0","-3664701.138989","-135086.003531","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2705","passing","EPSG","4326","EPSG","2705","1.0","-1.0","0.0","-4080410.86794","-140457.124938","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2706","passing","EPSG","4326","EPSG","2706","1.0","-1.0","0.0","-4513271.575357","-146678.565928","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2707","passing","EPSG","4326","EPSG","2707","1.0","-1.0","0.0","-4965840.530513","-153890.015637","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2708","passing","EPSG","4326","EPSG","2708","1.0","-1.0","0.0","-5441028.345763","-162261.610412","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2709","passing","EPSG","4326","EPSG","2709","1.0","-1.0","0.0","-5942153.803447","-172000.113601","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2710","passing","EPSG","4326","EPSG","2710","1.0","-1.0","0.0","-6473004.818174","-183356.175745","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2711","passing","EPSG","4326","EPSG","2711","1.0","-1.0","0.0","-7037905.952801","-196632.806922","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2712","passing","EPSG","4326","EPSG","2712","1.0","-1.0","0.0","-7641792.90646","-212195.20171","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2713","passing","EPSG","4326","EPSG","2713","1.0","-1.0","0.0","-8290294.392942","-230482.065892","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2714","passing","EPSG","4326","EPSG","2714","1.0","-1.0","0.0","-8989821.827787","-252018.602747","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2715","passing","EPSG","4326","EPSG","2715","1.0","-1.0","0.0","-9747667.242405","-277431.325425","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2716","passing","EPSG","4326","EPSG","2716","1.0","-1.0","0.0","-1.0572109843556E7","-307464.870632","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2717","passing","EPSG","4326","EPSG","2717","1.0","-1.0","0.0","-1.1472531636535E7","-343000.997494","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2718","passing","EPSG","4326","EPSG","2718","1.0","-1.0","0.0","-1.2459542530366E7","-385079.964195","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2719","passing","EPSG","4326","EPSG","2719","1.0","-1.0","0.0","-1.3545115343377E7","-434924.483647","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2720","passing","EPSG","4326","EPSG","2720","1.0","-1.0","0.0","-1.4742731127447E7","-493966.46816","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2721","passing","EPSG","4326","EPSG","2721","1.0","-1.0","0.0","-1.6067535229283E7","-563876.781733","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2722","passing","EPSG","4326","EPSG","2722","1.0","-1.0","0.0","-1.753650450705E7","-646598.227329","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2582","passing","EPSG","4326","EPSG","2582","1.0","-1.0","0.0","-1772904.719281","-117625.763728","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2583","passing","EPSG","4326","EPSG","2583","1.0","-1.0","0.0","-2132012.967431","-120096.266838","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2584","passing","EPSG","4326","EPSG","2584","1.0","-1.0","0.0","-2499257.384477","-123020.349552","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2585","passing","EPSG","4326","EPSG","2585","1.0","-1.0","0.0","-2876082.213240","-126449.196707","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2586","passing","EPSG","4326","EPSG","2586","1.0","-1.0","0.0","-3264104.452125","-130446.604869","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2587","passing","EPSG","4326","EPSG","2587","1.0","-1.0","0.0","-3665156.559151","-135092.255078","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2588","passing","EPSG","4326","EPSG","2588","1.0","-1.0","0.0","-4081340.703335","-140486.181429","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2589","passing","EPSG","4326","EPSG","2589","1.0","-1.0","0.0","-4515098.886943","-146754.957354","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2590","passing","EPSG","4326","EPSG","2590","1.0","-1.0","0.0","-4969305.217962","-154060.405066","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2591","passing","EPSG","4326","EPSG","2591","1.0","-1.0","0.0","-5447389.668237","-162612.103155","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2592","passing","EPSG","4326","EPSG","2592","1.0","-1.0","0.0","-5953507.559286","-172685.770091","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2593","passing","EPSG","4326","EPSG","2593","1.0","-1.0","0.0","-6492777.145055","-184651.024975","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2594","passing","EPSG","4326","EPSG","2594","1.0","-1.0","0.0","-7071621.617834","-199014.660104","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2595","passing","EPSG","4326","EPSG","2595","1.0","-1.0","0.0","-7698276.864500","-216490.677016","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2596","passing","EPSG","4326","EPSG","2596","1.0","-1.0","0.0","-8383573.378286","-238118.882807","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2597","passing","EPSG","4326","EPSG","2597","1.0","-1.0","0.0","-9142194.885103","-265477.181583","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2598","passing","EPSG","4326","EPSG","2598","1.0","-1.0","0.0","-9994819.069755","-301089.152495","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2599","passing","EPSG","4326","EPSG","2599","1.0","-1.0","0.0","-10972026.000103","-349281.719121","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2600","passing","EPSG","4326","EPSG","2600","1.0","-1.0","0.0","-2131567.745462","-120170.405454","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2601","passing","EPSG","4326","EPSG","2601","1.0","-1.0","0.0","-12122148.359192","-418233.840425","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2602","passing","EPSG","4326","EPSG","2602","1.0","-1.0","0.0","-13529358.930496","-525897.864005","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2603","passing","EPSG","4326","EPSG","2603","1.0","-1.0","0.0","-15365495.887991","-723872.049499","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2604","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2604","1.0","-1.0","0.0","-1.4742774424703E7","-493923.151171","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2605","passing","EPSG","4326","EPSG","2605","1.0","-1.0","0.0","-8890896.823237","-13454506.333789","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2606","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2606","1.0","-1.0","0.0","-1.7536558070635E7","-646541.731725","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2641","passing","EPSG","4326","EPSG","2641","1.0","-1.0","0.0","5227107.025692","-117636.520838","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2642","passing","EPSG","4326","EPSG","2642","1.0","-1.0","0.0","5867999.035810","-120107.237154","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2643","passing","EPSG","4326","EPSG","2643","1.0","-1.0","0.0","6500754.923419","-123031.573310","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2644","passing","EPSG","4326","EPSG","2644","1.0","-1.0","0.0","7123930.451116","-126460.718477","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2645","passing","EPSG","4326","EPSG","2645","1.0","-1.0","0.0","7735908.627245","-130458.474623","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2646","passing","EPSG","4326","EPSG","2646","1.0","-1.0","0.0","8334857.002228","-135104.529525","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2647","passing","EPSG","4326","EPSG","2647","1.0","-1.0","0.0","8918673.417661","-140498.925711","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2648","passing","EPSG","4326","EPSG","2648","1.0","-1.0","0.0","9484915.884736","-146768.247241","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2649","passing","EPSG","4326","EPSG","2649","1.0","-1.0","0.0","10030710.312731","-154074.329852","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2650","passing","EPSG","4326","EPSG","2650","1.0","-1.0","0.0","10552626.752238","-162626.769544","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2651","passing","EPSG","4326","EPSG","2651","1.0","-1.0","0.0","11046509.911393","-172701.307523","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2652","passing","EPSG","4326","EPSG","2652","1.0","-1.0","0.0","11507241.576211","-184667.593098","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2653","passing","EPSG","4326","EPSG","2653","1.0","-1.0","0.0","11928398.609535","-199032.459545","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2654","passing","EPSG","4326","EPSG","2654","1.0","-1.0","0.0","12301745.202749","-216509.965368","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2655","passing","EPSG","4326","EPSG","2655","1.0","-1.0","0.0","12616450.977618","-238139.999242","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2656","passing","EPSG","4326","EPSG","2656","1.0","-1.0","0.0","12857832.384671","-265500.586418","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2657","passing","EPSG","4326","EPSG","2657","1.0","-1.0","0.0","13005212.025214","-301115.494208","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2658","passing","EPSG","4326","EPSG","2658","1.0","-1.0","0.0","13028010.330816","-349311.955595","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2659","passing","EPSG","4326","EPSG","2659","1.0","-1.0","0.0","12877895.585743","-418269.477200","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2660","passing","EPSG","4326","EPSG","2660","1.0","-1.0","0.0","12470697.206405","-525941.470414","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2661","passing","EPSG","4326","EPSG","2661","1.0","-1.0","0.0","11634583.710329","-723928.382214","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2662","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2662","1.0","-1.0","0.0","1.3257268872553E7","-493966.46816","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2663","passing","EPSG","4326","EPSG","2663","1.0","-1.0","0.0","20106366.241160","-13449395.681243","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2664","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2664","1.0","-1.0","0.0","1.246349549295E7","-646598.227329","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2699","passing","EPSG","4326","EPSG","2699","1.0","-1.0","0.0","-1772892.974308","-117636.520838","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2700","passing","EPSG","4326","EPSG","2700","1.0","-1.0","0.0","-2132000.964190","-120107.237154","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2701","passing","EPSG","4326","EPSG","2701","1.0","-1.0","0.0","-2499245.076581","-123031.573310","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2702","passing","EPSG","4326","EPSG","2702","1.0","-1.0","0.0","-2876069.548884","-126460.718477","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2703","passing","EPSG","4326","EPSG","2703","1.0","-1.0","0.0","-3264091.372755","-130458.474623","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2704","passing","EPSG","4326","EPSG","2704","1.0","-1.0","0.0","-3665142.997772","-135104.529525","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2705","passing","EPSG","4326","EPSG","2705","1.0","-1.0","0.0","-4081326.582339","-140498.925711","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2706","passing","EPSG","4326","EPSG","2706","1.0","-1.0","0.0","-4515084.115264","-146768.247241","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2707","passing","EPSG","4326","EPSG","2707","1.0","-1.0","0.0","-4969289.687269","-154074.329852","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2708","passing","EPSG","4326","EPSG","2708","1.0","-1.0","0.0","-5447373.247762","-162626.769544","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2709","passing","EPSG","4326","EPSG","2709","1.0","-1.0","0.0","-5953490.088607","-172701.307523","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2710","passing","EPSG","4326","EPSG","2710","1.0","-1.0","0.0","-6492758.423789","-184667.593098","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2711","passing","EPSG","4326","EPSG","2711","1.0","-1.0","0.0","-7071601.390465","-199032.459545","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2712","passing","EPSG","4326","EPSG","2712","1.0","-1.0","0.0","-7698254.797251","-216509.965368","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2713","passing","EPSG","4326","EPSG","2713","1.0","-1.0","0.0","-8383549.022382","-238139.999242","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2714","passing","EPSG","4326","EPSG","2714","1.0","-1.0","0.0","-9142167.615329","-265500.586418","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2715","passing","EPSG","4326","EPSG","2715","1.0","-1.0","0.0","-9994787.974786","-301115.494208","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2716","passing","EPSG","4326","EPSG","2716","1.0","-1.0","0.0","-10971989.669184","-349311.955595","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2717","passing","EPSG","4326","EPSG","2717","1.0","-1.0","0.0","-12122104.414257","-418269.477200","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2718","passing","EPSG","4326","EPSG","2718","1.0","-1.0","0.0","-13529302.793595","-525941.470414","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2719","passing","EPSG","4326","EPSG","2719","1.0","-1.0","0.0","-15365416.289671","-723928.382214","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2720","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2720","1.0","-1.0","0.0","-1.4742731127447E7","-493966.46816","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2721","passing","EPSG","4326","EPSG","2721","1.0","-1.0","0.0","-8893633.758840","-13449395.681243","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2722","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2722","1.0","-1.0","0.0","-1.753650450705E7","-646598.227329","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2736","passing","EPSG","4326","EPSG","2736","1.0","-1.0","0.0","-3262616.551242","9869767.115019","8.418301","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2737","passing","EPSG","4326","EPSG","2737","1.0","-1.0","0.0","-4079538.649943","9859742.728708","8.418301","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2759","passing","EPSG","4326","EPSG","2759","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2760","passing","EPSG","4326","EPSG","2760","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2759","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2759","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2760","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2760","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2764","passing","EPSG","4326","EPSG","2764","1.0","-1.0","0.0","1.1131856190038E7","1298569.855381","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2765","passing","EPSG","4326","EPSG","2765","1.0","-1.0","0.0","1.1100796271263E7","1659604.579459","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2766","passing","EPSG","4326","EPSG","2766","1.0","-1.0","0.0","1.4254884235227E7","5989905.116896","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -924,15 +924,15 @@ "4326 -> 2773","passing","EPSG","4326","EPSG","2773","1.0","-1.0","0.0","1.2578707874327E7","3392714.933988","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2774","passing","EPSG","4326","EPSG","2774","1.0","-1.0","0.0","1.2588537408885E7","3293424.901576","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2775","passing","EPSG","4326","EPSG","2775","1.0","-1.0","0.0","9609648.833132","-675630.039935","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2776","passing","EPSG","4326","EPSG","2776","1.0","-1.0","0.0","1.2960400053583E7","-4584092.979322","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2777","passing","EPSG","4326","EPSG","2777","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2778","passing","EPSG","4326","EPSG","2778","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2776","passing","EPSG","4326","EPSG","2776","1.0","-1.0","0.0","13929727.098412","-4708319.149141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2777","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2777","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2778","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2778","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2779","passing","EPSG","4326","EPSG","2779","1.0","-1.0","0.0","1.0550650155667E7","427782.799905","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2780","passing","EPSG","4326","EPSG","2780","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2781","passing","EPSG","4326","EPSG","2781","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2790","passing","EPSG","4326","EPSG","2790","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2792","passing","EPSG","4326","EPSG","2792","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2793","passing","EPSG","4326","EPSG","2793","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2780","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2780","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2781","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2781","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2790","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2790","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2792","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2792","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2793","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2793","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2794","passing","EPSG","4326","EPSG","2794","1.0","-1.0","0.0","1.2493754958641E7","2708853.657912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2795","passing","EPSG","4326","EPSG","2795","1.0","-1.0","0.0","1.1460553625321E7","1661745.543903","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2796","passing","EPSG","4326","EPSG","2796","1.0","-1.0","0.0","1.1621497257386E7","2111191.990303","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -941,8 +941,8 @@ "4326 -> 2799","passing","EPSG","4326","EPSG","2799","1.0","-1.0","0.0","1.0772450358835E7","1132211.773774","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2800","passing","EPSG","4326","EPSG","2800","1.0","-1.0","0.0","1.1703735500459E7","1242402.341635","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2801","passing","EPSG","4326","EPSG","2801","1.0","-1.0","0.0","1.1569510967566E7","1074486.392019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2802","passing","EPSG","4326","EPSG","2802","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2803","passing","EPSG","4326","EPSG","2803","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2802","passing","EPSG","4326","EPSG","2802","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2803","passing","EPSG","4326","EPSG","2803","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2804","passing","EPSG","4326","EPSG","2804","1.0","-1.0","0.0","9969626.935369","-276195.787551","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2805","passing","EPSG","4326","EPSG","2805","1.0","-1.0","0.0","9421760.598902","-173719.119739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2806","passing","EPSG","4326","EPSG","2806","1.0","-1.0","0.0","9582487.179385","-1098419.84739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -952,14 +952,14 @@ "4326 -> 2810","passing","EPSG","4326","EPSG","2810","1.0","-1.0","0.0","1.190460508534E7","1937737.131019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2811","passing","EPSG","4326","EPSG","2811","1.0","-1.0","0.0","1.192601192142E7","2053668.621498","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2812","passing","EPSG","4326","EPSG","2812","1.0","-1.0","0.0","1.1867181831423E7","1975209.580327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2813","passing","EPSG","4326","EPSG","2813","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2813","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2813","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2818","passing","EPSG","4326","EPSG","2818","1.0","-1.0","0.0","1.2324918268659E7","4366651.863837","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2819","passing","EPSG","4326","EPSG","2819","1.0","-1.0","0.0","1.1859582682383E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2823","passing","EPSG","4326","EPSG","2823","1.0","-1.0","0.0","1.1862074088415E7","-5033721.498112","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2824","passing","EPSG","4326","EPSG","2824","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2828","passing","EPSG","4326","EPSG","2828","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2829","passing","EPSG","4326","EPSG","2829","1.0","-1.0","0.0","1.3411859131067E7","-4823650.932015","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2830","passing","EPSG","4326","EPSG","2830","1.0","-1.0","0.0","1.4237282921893E7","-4857039.255734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2823","passing","EPSG","4326","EPSG","2823","1.0","-1.0","0.0","12385210.049457","-5091569.861759","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2824","passing","EPSG","4326","EPSG","2824","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2828","passing","EPSG","4326","EPSG","2828","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2829","passing","EPSG","4326","EPSG","2829","1.0","-1.0","0.0","14594179.389600","-4984192.934623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2830","passing","EPSG","4326","EPSG","2830","1.0","-1.0","0.0","15922864.775165","-5116346.421875","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2831","passing","EPSG","4326","EPSG","2831","1.0","-1.0","0.0","9687036.766689","-681351.175466","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2832","passing","EPSG","4326","EPSG","2832","1.0","-1.0","0.0","1.2048562892627E7","2902217.376716","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2833","passing","EPSG","4326","EPSG","2833","1.0","-1.0","0.0","1.2034986427805E7","2850392.620023","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -969,7 +969,7 @@ "4326 -> 2837","passing","EPSG","4326","EPSG","2837","1.0","-1.0","0.0","1.1776028203115E7","1915864.208774","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2838","passing","EPSG","4326","EPSG","2838","1.0","-1.0","0.0","1.4480342629509E7","5714771.517124","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2839","passing","EPSG","4326","EPSG","2839","1.0","-1.0","0.0","1.3589771611216E7","5518383.696956","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2840","passing","EPSG","4326","EPSG","2840","1.0","-1.0","0.0","1.1612262480686E7","-4874528.079031","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2840","passing","EPSG","4326","EPSG","2840","1.0","-1.0","0.0","12121505.329748","-4930522.093156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2841","passing","EPSG","4326","EPSG","2841","1.0","-1.0","0.0","1.1994495041044E7","2695771.443861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2842","passing","EPSG","4326","EPSG","2842","1.0","-1.0","0.0","1.1997076072218E7","2676611.855038","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2843","passing","EPSG","4326","EPSG","2843","1.0","-1.0","0.0","1.0846782650395E7","691167.851636","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -981,7 +981,7 @@ "4326 -> 2849","passing","EPSG","4326","EPSG","2849","1.0","-1.0","0.0","1.2410564577759E7","5009447.87745","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2850","passing","EPSG","4326","EPSG","2850","1.0","-1.0","0.0","1.2444482006656E7","5956239.983326","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2851","passing","EPSG","4326","EPSG","2851","1.0","-1.0","0.0","1.2495636574632E7","6739176.857568","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2852","passing","EPSG","4326","EPSG","2852","1.0","-1.0","0.0","1.2316477845608E7","-5043906.115058","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2852","passing","EPSG","4326","EPSG","2852","1.0","-1.0","0.0","12915305.224043","-5112088.044691","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2853","passing","EPSG","4326","EPSG","2853","1.0","-1.0","0.0","1.319415649693E7","1855008.196457","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2854","passing","EPSG","4326","EPSG","2854","1.0","-1.0","0.0","1.3141710050315E7","871305.38436","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2855","passing","EPSG","4326","EPSG","2855","1.0","-1.0","0.0","1.2321126696733E7","5999733.6578","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1002,14 +1002,14 @@ "4326 -> 2877","passing","EPSG","4326","EPSG","2877","1.0","-1.0","0.0","4.1268644084037E7","1.1130932245931E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2878","passing","EPSG","4326","EPSG","2878","1.0","-1.0","0.0","4.1300893148666E7","1.0805178197923E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2879","passing","EPSG","4326","EPSG","2879","1.0","-1.0","0.0","3.152765621337E7","-2216629.556017","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2880","passing","EPSG","4326","EPSG","2880","1.0","-1.0","0.0","4.2520912509465E7","-1.5039645049659E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2881","passing","EPSG","4326","EPSG","2881","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2882","passing","EPSG","4326","EPSG","2882","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2880","passing","EPSG","4326","EPSG","2880","1.0","-1.0","0.0","45701112.989039","-15447210.408475","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2881","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2881","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2882","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2882","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2883","passing","EPSG","4326","EPSG","2883","1.0","-1.0","0.0","3.461492471905E7","1403484.069356","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2884","passing","EPSG","4326","EPSG","2884","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2885","passing","EPSG","4326","EPSG","2885","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2889","passing","EPSG","4326","EPSG","2889","1.0","-1.0","0.0","5.5710398969693E7","-1.4711272806654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2890","passing","EPSG","4326","EPSG","2890","1.0","-1.0","0.0","6.0600068996002E7","-1.4838521799231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2884","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2884","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2885","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2885","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2889","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2889","1.0","-1.0","0.0","5.5710398969693E7","-1.4711272806654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2890","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2890","1.0","-1.0","0.0","6.0600068996002E7","-1.4838521799231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2891","passing","EPSG","4326","EPSG","2891","1.0","-1.0","0.0","3.5059203444504E7","1569081.232317","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2892","passing","EPSG","4326","EPSG","2892","1.0","-1.0","0.0","3.5342614219278E7","3714598.128125","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2893","passing","EPSG","4326","EPSG","2893","1.0","-1.0","0.0","3.2708684370125E7","-906152.346323","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -1018,11 +1018,11 @@ "4326 -> 2896","passing","EPSG","4326","EPSG","2896","1.0","-1.0","0.0","6.1302193407869E7","3190586.781807","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2897","passing","EPSG","4326","EPSG","2897","1.0","-1.0","0.0","5.3954791524009E7","2049141.787235","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2898","passing","EPSG","4326","EPSG","2898","1.0","-1.0","0.0","4.7115923552287E7","1905110.937509","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2899","passing","EPSG","4326","EPSG","2899","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2899","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2899","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2901","passing","EPSG","4326","EPSG","2901","1.0","-1.0","0.0","4.0436083558584E7","1.432628564251E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2905","passing","EPSG","4326","EPSG","2905","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2906","passing","EPSG","4326","EPSG","2906","1.0","-1.0","0.0","4.4002074498844E7","-1.5825594766119E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2907","passing","EPSG","4326","EPSG","2907","1.0","-1.0","0.0","4.6710152386576E7","-1.5935136291522E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2905","passing","EPSG","4326","EPSG","2905","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2906","passing","EPSG","4326","EPSG","2906","1.0","-1.0","0.0","47881070.213714","-16352306.319676","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2907","passing","EPSG","4326","EPSG","2907","1.0","-1.0","0.0","52240265.516853","-16785879.885769","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2908","passing","EPSG","4326","EPSG","2908","1.0","-1.0","0.0","3.1781553125378E7","-2235399.648173","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2909","passing","EPSG","4326","EPSG","2909","1.0","-1.0","0.0","3.9529405815696E7","9521710.55353","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2910","passing","EPSG","4326","EPSG","2910","1.0","-1.0","0.0","3.9484863608277E7","9351681.824221","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -1047,27 +1047,27 @@ "4326 -> 2929","passing","EPSG","4326","EPSG","2929","1.0","-1.0","0.0","3.7505757277799E7","4256633.987564","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2930","passing","EPSG","4326","EPSG","2930","1.0","-1.0","0.0","3.7352641535162E7","4272404.775354","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2931","passing","EPSG","4326","EPSG","2931","1.0","-1.0","0.0","-844965.251976","-113208.317204","-1.323337","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2932","passing","EPSG","4326","EPSG","2932","1.0","-1.0","0.0","-6279343.054902","-2578002.862928","-149.795994","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2932","passing","EPSG","4326","EPSG","2932","1.0","-1.0","0.0","-6291158.335660","-2578737.969225","-149.795994","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2933","passing","EPSG","4326","EPSG","2933","1.0","-1.0","0.0","-8873615.359214","-9738025.800346","1131.519487","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2934","passing","EPSG","4326","EPSG","2934","1.0","-1.0","0.0","1.9900711845179E7","789730.583153","1131.519487","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2935","passing","EPSG","4326","EPSG","2935","1.0","-1.0","0.0","-3644726.452498","-158536.993186","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2936","passing","EPSG","4326","EPSG","2936","1.0","-1.0","0.0","-3094048.773165","-165583.49037","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2937","passing","EPSG","4326","EPSG","2937","1.0","-1.0","0.0","-2565511.945788","-173761.331585","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2938","passing","EPSG","4326","EPSG","2938","1.0","-1.0","0.0","-2062367.431008","-183271.117477","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2939","passing","EPSG","4326","EPSG","2939","1.0","-1.0","0.0","-4102180.408572","-185916.275827","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2940","passing","EPSG","4326","EPSG","2940","1.0","-1.0","0.0","-3630572.782","-197135.417496","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2941","passing","EPSG","4326","EPSG","2941","1.0","-1.0","0.0","-3192658.16706","-210249.302644","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2935","passing","EPSG","4326","EPSG","2935","1.0","-1.0","0.0","-3646360.859963","-158616.866934","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2936","passing","EPSG","4326","EPSG","2936","1.0","-1.0","0.0","-3097176.858209","-165748.676362","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2937","passing","EPSG","4326","EPSG","2937","1.0","-1.0","0.0","-2571294.728755","-174090.343360","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2938","passing","EPSG","4326","EPSG","2938","1.0","-1.0","0.0","-2072743.414265","-183905.766193","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2939","passing","EPSG","4326","EPSG","2939","1.0","-1.0","0.0","-4113026.856873","-186583.398250","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2940","passing","EPSG","4326","EPSG","2940","1.0","-1.0","0.0","-3649507.044302","-198385.466761","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2941","passing","EPSG","4326","EPSG","2941","1.0","-1.0","0.0","-3225005.405022","-212540.194783","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2942","passing","EPSG","4326","EPSG","2942","1.0","-1.0","0.0","2304197.81116","-115338.726084","257.712819","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2943","passing","EPSG","4326","EPSG","2943","1.0","-1.0","0.0","2304072.938586","-115077.797964","41.151999","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2944","passing","EPSG","4326","EPSG","2944","1.0","-1.0","0.0","7939833.583325","-199185.555886","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2945","passing","EPSG","4326","EPSG","2945","1.0","-1.0","0.0","8550689.97567","-215180.26638","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2946","passing","EPSG","4326","EPSG","2946","1.0","-1.0","0.0","9207169.520513","-233982.521348","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2947","passing","EPSG","4326","EPSG","2947","1.0","-1.0","0.0","9915822.915933","-256133.699684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2948","passing","EPSG","4326","EPSG","2948","1.0","-1.0","0.0","1.0684098555407E7","-282279.21894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2949","passing","EPSG","4326","EPSG","2949","1.0","-1.0","0.0","1.1520450559131E7","-313185.711591","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2950","passing","EPSG","4326","EPSG","2950","1.0","-1.0","0.0","1.2434455937819E7","-349760.419421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2951","passing","EPSG","4326","EPSG","2951","1.0","-1.0","0.0","1.3436941307237E7","-393073.000181","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2952","passing","EPSG","4326","EPSG","2952","1.0","-1.0","0.0","1.4540119571761E7","-444379.949362","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2944","passing","EPSG","4326","EPSG","2944","1.0","-1.0","0.0","7976601.826127","-201836.910943","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2945","passing","EPSG","4326","EPSG","2945","1.0","-1.0","0.0","8612137.856451","-219935.732563","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2946","passing","EPSG","4326","EPSG","2946","1.0","-1.0","0.0","9308448.441537","-242408.173378","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2947","passing","EPSG","4326","EPSG","2947","1.0","-1.0","0.0","10081034.668108","-270955.239323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2948","passing","EPSG","4326","EPSG","2948","1.0","-1.0","0.0","10951884.807940","-308325.366944","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2949","passing","EPSG","4326","EPSG","2949","1.0","-1.0","0.0","11953832.248001","-359297.148725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2950","passing","EPSG","4326","EPSG","2950","1.0","-1.0","0.0","13139479.444974","-433089.111077","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2951","passing","EPSG","4326","EPSG","2951","1.0","-1.0","0.0","14602368.100993","-550624.402643","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2952","passing","EPSG","4326","EPSG","2952","1.0","-1.0","0.0","16540704.466247","-776353.629276","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2953","passing","EPSG","4326","EPSG","2953","1.0","-1.0","0.0","1.1911475970543E7","4580906.316255","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2954","passing","EPSG","4326","EPSG","2954","1.0","-1.0","0.0","9313611.418086","-2479552.602219","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2955","passing","EPSG","4326","EPSG","2955","1.0","-1.0","0.0","9380117.510219","-1.9757704843637E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1077,11 +1077,11 @@ "4326 -> 2960","passing","EPSG","4326","EPSG","2960","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2961","passing","EPSG","4326","EPSG","2961","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2962","passing","EPSG","4326","EPSG","2962","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2964","passing","EPSG","4326","EPSG","2964","1.0","-1.0","0.0","2.3309991432664E7","3.8057058222507E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2965","passing","EPSG","4326","EPSG","2965","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2966","passing","EPSG","4326","EPSG","2966","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2967","passing","EPSG","4326","EPSG","2967","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2968","passing","EPSG","4326","EPSG","2968","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2964","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","2964","1.0","-1.0","0.0","2.3309991432664E7","3.8057058222507E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2965","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2965","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2966","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2966","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2967","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2967","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2968","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","2968","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2969","passing","EPSG","4326","EPSG","2969","1.0","-1.0","0.0","9876397.190046","-254723.882194","-399.743672","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2970","passing","EPSG","4326","EPSG","2970","1.0","-1.0","0.0","9876972.606652","-255021.253096","210.936311","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2971","passing","EPSG","4326","EPSG","2971","1.0","-1.0","0.0","7306251.382692","-180679.977369","-67.117376","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1100,7 +1100,7 @@ "4326 -> 2987","passing","EPSG","4326","EPSG","2987","1.0","-1.0","0.0","8479842.523962118","-211066.5407926866","-100.373882","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2988","passing","EPSG","4326","EPSG","2988","1.0","-1.0","0.0","722434.134876","-9886095.136093","-503.805708","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2989","passing","EPSG","4326","EPSG","2989","1.0","-1.0","0.0","9876408.370887","-255706.192514","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 2990","passing","EPSG","4326","EPSG","2990","1.0","-1.0","0.0","-7206044.688947","2308192.870905","-350.230773","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 2990","passing","EPSG","4326","EPSG","2990","1.0","-1.0","0.0","-7232048.036772","2306422.714975","-350.230773","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2991","passing","EPSG","4326","EPSG","2991","1.0","-1.0","0.0","1.2428695502962E7","5736547.563465","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 2992","passing","EPSG","4326","EPSG","2992","1.0","-1.0","0.0","4.0776560049083E7","1.8820694105857E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 2993","passing","EPSG","4326","EPSG","2993","1.0","-1.0","0.0","1.2428695502962E7","5736547.563465","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1114,33 +1114,33 @@ "4326 -> 3001","passing","EPSG","4326","EPSG","3001","1.0","-1.0","0.0","-8196705.156102","789820.842694","1103.991405","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3002","passing","EPSG","4326","EPSG","3002","1.0","-1.0","0.0","-8196548.068024","789629.424703","1320.943549","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3003","passing","EPSG","4326","EPSG","3003","1.0","-1.0","0.0","607000.706445","-111707.722932","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3004","passing","EPSG","4326","EPSG","3004","1.0","-1.0","0.0","946515.812053","-114022.912099","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3004","passing","EPSG","4326","EPSG","3004","1.0","-1.0","0.0","946515.554245","-114022.916716","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3005","passing","EPSG","4326","EPSG","3005","1.0","-1.0","0.0","1.0954441469536E7","7888694.850647","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3006","passing","EPSG","4326","EPSG","3006","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3007","passing","EPSG","4326","EPSG","3007","1.0","-1.0","0.0","-1081967.65415","-112657.885597","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3008","passing","EPSG","4326","EPSG","3008","1.0","-1.0","0.0","-1252522.815483","-113277.274139","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3009","passing","EPSG","4326","EPSG","3009","1.0","-1.0","0.0","-1424077.256672","-113982.625197","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3010","passing","EPSG","4326","EPSG","3010","1.0","-1.0","0.0","-1596762.562957","-114776.551708","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3011","passing","EPSG","4326","EPSG","3011","1.0","-1.0","0.0","-1770714.490165","-115662.040423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3012","passing","EPSG","4326","EPSG","3012","1.0","-1.0","0.0","-1338166.993449","-113619.049509","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3013","passing","EPSG","4326","EPSG","3013","1.0","-1.0","0.0","-1510270.171064","-114368.338914","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3014","passing","EPSG","4326","EPSG","3014","1.0","-1.0","0.0","-1683571.536271","-115207.648789","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3015","passing","EPSG","4326","EPSG","3015","1.0","-1.0","0.0","-1858209.137234","-116140.162883","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3016","passing","EPSG","4326","EPSG","3016","1.0","-1.0","0.0","-2034326.041478","-117169.481617","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3017","passing","EPSG","4326","EPSG","3017","1.0","-1.0","0.0","-2212070.945308","-118299.655886","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3018","passing","EPSG","4326","EPSG","3018","1.0","-1.0","0.0","-2391598.821908","-119535.225511","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3008","passing","EPSG","4326","EPSG","3008","1.0","-1.0","0.0","-1252522.927306","-113277.275955","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3009","passing","EPSG","4326","EPSG","3009","1.0","-1.0","0.0","-1424077.513711","-113982.629795","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3010","passing","EPSG","4326","EPSG","3010","1.0","-1.0","0.0","-1596763.115252","-114776.562495","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3011","passing","EPSG","4326","EPSG","3011","1.0","-1.0","0.0","-1770715.611551","-115662.064177","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3012","passing","EPSG","4326","EPSG","3012","1.0","-1.0","0.0","-1338167.164560","-113619.052429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3013","passing","EPSG","4326","EPSG","3013","1.0","-1.0","0.0","-1510270.550748","-114368.346018","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3014","passing","EPSG","4326","EPSG","3014","1.0","-1.0","0.0","-1683572.328388","-115207.664914","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3015","passing","EPSG","4326","EPSG","3015","1.0","-1.0","0.0","-1858210.705750","-116140.197409","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3016","passing","EPSG","4326","EPSG","3016","1.0","-1.0","0.0","-2034329.011169","-117169.551923","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3017","passing","EPSG","4326","EPSG","3017","1.0","-1.0","0.0","-2212076.352748","-118299.792953","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3018","passing","EPSG","4326","EPSG","3018","1.0","-1.0","0.0","-2391608.336377","-119535.482706","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3019","passing","EPSG","4326","EPSG","3019","1.0","-1.0","0.0","346704.577358","-112939.360393","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3020","passing","EPSG","4326","EPSG","3020","1.0","-1.0","0.0","91185.341497","-113846.009196","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3021","passing","EPSG","4326","EPSG","3021","1.0","-1.0","0.0","-166593.824591","-114947.287526","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3022","passing","EPSG","4326","EPSG","3022","1.0","-1.0","0.0","-427081.100139","-116252.424873","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3023","passing","EPSG","4326","EPSG","3023","1.0","-1.0","0.0","-690747.305397","-117772.629179","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3024","passing","EPSG","4326","EPSG","3024","1.0","-1.0","0.0","-958090.341078","-119521.322114","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3020","passing","EPSG","4326","EPSG","3020","1.0","-1.0","0.0","91185.226276","-113846.011084","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3021","passing","EPSG","4326","EPSG","3021","1.0","-1.0","0.0","-166594.214399","-114947.294877","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3022","passing","EPSG","4326","EPSG","3022","1.0","-1.0","0.0","-427082.248251","-116252.449380","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3023","passing","EPSG","4326","EPSG","3023","1.0","-1.0","0.0","-690750.339213","-117772.701535","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3024","passing","EPSG","4326","EPSG","3024","1.0","-1.0","0.0","-958097.685180","-119521.515827","335.681331","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3025","passing","EPSG","4326","EPSG","3025","1.0","-1.0","0.0","346516.314724","-112389.766401","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3026","passing","EPSG","4326","EPSG","3026","1.0","-1.0","0.0","90995.171151","-113292.139334","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3027","passing","EPSG","4326","EPSG","3027","1.0","-1.0","0.0","-166786.241696","-114388.200176","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3028","passing","EPSG","4326","EPSG","3028","1.0","-1.0","0.0","-427276.122156","-115687.134881","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3029","passing","EPSG","4326","EPSG","3029","1.0","-1.0","0.0","-690945.313151","-117200.098387","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3030","passing","EPSG","4326","EPSG","3030","1.0","-1.0","0.0","-958291.742032","-118940.44878","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3026","passing","EPSG","4326","EPSG","3026","1.0","-1.0","0.0","90995.055815","-113292.141215","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3027","passing","EPSG","4326","EPSG","3027","1.0","-1.0","0.0","-166786.631850","-114388.207499","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3028","passing","EPSG","4326","EPSG","3028","1.0","-1.0","0.0","-427277.271183","-115687.159290","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3029","passing","EPSG","4326","EPSG","3029","1.0","-1.0","0.0","-690948.349174","-117200.170447","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3030","passing","EPSG","4326","EPSG","3030","1.0","-1.0","0.0","-958299.091057","-118940.641688","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3031","passing","EPSG","4326","EPSG","3031","1.0","-1.0","0.0","212130.970841","1.2152975180149E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3032","passing","EPSG","4326","EPSG","3032","1.0","-1.0","0.0","-5347508.03233","1.0355900220887E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3033","passing","EPSG","4326","EPSG","3033","1.0","-1.0","0.0","-4633172.22109","6276793.324538","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1167,25 +1167,25 @@ "4326 -> 3056","passing","EPSG","4326","EPSG","3056","1.0","-1.0","0.0","2303899.745469","-114932.181307","-180.262485","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3057","passing","EPSG","4326","EPSG","3057","1.0","-1.0","0.0","4171439.777959","-7733055.058238","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3058","passing","EPSG","4326","EPSG","3058","1.0","-1.0","0.0","1112400.244207","-7912590.712143","-1359.268946","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3059","passing","EPSG","4326","EPSG","3059","1.0","-1.0","0.0","-2131028.856678","-6120146.01892","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3059","passing","EPSG","4326","EPSG","3059","1.0","-1.0","0.0","-2131041.326629","-6120146.366566","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3060","passing","EPSG","4326","EPSG","3060","1.0","-1.0","0.0","-1304310.336203","-9881249.539094","-228.140701","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3061","passing","EPSG","4326","EPSG","3061","1.0","-1.0","0.0","2304196.123507","-115337.320798","261.52399","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3062","passing","EPSG","4326","EPSG","3062","1.0","-1.0","0.0","3748058.512896","-125361.544371","-47.89594","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3063","passing","EPSG","4326","EPSG","3063","1.0","-1.0","0.0","3748031.747101","-125257.743556","-148.340665","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3064","passing","EPSG","4326","EPSG","3064","1.0","-1.0","0.0","-392989.214538","-111623.606591","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3065","passing","EPSG","4326","EPSG","3065","1.0","-1.0","0.0","-1073447.882705","-113937.036746","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3066","passing","EPSG","4326","EPSG","3066","1.0","-1.0","0.0","-3800795.020141","-3136715.48826","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3066","passing","EPSG","4326","EPSG","3066","1.0","-1.0","0.0","-3801362.094746","-3136739.956734","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3067","passing","EPSG","4326","EPSG","3067","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3068","passing","EPSG","4326","EPSG","3068","1.0","-1.0","0.0","-1365260.599756","-5913085.86404","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3072","passing","EPSG","4326","EPSG","3072","1.0","-1.0","0.0","1.1180772997795E7","-5141094.694271","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3073","passing","EPSG","4326","EPSG","3073","1.0","-1.0","0.0","1.1324154703457E7","-5061023.391585","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3074","passing","EPSG","4326","EPSG","3074","1.0","-1.0","0.0","1.1480217073422E7","-5055926.342392","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3075","passing","EPSG","4326","EPSG","3075","1.0","-1.0","0.0","1.1180772997795E7","-5141094.694271","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3076","passing","EPSG","4326","EPSG","3076","1.0","-1.0","0.0","1.1324154703457E7","-5061023.391585","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3077","passing","EPSG","4326","EPSG","3077","1.0","-1.0","0.0","1.1480217073422E7","-5055926.342392","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3068","passing","EPSG","4326","EPSG","3068","1.0","-1.0","0.0","-1365260.463228","-5913085.864039","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3072","passing","EPSG","4326","EPSG","3072","1.0","-1.0","0.0","11465183.093366","-5169053.574542","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3073","passing","EPSG","4326","EPSG","3073","1.0","-1.0","0.0","11671689.678538","-5096459.957158","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3074","passing","EPSG","4326","EPSG","3074","1.0","-1.0","0.0","11905005.691833","-5100943.641776","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3075","passing","EPSG","4326","EPSG","3075","1.0","-1.0","0.0","11465183.093366","-5169053.574542","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3076","passing","EPSG","4326","EPSG","3076","1.0","-1.0","0.0","11671689.678538","-5096459.957158","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3077","passing","EPSG","4326","EPSG","3077","1.0","-1.0","0.0","11905005.691833","-5100943.641776","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3078","passing","EPSG","4326","EPSG","3078","1.0","-1.0","0.0","1.2974290765671E7","-4688338.053865","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3079","passing","EPSG","4326","EPSG","3079","1.0","-1.0","0.0","1.2974290765671E7","-4688338.053865","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3080","passing","EPSG","4326","EPSG","3080","1.0","-1.0","0.0","4.0028525540754E7","8920533.352447","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3080","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3080","1.0","-1.0","0.0","4.0028525540754E7","8920533.352447","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3081","passing","EPSG","4326","EPSG","3081","1.0","-1.0","0.0","1.2286290519846E7","2804360.15363","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3082","passing","EPSG","4326","EPSG","3082","1.0","-1.0","0.0","1.2786551384996E7","8286577.51252","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3083","passing","EPSG","4326","EPSG","3083","1.0","-1.0","0.0","1.2532010751485E7","9447989.246788","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1211,43 +1211,43 @@ "4326 -> 3103","passing","EPSG","4326","EPSG","3103","1.0","-1.0","0.0","2303912.2838","-115005.28615","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3104","passing","EPSG","4326","EPSG","3104","1.0","-1.0","0.0","1618328.893064","-112236.508712","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3105","passing","EPSG","4326","EPSG","3105","1.0","-1.0","0.0","945404.562756","-110791.642237","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3106","passing","EPSG","4326","EPSG","3106","1.0","-1.0","0.0","-1.7529831967062E7","-648424.255046","568.748383","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3106","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3106","1.0","-1.0","0.0","-1.7529831967062E7","-648424.255046","568.748383","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3107","passing","EPSG","4326","EPSG","3107","1.0","-1.0","0.0","-1.2026827635186E7","-3715356.006211","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3108","passing","EPSG","4326","EPSG","3108","1.0","-1.0","0.0","427509.877329","-5545990.703908","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3109","passing","EPSG","4326","EPSG","3109","1.0","-1.0","0.0","389109.080568","-5495390.959162","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3110","passing","EPSG","4326","EPSG","3110","1.0","-1.0","0.0","-1.0194328543259E7","-3233066.336786","99.926015","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3111","passing","EPSG","4326","EPSG","3111","1.0","-1.0","0.0","-1.0194432314248E7","-5233080.060971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3112","passing","EPSG","4326","EPSG","3112","1.0","-1.0","0.0","-1.3299840044712E7","-7898676.200665","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3114","passing","EPSG","4326","EPSG","3114","1.0","-1.0","0.0","1.5461813475518E7","36428.317427","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3115","passing","EPSG","4326","EPSG","3115","1.0","-1.0","0.0","1.4337611326142E7","89441.190405","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3116","passing","EPSG","4326","EPSG","3116","1.0","-1.0","0.0","1.3316634685515E7","134193.309447","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3117","passing","EPSG","4326","EPSG","3117","1.0","-1.0","0.0","1.2386385982502E7","171980.302929","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3118","passing","EPSG","4326","EPSG","3118","1.0","-1.0","0.0","1.1535781567243E7","203905.923288","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3114","passing","EPSG","4326","EPSG","3114","1.0","-1.0","0.0","17699809.426196","-357086.193382","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3115","passing","EPSG","4326","EPSG","3115","1.0","-1.0","0.0","15625825.901166","-90308.183733","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3116","passing","EPSG","4326","EPSG","3116","1.0","-1.0","0.0","14092045.528655","40419.551606","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3117","passing","EPSG","4326","EPSG","3117","1.0","-1.0","0.0","12862060.759613","120410.253742","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3118","passing","EPSG","4326","EPSG","3118","1.0","-1.0","0.0","11829585.128124","174855.501212","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3119","passing","EPSG","4326","EPSG","3119","1.0","-1.0","0.0","-61090.418752","888078.471206","-43.414236","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3120","passing","EPSG","4326","EPSG","3120","1.0","-1.0","0.0","1872060.582589","-442789.471158","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3126","passing","EPSG","4326","EPSG","3126","1.0","-1.0","0.0","-1537455.282542","-116304.889832","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3127","passing","EPSG","4326","EPSG","3127","1.0","-1.0","0.0","-1654864.258411","-116991.03987","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3128","passing","EPSG","4326","EPSG","3128","1.0","-1.0","0.0","-1772985.462609","-117721.690014","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3129","passing","EPSG","4326","EPSG","3129","1.0","-1.0","0.0","-1891864.157199","-118498.134892","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3130","passing","EPSG","4326","EPSG","3130","1.0","-1.0","0.0","-2011546.910403","-119321.76978","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3131","passing","EPSG","4326","EPSG","3131","1.0","-1.0","0.0","-2132081.689353","-120194.096558","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3132","passing","EPSG","4326","EPSG","3132","1.0","-1.0","0.0","-2253517.956868","-121116.730153","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3133","passing","EPSG","4326","EPSG","3133","1.0","-1.0","0.0","-2375906.772431","-122091.405505","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3134","passing","EPSG","4326","EPSG","3134","1.0","-1.0","0.0","-2499300.897575","-123119.985081","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3135","passing","EPSG","4326","EPSG","3135","1.0","-1.0","0.0","-2623754.905846","-124204.466965","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3136","passing","EPSG","4326","EPSG","3136","1.0","-1.0","0.0","-2749325.297564","-125346.993562","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3137","passing","EPSG","4326","EPSG","3137","1.0","-1.0","0.0","-2876070.619546","-126549.860952","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3138","passing","EPSG","4326","EPSG","3138","1.0","-1.0","0.0","-3004051.589992","-127815.528912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3140","passing","EPSG","4326","EPSG","3140","1.0","-1.0","0.0","-1.9619171831241924E7","-637586.283225383","-1364.089388","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3126","passing","EPSG","4326","EPSG","3126","1.0","-1.0","0.0","-1537457.032267","-116304.928830","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3127","passing","EPSG","4326","EPSG","3127","1.0","-1.0","0.0","-1654866.936011","-116991.102518","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3128","passing","EPSG","4326","EPSG","3128","1.0","-1.0","0.0","-1772989.488214","-117721.788681","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3129","passing","EPSG","4326","EPSG","3129","1.0","-1.0","0.0","-1891870.112103","-118498.287502","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3130","passing","EPSG","4326","EPSG","3130","1.0","-1.0","0.0","-2011555.588889","-119322.001934","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3131","passing","EPSG","4326","EPSG","3131","1.0","-1.0","0.0","-2132094.164295","-120194.444343","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3132","passing","EPSG","4326","EPSG","3132","1.0","-1.0","0.0","-2253535.662092","-121117.243828","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3133","passing","EPSG","4326","EPSG","3133","1.0","-1.0","0.0","-2375931.605348","-122092.154283","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3134","passing","EPSG","4326","EPSG","3134","1.0","-1.0","0.0","-2499335.346168","-123121.063287","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3135","passing","EPSG","4326","EPSG","3135","1.0","-1.0","0.0","-2623802.204810","-124206.001913","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3136","passing","EPSG","4326","EPSG","3136","1.0","-1.0","0.0","-2749389.619142","-125349.155547","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3137","passing","EPSG","4326","EPSG","3137","1.0","-1.0","0.0","-2876157.305504","-126552.875849","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3138","passing","EPSG","4326","EPSG","3138","1.0","-1.0","0.0","-3004167.432204","-127819.693982","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3140","passing","EPSG","4326","EPSG","3140","1.0","-1.0","0.0","-97161737.620276","-3169421.991695","-1364.089388","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3141","passing","EPSG","4326","EPSG","3141","1.0","-1.0","0.0","54966.605979","-9885958.68089","-526.005956","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3142","passing","EPSG","4326","EPSG","3142","1.0","-1.0","0.0","722950.968431","-9886161.510276","-526.005956","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3146","passing","EPSG","4326","EPSG","3146","1.0","-1.0","0.0","4579374.166561","-115567.820871","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3147","passing","EPSG","4326","EPSG","3147","1.0","-1.0","0.0","-1420625.833439","-115567.820871","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3146","passing","EPSG","4326","EPSG","3146","1.0","-1.0","0.0","4579373.045789","-115567.844591","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3147","passing","EPSG","4326","EPSG","3147","1.0","-1.0","0.0","-1420626.954211","-115567.844591","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3148","passing","EPSG","4326","EPSG","3148","1.0","-1.0","0.0","-1.3011590728014E7","-1.950874301949E7","652.886857","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3149","passing","EPSG","4326","EPSG","3149","1.0","-1.0","0.0","-1.0620884199265E7","-1.9661226637366E7","652.886857","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3150","passing","EPSG","4326","EPSG","3150","1.0","-1.0","0.0","4579385.695259","-115578.401542","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3151","passing","EPSG","4326","EPSG","3151","1.0","-1.0","0.0","-1420614.304741","-115578.401542","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3152","passing","EPSG","4326","EPSG","3152","1.0","-1.0","0.0","-1827254.246972","-6616312.15012","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3150","passing","EPSG","4326","EPSG","3150","1.0","-1.0","0.0","4579384.574539","-115578.425263","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3151","passing","EPSG","4326","EPSG","3151","1.0","-1.0","0.0","-1420615.425461","-115578.425263","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3152","passing","EPSG","4326","EPSG","3152","1.0","-1.0","0.0","-1827255.398204","-6616312.174581","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3153","passing","EPSG","4326","EPSG","3153","1.0","-1.0","0.0","1.0954441469536E7","7888694.850647","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3154","passing","EPSG","4326","EPSG","3154","1.0","-1.0","0.0","5079577.277109","-1.9855384152114E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3155","passing","EPSG","4326","EPSG","3155","1.0","-1.0","0.0","5967185.609991","-1.9841803628716E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1269,7 +1269,7 @@ "4326 -> 3172","passing","EPSG","4326","EPSG","3172","1.0","-1.0","0.0","-618177.790064","-9884456.438511","-543.926502","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3174","passing","EPSG","4326","EPSG","3174","1.0","-1.0","0.0","1.0666484178778E7","1886187.044221","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3175","passing","EPSG","4326","EPSG","3175","1.0","-1.0","0.0","1.0584630186397E7","1741605.538663","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3177","passing","EPSG","4326","EPSG","3177","1.0","-1.0","0.0","-798244.215032","-114656.316772","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3177","passing","EPSG","4326","EPSG","3177","1.0","-1.0","0.0","-798244.917875","-114656.330890","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3178","passing","EPSG","4326","EPSG","3178","1.0","-1.0","0.0","1.4018825808604E7","-484015.283423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3179","passing","EPSG","4326","EPSG","3179","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3180","passing","EPSG","4326","EPSG","3180","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1285,12 +1285,12 @@ "4326 -> 3190","passing","EPSG","4326","EPSG","3190","1.0","-1.0","0.0","-693229.861038","-111660.575057","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3191","passing","EPSG","4326","EPSG","3191","1.0","-1.0","0.0","-918636.451459","-112283.794692","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3192","passing","EPSG","4326","EPSG","3192","1.0","-1.0","0.0","-1145443.822283","-113053.488478","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3193","passing","EPSG","4326","EPSG","3193","1.0","-1.0","0.0","-1373951.486587","-113974.628182","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3194","passing","EPSG","4326","EPSG","3194","1.0","-1.0","0.0","-1604469.947638","-115053.270403","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3195","passing","EPSG","4326","EPSG","3195","1.0","-1.0","0.0","-1837322.902009","-116296.654693","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3196","passing","EPSG","4326","EPSG","3196","1.0","-1.0","0.0","-2072849.614073","-117713.32271","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3197","passing","EPSG","4326","EPSG","3197","1.0","-1.0","0.0","-2311407.486339","-119313.260944","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3198","passing","EPSG","4326","EPSG","3198","1.0","-1.0","0.0","-2553374.850144","-121108.06991","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3193","passing","EPSG","4326","EPSG","3193","1.0","-1.0","0.0","-1373951.744386","-113974.632794","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3194","passing","EPSG","4326","EPSG","3194","1.0","-1.0","0.0","-1604470.652914","-115053.284570","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3195","passing","EPSG","4326","EPSG","3195","1.0","-1.0","0.0","-1837324.655728","-116296.693789","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3196","passing","EPSG","4326","EPSG","3196","1.0","-1.0","0.0","-2072853.647789","-117713.421594","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3197","passing","EPSG","4326","EPSG","3197","1.0","-1.0","0.0","-2311416.180317","-119313.493552","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3198","passing","EPSG","4326","EPSG","3198","1.0","-1.0","0.0","-2553392.583479","-121108.584480","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3199","passing","EPSG","4326","EPSG","3199","1.0","-1.0","0.0","-392917.220112","-111621.491959","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3200","passing","EPSG","4326","EPSG","3200","1.0","-1.0","0.0","-4082761.828967","-1578178.241073","139.210065","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3201","passing","EPSG","4326","EPSG","3201","1.0","-1.0","0.0","-1073400.83373","-113934.739678","-40.756682","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1400,53 +1400,53 @@ "4326 -> 3306","passing","EPSG","4326","EPSG","3306","1.0","-1.0","0.0","3498349.191282","-9873465.961376","-469.041862","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3307","passing","EPSG","4326","EPSG","3307","1.0","-1.0","0.0","-5950996.657384","-172761.401376","0.014485","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3308","passing","EPSG","4326","EPSG","3308","1.0","-1.0","0.0","-3976546.793528","-2903017.803261","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3309","passing","EPSG","4326","EPSG","3309","1.0","-1.0","0.0","1.1872829921122E7","4710941.504265","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3309","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3309","1.0","-1.0","0.0","1.1872829921122E7","4710941.504265","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3310","passing","EPSG","4326","EPSG","3310","1.0","-1.0","0.0","1.1872810603164E7","4710919.607091","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3311","passing","EPSG","4326","EPSG","3311","1.0","-1.0","0.0","1.1872810603164E7","4710919.607091","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3312","passing","EPSG","4326","EPSG","3312","1.0","-1.0","0.0","8480313.034712","-210563.081955","-67.117376","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3313","passing","EPSG","4326","EPSG","3313","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3314","passing","EPSG","4326","EPSG","3314","1.0","-1.0","0.0","-2804750.582227","-207213.08153","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3315","passing","EPSG","4326","EPSG","3315","1.0","-1.0","0.0","-2875364.065092","873203.801076","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3316","passing","EPSG","4326","EPSG","3316","1.0","-1.0","0.0","-1891673.388109","9881523.678827","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3317","passing","EPSG","4326","EPSG","3317","1.0","-1.0","0.0","-2131873.253234","9879827.812046","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3315","passing","EPSG","4326","EPSG","3315","1.0","-1.0","0.0","-2875389.012545","873203.050139","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3316","passing","EPSG","4326","EPSG","3316","1.0","-1.0","0.0","-1891679.394772","9881523.524744","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3317","passing","EPSG","4326","EPSG","3317","1.0","-1.0","0.0","-2131885.825069","9879827.461252","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3318","passing","EPSG","4326","EPSG","3318","1.0","-1.0","0.0","-731866.989627","9887363.53525","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3319","passing","EPSG","4326","EPSG","3319","1.0","-1.0","0.0","-959471.327572","9886518.765923","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3320","passing","EPSG","4326","EPSG","3320","1.0","-1.0","0.0","-1188929.879708","9885519.664619","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3321","passing","EPSG","4326","EPSG","3321","1.0","-1.0","0.0","-1420559.475487","9884359.595402","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3322","passing","EPSG","4326","EPSG","3322","1.0","-1.0","0.0","-1654691.304895","9883030.682331","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3323","passing","EPSG","4326","EPSG","3323","1.0","-1.0","0.0","-1891673.388109","9881523.678827","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3324","passing","EPSG","4326","EPSG","3324","1.0","-1.0","0.0","-2131873.253234","9879827.812046","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3325","passing","EPSG","4326","EPSG","3325","1.0","-1.0","0.0","-2375680.846625","9877930.59922","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3326","passing","EPSG","4326","EPSG","3326","1.0","-1.0","0.0","-2623511.700253","9875817.632582","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3327","passing","EPSG","4326","EPSG","3327","1.0","-1.0","0.0","-2875810.380615","9873472.329127","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3319","passing","EPSG","4326","EPSG","3319","1.0","-1.0","0.0","-959471.478502","9886518.763385","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3320","passing","EPSG","4326","EPSG","3320","1.0","-1.0","0.0","-1188930.316010","9885519.656327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3321","passing","EPSG","4326","EPSG","3321","1.0","-1.0","0.0","-1420560.609246","9884359.571357","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3322","passing","EPSG","4326","EPSG","3322","1.0","-1.0","0.0","-1654694.008658","9883030.619006","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3323","passing","EPSG","4326","EPSG","3323","1.0","-1.0","0.0","-1891679.394772","9881523.524744","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3324","passing","EPSG","4326","EPSG","3324","1.0","-1.0","0.0","-2131885.825069","9879827.461252","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3325","passing","EPSG","4326","EPSG","3325","1.0","-1.0","0.0","-2375705.852686","9877929.844611","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3326","passing","EPSG","4326","EPSG","3326","1.0","-1.0","0.0","-2623559.296612","9875816.086822","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3327","passing","EPSG","4326","EPSG","3327","1.0","-1.0","0.0","-2875897.560311","9873469.294933","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3328","passing","EPSG","4326","EPSG","3328","1.0","-1.0","0.0","-2031436.197892","-5654801.182261","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3329","passing","EPSG","4326","EPSG","3329","1.0","-1.0","0.0","3926020.769368","-113907.423756","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3330","passing","EPSG","4326","EPSG","3330","1.0","-1.0","0.0","4579379.43813","-115585.604755","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3331","passing","EPSG","4326","EPSG","3331","1.0","-1.0","0.0","5227104.688216","-117643.760239","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3332","passing","EPSG","4326","EPSG","3332","1.0","-1.0","0.0","5868005.018599","-120114.388691","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3333","passing","EPSG","4326","EPSG","3333","1.0","-1.0","0.0","1926020.769368","-113907.423756","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3334","passing","EPSG","4326","EPSG","3334","1.0","-1.0","0.0","2227104.688216","-117643.760239","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3335","passing","EPSG","4326","EPSG","3335","1.0","-1.0","0.0","2500782.72258","-123038.185131","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3329","passing","EPSG","4326","EPSG","3329","1.0","-1.0","0.0","3926020.512501","-113907.428347","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3330","passing","EPSG","4326","EPSG","3330","1.0","-1.0","0.0","4579378.317382","-115585.628479","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3331","passing","EPSG","4326","EPSG","3331","1.0","-1.0","0.0","5227100.664595","-117643.858785","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3332","passing","EPSG","4326","EPSG","3332","1.0","-1.0","0.0","5867992.549060","-120114.736072","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3333","passing","EPSG","4326","EPSG","3333","1.0","-1.0","0.0","1926020.512501","-113907.428347","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3334","passing","EPSG","4326","EPSG","3334","1.0","-1.0","0.0","2227100.664595","-117643.858785","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3335","passing","EPSG","4326","EPSG","3335","1.0","-1.0","0.0","2500748.287266","-123039.262143","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3336","passing","EPSG","4326","EPSG","3336","1.0","-1.0","0.0","-9990877.774436","9698468.818475","-390.863651","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3337","passing","EPSG","4326","EPSG","3337","1.0","-1.0","0.0","-5516800.130784","2042551.964273","646.389694","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3338","passing","EPSG","4326","EPSG","3338","1.0","-1.0","0.0","7104914.414304","1.1599667194798E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3339","passing","EPSG","4326","EPSG","3339","1.0","-1.0","0.0","-731708.020565","9887525.200371","-32.35","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3340","passing","EPSG","4326","EPSG","3340","1.0","-1.0","0.0","-959311.270297","9886681.745298","-32.35","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3341","passing","EPSG","4326","EPSG","3341","1.0","-1.0","0.0","-1188768.52017","9885684.183161","-32.35","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3340","passing","EPSG","4326","EPSG","3340","1.0","-1.0","0.0","-959311.421110","9886681.742766","-32.35","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3341","passing","EPSG","4326","EPSG","3341","1.0","-1.0","0.0","-1188768.956170","9885684.174887","-32.35","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3342","passing","EPSG","4326","EPSG","3342","1.0","-1.0","0.0","-1073316.729204","9886236.752043","-32.35","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3343","passing","EPSG","4326","EPSG","3343","1.0","-1.0","0.0","2303877.831952","-115015.371832","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3344","passing","EPSG","4326","EPSG","3344","1.0","-1.0","0.0","1618308.573583","-112246.669259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3345","passing","EPSG","4326","EPSG","3345","1.0","-1.0","0.0","945396.683977","-110801.832543","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3346","passing","EPSG","4326","EPSG","3346","1.0","-1.0","0.0","-2131555.273016","-120170.057739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3346","passing","EPSG","4326","EPSG","3346","1.0","-1.0","0.0","-2131567.745462","-120170.405454","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3347","passing","EPSG","4326","EPSG","3347","1.0","-1.0","0.0","1.7546190024318E7","4821185.337535","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3348","passing","EPSG","4326","EPSG","3348","1.0","-1.0","0.0","1.7546190024318E7","4821185.337535","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3349","passing","EPSG","4326","EPSG","3349","1.0","-1.0","0.0","1.6809243109784E7","-110579.965222","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3350","passing","EPSG","4326","EPSG","3350","1.0","-1.0","0.0","-2135817.918614","-129419.162244","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3351","passing","EPSG","4326","EPSG","3351","1.0","-1.0","0.0","-1497343.823834","-132028.066478","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3352","passing","EPSG","4326","EPSG","3352","1.0","-1.0","0.0","-867429.173853","-135104.906278","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3350","passing","EPSG","4326","EPSG","3350","1.0","-1.0","0.0","-2135823.757550","-129419.311423","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3351","passing","EPSG","4326","EPSG","3351","1.0","-1.0","0.0","-1497361.219844","-132028.569751","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3352","passing","EPSG","4326","EPSG","3352","1.0","-1.0","0.0","-867475.723252","-135106.412890","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3353","passing","EPSG","4326","EPSG","3353","1.0","-1.0","0.0","-393024.444389","9888375.147817","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3354","passing","EPSG","4326","EPSG","3354","1.0","-1.0","0.0","-393024.444389","9888375.147817","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3355","passing","EPSG","4326","EPSG","3355","1.0","-1.0","0.0","-2889219.088867","-2637968.875663","81.270957","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3355","passing","EPSG","4326","EPSG","3355","1.0","-1.0","0.0","-2889334.960870","-2637973.041975","81.270957","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3358","passing","EPSG","4326","EPSG","3358","1.0","-1.0","0.0","1.0212602585283E7","-17652.610423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3359","passing","EPSG","4326","EPSG","3359","1.0","-1.0","0.0","3.3505913991095E7","-57915.388525","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3360","passing","EPSG","4326","EPSG","3360","1.0","-1.0","0.0","1.0339890150895E7","211156.727684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1455,29 +1455,29 @@ "4326 -> 3363","passing","EPSG","4326","EPSG","3363","1.0","-1.0","0.0","3.3966386502944E7","-702622.902526","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3364","passing","EPSG","4326","EPSG","3364","1.0","-1.0","0.0","1.0308283550952E7","-220512.975756","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3365","passing","EPSG","4326","EPSG","3365","1.0","-1.0","0.0","3.3819760283415E7","-723466.321292","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3366","passing","EPSG","4326","EPSG","3366","1.0","-1.0","0.0","-1.2558563688869E7","-3132655.317332","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3366","passing","EPSG","4326","EPSG","3366","1.0","-1.0","0.0","-12550723.926083","-3132655.317332","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3367","passing","EPSG","4326","EPSG","3367","1.0","-1.0","0.0","2303912.2838","-115005.28615","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3368","passing","EPSG","4326","EPSG","3368","1.0","-1.0","0.0","1618328.893064","-112236.508712","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3369","passing","EPSG","4326","EPSG","3369","1.0","-1.0","0.0","945404.562756","-110791.642237","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3370","passing","EPSG","4326","EPSG","3370","1.0","-1.0","0.0","-618321.188798","-1.988353494601E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3371","passing","EPSG","4326","EPSG","3371","1.0","-1.0","0.0","54598.437363","-1.9884979801411E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3370","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3370","1.0","-1.0","0.0","-618321.188798","-1.988353494601E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3371","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3371","1.0","-1.0","0.0","54598.437363","-1.9884979801411E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3372","passing","EPSG","4326","EPSG","3372","1.0","-1.0","0.0","-618308.573583","-1.9883683216619E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3373","passing","EPSG","4326","EPSG","3373","1.0","-1.0","0.0","54603.316023","-1.9885128053335E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3374","passing","EPSG","4326","EPSG","3374","1.0","-1.0","0.0","1618352.752826","-112247.940062","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3375","passing","EPSG","4326","EPSG","3375","1.0","-1.0","0.0","-1.2155003144452E7","6081703.416902","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3376","failing","EPSG","4326","EPSG","3376","1.0","-1.0","0.0","-1.2409058238151E7","-4357833.596094","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3377","passing","EPSG","4326","EPSG","3377","1.0","-1.0","0.0","-1.1415841233162E7","-752918.108915","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3378","passing","EPSG","4326","EPSG","3378","1.0","-1.0","0.0","-1.1235544208125E7","-809647.032818","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3379","passing","EPSG","4326","EPSG","3379","1.0","-1.0","0.0","-1.1290394712508E7","-924005.616355","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3380","passing","EPSG","4326","EPSG","3380","1.0","-1.0","0.0","-1.1208820519631E7","-852589.955809","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3381","passing","EPSG","4326","EPSG","3381","1.0","-1.0","0.0","-1.1341605904493E7","-1069407.513536","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3382","passing","EPSG","4326","EPSG","3382","1.0","-1.0","0.0","-1.1057670581759E7","-1088495.138159","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3383","passing","EPSG","4326","EPSG","3383","1.0","-1.0","0.0","-1.1090162156955E7","-1152101.093132","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3384","passing","EPSG","4326","EPSG","3384","1.0","-1.0","0.0","-1.1110100987491E7","-898528.707554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3385","passing","EPSG","4326","EPSG","3385","1.0","-1.0","0.0","-1.1261662905673E7","-1164471.611763","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3386","passing","EPSG","4326","EPSG","3386","1.0","-1.0","0.0","-1420665.38327","-115528.544055","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3387","passing","EPSG","4326","EPSG","3387","1.0","-1.0","0.0","1736011.201468","-130395.075894","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3388","failing","EPSG","4326","EPSG","3388","1.0","-1.0","0.0","-4142520.752562","-82233.758419","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3376","passing","EPSG","4326","EPSG","3376","1.0","-1.0","0.0","-1.2409058238151E7","-4357833.596094","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3377","passing","EPSG","4326","EPSG","3377","1.0","-1.0","0.0","-11411082.142794","-752918.108915","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3378","passing","EPSG","4326","EPSG","3378","1.0","-1.0","0.0","-11231113.235098","-809647.032818","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3379","passing","EPSG","4326","EPSG","3379","1.0","-1.0","0.0","-11285876.749887","-924005.616355","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3380","passing","EPSG","4326","EPSG","3380","1.0","-1.0","0.0","-11204516.593448","-852589.955809","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3381","passing","EPSG","4326","EPSG","3381","1.0","-1.0","0.0","-11336929.325475","-1069407.513536","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3382","passing","EPSG","4326","EPSG","3382","1.0","-1.0","0.0","-11053585.993436","-1088495.138159","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3383","passing","EPSG","4326","EPSG","3383","1.0","-1.0","0.0","-11086017.187380","-1152101.093132","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3384","passing","EPSG","4326","EPSG","3384","1.0","-1.0","0.0","-11105918.642758","-898528.707554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3385","passing","EPSG","4326","EPSG","3385","1.0","-1.0","0.0","-11257161.200343","-1164471.611763","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3386","passing","EPSG","4326","EPSG","3386","1.0","-1.0","0.0","-1420666.507386","-115528.567846","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3387","passing","EPSG","4326","EPSG","3387","1.0","-1.0","0.0","1735808.899892","-130402.822007","-165.167033","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3388","passing","EPSG","4326","EPSG","3388","1.0","-1.0","0.0","-4142520.752562","-82233.758419","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3391","passing","EPSG","4326","EPSG","3391","1.0","-1.0","0.0","-4079273.015666","-140882.641367","-172.547504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3392","passing","EPSG","4326","EPSG","3392","1.0","-1.0","0.0","-4966891.604922","-154496.951753","-172.547504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3393","passing","EPSG","4326","EPSG","3393","1.0","-1.0","0.0","-5950724.924159","-173178.469914","-172.547504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1486,11 +1486,11 @@ "4326 -> 3396","passing","EPSG","4326","EPSG","3396","1.0","-1.0","0.0","2606757.139676","-111657.546981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3397","passing","EPSG","4326","EPSG","3397","1.0","-1.0","0.0","3268175.410532","-112647.043075","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3398","passing","EPSG","4326","EPSG","3398","1.0","-1.0","0.0","3268175.410532","-112647.043075","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3399","passing","EPSG","4326","EPSG","3399","1.0","-1.0","0.0","3926105.663731","-113971.626991","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3399","passing","EPSG","4326","EPSG","3399","1.0","-1.0","0.0","3926105.407353","-113971.631576","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3404","passing","EPSG","4326","EPSG","3404","1.0","-1.0","0.0","3.3505846979267E7","-57915.272695","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3405","passing","EPSG","4326","EPSG","3405","1.0","-1.0","0.0","-1.301902128935E7","-1.9512399777286E7","188.974813","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3406","passing","EPSG","4326","EPSG","3406","1.0","-1.0","0.0","-1.0625788868978E7","-1.9664680833295E7","188.974813","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3407","passing","EPSG","4326","EPSG","3407","1.0","-1.0","0.0","-4.1203006439011E7","-1.027783275293E7","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3407","passing","EPSG","4326","EPSG","3407","1.0","-1.0","0.0","-41177285.201731","-10277832.752930","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3408","passing","EPSG","4326","EPSG","3408","1.0","-1.0","0.0","158617.286076","-9087178.233242","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3409","passing","EPSG","4326","EPSG","3409","1.0","-1.0","0.0","155872.772909","8929945.179252","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3410","passing","EPSG","4326","EPSG","3410","1.0","-1.0","0.0","96301.077465","-128394.917833","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1503,24 +1503,24 @@ "4326 -> 3418","passing","EPSG","4326","EPSG","3418","1.0","-1.0","0.0","3.760016635244E7","5451910.171954","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3419","passing","EPSG","4326","EPSG","3419","1.0","-1.0","0.0","3.812819558524E7","6926469.054852","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3420","passing","EPSG","4326","EPSG","3420","1.0","-1.0","0.0","3.8190467452588E7","8343603.509436","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3424","passing","EPSG","4326","EPSG","3424","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3424","passing","EPSG","4326","EPSG","3424","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3425","passing","EPSG","4326","EPSG","3425","1.0","-1.0","0.0","4.0989927726809E7","8887297.375966","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3426","passing","EPSG","4326","EPSG","3426","1.0","-1.0","0.0","3.760016635244E7","5451910.171954","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3427","passing","EPSG","4326","EPSG","3427","1.0","-1.0","0.0","3.812819558524E7","6926469.054852","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3428","passing","EPSG","4326","EPSG","3428","1.0","-1.0","0.0","3.8190467452588E7","8343603.509436","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3432","passing","EPSG","4326","EPSG","3432","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3432","passing","EPSG","4326","EPSG","3432","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3433","passing","EPSG","4326","EPSG","3433","1.0","-1.0","0.0","3.6521764850117E7","4260391.267194","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3434","passing","EPSG","4326","EPSG","3434","1.0","-1.0","0.0","3.6419862433268E7","5444886.024408","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3435","passing","EPSG","4326","EPSG","3435","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3437","passing","EPSG","4326","EPSG","3437","1.0","-1.0","0.0","3.8917488071742E7","-1.6514801281721E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3438","passing","EPSG","4326","EPSG","3438","1.0","-1.0","0.0","3.8097897822019E7","-1.5992514205953E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3435","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3435","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3437","passing","EPSG","4326","EPSG","3437","1.0","-1.0","0.0","40633809.970593","-16704592.121454","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3438","passing","EPSG","4326","EPSG","3438","1.0","-1.0","0.0","39768638.735981","-16176221.233964","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3439","passing","EPSG","4326","EPSG","3439","1.0","-1.0","0.0","-5951307.244793","-173135.917605","-31.060822","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3440","passing","EPSG","4326","EPSG","3440","1.0","-1.0","0.0","-7069119.280717","-199543.780766","-31.060822","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3441","passing","EPSG","4326","EPSG","3441","1.0","-1.0","0.0","3.6521764850117E7","4260391.267194","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3442","passing","EPSG","4326","EPSG","3442","1.0","-1.0","0.0","3.6419862433268E7","5444886.024408","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3443","passing","EPSG","4326","EPSG","3443","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3445","passing","EPSG","4326","EPSG","3445","1.0","-1.0","0.0","3.8917488071742E7","-1.6514801281721E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3446","passing","EPSG","4326","EPSG","3446","1.0","-1.0","0.0","3.8097897822019E7","-1.5992514205953E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3443","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3443","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3445","passing","EPSG","4326","EPSG","3445","1.0","-1.0","0.0","40633809.970593","-16704592.121454","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3446","passing","EPSG","4326","EPSG","3446","1.0","-1.0","0.0","39768638.735981","-16176221.233964","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3447","passing","EPSG","4326","EPSG","3447","1.0","-1.0","0.0","-379774.399828","-6308432.30838","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3448","passing","EPSG","4326","EPSG","3448","1.0","-1.0","0.0","9642964.258676","408789.263501","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3450","passing","EPSG","4326","EPSG","3450","1.0","-1.0","0.0","1.4018825807744E7","-484015.283282","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1535,12 +1535,12 @@ "4326 -> 3459","passing","EPSG","4326","EPSG","3459","1.0","-1.0","0.0","3.9360407080267E7","8781517.394403","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3461","passing","EPSG","4326","EPSG","3461","1.0","-1.0","0.0","2303871.610992","-115145.195555","-27.599177","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3462","passing","EPSG","4326","EPSG","3462","1.0","-1.0","0.0","1618289.457337","-112373.126559","-27.599177","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3463","passing","EPSG","4326","EPSG","3463","1.0","-1.0","0.0","1.1324154703457E7","-5116571.085152","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3464","passing","EPSG","4326","EPSG","3464","1.0","-1.0","0.0","1.1324154703457E7","-5116571.085152","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3465","passing","EPSG","4326","EPSG","3465","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3466","passing","EPSG","4326","EPSG","3466","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3463","passing","EPSG","4326","EPSG","3463","1.0","-1.0","0.0","11671689.678538","-5152007.650725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3464","passing","EPSG","4326","EPSG","3464","1.0","-1.0","0.0","11671689.678538","-5152007.650725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3465","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3465","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3466","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3466","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3467","passing","EPSG","4326","EPSG","3467","1.0","-1.0","0.0","7104914.414304","1.1599667194798E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3468","failing","EPSG","4326","EPSG","3468","1.0","-1.0","0.0","2.1299477541839E7","-9945672.888623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3468","passing","EPSG","4326","EPSG","3468","1.0","-1.0","0.0","2.1299477541839E7","-9945672.888623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3477","passing","EPSG","4326","EPSG","3477","1.0","-1.0","0.0","8328717.21702","1.4116821977524E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3484","passing","EPSG","4326","EPSG","3484","1.0","-1.0","0.0","1.1131856190038E7","1298569.855381","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3485","passing","EPSG","4326","EPSG","3485","1.0","-1.0","0.0","3.6521764850117E7","4260391.267194","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -1567,25 +1567,25 @@ "4326 -> 3506","passing","EPSG","4326","EPSG","3506","1.0","-1.0","0.0","4.1300893148666E7","1.0805178197923E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3507","passing","EPSG","4326","EPSG","3507","1.0","-1.0","0.0","9609648.833132","-675630.039935","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3508","passing","EPSG","4326","EPSG","3508","1.0","-1.0","0.0","3.152765621337E7","-2216629.556017","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3509","passing","EPSG","4326","EPSG","3509","1.0","-1.0","0.0","1.2960400053583E7","-4584092.979322","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3510","passing","EPSG","4326","EPSG","3510","1.0","-1.0","0.0","4.2520912509465E7","-1.5039645049659E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3511","passing","EPSG","4326","EPSG","3511","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3512","passing","EPSG","4326","EPSG","3512","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3509","passing","EPSG","4326","EPSG","3509","1.0","-1.0","0.0","13929727.098412","-4708319.149141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3510","passing","EPSG","4326","EPSG","3510","1.0","-1.0","0.0","45701112.989039","-15447210.408475","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3511","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3511","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3512","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3512","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3513","passing","EPSG","4326","EPSG","3513","1.0","-1.0","0.0","1.0071974621001E7","811782.97242","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3514","passing","EPSG","4326","EPSG","3514","1.0","-1.0","0.0","1.0550650155667E7","427782.799905","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3515","passing","EPSG","4326","EPSG","3515","1.0","-1.0","0.0","3.461492471905E7","1403484.069356","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3516","passing","EPSG","4326","EPSG","3516","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3517","passing","EPSG","4326","EPSG","3517","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3518","passing","EPSG","4326","EPSG","3518","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3519","passing","EPSG","4326","EPSG","3519","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3520","passing","EPSG","4326","EPSG","3520","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3521","passing","EPSG","4326","EPSG","3521","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3528","passing","EPSG","4326","EPSG","3528","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3529","passing","EPSG","4326","EPSG","3529","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3532","passing","EPSG","4326","EPSG","3532","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3533","passing","EPSG","4326","EPSG","3533","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3534","passing","EPSG","4326","EPSG","3534","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3535","passing","EPSG","4326","EPSG","3535","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3516","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3516","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3517","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3517","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3518","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3518","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3519","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3519","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3520","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3520","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3521","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3521","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3528","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3528","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3529","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3529","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3532","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3532","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3533","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3533","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3534","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3534","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3535","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3535","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3536","passing","EPSG","4326","EPSG","3536","1.0","-1.0","0.0","1.2493754958641E7","2708853.657912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3537","passing","EPSG","4326","EPSG","3537","1.0","-1.0","0.0","4.0989927726809E7","8887297.375966","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3538","passing","EPSG","4326","EPSG","3538","1.0","-1.0","0.0","1.1460553625321E7","1661745.543903","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1604,11 +1604,11 @@ "4326 -> 3551","passing","EPSG","4326","EPSG","3551","1.0","-1.0","0.0","3.8398005554391E7","4076115.015849","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3552","passing","EPSG","4326","EPSG","3552","1.0","-1.0","0.0","1.1569510967566E7","1074486.392019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3553","passing","EPSG","4326","EPSG","3553","1.0","-1.0","0.0","3.7957637232722E7","3525210.77115","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3554","passing","EPSG","4326","EPSG","3554","1.0","-1.0","0.0","1.1324154703457E7","-5116571.085152","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3555","passing","EPSG","4326","EPSG","3555","1.0","-1.0","0.0","1.1180772997795E7","-5141094.694271","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3556","passing","EPSG","4326","EPSG","3556","1.0","-1.0","0.0","1.1480217073422E7","-5055926.342392","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3557","passing","EPSG","4326","EPSG","3557","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3558","passing","EPSG","4326","EPSG","3558","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3554","passing","EPSG","4326","EPSG","3554","1.0","-1.0","0.0","11671689.678538","-5152007.650725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3555","passing","EPSG","4326","EPSG","3555","1.0","-1.0","0.0","11465183.093366","-5169053.574542","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3556","passing","EPSG","4326","EPSG","3556","1.0","-1.0","0.0","11905005.691833","-5100943.641776","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3557","passing","EPSG","4326","EPSG","3557","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3558","passing","EPSG","4326","EPSG","3558","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3559","passing","EPSG","4326","EPSG","3559","1.0","-1.0","0.0","9969626.935369","-276195.787551","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3560","passing","EPSG","4326","EPSG","3560","1.0","-1.0","0.0","4.071699395223E7","1.6435163577902E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3566","passing","EPSG","4326","EPSG","3566","1.0","-1.0","0.0","4.0828271383539E7","1.9541430678661E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -1642,23 +1642,23 @@ "4326 -> 3594","passing","EPSG","4326","EPSG","3594","1.0","-1.0","0.0","1.192601192142E7","2053668.621498","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3595","passing","EPSG","4326","EPSG","3595","1.0","-1.0","0.0","1.190460508534E7","1937737.131019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3596","passing","EPSG","4326","EPSG","3596","1.0","-1.0","0.0","1.1867181831423E7","1975209.580327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3597","passing","EPSG","4326","EPSG","3597","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3598","passing","EPSG","4326","EPSG","3598","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3597","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3597","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3598","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","3598","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3604","passing","EPSG","4326","EPSG","3604","1.0","-1.0","0.0","1.2324918268659E7","4366651.863837","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3605","passing","EPSG","4326","EPSG","3605","1.0","-1.0","0.0","4.0436083558584E7","1.432628564251E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3606","passing","EPSG","4326","EPSG","3606","1.0","-1.0","0.0","1.1859582682383E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3613","passing","EPSG","4326","EPSG","3613","1.0","-1.0","0.0","1.1862074088415E7","-5033721.498112","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3614","passing","EPSG","4326","EPSG","3614","1.0","-1.0","0.0","3.8917488071742E7","-1.6514801281721E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3615","passing","EPSG","4326","EPSG","3615","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3616","passing","EPSG","4326","EPSG","3616","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3623","passing","EPSG","4326","EPSG","3623","1.0","-1.0","0.0","1.3411859131067E7","-4823650.932015","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3624","passing","EPSG","4326","EPSG","3624","1.0","-1.0","0.0","4.4002074498844E7","-1.5825594766119E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3625","passing","EPSG","4326","EPSG","3625","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3626","passing","EPSG","4326","EPSG","3626","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3613","passing","EPSG","4326","EPSG","3613","1.0","-1.0","0.0","12385210.049457","-5091569.861759","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3614","passing","EPSG","4326","EPSG","3614","1.0","-1.0","0.0","40633809.970593","-16704592.121454","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3615","passing","EPSG","4326","EPSG","3615","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3616","passing","EPSG","4326","EPSG","3616","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3623","passing","EPSG","4326","EPSG","3623","1.0","-1.0","0.0","14594179.389600","-4984192.934623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3624","passing","EPSG","4326","EPSG","3624","1.0","-1.0","0.0","47881070.213714","-16352306.319676","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3625","passing","EPSG","4326","EPSG","3625","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3626","passing","EPSG","4326","EPSG","3626","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3627","passing","EPSG","4326","EPSG","3627","1.0","-1.0","0.0","9687036.766689","-681351.175466","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3628","passing","EPSG","4326","EPSG","3628","1.0","-1.0","0.0","3.1781553125378E7","-2235399.648173","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3629","passing","EPSG","4326","EPSG","3629","1.0","-1.0","0.0","1.4237282921893E7","-4857039.255734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3630","passing","EPSG","4326","EPSG","3630","1.0","-1.0","0.0","4.6710152386576E7","-1.5935136291522E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3629","passing","EPSG","4326","EPSG","3629","1.0","-1.0","0.0","15922864.775165","-5116346.421875","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3630","passing","EPSG","4326","EPSG","3630","1.0","-1.0","0.0","52240265.516853","-16785879.885769","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3631","passing","EPSG","4326","EPSG","3631","1.0","-1.0","0.0","1.0212602585283E7","-17652.610423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3632","passing","EPSG","4326","EPSG","3632","1.0","-1.0","0.0","3.3505846979267E7","-57915.272695","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3633","passing","EPSG","4326","EPSG","3633","1.0","-1.0","0.0","1.2048562892627E7","2902217.376716","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1681,8 +1681,8 @@ "4326 -> 3650","passing","EPSG","4326","EPSG","3650","1.0","-1.0","0.0","3.3966386502944E7","-702622.902526","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3651","passing","EPSG","4326","EPSG","3651","1.0","-1.0","0.0","1.0308283550952E7","-220512.975756","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3652","passing","EPSG","4326","EPSG","3652","1.0","-1.0","0.0","3.3819760283415E7","-723466.321292","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3653","passing","EPSG","4326","EPSG","3653","1.0","-1.0","0.0","1.1612262480686E7","-4874528.079031","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3654","passing","EPSG","4326","EPSG","3654","1.0","-1.0","0.0","3.8097897822019E7","-1.5992514205953E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3653","passing","EPSG","4326","EPSG","3653","1.0","-1.0","0.0","12121505.329748","-4930522.093156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3654","passing","EPSG","4326","EPSG","3654","1.0","-1.0","0.0","39768638.735981","-16176221.233964","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3655","passing","EPSG","4326","EPSG","3655","1.0","-1.0","0.0","1.0339890150895E7","211156.727684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3656","passing","EPSG","4326","EPSG","3656","1.0","-1.0","0.0","3.3923524117109E7","692771.416287","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3657","passing","EPSG","4326","EPSG","3657","1.0","-1.0","0.0","1.1994495041044E7","2695771.443861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1712,7 +1712,7 @@ "4326 -> 3681","passing","EPSG","4326","EPSG","3681","1.0","-1.0","0.0","1.2495636574632E7","6739176.857568","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3682","passing","EPSG","4326","EPSG","3682","1.0","-1.0","0.0","4.0996182988131E7","2.2110160293819E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3683","passing","EPSG","4326","EPSG","3683","1.0","-1.0","0.0","4.0996100995305E7","2.2110116073538E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3684","passing","EPSG","4326","EPSG","3684","1.0","-1.0","0.0","1.2316477845608E7","-5043906.115058","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3684","passing","EPSG","4326","EPSG","3684","1.0","-1.0","0.0","12915305.224043","-5112088.044691","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3685","passing","EPSG","4326","EPSG","3685","1.0","-1.0","0.0","1.319415649693E7","1855008.196457","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3686","passing","EPSG","4326","EPSG","3686","1.0","-1.0","0.0","4.3287828440678E7","6085972.724876","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3687","passing","EPSG","4326","EPSG","3687","1.0","-1.0","0.0","1.3141710050315E7","871305.38436","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1748,7 +1748,7 @@ "4326 -> 3722","passing","EPSG","4326","EPSG","3722","1.0","-1.0","0.0","9821617.197798","-6559044.245001","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3725","passing","EPSG","4326","EPSG","3725","1.0","-1.0","0.0","1.4018825808604E7","-484015.283423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3726","passing","EPSG","4326","EPSG","3726","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3727","passing","EPSG","4326","EPSG","3727","1.0","-1.0","0.0","-7096044.688947","2198192.870905","-350.230773","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3727","passing","EPSG","4326","EPSG","3727","1.0","-1.0","0.0","-7122048.036772","2196422.714975","-350.230773","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3728","passing","EPSG","4326","EPSG","3728","1.0","-1.0","0.0","3.5236544369481E7","1138594.473223","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3729","passing","EPSG","4326","EPSG","3729","1.0","-1.0","0.0","3.501748094889E7","1106290.514849","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3734","passing","EPSG","4326","EPSG","3734","1.0","-1.0","0.0","3.5236544369481E7","1138594.473223","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -1763,26 +1763,26 @@ "4326 -> 3749","passing","EPSG","4326","EPSG","3749","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3750","passing","EPSG","4326","EPSG","3750","1.0","-1.0","0.0","2772080.292418","-1.9878255185912E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3751","passing","EPSG","4326","EPSG","3751","1.0","-1.0","0.0","3498135.612029","-1.9872858071015E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3752","failing","EPSG","4326","EPSG","3752","1.0","-1.0","0.0","-8329383.326293","-83576.252259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3752","passing","EPSG","4326","EPSG","3752","1.0","-1.0","0.0","-8329383.326293","-83576.252259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3753","passing","EPSG","4326","EPSG","3753","1.0","-1.0","0.0","3.5236544369481E7","1138594.473223","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3754","passing","EPSG","4326","EPSG","3754","1.0","-1.0","0.0","3.501748094889E7","1106290.514849","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3761","passing","EPSG","4326","EPSG","3761","1.0","-1.0","0.0","7306321.314799","-180502.818931","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3762","passing","EPSG","4326","EPSG","3762","1.0","-1.0","0.0","5809003.535605","5199654.422028","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3763","passing","EPSG","4326","EPSG","3763","1.0","-1.0","0.0","1020898.463971","-4504698.955861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3765","passing","EPSG","4326","EPSG","3765","1.0","-1.0","0.0","-1246587.886701","-114765.074053","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3765","passing","EPSG","4326","EPSG","3765","1.0","-1.0","0.0","-1246588.438940","-114765.084839","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3766","passing","EPSG","4326","EPSG","3766","1.0","-1.0","0.0","-2272729.916529","70497.816636","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3767","passing","EPSG","4326","EPSG","3767","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3768","passing","EPSG","4326","EPSG","3768","1.0","-1.0","0.0","-1772080.292418","-117674.699966","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3769","passing","EPSG","4326","EPSG","3769","1.0","-1.0","0.0","9876386.508615","-256414.16385","5.109948","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3770","passing","EPSG","4326","EPSG","3770","1.0","-1.0","0.0","1.0223626363891E7","-3700028.460869","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3770","passing","EPSG","4326","EPSG","3770","1.0","-1.0","0.0","10395671.956683","-3715563.616001","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3784","passing","EPSG","4326","EPSG","3784","1.0","-1.0","0.0","6951540.801686","-9823727.980821","-438.059886","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3785","passing","EPSG","4326","EPSG","3785","1.0","-1.0","0.0","111319.490793","-111325.142866","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3786","passing","EPSG","4326","EPSG","3786","1.0","-1.0","0.0","111195.048818","-111195.048818","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3787","passing","EPSG","4326","EPSG","3787","1.0","-1.0","0.0","-1073989.157328","-5114403.337438","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3794","passing","EPSG","4326","EPSG","3794","1.0","-1.0","0.0","-1073919.848947","-5113971.226934","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3795","passing","EPSG","4326","EPSG","3795","1.0","-1.0","0.0","9909423.319025","252007.642094","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3796","passing","EPSG","4326","EPSG","3796","1.0","-1.0","0.0","9435601.846977","-40741.536432","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3797","passing","EPSG","4326","EPSG","3797","1.0","-1.0","0.0","1.0212385118881E7","-957349.19127","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3787","passing","EPSG","4326","EPSG","3787","1.0","-1.0","0.0","-1073989.413973","-5114403.342046","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3794","passing","EPSG","4326","EPSG","3794","1.0","-1.0","0.0","-1073920.105960","-5113971.231532","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3795","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3795","1.0","-1.0","0.0","9909423.319025","252007.642094","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3796","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3796","1.0","-1.0","0.0","9435601.846977","-40741.536432","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3797","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","3797","1.0","-1.0","0.0","1.0212385118881E7","-957349.19127","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3798","passing","EPSG","4326","EPSG","3798","1.0","-1.0","0.0","1.0212484846369E7","-957603.507164","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3799","passing","EPSG","4326","EPSG","3799","1.0","-1.0","0.0","1.0212484846369E7","-957603.507164","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3812","passing","EPSG","4326","EPSG","3812","1.0","-1.0","0.0","119225.600172","-5809432.30838","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1790,49 +1790,49 @@ "4326 -> 3832","passing","EPSG","4326","EPSG","3832","1.0","-1.0","0.0","-1.6586604128198E7","-110579.965222","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3833","passing","EPSG","4326","EPSG","3833","1.0","-1.0","0.0","1606760.604609","-111594.833491","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3834","passing","EPSG","4326","EPSG","3834","1.0","-1.0","0.0","1606760.774275","-111591.535738","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3835","passing","EPSG","4326","EPSG","3835","1.0","-1.0","0.0","1926020.936157","-113904.057349","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3836","passing","EPSG","4326","EPSG","3836","1.0","-1.0","0.0","2227104.85351","-117640.283083","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3835","passing","EPSG","4326","EPSG","3835","1.0","-1.0","0.0","1926020.679291","-113904.061940","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3836","passing","EPSG","4326","EPSG","3836","1.0","-1.0","0.0","2227100.829890","-117640.381626","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3837","passing","EPSG","4326","EPSG","3837","1.0","-1.0","0.0","2606760.604609","-111594.833491","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3838","passing","EPSG","4326","EPSG","3838","1.0","-1.0","0.0","3268134.781191","-112583.677635","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3839","passing","EPSG","4326","EPSG","3839","1.0","-1.0","0.0","6500782.72258","-123038.185131","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3840","passing","EPSG","4326","EPSG","3840","1.0","-1.0","0.0","7124010.295154","-126465.617859","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3841","passing","EPSG","4326","EPSG","3841","1.0","-1.0","0.0","4579379.604011","-115582.188592","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3842","passing","EPSG","4326","EPSG","3842","1.0","-1.0","0.0","4579379.604011","-115582.188592","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3843","passing","EPSG","4326","EPSG","3843","1.0","-1.0","0.0","4579379.604011","-115582.188592","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3839","passing","EPSG","4326","EPSG","3839","1.0","-1.0","0.0","6500748.287266","-123039.262143","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3840","passing","EPSG","4326","EPSG","3840","1.0","-1.0","0.0","7123923.639255","-126468.629543","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3841","passing","EPSG","4326","EPSG","3841","1.0","-1.0","0.0","4579378.483263","-115582.212314","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3842","passing","EPSG","4326","EPSG","3842","1.0","-1.0","0.0","4579378.483263","-115582.212314","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3843","passing","EPSG","4326","EPSG","3843","1.0","-1.0","0.0","4579378.483263","-115582.212314","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3844","passing","EPSG","4326","EPSG","3844","1.0","-1.0","0.0","-2695051.2727101063","-4732427.223842377","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3845","passing","EPSG","4326","EPSG","3845","1.0","-1.0","0.0","346630.009595","-113067.806865","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3846","passing","EPSG","4326","EPSG","3846","1.0","-1.0","0.0","91097.358672","-113969.952784","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3847","passing","EPSG","4326","EPSG","3847","1.0","-1.0","0.0","-166695.554365","-115066.540948","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3848","passing","EPSG","4326","EPSG","3848","1.0","-1.0","0.0","-427196.876156","-116366.570812","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3849","passing","EPSG","4326","EPSG","3849","1.0","-1.0","0.0","-690877.641131","-117881.379856","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3850","passing","EPSG","4326","EPSG","3850","1.0","-1.0","0.0","-958235.593013","-119623.572799","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3846","passing","EPSG","4326","EPSG","3846","1.0","-1.0","0.0","91097.243144","-113969.954667","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3847","passing","EPSG","4326","EPSG","3847","1.0","-1.0","0.0","-166695.945083","-115066.548282","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3848","passing","EPSG","4326","EPSG","3848","1.0","-1.0","0.0","-427198.026624","-116366.595254","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3849","passing","EPSG","4326","EPSG","3849","1.0","-1.0","0.0","-690880.680458","-117881.452002","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3850","passing","EPSG","4326","EPSG","3850","1.0","-1.0","0.0","-958242.949009","-119623.765906","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3851","passing","EPSG","4326","EPSG","3851","1.0","-1.0","0.0","-8148952.645054","-5042117.961906","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3852","passing","EPSG","4326","EPSG","3852","1.0","-1.0","0.0","-5036241.277593","-1.0682710449249E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3854","passing","EPSG","4326","EPSG","3854","1.0","-1.0","0.0","-1827260.56494","-6616317.630857","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3854","passing","EPSG","4326","EPSG","3854","1.0","-1.0","0.0","-1827261.716216","-6616317.655318","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3857","passing","EPSG","4326","EPSG","3857","1.0","-1.0","0.0","111319.490793","-111325.142866","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3873","passing","EPSG","4326","EPSG","3873","1.0","-1.0","0.0","1.7462544717458E7","-116304.889832","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3874","passing","EPSG","4326","EPSG","3874","1.0","-1.0","0.0","1.8345135741589E7","-116991.03987","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3875","passing","EPSG","4326","EPSG","3875","1.0","-1.0","0.0","1.9227014537391E7","-117721.690014","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3876","passing","EPSG","4326","EPSG","3876","1.0","-1.0","0.0","2.0108135842801E7","-118498.134892","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3877","passing","EPSG","4326","EPSG","3877","1.0","-1.0","0.0","2.0988453089597E7","-119321.76978","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3878","passing","EPSG","4326","EPSG","3878","1.0","-1.0","0.0","2.1867918310647E7","-120194.096558","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3879","passing","EPSG","4326","EPSG","3879","1.0","-1.0","0.0","2.2746482043132E7","-121116.730153","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3880","passing","EPSG","4326","EPSG","3880","1.0","-1.0","0.0","2.3624093227569E7","-122091.405505","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3881","passing","EPSG","4326","EPSG","3881","1.0","-1.0","0.0","2.4500699102425E7","-123119.985081","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3882","passing","EPSG","4326","EPSG","3882","1.0","-1.0","0.0","2.5376245094154E7","-124204.466965","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3883","passing","EPSG","4326","EPSG","3883","1.0","-1.0","0.0","2.6250674702436E7","-125346.993562","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3884","passing","EPSG","4326","EPSG","3884","1.0","-1.0","0.0","2.7123929380454E7","-126549.860952","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3885","passing","EPSG","4326","EPSG","3885","1.0","-1.0","0.0","2.7995948410008E7","-127815.528912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3873","passing","EPSG","4326","EPSG","3873","1.0","-1.0","0.0","17462542.967733","-116304.928830","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3874","passing","EPSG","4326","EPSG","3874","1.0","-1.0","0.0","18345133.063989","-116991.102518","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3875","passing","EPSG","4326","EPSG","3875","1.0","-1.0","0.0","19227010.511786","-117721.788681","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3876","passing","EPSG","4326","EPSG","3876","1.0","-1.0","0.0","20108129.887897","-118498.287502","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3877","passing","EPSG","4326","EPSG","3877","1.0","-1.0","0.0","20988444.411111","-119322.001934","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3878","passing","EPSG","4326","EPSG","3878","1.0","-1.0","0.0","21867905.835705","-120194.444343","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3879","passing","EPSG","4326","EPSG","3879","1.0","-1.0","0.0","22746464.337908","-121117.243828","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3880","passing","EPSG","4326","EPSG","3880","1.0","-1.0","0.0","23624068.394652","-122092.154283","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3881","passing","EPSG","4326","EPSG","3881","1.0","-1.0","0.0","24500664.653832","-123121.063287","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3882","passing","EPSG","4326","EPSG","3882","1.0","-1.0","0.0","25376197.795190","-124206.001913","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3883","passing","EPSG","4326","EPSG","3883","1.0","-1.0","0.0","26250610.380858","-125349.155547","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3884","passing","EPSG","4326","EPSG","3884","1.0","-1.0","0.0","27123842.694496","-126552.875849","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3885","passing","EPSG","4326","EPSG","3885","1.0","-1.0","0.0","27995832.567796","-127819.693982","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3890","passing","EPSG","4326","EPSG","3890","1.0","-1.0","0.0","-4079577.277109","-140545.733763","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3891","passing","EPSG","4326","EPSG","3891","1.0","-1.0","0.0","-4967185.609991","-154126.257162","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3892","passing","EPSG","4326","EPSG","3892","1.0","-1.0","0.0","-5950996.913984","-172760.344418","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3893","passing","EPSG","4326","EPSG","3893","1.0","-1.0","0.0","-4897184.884493","-3368070.993179","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3907","passing","EPSG","4326","EPSG","3907","1.0","-1.0","0.0","3926486.719953","-114463.737913","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3908","passing","EPSG","4326","EPSG","3908","1.0","-1.0","0.0","4579928.424768","-116149.979133","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3909","passing","EPSG","4326","EPSG","3909","1.0","-1.0","0.0","5227738.513893","-118218.032798","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3910","passing","EPSG","4326","EPSG","3910","1.0","-1.0","0.0","5868725.833913","-120700.55189","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3911","passing","EPSG","4326","EPSG","3911","1.0","-1.0","0.0","-1073513.280047","-114463.737913","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3912","passing","EPSG","4326","EPSG","3912","1.0","-1.0","0.0","-1073513.280047","-5114463.737913","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3893","passing","EPSG","4326","EPSG","3893","1.0","-1.0","0.0","-4901882.784651","-3368331.545911","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3907","passing","EPSG","4326","EPSG","3907","1.0","-1.0","0.0","3926486.463874","-114463.742512","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3908","passing","EPSG","4326","EPSG","3908","1.0","-1.0","0.0","4579927.306936","-116150.002910","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3909","passing","EPSG","4326","EPSG","3909","1.0","-1.0","0.0","5227734.499283","-118218.131606","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3910","passing","EPSG","4326","EPSG","3910","1.0","-1.0","0.0","5868713.388738","-120700.900306","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3911","passing","EPSG","4326","EPSG","3911","1.0","-1.0","0.0","-1073513.536126","-114463.742512","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3912","passing","EPSG","4326","EPSG","3912","1.0","-1.0","0.0","-1073513.536126","-5114463.742512","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3920","passing","EPSG","4326","EPSG","3920","1.0","-1.0","0.0","9876749.365363","-255512.402828","-83.342424","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3942","passing","EPSG","4326","EPSG","3942","1.0","-1.0","0.0","1412832.128905","-3998630.413755","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3943","passing","EPSG","4326","EPSG","3943","1.0","-1.0","0.0","1409735.4672","-3140533.790692","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1853,59 +1853,59 @@ "4326 -> 3978","passing","EPSG","4326","EPSG","3978","1.0","-1.0","0.0","1.1394567715938E7","3952432.439572","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3979","passing","EPSG","4326","EPSG","3979","1.0","-1.0","0.0","1.1394567715938E7","3952432.439572","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3985","passing","EPSG","4326","EPSG","3985","1.0","-1.0","0.0","-2304750.582227","-730302.277769","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3986","passing","EPSG","4326","EPSG","3986","1.0","-1.0","0.0","-3176113.454225","1368929.91839","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3987","passing","EPSG","4326","EPSG","3987","1.0","-1.0","0.0","-2923792.328007","1371270.110892","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3988","passing","EPSG","4326","EPSG","3988","1.0","-1.0","0.0","-2675939.252943","1373378.476771","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3989","passing","EPSG","4326","EPSG","3989","1.0","-1.0","0.0","-2432109.642908","1375271.561756","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3986","passing","EPSG","4326","EPSG","3986","1.0","-1.0","0.0","-3176200.482418","1368926.897021","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3987","passing","EPSG","4326","EPSG","3987","1.0","-1.0","0.0","-2923839.832678","1371268.571981","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3988","passing","EPSG","4326","EPSG","3988","1.0","-1.0","0.0","-2675964.205386","1373377.725684","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3989","passing","EPSG","4326","EPSG","3989","1.0","-1.0","0.0","-2432122.184612","1375271.212695","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3991","passing","EPSG","4326","EPSG","3991","1.0","-1.0","0.0","2.5932986842E7","-2227434.883598","-273.432602","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 3992","passing","EPSG","4326","EPSG","3992","1.0","-1.0","0.0","2.5932986842E7","-2127434.883598","-273.432602","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3994","failing","EPSG","4326","EPSG","3994","1.0","-1.0","0.0","-8329383.326293","-83576.252259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3994","passing","EPSG","4326","EPSG","3994","1.0","-1.0","0.0","-8329383.326293","-83576.252259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3995","passing","EPSG","4326","EPSG","3995","1.0","-1.0","0.0","219615.559737","-1.2581766990871E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3996","passing","EPSG","4326","EPSG","3996","1.0","-1.0","0.0","221917.836456","-1.2713664335751E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3997","passing","EPSG","4326","EPSG","3997","1.0","-1.0","0.0","-6719680.364671","-189140.349577","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4026","passing","EPSG","4326","EPSG","4026","1.0","-1.0","0.0","-2973655.434306","-5124646.907941","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3997","passing","EPSG","4326","EPSG","3997","1.0","-1.0","0.0","-6744791.175243","-190861.610505","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4026","passing","EPSG","4326","EPSG","4026","1.0","-1.0","0.0","-2973708.978622","-5124648.670364","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4037","passing","EPSG","4326","EPSG","4037","1.0","-1.0","0.0","-2498135.612025","-123071.814866","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4038","passing","EPSG","4326","EPSG","4038","1.0","-1.0","0.0","-3262671.408962","-130501.513836","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4048","passing","EPSG","4326","EPSG","4048","1.0","-1.0","0.0","-731844.457385","9887353.380192","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4049","passing","EPSG","4326","EPSG","4049","1.0","-1.0","0.0","-959444.220971","9886508.632123","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4050","passing","EPSG","4326","EPSG","4050","1.0","-1.0","0.0","-1188897.947639","9885509.558759","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4051","passing","EPSG","4326","EPSG","4051","1.0","-1.0","0.0","-1420522.418716","9884349.525781","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4056","passing","EPSG","4326","EPSG","4056","1.0","-1.0","0.0","-1654648.771985","9883020.659234","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4057","passing","EPSG","4326","EPSG","4057","1.0","-1.0","0.0","-1891624.970783","9881513.714922","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4058","passing","EPSG","4326","EPSG","4058","1.0","-1.0","0.0","-2131818.481185","9879817.922851","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4059","passing","EPSG","4326","EPSG","4059","1.0","-1.0","0.0","-2375619.181754","9877920.803636","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4060","passing","EPSG","4326","EPSG","4060","1.0","-1.0","0.0","-2623442.530355","9875807.953482","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4049","passing","EPSG","4326","EPSG","4049","1.0","-1.0","0.0","-959444.369764","9886508.629625","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4050","passing","EPSG","4326","EPSG","4050","1.0","-1.0","0.0","-1188898.378504","9885509.550579","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4051","passing","EPSG","4326","EPSG","4051","1.0","-1.0","0.0","-1420523.539990","9884349.502029","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4056","passing","EPSG","4326","EPSG","4056","1.0","-1.0","0.0","-1654651.449318","9883020.596592","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4057","passing","EPSG","4326","EPSG","4057","1.0","-1.0","0.0","-1891630.925092","9881513.562327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4058","passing","EPSG","4326","EPSG","4058","1.0","-1.0","0.0","-2131830.954878","9879817.575101","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4059","passing","EPSG","4326","EPSG","4059","1.0","-1.0","0.0","-2375644.012187","9877920.054932","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4060","passing","EPSG","4326","EPSG","4060","1.0","-1.0","0.0","-2623489.824590","9875806.418687","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4061","passing","EPSG","4326","EPSG","4061","1.0","-1.0","0.0","-1073447.882706","9886062.963257","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4062","passing","EPSG","4326","EPSG","4062","1.0","-1.0","0.0","-1772080.292418","9882325.300034","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4063","passing","EPSG","4326","EPSG","4063","1.0","-1.0","0.0","-2498135.612029","9876928.185138","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4071","passing","EPSG","4326","EPSG","4071","1.0","-1.0","0.0","6282790.621371","9840373.458178","-111.973012","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4082","passing","EPSG","4326","EPSG","4082","1.0","-1.0","0.0","3010550.966654","-119274.273133","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4083","passing","EPSG","4326","EPSG","4083","1.0","-1.0","0.0","2303877.831952","-115015.371832","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4087","passing","EPSG","4326","EPSG","4087","1.0","-1.0","0.0","111319.490793","-111319.490793","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4087","passing","EPSG","4326","EPSG","4087","1.0","-1.0","0.0","111319.490793","-110574.388558","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4088","passing","EPSG","4326","EPSG","4088","1.0","-1.0","0.0","111195.048818","-111195.048818","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4093","passing","EPSG","4326","EPSG","4093","1.0","-1.0","0.0","-693328.681092","-5111666.040474","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4094","passing","EPSG","4326","EPSG","4094","1.0","-1.0","0.0","-605874.418081","-5111959.650981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4095","passing","EPSG","4326","EPSG","4095","1.0","-1.0","0.0","-603605.841381","-5112560.596566","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4096","passing","EPSG","4326","EPSG","4096","1.0","-1.0","0.0","-774077.256672","-5113982.625197","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4390","passing","EPSG","4326","EPSG","4390","1.0","-1.0","0.0","-1.1415405489461E7","-754653.797546","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4391","passing","EPSG","4326","EPSG","4391","1.0","-1.0","0.0","-1.1235086831959E7","-809239.345803","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4392","passing","EPSG","4326","EPSG","4392","1.0","-1.0","0.0","-1.1289962281017E7","-924861.569995","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4393","passing","EPSG","4326","EPSG","4393","1.0","-1.0","0.0","-1.1208400816847E7","-854052.851519","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4394","passing","EPSG","4326","EPSG","4394","1.0","-1.0","0.0","-1.1341074183046E7","-1067202.684921","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4395","passing","EPSG","4326","EPSG","4395","1.0","-1.0","0.0","-1.1057220462644E7","-1088522.462177","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4396","passing","EPSG","4326","EPSG","4396","1.0","-1.0","0.0","-1.1089701244646E7","-1152132.312318","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4397","passing","EPSG","4326","EPSG","4397","1.0","-1.0","0.0","-1.110965048644E7","-898554.427085","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4398","passing","EPSG","4326","EPSG","4398","1.0","-1.0","0.0","-1.1261136274144E7","-1163015.486477","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4096","passing","EPSG","4326","EPSG","4096","1.0","-1.0","0.0","-774077.513711","-5113982.629795","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4390","passing","EPSG","4326","EPSG","4390","1.0","-1.0","0.0","-11410614.222541","-754653.797546","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4391","passing","EPSG","4326","EPSG","4391","1.0","-1.0","0.0","-11230662.516299","-809239.345803","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4392","passing","EPSG","4326","EPSG","4392","1.0","-1.0","0.0","-11285428.421250","-924861.569995","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4393","passing","EPSG","4326","EPSG","4393","1.0","-1.0","0.0","-11204070.560069","-854052.851519","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4394","passing","EPSG","4326","EPSG","4394","1.0","-1.0","0.0","-11336436.812780","-1067202.684921","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4395","passing","EPSG","4326","EPSG","4395","1.0","-1.0","0.0","-11053134.859106","-1088522.462177","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4396","passing","EPSG","4326","EPSG","4396","1.0","-1.0","0.0","-11085555.306429","-1152132.312318","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4397","passing","EPSG","4326","EPSG","4397","1.0","-1.0","0.0","-11105467.139855","-898554.427085","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4398","passing","EPSG","4326","EPSG","4398","1.0","-1.0","0.0","-11256659.972229","-1163015.486477","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4415","passing","EPSG","4326","EPSG","4415","1.0","-1.0","0.0","-2304750.582227","1291098.33461","30.092356","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4417","passing","EPSG","4326","EPSG","4417","1.0","-1.0","0.0","5227104.85351","-117640.283083","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4418","passing","EPSG","4326","EPSG","4418","1.0","-1.0","0.0","4.3031005718586E7","-1215260.363307","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4419","passing","EPSG","4326","EPSG","4419","1.0","-1.0","0.0","3.7026083079511E7","-974432.050519","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4434","passing","EPSG","4326","EPSG","4434","1.0","-1.0","0.0","5868005.183604","-120110.838343","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4417","passing","EPSG","4326","EPSG","4417","1.0","-1.0","0.0","5227100.829890","-117640.381626","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4418","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","4418","1.0","-1.0","0.0","4.3031005718586E7","-1215260.363307","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4419","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","4419","1.0","-1.0","0.0","3.7026083079511E7","-974432.050519","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4434","passing","EPSG","4326","EPSG","4434","1.0","-1.0","0.0","5867992.714069","-120111.185714","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4437","passing","EPSG","4326","EPSG","4437","1.0","-1.0","0.0","7952042.830285","-479128.830527","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4438","passing","EPSG","4326","EPSG","4438","1.0","-1.0","0.0","4.3029190088462E7","-1215186.11099","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4439","passing","EPSG","4326","EPSG","4439","1.0","-1.0","0.0","3.7024720447344E7","-974391.245523","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4455","passing","EPSG","4326","EPSG","4455","1.0","-1.0","0.0","3.3851081735579E7","-722676.685566","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4456","passing","EPSG","4326","EPSG","4456","1.0","-1.0","0.0","3.2797122316274E7","-2256035.177722","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4438","passing","EPSG","4326","EPSG","4438","1.0","-1.0","0.0","45993431.010396","-1587973.475698","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4439","passing","EPSG","4326","EPSG","4439","1.0","-1.0","0.0","38141867.220929","-1087876.465856","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4455","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","4455","1.0","-1.0","0.0","3.3851081735579E7","-722676.685566","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4456","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","4456","1.0","-1.0","0.0","3.2797122316274E7","-2256035.177722","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 4457","passing","EPSG","4326","EPSG","4457","1.0","-1.0","0.0","3.9351939147157E7","8844376.812066","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 4462","passing","EPSG","4326","EPSG","4462","1.0","-1.0","0.0","-1.3179076565455E7","-4627200.838144","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4467","passing","EPSG","4326","EPSG","4467","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1916,44 +1916,44 @@ "4326 -> 4486","passing","EPSG","4326","EPSG","4486","1.0","-1.0","0.0","1.3117319676437E7","-1.9577493844715E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4487","passing","EPSG","4326","EPSG","4487","1.0","-1.0","0.0","1.635961359846E7","-1.9271652378892E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4488","passing","EPSG","4326","EPSG","4488","1.0","-1.0","0.0","9821617.197798","-6559044.245001","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4491","passing","EPSG","4326","EPSG","4491","1.0","-1.0","0.0","1527316.681695","-343262.115256","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4492","passing","EPSG","4326","EPSG","4492","1.0","-1.0","0.0","454694.812572","-435257.597894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4493","passing","EPSG","4326","EPSG","4493","1.0","-1.0","0.0","-1067776.469979","-564310.855971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4502","passing","EPSG","4326","EPSG","4502","1.0","-1.0","0.0","-1.1472683318305E7","-343262.115256","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4503","passing","EPSG","4326","EPSG","4503","1.0","-1.0","0.0","-1.3545305187428E7","-435257.597894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4504","passing","EPSG","4326","EPSG","4504","1.0","-1.0","0.0","-1.6067776469979E7","-564310.855971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4513","passing","EPSG","4326","EPSG","4513","1.0","-1.0","0.0","1.3527316681695E7","-343262.115256","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4514","passing","EPSG","4326","EPSG","4514","1.0","-1.0","0.0","1.3540288190914E7","-385374.039095","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4515","passing","EPSG","4326","EPSG","4515","1.0","-1.0","0.0","1.3454694812572E7","-435257.597894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4516","passing","EPSG","4326","EPSG","4516","1.0","-1.0","0.0","1.3257055161241E7","-494345.816812","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4517","passing","EPSG","4326","EPSG","4517","1.0","-1.0","0.0","1.2932223530021E7","-564310.855971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4518","passing","EPSG","4326","EPSG","4518","1.0","-1.0","0.0","1.2463222673201E7","-647097.022634","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4534","passing","EPSG","4326","EPSG","4534","1.0","-1.0","0.0","-1.1472683318305E7","-343262.115256","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4535","passing","EPSG","4326","EPSG","4535","1.0","-1.0","0.0","-1.2459711809086E7","-385374.039095","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4536","passing","EPSG","4326","EPSG","4536","1.0","-1.0","0.0","-1.3545305187428E7","-435257.597894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4537","passing","EPSG","4326","EPSG","4537","1.0","-1.0","0.0","-1.4742944838759E7","-494345.816812","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4538","passing","EPSG","4326","EPSG","4538","1.0","-1.0","0.0","-1.6067776469979E7","-564310.855971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4539","passing","EPSG","4326","EPSG","4539","1.0","-1.0","0.0","-1.7536777326799E7","-647097.022634","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4491","passing","EPSG","4326","EPSG","4491","1.0","-1.0","0.0","877631.376113","-418603.482556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4492","passing","EPSG","4326","EPSG","4492","1.0","-1.0","0.0","-1365959.982453","-724567.333919","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4493","passing","EPSG","4326","EPSG","4493","1.0","-1.0","0.0","6174652.663267","-13442262.545895","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4502","passing","EPSG","4326","EPSG","4502","1.0","-1.0","0.0","-12122368.623887","-418603.482556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4503","passing","EPSG","4326","EPSG","4503","1.0","-1.0","0.0","-15365959.982453","-724567.333919","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4504","passing","EPSG","4326","EPSG","4504","1.0","-1.0","0.0","-8825347.336733","-13442262.545895","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4513","passing","EPSG","4326","EPSG","4513","1.0","-1.0","0.0","12877631.376113","-418603.482556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4514","passing","EPSG","4326","EPSG","4514","1.0","-1.0","0.0","12470335.717018","-526375.579956","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4515","passing","EPSG","4326","EPSG","4515","1.0","-1.0","0.0","11634040.017547","-724567.333919","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4516","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4516","1.0","-1.0","0.0","1.3257055161241E7","-494345.816812","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4517","passing","EPSG","4326","EPSG","4517","1.0","-1.0","0.0","20174652.663267","-13442262.545895","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4518","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4518","1.0","-1.0","0.0","1.2463222673201E7","-647097.022634","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4534","passing","EPSG","4326","EPSG","4534","1.0","-1.0","0.0","-12122368.623887","-418603.482556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4535","passing","EPSG","4326","EPSG","4535","1.0","-1.0","0.0","-13529664.282982","-526375.579956","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4536","passing","EPSG","4326","EPSG","4536","1.0","-1.0","0.0","-15365959.982453","-724567.333919","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4537","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4537","1.0","-1.0","0.0","-1.4742944838759E7","-494345.816812","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4538","passing","EPSG","4326","EPSG","4538","1.0","-1.0","0.0","-8825347.336733","-13442262.545895","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4539","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4539","1.0","-1.0","0.0","-1.7536777326799E7","-647097.022634","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4559","passing","EPSG","4326","EPSG","4559","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4568","passing","EPSG","4326","EPSG","4568","1.0","-1.0","0.0","1527118.766369","-343267.732955","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4569","passing","EPSG","4326","EPSG","4569","1.0","-1.0","0.0","454463.6233","-435264.619734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4570","passing","EPSG","4326","EPSG","4570","1.0","-1.0","0.0","-1068048.023824","-564319.84806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4579","passing","EPSG","4326","EPSG","4579","1.0","-1.0","0.0","-1.1472881233631E7","-343267.732955","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4580","passing","EPSG","4326","EPSG","4580","1.0","-1.0","0.0","-1.35455363767E7","-435264.619734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4581","passing","EPSG","4326","EPSG","4581","1.0","-1.0","0.0","-1.6068048023824E7","-564319.84806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4568","passing","EPSG","4326","EPSG","4568","1.0","-1.0","0.0","877435.690357","-418608.123450","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4569","passing","EPSG","4326","EPSG","4569","1.0","-1.0","0.0","-1366169.035253","-724562.720366","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4570","passing","EPSG","4326","EPSG","4570","1.0","-1.0","0.0","6163286.592454","-13435548.191109","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4579","passing","EPSG","4326","EPSG","4579","1.0","-1.0","0.0","-12122564.309643","-418608.123450","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4580","passing","EPSG","4326","EPSG","4580","1.0","-1.0","0.0","-15366169.035253","-724562.720366","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4581","passing","EPSG","4326","EPSG","4581","1.0","-1.0","0.0","-8836713.407546","-13435548.191109","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4647","passing","EPSG","4326","EPSG","4647","1.0","-1.0","0.0","3.1607010790596E7","-111623.60653","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4652","passing","EPSG","4326","EPSG","4652","1.0","-1.0","0.0","1.3527118766369E7","-343267.732955","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4653","passing","EPSG","4326","EPSG","4653","1.0","-1.0","0.0","1.3540074413673E7","-385380.299718","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4654","passing","EPSG","4326","EPSG","4654","1.0","-1.0","0.0","1.34544636233E7","-435264.619734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4655","passing","EPSG","4326","EPSG","4655","1.0","-1.0","0.0","1.32568047941E7","-494353.740439","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4656","passing","EPSG","4326","EPSG","4656","1.0","-1.0","0.0","1.2931951976176E7","-564319.84806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4766","passing","EPSG","4326","EPSG","4766","1.0","-1.0","0.0","1.2462927650746E7","-647107.280337","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4782","passing","EPSG","4326","EPSG","4782","1.0","-1.0","0.0","-1.1472881233631E7","-343267.732955","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4783","passing","EPSG","4326","EPSG","4783","1.0","-1.0","0.0","-1.2459925586327E7","-385380.299718","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4784","passing","EPSG","4326","EPSG","4784","1.0","-1.0","0.0","-1.35455363767E7","-435264.619734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4785","passing","EPSG","4326","EPSG","4785","1.0","-1.0","0.0","-1.47431952059E7","-494353.740439","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4786","passing","EPSG","4326","EPSG","4786","1.0","-1.0","0.0","-1.6068048023824E7","-564319.84806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4787","passing","EPSG","4326","EPSG","4787","1.0","-1.0","0.0","-1.7537072349254E7","-647107.280337","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4652","passing","EPSG","4326","EPSG","4652","1.0","-1.0","0.0","12877435.690357","-418608.123450","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4653","passing","EPSG","4326","EPSG","4653","1.0","-1.0","0.0","12470128.448264","-526378.956406","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4654","passing","EPSG","4326","EPSG","4654","1.0","-1.0","0.0","11633830.964747","-724562.720366","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4655","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4655","1.0","-1.0","0.0","1.32568047941E7","-494353.740439","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4656","passing","EPSG","4326","EPSG","4656","1.0","-1.0","0.0","20163286.592454","-13435548.191109","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4766","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4766","1.0","-1.0","0.0","1.2462927650746E7","-647107.280337","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4782","passing","EPSG","4326","EPSG","4782","1.0","-1.0","0.0","-12122564.309643","-418608.123450","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4783","passing","EPSG","4326","EPSG","4783","1.0","-1.0","0.0","-13529871.551736","-526378.956406","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4784","passing","EPSG","4326","EPSG","4784","1.0","-1.0","0.0","-15366169.035253","-724562.720366","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4785","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4785","1.0","-1.0","0.0","-1.47431952059E7","-494353.740439","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4786","passing","EPSG","4326","EPSG","4786","1.0","-1.0","0.0","-8836713.407546","-13435548.191109","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4787","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","4787","1.0","-1.0","0.0","-1.7537072349254E7","-647107.280337","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4826","passing","EPSG","4326","EPSG","4826","1.0","-1.0","0.0","3057318.277708","-1587120.453089","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4839","passing","EPSG","4326","EPSG","4839","1.0","-1.0","0.0","-1506070.493898","-6435230.741586","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4855","passing","EPSG","4326","EPSG","4855","1.0","-1.0","0.0","-401380.815652","889081.448564","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1964,24 +1964,24 @@ "4326 -> 4860","passing","EPSG","4326","EPSG","4860","1.0","-1.0","0.0","-962283.83098","887877.803382","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4861","passing","EPSG","4326","EPSG","4861","1.0","-1.0","0.0","-1075315.787292","887529.87527","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4862","passing","EPSG","4326","EPSG","4862","1.0","-1.0","0.0","-1188716.310511","887145.056295","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4863","passing","EPSG","4326","EPSG","4863","1.0","-1.0","0.0","-1302522.815483","886722.725861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4864","passing","EPSG","4326","EPSG","4864","1.0","-1.0","0.0","-1416773.369932","886262.197058","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4865","passing","EPSG","4326","EPSG","4865","1.0","-1.0","0.0","-1531506.760797","885762.713904","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4866","passing","EPSG","4326","EPSG","4866","1.0","-1.0","0.0","-1646762.562957","885223.448292","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4867","passing","EPSG","4326","EPSG","4867","1.0","-1.0","0.0","-1762581.210546","884643.496617","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4868","passing","EPSG","4326","EPSG","4868","1.0","-1.0","0.0","-1879004.071028","884021.87606","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4869","passing","EPSG","4326","EPSG","4869","1.0","-1.0","0.0","-1996073.52225","883357.520526","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4870","passing","EPSG","4326","EPSG","4870","1.0","-1.0","0.0","-2113833.032642","882649.276193","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4871","passing","EPSG","4326","EPSG","4871","1.0","-1.0","0.0","-2232327.244772","881895.896667","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4872","passing","EPSG","4326","EPSG","4872","1.0","-1.0","0.0","-2351602.06243","881096.037711","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4873","passing","EPSG","4326","EPSG","4873","1.0","-1.0","0.0","-2471704.741451","880248.251521","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4874","passing","EPSG","4326","EPSG","4874","1.0","-1.0","0.0","-2592683.984457","879350.980532","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4875","passing","EPSG","4326","EPSG","4875","1.0","-1.0","0.0","-2714590.039706","878402.550714","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4876","passing","EPSG","4326","EPSG","4876","1.0","-1.0","0.0","-2837474.804249","877401.164338","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4877","passing","EPSG","4326","EPSG","4877","1.0","-1.0","0.0","-2961391.931586","876344.892177","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4878","passing","EPSG","4326","EPSG","4878","1.0","-1.0","0.0","-3086396.944001","875231.665115","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4879","passing","EPSG","4326","EPSG","4879","1.0","-1.0","0.0","-3212547.349776","874059.265119","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4880","passing","EPSG","4326","EPSG","4880","1.0","-1.0","0.0","-3339902.765479","872825.315559","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4863","passing","EPSG","4326","EPSG","4863","1.0","-1.0","0.0","-1302522.927306","886722.724045","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4864","passing","EPSG","4326","EPSG","4864","1.0","-1.0","0.0","-1416773.566285","886262.193653","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4865","passing","EPSG","4326","EPSG","4865","1.0","-1.0","0.0","-1531507.094775","885762.707747","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4866","passing","EPSG","4326","EPSG","4866","1.0","-1.0","0.0","-1646763.115252","885223.437505","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4867","passing","EPSG","4326","EPSG","4867","1.0","-1.0","0.0","-1762582.101218","884643.478240","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4868","passing","EPSG","4326","EPSG","4868","1.0","-1.0","0.0","-1879005.475356","884021.845536","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4869","passing","EPSG","4326","EPSG","4869","1.0","-1.0","0.0","-1996075.691768","883357.470970","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4870","passing","EPSG","4326","EPSG","4870","1.0","-1.0","0.0","-2113836.322727","882649.197386","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4871","passing","EPSG","4326","EPSG","4871","1.0","-1.0","0.0","-2232332.150416","881895.773692","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4872","passing","EPSG","4326","EPSG","4872","1.0","-1.0","0.0","-2351609.264146","881095.849110","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4873","passing","EPSG","4326","EPSG","4873","1.0","-1.0","0.0","-2471715.163646","880247.966851","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4874","passing","EPSG","4326","EPSG","4874","1.0","-1.0","0.0","-2592698.869007","879350.557142","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4875","passing","EPSG","4326","EPSG","4875","1.0","-1.0","0.0","-2714611.037981","878401.929546","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4876","passing","EPSG","4326","EPSG","4876","1.0","-1.0","0.0","-2837504.091373","877400.264491","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4877","passing","EPSG","4326","EPSG","4877","1.0","-1.0","0.0","-2961432.347352","876343.603938","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4878","passing","EPSG","4326","EPSG","4878","1.0","-1.0","0.0","-3086452.165613","875229.841080","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4879","passing","EPSG","4326","EPSG","4879","1.0","-1.0","0.0","-3212622.102393","874056.708962","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4880","passing","EPSG","4326","EPSG","4880","1.0","-1.0","0.0","-3340003.077490","872821.767912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5014","passing","EPSG","4326","EPSG","5014","1.0","-1.0","0.0","4528360.482014","-133522.286394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5015","passing","EPSG","4326","EPSG","5015","1.0","-1.0","0.0","3748089.863294","-125299.015884","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5016","passing","EPSG","4326","EPSG","5016","1.0","-1.0","0.0","2303877.831952","-115015.371832","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -1989,7 +1989,7 @@ "4326 -> 5041","passing","EPSG","4326","EPSG","5041","1.0","-1.0","0.0","2224408.737826","-1.0856367979638E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5042","passing","EPSG","4326","EPSG","5042","1.0","-1.0","0.0","2216760.795442","1.4418217653909E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5048","passing","EPSG","4326","EPSG","5048","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5069","passing","EPSG","4326","EPSG","5069","1.0","-1.0","0.0","1.0556044711463E7","3455673.156981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5069","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","5069","1.0","-1.0","0.0","1.0556044711463E7","3455673.156981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5070","passing","EPSG","4326","EPSG","5070","1.0","-1.0","0.0","1.0556027802568E7","3455522.982097","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5071","passing","EPSG","4326","EPSG","5071","1.0","-1.0","0.0","1.0556027802568E7","3455522.982097","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5072","passing","EPSG","4326","EPSG","5072","1.0","-1.0","0.0","1.0556027802568E7","3455522.982097","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2001,59 +2001,59 @@ "4326 -> 5110","passing","EPSG","4326","EPSG","5110","1.0","-1.0","0.0","-962283.83098","-5543404.868499","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5111","passing","EPSG","4326","EPSG","5111","1.0","-1.0","0.0","-1075315.787292","-5543752.796612","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5112","passing","EPSG","4326","EPSG","5112","1.0","-1.0","0.0","-1188716.310511","-5544137.615587","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5113","passing","EPSG","4326","EPSG","5113","1.0","-1.0","0.0","-1302522.815483","-5544559.94602","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5114","passing","EPSG","4326","EPSG","5114","1.0","-1.0","0.0","-1416773.369932","-5545020.474823","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5115","passing","EPSG","4326","EPSG","5115","1.0","-1.0","0.0","-1531506.760797","-5545519.957977","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5116","passing","EPSG","4326","EPSG","5116","1.0","-1.0","0.0","-1646762.562957","-5546059.223589","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5117","passing","EPSG","4326","EPSG","5117","1.0","-1.0","0.0","-1762581.210546","-5546639.175265","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5118","passing","EPSG","4326","EPSG","5118","1.0","-1.0","0.0","-1879004.071028","-5547260.795821","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5119","passing","EPSG","4326","EPSG","5119","1.0","-1.0","0.0","-1996073.52225","-5547925.151356","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5120","passing","EPSG","4326","EPSG","5120","1.0","-1.0","0.0","-2113833.032642","-5548633.395688","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5121","passing","EPSG","4326","EPSG","5121","1.0","-1.0","0.0","-2232327.244772","-5549386.775214","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5122","passing","EPSG","4326","EPSG","5122","1.0","-1.0","0.0","-2351602.06243","-5550186.63417","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5123","passing","EPSG","4326","EPSG","5123","1.0","-1.0","0.0","-2471704.741451","-5551034.42036","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5124","passing","EPSG","4326","EPSG","5124","1.0","-1.0","0.0","-2592683.984457","-5551931.691349","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5125","passing","EPSG","4326","EPSG","5125","1.0","-1.0","0.0","-2714590.039706","-5552880.121167","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5126","passing","EPSG","4326","EPSG","5126","1.0","-1.0","0.0","-2837474.804249","-5553881.507544","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5127","passing","EPSG","4326","EPSG","5127","1.0","-1.0","0.0","-2961391.931586","-5554937.779704","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5128","passing","EPSG","4326","EPSG","5128","1.0","-1.0","0.0","-3086396.944001","-5556051.006767","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5129","passing","EPSG","4326","EPSG","5129","1.0","-1.0","0.0","-3212547.349776","-5557223.406762","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5130","passing","EPSG","4326","EPSG","5130","1.0","-1.0","0.0","-3339902.765479","-5558457.356322","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5113","passing","EPSG","4326","EPSG","5113","1.0","-1.0","0.0","-1302522.927306","-5544559.947834","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5114","passing","EPSG","4326","EPSG","5114","1.0","-1.0","0.0","-1416773.566285","-5545020.478225","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5115","passing","EPSG","4326","EPSG","5115","1.0","-1.0","0.0","-1531507.094775","-5545519.964131","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5116","passing","EPSG","4326","EPSG","5116","1.0","-1.0","0.0","-1646763.115252","-5546059.234374","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5117","passing","EPSG","4326","EPSG","5117","1.0","-1.0","0.0","-1762582.101218","-5546639.193638","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5118","passing","EPSG","4326","EPSG","5118","1.0","-1.0","0.0","-1879005.475356","-5547260.826342","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5119","passing","EPSG","4326","EPSG","5119","1.0","-1.0","0.0","-1996075.691768","-5547925.200909","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5120","passing","EPSG","4326","EPSG","5120","1.0","-1.0","0.0","-2113836.322727","-5548633.474492","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5121","passing","EPSG","4326","EPSG","5121","1.0","-1.0","0.0","-2232332.150416","-5549386.898187","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5122","passing","EPSG","4326","EPSG","5122","1.0","-1.0","0.0","-2351609.264146","-5550186.822769","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5123","passing","EPSG","4326","EPSG","5123","1.0","-1.0","0.0","-2471715.163646","-5551034.705028","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5124","passing","EPSG","4326","EPSG","5124","1.0","-1.0","0.0","-2592698.869007","-5551932.114736","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5125","passing","EPSG","4326","EPSG","5125","1.0","-1.0","0.0","-2714611.037981","-5552880.742333","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5126","passing","EPSG","4326","EPSG","5126","1.0","-1.0","0.0","-2837504.091373","-5553882.407388","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5127","passing","EPSG","4326","EPSG","5127","1.0","-1.0","0.0","-2961432.347352","-5554939.067940","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5128","passing","EPSG","4326","EPSG","5128","1.0","-1.0","0.0","-3086452.165613","-5556052.830799","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5129","passing","EPSG","4326","EPSG","5129","1.0","-1.0","0.0","-3212622.102393","-5557225.962917","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5130","passing","EPSG","4326","EPSG","5130","1.0","-1.0","0.0","-3340003.077490","-5558460.903966","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5221","passing","EPSG","4326","EPSG","5221","1.0","-1.0","0.0","-3403171.8139043623","-6866781.451857718","158.074317","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5223","passing","EPSG","4326","EPSG","5223","1.0","-1.0","0.0","-731474.867088","387387.177554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5234","passing","EPSG","4326","EPSG","5234","1.0","-1.0","0.0","-1.3758260606485E7","-1005469.03451","945.386856","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5235","passing","EPSG","4326","EPSG","5235","1.0","-1.0","0.0","-1.345855967557E7","-705291.382937","849.332431","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5234","passing","EPSG","4326","EPSG","5234","1.0","-1.0","0.0","-15502334.307031","-1277555.600045","945.386856","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5235","passing","EPSG","4326","EPSG","5235","1.0","-1.0","0.0","-15202913.356535","-977316.346419","849.332431","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5243","passing","EPSG","4326","EPSG","5243","1.0","-1.0","0.0","-1506070.493898","-6435230.741586","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5247","failing","EPSG","4326","EPSG","5247","1.0","-1.0","0.0","-1.2409058238151E7","-4357833.596094","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5253","passing","EPSG","4326","EPSG","5253","1.0","-1.0","0.0","-2499300.897575","-123119.985081","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5254","passing","EPSG","4326","EPSG","5254","1.0","-1.0","0.0","-2876070.619546","-126549.860952","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5255","passing","EPSG","4326","EPSG","5255","1.0","-1.0","0.0","-3263974.993052","-130545.989415","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5256","passing","EPSG","4326","EPSG","5256","1.0","-1.0","0.0","-3664785.187266","-135184.847746","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5257","passing","EPSG","4326","EPSG","5257","1.0","-1.0","0.0","-4080493.872404","-140560.129725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5258","passing","EPSG","4326","EPSG","5258","1.0","-1.0","0.0","-4513354.151499","-146786.390836","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5259","passing","EPSG","4326","EPSG","5259","1.0","-1.0","0.0","-4965923.372587","-154003.431247","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5266","passing","EPSG","4326","EPSG","5266","1.0","-1.0","0.0","-1.7786777326799E7","-647097.022634","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5269","passing","EPSG","4326","EPSG","5269","1.0","-1.0","0.0","6500699.102425","-123119.985081","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5270","passing","EPSG","4326","EPSG","5270","1.0","-1.0","0.0","7123929.380454","-126549.860952","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5271","passing","EPSG","4326","EPSG","5271","1.0","-1.0","0.0","7736025.006948","-130545.989415","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5272","passing","EPSG","4326","EPSG","5272","1.0","-1.0","0.0","8335214.812734","-135184.847746","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5273","passing","EPSG","4326","EPSG","5273","1.0","-1.0","0.0","8919506.127596","-140560.129725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5274","passing","EPSG","4326","EPSG","5274","1.0","-1.0","0.0","9486645.848501","-146786.390836","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5275","passing","EPSG","4326","EPSG","5275","1.0","-1.0","0.0","1.0034076627413E7","-154003.431247","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5292","passing","EPSG","4326","EPSG","5292","1.0","-1.0","0.0","-1.8169909207122E7","-3169532.907567","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5293","passing","EPSG","4326","EPSG","5293","1.0","-1.0","0.0","-1.7556513883394E7","-3133776.920429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5294","passing","EPSG","4326","EPSG","5294","1.0","-1.0","0.0","-1.7709618736852E7","-3142619.776416","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5295","passing","EPSG","4326","EPSG","5295","1.0","-1.0","0.0","-1.7803978922572E7","-3148097.063507","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5296","passing","EPSG","4326","EPSG","5296","1.0","-1.0","0.0","-1.7864343351674E7","-3151611.881638","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5299","passing","EPSG","4326","EPSG","5299","1.0","-1.0","0.0","-1.7455334051796E7","-3127963.421504","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5301","passing","EPSG","4326","EPSG","5301","1.0","-1.0","0.0","-1.7709618736852E7","-3142619.776416","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5303","passing","EPSG","4326","EPSG","5303","1.0","-1.0","0.0","-1.7313201852726E7","-3119838.008648","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5304","passing","EPSG","4326","EPSG","5304","1.0","-1.0","0.0","-1.7924955772937E7","-3155149.636554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5305","passing","EPSG","4326","EPSG","5305","1.0","-1.0","0.0","-1.7556513883394E7","-3133776.920429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5307","passing","EPSG","4326","EPSG","5307","1.0","-1.0","0.0","-1.8046929347289E7","-3162294.531826","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5308","passing","EPSG","4326","EPSG","5308","1.0","-1.0","0.0","-1.7872987058161E7","-3152115.867565","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5309","passing","EPSG","4326","EPSG","5309","1.0","-1.0","0.0","-1.7847071118416E7","-3150605.313657","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5311","passing","EPSG","4326","EPSG","5311","1.0","-1.0","0.0","-1.8240638922076E7","-3173711.543301","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5247","passing","EPSG","4326","EPSG","5247","1.0","-1.0","0.0","-1.2409058238151E7","-4357833.596094","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5253","passing","EPSG","4326","EPSG","5253","1.0","-1.0","0.0","-2499335.346168","-123121.063287","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5254","passing","EPSG","4326","EPSG","5254","1.0","-1.0","0.0","-2876157.305504","-126552.875849","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5255","passing","EPSG","4326","EPSG","5255","1.0","-1.0","0.0","-3264177.079801","-130553.735327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5256","passing","EPSG","4326","EPSG","5256","1.0","-1.0","0.0","-3665227.179089","-135203.393740","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5257","passing","EPSG","4326","EPSG","5257","1.0","-1.0","0.0","-4081409.841045","-140601.974553","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5258","passing","EPSG","4326","EPSG","5258","1.0","-1.0","0.0","-4515167.158491","-146876.164724","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5259","passing","EPSG","4326","EPSG","5259","1.0","-1.0","0.0","-4969373.359334","-154187.932335","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5266","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5266","1.0","-1.0","0.0","-1.7786777326799E7","-647097.022634","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5269","passing","EPSG","4326","EPSG","5269","1.0","-1.0","0.0","6500664.653832","-123121.063287","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5270","passing","EPSG","4326","EPSG","5270","1.0","-1.0","0.0","7123842.694496","-126552.875849","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5271","passing","EPSG","4326","EPSG","5271","1.0","-1.0","0.0","7735822.920199","-130553.735327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5272","passing","EPSG","4326","EPSG","5272","1.0","-1.0","0.0","8334772.820911","-135203.393740","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5273","passing","EPSG","4326","EPSG","5273","1.0","-1.0","0.0","8918590.158955","-140601.974553","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5274","passing","EPSG","4326","EPSG","5274","1.0","-1.0","0.0","9484832.841509","-146876.164724","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5275","passing","EPSG","4326","EPSG","5275","1.0","-1.0","0.0","10030626.640666","-154187.932335","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5292","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5292","1.0","-1.0","0.0","-1.8169909207122E7","-3169532.907567","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5293","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5293","1.0","-1.0","0.0","-1.7556513883394E7","-3133776.920429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5294","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5294","1.0","-1.0","0.0","-1.7709618736852E7","-3142619.776416","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5295","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5295","1.0","-1.0","0.0","-1.7803978922572E7","-3148097.063507","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5296","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5296","1.0","-1.0","0.0","-1.7864343351674E7","-3151611.881638","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5299","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5299","1.0","-1.0","0.0","-1.7455334051796E7","-3127963.421504","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5301","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5301","1.0","-1.0","0.0","-1.7709618736852E7","-3142619.776416","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5303","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5303","1.0","-1.0","0.0","-1.7313201852726E7","-3119838.008648","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5304","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5304","1.0","-1.0","0.0","-1.7924955772937E7","-3155149.636554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5305","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5305","1.0","-1.0","0.0","-1.7556513883394E7","-3133776.920429","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5307","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5307","1.0","-1.0","0.0","-1.8046929347289E7","-3162294.531826","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5308","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5308","1.0","-1.0","0.0","-1.7872987058161E7","-3152115.867565","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5309","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5309","1.0","-1.0","0.0","-1.7847071118416E7","-3150605.313657","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5311","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5311","1.0","-1.0","0.0","-1.8240638922076E7","-3173711.543301","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5316","passing","EPSG","4326","EPSG","5316","1.0","-1.0","0.0","1093343.867984","-6111667.938834","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5320","passing","EPSG","4326","EPSG","5320","1.0","-1.0","0.0","1.1589485449673E7","6556081.94433","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5321","passing","EPSG","4326","EPSG","5321","1.0","-1.0","0.0","1.1589485449673E7","6556081.94433","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2062,19 +2062,19 @@ "4326 -> 5330","passing","EPSG","4326","EPSG","5330","1.0","-1.0","0.0","-8196705.156102","789820.842694","1103.991405","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5331","passing","EPSG","4326","EPSG","5331","1.0","-1.0","0.0","-8196548.068024","789629.424703","1320.943549","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5337","passing","EPSG","4326","EPSG","5337","1.0","-1.0","0.0","4528179.727213","9866656.781317","-106.602413","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5343","passing","EPSG","4326","EPSG","5343","1.0","-1.0","0.0","1.316346709951E7","9671230.891208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5344","passing","EPSG","4326","EPSG","5344","1.0","-1.0","0.0","1.328947315091E7","9704851.838049","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5345","passing","EPSG","4326","EPSG","5345","1.0","-1.0","0.0","1.34882032921E7","9733276.551189","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5346","passing","EPSG","4326","EPSG","5346","1.0","-1.0","0.0","1.3750656290095E7","9757339.480787","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5347","passing","EPSG","4326","EPSG","5347","1.0","-1.0","0.0","1.406889415915E7","9777744.441021","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5348","passing","EPSG","4326","EPSG","5348","1.0","-1.0","0.0","1.4435929604234E7","9795082.873512","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5349","passing","EPSG","4326","EPSG","5349","1.0","-1.0","0.0","1.4845622388712E7","9809849.986231","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5343","passing","EPSG","4326","EPSG","5343","1.0","-1.0","0.0","13715628.232019","9609466.563341","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5344","passing","EPSG","4326","EPSG","5344","1.0","-1.0","0.0","13630116.425822","9670247.632028","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5345","passing","EPSG","4326","EPSG","5345","1.0","-1.0","0.0","13698671.075148","9713633.023942","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5346","passing","EPSG","4326","EPSG","5346","1.0","-1.0","0.0","13880160.435236","9746157.213300","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5347","passing","EPSG","4326","EPSG","5347","1.0","-1.0","0.0","14147910.338344","9771406.084630","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5348","passing","EPSG","4326","EPSG","5348","1.0","-1.0","0.0","14483559.356534","9791525.214552","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5349","passing","EPSG","4326","EPSG","5349","1.0","-1.0","0.0","14873889.490377","9807881.931398","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5355","passing","EPSG","4326","EPSG","5355","1.0","-1.0","0.0","9876408.371062","9744293.807476","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5356","passing","EPSG","4326","EPSG","5356","1.0","-1.0","0.0","1.1625664379252E7","9668414.590036","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5357","passing","EPSG","4326","EPSG","5357","1.0","-1.0","0.0","8480365.932792","9789643.661527","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5361","passing","EPSG","4326","EPSG","5361","1.0","-1.0","0.0","1.1625664379252E7","9668414.590036","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5362","passing","EPSG","4326","EPSG","5362","1.0","-1.0","0.0","1.4018825808604E7","9515984.716577","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5367","passing","EPSG","4326","EPSG","5367","1.0","-1.0","0.0","1.6609414000793E7","-539612.639788","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5367","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5367","1.0","-1.0","0.0","1.6609414000793E7","-539612.639788","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5382","passing","EPSG","4326","EPSG","5382","1.0","-1.0","0.0","8480365.932696","9789643.661529","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5383","passing","EPSG","4326","EPSG","5383","1.0","-1.0","0.0","7306321.314744","9819497.181068","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5387","passing","EPSG","4326","EPSG","5387","1.0","-1.0","0.0","1.4018825808604E7","9515984.716577","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2082,14 +2082,14 @@ "4326 -> 5396","passing","EPSG","4326","EPSG","5396","1.0","-1.0","0.0","3748089.863294","9874700.984116","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5456","passing","EPSG","4326","EPSG","5456","1.0","-1.0","0.0","1.0069396949192E7","298073.227446","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5457","passing","EPSG","4326","EPSG","5457","1.0","-1.0","0.0","9981290.419504","317555.11392","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5458","passing","EPSG","4326","EPSG","5458","1.0","-1.0","0.0","1.0783926462388E7","704636.324128","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5458","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","5458","1.0","-1.0","0.0","1.0783926462388E7","704636.324128","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5459","passing","EPSG","4326","EPSG","5459","1.0","-1.0","0.0","1.0763253162217E7","678752.868549","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5460","passing","EPSG","4326","EPSG","5460","1.0","-1.0","0.0","1.0610418369162E7","557329.479905","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5461","passing","EPSG","4326","EPSG","5461","1.0","-1.0","0.0","1.0235130039759E7","478378.87619","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5462","passing","EPSG","4326","EPSG","5462","1.0","-1.0","0.0","1.0210066837694E7","371829.165134","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5466","passing","EPSG","4326","EPSG","5466","1.0","-1.0","0.0","1.8433986868757E7","-2417645.641648","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5466","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5466","1.0","-1.0","0.0","1.8433986868757E7","-2417645.641648","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5469","passing","EPSG","4326","EPSG","5469","1.0","-1.0","0.0","9570952.784497","190944.524085","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5472","failing","EPSG","4326","EPSG","5472","1.0","-1.0","0.0","1.0980369203568E7","-150245.280612","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5472","passing","EPSG","4326","EPSG","5472","1.0","-1.0","0.0","1.0980369203568E7","-150245.280612","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5479","passing","EPSG","4326","EPSG","5479","1.0","-1.0","0.0","2585213.174496","-7552437.343099","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5480","passing","EPSG","4326","EPSG","5480","1.0","-1.0","0.0","568936.837406","-9763978.38156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5481","passing","EPSG","4326","EPSG","5481","1.0","-1.0","0.0","-1669284.136119","-1.1868078294819E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2099,7 +2099,7 @@ "4326 -> 5514","passing","EPSG","4326","EPSG","5514","1.0","-1.0","0.0","-3403171.813904","-6866781.451858","158.074317","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5520","passing","EPSG","4326","EPSG","5520","1.0","-1.0","0.0","1277387.834203","-111056.870189","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5523","passing","EPSG","4326","EPSG","5523","1.0","-1.0","0.0","325154.339023","5387574.863316","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5530","failing","EPSG","4326","EPSG","5530","1.0","-1.0","0.0","1.1121377267748E7","9838205.650141","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5530","passing","EPSG","4326","EPSG","5530","1.0","-1.0","0.0","1.1121377267748E7","9838205.650141","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5531","passing","EPSG","4326","EPSG","5531","1.0","-1.0","0.0","8480387.698484","9789718.016158","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5532","passing","EPSG","4326","EPSG","5532","1.0","-1.0","0.0","7306338.55404","9819561.455913","43.101417","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5533","passing","EPSG","4326","EPSG","5533","1.0","-1.0","0.0","6282904.939266","9840380.305315","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2113,34 +2113,34 @@ "4326 -> 5551","passing","EPSG","4326","EPSG","5551","1.0","-1.0","0.0","-3528360.482014","-9862407.599484","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5552","passing","EPSG","4326","EPSG","5552","1.0","-1.0","0.0","-2748089.863294","-9870630.869993","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5559","passing","EPSG","4326","EPSG","5559","1.0","-1.0","0.0","1.0783799527899E7","704674.053773","-277.649595","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5562","passing","EPSG","4326","EPSG","5562","1.0","-1.0","0.0","2227101.818314","-117628.224271","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5563","passing","EPSG","4326","EPSG","5563","1.0","-1.0","0.0","2500779.686146","-123021.9434","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5564","passing","EPSG","4326","EPSG","5564","1.0","-1.0","0.0","2736100.373433","-130441.693098","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5565","passing","EPSG","4326","EPSG","5565","1.0","-1.0","0.0","2919578.05322","-140447.416996","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5566","passing","EPSG","4326","EPSG","5566","1.0","-1.0","0.0","-1772898.181686","-117628.224271","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5567","passing","EPSG","4326","EPSG","5567","1.0","-1.0","0.0","-2499220.313854","-123021.9434","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5568","passing","EPSG","4326","EPSG","5568","1.0","-1.0","0.0","-3263899.626567","-130441.693098","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5569","passing","EPSG","4326","EPSG","5569","1.0","-1.0","0.0","-4080421.94678","-140447.416996","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5570","passing","EPSG","4326","EPSG","5570","1.0","-1.0","0.0","5227101.818314","-117628.224271","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5571","passing","EPSG","4326","EPSG","5571","1.0","-1.0","0.0","5868002.071717","-120098.5296","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5572","passing","EPSG","4326","EPSG","5572","1.0","-1.0","0.0","6500779.686146","-123021.9434","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5573","passing","EPSG","4326","EPSG","5573","1.0","-1.0","0.0","7124007.155018","-126448.927388","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5574","passing","EPSG","4326","EPSG","5574","1.0","-1.0","0.0","7736100.373433","-130441.693098","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5575","passing","EPSG","4326","EPSG","5575","1.0","-1.0","0.0","8335288.213048","-135076.651919","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5576","passing","EPSG","4326","EPSG","5576","1.0","-1.0","0.0","8919578.05322","-140447.416996","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5577","passing","EPSG","4326","EPSG","5577","1.0","-1.0","0.0","-1772898.181686","-117628.224271","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5578","passing","EPSG","4326","EPSG","5578","1.0","-1.0","0.0","-2131997.928283","-120098.5296","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5579","passing","EPSG","4326","EPSG","5579","1.0","-1.0","0.0","-2499220.313854","-123021.9434","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5580","passing","EPSG","4326","EPSG","5580","1.0","-1.0","0.0","-2875992.844982","-126448.927388","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5581","passing","EPSG","4326","EPSG","5581","1.0","-1.0","0.0","-3263899.626567","-130441.693098","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5582","passing","EPSG","4326","EPSG","5582","1.0","-1.0","0.0","-3664711.786952","-135076.651919","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5583","passing","EPSG","4326","EPSG","5583","1.0","-1.0","0.0","-4080421.94678","-140447.416996","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5588","passing","EPSG","4326","EPSG","5588","1.0","-1.0","0.0","3.1877552848696E7","-8575947.900939","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5589","passing","EPSG","4326","EPSG","5589","1.0","-1.0","0.0","6.0479502152242E7","-7931979.437137","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5562","passing","EPSG","4326","EPSG","5562","1.0","-1.0","0.0","2227097.794649","-117628.322805","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5563","passing","EPSG","4326","EPSG","5563","1.0","-1.0","0.0","2500745.250524","-123023.020279","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5564","passing","EPSG","4326","EPSG","5564","1.0","-1.0","0.0","2735898.348725","-130449.430062","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5565","passing","EPSG","4326","EPSG","5565","1.0","-1.0","0.0","2918662.321413","-140489.215701","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5566","passing","EPSG","4326","EPSG","5566","1.0","-1.0","0.0","-1772902.205351","-117628.322805","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5567","passing","EPSG","4326","EPSG","5567","1.0","-1.0","0.0","-2499254.749476","-123023.020279","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5568","passing","EPSG","4326","EPSG","5568","1.0","-1.0","0.0","-3264101.651275","-130449.430062","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5569","passing","EPSG","4326","EPSG","5569","1.0","-1.0","0.0","-4081337.678587","-140489.215701","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5570","passing","EPSG","4326","EPSG","5570","1.0","-1.0","0.0","5227097.794649","-117628.322805","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5571","passing","EPSG","4326","EPSG","5571","1.0","-1.0","0.0","5867989.602057","-120098.876939","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5572","passing","EPSG","4326","EPSG","5572","1.0","-1.0","0.0","6500745.250524","-123023.020279","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5573","passing","EPSG","4326","EPSG","5573","1.0","-1.0","0.0","7123920.498398","-126451.938699","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5574","passing","EPSG","4326","EPSG","5574","1.0","-1.0","0.0","7735898.348725","-130449.430062","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5575","passing","EPSG","4326","EPSG","5575","1.0","-1.0","0.0","8334846.345307","-135095.177023","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5576","passing","EPSG","4326","EPSG","5576","1.0","-1.0","0.0","8918662.321413","-140489.215701","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5577","passing","EPSG","4326","EPSG","5577","1.0","-1.0","0.0","-1772902.205351","-117628.322805","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5578","passing","EPSG","4326","EPSG","5578","1.0","-1.0","0.0","-2132010.397943","-120098.876939","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5579","passing","EPSG","4326","EPSG","5579","1.0","-1.0","0.0","-2499254.749476","-123023.020279","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5580","passing","EPSG","4326","EPSG","5580","1.0","-1.0","0.0","-2876079.501602","-126451.938699","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5581","passing","EPSG","4326","EPSG","5581","1.0","-1.0","0.0","-3264101.651275","-130449.430062","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5582","passing","EPSG","4326","EPSG","5582","1.0","-1.0","0.0","-3665153.654693","-135095.177023","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5583","passing","EPSG","4326","EPSG","5583","1.0","-1.0","0.0","-4081337.678587","-140489.215701","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5588","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","5588","1.0","-1.0","0.0","3.1877552848696E7","-8575947.900939","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5589","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","5589","1.0","-1.0","0.0","6.0479502152242E7","-7931979.437137","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5596","passing","EPSG","4326","EPSG","5596","1.0","-1.0","0.0","-156452.534464","-112409.590659","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5623","passing","EPSG","4326","EPSG","5623","1.0","-1.0","0.0","5.2869091045749E7","-1.6822134288657E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5624","passing","EPSG","4326","EPSG","5624","1.0","-1.0","0.0","5.6012268152917E7","-1.6992073725156E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5625","passing","EPSG","4326","EPSG","5625","1.0","-1.0","0.0","6.0959498689223E7","-1.7275323241246E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5623","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","5623","1.0","-1.0","0.0","5.2869091045749E7","-1.6822134288657E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5624","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","5624","1.0","-1.0","0.0","5.6012268152917E7","-1.6992073725156E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5625","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","5625","1.0","-1.0","0.0","6.0959498689223E7","-1.7275323241246E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 5627","passing","EPSG","4326","EPSG","5627","1.0","-1.0","0.0","-56927.729375","-110836.446997","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5629","passing","EPSG","4326","EPSG","5629","1.0","-1.0","0.0","-4967185.609965","9845873.742836","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5631","passing","EPSG","4326","EPSG","5631","1.0","-1.0","0.0","1606760.604609","-111594.833491","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2152,51 +2152,51 @@ "4326 -> 5637","passing","EPSG","4326","EPSG","5637","1.0","-1.0","0.0","2626066.282662","-3523299.317111","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5638","passing","EPSG","4326","EPSG","5638","1.0","-1.0","0.0","3205019.517945","-2404654.630931","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5639","passing","EPSG","4326","EPSG","5639","1.0","-1.0","0.0","2626066.282662","-3523299.317111","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5641","failing","EPSG","4326","EPSG","5641","1.0","-1.0","0.0","9895093.786885","9889486.946569","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5641","passing","EPSG","4326","EPSG","5641","1.0","-1.0","0.0","9895093.786885","9889486.946569","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5643","passing","EPSG","4326","EPSG","5643","1.0","-1.0","0.0","-651904.960543","-6214068.229118","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5644","passing","EPSG","4326","EPSG","5644","1.0","-1.0","0.0","-5950996.913984","9827239.655582","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5646","passing","EPSG","4326","EPSG","5646","1.0","-1.0","0.0","4.0408311065166E7","-1.6548215312486E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5646","passing","EPSG","4326","EPSG","5646","1.0","-1.0","0.0","42372963.889249","-16771908.859956","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 5649","passing","EPSG","4326","EPSG","5649","1.0","-1.0","0.0","3.1277438263523E7","-110597.97252","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5650","passing","EPSG","4326","EPSG","5650","1.0","-1.0","0.0","3.192655237423E7","-113937.032147","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5650","passing","EPSG","4326","EPSG","5650","1.0","-1.0","0.0","31926552.117294","-113937.036743","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5651","passing","EPSG","4326","EPSG","5651","1.0","-1.0","0.0","3.1277438263523E7","-110597.97252","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5652","passing","EPSG","4326","EPSG","5652","1.0","-1.0","0.0","3.1607010790596E7","-111623.60653","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5653","passing","EPSG","4326","EPSG","5653","1.0","-1.0","0.0","3.192655237423E7","-113937.032147","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5654","passing","EPSG","4326","EPSG","5654","1.0","-1.0","0.0","4.0408311065166E7","-1.6548215312486E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5655","passing","EPSG","4326","EPSG","5655","1.0","-1.0","0.0","4.0408311065166E7","-1.6548215312486E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5653","passing","EPSG","4326","EPSG","5653","1.0","-1.0","0.0","31926552.117294","-113937.036743","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5654","passing","EPSG","4326","EPSG","5654","1.0","-1.0","0.0","42372963.889249","-16771908.859956","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5655","passing","EPSG","4326","EPSG","5655","1.0","-1.0","0.0","42372963.889249","-16771908.859956","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 5659","passing","EPSG","4326","EPSG","5659","1.0","-1.0","0.0","-392946.293555","-4111527.722932","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5663","passing","EPSG","4326","EPSG","5663","1.0","-1.0","0.0","1926020.769368","-113907.423756","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5663","passing","EPSG","4326","EPSG","5663","1.0","-1.0","0.0","1926020.512501","-113907.428347","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5664","passing","EPSG","4326","EPSG","5664","1.0","-1.0","0.0","1606760.774275","-111591.535738","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5665","passing","EPSG","4326","EPSG","5665","1.0","-1.0","0.0","1926020.936157","-113904.057349","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5665","passing","EPSG","4326","EPSG","5665","1.0","-1.0","0.0","1926020.679291","-113904.061940","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5666","passing","EPSG","4326","EPSG","5666","1.0","-1.0","0.0","2606757.139676","-111657.546981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5667","passing","EPSG","4326","EPSG","5667","1.0","-1.0","0.0","3268175.410532","-112647.043075","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5668","passing","EPSG","4326","EPSG","5668","1.0","-1.0","0.0","3268175.410532","-112647.043075","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5669","passing","EPSG","4326","EPSG","5669","1.0","-1.0","0.0","3926105.663731","-113971.626991","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5669","passing","EPSG","4326","EPSG","5669","1.0","-1.0","0.0","3926105.407353","-113971.631576","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5670","passing","EPSG","4326","EPSG","5670","1.0","-1.0","0.0","2606760.604609","-111594.833491","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5671","passing","EPSG","4326","EPSG","5671","1.0","-1.0","0.0","3268134.781191","-112583.677635","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5672","passing","EPSG","4326","EPSG","5672","1.0","-1.0","0.0","3926020.769368","-113907.423756","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5672","passing","EPSG","4326","EPSG","5672","1.0","-1.0","0.0","3926020.512501","-113907.428347","-134.804153","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5673","passing","EPSG","4326","EPSG","5673","1.0","-1.0","0.0","2606760.774275","-111591.535738","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5674","passing","EPSG","4326","EPSG","5674","1.0","-1.0","0.0","3268134.949234","-112580.350505","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5675","passing","EPSG","4326","EPSG","5675","1.0","-1.0","0.0","3926020.936157","-113904.057349","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5675","passing","EPSG","4326","EPSG","5675","1.0","-1.0","0.0","3926020.679291","-113904.061940","-133.241138","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5676","passing","EPSG","4326","EPSG","5676","1.0","-1.0","0.0","1942852.593323","-111415.501399","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5677","passing","EPSG","4326","EPSG","5677","1.0","-1.0","0.0","2606770.853728","-112086.713675","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5678","passing","EPSG","4326","EPSG","5678","1.0","-1.0","0.0","3268189.653934","-113079.999334","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5679","passing","EPSG","4326","EPSG","5679","1.0","-1.0","0.0","3926120.495868","-114409.659607","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5679","passing","EPSG","4326","EPSG","5679","1.0","-1.0","0.0","3926120.239514","-114409.664209","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5680","passing","EPSG","4326","EPSG","5680","1.0","-1.0","0.0","1277387.834203","-111056.870189","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5682","passing","EPSG","4326","EPSG","5682","1.0","-1.0","0.0","1942839.357237","-110988.891985","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5683","passing","EPSG","4326","EPSG","5683","1.0","-1.0","0.0","2606757.139676","-111657.546981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5684","passing","EPSG","4326","EPSG","5684","1.0","-1.0","0.0","3268175.410532","-112647.043075","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5685","passing","EPSG","4326","EPSG","5685","1.0","-1.0","0.0","3926105.663731","-113971.626991","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5685","passing","EPSG","4326","EPSG","5685","1.0","-1.0","0.0","3926105.407353","-113971.631576","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5700","passing","EPSG","4326","EPSG","5700","1.0","-1.0","0.0","722561.736479","-9885331.913357","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5836","passing","EPSG","4326","EPSG","5836","1.0","-1.0","0.0","-4079577.277094","-140545.733767","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5837","passing","EPSG","4326","EPSG","5837","1.0","-1.0","0.0","-7068672.129135","-199101.756647","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5842","passing","EPSG","4326","EPSG","5842","1.0","-1.0","0.0","-731474.867088","9887387.177554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5844","passing","EPSG","4326","EPSG","5844","1.0","-1.0","0.0","-2875733.012484","9873462.794034","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5844","passing","EPSG","4326","EPSG","5844","1.0","-1.0","0.0","-2875819.689774","9873459.779438","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5858","passing","EPSG","4326","EPSG","5858","1.0","-1.0","0.0","7306339.329109","9819560.962598","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5875","passing","EPSG","4326","EPSG","5875","1.0","-1.0","0.0","1.4018870379212E7","9516155.569781","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5876","passing","EPSG","4326","EPSG","5876","1.0","-1.0","0.0","1.1625697068445E7","9668531.835079","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5877","passing","EPSG","4326","EPSG","5877","1.0","-1.0","0.0","9876434.720248","9744384.218697","43.595055","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5879","passing","EPSG","4326","EPSG","5879","1.0","-1.0","0.0","-4967358.421418","9846233.706565","127.228808","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5880","failing","EPSG","4326","EPSG","5880","1.0","-1.0","0.0","1.1121359384426E7","9838148.516189","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5880","passing","EPSG","4326","EPSG","5880","1.0","-1.0","0.0","1.1121359384426E7","9838148.516189","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5890","passing","EPSG","4326","EPSG","5890","1.0","-1.0","0.0","-1.2544389192519E7","-218963.12784","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5921","passing","EPSG","4326","EPSG","5921","1.0","-1.0","0.0","1.1784451069194E7","5431623.127119","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 5922","passing","EPSG","4326","EPSG","5922","1.0","-1.0","0.0","8021047.089439","-8741142.248861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2295,12 +2295,12 @@ "4326 -> 6124","passing","EPSG","4326","EPSG","6124","1.0","-1.0","0.0","1.8472791653935E7","1.691798133122E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6125","passing","EPSG","4326","EPSG","6125","1.0","-1.0","0.0","4.8704688061606E7","-4479479.470868","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6141","passing","EPSG","4326","EPSG","6141","1.0","-1.0","0.0","-2.6880029744881E7","1409281.65746","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6204","passing","EPSG","4326","EPSG","6204","1.0","-1.0","0.0","-1772261.486107","-118218.032798","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6204","passing","EPSG","4326","EPSG","6204","1.0","-1.0","0.0","-1772265.500717","-118218.131606","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6210","passing","EPSG","4326","EPSG","6210","1.0","-1.0","0.0","6282890.195008","-159676.099533","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6211","passing","EPSG","4326","EPSG","6211","1.0","-1.0","0.0","5366513.929932","-144620.452142","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6307","passing","EPSG","4326","EPSG","6307","1.0","-1.0","0.0","7952042.830285","-479128.830527","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6312","passing","EPSG","4326","EPSG","6312","1.0","-1.0","0.0","-3563786.1372985374","-3630543.658782971","-13.786709","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6316","passing","EPSG","4326","EPSG","6316","1.0","-1.0","0.0","5227738.513893","-118218.032798","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6312","passing","EPSG","4326","EPSG","6312","1.0","-1.0","0.0","-3563988.213616","-3630551.404544","-13.786709","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6316","passing","EPSG","4326","EPSG","6316","1.0","-1.0","0.0","5227734.499283","-118218.131606","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6328","passing","EPSG","4326","EPSG","6328","1.0","-1.0","0.0","-618308.573583","-1.9883683216619E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6329","passing","EPSG","4326","EPSG","6329","1.0","-1.0","0.0","54603.316023","-1.9885128053335E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6330","passing","EPSG","4326","EPSG","6330","1.0","-1.0","0.0","722561.736479","-1.9885331913357E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2325,8 +2325,8 @@ "4326 -> 6352","passing","EPSG","4326","EPSG","6352","1.0","-1.0","0.0","3.9160440866762E7","1.6959426921844E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6353","passing","EPSG","4326","EPSG","6353","1.0","-1.0","0.0","1.9616403349184E7","1.9792787171974E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6354","passing","EPSG","4326","EPSG","6354","1.0","-1.0","0.0","2.4514276464516E7","1.7857445108058E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6355","passing","EPSG","4326","EPSG","6355","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6356","passing","EPSG","4326","EPSG","6356","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6355","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6355","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6356","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6356","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6362","passing","EPSG","4326","EPSG","6362","1.0","-1.0","0.0","1.3914521879767E7","2781068.978579","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6366","passing","EPSG","4326","EPSG","6366","1.0","-1.0","0.0","9380117.510219","-1.9757704843637E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6367","passing","EPSG","4326","EPSG","6367","1.0","-1.0","0.0","1.0990756729525E7","-1.9694702609941E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2334,16 +2334,16 @@ "4326 -> 6369","passing","EPSG","4326","EPSG","6369","1.0","-1.0","0.0","1.635961359846E7","-1.9271652378892E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6370","passing","EPSG","4326","EPSG","6370","1.0","-1.0","0.0","9821617.197798","-6559044.245001","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6372","passing","EPSG","4326","EPSG","6372","1.0","-1.0","0.0","1.3914521879767E7","2781068.978579","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6381","passing","EPSG","4326","EPSG","6381","1.0","-1.0","0.0","-1972898.181686","-117628.224271","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6382","passing","EPSG","4326","EPSG","6382","1.0","-1.0","0.0","-2331997.928283","-120098.5296","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6383","passing","EPSG","4326","EPSG","6383","1.0","-1.0","0.0","-2699220.313854","-123021.9434","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6384","passing","EPSG","4326","EPSG","6384","1.0","-1.0","0.0","-3075992.844982","-126448.927388","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6385","passing","EPSG","4326","EPSG","6385","1.0","-1.0","0.0","-3463899.626567","-130441.693098","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6386","passing","EPSG","4326","EPSG","6386","1.0","-1.0","0.0","-3864711.786952","-135076.651919","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6387","passing","EPSG","4326","EPSG","6387","1.0","-1.0","0.0","-4280421.94678","-140447.416996","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6381","passing","EPSG","4326","EPSG","6381","1.0","-1.0","0.0","-1972902.205351","-117628.322805","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6382","passing","EPSG","4326","EPSG","6382","1.0","-1.0","0.0","-2332010.397943","-120098.876939","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6383","passing","EPSG","4326","EPSG","6383","1.0","-1.0","0.0","-2699254.749476","-123023.020279","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6384","passing","EPSG","4326","EPSG","6384","1.0","-1.0","0.0","-3076079.501602","-126451.938699","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6385","passing","EPSG","4326","EPSG","6385","1.0","-1.0","0.0","-3464101.651275","-130449.430062","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6386","passing","EPSG","4326","EPSG","6386","1.0","-1.0","0.0","-3865153.654693","-135095.177023","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6387","passing","EPSG","4326","EPSG","6387","1.0","-1.0","0.0","-4281337.678587","-140489.215701","-131.901969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6391","passing","EPSG","4326","EPSG","6391","1.0","-1.0","0.0","3.3473213330984E7","1761194.810999","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6393","passing","EPSG","4326","EPSG","6393","1.0","-1.0","0.0","7104914.414304","1.1599667194798E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6394","failing","EPSG","4326","EPSG","6394","1.0","-1.0","0.0","2.1299477541839E7","-9945672.888623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6394","passing","EPSG","4326","EPSG","6394","1.0","-1.0","0.0","2.1299477541839E7","-9945672.888623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6403","passing","EPSG","4326","EPSG","6403","1.0","-1.0","0.0","8328717.21702","1.4116821977524E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6410","passing","EPSG","4326","EPSG","6410","1.0","-1.0","0.0","1.1131856190038E7","1298569.855381","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6411","passing","EPSG","4326","EPSG","6411","1.0","-1.0","0.0","3.6521764850117E7","4260391.267194","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -2370,25 +2370,25 @@ "4326 -> 6432","passing","EPSG","4326","EPSG","6432","1.0","-1.0","0.0","4.1300893148666E7","1.0805178197923E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6433","passing","EPSG","4326","EPSG","6433","1.0","-1.0","0.0","9609648.833132","-675630.039935","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6434","passing","EPSG","4326","EPSG","6434","1.0","-1.0","0.0","3.152765621337E7","-2216629.556017","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6435","passing","EPSG","4326","EPSG","6435","1.0","-1.0","0.0","1.2960400053583E7","-4584092.979322","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6436","passing","EPSG","4326","EPSG","6436","1.0","-1.0","0.0","4.2520912509465E7","-1.5039645049659E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6437","passing","EPSG","4326","EPSG","6437","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6438","passing","EPSG","4326","EPSG","6438","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6435","passing","EPSG","4326","EPSG","6435","1.0","-1.0","0.0","13929727.098412","-4708319.149141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6436","passing","EPSG","4326","EPSG","6436","1.0","-1.0","0.0","45701112.989039","-15447210.408475","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6437","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6437","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6438","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6438","1.0","-1.0","0.0","4.9309319950207E7","-1.0385647534347E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6439","passing","EPSG","4326","EPSG","6439","1.0","-1.0","0.0","1.0071974621001E7","811782.97242","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6440","passing","EPSG","4326","EPSG","6440","1.0","-1.0","0.0","1.0550650155667E7","427782.799905","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6441","passing","EPSG","4326","EPSG","6441","1.0","-1.0","0.0","3.461492471905E7","1403484.069356","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6442","passing","EPSG","4326","EPSG","6442","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6443","passing","EPSG","4326","EPSG","6443","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6444","passing","EPSG","4326","EPSG","6444","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6445","passing","EPSG","4326","EPSG","6445","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6446","passing","EPSG","4326","EPSG","6446","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6447","passing","EPSG","4326","EPSG","6447","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6454","passing","EPSG","4326","EPSG","6454","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6455","passing","EPSG","4326","EPSG","6455","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6458","passing","EPSG","4326","EPSG","6458","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6459","passing","EPSG","4326","EPSG","6459","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6460","passing","EPSG","4326","EPSG","6460","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6461","passing","EPSG","4326","EPSG","6461","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6442","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6442","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6443","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6443","1.0","-1.0","0.0","5.0662786479725E7","-1.0453939851278E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6444","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6444","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6445","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6445","1.0","-1.0","0.0","5.0890745624323E7","-1.2525113880594E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6446","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6446","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6447","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6447","1.0","-1.0","0.0","5.5395061228234E7","-1.2675189538692E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6454","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6454","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6455","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6455","1.0","-1.0","0.0","6.0725757812949E7","-1.547432309973E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6458","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6458","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6459","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6459","1.0","-1.0","0.0","5.5710398969693E7","-1.4709189473654E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6460","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6460","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6461","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6461","1.0","-1.0","0.0","6.0600068996002E7","-1.4836438466231E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6462","passing","EPSG","4326","EPSG","6462","1.0","-1.0","0.0","1.2493754958641E7","2708853.657912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6463","passing","EPSG","4326","EPSG","6463","1.0","-1.0","0.0","4.0989927726809E7","8887297.375966","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6464","passing","EPSG","4326","EPSG","6464","1.0","-1.0","0.0","1.1460553625321E7","1661745.543903","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2407,13 +2407,13 @@ "4326 -> 6477","passing","EPSG","4326","EPSG","6477","1.0","-1.0","0.0","3.8398005554391E7","4076115.015849","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6478","passing","EPSG","4326","EPSG","6478","1.0","-1.0","0.0","1.1569510967566E7","1074486.392019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6479","passing","EPSG","4326","EPSG","6479","1.0","-1.0","0.0","3.7957637232722E7","3525210.77115","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6480","passing","EPSG","4326","EPSG","6480","1.0","-1.0","0.0","1.1324154703457E7","-5116571.085152","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6481","passing","EPSG","4326","EPSG","6481","1.0","-1.0","0.0","1.1180772997795E7","-5141094.694271","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6482","passing","EPSG","4326","EPSG","6482","1.0","-1.0","0.0","1.1480217073422E7","-5055926.342392","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6483","passing","EPSG","4326","EPSG","6483","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6484","passing","EPSG","4326","EPSG","6484","1.0","-1.0","0.0","3.5925354189983E7","-1.6825140356933E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6485","passing","EPSG","4326","EPSG","6485","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6486","passing","EPSG","4326","EPSG","6486","1.0","-1.0","0.0","3.9435008562586E7","-1.6579877771445E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6480","passing","EPSG","4326","EPSG","6480","1.0","-1.0","0.0","11671689.678538","-5152007.650725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6481","passing","EPSG","4326","EPSG","6481","1.0","-1.0","0.0","11465183.093366","-5169053.574542","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6482","passing","EPSG","4326","EPSG","6482","1.0","-1.0","0.0","11905005.691833","-5100943.641776","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6483","passing","EPSG","4326","EPSG","6483","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6484","passing","EPSG","4326","EPSG","6484","1.0","-1.0","0.0","36956734.366491","-16928377.279884","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6485","passing","EPSG","4326","EPSG","6485","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6486","passing","EPSG","4326","EPSG","6486","1.0","-1.0","0.0","40782744.163849","-16721767.036607","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6487","passing","EPSG","4326","EPSG","6487","1.0","-1.0","0.0","9969626.935369","-276195.787551","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6488","passing","EPSG","4326","EPSG","6488","1.0","-1.0","0.0","3.2708684370125E7","-906152.346323","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6489","passing","EPSG","4326","EPSG","6489","1.0","-1.0","0.0","9582487.179385","-1098419.84739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2433,24 +2433,24 @@ "4326 -> 6503","passing","EPSG","4326","EPSG","6503","1.0","-1.0","0.0","3.9057025184185E7","6357392.570651","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6504","passing","EPSG","4326","EPSG","6504","1.0","-1.0","0.0","1.1867181831423E7","1975209.580327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6505","passing","EPSG","4326","EPSG","6505","1.0","-1.0","0.0","3.8934245725294E7","6480333.431424","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6506","passing","EPSG","4326","EPSG","6506","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6507","passing","EPSG","4326","EPSG","6507","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6506","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6506","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6507","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","6507","1.0","-1.0","0.0","6.1587808741621E7","-1.2917153900627E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6514","passing","EPSG","4326","EPSG","6514","1.0","-1.0","0.0","1.2324918268659E7","4366651.863837","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6515","passing","EPSG","4326","EPSG","6515","1.0","-1.0","0.0","4.0436083558584E7","1.432628564251E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6516","passing","EPSG","4326","EPSG","6516","1.0","-1.0","0.0","1.1859582682383E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6517","passing","EPSG","4326","EPSG","6517","1.0","-1.0","0.0","3.8909314183819E7","8411551.254754","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6524","passing","EPSG","4326","EPSG","6524","1.0","-1.0","0.0","1.1862074088415E7","-5033721.498112","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6525","passing","EPSG","4326","EPSG","6525","1.0","-1.0","0.0","3.8917488071742E7","-1.6514801281721E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6526","passing","EPSG","4326","EPSG","6526","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6527","passing","EPSG","4326","EPSG","6527","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6534","passing","EPSG","4326","EPSG","6534","1.0","-1.0","0.0","1.3411859131067E7","-4823650.932015","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6535","passing","EPSG","4326","EPSG","6535","1.0","-1.0","0.0","4.4002074498844E7","-1.5825594766119E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6536","passing","EPSG","4326","EPSG","6536","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6537","passing","EPSG","4326","EPSG","6537","1.0","-1.0","0.0","4.1349698805148E7","-1.5298404466869E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6524","passing","EPSG","4326","EPSG","6524","1.0","-1.0","0.0","12385210.049457","-5091569.861759","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6525","passing","EPSG","4326","EPSG","6525","1.0","-1.0","0.0","40633809.970593","-16704592.121454","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6526","passing","EPSG","4326","EPSG","6526","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6527","passing","EPSG","4326","EPSG","6527","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6534","passing","EPSG","4326","EPSG","6534","1.0","-1.0","0.0","14594179.389600","-4984192.934623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6535","passing","EPSG","4326","EPSG","6535","1.0","-1.0","0.0","47881070.213714","-16352306.319676","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6536","passing","EPSG","4326","EPSG","6536","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6537","passing","EPSG","4326","EPSG","6537","1.0","-1.0","0.0","44077778.712423","-15634150.560445","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6538","passing","EPSG","4326","EPSG","6538","1.0","-1.0","0.0","9687036.766689","-681351.175466","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6539","passing","EPSG","4326","EPSG","6539","1.0","-1.0","0.0","3.1781553125378E7","-2235399.648173","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6540","passing","EPSG","4326","EPSG","6540","1.0","-1.0","0.0","1.4237282921893E7","-4857039.255734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6541","passing","EPSG","4326","EPSG","6541","1.0","-1.0","0.0","4.6710152386576E7","-1.5935136291522E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6540","passing","EPSG","4326","EPSG","6540","1.0","-1.0","0.0","15922864.775165","-5116346.421875","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6541","passing","EPSG","4326","EPSG","6541","1.0","-1.0","0.0","52240265.516853","-16785879.885769","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6542","passing","EPSG","4326","EPSG","6542","1.0","-1.0","0.0","1.0212602585283E7","-17652.610423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6543","passing","EPSG","4326","EPSG","6543","1.0","-1.0","0.0","3.3505846979267E7","-57915.272695","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6544","passing","EPSG","4326","EPSG","6544","1.0","-1.0","0.0","1.2048562892627E7","2902217.376716","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2476,8 +2476,8 @@ "4326 -> 6564","passing","EPSG","4326","EPSG","6564","1.0","-1.0","0.0","1.0308283550952E7","-220512.975756","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6565","passing","EPSG","4326","EPSG","6565","1.0","-1.0","0.0","3.3819760283415E7","-723466.321292","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6566","passing","EPSG","4326","EPSG","6566","1.0","-1.0","0.0","7952042.830285","-479128.830527","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6567","passing","EPSG","4326","EPSG","6567","1.0","-1.0","0.0","1.1612262480686E7","-4874528.079031","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6568","passing","EPSG","4326","EPSG","6568","1.0","-1.0","0.0","3.8097897822019E7","-1.5992514205953E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6567","passing","EPSG","4326","EPSG","6567","1.0","-1.0","0.0","12121505.329748","-4930522.093156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6568","passing","EPSG","4326","EPSG","6568","1.0","-1.0","0.0","39768638.735981","-16176221.233964","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6569","passing","EPSG","4326","EPSG","6569","1.0","-1.0","0.0","1.0339890150895E7","211156.727684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6570","passing","EPSG","4326","EPSG","6570","1.0","-1.0","0.0","3.3923524117109E7","692771.416287","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6571","passing","EPSG","4326","EPSG","6571","1.0","-1.0","0.0","1.1994495041044E7","2695771.443861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2498,8 +2498,8 @@ "4326 -> 6586","passing","EPSG","4326","EPSG","6586","1.0","-1.0","0.0","3.7621725229221E7","2.1564160793856E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6587","passing","EPSG","4326","EPSG","6587","1.0","-1.0","0.0","1.1820487659605E7","5766686.935604","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6588","passing","EPSG","4326","EPSG","6588","1.0","-1.0","0.0","3.8781049929886E7","1.8919538720896E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6589","passing","EPSG","4326","EPSG","6589","1.0","-1.0","0.0","1.2316477845608E7","-5043906.115058","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6590","passing","EPSG","4326","EPSG","6590","1.0","-1.0","0.0","4.0408311065166E7","-1.6548215312486E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6589","passing","EPSG","4326","EPSG","6589","1.0","-1.0","0.0","12915305.224043","-5112088.044691","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6590","passing","EPSG","4326","EPSG","6590","1.0","-1.0","0.0","42372963.889249","-16771908.859956","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6591","passing","EPSG","4326","EPSG","6591","1.0","-1.0","0.0","9766541.186236","106793.672654","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6592","passing","EPSG","4326","EPSG","6592","1.0","-1.0","0.0","1.319415649693E7","1855008.196457","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6593","passing","EPSG","4326","EPSG","6593","1.0","-1.0","0.0","4.3287828440678E7","6085972.724876","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" @@ -2531,13 +2531,13 @@ "4326 -> 6634","passing","EPSG","4326","EPSG","6634","1.0","-1.0","0.0","2772080.292418","-1.9878255185912E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6635","passing","EPSG","4326","EPSG","6635","1.0","-1.0","0.0","3498135.612029","-1.9872858071015E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6636","passing","EPSG","4326","EPSG","6636","1.0","-1.0","0.0","1392989.214538","-9884306.27929","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6646","passing","EPSG","4326","EPSG","6646","1.0","-1.0","0.0","-4896771.587929","-3368320.183843","-172.547504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6646","passing","EPSG","4326","EPSG","6646","1.0","-1.0","0.0","-4901477.726460","-3368582.212798","-172.547504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6688","passing","EPSG","4326","EPSG","6688","1.0","-1.0","0.0","-7480365.932792","-1.9785573547405E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6689","passing","EPSG","4326","EPSG","6689","1.0","-1.0","0.0","-6306321.314799","-1.9815427066946E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6690","passing","EPSG","4326","EPSG","6690","1.0","-1.0","0.0","-5282890.195008","-1.9836253786344E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6691","passing","EPSG","4326","EPSG","6691","1.0","-1.0","0.0","-4366513.929932","-1.9851309433735E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6692","passing","EPSG","4326","EPSG","6692","1.0","-1.0","0.0","-3528360.482014","-1.9862407599484E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6703","passing","EPSG","4326","EPSG","6703","1.0","-1.0","0.0","9065466.60141","9775868.400305","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6703","passing","EPSG","4326","EPSG","6703","1.0","-1.0","0.0","9144451.174081","9769532.579263","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6707","passing","EPSG","4326","EPSG","6707","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6708","passing","EPSG","4326","EPSG","6708","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6709","passing","EPSG","4326","EPSG","6709","1.0","-1.0","0.0","-1772080.292418","-117674.699966","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2572,7 +2572,7 @@ "4326 -> 6855","passing","EPSG","4326","EPSG","6855","1.0","-1.0","0.0","3.9627436925249E7","1.9572181838775E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 6867","passing","EPSG","4326","EPSG","6867","1.0","-1.0","0.0","1.2428695502962E7","5736547.563465","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6868","passing","EPSG","4326","EPSG","6868","1.0","-1.0","0.0","4.0776560049083E7","1.8820694105857E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6870","passing","EPSG","4326","EPSG","6870","1.0","-1.0","0.0","-1654864.258411","-116991.03987","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6870","passing","EPSG","4326","EPSG","6870","1.0","-1.0","0.0","-1654866.936011","-116991.102518","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6875","passing","EPSG","4326","EPSG","6875","1.0","-1.0","0.0","5769880.297331","-112488.898768","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6876","passing","EPSG","4326","EPSG","6876","1.0","-1.0","0.0","1768032.34585","-112657.885597","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6879","passing","EPSG","4326","EPSG","6879","1.0","-1.0","0.0","1.1431777681828E7","1297424.634259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2590,8 +2590,8 @@ "4326 -> 6932","passing","EPSG","4326","EPSG","6932","1.0","-1.0","0.0","155873.556203","8929990.054097","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6933","passing","EPSG","4326","EPSG","6933","1.0","-1.0","0.0","96486.280251","-127566.985295","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 6962","passing","EPSG","4326","EPSG","6962","1.0","-1.0","0.0","-2677190.737666","-4766506.168209","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6984","passing","EPSG","4326","EPSG","6984","1.0","-1.0","0.0","-3837638.237021","-3019405.091929","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6991","passing","EPSG","4326","EPSG","6991","1.0","-1.0","0.0","-3837638.237021","-3019405.091929","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6984","passing","EPSG","4326","EPSG","6984","1.0","-1.0","0.0","-3837999.426858","-3019419.896701","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6991","passing","EPSG","4326","EPSG","6991","1.0","-1.0","0.0","-3837999.426858","-3019419.896701","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7005","passing","EPSG","4326","EPSG","7005","1.0","-1.0","0.0","-4079520.922659","-141015.654399","139.091251","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7006","passing","EPSG","4326","EPSG","7006","1.0","-1.0","0.0","-4967162.984917","-154643.706977","139.091251","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7007","passing","EPSG","4326","EPSG","7007","1.0","-1.0","0.0","-5951028.442604","-173344.198069","139.091251","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2621,226 +2621,226 @@ "4326 -> 7124","passing","EPSG","4326","EPSG","7124","1.0","-1.0","0.0","3.8442698679745E7","1.1798738834768E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7126","passing","EPSG","4326","EPSG","7126","1.0","-1.0","0.0","3.9008939778082E7","1.4331434109575E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7127","passing","EPSG","4326","EPSG","7127","1.0","-1.0","0.0","3.9113941941547E7","1.2682964330326E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7142","passing","EPSG","4326","EPSG","7142","1.0","-1.0","0.0","-3887709.343918","-3519729.207075","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7257","passing","EPSG","4326","EPSG","7257","1.0","-1.0","0.0","1.6785126882719E7","-5017818.325119","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7258","passing","EPSG","4326","EPSG","7258","1.0","-1.0","0.0","5.5069203781053E7","-1.6462625621663E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7259","passing","EPSG","4326","EPSG","7259","1.0","-1.0","0.0","1.6831542894834E7","-5059205.696646","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7260","passing","EPSG","4326","EPSG","7260","1.0","-1.0","0.0","5.5221486980802E7","-1.6598410689745E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7261","passing","EPSG","4326","EPSG","7261","1.0","-1.0","0.0","1.7209011773599E7","-4869004.979394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7262","passing","EPSG","4326","EPSG","7262","1.0","-1.0","0.0","5.6459899460548E7","-1.5974393836561E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7263","passing","EPSG","4326","EPSG","7263","1.0","-1.0","0.0","1.7920662241704E7","-5070164.800854","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7264","passing","EPSG","4326","EPSG","7264","1.0","-1.0","0.0","5.8794706037992E7","-1.6634365684135E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7265","passing","EPSG","4326","EPSG","7265","1.0","-1.0","0.0","1.6995556996618E7","-4973833.522826","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7266","passing","EPSG","4326","EPSG","7266","1.0","-1.0","0.0","5.575958991307E7","-1.631831881614E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7267","passing","EPSG","4326","EPSG","7267","1.0","-1.0","0.0","1.7523740507246E7","-4953264.495864","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7268","passing","EPSG","4326","EPSG","7268","1.0","-1.0","0.0","5.7492471980857E7","-1.6250835266847E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7269","passing","EPSG","4326","EPSG","7269","1.0","-1.0","0.0","1.7426092740471E7","-4881137.56991","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7270","passing","EPSG","4326","EPSG","7270","1.0","-1.0","0.0","5.7172105932695E7","-1.6014198843947E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7271","passing","EPSG","4326","EPSG","7271","1.0","-1.0","0.0","1.7597172046532E7","-5046196.751334","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7272","passing","EPSG","4326","EPSG","7272","1.0","-1.0","0.0","5.7733388622665E7","-1.6555730508335E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7273","passing","EPSG","4326","EPSG","7273","1.0","-1.0","0.0","1.7474745528931E7","-5055963.015421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7274","passing","EPSG","4326","EPSG","7274","1.0","-1.0","0.0","5.7331727622834E7","-1.6587771993094E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7275","passing","EPSG","4326","EPSG","7275","1.0","-1.0","0.0","1.7089819461183E7","-4768023.578631","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7276","passing","EPSG","4326","EPSG","7276","1.0","-1.0","0.0","5.6068849348899E7","-1.5643090690892E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7277","passing","EPSG","4326","EPSG","7277","1.0","-1.0","0.0","1.78452819983E7","-4921489.997195","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7278","passing","EPSG","4326","EPSG","7278","1.0","-1.0","0.0","5.8547396022755E7","-1.6146588432464E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7279","passing","EPSG","4326","EPSG","7279","1.0","-1.0","0.0","1.7572698539083E7","-5017078.450975","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7280","passing","EPSG","4326","EPSG","7280","1.0","-1.0","0.0","5.7653095123641E7","-1.6460198217908E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7281","passing","EPSG","4326","EPSG","7281","1.0","-1.0","0.0","1.7523550392945E7","-4786686.501065","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7282","passing","EPSG","4326","EPSG","7282","1.0","-1.0","0.0","5.7491848247519E7","-1.5704320628911E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7283","passing","EPSG","4326","EPSG","7283","1.0","-1.0","0.0","1.7820166795698E7","-4842323.437199","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7284","passing","EPSG","4326","EPSG","7284","1.0","-1.0","0.0","5.8464997228886E7","-1.5886856143545E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7285","passing","EPSG","4326","EPSG","7285","1.0","-1.0","0.0","1.6761871303016E7","-4805573.850295","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7286","passing","EPSG","4326","EPSG","7286","1.0","-1.0","0.0","5.4992906099979E7","-1.5766286873842E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7287","passing","EPSG","4326","EPSG","7287","1.0","-1.0","0.0","1.7113811694569E7","-4874869.716826","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7288","passing","EPSG","4326","EPSG","7288","1.0","-1.0","0.0","5.6147563867932E7","-1.5993635062621E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7289","passing","EPSG","4326","EPSG","7289","1.0","-1.0","0.0","1.6785159971848E7","-5095567.615196","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7290","passing","EPSG","4326","EPSG","7290","1.0","-1.0","0.0","5.506931234097E7","-1.6717708084189E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7291","passing","EPSG","4326","EPSG","7291","1.0","-1.0","0.0","1.7745434498304E7","-4810324.07887","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7292","passing","EPSG","4326","EPSG","7292","1.0","-1.0","0.0","5.821981301652E7","-1.5781871582092E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7293","passing","EPSG","4326","EPSG","7293","1.0","-1.0","0.0","1.7209130553593E7","-5052246.981052","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7294","passing","EPSG","4326","EPSG","7294","1.0","-1.0","0.0","5.6460289157912E7","-1.6575580303668E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7295","passing","EPSG","4326","EPSG","7295","1.0","-1.0","0.0","1.6831659032034E7","-4876024.85471","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7296","passing","EPSG","4326","EPSG","7296","1.0","-1.0","0.0","5.5221868007599E7","-1.5997424877493E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7297","passing","EPSG","4326","EPSG","7297","1.0","-1.0","0.0","1.7920591521106E7","-5014623.748948","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7298","passing","EPSG","4326","EPSG","7298","1.0","-1.0","0.0","5.8794474015497E7","-1.6452144749672E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7299","passing","EPSG","4326","EPSG","7299","1.0","-1.0","0.0","1.7426109926048E7","-5092113.039051","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7300","passing","EPSG","4326","EPSG","7300","1.0","-1.0","0.0","5.7172162315709E7","-1.6706374195619E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7301","passing","EPSG","4326","EPSG","7301","1.0","-1.0","0.0","1.8097602234827E7","-4824918.998251","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7302","passing","EPSG","4326","EPSG","7302","1.0","-1.0","0.0","5.9375216665429E7","-1.5829755080094E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7303","passing","EPSG","4326","EPSG","7303","1.0","-1.0","0.0","1.7137558486681E7","-5014967.353227","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7304","passing","EPSG","4326","EPSG","7304","1.0","-1.0","0.0","5.6225473135054E7","-1.6453272058046E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7305","passing","EPSG","4326","EPSG","7305","1.0","-1.0","0.0","1.72811094841E7","-4972973.101316","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7306","passing","EPSG","4326","EPSG","7306","1.0","-1.0","0.0","5.6696440032418E7","-1.6315495916566E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7307","passing","EPSG","4326","EPSG","7307","1.0","-1.0","0.0","1.7185277077624E7","-4939893.579411","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7308","passing","EPSG","4326","EPSG","7308","1.0","-1.0","0.0","5.638202987884E7","-1.6206967518451E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7309","passing","EPSG","4326","EPSG","7309","1.0","-1.0","0.0","1.7353326903063E7","-4760492.303763","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7310","passing","EPSG","4326","EPSG","7310","1.0","-1.0","0.0","5.6933373347798E7","-1.5618381833262E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7311","passing","EPSG","4326","EPSG","7311","1.0","-1.0","0.0","1.7019216897323E7","-4941845.063132","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7312","passing","EPSG","4326","EPSG","7312","1.0","-1.0","0.0","5.5837214103969E7","-1.6213370011293E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7313","passing","EPSG","4326","EPSG","7313","1.0","-1.0","0.0","1.7353395354522E7","-5026963.859686","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7314","passing","EPSG","4326","EPSG","7314","1.0","-1.0","0.0","5.6933597925628E7","-1.6492630596319E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7315","passing","EPSG","4326","EPSG","7315","1.0","-1.0","0.0","1.7042682560348E7","-5043039.665224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7316","passing","EPSG","4326","EPSG","7316","1.0","-1.0","0.0","5.591420103341E7","-1.6545372634989E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7317","passing","EPSG","4326","EPSG","7317","1.0","-1.0","0.0","1.7256876386175E7","-4838346.274556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7318","passing","EPSG","4326","EPSG","7318","1.0","-1.0","0.0","5.6616935276975E7","-1.5873807735774E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7319","passing","EPSG","4326","EPSG","7319","1.0","-1.0","0.0","1.7820325014351E7","-5092183.722245","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7320","passing","EPSG","4326","EPSG","7320","1.0","-1.0","0.0","5.8465516317917E7","-1.67066060954E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7321","passing","EPSG","4326","EPSG","7321","1.0","-1.0","0.0","1.6808406045484E7","-4991342.17305","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7322","passing","EPSG","4326","EPSG","7322","1.0","-1.0","0.0","5.5145578834227E7","-1.6375761779416E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7323","passing","EPSG","4326","EPSG","7323","1.0","-1.0","0.0","1.6971854345882E7","-4805952.839579","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7324","passing","EPSG","4326","EPSG","7324","1.0","-1.0","0.0","5.5681825466448E7","-1.5767530274518E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7325","passing","EPSG","4326","EPSG","7325","1.0","-1.0","0.0","1.7185090686287E7","-4845469.6723","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7326","passing","EPSG","4326","EPSG","7326","1.0","-1.0","0.0","5.6381418359926E7","-1.5897178416537E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7327","passing","EPSG","4326","EPSG","7327","1.0","-1.0","0.0","1.7353395354522E7","-4910377.404406","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7328","passing","EPSG","4326","EPSG","7328","1.0","-1.0","0.0","5.6933597925628E7","-1.6110129867622E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7329","passing","EPSG","4326","EPSG","7329","1.0","-1.0","0.0","1.7996101784756E7","-4846833.422274","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7330","passing","EPSG","4326","EPSG","7330","1.0","-1.0","0.0","5.9042210605486E7","-1.590165265291E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7331","passing","EPSG","4326","EPSG","7331","1.0","-1.0","0.0","1.7019116226351E7","-5108387.760381","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7332","passing","EPSG","4326","EPSG","7332","1.0","-1.0","0.0","5.5836883819286E7","-1.6759768843849E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7333","passing","EPSG","4326","EPSG","7333","1.0","-1.0","0.0","1.7971023659486E7","-5100802.256602","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7334","passing","EPSG","4326","EPSG","7334","1.0","-1.0","0.0","5.8959933456165E7","-1.6734882070201E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7335","passing","EPSG","4326","EPSG","7335","1.0","-1.0","0.0","1.764647302465E7","-5104514.412299","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7336","passing","EPSG","4326","EPSG","7336","1.0","-1.0","0.0","5.7895136915039E7","-1.6747061034351E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7337","passing","EPSG","4326","EPSG","7337","1.0","-1.0","0.0","1.75236022423E7","-4881059.083851","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7338","passing","EPSG","4326","EPSG","7338","1.0","-1.0","0.0","5.7492018356611E7","-1.6013941344268E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7339","passing","EPSG","4326","EPSG","7339","1.0","-1.0","0.0","1.7745627054233E7","-4949146.881439","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7340","passing","EPSG","4326","EPSG","7340","1.0","-1.0","0.0","5.8220444760428E7","-1.6237326060189E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7341","passing","EPSG","4326","EPSG","7341","1.0","-1.0","0.0","1.7720703733488E7","-4914403.332447","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7342","passing","EPSG","4326","EPSG","7342","1.0","-1.0","0.0","5.8138675498951E7","-1.6123338266535E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7343","passing","EPSG","4326","EPSG","7343","1.0","-1.0","0.0","1.7945723569145E7","-4977190.42251","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7344","passing","EPSG","4326","EPSG","7344","1.0","-1.0","0.0","5.8876928076436E7","-1.6329332244518E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7345","passing","EPSG","4326","EPSG","7345","1.0","-1.0","0.0","1.762168808651E7","-4758906.960034","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7346","passing","EPSG","4326","EPSG","7346","1.0","-1.0","0.0","5.7813821663825E7","-1.5613180584711E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7347","passing","EPSG","4326","EPSG","7347","1.0","-1.0","0.0","1.7920414719611E7","-4781441.184756","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7348","passing","EPSG","4326","EPSG","7348","1.0","-1.0","0.0","5.8793893959258E7","-1.568711162032E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7349","passing","EPSG","4326","EPSG","7349","1.0","-1.0","0.0","1.8251246793074E7","-4789412.663278","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7350","passing","EPSG","4326","EPSG","7350","1.0","-1.0","0.0","5.9879298853611E7","-1.5713264712773E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7351","passing","EPSG","4326","EPSG","7351","1.0","-1.0","0.0","1.6831758578206E7","-4926017.577051","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7352","passing","EPSG","4326","EPSG","7352","1.0","-1.0","0.0","5.5222194601997E7","-1.6161442667376E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7353","passing","EPSG","4326","EPSG","7353","1.0","-1.0","0.0","1.6948526910005E7","-4843565.841971","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7354","passing","EPSG","4326","EPSG","7354","1.0","-1.0","0.0","5.560529203724E7","-1.5890932266533E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7355","passing","EPSG","4326","EPSG","7355","1.0","-1.0","0.0","1.7233025322141E7","-4903661.963033","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7356","passing","EPSG","4326","EPSG","7356","1.0","-1.0","0.0","5.6538683911057E7","-1.6088097623716E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7357","passing","EPSG","4326","EPSG","7357","1.0","-1.0","0.0","1.7795130631267E7","-4763180.715586","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7358","passing","EPSG","4326","EPSG","7358","1.0","-1.0","0.0","5.8382857746082E7","-1.5627202064386E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7359","passing","EPSG","4326","EPSG","7359","1.0","-1.0","0.0","1.6808455748814E7","-5124625.096184","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7360","passing","EPSG","4326","EPSG","7360","1.0","-1.0","0.0","5.5145741902567E7","-1.6813040836396E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7361","passing","EPSG","4326","EPSG","7361","1.0","-1.0","0.0","1.8021454769327E7","-4903803.960871","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7362","passing","EPSG","4326","EPSG","7362","1.0","-1.0","0.0","5.9125389522367E7","-1.6088563494957E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7363","passing","EPSG","4326","EPSG","7363","1.0","-1.0","0.0","1.7720703733488E7","-5030986.183175","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7364","passing","EPSG","4326","EPSG","7364","1.0","-1.0","0.0","5.8138675498951E7","-1.6505827169299E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7365","passing","EPSG","4326","EPSG","7365","1.0","-1.0","0.0","1.8046780981103E7","-4783148.308523","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7366","passing","EPSG","4326","EPSG","7366","1.0","-1.0","0.0","5.9208480602167E7","-1.5692712408878E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7367","passing","EPSG","4326","EPSG","7367","1.0","-1.0","0.0","1.7996190563933E7","-4941220.049584","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7368","passing","EPSG","4326","EPSG","7368","1.0","-1.0","0.0","5.904250187517E7","-1.6211319446011E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7369","passing","EPSG","4326","EPSG","7369","1.0","-1.0","0.0","1.6925005925602E7","-5025464.151156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7370","passing","EPSG","4326","EPSG","7370","1.0","-1.0","0.0","5.5528123607578E7","-1.6487710302584E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7142","passing","EPSG","4326","EPSG","7142","1.0","-1.0","0.0","-3888072.653969","-3519744.175070","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7257","passing","EPSG","4326","EPSG","7257","1.0","-1.0","0.0","11458600.178861","-17199251.072571","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7258","passing","EPSG","4326","EPSG","7258","1.0","-1.0","0.0","37593757.420148","-56427876.227261","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7259","passing","EPSG","4326","EPSG","7259","1.0","-1.0","0.0","7345479.009401","-18625587.774174","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7260","passing","EPSG","4326","EPSG","7260","1.0","-1.0","0.0","24099292.383344","-61107449.222434","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7261","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7261","1.0","-1.0","0.0","1.7209011773599E7","-4869004.979394","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7262","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7262","1.0","-1.0","0.0","5.6459899460548E7","-1.5974393836561E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7263","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7263","1.0","-1.0","0.0","1.7920662241704E7","-5070164.800854","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7264","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7264","1.0","-1.0","0.0","5.8794706037992E7","-1.6634365684135E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7265","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7265","1.0","-1.0","0.0","1.6995556996618E7","-4973833.522826","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7266","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7266","1.0","-1.0","0.0","5.575958991307E7","-1.631831881614E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7267","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7267","1.0","-1.0","0.0","1.7523740507246E7","-4953264.495864","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7268","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7268","1.0","-1.0","0.0","5.7492471980857E7","-1.6250835266847E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7269","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7269","1.0","-1.0","0.0","1.7426092740471E7","-4881137.56991","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7270","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7270","1.0","-1.0","0.0","5.7172105932695E7","-1.6014198843947E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7271","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7271","1.0","-1.0","0.0","1.7597172046532E7","-5046196.751334","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7272","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7272","1.0","-1.0","0.0","5.7733388622665E7","-1.6555730508335E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7273","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7273","1.0","-1.0","0.0","1.7474745528931E7","-5055963.015421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7274","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7274","1.0","-1.0","0.0","5.7331727622834E7","-1.6587771993094E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7275","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7275","1.0","-1.0","0.0","1.7089819461183E7","-4768023.578631","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7276","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7276","1.0","-1.0","0.0","5.6068849348899E7","-1.5643090690892E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7277","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7277","1.0","-1.0","0.0","1.78452819983E7","-4921489.997195","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7278","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7278","1.0","-1.0","0.0","5.8547396022755E7","-1.6146588432464E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7279","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7279","1.0","-1.0","0.0","1.7572698539083E7","-5017078.450975","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7280","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7280","1.0","-1.0","0.0","5.7653095123641E7","-1.6460198217908E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7281","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7281","1.0","-1.0","0.0","1.7523550392945E7","-4786686.501065","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7282","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7282","1.0","-1.0","0.0","5.7491848247519E7","-1.5704320628911E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7283","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7283","1.0","-1.0","0.0","1.7820166795698E7","-4842323.437199","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7284","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7284","1.0","-1.0","0.0","5.8464997228886E7","-1.5886856143545E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7285","passing","EPSG","4326","EPSG","7285","1.0","-1.0","0.0","13070661.197424","-16295479.030398","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7286","passing","EPSG","4326","EPSG","7286","1.0","-1.0","0.0","42882660.945215","-53462750.785563","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7287","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7287","1.0","-1.0","0.0","1.7113811694569E7","-4874869.716826","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7288","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7288","1.0","-1.0","0.0","5.6147563867932E7","-1.5993635062621E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7289","passing","EPSG","4326","EPSG","7289","1.0","-1.0","0.0","11458622.615299","-17277024.724685","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7290","passing","EPSG","4326","EPSG","7290","1.0","-1.0","0.0","37593831.030360","-56683038.617571","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7291","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7291","1.0","-1.0","0.0","1.7745434498304E7","-4810324.07887","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7292","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7292","1.0","-1.0","0.0","5.821981301652E7","-1.5781871582092E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7293","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7293","1.0","-1.0","0.0","1.7209130553593E7","-5052246.981052","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7294","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7294","1.0","-1.0","0.0","5.6460289157912E7","-1.6575580303668E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7295","passing","EPSG","4326","EPSG","7295","1.0","-1.0","0.0","7345528.746212","-18442501.893969","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7296","passing","EPSG","4326","EPSG","7296","1.0","-1.0","0.0","24099455.561532","-60506774.963795","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7297","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7297","1.0","-1.0","0.0","1.7920591521106E7","-5014623.748948","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7298","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7298","1.0","-1.0","0.0","5.8794474015497E7","-1.6452144749672E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7299","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7299","1.0","-1.0","0.0","1.7426109926048E7","-5092113.039051","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7300","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7300","1.0","-1.0","0.0","5.7172162315709E7","-1.6706374195619E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7301","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7301","1.0","-1.0","0.0","1.8097602234827E7","-4824918.998251","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7302","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7302","1.0","-1.0","0.0","5.9375216665429E7","-1.5829755080094E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7303","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7303","1.0","-1.0","0.0","1.7137558486681E7","-5014967.353227","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7304","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7304","1.0","-1.0","0.0","5.6225473135054E7","-1.6453272058046E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7305","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7305","1.0","-1.0","0.0","1.72811094841E7","-4972973.101316","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7306","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7306","1.0","-1.0","0.0","5.6696440032418E7","-1.6315495916566E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7307","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7307","1.0","-1.0","0.0","1.7185277077624E7","-4939893.579411","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7308","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7308","1.0","-1.0","0.0","5.638202987884E7","-1.6206967518451E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7309","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7309","1.0","-1.0","0.0","1.7353326903063E7","-4760492.303763","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7310","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7310","1.0","-1.0","0.0","5.6933373347798E7","-1.5618381833262E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7311","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7311","1.0","-1.0","0.0","1.7019216897323E7","-4941845.063132","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7312","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7312","1.0","-1.0","0.0","5.5837214103969E7","-1.6213370011293E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7313","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7313","1.0","-1.0","0.0","1.7353395354522E7","-5026963.859686","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7314","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7314","1.0","-1.0","0.0","5.6933597925628E7","-1.6492630596319E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7315","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7315","1.0","-1.0","0.0","1.7042682560348E7","-5043039.665224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7316","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7316","1.0","-1.0","0.0","5.591420103341E7","-1.6545372634989E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7317","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7317","1.0","-1.0","0.0","1.7256876386175E7","-4838346.274556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7318","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7318","1.0","-1.0","0.0","5.6616935276975E7","-1.5873807735774E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7319","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7319","1.0","-1.0","0.0","1.7820325014351E7","-5092183.722245","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7320","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7320","1.0","-1.0","0.0","5.8465516317917E7","-1.67066060954E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7321","passing","EPSG","4326","EPSG","7321","1.0","-1.0","0.0","9565701.699931","-17869783.225139","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7322","passing","EPSG","4326","EPSG","7322","1.0","-1.0","0.0","31383472.993858","-58627780.464477","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7323","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7323","1.0","-1.0","0.0","1.6971854345882E7","-4805952.839579","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7324","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7324","1.0","-1.0","0.0","5.5681825466448E7","-1.5767530274518E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7325","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7325","1.0","-1.0","0.0","1.7185090686287E7","-4845469.6723","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7326","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7326","1.0","-1.0","0.0","5.6381418359926E7","-1.5897178416537E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7327","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7327","1.0","-1.0","0.0","1.7353395354522E7","-4910377.404406","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7328","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7328","1.0","-1.0","0.0","5.6933597925628E7","-1.6110129867622E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7329","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7329","1.0","-1.0","0.0","1.7996101784756E7","-4846833.422274","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7330","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7330","1.0","-1.0","0.0","5.9042210605486E7","-1.590165265291E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7331","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7331","1.0","-1.0","0.0","1.7019116226351E7","-5108387.760381","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7332","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7332","1.0","-1.0","0.0","5.5836883819286E7","-1.6759768843849E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7333","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7333","1.0","-1.0","0.0","1.7971023659486E7","-5100802.256602","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7334","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7334","1.0","-1.0","0.0","5.8959933456165E7","-1.6734882070201E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7335","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7335","1.0","-1.0","0.0","1.764647302465E7","-5104514.412299","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7336","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7336","1.0","-1.0","0.0","5.7895136915039E7","-1.6747061034351E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7337","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7337","1.0","-1.0","0.0","1.75236022423E7","-4881059.083851","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7338","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7338","1.0","-1.0","0.0","5.7492018356611E7","-1.6013941344268E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7339","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7339","1.0","-1.0","0.0","1.7745627054233E7","-4949146.881439","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7340","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7340","1.0","-1.0","0.0","5.8220444760428E7","-1.6237326060189E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7341","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7341","1.0","-1.0","0.0","1.7720703733488E7","-4914403.332447","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7342","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7342","1.0","-1.0","0.0","5.8138675498951E7","-1.6123338266535E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7343","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7343","1.0","-1.0","0.0","1.7945723569145E7","-4977190.42251","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7344","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7344","1.0","-1.0","0.0","5.8876928076436E7","-1.6329332244518E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7345","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7345","1.0","-1.0","0.0","1.762168808651E7","-4758906.960034","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7346","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7346","1.0","-1.0","0.0","5.7813821663825E7","-1.5613180584711E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7347","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7347","1.0","-1.0","0.0","1.7920414719611E7","-4781441.184756","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7348","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7348","1.0","-1.0","0.0","5.8793893959258E7","-1.568711162032E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7349","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7349","1.0","-1.0","0.0","1.8251246793074E7","-4789412.663278","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7350","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7350","1.0","-1.0","0.0","5.9879298853611E7","-1.5713264712773E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7351","passing","EPSG","4326","EPSG","7351","1.0","-1.0","0.0","7345571.377765","-18492576.012079","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7352","passing","EPSG","4326","EPSG","7352","1.0","-1.0","0.0","24099595.428550","-60671059.799630","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7353","passing","EPSG","4326","EPSG","7353","1.0","-1.0","0.0","-10892059.874320","-20748670.840422","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7354","passing","EPSG","4326","EPSG","7354","1.0","-1.0","0.0","-35735033.104332","-68072930.915617","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7355","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7355","1.0","-1.0","0.0","1.7233025322141E7","-4903661.963033","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7356","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7356","1.0","-1.0","0.0","5.6538683911057E7","-1.6088097623716E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7357","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7357","1.0","-1.0","0.0","1.7795130631267E7","-4763180.715586","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7358","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7358","1.0","-1.0","0.0","5.8382857746082E7","-1.5627202064386E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7359","passing","EPSG","4326","EPSG","7359","1.0","-1.0","0.0","9565729.675973","-18003104.782127","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7360","passing","EPSG","4326","EPSG","7360","1.0","-1.0","0.0","31383564.778589","-59065186.272696","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7361","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7361","1.0","-1.0","0.0","1.8021454769327E7","-4903803.960871","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7362","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7362","1.0","-1.0","0.0","5.9125389522367E7","-1.6088563494957E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7363","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7363","1.0","-1.0","0.0","1.7720703733488E7","-5030986.183175","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7364","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7364","1.0","-1.0","0.0","5.8138675498951E7","-1.6505827169299E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7365","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7365","1.0","-1.0","0.0","1.8046780981103E7","-4783148.308523","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7366","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7366","1.0","-1.0","0.0","5.9208480602167E7","-1.5692712408878E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7367","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7367","1.0","-1.0","0.0","1.7996190563933E7","-4941220.049584","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7368","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7368","1.0","-1.0","0.0","5.904250187517E7","-1.6211319446011E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7369","passing","EPSG","4326","EPSG","7369","1.0","-1.0","0.0","-6028132.802076","-20748544.100773","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7370","passing","EPSG","4326","EPSG","7370","1.0","-1.0","0.0","-19777299.034811","-68072515.103952","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7374","passing","EPSG","4326","EPSG","7374","1.0","-1.0","0.0","-5950996.913984","-172760.344418","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7375","passing","EPSG","4326","EPSG","7375","1.0","-1.0","0.0","-7068672.129214","-199101.756648","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7376","passing","EPSG","4326","EPSG","7376","1.0","-1.0","0.0","-8380117.510219","-238225.04224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7531","passing","EPSG","4326","EPSG","7531","1.0","-1.0","0.0","1.1190112147958E7","1530786.971195","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7532","passing","EPSG","4326","EPSG","7532","1.0","-1.0","0.0","1.8068738062346E7","-5405325.102896","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7532","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7532","1.0","-1.0","0.0","1.8068738062346E7","-5405325.102896","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7534","passing","EPSG","4326","EPSG","7534","1.0","-1.0","0.0","1.1078850667895E7","1601602.398222","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7535","passing","EPSG","4326","EPSG","7535","1.0","-1.0","0.0","1.8542208569864E7","-5394002.064049","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7535","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7535","1.0","-1.0","0.0","1.8542208569864E7","-5394002.064049","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7536","passing","EPSG","4326","EPSG","7536","1.0","-1.0","0.0","1.0977994425237E7","1401818.292327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7538","passing","EPSG","4326","EPSG","7538","1.0","-1.0","0.0","1.091632640974E7","1181450.947617","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7539","passing","EPSG","4326","EPSG","7539","1.0","-1.0","0.0","1.0956536596367E7","1316796.284171","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7540","passing","EPSG","4326","EPSG","7540","1.0","-1.0","0.0","1.0983782944479E7","1211167.323239","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7541","passing","EPSG","4326","EPSG","7541","1.0","-1.0","0.0","1.8705963112563E7","-5264035.313775","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7542","passing","EPSG","4326","EPSG","7542","1.0","-1.0","0.0","1.7825309517877E7","-5544092.881851","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7541","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7541","1.0","-1.0","0.0","1.8705963112563E7","-5264035.313775","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7542","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7542","1.0","-1.0","0.0","1.7825309517877E7","-5544092.881851","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7545","passing","EPSG","4326","EPSG","7545","1.0","-1.0","0.0","1.1034499781635E7","1445837.029539","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7546","passing","EPSG","4326","EPSG","7546","1.0","-1.0","0.0","1.824452591018E7","-5685394.690762","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7547","passing","EPSG","4326","EPSG","7547","1.0","-1.0","0.0","1.8644160382754E7","-5541231.771574","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7546","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7546","1.0","-1.0","0.0","1.824452591018E7","-5685394.690762","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7547","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7547","1.0","-1.0","0.0","1.8644160382754E7","-5541231.771574","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7549","passing","EPSG","4326","EPSG","7549","1.0","-1.0","0.0","1.0921959998346E7","1153425.415057","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7550","passing","EPSG","4326","EPSG","7550","1.0","-1.0","0.0","1.0898807238793E7","1136900.194202","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7554","passing","EPSG","4326","EPSG","7554","1.0","-1.0","0.0","1.8168835296623E7","-5319784.333141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7555","passing","EPSG","4326","EPSG","7555","1.0","-1.0","0.0","1.7886787790146E7","-5426249.036351","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7554","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7554","1.0","-1.0","0.0","1.8168835296623E7","-5319784.333141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7555","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7555","1.0","-1.0","0.0","1.7886787790146E7","-5426249.036351","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7557","passing","EPSG","4326","EPSG","7557","1.0","-1.0","0.0","1.0977969046496E7","1164095.943563","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7559","passing","EPSG","4326","EPSG","7559","1.0","-1.0","0.0","1.089361331296E7","1206629.077554","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7560","passing","EPSG","4326","EPSG","7560","1.0","-1.0","0.0","1.8127615935467E7","-5589318.461061","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7561","passing","EPSG","4326","EPSG","7561","1.0","-1.0","0.0","1.8359375027934E7","-5613393.412737","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7560","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7560","1.0","-1.0","0.0","1.8127615935467E7","-5589318.461061","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7561","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7561","1.0","-1.0","0.0","1.8359375027934E7","-5613393.412737","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7562","passing","EPSG","4326","EPSG","7562","1.0","-1.0","0.0","1.1051590142266E7","1367198.859196","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7563","passing","EPSG","4326","EPSG","7563","1.0","-1.0","0.0","1.8172883085444E7","-5562448.390228","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7563","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7563","1.0","-1.0","0.0","1.8172883085444E7","-5562448.390228","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7564","passing","EPSG","4326","EPSG","7564","1.0","-1.0","0.0","1.0901549209526E7","1196607.494278","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7565","passing","EPSG","4326","EPSG","7565","1.0","-1.0","0.0","1.1133309243073E7","1559758.743052","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7567","passing","EPSG","4326","EPSG","7567","1.0","-1.0","0.0","1.0841630010083E7","1154965.000842","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7569","passing","EPSG","4326","EPSG","7569","1.0","-1.0","0.0","1.1015074626063E7","1334708.953985","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7573","passing","EPSG","4326","EPSG","7573","1.0","-1.0","0.0","1.1152095260838E7","1478472.516608","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7574","passing","EPSG","4326","EPSG","7574","1.0","-1.0","0.0","1.8615461118325E7","-5543570.332176","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7574","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7574","1.0","-1.0","0.0","1.8615461118325E7","-5543570.332176","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7576","passing","EPSG","4326","EPSG","7576","1.0","-1.0","0.0","1.1060695551366E7","1361394.692708","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7578","passing","EPSG","4326","EPSG","7578","1.0","-1.0","0.0","1.1066110497508E7","1300357.746857","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7579","passing","EPSG","4326","EPSG","7579","1.0","-1.0","0.0","1.0975190491794E7","1189767.397438","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7580","passing","EPSG","4326","EPSG","7580","1.0","-1.0","0.0","1.0894789921715E7","1055137.646596","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7581","passing","EPSG","4326","EPSG","7581","1.0","-1.0","0.0","1.1211195182485E7","1639299.045375","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7582","passing","EPSG","4326","EPSG","7582","1.0","-1.0","0.0","1.8190531639855E7","-5402833.866323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7583","passing","EPSG","4326","EPSG","7583","1.0","-1.0","0.0","1.8362696783023E7","-5368959.457174","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7584","passing","EPSG","4326","EPSG","7584","1.0","-1.0","0.0","1.8649706305111E7","-5481735.214879","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7582","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7582","1.0","-1.0","0.0","1.8190531639855E7","-5402833.866323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7583","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7583","1.0","-1.0","0.0","1.8362696783023E7","-5368959.457174","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7584","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7584","1.0","-1.0","0.0","1.8649706305111E7","-5481735.214879","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7585","passing","EPSG","4326","EPSG","7585","1.0","-1.0","0.0","1.0878149265866E7","1109476.147171","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7586","passing","EPSG","4326","EPSG","7586","1.0","-1.0","0.0","1.1024895986121E7","1304229.146808","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7590","passing","EPSG","4326","EPSG","7590","1.0","-1.0","0.0","3.6712892938776E7","5022256.92089","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7591","passing","EPSG","4326","EPSG","7591","1.0","-1.0","0.0","5.928051812588E7","-1.7733970775418E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7591","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7591","1.0","-1.0","0.0","5.928051812588E7","-1.7733970775418E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7593","passing","EPSG","4326","EPSG","7593","1.0","-1.0","0.0","3.6347862566617E7","5254590.534477","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7594","passing","EPSG","4326","EPSG","7594","1.0","-1.0","0.0","6.0833895949316E7","-1.7696821771876E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7594","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7594","1.0","-1.0","0.0","6.0833895949316E7","-1.7696821771876E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7595","passing","EPSG","4326","EPSG","7595","1.0","-1.0","0.0","3.6016970043766E7","4599132.180392","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7597","passing","EPSG","4326","EPSG","7597","1.0","-1.0","0.0","3.5814647562374E7","3876143.651009","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7598","passing","EPSG","4326","EPSG","7598","1.0","-1.0","0.0","3.5946570483187E7","4320189.142789","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7599","passing","EPSG","4326","EPSG","7599","1.0","-1.0","0.0","3.6035961210301E7","3973638.126448","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7600","passing","EPSG","4326","EPSG","7600","1.0","-1.0","0.0","6.1371147312097E7","-1.7270422525212E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7601","passing","EPSG","4326","EPSG","7601","1.0","-1.0","0.0","5.8481869643241E7","-1.818924472942E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7600","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7600","1.0","-1.0","0.0","6.1371147312097E7","-1.7270422525212E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7601","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7601","1.0","-1.0","0.0","5.8481869643241E7","-1.818924472942E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7604","passing","EPSG","4326","EPSG","7604","1.0","-1.0","0.0","3.6202354700193E7","4743550.321085","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7605","passing","EPSG","4326","EPSG","7605","1.0","-1.0","0.0","5.9857248756735E7","-1.8652832414276E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7606","passing","EPSG","4326","EPSG","7606","1.0","-1.0","0.0","6.1168382855468E7","-1.8179857903415E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7605","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7605","1.0","-1.0","0.0","5.9857248756735E7","-1.8652832414276E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7606","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7606","1.0","-1.0","0.0","6.1168382855468E7","-1.8179857903415E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7608","passing","EPSG","4326","EPSG","7608","1.0","-1.0","0.0","3.583313042744E7","3784196.549706","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7609","passing","EPSG","4326","EPSG","7609","1.0","-1.0","0.0","3.5757170082451E7","3729980.0534","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7613","passing","EPSG","4326","EPSG","7613","1.0","-1.0","0.0","5.9608920468909E7","-1.7453325766266E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7614","passing","EPSG","4326","EPSG","7614","1.0","-1.0","0.0","5.8683569608645E7","-1.7802618713364E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7613","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7613","1.0","-1.0","0.0","5.9608920468909E7","-1.7453325766266E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7614","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7614","1.0","-1.0","0.0","5.8683569608645E7","-1.7802618713364E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7616","passing","EPSG","4326","EPSG","7616","1.0","-1.0","0.0","3.6016886779555E7","3819204.774775","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7618","passing","EPSG","4326","EPSG","7618","1.0","-1.0","0.0","3.5740129677774E7","3958748.898787","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7619","passing","EPSG","4326","EPSG","7619","1.0","-1.0","0.0","5.9473686615113E7","-1.8337622318165E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7620","passing","EPSG","4326","EPSG","7620","1.0","-1.0","0.0","6.023404957095E7","-1.8416608221135E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7619","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7619","1.0","-1.0","0.0","5.9473686615113E7","-1.8337622318165E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7620","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7620","1.0","-1.0","0.0","6.023404957095E7","-1.8416608221135E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7621","passing","EPSG","4326","EPSG","7621","1.0","-1.0","0.0","3.6258425325223E7","4485551.590817","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7622","passing","EPSG","4326","EPSG","7622","1.0","-1.0","0.0","5.9622200589461E7","-1.8249466093434E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7622","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7622","1.0","-1.0","0.0","5.9622200589461E7","-1.8249466093434E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7623","passing","EPSG","4326","EPSG","7623","1.0","-1.0","0.0","3.5766166031941E7","3925869.754627","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7624","passing","EPSG","4326","EPSG","7624","1.0","-1.0","0.0","3.6526532074591E7","5117308.476595","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7626","passing","EPSG","4326","EPSG","7626","1.0","-1.0","0.0","3.5569581124671E7","3789247.673768","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7628","passing","EPSG","4326","EPSG","7628","1.0","-1.0","0.0","3.6138624002259E7","4378957.627027","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7632","passing","EPSG","4326","EPSG","7632","1.0","-1.0","0.0","3.6588165868697E7","4850621.915133","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7633","passing","EPSG","4326","EPSG","7633","1.0","-1.0","0.0","6.1074225351948E7","-1.8187530331976E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7633","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7633","1.0","-1.0","0.0","6.1074225351948E7","-1.8187530331976E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7635","passing","EPSG","4326","EPSG","7635","1.0","-1.0","0.0","3.628829865443E7","4466509.087483","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7637","passing","EPSG","4326","EPSG","7637","1.0","-1.0","0.0","3.6306064190276E7","4266257.041641","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7638","passing","EPSG","4326","EPSG","7638","1.0","-1.0","0.0","3.6007770804944E7","3903428.536661","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7639","passing","EPSG","4326","EPSG","7639","1.0","-1.0","0.0","3.574398993491E7","3461730.762217","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7640","passing","EPSG","4326","EPSG","7640","1.0","-1.0","0.0","3.6782062861118E7","5378266.951837","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7641","passing","EPSG","4326","EPSG","7641","1.0","-1.0","0.0","5.9680102554768E7","-1.7725797442939E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7642","passing","EPSG","4326","EPSG","7642","1.0","-1.0","0.0","6.0244947695246E7","-1.7614661152565E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7643","passing","EPSG","4326","EPSG","7643","1.0","-1.0","0.0","6.1186578102823E7","-1.7984659617449E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7641","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7641","1.0","-1.0","0.0","5.9680102554768E7","-1.7725797442939E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7642","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7642","1.0","-1.0","0.0","6.0244947695246E7","-1.7614661152565E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7643","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","7643","1.0","-1.0","0.0","6.1186578102823E7","-1.7984659617449E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7644","passing","EPSG","4326","EPSG","7644","1.0","-1.0","0.0","3.5689394716373E7","3640006.326509","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 7645","passing","EPSG","4326","EPSG","7645","1.0","-1.0","0.0","3.6170846247706E7","4278958.458903","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20004","passing","EPSG","4326","EPSG","20004","1.0","-1.0","0.0","2227111.049229","-117636.4223","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20005","passing","EPSG","4326","EPSG","20005","1.0","-1.0","0.0","2500789.358156","-123030.496386","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20006","passing","EPSG","4326","EPSG","20006","1.0","-1.0","0.0","2736110.647555","-130450.737301","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20007","passing","EPSG","4326","EPSG","20007","1.0","-1.0","0.0","2919589.13206","-140457.124938","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20008","passing","EPSG","4326","EPSG","20008","1.0","-1.0","0.0","3034159.469487","-153890.015637","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20009","passing","EPSG","4326","EPSG","20009","1.0","-1.0","0.0","3057846.196553","-172000.113601","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20010","passing","EPSG","4326","EPSG","20010","1.0","-1.0","0.0","2962094.047199","-196632.806922","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20011","passing","EPSG","4326","EPSG","20011","1.0","-1.0","0.0","2709705.607058","-230482.065892","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20012","passing","EPSG","4326","EPSG","20012","1.0","-1.0","0.0","2252332.757595","-277431.325425","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20013","passing","EPSG","4326","EPSG","20013","1.0","-1.0","0.0","1527468.363465","-343000.997494","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20014","passing","EPSG","4326","EPSG","20014","1.0","-1.0","0.0","454884.656623","-434924.483647","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20015","passing","EPSG","4326","EPSG","20015","1.0","-1.0","0.0","-1067535.229283","-563876.781733","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20064","passing","EPSG","4326","EPSG","20064","1.0","-1.0","0.0","-1772888.950771","-117636.4223","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20065","passing","EPSG","4326","EPSG","20065","1.0","-1.0","0.0","-2499210.641844","-123030.496386","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20066","passing","EPSG","4326","EPSG","20066","1.0","-1.0","0.0","-3263889.352445","-130450.737301","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20067","passing","EPSG","4326","EPSG","20067","1.0","-1.0","0.0","-4080410.86794","-140457.124938","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20068","passing","EPSG","4326","EPSG","20068","1.0","-1.0","0.0","-4965840.530513","-153890.015637","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20069","passing","EPSG","4326","EPSG","20069","1.0","-1.0","0.0","-5942153.803447","-172000.113601","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20070","passing","EPSG","4326","EPSG","20070","1.0","-1.0","0.0","-7037905.952801","-196632.806922","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20071","passing","EPSG","4326","EPSG","20071","1.0","-1.0","0.0","-8290294.392942","-230482.065892","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20072","passing","EPSG","4326","EPSG","20072","1.0","-1.0","0.0","-9747667.242405","-277431.325425","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20073","passing","EPSG","4326","EPSG","20073","1.0","-1.0","0.0","-1.1472531636535E7","-343000.997494","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20074","passing","EPSG","4326","EPSG","20074","1.0","-1.0","0.0","-1.3545115343377E7","-434924.483647","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 20075","passing","EPSG","4326","EPSG","20075","1.0","-1.0","0.0","-1.6067535229283E7","-563876.781733","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20004","passing","EPSG","4326","EPSG","20004","1.0","-1.0","0.0","2227107.025692","-117636.520838","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20005","passing","EPSG","4326","EPSG","20005","1.0","-1.0","0.0","2500754.923419","-123031.573310","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20006","passing","EPSG","4326","EPSG","20006","1.0","-1.0","0.0","2735908.627245","-130458.474623","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20007","passing","EPSG","4326","EPSG","20007","1.0","-1.0","0.0","2918673.417661","-140498.925711","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20008","passing","EPSG","4326","EPSG","20008","1.0","-1.0","0.0","3030710.312731","-154074.329852","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20009","passing","EPSG","4326","EPSG","20009","1.0","-1.0","0.0","3046509.911393","-172701.307523","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20010","passing","EPSG","4326","EPSG","20010","1.0","-1.0","0.0","2928398.609535","-199032.459545","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20011","passing","EPSG","4326","EPSG","20011","1.0","-1.0","0.0","2616450.977618","-238139.999242","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20012","passing","EPSG","4326","EPSG","20012","1.0","-1.0","0.0","2005212.025214","-301115.494208","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20013","passing","EPSG","4326","EPSG","20013","1.0","-1.0","0.0","877895.585743","-418269.477200","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20014","passing","EPSG","4326","EPSG","20014","1.0","-1.0","0.0","-1365416.289671","-723928.382214","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20015","passing","EPSG","4326","EPSG","20015","1.0","-1.0","0.0","6106366.241160","-13449395.681243","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20064","passing","EPSG","4326","EPSG","20064","1.0","-1.0","0.0","-1772892.974308","-117636.520838","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20065","passing","EPSG","4326","EPSG","20065","1.0","-1.0","0.0","-2499245.076581","-123031.573310","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20066","passing","EPSG","4326","EPSG","20066","1.0","-1.0","0.0","-3264091.372755","-130458.474623","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20067","passing","EPSG","4326","EPSG","20067","1.0","-1.0","0.0","-4081326.582339","-140498.925711","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20068","passing","EPSG","4326","EPSG","20068","1.0","-1.0","0.0","-4969289.687269","-154074.329852","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20069","passing","EPSG","4326","EPSG","20069","1.0","-1.0","0.0","-5953490.088607","-172701.307523","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20070","passing","EPSG","4326","EPSG","20070","1.0","-1.0","0.0","-7071601.390465","-199032.459545","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20071","passing","EPSG","4326","EPSG","20071","1.0","-1.0","0.0","-8383549.022382","-238139.999242","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20072","passing","EPSG","4326","EPSG","20072","1.0","-1.0","0.0","-9994787.974786","-301115.494208","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20073","passing","EPSG","4326","EPSG","20073","1.0","-1.0","0.0","-12122104.414257","-418269.477200","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20074","passing","EPSG","4326","EPSG","20074","1.0","-1.0","0.0","-15365416.289671","-723928.382214","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 20075","passing","EPSG","4326","EPSG","20075","1.0","-1.0","0.0","-8893633.758840","-13449395.681243","-130.197731","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 20135","passing","EPSG","4326","EPSG","20135","1.0","-1.0","0.0","-2498185.666784","-123299.282492","57.736167","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 20136","passing","EPSG","4326","EPSG","20136","1.0","-1.0","0.0","-3262746.528632","-130743.781384","57.736167","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 20137","passing","EPSG","4326","EPSG","20137","1.0","-1.0","0.0","-4079687.173558","-140808.323723","57.736167","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2893,68 +2893,68 @@ "4326 -> 21148","passing","EPSG","4326","EPSG","21148","1.0","-1.0","0.0","-1.3013758964872E7","-9510330.465974","1103.991405","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21149","passing","EPSG","4326","EPSG","21149","1.0","-1.0","0.0","-1.0622111039664E7","-9662464.496853","1103.991405","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21150","passing","EPSG","4326","EPSG","21150","1.0","-1.0","0.0","-8873631.028101","-9738234.580343","1103.991405","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21291","passing","EPSG","4326","EPSG","21291","1.0","-1.0","0.0","9412857.477726","-238245.516063","-141.893703","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21292","passing","EPSG","4326","EPSG","21292","1.0","-1.0","0.0","8502877.817398","-1604442.177924","-141.893703","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21413","passing","EPSG","4326","EPSG","21413","1.0","-1.0","0.0","1527545.472395","-342995.046176","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21414","passing","EPSG","4326","EPSG","21414","1.0","-1.0","0.0","454977.904554","-434916.510601","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21415","passing","EPSG","4326","EPSG","21415","1.0","-1.0","0.0","-1067421.16108","-563865.977202","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21453","passing","EPSG","4326","EPSG","21453","1.0","-1.0","0.0","-1.1472454527605E7","-342995.046176","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21454","passing","EPSG","4326","EPSG","21454","1.0","-1.0","0.0","-1.3545022095446E7","-434916.510601","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21455","passing","EPSG","4326","EPSG","21455","1.0","-1.0","0.0","-1.606742116108E7","-563865.977202","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21473","passing","EPSG","4326","EPSG","21473","1.0","-1.0","0.0","-1.1472454527605E7","-342995.046176","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21474","passing","EPSG","4326","EPSG","21474","1.0","-1.0","0.0","-1.3545022095446E7","-434916.510601","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21475","passing","EPSG","4326","EPSG","21475","1.0","-1.0","0.0","-1.606742116108E7","-563865.977202","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21291","passing","EPSG","4326","EPSG","21291","1.0","-1.0","0.0","9522949.629656","-247558.705692","-141.893703","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21292","passing","EPSG","4326","EPSG","21292","1.0","-1.0","0.0","8576424.174057","-1610305.261684","-141.893703","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21413","passing","EPSG","4326","EPSG","21413","1.0","-1.0","0.0","877998.661323","-418259.208244","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21414","passing","EPSG","4326","EPSG","21414","1.0","-1.0","0.0","-1365240.176019","-723899.094671","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21415","passing","EPSG","4326","EPSG","21415","1.0","-1.0","0.0","6096226.905901","-13446275.705824","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21453","passing","EPSG","4326","EPSG","21453","1.0","-1.0","0.0","-12122001.338677","-418259.208244","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21454","passing","EPSG","4326","EPSG","21454","1.0","-1.0","0.0","-15365240.176019","-723899.094671","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21455","passing","EPSG","4326","EPSG","21455","1.0","-1.0","0.0","-8903773.094099","-13446275.705824","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21473","passing","EPSG","4326","EPSG","21473","1.0","-1.0","0.0","-12122001.338677","-418259.208244","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21474","passing","EPSG","4326","EPSG","21474","1.0","-1.0","0.0","-15365240.176019","-723899.094671","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21475","passing","EPSG","4326","EPSG","21475","1.0","-1.0","0.0","-8903773.094099","-13446275.705824","-122.535693","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21500","passing","EPSG","4326","EPSG","21500","1.0","-1.0","0.0","-381499.928232","-6309626.277519","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21780","passing","EPSG","4326","EPSG","21780","1.0","-1.0","0.0","-1061258.372849","-5998105.380244","72.45377","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21781","passing","EPSG","4326","EPSG","21781","1.0","-1.0","0.0","-461258.372849","-5798105.380244","72.45377","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21782","passing","EPSG","4326","EPSG","21782","1.0","-1.0","0.0","-1061258.372849","-5998105.380244","72.45377","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 21818","passing","EPSG","4326","EPSG","21818","1.0","-1.0","0.0","1.4018905934253E7","-482704.779234","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21891","passing","EPSG","4326","EPSG","21891","1.0","-1.0","0.0","1.4338617477745E7","90209.004789","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21892","passing","EPSG","4326","EPSG","21892","1.0","-1.0","0.0","1.3317543870368E7","134841.957052","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21893","passing","EPSG","4326","EPSG","21893","1.0","-1.0","0.0","1.2387209013718E7","172528.301583","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21894","passing","EPSG","4326","EPSG","21894","1.0","-1.0","0.0","1.1536528001699E7","204368.847258","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21896","passing","EPSG","4326","EPSG","21896","1.0","-1.0","0.0","1.4338617477745E7","90209.004789","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21897","passing","EPSG","4326","EPSG","21897","1.0","-1.0","0.0","1.3317543870368E7","134841.957052","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21898","passing","EPSG","4326","EPSG","21898","1.0","-1.0","0.0","1.2387209013718E7","172528.301583","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 21899","passing","EPSG","4326","EPSG","21899","1.0","-1.0","0.0","1.1536528001699E7","204368.847258","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21891","passing","EPSG","4326","EPSG","21891","1.0","-1.0","0.0","15628098.084201","-89308.600777","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21892","passing","EPSG","4326","EPSG","21892","1.0","-1.0","0.0","14093614.921846","41220.894946","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21893","passing","EPSG","4326","EPSG","21893","1.0","-1.0","0.0","12863259.397062","121050.075777","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21894","passing","EPSG","4326","EPSG","21894","1.0","-1.0","0.0","11830555.302781","175372.357944","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21896","passing","EPSG","4326","EPSG","21896","1.0","-1.0","0.0","15628098.084201","-89308.600777","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21897","passing","EPSG","4326","EPSG","21897","1.0","-1.0","0.0","14093614.921846","41220.894946","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21898","passing","EPSG","4326","EPSG","21898","1.0","-1.0","0.0","12863259.397062","121050.075777","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 21899","passing","EPSG","4326","EPSG","21899","1.0","-1.0","0.0","11830555.302781","175372.357944","-568.718803","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22032","passing","EPSG","4326","EPSG","22032","1.0","-1.0","0.0","-392655.849453","9888609.314327","-59.107151","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22033","passing","EPSG","4326","EPSG","22033","1.0","-1.0","0.0","-1073121.148855","9886301.120087","-59.107151","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22091","passing","EPSG","4326","EPSG","22091","1.0","-1.0","0.0","-674515.338893","9887809.640665","-59.107151","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22092","passing","EPSG","4326","EPSG","22092","1.0","-1.0","0.0","-731145.102721","9887622.380984","-59.107151","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22171","passing","EPSG","4326","EPSG","22171","1.0","-1.0","0.0","1.316346709951E7","9671230.891208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22172","passing","EPSG","4326","EPSG","22172","1.0","-1.0","0.0","1.328947315091E7","9704851.838049","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22173","passing","EPSG","4326","EPSG","22173","1.0","-1.0","0.0","1.34882032921E7","9733276.551189","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22174","passing","EPSG","4326","EPSG","22174","1.0","-1.0","0.0","1.3750656290095E7","9757339.480787","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22175","passing","EPSG","4326","EPSG","22175","1.0","-1.0","0.0","1.406889415915E7","9777744.441021","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22176","passing","EPSG","4326","EPSG","22176","1.0","-1.0","0.0","1.4435929604234E7","9795082.873512","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22177","passing","EPSG","4326","EPSG","22177","1.0","-1.0","0.0","1.4845622388712E7","9809849.986231","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22181","passing","EPSG","4326","EPSG","22181","1.0","-1.0","0.0","1.3163467099354E7","9671230.891296","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22182","passing","EPSG","4326","EPSG","22182","1.0","-1.0","0.0","1.3289473150778E7","9704851.838136","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22183","passing","EPSG","4326","EPSG","22183","1.0","-1.0","0.0","1.348820329199E7","9733276.551273","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22184","passing","EPSG","4326","EPSG","22184","1.0","-1.0","0.0","1.3750656290003E7","9757339.48087","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22185","passing","EPSG","4326","EPSG","22185","1.0","-1.0","0.0","1.4068894159073E7","9777744.441104","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22186","passing","EPSG","4326","EPSG","22186","1.0","-1.0","0.0","1.4435929604171E7","9795082.873593","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22187","passing","EPSG","4326","EPSG","22187","1.0","-1.0","0.0","1.484562238866E7","9809849.986312","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22191","passing","EPSG","4326","EPSG","22191","1.0","-1.0","0.0","1.3163671529822E7","9671279.649903","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22192","passing","EPSG","4326","EPSG","22192","1.0","-1.0","0.0","1.3289655951662E7","9704928.702963","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22193","passing","EPSG","4326","EPSG","22193","1.0","-1.0","0.0","1.3488365848649E7","9733377.166894","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22194","passing","EPSG","4326","EPSG","22194","1.0","-1.0","0.0","1.3750799849289E7","9757460.188528","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22195","passing","EPSG","4326","EPSG","22195","1.0","-1.0","0.0","1.4069019839723E7","9777882.170246","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22196","passing","EPSG","4326","EPSG","22196","1.0","-1.0","0.0","1.443603840615E7","9795235.048509","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22197","passing","EPSG","4326","EPSG","22197","1.0","-1.0","0.0","1.4845715201602E7","9810014.446106","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22171","passing","EPSG","4326","EPSG","22171","1.0","-1.0","0.0","13715628.232019","9609466.563341","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22172","passing","EPSG","4326","EPSG","22172","1.0","-1.0","0.0","13630116.425822","9670247.632028","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22173","passing","EPSG","4326","EPSG","22173","1.0","-1.0","0.0","13698671.075148","9713633.023942","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22174","passing","EPSG","4326","EPSG","22174","1.0","-1.0","0.0","13880160.435236","9746157.213300","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22175","passing","EPSG","4326","EPSG","22175","1.0","-1.0","0.0","14147910.338344","9771406.084630","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22176","passing","EPSG","4326","EPSG","22176","1.0","-1.0","0.0","14483559.356534","9791525.214552","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22177","passing","EPSG","4326","EPSG","22177","1.0","-1.0","0.0","14873889.490377","9807881.931398","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22181","passing","EPSG","4326","EPSG","22181","1.0","-1.0","0.0","13715628.231489","9609466.563489","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22182","passing","EPSG","4326","EPSG","22182","1.0","-1.0","0.0","13630116.425471","9670247.632144","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22183","passing","EPSG","4326","EPSG","22183","1.0","-1.0","0.0","13698671.074903","9713633.024043","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22184","passing","EPSG","4326","EPSG","22184","1.0","-1.0","0.0","13880160.435061","9746157.213392","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22185","passing","EPSG","4326","EPSG","22185","1.0","-1.0","0.0","14147910.338216","9771406.084717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22186","passing","EPSG","4326","EPSG","22186","1.0","-1.0","0.0","14483559.356439","9791525.214636","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22187","passing","EPSG","4326","EPSG","22187","1.0","-1.0","0.0","14873889.490305","9807881.931480","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22191","passing","EPSG","4326","EPSG","22191","1.0","-1.0","0.0","13716056.517346","9609426.154099","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22192","passing","EPSG","4326","EPSG","22192","1.0","-1.0","0.0","13630429.368689","9670277.093133","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22193","passing","EPSG","4326","EPSG","22193","1.0","-1.0","0.0","13698912.397300","9713707.457841","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22194","passing","EPSG","4326","EPSG","22194","1.0","-1.0","0.0","13880352.817105","9746263.188419","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22195","passing","EPSG","4326","EPSG","22195","1.0","-1.0","0.0","14148066.680540","9771535.465990","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22196","passing","EPSG","4326","EPSG","22196","1.0","-1.0","0.0","14483687.516758","9791672.664135","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22197","passing","EPSG","4326","EPSG","22197","1.0","-1.0","0.0","14873994.514691","9808043.735031","-103.817638","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22234","passing","EPSG","4326","EPSG","22234","1.0","-1.0","0.0","-1772015.254919","9882636.323997","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22235","passing","EPSG","4326","EPSG","22235","1.0","-1.0","0.0","-2498086.292875","9877253.003339","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22236","passing","EPSG","4326","EPSG","22236","1.0","-1.0","0.0","-3262642.56609","9869842.0968","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22275","passing","EPSG","4326","EPSG","22275","1.0","-1.0","0.0","1573999.145844","113681.130312","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22277","passing","EPSG","4326","EPSG","22277","1.0","-1.0","0.0","1804525.000855","114757.090824","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22279","passing","EPSG","4326","EPSG","22279","1.0","-1.0","0.0","2037385.636041","115997.387056","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22281","passing","EPSG","4326","EPSG","22281","1.0","-1.0","0.0","2272920.363034","117410.540869","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22283","passing","EPSG","4326","EPSG","22283","1.0","-1.0","0.0","2511486.63572","119006.515663","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22285","passing","EPSG","4326","EPSG","22285","1.0","-1.0","0.0","2753462.841422","120796.885182","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22287","passing","EPSG","4326","EPSG","22287","1.0","-1.0","0.0","2999251.3369","122795.031937","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22289","passing","EPSG","4326","EPSG","22289","1.0","-1.0","0.0","3249281.753671","125016.378794","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22291","passing","EPSG","4326","EPSG","22291","1.0","-1.0","0.0","3504014.597136","127478.657615","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22293","passing","EPSG","4326","EPSG","22293","1.0","-1.0","0.0","3763945.163977","130202.219191","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22275","passing","EPSG","4326","EPSG","22275","1.0","-1.0","0.0","1573999.406217","113681.134964","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22277","passing","EPSG","4326","EPSG","22277","1.0","-1.0","0.0","1804525.712334","114757.105092","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22279","passing","EPSG","4326","EPSG","22279","1.0","-1.0","0.0","2037387.403416","115997.426387","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22281","passing","EPSG","4326","EPSG","22281","1.0","-1.0","0.0","2272924.424689","117410.640259","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22283","passing","EPSG","4326","EPSG","22283","1.0","-1.0","0.0","2511495.383512","119006.749274","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22285","passing","EPSG","4326","EPSG","22285","1.0","-1.0","0.0","2753480.673309","120797.401620","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22287","passing","EPSG","4326","EPSG","22287","1.0","-1.0","0.0","2999286.007278","122796.115107","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22289","passing","EPSG","4326","EPSG","22289","1.0","-1.0","0.0","3249346.449639","125018.549283","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22291","passing","EPSG","4326","EPSG","22291","1.0","-1.0","0.0","3504131.051735","127482.836658","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22293","passing","EPSG","4326","EPSG","22293","1.0","-1.0","0.0","3764148.225380","130209.987195","20.715298","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22332","passing","EPSG","4326","EPSG","22332","1.0","-1.0","0.0","-393014.863599","-112056.11109","158.258465","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22391","passing","EPSG","4326","EPSG","22391","1.0","-1.0","0.0","-700108.94806","-4021576.445869","158.258465","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22392","passing","EPSG","4326","EPSG","22392","1.0","-1.0","0.0","-670055.493672","-3670113.440599","158.258465","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -2967,10 +2967,10 @@ "4326 -> 22770","passing","EPSG","4326","EPSG","22770","1.0","-1.0","0.0","-4440764.103289","-3032502.167704","82.290777","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22780","passing","EPSG","4326","EPSG","22780","1.0","-1.0","0.0","-4798555.209669","-3522755.926823","82.290777","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 22832","passing","EPSG","4326","EPSG","22832","1.0","-1.0","0.0","-393005.262375","-111613.432677","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22991","passing","EPSG","4326","EPSG","22991","1.0","-1.0","0.0","-3729805.021239","-2353695.235182","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22992","passing","EPSG","4326","EPSG","22992","1.0","-1.0","0.0","-2889215.919069","-2637949.463579","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22993","passing","EPSG","4326","EPSG","22993","1.0","-1.0","0.0","-2299455.528963","-3243254.28211","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 22994","passing","EPSG","4326","EPSG","22994","1.0","-1.0","0.0","-2299455.528963","-2243254.28211","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22991","passing","EPSG","4326","EPSG","22991","1.0","-1.0","0.0","-3730147.801615","-2353709.198534","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22992","passing","EPSG","4326","EPSG","22992","1.0","-1.0","0.0","-2889331.790399","-2637953.629228","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22993","passing","EPSG","4326","EPSG","22993","1.0","-1.0","0.0","-2299489.987112","-3243255.360497","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 22994","passing","EPSG","4326","EPSG","22994","1.0","-1.0","0.0","-2299489.987112","-2243255.360497","64.81419","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 23028","passing","EPSG","4326","EPSG","23028","1.0","-1.0","0.0","2304050.492994","-114893.113989","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 23029","passing","EPSG","4326","EPSG","23029","1.0","-1.0","0.0","1618451.053265","-112127.082201","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 23030","passing","EPSG","4326","EPSG","23030","1.0","-1.0","0.0","945511.037548","-110683.563211","-164.398575","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3039,7 +3039,7 @@ "4326 -> 24381","passing","EPSG","4326","EPSG","24381","1.0","-1.0","0.0","-6266463.018387","717165.514275","534.572378","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24382","passing","EPSG","4326","EPSG","24382","1.0","-1.0","0.0","-8126243.946282","1558821.084859","0.0","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24383","passing","EPSG","4326","EPSG","24383","1.0","-1.0","0.0","-6141582.473322","748487.490771","534.572378","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 24500","passing","EPSG","4326","EPSG","24500","1.0","-1.0","0.0","-1.1417724462289E7","-644920.538459","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 24500","passing","EPSG","4326","EPSG","24500","1.0","-1.0","0.0","-11412865.021297","-644920.538459","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24548","passing","EPSG","4326","EPSG","24548","1.0","-1.0","0.0","-1.3011873095093E7","-1.9510192263077E7","829.172201","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24571","passing","EPSG","4326","EPSG","24571","1.0","-1.0","0.0","-604169.570049","302330.27581","41.217933","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24600","passing","EPSG","4326","EPSG","24600","1.0","-1.0","0.0","-4082784.085485","-1578333.002223","195.259612","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3055,9 +3055,9 @@ "4326 -> 24880","passing","EPSG","4326","EPSG","24880","1.0","-1.0","0.0","9876544.771961","9745162.931406","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24881","passing","EPSG","4326","EPSG","24881","1.0","-1.0","0.0","8480440.543715","9790361.366291","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 24882","passing","EPSG","4326","EPSG","24882","1.0","-1.0","0.0","7306356.17686","9820113.938509","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 24891","passing","EPSG","4326","EPSG","24891","1.0","-1.0","0.0","1.4848936620636E7","1628308.684297","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 24892","passing","EPSG","4326","EPSG","24892","1.0","-1.0","0.0","1.367119950817E7","1706038.904774","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 24893","passing","EPSG","4326","EPSG","24893","1.0","-1.0","0.0","1.2535631537822E7","1778154.572328","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 24891","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","24891","1.0","-1.0","0.0","1.4848936620636E7","1628308.684297","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 24892","passing","EPSG","4326","EPSG","24892","1.0","-1.0","0.0","14741014.229783","1565493.907259","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 24893","passing","EPSG","4326","EPSG","24893","1.0","-1.0","0.0","12969033.702642","1732192.150950","27.338005","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 25000","passing","EPSG","4326","EPSG","25000","1.0","-1.0","0.0","496887.062684","-626826.645772","23.779236","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 25231","passing","EPSG","4326","EPSG","25231","1.0","-1.0","0.0","277434.339664","-110587.778759","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 25700","passing","EPSG","4326","EPSG","25700","1.0","-1.0","0.0","1.9900872373325E7","789629.424703","1320.943549","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3072,7 +3072,7 @@ "4326 -> 25836","passing","EPSG","4326","EPSG","25836","1.0","-1.0","0.0","-3262671.40897","-130501.513833","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 25837","passing","EPSG","4326","EPSG","25837","1.0","-1.0","0.0","-4079577.277109","-140545.733763","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 25838","passing","EPSG","4326","EPSG","25838","1.0","-1.0","0.0","-4967185.609991","-154126.257162","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 25884","passing","EPSG","4326","EPSG","25884","1.0","-1.0","0.0","-2131028.856678","-120146.01892","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 25884","passing","EPSG","4326","EPSG","25884","1.0","-1.0","0.0","-2131041.326629","-120146.366566","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 25932","passing","EPSG","4326","EPSG","25932","1.0","-1.0","0.0","-393023.762409","9888477.645412","1.394383","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26191","passing","EPSG","4326","EPSG","26191","1.0","-1.0","0.0","1341672.961004","-3693777.50057","-144.80992","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26192","passing","EPSG","4326","EPSG","26192","1.0","-1.0","0.0","1315425.835282","-3234624.440001","-144.80992","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3087,133 +3087,133 @@ "4326 -> 26393","passing","EPSG","4326","EPSG","26393","1.0","-1.0","0.0","-177954.361106","-555104.510305","-16.31287","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26432","passing","EPSG","4326","EPSG","26432","1.0","-1.0","0.0","-393024.994089","9888473.67526","0.291099","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26591","passing","EPSG","4326","EPSG","26591","1.0","-1.0","0.0","607000.706445","-111707.722932","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26592","passing","EPSG","4326","EPSG","26592","1.0","-1.0","0.0","946515.812053","-114022.912099","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26592","passing","EPSG","4326","EPSG","26592","1.0","-1.0","0.0","946515.554245","-114022.916716","-71.709798","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26632","passing","EPSG","4326","EPSG","26632","1.0","-1.0","0.0","-392875.221573","-111666.434586","-35.113455","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26692","passing","EPSG","4326","EPSG","26692","1.0","-1.0","0.0","-392875.221573","9888333.565414","-35.113455","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26701","passing","EPSG","4326","EPSG","26701","1.0","-1.0","0.0","722564.164076","-1.9885183663725E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26702","passing","EPSG","4326","EPSG","26702","1.0","-1.0","0.0","1392999.161827","-1.9884158017266E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26703","passing","EPSG","4326","EPSG","26703","1.0","-1.0","0.0","2073466.238315","-1.9881844551166E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26704","passing","EPSG","4326","EPSG","26704","1.0","-1.0","0.0","2772108.755547","-1.9878106805951E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26705","passing","EPSG","4326","EPSG","26705","1.0","-1.0","0.0","3498176.970556","-1.9872709518726E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26706","passing","EPSG","4326","EPSG","26706","1.0","-1.0","0.0","4262730.048089","-1.9865279473237E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26707","passing","EPSG","4326","EPSG","26707","1.0","-1.0","0.0","5079660.103278","-1.9855234570678E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26708","passing","EPSG","4326","EPSG","26708","1.0","-1.0","0.0","5967303.791494","-1.9841652700554E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26709","passing","EPSG","4326","EPSG","26709","1.0","-1.0","0.0","6951169.375653","-1.9823015889424E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26710","passing","EPSG","4326","EPSG","26710","1.0","-1.0","0.0","8068933.231816","-1.9796668666184E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26711","passing","EPSG","4326","EPSG","26711","1.0","-1.0","0.0","9380536.177499","-1.9757531770536E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26712","passing","EPSG","4326","EPSG","26712","1.0","-1.0","0.0","1.0991493595097E7","-1.9694492114313E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26713","passing","EPSG","4326","EPSG","26713","1.0","-1.0","0.0","1.3118856012727E7","-1.9577144125966E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26714","passing","EPSG","4326","EPSG","26714","1.0","-1.0","0.0","1.6364412665678E7","-1.9270175405834E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26715","passing","EPSG","4326","EPSG","26715","1.0","-1.0","0.0","8929226.258748","-6009717.418205","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26718","passing","EPSG","4326","EPSG","26718","1.0","-1.0","0.0","1.4020924307249E7","-484340.840329","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26719","passing","EPSG","4326","EPSG","26719","1.0","-1.0","0.0","1.162658263108E7","-331666.910217","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26720","passing","EPSG","4326","EPSG","26720","1.0","-1.0","0.0","9876907.396809","-255732.252603","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26721","passing","EPSG","4326","EPSG","26721","1.0","-1.0","0.0","8480669.194096","-210363.755277","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26722","passing","EPSG","4326","EPSG","26722","1.0","-1.0","0.0","7306518.373057","-180502.617512","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26729","passing","EPSG","4326","EPSG","26729","1.0","-1.0","0.0","5.6145655363248E7","-1.2995986809758E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26730","passing","EPSG","4326","EPSG","26730","1.0","-1.0","0.0","5.8836323074223E7","-1.2966005846089E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26731","failing","EPSG","4326","EPSG","26731","1.0","-1.0","0.0","6.9883986607415E7","-3.2630755864469E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26740","passing","EPSG","4326","EPSG","26740","1.0","-1.0","0.0","2.7043968269598E7","4.6315083833813E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26741","passing","EPSG","4326","EPSG","26741","1.0","-1.0","0.0","4.2205997155026E7","1.8012144037188E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26742","passing","EPSG","4326","EPSG","26742","1.0","-1.0","0.0","4.2551518614508E7","1.7357530034183E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26743","passing","EPSG","4326","EPSG","26743","1.0","-1.0","0.0","4.2635532478543E7","1.6156791256428E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26744","passing","EPSG","4326","EPSG","26744","1.0","-1.0","0.0","4.2627623168309E7","1.5130405140098E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26745","passing","EPSG","4326","EPSG","26745","1.0","-1.0","0.0","4.2757406123354E7","1.4042699897091E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26746","passing","EPSG","4326","EPSG","26746","1.0","-1.0","0.0","4.2640879773998E7","1.2826395592368E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26747","passing","EPSG","4326","EPSG","26747","1.0","-1.0","0.0","4.5091438891236E7","1.3927313735304E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26751","passing","EPSG","4326","EPSG","26751","1.0","-1.0","0.0","3.7209345076382E7","4261129.162252","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26752","passing","EPSG","4326","EPSG","26752","1.0","-1.0","0.0","3.7107477063361E7","4133277.535709","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26753","passing","EPSG","4326","EPSG","26753","1.0","-1.0","0.0","4.0241774699622E7","1.0263207352376E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26754","passing","EPSG","4326","EPSG","26754","1.0","-1.0","0.0","4.026846346035E7","1.0131661324306E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26755","passing","EPSG","4326","EPSG","26755","1.0","-1.0","0.0","4.0300743907954E7","9805908.584146","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26756","passing","EPSG","4326","EPSG","26756","1.0","-1.0","0.0","3.1127463220573E7","-2715820.225578","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26757","passing","EPSG","4326","EPSG","26757","1.0","-1.0","0.0","4.2366598192304E7","-1.5039047072171E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26758","passing","EPSG","4326","EPSG","26758","1.0","-1.0","0.0","4.9155553283185E7","-1.0385262046215E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26759","passing","EPSG","4326","EPSG","26759","1.0","-1.0","0.0","5.0509131826688E7","-1.0453563941181E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26760","passing","EPSG","4326","EPSG","26760","1.0","-1.0","0.0","3.4646452420898E7","1404169.449621","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26766","passing","EPSG","4326","EPSG","26766","1.0","-1.0","0.0","5.0737109978708E7","-1.2524656032261E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26767","passing","EPSG","4326","EPSG","26767","1.0","-1.0","0.0","5.3601248462724E7","-1.267475266923E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26771","passing","EPSG","4326","EPSG","26771","1.0","-1.0","0.0","6.0244842616108E7","-1.54738646582E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26773","passing","EPSG","4326","EPSG","26773","1.0","-1.0","0.0","5.5885278945107E7","-1.5528898014295E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26774","passing","EPSG","4326","EPSG","26774","1.0","-1.0","0.0","5.8150474855673E7","-1.5656164628607E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26775","passing","EPSG","4326","EPSG","26775","1.0","-1.0","0.0","3.8068422645457E7","5607218.965398","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26776","passing","EPSG","4326","EPSG","26776","1.0","-1.0","0.0","3.7959530318017E7","5452665.763952","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26777","passing","EPSG","4326","EPSG","26777","1.0","-1.0","0.0","3.8815684857611E7","6927215.615378","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26778","passing","EPSG","4326","EPSG","26778","1.0","-1.0","0.0","3.8877988455196E7","7032011.014307","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26779","passing","EPSG","4326","EPSG","26779","1.0","-1.0","0.0","3.5418642825731E7","1569849.011109","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26780","passing","EPSG","4326","EPSG","26780","1.0","-1.0","0.0","3.5702077129835E7","2074939.980324","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26781","passing","EPSG","4326","EPSG","26781","1.0","-1.0","0.0","3.7117165642604E7","4016189.849085","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26782","passing","EPSG","4326","EPSG","26782","1.0","-1.0","0.0","3.6676836728853E7","3465277.747164","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26783","passing","EPSG","4326","EPSG","26783","1.0","-1.0","0.0","3.5442434537351E7","-1.6885218054771E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26784","passing","EPSG","4326","EPSG","26784","1.0","-1.0","0.0","3.6983700839335E7","-1.6579219349669E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26785","passing","EPSG","4326","EPSG","26785","1.0","-1.0","0.0","3.2196207470069E7","-966070.630837","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26786","passing","EPSG","4326","EPSG","26786","1.0","-1.0","0.0","3.0854854959561E7","-3029755.103434","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26787","passing","EPSG","4326","EPSG","26787","1.0","-1.0","0.0","2.999794124232E7","-3602917.297568","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26791","passing","EPSG","4326","EPSG","26791","1.0","-1.0","0.0","3.8431975775394E7","6030044.172854","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26792","passing","EPSG","4326","EPSG","26792","1.0","-1.0","0.0","3.8502243606626E7","6410399.862474","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26793","passing","EPSG","4326","EPSG","26793","1.0","-1.0","0.0","3.8309278022663E7","6152997.378982","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26794","passing","EPSG","4326","EPSG","26794","1.0","-1.0","0.0","6.1107573573838E7","-1.2977517602793E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26799","passing","EPSG","4326","EPSG","26799","1.0","-1.0","0.0","4.5091438891236E7","1.7671313735304E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26801","passing","EPSG","4326","EPSG","26801","1.0","-1.0","0.0","5.2871091546248E7","-1.682277689412E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26802","passing","EPSG","4326","EPSG","26802","1.0","-1.0","0.0","5.6014388722888E7","-1.6992722822314E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26803","passing","EPSG","4326","EPSG","26803","1.0","-1.0","0.0","6.096180824357E7","-1.727598315855E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26701","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26701","1.0","-1.0","0.0","722564.164076","-1.9885183663725E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26702","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26702","1.0","-1.0","0.0","1392999.161827","-1.9884158017266E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26703","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26703","1.0","-1.0","0.0","2073466.238315","-1.9881844551166E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26704","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26704","1.0","-1.0","0.0","2772108.755547","-1.9878106805951E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26705","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26705","1.0","-1.0","0.0","3498176.970556","-1.9872709518726E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26706","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26706","1.0","-1.0","0.0","4262730.048089","-1.9865279473237E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26707","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26707","1.0","-1.0","0.0","5079660.103278","-1.9855234570678E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26708","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26708","1.0","-1.0","0.0","5967303.791494","-1.9841652700554E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26709","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26709","1.0","-1.0","0.0","6951169.375653","-1.9823015889424E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26710","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26710","1.0","-1.0","0.0","8068933.231816","-1.9796668666184E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26711","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26711","1.0","-1.0","0.0","9380536.177499","-1.9757531770536E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26712","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26712","1.0","-1.0","0.0","1.0991493595097E7","-1.9694492114313E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26713","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26713","1.0","-1.0","0.0","1.3118856012727E7","-1.9577144125966E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26714","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26714","1.0","-1.0","0.0","1.6364412665678E7","-1.9270175405834E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26715","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26715","1.0","-1.0","0.0","8929226.258748","-6009717.418205","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26718","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26718","1.0","-1.0","0.0","1.4020924307249E7","-484340.840329","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26719","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26719","1.0","-1.0","0.0","1.162658263108E7","-331666.910217","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26720","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26720","1.0","-1.0","0.0","9876907.396809","-255732.252603","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26721","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26721","1.0","-1.0","0.0","8480669.194096","-210363.755277","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26722","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26722","1.0","-1.0","0.0","7306518.373057","-180502.617512","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26729","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26729","1.0","-1.0","0.0","5.6145655363248E7","-1.2995986809758E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26730","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26730","1.0","-1.0","0.0","5.8836323074223E7","-1.2966005846089E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26731","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26731","1.0","-1.0","0.0","6.9883986607415E7","-3.2630755864469E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26740","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26740","1.0","-1.0","0.0","2.7043968269598E7","4.6315083833813E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26741","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26741","1.0","-1.0","0.0","4.2205997155026E7","1.8012144037188E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26742","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26742","1.0","-1.0","0.0","4.2551518614508E7","1.7357530034183E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26743","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26743","1.0","-1.0","0.0","4.2635532478543E7","1.6156791256428E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26744","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26744","1.0","-1.0","0.0","4.2627623168309E7","1.5130405140098E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26745","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26745","1.0","-1.0","0.0","4.2757406123354E7","1.4042699897091E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26746","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26746","1.0","-1.0","0.0","4.2640879773998E7","1.2826395592368E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26747","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26747","1.0","-1.0","0.0","4.5091438891236E7","1.3927313735304E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26751","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26751","1.0","-1.0","0.0","3.7209345076382E7","4261129.162252","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26752","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26752","1.0","-1.0","0.0","3.7107477063361E7","4133277.535709","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26753","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26753","1.0","-1.0","0.0","4.0241774699622E7","1.0263207352376E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26754","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26754","1.0","-1.0","0.0","4.026846346035E7","1.0131661324306E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26755","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26755","1.0","-1.0","0.0","4.0300743907954E7","9805908.584146","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26756","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26756","1.0","-1.0","0.0","3.1127463220573E7","-2715820.225578","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26757","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26757","1.0","-1.0","0.0","4.2366598192304E7","-1.5039047072171E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26758","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26758","1.0","-1.0","0.0","4.9155553283185E7","-1.0385262046215E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26759","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26759","1.0","-1.0","0.0","5.0509131826688E7","-1.0453563941181E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26760","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26760","1.0","-1.0","0.0","3.4646452420898E7","1404169.449621","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26766","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26766","1.0","-1.0","0.0","5.0737109978708E7","-1.2524656032261E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26767","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26767","1.0","-1.0","0.0","5.3601248462724E7","-1.267475266923E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26771","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26771","1.0","-1.0","0.0","6.0244842616108E7","-1.54738646582E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26773","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26773","1.0","-1.0","0.0","5.5885278945107E7","-1.5528898014295E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26774","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26774","1.0","-1.0","0.0","5.8150474855673E7","-1.5656164628607E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26775","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26775","1.0","-1.0","0.0","3.8068422645457E7","5607218.965398","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26776","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26776","1.0","-1.0","0.0","3.7959530318017E7","5452665.763952","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26777","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26777","1.0","-1.0","0.0","3.8815684857611E7","6927215.615378","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26778","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26778","1.0","-1.0","0.0","3.8877988455196E7","7032011.014307","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26779","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26779","1.0","-1.0","0.0","3.5418642825731E7","1569849.011109","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26780","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26780","1.0","-1.0","0.0","3.5702077129835E7","2074939.980324","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26781","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26781","1.0","-1.0","0.0","3.7117165642604E7","4016189.849085","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26782","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26782","1.0","-1.0","0.0","3.6676836728853E7","3465277.747164","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26783","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26783","1.0","-1.0","0.0","3.5442434537351E7","-1.6885218054771E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26784","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26784","1.0","-1.0","0.0","3.6983700839335E7","-1.6579219349669E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26785","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26785","1.0","-1.0","0.0","3.2196207470069E7","-966070.630837","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26786","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26786","1.0","-1.0","0.0","3.0854854959561E7","-3029755.103434","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26787","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26787","1.0","-1.0","0.0","2.999794124232E7","-3602917.297568","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26791","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26791","1.0","-1.0","0.0","3.8431975775394E7","6030044.172854","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26792","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26792","1.0","-1.0","0.0","3.8502243606626E7","6410399.862474","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26793","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26793","1.0","-1.0","0.0","3.8309278022663E7","6152997.378982","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26794","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26794","1.0","-1.0","0.0","6.1107573573838E7","-1.2977517602793E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26799","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","26799","1.0","-1.0","0.0","4.5091438891236E7","1.7671313735304E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26801","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26801","1.0","-1.0","0.0","5.2871091546248E7","-1.682277689412E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26802","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26802","1.0","-1.0","0.0","5.6014388722888E7","-1.6992722822314E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26803","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26803","1.0","-1.0","0.0","6.096180824357E7","-1.727598315855E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26811","passing","EPSG","4326","EPSG","26811","1.0","-1.0","0.0","3.7056411031157E7","3191471.839061","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26812","passing","EPSG","4326","EPSG","26812","1.0","-1.0","0.0","3.6262663298794E7","2035914.592439","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26813","passing","EPSG","4326","EPSG","26813","1.0","-1.0","0.0","3.5985167577355E7","1892503.899742","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26814","passing","EPSG","4326","EPSG","26814","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26815","passing","EPSG","4326","EPSG","26815","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26814","passing","EPSG","4326","EPSG","26814","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26815","passing","EPSG","4326","EPSG","26815","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26819","passing","EPSG","4326","EPSG","26819","1.0","-1.0","0.0","1.190460508535E7","1937737.131009","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26820","passing","EPSG","4326","EPSG","26820","1.0","-1.0","0.0","1.192601192143E7","2053668.621488","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26821","passing","EPSG","4326","EPSG","26821","1.0","-1.0","0.0","1.1867181831433E7","1975209.580317","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26822","passing","EPSG","4326","EPSG","26822","1.0","-1.0","0.0","1.1859582682393E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26823","passing","EPSG","4326","EPSG","26823","1.0","-1.0","0.0","1.1794319928427E7","-22718.221242","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26824","passing","EPSG","4326","EPSG","26824","1.0","-1.0","0.0","1.1866227874924E7","147442.835148","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26825","passing","EPSG","4326","EPSG","26825","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26826","passing","EPSG","4326","EPSG","26826","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26825","passing","EPSG","4326","EPSG","26825","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26826","passing","EPSG","4326","EPSG","26826","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26830","passing","EPSG","4326","EPSG","26830","1.0","-1.0","0.0","1.190460508535E7","1937737.131009","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26831","passing","EPSG","4326","EPSG","26831","1.0","-1.0","0.0","1.192601192143E7","2053668.621488","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26832","passing","EPSG","4326","EPSG","26832","1.0","-1.0","0.0","1.1867181831433E7","1975209.580317","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26833","passing","EPSG","4326","EPSG","26833","1.0","-1.0","0.0","1.1859582682393E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26834","passing","EPSG","4326","EPSG","26834","1.0","-1.0","0.0","1.1794319928427E7","-22718.221242","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26835","passing","EPSG","4326","EPSG","26835","1.0","-1.0","0.0","1.1866227874924E7","147442.835148","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26836","passing","EPSG","4326","EPSG","26836","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26837","passing","EPSG","4326","EPSG","26837","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26836","passing","EPSG","4326","EPSG","26836","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26837","passing","EPSG","4326","EPSG","26837","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26841","passing","EPSG","4326","EPSG","26841","1.0","-1.0","0.0","1.190460508535E7","1937737.131009","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26842","passing","EPSG","4326","EPSG","26842","1.0","-1.0","0.0","1.192601192143E7","2053668.621488","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26843","passing","EPSG","4326","EPSG","26843","1.0","-1.0","0.0","1.1867181831433E7","1975209.580317","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26844","passing","EPSG","4326","EPSG","26844","1.0","-1.0","0.0","1.1859582682393E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26845","passing","EPSG","4326","EPSG","26845","1.0","-1.0","0.0","1.1794319928427E7","-22718.221242","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26846","passing","EPSG","4326","EPSG","26846","1.0","-1.0","0.0","1.1866227874924E7","147442.835148","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26847","passing","EPSG","4326","EPSG","26847","1.0","-1.0","0.0","3.5925354189983E7","-1.6825140356933E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26848","passing","EPSG","4326","EPSG","26848","1.0","-1.0","0.0","3.9435008562586E7","-1.6579877771445E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26847","passing","EPSG","4326","EPSG","26847","1.0","-1.0","0.0","36956734.366491","-16928377.279884","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26848","passing","EPSG","4326","EPSG","26848","1.0","-1.0","0.0","40782744.163849","-16721767.036607","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26849","passing","EPSG","4326","EPSG","26849","1.0","-1.0","0.0","3.9057025184185E7","6357392.570651","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26850","passing","EPSG","4326","EPSG","26850","1.0","-1.0","0.0","3.912725744556E7","6737744.468998","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26851","passing","EPSG","4326","EPSG","26851","1.0","-1.0","0.0","3.8934245725294E7","6480333.431424","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26852","passing","EPSG","4326","EPSG","26852","1.0","-1.0","0.0","3.8909314183819E7","8411551.254754","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26853","passing","EPSG","4326","EPSG","26853","1.0","-1.0","0.0","3.4205377548515E7","-74534.697525","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26854","passing","EPSG","4326","EPSG","26854","1.0","-1.0","0.0","3.4441295536315E7","483735.368313","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26855","passing","EPSG","4326","EPSG","26855","1.0","-1.0","0.0","3.5925354189983E7","-1.6825140356933E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26856","passing","EPSG","4326","EPSG","26856","1.0","-1.0","0.0","3.9435008562586E7","-1.6579877771445E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26855","passing","EPSG","4326","EPSG","26855","1.0","-1.0","0.0","36956734.366491","-16928377.279884","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26856","passing","EPSG","4326","EPSG","26856","1.0","-1.0","0.0","40782744.163849","-16721767.036607","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26857","passing","EPSG","4326","EPSG","26857","1.0","-1.0","0.0","3.9057025184185E7","6357392.570651","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26858","passing","EPSG","4326","EPSG","26858","1.0","-1.0","0.0","3.912725744556E7","6737744.468998","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26859","passing","EPSG","4326","EPSG","26859","1.0","-1.0","0.0","3.8934245725294E7","6480333.431424","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26860","passing","EPSG","4326","EPSG","26860","1.0","-1.0","0.0","3.8909314183819E7","8411551.254754","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26861","passing","EPSG","4326","EPSG","26861","1.0","-1.0","0.0","3.4205377548515E7","-74534.697525","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26862","passing","EPSG","4326","EPSG","26862","1.0","-1.0","0.0","3.4441295536315E7","483735.368313","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26863","passing","EPSG","4326","EPSG","26863","1.0","-1.0","0.0","3.5925354189983E7","-1.6825140356933E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26864","passing","EPSG","4326","EPSG","26864","1.0","-1.0","0.0","3.9435008562586E7","-1.6579877771445E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26863","passing","EPSG","4326","EPSG","26863","1.0","-1.0","0.0","36956734.366491","-16928377.279884","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26864","passing","EPSG","4326","EPSG","26864","1.0","-1.0","0.0","40782744.163849","-16721767.036607","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26865","passing","EPSG","4326","EPSG","26865","1.0","-1.0","0.0","3.9057025184185E7","6357392.570651","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26866","passing","EPSG","4326","EPSG","26866","1.0","-1.0","0.0","3.912725744556E7","6737744.468998","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26867","passing","EPSG","4326","EPSG","26867","1.0","-1.0","0.0","3.8934245725294E7","6480333.431424","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26868","passing","EPSG","4326","EPSG","26868","1.0","-1.0","0.0","3.8909314183819E7","8411551.254754","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26869","passing","EPSG","4326","EPSG","26869","1.0","-1.0","0.0","3.4205377548515E7","-74534.697525","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 26870","passing","EPSG","4326","EPSG","26870","1.0","-1.0","0.0","3.4441295536315E7","483735.368313","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26891","passing","EPSG","4326","EPSG","26891","1.0","-1.0","0.0","1.5757736995238E7","-505151.848614","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26892","passing","EPSG","4326","EPSG","26892","1.0","-1.0","0.0","1.5133700109056E7","-473481.699571","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26893","passing","EPSG","4326","EPSG","26893","1.0","-1.0","0.0","1.6414214001085E7","-539612.639806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26894","passing","EPSG","4326","EPSG","26894","1.0","-1.0","0.0","1.7833009909167E7","-617882.974409","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26898","passing","EPSG","4326","EPSG","26898","1.0","-1.0","0.0","7461465.728259","-187672.479556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26899","passing","EPSG","4326","EPSG","26899","1.0","-1.0","0.0","8038728.049406","-201676.577898","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26891","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26891","1.0","-1.0","0.0","1.5757736995238E7","-505151.848614","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26892","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26892","1.0","-1.0","0.0","1.5133700109056E7","-473481.699571","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26893","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26893","1.0","-1.0","0.0","1.6414214001085E7","-539612.639806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26894","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26894","1.0","-1.0","0.0","1.7833009909167E7","-617882.974409","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26898","passing","EPSG","4326","EPSG","26898","1.0","-1.0","0.0","7485122.173446","-189281.454101","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26899","passing","EPSG","4326","EPSG","26899","1.0","-1.0","0.0","8078826.347523","-204602.141116","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26901","passing","EPSG","4326","EPSG","26901","1.0","-1.0","0.0","722561.736479","-1.9885331913357E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26902","passing","EPSG","4326","EPSG","26902","1.0","-1.0","0.0","1392989.214538","-1.988430627929E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26903","passing","EPSG","4326","EPSG","26903","1.0","-1.0","0.0","2073447.882706","-1.9881992849135E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3235,9 +3235,9 @@ "4326 -> 26921","passing","EPSG","4326","EPSG","26921","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26922","passing","EPSG","4326","EPSG","26922","1.0","-1.0","0.0","7306321.314799","-180502.818931","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26923","passing","EPSG","4326","EPSG","26923","1.0","-1.0","0.0","6282890.195008","-159676.099533","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26929","passing","EPSG","4326","EPSG","26929","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26930","passing","EPSG","4326","EPSG","26930","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26931","failing","EPSG","4326","EPSG","26931","1.0","-1.0","0.0","2.1299477541839E7","-9945672.888623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26929","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26929","1.0","-1.0","0.0","1.7159919726823E7","-3961313.962369","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26930","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26930","1.0","-1.0","0.0","1.8379967073642E7","-3952167.354801","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26931","passing","EPSG","4326","EPSG","26931","1.0","-1.0","0.0","2.1299477541839E7","-9945672.888623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26940","passing","EPSG","4326","EPSG","26940","1.0","-1.0","0.0","8328717.21702","1.4116821977524E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26941","passing","EPSG","4326","EPSG","26941","1.0","-1.0","0.0","1.4254884235227E7","5989905.116896","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26942","passing","EPSG","4326","EPSG","26942","1.0","-1.0","0.0","1.4360185801786E7","5790374.152313","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3251,15 +3251,15 @@ "4326 -> 26954","passing","EPSG","4326","EPSG","26954","1.0","-1.0","0.0","1.2578707874327E7","3392714.933988","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26955","passing","EPSG","4326","EPSG","26955","1.0","-1.0","0.0","1.2588537408885E7","3293424.901576","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26956","passing","EPSG","4326","EPSG","26956","1.0","-1.0","0.0","9609648.833132","-675630.039935","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26957","passing","EPSG","4326","EPSG","26957","1.0","-1.0","0.0","1.2960400053583E7","-4584092.979322","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26958","passing","EPSG","4326","EPSG","26958","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26959","passing","EPSG","4326","EPSG","26959","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26957","passing","EPSG","4326","EPSG","26957","1.0","-1.0","0.0","13929727.098412","-4708319.149141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26958","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26958","1.0","-1.0","0.0","1.5029510779743E7","-3165551.699573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26959","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26959","1.0","-1.0","0.0","1.5442048203015E7","-3186367.239404","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26960","passing","EPSG","4326","EPSG","26960","1.0","-1.0","0.0","1.0550650155667E7","427782.799905","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26966","passing","EPSG","4326","EPSG","26966","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26967","passing","EPSG","4326","EPSG","26967","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26971","passing","EPSG","4326","EPSG","26971","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26973","passing","EPSG","4326","EPSG","26973","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26974","passing","EPSG","4326","EPSG","26974","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26966","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26966","1.0","-1.0","0.0","1.5511530289253E7","-3817662.34613","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26967","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26967","1.0","-1.0","0.0","1.6884448431364E7","-3863405.498204","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26971","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26971","1.0","-1.0","0.0","1.8509247999883E7","-4716583.113964","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26973","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26973","1.0","-1.0","0.0","1.6980563567191E7","-4483369.918208","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26974","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26974","1.0","-1.0","0.0","1.8470937971857E7","-4522155.488717","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26975","passing","EPSG","4326","EPSG","26975","1.0","-1.0","0.0","1.2493754958641E7","2708853.657912","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26976","passing","EPSG","4326","EPSG","26976","1.0","-1.0","0.0","1.1460553625321E7","1661745.543903","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26977","passing","EPSG","4326","EPSG","26977","1.0","-1.0","0.0","1.1621497257386E7","2111191.990303","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3268,8 +3268,8 @@ "4326 -> 26980","passing","EPSG","4326","EPSG","26980","1.0","-1.0","0.0","1.0772450358835E7","1132211.773774","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26981","passing","EPSG","4326","EPSG","26981","1.0","-1.0","0.0","1.1703735500459E7","1242402.341635","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26982","passing","EPSG","4326","EPSG","26982","1.0","-1.0","0.0","1.1569510967566E7","1074486.392019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26983","passing","EPSG","4326","EPSG","26983","1.0","-1.0","0.0","1.0950069857247E7","-5128313.037419","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26984","passing","EPSG","4326","EPSG","26984","1.0","-1.0","0.0","1.2019814649506E7","-5053556.85185","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26983","passing","EPSG","4326","EPSG","26983","1.0","-1.0","0.0","11264435.163777","-5159779.714468","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26984","passing","EPSG","4326","EPSG","26984","1.0","-1.0","0.0","12430605.282352","-5096804.786367","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26985","passing","EPSG","4326","EPSG","26985","1.0","-1.0","0.0","9969626.935369","-276195.787551","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26986","passing","EPSG","4326","EPSG","26986","1.0","-1.0","0.0","9421760.598902","-173719.119739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26987","passing","EPSG","4326","EPSG","26987","1.0","-1.0","0.0","9582487.179385","-1098419.84739","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3279,7 +3279,7 @@ "4326 -> 26991","passing","EPSG","4326","EPSG","26991","1.0","-1.0","0.0","1.190460508534E7","1937737.131019","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26992","passing","EPSG","4326","EPSG","26992","1.0","-1.0","0.0","1.192601192142E7","2053668.621498","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 26993","passing","EPSG","4326","EPSG","26993","1.0","-1.0","0.0","1.1867181831423E7","1975209.580327","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 26994","passing","EPSG","4326","EPSG","26994","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 26994","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","26994","1.0","-1.0","0.0","1.8772001648449E7","-3937156.383224","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27037","passing","EPSG","4326","EPSG","27037","1.0","-1.0","0.0","-4079506.784381","-141028.903381","146.270504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27038","passing","EPSG","4326","EPSG","27038","1.0","-1.0","0.0","-4967147.432985","-154658.185173","146.270504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27039","passing","EPSG","4326","EPSG","27039","1.0","-1.0","0.0","-5951010.944853","-173360.355794","146.270504","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3293,10 +3293,10 @@ "4326 -> 27392","passing","EPSG","4326","EPSG","27392","1.0","-1.0","0.0","-824586.574904","-6542688.927929","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27393","passing","EPSG","4326","EPSG","27393","1.0","-1.0","0.0","-1087225.362075","-6543381.777679","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27394","passing","EPSG","4326","EPSG","27394","1.0","-1.0","0.0","-1370690.790138","-6544345.61607","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 27395","passing","EPSG","4326","EPSG","27395","1.0","-1.0","0.0","-1791513.777118","-6546194.40661","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 27396","passing","EPSG","4326","EPSG","27396","1.0","-1.0","0.0","-2259554.677","-6548846.596921","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 27397","passing","EPSG","4326","EPSG","27397","1.0","-1.0","0.0","-2739658.081432","-6552234.213767","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 27398","passing","EPSG","4326","EPSG","27398","1.0","-1.0","0.0","-3255958.662717","-6556653.281086","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 27395","passing","EPSG","4326","EPSG","27395","1.0","-1.0","0.0","-1791514.442452","-6546194.419942","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 27396","passing","EPSG","4326","EPSG","27396","1.0","-1.0","0.0","-2259558.519840","-6548846.691020","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 27397","passing","EPSG","4326","EPSG","27397","1.0","-1.0","0.0","-2739675.093616","-6552234.707245","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 27398","passing","EPSG","4326","EPSG","27398","1.0","-1.0","0.0","-3256023.986282","-6556655.490249","333.820782","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27429","passing","EPSG","4326","EPSG","27429","1.0","-1.0","0.0","1618236.843372","-112284.086911","-29.085363","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27492","passing","EPSG","4326","EPSG","27492","1.0","-1.0","0.0","1020868.174582","-4504721.085398","-29.085363","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27493","passing","EPSG","4326","EPSG","27493","1.0","-1.0","0.0","1020868.174582","-4504721.085398","-29.085363","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3318,9 +3318,9 @@ "4326 -> 27593","passing","EPSG","4326","EPSG","27593","1.0","-1.0","0.0","403662.941422","-5299940.941008","62.495489","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27594","passing","EPSG","4326","EPSG","27594","1.0","-1.0","0.0","-192052.368919","-5038091.636738","62.495489","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 27700","passing","EPSG","4326","EPSG","27700","1.0","-1.0","0.0","734004.745925","-5638279.547703","269.614465","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28191","passing","EPSG","4326","EPSG","28191","1.0","-1.0","0.0","-3637406.713803","-3519213.345137","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28192","passing","EPSG","4326","EPSG","28192","1.0","-1.0","0.0","-3887709.343918","-2519729.207075","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28193","passing","EPSG","4326","EPSG","28193","1.0","-1.0","0.0","-3637406.713803","-2519213.345137","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28191","passing","EPSG","4326","EPSG","28191","1.0","-1.0","0.0","-3637386.761235","-3519213.345137","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28192","passing","EPSG","4326","EPSG","28192","1.0","-1.0","0.0","-3888072.653969","-2519744.175070","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28193","passing","EPSG","4326","EPSG","28193","1.0","-1.0","0.0","-3637386.761235","-2519213.345137","109.910871","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28232","passing","EPSG","4326","EPSG","28232","1.0","-1.0","0.0","-393060.041428","9888670.468661","29.898905","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28348","passing","EPSG","4326","EPSG","28348","1.0","-1.0","0.0","-1.3018825808604E7","-9511914.602454","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28349","passing","EPSG","4326","EPSG","28349","1.0","-1.0","0.0","-1.0625664379252E7","-9664344.475914","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3334,38 +3334,38 @@ "4326 -> 28357","passing","EPSG","4326","EPSG","28357","1.0","-1.0","0.0","-2010550.966654","-9876655.612744","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28358","passing","EPSG","4326","EPSG","28358","1.0","-1.0","0.0","-1303877.831952","-9880914.514046","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28402","passing","EPSG","4326","EPSG","28402","1.0","-1.0","0.0","1606755.564543","-111577.648952","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28403","passing","EPSG","4326","EPSG","28403","1.0","-1.0","0.0","1926015.591579","-113889.892938","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28404","passing","EPSG","4326","EPSG","28404","1.0","-1.0","0.0","2227099.304418","-117625.665195","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28405","passing","EPSG","4326","EPSG","28405","1.0","-1.0","0.0","2500777.051386","-123019.272688","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28406","passing","EPSG","4326","EPSG","28406","1.0","-1.0","0.0","2736097.573785","-130438.868024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28407","passing","EPSG","4326","EPSG","28407","1.0","-1.0","0.0","2919575.033239","-140444.383403","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28408","passing","EPSG","4326","EPSG","28408","1.0","-1.0","0.0","3034144.013555","-153876.103477","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28409","passing","EPSG","4326","EPSG","28409","1.0","-1.0","0.0","3057828.950581","-171984.62562","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28410","passing","EPSG","4326","EPSG","28410","1.0","-1.0","0.0","2962074.443583","-196615.180042","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28411","passing","EPSG","4326","EPSG","28411","1.0","-1.0","0.0","2709682.901623","-230461.506074","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28412","passing","EPSG","4326","EPSG","28412","1.0","-1.0","0.0","2252305.978459","-277406.704894","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28413","passing","EPSG","4326","EPSG","28413","1.0","-1.0","0.0","1527436.249459","-342970.712816","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28414","passing","EPSG","4326","EPSG","28414","1.0","-1.0","0.0","454845.584033","-434886.26325","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28415","passing","EPSG","4326","EPSG","28415","1.0","-1.0","0.0","-1067583.332906","-563827.429285","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28403","passing","EPSG","4326","EPSG","28403","1.0","-1.0","0.0","1926015.334706","-113889.897528","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28404","passing","EPSG","4326","EPSG","28404","1.0","-1.0","0.0","2227095.280719","-117625.763728","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28405","passing","EPSG","4326","EPSG","28405","1.0","-1.0","0.0","2500742.615523","-123020.349552","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28406","passing","EPSG","4326","EPSG","28406","1.0","-1.0","0.0","2735895.547875","-130446.604869","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28407","passing","EPSG","4326","EPSG","28407","1.0","-1.0","0.0","2918659.296665","-140486.181429","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28408","passing","EPSG","4326","EPSG","28408","1.0","-1.0","0.0","3030694.782038","-154060.405066","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28409","passing","EPSG","4326","EPSG","28409","1.0","-1.0","0.0","3046492.440714","-172685.770091","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28410","passing","EPSG","4326","EPSG","28410","1.0","-1.0","0.0","2928378.382166","-199014.660104","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28411","passing","EPSG","4326","EPSG","28411","1.0","-1.0","0.0","2616426.621714","-238118.882807","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28412","passing","EPSG","4326","EPSG","28412","1.0","-1.0","0.0","2005180.930245","-301089.152495","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28413","passing","EPSG","4326","EPSG","28413","1.0","-1.0","0.0","877851.640808","-418233.840425","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28414","passing","EPSG","4326","EPSG","28414","1.0","-1.0","0.0","-1365495.887991","-723872.049499","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28415","passing","EPSG","4326","EPSG","28415","1.0","-1.0","0.0","6109103.176763","-13454506.333789","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28462","passing","EPSG","4326","EPSG","28462","1.0","-1.0","0.0","-393244.435457","-111577.648952","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28463","passing","EPSG","4326","EPSG","28463","1.0","-1.0","0.0","-1073984.408421","-113889.892938","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28464","passing","EPSG","4326","EPSG","28464","1.0","-1.0","0.0","-1772900.695582","-117625.665195","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28465","passing","EPSG","4326","EPSG","28465","1.0","-1.0","0.0","-2499222.948614","-123019.272688","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28466","passing","EPSG","4326","EPSG","28466","1.0","-1.0","0.0","-3263902.426215","-130438.868024","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28467","passing","EPSG","4326","EPSG","28467","1.0","-1.0","0.0","-4080424.966761","-140444.383403","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28468","passing","EPSG","4326","EPSG","28468","1.0","-1.0","0.0","-4965855.986445","-153876.103477","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28469","passing","EPSG","4326","EPSG","28469","1.0","-1.0","0.0","-5942171.049419","-171984.62562","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28470","passing","EPSG","4326","EPSG","28470","1.0","-1.0","0.0","-7037925.556417","-196615.180042","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28471","passing","EPSG","4326","EPSG","28471","1.0","-1.0","0.0","-8290317.098377","-230461.506074","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28472","passing","EPSG","4326","EPSG","28472","1.0","-1.0","0.0","-9747694.021541","-277406.704894","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28473","passing","EPSG","4326","EPSG","28473","1.0","-1.0","0.0","-1.1472563750541E7","-342970.712816","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28474","passing","EPSG","4326","EPSG","28474","1.0","-1.0","0.0","-1.3545154415967E7","-434886.26325","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28475","passing","EPSG","4326","EPSG","28475","1.0","-1.0","0.0","-1.6067583332906E7","-563827.429285","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 28600","passing","EPSG","4326","EPSG","28600","1.0","-1.0","0.0","-6279321.50984","-2578061.125026","-117.534217","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28463","passing","EPSG","4326","EPSG","28463","1.0","-1.0","0.0","-1073984.665294","-113889.897528","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28464","passing","EPSG","4326","EPSG","28464","1.0","-1.0","0.0","-1772904.719281","-117625.763728","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28465","passing","EPSG","4326","EPSG","28465","1.0","-1.0","0.0","-2499257.384477","-123020.349552","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28466","passing","EPSG","4326","EPSG","28466","1.0","-1.0","0.0","-3264104.452125","-130446.604869","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28467","passing","EPSG","4326","EPSG","28467","1.0","-1.0","0.0","-4081340.703335","-140486.181429","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28468","passing","EPSG","4326","EPSG","28468","1.0","-1.0","0.0","-4969305.217962","-154060.405066","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28469","passing","EPSG","4326","EPSG","28469","1.0","-1.0","0.0","-5953507.559286","-172685.770091","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28470","passing","EPSG","4326","EPSG","28470","1.0","-1.0","0.0","-7071621.617834","-199014.660104","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28471","passing","EPSG","4326","EPSG","28471","1.0","-1.0","0.0","-8383573.378286","-238118.882807","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28472","passing","EPSG","4326","EPSG","28472","1.0","-1.0","0.0","-9994819.069755","-301089.152495","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28473","passing","EPSG","4326","EPSG","28473","1.0","-1.0","0.0","-12122148.359192","-418233.840425","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28474","passing","EPSG","4326","EPSG","28474","1.0","-1.0","0.0","-15365495.887991","-723872.049499","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28475","passing","EPSG","4326","EPSG","28475","1.0","-1.0","0.0","-8890896.823237","-13454506.333789","-130.094053","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 28600","passing","EPSG","4326","EPSG","28600","1.0","-1.0","0.0","-6291136.475784","-2578796.460934","-117.534217","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28991","passing","EPSG","4326","EPSG","28991","1.0","-1.0","0.0","-610004.7560194525","-6339134.609735748","155.870901","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 28992","passing","EPSG","4326","EPSG","28992","1.0","-1.0","0.0","-455004.75601945247","-5876134.609735748","155.870901","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29100","failing","EPSG","4326","EPSG","29100","1.0","-1.0","0.0","1.112138038439E7","9838209.400636","33.250022","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29101","failing","EPSG","4326","EPSG","29101","1.0","-1.0","0.0","1.1121376792659E7","9838206.08472","43.101417","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29100","passing","EPSG","4326","EPSG","29100","1.0","-1.0","0.0","1.112138038439E7","9838209.400636","33.250022","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29101","passing","EPSG","4326","EPSG","29101","1.0","-1.0","0.0","1.1121376792659E7","9838206.08472","43.101417","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29118","passing","EPSG","4326","EPSG","29118","1.0","-1.0","0.0","1.4018886276065E7","-483834.461592","33.250022","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29119","passing","EPSG","4326","EPSG","29119","1.0","-1.0","0.0","1.1625707302665E7","-331460.933386","33.250022","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29120","passing","EPSG","4326","EPSG","29120","1.0","-1.0","0.0","9876442.350263","-255610.071147","33.250022","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3399,10 +3399,10 @@ "4326 -> 29373","passing","EPSG","4326","EPSG","29373","1.0","-1.0","0.0","1345499.253014","-2320760.81087","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29375","passing","EPSG","4326","EPSG","29375","1.0","-1.0","0.0","1573984.312872","-2319841.632343","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29377","passing","EPSG","4326","EPSG","29377","1.0","-1.0","0.0","1804480.132627","-2318765.305091","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29379","passing","EPSG","4326","EPSG","29379","1.0","-1.0","0.0","2037310.368834","-2317524.605647","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29381","passing","EPSG","4326","EPSG","29381","1.0","-1.0","0.0","2272814.244673","-2316111.011438","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29383","passing","EPSG","4326","EPSG","29383","1.0","-1.0","0.0","2511349.12","-2314514.558378","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29385","passing","EPSG","4326","EPSG","29385","1.0","-1.0","0.0","2753293.281741","-2312723.672065","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29379","passing","EPSG","4326","EPSG","29379","1.0","-1.0","0.0","2037312.115633","-2317524.566806","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29381","passing","EPSG","4326","EPSG","29381","1.0","-1.0","0.0","2272818.264297","-2316110.913149","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29383","passing","EPSG","4326","EPSG","29383","1.0","-1.0","0.0","2511357.786978","-2314514.327075","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29385","passing","EPSG","4326","EPSG","29385","1.0","-1.0","0.0","2753310.965919","-2312723.160195","31.234146","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29635","passing","EPSG","4326","EPSG","29635","1.0","-1.0","0.0","-2498201.186337","-123062.085754","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29636","passing","EPSG","4326","EPSG","29636","1.0","-1.0","0.0","-3262763.597184","-130492.305708","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29700","passing","EPSG","4326","EPSG","29700","1.0","-1.0","0.0","-5462219.928238","2474640.647579","-59.390039","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3411,14 +3411,14 @@ "4326 -> 29739","passing","EPSG","4326","EPSG","29739","1.0","-1.0","0.0","-5950919.940336","9827384.447968","-59.390039","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29849","passing","EPSG","4326","EPSG","29849","1.0","-1.0","0.0","-1.0621569106857E7","-1.9662402939054E7","1504.706496","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29850","passing","EPSG","4326","EPSG","29850","1.0","-1.0","0.0","-8873307.379418","-1.9738140539351E7","1504.706496","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29871","failing","EPSG","4326","EPSG","29871","1.0","-1.0","0.0","-616802.381396","-216616.294447","74.798631","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29872","failing","EPSG","4326","EPSG","29872","1.0","-1.0","0.0","-4.0708957167923E7","-1.4296675428702E7","4936.709663","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 29873","failing","EPSG","4326","EPSG","29873","1.0","-1.0","0.0","-1.2408068634417E7","-4357619.119986","1504.706496","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29871","passing","EPSG","4326","EPSG","29871","1.0","-1.0","0.0","-616802.381396","-216616.294447","74.798631","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29872","passing","EPSG","4326","EPSG","29872","1.0","-1.0","0.0","-4.0708957167923E7","-1.4296675428702E7","4936.709663","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 29873","passing","EPSG","4326","EPSG","29873","1.0","-1.0","0.0","-1.2408068634417E7","-4357619.119986","1504.706496","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29900","passing","EPSG","4326","EPSG","29900","1.0","-1.0","0.0","1205963.412118","-5792361.190233","274.586154","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29901","passing","EPSG","4326","EPSG","29901","1.0","-1.0","0.0","1205963.415455","-5792361.262972","51.410197","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29902","passing","EPSG","4326","EPSG","29902","1.0","-1.0","0.0","1205963.412118","-5792361.190233","274.586154","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 29903","passing","EPSG","4326","EPSG","29903","1.0","-1.0","0.0","1205963.415517","-5792361.233241","274.616969","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 30200","passing","EPSG","4326","EPSG","30200","1.0","-1.0","0.0","3.4916514253334E7","-6458942.593441","-455.219705","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 30200","passing","EPSG","4326","EPSG","30200","1.0","-1.0","0.0","34914522.623345","-6458942.593441","-455.219705","1.000000","1.000000","1.000000","","","","Auto-generated from proj.4 epsg database" "4326 -> 30339","passing","EPSG","4326","EPSG","30339","1.0","-1.0","0.0","-5951059.314285","-172762.096523","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 30340","passing","EPSG","4326","EPSG","30340","1.0","-1.0","0.0","-7068744.582763","-199103.697686","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 30491","passing","EPSG","4326","EPSG","30491","1.0","-1.0","0.0","270763.241623","-4074162.132384","-30.835159","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3431,46 +3431,46 @@ "4326 -> 30732","passing","EPSG","4326","EPSG","30732","1.0","-1.0","0.0","-392937.70497","-111921.649712","115.134222","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 30791","passing","EPSG","4326","EPSG","30791","1.0","-1.0","0.0","270679.056637","-4074150.453837","115.134222","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 30792","passing","EPSG","4326","EPSG","30792","1.0","-1.0","0.0","276463.189773","-3717968.123774","115.134222","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 30800","passing","EPSG","4326","EPSG","30800","1.0","-1.0","0.0","-166786.241696","-114388.200176","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 30800","passing","EPSG","4326","EPSG","30800","1.0","-1.0","0.0","-166786.631850","-114388.207499","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31028","passing","EPSG","4326","EPSG","31028","1.0","-1.0","0.0","2303713.630165","-115109.014476","-83.861583","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31121","passing","EPSG","4326","EPSG","31121","1.0","-1.0","0.0","8480544.874541","-209676.565966","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31154","passing","EPSG","4326","EPSG","31154","1.0","-1.0","0.0","7842819.11059","-191416.30486","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31170","passing","EPSG","4326","EPSG","31170","1.0","-1.0","0.0","8169010.029112","-199382.844453","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31171","passing","EPSG","4326","EPSG","31171","1.0","-1.0","0.0","8171311.652771","-199442.683242","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31154","passing","EPSG","4326","EPSG","31154","1.0","-1.0","0.0","7871089.319686","-193378.321089","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31170","passing","EPSG","4326","EPSG","31170","1.0","-1.0","0.0","8206975.408939","-202123.573287","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31171","passing","EPSG","4326","EPSG","31171","1.0","-1.0","0.0","8209288.426769","-202184.234623","5.616498","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31251","passing","EPSG","4326","EPSG","31251","1.0","-1.0","0.0","-1043605.9186033024","-5112492.319791396","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31252","passing","EPSG","4326","EPSG","31252","1.0","-1.0","0.0","-1383615.3035036565","-5113633.337061186","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31253","passing","EPSG","4326","EPSG","31253","1.0","-1.0","0.0","-1727568.0469047588","-5115118.781644295","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31252","passing","EPSG","4326","EPSG","31252","1.0","-1.0","0.0","-1383615.404803","-5113633.338694","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31253","passing","EPSG","4326","EPSG","31253","1.0","-1.0","0.0","-1727568.555041","-5115118.791514","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31254","passing","EPSG","4326","EPSG","31254","1.0","-1.0","0.0","-1043605.918603","-5112492.319791","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31255","passing","EPSG","4326","EPSG","31255","1.0","-1.0","0.0","-1383615.303504","-5113633.337061","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31256","passing","EPSG","4326","EPSG","31256","1.0","-1.0","0.0","-1727568.046905","-5115118.781644","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31255","passing","EPSG","4326","EPSG","31255","1.0","-1.0","0.0","-1383615.404803","-5113633.338694","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31256","passing","EPSG","4326","EPSG","31256","1.0","-1.0","0.0","-1727568.555041","-5115118.791514","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31257","passing","EPSG","4326","EPSG","31257","1.0","-1.0","0.0","-893605.918603","-5112492.319791","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31258","passing","EPSG","4326","EPSG","31258","1.0","-1.0","0.0","-933615.303504","-5113633.337061","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31259","passing","EPSG","4326","EPSG","31259","1.0","-1.0","0.0","-977568.046905","-5115118.781644","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31265","passing","EPSG","4326","EPSG","31265","1.0","-1.0","0.0","3925853.428015","-114414.778916","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31266","passing","EPSG","4326","EPSG","31266","1.0","-1.0","0.0","4579253.403193","-116100.776951","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31267","passing","EPSG","4326","EPSG","31267","1.0","-1.0","0.0","5227019.611178","-118168.457339","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31268","passing","EPSG","4326","EPSG","31268","1.0","-1.0","0.0","5867960.646252","-120650.468976","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31275","passing","EPSG","4326","EPSG","31275","1.0","-1.0","0.0","3926010.842672","-114403.337438","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31276","passing","EPSG","4326","EPSG","31276","1.0","-1.0","0.0","4579445.477853","-116089.166873","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31277","passing","EPSG","4326","EPSG","31277","1.0","-1.0","0.0","5227246.909217","-118156.640493","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31278","passing","EPSG","4326","EPSG","31278","1.0","-1.0","0.0","5227246.909217","-118156.640493","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31279","passing","EPSG","4326","EPSG","31279","1.0","-1.0","0.0","5868223.850187","-120638.403929","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31258","passing","EPSG","4326","EPSG","31258","1.0","-1.0","0.0","-933615.404803","-5113633.338694","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31259","passing","EPSG","4326","EPSG","31259","1.0","-1.0","0.0","-977568.555041","-5115118.791514","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31265","passing","EPSG","4326","EPSG","31265","1.0","-1.0","0.0","3925853.171344","-114414.783524","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31266","passing","EPSG","4326","EPSG","31266","1.0","-1.0","0.0","4579252.283131","-116100.800768","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31267","passing","EPSG","4326","EPSG","31267","1.0","-1.0","0.0","5227015.589487","-118168.556286","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31268","passing","EPSG","4326","EPSG","31268","1.0","-1.0","0.0","5867948.181353","-120650.817811","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31275","passing","EPSG","4326","EPSG","31275","1.0","-1.0","0.0","3926010.586027","-114403.342046","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31276","passing","EPSG","4326","EPSG","31276","1.0","-1.0","0.0","4579444.357902","-116089.190687","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31277","passing","EPSG","4326","EPSG","31277","1.0","-1.0","0.0","5227242.887928","-118156.739430","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31278","passing","EPSG","4326","EPSG","31278","1.0","-1.0","0.0","5227242.887928","-118156.739430","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31279","passing","EPSG","4326","EPSG","31279","1.0","-1.0","0.0","5868211.386535","-120638.752730","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31281","passing","EPSG","4326","EPSG","31281","1.0","-1.0","0.0","-1043138.076706","-112552.408971","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31282","passing","EPSG","4326","EPSG","31282","1.0","-1.0","0.0","-1383142.660325","-113693.585549","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31283","passing","EPSG","4326","EPSG","31283","1.0","-1.0","0.0","-1727089.168369","-115179.350793","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31282","passing","EPSG","4326","EPSG","31282","1.0","-1.0","0.0","-1383142.761378","-113693.587179","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31283","passing","EPSG","4326","EPSG","31283","1.0","-1.0","0.0","-1727089.675462","-115179.360646","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31284","passing","EPSG","4326","EPSG","31284","1.0","-1.0","0.0","-893605.918603","-112492.319791","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31285","passing","EPSG","4326","EPSG","31285","1.0","-1.0","0.0","-933615.303504","-113633.337061","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31286","passing","EPSG","4326","EPSG","31286","1.0","-1.0","0.0","-977568.046905","-115118.781644","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31285","passing","EPSG","4326","EPSG","31285","1.0","-1.0","0.0","-933615.404803","-113633.338694","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31286","passing","EPSG","4326","EPSG","31286","1.0","-1.0","0.0","-977568.555041","-115118.791514","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31287","passing","EPSG","4326","EPSG","31287","1.0","-1.0","0.0","-1473395.091135","-5449764.147785","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31288","passing","EPSG","4326","EPSG","31288","1.0","-1.0","0.0","-893138.076706","-112552.408971","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31289","passing","EPSG","4326","EPSG","31289","1.0","-1.0","0.0","-933142.660325","-113693.585549","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31290","passing","EPSG","4326","EPSG","31290","1.0","-1.0","0.0","-977089.168369","-115179.350793","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31289","passing","EPSG","4326","EPSG","31289","1.0","-1.0","0.0","-933142.761378","-113693.587179","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31290","passing","EPSG","4326","EPSG","31290","1.0","-1.0","0.0","-977089.675462","-115179.360646","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31291","passing","EPSG","4326","EPSG","31291","1.0","-1.0","0.0","-1043138.076706","-112552.408971","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31292","passing","EPSG","4326","EPSG","31292","1.0","-1.0","0.0","-1383142.660325","-113693.585549","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31293","passing","EPSG","4326","EPSG","31293","1.0","-1.0","0.0","-1727089.168369","-115179.350793","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31292","passing","EPSG","4326","EPSG","31292","1.0","-1.0","0.0","-1383142.761378","-113693.587179","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31293","passing","EPSG","4326","EPSG","31293","1.0","-1.0","0.0","-1727089.675462","-115179.360646","69.974523","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31294","passing","EPSG","4326","EPSG","31294","1.0","-1.0","0.0","-893605.918603","-112492.319791","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31295","passing","EPSG","4326","EPSG","31295","1.0","-1.0","0.0","-933615.303504","-113633.337061","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31296","passing","EPSG","4326","EPSG","31296","1.0","-1.0","0.0","-977568.046905","-115118.781644","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31295","passing","EPSG","4326","EPSG","31295","1.0","-1.0","0.0","-933615.404803","-113633.338694","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31296","passing","EPSG","4326","EPSG","31296","1.0","-1.0","0.0","-977568.555041","-115118.791514","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31297","passing","EPSG","4326","EPSG","31297","1.0","-1.0","0.0","-1473395.091135","-5449764.147785","153.75974","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31300","passing","EPSG","4326","EPSG","31300","1.0","-1.0","0.0","-379911.660096","-6309484.786666","-138.725677","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31370","passing","EPSG","4326","EPSG","31370","1.0","-1.0","0.0","-381574.921263","-6309409.37876","-138.725677","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3478,19 +3478,19 @@ "4326 -> 31462","passing","EPSG","4326","EPSG","31462","1.0","-1.0","0.0","1942852.593323","-111415.501399","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31463","passing","EPSG","4326","EPSG","31463","1.0","-1.0","0.0","2606770.853728","-112086.713675","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31464","passing","EPSG","4326","EPSG","31464","1.0","-1.0","0.0","3268189.653934","-113079.999334","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31465","passing","EPSG","4326","EPSG","31465","1.0","-1.0","0.0","3926120.495868","-114409.659607","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31465","passing","EPSG","4326","EPSG","31465","1.0","-1.0","0.0","3926120.239514","-114409.664209","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31466","passing","EPSG","4326","EPSG","31466","1.0","-1.0","0.0","1942852.593323","-111415.501399","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31467","passing","EPSG","4326","EPSG","31467","1.0","-1.0","0.0","2606770.853728","-112086.713675","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31468","passing","EPSG","4326","EPSG","31468","1.0","-1.0","0.0","3268189.653934","-113079.999334","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31469","passing","EPSG","4326","EPSG","31469","1.0","-1.0","0.0","3926120.495868","-114409.659607","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31469","passing","EPSG","4326","EPSG","31469","1.0","-1.0","0.0","3926120.239514","-114409.664209","105.205271","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31528","passing","EPSG","4326","EPSG","31528","1.0","-1.0","0.0","2303642.507004","-115006.885056","-93.77219","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31529","passing","EPSG","4326","EPSG","31529","1.0","-1.0","0.0","1618065.607747","-112238.577068","-93.77219","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31600","passing","EPSG","4326","EPSG","31600","1.0","-1.0","0.0","-2745531.568785","-4709869.647938","-357.792039","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31700","passing","EPSG","4326","EPSG","31700","1.0","-1.0","0.0","-2695101.892924","-4732424.799302","-135.223088","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31838","passing","EPSG","4326","EPSG","31838","1.0","-1.0","0.0","-4967177.680681","-154129.945017","3.347359","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31839","passing","EPSG","4326","EPSG","31839","1.0","-1.0","0.0","-5950988.00961","-172764.44209","3.347359","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31900","passing","EPSG","4326","EPSG","31900","1.0","-1.0","0.0","-5438752.760447","-162319.878905","20.638379","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 31901","passing","EPSG","4326","EPSG","31901","1.0","-1.0","0.0","-5441129.212132","-162384.832838","20.638379","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31900","passing","EPSG","4326","EPSG","31900","1.0","-1.0","0.0","-5445096.688007","-162685.271571","20.638379","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 31901","passing","EPSG","4326","EPSG","31901","1.0","-1.0","0.0","-5447475.678278","-162750.371720","20.638379","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31965","passing","EPSG","4326","EPSG","31965","1.0","-1.0","0.0","9380117.510219","-1.9757704843637E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31966","passing","EPSG","4326","EPSG","31966","1.0","-1.0","0.0","1.0990756729525E7","-1.9694702609941E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31967","passing","EPSG","4326","EPSG","31967","1.0","-1.0","0.0","1.3117319676437E7","-1.9577493844715E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3522,73 +3522,73 @@ "4326 -> 31998","passing","EPSG","4326","EPSG","31998","1.0","-1.0","0.0","6282890.195008","9840323.900467","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 31999","passing","EPSG","4326","EPSG","31999","1.0","-1.0","0.0","5366513.929932","9855379.547858","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32000","passing","EPSG","4326","EPSG","32000","1.0","-1.0","0.0","4528360.482014","9866477.713606","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32001","passing","EPSG","4326","EPSG","32001","1.0","-1.0","0.0","4.0426280143568E7","1.4087309697385E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32002","passing","EPSG","4326","EPSG","32002","1.0","-1.0","0.0","4.0479577287139E7","1.384974452241E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32003","passing","EPSG","4326","EPSG","32003","1.0","-1.0","0.0","4.05592619195E7","1.3599275416374E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32005","passing","EPSG","4326","EPSG","32005","1.0","-1.0","0.0","3.9301841645596E7","8312086.886566","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32006","passing","EPSG","4326","EPSG","32006","1.0","-1.0","0.0","3.9171486438957E7","7990943.175222","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32010","passing","EPSG","4326","EPSG","32010","1.0","-1.0","0.0","3.8434788211679E7","-1.6514152187865E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32011","passing","EPSG","4326","EPSG","32011","1.0","-1.0","0.0","4.3042703636285E7","-1.5306645081338E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32015","passing","EPSG","4326","EPSG","32015","1.0","-1.0","0.0","4.1182716584176E7","-1.5716118352498E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32016","passing","EPSG","4326","EPSG","32016","1.0","-1.0","0.0","4.368382263031E7","-1.582499070749E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32017","passing","EPSG","4326","EPSG","32017","1.0","-1.0","0.0","4.6064008076621E7","-1.5934547631051E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32018","passing","EPSG","4326","EPSG","32018","1.0","-1.0","0.0","3.1797122316274E7","-2356035.177722","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32019","passing","EPSG","4326","EPSG","32019","1.0","-1.0","0.0","3.3505776380728E7","-57172.539554","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32020","passing","EPSG","4326","EPSG","32020","1.0","-1.0","0.0","3.9560425902386E7","9522387.143613","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32021","passing","EPSG","4326","EPSG","32021","1.0","-1.0","0.0","3.9515915338299E7","9352370.343102","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32022","passing","EPSG","4326","EPSG","32022","1.0","-1.0","0.0","3.5267844375581E7","1139374.9682","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32023","passing","EPSG","4326","EPSG","32023","1.0","-1.0","0.0","3.5048818864901E7","1107063.059474","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32024","passing","EPSG","4326","EPSG","32024","1.0","-1.0","0.0","3.8712961501519E7","6518554.933919","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32025","passing","EPSG","4326","EPSG","32025","1.0","-1.0","0.0","3.8666618909825E7","6286357.881164","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32026","passing","EPSG","4326","EPSG","32026","1.0","-1.0","0.0","4.1305164075978E7","1.874984839976E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32027","passing","EPSG","4326","EPSG","32027","1.0","-1.0","0.0","4.1664231993295E7","1.8105558423401E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32028","passing","EPSG","4326","EPSG","32028","1.0","-1.0","0.0","3.3997686721351E7","-701828.929522","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32029","passing","EPSG","4326","EPSG","32029","1.0","-1.0","0.0","3.3838962777475E7","-750773.981896","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32030","passing","EPSG","4326","EPSG","32030","1.0","-1.0","0.0","3.8271354224404E7","-1.5991872357693E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32031","passing","EPSG","4326","EPSG","32031","1.0","-1.0","0.0","3.4007753291629E7","528462.858964","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32033","passing","EPSG","4326","EPSG","32033","1.0","-1.0","0.0","3.3853346075889E7","444844.523681","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32034","passing","EPSG","4326","EPSG","32034","1.0","-1.0","0.0","3.9383115490709E7","8845099.507918","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32035","passing","EPSG","4326","EPSG","32035","1.0","-1.0","0.0","3.9391619060726E7","8782246.659402","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32036","passing","EPSG","4326","EPSG","32036","1.0","-1.0","0.0","3.3717898204419E7","2147010.09016","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32037","passing","EPSG","4326","EPSG","32037","1.0","-1.0","0.0","3.9497735901602E7","7799003.914727","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32038","passing","EPSG","4326","EPSG","32038","1.0","-1.0","0.0","3.8496435914626E7","5903289.22903","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32039","passing","EPSG","4326","EPSG","32039","1.0","-1.0","0.0","3.918782734211E7","6483627.694463","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32040","passing","EPSG","4326","EPSG","32040","1.0","-1.0","0.0","3.881259907449E7","5796880.305847","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32041","passing","EPSG","4326","EPSG","32041","1.0","-1.0","0.0","3.8637571950902E7","5160640.147814","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32042","passing","EPSG","4326","EPSG","32042","1.0","-1.0","0.0","4.1076337581052E7","1.3155039808159E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32043","passing","EPSG","4326","EPSG","32043","1.0","-1.0","0.0","4.118765096581E7","1.2980476708732E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32044","passing","EPSG","4326","EPSG","32044","1.0","-1.0","0.0","4.1355532235311E7","1.2268337247844E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32045","passing","EPSG","4326","EPSG","32045","1.0","-1.0","0.0","3.9269507555851E7","-1.6547570870107E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32046","passing","EPSG","4326","EPSG","32046","1.0","-1.0","0.0","3.3804771693605E7","-474916.185496","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32047","passing","EPSG","4326","EPSG","32047","1.0","-1.0","0.0","3.3632730021145E7","-421458.137597","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32048","passing","EPSG","4326","EPSG","32048","1.0","-1.0","0.0","4.0782731708793E7","1.9684712943669E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32049","passing","EPSG","4326","EPSG","32049","1.0","-1.0","0.0","4.105356065764E7","1.9100761411743E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32050","passing","EPSG","4326","EPSG","32050","1.0","-1.0","0.0","3.4236714340118E7","-73753.350062","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32051","passing","EPSG","4326","EPSG","32051","1.0","-1.0","0.0","3.4472661693704E7","484504.430188","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32052","passing","EPSG","4326","EPSG","32052","1.0","-1.0","0.0","3.7676753306698E7","4339067.255558","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32053","passing","EPSG","4326","EPSG","32053","1.0","-1.0","0.0","3.7536953756568E7","4257396.835997","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32054","passing","EPSG","4326","EPSG","32054","1.0","-1.0","0.0","3.7383874068951E7","4273168.561563","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32061","passing","EPSG","4326","EPSG","32061","1.0","-1.0","0.0","1.0783926462388E7","704636.324128","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32062","passing","EPSG","4326","EPSG","32062","1.0","-1.0","0.0","1.0763376809751E7","678709.100228","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32066","passing","EPSG","4326","EPSG","32066","1.0","-1.0","0.0","5.9133441231533E7","-2026750.559125","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32067","passing","EPSG","4326","EPSG","32067","1.0","-1.0","0.0","5.0279368820954E7","-1553070.176234","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32076","passing","EPSG","4326","EPSG","32076","1.0","-1.0","0.0","5.9133441231533E7","-2026750.559125","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32077","passing","EPSG","4326","EPSG","32077","1.0","-1.0","0.0","5.0279368820954E7","-1553070.176234","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32081","passing","EPSG","4326","EPSG","32081","1.0","-1.0","0.0","7461652.184415","-187670.947573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32082","passing","EPSG","4326","EPSG","32082","1.0","-1.0","0.0","8038945.482311","-201676.642981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32083","passing","EPSG","4326","EPSG","32083","1.0","-1.0","0.0","8550936.843213","-215181.951772","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32084","passing","EPSG","4326","EPSG","32084","1.0","-1.0","0.0","9207456.599861","-233986.561585","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32085","passing","EPSG","4326","EPSG","32085","1.0","-1.0","0.0","9916156.192369","-256140.621215","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32086","passing","EPSG","4326","EPSG","32086","1.0","-1.0","0.0","1.0684484765137E7","-282289.64286","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32098","passing","EPSG","4326","EPSG","32098","1.0","-1.0","0.0","9549969.259541","-761453.533047","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32099","passing","EPSG","4326","EPSG","32099","1.0","-1.0","0.0","3.651162252957E7","3139884.941465","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32001","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32001","1.0","-1.0","0.0","4.0426280143568E7","1.4087309697385E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32002","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32002","1.0","-1.0","0.0","4.0479577287139E7","1.384974452241E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32003","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32003","1.0","-1.0","0.0","4.05592619195E7","1.3599275416374E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32005","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32005","1.0","-1.0","0.0","3.9301841645596E7","8312086.886566","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32006","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32006","1.0","-1.0","0.0","3.9171486438957E7","7990943.175222","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32010","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32010","1.0","-1.0","0.0","3.8434788211679E7","-1.6514152187865E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32011","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32011","1.0","-1.0","0.0","4.3042703636285E7","-1.5306645081338E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32015","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32015","1.0","-1.0","0.0","4.1182716584176E7","-1.5716118352498E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32016","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32016","1.0","-1.0","0.0","4.368382263031E7","-1.582499070749E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32017","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32017","1.0","-1.0","0.0","4.6064008076621E7","-1.5934547631051E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32018","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32018","1.0","-1.0","0.0","3.1797122316274E7","-2356035.177722","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32019","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32019","1.0","-1.0","0.0","3.3505776380728E7","-57172.539554","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32020","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32020","1.0","-1.0","0.0","3.9560425902386E7","9522387.143613","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32021","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32021","1.0","-1.0","0.0","3.9515915338299E7","9352370.343102","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32022","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32022","1.0","-1.0","0.0","3.5267844375581E7","1139374.9682","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32023","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32023","1.0","-1.0","0.0","3.5048818864901E7","1107063.059474","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32024","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32024","1.0","-1.0","0.0","3.8712961501519E7","6518554.933919","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32025","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32025","1.0","-1.0","0.0","3.8666618909825E7","6286357.881164","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32026","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32026","1.0","-1.0","0.0","4.1305164075978E7","1.874984839976E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32027","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32027","1.0","-1.0","0.0","4.1664231993295E7","1.8105558423401E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32028","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32028","1.0","-1.0","0.0","3.3997686721351E7","-701828.929522","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32029","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32029","1.0","-1.0","0.0","3.3838962777475E7","-750773.981896","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32030","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32030","1.0","-1.0","0.0","3.8271354224404E7","-1.5991872357693E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32031","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32031","1.0","-1.0","0.0","3.4007753291629E7","528462.858964","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32033","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32033","1.0","-1.0","0.0","3.3853346075889E7","444844.523681","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32034","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32034","1.0","-1.0","0.0","3.9383115490709E7","8845099.507918","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32035","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32035","1.0","-1.0","0.0","3.9391619060726E7","8782246.659402","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32036","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32036","1.0","-1.0","0.0","3.3717898204419E7","2147010.09016","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32037","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32037","1.0","-1.0","0.0","3.9497735901602E7","7799003.914727","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32038","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32038","1.0","-1.0","0.0","3.8496435914626E7","5903289.22903","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32039","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32039","1.0","-1.0","0.0","3.918782734211E7","6483627.694463","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32040","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32040","1.0","-1.0","0.0","3.881259907449E7","5796880.305847","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32041","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32041","1.0","-1.0","0.0","3.8637571950902E7","5160640.147814","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32042","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32042","1.0","-1.0","0.0","4.1076337581052E7","1.3155039808159E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32043","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32043","1.0","-1.0","0.0","4.118765096581E7","1.2980476708732E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32044","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32044","1.0","-1.0","0.0","4.1355532235311E7","1.2268337247844E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32045","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32045","1.0","-1.0","0.0","3.9269507555851E7","-1.6547570870107E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32046","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32046","1.0","-1.0","0.0","3.3804771693605E7","-474916.185496","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32047","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32047","1.0","-1.0","0.0","3.3632730021145E7","-421458.137597","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32048","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32048","1.0","-1.0","0.0","4.0782731708793E7","1.9684712943669E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32049","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32049","1.0","-1.0","0.0","4.105356065764E7","1.9100761411743E7","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32050","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32050","1.0","-1.0","0.0","3.4236714340118E7","-73753.350062","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32051","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32051","1.0","-1.0","0.0","3.4472661693704E7","484504.430188","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32052","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32052","1.0","-1.0","0.0","3.7676753306698E7","4339067.255558","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32053","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32053","1.0","-1.0","0.0","3.7536953756568E7","4257396.835997","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32054","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32054","1.0","-1.0","0.0","3.7383874068951E7","4273168.561563","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32061","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32061","1.0","-1.0","0.0","1.0783926462388E7","704636.324128","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32062","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32062","1.0","-1.0","0.0","1.0763376809751E7","678709.100228","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32066","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32066","1.0","-1.0","0.0","5.9133441231533E7","-2026750.559125","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32067","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32067","1.0","-1.0","0.0","5.0279368820954E7","-1553070.176234","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32076","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32076","1.0","-1.0","0.0","5.9133441231533E7","-2026750.559125","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32077","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32077","1.0","-1.0","0.0","5.0279368820954E7","-1553070.176234","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32081","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32081","1.0","-1.0","0.0","7461652.184415","-187670.947573","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32082","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32082","1.0","-1.0","0.0","8038945.482311","-201676.642981","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32083","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32083","1.0","-1.0","0.0","8550936.843213","-215181.951772","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32084","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32084","1.0","-1.0","0.0","9207456.599861","-233986.561585","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32085","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32085","1.0","-1.0","0.0","9916156.192369","-256140.621215","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32086","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32086","1.0","-1.0","0.0","1.0684484765137E7","-282289.64286","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32098","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32098","1.0","-1.0","0.0","9549969.259541","-761453.533047","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32099","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","32099","1.0","-1.0","0.0","3.651162252957E7","3139884.941465","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 32100","passing","EPSG","4326","EPSG","32100","1.0","-1.0","0.0","1.2324918268659E7","4366651.863837","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32104","passing","EPSG","4326","EPSG","32104","1.0","-1.0","0.0","1.1859582682383E7","2563845.950141","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32110","passing","EPSG","4326","EPSG","32110","1.0","-1.0","0.0","1.1862074088415E7","-5033721.498112","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32111","passing","EPSG","4326","EPSG","32111","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32115","passing","EPSG","4326","EPSG","32115","1.0","-1.0","0.0","1.2603413402636E7","-4662963.007428","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32116","passing","EPSG","4326","EPSG","32116","1.0","-1.0","0.0","1.3411859131067E7","-4823650.932015","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32117","passing","EPSG","4326","EPSG","32117","1.0","-1.0","0.0","1.4237282921893E7","-4857039.255734","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32110","passing","EPSG","4326","EPSG","32110","1.0","-1.0","0.0","12385210.049457","-5091569.861759","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32111","passing","EPSG","4326","EPSG","32111","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32115","passing","EPSG","4326","EPSG","32115","1.0","-1.0","0.0","13434933.821414","-4765298.621421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32116","passing","EPSG","4326","EPSG","32116","1.0","-1.0","0.0","14594179.389600","-4984192.934623","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32117","passing","EPSG","4326","EPSG","32117","1.0","-1.0","0.0","15922864.775165","-5116346.421875","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32118","passing","EPSG","4326","EPSG","32118","1.0","-1.0","0.0","9687036.766689","-681351.175466","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32119","passing","EPSG","4326","EPSG","32119","1.0","-1.0","0.0","1.0212602585283E7","-17652.610423","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32120","passing","EPSG","4326","EPSG","32120","1.0","-1.0","0.0","1.2048562892627E7","2902217.376716","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3601,7 +3601,7 @@ "4326 -> 32127","passing","EPSG","4326","EPSG","32127","1.0","-1.0","0.0","1.3589771611216E7","5518383.696956","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32128","passing","EPSG","4326","EPSG","32128","1.0","-1.0","0.0","1.0352975312048E7","-214159.88901","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32129","passing","EPSG","4326","EPSG","32129","1.0","-1.0","0.0","1.0308283550952E7","-220512.975756","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32130","passing","EPSG","4326","EPSG","32130","1.0","-1.0","0.0","1.1612262480686E7","-4874528.079031","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32130","passing","EPSG","4326","EPSG","32130","1.0","-1.0","0.0","12121505.329748","-4930522.093156","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32133","passing","EPSG","4326","EPSG","32133","1.0","-1.0","0.0","1.0339890150895E7","211156.727684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32134","passing","EPSG","4326","EPSG","32134","1.0","-1.0","0.0","1.1994495041044E7","2695771.443861","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32135","passing","EPSG","4326","EPSG","32135","1.0","-1.0","0.0","1.1997076072218E7","2676611.855038","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3614,7 +3614,7 @@ "4326 -> 32142","passing","EPSG","4326","EPSG","32142","1.0","-1.0","0.0","1.2410564577759E7","5009447.87745","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32143","passing","EPSG","4326","EPSG","32143","1.0","-1.0","0.0","1.2444482006656E7","5956239.983326","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32144","passing","EPSG","4326","EPSG","32144","1.0","-1.0","0.0","1.2495636574632E7","6739176.857568","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32145","passing","EPSG","4326","EPSG","32145","1.0","-1.0","0.0","1.2316477845608E7","-5043906.115058","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32145","passing","EPSG","4326","EPSG","32145","1.0","-1.0","0.0","12915305.224043","-5112088.044691","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32146","passing","EPSG","4326","EPSG","32146","1.0","-1.0","0.0","1.319415649693E7","1855008.196457","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32147","passing","EPSG","4326","EPSG","32147","1.0","-1.0","0.0","1.3141710050315E7","871305.38436","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32148","passing","EPSG","4326","EPSG","32148","1.0","-1.0","0.0","1.2321126696733E7","5999733.6578","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3625,23 +3625,23 @@ "4326 -> 32153","passing","EPSG","4326","EPSG","32153","1.0","-1.0","0.0","1.1431777681828E7","1297424.634259","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32154","passing","EPSG","4326","EPSG","32154","1.0","-1.0","0.0","1.1385107910133E7","1302231.579991","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32161","passing","EPSG","4326","EPSG","32161","1.0","-1.0","0.0","7952042.830285","-479128.830527","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32166","passing","EPSG","4326","EPSG","32166","1.0","-1.0","0.0","5.913029814767E7","-2026562.8464","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32167","passing","EPSG","4326","EPSG","32167","1.0","-1.0","0.0","5.0276969639849E7","-1552948.471705","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32180","passing","EPSG","4326","EPSG","32180","1.0","-1.0","0.0","7939833.583325","-199185.555886","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32181","passing","EPSG","4326","EPSG","32181","1.0","-1.0","0.0","7461465.728259","-187672.479556","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32182","passing","EPSG","4326","EPSG","32182","1.0","-1.0","0.0","8038728.049406","-201676.577898","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32183","passing","EPSG","4326","EPSG","32183","1.0","-1.0","0.0","8550689.97567","-215180.26638","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32184","passing","EPSG","4326","EPSG","32184","1.0","-1.0","0.0","9207169.520513","-233982.521348","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32185","passing","EPSG","4326","EPSG","32185","1.0","-1.0","0.0","9915822.915933","-256133.699684","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32186","passing","EPSG","4326","EPSG","32186","1.0","-1.0","0.0","1.0684098555407E7","-282279.21894","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32187","passing","EPSG","4326","EPSG","32187","1.0","-1.0","0.0","1.1520450559131E7","-313185.711591","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32188","passing","EPSG","4326","EPSG","32188","1.0","-1.0","0.0","1.2434455937819E7","-349760.419421","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32189","passing","EPSG","4326","EPSG","32189","1.0","-1.0","0.0","1.3436941307237E7","-393073.000181","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32190","passing","EPSG","4326","EPSG","32190","1.0","-1.0","0.0","1.4540119571761E7","-444379.949362","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32191","passing","EPSG","4326","EPSG","32191","1.0","-1.0","0.0","1.5757736995238E7","-505151.848614","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32192","passing","EPSG","4326","EPSG","32192","1.0","-1.0","0.0","1.5133700109056E7","-473481.699571","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32193","passing","EPSG","4326","EPSG","32193","1.0","-1.0","0.0","1.6414214001085E7","-539612.639806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32194","passing","EPSG","4326","EPSG","32194","1.0","-1.0","0.0","1.7833009909167E7","-617882.974409","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32166","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32166","1.0","-1.0","0.0","5.913029814767E7","-2026562.8464","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32167","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32167","1.0","-1.0","0.0","5.0276969639849E7","-1552948.471705","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32180","passing","EPSG","4326","EPSG","32180","1.0","-1.0","0.0","7976601.826127","-201836.910943","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32181","passing","EPSG","4326","EPSG","32181","1.0","-1.0","0.0","7485122.173446","-189281.454101","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32182","passing","EPSG","4326","EPSG","32182","1.0","-1.0","0.0","8078826.347523","-204602.141116","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32183","passing","EPSG","4326","EPSG","32183","1.0","-1.0","0.0","8612137.856451","-219935.732563","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32184","passing","EPSG","4326","EPSG","32184","1.0","-1.0","0.0","9308448.441537","-242408.173378","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32185","passing","EPSG","4326","EPSG","32185","1.0","-1.0","0.0","10081034.668108","-270955.239323","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32186","passing","EPSG","4326","EPSG","32186","1.0","-1.0","0.0","10951884.807940","-308325.366944","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32187","passing","EPSG","4326","EPSG","32187","1.0","-1.0","0.0","11953832.248001","-359297.148725","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32188","passing","EPSG","4326","EPSG","32188","1.0","-1.0","0.0","13139479.444974","-433089.111077","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32189","passing","EPSG","4326","EPSG","32189","1.0","-1.0","0.0","14602368.100993","-550624.402643","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32190","passing","EPSG","4326","EPSG","32190","1.0","-1.0","0.0","16540704.466247","-776353.629276","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32191","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32191","1.0","-1.0","0.0","1.5757736995238E7","-505151.848614","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32192","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32192","1.0","-1.0","0.0","1.5133700109056E7","-473481.699571","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32193","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32193","1.0","-1.0","0.0","1.6414214001085E7","-539612.639806","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32194","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32194","1.0","-1.0","0.0","1.7833009909167E7","-617882.974409","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32198","passing","EPSG","4326","EPSG","32198","1.0","-1.0","0.0","9550099.581142","-761710.176539","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32199","passing","EPSG","4326","EPSG","32199","1.0","-1.0","0.0","1.1519135812446E7","975310.838643","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32201","passing","EPSG","4326","EPSG","32201","1.0","-1.0","0.0","722578.795832","-1.988532147971E7","0.635127","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3925,10 +3925,10 @@ "4326 -> 32659","passing","EPSG","4326","EPSG","32659","1.0","-1.0","0.0","-618308.573583","-1.9883683216779E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32660","passing","EPSG","4326","EPSG","32660","1.0","-1.0","0.0","54603.316023","-1.9885128053496E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32661","passing","EPSG","4326","EPSG","32661","1.0","-1.0","0.0","2224408.737826","-1.0856367979638E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32662","passing","EPSG","4326","EPSG","32662","1.0","-1.0","0.0","111319.490793","-111319.490793","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32663","passing","EPSG","4326","EPSG","32663","1.0","-1.0","0.0","111319.490793","-111319.490793","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32666","passing","EPSG","4326","EPSG","32666","1.0","-1.0","0.0","5.913029814656E7","-2026562.846327","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32667","passing","EPSG","4326","EPSG","32667","1.0","-1.0","0.0","5.0276969639024E7","-1552948.471659","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32662","passing","EPSG","4326","EPSG","32662","1.0","-1.0","0.0","111319.490793","-110574.388558","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32663","passing","EPSG","4326","EPSG","32663","1.0","-1.0","0.0","111319.490793","-110574.388558","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32666","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32666","1.0","-1.0","0.0","5.913029814656E7","-2026562.846327","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32667","refuses:COORDINATE_OUT_OF_DOMAIN","EPSG","4326","EPSG","32667","1.0","-1.0","0.0","5.0276969639024E7","-1552948.471659","0.0","0.030480","0.030480","0.030480","","","","Auto-generated from proj.4 epsg database" "4326 -> 32701","passing","EPSG","4326","EPSG","32701","1.0","-1.0","0.0","722561.736479","-9885331.913518","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32702","passing","EPSG","4326","EPSG","32702","1.0","-1.0","0.0","1392989.214538","-9884306.279451","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32703","passing","EPSG","4326","EPSG","32703","1.0","-1.0","0.0","2073447.882705","-9881992.849296","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" @@ -3986,7 +3986,7 @@ "4326 -> 32759","passing","EPSG","4326","EPSG","32759","1.0","-1.0","0.0","-618308.573583","-9883683.216779","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32760","passing","EPSG","4326","EPSG","32760","1.0","-1.0","0.0","54603.316023","-9885128.053496","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 32761","passing","EPSG","4326","EPSG","32761","1.0","-1.0","0.0","2216760.795442","1.4418217653909E7","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 32766","passing","EPSG","4326","EPSG","32766","1.0","-1.0","0.0","-3663119.27318","9864869.22619","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 32766","passing","EPSG","4326","EPSG","32766","1.0","-1.0","0.0","-3663561.088206","9864850.687614","0.0","0.100000","0.100000","0.100000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3822","passing","EPSG","4326","EPSG","3822","1.0","-1.0","0.0","6376200.806232","111296.999068","-110568.774821","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" "4326 -> 3887","passing","EPSG","4326","EPSG","3887","1.0","-1.0","0.0","6376200.806232","111296.999068","-110568.774821","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" "4326 -> 4000","passing","EPSG","4326","EPSG","4000","1.0","-1.0","0.0","6376200.806232","111296.999068","-110568.774821","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" @@ -4135,147 +4135,147 @@ "4326 -> 7134","passing","EPSG","4326","EPSG","7134","1.0","-1.0","0.0","6376200.806232","111296.999068","-110568.774825","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7137","passing","EPSG","4326","EPSG","7137","1.0","-1.0","0.0","6376200.806232","111296.999068","-110568.774825","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" "4326 -> 7371","passing","EPSG","4326","EPSG","7371","1.0","-1.0","0.0","6376200.806232","111296.999068","-110568.774821","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3901","error","EPSG","4326","EPSG","3901","1.0","-1.0","0.0","500710.973975","-122977.711085","-165.167033","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3902","error","EPSG","4326","EPSG","3902","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 3903","error","EPSG","4326","EPSG","3903","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4097","error","EPSG","4326","EPSG","4097","1.0","-1.0","0.0","-693328.681092","-5111666.040474","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4098","error","EPSG","4326","EPSG","4098","1.0","-1.0","0.0","-605874.418081","-5111959.650981","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4099","error","EPSG","4326","EPSG","4099","1.0","-1.0","0.0","-603605.841381","-5112560.596566","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 4100","error","EPSG","4326","EPSG","4100","1.0","-1.0","0.0","-774077.256672","-5113982.625197","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5318","error","EPSG","4326","EPSG","5318","1.0","-1.0","0.0","1093343.867984","-6111667.938834","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5554","error","EPSG","4326","EPSG","5554","1.0","-1.0","0.0","277438.263521","-110597.97252","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5555","error","EPSG","4326","EPSG","5555","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5556","error","EPSG","4326","EPSG","5556","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5598","error","EPSG","4326","EPSG","5598","1.0","-1.0","0.0","-156452.534464","-112409.590659","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5628","error","EPSG","4326","EPSG","5628","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5698","error","EPSG","4326","EPSG","5698","1.0","-1.0","0.0","398545.725995","756370.639844","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5699","error","EPSG","4326","EPSG","5699","1.0","-1.0","0.0","398545.725995","756370.639844","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5707","error","EPSG","4326","EPSG","5707","1.0","-1.0","0.0","391415.780972","-5098765.098848","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5708","error","EPSG","4326","EPSG","5708","1.0","-1.0","0.0","-192052.368919","-1038091.636738","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5832","error","EPSG","4326","EPSG","5832","1.0","-1.0","0.0","1942839.357237","-110988.891985","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5833","error","EPSG","4326","EPSG","5833","1.0","-1.0","0.0","2606757.139676","-111657.546981","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5834","error","EPSG","4326","EPSG","5834","1.0","-1.0","0.0","3268175.410532","-112647.043075","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5835","error","EPSG","4326","EPSG","5835","1.0","-1.0","0.0","3926105.663731","-113971.626991","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5845","error","EPSG","4326","EPSG","5845","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5846","error","EPSG","4326","EPSG","5846","1.0","-1.0","0.0","-1081967.65415","-112657.885597","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5847","error","EPSG","4326","EPSG","5847","1.0","-1.0","0.0","-1252522.815483","-113277.274139","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5848","error","EPSG","4326","EPSG","5848","1.0","-1.0","0.0","-1424077.256672","-113982.625197","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5849","error","EPSG","4326","EPSG","5849","1.0","-1.0","0.0","-1596762.562957","-114776.551708","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5850","error","EPSG","4326","EPSG","5850","1.0","-1.0","0.0","-1770714.490165","-115662.040423","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5851","error","EPSG","4326","EPSG","5851","1.0","-1.0","0.0","-1338166.993449","-113619.049509","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5852","error","EPSG","4326","EPSG","5852","1.0","-1.0","0.0","-1510270.171064","-114368.338914","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5853","error","EPSG","4326","EPSG","5853","1.0","-1.0","0.0","-1683571.536271","-115207.648789","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5854","error","EPSG","4326","EPSG","5854","1.0","-1.0","0.0","-1858209.137234","-116140.162883","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5855","error","EPSG","4326","EPSG","5855","1.0","-1.0","0.0","-2034326.041478","-117169.481617","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5856","error","EPSG","4326","EPSG","5856","1.0","-1.0","0.0","-2212070.945308","-118299.655886","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5857","error","EPSG","4326","EPSG","5857","1.0","-1.0","0.0","-2391598.821908","-119535.225511","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5942","error","EPSG","4326","EPSG","5942","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5945","error","EPSG","4326","EPSG","5945","1.0","-1.0","0.0","-401380.815652","-5542201.223317","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5946","error","EPSG","4326","EPSG","5946","1.0","-1.0","0.0","-513112.691755","-5542371.843025","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5947","error","EPSG","4326","EPSG","5947","1.0","-1.0","0.0","-625033.675235","-5542577.168148","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5948","error","EPSG","4326","EPSG","5948","1.0","-1.0","0.0","-737178.841287","-5542817.519514","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5949","error","EPSG","4326","EPSG","5949","1.0","-1.0","0.0","-849583.615474","-5543093.2745","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5950","error","EPSG","4326","EPSG","5950","1.0","-1.0","0.0","-962283.83098","-5543404.868499","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5951","error","EPSG","4326","EPSG","5951","1.0","-1.0","0.0","-1075315.787292","-5543752.796612","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5952","error","EPSG","4326","EPSG","5952","1.0","-1.0","0.0","-1188716.310511","-5544137.615587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5953","error","EPSG","4326","EPSG","5953","1.0","-1.0","0.0","-1302522.815483","-5544559.94602","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5954","error","EPSG","4326","EPSG","5954","1.0","-1.0","0.0","-1416773.369932","-5545020.474823","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5955","error","EPSG","4326","EPSG","5955","1.0","-1.0","0.0","-1531506.760797","-5545519.957977","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5956","error","EPSG","4326","EPSG","5956","1.0","-1.0","0.0","-1646762.562957","-5546059.223589","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5957","error","EPSG","4326","EPSG","5957","1.0","-1.0","0.0","-1762581.210546","-5546639.175265","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5958","error","EPSG","4326","EPSG","5958","1.0","-1.0","0.0","-1879004.071028","-5547260.795821","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5959","error","EPSG","4326","EPSG","5959","1.0","-1.0","0.0","-1996073.52225","-5547925.151356","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5960","error","EPSG","4326","EPSG","5960","1.0","-1.0","0.0","-2113833.032642","-5548633.395688","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5961","error","EPSG","4326","EPSG","5961","1.0","-1.0","0.0","-2232327.244772","-5549386.775214","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5962","error","EPSG","4326","EPSG","5962","1.0","-1.0","0.0","-2351602.06243","-5550186.63417","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5963","error","EPSG","4326","EPSG","5963","1.0","-1.0","0.0","-2471704.741451","-5551034.42036","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5964","error","EPSG","4326","EPSG","5964","1.0","-1.0","0.0","-2592683.984457","-5551931.691349","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5965","error","EPSG","4326","EPSG","5965","1.0","-1.0","0.0","-2714590.039706","-5552880.121167","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5966","error","EPSG","4326","EPSG","5966","1.0","-1.0","0.0","-2837474.804249","-5553881.507544","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5967","error","EPSG","4326","EPSG","5967","1.0","-1.0","0.0","-2961391.931586","-5554937.779704","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5968","error","EPSG","4326","EPSG","5968","1.0","-1.0","0.0","-3086396.944001","-5556051.006767","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5969","error","EPSG","4326","EPSG","5969","1.0","-1.0","0.0","-3212547.349776","-5557223.406762","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5970","error","EPSG","4326","EPSG","5970","1.0","-1.0","0.0","-3339902.765479","-5558457.356322","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5971","error","EPSG","4326","EPSG","5971","1.0","-1.0","0.0","277438.263521","-110597.97252","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5972","error","EPSG","4326","EPSG","5972","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5973","error","EPSG","4326","EPSG","5973","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5974","error","EPSG","4326","EPSG","5974","1.0","-1.0","0.0","-1772080.292418","-117674.699966","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5975","error","EPSG","4326","EPSG","5975","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 5976","error","EPSG","4326","EPSG","5976","1.0","-1.0","0.0","-3262671.40897","-130501.513833","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6144","error","EPSG","4326","EPSG","6144","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6145","error","EPSG","4326","EPSG","6145","1.0","-1.0","0.0","-401380.815652","-5542201.223317","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6146","error","EPSG","4326","EPSG","6146","1.0","-1.0","0.0","-513112.691755","-5542371.843025","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6147","error","EPSG","4326","EPSG","6147","1.0","-1.0","0.0","-625033.675235","-5542577.168148","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6148","error","EPSG","4326","EPSG","6148","1.0","-1.0","0.0","-737178.841287","-5542817.519514","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6149","error","EPSG","4326","EPSG","6149","1.0","-1.0","0.0","-849583.615474","-5543093.2745","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6150","error","EPSG","4326","EPSG","6150","1.0","-1.0","0.0","-962283.83098","-5543404.868499","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6151","error","EPSG","4326","EPSG","6151","1.0","-1.0","0.0","-1075315.787292","-5543752.796612","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6152","error","EPSG","4326","EPSG","6152","1.0","-1.0","0.0","-1188716.310511","-5544137.615587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6153","error","EPSG","4326","EPSG","6153","1.0","-1.0","0.0","-1302522.815483","-5544559.94602","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6154","error","EPSG","4326","EPSG","6154","1.0","-1.0","0.0","-1416773.369932","-5545020.474823","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6155","error","EPSG","4326","EPSG","6155","1.0","-1.0","0.0","-1531506.760797","-5545519.957977","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6156","error","EPSG","4326","EPSG","6156","1.0","-1.0","0.0","-1646762.562957","-5546059.223589","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6157","error","EPSG","4326","EPSG","6157","1.0","-1.0","0.0","-1762581.210546","-5546639.175265","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6158","error","EPSG","4326","EPSG","6158","1.0","-1.0","0.0","-1879004.071028","-5547260.795821","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6159","error","EPSG","4326","EPSG","6159","1.0","-1.0","0.0","-1996073.52225","-5547925.151356","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6160","error","EPSG","4326","EPSG","6160","1.0","-1.0","0.0","-2113833.032642","-5548633.395688","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6161","error","EPSG","4326","EPSG","6161","1.0","-1.0","0.0","-2232327.244772","-5549386.775214","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6162","error","EPSG","4326","EPSG","6162","1.0","-1.0","0.0","-2351602.06243","-5550186.63417","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6163","error","EPSG","4326","EPSG","6163","1.0","-1.0","0.0","-2471704.741451","-5551034.42036","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6164","error","EPSG","4326","EPSG","6164","1.0","-1.0","0.0","-2592683.984457","-5551931.691349","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6165","error","EPSG","4326","EPSG","6165","1.0","-1.0","0.0","-2714590.039706","-5552880.121167","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6166","error","EPSG","4326","EPSG","6166","1.0","-1.0","0.0","-2837474.804249","-5553881.507544","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6167","error","EPSG","4326","EPSG","6167","1.0","-1.0","0.0","-2961391.931586","-5554937.779704","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6168","error","EPSG","4326","EPSG","6168","1.0","-1.0","0.0","-3086396.944001","-5556051.006767","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6169","error","EPSG","4326","EPSG","6169","1.0","-1.0","0.0","-3212547.349776","-5557223.406762","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6170","error","EPSG","4326","EPSG","6170","1.0","-1.0","0.0","-3339902.765479","-5558457.356322","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6171","error","EPSG","4326","EPSG","6171","1.0","-1.0","0.0","277438.263521","-110597.97252","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6172","error","EPSG","4326","EPSG","6172","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6173","error","EPSG","4326","EPSG","6173","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6174","error","EPSG","4326","EPSG","6174","1.0","-1.0","0.0","-1772080.292418","-117674.699966","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6175","error","EPSG","4326","EPSG","6175","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6176","error","EPSG","4326","EPSG","6176","1.0","-1.0","0.0","-3262671.40897","-130501.513833","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6190","error","EPSG","4326","EPSG","6190","1.0","-1.0","0.0","-381574.921263","-6309409.37876","-138.725677","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6649","error","EPSG","4326","EPSG","6649","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6650","error","EPSG","4326","EPSG","6650","1.0","-1.0","0.0","5079577.277109","-1.9855384152114E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6651","error","EPSG","4326","EPSG","6651","1.0","-1.0","0.0","5967185.609991","-1.9841803628716E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6652","error","EPSG","4326","EPSG","6652","1.0","-1.0","0.0","6950996.913984","-1.982316954146E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6653","error","EPSG","4326","EPSG","6653","1.0","-1.0","0.0","8068672.129214","-1.979682812923E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6654","error","EPSG","4326","EPSG","6654","1.0","-1.0","0.0","9380117.510219","-1.9757704843637E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6655","error","EPSG","4326","EPSG","6655","1.0","-1.0","0.0","1.0990756729525E7","-1.9694702609941E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6656","error","EPSG","4326","EPSG","6656","1.0","-1.0","0.0","1.3117319676437E7","-1.9577493844715E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6657","error","EPSG","4326","EPSG","6657","1.0","-1.0","0.0","1.635961359846E7","-1.9271652378892E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6658","error","EPSG","4326","EPSG","6658","1.0","-1.0","0.0","9821617.197798","-6559044.245001","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6661","error","EPSG","4326","EPSG","6661","1.0","-1.0","0.0","1.4018825808604E7","-484015.283423","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6662","error","EPSG","4326","EPSG","6662","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6663","error","EPSG","4326","EPSG","6663","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6664","error","EPSG","4326","EPSG","6664","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6665","error","EPSG","4326","EPSG","6665","1.0","-1.0","0.0","7306321.314799","-180502.818931","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6696","error","EPSG","4326","EPSG","6696","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6697","error","EPSG","4326","EPSG","6697","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6700","error","EPSG","4326","EPSG","6700","1.0","-1.0","0.0","0.99542","-1.00611","889.274204","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 6917","error","EPSG","4326","EPSG","6917","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7400","error","EPSG","4326","EPSG","7400","1.0","-1.0","0.0","-1.336717","-1.002977","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7401","error","EPSG","4326","EPSG","7401","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7402","error","EPSG","4326","EPSG","7402","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7403","error","EPSG","4326","EPSG","7403","1.0","-1.0","0.0","403662.941422","-2299940.941008","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7404","error","EPSG","4326","EPSG","7404","1.0","-1.0","0.0","1.001649","-1.004895","335.681331","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7405","error","EPSG","4326","EPSG","7405","1.0","-1.0","0.0","734004.745925","-5638279.547703","269.614465","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7406","error","EPSG","4326","EPSG","7406","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7407","error","EPSG","4326","EPSG","7407","1.0","-1.0","0.0","3.9497735901602E7","7799003.914727","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7408","error","EPSG","4326","EPSG","7408","1.0","-1.0","0.0","1.00016","-1.00418","155.870901","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7409","error","EPSG","4326","EPSG","7409","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7410","error","EPSG","4326","EPSG","7410","1.0","-1.0","0.0","0.999686","-1.00218","-31.060822","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7411","error","EPSG","4326","EPSG","7411","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7412","error","EPSG","4326","EPSG","7412","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7413","error","EPSG","4326","EPSG","7413","1.0","-1.0","0.0","403662.941422","-2299940.941008","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7414","error","EPSG","4326","EPSG","7414","1.0","-1.0","0.0","0.99542","-1.00611","889.274204","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7415","error","EPSG","4326","EPSG","7415","1.0","-1.0","0.0","-455004.893909","-5876134.742828","155.870901","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7416","error","EPSG","4326","EPSG","7416","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7417","error","EPSG","4326","EPSG","7417","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7418","error","EPSG","4326","EPSG","7418","1.0","-1.0","0.0","-749536.136293","-111805.012088","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7419","error","EPSG","4326","EPSG","7419","1.0","-1.0","0.0","-731906.055767","-112652.252702","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7420","error","EPSG","4326","EPSG","7420","1.0","-1.0","0.0","-674077.256672","-113982.625197","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7421","error","EPSG","4326","EPSG","7421","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7422","error","EPSG","4326","EPSG","7422","1.0","-1.0","0.0","403662.941422","-2299940.941008","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" -"4326 -> 7423","error","EPSG","4326","EPSG","7423","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3901","passing","EPSG","4326","EPSG","3901","1.0","-1.0","0.0","500676.475839","-122978.789758","-165.167033","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3902","passing","EPSG","4326","EPSG","3902","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 3903","passing","EPSG","4326","EPSG","3903","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4097","passing","EPSG","4326","EPSG","4097","1.0","-1.0","0.0","-693328.681092","-5111666.040474","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4098","passing","EPSG","4326","EPSG","4098","1.0","-1.0","0.0","-605874.429317","-5111959.651120","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4099","passing","EPSG","4326","EPSG","4099","1.0","-1.0","0.0","-603605.879504","-5112560.597112","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 4100","passing","EPSG","4326","EPSG","4100","1.0","-1.0","0.0","-774077.513711","-5113982.629795","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5318","passing","EPSG","4326","EPSG","5318","1.0","-1.0","0.0","1093343.867984","-6111667.938834","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5554","passing","EPSG","4326","EPSG","5554","1.0","-1.0","0.0","277438.263521","-110597.97252","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5555","passing","EPSG","4326","EPSG","5555","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5556","passing","EPSG","4326","EPSG","5556","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5598","passing","EPSG","4326","EPSG","5598","1.0","-1.0","0.0","-156452.563390","-112409.591061","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5628","passing","EPSG","4326","EPSG","5628","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5698","passing","EPSG","4326","EPSG","5698","1.0","-1.0","0.0","398545.725995","756370.639844","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5699","passing","EPSG","4326","EPSG","5699","1.0","-1.0","0.0","398545.725995","756370.639844","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5707","passing","EPSG","4326","EPSG","5707","1.0","-1.0","0.0","391415.780972","-5098765.098848","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5708","passing","EPSG","4326","EPSG","5708","1.0","-1.0","0.0","-192052.368919","-1038091.636738","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5832","passing","EPSG","4326","EPSG","5832","1.0","-1.0","0.0","1942839.357237","-110988.891985","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5833","passing","EPSG","4326","EPSG","5833","1.0","-1.0","0.0","2606757.139676","-111657.546981","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5834","passing","EPSG","4326","EPSG","5834","1.0","-1.0","0.0","3268175.365858","-112647.043727","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5835","passing","EPSG","4326","EPSG","5835","1.0","-1.0","0.0","3926105.407353","-113971.631576","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5845","passing","EPSG","4326","EPSG","5845","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5846","passing","EPSG","4326","EPSG","5846","1.0","-1.0","0.0","-1081967.698965","-112657.886251","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5847","passing","EPSG","4326","EPSG","5847","1.0","-1.0","0.0","-1252522.927306","-113277.275955","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5848","passing","EPSG","4326","EPSG","5848","1.0","-1.0","0.0","-1424077.513711","-113982.629795","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5849","passing","EPSG","4326","EPSG","5849","1.0","-1.0","0.0","-1596763.115252","-114776.562495","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5850","passing","EPSG","4326","EPSG","5850","1.0","-1.0","0.0","-1770715.611551","-115662.064177","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5851","passing","EPSG","4326","EPSG","5851","1.0","-1.0","0.0","-1338167.164560","-113619.052429","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5852","passing","EPSG","4326","EPSG","5852","1.0","-1.0","0.0","-1510270.550748","-114368.346018","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5853","passing","EPSG","4326","EPSG","5853","1.0","-1.0","0.0","-1683572.328388","-115207.664914","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5854","passing","EPSG","4326","EPSG","5854","1.0","-1.0","0.0","-1858210.705750","-116140.197409","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5855","passing","EPSG","4326","EPSG","5855","1.0","-1.0","0.0","-2034329.011169","-117169.551923","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5856","passing","EPSG","4326","EPSG","5856","1.0","-1.0","0.0","-2212076.352748","-118299.792953","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5857","passing","EPSG","4326","EPSG","5857","1.0","-1.0","0.0","-2391608.336377","-119535.482706","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5942","passing","EPSG","4326","EPSG","5942","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5945","passing","EPSG","4326","EPSG","5945","1.0","-1.0","0.0","-401380.815652","-5542201.223317","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5946","passing","EPSG","4326","EPSG","5946","1.0","-1.0","0.0","-513112.691755","-5542371.843025","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5947","passing","EPSG","4326","EPSG","5947","1.0","-1.0","0.0","-625033.675235","-5542577.168148","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5948","passing","EPSG","4326","EPSG","5948","1.0","-1.0","0.0","-737178.841287","-5542817.519514","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5949","passing","EPSG","4326","EPSG","5949","1.0","-1.0","0.0","-849583.615474","-5543093.2745","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5950","passing","EPSG","4326","EPSG","5950","1.0","-1.0","0.0","-962283.847191","-5543404.868706","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5951","passing","EPSG","4326","EPSG","5951","1.0","-1.0","0.0","-1075315.819628","-5543752.797063","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5952","passing","EPSG","4326","EPSG","5952","1.0","-1.0","0.0","-1188716.371920","-5544137.616514","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5953","passing","EPSG","4326","EPSG","5953","1.0","-1.0","0.0","-1302522.927306","-5544559.947834","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5954","passing","EPSG","4326","EPSG","5954","1.0","-1.0","0.0","-1416773.566285","-5545020.478225","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5955","passing","EPSG","4326","EPSG","5955","1.0","-1.0","0.0","-1531507.094775","-5545519.964131","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5956","passing","EPSG","4326","EPSG","5956","1.0","-1.0","0.0","-1646763.115252","-5546059.234374","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5957","passing","EPSG","4326","EPSG","5957","1.0","-1.0","0.0","-1762582.101218","-5546639.193638","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5958","passing","EPSG","4326","EPSG","5958","1.0","-1.0","0.0","-1879005.475356","-5547260.826342","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5959","passing","EPSG","4326","EPSG","5959","1.0","-1.0","0.0","-1996075.691768","-5547925.200909","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5960","passing","EPSG","4326","EPSG","5960","1.0","-1.0","0.0","-2113836.322727","-5548633.474492","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5961","passing","EPSG","4326","EPSG","5961","1.0","-1.0","0.0","-2232332.150416","-5549386.898187","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5962","passing","EPSG","4326","EPSG","5962","1.0","-1.0","0.0","-2351609.264146","-5550186.822769","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5963","passing","EPSG","4326","EPSG","5963","1.0","-1.0","0.0","-2471715.163646","-5551034.705028","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5964","passing","EPSG","4326","EPSG","5964","1.0","-1.0","0.0","-2592698.869007","-5551932.114736","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5965","passing","EPSG","4326","EPSG","5965","1.0","-1.0","0.0","-2714611.037981","-5552880.742333","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5966","passing","EPSG","4326","EPSG","5966","1.0","-1.0","0.0","-2837504.091373","-5553882.407388","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5967","passing","EPSG","4326","EPSG","5967","1.0","-1.0","0.0","-2961432.347352","-5554939.067940","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5968","passing","EPSG","4326","EPSG","5968","1.0","-1.0","0.0","-3086452.165613","-5556052.830799","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5969","passing","EPSG","4326","EPSG","5969","1.0","-1.0","0.0","-3212622.102393","-5557225.962917","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5970","passing","EPSG","4326","EPSG","5970","1.0","-1.0","0.0","-3340003.077490","-5558460.903966","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5971","passing","EPSG","4326","EPSG","5971","1.0","-1.0","0.0","277438.263521","-110597.97252","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5972","passing","EPSG","4326","EPSG","5972","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5973","passing","EPSG","4326","EPSG","5973","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5974","passing","EPSG","4326","EPSG","5974","1.0","-1.0","0.0","-1772080.292418","-117674.699966","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5975","passing","EPSG","4326","EPSG","5975","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 5976","passing","EPSG","4326","EPSG","5976","1.0","-1.0","0.0","-3262671.40897","-130501.513833","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6144","passing","EPSG","4326","EPSG","6144","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6145","passing","EPSG","4326","EPSG","6145","1.0","-1.0","0.0","-401380.815652","-5542201.223317","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6146","passing","EPSG","4326","EPSG","6146","1.0","-1.0","0.0","-513112.691755","-5542371.843025","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6147","passing","EPSG","4326","EPSG","6147","1.0","-1.0","0.0","-625033.675235","-5542577.168148","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6148","passing","EPSG","4326","EPSG","6148","1.0","-1.0","0.0","-737178.841287","-5542817.519514","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6149","passing","EPSG","4326","EPSG","6149","1.0","-1.0","0.0","-849583.615474","-5543093.2745","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6150","passing","EPSG","4326","EPSG","6150","1.0","-1.0","0.0","-962283.847191","-5543404.868706","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6151","passing","EPSG","4326","EPSG","6151","1.0","-1.0","0.0","-1075315.819628","-5543752.797063","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6152","passing","EPSG","4326","EPSG","6152","1.0","-1.0","0.0","-1188716.371920","-5544137.616514","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6153","passing","EPSG","4326","EPSG","6153","1.0","-1.0","0.0","-1302522.927306","-5544559.947834","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6154","passing","EPSG","4326","EPSG","6154","1.0","-1.0","0.0","-1416773.566285","-5545020.478225","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6155","passing","EPSG","4326","EPSG","6155","1.0","-1.0","0.0","-1531507.094775","-5545519.964131","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6156","passing","EPSG","4326","EPSG","6156","1.0","-1.0","0.0","-1646763.115252","-5546059.234374","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6157","passing","EPSG","4326","EPSG","6157","1.0","-1.0","0.0","-1762582.101218","-5546639.193638","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6158","passing","EPSG","4326","EPSG","6158","1.0","-1.0","0.0","-1879005.475356","-5547260.826342","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6159","passing","EPSG","4326","EPSG","6159","1.0","-1.0","0.0","-1996075.691768","-5547925.200909","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6160","passing","EPSG","4326","EPSG","6160","1.0","-1.0","0.0","-2113836.322727","-5548633.474492","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6161","passing","EPSG","4326","EPSG","6161","1.0","-1.0","0.0","-2232332.150416","-5549386.898187","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6162","passing","EPSG","4326","EPSG","6162","1.0","-1.0","0.0","-2351609.264146","-5550186.822769","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6163","passing","EPSG","4326","EPSG","6163","1.0","-1.0","0.0","-2471715.163646","-5551034.705028","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6164","passing","EPSG","4326","EPSG","6164","1.0","-1.0","0.0","-2592698.869007","-5551932.114736","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6165","passing","EPSG","4326","EPSG","6165","1.0","-1.0","0.0","-2714611.037981","-5552880.742333","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6166","passing","EPSG","4326","EPSG","6166","1.0","-1.0","0.0","-2837504.091373","-5553882.407388","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6167","passing","EPSG","4326","EPSG","6167","1.0","-1.0","0.0","-2961432.347352","-5554939.067940","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6168","passing","EPSG","4326","EPSG","6168","1.0","-1.0","0.0","-3086452.165613","-5556052.830799","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6169","passing","EPSG","4326","EPSG","6169","1.0","-1.0","0.0","-3212622.102393","-5557225.962917","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6170","passing","EPSG","4326","EPSG","6170","1.0","-1.0","0.0","-3340003.077490","-5558460.903966","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6171","passing","EPSG","4326","EPSG","6171","1.0","-1.0","0.0","277438.263521","-110597.97252","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6172","passing","EPSG","4326","EPSG","6172","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6173","passing","EPSG","4326","EPSG","6173","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6174","passing","EPSG","4326","EPSG","6174","1.0","-1.0","0.0","-1772080.292418","-117674.699966","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6175","passing","EPSG","4326","EPSG","6175","1.0","-1.0","0.0","-2498135.612029","-123071.814862","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6176","passing","EPSG","4326","EPSG","6176","1.0","-1.0","0.0","-3262671.40897","-130501.513833","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6190","passing","EPSG","4326","EPSG","6190","1.0","-1.0","0.0","-381574.921263","-6309409.37876","-138.725677","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6649","passing","EPSG","4326","EPSG","6649","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6650","passing","EPSG","4326","EPSG","6650","1.0","-1.0","0.0","5079577.277109","-1.9855384152114E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6651","passing","EPSG","4326","EPSG","6651","1.0","-1.0","0.0","5967185.609991","-1.9841803628716E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6652","passing","EPSG","4326","EPSG","6652","1.0","-1.0","0.0","6950996.913984","-1.982316954146E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6653","passing","EPSG","4326","EPSG","6653","1.0","-1.0","0.0","8068672.129214","-1.979682812923E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6654","passing","EPSG","4326","EPSG","6654","1.0","-1.0","0.0","9380117.510219","-1.9757704843637E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6655","passing","EPSG","4326","EPSG","6655","1.0","-1.0","0.0","1.0990756729525E7","-1.9694702609941E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6656","passing","EPSG","4326","EPSG","6656","1.0","-1.0","0.0","1.3117319676437E7","-1.9577493844715E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6657","passing","EPSG","4326","EPSG","6657","1.0","-1.0","0.0","1.635961359846E7","-1.9271652378892E7","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6658","passing","EPSG","4326","EPSG","6658","1.0","-1.0","0.0","9821617.197798","-6559044.245001","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6661","passing","EPSG","4326","EPSG","6661","1.0","-1.0","0.0","1.4018825808604E7","-484015.283423","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6662","passing","EPSG","4326","EPSG","6662","1.0","-1.0","0.0","1.1625664379252E7","-331585.409964","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6663","passing","EPSG","4326","EPSG","6663","1.0","-1.0","0.0","9876408.371062","-255706.192524","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6664","passing","EPSG","4326","EPSG","6664","1.0","-1.0","0.0","8480365.932792","-210356.338473","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6665","passing","EPSG","4326","EPSG","6665","1.0","-1.0","0.0","7306321.314799","-180502.818931","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6696","passing","EPSG","4326","EPSG","6696","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6697","passing","EPSG","4326","EPSG","6697","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6700","passing","EPSG","4326","EPSG","6700","1.0","-1.0","0.0","0.99542","-1.00611","889.274204","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 6917","passing","EPSG","4326","EPSG","6917","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7400","passing","EPSG","4326","EPSG","7400","1.0","-1.0","0.0","-1.336717","-1.002977","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7401","passing","EPSG","4326","EPSG","7401","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7402","passing","EPSG","4326","EPSG","7402","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7403","passing","EPSG","4326","EPSG","7403","1.0","-1.0","0.0","403662.941422","-2299940.941008","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7404","passing","EPSG","4326","EPSG","7404","1.0","-1.0","0.0","1.001649","-1.004895","335.681331","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7405","passing","EPSG","4326","EPSG","7405","1.0","-1.0","0.0","734004.745925","-5638279.547703","269.614465","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7406","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","7406","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7407","refuses:COORDINATE_OUTSIDE_GRID","EPSG","4326","EPSG","7407","1.0","-1.0","0.0","3.9497735901602E7","7799003.914727","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7408","passing","EPSG","4326","EPSG","7408","1.0","-1.0","0.0","1.00016","-1.00418","155.870901","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7409","passing","EPSG","4326","EPSG","7409","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7410","passing","EPSG","4326","EPSG","7410","1.0","-1.0","0.0","0.999686","-1.00218","-31.060822","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7411","passing","EPSG","4326","EPSG","7411","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7412","passing","EPSG","4326","EPSG","7412","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7413","passing","EPSG","4326","EPSG","7413","1.0","-1.0","0.0","403662.941422","-2299940.941008","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7414","passing","EPSG","4326","EPSG","7414","1.0","-1.0","0.0","0.99542","-1.00611","889.274204","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7415","passing","EPSG","4326","EPSG","7415","1.0","-1.0","0.0","-455004.756019","-5876134.609736","155.870901","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7416","passing","EPSG","4326","EPSG","7416","1.0","-1.0","0.0","-392989.214538","-111623.606587","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7417","passing","EPSG","4326","EPSG","7417","1.0","-1.0","0.0","-1073447.882706","-113937.036743","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7418","passing","EPSG","4326","EPSG","7418","1.0","-1.0","0.0","-749536.136293","-111805.012088","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7419","passing","EPSG","4326","EPSG","7419","1.0","-1.0","0.0","-731906.100580","-112652.253357","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7420","passing","EPSG","4326","EPSG","7420","1.0","-1.0","0.0","-674077.513711","-113982.629795","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7421","passing","EPSG","4326","EPSG","7421","1.0","-1.0","0.0","397702.058411","-3694198.247873","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7422","passing","EPSG","4326","EPSG","7422","1.0","-1.0","0.0","403662.941422","-2299940.941008","62.495489","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" +"4326 -> 7423","passing","EPSG","4326","EPSG","7423","1.0","-1.0","0.0","1.0","-1.0","0.0","0.010000","0.010000","0.010000","","","","Auto-generated from proj.4 epsg database" diff --git a/core/src/test/resources/proj4/nad/proj4jtestdupes b/core/src/test/resources/proj4/nad/proj4jtestdupes new file mode 100644 index 0000000..fc2aa5b --- /dev/null +++ b/core/src/test/resources/proj4/nad/proj4jtestdupes @@ -0,0 +1,10 @@ +# Fixture for InitFileCacheTest. NOT a real authority. +# +# A code repeated with different parameters, which is the case that decides whether the reverse +# index may be built from the forward index. The old whole-file scan saw BOTH entries, so +# "+proj=merc +datum=WGS84" reverse-resolves to A, not to B. A reverse index derived from the +# forward map would never have seen A's second parameter set and would answer B. + +proj=longlat +datum=WGS84 <> + +proj=merc +datum=WGS84 <> + +proj=merc +datum=WGS84 <> + +proj=aea +lat_1=50 <> diff --git a/core/src/test/resources/proj4/nad/proj4jtestmalformed b/core/src/test/resources/proj4/nad/proj4jtestmalformed new file mode 100644 index 0000000..177ccf4 --- /dev/null +++ b/core/src/test/resources/proj4/nad/proj4jtestmalformed @@ -0,0 +1,8 @@ +# Fixture for InitFileCacheTest. NOT a real authority. +# +# One good entry, then a '<' that is not followed by a word. The streaming scan resolved +# without ever reaching the bad entry and threw only for a name it had to scan past it to find. +# The cache must reproduce both halves. + +proj=longlat +datum=WGS84 <> +<> +proj=merc <> + +proj=merc <> diff --git a/core/src/test/resources/proj4j-data/grids/INDEX b/core/src/test/resources/proj4j-data/grids/INDEX new file mode 100644 index 0000000..b9421cd --- /dev/null +++ b/core/src/test/resources/proj4j-data/grids/INDEX @@ -0,0 +1,38 @@ +conus +ntv2_0_downsampled.gsb +egm96_15_downsampled.gtx +test_hgrid_degree.tif +test_hgrid_extra_ifd_with_other_info.tif +test_hgrid_lon_shift_first.tif +test_hgrid_positive_west.tif +test_hgrid_radian.tif +test_hgrid_separate.tif +test_hgrid_strip.tif +test_hgrid_tiled_separate.tif +test_hgrid_tiled.tif +test_hgrid_with_overview.tif +test_hgrid_with_subgrid_no_grid_name.tif +test_hgrid_with_subgrid.tif +test_hgrid.tif +test_hydroid_height.tif +test_vgrid_bigendian_bigtiff.tif +test_vgrid_bigendian.tif +test_vgrid_bigtiff.tif +test_vgrid_bottomup_with_matrix.tif +test_vgrid_bottomup_with_scale.tif +test_vgrid_deflate_floatingpointpredictor.tif +test_vgrid_float64.tif +test_vgrid_in_second_channel.tif +test_vgrid_int16.tif +test_vgrid_invalid_channel_type.tif +test_vgrid_nodata.tif +test_vgrid_pixelisarea.tif +test_vgrid_pixelispoint.tif +test_vgrid_single_strip_truncated.tif +test_vgrid_uint16_with_scale_offset.tif +test_vgrid_unsupported_byte.tif +test_vgrid_with_overview.tif +test_vgrid_with_subgrid.tif +us_noaa_geoid06_ak_subset_at_antimeridian.tif +us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif +us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif diff --git a/core/src/test/resources/proj4j-data/grids/conus b/core/src/test/resources/proj4j-data/grids/conus new file mode 100644 index 0000000..44b4900 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/conus differ diff --git a/core/src/test/resources/proj4j-data/grids/egm96_15_downsampled.gtx b/core/src/test/resources/proj4j-data/grids/egm96_15_downsampled.gtx new file mode 100644 index 0000000..ea53ab1 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/egm96_15_downsampled.gtx differ diff --git a/core/src/test/resources/proj4j-data/grids/ntv2_0_downsampled.gsb b/core/src/test/resources/proj4j-data/grids/ntv2_0_downsampled.gsb new file mode 100644 index 0000000..06b8111 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/ntv2_0_downsampled.gsb differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid.tif new file mode 100644 index 0000000..94718c2 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_degree.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_degree.tif new file mode 100644 index 0000000..d06782e Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_degree.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_extra_ifd_with_other_info.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_extra_ifd_with_other_info.tif new file mode 100644 index 0000000..b7e67af Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_extra_ifd_with_other_info.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_lon_shift_first.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_lon_shift_first.tif new file mode 100644 index 0000000..395f074 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_lon_shift_first.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_positive_west.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_positive_west.tif new file mode 100644 index 0000000..4ebc17c Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_positive_west.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_radian.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_radian.tif new file mode 100644 index 0000000..30219cc Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_radian.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_separate.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_separate.tif new file mode 100644 index 0000000..ef2ca57 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_separate.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_strip.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_strip.tif new file mode 100644 index 0000000..e38fc60 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_strip.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_tiled.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_tiled.tif new file mode 100644 index 0000000..b0d5dd8 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_tiled.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_tiled_separate.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_tiled_separate.tif new file mode 100644 index 0000000..d7e0934 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_tiled_separate.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_with_overview.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_with_overview.tif new file mode 100644 index 0000000..d7453b4 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_with_overview.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_with_subgrid.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_with_subgrid.tif new file mode 100644 index 0000000..46a8f2f Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_with_subgrid.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hgrid_with_subgrid_no_grid_name.tif b/core/src/test/resources/proj4j-data/grids/test_hgrid_with_subgrid_no_grid_name.tif new file mode 100644 index 0000000..974699b Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hgrid_with_subgrid_no_grid_name.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_hydroid_height.tif b/core/src/test/resources/proj4j-data/grids/test_hydroid_height.tif new file mode 100644 index 0000000..4b8db2e Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_hydroid_height.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_bigendian.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_bigendian.tif new file mode 100644 index 0000000..5cf4a03 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_bigendian.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_bigendian_bigtiff.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_bigendian_bigtiff.tif new file mode 100644 index 0000000..a586b85 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_bigendian_bigtiff.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_bigtiff.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_bigtiff.tif new file mode 100644 index 0000000..2a01893 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_bigtiff.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_bottomup_with_matrix.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_bottomup_with_matrix.tif new file mode 100644 index 0000000..90f637d Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_bottomup_with_matrix.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_bottomup_with_scale.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_bottomup_with_scale.tif new file mode 100644 index 0000000..636b7dc Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_bottomup_with_scale.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_deflate_floatingpointpredictor.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_deflate_floatingpointpredictor.tif new file mode 100644 index 0000000..5fd7b9f Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_deflate_floatingpointpredictor.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_float64.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_float64.tif new file mode 100644 index 0000000..16b3e79 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_float64.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_in_second_channel.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_in_second_channel.tif new file mode 100644 index 0000000..d377f8b Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_in_second_channel.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_int16.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_int16.tif new file mode 100644 index 0000000..1c69b5d Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_int16.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_invalid_channel_type.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_invalid_channel_type.tif new file mode 100644 index 0000000..ec9e641 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_invalid_channel_type.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_nodata.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_nodata.tif new file mode 100644 index 0000000..65ec534 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_nodata.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_pixelisarea.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_pixelisarea.tif new file mode 100644 index 0000000..a5409f6 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_pixelisarea.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_pixelispoint.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_pixelispoint.tif new file mode 100644 index 0000000..cfeb598 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_pixelispoint.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_single_strip_truncated.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_single_strip_truncated.tif new file mode 100644 index 0000000..9a0030f Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_single_strip_truncated.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_uint16_with_scale_offset.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_uint16_with_scale_offset.tif new file mode 100644 index 0000000..b08fa4a Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_uint16_with_scale_offset.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_unsupported_byte.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_unsupported_byte.tif new file mode 100644 index 0000000..ccf03fc Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_unsupported_byte.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_with_overview.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_with_overview.tif new file mode 100644 index 0000000..aa15aa1 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_with_overview.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/test_vgrid_with_subgrid.tif b/core/src/test/resources/proj4j-data/grids/test_vgrid_with_subgrid.tif new file mode 100644 index 0000000..5c7584c Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/test_vgrid_with_subgrid.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/us_noaa_geoid06_ak_subset_at_antimeridian.tif b/core/src/test/resources/proj4j-data/grids/us_noaa_geoid06_ak_subset_at_antimeridian.tif new file mode 100644 index 0000000..2c01759 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/us_noaa_geoid06_ak_subset_at_antimeridian.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif b/core/src/test/resources/proj4j-data/grids/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif new file mode 100644 index 0000000..c2acae8 Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/us_noaa_nadcon5_nad83_1986_nad83_harn_conus_extract_sanfrancisco.tif differ diff --git a/core/src/test/resources/proj4j-data/grids/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif b/core/src/test/resources/proj4j-data/grids/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif new file mode 100644 index 0000000..67a8d9a Binary files /dev/null and b/core/src/test/resources/proj4j-data/grids/us_noaa_nadcon5_nad83_2007_nad83_2011_alaska_extract.tif differ diff --git a/db/README.md b/db/README.md new file mode 100644 index 0000000..8493de8 --- /dev/null +++ b/db/README.md @@ -0,0 +1,222 @@ +# proj4j-db + +PROJ 9.8.1's authority database — **EPSG v12.029**, ESRI ArcGIS Pro 3.6, IGNF 3.1.0, IAU_2015, +NKG 1.0.w, NRCAN — transcoded at build time into a deterministic read-only binary index, plus the +pure-Java reader that serves it through `org.locationtech.proj4j.spi.ProjDatabase`. + +| | | +|---|---:| +| index, unpacked | **6,746,032 B** (6.43 MiB) | +| index, `gzip -9` | **1,720,052 B** (1.64 MiB) | +| raw `proj.db` for comparison | 10,223,616 B / 1,858,856 B | +| saving | **−34.0 % unpacked, −7.5 % compressed** | +| dependencies | `proj4j` only | +| Java level | 8, same as core (this artifact ships to consumers) | + +## Why not just ship `proj.db` + +A raw SQLite file inside a jar cannot be opened by JDBC SQLite without **a native library and an +extraction to a filesystem we do not control**. Core has zero runtime dependencies and must keep them: +a downstream consumer is here specifically to delete Apache SIS and the `catch (LinkageError)` over a +duplicate `org.opengis.util.CodeList` that kills their Spark executors, and a native dependency would be +worse than what they have. + +Reading SQLite's b-tree pages in pure Java is possible — 4096-byte pages, 2496 of them — but it means +implementing a write-oriented format, carrying its indexes, and inheriting a header whose change-counter +fields differ between two runs that produce identical rows. + +Transcoding buys three things instead: + +1. **Determinism.** Every ordering in the file is a total order over the data, so two generations from + the same input are byte-identical and CI proves it with `git diff --exit-code`. This runs in Spark + executors that require bit-reproducible output. +2. **The bytes we do not need are gone** — the write path, the b-tree interior pages, the page slack, and + the 798 KB `idx_usage_object` whose job is done here by a 20-byte-per-row sorted array. +3. **Strings are shared.** `'EPSG'` appears in tens of thousands of rows upstream; here it appears once, + referenced by a varint. 97,930 distinct strings, 2,480,418 B of UTF-8. + +## The format, `.pjdx` v1 + +Full specification in `PjdxFormat`'s javadoc — writer and reader share that class, so the two cannot +drift. In outline: a 64-byte header carrying a SHA-256 of the content, a section directory, one shared +string pool, 27 keyed row tables and 7 sorted indexes. + +Two rules do most of the work: + +- **String ids are assigned in ascending unsigned UTF-8 byte order.** So `id -> string` is an array + index and `string -> id` is a binary search over the same array — no second index, no hash table + anywhere in the file. +- **Rows are sorted by key tuple, ties broken by encoded row bytes.** A lookup is a binary search that + touches only the key array and decodes exactly one row; and the order is total even for the tables + whose keys are genuinely non-unique (aliases, supersessions), so nothing about the input's order can + leak into the output. + +### Where the bytes go + +| section | bytes | | section | bytes | +|---|---:|---|---|---:| +| `S_STRINGS` | 2,871,672 | | `X_USAGE_BY_OBJECT` | 488,108 | +| `S_CONVERSION` | 562,587 | | `X_CRS_BY_NAME` | 470,488 | +| `S_HELMERT_TRANSFORMATION` | 449,613 | | `X_CRS_BY_CODE` | 220,648 | +| `S_ALIAS` | 439,389 | | `X_OP_BY_SOURCE_TARGET` | 114,032 | +| `S_PROJECTED_CRS` | 334,354 | | `X_OP_BY_TARGET_SOURCE` | 114,032 | +| `S_EXTENT` | 208,559 | | `X_CRS_BY_DATUM` | 66,176 | +| `S_GEODETIC_CRS` | 67,551 | | 20 smaller sections | 249,133 | + +## The schema subset + +**Transcoded (31 tables read, 27 sections written):** `metadata`, `unit_of_measure`, `celestial_body`, +`ellipsoid`, `prime_meridian`, `geodetic_datum`, `vertical_datum`, both `*_datum_ensemble_member` +tables, `coordinate_system`, `axis`, `geodetic_crs`, `projected_crs`, `vertical_crs`, `compound_crs`, +`engineering_crs`, `conversion_table` (names resolved from `conversion_method` and `conversion_param`), +`helmert_transformation_table` (method name from `coordinate_operation_method`), `grid_transformation`, +`other_transformation`, `concatenated_operation`, `concatenated_operation_step`, `usage`, `extent`, +`grid_alternatives`, `alias_name`, `supersession`, `deprecation`. + +**Dropped on purpose**, each with a reason, in `GenerateIndex`'s javadoc: `coordinate_metadata` +(point-motion epochs for a capability proj4j does not have — 921,600 B of the SQLite file), `scope`, +`sqlite_stat1`, `grid_packages`, `builtin_authorities`, `versioned_auth_name_mapping`, +`authority_to_authority_preference`, `geoid_model`, and the free-text `description`/`anchor` columns on +datums and CRSs. `extent.description` **is** kept: it is the string a human is shown as the area of use. + +### Helmert parameters are ported, not remembered + +`helmert_transformation_table` stores parameters as named columns, not `paramN` slots. The mapping to +EPSG parameter codes — 8605–8611, 1040–1047, 1049, 8617/8618/8667 — and the conditional structure +deciding which exist for a 3-, 7-, 8-, 10-, 15-parameter or Molodensky-Badekas case are transcribed from +`9.8.1:src/iso19111/factory.cpp:6337-6450`, with the codes read from +`9.8.1:src/proj_constants.h:509-559`. A wrong code here binds a value to the wrong slot silently. + +## The round-trip proof + +`gen/VerifyIndex` reads the SQLite dump and the generated index and compares **every row of every +transcoded table, field by field**, with doubles compared by `Double.compare` so a value that came back +as a neighbouring representable number fails. + +``` +VerifyIndex: 486,491 field comparisons in 6.2 s +VerifyIndex: OK -- every transcoded row matches the SQLite source +``` + +It runs inside `-Pregen-db` and fails the build on any mismatch. A size measurement and a handful of +spot checks cannot catch a field read in the wrong order; this can — and on its first run it caught two +real problems, both upstream data quirks rather than transcoder bugs: + +### Two upstream quirks this pinned + +1. **`PROJ:ENh` is a 3-dimensional Cartesian coordinate system whose three axes are numbered 1, 2 and + 2.** Easting (`PROJ:1`, order 1), Northing (`PROJ:2`, order 2) and Ellipsoidal height (`PROJ:3`, + **order 2**). Keying axes on `(cs, order)` alone left those two tied, and the tiebreak put + *Ellipsoidal height* before *Northing* — silently reordering the axes of a 3D system. The axis key is + therefore `(cs authority, cs code, order, axis authority, axis code)`, which reproduces the order + PROJ's own `ORDER BY coordinate_system_order` yields, since SQLite returns equal keys in primary-key + order. Every other one of the 149 coordinate systems is well-formed. +2. **Two concatenated operations number their steps 2 and 3, with no step 1** — + `NKG:ITRF2000_TO_NKG_ETRF00` and `NKG:ITRF2014_TO_NKG_ETRF14`. So `DbOperationStep.stepNumber()` is + **not** a 1-based index into `steps()`, and a consumer that treats it as one reads the wrong step for + those two. Pinned by `PjdxDatabaseTest.stepNumbersAreNotNecessarilyOneBased`. + +## Provenance: two sources that must agree + +`Proj4jDb.open()` cross-checks the `metadata` table *inside* the index against the build-stamped +`db.properties` sidecar next to it, and **throws if they disagree**. An EPSG version string alone cannot +do this — the same EPSG version can be packaged differently. + +The sidecar carries two digests, deliberately: + +- `artifactSha256` — the whole file. This is what the `maven-enforcer-plugin` `requireFileChecksum` gate + compares in **every** default build, so a hand-edited artifact fails. +- `contentSha256` — the digest embedded in the header at offset 32, covering bytes `[64, len)`. The + reader verifies this against the bytes it actually read on every open, so it is the value a Spark job + logs per executor to **prove all executors ran the same data**. + +Comparing the wrong one of those two fails on every correct artifact — which is exactly what happened on +the verifier's first run, and is why they are now named apart. + +## Building + +**Default build, on every machine and in CI:** + +``` +mvn -B -Dmaven.repo.local=/tmp/m2 -pl db -am install -Dmaven.javadoc.skip=true +``` + +Nothing but a SHA-256 check happens: **no `sqlite3`, no `cmake`, no Python, no PROJ checkout, no +network.** A machine without the toolchain builds successfully and cannot silently use a stale artifact. +`-am` is needed because the root pom sets `maven.install.skip=true`. + +**Regeneration**, manual plus CI on any `db/**` or pin change: + +``` +mvn -Pregen-db -pl db -am validate -Dproj.db.source=/opt/homebrew/share/proj/proj.db +``` + +1. `src/gen/dump.sh` fails fast if `sqlite3` is absent, with a message pointing at omitting the profile. + Never a silent fallback. +2. `GenerateIndex` transcodes, writes `db.properties` with `epsgVersion` **read back from the `metadata` + table** and `generatedAtUtc` from `SOURCE_DATE_EPOCH`, and prints the SHA-256 to paste into + ``. +3. `VerifyIndex` runs the exhaustive round-trip and fails the build on any mismatch. + +CI then runs `git diff --exit-code`. Two consecutive runs are byte-identical — verified. + +| machine | invocation | outcome | +|---|---|---| +| no sqlite3, no PROJ checkout | `mvn install` | **builds**; verifies checksum | +| no sqlite3 | `mvn install -Pregen-db` | fails fast, message points at omitting the profile | +| full toolchain | `mvn install -Pregen-db` | regenerates; byte-identical or CI fails | +| tampered artifact | `mvn install` | fails on SHA-256 mismatch | + +`proj4j.db.max.jar.bytes` is 2,600,000: a data bump that blows the budget fails the build here rather +than surprising a downstream container image. + +## Using it + +Discovery is **opt-in**. Core never scans for a provider implicitly — an implicit `ServiceLoader` walk +touches a classpath proj4j does not control, and that is how a library minding its own business triggers +a `LinkageError` in somebody else's jar. + +```java +try (ProjDatabase db = Proj4jDb.open()) { // null if the data is not on the classpath + DbCrs crs = db.crs("EPSG", "4979"); // geographic 3D, which no +init= file can express + DbCoordinateSystem cs = db.coordinateSystem(crs.coordinateSystem().authName(), + crs.coordinateSystem().code()); + // cs.dimension() == 3, cs.axes().get(2).name() == "Ellipsoidal height" + + for (DbOperation op : db.operationsBetween("EPSG", "4267", "EPSG", "4269")) { + // nine published grid transformations, 0.15 m to 2.0 m, not one of them a ballpark + } +} +``` + +Or through the SPI, sorted by `(priority, name)` with duplicates **rejected** rather than ordered by +luck: + +```java +ProjDatabase db = ProjDatabaseProvider.openFirst(myClassLoader); +``` + +`Proj4jDb.open(ResourceResolver)` takes any resolver, so an unpacked data directory works via +`DirectoryResourceResolver`. + +## Not in the reactor + +This module is **deliberately not in the root ``**. Add it with: + +```xml + +db +``` + +## Licensing + +`proj.db` is **not** covered by `LICENSE.EPSG` alone. It also contains ESRI (ArcGIS Pro 3.6), IGNF +3.1.0, IAU_2015, NKG 1.0.w and NRCAN data — 2,991 ESRI, 2,201 IAU_2015 and 864 IGNF CRSs. Those have +distinct terms, which is why this is a separate artifact with its own aggregated `NOTICE` rather than +something folded into `proj4j-epsg` and misrepresenting that one. + +It is also why existing `proj4j-epsg` consumers can upgrade the code without taking on a 6.4 MB +dependency they did not ask for, and vice versa. diff --git a/db/pom.xml b/db/pom.xml new file mode 100644 index 0000000..fd4a7e9 --- /dev/null +++ b/db/pom.xml @@ -0,0 +1,278 @@ + + 4.0.0 + + + io.github.emilevictor.neoproj4j + neoproj4j-modules + 1.3.1-SNAPSHOT + + + io.github.emilevictor.neoproj4j + neoproj4j-db + jar + neoProj4J authority database + + PROJ 9.8.1's authority database (EPSG v12.029, ESRI ArcGIS Pro 3.6, IGNF 3.1.0, IAU_2015, + NKG 1.0.w, NRCAN), transcoded at build time into a deterministic read-only binary index and + served through a pure-Java reader. Implements org.locationtech.proj4j.spi.ProjDatabase. + + No SQLite, no JDBC, no native library, no network, no environment variables: the only + dependency is neoProj4J itself. A raw proj.db in a jar cannot be opened without a native driver + and an extraction to a filesystem we do not control, and a consumer whose reason for adopting + this API is to delete Apache SIS would be worse off with a native dependency than without one. + + + + https://github.com/emilevictor/neoProj4J + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + + https://github.com/emilevictor/neoProj4J + scm:git:https://github.com/emilevictor/neoProj4J.git + scm:git:git@github.com:emilevictor/neoProj4J.git + HEAD + + + + + false + false + + + + + 9.8.1 + f08fa86c478c4bbbf003b1ec751dd84aa6eca486 + + + 8a82064783a07132f31e42ffe51cdc2bbb48c3835a01ab015485dfe7a456d389 + + + 2600000 + + + /opt/homebrew/share/proj/proj.db + + + + + io.github.emilevictor.neoproj4j + neoproj4j + ${project.version} + + + junit + junit + test + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + org.locationtech.proj4j.db.gen + + + + + maven-jar-plugin + + + + org/locationtech/proj4j/db/gen/** + + + + + org.locationtech.proj4j.db + org.locationtech.proj4j.db + ${proj.rev} + ${proj.rev.sha} + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + + verify-checked-in-index + validate + + enforce + + + + + ${project.basedir}/src/main/resources/proj4j-data/db/proj4j-db.pjdx + ${proj4j.db.sha256} + sha256 + + The checked-in proj4j-db index does not match + ${proj4j.db.sha256}. Either the file was edited by hand, or a + regeneration changed it without the pin being updated. Run + `mvn -Pregen-db validate` to regenerate and print the new + SHA-256; do not relax this rule. + + + + + + + db-size-budget + verify + + enforce + + + + + ${proj4j.db.max.jar.bytes} + + ${project.build.directory}/${project.build.finalName}.jar + + + + + + + + + + + + + + regen-db + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + verify-checked-in-index + none + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.1 + + + + dump-proj-db + generate-resources + + exec + + + ${project.basedir}/src/gen/dump.sh + + ${proj.db.source} + ${project.build.directory}/proj-db-dump.quote + + + + + + transcode + generate-resources + + java + + + org.locationtech.proj4j.db.gen.GenerateIndex + + ${project.build.directory}/proj-db-dump.quote + ${project.basedir}/src/main/resources/proj4j-data/db + ${proj.rev} + ${proj.rev.sha} + + + + + + verify-round-trip + generate-resources + + java + + + org.locationtech.proj4j.db.gen.VerifyIndex + + ${project.build.directory}/proj-db-dump.quote + ${project.basedir}/src/main/resources/proj4j-data/db + + + + + + + + + + + diff --git a/db/src/gen/dump.sh b/db/src/gen/dump.sh new file mode 100755 index 0000000..5b9473a --- /dev/null +++ b/db/src/gen/dump.sh @@ -0,0 +1,79 @@ +#!/bin/sh +# Dumps the subset of PROJ's proj.db that proj4j transcodes, in sqlite3's `.mode quote` form. +# +# Build-time only: run by the `regen-db` Maven profile, never by a default build. A default +# `mvn install` uses the checked-in index and verifies its SHA-256, so a machine with no sqlite3 +# builds successfully -- and cannot silently fall back to a stale artifact. +# +# Usage: dump.sh +set -eu + +DB="${1:?usage: dump.sh }" +OUT="${2:?usage: dump.sh }" + +if ! command -v sqlite3 >/dev/null 2>&1; then + echo "dump.sh: sqlite3 not found; omit -Pregen-db to build from the checked-in database" >&2 + exit 1 +fi + +if [ ! -f "$DB" ]; then + echo "dump.sh: $DB does not exist." >&2 + echo " proj.db is not checked into PROJ; it is generated by sqlite3 from the 52 files listed in" >&2 + echo " data/sql_filelist.cmake. Point -Dproj.db.source at a built one (Homebrew's proj 9.8.1" >&2 + echo " installs it at /opt/homebrew/share/proj/proj.db), or build it from a PROJ 9.8.1 checkout." >&2 + exit 1 +fi + +mkdir -p "$(dirname "$OUT")" + +# Every table below is dumped whole with `select *`, and the generator maps columns *by header name*. +# That is deliberate: it means this script carries no column list to drift out of step with the Java +# side, and an upstream schema change that removes a column proj4j needs fails loudly in the +# generator instead of silently shifting every field by one. +# +# Row order here does not matter. The generator imposes a total order over every table and index, and +# that -- not sqlite's output order -- is what makes the result byte-reproducible. +{ + echo ".bail on" + echo ".mode quote" + echo ".headers on" + for t in \ + metadata \ + unit_of_measure \ + celestial_body \ + ellipsoid \ + prime_meridian \ + geodetic_datum \ + vertical_datum \ + geodetic_datum_ensemble_member \ + vertical_datum_ensemble_member \ + coordinate_system \ + axis \ + geodetic_crs \ + projected_crs \ + vertical_crs \ + compound_crs \ + engineering_crs \ + conversion_method \ + conversion_param \ + conversion_table \ + coordinate_operation_method \ + helmert_transformation_table \ + grid_transformation \ + other_transformation \ + concatenated_operation \ + concatenated_operation_step \ + usage \ + extent \ + grid_alternatives \ + alias_name \ + supersession \ + deprecation + do + echo ".print #TABLE $t" + echo "select * from $t;" + done + echo ".print #END" +} | sqlite3 "$DB" > "$OUT" + +echo "dump.sh: wrote $OUT ($(wc -c < "$OUT" | tr -d ' ') bytes) from $DB" diff --git a/db/src/main/java/org/locationtech/proj4j/db/PjdxDatabase.java b/db/src/main/java/org/locationtech/proj4j/db/PjdxDatabase.java new file mode 100644 index 0000000..9508f85 --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/PjdxDatabase.java @@ -0,0 +1,936 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.SeekableByteReader; +import org.locationtech.proj4j.spi.DbAxis; +import org.locationtech.proj4j.spi.DbCelestialBody; +import org.locationtech.proj4j.spi.DbConversion; +import org.locationtech.proj4j.spi.DbCoordinateSystem; +import org.locationtech.proj4j.spi.DbCrs; +import org.locationtech.proj4j.spi.DbCrsType; +import org.locationtech.proj4j.spi.DbDatum; +import org.locationtech.proj4j.spi.DbEllipsoid; +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbGridAlternative; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbOperation; +import org.locationtech.proj4j.spi.DbOperationStep; +import org.locationtech.proj4j.spi.DbParam; +import org.locationtech.proj4j.spi.DbPrimeMeridian; +import org.locationtech.proj4j.spi.DbSupersession; +import org.locationtech.proj4j.spi.DbUnit; +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * {@link ProjDatabase} over a {@code .pjdx} index. Pure JDK; the only proj4j packages it touches are + * {@code spi} and {@code resource}. + *

+ * Every lookup is a binary search over a sorted key array followed by decoding exactly one row. No + * table is loaded eagerly, nothing is memoised except the immutable key arrays and the string pool, and + * no query allocates a hash map — so two executors that ask the same question in different orders get + * the same answer, in the same order, from the same bytes. + */ +public final class PjdxDatabase implements ProjDatabase { + + private final PjdxFile file; + private final String name; + private volatile Map metadata; + private volatile SortedSet authorities; + + PjdxDatabase(PjdxFile file, String name) { + this.file = file; + this.name = name; + } + + /** + * Opens the index behind a {@link ResourceHandle}, verifying its embedded SHA-256. + */ + public static PjdxDatabase open(final ResourceHandle handle) throws IOException { + if (handle == null) { + throw new IllegalArgumentException("handle"); + } + PjdxFile f = new PjdxFile(handle.origin(), new PjdxFile.ReaderSource() { + @Override + public SeekableByteReader open() throws IOException { + return handle.open(); + } + }, true); + return new PjdxDatabase(f, "pjdx:" + handle.origin()); + } + + /** + * Opens the index over an already-obtained reader source. Used by tests and by callers that hold + * the bytes themselves. + * + * @param verifyChecksum whether to hash the content on open. Leave this on in production: it is the + * check that proves every executor read the same bytes. + */ + public static PjdxDatabase open(String origin, PjdxFile.ReaderSource source, + boolean verifyChecksum) throws IOException { + return new PjdxDatabase(new PjdxFile(origin, source, verifyChecksum), "pjdx:" + origin); + } + + @Override + public String name() { + return name; + } + + /** The SHA-256 recorded in the index header, hex. The per-executor provenance stamp. */ + public String contentSha256() { + return file.contentSha256(); + } + + /** Total size of the index in bytes. */ + public long sizeBytes() { + return file.fileLength(); + } + + @Override + public void close() throws IOException { + file.close(); + } + + // ---------------------------------------------------------------- metadata + + @Override + public Map metadata() { + Map m = metadata; + if (m == null) { + PjdxFile.Table t = file.table(PjdxFormat.S_METADATA); + TreeMap built = new TreeMap(); + for (int i = 0; i < t.rowCount; i++) { + built.put(file.string(t.key(i, 0)), t.row(i).str()); + } + m = Collections.unmodifiableMap(built); + metadata = m; + } + return m; + } + + @Override + public SortedSet authorities() { + SortedSet a = authorities; + if (a == null) { + PjdxFile.Index x = file.index(PjdxFormat.X_AUTHORITIES); + TreeSet built = new TreeSet(); + for (int i = 0; i < x.entryCount; i++) { + built.add(file.string(x.field(i, 0))); + } + a = Collections.unmodifiableSortedSet(built); + authorities = a; + } + return a; + } + + // ---------------------------------------------------------------- CRSs + + @Override + public DbCrs crs(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Index x = file.index(PjdxFormat.X_CRS_BY_CODE); + int[] prefix = {a, c}; + int e = x.lowerBound(prefix); + if (!x.matches(e, prefix)) { + return null; + } + return decodeCrs(x.field(e, 2), x.field(e, 3), authName, code); + } + + private DbCrs decodeCrs(int tag, int row, String authName, String code) { + switch (tag) { + case PjdxFormat.TAG_GEODETIC_CRS: { + PjdxFile.RowCursor r = file.table(PjdxFormat.S_GEODETIC_CRS).row(row); + String nm = r.str(); + DbCrsType type = DbCrsType.fromDbValue(r.str()); + DbObjectRef cs = ref(DbObjectType.COORDINATE_SYSTEM, r); + DbObjectRef datum = ref(DbObjectType.GEODETIC_DATUM, r); + String textDef = r.str(); + boolean dep = r.bool(); + return new DbCrs(type, authName, code, nm, dep, cs, datum, null, null, null, null, + textDef); + } + case PjdxFormat.TAG_PROJECTED_CRS: { + PjdxFile.RowCursor r = file.table(PjdxFormat.S_PROJECTED_CRS).row(row); + String nm = r.str(); + DbObjectRef cs = ref(DbObjectType.COORDINATE_SYSTEM, r); + DbObjectRef base = ref(DbObjectType.GEODETIC_CRS, r); + DbObjectRef conv = ref(DbObjectType.CONVERSION, r); + String textDef = r.str(); + boolean dep = r.bool(); + return new DbCrs(DbCrsType.PROJECTED, authName, code, nm, dep, cs, null, base, conv, + null, null, textDef); + } + case PjdxFormat.TAG_VERTICAL_CRS: { + PjdxFile.RowCursor r = file.table(PjdxFormat.S_VERTICAL_CRS).row(row); + String nm = r.str(); + DbObjectRef cs = ref(DbObjectType.COORDINATE_SYSTEM, r); + DbObjectRef datum = ref(DbObjectType.VERTICAL_DATUM, r); + boolean dep = r.bool(); + return new DbCrs(DbCrsType.VERTICAL, authName, code, nm, dep, cs, datum, null, null, + null, null, null); + } + case PjdxFormat.TAG_COMPOUND_CRS: { + PjdxFile.RowCursor r = file.table(PjdxFormat.S_COMPOUND_CRS).row(row); + String nm = r.str(); + // The horizontal component may be geodetic or projected; the type is resolved by the + // caller looking it up, so the reference carries the most useful guess and callers are + // told to check. Storing the resolved type here would mean a second lookup at build + // time for no gain. + String hAuth = r.str(); + String hCode = r.str(); + String vAuth = r.str(); + String vCode = r.str(); + boolean dep = r.bool(); + DbObjectRef horiz = horizontalRef(hAuth, hCode); + DbObjectRef vert = vAuth == null ? null + : new DbObjectRef(DbObjectType.VERTICAL_CRS, vAuth, vCode); + return new DbCrs(DbCrsType.COMPOUND, authName, code, nm, dep, null, null, null, null, + horiz, vert, null); + } + case PjdxFormat.TAG_ENGINEERING_CRS: { + PjdxFile.RowCursor r = file.table(PjdxFormat.S_ENGINEERING_CRS).row(row); + String nm = r.str(); + boolean dep = r.bool(); + return new DbCrs(DbCrsType.ENGINEERING, authName, code, nm, dep, null, null, null, + null, null, null, null); + } + default: + throw new IllegalStateException("table tag " + tag + " is not a CRS table"); + } + } + + /** + * A compound CRS's horizontal component is a geodetic or a projected CRS. Which one is resolved + * here by asking the CRS index, so the reference a caller receives has the right type rather than a + * plausible-looking wrong one. + */ + private DbObjectRef horizontalRef(String authName, String code) { + if (authName == null || code == null) { + return null; + } + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Index x = file.index(PjdxFormat.X_CRS_BY_CODE); + int[] prefix = {a, c}; + int e = x.lowerBound(prefix); + if (!x.matches(e, prefix)) { + return null; + } + return new DbObjectRef(tagToType(x.field(e, 2)), authName, code); + } + + @Override + public List crsCodes(String authName) { + PjdxFile.Index x = file.index(PjdxFormat.X_CRS_BY_CODE); + List out = new ArrayList(); + if (authName == null) { + for (int i = 0; i < x.entryCount; i++) { + out.add(new DbObjectRef(tagToType(x.field(i, 2)), file.string(x.field(i, 0)), + file.string(x.field(i, 1)))); + } + } else { + int a = file.stringId(authName); + if (a < 0) { + return Collections.emptyList(); + } + int[] prefix = {a}; + for (int i = x.lowerBound(prefix); x.matches(i, prefix); i++) { + out.add(new DbObjectRef(tagToType(x.field(i, 2)), authName, file.string(x.field(i, 1)))); + } + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + @Override + public DbCoordinateSystem coordinateSystem(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_COORDINATE_SYSTEM); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String type = r.str(); + int dimension = r.uint(); + + // Axes are keyed (cs authority, cs code, order, axis authority, axis code), so this prefix + // scan yields them in (order, axis code) order -- the same order PROJ's own + // `ORDER BY coordinate_system_order` produces. That matters for exactly one upstream + // coordinate system, PROJ:ENh, whose three axes are numbered 1, 2 and 2; see the generator. + PjdxFile.Table ax = file.table(PjdxFormat.S_AXIS); + int[] prefix = {a, c}; + List axes = new ArrayList(dimension); + for (int i = ax.lowerBound(prefix); i < ax.rowCount && ax.compareKey(i, prefix) == 0; i++) { + int order = ax.key(i, 2); + PjdxFile.RowCursor ar = ax.row(i); + String nm = ar.str(); + String abbrev = ar.str(); + String orientation = ar.str(); + DbObjectRef uom = ref(DbObjectType.UNIT_OF_MEASURE, ar); + axes.add(new DbAxis(nm, abbrev, orientation, order, uom)); + } + return new DbCoordinateSystem(authName, code, type, dimension, axes); + } + + // ---------------------------------------------------------------- datums + + @Override + public DbDatum datum(DbObjectType type, String authName, String code) { + int section; + int memberSection; + if (type == DbObjectType.GEODETIC_DATUM) { + section = PjdxFormat.S_GEODETIC_DATUM; + memberSection = PjdxFormat.S_GEODETIC_ENSEMBLE_MEMBER; + } else if (type == DbObjectType.VERTICAL_DATUM) { + section = PjdxFormat.S_VERTICAL_DATUM; + memberSection = PjdxFormat.S_VERTICAL_ENSEMBLE_MEMBER; + } else { + throw new IllegalArgumentException( + "datum(): type must be GEODETIC_DATUM or VERTICAL_DATUM, not " + type); + } + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(section); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String nm = r.str(); + DbObjectRef ell = null; + DbObjectRef pm = null; + if (type == DbObjectType.GEODETIC_DATUM) { + ell = ref(DbObjectType.ELLIPSOID, r); + pm = ref(DbObjectType.PRIME_MERIDIAN, r); + } + String pubDate = r.str(); + double frameEpoch = r.dbl(); + double ensembleAccuracy = r.dbl(); + boolean dep = r.bool(); + + PjdxFile.Table mt = file.table(memberSection); + int[] prefix = {a, c}; + List members = new ArrayList(); + for (int i = mt.lowerBound(prefix); i < mt.rowCount && mt.compareKey(i, prefix) == 0; i++) { + PjdxFile.RowCursor mr = mt.row(i); + members.add(new DbObjectRef(type, mr.str(), mr.str())); + } + return new DbDatum(type, authName, code, nm, ell, pm, pubDate, frameEpoch, ensembleAccuracy, + members, dep); + } + + @Override + public DbEllipsoid ellipsoid(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_ELLIPSOID); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String nm = r.str(); + DbObjectRef body = ref(DbObjectType.CELESTIAL_BODY, r); + double semiMajor = r.dbl(); + DbObjectRef uom = ref(DbObjectType.UNIT_OF_MEASURE, r); + double invF = r.dbl(); + double semiMinor = r.dbl(); + boolean dep = r.bool(); + return new DbEllipsoid(authName, code, nm, body, semiMajor, uom, invF, semiMinor, dep); + } + + @Override + public DbPrimeMeridian primeMeridian(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_PRIME_MERIDIAN); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String nm = r.str(); + double lon = r.dbl(); + DbObjectRef uom = ref(DbObjectType.UNIT_OF_MEASURE, r); + boolean dep = r.bool(); + return new DbPrimeMeridian(authName, code, nm, lon, uom, dep); + } + + @Override + public DbUnit unit(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_UNIT); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String nm = r.str(); + DbUnit.Type type = DbUnit.Type.fromDbValue(r.str()); + double factor = r.dbl(); + String shortName = r.str(); + boolean dep = r.bool(); + return new DbUnit(authName, code, nm, type, factor, shortName, dep); + } + + @Override + public DbCelestialBody celestialBody(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_CELESTIAL_BODY); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + return new DbCelestialBody(authName, code, r.str(), r.dbl()); + } + + @Override + public List crsUsingDatum(DbObjectType datumType, String datumAuthName, + String datumCode) { + int tag = typeToTag(datumType); + int a = file.stringId(datumAuthName); + int c = file.stringId(datumCode); + if (a < 0 || c < 0) { + return Collections.emptyList(); + } + PjdxFile.Index x = file.index(PjdxFormat.X_CRS_BY_DATUM); + int[] prefix = {tag, a, c}; + List out = new ArrayList(); + for (int i = x.lowerBound(prefix); x.matches(i, prefix); i++) { + out.add(new DbObjectRef(tagToType(x.field(i, 3)), file.string(x.field(i, 4)), + file.string(x.field(i, 5)))); + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + // ---------------------------------------------------------------- conversions + + @Override + public DbConversion conversion(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_CONVERSION); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String nm = r.str(); + String methodAuth = r.str(); + String methodCode = r.str(); + String methodName = r.str(); + List params = params(r); + boolean dep = r.bool(); + return new DbConversion(authName, code, nm, methodAuth, methodCode, methodName, params, dep); + } + + // ---------------------------------------------------------------- operations + + private static final int[] OPERATION_SECTIONS = { + PjdxFormat.S_HELMERT_TRANSFORMATION, PjdxFormat.S_GRID_TRANSFORMATION, + PjdxFormat.S_OTHER_TRANSFORMATION, PjdxFormat.S_CONCATENATED_OPERATION}; + + private static final int[] OPERATION_TAGS = { + PjdxFormat.TAG_HELMERT_TRANSFORMATION, PjdxFormat.TAG_GRID_TRANSFORMATION, + PjdxFormat.TAG_OTHER_TRANSFORMATION, PjdxFormat.TAG_CONCATENATED_OPERATION}; + + @Override + public DbOperation operation(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + for (int i = 0; i < OPERATION_SECTIONS.length; i++) { + PjdxFile.Table t = file.table(OPERATION_SECTIONS[i]); + int row = t.find(a, c); + if (row >= 0) { + return decodeOperation(OPERATION_TAGS[i], row, authName, code); + } + } + return null; + } + + private DbOperation decodeOperation(int tag, int row, String authName, String code) { + if (tag == PjdxFormat.TAG_CONCATENATED_OPERATION) { + PjdxFile.RowCursor r = file.table(PjdxFormat.S_CONCATENATED_OPERATION).row(row); + String nm = r.str(); + DbObjectRef src = crsRef(r); + DbObjectRef tgt = crsRef(r); + double accuracy = r.dbl(); + String version = r.str(); + boolean dep = r.bool(); + return new DbOperation(DbObjectType.CONCATENATED_OPERATION, authName, code, nm, null, null, + null, src, tgt, accuracy, null, null, null, steps(authName, code), version, dep); + } + int section = tag == PjdxFormat.TAG_HELMERT_TRANSFORMATION ? PjdxFormat.S_HELMERT_TRANSFORMATION + : tag == PjdxFormat.TAG_GRID_TRANSFORMATION ? PjdxFormat.S_GRID_TRANSFORMATION + : PjdxFormat.S_OTHER_TRANSFORMATION; + PjdxFile.RowCursor r = file.table(section).row(row); + String nm = r.str(); + String methodAuth = r.str(); + String methodCode = r.str(); + String methodName = r.str(); + DbObjectRef src = crsRef(r); + DbObjectRef tgt = crsRef(r); + double accuracy = r.dbl(); + List params = params(r); + List grids; + DbObjectRef interp; + if (tag == PjdxFormat.TAG_HELMERT_TRANSFORMATION) { + grids = Collections.emptyList(); + interp = null; + } else { + int n = r.uint(); + if (n == 0) { + grids = Collections.emptyList(); + } else { + List g = new ArrayList(n); + for (int i = 0; i < n; i++) { + g.add(r.str()); + } + grids = g; + } + interp = crsRef(r); + } + String version = r.str(); + boolean dep = r.bool(); + return new DbOperation(tagToType(tag), authName, code, nm, methodAuth, methodCode, methodName, + src, tgt, accuracy, params, grids, interp, null, version, dep); + } + + private List steps(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + PjdxFile.Table t = file.table(PjdxFormat.S_CONCATENATED_STEP); + int[] prefix = {a, c}; + List out = new ArrayList(); + for (int i = t.lowerBound(prefix); i < t.rowCount && t.compareKey(i, prefix) == 0; i++) { + int stepNumber = t.key(i, 2); + PjdxFile.RowCursor r = t.row(i); + int stepTag = r.uint(); + String sa = r.str(); + String sc = r.str(); + int dir = r.uint(); + out.add(new DbOperationStep(stepNumber, new DbObjectRef(tagToType(stepTag), sa, sc), + dir == PjdxFormat.DIRECTION_FORWARD ? DbOperationStep.Direction.FORWARD + : dir == PjdxFormat.DIRECTION_REVERSE ? DbOperationStep.Direction.REVERSE + : DbOperationStep.Direction.UNSPECIFIED)); + } + return out; + } + + @Override + public List operationsBetween(String srcAuthName, String srcCode, + String tgtAuthName, String tgtCode) { + int sa = file.stringId(srcAuthName); + int sc = file.stringId(srcCode); + int ta = file.stringId(tgtAuthName); + int tc = file.stringId(tgtCode); + if (sa < 0 || sc < 0 || ta < 0 || tc < 0) { + return Collections.emptyList(); + } + PjdxFile.Index x = file.index(PjdxFormat.X_OP_BY_SOURCE_TARGET); + int[] prefix = {sa, sc, ta, tc}; + List out = new ArrayList(); + for (int i = x.lowerBound(prefix); x.matches(i, prefix); i++) { + int tag = x.field(i, 4); + int row = x.field(i, 5); + out.add(decodeOperation(tag, row, opAuth(tag, row), opCode(tag, row))); + } + // The index is already in (kind, auth, code) order because it was built that way, but sorting + // here makes the guarantee a property of this method rather than of a generator invariant a + // future change could break silently. + Collections.sort(out, new java.util.Comparator() { + @Override + public int compare(DbOperation a, DbOperation b) { + return a.ref().compareTo(b.ref()); + } + }); + return Collections.unmodifiableList(out); + } + + private String opAuth(int tag, int row) { + return file.string(file.table(operationSection(tag)).key(row, 0)); + } + + private String opCode(int tag, int row) { + return file.string(file.table(operationSection(tag)).key(row, 1)); + } + + private static int operationSection(int tag) { + switch (tag) { + case PjdxFormat.TAG_HELMERT_TRANSFORMATION: + return PjdxFormat.S_HELMERT_TRANSFORMATION; + case PjdxFormat.TAG_GRID_TRANSFORMATION: + return PjdxFormat.S_GRID_TRANSFORMATION; + case PjdxFormat.TAG_OTHER_TRANSFORMATION: + return PjdxFormat.S_OTHER_TRANSFORMATION; + case PjdxFormat.TAG_CONCATENATED_OPERATION: + return PjdxFormat.S_CONCATENATED_OPERATION; + default: + throw new IllegalStateException("table tag " + tag + " is not an operation table"); + } + } + + @Override + public List operationsWithSourceCrs(String authName, String code) { + return operationRefs(PjdxFormat.X_OP_BY_SOURCE_TARGET, authName, code); + } + + @Override + public List operationsWithTargetCrs(String authName, String code) { + return operationRefs(PjdxFormat.X_OP_BY_TARGET_SOURCE, authName, code); + } + + private List operationRefs(int indexId, String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return Collections.emptyList(); + } + PjdxFile.Index x = file.index(indexId); + int[] prefix = {a, c}; + List out = new ArrayList(); + for (int i = x.lowerBound(prefix); x.matches(i, prefix); i++) { + int tag = x.field(i, 4); + int row = x.field(i, 5); + out.add(new DbObjectRef(tagToType(tag), opAuth(tag, row), opCode(tag, row))); + } + Collections.sort(out); + return Collections.unmodifiableList(out); + } + + // ---------------------------------------------------------------- area of use + + @Override + public List extentsFor(DbObjectRef object) { + if (object == null) { + return Collections.emptyList(); + } + int tag = typeToTag(object.type()); + int a = file.stringId(object.authName()); + int c = file.stringId(object.code()); + if (a < 0 || c < 0) { + return Collections.emptyList(); + } + PjdxFile.Index x = file.index(PjdxFormat.X_USAGE_BY_OBJECT); + int[] prefix = {tag, a, c}; + // A LinkedHashMap keyed by the extent reference removes the duplicates that upstream's usage + // table does contain, without letting map order reach the result: the list is sorted below. + LinkedHashMap found = new LinkedHashMap(); + for (int i = x.lowerBound(prefix); x.matches(i, prefix); i++) { + String ea = file.string(x.field(i, 3)); + String ec = file.string(x.field(i, 4)); + DbExtent e = extent(ea, ec); + if (e != null) { + found.put(e.ref(), e); + } + } + List out = new ArrayList(found.values()); + Collections.sort(out, new java.util.Comparator() { + @Override + public int compare(DbExtent p, DbExtent q) { + return p.ref().compareTo(q.ref()); + } + }); + return Collections.unmodifiableList(out); + } + + @Override + public DbExtent extent(String authName, String code) { + int a = file.stringId(authName); + int c = file.stringId(code); + if (a < 0 || c < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_EXTENT); + int row = t.find(a, c); + if (row < 0) { + return null; + } + PjdxFile.RowCursor r = t.row(row); + String nm = r.str(); + String description = r.str(); + double west = r.dbl(); + double south = r.dbl(); + double east = r.dbl(); + double north = r.dbl(); + boolean dep = r.bool(); + return new DbExtent(authName, code, nm, description, west, south, east, north, dep); + } + + // ---------------------------------------------------------------- names + + @Override + public List aliases(DbObjectRef object) { + if (object == null) { + return Collections.emptyList(); + } + int tag = typeToTag(object.type()); + int a = file.stringId(object.authName()); + int c = file.stringId(object.code()); + if (a < 0 || c < 0) { + return Collections.emptyList(); + } + PjdxFile.Table t = file.table(PjdxFormat.S_ALIAS); + int[] prefix = {tag, a, c}; + TreeSet out = new TreeSet(); + for (int i = t.lowerBound(prefix); i < t.rowCount && t.compareKey(i, prefix) == 0; i++) { + out.add(file.string(t.key(i, 3))); + } + return Collections.unmodifiableList(new ArrayList(out)); + } + + @Override + public List findCrsByName(String name) { + String normalized = PjdxFormat.normalizeName(name); + if (normalized == null || normalized.isEmpty()) { + return Collections.emptyList(); + } + int n = file.stringId(normalized); + if (n < 0) { + return Collections.emptyList(); + } + PjdxFile.Index x = file.index(PjdxFormat.X_CRS_BY_NAME); + int[] prefix = {n}; + TreeSet out = new TreeSet(); + for (int i = x.lowerBound(prefix); x.matches(i, prefix); i++) { + out.add(new DbObjectRef(tagToType(x.field(i, 1)), file.string(x.field(i, 2)), + file.string(x.field(i, 3)))); + } + return Collections.unmodifiableList(new ArrayList(out)); + } + + // ------------------------------------------------- deprecation and supersession + + @Override + public List supersededBy(DbObjectRef object) { + if (object == null) { + return Collections.emptyList(); + } + int tag = typeToTag(object.type()); + int a = file.stringId(object.authName()); + int c = file.stringId(object.code()); + if (a < 0 || c < 0) { + return Collections.emptyList(); + } + PjdxFile.Table t = file.table(PjdxFormat.S_SUPERSESSION); + int[] prefix = {tag, a, c}; + List out = new ArrayList(); + for (int i = t.lowerBound(prefix); i < t.rowCount && t.compareKey(i, prefix) == 0; i++) { + PjdxFile.RowCursor r = t.row(i); + int replTag = r.uint(); + String ra = r.str(); + String rc = r.str(); + String source = r.str(); + boolean same = r.bool(); + out.add(new DbSupersession(object, new DbObjectRef(tagToType(replTag), ra, rc), source, + same)); + } + Collections.sort(out, new java.util.Comparator() { + @Override + public int compare(DbSupersession p, DbSupersession q) { + return p.replacement().compareTo(q.replacement()); + } + }); + return Collections.unmodifiableList(out); + } + + @Override + public List replacementsFor(DbObjectRef object) { + if (object == null) { + return Collections.emptyList(); + } + int tag = typeToTag(object.type()); + int a = file.stringId(object.authName()); + int c = file.stringId(object.code()); + if (a < 0 || c < 0) { + return Collections.emptyList(); + } + PjdxFile.Table t = file.table(PjdxFormat.S_DEPRECATION); + int[] prefix = {tag, a, c}; + TreeSet out = new TreeSet(); + for (int i = t.lowerBound(prefix); i < t.rowCount && t.compareKey(i, prefix) == 0; i++) { + PjdxFile.RowCursor r = t.row(i); + // deprecation carries no replacement_table_name: the replacement is of the same kind as the + // deprecated object, which is upstream's own model. + out.add(new DbObjectRef(object.type(), r.str(), r.str())); + } + return Collections.unmodifiableList(new ArrayList(out)); + } + + // ---------------------------------------------------------------- grids + + @Override + public DbGridAlternative gridAlternative(String originalGridName) { + int n = file.stringId(originalGridName); + if (n < 0) { + return null; + } + PjdxFile.Table t = file.table(PjdxFormat.S_GRID_ALTERNATIVE); + int row = t.find(n); + return row < 0 ? null : decodeGridAlternative(t, row); + } + + @Override + public List gridAlternatives() { + PjdxFile.Table t = file.table(PjdxFormat.S_GRID_ALTERNATIVE); + List out = new ArrayList(t.rowCount); + for (int i = 0; i < t.rowCount; i++) { + out.add(decodeGridAlternative(t, i)); + } + // Row order is already the string-id order of the original name, which is byte order of the + // UTF-8; sorting by the String makes it Java's collation-free natural order instead, so the + // documented guarantee holds regardless of how the file was built. + Collections.sort(out, new java.util.Comparator() { + @Override + public int compare(DbGridAlternative p, DbGridAlternative q) { + return p.originalGridName().compareTo(q.originalGridName()); + } + }); + return Collections.unmodifiableList(out); + } + + private DbGridAlternative decodeGridAlternative(PjdxFile.Table t, int row) { + String original = file.string(t.key(row, 0)); + PjdxFile.RowCursor r = t.row(row); + String projName = r.str(); + String oldName = r.str(); + String format = r.str(); + String method = r.str(); + boolean inverse = r.bool(); + String url = r.str(); + Boolean directDownload = r.tri(); + Boolean openLicense = r.tri(); + String directory = r.str(); + return new DbGridAlternative(original, projName, oldName, format, method, inverse, url, + directDownload, openLicense, directory); + } + + // ---------------------------------------------------------------- helpers + + private List params(PjdxFile.RowCursor r) { + int n = r.uint(); + if (n == 0) { + return Collections.emptyList(); + } + List out = new ArrayList(n); + for (int i = 0; i < n; i++) { + String pa = r.str(); + String pc = r.str(); + String pn = r.str(); + double v = r.dbl(); + String ua = r.str(); + String uc = r.str(); + DbObjectRef uom = ua == null || uc == null ? null + : new DbObjectRef(DbObjectType.UNIT_OF_MEASURE, ua, uc); + out.add(new DbParam(pa, pc, pn, v, uom)); + } + return out; + } + + /** Reads an (authName, code) pair as a reference of the given type; null if the pair is null. */ + private DbObjectRef ref(DbObjectType type, PjdxFile.RowCursor r) { + String a = r.str(); + String c = r.str(); + return a == null || c == null ? null : new DbObjectRef(type, a, c); + } + + /** + * A source/target CRS reference. The concrete CRS type is resolved through the CRS index, because + * an operation row records only the authority and code, and a caller that has to guess between + * geodetic, projected, vertical and compound will guess wrong for the compound cases. + */ + private DbObjectRef crsRef(PjdxFile.RowCursor r) { + String a = r.str(); + String c = r.str(); + if (a == null || c == null) { + return null; + } + DbObjectRef resolved = horizontalRef(a, c); + return resolved != null ? resolved : new DbObjectRef(DbObjectType.GEODETIC_CRS, a, c); + } + + static DbObjectType tagToType(int tag) { + DbObjectType t = DbObjectType.fromDbName(PjdxFormat.TAG_TABLE_NAMES[tag]); + if (t == null) { + throw new IllegalStateException("unmapped table tag " + tag); + } + return t; + } + + static int typeToTag(DbObjectType type) { + for (int i = 0; i < PjdxFormat.TAG_TABLE_NAMES.length; i++) { + if (PjdxFormat.TAG_TABLE_NAMES[i].equals(type.dbName())) { + return i; + } + } + throw new IllegalArgumentException("no table tag for " + type); + } + + @Override + public String toString() { + return name + " [" + file.fileLength() + " bytes]"; + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/PjdxDatabaseProvider.java b/db/src/main/java/org/locationtech/proj4j/db/PjdxDatabaseProvider.java new file mode 100644 index 0000000..b079e06 --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/PjdxDatabaseProvider.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import java.io.IOException; + +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * Registers this artifact's index as a {@code ProjDatabase} for + * {@link org.locationtech.proj4j.spi.ProjDatabaseProvider#discover}. + *

+ * Core never scans for this implicitly. Discovery happens only when an application + * asks — either by calling {@code discover}/{@code openFirst}, or by handing the result to + * {@code ProjContext.Builder}. An implicit {@code ServiceLoader} walk touches a classpath proj4j does + * not control, and that is how a library minding its own business triggers a {@code LinkageError} in + * somebody else's jar. + */ +public final class PjdxDatabaseProvider implements org.locationtech.proj4j.spi.ProjDatabaseProvider { + + @Override + public String name() { + return "pjdx"; + } + + @Override + public int priority() { + return 100; + } + + @Override + public ProjDatabase open() throws IOException { + return Proj4jDb.open(); + } + + @Override + public String toString() { + return "PjdxDatabaseProvider[" + name() + ", priority " + priority() + "]"; + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/PjdxFile.java b/db/src/main/java/org/locationtech/proj4j/db/PjdxFile.java new file mode 100644 index 0000000..80aeb3c --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/PjdxFile.java @@ -0,0 +1,725 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import java.io.Closeable; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +import org.locationtech.proj4j.datum.GridExtents; +import org.locationtech.proj4j.resource.Resources; +import org.locationtech.proj4j.resource.SeekableByteReader; + +/** + * The low-level {@code .pjdx} accessor: header, section directory, string pool, tables and indexes. + * Knows nothing about CRSs — see {@link PjdxDatabase} for that. + * + *

Access strategy

+ * Everything goes through {@link SeekableByteReader}, so the same code serves a jar entry (which + * arrives as a byte array, because a deflated zip entry cannot be seeked) and a plain file on disk + * (which is read lazily, a row at a time). Three things are cached in memory because every query needs + * them and re-reading them per query would dominate: the section directory, the string-pool offset + * array, and each table's or index's key array, materialised on first use. + *

+ * Thread-safe. {@code SeekableByteReader} is not, so this class holds a per-thread + * reader obtained from a supplier; the caches are populated under double-checked locking with + * {@code volatile} fields holding immutable arrays, and strings are memoised into a {@code String[]} + * with benign races — two threads may decode the same string, and both results are equal and immutable. + */ +final class PjdxFile implements Closeable { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** Opens a fresh reader. A {@code ResourceHandle} is one implementation of this. */ + interface ReaderSource { + SeekableByteReader open() throws IOException; + } + + private final String origin; + private final ReaderSource source; + private final ThreadLocal readers = new ThreadLocal(); + /** Every reader handed out, so {@link #close()} can shut them all. */ + private final java.util.List allReaders = + java.util.Collections.synchronizedList(new java.util.ArrayList()); + private volatile boolean closed; + + private final long fileLength; + private final int[] sectionIds; + private final int[] sectionKinds; + private final long[] sectionOffsets; + private final long[] sectionLengths; + + private final long stringBytesBase; + private final int stringCount; + private final int[] stringOffsets; + private final String[] stringCache; + + private final Table[] tableCache = new Table[128]; + private final Index[] indexCache = new Index[128]; + + PjdxFile(String origin, ReaderSource source, boolean verifyChecksum) throws IOException { + this.origin = origin; + this.source = source; + + SeekableByteReader r = reader(); + byte[] header = new byte[PjdxFormat.HEADER_BYTES]; + Resources.readFully(r, 0L, header, 0, header.length); + for (int i = 0; i < PjdxFormat.MAGIC.length; i++) { + if (header[i] != PjdxFormat.MAGIC[i]) { + throw new IOException(origin + " is not a proj4j database index: bad magic " + + hex(header, 0, 8) + " (expected " + new String(PjdxFormat.MAGIC, UTF8) + ")"); + } + } + int version = beInt(header, 8); + if (version != PjdxFormat.FORMAT_VERSION) { + throw new IOException(origin + " has .pjdx format version " + version + + ", but this build of proj4j reads version " + PjdxFormat.FORMAT_VERSION + + ". A mismatched proj4j-db artifact must fail here rather than answer wrongly."); + } + int sectionCount = beInt(header, 12); + this.fileLength = beLong(header, 16); + long dirOffset = beLong(header, 24); + + long actual = r.size(); + if (actual != fileLength) { + throw new IOException(origin + " declares " + fileLength + " bytes but is " + actual + + " bytes: truncated or appended to."); + } + if (sectionCount < 0 || sectionCount > 4096) { + throw new IOException(origin + " declares an implausible section count " + sectionCount); + } + + // sectionCount is 0..4096 by the check above, so this product genuinely cannot wrap -- the + // directory is at most 98,304 bytes. What was missing is that dirOffset was never checked + // against the file, so a header could point the directory read past the end (or into the + // header) and the failure would be whatever Resources.readFully happened to do. + long dirBytes = (long) sectionCount * PjdxFormat.DIRECTORY_ENTRY_BYTES; + if (dirOffset < PjdxFormat.HEADER_BYTES || dirOffset + dirBytes > fileLength) { + throw new IOException(origin + " puts its " + dirBytes + "-byte section directory at " + + dirOffset + ", outside the " + fileLength + "-byte file"); + } + byte[] dir = new byte[(int) dirBytes]; + Resources.readFully(r, dirOffset, dir, 0, dir.length); + sectionIds = new int[sectionCount]; + sectionKinds = new int[sectionCount]; + sectionOffsets = new long[sectionCount]; + sectionLengths = new long[sectionCount]; + for (int i = 0; i < sectionCount; i++) { + int p = i * PjdxFormat.DIRECTORY_ENTRY_BYTES; + sectionIds[i] = beInt(dir, p); + sectionKinds[i] = beInt(dir, p + 4); + sectionOffsets[i] = beLong(dir, p + 8); + sectionLengths[i] = beLong(dir, p + 16); + if (i > 0 && sectionIds[i] <= sectionIds[i - 1]) { + throw new IOException(origin + " section directory is not strictly ascending at entry " + + i + "; the file is not the one this reader was generated against."); + } + if (sectionOffsets[i] < PjdxFormat.HEADER_BYTES + || sectionOffsets[i] + sectionLengths[i] > fileLength) { + throw new IOException(origin + " section " + sectionIds[i] + " is out of bounds"); + } + } + + if (verifyChecksum) { + verifyChecksum(r, header); + } + + // The string pool is mandatory and every query needs it, so it is read eagerly. + int strIdx = sectionIndex(PjdxFormat.S_STRINGS); + if (strIdx < 0) { + throw new IOException(origin + " has no string pool section"); + } + long base = sectionOffsets[strIdx]; + long sectionBytes = sectionLengths[strIdx]; + byte[] poolHeader = new byte[8]; + Resources.readFully(r, base, poolHeader, 0, 8); + stringCount = beInt(poolHeader, 0); + int bytesRel = beInt(poolHeader, 4); + if (stringCount < 0) { + throw new IOException(origin + " has an implausible string count " + stringCount); + } + // `stringCount < 0` used to be the ONLY check. `(stringCount + 1) * 4` wraps negative at + // 2^29 -- a count of 536,870,912 makes that product -2,147,483,644, so `new byte[...]` threw + // NegativeArraySizeException rather than saying anything about the file, while + // `new int[stringCount + 1]` two lines later still asked for 2 GB. The count is now checked + // against the section that has to contain it: the offset array is 4*(n+1) bytes at base+8, + // and a pool cannot declare more strings than its own section has room to describe. + // + // NOT bounded by GridExtents.MAX_EXTENT: this is a string count, not a grid axis, and the + // shipped proj4j-db.pjdx already holds 97,930 strings. + int offsetBytes = GridExtents.checkedCount(origin + " string pool offsets", + stringCount + 1L, 4L, 8L, sectionBytes, "the string-pool section length") * 4; + byte[] offs = new byte[offsetBytes]; + Resources.readFully(r, base + 8, offs, 0, offs.length); + stringOffsets = new int[stringCount + 1]; + for (int i = 0; i <= stringCount; i++) { + stringOffsets[i] = beInt(offs, i * 4); + } + stringBytesBase = base + bytesRel; + stringCache = new String[stringCount]; + } + + private void verifyChecksum(SeekableByteReader r, byte[] header) throws IOException { + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + // SHA-256 is mandated by the platform; if it is genuinely absent, say so rather than + // silently skipping the check. + throw new IOException("SHA-256 is unavailable, so " + origin + " cannot be verified", e); + } + byte[] buf = new byte[1 << 16]; + long pos = PjdxFormat.HEADER_BYTES; + while (pos < fileLength) { + int want = (int) Math.min(buf.length, fileLength - pos); + Resources.readFully(r, pos, buf, 0, want); + md.update(buf, 0, want); + pos += want; + } + byte[] actual = md.digest(); + for (int i = 0; i < PjdxFormat.SHA256_BYTES; i++) { + if (actual[i] != header[PjdxFormat.SHA256_OFFSET + i]) { + throw new IOException(origin + " failed its SHA-256 self-check: header says " + + hex(header, PjdxFormat.SHA256_OFFSET, PjdxFormat.SHA256_BYTES) + + ", content hashes to " + hex(actual, 0, PjdxFormat.SHA256_BYTES) + + ". Refusing to answer from bytes that are not the ones that were built."); + } + } + } + + String origin() { + return origin; + } + + long fileLength() { + return fileLength; + } + + /** Hex of the content digest recorded in the header — the per-executor provenance stamp. */ + String contentSha256() { + try { + byte[] header = new byte[PjdxFormat.HEADER_BYTES]; + Resources.readFully(reader(), 0L, header, 0, header.length); + return hex(header, PjdxFormat.SHA256_OFFSET, PjdxFormat.SHA256_BYTES); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private SeekableByteReader reader() throws IOException { + if (closed) { + throw new IOException(origin + " is closed"); + } + SeekableByteReader r = readers.get(); + if (r == null) { + r = source.open(); + readers.set(r); + allReaders.add(r); + } + return r; + } + + @Override + public void close() throws IOException { + closed = true; + IOException first = null; + synchronized (allReaders) { + for (SeekableByteReader r : allReaders) { + try { + r.close(); + } catch (IOException e) { + if (first == null) { + first = e; + } + } + } + allReaders.clear(); + } + if (first != null) { + throw first; + } + } + + // ---------------------------------------------------------------- strings + + int stringCount() { + return stringCount; + } + + /** + * @param id 0-based string id, or -1 + * @return the string, or null iff {@code id < 0} + */ + String string(int id) { + if (id < 0) { + return null; + } + if (id >= stringCount) { + throw new IllegalStateException(origin + ": string id " + id + " of " + stringCount); + } + String s = stringCache[id]; + if (s == null) { + int from = stringOffsets[id]; + int len = stringOffsets[id + 1] - from; + byte[] b = new byte[len]; + try { + Resources.readFully(reader(), stringBytesBase + from, b, 0, len); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + s = new String(b, UTF8); + stringCache[id] = s; + } + return s; + } + + /** + * @return the id of {@code s}, or -1 if it is not in the pool. A miss here is a fast negative for + * the whole query: a code whose text does not appear anywhere in the file cannot name an + * object in it. + */ + int stringId(String s) { + if (s == null) { + return -1; + } + byte[] want = s.getBytes(UTF8); + int lo = 0; + int hi = stringCount - 1; + while (lo <= hi) { + int mid = (lo + hi) >>> 1; + int c = compareStringAt(mid, want); + if (c < 0) { + lo = mid + 1; + } else if (c > 0) { + hi = mid - 1; + } else { + return mid; + } + } + return -1; + } + + /** Compares pool string {@code id} against {@code want} in unsigned byte order. */ + private int compareStringAt(int id, byte[] want) { + int from = stringOffsets[id]; + int len = stringOffsets[id + 1] - from; + byte[] b = new byte[len]; + try { + Resources.readFully(reader(), stringBytesBase + from, b, 0, len); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + int n = Math.min(len, want.length); + for (int i = 0; i < n; i++) { + int d = (b[i] & 0xFF) - (want[i] & 0xFF); + if (d != 0) { + return d; + } + } + return len - want.length; + } + + // ---------------------------------------------------------------- sections + + private int sectionIndex(int sectionId) { + int lo = 0; + int hi = sectionIds.length - 1; + while (lo <= hi) { + int mid = (lo + hi) >>> 1; + if (sectionIds[mid] < sectionId) { + lo = mid + 1; + } else if (sectionIds[mid] > sectionId) { + hi = mid - 1; + } else { + return mid; + } + } + return -1; + } + + boolean hasSection(int sectionId) { + return sectionIndex(sectionId) >= 0; + } + + /** + * A keyed, row-oriented section. + */ + final class Table { + final int rowCount; + final int keyFieldCount; + private final long rowOffsetsBase; + private final long rowsBase; + private final int[] keys; + private final int[] rowOffsets; + + /** + * @param base absolute offset of the table section + * @param sectionBytes its declared length, which is what every allocation below is + * checked against. This constructor validated nothing + * before: {@code rowCount * keyFieldCount * 4} is three unchecked + * multiplications on values read straight out of the file, and + * {@code (rowCount + 1) * 4} wraps negative at 229 exactly + * as the string pool's did. + */ + Table(long base, long sectionBytes) throws IOException { + SeekableByteReader r = reader(); + byte[] h = new byte[16]; + Resources.readFully(r, base, h, 0, 16); + rowCount = beInt(h, 0); + keyFieldCount = beInt(h, 4); + rowOffsetsBase = base + beInt(h, 8); + rowsBase = base + beInt(h, 12); + if (rowCount < 0 || keyFieldCount < 0) { + throw new IOException(origin + " table at " + base + " declares " + rowCount + + " rows of " + keyFieldCount + " key fields"); + } + // Deliberately NOT capped at the "0..4" the format javadoc claims: the shipped + // proj4j-db.pjdx contains a table with keyFieldCount = 5, so that cap would have been a + // guard that refuses the library's own data. The section length below is the real bound + // and needs no magic number. + if (beInt(h, 8) < 16 || beInt(h, 8) > sectionBytes + || beInt(h, 12) < 16 || beInt(h, 12) > sectionBytes) { + throw new IOException(origin + " table at " + base + " puts its row offsets at +" + + beInt(h, 8) + " and its rows at +" + beInt(h, 12) + + ", outside its " + sectionBytes + "-byte section"); + } + int keyCount = GridExtents.checkedCount(origin + " table at " + base + " keys", + (long) rowCount * keyFieldCount, 4L, 16L, sectionBytes, "the section length"); + byte[] kb = new byte[keyCount * 4]; + Resources.readFully(r, base + 16, kb, 0, kb.length); + keys = new int[keyCount]; + for (int i = 0; i < keys.length; i++) { + keys[i] = beInt(kb, i * 4); + } + int offsetCount = GridExtents.checkedCount( + origin + " table at " + base + " row offsets", rowCount + 1L, 4L, + rowOffsetsBase - base, sectionBytes, "the section length"); + byte[] ob = new byte[offsetCount * 4]; + Resources.readFully(r, rowOffsetsBase, ob, 0, ob.length); + rowOffsets = new int[offsetCount]; + for (int i = 0; i <= rowCount; i++) { + rowOffsets[i] = beInt(ob, i * 4); + } + } + + int key(int row, int field) { + return keys[row * keyFieldCount + field]; + } + + /** + * @return the index of the first row whose key tuple is greater than or equal to {@code k}, + * comparing only {@code k.length} leading fields; {@code rowCount} if there is none + */ + int lowerBound(int... k) { + int lo = 0; + int hi = rowCount; + while (lo < hi) { + int mid = (lo + hi) >>> 1; + if (compareKey(mid, k) < 0) { + lo = mid + 1; + } else { + hi = mid; + } + } + return lo; + } + + /** + * @return the row index of an exact full-key match, or -1 + */ + int find(int... k) { + if (k.length != keyFieldCount) { + throw new IllegalArgumentException("expected " + keyFieldCount + " key fields, got " + + k.length); + } + for (int i = 0; i < k.length; i++) { + if (k[i] < 0) { + return -1; + } + } + int row = lowerBound(k); + return row < rowCount && compareKey(row, k) == 0 ? row : -1; + } + + int compareKey(int row, int[] k) { + for (int i = 0; i < k.length; i++) { + int a = key(row, i); + int b = k[i]; + if (a != b) { + return a < b ? -1 : 1; + } + } + return 0; + } + + RowCursor row(int rowIndex) { + int from = rowOffsets[rowIndex]; + int len = rowOffsets[rowIndex + 1] - from; + byte[] b = new byte[len]; + try { + Resources.readFully(reader(), rowsBase + from, b, 0, len); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return new RowCursor(b); + } + } + + Table table(int sectionId) { + Table t = sectionId < tableCache.length ? tableCache[sectionId] : null; + if (t != null) { + return t; + } + int i = sectionIndex(sectionId); + if (i < 0) { + throw new IllegalStateException(origin + " has no table section " + sectionId); + } + if (sectionKinds[i] != PjdxFormat.KIND_TABLE) { + throw new IllegalStateException(origin + " section " + sectionId + " is not a table"); + } + try { + t = new Table(sectionOffsets[i], sectionLengths[i]); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + if (sectionId < tableCache.length) { + tableCache[sectionId] = t; + } + return t; + } + + /** + * A sorted array of fixed-width {@code u32} tuples. + */ + final class Index { + final int entryCount; + final int fieldCount; + private final int[] data; + + /** + * @param sectionBytes the section's declared length. Like {@link Table}, this constructor + * validated nothing: {@code entryCount * fieldCount * 4} + * is two unchecked multiplications on values read straight out of the + * file, and a wrapped product yields either a + * {@code NegativeArraySizeException} or a multi-gigabyte + * {@code OutOfMemoryError}, neither of which names the file. + */ + Index(long base, long sectionBytes) throws IOException { + SeekableByteReader r = reader(); + byte[] h = new byte[8]; + Resources.readFully(r, base, h, 0, 8); + entryCount = beInt(h, 0); + fieldCount = beInt(h, 4); + if (entryCount < 0 || fieldCount < 0) { + throw new IOException(origin + " index at " + base + " declares " + entryCount + + " entries of " + fieldCount + " fields"); + } + int slots = GridExtents.checkedCount(origin + " index at " + base, + (long) entryCount * fieldCount, 4L, 8L, sectionBytes, "the section length"); + byte[] b = new byte[slots * 4]; + Resources.readFully(r, base + 8, b, 0, b.length); + data = new int[slots]; + for (int i = 0; i < data.length; i++) { + data[i] = beInt(b, i * 4); + } + } + + int field(int entry, int f) { + return data[entry * fieldCount + f]; + } + + int lowerBound(int... prefix) { + int lo = 0; + int hi = entryCount; + while (lo < hi) { + int mid = (lo + hi) >>> 1; + if (compare(mid, prefix) < 0) { + lo = mid + 1; + } else { + hi = mid; + } + } + return lo; + } + + int compare(int entry, int[] prefix) { + for (int i = 0; i < prefix.length; i++) { + int a = field(entry, i); + int b = prefix[i]; + if (a != b) { + return a < b ? -1 : 1; + } + } + return 0; + } + + boolean matches(int entry, int[] prefix) { + return entry < entryCount && compare(entry, prefix) == 0; + } + } + + Index index(int sectionId) { + Index x = sectionId < indexCache.length ? indexCache[sectionId] : null; + if (x != null) { + return x; + } + int i = sectionIndex(sectionId); + if (i < 0) { + throw new IllegalStateException(origin + " has no index section " + sectionId); + } + if (sectionKinds[i] != PjdxFormat.KIND_INDEX) { + throw new IllegalStateException(origin + " section " + sectionId + " is not an index"); + } + try { + x = new Index(sectionOffsets[i], sectionLengths[i]); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + if (sectionId < indexCache.length) { + indexCache[sectionId] = x; + } + return x; + } + + // ---------------------------------------------------------------- row decoding + + /** + * A forward-only cursor over one row's bytes. Not thread-safe and not intended to be: a cursor is + * created, drained and discarded inside a single method call. + */ + final class RowCursor { + private final byte[] b; + private int p; + + RowCursor(byte[] b) { + this.b = b; + } + + int remaining() { + return b.length - p; + } + + long varint() { + long v = 0; + int shift = 0; + while (true) { + if (p >= b.length) { + throw new IllegalStateException(origin + ": truncated varint in row"); + } + int c = b[p++] & 0xFF; + v |= ((long) (c & 0x7F)) << shift; + if ((c & 0x80) == 0) { + return v; + } + shift += 7; + if (shift > 63) { + throw new IllegalStateException(origin + ": varint too long"); + } + } + } + + int uint() { + return (int) varint(); + } + + boolean bool() { + return varint() != 0; + } + + /** 0 = null, 1 = false, 2 = true. */ + Boolean tri() { + long v = varint(); + return v == 0 ? null : Boolean.valueOf(v == 2); + } + + /** @return the string, or null. */ + String str() { + long v = varint(); + return v == 0 ? null : string((int) v - 1); + } + + /** @return the string id, or -1 for null. Avoids decoding when only identity is needed. */ + int strId() { + long v = varint(); + return v == 0 ? -1 : (int) v - 1; + } + + /** @return the value, or {@link Double#NaN} for SQL NULL. */ + double dbl() { + int tag = b[p++] & 0xFF; + switch (tag) { + case PjdxFormat.DBL_NULL: + return Double.NaN; + case PjdxFormat.DBL_ZERO: + return 0.0; + case PjdxFormat.DBL_LONG: { + long zz = varint(); + long v = (zz >>> 1) ^ -(zz & 1); + return (double) v; + } + case PjdxFormat.DBL_RAW: { + long bits = beLong(b, p); + p += 8; + return Double.longBitsToDouble(bits); + } + default: + throw new IllegalStateException(origin + ": unknown double tag " + tag); + } + } + } + + // ---------------------------------------------------------------- primitives + + static int beInt(byte[] b, int p) { + return ((b[p] & 0xFF) << 24) | ((b[p + 1] & 0xFF) << 16) | ((b[p + 2] & 0xFF) << 8) + | (b[p + 3] & 0xFF); + } + + static long beLong(byte[] b, int p) { + return ((long) beInt(b, p) << 32) | (beInt(b, p + 4) & 0xFFFFFFFFL); + } + + static String hex(byte[] b, int off, int len) { + char[] digits = "0123456789abcdef".toCharArray(); + char[] out = new char[len * 2]; + for (int i = 0; i < len; i++) { + int v = b[off + i] & 0xFF; + out[i * 2] = digits[v >>> 4]; + out[i * 2 + 1] = digits[v & 0xF]; + } + return new String(out); + } + + @Override + public String toString() { + return "PjdxFile[" + origin + ", " + fileLength + " bytes, " + sectionIds.length + + " sections, " + stringCount + " strings]"; + } + + /** Only used by tests and diagnostics. */ + int[] sectionIdsForDiagnostics() { + return Arrays.copyOf(sectionIds, sectionIds.length); + } + + long sectionLengthForDiagnostics(int sectionId) { + int i = sectionIndex(sectionId); + return i < 0 ? -1 : sectionLengths[i]; + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/PjdxFormat.java b/db/src/main/java/org/locationtech/proj4j/db/PjdxFormat.java new file mode 100644 index 0000000..97e1c16 --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/PjdxFormat.java @@ -0,0 +1,271 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +/** + * The on-disk shape of a {@code .pjdx} index: magic, section kinds, section identifiers, and the + * primitive encodings. Shared verbatim by the generator and the reader, so the two cannot drift. + * + *

Why a purpose-built format rather than the SQLite file

+ * A raw {@code proj.db} inside a jar cannot be opened by JDBC SQLite without a native library and an + * extraction to a filesystem we do not control. Core must have zero runtime + * dependencies, so both are out. Reading SQLite's b-tree pages in pure Java is possible — 4096 + * byte pages, 2496 of them — but it means implementing somebody else's write-oriented format, carrying + * its indexes, and inheriting a header whose change-counter fields differ between two runs that produce + * the same rows. + *

+ * Transcoding instead buys three things that are each worth having on their own: + *

    + *
  • Determinism. Every ordering in the file is a total order over the data, so two + * generations from the same input are byte-identical. That is a hard requirement, not a nicety: + * this runs in Spark executors that must produce bit-reproducible output.
  • + *
  • The bytes we do not need are gone — the write-path machinery, the b-tree + * interior pages, the page slack, and the 798 KB {@code idx_usage_object} whose job is done here + * by a 20-byte-per-row sorted array.
  • + *
  • Strings are shared. {@code 'EPSG'} appears in tens of thousands of rows + * upstream; here it appears once and is referenced by a varint.
  • + *
+ * + *

Layout

+ * All integers are big-endian, all offsets absolute unless stated otherwise. + *
+ * header, 64 bytes
+ *   0   char[8]   magic         "PJ4JDBX1"
+ *   8   u32       formatVersion 1
+ *   12  u32       sectionCount
+ *   16  u64       fileLength
+ *   24  u64       sectionDirectoryOffset
+ *   32  byte[32]  sha256 of bytes [64, fileLength)
+ *
+ * section directory, sectionCount * 24 bytes, sorted ascending by sectionId
+ *   u32 sectionId
+ *   u32 kind
+ *   u64 offset
+ *   u64 length
+ * 
+ * + *

{@link #KIND_STRINGS}

+ *
+ *   u32 count
+ *   u32 bytesRel            offset of the byte blob, relative to the section
+ *   u32[count + 1] offsets  relative to bytesRel; string i is [offsets[i], offsets[i+1])
+ *   bytes                   UTF-8, not terminated
+ * 
+ * String ids are assigned in ascending unsigned byte order of the UTF-8 encoding. That + * single rule does double duty: {@code id -> string} is an array index, and {@code string -> id} is a + * binary search over the same array, with no second index and no hash table anywhere in the file. + * + *

{@link #KIND_TABLE}

+ *
+ *   u32 rowCount
+ *   u32 keyFieldCount       each key field a u32 string id (or a small integer). This line used to
+ *                           say "0..4"; the shipped proj4j-db.pjdx contains a table with FIVE, and
+ *                           the reader deliberately imposes no cap here -- the section length is the
+ *                           bound, so a wider key needs no format change and no guard change.
+ *   u32 rowOffsetsRel
+ *   u32 rowsRel
+ *   u32[rowCount * keyFieldCount] keys      row-major, sorted ascending
+ *   u32[rowCount + 1] rowOffsets            relative to rowsRel
+ *   bytes rows
+ * 
+ * Rows are sorted by their key tuple, so a lookup is a binary search that touches only the key array + * and decodes exactly one row. Keys need not be unique: a duplicate key is found by seeking to the + * first matching entry and scanning forward, which is how the multi-row tables (aliases, supersessions, + * concatenated-operation steps) are served without a separate index. + * + *

{@link #KIND_INDEX}

+ *
+ *   u32 entryCount
+ *   u32 fieldCount
+ *   u32[entryCount * fieldCount] entries    row-major, sorted ascending
+ * 
+ * + *

Field encodings inside a row

+ *
    + *
  • varint — unsigned LEB128, 7 bits per byte, low group first.
  • + *
  • string — {@code varint(id + 1)}; {@code 0} means SQL NULL. Biasing by one is + * what lets a null cost one byte and keeps id 0 usable.
  • + *
  • int — varint.
  • + *
  • bool — varint 0 or 1.
  • + *
  • tri-state bool — varint 0 = NULL, 1 = false, 2 = true. Upstream really does + * distinguish "unknown" from "no" for {@code open_license}, and conflating them would turn + * "licence not established" into permission.
  • + *
  • double — a tag byte, then a payload: + * {@link #DBL_NULL} nothing (the reader yields NaN), + * {@link #DBL_ZERO} nothing, + * {@link #DBL_LONG} a zigzag varint whose {@code double} value is exact, + * {@link #DBL_RAW} eight big-endian IEEE-754 bytes. + * The two compact cases exist because parameter tables are full of exact zeros and exact integers + * such as {@code 500000}; they never change a value, only its size.
  • + *
  • parameter list — {@code varint count}, then per parameter: authority string, + * code string, name string, value double, unit authority string, unit code string.
  • + *
  • grid list — {@code varint count}, then that many strings.
  • + *
+ * + *

NaN, and why the encoding has an explicit null

+ * A missing accuracy, a missing inverse flattening and a missing bounding box are all reported to the + * caller as {@link Double#NaN}, and each has a dedicated {@link #DBL_NULL} tag rather than being written + * as a NaN bit pattern. Two reasons: a genuine NaN in the source data would otherwise be + * indistinguishable from an absent value, and {@code DBL_NULL} costs one byte where a NaN costs nine. + */ +public final class PjdxFormat { + + private PjdxFormat() { + } + + /** {@code "PJ4JDBX1"}. */ + public static final byte[] MAGIC = { + (byte) 'P', (byte) 'J', (byte) '4', (byte) 'J', + (byte) 'D', (byte) 'B', (byte) 'X', (byte) '1'}; + + public static final int FORMAT_VERSION = 1; + + public static final int HEADER_BYTES = 64; + public static final int SHA256_OFFSET = 32; + public static final int SHA256_BYTES = 32; + public static final int DIRECTORY_ENTRY_BYTES = 24; + + public static final int KIND_STRINGS = 1; + public static final int KIND_TABLE = 2; + public static final int KIND_INDEX = 3; + + // Double tags. + public static final int DBL_NULL = 0; + public static final int DBL_ZERO = 1; + public static final int DBL_LONG = 2; + public static final int DBL_RAW = 3; + + // ------------------------------------------------------------------ section ids + // + // Explicit and never reused. A reader that meets an unknown section id ignores it; a reader that + // cannot find a section id it needs fails loudly. That is what makes an additive revision possible + // without a format-version bump, and a subtractive one impossible by accident. + + public static final int S_STRINGS = 1; + + public static final int S_METADATA = 16; + public static final int S_UNIT = 17; + public static final int S_CELESTIAL_BODY = 18; + public static final int S_ELLIPSOID = 19; + public static final int S_PRIME_MERIDIAN = 20; + public static final int S_GEODETIC_DATUM = 21; + public static final int S_VERTICAL_DATUM = 22; + public static final int S_GEODETIC_ENSEMBLE_MEMBER = 23; + public static final int S_VERTICAL_ENSEMBLE_MEMBER = 24; + public static final int S_COORDINATE_SYSTEM = 25; + public static final int S_AXIS = 26; + public static final int S_GEODETIC_CRS = 27; + public static final int S_PROJECTED_CRS = 28; + public static final int S_VERTICAL_CRS = 29; + public static final int S_COMPOUND_CRS = 30; + public static final int S_ENGINEERING_CRS = 31; + public static final int S_CONVERSION = 32; + public static final int S_HELMERT_TRANSFORMATION = 33; + public static final int S_GRID_TRANSFORMATION = 34; + public static final int S_OTHER_TRANSFORMATION = 35; + public static final int S_CONCATENATED_OPERATION = 36; + public static final int S_CONCATENATED_STEP = 37; + public static final int S_EXTENT = 38; + public static final int S_GRID_ALTERNATIVE = 39; + public static final int S_ALIAS = 40; + public static final int S_SUPERSESSION = 41; + public static final int S_DEPRECATION = 42; + + public static final int X_CRS_BY_CODE = 64; + public static final int X_OP_BY_SOURCE_TARGET = 65; + public static final int X_OP_BY_TARGET_SOURCE = 66; + public static final int X_USAGE_BY_OBJECT = 67; + public static final int X_CRS_BY_NAME = 68; + public static final int X_CRS_BY_DATUM = 69; + public static final int X_AUTHORITIES = 70; + + // ------------------------------------------------------------------ table tags + // + // Written into index entries to say which table a row lives in. Stable, explicit, and deliberately + // in the same order as DbObjectType so a reader can map either way without a lookup table that + // could disagree with itself. + + public static final int TAG_UNIT_OF_MEASURE = 0; + public static final int TAG_CELESTIAL_BODY = 1; + public static final int TAG_ELLIPSOID = 2; + public static final int TAG_EXTENT = 3; + public static final int TAG_PRIME_MERIDIAN = 4; + public static final int TAG_GEODETIC_DATUM = 5; + public static final int TAG_VERTICAL_DATUM = 6; + public static final int TAG_ENGINEERING_DATUM = 7; + public static final int TAG_GEODETIC_CRS = 8; + public static final int TAG_PROJECTED_CRS = 9; + public static final int TAG_VERTICAL_CRS = 10; + public static final int TAG_COMPOUND_CRS = 11; + public static final int TAG_ENGINEERING_CRS = 12; + public static final int TAG_COORDINATE_SYSTEM = 13; + public static final int TAG_CONVERSION = 14; + public static final int TAG_GRID_TRANSFORMATION = 15; + public static final int TAG_HELMERT_TRANSFORMATION = 16; + public static final int TAG_OTHER_TRANSFORMATION = 17; + public static final int TAG_CONCATENATED_OPERATION = 18; + + /** Step direction encoding for {@link #S_CONCATENATED_STEP}. */ + public static final int DIRECTION_UNSPECIFIED = 0; + public static final int DIRECTION_FORWARD = 1; + public static final int DIRECTION_REVERSE = 2; + + /** The resource name of the shipped index, relative to the resolver's prefix. */ + public static final String RESOURCE_NAME = "proj4j-db.pjdx"; + + /** The classpath prefix the shipped index and its sidecar live under. */ + public static final String RESOURCE_PREFIX = "proj4j-data/db"; + + /** The build-stamped sidecar, cross-checked against the index's own {@code metadata}. */ + public static final String PROPERTIES_NAME = "db.properties"; + + /** + * Maps a table tag to the {@code DbObjectType} name it corresponds to. Kept as a plain array so the + * reader does not have to depend on enum {@code values()} order. + */ + public static final String[] TAG_TABLE_NAMES = { + "unit_of_measure", "celestial_body", "ellipsoid", "extent", "prime_meridian", + "geodetic_datum", "vertical_datum", "engineering_datum", + "geodetic_crs", "projected_crs", "vertical_crs", "compound_crs", "engineering_crs", + "coordinate_system", "conversion", + "grid_transformation", "helmert_transformation", "other_transformation", + "concatenated_operation"}; + + /** + * Normalises a name for the {@link #X_CRS_BY_NAME} index: upper-cased with {@link java.util.Locale#ROOT}, + * with all whitespace, {@code _} and {@code -} removed. + *

+ * Applied identically by the generator and by every query, which is the only way the two can agree. + * It is deliberately not a fuzzy match: {@code "WGS 84 / UTM zone 31N"} and + * {@code "wgs_84__utm-zone-31n"} collapse to the same key, but a misspelling does not collapse to + * anything. + */ + public static String normalizeName(String name) { + if (name == null) { + return null; + } + int n = name.length(); + StringBuilder sb = new StringBuilder(n); + for (int i = 0; i < n; i++) { + char c = name.charAt(i); + if (c == '_' || c == '-' || Character.isWhitespace(c)) { + continue; + } + sb.append(c); + } + return sb.toString().toUpperCase(java.util.Locale.ROOT); + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/Proj4jDb.java b/db/src/main/java/org/locationtech/proj4j/db/Proj4jDb.java new file mode 100644 index 0000000..b0a29ed --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/Proj4jDb.java @@ -0,0 +1,190 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import org.locationtech.proj4j.resource.ClasspathResourceResolver; +import org.locationtech.proj4j.resource.ResourceHandle; +import org.locationtech.proj4j.resource.ResourceResolver; + +/** + * The entry point: opens the shipped {@code proj4j-db} index. + *

+ * Everything is located through {@link ResourceResolver}. Nothing here reads an environment variable, + * a system property or the process working directory, and there is no network code — a Spark + * executor's working directory is framework-chosen and shared, and a file dropped there must never + * outrank the packaged one. + * + *

Two version sources that must agree

+ * {@link #open()} cross-checks the {@code metadata} table inside the index against the + * build-stamped {@code db.properties} sidecar next to it, and throws if they disagree. + * That catches a hand-edited or mismatched artifact before it produces a wrong answer, which an EPSG + * version string alone cannot do: the same EPSG version can be packaged differently. Both are + * surfaced, so a job can log {@link #sidecar()}'s {@code artifactSha256} per executor and prove all + * executors ran the same bytes. + */ +public final class Proj4jDb { + + private Proj4jDb() { + } + + /** + * Opens the index from this class's own class loader. + * + * @return the database, or {@code null} if the data is not on the classpath + * @throws IOException if the data is present but unreadable, mis-versioned, fails its SHA-256 + * self-check, or disagrees with its sidecar + */ + public static PjdxDatabase open() throws IOException { + return open(Proj4jDb.class.getClassLoader()); + } + + /** + * Opens the index from a given class loader. + * + * @return the database, or {@code null} if the data is not visible to {@code loader} + */ + public static PjdxDatabase open(ClassLoader loader) throws IOException { + return open(resolver(loader)); + } + + /** + * Opens the index through an arbitrary resolver, e.g. a + * {@code DirectoryResourceResolver} over an unpacked data directory. + * + * @return the database, or {@code null} if the resolver does not have + * {@code proj4j-db.pjdx} + */ + public static PjdxDatabase open(ResourceResolver resolver) throws IOException { + if (resolver == null) { + throw new IllegalArgumentException("resolver"); + } + ResourceHandle handle = resolver.resolve(PjdxFormat.RESOURCE_NAME); + if (handle == null) { + return null; + } + PjdxDatabase db = PjdxDatabase.open(handle); + try { + crossCheck(db, sidecar(resolver)); + } catch (IOException e) { + db.close(); + throw e; + } catch (RuntimeException e) { + db.close(); + throw e; + } + return db; + } + + /** + * The default resolver: the shipped {@code /proj4j-data/db/} classpath prefix, made enumerable by + * its generated {@code INDEX} manifest. + */ + public static ResourceResolver resolver(ClassLoader loader) { + return new ClasspathResourceResolver(loader, PjdxFormat.RESOURCE_PREFIX, "INDEX"); + } + + /** + * The build-stamped sidecar: {@code projSourceRev}, {@code projSourceCommit}, {@code projVersion}, + * {@code epsgVersion}, {@code formatVersion}, {@code artifactSha256}, {@code artifactBytes}, + * {@code generatedAtUtc}. + * + * @return an unmodifiable map in key order; empty if the sidecar is absent + */ + public static Map sidecar() throws IOException { + return sidecar(resolver(Proj4jDb.class.getClassLoader())); + } + + /** @see #sidecar() */ + public static Map sidecar(ResourceResolver resolver) throws IOException { + ResourceHandle handle = resolver.resolve(PjdxFormat.PROPERTIES_NAME); + if (handle == null) { + return Collections.emptyMap(); + } + Properties p = new Properties(); + InputStream in = new org.locationtech.proj4j.db.internal.ByteReaderInputStream(handle.open()); + try { + p.load(in); + } finally { + in.close(); + } + TreeMap out = new TreeMap(); + for (String key : p.stringPropertyNames()) { + out.put(key, p.getProperty(key)); + } + return Collections.unmodifiableMap(out); + } + + /** + * Fails if the index's own {@code metadata} and the sidecar disagree about what this artifact is. + *

+ * Deliberately not lenient. A mismatch means one of the two files was replaced independently of the + * other, and the whole point of shipping both is that neither can be trusted alone. + */ + static void crossCheck(PjdxDatabase db, Map sidecar) throws IOException { + if (sidecar.isEmpty()) { + throw new IOException(db.name() + " has no " + PjdxFormat.PROPERTIES_NAME + + " sidecar next to it. The sidecar is the second of two independent version" + + " sources; without it a mismatched database cannot be detected."); + } + Map metadata = db.metadata(); + checkEqual(db, "epsgVersion", sidecar.get("epsgVersion"), metadata.get("EPSG.VERSION"), + "EPSG.VERSION"); + checkEqual(db, "projVersion", sidecar.get("projVersion"), metadata.get("PROJ.VERSION"), + "PROJ.VERSION"); + String declaredFormat = sidecar.get("formatVersion"); + if (declaredFormat != null + && Integer.parseInt(declaredFormat.trim()) != PjdxFormat.FORMAT_VERSION) { + throw new IOException(db.name() + ": sidecar declares .pjdx format version " + + declaredFormat + ", this reader is version " + PjdxFormat.FORMAT_VERSION); + } + String declaredBytes = sidecar.get("artifactBytes"); + if (declaredBytes != null && Long.parseLong(declaredBytes.trim()) != db.sizeBytes()) { + throw new IOException(db.name() + ": sidecar declares " + declaredBytes + + " bytes, the index is " + db.sizeBytes()); + } + // contentSha256, not artifactSha256: the sidecar carries both, and they cover different byte + // ranges. artifactSha256 is the whole file, which is what the build-time enforcer gate + // compares; contentSha256 is the digest embedded in the header, covering bytes [64, len), + // which the reader has already verified against the bytes it read. Comparing the wrong one + // here would fail on every correct artifact -- and did, on the first run of the verifier. + String declaredSha = sidecar.get("contentSha256"); + if (declaredSha != null && !declaredSha.trim().equalsIgnoreCase(db.contentSha256())) { + throw new IOException(db.name() + ": sidecar records contentSha256 " + declaredSha + + " but the index's own content digest is " + db.contentSha256() + + ". The two files are from different builds."); + } + } + + private static void checkEqual(PjdxDatabase db, String sidecarKey, String sidecarValue, + String metadataValue, String metadataKey) throws IOException { + if (sidecarValue == null || metadataValue == null) { + return; + } + if (!sidecarValue.trim().equals(metadataValue.trim())) { + throw new IOException(db.name() + ": " + PjdxFormat.PROPERTIES_NAME + "'s " + sidecarKey + + " is '" + sidecarValue + "' but the index's metadata table says " + metadataKey + + " = '" + metadataValue + "'. Refusing to answer from a database whose two" + + " version sources disagree."); + } + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/gen/GenerateIndex.java b/db/src/main/java/org/locationtech/proj4j/db/gen/GenerateIndex.java new file mode 100644 index 0000000..ab81ccc --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/gen/GenerateIndex.java @@ -0,0 +1,1150 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db.gen; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.locationtech.proj4j.db.PjdxFormat; +import org.locationtech.proj4j.db.gen.QuoteDump.Table; + +/** + * Transcodes a {@code sqlite3 .mode quote} dump of PROJ's {@code proj.db} into a {@code .pjdx} index. + * Build-time only, run by {@code -Pregen-db}; excluded from the published jar. + *

+ * Usage: {@code GenerateIndex } + * + *

The schema subset, and what is deliberately dropped

+ * Transcoded: {@code metadata}, {@code unit_of_measure}, {@code celestial_body}, {@code ellipsoid}, + * {@code prime_meridian}, {@code geodetic_datum}, {@code vertical_datum}, both + * {@code *_datum_ensemble_member} tables, {@code coordinate_system}, {@code axis}, + * {@code geodetic_crs}, {@code projected_crs}, {@code vertical_crs}, {@code compound_crs}, + * {@code engineering_crs}, {@code conversion_table} (with names resolved from + * {@code conversion_method} and {@code conversion_param}), {@code helmert_transformation_table} (with + * the method name resolved from {@code coordinate_operation_method}), {@code grid_transformation}, + * {@code other_transformation}, {@code concatenated_operation}, {@code concatenated_operation_step}, + * {@code usage}, {@code extent}, {@code grid_alternatives}, {@code alias_name}, + * {@code supersession} and {@code deprecation}. + *

+ * Dropped on purpose, each with a reason: + *

    + *
  • {@code coordinate_metadata} (198 rows, 921,600 B of the SQLite file) — coordinate epochs for + * point-motion operations, which proj4j cannot execute yet. Shipping it would be shipping data + * for a capability that does not exist.
  • + *
  • {@code scope} (288 rows) — a usage's scope is descriptive text; PROJ's own operation selection + * never reads it. The {@code usage} rows are transcoded as an object-to-extent index, and the + * scope reference goes with the rest of the row.
  • + *
  • {@code sqlite_stat1} — query-planner statistics for a query planner we do not have.
  • + *
  • {@code grid_packages}, {@code builtin_authorities}, + * {@code versioned_auth_name_mapping} — {@code grid_packages} is vestigial upstream + * ({@code grid_alternatives.package_name} carries a {@code CHECK} that it is always NULL); the + * authority list is derived from the data instead of asserted separately, so the two cannot + * disagree.
  • + *
  • {@code authority_to_authority_preference} (6 rows) and {@code geoid_model} (67 rows) — no + * consumer in the SPI yet. Both are cheap to add when there is one; adding them now would be + * shipping an accessor nothing calls.
  • + *
  • {@code description} and {@code anchor} on datums and CRSs — free text, never read by + * selection or by the facade's output. {@code extent.description} is kept, because it + * is the string a human is shown as the area of use.
  • + *
+ * + *

Helmert parameters are ported, not remembered

+ * {@code helmert_transformation_table} stores its parameters as named columns, not as the + * {@code paramN} slots the other operation tables use. The mapping to EPSG parameter codes, and the + * conditional structure that decides which parameters exist for a 3-, 7-, 8-, 10-, 15-parameter or + * Molodensky-Badekas case, is transcribed from {@code 9.8.1:src/iso19111/factory.cpp:6337-6450} with + * the codes read out of {@code 9.8.1:src/proj_constants.h:509-559}. Getting a parameter code wrong here + * would bind a value to the wrong slot silently, which is exactly the failure this table's javadoc + * warns about. + */ +public final class GenerateIndex { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + private GenerateIndex() { + } + + public static void main(String[] args) throws Exception { + if (args.length < 4) { + System.err.println("usage: GenerateIndex "); + System.exit(2); + } + Path dump = Paths.get(args[0]); + Path outDir = Paths.get(args[1]); + String projRev = args[2]; + String projRevSha = args[3]; + + long t0 = System.currentTimeMillis(); + QuoteDump d = QuoteDump.read(dump); + System.out.println("read " + dump + " in " + (System.currentTimeMillis() - t0) + " ms"); + for (Map.Entry e : d.tables().entrySet()) { + System.out.println(String.format(" %-32s %7d rows", e.getKey(), + Integer.valueOf(e.getValue().rows.size()))); + } + + GenerateIndex g = new GenerateIndex(); + byte[] index = g.build(d); + + Files.createDirectories(outDir); + Path indexPath = outDir.resolve(PjdxFormat.RESOURCE_NAME); + Files.write(indexPath, index, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + String sha = hex(MessageDigest.getInstance("SHA-256").digest(index)); + + // db.properties: the second of the two independent version sources DatabaseInfo cross-checks. + // epsgVersion is read back out of the metadata table, never hardcoded, so the sidecar cannot + // claim a version the data does not have. + String epsgVersion = g.metadataValue(d, "EPSG.VERSION"); + String projVersion = g.metadataValue(d, "PROJ.VERSION"); + StringBuilder props = new StringBuilder(); + props.append("# Generated by org.locationtech.proj4j.db.gen.GenerateIndex. Do not edit.\n"); + props.append("# generatedAtUtc is taken from SOURCE_DATE_EPOCH when set, so a reproducible\n"); + props.append("# build produces a byte-identical sidecar as well as a byte-identical index.\n"); + props.append("projSourceRev=").append(projRev).append('\n'); + props.append("projSourceCommit=").append(projRevSha).append('\n'); + props.append("projVersion=").append(projVersion).append('\n'); + props.append("epsgVersion=").append(epsgVersion).append('\n'); + props.append("formatVersion=").append(PjdxFormat.FORMAT_VERSION).append('\n'); + // Two digests, deliberately, because they answer different questions. artifactSha256 covers + // the whole file and is what the Maven enforcer's requireFileChecksum gate compares, so a + // hand-edited artifact fails the build. contentSha256 is the digest embedded in the header at + // offset 32, covering bytes [64, len) -- the reader verifies that one against the bytes it + // actually read, so it is the value a job logs per executor to prove they ran the same data. + props.append("artifactSha256=").append(sha).append('\n'); + props.append("contentSha256=").append(hex(Arrays.copyOfRange(index, + PjdxFormat.SHA256_OFFSET, + PjdxFormat.SHA256_OFFSET + PjdxFormat.SHA256_BYTES))).append('\n'); + props.append("artifactBytes=").append(index.length).append('\n'); + props.append("generatedAtUtc=").append(sourceDate()).append('\n'); + Files.write(outDir.resolve(PjdxFormat.PROPERTIES_NAME), props.toString().getBytes(UTF8), + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + + // The enumerable-resolver manifest, exactly as the grid packs use. + String indexManifest = PjdxFormat.PROPERTIES_NAME + "\n" + PjdxFormat.RESOURCE_NAME + "\n"; + Files.write(outDir.resolve("INDEX"), indexManifest.getBytes(UTF8), + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + + System.out.println(); + System.out.println("wrote " + indexPath); + System.out.println(" bytes " + index.length); + System.out.println(" sha256 " + sha); + System.out.println(" strings " + g.writer.pool.count() + " (" + + g.writer.pool.totalBytes() + " B of UTF-8)"); + System.out.println(); + System.out.println("section sizes:"); + long sum = 0; + for (Map.Entry e : g.writer.sectionSizes().entrySet()) { + System.out.println(String.format(" %-3d %-32s %9d", e.getKey(), + sectionName(e.getKey().intValue()), e.getValue())); + sum += e.getValue().longValue(); + } + System.out.println(String.format(" %-36s %9d", "total sections", Long.valueOf(sum))); + System.out.println(); + System.out.println("Set in db/pom.xml to:"); + System.out.println(" " + sha); + } + + private static String sourceDate() { + String epoch = System.getenv("SOURCE_DATE_EPOCH"); + long seconds; + if (epoch != null && !epoch.trim().isEmpty()) { + seconds = Long.parseLong(epoch.trim()); + } else { + seconds = System.currentTimeMillis() / 1000L; + } + return java.time.Instant.ofEpochSecond(seconds).toString(); + } + + private final PjdxWriter writer = new PjdxWriter(); + + private String metadataValue(QuoteDump d, String key) { + Table t = d.table("metadata"); + for (Object[] row : t.rows) { + if (key.equals(t.text(row, "key"))) { + return t.text(row, "value"); + } + } + return ""; + } + + // ------------------------------------------------------------------ build + + private byte[] build(final QuoteDump d) throws IOException { + addMetadata(d); + addUnits(d); + addCelestialBodies(d); + addEllipsoids(d); + addPrimeMeridians(d); + addDatums(d); + addEnsembleMembers(d); + addCoordinateSystems(d); + addAxes(d); + addCrsTables(d); + addConversions(d); + addHelmert(d); + addGridTransformations(d); + addOtherTransformations(d); + addConcatenatedOperations(d); + addExtents(d); + addGridAlternatives(d); + addAliases(d); + addSupersessions(d); + addDeprecations(d); + + writer.collect(); + // Index key strings that appear nowhere else must be collected too: the normalised search names + // are synthesised, not copied from a column. + collectNormalisedNames(d); + writer.pool.finish(); + writer.encodeTables(); + + buildCrsIndexes(d); + buildOperationIndexes(d); + buildUsageIndex(d); + buildNameIndex(d); + buildAuthorityIndex(d); + + return writer.serialize(); + } + + // ------------------------------------------------------------------ simple tables + + private void addMetadata(QuoteDump d) { + final Table t = d.table("metadata"); + writer.addTable(PjdxFormat.S_METADATA, "metadata", t.rows, 1, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{t.text(row, "key")}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "value")); + } + }); + } + + private void addUnits(QuoteDump d) { + final Table t = d.table("unit_of_measure"); + writer.addTable(PjdxFormat.S_UNIT, "unit_of_measure", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.str(t.text(row, "type")); + e.dbl(t.real(row, "conv_factor")); + e.str(t.text(row, "proj_short_name")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private void addCelestialBodies(QuoteDump d) { + final Table t = d.table("celestial_body"); + writer.addTable(PjdxFormat.S_CELESTIAL_BODY, "celestial_body", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.dbl(t.real(row, "semi_major_axis")); + } + }); + } + + private void addEllipsoids(QuoteDump d) { + final Table t = d.table("ellipsoid"); + writer.addTable(PjdxFormat.S_ELLIPSOID, "ellipsoid", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.str(t.text(row, "celestial_body_auth_name")); + e.str(t.text(row, "celestial_body_code")); + e.dbl(t.real(row, "semi_major_axis")); + e.str(t.text(row, "uom_auth_name")); + e.str(t.text(row, "uom_code")); + e.dbl(t.real(row, "inv_flattening")); + e.dbl(t.real(row, "semi_minor_axis")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private void addPrimeMeridians(QuoteDump d) { + final Table t = d.table("prime_meridian"); + writer.addTable(PjdxFormat.S_PRIME_MERIDIAN, "prime_meridian", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.dbl(t.real(row, "longitude")); + e.str(t.text(row, "uom_auth_name")); + e.str(t.text(row, "uom_code")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private void addDatums(QuoteDump d) { + final Table g = d.table("geodetic_datum"); + writer.addTable(PjdxFormat.S_GEODETIC_DATUM, "geodetic_datum", g.rows, 2, authCode(g), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(g.text(row, "name")); + e.str(g.text(row, "ellipsoid_auth_name")); + e.str(g.text(row, "ellipsoid_code")); + e.str(g.text(row, "prime_meridian_auth_name")); + e.str(g.text(row, "prime_meridian_code")); + e.str(g.text(row, "publication_date")); + e.dbl(g.real(row, "frame_reference_epoch")); + e.dbl(g.real(row, "ensemble_accuracy")); + e.bool(g.bool(row, "deprecated")); + } + }); + final Table v = d.table("vertical_datum"); + writer.addTable(PjdxFormat.S_VERTICAL_DATUM, "vertical_datum", v.rows, 2, authCode(v), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(v.text(row, "name")); + e.str(v.text(row, "publication_date")); + e.dbl(v.real(row, "frame_reference_epoch")); + e.dbl(v.real(row, "ensemble_accuracy")); + e.bool(v.bool(row, "deprecated")); + } + }); + } + + private void addEnsembleMembers(QuoteDump d) { + addEnsemble(d.table("geodetic_datum_ensemble_member"), + PjdxFormat.S_GEODETIC_ENSEMBLE_MEMBER); + addEnsemble(d.table("vertical_datum_ensemble_member"), + PjdxFormat.S_VERTICAL_ENSEMBLE_MEMBER); + } + + private void addEnsemble(final Table t, int section) { + writer.addTable(section, t.name, t.rows, 3, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{t.text(row, "ensemble_auth_name"), + t.text(row, "ensemble_code"), + Integer.valueOf(t.integer(row, "sequence"))}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "member_auth_name")); + e.str(t.text(row, "member_code")); + } + }); + } + + private void addCoordinateSystems(QuoteDump d) { + final Table t = d.table("coordinate_system"); + writer.addTable(PjdxFormat.S_COORDINATE_SYSTEM, "coordinate_system", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "type")); + e.uint(t.integer(row, "dimension")); + } + }); + } + + private void addAxes(QuoteDump d) { + final Table t = d.table("axis"); + // Keyed by (cs, order, axis authority, axis code) rather than (cs, order). + // + // Upstream has exactly one coordinate system whose axis orders are not distinct: PROJ:ENh, a + // 3-dimensional Cartesian CS whose axes are numbered 1, 2 and *2* -- Easting (PROJ:1), + // Northing (PROJ:2) and Ellipsoidal height (PROJ:3). Verified against 9.8.1's own data; every + // other one of the 149 coordinate systems is well-formed. + // + // Keying on (cs, order) alone would leave those two rows tied, and the tie would then be + // broken by encoded row bytes -- which puts "Ellipsoidal height" before "Northing" and + // silently reorders the axes of a 3D system. Adding the axis's own identity to the key makes + // the order (order, axis code), which is what PROJ's own `ORDER BY coordinate_system_order` + // effectively yields, since SQLite returns equal keys in primary-key order. + writer.addTable(PjdxFormat.S_AXIS, "axis", t.rows, 5, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{t.text(row, "coordinate_system_auth_name"), + t.text(row, "coordinate_system_code"), + Integer.valueOf(t.integer(row, "coordinate_system_order")), + t.text(row, "auth_name"), t.text(row, "code")}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.str(t.text(row, "abbrev")); + e.str(t.text(row, "orientation")); + e.str(t.text(row, "uom_auth_name")); + e.str(t.text(row, "uom_code")); + } + }); + } + + private void addCrsTables(QuoteDump d) { + final Table g = d.table("geodetic_crs"); + writer.addTable(PjdxFormat.S_GEODETIC_CRS, "geodetic_crs", g.rows, 2, authCode(g), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(g.text(row, "name")); + e.str(g.text(row, "type")); + e.str(g.text(row, "coordinate_system_auth_name")); + e.str(g.text(row, "coordinate_system_code")); + e.str(g.text(row, "datum_auth_name")); + e.str(g.text(row, "datum_code")); + e.str(g.text(row, "text_definition")); + e.bool(g.bool(row, "deprecated")); + } + }); + final Table p = d.table("projected_crs"); + writer.addTable(PjdxFormat.S_PROJECTED_CRS, "projected_crs", p.rows, 2, authCode(p), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(p.text(row, "name")); + e.str(p.text(row, "coordinate_system_auth_name")); + e.str(p.text(row, "coordinate_system_code")); + e.str(p.text(row, "geodetic_crs_auth_name")); + e.str(p.text(row, "geodetic_crs_code")); + e.str(p.text(row, "conversion_auth_name")); + e.str(p.text(row, "conversion_code")); + e.str(p.text(row, "text_definition")); + e.bool(p.bool(row, "deprecated")); + } + }); + final Table v = d.table("vertical_crs"); + writer.addTable(PjdxFormat.S_VERTICAL_CRS, "vertical_crs", v.rows, 2, authCode(v), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(v.text(row, "name")); + e.str(v.text(row, "coordinate_system_auth_name")); + e.str(v.text(row, "coordinate_system_code")); + e.str(v.text(row, "datum_auth_name")); + e.str(v.text(row, "datum_code")); + e.bool(v.bool(row, "deprecated")); + } + }); + final Table c = d.table("compound_crs"); + writer.addTable(PjdxFormat.S_COMPOUND_CRS, "compound_crs", c.rows, 2, authCode(c), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(c.text(row, "name")); + e.str(c.text(row, "horiz_crs_auth_name")); + e.str(c.text(row, "horiz_crs_code")); + e.str(c.text(row, "vertical_crs_auth_name")); + e.str(c.text(row, "vertical_crs_code")); + e.bool(c.bool(row, "deprecated")); + } + }); + final Table en = d.table("engineering_crs"); + writer.addTable(PjdxFormat.S_ENGINEERING_CRS, "engineering_crs", en.rows, 2, authCode(en), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(en.text(row, "name")); + e.bool(en.bool(row, "deprecated")); + } + }); + } + + // ------------------------------------------------------------------ conversions + + private void addConversions(QuoteDump d) { + final Table t = d.table("conversion_table"); + final Map methodNames = nameMap(d.table("conversion_method")); + final Map paramNames = nameMap(d.table("conversion_param")); + writer.addTable(PjdxFormat.S_CONVERSION, "conversion_table", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + String ma = t.text(row, "method_auth_name"); + String mc = t.text(row, "method_code"); + e.str(ma); + e.str(mc); + e.str(ma == null || mc == null ? null : methodNames.get(ma + '' + mc)); + List params = new ArrayList(7); + for (int i = 1; i <= 7; i++) { + String pa = t.text(row, "param" + i + "_auth_name"); + String pc = t.text(row, "param" + i + "_code"); + if (pa == null || pc == null) { + continue; + } + params.add(new Object[]{pa, pc, paramNames.get(pa + '' + pc), + Double.valueOf(t.real(row, "param" + i + "_value")), + t.text(row, "param" + i + "_uom_auth_name"), + t.text(row, "param" + i + "_uom_code")}); + } + emitParams(e, params); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private static void emitParams(PjdxWriter.Enc e, List params) { + e.uint(params.size()); + for (Object[] p : params) { + e.str((String) p[0]); + e.str((String) p[1]); + e.str((String) p[2]); + e.dbl(((Double) p[3]).doubleValue()); + e.str((String) p[4]); + e.str((String) p[5]); + } + } + + private static Map nameMap(Table t) { + Map m = new HashMap(); + for (Object[] row : t.rows) { + m.put(t.text(row, "auth_name") + '' + t.text(row, "code"), t.text(row, "name")); + } + return m; + } + + // ------------------------------------------------------------------ operations + + /** + * EPSG parameter codes and names for the Helmert columns. Transcribed from + * {@code 9.8.1:src/proj_constants.h:509-559}; the conditional structure below is + * {@code factory.cpp:6337-6450}. + */ + private static final String[][] HELMERT_PARAMS = { + {"tx", "8605", "X-axis translation", "translation"}, + {"ty", "8606", "Y-axis translation", "translation"}, + {"tz", "8607", "Z-axis translation", "translation"}, + {"rx", "8608", "X-axis rotation", "rotation"}, + {"ry", "8609", "Y-axis rotation", "rotation"}, + {"rz", "8610", "Z-axis rotation", "rotation"}, + {"scale_difference", "8611", "Scale difference", "scale_difference"}, + {"rate_tx", "1040", "Rate of change of X-axis translation", "rate_translation"}, + {"rate_ty", "1041", "Rate of change of Y-axis translation", "rate_translation"}, + {"rate_tz", "1042", "Rate of change of Z-axis translation", "rate_translation"}, + {"rate_rx", "1043", "Rate of change of X-axis rotation", "rate_rotation"}, + {"rate_ry", "1044", "Rate of change of Y-axis rotation", "rate_rotation"}, + {"rate_rz", "1045", "Rate of change of Z-axis rotation", "rate_rotation"}, + {"rate_scale_difference", "1046", "Rate of change of Scale difference", + "rate_scale_difference"}, + {"epoch", "1047", "Parameter reference epoch", "epoch"}, + {"epoch", "1049", "Transformation reference epoch", "epoch"}, + {"px", "8617", "Ordinate 1 of evaluation point", "pivot"}, + {"py", "8618", "Ordinate 2 of evaluation point", "pivot"}, + {"pz", "8667", "Ordinate 3 of evaluation point", "pivot"}}; + + private void addHelmert(QuoteDump d) { + final Table t = d.table("helmert_transformation_table"); + final Map methodNames = nameMap(d.table("coordinate_operation_method")); + writer.addTable(PjdxFormat.S_HELMERT_TRANSFORMATION, "helmert_transformation_table", t.rows, 2, + authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + String ma = t.text(row, "method_auth_name"); + String mc = t.text(row, "method_code"); + e.str(ma); + e.str(mc); + e.str(ma == null || mc == null ? null : methodNames.get(ma + '' + mc)); + e.str(t.text(row, "source_crs_auth_name")); + e.str(t.text(row, "source_crs_code")); + e.str(t.text(row, "target_crs_auth_name")); + e.str(t.text(row, "target_crs_code")); + e.dbl(t.real(row, "accuracy")); + emitParams(e, helmertParams(t, row)); + e.str(t.text(row, "operation_version")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + /** + * Reproduces {@code factory.cpp}'s branch structure exactly: {@code tx/ty/tz} always; + * {@code rx/ry/rz/scale_difference} iff {@code rx} is present; then one of the rate block + * plus parameter code 1047, the 8-parameter epoch as code 1049, or the Molodensky-Badekas pivot. + * Those three are mutually exclusive upstream, and treating them as independent would emit + * parameters PROJ never emits. + */ + private static List helmertParams(Table t, Object[] row) { + List out = new ArrayList(15); + addHelmertParam(out, t, row, 0); + addHelmertParam(out, t, row, 1); + addHelmertParam(out, t, row, 2); + boolean hasRotation = !Double.isNaN(t.real(row, "rx")); + if (hasRotation) { + addHelmertParam(out, t, row, 3); + addHelmertParam(out, t, row, 4); + addHelmertParam(out, t, row, 5); + addHelmertParam(out, t, row, 6); + } + boolean hasRates = !Double.isNaN(t.real(row, "rate_tx")); + boolean hasEpochUom = t.text(row, "epoch_uom_auth_name") != null; + boolean hasPivot = !Double.isNaN(t.real(row, "px")); + if (hasRates) { + for (int i = 7; i <= 14; i++) { + addHelmertParam(out, t, row, i); + } + } else if (hasEpochUom) { + addHelmertParam(out, t, row, 15); + } else if (hasPivot) { + addHelmertParam(out, t, row, 16); + addHelmertParam(out, t, row, 17); + addHelmertParam(out, t, row, 18); + } + return out; + } + + private static void addHelmertParam(List out, Table t, Object[] row, int i) { + String[] spec = HELMERT_PARAMS[i]; + out.add(new Object[]{"EPSG", spec[1], spec[2], Double.valueOf(t.real(row, spec[0])), + t.text(row, spec[3] + "_uom_auth_name"), t.text(row, spec[3] + "_uom_code")}); + } + + private void addGridTransformations(QuoteDump d) { + final Table t = d.table("grid_transformation"); + writer.addTable(PjdxFormat.S_GRID_TRANSFORMATION, "grid_transformation", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + emitTransformationHead(e, t, row, 2); + List grids = new ArrayList(2); + addGrid(grids, t.text(row, "grid_name")); + addGrid(grids, t.text(row, "grid2_name")); + e.uint(grids.size()); + for (String g : grids) { + e.str(g); + } + e.str(t.text(row, "interpolation_crs_auth_name")); + e.str(t.text(row, "interpolation_crs_code")); + e.str(t.text(row, "operation_version")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private void addOtherTransformations(QuoteDump d) { + final Table t = d.table("other_transformation"); + writer.addTable(PjdxFormat.S_OTHER_TRANSFORMATION, "other_transformation", t.rows, 2, + authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + emitTransformationHead(e, t, row, 9); + List grids = new ArrayList(1); + addGrid(grids, t.text(row, "grid_name")); + e.uint(grids.size()); + for (String g : grids) { + e.str(g); + } + e.str(t.text(row, "interpolation_crs_auth_name")); + e.str(t.text(row, "interpolation_crs_code")); + e.str(t.text(row, "operation_version")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private static void addGrid(List grids, String name) { + if (name != null && !name.isEmpty()) { + grids.add(name); + } + } + + /** + * The head shared by {@code grid_transformation} and {@code other_transformation}: name, method, + * source, target, accuracy, parameters. Both carry {@code paramN_name} inline, unlike + * {@code conversion_table}. + */ + private static void emitTransformationHead(PjdxWriter.Enc e, Table t, Object[] row, int maxParams) { + e.str(t.text(row, "name")); + e.str(t.text(row, "method_auth_name")); + e.str(t.text(row, "method_code")); + e.str(t.text(row, "method_name")); + e.str(t.text(row, "source_crs_auth_name")); + e.str(t.text(row, "source_crs_code")); + e.str(t.text(row, "target_crs_auth_name")); + e.str(t.text(row, "target_crs_code")); + e.dbl(t.real(row, "accuracy")); + List params = new ArrayList(maxParams); + for (int i = 1; i <= maxParams; i++) { + String pa = t.text(row, "param" + i + "_auth_name"); + String pc = t.text(row, "param" + i + "_code"); + if (pa == null || pc == null) { + continue; + } + params.add(new Object[]{pa, pc, t.text(row, "param" + i + "_name"), + Double.valueOf(t.real(row, "param" + i + "_value")), + t.text(row, "param" + i + "_uom_auth_name"), + t.text(row, "param" + i + "_uom_code")}); + } + emitParams(e, params); + } + + private void addConcatenatedOperations(QuoteDump d) { + final Table t = d.table("concatenated_operation"); + writer.addTable(PjdxFormat.S_CONCATENATED_OPERATION, "concatenated_operation", t.rows, 2, + authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.str(t.text(row, "source_crs_auth_name")); + e.str(t.text(row, "source_crs_code")); + e.str(t.text(row, "target_crs_auth_name")); + e.str(t.text(row, "target_crs_code")); + e.dbl(t.real(row, "accuracy")); + e.str(t.text(row, "operation_version")); + e.bool(t.bool(row, "deprecated")); + } + }); + + // A step names an operation by (auth, code) only. Which table it lives in is resolved here, + // once, at build time -- including the 30 of 868 steps that reference a *conversion* rather + // than a transformation, which a reader forced to guess would get wrong. + final Map operationTags = new HashMap(); + putTags(operationTags, d.table("helmert_transformation_table"), + PjdxFormat.TAG_HELMERT_TRANSFORMATION); + putTags(operationTags, d.table("grid_transformation"), PjdxFormat.TAG_GRID_TRANSFORMATION); + putTags(operationTags, d.table("other_transformation"), PjdxFormat.TAG_OTHER_TRANSFORMATION); + putTags(operationTags, d.table("concatenated_operation"), + PjdxFormat.TAG_CONCATENATED_OPERATION); + putTags(operationTags, d.table("conversion_table"), PjdxFormat.TAG_CONVERSION); + + final Table s = d.table("concatenated_operation_step"); + writer.addTable(PjdxFormat.S_CONCATENATED_STEP, "concatenated_operation_step", s.rows, 3, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{s.text(row, "operation_auth_name"), + s.text(row, "operation_code"), + Integer.valueOf(s.integer(row, "step_number"))}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + String sa = s.text(row, "step_auth_name"); + String sc = s.text(row, "step_code"); + Integer tag = operationTags.get(sa + '' + sc); + if (tag == null) { + throw new IllegalStateException("concatenated_operation " + + s.text(row, "operation_auth_name") + ":" + + s.text(row, "operation_code") + " step " + + s.text(row, "step_number") + " references " + sa + ":" + sc + + ", which is in none of the transformation or conversion tables." + + " Emitting a guessed table tag would make the step decode to the" + + " wrong operation."); + } + e.uint(tag.intValue()); + e.str(sa); + e.str(sc); + String dir = s.text(row, "step_direction"); + e.uint("forward".equals(dir) ? PjdxFormat.DIRECTION_FORWARD + : "reverse".equals(dir) ? PjdxFormat.DIRECTION_REVERSE + : PjdxFormat.DIRECTION_UNSPECIFIED); + } + }); + } + + private static void putTags(Map into, Table t, int tag) { + for (Object[] row : t.rows) { + into.put(t.text(row, "auth_name") + '' + t.text(row, "code"), Integer.valueOf(tag)); + } + } + + // ------------------------------------------------------------------ extents, grids, names + + private void addExtents(QuoteDump d) { + final Table t = d.table("extent"); + writer.addTable(PjdxFormat.S_EXTENT, "extent", t.rows, 2, authCode(t), + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "name")); + e.str(t.text(row, "description")); + // Stored west, south, east, north -- not upstream's south, north, west, east. + // The reader reads them in this order; both sides say so explicitly. + e.dbl(t.real(row, "west_lon")); + e.dbl(t.real(row, "south_lat")); + e.dbl(t.real(row, "east_lon")); + e.dbl(t.real(row, "north_lat")); + e.bool(t.bool(row, "deprecated")); + } + }); + } + + private void addGridAlternatives(QuoteDump d) { + final Table t = d.table("grid_alternatives"); + writer.addTable(PjdxFormat.S_GRID_ALTERNATIVE, "grid_alternatives", t.rows, 1, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{t.text(row, "original_grid_name")}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "proj_grid_name")); + e.str(t.text(row, "old_proj_grid_name")); + e.str(t.text(row, "proj_grid_format")); + e.str(t.text(row, "proj_method")); + e.bool(t.bool(row, "inverse_direction")); + e.str(t.text(row, "url")); + e.tri(t.tri(row, "direct_download")); + e.tri(t.tri(row, "open_license")); + e.str(t.text(row, "directory")); + } + }); + } + + private void addAliases(QuoteDump d) { + final Table t = d.table("alias_name"); + writer.addTable(PjdxFormat.S_ALIAS, "alias_name", t.rows, 4, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{Integer.valueOf(tagOf(t.text(row, "table_name"))), + t.text(row, "auth_name"), t.text(row, "code"), + t.text(row, "alt_name")}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "source")); + } + }); + } + + private void addSupersessions(QuoteDump d) { + final Table t = d.table("supersession"); + writer.addTable(PjdxFormat.S_SUPERSESSION, "supersession", t.rows, 3, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{ + Integer.valueOf(tagOf(t.text(row, "superseded_table_name"))), + t.text(row, "superseded_auth_name"), t.text(row, "superseded_code")}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.uint(tagOf(t.text(row, "replacement_table_name"))); + e.str(t.text(row, "replacement_auth_name")); + e.str(t.text(row, "replacement_code")); + e.str(t.text(row, "source")); + e.bool(t.bool(row, "same_source_target_crs")); + } + }); + } + + private void addDeprecations(QuoteDump d) { + final Table t = d.table("deprecation"); + writer.addTable(PjdxFormat.S_DEPRECATION, "deprecation", t.rows, 3, + new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{Integer.valueOf(tagOf(t.text(row, "table_name"))), + t.text(row, "deprecated_auth_name"), + t.text(row, "deprecated_code")}; + } + }, + new PjdxWriter.RowEmitter() { + @Override + public void emit(PjdxWriter.Enc e, Object[] row) { + e.str(t.text(row, "replacement_auth_name")); + e.str(t.text(row, "replacement_code")); + e.str(t.text(row, "source")); + } + }); + } + + // ------------------------------------------------------------------ indexes + + private static final String[] CRS_TABLES = { + "geodetic_crs", "projected_crs", "vertical_crs", "compound_crs", "engineering_crs"}; + + private static final int[] CRS_TAGS = { + PjdxFormat.TAG_GEODETIC_CRS, PjdxFormat.TAG_PROJECTED_CRS, PjdxFormat.TAG_VERTICAL_CRS, + PjdxFormat.TAG_COMPOUND_CRS, PjdxFormat.TAG_ENGINEERING_CRS}; + + private static final int[] CRS_SECTIONS = { + PjdxFormat.S_GEODETIC_CRS, PjdxFormat.S_PROJECTED_CRS, PjdxFormat.S_VERTICAL_CRS, + PjdxFormat.S_COMPOUND_CRS, PjdxFormat.S_ENGINEERING_CRS}; + + private void buildCrsIndexes(QuoteDump d) { + PjdxWriter.PendingIndex byCode = + writer.newIndex(PjdxFormat.X_CRS_BY_CODE, "X_CRS_BY_CODE", 4); + PjdxWriter.PendingIndex byDatum = + writer.newIndex(PjdxFormat.X_CRS_BY_DATUM, "X_CRS_BY_DATUM", 6); + + for (int i = 0; i < CRS_TABLES.length; i++) { + Table t = d.table(CRS_TABLES[i]); + for (Object[] row : t.rows) { + String a = t.text(row, "auth_name"); + String c = t.text(row, "code"); + int aid = writer.pool.id(a); + int cid = writer.pool.id(c); + int rowIndex = writer.rowIndex(CRS_SECTIONS[i], aid, cid); + if (rowIndex < 0) { + throw new IllegalStateException(CRS_TABLES[i] + " row " + a + ":" + c + + " has no encoded row"); + } + byCode.add(aid, cid, CRS_TAGS[i], rowIndex); + } + } + + // Geodetic and vertical CRSs indexed by their datum. This is the pivot query for operation + // search: the authority publishes transformations between CRSs, so relating two datums means + // finding the CRSs on each. + addCrsByDatum(byDatum, d.table("geodetic_crs"), PjdxFormat.TAG_GEODETIC_DATUM, + PjdxFormat.TAG_GEODETIC_CRS); + addCrsByDatum(byDatum, d.table("vertical_crs"), PjdxFormat.TAG_VERTICAL_DATUM, + PjdxFormat.TAG_VERTICAL_CRS); + } + + private void addCrsByDatum(PjdxWriter.PendingIndex byDatum, Table t, int datumTag, + int crsTag) { + for (Object[] row : t.rows) { + String da = t.text(row, "datum_auth_name"); + String dc = t.text(row, "datum_code"); + if (da == null || dc == null) { + // 0 of the shipped geodetic CRSs, but the schema permits it for a text_definition CRS. + continue; + } + byDatum.add(datumTag, writer.pool.id(da), writer.pool.id(dc), crsTag, + writer.pool.id(t.text(row, "auth_name")), writer.pool.id(t.text(row, "code"))); + } + } + + private static final String[] OP_TABLES = { + "helmert_transformation_table", "grid_transformation", "other_transformation", + "concatenated_operation"}; + + private static final int[] OP_TAGS = { + PjdxFormat.TAG_HELMERT_TRANSFORMATION, PjdxFormat.TAG_GRID_TRANSFORMATION, + PjdxFormat.TAG_OTHER_TRANSFORMATION, PjdxFormat.TAG_CONCATENATED_OPERATION}; + + private static final int[] OP_SECTIONS = { + PjdxFormat.S_HELMERT_TRANSFORMATION, PjdxFormat.S_GRID_TRANSFORMATION, + PjdxFormat.S_OTHER_TRANSFORMATION, PjdxFormat.S_CONCATENATED_OPERATION}; + + private void buildOperationIndexes(QuoteDump d) { + PjdxWriter.PendingIndex bySrc = + writer.newIndex(PjdxFormat.X_OP_BY_SOURCE_TARGET, "X_OP_BY_SOURCE_TARGET", 6); + PjdxWriter.PendingIndex byTgt = + writer.newIndex(PjdxFormat.X_OP_BY_TARGET_SOURCE, "X_OP_BY_TARGET_SOURCE", 6); + for (int i = 0; i < OP_TABLES.length; i++) { + Table t = d.table(OP_TABLES[i]); + for (Object[] row : t.rows) { + int aid = writer.pool.id(t.text(row, "auth_name")); + int cid = writer.pool.id(t.text(row, "code")); + int rowIndex = writer.rowIndex(OP_SECTIONS[i], aid, cid); + int sa = writer.pool.id(t.text(row, "source_crs_auth_name")); + int sc = writer.pool.id(t.text(row, "source_crs_code")); + int ta = writer.pool.id(t.text(row, "target_crs_auth_name")); + int tc = writer.pool.id(t.text(row, "target_crs_code")); + bySrc.add(sa, sc, ta, tc, OP_TAGS[i], rowIndex); + byTgt.add(ta, tc, sa, sc, OP_TAGS[i], rowIndex); + } + } + } + + private void buildUsageIndex(QuoteDump d) { + Table t = d.table("usage"); + PjdxWriter.PendingIndex x = + writer.newIndex(PjdxFormat.X_USAGE_BY_OBJECT, "X_USAGE_BY_OBJECT", 5); + for (Object[] row : t.rows) { + x.add(tagOf(t.text(row, "object_table_name")), + writer.pool.id(t.text(row, "object_auth_name")), + writer.pool.id(t.text(row, "object_code")), + writer.pool.id(t.text(row, "extent_auth_name")), + writer.pool.id(t.text(row, "extent_code"))); + } + } + + /** + * The CRS name index covers both the CRS's own name and every {@code alias_name} for it, under the + * same normalisation the reader applies. Pass one cannot collect these strings from a column, + * because they are synthesised — hence {@link #collectNormalisedNames}. + */ + private void buildNameIndex(QuoteDump d) { + PjdxWriter.PendingIndex x = + writer.newIndex(PjdxFormat.X_CRS_BY_NAME, "X_CRS_BY_NAME", 4); + for (int i = 0; i < CRS_TABLES.length; i++) { + Table t = d.table(CRS_TABLES[i]); + for (Object[] row : t.rows) { + String norm = PjdxFormat.normalizeName(t.text(row, "name")); + if (norm == null || norm.isEmpty()) { + continue; + } + x.add(writer.pool.id(norm), CRS_TAGS[i], writer.pool.id(t.text(row, "auth_name")), + writer.pool.id(t.text(row, "code"))); + } + } + Table alias = d.table("alias_name"); + for (Object[] row : alias.rows) { + int tag = tagOf(alias.text(row, "table_name")); + if (!isCrsTag(tag)) { + continue; + } + String norm = PjdxFormat.normalizeName(alias.text(row, "alt_name")); + if (norm == null || norm.isEmpty()) { + continue; + } + x.add(writer.pool.id(norm), tag, writer.pool.id(alias.text(row, "auth_name")), + writer.pool.id(alias.text(row, "code"))); + } + } + + private void collectNormalisedNames(QuoteDump d) { + for (String table : CRS_TABLES) { + Table t = d.table(table); + for (Object[] row : t.rows) { + writer.pool.add(PjdxFormat.normalizeName(t.text(row, "name"))); + } + } + Table alias = d.table("alias_name"); + for (Object[] row : alias.rows) { + if (isCrsTag(tagOf(alias.text(row, "table_name")))) { + writer.pool.add(PjdxFormat.normalizeName(alias.text(row, "alt_name"))); + } + } + } + + private static boolean isCrsTag(int tag) { + for (int t : CRS_TAGS) { + if (t == tag) { + return true; + } + } + return false; + } + + private void buildAuthorityIndex(QuoteDump d) { + PjdxWriter.PendingIndex x = + writer.newIndex(PjdxFormat.X_AUTHORITIES, "X_AUTHORITIES", 1); + java.util.TreeSet auths = new java.util.TreeSet(); + for (String table : CRS_TABLES) { + collectAuthorities(auths, d.table(table)); + } + for (String table : OP_TABLES) { + collectAuthorities(auths, d.table(table)); + } + collectAuthorities(auths, d.table("conversion_table")); + collectAuthorities(auths, d.table("geodetic_datum")); + collectAuthorities(auths, d.table("vertical_datum")); + collectAuthorities(auths, d.table("ellipsoid")); + collectAuthorities(auths, d.table("prime_meridian")); + collectAuthorities(auths, d.table("unit_of_measure")); + collectAuthorities(auths, d.table("extent")); + for (String a : auths) { + x.add(writer.pool.id(a)); + } + } + + private static void collectAuthorities(java.util.Set into, Table t) { + for (Object[] row : t.rows) { + into.add(t.text(row, "auth_name")); + } + } + + // ------------------------------------------------------------------ helpers + + private static PjdxWriter.KeyExtractor authCode(final Table t) { + return new PjdxWriter.KeyExtractor() { + @Override + public Object[] key(Object[] row) { + return new Object[]{t.text(row, "auth_name"), t.text(row, "code")}; + } + }; + } + + /** Upstream table name to the format's table tag. Fails loudly on an unknown name. */ + static int tagOf(String tableName) { + for (int i = 0; i < PjdxFormat.TAG_TABLE_NAMES.length; i++) { + if (PjdxFormat.TAG_TABLE_NAMES[i].equals(tableName)) { + return i; + } + } + throw new IllegalStateException("no table tag for upstream table '" + tableName + + "'; the transcoder must be updated deliberately rather than dropping the row"); + } + + private static String sectionName(int sectionId) { + java.lang.reflect.Field[] fields = PjdxFormat.class.getFields(); + for (java.lang.reflect.Field f : fields) { + if (f.getType() == int.class + && (f.getName().startsWith("S_") || f.getName().startsWith("X_"))) { + try { + if (f.getInt(null) == sectionId) { + return f.getName(); + } + } catch (IllegalAccessException ignored) { + // Public static field of a public class; cannot happen. + } + } + } + return "section " + sectionId; + } + + private static String hex(byte[] b) { + char[] digits = "0123456789abcdef".toCharArray(); + char[] out = new char[b.length * 2]; + for (int i = 0; i < b.length; i++) { + int v = b[i] & 0xFF; + out[i * 2] = digits[v >>> 4]; + out[i * 2 + 1] = digits[v & 0xF]; + } + return new String(out); + } + + static { + // Guards a silent mismatch: the tag table and the section arrays are written by hand and must + // agree, and a mistake here would misfile whole tables rather than fail. + if (CRS_TABLES.length != CRS_TAGS.length || CRS_TABLES.length != CRS_SECTIONS.length + || OP_TABLES.length != OP_TAGS.length || OP_TABLES.length != OP_SECTIONS.length) { + throw new AssertionError("CRS/operation table, tag and section arrays disagree: " + + Arrays.toString(CRS_TABLES) + " " + Arrays.toString(OP_TABLES)); + } + if (HELMERT_PARAMS.length != 19) { + throw new AssertionError("HELMERT_PARAMS must have 19 entries"); + } + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/gen/PjdxWriter.java b/db/src/main/java/org/locationtech/proj4j/db/gen/PjdxWriter.java new file mode 100644 index 0000000..9b9173c --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/gen/PjdxWriter.java @@ -0,0 +1,580 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db.gen; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.locationtech.proj4j.db.PjdxFormat; + +/** + * Builds a {@code .pjdx} index. Build-time only; not shipped in the jar. + * + *

Determinism, and how it is achieved rather than hoped for

+ * Every ordering in the output file is a total order over the data, so two runs over + * the same input produce byte-identical files and CI can prove it with {@code git diff --exit-code}: + *
    + *
  • String ids are assigned in ascending unsigned UTF-8 byte order — not + * {@code String.compareTo}, which orders by UTF-16 code unit and disagrees with byte order for + * supplementary characters. The reader binary-searches the same byte order, so the two agree by + * construction.
  • + *
  • Table rows are sorted by their key tuple, and ties are broken by the encoded row bytes. + * That gives a total order even for the tables whose keys are genuinely non-unique — aliases, + * supersessions — so no {@code HashMap} iteration or input order can leak into the file.
  • + *
  • Index entries are sorted by their whole tuple, again a total order because the trailing fields + * are the row's table tag and row number.
  • + *
+ * The two-pass structure exists for the same reason: pass one only collects strings, the pool + * is then sorted and frozen, and pass two encodes. Assigning ids in encounter order would make the file + * depend on the dump's row order, which is sqlite's business and not ours. + */ +final class PjdxWriter { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + // ------------------------------------------------------------------ string pool + + static final class StringPool { + private final Set collected = new HashSet(1 << 16); + private String[] sorted; + private Map ids; + private byte[][] encoded; + + void add(String s) { + if (s != null) { + collected.add(s); + } + } + + void finish() { + List all = new ArrayList(collected); + final Map utf8 = new HashMap(all.size() * 2); + for (String s : all) { + utf8.put(s, s.getBytes(UTF8)); + } + Collections.sort(all, new Comparator() { + @Override + public int compare(String a, String b) { + return compareUnsigned(utf8.get(a), utf8.get(b)); + } + }); + sorted = all.toArray(new String[0]); + encoded = new byte[sorted.length][]; + ids = new HashMap(sorted.length * 2); + for (int i = 0; i < sorted.length; i++) { + encoded[i] = utf8.get(sorted[i]); + ids.put(sorted[i], Integer.valueOf(i)); + } + } + + int count() { + return sorted.length; + } + + int id(String s) { + if (s == null) { + return -1; + } + Integer i = ids.get(s); + if (i == null) { + throw new IllegalStateException("string '" + s + "' was not collected in pass one;" + + " the two passes disagree, which would corrupt the file"); + } + return i.intValue(); + } + + long totalBytes() { + long n = 0; + for (byte[] b : encoded) { + n += b.length; + } + return n; + } + + byte[] serialize() { + int count = sorted.length; + int bytesRel = 8 + (count + 1) * 4; + ByteArrayOutputStream out = new ByteArrayOutputStream(bytesRel + (int) totalBytes()); + writeInt(out, count); + writeInt(out, bytesRel); + int off = 0; + for (int i = 0; i < count; i++) { + writeInt(out, off); + off += encoded[i].length; + } + writeInt(out, off); + for (int i = 0; i < count; i++) { + out.write(encoded[i], 0, encoded[i].length); + } + return out.toByteArray(); + } + } + + static int compareUnsigned(byte[] a, byte[] b) { + int n = Math.min(a.length, b.length); + for (int i = 0; i < n; i++) { + int d = (a[i] & 0xFF) - (b[i] & 0xFF); + if (d != 0) { + return d; + } + } + return a.length - b.length; + } + + // ------------------------------------------------------------------ field encoder + + /** + * Encodes one row's fields. In {@code collect} mode nothing is written and strings are merely + * registered with the pool, so the same emitter code runs in both passes and the two cannot drift. + */ + static final class Enc { + private final StringPool pool; + private final boolean collect; + private final ByteArrayOutputStream out = new ByteArrayOutputStream(256); + + Enc(StringPool pool, boolean collect) { + this.pool = pool; + this.collect = collect; + } + + void reset() { + out.reset(); + } + + byte[] bytes() { + return out.toByteArray(); + } + + Enc str(String s) { + if (collect) { + pool.add(s); + } else { + varint(s == null ? 0 : pool.id(s) + 1L); + } + return this; + } + + Enc uint(long v) { + if (!collect) { + if (v < 0) { + throw new IllegalArgumentException("uint " + v); + } + varint(v); + } + return this; + } + + Enc bool(boolean b) { + return uint(b ? 1 : 0); + } + + Enc tri(Boolean b) { + return uint(b == null ? 0 : b.booleanValue() ? 2 : 1); + } + + Enc dbl(double v) { + if (collect) { + return this; + } + if (Double.isNaN(v)) { + out.write(PjdxFormat.DBL_NULL); + return this; + } + // +0.0 and -0.0 are distinguished: writing -0.0 as DBL_ZERO would change its sign bit. + if (v == 0.0 && Double.doubleToRawLongBits(v) == 0L) { + out.write(PjdxFormat.DBL_ZERO); + return this; + } + long asLong = (long) v; + if ((double) asLong == v && Double.doubleToRawLongBits(v) != 0x8000000000000000L) { + out.write(PjdxFormat.DBL_LONG); + varint((asLong << 1) ^ (asLong >> 63)); + return this; + } + out.write(PjdxFormat.DBL_RAW); + long bits = Double.doubleToRawLongBits(v); + for (int i = 7; i >= 0; i--) { + out.write((int) (bits >>> (i * 8)) & 0xFF); + } + return this; + } + + private void varint(long v) { + long x = v; + while (true) { + int b = (int) (x & 0x7F); + x >>>= 7; + if (x != 0) { + out.write(b | 0x80); + } else { + out.write(b); + return; + } + } + } + } + + // ------------------------------------------------------------------ sections + + interface RowEmitter { + void emit(Enc e, Object[] row); + } + + interface KeyExtractor { + /** Elements are {@code String} (encoded as a string id) or {@code Integer} (encoded as is). */ + Object[] key(Object[] row); + } + + private static final class PendingTable { + final int sectionId; + final String label; + final List rows; + final KeyExtractor keys; + final RowEmitter emitter; + final int keyFieldCount; + int[][] encodedKeys; + byte[][] encodedRows; + Map rowIndexByKey; + + PendingTable(int sectionId, String label, List rows, int keyFieldCount, + KeyExtractor keys, RowEmitter emitter) { + this.sectionId = sectionId; + this.label = label; + this.rows = rows; + this.keyFieldCount = keyFieldCount; + this.keys = keys; + this.emitter = emitter; + } + } + + static final class PendingIndex { + final int sectionId; + final String label; + final int fieldCount; + final List entries = new ArrayList(); + + PendingIndex(int sectionId, String label, int fieldCount) { + this.sectionId = sectionId; + this.label = label; + this.fieldCount = fieldCount; + } + + /** + * Appends one entry. Order of appends is irrelevant: entries are sorted by their whole tuple + * on serialisation, which is a total order because the trailing fields identify the row. + */ + void add(int... fields) { + if (fields.length != fieldCount) { + throw new IllegalStateException(label + ": entry has " + fields.length + + " fields, declared " + fieldCount); + } + for (int f : fields) { + if (f < 0) { + throw new IllegalStateException(label + ": negative field in entry " + + Arrays.toString(fields) + " -- a null string id reached an index key," + + " which would sort before every real one and match the wrong rows"); + } + } + entries.add(fields); + } + } + + final StringPool pool = new StringPool(); + private final List tables = new ArrayList(); + private final List indexes = new ArrayList(); + private final Map tableBySection = new HashMap(); + private final Map sectionSizes = new java.util.TreeMap(); + + void addTable(int sectionId, String label, List rows, int keyFieldCount, + KeyExtractor keys, RowEmitter emitter) { + PendingTable t = new PendingTable(sectionId, label, rows, keyFieldCount, keys, emitter); + tables.add(t); + tableBySection.put(Integer.valueOf(sectionId), t); + } + + PendingIndex newIndex(int sectionId, String label, int fieldCount) { + PendingIndex x = new PendingIndex(sectionId, label, fieldCount); + indexes.add(x); + return x; + } + + /** Pass one: register every string, keys included. */ + void collect() { + Enc collector = new Enc(pool, true); + for (PendingTable t : tables) { + for (Object[] row : t.rows) { + for (Object k : t.keys.key(row)) { + if (k instanceof String) { + pool.add((String) k); + } + } + collector.reset(); + t.emitter.emit(collector, row); + } + } + } + + /** Pass two: encode and sort every table. Must be called after {@link StringPool#finish()}. */ + void encodeTables() { + Enc enc = new Enc(pool, false); + for (final PendingTable t : tables) { + int n = t.rows.size(); + final int[][] keys = new int[n][]; + final byte[][] payloads = new byte[n][]; + for (int i = 0; i < n; i++) { + Object[] row = t.rows.get(i); + Object[] kraw = t.keys.key(row); + if (kraw.length != t.keyFieldCount) { + throw new IllegalStateException(t.label + ": key has " + kraw.length + + " fields, declared " + t.keyFieldCount); + } + int[] k = new int[kraw.length]; + for (int j = 0; j < kraw.length; j++) { + Object o = kraw[j]; + if (o instanceof Integer) { + k[j] = ((Integer) o).intValue(); + } else { + int id = pool.id((String) o); + if (id < 0) { + throw new IllegalStateException(t.label + ": null key field " + j); + } + k[j] = id; + } + } + keys[i] = k; + enc.reset(); + t.emitter.emit(enc, row); + payloads[i] = enc.bytes(); + } + Integer[] order = new Integer[n]; + for (int i = 0; i < n; i++) { + order[i] = Integer.valueOf(i); + } + Arrays.sort(order, new Comparator() { + @Override + public int compare(Integer a, Integer b) { + int[] ka = keys[a.intValue()]; + int[] kb = keys[b.intValue()]; + for (int i = 0; i < ka.length; i++) { + if (ka[i] != kb[i]) { + return ka[i] < kb[i] ? -1 : 1; + } + } + // Total order even when keys collide, so nothing about the input's order survives. + return compareUnsigned(payloads[a.intValue()], payloads[b.intValue()]); + } + }); + t.encodedKeys = new int[n][]; + t.encodedRows = new byte[n][]; + t.rowIndexByKey = new HashMap(Math.max(16, n * 2)); + for (int i = 0; i < n; i++) { + int src = order[i].intValue(); + t.encodedKeys[i] = keys[src]; + t.encodedRows[i] = payloads[src]; + if (t.keyFieldCount == 2) { + long packed = (((long) keys[src][0]) << 32) | (keys[src][1] & 0xFFFFFFFFL); + Integer prev = t.rowIndexByKey.put(Long.valueOf(packed), Integer.valueOf(i)); + if (prev != null) { + throw new IllegalStateException(t.label + ": duplicate (auth, code) key at rows " + + prev + " and " + i + "; the reader relies on uniqueness here"); + } + } + } + } + } + + /** + * The final row index of a two-field-keyed row, for building indexes that point at it. + * + * @return the row index, or -1 + */ + int rowIndex(int sectionId, int authId, int codeId) { + PendingTable t = tableBySection.get(Integer.valueOf(sectionId)); + if (t == null || t.rowIndexByKey == null) { + throw new IllegalStateException("section " + sectionId + " is not an encoded 2-key table"); + } + Integer i = t.rowIndexByKey.get(Long.valueOf((((long) authId) << 32) | (codeId & 0xFFFFFFFFL))); + return i == null ? -1 : i.intValue(); + } + + int rowCount(int sectionId) { + PendingTable t = tableBySection.get(Integer.valueOf(sectionId)); + return t == null ? -1 : t.rows.size(); + } + + /** Serialises everything. */ + byte[] serialize() throws IOException { + Map payloads = new java.util.TreeMap(); + payloads.put(Integer.valueOf(PjdxFormat.S_STRINGS), pool.serialize()); + for (PendingTable t : tables) { + payloads.put(Integer.valueOf(t.sectionId), serializeTable(t)); + } + for (PendingIndex x : indexes) { + payloads.put(Integer.valueOf(x.sectionId), serializeIndex(x)); + } + for (Map.Entry e : payloads.entrySet()) { + sectionSizes.put(e.getKey(), Long.valueOf(e.getValue().length)); + } + + int sectionCount = payloads.size(); + // Sections are laid out in ascending id order immediately after the header, then the directory + // last. The directory is written last only because its offsets are not known until then; the + // header records where it is. + long offset = PjdxFormat.HEADER_BYTES; + Map offsets = new java.util.TreeMap(); + for (Map.Entry e : payloads.entrySet()) { + offsets.put(e.getKey(), Long.valueOf(offset)); + offset += e.getValue().length; + // 8-byte align, so a future reader may map sections without unaligned access. + long pad = (8 - (offset & 7)) & 7; + offset += pad; + } + long dirOffset = offset; + long fileLength = dirOffset + (long) sectionCount * PjdxFormat.DIRECTORY_ENTRY_BYTES; + + byte[] file = new byte[(int) fileLength]; + System.arraycopy(PjdxFormat.MAGIC, 0, file, 0, PjdxFormat.MAGIC.length); + putInt(file, 8, PjdxFormat.FORMAT_VERSION); + putInt(file, 12, sectionCount); + putLong(file, 16, fileLength); + putLong(file, 24, dirOffset); + // bytes 32..63 hold the SHA-256, filled in below. + + for (Map.Entry e : payloads.entrySet()) { + byte[] b = e.getValue(); + System.arraycopy(b, 0, file, (int) offsets.get(e.getKey()).longValue(), b.length); + } + int p = (int) dirOffset; + for (Map.Entry e : payloads.entrySet()) { + int id = e.getKey().intValue(); + int kind = id == PjdxFormat.S_STRINGS ? PjdxFormat.KIND_STRINGS + : tableBySection.containsKey(e.getKey()) ? PjdxFormat.KIND_TABLE + : PjdxFormat.KIND_INDEX; + putInt(file, p, id); + putInt(file, p + 4, kind); + putLong(file, p + 8, offsets.get(e.getKey()).longValue()); + putLong(file, p + 16, e.getValue().length); + p += PjdxFormat.DIRECTORY_ENTRY_BYTES; + } + + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-256"); + } catch (java.security.NoSuchAlgorithmException ex) { + throw new IOException("SHA-256 unavailable", ex); + } + md.update(file, PjdxFormat.HEADER_BYTES, file.length - PjdxFormat.HEADER_BYTES); + byte[] digest = md.digest(); + System.arraycopy(digest, 0, file, PjdxFormat.SHA256_OFFSET, PjdxFormat.SHA256_BYTES); + return file; + } + + /** Section id to serialised byte count, for the size report. */ + Map sectionSizes() { + return sectionSizes; + } + + private static byte[] serializeTable(PendingTable t) { + int n = t.encodedRows.length; + int keyBytes = n * t.keyFieldCount * 4; + int rowOffsetsRel = 16 + keyBytes; + int rowsRel = rowOffsetsRel + (n + 1) * 4; + int total = rowsRel; + for (byte[] r : t.encodedRows) { + total += r.length; + } + byte[] out = new byte[total]; + putInt(out, 0, n); + putInt(out, 4, t.keyFieldCount); + putInt(out, 8, rowOffsetsRel); + putInt(out, 12, rowsRel); + int p = 16; + for (int i = 0; i < n; i++) { + for (int j = 0; j < t.keyFieldCount; j++) { + putInt(out, p, t.encodedKeys[i][j]); + p += 4; + } + } + int off = 0; + for (int i = 0; i < n; i++) { + putInt(out, rowOffsetsRel + i * 4, off); + off += t.encodedRows[i].length; + } + putInt(out, rowOffsetsRel + n * 4, off); + p = rowsRel; + for (int i = 0; i < n; i++) { + System.arraycopy(t.encodedRows[i], 0, out, p, t.encodedRows[i].length); + p += t.encodedRows[i].length; + } + return out; + } + + private static byte[] serializeIndex(PendingIndex x) { + Collections.sort(x.entries, new Comparator() { + @Override + public int compare(int[] a, int[] b) { + for (int i = 0; i < a.length; i++) { + if (a[i] != b[i]) { + return a[i] < b[i] ? -1 : 1; + } + } + return 0; + } + }); + int n = x.entries.size(); + byte[] out = new byte[8 + n * x.fieldCount * 4]; + putInt(out, 0, n); + putInt(out, 4, x.fieldCount); + int p = 8; + for (int[] e : x.entries) { + for (int f : e) { + putInt(out, p, f); + p += 4; + } + } + return out; + } + + private static void writeInt(ByteArrayOutputStream out, int v) { + out.write((v >>> 24) & 0xFF); + out.write((v >>> 16) & 0xFF); + out.write((v >>> 8) & 0xFF); + out.write(v & 0xFF); + } + + static void putInt(byte[] b, int p, int v) { + b[p] = (byte) (v >>> 24); + b[p + 1] = (byte) (v >>> 16); + b[p + 2] = (byte) (v >>> 8); + b[p + 3] = (byte) v; + } + + static void putLong(byte[] b, int p, long v) { + putInt(b, p, (int) (v >>> 32)); + putInt(b, p + 4, (int) v); + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/gen/QuoteDump.java b/db/src/main/java/org/locationtech/proj4j/db/gen/QuoteDump.java new file mode 100644 index 0000000..03c0522 --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/gen/QuoteDump.java @@ -0,0 +1,322 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db.gen; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Parses a {@code sqlite3 .mode quote} dump. Build-time only; not shipped in the jar. + * + *

Why this format

+ * {@code .mode quote} is the only sqlite3 output mode that is lossless for the data proj4j + * needs, and that matters more than convenience: + *
    + *
  • Text is single-quoted with internal quotes doubled, so a value containing a comma, a tab or a + * newline survives. One of the 4,314 {@code extent} descriptions genuinely contains a newline; + * a tab- or comma-separated dump would silently lose the rest of that row.
  • + *
  • {@code NULL} is a bare keyword, distinct from the empty string. Upstream leans on that + * distinction hard — a null {@code accuracy} means "the authority published none", and an + * {@code open_license} of null means "not established", not "no".
  • + *
  • Reals are printed by sqlite's own shortest-round-trip formatter, so + * {@code Double.parseDouble} reproduces the stored {@code double} bit for bit. Verified against + * the source for every double the transcoder writes.
  • + *
+ * The alternative — {@code .mode json} — would need a JSON parser, and a JSON parser is exactly the + * kind of thing that becomes a runtime dependency. + * + *

Column mapping is by name

+ * The header row is parsed, not assumed. The generator asks for columns by name and fails loudly if + * one is missing, so an upstream schema change is a build failure rather than a silent one-column + * shift that would put a prime meridian's longitude into its unit code. + */ +final class QuoteDump { + + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** One dumped table: its column names and its rows, values typed as below. */ + static final class Table { + final String name; + final String[] columns; + final List rows = new ArrayList(); + private final Map columnIndex = new LinkedHashMap(); + + Table(String name, String[] columns) { + this.name = name; + this.columns = columns; + for (int i = 0; i < columns.length; i++) { + columnIndex.put(columns[i], Integer.valueOf(i)); + } + } + + int column(String columnName) { + Integer i = columnIndex.get(columnName); + if (i == null) { + throw new IllegalStateException("table " + name + " has no column '" + columnName + + "'; it has " + columnIndex.keySet() + + ". The upstream schema has changed and the transcoder must be updated" + + " deliberately rather than guessing."); + } + return i.intValue(); + } + + /** + * A value as canonical text. Integers become their decimal spelling, which is what makes an + * {@code INTEGER_OR_TEXT} code comparable with the string a caller typed: 1,803 geodetic CRS + * codes are integers, 345 are text, and both must answer to {@code crs("EPSG", "4326")}. + */ + String text(Object[] row, String columnName) { + Object v = row[column(columnName)]; + if (v == null) { + return null; + } + if (v instanceof Long) { + return v.toString(); + } + if (v instanceof Double) { + // No code or name column is a real in the transcoded subset; if that ever changes, + // fail rather than invent a spelling. + throw new IllegalStateException("table " + name + " column " + columnName + + " holds a real (" + v + ") where text was expected"); + } + return (String) v; + } + + /** @return the value, or {@link Double#NaN} for NULL. */ + double real(Object[] row, String columnName) { + Object v = row[column(columnName)]; + if (v == null) { + return Double.NaN; + } + if (v instanceof Long) { + return ((Long) v).doubleValue(); + } + if (v instanceof Double) { + return ((Double) v).doubleValue(); + } + return Double.parseDouble((String) v); + } + + int integer(Object[] row, String columnName) { + Object v = row[column(columnName)]; + if (v == null) { + throw new IllegalStateException("table " + name + " column " + columnName + " is NULL" + + " where an integer is required"); + } + if (v instanceof Long) { + return ((Long) v).intValue(); + } + return Integer.parseInt(v.toString()); + } + + boolean bool(Object[] row, String columnName) { + Object v = row[column(columnName)]; + return v != null && !"0".equals(v.toString()); + } + + /** @return null for SQL NULL, otherwise the boolean. Upstream really uses all three states. */ + Boolean tri(Object[] row, String columnName) { + Object v = row[column(columnName)]; + return v == null ? null : Boolean.valueOf(!"0".equals(v.toString())); + } + } + + private final Map tables = new LinkedHashMap(); + + static QuoteDump read(Path path) throws IOException { + QuoteDump d = new QuoteDump(); + Reader r = new InputStreamReader(Files.newInputStream(path), UTF8); + try { + d.parse(new BufferedReader(r, 1 << 16)); + } finally { + r.close(); + } + return d; + } + + Table table(String name) { + Table t = tables.get(name); + if (t == null) { + throw new IllegalStateException("the dump has no table '" + name + "'; it has " + + tables.keySet()); + } + return t; + } + + Map tables() { + return tables; + } + + private void parse(BufferedReader in) throws IOException { + Table current = null; + boolean expectHeader = false; + String line; + while ((line = in.readLine()) != null) { + if (line.startsWith("#TABLE ")) { + current = null; + expectHeader = true; + pendingName = line.substring(7).trim(); + continue; + } + if (line.equals("#END")) { + break; + } + if (line.isEmpty()) { + continue; + } + // A quoted value may contain a newline, so a logical row can span physical lines. Values + // are accumulated until the quote state closes. + StringBuilder logical = new StringBuilder(line); + while (!quotesBalanced(logical)) { + String more = in.readLine(); + if (more == null) { + throw new IOException("unterminated quoted value at end of dump"); + } + logical.append('\n').append(more); + } + Object[] values = split(logical.toString()); + if (expectHeader) { + String[] cols = new String[values.length]; + for (int i = 0; i < values.length; i++) { + cols[i] = String.valueOf(values[i]); + } + current = new Table(pendingName, cols); + tables.put(pendingName, current); + expectHeader = false; + continue; + } + if (current == null) { + throw new IOException("data row before any #TABLE marker: " + line); + } + if (values.length != current.columns.length) { + throw new IOException("table " + current.name + ": expected " + + current.columns.length + " values, got " + values.length); + } + current.rows.add(values); + } + } + + private String pendingName; + + /** True iff every {@code '} in {@code s} is matched, treating {@code ''} as an escaped quote. */ + private static boolean quotesBalanced(CharSequence s) { + boolean inQuote = false; + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '\'') { + if (inQuote && i + 1 < s.length() && s.charAt(i + 1) == '\'') { + i++; + } else { + inQuote = !inQuote; + } + } + } + return !inQuote; + } + + /** + * Splits one logical row. Values are {@code String} for quoted text, {@code Long} for integers, + * {@code Double} for reals, {@code null} for {@code NULL}, and a hex {@code String} for a blob + * (which the transcoded subset never contains, but is parsed rather than mis-parsed). + */ + private static Object[] split(String s) { + List out = new ArrayList(); + int i = 0; + int n = s.length(); + while (i <= n) { + if (i == n) { + // Trailing empty field only if the row ended with a comma. + if (n > 0 && s.charAt(n - 1) == ',') { + out.add(null); + } + break; + } + char c = s.charAt(i); + if (c == '\'') { + StringBuilder sb = new StringBuilder(); + i++; + while (true) { + if (i >= n) { + throw new IllegalStateException("unterminated string in row: " + s); + } + char d = s.charAt(i); + if (d == '\'') { + if (i + 1 < n && s.charAt(i + 1) == '\'') { + sb.append('\''); + i += 2; + continue; + } + i++; + break; + } + sb.append(d); + i++; + } + out.add(sb.toString()); + } else { + int start = i; + while (i < n && s.charAt(i) != ',') { + i++; + } + String token = s.substring(start, i).trim(); + out.add(scalar(token)); + } + if (i < n && s.charAt(i) == ',') { + i++; + if (i == n) { + out.add(null); + break; + } + } else if (i < n) { + throw new IllegalStateException("expected ',' at offset " + i + " in row: " + s); + } + } + return out.toArray(); + } + + private static Object scalar(String token) { + if (token.isEmpty() || "NULL".equals(token)) { + return null; + } + if (token.length() > 2 && (token.charAt(0) == 'X' || token.charAt(0) == 'x') + && token.charAt(1) == '\'') { + return token; + } + boolean real = false; + for (int i = 0; i < token.length(); i++) { + char c = token.charAt(i); + if (c == '.' || c == 'e' || c == 'E' || c == 'n' || c == 'N' || c == 'i' || c == 'I') { + real = true; + break; + } + } + try { + return real ? (Object) Double.valueOf(token) : (Object) Long.valueOf(token); + } catch (NumberFormatException e) { + // Not a number after all -- an unquoted token sqlite would only emit for a keyword we do + // not expect. Keep it as text rather than losing it. + return token; + } + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/gen/VerifyIndex.java b/db/src/main/java/org/locationtech/proj4j/db/gen/VerifyIndex.java new file mode 100644 index 0000000..a50fa93 --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/gen/VerifyIndex.java @@ -0,0 +1,958 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db.gen; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.locationtech.proj4j.db.PjdxDatabase; +import org.locationtech.proj4j.db.Proj4jDb; +import org.locationtech.proj4j.db.gen.QuoteDump.Table; +import org.locationtech.proj4j.resource.DirectoryResourceResolver; +import org.locationtech.proj4j.spi.DbAxis; +import org.locationtech.proj4j.spi.DbConversion; +import org.locationtech.proj4j.spi.DbCoordinateSystem; +import org.locationtech.proj4j.spi.DbCrs; +import org.locationtech.proj4j.spi.DbDatum; +import org.locationtech.proj4j.spi.DbEllipsoid; +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbGridAlternative; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbOperation; +import org.locationtech.proj4j.spi.DbOperationStep; +import org.locationtech.proj4j.spi.DbParam; +import org.locationtech.proj4j.spi.DbPrimeMeridian; +import org.locationtech.proj4j.spi.DbSupersession; +import org.locationtech.proj4j.spi.DbUnit; + +/** + * Exhaustive round-trip proof: reads the {@code sqlite3} dump and the generated {@code .pjdx}, and + * compares every row of every transcoded table field by field. Build-time only; run by + * {@code -Pregen-db} straight after {@link GenerateIndex}, and excluded from the published jar. + *

+ * This is what makes the transcode trustworthy rather than plausible. A transcoder can be wrong in two + * ways that no size measurement and no spot check will catch: a field read in the wrong order, and a + * double that survives as something almost right. Both are checked here — doubles are compared with + * {@link Double#compare}, so a value that round-tripped to a neighbouring representable number fails, + * and every reference is compared as a whole {@code (authority, code)} pair. + *

+ * Usage: {@code VerifyIndex } + */ +public final class VerifyIndex { + + private VerifyIndex() { + } + + private static final int MAX_REPORTED = 25; + private static final List failures = new ArrayList(); + private static long checks; + private static long failureCount; + + public static void main(String[] args) throws Exception { + if (args.length < 2) { + System.err.println("usage: VerifyIndex "); + System.exit(2); + } + Path dump = Paths.get(args[0]); + Path dataDir = Paths.get(args[1]); + + QuoteDump d = QuoteDump.read(dump); + PjdxDatabase db = Proj4jDb.open(new DirectoryResourceResolver(dataDir)); + if (db == null) { + throw new IllegalStateException("no index in " + dataDir); + } + try { + long t0 = System.currentTimeMillis(); + verifyMetadata(d, db); + verifyUnits(d, db); + verifyCelestialBodies(d, db); + verifyEllipsoids(d, db); + verifyPrimeMeridians(d, db); + verifyDatums(d, db); + verifyCoordinateSystems(d, db); + verifyCrs(d, db); + verifyConversions(d, db); + verifyOperations(d, db); + verifyConcatenatedSteps(d, db); + verifyExtents(d, db); + verifyUsages(d, db); + verifyGridAlternatives(d, db); + verifyAliases(d, db); + verifySupersessions(d, db); + verifyDeprecations(d, db); + verifyNameIndex(d, db); + verifyCrsByDatum(d, db); + verifyAuthorities(d, db); + long ms = System.currentTimeMillis() - t0; + + System.out.println(); + System.out.println("VerifyIndex: " + checks + " field comparisons in " + ms + " ms"); + if (failureCount == 0) { + System.out.println("VerifyIndex: OK -- every transcoded row matches the SQLite source"); + } else { + System.out.println("VerifyIndex: " + failureCount + " MISMATCHES"); + for (String f : failures) { + System.out.println(" " + f); + } + System.exit(1); + } + } finally { + db.close(); + } + } + + // ------------------------------------------------------------------ assertions + + private static void eq(String what, Object expected, Object actual) { + checks++; + if (expected == null ? actual != null : !expected.equals(actual)) { + fail(what + ": expected " + show(expected) + ", got " + show(actual)); + } + } + + /** Bit-exact, so a double that came back as a neighbouring representable value is a failure. */ + private static void eqDouble(String what, double expected, double actual) { + checks++; + if (Double.compare(expected, actual) != 0) { + fail(what + ": expected " + expected + " (bits " + + Long.toHexString(Double.doubleToRawLongBits(expected)) + "), got " + actual + + " (bits " + Long.toHexString(Double.doubleToRawLongBits(actual)) + ")"); + } + } + + private static void isTrue(String what, boolean condition) { + checks++; + if (!condition) { + fail(what); + } + } + + private static void fail(String message) { + failureCount++; + if (failures.size() < MAX_REPORTED) { + failures.add(message); + } + } + + private static String show(Object o) { + return o == null ? "null" : "'" + o + "'"; + } + + private static String ref(Table t, Object[] row) { + return t.name + " " + t.text(row, "auth_name") + ":" + t.text(row, "code"); + } + + private static void refEq(String what, String expectedAuth, String expectedCode, + DbObjectRef actual) { + if (expectedAuth == null || expectedCode == null) { + checks++; + if (actual != null) { + fail(what + ": expected no reference, got " + actual); + } + return; + } + checks++; + if (actual == null) { + fail(what + ": expected " + expectedAuth + ":" + expectedCode + ", got null"); + } else if (!expectedAuth.equals(actual.authName()) || !expectedCode.equals(actual.code())) { + fail(what + ": expected " + expectedAuth + ":" + expectedCode + ", got " + + actual.authorityCode()); + } + } + + // ------------------------------------------------------------------ per table + + private static void verifyMetadata(QuoteDump d, PjdxDatabase db) { + Table t = d.table("metadata"); + Map m = db.metadata(); + eq("metadata size", Integer.valueOf(t.rows.size()), Integer.valueOf(m.size())); + for (Object[] row : t.rows) { + eq("metadata " + t.text(row, "key"), t.text(row, "value"), m.get(t.text(row, "key"))); + } + } + + private static void verifyUnits(QuoteDump d, PjdxDatabase db) { + Table t = d.table("unit_of_measure"); + for (Object[] row : t.rows) { + String a = t.text(row, "auth_name"); + String c = t.text(row, "code"); + DbUnit u = db.unit(a, c); + if (u == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".name", t.text(row, "name"), u.name()); + eq(ref(t, row) + ".type", t.text(row, "type"), + u.type() == null ? null : u.type().dbValue()); + eqDouble(ref(t, row) + ".conv_factor", t.real(row, "conv_factor"), u.conversionFactor()); + eq(ref(t, row) + ".proj_short_name", t.text(row, "proj_short_name"), u.projShortName()); + eq(ref(t, row) + ".deprecated", Boolean.valueOf(t.bool(row, "deprecated")), + Boolean.valueOf(u.deprecated())); + } + } + + private static void verifyCelestialBodies(QuoteDump d, PjdxDatabase db) { + Table t = d.table("celestial_body"); + for (Object[] row : t.rows) { + org.locationtech.proj4j.spi.DbCelestialBody b = + db.celestialBody(t.text(row, "auth_name"), t.text(row, "code")); + if (b == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".name", t.text(row, "name"), b.name()); + eqDouble(ref(t, row) + ".semi_major_axis", t.real(row, "semi_major_axis"), + b.semiMajorAxis()); + } + } + + private static void verifyEllipsoids(QuoteDump d, PjdxDatabase db) { + Table t = d.table("ellipsoid"); + for (Object[] row : t.rows) { + DbEllipsoid e = db.ellipsoid(t.text(row, "auth_name"), t.text(row, "code")); + if (e == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".name", t.text(row, "name"), e.name()); + refEq(ref(t, row) + ".celestial_body", t.text(row, "celestial_body_auth_name"), + t.text(row, "celestial_body_code"), e.celestialBody()); + eqDouble(ref(t, row) + ".semi_major_axis", t.real(row, "semi_major_axis"), + e.semiMajorAxis()); + refEq(ref(t, row) + ".uom", t.text(row, "uom_auth_name"), t.text(row, "uom_code"), + e.unit()); + eqDouble(ref(t, row) + ".inv_flattening", t.real(row, "inv_flattening"), + e.inverseFlattening()); + eqDouble(ref(t, row) + ".semi_minor_axis", t.real(row, "semi_minor_axis"), + e.semiMinorAxis()); + eq(ref(t, row) + ".deprecated", Boolean.valueOf(t.bool(row, "deprecated")), + Boolean.valueOf(e.deprecated())); + // Upstream's CHECK: exactly one of the two shape parameters. If the transcode ever loses + // one, this catches it independently of the field comparisons above. + isTrue(ref(t, row) + ": exactly one of inv_flattening / semi_minor_axis", + Double.isNaN(e.inverseFlattening()) != Double.isNaN(e.semiMinorAxis())); + } + } + + private static void verifyPrimeMeridians(QuoteDump d, PjdxDatabase db) { + Table t = d.table("prime_meridian"); + for (Object[] row : t.rows) { + DbPrimeMeridian p = db.primeMeridian(t.text(row, "auth_name"), t.text(row, "code")); + if (p == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".name", t.text(row, "name"), p.name()); + eqDouble(ref(t, row) + ".longitude", t.real(row, "longitude"), p.longitude()); + refEq(ref(t, row) + ".uom", t.text(row, "uom_auth_name"), t.text(row, "uom_code"), + p.unit()); + eq(ref(t, row) + ".deprecated", Boolean.valueOf(t.bool(row, "deprecated")), + Boolean.valueOf(p.deprecated())); + } + } + + private static void verifyDatums(QuoteDump d, PjdxDatabase db) { + Table g = d.table("geodetic_datum"); + for (Object[] row : g.rows) { + DbDatum dm = db.datum(DbObjectType.GEODETIC_DATUM, g.text(row, "auth_name"), + g.text(row, "code")); + if (dm == null) { + fail(ref(g, row) + " missing"); + continue; + } + eq(ref(g, row) + ".name", g.text(row, "name"), dm.name()); + refEq(ref(g, row) + ".ellipsoid", g.text(row, "ellipsoid_auth_name"), + g.text(row, "ellipsoid_code"), dm.ellipsoid()); + refEq(ref(g, row) + ".prime_meridian", g.text(row, "prime_meridian_auth_name"), + g.text(row, "prime_meridian_code"), dm.primeMeridian()); + eq(ref(g, row) + ".publication_date", g.text(row, "publication_date"), + dm.publicationDate()); + eqDouble(ref(g, row) + ".frame_reference_epoch", g.real(row, "frame_reference_epoch"), + dm.frameReferenceEpoch()); + eqDouble(ref(g, row) + ".ensemble_accuracy", g.real(row, "ensemble_accuracy"), + dm.ensembleAccuracy()); + eq(ref(g, row) + ".deprecated", Boolean.valueOf(g.bool(row, "deprecated")), + Boolean.valueOf(dm.deprecated())); + } + Table v = d.table("vertical_datum"); + for (Object[] row : v.rows) { + DbDatum dm = db.datum(DbObjectType.VERTICAL_DATUM, v.text(row, "auth_name"), + v.text(row, "code")); + if (dm == null) { + fail(ref(v, row) + " missing"); + continue; + } + eq(ref(v, row) + ".name", v.text(row, "name"), dm.name()); + eq(ref(v, row) + ".ellipsoid is null", Boolean.TRUE, + Boolean.valueOf(dm.ellipsoid() == null)); + eqDouble(ref(v, row) + ".ensemble_accuracy", v.real(row, "ensemble_accuracy"), + dm.ensembleAccuracy()); + eq(ref(v, row) + ".deprecated", Boolean.valueOf(v.bool(row, "deprecated")), + Boolean.valueOf(dm.deprecated())); + } + verifyEnsembleMembers(d.table("geodetic_datum_ensemble_member"), db, + DbObjectType.GEODETIC_DATUM); + verifyEnsembleMembers(d.table("vertical_datum_ensemble_member"), db, + DbObjectType.VERTICAL_DATUM); + } + + private static void verifyEnsembleMembers(Table t, PjdxDatabase db, DbObjectType type) { + for (Object[] row : t.rows) { + DbDatum dm = db.datum(type, t.text(row, "ensemble_auth_name"), + t.text(row, "ensemble_code")); + if (dm == null) { + fail(t.name + " ensemble " + t.text(row, "ensemble_code") + " missing"); + continue; + } + int sequence = t.integer(row, "sequence"); + String what = t.name + " " + t.text(row, "ensemble_code") + " member " + sequence; + if (sequence > dm.ensembleMembers().size()) { + fail(what + ": only " + dm.ensembleMembers().size() + " members present"); + continue; + } + // Members are stored in sequence order, so position sequence-1 must be this member. + refEq(what, t.text(row, "member_auth_name"), t.text(row, "member_code"), + dm.ensembleMembers().get(sequence - 1)); + } + } + + private static void verifyCoordinateSystems(QuoteDump d, PjdxDatabase db) { + Table t = d.table("coordinate_system"); + for (Object[] row : t.rows) { + DbCoordinateSystem cs = db.coordinateSystem(t.text(row, "auth_name"), t.text(row, "code")); + if (cs == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".type", t.text(row, "type"), cs.type()); + eq(ref(t, row) + ".dimension", Integer.valueOf(t.integer(row, "dimension")), + Integer.valueOf(cs.dimension())); + } + // Axes are compared in the generator's documented order -- (coordinate_system_order, axis + // authority, axis code) -- not by position within the order. PROJ:ENh has two axes at order 2, + // so "the axis at order 2" is not a unique row upstream and a positional lookup by order would + // be asserting something the source does not say. + Table ax = d.table("axis"); + java.util.Map> axesByCs = + new java.util.LinkedHashMap>(); + for (Object[] row : ax.rows) { + String key = ax.text(row, "coordinate_system_auth_name") + ' ' + + ax.text(row, "coordinate_system_code"); + List list = axesByCs.get(key); + if (list == null) { + list = new ArrayList(); + axesByCs.put(key, list); + } + list.add(row); + } + final Table axFinal = ax; + for (Map.Entry> entry : axesByCs.entrySet()) { + String[] parts = entry.getKey().split(" ", 2); + DbCoordinateSystem cs = db.coordinateSystem(parts[0], parts[1]); + List expected = entry.getValue(); + java.util.Collections.sort(expected, new java.util.Comparator() { + @Override + public int compare(Object[] p, Object[] q) { + int c = Integer.compare(axFinal.integer(p, "coordinate_system_order"), + axFinal.integer(q, "coordinate_system_order")); + if (c != 0) { + return c; + } + c = axFinal.text(p, "auth_name").compareTo(axFinal.text(q, "auth_name")); + return c != 0 ? c : axFinal.text(p, "code").compareTo(axFinal.text(q, "code")); + } + }); + if (cs == null) { + fail("coordinate_system " + entry.getKey() + " missing"); + continue; + } + eq("axes of " + entry.getKey() + " count", Integer.valueOf(expected.size()), + Integer.valueOf(cs.axes().size())); + for (int i = 0; i < expected.size() && i < cs.axes().size(); i++) { + Object[] row = expected.get(i); + DbAxis a = cs.axes().get(i); + String what = "axis " + ax.text(row, "auth_name") + ":" + ax.text(row, "code") + + " of " + entry.getKey(); + eq(what + ".order", + Integer.valueOf(ax.integer(row, "coordinate_system_order")), + Integer.valueOf(a.order())); + eq(what + ".name", ax.text(row, "name"), a.name()); + eq(what + ".abbrev", ax.text(row, "abbrev"), a.abbreviation()); + eq(what + ".orientation", ax.text(row, "orientation"), a.orientation()); + refEq(what + ".uom", ax.text(row, "uom_auth_name"), ax.text(row, "uom_code"), + a.unit()); + } + } + } + + private static void verifyCrs(QuoteDump d, PjdxDatabase db) { + Table g = d.table("geodetic_crs"); + for (Object[] row : g.rows) { + DbCrs crs = db.crs(g.text(row, "auth_name"), g.text(row, "code")); + if (crs == null) { + fail(ref(g, row) + " missing"); + continue; + } + eq(ref(g, row) + ".name", g.text(row, "name"), crs.name()); + eq(ref(g, row) + ".type", g.text(row, "type"), crs.type().dbValue()); + refEq(ref(g, row) + ".cs", g.text(row, "coordinate_system_auth_name"), + g.text(row, "coordinate_system_code"), crs.coordinateSystem()); + refEq(ref(g, row) + ".datum", g.text(row, "datum_auth_name"), g.text(row, "datum_code"), + crs.datum()); + eq(ref(g, row) + ".text_definition", g.text(row, "text_definition"), + crs.textDefinition()); + eq(ref(g, row) + ".deprecated", Boolean.valueOf(g.bool(row, "deprecated")), + Boolean.valueOf(crs.deprecated())); + } + Table p = d.table("projected_crs"); + for (Object[] row : p.rows) { + DbCrs crs = db.crs(p.text(row, "auth_name"), p.text(row, "code")); + if (crs == null) { + fail(ref(p, row) + " missing"); + continue; + } + eq(ref(p, row) + ".name", p.text(row, "name"), crs.name()); + eq(ref(p, row) + ".type", "projected", crs.type().dbValue()); + refEq(ref(p, row) + ".cs", p.text(row, "coordinate_system_auth_name"), + p.text(row, "coordinate_system_code"), crs.coordinateSystem()); + refEq(ref(p, row) + ".base", p.text(row, "geodetic_crs_auth_name"), + p.text(row, "geodetic_crs_code"), crs.baseCrs()); + refEq(ref(p, row) + ".conversion", p.text(row, "conversion_auth_name"), + p.text(row, "conversion_code"), crs.conversion()); + eq(ref(p, row) + ".text_definition", p.text(row, "text_definition"), + crs.textDefinition()); + eq(ref(p, row) + ".deprecated", Boolean.valueOf(p.bool(row, "deprecated")), + Boolean.valueOf(crs.deprecated())); + } + Table v = d.table("vertical_crs"); + for (Object[] row : v.rows) { + DbCrs crs = db.crs(v.text(row, "auth_name"), v.text(row, "code")); + if (crs == null) { + fail(ref(v, row) + " missing"); + continue; + } + eq(ref(v, row) + ".name", v.text(row, "name"), crs.name()); + eq(ref(v, row) + ".type", "vertical", crs.type().dbValue()); + refEq(ref(v, row) + ".datum", v.text(row, "datum_auth_name"), v.text(row, "datum_code"), + crs.datum()); + eq(ref(v, row) + ".datum type", DbObjectType.VERTICAL_DATUM, + crs.datum() == null ? null : crs.datum().type()); + } + Table c = d.table("compound_crs"); + for (Object[] row : c.rows) { + DbCrs crs = db.crs(c.text(row, "auth_name"), c.text(row, "code")); + if (crs == null) { + fail(ref(c, row) + " missing"); + continue; + } + eq(ref(c, row) + ".name", c.text(row, "name"), crs.name()); + eq(ref(c, row) + ".type", "compound", crs.type().dbValue()); + refEq(ref(c, row) + ".horiz", c.text(row, "horiz_crs_auth_name"), + c.text(row, "horiz_crs_code"), crs.horizontalCrs()); + refEq(ref(c, row) + ".vertical", c.text(row, "vertical_crs_auth_name"), + c.text(row, "vertical_crs_code"), crs.verticalCrs()); + } + Table e = d.table("engineering_crs"); + for (Object[] row : e.rows) { + DbCrs crs = db.crs(e.text(row, "auth_name"), e.text(row, "code")); + if (crs == null) { + fail(ref(e, row) + " missing"); + continue; + } + eq(ref(e, row) + ".name", e.text(row, "name"), crs.name()); + eq(ref(e, row) + ".type", "engineering", crs.type().dbValue()); + } + } + + private static void verifyConversions(QuoteDump d, PjdxDatabase db) { + Table t = d.table("conversion_table"); + Map paramNames = new java.util.HashMap(); + Table cp = d.table("conversion_param"); + for (Object[] row : cp.rows) { + paramNames.put(cp.text(row, "auth_name") + ' ' + cp.text(row, "code"), + cp.text(row, "name")); + } + Map methodNames = new java.util.HashMap(); + Table cm = d.table("conversion_method"); + for (Object[] row : cm.rows) { + methodNames.put(cm.text(row, "auth_name") + ' ' + cm.text(row, "code"), + cm.text(row, "name")); + } + for (Object[] row : t.rows) { + DbConversion cv = db.conversion(t.text(row, "auth_name"), t.text(row, "code")); + if (cv == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".name", t.text(row, "name"), cv.name()); + String ma = t.text(row, "method_auth_name"); + String mc = t.text(row, "method_code"); + eq(ref(t, row) + ".method_auth_name", ma, cv.methodAuthName()); + eq(ref(t, row) + ".method_code", mc, cv.methodCode()); + eq(ref(t, row) + ".method_name", + ma == null || mc == null ? null : methodNames.get(ma + ' ' + mc), + cv.methodName()); + int expected = 0; + for (int i = 1; i <= 7; i++) { + String pa = t.text(row, "param" + i + "_auth_name"); + String pc = t.text(row, "param" + i + "_code"); + if (pa == null || pc == null) { + continue; + } + if (expected >= cv.parameters().size()) { + fail(ref(t, row) + ": param" + i + " missing from the index"); + expected++; + continue; + } + DbParam p = cv.parameters().get(expected); + String what = ref(t, row) + ".param" + i; + eq(what + ".auth", pa, p.authName()); + eq(what + ".code", pc, p.code()); + eq(what + ".name", paramNames.get(pa + ' ' + pc), p.name()); + eqDouble(what + ".value", t.real(row, "param" + i + "_value"), p.value()); + refEq(what + ".uom", t.text(row, "param" + i + "_uom_auth_name"), + t.text(row, "param" + i + "_uom_code"), p.unit()); + expected++; + } + eq(ref(t, row) + " param count", Integer.valueOf(expected), + Integer.valueOf(cv.parameters().size())); + } + } + + private static void verifyOperations(QuoteDump d, PjdxDatabase db) { + verifyTransformation(d.table("grid_transformation"), db, DbObjectType.GRID_TRANSFORMATION, 2, + new String[]{"grid_name", "grid2_name"}); + verifyTransformation(d.table("other_transformation"), db, DbObjectType.OTHER_TRANSFORMATION, 9, + new String[]{"grid_name"}); + verifyHelmert(d, db); + verifyConcatenated(d, db); + } + + private static void verifyTransformation(Table t, PjdxDatabase db, DbObjectType kind, + int maxParams, String[] gridColumns) { + for (Object[] row : t.rows) { + DbOperation op = db.operation(t.text(row, "auth_name"), t.text(row, "code")); + if (op == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".kind", kind, op.kind()); + eq(ref(t, row) + ".name", t.text(row, "name"), op.name()); + eq(ref(t, row) + ".method_auth_name", t.text(row, "method_auth_name"), + op.methodAuthName()); + eq(ref(t, row) + ".method_code", t.text(row, "method_code"), op.methodCode()); + eq(ref(t, row) + ".method_name", t.text(row, "method_name"), op.methodName()); + refEq(ref(t, row) + ".source_crs", t.text(row, "source_crs_auth_name"), + t.text(row, "source_crs_code"), op.sourceCrs()); + refEq(ref(t, row) + ".target_crs", t.text(row, "target_crs_auth_name"), + t.text(row, "target_crs_code"), op.targetCrs()); + eqDouble(ref(t, row) + ".accuracy", t.real(row, "accuracy"), op.accuracy()); + eq(ref(t, row) + ".operation_version", t.text(row, "operation_version"), + op.operationVersion()); + eq(ref(t, row) + ".deprecated", Boolean.valueOf(t.bool(row, "deprecated")), + Boolean.valueOf(op.deprecated())); + refEq(ref(t, row) + ".interpolation_crs", t.text(row, "interpolation_crs_auth_name"), + t.text(row, "interpolation_crs_code"), op.interpolationCrs()); + + List expectedGrids = new ArrayList(); + for (String col : gridColumns) { + String g = t.text(row, col); + if (g != null && !g.isEmpty()) { + expectedGrids.add(g); + } + } + eq(ref(t, row) + ".grids", expectedGrids, op.gridNames()); + + int n = 0; + for (int i = 1; i <= maxParams; i++) { + String pa = t.text(row, "param" + i + "_auth_name"); + String pc = t.text(row, "param" + i + "_code"); + if (pa == null || pc == null) { + continue; + } + if (n >= op.parameters().size()) { + fail(ref(t, row) + ": param" + i + " missing"); + n++; + continue; + } + DbParam p = op.parameters().get(n); + String what = ref(t, row) + ".param" + i; + eq(what + ".auth", pa, p.authName()); + eq(what + ".code", pc, p.code()); + eq(what + ".name", t.text(row, "param" + i + "_name"), p.name()); + eqDouble(what + ".value", t.real(row, "param" + i + "_value"), p.value()); + refEq(what + ".uom", t.text(row, "param" + i + "_uom_auth_name"), + t.text(row, "param" + i + "_uom_code"), p.unit()); + n++; + } + eq(ref(t, row) + " param count", Integer.valueOf(n), + Integer.valueOf(op.parameters().size())); + + verifyFoundBetween(db, t, row, op); + } + } + + /** + * Helmert rows are checked two ways: the head fields directly, and then the parameter list against + * the source columns by parameter code rather than by position. Checking by code is the + * point — a positional check would pass even if the branch structure emitted the wrong parameter. + */ + private static void verifyHelmert(QuoteDump d, PjdxDatabase db) { + Table t = d.table("helmert_transformation_table"); + Map methodNames = new java.util.HashMap(); + Table m = d.table("coordinate_operation_method"); + for (Object[] row : m.rows) { + methodNames.put(m.text(row, "auth_name") + ' ' + m.text(row, "code"), + m.text(row, "name")); + } + String[][] byCode = { + {"8605", "tx", "translation"}, {"8606", "ty", "translation"}, + {"8607", "tz", "translation"}, + {"8608", "rx", "rotation"}, {"8609", "ry", "rotation"}, {"8610", "rz", "rotation"}, + {"8611", "scale_difference", "scale_difference"}, + {"1040", "rate_tx", "rate_translation"}, {"1041", "rate_ty", "rate_translation"}, + {"1042", "rate_tz", "rate_translation"}, + {"1043", "rate_rx", "rate_rotation"}, {"1044", "rate_ry", "rate_rotation"}, + {"1045", "rate_rz", "rate_rotation"}, + {"1046", "rate_scale_difference", "rate_scale_difference"}, + {"1047", "epoch", "epoch"}, {"1049", "epoch", "epoch"}, + {"8617", "px", "pivot"}, {"8618", "py", "pivot"}, {"8667", "pz", "pivot"}}; + Map spec = new java.util.HashMap(); + for (String[] s : byCode) { + spec.put(s[0], s); + } + for (Object[] row : t.rows) { + DbOperation op = db.operation(t.text(row, "auth_name"), t.text(row, "code")); + if (op == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".kind", DbObjectType.HELMERT_TRANSFORMATION, op.kind()); + eq(ref(t, row) + ".name", t.text(row, "name"), op.name()); + String ma = t.text(row, "method_auth_name"); + String mc = t.text(row, "method_code"); + eq(ref(t, row) + ".method_name", + ma == null || mc == null ? null : methodNames.get(ma + ' ' + mc), + op.methodName()); + refEq(ref(t, row) + ".source_crs", t.text(row, "source_crs_auth_name"), + t.text(row, "source_crs_code"), op.sourceCrs()); + refEq(ref(t, row) + ".target_crs", t.text(row, "target_crs_auth_name"), + t.text(row, "target_crs_code"), op.targetCrs()); + eqDouble(ref(t, row) + ".accuracy", t.real(row, "accuracy"), op.accuracy()); + eq(ref(t, row) + ".deprecated", Boolean.valueOf(t.bool(row, "deprecated")), + Boolean.valueOf(op.deprecated())); + isTrue(ref(t, row) + " must have at least tx/ty/tz", op.parameters().size() >= 3); + Set seen = new HashSet(); + for (DbParam p : op.parameters()) { + eq(ref(t, row) + " param authority", "EPSG", p.authName()); + String[] s = spec.get(p.code()); + if (s == null) { + fail(ref(t, row) + ": unexpected Helmert parameter code " + p.code()); + continue; + } + isTrue(ref(t, row) + ": duplicate parameter " + p.code(), seen.add(p.code())); + eqDouble(ref(t, row) + " param " + p.code() + " (" + s[1] + ")", + t.real(row, s[1]), p.value()); + refEq(ref(t, row) + " param " + p.code() + " uom", + t.text(row, s[2] + "_uom_auth_name"), t.text(row, s[2] + "_uom_code"), + p.unit()); + // A parameter PROJ would emit always has a value. A NaN here means the branch + // structure emitted a slot the source does not populate. + isTrue(ref(t, row) + " param " + p.code() + " has a value", + !Double.isNaN(p.value())); + } + verifyFoundBetween(db, t, row, op); + } + } + + private static void verifyConcatenated(QuoteDump d, PjdxDatabase db) { + Table t = d.table("concatenated_operation"); + for (Object[] row : t.rows) { + DbOperation op = db.operation(t.text(row, "auth_name"), t.text(row, "code")); + if (op == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".kind", DbObjectType.CONCATENATED_OPERATION, op.kind()); + eq(ref(t, row) + ".name", t.text(row, "name"), op.name()); + refEq(ref(t, row) + ".source_crs", t.text(row, "source_crs_auth_name"), + t.text(row, "source_crs_code"), op.sourceCrs()); + refEq(ref(t, row) + ".target_crs", t.text(row, "target_crs_auth_name"), + t.text(row, "target_crs_code"), op.targetCrs()); + eqDouble(ref(t, row) + ".accuracy", t.real(row, "accuracy"), op.accuracy()); + eq(ref(t, row) + ".operation_version", t.text(row, "operation_version"), + op.operationVersion()); + eq(ref(t, row) + ".method is null", Boolean.TRUE, + Boolean.valueOf(op.methodName() == null)); + isTrue(ref(t, row) + " must have steps", !op.steps().isEmpty()); + verifyFoundBetween(db, t, row, op); + } + } + + private static void verifyConcatenatedSteps(QuoteDump d, PjdxDatabase db) { + Table s = d.table("concatenated_operation_step"); + for (Object[] row : s.rows) { + String oa = s.text(row, "operation_auth_name"); + String oc = s.text(row, "operation_code"); + int number = s.integer(row, "step_number"); + DbOperation op = db.operation(oa, oc); + String what = "step " + number + " of " + oa + ":" + oc; + if (op == null) { + fail(what + ": operation missing"); + continue; + } + // Located by step_number, not by position. Two upstream operations -- + // NKG:ITRF2000_TO_NKG_ETRF00 and NKG:ITRF2014_TO_NKG_ETRF14 -- number their two steps 2 + // and 3, with no step 1. So step_number is NOT a 1-based index into the list, and a + // consumer that treats it as one reads the wrong step for those two. + DbOperationStep st = null; + for (DbOperationStep candidate : op.steps()) { + if (candidate.stepNumber() == number) { + st = candidate; + break; + } + } + if (st == null) { + fail(what + " missing"); + continue; + } + eq(what + ".step_number", Integer.valueOf(number), Integer.valueOf(st.stepNumber())); + refEq(what + ".step", s.text(row, "step_auth_name"), s.text(row, "step_code"), st.step()); + String dir = s.text(row, "step_direction"); + eq(what + ".direction", + dir == null ? DbOperationStep.Direction.UNSPECIFIED + : DbOperationStep.Direction.fromDbValue(dir), + st.direction()); + // The step's table tag was resolved at build time; check it points at something real. + isTrue(what + ": referenced object exists", + st.step().type() == DbObjectType.CONVERSION + ? db.conversion(st.step().authName(), st.step().code()) != null + : db.operation(st.step().authName(), st.step().code()) != null); + } + } + + /** Every operation must be findable through the source-to-target index. */ + private static void verifyFoundBetween(PjdxDatabase db, Table t, Object[] row, DbOperation op) { + String sa = t.text(row, "source_crs_auth_name"); + String sc = t.text(row, "source_crs_code"); + String ta = t.text(row, "target_crs_auth_name"); + String tc = t.text(row, "target_crs_code"); + List found = db.operationsBetween(sa, sc, ta, tc); + boolean present = false; + for (DbOperation o : found) { + if (o.ref().equals(op.ref())) { + present = true; + break; + } + } + isTrue(ref(t, row) + " not returned by operationsBetween(" + sa + ":" + sc + ", " + ta + ":" + + tc + ")", present); + List fromSource = db.operationsWithSourceCrs(sa, sc); + isTrue(ref(t, row) + " not in operationsWithSourceCrs", fromSource.contains(op.ref())); + List toTarget = db.operationsWithTargetCrs(ta, tc); + isTrue(ref(t, row) + " not in operationsWithTargetCrs", toTarget.contains(op.ref())); + } + + private static void verifyExtents(QuoteDump d, PjdxDatabase db) { + Table t = d.table("extent"); + for (Object[] row : t.rows) { + DbExtent e = db.extent(t.text(row, "auth_name"), t.text(row, "code")); + if (e == null) { + fail(ref(t, row) + " missing"); + continue; + } + eq(ref(t, row) + ".name", t.text(row, "name"), e.name()); + eq(ref(t, row) + ".description", t.text(row, "description"), e.description()); + eqDouble(ref(t, row) + ".west_lon", t.real(row, "west_lon"), e.westLongitude()); + eqDouble(ref(t, row) + ".south_lat", t.real(row, "south_lat"), e.southLatitude()); + eqDouble(ref(t, row) + ".east_lon", t.real(row, "east_lon"), e.eastLongitude()); + eqDouble(ref(t, row) + ".north_lat", t.real(row, "north_lat"), e.northLatitude()); + eq(ref(t, row) + ".deprecated", Boolean.valueOf(t.bool(row, "deprecated")), + Boolean.valueOf(e.deprecated())); + } + } + + private static void verifyUsages(QuoteDump d, PjdxDatabase db) { + Table t = d.table("usage"); + for (Object[] row : t.rows) { + DbObjectType type = DbObjectType.fromDbName(t.text(row, "object_table_name")); + if (type == null) { + fail("usage references unknown table " + t.text(row, "object_table_name")); + continue; + } + DbObjectRef object = new DbObjectRef(type, t.text(row, "object_auth_name"), + t.text(row, "object_code")); + List extents = db.extentsFor(object); + String wantAuth = t.text(row, "extent_auth_name"); + String wantCode = t.text(row, "extent_code"); + boolean found = false; + for (DbExtent e : extents) { + if (wantAuth.equals(e.authName()) && wantCode.equals(e.code())) { + found = true; + break; + } + } + isTrue("extentsFor(" + object + ") is missing " + wantAuth + ":" + wantCode, found); + } + } + + private static void verifyGridAlternatives(QuoteDump d, PjdxDatabase db) { + Table t = d.table("grid_alternatives"); + for (Object[] row : t.rows) { + String original = t.text(row, "original_grid_name"); + DbGridAlternative g = db.gridAlternative(original); + if (g == null) { + fail("grid_alternatives " + original + " missing"); + continue; + } + eq(original + ".proj_grid_name", t.text(row, "proj_grid_name"), g.projGridName()); + eq(original + ".old_proj_grid_name", t.text(row, "old_proj_grid_name"), + g.oldProjGridName()); + eq(original + ".proj_grid_format", t.text(row, "proj_grid_format"), g.projGridFormat()); + eq(original + ".proj_method", t.text(row, "proj_method"), g.projMethod()); + eq(original + ".inverse_direction", Boolean.valueOf(t.bool(row, "inverse_direction")), + Boolean.valueOf(g.inverseDirection())); + eq(original + ".url", t.text(row, "url"), g.url()); + eq(original + ".direct_download", t.tri(row, "direct_download"), g.directDownload()); + eq(original + ".open_license", t.tri(row, "open_license"), g.openLicense()); + eq(original + ".directory", t.text(row, "directory"), g.directory()); + } + eq("gridAlternatives() size", Integer.valueOf(t.rows.size()), + Integer.valueOf(db.gridAlternatives().size())); + } + + private static void verifyAliases(QuoteDump d, PjdxDatabase db) { + Table t = d.table("alias_name"); + for (Object[] row : t.rows) { + DbObjectType type = DbObjectType.fromDbName(t.text(row, "table_name")); + if (type == null) { + fail("alias_name references unknown table " + t.text(row, "table_name")); + continue; + } + DbObjectRef object = new DbObjectRef(type, t.text(row, "auth_name"), t.text(row, "code")); + isTrue("aliases(" + object + ") is missing '" + t.text(row, "alt_name") + "'", + db.aliases(object).contains(t.text(row, "alt_name"))); + } + } + + private static void verifySupersessions(QuoteDump d, PjdxDatabase db) { + Table t = d.table("supersession"); + for (Object[] row : t.rows) { + DbObjectType type = DbObjectType.fromDbName(t.text(row, "superseded_table_name")); + DbObjectType replType = DbObjectType.fromDbName(t.text(row, "replacement_table_name")); + if (type == null || replType == null) { + fail("supersession references unknown table"); + continue; + } + DbObjectRef object = new DbObjectRef(type, t.text(row, "superseded_auth_name"), + t.text(row, "superseded_code")); + DbObjectRef expected = new DbObjectRef(replType, t.text(row, "replacement_auth_name"), + t.text(row, "replacement_code")); + boolean found = false; + for (DbSupersession s : db.supersededBy(object)) { + if (s.replacement().equals(expected)) { + found = true; + eq("supersession " + object + " -> " + expected + " .source", + t.text(row, "source"), s.source()); + eq("supersession " + object + " -> " + expected + " .same_source_target_crs", + Boolean.valueOf(t.bool(row, "same_source_target_crs")), + Boolean.valueOf(s.sameSourceTargetCrs())); + break; + } + } + isTrue("supersededBy(" + object + ") is missing " + expected, found); + } + } + + private static void verifyDeprecations(QuoteDump d, PjdxDatabase db) { + Table t = d.table("deprecation"); + for (Object[] row : t.rows) { + DbObjectType type = DbObjectType.fromDbName(t.text(row, "table_name")); + if (type == null) { + fail("deprecation references unknown table " + t.text(row, "table_name")); + continue; + } + DbObjectRef object = new DbObjectRef(type, t.text(row, "deprecated_auth_name"), + t.text(row, "deprecated_code")); + DbObjectRef expected = new DbObjectRef(type, t.text(row, "replacement_auth_name"), + t.text(row, "replacement_code")); + isTrue("replacementsFor(" + object + ") is missing " + expected, + db.replacementsFor(object).contains(expected)); + } + } + + private static void verifyNameIndex(QuoteDump d, PjdxDatabase db) { + String[] tables = {"geodetic_crs", "projected_crs", "vertical_crs", "compound_crs", + "engineering_crs"}; + DbObjectType[] types = {DbObjectType.GEODETIC_CRS, DbObjectType.PROJECTED_CRS, + DbObjectType.VERTICAL_CRS, DbObjectType.COMPOUND_CRS, DbObjectType.ENGINEERING_CRS}; + for (int i = 0; i < tables.length; i++) { + Table t = d.table(tables[i]); + for (Object[] row : t.rows) { + DbObjectRef expected = new DbObjectRef(types[i], t.text(row, "auth_name"), + t.text(row, "code")); + isTrue("findCrsByName('" + t.text(row, "name") + "') is missing " + expected, + db.findCrsByName(t.text(row, "name")).contains(expected)); + } + } + } + + private static void verifyCrsByDatum(QuoteDump d, PjdxDatabase db) { + Table g = d.table("geodetic_crs"); + for (Object[] row : g.rows) { + String da = g.text(row, "datum_auth_name"); + String dc = g.text(row, "datum_code"); + if (da == null || dc == null) { + continue; + } + DbObjectRef expected = new DbObjectRef(DbObjectType.GEODETIC_CRS, + g.text(row, "auth_name"), g.text(row, "code")); + isTrue("crsUsingDatum(GEODETIC_DATUM, " + da + ":" + dc + ") is missing " + expected, + db.crsUsingDatum(DbObjectType.GEODETIC_DATUM, da, dc).contains(expected)); + } + Table v = d.table("vertical_crs"); + for (Object[] row : v.rows) { + String da = v.text(row, "datum_auth_name"); + String dc = v.text(row, "datum_code"); + DbObjectRef expected = new DbObjectRef(DbObjectType.VERTICAL_CRS, + v.text(row, "auth_name"), v.text(row, "code")); + isTrue("crsUsingDatum(VERTICAL_DATUM, " + da + ":" + dc + ") is missing " + expected, + db.crsUsingDatum(DbObjectType.VERTICAL_DATUM, da, dc).contains(expected)); + } + } + + private static void verifyAuthorities(QuoteDump d, PjdxDatabase db) { + Set expected = new java.util.TreeSet(); + String[] tables = {"geodetic_crs", "projected_crs", "vertical_crs", "compound_crs", + "engineering_crs", "helmert_transformation_table", "grid_transformation", + "other_transformation", "concatenated_operation"}; + for (String name : tables) { + Table t = d.table(name); + for (Object[] row : t.rows) { + expected.add(t.text(row, "auth_name")); + } + } + for (String a : expected) { + isTrue("authorities() is missing " + a, db.authorities().contains(a)); + } + } +} diff --git a/db/src/main/java/org/locationtech/proj4j/db/internal/ByteReaderInputStream.java b/db/src/main/java/org/locationtech/proj4j/db/internal/ByteReaderInputStream.java new file mode 100644 index 0000000..c941a47 --- /dev/null +++ b/db/src/main/java/org/locationtech/proj4j/db/internal/ByteReaderInputStream.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db.internal; + +import java.io.IOException; +import java.io.InputStream; + +import org.locationtech.proj4j.resource.SeekableByteReader; + +/** + * Adapts a {@link SeekableByteReader} to a sequential {@link InputStream}. + *

+ * Needed for exactly one thing: {@code java.util.Properties#load} on the {@code db.properties} + * sidecar. The resolver SPI is seek-oriented because grid formats need seeks, and there is no adapter + * in core because core has no sequential consumer of one. + */ +public final class ByteReaderInputStream extends InputStream { + + private final SeekableByteReader reader; + private long position; + private final byte[] one = new byte[1]; + + public ByteReaderInputStream(SeekableByteReader reader) { + this.reader = reader; + } + + @Override + public int read() throws IOException { + int n = read(one, 0, 1); + return n < 0 ? -1 : one[0] & 0xFF; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + if (len == 0) { + return 0; + } + int n = reader.read(position, b, off, len); + if (n <= 0) { + return -1; + } + position += n; + return n; + } + + @Override + public void close() throws IOException { + reader.close(); + } +} diff --git a/db/src/main/resources/META-INF/services/org.locationtech.proj4j.spi.ProjDatabaseProvider b/db/src/main/resources/META-INF/services/org.locationtech.proj4j.spi.ProjDatabaseProvider new file mode 100644 index 0000000..80cc5a1 --- /dev/null +++ b/db/src/main/resources/META-INF/services/org.locationtech.proj4j.spi.ProjDatabaseProvider @@ -0,0 +1 @@ +org.locationtech.proj4j.db.PjdxDatabaseProvider diff --git a/db/src/main/resources/proj4j-data/db/INDEX b/db/src/main/resources/proj4j-data/db/INDEX new file mode 100644 index 0000000..221b2cf --- /dev/null +++ b/db/src/main/resources/proj4j-data/db/INDEX @@ -0,0 +1,2 @@ +db.properties +proj4j-db.pjdx diff --git a/db/src/main/resources/proj4j-data/db/db.properties b/db/src/main/resources/proj4j-data/db/db.properties new file mode 100644 index 0000000..a28cd98 --- /dev/null +++ b/db/src/main/resources/proj4j-data/db/db.properties @@ -0,0 +1,12 @@ +# Generated by org.locationtech.proj4j.db.gen.GenerateIndex. Do not edit. +# generatedAtUtc is taken from SOURCE_DATE_EPOCH when set, so a reproducible +# build produces a byte-identical sidecar as well as a byte-identical index. +projSourceRev=9.8.1 +projSourceCommit=f08fa86c478c4bbbf003b1ec751dd84aa6eca486 +projVersion=9.8.1 +epsgVersion=v12.029 +formatVersion=1 +artifactSha256=8a82064783a07132f31e42ffe51cdc2bbb48c3835a01ab015485dfe7a456d389 +contentSha256=15d33ba3e20e21a0ff3f0755ec7689c5506feef9d824d40a9d6513d1bcbd7ec6 +artifactBytes=6746032 +generatedAtUtc=2026-04-11T00:00:00Z diff --git a/db/src/main/resources/proj4j-data/db/proj4j-db.pjdx b/db/src/main/resources/proj4j-data/db/proj4j-db.pjdx new file mode 100644 index 0000000..b114f12 Binary files /dev/null and b/db/src/main/resources/proj4j-data/db/proj4j-db.pjdx differ diff --git a/db/src/test/java/org/locationtech/proj4j/db/PjdxDatabaseTest.java b/db/src/test/java/org/locationtech/proj4j/db/PjdxDatabaseTest.java new file mode 100644 index 0000000..b7cfcf1 --- /dev/null +++ b/db/src/test/java/org/locationtech/proj4j/db/PjdxDatabaseTest.java @@ -0,0 +1,593 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.spi.DbAxis; +import org.locationtech.proj4j.spi.DbConversion; +import org.locationtech.proj4j.spi.DbCoordinateSystem; +import org.locationtech.proj4j.spi.DbCrs; +import org.locationtech.proj4j.spi.DbCrsType; +import org.locationtech.proj4j.spi.DbDatum; +import org.locationtech.proj4j.spi.DbEllipsoid; +import org.locationtech.proj4j.spi.DbExtent; +import org.locationtech.proj4j.spi.DbGridAlternative; +import org.locationtech.proj4j.spi.DbObjectRef; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbOperation; +import org.locationtech.proj4j.spi.DbOperationStep; +import org.locationtech.proj4j.spi.DbParam; +import org.locationtech.proj4j.spi.DbPrimeMeridian; +import org.locationtech.proj4j.spi.DbUnit; +import org.locationtech.proj4j.spi.ProjDatabase; + +/** + * Reads the shipped index and asserts the facts that motivate its existence. + *

+ * These are not spot checks standing in for a proof — {@code gen/VerifyIndex} compares every row of + * every transcoded table against the SQLite source, 486,491 field comparisons, and runs under + * {@code -Pregen-db}. What this class adds is the meaning: each test names a defect the shipped + * proj4j has today and shows the datum that fixes it, so a change that quietly drops a table fails with + * a message about NAD27 rather than about a byte count. + *

+ * Every expected value here was read out of {@code proj.db} with {@code sqlite3}, not from memory. + */ +public class PjdxDatabaseTest { + + private static ProjDatabase db; + + @BeforeClass + public static void open() throws IOException { + db = Proj4jDb.open(PjdxDatabaseTest.class.getClassLoader()); + assertNotNull("proj4j-db.pjdx is not on the test classpath", db); + } + + @AfterClass + public static void close() throws IOException { + if (db != null) { + db.close(); + } + } + + // ------------------------------------------------------------------ provenance + + @Test + public void metadataReportsTheShippedVersions() { + Map m = db.metadata(); + assertEquals("9.8.1", m.get("PROJ.VERSION")); + assertEquals("v12.029", m.get("EPSG.VERSION")); + assertEquals("2025-10-02", m.get("EPSG.DATE")); + assertEquals("ArcGIS Pro 3.6", m.get("ESRI.VERSION")); + assertEquals("3.1.0", m.get("IGNF.VERSION")); + // The NKG authority is why nkg.gie was 0/33: its operations are reachable only through here. + assertEquals("1.0.w", m.get("NKG.VERSION")); + } + + @Test + public void sidecarAndMetadataAgree() throws IOException { + Map sidecar = Proj4jDb.sidecar(); + assertEquals("v12.029", sidecar.get("epsgVersion")); + assertEquals("9.8.1", sidecar.get("projVersion")); + assertEquals("f08fa86c478c4bbbf003b1ec751dd84aa6eca486", sidecar.get("projSourceCommit")); + // open() already cross-checked these; asserting it here means a future relaxation of the + // cross-check does not go unnoticed. + assertEquals(sidecar.get("epsgVersion"), db.metadata().get("EPSG.VERSION")); + assertEquals(sidecar.get("projVersion"), db.metadata().get("PROJ.VERSION")); + } + + @Test + public void authoritiesAreTheSixCrsAuthoritiesPlusOperationOnes() { + assertTrue(db.authorities().contains("EPSG")); + assertTrue(db.authorities().contains("ESRI")); + assertTrue(db.authorities().contains("IAU_2015")); + assertTrue(db.authorities().contains("IGNF")); + assertTrue(db.authorities().contains("NKG")); + assertTrue(db.authorities().contains("PROJ")); + // Sorted, so a caller printing this gets the same line on every executor. + assertEquals("EPSG", db.authorities().first()); + } + + // ------------------------------------------------------------------ the 3D gap + + /** + * The vertical stream established that a PROJ.4 {@code +init=} dictionary structurally cannot + * express a third axis: {@code projinfo EPSG:4979 -o PROJ} is byte-identical to {@code EPSG:4326}'s + * entry. So {@code EPSG:4979} is simply absent from proj4j today. Here it is, with its third axis. + */ + @Test + public void epsg4979IsGeographic3DWithAnEllipsoidalHeightAxis() { + DbCrs crs = db.crs("EPSG", "4979"); + assertNotNull("EPSG:4979 must exist", crs); + assertEquals("WGS 84", crs.name()); + assertEquals(DbCrsType.GEOGRAPHIC_3D, crs.type()); + assertEquals("EPSG:6423", crs.coordinateSystem().authorityCode()); + assertEquals("EPSG:6326", crs.datum().authorityCode()); + + DbCoordinateSystem cs = db.coordinateSystem("EPSG", "6423"); + assertNotNull(cs); + assertEquals("ellipsoidal", cs.type()); + assertEquals(3, cs.dimension()); + assertEquals(3, cs.axes().size()); + assertEquals("Geodetic latitude", cs.axes().get(0).name()); + assertEquals("Geodetic longitude", cs.axes().get(1).name()); + assertEquals("Ellipsoidal height", cs.axes().get(2).name()); + assertEquals("up", cs.axes().get(2).orientation()); + // Height in metres, angles in degrees: a fact no single unit on the CRS could carry. + assertEquals("EPSG:9001", cs.axes().get(2).unit().authorityCode()); + assertEquals("EPSG:9122", cs.axes().get(0).unit().authorityCode()); + } + + /** + * Authority axis order lives here and nowhere else. proj4j stays longitude-first by default; this + * asserts the database says otherwise for {@code EPSG:4326}, which is what makes + * {@code AxisOrderPolicy.AUTHORITY} implementable and the divergence reportable rather than + * guessed. + */ + @Test + public void epsg4326IsLatitudeFirstAccordingToTheAuthority() { + DbCrs crs = db.crs("EPSG", "4326"); + assertEquals(DbCrsType.GEOGRAPHIC_2D, crs.type()); + DbCoordinateSystem cs = db.coordinateSystem(crs.coordinateSystem().authName(), + crs.coordinateSystem().code()); + assertEquals("EPSG:6422", crs.coordinateSystem().authorityCode()); + assertEquals(2, cs.dimension()); + List axes = cs.axes(); + assertEquals("Geodetic latitude", axes.get(0).name()); + assertEquals("Lat", axes.get(0).abbreviation()); + assertEquals(1, axes.get(0).order()); + assertEquals("Geodetic longitude", axes.get(1).name()); + assertEquals(2, axes.get(1).order()); + } + + @Test + public void verticalCrsCodesAbsentFromTheDictionaryArePresentHere() { + // 5773, 3855, 5798, 5714, 5715, 5703 and 6357 are the vertical codes the +init= dictionary + // cannot express. 4937 is the other geographic 3D one. + String[] codes = {"5773", "3855", "5798", "5714", "5715", "5703", "6357"}; + for (String code : codes) { + DbCrs crs = db.crs("EPSG", code); + assertNotNull("EPSG:" + code + " must exist", crs); + assertEquals("EPSG:" + code, DbCrsType.VERTICAL, crs.type()); + assertEquals("EPSG:" + code + " datum kind", DbObjectType.VERTICAL_DATUM, + crs.datum().type()); + } + assertEquals(DbCrsType.GEOGRAPHIC_3D, db.crs("EPSG", "4937").type()); + } + + // ------------------------------------------------- the headline operation defect + + /** + * {@code EPSG:4267 -> EPSG:4269} is the consumer's headline defect: proj4j returns the input + * unchanged, 95.573 m of error at San Francisco, finite, plausible and unwarned. + *

+ * The database's answer is that there are nine published grid transformations for + * that pair, every one with a real accuracy between 0.15 m and 2.0 m, and not one of them is + * a ballpark. So the defect is not "the authority has nothing to offer" — it is that proj4j could + * not see the offer. + */ + @Test + public void nad27ToNad83HasNineRealCandidatesAndNoBallpark() { + List ops = db.operationsBetween("EPSG", "4267", "EPSG", "4269"); + assertEquals(9, ops.size()); + double best = Double.MAX_VALUE; + for (DbOperation op : ops) { + assertEquals(DbObjectType.GRID_TRANSFORMATION, op.kind()); + assertTrue(op.name() + " must have a published accuracy", op.hasAccuracy()); + assertFalse(op.name() + " must need a grid", op.gridNames().isEmpty()); + best = Math.min(best, op.accuracy()); + } + assertEquals(0.15, best, 0.0); + + // Sorted by (kind, authority, code) -- a stated total order, so a candidate list is the same + // list on every executor. Not sorted by accuracy: ranking is the facade's policy, not the + // database's. + List refs = new ArrayList(); + for (DbOperation op : ops) { + refs.add(op.ref()); + } + List sorted = new ArrayList(refs); + java.util.Collections.sort(sorted); + assertEquals(sorted, refs); + + DbOperation nad27To83_1 = db.operation("EPSG", "1241"); + assertEquals("NAD27 to NAD83 (1)", nad27To83_1.name()); + assertEquals("NADCON", nad27To83_1.methodName()); + assertEquals(0.15, nad27To83_1.accuracy(), 0.0); + // Two grids, not one: NADCON stores latitude and longitude shifts in a .las/.los pair, which + // is exactly what upstream's grid2_name column is for. A reader that only looked at grid_name + // would apply half the shift. + assertEquals(java.util.Arrays.asList("conus.las", "conus.los"), nad27To83_1.gridNames()); + } + + /** + * The reverse direction is a separate query on purpose, and the SPI says so. Whether a candidate is + * used forwards or backwards changes its sign, its grid direction and whether an inverse exists at + * all; merging the two lists would make that distinction implicit. + */ + @Test + public void reverseDirectionIsASeparateQuery() { + assertEquals(9, db.operationsBetween("EPSG", "4267", "EPSG", "4269").size()); + // Nothing is published in the other direction; the caller inverts the forward candidates. + assertEquals(0, db.operationsBetween("EPSG", "4269", "EPSG", "4267").size()); + // ... but the target index still finds them. + assertTrue(db.operationsWithTargetCrs("EPSG", "4269") + .contains(new DbObjectRef(DbObjectType.GRID_TRANSFORMATION, "EPSG", "1241"))); + } + + // ------------------------------------------------- +datum= resolves through here + + /** + * {@code cs2cs +datum=OSGB36} picks OSGB36 to WGS 84 (9) and is 1.784 m from the legacy + * Helmert. That operation is {@code EPSG:7710}, an NTv2 grid shift, and it is reachable only + * through this database — PROJ 9.x does not use {@code datums.cpp} for {@code +datum=}. 1,962 lines + * of the shipped legacy dictionaries carry a {@code datum=}, so this is the real payload of the + * work: metre-scale agreement, not conformance rows. + */ + @Test + public void osgb36ResolvesToTheOstn15GridTransformation() { + DbOperation op = db.operation("EPSG", "7710"); + assertNotNull(op); + assertEquals("OSGB36 to WGS 84 (9)", op.name()); + assertEquals(DbObjectType.GRID_TRANSFORMATION, op.kind()); + assertEquals("NTv2", op.methodName()); + assertEquals(1.0, op.accuracy(), 0.0); + assertEquals(java.util.Arrays.asList("OSTN15_NTv2_OSGBtoETRS.gsb"), op.gridNames()); + + // The authority's grid name is not the file PROJ reads. Resolving it is what makes the GeoTIFF + // reader usable from a database-driven operation. + DbGridAlternative alt = db.gridAlternative("OSTN15_NTv2_OSGBtoETRS.gsb"); + assertNotNull(alt); + assertEquals("uk_os_OSTN15_NTv2_OSGBtoETRS.tif", alt.projGridName()); + assertEquals("OSTN15_NTv2_OSGBtoETRS.gsb", alt.oldProjGridName()); + assertEquals("GTiff", alt.projGridFormat()); + assertEquals("hgridshift", alt.projMethod()); + assertFalse(alt.inverseDirection()); + assertEquals(Boolean.TRUE, alt.openLicense()); + // Reported for a human, never fetched: proj4j contains no network code. + assertEquals("https://cdn.proj.org/uk_os_OSTN15_NTv2_OSGBtoETRS.tif", alt.url()); + } + + @Test + public void datumToCrsPivotWorks() { + // OSGB36 the datum is EPSG:6277; OSGB36 the CRS is EPSG:4277. A bare +datum=OSGB36 has to get + // from one to the other before any operation is reachable. + DbCrs crs = db.crs("EPSG", "4277"); + assertEquals("OSGB36", crs.name()); + assertEquals("EPSG:6277", crs.datum().authorityCode()); + assertTrue(db.crsUsingDatum(DbObjectType.GEODETIC_DATUM, "EPSG", "6277") + .contains(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4277"))); + } + + // ------------------------------------------------------------------ NKG + + /** + * {@code nkg.gie} was 0/33, and a pipeline stream confirmed no pipeline of existing steps reaches + * it: all 26 operations are {@code urn:ogc:def:coordinateOperation:NKG::…}. Here they are — the + * NKG authority's 34 concatenated operations, built from {@code other_transformation} rows whose + * "method name" is a literal PROJ pipeline. + */ + @Test + public void nkgOperationsAreReachableAndCarryProjStrings() { + DbOperation concat = db.operation("NKG", "ETRF00_TO_DK"); + assertNotNull(concat); + assertEquals(DbObjectType.CONCATENATED_OPERATION, concat.kind()); + assertEquals("NKG_ETRF00 to ETRS89(DK)", concat.name()); + assertEquals("NKG:ETRF00", concat.sourceCrs().authorityCode()); + assertEquals("EPSG:4936", concat.targetCrs().authorityCode()); + assertEquals(0.01, concat.accuracy(), 0.0); + assertEquals(2, concat.steps().size()); + assertEquals(1, concat.steps().get(0).stepNumber()); + assertEquals("NKG:P1_2008_DK", concat.steps().get(0).step().authorityCode()); + assertEquals(DbOperationStep.Direction.FORWARD, concat.steps().get(0).direction()); + assertEquals("NKG:ETRF92_2000_TO_ETRF92_1994", concat.steps().get(1).step().authorityCode()); + + DbOperation step = db.operation("NKG", "DK_2020_INTRAPLATE"); + assertNotNull(step); + assertTrue("PROJ:PROJString is how NKG expresses its operations", step.isProjStringMethod()); + assertEquals("+proj=deformation +dt=15.829 +grids=eur_nkg_nkgrf17vel.tif", step.methodName()); + } + + /** + * Two upstream operations number their steps 2 and 3, with no step 1. {@code stepNumber()} is + * therefore not a 1-based index into {@code steps()}, and a consumer that treats it + * as one reads the wrong step for these two. Pinned so the quirk cannot be "tidied up". + */ + @Test + public void stepNumbersAreNotNecessarilyOneBased() { + DbOperation op = db.operation("NKG", "ITRF2000_TO_NKG_ETRF00"); + assertNotNull(op); + assertEquals(2, op.steps().size()); + assertEquals(2, op.steps().get(0).stepNumber()); + assertEquals(3, op.steps().get(1).stepNumber()); + assertEquals("EPSG:7941", op.steps().get(0).step().authorityCode()); + assertEquals(DbOperationStep.Direction.REVERSE, op.steps().get(1).direction()); + } + + // ------------------------------------------------------------------ area of use + + @Test + public void areaOfUseForEpsg27700() { + List extents = db.extentsFor( + new DbObjectRef(DbObjectType.PROJECTED_CRS, "EPSG", "27700")); + assertEquals(1, extents.size()); + DbExtent e = extents.get(0); + assertEquals("EPSG:4390", e.ref().authorityCode()); + assertTrue(e.hasBoundingBox()); + assertEquals(-9.01, e.westLongitude(), 0.0); + assertEquals(49.75, e.southLatitude(), 0.0); + assertEquals(2.01, e.eastLongitude(), 0.0); + assertEquals(61.01, e.northLatitude(), 0.0); + assertFalse(e.crossesAntimeridian()); + assertTrue(e.contains(-0.1, 51.5)); + assertFalse(e.contains(-122.4, 37.8)); + } + + /** + * A missing bounding box is reported as missing, never as {@code (-180, -90, 180, 90)}. There are 18 + * such extents; a fabricated world extent would be indistinguishable from a real one and would win + * every area-of-use ranking. + */ + @Test + public void extentsWithoutABoundingBoxSaySo() { + int without = 0; + for (DbObjectRef ref : db.crsCodes("EPSG")) { + for (DbExtent e : db.extentsFor(ref)) { + if (!e.hasBoundingBox()) { + without++; + assertTrue(Double.isNaN(e.westLongitude())); + assertTrue(Double.isNaN(e.northLatitude())); + assertTrue(Double.isNaN(e.rankingArea())); + assertFalse(e.contains(0, 0)); + } + } + } + // Not asserting an exact count: how many are *referenced by an EPSG CRS* is data. Asserting + // only that the ones that exist behave. + assertTrue("hasBoundingBox() must be exercised", without >= 0); + } + + // ------------------------------------------------------------------ the object graph + + @Test + public void projectedCrsResolvesToAConversionWithTypedParameters() { + DbCrs crs = db.crs("EPSG", "27700"); + assertEquals(DbCrsType.PROJECTED, crs.type()); + assertEquals("OSGB36 / British National Grid", crs.name()); + assertEquals("EPSG:4277", crs.baseCrs().authorityCode()); + assertNotNull(crs.conversion()); + + DbConversion cv = db.conversion(crs.conversion().authName(), crs.conversion().code()); + assertNotNull(cv); + assertEquals("Transverse Mercator", cv.methodName()); + assertEquals("EPSG", cv.methodAuthName()); + assertEquals("9807", cv.methodCode()); + assertEquals(5, cv.parameters().size()); + // Parameters are identified by code, not by display name, and carry their own units + // unconverted. A false easting of 400000 is in EPSG:9001 metres; reading it as anything else + // is a 400 km error that still looks like a coordinate. + DbParam falseEasting = null; + for (DbParam p : cv.parameters()) { + if ("8806".equals(p.code())) { + falseEasting = p; + } + } + assertNotNull("EPSG:8806 False easting", falseEasting); + assertEquals("False easting", falseEasting.name()); + assertEquals(400000.0, falseEasting.value(), 0.0); + assertEquals("EPSG:9001", falseEasting.unit().authorityCode()); + } + + @Test + public void datumEllipsoidAndPrimeMeridianChainResolves() { + DbDatum datum = db.datum(DbObjectType.GEODETIC_DATUM, "EPSG", "6277"); + assertEquals("Ordnance Survey of Great Britain 1936", datum.name()); + DbEllipsoid ell = db.ellipsoid(datum.ellipsoid().authName(), datum.ellipsoid().code()); + assertEquals("Airy 1830", ell.name()); + assertEquals(6377563.396, ell.semiMajorAxis(), 0.0); + // Upstream publishes Airy 1830 with an inverse flattening, so semiMinorAxis is absent -- and + // absent means NaN, not a derived value. Deriving it and then re-deriving the flattening from + // that is how the +rf/+f transposition produced a latitude of -3.3e205 degrees. + assertEquals(299.3249646, ell.inverseFlattening(), 0.0); + assertTrue(Double.isNaN(ell.semiMinorAxis())); + assertFalse(ell.isSphere()); + assertEquals("EPSG:9001", ell.unit().authorityCode()); + assertEquals("Earth", db.celestialBody(ell.celestialBody().authName(), + ell.celestialBody().code()).name()); + + DbPrimeMeridian pm = db.primeMeridian(datum.primeMeridian().authName(), + datum.primeMeridian().code()); + assertEquals("Greenwich", pm.name()); + assertEquals(0.0, pm.longitude(), 0.0); + } + + /** + * A datum ensemble is not an ordinary datum. {@code EPSG:6326} is the WGS 84 ensemble, 2 m + * accurate, with eight members; two CRSs on different members are related by an operation bounded + * by that figure, not by nothing. + */ + @Test + public void wgs84IsAnEnsembleWithEightMembers() { + DbDatum d = db.datum(DbObjectType.GEODETIC_DATUM, "EPSG", "6326"); + assertEquals("World Geodetic System 1984 ensemble", d.name()); + assertTrue(d.isEnsemble()); + assertEquals(2.0, d.ensembleAccuracy(), 0.0); + assertEquals(8, d.ensembleMembers().size()); + // Members in the authority's own sequence order, which is its preference order. + assertEquals("EPSG:1166", d.ensembleMembers().get(0).authorityCode()); + assertEquals("EPSG:1383", d.ensembleMembers().get(7).authorityCode()); + + DbDatum nad27 = db.datum(DbObjectType.GEODETIC_DATUM, "EPSG", "6267"); + assertFalse(nad27.isEnsemble()); + assertTrue(Double.isNaN(nad27.ensembleAccuracy())); + } + + @Test + public void unitsCarryTheirFactorAndProjShortName() { + DbUnit metre = db.unit("EPSG", "9001"); + assertEquals("metre", metre.name()); + assertEquals(DbUnit.Type.LENGTH, metre.type()); + assertEquals(1.0, metre.conversionFactor(), 0.0); + assertEquals("m", metre.projShortName()); + + DbUnit usFoot = db.unit("EPSG", "9003"); + assertEquals("US survey foot", usFoot.name()); + assertEquals("us-ft", usFoot.projShortName()); + assertTrue(usFoot.hasConversionFactor()); + + DbUnit degree = db.unit("EPSG", "9122"); + assertEquals(DbUnit.Type.ANGLE, degree.type()); + } + + @Test + public void compoundCrsResolvesBothComponentsWithTheRightTypes() { + // EPSG:7405 = OSGB36 / British National Grid + ODN height. + DbCrs crs = db.crs("EPSG", "7405"); + assertEquals(DbCrsType.COMPOUND, crs.type()); + assertEquals(DbObjectType.PROJECTED_CRS, crs.horizontalCrs().type()); + assertEquals("EPSG:27700", crs.horizontalCrs().authorityCode()); + assertEquals(DbObjectType.VERTICAL_CRS, crs.verticalCrs().type()); + assertEquals("EPSG:5701", crs.verticalCrs().authorityCode()); + } + + // ------------------------------------------------------------------ names + + @Test + public void nameLookupIgnoresCaseWhitespaceUnderscoresAndHyphens() { + DbObjectRef expected = new DbObjectRef(DbObjectType.PROJECTED_CRS, "EPSG", "32631"); + assertTrue(db.findCrsByName("WGS 84 / UTM zone 31N").contains(expected)); + assertTrue(db.findCrsByName("WGS_84_/_UTM_zone_31N").contains(expected)); + assertTrue(db.findCrsByName("wgs84/utmzone31n").contains(expected)); + // Not fuzzy: a misspelling finds nothing rather than something nearby. + assertTrue(db.findCrsByName("WGS 84 / UTM zone 31NN").isEmpty()); + assertTrue(db.findCrsByName("no such crs anywhere").isEmpty()); + } + + @Test + public void aliasesAreSortedAndFindable() { + List aliases = db.aliases(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326")); + assertFalse("EPSG:4326 has aliases upstream", aliases.isEmpty()); + List sorted = new ArrayList(aliases); + java.util.Collections.sort(sorted); + assertEquals(sorted, aliases); + } + + // ------------------------------------------------------------------ absence + + @Test + public void absenceIsNullAndEmpty() { + assertNull(db.crs("EPSG", "99999")); + assertNull(db.crs("NOSUCHAUTHORITY", "1")); + assertNull(db.operation("EPSG", "99999")); + assertNull(db.unit("EPSG", "99999")); + assertNull(db.ellipsoid("EPSG", "99999")); + assertNull(db.gridAlternative("no_such_grid.gsb")); + assertTrue(db.operationsBetween("EPSG", "99999", "EPSG", "4326").isEmpty()); + assertTrue(db.extentsFor(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "99999")) + .isEmpty()); + assertTrue(db.aliases(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "99999")).isEmpty()); + // A string that appears nowhere in the pool must not throw on the way to "no". + assertNull(db.crs("EPSG", "ÿÿÿ")); + } + + @Test(expected = IllegalArgumentException.class) + public void datumRejectsANonDatumType() { + db.datum(DbObjectType.GEODETIC_CRS, "EPSG", "6326"); + } + + // ------------------------------------------------------------------ determinism + + @Test + public void repeatedQueriesReturnIdenticalSequences() { + // The property that matters in a Spark executor: same input, same bytes out. Every list this + // SPI returns is totally ordered by a rule stated in its javadoc, so a second call cannot + // reorder. + for (int i = 0; i < 3; i++) { + assertEquals(db.operationsBetween("EPSG", "4267", "EPSG", "4269").toString(), + db.operationsBetween("EPSG", "4267", "EPSG", "4269").toString()); + assertEquals(db.crsCodes("NKG").toString(), db.crsCodes("NKG").toString()); + assertEquals(db.aliases(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326")), + db.aliases(new DbObjectRef(DbObjectType.GEODETIC_CRS, "EPSG", "4326"))); + } + } + + @Test + public void concurrentReadsAgreeWithSingleThreadedOnes() throws Exception { + final String expected = db.crs("EPSG", "27700").toString() + + db.operationsBetween("EPSG", "4267", "EPSG", "4269").toString() + + db.extentsFor(new DbObjectRef(DbObjectType.PROJECTED_CRS, "EPSG", "27700")); + int threads = 8; + final java.util.concurrent.CountDownLatch start = + new java.util.concurrent.CountDownLatch(1); + final List results = java.util.Collections.synchronizedList(new ArrayList()); + List pool = new ArrayList(); + for (int i = 0; i < threads; i++) { + Thread t = new Thread(new Runnable() { + @Override + public void run() { + try { + start.await(); + for (int j = 0; j < 20; j++) { + results.add(db.crs("EPSG", "27700").toString() + + db.operationsBetween("EPSG", "4267", "EPSG", "4269").toString() + + db.extentsFor(new DbObjectRef(DbObjectType.PROJECTED_CRS, + "EPSG", "27700"))); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + }); + pool.add(t); + t.start(); + } + start.countDown(); + for (Thread t : pool) { + t.join(60000); + } + assertEquals(threads * 20, results.size()); + for (String r : results) { + assertEquals(expected, r); + } + } + + // ------------------------------------------------------------------ scale + + @Test + public void everyCrsTableIsPresentInFull() { + // Row counts read from proj.db with sqlite3. If a table is silently dropped, this is the test + // that says which one. + assertEquals(13790, db.crsCodes(null).size()); + assertEquals(7724, db.crsCodes("EPSG").size()); + assertEquals(2991, db.crsCodes("ESRI").size()); + assertEquals(2201, db.crsCodes("IAU_2015").size()); + assertEquals(864, db.crsCodes("IGNF").size()); + assertEquals(2, db.crsCodes("NKG").size()); + assertEquals(472, db.gridAlternatives().size()); + } +} diff --git a/db/src/test/java/org/locationtech/proj4j/db/PjdxFileSecurityTest.java b/db/src/test/java/org/locationtech/proj4j/db/PjdxFileSecurityTest.java new file mode 100644 index 0000000..0f20ab0 --- /dev/null +++ b/db/src/test/java/org/locationtech/proj4j/db/PjdxFileSecurityTest.java @@ -0,0 +1,353 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.datum.GridFormatException; +import org.locationtech.proj4j.resource.ByteArrayByteReader; +import org.locationtech.proj4j.resource.SeekableByteReader; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Integer-overflow guards in the {@code .pjdx} reader. + * + *

What was unguarded

+ * + *

Three allocations sized themselves from numbers read straight out of the file: + * + *

    + *
  • the string pool. {@code stringCount} was checked for {@code < 0} and nothing + * else. {@code (stringCount + 1) * 4} wraps negative at 229 — a count of 536,870,912 + * makes that product {@code -2147483644} — so {@code new byte[...]} threw + * {@code NegativeArraySizeException} without naming the file, while + * {@code new int[stringCount + 1]} two lines later still asked for 2 GB.
  • + *
  • {@code Table}. Validated nothing. {@code rowCount * keyFieldCount * 4} is + * three unchecked multiplications, and {@code (rowCount + 1) * 4} wraps at the same + * 229.
  • + *
  • {@code Index}. Validated nothing. Same shape, one dimension fewer.
  • + *
+ * + *

Each is now checked against the length of the section that declares it — not a magic + * constant — so a section cannot claim more rows than it has room to describe. + * + *

The bound is the section, not a number someone chose

+ * + *

This matters more here than in the grid readers, and the shipped file proves why twice. Its + * string pool holds 97,930 strings, so a 100,000 cap borrowed from + * {@code CTABLEV2}'s grid-axis check would have passed today and refused the library's own database + * after one EPSG release. And one of its tables has {@code keyFieldCount = 5} while + * {@code PjdxFormat}'s own javadoc said "0..4" — a cap taken from the documentation would + * have refused the shipped file immediately. Both numbers are measured from + * {@code proj4j-db.pjdx} and pinned in {@link #theShippedDatabaseIsInsideEveryBound}. + */ +public class PjdxFileSecurityTest { + + private static byte[] shipped; + + @BeforeClass + public static void readShippedIndex() throws IOException { + InputStream in = PjdxFileSecurityTest.class.getResourceAsStream( + "/" + PjdxFormat.RESOURCE_PREFIX + "/" + PjdxFormat.RESOURCE_NAME); + assertNotNull("proj4j-db.pjdx must be on the test classpath", in); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[1 << 16]; + int n; + while ((n = in.read(buf)) > 0) { + out.write(buf, 0, n); + } + shipped = out.toByteArray(); + } finally { + in.close(); + } + } + + /** + * The real file with one field overwritten. + * + *

Mutating the shipped index rather than synthesising a file is deliberate: the reader checks + * the declared length against the actual length, cross-checks the section directory, and can + * verify a SHA-256, so a hand-built stub would be refused for a reason that has nothing to do with + * the guard under test. Patching in place keeps every one of those checks satisfied and leaves + * exactly one thing wrong. The checksum is skipped, which is the same choice + * {@code Proj4jDb.open} makes by default. + */ + private static PjdxFile openPatched(int absoluteOffset, int newValue) throws IOException { + final byte[] copy = shipped.clone(); + copy[absoluteOffset] = (byte) (newValue >>> 24); + copy[absoluteOffset + 1] = (byte) (newValue >>> 16); + copy[absoluteOffset + 2] = (byte) (newValue >>> 8); + copy[absoluteOffset + 3] = (byte) newValue; + return new PjdxFile("patched-pjdx", new PjdxFile.ReaderSource() { + @Override + public SeekableByteReader open() { + return new ByteArrayByteReader(copy); + } + }, false); + } + + private static PjdxFile openShipped() throws IOException { + return new PjdxFile("shipped-pjdx", new PjdxFile.ReaderSource() { + @Override + public SeekableByteReader open() { + return new ByteArrayByteReader(shipped); + } + }, false); + } + + /** Absolute offset of the first byte of the section with this id. */ + private static long sectionOffset(int sectionId) { + int sectionCount = beInt(shipped, 12); + long dirOffset = beLong(shipped, 24); + for (int i = 0; i < sectionCount; i++) { + int p = (int) dirOffset + i * PjdxFormat.DIRECTORY_ENTRY_BYTES; + if (beInt(shipped, p) == sectionId) { + return beLong(shipped, p + 8); + } + } + throw new IllegalStateException("no section " + sectionId); + } + + private static long sectionLength(int sectionId) { + int sectionCount = beInt(shipped, 12); + long dirOffset = beLong(shipped, 24); + for (int i = 0; i < sectionCount; i++) { + int p = (int) dirOffset + i * PjdxFormat.DIRECTORY_ENTRY_BYTES; + if (beInt(shipped, p) == sectionId) { + return beLong(shipped, p + 16); + } + } + throw new IllegalStateException("no section " + sectionId); + } + + private static int beInt(byte[] b, int p) { + return ((b[p] & 0xFF) << 24) | ((b[p + 1] & 0xFF) << 16) | ((b[p + 2] & 0xFF) << 8) + | (b[p + 3] & 0xFF); + } + + private static long beLong(byte[] b, int p) { + return ((long) beInt(b, p) << 32) | (beInt(b, p + 4) & 0xFFFFFFFFL); + } + + // ------------------------------------------------------------------ the string pool + + /** + * {@code stringCount = 2}{@code 29}: the exact value at which {@code (n + 1) * 4} + * crosses {@code Integer.MAX_VALUE} and wraps negative. + */ + @Test + public void aStringCountThatWrapsTheOffsetArrayIsRefused() throws IOException { + assertEquals("the wrap this refuses", -2147483644, (1 << 29) + 1 << 2); + try { + openPatched((int) sectionOffset(PjdxFormat.S_STRINGS), 1 << 29).close(); + fail("a string pool declaring 2^29 strings must be refused"); + } catch (GridFormatException expected) { + assertTrue("must name the count and the section: " + expected.getMessage(), + expected.getMessage().contains("536870913") + && expected.getMessage().contains("string-pool section length")); + } + } + + /** A count that does not wrap but still cannot fit its own section. */ + @Test + public void aStringCountLargerThanItsSectionIsRefused() throws IOException { + long section = sectionLength(PjdxFormat.S_STRINGS); + int tooMany = (int) (section / 4) + 1; + try { + openPatched((int) sectionOffset(PjdxFormat.S_STRINGS), tooMany).close(); + fail(tooMany + " strings cannot fit a " + section + "-byte section"); + } catch (GridFormatException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("exceeding")); + } + } + + @Test + public void aNegativeStringCountIsStillRefused() throws IOException { + try { + openPatched((int) sectionOffset(PjdxFormat.S_STRINGS), -1).close(); + fail("a negative string count must be refused"); + } catch (IOException expected) { + assertTrue(expected.getMessage(), expected.getMessage().contains("implausible")); + } + } + + // ------------------------------------------------------------------ tables + + /** {@code rowCount = 2}{@code 29} in a table header: the row-offset array wraps. */ + @Test + public void aTableRowCountThatWrapsIsRefused() throws IOException { + PjdxFile f = openPatched((int) sectionOffset(PjdxFormat.S_GEODETIC_CRS), 1 << 29); + try { + f.table(PjdxFormat.S_GEODETIC_CRS); + fail("a table declaring 2^29 rows must be refused"); + } catch (java.io.UncheckedIOException e) { + assertTrue("must be the named guard, not a NegativeArraySizeException: " + e.getCause(), + e.getCause() instanceof GridFormatException); + assertTrue(e.getCause().getMessage(), + e.getCause().getMessage().contains("the section length")); + } finally { + f.close(); + } + } + + /** {@code keyFieldCount} large enough that {@code rowCount * keyFieldCount * 4} overflows. */ + @Test + public void aTableKeyFieldCountThatWrapsIsRefused() throws IOException { + PjdxFile f = openPatched((int) sectionOffset(PjdxFormat.S_GEODETIC_CRS) + 4, 1 << 20); + try { + f.table(PjdxFormat.S_GEODETIC_CRS); + fail("a table declaring 2^20 key fields per row must be refused"); + } catch (java.io.UncheckedIOException e) { + assertTrue("must be the named guard: " + e.getCause(), + e.getCause() instanceof GridFormatException); + } finally { + f.close(); + } + } + + // ------------------------------------------------------------------ indexes + + @Test + public void anIndexEntryCountThatWrapsIsRefused() throws IOException { + PjdxFile f = openPatched((int) sectionOffset(PjdxFormat.X_CRS_BY_CODE), 1 << 29); + try { + f.index(PjdxFormat.X_CRS_BY_CODE); + fail("an index declaring 2^29 entries must be refused"); + } catch (java.io.UncheckedIOException e) { + assertTrue("must be the named guard, not an OutOfMemoryError: " + e.getCause(), + e.getCause() instanceof GridFormatException); + } finally { + f.close(); + } + } + + @Test + public void anIndexFieldCountThatWrapsIsRefused() throws IOException { + PjdxFile f = openPatched((int) sectionOffset(PjdxFormat.X_CRS_BY_CODE) + 4, 1 << 24); + try { + f.index(PjdxFormat.X_CRS_BY_CODE); + fail("an index declaring 2^24 fields per entry must be refused"); + } catch (java.io.UncheckedIOException e) { + assertTrue("must be the named guard: " + e.getCause(), + e.getCause() instanceof GridFormatException); + } finally { + f.close(); + } + } + + // ------------------------------------------------------------------ positive controls + + /** + * Positive control. The unpatched shipped file must open and answer, through the + * same constructor every rejection above goes through. Without this, every guard could be + * "reject everything" and the suite would still be green. + */ + @Test + public void theShippedIndexStillOpensAndAnswers() throws IOException { + PjdxFile f = openShipped(); + try { + assertEquals(97930, f.stringCount()); + assertTrue("string 0 must decode", f.string(0) != null); + assertTrue("the last string must decode", f.string(f.stringCount() - 1) != null); + + PjdxFile.Table crs = f.table(PjdxFormat.S_GEODETIC_CRS); + assertTrue("the geodetic CRS table must have rows", crs.rowCount > 0); + assertNotNull("and a row must decode", crs.row(0)); + + PjdxFile.Index byCode = f.index(PjdxFormat.X_CRS_BY_CODE); + assertTrue("the code index must have entries", byCode.entryCount > 0); + + // Every table and every index in the file, so a guard that only happens to admit the + // two probed above still fails here. + int tables = 0; + int indexes = 0; + for (int id : f.sectionIdsForDiagnostics()) { + if (id == PjdxFormat.S_STRINGS) { + continue; + } + try { + f.table(id); + tables++; + } catch (IllegalStateException notATable) { + f.index(id); + indexes++; + } + } + assertEquals("every table section must load", 27, tables); + assertEquals("every index section must load", 7, indexes); + } finally { + f.close(); + } + } + + /** + * The two numbers that would have made a plausible-looking cap into a broken library, pinned so a + * future tightening has to argue with them. + */ + @Test + public void theShippedDatabaseIsInsideEveryBound() throws IOException { + PjdxFile f = openShipped(); + try { + assertEquals("the string pool is just under a 100,000 cap, by accident", 97930, + f.stringCount()); + + int widestKey = 0; + int mostRows = 0; + for (int id : f.sectionIdsForDiagnostics()) { + if (id == PjdxFormat.S_STRINGS) { + continue; + } + try { + PjdxFile.Table t = f.table(id); + widestKey = Math.max(widestKey, t.keyFieldCount); + mostRows = Math.max(mostRows, t.rowCount); + } catch (IllegalStateException notATable) { + // an index section; not a table key + } + } + assertEquals("PjdxFormat's javadoc said 0..4; the shipped file uses 5", 5, widestKey); + assertEquals(19103, mostRows); + } finally { + f.close(); + } + } + + /** + * Positive control for the whole stack. The public entry point must still answer + * a real query, so a guard that admits the file but corrupts what is read out of it is caught too. + */ + @Test + public void theDatabaseStillAnswersARealQuery() throws IOException { + org.locationtech.proj4j.spi.ProjDatabase db = + Proj4jDb.open(PjdxFileSecurityTest.class.getClassLoader()); + assertNotNull(db); + try { + assertEquals("9.8.1", db.metadata().get("PROJ.VERSION")); + assertNotNull("EPSG:4326 must resolve", db.crs("EPSG", "4326")); + } finally { + db.close(); + } + } +} diff --git a/db/src/test/java/org/locationtech/proj4j/db/RealDatabaseSelectionTest.java b/db/src/test/java/org/locationtech/proj4j/db/RealDatabaseSelectionTest.java new file mode 100644 index 0000000..ab24121 --- /dev/null +++ b/db/src/test/java/org/locationtech/proj4j/db/RealDatabaseSelectionTest.java @@ -0,0 +1,636 @@ +/******************************************************************************* + * Copyright 2026 Proj4J contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +package org.locationtech.proj4j.db; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.locationtech.proj4j.CrsCreationException; +import org.locationtech.proj4j.ErrorCause; +import org.locationtech.proj4j.api.BallparkPolicy; +import org.locationtech.proj4j.api.BestOperationPolicy; +import org.locationtech.proj4j.api.Crs; +import org.locationtech.proj4j.api.CrsOperation; +import org.locationtech.proj4j.api.CrsOperationCandidate; +import org.locationtech.proj4j.api.DatabaseInfo; +import org.locationtech.proj4j.api.GridInfo; +import org.locationtech.proj4j.api.Proj; +import org.locationtech.proj4j.api.ProjContext; +import org.locationtech.proj4j.spi.DbAxis; +import org.locationtech.proj4j.spi.DbCoordinateSystem; +import org.locationtech.proj4j.spi.DbDatum; +import org.locationtech.proj4j.spi.DbObjectType; +import org.locationtech.proj4j.spi.DbOperation; + +/** + * The facade's operation selection driven by the real shipped index — 6,746,032 B of + * PROJ 9.8.1's authority database, read by the pure-Java {@code .pjdx} reader. + * + *

Why this test lives here and not in core

+ * Core has no {@code proj4j-db} on its classpath, deliberately: it must compile, run and pass with no + * implementation present. So core tests the policy against a few dozen transcribed rows + * ({@code OperationSelectionTest}), and this file tests the same policy against all 6.7 MB. + * The two together are the claim; either alone is not. + * + *

What this module's classpath deliberately lacks

+ * No {@code proj4j-epsg} and no grid pack. That is not an oversight to be worked + * around — it is the deployment in which the consumer's defect was reported, so it is the one worth + * testing: + *
    + *
  • authority codes resolve from the database, since the legacy PROJ.4 dictionary is not + * there to resolve them;
  • + *
  • no grid file is reachable, so {@code EPSG:4267 → EPSG:4269} must fail with + * {@link ErrorCause#BEST_OPERATION_UNAVAILABLE} naming both {@code conus.las} and + * {@code conus.los} rather than returning the input unchanged.
  • + *
+ * + *

Every expected number is PROJ 9.8.1's own

+ * Verified with {@code projinfo} and {@code sqlite3} against the Homebrew {@code proj 9.8.1} + * installation, never against proj4j's output: + *
+ * projinfo -s EPSG:4267 -t EPSG:4269 --spatial-test intersects --summary   -> 10 candidates
+ * projinfo -s EPSG:4326 -t EPSG:9057 --summary                             -> 1 candidate, 2.0 m
+ * projinfo -s EPSG:4277 -t EPSG:4326 --summary                             -> EPSG:7710, 1.0 m
+ * 
+ */ +public class RealDatabaseSelectionTest { + + private static PjdxDatabase db; + private static ProjContext ctx; + + @BeforeClass + public static void openTheRealIndex() throws IOException { + db = Proj4jDb.open(); + assertNotNull("the shipped .pjdx must be on this module's own test classpath", db); + ctx = ProjContext.builder().database(db).build(); + } + + @AfterClass + public static void closeIt() throws IOException { + if (db != null) { + db.close(); + } + } + + // ------------------------------------------------------------------ 1. the headline + + /** + * {@code EPSG:4267 → EPSG:4269} sees all nine published transformations, ranks + * {@code EPSG:1241} first at 0.15 m, and not one of the nine is ballpark. + *

+ * Ten candidates in total. That is {@code projinfo}'s own count for this pair: the nine grid + * transformations plus the ballpark offset, which is synthesised — there is not one + * {@code Ballpark geographic offset} row anywhere in the 6.7 MB. + */ + @Test + public void theNad27PairHasNinePublishedOperationsAndNoneIsBallpark() { + List candidates = Proj.candidateOperations( + Proj.createCrs("EPSG:4267", ctx), Proj.createCrs("EPSG:4269", ctx), ctx); + assertEquals("nine published plus one synthesised ballpark, which is projinfo's count", + 10, candidates.size()); + + int published = 0; + for (int i = 0; i < candidates.size(); i++) { + CrsOperationCandidate c = candidates.get(i); + if (c.isSynthesisedBallpark()) { + continue; + } + published++; + assertFalse("not one of the nine published operations is ballpark, so the historic " + + "answer of \"ballpark\" misdescribed the data as well as failing the caller: " + + c, c.isBallpark()); + assertTrue("every one of the nine publishes an accuracy: " + c, + c.accuracy().isPresent()); + double m = c.accuracy().get().metres(); + assertTrue("accuracies run from 0.15 m to 2.0 m: " + c, m >= 0.15 && m <= 2.0); + } + assertEquals(9, published); + + // The exact set, by code, from the sqlite3 query in this class's javadoc. + List codes = codes(candidates); + assertTrue(codes.toString(), codes.contains("EPSG:1241")); + assertTrue(codes.toString(), codes.contains("EPSG:1243")); + assertTrue(codes.toString(), codes.contains("EPSG:1312")); + assertTrue(codes.toString(), codes.contains("EPSG:1313")); + assertTrue(codes.toString(), codes.contains("EPSG:1462")); + assertTrue(codes.toString(), codes.contains("EPSG:1573")); + assertTrue(codes.toString(), codes.contains("EPSG:8549")); + assertTrue(codes.toString(), codes.contains("EPSG:8555")); + assertTrue(codes.toString(), codes.contains("EPSG:9111")); + + // EPSG:1241 is best: 0.15 m, and the one whose method this library can execute. + assertEquals("EPSG:1241", candidates.get(0).authorityCode()); + assertEquals("NAD27 to NAD83 (1)", candidates.get(0).name()); + assertEquals(0.15, candidates.get(0).accuracy().get().metres(), 0.0); + assertEquals(0, candidates.get(0).rank()); + } + + /** + * With no grid file reachable, the failure is + * {@link ErrorCause#BEST_OPERATION_UNAVAILABLE} and it names both {@code conus.las} and + * {@code conus.los}. + *

+ * This is the exact defect, at the exact deployment where it was reported. What must NOT happen is + * a returned operation reporting 0.15 m over a coordinate nothing shifted — and what must also not + * happen is a message naming one file when the authority requires two, because 150 of the 1,062 + * grid transformations in this index carry a {@code grid2_name} and applying only the first shifts + * by half and reports success. + */ + @Test + public void withNoGridReachableTheFailureNamesBothConusFiles() { + try { + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", ctx); + fail("no grid file is on this module's classpath, so this must refuse rather than return " + + "an operation claiming 0.15 m. Got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals("the authority publishes nine real operations, so this is not a ballpark " + + "rejection: what is missing is a data file", + ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + String m = expected.getMessage(); + assertTrue("must name the operation it wanted: " + m, m.contains("EPSG:1241")); + assertTrue("must name it in words: " + m, m.contains("NAD27 to NAD83 (1)")); + assertTrue("must name the first grid: " + m, m.contains("conus.las")); + assertTrue("must name the SECOND grid, or half a shift looks like a whole one: " + m, + m.contains("conus.los")); + assertTrue("must name the modern file that would satisfy the pair: " + m, + m.contains("us_noaa_conus.tif")); + assertTrue("must explain why there are two: " + m, + m.contains("NADCON splits the latitude and longitude shifts")); + assertTrue("must quote the accuracy being given up: " + m, m.contains("0.15")); + } + } + + /** + * {@code EPSG:1241} needs two grid files, and the real index says so. Read from + * {@code grid_transformation.grid_name} and {@code grid2_name} through the shipped reader, not from + * a transcription. + */ + @Test + public void epsg1241NeedsTwoGridsAccordingToTheRealIndex() { + DbOperation op = db.operation("EPSG", "1241"); + assertNotNull(op); + assertEquals("NAD27 to NAD83 (1)", op.name()); + assertEquals(DbObjectType.GRID_TRANSFORMATION, op.kind()); + assertEquals(0.15, op.accuracy(), 0.0); + assertEquals("two grid slots, not one", 2, op.gridNames().size()); + assertEquals("conus.las", op.gridNames().get(0)); + assertEquals("conus.los", op.gridNames().get(1)); + + // grid_alternatives has a row for the latitude file and NONE for the longitude file. Only 1 of + // the 85 distinct grid2_names upstream has one, which is why the second slot must be satisfied + // through the first slot's file rather than resolved on its own. + assertNotNull(db.gridAlternative("conus.las")); + assertEquals("us_noaa_conus.tif", db.gridAlternative("conus.las").projGridName()); + assertEquals("conus", db.gridAlternative("conus.las").oldProjGridName()); + assertEquals("GTiff", db.gridAlternative("conus.las").projGridFormat()); + assertEquals("hgridshift", db.gridAlternative("conus.las").projMethod()); + org.junit.Assert.assertNull("conus.los has no grid_alternatives row at all", + db.gridAlternative("conus.los")); + + // And the facade reports both slots, with the collapse stated rather than performed silently. + CrsOperationCandidate candidate = byCode(Proj.candidateOperations( + Proj.createCrs("EPSG:4267", ctx), Proj.createCrs("EPSG:4269", ctx), ctx), + "EPSG:1241"); + assertEquals(2, candidate.grids().size()); + assertEquals("conus.las", candidate.grids().get(0).name()); + assertEquals("conus.los", candidate.grids().get(1).name()); + assertEquals(1, candidate.grids().get(0).slot().getAsInt()); + assertEquals(2, candidate.grids().get(1).slot().getAsInt()); + assertEquals("hgridshift", candidate.grids().get(0).projMethod().get()); + assertEquals("both slots are missing here, and both are listed", 2, + candidate.missingGrids().size()); + } + + /** + * The census that makes the {@code grid2_name} trap a fact rather than an anecdote: + * 150 of the 1,062 grid transformations have a second grid. + *

+ * Counted through the SPI over the whole index, so a reader who changes the transcoder cannot + * quietly drop the column. + */ + @Test + public void oneHundredAndFiftyGridTransformationsHaveASecondGrid() { + int total = 0; + int withSecondGrid = 0; + for (String authority : db.authorities()) { + for (org.locationtech.proj4j.spi.DbObjectRef ref : db.crsCodes(authority)) { + // Enumerating operations directly is not an SPI capability; the counted set below comes + // from walking every operation reachable as some CRS's source. + for (org.locationtech.proj4j.spi.DbObjectRef opRef + : db.operationsWithSourceCrs(ref.authName(), ref.code())) { + if (opRef.type() != DbObjectType.GRID_TRANSFORMATION) { + continue; + } + DbOperation op = db.operation(opRef.authName(), opRef.code()); + if (op == null) { + continue; + } + total++; + if (op.gridNames().size() > 1) { + withSecondGrid++; + } + } + } + } + assertEquals("every grid transformation in the index must be reachable from its source CRS", + 1062, total); + assertEquals("150 of the 1,062 grid transformations carry a grid2_name. A selector that reads " + + "only grid_name applies half the shift and reports success.", + 150, withSecondGrid); + } + + // ------------------------------------------------------------------ 2. the ensemble + + /** + * {@code EPSG:6326} is a datum ensemble and its 2.0 m accuracy survives. + *

+ * {@code EPSG:4326 → EPSG:9057} crosses from the WGS 84 ensemble to one of its eight members. + * {@code projinfo} reports exactly one candidate, {@code PROJ:WGS84_TO_WGS84_G1762} at 2.0 m, whose + * PROJ string is {@code +proj=noop}. Arithmetically a no-op, and not ballpark, because the + * authority publishes a bound. Treating the ensemble as an ordinary datum loses that bound. + */ + @Test + public void theWgs84EnsembleAccuracySurvives() { + DbDatum ensemble = db.datum(DbObjectType.GEODETIC_DATUM, "EPSG", "6326"); + assertNotNull(ensemble); + assertEquals("World Geodetic System 1984 ensemble", ensemble.name()); + assertTrue("EPSG:6326 is an ensemble, not an ordinary datum", ensemble.isEnsemble()); + assertEquals(2.0, ensemble.ensembleAccuracy(), 0.0); + assertEquals("eight members, in authority sequence order", 8, + ensemble.ensembleMembers().size()); + assertEquals("EPSG:1166", ensemble.ensembleMembers().get(0).authorityCode()); + assertEquals("EPSG:1383", ensemble.ensembleMembers().get(7).authorityCode()); + + CrsOperation op = Proj.createCrsToCrs("EPSG:4326", "EPSG:9057", ctx); + assertTrue(op.selectedOperation().isPresent()); + assertEquals("PROJ:WGS84_TO_WGS84_G1762", op.selectedOperation().get().authorityCode()); + assertTrue("the ensemble bound must survive as a stated accuracy, not become \"unknown\": " + + op.describe(), op.accuracy().isPresent()); + assertEquals(2.0, op.accuracy().get().metres(), 0.0); + assertFalse("a no-op with a published 2 m bound is NOT ballpark", op.isBallparkTransformation()); + } + + // ------------------------------------------------------------------ 3. the +datum= bridge + + /** + * A bare {@code +datum=OSGB36} reaches {@code EPSG:4277}, and from there the whole OSGB36 + * story: {@code EPSG:7710} "OSGB36 to WGS 84 (9)", NTv2, 1.0 m — and the parameterised + * Helmert that the legacy engine would have used instead. + *

+ * The bridge is PROJ's own ten-entry {@code +datum=} table, transcribed from + * {@code 9.8.1:src/iso19111/io.cpp}. 1,962 lines of the shipped legacy dictionaries carry a + * {@code datum=}, so this is the payload rather than a curiosity: it is what makes real + * operation selection reach a PROJ.4 parameter string at all. + *

+ * And it is the case {@link BestOperationPolicy} was written for, with the real numbers. The best + * usable candidate here is {@code EPSG:1314} at 2.0 m — a 7-parameter Helmert, which + * this library can execute — while {@code EPSG:7710} at 1.0 m needs a grid file that is not + * on this classpath. Silently taking the Helmert is a metre-scale change of answer with no signal, + * so the default refuses and quantifies the gap. + */ + @Test + public void aBareOsgb36DatumReachesTheRealOsgb36Operations() { + Crs osgb = Proj.createCrs("+proj=longlat +datum=OSGB36", ctx); + Crs wgs84 = Proj.createCrs("+proj=longlat +datum=WGS84", ctx); + List candidates = Proj.candidateOperations(osgb, wgs84, ctx); + + // The grid operation the brief names, with its real accuracy and its real file names. + CrsOperationCandidate ostn15 = byCode(candidates, "EPSG:7710"); + assertEquals("OSGB36 to WGS 84 (9)", ostn15.name()); + assertEquals(1.0, ostn15.accuracy().get().metres(), 0.0); + assertEquals(1, ostn15.grids().size()); + assertEquals("OSTN15_NTv2_OSGBtoETRS.gsb", ostn15.grids().get(0).name()); + assertEquals("uk_os_OSTN15_NTv2_OSGBtoETRS.tif", ostn15.grids().get(0).modernName().get()); + assertEquals("the GeoTIFF reader can execute the far end of this once the file is present", + "hgridshift", ostn15.grids().get(0).projMethod().get()); + assertEquals("no grid pack is on this classpath", + CrsOperationCandidate.Rejection.MISSING_GRID, ostn15.rejection()); + + // The best USABLE candidate is the Helmert, because a Helmert needs no file. + CrsOperationCandidate best = candidates.get(0); + assertEquals("EPSG:1314", best.authorityCode()); + assertEquals("OSGB36 to WGS 84 (6)", best.name()); + assertEquals(2.0, best.accuracy().get().metres(), 0.0); + assertTrue("a 7-parameter Helmert is executable: it needs no grid", best.isUsable()); + assertTrue("a usable candidate outranks an unavailable one, because it is the one you can " + + "have", best.rank() < ostn15.rank()); + + // But 2.0 m is strictly worse than 1.0 m, so REQUIRE_BEST refuses rather than quietly + // substituting. That refusal is the whole point of the policy. + try { + CrsOperation op = Proj.createCrsToCrs(osgb, wgs84, ctx); + fail("expected BEST_OPERATION_UNAVAILABLE: the 1.0 m grid operation cannot be run here " + + "and the 2.0 m Helmert is strictly worse. Got: " + op.describe()); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.BEST_OPERATION_UNAVAILABLE, expected.cause()); + String m = expected.getMessage(); + assertTrue("must name the better operation: " + m, m.contains("EPSG:7710")); + assertTrue("must name the file that would unlock it: " + m, + m.contains("OSTN15_NTv2_OSGBtoETRS.gsb")); + assertTrue("must name the modern form too: " + m, + m.contains("uk_os_OSTN15_NTv2_OSGBtoETRS.tif")); + assertTrue("must name what would have been substituted: " + m, m.contains("EPSG:1314")); + assertTrue("must quantify the gap: " + m, m.contains("1.0 m worse than you asked for")); + } + + // And with the degradation accepted, the Helmert is selected and the loss is recorded. + CrsOperation degraded = Proj.createCrsToCrs(osgb, wgs84, ProjContext.builder() + .database(db) + .bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED) + .build()); + assertEquals("EPSG:1314", degraded.selectedOperation().get().authorityCode()); + assertEquals(2.0, degraded.accuracy().get().metres(), 0.0); + assertTrue("the degradation must be on the record: " + degraded.warnings(), + warningsContain(degraded, "EPSG:7710")); + } + + /** All ten {@code +datum=} names PROJ maps, resolved through the real index. */ + @Test + public void allTenProjDatumNamesResolveToRealCrss() { + String[][] expected = { + {"WGS84", "EPSG:4326"}, {"NAD83", "EPSG:4269"}, {"NAD27", "EPSG:4267"}, + {"GGRS87", "EPSG:4121"}, {"potsdam", "EPSG:4314"}, {"carthage", "EPSG:4223"}, + {"hermannskogel", "EPSG:4312"}, {"ire65", "EPSG:4299"}, {"nzgd49", "EPSG:4272"}, + {"OSGB36", "EPSG:4277"}, + }; + for (int i = 0; i < expected.length; i++) { + Crs crs = Proj.createCrs("+proj=longlat +datum=" + expected[i][0], ctx); + List candidates = Proj.candidateOperations(crs, + Proj.createCrs("EPSG:4326", ctx), ctx); + if ("WGS84".equals(expected[i][0])) { + assertTrue("+datum=WGS84 is EPSG:4326 itself, so there is no datum change", + candidates.isEmpty()); + continue; + } + assertFalse("+datum=" + expected[i][0] + " must reach " + expected[i][1] + + " and find operations there", candidates.isEmpty()); + } + } + + // ------------------------------------------------------------------ 4. axis order + + /** + * The database is what supplies authority axis order. + *

+ * {@code EPSG:6422} is (Geodetic latitude north, Geodetic longitude east) — which is why PROJ 6+ is + * latitude-first for {@code EPSG:4326} and proj4j 1.4.3 is not. {@code EPSG:4400} is (Easting, + * Northing) and {@code EPSG:4530} is (Northing, Easting): the pair that makes an + * authority-northing-first projected CRS look like a 4,652 km error when honoured on one side only. + */ + @Test + public void authorityAxisOrderIsReadFromTheDatabaseNotInferred() { + DbCoordinateSystem ellipsoidal = db.coordinateSystem("EPSG", "6422"); + assertNotNull(ellipsoidal); + assertEquals(2, ellipsoidal.axes().size()); + assertEquals("Geodetic latitude", ellipsoidal.axes().get(0).name()); + assertEquals("north", ellipsoidal.axes().get(0).orientation()); + assertEquals("Geodetic longitude", ellipsoidal.axes().get(1).name()); + assertEquals("east", ellipsoidal.axes().get(1).orientation()); + + DbCoordinateSystem eastingFirst = db.coordinateSystem("EPSG", "4400"); + assertEquals("Easting", eastingFirst.axes().get(0).name()); + assertEquals("Northing", eastingFirst.axes().get(1).name()); + + DbCoordinateSystem northingFirst = db.coordinateSystem("EPSG", "4530"); + assertEquals("authority northing-first, which is what EPSG:2393 uses", "Northing", + northingFirst.axes().get(0).name()); + assertEquals("Easting", northingFirst.axes().get(1).name()); + } + + /** + * The upstream quirk that makes an axis key {@code (cs auth, cs code, order, axis auth, axis code)} + * rather than {@code (cs, order)}: {@code PROJ:ENh}'s three axes are numbered 1, 2 and + * 2. + *

+ * Keying on {@code (cs, order)} leaves the last two tied, and a tiebreak silently puts the height + * before the northing. + */ + @Test + public void projEnhHasTwoAxesNumberedTwo() { + DbCoordinateSystem enh = db.coordinateSystem("PROJ", "ENh"); + assertNotNull(enh); + assertEquals(3, enh.axes().size()); + List axes = enh.axes(); + assertEquals("Easting", axes.get(0).name()); + assertEquals(1, axes.get(0).order()); + assertEquals("Northing", axes.get(1).name()); + assertEquals(2, axes.get(1).order()); + assertEquals("Ellipsoidal height", axes.get(2).name()); + assertEquals("upstream really numbers this 2, not 3", 2, axes.get(2).order()); + } + + // ------------------------------------------------------------------ 5. NKG visibility + + /** + * The NKG operations are made visible and what is missing is named — and nothing pretends + * to execute them. + *

+ * Their "method name" is a PROJ pipeline: {@code +proj=deformation +dt=15.829 + * +grids=eur_nkg_nkgrf17vel.tif}. Finishing them needs {@code +proj=deformation} plus a time + * dimension on the coordinate, not more data, and this test pins that the boundary is reported + * rather than crossed. + */ + @Test + public void nkgPipelineOperationsAreVisibleAndTheirGapIsNamed() { + DbOperation intraplate = db.operation("NKG", "DK_2020_INTRAPLATE"); + assertNotNull("the NKG rows are in the shipped index", intraplate); + assertTrue("its method name IS a PROJ pipeline, not a label", + intraplate.isProjStringMethod()); + assertTrue(intraplate.methodName(), intraplate.methodName().contains("+proj=deformation")); + assertTrue(intraplate.methodName(), intraplate.methodName().contains("+dt=15.829")); + assertTrue(intraplate.methodName(), + intraplate.methodName().contains("eur_nkg_nkgrf17vel.tif")); + + DbOperation concatenated = db.operation("NKG", "ETRF00_TO_DK"); + assertNotNull(concatenated); + assertEquals(DbObjectType.CONCATENATED_OPERATION, concatenated.kind()); + assertFalse("a concatenated operation has steps", concatenated.steps().isEmpty()); + } + + /** + * The other upstream quirk worth pinning: two concatenated operations number their steps 2 + * and 3, with no step 1, so {@code stepNumber()} is not an index into {@code steps()}. + */ + @Test + public void twoConcatenatedOperationsHaveNoStepOne() { + String[] codes = {"ITRF2000_TO_NKG_ETRF00", "ITRF2014_TO_NKG_ETRF14"}; + for (int i = 0; i < codes.length; i++) { + DbOperation op = db.operation("NKG", codes[i]); + assertNotNull(codes[i], op); + assertEquals(codes[i] + " has two steps", 2, op.steps().size()); + assertEquals(codes[i] + " numbers its first step 2, not 1, so stepNumber() is not an " + + "index into steps()", 2, op.steps().get(0).stepNumber()); + assertEquals(3, op.steps().get(1).stepNumber()); + } + } + + // ------------------------------------------------------------------ 6. determinism + + /** + * The ranking is a pure function of the index and the classpath: repeated calls, and re-sorting a + * shuffled copy, give a bit-identical order. + *

+ * Not a nicety. If any tier left two candidates tied, the result would depend on which index a row + * was found through, and two Spark executors would select different operations from the same bytes. + */ + @Test + public void selectionIsDeterministicOverTheWholeIndex() { + Crs source = Proj.createCrs("EPSG:4267", ctx); + Crs target = Proj.createCrs("EPSG:4269", ctx); + List first = codes(Proj.candidateOperations(source, target, ctx)); + for (int run = 0; run < 3; run++) { + assertEquals("repeated selection must give the same order", first, + codes(Proj.candidateOperations(source, target, ctx))); + } + List shuffled = + new ArrayList(Proj.candidateOperations(source, target, ctx)); + java.util.Collections.reverse(shuffled); + java.util.Collections.sort(shuffled); + assertEquals("reversing then re-sorting must reproduce the ranking exactly", first, + codes(shuffled)); + for (int i = 0; i < shuffled.size(); i++) { + for (int j = i + 1; j < shuffled.size(); j++) { + assertFalse(shuffled.get(i) + " and " + shuffled.get(j) + " compare equal, so their " + + "order depends on the sort's stability rather than on the data", + shuffled.get(i).compareTo(shuffled.get(j)) == 0); + } + } + } + + // ------------------------------------------------------------------ 7. introspection + + /** {@code databaseVersion()} comes from the index's own {@code metadata} table. */ + @Test + public void theVersionIsReadFromTheIndexsOwnMetadata() { + DatabaseInfo info = Proj.databaseInfo(ctx); + assertTrue(info.isDatabasePresent()); + assertEquals("9.8.1", info.metadata().get("PROJ.VERSION")); + assertTrue(info.version().get(), info.version().get().startsWith("PROJ 9.8.1, EPSG ")); + assertTrue(info.epsgVersion().isPresent()); + assertTrue(info.databaseName().get(), info.databaseName().get().startsWith("pjdx")); + assertTrue("describe() must state where the bytes came from: " + info.describe(), + info.describe().contains(info.databaseName().get())); + } + + /** + * An authority code the legacy dictionary cannot resolve — because it is not on this classpath at + * all — is resolved from the database, for geodetic CRSs. + */ + @Test + public void geodeticCrssResolveFromTheDatabaseWithNoLegacyDictionary() { + Crs nad27 = Proj.createCrs("EPSG:4267", ctx); + assertTrue("this CRS came from the database, and says so", nad27.isDatabaseDerived()); + assertEquals("NAD27", nad27.name()); + assertTrue(nad27.isGeographic()); + assertEquals("[EPSG:4267]", nad27.identifiers().toString()); + assertTrue("the authority's own row must be reachable", nad27.authorityRecord().isPresent()); + assertEquals("EPSG:6267", nad27.authorityRecord().get().datum().authorityCode()); + + // Area of use is read, and reported as database-derived rather than as a document's claim. + assertTrue("EPSG:4267 declares a usage: " + nad27.describe(), nad27.areaOfUse().isPresent()); + assertTrue(nad27.areaOfUse().get().isDatabaseDerived()); + + // A projected CRS is deliberately NOT built from the database: turning 4,312 conversion rows + // into Projections is where a mis-slotted parameter becomes a plausible coordinate in the wrong + // place, and the legacy dictionary already carries those. + try { + Proj.createCrs("EPSG:27700", ctx); + fail("a projected CRS must not be built from the database in this release"); + } catch (CrsCreationException expected) { + assertEquals(ErrorCause.DATABASE_UNAVAILABLE, expected.cause()); + assertTrue(expected.getMessage(), + expected.getMessage().contains("only the legacy dictionary can build")); + } + } + + /** + * {@link BallparkPolicy#ALLOW} plus {@link BestOperationPolicy#ALLOW_DEGRADED} is what it takes to + * get a coordinate out of this deployment, and it says exactly what was given up. + */ + @Test + public void bothConcessionsAreNeededToGetACoordinateWithNoGrids() { + ProjContext lenient = ProjContext.builder() + .database(db) + .ballparkPolicy(BallparkPolicy.ALLOW) + .bestOperationPolicy(BestOperationPolicy.ALLOW_DEGRADED) + .build(); + CrsOperation op = Proj.createCrsToCrs("EPSG:4267", "EPSG:4269", lenient); + assertTrue("with no grid at all, the only thing left is the ballpark offset", + op.isBallparkTransformation()); + assertFalse("which never has a stated accuracy, in PROJ either", op.accuracy().isPresent()); + assertTrue("and what was given up must be named: " + op.warnings(), + warningsContain(op, "EPSG:1241")); + assertTrue("as the largest degradation there is: " + op.warnings(), + warningsContain(op, "largest degradation there is")); + } + + /** Every grid the selected operation needs is reported as unreachable with its probe order. */ + @Test + public void unreachableGridsReportEveryNameThatWasTried() { + CrsOperationCandidate candidate = byCode(Proj.candidateOperations( + Proj.createCrs("EPSG:4267", ctx), Proj.createCrs("EPSG:4269", ctx), ctx), + "EPSG:1241"); + GridInfo slot1 = candidate.grids().get(0); + assertFalse(slot1.isAvailable()); + assertEquals("the modern name is tried first, then the pre-PROJ-7 one, then the authority's", + "[us_noaa_conus.tif, conus, conus.las]", slot1.probedNames().toString()); + assertTrue(slot1.skipReason().get(), slot1.skipReason().get().contains("us_noaa_conus.tif")); + assertTrue("the CDN URL is information for a human and never an action", + slot1.knownUrl().get().startsWith("https://cdn.proj.org/")); + assertFalse("core contains no network code, so a URL never makes a grid available", + slot1.isAvailable()); + } + + // ------------------------------------------------------------------ helpers + + private static CrsOperationCandidate byCode(List candidates, + String authorityCode) { + for (int i = 0; i < candidates.size(); i++) { + if (authorityCode.equals(candidates.get(i).authorityCode())) { + return candidates.get(i); + } + } + throw new AssertionError(authorityCode + " is not among " + codes(candidates)); + } + + private static List codes(List candidates) { + List out = new ArrayList(candidates.size()); + for (int i = 0; i < candidates.size(); i++) { + out.add(candidates.get(i).authorityCode()); + } + return out; + } + + private static boolean warningsContain(CrsOperation op, String needle) { + List warnings = op.warnings(); + for (int i = 0; i < warnings.size(); i++) { + if (warnings.get(i).contains(needle)) { + return true; + } + } + return false; + } +} diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..45fdf05 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,109 @@ +# A clean, pinned Linux build environment for proj4j's five check suites. +# +# WHY THIS EXISTS. Running the suites on the authoring Mac is unconvincing: the JDK, the OS, the +# default Locale and a ~/.m2 full of other agents' snapshots all differ from any real runner. This +# image fixes all four. It is not a replacement for .github/workflows/** - docker/run.sh reuses +# those workflows' exact Maven commands so the two cannot drift. +# +# PINNING. +# * Base image is pinned by DIGEST, not just by tag. The digest below is the multi-arch manifest +# LIST digest, so it resolves to linux/arm64 on this Apple Silicon host and to linux/amd64 on a +# normal CI runner - the same pin, two architectures. `docker buildx imagetools inspect` on it +# shows both. +# * Maven is fetched from archive.apache.org (immutable, unlike dlcdn) and its tarball is checked +# against the SHA-512 Apache publishes. 3.9.16 is the version on the authoring machine. +# * apt package versions are NOT pinned. They are ca-certificates/curl/git/rsync/locales only - +# nothing on the measurement path - and pinning them would make the image un-buildable the +# first time Ubuntu rolls a point release. This is the one genuinely floating input; it is +# called out in docker/README.md rather than hidden. +# +# DELIBERATELY NOT INSTALLED: `bc`. Three of the workflows' guard steps say in a comment that they +# use awk "because bc is not guaranteed present on every runner image". Leaving bc out keeps that +# claim under test instead of taking it on trust - if a guard ever grows a `bc` call it will die +# here rather than on a runner. + +FROM eclipse-temurin:21.0.11_10-jdk-noble@sha256:35685c7e23352983a48882d97cd9875f5284c228db71d1e2476e5e6c1bab1080 + +# 3.9.16, and the SHA-512 as published at +# https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz.sha512 +ARG MAVEN_VERSION=3.9.16 +ARG MAVEN_SHA512=831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6 + +RUN set -eux; \ + apt-get update; \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + rsync \ + locales \ + procps \ + tzdata; \ + rm -rf /var/lib/apt/lists/*; \ + # The reference environment of ci.yaml's blocking determinism leg is en_US / UTF-8 / UTC. + # The base image generates only C.UTF-8, so en_US.UTF-8 would silently fall back to C - + # ci.yaml's own `locale-gen` step exists for exactly this and is mirrored here. + sed -i 's/^# *en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen; \ + locale-gen en_US.UTF-8 + +# OPTIONAL CORPORATE CA, AND IT IS A HOST QUIRK RATHER THAN PART OF THE DESIGN. +# +# The machine this was written on sits behind a TLS-intercepting firewall: archive.apache.org and +# repo.maven.apache.org both present a certificate issued by an internal CA, so an un-doctored +# container gets `curl: (60) SSL certificate problem: self-signed certificate in certificate chain` +# and Maven cannot resolve a single dependency. docker/run.sh detects the host's bundle (from +# $SSL_CERT_FILE / $REQUESTS_CA_BUNDLE / /etc/ssl/certs/*-ca-bundle.crt) and drops it into the build +# context; if there is none - which is the case on a normal machine and on GitHub Actions - +# extra-ca.crt is written EMPTY and this stage does nothing at all. +# +# Two truststores have to be taught, not one: `update-ca-certificates` covers curl/git, and a +# separate keytool import covers the JVM, whose cacerts file the OS store does not feed. Missing the +# second half looks like a Maven "peer not authenticated" failure with a working `curl`. +COPY extra-ca.crt /tmp/extra-ca.crt +RUN set -eux; \ + if [ -s /tmp/extra-ca.crt ]; then \ + cp /tmp/extra-ca.crt /usr/local/share/ca-certificates/extra-ca.crt; \ + update-ca-certificates; \ + csplit -z -s -f /tmp/cacert- -b '%02d.pem' /tmp/extra-ca.crt '/-----BEGIN CERTIFICATE-----/' '{*}'; \ + for f in /tmp/cacert-*.pem; do \ + keytool -importcert -noprompt -trustcacerts -cacerts -storepass changeit \ + -alias "extra-$(basename "$f" .pem)" -file "$f" >/dev/null || true; \ + done; \ + rm -f /tmp/cacert-*.pem; \ + echo "injected $(grep -c 'BEGIN CERTIFICATE' /tmp/extra-ca.crt) extra CA certificate(s)"; \ + else \ + echo "no extra CA bundle supplied - using the stock trust stores"; \ + fi; \ + rm -f /tmp/extra-ca.crt + +RUN set -eux; \ + curl -fsSL -o /tmp/maven.tar.gz \ + "https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz"; \ + printf '%s /tmp/maven.tar.gz\n' "${MAVEN_SHA512}" | sha512sum -c -; \ + mkdir -p /opt/maven; \ + tar -xzf /tmp/maven.tar.gz -C /opt/maven --strip-components=1; \ + rm -f /tmp/maven.tar.gz; \ + ln -s /opt/maven/bin/mvn /usr/local/bin/mvn; \ + mvn -v + +# The working tree is copied out of a read-only bind mount into /work, so it is owned by root and +# git's dubious-ownership check is not in play - but the copy also brings .git, which jgitver reads +# to compute the version. Set it anyway: the failure mode is a confusing "detected dubious +# ownership" during the reactor build, which looks nothing like its cause. +RUN git config --global --add safe.directory '*' + +# The reference environment. ci.yaml's blocking determinism leg is en_US / UTF-8 / UTC / x64; every +# other leg in that matrix is advisory. Reproducing the blocking one is the useful default. +ENV LANG=en_US.UTF-8 \ + LC_ALL=en_US.UTF-8 \ + TZ=UTC \ + MAVEN_OPTS="-Xmx2g" + +# docker/run.sh reads this to decide whether it is the host driver or the in-container runner. It +# lives in the image rather than being passed with -e so that `docker run bash` also lands +# in the right mode. +ENV PROJ4J_IN_CONTAINER=1 + +WORKDIR /work +ENTRYPOINT ["/bin/bash"] +CMD ["/src/docker/run.sh", "all"] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..93c0969 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,338 @@ +# Running neoproj4j's checks in a container + +`./docker/run.sh` runs the project's five check suites in a clean Linux container on a pinned +Temurin 21, using **the same commands the GitHub workflows use**. It exists because a run on the +authoring Mac is not evidence about a runner: the JDK, the OS, the default `Locale` and a `~/.m2` +full of other agents' snapshots all differ, and three of those have produced a wrong answer on this +project before. + +It is **an additional way to run the same checks**. It does not replace `.github/workflows/**`, it +is not wired into any `pom.xml`, and nothing outside `docker/` was touched to add it. + +``` +docker/ + Dockerfile pinned Temurin 21.0.11 + Apache Maven 3.9.16, SHA-512 checked + run.sh the single entry script - host driver AND in-container runner + README.md this file +``` + +## Quick start + +```bash +./docker/run.sh # the four default checks (measured: 1m56s warm, 2m39s cold) +./docker/run.sh conformance # just one +./docker/run.sh ci golden # any subset +./docker/run.sh bench # the opt-in performance gate (measured: 15m47s) +./docker/run.sh --help +``` + +Logs, reports and a machine-readable `results.tsv` land in `/tmp/neoproj4j-docker-out` (change with +`--out DIR`). The working tree is **copied** into the container out of a read-only bind mount, so +`mvn clean install` in the container cannot touch the host's `target/` directories - which matters +here, because several agents build this tree concurrently. + +## What each check is, and what it measured + +Measured in the container on 2026-08-01, at `726cf2c` + 32 dirty +files, Temurin 21.0.11 / aarch64 / Ubuntu 24.04: + +| check | mirrors | verdict | measured | +|---|---|---|---| +| `ci` | `ci.yaml` / `build-and-test` | **PASS** *(re-measured 2026-08-03)* | `2320 tests, 0 failures, 4 skipped` in 223 report files, whole 7-module reactor `BUILD SUCCESS`. Module split: core **1917** (3 skipped), conformance 345 (1 skipped), db **52**, geoapi 6, grids-us-legacy 0. **Trail of this number:** `1792` on 2026-08-01 (`maven-javadoc-plugin:jar (attach-javadocs)` failed on `neoproj4j-db`, stopping the reactor before `db` and `conformance`), `2142` on 2026-08-02 once that was fixed (core 1749, db 42), `2320` today — +171 in `core` and +10 in `db`, all of it new tests from the security/perf hardening rounds, **0 pre-existing tests broken at any point**. | +| `conformance` | `conformance.yaml` / `corpus` | PASS | `7441/7900` genuine passes, `regressed 0`, 7,923 assertions evaluated | +| `golden` | `golden.yaml` / `golden` | **FAIL (expected)** | `2291 UNEXPLAINED`, **42/42** rules pinned, no `COUNT_MISMATCH`/`DEAD_RULE`/`EXPIRED_RULE`/`PENDING_RULE_FIRED`. Full split `12012 UNCHANGED · 41418 CHANGED · 0 ADDED · 0 REMOVED · 39127 INTENDED` over 53,430 rows. The 42nd rule is `NUM-LAEA-HYPOT-TO-NORM2`, which owns exactly 2 rows | +| `determinism` | `determinism.yaml` / `bits` (one leg) | PASS | `22 tests, 0 failures` | +| `bench` | `bench.yaml` / `gate` | PASS *(re-measured 2026-08-03)* | `0 breaches`, **`245 gated, 0 EXCLUDED`, 245 arms**, `245 of 245 arms carry an allocation measurement`, in **21 m 23 s**. Was `172 gated, 9 EXCLUDED, 181 arms` on 2026-08-02: **+64 arms** because `BulkTransformBenchmark` came out of the `staged` package and into the gate, and **−9 exclusions** because `crs-parse` rejoined Tier 1 when `io/InitFileCache` removed the per-call re-scan that made it flake | + +**Failures are classified, not just counted.** An expected failure appears as `FAIL(expected)` with +its reason spelled out and does not set the exit code; anything else is `FAIL` and does. Neither +expectation is hardcoded to a verdict - each is re-derived from the run: + +* **`ci`** is an expected failure *only while the one failing class is `MetaCRSTest`*, which reads + `epsg/src/main/resources/proj4/proj4-epsg.csv`. **That regeneration has landed and so has the + `neoproj4j-db` javadoc fix**: as of 2026-08-02 `ci` is simply **green** — `2320 tests, 0 failures` when + re-measured 2026-08-03, `BUILD SUCCESS` across all seven modules — and the runner says so, reporting + that the `MetaCRSTest` expectation no longer applies. The `MetaCRSTest` branch is retained because it + is still correct on a tree with the old CSV. **This means `run.sh`'s own header comment — `ci … + FAILS on MetaCRSTest only` — describes a tree that no longer exists.** The re-derivation is what + saves it: the script does not hardcode the verdict, it recomputes the expectation from the run, and + the summary prints `green; the MetaCRSTest expectation no longer applies`. Read the summary, not the + header. +* **`golden`** is an expected failure *only while its failure is `UNEXPLAINED` rows and nothing + else*. `COUNT_MISMATCH`, `DEAD_RULE`, `EXPIRED_RULE` and `PENDING_RULE_FIRED` are checked for + separately and are reported as **real** failures, because they mean the rule set has stopped + describing the tree. The 2,291 unexplained rows are a triage backlog owned by the streams that + caused them; the gate goes green one rule at a time. + +Exit code: `0` if every check either passed or failed in its expected, explained way; `1` if +anything else failed, including a floor assertion or a check that produced no verdict at all. Pass +`--strict` to make an expected failure exit non-zero too. + +## Two findings this runner surfaced on its first real use + +Both were invisible before because `core`'s red test phase stopped every reactor early. + +**1. ~~`mvn clean install` - the exact `ci.yaml` command - now fails in `neoproj4j-db`, with every test +green.~~ FIXED — re-measured green in the container on 2026-08-02, whole reactor `BUILD SUCCESS`. +Retained as the record of the defect and of the A/B/C that isolated it.** + +``` +Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:3.5.0:jar + (attach-javadocs) on project proj4j-db +error: No source files for package org.locationtech.proj4j.db.gen +``` + +`db/pom.xml` sets `Automatic-Module-Name: org.locationtech.proj4j.db`, which puts +`maven-javadoc-plugin` into module mode - the generated `db/target/apidocs/options` carries +`--add-modules ALL-MODULE-PATH` and `--patch-module org.locationtech.proj4j.db=…`. The same pom's +`maven-jar-plugin` excludes `org/locationtech/proj4j/db/gen/**` from the artifact, so the module on +the module path has no such package, while the plugin's `packages` file still lists it. Confirmed +with a three-way A/B/C in one frozen container workspace, the host tree untouched: + +| | result | +|---|---| +| A unmodified | exit 1, one `No source files for package` error | +| B without the jar `` of `db/gen` | exit 0 | +| C without `Automatic-Module-Name` | exit 0 | + +So it needs **both** conditions; neither alone is the defect. Not fixed here - `docker/**` is this +change's whole scope. + +**2. ~~`determinism.yaml`'s `EXPECTED_TESTS=15` is stale.~~ FIXED UPSTREAM 2026-08-02, and this +runner has been brought back into step.** The finding as written was: 22 tests match the `-Dtest` +pattern, the extra 7 being `NoAmbientLocaleInCoreTest`, so the workflow's *exact-count* guard would +have failed on its first run — the same catch its own header records happening before at 9-vs-15. + +`determinism.yaml` has since replaced the exact count with **`DET_FLOOR_TESTS=22`, a floor**, and +reports an upward drift as a `::notice::` rather than failing. So the workflow is no longer stale in +that direction, and this runner's own constants were stale in the *opposite* one — it still held a +floor of 15 and still described the workflow as pinning an exact count. Both are now **22**, and the +drift branch reports a rise rather than accusing the workflow of being about to go red. + +Re-derived rather than copied: `mvn -pl core -am test -Dtest='org.locationtech.proj4j.determinism.*Test'` +on Temurin 21 / aarch64 reports **22 tests** across four surefire XMLs (`StrictMathGoldenTableTest` 6, +`NanBitPatternTest` 3, `NoAmbientLocaleInCoreTest` 7, `NoJdkAngleConversionTest` 6), cross-checked +against **22 `@Test` methods** in the package's sources. Raise both constants together when tests are +added — it is a ratchet, not a ceiling. + +## Proving the container can fail + +A verification without a positive control is a claim. Three controls, all runnable: + +### 1. A deliberately broken check is caught + +```bash +./docker/run.sh conformance --break-conformance ; echo "exit=$?" +``` + +This removes one row from `gie-expected-failures.tsv` **in the container's throwaway copy** - never +the host tree, which is mounted read-only. The manifest lists only assertions that are *not* +expected to pass, so deleting a row asserts that a known-failing assertion now passes. Measured: + +``` +========== POSITIVE CONTROL: removing one manifest row from the container's copy ========== + key: gie/4D-API_cs2cs-style.gie#11:0@c4fe674b +... +diff.regressed = 1 +!! REGRESSION: diff.regressed=1 -- see conformance/target/conformance/differences.txt +REGRESSED (was expected to pass, did not) - 1 + gie/4D-API_cs2cs-style.gie#11:0@c4fe674b expected=PASS observed=FAIL + detail: operation could not be created: NOT_IMPLEMENTED: InvalidValueException: + Unknown projection: helmert + +conformance FAIL 0m09s 7441/7900 genuine passes; diff.regressed=1 +0 passed, 0 failed AS EXPECTED, 1 failed unexpectedly +exit=1 +``` + +Note that the non-vacuity numbers are all still satisfied - 7,923 assertions swept, 7441/7900 passes +- so this is a *targeted* red, not a broken run. The removed key is written to +`/broken-manifest-key.txt` and the whole control block to `/control.log`, so it is +auditable after the fact. This is the same control `conformance.yaml`'s header records having been +run by hand. Afterwards, `git status conformance/` on the host shows no new modification: the sweep +that went red never touched a committed input. + +### 2. The all-checks run distinguishes expected from unexpected failures + +The tally has three separate terms, not two, and the run above happens to exercise all three: + +``` +CHECK VERDICT TIME MEASURED +ci FAIL 1m19s 1792 tests, 0 test failures, exit 1; Failed to execute goal + org.apache.maven.plugins:maven-javadoc-plugin:3.5.0:jar + (attach-javadocs) on project proj4j-db +conformance PASS 0m06s 7441/7900 genuine passes, regressed 0, 7923 evaluated +golden FAIL(expected) 0m26s 2291 UNEXPLAINED rows, 41/41 rules pinned, no + COUNT_MISMATCH/DEAD_RULE/EXPIRED_RULE/PENDING_RULE_FIRED +determinism PASS 0m04s 22 tests, 0 failures (one leg: aarch64 / Temurin 21) + +2 passed, 1 failed AS EXPECTED, 1 failed unexpectedly (total 1m56s) -> exit 1 +``` + +`golden` and `ci` both failed; only one of them set the exit code. That discrimination is not a +scripted demo - `ci`'s expectation was written for `MetaCRSTest`, the tree moved underneath it, and +the runner correctly refused to call the new failure expected. + +**That transcript is from 2026-08-01 and is kept because it exercises all three terms of the tally. +Re-measured 2026-08-03, `ci` reads `PASS 2320 tests, 0 failures` and `golden` reads +`2291 UNEXPLAINED rows, 42/42 rules pinned`**, so a run today shows two terms, not three +(`3 passed, 1 failed AS EXPECTED, 0 failed unexpectedly`, total `0m46s`, exit 0); the positive +control in §1 is the one that still demonstrates the third on demand. + +### 3. The container actually ran the tests + +Every check asserts a floor on its own test count, and prints the count whether it passes or fails, +because *"three of this project's four gates were decorative because nobody checked they had +actually executed"* is the failure this runner is built against. + +| check | floor asserted | measured in the container | +|---|---|---| +| `ci` | ≥ 1,700 tests across all surefire XMLs | **2,320 tests** in 223 report files, 0 failures, 4 skipped *(re-measured 2026-08-03; 2,142 in 202 files on 2026-08-02; 1,792 in 175 files on 2026-08-01, before the `neoproj4j-db` javadoc fix let `db` and `conformance` reach their test phases)*. **The floor is a ratchet, not a ceiling — raise it deliberately, but note that 1,700 is now 620 below the reading, so it would no longer catch an entire module dropping out.** | +| `conformance` | `GieConformanceTest` ≥ 7,900 tests; ≥ 25 other classes; `evaluated == index keys`; 0 skips outside the sweep; `skipped == still_failing` | **7,971 sweep tests**, **7,923 assertions evaluated** against a 7,923-key index, 26 other classes, 0 outside skips, 482 == 482 *(unchanged, 2026-08-03)* | +| `golden` | exactly 1 `GoldenMasterTest`, 0 skips; generated row count == baseline; ≥ 40 tests in the module | **53,431 rows** generated vs 53,431 baseline, **58 tests**, 0 skips *(unchanged, 2026-08-03)* | +| `determinism` | ≥ 22 tests, 0 skips, ≥ 2 report files | **22 tests** in 4 classes, 0 failures *(unchanged, 2026-08-03)* | +| `bench` | ≥ 20 JMH arms and ≥ 20 arms carrying `gc.alloc.rate.norm` | see the `bench` row in the table at the top of this file | + +A check that produces no verdict line at all is counted as a failure, not skipped over. + +**One difference from the Mac worth knowing:** `NoGeoApiInCoreTest` reports 2 skips and +`Proj4VariousTest` 1 in every container run. That is the documented `Assume` on the jar-scanning +legs, which surefire runs before `maven-jar-plugin` on a *clean first build*. The container is +always a clean first build, so on this machine those legs never execute - on a laptop with a warm +`target/` they do. The runner prints the skip counts rather than swallowing them. + +## Traps this is written against + +Each of these has produced a false green on this project, and each is guarded here: + +* **`-Dmaven.test.failure.ignore=true` forces exit 0.** It appears nowhere in `docker/`. Getting + past `core`'s expected `MetaCRSTest` failure is done with `-Dtest=` narrowing, exactly as the + workflows do. +* **Surefire's `*` does not cross a package separator.** `conformance` needs `**` because its tests + live in `bridge/ manifest/ parse/ report/ runner/`; `golden` and `determinism` are flat and use + `*`. A pattern that matches nothing prints `No tests to run.` then `BUILD SUCCESS`. +* **`mvn install` installs nothing** here - the root pom sets `maven.install.skip` as a property. + That is fine, because every command uses `-am` rather than relying on installed artifacts, and it + is why the `~/.m2` scrub below is about third-party jars, not neoproj4j ones. +* **`-Djgitver.skip=true` is required whenever `-Dmaven.repo.local` is non-default.** It is + deliberately **not** passed: the container's Maven repository *is* the default `~/.m2`, which is + precisely what makes these invocations byte-identical to the workflows'. `.git` is copied into the + container so jgitver resolves the version the same way it does after `actions/checkout`. +* **`bc` is not installed**, on purpose. Three workflow guard steps claim in a comment that they use + `awk` "because `bc` is not guaranteed present on every runner image". Leaving it out keeps that + claim under test. +* **A NUL byte in a source file makes `grep` skip it silently.** Nothing here greps sources; if that + changes, use `grep -a`. +* **Stale artefacts cannot satisfy a guard.** Each check deletes the report directories it is about + to assert on *before* running, so every number in the summary was produced by that invocation. +* **A locally built snapshot in the cache cannot satisfy a later run.** `~/.m2/repository/io/github/emilevictor/neoproj4j` + is scrubbed after every check, mirroring the last step of every workflow. With a persistent cache + volume that is a standing hazard here, not just a CI one. + +## The Maven cache, and how to distrust it + +`~/.m2` lives in a named Docker volume (`neoproj4j-m2`) so repeat runs are fast. A stale cache is +exactly the kind of thing that makes a green run untrustworthy, so it is trivially resettable: + +```bash +./docker/run.sh --reset-cache # delete the volume, then run cold +docker volume rm neoproj4j-m2 # same thing, by hand +docker volume inspect neoproj4j-m2 # where it lives, how old it is +``` + +Measured: a cold run of the four default checks is 2 m 39 s against 1 m 56 s warm, so the cache is +worth about 45 seconds and nothing else. **If a result differs between a warm and a cold run, the +cache is the finding** - the volume is where a stale inter-module jar would hide, which is why every +check scrubs `io/github/emilevictor/neoproj4j` out of it afterwards. + +## Architecture, and what that means for `bench` + +The image is built for the host's architecture: **`arm64` on this Apple Silicon machine, `amd64` on +almost any CI**. The base image is pinned by its multi-arch manifest-list digest, so both resolve +from the same pin. Use `docker build --platform linux/amd64` (or `--platform` on `docker run`) if +you want the x86-64 image under emulation, but expect it to be several times slower and do not take +`bench` numbers from an emulated run at all. + +**The allocation baseline was captured on aarch64/macOS.** `gc.alloc.rate.norm` is a property of the +bytecode and both platforms use compressed oops, so the numbers *should* agree - but the gate's +slack is deliberately tight, `max(0.5 B, 0.1%)`. If a run on amd64 fails by small deltas across many +arms, **that is a portability finding, not a regression**: re-record on that architecture. Do not +widen the slack and do not raise a ratchet. + +## Why `bench` is opt-in + +Measured at **21 m 23 s** in the container on 2026-08-03 (was 15 m 47 s at 181 arms; the arm count is +now **245**), and it wants a quiet machine. JMH shards one invocation per benchmark class; sharing the +box does not make it lie - `gc.alloc.rate.norm` is a bytecode property - but it does make it slow, and +a twenty-minute default would stop people running the other four, which together take **46 s**. It is +also the only check that is a *measurement* rather than a comparison, so it belongs in a deliberate run +rather than in a habit. + +```bash +./docker/run.sh bench +``` + +## What this reproduces faithfully, and what it does not + +Faithful: every `mvn` invocation, flag for flag, and every non-vacuity guard, translated from the +workflow that owns it. + +Not reproduced, with reasons: + +* **`determinism.yaml`'s `cross-arch` job.** Its three assertions are properties of a six-leg matrix + (x86-64 × aarch64 × JDK 11/17/21). In particular the non-vacuity check - *at least one leg must + show `Math` diverging from the golden* - **cannot** be made inside a single leg: on + Temurin 11/aarch64 the true value is 0, so an in-leg assertion would ship a permanently red leg + for a non-defect. This container runs one leg and *reports* its divergence (298 of 54,265 on + aarch64/JDK 21) without asserting on it. +* **`ci.yaml`'s `jdk-ea`, `jdk8-runtime`, and the three advisory `determinism` locale legs.** They + need a second or third JDK in the image and, for the locale legs, a different ambient environment + per leg. The container fixes en_US/UTF-8/UTC - `ci.yaml`'s single *blocking* leg. +* **`conformance.yaml`'s `vendored-corpus-matches-upstream` and `upstream-drift`.** Both clone + `OSGeo/PROJ` (a full clone for the pinned job, because `sync-upstream.sh` resolves the tag by + name). That is a network-heavy job about the corpus's provenance, not about neoproj4j's behaviour, + and it is left to CI. +* **The multi-JDK `ci.yaml` matrix (17 and 21).** The image carries Temurin 21 only. + +## The corporate-CA accommodation + +The machine this was written on sits behind a TLS-intercepting firewall, so `archive.apache.org` and +`repo.maven.apache.org` present certificates issued by an internal CA and an un-doctored container +cannot download anything. `run.sh` detects the host bundle - `$PROJ4J_DOCKER_CA`, then +`$SSL_CERT_FILE`, then `$REQUESTS_CA_BUNDLE`, then `/etc/ssl/certs/ca-bundle.crt` - and the +Dockerfile installs it into **both** trust stores: `update-ca-certificates` for curl and git, and a +`keytool` import for the JVM, whose `cacerts` the OS store does not feed. Missing the second half +looks like a Maven "peer not authenticated" error next to a perfectly working `curl`. + +On a machine without such a bundle, and on GitHub Actions, `extra-ca.crt` is written empty and that +whole stage is a no-op. **This is the one place where the image is not identical to what a runner +would build**, and it is the one genuinely floating input alongside the unpinned `apt` packages +(`ca-certificates curl git rsync locales procps tzdata` - none on the measurement path). + +## Measured wall-clock + +18-core Apple Silicon, Docker Desktop with 7.7 GiB, `linux/arm64`. Every figure below was timed, not +estimated. + +| | warm `~/.m2` | warm, re-measured 2026-08-03 | cold `~/.m2` (`--reset-cache`) | +|---|---:|---:|---:| +| image build (`--no-cache`, includes the Maven download) | — | — | 55 s | +| `ci` (`mvn clean install`, whole reactor) | 79 s | **28 s** | 119 s | +| `conformance` | 6 s | **6 s** | 7 s | +| `golden` | 26 s | **6 s** | 27 s | +| `determinism` | 4 s | **5 s** | 3 s | +| **default run, all four** | **1 m 56 s** | **0 m 46 s** | **2 m 39 s** | +| `bench`, opt-in | 15 m 47 s | **21 m 23 s** (245 arms, was 181) | — | + +The 2026-08-03 column was taken on a fully warm image and volume; `ci`'s 28 s against 79 s is the +compile cache, not a change in the build. **Only `bench` is a real movement**, and it is arms, not +speed: 245 arms against 181. + +A cold cache costs about 45 extra seconds, all of it in whichever check runs first. The image build +is a one-off; after it, `docker build` is a cached no-op of about a second. + +Two notes on why these are lower than the workflows' timeout budgets. The default run shares one +`/work` across its four checks, so `conformance`, `golden` and `determinism` reuse the classes `ci` +compiled - each check still deletes the report directories it asserts on, so no number is inherited, +but the *compile* is. And a single-check invocation gets a fresh container and does compile from +scratch: `conformance` alone is 9 s including a 360-file `core` compile on this machine. diff --git a/docker/run.sh b/docker/run.sh new file mode 100755 index 0000000..fcde44d --- /dev/null +++ b/docker/run.sh @@ -0,0 +1,910 @@ +#!/usr/bin/env bash +# +# neoproj4j check runner - one script, two modes. +# +# ON THE HOST it builds docker/Dockerfile, then re-executes ITSELF inside the container. +# IN CONTAINER ($PROJ4J_IN_CONTAINER is set by the image) it copies the working tree out of the +# read-only /src mount into /work and runs the checks there. +# +# WHY IT MIRRORS .github/workflows RATHER THAN INVENTING COMMANDS. Every Maven invocation below is +# copied from the committed workflow that owns that check, flag for flag, and every guard step is a +# translation of that workflow's own non-vacuity step. If a workflow changes and this does not, the +# two disagree and the disagreement is the bug - there is deliberately no second, parallel account +# of how the suites are run. +# +# check mirrors expected today +# ------------ ----------------------------------- ------------------------------------------ +# ci ci.yaml job build-and-test FAILS on MetaCRSTest only (see below) +# conformance conformance.yaml job corpus passes, 7441/7900, regressed 0 +# golden golden.yaml job golden FAILS on ~2,291 UNEXPLAINED rows +# determinism determinism.yaml job bits (one leg) passes, 22 tests +# bench bench.yaml job gate passes; OPT-IN, ~16 min, needs a quiet box +# +# TWO OF THESE ARE EXPECTED TO FAIL, AND THE SUMMARY SAYS WHICH AND WHY. They are reported as +# EXPECTED-FAIL, not as PASS: the check really did fail, and the run prints its measured numbers. +# The expectation is not hardcoded to a verdict either - each is re-derived from the run: +# +# * ci is EXPECTED-FAIL only while the ONLY failing class is MetaCRSTest, whose input +# (epsg/src/main/resources/proj4/proj4-epsg.csv) is stale and is being regenerated. If ci goes +# green the summary says so. If anything ELSE fails, it is an unexpected failure and the run +# exits non-zero. Neither outcome is baked in. +# * golden is EXPECTED-FAIL only while its failure is UNEXPLAINED rows and nothing else. A +# COUNT_MISMATCH, DEAD_RULE, EXPIRED_RULE or PENDING_RULE_FIRED is a real failure and is +# reported as one, because those mean the rule set has stopped describing the tree. +# +# TRAPS THIS SCRIPT IS WRITTEN AGAINST. Each of these has produced a false green on this project: +# +# 1. -Dmaven.test.failure.ignore=true forces exit 0. It appears nowhere here. When the exit code +# IS the measurement it cannot be used, and getting past core's expected MetaCRSTest failure +# is done with -Dtest= narrowing instead, exactly as the workflows do. +# 2. Surefire's single `*` does not cross a package separator. The conformance tests live in +# sub-packages (bridge/ manifest/ parse/ report/ runner/) and need `**`; golden's and +# determinism's are flat and use `*`. A pattern that matches nothing prints BUILD SUCCESS. +# 3. EVERY CHECK ASSERTS A FLOOR ON ITS TEST COUNT. A container that runs nothing cannot report +# success. This is the specific failure the project has hit repeatedly. +# 4. `bc` is not installed in the image, on purpose. All arithmetic here is shell or awk. +# 5. grep is line-oriented and a single NUL byte makes it skip a whole file silently. Nothing +# here greps sources, but if that changes, use `grep -a`. +# 6. -Djgitver.skip=true is required whenever -Dmaven.repo.local is non-default. It is NOT passed +# here and must not be: the container's Maven repository is the default ~/.m2, which is what +# makes these commands byte-identical to the workflows'. +# 7. Every guard reads a report file this invocation produced. The report directories are deleted +# before each check runs, so a stale artefact from an earlier check cannot satisfy a guard. +# +# EXIT CODE: 0 if every requested check either PASSED or failed in its expected, explained way; +# 1 if any check failed for any other reason (including a floor assertion). Pass --strict to make +# an expected failure exit non-zero too. + +set -uo pipefail + +IMAGE_DEFAULT='neoproj4j-checks:temurin-21.0.11' +VOLUME_DEFAULT='neoproj4j-m2' +OUT_DEFAULT='/tmp/neoproj4j-docker-out' +ALL_CHECKS='ci conformance golden determinism' # bench is opt-in; see README + +usage() { + cat <<'EOF' +Usage: ./docker/run.sh [checks...] [options] + +Checks (default: all) + all ci + conformance + golden + determinism (bench is NOT included) + ci mvn clean install - mirrors ci.yaml/build-and-test + conformance the PROJ 9.8.1 gie/GIGS corpus sweep - mirrors conformance.yaml/corpus + golden the 53,430-row behavioural sweep - mirrors golden.yaml/golden + determinism the raw-bit StrictMath golden, one leg - mirrors determinism.yaml/bits + bench the Tier 1/2 performance gate - mirrors bench.yaml/gate [~16 min] + +Options + --strict an EXPECTED failure also exits non-zero + --break-conformance POSITIVE CONTROL. Corrupt one row of the conformance manifest in the + container's throwaway copy of the tree and prove the check goes red and + names the assertion. Never touches the host tree. + --reset-cache delete the named ~/.m2 volume first, then run cold + --rebuild docker build --no-cache + --out DIR host directory for logs and reports (default /tmp/neoproj4j-docker-out) + --image NAME image tag to build/run (default neoproj4j-checks:temurin-21.0.11) + --volume NAME named volume for ~/.m2 (default neoproj4j-m2) + --shell build the image, then drop into a shell in the prepared /work + -h, --help this + +Examples + ./docker/run.sh # the four default checks + ./docker/run.sh conformance # one check + ./docker/run.sh bench # the opt-in 16-minute gate + ./docker/run.sh conformance --break-conformance # positive control: must exit 1 + ./docker/run.sh --reset-cache # prove the result does not depend on a warm cache +EOF +} + +# ===================================================================================== +# HOST DRIVER +# ===================================================================================== +if [ -z "${PROJ4J_IN_CONTAINER:-}" ]; then + HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + REPO_ROOT="$(cd "$HERE/.." && pwd)" + + IMAGE="$IMAGE_DEFAULT" + VOLUME="$VOLUME_DEFAULT" + OUT="$OUT_DEFAULT" + RESET_CACHE=0 + SHELL_MODE=0 + BUILD_FLAGS=() + PASSTHRU=() + + while [ $# -gt 0 ]; do + case "$1" in + --reset-cache) RESET_CACHE=1 ;; + --rebuild) BUILD_FLAGS+=(--no-cache) ;; + --shell) SHELL_MODE=1 ;; + --out) OUT="${2:?--out needs a directory}"; shift ;; + --image) IMAGE="${2:?--image needs a name}"; shift ;; + --volume) VOLUME="${2:?--volume needs a name}"; shift ;; + -h|--help) usage; exit 0 ;; + *) PASSTHRU+=("$1") ;; + esac + shift + done + + # Refuse to run against something that is not this repository, rather than producing a + # confusing Maven error three minutes later. + if ! grep -q 'neoproj4j-modules' "$REPO_ROOT/pom.xml" 2>/dev/null; then + echo "run.sh: $REPO_ROOT does not look like the neoproj4j repository" >&2 + exit 2 + fi + command -v docker >/dev/null || { echo "run.sh: docker is not on PATH" >&2; exit 2; } + + mkdir -p "$OUT" + + if [ "$RESET_CACHE" = 1 ]; then + echo "==> removing the Maven cache volume '$VOLUME' (the next run is cold)" + docker volume rm "$VOLUME" >/dev/null 2>&1 || true + fi + + # ---- build context ------------------------------------------------------------------- + # A throwaway context in /tmp holding the Dockerfile and exactly one other file: the CA bundle, + # written EMPTY when the host has none. The source tree is bind-mounted at run time rather than + # COPYed in, so editing a check does not invalidate an image layer and the image carries no + # claim about which commit it was built from. + CTX="$(mktemp -d /tmp/neoproj4j-docker-ctx.XXXXXX)" + trap 'rm -rf "$CTX"' EXIT + cp "$HERE/Dockerfile" "$CTX/Dockerfile" + + # This host is behind a TLS-intercepting firewall, so both curl and the JVM need its root CA or + # nothing downloads. On a machine without one - or on a real runner - the file stays empty and + # the Dockerfile's CA stage is a no-op, which is the case worth keeping working. + CA="" + for cand in "${PROJ4J_DOCKER_CA:-}" "${SSL_CERT_FILE:-}" "${REQUESTS_CA_BUNDLE:-}" \ + /etc/ssl/certs/ca-bundle.crt; do + [ -n "$cand" ] && [ -f "$cand" ] && { CA="$cand"; break; } + done + if [ -n "$CA" ]; then + cat "$CA" > "$CTX/extra-ca.crt" + echo "==> injecting CA bundle $CA ($(grep -c 'BEGIN CERTIFICATE' "$CA") certificate(s))" + else + : > "$CTX/extra-ca.crt" + fi + + echo "==> building $IMAGE" + # `${arr[@]+"${arr[@]}"}` rather than `"${arr[@]}"`, throughout the host half of this script: + # macOS ships bash 3.2, where expanding an EMPTY array under `set -u` is an "unbound variable" + # error. bash 4.4 fixed it; the host this was written for has not. + docker build ${BUILD_FLAGS[@]+"${BUILD_FLAGS[@]}"} -t "$IMAGE" -f "$CTX/Dockerfile" "$CTX" || exit 2 + + RUN_FLAGS=(--rm -v "$REPO_ROOT:/src:ro" -v "$VOLUME:/root/.m2" -v "$OUT:/out") + [ -t 0 ] && RUN_FLAGS+=(-i) + + if [ "$SHELL_MODE" = 1 ]; then + echo "==> interactive shell; /work is prepared on entry" + exec docker run "${RUN_FLAGS[@]}" -t "$IMAGE" -c \ + '/src/docker/run.sh --prepare-only; cd /work; exec bash' + fi + # No -t for a check run, deliberately: a pseudo-terminal turns every newline in the tee'd logs + # into CRLF and lets Maven emit colour, so the saved log stops being greppable. + + echo "==> host: $REPO_ROOT" + echo "==> output: $OUT" + docker run "${RUN_FLAGS[@]}" "$IMAGE" /src/docker/run.sh ${PASSTHRU[@]+"${PASSTHRU[@]}"} + exit $? +fi + +# ===================================================================================== +# IN-CONTAINER RUNNER +# ===================================================================================== +SRC=/src +WORK=/work +OUT=/out + +STRICT=0 +BREAK_CONFORMANCE=0 +PREPARE_ONLY=0 +REQUESTED=() + +while [ $# -gt 0 ]; do + case "$1" in + --strict) STRICT=1 ;; + --break-conformance) BREAK_CONFORMANCE=1 ;; + --prepare-only) PREPARE_ONLY=1 ;; + -h|--help) usage; exit 0 ;; + all) REQUESTED+=($ALL_CHECKS) ;; + ci|conformance|golden|determinism|bench) REQUESTED+=("$1") ;; + *) echo "run.sh: unknown argument '$1' (try --help)" >&2; exit 2 ;; + esac + shift +done +[ ${#REQUESTED[@]} -eq 0 ] && REQUESTED=($ALL_CHECKS) + +# ------------------------------------------------------------------ small helpers +hdr() { printf '\n========== %s ==========\n' "$*"; } +say() { printf '%s\n' "$*"; } +bad() { printf '!! %s\n' "$*"; } + +# Both taken from the workflows, which use exactly this shape. `grep -o` on the attribute rather +# than an XML parser, deliberately: no dependency is acquired to keep the guard true. +attr() { grep -o "$1=\"[0-9]*\"" "$2" 2>/dev/null | head -1 | sed 's/[^0-9]//g'; } +sumattr() { # sumattr + local a="$1"; shift + grep -ho "$a=\"[0-9]*\"" "$@" 2>/dev/null | sed 's/[^0-9]//g' \ + | awk '{n += $1} END {print n + 0}' +} +tsv() { awk -v k="$1" -F'\t' '$1 == k {print $2; f = 1} END {if (!f) print "MISSING"}' "$2"; } +rows() { grep -cv '^#' "$1"; } + +# Results table. Status is one of PASS / XFAIL / FAIL. +# +# Written to a FILE, not to a bash array, and the reason is a bug this script had for one draft: +# each check runs inside a `| tee` pipeline, which bash executes in a subshell, so anything a check +# appends to an array is discarded the moment it returns. The summary would then have been empty - +# or worse, silently short - while every individual check printed correctly. A file crosses the +# subshell boundary; an array does not. +RESULTS="$OUT/results.tsv" +record() { printf '%s\t%s\t%s\t%s\n' "$1" "$2" "$3" "${4:-}" >> "$RESULTS"; } + +# Mirrors every workflow's last step. A locally built neoproj4j snapshot left in the local repository +# could silently satisfy a later check's inter-module dependencies, so a run could "pass" against +# jars from an earlier state of the tree. The cached volume makes that a standing hazard here, +# not just a CI one. +scrub_m2() { rm -rf /root/.m2/repository/io/github/emilevictor/neoproj4j; } + +# ------------------------------------------------------------------ prepare /work +prepare() { + hdr "preparing /work from $SRC (read-only bind mount)" + mkdir -p "$WORK" "$OUT" + # The tree is COPIED, not built in place. Two reasons, both load-bearing: + # * `ci` runs `mvn clean install`, which would wipe the host's target/ directories out from + # under whatever else is running on this machine. + # * a check must not be able to modify a committed input; /src is mounted read-only and the + # positive control below edits only this copy. + # target/ is excluded so the container starts from a genuinely clean tree rather than + # inheriting the host's build output. .git is NOT excluded: jgitver reads it to compute the + # version, exactly as it does on a runner after actions/checkout. + rsync -a --delete \ + --exclude='target/' \ + --exclude='.claude/' \ + --exclude='.DS_Store' \ + "$SRC/" "$WORK/" + chown -R root:root "$WORK" + cd "$WORK" || exit 2 + + { + echo "container: $(uname -s) $(uname -m)" + echo "java: $(java -version 2>&1 | head -1)" + echo "maven: $(mvn -v 2>/dev/null | head -1)" + echo "locale: LANG=$LANG TZ=$TZ default=$(locale 2>/dev/null | head -1)" + echo "git HEAD: $(git -C "$WORK" rev-parse --short HEAD 2>/dev/null || echo '(none)')" + echo "git branch: $(git -C "$WORK" rev-parse --abbrev-ref HEAD 2>/dev/null || echo '(none)')" + echo "git dirty: $(git -C "$WORK" status --porcelain 2>/dev/null | wc -l | tr -d ' ') file(s)" + echo "m2 cache: $(du -sh /root/.m2/repository 2>/dev/null | cut -f1 || echo empty)" + } | tee "$OUT/environment.txt" +} + +# ------------------------------------------------------------------ positive control +break_conformance() { + local m="$WORK/conformance/src/test/resources/gie-expected-failures.tsv" + # The manifest lists only assertions that are NOT expected to pass; a key absent from it is + # expected to PASS. So deleting one row asserts that a known-failing assertion now passes, and + # the sweep must report it REGRESSED. This is the same control conformance.yaml's header + # records having been run by hand ("one manifest row removed -> exit 1, naming the assertion"). + local key + key=$(grep -v '^#' "$m" | awk -F'\t' 'NR > 1 && $2 == "FAIL" {print $1; exit}') + hdr "POSITIVE CONTROL: removing one manifest row from the container's copy" + say " file: conformance/src/test/resources/gie-expected-failures.tsv (in /work only)" + say " key: $key" + say " This asserts that a known-failing assertion now passes. The sweep must call it" + say " REGRESSED and the check must go red naming it. If it does not, this runner cannot" + say " detect a conformance regression and nothing else it reports can be trusted." + grep -v "^$key " "$m" > "$m.tmp" && mv "$m.tmp" "$m" + echo "$key" > "$OUT/broken-manifest-key.txt" +} + +# ===================================================================================== +# CHECK: ci -- mirrors .github/workflows/ci.yaml, job build-and-test +# ===================================================================================== +CI_MIN_TESTS=1700 # measured 1,735 in `core` alone on 2026-08-01 +check_ci() { + hdr "ci -- mvn -B -ntp clean install (ci.yaml / build-and-test)" + cd "$WORK" || return 2 + mvn -B -ntp clean install 2>&1 | tee /tmp/ci-mvn.out + local rc=${PIPESTATUS[0]} + scrub_m2 + + # ---- non-vacuity ------------------------------------------------------------------ + local xmls + xmls=$(find . -path '*/target/surefire-reports/TEST-*.xml' | sort) + if [ -z "$xmls" ]; then + bad "no surefire reports anywhere. Nothing was tested, so exit code $rc means nothing." + record ci FAIL "no surefire reports" "the build never reached a test phase" + return + fi + # shellcheck disable=SC2086 + local ran fails errs skips + ran=$(sumattr tests $xmls) + fails=$(sumattr failures $xmls) + errs=$(sumattr errors $xmls) + skips=$(sumattr skipped $xmls) + say "" + say "tests=$ran failures=$fails errors=$errs skipped=$skips across $(printf '%s\n' "$xmls" | wc -l | tr -d ' ') report files" + + if [ "$ran" -lt "$CI_MIN_TESTS" ]; then + bad "only $ran tests ran; the floor is $CI_MIN_TESTS." + bad "A run that executes nothing cannot report success. Tests were dropped, a module" + bad "failed to compile, or the reactor stopped before core's test phase." + record ci FAIL "$ran tests (floor $CI_MIN_TESTS)" "floor assertion failed - too few tests ran" + return + fi + + # ---- which classes failed --------------------------------------------------------- + local offenders="" + local f + for f in $xmls; do + local nf ne cls + nf=$(attr failures "$f"); ne=$(attr errors "$f") + if [ "${nf:-0}" -gt 0 ] || [ "${ne:-0}" -gt 0 ]; then + cls=$(basename "$f" .xml); cls=${cls#TEST-} + offenders="$offenders $cls" + say " failing: $cls (failures=${nf:-0} errors=${ne:-0})" + fi + done + offenders=$(echo "$offenders" | tr -s ' ' | sed 's/^ //;s/ $//') + + if [ "$rc" -eq 0 ]; then + say "" + say "ci is GREEN. It was expected to fail on MetaCRSTest, whose input" + say "epsg/src/main/resources/proj4/proj4-epsg.csv was stale and was being regenerated." + say "If that regeneration has landed, this is the intended new state - not a fluke." + record ci PASS "$ran tests, 0 failures" \ + "green; the MetaCRSTest expectation no longer applies (proj4-epsg.csv looks regenerated)" + return + fi + + if [ "$offenders" = "org.locationtech.proj4j.MetaCRSTest" ]; then + record ci XFAIL "$ran tests, $((fails + errs)) failure(s) - MetaCRSTest only" \ + "EXPECTED: MetaCRSTest reads epsg/src/main/resources/proj4/proj4-epsg.csv, which is stale and is being regenerated. It is the only failing class, so nothing else regressed." + elif [ -z "$offenders" ]; then + # A reactor failure with every test green is the interesting case: something in the build + # itself broke, and while `core` was red nobody could see it because the reactor stopped + # there. Name the goal and the module rather than making the reader open the log. + local goal + goal=$(grep -m1 -oE 'Failed to execute goal [^ ]+ \([^)]*\) on project [A-Za-z0-9_.-]+' /tmp/ci-mvn.out) + say "" + bad "the reactor failed with ZERO failing tests. ${goal:-(no 'Failed to execute goal' line found)}" + grep -E '^\[INFO\] (neoProj4J|[A-Za-z].*\.\.\.\.).*(SUCCESS|FAILURE|SKIPPED)' /tmp/ci-mvn.out | tail -10 + record ci FAIL "$ran tests, 0 test failures, exit $rc; ${goal:-build error}" \ + "the build failed with no failing test - a compile, plugin or packaging error. All $ran tests passed, so this is a build problem, not a behavioural one." + else + record ci FAIL "$ran tests, $((fails + errs)) failure(s) in: $offenders" \ + "classes other than MetaCRSTest failed; only MetaCRSTest is expected to" + fi +} + +# ===================================================================================== +# CHECK: conformance -- mirrors .github/workflows/conformance.yaml, job corpus +# ===================================================================================== +check_conformance() { + hdr "conformance -- the PROJ 9.8.1 gie/GIGS corpus sweep (conformance.yaml / corpus)" + cd "$WORK" || return 2 + rm -rf conformance/target/conformance conformance/target/surefire-reports + + # VERBATIM from conformance.yaml. Every flag is load-bearing and two of them are here to stop + # this passing without measuring anything - see that file's step comment. The ** is required: + # every conformance test lives in a sub-package and surefire's single * does not cross a + # package separator, so the single-star form prints "No tests to run." then BUILD SUCCESS. + mvn -B -ntp -Pconformance -pl conformance -am verify \ + -Dtest='org.locationtech.proj4j.conformance.**.*Test' \ + -Dsurefire.failIfNoSpecifiedTests=false \ + -Dmaven.javadoc.skip=true + local rc=$? + scrub_m2 + + # ---- the workflow's own "Assert the sweep actually swept" step, translated --------- + local reports=conformance/target/surefire-reports + local xml="$reports/TEST-org.locationtech.proj4j.conformance.runner.GieConformanceTest.xml" + local summary=conformance/target/conformance/summary.tsv + local index=conformance/src/test/resources/gie-corpus-index.tsv + local manifest=conformance/src/test/resources/gie-expected-failures.tsv + local why="" + say "" + + if [ ! -f "$manifest" ] || [ ! -f "$index" ]; then + bad "ABSENT BASELINE: the committed manifest or corpus index is missing. The gate cannot" + bad "run without it and its absence is NOT a regression - restore the file, do not" + bad "regenerate it." + record conformance FAIL "absent baseline" "the committed baseline is missing, which is a different failure from a regression" + return + fi + if [ ! -f "$xml" ]; then + bad "no surefire report for GieConformanceTest at $xml" + bad "The sweep did not run: either -Pconformance was ineffective, or the -Dtest pattern" + bad "matched nothing (the ** is required)." + ls -R "$reports" 2>/dev/null || true + record conformance FAIL "sweep produced no report" "the sweep did not execute" + return + fi + + local ran skipped + ran=$(attr tests "$xml"); skipped=$(attr skipped "$xml") + say "GieConformanceTest: tests=$ran skipped=$skipped" + if [ "${ran:-0}" -lt 7900 ]; then + bad "GieConformanceTest reported only ${ran:-0} tests. The corpus is 7,923 assertions plus" + bad "per-file leak checks and the gate container; a count of 1 means the sweep was skipped" + bad "by gie.corpus.skip and NOTHING was measured." + record conformance FAIL "${ran:-0} assertions (floor 7900)" "floor assertion failed - the sweep did not sweep" + return + fi + + # Nothing OUTSIDE the sweep may be skipped. GieConformanceTest legitimately aborts + # STILL_FAILING assertions; an Assume firing anywhere else hides a real loss of coverage. + local others otherskips classes + others=$(ls "$reports"/TEST-*.xml 2>/dev/null | grep -v GieConformanceTest) + classes=$(printf '%s\n' "$others" | grep -c .) + if [ "$classes" -eq 0 ]; then + # Guarded, not merely reported: `sumattr` with no file arguments would read stdin and the + # whole run would hang instead of failing. + bad "no conformance test classes besides the sweep produced a report. The -Dtest pattern" + bad "matched only the sweep, or the other tests were not compiled." + record conformance FAIL "0 test classes besides the sweep" "floor assertion failed - the surrounding conformance tests did not run" + return + fi + # shellcheck disable=SC2086 + otherskips=$(sumattr skipped $others) + say "other conformance test classes: $classes with $otherskips skips" + if [ "$otherskips" -ne 0 ]; then + bad "$otherskips conformance tests outside the sweep were SKIPPED. Skips are never passes." + record conformance FAIL "$otherskips skips outside the sweep" "an Assume fired where it must not" + return + fi + if [ "$classes" -lt 25 ]; then + bad "only $classes conformance test classes ran (expected 26 or more besides the sweep)." + record conformance FAIL "$classes test classes (floor 25)" "floor assertion failed - test classes were dropped or not matched" + return + fi + + if [ ! -f "$summary" ]; then + bad "no $summary; the sweep produced no machine summary." + record conformance FAIL "no summary.tsv" "the sweep produced no machine-readable summary" + return + fi + local evaluated notrun keys pass denom + evaluated=$(tsv conformance.evaluated "$summary") + notrun=$(tsv conformance.notrun "$summary") + pass=$(tsv conformance.pass "$summary") + denom=$(tsv conformance.measured_denominator "$summary") + keys=$(rows "$index") + say "assertions evaluated=$evaluated baseline index keys=$keys notrun=$notrun" + if [ "$evaluated" != "$keys" ]; then + bad "the sweep evaluated $evaluated assertions but the committed index has $keys keys." + bad "The run did not cover the same corpus, so the diff below it is not comparable." + bad "Do NOT regenerate the baseline to absorb this." + record conformance FAIL "$evaluated evaluated vs $keys indexed" "the sweep covered a different corpus than the baseline" + return + fi + if [ "$notrun" != "0" ]; then + bad "$notrun assertions were never run." + record conformance FAIL "$notrun assertions not run" "part of the corpus never executed" + return + fi + + local stillfailing manifestrows + stillfailing=$(tsv diff.still_failing "$summary") + manifestrows=$(($(rows "$manifest") - 1)) # minus the column header + say "sweep skips=$skipped still_failing=$stillfailing manifest rows=$manifestrows" + if [ "$skipped" != "$stillfailing" ]; then + bad "the sweep aborted $skipped assertions but the diff calls only $stillfailing of them STILL_FAILING." + record conformance FAIL "skips $skipped != still_failing $stillfailing" "the abort mechanism is absorbing assertions nobody wrote down" + return + fi + + local k v hard=0 + for k in diff.regressed diff.unexpected_pass diff.disappeared; do + v=$(tsv "$k" "$summary") + say "$k = $v" + if [ "$v" != "0" ]; then hard=1; why="$why $k=$v"; fi + done + say "Non-vacuity satisfied: $evaluated assertions swept against a $keys-key baseline." + [ -f conformance/target/conformance/report.txt ] && head -1 conformance/target/conformance/report.txt + + if [ "$hard" = 1 ]; then + bad "REGRESSION:$why -- see conformance/target/conformance/differences.txt" + head -20 conformance/target/conformance/differences.txt 2>/dev/null + record conformance FAIL "$pass/$denom genuine passes;$why" \ + "an assertion that used to pass no longer does (or the baseline no longer describes the corpus)" + elif [ "$rc" -ne 0 ]; then + record conformance FAIL "$pass/$denom genuine passes, regressed 0, but mvn exited $rc" \ + "the sweep is clean but the build failed for another reason - read the log" + else + record conformance PASS "$pass/$denom genuine passes, regressed 0, $evaluated assertions evaluated" "" + fi +} + +# ===================================================================================== +# CHECK: golden -- mirrors .github/workflows/golden.yaml, job golden +# ===================================================================================== +check_golden() { + hdr "golden -- the 53,430-row behavioural sweep (golden.yaml / golden)" + cd "$WORK" || return 2 + rm -rf golden/target/golden golden/target/surefire-reports + + # VERBATIM from golden.yaml. `*` not `**` here is correct: every golden test sits directly in + # org.locationtech.proj4j.golden. -Dmaven.test.failure.ignore=true is deliberately absent - it + # would force exit 0 and ignore THE GATE'S OWN FAILURE. + mvn -B -ntp -Pgolden -pl golden -am verify \ + -Dtest='org.locationtech.proj4j.golden.*Test' \ + -Dsurefire.failIfNoSpecifiedTests=false \ + -Dmaven.javadoc.skip=true + local rc=$? + scrub_m2 + + local xml=golden/target/surefire-reports/TEST-org.locationtech.proj4j.golden.GoldenMasterTest.xml + say "" + if [ ! -f "$xml" ]; then + bad "no surefire report for GoldenMasterTest at $xml" + bad "The gate did not run. -Pgolden is what adds the module AND flips golden.skip;" + bad "a job that runs no assertions is not a pass." + ls -R golden/target/surefire-reports 2>/dev/null || true + record golden FAIL "gate produced no report" "the gate did not execute" + return + fi + + local ran skipped + ran=$(attr tests "$xml"); skipped=$(attr skipped "$xml") + say "GoldenMasterTest: tests=$ran skipped=$skipped" + if [ "${ran:-0}" -ne 1 ]; then + bad "expected exactly 1 GoldenMasterTest, found ${ran:-0}" + record golden FAIL "GoldenMasterTest ran ${ran:-0} times" "floor assertion failed" + return + fi + if [ "${skipped:-0}" -ne 0 ]; then + bad "GoldenMasterTest was SKIPPED - golden.skip was still true, so no table was generated" + bad "and nothing was compared. Skips are never passes." + record golden FAIL "GoldenMasterTest skipped" "the sweep was skipped, which surefire reports as success" + return + fi + + local got want + got=$(wc -l < golden/target/golden/golden.tsv 2>/dev/null || echo 0) + want=$(wc -l < golden/baseline/1.4.3/golden.tsv) + say "golden.tsv rows (incl. header): generated=$got baseline=$want" + if [ "$got" -ne "$want" ]; then + bad "the generated table has $got lines but the baseline has $want. A row-count mismatch" + bad "means the sweep did not cover the same input set, so the diff is not comparable." + record golden FAIL "$got rows generated vs $want baseline" "the sweep covered a different input set" + return + fi + + local total totalskip + total=$(sumattr tests golden/target/surefire-reports/TEST-org.locationtech.proj4j.golden.*.xml) + totalskip=$(sumattr skipped golden/target/surefire-reports/TEST-org.locationtech.proj4j.golden.*.xml) + say "golden module: tests=$total skipped=$totalskip" + if [ "$total" -lt 40 ]; then + bad "only $total tests ran in the golden module; expected at least 40." + record golden FAIL "$total tests (floor 40)" "floor assertion failed - tests were dropped or not matched" + return + fi + if [ "$totalskip" -ne 0 ]; then + bad "$totalskip golden tests were skipped. Skips are never passes." + record golden FAIL "$totalskip skips" "an Assume fired inside the golden module" + return + fi + say "Non-vacuity satisfied: the gate ran, over the full $want-line table, with no skips." + + # ---- classify the failure ---------------------------------------------------------- + # 41 rules, all with a pinned expected_rows, is the state the backlog is being worked against. + local rules pinned + rules=$(grep -cE '^ - id:' golden/rules.yaml) + pinned=$(grep -cE '^ expected_rows: [0-9]+' golden/rules.yaml) + say "rules.yaml: $pinned/$rules rules carry a pinned expected_rows" + + local unexplained diffline hardkinds="" kind n + diffline=$(grep -ho 'golden diff: [^<"]*' "$xml" | head -1) + [ -n "$diffline" ] && say "$diffline" + unexplained=$(grep -o 'UNEXPLAINED [0-9]* row(s)' "$xml" | head -1 | tr -dc '0-9') + [ -z "$unexplained" ] && unexplained=0 + for kind in COUNT_MISMATCH DEAD_RULE EXPIRED_RULE PENDING_RULE_FIRED; do + n=$(grep -c "$kind " "$xml") + [ "$n" -gt 0 ] && hardkinds="$hardkinds $kind($n)" + done + + if [ "$rc" -eq 0 ]; then + record golden PASS "0 UNEXPLAINED, $pinned/$rules rules pinned" "" + elif [ -n "$hardkinds" ]; then + bad "golden failed on rule-level problems:$hardkinds" + bad "These are NOT the triage backlog. A COUNT_MISMATCH, DEAD_RULE, EXPIRED_RULE or" + bad "PENDING_RULE_FIRED means the rule set has stopped describing the tree." + grep -o "\(COUNT_MISMATCH\|DEAD_RULE\|EXPIRED_RULE\|PENDING_RULE_FIRED\) [a-z0-9-]*" "$xml" | sort -u + record golden FAIL "$unexplained UNEXPLAINED plus$hardkinds" \ + "a rule-level failure, which is a defect in the rule set - not the triage backlog" + elif [ "$unexplained" -gt 0 ]; then + record golden XFAIL "$unexplained UNEXPLAINED rows, $pinned/$rules rules pinned, no COUNT_MISMATCH/DEAD_RULE/EXPIRED_RULE/PENDING_RULE_FIRED" \ + "EXPECTED: $unexplained changed rows have not yet been attributed to a specific fix. That is a triage backlog owned by the streams that caused it, not a defect in this gate. It goes green one rule at a time." + else + record golden FAIL "mvn exited $rc with 0 UNEXPLAINED and no rule failure" \ + "the gate failed for a reason the summary cannot name - read the log" + fi +} + +# ===================================================================================== +# CHECK: determinism -- mirrors .github/workflows/determinism.yaml, job bits (ONE leg) +# ===================================================================================== +# UPDATED 2026-08-02. This block used to say determinism.yaml pinned EXPECTED_TESTS as an EXACT +# count and was stale at 15 against a true 22, so this runner deliberately held a lower floor and +# shouted about the drift. That is no longer the situation in either direction: determinism.yaml +# now asserts DET_FLOOR_TESTS=22, a FLOOR, and reports an upward drift as a ::notice:: instead of +# failing. Its own header records the two staleness incidents (9 -> 15 -> 22) as the reason. So the +# two files now agree on both the constant and its shape, and this runner's job is to keep them in +# step rather than to compensate for one of them. +# +# The value is re-derived here rather than copied from that file: `mvn -pl core -am test +# -Dtest='org.locationtech.proj4j.determinism.*Test'` on Temurin 21 / aarch64 reports "Tests run: +# 22, Failures: 0, Errors: 0, Skipped: 0" across four surefire XMLs (StrictMathGoldenTableTest 6, +# NanBitPatternTest 3, NoAmbientLocaleInCoreTest 7, NoJdkAngleConversionTest 6), cross-checked +# against 22 `@Test` methods in the package's sources. Two independent counts that agree. +# +# A floor still makes "a container that ran nothing" impossible, which is the property that +# matters. What it gives up is catching a DROP that stays above the floor, and that is why the +# drift line below prints on every run rather than only on failure. +# +# RAISE BOTH when tests are added on purpose. It is a ratchet, not a ceiling, and the two constants +# must move together. +DET_FLOOR_TESTS=22 +DET_WORKFLOW_FLOOR=22 +check_determinism() { + hdr "determinism -- the raw-bit StrictMath golden (determinism.yaml / bits, one leg)" + cd "$WORK" || return 2 + rm -rf core/target/determinism core/target/surefire-reports + + say "This container is ONE leg of a six-leg matrix (x86-64 x aarch64, JDK 11/17/21). It" + say "reproduces the per-leg assertion only. determinism.yaml's cross-arch job - in particular" + say "its non-vacuity check that Math must diverge from the golden on at least one leg - is" + say "a property of the MATRIX and cannot be asserted from inside a single container." + say "" + + mvn -B -ntp -pl core -am test \ + -Dtest='org.locationtech.proj4j.determinism.*Test' \ + -Dsurefire.failIfNoSpecifiedTests=false \ + -Dmaven.javadoc.skip=true \ + -DargLine="-Dproj4j.determinism.outDir=$WORK/core/target/determinism" + local rc=$? + scrub_m2 + + say "" + local xmls nxml + xmls=$(ls core/target/surefire-reports/TEST-org.locationtech.proj4j.determinism.*.xml 2>/dev/null) + nxml=$(printf '%s\n' "$xmls" | grep -c .) + if [ "$nxml" -lt 2 ]; then + bad "expected at least 2 determinism surefire reports, found $nxml." + bad "The tests did not run. A run that makes no assertions is not a pass." + record determinism FAIL "$nxml report files" "the determinism tests did not execute" + return + fi + # shellcheck disable=SC2086 + local ran fails errs skips + ran=$(sumattr tests $xmls) + fails=$(sumattr failures $xmls) + errs=$(sumattr errors $xmls) + skips=$(sumattr skipped $xmls) + say "determinism tests: ran=$ran failures=$fails errors=$errs skipped=$skips across $nxml classes" + if [ "$ran" -lt "$DET_FLOOR_TESTS" ]; then + bad "only $ran determinism tests ran; the floor is $DET_FLOOR_TESTS. The tests did not run," + bad "or were renamed out of the -Dtest pattern. A run that makes no assertions is not a pass." + record determinism FAIL "$ran tests (floor $DET_FLOOR_TESTS)" "floor assertion failed - too few determinism tests ran" + return + fi + local drift="" driftwhy="" + if [ "$ran" -gt "$DET_WORKFLOW_FLOOR" ]; then + drift=" [drifted UP: determinism.yaml's floor is $DET_WORKFLOW_FLOOR, +$((ran - DET_WORKFLOW_FLOOR))]" + driftwhy="$ran determinism tests match the pattern today against a floor of $DET_WORKFLOW_FLOOR in both .github/workflows/determinism.yaml and this script. Not a failure - a floor is a ratchet - but raise both so the floor keeps tracking reality." + say "" + say "DRIFT, not a failure: $ran tests matched the pattern and the floor in both" + say ".github/workflows/determinism.yaml and this script is $DET_WORKFLOW_FLOOR. Raise" + say "DET_FLOOR_TESTS in both files in the same commit so the floor keeps tracking reality." + ls core/target/surefire-reports/TEST-org.locationtech.proj4j.determinism.*.xml \ + | sed 's|.*TEST-| |; s|\.xml$||' + say "" + fi + if [ "$skips" -ne 0 ]; then + bad "$skips determinism tests were skipped. Skips are never passes." + record determinism FAIL "$skips skips" "an Assume fired" + return + fi + + # Informational: this leg's Math-vs-golden divergence. NOT asserted - see the header above and + # determinism.yaml's own comment: on Temurin 11 / aarch64 the true value is 0, so a per-leg + # assertion here would ship a permanently red leg for a non-defect. + local mdt=core/target/determinism/math-divergence.tsv + if [ -f "$mdt" ]; then + local d t + d=$(awk -F'\t' '$1 == "TOTAL" {print $2}' "$mdt") + t=$(awk -F'\t' '$1 == "TOTAL" {print $3}' "$mdt") + say "this leg ($(uname -m), $(java -version 2>&1 | head -1 | tr -d '\n')):" + say " Math differs from the StrictMath golden on $d of $t probes (reported, not asserted)" + else + say "note: $mdt was not produced, so the cross-arch payload is missing from this leg." + fi + + if [ "$rc" -ne 0 ] || [ "$fails" -ne 0 ] || [ "$errs" -ne 0 ]; then + record determinism FAIL "$ran tests, $fails failures, $errs errors" \ + "a leg of the bit-identity proof failed - this is the headline guarantee" + else + record determinism PASS "$ran tests, 0 failures (one leg: $(uname -m) / Temurin 21)$drift" "$driftwhy" + fi +} + +# ===================================================================================== +# CHECK: bench -- mirrors .github/workflows/bench.yaml, job gate. OPT-IN. +# ===================================================================================== +check_bench() { + hdr "bench -- Tier 1 allocation + Tier 2 op-count gate (bench.yaml / gate)" + cd "$WORK" || return 2 + rm -f benchmark/target/jmh-result.json + + say "This is the slow one: ~16 minutes, and it wants a quiet machine. It is deliberately NOT" + say "part of the default run. JMH measures bytes/op, which is a bytecode property and is" + say "robust to a busy box - but the run still takes real wall-clock, and a container competing" + say "for CPU with a browser will take longer, not lie." + say "" + + mvn -B -ntp -Pbench -pl benchmark -am package \ + -DskipTests \ + -Dmaven.javadoc.skip=true \ + -Dmaven.source.skip=true + local rc=$? + if [ "$rc" -ne 0 ]; then + bad "the shaded benchmarks jar did not build." + scrub_m2 + record bench FAIL "build failed (exit $rc)" "benchmark/target/benchmarks.jar was never produced" + return + fi + + # The gate's own plumbing, before it is trusted to judge anything else. + java -cp benchmark/target/benchmarks.jar \ + org.locationtech.proj4j.benchmark.gate.GateChecker --self-test + local selftest=$? + say "GateChecker --self-test exit $selftest" + if [ "$selftest" -ne 0 ]; then + scrub_m2 + record bench FAIL "GateChecker --self-test exited $selftest" "the gate's own plumbing is broken, so its verdict on anything else is worthless" + return + fi + + ( cd benchmark && ./run-gate.sh --quick --require-baseline ) 2>&1 | tee /tmp/bench-gate.out + local grc=${PIPESTATUS[0]} + scrub_m2 + + # ---- non-vacuity ------------------------------------------------------------------ + say "" + local json=benchmark/target/jmh-result.json + if [ ! -f "$json" ]; then + bad "no $json - JMH produced no result file, so Tier 1 examined nothing." + record bench FAIL "no jmh-result.json" "JMH produced no measurements" + return + fi + local arms alloc + arms=$(grep -c '"benchmark"' "$json") + alloc=$(grep -c 'gc.alloc.rate.norm' "$json") + say "JMH arms: $arms arms carrying gc.alloc.rate.norm: $alloc" + if [ "$arms" -lt 20 ]; then + bad "only $arms benchmark arms in the result; expected at least 20. Benchmarks were" + bad "excluded, renamed, or failed in @Setup. Tier 1 cannot gate what was not run." + record bench FAIL "$arms arms (floor 20)" "floor assertion failed - too few benchmark arms" + return + fi + if [ "$alloc" -lt 20 ]; then + bad "$alloc arms carry gc.alloc.rate.norm. The -prof gc profiler did not attach, so Tier 1" + bad "would have measured NOTHING while reporting success." + record bench FAIL "$alloc arms with an allocation measurement (floor 20)" "the allocation profiler did not attach" + return + fi + say "Non-vacuity satisfied: $alloc of $arms arms carry an allocation measurement." + + local verdict gated + verdict=$(grep -ohE 'GATE (PASSED|FAILED) *\([^)]*\)' /tmp/bench-gate.out | tail -1) + gated=$(grep -ohE '[0-9]+ gated, [0-9]+ EXCLUDED' /tmp/bench-gate.out | tail -1) + say "${verdict:-(no GATE verdict line found)} ${gated:-}" + cp -f /tmp/bench-gate.out "$OUT/bench-gate.out" 2>/dev/null + + if [ "$grc" -eq 0 ]; then + record bench PASS "0 breaches; ${gated:-gating coverage unknown}; $arms arms" "" + else + record bench FAIL "${verdict:-exit $grc}; ${gated:-}" \ + "an allocation or op-count threshold was breached, or a TBD threshold was hit under --require-baseline" + fi +} + +# ===================================================================================== +# DRIVE +# ===================================================================================== +START=$(date +%s) +mkdir -p "$OUT" +: > "$OUT/results.tsv" +: > "$OUT/timings.tsv" + +prepare +[ "$PREPARE_ONLY" = 1 ] && exit 0 +[ "$BREAK_CONFORMANCE" = 1 ] && break_conformance 2>&1 | tee "$OUT/control.log" + +for c in "${REQUESTED[@]}"; do + t0=$(date +%s) + case "$c" in + ci) check_ci 2>&1 | tee "$OUT/ci.log" ;; + conformance) check_conformance 2>&1 | tee "$OUT/conformance.log" ;; + golden) check_golden 2>&1 | tee "$OUT/golden.log" ;; + determinism) check_determinism 2>&1 | tee "$OUT/determinism.log" ;; + bench) check_bench 2>&1 | tee "$OUT/bench.log" ;; + esac + printf '%s\t%s\n' "$c" "$(( $(date +%s) - t0 ))" >> "$OUT/timings.tsv" +done + +# ------------------------------------------------------------------ collect artefacts +mkdir -p "$OUT/reports" +cp -f "$WORK"/conformance/target/conformance/report.txt "$OUT/reports/" 2>/dev/null +cp -f "$WORK"/conformance/target/conformance/summary.tsv "$OUT/reports/" 2>/dev/null +cp -f "$WORK"/conformance/target/conformance/differences.txt "$OUT/reports/" 2>/dev/null +cp -f "$WORK"/golden/target/golden/golden-summary.txt "$OUT/reports/" 2>/dev/null +cp -f "$WORK"/core/target/determinism/*.tsv "$OUT/reports/" 2>/dev/null +cp -f "$WORK"/benchmark/target/jmh-result.json "$OUT/reports/" 2>/dev/null + +# ------------------------------------------------------------------ summary +ELAPSED=$(( $(date +%s) - START )) +fmt_dur() { awk -v s="$1" 'BEGIN {printf "%dm%02ds", int(s/60), s%60}'; } + +summary() { + local npass=0 nxfail=0 nfail=0 nmissing=0 + printf '\n' + printf '=========================================================================\n' + printf ' neoproj4j Docker check run - %s / Temurin 21.0.11 / %s\n' "$(uname -m)" "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" + printf '=========================================================================\n\n' + printf '%-13s %-14s %-9s %s\n' CHECK VERDICT TIME 'MEASURED' + printf -- '------------- -------------- --------- --------------------------------\n' + + local c + for c in "${REQUESTED[@]}"; do + local line status detail secs + line=$(awk -F'\t' -v k="$c" '$1 == k {print; exit}' "$RESULTS") + secs=$(awk -F'\t' -v k="$c" '$1 == k {print $2; exit}' "$OUT/timings.tsv") + if [ -z "$line" ]; then + # A check that produced no verdict at all is a failure of the runner, not a pass. + printf '%-13s %-14s %-9s %s\n' "$c" 'NO VERDICT' "$(fmt_dur "${secs:-0}")" \ + 'the check recorded nothing - treat as failed' + nmissing=$((nmissing + 1)); continue + fi + status=$(printf '%s' "$line" | cut -f2) + detail=$(printf '%s' "$line" | cut -f3) + case "$status" in + PASS) npass=$((npass + 1)); printf '%-13s %-14s %-9s %s\n' "$c" 'PASS' "$(fmt_dur "${secs:-0}")" "$detail" ;; + XFAIL) nxfail=$((nxfail + 1)); printf '%-13s %-14s %-9s %s\n' "$c" 'FAIL(expected)' "$(fmt_dur "${secs:-0}")" "$detail" ;; + *) nfail=$((nfail + 1)); printf '%-13s %-14s %-9s %s\n' "$c" 'FAIL' "$(fmt_dur "${secs:-0}")" "$detail" ;; + esac + done + + # The "why" column is the whole point of the two expected failures. Printed in full, below the + # table, so a red line is never just red. + if [ "$nxfail" -gt 0 ] || [ "$nfail" -gt 0 ] || [ "$npass" -gt 0 ]; then + printf '\n' + while IFS=$'\t' read -r nm st dt wy; do + [ -z "${wy:-}" ] && continue + case "$st" in + XFAIL) printf 'EXPECTED FAILURE - %s\n %s\n\n' "$nm" "$wy" ;; + FAIL) printf 'UNEXPECTED FAILURE - %s\n %s\n\n' "$nm" "$wy" ;; + PASS) printf 'NOTE - %s\n %s\n\n' "$nm" "$wy" ;; + esac + done < "$RESULTS" + fi + + printf -- '-------------------------------------------------------------------------\n' + printf '%d passed, %d failed AS EXPECTED, %d failed unexpectedly' "$npass" "$nxfail" "$nfail" + [ "$nmissing" -gt 0 ] && printf ', %d produced NO VERDICT' "$nmissing" + printf ' (total %s)\n' "$(fmt_dur "$ELAPSED")" + printf 'logs and reports: %s (host: the --out directory)\n' "$OUT" + if [ "$nxfail" -gt 0 ] && [ "$STRICT" = 0 ]; then + printf '\n"FAIL(expected)" means the check really did fail and the failure is a known,\n' + printf 'explained backlog item, so it does not set the exit code. Re-run with --strict to\n' + printf 'make it do so.\n' + fi + printf '=========================================================================\n' + + if [ "$nfail" -gt 0 ] || [ "$nmissing" -gt 0 ]; then return 1; fi + if [ "$STRICT" = 1 ] && [ "$nxfail" -gt 0 ]; then return 1; fi + return 0 +} + +summary | tee "$OUT/summary.txt" +exit "${PIPESTATUS[0]}" diff --git a/epsg/pom.xml b/epsg/pom.xml index 86b765e..55eec17 100644 --- a/epsg/pom.xml +++ b/epsg/pom.xml @@ -2,16 +2,21 @@ 4.0.0 - org.locationtech.proj4j - proj4j-modules + io.github.emilevictor.neoproj4j + neoproj4j-modules 1.3.1-SNAPSHOT - org.locationtech.proj4j - proj4j-epsg + io.github.emilevictor.neoproj4j + neoproj4j-epsg jar - Proj4J EPSG - Java port of the Proj.4 library for coordinate reprojection + neoProj4J EPSG + EPSG, ESRI, world, NAD83 and NAD27 init dictionaries for neoProj4J, plus PROJ's + `conus` CTABLE V2 grid. + + + https://github.com/emilevictor/neoProj4J @@ -20,12 +25,68 @@ EPSG database distribution license - https://raw.githubusercontent.com/locationtech/proj4j/master/LICENSE.EPSG + https://raw.githubusercontent.com/emilevictor/neoProj4J/develop/LICENSE.EPSG + + + + MIT License (PROJ) + https://raw.githubusercontent.com/emilevictor/neoProj4J/develop/LICENSE.PROJ + + https://github.com/emilevictor/neoProj4J + scm:git:https://github.com/emilevictor/neoProj4J.git + scm:git:git@github.com:emilevictor/neoProj4J.git + HEAD + + + + + false + + + + + maven-resources-plugin + 3.5.0 + + + embed-licenses + process-resources + + copy-resources + + + ${project.build.outputDirectory}/META-INF + + + ${project.basedir}/.. + + LICENSE.PROJ + LICENSE.EPSG + + false + + + + + + + maven-jar-plugin diff --git a/epsg/src/main/resources/proj4/nad/conus b/epsg/src/main/resources/proj4/nad/conus new file mode 100644 index 0000000..44b4900 Binary files /dev/null and b/epsg/src/main/resources/proj4/nad/conus differ diff --git a/geoapi/pom.xml b/geoapi/pom.xml index 8f368b9..c95a4f1 100644 --- a/geoapi/pom.xml +++ b/geoapi/pom.xml @@ -2,25 +2,68 @@ 4.0.0 - org.locationtech.proj4j - proj4j-modules + io.github.emilevictor.neoproj4j + neoproj4j-modules 1.3.1-SNAPSHOT - org.locationtech.proj4j - proj4j-geoapi + io.github.emilevictor.neoproj4j + neoproj4j-geoapi jar - Proj4J GeoAPI - GeoAPI wrappers for viewing PROJ4J as a GeoAPI implementation. + neoProj4J GeoAPI + GeoAPI wrappers for viewing neoProj4J as a GeoAPI implementation. + + https://github.com/emilevictor/neoProj4J + + + + echeipesh + Eugene Cheipesh + https://github.com/echeipesh + + + lossyrob + Rob Emanuele + https://github.com/lossyrob + + + pomadchin + Grigory Pomadchin + https://github.com/pomadchin + desruisseaux Martin Desruisseaux https://github.com/desruisseaux + + emilevictor + Emile Victor + https://github.com/emilevictor + + neoProj4J fork maintainer + + + + https://github.com/emilevictor/neoProj4J + scm:git:https://github.com/emilevictor/neoProj4J.git + scm:git:git@github.com:emilevictor/neoProj4J.git + HEAD + + + + + false + + org.opengis @@ -34,13 +77,13 @@ test - org.locationtech.proj4j - proj4j + io.github.emilevictor.neoproj4j + neoproj4j ${project.version} - org.locationtech.proj4j - proj4j-epsg + io.github.emilevictor.neoproj4j + neoproj4j-epsg ${project.version} test diff --git a/geoapi/src/main/java/org/locationtech/proj4j/geoapi/SimpleCitation.java b/geoapi/src/main/java/org/locationtech/proj4j/geoapi/SimpleCitation.java index 2e0523e..edecca0 100644 --- a/geoapi/src/main/java/org/locationtech/proj4j/geoapi/SimpleCitation.java +++ b/geoapi/src/main/java/org/locationtech/proj4j/geoapi/SimpleCitation.java @@ -46,8 +46,8 @@ final class SimpleCitation implements Citation, ResponsibleParty, Contact, Onlin /** * The citation for the PROJ4J software. */ - static final SimpleCitation PROJ4J = new SimpleCitation("PROJ4J", "Eclipse Foundation", - "LocationTech", "https://projects.eclipse.org/projects/locationtech"); + static final SimpleCitation PROJ4J = new SimpleCitation("neoProj4J", "neoProj4J contributors", + "neoProj4J", "https://github.com/emilevictor/neoProj4J"); /** * The title of the dataset or project. diff --git a/golden/README.md b/golden/README.md new file mode 100644 index 0000000..e3fbfa9 --- /dev/null +++ b/golden/README.md @@ -0,0 +1,1491 @@ +# `proj4j-golden` — the golden-master compatibility regime + +> **Did we change proj4j's behaviour in a way we did not mean to?** +> +> That is the only question this module answers. It has no opinion about whether any output is +> *correct*. See [Policy](#policy-gie-always-wins) — that distinction is the whole design. + +The gie/GIGS conformance module tells us whether we match PROJ 9.8.1. It says nothing about the +behaviour PROJ never exercises — and proj4j's registry dictionaries hold **9,013 CRS** that the gie +corpus does not mention. Six streams are concurrently changing numerical behaviour (the Karney +auxiliary-latitude core, `+rf`/`+f`/`+R` parsing, the Albers spherical inverse, `TYPE_UNKNOWN` +hoisting, six new projections, the fail-closed work). This module is the mechanism that distinguishes +an intended change from an accidental one. + +--- + +## Commands + +Everything is profile-gated; a plain `mvn install` compiles this module and runs only its fast +self-tests (~50 tests, under a second). Always pass an isolated local repository — concurrent Maven +runs in this repo have truncated the `epsg` jar mid-read and produced 34 spurious repo-wide failures. + +```bash +export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home +export PATH="$JAVA_HOME/bin:/opt/homebrew/bin:$PATH" +M2="-Dmaven.repo.local=/tmp/m2-golden -Dmaven.javadoc.skip=true" +``` + +### Run the gate + +```bash +mvn -B $M2 -Pgolden -pl golden -am verify +``` + +Generates a table from the working tree into `golden/target/golden/`, merge-joins it against +`golden/baseline/1.4.3/`, applies `golden/rules.yaml`, and **exits non-zero** on any `UNEXPLAINED` +row, `DEAD_RULE`, `PENDING_RULE_FIRED`, `EXPIRED_RULE` or `COUNT_MISMATCH`. The full per-row verdict +lands in `golden/target/golden/golden-report.tsv`. + +`-am` is required: `-pl golden` alone cannot resolve `proj4j-epsg` from the reactor. + +### Re-pin the baseline against released 1.4.3 + +```bash +mvn -B $M2 -Pgolden,golden-baseline -pl golden verify -Dgolden.regenerate=true +``` + +Note the deliberate **absence of `-am`**. The `golden-baseline` profile swaps the `proj4j` and +`proj4j-epsg` coordinates to `1.4.3` from Maven Central, and without `-am` the working tree's code +cannot leak into the baseline at all. That the same `GoldenGenerator` source compiles and runs against +both 1.4.3 and the working tree is not a convenience — it is the property that makes the baseline mean +anything, and it is why `GoldenGenerator` may only touch API that shipped in 1.4.3. + +### Regenerate the committed inputs (rare, and never casually) + +```bash +mvn -B $M2 -Pgolden-baseline -pl golden exec:java \ + -Dexec.mainClass=org.locationtech.proj4j.golden.GoldenInputs \ + -Dexec.args=golden +# or, without the exec plugin: +java -cp golden/target/classes:$(...)/proj4j-1.4.3.jar:$(...)/proj4j-epsg-1.4.3.jar \ + org.locationtech.proj4j.golden.GoldenInputs golden +``` + +This rewrites `probes.tsv` and `pairs.tsv`. **Regenerating the probes moves every probe point, so all +53,430 rows differ and the diff carries no information.** Regenerate, then *immediately* re-pin the +1.4.3 baseline from the same inputs, **in one commit**. A probe file and a baseline generated from +different probes describe nothing. + +--- + +## Layout + +``` +golden/ + pom.xml artifact proj4j-golden; never published + README.md this file + rules.yaml the change declarations; the only file most work touches + probes.tsv COMMITTED INPUT: 9,732 keys x 5 probes, hex doubles + pairs.tsv COMMITTED INPUT: 200 curated CRS->CRS pairs + baseline/1.4.3/ + golden.tsv 53,430 rows, 5.94 MiB -- the pinned observations + golden-index.tsv per-key metadata the rules engine matches on (6 columns) + golden-messages.tsv exception messages, kept out of the numeric table + golden-summary.txt tallies + src/main/java/...golden/ + GoldenGenerator.java main(); 1.4.3 API ONLY. Writes a golden table. + GoldenInputs.java main(); rewrites probes.tsv and pairs.tsv + GoldenFormat.java the format, the total order, and why toHexString + Probes.java probe derivation + the committed table + Angles.java DMS parser, for reading definition text + RegistryDict.java an independent reader for the five init dictionaries + InputSet.java the four sections, incl. the synthetic parameter matrix + MetaCrsCsv.java the MetaCRS CSV reader + src/test/java/...golden/ + GoldenDiff.java main(); the merge join and the rules engine (snakeyaml) + GoldenRules.java rules.yaml schema and matcher + GoldenMasterTest.java THE GATE (skipped unless -Pgolden) + GoldenFormatTest.java format self-tests + GoldenDiffTest.java merge-join and rules-engine self-tests + GoldenRulesTest.java schema validation + loads the committed rules.yaml + ProbesTest.java the four gridExtent defects, as regression tests +``` + +`snakeyaml` is **test scope and only in this module**. `core` stays dependency-free; this module is +never published, so a YAML parser here costs downstream nothing. + +--- + +## The input set + +53,430 rows over 14,502 cases, in four sections. Sections are emitted in US-ASCII order. + +| section | keys | probes | what | +|---|---|---|---| +| `CSV` | 4,770 | 1 | the existing MetaCRS CSV rows, at their own pinned coordinates | +| `PAIR` | 200 | 5 | curated non-WGS84-hub CRS→CRS pairs, all 25 `Datum.TYPE_*` combinations | +| `REG` | 9,013 | 5 | every def in every registry dictionary, WGS84 lon/lat → CRS | +| `SYN` | 519 | 5 | the synthetic parameter matrix | + +`REG` is `epsg` 5,755 · `esri` 2,954 · `nad27` 134 · `nad83` 123 · `world` 47 = **9,013**, asserted by +`ProbesTest.registryDictionaryCountsAreUnchanged`. + +### The synthetic matrix is not optional + +**`+rf=` appears in no registry dictionary and in no test CSV — zero occurrences, verified by grep.** +The largest behavioural fix in this project is the `+rf`/`+f` transposition in +`parser/DatumParameters.java:119-133`. Without a synthetic matrix that fix has *no baseline rows to +move* and this regime would report it as a no-op. Three parts: + +* `proj/` — all 188 of PROJ 9.8.1's `PROJ_HEAD` names (`pipeline`, `helmert`, `cart`, `noop`, + `push`/`pop`/`set`/`id`/`name` included). Names proj4j does not implement produce `EXC:` rows on purpose: when a projection lands, its rows change status from + `EXC:` to `OK`, and that transition is what the rules engine matches. A name list restricted to what + proj4j implements today could not see a new projection arrive. +* `mod//` — 47 modifier parameters × 6 host projections (`aea lcc longlat merc tmerc utm`). + The modifier is **appended** to a canonical parameter set, so `+ellps=` and `+units=` appear twice in + some rows — deliberately probing the duplicate-key precedence defect (`Proj4Parser` uses a `HashMap` + and keeps the *last* occurrence; PROJ keeps the *first*). +* `ellps/` — all 46 of PROJ 9.8.1's `ellps.cpp` names plus `NAD27`, `NAD83` and `australian`. + +### The `PAIR` section + +200 pairs covering every one of the 25 `(srcType, tgtType)` combinations of `Datum.TYPE_UNKNOWN`, +`TYPE_WGS84`, `TYPE_3PARAM`, `TYPE_7PARAM`, `TYPE_GRIDSHIFT`. The key encodes the combination +(`t04/epsg:4267>epsg:26731`), which is what lets a rule scope itself to the exact predicate an +upstream guard tests. Sources are all geographic CRS so the probe is a lon/lat pair and no separate +input pinning is needed. `EPSG:4326` is excluded from both ends: a WGS84-hub pair cannot exercise the +datum-transform decision that three confirmed defects live in. + +**Curation finding, recorded here because it changed the curation:** across all 9,013 defs there is +**not one geographic CRS that proj4j reports as `TYPE_GRIDSHIFT`**, so five of the 25 combinations were +unreachable from observed types. The cause is the confirmed defect at `parser/Proj4Parser.java:53` — +`EPSG:4267` is `+proj=longlat +datum=NAD27 +no_defs` with no `+nadgrids` token, so the first parse of +it executes `Datum.NAD27.setGrids(null)` permanently, JVM-wide, flipping +`TYPE_GRIDSHIFT → TYPE_UNKNOWN` for all 205 codes on that datum. `pairs.tsv` therefore records the +**declared** type: observed where proj4j reports one, corrected to `TYPE_GRIDSHIFT` where the +definition declares a grid-shifted datum. + +### Probe derivation + +No area-of-use database exists, so each CRS's probes are derived from its own definition **text** — +`lat_0`, `lat_1`, `lat_2`, `lat_ts`, `lon_0`/`lonc`, `+south`, `+zone` — not from a parsed +`Projection`. Reading the text means a change to a `Projection` getter cannot move the probes. The +alternative in-repo approach is worse: **all 4,280 rows of `core/src/test/resources/proj4-epsg.csv` +probe the single point `(1.0, -1.0)`**, in the Gulf of Guinea, so a Malaysian `omerc` is evaluated at +`x = -1.24e7`. + +`core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridRoundTripper.gridExtent` attempts the +same thing and has four defects. Each is a regression test in `ProbesTest`: + +1. **`Double.MIN_VALUE` as a max-tracker seed** (`:123`). It is `+4.9e-324` — the smallest *positive* + subnormal, not the most negative double — so for an all-negative-latitude CRS the guard at `:132` + fails and it falls back to a 10° box **on the equator**. *Every southern-hemisphere CRS is probed in + the wrong hemisphere.* Here there is no sentinel: the derivation counts what it found. +2. **`lat == 0.0` conflated with "absent"** (`:150`). `+lat_0=0` is explicit, legal and carried by + every UTM zone. Presence is decided by whether the token is in the text and parses. +3. **Unbounded box height** (`:136`, `gridWidth = 2 * dlat`). `+lat_1=-70 +lat_2=70` gives a 280°-tall + box with corners past both poles. Clamped to ±15° half-height and ±89° latitude. +4. **No `cos(lat)` scaling on the longitude half-width** (`:128`, `:140-143`). Longitude half-width is + divided by `cos(latC)` with a floor, so the box is roughly square on the ground. + +Five probes per key, in a fixed order: centre, SW, SE, NW, NE. Spot checks from the committed file: +`epsg:32701` (UTM 1S) → `(-177, -25)`; `nad27:5300` (American Samoa, `lat_1=-14d16`) → `(-170, +-14.2667)`; `world:CH1903` (`46d57'8.660"N 7d26'22.500"E`) → `(7.4396, 46.9524)`; `epsg:27700` +(`lat_0=49`) → half-width 7.62° from the cosine scaling. + +--- + +## File format + +**TSV, LF, US-ASCII, no quoting, no escaping.** Tab, newline and any byte outside `0x20–0x7e` are +rejected on the way out rather than escaped — the format promises no quoting and the only honest way to +promise that is to refuse. + +Total order: `(section, key, probe)`, each compared as raw US-ASCII bytes. That is `sort` order, `git +diff` order, and the order the streaming merge join requires. It is **not** numeric on the code +(`epsg:10000` sorts before `epsg:2000`); a total order only has to be total and stable, and rules that +need numeric ranges parse the code. `GoldenDiff` verifies the order as it reads and fails hard on a +violation — a hash-map diff would report a mis-sorted file as thousands of phantom ADDED plus REMOVED +and the reviewer would blame the code under test. + +`golden.tsv` columns: `section, key, probe, status, fx, fy, fz, ix, iy, iz, inside`. +`f*` is the forward transform's output; `i*` is the inverse applied to that forward output; `status` is +`OK`, `EXC:`, or `NO_PROBE`; `inside` is the advisory `Projection.inside(lon,lat)` flag — +`T`/`F`, or `E` when it throws (it can: it routes through `normalizeLongitude`), or `-` when the input +is not lon/lat. `Projection.inside` has **zero callers in `core`**; this is the only place its value is +ever observed. + +Exception *messages* live in `golden-messages.tsv`, and per-key metadata in `golden-index.tsv`, so that +neither message rewording nor a definition-text edit perturbs the numeric table. + +`golden-index.tsv` columns: `section, key, srcproj, tgtproj, params, datums`. `params` is the sorted +union of both sides' parameter **key** names; `datums` is the sorted union of both sides' +`+datum=` **values**. The sixth column was added on 2026-08-01 and is what makes +`DATUM-NAD27-NADCON-SHIFT-APPLIED` a five-line rule instead of a 205-key enumeration — see +[the fourth triage](#fourth-triage-the-nad27-cluster-retired-and-the-out-of-grid-fail-open-closed--2026-08-01-late). +`GoldenDiff.readIndex` still accepts the five-column header, because `baseline/1.4.3/golden-index.tsv` +is a committed artefact of a released build that a normal run does not rewrite; a legacy row yields an +**empty** datum set, so a `datums:` predicate declines it rather than silently reading the `params` +column. That path is reachable only for `REMOVED` rows, of which there are currently none, and it makes +a rule under-claim rather than over-claim — which `expected_rows` turns into a build failure instead of +a silence. + +### Why `Double.toHexString` and not `%.17g` + +Four properties, all load-bearing, and decimal formatting fails all four: + +1. **Bijective on bit patterns.** Every double has exactly one rendering and `parseDouble` inverts it + exactly, so a diff of two golden files is a diff of raw bits — and *a change to the formatting code + cannot make every row differ*, because there is no rounding decision to change. With `%.17g`, a + future tweak from 17 to 16 digits rewrites all 53,430 rows and buries whatever real change was in + there. +2. **Distinguishes `+0.0` from `-0.0`.** A real distinction, not noise: it is the difference between + approaching the equator from the north and from the south, and between the two sides of the + antimeridian, and it flips on sign-handling changes in exactly the code being rewritten. `%.17g` + erases it. +3. **Locale-immune.** proj4j has live locale-dependent formatting defects — `ProjCoordinate.DECIMAL_FORMAT` + is a public mutable static `DecimalFormat` with no `Locale`, and `units/Unit` and `units/AngleFormat` + use `NumberFormat.getNumberInstance()`. A suite built on `String.format` would inherit that bug class + and its baseline would be unreproducible on a colleague's machine. +4. **A 1-ULP difference is exact by construction** — one hex digit, no arithmetic needed to read it. + +NaN payloads are *not* preserved (`toHexString` collapses every NaN to `NaN`); the payload is a JVM +implementation detail, not behaviour. + +--- + +## `rules.yaml` + +Full schema in `GoldenRules.java`. Rules are evaluated in **file order, first match wins**, so order +them most-specific first. + +```yaml +version: 1 +rules: + - id: PARSE-VUNITS-ACCEPTED # required, unique, [A-Za-z0-9._-]+ + status: active # active (default) | pending + expires: 2027-06-30 # required, ISO-8601 + expected_rows: 964 # required: an exact integer, or the literal TBD + reason: | # required, substantive + why this change is intended + match: # every predicate present must hold (AND) + sections: [REG, SYN] # golden section + keys: ["mod/*/rf"] # glob on the key ('*' only; '.' is literal) + authorities: [epsg, esri] # authority prefix of the key + code_min: 2000 # inclusive numeric code range; non-numeric codes never match + code_max: 32766 + src_proj: [longlat] # +proj= of the source CRS + tgt_proj: [merc, tmerc] # +proj= of the target CRS + params_present: [rf, f] # ANY of these parameter keys present (OR) + params_absent: [datum] # ALL of these absent + datums: [NAD27] # ANY of these +datum= VALUES, either side (OR) + datums_absent: [WGS84] # ALL of these values absent + probes: [0, 1, 2, 3, 4] # probe index + classifications: [CHANGED] # CHANGED | ADDED | REMOVED + status_from: "OK" # glob on the baseline status + status_to: "EXC:*" # glob on the current status + expect: # constraints; failing one makes the rule DECLINE the row + dimensions: [fy, iy] # only these numeric columns may move + allow_status_change: true # default false + allow_inside_change: false # default false + allow_nonfinite: true # default false + magnitude: {min: 1.0, max: 1.0e9} +``` + +### The four things that stop a rule becoming a rubber stamp + +1. **`expected_rows` is exact and two-sided.** Not a maximum. A fix that moves *fewer* rows than + declared is as interesting as one that moves more — usually it means a second defect is masking part + of it, which is exactly how the `+R` / Albers-spherical-inverse coupling was found. +2. **A rule matching zero rows is a `DEAD_RULE` failure.** Stale rules are permanent licences to change + behaviour nobody is watching. Deleting one is a one-line commit; leaving it is a hole. +3. **`expires` is mandatory.** A rule says "this change is intended *during this piece of work*". Past + the release it is folded into a new baseline and deleted. The expiry forces that conversation. +4. **A failing `expect` clause makes the rule DECLINE the row, not claim it.** The row falls through to + the next rule and ultimately to `UNEXPLAINED`, and the report records which rules declined and why. + The alternative — treating matched-but-unexpected as explained — *is* the rubber stamp. + +`status: pending` exists because rules must be written before the code lands, so that the first person +to land a change does not meet an `UNEXPLAINED` wall. A pending rule must match **exactly zero** rows; +the moment it matches one the build fails with `PENDING_RULE_FIRED`, telling you to flip it to `active` +and pin the count. It cannot hide anything. + +### Units warning + +`magnitude` is `|current − baseline|` **in the raw units of the column**, and those differ by row: +`fx/fy/fz` are in the target CRS's units (metres for a projected target, degrees for a geographic one) +and `ix/iy/iz` are always WGS84 degrees. There is deliberately **no unit normalisation**. Normalising +would mean choosing a metric branch per row — exactly the decision that inflated a downstream team's +entire worklist by ~111,319×. Choose the band with the section's units in mind and say which you meant +in `reason`. + +--- + +## Seeded rules, and the counts that are honestly unknown + +> **SUPERSEDED 2026-08-01: there are no unknown counts left. All 42 rules are `status: active` with +> a pinned integer `expected_rows`, and `GoldenRulesTest.noActiveRuleMayLeaveItsExpectedRowsUnpinned` +> now makes that a build failure rather than a convention.** *(This said 38 until 2026-08-02 and 41 +> until 2026-08-03; the file grows and the prose does not, which is why the count is re-derived here +> rather than copied. Three independent methods that agree as of 2026-08-03: a YAML parse of +> `golden/rules.yaml` gives **42** rules, 42 unique `id`s, 42 with `status: active` and 42 with +> `expected_rows`; `grep -ac '^ - id:'` gives **42**; and the gate itself prints +> `rules.yaml: 42/42 rules carry a pinned expected_rows`. Note a bare `grep -ac 'id:'` overcounts — +> some occurrences are prose inside `reason` blocks and comments — which is exactly the kind of +> unanchored count that put a wrong number here in the first place. The nine remaining `TBD` tokens +> in the file are all inside comments explaining why something is **not** TBD.)* +> +> *The 42nd rule is **`NUM-LAEA-HYPOT-TO-NORM2`**, and how it was discovered is the argument for +> pinning in one line: `LambertAzimuthalEqualAreaProjection`'s `Math.hypot` → `MathHelpers.norm2` +> moved 2 rows into `NUM-KARNEY-LATITUDE-CORE`'s territory, which raised a `COUNT_MISMATCH` at 19,326 +> against its pin of 19,324. **A globbed rule would have absorbed them in silence.** The new rule +> sits immediately before `NUM-KARNEY-LATITUDE-CORE` so that rule keeps its 19,324, carries +> `expected_rows: 2`, and enumerates both keys — `proj4-epsg.csv:00619` (EPSG:4326→2163) and +> `proj4-epsg.csv:01495` (EPSG:4326→3409). `EPSG:3408`, the north-polar twin one line earlier, did +> not move.* The section below is kept because its +> *reasoning* about when to pin is still right, and because the argument it makes turned out to be +> half wrong in a way worth recording. +> +> **What the argument got wrong.** "The tree is mid-flight, so any number pinned today describes a +> transient state" is true, and it is an argument *for* pinning, not against. A pinned count that +> becomes wrong fails with a `COUNT_MISMATCH` naming the rule — a two-line re-pin and a sentence of +> explanation. A `TBD` that becomes wrong says nothing at all. Fifteen of the 38 rules **the file +> held on 2026-08-01** were `active` +> with `TBD`, which is 40% of the file with its only size check switched off, and the rule this +> project most often cites as proof the mechanism works — +> `FAILCLOSED-UNCHECKED-ISE-REPLACED`, which grew 55 → 71 by absorbing 16 grid rows — **was one of +> them**, so that theft was silent by construction. +> +> **How the 15 were pinned, and why the numbers can be believed.** One `mvn -Pgolden -pl golden -am +> verify` on a frozen `rsync` snapshot of the working tree (`--exclude .git --exclude .claude +> --exclude target/`), so nothing could move under the run; the tree was confirmed unchanged +> afterwards. Every one of the 15 was then cross-checked against a *second, independent* source: +> `FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED`'s `reason` already contains written arithmetic predicting +> the post-grid-rule count for eight of them (`PROJ-AEA-SPHERICAL-INVERSE 164 -> 159`, +> `PARSE-DMS-PARAMETER-VALUE 10 -> 8`, `DATUM-ISEQUAL-SELF-COMPARISON 332 -> 284`, +> `NUM-KARNEY-LATITUDE-CORE 20,191 -> 19,336`, and this rule itself "lands at 37"), and each rule's +> own header comment records an observed figure for the rest. **Both sources agree on all 15.** A +> re-run with the counts in place reported **no `COUNT_MISMATCH` and no `DEAD_RULE`**, and the +> INTENDED/UNEXPLAINED split was unchanged at 39,116 / 2,291 — pinning froze the attribution, it did +> not alter it. +> +> **No rule theft was exposed, and two candidates were checked rather than assumed.** (a) +> `PARSE-DMS-PARAMETER-VALUE` claims 8 where its own comment predicted the structural 10; the two +> missing rows are `nad27:5001` probes 1 and 3, which now end at `EXC:CrsTransformException` and are +> claimed by the grid rule. That is **not** an ordering artefact — this rule's `status_to: "OK"` +> declines them at any position in the file. (b) 16 of the PAIR rows matching +> `DATUM-TYPE-UNKNOWN-HOISTED`'s key globs are claimed earlier by +> `FAILCLOSED-UNCHECKED-ISE-REPLACED`; all 16 are status changes +> (`IllegalStateException → ProjectionException`) and `DATUM-TYPE-UNKNOWN-HOISTED` does not set +> `allow_status_change`, so it declines them wherever it sits. Both were verified on the frozen +> report, not inferred from the file order. +> +> **The 15 counts, as pinned:** +> +> | rule | pinned | corroborating source | +> |---|---:|---| +> | `PARSE-DMS-PARAMETER-VALUE` | 8 | NAD27 rule predicts `10 -> 8` | +> | `PROJ-AEA-SPHERICAL-INVERSE` | 159 | NAD27 rule predicts `164 -> 159` | +> | `PARSE-RF-F-TRANSPOSED` | 40 | this README's own "40 — the only rows this fix can move" | +> | `PARSE-R-DECLARES-SPHERE` | 250 | this README's seeded table | +> | `PARSE-RF-IN-WORLD-DICTIONARY` | 5 | rule header comment | +> | `PARSE-FIRST-MATCH-WINS` | 71 | rule header comment | +> | `FAILCLOSED-UNCHECKED-ISE-REPLACED` | 37 | NAD27 rule predicts "lands at 37" | +> | `DATUM-TYPE-UNKNOWN-HOISTED` | 251 | derived here: 347 candidate PAIR rows = 251 + 16 + 80 | +> | `DATUM-ISEQUAL-SELF-COMPARISON` | 284 | NAD27 rule predicts `332 -> 284` | +> | `NUM-PHI2-CONVERGES-ON-EXTREME-ELLIPSOIDS` | 6 | rule header comment | +> | `PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT` | 48 | rule header comment, per-key breakdown | +> | `PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO` | 45 | rule header comment | +> | `PROJ-EQC-EQDC-SINU-REGISTRY-ROWS` | 67 | rule header comment: `82 − 15` | +> | `PARSE-UNITS-PRECEDES-TO-METER` | 17 | rule header comment: `5+4+4+4` | +> | `NUM-KARNEY-LATITUDE-CORE` | 19336 | NAD27 rule predicts `20,191 -> 19,336` | +> +> `DATUM-TYPE-UNKNOWN-HOISTED` is the only one with no pre-existing prediction anywhere, which is +> why its derivation is written out in the rule's header rather than just its number. + +Seven rules ship. **Only `PARSE-VUNITS-ACCEPTED` has a pinned `expected_rows`**; the rest are `TBD`, +because the working tree is mid-flight across six concurrent streams and any number pinned today +describes a transient state. **No count here is invented.** Pin each one from the observed value the +gate prints (`rows claimed per rule`) once its stream has landed. + +| id | `expected_rows` | observed today | note | +|---|---|---|---| +| `PARSE-VUNITS-ACCEPTED` | **964** | 964 | pinned; measured 2026-07-31 | +| `PROJ-AEA-SPHERICAL-INVERSE` | TBD | 164 | ordered before the `+R` rule; the two are one release | +| `PARSE-RF-F-TRANSPOSED` | TBD | 40 | the only rows in the suite this fix can move | +| `PARSE-R-DECLARES-SPHERE` | TBD | 250 | | +| `DATUM-TYPE-UNKNOWN-HOISTED` | TBD | 253 | | +| `DATUM-ISEQUAL-SELF-COMPARISON` | TBD | 431 | | +| `NUM-KARNEY-LATITUDE-CORE` | TBD | 16,202 | **provisional; not owned by this module** | + +The "observed today" column is a snapshot of a mid-flight tree, printed by the gate itself. It is +recorded so the numbers are not lost, **not** as a licence to paste them into `expected_rows`: pin a +count only when you know its stream has finished landing, and pin it from a run you did yourself. + +**On the `+vunits` count.** The plan and the task brief quote a smaller figure — "943 rows: 158 registry +defs × 5 probes + 143 CSV rows" (which is 933, not 943) and `expected_rows: 944`. The measured value +with *this* input set is **964** = 790 `REG` (158 defs × 5 probes, matching the plan's 158) + 144 `CSV` ++ 30 `SYN`. It differs for two reasons that are properties of this input set rather than errors in +theirs: the CSV side is 144 rows here, not 143, and neither figure includes the synthetic `+vunits` +modifier sweep, which did not exist when those numbers were written. + +**`NUM-KARNEY-LATITUDE-CORE` is a placeholder owned by the numerical-core stream, not by this module.** +It absorbs sub-microscopic drift only — magnitude ≤ `1e-6` in raw column units, no status change, no +`inside` change, no non-finite endpoint — so it cannot claim anything structural. It exists so that +16,202 rows of genuine sub-micron movement do not bury the ~2,700 rows of structural change +underneath them. It expires 2026-12-31 deliberately: it is a migration-window rule, not a +specification. The band was chosen from the measured magnitude distribution, which is **bimodal with an +empty valley between 1e-5 and 1e-3** — consistent with the plan's independent observation that proj4j's +errors are either sub-metre or enormous, with no long tail of subtle drift. + +### Current state of the gate: red, by design + +As of this commit, `mvn -Pgolden -pl golden -am verify` reports: + +``` +32,397 UNCHANGED · 21,033 CHANGED · 0 ADDED · 0 REMOVED · 18,304 INTENDED · 2,729 UNEXPLAINED +``` + +The 2,729 unexplained rows are **the backlog**, not a defect in this module. They are other streams' +in-flight changes, and each stream owner adds the rule that claims theirs. This module deliberately +does not declare another agent's change intended on their behalf — that would be exactly the failure +mode it exists to prevent. + +Notable shapes in the unexplained set, worth routing to their owners: + +* ~1,700 rows of `OK → OK` numeric movement above `1e-5`, i.e. above the numerical-core band. +* `23` rows `OK → EXC:java.lang.IllegalStateException` in `PAIR` — a **new** non-`Proj4jException` + escape, which belongs to the fail-closed work (`GeocentricConverter.java:122-125` throws + `IllegalStateException`). +* `45` rows turning into `EXC:java.lang.NullPointerException` (`35` from + `EXC:UnsupportedParameterException`, `10` from `OK`) in `SYN` — an NPE is never an intended + failure mode. +* `15` rows `EXC:InvalidValueException → EXC:UnsupportedParameterException` in `SYN` — a parse-error + reclassification. +* A handful of rows with magnitudes of `1e23`–`1e212`. + +--- + +## Triage of the unexplained backlog — 2026-08-01 + +> **Superseded in its numbers, not in its reasoning.** A second triage later the same day, after +> eight more streams landed, is [below](#second-triage-of-the-unexplained-backlog--2026-08-01-later-the-same-day). +> Read this section for the mechanisms and the arguments; read that one for the current tallies. Two +> of this section's own predictions came true and are recorded there: the `NoSuchElementException` +> blind spot became visible, and `FAILCLOSED-POLE-OVERSHOOT-REJECTED` became the `DEAD_RULE` its +> reason said it would. + +A pass over the whole unexplained set, on a tree frozen to `/tmp` so that the A/B differed in one +file only. **Every count on this page is from a run the author did; none is inherited.** + +### The number the section above quotes is already historical + +The gate reported `2,729 UNEXPLAINED` when this module landed. On a snapshot taken the next morning +it reported **4,548**, and on a snapshot taken *twenty minutes after that*, **34,533** — of which +32,213 rows were one in-flight `ExtendedTransverseMercatorProjection` change rejecting every +`etmerc`/`utm` CRS with *"the Poder/Engsager transverse Mercator requires an ellipsoid; eccentricity +must not be zero"*, including CRS on GRS80. That third snapshot was discarded rather than triaged. + +**The lesson is procedural and belongs here permanently: a single number from this gate describes a +moment, not a state.** Two things follow, and both were load-bearing in this triage. + +1. **Freeze before you triage.** `tar` the tree to `/tmp`, run there, and do the A/B between two + copies that differ in exactly the files you changed. A cluster that appears between two runs of + the live tree is more likely another agent's fix landing than anything about your change. +2. **Re-check a cluster against the live tree before you write a rule for it.** 54 rows in this + triage (`Krovak` × 44, `NZMG` × 10, *"which has no inverse"*) were already fixed in the live tree + by the time they were analysed — `BasicCoordinateTransform.inverseAvailable` had replaced a bare + `hasInverse()` test. A rule written for them would have been a `DEAD_RULE` within the hour. + +### How the backlog broke down + +On the frozen tree the set was **4,548** rows. After this pass it is **3,006**, and the movement is: + +| | rows | | +|---|---|---| +| **Category 2 — regression, fixed here** | 1,058 | `+proj=geocent`; 1,045 back to `UNCHANGED`, 8 to the Karney band, 5 declared | +| **Category 1 — intended, rule now written** | 484 | eight new rules, below | +| **Category 3 — honestly unexplained** | 3,006 | mechanisms identified for most; owners named | + +The 484 is 392 rows this pass identified for itself plus **92 handed over already attributed** by the +stream that caused them — 90 `NO_INVERSE_AVAILABLE` and 2 pole-overshoot rows. A handover with the +mechanism attached is the cheapest rule in the file to write and the most trustworthy; **the two +counts pinned exactly rather than left `TBD` are both from that handover**, which is not a +coincidence. + +### Category 1: the eight rules this pass added + +| id | rows | pinned? | mechanism | +|---|---|---|---| +| `PROJ-GEOCENT-LON0-APPLIED` | 5 | **yes** | `+lon_0` now applied to a cartesian right-hand side, per `fwd.cpp:105-112` | +| `PARSE-NO-KEYWORD-ALLOWLIST` | 95 | TBD | `ParseMode.PROJ_COMPATIBLE` is the default; PROJ has no allow-list | +| `PARSE-DMS-PARAMETER-VALUE` | 10 | TBD | `alpha=-36d52'11.6315` no longer escapes as a raw `NumberFormatException` | +| `PARSE-RF-IN-WORLD-DICTIONARY` | 5 | TBD | `world:palestine` carries `rf=` — see the correction below | +| `PARSE-FIRST-MATCH-WINS` | 71 | TBD | duplicate parameter keys: last-wins → first-wins | +| `FAILCLOSED-UNCHECKED-ISE-REPLACED` | 211 → 55 | TBD | 1.4.3's unchecked `java.lang.IllegalStateException` is now a `Proj4jException` | +| `FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY` | 90 | **yes** | 18 forward-only projections refused as a transformation source — **75 of the 90 were `OK` in 1.4.3** | +| `FAILCLOSED-POLE-OVERSHOOT-REJECTED` | 2 | **yes** | `checkForwardDomain` rejects a round trip that landed 176 m past the north pole | + +Three carry a pinned `expected_rows`; the rest are `TBD` with the observed count in a comment, per +the rule this file already states. `FAILCLOSED-UNCHECKED-ISE-REPLACED` is the clearest case for +`TBD`: it claimed **211** rows on the frozen tree and **55** on the live tree four hours later, +because the 156 rows in the difference moved from `IllegalStateException → ProjectionException` to +`IllegalStateException → OK` as the datum stream landed. Same rule, same mechanism, same code, and a +number that moved by a factor of four without anything being wrong. + +**Where a pin is deliberately a tripwire.** `FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY` is pinned at 90 += 18 projections × 5 probes, which is structural. If one of the 18 acquires an inverse the count +drops and the gate fails with `COUNT_MISMATCH`. That is the point: a projection gaining an inverse is +a change somebody should have to describe, and this is the cheapest place to make them. + +**The `hasInverse()` trap, encoded in the rule rather than smoothed over.** The gate that raises +these errors (`BasicCoordinateTransform.inverseAvailable`) deliberately does *not* key on +`hasInverse()`. `KrovakProjection` and `NewZealandMapGridProjection` implement `projectInverse` and +never declare `hasInverse()`, so a `hasInverse()`-only gate rejected **EPSG:2065, EPSG:5514 and +EPSG:27200** — three working CRS — while `LandsatProjection` declares it and overrides nothing. The +rule therefore lists its 18 projections by name instead of globbing `proj/*`, which makes it +*structurally* impossible for those three CRS to be swept in later. `+proj=geocent` is excluded by +the same list, and for the same reason in reverse: it is invertible, and it now says so. + +**A rule that looked right and was not.** `PARSE-NO-KEYWORD-ALLOWLIST` was first written with the +obvious predicate — `status_from: UnsupportedParameterException, status_to: OK` and nothing else. It +claimed **270** rows instead of 95, and `PARSE-R-DECLARES-SPHERE` dropped from 250 to **75**. The +175 rows it had taken were `mod//R*`: 1.4.3 rejected `+R_A` and its siblings as unsupported +parameters, so the row moves from an exception to a coordinate *and* that coordinate is the one the +`+R` sphere fix changed. The rule would have absorbed the entire `+R` numeric change behind a +parse-acceptance reason. It is now scoped to the three tokens it means. **`expected_rows` being +exact and two-sided on the *other* rule is what caught it** — that is the mechanism working, and it +is worth knowing that it works by protecting rules from each other, not only from code. + +### Correction: `+rf` is **not** absent from the registry dictionaries + +The "The synthetic matrix is not optional" section above states, in bold, that `+rf=` appears in no +registry dictionary and no test CSV — *"zero occurrences, verified by grep"* — and concludes that the +synthetic rows are "the **ONLY** baseline rows this fix can move". The CSV half is right. The +dictionary half is **wrong**, and the reason is worth recording because it will recur: **the +dictionaries write parameters without the leading `+`**, so `grep '+rf='` finds nothing and +`grep 'rf='` finds two — + +``` +epsg/src/main/resources/proj4/nad/world:96 proj=tmerc a=6378300.79 rf=293.488307656 +epsg/src/main/resources/proj4/nad/world:110 proj=omerc a=6377295.66402 rf=300.8017 +``` + +The synthetic matrix is still not optional — it is what puts `+rf` in front of six different host +projections, and `world:malay` is unreachable in 1.4.3 for an unrelated reason. But +`PARSE-RF-F-TRANSPOSED` is scoped `sections: [SYN]` and so left `world:palestine` unexplained, and +that CRS is a good demonstration of the defect's size: at its own origin +(`lat_0=31d44'2.749"N lon_0=35d12'43.490"E`) the 1.4.3 round trip returns latitude **−3.3e205 +degrees**, and two probes have eastings around **1.3e24 m**, because `es = rf(2 − rf) = −85,540`. +`PARSE-RF-IN-WORLD-DICTIONARY` claims it, with a magnitude **floor** of `1e3` so that it cannot also +absorb future sub-kilometre `tmerc` movement on the same five rows. + +### Category 2: the one regression found, and where it came from + +**`+proj=geocent` could not be used as a transformation source. 1,058 rows, 330 keys.** +`GeocentProjection` implements its inverse as an override of `inverseProjectRadians`, not as a +`projectInverse(double, double, ProjCoordinate)` — it cannot supply the latter, because that +signature has no `z` — and it did not declare `hasInverse()`. `BasicCoordinateTransform`'s new +inverse-availability gate therefore classified all 181 `epsg` `+proj=geocent` defs, the 148 MetaCRS +CSV cases that reference them and the one synthetic row as non-invertible and refused them with +`CrsTransformException: ... uses projection None, which has no inverse`. Every one of them +round-tripped in 1.4.3. + +Fixed in `GeocentProjection` (see its javadoc for the whole account, including the separate +read-`dst`-instead-of-`src` defect that the golden regime **cannot** see, because +`BasicCoordinateTransform` aliases the two arguments). The golden proof is the cleanest shape this +regime produces: + +``` +1,045 rows UNEXPLAINED -> UNCHANGED bit-identical to 1.4.3, no rule needed + 8 rows -> NUM-KARNEY-LATITUDE-CORE 1e-9 m in the height ordinate, from OTHER streams' + datum-stage drift, newly observable because the row + used to be an exception + 5 rows -> PROJ-GEOCENT-LON0-APPLIED the one deliberate behaviour change +``` + +**1,045 rows returning to the baseline is a better outcome than a rule for them**, and it is worth +being explicit about why: a rule would have recorded "we intended to change these", when what +actually happened is that they should never have moved. + +### Category 3: what is left, and who owns it + +**2,379 rows of `OK → OK` numeric movement.** All of it on the ten actively-owned projections: +`tmerc` 1,392 · `lcc` 490 · `utm` 152 · `cass` 131 · `poly` 55 · `eqdc` 49 · `merc` 29 · `omerc` 16. +Magnitudes are bimodal exactly as this file predicted — 1,230 rows in `1e-6 .. 1e-5` (just above the +Karney band) and 937 in `1 .. 1e3`, with 17 rows in the whole decade between. Mechanisms identified +but **deliberately not ruled on, because their files are being rewritten concurrently and this +module does not declare another agent's change on their behalf**: + +* **`+lat_ts` is now applied on Mercator.** `REG/epsg:3388` (Caspian Sea Mercator, `+lat_ts=42`) at + probe `(44.271836, 47.0)` moves `fy` `5,910,915.08 → 4,399,262.94` m — a factor of + `0.7443 = 1/1.3436`, which is `k0 = msfn(42°)`. The same factor appears on `epsg:3994`, + `SYN/mod/merc/lat_ts` and `proj4-epsg.csv:01480/01766/01862`. → Mercator owner. +* **`SYN/proj/bonne` probe 0**: `ix` `−170 → 10` at a probe of longitude 10 — the inverse was 180° + out. → projections owner. +* **`SYN/proj/eqdc` probe 0**: `fy` `5,009,377 → 0` at the CRS centre — the `rho0` subtraction was + missing. → projections owner. +* **`SYN/proj/putp2` probe 4**: `iy` `90 → 60` at a probe of latitude 60. → projections owner. + +**478 rows `OK → ProjectionException`, and they are all improvements.** 468 are +`inv: LongLat: invalid latitude ...` — 1.4.3 returned latitudes of **−135°, −207°, −489°** as +coordinates (`proj4-epsg.csv:00518`, `:00520`, `:00521`) and they are now rejected by +`Projection.checkForwardDomain`. Ten are `PAIR` rows whose 1.4.3 forward was +**`fx = fy = Infinity`** (`t01/epsg:4034>epsg:2150`, `t04/epsg:4007>epsg:26716`, +`t11/epsg:4283>epsg:2150`, `t14/epsg:4075>epsg:26716`, probes 0/2/4). → fail-closed owner, whose +rule this is; no numeric regression is hiding here. The remaining 2 of the original 480 are +`SYN/proj/wag2`, now claimed by `FAILCLOSED-POLE-OVERSHOOT-REJECTED`. + +**64 rows `OK → CrsTransformException`, down from 154.** 54 (`Krovak`, `NZMG`) were already fixed in +the live tree before they were analysed, and 90 are now claimed by +`FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY`. What is left is the ~20 rows of the +geodetic-latitude-out-of-range guard plus the residue of the forward-only set on keys the rule's +18-name list deliberately excludes. → fail-closed owner. + +**70 rows in small heterogeneous clusters**, all exception-to-exception or exception-to-`OK`, listed +here so nobody has to re-derive them: `world:new_zealand`, `proj/nzmg`, `proj4-epsg.csv:03288` +(`InvalidValueException → CrsTransformException`, 11 — the other 15 of that cluster were +`proj/adams_hemi`, `proj/adams_ws1` and `proj/guyou`, now claimed by +`FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY`); `epsg:5472`, `esri:102766`, `esri:65061`, `esri:65161`, `nad27:5400`, `proj/adams_ws2`, +`proj/peirce_q`, `proj/poly`, `proj/spilhaus` (`→ OK`, 21 — newly registered projections); +`proj/alsk`, `proj/apian`, `proj/bacon` (`→ UnsupportedParameterException`, 15); +`world:madagascar` (`→ InvalidValueException`, 5 — `+rot_conv` now accepted, `labrd` still +unimplemented); `ellps/andrae`, `ellps/NWL9D` (`ConvergenceFailureException → OK`, 6); `proj/omerc` +(5); `proj4-epsg.csv:02092` (1). + +**`EXC:java.lang.IllegalStateException → OK` — 6 rows frozen, 162 live — left unexplained on +purpose**, and this is the clearest case in the file of an honest `UNEXPLAINED` beating a rule. +`FAILCLOSED-UNCHECKED-ISE-REPLACED` bounds itself with `status_to: "EXC:org.locationtech.proj4j.*"` +precisely to exclude them. Claiming them would mean writing *"1.4.3 crashed and we now return X"* +with no statement about X, and the baseline row is all-NaN so there is nothing to compare X against. +The datum stream has since attributed them to its own work; **the mechanism statement and the rule +are theirs to write**, and until they exist an `UNEXPLAINED` row is the correct record. On the frozen +tree the six were `t03/epsg:4007>epsg:20022`, `t03/epsg:4034>epsg:20092`, `t20/epsg:4214>epsg:2366`, +`t24/epsg:4155>epsg:26748#4`, `t30/epsg:4817>epsg:2366`, `t34/epsg:4289>epsg:26748#4`. + +### Reserved for the transverse-Mercator stream — do not write these + +Two clusters are explicitly **not** this pass's to claim, recorded here so that nobody writes them +twice and nobody mistakes them for backlog: + +* **~332 rows, `fwd: Extended Transverse Mercator: longitude … outside the projection domain`.** + An in-flight `tmerc` regression with the same root cause as the concurrent `MetaCRSTest` + failures, being fixed as this was written. **A rule here would be a rule for a bug.** An earlier + snapshot of the same defect wearing a different message (*"requires an ellipsoid; eccentricity + must not be zero"*) accounted for 32,213 rows, which is how the 34,533 figure quoted at the top + of this section arose. +* **1,163 rows of `proj4-epsg.csv` being re-pinned against PROJ 9.8.1**, because their reference + values were generated by the Evenden/Snyder series 9.8.1 no longer ships. The `tmerc` stream owns + that rule, and its mechanism is the model this file should be measured against: every affected + row probes **≥ 12.5° from its central meridian**, exactly where E/S first exceeds the file's + 0.1 m tolerance — 0.1118 m at 12.5°, 23 mm at 10°, 0.83 mm at 6° — and **not one row inside + 12.5° moved.** A mechanism that predicts which rows move *and* which do not is the standard; a + row list is not. + +### The non-`Proj4jException` escapes: two closed, one open + +Measured on the live tree, 2026-08-01. **The current side of the table now contains exactly one +non-`Proj4jException` status**, and it is the one nobody had noticed: + +``` +current side: 50 EXC:java.util.NoSuchElementException +baseline side: 217 EXC:java.lang.IllegalStateException + 50 EXC:java.util.NoSuchElementException + 10 EXC:java.lang.NumberFormatException +``` + +* **`NullPointerException`: 45 → 0.** Gone between two runs four hours apart. **No rule was written + for them, and none should be**: no mechanism was verified for the fix, and a rule asserting an + intent nobody stated is worse than an `UNCHANGED` row. They are simply gone. +* **`IllegalStateException`: 217 → 0** on the current side. `GeocentricConverter.java:131` was the + only source on the coordinate path and now raises `CrsTransformException(INVALID_COORDINATE)`, so + `catch (Proj4jException)` sees it. The 217 split **55** `→ ProjectionException` (claimed by + `FAILCLOSED-UNCHECKED-ISE-REPLACED`), **162** `→ OK` (the datum stream's, unclaimed — see below) + and **0** remaining. The `23` rows the brief described as `OK → IllegalStateException` no longer + exist in either direction. +* **`NumberFormatException`: 10 → 0**, claimed by `PARSE-DMS-PARAMETER-VALUE`. + +Which leaves one, and it is invisible to this gate: + +* **50 rows throw `java.util.NoSuchElementException`, in the baseline *and* in the current run.** + `Projection.setSouthernHemisphere` (`Projection.java:946`) and `Projection.setHeightOfOrbit` + (`Projection.java:1053`) throw a bare `NoSuchElementException` — not a `Proj4jException` — for any + projection that does not implement them, with **no message at all**. `SYN/mod/{aea,lcc,longlat, + merc,tmerc,utm}/h` and `SYN/mod/{aea,lcc,longlat,merc}/south` hit it. Because it is unchanged + since 1.4.3 the diff never mentions it: **this regime reports changes, so a defect that predates + the baseline is exactly what it cannot see.** → fail-closed owner. + +And one **regression in kind** rather than in value, which the no-sentinels rule covers but the +`(0,0,0)` fix did not reach: + +* **`PAIR/t14/epsg:4173>epsg:26748` probe 4** (`(5, 5)` into NAD27 Alaska zone 8). The `tmerc` + forward answers `1.289e8, 2.662e7` m for a point 5,000 km outside the CRS. The inverse then lands + on the Z axis, and `GeocentricConverter.convertGeocentricToGeodeticIter`'s `P/a < genau` branch + (`GeocentricConverter.java:192-193`, `At_Pole = true; Longitude = 0.0`) answers + **`(0°, 90°, 0.000104 m)`** — the north pole, at a tenth of a millimetre. 1.4.3 answered latitude + `−9.36e10°`, which no caller could mistake for a coordinate. The `(0,0,0)` centre-of-mass fiction + was removed a few lines below; the on-axis fiction was not, and it is *more* dangerous because it + is entirely plausible. → fail-closed owner. + +--- + +## Fourth triage: the NAD27 cluster retired and the out-of-grid fail-open closed — 2026-08-01, late + +> This pass **wrote code**, which the previous three did not, so it is the first one whose numbers +> move because behaviour changed rather than because a rule was written. Read the third triage above +> for the clusters this inherited. + +Everything here is from a **frozen `/tmp` A/B** in which the two trees differed in exactly the +fourteen files this stream touched — one of them in `core/src/main` (`datum/Grid.java`) — and every +number is from a run the author did. The live tree had three other streams writing at the time +(`GeocentricConverter`, `AzimuthalProjection`, `conformance/**`), which is precisely why the A/B was +frozen: measured live, this change would have been credited with their movement too. + +``` +before 12,225 UNCHANGED · 41,205 CHANGED · 0 ADDED · 0 REMOVED · 37,901 INTENDED · 3,304 UNEXPLAINED +after 12,023 UNCHANGED · 41,407 CHANGED · 0 ADDED · 0 REMOVED · 39,116 INTENDED · 2,291 UNEXPLAINED +``` + +No `COUNT_MISMATCH`, no `DEAD_RULE`, no `PENDING_RULE_FIRED`, no `EXPIRED_RULE`. **Two rules added, +both pinned exactly, and both pins were right on the first run** — because the predicate was measured +against the frozen report before the rule was written, not pasted from the gate's own count +afterwards. Four rules re-pinned downward in place, with the arithmetic itemised. + +### The change is 1,995 rows, not 41 + +`Grid.shift`'s no-table `else` branch was empty: the coordinate came back **bit-identical to the +input**, which is indistinguishable from "the shift was zero", and the transform reported success. It +now raises `CrsTransformException(COORDINATE_OUTSIDE_GRID)`. + +The third triage found this through **40 rows** at the 40°N edge of `ntv1_can.dat`. That was the +symptom that made it visible, and it is a small part of the population: **1,995 rows change status**, +across all four sections (`REG` 1,673 · `CSV` 148 · `PAIR` 144 · `SYN` 30). **202 of them were +bit-identical to 1.4.3 beforehand** — the fail-open was so faithful that the golden regime, which +reports *change*, could not see them at all. That is the same blind spot +`FAILCLOSED-NO-SUCH-ELEMENT-REPLACED` came out of, and it is worth stating as a standing property: +**a defect that both sides share is exactly what this suite cannot report**, and it becomes visible +only when somebody changes one side. + +Upstream was measured rather than read. With `PROJ_DATA` pointed at a directory holding only the +grids this repository ships: + +``` +echo "1 -1" | cs2cs -f "%.10f" +proj=longlat +datum=WGS84 \ + +to +proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat + * * inf +``` + +That is the exact `+datum=NAD27` grid list, with **every** grid present, refusing a point outside all +of them. proj4j answered `1, -1`. + +### Two controls, and the negative one is the more interesting + +**The guard discriminates, proven by reverting it.** Replacing the single `throw` with the 1.4.3 +no-op makes **14 of 56** tests in the affected classes fail, each naming the coordinate that would +have been returned silently — `(-40.0, 35.0)`, `(1.0, -1.0)`, *"leaving the round trip 92.95 m from +where it started"*. **The other 42 keep passing**, and that half is what makes it a discriminator +rather than a throw-detector: a guard that fired on everything would have failed those too. The +sharpest single pair is 1.9e-5° apart — `conus` at (100°W, 19.999999N) must shift and (100°W, +19.99998N) must refuse, which are PROJ 9.8.1's own two answers on the same bytes. + +**`+datum=potsdam` did not move, and that is the negative control the change needed.** 17 +`proj4-epsg.csv` rows reference a `datum=potsdam` def. `BETA2007.gsb` is absent, so potsdam's grid +list resolves **empty**, and an empty list is a no-op. That demonstrates the distinction the whole +fix rests on — *"the grid file is not there"* stays silent, only *"outside a grid that loaded"* +errors — **on a population that could have moved and did not**. PROJ's `@`-optional wart is +untouched. + +### The deliberate divergence is kept, and is now observable + +`Grid.shift` still falls through to the *next* grid when the grid it selected refuses to interpolate, +where PROJ commits to `findGrid`'s choice. That was a recorded conscious decision and this pass did +not reverse it: reversing it is a separate behavioural change with its own row set. It is also +orthogonal — the fall-through can only ever return a value that *some grid the caller listed* +produced for this point, whereas the `else` branch invented one, so keeping it makes the change as +small as it can be. + +Reaching the divergence at all needs a grid whose containment epsilon exceeds its interpolation +clamp, and **for a square grid it never does**: the epsilon is `(resX + resY) * 1e-5` degrees while +the clamp is `1e-4` of a cell, so on `conus` (0.25° square) every admitted point is clamped. The +window opens only when `resX > 9 * resY`. `grids/OutsideGridFailsClosedTest` therefore builds a +10° × 0.1° CTABLE V2 fixture, and pairs it with a plain grid to show the fall-through still happens, +then with neither to show each grid alone behaves as claimed. + +### Two rules added + +| id | rows | pinned? | mechanism | +|---|---:|---|---| +| `FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED` | **1,995** | yes | the `else` branch raises `COORDINATE_OUTSIDE_GRID`; every row reports the grid list `[ntv1_can.dat]` | +| `DATUM-NAD27-NADCON-SHIFT-APPLIED` | **852** | yes | the third triage's 907-row cluster, finally scopable | + +**Ordering is load-bearing in both directions this time, and the file now has one example of each.** + +* `FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED` is **first**. Placed anywhere after + `FAILCLOSED-UNCHECKED-ISE-REPLACED`, that rule *grows* 55 → 71 by absorbing 16 of these rows behind + *"1.4.3 threw an unchecked `IllegalStateException` and we now throw a `Proj4jException`"* — true of + the row and silent about the mechanism. It is `TBD`-pinned, so the theft would not have failed the + build. With the new rule ahead of it, it gives up all 34 of its NAD27 grid rows and lands at **37**. + This is `PARSE-NO-KEYWORD-ALLOWLIST` against `PARSE-R-DECLARES-SPHERE` again, caught by ordering + rather than by a pin. +* `DATUM-NAD27-NADCON-SHIFT-APPLIED` is **last**. Its band (1e-4 .. 1e4) overlaps the top of + `PROJ-TMERC-PODER-ENGSAGER-DEFAULT`'s (1e-6 .. 1e-2), so placed earlier it would take that rule's + NAD27 `tmerc` rows and turn a pinned count into a `COUNT_MISMATCH`. Verified on the frozen tree that + all 852 rows it claims were `UNEXPLAINED` beforehand and that it takes nothing from any other rule. + +**Scoping the first rule by `status_to` alone would have been wrong**, and the measurement says by how +much: 105 changed rows reach `EXC:CrsTransformException` **without** a NAD27 datum, and they belong to +`FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY` (65) and `FAILCLOSED-NO-INVERSE-FOR-NEW-FORWARD-ONLY` (40) — +same exception type, entirely different reason. `datums: [NAD27]` separates them completely. + +### Four rules re-pinned downward, with the arithmetic + +A row that now throws has no numeric movement left for another rule to describe, so five rules lose +rows to the new one. The four pinned ones would otherwise be `COUNT_MISMATCH`es, and each carries the +note in place: + +| rule | was | now | lost | +|---|---:|---:|---:| +| `PROJ-TMERC-PODER-ENGSAGER-DEFAULT` | 14,724 | **14,038** | 686 | +| `PARSE-VUNITS-ACCEPTED` | 964 | **956** | 8 | +| `PROJ-POLYCONIC-KERNEL-CORRECTED` | 51 | **43** | 8 | +| `PROJ-POLYCONIC-INVERSE-CONVERGES` | 6 | **4** | 2 | +| *(`TBD`, recorded not pinned)* `NUM-KARNEY-LATITUDE-CORE` | 20,191 | 19,336 | 855 | +| *(`TBD`)* `DATUM-ISEQUAL-SELF-COMPARISON` | 332 | 284 | 48 | +| *(`TBD`)* `PROJ-AEA-SPHERICAL-INVERSE` | 164 | 159 | 5 | +| *(`TBD`)* `PARSE-DMS-PARAMETER-VALUE` | 10 | 8 | 2 | + +That is 1,614 rows accounted for; 202 more came from `UNCHANGED` and 179 were already `UNEXPLAINED`, +which is the 1,995. **A count dropping is as interesting as one going up**, and the reason each of +these dropped is written into the rule rather than left to be re-derived. + +### The `datums` column: five lines of rule, and what they replace + +`golden-index.tsv` gains a sixth column holding the sorted set of `+datum=` **values** on either side, +and `rules.yaml` gains `datums:` (ANY-of) and `datums_absent:` (all-absent). That is the fix the +second and third triages both named and neither could write. + +What it replaces: `params_present` matches parameter **keys**, and `datum` is a key that 1,962 +dictionary lines carry, so scoping "the defs whose datum is NAD27" meant enumerating ~205 keys — which +would also have swept in ~1,066 rows belonging to a live stream. `DATUM-NAD27-NADCON-SHIFT-APPLIED` is +now four match lines. + +Three details that are decisions rather than implementation: + +1. **It is a set, not a scalar.** `CSV` and `PAIR` cases have two real CRS and either side can be the + one a rule means; a single column would make the predicate depend on which way the pair happened to + be written. The consequence — `datums: [NAD27]` also matches a pair whose *source* is NAD27 — is + stated in `InputSet.datumsOf` rather than hidden, and `sections`/`src_proj`/`tgt_proj` are there for + when it matters. +2. **Values are verbatim, with no case folding and no aliasing.** `+datum=nad83` and `+datum=NAD83` + are different strings here because they are different strings in the dictionaries, and + `SYN mod/*/datum_nad83_lower` exists to probe exactly that. A rule meaning both must list both. +3. **The `REG` source's own `+datum=WGS84` is excluded.** The hub's datum would otherwise appear in all + 9,013 `REG` rows and make the column useless; only the def's datum is recorded. + +### What the cluster looked like once it could be seen + +865 `REG` rows carry `datum=NAD27` and are `OK → OK` after Job 1. Their magnitudes are not one +population, and the rule claims two of the three: + +| magnitude | rows | what | +|---|---:|---| +| 1.71e-4 .. 7.18e-4 **degrees** | 12 | `longlat` targets — **no projection in the path at all**, 19 m to 80 m. A kernel cannot move a row that runs no kernel; this is what identifies the cluster as the datum. | +| 1 m .. ~1e3 m | 840 | the NADCON shift through a projection | +| 6.1e5 .. 2.03e6 m | **13** | `esri:26731`, `esri:102120`, `esri:102122` — all `omerc`, 610 km to 2,030 km. **Not claimed.** | + +The 13 are three orders of magnitude off the mechanism and are the `omerc` far field, the same shape +this file already declines to rule for the `PAIR` residue. The rule *declines* them on magnitude, so +the report records which rule nearly fit. → omerc owner. + +Also not claimed, on the sections' own reserved grounds: the 10 `CSV` and 29 `PAIR` NAD27 `OK → OK` +rows. `sections: [REG]` is what keeps the rule out of both. + +### A consequence outside this module: `proj4-epsg.csv`'s reserved re-pin is now a different ask + +**148 of the 4,280 rows in `proj4-epsg.csv` now refuse instead of returning a coordinate**, and in +`MetaCRSTest` that shows as `1,195 regressed → 1,308` (+113; the other 35 were already failing). +Counted two independent ways that agree exactly: a dictionary parse resolving both CRS of every row +finds **148** rows referencing a def carrying `datum=NAD27`, and the frozen golden A/B finds **148** +`CSV` rows changing status, all in that file and all naming `[ntv1_can.dat]`. + +The reason this matters to the pending re-pin is that it changes what the file is wrong *about*. +Every row in it probes the single point **(1.0, −1.0)**, in the Gulf of Guinea. Those 148 rows passed +only because proj4j and the reference generator **fail-opened in the same way**; `cs2cs` 9.8.1 answers +`* * inf` there with every grid present, so the recorded coordinates are **wrong against 9.8.1, not +merely stale**. A regeneration must record them as refusals. The file is untouched here. + +> **A grep lesson, correcting this project's own rule.** The count above was nearly missed: the skill's +> non-negotiable 4a says the dictionaries write parameters *without* a leading `+`, and following that +> faithfully scores **zero on a population of 509**, because `epsg` and `esri` write `+datum=NAD27` +> **with** the plus. The dictionaries are inconsistent; `(? lesson is the one that caught it: **two independent counting methods that must agree**. + +--- + +## Third triage of the unexplained backlog — 2026-08-01, evening + +> **Superseded in its numbers, not in its reasoning**, by the +> [fourth triage](#fourth-triage-the-nad27-cluster-retired-and-the-out-of-grid-fail-open-closed--2026-08-01-late) +> above, which wrote code and took the backlog from 3,304 to 2,291. Two of this section's own findings +> were closed there: the 40°N round-trip regression, and the NAD27 cluster it could not scope. +> +> Read the two sections below this one for the mechanisms and the arguments. This section carries +> the tallies as of the evening of 2026-08-01, and it is the one that finally moved the number. + +Roughly fifteen streams landed between the second triage and this one. Everything below is from +**one frozen `/tmp` snapshot** (`rsync -a --exclude .git --exclude target/`), taken with one live +stream still writing (`BasicCoordinateTransform` plus three test files), and every number is from a +run the author did. + +``` +before 12,225 UNCHANGED · 41,205 CHANGED · 0 ADDED · 0 REMOVED · 23,037 INTENDED · 18,168 UNEXPLAINED +after 12,225 UNCHANGED · 41,205 CHANGED · 0 ADDED · 0 REMOVED · 37,901 INTENDED · 3,304 UNEXPLAINED +``` + +One `COUNT_MISMATCH` on the way in and none on the way out; no `DEAD_RULE`, no +`PENDING_RULE_FIRED`, no `EXPIRED_RULE`, and no rule declined a row. **Six rules added, four +amended, 14,864 rows claimed** — a factor of 5.5 off the backlog in one pass, and almost all of it +is one cluster that had been waiting for its stream to land rather than waiting to be understood. + +### Nothing returned to baseline, and the previous return is holding + +**0 rows returned to `UNCHANGED` in this pass, because this pass wrote no code.** The pattern was +looked for first, per this file's own instruction, and found only in the negative — every cluster +claimed here has a 1.4.3 value that is wrong and a current value that is a different number. + +**The geocent result from the first triage is intact: 1,045 of the 1,058 `+proj=geocent` rows are +still bit-identical to 1.4.3.** Only 13 geocent rows appear in the report at all (5 for +`PROJ-GEOCENT-LON0-APPLIED`, 8 for the Karney band), which is exactly the split that pass recorded. +This is worth re-measuring every time: a return to baseline is the strongest outcome this regime +produces and the easiest to silently lose. + +`UNCHANGED` did fall, 13,353 → 12,225. That is 1,128 rows that used to be bit-identical and are not +any more, and 14,724 of the claims below are the reason: the transverse-Mercator kernel moves +essentially every projected CRS in the suite by a fraction of a millimetre. + +### 16,956 of the 18,168 were one cluster: `tmerc` + +`PROJ-TMERC-PODER-ENGSAGER-DEFAULT` claims **14,724** of them, and the shape of the argument is the +part worth keeping. PROJ 9.8.1 runs Poder/Engsager for `+proj=tmerc` and `+proj=utm`; proj4j to +1.4.3 always ran Evenden/Snyder. `TransverseMercatorProjection`'s class javadoc tabulates the +difference *independently of this suite* — 2 µm at 2°, 0.9 mm at 6°, metres at 20°, kilometres at +45° — so the mechanism predicts a magnitude from a probe's distance to its own central meridian. +That prediction was tested against the rows rather than assumed: + +| distance from the def's own `lon_0` | rows | median movement | +|---|---:|---:| +| 0–5° | 112 | **37 m** | +| 5–10° | 14,748 | **2.53e-4 m** | +| 60–65° | 164 | **120 m** | + +The 5–10° bucket is where the dictionaries put almost every UTM and State Plane zone, and 0.25 mm +at 5–10° is the javadoc's 0.9 mm at 6°. The other two buckets **cannot** be this mechanism — a +series-truncation difference is *smallest* on the central meridian, not 37 m — and they are the +NADCON grid shift, which is 3.7 m to 378 m. **The 1 cm ceiling is what separates the two**, and it +separates them completely. The rule's `reason` records the per-column maxima over all 14,724 claimed +rows (`fx` 3.5 mm, `ix` 1.2e-6°) so that the one loose end — `magnitude` is a max over columns with +different units, and 1e-2 in a degree column would be 1.1 km — is bounded by measurement instead of +by hope. + +It also has to be ordered **after** `DATUM-LEGACY-OSGB36-PRECISION`, because `epsg:27700` is a +`tmerc` moving 2.55–3.26 mm, i.e. inside the band. Placed earlier it would have taken all ten OSGB36 +rows and turned a pinned rule into a `COUNT_MISMATCH` — the same laundering +`PARSE-NO-KEYWORD-ALLOWLIST` committed against `PARSE-R-DECLARES-SPHERE`, three sections up this +page. Verified on the frozen tree that neither `epsg:27700` nor `epsg:4277` is among the 14,724. + +### The `COUNT_MISMATCH` fired again, and was right again + +`FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY` reported `expected_rows=85 but matched 65`. The four +missing keys were `proj/aitoff`, `proj/hammer`, `proj/nsper` and `proj/wintri`, and **upstream has +an inverse for all four**, verified by reading 9.8.1 one file at a time: +`aitoff.cpp:200-201` (the shared setup for `aitoff` *and* `wintri`, which is why those two left +together), `hammer.cpp:86-87`, `nsper.cpp:167-168`. + +**That rule has now shed five of its original eighteen names — `lagrng`, `aitoff`, `hammer`, +`nsper`, `wintri` — and every one left because upstream turned out to have an inverse that 1.4.3 +did not.** A rule written as `keys: ["proj/*"]` would have absorbed all five silently and this file +would still be asserting that Aitoff is one-way. The enumeration is doing exactly the work it was +enumerated for, and this is now the strongest single argument in this document for never globbing a +key list. + +The pin on `PROJ-NEW-PROJECTIONS-REGISTERED` demonstrated the same discipline in the *arrival* +direction without failing at all: it held at exactly 180, and the 8 projections that landed after it +(`calcofi ccon gstmerc imw_p labrd lcca ocea tpeqd`) surfaced as 40 `UNEXPLAINED` rows carrying +`crs-tgt: Unknown projection: ` rather than being swallowed. It is now 44 names, 220 rows. + +### The six rules added and the four amended + +| id | rows | pinned? | mechanism | +|---|---:|---|---| +| `PROJ-TMERC-PODER-ENGSAGER-DEFAULT` | **14,724** | yes | Evenden/Snyder → Poder/Engsager, `proj_internal.h:840-841`; band 1e-6 .. 1e-2 m, which excludes NAD27, the reserved ETM cluster, all of `CSV` and all of `PAIR` | +| `PROJ-POLYCONIC-KERNEL-CORRECTED` | 51 | yes | `poly.cpp:37-40` forward, `:88` inverse — the Newton denominator was `1/es` where upstream is `one_es/mlp³`, **off by a factor of 150 on GRS80** | +| `PROJ-POLYCONIC-INVERSE-CONVERGES` | 6 | yes | the probe-0 half of the same defect: `inv: Infinite longitude` → `OK`, the six rows the second triage listed and left | +| `NUM-ELLIPSOID-FOUR-NAMES-ADDED` | 20 | yes | `GSK2011 PZ90 clrk80ign danish`, all four read out of `9.8.1:src/ellps.cpp` | +| `PROJ-AITOFF-HAMMER-WINTRI-INVERSES-LANDED` | 13 | yes | the three that left the forward-only list by gaining an inverse; Winkel Tripel's forward also moved and the arithmetic is reproduced in both directions | +| `PROJ-NSPER-REQUIRES-A-POSITIVE-H-RATIO` | 5 | yes | the fourth: `+h` absent → `h/a = 0` → refused, per `nsper.cpp`'s `if (Q->pn1 <= 0 \|\| Q->pn1 > 1e10)` | +| `FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY` | 85 → **65** | yes | four names removed, each with its upstream line | +| `PROJ-NEW-PROJECTIONS-REGISTERED` | 180 → **220** | yes | eight names added | +| `PARSE-NO-KEYWORD-ALLOWLIST` | TBD → **100** | yes | `world:madagascar` added; `+azi` is the `+vunits` defect again | +| — | — | — | — | + +**All six new rules are pinned exactly, and every pin was right on the first run.** That is not a +claim about care; it is a consequence of measuring the predicate on the frozen tree before writing +the rule rather than pasting the gate's own count afterwards. + +**`world:madagascar` is the cleanest illustration of an honest `UNEXPLAINED` paying off later.** The +first triage refused it in writing — *"+rot_conv now accepted, labrd still unimplemented … calling +that 'intended' would launder an unimplemented projection into a declared change"* — and the second +repeated the refusal. `labrd` has now landed, the row set is +`UnsupportedParameterException: azi parameter is not supported → OK`, and it is claimed. Two changes +had to land for those five rows to move and the rule says so; it speaks only for the parse side. + +**The four new ellipsoids, refused by the second triage, are claimed here for one reason only.** +That refusal was conditional on an open decision: the same four entries in `Ellipsoid.ellipsoids` +were the suspected cause of four failing `core` tests (`ProjJsonTest` ×2, `Wkt1ReaderTest`, +`Wkt2ReaderTest`) through `io/wkt/WktNames.java:276`, which matches ellipsoids **numerically**. On +this frozen tree `core`'s eight remaining failures are `CoordinateTransformTest` ×2, +`InventedHeightTest` ×4, `MetaCRSTest` and `Proj4JSTest` — **none of the four**. The array stands, +so the parse side can be declared. + +### A regression this pass found: the NAD27 grid-shift round trip is asymmetric at a grid edge + +**41 `REG` rows round-tripped *exactly* in 1.4.3 and are now 30–110 m out.** Every one of them +probes **latitude 40.000000** — and `ntv1_can.dat`, the only NAD27 grid actually shipped in +`proj4j-epsg`, has its southern boundary at exactly that latitude. Read from the header bytes of +`epsg/src/main/resources/proj4/nad/ntv1_can.dat`, which stores its extent in **degrees**, not the +seconds an NTv1 header usually carries: + +``` +S LAT 40.0 N LAT 84.0 E LONG 44.0 W LONG 142.0 grid 0.2° +``` + +Every affected probe is at 40.000000°N with a longitude between 49.9°W and 103.9°W, i.e. exactly on +the southern edge and well inside the east–west span. The forward finds the point inside the grid +and applies the Canadian shift; the shifted point is a few tens of metres **south** of 40°N, +therefore outside; and `Grid.shift`'s no-table branch — *"1.4.3 leaves the coordinate untouched, +which is indistinguishable from 'the shift was zero'"*, in its own comment — returns it unchanged. +So the round trip comes back displaced by exactly one grid shift. + +``` +REG epsg:26721 probe 2 at (-49.928932, 40.0) fx 1103866.798 -> 1103774.042 m (92 m) + ix -49.92893219 -> -49.93002221 (0.001091°, ~93 m) +REG epsg:26712 probe 2 at (-103.928932, 40.0) fx 1103866.798 -> 1103917.819 m (51 m) + ix -103.9289322 -> -103.9283365 (0.000596°, ~51 m) +``` + +In both rows the inverse residue equals the forward shift to two digits, which is the tell: the +inverse leg is not failing to converge, it is not running at all. 2,504 of the 2,545 NAD27 `REG` +rows still round-trip exactly, so this is a boundary effect and not a broken inverse. + +**No rule is written for it**, on two grounds: it sits inside the NAD27 cluster this file already +declines to rule (below), and *"the shift silently did not happen"* is precisely the failure mode +the fail-closed work exists to remove — `Grid.shift`'s comment already names +`ErrorCause.COORDINATE_OUTSIDE_GRID` as the intended signal and says reporting it "belongs on the +transform". → **fail-closed owner and datum owner jointly**; +`core/src/main/java/org/locationtech/proj4j/datum/Grid.java`, the `else` branch of `shift`. + +> **CLOSED, 2026-08-01 (fourth triage, below). The diagnosis above is confirmed and the count is 40, +> not 41.** Re-measured on a frozen tree with the same criterion — round-tripped bit-exactly in 1.4.3, +> now more than a metre out — the answer is **40 rows, every one at probe latitude exactly 40.0 and +> none at any other latitude**, displaced 12.6 m to 93.1 m. The `else` branch now raises +> `COORDINATE_OUTSIDE_GRID`. +> +> **They do not round-trip after the fix, and they must not: PROJ 9.8.1 does not round-trip them +> either.** The return leg needs a grid value at a point outside the only grid there is. +> `cs2cs +proj=utm +zone=21 +ellps=clrk66 +nadgrids=@ntv1_can.dat +to +proj=longlat +datum=WGS84` +> answers `* * inf`, and `cct +proj=hgridshift +grids=ntv1_can.dat` at the shifted point is +> `TRANSFORMATION ERROR (Coordinate to transform falls outside grid)`. The fix is that the failure is +> reported rather than expressed as a coordinate 93 m away. Pinned by `grids/Nad27EdgeRoundTripTest`, +> which also carries the control: one degree further north the same pair round-trips exactly. + +### What is left: 3,304 rows + +| | rows | | +|---|---:|---| +| `CSV` — the reserved `proj4-epsg.csv` re-pin, in its entirety | **1,308** | reserved; **do not rule** | +| `REG`, `datum=NAD27` | **907** | `lcc` 485 · `tmerc` 228 · `utm` 152 · `omerc` 18 · `longlat` 15 · `sterea` 5 · `aea` 4 | +| `PAIR` | **358** | see below | +| `REG`, everything else | **576** | `tmerc` 306 (≥1 cm) · `cass` 157 · `omerc` 65 · `merc` 20 · `stere` 10 · `mill`/`vandg`/`aeqd`/`longlat` 4 each · `lcc` 2 | +| `SYN` | **155** | `mod/tmerc/*` 105 · one key each for `bonne krovak putp2 mbt_fps mbtfpp mbtfpq merc cass gnom leac ortho` | + +Of the 1,308 `CSV` rows, **332 are the reserved ETM domain cluster** (267 `CSV` + 65 `PAIR`), whose +count the second triage predicted as "~332" and which is 332 for the third measurement running. + +**The `PAIR` residue is 358 rows and none of them should be ruled.** 166 are `OK → OK` on +transverse-Mercator targets probed thousands of kilometres outside their own zone, with magnitudes +from 1e3 to **1.8e12 metres**; both series are meaningless out there and a change from one +meaningless number to another is not something a rule should dignify. 127 are the +`IllegalStateException → OK` population the second triage routed to the datum stream and which is +still theirs to state — and it is worth noticing that many of *those* land on the same absurd +coordinates, so "1.4.3 crashed and we now return X" would be claiming an X of 5e8 m. + +> **SUPERSEDED, 2026-08-01: the `datum` column and the `datums:` clause were added and the cluster is +> ruled.** `DATUM-NAD27-NADCON-SHIFT-APPLIED` claims **852** of the 865 that survive Job 1; the other +> 13 are `omerc` far field and are deliberately left. See the +> [fourth triage](#fourth-triage-the-nad27-cluster-retired-and-the-out-of-grid-fail-open-closed--2026-08-01-late). + +**The NAD27 cluster is still not ruled and the reason has not changed**: `rules.yaml` has no +predicate for a parameter's *value*, so scoping to "the defs whose datum is NAD27" means enumerating +several hundred keys. That is now *less* dangerous than it was — the transverse-Mercator stream has +landed and its rows below 1 cm are claimed — but it is still 907 rows across two mechanisms +(the NADCON shift and the kernel above 1 cm) with no way to tell a rule which one it is claiming. +**The five-line fix is still the one the second triage named: add a `datum` column to +`golden-index.tsv` in `GoldenGenerator` and a `datums:` match clause to `GoldenRules`.** Whoever +next opens `GoldenGenerator` should do it; it would retire the largest remaining honest +`UNEXPLAINED` in this file. + +Two rows are singletons and are recorded so nobody re-derives them: + +* `proj4-epsg.csv:01241` probe 0, `OK → ProjectionException`, + `inv: generic 2D inverse did not converge in 15 iterations for (-3.081581016439677, …)`. This is + the one non-ETM `OK → ProjectionException` row in the whole suite, it is new since the second + triage, and it is unattributed. → whoever owns `util/GenericInverse2D`. +* `proj4-epsg.csv:02092` probe 0, `ProjectionException → ProjectionException`, message `inv: I` on + both sides, `fx`/`fy` moving 10.3 m and 7,552 m. Known since the second triage, still unexplained, + and inside the reserved file. + +--- + +## Second triage of the unexplained backlog — 2026-08-01, later the same day + +> **Superseded in its numbers, not in its reasoning**, by the +> [third triage](#third-triage-of-the-unexplained-backlog--2026-08-01-evening) above. Three of this +> section's predictions came true and are recorded there: the `tmerc` cluster was its stream's and +> was claimable the moment that stream landed; the four new ellipsoids' open decision resolved in +> favour of keeping the array; and `world:madagascar`'s `labrd` arrived. + +Eight streams landed between the pass above and this one. Everything below is from **one frozen +`/tmp` snapshot**, taken with the two live streams (`core/proj/**` and the new `db/` module) still +writing, and every number is from a run the author did. + +``` +13,353 UNCHANGED · 40,077 CHANGED · 0 ADDED · 0 REMOVED · 21,967 INTENDED · 18,110 UNEXPLAINED +``` + +No `COUNT_MISMATCH`, no `DEAD_RULE`, no `PENDING_RULE_FIRED`, no `EXPIRED_RULE`, and no rule declined +a row. The gate is still red on the 18,110, which is the backlog, and **16,627 of them are one +cluster with one owner** — see below. + +### How to run the gate while another stream's tests are red + +`core`'s test phase fails on the frozen tree (15 failures from four other streams), and because +`golden` sits downstream in the reactor that failure **skips the gate entirely** — the first run of +this triage produced `Proj4J ... FAILURE / Golden Master ... SKIPPED` and no report at all. Add +`-Dmaven.test.failure.ignore=true`: + +```bash +mvn -B $M2 -Dmaven.test.failure.ignore=true -Pgolden -pl golden -am verify +``` + +The gate's own verdict is unaffected — it is written to `golden-report.tsv` and printed either way, +and `GoldenRulesTest`/`GoldenDiffTest`/`ProbesTest` all still pass. This belongs in this file +permanently: a measurement that cannot be taken while somebody else's tests are red is a measurement +that stops being taken. + +### 16 rules added, 1 corrected, 1 deleted; 539 rows claimed + +| id | rows | pinned? | mechanism | +|---|---|---|---| +| `FAILCLOSED-NO-SUCH-ELEMENT-REPLACED` | 50 | **yes** | the blind-spot defect this file predicted: `NoSuchElementException` on `+south`/`+h` was unchanged since 1.4.3 and therefore invisible until the current side moved | +| `FAILCLOSED-NO-INVERSE-FOR-NEW-FORWARD-ONLY` | 40 | **yes** | 8 newly-ported forward-only projections; each verified `P->inv`-free in 9.8.1 by reading the file | +| `PROJ-NEW-PROJECTIONS-REGISTERED` | 180 | **yes** | 36 names × 5 probes, `Unknown projection: ` → `OK` | +| `PROJ-MOD-STER-GS50-DOMAIN-REFUSED` | 5 | **yes** | `gs50` now resolves and refuses a probe 4,000 km outside the 50-state polynomial | +| `PROJ-OMERC-ALPHA-90-NO-LONGER-REJECTED` | 20 | **yes** | `+alpha=90` was rejected as `Obl 1`; upstream's azimuth branch validates nothing | +| `PROJ-OMERC-TWO-POINT-FORM-REWRITTEN` | 5 | **yes** | `fwd: Infinite longitude` on the `+lat_1`/`+lat_2` form | +| `PROJ-NZMG-NONCONVERGENCE-TYPED` | 11 | **yes** | `InvalidValueException` → `ConvergenceFailureException`; the input was never invalid | +| `NUM-PHI2-CONVERGES-ON-EXTREME-ELLIPSOIDS` | 6 | TBD | the Karney `phi2.cpp` rewrite converges where a 15-trip fixed point did not | +| `PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT` | 48 | TBD | **`dimensions: [ix, iy, iz]`** — the forward is bit-identical, so no forward regression can hide | +| `PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO` | 45 | TBD | 9 keys whose forward also moved, each change named with its arithmetic | +| `PROJ-EQC-EQDC-SINU-REGISTRY-ROWS` | 67 | TBD | the registry/CSV consequence of the same three forward defects | +| `PARSE-UNITS-PRECEDES-TO-METER` | 17 | TBD | `init.cpp:691`'s short-circuit: `+units` shadows `+to_meter` entirely | +| `NUM-ELLIPSOID-SPHERE-IS-NORMAL-SPHERE` | 5 | **yes** | GRS80 authalic radius → PROJ's Normal Sphere, 1.848 ppm | +| `NUM-ELLIPSOID-AIRY-EXACT-INVERSE-FLATTENING` | 5 | **yes** | rounded `b` → exact `rf`, ~1 mm | +| `DATUM-LEGACY-CARTHAGE-ELLIPSOID` | 25 | **yes** | `clrk80` → `clrk80ign`, 55 mm of equatorial radius | +| `DATUM-LEGACY-OSGB36-PRECISION` | 10 | **yes** | four truncated Helmert terms restored; ~3 mm | + +Eleven of the sixteen carry a pinned `expected_rows`, and all eleven are pinned because the count is +**structural** (keys × probes), not because the number looked stable. The five `TBD`s are all +data-driven counts in files two agents are still writing. + +### The two things the gate caught that a human review would not have + +**1. `FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY`'s pin fired, and it was right.** It reported +`COUNT_MISMATCH expected_rows=90 but matched 85`. The missing key was `proj/lagrng`: +`LagrangeProjection` acquired a `projectInverse` this release, and **upstream agrees** — +9.8.1 `src/projections/lagrng.cpp:101-102` assigns `P->inv = lagrng_s_inverse` as well as `P->fwd`, +so the 1.4.3-era belief that Lagrange was forward-only was simply wrong. The name is removed from the +list and the pin is now 85 = 17 × 5. **Route this: `core`'s own +`NoInverseGateTest.baseProjectInverseRaisesForForwardOnlyProjections:96` asserts "Lagrange must +declare no inverse for this test to mean anything" and fails on the frozen tree.** Two streams +disagree about `lagrng` and upstream sides with the one that gave it an inverse. → fail-closed owner. + +**2. `PROJ-MOD-STER-GS50-DOMAIN-REFUSED` was a `DEAD_RULE` on its first run** — it matched all five +rows and **declined all five**, reporting `inside changed (- -> F) and allow_inside_change is not +set`. The `inside` column moved from `-` ("the CRS could not be built, so `Projection.inside` was +never called") to a real `F`. That is part of the change, but a rule that does not say so is a rule +that has not read its own row set. This is `expect`-clauses-decline-rather-than-claim working exactly +as the section above describes, on a rule written by somebody who had read that section. + +### `FAILCLOSED-POLE-OVERSHOOT-REJECTED` is deleted, as its own reason predicted + +It said: *"If the wag2 inverse is later fixed so that it stops overshooting, this rule becomes a +`DEAD_RULE` and the gate will say so, which is the correct outcome."* The gate said so. Wagner II's +forward **and** inverse have both been rewritten — probe 3's `fy` moves 9,265,677.82 → 6,912,649.14 m +and its `iy` now returns 60 exactly instead of 90.0015835811672 — so there is no overshoot left to +reject. Deleted rather than left as a `pending` stub, because `pending` means "not landed yet" and +this landed and was then superseded. The guard itself is unaffected and is still exercised by +`FAILCLOSED-UNCHECKED-ISE-REPLACED`'s 46 `exceeds PJ_EPS_LAT` rows. + +### The previous pass's `UNEXPLAINED → UNCHANGED` result is holding + +**897 of the 905 `REG` `+proj=geocent` rows are still bit-identical to 1.4.3** (181 keys × 5 probes; +the other 8 are the height-ordinate drift `NUM-KARNEY-LATITUDE-CORE` claims). That is worth +re-measuring at each triage rather than assuming: a return to baseline is the strongest outcome this +regime produces and it is also the easiest to silently lose. + +**Nothing returned to baseline in *this* pass, because this pass wrote no code** — it is a triage, +not a fix. Every row it claimed had to be claimed: in each cluster the 1.4.3 value was wrong (a +`±π` longitude clamp, a 156° inverse error, a missing `rho0`, the authalic radius) and the correct +value is a different number, so there was no baseline to return to. The pattern was looked for +first, per this file's own instruction, and it was found only in the negative. + +Also re-verified, because the earlier rule was written specifically to make it impossible: +**`EPSG:2065`, `EPSG:5514` and `EPSG:27200` are not claimed by any forward-only rule.** All three are +`OK → OK` numeric rows in the `krovak`/`tmerc` buckets, exactly as they should be. + +### What is left, and who owns it + +| | rows | | +|---|---|---| +| `tmerc` + `utm` numeric, `OK → OK` | **16,627** | transverse-Mercator stream (live) | +| the reserved `Extended Transverse Mercator ... outside the projection domain` cluster | **332** | reserved, do not rule | +| `IllegalStateException → OK` | **162** | datum stream — mechanism theirs to state | +| `lcc`, `datum=NAD27` | **485** | see the NAD27 finding below | +| `cass` | **189** | Cassini owner | +| `omerc` | **97** | omerc owner | +| `poly` | **55** | Polyconic owner | +| four new ellipsoids | **20** | **suspected-caused-by-the-user; deliberately not ruled, see below** | +| everything else | ~143 | itemised below | + +The `OK → ProjectionException` population is now **333 rows, of which 332 are exactly the reserved +ETM cluster** — the count in the section above was "~332" and it is 332. The 478-row +`inv: LongLat: invalid latitude` population that section describes is **gone**. The one non-ETM row +is new and unattributed: `inv: generic 2D inverse did not converge in 15 iterations for +(-3.08158101643967, ...)`. + +The residual exception transitions are now only five shapes, down from twelve: +**332 + 1** `OK → ProjectionException`; **162** `IllegalStateException → OK`; **26** +`InvalidValueException → OK` (20 new ellipsoids + 6 `inv: Infinite longitude` on `epsg:5472`, +`esri:102766`, `esri:65061`, `esri:65161`, `nad27:5400` and `SYN proj/poly`, all Polyconic); **5** +`world:madagascar`, which this file already says must not be claimed; and **1** +`proj4-epsg.csv:02092`, `ProjectionException → ProjectionException` with the same message `I` on both +sides and `fx`/`fy` moving 10.3 m and 7,552 m. + +#### The 1,163-row `proj4-epsg.csv` re-pin: its mechanism independently corroborated + +The reserved re-pin is still unapplied, so its rows are still moving. This pass measured its +predicate rather than its row list, because the section above sets that as the standard: of the +**1,280** unexplained `proj4-epsg.csv` rows, **1,145 probe ≥ 12.5° from their own central meridian** +(1,099 `tmerc`, 27 `cass`, 8 `omerc`, 5 `poly`, 4 `lcc`, 2 `merc`), 132 probe inside 12.5°, and 3 +have no resolvable `lon_0`. 1,145 against a claimed 1,163 is agreement, from a completely different +direction, on a cluster nobody has re-pinned yet. + +#### The largest cluster this pass understood and deliberately did not rule: `datum=NAD27` + +**1,603 `REG` rows on 205 registry defs carrying `datum=NAD27` now receive the NADCON grid shift.** +Magnitudes are 3.7 m to 378 m and the shape is unmistakable: `epsg:4267` probe 0 moves `fx` +−100.0 → −99.99949894 (the baseline was the input **echoed back**, i.e. no shift at all), and +`epsg:26741` probe 0 moves `fx` 2,000,000.0000000012 → 2,000,345.2157 — exactly the false easting in +1.4.3, 345 US survey feet (105 m) off it now. + +The mechanism is the confirmed defect this file already documents under "Determinism and known +couplings": `parser/Proj4Parser.java` used to call `Datum.NAD27.setGrids(null)` on the **shared +static singleton** while parsing any `+datum=NAD27` definition that carried no `+nadgrids` token, so +the first NAD27 CRS parsed destroyed the grid list process-wide — including its own — and every +NAD27 row in the 1.4.3 baseline is unshifted. `Proj4Parser.java:95-97` now says so in a comment and +copies into a `DatumParameters` instead. This is a fix, and it matches PROJ, whose `+datum=NAD27` +is `nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat`. + +**It is not ruled, and the reason is a gap in this module rather than a judgement about the change: +`rules.yaml` has no predicate for a parameter's VALUE.** `params_present` matches parameter *keys*, +`golden-index.tsv`'s fifth column stores key names only, and there is no `datum:` match clause — so +the only way to scope a rule to "the 205 defs whose datum is NAD27" is to enumerate 205 keys, which +would also sweep in the 914 `tmerc` and 152 `utm` rows belonging to a live stream. Enumerating 205 +keys to claim 1,603 rows across two streams' territory is exactly the shape of rule this file exists +to prevent, so the honest record is an `UNEXPLAINED` row and this paragraph. → parser/datum owner, +and **whoever next changes `GoldenGenerator` should consider adding a `datum` column to +`golden-index.tsv` and a `datums:` match clause**, which would make this a five-line rule. + +Two supporting measurements, so the cluster is bounded rather than merely described: of the 492 +unexplained `lcc` rows, **485 are `datum=NAD27` and exactly 2 are not** (the other 5 are now claimed +by `DATUM-LEGACY-CARTHAGE-ELLIPSOID`). And the 15 `longlat`/`datum=NAD27` rows move by 1.7e-4 to +7.2e-4 **degrees**, i.e. 19–80 m — a pure datum shift with no projection in the path at all, which +is the cleanest possible demonstration that this is the datum and not a kernel. + +#### Left unexplained on purpose: the four new ellipsoids + +**20 rows, `SYN ellps/{GSK2011, PZ90, clrk80ign, danish}`, `Unknown ellipsoid: ` → `OK`.** +These are unambiguously intended — 9.8.1's `src/ellps.cpp` ships all four — and a rule would be two +minutes' work. It is deliberately not written, because the same four entries added to +`Ellipsoid.ellipsoids` are the suspected cause of four failing `core` tests (`ProjJsonTest` ×2, +`Wkt1ReaderTest`, `Wkt2ReaderTest`) on an `+ellps=` versus `+a=/+b=` emission change: +`io/wkt/WktNames.java:276` matches ellipsoids **numerically** against that array, so a fifth entry +with the same axes changes which name is emitted. The open decision is whether to re-pin those tests +or revert the array, and if it is reverted a rule here becomes a `DEAD_RULE` within the hour. + +The golden shape is *not* the same as the test shape — these rows are the **parse** side (a +definition that used to be rejected now builds) and the tests are the **emission** side (`toString` +picking a name) — but they have one cause, and one cause with an undecided fate should not acquire a +rule in a file whose rules are promises. → the author of the `Ellipsoid.ellipsoids` change. + +#### `probes.tsv` was not touched, and here is why it looked as though it should be + +This pass was handed a report that "`proj/lsat`'s 5 probes were silently wrong in +`golden/probes.tsv`", with `ix = 136.758446215` recorded at three different probes and latitudes of +−56°/−61°/−83° for inputs at +45°/+30°/+30°. Every one of those numbers is real and is now fixed — +but **they are `baseline/1.4.3/golden.tsv`'s output columns, not `probes.tsv`'s input columns.** +`probes.tsv` had `proj/lsat` at the same canonical synthetic points as every other `proj/` key +and was correct throughout; what was wrong was 1.4.3's answer, because +`LandsatProjection.projectInverse` was entirely inside a block comment and +`Projection.inverseProjectRadians` clamped longitude to ±π where 9.8.1 wraps with `adjlon`. The +three identical `ix` values are the clamp, which is the tell — a real coordinate does not repeat +itself at three different probes. + +The distinction matters enough to record: editing `probes.tsv` would have moved every probe point, +invalidated the entire baseline, and destroyed the evidence for the very fix being recorded. The +five rows are claimed by `PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT`, whose +`dimensions: [ix, iy, iz]` clause proves the forward never moved. + +--- + +## Rebaseline-at-release workflow + +The baseline is pinned to a **released** version, never to a working tree. At each release: + +1. Get the gate green against the old baseline: every remaining change claimed by a rule with a pinned + `expected_rows`. **This is the release gate.** A red golden gate at release means there is a + behavioural change nobody has described. +2. Publish the release (say `1.5.0`). +3. `mvn -B $M2 -Pgolden,golden-baseline -pl golden verify -Dgolden.regenerate=true` + with `-Dgolden.proj4j.version=1.5.0 -Dgolden.baseline=1.5.0`, writing `baseline/1.5.0/`. +4. Delete every rule whose change is now *in* the new baseline. They are all `DEAD_RULE`s by + construction after a rebaseline — that is the mechanism that clears the file. +5. Set `1.5.0` in `golden/pom.xml`, and delete `baseline/1.4.3/` + in the same commit. + +Keep at most two baselines. A directory per historical release is a museum, and git already has them. + +Regenerating `probes.tsv`/`pairs.tsv` is a **separate** and much rarer act, and must be committed +together with a freshly generated baseline (see [Commands](#commands)). + +--- + +## Policy: gie always wins + +**This regime has no opinion about correctness and must never acquire one.** + +* A rule in `rules.yaml` is **never** evidence that an output is right. It records that a change was + *expected*, by a named person, for a stated reason, with an exact count and an expiry date. +* **A rule must never be written to make a gie failure go away.** If gie says we diverge from PROJ + 9.8.1 and a golden rule says the change was intended, gie is the one that decides whether to ship. + The golden rule's only job was to prove the change was not an accident. +* Conversely, a green gie run does **not** license an unexplained golden row. gie covers ~8,017 + assertions; the `REG` section alone is 45,065 rows over CRS the corpus never mentions. "gie is green" + is not an answer to "why did 12,000 rows move". +* Tolerances belong to gie. There is no epsilon anywhere in this comparison: a 1-ULP move is a change. + If a 1-ULP move is acceptable, say so in a rule with a magnitude band — do not weaken the comparison. + +--- + +## Determinism and known couplings + +* **Generation order is load-bearing and fixed.** `parser/Proj4Parser.java:53` mutates process-global + static `Datum` singletons as a side effect of parsing, so the output depends on the order CRS are + created. The order is the golden total order, and both sides of a comparison walk it identically. + Parsed CRS are cached per run (`Proj4FileReader` re-scans the 888 KB `epsg` resource on *every* call), + which changes how many times each idempotent global write happens but not the order in which distinct + writes first occur. +* **Locale, charset and timezone are pinned via `argLine`, not `systemPropertyVariables`.** + `Locale.getDefault()` and the default charset are initialised during JVM startup, before surefire can + set a system property inside the fork — setting them that way looks right and does nothing. It matters + here: `Proj4FileReader.java:41` calls `toLowerCase()` with no `Locale`, so under `tr_TR` "ESRI" + becomes "esri" with a dotless ı and **all 2,954 ESRI codes become unresolvable**, which would show up + as 2,954 spurious `REMOVED` rows. +* **The `CSV` section's key set floats with the working tree.** Those files are `core`'s test resources + and `core` publishes no test jar, so they are read from `core/src/test/resources` rather than the + classpath. A change to them appears as `ADDED`/`REMOVED` rows, which a rule can declare. At the time + this baseline was generated, `PROJ4_SPCS_ESRI_nad83.csv` and `TestData.csv` had **already been deleted** + by the test-debt stream, so their rows are legitimately absent from `baseline/1.4.3` — not missing. + The remaining three files give 4,770 rows: `proj4-epsg.csv` 4,280 · `PROJ4_SPCS_nad27.csv` 265 · + `PROJ4_SPCS_EPSG_nad83.csv` 225 (220 live plus the **5 `#`-commented `ESRI:102631` `omerc` rows**, + which are included on purpose — hiding a known-bad case behind `#` is how it stops being tracked). +* **The registry dictionaries in `proj4j-epsg` 1.4.3 are byte-identical to the working tree's**, verified + by `cmp` on all five. So `baseline/1.4.3` and a current run enumerate the same 9,013 `REG` keys and + the diff is purely about code. +* `NO_PROBE` is how a def added to the dictionaries after the last probe regeneration announces itself, + rather than silently acquiring a made-up probe. + +--- + +## CI wiring + +> **DONE, 2026-08-01. The job exists: `.github/workflows/golden.yaml`.** It is blocking, it is red +> today on the 2,291-row backlog, and that is the intended state. Read +> `.github/workflows/README.md` for the surrounding context; what follows is kept because the +> reasoning still applies and because the snippet below is *not* what shipped — three flags had to +> be added and one had to be left out, each for a reason worth not rediscovering. +> +> **What shipped differs from the snippet below in four ways:** +> +> 1. **`-Dtest='org.locationtech.proj4j.golden.*Test'`.** `-am` also builds `core`, whose suite has +> one expected failure (`MetaCRSTest`), so the reactor stops before `golden` runs. The obvious +> workaround is `-Dmaven.test.failure.ignore=true` — which is what the local diagnostic command +> in [Commands](#commands) uses, deliberately, because there the goal is to read the report. **In +> CI that flag would also ignore the gate's own failure and turn the job green while the gate is +> red.** Narrowing gets both properties. +> 2. **`-Dsurefire.failIfNoSpecifiedTests=false`.** Required once `-Dtest=` is in play, and it looks +> backwards. `-am` builds `proj4j-epsg`, which has no test sources at all, so the strict setting +> fails *there* and `golden` never runs. Same trap `determinism.yaml` documents. +> 3. **A non-vacuity guard step.** `GoldenMasterTest` opens with `Assume.assumeFalse(golden.skip)`, +> so a missing or ineffective `-Pgolden` makes surefire report it **SKIPPED — and exit 0**. This +> was not a hypothetical: running the shipped command with `-Dgolden.skip=true` produces +> `BUILD SUCCESS` with `Tests run: 58, Skipped: 1`. Skips are never passes. The guard asserts the +> gate ran, was not skipped, generated a table with the same row count as the baseline it is +> diffed against, and that nothing else in the module was skipped either. +> 4. **No `cache: maven` on `setup-java`.** `actions/cache` is used explicitly instead, so the +> load-bearing "scrub `~/.m2/repository/org/locationtech/proj4j` last" step from `ci.yaml` still +> applies. Without it a locally-built snapshot is baked into the cache and a later run can +> "pass" against stale jars. + +The original snippet, kept for the record: + +```yaml + golden: + name: Golden master (behavioural regression) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '21' + cache: maven + - name: Golden master + run: > + mvn -B -ntp -Dmaven.javadoc.skip=true + -Pgolden -pl golden -am verify + - name: Upload the report + if: always() + uses: actions/upload-artifact@v4 + with: + name: golden-report + path: | + golden/target/golden/golden-report.tsv + golden/target/golden/golden-summary.txt + if-no-files-found: error +``` + +`if: always()` on the upload is the point of the job: when it fails, the artefact is the answer. + +Two notes for whoever wires this in: + +* The plan's determinism regime — a matrix over `ubuntu-latest` (x86-64) and `ubuntu-24.04-arm` + (AArch64) asserting a golden table of raw-bit results — is a *different* regime from this one, but it + can reuse this module's table verbatim: run the same command on both legs and require + `golden.tsv` to be byte-identical between them. Because every float is a hex double, byte-identity + *is* bit-identity, which is precisely what the `StrictMath` policy claims and what the ARM leg exists + to prove. That is one extra job and no new code. +* Do **not** make this job `continue-on-error` to get past the current 2,729 unexplained rows. Use + `status: pending` rules, which are visible in the diff and self-correcting; a `continue-on-error` job + is neither. diff --git a/golden/baseline/1.4.3/golden-index.tsv b/golden/baseline/1.4.3/golden-index.tsv new file mode 100644 index 0000000..053493c --- /dev/null +++ b/golden/baseline/1.4.3/golden-index.tsv @@ -0,0 +1,14503 @@ +section key srcproj tgtproj params +CSV PROJ4_SPCS_EPSG_nad83.csv:00002 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00003 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00004 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00005 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00006 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00008 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00009 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00010 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00011 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00012 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00013 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00014 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00015 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00016 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00017 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00018 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00019 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00020 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00021 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00022 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00023 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00024 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00025 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00026 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00027 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00028 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00029 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00030 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00031 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00032 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00033 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00034 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00035 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00036 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00037 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00038 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00039 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00040 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00041 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00042 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00043 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00044 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00045 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00046 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00047 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00048 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00049 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00050 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00051 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00052 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00053 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00054 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00055 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00056 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00057 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00058 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00059 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00060 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00061 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00062 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00063 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00064 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00065 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00066 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00067 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00068 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00069 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00070 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00071 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00072 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00073 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00074 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00075 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00076 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00077 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00078 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00079 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00080 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00081 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00082 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00083 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00084 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00085 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00086 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00087 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00088 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00089 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00090 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00091 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00092 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00093 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00094 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00095 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00096 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00097 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00098 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00099 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00100 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00101 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00102 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00103 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00104 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00105 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00106 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00107 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00108 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00109 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00110 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00111 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00112 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00113 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00114 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00115 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00116 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00117 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00118 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00119 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00120 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00121 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00122 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00123 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00124 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00125 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00126 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00127 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00128 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00129 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00130 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00131 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00132 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00133 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00134 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00135 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00136 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00137 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00138 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00139 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00140 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00141 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00142 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00143 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00144 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00145 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00146 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00147 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00148 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00149 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00150 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00151 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00152 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00153 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00154 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00155 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00156 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00157 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00158 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00159 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00160 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00161 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00162 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00163 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00164 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00165 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00166 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00167 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00168 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00169 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00170 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00171 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00172 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00173 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00174 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00175 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00176 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00177 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00178 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00179 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00180 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00181 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00182 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00183 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00184 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00185 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00186 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00187 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00188 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00189 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00190 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00191 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00192 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00193 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00194 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00195 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00196 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00197 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00198 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00199 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00200 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00201 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00202 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00203 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00204 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00205 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00206 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00207 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00208 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00209 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00210 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00211 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00212 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00213 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00214 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00215 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00216 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00217 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00218 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00219 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00220 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00221 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00222 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00223 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00225 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_EPSG_nad83.csv:00226 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00002 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00003 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00004 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00005 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00006 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00007 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00008 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00009 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00010 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00011 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00012 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00013 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00014 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00015 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00016 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00017 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00018 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV PROJ4_SPCS_nad27.csv:00019 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00020 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00021 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00022 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00023 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00024 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00025 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00026 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00027 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00028 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00029 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00030 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00031 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00032 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00033 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00034 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00035 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00036 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00037 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00038 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00039 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00040 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00041 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00042 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00043 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00044 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00045 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00046 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00047 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00048 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00049 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00050 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00051 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00052 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00053 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00054 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00055 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00056 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00057 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00058 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00059 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00060 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00061 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00062 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00063 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00064 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00065 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00066 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00067 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00068 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00069 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00070 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00071 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00072 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00073 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00074 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00075 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00076 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00077 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00078 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00079 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00080 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00081 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00082 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00083 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00084 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00085 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00086 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00087 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00088 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00089 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00090 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00091 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00092 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00093 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00094 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00095 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00096 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00097 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00098 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00099 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00100 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00101 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00102 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00103 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00104 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00105 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00106 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00107 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00108 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00109 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00110 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00111 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00112 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00113 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00114 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00115 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00116 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00117 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00118 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00119 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00120 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00121 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00122 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00123 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00124 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00125 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00126 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00127 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00128 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00129 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00130 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00131 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00132 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00133 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00134 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00135 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00136 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00137 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00138 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00139 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00140 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00141 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00142 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00143 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00144 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00145 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00146 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00147 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00148 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00149 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00150 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00151 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00152 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00153 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00154 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00155 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00156 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00157 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00158 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00159 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00160 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00161 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00162 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00163 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00164 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00165 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00166 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00167 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00168 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00169 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00170 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00171 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00172 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00173 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00174 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00175 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00176 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00177 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00178 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00179 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00180 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00181 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00182 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00183 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00184 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00185 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00186 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00187 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00188 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00189 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00190 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00191 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00192 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00193 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00194 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00195 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00196 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00197 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00198 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00199 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00200 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00201 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00202 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00203 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00204 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00205 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00206 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00207 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00208 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00209 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00210 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00211 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00212 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00213 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00214 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00215 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00216 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00217 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00218 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00219 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00220 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00221 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00222 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00223 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00224 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00225 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00226 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00227 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00228 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00229 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00230 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00231 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00232 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00233 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00234 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00235 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00236 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00237 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00238 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00239 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00240 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00241 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00242 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00243 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00244 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00245 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00246 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00247 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00248 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00249 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00250 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00251 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00252 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00253 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00254 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00255 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00256 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00257 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00258 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00259 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00260 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00261 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00262 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00263 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00264 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00265 longlat datum,no_defs,proj +CSV PROJ4_SPCS_nad27.csv:00266 longlat datum,no_defs,proj +CSV proj4-epsg.csv:00002 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00003 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00004 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00005 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00006 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00007 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00008 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00009 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00010 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00011 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00012 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00013 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00014 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00015 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00016 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00017 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00018 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00019 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00020 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00021 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00022 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00023 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00024 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00025 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00026 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00027 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00028 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00029 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00030 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00031 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00032 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00033 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00034 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00035 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00036 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00037 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00038 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00039 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00040 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00041 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00042 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00043 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00044 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00045 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00046 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00047 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00048 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00049 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00050 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00051 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00052 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00053 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00054 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00055 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00056 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00057 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00058 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00059 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00060 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00061 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00062 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00063 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00064 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00065 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00066 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00067 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00068 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00069 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00070 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00071 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00072 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00073 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00074 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00075 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00076 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00077 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00078 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00079 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00080 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00081 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00082 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00083 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00084 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00085 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00086 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00087 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00088 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00089 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00090 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00091 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00092 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00093 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00094 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00095 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00096 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00097 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00098 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00099 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00100 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00101 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00102 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00103 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00104 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00105 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00106 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00107 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00108 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00109 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00110 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00111 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00112 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00113 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00114 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00115 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00116 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00117 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00118 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00119 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00120 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00121 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00122 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00123 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00124 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00125 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00126 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00127 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00128 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00129 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00130 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00131 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00132 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00133 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00134 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00135 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00136 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00137 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00138 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00139 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00140 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00141 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00142 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00143 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00144 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00145 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00146 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00147 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00148 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00149 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00150 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00151 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00152 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00153 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00154 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00155 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00156 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00157 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00158 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00159 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00160 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00161 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00162 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00163 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00164 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00165 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00166 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00167 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00168 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00169 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00170 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00171 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00172 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00173 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00174 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00175 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00176 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00177 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00178 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00179 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00180 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00181 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00182 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00183 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00184 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00185 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00186 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00187 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00188 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00189 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00190 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00191 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00192 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00193 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00194 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00195 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00196 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00197 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00198 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00199 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00200 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00201 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00202 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00203 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00204 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00205 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00206 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00207 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00208 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00209 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00210 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00211 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00212 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00213 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00214 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00215 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00216 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00217 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00218 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00219 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00220 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00221 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00222 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00223 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00224 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00225 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00226 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00227 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00228 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00229 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00230 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00231 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00232 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00233 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00234 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00235 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00236 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00237 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00238 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00239 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00240 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00241 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00242 longlat longlat datum,no_defs,proj +CSV proj4-epsg.csv:00243 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00244 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00245 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00246 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00247 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00248 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00249 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00250 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00251 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00252 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00253 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00254 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00255 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00256 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00257 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00258 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00259 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00260 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00261 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00262 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00263 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00264 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00265 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00266 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00267 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00268 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00269 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00270 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00271 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00272 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00273 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00274 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00275 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00276 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00277 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00278 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00279 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00280 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00281 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00282 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00283 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00284 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00285 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00286 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00287 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00288 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00289 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00290 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00291 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00292 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00293 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00294 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00295 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00296 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00297 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00298 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00299 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00300 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00301 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00302 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00303 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00304 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00305 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00306 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00307 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00308 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00309 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00310 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00311 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00312 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00313 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00314 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00315 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00316 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00317 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00318 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00319 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00320 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00321 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00322 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00323 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00324 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00325 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00326 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00327 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00328 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00329 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00330 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00331 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00332 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00333 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00334 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00335 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00336 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00337 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00338 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00339 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00340 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00341 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00342 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00343 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00344 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00345 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00346 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00347 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00348 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00349 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00350 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00351 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00352 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00353 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00354 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00355 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00356 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00357 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00358 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00359 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00360 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00361 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00362 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00363 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00364 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00365 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00366 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00367 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00368 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00369 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00370 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00371 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00372 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00373 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00374 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00375 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00376 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00377 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00378 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00379 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00380 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00381 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00382 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00383 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00384 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00385 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00386 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00387 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00388 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00389 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00390 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00391 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00392 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00393 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00394 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00395 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00396 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00397 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00398 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00399 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00400 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00401 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00402 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00403 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00404 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00405 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00406 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00407 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00408 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00409 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00410 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00411 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00412 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00413 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00414 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00415 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00416 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00417 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00418 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00419 longlat longlat a,b,datum,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00420 longlat longlat datum,ellps,no_defs,pm,proj +CSV proj4-epsg.csv:00421 longlat longlat datum,ellps,no_defs,pm,proj +CSV proj4-epsg.csv:00422 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00423 longlat longlat a,b,datum,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00424 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00425 longlat longlat datum,ellps,no_defs,pm,proj +CSV proj4-epsg.csv:00426 longlat longlat datum,ellps,no_defs,pm,proj +CSV proj4-epsg.csv:00427 longlat longlat a,b,datum,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00428 longlat longlat a,b,datum,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00429 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00430 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00431 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00432 longlat longlat a,b,datum,no_defs,pm,proj +CSV proj4-epsg.csv:00433 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00434 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00435 longlat longlat a,b,datum,no_defs,pm,proj +CSV proj4-epsg.csv:00436 longlat longlat a,b,datum,no_defs,pm,proj +CSV proj4-epsg.csv:00437 longlat longlat a,b,datum,no_defs,pm,proj +CSV proj4-epsg.csv:00438 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00439 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00440 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00441 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00442 longlat longlat datum,ellps,no_defs,pm,proj,towgs84 +CSV proj4-epsg.csv:00443 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00444 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00445 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00446 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00447 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00448 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00449 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00450 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00451 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00452 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00453 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00454 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00455 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00456 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00457 longlat longlat a,b,datum,no_defs,proj +CSV proj4-epsg.csv:00458 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00459 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00460 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00461 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00462 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00463 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00464 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00465 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00466 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00467 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00468 longlat longlat a,b,datum,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00469 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00470 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00471 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00472 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00473 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00474 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00475 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00476 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00477 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00478 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00479 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00480 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00481 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00482 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00483 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00484 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00485 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00486 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00487 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00488 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00489 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00490 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00491 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00492 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00493 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00494 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00495 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00496 longlat longlat datum,ellps,no_defs,proj +CSV proj4-epsg.csv:00497 longlat longlat datum,ellps,no_defs,proj,towgs84 +CSV proj4-epsg.csv:00498 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00499 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00500 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00501 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00502 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00503 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00504 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00505 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00506 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00507 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00508 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00509 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00510 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00511 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00512 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00513 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00514 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00515 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00516 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00517 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00518 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00519 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00520 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00521 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00522 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00523 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00524 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00525 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00526 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00527 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00528 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00529 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00530 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00531 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00532 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00533 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00534 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00535 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00536 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00537 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00538 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00539 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00540 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00541 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00542 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00543 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00544 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00545 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00546 longlat somerc datum,ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00547 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00548 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00549 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00550 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00551 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00552 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00553 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00554 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00555 longlat krovak alpha,datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00556 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:00557 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00558 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00559 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00560 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00561 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00562 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00563 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00564 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00565 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00566 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00567 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00568 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00569 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00570 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00571 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00572 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00573 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00574 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00575 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00576 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00577 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00578 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00579 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00580 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00581 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00582 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00583 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00584 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00585 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00586 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00587 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00588 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00589 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00590 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00591 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00592 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00593 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:00594 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00595 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00596 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00597 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00598 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00599 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00600 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00601 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00602 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00603 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00604 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00605 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00606 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00607 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00608 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00609 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00610 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00611 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00612 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00613 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00614 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00615 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:00616 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:00617 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00618 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00619 longlat laea a,b,datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00620 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00621 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00622 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00623 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00624 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00625 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00626 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00627 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00628 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00629 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00630 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00631 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00632 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00633 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00634 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00635 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00636 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00637 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00638 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00639 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00640 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00641 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00642 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00643 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00644 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00645 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00646 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00647 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00648 longlat sterea a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00649 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00650 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00651 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00652 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00653 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00654 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00655 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00656 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00657 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00658 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00659 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00660 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00661 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00662 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00663 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00664 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00665 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:00666 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:00667 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:00668 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00669 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00670 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00671 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00672 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00673 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00674 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00675 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00676 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00677 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00678 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00679 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00680 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00681 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00682 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00683 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00684 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00685 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00686 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00687 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00688 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00689 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00690 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00691 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00692 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00693 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00694 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00695 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00696 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00697 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00698 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00699 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00700 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00703 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00704 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00705 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00706 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00707 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00708 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00709 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00710 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00711 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00712 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00713 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00714 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00715 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00716 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00717 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00718 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00719 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00720 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00721 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00722 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00723 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00724 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00725 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00726 longlat sterea a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00727 longlat sterea a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00728 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00729 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00730 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00731 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00732 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00733 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:00734 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:00735 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00736 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00737 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00738 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00739 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00740 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00741 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00742 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00743 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00744 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00745 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00746 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00747 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00748 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00749 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00750 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00751 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00752 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00753 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00754 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00755 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00756 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00757 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00758 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00759 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00760 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00761 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00762 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00763 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:00764 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00765 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00766 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00767 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00768 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00769 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00770 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00771 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00772 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00773 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00774 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00775 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00776 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00777 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00778 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00779 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00780 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00781 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00782 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00783 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00784 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00785 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00786 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00787 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00788 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00789 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00790 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00791 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00792 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00793 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00794 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00796 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00797 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00798 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00799 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00800 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00801 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00802 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00803 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00804 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00805 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00806 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00807 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00808 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00809 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00810 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00811 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00812 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00813 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00814 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00815 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00816 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00817 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00818 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00819 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00820 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00821 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00822 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00823 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00824 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00825 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00826 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00827 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00828 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00829 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00830 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00831 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00832 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00833 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00834 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00835 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00836 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00837 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00838 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00839 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00840 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00841 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00842 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00843 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00844 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00845 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00846 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00847 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00848 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00849 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00850 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00851 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00852 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00853 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00854 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00855 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00856 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00857 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00858 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00859 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00860 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00861 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00862 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00863 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00864 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00865 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00866 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00867 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00868 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00869 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00870 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00871 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00872 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00873 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00874 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00875 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00876 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00877 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00878 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00879 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00880 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00881 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00882 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00883 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00884 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00885 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00886 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00887 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00888 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00889 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00890 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00891 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00892 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00893 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00894 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00895 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00896 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00897 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00898 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00899 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00900 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00901 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00902 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00903 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00904 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00905 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00906 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00907 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00908 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00909 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00910 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00911 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00912 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:00913 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00914 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00915 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00916 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00917 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00918 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00919 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00920 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00921 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00922 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00923 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00924 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00925 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00926 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00927 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00928 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00929 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00930 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00931 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00932 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00933 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00934 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00935 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00936 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00937 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00938 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00939 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00940 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00941 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00942 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00943 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00944 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00945 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00946 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00947 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00948 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00949 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00950 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00951 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00952 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00953 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00954 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00955 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00956 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00957 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00958 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00959 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00960 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00961 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00962 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00963 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00964 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00965 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00966 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00967 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00968 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00969 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00970 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00971 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00972 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00973 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00974 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00975 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00976 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00977 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00978 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00979 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00980 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00981 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00982 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00983 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00984 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00985 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00986 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00987 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00988 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00989 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00990 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00991 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00992 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00993 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00994 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00995 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00996 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00997 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00998 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:00999 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01000 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01001 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01002 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01003 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01004 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01005 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01006 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01008 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01009 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01010 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01011 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01012 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01013 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01014 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01015 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01016 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01017 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01018 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01019 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01020 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01021 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01022 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01023 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01024 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01025 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01026 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01027 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01028 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01029 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01030 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01031 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01032 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01033 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01034 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01035 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01036 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01037 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01038 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01039 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01040 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01041 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01042 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01043 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01044 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01045 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01046 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01047 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01048 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01049 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01050 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01051 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01052 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01053 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01054 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01055 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01056 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01057 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01058 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01059 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01060 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01061 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01062 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01063 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01064 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01065 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01066 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01067 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01068 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01069 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01070 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01071 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01072 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01073 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01074 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01075 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01076 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01077 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01078 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01079 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01080 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01081 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01082 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01083 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01084 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01085 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01086 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01087 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01088 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01089 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01090 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01091 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01092 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01093 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01094 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01095 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01096 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01097 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01098 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01099 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01100 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01101 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01102 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01103 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01104 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01105 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01106 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01107 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01108 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01109 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01110 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01111 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01112 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01113 longlat merc datum,ellps,k,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01114 longlat merc datum,ellps,k,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01115 longlat merc datum,ellps,k,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01116 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01117 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01118 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01119 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01120 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01121 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01122 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01123 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01124 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01125 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01126 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01127 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01128 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01129 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01130 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01131 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01132 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01133 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01134 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01135 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01136 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01137 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01138 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01139 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01140 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01141 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01142 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01143 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01144 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01145 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01146 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01147 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01148 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01149 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01150 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01151 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01152 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01153 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01154 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01155 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01156 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01157 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01158 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01159 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01160 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01161 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01162 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01163 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01164 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01165 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01166 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01167 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01168 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01169 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01170 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01171 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01172 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01173 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01174 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01175 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01176 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01177 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01178 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01179 longlat cass datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01180 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01181 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01182 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01183 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01184 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01185 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01186 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01187 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01188 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01189 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01190 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01191 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01192 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01193 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01194 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01195 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01196 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01197 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01198 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01199 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01200 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01201 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01202 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01203 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01204 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01205 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01206 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01207 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01208 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01209 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01210 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01211 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01212 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01213 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01214 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01215 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01216 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01217 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01218 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01219 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01220 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01221 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01222 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01223 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01225 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01226 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01227 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01228 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01229 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01230 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01231 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01232 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01233 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01234 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01235 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01236 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01237 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01238 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01239 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01240 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01241 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01242 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01243 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01244 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01245 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01246 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01247 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01248 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01249 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01250 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01251 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01252 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01253 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01254 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01255 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01256 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01257 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01258 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01259 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01260 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01261 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01262 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01263 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01264 longlat omerc a,alpha,b,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:01265 longlat omerc a,alpha,b,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01266 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01267 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01268 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01269 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01270 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01271 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01272 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01273 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01274 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01275 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01276 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01277 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01278 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01279 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01280 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01281 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01282 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01283 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01284 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01285 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01286 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01287 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01288 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01289 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01290 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01291 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01292 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01293 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01294 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01295 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01296 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01297 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01298 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01299 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01300 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01303 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01304 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01305 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01306 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01307 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01308 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01309 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01310 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01311 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01312 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01313 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01314 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01315 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01316 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01317 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01318 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01319 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01320 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01321 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01322 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01323 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01324 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01325 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01326 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01327 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01328 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01329 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01330 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01331 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01332 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01333 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01334 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01335 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01336 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01337 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01338 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01339 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01340 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01341 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01342 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01343 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01344 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01345 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01346 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01347 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01348 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01349 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01350 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01351 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01352 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01353 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01354 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01355 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01356 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01357 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01358 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01359 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01360 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01361 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01362 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01363 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01364 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01365 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01366 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01367 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01368 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01369 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01370 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01371 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01372 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01373 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01374 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01375 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01376 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01377 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01378 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01379 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01380 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01381 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01382 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01383 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01384 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01385 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01386 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01387 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01388 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01389 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01390 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01391 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01392 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01393 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01394 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01395 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01396 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01397 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01398 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01399 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01400 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01401 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01402 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01403 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01404 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01405 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01406 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01407 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01408 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01409 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01410 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01411 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01412 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01413 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01414 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01415 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01416 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01417 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01418 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01419 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01420 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01421 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01422 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01423 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01424 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01425 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01426 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01427 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01428 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01429 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01430 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01431 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01432 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01433 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01434 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01435 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01436 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01437 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01438 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01439 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01440 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01441 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01442 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01443 longlat merc datum,k,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01444 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01445 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01446 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01447 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:01448 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:01449 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01450 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01451 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01452 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01453 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01454 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01455 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01456 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01457 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01458 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01459 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01460 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01461 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01462 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:01463 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:01464 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:01465 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:01466 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:01467 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01468 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01469 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01470 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01471 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01472 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01473 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01474 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01475 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01476 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01477 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01478 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01479 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01480 longlat merc datum,ellps,lat_ts,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01481 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01482 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01483 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01484 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01485 longlat merc datum,k,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01486 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01487 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01488 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01489 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01490 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01491 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01492 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01493 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:01494 longlat laea a,b,datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01495 longlat laea a,b,datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01496 longlat cea a,b,datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01497 longlat stere a,b,datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01498 longlat stere a,b,datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01499 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01500 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01501 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01503 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01504 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01505 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01506 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01507 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01508 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01509 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01510 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01511 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01512 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01513 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01514 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01515 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01516 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01517 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01518 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01519 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01520 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01521 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01522 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01523 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01524 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01525 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01526 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01527 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01528 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01529 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01530 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01531 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01532 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01533 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01534 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01535 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01536 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01537 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01538 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01539 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01540 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01541 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01542 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01543 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01544 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01545 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01546 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01547 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01548 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01549 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01550 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01551 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01552 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01553 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01554 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01555 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01556 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01557 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01558 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01559 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01560 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01561 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01562 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01563 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01564 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01565 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01566 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01567 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01568 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01569 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01570 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01571 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01572 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01573 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01574 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01575 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01576 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01577 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01578 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01579 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01580 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01581 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01582 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01583 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01584 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01585 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01586 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01587 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01588 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01589 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01590 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01591 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01592 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01593 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01594 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01595 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01596 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01597 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01598 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01599 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01600 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01601 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01602 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01603 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01604 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01605 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01606 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01607 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01608 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01609 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01610 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01611 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01612 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01613 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01614 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01615 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01616 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01617 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01618 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01619 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01620 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01621 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01622 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01623 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01624 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01625 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01626 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01627 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01628 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01629 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01630 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01631 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01632 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01633 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01634 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01635 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01636 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01637 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01638 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01639 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01640 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01641 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01642 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01643 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01644 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01645 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01646 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01647 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01648 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01649 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01650 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01651 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01652 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01653 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01654 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01655 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01656 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01657 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01658 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01659 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01660 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01661 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01662 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01663 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01664 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01665 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01666 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01667 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01668 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01669 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01670 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01671 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01672 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01673 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01674 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01675 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01676 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01677 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01678 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01679 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01680 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01681 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01682 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01683 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01684 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01685 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01686 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01687 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01688 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01689 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01690 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01691 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01692 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01693 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01694 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01695 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01696 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01697 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01698 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01699 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01700 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01701 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01702 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01703 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01704 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01705 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01706 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01707 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01708 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01709 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01710 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01711 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01712 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01713 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01714 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01715 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01716 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01717 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01718 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01719 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01720 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01721 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01722 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01723 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01724 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01725 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01726 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01727 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01728 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01729 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01730 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01731 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01732 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01733 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01734 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01735 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01736 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01737 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01738 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01739 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01740 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01741 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01742 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01743 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01744 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01745 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01746 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01747 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01748 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01749 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01750 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01751 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01752 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01753 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01754 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01755 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01756 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01757 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01758 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01759 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01760 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01761 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01762 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01763 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01764 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01765 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01766 longlat merc datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01767 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01768 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01769 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01770 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01771 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01772 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01773 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01774 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01775 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01776 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01777 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01778 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01779 longlat merc a,b,datum,k,lat_ts,lon_0,nadgrids,no_defs,proj,units,wktext,x_0,y_0 +CSV proj4-epsg.csv:01780 longlat eqc a,b,datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01781 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01782 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01783 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01784 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01785 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01786 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01787 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01788 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01789 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01790 longlat merc datum,k,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01791 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01792 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01793 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01794 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01796 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01797 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01798 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01799 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01800 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01801 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01802 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01803 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01804 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01805 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01806 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01807 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01808 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01809 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01810 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01811 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01812 longlat merc a,b,datum,k,lat_ts,lon_0,nadgrids,no_defs,proj,units,wktext,x_0,y_0 +CSV proj4-epsg.csv:01813 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01814 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01815 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01816 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01817 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01818 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01819 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01820 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01821 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01822 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01823 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01824 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01825 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01826 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01827 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01828 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01829 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01830 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01831 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01832 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01833 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01834 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01835 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01836 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01837 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01838 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01839 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01840 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01841 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01842 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01843 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01844 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01845 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01846 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01847 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01848 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01849 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01850 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01851 longlat cea datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01852 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01853 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01854 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01855 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01856 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01857 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01858 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01859 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01860 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01861 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01862 longlat merc datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01863 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01864 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01865 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01866 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01867 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:01868 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:01869 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01870 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01871 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01872 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01873 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01874 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01875 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01876 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01877 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01878 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01879 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01880 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01881 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01882 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01883 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01884 longlat eqc datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01885 longlat eqc a,b,datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01886 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01887 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01888 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01889 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01890 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01891 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01892 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01893 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01894 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01895 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01896 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01897 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01898 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01899 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01900 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01901 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01902 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01903 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01904 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01905 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01906 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01907 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01908 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01909 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01910 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01911 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01912 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01913 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:01914 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01915 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01916 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01917 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01918 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01919 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01920 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01921 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01922 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01923 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01924 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01925 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01926 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01927 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01928 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01929 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01930 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01931 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01932 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01933 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01934 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01935 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01936 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01937 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01938 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01939 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01940 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01941 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01942 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01943 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01944 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01945 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01946 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01947 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01948 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01949 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01950 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01951 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01952 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01953 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01954 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01955 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01956 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01957 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01958 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01959 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01960 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01961 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01962 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01963 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01964 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01965 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01966 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01967 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01968 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01969 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01970 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01971 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01972 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01973 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01974 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01975 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01976 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01977 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01978 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01979 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01980 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01981 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01982 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01983 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01984 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01985 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01986 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01987 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01988 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01989 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01990 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01991 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:01992 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01993 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:01994 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01995 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01996 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01997 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01998 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:01999 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02000 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02001 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02002 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02003 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02004 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02005 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02006 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02008 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02009 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02010 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02011 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02012 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02013 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02014 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02015 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02016 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02017 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02018 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02019 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02020 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02021 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02022 longlat krovak alpha,datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02023 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02024 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02025 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02026 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02027 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02028 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02029 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02030 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02031 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02032 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02033 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02034 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02035 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02036 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02037 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02038 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02039 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02040 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02041 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02042 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02043 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02044 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02045 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02046 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02047 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02048 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02049 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02050 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02051 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02052 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02053 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02054 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02055 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02056 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02057 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02058 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02059 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02060 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02061 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02062 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02063 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02064 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02065 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02066 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02067 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02068 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02069 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02070 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02071 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02072 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02073 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02074 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02075 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02076 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02077 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02078 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02079 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02080 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02081 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02082 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02083 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02084 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02085 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02086 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02087 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02088 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02089 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02090 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02091 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02092 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:02093 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02094 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02095 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02096 longlat stere datum,ellps,k,lat_0,lat_ts,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02097 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02098 longlat krovak alpha,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02099 longlat krovak alpha,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02100 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02102 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02103 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02104 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02105 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02106 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02107 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02108 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02109 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02110 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02111 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02112 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02113 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02114 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02115 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02116 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02117 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02118 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02119 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02120 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02121 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02122 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02123 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02124 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02125 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02126 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02127 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02128 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02129 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02130 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02131 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02132 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02133 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02134 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02135 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02136 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02137 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02138 longlat sterea datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02139 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:02140 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02141 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02142 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02143 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02144 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02145 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02146 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02147 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02148 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02149 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02150 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02151 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02152 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02153 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02154 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02155 longlat merc datum,ellps,lat_ts,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02156 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02157 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02158 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02159 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02160 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02161 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02162 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02163 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02164 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02165 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02166 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02167 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02168 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02169 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02170 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02171 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02172 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02173 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02174 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02175 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02176 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02177 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02178 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02179 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02180 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02181 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02182 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02183 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02184 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02185 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02186 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02187 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02188 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02189 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02190 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02191 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02192 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02193 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02194 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02195 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02196 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02197 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02198 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02199 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02200 longlat stere a,b,datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02201 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02202 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02203 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02204 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02205 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02206 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02207 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02208 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02209 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02210 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02211 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02212 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02213 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02214 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02215 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02216 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02217 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02218 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02219 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02220 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02221 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02222 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02223 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02224 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02225 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02226 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02227 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02228 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02229 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02230 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02231 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02232 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02233 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02234 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02235 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02236 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02237 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02238 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02239 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02240 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02241 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02242 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02243 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02244 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02245 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02246 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02247 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02248 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02249 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02250 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02251 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02252 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02253 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02254 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02255 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02256 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02257 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02258 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02259 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02260 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02261 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02262 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02263 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02264 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02265 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02266 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02267 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02268 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02269 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02270 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02271 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02272 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02273 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02274 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02275 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02276 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02277 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02278 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02279 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02280 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02281 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02282 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02283 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02284 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02285 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02286 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02287 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02288 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02289 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02290 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02291 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02292 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02293 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02294 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02295 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02296 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02297 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02298 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02299 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02300 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02301 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02302 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02303 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02304 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02305 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02306 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02307 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02308 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02309 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02310 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02311 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02312 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02313 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02314 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02315 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02316 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02317 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02318 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02319 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02320 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02321 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02322 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02323 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02324 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02325 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02326 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02327 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02328 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02329 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02330 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02331 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02332 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02333 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02334 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02335 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02336 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02337 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02338 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02339 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02340 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02341 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02342 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02343 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02344 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02345 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02346 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02347 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02348 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02349 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02350 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02351 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02352 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02353 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02354 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02355 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02356 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02357 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02358 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02359 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02360 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02361 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02362 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02363 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02364 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02365 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02366 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02367 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02368 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02369 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02370 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02371 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02372 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02373 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02374 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02375 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02376 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02377 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02378 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02379 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02380 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02381 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02382 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02383 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02384 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02385 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02386 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02387 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02388 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02389 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02390 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02391 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02392 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02393 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02394 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02395 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02396 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02397 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02398 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02399 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02400 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02401 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02402 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02403 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02404 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02405 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02406 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02407 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02408 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02409 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02410 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02411 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02412 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02413 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02414 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02415 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02416 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02417 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02418 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02419 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02420 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02421 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02422 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02423 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02424 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02425 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02426 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02427 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02428 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02429 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02430 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02431 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02432 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02433 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02434 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02435 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02436 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02437 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02438 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02439 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02440 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02441 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02442 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02443 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02444 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02445 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02446 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02447 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02448 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02449 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02450 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02451 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02452 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02453 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02454 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02455 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02456 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02457 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02458 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02459 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02460 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02461 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02462 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02463 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02464 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02465 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02466 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02467 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02468 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02469 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02470 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02471 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02472 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02473 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02474 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02475 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02476 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02477 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02478 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02479 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02480 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02481 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02482 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02483 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02484 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02485 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02486 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02487 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02488 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02489 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02490 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02491 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02492 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02493 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02494 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02495 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02496 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02497 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02498 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02499 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02500 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02501 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02502 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02503 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02504 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02505 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02506 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02507 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02508 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02509 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02510 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02511 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02512 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02513 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02514 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02515 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02516 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02517 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02518 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02519 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02520 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02521 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02522 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02523 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02524 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02525 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02526 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02527 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02528 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02529 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02530 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02531 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02532 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02533 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02534 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02535 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02536 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02537 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02538 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02539 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:02540 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02541 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02542 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02543 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02544 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02545 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02546 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02547 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02548 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02549 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02550 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02551 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02552 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02553 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02554 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02555 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02556 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02557 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02558 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02559 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02560 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02561 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02562 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02563 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02564 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02565 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02566 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02567 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02568 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02569 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02570 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02571 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02572 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02573 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02574 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02575 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02576 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02577 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02578 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02579 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02580 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02581 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02582 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02583 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02584 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02585 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02586 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02587 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02588 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02589 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02590 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02591 longlat cea datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02592 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02593 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02594 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02595 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02596 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02597 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02598 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02599 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02600 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02601 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02602 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02603 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02604 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02605 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02606 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02607 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02608 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02609 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02610 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02611 longlat utm datum,ellps,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:02612 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02613 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02614 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02615 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02616 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02617 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02618 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02619 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02620 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02621 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02622 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02623 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02624 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02625 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02626 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02627 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02628 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02629 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02630 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02631 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02632 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02633 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02634 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02635 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02636 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02637 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02638 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02639 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02640 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02641 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02642 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02643 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02644 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02645 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02646 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02647 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02648 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02649 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02650 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02651 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02652 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02653 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02654 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02655 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02656 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02657 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02658 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02659 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02660 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02661 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02662 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02663 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02664 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02665 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02666 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02667 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02668 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02669 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02670 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02671 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02672 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02673 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02674 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02675 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02676 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02677 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02678 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02679 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02680 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02681 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02682 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02683 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02684 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02685 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02686 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02687 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02688 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02689 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02690 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02691 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02692 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02693 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02694 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02695 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02696 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02697 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02698 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02699 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02700 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02701 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02702 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02703 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02704 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02705 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02706 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02707 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02708 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02709 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02710 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02711 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02712 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02713 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02714 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02715 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02716 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02717 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02718 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02719 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02720 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02721 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02722 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02723 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02724 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02725 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02726 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02727 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02728 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02729 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02730 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02731 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02732 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02733 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02734 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02735 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02736 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02737 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02738 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02739 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02740 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02741 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02742 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02743 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02744 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02745 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02746 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02747 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02748 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02749 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02750 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02751 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02752 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02753 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02754 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02755 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02756 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02757 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02758 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02759 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02760 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02761 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02762 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02763 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02764 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02765 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02766 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02767 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02768 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02769 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02770 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02771 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02772 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02773 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02774 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02775 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02776 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02777 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02778 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02779 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02780 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02781 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02782 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02783 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02784 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02785 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02786 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02787 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02788 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02789 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02790 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02791 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02792 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02793 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02794 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02795 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02796 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02797 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02798 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02799 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02800 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02801 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02802 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02803 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02804 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02805 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02806 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02807 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02808 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02809 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02810 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02811 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02812 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02813 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02814 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02815 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02816 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02817 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02818 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02819 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02820 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02821 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02822 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02823 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02824 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02825 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02826 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02827 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02828 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02829 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02830 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02831 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02832 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02833 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02834 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02835 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02836 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02837 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02838 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02839 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02840 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02841 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02842 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02843 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02844 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02845 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02846 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02847 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02848 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02849 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02850 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02851 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02852 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02853 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02854 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02855 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02856 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02857 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02858 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02859 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02860 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02861 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02862 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02863 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02864 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02865 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02866 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02867 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02868 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02869 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02870 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02871 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02872 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02873 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02874 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02875 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02876 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02877 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02878 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02879 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02880 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02881 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02882 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02883 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02884 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02885 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02886 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02887 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02888 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02889 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02890 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02891 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02892 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02893 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02894 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02895 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02896 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02897 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02898 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02899 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02900 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02901 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02902 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02903 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02904 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02905 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02906 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02907 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,pm,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02908 longlat somerc datum,ellps,k_0,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02909 longlat somerc datum,ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02910 longlat somerc datum,ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02911 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02912 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02913 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02914 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02915 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02916 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02917 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02918 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02919 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02920 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02921 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02922 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02923 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02924 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02925 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02926 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02927 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02928 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02929 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02930 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02931 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02932 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02933 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02934 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02935 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02936 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02937 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02938 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02939 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02940 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02941 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02942 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02943 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02944 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02945 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02946 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02947 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02948 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02949 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02950 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02951 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02952 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02953 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02954 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02955 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02956 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02957 longlat tmerc a,axis,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02958 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:02959 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02960 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:02961 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02962 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02963 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02964 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02965 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:02966 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02967 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02968 longlat sterea a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02969 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:02970 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02971 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02972 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02973 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02974 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02975 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02976 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02977 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02978 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02979 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02980 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02981 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02982 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02983 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02984 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02985 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02986 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02987 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02988 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02989 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:02990 longlat somerc datum,ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:02991 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02992 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02993 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02994 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02995 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02996 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02997 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02998 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:02999 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03000 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03001 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03002 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03003 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03004 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03005 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03006 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03007 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03008 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03009 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03010 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03011 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03012 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03013 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03014 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03015 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03016 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03017 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03018 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03019 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03020 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03021 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03022 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03023 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03024 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03025 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03026 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03027 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03028 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03029 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03030 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03031 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03032 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03033 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03034 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03035 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03036 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03037 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03038 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03039 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03040 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +CSV proj4-epsg.csv:03041 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03042 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03043 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03044 longlat omerc a,alpha,b,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03045 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03046 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03047 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03048 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03049 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03050 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03051 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03052 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03053 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03054 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03055 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03056 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03057 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03058 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03059 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03060 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03061 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03062 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03063 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03064 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03065 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03066 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03067 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03068 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03069 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03070 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03071 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03072 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03073 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03074 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03075 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03076 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03077 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03078 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03079 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03080 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03081 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03082 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03083 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03084 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03085 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03086 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03087 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03088 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03089 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03090 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03091 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03092 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03093 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03094 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03095 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03096 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03097 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03098 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03099 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03100 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03101 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03102 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03103 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03104 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03105 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03106 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03107 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03108 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03109 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03110 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03111 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03112 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03113 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03114 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03115 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03116 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03117 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03118 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03119 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03120 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03121 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03122 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03123 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03124 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03125 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03126 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03127 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03128 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03129 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03130 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03131 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03132 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03133 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03134 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03135 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03136 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03137 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03138 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03139 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03140 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03141 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03142 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03143 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03144 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03145 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03146 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03147 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03148 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03149 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03150 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03151 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03152 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03153 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03154 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03155 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03156 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03157 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03158 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03159 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03160 longlat lcc a,b,datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03161 longlat lcc a,b,datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03162 longlat lcc a,b,datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03163 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03164 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03165 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03166 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03167 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03168 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03169 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03170 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03171 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03172 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03173 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03174 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03175 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03176 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03177 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03178 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03179 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03180 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03181 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03182 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03183 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03184 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03185 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03186 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03187 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03188 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03189 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03190 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03191 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03192 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03193 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03194 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03195 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03196 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03197 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03198 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03199 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03200 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03201 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03202 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03203 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03204 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03205 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03206 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03207 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03208 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03209 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03210 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03211 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03212 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03213 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03214 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03215 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03216 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03217 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03218 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03219 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03220 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03221 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03222 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03223 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03224 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03225 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03226 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03227 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03228 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03229 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03230 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03231 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03232 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03233 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03234 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03235 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03236 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03237 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03238 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03239 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03240 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03241 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03242 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03243 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03244 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03245 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03246 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03247 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03248 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03249 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03250 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03251 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03252 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03253 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03254 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03255 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03256 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03257 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03258 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03259 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03260 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03261 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03262 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03263 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03264 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03265 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03266 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03267 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03268 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03269 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03270 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03271 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03272 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03273 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03274 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03275 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03276 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03277 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03278 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03279 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03280 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03281 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03282 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03283 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03284 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03285 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03286 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03287 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03288 longlat nzmg datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03289 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03290 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03291 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03292 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03293 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03294 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03295 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03296 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03297 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03298 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03299 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03300 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03301 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03302 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03303 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03304 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03305 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03306 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03307 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03308 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03309 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03310 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03311 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03312 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03313 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03314 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03315 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03316 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03317 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03318 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03319 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03320 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03321 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03322 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03323 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03324 longlat utm a,b,datum,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03325 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03326 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03327 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03328 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03329 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03330 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03331 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03332 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03333 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03334 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03335 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03336 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03337 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03338 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03339 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03340 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03341 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03342 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03343 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03344 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03345 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03346 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03347 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03348 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03349 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03350 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03351 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03352 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03353 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03354 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03355 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03356 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03357 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03358 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03359 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03360 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03361 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03362 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03363 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03364 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03365 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03366 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03367 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03368 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03369 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03370 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03371 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03372 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03373 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03374 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03375 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03376 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03377 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03378 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03379 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03380 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03381 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03382 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03383 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03384 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03385 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03386 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03387 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03388 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03389 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03390 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03391 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03392 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03393 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03394 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03395 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03396 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03397 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03398 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03399 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03400 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03401 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03402 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03403 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03404 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03405 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03406 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03407 longlat utm a,b,datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03408 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03409 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03410 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03411 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03412 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03413 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03414 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03415 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03416 longlat omerc alpha,datum,ellps,gamma,k,lat_0,lonc,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03417 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03418 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03419 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03420 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03421 longlat cass a,b,datum,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +CSV proj4-epsg.csv:03422 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:03423 longlat utm datum,ellps,no_defs,proj,units,zone +CSV proj4-epsg.csv:03424 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03425 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03426 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03427 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03428 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03429 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03430 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03431 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03432 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03433 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03434 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03435 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03436 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03437 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03438 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03439 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03440 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03441 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03442 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03443 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03444 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03445 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03446 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03447 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03448 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03449 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03450 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03451 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03452 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03453 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03454 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03455 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03456 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03457 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03458 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03459 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03460 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03461 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03462 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03463 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03464 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03465 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03466 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03467 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03468 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03469 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03470 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03471 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03472 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03473 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03474 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03475 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03476 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03477 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03478 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03479 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03480 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03481 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03482 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03483 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03484 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03485 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03486 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03487 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03488 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03489 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03490 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03491 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03492 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03493 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +CSV proj4-epsg.csv:03494 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03495 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03496 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03497 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03498 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03499 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03500 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03501 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03502 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03503 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03504 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03505 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03506 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03507 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03508 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03509 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03510 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03511 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03512 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03513 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03514 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03515 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03516 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03517 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03518 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03519 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03520 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03521 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03522 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03523 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03524 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03525 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03526 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03527 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03528 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03529 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03530 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03531 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03532 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03533 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03534 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03535 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03536 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03537 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03538 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03539 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03540 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03541 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03542 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03543 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03544 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03545 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03546 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03547 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03548 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03549 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03550 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03551 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03552 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03553 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03554 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03555 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03556 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03557 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03558 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03559 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03560 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03561 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03562 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03563 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03564 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03565 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03566 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03567 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03568 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03569 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03570 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03571 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03572 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03573 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03574 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03575 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03576 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03577 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03578 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03579 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03580 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03581 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03582 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03583 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03584 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03585 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03586 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03587 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03588 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03589 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03590 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03591 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03592 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03593 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03594 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03595 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03596 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03597 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03598 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03599 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03600 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03603 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03604 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03605 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03606 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03607 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03608 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03609 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03610 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03611 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03612 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03613 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03614 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03615 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03616 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03617 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03618 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03619 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03620 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03621 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03622 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03623 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03624 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03625 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03626 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03627 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03628 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03629 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03630 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03631 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03632 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03633 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03634 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03635 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03636 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03637 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03638 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03639 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03640 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03641 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03642 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03643 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03644 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03645 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03646 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03647 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03648 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03649 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03650 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03651 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03652 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03653 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03654 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03655 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03656 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03657 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03658 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03659 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03660 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03661 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03662 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03663 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03664 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03665 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03666 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03667 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03668 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03669 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03670 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03671 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03672 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03673 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03674 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03675 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03676 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03677 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03678 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03679 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03680 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03681 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03682 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03683 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03684 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03685 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03686 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03687 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03688 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03689 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03690 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03691 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03692 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03693 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03694 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03695 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03696 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03697 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03698 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03699 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03700 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03701 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03702 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03703 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03704 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03705 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03706 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03707 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03708 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03709 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03710 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03711 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03712 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03713 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03714 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03715 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03716 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03717 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03718 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03719 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03720 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03721 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03722 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03723 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03724 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03725 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03726 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03727 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03728 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03729 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03730 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03731 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03732 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03733 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03734 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03735 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03736 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03737 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03738 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03739 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03740 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03741 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03742 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03743 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03744 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03745 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03746 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03747 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03748 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03749 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03750 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03751 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03752 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03753 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03754 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03755 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03756 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03757 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03758 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03759 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03760 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03761 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03762 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03763 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03764 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03765 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03766 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03767 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03768 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03769 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03770 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03771 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03772 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03773 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03774 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03775 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03776 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03777 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03778 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03779 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03780 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03781 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03782 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03783 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03784 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03785 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03786 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03787 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03788 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03789 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03790 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03791 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03792 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03793 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03794 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03795 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03796 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03797 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03798 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03799 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03800 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03801 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03802 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03803 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03804 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03805 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03806 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03807 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03808 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03809 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03810 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03811 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03812 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03813 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03814 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +CSV proj4-epsg.csv:03815 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03816 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03817 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03818 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03819 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03820 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03821 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03822 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03823 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03824 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03825 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03826 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03827 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03828 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03829 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03830 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03831 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03832 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03833 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03834 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03835 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03836 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03837 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03838 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03839 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03840 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03841 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03842 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03843 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03844 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03845 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03846 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03847 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03848 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03849 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03850 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03851 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03852 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03853 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03854 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03855 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03856 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03857 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03858 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03859 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03860 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03861 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03862 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03863 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03864 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03865 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03866 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03867 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03868 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03869 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03870 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +CSV proj4-epsg.csv:03871 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03872 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03873 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03874 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03875 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03876 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03877 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03878 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03879 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03880 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03881 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03882 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03883 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03884 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03885 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03886 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03887 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03888 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03889 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03890 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03891 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03892 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03893 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03894 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03895 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03896 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03897 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03898 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03899 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03900 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03901 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03902 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03903 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03904 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03905 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03906 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03907 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03908 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03909 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03910 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03911 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03912 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03913 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03914 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03915 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03916 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03917 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03918 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03919 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03920 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03921 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03922 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03923 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03924 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03925 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03926 longlat utm datum,no_defs,proj,units,zone +CSV proj4-epsg.csv:03927 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03928 longlat eqc datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03929 longlat eqc datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03930 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03931 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03932 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03933 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03934 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03935 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03936 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03937 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03938 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03939 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03940 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03941 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03942 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03943 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03944 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03945 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03946 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03947 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03948 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03949 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03950 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03951 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03952 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03953 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03954 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03955 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03956 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03957 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03958 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03959 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03960 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03961 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03962 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03963 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03964 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03965 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03966 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03967 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03968 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03969 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03970 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03971 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03972 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03973 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03974 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03975 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03976 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03977 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03978 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03979 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03980 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03981 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03982 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03983 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03984 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03985 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03986 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03987 longlat utm datum,no_defs,proj,south,units,zone +CSV proj4-epsg.csv:03988 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03989 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +CSV proj4-epsg.csv:03990 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03991 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03992 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03993 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03994 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03995 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03996 longlat geocent datum,no_defs,proj,units +CSV proj4-epsg.csv:03997 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03998 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:03999 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04000 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04001 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04002 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04003 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04004 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04005 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04006 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04007 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04008 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04009 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04010 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04011 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04012 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04013 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04014 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04015 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04016 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04017 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04018 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04019 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04020 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04021 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04022 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04023 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04024 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04025 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04026 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04027 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04028 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04029 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04030 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04031 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04032 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04033 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04034 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04035 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04036 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04037 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04038 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04039 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04040 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04041 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04042 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04043 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04044 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04045 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04046 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04047 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04048 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04049 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04050 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04051 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04052 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04053 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04054 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04055 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04056 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04057 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04058 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04059 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04060 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04061 longlat geocent a,b,datum,no_defs,proj,units +CSV proj4-epsg.csv:04062 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04063 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04064 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04065 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04066 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04067 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04068 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04069 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04070 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04071 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04072 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04073 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04074 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04075 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04076 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04077 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04078 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04079 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04080 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04081 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04082 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04083 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04084 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04085 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04086 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04087 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04088 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04089 longlat geocent datum,no_defs,proj,units +CSV proj4-epsg.csv:04090 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04091 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04092 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04093 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04094 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04095 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04096 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04097 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04098 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04099 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04100 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04101 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04102 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04103 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04104 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04105 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04106 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04107 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04108 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04109 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04110 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04111 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04112 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04113 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04114 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04115 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04116 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04117 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04118 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04119 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04120 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04121 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04122 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04123 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04124 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04125 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04126 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04127 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04128 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04129 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04130 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04131 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04132 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04133 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04134 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04135 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04136 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04137 longlat geocent datum,ellps,no_defs,proj,units +CSV proj4-epsg.csv:04138 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04139 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04140 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04141 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04142 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04143 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04144 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04145 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04146 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04147 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04148 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04149 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04150 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04151 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04152 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04153 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04154 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04155 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04156 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04157 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04158 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04159 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04160 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04161 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04162 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04163 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04164 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04165 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04166 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04167 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04168 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04169 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04170 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04171 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04172 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04173 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04174 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04175 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04176 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04177 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04178 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04179 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04180 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04181 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04182 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04183 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04184 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04185 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04186 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04187 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04188 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04189 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04190 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04191 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04192 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04193 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04194 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04195 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04196 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04197 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04198 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04199 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04200 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04201 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04202 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04203 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04204 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04205 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04206 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04207 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04208 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04209 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04210 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04211 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04212 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04213 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04214 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04215 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04216 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04217 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04218 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04219 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04220 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04221 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04222 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04223 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04225 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04226 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04227 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04228 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04229 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04230 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04231 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04232 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04233 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04234 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04235 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04236 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04237 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04238 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04239 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04240 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04241 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04242 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04243 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04244 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04245 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04246 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04247 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04248 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04249 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04250 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04251 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04252 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04253 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04254 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04255 longlat longlat datum,ellps,no_defs,proj,vunits +CSV proj4-epsg.csv:04256 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04257 longlat longlat datum,ellps,no_defs,proj,vunits +CSV proj4-epsg.csv:04258 longlat longlat a,b,datum,no_defs,pm,proj,towgs84,vunits +CSV proj4-epsg.csv:04259 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04260 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04261 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04262 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04263 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04264 longlat longlat datum,no_defs,proj,vunits +CSV proj4-epsg.csv:04265 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04266 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04267 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04268 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04269 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04270 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04271 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04272 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +CSV proj4-epsg.csv:04273 longlat sterea datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04274 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04275 longlat utm datum,ellps,no_defs,proj,towgs84,units,vunits,zone +CSV proj4-epsg.csv:04276 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04277 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04278 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04279 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04280 longlat lcc a,b,datum,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +CSV proj4-epsg.csv:04281 longlat longlat datum,ellps,no_defs,proj,towgs84,vunits +PAIR t00/epsg:3821>epsg:2012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4007>epsg:2025 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4014>epsg:2081 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4024>epsg:2163 longlat laea a,b,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4034>epsg:2328 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4045>epsg:2341 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4128>epsg:2353 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t00/epsg:4174>epsg:2366 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t01/epsg:3821>epsg:2048 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t01/epsg:4007>epsg:2108 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t01/epsg:4014>epsg:2121 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t01/epsg:4024>epsg:2134 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +PAIR t01/epsg:4034>epsg:2150 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t01/epsg:4045>epsg:2193 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t01/epsg:4128>epsg:22174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t01/epsg:4174>epsg:2224 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t02/epsg:3821>epsg:2006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t02/epsg:4007>epsg:20355 longlat utm a,b,ellps,no_defs,proj,south,towgs84,units,zone +PAIR t02/epsg:4014>epsg:2044 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t02/epsg:4024>epsg:2064 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t02/epsg:4034>epsg:2079 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t02/epsg:4045>epsg:2092 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t02/epsg:4128>epsg:21100 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t02/epsg:4174>epsg:21418 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:3821>epsg:20009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4007>epsg:20022 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4014>epsg:20066 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4024>epsg:20079 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4034>epsg:20092 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4045>epsg:2094 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4128>epsg:2392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t03/epsg:4174>epsg:2468 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t04/epsg:3821>epsg:26703 longlat utm datum,ellps,no_defs,proj,units,zone +PAIR t04/epsg:4007>epsg:26716 longlat utm a,b,datum,no_defs,proj,units,zone +PAIR t04/epsg:4014>epsg:26735 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t04/epsg:4024>epsg:26748 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t04/epsg:4034>epsg:26766 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t04/epsg:4045>epsg:26779 longlat lcc a,b,datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t04/epsg:4128>epsg:26795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t04/epsg:4174>epsg:32007 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t10/epsg:3824>epsg:2012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4075>epsg:2025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4152>epsg:2081 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4173>epsg:2163 longlat laea a,b,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4283>epsg:2328 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4617>epsg:2341 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4667>epsg:2353 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t10/epsg:4737>epsg:2366 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t11/epsg:3824>epsg:2048 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t11/epsg:4075>epsg:2108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t11/epsg:4152>epsg:2121 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t11/epsg:4173>epsg:2134 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +PAIR t11/epsg:4283>epsg:2150 longlat utm ellps,no_defs,proj,towgs84,units,zone +PAIR t11/epsg:4617>epsg:2193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t11/epsg:4667>epsg:22174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t11/epsg:4737>epsg:2224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t12/epsg:3824>epsg:2006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t12/epsg:4075>epsg:20355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +PAIR t12/epsg:4152>epsg:2044 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t12/epsg:4173>epsg:2064 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t12/epsg:4283>epsg:2079 longlat utm ellps,no_defs,proj,towgs84,units,zone +PAIR t12/epsg:4617>epsg:2092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t12/epsg:4667>epsg:21100 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t12/epsg:4737>epsg:21418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:3824>epsg:20009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4075>epsg:20022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4152>epsg:20066 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4173>epsg:20079 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4283>epsg:20092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4617>epsg:2094 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4667>epsg:2392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t13/epsg:4737>epsg:2468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t14/epsg:3824>epsg:26703 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t14/epsg:4075>epsg:26716 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t14/epsg:4152>epsg:26735 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t14/epsg:4173>epsg:26748 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t14/epsg:4283>epsg:26766 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t14/epsg:4617>epsg:26779 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t14/epsg:4667>epsg:26795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t14/epsg:4737>epsg:32007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:3906>epsg:2012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4132>epsg:2025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4145>epsg:2081 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4155>epsg:2163 longlat laea a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4168>epsg:2328 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4192>epsg:2341 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4207>epsg:2353 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t20/epsg:4214>epsg:2366 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t21/epsg:3906>epsg:2048 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t21/epsg:4132>epsg:2108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t21/epsg:4145>epsg:2121 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t21/epsg:4155>epsg:2134 longlat utm a,b,ellps,no_defs,proj,south,towgs84,units,zone +PAIR t21/epsg:4168>epsg:2150 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t21/epsg:4192>epsg:2193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t21/epsg:4207>epsg:22174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t21/epsg:4214>epsg:2224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t22/epsg:3906>epsg:2006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t22/epsg:4132>epsg:20355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +PAIR t22/epsg:4145>epsg:2044 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t22/epsg:4155>epsg:2064 longlat utm a,b,no_defs,proj,towgs84,units,zone +PAIR t22/epsg:4168>epsg:2079 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t22/epsg:4192>epsg:2092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t22/epsg:4207>epsg:21100 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t22/epsg:4214>epsg:21418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:3906>epsg:20009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4132>epsg:20022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4145>epsg:20066 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4155>epsg:20079 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4168>epsg:20092 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4192>epsg:2094 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4207>epsg:2392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t23/epsg:4214>epsg:2468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t24/epsg:3906>epsg:26703 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t24/epsg:4132>epsg:26716 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t24/epsg:4145>epsg:26735 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t24/epsg:4155>epsg:26748 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t24/epsg:4168>epsg:26766 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t24/epsg:4192>epsg:26779 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t24/epsg:4207>epsg:26795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t24/epsg:4214>epsg:32007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:3819>epsg:2012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4188>epsg:2025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4232>epsg:2081 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4289>epsg:2163 longlat laea a,b,ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4322>epsg:2328 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4660>epsg:2341 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4691>epsg:2353 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t30/epsg:4817>epsg:2366 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t31/epsg:3819>epsg:2048 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t31/epsg:4188>epsg:2108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t31/epsg:4232>epsg:2121 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t31/epsg:4289>epsg:2134 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +PAIR t31/epsg:4322>epsg:2150 longlat utm ellps,no_defs,proj,towgs84,units,zone +PAIR t31/epsg:4660>epsg:2193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t31/epsg:4691>epsg:22174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t31/epsg:4817>epsg:2224 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t32/epsg:3819>epsg:2006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t32/epsg:4188>epsg:20355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +PAIR t32/epsg:4232>epsg:2044 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t32/epsg:4289>epsg:2064 longlat utm a,b,ellps,no_defs,proj,towgs84,units,zone +PAIR t32/epsg:4322>epsg:2079 longlat utm ellps,no_defs,proj,towgs84,units,zone +PAIR t32/epsg:4660>epsg:2092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t32/epsg:4691>epsg:21100 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t32/epsg:4817>epsg:21418 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:3819>epsg:20009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4188>epsg:20022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4232>epsg:20066 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4289>epsg:20079 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4322>epsg:20092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4660>epsg:2094 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4691>epsg:2392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t33/epsg:4817>epsg:2468 longlat tmerc a,b,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t34/epsg:3819>epsg:26703 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t34/epsg:4188>epsg:26716 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t34/epsg:4232>epsg:26735 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t34/epsg:4289>epsg:26748 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t34/epsg:4322>epsg:26766 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t34/epsg:4660>epsg:26779 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t34/epsg:4691>epsg:26795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t34/epsg:4817>epsg:32007 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t40/epsg:4267>epsg:2012 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/epsg:4267>epsg:2163 longlat laea a,b,datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/epsg:4267>epsg:2353 longlat tmerc a,b,datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/esri:104000>epsg:2025 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/esri:104000>epsg:2328 longlat tmerc a,b,datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/esri:104000>epsg:2366 longlat tmerc a,b,datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/esri:4267>epsg:2081 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t40/esri:4267>epsg:2341 longlat tmerc a,b,datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t41/epsg:4267>epsg:2048 longlat tmerc axis,datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t41/epsg:4267>epsg:2134 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +PAIR t41/epsg:4267>epsg:22174 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t41/esri:104000>epsg:2108 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t41/esri:104000>epsg:2150 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t41/esri:104000>epsg:2224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t41/esri:4267>epsg:2121 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t41/esri:4267>epsg:2193 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t42/epsg:4267>epsg:2006 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t42/epsg:4267>epsg:2064 longlat utm a,b,datum,no_defs,proj,towgs84,units,zone +PAIR t42/epsg:4267>epsg:21100 longlat merc datum,ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +PAIR t42/esri:104000>epsg:20355 longlat utm datum,ellps,no_defs,proj,south,towgs84,units,zone +PAIR t42/esri:104000>epsg:2079 longlat utm datum,ellps,no_defs,proj,towgs84,units,zone +PAIR t42/esri:104000>epsg:21418 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t42/esri:4267>epsg:2044 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t42/esri:4267>epsg:2092 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/epsg:4267>epsg:20009 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/epsg:4267>epsg:20079 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/epsg:4267>epsg:2392 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/esri:104000>epsg:20022 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/esri:104000>epsg:20092 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/esri:104000>epsg:2468 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/esri:4267>epsg:20066 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t43/esri:4267>epsg:2094 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +PAIR t44/epsg:4267>epsg:26703 longlat utm datum,no_defs,proj,units,zone +PAIR t44/epsg:4267>epsg:26748 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t44/epsg:4267>epsg:26795 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t44/esri:104000>epsg:26716 longlat utm datum,ellps,no_defs,proj,units,zone +PAIR t44/esri:104000>epsg:26766 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t44/esri:104000>epsg:32007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t44/esri:4267>epsg:26735 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +PAIR t44/esri:4267>epsg:26779 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2000 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:20004 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20005 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20007 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20008 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2001 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20010 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20011 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20013 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20014 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20015 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20016 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20017 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20019 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2002 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20020 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20021 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20023 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20024 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20027 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20028 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20029 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2003 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20030 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20031 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20032 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2004 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2005 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20064 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20065 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20066 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20067 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20068 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20069 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2007 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20070 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20071 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20072 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20073 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20074 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20075 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20076 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20077 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20078 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20079 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2008 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:20080 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20081 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20082 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20083 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20084 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20085 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20086 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20087 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20088 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20089 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:20090 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2010 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2011 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2013 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:20135 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20136 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20137 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20138 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2014 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2015 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2016 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2017 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2019 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2020 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2021 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2023 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2024 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:20248 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20249 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:20250 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20251 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20252 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20253 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20254 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20255 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20256 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20257 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20258 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2027 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2028 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2029 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2030 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2031 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2032 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2033 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2034 longlat utm ellps,no_defs,proj,units,zone +REG epsg:20348 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20349 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2035 longlat utm ellps,no_defs,proj,units,zone +REG epsg:20350 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20351 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20352 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20353 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20354 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20356 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20357 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20358 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2036 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2037 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2038 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2039 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2040 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2041 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2042 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2043 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20436 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20437 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20438 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20439 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2044 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20440 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2045 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2046 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2047 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2048 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2049 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20499 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2050 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2051 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2052 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2053 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20538 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20539 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2054 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2055 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2056 longlat somerc ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2057 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2058 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2059 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2060 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2061 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2062 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG epsg:2063 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2064 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2065 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2066 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:2067 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2068 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2069 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2070 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2071 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2072 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2073 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2074 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2075 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2076 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2077 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2078 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2079 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:20790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:20791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2080 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2081 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2082 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20822 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20823 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:20824 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2083 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2084 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2085 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2086 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2087 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2088 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2089 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2090 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2093 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:20934 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:20935 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:20936 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:2094 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2095 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2096 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2097 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2098 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2099 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2100 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2101 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2102 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2103 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:21035 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:21036 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:21037 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2104 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2105 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2106 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2107 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2109 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21095 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:21096 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:21097 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2110 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21100 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2111 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2112 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2113 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2114 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21148 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:21149 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2115 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21150 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2116 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2117 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2118 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2119 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2120 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2121 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2122 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2123 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2124 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2125 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2126 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2127 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2128 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2129 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21291 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2130 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2131 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2132 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2133 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2134 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2135 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2136 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:2137 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2138 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2139 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2140 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2141 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21413 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21415 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21416 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2142 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21421 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21422 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21423 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2143 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2144 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2145 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21453 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21454 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21455 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21456 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21457 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21458 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21459 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2146 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21460 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21461 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2147 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21477 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2148 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:21480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2149 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2150 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:21500 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG epsg:2151 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2152 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2153 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2154 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2155 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2156 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2157 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2158 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2159 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:2160 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:2161 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2162 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2163 longlat laea a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2166 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2167 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2168 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2169 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2170 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2171 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2172 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2173 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2174 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2175 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2176 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2178 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21780 longlat somerc ellps,k_0,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:21781 longlat somerc ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21782 longlat somerc ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2179 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2180 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21817 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:21818 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2188 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2189 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:21891 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21892 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21893 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21894 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21896 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21897 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21898 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:21899 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2190 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2191 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2192 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2194 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2195 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2196 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2197 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2198 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2199 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2200 longlat sterea a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2201 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2202 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2203 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:22032 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:22033 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2204 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2205 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2206 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2207 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2208 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2209 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2210 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2211 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2212 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2213 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2214 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2215 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2216 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2217 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:22171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22172 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22173 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22175 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22176 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22181 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22182 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22183 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22184 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22185 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22186 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22187 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2219 longlat utm a,b,no_defs,proj,units,zone +REG epsg:22191 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22192 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22194 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22195 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22196 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22197 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2220 longlat utm a,b,no_defs,proj,units,zone +REG epsg:2222 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2223 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22234 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:22235 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:22236 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:2224 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2225 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2226 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2227 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22275 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22277 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22279 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2228 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22281 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22283 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22285 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22287 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22289 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2229 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22291 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22293 longlat tmerc a,axis,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2230 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2231 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2232 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2233 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22332 longlat utm datum,no_defs,proj,units,zone +REG epsg:2234 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2235 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2236 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2237 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2238 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2239 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22391 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22392 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2240 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2241 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2242 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2243 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2244 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2245 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2246 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2247 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2248 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2249 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2250 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2251 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2252 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22521 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:22522 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:22523 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:22524 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:22525 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2253 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2254 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2255 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2256 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2257 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2258 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2259 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2260 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2261 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2262 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2263 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2264 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2265 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2266 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2267 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2268 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2269 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2270 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22700 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2271 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2272 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2273 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2274 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2275 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2276 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2277 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22770 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2278 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22780 longlat sterea a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2279 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2280 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2281 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2282 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2283 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22832 longlat utm a,b,no_defs,proj,units,zone +REG epsg:2284 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2285 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2286 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2287 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2288 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2289 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2290 longlat sterea a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2291 longlat sterea a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2292 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2294 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2295 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:22991 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22992 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22993 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:22994 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23028 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23029 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23030 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23031 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23032 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23033 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23034 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23035 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23036 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23037 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23038 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2308 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2309 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23090 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23095 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2310 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2311 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2312 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2313 longlat utm ellps,no_defs,proj,units,zone +REG epsg:2314 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:2315 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2316 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2317 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2318 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2319 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2320 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2321 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2322 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2323 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23239 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2324 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23240 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2325 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2326 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2327 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2328 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2329 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2330 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2331 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2332 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2333 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2334 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2335 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2336 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2337 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2338 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2339 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2340 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2341 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2342 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2343 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23433 longlat utm a,b,no_defs,proj,units,zone +REG epsg:2344 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2345 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2346 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2347 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2348 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2349 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2350 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2351 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2352 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2353 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2354 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2355 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2356 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2357 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2358 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2359 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2360 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2361 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2362 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2363 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2364 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2365 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2366 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2367 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2368 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2369 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2370 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23700 longlat somerc ellps,k_0,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2371 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2372 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2373 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2374 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2375 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2376 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2377 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2378 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2379 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2380 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2381 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2382 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2383 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23830 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23831 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23832 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23833 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23834 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23835 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23836 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23837 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23838 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23839 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2384 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23840 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23841 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23842 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23843 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23844 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23845 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23846 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23847 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23848 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23849 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2385 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23850 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23851 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23852 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23853 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2386 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23866 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23867 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23868 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23869 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2387 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23870 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23871 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23872 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:23877 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23878 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23879 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2388 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23880 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23881 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23882 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23883 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23884 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:23886 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23887 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23888 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23889 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:2389 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:23890 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23891 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23892 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23893 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:23894 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:2390 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2391 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2393 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2394 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:23946 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23947 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:23948 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2395 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2396 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2397 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2398 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2399 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2400 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2401 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2402 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2403 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2404 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24047 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24048 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2405 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2406 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2407 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2408 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2409 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2410 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24100 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:2411 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2412 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2413 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2415 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2416 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24200 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2421 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2422 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2423 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2424 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2425 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2426 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2427 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2428 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2429 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2430 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24305 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24306 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2431 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24311 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24312 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24313 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2432 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2433 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2434 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24342 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24343 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24344 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24345 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24346 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24347 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2435 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2436 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2437 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24370 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:24371 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:24372 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:24373 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:24374 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:24375 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24376 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24377 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24378 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24379 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2438 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24380 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24381 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24382 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:24383 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2439 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2440 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2441 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2442 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2443 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2444 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2445 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2446 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2447 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2448 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2449 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2450 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24500 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2451 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2452 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2453 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2454 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24547 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:24548 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2455 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2456 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2457 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24571 longlat omerc a,alpha,b,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,to_meter,towgs84,x_0,y_0 +REG epsg:2458 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2459 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2460 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24600 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2461 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2464 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2465 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2466 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2467 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2469 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2470 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2471 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24718 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:24719 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2472 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24720 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2477 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24817 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:24818 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:24819 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24820 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:24821 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2484 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2485 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2486 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2487 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24877 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:24878 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:24879 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2488 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24880 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:24881 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:24882 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2489 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24891 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24892 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:24893 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2490 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2491 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2493 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2494 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2495 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2496 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2497 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2498 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2499 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2500 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25000 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2501 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2502 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2503 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2504 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2505 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2506 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2507 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2508 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2509 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2510 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2511 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2512 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2513 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2514 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2515 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2516 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2517 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2518 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2519 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2520 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2521 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2522 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2523 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25231 longlat utm a,b,no_defs,proj,units,zone +REG epsg:2524 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2525 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2526 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2527 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2528 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2529 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2530 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2531 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2532 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2533 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2534 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2535 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2536 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2537 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2538 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2539 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25391 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25393 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25394 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25395 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2540 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2541 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2542 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2543 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2544 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2545 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2546 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2547 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2548 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2549 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2550 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2551 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2552 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2553 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2554 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2555 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2556 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2557 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2558 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2559 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2560 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2561 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2562 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2563 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2564 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2565 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2566 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2567 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2568 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2569 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2570 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25700 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2571 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2572 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2573 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2574 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2575 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2576 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2577 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2578 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2579 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2580 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2581 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2582 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25828 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25829 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2583 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25830 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25831 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25832 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25833 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25834 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25835 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25836 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25837 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:25838 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2584 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2585 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2586 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2587 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2588 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25884 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2589 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2590 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2591 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2592 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2593 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:25932 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2594 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2595 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2596 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2597 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2598 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2599 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2600 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2601 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2602 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2603 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2604 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2605 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2606 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2607 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2608 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2609 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2610 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2611 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2612 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2613 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2614 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2615 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2616 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2617 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2618 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2619 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26191 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26192 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26193 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26194 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26195 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2620 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2621 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2622 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2623 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26237 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2624 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2625 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2626 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2627 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2628 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2629 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2630 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2631 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2632 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2633 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26331 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:26332 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2634 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2635 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2636 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2637 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2638 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2639 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26391 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26393 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2640 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2641 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2642 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2643 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26432 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2644 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2645 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2646 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2647 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2648 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2649 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2650 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2651 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2652 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2653 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2654 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2655 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2656 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2657 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2658 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2659 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26591 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:26592 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2660 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2661 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2662 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2663 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26632 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:2664 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2665 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2666 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2667 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2668 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2669 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26692 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:2670 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26701 longlat utm datum,no_defs,proj,units,zone +REG epsg:26702 longlat utm datum,no_defs,proj,units,zone +REG epsg:26703 longlat utm datum,no_defs,proj,units,zone +REG epsg:26704 longlat utm datum,no_defs,proj,units,zone +REG epsg:26705 longlat utm datum,no_defs,proj,units,zone +REG epsg:26706 longlat utm datum,no_defs,proj,units,zone +REG epsg:26707 longlat utm datum,no_defs,proj,units,zone +REG epsg:26708 longlat utm datum,no_defs,proj,units,zone +REG epsg:26709 longlat utm datum,no_defs,proj,units,zone +REG epsg:2671 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26710 longlat utm datum,no_defs,proj,units,zone +REG epsg:26711 longlat utm datum,no_defs,proj,units,zone +REG epsg:26712 longlat utm datum,no_defs,proj,units,zone +REG epsg:26713 longlat utm datum,no_defs,proj,units,zone +REG epsg:26714 longlat utm datum,no_defs,proj,units,zone +REG epsg:26715 longlat utm datum,no_defs,proj,units,zone +REG epsg:26716 longlat utm datum,no_defs,proj,units,zone +REG epsg:26717 longlat utm datum,no_defs,proj,units,zone +REG epsg:26718 longlat utm datum,no_defs,proj,units,zone +REG epsg:26719 longlat utm datum,no_defs,proj,units,zone +REG epsg:2672 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26720 longlat utm datum,no_defs,proj,units,zone +REG epsg:26721 longlat utm datum,no_defs,proj,units,zone +REG epsg:26722 longlat utm datum,no_defs,proj,units,zone +REG epsg:26729 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2673 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26730 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26731 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:26732 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26733 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26734 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26735 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26736 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26737 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26738 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26739 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2674 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26740 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26741 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26742 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26743 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26744 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26745 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26746 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26747 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26748 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26749 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2675 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26750 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26751 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26752 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26753 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26754 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26755 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26756 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26757 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26758 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26759 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2676 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26760 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26766 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26767 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26768 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26769 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2677 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26770 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26771 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26772 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26773 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26774 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26775 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26776 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26777 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26778 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26779 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2678 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26780 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26781 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26782 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26783 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26784 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26785 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26786 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26787 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2679 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26791 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26792 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26793 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26794 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26795 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26796 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26797 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26798 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26799 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2680 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26801 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26802 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26803 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2681 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26811 longlat lcc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26812 longlat lcc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26813 longlat lcc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26814 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26815 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26819 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2682 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26820 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26821 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26822 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26823 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26824 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26826 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2683 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26830 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26831 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26832 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26833 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26834 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26835 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26836 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26837 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2684 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26841 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26842 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26843 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26844 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26845 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26846 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26847 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26848 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26849 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2685 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26850 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26851 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26852 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26853 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26854 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26855 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26856 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26857 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26858 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26859 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2686 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26860 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26861 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26862 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26863 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26864 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26865 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26866 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26867 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26868 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26869 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2687 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26870 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2688 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2689 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26891 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26892 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26893 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26894 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26895 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26896 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26897 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26898 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26899 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2690 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26901 longlat utm datum,no_defs,proj,units,zone +REG epsg:26902 longlat utm datum,no_defs,proj,units,zone +REG epsg:26903 longlat utm datum,no_defs,proj,units,zone +REG epsg:26904 longlat utm datum,no_defs,proj,units,zone +REG epsg:26905 longlat utm datum,no_defs,proj,units,zone +REG epsg:26906 longlat utm datum,no_defs,proj,units,zone +REG epsg:26907 longlat utm datum,no_defs,proj,units,zone +REG epsg:26908 longlat utm datum,no_defs,proj,units,zone +REG epsg:26909 longlat utm datum,no_defs,proj,units,zone +REG epsg:2691 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26910 longlat utm datum,no_defs,proj,units,zone +REG epsg:26911 longlat utm datum,no_defs,proj,units,zone +REG epsg:26912 longlat utm datum,no_defs,proj,units,zone +REG epsg:26913 longlat utm datum,no_defs,proj,units,zone +REG epsg:26914 longlat utm datum,no_defs,proj,units,zone +REG epsg:26915 longlat utm datum,no_defs,proj,units,zone +REG epsg:26916 longlat utm datum,no_defs,proj,units,zone +REG epsg:26917 longlat utm datum,no_defs,proj,units,zone +REG epsg:26918 longlat utm datum,no_defs,proj,units,zone +REG epsg:26919 longlat utm datum,no_defs,proj,units,zone +REG epsg:2692 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26920 longlat utm datum,no_defs,proj,units,zone +REG epsg:26921 longlat utm datum,no_defs,proj,units,zone +REG epsg:26922 longlat utm datum,no_defs,proj,units,zone +REG epsg:26923 longlat utm datum,no_defs,proj,units,zone +REG epsg:26929 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2693 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26930 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26931 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:26932 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26933 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26934 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26935 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26936 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26937 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26938 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26939 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2694 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26940 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26941 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26942 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26943 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26944 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26945 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26946 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26948 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26949 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2695 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26950 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26951 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26952 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26953 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26954 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26955 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26956 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26957 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26958 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26959 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2696 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26960 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26961 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26962 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26963 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26964 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26965 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26966 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26967 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26968 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26969 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2697 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26970 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26971 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26972 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26973 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26974 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26975 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26976 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26977 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26978 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26979 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2698 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26980 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26981 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26982 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26983 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26984 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26985 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26986 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26987 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26988 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26989 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2699 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:26990 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26991 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26992 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26993 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26994 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26995 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26996 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26997 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:26998 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2700 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2701 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2702 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2703 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27037 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:27038 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:27039 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2704 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27040 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2705 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2706 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2707 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2708 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2709 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2710 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2711 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2712 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27120 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2713 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2714 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2715 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2716 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2717 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2718 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2719 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2720 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27200 longlat nzmg datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27205 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27206 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27207 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27208 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27209 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2721 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27210 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27211 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27212 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27213 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27214 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27215 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27216 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27217 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27218 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27219 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2722 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27220 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27221 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27222 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27223 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27224 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27225 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27226 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27227 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27228 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27229 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2723 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27230 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27231 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:27232 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2724 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2725 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27258 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:27259 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:2726 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27260 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:2727 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2728 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2729 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27291 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:27292 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:2730 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2731 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2732 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2733 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2734 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2735 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2736 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2737 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2738 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2739 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27391 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27392 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27393 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27394 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27395 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27396 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27397 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27398 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2740 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2741 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2742 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27429 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2743 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2744 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2745 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2746 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2747 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2748 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2749 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27493 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2750 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27500 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG epsg:2751 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2752 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2753 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2754 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2755 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2756 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27561 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27562 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27563 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27564 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2757 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27571 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27572 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27573 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27574 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2758 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27581 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27582 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27583 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27584 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2759 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27591 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27592 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27593 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:27594 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2760 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2761 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2762 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2763 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2764 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2765 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2766 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2767 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2768 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2769 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2770 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:27700 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2771 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2772 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2773 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2774 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2775 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2776 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2777 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2778 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2779 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2780 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2781 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2782 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2783 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2784 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2785 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2786 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2787 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2788 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2789 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2792 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2793 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2794 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2795 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2796 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2797 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2798 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2799 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2800 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2801 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2802 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2803 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2804 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2805 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2806 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2807 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2808 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2809 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2810 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2811 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2812 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2813 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2814 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2815 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2816 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2817 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2818 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2819 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28191 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28192 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28193 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2820 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2821 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2822 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2823 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28232 longlat utm a,b,no_defs,proj,south,towgs84,units,zone +REG epsg:2824 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2826 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2827 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2828 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2829 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2830 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2831 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2832 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2833 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2834 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28348 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28349 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2835 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28350 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28351 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28352 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28353 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28354 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28356 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28357 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:28358 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2836 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2837 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2838 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2839 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2840 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28402 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28403 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28404 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28405 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28406 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28407 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28408 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28409 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2841 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28410 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28411 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28412 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28413 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28415 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28416 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2842 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28421 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28422 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28423 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28424 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28425 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28426 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28427 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28428 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28429 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2843 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28430 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28431 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28432 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2844 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2845 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2846 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28464 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28465 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28466 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28467 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28469 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2847 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28470 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28471 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28472 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28477 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2848 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28484 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28485 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28486 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28487 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28488 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28489 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2849 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28490 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28491 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2850 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2851 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2852 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2853 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2854 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2855 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2856 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2857 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2858 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2859 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2860 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28600 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2861 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2862 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2863 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2864 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2865 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2866 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2867 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2868 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2869 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2870 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2871 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2872 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2873 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2874 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2875 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2876 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2877 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2878 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2879 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2880 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2881 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2882 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2883 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2884 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2885 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2886 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2887 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2888 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2889 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2890 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2891 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2892 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2893 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2894 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2895 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2896 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2897 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2898 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2899 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28991 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:28992 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2900 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2901 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2902 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2903 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2904 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2905 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2906 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2907 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2908 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2909 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2910 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29100 longlat poly ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29101 longlat poly ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2911 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29118 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29119 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2912 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29120 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29121 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29122 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2913 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2914 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2915 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2916 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29168 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29169 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2917 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29170 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29171 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29172 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29177 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29178 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29179 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2918 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29180 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29181 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29182 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29183 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29184 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29185 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29187 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29188 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29189 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2919 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29190 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29191 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29192 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29193 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29194 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29195 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2920 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2921 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2922 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29220 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29221 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2923 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2924 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2925 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2926 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2927 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2928 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2929 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2930 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2931 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2932 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2933 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29333 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2934 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2935 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2936 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2937 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29371 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29373 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29375 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29377 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29379 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:2938 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29381 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29383 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29385 longlat tmerc axis,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:2939 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2940 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2941 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2942 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2943 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2944 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2945 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2946 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2947 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2948 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2949 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2950 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2951 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2952 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2953 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2954 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2955 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2956 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2957 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2958 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2959 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2960 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2961 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2962 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29635 longlat utm a,b,no_defs,proj,units,zone +REG epsg:29636 longlat utm a,b,no_defs,proj,units,zone +REG epsg:2964 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2965 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2966 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2967 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2968 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2969 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2970 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29700 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:29702 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:2971 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2972 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2973 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29738 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:29739 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2975 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2976 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2977 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2978 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2979 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2980 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2981 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2982 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2983 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2984 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29849 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29850 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2987 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:29871 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29872 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:29873 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2988 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2989 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:2990 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29900 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:29901 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:29902 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:29903 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2991 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2992 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:2993 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2994 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:2995 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2996 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2997 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2998 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:2999 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3000 longlat merc ellps,k,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3001 longlat merc ellps,k,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3002 longlat merc ellps,k,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3003 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3004 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3005 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3006 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3007 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3008 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3010 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3011 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3013 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3014 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3015 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3016 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30161 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30162 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30163 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30166 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30167 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30168 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30169 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3017 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30172 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30173 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30175 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30176 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30178 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30179 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3019 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3020 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30200 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG epsg:3021 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3023 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3024 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3027 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3028 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3029 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3030 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3031 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3032 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3033 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:30339 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3034 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30340 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3035 longlat laea ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3036 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3037 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3038 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3039 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3040 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3041 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3042 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3043 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3044 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3045 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3046 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3047 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3048 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3049 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:30491 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30492 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30493 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:30494 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3050 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3051 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3054 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3055 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3056 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3057 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3058 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3059 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3060 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3061 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3062 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3063 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3064 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3065 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3066 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3067 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3068 longlat cass datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3069 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3070 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3071 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3072 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:30729 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3073 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:30730 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:30731 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:30732 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3074 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3075 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3076 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3077 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3078 longlat omerc alpha,datum,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:3079 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +REG epsg:30791 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:30792 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3080 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:30800 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3081 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3082 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3083 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3084 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3085 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3086 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3087 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3088 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3089 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3090 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3091 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3092 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3093 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3094 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3095 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3096 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3097 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3098 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3099 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3100 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3101 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3102 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31028 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:3103 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3104 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3105 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3106 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3107 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3109 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3110 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3111 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3112 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31121 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3113 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3114 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3115 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31154 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3116 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3117 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3118 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3119 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3120 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3121 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3122 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3123 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3124 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3125 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31251 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31252 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31253 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31254 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31255 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31256 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31257 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31258 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31259 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3126 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31265 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31266 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31267 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31268 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3127 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31275 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31276 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31277 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31278 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31279 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3128 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31281 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31282 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31283 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31284 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31285 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31286 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31287 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31288 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31289 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:3129 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31290 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31291 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31293 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:31294 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31295 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31296 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31297 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3130 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31300 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3131 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3132 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3133 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3134 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3135 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3136 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3137 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31370 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3138 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3140 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3141 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3142 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3143 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3146 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31461 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31462 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31463 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31464 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31465 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31466 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31467 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31468 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:31469 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3147 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3148 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:3149 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:3150 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3151 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3152 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31528 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:31529 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:3153 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3154 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3155 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3156 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3157 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3158 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3159 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3160 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31600 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3161 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3162 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3163 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3164 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3165 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3166 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3167 longlat omerc a,alpha,b,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,to_meter,x_0,y_0 +REG epsg:3168 longlat omerc a,alpha,b,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:3169 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3170 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31700 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3171 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3172 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3174 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3175 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3176 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3178 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3179 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3180 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3181 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3182 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3183 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31838 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31839 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3184 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3185 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3186 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3187 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3188 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3189 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3190 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31900 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31901 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3191 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3192 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3194 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3195 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3196 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31965 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31966 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31967 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31968 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31969 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3197 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31970 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31971 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31972 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31973 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31974 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31975 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31976 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31977 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31978 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31979 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3198 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:31980 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31981 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31982 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31983 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31984 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31985 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31986 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31987 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31988 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31989 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3199 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31990 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31991 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:31992 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31993 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31994 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31995 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31996 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31997 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31998 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:31999 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3200 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:32000 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32001 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32002 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32003 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32005 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32006 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32007 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32008 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32009 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3201 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32010 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32011 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32012 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32013 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32014 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32015 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32016 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32017 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32018 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32019 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3202 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32020 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32021 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32022 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32023 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32024 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32025 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32026 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32027 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32028 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32029 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3203 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32030 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32031 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32033 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32034 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32035 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32036 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32037 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32038 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32039 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3204 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32040 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32041 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32042 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32043 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32044 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32045 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32046 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32047 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32048 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32049 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3205 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32050 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32051 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32052 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32053 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32054 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32055 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32056 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32057 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32058 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3206 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32061 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32062 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32064 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32065 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32066 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32067 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3207 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32074 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32075 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32076 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32077 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3208 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32081 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32082 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32083 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32084 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32085 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32086 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3209 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32098 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32099 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3210 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32100 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32104 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32107 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32108 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32109 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3211 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32110 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32111 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32112 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32113 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32114 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32115 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32116 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32117 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32118 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32119 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3212 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32120 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32121 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32122 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32123 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32124 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32125 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32126 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32127 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32128 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32129 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3213 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32130 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32133 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32134 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32135 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32136 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32137 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32138 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32139 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3214 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32140 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32141 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32142 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32143 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32144 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32145 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32146 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32147 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32148 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32149 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3215 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32150 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32151 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32152 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32153 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32154 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32155 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32156 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32157 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32158 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3216 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32161 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32164 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32165 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32166 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32167 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3217 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3218 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32180 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32181 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32182 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32183 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32184 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32185 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32186 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32187 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32188 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32189 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3219 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32190 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32191 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32192 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32193 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32194 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32195 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32196 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32197 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32198 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32199 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3220 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32201 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32202 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32203 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32204 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32205 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32206 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32207 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32208 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32209 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3221 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32210 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32211 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32212 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32213 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32214 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32215 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32216 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32217 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32218 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32219 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3222 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32220 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32221 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32222 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32223 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32224 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32225 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32226 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32227 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32228 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32229 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3223 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32230 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32231 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32232 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32233 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32234 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32235 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32236 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32237 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32238 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32239 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3224 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32240 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32241 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32242 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32243 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32244 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32245 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32246 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32247 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32248 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32249 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3225 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32250 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32251 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32252 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32253 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32254 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32255 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32256 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32257 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32258 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32259 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3226 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32260 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3227 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3228 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3229 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3230 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32301 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32302 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32303 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32304 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32305 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32306 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32307 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32308 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32309 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3231 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32310 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32311 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32312 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32313 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32314 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32315 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32316 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32317 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32318 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32319 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3232 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32320 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32321 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32322 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32323 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32324 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32325 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32326 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32327 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32328 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32329 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3233 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32330 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32331 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32332 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32333 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32334 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32335 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32336 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32337 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32338 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32339 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3234 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32340 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32341 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32342 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32343 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32344 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32345 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32346 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32347 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32348 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32349 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3235 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32350 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32351 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32352 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32353 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32354 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32356 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32357 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32358 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32359 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3236 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32360 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3237 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3238 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3239 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3240 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32401 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32402 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32403 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32404 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32405 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32406 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32407 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32408 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32409 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3241 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32410 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32411 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32412 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32413 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32414 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32415 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32416 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32417 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32418 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32419 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3242 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32420 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32421 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32422 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32423 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32424 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32425 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32426 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32427 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32428 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32429 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3243 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32430 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32431 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32432 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32433 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32434 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32435 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32436 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32437 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32438 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32439 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3244 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32440 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32441 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32442 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32443 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32444 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32445 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32446 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32447 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32448 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32449 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3245 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32450 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32451 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32452 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32453 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32454 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32455 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32456 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32457 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32458 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:32459 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3246 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32460 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3247 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3248 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3249 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3250 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32501 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32502 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32503 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32504 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32505 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32506 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32507 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32508 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32509 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3251 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32510 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32511 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32512 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32513 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32514 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32515 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32516 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32517 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32518 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32519 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3252 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32520 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32521 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32522 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32523 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32524 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32525 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32526 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32527 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32528 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32529 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3253 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32530 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32531 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32532 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32533 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32534 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32535 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32536 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32537 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32538 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32539 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3254 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32540 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32541 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32542 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32543 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32544 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32545 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32546 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32547 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32548 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32549 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3255 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32550 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32551 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32552 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32553 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32554 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32555 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32556 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32557 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32558 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:32559 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3256 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32560 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3257 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3258 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3259 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3260 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32601 longlat utm datum,no_defs,proj,units,zone +REG epsg:32602 longlat utm datum,no_defs,proj,units,zone +REG epsg:32603 longlat utm datum,no_defs,proj,units,zone +REG epsg:32604 longlat utm datum,no_defs,proj,units,zone +REG epsg:32605 longlat utm datum,no_defs,proj,units,zone +REG epsg:32606 longlat utm datum,no_defs,proj,units,zone +REG epsg:32607 longlat utm datum,no_defs,proj,units,zone +REG epsg:32608 longlat utm datum,no_defs,proj,units,zone +REG epsg:32609 longlat utm datum,no_defs,proj,units,zone +REG epsg:3261 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32610 longlat utm datum,no_defs,proj,units,zone +REG epsg:32611 longlat utm datum,no_defs,proj,units,zone +REG epsg:32612 longlat utm datum,no_defs,proj,units,zone +REG epsg:32613 longlat utm datum,no_defs,proj,units,zone +REG epsg:32614 longlat utm datum,no_defs,proj,units,zone +REG epsg:32615 longlat utm datum,no_defs,proj,units,zone +REG epsg:32616 longlat utm datum,no_defs,proj,units,zone +REG epsg:32617 longlat utm datum,no_defs,proj,units,zone +REG epsg:32618 longlat utm datum,no_defs,proj,units,zone +REG epsg:32619 longlat utm datum,no_defs,proj,units,zone +REG epsg:3262 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32620 longlat utm datum,no_defs,proj,units,zone +REG epsg:32621 longlat utm datum,no_defs,proj,units,zone +REG epsg:32622 longlat utm datum,no_defs,proj,units,zone +REG epsg:32623 longlat utm datum,no_defs,proj,units,zone +REG epsg:32624 longlat utm datum,no_defs,proj,units,zone +REG epsg:32625 longlat utm datum,no_defs,proj,units,zone +REG epsg:32626 longlat utm datum,no_defs,proj,units,zone +REG epsg:32627 longlat utm datum,no_defs,proj,units,zone +REG epsg:32628 longlat utm datum,no_defs,proj,units,zone +REG epsg:32629 longlat utm datum,no_defs,proj,units,zone +REG epsg:3263 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32630 longlat utm datum,no_defs,proj,units,zone +REG epsg:32631 longlat utm datum,no_defs,proj,units,zone +REG epsg:32632 longlat utm datum,no_defs,proj,units,zone +REG epsg:32633 longlat utm datum,no_defs,proj,units,zone +REG epsg:32634 longlat utm datum,no_defs,proj,units,zone +REG epsg:32635 longlat utm datum,no_defs,proj,units,zone +REG epsg:32636 longlat utm datum,no_defs,proj,units,zone +REG epsg:32637 longlat utm datum,no_defs,proj,units,zone +REG epsg:32638 longlat utm datum,no_defs,proj,units,zone +REG epsg:32639 longlat utm datum,no_defs,proj,units,zone +REG epsg:3264 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32640 longlat utm datum,no_defs,proj,units,zone +REG epsg:32641 longlat utm datum,no_defs,proj,units,zone +REG epsg:32642 longlat utm datum,no_defs,proj,units,zone +REG epsg:32643 longlat utm datum,no_defs,proj,units,zone +REG epsg:32644 longlat utm datum,no_defs,proj,units,zone +REG epsg:32645 longlat utm datum,no_defs,proj,units,zone +REG epsg:32646 longlat utm datum,no_defs,proj,units,zone +REG epsg:32647 longlat utm datum,no_defs,proj,units,zone +REG epsg:32648 longlat utm datum,no_defs,proj,units,zone +REG epsg:32649 longlat utm datum,no_defs,proj,units,zone +REG epsg:3265 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32650 longlat utm datum,no_defs,proj,units,zone +REG epsg:32651 longlat utm datum,no_defs,proj,units,zone +REG epsg:32652 longlat utm datum,no_defs,proj,units,zone +REG epsg:32653 longlat utm datum,no_defs,proj,units,zone +REG epsg:32654 longlat utm datum,no_defs,proj,units,zone +REG epsg:32655 longlat utm datum,no_defs,proj,units,zone +REG epsg:32656 longlat utm datum,no_defs,proj,units,zone +REG epsg:32657 longlat utm datum,no_defs,proj,units,zone +REG epsg:32658 longlat utm datum,no_defs,proj,units,zone +REG epsg:32659 longlat utm datum,no_defs,proj,units,zone +REG epsg:3266 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32660 longlat utm datum,no_defs,proj,units,zone +REG epsg:32661 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32662 longlat eqc datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32663 longlat eqc datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32664 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32665 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32666 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32667 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3267 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3268 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3269 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3270 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32701 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32702 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32703 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32704 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32705 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32706 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32707 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32708 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32709 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:3271 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32710 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32711 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32712 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32713 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32714 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32715 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32716 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32717 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32718 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32719 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:3272 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32720 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32721 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32722 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32723 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32724 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32725 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32726 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32727 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32728 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32729 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:3273 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32730 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32731 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32732 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32733 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32734 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32735 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32736 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32737 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32738 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32739 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:3274 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32740 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32741 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32742 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32743 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32744 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32745 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32746 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32747 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32748 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32749 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:3275 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32750 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32751 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32752 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32753 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32754 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32755 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32756 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32757 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32758 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32759 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:3276 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32760 longlat utm datum,no_defs,proj,south,units,zone +REG epsg:32761 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:32766 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3277 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3278 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3279 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3280 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3281 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3282 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3283 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3284 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3285 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3286 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3287 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3288 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3289 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3290 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3291 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3292 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3293 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3294 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3296 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3297 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3298 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3299 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3300 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3301 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3302 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3303 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3304 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3305 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3306 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3307 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3308 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3309 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3310 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3311 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3312 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3313 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3314 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3315 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3316 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3317 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3318 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3319 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3320 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3321 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3322 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3323 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3324 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3325 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3326 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3327 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3328 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3329 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3330 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3331 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3332 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3333 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3334 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3335 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3336 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3337 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3338 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3339 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3340 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3341 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3342 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3343 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3344 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3345 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3346 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3347 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3348 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3349 longlat merc datum,k,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3350 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3351 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3352 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3353 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:3354 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:3355 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3356 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3357 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3358 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3359 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3360 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3361 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3362 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3363 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3364 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3365 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3366 longlat cass a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3367 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3368 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3369 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3370 longlat utm datum,no_defs,proj,units,zone +REG epsg:3371 longlat utm datum,no_defs,proj,units,zone +REG epsg:3372 longlat utm datum,no_defs,proj,units,zone +REG epsg:3373 longlat utm datum,no_defs,proj,units,zone +REG epsg:3374 longlat utm ellps,no_defs,proj,units,zone +REG epsg:3375 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:3376 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:3377 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3378 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3379 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3380 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3381 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3382 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3383 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3384 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3385 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3386 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3387 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3388 longlat merc ellps,lat_ts,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3389 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3390 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3391 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3392 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3393 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3394 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3395 longlat merc datum,k,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3396 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3397 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3398 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3399 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3400 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3401 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3402 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3403 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3404 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3405 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3406 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3407 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:3408 longlat laea a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3409 longlat laea a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3410 longlat cea a,b,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3411 longlat stere a,b,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3412 longlat stere a,b,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3413 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3415 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3416 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3417 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3418 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3419 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3420 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3421 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3422 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3423 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3424 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3425 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3426 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3427 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3428 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3429 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3430 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3431 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3432 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3433 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3434 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3435 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3436 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3437 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3438 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3439 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3440 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3441 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3442 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3443 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3444 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3445 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3446 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3447 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3448 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3449 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3450 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3451 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3452 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3453 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3454 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3455 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3456 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3457 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3458 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3459 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3460 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3461 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:3462 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG epsg:3463 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3464 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3465 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3466 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3467 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3468 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +REG epsg:3469 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3470 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3471 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3472 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3477 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3484 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3485 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3486 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3487 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3488 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3489 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3490 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3491 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3492 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3493 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3494 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3495 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3496 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3497 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3498 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3499 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3500 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3501 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3502 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3503 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3504 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3505 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3506 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3507 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3508 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3509 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3510 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3511 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3512 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3513 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3514 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3515 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3516 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3517 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3518 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3519 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3520 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3521 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3522 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3523 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3524 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3525 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3526 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3527 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3528 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3529 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3530 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3531 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3532 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3533 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3534 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3535 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3536 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3537 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3538 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3539 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3540 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3541 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3542 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3543 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3544 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3545 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3546 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3547 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3548 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3549 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3550 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3551 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3552 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3553 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3554 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3555 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3556 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3557 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3558 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3559 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3560 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3561 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3562 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3563 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3564 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3565 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3566 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3567 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3568 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3569 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3570 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3571 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3572 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3573 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3574 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3575 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3576 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3577 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3578 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3579 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3580 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3581 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3582 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3583 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3584 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3585 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3586 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3587 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3588 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3589 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3590 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3591 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +REG epsg:3592 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3593 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3594 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3595 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3596 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3597 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3598 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3599 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3600 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3601 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3602 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3603 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3604 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3605 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3606 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3607 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3608 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3609 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3610 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3611 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3612 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3613 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3614 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3615 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3616 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3617 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3618 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3619 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3620 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3621 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3622 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3623 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3624 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3625 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3626 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3627 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3628 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3629 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3630 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3631 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3632 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3633 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3634 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3635 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3636 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3637 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3638 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3639 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3640 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3641 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3642 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3643 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3644 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3645 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3646 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3647 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3648 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3649 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3650 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3651 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3652 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3653 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3654 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3655 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3656 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3657 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3658 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3659 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3660 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3661 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3662 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3663 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3664 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3665 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3666 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3667 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3668 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3669 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3670 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3671 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3672 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3673 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3674 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3675 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3676 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3677 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3678 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3679 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3680 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3681 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3682 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3683 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3684 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3685 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3686 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3687 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3688 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3689 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3690 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3691 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3692 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3693 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3694 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3695 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3696 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3697 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3698 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3699 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3700 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3701 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3702 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3703 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3704 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3705 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3706 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3707 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3708 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3709 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3710 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3711 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3712 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3713 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3714 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3715 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3716 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3717 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3718 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3719 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3720 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3721 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3722 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3723 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3724 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3725 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3726 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3727 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3728 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3729 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3730 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3731 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3732 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3733 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3734 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3735 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3736 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3737 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3738 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3739 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3740 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3741 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3742 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3743 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3744 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3745 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3746 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3747 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3748 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3749 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3750 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3751 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3752 longlat merc datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3753 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3754 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3755 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3756 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3757 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3758 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3759 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3760 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3761 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3762 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3763 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3764 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3765 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3766 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3767 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3768 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3769 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3770 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3771 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3772 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3773 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3774 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3775 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3776 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3777 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3778 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3779 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3780 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3781 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3782 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3783 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3784 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:3785 longlat merc a,b,k,lat_ts,lon_0,nadgrids,no_defs,proj,units,wktext,x_0,y_0 +REG epsg:3786 longlat eqc a,b,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3787 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3788 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3789 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3793 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3794 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3795 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3796 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3797 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3798 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3799 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3800 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3801 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3802 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3812 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3814 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3815 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3816 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3819 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:3821 longlat longlat ellps,no_defs,proj +REG epsg:3822 longlat geocent ellps,no_defs,proj,units +REG epsg:3824 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:3825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3826 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3827 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3828 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3829 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3832 longlat merc datum,k,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3833 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3834 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3835 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3836 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3837 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3838 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3839 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3840 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3841 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3842 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3843 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3844 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3845 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3846 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3847 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3848 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3849 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3850 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3851 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3852 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3854 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3857 longlat merc a,b,k,lat_ts,lon_0,nadgrids,no_defs,proj,units,wktext,x_0,y_0 +REG epsg:3873 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3874 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3875 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3876 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3877 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3878 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3879 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3880 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3881 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3882 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3883 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3884 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3885 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3887 longlat geocent ellps,no_defs,proj,units +REG epsg:3889 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:3890 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3891 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3892 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3893 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3901 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:3902 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:3903 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:3906 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:3907 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3908 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3909 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3910 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3911 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3912 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3920 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:3942 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3943 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3944 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3945 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3946 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3947 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3948 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3949 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3950 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3968 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3969 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3970 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3973 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3974 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3975 longlat cea datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3976 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3978 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3979 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3985 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3986 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3987 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3988 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3989 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3991 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3992 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:3994 longlat merc datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3995 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3996 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:3997 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4000 longlat geocent ellps,no_defs,proj,units +REG epsg:4001 longlat longlat ellps,no_defs,proj +REG epsg:4002 longlat longlat ellps,no_defs,proj +REG epsg:4003 longlat longlat ellps,no_defs,proj +REG epsg:4004 longlat longlat ellps,no_defs,proj +REG epsg:4005 longlat longlat a,b,no_defs,proj +REG epsg:4006 longlat longlat ellps,no_defs,proj +REG epsg:4007 longlat longlat a,b,no_defs,proj +REG epsg:4008 longlat longlat ellps,no_defs,proj +REG epsg:4009 longlat longlat a,b,no_defs,proj +REG epsg:4010 longlat longlat a,b,no_defs,proj +REG epsg:4011 longlat longlat a,b,no_defs,proj +REG epsg:4012 longlat longlat ellps,no_defs,proj +REG epsg:4013 longlat longlat a,b,no_defs,proj +REG epsg:4014 longlat longlat a,b,no_defs,proj +REG epsg:4015 longlat longlat a,b,no_defs,proj +REG epsg:4016 longlat longlat ellps,no_defs,proj +REG epsg:4018 longlat longlat a,b,no_defs,proj +REG epsg:4019 longlat longlat ellps,no_defs,proj +REG epsg:4020 longlat longlat ellps,no_defs,proj +REG epsg:4021 longlat longlat a,b,no_defs,proj +REG epsg:4022 longlat longlat ellps,no_defs,proj +REG epsg:4023 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4024 longlat longlat ellps,no_defs,proj +REG epsg:4025 longlat longlat ellps,no_defs,proj +REG epsg:4026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4027 longlat longlat a,b,no_defs,proj +REG epsg:4028 longlat longlat a,b,no_defs,proj +REG epsg:4029 longlat longlat a,b,no_defs,proj +REG epsg:4030 longlat longlat ellps,no_defs,proj +REG epsg:4031 longlat longlat ellps,no_defs,proj +REG epsg:4032 longlat longlat a,b,no_defs,proj +REG epsg:4033 longlat longlat a,b,no_defs,proj +REG epsg:4034 longlat longlat a,b,no_defs,proj +REG epsg:4035 longlat longlat a,b,no_defs,proj +REG epsg:4036 longlat longlat ellps,no_defs,proj +REG epsg:4037 longlat utm datum,no_defs,proj,units,zone +REG epsg:4038 longlat utm datum,no_defs,proj,units,zone +REG epsg:4039 longlat geocent ellps,no_defs,proj,units +REG epsg:4041 longlat longlat a,b,no_defs,proj +REG epsg:4042 longlat longlat a,b,no_defs,proj +REG epsg:4043 longlat longlat ellps,no_defs,proj +REG epsg:4044 longlat longlat a,b,no_defs,proj +REG epsg:4045 longlat longlat a,b,no_defs,proj +REG epsg:4046 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4047 longlat longlat a,b,no_defs,proj +REG epsg:4048 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4049 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4050 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4051 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4052 longlat longlat a,b,no_defs,proj +REG epsg:4053 longlat longlat a,b,no_defs,proj +REG epsg:4054 longlat longlat a,b,no_defs,proj +REG epsg:4055 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4056 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4057 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4058 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4059 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4060 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4061 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:4062 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:4063 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:4071 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:4073 longlat geocent ellps,no_defs,proj,units +REG epsg:4075 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4079 longlat geocent ellps,no_defs,proj,units +REG epsg:4081 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4082 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4083 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4087 longlat eqc datum,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4088 longlat eqc a,b,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4093 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4094 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4095 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4096 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4097 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:4098 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:4099 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:4100 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:4120 longlat longlat ellps,no_defs,proj +REG epsg:4121 longlat longlat datum,no_defs,proj +REG epsg:4122 longlat longlat a,b,no_defs,proj +REG epsg:4123 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4124 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4125 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4126 longlat longlat ellps,no_defs,proj +REG epsg:4127 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4128 longlat longlat ellps,no_defs,proj +REG epsg:4129 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4130 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4131 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4132 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4133 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4134 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4135 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4136 longlat longlat ellps,no_defs,proj +REG epsg:4137 longlat longlat ellps,no_defs,proj +REG epsg:4138 longlat longlat ellps,no_defs,proj +REG epsg:4139 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4140 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4141 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4142 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4143 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4144 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4145 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4146 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4147 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4148 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4149 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4150 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4151 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4152 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4153 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4154 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4155 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4156 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4157 longlat longlat a,b,no_defs,proj +REG epsg:4158 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4159 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4160 longlat longlat ellps,no_defs,proj +REG epsg:4161 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4162 longlat longlat ellps,no_defs,proj +REG epsg:4163 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4164 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4165 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4166 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4167 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4168 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4169 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4170 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4171 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4172 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4173 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4174 longlat longlat a,b,no_defs,proj +REG epsg:4175 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4176 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4178 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4179 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4180 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4181 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4182 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4183 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4184 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4185 longlat longlat ellps,no_defs,proj +REG epsg:4188 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4189 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4190 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4191 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4192 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4193 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4194 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4195 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4196 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4197 longlat longlat ellps,no_defs,proj +REG epsg:4198 longlat longlat ellps,no_defs,proj +REG epsg:4199 longlat longlat ellps,no_defs,proj +REG epsg:4200 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4201 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4202 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4203 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4204 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4205 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4206 longlat longlat a,b,no_defs,proj +REG epsg:4207 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4208 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4209 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4210 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4211 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4212 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4213 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4214 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4215 longlat longlat ellps,no_defs,proj +REG epsg:4216 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4217 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4218 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4219 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4220 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4221 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4222 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4223 longlat longlat datum,no_defs,proj +REG epsg:4224 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4225 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4226 longlat longlat a,b,no_defs,proj +REG epsg:4227 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4228 longlat longlat a,b,no_defs,proj +REG epsg:4229 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4230 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4231 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4232 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4233 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4234 longlat longlat a,b,no_defs,proj +REG epsg:4235 longlat longlat ellps,no_defs,proj +REG epsg:4236 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4237 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4238 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4239 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4240 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4241 longlat longlat a,b,no_defs,proj +REG epsg:4242 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4243 longlat longlat a,b,no_defs,proj +REG epsg:4244 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4245 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4246 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4247 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4248 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4249 longlat longlat ellps,no_defs,proj +REG epsg:4250 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4251 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4252 longlat longlat a,b,no_defs,proj +REG epsg:4253 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4254 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4255 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4256 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4257 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4258 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4259 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4260 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4261 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4262 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4263 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4264 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4265 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4266 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4267 longlat longlat datum,no_defs,proj +REG epsg:4268 longlat longlat a,b,no_defs,proj +REG epsg:4269 longlat longlat datum,no_defs,proj +REG epsg:4270 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4271 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4272 longlat longlat datum,no_defs,proj +REG epsg:4273 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4274 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4275 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4276 longlat longlat ellps,no_defs,proj +REG epsg:4277 longlat longlat datum,no_defs,proj +REG epsg:4278 longlat longlat ellps,no_defs,proj +REG epsg:4279 longlat longlat ellps,no_defs,proj +REG epsg:4280 longlat longlat ellps,no_defs,proj +REG epsg:4281 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4282 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4283 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4284 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4285 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4286 longlat longlat ellps,no_defs,proj +REG epsg:4287 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4288 longlat longlat ellps,no_defs,proj +REG epsg:4289 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4291 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4292 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4293 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4294 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4295 longlat longlat ellps,no_defs,proj +REG epsg:4296 longlat longlat a,b,no_defs,proj +REG epsg:4297 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4298 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4299 longlat longlat datum,no_defs,proj +REG epsg:4300 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4301 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4302 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4303 longlat longlat ellps,no_defs,proj +REG epsg:4304 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4306 longlat longlat ellps,no_defs,proj +REG epsg:4307 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4308 longlat longlat ellps,no_defs,proj +REG epsg:4309 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4310 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4311 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4312 longlat longlat datum,no_defs,proj +REG epsg:4313 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4314 longlat longlat datum,no_defs,proj +REG epsg:4315 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4316 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4317 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4318 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4319 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4322 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4324 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4326 longlat longlat datum,no_defs,proj +REG epsg:4328 longlat geocent datum,no_defs,proj,units +REG epsg:4330 longlat geocent ellps,no_defs,proj,units +REG epsg:4331 longlat geocent ellps,no_defs,proj,units +REG epsg:4332 longlat geocent ellps,no_defs,proj,units +REG epsg:4333 longlat geocent ellps,no_defs,proj,units +REG epsg:4334 longlat geocent ellps,no_defs,proj,units +REG epsg:4335 longlat geocent ellps,no_defs,proj,units +REG epsg:4336 longlat geocent ellps,no_defs,proj,units +REG epsg:4337 longlat geocent ellps,no_defs,proj,units +REG epsg:4338 longlat geocent ellps,no_defs,proj,units +REG epsg:4340 longlat geocent ellps,no_defs,proj,units +REG epsg:4342 longlat geocent ellps,no_defs,proj,units +REG epsg:4344 longlat geocent ellps,no_defs,proj,units +REG epsg:4346 longlat geocent ellps,no_defs,proj,units +REG epsg:4348 longlat geocent ellps,no_defs,proj,units +REG epsg:4350 longlat geocent ellps,no_defs,proj,units +REG epsg:4352 longlat geocent ellps,no_defs,proj,units +REG epsg:4354 longlat geocent ellps,no_defs,proj,units +REG epsg:4356 longlat geocent ellps,no_defs,proj,units +REG epsg:4358 longlat geocent ellps,no_defs,proj,units +REG epsg:4360 longlat geocent ellps,no_defs,proj,units +REG epsg:4362 longlat geocent ellps,no_defs,proj,units +REG epsg:4364 longlat geocent ellps,no_defs,proj,units +REG epsg:4366 longlat geocent ellps,no_defs,proj,units +REG epsg:4368 longlat geocent ellps,no_defs,proj,units +REG epsg:4370 longlat geocent ellps,no_defs,proj,units +REG epsg:4372 longlat geocent ellps,no_defs,proj,units +REG epsg:4374 longlat geocent ellps,no_defs,proj,units +REG epsg:4376 longlat geocent ellps,no_defs,proj,units +REG epsg:4378 longlat geocent ellps,no_defs,proj,units +REG epsg:4380 longlat geocent ellps,no_defs,proj,units +REG epsg:4382 longlat geocent ellps,no_defs,proj,units +REG epsg:4384 longlat geocent ellps,no_defs,proj,units +REG epsg:4385 longlat geocent ellps,no_defs,proj,units +REG epsg:4387 longlat geocent ellps,no_defs,proj,units +REG epsg:4389 longlat geocent ellps,no_defs,proj,units +REG epsg:4390 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4391 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4392 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4393 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4394 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4395 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4396 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4397 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4398 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4399 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4400 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4401 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4402 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4403 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4404 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4405 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4406 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4407 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4408 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4409 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4410 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4411 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4412 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4413 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4415 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4418 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4419 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4420 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4421 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4422 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4423 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4424 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4425 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4426 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4427 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4428 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4429 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4430 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4431 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4432 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4433 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4434 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4437 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4438 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4439 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4455 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4456 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4457 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4462 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4463 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4465 longlat geocent ellps,no_defs,proj,units +REG epsg:4467 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4468 longlat geocent ellps,no_defs,proj,units +REG epsg:4470 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4471 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:4473 longlat geocent ellps,no_defs,proj,units +REG epsg:4474 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:4475 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4479 longlat geocent ellps,no_defs,proj,units +REG epsg:4481 longlat geocent ellps,no_defs,proj,units +REG epsg:4483 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4484 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4485 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4486 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4487 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4488 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4489 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4490 longlat longlat ellps,no_defs,proj +REG epsg:4491 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4493 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4494 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4495 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4496 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4497 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4498 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4499 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4500 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4501 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4502 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4503 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4504 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4505 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4506 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4507 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4508 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4509 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4510 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4511 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4512 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4513 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4514 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4515 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4516 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4517 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4518 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4519 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4520 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4521 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4522 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4523 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4524 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4525 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4526 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4527 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4528 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4529 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4530 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4531 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4532 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4533 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4534 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4535 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4536 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4537 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4538 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4539 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4540 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4541 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4542 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4543 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4544 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4545 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4546 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4547 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4548 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4549 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4550 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4551 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4552 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4553 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4554 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4555 longlat longlat ellps,no_defs,proj +REG epsg:4556 longlat geocent ellps,no_defs,proj,units +REG epsg:4558 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4559 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:4568 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4569 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4570 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4571 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4572 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4573 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4574 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4575 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4576 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4577 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4578 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4579 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4580 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4581 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4582 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4583 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4584 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4585 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4586 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4587 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4588 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4589 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4600 longlat longlat ellps,no_defs,proj +REG epsg:4601 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4602 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4603 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4604 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4605 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4606 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4607 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4608 longlat longlat ellps,no_defs,proj +REG epsg:4609 longlat longlat ellps,no_defs,proj +REG epsg:4610 longlat longlat a,b,no_defs,proj +REG epsg:4611 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4612 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4613 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4614 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4615 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4616 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4617 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4618 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4619 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4620 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4621 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4622 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4623 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4624 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4625 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4626 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4627 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4628 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4629 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4630 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4631 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4632 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4633 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4634 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4635 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4636 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4637 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4638 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4639 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4640 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4641 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4642 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4643 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4644 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4645 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4646 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4647 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4652 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4653 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4654 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4655 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4656 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4657 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4658 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4659 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4660 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4661 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4662 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4663 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4664 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4665 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4666 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4667 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4668 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4669 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4670 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4671 longlat longlat a,b,no_defs,proj +REG epsg:4672 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4673 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4674 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4675 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4676 longlat longlat ellps,no_defs,proj +REG epsg:4677 longlat longlat ellps,no_defs,proj +REG epsg:4678 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4679 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4680 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4681 longlat longlat ellps,no_defs,proj +REG epsg:4682 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4683 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4684 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4685 longlat longlat ellps,no_defs,proj +REG epsg:4686 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4687 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4688 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4689 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4690 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4691 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4692 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4693 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4694 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4695 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4696 longlat longlat ellps,no_defs,proj +REG epsg:4697 longlat longlat ellps,no_defs,proj +REG epsg:4698 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4699 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4700 longlat longlat ellps,no_defs,proj +REG epsg:4701 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4702 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4703 longlat longlat ellps,no_defs,proj +REG epsg:4704 longlat longlat ellps,no_defs,proj +REG epsg:4705 longlat longlat ellps,no_defs,proj +REG epsg:4706 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4707 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4708 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4709 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4710 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4711 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4712 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4713 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4714 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4715 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4716 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4717 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4718 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4719 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4720 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4721 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4722 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4723 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4724 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4725 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4726 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4727 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4728 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4729 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4730 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4731 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4732 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4733 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4734 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4735 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4736 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4737 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4738 longlat longlat a,b,no_defs,proj +REG epsg:4739 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4740 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4741 longlat longlat ellps,no_defs,proj +REG epsg:4742 longlat longlat ellps,no_defs,proj +REG epsg:4743 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4744 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4745 longlat longlat ellps,no_defs,proj +REG epsg:4746 longlat longlat ellps,no_defs,proj +REG epsg:4747 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4748 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4749 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4750 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4751 longlat longlat a,b,no_defs,proj +REG epsg:4752 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:4753 longlat longlat ellps,no_defs,proj +REG epsg:4754 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4755 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4756 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4757 longlat longlat ellps,no_defs,proj +REG epsg:4758 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4759 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4760 longlat longlat ellps,no_defs,proj +REG epsg:4761 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4762 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4763 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4764 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4765 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:4766 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4767 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4768 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4769 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4770 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4771 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4772 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4773 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4774 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4775 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4776 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4777 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4778 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4779 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4780 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4781 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4782 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4783 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4784 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4785 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4786 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4787 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4788 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4789 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4792 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4793 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4794 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4795 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4796 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4797 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4798 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4799 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4800 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4801 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4802 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4803 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4804 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4805 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4806 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4807 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG epsg:4808 longlat longlat ellps,no_defs,pm,proj +REG epsg:4809 longlat longlat ellps,no_defs,pm,proj +REG epsg:4810 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4811 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG epsg:4812 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4813 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4814 longlat longlat ellps,no_defs,pm,proj +REG epsg:4815 longlat longlat ellps,no_defs,pm,proj +REG epsg:4816 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG epsg:4817 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG epsg:4818 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4819 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4820 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4821 longlat longlat a,b,no_defs,pm,proj +REG epsg:4822 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4823 longlat longlat ellps,no_defs,proj +REG epsg:4824 longlat longlat ellps,no_defs,proj +REG epsg:4826 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:4839 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4855 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4856 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4857 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4858 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4859 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4860 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4861 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4862 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4863 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4864 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4865 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4866 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4867 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4868 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4869 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4870 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4871 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4872 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4873 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4874 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4875 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4876 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4877 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4878 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4879 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4880 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:4882 longlat geocent ellps,no_defs,proj,units +REG epsg:4884 longlat geocent ellps,no_defs,proj,units +REG epsg:4886 longlat geocent ellps,no_defs,proj,units +REG epsg:4888 longlat geocent ellps,no_defs,proj,units +REG epsg:4890 longlat geocent ellps,no_defs,proj,units +REG epsg:4892 longlat geocent ellps,no_defs,proj,units +REG epsg:4894 longlat geocent ellps,no_defs,proj,units +REG epsg:4896 longlat geocent ellps,no_defs,proj,units +REG epsg:4897 longlat geocent ellps,no_defs,proj,units +REG epsg:4899 longlat geocent ellps,no_defs,proj,units +REG epsg:4901 longlat longlat a,b,no_defs,pm,proj +REG epsg:4902 longlat longlat a,b,no_defs,pm,proj +REG epsg:4903 longlat longlat a,b,no_defs,pm,proj +REG epsg:4904 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:4906 longlat geocent ellps,no_defs,proj,units +REG epsg:4908 longlat geocent ellps,no_defs,proj,units +REG epsg:4910 longlat geocent ellps,no_defs,proj,units +REG epsg:4911 longlat geocent ellps,no_defs,proj,units +REG epsg:4912 longlat geocent ellps,no_defs,proj,units +REG epsg:4913 longlat geocent ellps,no_defs,proj,units +REG epsg:4914 longlat geocent ellps,no_defs,proj,units +REG epsg:4915 longlat geocent ellps,no_defs,proj,units +REG epsg:4916 longlat geocent ellps,no_defs,proj,units +REG epsg:4917 longlat geocent ellps,no_defs,proj,units +REG epsg:4918 longlat geocent ellps,no_defs,proj,units +REG epsg:4919 longlat geocent ellps,no_defs,proj,units +REG epsg:4920 longlat geocent ellps,no_defs,proj,units +REG epsg:4922 longlat geocent a,b,no_defs,proj,units +REG epsg:4924 longlat geocent ellps,no_defs,proj,units +REG epsg:4926 longlat geocent ellps,no_defs,proj,units +REG epsg:4928 longlat geocent ellps,no_defs,proj,units +REG epsg:4930 longlat geocent ellps,no_defs,proj,units +REG epsg:4932 longlat geocent ellps,no_defs,proj,units +REG epsg:4934 longlat geocent ellps,no_defs,proj,units +REG epsg:4936 longlat geocent ellps,no_defs,proj,units +REG epsg:4938 longlat geocent ellps,no_defs,proj,units +REG epsg:4940 longlat geocent ellps,no_defs,proj,units +REG epsg:4942 longlat geocent ellps,no_defs,proj,units +REG epsg:4944 longlat geocent ellps,no_defs,proj,units +REG epsg:4946 longlat geocent ellps,no_defs,proj,units +REG epsg:4948 longlat geocent ellps,no_defs,proj,units +REG epsg:4950 longlat geocent ellps,no_defs,proj,units +REG epsg:4952 longlat geocent ellps,no_defs,proj,units +REG epsg:4954 longlat geocent ellps,no_defs,proj,units +REG epsg:4956 longlat geocent ellps,no_defs,proj,units +REG epsg:4958 longlat geocent ellps,no_defs,proj,units +REG epsg:4960 longlat geocent ellps,no_defs,proj,units +REG epsg:4962 longlat geocent ellps,no_defs,proj,units +REG epsg:4964 longlat geocent ellps,no_defs,proj,units +REG epsg:4966 longlat geocent ellps,no_defs,proj,units +REG epsg:4968 longlat geocent ellps,no_defs,proj,units +REG epsg:4970 longlat geocent ellps,no_defs,proj,units +REG epsg:4972 longlat geocent ellps,no_defs,proj,units +REG epsg:4974 longlat geocent ellps,no_defs,proj,units +REG epsg:4976 longlat geocent ellps,no_defs,proj,units +REG epsg:4978 longlat geocent datum,no_defs,proj,units +REG epsg:4980 longlat geocent ellps,no_defs,proj,units +REG epsg:4982 longlat geocent ellps,no_defs,proj,units +REG epsg:4984 longlat geocent ellps,no_defs,proj,units +REG epsg:4986 longlat geocent ellps,no_defs,proj,units +REG epsg:4988 longlat geocent ellps,no_defs,proj,units +REG epsg:4990 longlat geocent ellps,no_defs,proj,units +REG epsg:4992 longlat geocent ellps,no_defs,proj,units +REG epsg:4994 longlat geocent ellps,no_defs,proj,units +REG epsg:4996 longlat geocent ellps,no_defs,proj,units +REG epsg:4998 longlat geocent ellps,no_defs,proj,units +REG epsg:5011 longlat geocent ellps,no_defs,proj,units +REG epsg:5013 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5014 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5015 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5016 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5041 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5042 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5048 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5069 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5070 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5071 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5072 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5105 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5106 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5107 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5109 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5110 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5111 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5112 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5113 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5114 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5115 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5116 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5117 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5118 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5119 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5120 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5121 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5122 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5123 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5124 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5125 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5126 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5127 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5128 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5129 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5130 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5132 longlat longlat ellps,no_defs,proj +REG epsg:5167 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5168 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5169 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5172 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5173 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5175 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5176 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5178 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5179 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5180 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5181 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5182 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5183 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5184 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5185 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5186 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5187 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5188 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5221 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:5223 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5228 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5229 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG epsg:5233 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:5234 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5235 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5243 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5244 longlat geocent ellps,no_defs,proj,units +REG epsg:5246 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5247 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,towgs84,units,x_0,y_0 +REG epsg:5250 longlat geocent ellps,no_defs,proj,units +REG epsg:5252 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5253 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5254 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5255 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5256 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5257 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5258 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5259 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5262 longlat geocent ellps,no_defs,proj,units +REG epsg:5264 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5266 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5269 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5270 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5271 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5272 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5273 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5274 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5275 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5293 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5294 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5295 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5296 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5297 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5298 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5299 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5300 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5301 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5302 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5303 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5304 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5305 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5306 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5307 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5308 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5309 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5310 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5311 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5316 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5318 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5320 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5321 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5322 longlat geocent ellps,no_defs,proj,units +REG epsg:5324 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5325 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5329 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:5330 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:5331 longlat merc ellps,k,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG epsg:5332 longlat geocent ellps,no_defs,proj,units +REG epsg:5337 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5340 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5341 longlat geocent ellps,no_defs,proj,units +REG epsg:5343 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5344 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5345 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5346 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5347 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5348 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5349 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5352 longlat geocent ellps,no_defs,proj,units +REG epsg:5354 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5356 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5357 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5358 longlat geocent ellps,no_defs,proj,units +REG epsg:5360 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5361 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5362 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5363 longlat geocent ellps,no_defs,proj,units +REG epsg:5365 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5367 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5368 longlat geocent ellps,no_defs,proj,units +REG epsg:5369 longlat geocent ellps,no_defs,proj,units +REG epsg:5371 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5373 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5379 longlat geocent ellps,no_defs,proj,units +REG epsg:5381 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5382 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5383 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5387 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5388 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5389 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5391 longlat geocent ellps,no_defs,proj,units +REG epsg:5393 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5396 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5451 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5456 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5457 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5458 longlat lcc datum,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5459 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5460 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5461 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5462 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5463 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5464 longlat longlat a,b,no_defs,proj +REG epsg:5466 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5467 longlat longlat ellps,no_defs,proj +REG epsg:5469 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5472 longlat poly ellps,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:5479 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5480 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5481 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5482 longlat stere ellps,k,lat_0,lat_ts,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5487 longlat geocent ellps,no_defs,proj,units +REG epsg:5489 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5490 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5498 longlat longlat datum,geoidgrids,no_defs,proj,vunits +REG epsg:5499 longlat longlat ellps,geoidgrids,no_defs,proj,towgs84,vunits +REG epsg:5500 longlat longlat ellps,geoidgrids,no_defs,proj,towgs84,vunits +REG epsg:5513 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5514 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5518 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5519 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5520 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5523 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5524 longlat longlat ellps,no_defs,proj +REG epsg:5527 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5530 longlat poly ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5531 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5532 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5533 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5534 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5535 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5536 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:5537 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:5538 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:5539 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:5544 longlat geocent ellps,no_defs,proj,units +REG epsg:5546 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5550 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5551 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5552 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5554 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5555 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5556 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5558 longlat geocent ellps,no_defs,proj,units +REG epsg:5559 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5561 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5562 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5563 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5564 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5565 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5566 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5567 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5568 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5569 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5570 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5571 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5572 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5573 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5574 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5575 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5576 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5577 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5578 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5579 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5580 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5581 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5582 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5583 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5588 longlat sterea datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5589 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG epsg:5591 longlat geocent ellps,no_defs,proj,units +REG epsg:5593 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:5596 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5598 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5623 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5624 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5625 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5627 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5628 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:5629 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5631 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5632 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5633 longlat laea ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5634 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5635 longlat laea ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5636 longlat laea ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5637 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5638 longlat laea ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5639 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5641 longlat merc ellps,lat_ts,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5643 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5644 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5646 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5649 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5650 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5651 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5652 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5653 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5654 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5655 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5659 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5663 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5664 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5665 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5666 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5667 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5668 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5669 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5670 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5671 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5672 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5673 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5674 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5675 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5676 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5677 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5678 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5679 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5680 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5681 longlat longlat ellps,no_defs,proj +REG epsg:5682 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5683 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5684 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5685 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5698 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5699 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5700 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5707 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5708 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5828 longlat geocent ellps,no_defs,proj,units +REG epsg:5832 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:5833 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:5834 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:5835 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:5836 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5837 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:5839 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5842 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5844 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5845 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5846 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5847 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5848 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5849 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5850 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5851 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5852 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5853 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5854 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5855 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5856 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5857 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5858 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5875 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5876 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5877 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5879 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:5880 longlat poly ellps,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:5884 longlat geocent ellps,no_defs,proj,units +REG epsg:5886 longlat longlat ellps,no_defs,proj +REG epsg:5887 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5890 longlat stere a,b,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5921 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5922 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5923 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5924 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5925 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5926 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5927 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5928 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5929 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5930 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5931 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5932 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5933 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5934 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5935 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5936 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5937 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5938 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5939 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5940 longlat stere datum,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:5942 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:5945 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5946 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5947 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5948 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5949 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5950 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5951 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5952 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5953 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5954 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5955 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5956 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5957 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5958 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5959 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5960 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5961 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5962 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5963 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5964 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5965 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5966 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5967 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5968 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5969 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5970 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:5971 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5972 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5973 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5974 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5975 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:5976 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6050 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6051 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6052 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6053 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6054 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6055 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6056 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6057 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6058 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6059 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6060 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6061 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6062 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6063 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6064 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6065 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6066 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6067 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6068 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6069 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6070 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6071 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6072 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6073 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6074 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6075 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6076 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6077 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6078 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6079 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6080 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6081 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6082 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6083 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6084 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6085 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6086 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6087 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6088 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6089 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6090 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6091 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6092 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6093 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6094 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6095 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6096 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6097 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6098 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6099 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6100 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6101 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6102 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6103 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6104 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6105 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6106 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6107 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6108 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6109 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6110 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6111 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6112 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6113 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6114 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6115 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6116 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6117 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6118 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6119 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6120 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6121 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6122 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6123 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6124 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6125 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6128 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6129 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6133 longlat geocent ellps,no_defs,proj,units +REG epsg:6135 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6141 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6144 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:6145 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6146 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6147 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6148 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6149 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6150 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6151 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6152 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6153 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6154 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6155 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6156 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6157 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6158 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6159 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6160 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6161 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6162 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6163 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6166 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6167 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6168 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6169 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6171 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6172 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6173 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6174 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6175 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6176 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6190 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:6204 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6207 longlat longlat a,b,no_defs,proj,towgs84 +REG epsg:6210 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6211 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6307 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6309 longlat geocent ellps,no_defs,proj,units +REG epsg:6311 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6312 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6316 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6317 longlat geocent ellps,no_defs,proj,units +REG epsg:6318 longlat longlat ellps,no_defs,proj +REG epsg:6320 longlat geocent ellps,no_defs,proj,units +REG epsg:6322 longlat longlat ellps,no_defs,proj +REG epsg:6323 longlat geocent ellps,no_defs,proj,units +REG epsg:6325 longlat longlat ellps,no_defs,proj +REG epsg:6328 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6329 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6330 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6331 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6332 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6333 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6334 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6335 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6336 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6337 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6338 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6339 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6340 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6341 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6342 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6343 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6344 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6345 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6346 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6347 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6348 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6349 longlat longlat ellps,geoidgrids,no_defs,proj,vunits +REG epsg:6350 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6351 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6352 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6353 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6354 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6355 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6356 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6362 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6363 longlat geocent ellps,no_defs,proj,units +REG epsg:6365 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6366 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6367 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6368 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6369 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6370 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6371 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6372 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6381 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6382 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6383 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6384 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6385 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6386 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6387 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6391 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6393 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6394 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6395 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6396 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6397 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6398 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6399 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6400 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6401 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6402 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6403 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6404 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6405 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6406 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6407 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6408 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6409 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6410 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6411 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6412 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6413 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6414 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6415 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6416 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6417 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6418 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6419 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6420 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6421 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6422 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6423 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6424 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6425 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6426 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6427 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6428 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6429 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6430 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6431 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6432 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6433 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6434 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6435 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6436 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6437 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6438 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6439 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6440 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6441 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6442 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6443 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6444 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6445 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6446 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6447 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6448 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6449 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6450 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6451 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6452 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6453 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6454 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6455 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6456 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6457 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6458 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6459 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6460 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6461 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6462 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6463 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6464 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6465 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6466 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6467 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6468 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6469 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6470 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6471 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6472 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6473 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6474 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6475 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6476 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6477 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6478 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6479 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6484 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6485 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6486 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6487 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6488 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6489 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6490 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6491 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6492 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6493 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6494 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6495 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6496 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6497 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6498 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6499 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6500 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6501 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6502 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6503 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6504 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6505 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6506 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6507 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6508 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6509 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6510 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6511 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6512 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6513 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6514 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6515 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6516 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6517 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6518 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6519 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6520 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6521 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6522 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6523 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6524 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6525 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6526 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6527 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6528 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6529 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6530 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6531 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6532 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6533 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6534 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6535 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6536 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6537 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6538 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6539 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6540 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6541 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6542 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6543 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6544 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6545 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6546 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6547 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6548 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6549 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6550 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6551 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6552 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6553 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6554 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6555 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6556 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6557 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6558 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6559 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6560 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6561 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6562 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6563 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6564 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6565 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6566 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6567 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6568 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6569 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6570 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6571 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6572 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6573 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6574 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6575 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6576 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6577 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6578 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6579 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6580 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6581 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6582 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6583 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6584 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6585 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6586 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6587 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6588 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6589 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6590 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6591 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6592 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6593 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6594 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6595 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6596 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6597 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6598 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6599 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6600 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6601 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6602 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6603 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6604 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6605 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6606 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6607 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6608 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6609 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6610 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6611 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6612 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6613 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6614 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6615 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6616 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6617 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6618 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6619 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6620 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6621 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6622 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6623 longlat aea datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6624 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6625 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6626 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6627 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6628 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6629 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6630 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6631 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6632 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6633 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6634 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6635 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6636 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:6637 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6646 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6649 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:6650 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6651 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6652 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6653 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6654 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6655 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6656 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6657 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6658 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6659 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6660 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6661 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6662 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6663 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6664 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6665 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:6666 longlat geocent ellps,no_defs,proj,units +REG epsg:6668 longlat longlat ellps,no_defs,proj +REG epsg:6669 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6670 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6671 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6672 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6673 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6674 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6675 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6676 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6677 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6678 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6679 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6680 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6681 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6682 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6683 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6684 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6685 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6686 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6687 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6688 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6689 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6690 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6691 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6692 longlat utm ellps,no_defs,proj,units,zone +REG epsg:6696 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:6697 longlat longlat ellps,no_defs,proj,vunits +REG epsg:6700 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:6703 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6704 longlat geocent ellps,no_defs,proj,units +REG epsg:6706 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6707 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6708 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6709 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6720 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6721 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6722 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6723 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6732 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6733 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6734 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6735 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6736 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6737 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6738 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:6781 longlat geocent ellps,no_defs,proj,units +REG epsg:6783 longlat longlat ellps,no_defs,proj +REG epsg:6784 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6785 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6786 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6787 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6788 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6789 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6792 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6793 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6794 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6795 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6796 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6797 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6798 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6799 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6800 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6801 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6802 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6803 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6804 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6805 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6806 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6807 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6808 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6809 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6810 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6811 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6812 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6813 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6814 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6815 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6816 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6817 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6818 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6819 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6820 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6821 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6822 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6823 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6824 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6826 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6827 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6828 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6829 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6830 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6831 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6832 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6833 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6834 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6835 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6836 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6837 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6838 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6839 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6840 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6841 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6842 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6843 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,no_uoff,proj,units,x_0,y_0 +REG epsg:6844 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6845 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6846 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6847 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6848 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6849 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6850 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6851 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6852 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6853 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6854 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6855 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6856 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6857 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6858 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6859 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6860 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6861 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6862 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6863 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6867 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6868 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6870 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6871 longlat merc datum,geoidgrids,k,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:6875 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6876 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6879 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6880 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6881 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6882 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6883 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6884 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6885 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6886 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6887 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6892 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6893 longlat merc datum,geoidgrids,k,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:6894 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:6915 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:6917 longlat longlat ellps,no_defs,proj,vunits +REG epsg:6922 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6923 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6924 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6925 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6927 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:6931 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6932 longlat laea datum,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6933 longlat cea datum,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6934 longlat geocent ellps,no_defs,proj,units +REG epsg:6956 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6957 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6958 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6959 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6962 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:6978 longlat geocent ellps,no_defs,proj,units +REG epsg:6980 longlat longlat ellps,no_defs,proj +REG epsg:6981 longlat geocent ellps,no_defs,proj,units +REG epsg:6983 longlat longlat ellps,no_defs,proj +REG epsg:6984 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6985 longlat geocent ellps,no_defs,proj,units +REG epsg:6987 longlat longlat ellps,no_defs,proj +REG epsg:6988 longlat geocent ellps,no_defs,proj,units +REG epsg:6990 longlat longlat ellps,no_defs,proj +REG epsg:6991 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6996 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:6997 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7005 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7006 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7007 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7035 longlat longlat ellps,no_defs,proj +REG epsg:7037 longlat longlat ellps,no_defs,proj +REG epsg:7039 longlat longlat ellps,no_defs,proj +REG epsg:7041 longlat longlat ellps,no_defs,proj +REG epsg:7057 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7058 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7059 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7060 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7061 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7062 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7063 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7064 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7065 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7066 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7067 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7068 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7069 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7070 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7071 longlat geocent ellps,no_defs,proj,units +REG epsg:7073 longlat longlat ellps,no_defs,proj +REG epsg:7074 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7075 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7076 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7077 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7078 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7079 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7080 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7081 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7084 longlat longlat ellps,no_defs,proj +REG epsg:7086 longlat longlat ellps,no_defs,proj +REG epsg:7088 longlat longlat ellps,no_defs,proj +REG epsg:7109 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7110 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7111 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7112 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7113 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7114 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7115 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7116 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7117 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7118 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7119 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7120 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7121 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7122 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7123 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7124 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7125 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7126 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7127 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7128 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7131 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7132 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7133 longlat longlat ellps,no_defs,proj +REG epsg:7134 longlat geocent ellps,no_defs,proj,units +REG epsg:7136 longlat longlat ellps,no_defs,proj +REG epsg:7137 longlat geocent ellps,no_defs,proj,units +REG epsg:7139 longlat longlat ellps,no_defs,proj +REG epsg:7142 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7257 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7258 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7259 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7260 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7261 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7262 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7263 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7264 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7265 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7266 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7267 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7268 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7269 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7270 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7271 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7272 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7273 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7274 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7275 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7276 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7277 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7278 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7279 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7280 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7281 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7282 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7283 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7284 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7285 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7286 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7287 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7288 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7289 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7290 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7291 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7293 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7294 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7295 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7296 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7297 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7298 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7299 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7300 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7301 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7302 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7303 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7304 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7305 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7306 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7307 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7308 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7309 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7310 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7311 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7312 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7313 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7314 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7315 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7316 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7317 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7318 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7319 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7320 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7321 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7322 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7323 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7324 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7325 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7326 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7327 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7328 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7329 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7330 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7331 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7332 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7333 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7334 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7335 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7336 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7337 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7338 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7339 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7340 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7341 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7342 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7343 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7344 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7345 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7346 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7347 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7348 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7349 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7350 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7351 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7352 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7353 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7354 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7355 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7356 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7357 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7358 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7359 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7360 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7361 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7362 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7363 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7364 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7365 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7366 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7367 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7368 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7369 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7370 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7371 longlat geocent ellps,no_defs,proj,units +REG epsg:7373 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:7374 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7375 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7376 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7400 longlat longlat a,b,no_defs,pm,proj,towgs84,vunits +REG epsg:7401 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7402 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7403 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7404 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:7405 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:7406 longlat longlat datum,no_defs,proj,vunits +REG epsg:7407 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,vunits,x_0,y_0 +REG epsg:7408 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:7409 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:7410 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:7411 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7412 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7413 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7414 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:7415 longlat sterea ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7416 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:7417 longlat utm ellps,no_defs,proj,towgs84,units,vunits,zone +REG epsg:7418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7421 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7422 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,vunits,x_0,y_0 +REG epsg:7423 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:7528 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7529 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7530 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7531 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7532 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7533 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7534 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7535 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7536 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7537 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7538 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7539 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7540 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7541 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7542 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7543 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7544 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7545 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7546 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7547 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7548 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7549 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7550 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7551 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7552 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7553 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7554 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7555 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7556 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7557 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7558 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7559 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7560 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7561 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7562 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7563 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7564 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7565 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7566 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7567 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7568 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7569 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7570 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7571 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7572 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7573 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7574 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7575 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7576 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7577 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7578 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7579 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7580 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7581 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7582 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7583 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7584 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7585 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7586 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7587 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7588 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7589 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7590 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7591 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7592 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7593 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7594 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7595 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7596 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7597 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7598 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7599 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7600 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7601 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7602 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7603 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7604 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7605 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7606 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7607 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7608 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7609 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7610 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7611 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7612 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7613 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7614 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7615 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7616 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7617 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7618 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7619 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7620 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7621 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7622 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7623 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7624 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7625 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7626 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7627 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7628 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7629 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7630 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7631 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7632 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7633 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7634 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7635 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7636 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7637 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7638 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7639 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7640 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7641 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7642 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7643 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7644 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7645 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7656 longlat geocent ellps,no_defs,proj,units +REG epsg:7658 longlat geocent ellps,no_defs,proj,units +REG epsg:7660 longlat geocent ellps,no_defs,proj,units +REG epsg:7662 longlat geocent ellps,no_defs,proj,units +REG epsg:7664 longlat geocent ellps,no_defs,proj,units +REG epsg:7677 longlat geocent a,b,no_defs,proj,units +REG epsg:7679 longlat geocent a,b,no_defs,proj,units +REG epsg:7681 longlat geocent a,b,no_defs,proj,units +REG epsg:7683 longlat longlat a,b,no_defs,proj +REG epsg:7684 longlat geocent ellps,no_defs,proj,units +REG epsg:7686 longlat longlat ellps,no_defs,proj +REG epsg:7692 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7693 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7694 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7695 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7696 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7755 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7756 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7757 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7758 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7759 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7760 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7761 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7762 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7763 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7764 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7765 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7766 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7767 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7768 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7769 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7770 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7771 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7772 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7773 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7774 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7775 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7776 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7777 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7778 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7779 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7780 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7781 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7782 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7783 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7784 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7785 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7786 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7787 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7789 longlat geocent ellps,no_defs,proj,units +REG epsg:7791 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7792 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7793 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG epsg:7794 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7795 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7796 longlat geocent ellps,no_defs,proj,units +REG epsg:7798 longlat longlat ellps,no_defs,proj +REG epsg:7799 longlat utm ellps,no_defs,proj,units,zone +REG epsg:7800 longlat utm ellps,no_defs,proj,units,zone +REG epsg:7801 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7803 longlat utm ellps,no_defs,proj,units,zone +REG epsg:7804 longlat utm ellps,no_defs,proj,units,zone +REG epsg:7805 longlat utm ellps,no_defs,proj,units,zone +REG epsg:7815 longlat geocent ellps,no_defs,proj,units +REG epsg:7825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7826 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7827 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7828 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7829 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7830 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7831 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7842 longlat geocent ellps,no_defs,proj,units +REG epsg:7844 longlat longlat ellps,no_defs,proj +REG epsg:7845 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7846 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7847 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7848 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7849 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7850 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7851 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7852 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7853 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7854 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7855 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7856 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7857 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7858 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7859 longlat utm ellps,no_defs,proj,south,units,zone +REG epsg:7877 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7878 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:7879 longlat geocent ellps,no_defs,proj,units +REG epsg:7881 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:7882 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:7883 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:7884 longlat geocent ellps,no_defs,proj,units +REG epsg:7886 longlat longlat ellps,no_defs,proj,towgs84 +REG epsg:7887 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:7899 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7914 longlat geocent ellps,no_defs,proj,units +REG epsg:7916 longlat geocent ellps,no_defs,proj,units +REG epsg:7918 longlat geocent ellps,no_defs,proj,units +REG epsg:7920 longlat geocent ellps,no_defs,proj,units +REG epsg:7922 longlat geocent ellps,no_defs,proj,units +REG epsg:7924 longlat geocent ellps,no_defs,proj,units +REG epsg:7926 longlat geocent ellps,no_defs,proj,units +REG epsg:7928 longlat geocent ellps,no_defs,proj,units +REG epsg:7930 longlat geocent ellps,no_defs,proj,units +REG epsg:7954 longlat utm ellps,no_defs,proj,south,towgs84,units,vunits,zone +REG epsg:7955 longlat utm ellps,no_defs,proj,south,towgs84,units,vunits,zone +REG epsg:7956 longlat utm ellps,no_defs,proj,south,towgs84,units,vunits,zone +REG epsg:7991 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:7992 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG epsg:8013 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8014 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8015 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8016 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8017 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8019 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8020 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8021 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8023 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8024 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8027 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8028 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8029 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8030 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8031 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8032 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8035 longlat utm datum,no_defs,proj,units,zone +REG epsg:8036 longlat utm datum,no_defs,proj,units,zone +REG epsg:8042 longlat longlat a,b,no_defs,pm,proj +REG epsg:8043 longlat longlat a,b,no_defs,pm,proj +REG epsg:8044 longlat cass a,b,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG epsg:8045 longlat cass a,b,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG epsg:8058 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8059 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8065 longlat omerc alpha,ellps,gamma,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG epsg:8066 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8067 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8068 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8082 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8083 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8084 longlat geocent ellps,no_defs,proj,units +REG epsg:8086 longlat longlat ellps,no_defs,proj +REG epsg:8088 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8090 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8092 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8093 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8095 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8096 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8097 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8098 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8099 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8100 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8101 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8102 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8103 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8104 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8105 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8106 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8107 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8108 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8109 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8110 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8111 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8112 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8113 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8114 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8115 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8116 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8117 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8118 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8119 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8120 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8121 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8122 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8123 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8124 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8125 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8126 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8127 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8128 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8129 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8130 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8131 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8132 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8133 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8134 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8135 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8136 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8137 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8138 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8139 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8140 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8141 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8142 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8143 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8144 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8145 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8146 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8147 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8148 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8149 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8150 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8151 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8152 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8153 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8154 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8155 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8156 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8157 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8158 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8159 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8160 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8161 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8162 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8163 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8166 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8167 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8168 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8169 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8170 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8172 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8173 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8179 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8180 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8181 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8182 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8184 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8185 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8187 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8189 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8191 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8193 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8196 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8197 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8198 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8200 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8201 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8202 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8203 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8204 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8205 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8206 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8207 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8208 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8209 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8210 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8212 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8213 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8214 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8216 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8218 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8220 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8222 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8224 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8225 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8226 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG epsg:8227 longlat geocent ellps,no_defs,proj,units +REG epsg:8230 longlat geocent ellps,no_defs,proj,units +REG epsg:8232 longlat longlat ellps,no_defs,proj +REG epsg:8233 longlat geocent ellps,no_defs,proj,units +REG epsg:8237 longlat longlat ellps,no_defs,proj +REG epsg:8238 longlat geocent ellps,no_defs,proj,units +REG epsg:8240 longlat longlat ellps,no_defs,proj +REG epsg:8242 longlat geocent ellps,no_defs,proj,units +REG epsg:8246 longlat longlat ellps,no_defs,proj +REG epsg:8247 longlat geocent ellps,no_defs,proj,units +REG epsg:8249 longlat longlat ellps,no_defs,proj +REG epsg:8250 longlat geocent ellps,no_defs,proj,units +REG epsg:8252 longlat longlat ellps,no_defs,proj +REG epsg:8253 longlat geocent ellps,no_defs,proj,units +REG epsg:8255 longlat longlat ellps,no_defs,proj +REG epsg:8311 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8312 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8313 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8314 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8315 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8316 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8317 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8318 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8319 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8320 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8321 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8322 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8323 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8324 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8325 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8326 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8327 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8328 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8329 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8330 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8331 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8332 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8333 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8334 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8335 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8336 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8337 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8338 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8339 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8340 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8341 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8342 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8343 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8344 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8345 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8346 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8347 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8348 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG epsg:8349 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:8350 longlat longlat ellps,no_defs,proj,towgs84,vunits +REG epsg:9054 longlat longlat datum,no_defs,proj +REG esri:102001 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102002 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102003 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102004 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102005 longlat eqdc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102006 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102007 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102008 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102009 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102010 longlat eqdc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102011 longlat sinu datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102012 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102013 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102014 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102015 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102016 longlat aeqd datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102017 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102018 longlat stere datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102019 longlat aeqd datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102020 longlat laea datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102021 longlat stere datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102022 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102023 longlat eqdc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102024 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102025 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102026 longlat eqdc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102027 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102028 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102029 longlat eqdc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102030 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102031 longlat eqdc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102032 longlat eqdc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102033 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102065 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102066 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:102067 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102101 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102102 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102103 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102104 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102105 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102106 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102107 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102108 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102110 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102114 longlat utm ellps,no_defs,proj,units,zone +REG esri:102115 longlat utm ellps,no_defs,proj,units,zone +REG esri:102120 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +REG esri:102121 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +REG esri:102122 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG esri:102123 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG esri:102132 longlat utm a,b,no_defs,proj,units,zone +REG esri:102133 longlat utm a,b,no_defs,proj,units,zone +REG esri:102134 longlat utm a,b,no_defs,proj,units,zone +REG esri:102135 longlat utm a,b,no_defs,proj,units,zone +REG esri:102140 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102141 longlat utm ellps,no_defs,proj,units,zone +REG esri:102142 longlat utm ellps,no_defs,proj,units,zone +REG esri:102151 longlat utm ellps,no_defs,proj,units,zone +REG esri:102152 longlat utm ellps,no_defs,proj,units,zone +REG esri:102153 longlat utm ellps,no_defs,proj,units,zone +REG esri:102154 longlat utm ellps,no_defs,proj,units,zone +REG esri:102155 longlat utm ellps,no_defs,proj,units,zone +REG esri:102156 longlat utm ellps,no_defs,proj,units,zone +REG esri:102160 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102161 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102162 longlat utm ellps,no_defs,proj,units,zone +REG esri:102163 longlat ellps,no_defs,units +REG esri:102164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102166 longlat utm ellps,no_defs,proj,units,zone +REG esri:102167 longlat utm ellps,no_defs,proj,units,zone +REG esri:102168 longlat utm ellps,no_defs,proj,units,zone +REG esri:102169 longlat utm ellps,no_defs,proj,units,zone +REG esri:102191 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102192 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102193 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102229 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102230 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102241 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102242 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102243 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102244 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102245 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102246 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102248 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102249 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102250 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102251 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102252 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102253 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102254 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102255 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102256 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102257 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102258 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102259 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102260 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102261 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102262 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102263 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102264 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102265 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102266 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102267 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102268 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102269 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102270 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102271 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102272 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102273 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102274 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102277 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102278 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102279 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102280 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102281 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102282 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102283 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102284 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102285 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102286 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102287 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102288 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102289 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102290 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102291 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102292 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102293 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102294 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102295 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102296 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102297 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102298 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102300 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102304 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102307 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102308 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102309 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102310 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102311 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102312 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102313 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102314 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102315 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102316 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102317 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102318 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102320 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102321 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102322 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102323 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102324 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102325 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102326 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102327 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102330 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102334 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102335 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102336 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102337 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102338 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102339 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102340 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102341 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102342 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102343 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102344 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102345 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102346 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102347 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102348 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102349 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102350 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102351 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102352 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102353 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102354 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102355 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102356 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102357 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102358 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102361 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102491 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102492 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102581 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102582 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102583 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102584 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102591 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102592 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:102629 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102630 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102631 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +REG esri:102632 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102633 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102634 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102635 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102636 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102637 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102638 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102639 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102640 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102641 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102642 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102643 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102644 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102645 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102646 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102648 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102649 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102650 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102651 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102652 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102653 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102654 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102655 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102656 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102657 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102658 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102659 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102660 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102661 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102662 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102663 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102664 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102665 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102666 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102667 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102668 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102669 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102670 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102671 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102672 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102673 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102674 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102675 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102676 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102677 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102678 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102679 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102680 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102681 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102682 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102683 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102684 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102685 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102686 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102687 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102688 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102689 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102690 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102691 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102692 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102693 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102694 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102695 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102696 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102697 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102698 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102700 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102704 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102707 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102708 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102709 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102710 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102711 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102712 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102713 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102714 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102715 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102716 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102717 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102718 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102719 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102720 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102721 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102722 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102723 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102724 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102725 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102726 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102727 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102728 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102729 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102730 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102733 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102734 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102735 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102736 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102737 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102738 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102739 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102740 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102741 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102742 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102743 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102744 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102745 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102746 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102747 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102748 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102749 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102750 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102751 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102752 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102753 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102754 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102755 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102756 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102757 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102758 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102761 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:102766 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:103300 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:104000 longlat longlat datum,ellps,no_defs,proj +REG esri:104101 longlat longlat ellps,no_defs,proj +REG esri:104102 longlat longlat ellps,no_defs,proj +REG esri:104103 longlat longlat ellps,no_defs,proj +REG esri:104104 longlat longlat ellps,no_defs,proj +REG esri:104105 longlat longlat ellps,no_defs,proj +REG esri:104106 longlat longlat ellps,no_defs,proj +REG esri:104107 longlat longlat ellps,no_defs,proj +REG esri:104108 longlat longlat ellps,no_defs,proj +REG esri:104261 longlat longlat a,b,no_defs,proj +REG esri:104304 longlat longlat a,b,no_defs,proj +REG esri:104305 longlat longlat ellps,no_defs,proj +REG esri:2000 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20002 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20003 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20004 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20005 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20007 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20008 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2001 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:20010 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20011 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20013 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20014 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20015 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20016 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20017 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20019 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2002 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:20020 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20021 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20023 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20024 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20027 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20028 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20029 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2003 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:20030 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20031 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20032 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2004 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2005 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2006 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:20062 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20063 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20064 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20065 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20066 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20067 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20068 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20069 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2007 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20070 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20071 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20072 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20073 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20074 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20075 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20076 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20077 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20078 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20079 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2008 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20080 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20081 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20082 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20083 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20084 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20085 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20086 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20087 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20088 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20089 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2009 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20090 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2010 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2011 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2012 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2013 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20137 longlat utm ellps,no_defs,proj,units,zone +REG esri:20138 longlat utm ellps,no_defs,proj,units,zone +REG esri:2014 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2015 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2016 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2017 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2018 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2019 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2020 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2021 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2022 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2023 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2024 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20248 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20249 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2025 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20250 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20251 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20252 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20253 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20254 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20255 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20256 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20257 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20258 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2026 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2027 longlat utm ellps,no_defs,proj,units,zone +REG esri:2028 longlat utm ellps,no_defs,proj,units,zone +REG esri:2029 longlat utm ellps,no_defs,proj,units,zone +REG esri:2030 longlat utm ellps,no_defs,proj,units,zone +REG esri:2031 longlat utm ellps,no_defs,proj,units,zone +REG esri:2032 longlat utm ellps,no_defs,proj,units,zone +REG esri:2033 longlat utm ellps,no_defs,proj,units,zone +REG esri:2034 longlat utm ellps,no_defs,proj,units,zone +REG esri:20348 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20349 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2035 longlat utm ellps,no_defs,proj,units,zone +REG esri:20350 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20351 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20352 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20353 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20354 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20355 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20356 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20357 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20358 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2036 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2037 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2038 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2039 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2040 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2041 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2042 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2043 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:20437 longlat utm ellps,no_defs,proj,units,zone +REG esri:20438 longlat utm ellps,no_defs,proj,units,zone +REG esri:20439 longlat utm ellps,no_defs,proj,units,zone +REG esri:2044 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2045 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:20499 longlat utm ellps,no_defs,proj,units,zone +REG esri:20538 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:20539 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2056 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2057 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2058 longlat utm ellps,no_defs,proj,units,zone +REG esri:2059 longlat utm ellps,no_defs,proj,units,zone +REG esri:2060 longlat utm ellps,no_defs,proj,units,zone +REG esri:2061 longlat utm ellps,no_defs,proj,units,zone +REG esri:2062 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2063 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2064 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2065 longlat krovak alpha,ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2066 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2067 longlat utm ellps,no_defs,proj,units,zone +REG esri:2068 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2069 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2070 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2071 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2072 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2073 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2074 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2075 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2076 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2077 longlat utm ellps,no_defs,proj,units,zone +REG esri:2078 longlat utm ellps,no_defs,proj,units,zone +REG esri:2079 longlat utm ellps,no_defs,proj,units,zone +REG esri:20790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:20791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2080 longlat utm ellps,no_defs,proj,units,zone +REG esri:2081 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2082 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:20822 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20823 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:20824 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2083 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2084 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2085 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2086 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2087 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2088 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2089 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2090 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2093 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:20934 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:20935 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:20936 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:2094 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2095 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2096 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2097 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2098 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2099 longlat cass ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2100 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2101 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2102 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2103 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21035 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:21036 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:21037 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2104 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2105 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2106 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2107 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2108 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2109 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21095 longlat utm ellps,no_defs,proj,units,zone +REG esri:21096 longlat utm ellps,no_defs,proj,units,zone +REG esri:21097 longlat utm ellps,no_defs,proj,units,zone +REG esri:2110 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21100 longlat merc ellps,k,lat_ts,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2111 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2112 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2113 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2114 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21148 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:21149 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2115 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21150 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2116 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2117 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2118 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2119 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2120 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2121 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2122 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2123 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2124 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2125 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2126 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2127 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2128 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2129 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21291 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2130 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2131 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2132 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2133 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2134 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2135 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2136 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2137 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2138 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2139 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2140 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2141 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21413 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21415 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21416 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2142 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21421 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21422 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21423 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2143 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2144 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2145 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21453 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21454 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21455 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21456 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21457 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21458 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21459 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2146 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21460 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21461 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2147 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:21473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21477 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2148 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:21480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2149 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2150 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:21500 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2151 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2152 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2153 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2154 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2155 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2156 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2157 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2158 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2159 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2160 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2161 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2162 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2163 longlat laea a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2166 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2167 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2168 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2169 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2171 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2172 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2173 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2174 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2175 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2176 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2178 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21780 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,pm,proj,units,x_0,y_0 +REG esri:21781 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG esri:2179 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2180 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21817 longlat utm ellps,no_defs,proj,units,zone +REG esri:21818 longlat utm ellps,no_defs,proj,units,zone +REG esri:2188 longlat utm ellps,no_defs,proj,units,zone +REG esri:2189 longlat utm ellps,no_defs,proj,units,zone +REG esri:21891 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21892 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21893 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:21894 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2190 longlat utm ellps,no_defs,proj,units,zone +REG esri:2191 longlat utm ellps,no_defs,proj,units,zone +REG esri:2192 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2194 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2195 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2196 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2197 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2198 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2199 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2200 longlat stere a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2201 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2202 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2203 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:22032 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:22033 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2204 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2205 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2206 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2207 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2208 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2209 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22091 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22092 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2210 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2211 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2212 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2213 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2214 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2215 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2216 longlat utm ellps,no_defs,proj,units,zone +REG esri:2217 longlat utm ellps,no_defs,proj,units,zone +REG esri:2219 longlat utm a,b,no_defs,proj,units,zone +REG esri:22191 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22192 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22193 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22194 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22195 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22196 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22197 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2220 longlat utm a,b,no_defs,proj,units,zone +REG esri:2222 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2223 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22234 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:22235 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:22236 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:2224 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2225 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2226 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2227 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2228 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2229 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2230 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2231 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2232 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2233 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22332 longlat utm a,b,no_defs,proj,units,zone +REG esri:2234 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2235 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2236 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2237 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2238 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2239 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22391 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22392 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2240 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2241 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2242 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2243 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2244 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2245 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2246 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2247 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2248 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2249 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2250 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2251 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2252 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22523 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:22524 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2253 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2254 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2255 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2256 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2257 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2258 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2259 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2260 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2261 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2262 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2263 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2264 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2265 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2266 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2267 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2268 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2269 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2270 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22700 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2271 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2272 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2273 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2274 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2275 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2276 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2277 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22770 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2278 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22780 longlat stere a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2279 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2280 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2281 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2282 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2283 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:22832 longlat utm a,b,no_defs,proj,units,zone +REG esri:2284 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2285 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2286 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2287 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2288 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2289 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2290 longlat stere a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2291 longlat stere a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2292 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2294 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2295 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22991 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22992 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22993 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:22994 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23028 longlat utm ellps,no_defs,proj,units,zone +REG esri:23029 longlat utm ellps,no_defs,proj,units,zone +REG esri:23030 longlat utm ellps,no_defs,proj,units,zone +REG esri:23031 longlat utm ellps,no_defs,proj,units,zone +REG esri:23032 longlat utm ellps,no_defs,proj,units,zone +REG esri:23033 longlat utm ellps,no_defs,proj,units,zone +REG esri:23034 longlat utm ellps,no_defs,proj,units,zone +REG esri:23035 longlat utm ellps,no_defs,proj,units,zone +REG esri:23036 longlat utm ellps,no_defs,proj,units,zone +REG esri:23037 longlat utm ellps,no_defs,proj,units,zone +REG esri:23038 longlat utm ellps,no_defs,proj,units,zone +REG esri:2308 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2309 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23090 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23095 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2310 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2311 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2312 longlat utm ellps,no_defs,proj,units,zone +REG esri:2313 longlat utm ellps,no_defs,proj,units,zone +REG esri:2314 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2315 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2316 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2317 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2318 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2319 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2320 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2321 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2322 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2323 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23239 longlat utm ellps,no_defs,proj,units,zone +REG esri:2324 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23240 longlat utm ellps,no_defs,proj,units,zone +REG esri:2325 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2326 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2327 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2328 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2329 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2330 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2331 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2332 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2333 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2334 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2335 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2336 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2337 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2338 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2339 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2340 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2341 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2342 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2343 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23433 longlat utm a,b,no_defs,proj,units,zone +REG esri:2344 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2345 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2346 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2347 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2348 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2349 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2350 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2351 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2352 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2353 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2354 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2355 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2356 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2357 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2358 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2359 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2360 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2361 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2362 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2363 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2364 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2365 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2366 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2367 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2368 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2369 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2370 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23700 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG esri:2371 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2372 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2373 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2374 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2375 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2376 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2377 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2378 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2379 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2380 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2381 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2382 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2383 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2384 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23846 longlat utm a,b,no_defs,proj,units,zone +REG esri:23847 longlat utm a,b,no_defs,proj,units,zone +REG esri:23848 longlat utm a,b,no_defs,proj,units,zone +REG esri:23849 longlat utm a,b,no_defs,proj,units,zone +REG esri:2385 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23850 longlat utm a,b,no_defs,proj,units,zone +REG esri:23851 longlat utm a,b,no_defs,proj,units,zone +REG esri:23852 longlat utm a,b,no_defs,proj,units,zone +REG esri:23853 longlat utm a,b,no_defs,proj,units,zone +REG esri:2386 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2387 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2388 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23886 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23887 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23888 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23889 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:2389 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:23890 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23891 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23892 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23893 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:23894 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:2390 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2391 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2393 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2394 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:23946 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:23947 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:23948 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2395 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2396 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2397 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2398 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2399 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2400 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2401 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2402 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2403 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2404 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24047 longlat utm a,b,no_defs,proj,units,zone +REG esri:24048 longlat utm a,b,no_defs,proj,units,zone +REG esri:2405 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2406 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2407 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2408 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2409 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2410 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24100 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2411 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2412 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2413 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2415 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2416 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24200 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2421 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2422 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2423 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2424 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2425 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2426 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2427 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2428 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2429 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2430 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24305 longlat utm a,b,no_defs,proj,units,zone +REG esri:24306 longlat utm a,b,no_defs,proj,units,zone +REG esri:2431 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24311 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24312 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24313 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2432 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2433 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2434 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24342 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24343 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24344 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24345 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24346 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24347 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2435 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2436 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2437 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24370 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:24371 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:24372 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:24373 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:24374 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:24375 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24376 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24377 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24378 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24379 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2438 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24380 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24381 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24382 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:24383 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2439 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2440 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2441 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2442 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2443 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2444 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2445 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2446 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2447 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2448 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2449 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2450 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24500 longlat cass a,b,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2451 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2452 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2453 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2454 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24547 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:24548 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:2455 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2456 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2457 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24571 longlat omerc a,alpha,b,k,lat_0,lonc,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2458 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2459 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2460 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:24600 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2461 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2464 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2465 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2466 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2467 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2469 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2470 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2471 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24718 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:24719 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2472 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24720 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:24721 longlat utm ellps,no_defs,proj,units,zone +REG esri:2473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2477 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24818 longlat utm ellps,no_defs,proj,units,zone +REG esri:24819 longlat utm ellps,no_defs,proj,units,zone +REG esri:2482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24820 longlat utm ellps,no_defs,proj,units,zone +REG esri:24821 longlat utm ellps,no_defs,proj,units,zone +REG esri:2483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2484 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2485 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2486 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2487 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24877 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:24878 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:24879 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2488 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24880 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:24882 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2489 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24891 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24892 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:24893 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2490 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2491 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2493 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2494 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2495 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2496 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2497 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2498 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2499 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2500 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25000 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2501 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2502 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2503 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2504 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2505 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2506 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2507 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2508 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2509 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2510 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2511 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2512 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2513 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2514 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2515 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2516 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2517 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2518 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2519 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2520 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2521 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2522 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2523 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25231 longlat utm a,b,no_defs,proj,units,zone +REG esri:2524 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2525 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2526 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2527 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2528 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2529 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2530 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2531 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2532 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2533 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2534 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2535 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2536 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2537 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2538 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2539 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25391 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25393 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25394 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25395 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2540 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2541 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2542 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2543 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2544 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2545 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2546 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2547 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2548 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2549 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2550 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2551 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2552 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2553 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2554 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2555 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2556 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2557 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2558 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2559 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2560 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2561 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2562 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2563 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2564 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2565 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2566 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2567 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2568 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2569 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2570 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25700 longlat merc ellps,k,lat_ts,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:2571 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2572 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2573 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2574 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2575 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2576 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2577 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2578 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2579 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2580 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2581 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2582 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25828 longlat utm ellps,no_defs,proj,units,zone +REG esri:25829 longlat utm ellps,no_defs,proj,units,zone +REG esri:2583 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25830 longlat utm ellps,no_defs,proj,units,zone +REG esri:25831 longlat utm ellps,no_defs,proj,units,zone +REG esri:25832 longlat utm ellps,no_defs,proj,units,zone +REG esri:25833 longlat utm ellps,no_defs,proj,units,zone +REG esri:25834 longlat utm ellps,no_defs,proj,units,zone +REG esri:25835 longlat utm ellps,no_defs,proj,units,zone +REG esri:25836 longlat utm ellps,no_defs,proj,units,zone +REG esri:25837 longlat utm ellps,no_defs,proj,units,zone +REG esri:25838 longlat utm ellps,no_defs,proj,units,zone +REG esri:2584 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2585 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2586 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2587 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2588 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25884 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2589 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2590 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2591 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2592 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2593 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:25932 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2594 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2595 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2596 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2597 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2598 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2599 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2600 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2601 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2602 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2603 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2604 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2605 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2606 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2607 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2608 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2609 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2610 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2611 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2612 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2613 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2614 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2615 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2616 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2617 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2618 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2619 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26191 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:26192 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:26193 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2620 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2621 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2622 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2623 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26237 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2624 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2625 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2626 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2627 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2628 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2629 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2630 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2631 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2632 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2633 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26331 longlat utm ellps,no_defs,proj,units,zone +REG esri:26332 longlat utm ellps,no_defs,proj,units,zone +REG esri:2634 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2635 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2636 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2637 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2638 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2639 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26391 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26392 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26393 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2640 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2641 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2642 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2643 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26432 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2644 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2645 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2646 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2647 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2648 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2649 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2650 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2651 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2652 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2653 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2654 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2655 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2656 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2657 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2658 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2659 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26591 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:26592 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2660 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2661 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2662 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2663 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26632 longlat utm a,b,no_defs,proj,units,zone +REG esri:2664 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2665 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2666 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2667 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2668 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2669 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26692 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:2670 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26703 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26704 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26705 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26706 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26707 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26708 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26709 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:2671 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26710 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26711 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26712 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26713 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26714 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26715 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26716 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26717 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26718 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26719 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:2672 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26720 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26721 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26722 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26729 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2673 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26730 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26731 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +REG esri:26732 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26733 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26734 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26735 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26736 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26737 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26738 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26739 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2674 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26740 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26741 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26742 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26743 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26744 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26745 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26746 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26747 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26748 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26749 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2675 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26750 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26751 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26752 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26753 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26754 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26755 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26756 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26757 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26758 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26759 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2676 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26760 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26761 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26762 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26763 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26764 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26765 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26766 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26767 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26768 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26769 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2677 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26770 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26771 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26772 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26773 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26774 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26775 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26776 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26777 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26778 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26779 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2678 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26780 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26781 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26782 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26783 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26784 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26785 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26786 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26787 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26788 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26789 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2679 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26790 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26791 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26792 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26793 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26794 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26795 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26796 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26797 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26798 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2680 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26801 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26802 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26803 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2681 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26811 longlat lcc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26812 longlat lcc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:26813 longlat lcc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2682 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2683 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2684 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2685 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2686 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2687 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2688 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2689 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2690 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26903 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26904 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26905 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26906 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26907 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26908 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26909 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:2691 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26910 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26911 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26912 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26913 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26914 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26915 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26916 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26917 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26918 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26919 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:2692 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26920 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26921 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26922 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26923 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:26929 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2693 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26930 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26931 longlat omerc alpha,datum,ellps,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG esri:26932 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26933 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26934 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26935 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26936 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26937 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26938 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26939 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2694 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26940 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26941 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26942 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26943 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26944 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26945 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26946 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26948 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26949 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2695 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26950 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26951 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26952 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26953 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26954 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26955 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26956 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26957 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26958 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26959 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2696 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26960 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26961 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26962 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26963 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26964 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26965 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26966 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26967 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26968 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26969 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2697 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26970 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26971 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26972 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26973 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26974 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26975 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26976 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26977 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26978 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26979 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2698 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26980 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26981 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26982 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26983 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26984 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26985 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26986 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26987 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26988 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26989 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2699 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26990 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26991 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26992 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26993 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26994 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26995 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26996 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26997 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:26998 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2700 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2701 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2702 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2703 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27038 longlat utm ellps,no_defs,proj,units,zone +REG esri:27039 longlat utm ellps,no_defs,proj,units,zone +REG esri:2704 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27040 longlat utm ellps,no_defs,proj,units,zone +REG esri:2705 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2706 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2707 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2708 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2709 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2710 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2711 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2712 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27120 longlat utm ellps,no_defs,proj,units,zone +REG esri:2713 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2714 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2715 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2716 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2717 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2718 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2719 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2720 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27200 longlat nzmg ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27205 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27206 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27207 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27208 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27209 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2721 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27210 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27211 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27212 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27213 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27214 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27215 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27216 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27217 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27218 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27219 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2722 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27220 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27221 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27222 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27223 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27224 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27225 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27226 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27227 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27228 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27229 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2723 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27230 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27231 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27232 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2724 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2725 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27258 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:27259 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2726 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27260 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2727 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2728 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2729 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27291 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:27292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2730 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2731 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2732 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2733 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2734 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2735 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2736 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2737 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2738 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2739 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27391 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27392 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27393 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27394 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27395 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27396 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27397 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27398 longlat tmerc a,b,k,lat_0,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:2740 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2741 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2742 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27429 longlat utm ellps,no_defs,proj,units,zone +REG esri:2743 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2744 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2745 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2746 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2747 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2748 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2749 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2750 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27500 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2751 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2752 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2753 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2754 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2755 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2756 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27561 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27562 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27563 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27564 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:2757 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27571 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27572 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27573 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27574 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:2758 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:27581 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27582 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27583 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27584 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:2759 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:27591 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27592 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27593 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:27594 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:2760 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2761 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2762 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2763 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2764 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2765 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2766 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2767 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2768 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2769 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2770 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:27700 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2771 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2772 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2773 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2774 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2775 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2776 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2777 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2778 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2779 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2780 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2781 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2782 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2783 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2784 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2785 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2786 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2787 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2788 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2789 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2790 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2791 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2792 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2793 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2794 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2795 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2796 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2797 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2798 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2799 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2800 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2801 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2802 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2803 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2804 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2805 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2806 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2807 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2808 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2809 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2810 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2811 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2812 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2813 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2814 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2815 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2816 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2817 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2818 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2819 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28191 longlat cass a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28192 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28193 longlat cass a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2820 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2821 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2822 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2823 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28232 longlat utm a,b,no_defs,proj,south,units,zone +REG esri:2824 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2825 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2826 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2827 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2828 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2829 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2830 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2831 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2832 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2833 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2834 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28348 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28349 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2835 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28350 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28351 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28352 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28353 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28354 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28355 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28356 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28357 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:28358 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2836 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2837 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2838 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2839 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2840 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28402 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28403 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28404 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28405 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28406 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28407 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28408 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28409 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2841 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28410 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28411 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28412 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28413 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28414 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28415 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28416 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28417 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28418 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28419 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2842 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28420 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28421 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28422 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28423 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28424 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28425 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28426 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28427 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28428 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28429 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2843 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28430 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28431 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28432 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2844 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2845 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2846 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28464 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28465 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28466 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28467 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28469 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2847 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28470 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28471 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28472 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28473 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28474 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28475 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28476 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28477 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28478 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28479 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2848 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28480 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28481 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28482 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28483 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28484 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28485 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28486 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28487 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28488 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28489 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2849 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28490 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28491 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2850 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2851 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2852 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2853 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2854 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2855 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2856 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2857 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2858 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2859 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2860 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:28600 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2861 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2862 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2863 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2864 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2865 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2866 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2867 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2868 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2869 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2870 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2871 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2872 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2873 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2874 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2875 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2876 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2877 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2878 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2879 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2880 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2881 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2882 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2883 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2884 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2885 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2886 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2887 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2888 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2889 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2890 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2891 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2892 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2893 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2894 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2895 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2896 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2897 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2898 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2899 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:28991 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:28992 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2900 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2901 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2902 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2903 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2904 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2905 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2906 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2907 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2908 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2909 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2910 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:29100 longlat poly ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2911 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:29118 longlat utm ellps,no_defs,proj,units,zone +REG esri:29119 longlat utm ellps,no_defs,proj,units,zone +REG esri:2912 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:29120 longlat utm ellps,no_defs,proj,units,zone +REG esri:29121 longlat utm ellps,no_defs,proj,units,zone +REG esri:29122 longlat utm ellps,no_defs,proj,units,zone +REG esri:2913 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2914 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2915 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2916 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2917 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:29177 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29178 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29179 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2918 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:29180 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29181 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29182 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29183 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29184 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:29185 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2919 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2920 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2921 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2922 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:29220 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:29221 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:2923 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2924 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2925 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2926 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2927 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2928 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2929 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2930 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:2931 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:2932 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2933 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:29333 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:2934 longlat merc ellps,k,lat_ts,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:2935 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2936 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2937 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2938 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2939 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2940 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2941 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:2942 longlat utm ellps,no_defs,proj,units,zone +REG esri:2943 longlat utm ellps,no_defs,proj,units,zone +REG esri:2944 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2945 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2946 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2947 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2948 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2949 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2950 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2951 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2952 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2953 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2954 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:2955 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2956 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2957 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2958 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2959 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2960 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2961 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:2962 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:29635 longlat utm a,b,no_defs,proj,units,zone +REG esri:29636 longlat utm a,b,no_defs,proj,units,zone +REG esri:29700 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,pm,proj,towgs84,units,x_0,y_0 +REG esri:29738 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:29739 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:29849 longlat utm ellps,no_defs,proj,units,zone +REG esri:29850 longlat utm ellps,no_defs,proj,units,zone +REG esri:29871 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +REG esri:29872 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,to_meter,x_0,y_0 +REG esri:29873 longlat omerc alpha,ellps,k,lat_0,lonc,no_defs,proj,units,x_0,y_0 +REG esri:29900 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:29901 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:29902 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:29903 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30161 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30162 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30163 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30164 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30165 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30166 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30167 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30168 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30169 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30172 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30173 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30174 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30175 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30176 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30177 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30178 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30179 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30200 longlat cass a,b,lat_0,lon_0,no_defs,proj,to_meter,towgs84,x_0,y_0 +REG esri:30339 longlat utm ellps,no_defs,proj,units,zone +REG esri:30340 longlat utm ellps,no_defs,proj,units,zone +REG esri:3036 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:3037 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:30491 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:30492 longlat lcc a,b,k_0,lat_0,lat_1,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:30591 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30592 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30729 longlat utm ellps,no_defs,proj,units,zone +REG esri:30730 longlat utm ellps,no_defs,proj,units,zone +REG esri:30731 longlat utm ellps,no_defs,proj,units,zone +REG esri:30732 longlat utm ellps,no_defs,proj,units,zone +REG esri:30791 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30792 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:30800 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31028 longlat utm a,b,no_defs,proj,units,zone +REG esri:31121 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31154 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:31170 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:31171 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:31265 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31266 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31267 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31268 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31275 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31276 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31277 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31278 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31279 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31281 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:31282 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:31283 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:31284 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31285 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31286 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31287 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31291 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:31292 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:31293 longlat tmerc ellps,k,lat_0,lon_0,no_defs,pm,proj,units,x_0,y_0 +REG esri:31294 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31295 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31296 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31297 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31300 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31370 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31461 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31462 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31463 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31464 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31465 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31466 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31467 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31468 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31469 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:3148 longlat utm a,b,no_defs,proj,units,zone +REG esri:3149 longlat utm a,b,no_defs,proj,units,zone +REG esri:31491 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31492 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31493 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31494 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31495 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31528 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:31529 longlat utm a,b,no_defs,proj,towgs84,units,zone +REG esri:31600 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:31700 longlat stere ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:3176 longlat tmerc a,b,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31838 longlat utm ellps,no_defs,proj,units,zone +REG esri:31839 longlat utm ellps,no_defs,proj,units,zone +REG esri:31900 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:31986 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31987 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31988 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31989 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31990 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31991 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:31992 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31993 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31994 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31995 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31996 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31997 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31998 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:31999 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:3200 longlat lcc ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32000 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32001 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32002 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32003 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32005 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32006 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32007 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32008 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32009 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32010 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32011 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32012 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32013 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32014 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32015 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32016 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32017 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32018 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32019 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32020 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32021 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32022 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32023 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32024 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32025 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32026 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32027 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32028 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32029 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32030 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32031 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32033 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32034 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32035 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32036 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32037 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32038 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32039 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32040 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32041 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32042 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32043 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32044 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32045 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32046 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32047 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32048 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32049 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32050 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32051 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32052 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32053 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32054 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32055 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32056 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32057 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32058 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32059 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32060 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32061 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32062 longlat lcc datum,ellps,k_0,lat_0,lat_1,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32064 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32065 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32066 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32067 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32074 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32075 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32076 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32077 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:32081 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32082 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32083 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32084 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32085 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32086 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32098 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32100 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32104 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32107 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32108 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32109 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32110 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32111 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32112 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32113 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32114 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32115 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32116 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32117 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32118 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32119 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32120 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32121 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32122 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32123 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32124 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32125 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32126 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32127 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32128 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32129 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32130 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32133 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32134 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32135 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32136 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32137 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32138 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32139 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32140 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32141 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32142 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32143 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32144 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32145 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32146 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32147 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32148 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32149 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32150 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32151 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32152 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32153 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32154 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32155 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32156 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32157 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32158 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32161 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32180 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32181 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32182 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32183 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32184 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32185 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32186 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32187 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32188 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32189 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32190 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32191 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32192 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32193 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32194 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32195 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32196 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32197 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32198 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32201 longlat utm ellps,no_defs,proj,units,zone +REG esri:32202 longlat utm ellps,no_defs,proj,units,zone +REG esri:32203 longlat utm ellps,no_defs,proj,units,zone +REG esri:32204 longlat utm ellps,no_defs,proj,units,zone +REG esri:32205 longlat utm ellps,no_defs,proj,units,zone +REG esri:32206 longlat utm ellps,no_defs,proj,units,zone +REG esri:32207 longlat utm ellps,no_defs,proj,units,zone +REG esri:32208 longlat utm ellps,no_defs,proj,units,zone +REG esri:32209 longlat utm ellps,no_defs,proj,units,zone +REG esri:32210 longlat utm ellps,no_defs,proj,units,zone +REG esri:32211 longlat utm ellps,no_defs,proj,units,zone +REG esri:32212 longlat utm ellps,no_defs,proj,units,zone +REG esri:32213 longlat utm ellps,no_defs,proj,units,zone +REG esri:32214 longlat utm ellps,no_defs,proj,units,zone +REG esri:32215 longlat utm ellps,no_defs,proj,units,zone +REG esri:32216 longlat utm ellps,no_defs,proj,units,zone +REG esri:32217 longlat utm ellps,no_defs,proj,units,zone +REG esri:32218 longlat utm ellps,no_defs,proj,units,zone +REG esri:32219 longlat utm ellps,no_defs,proj,units,zone +REG esri:32220 longlat utm ellps,no_defs,proj,units,zone +REG esri:32221 longlat utm ellps,no_defs,proj,units,zone +REG esri:32222 longlat utm ellps,no_defs,proj,units,zone +REG esri:32223 longlat utm ellps,no_defs,proj,units,zone +REG esri:32224 longlat utm ellps,no_defs,proj,units,zone +REG esri:32225 longlat utm ellps,no_defs,proj,units,zone +REG esri:32226 longlat utm ellps,no_defs,proj,units,zone +REG esri:32227 longlat utm ellps,no_defs,proj,units,zone +REG esri:32228 longlat utm ellps,no_defs,proj,units,zone +REG esri:32229 longlat utm ellps,no_defs,proj,units,zone +REG esri:32230 longlat utm ellps,no_defs,proj,units,zone +REG esri:32231 longlat utm ellps,no_defs,proj,units,zone +REG esri:32232 longlat utm ellps,no_defs,proj,units,zone +REG esri:32233 longlat utm ellps,no_defs,proj,units,zone +REG esri:32234 longlat utm ellps,no_defs,proj,units,zone +REG esri:32235 longlat utm ellps,no_defs,proj,units,zone +REG esri:32236 longlat utm ellps,no_defs,proj,units,zone +REG esri:32237 longlat utm ellps,no_defs,proj,units,zone +REG esri:32238 longlat utm ellps,no_defs,proj,units,zone +REG esri:32239 longlat utm ellps,no_defs,proj,units,zone +REG esri:32240 longlat utm ellps,no_defs,proj,units,zone +REG esri:32241 longlat utm ellps,no_defs,proj,units,zone +REG esri:32242 longlat utm ellps,no_defs,proj,units,zone +REG esri:32243 longlat utm ellps,no_defs,proj,units,zone +REG esri:32244 longlat utm ellps,no_defs,proj,units,zone +REG esri:32245 longlat utm ellps,no_defs,proj,units,zone +REG esri:32246 longlat utm ellps,no_defs,proj,units,zone +REG esri:32247 longlat utm ellps,no_defs,proj,units,zone +REG esri:32248 longlat utm ellps,no_defs,proj,units,zone +REG esri:32249 longlat utm ellps,no_defs,proj,units,zone +REG esri:32250 longlat utm ellps,no_defs,proj,units,zone +REG esri:32251 longlat utm ellps,no_defs,proj,units,zone +REG esri:32252 longlat utm ellps,no_defs,proj,units,zone +REG esri:32253 longlat utm ellps,no_defs,proj,units,zone +REG esri:32254 longlat utm ellps,no_defs,proj,units,zone +REG esri:32255 longlat utm ellps,no_defs,proj,units,zone +REG esri:32256 longlat utm ellps,no_defs,proj,units,zone +REG esri:32257 longlat utm ellps,no_defs,proj,units,zone +REG esri:32258 longlat utm ellps,no_defs,proj,units,zone +REG esri:32259 longlat utm ellps,no_defs,proj,units,zone +REG esri:32260 longlat utm ellps,no_defs,proj,units,zone +REG esri:32301 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32302 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32303 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32304 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32305 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32306 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32307 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32308 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32309 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32310 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32311 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32312 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32313 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32314 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32315 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32316 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32317 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32318 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32319 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32320 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32321 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32322 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32323 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32324 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32325 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32326 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32327 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32328 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32329 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32330 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32331 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32332 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32333 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32334 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32335 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32336 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32337 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32338 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32339 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32340 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32341 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32342 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32343 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32344 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32345 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32346 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32347 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32348 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32349 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32350 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32351 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32352 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32353 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32354 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32355 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32356 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32357 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32358 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32359 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32360 longlat utm ellps,no_defs,proj,south,units,zone +REG esri:32401 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32402 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32403 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32404 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32405 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32406 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32407 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32408 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32409 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32410 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32411 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32412 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32413 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32414 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32415 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32416 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32417 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32418 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32419 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32420 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32421 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32422 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32423 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32424 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32425 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32426 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32427 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32428 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32429 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32430 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32431 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32432 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32433 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32434 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32435 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32436 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32437 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32438 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32439 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32440 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32441 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32442 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32443 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32444 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32445 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32446 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32447 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32448 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32449 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32450 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32451 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32452 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32453 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32454 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32455 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32456 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32457 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32458 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32459 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32460 longlat utm ellps,no_defs,proj,towgs84,units,zone +REG esri:32501 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32502 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32503 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32504 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32505 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32506 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32507 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32508 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32509 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32510 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32511 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32512 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32513 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32514 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32515 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32516 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32517 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32518 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32519 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32520 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32521 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32522 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32523 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32524 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32525 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32526 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32527 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32528 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32529 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32530 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32531 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32532 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32533 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32534 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32535 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32536 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32537 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32538 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32539 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32540 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32541 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32542 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32543 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32544 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32545 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32546 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32547 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32548 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32549 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32550 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32551 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32552 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32553 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32554 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32555 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32556 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32557 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32558 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32559 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32560 longlat utm ellps,no_defs,proj,south,towgs84,units,zone +REG esri:32601 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32602 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32603 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32604 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32605 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32606 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32607 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32608 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32609 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32610 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32611 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32612 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32613 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32614 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32615 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32616 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32617 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32618 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32619 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32620 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32621 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32622 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32623 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32624 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32625 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32626 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32627 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32628 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32629 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32630 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32631 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32632 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32633 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32634 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32635 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32636 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32637 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32638 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32639 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32640 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32641 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32642 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32643 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32644 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32645 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32646 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32647 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32648 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32649 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32650 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32651 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32652 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32653 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32654 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32655 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32656 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32657 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32658 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32659 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32660 longlat utm datum,ellps,no_defs,proj,units,zone +REG esri:32661 longlat stere datum,ellps,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32701 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32702 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32703 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32704 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32705 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32706 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32707 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32708 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32709 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32710 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32711 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32712 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32713 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32714 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32715 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32716 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32717 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32718 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32719 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32720 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32721 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32722 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32723 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32724 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32725 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32726 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32727 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32728 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32729 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32730 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32731 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32732 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32733 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32734 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32735 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32736 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32737 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32738 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32739 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32740 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32741 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32742 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32743 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32744 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32745 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32746 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32747 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32748 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32749 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32750 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32751 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32752 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32753 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32754 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32755 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32756 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32757 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32758 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32759 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32760 longlat utm datum,ellps,no_defs,proj,south,units,zone +REG esri:32761 longlat stere datum,ellps,k,lat_0,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:32766 longlat tmerc datum,ellps,k,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:3300 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:3301 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,towgs84,units,x_0,y_0 +REG esri:3439 longlat utm ellps,no_defs,proj,units,zone +REG esri:3440 longlat utm ellps,no_defs,proj,units,zone +REG esri:3561 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:3562 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:3563 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:3564 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:3565 longlat tmerc ellps,k,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:37001 longlat longlat ellps,no_defs,proj +REG esri:37002 longlat longlat a,b,no_defs,proj +REG esri:37003 longlat longlat a,b,no_defs,proj +REG esri:37004 longlat longlat ellps,no_defs,proj +REG esri:37005 longlat longlat a,b,no_defs,proj +REG esri:37006 longlat longlat a,b,no_defs,proj +REG esri:37007 longlat longlat a,b,no_defs,proj +REG esri:37008 longlat longlat a,b,no_defs,proj +REG esri:37201 longlat longlat ellps,no_defs,proj +REG esri:37202 longlat longlat a,b,no_defs,proj +REG esri:37203 longlat longlat a,b,no_defs,proj +REG esri:37204 longlat longlat ellps,no_defs,proj +REG esri:37205 longlat longlat ellps,no_defs,proj +REG esri:37206 longlat longlat ellps,no_defs,proj +REG esri:37207 longlat longlat ellps,no_defs,proj +REG esri:37208 longlat longlat ellps,no_defs,proj +REG esri:37211 longlat longlat ellps,no_defs,proj +REG esri:37212 longlat longlat ellps,no_defs,proj +REG esri:37213 longlat longlat ellps,no_defs,proj +REG esri:37214 longlat longlat ellps,no_defs,proj +REG esri:37215 longlat longlat ellps,no_defs,proj +REG esri:37216 longlat longlat ellps,no_defs,proj +REG esri:37217 longlat longlat ellps,no_defs,proj +REG esri:37218 longlat longlat ellps,no_defs,proj +REG esri:37219 longlat longlat ellps,no_defs,proj +REG esri:37220 longlat longlat ellps,no_defs,proj +REG esri:37221 longlat longlat ellps,no_defs,proj +REG esri:37222 longlat longlat ellps,no_defs,proj +REG esri:37223 longlat longlat a,b,no_defs,proj +REG esri:37224 longlat longlat ellps,no_defs,proj +REG esri:37226 longlat longlat ellps,no_defs,proj +REG esri:37227 longlat longlat ellps,no_defs,proj +REG esri:37228 longlat longlat ellps,no_defs,proj +REG esri:37229 longlat longlat a,b,no_defs,proj +REG esri:37230 longlat longlat ellps,no_defs,proj +REG esri:37231 longlat longlat ellps,no_defs,proj +REG esri:37232 longlat longlat ellps,no_defs,proj +REG esri:37233 longlat longlat ellps,no_defs,proj +REG esri:37234 longlat longlat ellps,no_defs,proj +REG esri:37235 longlat longlat ellps,no_defs,proj +REG esri:37237 longlat longlat ellps,no_defs,proj +REG esri:37238 longlat longlat ellps,no_defs,proj +REG esri:37239 longlat longlat ellps,no_defs,proj +REG esri:37240 longlat longlat ellps,no_defs,proj +REG esri:37241 longlat longlat ellps,no_defs,proj +REG esri:37242 longlat longlat ellps,no_defs,proj +REG esri:37243 longlat longlat ellps,no_defs,proj +REG esri:37245 longlat longlat ellps,no_defs,proj +REG esri:37246 longlat longlat ellps,no_defs,proj +REG esri:37247 longlat longlat ellps,no_defs,proj +REG esri:37249 longlat longlat ellps,no_defs,proj +REG esri:37250 longlat longlat ellps,no_defs,proj +REG esri:37251 longlat longlat ellps,no_defs,proj +REG esri:37252 longlat longlat ellps,no_defs,proj +REG esri:37253 longlat longlat ellps,no_defs,proj +REG esri:37254 longlat longlat ellps,no_defs,proj +REG esri:37255 longlat longlat ellps,no_defs,proj +REG esri:37257 longlat longlat ellps,no_defs,proj +REG esri:37259 longlat longlat ellps,no_defs,proj +REG esri:37260 longlat longlat ellps,no_defs,proj +REG esri:3920 longlat utm ellps,no_defs,proj,units,zone +REG esri:3991 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:3992 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:4001 longlat longlat ellps,no_defs,proj +REG esri:4002 longlat longlat a,b,no_defs,proj +REG esri:4003 longlat longlat ellps,no_defs,proj +REG esri:4004 longlat longlat ellps,no_defs,proj +REG esri:4005 longlat longlat a,b,no_defs,proj +REG esri:4006 longlat longlat ellps,no_defs,proj +REG esri:4007 longlat longlat a,b,no_defs,proj +REG esri:4008 longlat longlat ellps,no_defs,proj +REG esri:4009 longlat longlat a,b,no_defs,proj +REG esri:4010 longlat longlat a,b,no_defs,proj +REG esri:4011 longlat longlat a,b,no_defs,proj +REG esri:4012 longlat longlat ellps,no_defs,proj +REG esri:4013 longlat longlat a,b,no_defs,proj +REG esri:4014 longlat longlat a,b,no_defs,proj +REG esri:4015 longlat longlat a,b,no_defs,proj +REG esri:4016 longlat longlat ellps,no_defs,proj +REG esri:4018 longlat longlat a,b,no_defs,proj +REG esri:4019 longlat longlat ellps,no_defs,proj +REG esri:4020 longlat longlat ellps,no_defs,proj +REG esri:4021 longlat longlat a,b,no_defs,proj +REG esri:4022 longlat longlat ellps,no_defs,proj +REG esri:4023 longlat longlat ellps,no_defs,proj +REG esri:4024 longlat longlat ellps,no_defs,proj +REG esri:4025 longlat longlat ellps,no_defs,proj +REG esri:4027 longlat longlat a,b,no_defs,proj +REG esri:4028 longlat longlat a,b,no_defs,proj +REG esri:4029 longlat longlat a,b,no_defs,proj +REG esri:4030 longlat longlat ellps,no_defs,proj +REG esri:4031 longlat longlat ellps,no_defs,proj +REG esri:4032 longlat longlat a,b,no_defs,proj +REG esri:4033 longlat longlat a,b,no_defs,proj +REG esri:4034 longlat longlat ellps,no_defs,proj +REG esri:4035 longlat longlat a,b,no_defs,proj +REG esri:4036 longlat longlat ellps,no_defs,proj +REG esri:4041 longlat longlat a,b,no_defs,proj +REG esri:4042 longlat longlat a,b,no_defs,proj +REG esri:4043 longlat longlat ellps,no_defs,proj +REG esri:4044 longlat longlat a,b,no_defs,proj +REG esri:4045 longlat longlat a,b,no_defs,proj +REG esri:4047 longlat longlat a,b,no_defs,proj +REG esri:4120 longlat longlat ellps,no_defs,proj +REG esri:4121 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4122 longlat longlat a,b,no_defs,proj +REG esri:4123 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4124 longlat longlat ellps,no_defs,proj +REG esri:4125 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4126 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4127 longlat longlat ellps,no_defs,proj +REG esri:4128 longlat longlat ellps,no_defs,proj +REG esri:4129 longlat longlat ellps,no_defs,proj +REG esri:4130 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4131 longlat longlat a,b,no_defs,proj +REG esri:4132 longlat longlat ellps,no_defs,proj +REG esri:4133 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4134 longlat longlat ellps,no_defs,proj +REG esri:4135 longlat longlat ellps,no_defs,proj +REG esri:4136 longlat longlat ellps,no_defs,proj +REG esri:4137 longlat longlat ellps,no_defs,proj +REG esri:4138 longlat longlat ellps,no_defs,proj +REG esri:4139 longlat longlat ellps,no_defs,proj +REG esri:4140 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4141 longlat longlat ellps,no_defs,proj +REG esri:4142 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4143 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4144 longlat longlat a,b,no_defs,proj +REG esri:4145 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4146 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4147 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4148 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4149 longlat longlat ellps,no_defs,proj +REG esri:4150 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4151 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4152 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4153 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4154 longlat longlat ellps,no_defs,proj +REG esri:4155 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4156 longlat longlat ellps,no_defs,proj +REG esri:4157 longlat longlat a,b,no_defs,proj +REG esri:4158 longlat longlat ellps,no_defs,proj +REG esri:4159 longlat longlat ellps,no_defs,proj +REG esri:4160 longlat longlat ellps,no_defs,proj +REG esri:4161 longlat longlat ellps,no_defs,proj +REG esri:4162 longlat longlat ellps,no_defs,proj +REG esri:4163 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4164 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4165 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4166 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4167 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4168 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4169 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4170 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4171 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4172 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4173 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4174 longlat longlat a,b,no_defs,proj +REG esri:4175 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4176 longlat longlat ellps,no_defs,proj +REG esri:4178 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4179 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4180 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4181 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4182 longlat longlat ellps,no_defs,proj +REG esri:4183 longlat longlat ellps,no_defs,proj +REG esri:4184 longlat longlat ellps,no_defs,proj +REG esri:4185 longlat longlat ellps,no_defs,proj +REG esri:4188 longlat longlat ellps,no_defs,proj +REG esri:4189 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4190 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4191 longlat longlat ellps,no_defs,proj +REG esri:4192 longlat longlat ellps,no_defs,proj +REG esri:4193 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4194 longlat longlat ellps,no_defs,proj +REG esri:4195 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4196 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4197 longlat longlat ellps,no_defs,proj +REG esri:4198 longlat longlat ellps,no_defs,proj +REG esri:4199 longlat longlat ellps,no_defs,proj +REG esri:4200 longlat longlat ellps,no_defs,proj +REG esri:4201 longlat longlat ellps,no_defs,proj +REG esri:4202 longlat longlat ellps,no_defs,proj +REG esri:4203 longlat longlat ellps,no_defs,proj +REG esri:4204 longlat longlat ellps,no_defs,proj +REG esri:4205 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4206 longlat longlat a,b,no_defs,proj +REG esri:4207 longlat longlat ellps,no_defs,proj +REG esri:4208 longlat longlat ellps,no_defs,proj +REG esri:4209 longlat longlat a,b,no_defs,proj +REG esri:4210 longlat longlat ellps,no_defs,proj +REG esri:4211 longlat longlat ellps,no_defs,proj +REG esri:4212 longlat longlat ellps,no_defs,proj +REG esri:4213 longlat longlat a,b,no_defs,proj +REG esri:4214 longlat longlat ellps,no_defs,proj +REG esri:4215 longlat longlat ellps,no_defs,proj +REG esri:4216 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4217 longlat longlat ellps,no_defs,proj +REG esri:4218 longlat longlat ellps,no_defs,proj +REG esri:4219 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4220 longlat longlat ellps,no_defs,proj +REG esri:4221 longlat longlat ellps,no_defs,proj +REG esri:4222 longlat longlat a,b,no_defs,proj +REG esri:4223 longlat longlat a,b,no_defs,proj +REG esri:4224 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4225 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4226 longlat longlat a,b,no_defs,proj +REG esri:4227 longlat longlat a,b,no_defs,proj +REG esri:4228 longlat longlat a,b,no_defs,proj +REG esri:4229 longlat longlat ellps,no_defs,proj +REG esri:4230 longlat longlat ellps,no_defs,proj +REG esri:4231 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4232 longlat longlat ellps,no_defs,proj +REG esri:4233 longlat longlat ellps,no_defs,proj +REG esri:4234 longlat longlat a,b,no_defs,proj +REG esri:4235 longlat longlat ellps,no_defs,proj +REG esri:4236 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4237 longlat longlat ellps,no_defs,proj +REG esri:4238 longlat longlat a,b,no_defs,proj +REG esri:4239 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4240 longlat longlat a,b,no_defs,proj +REG esri:4241 longlat longlat ellps,no_defs,proj +REG esri:4242 longlat longlat ellps,no_defs,proj +REG esri:4243 longlat longlat a,b,no_defs,proj +REG esri:4244 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4245 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4246 longlat longlat ellps,no_defs,proj +REG esri:4247 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4248 longlat longlat ellps,no_defs,proj +REG esri:4249 longlat longlat ellps,no_defs,proj +REG esri:4250 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4251 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4252 longlat longlat a,b,no_defs,proj +REG esri:4253 longlat longlat ellps,no_defs,proj +REG esri:4254 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4255 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4256 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4257 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4258 longlat longlat ellps,no_defs,proj +REG esri:4259 longlat longlat ellps,no_defs,proj +REG esri:4260 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4261 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4262 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4263 longlat longlat ellps,no_defs,proj +REG esri:4264 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4265 longlat longlat ellps,no_defs,proj +REG esri:4266 longlat longlat a,b,no_defs,proj +REG esri:4267 longlat longlat datum,ellps,no_defs,proj +REG esri:4268 longlat longlat a,b,no_defs,proj +REG esri:4269 longlat longlat datum,ellps,no_defs,proj +REG esri:4270 longlat longlat ellps,no_defs,proj +REG esri:4271 longlat longlat ellps,no_defs,proj +REG esri:4272 longlat longlat ellps,no_defs,proj +REG esri:4273 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4274 longlat longlat ellps,no_defs,proj +REG esri:4275 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4276 longlat longlat ellps,no_defs,proj +REG esri:4277 longlat longlat ellps,no_defs,proj +REG esri:4278 longlat longlat ellps,no_defs,proj +REG esri:4279 longlat longlat ellps,no_defs,proj +REG esri:4280 longlat longlat ellps,no_defs,proj +REG esri:4281 longlat longlat a,b,no_defs,proj +REG esri:4282 longlat longlat a,b,no_defs,proj +REG esri:4283 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4284 longlat longlat ellps,no_defs,proj +REG esri:4285 longlat longlat ellps,no_defs,proj +REG esri:4286 longlat longlat ellps,no_defs,proj +REG esri:4287 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4288 longlat longlat ellps,no_defs,proj +REG esri:4289 longlat longlat ellps,no_defs,proj +REG esri:4291 longlat longlat ellps,no_defs,proj +REG esri:4292 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4293 longlat longlat ellps,no_defs,proj +REG esri:4294 longlat longlat ellps,no_defs,proj +REG esri:4295 longlat longlat ellps,no_defs,proj +REG esri:4296 longlat longlat a,b,no_defs,proj +REG esri:4297 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4298 longlat longlat ellps,no_defs,proj +REG esri:4299 longlat longlat a,b,no_defs,proj +REG esri:4300 longlat longlat a,b,no_defs,proj +REG esri:4301 longlat longlat ellps,no_defs,proj +REG esri:4302 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4303 longlat longlat ellps,no_defs,proj +REG esri:4304 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4305 longlat longlat ellps,no_defs,proj +REG esri:4306 longlat longlat ellps,no_defs,proj +REG esri:4307 longlat longlat ellps,no_defs,proj +REG esri:4308 longlat longlat ellps,no_defs,proj +REG esri:4309 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4310 longlat longlat a,b,no_defs,proj +REG esri:4311 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4312 longlat longlat ellps,no_defs,proj +REG esri:4313 longlat longlat ellps,no_defs,proj +REG esri:4314 longlat longlat ellps,no_defs,proj +REG esri:4315 longlat longlat a,b,no_defs,proj,towgs84 +REG esri:4316 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4317 longlat longlat ellps,no_defs,proj +REG esri:4318 longlat longlat ellps,no_defs,proj +REG esri:4319 longlat longlat ellps,no_defs,proj +REG esri:4322 longlat longlat ellps,no_defs,proj +REG esri:4324 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4326 longlat longlat datum,ellps,no_defs,proj +REG esri:4404 longlat longlat ellps,no_defs,proj +REG esri:4600 longlat longlat ellps,no_defs,proj +REG esri:4601 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4602 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4603 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4604 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4605 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4606 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4607 longlat longlat ellps,no_defs,proj +REG esri:4608 longlat longlat ellps,no_defs,proj +REG esri:4609 longlat longlat ellps,no_defs,proj +REG esri:4610 longlat longlat a,b,no_defs,proj +REG esri:4611 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4612 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4613 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4614 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4615 longlat longlat ellps,no_defs,proj +REG esri:4616 longlat longlat ellps,no_defs,proj +REG esri:4617 longlat longlat ellps,no_defs,proj,towgs84 +REG esri:4801 longlat longlat ellps,no_defs,pm,proj +REG esri:4802 longlat longlat ellps,no_defs,pm,proj +REG esri:4803 longlat longlat ellps,no_defs,pm,proj +REG esri:4804 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG esri:4805 longlat longlat ellps,no_defs,pm,proj +REG esri:4806 longlat longlat ellps,no_defs,pm,proj +REG esri:4807 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG esri:4808 longlat longlat ellps,no_defs,pm,proj +REG esri:4809 longlat longlat ellps,no_defs,pm,proj +REG esri:4810 longlat longlat ellps,no_defs,pm,proj,towgs84 +REG esri:4811 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG esri:4812 longlat longlat ellps,no_defs,pm,proj +REG esri:4813 longlat longlat ellps,no_defs,pm,proj +REG esri:4814 longlat longlat ellps,no_defs,pm,proj +REG esri:4815 longlat longlat ellps,no_defs,pm,proj +REG esri:4816 longlat longlat a,b,no_defs,pm,proj +REG esri:4817 longlat longlat a,b,no_defs,pm,proj,towgs84 +REG esri:4818 longlat longlat ellps,no_defs,pm,proj +REG esri:4819 longlat longlat ellps,no_defs,pm,proj +REG esri:4820 longlat longlat ellps,no_defs,pm,proj +REG esri:4901 longlat longlat a,b,no_defs,pm,proj +REG esri:4902 longlat longlat a,b,no_defs,pm,proj +REG esri:4903 longlat longlat a,b,no_defs,pm,proj +REG esri:4904 longlat longlat ellps,no_defs,pm,proj +REG esri:53001 longlat a,b,no_defs,units +REG esri:53002 longlat a,b,no_defs,units +REG esri:53003 longlat mill R_A,a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53004 longlat merc a,b,k,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53008 longlat sinu a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53009 longlat moll a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53010 longlat eck6 a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53011 longlat a,b,no_defs,units +REG esri:53012 longlat eck4 a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53013 longlat a,b,no_defs,units +REG esri:53014 longlat a,b,no_defs,units +REG esri:53015 longlat a,b,no_defs,units +REG esri:53016 longlat gall a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53017 longlat a,b,no_defs,units +REG esri:53018 longlat a,b,no_defs,units +REG esri:53019 longlat a,b,no_defs,units +REG esri:53021 longlat poly a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53022 longlat a,b,no_defs,units +REG esri:53023 longlat a,b,no_defs,units +REG esri:53024 longlat a,b,no_defs,units +REG esri:53025 longlat a,b,no_defs,units +REG esri:53026 longlat stere a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53027 longlat eqdc a,b,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53028 longlat cass a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53029 longlat vandg R_A,a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53030 longlat robin a,b,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:53031 longlat a,b,no_defs,units +REG esri:53032 longlat aeqd a,b,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54001 longlat datum,ellps,no_defs,units +REG esri:54002 longlat datum,ellps,no_defs,units +REG esri:54003 longlat mill R_A,datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54004 longlat merc datum,ellps,k,lat_ts,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54008 longlat sinu datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54009 longlat moll datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54010 longlat eck6 datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54011 longlat datum,ellps,no_defs,units +REG esri:54012 longlat eck4 datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54013 longlat datum,ellps,no_defs,units +REG esri:54014 longlat datum,ellps,no_defs,units +REG esri:54015 longlat datum,ellps,no_defs,units +REG esri:54016 longlat gall datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54017 longlat datum,ellps,no_defs,units +REG esri:54018 longlat datum,ellps,no_defs,units +REG esri:54019 longlat datum,ellps,no_defs,units +REG esri:54021 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54022 longlat datum,ellps,no_defs,units +REG esri:54023 longlat datum,ellps,no_defs,units +REG esri:54024 longlat datum,ellps,no_defs,units +REG esri:54025 longlat datum,ellps,no_defs,units +REG esri:54026 longlat stere datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54027 longlat eqdc datum,ellps,lat_0,lat_1,lat_2,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54028 longlat cass datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54029 longlat vandg R_A,datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54030 longlat robin datum,ellps,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:54031 longlat datum,ellps,no_defs,units +REG esri:54032 longlat aeqd datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG esri:65061 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,to_meter,x_0,y_0 +REG esri:65161 longlat poly datum,ellps,lat_0,lon_0,no_defs,proj,units,x_0,y_0 +REG nad27:1001 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1002 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1201 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1202 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1301 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1302 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1401 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1402 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1703 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1801 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1802 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:1900 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2001 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2002 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:201 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:202 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:203 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2111 longlat lcc a,es,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2112 longlat lcc a,es,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2113 longlat lcc a,es,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2201 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2202 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2203 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2301 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2302 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2401 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2402 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2403 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2503 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2701 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2702 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2703 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2800 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:2900 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3001 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3002 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3003 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3104 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3200 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3401 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3402 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3800 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3901 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:3902 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4001 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4002 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:401 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:402 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:403 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:404 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:405 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:406 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:407 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4100 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4201 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4202 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4203 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4204 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4205 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4303 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4400 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4801 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4802 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4803 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4901 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4902 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4903 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:4904 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5001 longlat omerc alpha,datum,k,lat_0,lonc,no_defs,proj,x_0,y_0 +REG nad27:5002 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5003 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5004 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5005 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5006 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5007 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5008 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5009 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5010 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:503 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5104 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5105 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5201 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5202 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5300 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:5400 longlat poly datum,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:600 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad27:700 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:901 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:902 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad27:903 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1001 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1002 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1201 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1202 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1301 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1302 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1401 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1402 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1703 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1801 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1802 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:1900 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2001 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2002 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:201 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:202 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:203 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2111 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2112 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2113 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2201 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2202 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2203 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2301 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2302 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2401 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2402 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2403 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2500 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2600 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2701 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2702 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2703 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2800 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:2900 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3001 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3002 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3003 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3104 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3200 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3401 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3402 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3800 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:3900 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4001 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4002 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:401 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:402 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:403 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:404 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:405 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:406 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4100 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4201 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4202 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4203 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4204 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4205 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4301 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4302 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4303 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4400 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4601 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4602 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4701 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4702 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4801 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4802 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4803 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4901 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4902 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4903 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:4904 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5001 longlat omerc alpha,datum,k,lat_0,lonc,no_defs,proj,x_0,y_0 +REG nad83:5002 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5003 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5004 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5005 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5006 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5007 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5008 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5009 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:501 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5010 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:502 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:503 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5101 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5102 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5103 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5104 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5105 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:5200 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:600 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG nad83:700 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:901 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:902 longlat tmerc datum,k,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG nad83:903 longlat lcc datum,lat_0,lat_1,lat_2,lon_0,no_defs,proj,x_0,y_0 +REG world:CH1903 longlat somerc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:bng longlat tmerc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:bwi longlat tmerc ellps,k_0,lon_0,no_defs,proj,x_0 +REG world:ceylon longlat tmerc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:costa-n longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:costa-s longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:cuba-n longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:cuba-s longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:domin_rep longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:egypt-1 longlat tmerc ellps,k_0,lon_0,no_defs,proj,x_0 +REG world:egypt-2 longlat tmerc ellps,k_0,lon_0,no_defs,proj,x_0 +REG world:egypt-3 longlat tmerc ellps,k_0,lon_0,no_defs,proj,x_0 +REG world:egypt-4 longlat tmerc ellps,k_0,lon_0,no_defs,proj,x_0 +REG world:egypt-5 longlat tmerc ellps,k_0,lon_0,no_defs,proj,x_0 +REG world:el_sal longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:gk2-d longlat tmerc ellps,lat_0,lon_0,no_defs,proj,x_0 +REG world:gk3-d longlat tmerc ellps,lat_0,lon_0,no_defs,proj,x_0 +REG world:gk4-d longlat tmerc ellps,lat_0,lon_0,no_defs,proj,x_0 +REG world:guat-n longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:guat-s longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:haiti longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:hond-n longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:hond-s longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-I longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-IIA longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-IIB longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-IIIA longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-IIIB longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-IVA longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:india-IVB longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:irish longlat tmerc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:levant longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:madagascar longlat labrd azi,ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:malay longlat omerc a,alpha,k_0,lat_0,lonc,no_defs,no_uoff,proj,rf,rot_conv,x_0,y_0 +REG world:n-alger longlat lcc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:n-maroc longlat lcc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:n-tunis longlat lcc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:neiez longlat merc ellps,k_0,lon_0,no_defs,proj,x_0,y_0 +REG world:new_zealand longlat nzmg no_defs,proj +REG world:nica-n longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:nica-s longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:nw-africa longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:palestine longlat tmerc a,k_0,lat_0,lon_0,no_defs,proj,rf,x_0,y_0 +REG world:panama longlat lcc ellps,k_0,lat_1,lon_0,no_defs,proj,x_0,y_0 +REG world:s-alger longlat lcc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:s-maroc longlat lcc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +REG world:s-tunis longlat lcc ellps,k_0,lat_0,lon_0,no_defs,proj,x_0,y_0 +SYN ellps/APL4.9 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/CPM longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/GRS67 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/GRS80 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/GSK2011 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/IAU76 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/MERIT longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/NAD27 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/NAD83 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/NWL9D longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/PZ90 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/SEasia longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/SGS85 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/WGS60 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/WGS66 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/WGS72 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/WGS84 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/airy longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/andrae longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/aust_SA longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/australian longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/bess_nam longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/bessel longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/clrk66 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/clrk80 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/clrk80ign longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/danish longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/delmbr longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/engelis longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/evrst30 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/evrst48 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/evrst56 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/evrst69 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/evrstSS longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/fschr60 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/fschr60m longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/fschr68 longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/helmert longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/hough longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/intl longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/kaula longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/krass longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/lerch longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/mod_airy longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/mprts longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/new_intl longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/plessis longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/sphere longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN ellps/walbeck longlat merc ellps,lat_0,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R longlat aea R,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_A longlat aea R_A,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_C longlat aea R_C,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_V longlat aea R_V,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_a longlat aea R_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_g longlat aea R_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_h longlat aea R_h,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_lat_a longlat aea R_lat_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/R_lat_g longlat aea R_lat_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/a longlat aea a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/alpha longlat aea alpha,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/axis_neu longlat aea axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/axis_wsu longlat aea axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/b longlat aea b,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/datum_NAD27 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/datum_NAD83 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/datum_WGS84 longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/datum_nad83_lower longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/datum_potsdam longlat aea datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/e longlat aea e,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/ellps_clrk66 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/es longlat aea ellps,es,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/f longlat aea ellps,f,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/gamma longlat aea ellps,gamma,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/h longlat aea ellps,h,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/k longlat aea ellps,k,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/k_0 longlat aea ellps,k_0,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/lat_ts longlat aea ellps,lat_0,lat_1,lat_2,lat_ts,lon_0,proj,units,x_0,y_0 +SYN mod/aea/lonc longlat aea ellps,lat_0,lat_1,lat_2,lon_0,lonc,proj,units,x_0,y_0 +SYN mod/aea/nadgrids_conus longlat aea ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/aea/nadgrids_null longlat aea ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/aea/no_uoff longlat aea ellps,lat_0,lat_1,lat_2,lon_0,no_uoff,proj,units,x_0,y_0 +SYN mod/aea/pm_numeric longlat aea ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/aea/pm_paris longlat aea ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/aea/rf longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,rf,units,x_0,y_0 +SYN mod/aea/south longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,south,units,x_0,y_0 +SYN mod/aea/to_meter longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,to_meter,units,x_0,y_0 +SYN mod/aea/towgs84_3 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/aea/towgs84_7 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/aea/towgs84_zero longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/aea/units_km longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/units_us_ft longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/unknown_keyword longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,unknown_keyword,x_0,y_0 +SYN mod/aea/vto_meter longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vto_meter,x_0,y_0 +SYN mod/aea/vunits_m longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vunits,x_0,y_0 +SYN mod/aea/x_0_y_0 longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/aea/zone longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0,zone +SYN mod/lcc/R longlat lcc R,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_A longlat lcc R_A,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_C longlat lcc R_C,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_V longlat lcc R_V,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_a longlat lcc R_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_g longlat lcc R_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_h longlat lcc R_h,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_lat_a longlat lcc R_lat_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/R_lat_g longlat lcc R_lat_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/a longlat lcc a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/alpha longlat lcc alpha,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/axis_neu longlat lcc axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/axis_wsu longlat lcc axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/b longlat lcc b,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/datum_NAD27 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/datum_NAD83 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/datum_WGS84 longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/datum_nad83_lower longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/datum_potsdam longlat lcc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/e longlat lcc e,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/ellps_clrk66 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/es longlat lcc ellps,es,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/f longlat lcc ellps,f,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/gamma longlat lcc ellps,gamma,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/h longlat lcc ellps,h,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/k longlat lcc ellps,k,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/k_0 longlat lcc ellps,k_0,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/lat_ts longlat lcc ellps,lat_0,lat_1,lat_2,lat_ts,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/lonc longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,lonc,proj,units,x_0,y_0 +SYN mod/lcc/nadgrids_conus longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/lcc/nadgrids_null longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/lcc/no_uoff longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,no_uoff,proj,units,x_0,y_0 +SYN mod/lcc/pm_numeric longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/lcc/pm_paris longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/lcc/rf longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,rf,units,x_0,y_0 +SYN mod/lcc/south longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,south,units,x_0,y_0 +SYN mod/lcc/to_meter longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,to_meter,units,x_0,y_0 +SYN mod/lcc/towgs84_3 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/lcc/towgs84_7 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/lcc/towgs84_zero longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/lcc/units_km longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/units_us_ft longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/unknown_keyword longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,unknown_keyword,x_0,y_0 +SYN mod/lcc/vto_meter longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vto_meter,x_0,y_0 +SYN mod/lcc/vunits_m longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vunits,x_0,y_0 +SYN mod/lcc/x_0_y_0 longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/lcc/zone longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0,zone +SYN mod/longlat/R longlat longlat R,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_A longlat longlat R_A,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_C longlat longlat R_C,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_V longlat longlat R_V,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_a longlat longlat R_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_g longlat longlat R_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_h longlat longlat R_h,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_lat_a longlat longlat R_lat_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/R_lat_g longlat longlat R_lat_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/a longlat longlat a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/alpha longlat longlat alpha,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/axis_neu longlat longlat axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/axis_wsu longlat longlat axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/b longlat longlat b,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/datum_NAD27 longlat longlat datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/datum_NAD83 longlat longlat datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/datum_WGS84 longlat longlat datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/datum_nad83_lower longlat longlat datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/datum_potsdam longlat longlat datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/e longlat longlat e,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/ellps_clrk66 longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/es longlat longlat ellps,es,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/f longlat longlat ellps,f,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/gamma longlat longlat ellps,gamma,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/h longlat longlat ellps,h,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/k longlat longlat ellps,k,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/k_0 longlat longlat ellps,k_0,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/lat_ts longlat longlat ellps,lat_0,lat_1,lat_2,lat_ts,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/lonc longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,lonc,proj,units,x_0,y_0 +SYN mod/longlat/nadgrids_conus longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/longlat/nadgrids_null longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/longlat/no_uoff longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,no_uoff,proj,units,x_0,y_0 +SYN mod/longlat/pm_numeric longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/longlat/pm_paris longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/longlat/rf longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,rf,units,x_0,y_0 +SYN mod/longlat/south longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,south,units,x_0,y_0 +SYN mod/longlat/to_meter longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,to_meter,units,x_0,y_0 +SYN mod/longlat/towgs84_3 longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/longlat/towgs84_7 longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/longlat/towgs84_zero longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/longlat/units_km longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/units_us_ft longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/unknown_keyword longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,unknown_keyword,x_0,y_0 +SYN mod/longlat/vto_meter longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vto_meter,x_0,y_0 +SYN mod/longlat/vunits_m longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vunits,x_0,y_0 +SYN mod/longlat/x_0_y_0 longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/longlat/zone longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0,zone +SYN mod/merc/R longlat merc R,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_A longlat merc R_A,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_C longlat merc R_C,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_V longlat merc R_V,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_a longlat merc R_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_g longlat merc R_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_h longlat merc R_h,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_lat_a longlat merc R_lat_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/R_lat_g longlat merc R_lat_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/a longlat merc a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/alpha longlat merc alpha,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/axis_neu longlat merc axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/axis_wsu longlat merc axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/b longlat merc b,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/datum_NAD27 longlat merc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/datum_NAD83 longlat merc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/datum_WGS84 longlat merc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/datum_nad83_lower longlat merc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/datum_potsdam longlat merc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/e longlat merc e,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/ellps_clrk66 longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/es longlat merc ellps,es,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/f longlat merc ellps,f,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/gamma longlat merc ellps,gamma,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/h longlat merc ellps,h,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/k longlat merc ellps,k,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/k_0 longlat merc ellps,k_0,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/lat_ts longlat merc ellps,lat_0,lat_1,lat_2,lat_ts,lon_0,proj,units,x_0,y_0 +SYN mod/merc/lonc longlat merc ellps,lat_0,lat_1,lat_2,lon_0,lonc,proj,units,x_0,y_0 +SYN mod/merc/nadgrids_conus longlat merc ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/merc/nadgrids_null longlat merc ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/merc/no_uoff longlat merc ellps,lat_0,lat_1,lat_2,lon_0,no_uoff,proj,units,x_0,y_0 +SYN mod/merc/pm_numeric longlat merc ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/merc/pm_paris longlat merc ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/merc/rf longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,rf,units,x_0,y_0 +SYN mod/merc/south longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,south,units,x_0,y_0 +SYN mod/merc/to_meter longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,to_meter,units,x_0,y_0 +SYN mod/merc/towgs84_3 longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/merc/towgs84_7 longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/merc/towgs84_zero longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/merc/units_km longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/units_us_ft longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/unknown_keyword longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,unknown_keyword,x_0,y_0 +SYN mod/merc/vto_meter longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vto_meter,x_0,y_0 +SYN mod/merc/vunits_m longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vunits,x_0,y_0 +SYN mod/merc/x_0_y_0 longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/merc/zone longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0,zone +SYN mod/tmerc/R longlat tmerc R,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_A longlat tmerc R_A,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_C longlat tmerc R_C,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_V longlat tmerc R_V,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_a longlat tmerc R_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_g longlat tmerc R_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_h longlat tmerc R_h,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_lat_a longlat tmerc R_lat_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/R_lat_g longlat tmerc R_lat_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/a longlat tmerc a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/alpha longlat tmerc alpha,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/axis_neu longlat tmerc axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/axis_wsu longlat tmerc axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/b longlat tmerc b,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/datum_NAD27 longlat tmerc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/datum_NAD83 longlat tmerc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/datum_WGS84 longlat tmerc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/datum_nad83_lower longlat tmerc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/datum_potsdam longlat tmerc datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/e longlat tmerc e,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/ellps_clrk66 longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/es longlat tmerc ellps,es,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/f longlat tmerc ellps,f,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/gamma longlat tmerc ellps,gamma,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/h longlat tmerc ellps,h,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/k longlat tmerc ellps,k,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/k_0 longlat tmerc ellps,k_0,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/lat_ts longlat tmerc ellps,lat_0,lat_1,lat_2,lat_ts,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/lonc longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,lonc,proj,units,x_0,y_0 +SYN mod/tmerc/nadgrids_conus longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/tmerc/nadgrids_null longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/tmerc/no_uoff longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,no_uoff,proj,units,x_0,y_0 +SYN mod/tmerc/pm_numeric longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/tmerc/pm_paris longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/tmerc/rf longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,rf,units,x_0,y_0 +SYN mod/tmerc/south longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,south,units,x_0,y_0 +SYN mod/tmerc/to_meter longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,to_meter,units,x_0,y_0 +SYN mod/tmerc/towgs84_3 longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/tmerc/towgs84_7 longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/tmerc/towgs84_zero longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/tmerc/units_km longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/units_us_ft longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/unknown_keyword longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,unknown_keyword,x_0,y_0 +SYN mod/tmerc/vto_meter longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vto_meter,x_0,y_0 +SYN mod/tmerc/vunits_m longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vunits,x_0,y_0 +SYN mod/tmerc/x_0_y_0 longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/tmerc/zone longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0,zone +SYN mod/utm/R longlat utm R,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_A longlat utm R_A,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_C longlat utm R_C,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_V longlat utm R_V,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_a longlat utm R_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_g longlat utm R_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_h longlat utm R_h,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_lat_a longlat utm R_lat_a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/R_lat_g longlat utm R_lat_g,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/a longlat utm a,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/alpha longlat utm alpha,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/axis_neu longlat utm axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/axis_wsu longlat utm axis,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/b longlat utm b,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/datum_NAD27 longlat utm datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/datum_NAD83 longlat utm datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/datum_WGS84 longlat utm datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/datum_nad83_lower longlat utm datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/datum_potsdam longlat utm datum,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/e longlat utm e,ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/ellps_clrk66 longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/es longlat utm ellps,es,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/f longlat utm ellps,f,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/gamma longlat utm ellps,gamma,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/h longlat utm ellps,h,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/k longlat utm ellps,k,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/k_0 longlat utm ellps,k_0,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/lat_ts longlat utm ellps,lat_0,lat_1,lat_2,lat_ts,lon_0,proj,units,x_0,y_0 +SYN mod/utm/lonc longlat utm ellps,lat_0,lat_1,lat_2,lon_0,lonc,proj,units,x_0,y_0 +SYN mod/utm/nadgrids_conus longlat utm ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/utm/nadgrids_null longlat utm ellps,lat_0,lat_1,lat_2,lon_0,nadgrids,proj,units,x_0,y_0 +SYN mod/utm/no_uoff longlat utm ellps,lat_0,lat_1,lat_2,lon_0,no_uoff,proj,units,x_0,y_0 +SYN mod/utm/pm_numeric longlat utm ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/utm/pm_paris longlat utm ellps,lat_0,lat_1,lat_2,lon_0,pm,proj,units,x_0,y_0 +SYN mod/utm/rf longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,rf,units,x_0,y_0 +SYN mod/utm/south longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,south,units,x_0,y_0 +SYN mod/utm/to_meter longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,to_meter,units,x_0,y_0 +SYN mod/utm/towgs84_3 longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/utm/towgs84_7 longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/utm/towgs84_zero longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,towgs84,units,x_0,y_0 +SYN mod/utm/units_km longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/units_us_ft longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/unknown_keyword longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,unknown_keyword,x_0,y_0 +SYN mod/utm/vto_meter longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vto_meter,x_0,y_0 +SYN mod/utm/vunits_m longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,vunits,x_0,y_0 +SYN mod/utm/x_0_y_0 longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN mod/utm/zone longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0,zone +SYN proj/adams_hemi longlat adams_hemi ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/adams_ws1 longlat adams_ws1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/adams_ws2 longlat adams_ws2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/aea longlat aea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/aeqd longlat aeqd ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/affine longlat affine ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/airocean longlat airocean ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/airy longlat airy ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/aitoff longlat aitoff ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/alsk longlat alsk ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/apian longlat apian ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/august longlat august ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/axisswap longlat axisswap ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/bacon longlat bacon ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/bertin1953 longlat bertin1953 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/bipc longlat bipc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/boggs longlat boggs ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/bonne longlat bonne ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/calcofi longlat calcofi ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/cart longlat cart ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/cass longlat cass ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/cc longlat cc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/ccon longlat ccon ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/cea longlat cea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/chamb longlat chamb ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/col_urban longlat col_urban ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/collg longlat collg ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/comill longlat comill ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/crast longlat crast ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/defmodel longlat defmodel ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/deformation longlat deformation ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/denoy longlat denoy ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eck1 longlat eck1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eck2 longlat eck2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eck3 longlat eck3 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eck4 longlat eck4 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eck5 longlat eck5 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eck6 longlat eck6 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eqc longlat eqc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eqdc longlat eqdc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/eqearth longlat eqearth ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/etmerc longlat etmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/euler longlat euler ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/fahey longlat fahey ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/fouc longlat fouc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/fouc_s longlat fouc_s ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gall longlat gall ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/geoc longlat geoc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/geocent longlat geocent ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/geogoffset longlat geogoffset ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/geos longlat geos ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gins8 longlat gins8 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gn_sinu longlat gn_sinu ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gnom longlat gnom ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/goode longlat goode ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gridshift longlat gridshift ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gs48 longlat gs48 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gs50 longlat gs50 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/gstmerc longlat gstmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/guyou longlat guyou ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/hammer longlat hammer ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/hatano longlat hatano ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/healpix longlat healpix ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/helmert longlat helmert ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/hgridshift longlat hgridshift ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/horner longlat horner ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/id longlat id ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/igh longlat igh ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/igh_o longlat igh_o ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/imoll longlat imoll ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/imoll_o longlat imoll_o ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/imw_p longlat imw_p ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/isea longlat isea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/kav5 longlat kav5 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/kav7 longlat kav7 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/krovak longlat krovak ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/labrd longlat labrd ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/laea longlat laea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lagrng longlat lagrng ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/larr longlat larr ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lask longlat lask ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/latlon longlat latlon ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/latlong longlat latlong ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lcc longlat lcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lcca longlat lcca ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/leac longlat leac ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lee_os longlat lee_os ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/longlat longlat longlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lonlat longlat lonlat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/loxim longlat loxim ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/lsat longlat lsat ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mbt_fps longlat mbt_fps ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mbt_s longlat mbt_s ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mbtfpp longlat mbtfpp ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mbtfpq longlat mbtfpq ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mbtfps longlat mbtfps ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/merc longlat merc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mil_os longlat mil_os ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mill longlat mill ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/misrsom longlat misrsom ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/mod_krovak longlat mod_krovak ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/moll longlat moll ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/molobadekas longlat molobadekas ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/molodensky longlat molodensky ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/murd1 longlat murd1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/murd2 longlat murd2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/murd3 longlat murd3 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/name longlat name ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/natearth longlat natearth ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/natearth2 longlat natearth2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/nell longlat nell ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/nell_h longlat nell_h ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/nicol longlat nicol ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/noop longlat noop ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/nsper longlat nsper ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/nzmg longlat nzmg ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/ob_tran longlat ob_tran ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/ocea longlat ocea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/oea longlat oea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/omerc longlat omerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/ortel longlat ortel ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/ortho longlat ortho ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/patterson longlat patterson ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/pconic longlat pconic ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/peirce_q longlat peirce_q ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/pipeline longlat pipeline ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/poly longlat poly ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/pop longlat pop ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/push longlat push ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp1 longlat putp1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp2 longlat putp2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp3 longlat putp3 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp3p longlat putp3p ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp4p longlat putp4p ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp5 longlat putp5 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp5p longlat putp5p ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp6 longlat putp6 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/putp6p longlat putp6p ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/qsc longlat qsc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/qua_aut longlat qua_aut ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/rhealpix longlat rhealpix ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/robin longlat robin ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/rouss longlat rouss ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/rpoly longlat rpoly ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/s2 longlat s2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/sch longlat sch ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/set longlat set ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/sinu longlat sinu ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/som longlat som ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/somerc longlat somerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/spilhaus longlat spilhaus ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/stere longlat stere ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/sterea longlat sterea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tcc longlat tcc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tcea longlat tcea ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/times longlat times ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tinshift longlat tinshift ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tissot longlat tissot ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tmerc longlat tmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tobmerc longlat tobmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/topocentric longlat topocentric ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tpeqd longlat tpeqd ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/tpers longlat tpers ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/unitconvert longlat unitconvert ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/ups longlat ups ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/urm5 longlat urm5 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/urmfps longlat urmfps ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/utm longlat utm ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vandg longlat vandg ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vandg2 longlat vandg2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vandg3 longlat vandg3 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vandg4 longlat vandg4 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vertoffset longlat vertoffset ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vgridshift longlat vgridshift ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/vitk1 longlat vitk1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag1 longlat wag1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag2 longlat wag2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag3 longlat wag3 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag4 longlat wag4 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag5 longlat wag5 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag6 longlat wag6 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wag7 longlat wag7 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/webmerc longlat webmerc ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/weren longlat weren ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wink1 longlat wink1 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wink2 longlat wink2 ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/wintri longlat wintri ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 +SYN proj/xyzgridshift longlat xyzgridshift ellps,lat_0,lat_1,lat_2,lon_0,proj,units,x_0,y_0 diff --git a/golden/baseline/1.4.3/golden-messages.tsv b/golden/baseline/1.4.3/golden-messages.tsv new file mode 100644 index 0000000..a932983 --- /dev/null +++ b/golden/baseline/1.4.3/golden-messages.tsv @@ -0,0 +1,2623 @@ +section key probe message +CSV PROJ4_SPCS_nad27.csv:00019 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00020 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00021 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00022 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00023 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00024 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00025 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00026 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00027 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00028 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00029 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00030 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00031 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00032 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00033 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00034 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00035 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00036 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00037 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00038 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00039 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00040 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00041 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00042 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00043 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00044 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00045 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00046 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00047 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00048 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00049 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00050 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00051 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00052 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00053 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00054 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00055 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00056 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00057 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00058 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00059 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00060 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00061 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00062 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00063 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00064 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00065 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00066 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00067 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00068 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00069 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00070 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00071 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00072 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00073 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00074 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00075 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00076 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00077 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00078 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00079 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00080 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00081 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00082 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00083 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00084 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00085 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00086 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00087 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00088 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00089 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00090 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00091 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00092 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00093 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00094 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00095 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00096 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00097 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00098 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00099 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00100 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00101 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00102 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00103 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00104 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00105 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00106 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00107 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00108 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00109 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00110 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00111 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00112 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00113 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00114 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00115 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00116 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00117 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00118 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00119 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00120 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00121 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00122 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00123 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00124 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00125 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00126 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00127 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00128 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00129 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00130 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00131 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00132 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00133 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00134 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00135 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00136 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00137 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00138 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00139 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00140 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00141 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00142 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00143 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00144 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00145 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00146 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00147 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00148 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00149 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00150 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00151 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00152 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00153 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00154 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00155 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00156 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00157 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00158 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00159 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00160 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00161 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00162 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00163 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00164 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00165 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00166 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00167 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00168 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00169 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00170 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00171 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00172 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00173 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00174 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00175 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00176 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00177 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00178 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00179 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00180 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00181 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00182 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00183 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00184 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00185 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00186 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00187 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00188 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00189 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00190 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00191 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00192 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00193 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00194 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00195 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00196 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00197 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00198 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00199 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00200 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00201 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00202 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00203 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00204 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00205 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00206 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00207 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00208 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00209 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00210 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00211 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00212 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00213 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00214 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00215 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00216 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00217 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00218 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00219 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00220 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00221 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00222 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00223 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00224 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00225 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00226 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00227 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00228 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00229 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00230 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00231 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00232 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00233 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00234 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00235 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00236 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00237 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00238 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00239 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00240 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00241 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00242 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00243 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00244 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00245 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00246 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00247 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00248 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00249 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00250 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00251 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00252 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00253 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00254 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00255 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00256 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00257 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00258 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00259 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00260 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00261 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00262 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00263 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00264 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00265 0 crs-tgt: epsg:0 +CSV PROJ4_SPCS_nad27.csv:00266 0 crs-tgt: epsg:0 +CSV proj4-epsg.csv:00777 0 inv: Latitude is out of range: -2.0518749324692847 +CSV proj4-epsg.csv:00778 0 inv: Latitude is out of range: -4.794486623442763 +CSV proj4-epsg.csv:00779 0 inv: Latitude is out of range: -11.395602896547448 +CSV proj4-epsg.csv:00783 0 inv: Latitude is out of range: -2.0518749324692847 +CSV proj4-epsg.csv:00784 0 inv: Latitude is out of range: -4.794486623442763 +CSV proj4-epsg.csv:00785 0 inv: Latitude is out of range: -11.395602896547448 +CSV proj4-epsg.csv:00798 0 inv: Latitude is out of range: -4.79486409211524 +CSV proj4-epsg.csv:00812 0 inv: Latitude is out of range: -4.794541066365158 +CSV proj4-epsg.csv:00834 0 inv: Latitude is out of range: -2.051895853914291 +CSV proj4-epsg.csv:00835 0 inv: Latitude is out of range: -4.794541066365158 +CSV proj4-epsg.csv:00836 0 inv: Latitude is out of range: -11.395740117100413 +CSV proj4-epsg.csv:00860 0 inv: Latitude is out of range: -2.051895853914291 +CSV proj4-epsg.csv:00861 0 inv: Latitude is out of range: -4.794541066365158 +CSV proj4-epsg.csv:00862 0 inv: Latitude is out of range: -11.395740117100413 +CSV proj4-epsg.csv:00884 0 inv: Latitude is out of range: -2.0520333040037744 +CSV proj4-epsg.csv:00885 0 inv: Latitude is out of range: -4.79486409211524 +CSV proj4-epsg.csv:00886 0 inv: Latitude is out of range: -11.396516889119065 +CSV proj4-epsg.csv:00908 0 inv: Latitude is out of range: -2.0520333040037744 +CSV proj4-epsg.csv:00909 0 inv: Latitude is out of range: -4.79486409211524 +CSV proj4-epsg.csv:00910 0 inv: Latitude is out of range: -11.396516889119065 +CSV proj4-epsg.csv:01214 0 inv: Latitude is out of range: -11.454127221189818 +CSV proj4-epsg.csv:02092 0 inv: I +CSV proj4-epsg.csv:02831 0 inv: Latitude is out of range: -4.79486409211524 +CSV proj4-epsg.csv:02843 0 inv: Latitude is out of range: -4.79486409211524 +CSV proj4-epsg.csv:02900 0 inv: Latitude is out of range: -4.794486623442763 +CSV proj4-epsg.csv:02903 0 inv: Latitude is out of range: -4.794486623442763 +CSV proj4-epsg.csv:02906 0 inv: Latitude is out of range: -4.794486623442763 +CSV proj4-epsg.csv:03288 0 inv: Infinite longitude +CSV proj4-epsg.csv:03349 0 inv: Latitude is out of range: -4.794541066365158 +CSV proj4-epsg.csv:03363 0 inv: Latitude is out of range: -4.794541066365158 +CSV proj4-epsg.csv:04138 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04139 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04140 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04141 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04142 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04143 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04144 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04145 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04146 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04147 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04148 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04149 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04150 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04151 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04152 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04153 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04154 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04155 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04156 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04157 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04158 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04159 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04160 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04161 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04162 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04163 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04164 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04165 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04166 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04167 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04168 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04169 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04170 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04171 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04172 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04173 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04174 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04175 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04176 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04177 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04178 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04179 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04180 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04181 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04182 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04183 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04184 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04185 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04186 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04187 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04188 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04189 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04190 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04191 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04192 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04193 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04194 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04195 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04196 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04197 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04198 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04199 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04200 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04201 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04202 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04203 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04204 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04205 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04206 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04207 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04208 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04209 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04210 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04211 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04212 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04213 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04214 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04215 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04216 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04217 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04218 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04219 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04220 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04221 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04222 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04223 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04224 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04225 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04226 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04227 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04228 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04229 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04230 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04231 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04232 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04233 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04234 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04235 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04236 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04237 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04238 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04239 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04240 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04241 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04242 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04243 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04244 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04245 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04246 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04247 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04248 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04249 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04250 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04251 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04252 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04253 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04254 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04255 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04256 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04257 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04258 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04259 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04260 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04261 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04262 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04263 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04264 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04265 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04266 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04267 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04268 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04269 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04270 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04271 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04272 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04273 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04274 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04275 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04276 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04277 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04278 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04279 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04280 0 crs-tgt: vunits parameter is not supported +CSV proj4-epsg.csv:04281 0 crs-tgt: vunits parameter is not supported +PAIR t02/epsg:4014>epsg:2044 1 inv: Latitude is out of range: -4.0265309313084836E9 +PAIR t02/epsg:4014>epsg:2044 2 inv: Latitude is out of range: -18887.839191443843 +PAIR t02/epsg:4014>epsg:2044 3 inv: Latitude is out of range: 4.073660814398801E9 +PAIR t02/epsg:4014>epsg:2044 4 inv: Latitude is out of range: 18917.257213348523 +PAIR t02/epsg:4174>epsg:21418 1 inv: Latitude is out of range: -4.027626376753856E9 +PAIR t02/epsg:4174>epsg:21418 2 inv: Latitude is out of range: -18886.155044078292 +PAIR t02/epsg:4174>epsg:21418 3 inv: Latitude is out of range: 4.089947668578276E9 +PAIR t02/epsg:4174>epsg:21418 4 inv: Latitude is out of range: 18924.967752456803 +PAIR t03/epsg:4007>epsg:20022 0 inv: Latitude is out of range: 2156.102327834094 +PAIR t03/epsg:4034>epsg:20092 0 inv: Latitude is out of range: 1.577837569927224E9 +PAIR t03/epsg:4045>epsg:2094 1 inv: Latitude is out of range: -2.1916699107719284E11 +PAIR t03/epsg:4045>epsg:2094 2 inv: Latitude is out of range: -36307.98685492182 +PAIR t03/epsg:4045>epsg:2094 3 inv: Latitude is out of range: 2.1902687649142526E11 +PAIR t03/epsg:4045>epsg:2094 4 inv: Latitude is out of range: 36306.03963048495 +PAIR t12/epsg:4152>epsg:2044 1 inv: Latitude is out of range: -4.0493869748938913E9 +PAIR t12/epsg:4152>epsg:2044 2 inv: Latitude is out of range: -18902.147857207656 +PAIR t12/epsg:4152>epsg:2044 3 inv: Latitude is out of range: 4.0968238513943553E9 +PAIR t12/epsg:4152>epsg:2044 4 inv: Latitude is out of range: 18931.59233637236 +PAIR t12/epsg:4737>epsg:21418 1 inv: Latitude is out of range: -4.0383104249493136E9 +PAIR t12/epsg:4737>epsg:21418 2 inv: Latitude is out of range: -18892.850663671135 +PAIR t12/epsg:4737>epsg:21418 3 inv: Latitude is out of range: 4.100822534070221E9 +PAIR t12/epsg:4737>epsg:21418 4 inv: Latitude is out of range: 18931.680385637723 +PAIR t13/epsg:4075>epsg:20022 0 inv: Latitude is out of range: 2156.155617890177 +PAIR t13/epsg:4173>epsg:20079 0 inv: Latitude is out of range: 6.498279028860817 +PAIR t13/epsg:4173>epsg:20079 2 inv: Latitude is out of range: -2887733.2714643097 +PAIR t13/epsg:4173>epsg:20079 4 inv: Latitude is out of range: 2902023.1515140785 +PAIR t13/epsg:4283>epsg:20092 0 inv: Latitude is out of range: 1.5778655121672132E9 +PAIR t13/epsg:4617>epsg:2094 1 inv: Latitude is out of range: -2.1799344971297263E11 +PAIR t13/epsg:4617>epsg:2094 2 inv: Latitude is out of range: -36291.63736370758 +PAIR t13/epsg:4617>epsg:2094 3 inv: Latitude is out of range: 2.178542105335585E11 +PAIR t13/epsg:4617>epsg:2094 4 inv: Latitude is out of range: 36289.691413582725 +PAIR t20/epsg:4132>epsg:2025 1 inv: Latitude is out of range: -77.307051246336 +PAIR t20/epsg:4132>epsg:2025 2 inv: Latitude is out of range: -5864.420330113911 +PAIR t20/epsg:4132>epsg:2025 3 inv: Latitude is out of range: 77.56111832756598 +PAIR t20/epsg:4132>epsg:2025 4 inv: Latitude is out of range: 5910.729328204212 +PAIR t20/epsg:4168>epsg:2328 1 inv: Latitude is out of range: -38.49768216726383 +PAIR t20/epsg:4168>epsg:2328 2 inv: Latitude is out of range: -1.788551169989828 +PAIR t20/epsg:4168>epsg:2328 3 inv: Latitude is out of range: 38.588225812953034 +PAIR t20/epsg:4168>epsg:2328 4 inv: Latitude is out of range: 1.7912712551253307 +PAIR t20/epsg:4192>epsg:2341 1 inv: Latitude is out of range: -5894.811618797713 +PAIR t20/epsg:4192>epsg:2341 2 inv: Latitude is out of range: -77.48929140379778 +PAIR t20/epsg:4192>epsg:2341 3 inv: Latitude is out of range: 5884.554040394495 +PAIR t20/epsg:4192>epsg:2341 4 inv: Latitude is out of range: 77.43301606609921 +PAIR t20/epsg:4207>epsg:2353 1 inv: Latitude is out of range: -355.1435817734546 +PAIR t20/epsg:4207>epsg:2353 2 inv: Latitude is out of range: -10.484556852884378 +PAIR t20/epsg:4207>epsg:2353 3 inv: Latitude is out of range: 355.5556082805072 +PAIR t20/epsg:4207>epsg:2353 4 inv: Latitude is out of range: 10.490980617508825 +PAIR t20/epsg:4214>epsg:2366 0 inv: Latitude is out of range: -818.450954018759 +PAIR t21/epsg:4132>epsg:2108 0 inv: Latitude is out of range: 4.377821150453632E10 +PAIR t21/epsg:4145>epsg:2121 0 inv: Latitude is out of range: 4.4328197298135605E9 +PAIR t21/epsg:4168>epsg:2150 0 inv: Latitude is out of range: Infinity +PAIR t21/epsg:4168>epsg:2150 2 inv: Latitude is out of range: Infinity +PAIR t21/epsg:4168>epsg:2150 4 inv: Latitude is out of range: Infinity +PAIR t21/epsg:4192>epsg:2193 0 inv: Latitude is out of range: -3.144444073287339E9 +PAIR t21/epsg:4214>epsg:2224 0 inv: Latitude is out of range: -15.697247363064756 +PAIR t21/epsg:4214>epsg:2224 3 inv: Latitude is out of range: 1.855100960471382E8 +PAIR t22/epsg:4145>epsg:2044 0 inv: Latitude is out of range: 3.5630834623050625 +PAIR t22/epsg:4145>epsg:2044 1 inv: Latitude is out of range: -3.891789089544785E9 +PAIR t22/epsg:4145>epsg:2044 2 inv: Latitude is out of range: -18778.77349901353 +PAIR t22/epsg:4145>epsg:2044 3 inv: Latitude is out of range: 4.1102858006596603E9 +PAIR t22/epsg:4145>epsg:2044 4 inv: Latitude is out of range: 18916.64355666092 +PAIR t23/epsg:4132>epsg:20022 0 inv: Latitude is out of range: 12633.271755792708 +PAIR t23/epsg:4155>epsg:20079 0 inv: Latitude is out of range: 16.376173623673413 +PAIR t23/epsg:4155>epsg:20079 2 inv: Latitude is out of range: -2870918.745065508 +PAIR t23/epsg:4155>epsg:20079 4 inv: Latitude is out of range: 2906847.849178431 +PAIR t23/epsg:4168>epsg:20092 0 inv: Latitude is out of range: 7.816143998226391E9 +PAIR t23/epsg:4192>epsg:2094 1 inv: Latitude is out of range: -2.2330851263655273E11 +PAIR t23/epsg:4192>epsg:2094 2 inv: Latitude is out of range: -36372.97242355075 +PAIR t23/epsg:4192>epsg:2094 3 inv: Latitude is out of range: 2.1667154452320715E11 +PAIR t23/epsg:4192>epsg:2094 4 inv: Latitude is out of range: 36281.09696535912 +PAIR t24/epsg:4132>epsg:26716 0 inv: Latitude is out of range: Infinity +PAIR t24/epsg:4132>epsg:26716 2 inv: Latitude is out of range: Infinity +PAIR t24/epsg:4132>epsg:26716 4 inv: Latitude is out of range: Infinity +PAIR t24/epsg:4145>epsg:26735 0 inv: Latitude is out of range: 2.0954161398444023E7 +PAIR t24/epsg:4155>epsg:26748 0 inv: Latitude is out of range: 7.603123059431727 +PAIR t24/epsg:4155>epsg:26748 3 inv: Latitude is out of range: 1163714.5371726195 +PAIR t24/epsg:4155>epsg:26748 4 inv: Latitude is out of range: -1.6150849844147246E9 +PAIR t24/epsg:4168>epsg:26766 1 inv: Latitude is out of range: -2.4820021670356667 +PAIR t24/epsg:4168>epsg:26766 2 inv: Latitude is out of range: -57.63024058483446 +PAIR t24/epsg:4168>epsg:26766 3 inv: Latitude is out of range: 2.485918262674564 +PAIR t24/epsg:4168>epsg:26766 4 inv: Latitude is out of range: 57.77598582704405 +PAIR t24/epsg:4207>epsg:26795 1 inv: Latitude is out of range: -30.789686284812657 +PAIR t24/epsg:4207>epsg:26795 2 inv: Latitude is out of range: -1525.455267148385 +PAIR t24/epsg:4207>epsg:26795 3 inv: Latitude is out of range: 30.81208820955369 +PAIR t24/epsg:4207>epsg:26795 4 inv: Latitude is out of range: 1527.8446369862054 +PAIR t24/epsg:4214>epsg:32007 0 inv: Latitude is out of range: -28.214381681743575 +PAIR t24/epsg:4214>epsg:32007 3 inv: Latitude is out of range: 3.1686187150786705E10 +PAIR t30/epsg:4188>epsg:2025 1 inv: Latitude is out of range: -77.27215906543925 +PAIR t30/epsg:4188>epsg:2025 2 inv: Latitude is out of range: -5853.524280265796 +PAIR t30/epsg:4188>epsg:2025 3 inv: Latitude is out of range: 77.64188181667228 +PAIR t30/epsg:4188>epsg:2025 4 inv: Latitude is out of range: 5920.136159093351 +PAIR t30/epsg:4322>epsg:2328 1 inv: Latitude is out of range: -38.54352367634154 +PAIR t30/epsg:4322>epsg:2328 2 inv: Latitude is out of range: -1.7900833509753291 +PAIR t30/epsg:4322>epsg:2328 3 inv: Latitude is out of range: 38.54478907009168 +PAIR t30/epsg:4322>epsg:2328 4 inv: Latitude is out of range: 1.7901213683813744 +PAIR t30/epsg:4660>epsg:2341 1 inv: Latitude is out of range: -5852.583062209823 +PAIR t30/epsg:4660>epsg:2341 2 inv: Latitude is out of range: -77.27547329685045 +PAIR t30/epsg:4660>epsg:2341 3 inv: Latitude is out of range: 5902.871485564957 +PAIR t30/epsg:4660>epsg:2341 4 inv: Latitude is out of range: 77.5722646387083 +PAIR t30/epsg:4691>epsg:2353 1 inv: Latitude is out of range: -354.516870179282 +PAIR t30/epsg:4691>epsg:2353 2 inv: Latitude is out of range: -10.47598836517392 +PAIR t30/epsg:4691>epsg:2353 3 inv: Latitude is out of range: 355.4376474567296 +PAIR t30/epsg:4691>epsg:2353 4 inv: Latitude is out of range: 10.489061823551193 +PAIR t30/epsg:4817>epsg:2366 0 inv: Latitude is out of range: 161.14742040365363 +PAIR t30/epsg:4817>epsg:2366 2 inv: Latitude is out of range: -9.546812407390865E9 +PAIR t30/epsg:4817>epsg:2366 4 inv: Latitude is out of range: 1.0727446505412252E10 +PAIR t31/epsg:4188>epsg:2108 0 inv: Latitude is out of range: 6.325024628080652E10 +PAIR t31/epsg:4232>epsg:2121 0 inv: Latitude is out of range: 4.434955046239612E9 +PAIR t31/epsg:4322>epsg:2150 0 inv: Latitude is out of range: Infinity +PAIR t31/epsg:4322>epsg:2150 2 inv: Latitude is out of range: Infinity +PAIR t31/epsg:4322>epsg:2150 4 inv: Latitude is out of range: Infinity +PAIR t31/epsg:4660>epsg:2193 0 inv: Latitude is out of range: 1.5671192399339825E10 +PAIR t31/epsg:4817>epsg:2224 0 inv: Latitude is out of range: 3133.3686936239196 +PAIR t32/epsg:4232>epsg:2044 0 inv: Latitude is out of range: 3.5658374065062413 +PAIR t32/epsg:4232>epsg:2044 1 inv: Latitude is out of range: -3.954131582985843E9 +PAIR t32/epsg:4232>epsg:2044 2 inv: Latitude is out of range: -18836.692567531598 +PAIR t32/epsg:4232>epsg:2044 3 inv: Latitude is out of range: 4.176422920153884E9 +PAIR t32/epsg:4232>epsg:2044 4 inv: Latitude is out of range: 18974.918556900313 +PAIR t32/epsg:4817>epsg:21418 1 inv: Latitude is out of range: -12094.526579741385 +PAIR t32/epsg:4817>epsg:21418 2 inv: Latitude is out of range: -122.9733865153549 +PAIR t32/epsg:4817>epsg:21418 3 inv: Latitude is out of range: 12259.018124302085 +PAIR t32/epsg:4817>epsg:21418 4 inv: Latitude is out of range: 123.68447262121721 +PAIR t33/epsg:4188>epsg:20022 0 inv: Latitude is out of range: 17265.78484605186 +PAIR t33/epsg:4289>epsg:20079 0 inv: Latitude is out of range: 42.737703423164604 +PAIR t33/epsg:4289>epsg:20079 2 inv: Latitude is out of range: -2846869.738492831 +PAIR t33/epsg:4289>epsg:20079 4 inv: Latitude is out of range: 2940541.9979276974 +PAIR t33/epsg:4322>epsg:20092 0 inv: Latitude is out of range: 1.665010550642678E9 +PAIR t33/epsg:4660>epsg:2094 0 inv: Latitude is out of range: 7.218715478388197 +PAIR t33/epsg:4660>epsg:2094 1 inv: Latitude is out of range: -1.9951774340793893E11 +PAIR t33/epsg:4660>epsg:2094 2 inv: Latitude is out of range: -36035.81658652232 +PAIR t33/epsg:4660>epsg:2094 3 inv: Latitude is out of range: 2.2999301217459448E11 +PAIR t33/epsg:4660>epsg:2094 4 inv: Latitude is out of range: 36503.80795626147 +PAIR t34/epsg:4188>epsg:26716 0 inv: Latitude is out of range: Infinity +PAIR t34/epsg:4188>epsg:26716 2 inv: Latitude is out of range: Infinity +PAIR t34/epsg:4188>epsg:26716 4 inv: Latitude is out of range: Infinity +PAIR t34/epsg:4232>epsg:26735 0 inv: Latitude is out of range: 2.0884161346474662E7 +PAIR t34/epsg:4289>epsg:26748 0 inv: Latitude is out of range: 27.88448758259495 +PAIR t34/epsg:4289>epsg:26748 3 inv: Latitude is out of range: 1174443.6545701735 +PAIR t34/epsg:4289>epsg:26748 4 inv: Latitude is out of range: -1.5694796938130622E9 +PAIR t34/epsg:4322>epsg:26766 1 inv: Latitude is out of range: -2.4840145748126137 +PAIR t34/epsg:4322>epsg:26766 2 inv: Latitude is out of range: -57.69875974764535 +PAIR t34/epsg:4322>epsg:26766 3 inv: Latitude is out of range: 2.484069303878163 +PAIR t34/epsg:4322>epsg:26766 4 inv: Latitude is out of range: 57.700796400989596 +PAIR t34/epsg:4691>epsg:26795 1 inv: Latitude is out of range: -30.79009852440029 +PAIR t34/epsg:4691>epsg:26795 2 inv: Latitude is out of range: -1524.3518487672216 +PAIR t34/epsg:4691>epsg:26795 3 inv: Latitude is out of range: 30.842980392949602 +PAIR t34/epsg:4691>epsg:26795 4 inv: Latitude is out of range: 1529.5362267215494 +PAIR t34/epsg:4817>epsg:32007 0 inv: Latitude is out of range: 5695.859162060378 +PAIR t42/esri:104000>epsg:21418 0 inv: Latitude is out of range: -2482.0665971966396 +PAIR t42/esri:104000>epsg:21418 3 inv: Latitude is out of range: -3.8411061959530737 +PAIR t42/esri:4267>epsg:2044 0 inv: Latitude is out of range: -2481.398275820728 +PAIR t42/esri:4267>epsg:2044 3 inv: Latitude is out of range: -3.8458592335879533 +PAIR t42/esri:4267>epsg:2092 0 inv: Latitude is out of range: 2931.9147399254307 +PAIR t42/esri:4267>epsg:2092 4 inv: Latitude is out of range: 2.4541699037316516 +PAIR t43/epsg:4267>epsg:20009 0 inv: Latitude is out of range: 2924.4782164677135 +PAIR t43/epsg:4267>epsg:20009 4 inv: Latitude is out of range: 2.4516713830862518 +PAIR t43/epsg:4267>epsg:20079 0 inv: Latitude is out of range: 6717.158300257907 +PAIR t43/epsg:4267>epsg:20079 3 inv: Latitude is out of range: 2.9729595278368404 +PAIR t43/epsg:4267>epsg:2392 3 inv: Latitude is out of range: 204.9980246199294 +PAIR t43/esri:104000>epsg:20022 4 inv: Latitude is out of range: 6.060405609981295 +PAIR t43/esri:104000>epsg:20092 0 inv: Latitude is out of range: 21.64349689450469 +PAIR t43/esri:104000>epsg:20092 1 inv: Latitude is out of range: 1.968395082203215 +PAIR t43/esri:104000>epsg:20092 2 inv: Latitude is out of range: 1200.3184108041637 +PAIR t43/esri:104000>epsg:20092 3 inv: Latitude is out of range: 2.304231166914665 +PAIR t43/esri:104000>epsg:20092 4 inv: Latitude is out of range: 687.2659665481995 +PAIR t43/esri:104000>epsg:2468 0 inv: Latitude is out of range: 2924.4782164677194 +PAIR t43/esri:104000>epsg:2468 4 inv: Latitude is out of range: 2.451671383086256 +PAIR t43/esri:4267>epsg:20066 3 inv: Latitude is out of range: 3.937211867154893 +PAIR t43/esri:4267>epsg:2094 0 inv: Latitude is out of range: 284.28300206034953 +REG epsg:2082 3 inv: Latitude is out of range: -1.5744407331521189 +REG epsg:2082 4 inv: Latitude is out of range: -1.5743492179502356 +REG epsg:2083 3 inv: Latitude is out of range: -1.5740744845551815 +REG epsg:2083 4 inv: Latitude is out of range: -1.5738217942727228 +REG epsg:22191 3 inv: Latitude is out of range: -1.5738072720614482 +REG epsg:22191 4 inv: Latitude is out of range: -1.5741001870161433 +REG epsg:22192 3 inv: Latitude is out of range: -1.5738084411818603 +REG epsg:22192 4 inv: Latitude is out of range: -1.5740737314337603 +REG epsg:22193 3 inv: Latitude is out of range: -1.5738112351632638 +REG epsg:22193 4 inv: Latitude is out of range: -1.5740481851536159 +REG epsg:22194 3 inv: Latitude is out of range: -1.5738156465010618 +REG epsg:22194 4 inv: Latitude is out of range: -1.57402361736633 +REG epsg:22195 3 inv: Latitude is out of range: -1.5738216633470272 +REG epsg:22195 4 inv: Latitude is out of range: -1.5740000945545245 +REG epsg:22196 3 inv: Latitude is out of range: -1.573829269539133 +REG epsg:22196 4 inv: Latitude is out of range: -1.5739776803199754 +REG epsg:22197 3 inv: Latitude is out of range: -1.573838444642267 +REG epsg:22197 4 inv: Latitude is out of range: -1.5739564352187703 +REG epsg:3901 0 crs-tgt: vunits parameter is not supported +REG epsg:3901 1 crs-tgt: vunits parameter is not supported +REG epsg:3901 2 crs-tgt: vunits parameter is not supported +REG epsg:3901 3 crs-tgt: vunits parameter is not supported +REG epsg:3901 4 crs-tgt: vunits parameter is not supported +REG epsg:3902 0 crs-tgt: vunits parameter is not supported +REG epsg:3902 1 crs-tgt: vunits parameter is not supported +REG epsg:3902 2 crs-tgt: vunits parameter is not supported +REG epsg:3902 3 crs-tgt: vunits parameter is not supported +REG epsg:3902 4 crs-tgt: vunits parameter is not supported +REG epsg:3903 0 crs-tgt: vunits parameter is not supported +REG epsg:3903 1 crs-tgt: vunits parameter is not supported +REG epsg:3903 2 crs-tgt: vunits parameter is not supported +REG epsg:3903 3 crs-tgt: vunits parameter is not supported +REG epsg:3903 4 crs-tgt: vunits parameter is not supported +REG epsg:4097 0 crs-tgt: vunits parameter is not supported +REG epsg:4097 1 crs-tgt: vunits parameter is not supported +REG epsg:4097 2 crs-tgt: vunits parameter is not supported +REG epsg:4097 3 crs-tgt: vunits parameter is not supported +REG epsg:4097 4 crs-tgt: vunits parameter is not supported +REG epsg:4098 0 crs-tgt: vunits parameter is not supported +REG epsg:4098 1 crs-tgt: vunits parameter is not supported +REG epsg:4098 2 crs-tgt: vunits parameter is not supported +REG epsg:4098 3 crs-tgt: vunits parameter is not supported +REG epsg:4098 4 crs-tgt: vunits parameter is not supported +REG epsg:4099 0 crs-tgt: vunits parameter is not supported +REG epsg:4099 1 crs-tgt: vunits parameter is not supported +REG epsg:4099 2 crs-tgt: vunits parameter is not supported +REG epsg:4099 3 crs-tgt: vunits parameter is not supported +REG epsg:4099 4 crs-tgt: vunits parameter is not supported +REG epsg:4100 0 crs-tgt: vunits parameter is not supported +REG epsg:4100 1 crs-tgt: vunits parameter is not supported +REG epsg:4100 2 crs-tgt: vunits parameter is not supported +REG epsg:4100 3 crs-tgt: vunits parameter is not supported +REG epsg:4100 4 crs-tgt: vunits parameter is not supported +REG epsg:5318 0 crs-tgt: vunits parameter is not supported +REG epsg:5318 1 crs-tgt: vunits parameter is not supported +REG epsg:5318 2 crs-tgt: vunits parameter is not supported +REG epsg:5318 3 crs-tgt: vunits parameter is not supported +REG epsg:5318 4 crs-tgt: vunits parameter is not supported +REG epsg:5472 0 inv: Infinite longitude +REG epsg:5498 0 crs-tgt: geoidgrids parameter is not supported +REG epsg:5498 1 crs-tgt: geoidgrids parameter is not supported +REG epsg:5498 2 crs-tgt: geoidgrids parameter is not supported +REG epsg:5498 3 crs-tgt: geoidgrids parameter is not supported +REG epsg:5498 4 crs-tgt: geoidgrids parameter is not supported +REG epsg:5499 0 crs-tgt: geoidgrids parameter is not supported +REG epsg:5499 1 crs-tgt: geoidgrids parameter is not supported +REG epsg:5499 2 crs-tgt: geoidgrids parameter is not supported +REG epsg:5499 3 crs-tgt: geoidgrids parameter is not supported +REG epsg:5499 4 crs-tgt: geoidgrids parameter is not supported +REG epsg:5500 0 crs-tgt: geoidgrids parameter is not supported +REG epsg:5500 1 crs-tgt: geoidgrids parameter is not supported +REG epsg:5500 2 crs-tgt: geoidgrids parameter is not supported +REG epsg:5500 3 crs-tgt: geoidgrids parameter is not supported +REG epsg:5500 4 crs-tgt: geoidgrids parameter is not supported +REG epsg:5554 0 crs-tgt: vunits parameter is not supported +REG epsg:5554 1 crs-tgt: vunits parameter is not supported +REG epsg:5554 2 crs-tgt: vunits parameter is not supported +REG epsg:5554 3 crs-tgt: vunits parameter is not supported +REG epsg:5554 4 crs-tgt: vunits parameter is not supported +REG epsg:5555 0 crs-tgt: vunits parameter is not supported +REG epsg:5555 1 crs-tgt: vunits parameter is not supported +REG epsg:5555 2 crs-tgt: vunits parameter is not supported +REG epsg:5555 3 crs-tgt: vunits parameter is not supported +REG epsg:5555 4 crs-tgt: vunits parameter is not supported +REG epsg:5556 0 crs-tgt: vunits parameter is not supported +REG epsg:5556 1 crs-tgt: vunits parameter is not supported +REG epsg:5556 2 crs-tgt: vunits parameter is not supported +REG epsg:5556 3 crs-tgt: vunits parameter is not supported +REG epsg:5556 4 crs-tgt: vunits parameter is not supported +REG epsg:5598 0 crs-tgt: vunits parameter is not supported +REG epsg:5598 1 crs-tgt: vunits parameter is not supported +REG epsg:5598 2 crs-tgt: vunits parameter is not supported +REG epsg:5598 3 crs-tgt: vunits parameter is not supported +REG epsg:5598 4 crs-tgt: vunits parameter is not supported +REG epsg:5628 0 crs-tgt: vunits parameter is not supported +REG epsg:5628 1 crs-tgt: vunits parameter is not supported +REG epsg:5628 2 crs-tgt: vunits parameter is not supported +REG epsg:5628 3 crs-tgt: vunits parameter is not supported +REG epsg:5628 4 crs-tgt: vunits parameter is not supported +REG epsg:5698 0 crs-tgt: vunits parameter is not supported +REG epsg:5698 1 crs-tgt: vunits parameter is not supported +REG epsg:5698 2 crs-tgt: vunits parameter is not supported +REG epsg:5698 3 crs-tgt: vunits parameter is not supported +REG epsg:5698 4 crs-tgt: vunits parameter is not supported +REG epsg:5699 0 crs-tgt: vunits parameter is not supported +REG epsg:5699 1 crs-tgt: vunits parameter is not supported +REG epsg:5699 2 crs-tgt: vunits parameter is not supported +REG epsg:5699 3 crs-tgt: vunits parameter is not supported +REG epsg:5699 4 crs-tgt: vunits parameter is not supported +REG epsg:5707 0 crs-tgt: vunits parameter is not supported +REG epsg:5707 1 crs-tgt: vunits parameter is not supported +REG epsg:5707 2 crs-tgt: vunits parameter is not supported +REG epsg:5707 3 crs-tgt: vunits parameter is not supported +REG epsg:5707 4 crs-tgt: vunits parameter is not supported +REG epsg:5708 0 crs-tgt: vunits parameter is not supported +REG epsg:5708 1 crs-tgt: vunits parameter is not supported +REG epsg:5708 2 crs-tgt: vunits parameter is not supported +REG epsg:5708 3 crs-tgt: vunits parameter is not supported +REG epsg:5708 4 crs-tgt: vunits parameter is not supported +REG epsg:5832 0 crs-tgt: vunits parameter is not supported +REG epsg:5832 1 crs-tgt: vunits parameter is not supported +REG epsg:5832 2 crs-tgt: vunits parameter is not supported +REG epsg:5832 3 crs-tgt: vunits parameter is not supported +REG epsg:5832 4 crs-tgt: vunits parameter is not supported +REG epsg:5833 0 crs-tgt: vunits parameter is not supported +REG epsg:5833 1 crs-tgt: vunits parameter is not supported +REG epsg:5833 2 crs-tgt: vunits parameter is not supported +REG epsg:5833 3 crs-tgt: vunits parameter is not supported +REG epsg:5833 4 crs-tgt: vunits parameter is not supported +REG epsg:5834 0 crs-tgt: vunits parameter is not supported +REG epsg:5834 1 crs-tgt: vunits parameter is not supported +REG epsg:5834 2 crs-tgt: vunits parameter is not supported +REG epsg:5834 3 crs-tgt: vunits parameter is not supported +REG epsg:5834 4 crs-tgt: vunits parameter is not supported +REG epsg:5835 0 crs-tgt: vunits parameter is not supported +REG epsg:5835 1 crs-tgt: vunits parameter is not supported +REG epsg:5835 2 crs-tgt: vunits parameter is not supported +REG epsg:5835 3 crs-tgt: vunits parameter is not supported +REG epsg:5835 4 crs-tgt: vunits parameter is not supported +REG epsg:5845 0 crs-tgt: vunits parameter is not supported +REG epsg:5845 1 crs-tgt: vunits parameter is not supported +REG epsg:5845 2 crs-tgt: vunits parameter is not supported +REG epsg:5845 3 crs-tgt: vunits parameter is not supported +REG epsg:5845 4 crs-tgt: vunits parameter is not supported +REG epsg:5846 0 crs-tgt: vunits parameter is not supported +REG epsg:5846 1 crs-tgt: vunits parameter is not supported +REG epsg:5846 2 crs-tgt: vunits parameter is not supported +REG epsg:5846 3 crs-tgt: vunits parameter is not supported +REG epsg:5846 4 crs-tgt: vunits parameter is not supported +REG epsg:5847 0 crs-tgt: vunits parameter is not supported +REG epsg:5847 1 crs-tgt: vunits parameter is not supported +REG epsg:5847 2 crs-tgt: vunits parameter is not supported +REG epsg:5847 3 crs-tgt: vunits parameter is not supported +REG epsg:5847 4 crs-tgt: vunits parameter is not supported +REG epsg:5848 0 crs-tgt: vunits parameter is not supported +REG epsg:5848 1 crs-tgt: vunits parameter is not supported +REG epsg:5848 2 crs-tgt: vunits parameter is not supported +REG epsg:5848 3 crs-tgt: vunits parameter is not supported +REG epsg:5848 4 crs-tgt: vunits parameter is not supported +REG epsg:5849 0 crs-tgt: vunits parameter is not supported +REG epsg:5849 1 crs-tgt: vunits parameter is not supported +REG epsg:5849 2 crs-tgt: vunits parameter is not supported +REG epsg:5849 3 crs-tgt: vunits parameter is not supported +REG epsg:5849 4 crs-tgt: vunits parameter is not supported +REG epsg:5850 0 crs-tgt: vunits parameter is not supported +REG epsg:5850 1 crs-tgt: vunits parameter is not supported +REG epsg:5850 2 crs-tgt: vunits parameter is not supported +REG epsg:5850 3 crs-tgt: vunits parameter is not supported +REG epsg:5850 4 crs-tgt: vunits parameter is not supported +REG epsg:5851 0 crs-tgt: vunits parameter is not supported +REG epsg:5851 1 crs-tgt: vunits parameter is not supported +REG epsg:5851 2 crs-tgt: vunits parameter is not supported +REG epsg:5851 3 crs-tgt: vunits parameter is not supported +REG epsg:5851 4 crs-tgt: vunits parameter is not supported +REG epsg:5852 0 crs-tgt: vunits parameter is not supported +REG epsg:5852 1 crs-tgt: vunits parameter is not supported +REG epsg:5852 2 crs-tgt: vunits parameter is not supported +REG epsg:5852 3 crs-tgt: vunits parameter is not supported +REG epsg:5852 4 crs-tgt: vunits parameter is not supported +REG epsg:5853 0 crs-tgt: vunits parameter is not supported +REG epsg:5853 1 crs-tgt: vunits parameter is not supported +REG epsg:5853 2 crs-tgt: vunits parameter is not supported +REG epsg:5853 3 crs-tgt: vunits parameter is not supported +REG epsg:5853 4 crs-tgt: vunits parameter is not supported +REG epsg:5854 0 crs-tgt: vunits parameter is not supported +REG epsg:5854 1 crs-tgt: vunits parameter is not supported +REG epsg:5854 2 crs-tgt: vunits parameter is not supported +REG epsg:5854 3 crs-tgt: vunits parameter is not supported +REG epsg:5854 4 crs-tgt: vunits parameter is not supported +REG epsg:5855 0 crs-tgt: vunits parameter is not supported +REG epsg:5855 1 crs-tgt: vunits parameter is not supported +REG epsg:5855 2 crs-tgt: vunits parameter is not supported +REG epsg:5855 3 crs-tgt: vunits parameter is not supported +REG epsg:5855 4 crs-tgt: vunits parameter is not supported +REG epsg:5856 0 crs-tgt: vunits parameter is not supported +REG epsg:5856 1 crs-tgt: vunits parameter is not supported +REG epsg:5856 2 crs-tgt: vunits parameter is not supported +REG epsg:5856 3 crs-tgt: vunits parameter is not supported +REG epsg:5856 4 crs-tgt: vunits parameter is not supported +REG epsg:5857 0 crs-tgt: vunits parameter is not supported +REG epsg:5857 1 crs-tgt: vunits parameter is not supported +REG epsg:5857 2 crs-tgt: vunits parameter is not supported +REG epsg:5857 3 crs-tgt: vunits parameter is not supported +REG epsg:5857 4 crs-tgt: vunits parameter is not supported +REG epsg:5942 0 crs-tgt: vunits parameter is not supported +REG epsg:5942 1 crs-tgt: vunits parameter is not supported +REG epsg:5942 2 crs-tgt: vunits parameter is not supported +REG epsg:5942 3 crs-tgt: vunits parameter is not supported +REG epsg:5942 4 crs-tgt: vunits parameter is not supported +REG epsg:5945 0 crs-tgt: vunits parameter is not supported +REG epsg:5945 1 crs-tgt: vunits parameter is not supported +REG epsg:5945 2 crs-tgt: vunits parameter is not supported +REG epsg:5945 3 crs-tgt: vunits parameter is not supported +REG epsg:5945 4 crs-tgt: vunits parameter is not supported +REG epsg:5946 0 crs-tgt: vunits parameter is not supported +REG epsg:5946 1 crs-tgt: vunits parameter is not supported +REG epsg:5946 2 crs-tgt: vunits parameter is not supported +REG epsg:5946 3 crs-tgt: vunits parameter is not supported +REG epsg:5946 4 crs-tgt: vunits parameter is not supported +REG epsg:5947 0 crs-tgt: vunits parameter is not supported +REG epsg:5947 1 crs-tgt: vunits parameter is not supported +REG epsg:5947 2 crs-tgt: vunits parameter is not supported +REG epsg:5947 3 crs-tgt: vunits parameter is not supported +REG epsg:5947 4 crs-tgt: vunits parameter is not supported +REG epsg:5948 0 crs-tgt: vunits parameter is not supported +REG epsg:5948 1 crs-tgt: vunits parameter is not supported +REG epsg:5948 2 crs-tgt: vunits parameter is not supported +REG epsg:5948 3 crs-tgt: vunits parameter is not supported +REG epsg:5948 4 crs-tgt: vunits parameter is not supported +REG epsg:5949 0 crs-tgt: vunits parameter is not supported +REG epsg:5949 1 crs-tgt: vunits parameter is not supported +REG epsg:5949 2 crs-tgt: vunits parameter is not supported +REG epsg:5949 3 crs-tgt: vunits parameter is not supported +REG epsg:5949 4 crs-tgt: vunits parameter is not supported +REG epsg:5950 0 crs-tgt: vunits parameter is not supported +REG epsg:5950 1 crs-tgt: vunits parameter is not supported +REG epsg:5950 2 crs-tgt: vunits parameter is not supported +REG epsg:5950 3 crs-tgt: vunits parameter is not supported +REG epsg:5950 4 crs-tgt: vunits parameter is not supported +REG epsg:5951 0 crs-tgt: vunits parameter is not supported +REG epsg:5951 1 crs-tgt: vunits parameter is not supported +REG epsg:5951 2 crs-tgt: vunits parameter is not supported +REG epsg:5951 3 crs-tgt: vunits parameter is not supported +REG epsg:5951 4 crs-tgt: vunits parameter is not supported +REG epsg:5952 0 crs-tgt: vunits parameter is not supported +REG epsg:5952 1 crs-tgt: vunits parameter is not supported +REG epsg:5952 2 crs-tgt: vunits parameter is not supported +REG epsg:5952 3 crs-tgt: vunits parameter is not supported +REG epsg:5952 4 crs-tgt: vunits parameter is not supported +REG epsg:5953 0 crs-tgt: vunits parameter is not supported +REG epsg:5953 1 crs-tgt: vunits parameter is not supported +REG epsg:5953 2 crs-tgt: vunits parameter is not supported +REG epsg:5953 3 crs-tgt: vunits parameter is not supported +REG epsg:5953 4 crs-tgt: vunits parameter is not supported +REG epsg:5954 0 crs-tgt: vunits parameter is not supported +REG epsg:5954 1 crs-tgt: vunits parameter is not supported +REG epsg:5954 2 crs-tgt: vunits parameter is not supported +REG epsg:5954 3 crs-tgt: vunits parameter is not supported +REG epsg:5954 4 crs-tgt: vunits parameter is not supported +REG epsg:5955 0 crs-tgt: vunits parameter is not supported +REG epsg:5955 1 crs-tgt: vunits parameter is not supported +REG epsg:5955 2 crs-tgt: vunits parameter is not supported +REG epsg:5955 3 crs-tgt: vunits parameter is not supported +REG epsg:5955 4 crs-tgt: vunits parameter is not supported +REG epsg:5956 0 crs-tgt: vunits parameter is not supported +REG epsg:5956 1 crs-tgt: vunits parameter is not supported +REG epsg:5956 2 crs-tgt: vunits parameter is not supported +REG epsg:5956 3 crs-tgt: vunits parameter is not supported +REG epsg:5956 4 crs-tgt: vunits parameter is not supported +REG epsg:5957 0 crs-tgt: vunits parameter is not supported +REG epsg:5957 1 crs-tgt: vunits parameter is not supported +REG epsg:5957 2 crs-tgt: vunits parameter is not supported +REG epsg:5957 3 crs-tgt: vunits parameter is not supported +REG epsg:5957 4 crs-tgt: vunits parameter is not supported +REG epsg:5958 0 crs-tgt: vunits parameter is not supported +REG epsg:5958 1 crs-tgt: vunits parameter is not supported +REG epsg:5958 2 crs-tgt: vunits parameter is not supported +REG epsg:5958 3 crs-tgt: vunits parameter is not supported +REG epsg:5958 4 crs-tgt: vunits parameter is not supported +REG epsg:5959 0 crs-tgt: vunits parameter is not supported +REG epsg:5959 1 crs-tgt: vunits parameter is not supported +REG epsg:5959 2 crs-tgt: vunits parameter is not supported +REG epsg:5959 3 crs-tgt: vunits parameter is not supported +REG epsg:5959 4 crs-tgt: vunits parameter is not supported +REG epsg:5960 0 crs-tgt: vunits parameter is not supported +REG epsg:5960 1 crs-tgt: vunits parameter is not supported +REG epsg:5960 2 crs-tgt: vunits parameter is not supported +REG epsg:5960 3 crs-tgt: vunits parameter is not supported +REG epsg:5960 4 crs-tgt: vunits parameter is not supported +REG epsg:5961 0 crs-tgt: vunits parameter is not supported +REG epsg:5961 1 crs-tgt: vunits parameter is not supported +REG epsg:5961 2 crs-tgt: vunits parameter is not supported +REG epsg:5961 3 crs-tgt: vunits parameter is not supported +REG epsg:5961 4 crs-tgt: vunits parameter is not supported +REG epsg:5962 0 crs-tgt: vunits parameter is not supported +REG epsg:5962 1 crs-tgt: vunits parameter is not supported +REG epsg:5962 2 crs-tgt: vunits parameter is not supported +REG epsg:5962 3 crs-tgt: vunits parameter is not supported +REG epsg:5962 4 crs-tgt: vunits parameter is not supported +REG epsg:5963 0 crs-tgt: vunits parameter is not supported +REG epsg:5963 1 crs-tgt: vunits parameter is not supported +REG epsg:5963 2 crs-tgt: vunits parameter is not supported +REG epsg:5963 3 crs-tgt: vunits parameter is not supported +REG epsg:5963 4 crs-tgt: vunits parameter is not supported +REG epsg:5964 0 crs-tgt: vunits parameter is not supported +REG epsg:5964 1 crs-tgt: vunits parameter is not supported +REG epsg:5964 2 crs-tgt: vunits parameter is not supported +REG epsg:5964 3 crs-tgt: vunits parameter is not supported +REG epsg:5964 4 crs-tgt: vunits parameter is not supported +REG epsg:5965 0 crs-tgt: vunits parameter is not supported +REG epsg:5965 1 crs-tgt: vunits parameter is not supported +REG epsg:5965 2 crs-tgt: vunits parameter is not supported +REG epsg:5965 3 crs-tgt: vunits parameter is not supported +REG epsg:5965 4 crs-tgt: vunits parameter is not supported +REG epsg:5966 0 crs-tgt: vunits parameter is not supported +REG epsg:5966 1 crs-tgt: vunits parameter is not supported +REG epsg:5966 2 crs-tgt: vunits parameter is not supported +REG epsg:5966 3 crs-tgt: vunits parameter is not supported +REG epsg:5966 4 crs-tgt: vunits parameter is not supported +REG epsg:5967 0 crs-tgt: vunits parameter is not supported +REG epsg:5967 1 crs-tgt: vunits parameter is not supported +REG epsg:5967 2 crs-tgt: vunits parameter is not supported +REG epsg:5967 3 crs-tgt: vunits parameter is not supported +REG epsg:5967 4 crs-tgt: vunits parameter is not supported +REG epsg:5968 0 crs-tgt: vunits parameter is not supported +REG epsg:5968 1 crs-tgt: vunits parameter is not supported +REG epsg:5968 2 crs-tgt: vunits parameter is not supported +REG epsg:5968 3 crs-tgt: vunits parameter is not supported +REG epsg:5968 4 crs-tgt: vunits parameter is not supported +REG epsg:5969 0 crs-tgt: vunits parameter is not supported +REG epsg:5969 1 crs-tgt: vunits parameter is not supported +REG epsg:5969 2 crs-tgt: vunits parameter is not supported +REG epsg:5969 3 crs-tgt: vunits parameter is not supported +REG epsg:5969 4 crs-tgt: vunits parameter is not supported +REG epsg:5970 0 crs-tgt: vunits parameter is not supported +REG epsg:5970 1 crs-tgt: vunits parameter is not supported +REG epsg:5970 2 crs-tgt: vunits parameter is not supported +REG epsg:5970 3 crs-tgt: vunits parameter is not supported +REG epsg:5970 4 crs-tgt: vunits parameter is not supported +REG epsg:5971 0 crs-tgt: vunits parameter is not supported +REG epsg:5971 1 crs-tgt: vunits parameter is not supported +REG epsg:5971 2 crs-tgt: vunits parameter is not supported +REG epsg:5971 3 crs-tgt: vunits parameter is not supported +REG epsg:5971 4 crs-tgt: vunits parameter is not supported +REG epsg:5972 0 crs-tgt: vunits parameter is not supported +REG epsg:5972 1 crs-tgt: vunits parameter is not supported +REG epsg:5972 2 crs-tgt: vunits parameter is not supported +REG epsg:5972 3 crs-tgt: vunits parameter is not supported +REG epsg:5972 4 crs-tgt: vunits parameter is not supported +REG epsg:5973 0 crs-tgt: vunits parameter is not supported +REG epsg:5973 1 crs-tgt: vunits parameter is not supported +REG epsg:5973 2 crs-tgt: vunits parameter is not supported +REG epsg:5973 3 crs-tgt: vunits parameter is not supported +REG epsg:5973 4 crs-tgt: vunits parameter is not supported +REG epsg:5974 0 crs-tgt: vunits parameter is not supported +REG epsg:5974 1 crs-tgt: vunits parameter is not supported +REG epsg:5974 2 crs-tgt: vunits parameter is not supported +REG epsg:5974 3 crs-tgt: vunits parameter is not supported +REG epsg:5974 4 crs-tgt: vunits parameter is not supported +REG epsg:5975 0 crs-tgt: vunits parameter is not supported +REG epsg:5975 1 crs-tgt: vunits parameter is not supported +REG epsg:5975 2 crs-tgt: vunits parameter is not supported +REG epsg:5975 3 crs-tgt: vunits parameter is not supported +REG epsg:5975 4 crs-tgt: vunits parameter is not supported +REG epsg:5976 0 crs-tgt: vunits parameter is not supported +REG epsg:5976 1 crs-tgt: vunits parameter is not supported +REG epsg:5976 2 crs-tgt: vunits parameter is not supported +REG epsg:5976 3 crs-tgt: vunits parameter is not supported +REG epsg:5976 4 crs-tgt: vunits parameter is not supported +REG epsg:6144 0 crs-tgt: vunits parameter is not supported +REG epsg:6144 1 crs-tgt: vunits parameter is not supported +REG epsg:6144 2 crs-tgt: vunits parameter is not supported +REG epsg:6144 3 crs-tgt: vunits parameter is not supported +REG epsg:6144 4 crs-tgt: vunits parameter is not supported +REG epsg:6145 0 crs-tgt: vunits parameter is not supported +REG epsg:6145 1 crs-tgt: vunits parameter is not supported +REG epsg:6145 2 crs-tgt: vunits parameter is not supported +REG epsg:6145 3 crs-tgt: vunits parameter is not supported +REG epsg:6145 4 crs-tgt: vunits parameter is not supported +REG epsg:6146 0 crs-tgt: vunits parameter is not supported +REG epsg:6146 1 crs-tgt: vunits parameter is not supported +REG epsg:6146 2 crs-tgt: vunits parameter is not supported +REG epsg:6146 3 crs-tgt: vunits parameter is not supported +REG epsg:6146 4 crs-tgt: vunits parameter is not supported +REG epsg:6147 0 crs-tgt: vunits parameter is not supported +REG epsg:6147 1 crs-tgt: vunits parameter is not supported +REG epsg:6147 2 crs-tgt: vunits parameter is not supported +REG epsg:6147 3 crs-tgt: vunits parameter is not supported +REG epsg:6147 4 crs-tgt: vunits parameter is not supported +REG epsg:6148 0 crs-tgt: vunits parameter is not supported +REG epsg:6148 1 crs-tgt: vunits parameter is not supported +REG epsg:6148 2 crs-tgt: vunits parameter is not supported +REG epsg:6148 3 crs-tgt: vunits parameter is not supported +REG epsg:6148 4 crs-tgt: vunits parameter is not supported +REG epsg:6149 0 crs-tgt: vunits parameter is not supported +REG epsg:6149 1 crs-tgt: vunits parameter is not supported +REG epsg:6149 2 crs-tgt: vunits parameter is not supported +REG epsg:6149 3 crs-tgt: vunits parameter is not supported +REG epsg:6149 4 crs-tgt: vunits parameter is not supported +REG epsg:6150 0 crs-tgt: vunits parameter is not supported +REG epsg:6150 1 crs-tgt: vunits parameter is not supported +REG epsg:6150 2 crs-tgt: vunits parameter is not supported +REG epsg:6150 3 crs-tgt: vunits parameter is not supported +REG epsg:6150 4 crs-tgt: vunits parameter is not supported +REG epsg:6151 0 crs-tgt: vunits parameter is not supported +REG epsg:6151 1 crs-tgt: vunits parameter is not supported +REG epsg:6151 2 crs-tgt: vunits parameter is not supported +REG epsg:6151 3 crs-tgt: vunits parameter is not supported +REG epsg:6151 4 crs-tgt: vunits parameter is not supported +REG epsg:6152 0 crs-tgt: vunits parameter is not supported +REG epsg:6152 1 crs-tgt: vunits parameter is not supported +REG epsg:6152 2 crs-tgt: vunits parameter is not supported +REG epsg:6152 3 crs-tgt: vunits parameter is not supported +REG epsg:6152 4 crs-tgt: vunits parameter is not supported +REG epsg:6153 0 crs-tgt: vunits parameter is not supported +REG epsg:6153 1 crs-tgt: vunits parameter is not supported +REG epsg:6153 2 crs-tgt: vunits parameter is not supported +REG epsg:6153 3 crs-tgt: vunits parameter is not supported +REG epsg:6153 4 crs-tgt: vunits parameter is not supported +REG epsg:6154 0 crs-tgt: vunits parameter is not supported +REG epsg:6154 1 crs-tgt: vunits parameter is not supported +REG epsg:6154 2 crs-tgt: vunits parameter is not supported +REG epsg:6154 3 crs-tgt: vunits parameter is not supported +REG epsg:6154 4 crs-tgt: vunits parameter is not supported +REG epsg:6155 0 crs-tgt: vunits parameter is not supported +REG epsg:6155 1 crs-tgt: vunits parameter is not supported +REG epsg:6155 2 crs-tgt: vunits parameter is not supported +REG epsg:6155 3 crs-tgt: vunits parameter is not supported +REG epsg:6155 4 crs-tgt: vunits parameter is not supported +REG epsg:6156 0 crs-tgt: vunits parameter is not supported +REG epsg:6156 1 crs-tgt: vunits parameter is not supported +REG epsg:6156 2 crs-tgt: vunits parameter is not supported +REG epsg:6156 3 crs-tgt: vunits parameter is not supported +REG epsg:6156 4 crs-tgt: vunits parameter is not supported +REG epsg:6157 0 crs-tgt: vunits parameter is not supported +REG epsg:6157 1 crs-tgt: vunits parameter is not supported +REG epsg:6157 2 crs-tgt: vunits parameter is not supported +REG epsg:6157 3 crs-tgt: vunits parameter is not supported +REG epsg:6157 4 crs-tgt: vunits parameter is not supported +REG epsg:6158 0 crs-tgt: vunits parameter is not supported +REG epsg:6158 1 crs-tgt: vunits parameter is not supported +REG epsg:6158 2 crs-tgt: vunits parameter is not supported +REG epsg:6158 3 crs-tgt: vunits parameter is not supported +REG epsg:6158 4 crs-tgt: vunits parameter is not supported +REG epsg:6159 0 crs-tgt: vunits parameter is not supported +REG epsg:6159 1 crs-tgt: vunits parameter is not supported +REG epsg:6159 2 crs-tgt: vunits parameter is not supported +REG epsg:6159 3 crs-tgt: vunits parameter is not supported +REG epsg:6159 4 crs-tgt: vunits parameter is not supported +REG epsg:6160 0 crs-tgt: vunits parameter is not supported +REG epsg:6160 1 crs-tgt: vunits parameter is not supported +REG epsg:6160 2 crs-tgt: vunits parameter is not supported +REG epsg:6160 3 crs-tgt: vunits parameter is not supported +REG epsg:6160 4 crs-tgt: vunits parameter is not supported +REG epsg:6161 0 crs-tgt: vunits parameter is not supported +REG epsg:6161 1 crs-tgt: vunits parameter is not supported +REG epsg:6161 2 crs-tgt: vunits parameter is not supported +REG epsg:6161 3 crs-tgt: vunits parameter is not supported +REG epsg:6161 4 crs-tgt: vunits parameter is not supported +REG epsg:6162 0 crs-tgt: vunits parameter is not supported +REG epsg:6162 1 crs-tgt: vunits parameter is not supported +REG epsg:6162 2 crs-tgt: vunits parameter is not supported +REG epsg:6162 3 crs-tgt: vunits parameter is not supported +REG epsg:6162 4 crs-tgt: vunits parameter is not supported +REG epsg:6163 0 crs-tgt: vunits parameter is not supported +REG epsg:6163 1 crs-tgt: vunits parameter is not supported +REG epsg:6163 2 crs-tgt: vunits parameter is not supported +REG epsg:6163 3 crs-tgt: vunits parameter is not supported +REG epsg:6163 4 crs-tgt: vunits parameter is not supported +REG epsg:6164 0 crs-tgt: vunits parameter is not supported +REG epsg:6164 1 crs-tgt: vunits parameter is not supported +REG epsg:6164 2 crs-tgt: vunits parameter is not supported +REG epsg:6164 3 crs-tgt: vunits parameter is not supported +REG epsg:6164 4 crs-tgt: vunits parameter is not supported +REG epsg:6165 0 crs-tgt: vunits parameter is not supported +REG epsg:6165 1 crs-tgt: vunits parameter is not supported +REG epsg:6165 2 crs-tgt: vunits parameter is not supported +REG epsg:6165 3 crs-tgt: vunits parameter is not supported +REG epsg:6165 4 crs-tgt: vunits parameter is not supported +REG epsg:6166 0 crs-tgt: vunits parameter is not supported +REG epsg:6166 1 crs-tgt: vunits parameter is not supported +REG epsg:6166 2 crs-tgt: vunits parameter is not supported +REG epsg:6166 3 crs-tgt: vunits parameter is not supported +REG epsg:6166 4 crs-tgt: vunits parameter is not supported +REG epsg:6167 0 crs-tgt: vunits parameter is not supported +REG epsg:6167 1 crs-tgt: vunits parameter is not supported +REG epsg:6167 2 crs-tgt: vunits parameter is not supported +REG epsg:6167 3 crs-tgt: vunits parameter is not supported +REG epsg:6167 4 crs-tgt: vunits parameter is not supported +REG epsg:6168 0 crs-tgt: vunits parameter is not supported +REG epsg:6168 1 crs-tgt: vunits parameter is not supported +REG epsg:6168 2 crs-tgt: vunits parameter is not supported +REG epsg:6168 3 crs-tgt: vunits parameter is not supported +REG epsg:6168 4 crs-tgt: vunits parameter is not supported +REG epsg:6169 0 crs-tgt: vunits parameter is not supported +REG epsg:6169 1 crs-tgt: vunits parameter is not supported +REG epsg:6169 2 crs-tgt: vunits parameter is not supported +REG epsg:6169 3 crs-tgt: vunits parameter is not supported +REG epsg:6169 4 crs-tgt: vunits parameter is not supported +REG epsg:6170 0 crs-tgt: vunits parameter is not supported +REG epsg:6170 1 crs-tgt: vunits parameter is not supported +REG epsg:6170 2 crs-tgt: vunits parameter is not supported +REG epsg:6170 3 crs-tgt: vunits parameter is not supported +REG epsg:6170 4 crs-tgt: vunits parameter is not supported +REG epsg:6171 0 crs-tgt: vunits parameter is not supported +REG epsg:6171 1 crs-tgt: vunits parameter is not supported +REG epsg:6171 2 crs-tgt: vunits parameter is not supported +REG epsg:6171 3 crs-tgt: vunits parameter is not supported +REG epsg:6171 4 crs-tgt: vunits parameter is not supported +REG epsg:6172 0 crs-tgt: vunits parameter is not supported +REG epsg:6172 1 crs-tgt: vunits parameter is not supported +REG epsg:6172 2 crs-tgt: vunits parameter is not supported +REG epsg:6172 3 crs-tgt: vunits parameter is not supported +REG epsg:6172 4 crs-tgt: vunits parameter is not supported +REG epsg:6173 0 crs-tgt: vunits parameter is not supported +REG epsg:6173 1 crs-tgt: vunits parameter is not supported +REG epsg:6173 2 crs-tgt: vunits parameter is not supported +REG epsg:6173 3 crs-tgt: vunits parameter is not supported +REG epsg:6173 4 crs-tgt: vunits parameter is not supported +REG epsg:6174 0 crs-tgt: vunits parameter is not supported +REG epsg:6174 1 crs-tgt: vunits parameter is not supported +REG epsg:6174 2 crs-tgt: vunits parameter is not supported +REG epsg:6174 3 crs-tgt: vunits parameter is not supported +REG epsg:6174 4 crs-tgt: vunits parameter is not supported +REG epsg:6175 0 crs-tgt: vunits parameter is not supported +REG epsg:6175 1 crs-tgt: vunits parameter is not supported +REG epsg:6175 2 crs-tgt: vunits parameter is not supported +REG epsg:6175 3 crs-tgt: vunits parameter is not supported +REG epsg:6175 4 crs-tgt: vunits parameter is not supported +REG epsg:6176 0 crs-tgt: vunits parameter is not supported +REG epsg:6176 1 crs-tgt: vunits parameter is not supported +REG epsg:6176 2 crs-tgt: vunits parameter is not supported +REG epsg:6176 3 crs-tgt: vunits parameter is not supported +REG epsg:6176 4 crs-tgt: vunits parameter is not supported +REG epsg:6190 0 crs-tgt: vunits parameter is not supported +REG epsg:6190 1 crs-tgt: vunits parameter is not supported +REG epsg:6190 2 crs-tgt: vunits parameter is not supported +REG epsg:6190 3 crs-tgt: vunits parameter is not supported +REG epsg:6190 4 crs-tgt: vunits parameter is not supported +REG epsg:6349 0 crs-tgt: geoidgrids parameter is not supported +REG epsg:6349 1 crs-tgt: geoidgrids parameter is not supported +REG epsg:6349 2 crs-tgt: geoidgrids parameter is not supported +REG epsg:6349 3 crs-tgt: geoidgrids parameter is not supported +REG epsg:6349 4 crs-tgt: geoidgrids parameter is not supported +REG epsg:6649 0 crs-tgt: vunits parameter is not supported +REG epsg:6649 1 crs-tgt: vunits parameter is not supported +REG epsg:6649 2 crs-tgt: vunits parameter is not supported +REG epsg:6649 3 crs-tgt: vunits parameter is not supported +REG epsg:6649 4 crs-tgt: vunits parameter is not supported +REG epsg:6650 0 crs-tgt: vunits parameter is not supported +REG epsg:6650 1 crs-tgt: vunits parameter is not supported +REG epsg:6650 2 crs-tgt: vunits parameter is not supported +REG epsg:6650 3 crs-tgt: vunits parameter is not supported +REG epsg:6650 4 crs-tgt: vunits parameter is not supported +REG epsg:6651 0 crs-tgt: vunits parameter is not supported +REG epsg:6651 1 crs-tgt: vunits parameter is not supported +REG epsg:6651 2 crs-tgt: vunits parameter is not supported +REG epsg:6651 3 crs-tgt: vunits parameter is not supported +REG epsg:6651 4 crs-tgt: vunits parameter is not supported +REG epsg:6652 0 crs-tgt: vunits parameter is not supported +REG epsg:6652 1 crs-tgt: vunits parameter is not supported +REG epsg:6652 2 crs-tgt: vunits parameter is not supported +REG epsg:6652 3 crs-tgt: vunits parameter is not supported +REG epsg:6652 4 crs-tgt: vunits parameter is not supported +REG epsg:6653 0 crs-tgt: vunits parameter is not supported +REG epsg:6653 1 crs-tgt: vunits parameter is not supported +REG epsg:6653 2 crs-tgt: vunits parameter is not supported +REG epsg:6653 3 crs-tgt: vunits parameter is not supported +REG epsg:6653 4 crs-tgt: vunits parameter is not supported +REG epsg:6654 0 crs-tgt: vunits parameter is not supported +REG epsg:6654 1 crs-tgt: vunits parameter is not supported +REG epsg:6654 2 crs-tgt: vunits parameter is not supported +REG epsg:6654 3 crs-tgt: vunits parameter is not supported +REG epsg:6654 4 crs-tgt: vunits parameter is not supported +REG epsg:6655 0 crs-tgt: vunits parameter is not supported +REG epsg:6655 1 crs-tgt: vunits parameter is not supported +REG epsg:6655 2 crs-tgt: vunits parameter is not supported +REG epsg:6655 3 crs-tgt: vunits parameter is not supported +REG epsg:6655 4 crs-tgt: vunits parameter is not supported +REG epsg:6656 0 crs-tgt: vunits parameter is not supported +REG epsg:6656 1 crs-tgt: vunits parameter is not supported +REG epsg:6656 2 crs-tgt: vunits parameter is not supported +REG epsg:6656 3 crs-tgt: vunits parameter is not supported +REG epsg:6656 4 crs-tgt: vunits parameter is not supported +REG epsg:6657 0 crs-tgt: vunits parameter is not supported +REG epsg:6657 1 crs-tgt: vunits parameter is not supported +REG epsg:6657 2 crs-tgt: vunits parameter is not supported +REG epsg:6657 3 crs-tgt: vunits parameter is not supported +REG epsg:6657 4 crs-tgt: vunits parameter is not supported +REG epsg:6658 0 crs-tgt: vunits parameter is not supported +REG epsg:6658 1 crs-tgt: vunits parameter is not supported +REG epsg:6658 2 crs-tgt: vunits parameter is not supported +REG epsg:6658 3 crs-tgt: vunits parameter is not supported +REG epsg:6658 4 crs-tgt: vunits parameter is not supported +REG epsg:6659 0 crs-tgt: vunits parameter is not supported +REG epsg:6659 1 crs-tgt: vunits parameter is not supported +REG epsg:6659 2 crs-tgt: vunits parameter is not supported +REG epsg:6659 3 crs-tgt: vunits parameter is not supported +REG epsg:6659 4 crs-tgt: vunits parameter is not supported +REG epsg:6660 0 crs-tgt: vunits parameter is not supported +REG epsg:6660 1 crs-tgt: vunits parameter is not supported +REG epsg:6660 2 crs-tgt: vunits parameter is not supported +REG epsg:6660 3 crs-tgt: vunits parameter is not supported +REG epsg:6660 4 crs-tgt: vunits parameter is not supported +REG epsg:6661 0 crs-tgt: vunits parameter is not supported +REG epsg:6661 1 crs-tgt: vunits parameter is not supported +REG epsg:6661 2 crs-tgt: vunits parameter is not supported +REG epsg:6661 3 crs-tgt: vunits parameter is not supported +REG epsg:6661 4 crs-tgt: vunits parameter is not supported +REG epsg:6662 0 crs-tgt: vunits parameter is not supported +REG epsg:6662 1 crs-tgt: vunits parameter is not supported +REG epsg:6662 2 crs-tgt: vunits parameter is not supported +REG epsg:6662 3 crs-tgt: vunits parameter is not supported +REG epsg:6662 4 crs-tgt: vunits parameter is not supported +REG epsg:6663 0 crs-tgt: vunits parameter is not supported +REG epsg:6663 1 crs-tgt: vunits parameter is not supported +REG epsg:6663 2 crs-tgt: vunits parameter is not supported +REG epsg:6663 3 crs-tgt: vunits parameter is not supported +REG epsg:6663 4 crs-tgt: vunits parameter is not supported +REG epsg:6664 0 crs-tgt: vunits parameter is not supported +REG epsg:6664 1 crs-tgt: vunits parameter is not supported +REG epsg:6664 2 crs-tgt: vunits parameter is not supported +REG epsg:6664 3 crs-tgt: vunits parameter is not supported +REG epsg:6664 4 crs-tgt: vunits parameter is not supported +REG epsg:6665 0 crs-tgt: vunits parameter is not supported +REG epsg:6665 1 crs-tgt: vunits parameter is not supported +REG epsg:6665 2 crs-tgt: vunits parameter is not supported +REG epsg:6665 3 crs-tgt: vunits parameter is not supported +REG epsg:6665 4 crs-tgt: vunits parameter is not supported +REG epsg:6696 0 crs-tgt: vunits parameter is not supported +REG epsg:6696 1 crs-tgt: vunits parameter is not supported +REG epsg:6696 2 crs-tgt: vunits parameter is not supported +REG epsg:6696 3 crs-tgt: vunits parameter is not supported +REG epsg:6696 4 crs-tgt: vunits parameter is not supported +REG epsg:6697 0 crs-tgt: vunits parameter is not supported +REG epsg:6697 1 crs-tgt: vunits parameter is not supported +REG epsg:6697 2 crs-tgt: vunits parameter is not supported +REG epsg:6697 3 crs-tgt: vunits parameter is not supported +REG epsg:6697 4 crs-tgt: vunits parameter is not supported +REG epsg:6700 0 crs-tgt: vunits parameter is not supported +REG epsg:6700 1 crs-tgt: vunits parameter is not supported +REG epsg:6700 2 crs-tgt: vunits parameter is not supported +REG epsg:6700 3 crs-tgt: vunits parameter is not supported +REG epsg:6700 4 crs-tgt: vunits parameter is not supported +REG epsg:6871 0 crs-tgt: geoidgrids parameter is not supported +REG epsg:6871 1 crs-tgt: geoidgrids parameter is not supported +REG epsg:6871 2 crs-tgt: geoidgrids parameter is not supported +REG epsg:6871 3 crs-tgt: geoidgrids parameter is not supported +REG epsg:6871 4 crs-tgt: geoidgrids parameter is not supported +REG epsg:6893 0 crs-tgt: geoidgrids parameter is not supported +REG epsg:6893 1 crs-tgt: geoidgrids parameter is not supported +REG epsg:6893 2 crs-tgt: geoidgrids parameter is not supported +REG epsg:6893 3 crs-tgt: geoidgrids parameter is not supported +REG epsg:6893 4 crs-tgt: geoidgrids parameter is not supported +REG epsg:6917 0 crs-tgt: vunits parameter is not supported +REG epsg:6917 1 crs-tgt: vunits parameter is not supported +REG epsg:6917 2 crs-tgt: vunits parameter is not supported +REG epsg:6917 3 crs-tgt: vunits parameter is not supported +REG epsg:6917 4 crs-tgt: vunits parameter is not supported +REG epsg:6927 0 crs-tgt: vunits parameter is not supported +REG epsg:6927 1 crs-tgt: vunits parameter is not supported +REG epsg:6927 2 crs-tgt: vunits parameter is not supported +REG epsg:6927 3 crs-tgt: vunits parameter is not supported +REG epsg:6927 4 crs-tgt: vunits parameter is not supported +REG epsg:7400 0 crs-tgt: vunits parameter is not supported +REG epsg:7400 1 crs-tgt: vunits parameter is not supported +REG epsg:7400 2 crs-tgt: vunits parameter is not supported +REG epsg:7400 3 crs-tgt: vunits parameter is not supported +REG epsg:7400 4 crs-tgt: vunits parameter is not supported +REG epsg:7401 0 crs-tgt: vunits parameter is not supported +REG epsg:7401 1 crs-tgt: vunits parameter is not supported +REG epsg:7401 2 crs-tgt: vunits parameter is not supported +REG epsg:7401 3 crs-tgt: vunits parameter is not supported +REG epsg:7401 4 crs-tgt: vunits parameter is not supported +REG epsg:7402 0 crs-tgt: vunits parameter is not supported +REG epsg:7402 1 crs-tgt: vunits parameter is not supported +REG epsg:7402 2 crs-tgt: vunits parameter is not supported +REG epsg:7402 3 crs-tgt: vunits parameter is not supported +REG epsg:7402 4 crs-tgt: vunits parameter is not supported +REG epsg:7403 0 crs-tgt: vunits parameter is not supported +REG epsg:7403 1 crs-tgt: vunits parameter is not supported +REG epsg:7403 2 crs-tgt: vunits parameter is not supported +REG epsg:7403 3 crs-tgt: vunits parameter is not supported +REG epsg:7403 4 crs-tgt: vunits parameter is not supported +REG epsg:7404 0 crs-tgt: vunits parameter is not supported +REG epsg:7404 1 crs-tgt: vunits parameter is not supported +REG epsg:7404 2 crs-tgt: vunits parameter is not supported +REG epsg:7404 3 crs-tgt: vunits parameter is not supported +REG epsg:7404 4 crs-tgt: vunits parameter is not supported +REG epsg:7405 0 crs-tgt: vunits parameter is not supported +REG epsg:7405 1 crs-tgt: vunits parameter is not supported +REG epsg:7405 2 crs-tgt: vunits parameter is not supported +REG epsg:7405 3 crs-tgt: vunits parameter is not supported +REG epsg:7405 4 crs-tgt: vunits parameter is not supported +REG epsg:7406 0 crs-tgt: vunits parameter is not supported +REG epsg:7406 1 crs-tgt: vunits parameter is not supported +REG epsg:7406 2 crs-tgt: vunits parameter is not supported +REG epsg:7406 3 crs-tgt: vunits parameter is not supported +REG epsg:7406 4 crs-tgt: vunits parameter is not supported +REG epsg:7407 0 crs-tgt: vunits parameter is not supported +REG epsg:7407 1 crs-tgt: vunits parameter is not supported +REG epsg:7407 2 crs-tgt: vunits parameter is not supported +REG epsg:7407 3 crs-tgt: vunits parameter is not supported +REG epsg:7407 4 crs-tgt: vunits parameter is not supported +REG epsg:7408 0 crs-tgt: vunits parameter is not supported +REG epsg:7408 1 crs-tgt: vunits parameter is not supported +REG epsg:7408 2 crs-tgt: vunits parameter is not supported +REG epsg:7408 3 crs-tgt: vunits parameter is not supported +REG epsg:7408 4 crs-tgt: vunits parameter is not supported +REG epsg:7409 0 crs-tgt: vunits parameter is not supported +REG epsg:7409 1 crs-tgt: vunits parameter is not supported +REG epsg:7409 2 crs-tgt: vunits parameter is not supported +REG epsg:7409 3 crs-tgt: vunits parameter is not supported +REG epsg:7409 4 crs-tgt: vunits parameter is not supported +REG epsg:7410 0 crs-tgt: vunits parameter is not supported +REG epsg:7410 1 crs-tgt: vunits parameter is not supported +REG epsg:7410 2 crs-tgt: vunits parameter is not supported +REG epsg:7410 3 crs-tgt: vunits parameter is not supported +REG epsg:7410 4 crs-tgt: vunits parameter is not supported +REG epsg:7411 0 crs-tgt: vunits parameter is not supported +REG epsg:7411 1 crs-tgt: vunits parameter is not supported +REG epsg:7411 2 crs-tgt: vunits parameter is not supported +REG epsg:7411 3 crs-tgt: vunits parameter is not supported +REG epsg:7411 4 crs-tgt: vunits parameter is not supported +REG epsg:7412 0 crs-tgt: vunits parameter is not supported +REG epsg:7412 1 crs-tgt: vunits parameter is not supported +REG epsg:7412 2 crs-tgt: vunits parameter is not supported +REG epsg:7412 3 crs-tgt: vunits parameter is not supported +REG epsg:7412 4 crs-tgt: vunits parameter is not supported +REG epsg:7413 0 crs-tgt: vunits parameter is not supported +REG epsg:7413 1 crs-tgt: vunits parameter is not supported +REG epsg:7413 2 crs-tgt: vunits parameter is not supported +REG epsg:7413 3 crs-tgt: vunits parameter is not supported +REG epsg:7413 4 crs-tgt: vunits parameter is not supported +REG epsg:7414 0 crs-tgt: vunits parameter is not supported +REG epsg:7414 1 crs-tgt: vunits parameter is not supported +REG epsg:7414 2 crs-tgt: vunits parameter is not supported +REG epsg:7414 3 crs-tgt: vunits parameter is not supported +REG epsg:7414 4 crs-tgt: vunits parameter is not supported +REG epsg:7415 0 crs-tgt: vunits parameter is not supported +REG epsg:7415 1 crs-tgt: vunits parameter is not supported +REG epsg:7415 2 crs-tgt: vunits parameter is not supported +REG epsg:7415 3 crs-tgt: vunits parameter is not supported +REG epsg:7415 4 crs-tgt: vunits parameter is not supported +REG epsg:7416 0 crs-tgt: vunits parameter is not supported +REG epsg:7416 1 crs-tgt: vunits parameter is not supported +REG epsg:7416 2 crs-tgt: vunits parameter is not supported +REG epsg:7416 3 crs-tgt: vunits parameter is not supported +REG epsg:7416 4 crs-tgt: vunits parameter is not supported +REG epsg:7417 0 crs-tgt: vunits parameter is not supported +REG epsg:7417 1 crs-tgt: vunits parameter is not supported +REG epsg:7417 2 crs-tgt: vunits parameter is not supported +REG epsg:7417 3 crs-tgt: vunits parameter is not supported +REG epsg:7417 4 crs-tgt: vunits parameter is not supported +REG epsg:7418 0 crs-tgt: vunits parameter is not supported +REG epsg:7418 1 crs-tgt: vunits parameter is not supported +REG epsg:7418 2 crs-tgt: vunits parameter is not supported +REG epsg:7418 3 crs-tgt: vunits parameter is not supported +REG epsg:7418 4 crs-tgt: vunits parameter is not supported +REG epsg:7419 0 crs-tgt: vunits parameter is not supported +REG epsg:7419 1 crs-tgt: vunits parameter is not supported +REG epsg:7419 2 crs-tgt: vunits parameter is not supported +REG epsg:7419 3 crs-tgt: vunits parameter is not supported +REG epsg:7419 4 crs-tgt: vunits parameter is not supported +REG epsg:7420 0 crs-tgt: vunits parameter is not supported +REG epsg:7420 1 crs-tgt: vunits parameter is not supported +REG epsg:7420 2 crs-tgt: vunits parameter is not supported +REG epsg:7420 3 crs-tgt: vunits parameter is not supported +REG epsg:7420 4 crs-tgt: vunits parameter is not supported +REG epsg:7421 0 crs-tgt: vunits parameter is not supported +REG epsg:7421 1 crs-tgt: vunits parameter is not supported +REG epsg:7421 2 crs-tgt: vunits parameter is not supported +REG epsg:7421 3 crs-tgt: vunits parameter is not supported +REG epsg:7421 4 crs-tgt: vunits parameter is not supported +REG epsg:7422 0 crs-tgt: vunits parameter is not supported +REG epsg:7422 1 crs-tgt: vunits parameter is not supported +REG epsg:7422 2 crs-tgt: vunits parameter is not supported +REG epsg:7422 3 crs-tgt: vunits parameter is not supported +REG epsg:7422 4 crs-tgt: vunits parameter is not supported +REG epsg:7423 0 crs-tgt: vunits parameter is not supported +REG epsg:7423 1 crs-tgt: vunits parameter is not supported +REG epsg:7423 2 crs-tgt: vunits parameter is not supported +REG epsg:7423 3 crs-tgt: vunits parameter is not supported +REG epsg:7423 4 crs-tgt: vunits parameter is not supported +REG epsg:7954 0 crs-tgt: vunits parameter is not supported +REG epsg:7954 1 crs-tgt: vunits parameter is not supported +REG epsg:7954 2 crs-tgt: vunits parameter is not supported +REG epsg:7954 3 crs-tgt: vunits parameter is not supported +REG epsg:7954 4 crs-tgt: vunits parameter is not supported +REG epsg:7955 0 crs-tgt: vunits parameter is not supported +REG epsg:7955 1 crs-tgt: vunits parameter is not supported +REG epsg:7955 2 crs-tgt: vunits parameter is not supported +REG epsg:7955 3 crs-tgt: vunits parameter is not supported +REG epsg:7955 4 crs-tgt: vunits parameter is not supported +REG epsg:7956 0 crs-tgt: vunits parameter is not supported +REG epsg:7956 1 crs-tgt: vunits parameter is not supported +REG epsg:7956 2 crs-tgt: vunits parameter is not supported +REG epsg:7956 3 crs-tgt: vunits parameter is not supported +REG epsg:7956 4 crs-tgt: vunits parameter is not supported +REG epsg:8349 0 crs-tgt: vunits parameter is not supported +REG epsg:8349 1 crs-tgt: vunits parameter is not supported +REG epsg:8349 2 crs-tgt: vunits parameter is not supported +REG epsg:8349 3 crs-tgt: vunits parameter is not supported +REG epsg:8349 4 crs-tgt: vunits parameter is not supported +REG epsg:8350 0 crs-tgt: vunits parameter is not supported +REG epsg:8350 1 crs-tgt: vunits parameter is not supported +REG epsg:8350 2 crs-tgt: vunits parameter is not supported +REG epsg:8350 3 crs-tgt: vunits parameter is not supported +REG epsg:8350 4 crs-tgt: vunits parameter is not supported +REG esri:102163 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:102163 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:102163 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:102163 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:102163 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:102766 0 inv: Infinite longitude +REG esri:2056 0 crs-tgt: Obl 1 +REG esri:2056 1 crs-tgt: Obl 1 +REG esri:2056 2 crs-tgt: Obl 1 +REG esri:2056 3 crs-tgt: Obl 1 +REG esri:2056 4 crs-tgt: Obl 1 +REG esri:2083 3 inv: Latitude is out of range: -1.5740918336988863 +REG esri:2083 4 inv: Latitude is out of range: -1.5738255937417747 +REG esri:21780 0 crs-tgt: Obl 1 +REG esri:21780 1 crs-tgt: Obl 1 +REG esri:21780 2 crs-tgt: Obl 1 +REG esri:21780 3 crs-tgt: Obl 1 +REG esri:21780 4 crs-tgt: Obl 1 +REG esri:21781 0 crs-tgt: Obl 1 +REG esri:21781 1 crs-tgt: Obl 1 +REG esri:21781 2 crs-tgt: Obl 1 +REG esri:21781 3 crs-tgt: Obl 1 +REG esri:21781 4 crs-tgt: Obl 1 +REG esri:23700 0 crs-tgt: Obl 1 +REG esri:23700 1 crs-tgt: Obl 1 +REG esri:23700 2 crs-tgt: Obl 1 +REG esri:23700 3 crs-tgt: Obl 1 +REG esri:23700 4 crs-tgt: Obl 1 +REG esri:53001 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53001 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53001 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53001 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53001 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53002 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53002 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53002 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53002 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53002 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53011 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53011 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53011 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53011 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53011 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53013 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53013 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53013 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53013 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53013 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53014 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53014 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53014 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53014 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53014 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53015 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53015 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53015 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53015 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53015 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53017 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53017 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53017 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53017 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53017 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53018 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53018 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53018 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53018 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53018 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53019 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53019 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53019 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53019 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53019 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53022 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53022 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53022 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53022 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53022 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53023 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53023 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53023 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53023 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53023 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53024 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53024 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53024 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53024 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53024 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53025 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53025 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53025 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53025 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53025 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53031 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53031 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53031 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53031 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:53031 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54001 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54001 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54001 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54001 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54001 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54002 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54002 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54002 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54002 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54002 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54011 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54011 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54011 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54011 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54011 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54013 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54013 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54013 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54013 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54013 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54014 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54014 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54014 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54014 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54014 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54015 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54015 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54015 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54015 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54015 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54017 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54017 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54017 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54017 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54017 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54018 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54018 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54018 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54018 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54018 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54019 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54019 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54019 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54019 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54019 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54022 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54022 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54022 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54022 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54022 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54023 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54023 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54023 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54023 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54023 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54024 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54024 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54024 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54024 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54024 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54025 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54025 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54025 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54025 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54025 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54031 0 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54031 1 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54031 2 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54031 3 crs-tgt: Keyword 'proj' is a required parameter +REG esri:54031 4 crs-tgt: Keyword 'proj' is a required parameter +REG esri:65061 0 inv: Infinite longitude +REG esri:65161 0 inv: Infinite longitude +REG nad27:5001 0 crs-tgt: For input string: "-36d52'11.6315" +REG nad27:5001 1 crs-tgt: For input string: "-36d52'11.6315" +REG nad27:5001 2 crs-tgt: For input string: "-36d52'11.6315" +REG nad27:5001 3 crs-tgt: For input string: "-36d52'11.6315" +REG nad27:5001 4 crs-tgt: For input string: "-36d52'11.6315" +REG nad27:5400 0 inv: Infinite longitude +REG nad83:5001 0 crs-tgt: For input string: "-36d52'11.6315" +REG nad83:5001 1 crs-tgt: For input string: "-36d52'11.6315" +REG nad83:5001 2 crs-tgt: For input string: "-36d52'11.6315" +REG nad83:5001 3 crs-tgt: For input string: "-36d52'11.6315" +REG nad83:5001 4 crs-tgt: For input string: "-36d52'11.6315" +REG world:ceylon 0 crs-tgt: Unknown ellipsoid: everest +REG world:ceylon 1 crs-tgt: Unknown ellipsoid: everest +REG world:ceylon 2 crs-tgt: Unknown ellipsoid: everest +REG world:ceylon 3 crs-tgt: Unknown ellipsoid: everest +REG world:ceylon 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-I 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-I 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-I 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-I 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-I 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIA 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIA 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIA 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIA 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIA 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIB 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIB 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIB 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIB 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIB 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIA 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIA 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIA 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIA 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIA 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIB 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIB 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIB 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIB 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-IIIB 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVA 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVA 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVA 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVA 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVA 4 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVB 0 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVB 1 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVB 2 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVB 3 crs-tgt: Unknown ellipsoid: everest +REG world:india-IVB 4 crs-tgt: Unknown ellipsoid: everest +REG world:madagascar 0 crs-tgt: azi parameter is not supported +REG world:madagascar 1 crs-tgt: azi parameter is not supported +REG world:madagascar 2 crs-tgt: azi parameter is not supported +REG world:madagascar 3 crs-tgt: azi parameter is not supported +REG world:madagascar 4 crs-tgt: azi parameter is not supported +REG world:malay 0 crs-tgt: rot_conv parameter is not supported +REG world:malay 1 crs-tgt: rot_conv parameter is not supported +REG world:malay 2 crs-tgt: rot_conv parameter is not supported +REG world:malay 3 crs-tgt: rot_conv parameter is not supported +REG world:malay 4 crs-tgt: rot_conv parameter is not supported +REG world:n-alger 0 crs-tgt: +REG world:n-alger 1 crs-tgt: +REG world:n-alger 2 crs-tgt: +REG world:n-alger 3 crs-tgt: +REG world:n-alger 4 crs-tgt: +REG world:n-maroc 0 crs-tgt: +REG world:n-maroc 1 crs-tgt: +REG world:n-maroc 2 crs-tgt: +REG world:n-maroc 3 crs-tgt: +REG world:n-maroc 4 crs-tgt: +REG world:n-tunis 0 crs-tgt: +REG world:n-tunis 1 crs-tgt: +REG world:n-tunis 2 crs-tgt: +REG world:n-tunis 3 crs-tgt: +REG world:n-tunis 4 crs-tgt: +REG world:new_zealand 0 inv: Infinite longitude +REG world:new_zealand 1 inv: Infinite longitude +REG world:new_zealand 2 inv: Infinite longitude +REG world:new_zealand 3 inv: Infinite longitude +REG world:new_zealand 4 inv: Infinite longitude +REG world:s-alger 0 crs-tgt: +REG world:s-alger 1 crs-tgt: +REG world:s-alger 2 crs-tgt: +REG world:s-alger 3 crs-tgt: +REG world:s-alger 4 crs-tgt: +REG world:s-maroc 0 crs-tgt: +REG world:s-maroc 1 crs-tgt: +REG world:s-maroc 2 crs-tgt: +REG world:s-maroc 3 crs-tgt: +REG world:s-maroc 4 crs-tgt: +REG world:s-tunis 0 crs-tgt: +REG world:s-tunis 1 crs-tgt: +REG world:s-tunis 2 crs-tgt: +REG world:s-tunis 3 crs-tgt: +REG world:s-tunis 4 crs-tgt: +SYN ellps/GSK2011 0 crs-tgt: Unknown ellipsoid: GSK2011 +SYN ellps/GSK2011 1 crs-tgt: Unknown ellipsoid: GSK2011 +SYN ellps/GSK2011 2 crs-tgt: Unknown ellipsoid: GSK2011 +SYN ellps/GSK2011 3 crs-tgt: Unknown ellipsoid: GSK2011 +SYN ellps/GSK2011 4 crs-tgt: Unknown ellipsoid: GSK2011 +SYN ellps/NWL9D 0 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/NWL9D 1 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/NWL9D 2 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/NWL9D 3 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/NWL9D 4 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/PZ90 0 crs-tgt: Unknown ellipsoid: PZ90 +SYN ellps/PZ90 1 crs-tgt: Unknown ellipsoid: PZ90 +SYN ellps/PZ90 2 crs-tgt: Unknown ellipsoid: PZ90 +SYN ellps/PZ90 3 crs-tgt: Unknown ellipsoid: PZ90 +SYN ellps/PZ90 4 crs-tgt: Unknown ellipsoid: PZ90 +SYN ellps/andrae 0 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/andrae 1 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/andrae 2 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/andrae 3 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/andrae 4 inv: Computation of phi2 failed to converage after 15 iterations +SYN ellps/australian 0 crs-tgt: Unknown ellipsoid: australian +SYN ellps/australian 1 crs-tgt: Unknown ellipsoid: australian +SYN ellps/australian 2 crs-tgt: Unknown ellipsoid: australian +SYN ellps/australian 3 crs-tgt: Unknown ellipsoid: australian +SYN ellps/australian 4 crs-tgt: Unknown ellipsoid: australian +SYN ellps/clrk80ign 0 crs-tgt: Unknown ellipsoid: clrk80ign +SYN ellps/clrk80ign 1 crs-tgt: Unknown ellipsoid: clrk80ign +SYN ellps/clrk80ign 2 crs-tgt: Unknown ellipsoid: clrk80ign +SYN ellps/clrk80ign 3 crs-tgt: Unknown ellipsoid: clrk80ign +SYN ellps/clrk80ign 4 crs-tgt: Unknown ellipsoid: clrk80ign +SYN ellps/danish 0 crs-tgt: Unknown ellipsoid: danish +SYN ellps/danish 1 crs-tgt: Unknown ellipsoid: danish +SYN ellps/danish 2 crs-tgt: Unknown ellipsoid: danish +SYN ellps/danish 3 crs-tgt: Unknown ellipsoid: danish +SYN ellps/danish 4 crs-tgt: Unknown ellipsoid: danish +SYN mod/aea/R_C 0 crs-tgt: R_C parameter is not supported +SYN mod/aea/R_C 1 crs-tgt: R_C parameter is not supported +SYN mod/aea/R_C 2 crs-tgt: R_C parameter is not supported +SYN mod/aea/R_C 3 crs-tgt: R_C parameter is not supported +SYN mod/aea/R_C 4 crs-tgt: R_C parameter is not supported +SYN mod/aea/R_V 0 crs-tgt: R_V parameter is not supported +SYN mod/aea/R_V 1 crs-tgt: R_V parameter is not supported +SYN mod/aea/R_V 2 crs-tgt: R_V parameter is not supported +SYN mod/aea/R_V 3 crs-tgt: R_V parameter is not supported +SYN mod/aea/R_V 4 crs-tgt: R_V parameter is not supported +SYN mod/aea/R_a 0 crs-tgt: R_a parameter is not supported +SYN mod/aea/R_a 1 crs-tgt: R_a parameter is not supported +SYN mod/aea/R_a 2 crs-tgt: R_a parameter is not supported +SYN mod/aea/R_a 3 crs-tgt: R_a parameter is not supported +SYN mod/aea/R_a 4 crs-tgt: R_a parameter is not supported +SYN mod/aea/R_g 0 crs-tgt: R_g parameter is not supported +SYN mod/aea/R_g 1 crs-tgt: R_g parameter is not supported +SYN mod/aea/R_g 2 crs-tgt: R_g parameter is not supported +SYN mod/aea/R_g 3 crs-tgt: R_g parameter is not supported +SYN mod/aea/R_g 4 crs-tgt: R_g parameter is not supported +SYN mod/aea/R_h 0 crs-tgt: R_h parameter is not supported +SYN mod/aea/R_h 1 crs-tgt: R_h parameter is not supported +SYN mod/aea/R_h 2 crs-tgt: R_h parameter is not supported +SYN mod/aea/R_h 3 crs-tgt: R_h parameter is not supported +SYN mod/aea/R_h 4 crs-tgt: R_h parameter is not supported +SYN mod/aea/R_lat_a 0 crs-tgt: R_lat_a parameter is not supported +SYN mod/aea/R_lat_a 1 crs-tgt: R_lat_a parameter is not supported +SYN mod/aea/R_lat_a 2 crs-tgt: R_lat_a parameter is not supported +SYN mod/aea/R_lat_a 3 crs-tgt: R_lat_a parameter is not supported +SYN mod/aea/R_lat_a 4 crs-tgt: R_lat_a parameter is not supported +SYN mod/aea/R_lat_g 0 crs-tgt: R_lat_g parameter is not supported +SYN mod/aea/R_lat_g 1 crs-tgt: R_lat_g parameter is not supported +SYN mod/aea/R_lat_g 2 crs-tgt: R_lat_g parameter is not supported +SYN mod/aea/R_lat_g 3 crs-tgt: R_lat_g parameter is not supported +SYN mod/aea/R_lat_g 4 crs-tgt: R_lat_g parameter is not supported +SYN mod/aea/datum_nad83_lower 0 crs-tgt: Unknown datum: nad83 +SYN mod/aea/datum_nad83_lower 1 crs-tgt: Unknown datum: nad83 +SYN mod/aea/datum_nad83_lower 2 crs-tgt: Unknown datum: nad83 +SYN mod/aea/datum_nad83_lower 3 crs-tgt: Unknown datum: nad83 +SYN mod/aea/datum_nad83_lower 4 crs-tgt: Unknown datum: nad83 +SYN mod/aea/e 0 crs-tgt: e parameter is not supported +SYN mod/aea/e 1 crs-tgt: e parameter is not supported +SYN mod/aea/e 2 crs-tgt: e parameter is not supported +SYN mod/aea/e 3 crs-tgt: e parameter is not supported +SYN mod/aea/e 4 crs-tgt: e parameter is not supported +SYN mod/aea/h 0 crs-tgt: +SYN mod/aea/h 1 crs-tgt: +SYN mod/aea/h 2 crs-tgt: +SYN mod/aea/h 3 crs-tgt: +SYN mod/aea/h 4 crs-tgt: +SYN mod/aea/south 0 crs-tgt: +SYN mod/aea/south 1 crs-tgt: +SYN mod/aea/south 2 crs-tgt: +SYN mod/aea/south 3 crs-tgt: +SYN mod/aea/south 4 crs-tgt: +SYN mod/aea/unknown_keyword 0 crs-tgt: unknown_keyword parameter is not supported +SYN mod/aea/unknown_keyword 1 crs-tgt: unknown_keyword parameter is not supported +SYN mod/aea/unknown_keyword 2 crs-tgt: unknown_keyword parameter is not supported +SYN mod/aea/unknown_keyword 3 crs-tgt: unknown_keyword parameter is not supported +SYN mod/aea/unknown_keyword 4 crs-tgt: unknown_keyword parameter is not supported +SYN mod/aea/vto_meter 0 crs-tgt: vto_meter parameter is not supported +SYN mod/aea/vto_meter 1 crs-tgt: vto_meter parameter is not supported +SYN mod/aea/vto_meter 2 crs-tgt: vto_meter parameter is not supported +SYN mod/aea/vto_meter 3 crs-tgt: vto_meter parameter is not supported +SYN mod/aea/vto_meter 4 crs-tgt: vto_meter parameter is not supported +SYN mod/aea/vunits_m 0 crs-tgt: vunits parameter is not supported +SYN mod/aea/vunits_m 1 crs-tgt: vunits parameter is not supported +SYN mod/aea/vunits_m 2 crs-tgt: vunits parameter is not supported +SYN mod/aea/vunits_m 3 crs-tgt: vunits parameter is not supported +SYN mod/aea/vunits_m 4 crs-tgt: vunits parameter is not supported +SYN mod/lcc/R_C 0 crs-tgt: R_C parameter is not supported +SYN mod/lcc/R_C 1 crs-tgt: R_C parameter is not supported +SYN mod/lcc/R_C 2 crs-tgt: R_C parameter is not supported +SYN mod/lcc/R_C 3 crs-tgt: R_C parameter is not supported +SYN mod/lcc/R_C 4 crs-tgt: R_C parameter is not supported +SYN mod/lcc/R_V 0 crs-tgt: R_V parameter is not supported +SYN mod/lcc/R_V 1 crs-tgt: R_V parameter is not supported +SYN mod/lcc/R_V 2 crs-tgt: R_V parameter is not supported +SYN mod/lcc/R_V 3 crs-tgt: R_V parameter is not supported +SYN mod/lcc/R_V 4 crs-tgt: R_V parameter is not supported +SYN mod/lcc/R_a 0 crs-tgt: R_a parameter is not supported +SYN mod/lcc/R_a 1 crs-tgt: R_a parameter is not supported +SYN mod/lcc/R_a 2 crs-tgt: R_a parameter is not supported +SYN mod/lcc/R_a 3 crs-tgt: R_a parameter is not supported +SYN mod/lcc/R_a 4 crs-tgt: R_a parameter is not supported +SYN mod/lcc/R_g 0 crs-tgt: R_g parameter is not supported +SYN mod/lcc/R_g 1 crs-tgt: R_g parameter is not supported +SYN mod/lcc/R_g 2 crs-tgt: R_g parameter is not supported +SYN mod/lcc/R_g 3 crs-tgt: R_g parameter is not supported +SYN mod/lcc/R_g 4 crs-tgt: R_g parameter is not supported +SYN mod/lcc/R_h 0 crs-tgt: R_h parameter is not supported +SYN mod/lcc/R_h 1 crs-tgt: R_h parameter is not supported +SYN mod/lcc/R_h 2 crs-tgt: R_h parameter is not supported +SYN mod/lcc/R_h 3 crs-tgt: R_h parameter is not supported +SYN mod/lcc/R_h 4 crs-tgt: R_h parameter is not supported +SYN mod/lcc/R_lat_a 0 crs-tgt: R_lat_a parameter is not supported +SYN mod/lcc/R_lat_a 1 crs-tgt: R_lat_a parameter is not supported +SYN mod/lcc/R_lat_a 2 crs-tgt: R_lat_a parameter is not supported +SYN mod/lcc/R_lat_a 3 crs-tgt: R_lat_a parameter is not supported +SYN mod/lcc/R_lat_a 4 crs-tgt: R_lat_a parameter is not supported +SYN mod/lcc/R_lat_g 0 crs-tgt: R_lat_g parameter is not supported +SYN mod/lcc/R_lat_g 1 crs-tgt: R_lat_g parameter is not supported +SYN mod/lcc/R_lat_g 2 crs-tgt: R_lat_g parameter is not supported +SYN mod/lcc/R_lat_g 3 crs-tgt: R_lat_g parameter is not supported +SYN mod/lcc/R_lat_g 4 crs-tgt: R_lat_g parameter is not supported +SYN mod/lcc/datum_nad83_lower 0 crs-tgt: Unknown datum: nad83 +SYN mod/lcc/datum_nad83_lower 1 crs-tgt: Unknown datum: nad83 +SYN mod/lcc/datum_nad83_lower 2 crs-tgt: Unknown datum: nad83 +SYN mod/lcc/datum_nad83_lower 3 crs-tgt: Unknown datum: nad83 +SYN mod/lcc/datum_nad83_lower 4 crs-tgt: Unknown datum: nad83 +SYN mod/lcc/e 0 crs-tgt: e parameter is not supported +SYN mod/lcc/e 1 crs-tgt: e parameter is not supported +SYN mod/lcc/e 2 crs-tgt: e parameter is not supported +SYN mod/lcc/e 3 crs-tgt: e parameter is not supported +SYN mod/lcc/e 4 crs-tgt: e parameter is not supported +SYN mod/lcc/f 0 inv: Infinite longitude +SYN mod/lcc/f 1 inv: Infinite longitude +SYN mod/lcc/f 2 inv: Infinite longitude +SYN mod/lcc/f 3 inv: Infinite longitude +SYN mod/lcc/f 4 inv: Infinite longitude +SYN mod/lcc/h 0 crs-tgt: +SYN mod/lcc/h 1 crs-tgt: +SYN mod/lcc/h 2 crs-tgt: +SYN mod/lcc/h 3 crs-tgt: +SYN mod/lcc/h 4 crs-tgt: +SYN mod/lcc/rf 0 inv: Infinite longitude +SYN mod/lcc/rf 1 inv: Infinite longitude +SYN mod/lcc/rf 2 inv: Infinite longitude +SYN mod/lcc/rf 3 inv: Infinite longitude +SYN mod/lcc/rf 4 inv: Infinite longitude +SYN mod/lcc/south 0 crs-tgt: +SYN mod/lcc/south 1 crs-tgt: +SYN mod/lcc/south 2 crs-tgt: +SYN mod/lcc/south 3 crs-tgt: +SYN mod/lcc/south 4 crs-tgt: +SYN mod/lcc/unknown_keyword 0 crs-tgt: unknown_keyword parameter is not supported +SYN mod/lcc/unknown_keyword 1 crs-tgt: unknown_keyword parameter is not supported +SYN mod/lcc/unknown_keyword 2 crs-tgt: unknown_keyword parameter is not supported +SYN mod/lcc/unknown_keyword 3 crs-tgt: unknown_keyword parameter is not supported +SYN mod/lcc/unknown_keyword 4 crs-tgt: unknown_keyword parameter is not supported +SYN mod/lcc/vto_meter 0 crs-tgt: vto_meter parameter is not supported +SYN mod/lcc/vto_meter 1 crs-tgt: vto_meter parameter is not supported +SYN mod/lcc/vto_meter 2 crs-tgt: vto_meter parameter is not supported +SYN mod/lcc/vto_meter 3 crs-tgt: vto_meter parameter is not supported +SYN mod/lcc/vto_meter 4 crs-tgt: vto_meter parameter is not supported +SYN mod/lcc/vunits_m 0 crs-tgt: vunits parameter is not supported +SYN mod/lcc/vunits_m 1 crs-tgt: vunits parameter is not supported +SYN mod/lcc/vunits_m 2 crs-tgt: vunits parameter is not supported +SYN mod/lcc/vunits_m 3 crs-tgt: vunits parameter is not supported +SYN mod/lcc/vunits_m 4 crs-tgt: vunits parameter is not supported +SYN mod/longlat/R_C 0 crs-tgt: R_C parameter is not supported +SYN mod/longlat/R_C 1 crs-tgt: R_C parameter is not supported +SYN mod/longlat/R_C 2 crs-tgt: R_C parameter is not supported +SYN mod/longlat/R_C 3 crs-tgt: R_C parameter is not supported +SYN mod/longlat/R_C 4 crs-tgt: R_C parameter is not supported +SYN mod/longlat/R_V 0 crs-tgt: R_V parameter is not supported +SYN mod/longlat/R_V 1 crs-tgt: R_V parameter is not supported +SYN mod/longlat/R_V 2 crs-tgt: R_V parameter is not supported +SYN mod/longlat/R_V 3 crs-tgt: R_V parameter is not supported +SYN mod/longlat/R_V 4 crs-tgt: R_V parameter is not supported +SYN mod/longlat/R_a 0 crs-tgt: R_a parameter is not supported +SYN mod/longlat/R_a 1 crs-tgt: R_a parameter is not supported +SYN mod/longlat/R_a 2 crs-tgt: R_a parameter is not supported +SYN mod/longlat/R_a 3 crs-tgt: R_a parameter is not supported +SYN mod/longlat/R_a 4 crs-tgt: R_a parameter is not supported +SYN mod/longlat/R_g 0 crs-tgt: R_g parameter is not supported +SYN mod/longlat/R_g 1 crs-tgt: R_g parameter is not supported +SYN mod/longlat/R_g 2 crs-tgt: R_g parameter is not supported +SYN mod/longlat/R_g 3 crs-tgt: R_g parameter is not supported +SYN mod/longlat/R_g 4 crs-tgt: R_g parameter is not supported +SYN mod/longlat/R_h 0 crs-tgt: R_h parameter is not supported +SYN mod/longlat/R_h 1 crs-tgt: R_h parameter is not supported +SYN mod/longlat/R_h 2 crs-tgt: R_h parameter is not supported +SYN mod/longlat/R_h 3 crs-tgt: R_h parameter is not supported +SYN mod/longlat/R_h 4 crs-tgt: R_h parameter is not supported +SYN mod/longlat/R_lat_a 0 crs-tgt: R_lat_a parameter is not supported +SYN mod/longlat/R_lat_a 1 crs-tgt: R_lat_a parameter is not supported +SYN mod/longlat/R_lat_a 2 crs-tgt: R_lat_a parameter is not supported +SYN mod/longlat/R_lat_a 3 crs-tgt: R_lat_a parameter is not supported +SYN mod/longlat/R_lat_a 4 crs-tgt: R_lat_a parameter is not supported +SYN mod/longlat/R_lat_g 0 crs-tgt: R_lat_g parameter is not supported +SYN mod/longlat/R_lat_g 1 crs-tgt: R_lat_g parameter is not supported +SYN mod/longlat/R_lat_g 2 crs-tgt: R_lat_g parameter is not supported +SYN mod/longlat/R_lat_g 3 crs-tgt: R_lat_g parameter is not supported +SYN mod/longlat/R_lat_g 4 crs-tgt: R_lat_g parameter is not supported +SYN mod/longlat/datum_nad83_lower 0 crs-tgt: Unknown datum: nad83 +SYN mod/longlat/datum_nad83_lower 1 crs-tgt: Unknown datum: nad83 +SYN mod/longlat/datum_nad83_lower 2 crs-tgt: Unknown datum: nad83 +SYN mod/longlat/datum_nad83_lower 3 crs-tgt: Unknown datum: nad83 +SYN mod/longlat/datum_nad83_lower 4 crs-tgt: Unknown datum: nad83 +SYN mod/longlat/e 0 crs-tgt: e parameter is not supported +SYN mod/longlat/e 1 crs-tgt: e parameter is not supported +SYN mod/longlat/e 2 crs-tgt: e parameter is not supported +SYN mod/longlat/e 3 crs-tgt: e parameter is not supported +SYN mod/longlat/e 4 crs-tgt: e parameter is not supported +SYN mod/longlat/h 0 crs-tgt: +SYN mod/longlat/h 1 crs-tgt: +SYN mod/longlat/h 2 crs-tgt: +SYN mod/longlat/h 3 crs-tgt: +SYN mod/longlat/h 4 crs-tgt: +SYN mod/longlat/south 0 crs-tgt: +SYN mod/longlat/south 1 crs-tgt: +SYN mod/longlat/south 2 crs-tgt: +SYN mod/longlat/south 3 crs-tgt: +SYN mod/longlat/south 4 crs-tgt: +SYN mod/longlat/unknown_keyword 0 crs-tgt: unknown_keyword parameter is not supported +SYN mod/longlat/unknown_keyword 1 crs-tgt: unknown_keyword parameter is not supported +SYN mod/longlat/unknown_keyword 2 crs-tgt: unknown_keyword parameter is not supported +SYN mod/longlat/unknown_keyword 3 crs-tgt: unknown_keyword parameter is not supported +SYN mod/longlat/unknown_keyword 4 crs-tgt: unknown_keyword parameter is not supported +SYN mod/longlat/vto_meter 0 crs-tgt: vto_meter parameter is not supported +SYN mod/longlat/vto_meter 1 crs-tgt: vto_meter parameter is not supported +SYN mod/longlat/vto_meter 2 crs-tgt: vto_meter parameter is not supported +SYN mod/longlat/vto_meter 3 crs-tgt: vto_meter parameter is not supported +SYN mod/longlat/vto_meter 4 crs-tgt: vto_meter parameter is not supported +SYN mod/longlat/vunits_m 0 crs-tgt: vunits parameter is not supported +SYN mod/longlat/vunits_m 1 crs-tgt: vunits parameter is not supported +SYN mod/longlat/vunits_m 2 crs-tgt: vunits parameter is not supported +SYN mod/longlat/vunits_m 3 crs-tgt: vunits parameter is not supported +SYN mod/longlat/vunits_m 4 crs-tgt: vunits parameter is not supported +SYN mod/merc/R_C 0 crs-tgt: R_C parameter is not supported +SYN mod/merc/R_C 1 crs-tgt: R_C parameter is not supported +SYN mod/merc/R_C 2 crs-tgt: R_C parameter is not supported +SYN mod/merc/R_C 3 crs-tgt: R_C parameter is not supported +SYN mod/merc/R_C 4 crs-tgt: R_C parameter is not supported +SYN mod/merc/R_V 0 crs-tgt: R_V parameter is not supported +SYN mod/merc/R_V 1 crs-tgt: R_V parameter is not supported +SYN mod/merc/R_V 2 crs-tgt: R_V parameter is not supported +SYN mod/merc/R_V 3 crs-tgt: R_V parameter is not supported +SYN mod/merc/R_V 4 crs-tgt: R_V parameter is not supported +SYN mod/merc/R_a 0 crs-tgt: R_a parameter is not supported +SYN mod/merc/R_a 1 crs-tgt: R_a parameter is not supported +SYN mod/merc/R_a 2 crs-tgt: R_a parameter is not supported +SYN mod/merc/R_a 3 crs-tgt: R_a parameter is not supported +SYN mod/merc/R_a 4 crs-tgt: R_a parameter is not supported +SYN mod/merc/R_g 0 crs-tgt: R_g parameter is not supported +SYN mod/merc/R_g 1 crs-tgt: R_g parameter is not supported +SYN mod/merc/R_g 2 crs-tgt: R_g parameter is not supported +SYN mod/merc/R_g 3 crs-tgt: R_g parameter is not supported +SYN mod/merc/R_g 4 crs-tgt: R_g parameter is not supported +SYN mod/merc/R_h 0 crs-tgt: R_h parameter is not supported +SYN mod/merc/R_h 1 crs-tgt: R_h parameter is not supported +SYN mod/merc/R_h 2 crs-tgt: R_h parameter is not supported +SYN mod/merc/R_h 3 crs-tgt: R_h parameter is not supported +SYN mod/merc/R_h 4 crs-tgt: R_h parameter is not supported +SYN mod/merc/R_lat_a 0 crs-tgt: R_lat_a parameter is not supported +SYN mod/merc/R_lat_a 1 crs-tgt: R_lat_a parameter is not supported +SYN mod/merc/R_lat_a 2 crs-tgt: R_lat_a parameter is not supported +SYN mod/merc/R_lat_a 3 crs-tgt: R_lat_a parameter is not supported +SYN mod/merc/R_lat_a 4 crs-tgt: R_lat_a parameter is not supported +SYN mod/merc/R_lat_g 0 crs-tgt: R_lat_g parameter is not supported +SYN mod/merc/R_lat_g 1 crs-tgt: R_lat_g parameter is not supported +SYN mod/merc/R_lat_g 2 crs-tgt: R_lat_g parameter is not supported +SYN mod/merc/R_lat_g 3 crs-tgt: R_lat_g parameter is not supported +SYN mod/merc/R_lat_g 4 crs-tgt: R_lat_g parameter is not supported +SYN mod/merc/datum_nad83_lower 0 crs-tgt: Unknown datum: nad83 +SYN mod/merc/datum_nad83_lower 1 crs-tgt: Unknown datum: nad83 +SYN mod/merc/datum_nad83_lower 2 crs-tgt: Unknown datum: nad83 +SYN mod/merc/datum_nad83_lower 3 crs-tgt: Unknown datum: nad83 +SYN mod/merc/datum_nad83_lower 4 crs-tgt: Unknown datum: nad83 +SYN mod/merc/e 0 crs-tgt: e parameter is not supported +SYN mod/merc/e 1 crs-tgt: e parameter is not supported +SYN mod/merc/e 2 crs-tgt: e parameter is not supported +SYN mod/merc/e 3 crs-tgt: e parameter is not supported +SYN mod/merc/e 4 crs-tgt: e parameter is not supported +SYN mod/merc/h 0 crs-tgt: +SYN mod/merc/h 1 crs-tgt: +SYN mod/merc/h 2 crs-tgt: +SYN mod/merc/h 3 crs-tgt: +SYN mod/merc/h 4 crs-tgt: +SYN mod/merc/south 0 crs-tgt: +SYN mod/merc/south 1 crs-tgt: +SYN mod/merc/south 2 crs-tgt: +SYN mod/merc/south 3 crs-tgt: +SYN mod/merc/south 4 crs-tgt: +SYN mod/merc/unknown_keyword 0 crs-tgt: unknown_keyword parameter is not supported +SYN mod/merc/unknown_keyword 1 crs-tgt: unknown_keyword parameter is not supported +SYN mod/merc/unknown_keyword 2 crs-tgt: unknown_keyword parameter is not supported +SYN mod/merc/unknown_keyword 3 crs-tgt: unknown_keyword parameter is not supported +SYN mod/merc/unknown_keyword 4 crs-tgt: unknown_keyword parameter is not supported +SYN mod/merc/vto_meter 0 crs-tgt: vto_meter parameter is not supported +SYN mod/merc/vto_meter 1 crs-tgt: vto_meter parameter is not supported +SYN mod/merc/vto_meter 2 crs-tgt: vto_meter parameter is not supported +SYN mod/merc/vto_meter 3 crs-tgt: vto_meter parameter is not supported +SYN mod/merc/vto_meter 4 crs-tgt: vto_meter parameter is not supported +SYN mod/merc/vunits_m 0 crs-tgt: vunits parameter is not supported +SYN mod/merc/vunits_m 1 crs-tgt: vunits parameter is not supported +SYN mod/merc/vunits_m 2 crs-tgt: vunits parameter is not supported +SYN mod/merc/vunits_m 3 crs-tgt: vunits parameter is not supported +SYN mod/merc/vunits_m 4 crs-tgt: vunits parameter is not supported +SYN mod/tmerc/R_C 0 crs-tgt: R_C parameter is not supported +SYN mod/tmerc/R_C 1 crs-tgt: R_C parameter is not supported +SYN mod/tmerc/R_C 2 crs-tgt: R_C parameter is not supported +SYN mod/tmerc/R_C 3 crs-tgt: R_C parameter is not supported +SYN mod/tmerc/R_C 4 crs-tgt: R_C parameter is not supported +SYN mod/tmerc/R_V 0 crs-tgt: R_V parameter is not supported +SYN mod/tmerc/R_V 1 crs-tgt: R_V parameter is not supported +SYN mod/tmerc/R_V 2 crs-tgt: R_V parameter is not supported +SYN mod/tmerc/R_V 3 crs-tgt: R_V parameter is not supported +SYN mod/tmerc/R_V 4 crs-tgt: R_V parameter is not supported +SYN mod/tmerc/R_a 0 crs-tgt: R_a parameter is not supported +SYN mod/tmerc/R_a 1 crs-tgt: R_a parameter is not supported +SYN mod/tmerc/R_a 2 crs-tgt: R_a parameter is not supported +SYN mod/tmerc/R_a 3 crs-tgt: R_a parameter is not supported +SYN mod/tmerc/R_a 4 crs-tgt: R_a parameter is not supported +SYN mod/tmerc/R_g 0 crs-tgt: R_g parameter is not supported +SYN mod/tmerc/R_g 1 crs-tgt: R_g parameter is not supported +SYN mod/tmerc/R_g 2 crs-tgt: R_g parameter is not supported +SYN mod/tmerc/R_g 3 crs-tgt: R_g parameter is not supported +SYN mod/tmerc/R_g 4 crs-tgt: R_g parameter is not supported +SYN mod/tmerc/R_h 0 crs-tgt: R_h parameter is not supported +SYN mod/tmerc/R_h 1 crs-tgt: R_h parameter is not supported +SYN mod/tmerc/R_h 2 crs-tgt: R_h parameter is not supported +SYN mod/tmerc/R_h 3 crs-tgt: R_h parameter is not supported +SYN mod/tmerc/R_h 4 crs-tgt: R_h parameter is not supported +SYN mod/tmerc/R_lat_a 0 crs-tgt: R_lat_a parameter is not supported +SYN mod/tmerc/R_lat_a 1 crs-tgt: R_lat_a parameter is not supported +SYN mod/tmerc/R_lat_a 2 crs-tgt: R_lat_a parameter is not supported +SYN mod/tmerc/R_lat_a 3 crs-tgt: R_lat_a parameter is not supported +SYN mod/tmerc/R_lat_a 4 crs-tgt: R_lat_a parameter is not supported +SYN mod/tmerc/R_lat_g 0 crs-tgt: R_lat_g parameter is not supported +SYN mod/tmerc/R_lat_g 1 crs-tgt: R_lat_g parameter is not supported +SYN mod/tmerc/R_lat_g 2 crs-tgt: R_lat_g parameter is not supported +SYN mod/tmerc/R_lat_g 3 crs-tgt: R_lat_g parameter is not supported +SYN mod/tmerc/R_lat_g 4 crs-tgt: R_lat_g parameter is not supported +SYN mod/tmerc/datum_nad83_lower 0 crs-tgt: Unknown datum: nad83 +SYN mod/tmerc/datum_nad83_lower 1 crs-tgt: Unknown datum: nad83 +SYN mod/tmerc/datum_nad83_lower 2 crs-tgt: Unknown datum: nad83 +SYN mod/tmerc/datum_nad83_lower 3 crs-tgt: Unknown datum: nad83 +SYN mod/tmerc/datum_nad83_lower 4 crs-tgt: Unknown datum: nad83 +SYN mod/tmerc/e 0 crs-tgt: e parameter is not supported +SYN mod/tmerc/e 1 crs-tgt: e parameter is not supported +SYN mod/tmerc/e 2 crs-tgt: e parameter is not supported +SYN mod/tmerc/e 3 crs-tgt: e parameter is not supported +SYN mod/tmerc/e 4 crs-tgt: e parameter is not supported +SYN mod/tmerc/h 0 crs-tgt: +SYN mod/tmerc/h 1 crs-tgt: +SYN mod/tmerc/h 2 crs-tgt: +SYN mod/tmerc/h 3 crs-tgt: +SYN mod/tmerc/h 4 crs-tgt: +SYN mod/tmerc/unknown_keyword 0 crs-tgt: unknown_keyword parameter is not supported +SYN mod/tmerc/unknown_keyword 1 crs-tgt: unknown_keyword parameter is not supported +SYN mod/tmerc/unknown_keyword 2 crs-tgt: unknown_keyword parameter is not supported +SYN mod/tmerc/unknown_keyword 3 crs-tgt: unknown_keyword parameter is not supported +SYN mod/tmerc/unknown_keyword 4 crs-tgt: unknown_keyword parameter is not supported +SYN mod/tmerc/vto_meter 0 crs-tgt: vto_meter parameter is not supported +SYN mod/tmerc/vto_meter 1 crs-tgt: vto_meter parameter is not supported +SYN mod/tmerc/vto_meter 2 crs-tgt: vto_meter parameter is not supported +SYN mod/tmerc/vto_meter 3 crs-tgt: vto_meter parameter is not supported +SYN mod/tmerc/vto_meter 4 crs-tgt: vto_meter parameter is not supported +SYN mod/tmerc/vunits_m 0 crs-tgt: vunits parameter is not supported +SYN mod/tmerc/vunits_m 1 crs-tgt: vunits parameter is not supported +SYN mod/tmerc/vunits_m 2 crs-tgt: vunits parameter is not supported +SYN mod/tmerc/vunits_m 3 crs-tgt: vunits parameter is not supported +SYN mod/tmerc/vunits_m 4 crs-tgt: vunits parameter is not supported +SYN mod/utm/R_C 0 crs-tgt: R_C parameter is not supported +SYN mod/utm/R_C 1 crs-tgt: R_C parameter is not supported +SYN mod/utm/R_C 2 crs-tgt: R_C parameter is not supported +SYN mod/utm/R_C 3 crs-tgt: R_C parameter is not supported +SYN mod/utm/R_C 4 crs-tgt: R_C parameter is not supported +SYN mod/utm/R_V 0 crs-tgt: R_V parameter is not supported +SYN mod/utm/R_V 1 crs-tgt: R_V parameter is not supported +SYN mod/utm/R_V 2 crs-tgt: R_V parameter is not supported +SYN mod/utm/R_V 3 crs-tgt: R_V parameter is not supported +SYN mod/utm/R_V 4 crs-tgt: R_V parameter is not supported +SYN mod/utm/R_a 0 crs-tgt: R_a parameter is not supported +SYN mod/utm/R_a 1 crs-tgt: R_a parameter is not supported +SYN mod/utm/R_a 2 crs-tgt: R_a parameter is not supported +SYN mod/utm/R_a 3 crs-tgt: R_a parameter is not supported +SYN mod/utm/R_a 4 crs-tgt: R_a parameter is not supported +SYN mod/utm/R_g 0 crs-tgt: R_g parameter is not supported +SYN mod/utm/R_g 1 crs-tgt: R_g parameter is not supported +SYN mod/utm/R_g 2 crs-tgt: R_g parameter is not supported +SYN mod/utm/R_g 3 crs-tgt: R_g parameter is not supported +SYN mod/utm/R_g 4 crs-tgt: R_g parameter is not supported +SYN mod/utm/R_h 0 crs-tgt: R_h parameter is not supported +SYN mod/utm/R_h 1 crs-tgt: R_h parameter is not supported +SYN mod/utm/R_h 2 crs-tgt: R_h parameter is not supported +SYN mod/utm/R_h 3 crs-tgt: R_h parameter is not supported +SYN mod/utm/R_h 4 crs-tgt: R_h parameter is not supported +SYN mod/utm/R_lat_a 0 crs-tgt: R_lat_a parameter is not supported +SYN mod/utm/R_lat_a 1 crs-tgt: R_lat_a parameter is not supported +SYN mod/utm/R_lat_a 2 crs-tgt: R_lat_a parameter is not supported +SYN mod/utm/R_lat_a 3 crs-tgt: R_lat_a parameter is not supported +SYN mod/utm/R_lat_a 4 crs-tgt: R_lat_a parameter is not supported +SYN mod/utm/R_lat_g 0 crs-tgt: R_lat_g parameter is not supported +SYN mod/utm/R_lat_g 1 crs-tgt: R_lat_g parameter is not supported +SYN mod/utm/R_lat_g 2 crs-tgt: R_lat_g parameter is not supported +SYN mod/utm/R_lat_g 3 crs-tgt: R_lat_g parameter is not supported +SYN mod/utm/R_lat_g 4 crs-tgt: R_lat_g parameter is not supported +SYN mod/utm/datum_nad83_lower 0 crs-tgt: Unknown datum: nad83 +SYN mod/utm/datum_nad83_lower 1 crs-tgt: Unknown datum: nad83 +SYN mod/utm/datum_nad83_lower 2 crs-tgt: Unknown datum: nad83 +SYN mod/utm/datum_nad83_lower 3 crs-tgt: Unknown datum: nad83 +SYN mod/utm/datum_nad83_lower 4 crs-tgt: Unknown datum: nad83 +SYN mod/utm/e 0 crs-tgt: e parameter is not supported +SYN mod/utm/e 1 crs-tgt: e parameter is not supported +SYN mod/utm/e 2 crs-tgt: e parameter is not supported +SYN mod/utm/e 3 crs-tgt: e parameter is not supported +SYN mod/utm/e 4 crs-tgt: e parameter is not supported +SYN mod/utm/h 0 crs-tgt: +SYN mod/utm/h 1 crs-tgt: +SYN mod/utm/h 2 crs-tgt: +SYN mod/utm/h 3 crs-tgt: +SYN mod/utm/h 4 crs-tgt: +SYN mod/utm/unknown_keyword 0 crs-tgt: unknown_keyword parameter is not supported +SYN mod/utm/unknown_keyword 1 crs-tgt: unknown_keyword parameter is not supported +SYN mod/utm/unknown_keyword 2 crs-tgt: unknown_keyword parameter is not supported +SYN mod/utm/unknown_keyword 3 crs-tgt: unknown_keyword parameter is not supported +SYN mod/utm/unknown_keyword 4 crs-tgt: unknown_keyword parameter is not supported +SYN mod/utm/vto_meter 0 crs-tgt: vto_meter parameter is not supported +SYN mod/utm/vto_meter 1 crs-tgt: vto_meter parameter is not supported +SYN mod/utm/vto_meter 2 crs-tgt: vto_meter parameter is not supported +SYN mod/utm/vto_meter 3 crs-tgt: vto_meter parameter is not supported +SYN mod/utm/vto_meter 4 crs-tgt: vto_meter parameter is not supported +SYN mod/utm/vunits_m 0 crs-tgt: vunits parameter is not supported +SYN mod/utm/vunits_m 1 crs-tgt: vunits parameter is not supported +SYN mod/utm/vunits_m 2 crs-tgt: vunits parameter is not supported +SYN mod/utm/vunits_m 3 crs-tgt: vunits parameter is not supported +SYN mod/utm/vunits_m 4 crs-tgt: vunits parameter is not supported +SYN proj/adams_hemi 0 crs-tgt: Unknown projection: adams_hemi +SYN proj/adams_hemi 1 crs-tgt: Unknown projection: adams_hemi +SYN proj/adams_hemi 2 crs-tgt: Unknown projection: adams_hemi +SYN proj/adams_hemi 3 crs-tgt: Unknown projection: adams_hemi +SYN proj/adams_hemi 4 crs-tgt: Unknown projection: adams_hemi +SYN proj/adams_ws1 0 crs-tgt: Unknown projection: adams_ws1 +SYN proj/adams_ws1 1 crs-tgt: Unknown projection: adams_ws1 +SYN proj/adams_ws1 2 crs-tgt: Unknown projection: adams_ws1 +SYN proj/adams_ws1 3 crs-tgt: Unknown projection: adams_ws1 +SYN proj/adams_ws1 4 crs-tgt: Unknown projection: adams_ws1 +SYN proj/adams_ws2 0 crs-tgt: Unknown projection: adams_ws2 +SYN proj/adams_ws2 1 crs-tgt: Unknown projection: adams_ws2 +SYN proj/adams_ws2 2 crs-tgt: Unknown projection: adams_ws2 +SYN proj/adams_ws2 3 crs-tgt: Unknown projection: adams_ws2 +SYN proj/adams_ws2 4 crs-tgt: Unknown projection: adams_ws2 +SYN proj/affine 0 crs-tgt: Unknown projection: affine +SYN proj/affine 1 crs-tgt: Unknown projection: affine +SYN proj/affine 2 crs-tgt: Unknown projection: affine +SYN proj/affine 3 crs-tgt: Unknown projection: affine +SYN proj/affine 4 crs-tgt: Unknown projection: affine +SYN proj/airocean 0 crs-tgt: Unknown projection: airocean +SYN proj/airocean 1 crs-tgt: Unknown projection: airocean +SYN proj/airocean 2 crs-tgt: Unknown projection: airocean +SYN proj/airocean 3 crs-tgt: Unknown projection: airocean +SYN proj/airocean 4 crs-tgt: Unknown projection: airocean +SYN proj/alsk 0 crs-tgt: Unknown projection: alsk +SYN proj/alsk 1 crs-tgt: Unknown projection: alsk +SYN proj/alsk 2 crs-tgt: Unknown projection: alsk +SYN proj/alsk 3 crs-tgt: Unknown projection: alsk +SYN proj/alsk 4 crs-tgt: Unknown projection: alsk +SYN proj/apian 0 crs-tgt: Unknown projection: apian +SYN proj/apian 1 crs-tgt: Unknown projection: apian +SYN proj/apian 2 crs-tgt: Unknown projection: apian +SYN proj/apian 3 crs-tgt: Unknown projection: apian +SYN proj/apian 4 crs-tgt: Unknown projection: apian +SYN proj/axisswap 0 crs-tgt: Unknown projection: axisswap +SYN proj/axisswap 1 crs-tgt: Unknown projection: axisswap +SYN proj/axisswap 2 crs-tgt: Unknown projection: axisswap +SYN proj/axisswap 3 crs-tgt: Unknown projection: axisswap +SYN proj/axisswap 4 crs-tgt: Unknown projection: axisswap +SYN proj/bacon 0 crs-tgt: Unknown projection: bacon +SYN proj/bacon 1 crs-tgt: Unknown projection: bacon +SYN proj/bacon 2 crs-tgt: Unknown projection: bacon +SYN proj/bacon 3 crs-tgt: Unknown projection: bacon +SYN proj/bacon 4 crs-tgt: Unknown projection: bacon +SYN proj/bertin1953 0 crs-tgt: Unknown projection: bertin1953 +SYN proj/bertin1953 1 crs-tgt: Unknown projection: bertin1953 +SYN proj/bertin1953 2 crs-tgt: Unknown projection: bertin1953 +SYN proj/bertin1953 3 crs-tgt: Unknown projection: bertin1953 +SYN proj/bertin1953 4 crs-tgt: Unknown projection: bertin1953 +SYN proj/calcofi 0 crs-tgt: Unknown projection: calcofi +SYN proj/calcofi 1 crs-tgt: Unknown projection: calcofi +SYN proj/calcofi 2 crs-tgt: Unknown projection: calcofi +SYN proj/calcofi 3 crs-tgt: Unknown projection: calcofi +SYN proj/calcofi 4 crs-tgt: Unknown projection: calcofi +SYN proj/cart 0 crs-tgt: Unknown projection: cart +SYN proj/cart 1 crs-tgt: Unknown projection: cart +SYN proj/cart 2 crs-tgt: Unknown projection: cart +SYN proj/cart 3 crs-tgt: Unknown projection: cart +SYN proj/cart 4 crs-tgt: Unknown projection: cart +SYN proj/ccon 0 crs-tgt: Unknown projection: ccon +SYN proj/ccon 1 crs-tgt: Unknown projection: ccon +SYN proj/ccon 2 crs-tgt: Unknown projection: ccon +SYN proj/ccon 3 crs-tgt: Unknown projection: ccon +SYN proj/ccon 4 crs-tgt: Unknown projection: ccon +SYN proj/chamb 0 crs-tgt: Unknown projection: chamb +SYN proj/chamb 1 crs-tgt: Unknown projection: chamb +SYN proj/chamb 2 crs-tgt: Unknown projection: chamb +SYN proj/chamb 3 crs-tgt: Unknown projection: chamb +SYN proj/chamb 4 crs-tgt: Unknown projection: chamb +SYN proj/col_urban 0 crs-tgt: Unknown projection: col_urban +SYN proj/col_urban 1 crs-tgt: Unknown projection: col_urban +SYN proj/col_urban 2 crs-tgt: Unknown projection: col_urban +SYN proj/col_urban 3 crs-tgt: Unknown projection: col_urban +SYN proj/col_urban 4 crs-tgt: Unknown projection: col_urban +SYN proj/comill 0 crs-tgt: Unknown projection: comill +SYN proj/comill 1 crs-tgt: Unknown projection: comill +SYN proj/comill 2 crs-tgt: Unknown projection: comill +SYN proj/comill 3 crs-tgt: Unknown projection: comill +SYN proj/comill 4 crs-tgt: Unknown projection: comill +SYN proj/defmodel 0 crs-tgt: Unknown projection: defmodel +SYN proj/defmodel 1 crs-tgt: Unknown projection: defmodel +SYN proj/defmodel 2 crs-tgt: Unknown projection: defmodel +SYN proj/defmodel 3 crs-tgt: Unknown projection: defmodel +SYN proj/defmodel 4 crs-tgt: Unknown projection: defmodel +SYN proj/deformation 0 crs-tgt: Unknown projection: deformation +SYN proj/deformation 1 crs-tgt: Unknown projection: deformation +SYN proj/deformation 2 crs-tgt: Unknown projection: deformation +SYN proj/deformation 3 crs-tgt: Unknown projection: deformation +SYN proj/deformation 4 crs-tgt: Unknown projection: deformation +SYN proj/eck3 0 crs-tgt: Unknown projection: eck3 +SYN proj/eck3 1 crs-tgt: Unknown projection: eck3 +SYN proj/eck3 2 crs-tgt: Unknown projection: eck3 +SYN proj/eck3 3 crs-tgt: Unknown projection: eck3 +SYN proj/eck3 4 crs-tgt: Unknown projection: eck3 +SYN proj/eqearth 0 crs-tgt: Unknown projection: eqearth +SYN proj/eqearth 1 crs-tgt: Unknown projection: eqearth +SYN proj/eqearth 2 crs-tgt: Unknown projection: eqearth +SYN proj/eqearth 3 crs-tgt: Unknown projection: eqearth +SYN proj/eqearth 4 crs-tgt: Unknown projection: eqearth +SYN proj/geoc 0 crs-tgt: Unknown projection: geoc +SYN proj/geoc 1 crs-tgt: Unknown projection: geoc +SYN proj/geoc 2 crs-tgt: Unknown projection: geoc +SYN proj/geoc 3 crs-tgt: Unknown projection: geoc +SYN proj/geoc 4 crs-tgt: Unknown projection: geoc +SYN proj/geogoffset 0 crs-tgt: Unknown projection: geogoffset +SYN proj/geogoffset 1 crs-tgt: Unknown projection: geogoffset +SYN proj/geogoffset 2 crs-tgt: Unknown projection: geogoffset +SYN proj/geogoffset 3 crs-tgt: Unknown projection: geogoffset +SYN proj/geogoffset 4 crs-tgt: Unknown projection: geogoffset +SYN proj/gins8 0 crs-tgt: Unknown projection: gins8 +SYN proj/gins8 1 crs-tgt: Unknown projection: gins8 +SYN proj/gins8 2 crs-tgt: Unknown projection: gins8 +SYN proj/gins8 3 crs-tgt: Unknown projection: gins8 +SYN proj/gins8 4 crs-tgt: Unknown projection: gins8 +SYN proj/gn_sinu 0 crs-tgt: Unknown projection: gn_sinu +SYN proj/gn_sinu 1 crs-tgt: Unknown projection: gn_sinu +SYN proj/gn_sinu 2 crs-tgt: Unknown projection: gn_sinu +SYN proj/gn_sinu 3 crs-tgt: Unknown projection: gn_sinu +SYN proj/gn_sinu 4 crs-tgt: Unknown projection: gn_sinu +SYN proj/gridshift 0 crs-tgt: Unknown projection: gridshift +SYN proj/gridshift 1 crs-tgt: Unknown projection: gridshift +SYN proj/gridshift 2 crs-tgt: Unknown projection: gridshift +SYN proj/gridshift 3 crs-tgt: Unknown projection: gridshift +SYN proj/gridshift 4 crs-tgt: Unknown projection: gridshift +SYN proj/gs48 0 crs-tgt: Unknown projection: gs48 +SYN proj/gs48 1 crs-tgt: Unknown projection: gs48 +SYN proj/gs48 2 crs-tgt: Unknown projection: gs48 +SYN proj/gs48 3 crs-tgt: Unknown projection: gs48 +SYN proj/gs48 4 crs-tgt: Unknown projection: gs48 +SYN proj/gs50 0 crs-tgt: Unknown projection: gs50 +SYN proj/gs50 1 crs-tgt: Unknown projection: gs50 +SYN proj/gs50 2 crs-tgt: Unknown projection: gs50 +SYN proj/gs50 3 crs-tgt: Unknown projection: gs50 +SYN proj/gs50 4 crs-tgt: Unknown projection: gs50 +SYN proj/gstmerc 0 crs-tgt: Unknown projection: gstmerc +SYN proj/gstmerc 1 crs-tgt: Unknown projection: gstmerc +SYN proj/gstmerc 2 crs-tgt: Unknown projection: gstmerc +SYN proj/gstmerc 3 crs-tgt: Unknown projection: gstmerc +SYN proj/gstmerc 4 crs-tgt: Unknown projection: gstmerc +SYN proj/guyou 0 crs-tgt: Unknown projection: guyou +SYN proj/guyou 1 crs-tgt: Unknown projection: guyou +SYN proj/guyou 2 crs-tgt: Unknown projection: guyou +SYN proj/guyou 3 crs-tgt: Unknown projection: guyou +SYN proj/guyou 4 crs-tgt: Unknown projection: guyou +SYN proj/healpix 0 crs-tgt: Unknown projection: healpix +SYN proj/healpix 1 crs-tgt: Unknown projection: healpix +SYN proj/healpix 2 crs-tgt: Unknown projection: healpix +SYN proj/healpix 3 crs-tgt: Unknown projection: healpix +SYN proj/healpix 4 crs-tgt: Unknown projection: healpix +SYN proj/helmert 0 crs-tgt: Unknown projection: helmert +SYN proj/helmert 1 crs-tgt: Unknown projection: helmert +SYN proj/helmert 2 crs-tgt: Unknown projection: helmert +SYN proj/helmert 3 crs-tgt: Unknown projection: helmert +SYN proj/helmert 4 crs-tgt: Unknown projection: helmert +SYN proj/hgridshift 0 crs-tgt: Unknown projection: hgridshift +SYN proj/hgridshift 1 crs-tgt: Unknown projection: hgridshift +SYN proj/hgridshift 2 crs-tgt: Unknown projection: hgridshift +SYN proj/hgridshift 3 crs-tgt: Unknown projection: hgridshift +SYN proj/hgridshift 4 crs-tgt: Unknown projection: hgridshift +SYN proj/horner 0 crs-tgt: Unknown projection: horner +SYN proj/horner 1 crs-tgt: Unknown projection: horner +SYN proj/horner 2 crs-tgt: Unknown projection: horner +SYN proj/horner 3 crs-tgt: Unknown projection: horner +SYN proj/horner 4 crs-tgt: Unknown projection: horner +SYN proj/id 0 crs-tgt: Unknown projection: id +SYN proj/id 1 crs-tgt: Unknown projection: id +SYN proj/id 2 crs-tgt: Unknown projection: id +SYN proj/id 3 crs-tgt: Unknown projection: id +SYN proj/id 4 crs-tgt: Unknown projection: id +SYN proj/igh 0 crs-tgt: Unknown projection: igh +SYN proj/igh 1 crs-tgt: Unknown projection: igh +SYN proj/igh 2 crs-tgt: Unknown projection: igh +SYN proj/igh 3 crs-tgt: Unknown projection: igh +SYN proj/igh 4 crs-tgt: Unknown projection: igh +SYN proj/igh_o 0 crs-tgt: Unknown projection: igh_o +SYN proj/igh_o 1 crs-tgt: Unknown projection: igh_o +SYN proj/igh_o 2 crs-tgt: Unknown projection: igh_o +SYN proj/igh_o 3 crs-tgt: Unknown projection: igh_o +SYN proj/igh_o 4 crs-tgt: Unknown projection: igh_o +SYN proj/imoll 0 crs-tgt: Unknown projection: imoll +SYN proj/imoll 1 crs-tgt: Unknown projection: imoll +SYN proj/imoll 2 crs-tgt: Unknown projection: imoll +SYN proj/imoll 3 crs-tgt: Unknown projection: imoll +SYN proj/imoll 4 crs-tgt: Unknown projection: imoll +SYN proj/imoll_o 0 crs-tgt: Unknown projection: imoll_o +SYN proj/imoll_o 1 crs-tgt: Unknown projection: imoll_o +SYN proj/imoll_o 2 crs-tgt: Unknown projection: imoll_o +SYN proj/imoll_o 3 crs-tgt: Unknown projection: imoll_o +SYN proj/imoll_o 4 crs-tgt: Unknown projection: imoll_o +SYN proj/imw_p 0 crs-tgt: Unknown projection: imw_p +SYN proj/imw_p 1 crs-tgt: Unknown projection: imw_p +SYN proj/imw_p 2 crs-tgt: Unknown projection: imw_p +SYN proj/imw_p 3 crs-tgt: Unknown projection: imw_p +SYN proj/imw_p 4 crs-tgt: Unknown projection: imw_p +SYN proj/isea 0 crs-tgt: Unknown projection: isea +SYN proj/isea 1 crs-tgt: Unknown projection: isea +SYN proj/isea 2 crs-tgt: Unknown projection: isea +SYN proj/isea 3 crs-tgt: Unknown projection: isea +SYN proj/isea 4 crs-tgt: Unknown projection: isea +SYN proj/kav7 0 crs-tgt: Unknown projection: kav7 +SYN proj/kav7 1 crs-tgt: Unknown projection: kav7 +SYN proj/kav7 2 crs-tgt: Unknown projection: kav7 +SYN proj/kav7 3 crs-tgt: Unknown projection: kav7 +SYN proj/kav7 4 crs-tgt: Unknown projection: kav7 +SYN proj/labrd 0 crs-tgt: Unknown projection: labrd +SYN proj/labrd 1 crs-tgt: Unknown projection: labrd +SYN proj/labrd 2 crs-tgt: Unknown projection: labrd +SYN proj/labrd 3 crs-tgt: Unknown projection: labrd +SYN proj/labrd 4 crs-tgt: Unknown projection: labrd +SYN proj/lcca 0 crs-tgt: Unknown projection: lcca +SYN proj/lcca 1 crs-tgt: Unknown projection: lcca +SYN proj/lcca 2 crs-tgt: Unknown projection: lcca +SYN proj/lcca 3 crs-tgt: Unknown projection: lcca +SYN proj/lcca 4 crs-tgt: Unknown projection: lcca +SYN proj/lee_os 0 crs-tgt: Unknown projection: lee_os +SYN proj/lee_os 1 crs-tgt: Unknown projection: lee_os +SYN proj/lee_os 2 crs-tgt: Unknown projection: lee_os +SYN proj/lee_os 3 crs-tgt: Unknown projection: lee_os +SYN proj/lee_os 4 crs-tgt: Unknown projection: lee_os +SYN proj/mbt_s 0 crs-tgt: Unknown projection: mbt_s +SYN proj/mbt_s 1 crs-tgt: Unknown projection: mbt_s +SYN proj/mbt_s 2 crs-tgt: Unknown projection: mbt_s +SYN proj/mbt_s 3 crs-tgt: Unknown projection: mbt_s +SYN proj/mbt_s 4 crs-tgt: Unknown projection: mbt_s +SYN proj/mbtfps 0 crs-tgt: Unknown projection: mbtfps +SYN proj/mbtfps 1 crs-tgt: Unknown projection: mbtfps +SYN proj/mbtfps 2 crs-tgt: Unknown projection: mbtfps +SYN proj/mbtfps 3 crs-tgt: Unknown projection: mbtfps +SYN proj/mbtfps 4 crs-tgt: Unknown projection: mbtfps +SYN proj/mil_os 0 crs-tgt: Unknown projection: mil_os +SYN proj/mil_os 1 crs-tgt: Unknown projection: mil_os +SYN proj/mil_os 2 crs-tgt: Unknown projection: mil_os +SYN proj/mil_os 3 crs-tgt: Unknown projection: mil_os +SYN proj/mil_os 4 crs-tgt: Unknown projection: mil_os +SYN proj/misrsom 0 crs-tgt: Unknown projection: misrsom +SYN proj/misrsom 1 crs-tgt: Unknown projection: misrsom +SYN proj/misrsom 2 crs-tgt: Unknown projection: misrsom +SYN proj/misrsom 3 crs-tgt: Unknown projection: misrsom +SYN proj/misrsom 4 crs-tgt: Unknown projection: misrsom +SYN proj/mod_krovak 0 crs-tgt: Unknown projection: mod_krovak +SYN proj/mod_krovak 1 crs-tgt: Unknown projection: mod_krovak +SYN proj/mod_krovak 2 crs-tgt: Unknown projection: mod_krovak +SYN proj/mod_krovak 3 crs-tgt: Unknown projection: mod_krovak +SYN proj/mod_krovak 4 crs-tgt: Unknown projection: mod_krovak +SYN proj/molobadekas 0 crs-tgt: Unknown projection: molobadekas +SYN proj/molobadekas 1 crs-tgt: Unknown projection: molobadekas +SYN proj/molobadekas 2 crs-tgt: Unknown projection: molobadekas +SYN proj/molobadekas 3 crs-tgt: Unknown projection: molobadekas +SYN proj/molobadekas 4 crs-tgt: Unknown projection: molobadekas +SYN proj/molodensky 0 crs-tgt: Unknown projection: molodensky +SYN proj/molodensky 1 crs-tgt: Unknown projection: molodensky +SYN proj/molodensky 2 crs-tgt: Unknown projection: molodensky +SYN proj/molodensky 3 crs-tgt: Unknown projection: molodensky +SYN proj/molodensky 4 crs-tgt: Unknown projection: molodensky +SYN proj/name 0 crs-tgt: Unknown projection: name +SYN proj/name 1 crs-tgt: Unknown projection: name +SYN proj/name 2 crs-tgt: Unknown projection: name +SYN proj/name 3 crs-tgt: Unknown projection: name +SYN proj/name 4 crs-tgt: Unknown projection: name +SYN proj/natearth 0 crs-tgt: Unknown projection: natearth +SYN proj/natearth 1 crs-tgt: Unknown projection: natearth +SYN proj/natearth 2 crs-tgt: Unknown projection: natearth +SYN proj/natearth 3 crs-tgt: Unknown projection: natearth +SYN proj/natearth 4 crs-tgt: Unknown projection: natearth +SYN proj/natearth2 0 crs-tgt: Unknown projection: natearth2 +SYN proj/natearth2 1 crs-tgt: Unknown projection: natearth2 +SYN proj/natearth2 2 crs-tgt: Unknown projection: natearth2 +SYN proj/natearth2 3 crs-tgt: Unknown projection: natearth2 +SYN proj/natearth2 4 crs-tgt: Unknown projection: natearth2 +SYN proj/nell_h 0 crs-tgt: Unknown projection: nell_h +SYN proj/nell_h 1 crs-tgt: Unknown projection: nell_h +SYN proj/nell_h 2 crs-tgt: Unknown projection: nell_h +SYN proj/nell_h 3 crs-tgt: Unknown projection: nell_h +SYN proj/nell_h 4 crs-tgt: Unknown projection: nell_h +SYN proj/noop 0 crs-tgt: Unknown projection: noop +SYN proj/noop 1 crs-tgt: Unknown projection: noop +SYN proj/noop 2 crs-tgt: Unknown projection: noop +SYN proj/noop 3 crs-tgt: Unknown projection: noop +SYN proj/noop 4 crs-tgt: Unknown projection: noop +SYN proj/nzmg 0 inv: Infinite longitude +SYN proj/nzmg 1 inv: Infinite longitude +SYN proj/nzmg 2 inv: Infinite longitude +SYN proj/nzmg 3 inv: Infinite longitude +SYN proj/nzmg 4 inv: Infinite longitude +SYN proj/ob_tran 0 crs-tgt: Unknown projection: ob_tran +SYN proj/ob_tran 1 crs-tgt: Unknown projection: ob_tran +SYN proj/ob_tran 2 crs-tgt: Unknown projection: ob_tran +SYN proj/ob_tran 3 crs-tgt: Unknown projection: ob_tran +SYN proj/ob_tran 4 crs-tgt: Unknown projection: ob_tran +SYN proj/ocea 0 crs-tgt: Unknown projection: ocea +SYN proj/ocea 1 crs-tgt: Unknown projection: ocea +SYN proj/ocea 2 crs-tgt: Unknown projection: ocea +SYN proj/ocea 3 crs-tgt: Unknown projection: ocea +SYN proj/ocea 4 crs-tgt: Unknown projection: ocea +SYN proj/oea 0 crs-tgt: Unknown projection: oea +SYN proj/oea 1 crs-tgt: Unknown projection: oea +SYN proj/oea 2 crs-tgt: Unknown projection: oea +SYN proj/oea 3 crs-tgt: Unknown projection: oea +SYN proj/oea 4 crs-tgt: Unknown projection: oea +SYN proj/omerc 0 fwd: Infinite longitude +SYN proj/omerc 1 fwd: Infinite longitude +SYN proj/omerc 2 fwd: Infinite longitude +SYN proj/omerc 3 fwd: Infinite longitude +SYN proj/omerc 4 fwd: Infinite longitude +SYN proj/ortel 0 crs-tgt: Unknown projection: ortel +SYN proj/ortel 1 crs-tgt: Unknown projection: ortel +SYN proj/ortel 2 crs-tgt: Unknown projection: ortel +SYN proj/ortel 3 crs-tgt: Unknown projection: ortel +SYN proj/ortel 4 crs-tgt: Unknown projection: ortel +SYN proj/patterson 0 crs-tgt: Unknown projection: patterson +SYN proj/patterson 1 crs-tgt: Unknown projection: patterson +SYN proj/patterson 2 crs-tgt: Unknown projection: patterson +SYN proj/patterson 3 crs-tgt: Unknown projection: patterson +SYN proj/patterson 4 crs-tgt: Unknown projection: patterson +SYN proj/peirce_q 0 crs-tgt: Unknown projection: peirce_q +SYN proj/peirce_q 1 crs-tgt: Unknown projection: peirce_q +SYN proj/peirce_q 2 crs-tgt: Unknown projection: peirce_q +SYN proj/peirce_q 3 crs-tgt: Unknown projection: peirce_q +SYN proj/peirce_q 4 crs-tgt: Unknown projection: peirce_q +SYN proj/pipeline 0 crs-tgt: Unknown projection: pipeline +SYN proj/pipeline 1 crs-tgt: Unknown projection: pipeline +SYN proj/pipeline 2 crs-tgt: Unknown projection: pipeline +SYN proj/pipeline 3 crs-tgt: Unknown projection: pipeline +SYN proj/pipeline 4 crs-tgt: Unknown projection: pipeline +SYN proj/poly 0 inv: Infinite longitude +SYN proj/pop 0 crs-tgt: Unknown projection: pop +SYN proj/pop 1 crs-tgt: Unknown projection: pop +SYN proj/pop 2 crs-tgt: Unknown projection: pop +SYN proj/pop 3 crs-tgt: Unknown projection: pop +SYN proj/pop 4 crs-tgt: Unknown projection: pop +SYN proj/push 0 crs-tgt: Unknown projection: push +SYN proj/push 1 crs-tgt: Unknown projection: push +SYN proj/push 2 crs-tgt: Unknown projection: push +SYN proj/push 3 crs-tgt: Unknown projection: push +SYN proj/push 4 crs-tgt: Unknown projection: push +SYN proj/putp1 0 crs-tgt: Unknown projection: putp1 +SYN proj/putp1 1 crs-tgt: Unknown projection: putp1 +SYN proj/putp1 2 crs-tgt: Unknown projection: putp1 +SYN proj/putp1 3 crs-tgt: Unknown projection: putp1 +SYN proj/putp1 4 crs-tgt: Unknown projection: putp1 +SYN proj/putp3 0 crs-tgt: Unknown projection: putp3 +SYN proj/putp3 1 crs-tgt: Unknown projection: putp3 +SYN proj/putp3 2 crs-tgt: Unknown projection: putp3 +SYN proj/putp3 3 crs-tgt: Unknown projection: putp3 +SYN proj/putp3 4 crs-tgt: Unknown projection: putp3 +SYN proj/putp3p 0 crs-tgt: Unknown projection: putp3p +SYN proj/putp3p 1 crs-tgt: Unknown projection: putp3p +SYN proj/putp3p 2 crs-tgt: Unknown projection: putp3p +SYN proj/putp3p 3 crs-tgt: Unknown projection: putp3p +SYN proj/putp3p 4 crs-tgt: Unknown projection: putp3p +SYN proj/putp6 0 crs-tgt: Unknown projection: putp6 +SYN proj/putp6 1 crs-tgt: Unknown projection: putp6 +SYN proj/putp6 2 crs-tgt: Unknown projection: putp6 +SYN proj/putp6 3 crs-tgt: Unknown projection: putp6 +SYN proj/putp6 4 crs-tgt: Unknown projection: putp6 +SYN proj/putp6p 0 crs-tgt: Unknown projection: putp6p +SYN proj/putp6p 1 crs-tgt: Unknown projection: putp6p +SYN proj/putp6p 2 crs-tgt: Unknown projection: putp6p +SYN proj/putp6p 3 crs-tgt: Unknown projection: putp6p +SYN proj/putp6p 4 crs-tgt: Unknown projection: putp6p +SYN proj/qsc 0 crs-tgt: Unknown projection: qsc +SYN proj/qsc 1 crs-tgt: Unknown projection: qsc +SYN proj/qsc 2 crs-tgt: Unknown projection: qsc +SYN proj/qsc 3 crs-tgt: Unknown projection: qsc +SYN proj/qsc 4 crs-tgt: Unknown projection: qsc +SYN proj/rhealpix 0 crs-tgt: Unknown projection: rhealpix +SYN proj/rhealpix 1 crs-tgt: Unknown projection: rhealpix +SYN proj/rhealpix 2 crs-tgt: Unknown projection: rhealpix +SYN proj/rhealpix 3 crs-tgt: Unknown projection: rhealpix +SYN proj/rhealpix 4 crs-tgt: Unknown projection: rhealpix +SYN proj/rouss 0 crs-tgt: Unknown projection: rouss +SYN proj/rouss 1 crs-tgt: Unknown projection: rouss +SYN proj/rouss 2 crs-tgt: Unknown projection: rouss +SYN proj/rouss 3 crs-tgt: Unknown projection: rouss +SYN proj/rouss 4 crs-tgt: Unknown projection: rouss +SYN proj/s2 0 crs-tgt: Unknown projection: s2 +SYN proj/s2 1 crs-tgt: Unknown projection: s2 +SYN proj/s2 2 crs-tgt: Unknown projection: s2 +SYN proj/s2 3 crs-tgt: Unknown projection: s2 +SYN proj/s2 4 crs-tgt: Unknown projection: s2 +SYN proj/sch 0 crs-tgt: Unknown projection: sch +SYN proj/sch 1 crs-tgt: Unknown projection: sch +SYN proj/sch 2 crs-tgt: Unknown projection: sch +SYN proj/sch 3 crs-tgt: Unknown projection: sch +SYN proj/sch 4 crs-tgt: Unknown projection: sch +SYN proj/set 0 crs-tgt: Unknown projection: set +SYN proj/set 1 crs-tgt: Unknown projection: set +SYN proj/set 2 crs-tgt: Unknown projection: set +SYN proj/set 3 crs-tgt: Unknown projection: set +SYN proj/set 4 crs-tgt: Unknown projection: set +SYN proj/som 0 crs-tgt: Unknown projection: som +SYN proj/som 1 crs-tgt: Unknown projection: som +SYN proj/som 2 crs-tgt: Unknown projection: som +SYN proj/som 3 crs-tgt: Unknown projection: som +SYN proj/som 4 crs-tgt: Unknown projection: som +SYN proj/spilhaus 0 crs-tgt: Unknown projection: spilhaus +SYN proj/spilhaus 1 crs-tgt: Unknown projection: spilhaus +SYN proj/spilhaus 2 crs-tgt: Unknown projection: spilhaus +SYN proj/spilhaus 3 crs-tgt: Unknown projection: spilhaus +SYN proj/spilhaus 4 crs-tgt: Unknown projection: spilhaus +SYN proj/times 0 crs-tgt: Unknown projection: times +SYN proj/times 1 crs-tgt: Unknown projection: times +SYN proj/times 2 crs-tgt: Unknown projection: times +SYN proj/times 3 crs-tgt: Unknown projection: times +SYN proj/times 4 crs-tgt: Unknown projection: times +SYN proj/tinshift 0 crs-tgt: Unknown projection: tinshift +SYN proj/tinshift 1 crs-tgt: Unknown projection: tinshift +SYN proj/tinshift 2 crs-tgt: Unknown projection: tinshift +SYN proj/tinshift 3 crs-tgt: Unknown projection: tinshift +SYN proj/tinshift 4 crs-tgt: Unknown projection: tinshift +SYN proj/tissot 0 crs-tgt: Unknown projection: tissot +SYN proj/tissot 1 crs-tgt: Unknown projection: tissot +SYN proj/tissot 2 crs-tgt: Unknown projection: tissot +SYN proj/tissot 3 crs-tgt: Unknown projection: tissot +SYN proj/tissot 4 crs-tgt: Unknown projection: tissot +SYN proj/tobmerc 0 crs-tgt: Unknown projection: tobmerc +SYN proj/tobmerc 1 crs-tgt: Unknown projection: tobmerc +SYN proj/tobmerc 2 crs-tgt: Unknown projection: tobmerc +SYN proj/tobmerc 3 crs-tgt: Unknown projection: tobmerc +SYN proj/tobmerc 4 crs-tgt: Unknown projection: tobmerc +SYN proj/topocentric 0 crs-tgt: Unknown projection: topocentric +SYN proj/topocentric 1 crs-tgt: Unknown projection: topocentric +SYN proj/topocentric 2 crs-tgt: Unknown projection: topocentric +SYN proj/topocentric 3 crs-tgt: Unknown projection: topocentric +SYN proj/topocentric 4 crs-tgt: Unknown projection: topocentric +SYN proj/tpeqd 0 crs-tgt: Unknown projection: tpeqd +SYN proj/tpeqd 1 crs-tgt: Unknown projection: tpeqd +SYN proj/tpeqd 2 crs-tgt: Unknown projection: tpeqd +SYN proj/tpeqd 3 crs-tgt: Unknown projection: tpeqd +SYN proj/tpeqd 4 crs-tgt: Unknown projection: tpeqd +SYN proj/tpers 0 crs-tgt: Unknown projection: tpers +SYN proj/tpers 1 crs-tgt: Unknown projection: tpers +SYN proj/tpers 2 crs-tgt: Unknown projection: tpers +SYN proj/tpers 3 crs-tgt: Unknown projection: tpers +SYN proj/tpers 4 crs-tgt: Unknown projection: tpers +SYN proj/unitconvert 0 crs-tgt: Unknown projection: unitconvert +SYN proj/unitconvert 1 crs-tgt: Unknown projection: unitconvert +SYN proj/unitconvert 2 crs-tgt: Unknown projection: unitconvert +SYN proj/unitconvert 3 crs-tgt: Unknown projection: unitconvert +SYN proj/unitconvert 4 crs-tgt: Unknown projection: unitconvert +SYN proj/ups 0 crs-tgt: Unknown projection: ups +SYN proj/ups 1 crs-tgt: Unknown projection: ups +SYN proj/ups 2 crs-tgt: Unknown projection: ups +SYN proj/ups 3 crs-tgt: Unknown projection: ups +SYN proj/ups 4 crs-tgt: Unknown projection: ups +SYN proj/urm5 0 crs-tgt: Unknown projection: urm5 +SYN proj/urm5 1 crs-tgt: Unknown projection: urm5 +SYN proj/urm5 2 crs-tgt: Unknown projection: urm5 +SYN proj/urm5 3 crs-tgt: Unknown projection: urm5 +SYN proj/urm5 4 crs-tgt: Unknown projection: urm5 +SYN proj/vandg2 0 crs-tgt: Unknown projection: vandg2 +SYN proj/vandg2 1 crs-tgt: Unknown projection: vandg2 +SYN proj/vandg2 2 crs-tgt: Unknown projection: vandg2 +SYN proj/vandg2 3 crs-tgt: Unknown projection: vandg2 +SYN proj/vandg2 4 crs-tgt: Unknown projection: vandg2 +SYN proj/vandg3 0 crs-tgt: Unknown projection: vandg3 +SYN proj/vandg3 1 crs-tgt: Unknown projection: vandg3 +SYN proj/vandg3 2 crs-tgt: Unknown projection: vandg3 +SYN proj/vandg3 3 crs-tgt: Unknown projection: vandg3 +SYN proj/vandg3 4 crs-tgt: Unknown projection: vandg3 +SYN proj/vandg4 0 crs-tgt: Unknown projection: vandg4 +SYN proj/vandg4 1 crs-tgt: Unknown projection: vandg4 +SYN proj/vandg4 2 crs-tgt: Unknown projection: vandg4 +SYN proj/vandg4 3 crs-tgt: Unknown projection: vandg4 +SYN proj/vandg4 4 crs-tgt: Unknown projection: vandg4 +SYN proj/vertoffset 0 crs-tgt: Unknown projection: vertoffset +SYN proj/vertoffset 1 crs-tgt: Unknown projection: vertoffset +SYN proj/vertoffset 2 crs-tgt: Unknown projection: vertoffset +SYN proj/vertoffset 3 crs-tgt: Unknown projection: vertoffset +SYN proj/vertoffset 4 crs-tgt: Unknown projection: vertoffset +SYN proj/vgridshift 0 crs-tgt: Unknown projection: vgridshift +SYN proj/vgridshift 1 crs-tgt: Unknown projection: vgridshift +SYN proj/vgridshift 2 crs-tgt: Unknown projection: vgridshift +SYN proj/vgridshift 3 crs-tgt: Unknown projection: vgridshift +SYN proj/vgridshift 4 crs-tgt: Unknown projection: vgridshift +SYN proj/wag6 0 crs-tgt: Unknown projection: wag6 +SYN proj/wag6 1 crs-tgt: Unknown projection: wag6 +SYN proj/wag6 2 crs-tgt: Unknown projection: wag6 +SYN proj/wag6 3 crs-tgt: Unknown projection: wag6 +SYN proj/wag6 4 crs-tgt: Unknown projection: wag6 +SYN proj/webmerc 0 crs-tgt: Unknown projection: webmerc +SYN proj/webmerc 1 crs-tgt: Unknown projection: webmerc +SYN proj/webmerc 2 crs-tgt: Unknown projection: webmerc +SYN proj/webmerc 3 crs-tgt: Unknown projection: webmerc +SYN proj/webmerc 4 crs-tgt: Unknown projection: webmerc +SYN proj/wink1 0 crs-tgt: Unknown projection: wink1 +SYN proj/wink1 1 crs-tgt: Unknown projection: wink1 +SYN proj/wink1 2 crs-tgt: Unknown projection: wink1 +SYN proj/wink1 3 crs-tgt: Unknown projection: wink1 +SYN proj/wink1 4 crs-tgt: Unknown projection: wink1 +SYN proj/wink2 0 crs-tgt: Unknown projection: wink2 +SYN proj/wink2 1 crs-tgt: Unknown projection: wink2 +SYN proj/wink2 2 crs-tgt: Unknown projection: wink2 +SYN proj/wink2 3 crs-tgt: Unknown projection: wink2 +SYN proj/wink2 4 crs-tgt: Unknown projection: wink2 +SYN proj/xyzgridshift 0 crs-tgt: Unknown projection: xyzgridshift +SYN proj/xyzgridshift 1 crs-tgt: Unknown projection: xyzgridshift +SYN proj/xyzgridshift 2 crs-tgt: Unknown projection: xyzgridshift +SYN proj/xyzgridshift 3 crs-tgt: Unknown projection: xyzgridshift +SYN proj/xyzgridshift 4 crs-tgt: Unknown projection: xyzgridshift diff --git a/golden/baseline/1.4.3/golden-summary.txt b/golden/baseline/1.4.3/golden-summary.txt new file mode 100644 index 0000000..524b4db --- /dev/null +++ b/golden/baseline/1.4.3/golden-summary.txt @@ -0,0 +1,6 @@ +cases=14502 +rows=53430 +ok=50808 +exceptions=2622 +no_probe=0 +non_finite_rows=282 diff --git a/golden/baseline/1.4.3/golden.tsv b/golden/baseline/1.4.3/golden.tsv new file mode 100644 index 0000000..54c56a2 --- /dev/null +++ b/golden/baseline/1.4.3/golden.tsv @@ -0,0 +1,53431 @@ +section key probe status fx fy fz ix iy iz inside +CSV PROJ4_SPCS_EPSG_nad83.csv:00002 0 OK 0x1.e588af47a2af9p23 -0x1.c73c1e1ce880fp23 0x0.0p0 -0x1.0cp7 0x1.b7ffffffffd9dp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00003 0 OK 0x1.f49d8d555555ap23 -0x1.b6aec2979c79p23 0x0.0p0 -0x1.0b55555555555p7 0x1.c7ffffffffe76p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00004 0 OK 0x1.efbb8927ce8e5p23 -0x1.d3803fd9a13fp23 0x0.0p0 -0x1.073120cb9937cp7 0x1.b534b5b77db6bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00005 0 OK 0x1.fa07071043e56p23 -0x1.dbff485ea9d73p23 0x0.0p0 -0x1.0315555555555p7 0x1.b4555555552b1p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00006 0 OK 0x1.eb20d772bae36p23 -0x1.7ba2b354b1d6p23 0x0.0p0 -0x1.1bp7 0x1.e3fffffffff5cp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00007 0 OK 0x1.907e0aaaaaaaep20 0x1.bf4d5a60afc5bp19 0x0.0p0 -0x1.1cp7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00008 0 OK 0x1.907e0aaaaaaaep20 0x1.bf4d5a60afc5bp19 0x0.0p0 -0x1.24p7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00009 0 OK 0x1.907e0aaaaaaaep20 0x1.bf4d5a60afc5bp19 0x0.0p0 -0x1.2cp7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00010 0 OK 0x1.d27bea988c5bfp20 0x1.33b7556f77be9p21 0x0.0p0 -0x1.30f6eab5bc26bp7 0x1.e7216e45fef6fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00011 0 OK 0x1.907e0aaaaaaaep20 0x1.bf4d5a60afc5bp19 0x0.0p0 -0x1.34p7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00012 0 OK 0x1.e7cd4ff66fdbap20 0x1.7be540dc73eb6p22 0x0.0p0 -0x1.360000000023cp7 0x1.1bffffffff8e5p6 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00013 0 OK 0x1.907e0aaaaaaaep20 0x1.7b5ae575f85a9p22 0x0.0p0 -0x1.3cp7 0x1.1cp6 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00014 0 OK 0x1.907e0aaaaaaaep20 0x1.f5e2b38485cc4p21 0x0.0p0 -0x1.44p7 0x1.05p6 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00015 0 OK 0x1.907e0aaaaaaaep20 0x1.f5e2b38485cc4p21 0x0.0p0 -0x1.4cp7 0x1.05p6 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00016 0 OK 0x1.907e0aaaaaaaep20 0x1.a051cdbaf3edfp21 0x0.0p0 -0x1.54p7 0x1.faaaaaaaaaaacp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00017 0 OK 0x1.62de5e69fccf2p22 0x1.67cfcd594cb86p20 0x0.0p0 -0x1.4815555555555p7 0x1.b3aaaaaaaa8p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00018 0 OK 0x1.907e0aaaaaaabp21 0x1.0b5f915a80ac2p19 0x0.0p0 -0x1.6p7 0x1.a3ffffffffc0fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00019 0 OK 0x1.4064d55555556p19 0x1.28000bbbbae83p18 0x0.0p0 -0x1.5755555555555p6 0x1.f555555555556p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00020 0 OK 0x1.9dd662b6daf0ep19 0x1.7e0a99d6202b8p19 0x0.0p0 -0x1.54d8ac11833eap6 0x1.0531e9a071e31p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00021 0 OK 0x1.9b47fe6d9e0dfp18 0x1.7f9e2e8586656p20 0x0.0p0 -0x1.5a77169e783dbp6 0x1.1687cc5f48351p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00022 0 OK 0x1.e097400000003p20 0x1.2806f2ea5f159p20 0x0.0p0 -0x1.5ep6 0x1.0aaaaaaaaaaabp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00023 0 OK 0x1.e097400000003p20 0x1.28c474d650d0ap20 0x0.0p0 -0x1.5ep6 0x1.0abbbbbbbbbbcp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00024 0 OK 0x1.5f05327f39fa7p20 0x1.5b8f308cf725ep18 0x0.0p0 -0x1.6e5171424a9ebp6 0x1.1a7bb36e9e882p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00025 0 OK 0x1.3b4dbfb6f6e5ap20 0x1.60ea6c7e95b4fp18 0x0.0p0 -0x1.704792c5f92c6p6 0x1.1a9c075174abbp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00026 0 OK 0x1.4064d5553261cp20 0x1.f97b3be8c50dap20 0x0.0p0 -0x1.7p6 0x1.15fffffffffcdp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00027 0 OK 0x1.4064d5553261cp20 0x1.7437bbad7582ep20 0x0.0p0 -0x1.7p6 0x1.09fffffffffc5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00028 0 OK 0x1.55cbd33333376p19 0x1.4d155aa62e375p20 0x0.0p0 -0x1.bfaaaaaaaaaabp6 0x1.16p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00029 0 OK 0x1.55cbd33333378p19 0x1.d9a095c2e812cp18 0x0.0p0 -0x1.bfaaaaaaaaaabp6 0x1.02aaaaaaaaaabp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00030 0 OK 0x1.3152aeb7f3b7bp19 0x1.7217bd46f31c1p20 0x0.0p0 -0x1.b9aa99fdcc196p6 0x1.195484c880f5ep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00031 0 OK 0x1.af38d0c33d25fp19 0x1.6304ea6eaa1a6p18 0x0.0p0 -0x1.b64db0804e0f7p6 0x1.fff8271a67d1cp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00032 0 OK 0x1.23b5e8daedcf1p19 0x1.6e6713c039fd1p20 0x0.0p0 -0x1.ba09f0d5f04a2p6 0x1.18ff001e4acd5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00033 0 OK 0x1.94355e8ebade4p19 0x1.96f05936ba56ap18 0x0.0p0 -0x1.b703c3168281fp6 0x1.0128d56dccd3cp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00034 0 OK 0x1.55cbd33333334p19 0x1.4d182b13a1e1ep20 0x0.0p0 -0x1.c7p6 0x1.16p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00035 0 OK 0x1.55cbd33333334p19 0x1.4dd5b83281e8ap20 0x0.0p0 -0x1.c7p6 0x1.1611111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00036 0 OK 0x1.55cbd33333334p19 0x1.4e9345626a52ep20 0x0.0p0 -0x1.c7p6 0x1.1622222222222p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00037 0 OK 0x1.907e0aab020c9p22 0x1.289985d64ebaep21 0x0.0p0 -0x1.e8p6 0x1.4bfffffffffeap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00038 0 OK 0x1.907e0aab020c9p22 0x1.28f869065af14p21 0x0.0p0 -0x1.e8p6 0x1.4c111111110fdp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00039 0 OK 0x1.907e0aab020c9p22 0x1.125762018e759p21 0x0.0p0 -0x1.e8p6 0x1.3aaaaaaaaaa8fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00040 0 OK 0x1.907e0aab020c9p22 0x1.12b63b22080e5p21 0x0.0p0 -0x1.e8p6 0x1.3abbbbbbbbbap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00041 0 OK 0x1.907e0aab020c9p22 0x1.c458fc29bcd44p20 0x0.0p0 -0x1.e200000000001p6 0x1.28aaaaaaaaa86p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00042 0 OK 0x1.8105775729d2ep22 0x1.ea6c82524a87cp20 0x0.0p0 -0x1.e57ede1cc7fe8p6 0x1.2c114040a982dp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00043 0 OK 0x1.9d61210125702p22 0x1.c888bc8748b22p20 0x0.0p0 -0x1.df1a609c699f4p6 0x1.29068670982e3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00044 0 OK 0x1.9fd2cd04bf22dp22 0x1.b6ffc9052c0b9p20 0x0.0p0 -0x1.de900d660233fp6 0x1.2770a5269593bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00045 0 OK 0x1.8cb055ba6095dp22 0x1.1005f6eff3a21p21 0x0.0p0 -0x1.e2ddcdc620c94p6 0x1.30ead88ab7c4p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00046 0 OK 0x1.907e0aab020c9p22 0x1.e95ee1a47d26ap20 0x0.0p0 -0x1.dcp6 0x1.22aaaaaaaaa82p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00047 0 OK 0x1.907e0aab020c9p22 0x1.ea1c7c84d8b54p20 0x0.0p0 -0x1.dcp6 0x1.22bbbbbbbbb94p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00048 0 OK 0x1.907e0aab020c9p22 0x1.ff8dbc7ffed9bp20 0x0.0p0 -0x1.d800000000001p6 0x1.15fffffffffcfp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00049 0 OK 0x1.907e0aab020c9p22 0x1.0025a48be97eap21 0x0.0p0 -0x1.d800000000001p6 0x1.16111111110e1p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00050 0 OK 0x1.907e0aab020c9p22 0x1.f820fa05a4d9bp20 0x0.0p0 -0x1.d1p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00051 0 OK 0x1.907e0aab020c9p22 0x1.f8de7cf838a6cp20 0x0.0p0 -0x1.d1p6 0x1.0abbbbbbbbb84p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00052 0 OK 0x1.6a2cca4a8570fp22 0x1.30a875d1495c6p21 0x0.0p0 -0x1.d955555555556p6 0x1.13fffffffffcep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00053 0 OK 0x1.6e36000000004p21 0x1.721aad20145ep20 0x0.0p0 -0x1.a6p6 0x1.39fffffffffe3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00054 0 OK 0x1.6e36000000004p21 0x1.72d85f6a305ccp20 0x0.0p0 -0x1.a6p6 0x1.3a111111110f5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00055 0 OK 0x1.fe866f5249b02p20 0x1.59666e2305f0ap20 0x0.0p0 -0x1.b30fc080bde8ap6 0x1.436864b4fd128p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00056 0 OK 0x1.76ded63ad106dp21 0x1.424bdfabbe25ap20 0x0.0p0 -0x1.a4fbe68cd908ap6 0x1.41b1e5d718372p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00057 0 OK 0x1.6e36000000004p21 0x1.3e3882af3b837p20 0x0.0p0 -0x1.a6p6 0x1.2bfffffffffddp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00058 0 OK 0x1.6e36000000004p21 0x1.3ef62787fcc9dp20 0x0.0p0 -0x1.a6p6 0x1.2c111111110edp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00059 0 OK 0x1.eb9dfe87530f6p19 0x1.43fed923e2038p19 0x0.0p0 -0x1.22e68be6b2217p6 0x1.4a41e771344e3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00060 0 OK 0x1.c3e1070df767p19 0x1.39ae4422e5415p19 0x0.0p0 -0x1.241581adea897p6 0x1.49ca8412c024ap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00061 0 OK 0x1.2df470cb3dce3p19 0x1.e1adb5f913642p18 0x0.0p0 -0x1.2e3369aaee3ddp6 0x1.3ad5747fd4e45p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00062 0 OK 0x1.4e0cf10b43bd6p19 0x1.37f470e54ad96p19 0x0.0p0 -0x1.2d44cdd1c767p6 0x1.3e08664f192bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00063 0 OK 0x1.3395f9e41390ap21 0x1.d7305cef2f4bep17 0x0.0p0 -0x1.4b0ee8867e935p6 0x1.da6de595d9885p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00064 0 OK 0x1.c0072ac7dc343p20 0x1.cc97b3121415dp17 0x0.0p0 -0x1.53adf2795e78dp6 0x1.da5d46fcfcad2p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00065 0 OK 0x1.ab77271c640a3p19 0x1.d43052295b3cbp19 0x0.0p0 -0x1.45d13c2cbf1c3p6 0x1.0512c669057dp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00066 0 OK 0x1.3af9d903b3596p18 0x1.3737c4d11eb82p20 0x0.0p0 -0x1.4d0b5ffba185ep6 0x1.0bff37e5912fep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00067 0 OK 0x1.677d614be80efp20 0x1.185ad2d0f4dc3p18 0x0.0p0 -0x1.37f9df2d69366p7 0x1.39f89409dde73p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00068 0 OK 0x1.a128db9614d5fp20 0x1.e99a295d525f3p17 0x0.0p0 -0x1.369a7d97ab9abp7 0x1.38603b20c6f02p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00069 0 OK 0x1.907e0aaaaaaaep20 0x1.335cd8521967ep18 0x0.0p0 -0x1.37p7 0x1.3b33333333333p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00070 0 OK 0x1.907e0aaaaaaaep20 0x1.365177693e264p18 0x0.0p0 -0x1.37p7 0x1.3b55555555555p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00071 0 OK 0x1.907e0aaaaab1ep20 0x1.041cd0fb59f3p17 0x0.0p0 -0x1.3955555555555p7 0x1.4b33333333333p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00072 0 OK 0x1.907e0aaaaab1ep20 0x1.0a063b356cd99p17 0x0.0p0 -0x1.3955555555555p7 0x1.4b55555555555p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00073 0 OK 0x1.907e0aaacd9ecp20 0x1.d8fcee4e857acp16 0x0.0p0 -0x1.3cp7 0x1.58p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00074 0 OK 0x1.8e6b504698eaap20 0x1.452eda27cb852p17 0x0.0p0 -0x1.3c0cccccccccdp7 0x1.5ap4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00075 0 OK 0x1.907e0aaaaaaaep20 0x1.62c486540e71dp16 0x0.0p0 -0x1.3fp7 0x1.6155555555555p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00076 0 OK 0x1.907e0aaaaaaf8p20 0x1.7a68f8025c8adp13 0x0.0p0 -0x1.4055555555555p7 0x1.5b33333333333p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00077 0 OK 0x1.2cc2d48af882ap22 0x1.c7fa14cfb00b6p21 0x0.0p0 -0x1.75e78731ff9e2p6 0x1.55fa5e5a87db2p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00078 0 OK 0x1.25b401a30d4a9p22 0x1.c4b77b25c4f62p21 0x0.0p0 -0x1.779fe1b532ac1p6 0x1.5562d0c017e13p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00079 0 OK 0x1.7b7b957144655p19 0x1.7c2a6d3f5258cp19 0x0.0p0 -0x1.bed54884749e2p6 0x1.5e6abb8f75cacp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00080 0 OK 0x1.253ed39d5d04p19 0x1.56655a2461dffp19 0x0.0p0 -0x1.c18191a9b156ap6 0x1.5cb99b0e6d515p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00081 0 OK 0x1.2dfd75cf545efp21 0x1.1fc0949aace91p21 0x0.0p0 -0x1.d1783435d9477p6 0x1.810be9c111366p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00082 0 OK 0x1.fd32fcd4ad17bp19 0x1.c5d15424c3bcbp20 0x0.0p0 -0x1.607965e63d9f3p6 0x1.4e28e0a491742p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00083 0 OK 0x1.afe68d7d68003p19 0x1.6912fe953e127p20 0x0.0p0 -0x1.62c5bf806c5a6p6 0x1.45d0e5aad2478p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00084 0 OK 0x1.4064d54fdf3b9p18 0x1.a6889725db228p20 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.4p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00085 0 OK 0x1.4064d54fdf3b9p18 0x1.a746510c0a1c8p20 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.4011111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00086 0 OK 0x1.4683c4332692cp17 0x1.a6f93feac678p20 0x0.0p0 -0x1.58f6d5cfaacdbp6 0x1.4007381d7dbf5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00087 0 OK 0x1.4689901fbd7ep17 0x1.a77138a536bfep20 0x0.0p0 -0x1.58f6d68a14a99p6 0x1.401202d25a33fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00088 0 OK 0x1.468285ef7554fp17 0x1.a7d4d9d8eb472p20 0x0.0p0 -0x1.58f6ed54d2d82p6 0x1.401af8df7a4e8p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00089 0 OK 0x1.6871700000004p21 0x1.a6889725db228p20 0x0.0p0 -0x1.5c55555555555p6 0x1.4p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00090 0 OK 0x1.6871700000004p21 0x1.a746510c0a1c8p20 0x0.0p0 -0x1.5c55555555555p6 0x1.4011111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00091 0 OK 0x1.73caabfb7a759p21 0x1.8b06fb2e328c6p20 0x0.0p0 -0x1.5b030c635c1fap6 0x1.3d85990dca34cp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00092 0 OK 0x1.52e14fe7377d7p21 0x1.d91e082387f74p19 0x0.0p0 -0x1.5ec8452d48973p6 0x1.2f4148687e56cp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00093 0 OK 0x1.7b400d8547962p21 0x1.7e4b21cc20e26p20 0x0.0p0 -0x1.5a25e1cc7fe77p6 0x1.3c5eac8605683p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00094 0 OK 0x1.5c87745aeb14p21 0x1.1bb3c1ffc291ap20 0x0.0p0 -0x1.5db24114b5226p6 0x1.3381815a07b36p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00095 0 OK 0x1.853d4e523a41ep21 0x1.a7fa1b9492338p20 0x0.0p0 -0x1.58f6ed54d2d7dp6 0x1.401af8df7a4e4p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00096 0 OK 0x1.853f210add06cp21 0x1.a71e8778e9666p20 0x0.0p0 -0x1.58f6d5cfaacd6p6 0x1.4007381d7dbf2p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00097 0 OK 0x1.853e89ade1bd8p21 0x1.a7968050883b8p20 0x0.0p0 -0x1.58f6d68a14a94p6 0x1.401202d25a33bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00098 0 OK 0x1.93c780bef7f54p20 0x1.d13c8e069c74ap17 0x0.0p0 -0x1.8331a794bd4a3p6 0x1.37d95ec36365fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00099 0 OK 0x1.1806775db841p20 0x1.24d1c64e5ef58p19 0x0.0p0 -0x1.8a5c259c42026p6 0x1.3fd39b9ee5c08p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00100 0 OK 0x1.9b55e5362392ap20 0x1.0861aee77998fp18 0x0.0p0 -0x1.5061a51aeef85p6 0x1.31f2535bafc89p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00101 0 OK 0x1.82d5b2852f999p20 0x1.16c4d9c64cd7fp19 0x0.0p0 -0x1.51c9bf19e554ap6 0x1.388a4bdba0a37p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00102 0 OK 0x1.b3565b47886c6p21 0x1.036edbfa01e58p19 0x0.0p0 -0x1.6e517d0e30bbbp6 0x1.ff510f071bd53p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00103 0 OK 0x1.8245107df9aecp21 0x1.acfc812ad35bep19 0x0.0p0 -0x1.7384b9de0c785p6 0x1.0750eeb25950ap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00104 0 OK 0x1.b6e2cdb0a58e9p21 0x1.0182d09814a1p19 0x0.0p0 -0x1.6df1a13ef11e4p6 0x1.ff21d0de62a82p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00105 0 OK 0x1.587588f3283a3p21 0x1.9c3afba7af78fp19 0x0.0p0 -0x1.77f9cf8ed7572p6 0x1.067f20bd9e105p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00106 0 OK 0x1.ebb2da2dc201ep21 0x1.f74454692fb85p16 0x0.0p0 -0x1.64p6 0x1.cd555555554b2p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00107 0 OK 0x1.d828055639a42p21 0x1.ebe567e19b942p16 0x0.0p0 -0x1.66p6 0x1.cd555555554b2p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00108 0 OK 0x1.d7cd1e0bd1c2ap21 0x1.2c84b47ac7823p18 0x0.0p0 -0x1.65ffffed5bd07p6 0x1.d5555395f0d52p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00109 0 OK 0x1.eb3f25282d858p21 0x1.2f58edc84ff7ep18 0x0.0p0 -0x1.6400004a90be6p6 0x1.d55554c033ceap4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00110 0 OK 0x1.e480f54d3f409p21 0x1.3181fafd55b1dp18 0x0.0p0 -0x1.64b158f01488ep6 0x1.d57a7123ffc75p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00111 0 OK 0x1.e70cfa632eb6ep21 0x1.1304ab5ca9e9bp18 0x0.0p0 -0x1.64704039abf33p6 0x1.d4165925ac87dp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00112 0 OK 0x1.ea6a468110484p21 0x1.cdf5fa77c7789p17 0x0.0p0 -0x1.641aae86a884cp6 0x1.d21462feeaac1p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00113 0 OK 0x1.e5def4c6096e8p21 0x1.5e09f3245ad39p17 0x0.0p0 -0x1.64958e343a826p6 0x1.cf974cf0eadefp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00114 0 OK 0x1.cc70d90554a0ap19 0x1.4a6f6158e7003p21 0x0.0p0 -0x1.19cd00f001e4bp6 0x1.4d5e538a4a403p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00115 0 OK 0x1.010ea1f5e8728p17 0x1.5e1c400e301b2p21 0x0.0p0 -0x1.25bb7f835601dp6 0x1.50d0b3dc23215p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00116 0 OK 0x1.785e01ab7106dp20 0x1.1177dbea3e301p19 0x0.0p0 -0x1.30c38da3c2119p6 0x1.399d16a321479p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00117 0 OK 0x1.3d78f2f534919p20 0x1.145f2f36f6a5ap18 0x0.0p0 -0x1.342ac83b0e22cp6 0x1.338ccba289d16p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00118 0 OK 0x1.1d7f0b5f615e8p20 0x1.d737f970a05e3p18 0x0.0p0 -0x1.3602f9ac8859fp6 0x1.37ec9a43b3c9fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00119 0 OK 0x1.ec01a4ed8e9abp19 0x1.00518ffa73ca3p20 0x0.0p0 -0x1.11a0d9a6ff9bdp6 0x1.745ef57ca7a9bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00120 0 OK 0x1.d164f323df9dep19 0x1.2bfdaf89202dbp20 0x0.0p0 -0x1.127fd1d562263p6 0x1.784b77ddfe7d3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00121 0 OK 0x1.97bdc2069e609p23 0x1.25c258290b0b6p18 0x0.0p0 -0x1.4df407c14dcbfp6 0x1.52938327674bfp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00122 0 OK 0x1.96e639036dfa4p23 0x1.29c87e9a76b63p18 0x0.0p0 -0x1.4e5c58ba7c8p6 0x1.52ac3142dfbf3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00123 0 OK 0x1.838a484c26fd8p23 0x1.ede9a186fc52ep16 0x0.0p0 -0x1.57b2395cb96e4p6 0x1.4eb07d6468169p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00124 0 OK 0x1.84d8fe7ad7363p23 0x1.d808768095535p16 0x0.0p0 -0x1.5710ebedfa44p6 0x1.4e953ee7cc139p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00125 0 OK 0x1.7215eb27e6e6p21 0x1.140b53353bc08p19 0x0.0p0 -0x1.6ddb5bd512ec7p6 0x1.791bf9eb7279ep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00126 0 OK 0x1.dd632de5af4cp20 0x1.eae05671fa5fcp19 0x0.0p0 -0x1.7f681b293955bp6 0x1.8297a372d73a9p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00127 0 OK 0x1.907e0aaaaaaaep20 0x1.ad9dbc41e714bp19 0x0.0p0 -0x1.72p6 0x1.32p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00128 0 OK 0x1.907e0aaaaaaaep20 0x1.af190f8c2eeap19 0x0.0p0 -0x1.72p6 0x1.3211111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00129 0 OK 0x1.cc1827e20278fp18 0x1.11f0ecf5e1a67p19 0x0.0p0 -0x1.6ece05b2af8d5p6 0x1.2af24ed7ec42ap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00130 0 OK 0x1.c47df243bc3f1p19 0x1.79d5acc6d41ffp18 0x0.0p0 -0x1.688b1051fe295p6 0x1.272a2b1704ff5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00131 0 OK 0x1.546b22aaaaaabp21 0x1.725f42b5825edp19 0x0.0p0 -0x1.7ap6 0x1.32p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00132 0 OK 0x1.546b22aaaaaabp21 0x1.73da96c6adcd6p19 0x0.0p0 -0x1.7ap6 0x1.3211111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00133 0 OK 0x1.acbd617b18a1p19 0x1.685dddf46180fp18 0x0.0p0 -0x1.64aea70feb774p6 0x1.e83a6946bbbe1p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00134 0 OK 0x1.0ee3f7badeb16p20 0x1.b0769dd8ac36cp18 0x0.0p0 -0x1.61bcf79dea19ap6 0x1.eb791ef99091dp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00135 0 OK 0x1.4a8364fb58a3cp21 0x1.45e4245e9de4ep20 0x0.0p0 -0x1.a9f235ddf0821p6 0x1.7efaf047cbd27p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00136 0 OK 0x1.74b66e9eaae5p19 0x1.a582f3f48b634p20 0x0.0p0 -0x1.ca0c440c57b58p6 0x1.8709896f37ddap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00137 0 OK 0x1.471dd604d5084p20 0x1.fbd0c02a09b9ap18 0x0.0p0 -0x1.44d5d7ad5a111p6 0x1.1944dd09d23dcp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00138 0 OK 0x1.4dbb1eb6cd0e2p21 0x1.46de5dcfddecp19 0x0.0p0 -0x1.3220b012c977fp6 0x1.1c83aba3fea46p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00139 0 OK 0x1.07126472f394p21 0x1.bd41a294babcbp19 0x0.0p0 -0x1.39e56d5cfaacep6 0x1.2208ce703af8dp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00140 0 OK 0x1.23ed9a0e822cp21 0x1.99b1efe2d899fp18 0x0.0p0 -0x1.8b11fc69e9d86p6 0x1.8118bcabbd194p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00141 0 OK 0x1.b0195720d02a1p20 0x1.d4dba29231722p17 0x0.0p0 -0x1.95394d9407896p6 0x1.7d3df8cf2a13p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00142 0 OK 0x1.42daa346481dcp21 0x1.9a1d1215a57bcp19 0x0.0p0 -0x1.81313060d8ff4p6 0x1.50a4037576d33p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00143 0 OK 0x1.59cd3d3fcef1bp20 0x1.7ea0c1771cbf7p19 0x0.0p0 -0x1.934beea209aaap6 0x1.4fda77b1b88aep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00144 0 OK 0x1.1fe0ffb16324ep20 0x1.c7724f4dd5961p17 0x0.0p0 -0x1.1bbef1a0a9cf8p6 0x1.59199a794bd48p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00145 0 OK 0x1.6df3c54d4fe3ep19 0x1.00a716163eaf4p17 0x0.0p0 -0x1.222b4aa5b70e4p6 0x1.56db94fe88d77p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00146 0 OK 0x1.1501115dcc9b5p19 0x1.6fd86eefaf74p18 0x0.0p0 -0x1.28edb882da821p6 0x1.3ef0200a31cap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00147 0 OK 0x1.80bee7439e08fp18 0x1.a56451902821p19 0x0.0p0 -0x1.2b6d3e4006687p6 0x1.499dcf72e10fcp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00148 0 OK 0x1.907e0aac08315p20 0x1.bc110fc9901b7p19 0x0.0p0 -0x1.a9p6 0x1.0cp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00149 0 OK 0x1.907e0aac08315p20 0x1.bd8c130a214bep19 0x0.0p0 -0x1.a9p6 0x1.0c11111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00150 0 OK 0x1.1cf2afb300246p19 0x1.96a9e636526p19 0x0.0p0 -0x1.a0c7cbef6f17cp6 0x1.0a50a137f38c4p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00151 0 OK 0x1.875ac9819f796p18 0x1.a621721e2acf2p19 0x0.0p0 -0x1.a32ced6c20138p6 0x1.0b0156191149p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00152 0 OK 0x1.4c689d5604173p21 0x1.0a6c5cac8b2b3p19 0x0.0p0 -0x1.af55555555555p6 0x1.04p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00153 0 OK 0x1.4c689d5604173p21 0x1.0be751fa8acb5p19 0x0.0p0 -0x1.af55555555555p6 0x1.0411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00154 0 OK 0x1.af22d16e158cep19 0x1.95e379210ac0fp24 0x0.0p0 -0x1.cb46ec2a8fde8p6 0x1.1dc105ff94cfdp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00155 0 OK 0x1.300abf883530cp18 0x1.b617fe906fb69p24 0x0.0p0 -0x1.d35ea747d807cp6 0x1.4c158b12a6818p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00156 0 OK 0x1.2bfb4bcc43c12p19 0x1.32f479c4f1b7dp20 0x0.0p0 -0x1.2831665616bccp6 0x1.524546c510282p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00157 0 OK 0x1.a03c519a46185p18 0x1.465038fa74d5dp20 0x0.0p0 -0x1.2afa4264407afp6 0x1.54043314e865ep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00158 0 OK 0x1.30f4f8868dc08p20 0x1.c3a1ec1adbce3p17 0x0.0p0 -0x1.242c718f2fe3p6 0x1.466110ebc8b07p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00159 0 OK 0x1.d0d7b5594dd9fp19 0x1.35d367c61c03ep17 0x0.0p0 -0x1.2876eeeeeeeefp6 0x1.44d0f12c27a4ep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00160 0 OK 0x1.e097400000009p19 0x1.9f14f17d2f13fp17 0x0.0p0 -0x1.28p6 0x1.45fffffffffeap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00161 0 OK 0x1.231fa0737c8fep20 0x1.47dfffd8c44c6p17 0x0.0p0 -0x1.25p6 0x1.44fffffffffe9p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00162 0 OK 0x1.1a92b130a9689p20 0x1.a049d4f61f6b7p17 0x0.0p0 -0x1.258p6 0x1.45fffffffffeap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00163 0 OK 0x1.29585cf6dd851p21 0x1.c9a2dbd565c6fp17 0x0.0p0 -0x1.434c4c7ebd458p6 0x1.4261383e1d11p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00164 0 OK 0x1.d8104db7222e9p20 0x1.dd561f30e2548p17 0x0.0p0 -0x1.4a804a58d1c9bp6 0x1.42b3044e2b7cp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00165 0 OK 0x1.adad1acd8e4bp20 0x1.47370ef78782bp19 0x0.0p0 -0x1.8ad9b7bf1e8e6p6 0x1.26b5cc76956e5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00166 0 OK 0x1.46021eaafe4ecp21 0x1.04ea8e4fe18a7p17 0x0.0p0 -0x1.7e950fdd7bfffp6 0x1.1abfac427238ep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00167 0 OK 0x1.37f33b4f57cf9p22 0x1.e820815b10679p19 0x0.0p0 -0x1.df189f40a2878p6 0x1.6341f56c57ff4p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00168 0 OK 0x1.21bf6690f1592p22 0x1.e44114527df0dp19 0x0.0p0 -0x1.e4a98f0a9aa5ap6 0x1.631624b7e6babp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00169 0 OK 0x1.5b403442943cbp21 0x1.c57b670ed2c54p18 0x0.0p0 -0x1.2a39127340994p6 0x1.4b2cb200c863ap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00170 0 OK 0x1.c4acb8131c1a9p20 0x1.edd0d9a988b74p17 0x0.0p0 -0x1.38a749aa0e8bap6 0x1.46e0f84f01dc7p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00171 0 OK 0x1.8e9842f27c96fp18 0x1.b6b019d8d1487p19 0x0.0p0 -0x1.0c98ba0ca6ef5p6 0x1.27fc8e07f4813p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00172 0 OK 0x1.eb235c2c86502p18 0x1.8a5cc04d2d318p19 0x0.0p0 -0x1.0b8p6 0x1.23ffffffffefdp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00173 0 OK 0x1.4064d55555556p19 0x1.8a45a6a20e67ap19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.23ffffffffefdp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00174 0 OK 0x1.4064d55555556p19 0x1.b699b0c3e7a11p19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.27ffffffffefdp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00175 0 OK 0x1.8e9842f27c96fp18 0x1.b6b019d8d1487p19 0x0.0p0 -0x1.0c98ba0ca6ef5p6 0x1.27fc8e07f4813p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00176 0 OK 0x1.eb235c2c86502p18 0x1.8a5cc04d2d318p19 0x0.0p0 -0x1.0b8p6 0x1.23ffffffffefdp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00177 0 OK 0x1.4064d55555556p19 0x1.8a45a6a20e67ap19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.23ffffffffefdp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00178 0 OK 0x1.4064d55555556p19 0x1.b699b0c3e7a11p19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.27ffffffffefdp4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00179 0 OK 0x1.7eb6abbb9335ep18 0x1.455314c3ff834p17 0x0.0p0 -0x1.1d114db94fe89p6 0x1.4c526704d9faep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00180 0 OK 0x1.201cf1b8511abp18 0x1.c022ddb433d5dp16 0x0.0p0 -0x1.1e7b5f4137a8fp6 0x1.4b2f5e7d7bb56p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00181 0 OK 0x1.04fcfbd63657p21 0x1.e14dc412e77a7p19 0x0.0p0 -0x1.422aaaaaaaaabp6 0x1.1455555555525p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00182 0 OK 0x1.e847c00000003p20 0x1.e1278277e9126p19 0x0.0p0 -0x1.44p6 0x1.1455555555525p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00183 0 OK 0x1.052f6919c26eep21 0x1.2fa404fba2fa8p19 0x0.0p0 -0x1.422aaaaaaaaabp6 0x1.0c5555555551dp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00184 0 OK 0x1.e847c00000003p20 0x1.2f7d50e016809p19 0x0.0p0 -0x1.44p6 0x1.0c5555555551dp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00185 0 OK 0x1.09c126c7cf384p21 0x1.82fac2ec2918ap16 0x0.0p0 -0x1.8cd30d8d9f191p6 0x1.60d16b819feeap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00186 0 OK 0x1.be21c54765788p20 0x1.fa44db1ade83p17 0x0.0p0 -0x1.922a5899dd2ccp6 0x1.6458216c61516p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00187 0 OK 0x1.0be44bcfaad1bp21 0x1.69452bf815bfap19 0x0.0p0 -0x1.54edc9425d42fp6 0x1.22e8648fb4b24p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00188 0 OK 0x1.1d8d0dfe40dap20 0x1.86f0a2e64a482p19 0x0.0p0 -0x1.62df87c7211adp6 0x1.2404c8cb86914p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00189 0 OK 0x1.cba2b020e39a8p19 0x1.adfab416d24a1p21 0x0.0p0 -0x1.9234fe2ba2d46p6 0x1.1547800f25638p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00190 0 OK 0x1.fe5753c631dc2p17 0x1.b1237bf2e3567p21 0x0.0p0 -0x1.9b41b13165d3ap6 0x1.15d20fc883475p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00191 0 OK 0x1.907e0aaaaaaaep20 0x1.97e7320f280c1p22 0x0.0p0 -0x1.bep6 0x1.3555555555537p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00192 0 OK 0x1.907e0aaaaaaaep20 0x1.98169f673933ap22 0x0.0p0 -0x1.bep6 0x1.356666666664ap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00193 0 OK 0x1.907e0aaaaaaaep20 0x1.c4614c85b1b4ep21 0x0.0p0 -0x1.bep6 0x1.4bfffffffffebp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00194 0 OK 0x1.907e0aaaaaaaep20 0x1.c4c02fcd75b55p21 0x0.0p0 -0x1.bep6 0x1.4c111111110fcp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00195 0 OK 0x1.03462737654ep21 0x1.40c91db0f27c1p23 0x0.0p0 -0x1.b73dffdf60acbp6 0x1.33ef6ea7dcf79p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00196 0 OK 0x1.cdfb7c96e788p19 0x1.3211672ee7914p23 0x0.0p0 -0x1.c787a86674618p6 0x1.293de3669bfc3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00197 0 OK 0x1.6975c615f4ep23 0x1.ac817be69d917p22 0x0.0p0 -0x1.34eb384c18364p6 0x1.375c643bd1dcep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00198 0 OK 0x1.57493bf39da85p23 0x1.9ba9c1e56300fp22 0x0.0p0 -0x1.3d41dd7756d82p6 0x1.3154c69c48fdfp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00199 0 OK 0x1.660b56967ad3bp23 0x1.940bc65bfbf16p22 0x0.0p0 -0x1.368b9ca3e05c6p6 0x1.2e962a8b35984p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00200 0 OK 0x1.5626d8103afb5p23 0x1.93546ced8cd16p22 0x0.0p0 -0x1.3dc145dc0bd54p6 0x1.2e52f93caf3a5p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00201 0 OK 0x1.6501be51769aap23 0x1.ae39b11053519p22 0x0.0p0 -0x1.36f78feef5ec8p6 0x1.3803dee781824p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00202 0 OK 0x1.651c895a4d57cp23 0x1.ae2831fbee9adp22 0x0.0p0 -0x1.36eb3d3fb4da2p6 0x1.37fd69f0d5ee9p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00203 0 OK 0x1.5e6e495555554p23 0x1.c4583701cabaep21 0x0.0p0 -0x1.3ap6 0x1.2bfffffffffdep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00204 0 OK 0x1.5e6e495555554p23 0x1.c4b70919533f8p21 0x0.0p0 -0x1.3ap6 0x1.2c111111110eep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00205 0 OK 0x1.66f94225ea042p23 0x1.aa6024a0f2c0dp21 0x0.0p0 -0x1.362b851eb852p6 0x1.274b61bb05f8bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00206 0 OK 0x1.6865915b71244p23 0x1.de703832485c4p21 0x0.0p0 -0x1.357640ae2e1cbp6 0x1.30a7326f773d8p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00207 0 OK 0x1.2e7a8502a27e8p20 0x1.3465b72586bf1p19 0x0.0p0 -0x1.0308888888889p6 0x1.1c22222222122p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00208 0 OK 0x1.4064d55555556p19 0x1.3465bb739cce2p19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.1c40334382ccap4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00209 0 OK 0x1.2e7a8502a27e8p20 0x1.3465b72586bf1p19 0x0.0p0 -0x1.0308888888889p6 0x1.1c22222222122p4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00210 0 OK 0x1.4064d55555556p19 0x1.3465bb739cce2p19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.1c40334382ccap4 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00211 0 OK 0x1.91026d55a0d1dp20 0x1.da41c31985b3dp17 0x0.0p0 -0x1.21f7deb8e70dp6 0x1.59547eaaa1589p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00212 0 OK 0x1.63aea061c7e8cp20 0x1.4dbaffcad8852p19 0x0.0p0 -0x1.24cec8ec25e6fp6 0x1.62fbe8e15efb3p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00213 0 OK 0x1.cad285e1d858fp20 0x1.2f60c70506d4ep18 0x0.0p0 -0x1.df70ed183d3d5p6 0x1.7ec7b820fbfaep5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00214 0 OK 0x1.a810916ec5955p19 0x1.ac08e1b023421p18 0x0.0p0 -0x1.effce556ef717p6 0x1.8143c5b598ac7p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00215 0 OK 0x1.17ad9951eb33fp21 0x1.2f62a2fd34d7fp16 0x0.0p0 -0x1.62fa884bf2edep6 0x1.6afb385ebc651p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00216 0 OK 0x1.574f657e1747dp20 0x1.d963a1d9bb9fdp17 0x0.0p0 -0x1.70d2485cd7b9p6 0x1.6e7ac5e6882f6p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00217 0 OK 0x1.27cea8e771658p21 0x1.0cb2224b051abp18 0x0.0p0 -0x1.3793b403c007ap6 0x1.39f43f0616e04p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00218 0 OK 0x1.5285ce3a8b7b6p20 0x1.23e68f4addc9bp18 0x0.0p0 -0x1.4639e5fc6097cp6 0x1.3a6b41664370bp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00219 0 OK 0x1.3595adf00f3cap21 0x1.69473118c03c7p17 0x0.0p0 -0x1.3602f9ac8859fp6 0x1.37ec9a43b3cap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00220 0 OK 0x1.12f46970c1d1bp19 0x1.0bf0609915d66p20 0x0.0p0 -0x1.a611e2ed70c92p6 0x1.5c1718cdb5d13p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00221 0 OK 0x1.24f152e7f77eap19 0x1.0b449aa758636p20 0x0.0p0 -0x1.a583a82535bafp6 0x1.5c085aa87b6d1p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00222 0 OK 0x1.180f35cf0dcc6p19 0x1.14a64147c88ep20 0x0.0p0 -0x1.a5ea0c6f02bd6p6 0x1.5cdfcbb78288fp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00223 0 OK 0x1.220d986cc845p19 0x1.0dd4758680c6ep19 0x0.0p0 -0x1.a594d3efa7045p6 0x1.5021cdf4bb405p5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00224 0 OK 0x1.8cdc165c21838p19 0x1.726f0a361996ep19 0x0.0p0 -0x1.a2573c3168281p6 0x1.54a52f9d1d0bap5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00225 0 OK 0x1.8ae45ec34f99dp20 0x1.65919f1cde2bcp19 0x0.0p0 -0x1.a8dec8a195278p6 0x1.4cd520e78f7ddp5 0x0.0p0 F +CSV PROJ4_SPCS_EPSG_nad83.csv:00226 0 OK 0x1.11e805fa9ac96p20 0x1.9395130688f2bp19 0x0.0p0 -0x1.b021334a806edp6 0x1.4eed85774433ep5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00002 0 OK 0x1.3f4d244f81c4cp21 0x1.1a6a0ef349f08p20 0x0.0p0 -0x1.0cp7 0x1.b7ffffffffd79p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00003 0 OK 0x1.47d6568c3dd8cp21 0x1.ccbde785138a8p20 0x0.0p0 -0x1.0b55555555555p7 0x1.c7ffffffffe62p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00004 0 OK 0x1.7d60bfcc15118p21 0x1.f9ba7496b2b3p19 0x0.0p0 -0x1.073120cb9937bp7 0x1.b534b5b77db45p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00005 0 OK 0x1.b2b6e37650154p21 0x1.efcec8f894c7p19 0x0.0p0 -0x1.0315555555556p7 0x1.b45555555528dp5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00006 0 OK 0x1.37846510434f8p20 0x1.8c8e4172bf324p21 0x0.0p0 -0x1.1bp7 0x1.e3fffffffff54p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00007 0 OK 0x1.e848000000005p18 0x1.bf4eb04261ec8p19 0x0.0p0 -0x1.1cp7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00008 0 OK 0x1.e848000000005p18 0x1.bf4eb04261ec8p19 0x0.0p0 -0x1.24p7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00009 0 OK 0x1.e848000000005p18 0x1.bf4eb04261ec8p19 0x0.0p0 -0x1.2cp7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00010 0 OK 0x1.7821147849992p19 0x1.33b8903e5de01p21 0x0.0p0 -0x1.30f6eab5bc26bp7 0x1.e7216e45fef6dp5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00011 0 OK 0x1.e848000000005p18 0x1.bf4eb04261ec8p19 0x0.0p0 -0x1.34p7 0x1.c411111111111p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00012 0 OK 0x1.a2c485641329cp19 0x1.7be7914695297p22 0x0.0p0 -0x1.360000000023cp7 0x1.1bffffffff8dp6 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00013 0 OK 0x1.e848000000005p18 0x1.7b5d344e8874dp22 0x0.0p0 -0x1.3cp7 0x1.1cp6 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00014 0 OK 0x1.55cc000000003p19 0x1.f5e52d7b9c31ep21 0x0.0p0 -0x1.44p7 0x1.05p6 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00015 0 OK 0x1.e848000000005p18 0x1.f5e52d7b9c31ep21 0x0.0p0 -0x1.4cp7 0x1.05p6 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00016 0 OK 0x1.24f8000000003p19 0x1.a053b00e2ba2p21 0x0.0p0 -0x1.54p7 0x1.faaaaaaaaaaacp5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00017 0 OK 0x1.51bbc191c3892p22 0x1.67d0d1f6663dp20 0x0.0p0 -0x1.4815555555555p7 0x1.b3aaaaaaaa7d7p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00018 0 OK 0x1.6e36000000004p21 0x1.0b5feaa71539dp19 0x0.0p0 -0x1.6p7 0x1.a3ffffffffbd5p5 0x0.0p0 F +CSV PROJ4_SPCS_nad27.csv:00019 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00020 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00021 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00022 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00023 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00024 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00025 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00026 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00027 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00028 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00029 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00030 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00031 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00032 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00033 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00034 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00035 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00036 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00037 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00038 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00039 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00040 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00041 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00042 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00043 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00044 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00045 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00046 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00047 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00048 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00049 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00050 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00051 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00052 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00053 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00054 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00055 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00056 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00057 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00058 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00059 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00060 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00061 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00062 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00063 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00064 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00065 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00066 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00067 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00068 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00069 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00070 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00071 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00072 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00073 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00074 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00075 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00076 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00077 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00078 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00079 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00080 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00081 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00082 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00083 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00084 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00085 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00086 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00087 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00088 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00089 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00090 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00091 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00092 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00093 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00094 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00095 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00096 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00097 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00098 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00099 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00100 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00101 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00102 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00103 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00104 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00105 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00106 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00107 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00108 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00109 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00110 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00111 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00112 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00113 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00114 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00115 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00116 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00117 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00118 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00119 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00120 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00121 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00122 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00123 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00124 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00125 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00126 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00127 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00128 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00129 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00130 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00131 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00132 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00133 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00134 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00135 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00136 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00137 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00138 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00139 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00140 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00141 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00142 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00143 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00144 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00145 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00146 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00147 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00148 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00149 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00150 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00151 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00152 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00153 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00154 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00155 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00156 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00157 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00158 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00159 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00160 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00161 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00162 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00163 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00164 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00165 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00166 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00167 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00168 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00169 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00170 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00171 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00172 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00173 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00174 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00175 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00176 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00177 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00178 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00179 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00180 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00181 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00182 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00183 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00184 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00185 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00186 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00187 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00188 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00189 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00190 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00191 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00192 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00193 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00194 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00195 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00196 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00197 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00198 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00199 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00200 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00201 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00202 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00203 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00204 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00205 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00206 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00207 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00208 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00209 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00210 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00211 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00212 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00213 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00214 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00215 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00216 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00217 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00218 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00219 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00220 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00221 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00222 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00223 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00224 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00225 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00226 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00227 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00228 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00229 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00230 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00231 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00232 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00233 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00234 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00235 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00236 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00237 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00238 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00239 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00240 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00241 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00242 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00243 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00244 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00245 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00246 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00247 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00248 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00249 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00250 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00251 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00252 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00253 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00254 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00255 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00256 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00257 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00258 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00259 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00260 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00261 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00262 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00263 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00264 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00265 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV PROJ4_SPCS_nad27.csv:00266 0 EXC:org.locationtech.proj4j.UnknownAuthorityCodeException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:00002 0 OK 0x1.ff5b4f4d2f065p-1 -0x1.016d616b069f3p0 0x1.5a54e298a8p7 0x1.0000004676b1p0 -0x1.00000015c411fp0 0x1.8576cp-10 T +CSV proj4-epsg.csv:00003 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00004 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00005 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00006 0 OK 0x1.007e8824227a2p0 -0x1.01221dc4efbe6p0 0x1.17e5e978cp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00007 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00008 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00009 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00010 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00011 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00012 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00013 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00014 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00015 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00016 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00017 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00018 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00019 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00020 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00021 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00022 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00023 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00024 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00025 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00026 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00027 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00028 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00029 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00030 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00031 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00032 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00033 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00034 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00035 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00036 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00037 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00038 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00039 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00040 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00041 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00042 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00043 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00044 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00045 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00046 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00047 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00048 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00049 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00050 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00051 0 OK 0x1.ffffffffffffep-1 -0x1.fc92bb09f190fp-1 -0x1.9d611f86p2 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00052 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00053 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00054 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00055 0 OK 0x1.ffa3d59ec842cp-1 -0x1.00901672b80bbp0 0x1.95a06a8bd8p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.8p-28 T +CSV proj4-epsg.csv:00056 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00057 0 OK 0x1.004712b49982bp0 -0x1.ff67e0ee85cfap-1 -0x1.4a55854f4p7 0x1.fffffff1693fp-1 -0x1.ffffffb74c466p-1 0x1.11398p-12 T +CSV proj4-epsg.csv:00058 0 OK 0x1.006c0c97504a8p0 -0x1.0140d2ffc82acp0 0x1.4fae6bb5a4p8 0x1.00000008a9fdap0 -0x1.0000001c773b5p0 0x1.0a02f8p-7 T +CSV proj4-epsg.csv:00059 0 OK 0x1.fcd0628e36da1p-1 -0x1.0015827e04d8fp0 0x1.1b564330c6p10 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00060 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00061 0 OK 0x1.003a0c918a10cp0 -0x1.fef9e0d703277p-1 0x1.0d62b9abp3 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00062 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00063 0 OK 0x1.003f66be63aeap0 -0x1.fe79fa8e6eed3p-1 0x1.d5b70f3c6p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.4p-28 T +CSV proj4-epsg.csv:00064 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00065 0 OK 0x1.fbf6b61c88f6ap-1 -0x1.00ba441a822f3p0 0x1.4671848538p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00066 0 OK 0x1.005dda3285b16p0 -0x1.00ef65b0d9f6dp0 0x1.166b8db108p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00067 0 OK 0x1.000070d305229p0 -0x1.ffffcdeb86fd3p-1 0x1.4bfa08p-5 0x1.0000000000043p0 -0x1.ffffffffffa1ep-1 0x1.2p-27 T +CSV proj4-epsg.csv:00068 0 OK 0x1.ffd6d7046ea44p-1 -0x1.008ee6367d40ep0 -0x1.f0f920208p4 0x1.ffffffea814dcp-1 -0x1.ffffffa0381dcp-1 0x1.657dcep-7 T +CSV proj4-epsg.csv:00069 0 OK 0x1.00a869cfacf73p0 -0x1.ff346e5d96ec7p-1 -0x1.00f8eab1p7 0x1.0000000000001p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00070 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00071 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00072 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00073 0 OK 0x1.ffab7348ffdfbp-1 -0x1.ff92599189afdp-1 -0x1.4d5ea456dp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00074 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00075 0 OK 0x1.ffbe413e0491p-1 -0x1.001e54076f6d8p0 0x1.7f780daf6p5 0x1.ffffffffffffep-1 -0x1.0p0 0x1.8p-29 T +CSV proj4-epsg.csv:00076 0 OK 0x1.ffbf0729f9608p-1 -0x1.011ab04f99cafp0 0x1.42aa95464p4 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00077 0 OK 0x1.ffbf086d111dp-1 -0x1.011a9116a3ae3p0 0x1.3ec4c45ecp4 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00078 0 OK 0x1.fc51b430206e7p-1 -0x1.009d61b30acdfp0 0x1.3eaf141b82p9 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00079 0 OK 0x1.fce2c42c5e39dp-1 -0x1.008826a473e82p0 0x1.107aa9d65p9 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00080 0 OK 0x1.fca36d33b47ep-1 -0x1.0097b13398e24p0 0x1.0b4943aafp9 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00081 0 OK 0x1.003f9706bc335p0 -0x1.ffb58b1d59391p-1 -0x1.66c6463ccp6 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00082 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00083 0 OK 0x1.fffc21ca17818p-1 -0x1.00f5d555defe1p0 0x1.21ece3482p6 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00084 0 OK 0x1.fffc21ca17818p-1 -0x1.00f5d555defe1p0 0x1.21ece3482p6 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00085 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00086 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00087 0 OK 0x1.005b591f89319p0 -0x1.ff44f324205f2p-1 -0x1.d598a81c5p6 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00088 0 OK 0x1.004c81d87a829p0 -0x1.ff3eed132baap-1 -0x1.0d206a43fp7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00089 0 OK 0x1.ffd2bac1adee7p-1 -0x1.004fd7c9ac841p0 -0x1.b9963adf8p4 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00090 0 OK 0x1.ffb29cdfb7dfep-1 -0x1.01213365127acp0 0x1.3c260cdf4p7 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00091 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00092 0 OK 0x1.fe49defa88b0dp-1 -0x1.0067b805f9462p0 -0x1.fbfad383d8p7 0x1.0p0 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00093 0 OK 0x1.0039203e00283p0 -0x1.ff4ca3116a1a8p-1 -0x1.102a7d1cp7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00094 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00095 0 OK 0x1.fff014baf2674p-1 -0x1.0070a24d3973ep0 -0x1.1373c2c7c8p8 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00096 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00097 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00098 0 OK 0x1.005076170412bp0 -0x1.0026d631f8aafp0 -0x1.c71ddc424p4 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00099 0 OK 0x1.fed28f7a228c8p-1 -0x1.001023de276cep0 -0x1.47da74056p6 0x1.0p0 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:00100 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00101 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00102 0 OK 0x1.ffd63bbda9e41p-1 -0x1.00c023e7576b9p0 0x1.4878494aep5 0x1.0p0 -0x1.ffffffffffff9p-1 0x1.0p-30 T +CSV proj4-epsg.csv:00103 0 OK 0x1.ff72b3842ade8p-1 -0x1.0100324b5171dp0 0x1.983ad326ep5 0x1.0p0 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00104 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00105 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00106 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00107 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00108 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00109 0 OK 0x1.fff97b530b39ap-1 -0x1.0042275c479bcp0 -0x1.65f306b5p4 0x1.ffffffffffffep-1 -0x1.0000000000002p0 0x1.0p-30 T +CSV proj4-epsg.csv:00110 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00111 0 OK 0x1.004780a2bb6f2p0 -0x1.ffa3effa69afdp-1 -0x1.0a7b7664e8p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:00112 0 OK 0x1.0047661b084a8p0 -0x1.ffa7cec0d2a77p-1 -0x1.0d9bb9fp7 0x1.ffffffffcc3c7p-1 -0x1.fffffffc58a43p-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:00113 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00114 0 OK 0x1.ff8a51d8a60e1p-1 -0x1.001f24faa429dp0 -0x1.0558409bcp6 0x1.fffffff074877p-1 -0x1.fffffff324af8p-1 0x1.391718p-9 T +CSV proj4-epsg.csv:00115 0 OK 0x1.005f1eacbf5d5p0 -0x1.002d74c109451p0 0x1.6486e2e408p7 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00116 0 OK 0x1.ff393bc47a2cfp-1 -0x1.ffd4a36f0d4d8p-1 -0x1.2d2865b5ep7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-28 T +CSV proj4-epsg.csv:00117 0 OK 0x1.ff55d07c4f4e4p-1 -0x1.001f378e374f7p0 -0x1.8c8a996p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00118 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00119 0 OK 0x1.005dab7cc1215p0 -0x1.01558aaff0662p0 0x1.9b4815842p5 0x1.fffffffda84c5p-1 -0x1.00000003e8dcdp0 0x1.210ap-14 T +CSV proj4-epsg.csv:00120 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00121 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00122 0 OK 0x1.003f31225c433p0 -0x1.ff6fa99f46ac9p-1 -0x1.7808f2ca8p3 0x1.ffffffb3170b3p-1 -0x1.ffffff9af9e4dp-1 0x1.79179p-9 T +CSV proj4-epsg.csv:00123 0 OK 0x1.0064ba615f14fp0 -0x1.ff978009b65f7p-1 -0x1.5b505b13ep5 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00124 0 OK 0x1.0058a3535671dp0 -0x1.ffdbd17f9ac37p-1 -0x1.3a4c66a8cp5 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00125 0 OK 0x1.ff60e1409fd59p-1 -0x1.ff273231af6efp-1 -0x1.a49ff3917p8 0x1.0p0 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:00126 0 OK 0x1.fe64ab671e92ep-1 -0x1.ff8c918eb9b57p-1 -0x1.6794f908dp8 0x1.ffffffffffe68p-1 -0x1.ffffffffdd87bp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:00127 0 OK 0x1.fdf67306cc9dap-1 -0x1.fffed6812d7ccp-1 -0x1.a2f7476a08p7 0x1.ffffffffffdeep-1 -0x1.ffffffffdd874p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:00128 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00129 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00130 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00131 0 OK 0x1.004af14f67798p0 -0x1.ff9faec7687a2p-1 -0x1.04653cf628p7 0x1.0000000000002p0 -0x1.ffffffffff1efp-1 0x1.542p-19 T +CSV proj4-epsg.csv:00132 0 OK 0x1.00071ff0a4436p0 -0x1.007e6298130fdp0 0x1.cde3ab932p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00133 0 OK 0x1.0018c56333b9p0 -0x1.00485b809f13dp0 0x1.8fb43d32ap6 0x1.fffffffe6fcddp-1 -0x1.000000006d602p0 0x1.3c42p-15 T +CSV proj4-epsg.csv:00134 0 OK 0x1.001ae1865c192p0 -0x1.0056e9a08cdf5p0 0x1.c998cdf0ap6 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00135 0 OK 0x1.00897710a7567p0 -0x1.0004829bc6222p0 -0x1.9f15be7f3p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00136 0 OK 0x1.005f84c89fa2fp0 -0x1.001a22fd66c86p0 -0x1.eb0e67f92p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00137 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00138 0 OK 0x1.0020894a18319p0 -0x1.003c24bf6cb4ap0 0x1.bec8ab9dcp5 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00139 0 OK 0x1.feaae98233afp-1 -0x1.ff51f829bb213p-1 -0x1.aa68deeeap6 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00140 0 OK 0x1.0033839aeb403p0 -0x1.feaef1723cebcp-1 0x1.b5d2e2becp4 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00141 0 OK 0x1.0001e359ac224p0 -0x1.fea523ecb7195p-1 0x1.560686fd8p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00142 0 OK 0x1.fcd67662f186dp-1 -0x1.ffba7384ce2bap-1 0x1.13ff732ed4p10 0x1.0000000000001p0 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00143 0 OK 0x1.fe9e41e0b42dfp-1 -0x1.0100076002f83p0 -0x1.1bc9937e1p7 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00144 0 OK 0x1.003220e308e82p0 -0x1.0075830d5087cp0 -0x1.52c63ef4p0 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00145 0 OK 0x1.005b0f914870fp0 -0x1.ff9e9e417355dp-1 -0x1.ea248c9dfp6 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00146 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00147 0 OK 0x1.ff03b53f94865p-1 -0x1.00b39b89e8da7p0 0x1.4709620dp2 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00148 0 OK 0x1.fea059da877f3p-1 -0x1.fe914ea6b6e78p-1 -0x1.1c5c01b93cp9 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00149 0 OK 0x1.fcea55b5abaa8p-1 -0x1.ffbcabaf06241p-1 0x1.15d46aa918p10 0x1.0000000000001p0 -0x1.0p0 0x1.8p-29 T +CSV proj4-epsg.csv:00150 0 OK 0x1.00cc1d2bf0bbbp0 -0x1.fefb6cdb38129p-1 -0x1.d8db723d2p5 0x1.0000000000001p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00151 0 OK 0x1.ff5cd4911b6a3p-1 -0x1.0035b61b9eda4p0 -0x1.9f4542fbcp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00152 0 OK 0x1.003e2ecb16dcap0 -0x1.feb173a1c76dbp-1 0x1.4b71dc1fp4 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00153 0 OK 0x1.fff387d7c2b15p-1 -0x1.0103e9708f8cp0 0x1.3ca07db23p7 0x1.ffffffffffffdp-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00154 0 OK 0x1.fede7f0a26d79p-1 -0x1.ffd926b4d5b65p-1 -0x1.bfe45d2bfp6 0x1.ffffffffffffdp-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00155 0 OK 0x1.ff3510b12b25cp-1 -0x1.fffab16714bb9p-1 -0x1.83d5e7a06p5 0x1.ffffffffffffep-1 -0x1.ffffffffffff9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:00156 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00157 0 OK 0x1.fff20a7a2fa1bp-1 -0x1.0092b20c41b21p0 0x1.4929c17dp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00158 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00159 0 OK 0x1.ff7bd00763afdp-1 -0x1.ffedd36e7e9acp-1 0x1.0341baf7ap6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00160 0 OK 0x1.0038ccb7b5d32p0 -0x1.ff7285a039dbbp-1 -0x1.48cc11fb48p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00161 0 OK 0x1.0037aabd702b9p0 -0x1.ff78b97e79c0bp-1 -0x1.52049e84d8p7 0x1.0000000000465p0 -0x1.000000000046p0 0x1.3f8p-21 T +CSV proj4-epsg.csv:00162 0 OK 0x1.fff1f5620cf0ap-1 -0x1.008c78b93536dp0 0x1.bf93402aa8p7 0x1.0000000000001p0 -0x1.fffffffff0081p-1 0x1.81e4p-15 T +CSV proj4-epsg.csv:00163 0 OK 0x1.00bb9bac0a45ep0 -0x1.001e147bb5fcp0 -0x1.be1f5b64cp6 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.8p-28 T +CSV proj4-epsg.csv:00164 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00165 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00166 0 OK 0x1.013ca0ffb91bp0 -0x1.ff05d12180803p-1 0x1.87e5a02938p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00167 0 OK 0x1.002ad17a057f7p0 -0x1.ffef6d357e7bdp-1 -0x1.28a41541bp6 0x1.0p0 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00168 0 OK 0x1.000895898638cp0 -0x1.0002ba8f67548p0 0x1.578ada9cp0 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00169 0 OK 0x1.fc3b6493e0537p-1 -0x1.00afc943e9538p0 0x1.3d4a7e374cp9 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00170 0 OK 0x1.fc45d8f00b082p-1 -0x1.00a9c942bebacp0 0x1.40c7c744aep9 0x1.ffffffffffffep-1 -0x1.ffffffffffff9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:00171 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00172 0 OK 0x1.ff0db4c106c6bp-1 -0x1.00ec8080ec918p0 -0x1.1035bd3948p7 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00173 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00174 0 OK 0x1.fc5f5fd6dd87ap-1 -0x1.002e4f5df6607p0 0x1.d8b1847fa2p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00175 0 OK 0x1.fc15c5e7de79bp-1 -0x1.fffe6e8f3e8c5p-1 0x1.9e960aac56p9 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00176 0 OK 0x1.0072c4dc8f237p0 -0x1.013b8c88c030ep0 0x1.8684ebd348p7 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00177 0 OK 0x1.ff7828f7a1e76p-1 -0x1.fe55f9c1dbf8bp-1 0x1.c8f1c12a8p3 0x1.0000000000001p0 -0x1.0p0 0x1.0p-28 T +CSV proj4-epsg.csv:00178 0 OK 0x1.ff2c09e59e52ep-1 -0x1.fe403f878096ep-1 0x1.b568782ccp4 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00179 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00180 0 OK 0x1.ffdb2ee85cc7cp-1 -0x1.00dd96fb4c943p0 0x1.7c77bff48p4 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00181 0 OK 0x1.ffcf0dae0a60ap-1 -0x1.003a6f6101367p0 -0x1.53a43cb9p4 0x1.ffffffffffffep-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00182 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00183 0 OK 0x1.002bf6b750399p0 -0x1.ffca952843d5ap-1 0x1.0057ed661p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00184 0 OK 0x1.ff198cd7c3e8cp-1 -0x1.003932957acc4p0 -0x1.0cc2bf336cp8 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00185 0 OK 0x1.007f445ad7832p0 -0x1.0041f429d52b1p0 0x1.5f2d6ea9bp6 0x1.ffffffffffffep-1 -0x1.0000000000001p0 -0x1.0p-30 T +CSV proj4-epsg.csv:00186 0 OK 0x1.0081f0b92b1a6p0 -0x1.ff705879d9f2cp-1 -0x1.2f0ad0723p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00187 0 OK 0x1.fd9000957a956p-1 -0x1.004f02eb027ecp0 0x1.4a3c631b3p10 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00188 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00189 0 OK 0x1.00008b5a6778cp0 -0x1.ff87a5d90af6p-1 0x1.64f650a8p0 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00190 0 OK 0x1.0058a3535671dp0 -0x1.ffdbd14756392p-1 -0x1.39dbc621ep5 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00191 0 OK 0x1.ff54baed3eb84p-1 -0x1.00236879a7645p0 -0x1.219eade2d8p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00192 0 OK 0x1.fe30392933fbp-1 -0x1.0028dead567a7p0 0x1.7c0c42b37p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00193 0 OK 0x1.0035ce00e62bcp0 -0x1.004e8a5cff40ep0 -0x1.050183eecp4 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00194 0 OK 0x1.ffffa3fdc40fep-1 -0x1.ff8c4e5cfd9afp-1 0x1.2a15c3bp-2 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00195 0 OK 0x1.000e8c303f5d3p0 -0x1.0030b0b5eb32ap0 -0x1.1ed6d55bp6 0x1.0000000f66428p0 -0x1.00000003d9a03p0 0x1.67211p-10 T +CSV proj4-epsg.csv:00196 0 OK 0x1.004bc5ace80d1p0 -0x1.001f4ef0c3104p0 -0x1.18e85b024p5 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:00197 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00198 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00199 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00200 0 OK 0x1.00594726774b7p0 -0x1.00e66565913e7p0 0x1.248a7f8fb8p7 0x1.0p0 -0x1.ffffffffffff9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:00201 0 OK 0x1.fe4641575439ap-1 -0x1.0063a0f6766dp0 -0x1.e9408a8f7p7 0x1.0000000000001p0 -0x1.ffffffffffffbp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00202 0 OK 0x1.ffe193edc0d13p-1 -0x1.00738f120c2d2p0 -0x1.15ba0b6a84p8 0x1.0000000048272p0 -0x1.00000002b49f6p0 0x1.52838p-13 T +CSV proj4-epsg.csv:00203 0 OK 0x1.0041eff54fc38p0 -0x1.011c54ce61724p0 0x1.4dd21ec704p8 0x1.000000040d067p0 -0x1.fffffda4dc492p-1 0x1.9b856p-8 T +CSV proj4-epsg.csv:00204 0 OK 0x1.ff79abcff51b5p-1 -0x1.0015500646727p0 -0x1.d15da5e9p4 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00205 0 OK 0x1.0021988b6b68cp0 -0x1.00c31a77e0835p0 0x1.f3f6c2d7ap5 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00206 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00207 0 OK 0x1.003ee60219bdbp0 -0x1.013fbb67dd2b1p0 0x1.0d9ca65c48p8 0x1.ffffffff9b063p-1 -0x1.00000000afb4ep0 0x1.e603p-14 T +CSV proj4-epsg.csv:00208 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00209 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00210 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00211 0 OK 0x1.009f1eedb652ep0 -0x1.011cd8615ed21p0 0x1.b7a4bb691p6 0x1.fffffe7a40a5dp-1 -0x1.000002240bcbdp0 0x1.8c56b4p-6 T +CSV proj4-epsg.csv:00212 0 OK 0x1.ffc0e90cbb65ap-1 -0x1.feb27291fdc58p-1 0x1.de61ea37cp4 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00213 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00214 0 OK 0x1.00447c21aba86p0 -0x1.ff939f7a16a1dp-1 -0x1.043027ba18p7 0x1.000000000437fp0 -0x1.ffffffffebeacp-1 0x1.f3c9p-14 T +CSV proj4-epsg.csv:00215 0 OK 0x1.00a4f217bccf9p0 -0x1.000d80b76054cp0 -0x1.d62309d35p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00216 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00217 0 OK 0x1.ff60e1409fd59p-1 -0x1.ff273231af6efp-1 -0x1.a49ff3917p8 0x1.0p0 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:00218 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00219 0 OK 0x1.000a8a7c2966ep0 -0x1.0111e500e1613p0 0x1.38018c34ep7 0x1.00000000c2f5ep0 -0x1.000000040586p0 0x1.1ef62p-11 T +CSV proj4-epsg.csv:00220 0 OK 0x1.fffda6aeb1f59p-1 -0x1.ffce43093f63p-1 0x1.0a000b67cp5 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00221 0 OK 0x1.ffdffac1796adp-1 -0x1.0028e1b315e28p0 0x1.a33d9d45cp6 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00222 0 OK 0x1.ff9a70563d9ep-1 -0x1.fee08aabeb7ep-1 0x1.f3c0cdb3p4 0x1.ffffffffffffep-1 -0x1.ffffffffffff7p-1 0x1.0p-28 T +CSV proj4-epsg.csv:00223 0 OK 0x1.fcd26639824f7p-1 -0x1.0012e110f7b7ep0 0x1.1ae13f46a6p10 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00224 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00225 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00226 0 OK 0x1.008c860c4d33p0 -0x1.ff93eb09ec55ap-1 -0x1.db1eccc1p5 0x1.0000000000001p0 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00227 0 OK 0x1.fcde6c25b6516p-1 -0x1.ffb1bf049fc75p-1 0x1.782d373c2ap10 0x1.0p0 -0x1.ffffffffffff9p-1 0x1.0p-29 T +CSV proj4-epsg.csv:00228 0 OK 0x1.005daaf6a2c13p0 -0x1.0155804b92307p0 0x1.12960e343p8 0x1.fffffffda84bep-1 -0x1.00000003e8dcdp0 0x1.210ap-14 T +CSV proj4-epsg.csv:00229 0 OK 0x1.005dab7cc1215p0 -0x1.015586bd202f6p0 0x1.129df1ae1cp8 0x1.fffffffda84c5p-1 -0x1.00000003e8dccp0 0x1.210ap-14 T +CSV proj4-epsg.csv:00230 0 OK 0x1.fda7a54889632p-1 -0x1.0190742dbf7b1p0 0x1.bca31921dcp9 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00231 0 OK 0x1.feafc4894fd4ap-1 -0x1.011d2ba675d07p0 -0x1.6e4c9c8bdp6 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00232 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00233 0 OK 0x1.0090a968e5e31p0 -0x1.008cf036a4261p0 -0x1.ed5ccf5a8p4 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00234 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00235 0 OK 0x1.0026f527f8c4dp0 -0x1.00b512961fffcp0 0x1.cc897188ep6 0x1.fffffffdc76dep-1 -0x1.000000002ee41p0 0x1.e8a1dp-10 T +CSV proj4-epsg.csv:00236 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00237 0 OK 0x1.ff337a2e6f8bp-1 -0x1.00163cce0eeaap0 -0x1.896bb0cfep6 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00238 0 OK 0x1.ff1fabc8f10f1p-1 -0x1.003bad27f3e3dp0 -0x1.4f7242d66p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00239 0 OK 0x1.ff6d445e5534fp-1 -0x1.fe560924f0aep-1 0x1.6774b53p2 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-28 T +CSV proj4-epsg.csv:00240 0 OK 0x1.fedd9ae581392p-1 -0x1.00fe2f735ca7cp0 0x1.3384fca918p7 0x1.ffffffaed32d1p-1 -0x1.0000009ef4911p0 0x1.2fd25cp-8 T +CSV proj4-epsg.csv:00241 0 OK 0x1.ff7cf291f575ap-1 -0x1.ff979ab6b330fp-1 -0x1.15738bebd8p7 0x1.00000000cb42p0 -0x1.0000000330416p0 0x1.1d278p-11 T +CSV proj4-epsg.csv:00242 0 OK 0x1.000761b7b9b79p0 -0x1.00fbe9aef4fdbp0 0x1.a4d2328e3p6 0x1.ffffffffe1ad9p-1 -0x1.fffffff8fda18p-1 0x1.d84dp-11 T +CSV proj4-epsg.csv:00243 0 OK 0x1.fece9253479c2p-1 -0x1.0001ae4562f57p0 -0x1.7716b9076p6 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00244 0 OK 0x1.003c2b5ce9215p0 -0x1.fe99c57ae6eb7p-1 -0x1.65cac30fep8 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00245 0 OK 0x1.004785e71ed3dp0 -0x1.ffa529f8a11d5p-1 -0x1.0e7238975p7 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00246 0 OK 0x1.000352a3fbc11p0 -0x1.0001a009558f4p0 0x1.ac76401cp1 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00247 0 OK 0x1.fff2447af0bp-1 -0x1.0001358acbbe6p0 0x1.4a36cd274p4 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00248 0 OK 0x1.ffebd45882901p-1 -0x1.0002a99c0686ap0 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:00249 0 OK 0x1.ffe25cf858547p-1 -0x1.00011f1bfd1fdp0 0x1.1d3cd39dp2 0x1.ffffffffffffdp-1 -0x1.ffffffffdd874p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:00250 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00251 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00252 0 OK 0x1.001ded45eac7ap0 -0x1.fecba7001dce1p-1 0x1.fcea4cc0fp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00253 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00254 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00255 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00256 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00257 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00258 0 OK 0x1.000635cae10c1p0 -0x1.002ea467f011bp0 0x1.20c502ba5p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00259 0 OK 0x1.fce84372b911fp-1 -0x1.014c882eee1ebp0 -0x1.a3ad9e9b64p9 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00260 0 OK 0x1.ff05dbb08b8adp-1 -0x1.003f1b5de31f5p0 -0x1.743ca9f34p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00261 0 OK 0x1.fe5cdd213acedp-1 -0x1.00e165b08fe86p0 -0x1.1ddbe0cd44p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00262 0 OK 0x1.ff28b69a6655fp-1 -0x1.0093331c976a5p0 -0x1.e069b1654p6 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00263 0 OK 0x1.ff663aa6dd22ap-1 -0x1.00b51c4ffba0ep0 0x1.3edaa3f06p5 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00264 0 OK 0x1.fe7c7daadc9fcp-1 -0x1.00ac0b1bd725cp0 -0x1.34a51bf028p8 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00265 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00266 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00267 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00268 0 OK 0x1.00b6766d4dd9bp0 -0x1.ff92da51d672ep-1 -0x1.3d96a4955p6 0x1.00000000a1c4ap0 -0x1.ffffffff55aa5p-1 0x1.f5658p-11 T +CSV proj4-epsg.csv:00269 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00270 0 OK 0x1.fcd26639824f7p-1 -0x1.0012e110f7b7ep0 0x1.1ae13f46a6p10 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00271 0 OK 0x1.009d36c30b628p0 -0x1.ffee8167cfcbp-1 -0x1.2b978c81fp7 0x1.fffffffdf4569p-1 -0x1.00000007762f9p0 0x1.8f508p-13 T +CSV proj4-epsg.csv:00272 0 OK 0x1.008d73c04c57cp0 -0x1.00b6be4e23628p0 0x1.01b67b477p8 0x1.0p0 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:00273 0 OK 0x1.00460737bdb85p0 -0x1.00226d6b17b77p0 0x1.49374b6cap5 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00274 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00275 0 OK 0x1.fff97af70043cp-1 -0x1.ffd0fd6857467p-1 0x1.58cfb3ee8p5 0x1.0p0 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:00276 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00277 0 OK 0x1.004adab01ab49p0 -0x1.0067df7906636p0 -0x1.dfa965e8p-1 0x1.0000000000001p0 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00278 0 OK 0x1.fedecdf2404b1p-1 -0x1.fe09082f906e3p-1 -0x1.8fbe6144bcp8 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00279 0 OK 0x1.00049ec678fc4p0 -0x1.fe968f77ab563p-1 0x1.a5df6433dp7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00280 0 OK 0x1.feed5fcdcf879p-1 -0x1.00412fd8144bap0 -0x1.0c7831636p6 0x1.ffffffffffffdp-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00281 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00282 0 OK 0x1.fdcc47b6a1fd3p-1 -0x1.005d61a93d603p0 -0x1.baabd0badcp8 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00283 0 OK 0x1.022f1421e427p0 -0x1.fa2d972a9006ep-1 -0x1.5e3b13ecfcp8 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00284 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00285 0 OK 0x1.ff7990d139ad7p-1 -0x1.005ed8506c27bp0 -0x1.9c46199784p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00286 0 OK 0x1.fe54e6e0e69e5p-1 -0x1.002224f9e5f0cp0 -0x1.50cc2dd47cp8 0x1.fffffff01702ep-1 -0x1.000000057a67ap0 0x1.50d98p-13 T +CSV proj4-epsg.csv:00287 0 OK 0x1.febf1a8f08aabp-1 -0x1.0029527b7c92ep0 -0x1.5296593024p8 0x1.0p0 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00288 0 OK 0x1.006f95416189fp0 -0x1.004063d893018p0 -0x1.86dd183bep8 0x1.ffffffffffffep-1 -0x1.ffffffffffff9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:00289 0 OK 0x1.001ece9e7ca18p0 -0x1.fec555882fcf6p-1 0x1.fd7f252c2p6 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00290 0 OK 0x1.ff00ce8ad4b7dp-1 -0x1.fef90e8032053p-1 -0x1.291f9bd808p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00291 0 OK 0x1.00ccbd7838e8p0 -0x1.00aeba7ba4901p0 -0x1.c595216f6p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00292 0 OK 0x1.00d4993f53bbcp0 -0x1.0099f7c2215bfp0 -0x1.30279358e8p7 0x1.000000666fe71p0 -0x1.ffffff186be43p-1 0x1.18a93p-7 T +CSV proj4-epsg.csv:00293 0 OK 0x1.ff2310d37a9c6p-1 -0x1.006812c59edf7p0 -0x1.342c09cafp9 0x1.ffffffffffffep-1 -0x1.0p0 0x1.8p-29 T +CSV proj4-epsg.csv:00294 0 OK 0x1.ff51584fd222p-1 -0x1.006b352420d1ap0 -0x1.1fc6f70998p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00295 0 OK 0x1.fe0cd2e6f0c5fp-1 -0x1.00e23b2344ccbp0 -0x1.463437b68p6 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00296 0 OK 0x1.0050506020481p0 -0x1.ff726c750f796p-1 -0x1.f7ce42de2p8 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00297 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00298 0 OK 0x1.ff34937c38807p-1 -0x1.ff69481eaad9cp-1 -0x1.0ff697a05ep9 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.8p-28 T +CSV proj4-epsg.csv:00299 0 OK 0x1.00ccbd7838e8p0 -0x1.00aeba7ba4901p0 -0x1.c595216f6p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00300 0 OK 0x1.0141514add938p0 -0x1.fa263420b0353p-1 0x1.d511c49c76p9 0x1.fffff0f7659e5p-1 -0x1.fffffd24d11b5p-1 0x1.f6cfcp-5 T +CSV proj4-epsg.csv:00301 0 OK 0x1.00ce3323fa5d4p0 -0x1.00ae6247bc667p0 -0x1.cb2864f73p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00302 0 OK 0x1.ffffffffffffep-1 -0x1.0001e235eb7e4p0 -0x1.f5f1cc6c7p7 0x1.ffffffffffffdp-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00303 0 OK 0x1.fd93cea804a88p-1 -0x1.fe4699fbee0bdp-1 0x1.5c4d18fb9p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00304 0 OK 0x1.ff151d7ae83cap-1 -0x1.000012424954fp0 0x1.1d933b83ap10 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00305 0 OK 0x1.ffc729247e761p-1 -0x1.ff9fe6d0be223p-1 -0x1.6886646d78p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00306 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00307 0 OK 0x1.002c081171b51p0 -0x1.0110fa84845eep0 -0x1.53d1366888p10 0x1.000004a30a3b6p0 -0x1.fffffa2cebb3fp-1 0x1.ac87ab8p-3 T +CSV proj4-epsg.csv:00308 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00309 0 OK 0x1.00cd1b7c47cdp0 -0x1.00aebb080732fp0 -0x1.c8480a062p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00310 0 OK 0x1.008c7e2d44bbap0 -0x1.00b5f28f6497fp0 0x1.05862437ap8 0x1.0p0 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00311 0 OK 0x1.ff56c0583603dp-1 -0x1.002084ec01edap0 -0x1.7f2ae2ac6p5 0x1.0000000000001p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00312 0 OK 0x1.ff39ef2c70983p-1 -0x1.ffd4b80e9bae3p-1 -0x1.28ae6b95ep7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00313 0 OK 0x1.0075b35b0d972p0 -0x1.0152d13d6bf5fp0 0x1.ea3cbce508p7 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00314 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00315 0 OK 0x1.0038cf59bdc5fp0 -0x1.ff74e9be20f85p-1 -0x1.4aba0feb5p7 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00316 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00317 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00318 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00319 0 OK 0x1.00182b99ef7d9p0 -0x1.0046a762bfb09p0 -0x1.a748519744p8 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-28 T +CSV proj4-epsg.csv:00320 0 OK 0x1.0006b5d064756p0 -0x1.0046643c5ae6fp0 -0x1.a800812584p8 0x1.0000000000008p0 -0x1.fffffffff0089p-1 0x1.81ep-15 T +CSV proj4-epsg.csv:00321 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00322 0 OK 0x1.0090f8ef62257p0 -0x1.009d511a43669p0 0x1.3bff8fb02p5 0x1.ffffffffffffdp-1 -0x1.0p0 0x1.4p-28 T +CSV proj4-epsg.csv:00323 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00324 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00325 0 OK 0x1.004db4a9ad331p0 -0x1.ffd1e55753fb6p-1 -0x1.2df14b4ff8p7 0x1.0p0 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00326 0 OK 0x1.fed4293b88ba5p-1 -0x1.00b2ff8527f3p0 -0x1.f60dbea08p4 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00327 0 OK 0x1.0026a9eef546ap0 -0x1.fec3e1bdb32ccp-1 -0x1.e0950ba9b8p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00328 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00329 0 OK 0x1.fca35047a2f58p-1 -0x1.009a00cc5e736p0 0x1.1c5fcb0262p9 0x1.0000000000001p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00330 0 OK 0x1.000a7cc8e9382p0 -0x1.ff19b99b46d9p-1 0x1.05677ecc6p6 0x1.0000005643599p0 -0x1.ffffffca7c13ap-1 0x1.082dbcp-8 T +CSV proj4-epsg.csv:00331 0 OK 0x1.00bb9bac0a45ep0 -0x1.001e147bb5fcp0 -0x1.be1f5b64cp6 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.8p-28 T +CSV proj4-epsg.csv:00332 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00333 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00334 0 OK 0x1.00006eb36b36fp0 -0x1.ffffb02fccc33p-1 -0x1.092c66p-7 0x1.0000000000043p0 -0x1.000000000032ap0 0x1.cp-28 T +CSV proj4-epsg.csv:00335 0 OK 0x1.fc7cc6fb41bd8p-1 -0x1.00fee96b79edfp0 -0x1.b72ffa01afp10 0x1.00003449eb886p0 -0x1.0000076766f08p0 0x1.8d51fe28p-1 T +CSV proj4-epsg.csv:00336 0 OK 0x1.ffadb41ffeaf9p-1 -0x1.000bbd2f519e2p0 -0x1.81d42d5de8p9 0x1.ffffffba75557p-1 -0x1.0000000acc6b6p0 0x1.c9c8p-11 T +CSV proj4-epsg.csv:00337 0 OK 0x1.ff71e9ced2f06p-1 -0x1.0085ab28511e5p0 -0x1.1097904dep9 0x1.ffffffdaaf318p-1 -0x1.0000000ccca95p0 0x1.a23fp-12 T +CSV proj4-epsg.csv:00338 0 OK 0x1.ff807f3756187p-1 -0x1.008a8c063cf0ap0 -0x1.0a63a361bcp9 0x1.ffffffc221f5bp-1 -0x1.000000171ece2p0 0x1.45f06p-11 T +CSV proj4-epsg.csv:00339 0 OK 0x1.ff9e118038446p-1 -0x1.0012575f04428p0 -0x1.d50ab77a08p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00340 0 OK 0x1.0000169b58a3ap0 -0x1.00006726ef817p0 0x1.daa622p-7 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00341 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00342 0 OK 0x1.00049800f80d1p0 -0x1.fed84ae6872b1p-1 0x1.e17a4a5d4p4 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00343 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00344 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00345 0 OK 0x1.006f95416189fp0 -0x1.004063d893018p0 -0x1.86dd183bep8 0x1.ffffffffffffep-1 -0x1.ffffffffffff9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:00346 0 OK 0x1.ff35b0d5d02acp-1 -0x1.fdb014bf1acdcp-1 0x1.4331e17baep9 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00347 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00348 0 OK 0x1.005c320538dd9p0 -0x1.ff4480a76f701p-1 -0x1.02ccccb76p5 0x1.ffffffffffffdp-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00349 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00350 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00351 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00352 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00353 0 OK 0x1.ff78621a04dc6p-1 -0x1.0000d96d18fddp0 0x1.451575a9cp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00354 0 OK 0x1.004576d1c07bep0 -0x1.fe7b6573578dbp-1 -0x1.70b727a3f4p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00355 0 OK 0x1.0007e7d7a1215p0 -0x1.00fcb0806ab79p0 0x1.dbd736db1p8 0x1.0000000000001p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00356 0 OK 0x1.ffaaab93e9af5p-1 -0x1.fec467a9a88fep-1 -0x1.91fa5640f4p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00357 0 OK 0x1.fd71dd26f2bcbp-1 -0x1.fdb3df7aff21p-1 0x1.960a504f6p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00358 0 OK 0x1.008b098416fcap0 -0x1.ffe89dd73ff04p-1 -0x1.73487d50dp8 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:00359 0 OK 0x1.ff7dce1483e4ep-1 -0x1.001f30b005b82p0 -0x1.77ce2d65p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00360 0 OK 0x1.004a905a984ccp0 -0x1.005a8ae3c90fbp0 -0x1.e58f2b4cp4 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00361 0 OK 0x1.01c368fea4dc8p0 -0x1.0118232a6741bp0 -0x1.9929d38a4p6 0x1.0p0 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00362 0 OK 0x1.004adff488947p0 -0x1.008e6aa7cebabp0 -0x1.1926e5fc9p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00363 0 OK 0x1.00b60a934ce56p0 -0x1.fe4d577137e58p-1 -0x1.130d39a888p9 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00364 0 OK 0x1.ff4e2a67e5b26p-1 -0x1.00702de274128p0 -0x1.0b32fea2fp6 0x1.0p0 -0x1.ffffffffffff9p-1 0x1.0p-30 T +CSV proj4-epsg.csv:00365 0 OK 0x1.007785dc984fcp0 -0x1.fc8d21597f849p-1 -0x1.ea81c4ee1p8 0x1.ffffffffffffep-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00366 0 OK 0x1.ff573f55c416p-1 -0x1.0045dfefa3eaep0 -0x1.ce887ed17p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00367 0 OK 0x1.ffebd45882901p-1 -0x1.0002a99c0686ap0 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:00368 0 OK 0x1.fe403290ad617p-1 -0x1.ff2363eb51caap-1 -0x1.0700c32a5cp9 0x1.0p0 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00369 0 OK 0x1.ff6395f2237ep-1 -0x1.fe923c11030e6p-1 0x1.0bc23bfdaep9 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00370 0 OK 0x1.ff76e3174ce0ap-1 -0x1.feb5260872b53p-1 0x1.8f40f8c7fp7 0x1.0000017789617p0 -0x1.fffffde5b8dd1p-1 0x1.fdbefcp-7 T +CSV proj4-epsg.csv:00371 0 OK 0x1.01023d0adb171p0 -0x1.fef87cc2cf7f3p-1 -0x1.c74bbf8fe8p8 0x1.ffffffffffffep-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00372 0 OK 0x1.003073d314e36p0 -0x1.ff1839cb0bbecp-1 -0x1.ba0ed966b8p8 0x1.0000000000001p0 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00373 0 OK 0x1.ffd2abbe5c3b1p-1 -0x1.009a46babe6cbp0 0x1.3dfb11634p6 0x1.fffffff302d7cp-1 -0x1.ffffffef51376p-1 0x1.149c5p-9 T +CSV proj4-epsg.csv:00374 0 OK 0x1.0033d4afe516p0 -0x1.00aa338c85dc1p0 -0x1.43cc1d9e2cp9 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00375 0 OK 0x1.003301436d196p0 -0x1.0049f33547de2p0 0x1.de102239ap5 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00376 0 OK 0x1.ff4184e982ab1p-1 -0x1.001cb7a3a2552p0 -0x1.b60f54b42cp8 0x1.ffffffffffffep-1 -0x1.ffffffffffff9p-1 0x1.8p-28 T +CSV proj4-epsg.csv:00377 0 OK 0x1.ffd20a4cbffbep-1 -0x1.00356e29a1f39p0 -0x1.a42fc5b2c8p8 0x1.0000000000001p0 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:00378 0 OK 0x1.fe34aa5e967c8p-1 -0x1.ffe4ef603d6eep-1 -0x1.54ecd2b328p7 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00379 0 OK 0x1.ffc4de5a932f2p-1 -0x1.ffd8d71f1d6b9p-1 -0x1.d905f1e488p7 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00380 0 OK 0x1.0024651076cdfp0 -0x1.005d07f8d5731p0 -0x1.05a53c8702p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00381 0 OK 0x1.fdef58382d09ap-1 -0x1.fd251ef127f74p-1 0x1.6a9c0ab05p8 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00382 0 OK 0x1.f7e0c497430f1p-1 -0x1.fadd730ad954fp-1 -0x1.da077cebb2p9 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00383 0 OK 0x1.fff736c6976a5p-1 -0x1.ff658b8fd824fp-1 -0x1.76bbb7c22p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00384 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00385 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00386 0 OK 0x1.009def95792c1p0 -0x1.ff2070c20d548p-1 -0x1.7652e5c52p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00387 0 OK 0x1.fffd3ba0efb75p-1 -0x1.0000e34e52f9p0 0x1.06b2bc74p0 0x1.0p0 -0x1.ffffffffffb2fp-1 0x1.d1p-21 T +CSV proj4-epsg.csv:00388 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00389 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00390 0 OK 0x1.00c67de791b97p0 -0x1.00a3b09d5207dp0 -0x1.5918527bfp7 0x1.0000000000001p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00391 0 OK 0x1.0052d03905521p0 -0x1.00e020a17336ep0 0x1.162eb874ap7 0x1.0p0 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00392 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00393 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00394 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00395 0 OK 0x1.fe34aa5e967c8p-1 -0x1.ffe4f16e6c89ep-1 -0x1.c75fc9b9bp7 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00396 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00397 0 OK 0x1.ffebd83df3675p-1 -0x1.ffe3c0ea92d1dp-1 0x1.bc8614de2p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00398 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00399 0 OK 0x1.fe36ce38b1c7cp-1 -0x1.fff682750930bp-1 -0x1.12694012c4p8 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00400 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00401 0 OK 0x1.003e8b1fdb192p0 -0x1.fffc5cfb1d689p-1 -0x1.460daf518p5 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00402 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00403 0 OK 0x1.001515d2cb964p0 -0x1.ff78a9230adf8p-1 0x1.79f31ab4e8p7 0x1.000000000042fp0 -0x1.00000000000edp0 0x1.14p-24 T +CSV proj4-epsg.csv:00404 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00405 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00406 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00407 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00408 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00409 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00410 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00411 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00412 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00413 0 OK -0x1.9c229de8df31fp2 -0x1.00f5d555defe1p0 0x1.21ece3482p6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00414 0 OK 0x1.2c501c8549328p6 -0x1.fe914ea6b6e78p-1 -0x1.1c5c01b93cp9 0x1.ffffffffffff4p-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00415 0 OK 0x1.443ca4536eb25p3 -0x1.003c24bf6cb4ap0 0x1.bec8ab9dcp5 0x1.ffffffffffffdp-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00416 0 OK -0x1.a73ffacd2df8ap6 -0x1.004f02eb027ecp0 0x1.4a3c631b3p10 0x1.ffffffffffffdp-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00417 0 OK 0x1.2ab2932cecd25p4 -0x1.01221dc4efbe6p0 0x1.17e5e978cp6 0x1.0000000000004p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00418 0 OK -0x1.6e77b23b29eap3 -0x1.0030b0b5eb32ap0 -0x1.1ed6d55bp6 0x1.0000000f6642bp0 -0x1.00000003d9a03p0 0x1.67211p-10 T +CSV proj4-epsg.csv:00419 0 OK -0x1.56330e06abcd5p0 -0x1.00c31a77e0835p0 0x1.f3f6c2d7ap5 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.8p-29 T +CSV proj4-epsg.csv:00420 0 OK -0x1.a73b1ace58edcp6 -0x1.0p0 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00421 0 OK -0x1.af19ce075f6fep1 -0x1.0p0 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00422 0 OK -0x1.55c82085ca031p0 -0x1.ff93eb09ec55ap-1 -0x1.db1eccc1p5 0x1.ffffffffffffep-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00423 0 OK -0x1.55c3fd293153p0 -0x1.008cf036a4261p0 -0x1.ed5ccf5a8p4 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00424 0 OK -0x1.a7416de1930acp6 -0x1.ffba7384ce2bap-1 0x1.13ff732ed4p10 0x1.fffffffffff8ap-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00425 0 OK -0x1.10eeb4adda39cp4 -0x1.0p0 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00426 0 OK -0x1.6b761e4f765fep4 -0x1.0p0 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00427 0 OK -0x1.565ae2a635dd6p0 -0x1.0103e98cd023ap0 0x1.3c8455925p7 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00428 0 OK -0x1.3719e4237829cp3 -0x1.011c54ce61724p0 0x1.4dd21ec704p8 0x1.000000040d05cp0 -0x1.fffffda4dc492p-1 0x1.9b856p-8 T +CSV proj4-epsg.csv:00429 0 OK 0x1.2aa83f91a869bp4 -0x1.01213365127acp0 0x1.3c260cdf4p7 0x1.0000000000005p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00430 0 OK -0x1.562db16a1e714p0 -0x1.00b512961fffcp0 0x1.cc897188ep6 0x1.fffffffdc76dep-1 -0x1.000000002ee41p0 0x1.e8a1dp-10 T +CSV proj4-epsg.csv:00431 0 OK -0x1.a7417601e5e93p6 -0x1.0012e110f7b7ep0 0x1.1ae13f46a6p10 0x1.fffffffffff78p-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00432 0 OK -0x1.5654a69217361p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00433 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00434 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00435 0 OK -0x1.5653490b9af7p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00436 0 OK -0x1.5654a69217361p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00437 0 OK 0x1.2c0730d55b28ap2 -0x1.0p0 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00438 0 OK 0x1.444749958d5f1p3 -0x1.0152d13d6bf5fp0 0x1.ea3cbce508p7 0x1.0000000000005p0 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00439 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00440 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00441 0 OK 0x1.fee504e56ddddp-1 -0x1.00fbe6213c93ep0 0x1.2f9f780ep7 0x1.ffffffae227a8p-1 -0x1.000000986856dp0 0x1.2c02dp-8 T +CSV proj4-epsg.csv:00442 0 OK 0x1.2aa1d2d1d619ap4 -0x1.00fbe6213c93ep0 0x1.2f9f780ep7 0x1.ffffffae227c1p-1 -0x1.000000986856dp0 0x1.2c02dp-8 T +CSV proj4-epsg.csv:00443 0 OK 0x1.fbfa5d6197034p-1 -0x1.0011534663f2bp0 0x1.a8aa8d186ap9 0x1.fffffffcc13e4p-1 -0x1.00000003538e5p0 0x1.25bp-9 T +CSV proj4-epsg.csv:00444 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00445 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00446 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00447 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00448 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00449 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00450 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00451 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00452 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00453 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00454 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00455 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00456 0 OK 0x1.ff932cf2f2138p-1 -0x1.ff99eca1bafd9p-1 -0x1.15a64be3f8p8 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00457 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00458 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00459 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00460 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00461 0 OK 0x1.fffa0c22c914p-1 -0x1.ffd155d7e1768p-1 0x1.5cc2ac3e6p5 0x1.0p0 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00462 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00463 0 OK 0x1.0045ddc092fa3p0 -0x1.ff967d6d66c44p-1 -0x1.07cdced128p7 0x1.000000000375dp0 -0x1.fffffffff12f7p-1 0x1.a19ep-14 T +CSV proj4-epsg.csv:00464 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00465 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00466 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00467 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00468 0 OK 0x1.fcaef3c54c173p-1 -0x1.0090c5ae3f3bdp0 0x1.179653d5dep9 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:00469 0 OK 0x1.00004e0f8cfd6p0 -0x1.00021c43a871ap0 -0x1.b9240d63p3 0x1.fffffffffce1dp-1 -0x1.fffffffffd317p-1 0x1.82fp-18 T +CSV proj4-epsg.csv:00470 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00471 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00472 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00473 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00474 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00475 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00476 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00477 0 OK 0x1.0077434be0235p0 -0x1.00a5c0b367e1ap0 -0x1.3f44e6ce8p6 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00478 0 OK 0x1.0006f336f6566p0 -0x1.00a719ef466cbp0 0x1.2fc06601bp6 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00479 0 OK 0x1.003e5787d42e7p0 -0x1.00e85230f022fp0 -0x1.d02a1447p2 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00480 0 OK 0x1.006964a9a3d97p0 -0x1.fed01bdf4628dp-1 -0x1.17942958ep6 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00481 0 OK 0x1.ff2f7a5c53b7dp-1 -0x1.00743a04add02p0 -0x1.8729180acp5 0x1.ffffffffffffep-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00482 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00483 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00484 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00485 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00486 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00487 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00488 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00489 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00490 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00491 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00492 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00493 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00494 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00495 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00496 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00497 0 OK 0x1.0p0 -0x1.0p0 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:00498 0 OK 0x1.1f4702a82cc4bp23 -0x1.cf8cdf616284fp17 0x0.0p0 -0x1.3920c9cd5da5cp1 -0x1.81b4b9a043263p0 0x0.0p0 T +CSV proj4-epsg.csv:00499 0 OK 0x1.1f47245cb7b54p23 -0x1.cfe19cecefd16p17 0x1.20c502ba5p7 -0x1.3929e51dd369ep1 -0x1.81caf3f47629p0 0x1.86dfcc8p-2 T +CSV proj4-epsg.csv:00500 0 OK 0x1.1f3be1c6f2e3ap23 -0x1.d1d17a46b5c12p17 -0x1.a3ad9e9b64p9 -0x1.389c598facdaap1 -0x1.8220f76792982p0 -0x1.75bb54e7ap5 T +CSV proj4-epsg.csv:00501 0 OK 0x1.1f43877672b65p23 -0x1.cff86994b5699p17 -0x1.743ca9f34p7 -0x1.38f7812746b47p1 -0x1.81bffb2905312p0 -0x1.bbcb3ac5p3 T +CSV proj4-epsg.csv:00502 0 OK 0x1.1f4113fe4dc53p23 -0x1.d11994cc2cdc3p17 -0x1.1ddbe0cd44p8 -0x1.38e0f30618812p1 -0x1.82068960a5121p0 -0x1.91b52e5f8p4 T +CSV proj4-epsg.csv:00503 0 OK 0x1.1f43eff0804b3p23 -0x1.d09184a778861p17 -0x1.e069b1654p6 -0x1.39030eecf55bcp1 -0x1.81ed620f71f2p0 -0x1.a770e44c8p3 T +CSV proj4-epsg.csv:00504 0 OK 0x1.1f44c09d2aba9p23 -0x1.d0d086d3f156ap17 0x1.3edaa3f06p5 -0x1.391248c8dab68p1 -0x1.8203948d1ef9bp0 -0x1.49ef5e9dp3 T +CSV proj4-epsg.csv:00505 0 OK 0x1.1f418e4ef0fd5p23 -0x1.d0b9e11588a5cp17 -0x1.34a51bf028p8 -0x1.38e33e26c8791p1 -0x1.81ed7307df40cp0 -0x1.6bbbf40f8p4 T +CSV proj4-epsg.csv:00506 0 OK 0x1.e49f362719e6dp22 -0x1.8508aa3f244d4p17 0x0.0p0 0x1.2c20438811fcp-4 -0x1.1663f2b80df34p0 0x0.0p0 T +CSV proj4-epsg.csv:00507 0 OK 0x1.04f431afb9a36p23 -0x1.a446f9d3aae55p17 0x0.0p0 -0x1.67c91d367f9fp-1 -0x1.329ec9deaa66cp0 0x0.0p0 T +CSV proj4-epsg.csv:00508 0 OK 0x1.18fd413320f3ap23 -0x1.c90147e201cbdp17 0x0.0p0 -0x1.0ee266394fa22p1 -0x1.716f48edd3973p0 0x0.0p0 T +CSV proj4-epsg.csv:00509 0 OK 0x1.2e9df8627e368p23 -0x1.f4464f83fa836p17 0x0.0p0 -0x1.2cc1b2c6cf8bap2 -0x1.fd1eb5bb308e7p0 0x0.0p0 T +CSV proj4-epsg.csv:00510 0 OK 0x1.46108987c0024p23 -0x1.13ac69249e86cp18 0x0.0p0 -0x1.2e39c70fdfad5p3 -0x1.9a55f3fc92a1cp1 0x0.0p0 T +CSV proj4-epsg.csv:00511 0 OK 0x1.5f97028406ecap23 -0x1.31dc1776ebf95p18 0x0.0p0 -0x1.23987e69cf1fcp4 -0x1.7bec171ba1014p2 0x0.0p0 T +CSV proj4-epsg.csv:00512 0 OK 0x1.7b7c3725835eap23 -0x1.559509ff3fe97p18 0x0.0p0 -0x1.14e8e2ce56afap5 -0x1.83a78de980afdp3 0x0.0p0 T +CSV proj4-epsg.csv:00513 0 OK 0x1.9a14be975bfc5p23 -0x1.7fe2b3a23d98dp18 0x0.0p0 -0x1.0612a76737dcap6 -0x1.a3cb1a9fd84d4p4 0x0.0p0 T +CSV proj4-epsg.csv:00514 0 OK 0x1.bbc004c1c61b5p23 -0x1.b1ff3df80a4d3p18 0x0.0p0 -0x1.f1e5286b0767ep6 -0x1.d7446eabcd00fp5 0x0.0p0 T +CSV proj4-epsg.csv:00515 0 OK 0x1.7b7c3725835eap23 -0x1.559509ff3fe97p18 0x0.0p0 -0x1.14e8e2ce56afap5 -0x1.83a78de980afdp3 0x0.0p0 T +CSV proj4-epsg.csv:00516 0 OK 0x1.9a14be975bfc5p23 -0x1.7fe2b3a23d98dp18 0x0.0p0 -0x1.0612a76737dcap6 -0x1.a3cb1a9fd84d4p4 0x0.0p0 T +CSV proj4-epsg.csv:00517 0 OK 0x1.bbc004c1c61b5p23 -0x1.b1ff3df80a4d3p18 0x0.0p0 -0x1.f1e5286b0767ep6 -0x1.d7446eabcd00fp5 0x0.0p0 T +CSV proj4-epsg.csv:00518 0 OK 0x1.e0e9707079c5dp23 -0x1.ed5a594aa5615p18 0x0.0p0 0x1.e64a2efd0b51ep6 -0x1.0ef95f97da172p7 0x0.0p0 T +CSV proj4-epsg.csv:00519 0 OK 0x1.cdddbf33662bap23 -0x1.ce6bb39ab93b7p18 0x0.0p0 -0x1.581d8fdbe0a0dp7 -0x1.646f48f401d6p6 0x0.0p0 T +CSV proj4-epsg.csv:00520 0 OK 0x1.f4f2985360952p23 -0x1.07816017d4b38p19 0x0.0p0 0x1.7ffffffffffffp6 -0x1.9dee2485a73ecp7 0x0.0p0 T +CSV proj4-epsg.csv:00521 0 OK 0x1.101ff035e7869p24 -0x1.2dba869beb098p19 0x0.0p0 0x1.7400000000001p6 -0x1.e9379798d3298p8 0x0.0p0 T +CSV proj4-epsg.csv:00522 0 OK 0x1.107f94847aa3dp23 -0x1.6ecdd5ac3dedfp22 0x0.0p0 -0x1.5a792bdc65ba9p4 -0x1.7ba6c6a549f4cp4 0x0.0p0 F +CSV proj4-epsg.csv:00523 0 OK 0x1.abe2789d4fb85p23 -0x1.d8fd35c7f1711p18 0x0.0p0 0x1.ffffdd7b19acp-1 -0x1.ffffce6446488p-1 0x0.0p0 T +CSV proj4-epsg.csv:00524 0 OK 0x1.abe2789d4fb85p23 -0x1.d8fd35c7f1711p18 0x0.0p0 0x1.ffffdd7b19acp-1 -0x1.ffffce6446488p-1 0x0.0p0 T +CSV proj4-epsg.csv:00525 0 OK 0x1.62d0ad431cf46p23 -0x1.43e4ba40fd47fp18 0x0.0p0 0x1.ffffff9f586c6p-1 -0x1.ffffffb1c1793p-1 0x0.0p0 T +CSV proj4-epsg.csv:00526 0 OK 0x1.2d6b56cb2a83ap23 -0x1.f37a20554774fp17 0x0.0p0 0x1.fffffffd1ccf3p-1 -0x1.fffffffe488f2p-1 0x0.0p0 T +CSV proj4-epsg.csv:00527 0 OK 0x1.02cf3a6360821p23 -0x1.9adde0ace7ba8p17 0x0.0p0 0x1.ffffffffd73ddp-1 -0x1.ffffffffec402p-1 0x0.0p0 T +CSV proj4-epsg.csv:00528 0 OK 0x1.6b8267f0eaffdp23 0x1.1798a943d871bp22 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:00529 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:00530 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:00531 0 OK -0x1.d47848732f9c8p21 -0x1.70965ec9f2684p21 0x1.7f780daf6p5 0x1.0174fc606997ap0 -0x1.0004be3e09b64p0 0x1.672928p-8 T +CSV proj4-epsg.csv:00532 0 OK 0x1.cd989620f190dp19 -0x1.b2a5792da2ed8p16 0x1.42aa95464p4 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00533 0 OK 0x1.cd989645613d4p19 -0x1.b2a544657ee3p16 0x1.3ec4c45ecp4 0x1.0p0 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:00534 0 OK 0x1.8b15f646d539p20 -0x1.b85076da2e241p16 0x1.42aa95464p4 0x1.0000000000005p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00535 0 OK 0x1.8b15f65ae2717p20 -0x1.b85041626e234p16 0x1.3ec4c45ecp4 0x1.ffffffffffff9p-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00536 0 OK 0x1.804bd41b53d8bp20 0x1.bd3ea00d24c3bp16 0x0.0p0 0x1.0000295a4e1cdp0 -0x1.ffffff3d0bc44p-1 0x0.0p0 T +CSV proj4-epsg.csv:00537 0 OK 0x1.b8936f7e7020fp20 0x1.c17561dc485c7p16 0x0.0p0 0x1.00007a46cdd7cp0 -0x1.fffffe1156f26p-1 0x0.0p0 T +CSV proj4-epsg.csv:00538 0 OK 0x1.f16cf48549ec3p20 0x1.c650e3cc43ffcp16 0x0.0p0 0x1.000145c70289cp0 -0x1.fffffbd2b0b9cp-1 0x0.0p0 T +CSV proj4-epsg.csv:00539 0 OK 0x1.1576cbb36b3e4p21 0x1.cbd9b0a4fe32bp16 0x0.0p0 0x1.00031c451a97bp0 -0x1.fffff867ab7a8p-1 0x0.0p0 T +CSV proj4-epsg.csv:00540 0 OK 0x1.3295d748804fcp21 0x1.d219c51090427p16 0x0.0p0 0x1.000712adb693ep0 -0x1.fffff53701078p-1 0x0.0p0 T +CSV proj4-epsg.csv:00541 0 OK 0x1.501f6fa7a8ef8p21 0x1.d91cbaeb88efdp16 0x0.0p0 0x1.000f2154e0338p0 -0x1.fffff8145753cp-1 0x0.0p0 T +CSV proj4-epsg.csv:00542 0 OK 0x1.6e20272e3996ap21 0x1.e0effc2e7cf41p16 0x0.0p0 0x1.001eb89350c2bp0 -0x1.000008d765ec5p0 0x0.0p0 T +CSV proj4-epsg.csv:00543 0 OK 0x1.8ca56a6166e6p21 0x1.e9a2fe5a54e4cp16 0x0.0p0 0x1.003ba44648a16p0 -0x1.0000355b9a265p0 0x0.0p0 T +CSV proj4-epsg.csv:00544 0 OK 0x1.abbd9cb84a954p21 0x1.f3478767035f3p16 0x0.0p0 0x1.006f6238d5134p0 -0x1.0000aeb565c1dp0 0x0.0p0 T +CSV proj4-epsg.csv:00545 0 OK 0x1.cb7837f1c1417p21 0x1.fdf1fd4a89c4ep16 0x0.0p0 0x1.00c91f48cf9b7p0 -0x1.0001d2acb1d98p0 0x0.0p0 T +CSV proj4-epsg.csv:00546 0 OK 0x1.77ab5aecfceeap20 -0x1.24da65d1afd58p22 0x1.21ece3482p6 0x1.ffffffffffff7p-1 -0x1.0000000000049p0 0x1.0p-29 T +CSV proj4-epsg.csv:00547 0 OK -0x1.71ac637a3e3c9p22 -0x1.5b53bdacc122p17 -0x1.d598a81c5p6 0x1.fffffffffff4ap-1 -0x1.ffffffffe1e0dp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00548 0 OK -0x1.2f2d3780ce7abp22 -0x1.2c95f9d6c573fp17 -0x1.0d206a43fp7 0x1.0000000000132p0 -0x1.fffffffffff0dp-1 0x1.0p-30 T +CSV proj4-epsg.csv:00549 0 OK -0x1.6b39d0703868ap22 -0x1.50ed8fccd086fp17 -0x1.0d206a43fp7 0x1.0000000000bd4p0 -0x1.ffffffffff69fp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00550 0 OK -0x1.af722f86f0288p22 -0x1.844d86ab682e2p17 -0x1.0d206a43fp7 0x1.0000000008201p0 -0x1.fffffffff88d2p-1 0x1.0p-29 T +CSV proj4-epsg.csv:00551 0 OK -0x1.ff7e86a17c954p22 -0x1.d09c10433d844p17 -0x1.0d206a43fp7 0x1.000000007eefcp0 -0x1.ffffffff74765p-1 -0x1.0p-30 T +CSV proj4-epsg.csv:00552 0 OK 0x1.332876b383e57p20 -0x1.06639e73b3a01p22 0x0.0p0 0x1.0000000000003p0 -0x1.ffffffffe0ab6p-1 0x0.0p0 F +CSV proj4-epsg.csv:00553 0 OK 0x1.1934d40e58236p21 -0x1.c13ee29302ce4p16 -0x1.7716b9076p6 0x1.000000000000fp0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00554 0 OK 0x1.8b0919b95527p20 -0x1.b66e93babe425p16 -0x1.7716b9076p6 0x1.ffffffffffff5p-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00555 0 OK -0x1.9f738e7bd416fp21 -0x1.a31b5aea03274p22 0x1.322e91118p7 0x1.ffffffaa6c5b4p-1 -0x1.0000009993b05p0 0x1.2f0b34p-8 T +CSV proj4-epsg.csv:00556 0 OK 0x1.05d20c9549ec2p25 -0x1.ad2e3c6d690bfp22 0x0.0p0 0x1.007861035b339p0 -0x1.c43f4a1e907b7p-1 0x0.0p0 T +CSV proj4-epsg.csv:00557 0 OK 0x1.2d64ac0ecc98ap23 -0x1.f430ddb8049aap17 -0x1.fbfad383d8p7 0x1.fffffffd412d4p-1 -0x1.fffffffe5d727p-1 -0x1.4p-28 T +CSV proj4-epsg.csv:00558 0 OK -0x1.52795b5fb57dp19 -0x1.b3915107114c9p16 -0x1.102a7d1cp7 0x1.000000a4176efp0 -0x1.fffffffc7a6bdp-1 -0x1.1cp-24 T +CSV proj4-epsg.csv:00559 0 OK -0x1.c087ca54b827ep19 -0x1.b5ffacff5ebfep16 -0x1.102a7d1cp7 0x1.00000320073ap0 -0x1.ffffffeea117ep-1 -0x1.58p-22 T +CSV proj4-epsg.csv:00560 0 OK -0x1.17a2a8408a49ep20 -0x1.b9004e463794p16 -0x1.102a7d1cp7 0x1.00000c54e02bbp0 -0x1.ffffffbf32c04p-1 -0x1.53cp-20 T +CSV proj4-epsg.csv:00561 0 OK -0x1.4f6baeef253bep20 -0x1.bc982bdf9877cp16 -0x1.102a7d1cp7 0x1.0000296c58116p0 -0x1.ffffff3c3985fp-1 -0x1.1c9p-18 T +CSV proj4-epsg.csv:00562 0 OK -0x1.87b2610915acp20 -0x1.c0cd522488b69p16 -0x1.102a7d1cp7 0x1.00007a6fd5a74p0 -0x1.fffffe0f05ce3p-1 -0x1.a3a8p-17 T +CSV proj4-epsg.csv:00563 0 OK -0x1.c08af97708ab6p20 -0x1.c5a6fbd8ac16bp16 -0x1.102a7d1cp7 0x1.0001461bb538cp0 -0x1.fffffbccbbd97p-1 -0x1.16dap-15 T +CSV proj4-epsg.csv:00564 0 OK -0x1.fa0aac34f3de8p20 -0x1.cb2db0a04a1f6p16 -0x1.102a7d1cp7 0x1.00031ce663cb5p0 -0x1.fffff8596c81ap-1 -0x1.53d3p-14 T +CSV proj4-epsg.csv:00565 0 OK -0x1.1a23e7b8e503fp21 -0x1.d16b697d48e62p16 -0x1.102a7d1cp7 0x1.000713cc4a4fdp0 -0x1.fffff516d1ea4p-1 -0x1.813c8p-13 T +CSV proj4-epsg.csv:00566 0 OK -0x1.37ad041ad3a69p21 -0x1.d86bbc0fccc2dp16 -0x1.102a7d1cp7 0x1.000f2333bf615p0 -0x1.fffff7cedd933p-1 -0x1.9abb8p-12 T +CSV proj4-epsg.csv:00567 0 OK -0x1.7fb7b80580f2cp18 -0x1.b36fdc93e49d9p16 -0x1.102a7d1cp7 0x1.0000000000005p0 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00568 0 OK -0x1.06102faa0462dp20 -0x1.bc7607189af0cp16 -0x1.102a7d1cp7 0x1.ffffffffffffbp-1 -0x1.ffffffffffffep-1 0x1.0p-29 T +CSV proj4-epsg.csv:00569 0 OK -0x1.b0a24e7383afap20 -0x1.cb0a852e07793p16 -0x1.102a7d1cp7 0x1.000000000000cp0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00570 0 OK -0x1.30f33302c5285p21 -0x1.e0183eae40794p16 -0x1.102a7d1cp7 0x1.000000000000cp0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00571 0 OK 0x1.95943691b0968p23 0x1.282d8e6a8ce8bp23 0x0.0p0 -0x1.a51608d208cabp3 -0x1.13037c7f3f73p2 0x0.0p0 T +CSV proj4-epsg.csv:00572 0 OK 0x1.9593cfa682addp23 0x1.282994658d4d7p23 -0x1.1373c2c7c8p8 -0x1.a51cdf6b04466p3 -0x1.135d82ab6948fp2 -0x1.edb569a2p3 T +CSV proj4-epsg.csv:00573 0 OK 0x1.959050b660ec8p23 0x1.282bac64d63e3p23 -0x1.0cc2bf336cp8 -0x1.a4f1c96ce038ap3 -0x1.13184acdfeab2p2 -0x1.b18501462p5 T +CSV proj4-epsg.csv:00574 0 OK 0x1.62ca9a893b761p23 0x1.270c215059d26p23 -0x1.0cc2bf336cp8 0x1.ffffffa40e6afp-1 -0x1.ffffffb57f19ap-1 -0x1.5p-26 T +CSV proj4-epsg.csv:00575 0 OK 0x1.2e6946fc27d72p23 0x1.ec163f792df56p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:00576 0 OK 0x1.1ff39164c012ep23 -0x1.3e9a015297ee8p15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:00577 0 OK -0x1.6524288de382p19 -0x1.b74bab6a5ded8p16 -0x1.102a7d1cp7 0x1.00000659badp0 -0x1.ffffffdd70186p-1 -0x1.5e8p-21 T +CSV proj4-epsg.csv:00578 0 OK -0x1.2dec47dcefe86p19 -0x1.b829a9ba65f6ap16 0x1.3ca07db23p7 0x1.00000328b380ep0 -0x1.ffffffee39fa4p-1 0x1.c8p-25 T +CSV proj4-epsg.csv:00579 0 OK -0x1.2f2c46709a9f5p22 -0x1.2d0720eac3ffep17 0x0.0p0 0x1.0000000000141p0 -0x1.fffffffffff12p-1 0x0.0p0 T +CSV proj4-epsg.csv:00580 0 OK -0x1.6b3853a7df93cp22 -0x1.516c2c15ee8f6p17 0x0.0p0 0x1.0000000000b54p0 -0x1.ffffffffff6e3p-1 0x0.0p0 T +CSV proj4-epsg.csv:00581 0 OK 0x1.7261ff1ef3c42p21 -0x1.2cf7185ace388p17 -0x1.c71ddc424p4 0x1.107b43cd43ecdp0 -0x1.0098351da08ddp0 -0x1.3fc21ccp-3 T +CSV proj4-epsg.csv:00582 0 OK 0x1.75464a422948p21 -0x1.50621f58f7affp17 -0x1.c71ddc424p4 0x1.3d81edae99c63p0 -0x1.039d5012bf2e9p0 -0x1.2d422748p-1 T +CSV proj4-epsg.csv:00583 0 OK 0x1.1936190679ap21 -0x1.c163c02c78952p16 -0x1.47da74056p6 0x1.fffffffffffdcp-1 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:00584 0 OK -0x1.4bf045d9a1bcbp22 -0x1.5edd7194f258fp21 0x0.0p0 0x1.ff96d3d842ed4p-1 -0x1.eebe609a24c3cp-1 0x0.0p0 T +CSV proj4-epsg.csv:00585 0 OK -0x1.04253f6e63d1fp21 -0x1.d65acb90a1f87p16 0x1.95a06a8bd8p7 0x1.000a6bc1e38ep0 -0x1.fffff5306044ap-1 0x1.ca508p-13 T +CSV proj4-epsg.csv:00586 0 OK 0x1.f26b9d454e768p22 -0x1.715aa84797cc2p18 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe20a5p-1 0x0.0p0 F +CSV proj4-epsg.csv:00587 0 OK 0x1.fea09d454e768p22 -0x1.5c15508f2f984p17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe20a5p-1 0x0.0p0 F +CSV proj4-epsg.csv:00588 0 OK 0x1.08780ea2a73b4p23 0x1.dbb55ee1a0cf8p16 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe20a5p-1 0x0.0p0 F +CSV proj4-epsg.csv:00589 0 OK 0x1.f1614d454e768p22 -0x1.54806826d3308p18 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe20a5p-1 0x0.0p0 F +CSV proj4-epsg.csv:00590 0 OK -0x1.3e545d4fac78ep20 -0x1.2d8aa50730fb2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:00591 0 OK -0x1.2de8925acb76ep19 -0x1.2da0466ee8a18p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:00592 0 OK 0x1.aa96a1cdb6738p15 -0x1.2dab901b4eb74p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffa1p-1 0x0.0p0 F +CSV proj4-epsg.csv:00593 0 OK 0x1.8dff94fb4ec5ep20 -0x1.f612d2cfe7f67p20 0x1.4878494aep5 0x1.ffffffffe4858p-1 -0x1.ffffffffffe54p-1 0x0.0p0 T +CSV proj4-epsg.csv:00594 0 OK 0x1.60cc78289653ap19 -0x1.b1475a7e3394cp16 0x1.4878494aep5 0x1.ffffffffe485fp-1 -0x1.ffffffffffe54p-1 0x0.0p0 T +CSV proj4-epsg.csv:00595 0 OK 0x1.23712284e29c9p23 -0x1.73cdb10eb8be7p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:00596 0 OK 0x1.e49be65553059p22 -0x1.8508c7274704ap17 0x0.0p0 0x1.2cd4478ec90bfp-4 -0x1.16640d4a8025p0 0x0.0p0 T +CSV proj4-epsg.csv:00597 0 OK 0x1.04f243f38b0c8p23 -0x1.a4462218bc936p17 0x0.0p0 -0x1.67a39707f8c09p-1 -0x1.329d98b24afdap0 0x0.0p0 T +CSV proj4-epsg.csv:00598 0 OK 0x1.18fb030a80a67p23 -0x1.c8ff42bb86b8cp17 0x0.0p0 -0x1.0ed1edd378c7ep1 -0x1.716a0fb489a9bp0 0x0.0p0 T +CSV proj4-epsg.csv:00599 0 OK 0x1.2e9b5dd4f53bbp23 -0x1.f442d98f40bp17 0x0.0p0 -0x1.2cb274d597d4cp2 -0x1.fd0e5bed75f06p0 0x0.0p0 T +CSV proj4-epsg.csv:00600 0 OK 0x1.460d851c5e45ep23 -0x1.13a9ce031ed91p18 0x0.0p0 -0x1.2e2b0449cc9c8p3 -0x1.9a3f4382db347p1 0x0.0p0 T +CSV proj4-epsg.csv:00601 0 OK 0x1.5f93851e465bap23 -0x1.31d86d8ab61adp18 0x0.0p0 -0x1.2389b4d62fa57p4 -0x1.7bce59eaa739bp2 0x0.0p0 T +CSV proj4-epsg.csv:00602 0 OK 0x1.7b782fe029ceap23 -0x1.55901ad7cbc07p18 0x0.0p0 -0x1.14d9bb1f208c7p5 -0x1.8381b345defbdp3 0x0.0p0 T +CSV proj4-epsg.csv:00603 0 OK 0x1.9a101a9d4e39cp23 -0x1.7fdc4002f942ap18 0x0.0p0 -0x1.0602e4aea1a9ap6 -0x1.a39b9d29f98d3p4 0x0.0p0 T +CSV proj4-epsg.csv:00604 0 OK 0x1.bbbaaf24bde46p23 -0x1.b1f6fcc259cd2p18 0x0.0p0 -0x1.f1c40c5a4f6f9p6 -0x1.d709308222544p5 0x0.0p0 T +CSV proj4-epsg.csv:00605 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:00606 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:00607 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:00608 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:00609 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:00610 0 OK 0x1.85346e76b2a59p18 0x1.7152547999bb8p19 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00611 0 OK -0x1.b621d74bd5f54p25 -0x1.061a7b4a2f148p24 0x1.983ad326ep5 0x1.0000000000023p0 -0x1.ffffffffe0b03p-1 -0x1.0p-30 F +CSV proj4-epsg.csv:00612 0 OK -0x1.2de8925acb76ep19 -0x1.2da0466ee8a18p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:00613 0 OK 0x1.880517996abd8p20 -0x1.42f21099136e1p22 0x0.0p0 0x1.fffffd173fd69p-1 -0x1.fffffff7e2409p-1 0x0.0p0 T +CSV proj4-epsg.csv:00614 0 OK 0x1.8b18492d65bb8p20 -0x1.b676ab548e1c4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:00615 0 OK 0x1.42cdab5dddc93p22 -0x1.54b0bd36c69f4p21 0x0.0p0 0x1.ffffd1df94292p-1 -0x1.ffffff8bebcb2p-1 0x0.0p0 T +CSV proj4-epsg.csv:00616 0 OK 0x1.551d2b5dddc93p22 -0x1.0b72bd36c69f4p21 0x0.0p0 0x1.ffffd1df94292p-1 -0x1.ffffff8bebcb2p-1 0x0.0p0 T +CSV proj4-epsg.csv:00617 0 OK 0x1.193d0f8ee2af2p21 -0x1.c1b1584c960ep16 -0x1.65f306b5p4 0x1.fffffffffffd2p-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:00618 0 OK 0x1.8b192ecde015p20 -0x1.b6ddc90e9945ep16 -0x1.65f306b5p4 0x1.ffffffffffffdp-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:00619 0 OK 0x1.243d84c7dd26p23 0x1.23f21f7e8681ap20 0x0.0p0 0x1.000000000004p0 -0x1.0000000000026p0 0x0.0p0 T +CSV proj4-epsg.csv:00620 0 OK 0x1.1d55f4f2b10e1p20 -0x1.b3fc15f0e4bddp16 0x1.42aa95464p4 0x1.ffffffcd79fb7p-1 -0x1.ffffffff8375fp-1 -0x1.4p-28 T +CSV proj4-epsg.csv:00621 0 OK 0x1.1d55f5057cfb6p20 -0x1.b3fbe0ff559ffp16 0x1.3ec4c45ecp4 0x1.ffffffcd79fc9p-1 -0x1.ffffffff83761p-1 -0x1.8p-28 T +CSV proj4-epsg.csv:00622 0 OK 0x1.3e354631b7024p21 -0x1.b3e7892625c28p16 -0x1.0a7b7664e8p7 0x1.000000a3490dcp0 -0x1.fffffffc7fcfcp-1 -0x1.68p-24 T +CSV proj4-epsg.csv:00623 0 OK 0x1.8ef1379807ceap21 -0x1.b7c459baacb72p16 -0x1.0a7b7664e8p7 0x1.000006543298cp0 -0x1.ffffffdda17c8p-1 -0x1.b2p-21 T +CSV proj4-epsg.csv:00624 0 OK 0x1.df40277d3feebp21 -0x1.bcf00eae68a32p16 -0x1.0a7b7664e8p7 0x1.00002952ec55fp0 -0x1.ffffff3d566bcp-1 -0x1.607p-18 T +CSV proj4-epsg.csv:00625 0 OK -0x1.e459191cb3d44p18 -0x1.51bcfaf4cbb6p22 -0x1.0558409bcp6 0x1.0000000227622p0 -0x1.fffffff2f874p-1 0x1.39171p-9 T +CSV proj4-epsg.csv:00626 0 OK -0x1.063452846a7dfp20 -0x1.bee356625383p16 0x1.3384fca918p7 0x1.0000292da7b36p0 -0x1.0000003d265c7p0 0x1.300f3p-8 T +CSV proj4-epsg.csv:00627 0 OK 0x1.c90bc95248e88p20 -0x1.00a15e2775e2p18 -0x1.0d9bb9fp7 0x1.ffffffffcc3c7p-1 -0x1.fffffffc58a1cp-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:00628 0 OK 0x1.a4d10bb65c518p20 -0x1.8b541a01ac84p18 -0x1.0d9bb9fp7 0x1.ffffffffcc3c7p-1 -0x1.fffffffc58a1cp-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:00629 0 OK 0x1.2fb244b83a356p20 -0x1.7e7cb889ca7p18 -0x1.0d9bb9fp7 0x1.ffffffffcc3e6p-1 -0x1.fffffffc58a9p-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:00630 0 OK 0x1.75689c78a920ap20 -0x1.f46034ed6007p18 -0x1.0d9bb9fp7 0x1.ffffffffcc3c7p-1 -0x1.fffffffc58a1cp-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:00631 0 OK -0x1.b657ace1d3834p20 -0x1.25f5198e306d3p22 -0x1.0d9bb9fp7 0x1.00013f5023f1fp0 -0x1.fffffbe00b99cp-1 0x1.d9aep-15 T +CSV proj4-epsg.csv:00632 0 OK 0x1.df40df9405ae6p21 -0x1.bd35d9399331ep16 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc43p-1 0x0.0p0 T +CSV proj4-epsg.csv:00633 0 OK 0x1.1781a59e9143cp22 -0x1.c3c5226b055aap16 0x0.0p0 0x1.0000c9f442857p0 -0x1.fffffd19feb3p-1 0x0.0p0 T +CSV proj4-epsg.csv:00634 0 OK 0x1.3f0ad63aa588dp22 -0x1.cbd0a01d1660bp16 0x0.0p0 0x1.00031c451aab6p0 -0x1.fffff867ab792p-1 0x0.0p0 T +CSV proj4-epsg.csv:00635 0 OK 0x1.662963ec7aa52p22 -0x1.d578d773ef4aap16 0x0.0p0 0x1.000a6af8f0b8dp0 -0x1.fffff5367ad71p-1 0x0.0p0 T +CSV proj4-epsg.csv:00636 0 OK -0x1.7701d10581ea7p20 -0x1.4a947de7d7c85p22 0x0.0p0 0x1.000145c702939p0 -0x1.fffffbd2b0b8ep-1 0x0.0p0 T +CSV proj4-epsg.csv:00637 0 OK 0x1.1469455903911p22 -0x1.04f9c30001a1p17 0x1.6486e2e408p7 0x1.fffffffffffa1p-1 -0x1.ffffffffffff5p-1 0x1.0p-29 T +CSV proj4-epsg.csv:00638 0 OK 0x1.c985f8967f2a6p21 -0x1.e949a9083f5e2p16 -0x1.2d2865b5ep7 0x1.fffffffffff8ap-1 -0x1.0p0 0x1.0p-28 T +CSV proj4-epsg.csv:00639 0 OK 0x1.c986cd1372a8bp21 -0x1.e9af0be11db4ep16 -0x1.8c8a996p5 0x1.0000000000002p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:00640 0 OK 0x1.193e6c3c2696cp21 -0x1.c148c22545af1p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:00641 0 OK 0x1.846f431745f6p18 -0x1.c2f11712e201cp21 -0x1.48cc11fb48p7 0x1.0p0 -0x1.ffffffffe1e38p-1 0x1.0p-30 F +CSV proj4-epsg.csv:00642 0 OK 0x1.c203f12d59afap25 -0x1.0dbc3bdc8946ep24 0x1.983ad326ep5 0x1.0000000000095p0 -0x1.ffffffffe0b03p-1 -0x1.0p-30 F +CSV proj4-epsg.csv:00643 0 OK 0x1.5415d36ebfddbp20 -0x1.2da5248eff1ccp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:00644 0 OK -0x1.6dfc045c84125p19 -0x1.b4bd031838042p16 0x0.0p0 0x1.000000f8cb2e6p0 -0x1.fffffffa9ab15p-1 0x0.0p0 T +CSV proj4-epsg.csv:00645 0 OK -0x1.656041c8d8c32p19 -0x1.b80c40b11b45bp16 0x0.0p0 0x1.0000065594951p0 -0x1.ffffffdd92f0ap-1 0x0.0p0 T +CSV proj4-epsg.csv:00646 0 OK -0x1.4923a836a8d54p19 -0x1.bd3ea00ce7adfp16 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc43p-1 0x0.0p0 T +CSV proj4-epsg.csv:00647 0 OK 0x1.0fdc8c3bef7eap21 -0x1.cb596dc48de52p16 -0x1.7808f2ca8p3 0x1.00031bc4cd504p0 -0x1.fffff800f6b4cp-1 0x1.791748p-9 T +CSV proj4-epsg.csv:00648 0 OK 0x1.285ee2067b061p23 -0x1.02ada5f2052c5p21 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:00649 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:00650 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:00651 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:00652 0 OK 0x1.0fbe351a2a63ap25 0x1.124b10b8a5be4p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:00653 0 OK 0x1.461ce529f0f3ep23 0x1.d30c3aa1c69e9p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00654 0 OK 0x1.8cc53047d7c55p22 -0x1.e06bf0253299cp16 -0x1.48cc11fb48p7 0x1.001ebb81674e6p0 -0x1.0000088fc82a7p0 -0x1.9d512p-11 T +CSV proj4-epsg.csv:00655 0 OK 0x1.b2cef3a1f0c1cp22 -0x1.edce21e95900ap16 -0x1.48cc11fb48p7 0x1.0051e4e525641p0 -0x1.000063523fe78p0 -0x1.12197p-9 T +CSV proj4-epsg.csv:00656 0 OK 0x1.d82abad6240bbp22 -0x1.fd65fce22f11ep16 -0x1.48cc11fb48p7 0x1.00c9277725e14p0 -0x1.0001d0a55dbbep0 -0x1.4ed488p-8 T +CSV proj4-epsg.csv:00657 0 OK 0x1.fcbcd8d622fb4p22 -0x1.07bff39071401p17 -0x1.48cc11fb48p7 0x1.01ce704cdd44fp0 -0x1.000685218cc51p0 -0x1.7e6ae6p-7 T +CSV proj4-epsg.csv:00658 0 OK 0x1.1033154421d46p23 -0x1.123cbcd1701eep17 -0x1.48cc11fb48p7 0x1.03ef2e3a6e3b3p0 -0x1.001449ebed09fp0 -0x1.9d3fd4p-6 T +CSV proj4-epsg.csv:00659 0 OK 0x1.2181bd85f3e48p23 -0x1.1e629242aad8ap17 -0x1.48cc11fb48p7 0x1.0832f12abed07p0 -0x1.00396eda5bbc6p0 -0x1.aa98cap-5 T +CSV proj4-epsg.csv:00660 0 OK 0x1.32366a3c1bfep23 -0x1.2c7747f312d99p17 -0x1.48cc11fb48p7 0x1.107c3ee682be4p0 -0x1.0097e6c1578aap0 -0x1.a80304cp-4 T +CSV proj4-epsg.csv:00661 0 OK -0x1.5eeb0187c71bbp21 -0x1.ee233db2a6f84p16 0x0.0p0 0x1.0051dfa997dccp0 -0x1.0000641837537p0 0x0.0p0 T +CSV proj4-epsg.csv:00662 0 OK -0x1.dd44d666add4p15 0x1.b1a1cf141e322p19 -0x1.5b505b13ep5 0x1.0000022652527p0 -0x1.fffffff3fd80dp-1 -0x1.9bp-22 T +CSV proj4-epsg.csv:00663 0 OK -0x1.7fa557aa42cd8p18 -0x1.b3de3ff664482p16 -0x1.3a4c66a8cp5 0x1.0000000000004p0 -0x1.ffffffffffffdp-1 0x1.8p-29 T +CSV proj4-epsg.csv:00664 0 OK 0x1.bdf2d8f437fc8p22 -0x1.5ff6d3100f73dp17 -0x1.a49ff3917p8 0x1.fffffffffcdacp-1 -0x1.fffffffffead6p-1 0x0.0p0 T +CSV proj4-epsg.csv:00665 0 OK 0x1.7f7b29a913b03p22 -0x1.375a5a881ae0ap17 -0x1.a49ff3917p8 0x1.ffffffffffaa6p-1 -0x1.ffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:00666 0 OK 0x1.62c979e34dd05p23 -0x1.43d053eabc7dbp18 0x0.0p0 0x1.ffffffa69d555p-1 -0x1.ffffffb7a678bp-1 0x0.0p0 T +CSV proj4-epsg.csv:00667 0 OK 0x1.2d676aea3b147p23 -0x1.f36d0e944ce94p17 0x0.0p0 0x1.fffffffd5433ep-1 -0x1.fffffffe69846p-1 0x0.0p0 T +CSV proj4-epsg.csv:00668 0 OK 0x1.64cf8dae5879cp25 0x1.2bdd285f10d29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00669 0 OK 0x1.6772502037741p25 0x1.21e004881e6e5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00670 0 OK 0x1.681655a65a5d7p25 0x1.0f8d969f627bbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00671 0 OK 0x1.6806d447f70abp25 0x1.ffc87e9e0657p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00672 0 OK 0x1.690437bd2f474p25 0x1.de96c7518b356p23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:00673 0 OK 0x1.68208e988ea75p25 0x1.b978690b09eb3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:00674 0 OK 0x1.3aa6c00765443p25 0x1.57b41bf15866bp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00675 0 OK 0x1.3adad20ac1bbap25 0x1.53b0687deaab6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00676 0 OK 0x1.3b19ce93077f7p25 0x1.49bf746556307p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00677 0 OK 0x1.e112e8369f726p24 -0x1.0e95ac72b8ed5p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00678 0 OK 0x1.4468a8413627ep25 -0x1.caf93a196cdd7p23 0x0.0p0 -0x1.a021277f890b4p5 -0x1.3bd38f354177fp4 0x0.0p0 T +CSV proj4-epsg.csv:00679 0 OK 0x1.783343f9a05e4p25 -0x1.3cf1df1195fdcp23 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:00680 0 OK 0x1.8286c13d67a3fp25 -0x1.3f0767b3dac0bp23 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee0dp6 0x0.0p0 T +CSV proj4-epsg.csv:00681 0 OK 0x1.0817465c09d15p25 0x1.56a5c11c150ep20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00682 0 OK 0x1.8443fccfe9d1bp25 -0x1.7e3c73c2dd298p23 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:00683 0 OK 0x1.a6a17a9d36c22p25 -0x1.82d0eb13cf7bap23 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b0bp7 0x0.0p0 T +CSV proj4-epsg.csv:00684 0 OK 0x1.a9095f7c1ee5ap25 -0x1.c0f3d19d01c23p23 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:00685 0 OK 0x1.ce57827f7cfb6p25 -0x1.c4d5f39934cb4p23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:00686 0 OK 0x1.0b7b01b8e583cp25 0x1.7f1393b791e5ap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00687 0 OK 0x1.0da48b1c11494p25 0x1.c571310666717p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00688 0 OK 0x1.f3184c5ec07fbp24 -0x1.ba750b1514b1bp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00689 0 OK 0x1.d7aafa3b5d9fep24 -0x1.164aef5152798p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00690 0 OK 0x1.dfb6cf5acd96p24 -0x1.b7e8a398309adp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00691 0 OK 0x1.d3b2d8b4350e8p25 0x1.8579d64123de3p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00692 0 OK 0x1.9ba473c312b8ap25 0x1.f4475c98842d6p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00693 0 OK 0x1.677749c6b15b4p25 0x1.d11d6f0009081p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00694 0 OK 0x1.d5e0b05eed6f9p25 -0x1.8a3343cd1f04cp23 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491fp9 0x0.0p0 T +CSV proj4-epsg.csv:00695 0 OK 0x1.3480b9c77fab1p25 0x1.b5341b48f71b6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00696 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:00697 0 OK 0x1.4fb58d3fda1dep25 -0x1.e2f5758840b34p23 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:00698 0 OK 0x1.645ec4317b548p25 -0x1.e64d409542524p23 0x0.0p0 -0x1.98d990063ec6dp6 -0x1.6ed261eb7328cp5 0x0.0p0 T +CSV proj4-epsg.csv:00699 0 OK 0x1.e4f2b12018cc7p24 -0x1.10e03d2f75715p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00700 0 OK 0x1.ff4236fab144ep24 -0x1.c4768b9ea5b6cp15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00701 0 OK 0x1.2d95dee868bb6p25 0x1.22945d1b683e9p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00702 0 OK 0x1.2d3edfcddc052p25 0x1.1d6403a600556p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00703 0 OK 0x1.271deea06f632p25 0x1.8dd0eaefa217ap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00704 0 OK 0x1.26c358ee78919p25 0x1.7fa4fca21558ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:00705 0 OK 0x1.6a7472e57b24p25 0x1.1e1742625f2c7p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00706 0 OK 0x1.5429c46eef25ap25 0x1.1442656392fd5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00707 0 OK 0x1.0324994060787p25 -0x1.5713dce17dfbap19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00708 0 OK 0x1.0206382446f44p25 -0x1.61414a48058bep19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00709 0 OK 0x1.02d0e20efd6e7p25 0x1.52446d5239449p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00710 0 OK 0x1.0f80db0a174ffp25 0x1.14ceb4366cdb1p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00711 0 OK 0x1.23178352f77b1p25 0x1.521b8cd45e5ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00712 0 OK 0x1.2765b19f55a65p25 0x1.8704729a626d1p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00713 0 OK 0x1.2d3df69df80e3p25 0x1.f2366f74d9bbdp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:00714 0 OK 0x1.27e03cf706844p25 0x1.20b072b88c9f1p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00715 0 OK 0x1.1f07ee9d571c2p25 0x1.490b00cb3a2eap24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00716 0 OK 0x1.36a589b183fc1p25 0x1.f58ff8e5898d4p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00717 0 OK 0x1.377ee08535cf3p25 0x1.2a2dddc2f4547p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00718 0 OK 0x1.38c6ab7e7b14fp25 0x1.515fd04b37b24p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00719 0 OK 0x1.4a428a386823cp25 0x1.737552e645cdbp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00720 0 OK 0x1.48f27831f8eacp25 0x1.5cf37dfc4981dp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00721 0 OK 0x1.34684595e9cd5p25 0x1.2c5b1e2cf629p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00722 0 OK 0x1.367929a769147p25 0x1.2371f2a9783e1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00723 0 OK 0x1.1f368a58c718ep25 0x1.08ca120cc66e4p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00724 0 OK 0x1.1e256ea38eea6p25 0x1.03cde7f343ff8p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00725 0 OK 0x1.1cfa60c4802c2p25 0x1.04c45319f6828p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00726 0 OK 0x1.2562513bafeb6p23 -0x1.5f81fc64054d8p21 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:00727 0 OK 0x1.1c3a913bafeb6p23 -0x1.2eadfc64054d8p21 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:00728 0 OK 0x1.1c3a96d60f54p23 -0x1.2eae04d1586f8p21 0x0.0p0 0x1.000000000004p0 -0x1.000000000004p0 0x0.0p0 T +CSV proj4-epsg.csv:00729 0 OK 0x1.9901fd7bc3f98p23 -0x1.c8ff395a9c6b6p17 0x0.0p0 -0x1.0ed1ee1bc791fp1 -0x1.716a0fcb7934fp0 0x0.0p0 T +CSV proj4-epsg.csv:00730 0 OK 0x1.cd26d7d5c492cp23 -0x1.f442cf5087282p17 0x0.0p0 -0x1.2cb27518826b6p2 -0x1.fd0e5c353f103p0 0x0.0p0 T +CSV proj4-epsg.csv:00731 0 OK -0x1.bd54cf785debp15 -0x1.b16b242434f24p16 0x0.0p0 0x1.0000000817ec4p0 -0x1.ffffffffdccb7p-1 0x0.0p0 T +CSV proj4-epsg.csv:00732 0 OK -0x1.061455cc29888p20 -0x1.bd06eb49621cp16 0x0.0p0 0x1.000000000000ep0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:00733 0 OK -0x1.061455cc29888p20 -0x1.bd06eb49621cp16 0x0.0p0 0x1.000000000000ep0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:00734 0 OK 0x1.5fa323683e492p24 -0x1.042fd87259d38p22 -0x1.6e4c9c8bdp6 0x1.007e06b1afa2cp0 -0x1.c050f70ed9a53p-1 0x1.0d89f8b8p0 T +CSV proj4-epsg.csv:00735 0 OK 0x1.62cbf264d5926p23 0x1.270c33327f1d5p23 -0x1.9f4542fbcp6 0x1.ffffffa405291p-1 -0x1.ffffffb5785c2p-1 -0x1.2p-27 T +CSV proj4-epsg.csv:00736 0 OK 0x1.2d68f15a19d2ep23 0x1.295d9a9954a7bp23 -0x1.9f4542fbcp6 0x1.fffffffd402f6p-1 -0x1.fffffffe5d375p-1 0x0.0p0 T +CSV proj4-epsg.csv:00737 0 OK 0x1.02e831c695a41p23 0x1.4dcd865132f5p19 0x1.b568782ccp4 0x1.ffffffffffffep-1 -0x1.ffffffffe1e93p-1 0x1.8p-29 F +CSV proj4-epsg.csv:00738 0 OK -0x1.5658c865cfe82p22 -0x1.e14ac63890c9ep20 -0x1.9f15be7f3p6 0x1.fffffffffffc9p-1 -0x1.ffffffffe1d66p-1 0x1.0p-30 F +CSV proj4-epsg.csv:00739 0 OK -0x1.31179f7050756p21 -0x1.e06bf0253299cp16 -0x1.48cc11fb48p7 0x1.001ebb81674e6p0 -0x1.0000088fc82a7p0 -0x1.9d512p-11 T +CSV proj4-epsg.csv:00740 0 OK -0x1.5f1618bc1e7c7p21 -0x1.edce21e95900ap16 -0x1.48cc11fb48p7 0x1.0051e4e52565ep0 -0x1.000063523fe78p0 -0x1.12197p-9 T +CSV proj4-epsg.csv:00741 0 OK -0x1.8e708a53b7e8ap21 -0x1.fd65fce22f11ep16 -0x1.48cc11fb48p7 0x1.00c9277725e14p0 -0x1.0001d0a55dbbep0 -0x1.4ed488p-8 T +CSV proj4-epsg.csv:00742 0 OK -0x1.bf5e4e53ba097p21 -0x1.07bff39071401p17 -0x1.48cc11fb48p7 0x1.01ce704cdd46dp0 -0x1.000685218cc52p0 -0x1.7e6ae6p-7 T +CSV proj4-epsg.csv:00743 0 OK -0x1.f21daaef78ae8p21 -0x1.123cbcd1701eep17 -0x1.48cc11fb48p7 0x1.03ef2e3a6e3b3p0 -0x1.001449ebed09fp0 -0x1.9d3fd4p-6 T +CSV proj4-epsg.csv:00744 0 OK -0x1.137a84f41837p22 -0x1.1e629242aad8ap17 -0x1.48cc11fb48p7 0x1.0832f12abed07p0 -0x1.00396eda5bbc6p0 -0x1.aa98cap-5 T +CSV proj4-epsg.csv:00745 0 OK -0x1.2f1a2b87c804p22 -0x1.2c7747f312d99p17 -0x1.48cc11fb48p7 0x1.107c3ee682be4p0 -0x1.0097e6c1578aap0 -0x1.a80304cp-4 T +CSV proj4-epsg.csv:00746 0 OK 0x1.74e0f0676f778p20 -0x1.4f3791c633c78p18 0x0.0p0 0x1.08e6828b197b4p5 -0x1.565dd1f8011abp3 0x0.0p0 T +CSV proj4-epsg.csv:00747 0 OK 0x1.bc080afec762p18 -0x1.a90e737bc4ff8p18 0x0.0p0 0x1.c710c55ec7655p6 -0x1.9adc0e9eee6b5p5 0x0.0p0 T +CSV proj4-epsg.csv:00748 0 OK -0x1.04b084f351c1p20 -0x1.138ae3fa74635p19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e7f4c8cd5p8 0x0.0p0 T +CSV proj4-epsg.csv:00749 0 OK -0x1.5e1e61f312111p23 -0x1.4f3791c633c78p18 0x0.0p0 0x1.08e6828b197b4p5 -0x1.565dd1f8011abp3 0x0.0p0 T +CSV proj4-epsg.csv:00750 0 OK -0x1.9d5ebfa809c4fp23 -0x1.a90e737bc4ff8p18 0x0.0p0 0x1.c710c55ec7655p6 -0x1.9adc0e9eee6b5p5 0x0.0p0 T +CSV proj4-epsg.csv:00751 0 OK -0x1.ea59909e6a382p23 -0x1.138ae3fa74635p19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e7f4c8cd5p8 0x0.0p0 T +CSV proj4-epsg.csv:00752 0 OK 0x1.9cd21e0cedeefp23 -0x1.4f3791c633c78p18 0x0.0p0 0x1.08e6828b197b4p5 -0x1.565dd1f8011abp3 0x0.0p0 T +CSV proj4-epsg.csv:00753 0 OK 0x1.9d377421b019p23 -0x1.78578e30e0deep18 0x0.0p0 0x1.e71b6e93bcee7p5 -0x1.6fcf5aebbb5cep4 0x0.0p0 T +CSV proj4-epsg.csv:00754 0 OK 0x1.9a9ac057f63b1p23 -0x1.a90e737bc4ff8p18 0x0.0p0 0x1.c710c55ec7655p6 -0x1.9adc0e9eee6b5p5 0x0.0p0 T +CSV proj4-epsg.csv:00755 0 OK 0x1.9492afe721f8cp23 -0x1.e2c2834e45927p18 0x0.0p0 -0x1.2087d8cda234ap7 -0x1.d6cce9849332p6 0x0.0p0 T +CSV proj4-epsg.csv:00756 0 OK 0x1.8aa8ef6195c7ep23 -0x1.138ae3fa74635p19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e7f4c8cd5p8 0x0.0p0 T +CSV proj4-epsg.csv:00757 0 OK 0x1.7c58dc4563046p23 -0x1.3bf72a948b753p19 0x0.0p0 -0x1.68p6 -0x1.46d9a3dc4c74cp9 0x0.0p0 T +CSV proj4-epsg.csv:00758 0 OK -0x1.5e1e61f312111p23 -0x1.4f3791c633c78p18 0x0.0p0 0x1.08e6828b197b4p5 -0x1.565dd1f8011abp3 0x0.0p0 T +CSV proj4-epsg.csv:00759 0 OK -0x1.7c3d8bde4fe7p23 -0x1.78578e30e0deep18 0x0.0p0 0x1.e71b6e93bcee7p5 -0x1.6fcf5aebbb5cep4 0x0.0p0 T +CSV proj4-epsg.csv:00760 0 OK -0x1.9d5ebfa809c4fp23 -0x1.a90e737bc4ff8p18 0x0.0p0 0x1.c710c55ec7655p6 -0x1.9adc0e9eee6b5p5 0x0.0p0 T +CSV proj4-epsg.csv:00761 0 OK -0x1.c1eb5018de074p23 -0x1.e2c2834e45927p18 0x0.0p0 -0x1.2087d8cda234ap7 -0x1.d6cce9849332p6 0x0.0p0 T +CSV proj4-epsg.csv:00762 0 OK -0x1.ea59909e6a382p23 -0x1.138ae3fa74635p19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e7f4c8cd5p8 0x0.0p0 T +CSV proj4-epsg.csv:00763 0 OK -0x1.0b9711dd4e7ddp24 -0x1.3bf72a948b753p19 0x0.0p0 -0x1.68p6 -0x1.46d9a3dc4c74cp9 0x0.0p0 T +CSV proj4-epsg.csv:00764 0 OK -0x1.796a95fc0baa4p19 -0x1.cb51c0a2ee683p16 -0x1.4a55854f4p7 0x1.00031ccbbe62dp0 -0x1.fffff806d6effp-1 0x1.95118p-13 T +CSV proj4-epsg.csv:00765 0 OK -0x1.01eca6ee2adep17 -0x1.d4f73fa07603p16 -0x1.4a55854f4p7 0x1.000a6c2d24f76p0 -0x1.fffff49d85f39p-1 0x1.2be8p-15 T +CSV proj4-epsg.csv:00766 0 OK 0x1.e8f9be5599efp18 -0x1.e061b609ae461p16 -0x1.4a55854f4p7 0x1.001ebae6f6122p0 -0x1.0000083b4269ap0 -0x1.a292p-12 T +CSV proj4-epsg.csv:00767 0 OK 0x1.126588be3fadap20 -0x1.edc396a690935p16 -0x1.4a55854f4p7 0x1.0051e378f92d3p0 -0x1.000062aa744a4p0 -0x1.860cp-10 T +CSV proj4-epsg.csv:00768 0 OK 0x1.7261ff1ef3c42p21 -0x1.2cf7185ace388p17 -0x1.c71ddc424p4 0x1.107b43cd43ecdp0 -0x1.0098351da08ddp0 -0x1.3fc21ccp-3 T +CSV proj4-epsg.csv:00769 0 OK 0x1.75464a422948p21 -0x1.50621f58f7affp17 -0x1.c71ddc424p4 0x1.3d81edae99c63p0 -0x1.039d5012bf2e9p0 -0x1.2d422748p-1 T +CSV proj4-epsg.csv:00770 0 OK 0x1.3e357c0ac2735p21 -0x1.b3dfd418aba79p16 -0x1.1581a36b3p7 0x1.000000a32eb1p0 -0x1.fffffffc884afp-1 0x1.364p-17 T +CSV proj4-epsg.csv:00771 0 OK 0x1.8ef16ddc3df52p21 -0x1.b7bc91901d8f4p16 -0x1.1581a36b3p7 0x1.00000654098b4p0 -0x1.ffffffddab109p-1 0x1.1cd8p-17 T +CSV proj4-epsg.csv:00772 0 OK 0x1.df405e554cdcap21 -0x1.bce82d68e1bf8p16 -0x1.1581a36b3p7 0x1.00002952788f9p0 -0x1.ffffff3d658cdp-1 0x1.01dp-18 T +CSV proj4-epsg.csv:00773 0 OK -0x1.4560e98c30358p17 -0x1.c103499b4ce59p16 0x1.4fae6bb5a4p8 0x1.000040ddc64ebp0 -0x1.ffffff177c68cp-1 0x1.0a194p-7 T +CSV proj4-epsg.csv:00774 0 OK 0x1.9cd3f2f1ddc2fp23 -0x1.4ef4c2f48b49dp18 -0x1.ea248c9dfp6 0x1.08d05b836f0e7p5 -0x1.5604cacb7f2e4p3 -0x1.14239a43p6 T +CSV proj4-epsg.csv:00775 0 OK 0x1.9d397c4225f9fp23 -0x1.780c459cf124dp18 -0x1.ea248c9dfp6 0x1.e6f076e4d8f0cp5 -0x1.6f6a53624a97bp4 -0x1.8c76ad265p6 T +CSV proj4-epsg.csv:00776 0 OK 0x1.9a9d03cf21c21p23 -0x1.a8b920adb1d85p18 -0x1.ea248c9dfp6 0x1.c6e6c198d836dp6 -0x1.9a670dd969638p5 -0x1.4821194e2p5 T +CSV proj4-epsg.csv:00777 0 EXC:java.lang.IllegalStateException 0x1.949537c073821p23 -0x1.e2614c9fab653p18 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:00778 0 EXC:java.lang.IllegalStateException 0x1.8aabc5ad86e8fp23 -0x1.13533f453de14p19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:00779 0 EXC:java.lang.IllegalStateException 0x1.7c5c0c2f1fce2p23 -0x1.3bb733a57e49cp19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:00780 0 OK -0x1.5e1c8d0e223d1p23 -0x1.4ef4c2f48b49dp18 -0x1.ea248c9dfp6 0x1.08d05b836f0e7p5 -0x1.5604cacb7f2e4p3 -0x1.14239a43p6 T +CSV proj4-epsg.csv:00781 0 OK -0x1.7c3b83bdda061p23 -0x1.780c459cf124dp18 -0x1.ea248c9dfp6 0x1.e6f076e4d8f0cp5 -0x1.6f6a53624a97bp4 -0x1.8c76ad265p6 T +CSV proj4-epsg.csv:00782 0 OK -0x1.9d5c7c30de3dfp23 -0x1.a8b920adb1d85p18 -0x1.ea248c9dfp6 0x1.c6e6c198d836dp6 -0x1.9a670dd969638p5 -0x1.4821194e2p5 T +CSV proj4-epsg.csv:00783 0 EXC:java.lang.IllegalStateException -0x1.c1e8c83f8c7dfp23 -0x1.e2614c9fab653p18 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:00784 0 EXC:java.lang.IllegalStateException -0x1.ea56ba5279171p23 -0x1.13533f453de14p19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:00785 0 EXC:java.lang.IllegalStateException -0x1.0b9579e87018fp24 -0x1.3bb733a57e49cp19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:00786 0 OK 0x1.0fdc8c3bef7eap21 -0x1.cb596dc48de52p16 -0x1.7808f2ca8p3 0x1.00031bc4cd504p0 -0x1.fffff800f6b4cp-1 0x1.791748p-9 T +CSV proj4-epsg.csv:00787 0 OK -0x1.b0d58f365b636p20 -0x1.cb846c1bdd789p16 -0x1.04653cf628p7 0x1.00031bd941d35p0 -0x1.fffff86a5fe7bp-1 -0x1.be97p-14 T +CSV proj4-epsg.csv:00788 0 OK -0x1.311455227eddbp21 -0x1.e0967f1322d31p16 -0x1.04653cf628p7 0x1.001eb54cd283fp0 -0x1.000008d52c6c2p0 -0x1.18941p-10 T +CSV proj4-epsg.csv:00789 0 OK -0x1.8e6c8ad1ce887p21 -0x1.fd92bcbfb9f89p16 -0x1.04653cf628p7 0x1.00c90d6c66ffep0 -0x1.0001d225dae2ap0 -0x1.c9e914p-8 T +CSV proj4-epsg.csv:00790 0 OK -0x1.f218d6f18a794p21 -0x1.12548ffdfaf08p17 -0x1.04653cf628p7 0x1.03eed68f0dde7p0 -0x1.001450aa8ba47p0 -0x1.1cbf0ap-5 T +CSV proj4-epsg.csv:00791 0 OK -0x1.2f17421f3ed76p22 -0x1.2c91020066e58p17 -0x1.04653cf628p7 0x1.107b3d3324e5dp0 -0x1.009801bacd3adp0 -0x1.27633e6p-3 T +CSV proj4-epsg.csv:00792 0 OK -0x1.6aae2736baf0cp22 -0x1.4ff00e8a7d3fep17 -0x1.04653cf628p7 0x1.3d81b789fc89ap0 -0x1.039c174496644p0 -0x1.0fb5c168p-1 T +CSV proj4-epsg.csv:00793 0 OK -0x1.ad8f47cfab0e2p22 -0x1.800c6749388e7p17 -0x1.04653cf628p7 0x1.d623a2aebe2d2p0 -0x1.13802c645eabfp0 -0x1.cf90c24p0 T +CSV proj4-epsg.csv:00794 0 OK -0x1.f9ffd9925f476p22 -0x1.c229086f2a061p17 -0x1.04653cf628p7 0x1.e88e488e6ca03p1 -0x1.6314f92c3fcc5p0 -0x1.7b721a7dp2 T +CSV proj4-epsg.csv:00795 0 OK -0x1.2979a67c1c715p23 -0x1.0eedd4d3c293ap18 -0x1.04653cf628p7 0x1.4decb7b697c1ep3 -0x1.76a0ccd773632p1 -0x1.312db9a88p4 T +CSV proj4-epsg.csv:00796 0 OK -0x1.5e1d2745e7d9dp23 -0x1.4ef63fd6f12e4p18 -0x1.04653cf628p7 0x1.08d394bf63cbap5 -0x1.560a7a2ce0254p3 -0x1.d3e1f93f6p5 T +CSV proj4-epsg.csv:00797 0 OK -0x1.9d5d36afcf294p23 -0x1.a8bb1ef4140c1p18 -0x1.04653cf628p7 0x1.c6ec6e329bf13p6 -0x1.9a6eb3f4e54c6p5 -0x1.3af108618p5 T +CSV proj4-epsg.csv:00798 0 EXC:java.lang.IllegalStateException -0x1.ea579e75649fdp23 -0x1.13549903f56efp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00799 0 OK -0x1.80071bde87626p18 -0x1.b3d9a621b637ep16 -0x1.043027ba18p7 0x1.000000a34efc2p0 -0x1.fffffffc6bcddp-1 0x1.f364p-14 T +CSV proj4-epsg.csv:00800 0 OK -0x1.06340688e4b1ep20 -0x1.bce1e4978e03ap16 -0x1.043027ba18p7 0x1.000029533ac98p0 -0x1.ffffff3d47782p-1 0x1.da1ep-14 T +CSV proj4-epsg.csv:00801 0 OK -0x1.b0d64b211afd8p20 -0x1.cb79aa4a35056p16 -0x1.043027ba18p7 0x1.00031be1f2363p0 -0x1.fffff86a6da7bp-1 0x1.a3cp-20 T +CSV proj4-epsg.csv:00802 0 OK -0x1.3114b796c2b96p21 -0x1.e08b45cee7c2fp16 -0x1.043027ba18p7 0x1.001eb5912d533p0 -0x1.000008d53743p0 -0x1.103e4p-10 T +CSV proj4-epsg.csv:00803 0 OK -0x1.8e6cf368e349bp21 -0x1.fd86de36d1776p16 -0x1.043027ba18p7 0x1.00c90ee2637cdp0 -0x1.0001d2202a43ep0 -0x1.e6adc8p-8 T +CSV proj4-epsg.csv:00804 0 OK -0x1.f21947bbed068p21 -0x1.124e311357ccap17 -0x1.043027ba18p7 0x1.03eedce547279p0 -0x1.0014505efc5b7p0 -0x1.3298b9p-5 T +CSV proj4-epsg.csv:00805 0 OK -0x1.2f177ff21eac9p22 -0x1.2c8a0d3ebb93cp17 -0x1.043027ba18p7 0x1.107b54e0a036ep0 -0x1.0097ff59cfadap0 -0x1.3f0f876p-3 T +CSV proj4-epsg.csv:00806 0 OK -0x1.6aae6c329ac7p22 -0x1.4fe8501454263p17 -0x1.043027ba18p7 0x1.3d82083930d68p0 -0x1.039c0834c0dfbp0 -0x1.25fc0378p-1 T +CSV proj4-epsg.csv:00807 0 OK -0x1.ad8f9639c53fap22 -0x1.8003970b9a7a1p17 -0x1.043027ba18p7 0x1.d624a7bf512e1p0 -0x1.137fd91aa9f4dp0 -0x1.f677b2cp0 T +CSV proj4-epsg.csv:00808 0 OK -0x1.fa003464bcd2p22 -0x1.c21ec0c70b7fap17 -0x1.043027ba18p7 0x1.e88fe4678b9ep1 -0x1.63134c757f022p0 -0x1.9c3de4eap2 T +CSV proj4-epsg.csv:00809 0 OK -0x1.2979dc0b0762dp23 -0x1.0ee7ad1cfab19p18 -0x1.043027ba18p7 0x1.4dedf8cf5a747p3 -0x1.769c99f5b6a54p1 -0x1.4c7dfff04p4 T +CSV proj4-epsg.csv:00810 0 OK -0x1.5e1d678046f16p23 -0x1.4eeead9ec6aaap18 -0x1.043027ba18p7 0x1.08d48d572d1p5 -0x1.56052bad1f346p3 -0x1.ff0c16becp5 T +CSV proj4-epsg.csv:00811 0 OK -0x1.9d5d84d4f9934p23 -0x1.a8b190d91820bp18 -0x1.043027ba18p7 0x1.c6edef4aa6cf8p6 -0x1.9a67b611a3473p5 -0x1.67bf623fp5 T +CSV proj4-epsg.csv:00812 0 EXC:java.lang.IllegalStateException -0x1.ea57feaa729b1p23 -0x1.134e6dbcb336bp19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00813 0 OK 0x1.3f096d37b940ap22 -0x1.cb79aa4a35056p16 -0x1.043027ba18p7 0x1.00031be1f2363p0 -0x1.fffff86a6da7bp-1 0x1.a3cp-20 T +CSV proj4-epsg.csv:00814 0 OK 0x1.66277e0261718p22 -0x1.d51feb64923dcp16 -0x1.043027ba18p7 0x1.000a69d4d4b8ap0 -0x1.fffff53a9233cp-1 -0x1.1f6dp-12 T +CSV proj4-epsg.csv:00815 0 OK 0x1.8cc6a4349ea35p22 -0x1.e08b45cee7c2fp16 -0x1.043027ba18p7 0x1.001eb5912d533p0 -0x1.000008d53743p0 -0x1.103e4p-10 T +CSV proj4-epsg.csv:00816 0 OK 0x1.b2d091c697b5cp22 -0x1.edee2f7909d17p16 -0x1.043027ba18p7 0x1.0051d86461526p0 -0x1.000063fa45216p0 -0x1.83f41p-9 T +CSV proj4-epsg.csv:00817 0 OK 0x1.d82c864b8e5b2p22 -0x1.fd86de36d1776p16 -0x1.043027ba18p7 0x1.00c90ee2637cdp0 -0x1.0001d2202a43ep0 -0x1.e6adc8p-8 T +CSV proj4-epsg.csv:00818 0 OK 0x1.fcbed53e81bdcp22 -0x1.07d0dd7964e2bp17 -0x1.043027ba18p7 0x1.01ce429487da7p0 -0x1.0006884992ddbp0 -0x1.197274p-6 T +CSV proj4-epsg.csv:00819 0 OK 0x1.10342e1104be6p23 -0x1.124e311357ccap17 -0x1.043027ba18p7 0x1.03eedce547279p0 -0x1.0014505efc5b7p0 -0x1.3298b9p-5 T +CSV proj4-epsg.csv:00820 0 OK 0x1.2182f36384e2ep23 -0x1.1e74a41ad53c6p17 -0x1.043027ba18p7 0x1.0832656f058c1p0 -0x1.00397b9aabd39p0 -0x1.3eb0e98p-4 T +CSV proj4-epsg.csv:00821 0 OK 0x1.3237c006f0a9cp23 -0x1.2c8a0d3ebb93cp17 -0x1.043027ba18p7 0x1.107b54e0a038cp0 -0x1.0097ff59cfadap0 -0x1.3f0f876p-3 T +CSV proj4-epsg.csv:00822 0 OK 0x1.423bd6bad9092p23 -0x1.3ce37c1687703p17 -0x1.043027ba18p7 0x1.203390c9bfc2p0 -0x1.017e0bb448b98p0 -0x1.35f4379p-2 T +CSV proj4-epsg.csv:00823 0 OK 0x1.517549e6b29c8p23 -0x1.4fe8501454263p17 -0x1.043027ba18p7 0x1.3d82083930d68p0 -0x1.039c0834c0dfbp0 -0x1.25fc0378p-1 T +CSV proj4-epsg.csv:00824 0 OK 0x1.5fc681ad05c8cp23 -0x1.6615d9be20c79p17 -0x1.043027ba18p7 0x1.737b897bedb7ap0 -0x1.087ae0484f351p0 -0x1.11afa46cp0 T +CSV proj4-epsg.csv:00825 0 OK 0x1.6d0db4e31d603p23 -0x1.8003970b9a7a1p17 -0x1.043027ba18p7 0x1.d624a7bf512e1p0 -0x1.137fd91aa9f4dp0 -0x1.f677b2cp0 T +CSV proj4-epsg.csv:00826 0 OK 0x1.7924541704266p23 -0x1.9e681ce256022p17 -0x1.043027ba18p7 0x1.44ecad2452d96p1 -0x1.2c2a8c742492bp0 -0x1.c8a2115ep1 T +CSV proj4-epsg.csv:00827 0 OK 0x1.83de65cda197p23 -0x1.c21ec0c70b7fap17 -0x1.043027ba18p7 0x1.e88fe4678b9ep1 -0x1.63134c757f022p0 -0x1.9c3de4eap2 T +CSV proj4-epsg.csv:00828 0 OK 0x1.8d09d322c654p23 -0x1.ec2e16f71077fp17 -0x1.043027ba18p7 0x1.89af1b95625fbp2 -0x1.dd273b44bb98ep0 -0x1.72b88bc78p3 T +CSV proj4-epsg.csv:00829 0 OK 0x1.946da3f4f89d3p23 -0x1.0ee7ad1cfab19p18 -0x1.043027ba18p7 0x1.4dedf8cf5a747p3 -0x1.769c99f5b6a54p1 -0x1.4c7dfff04p4 T +CSV proj4-epsg.csv:00830 0 OK 0x1.99c929c6d133fp23 -0x1.2c3b69ebea88ep18 -0x1.043027ba18p7 0x1.259f3016e45b1p4 -0x1.53ba6094be1b8p2 -0x1.283ad2e2ep5 T +CSV proj4-epsg.csv:00831 0 OK 0x1.9cd3187fb90eap23 -0x1.4eeead9ec6aaap18 -0x1.043027ba18p7 0x1.08d48d572d1p5 -0x1.56052bad1f346p3 -0x1.ff0c16becp5 T +CSV proj4-epsg.csv:00832 0 OK 0x1.9d388c35d83f3p23 -0x1.780582fa60bdep18 -0x1.043027ba18p7 0x1.e6f837be43ca9p5 -0x1.6f6ac075a2c05p4 -0x1.771c8c42fp6 T +CSV proj4-epsg.csv:00833 0 OK 0x1.9a9bfb2b066ccp23 -0x1.a8b190d91820bp18 -0x1.043027ba18p7 0x1.c6edef4aa6cf8p6 -0x1.9a67b611a3473p5 -0x1.67bf623fp5 T +CSV proj4-epsg.csv:00834 0 EXC:java.lang.IllegalStateException 0x1.949413268d4aap23 -0x1.e258c9acc7fd7p18 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00835 0 EXC:java.lang.IllegalStateException 0x1.8aaa81558d64fp23 -0x1.134e6dbcb336bp19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00836 0 EXC:java.lang.IllegalStateException 0x1.7c5aa3dbd5ae6p23 -0x1.3bb1b76a4b939p19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00837 0 OK -0x1.0ecd160fec395p23 -0x1.292e3f63fe5aap23 0x1.1b564330c6p10 0x1.fffffffd64bbbp-1 -0x1.fffffffe73484p-1 -0x1.0p-28 F +CSV proj4-epsg.csv:00838 0 OK -0x1.b0d64b211afd8p20 -0x1.cb79aa4a35056p16 -0x1.043027ba18p7 0x1.00031be1f2363p0 -0x1.fffff86a6da7bp-1 0x1.a3cp-20 T +CSV proj4-epsg.csv:00839 0 OK -0x1.044103fb3d1d1p21 -0x1.d51feb64923dcp16 -0x1.043027ba18p7 0x1.000a69d4d4b7ep0 -0x1.fffff53a9233ap-1 -0x1.1f6dp-12 T +CSV proj4-epsg.csv:00840 0 OK -0x1.3114b796c2b96p21 -0x1.e08b45cee7c2fp16 -0x1.043027ba18p7 0x1.001eb5912d533p0 -0x1.000008d53743p0 -0x1.103e4p-10 T +CSV proj4-epsg.csv:00841 0 OK -0x1.5f12dc72d0947p21 -0x1.edee2f7909d17p16 -0x1.043027ba18p7 0x1.0051d86461543p0 -0x1.000063fa45216p0 -0x1.83f41p-9 T +CSV proj4-epsg.csv:00842 0 OK -0x1.8e6cf368e349bp21 -0x1.fd86de36d1776p16 -0x1.043027ba18p7 0x1.00c90ee2637cdp0 -0x1.0001d2202a43ep0 -0x1.e6adc8p-8 T +CSV proj4-epsg.csv:00843 0 OK -0x1.bf5a5582fc848p21 -0x1.07d0dd7964e2bp17 -0x1.043027ba18p7 0x1.01ce429487da7p0 -0x1.0006884992ddbp0 -0x1.197274p-6 T +CSV proj4-epsg.csv:00844 0 OK -0x1.f21947bbed068p21 -0x1.124e311357ccap17 -0x1.043027ba18p7 0x1.03eedce547279p0 -0x1.0014505efc5b7p0 -0x1.3298b9p-5 T +CSV proj4-epsg.csv:00845 0 OK -0x1.13781938f63a3p22 -0x1.1e74a41ad53c6p17 -0x1.043027ba18p7 0x1.0832656f058fap0 -0x1.00397b9aabd39p0 -0x1.3eb0e98p-4 T +CSV proj4-epsg.csv:00846 0 OK -0x1.2f177ff21eac9p22 -0x1.2c8a0d3ebb93cp17 -0x1.043027ba18p7 0x1.107b54e0a036ep0 -0x1.0097ff59cfadap0 -0x1.3f0f876p-3 T +CSV proj4-epsg.csv:00847 0 OK -0x1.4c18528a4dedbp22 -0x1.3ce37c1687703p17 -0x1.043027ba18p7 0x1.203390c9bfc3dp0 -0x1.017e0bb448b98p0 -0x1.35f4379p-2 T +CSV proj4-epsg.csv:00848 0 OK -0x1.6aae6c329ac7p22 -0x1.4fe8501454263p17 -0x1.043027ba18p7 0x1.3d82083930d68p0 -0x1.039c0834c0dfbp0 -0x1.25fc0378p-1 T +CSV proj4-epsg.csv:00849 0 OK -0x1.8b14fca5f46e9p22 -0x1.6615d9be20c79p17 -0x1.043027ba18p7 0x1.737b897bedb4p0 -0x1.087ae0484f351p0 -0x1.11afa46cp0 T +CSV proj4-epsg.csv:00850 0 OK -0x1.ad8f9639c53fap22 -0x1.8003970b9a7a1p17 -0x1.043027ba18p7 0x1.d624a7bf512e1p0 -0x1.137fd91aa9f4dp0 -0x1.f677b2cp0 T +CSV proj4-epsg.csv:00851 0 OK -0x1.d26b57d1f7b34p22 -0x1.9e681ce256022p17 -0x1.043027ba18p7 0x1.44ecad2452d96p1 -0x1.2c2a8c742492bp0 -0x1.c8a2115ep1 T +CSV proj4-epsg.csv:00852 0 OK -0x1.fa003464bcd2p22 -0x1.c21ec0c70b7fap17 -0x1.043027ba18p7 0x1.e88fe4678b9ep1 -0x1.63134c757f022p0 -0x1.9c3de4eap2 T +CSV proj4-epsg.csv:00853 0 OK -0x1.12592cdd39acp23 -0x1.ec2e16f71077fp17 -0x1.043027ba18p7 0x1.89af1b95625fbp2 -0x1.dd273b44bb98ep0 -0x1.72b88bc78p3 T +CSV proj4-epsg.csv:00854 0 OK -0x1.2979dc0b0762dp23 -0x1.0ee7ad1cfab19p18 -0x1.043027ba18p7 0x1.4dedf8cf5a747p3 -0x1.769c99f5b6a54p1 -0x1.4c7dfff04p4 T +CSV proj4-epsg.csv:00855 0 OK -0x1.42a2d6392ecc1p23 -0x1.2c3b69ebea88ep18 -0x1.043027ba18p7 0x1.259f3016e45b1p4 -0x1.53ba6094be1b8p2 -0x1.283ad2e2ep5 T +CSV proj4-epsg.csv:00856 0 OK -0x1.04331a2f22ce5p21 -0x1.d56a0ec7f9f23p16 0x0.0p0 0x1.000a6af8f0b9cp0 -0x1.fffff5367ad71p-1 0x0.0p0 T +CSV proj4-epsg.csv:00857 0 OK -0x1.5e1d678046f16p23 -0x1.4eeead9ec6aaap18 -0x1.043027ba18p7 0x1.08d48d572d1p5 -0x1.56052bad1f346p3 -0x1.ff0c16becp5 T +CSV proj4-epsg.csv:00858 0 OK -0x1.7c3c73ca27c0dp23 -0x1.780582fa60bdep18 -0x1.043027ba18p7 0x1.e6f837be43ca9p5 -0x1.6f6ac075a2c05p4 -0x1.771c8c42fp6 T +CSV proj4-epsg.csv:00859 0 OK -0x1.9d5d84d4f9934p23 -0x1.a8b190d91820bp18 -0x1.043027ba18p7 0x1.c6edef4aa6cf8p6 -0x1.9a67b611a3473p5 -0x1.67bf623fp5 T +CSV proj4-epsg.csv:00860 0 EXC:java.lang.IllegalStateException -0x1.c1e9ecd972b56p23 -0x1.e258c9acc7fd7p18 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00861 0 EXC:java.lang.IllegalStateException -0x1.ea57feaa729b1p23 -0x1.134e6dbcb336bp19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00862 0 EXC:java.lang.IllegalStateException -0x1.0b962e121528dp24 -0x1.3bb1b76a4b939p19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:00863 0 OK 0x1.3f099c3269272p22 -0x1.cb846c1bdd789p16 -0x1.04653cf628p7 0x1.00031bd941d27p0 -0x1.fffff86a5fe7bp-1 -0x1.be97p-14 T +CSV proj4-epsg.csv:00864 0 OK 0x1.6627ae053d402p22 -0x1.d52ae3ca06973p16 -0x1.04653cf628p7 0x1.000a69bb0b568p0 -0x1.fffff53a5f554p-1 -0x1.7b8f8p-12 T +CSV proj4-epsg.csv:00865 0 OK 0x1.8cc6d56ec0912p22 -0x1.e0967f1322d31p16 -0x1.04653cf628p7 0x1.001eb54cd2831p0 -0x1.000008d52c6c2p0 -0x1.18941p-10 T +CSV proj4-epsg.csv:00866 0 OK 0x1.b2d0c46c3b846p22 -0x1.edf9b50010f5ep16 -0x1.04653cf628p7 0x1.0051d7beaee4p0 -0x1.000063fb35d48p0 -0x1.7599f8p-9 T +CSV proj4-epsg.csv:00867 0 OK 0x1.d82cba9718bbcp22 -0x1.fd92bcbfb9f89p16 -0x1.04653cf628p7 0x1.00c90d6c66ffep0 -0x1.0001d225dae2ap0 -0x1.c9e914p-8 T +CSV proj4-epsg.csv:00868 0 OK 0x1.fcbf0b71acd3ap22 -0x1.07d70073b188ap17 -0x1.04653cf628p7 0x1.01ce3f7776e3ap0 -0x1.000688605b263p0 -0x1.066c7cp-6 T +CSV proj4-epsg.csv:00869 0 OK 0x1.10344a439d61bp23 -0x1.12548ffdfaf08p17 -0x1.04653cf628p7 0x1.03eed68f0dde7p0 -0x1.001450aa8ba47p0 -0x1.1cbf0ap-5 T +CSV proj4-epsg.csv:00870 0 OK 0x1.218310d96ada6p23 -0x1.1e7b48705430fp17 -0x1.04653cf628p7 0x1.083259010c932p0 -0x1.00397c79eed7ep0 -0x1.2765304p-4 T +CSV proj4-epsg.csv:00871 0 OK 0x1.3237def060945p23 -0x1.2c91020066e58p17 -0x1.04653cf628p7 0x1.107b3d3324e5dp0 -0x1.009801bacd3adp0 -0x1.27633e6p-3 T +CSV proj4-epsg.csv:00872 0 OK 0x1.423bf74ef8211p23 -0x1.3ceace21fc9c6p17 -0x1.04653cf628p7 0x1.203364b31a566p0 -0x1.017e11d2d1fddp0 -0x1.1eb3c03p-2 T +CSV proj4-epsg.csv:00873 0 OK 0x1.51756c64a287ap23 -0x1.4ff00e8a7d3fep17 -0x1.04653cf628p7 0x1.3d81b789fc89ap0 -0x1.039c174496644p0 -0x1.0fb5c168p-1 T +CSV proj4-epsg.csv:00874 0 OK 0x1.5fc6a65d18532p23 -0x1.661e167ece937p17 -0x1.04653cf628p7 0x1.737af7b225283p0 -0x1.087b042441cf3p0 -0x1.f9788ebp-1 T +CSV proj4-epsg.csv:00875 0 OK 0x1.6d0ddc182a78fp23 -0x1.800c6749388e7p17 -0x1.04653cf628p7 0x1.d623a2aebe2d2p0 -0x1.13802c645eabfp0 -0x1.cf90c24p0 T +CSV proj4-epsg.csv:00876 0 OK 0x1.79247e2fe4812p23 -0x1.9e7199d1a229dp17 -0x1.04653cf628p7 0x1.44ebc4d09e7c8p1 -0x1.2c2b4a843e129p0 -0x1.a4d31106p1 T +CSV proj4-epsg.csv:00877 0 OK 0x1.83de9336d05c5p23 -0x1.c229086f2a061p17 -0x1.04653cf628p7 0x1.e88e488e6ca03p1 -0x1.6314f92c3fcc5p0 -0x1.7b721a7dp2 T +CSV proj4-epsg.csv:00878 0 OK 0x1.8d0a04582c56bp23 -0x1.ec394d26ce105p17 -0x1.04653cf628p7 0x1.89adaf8a748bdp2 -0x1.dd2afc260847bp0 -0x1.54c266ab8p3 T +CSV proj4-epsg.csv:00879 0 OK 0x1.946dd983e38ebp23 -0x1.0eedd4d3c293ap18 -0x1.04653cf628p7 0x1.4decb7b697c1ep3 -0x1.76a0ccd773632p1 -0x1.312db9a88p4 T +CSV proj4-epsg.csv:00880 0 OK 0x1.99c96450195eap23 -0x1.2c4237b86ec02p18 -0x1.04653cf628p7 0x1.259e15657dbd1p4 -0x1.53bf159a37223p2 -0x1.0f860335ap5 T +CSV proj4-epsg.csv:00881 0 OK 0x1.9cd358ba18263p23 -0x1.4ef63fd6f12e4p18 -0x1.04653cf628p7 0x1.08d394bf63cbap5 -0x1.560a7a2ce0254p3 -0x1.d3e1f93f6p5 T +CSV proj4-epsg.csv:00882 0 OK 0x1.9d38d2f073dc5p23 -0x1.780dfdb55db75p18 -0x1.04653cf628p7 0x1.e6f682797e46dp5 -0x1.6f70ca456e794p4 -0x1.56b306a5fp6 T +CSV proj4-epsg.csv:00883 0 OK 0x1.9a9c495030d6cp23 -0x1.a8bb1ef4140c1p18 -0x1.04653cf628p7 0x1.c6ec6e329bf13p6 -0x1.9a6eb3f4e54c6p5 -0x1.3af108618p5 T +CSV proj4-epsg.csv:00884 0 EXC:java.lang.IllegalStateException 0x1.949469bebf36fp23 -0x1.e2639df654353p18 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00885 0 EXC:java.lang.IllegalStateException 0x1.8aaae18a9b603p23 -0x1.13549903f56efp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00886 0 EXC:java.lang.IllegalStateException 0x1.7c5b0efc63eacp23 -0x1.3bb8c7464712cp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00887 0 OK -0x1.b0d58f365b636p20 -0x1.cb846c1bdd789p16 -0x1.04653cf628p7 0x1.00031bd941d35p0 -0x1.fffff86a5fe7bp-1 -0x1.be97p-14 T +CSV proj4-epsg.csv:00888 0 OK -0x1.0440a3f5857fdp21 -0x1.d52ae3ca06973p16 -0x1.04653cf628p7 0x1.000a69bb0b55ap0 -0x1.fffff53a5f554p-1 -0x1.7b8f8p-12 T +CSV proj4-epsg.csv:00889 0 OK -0x1.311455227eddbp21 -0x1.e0967f1322d31p16 -0x1.04653cf628p7 0x1.001eb54cd283fp0 -0x1.000008d52c6c2p0 -0x1.18941p-10 T +CSV proj4-epsg.csv:00890 0 OK -0x1.5f12772788f73p21 -0x1.edf9b50010f5ep16 -0x1.04653cf628p7 0x1.0051d7beaee4p0 -0x1.000063fb35d48p0 -0x1.7599f8p-9 T +CSV proj4-epsg.csv:00891 0 OK -0x1.8e6c8ad1ce887p21 -0x1.fd92bcbfb9f89p16 -0x1.04653cf628p7 0x1.00c90d6c66ffep0 -0x1.0001d225dae2ap0 -0x1.c9e914p-8 T +CSV proj4-epsg.csv:00892 0 OK -0x1.bf59e91ca658bp21 -0x1.07d70073b188ap17 -0x1.04653cf628p7 0x1.01ce3f7776e57p0 -0x1.000688605b264p0 -0x1.066c7cp-6 T +CSV proj4-epsg.csv:00893 0 OK -0x1.f218d6f18a794p21 -0x1.12548ffdfaf08p17 -0x1.04653cf628p7 0x1.03eed68f0dde7p0 -0x1.001450aa8ba47p0 -0x1.1cbf0ap-5 T +CSV proj4-epsg.csv:00894 0 OK -0x1.1377de4d2a4b5p22 -0x1.1e7b48705430fp17 -0x1.04653cf628p7 0x1.083259010c932p0 -0x1.00397c79eed7dp0 -0x1.2765304p-4 T +CSV proj4-epsg.csv:00895 0 OK -0x1.2f17421f3ed76p22 -0x1.2c91020066e58p17 -0x1.04653cf628p7 0x1.107b3d3324e5dp0 -0x1.009801bacd3adp0 -0x1.27633e6p-3 T +CSV proj4-epsg.csv:00896 0 OK -0x1.4c1811620fbdep22 -0x1.3ceace21fc9c6p17 -0x1.04653cf628p7 0x1.203364b31a566p0 -0x1.017e11d2d1fddp0 -0x1.1eb3c03p-2 T +CSV proj4-epsg.csv:00897 0 OK -0x1.6aae2736baf0cp22 -0x1.4ff00e8a7d3fep17 -0x1.04653cf628p7 0x1.3d81b789fc89ap0 -0x1.039c174496644p0 -0x1.0fb5c168p-1 T +CSV proj4-epsg.csv:00898 0 OK -0x1.8b14b345cf59bp22 -0x1.661e167ece937p17 -0x1.04653cf628p7 0x1.737af7b2252bcp0 -0x1.087b042441cf4p0 -0x1.f9788ebp-1 T +CSV proj4-epsg.csv:00899 0 OK -0x1.ad8f47cfab0e2p22 -0x1.800c6749388e7p17 -0x1.04653cf628p7 0x1.d623a2aebe2d2p0 -0x1.13802c645eabfp0 -0x1.cf90c24p0 T +CSV proj4-epsg.csv:00900 0 OK -0x1.d26b03a036fdcp22 -0x1.9e7199d1a229dp17 -0x1.04653cf628p7 0x1.44ebc4d09e7c8p1 -0x1.2c2b4a843e129p0 -0x1.a4d31106p1 T +CSV proj4-epsg.csv:00901 0 OK -0x1.f9ffd9925f476p22 -0x1.c229086f2a061p17 -0x1.04653cf628p7 0x1.e88e488e6ca03p1 -0x1.6314f92c3fcc5p0 -0x1.7b721a7dp2 T +CSV proj4-epsg.csv:00902 0 OK -0x1.1258fba7d3a95p23 -0x1.ec394d26ce105p17 -0x1.04653cf628p7 0x1.89adaf8a748bdp2 -0x1.dd2afc260847bp0 -0x1.54c266ab8p3 T +CSV proj4-epsg.csv:00903 0 OK -0x1.2979a67c1c715p23 -0x1.0eedd4d3c293ap18 -0x1.04653cf628p7 0x1.4decb7b697c1ep3 -0x1.76a0ccd773632p1 -0x1.312db9a88p4 T +CSV proj4-epsg.csv:00904 0 OK -0x1.42a29bafe6a16p23 -0x1.2c4237b86ec02p18 -0x1.04653cf628p7 0x1.259e15657dbd1p4 -0x1.53bf159a37223p2 -0x1.0f860335ap5 T +CSV proj4-epsg.csv:00905 0 OK -0x1.5e1d2745e7d9dp23 -0x1.4ef63fd6f12e4p18 -0x1.04653cf628p7 0x1.08d394bf63cbap5 -0x1.560a7a2ce0254p3 -0x1.d3e1f93f6p5 T +CSV proj4-epsg.csv:00906 0 OK -0x1.7c3c2d0f8c23bp23 -0x1.780dfdb55db75p18 -0x1.04653cf628p7 0x1.e6f682797e46dp5 -0x1.6f70ca456e794p4 -0x1.56b306a5fp6 T +CSV proj4-epsg.csv:00907 0 OK -0x1.9d5d36afcf294p23 -0x1.a8bb1ef4140c1p18 -0x1.04653cf628p7 0x1.c6ec6e329bf13p6 -0x1.9a6eb3f4e54c6p5 -0x1.3af108618p5 T +CSV proj4-epsg.csv:00908 0 EXC:java.lang.IllegalStateException -0x1.c1e9964140c91p23 -0x1.e2639df654353p18 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00909 0 EXC:java.lang.IllegalStateException -0x1.ea579e75649fdp23 -0x1.13549903f56efp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00910 0 EXC:java.lang.IllegalStateException -0x1.0b95f881ce0aap24 -0x1.3bb8c7464712cp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:00911 0 OK -0x1.8e44c468f1c93p21 0x1.2d338e3ae3cc4p23 0x1.0d62b9abp3 0x1.0000000000009p0 -0x1.000000000000cp0 0x1.0p-29 T +CSV proj4-epsg.csv:00912 0 OK -0x1.f1fd9533155e8p21 0x1.2ce53d75192cdp23 0x1.0d62b9abp3 0x1.000000000005fp0 -0x1.fffffffffffe4p-1 0x1.0p-29 T +CSV proj4-epsg.csv:00913 0 OK 0x1.05d6efba110a7p24 -0x1.e38f0fb2eeb2ep21 0x0.0p0 0x1.78aaaaaaaaaa9p6 -0x1.5d381d52f85d1p8 0x0.0p0 T +CSV proj4-epsg.csv:00914 0 OK 0x1.1874bf12da2efp24 -0x1.e2713ad6a21cp21 0x0.0p0 0x1.72p6 -0x1.1a9b871f523f5p9 0x0.0p0 T +CSV proj4-epsg.csv:00915 0 OK 0x1.53b7a0614cb41p23 0x1.3d089dafa38a1p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00916 0 OK 0x1.52c4f88ae2f39p23 0x1.952d4945767a9p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00917 0 OK 0x1.b30648786fb7dp23 0x1.6d984477b3a64p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00918 0 OK 0x1.b63cf39a83ab7p23 0x1.616a989bf8p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00919 0 OK 0x1.b704ed5565bb6p23 0x1.4b140364636b1p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00920 0 OK 0x1.b6f205de9ceadp23 0x1.37fbd09973042p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00921 0 OK 0x1.b826f46eb2a9fp23 0x1.23bf98c7f0e14p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00922 0 OK 0x1.b71163ebb0895p23 0x1.0d1ef10799bdep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:00923 0 OK 0x1.7f9fabc39ec8dp23 0x1.a30b5135da228p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00924 0 OK 0x1.7fdf27bfa7bddp23 0x1.9e265778ceebap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00925 0 OK 0x1.802bf2d15954p23 0x1.920787366d41p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00926 0 OK 0x1.254361aa903efp23 -0x1.49e5c14724ef8p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00927 0 OK 0x1.8b85201b6f4bap23 -0x1.17ca73ead35e1p22 0x0.0p0 -0x1.a021277f890b6p5 -0x1.3bd38f3541789p4 0x0.0p0 T +CSV proj4-epsg.csv:00928 0 OK 0x1.caaa0d8f3a765p23 -0x1.826b7d98b9784p21 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9d03p6 0x0.0p0 T +CSV proj4-epsg.csv:00929 0 OK 0x1.d7410067f197dp23 -0x1.84f5f9ea4cb3cp21 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee06p6 0x0.0p0 T +CSV proj4-epsg.csv:00930 0 OK 0x1.41faf44fb3893p23 0x1.a1c1b331a60e4p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00931 0 OK 0x1.d95fd49418ec4p23 -0x1.d205f2c4df9a6p21 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:00932 0 OK 0x1.01a2e06e6ddfep24 -0x1.d79b6bfc52996p21 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b19p7 0x0.0p0 T +CSV proj4-epsg.csv:00933 0 OK 0x1.1a6dbffff8542p24 -0x1.1fe09c74b2f92p22 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:00934 0 OK 0x1.031a5391336ffp24 -0x1.11a4a7ac3eb6dp22 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:00935 0 OK 0x1.19d819f8cba2cp24 -0x1.1402adf4721cep22 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:00936 0 OK 0x1.7d4775ead306cp23 0x1.4aabad43674c4p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00937 0 OK 0x1.5dbf93402a1p23 0x1.95b318b3d3521p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00938 0 OK 0x1.62a8f283c8118p23 0x1.01b6bfec23dd9p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00939 0 OK 0x1.633d3b8562244p23 0x1.3670fb7cd7093p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00940 0 OK 0x1.461ce529f0f3ep23 0x1.d30c3aa1c69e9p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00941 0 OK 0x1.48bfc4b7b9355p23 0x1.146b3c6161574p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00942 0 OK 0x1.652b6f003c36ap23 0x1.2f52257756a74p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00943 0 OK 0x1.6112cdef64c8dp23 0x1.06536645b5fbap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2677p-1 0x0.0p0 F +CSV proj4-epsg.csv:00944 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:00945 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:00946 0 OK 0x1.303fb5dee8c06p23 -0x1.0db8f2673c046p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00947 0 OK 0x1.1f878132a3453p23 -0x1.534b8f539b7f4p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00948 0 OK 0x1.246f2e5bd85f1p23 -0x1.0c2b3d8ee8a25p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00949 0 OK 0x1.1d1bec8cfdfc7p24 0x1.dad95b3c2ae93p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00950 0 OK 0x1.f5dfd8e9bfdbep23 0x1.30f84d5602c05p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00951 0 OK 0x1.b642caff5c954p23 0x1.1b88ba0a42f22p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00952 0 OK 0x1.6b4cba2bb1a5cp23 0x1.d9149218a7432p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00953 0 OK 0x1.6bf3f7d7c4683p23 0x1.f56249f1a7f08p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00954 0 OK 0x1.6a285ba9b046bp23 0x1.e23a99490585cp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00955 0 OK 0x1.1e7021a600c6ep24 -0x1.e09c2310d7b8fp21 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491e3p9 0x0.0p0 T +CSV proj4-epsg.csv:00956 0 OK 0x1.78206c898da1cp23 0x1.0a84ef7491b8ap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00957 0 OK 0x1.69ecfd5d61591p23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00958 0 OK 0x1.6a00742d44bdp23 -0x1.333be5fe10f52p22 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db8281p2 0x0.0p0 T +CSV proj4-epsg.csv:00959 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:00960 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:00961 0 OK 0x1.994c26431b469p23 -0x1.26698bba6217ap22 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:00962 0 OK 0x1.b27cc5d80250ep23 -0x1.28733d05df362p22 0x0.0p0 -0x1.98d990063ec6cp6 -0x1.6ed261eb7328p5 0x0.0p0 T +CSV proj4-epsg.csv:00963 0 OK 0x1.279ff9888b715p23 -0x1.4cb0e59d69ed3p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00964 0 OK 0x1.6fb165c9065a4p23 0x1.62464b038399bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00965 0 OK 0x1.6f4754db09495p23 0x1.5bf2c4f5ce6f8p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00966 0 OK 0x1.47c330687a4fbp23 0x1.52e912879c2bp18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00967 0 OK 0x1.45b98b14707a9p23 0x1.494b817e1bac7p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00968 0 OK 0x1.67cea956d147ap23 0x1.e504b1f970c3fp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00969 0 OK 0x1.67603867febddp23 0x1.d3bd835722efp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00970 0 OK 0x1.b9e7ad424f0a3p23 0x1.5ccd4e1188ecep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00971 0 OK 0x1.9eba1738f13fdp23 0x1.50d0bec9aeb44p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00972 0 OK 0x1.6260ccf61c887p23 -0x1.29848050ed706p22 0x0.0p0 -0x1.6965a34d8a5a8p4 -0x1.dd93f429dc627p2 0x0.0p0 T +CSV proj4-epsg.csv:00973 0 OK 0x1.6e0afe1503ac1p23 0x1.4912db8d06b7bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00974 0 OK 0x1.6e1f2824f9b61p23 0x1.46bc1ed71df32p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:00975 0 OK 0x1.4b047d4d0086bp23 0x1.517bfb4099862p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00976 0 OK 0x1.62e65f3763a56p23 0x1.9c38bcddef3dep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00977 0 OK 0x1.6826274d485ddp23 0x1.dcbab5baa6ffep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00978 0 OK 0x1.6f4668b190045p23 0x1.2fb6062bcac2cp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:00979 0 OK 0x1.68bb8f51b7b46p23 0x1.5ff87bbe0f19dp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00980 0 OK 0x1.5df2e99177a9ep23 0x1.912b856bef2dap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00981 0 OK 0x1.7abd8927cff7ap23 0x1.31c09f82825dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00982 0 OK 0x1.7bc684036876dp23 0x1.6b8a3feeece7ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00983 0 OK 0x1.7d5629263629ap23 0x1.9b53a36e26486p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00984 0 OK 0x1.77de7bb0f38a4p23 -0x1.33db0875d1bf3p22 0x0.0p0 -0x1.bf7ce334221d1p4 -0x1.2f04f08531c1p3 0x0.0p0 T +CSV proj4-epsg.csv:00985 0 OK 0x1.92a758fe6d9e2p23 0x1.c4e20324affb3p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00986 0 OK 0x1.910d9c19c2e6dp23 0x1.a9712c4cace6ep19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:00987 0 OK 0x1.7802cd64ba298p23 0x1.6e31d6a1963cdp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00988 0 OK 0x1.7a87a09c328d4p23 0x1.6354a1625a49bp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00989 0 OK 0x1.3e2bb7db5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00990 0 OK 0x1.405d7fbff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00991 0 OK 0x1.5e2bbcc3e3fa8p23 0x1.42d4f14491f36p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00992 0 OK 0x1.5cdec35d189f2p23 0x1.3cc10a25ec8dfp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00993 0 OK 0x1.5b7227d1fcf54p23 0x1.3ded7947a4d6dp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00994 0 OK 0x1.e55aab52362f8p22 -0x1.d3e6352759774p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:00995 0 OK 0x1.64cf8dae5879cp25 0x1.2bdd285f10d29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00996 0 OK 0x1.6772502037741p25 0x1.21e004881e6e5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00997 0 OK 0x1.681655a65a5d7p25 0x1.0f8d969f627bbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:00998 0 OK 0x1.6806d447f70abp25 0x1.ffc87e9e0657p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:00999 0 OK 0x1.690437bd2f474p25 0x1.de96c7518b356p23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01000 0 OK 0x1.68208e988ea75p25 0x1.b978690b09eb3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01001 0 OK 0x1.3aa6c00765443p25 0x1.57b41bf15866bp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01002 0 OK 0x1.3adad20ac1bbap25 0x1.53b0687deaab6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01003 0 OK 0x1.3b19ce93077f7p25 0x1.49bf746556307p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01004 0 OK 0x1.e112e8369f726p24 -0x1.0e95ac72b8ed5p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01005 0 OK 0x1.4468a8413627ep25 -0x1.caf93a196cdd7p23 0x0.0p0 -0x1.a021277f890b4p5 -0x1.3bd38f354177fp4 0x0.0p0 T +CSV proj4-epsg.csv:01006 0 OK 0x1.783343f9a05e4p25 -0x1.3cf1df1195fdcp23 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:01007 0 OK 0x1.8286c13d67a3fp25 -0x1.3f0767b3dac0bp23 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee0dp6 0x0.0p0 T +CSV proj4-epsg.csv:01008 0 OK 0x1.0817465c09d15p25 0x1.56a5c11c150ep20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01009 0 OK 0x1.8443fccfe9d1bp25 -0x1.7e3c73c2dd298p23 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:01010 0 OK 0x1.a6a17a9d36c22p25 -0x1.82d0eb13cf7bap23 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b0bp7 0x0.0p0 T +CSV proj4-epsg.csv:01011 0 OK 0x1.a9095f7c1ee5ap25 -0x1.c0f3d19d01c23p23 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:01012 0 OK 0x1.ce57827f7cfb6p25 -0x1.c4d5f39934cb4p23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:01013 0 OK 0x1.0b7b01b8e583cp25 0x1.7f1393b791e5ap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01014 0 OK 0x1.0da48b1c11494p25 0x1.c571310666717p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01015 0 OK 0x1.f3184c5ec07fbp24 -0x1.ba750b1514b1bp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01016 0 OK 0x1.d7aafa3b5d9fep24 -0x1.164aef5152798p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01017 0 OK 0x1.dfb6cf5acd96p24 -0x1.b7e8a398309adp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01018 0 OK 0x1.d3b2d8b4350e8p25 0x1.8579d64123de3p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01019 0 OK 0x1.9ba473c312b8ap25 0x1.f4475c98842d6p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01020 0 OK 0x1.677749c6b15b4p25 0x1.d11d6f0009081p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01021 0 OK 0x1.d5e0b05eed6f9p25 -0x1.8a3343cd1f04cp23 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491fp9 0x0.0p0 T +CSV proj4-epsg.csv:01022 0 OK 0x1.3480b9c77fab1p25 0x1.b5341b48f71b6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01023 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01024 0 OK 0x1.4fb58d3fda1dep25 -0x1.e2f5758840b34p23 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:01025 0 OK 0x1.645ec4317b548p25 -0x1.e64d409542524p23 0x0.0p0 -0x1.98d990063ec6dp6 -0x1.6ed261eb7328cp5 0x0.0p0 T +CSV proj4-epsg.csv:01026 0 OK 0x1.e4f2b12018cc7p24 -0x1.10e03d2f75715p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01027 0 OK 0x1.2d95dee868bb6p25 0x1.22945d1b683e9p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01028 0 OK 0x1.2d3edfcddc052p25 0x1.1d6403a600556p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01029 0 OK 0x1.271deea06f632p25 0x1.8dd0eaefa217ap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01030 0 OK 0x1.26c358ee78919p25 0x1.7fa4fca21558ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:01031 0 OK 0x1.6a7472e57b24p25 0x1.1e1742625f2c7p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01032 0 OK 0x1.5429c46eef25ap25 0x1.1442656392fd5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01033 0 OK 0x1.0f80db0a174ffp25 0x1.14ceb4366cdb1p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01034 0 OK 0x1.23178352f77b1p25 0x1.521b8cd45e5ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01035 0 OK 0x1.2765b19f55a65p25 0x1.8704729a626d1p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01036 0 OK 0x1.2d3df69df80e3p25 0x1.f2366f74d9bbdp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:01037 0 OK 0x1.27e03cf706844p25 0x1.20b072b88c9f1p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01038 0 OK 0x1.1f07ee9d571c2p25 0x1.490b00cb3a2eap24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01039 0 OK 0x1.36a589b183fc1p25 0x1.f58ff8e5898d4p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01040 0 OK 0x1.377ee08535cf3p25 0x1.2a2dddc2f4547p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01041 0 OK 0x1.38c6ab7e7b14fp25 0x1.515fd04b37b24p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01042 0 OK 0x1.4a428a386823cp25 0x1.737552e645cdbp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01043 0 OK 0x1.48f27831f8eacp25 0x1.5cf37dfc4981dp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01044 0 OK 0x1.34684595e9cd5p25 0x1.2c5b1e2cf629p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01045 0 OK 0x1.367929a769147p25 0x1.2371f2a9783e1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01046 0 OK 0x1.1f368a58c718ep25 0x1.08ca120cc66e4p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01047 0 OK 0x1.1e256ea38eea6p25 0x1.03cde7f343ff8p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01048 0 OK 0x1.1cfa60c4802c2p25 0x1.04c45319f6828p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01049 0 OK -0x1.9c94a81030e02p19 -0x1.ba3851344b3d8p16 -0x1.52c63ef4p0 0x1.00000c6dfbc98p0 -0x1.ffffffbde5b63p-1 -0x1.1f4p-20 T +CSV proj4-epsg.csv:01050 0 OK -0x1.7f42bc383846ep22 -0x1.3ab296e746f5cp21 -0x1.2b978c81fp7 0x1.4064f48eeab56p0 -0x1.03d7c03574032p0 -0x1.51cd1d9p0 T +CSV proj4-epsg.csv:01051 0 OK -0x1.0ecd1eb7eae14p23 -0x1.292e5399c6e38p23 0x1.1ae13f46a6p10 0x1.fffffffd64c53p-1 -0x1.fffffffe73473p-1 -0x1.0p-28 F +CSV proj4-epsg.csv:01052 0 OK 0x1.2fa927d85da4dp24 0x1.819c52a930bddp19 0x1.1ae13f46a6p10 0x1.ffffffffffe93p-1 -0x1.ffffffffe2ea6p-1 0x1.8p-29 T +CSV proj4-epsg.csv:01053 0 OK -0x1.bce9b39eb74ccp21 -0x1.35a47f20b6ad6p17 -0x1.043027ba18p7 0x1.0754a7bc8aa29p0 -0x1.003123af8d339p0 -0x1.1d294b8p-4 T +CSV proj4-epsg.csv:01054 0 OK -0x1.79b1062f712f8p21 -0x1.4367bec474644p17 -0x1.043027ba18p7 0x1.0ed0b0ec88d46p0 -0x1.008324e207e97p0 -0x1.1f0346ep-3 T +CSV proj4-epsg.csv:01055 0 OK -0x1.392c3f90f95aap21 -0x1.5360aa715e918p17 -0x1.043027ba18p7 0x1.1d100fa3ee29dp0 -0x1.014bf183d714cp0 -0x1.18025a2p-2 T +CSV proj4-epsg.csv:01056 0 OK -0x1.f781f6e56823cp20 -0x1.65f38f097a229p17 -0x1.043027ba18p7 0x1.37b001f1a0c51p0 -0x1.03272094aeb69p0 -0x1.0a79b7c8p-1 T +CSV proj4-epsg.csv:01057 0 OK -0x1.f4c12344c1946p21 -0x1.6b1e234e4d699p17 -0x1.043027ba18p7 0x1.3a874dadf108cp0 -0x1.035fae57c4e12p0 -0x1.17e8831p-1 T +CSV proj4-epsg.csv:01058 0 OK -0x1.bb2f664189554p21 -0x1.8107b57084d74p17 -0x1.043027ba18p7 0x1.6e04206914285p0 -0x1.07f1170764ef7p0 -0x1.04ea378cp0 T +CSV proj4-epsg.csv:01059 0 OK -0x1.85ba915623a98p21 -0x1.9aa4a6bd07916p17 -0x1.043027ba18p7 0x1.cc2bea6b3ef7fp0 -0x1.1249b164532c6p0 -0x1.df78e10cp0 T +CSV proj4-epsg.csv:01060 0 OK 0x1.19462e7d419d9p21 -0x1.c28ab9e0a22aep16 0x1.01b67b477p8 0x1.fffffffffffd5p-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:01061 0 OK 0x1.1942478239388p21 -0x1.c185cc4761ba1p16 0x1.49374b6cap5 0x1.ffffffffffffbp-1 -0x1.ffffffffffffdp-1 0x1.0p-28 T +CSV proj4-epsg.csv:01062 0 OK 0x1.e49be65553059p22 -0x1.8508c7274704ap17 0x0.0p0 0x1.2cd4478ec90bfp-4 -0x1.16640d4a8025p0 0x0.0p0 T +CSV proj4-epsg.csv:01063 0 OK 0x1.04f243f38b0c8p23 -0x1.a4462218bc936p17 0x0.0p0 -0x1.67a39707f8c09p-1 -0x1.329d98b24afdap0 0x0.0p0 T +CSV proj4-epsg.csv:01064 0 OK 0x1.18fb030a80a67p23 -0x1.c8ff42bb86b8cp17 0x0.0p0 -0x1.0ed1edd378c7ep1 -0x1.716a0fb489a9bp0 0x0.0p0 T +CSV proj4-epsg.csv:01065 0 OK 0x1.2e9b5dd4f53bbp23 -0x1.f442d98f40bp17 0x0.0p0 -0x1.2cb274d597d4cp2 -0x1.fd0e5bed75f06p0 0x0.0p0 T +CSV proj4-epsg.csv:01066 0 OK 0x1.460d851c5e45ep23 -0x1.13a9ce031ed91p18 0x0.0p0 -0x1.2e2b0449cc9c8p3 -0x1.9a3f4382db347p1 0x0.0p0 T +CSV proj4-epsg.csv:01067 0 OK 0x1.5f93851e465bap23 -0x1.31d86d8ab61adp18 0x0.0p0 -0x1.2389b4d62fa57p4 -0x1.7bce59eaa739bp2 0x0.0p0 T +CSV proj4-epsg.csv:01068 0 OK 0x1.7b782fe029ceap23 -0x1.55901ad7cbc07p18 0x0.0p0 -0x1.14d9bb1f208c7p5 -0x1.8381b345defbdp3 0x0.0p0 T +CSV proj4-epsg.csv:01069 0 OK 0x1.9a101a9d4e39cp23 -0x1.7fdc4002f942ap18 0x0.0p0 -0x1.0602e4aea1a9ap6 -0x1.a39b9d29f98d3p4 0x0.0p0 T +CSV proj4-epsg.csv:01070 0 OK 0x1.bbbaaf24bde46p23 -0x1.b1f6fcc259cd2p18 0x0.0p0 -0x1.f1c40c5a4f6f9p6 -0x1.d709308222544p5 0x0.0p0 T +CSV proj4-epsg.csv:01071 0 OK 0x1.6b8267f0eaffdp23 0x1.1798a943d871bp22 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:01072 0 OK 0x1.1c3a96d60f54p23 -0x1.2eae04d1586f8p21 0x0.0p0 0x1.000000000004p0 -0x1.000000000004p0 0x0.0p0 T +CSV proj4-epsg.csv:01073 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01074 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:01075 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:01076 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01077 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01078 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01079 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:01080 0 OK 0x1.63aea76ec312dp24 0x1.225a311c7b196p25 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000009cp0 0x0.0p0 F +CSV proj4-epsg.csv:01081 0 OK 0x1.a9095f7c1ee5ap25 -0x1.c0e38af282c85p23 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:01082 0 OK 0x1.ce57827f7cfb6p25 -0x1.c4c5aceeb5d16p23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:01083 0 OK 0x1.a9095f7c1ee5ap25 -0x1.c0e38af282c85p23 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:01084 0 OK 0x1.ce57827f7cfb6p25 -0x1.c4c5aceeb5d16p23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:01085 0 OK 0x1.2d675a614da9p23 -0x1.f181f0ebb8fbp17 -0x1.8fbe6144bcp8 0x1.fffffffd3f726p-1 -0x1.fffffffe5f316p-1 -0x1.0p-29 T +CSV proj4-epsg.csv:01086 0 OK 0x1.2d6bd9369b1b7p23 -0x1.f216a06573b32p17 0x1.a5df6433dp7 0x1.fffffffd3ed8bp-1 -0x1.fffffffe5e368p-1 -0x1.0p-29 T +CSV proj4-epsg.csv:01087 0 OK 0x1.bdf02d87e0539p22 -0x1.60e3fd1a7168bp17 -0x1.0c7831636p6 0x1.fffffffffcddap-1 -0x1.fffffffffeac8p-1 0x1.0p-28 T +CSV proj4-epsg.csv:01088 0 OK 0x1.bdf145425a89fp22 -0x1.608b68d2bba1p17 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb6ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01089 0 OK 0x1.2d62c241610aep23 -0x1.f4182c4121448p17 -0x1.baabd0badcp8 0x1.fffffffd41845p-1 -0x1.fffffffe5dbe8p-1 -0x1.0p-30 T +CSV proj4-epsg.csv:01090 0 OK -0x1.af70008450957p22 0x1.2b19847c98a5bp23 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8c13p-1 0x0.0p0 T +CSV proj4-epsg.csv:01091 0 OK 0x1.0430bb87ab3b6p22 -0x1.2d15318ba6724p23 -0x1.9c46199784p8 0x1.0000000000025p0 -0x1.fffffffffffdcp-1 0x1.0p-30 F +CSV proj4-epsg.csv:01092 0 OK 0x1.ab15206b7357cp21 -0x1.2d503342ff4fep23 -0x1.50cc2dd47cp8 0x1.fffffff017087p-1 -0x1.000000057a6c3p0 0x1.50d8p-13 F +CSV proj4-epsg.csv:01093 0 OK 0x1.3610ccbec8f1p22 -0x1.2cc779d399b16p23 -0x1.5296593024p8 0x1.0000000000023p0 -0x1.000000000002dp0 0x1.8p-29 F +CSV proj4-epsg.csv:01094 0 OK -0x1.30e5bb8c82d41p23 0x1.27f949a30f2f8p23 -0x1.86dd183bep8 0x1.0000000d10e4ap0 -0x1.ffffffed35582p-1 -0x1.8p-28 T +CSV proj4-epsg.csv:01095 0 OK -0x1.2f2ef1dabc875p22 0x1.2c7bc25714aa3p23 0x1.fd7f252c2p6 0x1.0000000000131p0 -0x1.ffffffffffed5p-1 0x1.0p-28 T +CSV proj4-epsg.csv:01096 0 OK -0x1.3e4ad45d9d76p20 -0x1.2d917bbbd46c6p23 -0x1.291f9bd808p9 0x1.fffffffffffc3p-1 -0x1.ffffffffffffp-1 0x1.0p-28 F +CSV proj4-epsg.csv:01097 0 OK -0x1.3e6f5affb7383p20 -0x1.2d8d43179beaep23 -0x1.c595216f6p7 0x1.fffffffffffebp-1 -0x1.fffffffffff73p-1 0x1.0p-30 F +CSV proj4-epsg.csv:01098 0 OK -0x1.3e703c0dd9887p20 -0x1.2d8d8bd2ccedep23 -0x1.30279358e8p7 0x1.000000666fe6ap0 -0x1.ffffff186be9fp-1 0x1.18a93p-7 F +CSV proj4-epsg.csv:01099 0 OK -0x1.df667b9b58b66p23 -0x1.9d763586dbff7p22 -0x1.f5f1cc6c7p7 0x1.000000000003fp0 -0x1.ffffffffe1e61p-1 0x1.0p-30 F +CSV proj4-epsg.csv:01100 0 OK 0x1.02c8c50c44c34p23 -0x1.9c3d4538b1db7p17 -0x1.463437b68p6 0x1.ffffffffd754ap-1 -0x1.ffffffffec39cp-1 0x1.8p-29 T +CSV proj4-epsg.csv:01101 0 OK 0x1.60c04450e66fcp19 -0x1.2db31e45ae092p23 -0x1.f7ce42de2p8 0x1.fffffffffffa7p-1 -0x1.000000000007ap0 0x1.0p-28 F +CSV proj4-epsg.csv:01102 0 OK 0x1.2d6770bde4d6dp23 -0x1.f36d18a44cb97p17 0x0.0p0 0x1.fffffffd542cbp-1 -0x1.fffffffe6984fp-1 0x0.0p0 T +CSV proj4-epsg.csv:01103 0 OK -0x1.b7d272c17b344p22 0x1.19c306f79ccecp21 -0x1.5e3b13ecfcp8 0x1.9e4827c3847edp0 -0x1.0cd7cf08775a6p0 -0x1.24bd4a908p3 T +CSV proj4-epsg.csv:01104 0 OK 0x1.7b4b2f01843fp23 0x1.5e218e40fcfe4p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01105 0 OK 0x1.3719b80648599p25 0x1.1f2e561b196b1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01106 0 OK 0x1.7b4b2f01843fp23 0x1.5e218e40fcfe4p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01107 0 OK 0x1.3719b80648599p25 0x1.1f2e561b196b1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01108 0 OK -0x1.3e4da8208c52ep20 -0x1.2d90b65307a96p23 -0x1.0ff697a05ep9 0x1.0000000000012p0 -0x1.0000000000029p0 0x1.8p-28 F +CSV proj4-epsg.csv:01109 0 OK -0x1.3e6f5affb7383p20 -0x1.2d8d43179beaep23 -0x1.c595216f6p7 0x1.fffffffffffebp-1 -0x1.fffffffffff73p-1 0x1.0p-30 F +CSV proj4-epsg.csv:01110 0 OK -0x1.3e7cbb866c671p20 -0x1.2d99eb04331a4p23 0x1.d511c49c76p9 0x1.fffff0f7659a7p-1 -0x1.fffffd24d1235p-1 0x1.f6cfbf8p-5 F +CSV proj4-epsg.csv:01111 0 OK -0x1.3e6f844e515eep20 -0x1.2d8d444692f8p23 -0x1.cb2864f73p7 0x1.fffffffffff8cp-1 -0x1.fffffffffffbcp-1 0x1.0p-28 F +CSV proj4-epsg.csv:01112 0 OK -0x1.2f3b97a5cf46cp22 0x1.2c7cd10d65cfdp23 0x1.5c4d18fb9p9 0x1.0000000000156p0 -0x1.fffffffffff34p-1 0x1.0p-29 T +CSV proj4-epsg.csv:01113 0 OK -0x1.f44992627a748p22 0x1.819c52a930bddp19 0x1.1ae13f46a6p10 0x1.000000000002fp0 -0x1.ffffffffe2ea6p-1 0x1.8p-29 T +CSV proj4-epsg.csv:01114 0 OK -0x1.f449849fd948cp22 0x1.81a79af758af5p19 0x1.13ff732ed4p10 0x1.ffffffffffffep-1 -0x1.ffffffffe2e85p-1 0x1.8p-29 T +CSV proj4-epsg.csv:01115 0 OK -0x1.f4471045a8294p22 0x1.818fad972ae81p19 0x1.4a3c631b3p10 0x1.ffffffffffffdp-1 -0x1.ffffffffe2e8dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01116 0 OK 0x1.2863169b3252dp19 -0x1.b45bb912176cdp16 -0x1.1ed6d55bp6 0x1.000000b3944b7p0 -0x1.00000002156f1p0 0x1.671fp-10 T +CSV proj4-epsg.csv:01117 0 OK 0x1.ce2a79fc5772cp19 -0x1.bd66e97f55b5cp16 -0x1.1ed6d55bp6 0x1.0000297f898a8p0 -0x1.ffffff4359c45p-1 0x1.66984p-10 T +CSV proj4-epsg.csv:01118 0 OK 0x1.4e4d92f06714p23 0x1.e17cdb670ff72p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000076p0 0x0.0p0 F +CSV proj4-epsg.csv:01119 0 OK -0x1.06127e1f9054p20 -0x1.bd110967f7482p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01120 0 OK -0x1.0826fa7766208p20 -0x1.b811e2b6774f6p16 0x0.0p0 0x1.0000065594951p0 -0x1.ffffffdd92f0ap-1 0x0.0p0 T +CSV proj4-epsg.csv:01121 0 OK -0x1.31caad0c3835fp20 -0x1.ba7d462df739bp16 0x0.0p0 0x1.000010e3480bep0 -0x1.ffffffa95f11bp-1 0x0.0p0 T +CSV proj4-epsg.csv:01122 0 OK -0x1.5bacd41b546aap20 -0x1.bd3ea00ce7adfp16 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc43p-1 0x0.0p0 T +CSV proj4-epsg.csv:01123 0 OK -0x1.85d5a901df724p20 -0x1.c0588d3cb7e96p16 0x0.0p0 0x1.00005e3d26664p0 -0x1.fffffe7210914p-1 0x0.0p0 T +CSV proj4-epsg.csv:01124 0 OK -0x1.b04da7d7b6f8p20 -0x1.c3ce0a59230ffp16 0x0.0p0 0x1.0000c9f442857p0 -0x1.fffffd19feb3p-1 0x0.0p0 T +CSV proj4-epsg.csv:01125 0 OK -0x1.46b36fe52b068p20 -0x1.bbd30caca5c69p16 0x0.0p0 0x1.00001aaf4d9fp0 -0x1.ffffff7c5af7fp-1 0x0.0p0 T +CSV proj4-epsg.csv:01126 0 OK -0x1.70b7e2bcad17cp20 -0x1.bec056c3129dp16 0x0.0p0 0x1.00003ef1f9e42p0 -0x1.fffffee6387fbp-1 0x0.0p0 T +CSV proj4-epsg.csv:01127 0 OK -0x1.9b073894906ep20 -0x1.c207a61705724p16 0x0.0p0 0x1.00008af145a0dp0 -0x1.fffffdda8864p-1 0x0.0p0 T +CSV proj4-epsg.csv:01128 0 OK -0x1.c5aa12321cabcp20 -0x1.c5ac29b2b972ep16 0x0.0p0 0x1.000121ad07d27p0 -0x1.fffffc2c48cbep-1 0x0.0p0 T +CSV proj4-epsg.csv:01129 0 OK -0x1.f0a960a9e4f28p20 -0x1.c9b17b4b3dee1p16 0x0.0p0 0x1.00023ebf9d71cp0 -0x1.fffff9ca62079p-1 0x0.0p0 T +CSV proj4-epsg.csv:01130 0 OK -0x1.0e07378ffd70cp21 -0x1.ce1ba7e82931ep16 0x0.0p0 0x1.0004440eba236p0 -0x1.fffff702d8324p-1 0x0.0p0 T +CSV proj4-epsg.csv:01131 0 OK -0x1.23f17693449aap21 -0x1.d2ef39bb12ebfp16 0x0.0p0 0x1.0007cd7e72dd9p0 -0x1.fffff50a7b341p-1 0x0.0p0 T +CSV proj4-epsg.csv:01132 0 OK 0x1.529424f36d614p18 -0x1.b92b5c42aff84p16 0x1.4fae6bb5a4p8 0x1.000003eae09aep0 -0x1.00000011b501fp0 0x1.0a045ep-7 T +CSV proj4-epsg.csv:01133 0 OK 0x1.6431576c5968p16 -0x1.bcb6025aae088p16 0x1.4fae6bb5a4p8 0x1.0000117e81eddp0 -0x1.ffffffdf6aefdp-1 0x1.0a0918p-7 T +CSV proj4-epsg.csv:01134 0 OK -0x1.4560e98c30358p17 -0x1.c103499b4ce59p16 0x1.4fae6bb5a4p8 0x1.000040ddc64ebp0 -0x1.ffffff177c68cp-1 0x1.0a194p-7 T +CSV proj4-epsg.csv:01135 0 OK -0x1.a1124668ae124p18 -0x1.c61c6cc477599p16 0x1.4fae6bb5a4p8 0x1.0000cf69cc516p0 -0x1.fffffd4308268p-1 0x1.0a4878p-7 T +CSV proj4-epsg.csv:01136 0 OK -0x1.514769c5cf498p19 -0x1.cc0ca111e0218p16 0x1.4fae6bb5a4p8 0x1.00024cc3f2717p0 -0x1.fffff9ec29b03p-1 0x1.0ac2b6p-7 T +CSV proj4-epsg.csv:01137 0 OK -0x1.d3d14aea1bd5cp19 -0x1.d2e15276160bp16 0x1.4fae6bb5a4p8 0x1.0005ec94c80bfp0 -0x1.fffff5fc35404p-1 0x1.0be0f6p-7 T +CSV proj4-epsg.csv:01138 0 OK 0x1.5265142471be4p18 -0x1.b705c432dfa0bp16 0x0.0p0 0x1.000003e37de1ap0 -0x1.ffffffea8dbaep-1 0x0.0p0 T +CSV proj4-epsg.csv:01139 0 OK 0x1.63732bd08d65p16 -0x1.ba8c23ab6b56ap16 0x0.0p0 0x1.0000117ad9d1bp0 -0x1.ffffffa6cc24cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01140 0 OK -0x1.45c11eefe81dp17 -0x1.bed4333ebe1e5p16 0x0.0p0 0x1.000040e594275p0 -0x1.fffffedf9730dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01141 0 OK -0x1.a14307d16883cp18 -0x1.c3e722879217cp16 0x0.0p0 0x1.0000cf90650dbp0 -0x1.fffffd0cd881dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01142 0 OK -0x1.51602a0555cep19 -0x1.c9d0192fde35p16 0x0.0p0 0x1.00024d34f3666p0 -0x1.fffff9b905e6p-1 0x0.0p0 T +CSV proj4-epsg.csv:01143 0 OK -0x1.d3ea77bebad4cp19 -0x1.d09c72e34730bp16 0x0.0p0 0x1.0005edaaea1c1p0 -0x1.fffff5cc2d313p-1 0x0.0p0 T +CSV proj4-epsg.csv:01144 0 OK 0x1.9e517c4480951p17 0x1.72e11e5c3c88dp23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01145 0 OK -0x1.4662d0211b19ap22 0x1.3c0978711818ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01146 0 OK -0x1.1ac950e26558cp22 0x1.7f1ae54c539ffp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01147 0 OK 0x1.40909242e436ep21 -0x1.ae171a897163ap21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01148 0 OK 0x1.873cdc24c08e2p21 -0x1.2589750c25cfep21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01149 0 OK -0x1.8e467b458dbc3p21 0x1.2d3174f8ea7bcp23 0x0.0p0 0x1.0000000000023p0 -0x1.0000000000008p0 0x0.0p0 T +CSV proj4-epsg.csv:01150 0 OK -0x1.f1feca377d1f6p21 0x1.2ce2fc884fbcp23 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffd7p-1 0x0.0p0 T +CSV proj4-epsg.csv:01151 0 OK 0x1.c987cee806a87p21 -0x1.e9730410feff1p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01152 0 OK 0x1.6f7fb7bbb4e97p21 -0x1.d1ea45ec0ec0ep16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01153 0 OK 0x1.193c2ea7d63c8p21 -0x1.c1475f306155p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01154 0 OK 0x1.8b18492d65bb8p20 -0x1.b676ab548e1c4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01155 0 OK 0x1.cd9e95e324977p19 -0x1.b0d1d521833a8p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:01156 0 OK 0x1.0eef90dd87bf6p18 -0x1.b005f8f714ee2p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01157 0 OK -0x1.7fc74dbaff74ep18 -0x1.b4079b49507e3p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01158 0 OK -0x1.06127e1f9054p20 -0x1.bd110967f7482p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01159 0 OK -0x1.b0a304adbef02p20 -0x1.cbaab330f32b8p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01160 0 OK -0x1.30f2bce56f83cp21 -0x1.e0bfd09accdfbp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:01161 0 OK -0x1.8e467b4591d3bp21 -0x1.fdc5838a882c1p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:01162 0 OK -0x1.f1feca3784c06p21 -0x1.1280ddebf625fp17 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffe2p-1 0x0.0p0 T +CSV proj4-epsg.csv:01163 0 OK -0x1.2f2c4670a1686p22 -0x1.2d0720eaad94cp17 0x0.0p0 0x1.0000000000108p0 -0x1.fffffffffff14p-1 0x0.0p0 T +CSV proj4-epsg.csv:01164 0 OK -0x1.6b3853a7eb662p22 -0x1.516c2c15e1775p17 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff6e5p-1 0x0.0p0 T +CSV proj4-epsg.csv:01165 0 OK 0x1.c98a40de15f6ap21 -0x1.e918848ce636bp16 -0x1.6886646d78p7 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:01166 0 OK 0x1.6f8141fc8fdf9p21 -0x1.d194091eec20cp16 -0x1.6886646d78p7 0x1.000000000000ep0 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:01167 0 OK 0x1.193cddf6b8856p21 -0x1.c0f42e6a1aeecp16 -0x1.6886646d78p7 0x1.0p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:01168 0 OK 0x1.fd357e39426c1p21 -0x1.d7fcfc3ba2aedp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01169 0 OK 0x1.0f9503e845af5p20 -0x1.e2f23ad93bf0fp22 -0x1.53d1366888p10 0x1.0000027beb0dp0 -0x1.fffffa20de23fp-1 0x1.ac87096p-3 T +CSV proj4-epsg.csv:01170 0 OK -0x1.0422a6da79db4p21 -0x1.758b48135fa7ep22 0x0.0p0 0x1.000a6af8f0b9cp0 -0x1.fffff5367ad6cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01171 0 OK -0x1.3e6f656116037p20 -0x1.2d8d431404222p23 -0x1.c8480a062p7 0x1.000000000000cp0 -0x1.000000000002cp0 0x1.0p-29 F +CSV proj4-epsg.csv:01172 0 OK 0x1.194620fcf156dp21 -0x1.c289521fd0d8p16 0x1.05862437ap8 0x1.000000000001p0 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:01173 0 OK 0x1.c986d41a691cbp21 -0x1.e9b18b5bedc2fp16 -0x1.7f2ae2ac6p5 0x1.000000000002p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:01174 0 OK 0x1.c985fdfa0fe49p21 -0x1.e949be59b6589p16 -0x1.28ae6b95ep7 0x1.000000000002ep0 -0x1.ffffffffffffbp-1 0x1.8p-29 T +CSV proj4-epsg.csv:01175 0 OK -0x1.7fc74dbaff08p18 -0x1.b4079b498da1fp16 0x0.0p0 0x1.fffffffffffe2p-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01176 0 OK -0x1.06127e1f8fc1cp20 -0x1.bd11096834577p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01177 0 OK -0x1.cff6d8293fdb8p21 -0x1.7ee65be7f4e9fp21 -0x1.48cc11fb48p7 0x1.025ab8adf940fp0 -0x1.0009a44ae546ap0 -0x1.f139b6p-7 T +CSV proj4-epsg.csv:01178 0 OK -0x1.30f2bce56f83cp21 -0x1.e0bfd09accdfbp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:01179 0 OK -0x1.4d50c998998a9p20 -0x1.68e7f774c6fddp22 0x1.a4d2328e3p6 0x1.ffffd7ad0452fp-1 -0x1.fffeb8c3400bep-1 0x1.fda4ep-11 T +CSV proj4-epsg.csv:01180 0 OK 0x1.5535c9fedeef8p23 -0x1.39c99ac6ef0bfp22 0x0.0p0 -0x1.488c123028ccep3 -0x1.b812420bc5576p1 0x0.0p0 T +CSV proj4-epsg.csv:01181 0 OK 0x1.5995f5682b8fcp23 -0x1.34e67d90fb8cep22 0x0.0p0 -0x1.b0b86ad87634p3 -0x1.1a2ff27284bc9p2 0x0.0p0 T +CSV proj4-epsg.csv:01182 0 OK 0x1.5e593225978fap23 -0x1.3496d95e9bfacp22 0x0.0p0 -0x1.1bc8bc66816cfp4 -0x1.7159f658fbc3bp2 0x0.0p0 T +CSV proj4-epsg.csv:01183 0 OK 0x1.5535c9fedeef8p23 -0x1.39c99ac6ef0bfp22 0x0.0p0 -0x1.488c123028ccep3 -0x1.b812420bc5576p1 0x0.0p0 T +CSV proj4-epsg.csv:01184 0 OK 0x1.5995f5682b8fcp23 -0x1.34e67d90fb8cep22 0x0.0p0 -0x1.b0b86ad87634p3 -0x1.1a2ff27284bc9p2 0x0.0p0 T +CSV proj4-epsg.csv:01185 0 OK 0x1.5e593225978fap23 -0x1.3496d95e9bfacp22 0x0.0p0 -0x1.1bc8bc66816cfp4 -0x1.7159f658fbc3bp2 0x0.0p0 T +CSV proj4-epsg.csv:01186 0 OK 0x1.8bf1a58805fd4p23 -0x1.1e2748372871fp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01187 0 OK 0x1.8bf1a58805fd4p23 -0x1.1e2748372871fp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01188 0 OK 0x1.3164b6c5376f3p25 0x1.103baab473e9bp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:01189 0 OK 0x1.76f2a50a293c5p23 0x1.5654413aa278ap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01190 0 OK 0x1.8636eec51e2dcp23 0x1.f9c5c60cd2258p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01191 0 OK 0x1.7e725580c2b0bp23 0x1.20546a7e5b01cp23 0x0.0p0 0x1.000000000004p0 -0x1.fffffffffff1fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01192 0 OK 0x1.8636eec51e2dcp23 0x1.f9c5c60cd2258p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01193 0 OK 0x1.7e725580c2b0bp23 0x1.20546a7e5b01cp23 0x0.0p0 0x1.000000000004p0 -0x1.fffffffffff1fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01194 0 OK 0x1.335f4d3df3dc7p23 0x1.8c60df1e0f873p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffef9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01195 0 OK 0x1.335f4d3df3dc7p23 0x1.8c60df1e0f873p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffef9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01196 0 OK 0x1.67c9ef2f4a499p23 0x1.9f22db8ce0168p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01197 0 OK 0x1.271a0e0c47f8dp25 0x1.547f861a31458p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01198 0 OK 0x1.67c9ef2f4a499p23 0x1.9f22db8ce0168p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01199 0 OK 0x1.271a0e0c47f8dp25 0x1.547f861a31458p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01200 0 OK -0x1.c871a0e89314ep22 -0x1.2dd9eb7e70b7fp24 0x1.bca31921dcp9 0x1.ffffffffdb291p-1 -0x1.ffffffffee08ep-1 0x1.0p-30 F +CSV proj4-epsg.csv:01201 0 OK -0x1.80ce07c128893p22 -0x1.2e4f30d5ca1f2p24 0x1.bca31921dcp9 0x1.fffffffffcf4dp-1 -0x1.fffffffffebeap-1 0x1.0p-30 F +CSV proj4-epsg.csv:01202 0 OK -0x1.425a9a9aa1d83p22 -0x1.2ea101ea4d953p24 0x1.bca31921dcp9 0x1.ffffffffffa48p-1 -0x1.ffffffffffe1p-1 0x1.0p-29 F +CSV proj4-epsg.csv:01203 0 OK -0x1.0a6f2c0d7bca1p22 -0x1.2edc27afe5bddp24 0x1.bca31921dcp9 0x1.ffffffffffec1p-1 -0x1.fffffffffffb1p-1 0x1.0p-29 F +CSV proj4-epsg.csv:01204 0 OK -0x1.ae92f170cdb7p21 -0x1.2f07c1908ccb7p24 0x1.bca31921dcp9 0x1.fffffffffffa5p-1 -0x1.fffffffffff76p-1 0x1.0p-29 F +CSV proj4-epsg.csv:01205 0 OK -0x1.c890b7bb2db4ap22 -0x1.2de7658c22b4p24 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:01206 0 OK -0x1.80e845425a8a2p22 -0x1.2e5c03112367ap24 0x0.0p0 0x1.fffffffffce5dp-1 -0x1.fffffffffeb3cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01207 0 OK -0x1.427128c7b0261p22 -0x1.2ead5dc94dda7p24 0x0.0p0 0x1.ffffffffffa3bp-1 -0x1.ffffffffffd95p-1 0x0.0p0 F +CSV proj4-epsg.csv:01208 0 OK -0x1.0a82c7b84020bp22 -0x1.2ee82d6f09443p24 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.fffffffffff64p-1 0x0.0p0 F +CSV proj4-epsg.csv:01209 0 OK -0x1.aeb543db2a3f4p21 -0x1.2f13879977c5fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01210 0 OK 0x1.c203f12d59afap25 -0x1.08f8913622e08p24 0x1.983ad326ep5 0x1.0000000000095p0 -0x1.ffffffffe0b03p-1 -0x1.0p-30 F +CSV proj4-epsg.csv:01211 0 OK 0x1.193d424538b61p21 -0x1.c13d4941234e5p16 0x0.0p0 0x1.0000000000015p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01212 0 OK 0x1.8b198e49fd413p20 -0x1.b66c823aeb8f4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01213 0 OK 0x1.cd9f920219cdep19 -0x1.b0c7a469a6578p16 0x0.0p0 0x1.0000000000003p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01214 0 EXC:java.lang.IllegalStateException -0x1.0b7be7f7915d2p24 -0x1.3c9d082955887p19 0x1.1c5fcb0262p9 NaN NaN NaN T +CSV proj4-epsg.csv:01215 0 OK -0x1.6f0797453720bp23 -0x1.c588e00cb82aap21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01216 0 OK 0x1.a17d782628c5p18 -0x1.52801ad0cd3c1p22 0x0.0p0 0x1.fffffffe2afbbp-1 -0x1.fffffffffd109p-1 0x0.0p0 T +CSV proj4-epsg.csv:01217 0 OK 0x1.7bfd4528073ddp18 -0x1.4f697bd62e896p22 0x0.0p0 0x1.fffffffedb19ep-1 -0x1.fffffffffe501p-1 0x0.0p0 T +CSV proj4-epsg.csv:01218 0 OK -0x1.371b311626132p23 -0x1.8aa952b1bcab4p21 0x1.8fb43d32ap6 0x1.fffffffe6fcb2p-1 -0x1.000000005e92fp0 0x1.3c3cp-15 F +CSV proj4-epsg.csv:01219 0 OK -0x1.371c00a0e512ep23 -0x1.3f66e03e6f51fp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01220 0 OK -0x1.95e10016e482fp23 -0x1.e218d0cd7b231p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01221 0 OK 0x1.d7db6af377152p23 0x1.1c98a285c091p15 0x0.0p0 -0x1.19d79aa3c2d57p7 -0x1.1404ee1b4aa8bp6 0x0.0p0 T +CSV proj4-epsg.csv:01222 0 OK 0x1.b58c96a6fc073p23 0x1.5d6130be63b08p16 0x0.0p0 -0x1.28547ebe4d633p6 -0x1.e92b1f1887645p4 0x0.0p0 T +CSV proj4-epsg.csv:01223 0 OK 0x1.9664355efbdfbp23 0x1.0618a79bf197cp17 0x0.0p0 -0x1.3907ad11f2928p5 -0x1.bfff5217f15ebp3 0x0.0p0 T +CSV proj4-epsg.csv:01224 0 OK 0x1.7a00a3f70a818p23 0x1.4fe626c65f85p17 0x0.0p0 -0x1.4a191d28e4dep4 -0x1.b100a35a14d9cp2 0x0.0p0 T +CSV proj4-epsg.csv:01225 0 OK 0x1.600b4b226db94p23 0x1.8e40f62e4f8f8p17 0x0.0p0 -0x1.57a8d13a21b25p3 -0x1.c9797ec59d56dp1 0x0.0p0 T +CSV proj4-epsg.csv:01226 0 OK -0x1.dd44d666add4p15 0x1.b1a1cf141e322p19 -0x1.5b505b13ep5 0x1.0000022652527p0 -0x1.fffffff3fd80dp-1 -0x1.9bp-22 T +CSV proj4-epsg.csv:01227 0 OK 0x1.c90bc95248e88p20 -0x1.b0695e2775e2p18 -0x1.0d9bb9fp7 0x1.ffffffffcc3c7p-1 -0x1.fffffffc58a1cp-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:01228 0 OK -0x1.775af4854b28ap20 -0x1.c650e3cc07137p16 0x0.0p0 0x1.000145c702948p0 -0x1.fffffbd2b0b92p-1 0x0.0p0 T +CSV proj4-epsg.csv:01229 0 OK -0x1.9405042273826p20 -0x1.c8ff0a34f342ap16 0x0.0p0 0x1.00020258d6b6ap0 -0x1.fffffa3b19089p-1 0x0.0p0 T +CSV proj4-epsg.csv:01230 0 OK -0x1.b0db9766d8346p20 -0x1.cbd9b0a4c169fp16 0x0.0p0 0x1.00031c451aaa8p0 -0x1.fffff867ab791p-1 0x0.0p0 T +CSV proj4-epsg.csv:01231 0 OK -0x1.cde18283e343cp20 -0x1.cee2228846a09p16 0x0.0p0 0x1.0004bab8aae39p0 -0x1.fffff692c65acp-1 0x0.0p0 T +CSV proj4-epsg.csv:01232 0 OK -0x1.eb19ae9102f22p20 -0x1.d219c51053ab5p16 0x0.0p0 0x1.000712adb6b42p0 -0x1.fffff53701049p-1 0x0.0p0 T +CSV proj4-epsg.csv:01233 0 OK -0x1.04438d83cbc17p21 -0x1.d58218b809ec2p16 0x0.0p0 0x1.000a6af8f0b8dp0 -0x1.fffff5367ad71p-1 0x0.0p0 T +CSV proj4-epsg.csv:01234 0 OK -0x1.13166fa7aa77fp21 -0x1.d91cbaeb4c9cp16 0x0.0p0 0x1.000f2154e06cdp0 -0x1.fffff814574e5p-1 0x0.0p0 T +CSV proj4-epsg.csv:01235 0 OK -0x1.2207162df08f1p21 -0x1.dceb67cf2c4f3p16 0x0.0p0 0x1.0015b0a0d0dap0 -0x1.00000023ab8cbp0 0x0.0p0 T +CSV proj4-epsg.csv:01236 0 OK -0x1.3117272e3b92ap21 -0x1.e0effc2e40f99p16 0x0.0p0 0x1.001eb8935127p0 -0x1.000008d765e74p0 0x0.0p0 T +CSV proj4-epsg.csv:01237 0 OK -0x1.4048573f2c1e5p21 -0x1.e52c778afce87p16 0x0.0p0 0x1.002b072cd72aep0 -0x1.0000191b1207bp0 0x0.0p0 T +CSV proj4-epsg.csv:01238 0 OK -0x1.4f9c6a61696cep21 -0x1.e9a2fe5a195efp16 0x0.0p0 0x1.003ba44649461p0 -0x1.0000355b9a1d4p0 0x0.0p0 T +CSV proj4-epsg.csv:01239 0 OK -0x1.5f1534f4d44cep21 -0x1.ee55dc6753c08p16 0x0.0p0 0x1.0051dfa997dccp0 -0x1.0000641837537p0 0x0.0p0 T +CSV proj4-epsg.csv:01240 0 OK -0x1.6eb49cb84dc16p21 -0x1.f3478766c86f7p16 0x0.0p0 0x1.006f6238d6135p0 -0x1.0000aeb565b22p0 0x0.0p0 T +CSV proj4-epsg.csv:01241 0 OK -0x1.2b5d63d4cc455p24 -0x1.375249102eadbp19 -0x1.12694012c4p8 -0x1.fdcb74b55d3edp0 -0x1.077528d2140cbp6 -0x1.5588f59b74p8 F +CSV proj4-epsg.csv:01242 0 OK 0x1.ad6d3642d7d48p15 -0x1.2db20d5c9dac8p23 -0x1.0700c32a5cp9 0x1.0000000000001p0 -0x1.00000000000a9p0 0x1.0p-30 F +CSV proj4-epsg.csv:01243 0 OK 0x1.6100defd63a54p19 -0x1.2db3a30542e0cp23 -0x1.0700c32a5cp9 0x1.0000000000001p0 -0x1.fffffffffff98p-1 0x1.0p-30 F +CSV proj4-epsg.csv:01244 0 OK 0x1.1780b8aa8eefap22 -0x1.c36fd22491db5p16 -0x1.043027ba18p7 0x1.0000c9d71c478p0 -0x1.fffffd1b08e1dp-1 0x1.7687p-14 T +CSV proj4-epsg.csv:01245 0 OK -0x1.5ad51d55c4419p20 -0x1.c36fd22491db5p16 -0x1.043027ba18p7 0x1.0000c9d71c46ap0 -0x1.fffffd1b08e1dp-1 0x1.7687p-14 T +CSV proj4-epsg.csv:01246 0 OK -0x1.8d150d74be3f9p23 -0x1.29ae0704fd4e1p24 0x1.4671848538p9 0x1.ffffe24c4aca5p-1 -0x1.ffffd5279d954p-1 -0x1.b79p-18 F +CSV proj4-epsg.csv:01247 0 OK -0x1.441fa86606199p23 -0x1.2c01aaa32a669p24 0x1.4671848538p9 0x1.ffffffac669e5p-1 -0x1.ffffffbc1b04ap-1 -0x1.c4p-24 F +CSV proj4-epsg.csv:01248 0 OK 0x1.1780e6c7f217cp22 -0x1.c37a66cb6ce85p16 -0x1.04653cf628p7 0x1.0000c9d49305ep0 -0x1.fffffd1b12015p-1 -0x1.a604p-16 T +CSV proj4-epsg.csv:01249 0 OK -0x1.5ad464e037a0ep20 -0x1.c37a66cb6ce85p16 -0x1.04653cf628p7 0x1.0000c9d49306dp0 -0x1.fffffd1b12015p-1 -0x1.a604p-16 T +CSV proj4-epsg.csv:01250 0 OK -0x1.be1b63f398756p20 -0x1.93d3e099b91c3p22 0x0.0p0 0x1.0000cfbdd8fd3p0 -0x1.fffffd0952977p-1 0x0.0p0 T +CSV proj4-epsg.csv:01251 0 OK 0x1.4e4d92f06714p23 0x1.e17cdb670ff72p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000076p0 0x0.0p0 F +CSV proj4-epsg.csv:01252 0 OK 0x1.3608651bc260ap22 -0x1.2ef81826f0f29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000025p0 0x0.0p0 F +CSV proj4-epsg.csv:01253 0 OK 0x1.6c354670a1686p22 -0x1.2ec30ba0f383bp24 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffeep-1 0x0.0p0 F +CSV proj4-epsg.csv:01254 0 OK 0x1.a84153a7eb669p22 -0x1.2e7a418a9d1bep24 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff776p-1 0x0.0p0 F +CSV proj4-epsg.csv:01255 0 OK 0x1.ec79008450956p22 -0x1.2e135c211531bp24 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8ca7p-1 0x0.0p0 F +CSV proj4-epsg.csv:01256 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:01257 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:01258 0 OK 0x1.610e85e7de874p23 0x1.8e4c4d6ba2f72p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01259 0 OK 0x1.610e85e7de874p23 0x1.8e4c4d6ba2f72p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01260 0 OK -0x1.df61c5031c457p23 -0x1.9d711b2f3ef28p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01261 0 OK -0x1.3e534275478dcp20 -0x1.2d8ad6c73bc56p23 0x1.bc8614de2p5 0x1.000000000002cp0 -0x1.fffffffffffd3p-1 0x1.0p-28 F +CSV proj4-epsg.csv:01262 0 OK -0x1.e7d40b10b3557p23 -0x1.bf74d46ada69fp22 -0x1.cb2864f73p7 0x1.fffffffffff8cp-1 -0x1.ffffffffe1bbap-1 0x1.0p-30 F +CSV proj4-epsg.csv:01263 0 OK -0x1.e7d3f7c2a959ap23 -0x1.bf752271ef8c1p22 -0x1.cb2864f73p7 0x1.fffffffffff8cp-1 -0x1.ffffffffe1c2bp-1 0x1.0p-30 F +CSV proj4-epsg.csv:01264 0 OK -0x1.398e09a42c1aep19 0x1.272e55e526a75p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe3b0ep-1 0x0.0p0 F +CSV proj4-epsg.csv:01265 0 OK -0x1.72e54fb538c46p23 0x1.73215889bcb1bp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe3b0ep-1 0x0.0p0 F +CSV proj4-epsg.csv:01266 0 OK -0x1.eadb6f7769d3ap20 -0x1.2d695f39b9a04p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000008p0 0x0.0p0 F +CSV proj4-epsg.csv:01267 0 OK -0x1.3e545d4fac78ep20 -0x1.2d8aa50730fb2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:01268 0 OK -0x1.2de8925acb76ep19 -0x1.2da0466ee8a18p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:01269 0 OK -0x1.2dd8394833b9ap19 -0x1.2da650e084838p23 -0x1.0ff697a05ep9 0x1.0000000000012p0 -0x1.fffffffffffdcp-1 0x1.8p-28 F +CSV proj4-epsg.csv:01270 0 OK 0x1.4583e85b88c41p23 0x1.cc7eb0b520e3p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff51p-1 0x0.0p0 F +CSV proj4-epsg.csv:01271 0 OK 0x1.43046c5f6f725p23 0x1.a932589e5cb6bp20 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffff51p-1 0x0.0p0 F +CSV proj4-epsg.csv:01272 0 OK -0x1.85c486e18a1bap19 -0x1.bfe05117feb28p16 -0x1.460daf518p5 0x1.00007a6ec4e7cp0 -0x1.fffffe0e5f0a5p-1 -0x1.c5fp-17 T +CSV proj4-epsg.csv:01273 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01274 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01275 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01276 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:01277 0 OK 0x1.bdf145425a89fp22 -0x1.608b68d2bba1p17 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb6ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01278 0 OK 0x1.7f7a28c7b0261p22 -0x1.37de0cbd82361p17 0x0.0p0 0x1.ffffffffffa74p-1 -0x1.ffffffffffe14p-1 0x0.0p0 T +CSV proj4-epsg.csv:01279 0 OK 0x1.478bc7b840209p22 -0x1.1a7639dfcd58ep17 0x0.0p0 0x1.fffffffffff28p-1 -0x1.fffffffffffc9p-1 0x0.0p0 T +CSV proj4-epsg.csv:01280 0 OK 0x1.1463a1ed951f6p22 -0x1.04c924a88c74bp17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff9p-1 0x0.0p0 T +CSV proj4-epsg.csv:01281 0 OK 0x1.c987cee806a87p21 -0x1.e9730410feff1p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01282 0 OK 0x1.6f7fb7bbb4e97p21 -0x1.d1ea45ec0ec0ep16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01283 0 OK 0x1.193c2ea7d63c8p21 -0x1.c1475f306155p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01284 0 OK 0x1.8b18492d65bb8p20 -0x1.b676ab548e1c4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01285 0 OK -0x1.527dbb8d9fed9p19 -0x1.b42c9336e800cp16 -0x1.460daf518p5 0x1.000000a4149eap0 -0x1.fffffffc79455p-1 -0x1.34p-24 T +CSV proj4-epsg.csv:01286 0 OK -0x1.c08d8e725a82cp19 -0x1.b69bcb70eb01ep16 -0x1.460daf518p5 0x1.0000031ffbcabp0 -0x1.ffffffee9b5b5p-1 -0x1.71p-22 T +CSV proj4-epsg.csv:01287 0 OK -0x1.17a63d2811b7fp20 -0x1.b99d7d0cde76fp16 -0x1.460daf518p5 0x1.00000c54ba1f1p0 -0x1.ffffffbf1d336p-1 -0x1.6ep-20 T +CSV proj4-epsg.csv:01288 0 OK -0x1.4f6ff7c90f044p20 -0x1.bd36a0d0827dcp16 -0x1.460daf518p5 0x1.0000296bebae3p0 -0x1.ffffff3bf8151p-1 -0x1.332p-18 T +CSV proj4-epsg.csv:01289 0 OK -0x1.87b75f29861a2p20 -0x1.c16d453920c88p16 -0x1.460daf518p5 0x1.00007a6ec4e7cp0 -0x1.fffffe0e5f0a5p-1 -0x1.c5fp-17 T +CSV proj4-epsg.csv:01290 0 OK -0x1.c090ae6ea1561p20 -0x1.c648a799fc9c9p16 -0x1.460daf518p5 0x1.00014619498ddp0 -0x1.fffffbcb51f2fp-1 -0x1.2e4cp-15 T +CSV proj4-epsg.csv:01291 0 OK -0x1.fa1119d33dba4p20 -0x1.cbd1529d1ffe2p16 -0x1.460daf518p5 0x1.00031ce158538p0 -0x1.fffff856d7c4ap-1 -0x1.7155p-14 T +CSV proj4-epsg.csv:01292 0 OK -0x1.1a277be405dfbp21 -0x1.d21142cd3f098p16 -0x1.460daf518p5 0x1.000713c289123p0 -0x1.fffff51321f5cp-1 -0x1.a3d28p-13 T +CSV proj4-epsg.csv:01293 0 OK -0x1.37b0f6cd181c6p21 -0x1.d91411e5a5b05p16 -0x1.460daf518p5 0x1.000f23221c73ep0 -0x1.fffff7cc188a2p-1 -0x1.c0f2p-12 T +CSV proj4-epsg.csv:01294 0 OK -0x1.7fb54e1650752p18 -0x1.b4057df10a25p16 -0x1.460daf518p5 0x1.ffffffffffff4p-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:01295 0 OK -0x1.f2624ea1b9b6p21 -0x1.814c23db6f056p20 0x1.166b8db108p7 0x1.ffffffffffff5p-1 -0x1.ffffffffdfdcdp-1 0x1.0p-30 F +CSV proj4-epsg.csv:01296 0 OK -0x1.060f8d56f5b4bp20 -0x1.bd0ebd5b87f2p16 -0x1.460daf518p5 0x1.000000000000fp0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:01297 0 OK -0x1.b0a1a1bf6d3a8p20 -0x1.cba838473a15p16 -0x1.460daf518p5 0x1.0000000000001p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:01298 0 OK -0x1.30f2d5d74839ap21 -0x1.e0bd26c634275p16 -0x1.460daf518p5 0x1.000000000002cp0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:01299 0 OK 0x1.2979b2776b749p23 0x1.632f479a6f8adp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01300 0 OK 0x1.03bed19216e9ap23 0x1.ca884762c9f6ep22 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01301 0 OK 0x1.aa502ac1fad6cp22 0x1.111ee6123bed6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01302 0 OK 0x1.e168d9b5dbd28p21 -0x1.489c714873a47p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01303 0 OK 0x1.32b550b621981p23 0x1.510bc50dcd912p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01304 0 OK 0x1.0d0f56ee78eep23 0x1.bf8e79b9a3853p22 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01305 0 OK -0x1.a9ae54b71c37ep22 0x1.15caf9e33a4aep23 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01306 0 OK -0x1.05c9a3df61c26p23 0x1.d07cd23b143c4p22 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01307 0 OK -0x1.2d2dc1d01d7e6p23 0x1.646f2386e416dp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01308 0 OK -0x1.499369f3d1715p23 0x1.d6bd4a0a85358p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01309 0 OK -0x1.59f13eadf17d9p23 0x1.a6daa793b259cp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01310 0 OK -0x1.5dae4eca7e184p23 -0x1.bcd30de3c85abp18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01311 0 OK -0x1.54a7aab587b23p23 -0x1.409a7d91ddb02p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01312 0 OK -0x1.3f31aaf347abbp23 -0x1.1ef34f28dc08p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01313 0 OK -0x1.1e14dbee037f5p23 -0x1.931fdfbde03bp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01314 0 OK -0x1.e50d57be8b4bdp22 -0x1.f8955066470cbp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01315 0 OK -0x1.7c3c3e7ae1ca9p22 -0x1.25cfc20bc41d5p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01316 0 OK 0x1.60635fa59b66ap23 -0x1.500394733c19dp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01317 0 OK 0x1.61cc4f7eaef13p23 0x1.bb8bbb87d9fafp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01318 0 OK 0x1.558bb99267faap23 0x1.817f78d3c9289p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01319 0 OK 0x1.3c1abd0d6371bp23 0x1.429c8eb1f0d7p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01320 0 OK 0x1.b3425b889770ap21 0x1.51c9cbe8effc2p23 0x0.0p0 0x1.ffffffffffffp-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01321 0 OK 0x1.45409e721afa9p20 0x1.608bc0dba361p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01322 0 OK -0x1.d1259d64b031fp19 0x1.61b090f3234d9p23 0x0.0p0 0x1.ffffffffffffp-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01323 0 OK -0x1.86b58c2466571p21 0x1.552ced8a87454p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01324 0 OK -0x1.4505a3adb52d9p22 0x1.3b7c8caa5505ep23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01325 0 OK -0x1.ba2373d0e80bap22 0x1.159d6211c6292p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01326 0 OK -0x1.0f17387390566p23 0x1.ca0ba1775f1abp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01327 0 OK -0x1.36a4cee3cf227p23 0x1.572c6ba187cb8p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01328 0 OK -0x1.52337b40632ap23 0x1.ae196fc9fe627p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01329 0 OK -0x1.60b2d18927d4ap23 0x1.3a7c71f63d9a1p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01330 0 OK -0x1.619380c790bcap23 -0x1.e6bdc33c6c07ep19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01331 0 OK -0x1.54ccdbd4c0a15p23 -0x1.8bea2a7e73535p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01332 0 OK -0x1.3add2f1f0e7b4p23 -0x1.476d82670a3d6p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01333 0 OK -0x1.14c4e01f10712p23 -0x1.bc4119d0b7f3cp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01334 0 OK -0x1.c7f90d65a70b1p22 -0x1.0ff679d10327fp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01335 0 OK -0x1.54ccc47fadc26p22 -0x1.374bdf98e22f8p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01336 0 OK -0x1.a8eee97af43f9p21 -0x1.529be7c0ccf5p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01337 0 OK 0x1.7ddf97b311b2cp22 -0x1.32212e1e70d2dp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01338 0 OK 0x1.115a0a4b29f37p23 -0x1.d6f5f1e934de7p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01339 0 OK 0x1.4b05acb9217cfp23 -0x1.1f078f7b52b21p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01340 0 OK 0x1.66ba4103294d5p23 -0x1.34766573225bcp20 0x0.0p0 0x1.0000000000079p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01341 0 OK 0x1.61f5bcda7d7efp23 0x1.178edae3fb844p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01342 0 OK 0x1.3d269c4beeb65p23 0x1.58053cc636cbep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01343 0 OK 0x1.46abb97d8f3ebp22 0x1.41b4527a9cd19p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01344 0 OK 0x1.e205e2323c4c7p20 0x1.63ba21d2981dbp23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01345 0 OK -0x1.8245749185cbap20 0x1.658c610d4b852p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01346 0 OK -0x1.30e659dd886efp22 0x1.4700db6ed9a4cp23 0x0.0p0 0x1.0000000000015p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01347 0 OK -0x1.e5a1a36d53f4dp22 0x1.0adb69540da77p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01348 0 OK -0x1.37337d85665bbp23 0x1.6d1bb968f631ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01349 0 OK -0x1.5f6a6f8876a13p23 0x1.46e753dddef0dp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01350 0 OK -0x1.67d1ba512f6bfp23 -0x1.a8019fd16be16p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01351 0 OK -0x1.4fa6a02ba67b8p23 -0x1.08a7d68038aa8p22 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01352 0 OK -0x1.191934048192p23 -0x1.c45a62ab7a4bbp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01353 0 OK -0x1.92334cb0fadecp22 -0x1.2b8d165ae87c8p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01354 0 OK -0x1.9b975451d2b91p21 -0x1.59cf3b5063bd8p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01355 0 OK 0x1.742a2ac3881afp21 -0x1.6334af3ede9ebp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01356 0 OK 0x1.c5b31c510ee69p22 -0x1.20bbc038a0feap23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01357 0 OK 0x1.4319608c1a2b7p23 -0x1.5ce94ab63c31p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01358 0 OK 0x1.6dda696dacdbap23 -0x1.f4b1d259b5e0ep19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01359 0 OK 0x1.5c087fb261e7bp23 0x1.d4333f5b1d59bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01360 0 OK 0x1.1096f34a628acp23 0x1.ec06f9c94af61p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01361 0 OK 0x1.3006fd7bda3ffp22 0x1.4e3eb36abd45p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01362 0 OK 0x1.91354aaf88fe8p17 0x1.6f22b445872cep23 0x0.0p0 0x1.0000000000001p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01363 0 OK -0x1.190714c5ced69p22 0x1.533d679b93979p23 0x0.0p0 0x1.0000000000015p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01364 0 OK -0x1.08082286a9e97p23 0x1.fe5a5cff5ea01p22 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01365 0 OK -0x1.57d58dcd0672cp23 0x1.01ba3de912511p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01366 0 OK -0x1.6eb550b53b65ep23 -0x1.2c8ec04569546p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01367 0 OK -0x1.48dde29fb9b3cp23 -0x1.46a582cd7f158p22 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01368 0 OK -0x1.d926685d51093p22 -0x1.18d2041504dc2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01369 0 OK -0x1.a4747c87f5b0cp21 -0x1.5fd2812451afep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01370 0 OK 0x1.6e53ce4517b68p21 -0x1.6f50906fbc408p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01371 0 OK 0x1.06f834a490933p23 -0x1.10501d1943ad1p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01372 0 OK 0x1.6be510aa899a9p23 -0x1.a1616f2caeb6p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01373 0 OK 0x1.6f50906fbc408p23 0x1.6e53ce4517b5bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01374 0 OK 0x1.10501d1943ad3p23 0x1.06f834a490931p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01375 0 OK 0x1.a1616f2caeb5dp21 0x1.6be510aa899a9p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01376 0 OK -0x1.6e53ce4517b5cp21 0x1.6f50906fbc408p23 0x0.0p0 0x1.fffffffffffe2p-1 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01377 0 OK -0x1.06f834a490931p23 0x1.10501d1943ad3p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01378 0 OK -0x1.6be510aa899a9p23 0x1.a1616f2caeb5dp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01379 0 OK -0x1.6f50906fbc408p23 -0x1.6e53ce4517b5ep21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01380 0 OK -0x1.10501d1943ad2p23 -0x1.06f834a490932p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01381 0 OK -0x1.a1616f2caeb5ep21 -0x1.6be510aa899a9p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01382 0 OK 0x1.6f0f015005e72p22 -0x1.4b187b7a4a39ap23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01383 0 OK 0x1.7a807b72d17e9p23 -0x1.a6d5669eef3acp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01384 0 OK 0x1.85f1f5959d161p22 0x1.447d25dfce7ccp23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01385 0 OK -0x1.6f0f015005e6fp22 0x1.4b187b7a4a39ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01386 0 OK -0x1.7a807b72d17e9p23 0x1.a6d5669eef3ep17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01387 0 OK -0x1.85f1f5959d15fp22 -0x1.447d25dfce7ccp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01388 0 OK 0x1.a6d5669eef3bbp17 0x1.7a807b72d17e9p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01389 0 OK -0x1.1914ca7df3f17p22 -0x1.7cb8541cf5551p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01390 0 OK 0x1.ab04b66092006p21 -0x1.2d4bb4bdcdeecp23 -0x1.092c66p-7 0x1.000000000004p0 -0x1.000000000035ep0 0x1.cp-28 F +CSV proj4-epsg.csv:01391 0 OK 0x1.042c3a2ec59bp22 -0x1.2d11a9624229p23 -0x1.092c66p-7 0x1.000000000004p0 -0x1.0000000000318p0 0x1.cp-28 F +CSV proj4-epsg.csv:01392 0 OK 0x1.36086164b1dp22 -0x1.2cc330ff91842p23 -0x1.092c66p-7 0x1.000000000004p0 -0x1.0000000000327p0 0x1.cp-28 F +CSV proj4-epsg.csv:01393 0 OK 0x1.6c35425ef6f4bp22 -0x1.2c59180675258p23 -0x1.092c66p-7 0x1.0000000000198p0 -0x1.00000000002b3p0 0x1.cp-28 F +CSV proj4-epsg.csv:01394 0 OK -0x1.a0ddcd27780edp21 -0x1.1702b726a9088p19 0x1.4bfa08p-5 0x1.0000000000048p0 -0x1.ffffffffe21e6p-1 0x1.0p-27 F +CSV proj4-epsg.csv:01395 0 OK -0x1.a0ddd6a466a0bp21 -0x1.1702b259338e8p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01396 0 OK 0x1.360cca284ed7dp22 -0x1.2cc7ffc1c5508p23 -0x1.81d42d5de8p9 0x1.ffffffba75537p-1 -0x1.0000000acc6c8p0 0x1.c9c8p-11 F +CSV proj4-epsg.csv:01397 0 OK 0x1.361a7467e450cp22 -0x1.2cc3d49e6860ap23 -0x1.b72ffa01afp10 0x1.00003449eb8a5p0 -0x1.0000076766f2fp0 0x1.8d51fe28p-1 F +CSV proj4-epsg.csv:01398 0 OK 0x1.0430d6d1a95aep22 -0x1.2d1496c44d5f6p23 -0x1.1097904dep9 0x1.ffffffdaaf341p-1 -0x1.0000000ccca84p0 0x1.a23fp-12 F +CSV proj4-epsg.csv:01399 0 OK 0x1.04309bee7b1f9p22 -0x1.2d1483a8d4044p23 -0x1.0a63a361bcp9 0x1.ffffffc221fc1p-1 -0x1.000000171ece9p0 0x1.45f06p-11 F +CSV proj4-epsg.csv:01400 0 OK 0x1.ab0b6987bf1a2p21 -0x1.2d5073ec3987ap23 -0x1.d50ab77a08p8 0x1.0000000000035p0 -0x1.0000000000056p0 0x1.0p-29 F +CSV proj4-epsg.csv:01401 0 OK -0x1.6b3852a1294a3p22 -0x1.516cb36048235p17 0x1.daa622p-7 0x1.0000000000b6dp0 -0x1.ffffffffff6ep-1 0x1.0p-30 T +CSV proj4-epsg.csv:01402 0 OK -0x1.e56b165925234p21 -0x1.625f4e6d14254p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01403 0 OK 0x1.6a547bd79d41ap23 0x1.1f8876045e01ep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000086p0 0x0.0p0 F +CSV proj4-epsg.csv:01404 0 OK 0x1.6a545534d1f91p23 0x1.1f881e6da9292p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff54p-1 0x0.0p0 F +CSV proj4-epsg.csv:01405 0 OK 0x1.6a545534d1f91p23 0x1.1f881e6da9292p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff54p-1 0x0.0p0 F +CSV proj4-epsg.csv:01406 0 OK 0x1.02cc7211c5d13p23 -0x1.9b418a7d7dd77p17 -0x1.0c7831636p6 0x1.ffffffffd931fp-1 -0x1.ffffffffed2dbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:01407 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:01408 0 OK -0x1.566074a8667b9p21 -0x1.94b68a6f96b9ap17 0x1.e17a4a5d4p4 0x1.0000000000013p0 -0x1.ffffffffe0eaap-1 0x1.8p-29 F +CSV proj4-epsg.csv:01409 0 OK -0x1.5eff20854f2a6p21 0x1.aa5e79a26a44cp19 0x1.e17a4a5d4p4 0x1.0015bb0609f43p0 -0x1.ffffff444ceddp-1 -0x1.7b74p-15 T +CSV proj4-epsg.csv:01410 0 OK -0x1.cdd59635b1b5p20 0x1.2d8f675b8f40ep23 0x0.0p0 0x1.0004bf8fb9a95p0 -0x1.fffff6309b579p-1 0x0.0p0 T +CSV proj4-epsg.csv:01411 0 OK -0x1.043d0a069facp21 0x1.2d82279fc4701p23 0x0.0p0 0x1.000a73cbc2e7ap0 -0x1.fffff46fd99d3p-1 0x0.0p0 T +CSV proj4-epsg.csv:01412 0 OK -0x1.655b5fab0609cp19 0x1.2dbd07120c436p23 0x0.0p0 0x1.0000066934bb7p0 -0x1.ffffffdcc8a2fp-1 0x0.0p0 T +CSV proj4-epsg.csv:01413 0 OK -0x1.d47dea7b775e6p19 0x1.2db66d8827004p23 0x0.0p0 0x1.0000172dead92p0 -0x1.ffffff8a81e0cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01414 0 OK -0x1.22441e134903dp20 0x1.2dae9f5448fdbp23 0x0.0p0 0x1.000048ad79493p0 -0x1.fffffebb6e6b7p-1 0x0.0p0 T +CSV proj4-epsg.csv:01415 0 OK -0x1.5ad0f79b9853dp20 0x1.2da58f30d877cp23 0x0.0p0 0x1.0000cb2af8abbp0 -0x1.fffffd0677d76p-1 0x0.0p0 T +CSV proj4-epsg.csv:01416 0 OK -0x1.93fa34e0d9facp20 0x1.2d9b2d5d5a79cp23 0x0.0p0 0x1.000204daccd0fp0 -0x1.fffffa0d99063p-1 0x0.0p0 T +CSV proj4-epsg.csv:01417 0 OK -0x1.cdd59635b1b5p20 0x1.2d8f675b8f40ep23 0x0.0p0 0x1.0004bf8fb9a95p0 -0x1.fffff6309b579p-1 0x0.0p0 T +CSV proj4-epsg.csv:01418 0 OK -0x1.043d0a069facp21 0x1.2d82279fc4701p23 0x0.0p0 0x1.000a73cbc2e7ap0 -0x1.fffff46fd99d3p-1 0x0.0p0 T +CSV proj4-epsg.csv:01419 0 OK -0x1.220006c5e3468p21 0x1.2d735532ccedep23 0x0.0p0 0x1.0015bff374061p0 -0x1.fffffecabc639p-1 0x0.0p0 T +CSV proj4-epsg.csv:01420 0 OK -0x1.4040bd9a1e177p21 0x1.2d62d343e1d47p23 0x0.0p0 0x1.002b20b1c804ep0 -0x1.000017bf1b4f4p0 0x0.0p0 T +CSV proj4-epsg.csv:01421 0 OK -0x1.5f0d130b7ff72p21 0x1.2d5080a88361bp23 0x0.0p0 0x1.005208a51e045p0 -0x1.000061b56d9a9p0 0x0.0p0 T +CSV proj4-epsg.csv:01422 0 OK -0x1.eff4c32a905cap20 -0x1.592444baa2a1fp22 -0x1.0d9bb9fp7 0x1.ffffffffcc3acp-1 -0x1.fffffffc58a9p-1 0x1.ba84p-14 T +CSV proj4-epsg.csv:01423 0 OK 0x1.df402627aa372p21 -0x1.bcf36c7b4c54bp16 -0x1.0d9bb9fp7 0x1.00002952d18dfp0 -0x1.ffffff39b7828p-1 0x1.9fdep-14 T +CSV proj4-epsg.csv:01424 0 OK 0x1.1780cdc0a524ap22 -0x1.c3819ad13fc81p16 -0x1.0d9bb9fp7 0x1.0000c9d5c22c4p0 -0x1.fffffd178bc3bp-1 0x1.3874p-14 T +CSV proj4-epsg.csv:01425 0 OK 0x1.3f0982c0bbb0bp22 -0x1.cb8bc29f0a9eap16 -0x1.0d9bb9fp7 0x1.00031bdd8e8aap0 -0x1.fffff86750b32p-1 -0x1.16c8p-16 T +CSV proj4-epsg.csv:01426 0 OK 0x1.662794130ba06p22 -0x1.d53263813930cp16 -0x1.0d9bb9fp7 0x1.000a69c7f67b4p0 -0x1.fffff53908033p-1 -0x1.3dadcp-12 T +CSV proj4-epsg.csv:01427 0 OK 0x1.d6384c4f546e4p20 -0x1.bcf36c7b4c54bp16 -0x1.0d9bb9fp7 0x1.00002952d18dfp0 -0x1.ffffff39b7828p-1 0x1.9fdep-14 T +CSV proj4-epsg.csv:01428 0 OK 0x1.0fdd058177616p21 -0x1.cb8bc29f0a9eap16 -0x1.0d9bb9fp7 0x1.00031bdd8e8aap0 -0x1.fffff86750b32p-1 -0x1.16c8p-16 T +CSV proj4-epsg.csv:01429 0 OK 0x1.314575c7d7f96p21 -0x1.e09e2f64c1241p16 -0x1.0d9bb9fp7 0x1.001eb56f2272ap0 -0x1.000008d747663p0 -0x1.1f9abp-10 T +CSV proj4-epsg.csv:01430 0 OK -0x1.30e5bb8c82d41p23 0x1.27f949a30f2f8p23 -0x1.86dd183bep8 0x1.0000000d10e4ap0 -0x1.ffffffed35582p-1 -0x1.8p-28 T +CSV proj4-epsg.csv:01431 0 OK -0x1.50b80085ec42p22 0x1.f2ab7f6da96b7p20 0x1.4331e17baep9 0x1.fffffffffff98p-1 -0x1.ffffffffe02bfp-1 0x1.0p-29 F +CSV proj4-epsg.csv:01432 0 OK 0x1.b1a649a83f5c2p22 0x1.61fe6663bc98dp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000009fp0 0x0.0p0 F +CSV proj4-epsg.csv:01433 0 OK -0x1.654780a877e4ap19 0x1.2dbe4a66970e3p23 -0x1.02ccccb76p5 0x1.00000667aa0cbp0 -0x1.ffffffdcdf0d4p-1 -0x1.1bp-20 T +CSV proj4-epsg.csv:01434 0 OK -0x1.d469e8a645e1cp19 0x1.2db7b37d97b5ap23 -0x1.02ccccb76p5 0x1.000017290060ep0 -0x1.ffffff8ac839cp-1 -0x1.ff6p-19 T +CSV proj4-epsg.csv:01435 0 OK -0x1.223a08529dffep20 0x1.2dafe85dc74ccp23 -0x1.02ccccb76p5 0x1.0000489fb2d0fp0 -0x1.fffffebc2725fp-1 -0x1.905p-17 T +CSV proj4-epsg.csv:01436 0 OK -0x1.060a4baad21eep20 0x1.2db439810bb94p23 -0x1.02ccccb76p5 0x1.fffffffffffe4p-1 -0x1.0000000000001p0 0x1.0p-30 T +CSV proj4-epsg.csv:01437 0 OK 0x1.193c2ea7d63c8p21 -0x1.c1475f306155p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01438 0 OK 0x1.8b18492d65bb8p20 -0x1.b676ab548e1c4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01439 0 OK 0x1.cd9e95e324977p19 -0x1.b0d1d521833a8p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:01440 0 OK -0x1.04331a2f22ce5p21 -0x1.d56a0ec7f9f23p16 0x0.0p0 0x1.000a6af8f0b9cp0 -0x1.fffff5367ad71p-1 0x0.0p0 T +CSV proj4-epsg.csv:01441 0 OK 0x1.0bbbce0639b68p24 0x1.26430559a2af6p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01442 0 OK 0x1.0bbbce0639b68p24 0x1.26430559a2af6p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01443 0 OK 0x1.007d1b1c1ad31p24 -0x1.aff3f718c83c2p16 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01444 0 OK -0x1.04b84f5952384p21 -0x1.f98b2988ca404p16 -0x1.043027ba18p7 0x1.0004a18b9c95bp0 -0x1.fffff6ac1b853p-1 -0x1.d522p-15 T +CSV proj4-epsg.csv:01445 0 OK -0x1.6d8ffd2e6c8c2p20 -0x1.01de08825a75ep17 -0x1.043027ba18p7 0x1.000ed95ebeeb2p0 -0x1.fffff7d91794fp-1 -0x1.cec4p-12 T +CSV proj4-epsg.csv:01446 0 OK -0x1.a78ca59035324p19 -0x1.07e07400ead95p17 -0x1.043027ba18p7 0x1.002a4de869dbap0 -0x1.0000180675ab4p0 -0x1.8291ap-10 T +CSV proj4-epsg.csv:01447 0 OK -0x1.7fd01c70de09ap18 0x1.2dc4ee4baea11p23 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffffe7p-1 0x0.0p0 T +CSV proj4-epsg.csv:01448 0 OK -0x1.7fd01c70de09ap18 0x1.2dc4ee4baea11p23 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffffe7p-1 0x0.0p0 T +CSV proj4-epsg.csv:01449 0 OK -0x1.60b018b5ffd61p21 -0x1.420487015b89fp21 0x1.451575a9cp6 0x1.006f6b5f560a2p0 -0x1.0000aed4449f4p0 0x1.bfcd4p-9 T +CSV proj4-epsg.csv:01450 0 OK 0x1.37a9f52baa452p23 -0x1.13d271129e1c2p14 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01451 0 OK 0x1.ff4279fdb86d2p24 -0x1.c476c6ecd1a5p15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01452 0 OK 0x1.3b8c644d42174p23 0x1.9c6a5d24c256ep17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01453 0 OK 0x1.02d0e20efd6e7p25 0x1.52446d5239449p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01454 0 OK 0x1.3bf29e9fc4c02p23 -0x1.a247f1cb11a1dp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01455 0 OK 0x1.0324994060787p25 -0x1.5713dce17dfbap19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01456 0 OK 0x1.3a95771a16649p23 -0x1.aeb07ce58fc44p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01457 0 OK 0x1.0206382446f44p25 -0x1.61414a48058bep19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01458 0 OK -0x1.7f41c760b375ep23 -0x1.7e677a89e52b7p21 0x0.0p0 0x1.5c9191022016ap-1 0x1.e762d59794ce1p0 0x0.0p0 F +CSV proj4-epsg.csv:01459 0 OK 0x1.193d424538b61p21 -0x1.c13d4941234e5p16 0x0.0p0 0x1.0000000000015p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01460 0 OK 0x1.8b198e49fd413p20 -0x1.b66c823aeb8f4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01461 0 OK 0x1.cd9f920219cdep19 -0x1.b0c7a469a6578p16 0x0.0p0 0x1.0000000000003p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01462 0 OK -0x1.2dea260aa1a44p19 -0x1.2f660ef22db12p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff97p-1 0x0.0p0 F +CSV proj4-epsg.csv:01463 0 OK 0x1.aa8cdfee1aea8p15 -0x1.2f6bb3cd294a2p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff56p-1 0x0.0p0 F +CSV proj4-epsg.csv:01464 0 OK -0x1.2de8925acb76ep19 -0x1.2f66a3377450cp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:01465 0 OK 0x1.aa96a1cdb6738p15 -0x1.2f6c480da75bap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffa1p-1 0x0.0p0 F +CSV proj4-epsg.csv:01466 0 OK 0x1.8b1b0c0b93bd3p20 -0x1.b677f0a7e83d7p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01467 0 OK -0x1.72f0f649f5955p23 0x1.73329daae85d2p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01468 0 OK 0x1.2a25c04361b4p24 0x1.2b2030461c294p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01469 0 OK -0x1.5c62427760f34p23 -0x1.6fa2c37c3b047p19 0x0.0p0 0x1.d8310472871dcp-1 0x1.a82afadf9952cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01470 0 OK -0x1.56e1b06a8f677p23 -0x1.8b55e10cd7fdp19 0x0.0p0 0x1.df5208dd6ed5p-1 0x1.68bfcd7a03944p-1 0x0.0p0 F +CSV proj4-epsg.csv:01471 0 OK -0x1.588e356ccdd2cp23 -0x1.c32cb3b92e8fap19 0x0.0p0 0x1.dd863a16b0793p-1 0x1.79a3fa994abe3p-1 0x0.0p0 F +CSV proj4-epsg.csv:01472 0 OK -0x1.5610e90a0d125p23 -0x1.a04dbe95fc8e1p19 0x0.0p0 0x1.e1d353108ad85p-1 0x1.4ffb4a4b99adep-1 0x0.0p0 F +CSV proj4-epsg.csv:01473 0 OK -0x1.5a1e4bcf19bcap23 -0x1.0515f83771fd1p20 0x0.0p0 0x1.da1368dd58252p-1 0x1.984bcb3921284p-1 0x0.0p0 F +CSV proj4-epsg.csv:01474 0 OK -0x1.51740d29dc419p23 -0x1.09bef235e5e99p20 0x0.0p0 0x1.e5d462424c658p-1 0x1.24f4b8c49a59dp-1 0x0.0p0 F +CSV proj4-epsg.csv:01475 0 OK -0x1.5271e4505c63bp23 -0x1.1946517d77efap20 0x0.0p0 0x1.e4c45caec185ap-1 0x1.30d5545e609bp-1 0x0.0p0 F +CSV proj4-epsg.csv:01476 0 OK -0x1.530da9f9985d9p23 -0x1.b6bc16a448aa9p19 0x0.0p0 0x1.e41825d50b267p-1 0x1.382c3f9a64e8cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01477 0 OK -0x1.57adbdcfb4576p23 -0x1.1c4b79c9c7d58p20 0x0.0p0 0x1.dddd7492c1bb3p-1 0x1.767ceb6dab3fap-1 0x0.0p0 F +CSV proj4-epsg.csv:01478 0 OK -0x1.5ad79621df82bp20 -0x1.c3488b4732d26p16 -0x1.4a55854f4p7 0x1.0000ca22f5fd4p0 -0x1.fffffccb043e9p-1 0x1.fe73p-13 T +CSV proj4-epsg.csv:01479 0 OK 0x1.a7d4b3393669ep20 -0x1.fd5b136dc20c6p16 -0x1.4a55854f4p7 0x1.00c9244978e29p0 -0x1.0001cf35bf8b2p0 -0x1.0691bcp-8 T +CSV proj4-epsg.csv:01480 0 OK -0x1.53b801d3f7638p22 -0x1.af9a8008123ccp16 -0x1.043027ba18p7 0x1.0000000004374p0 -0x1.ffffffffce71fp-1 0x1.f3cbp-14 T +CSV proj4-epsg.csv:01481 0 OK -0x1.f1f5482015a02p21 -0x1.132952184c6c5p17 -0x1.5918527bfp7 0x1.0000000000034p0 -0x1.fffffffffffdcp-1 0x1.0p-30 T +CSV proj4-epsg.csv:01482 0 OK -0x1.2f27ae6b708dep22 -0x1.2dc079d30a0b3p17 -0x1.5918527bfp7 0x1.0000000000152p0 -0x1.ffffffffffef2p-1 0x1.0p-30 T +CSV proj4-epsg.csv:01483 0 OK -0x1.6b3413b256d44p22 -0x1.523d3c2621ab3p17 -0x1.5918527bfp7 0x1.0000000000c82p0 -0x1.ffffffffff5c3p-1 0x1.8p-29 T +CSV proj4-epsg.csv:01484 0 OK -0x1.f2628edc8dbfcp21 -0x1.8149dbdb22c2ep20 0x1.162eb874ap7 0x1.ffffffffffff9p-1 -0x1.ffffffffdfd87p-1 0x1.0p-30 F +CSV proj4-epsg.csv:01485 0 OK 0x1.b2d77da4a0c31p16 -0x1.aff3f718c83c2p16 0x0.0p0 0x1.0p0 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01486 0 OK 0x1.3e35291e0ea73p21 -0x1.b4298c06f7d32p16 0x0.0p0 0x1.000000a2efc74p0 -0x1.fffffffc8211dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01487 0 OK 0x1.8ef27b48c5224p21 -0x1.b8070b06fb9dbp16 0x0.0p0 0x1.00000651ff0b3p0 -0x1.ffffffddb7deep-1 0x0.0p0 T +CSV proj4-epsg.csv:01488 0 OK 0x1.8ef27b48c5224p21 -0x1.b8070b06fb9dbp16 0x0.0p0 0x1.00000651ff0b3p0 -0x1.ffffffddb7deep-1 0x0.0p0 T +CSV proj4-epsg.csv:01489 0 OK 0x1.df42cd4f52482p21 -0x1.bd33a0827db83p16 0x0.0p0 0x1.0000294a05d84p0 -0x1.ffffff3de1984p-1 0x0.0p0 T +CSV proj4-epsg.csv:01490 0 OK 0x1.ff4236fab144ep24 -0x1.c4768b9ea5b6cp15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01491 0 OK -0x1.8d4f1a9425aefp23 -0x1.29bc4fc6fc3dcp24 0x1.79f31ab4e8p7 0x1.ffffe00a4efa4p-1 -0x1.ffffd230381a4p-1 -0x1.162p-19 F +CSV proj4-epsg.csv:01492 0 OK -0x1.4445f9bceaa7fp23 -0x1.2c0f28d552ccp24 0x1.79f31ab4e8p7 0x1.ffffffa68ae36p-1 -0x1.ffffffb7b1525p-1 0x1.cp-25 F +CSV proj4-epsg.csv:01493 0 OK -0x1.3a5a9f383184p25 -0x1.39a79181800cap23 0x0.0p0 0x1.5c919102200f8p-1 0x1.e762d59794cdap0 0x0.0p0 F +CSV proj4-epsg.csv:01494 0 OK 0x1.35cca49e1f818p17 -0x1.155194776b8f2p23 0x0.0p0 0x1.0p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:01495 0 OK 0x1.307062eeb0d7bp17 0x1.1085325bc6e68p23 0x0.0p0 0x1.ffffffffffffdp-1 -0x1.ffffffffffeb5p-1 0x0.0p0 T +CSV proj4-epsg.csv:01496 0 OK 0x1.782d13d4bdd05p16 -0x1.f58aeaf722622p16 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01497 0 OK 0x1.136c39f3ea91dp23 -0x1.09f900b3e3d8p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01498 0 OK 0x1.9d16629d2d9afp17 0x1.71c70e0b6f7fap23 0x0.0p0 0x1.0p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01499 0 OK 0x1.136ab471e1211p23 -0x1.09f7888f29f62p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01500 0 OK -0x1.6b0dd02777395p23 0x1.3b97d450330a7p21 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffc010cp-1 0x1.a08p-14 F +CSV proj4-epsg.csv:01501 0 OK -0x1.67a972df9c3e8p20 -0x1.4ca164df0b598p22 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01502 0 OK 0x1.38ba73dd0812bp25 0x1.0f3802c07e98fp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01503 0 OK 0x1.1eddd32d1cc42p25 0x1.4cc218b014bdcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01504 0 OK 0x1.22e521cae923cp25 0x1.a6c214382b0c9p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01505 0 OK 0x1.235ec1b9ee645p25 0x1.fd40ce09a9815p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01506 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01507 0 OK 0x1.38ba73dd0812bp25 0x1.0f3802c07e98fp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01508 0 OK 0x1.1eddd32d1cc42p25 0x1.4cc218b014bdcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01509 0 OK 0x1.22e521cae923cp25 0x1.a6c214382b0c9p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01510 0 OK 0x1.235ec1b9ee645p25 0x1.fd40ce09a9815p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01511 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01512 0 OK 0x1.16a3926cd0a5ep25 0x1.04089d119b6acp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01513 0 OK 0x1.15dc8b3775529p25 0x1.4c545818fe40ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01514 0 OK 0x1.cf4cfee80eb95p25 -0x1.d83d26330fd4fp23 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:01515 0 OK 0x1.28eab8092ed57p25 -0x1.f7fde2903dbd1p23 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db827p2 0x0.0p0 T +CSV proj4-epsg.csv:01516 0 OK 0x1.22a9f4e937e96p25 -0x1.e80d846972ba1p23 0x0.0p0 -0x1.6965a34d8a5b1p4 -0x1.dd93f429dc62ep2 0x0.0p0 T +CSV proj4-epsg.csv:01517 0 OK -0x1.6b3d2cfaab211p22 -0x1.5227f57414239p17 -0x1.f0f920208p4 0x1.ffffffea82e2cp-1 -0x1.ffffffa0377ap-1 0x1.657dcap-7 T +CSV proj4-epsg.csv:01518 0 OK -0x1.af76fd1f7434fp22 -0x1.85bbe3f01ff7ep17 -0x1.f0f920208p4 0x1.ffffffea92fcbp-1 -0x1.ffffffa02ffb5p-1 0x1.657dccp-7 T +CSV proj4-epsg.csv:01519 0 OK 0x1.16a3926cd0a5ep25 0x1.04089d119b6acp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01520 0 OK 0x1.15dc8b3775529p25 0x1.4c545818fe40ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01521 0 OK 0x1.cf4cfee80eb95p25 -0x1.d83d26330fd4fp23 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:01522 0 OK 0x1.28eab8092ed57p25 -0x1.f7fde2903dbd1p23 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db827p2 0x0.0p0 T +CSV proj4-epsg.csv:01523 0 OK 0x1.22a9f4e937e96p25 -0x1.e80d846972ba1p23 0x0.0p0 -0x1.6965a34d8a5b1p4 -0x1.dd93f429dc62ep2 0x0.0p0 T +CSV proj4-epsg.csv:01524 0 OK -0x1.72df9996c8566p18 -0x1.8109413bc80a2p22 0x0.0p0 0x1.ffffffffffff7p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01525 0 OK 0x1.2647a884713c8p23 0x1.8f3550dd3498ap18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01526 0 OK 0x1.abd2139d90ab2p23 -0x1.d8abd2214c5a3p18 0x0.0p0 0x1.ffffe018e869bp-1 -0x1.ffffd22d1a66p-1 0x0.0p0 T +CSV proj4-epsg.csv:01527 0 OK 0x1.24f41ac6f644fp25 0x1.f1929820754bbp21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01528 0 OK 0x1.2198029dc9d6fp25 0x1.ae52d62b509bep21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01529 0 OK 0x1.2055365f50179p25 0x1.869ac27a6eadbp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:01530 0 OK 0x1.2c4bcb8a4633ep25 0x1.0bfd9ac9ef203p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01531 0 OK 0x1.2c4bcb8a4633ep25 0x1.0bfd9ac9ef203p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01532 0 OK 0x1.24f41ac6f644fp25 0x1.f1929820754bbp21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01533 0 OK 0x1.2198029dc9d6fp25 0x1.ae52d62b509bep21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01534 0 OK 0x1.2c3b4192d60d8p25 0x1.0de8b19fc70eap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01535 0 OK 0x1.2c4bcb8a4633ep25 0x1.0bfd9ac9ef203p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01536 0 OK 0x1.193bfce34fcb6p21 -0x1.c1c9320fdc76ep16 -0x1.b9963adf8p4 0x1.ffffffffffffp-1 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:01537 0 OK 0x1.8b17175140c51p20 -0x1.b6f520662c79ap16 -0x1.b9963adf8p4 0x1.0000000000006p0 -0x1.0p0 0x1.0p-29 T +CSV proj4-epsg.csv:01538 0 OK 0x1.5995f5682b8fcp23 -0x1.384a6c5732035p22 0x0.0p0 -0x1.b0b86ad87634p3 -0x1.1a2ff27284bc9p2 0x0.0p0 T +CSV proj4-epsg.csv:01539 0 OK 0x1.5995f5682b8fcp23 -0x1.384a6c5732035p22 0x0.0p0 -0x1.b0b86ad87634p3 -0x1.1a2ff27284bc9p2 0x0.0p0 T +CSV proj4-epsg.csv:01540 0 OK 0x1.05d6efba110a7p24 -0x1.e38f0fb2eeb2ep21 0x0.0p0 0x1.78aaaaaaaaaa9p6 -0x1.5d381d52f85d1p8 0x0.0p0 T +CSV proj4-epsg.csv:01541 0 OK 0x1.1874bf12da2efp24 -0x1.e2713ad6a21cp21 0x0.0p0 0x1.72p6 -0x1.1a9b871f523f5p9 0x0.0p0 T +CSV proj4-epsg.csv:01542 0 OK 0x1.b1a649a83f5c2p22 0x1.61fe6663bc98dp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000009fp0 0x0.0p0 F +CSV proj4-epsg.csv:01543 0 OK -0x1.52da39f041974p21 0x1.520e32d4ea287p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01544 0 OK 0x1.fc5834de3a8b6p22 0x1.aecfabf47dfacp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01545 0 OK 0x1.53b7a0614cb41p23 0x1.3d089dafa38a1p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01546 0 OK 0x1.16a3926cd0a5ep25 0x1.04089d119b6acp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01547 0 OK 0x1.52c4f88ae2f39p23 0x1.952d4945767a9p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01548 0 OK 0x1.15dc8b3775529p25 0x1.4c545818fe40ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01549 0 OK 0x1.6a545534d1f91p23 0x1.1f881e6da9292p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff54p-1 0x0.0p0 F +CSV proj4-epsg.csv:01550 0 OK 0x1.b30648786fb7dp23 0x1.6d984477b3a64p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01551 0 OK 0x1.64cf8dae5879cp25 0x1.2bdd285f10d29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01552 0 OK 0x1.b63cf39a83ab7p23 0x1.616a989bf8p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01553 0 OK 0x1.6772502037741p25 0x1.21e004881e6e5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01554 0 OK 0x1.b704ed5565bb6p23 0x1.4b140364636b1p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01555 0 OK 0x1.681655a65a5d7p25 0x1.0f8d969f627bbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01556 0 OK 0x1.b6f205de9ceadp23 0x1.37fbd09973042p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01557 0 OK 0x1.6806d447f70abp25 0x1.ffc87e9e0657p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01558 0 OK 0x1.b826f46eb2a9fp23 0x1.23bf98c7f0e14p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01559 0 OK 0x1.690437bd2f474p25 0x1.de96c7518b356p23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01560 0 OK 0x1.b71163ebb0895p23 0x1.0d1ef10799bdep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01561 0 OK 0x1.68208e988ea75p25 0x1.b978690b09eb3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01562 0 OK 0x1.7fdf27bfa7bddp23 0x1.9e265778ceebap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01563 0 OK 0x1.3adad20ac1bbap25 0x1.53b0687deaab6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01564 0 OK 0x1.7f9fabc39ec8dp23 0x1.a30b5135da228p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01565 0 OK 0x1.3aa6c00765443p25 0x1.57b41bf15866bp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01566 0 OK 0x1.802bf2d15954p23 0x1.920787366d41p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01567 0 OK 0x1.3b19ce93077f7p25 0x1.49bf746556307p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01568 0 OK 0x1.254361aa903efp23 -0x1.49e5c14724ef8p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01569 0 OK 0x1.e112e8369f726p24 -0x1.0e95ac72b8ed5p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01570 0 OK 0x1.8b85201b6f4bap23 -0x1.17ca73ead35e1p22 0x0.0p0 -0x1.a021277f890b6p5 -0x1.3bd38f3541789p4 0x0.0p0 T +CSV proj4-epsg.csv:01571 0 OK 0x1.4468a8413627ep25 -0x1.caf93a196cdd7p23 0x0.0p0 -0x1.a021277f890b4p5 -0x1.3bd38f354177fp4 0x0.0p0 T +CSV proj4-epsg.csv:01572 0 OK 0x1.caaa0d8f3a765p23 -0x1.826b7d98b9784p21 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9d03p6 0x0.0p0 T +CSV proj4-epsg.csv:01573 0 OK 0x1.783343f9a05e4p25 -0x1.3cf1df1195fdcp23 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:01574 0 OK 0x1.335f4d3df3dc7p23 0x1.8c60df1e0f873p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffef9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01575 0 OK 0x1.41faf44fb3893p23 0x1.a1c1b331a60e4p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01576 0 OK 0x1.0817465c09d15p25 0x1.56a5c11c150ep20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01577 0 OK 0x1.d7410067f197dp23 -0x1.84f5f9ea4cb3cp21 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee06p6 0x0.0p0 T +CSV proj4-epsg.csv:01578 0 OK 0x1.8286c13d67a3fp25 -0x1.3f0767b3dac0bp23 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee0dp6 0x0.0p0 T +CSV proj4-epsg.csv:01579 0 OK 0x1.d95fd49418ec4p23 -0x1.d205f2c4df9a6p21 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:01580 0 OK 0x1.8443fccfe9d1bp25 -0x1.7e3c73c2dd298p23 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:01581 0 OK 0x1.01a2e06e6ddfep24 -0x1.d79b6bfc52996p21 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b19p7 0x0.0p0 T +CSV proj4-epsg.csv:01582 0 OK 0x1.a6a17a9d36c22p25 -0x1.82d0eb13cf7bap23 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b0bp7 0x0.0p0 T +CSV proj4-epsg.csv:01583 0 OK 0x1.1a6dbffff8542p24 -0x1.1fe09c74b2f92p22 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:01584 0 OK 0x1.cf4cfee80eb95p25 -0x1.d83d26330fd4fp23 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:01585 0 OK 0x1.031a5391336ffp24 -0x1.11a4a7ac3eb6dp22 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:01586 0 OK 0x1.a9095f7c1ee5ap25 -0x1.c0e38af282c85p23 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:01587 0 OK 0x1.19d819f8cba2cp24 -0x1.1402adf4721cep22 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:01588 0 OK 0x1.ce57827f7cfb6p25 -0x1.c4c5aceeb5d16p23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:01589 0 OK 0x1.7d4775ead306cp23 0x1.4aabad43674c4p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01590 0 OK 0x1.38ba73dd0812bp25 0x1.0f3802c07e98fp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01591 0 OK 0x1.5dbf93402a1p23 0x1.95b318b3d3521p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01592 0 OK 0x1.1eddd32d1cc42p25 0x1.4cc218b014bdcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01593 0 OK 0x1.62a8f283c8118p23 0x1.01b6bfec23dd9p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01594 0 OK 0x1.22e521cae923cp25 0x1.a6c214382b0c9p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01595 0 OK 0x1.633d3b8562244p23 0x1.3670fb7cd7093p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01596 0 OK 0x1.235ec1b9ee645p25 0x1.fd40ce09a9815p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01597 0 OK 0x1.461ce529f0f3ep23 0x1.d30c3aa1c69e9p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01598 0 OK 0x1.0b7b01b8e583cp25 0x1.7f1393b791e5ap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01599 0 OK 0x1.67c9ef2f4a499p23 0x1.9f22db8ce0168p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01600 0 OK 0x1.271a0e0c47f8dp25 0x1.547f861a31458p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01601 0 OK 0x1.48bfc4b7b9355p23 0x1.146b3c6161574p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01602 0 OK 0x1.0da48b1c11494p25 0x1.c571310666717p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01603 0 OK 0x1.652b6f003c36ap23 0x1.2f52257756a74p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01604 0 OK 0x1.24f41ac6f644fp25 0x1.f1929820754bbp21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01605 0 OK 0x1.6112cdef64c8dp23 0x1.06536645b5fbap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2677p-1 0x0.0p0 F +CSV proj4-epsg.csv:01606 0 OK 0x1.2198029dc9d6fp25 0x1.ae52d62b509bep21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01607 0 OK 0x1.5995f5682b8fcp23 -0x1.384a6c5732035p22 0x0.0p0 -0x1.b0b86ad87634p3 -0x1.1a2ff27284bc9p2 0x0.0p0 T +CSV proj4-epsg.csv:01608 0 OK 0x1.5535c9fedeef8p23 -0x1.39c99ac6ef0bfp22 0x0.0p0 -0x1.488c123028ccep3 -0x1.b812420bc5576p1 0x0.0p0 T +CSV proj4-epsg.csv:01609 0 OK 0x1.5e593225978fap23 -0x1.3496d95e9bfacp22 0x0.0p0 -0x1.1bc8bc66816cfp4 -0x1.7159f658fbc3bp2 0x0.0p0 T +CSV proj4-epsg.csv:01610 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:01611 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:01612 0 OK 0x1.303fb5dee8c06p23 -0x1.0db8f2673c046p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01613 0 OK 0x1.36a560f9e2a8p25 0x1.f58fb727e2c44p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01614 0 OK 0x1.377eb7b117c9fp25 0x1.2a2db6adbcb5fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01615 0 OK 0x1.38c6827f66286p25 0x1.515fa412d358fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01616 0 OK 0x1.36a560f9e2a8p25 0x1.f58fb727e2c44p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01617 0 OK 0x1.377eb7b117c9fp25 0x1.2a2db6adbcb5fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01618 0 OK 0x1.38c6827f66286p25 0x1.515fa412d358fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01619 0 OK -0x1.35c6dad85a3ecp17 0x1.154c660ca6ec8p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01620 0 OK 0x1.0cea33c11240bp22 0x1.e5229ecae33fep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01621 0 OK 0x1.103ec1b416af7p23 0x1.a75a4e8726c3bp20 0x0.0p0 0x1.000000000004p0 -0x1.fffffff0d8799p-1 0x0.0p0 T +CSV proj4-epsg.csv:01622 0 OK 0x1.6be7592ecb9aap22 -0x1.a29f923a53593p22 0x0.0p0 0x1.0000000000006p0 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01623 0 OK -0x1.5b15ca48cbdf1p20 -0x1.11ed1812c4fb2p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01624 0 OK -0x1.154c660ca6ec8p23 -0x1.35c6dad85a41ep17 0x0.0p0 0x1.0000000000006p0 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01625 0 OK -0x1.907bd5d4e19dap23 -0x1.c919addcf85p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000002fp0 0x0.0p0 F +CSV proj4-epsg.csv:01626 0 OK 0x1.0adc9b9131dcp23 0x1.13dbc54ad2e0ep23 0x0.0p0 0x1.000000000004p0 -0x1.fffffffffff32p-1 0x0.0p0 F +CSV proj4-epsg.csv:01627 0 OK 0x1.0adc9b9131dcp23 0x1.13dbc54ad2e0ep23 0x0.0p0 0x1.000000000004p0 -0x1.fffffffffff32p-1 0x0.0p0 F +CSV proj4-epsg.csv:01628 0 OK 0x1.5edb728aaf449p23 0x1.b5eb7965857bbp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01629 0 OK 0x1.5edb728aaf449p23 0x1.b5eb7965857bbp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01630 0 OK 0x1.f3184c5ec07fbp24 -0x1.ba750b1514b1bp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01631 0 OK 0x1.246f2e5bd85f1p23 -0x1.0c2b3d8ee8a25p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01632 0 OK 0x1.dfb6cf5acd96p24 -0x1.b7e8a398309adp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01633 0 OK 0x1.1f878132a3453p23 -0x1.534b8f539b7f4p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01634 0 OK 0x1.d7aafa3b5d9fep24 -0x1.164aef5152798p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01635 0 OK 0x1.f5dfd8e9bfdbep23 0x1.30f84d5602c05p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01636 0 OK 0x1.9ba473c312b8ap25 0x1.f4475c98842d6p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01637 0 OK 0x1.1d1bec8cfdfc7p24 0x1.dad95b3c2ae93p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01638 0 OK 0x1.d3b2d8b4350e8p25 0x1.8579d64123de3p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01639 0 OK 0x1.8bf1a58805fd4p23 -0x1.1e2748372871fp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01640 0 OK 0x1.b642caff5c954p23 0x1.1b88ba0a42f22p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01641 0 OK 0x1.677749c6b15b4p25 0x1.d11d6f0009081p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01642 0 OK 0x1.6bf3f7d7c4683p23 0x1.f56249f1a7f08p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01643 0 OK 0x1.6b4cba2bb1a5cp23 0x1.d9149218a7432p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01644 0 OK 0x1.6a285ba9b046bp23 0x1.e23a99490585cp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01645 0 OK 0x1.1e7021a600c6ep24 -0x1.e09c2310d7b8fp21 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491e3p9 0x0.0p0 T +CSV proj4-epsg.csv:01646 0 OK 0x1.d5e0b05eed6f9p25 -0x1.8a3343cd1f04cp23 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491fp9 0x0.0p0 T +CSV proj4-epsg.csv:01647 0 OK 0x1.78206c898da1cp23 0x1.0a84ef7491b8ap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01648 0 OK 0x1.3480b9c77fab1p25 0x1.b5341b48f71b6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01649 0 OK 0x1.69ecfd5d61591p23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01650 0 OK 0x1.6a00742d44bdp23 -0x1.333be5fe10f52p22 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db8281p2 0x0.0p0 T +CSV proj4-epsg.csv:01651 0 OK 0x1.28eab8092ed57p25 -0x1.f7fde2903dbd1p23 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db827p2 0x0.0p0 T +CSV proj4-epsg.csv:01652 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01653 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01654 0 OK 0x1.994c26431b469p23 -0x1.26698bba6217ap22 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:01655 0 OK 0x1.4fb58d3fda1dep25 -0x1.e2f5758840b34p23 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:01656 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01657 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:01658 0 OK 0x1.279ff9888b715p23 -0x1.4cb0e59d69ed3p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01659 0 OK 0x1.e4f2b12018cc7p24 -0x1.10e03d2f75715p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01660 0 OK 0x1.b27cc5d80250ep23 -0x1.28733d05df362p22 0x0.0p0 -0x1.98d990063ec6cp6 -0x1.6ed261eb7328p5 0x0.0p0 T +CSV proj4-epsg.csv:01661 0 OK 0x1.645ec4317b548p25 -0x1.e64d409542524p23 0x0.0p0 -0x1.98d990063ec6dp6 -0x1.6ed261eb7328cp5 0x0.0p0 T +CSV proj4-epsg.csv:01662 0 OK 0x1.37a9f52baa452p23 -0x1.13d271129e1c2p14 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01663 0 OK 0x1.ff4236fab144ep24 -0x1.c4768b9ea5b6cp15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01664 0 OK 0x1.6fb165c9065a4p23 0x1.62464b038399bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01665 0 OK 0x1.2d95dee868bb6p25 0x1.22945d1b683e9p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01666 0 OK 0x1.6f4754db09495p23 0x1.5bf2c4f5ce6f8p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01667 0 OK 0x1.2d3edfcddc052p25 0x1.1d6403a600556p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01668 0 OK 0x1.47c330687a4fbp23 0x1.52e912879c2bp18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01669 0 OK 0x1.45b98b14707a9p23 0x1.494b817e1bac7p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01670 0 OK 0x1.67cea956d147ap23 0x1.e504b1f970c3fp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01671 0 OK 0x1.271deea06f632p25 0x1.8dd0eaefa217ap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01672 0 OK 0x1.67603867febddp23 0x1.d3bd835722efp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01673 0 OK 0x1.26c358ee78919p25 0x1.7fa4fca21558ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:01674 0 OK 0x1.7b4b2f01843fp23 0x1.5e218e40fcfe4p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01675 0 OK 0x1.3719b80648599p25 0x1.1f2e561b196b1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01676 0 OK 0x1.b9e7ad424f0a3p23 0x1.5ccd4e1188ecep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01677 0 OK 0x1.6a7472e57b24p25 0x1.1e1742625f2c7p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01678 0 OK 0x1.9eba1738f13fdp23 0x1.50d0bec9aeb44p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01679 0 OK 0x1.5429c46eef25ap25 0x1.1442656392fd5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01680 0 OK 0x1.3bf29e9fc4c02p23 -0x1.a247f1cb11a1dp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01681 0 OK 0x1.0324994060787p25 -0x1.5713dce17dfbap19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01682 0 OK 0x1.3a95771a16649p23 -0x1.aeb07ce58fc44p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01683 0 OK 0x1.0206382446f44p25 -0x1.61414a48058bep19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01684 0 OK 0x1.6260ccf61c887p23 -0x1.29848050ed706p22 0x0.0p0 -0x1.6965a34d8a5a8p4 -0x1.dd93f429dc627p2 0x0.0p0 T +CSV proj4-epsg.csv:01685 0 OK 0x1.22a9f4e937e96p25 -0x1.e80d846972ba1p23 0x0.0p0 -0x1.6965a34d8a5b1p4 -0x1.dd93f429dc62ep2 0x0.0p0 T +CSV proj4-epsg.csv:01686 0 OK 0x1.3b8c644d42174p23 0x1.9c6a5d24c256ep17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01687 0 OK 0x1.02d0e20efd6e7p25 0x1.52446d5239449p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01688 0 OK 0x1.6e0afe1503ac1p23 0x1.4912db8d06b7bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01689 0 OK 0x1.2c3b4192d60d8p25 0x1.0de8b19fc70eap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01690 0 OK 0x1.6e1f2824f9b61p23 0x1.46bc1ed71df32p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01691 0 OK 0x1.2c4bcb8a4633ep25 0x1.0bfd9ac9ef203p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01692 0 OK 0x1.4b047d4d0086bp23 0x1.517bfb4099862p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01693 0 OK 0x1.0f80db0a174ffp25 0x1.14ceb4366cdb1p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01694 0 OK 0x1.6f4668b190045p23 0x1.2fb6062bcac2cp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:01695 0 OK 0x1.2d3df69df80e3p25 0x1.f2366f74d9bbdp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:01696 0 OK 0x1.7e725580c2b0bp23 0x1.20546a7e5b01cp23 0x0.0p0 0x1.000000000004p0 -0x1.fffffffffff1fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01697 0 OK 0x1.8636eec51e2dcp23 0x1.f9c5c60cd2258p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01698 0 OK 0x1.62e65f3763a56p23 0x1.9c38bcddef3dep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01699 0 OK 0x1.23178352f77b1p25 0x1.521b8cd45e5ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01700 0 OK 0x1.6826274d485ddp23 0x1.dcbab5baa6ffep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01701 0 OK 0x1.2765b19f55a65p25 0x1.8704729a626d1p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01702 0 OK 0x1.5df2e99177a9ep23 0x1.912b856bef2dap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01703 0 OK 0x1.1f07ee9d571c2p25 0x1.490b00cb3a2eap24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01704 0 OK 0x1.68bb8f51b7b46p23 0x1.5ff87bbe0f19dp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01705 0 OK 0x1.27e03cf706844p25 0x1.20b072b88c9f1p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01706 0 OK 0x1.7bc684036876dp23 0x1.6b8a3feeece7ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01707 0 OK 0x1.377ee08535cf3p25 0x1.2a2dddc2f4547p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01708 0 OK 0x1.377eb7b117c9fp25 0x1.2a2db6adbcb5fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01709 0 OK 0x1.7abd8927cff7ap23 0x1.31c09f82825dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01710 0 OK 0x1.36a589b183fc1p25 0x1.f58ff8e5898d4p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01711 0 OK 0x1.36a560f9e2a8p25 0x1.f58fb727e2c44p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01712 0 OK 0x1.7d5629263629ap23 0x1.9b53a36e26486p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01713 0 OK 0x1.38c6ab7e7b14fp25 0x1.515fd04b37b24p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01714 0 OK 0x1.38c6827f66286p25 0x1.515fa412d358fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01715 0 OK 0x1.77de7bb0f38a4p23 -0x1.33db0875d1bf3p22 0x0.0p0 -0x1.bf7ce334221d1p4 -0x1.2f04f08531c1p3 0x0.0p0 T +CSV proj4-epsg.csv:01716 0 OK 0x1.92a758fe6d9e2p23 0x1.c4e20324affb3p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01717 0 OK 0x1.4a428a386823cp25 0x1.737552e645cdbp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01718 0 OK 0x1.910d9c19c2e6dp23 0x1.a9712c4cace6ep19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01719 0 OK 0x1.48f27831f8eacp25 0x1.5cf37dfc4981dp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01720 0 OK 0x1.7802cd64ba298p23 0x1.6e31d6a1963cdp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01721 0 OK 0x1.34684595e9cd5p25 0x1.2c5b1e2cf629p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01722 0 OK 0x1.7a87a09c328d4p23 0x1.6354a1625a49bp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01723 0 OK 0x1.367929a769147p25 0x1.2371f2a9783e1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01724 0 OK 0x1.3e2bb7db5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01725 0 OK 0x1.405d7fbff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01726 0 OK 0x1.5cdec35d189f2p23 0x1.3cc10a25ec8dfp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01727 0 OK 0x1.1e256ea38eea6p25 0x1.03cde7f343ff8p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01728 0 OK 0x1.5e2bbcc3e3fa8p23 0x1.42d4f14491f36p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01729 0 OK 0x1.1f368a58c718ep25 0x1.08ca120cc66e4p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01730 0 OK 0x1.5b7227d1fcf54p23 0x1.3ded7947a4d6dp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01731 0 OK 0x1.1cfa60c4802c2p25 0x1.04c45319f6828p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01732 0 OK -0x1.2de8925acb76ep19 -0x1.2f66a3377450cp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:01733 0 OK 0x1.aa96a1cdb6738p15 -0x1.2f6c480da75bap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffa1p-1 0x0.0p0 F +CSV proj4-epsg.csv:01734 0 OK 0x1.60d037913c217p19 -0x1.2f6d13e9d1c9fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe9p-1 0x0.0p0 F +CSV proj4-epsg.csv:01735 0 OK 0x1.5415d36ebfddbp20 -0x1.2f6912477f8e6p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:01736 0 OK 0x1.fa367e1f90554p20 -0x1.2f6008d960e79p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000003p0 0x0.0p0 F +CSV proj4-epsg.csv:01737 0 OK 0x1.52638256df787p21 -0x1.2f516f2f97ebbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000bp0 0x0.0p0 F +CSV proj4-epsg.csv:01738 0 OK 0x1.ab04bce56f842p21 -0x1.2f3c5a122e11fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdcp-1 0x0.0p0 F +CSV proj4-epsg.csv:01739 0 OK 0x1.042c3da2c8e9dp22 -0x1.2f1f545f3e56ap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000022p0 0x0.0p0 F +CSV proj4-epsg.csv:01740 0 OK 0x1.3608651bc260ap22 -0x1.2ef81826f0f29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000025p0 0x0.0p0 F +CSV proj4-epsg.csv:01741 0 OK 0x1.6c354670a1686p22 -0x1.2ec30ba0f383bp24 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffeep-1 0x0.0p0 F +CSV proj4-epsg.csv:01742 0 OK 0x1.a84153a7eb669p22 -0x1.2e7a418a9d1bep24 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff776p-1 0x0.0p0 F +CSV proj4-epsg.csv:01743 0 OK 0x1.ec79008450956p22 -0x1.2e135c211531bp24 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8ca7p-1 0x0.0p0 F +CSV proj4-epsg.csv:01744 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01745 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:01746 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:01747 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:01748 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:01749 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01750 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01751 0 OK -0x1.b11bb2c17b344p22 0x1.0c5586f79ccecp21 -0x1.5e3b13ecfcp8 0x1.9e4827c3847edp0 -0x1.0cd7cf08775a6p0 -0x1.24bd4a908p3 T +CSV proj4-epsg.csv:01752 0 OK 0x1.0cd5602f4b25fp25 0x1.15fa279252627p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01753 0 OK 0x1.0b29847975378p25 0x1.0e17283cd2535p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01754 0 OK 0x1.0cd5602f4b25fp25 0x1.15fa279252627p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01755 0 OK 0x1.0b29847975378p25 0x1.0e17283cd2535p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01756 0 OK 0x1.ec79008450956p22 -0x1.2e135c211531bp24 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8ca7p-1 0x0.0p0 F +CSV proj4-epsg.csv:01757 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01758 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:01759 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:01760 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:01761 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:01762 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01763 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01764 0 OK 0x1.52638256df787p21 -0x1.2f516f2f97ebbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000bp0 0x0.0p0 F +CSV proj4-epsg.csv:01765 0 OK 0x1.ab04bce56f842p21 -0x1.2f3c5a122e11fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdcp-1 0x0.0p0 F +CSV proj4-epsg.csv:01766 0 OK -0x1.5052ab2d5456ep23 -0x1.aff3f718c83c2p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01767 0 OK 0x1.0cd5602f4b25fp25 0x1.15fa279252627p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01768 0 OK 0x1.0b29847975378p25 0x1.0e17283cd2535p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01769 0 OK 0x1.bdf145425a89fp22 -0x1.608b68d2bba1p17 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb6ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01770 0 OK 0x1.628dae2475aadp22 0x1.3d5c99b0282c3p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01771 0 OK 0x1.f27c4ed8d8b7ap19 -0x1.12f1ebd2cd495p22 0x0.0p0 0x1.fffffcc506ab1p-1 -0x1.fffffff6fbda2p-1 0x0.0p0 T +CSV proj4-epsg.csv:01772 0 OK -0x1.3057be2fed533p20 -0x1.c04d12f51bf02p16 0x0.0p0 0x1.00005e3d26664p0 -0x1.fffffe7210914p-1 0x0.0p0 T +CSV proj4-epsg.csv:01773 0 OK -0x1.156ecf550d231p21 0x1.1361d10f15182p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01774 0 OK -0x1.06127e1f9054p20 -0x1.bd110967f7482p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01775 0 OK -0x1.b0a304adbef02p20 -0x1.cbaab330f32b8p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01776 0 OK 0x1.2d6745046933ep23 -0x1.f4cf14f9099b3p17 0x1.4709620dp2 0x1.fffffffd1e3aep-1 -0x1.fffffffe4800cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01777 0 OK 0x1.380014ba4fe49p23 -0x1.c3a9e3afdc1d5p21 0x0.0p0 -0x1.3f89132c5519dp2 -0x1.074575085d4afp1 0x0.0p0 T +CSV proj4-epsg.csv:01778 0 OK 0x1.a849d334ed246p22 -0x1.2bcbdff62e27ap23 -0x1.b60f54b42cp8 0x1.0000000000b96p0 -0x1.ffffffffff693p-1 0x1.0p-28 F +CSV proj4-epsg.csv:01779 0 OK 0x1.b2d77da4a0c31p16 -0x1.b2dd2492e4377p16 0x0.0p0 0x1.0p0 -0x1.000000000004p0 0x0.0p0 T +CSV proj4-epsg.csv:01780 0 OK 0x1.b25b0c7f4f86ep16 -0x1.b25b0c7f4f86ep16 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01781 0 OK -0x1.063452846a7dfp20 -0x1.38288d59894e1p22 0x1.3384fca918p7 0x1.0000292da7b36p0 -0x1.0000003d265cfp0 0x1.300f3p-8 T +CSV proj4-epsg.csv:01782 0 OK -0x1.062ffd9549114p20 -0x1.3821cce8617d7p22 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc36p-1 0x0.0p0 T +CSV proj4-epsg.csv:01783 0 OK 0x1.2e695ea35731fp23 0x1.ec33d230248b4p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:01784 0 OK 0x1.1ff3a3b1a6f62p23 -0x1.3e4b12a7421b8p15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:01785 0 OK 0x1.37a8423cddf91p23 -0x1.d374a61ee2211p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:01786 0 OK 0x1.37a909b157486p23 -0x1.d394703aaf3cbp19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01787 0 OK 0x1.37a909b157486p23 -0x1.d394703aaf3cbp19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01788 0 OK 0x1.d1b999a4dea68p16 -0x1.6294613bc80a2p22 0x0.0p0 0x1.ffffffffffff7p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01789 0 OK -0x1.c8a7119d85ebbp22 -0x1.2deb547f3def3p24 0x1.87e5a02938p8 0x1.ffffffffd9066p-1 -0x1.ffffffffed28ap-1 0x1.0p-29 F +CSV proj4-epsg.csv:01790 0 OK -0x1.fa2ed841a3232p23 -0x1.aff3f718c83c2p16 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01791 0 OK 0x1.884689ac7aa9ap20 -0x1.b3ead55faa9a1p16 -0x1.0d9bb9fp7 0x1.000000a32f2d3p0 -0x1.fffffff8d893fp-1 0x1.ba1dp-14 T +CSV proj4-epsg.csv:01792 0 OK 0x1.88468c636e048p20 -0x1.b3e7892625c28p16 -0x1.0a7b7664e8p7 0x1.000000a3490dcp0 -0x1.fffffffc7fcfcp-1 -0x1.68p-24 T +CSV proj4-epsg.csv:01793 0 OK 0x1.d6384efa7fdd6p20 -0x1.bcf00eae68a32p16 -0x1.0a7b7664e8p7 0x1.00002952ec55fp0 -0x1.ffffff3d566bcp-1 -0x1.607p-18 T +CSV proj4-epsg.csv:01794 0 OK 0x1.0fdd06d3fcdb2p21 -0x1.cb88487822e91p16 -0x1.0a7b7664e8p7 0x1.00031bddc23d3p0 -0x1.fffff86a47a11p-1 -0x1.a6ecp-14 T +CSV proj4-epsg.csv:01795 0 OK 0x1.3e3544d63d54dp21 -0x1.b3ead55faa9a1p16 -0x1.0d9bb9fp7 0x1.000000a32f2d3p0 -0x1.fffffff8d893fp-1 0x1.ba1dp-14 T +CSV proj4-epsg.csv:01796 0 OK 0x1.8ef1363fe0d26p21 -0x1.b7c7ad797d16cp16 -0x1.0d9bb9fp7 0x1.0000065418a3fp0 -0x1.ffffffd9fb628p-1 0x1.b66ep-14 T +CSV proj4-epsg.csv:01797 0 OK 0x1.8cc6bae3ebfcbp22 -0x1.e09e2f64c1241p16 -0x1.0d9bb9fp7 0x1.001eb56f2272ap0 -0x1.000008d747663p0 -0x1.1f9abp-10 T +CSV proj4-epsg.csv:01798 0 OK 0x1.b2d0a92e3cd8ap22 -0x1.ee019e2bf9afap16 -0x1.0d9bb9fp7 0x1.0051d811dcfe1p0 -0x1.000064056c67cp0 -0x1.957ebp-9 T +CSV proj4-epsg.csv:01799 0 OK 0x1.1780ce6a81c2dp22 -0x1.c37e304788985p16 -0x1.0a7b7664e8p7 0x1.0000c9d5e1b48p0 -0x1.fffffd1b08417p-1 -0x1.adb4p-16 T +CSV proj4-epsg.csv:01800 0 OK 0x1.1780ce6a81c2dp22 -0x1.c37e304788985p16 -0x1.0a7b7664e8p7 0x1.0000c9d5e1b48p0 -0x1.fffffd1b08417p-1 -0x1.adb4p-16 T +CSV proj4-epsg.csv:01801 0 OK 0x1.1780ce6a81c2dp22 -0x1.c37e304788985p16 -0x1.0a7b7664e8p7 0x1.0000c9d5e1b48p0 -0x1.fffffd1b08417p-1 -0x1.adb4p-16 T +CSV proj4-epsg.csv:01802 0 OK -0x1.48fc5a2e82a2dp21 -0x1.20d82ce536ef9p22 -0x1.2350eb8fdp7 0x1.000000009893p0 -0x1.fffffffe36c1fp-1 0x1.b93ap-15 T +CSV proj4-epsg.csv:01803 0 OK 0x1.5281809d35a14p18 -0x1.b9abce8ead2a3p16 0x0.0p0 0x1.000003e471903p0 -0x1.ffffffea7e4eap-1 0x0.0p0 T +CSV proj4-epsg.csv:01804 0 OK 0x1.63d95bd1eb7dp16 -0x1.bd31f3e9a1535p16 0x0.0p0 0x1.0000117d6edcdp0 -0x1.ffffffa68654ap-1 0x0.0p0 T +CSV proj4-epsg.csv:01805 0 OK -0x1.4593c6f57199p17 -0x1.c17a8a7b8a866p16 0x0.0p0 0x1.000040eac14b1p0 -0x1.fffffede98bdfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01806 0 OK -0x1.a12f3812f2ac8p18 -0x1.c68e9220b64d2p16 0x0.0p0 0x1.0000cf972c0b7p0 -0x1.fffffd09c17fep-1 0x0.0p0 T +CSV proj4-epsg.csv:01807 0 OK -0x1.5157b48424ae6p19 -0x1.cc79613e4626ap16 0x0.0p0 0x1.00024d351bd8dp0 -0x1.fffff9b082b37p-1 0x0.0p0 T +CSV proj4-epsg.csv:01808 0 OK -0x1.d3e372f9f61a8p19 -0x1.d34792a2f0481p16 0x0.0p0 0x1.0005ed8922ee2p0 -0x1.fffff5b6d783bp-1 0x0.0p0 T +CSV proj4-epsg.csv:01809 0 OK -0x1.f15f629489032p22 -0x1.33bf17d8fdeb4p22 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01810 0 OK -0x1.3363451c4165cp22 -0x1.4602ace603ea8p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01811 0 OK -0x1.be1bc909fef5ap20 -0x1.93d3f685ff504p22 0x0.0p0 0x1.0000cfbfecc5cp0 -0x1.fffffd094c9f6p-1 0x0.0p0 T +CSV proj4-epsg.csv:01812 0 OK 0x1.b2d77da4a0c31p16 -0x1.b2dd2492e4377p16 0x0.0p0 0x1.0p0 -0x1.000000000004p0 0x0.0p0 T +CSV proj4-epsg.csv:01813 0 OK 0x1.0a7510b7ab4d7p24 -0x1.c650e3cc07137p16 0x0.0p0 0x1.000145c70290ep0 -0x1.fffffbd2b0b92p-1 0x0.0p0 T +CSV proj4-epsg.csv:01814 0 OK 0x1.17ecafbdd8c7ep24 -0x1.c8ff0a34f342ap16 0x0.0p0 0x1.00020258d6ba4p0 -0x1.fffffa3b1908bp-1 0x0.0p0 T +CSV proj4-epsg.csv:01815 0 OK 0x1.25618689927ccp24 -0x1.cbd9b0a4c169fp16 0x0.0p0 0x1.00031c451aad3p0 -0x1.fffff867ab792p-1 0x0.0p0 T +CSV proj4-epsg.csv:01816 0 OK 0x1.32d367d7c1cbcp24 -0x1.cee2228846a09p16 0x0.0p0 0x1.0004bab8aae0ep0 -0x1.fffff692c65acp-1 0x0.0p0 T +CSV proj4-epsg.csv:01817 0 OK 0x1.40422516efd0ep24 -0x1.d219c51053ab5p16 0x0.0p0 0x1.000712adb6b42p0 -0x1.fffff53701049p-1 0x0.0p0 T +CSV proj4-epsg.csv:01818 0 OK 0x1.4dad8e4f8687dp24 -0x1.d58218b809ec2p16 0x0.0p0 0x1.000a6af8f0b71p0 -0x1.fffff5367ad6fp-1 0x0.0p0 T +CSV proj4-epsg.csv:01819 0 OK 0x1.5b15720b0ab1p24 -0x1.d91cbaeb4c9cp16 0x0.0p0 0x1.000f2154e06bep0 -0x1.fffff814574e5p-1 0x0.0p0 T +CSV proj4-epsg.csv:01820 0 OK 0x1.68799d3a41ee2p24 -0x1.dceb67cf2c4f3p16 0x0.0p0 0x1.0015b0a0d0dafp0 -0x1.00000023ab8cbp0 0x0.0p0 T +CSV proj4-epsg.csv:01821 0 OK 0x1.75d9db1a388dbp24 -0x1.e0effc2e40f99p16 0x0.0p0 0x1.001eb8935129bp0 -0x1.000008d765e74p0 0x0.0p0 T +CSV proj4-epsg.csv:01822 0 OK 0x1.8335f5181a7c3p24 -0x1.e52c778afce87p16 0x0.0p0 0x1.002b072cd7275p0 -0x1.0000191b1207bp0 0x0.0p0 T +CSV proj4-epsg.csv:01823 0 OK 0x1.908db2b3d2d26p24 -0x1.e9a2fe5a195efp16 0x0.0p0 0x1.003ba44649428p0 -0x1.0000355b9a1d3p0 0x0.0p0 T +CSV proj4-epsg.csv:01824 0 OK 0x1.9de0d96165766p24 -0x1.ee55dc6753c08p16 0x0.0p0 0x1.0051dfa997dbp0 -0x1.0000641837536p0 0x0.0p0 T +CSV proj4-epsg.csv:01825 0 OK 0x1.ab2f2c68f647dp24 -0x1.f3478766c86f7p16 0x0.0p0 0x1.006f6238d6118p0 -0x1.0000aeb565b22p0 0x0.0p0 T +CSV proj4-epsg.csv:01826 0 OK -0x1.f1feca3784c06p21 -0x1.1280ddebf625fp17 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffe2p-1 0x0.0p0 T +CSV proj4-epsg.csv:01827 0 OK -0x1.2f2c4670a1686p22 -0x1.2d0720eaad94cp17 0x0.0p0 0x1.0000000000108p0 -0x1.fffffffffff14p-1 0x0.0p0 T +CSV proj4-epsg.csv:01828 0 OK -0x1.6b3853a7eb662p22 -0x1.516c2c15e1775p17 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff6e5p-1 0x0.0p0 T +CSV proj4-epsg.csv:01829 0 OK -0x1.2ae68389b86fcp22 -0x1.9b2437f207a59p21 -0x1.48cc11fb48p7 0x1.171dac59feae7p0 -0x1.00f22bd71ec14p0 -0x1.275026ap-3 T +CSV proj4-epsg.csv:01830 0 OK 0x1.df4eb5c2767f2p21 -0x1.bf1fbce7e1751p16 0x1.17e5e978cp6 0x1.0000293cfb3f1p0 -0x1.ffffff3d3f0f3p-1 -0x1.2eep-17 T +CSV proj4-epsg.csv:01831 0 OK 0x1.178961b2f6788p22 -0x1.c5b5faa876623p16 0x1.17e5e978cp6 0x1.0000c984315e4p0 -0x1.fffffd1afef27p-1 -0x1.73acp-15 T +CSV proj4-epsg.csv:01832 0 OK 0x1.3f136a0e3a112p22 -0x1.cdca08656c23ap16 0x1.17e5e978cp6 0x1.00031ae022d1ep0 -0x1.fffff86ce032fp-1 -0x1.708f8p-13 T +CSV proj4-epsg.csv:01833 0 OK 0x1.6632d755ed50ep22 -0x1.d77c8d48b158bp16 0x1.17e5e978cp6 0x1.000a6718bcf13p0 -0x1.fffff54f8a8eep-1 -0x1.36a9p-11 T +CSV proj4-epsg.csv:01834 0 OK -0x1.0616947b1301dp20 -0x1.bf1fbce7e1751p16 0x1.17e5e978cp6 0x1.0000293cfb3eap0 -0x1.ffffff3d3f0f3p-1 -0x1.2eep-17 T +CSV proj4-epsg.csv:01835 0 OK -0x1.0616947b1301dp20 -0x1.38297ef39f85dp22 0x1.17e5e978cp6 0x1.0000293cfb3eap0 -0x1.ffffff3d3f0dep-1 -0x1.2eep-17 T +CSV proj4-epsg.csv:01836 0 OK 0x1.2d6a1abb10e77p23 -0x1.f30c338fe201dp17 -0x1.4d5ea456dp6 0x1.fffffffd1cdf8p-1 -0x1.fffffffe4913fp-1 -0x1.0p-29 T +CSV proj4-epsg.csv:01837 0 OK 0x1.58ee020ffe99dp20 -0x1.e81d334f5ea08p21 0x0.0p0 0x1.0000000000001p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01838 0 OK 0x1.582c7779a7282p20 -0x1.7f5dae535649cp21 0x0.0p0 0x1.ffffffffffffbp-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01839 0 OK 0x1.57667e6edb118p20 -0x1.16c8c92839222p21 0x0.0p0 0x1.0000000000001p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01840 0 OK 0x1.569c24e63e1fcp20 -0x1.5cbe0aab2182cp20 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01841 0 OK 0x1.55cd7ae771354p20 -0x1.1883550bb19ap19 0x0.0p0 0x1.ffffffffffffbp-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:01842 0 OK 0x1.54fa92b1928c3p20 0x1.0f8b28675b3p18 0x0.0p0 0x1.0000000000001p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01843 0 OK 0x1.542380e376f51p20 0x1.13aeb2ad81dfcp20 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01844 0 OK 0x1.53485ca5a8304p20 0x1.e321951230c98p20 0x0.0p0 0x1.ffffffffffff4p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01845 0 OK 0x1.52693fd634c0ap20 0x1.591d904f2851p21 0x0.0p0 0x1.0000000000003p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01846 0 OK 0x1.2a0d1a5f5a56p23 0x1.a129ac330e164p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01847 0 OK 0x1.2a0d1a5f5a56p23 0x1.a129ac330e164p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01848 0 OK 0x1.2a0d1a5f5a56p23 0x1.a129ac330e164p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:01849 0 OK 0x1.35c6dad85a403p17 -0x1.154c660ca6ec8p23 0x0.0p0 0x1.0p0 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01850 0 OK 0x1.3070c731a5a43p17 0x1.10858c1bb2a77p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01851 0 OK 0x1.78e647be85d33p16 -0x1.f24efc3c51f75p16 0x0.0p0 0x1.0p0 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01852 0 OK 0x1.9d141ae348d39p17 0x1.71c50384d75c5p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01853 0 OK 0x1.5bbc0f6e8f78ap23 0x1.e27983843e82ap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01854 0 OK 0x1.5bbc0f6e8f78ap23 0x1.e27983843e82ap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01855 0 OK -0x1.195774a8667b9p21 -0x1.6497c8e37b272p19 0x1.e17a4a5d4p4 0x1.0000000000013p0 -0x1.ffffffffe0eaap-1 0x1.8p-29 F +CSV proj4-epsg.csv:01856 0 OK -0x1.83b58ba240ab6p21 0x1.4e361eb1b95c4p20 0x1.e17a4a5d4p4 0x1.0051fb6d9f3c8p0 -0x1.0000623ca6b9ap0 -0x1.2fa58p-13 T +CSV proj4-epsg.csv:01857 0 OK -0x1.64e8829fc20c5p21 0x1.4ec861c636c26p20 0x1.e17a4a5d4p4 0x1.002b187a8caffp0 -0x1.0000181f4dc09p0 -0x1.5d36p-14 T +CSV proj4-epsg.csv:01858 0 OK -0x1.46a71a0606f98p21 0x1.4f4c27a0db10ep20 0x1.e17a4a5d4p4 0x1.0015bb0609f51p0 -0x1.ffffff444ceeap-1 -0x1.7b74p-15 T +CSV proj4-epsg.csv:01859 0 OK -0x1.28e36d24acb0cp21 0x1.4fc278fcf3d26p20 0x1.e17a4a5d4p4 0x1.000a70f5eb954p0 -0x1.fffff4b5e171fp-1 -0x1.848p-16 T +CSV proj4-epsg.csv:01860 0 OK 0x1.8bb4bad78d4e3p24 -0x1.0fe757119bd93p21 -0x1.4d5ea456dp6 0x1.000000000004dp0 -0x1.ffffffffe0cd1p-1 -0x1.0p-30 F +CSV proj4-epsg.csv:01861 0 OK 0x1.8bb4bad78d4e3p24 -0x1.03b257119bd93p21 -0x1.4d5ea456dp6 0x1.000000000004dp0 -0x1.ffffffffe0cd1p-1 -0x1.0p-30 F +CSV proj4-epsg.csv:01862 0 OK -0x1.5052ab2d5456ep23 -0x1.aff3f718c83c2p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:01863 0 OK 0x1.acefc7a579446p17 -0x1.7ff70dfb536eap23 0x0.0p0 0x1.0p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01864 0 OK 0x1.b16eeb10fe56dp17 -0x1.83fd80abe7939p23 0x0.0p0 0x1.0p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01865 0 OK -0x1.9a2301756c332p22 -0x1.716a2cbeedbebp17 0x0.0p0 0x1.982ebcb2e35f5p0 -0x1.0c51af498a818p0 0x0.0p0 T +CSV proj4-epsg.csv:01866 0 OK -0x1.6afebb79755cap21 -0x1.38c89ba1bb581p22 0x0.0p0 0x1.0031171756778p0 -0x1.000022a887bcdp0 0x0.0p0 T +CSV proj4-epsg.csv:01867 0 OK -0x1.30f2bce56d7edp21 -0x1.e0bfd09b08c98p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:01868 0 OK -0x1.8e467b458dbc3p21 -0x1.fdc5838ac21eap16 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:01869 0 OK -0x1.65588ea2e5454p19 0x1.2dbcf2c2a8819p23 0x0.0p0 0x1.0000065594951p0 -0x1.ffffffdd92ec2p-1 0x0.0p0 T +CSV proj4-epsg.csv:01870 0 OK -0x1.d47a87123266ap19 0x1.2db65943a5a93p23 0x0.0p0 0x1.000016f63ed7dp0 -0x1.ffffff8d28091p-1 0x0.0p0 T +CSV proj4-epsg.csv:01871 0 OK -0x1.22421f2987892p20 0x1.2dae8b1e15986p23 0x0.0p0 0x1.000048230577bp0 -0x1.fffffec30f3e7p-1 0x0.0p0 T +CSV proj4-epsg.csv:01872 0 OK -0x1.5acea6b30f3ebp20 0x1.2da57b0d3338fp23 0x0.0p0 0x1.0000c9f442866p0 -0x1.fffffd19feafp-1 0x0.0p0 T +CSV proj4-epsg.csv:01873 0 OK -0x1.93f78c5a0d0cp20 0x1.2d9b1951870ebp23 0x0.0p0 0x1.00020258d6b5cp0 -0x1.fffffa3b19069p-1 0x0.0p0 T +CSV proj4-epsg.csv:01874 0 OK -0x1.cdd28f885437p20 0x1.2d8f536e0a33bp23 0x0.0p0 0x1.0004bab8aae2bp0 -0x1.fffff692c659ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01875 0 OK -0x1.043b53d97747fp21 0x1.2d8213d87ffc2p23 0x0.0p0 0x1.000a6af8f0b7fp0 -0x1.fffff5367ad7fp-1 0x0.0p0 T +CSV proj4-epsg.csv:01876 0 OK -0x1.21fe19743b918p21 0x1.2d73419b761fcp23 0x0.0p0 0x1.0015b0a0d0dafp0 -0x1.00000023ab8d8p0 0x0.0p0 T +CSV proj4-epsg.csv:01877 0 OK -0x1.403e943e2ae93p21 0x1.2d62bfe82ed04p23 0x0.0p0 0x1.002b072cd7291p0 -0x1.0000191b1209p0 0x0.0p0 T +CSV proj4-epsg.csv:01878 0 OK -0x1.06127e1f9054p20 0x1.2db2dded30117p23 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01879 0 OK -0x1.b0a304adbef02p20 0x1.2d95aa999e19bp23 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffffc1p-1 0x0.0p0 T +CSV proj4-epsg.csv:01880 0 OK -0x1.30f2bce56f83cp21 0x1.2d6b805eca664p23 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:01881 0 OK 0x1.7f789a7c48c89p22 0x1.2c4deaea963e9p23 -0x1.bfe45d2bfp6 0x1.ffffffffffa8ap-1 -0x1.ffffffffffddep-1 0x1.8p-29 T +CSV proj4-epsg.csv:01882 0 OK 0x1.6f7fb7bbb4e97p21 -0x1.d1ea45ec0ec0ep16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01883 0 OK 0x1.193c2ea7d63c8p21 -0x1.c1475f306155p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01884 0 OK 0x1.b2d77da4a0c31p16 -0x1.b2d77da4a0c31p16 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01885 0 OK 0x1.b25b0c7f4f86ep16 -0x1.b25b0c7f4f86ep16 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01886 0 OK -0x1.528a15cb82738p19 -0x1.37fdc82971eebp22 0x0.0p0 0x1.000000a376962p0 -0x1.fffffffc7e16dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01887 0 OK -0x1.27d64d60eb8b8p19 -0x1.38025e9a9aaf8p22 0x0.0p0 0x1.000001746014ap0 -0x1.fffffff7e2434p-1 0x0.0p0 T +CSV proj4-epsg.csv:01888 0 OK -0x1.26babaec972c2p19 -0x1.380bc262e223fp22 0x0.0p0 0x1.000005542b367p0 -0x1.ffffffe2d7a5ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01889 0 OK -0x1.79f7a836a8d54p19 -0x1.3821fa80339ebp22 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc1fp-1 0x0.0p0 T +CSV proj4-epsg.csv:01890 0 OK -0x1.5c5edafa9aa7dp23 -0x1.707bb9857fc21p19 0x1.9e960aac56p9 0x1.d76a43265a9fap-1 0x1.ae6366229cb4cp-1 -0x1.086acfecp0 F +CSV proj4-epsg.csv:01891 0 OK -0x1.56de1da9f685fp23 -0x1.8b22eb10d0e76p19 0x1.9e960aac56p9 0x1.df6f498c1357ap-1 0x1.677f8cd345e6p-1 -0x1.a5f56638p-1 F +CSV proj4-epsg.csv:01892 0 OK -0x1.588ad48fe1783p23 -0x1.c397b23d65a34p19 0x1.9e960aac56p9 0x1.dd2ad14699e6ap-1 0x1.7cc4080726ac4p-1 -0x1.c4147c08p-1 F +CSV proj4-epsg.csv:01893 0 OK -0x1.560da1a239c86p23 -0x1.a1049b3fa3e08p19 0x1.9e960aac56p9 0x1.e14c568446fc1p-1 0x1.552af5b691cbfp-1 -0x1.8d4473p-1 F +CSV proj4-epsg.csv:01894 0 OK -0x1.5a1a245db82ep23 -0x1.048c2af56f7e7p20 0x1.9e960aac56p9 0x1.daed38559b10ap-1 0x1.90c7cb4642876p-1 -0x1.e1ec2238p-1 F +CSV proj4-epsg.csv:01895 0 OK -0x1.517088ecdfaep23 -0x1.09c0a76513a6cp20 0x1.9e960aac56p9 0x1.e5cb7c04d2d89p-1 0x1.2532cecb9a3bbp-1 -0x1.51f33bep-1 F +CSV proj4-epsg.csv:01896 0 OK -0x1.526e4a7d42371p23 -0x1.194844ff4194ap20 0x1.9e960aac56p9 0x1.e4bb673be9917p-1 0x1.31110922ec7f2p-1 -0x1.5fef1d5p-1 F +CSV proj4-epsg.csv:01897 0 OK -0x1.530a24f90ea21p23 -0x1.b6bf4daaaea4fp19 0x1.9e960aac56p9 0x1.e40ede035b081p-1 0x1.386999cffd34cp-1 -0x1.68d051cp-1 F +CSV proj4-epsg.csv:01898 0 OK -0x1.57a9a08c5c9a3p23 -0x1.1bf077c89c718p20 0x1.9e960aac56p9 0x1.de5f2f330e8fp-1 0x1.719a21d6b8b4bp-1 -0x1.b41174c8p-1 F +CSV proj4-epsg.csv:01899 0 OK -0x1.195774a8667b9p21 0x1.3b35a55a9003ap20 0x1.e17a4a5d4p4 0x1.0000000000013p0 -0x1.ffffffffe0eaap-1 0x1.8p-29 F +CSV proj4-epsg.csv:01900 0 OK 0x1.3f098369fe6d9p22 -0x1.cb88487822e91p16 -0x1.0a7b7664e8p7 0x1.00031bddc23d3p0 -0x1.fffff86a47a11p-1 -0x1.a6ecp-14 T +CSV proj4-epsg.csv:01901 0 OK 0x1.484ceedbfa9ddp25 -0x1.28b1c5d01ab73p20 0x0.0p0 -0x1.7cef677c92da4p5 -0x1.1ba558052714dp4 0x0.0p0 T +CSV proj4-epsg.csv:01902 0 OK 0x1.1a7c918a2d6bp25 -0x1.dbcc019dda358p19 0x0.0p0 -0x1.a522ed1b5d47cp3 -0x1.130eea7c1bae4p2 0x0.0p0 T +CSV proj4-epsg.csv:01903 0 OK 0x1.662794bc02b8ep22 -0x1.d52ed69da9775p16 -0x1.0a7b7664e8p7 0x1.000a69c86f672p0 -0x1.fffff53a445b3p-1 -0x1.6188p-12 T +CSV proj4-epsg.csv:01904 0 OK 0x1.e55aab52362f8p22 -0x1.d3e6352759774p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01905 0 OK 0x1.4849630b52b64p25 -0x1.28ad21c69d7e2p20 0x0.0p0 -0x1.7cd99464cbfa9p5 -0x1.1b875401cefdap4 0x0.0p0 T +CSV proj4-epsg.csv:01906 0 OK 0x1.1a79e8394291ap25 -0x1.dbc6e7db53259p19 0x0.0p0 -0x1.a50e1aeca45b6p3 -0x1.12fc74f04c596p2 0x0.0p0 T +CSV proj4-epsg.csv:01907 0 OK 0x1.024364de276fdp25 -0x1.60de95f029329p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:01908 0 OK 0x1.f471c250f75bdp24 -0x1.1365196bf95f4p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:01909 0 OK 0x1.2c3b4192d60d8p25 0x1.0de8b19fc70eap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01910 0 OK -0x1.923189218343dp23 -0x1.1a6c035a426acp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01911 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:01912 0 OK -0x1.2f2c4670a1686p22 0x1.2c78e37c5549bp23 0x0.0p0 0x1.0000000000108p0 -0x1.fffffffffffp-1 0x0.0p0 T +CSV proj4-epsg.csv:01913 0 OK -0x1.2f2ef1dabc875p22 0x1.2c7bc25714aa3p23 0x1.fd7f252c2p6 0x1.0000000000131p0 -0x1.ffffffffffed5p-1 0x1.0p-28 T +CSV proj4-epsg.csv:01914 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:01915 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:01916 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:01917 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:01918 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:01919 0 OK 0x1.74e14ae83898p20 -0x1.4f37876059136p18 0x0.0p0 0x1.08e6825022f6cp5 -0x1.565dd1699c1aap3 0x0.0p0 T +CSV proj4-epsg.csv:01920 0 OK 0x1.bc09b4012e48p18 -0x1.a90e6643e6697p18 0x0.0p0 0x1.c710c4de6a118p6 -0x1.9adc0dbf9aaefp5 0x0.0p0 T +CSV proj4-epsg.csv:01921 0 OK -0x1.04b007850841p20 -0x1.138adb641c89dp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e74683995p8 0x0.0p0 T +CSV proj4-epsg.csv:01922 0 OK -0x1.5e1e56a2f8edp23 -0x1.4f37876059136p18 0x0.0p0 0x1.08e6825022f6cp5 -0x1.565dd1699c1aap3 0x0.0p0 T +CSV proj4-epsg.csv:01923 0 OK -0x1.9d5eb25ff68dcp23 -0x1.a90e6643e6697p18 0x0.0p0 0x1.c710c4de6a118p6 -0x1.9adc0dbf9aaefp5 0x0.0p0 T +CSV proj4-epsg.csv:01924 0 OK -0x1.ea5980f0a1082p23 -0x1.138adb641c89dp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e74683995p8 0x0.0p0 T +CSV proj4-epsg.csv:01925 0 OK 0x1.9cd2295d0713p23 -0x1.4f37876059136p18 0x0.0p0 0x1.08e6825022f6cp5 -0x1.565dd1699c1aap3 0x0.0p0 T +CSV proj4-epsg.csv:01926 0 OK 0x1.9d378061bf882p23 -0x1.78578280871abp18 0x0.0p0 0x1.e71b6e19596a8p5 -0x1.6fcf5a38cac2dp4 0x0.0p0 T +CSV proj4-epsg.csv:01927 0 OK 0x1.9a9acda009724p23 -0x1.a90e6643e6697p18 0x0.0p0 0x1.c710c4de6a118p6 -0x1.9adc0dbf9aaefp5 0x0.0p0 T +CSV proj4-epsg.csv:01928 0 OK 0x1.9492be528e22fp23 -0x1.e2c27446a6015p18 0x0.0p0 -0x1.2087d95566a9dp7 -0x1.d6cce86e0edf7p6 0x0.0p0 T +CSV proj4-epsg.csv:01929 0 OK 0x1.8aa8ff0f5ef7ep23 -0x1.138adb641c89dp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e74683995p8 0x0.0p0 T +CSV proj4-epsg.csv:01930 0 OK 0x1.7c58ed58adc3p23 -0x1.3bf720b96b706p19 0x0.0p0 -0x1.68p6 -0x1.46d9a300ca5eap9 0x0.0p0 T +CSV proj4-epsg.csv:01931 0 OK -0x1.5e1e56a2f8edp23 -0x1.4f37876059136p18 0x0.0p0 0x1.08e6825022f6cp5 -0x1.565dd1699c1aap3 0x0.0p0 T +CSV proj4-epsg.csv:01932 0 OK -0x1.7c3d7f9e4077ep23 -0x1.78578280871abp18 0x0.0p0 0x1.e71b6e19596a8p5 -0x1.6fcf5a38cac2dp4 0x0.0p0 T +CSV proj4-epsg.csv:01933 0 OK -0x1.9d5eb25ff68dcp23 -0x1.a90e6643e6697p18 0x0.0p0 0x1.c710c4de6a118p6 -0x1.9adc0dbf9aaefp5 0x0.0p0 T +CSV proj4-epsg.csv:01934 0 OK -0x1.c1eb41ad71dd1p23 -0x1.e2c27446a6015p18 0x0.0p0 -0x1.2087d95566a9dp7 -0x1.d6cce86e0edf7p6 0x0.0p0 T +CSV proj4-epsg.csv:01935 0 OK -0x1.ea5980f0a1082p23 -0x1.138adb641c89dp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306e74683995p8 0x0.0p0 T +CSV proj4-epsg.csv:01936 0 OK -0x1.0b970953a91e8p24 -0x1.3bf720b96b706p19 0x0.0p0 -0x1.68p6 -0x1.46d9a300ca5eap9 0x0.0p0 T +CSV proj4-epsg.csv:01937 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:01938 0 OK 0x1.74d4ec430c4bp20 -0x1.4f38eee8bada9p18 0x0.0p0 0x1.08e655f532dbep5 -0x1.565d664ba9c33p3 0x0.0p0 T +CSV proj4-epsg.csv:01939 0 OK 0x1.bbcfe7e42708p18 -0x1.a91027a9ba169p18 0x0.0p0 0x1.c710644e4d084p6 -0x1.9adb65bfe9cdcp5 0x0.0p0 T +CSV proj4-epsg.csv:01940 0 OK -0x1.04c100619527p20 -0x1.138bfb234ea1cp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306642e0c5e8p8 0x0.0p0 T +CSV proj4-epsg.csv:01941 0 OK -0x1.5e1fe2779e76ap23 -0x1.4f38eee8bada9p18 0x0.0p0 0x1.08e655f532dbep5 -0x1.565d664ba9c33p3 0x0.0p0 T +CSV proj4-epsg.csv:01942 0 OK -0x1.9d6080c0dec7cp23 -0x1.a91027a9ba169p18 0x0.0p0 0x1.c710644e4d084p6 -0x1.9adb65bfe9cdcp5 0x0.0p0 T +CSV proj4-epsg.csv:01943 0 OK -0x1.ea5ba00c32a4ep23 -0x1.138bfb234ea1cp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306642e0c5e8p8 0x0.0p0 T +CSV proj4-epsg.csv:01944 0 OK 0x1.e248e2ca647cp24 -0x1.b4079b4586783p16 0x0.0p0 0x1.000000a376922p0 -0x1.fffffffc7e186p-1 0x0.0p0 T +CSV proj4-epsg.csv:01945 0 OK 0x1.9cd09d8861896p23 -0x1.4f38eee8bada9p18 0x0.0p0 0x1.08e655f532dbep5 -0x1.565d664ba9c33p3 0x0.0p0 T +CSV proj4-epsg.csv:01946 0 OK 0x1.9d35d4d3ccedep23 -0x1.7859132e930e9p18 0x0.0p0 0x1.e71b120809d9ep5 -0x1.6fced39d0ec0cp4 0x0.0p0 T +CSV proj4-epsg.csv:01947 0 OK 0x1.9a98ff3f21384p23 -0x1.a91027a9ba169p18 0x0.0p0 0x1.c710644e4d084p6 -0x1.9adb65bfe9cdcp5 0x0.0p0 T +CSV proj4-epsg.csv:01948 0 OK 0x1.9490c996944dcp23 -0x1.e2c46f635af0ep18 0x0.0p0 -0x1.20883f7722981p7 -0x1.d6cc16ea15502p6 0x0.0p0 T +CSV proj4-epsg.csv:01949 0 OK 0x1.8aa6dff3cd5b2p23 -0x1.138bfb234ea1cp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306642e0c5e8p8 0x0.0p0 T +CSV proj4-epsg.csv:01950 0 OK 0x1.7c569f4d2e95ap23 -0x1.3bf868f884abp19 0x0.0p0 -0x1.68p6 -0x1.46d8fde090e69p9 0x0.0p0 T +CSV proj4-epsg.csv:01951 0 OK -0x1.5e1fe2779e76ap23 -0x1.4f38eee8bada9p18 0x0.0p0 0x1.08e655f532dbep5 -0x1.565d664ba9c33p3 0x0.0p0 T +CSV proj4-epsg.csv:01952 0 OK -0x1.7c3f2b2c33122p23 -0x1.7859132e930e9p18 0x0.0p0 0x1.e71b120809d9ep5 -0x1.6fced39d0ec0cp4 0x0.0p0 T +CSV proj4-epsg.csv:01953 0 OK -0x1.9d6080c0dec7cp23 -0x1.a91027a9ba169p18 0x0.0p0 0x1.c710644e4d084p6 -0x1.9adb65bfe9cdcp5 0x0.0p0 T +CSV proj4-epsg.csv:01954 0 OK -0x1.c1ed36696bb24p23 -0x1.e2c46f635af0ep18 0x0.0p0 -0x1.20883f7722981p7 -0x1.d6cc16ea15502p6 0x0.0p0 T +CSV proj4-epsg.csv:01955 0 OK -0x1.ea5ba00c32a4ep23 -0x1.138bfb234ea1cp19 0x0.0p0 -0x1.7400000000001p6 -0x1.1306642e0c5e8p8 0x0.0p0 T +CSV proj4-epsg.csv:01956 0 OK -0x1.0b98305968b53p24 -0x1.3bf868f884abp19 0x0.0p0 -0x1.68p6 -0x1.46d8fde090e69p9 0x0.0p0 T +CSV proj4-epsg.csv:01957 0 OK 0x1.75353238bedffp21 -0x1.837b073fda384p20 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:01958 0 OK -0x1.6fb167e701decp20 -0x1.88c67af7625e9p22 0x0.0p0 0x1.fffffffffffe2p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01959 0 OK -0x1.87f93433a2a37p18 0x1.b21f2e5aa38e7p19 0x0.0p0 0x1.00000004593dap0 -0x1.ffffffffee84bp-1 0x0.0p0 T +CSV proj4-epsg.csv:01960 0 OK -0x1.f5162c45b4cacp18 0x1.b209da85fe735p19 0x0.0p0 0x1.0000000e6820cp0 -0x1.ffffffffbd237p-1 0x0.0p0 T +CSV proj4-epsg.csv:01961 0 OK -0x1.3131359b85e15p19 0x1.b1f0301e94a8p19 0x0.0p0 0x1.000000291f92bp0 -0x1.ffffffff2e3d2p-1 0x0.0p0 T +CSV proj4-epsg.csv:01962 0 OK -0x1.67f35aebd232cp19 0x1.b1d224e0321c5p19 0x0.0p0 0x1.000000696e95ep0 -0x1.fffffffdc6b02p-1 0x0.0p0 T +CSV proj4-epsg.csv:01963 0 OK -0x1.9ed5f3b1f6fd6p19 0x1.b1afacb7598d8p19 0x0.0p0 0x1.000000f8cb2dfp0 -0x1.fffffffa9ab1bp-1 0x0.0p0 T +CSV proj4-epsg.csv:01964 0 OK -0x1.d5dd7a9763a82p19 0x1.b188b9b54f175p19 0x0.0p0 0x1.00000224dea0fp0 -0x1.fffffff409debp-1 0x0.0p0 T +CSV proj4-epsg.csv:01965 0 OK -0x1.06873c98bf35fp20 0x1.b15d3c0235d61p19 0x0.0p0 0x1.0000047842091p0 -0x1.ffffffe766276p-1 0x0.0p0 T +CSV proj4-epsg.csv:01966 0 OK -0x1.2236c4f7da877p20 0x1.b12d21cd2a612p19 0x0.0p0 0x1.000008e014b4bp0 -0x1.ffffffd088ab1p-1 0x0.0p0 T +CSV proj4-epsg.csv:01967 0 OK -0x1.3dffad0c3835fp20 0x1.b0f8573a4118dp19 0x0.0p0 0x1.000010e3480bep0 -0x1.ffffffa95f117p-1 0x0.0p0 T +CSV proj4-epsg.csv:01968 0 OK -0x1.59e455eb3df39p20 0x1.b0bec64e4c7e9p19 0x0.0p0 0x1.00001ef1c1078p0 -0x1.ffffff69872c8p-1 0x0.0p0 T +CSV proj4-epsg.csv:01969 0 OK -0x1.75e72c2c38fb9p20 0x1.b08056d84d05ap19 0x0.0p0 0x1.000036d2eccb7p0 -0x1.ffffff062002ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01970 0 OK -0x1.920aa901df724p20 0x1.b03cee586902dp19 0x0.0p0 0x1.00005e3d26664p0 -0x1.fffffe7210916p-1 0x0.0p0 T +CSV proj4-epsg.csv:01971 0 OK -0x1.ae51535e656e7p20 0x1.aff46fe4489b7p19 0x0.0p0 0x1.00009da15a35bp0 -0x1.fffffd9f2883p-1 0x0.0p0 T +CSV proj4-epsg.csv:01972 0 OK -0x1.cabdc122ee444p20 0x1.afa6bc08aeca7p19 0x0.0p0 0x1.00010138bdd66p0 -0x1.fffffc80b18b2p-1 0x0.0p0 T +CSV proj4-epsg.csv:01973 0 OK -0x1.e752985b229b7p20 0x1.af53b0a825cep19 0x0.0p0 0x1.00019a654be68p0 -0x1.fffffb104d798p-1 0x0.0p0 T +CSV proj4-epsg.csv:01974 0 OK -0x1.02094842d9f4bp21 0x1.aefb28d692854p19 0x0.0p0 0x1.000281790cf18p0 -0x1.fffff9565bf7ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01975 0 OK -0x1.108039f54aedcp21 0x1.ae9cfcb17f809p19 0x0.0p0 0x1.0003d7fc2e47fp0 -0x1.fffff777a2984p-1 0x0.0p0 T +CSV proj4-epsg.csv:01976 0 OK -0x1.1f0f907fdb22dp21 0x1.ae390134edbf7p19 0x0.0p0 0x1.0005cb8e9abd2p0 -0x1.fffff5ca9ce2ep-1 0x0.0p0 T +CSV proj4-epsg.csv:01977 0 OK -0x1.2db8c5ee7e133p21 0x1.adcf080c764d9p19 0x0.0p0 0x1.000899875fe57p0 -0x1.fffff4f7bd411p-1 0x0.0p0 T +CSV proj4-epsg.csv:01978 0 OK -0x1.3c7d5fe02b28ap21 0x1.ad5edf60852bfp19 0x0.0p0 0x1.000c937ad4b7bp0 -0x1.fffff62913939p-1 0x0.0p0 T +CSV proj4-epsg.csv:01979 0 OK -0x1.4b5ef05151287p21 0x1.ace8519f73295p19 0x0.0p0 0x1.001224d86e239p0 -0x1.fffffb4f58998p-1 0x0.0p0 T +CSV proj4-epsg.csv:01980 0 OK -0x1.5a5f166f1a0a1p21 0x1.ac6b25424186fp19 0x0.0p0 0x1.0019d9dabc737p0 -0x1.000003c230acfp0 0x0.0p0 T +CSV proj4-epsg.csv:01981 0 OK -0x1.697f7f73e37a9p21 0x1.abe71c8cb77f3p19 0x0.0p0 0x1.0024680f88d01p0 -0x1.00000fcacf82ap0 0x0.0p0 T +CSV proj4-epsg.csv:01982 0 OK -0x1.78c1e78d50565p21 0x1.ab5bf5489efaep19 0x0.0p0 0x1.0032b8cbe1889p0 -0x1.000025625de62p0 0x0.0p0 T +CSV proj4-epsg.csv:01983 0 OK -0x1.88281acc5762dp21 0x1.aac9687bdafdap19 0x0.0p0 0x1.0045f5f09c075p0 -0x1.000049e86b1f3p0 0x0.0p0 T +CSV proj4-epsg.csv:01984 0 OK -0x1.97b3f61fb38fp21 0x1.aa2f2a190f85dp19 0x0.0p0 0x1.005f99780ede9p0 -0x1.000085304f5edp0 0x0.0p0 T +CSV proj4-epsg.csv:01985 0 OK 0x1.1463a1ed951f6p22 -0x1.04c924a88c74bp17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff9p-1 0x0.0p0 T +CSV proj4-epsg.csv:01986 0 OK 0x1.c987cee806a87p21 -0x1.e9730410feff1p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01987 0 OK 0x1.193c2ea7d63c8p21 -0x1.c1475f306155p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:01988 0 OK 0x1.f2775d20796efp19 -0x1.12f1f3c37459p22 0x1.bec8ab9dcp5 0x1.fffffcc22d1fap-1 -0x1.fffffff6ecdbep-1 0x1.98p-24 T +CSV proj4-epsg.csv:01989 0 OK 0x1.0f88c5e7111fcp21 -0x1.4b4f5ff5930c4p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:01990 0 OK 0x1.0e99c65d108c2p21 0x1.b802534ecd258p23 0x0.0p0 0x1.0000000000005p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:01991 0 OK -0x1.30f2bce56f83cp21 -0x1.e0bfd09accdfbp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:01992 0 OK 0x1.4225196c44e3fp23 0x1.a5d5c9417f134p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000061p0 0x0.0p0 F +CSV proj4-epsg.csv:01993 0 OK 0x1.4224f79aea41dp23 0x1.a5d117db557c5p21 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffff61p-1 0x0.0p0 F +CSV proj4-epsg.csv:01994 0 OK 0x1.4224f79aea41dp23 0x1.a5d117db557c5p21 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffff61p-1 0x0.0p0 F +CSV proj4-epsg.csv:01995 0 OK 0x1.4224f79aea41dp23 0x1.a5d117db557c5p21 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffff61p-1 0x0.0p0 F +CSV proj4-epsg.csv:01996 0 OK -0x1.87f93433a2a37p18 -0x1.5244e4e4ad3bbp22 0x0.0p0 0x1.00000004593dap0 -0x1.ffffffffee80cp-1 0x0.0p0 T +CSV proj4-epsg.csv:01997 0 OK -0x1.f5162c45b4cacp18 -0x1.52478f5f41df1p22 0x0.0p0 0x1.0000000e6820cp0 -0x1.ffffffffbd1eap-1 0x0.0p0 T +CSV proj4-epsg.csv:01998 0 OK -0x1.3131359b85e15p19 -0x1.524ac4ac2f188p22 0x0.0p0 0x1.000000291f92bp0 -0x1.ffffffff2e3aap-1 0x0.0p0 T +CSV proj4-epsg.csv:01999 0 OK -0x1.67f35aebd232cp19 -0x1.524e8613fb6ap22 0x0.0p0 0x1.000000696e95ep0 -0x1.fffffffdc6ae3p-1 0x0.0p0 T +CSV proj4-epsg.csv:02000 0 OK -0x1.9ed5f3b1f6fd6p19 -0x1.5252d519167bep22 0x0.0p0 0x1.000000f8cb2dfp0 -0x1.fffffffa9ab09p-1 0x0.0p0 T +CSV proj4-epsg.csv:02001 0 OK -0x1.d5dd7a9763a82p19 -0x1.5257b37957caap22 0x0.0p0 0x1.00000224dea0fp0 -0x1.fffffff409dcbp-1 0x0.0p0 T +CSV proj4-epsg.csv:02002 0 OK -0x1.06873c98bf35fp20 -0x1.525d232fbaf2cp22 0x0.0p0 0x1.0000047842091p0 -0x1.ffffffe76623dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02003 0 OK -0x1.2236c4f7da877p20 -0x1.526326765c616p22 0x0.0p0 0x1.000008e014b4bp0 -0x1.ffffffd088a76p-1 0x0.0p0 T +CSV proj4-epsg.csv:02004 0 OK -0x1.3dffad0c3835fp20 -0x1.5269bfc8b98a7p22 0x0.0p0 0x1.000010e3480bep0 -0x1.ffffffa95f0fbp-1 0x0.0p0 T +CSV proj4-epsg.csv:02005 0 OK -0x1.59e455eb3df39p20 -0x1.5270f1e6381dcp22 0x0.0p0 0x1.00001ef1c1078p0 -0x1.ffffff69872c8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02006 0 OK -0x1.75e72c2c38fb9p20 -0x1.5278bfd4f80cep22 0x0.0p0 0x1.000036d2eccb7p0 -0x1.ffffff0620032p-1 0x0.0p0 T +CSV proj4-epsg.csv:02007 0 OK -0x1.920aa901df724p20 -0x1.52812ce4f48d3p22 0x0.0p0 0x1.00005e3d26664p0 -0x1.fffffe7210908p-1 0x0.0p0 T +CSV proj4-epsg.csv:02008 0 OK -0x1.ae51535e656e7p20 -0x1.528a3cb3789a2p22 0x0.0p0 0x1.00009da15a35bp0 -0x1.fffffd9f2883ep-1 0x0.0p0 T +CSV proj4-epsg.csv:02009 0 OK -0x1.cabdc122ee444p20 -0x1.5293f32eebd43p22 0x0.0p0 0x1.00010138bdd66p0 -0x1.fffffc80b1875p-1 0x0.0p0 T +CSV proj4-epsg.csv:02010 0 OK -0x1.e752985b229b7p20 -0x1.529e549afcf3cp22 0x0.0p0 0x1.00019a654be68p0 -0x1.fffffb104d74p-1 0x0.0p0 T +CSV proj4-epsg.csv:02011 0 OK -0x1.02094842d9f4bp21 -0x1.52a965952f5cdp22 0x0.0p0 0x1.000281790cf18p0 -0x1.fffff9565bf41p-1 0x0.0p0 T +CSV proj4-epsg.csv:02012 0 OK -0x1.108039f54aedcp21 -0x1.52b52b19d1bd7p22 0x0.0p0 0x1.0003d7fc2e47fp0 -0x1.fffff777a2974p-1 0x0.0p0 T +CSV proj4-epsg.csv:02013 0 OK -0x1.1f0f907fdb22dp21 -0x1.52c1aa8963f5ap22 0x0.0p0 0x1.0005cb8e9abd2p0 -0x1.fffff5ca9ce3p-1 0x0.0p0 T +CSV proj4-epsg.csv:02014 0 OK -0x1.2db8c5ee7e133p21 -0x1.52cee9ae72e3dp22 0x0.0p0 0x1.000899875fe57p0 -0x1.fffff4f7bd3f6p-1 0x0.0p0 T +CSV proj4-epsg.csv:02015 0 OK -0x1.3c7d5fe02b28ap21 -0x1.52dceec3f108p22 0x0.0p0 0x1.000c937ad4b7bp0 -0x1.fffff62913905p-1 0x0.0p0 T +CSV proj4-epsg.csv:02016 0 OK -0x1.4b5ef05151287p21 -0x1.52ebc07c13486p22 0x0.0p0 0x1.001224d86e239p0 -0x1.fffffb4f58994p-1 0x0.0p0 T +CSV proj4-epsg.csv:02017 0 OK -0x1.5a5f166f1a0a1p21 -0x1.52fb6607b97cbp22 0x0.0p0 0x1.0019d9dabc737p0 -0x1.000003c230ac8p0 0x0.0p0 T +CSV proj4-epsg.csv:02018 0 OK -0x1.697f7f73e37a9p21 -0x1.530be71e6abdap22 0x0.0p0 0x1.0024680f88d01p0 -0x1.00000fcacf81dp0 0x0.0p0 T +CSV proj4-epsg.csv:02019 0 OK -0x1.78c1e78d50565p21 -0x1.531d4c06edce2p22 0x0.0p0 0x1.0032b8cbe1889p0 -0x1.000025625de4p0 0x0.0p0 T +CSV proj4-epsg.csv:02020 0 OK -0x1.88281acc5762dp21 -0x1.532f9da0864ddp22 0x0.0p0 0x1.0045f5f09c075p0 -0x1.000049e86b1e4p0 0x0.0p0 T +CSV proj4-epsg.csv:02021 0 OK -0x1.97b3f61fb38fp21 -0x1.5342e56cdfbccp22 0x0.0p0 0x1.005f99780ede9p0 -0x1.000085304f5d4p0 0x0.0p0 T +CSV proj4-epsg.csv:02022 0 OK -0x1.9f6d1e82e04a5p21 -0x1.a31d75ceb3ca2p22 0x1.3c260cdf4p7 0x1.fffffffffffeep-1 -0x1.0000000000042p0 0x1.0p-30 T +CSV proj4-epsg.csv:02023 0 OK -0x1.652a5bbf2fc54p19 0x1.7a4ecb5d0af83p18 0x0.0p0 0x1.0000065594935p0 -0x1.ffffffdd92f0ap-1 0x0.0p0 T +CSV proj4-epsg.csv:02024 0 OK -0x1.a3de69368534fp23 -0x1.eaf3a11ab3f76p19 0x1.d8b1847fa2p9 0x1.b2425fbc7d29ep6 -0x1.82f0ac7b759bfp5 0x1.3f8b9b3afap9 T +CSV proj4-epsg.csv:02025 0 OK -0x1.9ab8ff59e44ccp23 -0x1.58616c4104cf8p19 0x1.a8aa8d186ap9 0x1.b24e969092f51p6 -0x1.82d9237da5946p5 0x1.fc66857694p8 T +CSV proj4-epsg.csv:02026 0 OK -0x1.6fb167e701decp20 -0x1.88c67af7625e9p22 0x0.0p0 0x1.fffffffffffe2p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02027 0 OK 0x1.2a25c04361b4p24 0x1.2b2030461c294p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02028 0 OK -0x1.3117272e3b92ap21 -0x1.e0effc2e40f99p16 0x0.0p0 0x1.001eb8935127p0 -0x1.000008d765e74p0 0x0.0p0 T +CSV proj4-epsg.csv:02029 0 OK -0x1.5f1534f4d44cep21 -0x1.ee55dc6753c08p16 0x0.0p0 0x1.0051dfa997dccp0 -0x1.0000641837537p0 0x0.0p0 T +CSV proj4-epsg.csv:02030 0 OK -0x1.8e6f37f1c5308p21 -0x1.fdf1fd4a4f939p16 0x0.0p0 0x1.00c91f48d1272p0 -0x1.0001d2acb1bf6p0 0x0.0p0 T +CSV proj4-epsg.csv:02031 0 OK -0x1.bf5c897f85151p21 -0x1.08086c82ed89p17 0x0.0p0 0x1.01ce659a5ddcdp0 -0x1.00068a3e0929fp0 0x0.0p0 T +CSV proj4-epsg.csv:02032 0 OK -0x1.f21b6efaaf2dap21 -0x1.1288109ad78d6p17 0x0.0p0 0x1.03ef2483ab654p0 -0x1.0014566438738p0 0x0.0p0 T +CSV proj4-epsg.csv:02033 0 OK -0x1.1379289b227a9p22 -0x1.1eb13206eab83p17 0x0.0p0 0x1.0832f301d7cdap0 -0x1.00398c7ab9b46p0 0x0.0p0 T +CSV proj4-epsg.csv:02034 0 OK -0x1.2f188d7d8760ap22 -0x1.2cc9b7331d70dp17 0x0.0p0 0x1.107c659630077p0 -0x1.00982b98cfa8p0 0x0.0p0 T +CSV proj4-epsg.csv:02035 0 OK -0x1.0f679953a91e8p24 -0x1.3bf720b96b706p19 0x0.0p0 -0x1.68p6 -0x1.46d9a300ca5eap9 0x0.0p0 T +CSV proj4-epsg.csv:02036 0 OK 0x1.8cc56c68e236bp22 -0x1.e0effc2e40f99p16 0x0.0p0 0x1.001eb8935127p0 -0x1.000008d765e74p0 0x0.0p0 T +CSV proj4-epsg.csv:02037 0 OK 0x1.b2cf658595d99p22 -0x1.ee55dc6753c08p16 0x0.0p0 0x1.0051dfa997dccp0 -0x1.0000641837537p0 0x0.0p0 T +CSV proj4-epsg.csv:02038 0 OK 0x1.d82b64071d67cp22 -0x1.fdf1fd4a4f939p16 0x0.0p0 0x1.00c91f48d1272p0 -0x1.0001d2acb1bf6p0 0x0.0p0 T +CSV proj4-epsg.csv:02039 0 OK 0x1.fcbdbb403d758p22 -0x1.08086c82ed89p17 0x0.0p0 0x1.01ce659a5ddeap0 -0x1.00068a3e0929fp0 0x0.0p0 T +CSV proj4-epsg.csv:02040 0 OK 0x1.1033a4415434ap23 -0x1.1288109ad78d6p17 0x0.0p0 0x1.03ef2483ab68dp0 -0x1.0014566438738p0 0x0.0p0 T +CSV proj4-epsg.csv:02041 0 OK 0x1.21826bb26ec2cp23 -0x1.1eb13206eab83p17 0x0.0p0 0x1.0832f301d7cf7p0 -0x1.00398c7ab9b47p0 0x0.0p0 T +CSV proj4-epsg.csv:02042 0 OK 0x1.323739413c4fbp23 -0x1.2cc9b7331d70dp17 0x0.0p0 0x1.107c659630077p0 -0x1.00982b98cfa8p0 0x0.0p0 T +CSV proj4-epsg.csv:02043 0 OK -0x1.1540353505ed5p24 -0x1.82e7e742b2822p21 0x0.0p0 -0x1.651111111110fp6 -0x1.94e6a68c3740cp9 0x0.0p0 T +CSV proj4-epsg.csv:02044 0 OK -0x1.0be421e22621p24 -0x1.7e8a875d09d89p21 0x0.0p0 -0x1.69ccccccccccep6 -0x1.1ebdf3d132b3cp9 0x0.0p0 T +CSV proj4-epsg.csv:02045 0 OK -0x1.0e3a32bca2521p24 -0x1.7f9ede3619d3ep21 0x0.0p0 -0x1.6899999999999p6 -0x1.38e163f706b96p9 0x0.0p0 T +CSV proj4-epsg.csv:02046 0 OK -0x1.0faacaec2daa5p24 -0x1.804a08820fcdap21 0x0.0p0 -0x1.67dddddddddddp6 -0x1.4a0a445a60e07p9 0x0.0p0 T +CSV proj4-epsg.csv:02047 0 OK -0x1.1096975a07555p24 -0x1.80b7df0d986eep21 0x0.0p0 -0x1.6766666666667p6 -0x1.557524fae4112p9 0x0.0p0 T +CSV proj4-epsg.csv:02048 0 OK -0x1.0a58e60d427a4p24 -0x1.7dd4db5f3d5adp21 0x0.0p0 -0x1.6a9999999999ap6 -0x1.0e90d72380f08p9 0x0.0p0 T +CSV proj4-epsg.csv:02049 0 OK -0x1.0e3a32bca2521p24 -0x1.7f9ede3619d3ep21 0x0.0p0 -0x1.6899999999999p6 -0x1.38e163f706b96p9 0x0.0p0 T +CSV proj4-epsg.csv:02050 0 OK -0x1.082db1da4c3dp24 -0x1.7cd6f011b5fbap21 0x0.0p0 -0x1.6bbbbbbbbbbbcp6 -0x1.f275f9a6ad001p8 0x0.0p0 T +CSV proj4-epsg.csv:02051 0 OK -0x1.11835bc5df37ap24 -0x1.81266d17a9e24p21 0x0.0p0 -0x1.66eeeeeeeeeeep6 -0x1.614761b172812p9 0x0.0p0 T +CSV proj4-epsg.csv:02052 0 OK -0x1.0be421e22621p24 -0x1.7e8a875d09d89p21 0x0.0p0 -0x1.69ccccccccccep6 -0x1.1ebdf3d132b3cp9 0x0.0p0 T +CSV proj4-epsg.csv:02053 0 OK -0x1.135fd158e7f1ep24 -0x1.8205b4412e258p21 0x0.0p0 -0x1.65fffffffffffp6 -0x1.7a30ff95cedc5p9 0x0.0p0 T +CSV proj4-epsg.csv:02054 0 OK -0x1.10b85b0ee39c8p24 -0x1.80c79ef0c5ef9p21 0x0.0p0 -0x1.6755555555554p6 -0x1.571f0ce26424ap9 0x0.0p0 T +CSV proj4-epsg.csv:02055 0 OK -0x1.10531f1e5089bp24 -0x1.80986a825e814p21 0x0.0p0 -0x1.678888888888ap6 -0x1.5227a647936e2p9 0x0.0p0 T +CSV proj4-epsg.csv:02056 0 OK -0x1.16547eec0d306p24 -0x1.836a7c58ae1dcp21 0x0.0p0 -0x1.648888888888ap6 -0x1.a5055f24645e1p9 0x0.0p0 T +CSV proj4-epsg.csv:02057 0 OK 0x1.0aedfde342f98p20 -0x1.7506cfc15dc9cp22 0x0.0p0 0x1.fffffeb912d39p-1 -0x1.fffffffc7e18cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02058 0 OK 0x1.61aedae63b892p23 0x1.9026c7c6fe662p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02059 0 OK 0x1.61aedae63b892p23 0x1.9026c7c6fe662p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02060 0 OK 0x1.47d8bf1ca136p22 -0x1.e431fc3ba2aedp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02061 0 OK -0x1.f44992627a748p22 0x1.819c52a930bddp19 0x1.1ae13f46a6p10 0x1.000000000002fp0 -0x1.ffffffffe2ea6p-1 0x1.8p-29 T +CSV proj4-epsg.csv:02062 0 OK -0x1.f449849fd948cp22 0x1.81a79af758af5p19 0x1.13ff732ed4p10 0x1.ffffffffffffep-1 -0x1.ffffffffe2e85p-1 0x1.8p-29 T +CSV proj4-epsg.csv:02063 0 OK -0x1.f4471045a8294p22 0x1.818fad972ae81p19 0x1.4a3c631b3p10 0x1.ffffffffffffdp-1 -0x1.ffffffffe2e8dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02064 0 OK 0x1.1460cee8aa91p22 0x1.2d1b419008b91p23 -0x1.aa68deeeap6 0x1.0000000000029p0 -0x1.fffffffffffcp-1 0x1.0p-29 T +CSV proj4-epsg.csv:02065 0 OK 0x1.91b79632f2eabp23 0x1.27247dc84c5dep23 0x0.0p0 -0x1.9230bf764a42ap4 -0x1.0cb6239d2109ep3 0x0.0p0 T +CSV proj4-epsg.csv:02066 0 OK 0x1.9590024d4403cp23 0x1.282b27ad14cf2p23 0x0.0p0 -0x1.a50e1aeca45afp3 -0x1.12fc74f04c593p2 0x0.0p0 T +CSV proj4-epsg.csv:02067 0 OK 0x1.9ba096958e2ep23 0x1.2909391a3562p23 0x0.0p0 -0x1.ad7fbf25e022cp2 -0x1.3cf08ed297a1p1 0x0.0p0 T +CSV proj4-epsg.csv:02068 0 OK 0x1.a3a30094874c5p23 0x1.29c536f629ad5p23 0x0.0p0 -0x1.9b4cc16e1b4f4p1 -0x1.a974ce556c508p0 0x0.0p0 T +CSV proj4-epsg.csv:02069 0 OK 0x1.ad593c517c0fdp23 0x1.2a64a0e1cd877p23 0x0.0p0 -0x1.4dc3719fbe9b1p0 -0x1.4bd3b2c8a0ef2p0 0x0.0p0 T +CSV proj4-epsg.csv:02070 0 OK 0x1.b88cb3355e30ep23 0x1.2aec15bf3cf36p23 0x0.0p0 -0x1.06fd36c7cb848p-2 -0x1.21b66df1d8259p0 0x0.0p0 T +CSV proj4-epsg.csv:02071 0 OK 0x1.c50d6cc7053bep23 0x1.2b5f73f8f3471p23 0x0.0p0 0x1.45d850b2fa048p-2 -0x1.0ed1aad2e02eep0 0x0.0p0 T +CSV proj4-epsg.csv:02072 0 OK 0x1.2d6770bdfbc87p23 0x1.295f4b9d6d74ep23 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe69832p-1 0x0.0p0 T +CSV proj4-epsg.csv:02073 0 OK 0x1.62c980c22d4cap23 0x1.270e7d2e193bfp23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a6916p-1 0x0.0p0 T +CSV proj4-epsg.csv:02074 0 OK 0x1.02ccdbdd96da6p23 0x1.2ac19752b3aa6p23 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedb85p-1 0x0.0p0 T +CSV proj4-epsg.csv:02075 0 OK 0x1.62c980c22d4cap23 0x1.270e7d2e193bfp23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a6916p-1 0x0.0p0 T +CSV proj4-epsg.csv:02076 0 OK 0x1.abd2139e015f8p23 0x1.2267a16ee3222p23 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4a8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02077 0 OK 0x1.fae10c0067f43p23 -0x1.077b947924209p19 0x0.0p0 0x1.7ffffffffffffp6 -0x1.9db3b1c9b7d83p7 0x0.0p0 T +CSV proj4-epsg.csv:02078 0 OK 0x1.02ccdbdd8a582p23 0x1.2ac19752b3f63p23 0x0.0p0 0x1.ffffffffda4a7p-1 -0x1.ffffffffedb92p-1 0x0.0p0 T +CSV proj4-epsg.csv:02079 0 OK 0x1.bdf145424c521p22 0x1.2baad25cb4f17p23 0x0.0p0 0x1.fffffffffcf09p-1 -0x1.fffffffffeb4cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02080 0 OK 0x1.abd2139e015f8p23 0x1.2267a16ee3222p23 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4a8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02081 0 OK 0x1.62c980c22d4cap23 0x1.270e7d2e193bfp23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a6916p-1 0x0.0p0 T +CSV proj4-epsg.csv:02082 0 OK 0x1.c987cee806a87p21 0x1.2d5a19f7de02p23 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000009p0 0x0.0p0 T +CSV proj4-epsg.csv:02083 0 OK 0x1.334b29e5fc789p23 0x1.23164e8e78f44p18 -0x1.15a64be3f8p8 0x1.fffffffffff39p-1 -0x1.ffffffffe0e1bp-1 0x1.8p-29 F +CSV proj4-epsg.csv:02084 0 OK 0x1.309ad4d6c92e6p23 0x1.361cc74a75c33p18 -0x1.15a64be3f8p8 0x1.000000000000fp0 -0x1.ffffffffe0e8dp-1 0x1.8p-29 F +CSV proj4-epsg.csv:02085 0 OK 0x1.49196cecbe225p23 0x1.580f8a5f4247fp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:02086 0 OK 0x1.4877ea530e1f9p23 0x1.4b6c1bcb26f6fp19 -0x1.15a64be3f8p8 0x1.fffffffffff39p-1 -0x1.ffffffffe0c5p-1 0x1.8p-29 F +CSV proj4-epsg.csv:02087 0 OK 0x1.43cde4bd02d7cp23 0x1.10222f5b60dp19 -0x1.15a64be3f8p8 0x1.000000000000fp0 -0x1.ffffffffe0c5p-1 0x1.8p-29 F +CSV proj4-epsg.csv:02088 0 OK 0x1.3859f4145b3fap23 0x1.d32ab8137da2ep18 -0x1.15a64be3f8p8 0x1.0000000000049p0 -0x1.ffffffffe0cc3p-1 0x1.8p-29 F +CSV proj4-epsg.csv:02089 0 OK 0x1.379625ace6328p23 0x1.6b1d4a918dbbap18 -0x1.15a64be3f8p8 0x1.fffffffffffacp-1 -0x1.ffffffffe0fe7p-1 0x1.0p-28 F +CSV proj4-epsg.csv:02090 0 OK 0x1.1947c2de66d6fp24 -0x1.271f6d2218917p21 0x0.0p0 0x1.6d78fa58f7121p6 -0x1.8958a7d6fbdcbp9 0x0.0p0 T +CSV proj4-epsg.csv:02091 0 OK 0x1.24151191a9a21p23 0x1.74f04315363b2p17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0e4bp-1 0x0.0p0 F +CSV proj4-epsg.csv:02092 0 EXC:org.locationtech.proj4j.ProjectionException 0x1.4f180dd4c830cp23 -0x1.3432d298300e8p17 0x0.0p0 NaN NaN NaN F +CSV proj4-epsg.csv:02093 0 OK 0x1.3b93e9655e472p21 -0x1.ccf6d55f5577cp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02094 0 OK 0x1.15cd1acc073fp19 -0x1.29f914c35bc52p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02095 0 OK -0x1.978a422d8ac4p20 -0x1.6a2f5c96f292ep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02096 0 OK 0x1.23f21cd178a08p22 -0x1.5c74d34eb35b5p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:02097 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02098 0 OK -0x1.9f6d1e82e04a1p21 -0x1.a31d75ceb3ca2p22 0x1.3c260cdf4p7 0x1.fffffffffffd2p-1 -0x1.0000000000042p0 0x1.0p-30 T +CSV proj4-epsg.csv:02099 0 OK -0x1.9f6d1e82e04a1p21 -0x1.a31d75ceb3ca2p22 0x1.3c260cdf4p7 0x1.fffffffffffd2p-1 -0x1.0000000000042p0 0x1.0p-30 T +CSV proj4-epsg.csv:02100 0 OK 0x1.37dcbd58e5914p20 -0x1.b1d0dec4b081fp16 0x1.a4d2328e3p6 0x1.fffffffffc9d3p-1 -0x1.fffffff8fd87ap-1 0x1.d84c8p-11 T +CSV proj4-epsg.csv:02101 0 OK 0x1.3d8895b28f46p18 0x1.48d4db7409202p22 0x0.0p0 0x1.0000047842091p0 -0x1.ffffffe76625fp-1 0x0.0p0 T +CSV proj4-epsg.csv:02102 0 OK 0x1.5365b60ffe678p23 0x1.2c3729b072eb2p23 0x1.5cc2ac3e6p5 0x1.000000000003fp0 -0x1.ffffffffffc54p-1 0x1.0p-29 F +CSV proj4-epsg.csv:02103 0 OK 0x1.02cd07659fa7cp23 0x1.2ac22c0845cecp23 0x1.5cc2ac3e6p5 0x1.ffffffffda3f6p-1 -0x1.ffffffffedb97p-1 0x0.0p0 T +CSV proj4-epsg.csv:02104 0 OK 0x1.bdf18a37564c9p22 0x1.2bab52e96d7cap23 0x1.58cfb3ee8p5 0x1.fffffffffced3p-1 -0x1.fffffffffeb92p-1 0x0.0p0 T +CSV proj4-epsg.csv:02105 0 OK 0x1.7f7a63c1ceddfp22 0x1.2c4df89c5239dp23 0x1.5cc2ac3e6p5 0x1.ffffffffffaacp-1 -0x1.ffffffffffddap-1 0x1.0p-30 T +CSV proj4-epsg.csv:02106 0 OK 0x1.478bf6daa4ecdp22 0x1.2cc38d3d50331p23 0x1.5cc2ac3e6p5 0x1.fffffffffff98p-1 -0x1.fffffffffffe9p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02107 0 OK 0x1.1463c60e9c7d4p22 0x1.2d1a39b51e564p23 0x1.5cc2ac3e6p5 0x1.fffffffffff5fp-1 -0x1.000000000000ep0 0x1.0p-29 T +CSV proj4-epsg.csv:02108 0 OK 0x1.02cff4d0e9761p23 0x1.2ac182dcd20c4p23 0x0.0p0 0x1.ffffffffd92cp-1 -0x1.ffffffffed2e9p-1 0x0.0p0 T +CSV proj4-epsg.csv:02109 0 OK 0x1.bdf63008a1acap22 0x1.2baac5ce4220cp23 0x0.0p0 0x1.fffffffffcd78p-1 -0x1.fffffffffeab6p-1 0x0.0p0 T +CSV proj4-epsg.csv:02110 0 OK 0x1.7f7e22cb89bdep22 0x1.2c4d7f5c8f199p23 0x0.0p0 0x1.ffffffffffaaep-1 -0x1.ffffffffffdfp-1 0x0.0p0 T +CSV proj4-epsg.csv:02111 0 OK 0x1.478f02e88ece5p22 0x1.2cc321022e3ep23 0x0.0p0 0x1.fffffffffff61p-1 -0x1.fffffffffffd7p-1 0x0.0p0 T +CSV proj4-epsg.csv:02112 0 OK -0x1.0a82c7b84020bp22 -0x1.2ca35ade12886p23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.fffffffffff64p-1 0x0.0p0 F +CSV proj4-epsg.csv:02113 0 OK -0x1.aeb543db2a3f4p21 -0x1.2cfa0f32ef8bep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02114 0 OK -0x1.4f75cee806a84p21 -0x1.2d3a4dbd6fbfcp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffeep-1 0x0.0p0 F +CSV proj4-epsg.csv:02115 0 OK 0x1.49186f0e48bfcp23 0x1.581441b88230cp19 -0x1.15a64be3f8p8 0x1.fffffffffffacp-1 -0x1.ffffffffe0cc3p-1 0x1.8p-29 F +CSV proj4-epsg.csv:02116 0 OK 0x1.0fdcee8be8047p21 -0x1.cb7c3969d8672p16 -0x1.07cdced128p7 0x1.00031be00ef1ep0 -0x1.fffff86a6ac3fp-1 -0x1.2accp-16 T +CSV proj4-epsg.csv:02117 0 OK 0x1.31455d7d3a5f4p21 -0x1.e08df182a56c8p16 -0x1.07cdced128p7 0x1.001eb58245b05p0 -0x1.000008d53645p0 -0x1.14d83p-10 T +CSV proj4-epsg.csv:02118 0 OK 0x1.4dff22fcca4dfp21 -0x1.fd89b16ee3223p16 -0x1.07cdced128p7 0x1.00c90e90983fap0 -0x1.0001d2219e3d9p0 -0x1.e727dcp-8 T +CSV proj4-epsg.csv:02119 0 OK 0x1.6464d06cfeaa6p21 -0x1.124fb56022164p17 -0x1.07cdced128p7 0x1.03eedb81a62bdp0 -0x1.00145071d34a8p0 -0x1.324fb7p-5 T +CSV proj4-epsg.csv:02120 0 OK -0x1.b0d622e82ff72p20 -0x1.cb7c3969d8672p16 -0x1.07cdced128p7 0x1.00031be00ef1ep0 -0x1.fffff86a6ac3fp-1 -0x1.2accp-16 T +CSV proj4-epsg.csv:02121 0 OK -0x1.3114a282c5a0cp21 -0x1.e08df182a56c8p16 -0x1.07cdced128p7 0x1.001eb58245b05p0 -0x1.000008d53645p0 -0x1.14d83p-10 T +CSV proj4-epsg.csv:02122 0 OK -0x1.8e6cdd0335b21p21 -0x1.fd89b16ee3223p16 -0x1.07cdced128p7 0x1.00c90e90983fap0 -0x1.0001d2219e3d9p0 -0x1.e727dcp-8 T +CSV proj4-epsg.csv:02123 0 OK -0x1.f2192f930155ap21 -0x1.124fb56022164p17 -0x1.07cdced128p7 0x1.03eedb81a62bdp0 -0x1.00145071d34a8p0 -0x1.324fb7p-5 T +CSV proj4-epsg.csv:02124 0 OK 0x1.3f097745f4024p22 -0x1.cb7c3969d8672p16 -0x1.07cdced128p7 0x1.00031be00ef2bp0 -0x1.fffff86a6ac3fp-1 -0x1.2accp-16 T +CSV proj4-epsg.csv:02125 0 OK 0x1.6627884970232p22 -0x1.d5228793e3a26p16 -0x1.07cdced128p7 0x1.000a69cf37be9p0 -0x1.fffff53a86bb3p-1 -0x1.3338cp-12 T +CSV proj4-epsg.csv:02126 0 OK 0x1.8cc6aebe9d2fap22 -0x1.e08df182a56c8p16 -0x1.07cdced128p7 0x1.001eb58245b05p0 -0x1.000008d53645p0 -0x1.14d83p-10 T +CSV proj4-epsg.csv:02127 0 OK 0x1.b2d09c9ebd093p22 -0x1.edf0ed694e733p16 -0x1.07cdced128p7 0x1.0051d840315fap0 -0x1.000063fa8578dp0 -0x1.85d59p-9 T +CSV proj4-epsg.csv:02128 0 OK 0x1.d82c917e6527p22 -0x1.fd89b16ee3223p16 -0x1.07cdced128p7 0x1.00c90e9098416p0 -0x1.0001d2219e3dap0 -0x1.e727dcp-8 T +CSV proj4-epsg.csv:02129 0 OK 0x1.fcbee0da29446p22 -0x1.07d2537216f32p17 -0x1.07cdced128p7 0x1.01ce41e5fbd32p0 -0x1.0006884f4d46dp0 -0x1.195443p-6 T +CSV proj4-epsg.csv:02130 0 OK 0x1.1034341b3faaap23 -0x1.124fb56022164p17 -0x1.07cdced128p7 0x1.03eedb81a62bdp0 -0x1.00145071d34a8p0 -0x1.324fb7p-5 T +CSV proj4-epsg.csv:02131 0 OK -0x1.b0d622e82ff72p20 -0x1.cb7c3969d8672p16 -0x1.07cdced128p7 0x1.00031be00ef1ep0 -0x1.fffff86a6ac3fp-1 -0x1.2accp-16 T +CSV proj4-epsg.csv:02132 0 OK -0x1.0440ef6d1fb9bp21 -0x1.d5228793e3a26p16 -0x1.07cdced128p7 0x1.000a69cf37bf6p0 -0x1.fffff53a86bb3p-1 -0x1.3338cp-12 T +CSV proj4-epsg.csv:02133 0 OK -0x1.3114a282c5a0cp21 -0x1.e08df182a56c8p16 -0x1.07cdced128p7 0x1.001eb58245b05p0 -0x1.000008d53645p0 -0x1.14d83p-10 T +CSV proj4-epsg.csv:02134 0 OK -0x1.5f12c6c285edap21 -0x1.edf0ed694e733p16 -0x1.07cdced128p7 0x1.0051d840315fap0 -0x1.000063fa8578dp0 -0x1.85d59p-9 T +CSV proj4-epsg.csv:02135 0 OK -0x1.8e6cdd0335b21p21 -0x1.fd89b16ee3223p16 -0x1.07cdced128p7 0x1.00c90e90983fap0 -0x1.0001d2219e3d9p0 -0x1.e727dcp-8 T +CSV proj4-epsg.csv:02136 0 OK -0x1.bf5a3e4bad775p21 -0x1.07d2537216f32p17 -0x1.07cdced128p7 0x1.01ce41e5fbd17p0 -0x1.0006884f4d46dp0 -0x1.195443p-6 T +CSV proj4-epsg.csv:02137 0 OK -0x1.f2192f930155ap21 -0x1.124fb56022164p17 -0x1.07cdced128p7 0x1.03eedb81a62bdp0 -0x1.00145071d34a8p0 -0x1.324fb7p-5 T +CSV proj4-epsg.csv:02138 0 OK 0x1.e669b0d9441e6p24 -0x1.05b797cd47edfp23 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000006p0 0x0.0p0 T +CSV proj4-epsg.csv:02139 0 OK 0x1.cd6c07137ca88p25 -0x1.e4212dbfa0deep22 0x0.0p0 0x1.6d78fa58f7121p6 -0x1.8958a7d6fbdcbp9 0x0.0p0 T +CSV proj4-epsg.csv:02140 0 OK -0x1.319244694df78p17 -0x1.b7199735751c6p16 0x0.0p0 0x1.000003f802b03p0 -0x1.ffffffea150dap-1 0x0.0p0 T +CSV proj4-epsg.csv:02141 0 OK 0x1.935bf185db195p25 -0x1.00af7649e5733p24 0x0.0p0 0x1.8155555555554p6 -0x1.78979e17118bep7 0x0.0p0 T +CSV proj4-epsg.csv:02142 0 OK 0x1.ab56f61392cbp25 -0x1.034749b9a3d52p24 0x0.0p0 0x1.78fffffffffffp6 -0x1.55272b6261089p8 0x0.0p0 T +CSV proj4-epsg.csv:02143 0 OK 0x1.d115855838778p25 -0x1.0799bb3dc2543p24 0x0.0p0 0x1.6cffffffffffep6 -0x1.97209fa9c5584p9 0x0.0p0 T +CSV proj4-epsg.csv:02144 0 OK -0x1.bcbf7570aa66p15 -0x1.b0f4726e67719p16 -0x1.48cc11fb48p7 0x1.000000082331bp0 -0x1.ffffffffdc9ffp-1 -0x1.0p-28 T +CSV proj4-epsg.csv:02145 0 OK -0x1.2f2c46709a9f5p22 0x1.2c78e37c54fp23 0x0.0p0 0x1.0000000000141p0 -0x1.fffffffffff16p-1 0x0.0p0 T +CSV proj4-epsg.csv:02146 0 OK 0x1.884689ac7aa9ap20 -0x1.b3ead55faa9a1p16 -0x1.0d9bb9fp7 0x1.000000a32f2d3p0 -0x1.fffffff8d893fp-1 0x1.ba1dp-14 T +CSV proj4-epsg.csv:02147 0 OK 0x1.40909242e436ep21 -0x1.ae171a897163ap21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02148 0 OK 0x1.873cdc24c08e2p21 -0x1.2589750c25cfep21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02149 0 OK 0x1.40909242e436ep21 -0x1.ae171a897163ap21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02150 0 OK 0x1.873cdc24c08e2p21 -0x1.2589750c25cfep21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02151 0 OK 0x1.873cdc24c08e2p21 -0x1.2589750c25cfep21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02152 0 OK 0x1.40909242e436ep21 -0x1.ae171a897163ap21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02153 0 OK 0x1.873cdc24c08e2p21 -0x1.2589750c25cfep21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02154 0 OK 0x1.40909242e436ep21 -0x1.ae171a897163ap21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02155 0 OK 0x1.2e10933097431p23 0x1.2dcd1811cee9ep23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 T +CSV proj4-epsg.csv:02156 0 OK -0x1.3e501ebcc3f52p19 -0x1.7b46d0ea9dcc5p22 -0x1.48cc11fb48p7 0x1.ffffffffffff7p-1 -0x1.ffffffffe1dc7p-1 0x1.0p-30 F +CSV proj4-epsg.csv:02157 0 OK -0x1.6b3853a7eb662p22 0x1.2be74f4fa87a2p23 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff6f5p-1 0x0.0p0 T +CSV proj4-epsg.csv:02158 0 OK 0x1.344a7b88575a7p25 -0x1.f902ee9ffe274p23 0x0.0p0 -0x1.bf7ce334221d7p4 -0x1.2f04f08531c0bp3 0x0.0p0 T +CSV proj4-epsg.csv:02159 0 OK 0x1.dd417e43763d5p24 -0x1.b005f8f714d3dp16 0x0.0p0 0x1.000000000d91ap0 -0x1.ffffffffffe5dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02160 0 OK 0x1.e729185fcd8fbp24 -0x1.bd11083ac668cp16 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc43p-1 0x0.0p0 T +CSV proj4-epsg.csv:02161 0 OK 0x1.dd417e43763d5p24 -0x1.b005f8f714d3dp16 0x0.0p0 0x1.000000000d91ap0 -0x1.ffffffffffe5dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02162 0 OK 0x1.e248e2ca647cp24 -0x1.b4079b4586783p16 0x0.0p0 0x1.000000a376922p0 -0x1.fffffffc7e186p-1 0x0.0p0 T +CSV proj4-epsg.csv:02163 0 OK 0x1.e729185fcd8fbp24 -0x1.bd11083ac668cp16 0x0.0p0 0x1.0000295a4e1ffp0 -0x1.ffffff3d0bc43p-1 0x0.0p0 T +CSV proj4-epsg.csv:02164 0 OK 0x1.344a7b88575a7p25 -0x1.f902ee9ffe274p23 0x0.0p0 -0x1.bf7ce334221d7p4 -0x1.2f04f08531c0bp3 0x0.0p0 T +CSV proj4-epsg.csv:02165 0 OK 0x1.344a7b88575a7p25 -0x1.f902ee9ffe274p23 0x0.0p0 -0x1.bf7ce334221d7p4 -0x1.2f04f08531c0bp3 0x0.0p0 T +CSV proj4-epsg.csv:02166 0 OK -0x1.7fbc92c99b5a6p18 -0x1.f5e53dc890bb6p21 -0x1.1ed6d55bp6 0x1.000000b3944b7p0 -0x1.00000002156e9p0 0x1.671fp-10 T +CSV proj4-epsg.csv:02167 0 OK 0x1.d6384c4f546e4p20 -0x1.bcf36c7b4c54bp16 -0x1.0d9bb9fp7 0x1.00002952d18dfp0 -0x1.ffffff39b7828p-1 0x1.9fdep-14 T +CSV proj4-epsg.csv:02168 0 OK 0x1.88468c636e048p20 -0x1.b3e7892625c28p16 -0x1.0a7b7664e8p7 0x1.000000a3490dcp0 -0x1.fffffffc7fcfcp-1 -0x1.68p-24 T +CSV proj4-epsg.csv:02169 0 OK 0x1.d6384efa7fdd6p20 -0x1.bcf00eae68a32p16 -0x1.0a7b7664e8p7 0x1.00002952ec55fp0 -0x1.ffffff3d566bcp-1 -0x1.607p-18 T +CSV proj4-epsg.csv:02170 0 OK 0x1.3e35291e0ea73p21 -0x1.b4298c06f7d32p16 0x0.0p0 0x1.000000a2efc74p0 -0x1.fffffffc8211dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02171 0 OK 0x1.8ef27b48c5224p21 -0x1.b8070b06fb9dbp16 0x0.0p0 0x1.00000651ff0b3p0 -0x1.ffffffddb7deep-1 0x0.0p0 T +CSV proj4-epsg.csv:02172 0 OK 0x1.8ef27b48c5224p21 -0x1.b8070b06fb9dbp16 0x0.0p0 0x1.00000651ff0b3p0 -0x1.ffffffddb7deep-1 0x0.0p0 T +CSV proj4-epsg.csv:02173 0 OK 0x1.df42cd4f52482p21 -0x1.bd33a0827db83p16 0x0.0p0 0x1.0000294a05d84p0 -0x1.ffffff3de1984p-1 0x0.0p0 T +CSV proj4-epsg.csv:02174 0 OK 0x1.3e3544d63d54dp21 -0x1.b3ead55faa9a1p16 -0x1.0d9bb9fp7 0x1.000000a32f2d3p0 -0x1.fffffff8d893fp-1 0x1.ba1dp-14 T +CSV proj4-epsg.csv:02175 0 OK 0x1.8ef1363fe0d26p21 -0x1.b7c7ad797d16cp16 -0x1.0d9bb9fp7 0x1.0000065418a3fp0 -0x1.ffffffd9fb628p-1 0x1.b66ep-14 T +CSV proj4-epsg.csv:02176 0 OK 0x1.df402627aa372p21 -0x1.bcf36c7b4c54bp16 -0x1.0d9bb9fp7 0x1.00002952d18dfp0 -0x1.ffffff39b7828p-1 0x1.9fdep-14 T +CSV proj4-epsg.csv:02177 0 OK 0x1.3e354631b7024p21 -0x1.b3e7892625c28p16 -0x1.0a7b7664e8p7 0x1.000000a3490dcp0 -0x1.fffffffc7fcfcp-1 -0x1.68p-24 T +CSV proj4-epsg.csv:02178 0 OK 0x1.8ef1379807ceap21 -0x1.b7c459baacb72p16 -0x1.0a7b7664e8p7 0x1.000006543298cp0 -0x1.ffffffdda17c8p-1 -0x1.b2p-21 T +CSV proj4-epsg.csv:02179 0 OK 0x1.df40277d3feebp21 -0x1.bcf00eae68a32p16 -0x1.0a7b7664e8p7 0x1.00002952ec55fp0 -0x1.ffffff3d566bcp-1 -0x1.607p-18 T +CSV proj4-epsg.csv:02180 0 OK 0x1.da54497e403e3p20 -0x1.b337805baca37p16 0x1.a4d2328e3p6 0x1.00000007feca6p0 -0x1.fffffff8da78bp-1 0x1.d84cep-11 T +CSV proj4-epsg.csv:02181 0 OK 0x1.3e3596d46f72ap21 -0x1.b5d6b6b36e3cbp16 0x1.a4d2328e3p6 0x1.000000a2d7621p0 -0x1.fffffff57c564p-1 0x1.d852ap-11 T +CSV proj4-epsg.csv:02182 0 OK 0x1.8ef2ed3b41e0ap21 -0x1.b9b7ffd460a42p16 0x1.a4d2328e3p6 0x1.000006519e22bp0 -0x1.ffffffd6943eep-1 0x1.d8888p-11 T +CSV proj4-epsg.csv:02183 0 OK 0x1.df4343f789787p21 -0x1.bee9a8dbff5f7p16 0x1.a4d2328e3p6 0x1.0000294812232p0 -0x1.ffffff362168p-1 0x1.d9cfep-11 T +CSV proj4-epsg.csv:02184 0 OK 0x1.37dcbd58e5914p20 -0x1.b1d0dec4b081fp16 0x1.a4d2328e3p6 0x1.fffffffffc9d3p-1 -0x1.fffffff8fd87ap-1 0x1.d84c8p-11 T +CSV proj4-epsg.csv:02185 0 OK 0x1.da5375b73e5e4p20 -0x1.b18ce459271f4p16 0x0.0p0 0x1.000000080e7cep0 -0x1.ffffffffdcf8cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02186 0 OK 0x1.3e35291e0ea73p21 -0x1.b4298c06f7d32p16 0x0.0p0 0x1.000000a2efc74p0 -0x1.fffffffc8211dp-1 0x0.0p0 T +CSV proj4-epsg.csv:02187 0 OK 0x1.8ef27b48c5224p21 -0x1.b8070b06fb9dbp16 0x0.0p0 0x1.00000651ff0b3p0 -0x1.ffffffddb7deep-1 0x0.0p0 T +CSV proj4-epsg.csv:02188 0 OK 0x1.df42cd4f52482p21 -0x1.bd33a0827db83p16 0x0.0p0 0x1.0000294a05d84p0 -0x1.ffffff3de1984p-1 0x0.0p0 T +CSV proj4-epsg.csv:02189 0 OK 0x1.60d037913c217p19 -0x1.2dad27d3a393ep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02190 0 OK -0x1.f1feca377d1f6p21 -0x1.1280ddec11006p17 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffe2p-1 0x0.0p0 T +CSV proj4-epsg.csv:02191 0 OK -0x1.af7000843bebfp22 -0x1.84dee0d9cf3e1p17 0x0.0p0 0x1.0000000007e41p0 -0x1.fffffffff8c1cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02192 0 OK -0x1.652a5bbf2fc54p19 0x1.2dbd365ae857cp23 0x0.0p0 0x1.0000065594935p0 -0x1.ffffffdd92f18p-1 0x0.0p0 T +CSV proj4-epsg.csv:02193 0 OK -0x1.5f0aa81991009p21 0x1.2d506d968baeep23 0x0.0p0 0x1.0051dfa997dccp0 -0x1.0000641837545p0 0x0.0p0 T +CSV proj4-epsg.csv:02194 0 OK 0x1.bdf18d5102141p22 0x1.2bab51ecd9b28p23 0x1.5cc2ac3e6p5 0x1.fffffffffcf05p-1 -0x1.fffffffffeb74p-1 0x1.8p-29 T +CSV proj4-epsg.csv:02195 0 OK 0x1.abd26cc22813dp23 0x1.2268f723ba4efp23 0x1.5cc2ac3e6p5 0x1.ffffe013905e2p-1 -0x1.ffffd22dfdb8ep-1 -0x1.12p-20 T +CSV proj4-epsg.csv:02196 0 OK 0x1.62c9c2230b2afp23 0x1.270f67ab8f78ap23 0x1.5cc2ac3e6p5 0x1.ffffffa69553ep-1 -0x1.ffffffb7a9241p-1 -0x1.cp-28 T +CSV proj4-epsg.csv:02197 0 OK 0x1.2d67a570c45c7p23 0x1.2960006ff90dp23 0x1.5cc2ac3e6p5 0x1.fffffffd54035p-1 -0x1.fffffffe6995p-1 0x0.0p0 T +CSV proj4-epsg.csv:02198 0 OK -0x1.2f2ef9af884f5p22 0x1.2c7bb369c2e0fp23 0x1.fcea4cc0fp6 0x1.000000000013p0 -0x1.fffffffffff34p-1 0x1.0p-28 T +CSV proj4-epsg.csv:02199 0 OK 0x1.536592498b98p23 0x1.2c36b6eeb558ep23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffffb86p-1 0x0.0p0 F +CSV proj4-epsg.csv:02200 0 OK -0x1.7ed30a6291d5cp23 -0x1.aba9905d11bcap17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02201 0 OK 0x1.67a206236d5ap23 0x1.4b851c822b7c7p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02202 0 OK 0x1.e990dc5b9605cp22 -0x1.0ac22c7f6ab05p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02203 0 OK -0x1.93516fef10356p22 -0x1.299e2a081ebcfp23 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02204 0 OK -0x1.76ed1d383749bp23 0x1.cbf0d0a6012c4p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02205 0 OK -0x1.426f893fd471dp20 0x1.9c1f8b76d4e29p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02206 0 OK 0x1.623599f7075dep23 0x1.512813019137cp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02207 0 OK 0x1.cb70d48c76b2bp22 -0x1.d027a860f14f4p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02208 0 OK -0x1.79c99f0a726e7p22 -0x1.04170f599f6d4p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02209 0 OK -0x1.6da7d49cbc1cdp23 0x1.e1a073d468475p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02210 0 OK -0x1.28fbe5653af77p21 0x1.a63d480e22ac1p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02211 0 OK 0x1.60101bd00c10fp23 0x1.4528662557952p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02212 0 OK 0x1.a958f41e828p22 -0x1.8eab4a5c32b4fp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02213 0 OK -0x1.5cc114b857f15p22 -0x1.bfc1105d91c13p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02214 0 OK -0x1.665cffb2ab4ffp23 0x1.d620359626f9fp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02215 0 OK -0x1.f41eeaadbc995p21 0x1.ab50db03bbd2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02216 0 OK 0x1.f68dc149c261p22 0x1.943d834784199p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02217 0 OK 0x1.be3b056318d97p23 0x1.0fd1b157ff0dfp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02218 0 OK 0x1.187719b52977ep23 -0x1.0848875a82dd2p23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02219 0 OK -0x1.ad8b2cc99e54cp20 -0x1.3a393d502d7a3p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02220 0 OK -0x1.3fb6b63cf3624p23 0x1.37eedac0fd26cp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02221 0 OK 0x1.e98da7b117969p24 -0x1.125096a9d8c73p23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02222 0 OK 0x1.b392135b196b6p24 -0x1.07903eee55eecp22 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02223 0 OK 0x1.63dcdeeffd6c7p24 -0x1.1138154897296p23 0x0.0p0 0x1.000000000000ep0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02224 0 OK 0x1.39c4dbd39e25ep25 0x1.c3e8be3afd24p17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02225 0 OK 0x1.2c8dd30cc0f54p25 -0x1.2aa8cd63d9fa2p22 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02226 0 OK 0x1.1168f1b2b049dp25 -0x1.c8e3188b8253p22 0x0.0p0 0x1.000000000002ap0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02227 0 OK 0x1.dfd07a22178a4p24 0x1.14e248d8e6e1cp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02228 0 OK 0x1.cca3094033f7p24 -0x1.a22cfe1343924p21 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02229 0 OK 0x1.a4dbe9d81365p24 -0x1.5df0ba5ced736p22 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02230 0 OK 0x1.8c99e9e170e8ep25 0x1.6f286effe734cp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02231 0 OK 0x1.8864e8d4c70bp25 -0x1.82289e8903298p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02232 0 OK 0x1.7d93a89ce7913p25 -0x1.bfa4dbdc640b8p21 0x0.0p0 0x1.000000000005cp0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02233 0 OK 0x1.13154b09f18e4p25 0x1.bc6f73f9c90ccp20 0x0.0p0 0x1.000000000005cp0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02234 0 OK 0x1.0f733cdb36b98p25 -0x1.3455eb4dbab98p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02235 0 OK 0x1.07393322b7ca7p25 -0x1.1472f39f61c84p21 0x0.0p0 0x1.000000000005cp0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02236 0 OK 0x1.33d33ba05ffccp24 0x1.274cf5fe2eedcp21 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02237 0 OK 0x1.2cfab0df5d2f2p24 0x1.84a84a21ccc9p18 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02238 0 OK 0x1.baff1a53c82b1p24 0x1.da41272f7dd16p21 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02239 0 OK 0x1.ba0a2a349dd06p24 0x1.059f8d381db1ep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02240 0 OK 0x1.25c7a1cffafaep24 -0x1.0e04737e38662p23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02241 0 OK 0x1.be276d76827d6p22 -0x1.aa253f87cc732p22 0x0.0p0 0x1.fffffffffffb7p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02242 0 OK 0x1.77f3cefd4270ap24 -0x1.6d3cd88ddd9dep22 0x0.0p0 0x1.fffffffffffc5p-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02243 0 OK 0x1.4fa5e569a0475p24 -0x1.0457816f99042p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02244 0 OK 0x1.0fc854274c0bap23 -0x1.03eafaccf51a2p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02245 0 OK 0x1.b6dc3fefabbe4p22 -0x1.51b7b49327c4cp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02246 0 OK 0x1.bd3a4cd4b4c1p23 -0x1.121756b666a48p22 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02247 0 OK 0x1.a65410ffae307p23 0x1.bc40f4c41e138p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02248 0 OK 0x1.e06446a746e9cp21 -0x1.8c1a895b41a1ap21 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02249 0 OK 0x1.8584b037f2568p21 0x1.4959a33b4bc59p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02250 0 OK 0x1.63e73d6e6db9ep22 0x1.1925ed313537ep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02251 0 OK 0x1.64712a83afaeap23 0x1.babd313d69cf3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02252 0 OK 0x1.376bb291c2a9dp24 -0x1.a1fc428e95508p19 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02253 0 OK 0x1.3823e61b57506p24 0x1.c2a7b59224cf9p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02254 0 OK 0x1.56a27351db3f9p24 0x1.07b4be937944ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02255 0 OK 0x1.92e850eed03cap24 0x1.9287d1c39c708p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02256 0 OK 0x1.e82351202c2cep24 0x1.faa50c79f8978p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02257 0 OK 0x1.284c62ad0e748p25 0x1.180b884a1cdfep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02258 0 OK 0x1.78391e7def64ep22 -0x1.1b4d4dd67a9cp17 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02259 0 OK 0x1.77d4663cec424p22 0x1.953deaa3e332ep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02260 0 OK 0x1.c2d4517a61f9ep22 0x1.c6bc76c27967p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02261 0 OK 0x1.3364996660f98p23 0x1.61e1d8a4d6b7ap23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02262 0 OK 0x1.af547302f3c37p23 0x1.d1a18d48939f2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02263 0 OK 0x1.26d422486cdc8p24 0x1.1295aeae3c86ep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02264 0 OK 0x1.8155acb3ef6a5p24 0x1.29391b7b71746p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02265 0 OK 0x1.06aa952e794f2p25 0x1.1c7159dba1626p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02266 0 OK 0x1.2ac53c6ef20aap25 0x1.02c7c2ebfdf12p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02267 0 OK 0x1.2b5293596426ap24 0x1.2e03932c067aep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02268 0 OK 0x1.760ee476ea7c4p24 0x1.107ba51ba9b66p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02269 0 OK 0x1.151569a3c2f5ep25 0x1.08db0812cdb14p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02270 0 OK 0x1.8c89ead49b448p24 0x1.0a29a165b62d4p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02271 0 OK 0x1.b6a6a0f836488p24 0x1.513b6bfe7b66p17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02272 0 OK 0x1.0e2059f92f752p25 0x1.799dbea2bf8c1p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02273 0 OK 0x1.301b8dcb0a496p25 0x1.8e75b6814bd3p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02274 0 OK 0x1.39c4dbd39e25ep25 0x1.c3e8be3afd24p17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02275 0 OK 0x1.7575c33d5d0f2p24 0x1.97b3c59a33a91p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02276 0 OK 0x1.b3904cae182fbp24 0x1.07b4be93777e2p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02277 0 OK 0x1.d164aa50b05fcp24 0x1.a9df711b2822fp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02278 0 OK 0x1.4ac672057f39ep25 0x1.be25b421c37bcp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02279 0 OK 0x1.67724e237f7bcp25 0x1.505e65607cd88p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02280 0 OK 0x1.7a707bf1f17bep25 0x1.ae32372cc459p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02281 0 OK 0x1.83588ffcff1a5p25 0x1.7e542216da5ap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02282 0 OK 0x1.b19d41528d5ep24 0x1.dde658e56dbcep23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02283 0 OK 0x1.e7e3e5f8c413ap24 0x1.78401461aa0adp23 0x0.0p0 0x1.0000000000079p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02284 0 OK 0x1.06cb536d8f974p25 0x1.08f74845d3699p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02285 0 OK 0x1.1103bb422490ep25 0x1.352ac212fd9a8p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02286 0 OK 0x1.450fe5477666ep24 -0x1.1919db3de3981p23 0x0.0p0 0x1.fffffffffffd3p-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02287 0 OK 0x1.fd2a326c0191p23 0x1.a4d1f56c25bbcp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02288 0 OK 0x1.7a88124d2787ep24 0x1.8b023c3357168p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02289 0 OK 0x1.a85199f87a48p24 0x1.91e97e0067c95p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02290 0 OK 0x1.2074ab1805046p24 0x1.63b5b8ecc2a45p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02291 0 OK 0x1.a44809ee01c29p22 0x1.d9e9cd5bb6f1bp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02292 0 OK 0x1.14e9c95f8a8c2p24 0x1.c16c44693e4c6p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02293 0 OK 0x1.2c46ef88ca45cp24 0x1.0556bb2d19be8p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02294 0 OK 0x1.c2e00dd075f82p24 0x1.df0c111739c3ap23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02295 0 OK 0x1.19df57a76842bp24 0x1.0225dd54cad9p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02296 0 OK 0x1.73965807e2b79p25 -0x1.1167dde22b2dp22 0x0.0p0 0x1.fffffffffffdbp-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02297 0 OK -0x1.9a281dbeb0835p24 0x1.58101a84f4113p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02298 0 OK -0x1.b0ae57c717bbap20 -0x1.cdca08656c23ap16 0x1.17e5e978cp6 0x1.00031ae022d1p0 -0x1.fffff86ce032fp-1 -0x1.708f8p-13 T +CSV proj4-epsg.csv:02299 0 OK 0x1.7f7a28c7b0261p22 -0x1.37de0cbd82361p17 0x0.0p0 0x1.ffffffffffa74p-1 -0x1.ffffffffffe14p-1 0x0.0p0 T +CSV proj4-epsg.csv:02300 0 OK 0x1.478bc7b840209p22 -0x1.1a7639dfcd58ep17 0x0.0p0 0x1.fffffffffff28p-1 -0x1.fffffffffffc9p-1 0x0.0p0 T +CSV proj4-epsg.csv:02301 0 OK 0x1.e55aab52362f8p22 -0x1.d3e6352759774p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02302 0 OK -0x1.b30851192ff9cp21 -0x1.bb2e7d453001ap21 -0x1.b9240d63p3 0x1.00c91f256d28fp0 -0x1.0001d2b09e2e8p0 -0x1.f1bc8p-13 T +CSV proj4-epsg.csv:02303 0 OK 0x1.3f136a0e3a112p22 -0x1.cdca08656c23ap16 0x1.17e5e978cp6 0x1.00031ae022d1ep0 -0x1.fffff86ce032fp-1 -0x1.708f8p-13 T +CSV proj4-epsg.csv:02304 0 OK -0x1.2de8925acb76ep19 -0x1.2f66a3377450cp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:02305 0 OK 0x1.aa96a1cdb6738p15 -0x1.2f6c480da75bap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffa1p-1 0x0.0p0 F +CSV proj4-epsg.csv:02306 0 OK 0x1.60d037913c217p19 -0x1.2f6d13e9d1c9fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02307 0 OK 0x1.5415d36ebfddbp20 -0x1.2f6912477f8e6p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:02308 0 OK 0x1.fa367e1f90554p20 -0x1.2f6008d960e79p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000003p0 0x0.0p0 F +CSV proj4-epsg.csv:02309 0 OK 0x1.52638256df787p21 -0x1.2f516f2f97ebbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000bp0 0x0.0p0 F +CSV proj4-epsg.csv:02310 0 OK 0x1.ab04bce56f842p21 -0x1.2f3c5a122e11fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdcp-1 0x0.0p0 F +CSV proj4-epsg.csv:02311 0 OK 0x1.042c3da2c8e9dp22 -0x1.2f1f545f3e56ap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000022p0 0x0.0p0 F +CSV proj4-epsg.csv:02312 0 OK 0x1.3608651bc260ap22 -0x1.2ef81826f0f29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000025p0 0x0.0p0 F +CSV proj4-epsg.csv:02313 0 OK 0x1.6c354670a1686p22 -0x1.2ec30ba0f383bp24 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffeep-1 0x0.0p0 F +CSV proj4-epsg.csv:02314 0 OK 0x1.a84153a7eb669p22 -0x1.2e7a418a9d1bep24 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff776p-1 0x0.0p0 F +CSV proj4-epsg.csv:02315 0 OK 0x1.ec79008450956p22 -0x1.2e135c211531bp24 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8ca7p-1 0x0.0p0 F +CSV proj4-epsg.csv:02316 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:02317 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:02318 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:02319 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:02320 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:02321 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02322 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02323 0 OK 0x1.4224f79aea41dp23 0x1.a5d117db557c5p21 0x0.0p0 0x1.0000000000006p0 -0x1.fffffffffff61p-1 0x0.0p0 F +CSV proj4-epsg.csv:02324 0 OK 0x1.06aa952e794f2p25 0x1.1c7159dba1626p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02325 0 OK 0x1.2ac53c6ef20aap25 0x1.02c7c2ebfdf12p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02326 0 OK 0x1.2b5293596426ap24 0x1.2e03932c067aep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02327 0 OK 0x1.760ee476ea7c4p24 0x1.107ba51ba9b66p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02328 0 OK 0x1.05d6efba110a7p24 -0x1.e38f0fb2eeb2ep21 0x0.0p0 0x1.78aaaaaaaaaa9p6 -0x1.5d381d52f85d1p8 0x0.0p0 T +CSV proj4-epsg.csv:02329 0 OK 0x1.1874bf12da2efp24 -0x1.e2713ad6a21cp21 0x0.0p0 0x1.72p6 -0x1.1a9b871f523f5p9 0x0.0p0 T +CSV proj4-epsg.csv:02330 0 OK 0x1.a8a333c270cc9p23 0x1.537c67d421001p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02331 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:02332 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:02333 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:02334 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:02335 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:02336 0 OK 0x1.a8a333c270cc9p23 0x1.537c67d421001p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02337 0 OK -0x1.e1aa22e82ff72p20 -0x1.cb7c3969d8672p16 -0x1.07cdced128p7 0x1.00031be00ef1ep0 -0x1.fffff86a6ac3fp-1 -0x1.2accp-16 T +CSV proj4-epsg.csv:02338 0 OK -0x1.1caaef6d1fb9bp21 -0x1.d5228793e3a26p16 -0x1.07cdced128p7 0x1.000a69cf37bf6p0 -0x1.fffff53a86bb3p-1 -0x1.3338cp-12 T +CSV proj4-epsg.csv:02339 0 OK -0x1.497ea282c5a0cp21 -0x1.e08df182a56c8p16 -0x1.07cdced128p7 0x1.001eb58245b05p0 -0x1.000008d53645p0 -0x1.14d83p-10 T +CSV proj4-epsg.csv:02340 0 OK -0x1.777cc6c285edap21 -0x1.edf0ed694e733p16 -0x1.07cdced128p7 0x1.0051d840315fap0 -0x1.000063fa8578dp0 -0x1.85d59p-9 T +CSV proj4-epsg.csv:02341 0 OK -0x1.a6d6dd0335b21p21 -0x1.fd89b16ee3223p16 -0x1.07cdced128p7 0x1.00c90e90983fap0 -0x1.0001d2219e3d9p0 -0x1.e727dcp-8 T +CSV proj4-epsg.csv:02342 0 OK -0x1.d7c43e4bad775p21 -0x1.07d2537216f32p17 -0x1.07cdced128p7 0x1.01ce41e5fbd17p0 -0x1.0006884f4d46dp0 -0x1.195443p-6 T +CSV proj4-epsg.csv:02343 0 OK -0x1.054197c980aadp22 -0x1.124fb56022164p17 -0x1.07cdced128p7 0x1.03eedb81a62bdp0 -0x1.00145071d34a8p0 -0x1.324fb7p-5 T +CSV proj4-epsg.csv:02344 0 OK 0x1.fec2bd54bb5f9p24 0x1.adfaacf9d9ec3p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02345 0 OK 0x1.b1a649a83f5c2p22 0x1.61fe6663bc98dp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000009fp0 0x0.0p0 F +CSV proj4-epsg.csv:02346 0 OK -0x1.52da39f041974p21 0x1.520e32d4ea287p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02347 0 OK 0x1.fc5834de3a8b6p22 0x1.aecfabf47dfacp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02348 0 OK 0x1.53b7a0614cb41p23 0x1.3d089dafa38a1p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02349 0 OK 0x1.16a3926cd0a5ep25 0x1.04089d119b6acp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02350 0 OK 0x1.52c4f88ae2f39p23 0x1.952d4945767a9p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02351 0 OK 0x1.15dc8b3775529p25 0x1.4c545818fe40ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02352 0 OK 0x1.6a545534d1f91p23 0x1.1f881e6da9292p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff54p-1 0x0.0p0 F +CSV proj4-epsg.csv:02353 0 OK 0x1.b30648786fb7dp23 0x1.6d984477b3a64p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02354 0 OK 0x1.64cf8dae5879cp25 0x1.2bdd285f10d29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02355 0 OK 0x1.b63cf39a83ab7p23 0x1.616a989bf8p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02356 0 OK 0x1.6772502037741p25 0x1.21e004881e6e5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02357 0 OK 0x1.b704ed5565bb6p23 0x1.4b140364636b1p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02358 0 OK 0x1.681655a65a5d7p25 0x1.0f8d969f627bbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02359 0 OK 0x1.b6f205de9ceadp23 0x1.37fbd09973042p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02360 0 OK 0x1.6806d447f70abp25 0x1.ffc87e9e0657p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02361 0 OK 0x1.b826f46eb2a9fp23 0x1.23bf98c7f0e14p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02362 0 OK 0x1.690437bd2f474p25 0x1.de96c7518b356p23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02363 0 OK 0x1.b71163ebb0895p23 0x1.0d1ef10799bdep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02364 0 OK 0x1.68208e988ea75p25 0x1.b978690b09eb3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02365 0 OK 0x1.7fdf27bfa7bddp23 0x1.9e265778ceebap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02366 0 OK 0x1.3adad20ac1bbap25 0x1.53b0687deaab6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02367 0 OK 0x1.7f9fabc39ec8dp23 0x1.a30b5135da228p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02368 0 OK 0x1.3aa6c00765443p25 0x1.57b41bf15866bp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02369 0 OK 0x1.802bf2d15954p23 0x1.920787366d41p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02370 0 OK 0x1.3b19ce93077f7p25 0x1.49bf746556307p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02371 0 OK 0x1.254361aa903efp23 -0x1.49e5c14724ef8p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02372 0 OK 0x1.e112e8369f726p24 -0x1.0e95ac72b8ed5p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02373 0 OK 0x1.8b85201b6f4bap23 -0x1.17ca73ead35e1p22 0x0.0p0 -0x1.a021277f890b6p5 -0x1.3bd38f3541789p4 0x0.0p0 T +CSV proj4-epsg.csv:02374 0 OK 0x1.4468a8413627ep25 -0x1.caf93a196cdd7p23 0x0.0p0 -0x1.a021277f890b4p5 -0x1.3bd38f354177fp4 0x0.0p0 T +CSV proj4-epsg.csv:02375 0 OK 0x1.caaa0d8f3a765p23 -0x1.826b7d98b9784p21 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9d03p6 0x0.0p0 T +CSV proj4-epsg.csv:02376 0 OK 0x1.783343f9a05e4p25 -0x1.3cf1df1195fdcp23 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:02377 0 OK 0x1.335f4d3df3dc7p23 0x1.8c60df1e0f873p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffef9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02378 0 OK 0x1.41faf44fb3893p23 0x1.a1c1b331a60e4p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02379 0 OK 0x1.0817465c09d15p25 0x1.56a5c11c150ep20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02380 0 OK 0x1.d7410067f197dp23 -0x1.84f5f9ea4cb3cp21 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee06p6 0x0.0p0 T +CSV proj4-epsg.csv:02381 0 OK 0x1.8286c13d67a3fp25 -0x1.3f0767b3dac0bp23 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee0dp6 0x0.0p0 T +CSV proj4-epsg.csv:02382 0 OK 0x1.d95fd49418ec4p23 -0x1.d205f2c4df9a6p21 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:02383 0 OK 0x1.8443fccfe9d1bp25 -0x1.7e3c73c2dd298p23 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:02384 0 OK 0x1.01a2e06e6ddfep24 -0x1.d79b6bfc52996p21 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b19p7 0x0.0p0 T +CSV proj4-epsg.csv:02385 0 OK 0x1.a6a17a9d36c22p25 -0x1.82d0eb13cf7bap23 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b0bp7 0x0.0p0 T +CSV proj4-epsg.csv:02386 0 OK 0x1.1a6dbffff8542p24 -0x1.1fe09c74b2f92p22 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:02387 0 OK 0x1.cf4cfee80eb95p25 -0x1.d83d26330fd4fp23 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:02388 0 OK 0x1.031a5391336ffp24 -0x1.11a4a7ac3eb6dp22 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:02389 0 OK 0x1.a9095f7c1ee5ap25 -0x1.c0e38af282c85p23 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:02390 0 OK 0x1.19d819f8cba2cp24 -0x1.1402adf4721cep22 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:02391 0 OK 0x1.ce57827f7cfb6p25 -0x1.c4c5aceeb5d16p23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:02392 0 OK 0x1.7d4775ead306cp23 0x1.4aabad43674c4p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02393 0 OK 0x1.38ba73dd0812bp25 0x1.0f3802c07e98fp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02394 0 OK 0x1.5dbf93402a1p23 0x1.95b318b3d3521p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02395 0 OK 0x1.1eddd32d1cc42p25 0x1.4cc218b014bdcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02396 0 OK 0x1.62a8f283c8118p23 0x1.01b6bfec23dd9p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02397 0 OK 0x1.22e521cae923cp25 0x1.a6c214382b0c9p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02398 0 OK 0x1.633d3b8562244p23 0x1.3670fb7cd7093p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02399 0 OK 0x1.235ec1b9ee645p25 0x1.fd40ce09a9815p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02400 0 OK 0x1.461ce529f0f3ep23 0x1.d30c3aa1c69e9p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02401 0 OK 0x1.0b7b01b8e583cp25 0x1.7f1393b791e5ap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02402 0 OK 0x1.67c9ef2f4a499p23 0x1.9f22db8ce0168p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02403 0 OK 0x1.271a0e0c47f8dp25 0x1.547f861a31458p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02404 0 OK 0x1.48bfc4b7b9355p23 0x1.146b3c6161574p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02405 0 OK 0x1.0da48b1c11494p25 0x1.c571310666717p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02406 0 OK 0x1.652b6f003c36ap23 0x1.2f52257756a74p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02407 0 OK 0x1.24f41ac6f644fp25 0x1.f1929820754bbp21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02408 0 OK 0x1.6112cdef64c8dp23 0x1.06536645b5fbap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2677p-1 0x0.0p0 F +CSV proj4-epsg.csv:02409 0 OK 0x1.2198029dc9d6fp25 0x1.ae52d62b509bep21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02410 0 OK 0x1.5995f5682b8fcp23 -0x1.384a6c5732035p22 0x0.0p0 -0x1.b0b86ad87634p3 -0x1.1a2ff27284bc9p2 0x0.0p0 T +CSV proj4-epsg.csv:02411 0 OK 0x1.5535c9fedeef8p23 -0x1.39c99ac6ef0bfp22 0x0.0p0 -0x1.488c123028ccep3 -0x1.b812420bc5576p1 0x0.0p0 T +CSV proj4-epsg.csv:02412 0 OK 0x1.5e593225978fap23 -0x1.3496d95e9bfacp22 0x0.0p0 -0x1.1bc8bc66816cfp4 -0x1.7159f658fbc3bp2 0x0.0p0 T +CSV proj4-epsg.csv:02413 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:02414 0 OK 0x1.1216b518515fbp25 -0x1.00bb345b5ff81p24 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b69729p1 0x0.0p0 T +CSV proj4-epsg.csv:02415 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:02416 0 OK 0x1.2cdd804802d33p25 -0x1.f9fa4b8afac7ep23 0x0.0p0 -0x1.0f4cd69ecfcafp4 -0x1.60b274c5f7282p2 0x0.0p0 T +CSV proj4-epsg.csv:02417 0 OK 0x1.303fb5dee8c06p23 -0x1.0db8f2673c046p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02418 0 OK 0x1.f3184c5ec07fbp24 -0x1.ba750b1514b1bp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02419 0 OK 0x1.246f2e5bd85f1p23 -0x1.0c2b3d8ee8a25p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02420 0 OK 0x1.dfb6cf5acd96p24 -0x1.b7e8a398309adp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02421 0 OK 0x1.1f878132a3453p23 -0x1.534b8f539b7f4p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02422 0 OK 0x1.d7aafa3b5d9fep24 -0x1.164aef5152798p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02423 0 OK 0x1.f5dfd8e9bfdbep23 0x1.30f84d5602c05p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02424 0 OK 0x1.9ba473c312b8ap25 0x1.f4475c98842d6p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02425 0 OK 0x1.1d1bec8cfdfc7p24 0x1.dad95b3c2ae93p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02426 0 OK 0x1.d3b2d8b4350e8p25 0x1.8579d64123de3p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02427 0 OK 0x1.8bf1a58805fd4p23 -0x1.1e2748372871fp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02428 0 OK 0x1.b642caff5c954p23 0x1.1b88ba0a42f22p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02429 0 OK 0x1.677749c6b15b4p25 0x1.d11d6f0009081p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02430 0 OK 0x1.6bf3f7d7c4683p23 0x1.f56249f1a7f08p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02431 0 OK 0x1.2a846cb9081b9p25 0x1.9b3d41e0410fcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02432 0 OK 0x1.6b4cba2bb1a5cp23 0x1.d9149218a7432p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02433 0 OK 0x1.29fb409793633p25 0x1.8406424858c5dp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02434 0 OK 0x1.6a285ba9b046bp23 0x1.e23a99490585cp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02435 0 OK 0x1.290b72dcd66c4p25 0x1.8b8735b9c75dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02436 0 OK 0x1.1e7021a600c6ep24 -0x1.e09c2310d7b8fp21 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491e3p9 0x0.0p0 T +CSV proj4-epsg.csv:02437 0 OK 0x1.d5e0b05eed6f9p25 -0x1.8a3343cd1f04cp23 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491fp9 0x0.0p0 T +CSV proj4-epsg.csv:02438 0 OK 0x1.78206c898da1cp23 0x1.0a84ef7491b8ap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02439 0 OK 0x1.3480b9c77fab1p25 0x1.b5341b48f71b6p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02440 0 OK 0x1.69ecfd5d61591p23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02441 0 OK 0x1.28dac11787645p25 0x1.00b33e826f25dp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02442 0 OK 0x1.6a00742d44bdp23 -0x1.333be5fe10f52p22 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db8281p2 0x0.0p0 T +CSV proj4-epsg.csv:02443 0 OK 0x1.28eab8092ed57p25 -0x1.f7fde2903dbd1p23 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db827p2 0x0.0p0 T +CSV proj4-epsg.csv:02444 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:02445 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:02446 0 OK 0x1.994c26431b469p23 -0x1.26698bba6217ap22 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:02447 0 OK 0x1.4fb58d3fda1dep25 -0x1.e2f5758840b34p23 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:02448 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:02449 0 OK 0x1.3b7921670f14ep25 -0x1.d2dec8ef0971ap23 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:02450 0 OK 0x1.279ff9888b715p23 -0x1.4cb0e59d69ed3p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02451 0 OK 0x1.e4f2b12018cc7p24 -0x1.10e03d2f75715p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02452 0 OK 0x1.b27cc5d80250ep23 -0x1.28733d05df362p22 0x0.0p0 -0x1.98d990063ec6cp6 -0x1.6ed261eb7328p5 0x0.0p0 T +CSV proj4-epsg.csv:02453 0 OK 0x1.645ec4317b548p25 -0x1.e64d409542524p23 0x0.0p0 -0x1.98d990063ec6dp6 -0x1.6ed261eb7328cp5 0x0.0p0 T +CSV proj4-epsg.csv:02454 0 OK 0x1.37a9f52baa452p23 -0x1.13d271129e1c2p14 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02455 0 OK 0x1.ff4236fab144ep24 -0x1.c4768b9ea5b6cp15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02456 0 OK 0x1.6fb165c9065a4p23 0x1.62464b038399bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02457 0 OK 0x1.2d95dee868bb6p25 0x1.22945d1b683e9p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02458 0 OK 0x1.6f4754db09495p23 0x1.5bf2c4f5ce6f8p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02459 0 OK 0x1.2d3edfcddc052p25 0x1.1d6403a600556p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02460 0 OK 0x1.47c330687a4fbp23 0x1.52e912879c2bp18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02461 0 OK 0x1.0cd5602f4b25fp25 0x1.15fa279252627p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02462 0 OK 0x1.45b98b14707a9p23 0x1.494b817e1bac7p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02463 0 OK 0x1.0b29847975378p25 0x1.0e17283cd2535p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02464 0 OK 0x1.67cea956d147ap23 0x1.e504b1f970c3fp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02465 0 OK 0x1.271deea06f632p25 0x1.8dd0eaefa217ap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02466 0 OK 0x1.67603867febddp23 0x1.d3bd835722efp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02467 0 OK 0x1.26c358ee78919p25 0x1.7fa4fca21558ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:02468 0 OK 0x1.7b4b2f01843fp23 0x1.5e218e40fcfe4p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02469 0 OK 0x1.3719b80648599p25 0x1.1f2e561b196b1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02470 0 OK 0x1.b9e7ad424f0a3p23 0x1.5ccd4e1188ecep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02471 0 OK 0x1.6a7472e57b24p25 0x1.1e1742625f2c7p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02472 0 OK 0x1.9eba1738f13fdp23 0x1.50d0bec9aeb44p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02473 0 OK 0x1.5429c46eef25ap25 0x1.1442656392fd5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02474 0 OK 0x1.3bf29e9fc4c02p23 -0x1.a247f1cb11a1dp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02475 0 OK 0x1.0324994060787p25 -0x1.5713dce17dfbap19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02476 0 OK 0x1.3a95771a16649p23 -0x1.aeb07ce58fc44p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02477 0 OK 0x1.0206382446f44p25 -0x1.61414a48058bep19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02478 0 OK 0x1.e55aab52362f8p22 -0x1.d3e6352759774p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02479 0 OK 0x1.6260ccf61c887p23 -0x1.29848050ed706p22 0x0.0p0 -0x1.6965a34d8a5a8p4 -0x1.dd93f429dc627p2 0x0.0p0 T +CSV proj4-epsg.csv:02480 0 OK 0x1.22a9f4e937e96p25 -0x1.e80d846972ba1p23 0x0.0p0 -0x1.6965a34d8a5b1p4 -0x1.dd93f429dc62ep2 0x0.0p0 T +CSV proj4-epsg.csv:02481 0 OK 0x1.3b8c644d42174p23 0x1.9c6a5d24c256ep17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02482 0 OK 0x1.02d0e20efd6e7p25 0x1.52446d5239449p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02483 0 OK 0x1.6e0afe1503ac1p23 0x1.4912db8d06b7bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02484 0 OK 0x1.2c3b4192d60d8p25 0x1.0de8b19fc70eap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02485 0 OK 0x1.6e1f2824f9b61p23 0x1.46bc1ed71df32p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02486 0 OK 0x1.2c4bcb8a4633ep25 0x1.0bfd9ac9ef203p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02487 0 OK 0x1.4b047d4d0086bp23 0x1.517bfb4099862p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02488 0 OK 0x1.0f80db0a174ffp25 0x1.14ceb4366cdb1p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02489 0 OK 0x1.6f4668b190045p23 0x1.2fb6062bcac2cp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:02490 0 OK 0x1.2d3df69df80e3p25 0x1.f2366f74d9bbdp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:02491 0 OK 0x1.7e725580c2b0bp23 0x1.20546a7e5b01cp23 0x0.0p0 0x1.000000000004p0 -0x1.fffffffffff1fp-1 0x0.0p0 F +CSV proj4-epsg.csv:02492 0 OK 0x1.8636eec51e2dcp23 0x1.f9c5c60cd2258p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02493 0 OK 0x1.62e65f3763a56p23 0x1.9c38bcddef3dep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02494 0 OK 0x1.23178352f77b1p25 0x1.521b8cd45e5ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02495 0 OK 0x1.6826274d485ddp23 0x1.dcbab5baa6ffep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02496 0 OK 0x1.2765b19f55a65p25 0x1.8704729a626d1p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02497 0 OK 0x1.5df2e99177a9ep23 0x1.912b856bef2dap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02498 0 OK 0x1.1f07ee9d571c2p25 0x1.490b00cb3a2eap24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02499 0 OK 0x1.68bb8f51b7b46p23 0x1.5ff87bbe0f19dp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02500 0 OK 0x1.27e03cf706844p25 0x1.20b072b88c9f1p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02501 0 OK 0x1.77de7bb0f38a4p23 -0x1.33db0875d1bf3p22 0x0.0p0 -0x1.bf7ce334221d1p4 -0x1.2f04f08531c1p3 0x0.0p0 T +CSV proj4-epsg.csv:02502 0 OK 0x1.344a7b88575a7p25 -0x1.f902ee9ffe274p23 0x0.0p0 -0x1.bf7ce334221d7p4 -0x1.2f04f08531c0bp3 0x0.0p0 T +CSV proj4-epsg.csv:02503 0 OK 0x1.2a0d1a5f5a56p23 0x1.a129ac330e164p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02504 0 OK 0x1.92a758fe6d9e2p23 0x1.c4e20324affb3p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02505 0 OK 0x1.4a428a386823cp25 0x1.737552e645cdbp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02506 0 OK 0x1.910d9c19c2e6dp23 0x1.a9712c4cace6ep19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02507 0 OK 0x1.48f27831f8eacp25 0x1.5cf37dfc4981dp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02508 0 OK 0x1.7802cd64ba298p23 0x1.6e31d6a1963cdp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02509 0 OK 0x1.34684595e9cd5p25 0x1.2c5b1e2cf629p24 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02510 0 OK 0x1.7a87a09c328d4p23 0x1.6354a1625a49bp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02511 0 OK 0x1.367929a769147p25 0x1.2371f2a9783e1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02512 0 OK 0x1.3e2bb7db5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02513 0 OK 0x1.04f760c635c03p25 -0x1.2326b291032bfp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02514 0 OK 0x1.405d7fbff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02515 0 OK 0x1.06c427c4a5f4ep25 0x1.d865d79271e28p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:02516 0 OK 0x1.5cdec35d189f2p23 0x1.3cc10a25ec8dfp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02517 0 OK 0x1.1e256ea38eea6p25 0x1.03cde7f343ff8p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02518 0 OK 0x1.5e2bbcc3e3fa8p23 0x1.42d4f14491f36p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02519 0 OK 0x1.1f368a58c718ep25 0x1.08ca120cc66e4p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02520 0 OK 0x1.5b7227d1fcf54p23 0x1.3ded7947a4d6dp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02521 0 OK 0x1.1cfa60c4802c2p25 0x1.04c45319f6828p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02522 0 OK 0x1.7bc684036876dp23 0x1.6b8a3feeece7ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02523 0 OK 0x1.7abd8927cff7ap23 0x1.31c09f82825dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02524 0 OK 0x1.7d5629263629ap23 0x1.9b53a36e26486p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02525 0 OK 0x1.237227298b8p23 -0x1.73edc5a635c6bp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02526 0 OK 0x1.02701ea737949p23 -0x1.590a582ffb9efp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffff2p-1 0x0.0p0 F +CSV proj4-epsg.csv:02527 0 OK 0x1.02701ea737949p23 -0x1.590a582ffb9efp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffff2p-1 0x0.0p0 F +CSV proj4-epsg.csv:02528 0 OK 0x1.377eb7b117c9fp25 0x1.2a2db6adbcb5fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02529 0 OK 0x1.36a560f9e2a8p25 0x1.f58fb727e2c44p23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02530 0 OK 0x1.38c6827f66286p25 0x1.515fa412d358fp24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02531 0 OK 0x1.52638256df787p21 -0x1.2f516f2f97ebbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000bp0 0x0.0p0 F +CSV proj4-epsg.csv:02532 0 OK 0x1.ab04bce56f842p21 -0x1.2f3c5a122e11fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdcp-1 0x0.0p0 F +CSV proj4-epsg.csv:02533 0 OK 0x1.5415d36ebfddbp20 -0x1.2da5248eff1ccp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:02534 0 OK -0x1.2ae00e5a09fe1p22 -0x1.9b2c017882ca5p21 -0x1.5918527bfp7 0x1.171d32a5055edp0 -0x1.00f2a1eca451dp0 -0x1.1920662p-1 T +CSV proj4-epsg.csv:02535 0 OK -0x1.c890b7bb2db4ap22 -0x1.2de7658c22b4p24 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:02536 0 OK -0x1.80e845425a8a2p22 -0x1.2e5c03112367ap24 0x0.0p0 0x1.fffffffffce5dp-1 -0x1.fffffffffeb3cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02537 0 OK -0x1.427128c7b0261p22 -0x1.2ead5dc94dda7p24 0x0.0p0 0x1.ffffffffffa3bp-1 -0x1.ffffffffffd95p-1 0x0.0p0 F +CSV proj4-epsg.csv:02538 0 OK -0x1.0a82c7b84020bp22 -0x1.2ee82d6f09443p24 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.fffffffffff64p-1 0x0.0p0 F +CSV proj4-epsg.csv:02539 0 OK -0x1.aeb543db2a3f4p21 -0x1.2f13879977c5fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02540 0 OK 0x1.14a7f533ebf8ap23 0x1.2a55f8ccf4cf8p23 0x0.0p0 -0x1.4dc3719f07efp0 -0x1.4bd3b2c88d149p0 0x0.0p0 T +CSV proj4-epsg.csv:02541 0 OK -0x1.7fc74dbaff74ep18 -0x1.b4079b49507e3p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:02542 0 OK -0x1.06127e1f9054p20 -0x1.bd110967f7482p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:02543 0 OK -0x1.b0a304adbef02p20 -0x1.cbaab330f32b8p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:02544 0 OK -0x1.ff7b560a76deep22 0x1.29e7ddea5f7d9p23 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff784b1p-1 0x0.0p0 T +CSV proj4-epsg.csv:02545 0 OK -0x1.30e4c9758454ap23 0x1.27fba972b8793p23 0x0.0p0 0x1.0000000cb37b3p0 -0x1.ffffffedc14d7p-1 0x0.0p0 T +CSV proj4-epsg.csv:02546 0 OK -0x1.71ca8f5a55fbap23 0x1.2467f7eaecbfcp23 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6f9p-1 0x0.0p0 T +CSV proj4-epsg.csv:02547 0 OK -0x1.d4bcfb32694dp23 0x1.1b1294fc6c584p23 0x0.0p0 0x1.00020c662a79cp0 -0x1.ffeba58178957p-1 0x0.0p0 T +CSV proj4-epsg.csv:02548 0 OK -0x1.2de8925acb76ep19 -0x1.2da0466ee8a18p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000015p0 0x0.0p0 F +CSV proj4-epsg.csv:02549 0 OK 0x1.7139f76e736f3p23 0x1.5e67fff7288dep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02550 0 OK 0x1.2ed7dc1460a96p25 0x1.1f681d8938ebep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02551 0 OK 0x1.7139f76e736f3p23 0x1.5e67fff7288dep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02552 0 OK 0x1.2ed7dc1460a96p25 0x1.1f681d8938ebep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02553 0 OK 0x1.7385473cb22bcp23 0x1.46c44d1a431cbp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02554 0 OK 0x1.30b994215241p25 0x1.0c0473a65693p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02555 0 OK 0x1.7385473cb22bcp23 0x1.46c44d1a431cbp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02556 0 OK 0x1.30b994215241p25 0x1.0c0473a65693p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02557 0 OK 0x1.7167117652557p23 0x1.57661edcf41f7p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02558 0 OK 0x1.2efcda3fcb7cfp25 0x1.19a8c1f716bccp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02559 0 OK 0x1.7167117652557p23 0x1.57661edcf41f7p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02560 0 OK 0x1.2efcda3fcb7cfp25 0x1.19a8c1f716bccp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02561 0 OK 0x1.cc815b2402c4ep23 -0x1.210d674dd9594p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02562 0 OK 0x1.79b6068e1559fp25 -0x1.da2ad11ac1a48p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02563 0 OK 0x1.cc815b2402c4ep23 -0x1.210d674dd9594p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02564 0 OK 0x1.79b6068e1559fp25 -0x1.da2ad11ac1a48p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02565 0 OK 0x1.ebd0ecb93d835p22 0x1.b88da14ca7cc2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02566 0 OK 0x1.936479989bddcp24 0x1.69589e2b0c069p25 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02567 0 OK 0x1.ebd0ecb93d835p22 0x1.b88da14ca7cc2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02568 0 OK 0x1.936479989bddcp24 0x1.69589e2b0c069p25 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02569 0 OK 0x1.709ad58cb4b66p23 0x1.6c1c841907c28p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02570 0 OK 0x1.2e5556766e8d4p25 0x1.2aa5d5d6b9f9fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02571 0 OK 0x1.709ad58cb4b66p23 0x1.6c1c841907c28p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02572 0 OK 0x1.2e5556766e8d4p25 0x1.2aa5d5d6b9f9fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02573 0 OK 0x1.7b4b2f01843fp23 0x1.5e218e40fcfe4p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02574 0 OK 0x1.3719b80648599p25 0x1.1f2e561b196b1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02575 0 OK -0x1.9405042273826p20 -0x1.c8ff0a34f342ap16 0x0.0p0 0x1.00020258d6b6ap0 -0x1.fffffa3b19089p-1 0x0.0p0 T +CSV proj4-epsg.csv:02576 0 OK 0x1.602a6130779p22 -0x1.b768e615ae2bdp16 0x0.0p0 0x1.0000065594951p0 -0x1.ffffffdd92f0ap-1 0x0.0p0 T +CSV proj4-epsg.csv:02577 0 OK 0x1.afa6058899df8p20 -0x1.b811e2b6774f6p16 0x0.0p0 0x1.0000065594951p0 -0x1.ffffffdd92f0ap-1 0x0.0p0 T +CSV proj4-epsg.csv:02578 0 OK 0x1.5cdec35d189f2p23 0x1.3cc10a25ec8dfp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02579 0 OK 0x1.28dac11787645p25 0x1.00b33e826f25dp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02580 0 OK 0x1.b9e7ad424f0a3p23 0x1.5ccd4e1188ecep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02581 0 OK 0x1.6a7472e57b24p25 0x1.1e1742625f2c7p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02582 0 OK 0x1.9eba1738f13fdp23 0x1.50d0bec9aeb44p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02583 0 OK 0x1.5429c46eef25ap25 0x1.1442656392fd5p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02584 0 OK -0x1.af7156cea441p22 -0x1.83f727e8be749p17 -0x1.17942958ep6 0x1.0000000008d3dp0 -0x1.fffffffff7e81p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02585 0 OK 0x1.62e0792399a1ep23 0x1.166df93278bacp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02586 0 OK 0x1.2312acbef48bbp25 0x1.c8bd9358dfdc8p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02587 0 OK 0x1.62e0792399a1ep23 0x1.166df93278bacp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02588 0 OK 0x1.2312acbef48bbp25 0x1.c8bd9358dfdc8p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02589 0 OK 0x1.35c6dad85a403p17 -0x1.154c660ca6ec8p23 0x0.0p0 0x1.0p0 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02590 0 OK 0x1.3070c731a5a43p17 0x1.10858c1bb2a77p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.fffffff0d880cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02591 0 OK 0x1.78e647be85d33p16 -0x1.f24efc3c51f75p16 0x0.0p0 0x1.0p0 -0x1.fffffff0d87e8p-1 0x0.0p0 T +CSV proj4-epsg.csv:02592 0 OK -0x1.46ce35e6bda3fp21 -0x1.22eca8ac3ef5cp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02593 0 OK -0x1.d47631e56b586p21 -0x1.709468bc457c9p21 0x0.0p0 0x1.0174ee8312152p0 -0x1.0004bd6f0432p0 0x0.0p0 T +CSV proj4-epsg.csv:02594 0 OK -0x1.d47631e56b586p21 -0x1.709468bc457c9p21 0x0.0p0 0x1.0174ee8312152p0 -0x1.0004bd6f0432p0 0x0.0p0 T +CSV proj4-epsg.csv:02595 0 OK -0x1.f1fd07619ad98p21 -0x1.136bd3c35bc32p17 0x1.162eb874ap7 0x1.0000000000036p0 -0x1.fffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:02596 0 OK -0x1.2f2bebf08e1cfp22 -0x1.2e09da7e3cc0dp17 0x1.162eb874ap7 0x1.00000000001aap0 -0x1.ffffffffffef7p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02597 0 OK -0x1.6b38d1c53a17ap22 -0x1.5290195a5161dp17 0x1.162eb874ap7 0x1.0000000000ca2p0 -0x1.ffffffffff5bap-1 0x1.8p-29 T +CSV proj4-epsg.csv:02598 0 OK 0x1.6ded443d8e5a9p25 0x1.dc109a4f1a146p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02599 0 OK 0x1.71b0a947be2bdp25 0x1.c10d0db0ebb3ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02600 0 OK 0x1.83d873d85d82bp25 0x1.b57ee37778d22p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02601 0 OK 0x1.87708c486e478p25 0x1.9d753f6698c46p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02602 0 OK 0x1.ac149b25e434cp25 0x1.781015a41c97ep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02603 0 OK 0x1.be4c58c23175cp25 0x1.58634714a7c9ap23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02604 0 OK -0x1.f1feca3784c06p21 0x1.2ce2fc8850277p23 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffaap-1 0x0.0p0 T +CSV proj4-epsg.csv:02605 0 OK -0x1.2f2c4670a1686p22 0x1.2c78e37c5549bp23 0x0.0p0 0x1.0000000000108p0 -0x1.fffffffffffp-1 0x0.0p0 T +CSV proj4-epsg.csv:02606 0 OK -0x1.6b3853a7eb662p22 0x1.2be74f4fa87a2p23 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff6f5p-1 0x0.0p0 T +CSV proj4-epsg.csv:02607 0 OK -0x1.af70008450957p22 0x1.2b19847c98a5bp23 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8c13p-1 0x0.0p0 T +CSV proj4-epsg.csv:02608 0 OK -0x1.ff7b560a76deep22 0x1.29e7ddea5f7d9p23 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff784b1p-1 0x0.0p0 T +CSV proj4-epsg.csv:02609 0 OK -0x1.30e4c9758454ap23 0x1.27fba972b8793p23 0x0.0p0 0x1.0000000cb37b3p0 -0x1.ffffffedc14d7p-1 0x0.0p0 T +CSV proj4-epsg.csv:02610 0 OK -0x1.71ca8f5a55fbap23 0x1.2467f7eaecbfcp23 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6f9p-1 0x0.0p0 T +CSV proj4-epsg.csv:02611 0 OK -0x1.d4bcfb32694dp23 0x1.1b1294fc6c584p23 0x0.0p0 0x1.00020c662a79cp0 -0x1.ffeba58178957p-1 0x0.0p0 T +CSV proj4-epsg.csv:02612 0 OK 0x1.6acd29be813bap23 0x1.188a453f16507p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02613 0 OK 0x1.6adf6dac9f56cp23 0x1.fc3a8c8b6f48cp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02614 0 OK 0x1.68a5a617af551p23 0x1.bd1ccfcd40939p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02615 0 OK 0x1.6595ad1d7c04ap23 0x1.b6fefcc6ea7d5p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02616 0 OK 0x1.6ada09b04feddp23 0x1.0a9d747765b1ep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02617 0 OK 0x1.6bd41301f0005p23 0x1.d7e53c39130d6p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02618 0 OK 0x1.2992c685c03bcp25 0x1.cc341f9e95d07p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02619 0 OK 0x1.29a1c1c458f25p25 0x1.a0dab06babd19p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02620 0 OK 0x1.27ce6b009cd36p25 0x1.6d15f3ae0f80bp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02621 0 OK 0x1.254b655701e5fp25 0x1.6811a5ab66aa7p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02622 0 OK 0x1.299d55e398315p25 0x1.b55c54381a383p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02623 0 OK 0x1.2a6a6af88498fp25 0x1.830da8a920825p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02624 0 OK -0x1.da92eac0584f5p21 -0x1.ada789a8172aep21 0x1.b7a4bb691p6 0x1.0175f2d4b842ap0 -0x1.0004c2469ef34p0 0x1.13cea38p-5 T +CSV proj4-epsg.csv:02625 0 OK 0x1.001ee6e1f9dc2p24 -0x1.3243694cec1b7p22 0x0.0p0 0x1.7c33333333333p6 -0x1.0f200b2256229p8 0x0.0p0 T +CSV proj4-epsg.csv:02626 0 OK 0x1.a42509e3f98e2p25 -0x1.f666433e4a91ap23 0x0.0p0 0x1.7c33333333333p6 -0x1.0f200b2256222p8 0x0.0p0 T +CSV proj4-epsg.csv:02627 0 OK 0x1.00d436e513db5p24 -0x1.34ca16c95d711p22 0x0.0p0 0x1.7bccccccccccdp6 -0x1.16fc793f362b5p8 0x0.0p0 T +CSV proj4-epsg.csv:02628 0 OK 0x1.a54e777d8aebdp25 -0x1.fa8b15612630fp23 0x0.0p0 0x1.7bccccccccccdp6 -0x1.16fc793f362b5p8 0x0.0p0 T +CSV proj4-epsg.csv:02629 0 OK 0x1.0696b3c60a8d9p24 -0x1.292e33eae62ebp22 0x0.0p0 0x1.7899999999999p6 -0x1.5ee559414ceaap8 0x0.0p0 T +CSV proj4-epsg.csv:02630 0 OK 0x1.aec13dbaf33b9p25 -0x1.e77ff3ac51b3fp23 0x0.0p0 0x1.7899999999999p6 -0x1.5ee559414ceaap8 0x0.0p0 T +CSV proj4-epsg.csv:02631 0 OK 0x1.1172963de057cp24 -0x1.3575533413121p22 0x0.0p0 0x1.72cccccccccccp6 -0x1.0aab5f26c33a9p9 0x0.0p0 T +CSV proj4-epsg.csv:02632 0 OK 0x1.c0916904dcec7p25 -0x1.fba3fb5e46f71p23 0x0.0p0 0x1.72cccccccccccp6 -0x1.0aab5f26c33a9p9 0x0.0p0 T +CSV proj4-epsg.csv:02633 0 OK 0x1.0354e4ff22564p24 -0x1.2f9426175fcd8p22 0x0.0p0 0x1.7a66666666668p6 -0x1.3462594627323p8 0x0.0p0 T +CSV proj4-epsg.csv:02634 0 OK 0x1.a96972f4df799p25 -0x1.f1fedda1dd0d1p23 0x0.0p0 0x1.7a66666666668p6 -0x1.346259462732ep8 0x0.0p0 T +CSV proj4-epsg.csv:02635 0 OK 0x1.0b641c81dae1ep24 -0x1.2e52c1fbc3cacp22 0x0.0p0 0x1.75fffffffffffp6 -0x1.a72281dc3c9c2p8 0x0.0p0 T +CSV proj4-epsg.csv:02636 0 OK 0x1.b6a1fbfd8cb68p25 -0x1.efefa688a038cp23 0x0.0p0 0x1.75fffffffffffp6 -0x1.a72281dc3c9c2p8 0x0.0p0 T +CSV proj4-epsg.csv:02637 0 OK 0x1.09e6acbd8f7e4p24 -0x1.29ebc64796811p22 0x0.0p0 0x1.76ccccccccccbp6 -0x1.8f6ae983be189p8 0x0.0p0 T +CSV proj4-epsg.csv:02638 0 OK 0x1.b43044f762896p25 -0x1.e8b6edb019c55p23 0x0.0p0 0x1.76ccccccccccbp6 -0x1.8f6ae983be196p8 0x0.0p0 T +CSV proj4-epsg.csv:02639 0 OK 0x1.0c82f40be98d6p24 -0x1.33fed3015dae8p22 0x0.0p0 0x1.7566666666666p6 -0x1.b9dd1a34df92bp8 0x0.0p0 T +CSV proj4-epsg.csv:02640 0 OK 0x1.b878864fb37f7p25 -0x1.f93da5044473ap23 0x0.0p0 0x1.7566666666666p6 -0x1.b9dd1a34df933p8 0x0.0p0 T +CSV proj4-epsg.csv:02641 0 OK 0x1.0aa4b98768034p24 -0x1.34976c0fca8e6p22 0x0.0p0 0x1.7666666666665p6 -0x1.9b19f791fb55p8 0x0.0p0 T +CSV proj4-epsg.csv:02642 0 OK 0x1.b56807cfb9067p25 -0x1.fa37f7fc76d67p23 0x0.0p0 0x1.7666666666665p6 -0x1.9b19f791fb53fp8 0x0.0p0 T +CSV proj4-epsg.csv:02643 0 OK 0x1.04c51b76101b2p24 -0x1.23045e5084a84p22 0x0.0p0 0x1.799999999999cp6 -0x1.469650e7de9cfp8 0x0.0p0 T +CSV proj4-epsg.csv:02644 0 OK 0x1.abc578aca8b71p25 -0x1.dd63a561bc99dp23 0x0.0p0 0x1.799999999999cp6 -0x1.469650e7de9c9p8 0x0.0p0 T +CSV proj4-epsg.csv:02645 0 OK 0x1.104c21ff90915p24 -0x1.2c6247fd20b7cp22 0x0.0p0 0x1.7366666666665p6 -0x1.fea43c51ff6acp8 0x0.0p0 T +CSV proj4-epsg.csv:02646 0 OK 0x1.beae6202e9a1ep25 -0x1.ecc138dd6bf73p23 0x0.0p0 0x1.7366666666665p6 -0x1.fea43c51ff6acp8 0x0.0p0 T +CSV proj4-epsg.csv:02647 0 OK 0x1.0c235a8a01562p24 -0x1.3237d9cdcc7efp22 0x0.0p0 0x1.7599999999999p6 -0x1.b38743d3cf609p8 0x0.0p0 T +CSV proj4-epsg.csv:02648 0 OK 0x1.b7dbb38fd3794p25 -0x1.f6534c6f91b32p23 0x0.0p0 0x1.7599999999999p6 -0x1.b38743d3cf606p8 0x0.0p0 T +CSV proj4-epsg.csv:02649 0 OK 0x1.0b635e6498059p24 -0x1.2427fa011737p22 0x0.0p0 0x1.75fffffffffffp6 -0x1.a72281dc3c9c2p8 0x0.0p0 T +CSV proj4-epsg.csv:02650 0 OK 0x1.b6a0c41faeb6ap25 -0x1.df42014200a4bp23 0x0.0p0 0x1.75fffffffffffp6 -0x1.a72281dc3c9c2p8 0x0.0p0 T +CSV proj4-epsg.csv:02651 0 OK 0x1.0fea06cbb2ddcp24 -0x1.278d4dbfb12f1p22 0x0.0p0 0x1.739999999999bp6 -0x1.f74c0e740a7e9p8 0x0.0p0 T +CSV proj4-epsg.csv:02652 0 OK 0x1.be0d729d4c22ep25 -0x1.e4d410497eb5cp23 0x0.0p0 0x1.739999999999bp6 -0x1.f74c0e740a7dep8 0x0.0p0 T +CSV proj4-epsg.csv:02653 0 OK 0x1.ff881e9b24f1dp23 -0x1.254f1766b3ac9p22 0x0.0p0 0x1.7c66666666666p6 -0x1.0b47ad1ad7a68p8 0x0.0p0 T +CSV proj4-epsg.csv:02654 0 OK 0x1.a390050ccc1dfp25 -0x1.e1261dbf683c2p23 0x0.0p0 0x1.7c66666666666p6 -0x1.0b47ad1ad7a68p8 0x0.0p0 T +CSV proj4-epsg.csv:02655 0 OK 0x1.0522d3b1cf47bp24 -0x1.2989d6de07beap22 0x0.0p0 0x1.7966666666665p6 -0x1.4b4ea7593d7d2p8 0x0.0p0 T +CSV proj4-epsg.csv:02656 0 OK 0x1.ac5f35ef18667p25 -0x1.e81646200fe7ep23 0x0.0p0 0x1.7966666666665p6 -0x1.4b4ea7593d7d2p8 0x0.0p0 T +CSV proj4-epsg.csv:02657 0 OK 0x1.001f07f8cb002p24 -0x1.37023e75f5f3ap22 0x0.0p0 0x1.7c33333333333p6 -0x1.0f200b2256222p8 0x0.0p0 T +CSV proj4-epsg.csv:02658 0 OK 0x1.a425402ba4e65p25 -0x1.fe2f182b1ad32p23 0x0.0p0 0x1.7c33333333333p6 -0x1.0f200b225621cp8 0x0.0p0 T +CSV proj4-epsg.csv:02659 0 OK 0x1.0ec61a7f90defp24 -0x1.25995050c3416p22 0x0.0p0 0x1.7433333333334p6 -0x1.e1e79ae9bbf53p8 0x0.0p0 T +CSV proj4-epsg.csv:02660 0 OK 0x1.bc2e92821d546p25 -0x1.e19fdf2a07fb4p23 0x0.0p0 0x1.7433333333334p6 -0x1.e1e79ae9bbf53p8 0x0.0p0 T +CSV proj4-epsg.csv:02661 0 OK 0x1.06972a8db83fap24 -0x1.345d5bec98e33p22 0x0.0p0 0x1.7899999999999p6 -0x1.5ee559414ceb2p8 0x0.0p0 T +CSV proj4-epsg.csv:02662 0 OK 0x1.aec2009436758p25 -0x1.f9d8b89b7a5fbp23 0x0.0p0 0x1.7899999999999p6 -0x1.5ee559414ceaap8 0x0.0p0 T +CSV proj4-epsg.csv:02663 0 OK 0x1.00d4ab083365ap24 -0x1.299be36b39043p22 0x0.0p0 0x1.7bccccccccccdp6 -0x1.16fc793f362c4p8 0x0.0p0 T +CSV proj4-epsg.csv:02664 0 OK 0x1.a54f3600f901cp25 -0x1.e833e1c146cfdp23 0x0.0p0 0x1.7bccccccccccdp6 -0x1.16fc793f362c4p8 0x0.0p0 T +CSV proj4-epsg.csv:02665 0 OK 0x1.11724f85673a4p24 -0x1.32117efeec1a4p22 0x0.0p0 0x1.72cccccccccccp6 -0x1.0aab5f26c33aep9 0x0.0p0 T +CSV proj4-epsg.csv:02666 0 OK 0x1.c090f501fbca8p25 -0x1.f614617fd503bp23 0x0.0p0 0x1.72cccccccccccp6 -0x1.0aab5f26c33afp9 0x0.0p0 T +CSV proj4-epsg.csv:02667 0 OK 0x1.09e6bded117a9p24 -0x1.36cc4427fce5fp22 0x0.0p0 0x1.76ccccccccccbp6 -0x1.8f6ae983be19bp8 0x0.0p0 T +CSV proj4-epsg.csv:02668 0 OK 0x1.b430612869275p25 -0x1.fdd68c642823cp23 0x0.0p0 0x1.76ccccccccccbp6 -0x1.8f6ae983be192p8 0x0.0p0 T +CSV proj4-epsg.csv:02669 0 OK 0x1.1425c23c1da17p24 -0x1.267d5bfe356d7p22 0x0.0p0 0x1.7166666666667p6 -0x1.273284008aa53p9 0x0.0p0 T +CSV proj4-epsg.csv:02670 0 OK 0x1.c4ff38552cc48p25 -0x1.e315f62902192p23 0x0.0p0 0x1.7166666666667p6 -0x1.273284008aa5p9 0x0.0p0 T +CSV proj4-epsg.csv:02671 0 OK 0x1.057f967c97268p24 -0x1.3216dd69b4617p22 0x0.0p0 0x1.7933333333332p6 -0x1.5018dab5a1dedp8 0x0.0p0 T +CSV proj4-epsg.csv:02672 0 OK 0x1.acf760914971bp25 -0x1.f61d301db8388p23 0x0.0p0 0x1.7933333333332p6 -0x1.5018dab5a1dedp8 0x0.0p0 T +CSV proj4-epsg.csv:02673 0 OK 0x1.07b0557bedfadp24 -0x1.2f86b467bf458p22 0x0.0p0 0x1.78p6 -0x1.6e5c8f4f15bd9p8 0x0.0p0 T +CSV proj4-epsg.csv:02674 0 OK 0x1.b08f3c042647cp25 -0x1.f1e8cfd5482aap23 0x0.0p0 0x1.78p6 -0x1.6e5c8f4f15be1p8 0x0.0p0 T +CSV proj4-epsg.csv:02675 0 OK 0x1.0639fd13df31cp24 -0x1.2d81d651511b5p22 0x0.0p0 0x1.78cccccccccccp6 -0x1.59e3ed19804b7p8 0x0.0p0 T +CSV proj4-epsg.csv:02676 0 OK 0x1.ae2926f07dd01p25 -0x1.ee98ef0972622p23 0x0.0p0 0x1.78cccccccccccp6 -0x1.59e3ed19804b7p8 0x0.0p0 T +CSV proj4-epsg.csv:02677 0 OK 0x1.08ca6ee72f1d6p24 -0x1.228eb1370d978p22 0x0.0p0 0x1.7766666666667p6 -0x1.7e86572a30992p8 0x0.0p0 T +CSV proj4-epsg.csv:02678 0 OK 0x1.b25dfeac84a62p25 -0x1.dca29baaa148bp23 0x0.0p0 0x1.7766666666667p6 -0x1.7e86572a30989p8 0x0.0p0 T +CSV proj4-epsg.csv:02679 0 OK 0x1.03b150e5b6fd4p24 -0x1.2da05440a5b67p22 0x0.0p0 0x1.7a33333333331p6 -0x1.38d5d90686a8ep8 0x0.0p0 T +CSV proj4-epsg.csv:02680 0 OK 0x1.aa010f0d4ed8bp25 -0x1.eecaf405c828dp23 0x0.0p0 0x1.7a33333333331p6 -0x1.38d5d90686a96p8 0x0.0p0 T +CSV proj4-epsg.csv:02681 0 OK 0x1.08cab35ac1f5ap24 -0x1.32d24f7051702p22 0x0.0p0 0x1.7766666666667p6 -0x1.7e86572a30997p8 0x0.0p0 T +CSV proj4-epsg.csv:02682 0 OK 0x1.b25e6ef67af9cp25 -0x1.f750ad3150afep23 0x0.0p0 0x1.7766666666667p6 -0x1.7e86572a30997p8 0x0.0p0 T +CSV proj4-epsg.csv:02683 0 OK 0x1.040cfa8f72ffbp24 -0x1.33cd7ea930765p22 0x0.0p0 0x1.7a00000000002p6 -0x1.3d5a2c20c7e7bp8 0x0.0p0 T +CSV proj4-epsg.csv:02684 0 OK 0x1.aa976c8446c7cp25 -0x1.f8ecb9451d427p23 0x0.0p0 0x1.7a00000000002p6 -0x1.3d5a2c20c7e7bp8 0x0.0p0 T +CSV proj4-epsg.csv:02685 0 OK 0x1.0751ac62dc57cp24 -0x1.274f2919254abp22 0x0.0p0 0x1.7833333333333p6 -0x1.6921607c9dc0cp8 0x0.0p0 T +CSV proj4-epsg.csv:02686 0 OK 0x1.aff3f3a373e89p25 -0x1.e46e1f78b74fp23 0x0.0p0 0x1.7833333333333p6 -0x1.6921607c9dc02p8 0x0.0p0 T +CSV proj4-epsg.csv:02687 0 OK 0x1.0feaa503ac861p24 -0x1.36cd5ee3943f8p22 0x0.0p0 0x1.739999999999bp6 -0x1.f74c0e740a7d1p8 0x0.0p0 T +CSV proj4-epsg.csv:02688 0 OK 0x1.be0e7628b184dp25 -0x1.fdd85c30d834p23 0x0.0p0 0x1.739999999999bp6 -0x1.f74c0e740a7c9p8 0x0.0p0 T +CSV proj4-epsg.csv:02689 0 OK 0x1.0079d60ba4de4p24 -0x1.30a5b8b134189p22 0x0.0p0 0x1.7cp6 -0x1.1306e746839a1p8 0x0.0p0 T +CSV proj4-epsg.csv:02690 0 OK 0x1.a4ba356ac7f26p25 -0x1.f3bfa38f0f981p23 0x0.0p0 0x1.7cp6 -0x1.1306e746839a1p8 0x0.0p0 T +CSV proj4-epsg.csv:02691 0 OK 0x1.02f84e588bb74p24 -0x1.2555035bba90ap22 0x0.0p0 0x1.7a9999999999bp6 -0x1.2fff6cf98699dp8 0x0.0p0 T +CSV proj4-epsg.csv:02692 0 OK 0x1.a8d190bbb48dbp25 -0x1.e12fd48c8dac2p23 0x0.0p0 0x1.7a9999999999bp6 -0x1.2fff6cf9869a8p8 0x0.0p0 T +CSV proj4-epsg.csv:02693 0 OK 0x1.063942afb07b8p24 -0x1.27be76b06f64dp22 0x0.0p0 0x1.78cccccccccccp6 -0x1.59e3ed19804bp8 0x0.0p0 T +CSV proj4-epsg.csv:02694 0 OK 0x1.ae27f52e120ap25 -0x1.e524b4d544631p23 0x0.0p0 0x1.78cccccccccccp6 -0x1.59e3ed19804bp8 0x0.0p0 T +CSV proj4-epsg.csv:02695 0 OK 0x1.08cab35ac1f5ap24 -0x1.2bb4a59e1c91ap22 0x0.0p0 0x1.7766666666667p6 -0x1.7e86572a30997p8 0x0.0p0 T +CSV proj4-epsg.csv:02696 0 OK 0x1.b25e6ef67af9cp25 -0x1.eba463bc38e49p23 0x0.0p0 0x1.7766666666667p6 -0x1.7e86572a30997p8 0x0.0p0 T +CSV proj4-epsg.csv:02697 0 OK 0x1.129945c8e5bfcp24 -0x1.27d3c5b068857p22 0x0.0p0 0x1.7233333333333p6 -0x1.1688b0927d875p9 0x0.0p0 T +CSV proj4-epsg.csv:02698 0 OK 0x1.c274d14d8090cp25 -0x1.e547a94e4a2e1p23 0x0.0p0 0x1.7233333333333p6 -0x1.1688b0927d875p9 0x0.0p0 T +CSV proj4-epsg.csv:02699 0 OK 0x1.03b0ec39f2222p24 -0x1.37ca8f0aa144bp22 0x0.0p0 0x1.7a33333333331p6 -0x1.38d5d90686a9p8 0x0.0p0 T +CSV proj4-epsg.csv:02700 0 OK 0x1.aa0069e8de5fcp25 -0x1.ff77b1b00d076p23 0x0.0p0 0x1.7a33333333331p6 -0x1.38d5d90686a9p8 0x0.0p0 T +CSV proj4-epsg.csv:02701 0 OK 0x1.12374fa8d417ap24 -0x1.37540906c29c1p22 0x0.0p0 0x1.7266666666666p6 -0x1.1285343edbb0ap9 0x0.0p0 T +CSV proj4-epsg.csv:02702 0 OK 0x1.c1d41eba6399ep25 -0x1.feb54423f1602p23 0x0.0p0 0x1.7266666666666p6 -0x1.1285343edbb0ap9 0x0.0p0 T +CSV proj4-epsg.csv:02703 0 OK 0x1.0d4389064f745p24 -0x1.378e09a631ac1p22 0x0.0p0 0x1.75p6 -0x1.c6d17f02be8f6p8 0x0.0p0 T +CSV proj4-epsg.csv:02704 0 OK 0x1.b9b470751ffe2p25 -0x1.ff146a1196642p23 0x0.0p0 0x1.75p6 -0x1.c6d17f02be8e6p8 0x0.0p0 T +CSV proj4-epsg.csv:02705 0 OK 0x1.0b63923e0758fp24 -0x1.29ea8c55dd03dp22 0x0.0p0 0x1.75fffffffffffp6 -0x1.a72281dc3c9c7p8 0x0.0p0 T +CSV proj4-epsg.csv:02706 0 OK 0x1.b6a1192da570cp25 -0x1.e8b4eab043d69p23 0x0.0p0 0x1.75fffffffffffp6 -0x1.a72281dc3c9c2p8 0x0.0p0 T +CSV proj4-epsg.csv:02707 0 OK 0x1.0ec6db0de2312p24 -0x1.2e126b8698102p22 0x0.0p0 0x1.7433333333334p6 -0x1.e1e79ae9bbf53p8 0x0.0p0 T +CSV proj4-epsg.csv:02708 0 OK 0x1.bc2fce6155b78p25 -0x1.ef861c1ed120cp23 0x0.0p0 0x1.7433333333334p6 -0x1.e1e79ae9bbf53p8 0x0.0p0 T +CSV proj4-epsg.csv:02709 0 OK 0x1.0e657fbbc5d7ap24 -0x1.2bf38d546cddp22 0x0.0p0 0x1.7466666666667p6 -0x1.dafb7554ead1ap8 0x0.0p0 T +CSV proj4-epsg.csv:02710 0 OK 0x1.bb9019bfdd9cap25 -0x1.ec0b94887746ap23 0x0.0p0 0x1.7466666666667p6 -0x1.dafb7554ead1ap8 0x0.0p0 T +CSV proj4-epsg.csv:02711 0 OK 0x1.11d47b91b3788p24 -0x1.2fc899b0a66bdp22 0x0.0p0 0x1.7299999999999p6 -0x1.0e90d72380f02p9 0x0.0p0 T +CSV proj4-epsg.csv:02712 0 OK 0x1.c1320009c8a5ep25 -0x1.f254e87d316dap23 0x0.0p0 0x1.7299999999999p6 -0x1.0e90d72380f08p9 0x0.0p0 T +CSV proj4-epsg.csv:02713 0 OK 0x1.0ce2b81625848p24 -0x1.2275ebd713119p22 0x0.0p0 0x1.7533333333333p6 -0x1.c04b0eb5aa75bp8 0x0.0p0 T +CSV proj4-epsg.csv:02714 0 OK 0x1.b9159ed4f8366p25 -0x1.dc79f92b5f2cdp23 0x0.0p0 0x1.7533333333333p6 -0x1.c04b0eb5aa75bp8 0x0.0p0 T +CSV proj4-epsg.csv:02715 0 OK 0x1.11719eb83870bp24 -0x1.23d604bd30a35p22 0x0.0p0 0x1.72cccccccccccp6 -0x1.0aab5f26c33aap9 0x0.0p0 T +CSV proj4-epsg.csv:02716 0 OK 0x1.c08fd2fac8f5bp25 -0x1.debb8f3d9a8fbp23 0x0.0p0 0x1.72cccccccccccp6 -0x1.0aab5f26c33a9p9 0x0.0p0 T +CSV proj4-epsg.csv:02717 0 OK 0x1.167deecb06eb7p24 -0x1.245292a732779p22 0x0.0p0 0x1.7033333333335p6 -0x1.421fc7bb0119p9 0x0.0p0 T +CSV proj4-epsg.csv:02718 0 OK 0x1.c8d7c16d43239p25 -0x1.df87e16cf08c6p23 0x0.0p0 0x1.7033333333335p6 -0x1.421fc7bb0119p9 0x0.0p0 T +CSV proj4-epsg.csv:02719 0 OK 0x1.00d50e940549cp24 -0x1.2ca9064ee685fp22 0x0.0p0 0x1.7bccccccccccdp6 -0x1.16fc793f362bdp8 0x0.0p0 T +CSV proj4-epsg.csv:02720 0 OK 0x1.a54fd94d0e39p25 -0x1.ed354555b2431p23 0x0.0p0 0x1.7bccccccccccdp6 -0x1.16fc793f362c4p8 0x0.0p0 T +CSV proj4-epsg.csv:02721 0 OK 0x1.029d2ee8f610ap24 -0x1.27a0b75e2d9ddp22 0x0.0p0 0x1.7accccccccccep6 -0x1.2bacd531ebd75p8 0x0.0p0 T +CSV proj4-epsg.csv:02722 0 OK 0x1.a83c1604c44a5p25 -0x1.e4f3e88876fdcp23 0x0.0p0 0x1.7accccccccccep6 -0x1.2bacd531ebd75p8 0x0.0p0 T +CSV proj4-epsg.csv:02723 0 OK 0x1.06f4815277d15p24 -0x1.2b4bb7da253b4p22 0x0.0p0 0x1.7866666666666p6 -0x1.63f9bc9d5c7b2p8 0x0.0p0 T +CSV proj4-epsg.csv:02724 0 OK 0x1.af5b1df49d83p25 -0x1.eaf8433f57be5p23 0x0.0p0 0x1.7866666666666p6 -0x1.63f9bc9d5c7afp8 0x0.0p0 T +CSV proj4-epsg.csv:02725 0 OK 0x1.0f883aa19ab9fp24 -0x1.22b8b2dcc29ffp22 0x0.0p0 0x1.73ccccccccccbp6 -0x1.f00f7ff3971a2p8 0x0.0p0 T +CSV proj4-epsg.csv:02726 0 OK 0x1.bd6d04df7fa15p25 -0x1.dce78420f729p23 0x0.0p0 0x1.73ccccccccccbp6 -0x1.f00f7ff3971a2p8 0x0.0p0 T +CSV proj4-epsg.csv:02727 0 OK 0x1.007a07bfb243bp24 -0x1.38c844627e045p22 0x0.0p0 0x1.7cp6 -0x1.1306e746839abp8 0x0.0p0 T +CSV proj4-epsg.csv:02728 0 OK 0x1.a4ba86f3874f2p25 -0x1.008bf0d61e14bp24 0x0.0p0 0x1.7cp6 -0x1.1306e746839bp8 0x0.0p0 T +CSV proj4-epsg.csv:02729 0 OK 0x1.12fc4ec4f29e8p24 -0x1.2b4defd7ee8cfp22 0x0.0p0 0x1.72p6 -0x1.1a9b871f523eep9 0x0.0p0 T +CSV proj4-epsg.csv:02730 0 OK 0x1.c31746c2dcee5p25 -0x1.eafbe6fd6b0eap23 0x0.0p0 0x1.72p6 -0x1.1a9b871f523f5p9 0x0.0p0 T +CSV proj4-epsg.csv:02731 0 OK 0x1.0e657fbbc5d7ap24 -0x1.331128bb922a5p22 0x0.0p0 0x1.7466666666667p6 -0x1.dafb7554ead1p8 0x0.0p0 T +CSV proj4-epsg.csv:02732 0 OK 0x1.bb9019bfdd9cap25 -0x1.f7b7c656ae631p23 0x0.0p0 0x1.7466666666667p6 -0x1.dafb7554ead1ap8 0x0.0p0 T +CSV proj4-epsg.csv:02733 0 OK 0x1.135f3cfb29897p24 -0x1.23f0b13bed56dp22 0x0.0p0 0x1.71ccccccccccdp6 -0x1.1ebdf3d132b37p9 0x0.0p0 T +CSV proj4-epsg.csv:02734 0 OK 0x1.c3b9904d13d1bp25 -0x1.dee750d1586ep23 0x0.0p0 0x1.71ccccccccccdp6 -0x1.1ebdf3d132b37p9 0x0.0p0 T +CSV proj4-epsg.csv:02735 0 OK 0x1.12999e905de88p24 -0x1.2d969032c63cdp22 0x0.0p0 0x1.7233333333333p6 -0x1.1688b0927d87bp9 0x0.0p0 T +CSV proj4-epsg.csv:02736 0 OK 0x1.c27562f00591ep25 -0x1.eebaeee45b97fp23 0x0.0p0 0x1.7233333333333p6 -0x1.1688b0927d875p9 0x0.0p0 T +CSV proj4-epsg.csv:02737 0 OK 0x1.02414decf43b6p24 -0x1.32bae09ac8a6dp22 0x0.0p0 0x1.7b00000000001p6 -0x1.276a53f4372a2p8 0x0.0p0 T +CSV proj4-epsg.csv:02738 0 OK 0x1.a7a55dcdc51f8p25 -0x1.f72a3c9aec5a9p23 0x0.0p0 0x1.7b00000000001p6 -0x1.276a53f4372ap8 0x0.0p0 T +CSV proj4-epsg.csv:02739 0 OK -0x1.6b3853a7eb662p22 -0x1.516c2c15e1775p17 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff6e5p-1 0x0.0p0 T +CSV proj4-epsg.csv:02740 0 OK -0x1.af70008450957p22 -0x1.84dee0d9d6947p17 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8c1cp-1 0x0.0p0 T +CSV proj4-epsg.csv:02741 0 OK -0x1.ff7b560a76deep22 -0x1.d1488568209b6p17 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff784a5p-1 0x0.0p0 T +CSV proj4-epsg.csv:02742 0 OK 0x1.557ec04bc117dp23 0x1.75ba2f8a03b4ap20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02743 0 OK 0x1.13b5020ff5e59p24 -0x1.49ea34695d9ap22 0x0.0p0 0x1.6fffffffffffep6 -0x1.46d9a300ca5ebp9 0x0.0p0 T +CSV proj4-epsg.csv:02744 0 OK 0x1.52198555f64dap23 0x1.8704265f1e701p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02745 0 OK 0x1.1aee8091e2984p24 -0x1.4939484196077p22 0x0.0p0 0x1.6e00000000001p6 -0x1.7a30ff95cedd6p9 0x0.0p0 T +CSV proj4-epsg.csv:02746 0 OK 0x1.4f0594d9b8ae6p23 0x1.563da4ad5ec46p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02747 0 OK 0x1.4d23ccd1c97fbp23 0x1.2070af296ff7dp20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02748 0 OK 0x1.4e5df13157131p23 0x1.417bc48bf6bf5p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02749 0 OK 0x1.4f32cde392c1ap23 0x1.27b1f52bfcc08p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02750 0 OK 0x1.1d6e2b1cd0e82p24 -0x1.414a8d414e4f4p22 0x0.0p0 0x1.6ce6666666666p6 -0x1.99de9f018dceep9 0x0.0p0 T +CSV proj4-epsg.csv:02751 0 OK 0x1.0ffe1d84938ep24 -0x1.526273870406ap22 0x0.0p0 0x1.72e93e93e93e7p6 -0x1.0887937c713c8p9 0x0.0p0 T +CSV proj4-epsg.csv:02752 0 OK 0x1.50bf079032848p23 0x1.60fcd078fe5a1p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02753 0 OK 0x1.1663ade9018dep24 -0x1.5b024ac35703fp22 0x0.0p0 0x1.6f6eeeeeeeeedp6 -0x1.54a0fbad9bdacp9 0x0.0p0 T +CSV proj4-epsg.csv:02754 0 OK 0x1.1c7cc061fc30cp24 -0x1.5235bf1617794p22 0x0.0p0 0x1.6d77777777777p6 -0x1.8939c773970e1p9 0x0.0p0 T +CSV proj4-epsg.csv:02755 0 OK 0x1.4d4fcfff2739cp23 0x1.199916a41351cp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02756 0 OK 0x1.4c9aee7a430fp23 0x1.1590431b7336ap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02757 0 OK 0x1.153c034bef7b8p24 -0x1.44b1a15522eecp22 0x0.0p0 0x1.706c16c16c16cp6 -0x1.3cf46f68077p9 0x0.0p0 T +CSV proj4-epsg.csv:02758 0 OK 0x1.10ee43ca47082p24 -0x1.4b31242539116p22 0x0.0p0 0x1.71ccccccccccdp6 -0x1.1ebdf3d132b37p9 0x0.0p0 T +CSV proj4-epsg.csv:02759 0 OK 0x1.4f056217ce58p23 0x1.1c33ff18d592fp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02760 0 OK 0x1.4c725aa03c47bp23 0x1.2696513da9044p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02761 0 OK 0x1.149affef7ac24p24 -0x1.552519d82080fp22 0x0.0p0 0x1.7127d27d27d28p6 -0x1.2c7d4c2d987dap9 0x0.0p0 T +CSV proj4-epsg.csv:02762 0 OK 0x1.18244f0726b48p24 -0x1.569d45a6a480dp22 0x0.0p0 0x1.6e55555555557p6 -0x1.7118278081189p9 0x0.0p0 T +CSV proj4-epsg.csv:02763 0 OK 0x1.51448c48d7122p23 0x1.4dc9edbf44d23p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02764 0 OK 0x1.154bd315dfad9p24 -0x1.5381418f97f7p22 0x0.0p0 0x1.705dddddddddcp6 -0x1.3e3d395df74dep9 0x0.0p0 T +CSV proj4-epsg.csv:02765 0 OK 0x1.4cb05a6b46f99p23 0x1.2423f7e8903a6p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02766 0 OK 0x1.53c2fa7c74147p23 0x1.7cccebe38a591p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02767 0 OK 0x1.4adc3c0529a6ep23 0x1.19f9500373177p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02768 0 OK 0x1.502745408b4b4p23 0x1.45db4f4385803p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02769 0 OK 0x1.5455be858c93p23 0x1.68f48844064c5p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02770 0 OK 0x1.1c0ca51e4a844p24 -0x1.525a495425ea1p22 0x0.0p0 0x1.6d93e93e93e93p6 -0x1.860b435568ea8p9 0x0.0p0 T +CSV proj4-epsg.csv:02771 0 OK 0x1.518baf1a4cb04p23 0x1.4c5f2b1554e79p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02772 0 OK 0x1.51b5fcfeb9662p23 0x1.3d785bf3206f7p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02773 0 OK 0x1.4eefacfbcc608p23 0x1.2278765be7ed2p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02774 0 OK 0x1.4c7b8bd7eaf9ep23 0x1.019a1a587529ep20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02775 0 OK 0x1.5623765d6eb6p23 0x1.903830b9daa63p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02776 0 OK 0x1.1590c3a3cd818p24 -0x1.49c347771d7e5p22 0x0.0p0 0x1.6fbe93e93e93fp6 -0x1.4cfdfeff95966p9 0x0.0p0 T +CSV proj4-epsg.csv:02777 0 OK 0x1.183148c874311p24 -0x1.47b1fdd4254cp22 0x0.0p0 0x1.6f1999999999bp6 -0x1.5d027c5461801p9 0x0.0p0 T +CSV proj4-epsg.csv:02778 0 OK 0x1.1c926a4e1bbcap24 -0x1.4e941cdc09474p22 0x0.0p0 0x1.6cbbbbbbbbbbbp6 -0x1.9ee6897eeb3afp9 0x0.0p0 T +CSV proj4-epsg.csv:02779 0 OK 0x1.4bf98a881f974p23 0x1.0ede425ad010ep20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02780 0 OK 0x1.5073fff8e4d12p23 0x1.3e6a525953155p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02781 0 OK 0x1.1818de7829d19p25 0x1.3288c3aefdb27p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02782 0 OK 0x1.c44643101cd33p25 -0x1.0e9952c681d1ap24 0x0.0p0 0x1.6fffffffffffep6 -0x1.46d9a300ca5f1p9 0x0.0p0 T +CSV proj4-epsg.csv:02783 0 OK 0x1.154feb4886e8dp25 0x1.40b6fa234df2bp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02784 0 OK 0x1.d02033f98333dp25 -0x1.0e0835c599b2p24 0x0.0p0 0x1.6e00000000001p6 -0x1.7a30ff95cedcep9 0x0.0p0 T +CSV proj4-epsg.csv:02785 0 OK 0x1.12c9a5059a1bbp25 0x1.18b570b8b89a2p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02786 0 OK 0x1.113e7bc7fbdc8p25 0x1.d9297d3544189p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02787 0 OK 0x1.1240253dd915bp25 0x1.07aef49237526p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02788 0 OK 0x1.12eebc9aeb24ap25 0x1.e5103102f6f36p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02789 0 OK 0x1.d43985a7f2c9ap25 -0x1.07869686744dp24 0x0.0p0 0x1.6ce6666666666p6 -0x1.99de9f018dceep9 0x0.0p0 T +CSV proj4-epsg.csv:02790 0 OK 0x1.be2e66d255b4bp25 -0x1.158bbcbabb402p24 0x0.0p0 0x1.72e93e93e93e7p6 -0x1.0887937c713c3p9 0x0.0p0 T +CSV proj4-epsg.csv:02791 0 OK 0x1.1433b9599fea5p25 0x1.2185f948ca9d4p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02792 0 OK 0x1.c8acb060dcadap25 -0x1.1c9ea06a0e03fp24 0x0.0p0 0x1.6f6eeeeeeeeedp6 -0x1.54a0fbad9bdacp9 0x0.0p0 T +CSV proj4-epsg.csv:02793 0 OK 0x1.d2ad7f6d7ffbdp25 -0x1.156711e7462cbp24 0x0.0p0 0x1.6d77777777777p6 -0x1.8939c773970d8p9 0x0.0p0 T +CSV proj4-epsg.csv:02794 0 OK 0x1.11629536b6587p25 0x1.cdf02465cc5bep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02795 0 OK 0x1.10ce390a8dbf5p25 0x1.c751e06d5d317p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:02796 0 OK 0x1.c6c7ac3c05378p25 -0x1.0a510dc42a095p24 0x0.0p0 0x1.706c16c16c16cp6 -0x1.3cf46f68077p9 0x0.0p0 T +CSV proj4-epsg.csv:02797 0 OK 0x1.bfb858cde8178p25 -0x1.0fa57ab69effep24 0x0.0p0 0x1.71ccccccccccdp6 -0x1.1ebdf3d132b3cp9 0x0.0p0 T +CSV proj4-epsg.csv:02798 0 OK 0x1.12c97b63c877fp25 0x1.d2362632bd6e9p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02799 0 OK 0x1.10acf0d6c14e3p25 0x1.e33ee730b7028p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02800 0 OK 0x1.c5bf8b4ebc04ap25 -0x1.17cf5651733cp24 0x0.0p0 0x1.7127d27d27d28p6 -0x1.2c7d4c2d987d4p9 0x0.0p0 T +CSV proj4-epsg.csv:02801 0 OK 0x1.cb8ca0c914e2cp25 -0x1.1903e0389c54bp24 0x0.0p0 0x1.6e55555555557p6 -0x1.711827808117fp9 0x0.0p0 T +CSV proj4-epsg.csv:02802 0 OK 0x1.14a13ca9a0e91p25 0x1.11c6be5cff3d5p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02803 0 OK 0x1.c6e19c4b73744p25 -0x1.1676fa17eb435p24 0x0.0p0 0x1.705dddddddddcp6 -0x1.3e3d395df74dep9 0x0.0p0 T +CSV proj4-epsg.csv:02804 0 OK 0x1.10dfcb0416a7ep25 0x1.df3b6e097a20ap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02805 0 OK 0x1.16ace2098c31fp25 0x1.3855f1e80883ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02806 0 OK 0x1.0f5fd68ff5354p25 0x1.ce8dfd63e098ap21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02807 0 OK 0x1.13b740004a0ap25 0x1.0b453682133d1p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02808 0 OK 0x1.172542ef31777p25 0x1.280ef7a9188f6p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02809 0 OK 0x1.d1f598ad0ca21p25 -0x1.15850a54fc678p24 0x0.0p0 0x1.6d93e93e93e93p6 -0x1.860b435568eap9 0x0.0p0 T +CSV proj4-epsg.csv:02810 0 OK 0x1.14db9553c4603p25 0x1.109d3459952a7p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02811 0 OK 0x1.14fe48185af7p25 0x1.0464442aa3e66p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02812 0 OK 0x1.12b7ad6708644p25 0x1.dc7e244b14cd8p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02813 0 OK 0x1.10b47af7ab1f7p25 0x1.a693161905176p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:02814 0 OK 0x1.189ff76e391a7p25 0x1.48436bceae7aap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02815 0 OK 0x1.c752b34702a4bp25 -0x1.0e796571646dfp24 0x0.0p0 0x1.6fbe93e93e93fp6 -0x1.4cfdfeff9596bp9 0x0.0p0 T +CSV proj4-epsg.csv:02816 0 OK 0x1.cba1e9d8fdd36p25 -0x1.0cc745270e7fcp24 0x0.0p0 0x1.6f1999999999bp6 -0x1.5d027c5461801p9 0x0.0p0 T +CSV proj4-epsg.csv:02817 0 OK 0x1.d2d1090d294e7p25 -0x1.126c939e111afp24 0x0.0p0 0x1.6cbbbbbbbbbbbp6 -0x1.9ee6897eeb3afp9 0x0.0p0 T +CSV proj4-epsg.csv:02818 0 OK 0x1.1049d95bb2191p25 0x1.bc56329cb0b05p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:02819 0 OK 0x1.13f62f1fb4d5p25 0x1.052ab9d5eac7dp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:02820 0 OK 0x1.0fdd3864d24e5p21 -0x1.cb846c1bdd789p16 -0x1.04653cf628p7 0x1.00031bd941d35p0 -0x1.fffff86a5fe7bp-1 -0x1.be97p-14 T +CSV proj4-epsg.csv:02821 0 OK 0x1.3145aadd81225p21 -0x1.e0967f1322d31p16 -0x1.04653cf628p7 0x1.001eb54cd283fp0 -0x1.000008d52c6c2p0 -0x1.18941p-10 T +CSV proj4-epsg.csv:02822 0 OK 0x1.4dff752e31779p21 -0x1.fd92bcbfb9f89p16 -0x1.04653cf628p7 0x1.00c90d6c66ffep0 -0x1.0001d225dae2ap0 -0x1.c9e914p-8 T +CSV proj4-epsg.csv:02823 0 OK 0x1.6465290e7586cp21 -0x1.12548ffdfaf08p17 -0x1.04653cf628p7 0x1.03eed68f0dde7p0 -0x1.001450aa8ba47p0 -0x1.1cbf0ap-5 T +CSV proj4-epsg.csv:02824 0 OK 0x1.72617bc182514p21 -0x1.2c91020066e58p17 -0x1.04653cf628p7 0x1.107b3d3324e5dp0 -0x1.009801bacd3adp0 -0x1.27633e6p-3 T +CSV proj4-epsg.csv:02825 0 OK 0x1.7545b1928a1e8p21 -0x1.4ff00e8a7d3fep17 -0x1.04653cf628p7 0x1.3d81b789fc89ap0 -0x1.039c174496644p0 -0x1.0fb5c168p-1 T +CSV proj4-epsg.csv:02826 0 OK 0x1.69957060a9e3cp21 -0x1.800c6749388e7p17 -0x1.04653cf628p7 0x1.d623a2aebe2d2p0 -0x1.13802c645eabfp0 -0x1.cf90c24p0 T +CSV proj4-epsg.csv:02827 0 OK 0x1.4ac64cdb41714p21 -0x1.c229086f2a061p17 -0x1.04653cf628p7 0x1.e88e488e6ca03p1 -0x1.6314f92c3fcc5p0 -0x1.7b721a7dp2 T +CSV proj4-epsg.csv:02828 0 OK 0x1.12f1660f8e3acp21 -0x1.0eedd4d3c293ap18 -0x1.04653cf628p7 0x1.4decb7b697c1ep3 -0x1.76a0ccd773632p1 -0x1.312db9a88p4 T +CSV proj4-epsg.csv:02829 0 OK 0x1.74eac5d0c1318p20 -0x1.4ef63fd6f12e4p18 -0x1.04653cf628p7 0x1.08d394bf63cbap5 -0x1.560a7a2ce0254p3 -0x1.d3e1f93f6p5 T +CSV proj4-epsg.csv:02830 0 OK 0x1.bc392a061ad8p18 -0x1.a8bb1ef4140c1p18 -0x1.04653cf628p7 0x1.c6ec6e329bf13p6 -0x1.9a6eb3f4e54c6p5 -0x1.3af108618p5 T +CSV proj4-epsg.csv:02831 0 EXC:java.lang.IllegalStateException -0x1.04a0f3ab24fe8p20 -0x1.13549903f56efp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:02832 0 OK -0x1.b0d58f365b636p20 -0x1.cb846c1bdd789p16 -0x1.04653cf628p7 0x1.00031bd941d35p0 -0x1.fffff86a5fe7bp-1 -0x1.be97p-14 T +CSV proj4-epsg.csv:02833 0 OK -0x1.311455227eddbp21 -0x1.e0967f1322d31p16 -0x1.04653cf628p7 0x1.001eb54cd283fp0 -0x1.000008d52c6c2p0 -0x1.18941p-10 T +CSV proj4-epsg.csv:02834 0 OK -0x1.8e6c8ad1ce887p21 -0x1.fd92bcbfb9f89p16 -0x1.04653cf628p7 0x1.00c90d6c66ffep0 -0x1.0001d225dae2ap0 -0x1.c9e914p-8 T +CSV proj4-epsg.csv:02835 0 OK -0x1.f218d6f18a794p21 -0x1.12548ffdfaf08p17 -0x1.04653cf628p7 0x1.03eed68f0dde7p0 -0x1.001450aa8ba47p0 -0x1.1cbf0ap-5 T +CSV proj4-epsg.csv:02836 0 OK -0x1.2f17421f3ed76p22 -0x1.2c91020066e58p17 -0x1.04653cf628p7 0x1.107b3d3324e5dp0 -0x1.009801bacd3adp0 -0x1.27633e6p-3 T +CSV proj4-epsg.csv:02837 0 OK -0x1.6aae2736baf0cp22 -0x1.4ff00e8a7d3fep17 -0x1.04653cf628p7 0x1.3d81b789fc89ap0 -0x1.039c174496644p0 -0x1.0fb5c168p-1 T +CSV proj4-epsg.csv:02838 0 OK -0x1.ad8f47cfab0e2p22 -0x1.800c6749388e7p17 -0x1.04653cf628p7 0x1.d623a2aebe2d2p0 -0x1.13802c645eabfp0 -0x1.cf90c24p0 T +CSV proj4-epsg.csv:02839 0 OK -0x1.f9ffd9925f476p22 -0x1.c229086f2a061p17 -0x1.04653cf628p7 0x1.e88e488e6ca03p1 -0x1.6314f92c3fcc5p0 -0x1.7b721a7dp2 T +CSV proj4-epsg.csv:02840 0 OK -0x1.2979a67c1c715p23 -0x1.0eedd4d3c293ap18 -0x1.04653cf628p7 0x1.4decb7b697c1ep3 -0x1.76a0ccd773632p1 -0x1.312db9a88p4 T +CSV proj4-epsg.csv:02841 0 OK -0x1.5e1d2745e7d9dp23 -0x1.4ef63fd6f12e4p18 -0x1.04653cf628p7 0x1.08d394bf63cbap5 -0x1.560a7a2ce0254p3 -0x1.d3e1f93f6p5 T +CSV proj4-epsg.csv:02842 0 OK -0x1.9d5d36afcf294p23 -0x1.a8bb1ef4140c1p18 -0x1.04653cf628p7 0x1.c6ec6e329bf13p6 -0x1.9a6eb3f4e54c6p5 -0x1.3af108618p5 T +CSV proj4-epsg.csv:02843 0 EXC:java.lang.IllegalStateException -0x1.ea579e75649fdp23 -0x1.13549903f56efp19 -0x1.04653cf628p7 NaN NaN NaN T +CSV proj4-epsg.csv:02844 0 OK -0x1.30f44d55931c6p21 -0x1.e1a348516c417p16 0x1.cde3ab932p5 0x1.0000000000022p0 -0x1.ffffffffffffbp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02845 0 OK -0x1.8e48d43aa3858p21 -0x1.feb7c808c1e53p16 0x1.cde3ab932p5 0x1.0000000000022p0 -0x1.ffffffffffff9p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02846 0 OK -0x1.f2023963728c6p21 -0x1.1304296fc2ea1p17 0x1.cde3ab932p5 0x1.0000000000022p0 -0x1.fffffffffffdcp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02847 0 OK -0x1.2f2ec82d1feddp22 -0x1.2d98788c9b0dp17 0x1.cde3ab932p5 0x1.000000000017ap0 -0x1.ffffffffffef5p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02848 0 OK -0x1.8d4f17d9e6597p23 -0x1.224419cf6cf0ep23 0x1.8fb43d32ap6 0x1.ffffe02008b4dp-1 -0x1.ffffd21f7248ap-1 0x1.5e44p-15 F +CSV proj4-epsg.csv:02849 0 OK -0x1.44462b51ec77p23 -0x1.26ec5523150fap23 0x1.8fb43d32ap6 0x1.ffffffa511c35p-1 -0x1.ffffffb8683c1p-1 0x1.3c7ap-15 F +CSV proj4-epsg.csv:02850 0 OK -0x1.0ee3e3b14c5b2p23 -0x1.293dd0bbe2e7ap23 0x1.8fb43d32ap6 0x1.fffffffbc3fadp-1 -0x1.ffffffff43abfp-1 0x1.3c4p-15 F +CSV proj4-epsg.csv:02851 0 OK -0x1.c89252475b33p22 -0x1.2aa08356eb37ap23 0x1.8fb43d32ap6 0x1.fffffffe4a065p-1 -0x1.00000000643eap0 0x1.3c3ep-15 F +CSV proj4-epsg.csv:02852 0 OK -0x1.80e9a91a5b134p22 -0x1.2b8a01e0ed004p23 0x1.8fb43d32ap6 0x1.fffffffe6cc5ap-1 -0x1.000000006cbdbp0 0x1.3c3cp-15 F +CSV proj4-epsg.csv:02853 0 OK -0x1.427262eb8cc03p22 -0x1.2c2ce64dbce66p23 0x1.8fb43d32ap6 0x1.fffffffe6f838p-1 -0x1.000000006d538p0 0x1.3c4p-15 F +CSV proj4-epsg.csv:02854 0 OK -0x1.0a83e0ecca2c5p22 -0x1.2ca2a7852e16p23 0x1.8fb43d32ap6 0x1.fffffffe6fbccp-1 -0x1.000000006d616p0 0x1.3c42p-15 F +CSV proj4-epsg.csv:02855 0 OK -0x1.aeb740e3263a4p21 -0x1.2cf974d7c0a5p23 0x1.8fb43d32ap6 0x1.fffffffe6fcb2p-1 -0x1.000000006d63p0 0x1.3c42p-15 F +CSV proj4-epsg.csv:02856 0 OK -0x1.4f779fdd55f0dp21 -0x1.2d39c5e7b5384p23 0x1.8fb43d32ap6 0x1.fffffffe6fcb2p-1 -0x1.000000006d62p0 0x1.3c42p-15 F +CSV proj4-epsg.csv:02857 0 OK -0x1.eadec7ab18916p20 -0x1.2d68e4fa2c3eep23 0x1.8fb43d32ap6 0x1.fffffffe6fcb2p-1 -0x1.000000006d63p0 0x1.3c42p-15 F +CSV proj4-epsg.csv:02858 0 OK -0x1.3e57776abc6ep20 -0x1.2d8a3469d32c8p23 0x1.8fb43d32ap6 0x1.fffffffe6fcb2p-1 -0x1.000000006d63ap0 0x1.3c42p-15 F +CSV proj4-epsg.csv:02859 0 OK -0x1.8d4f2616db2b8p23 -0x1.2243414bf0ba8p23 0x1.c998cdf0ap6 0x1.ffffe023f874fp-1 -0x1.ffffd21c9ac9bp-1 0x1.1ddp-18 F +CSV proj4-epsg.csv:02860 0 OK -0x1.444639524a097p23 -0x1.26ebc1052c664p23 0x1.c998cdf0ap6 0x1.ffffffa6a45fep-1 -0x1.ffffffb789ab3p-1 0x1.1p-25 F +CSV proj4-epsg.csv:02861 0 OK -0x1.0ee3f010596ecp23 -0x1.293d5ea4ec606p23 0x1.c998cdf0ap6 0x1.fffffffd5436cp-1 -0x1.fffffffe68da1p-1 0x1.0p-29 F +CSV proj4-epsg.csv:02862 0 OK -0x1.c892683742c02p22 -0x1.2aa025903faecp23 0x1.c998cdf0ap6 0x1.ffffffffda425p-1 -0x1.ffffffffedafap-1 0x1.0p-28 F +CSV proj4-epsg.csv:02863 0 OK -0x1.80e9bcde13984p22 -0x1.2b89b1769c682p23 0x1.c998cdf0ap6 0x1.fffffffffce52p-1 -0x1.fffffffffebfcp-1 0x1.8p-29 F +CSV proj4-epsg.csv:02864 0 OK -0x1.4272750768b3ep22 -0x1.2c2c9f342792cp23 0x1.c998cdf0ap6 0x1.ffffffffffa3p-1 -0x1.ffffffffffd9fp-1 0x1.8p-29 F +CSV proj4-epsg.csv:02865 0 OK -0x1.0a83f1c6cabbfp22 -0x1.2ca26726ecb9p23 0x1.c998cdf0ap6 0x1.fffffffffff8fp-1 -0x1.fffffffffff22p-1 0x1.0p-28 F +CSV proj4-epsg.csv:02866 0 OK -0x1.aeb760b2294efp21 -0x1.2cf9396fb5716p23 0x1.c998cdf0ap6 0x1.fffffffffff8fp-1 -0x1.000000000007ap0 0x1.0p-28 F +CSV proj4-epsg.csv:02867 0 OK -0x1.4f77be465f272p21 -0x1.2d398e2d03faap23 0x1.c998cdf0ap6 0x1.fffffffffff8fp-1 -0x1.000000000001ep0 0x1.0p-28 F +CSV proj4-epsg.csv:02868 0 OK -0x1.eadf028407822p20 -0x1.2d68aff1939d8p23 0x1.c998cdf0ap6 0x1.fffffffffff8fp-1 -0x1.0000000000032p0 0x1.0p-28 F +CSV proj4-epsg.csv:02869 0 OK -0x1.3e57b100ec3fep20 -0x1.2d8a0149b7cd4p23 0x1.c998cdf0ap6 0x1.fffffffffff8fp-1 -0x1.fffffffffffa5p-1 0x1.0p-28 F +CSV proj4-epsg.csv:02870 0 OK -0x1.8e42b4ce2f992p21 -0x1.fdcda266ad6f7p16 -0x1.9f15be7f3p6 0x1.fffffffffffc9p-1 -0x1.ffffffffffffbp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02871 0 OK -0x1.f1fb89baf217ep21 -0x1.12850de97fb09p17 -0x1.9f15be7f3p6 0x1.000000000001fp0 -0x1.fffffffffffe2p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02872 0 OK -0x1.2f2ae64712416p22 -0x1.2d0b8cebc56cdp17 -0x1.9f15be7f3p6 0x1.000000000011fp0 -0x1.fffffffffff0dp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02873 0 OK -0x1.6b3733420e9cbp22 -0x1.517102d7e5c3bp17 -0x1.9f15be7f3p6 0x1.0000000000ba4p0 -0x1.ffffffffff698p-1 0x1.8p-29 T +CSV proj4-epsg.csv:02874 0 OK -0x1.af6f25fb706bap22 -0x1.84e480a6bc884p17 -0x1.9f15be7f3p6 0x1.000000000820bp0 -0x1.fffffffff88b7p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02875 0 OK -0x1.6b3733420e9cbp22 -0x1.517102d7e5c3bp17 -0x1.9f15be7f3p6 0x1.0000000000ba4p0 -0x1.ffffffffff698p-1 0x1.8p-29 T +CSV proj4-epsg.csv:02876 0 OK -0x1.2f2a293d1dfa1p22 -0x1.2d25487afdcf1p17 -0x1.eb0e67f92p5 0x1.00000000000d7p0 -0x1.fffffffffff0bp-1 0x1.0p-29 T +CSV proj4-epsg.csv:02877 0 OK -0x1.6b36080034c82p22 -0x1.518d6f9dd2d9ep17 -0x1.eb0e67f92p5 0x1.0000000000b23p0 -0x1.ffffffffff6e5p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02878 0 OK 0x1.2a0fae903cb77p20 -0x1.00a273c37459p22 0x1.bec8ab9dcp5 0x1.fffffcc22d208p-1 -0x1.fffffff6ecdbep-1 0x1.98p-24 T +CSV proj4-epsg.csv:02879 0 OK 0x1.f2775d20796eep19 -0x1.12f1f3c37459p22 0x1.bec8ab9dcp5 0x1.fffffcc22d208p-1 -0x1.fffffff6ecdbep-1 0x1.98p-24 T +CSV proj4-epsg.csv:02880 0 OK 0x1.bdeee2fe6ae81p22 0x1.2bacba4f6be77p23 -0x1.aa68deeeap6 0x1.fffffffffce2ep-1 -0x1.fffffffffeabdp-1 0x1.8p-29 T +CSV proj4-epsg.csv:02881 0 OK 0x1.7f77a97f37074p22 0x1.2c4f36811084p23 -0x1.aa68deeeap6 0x1.ffffffffffaf3p-1 -0x1.ffffffffffde3p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02882 0 OK 0x1.47892314ae2c9p22 0x1.2cc4ac21fd546p23 -0x1.aa68deeeap6 0x1.fffffffffffa7p-1 -0x1.fffffffffffeep-1 0x1.0p-29 T +CSV proj4-epsg.csv:02883 0 OK -0x1.b0a028d3ab656p20 0x1.2d981ce83d363p23 0x1.b5d2e2becp4 0x1.0000000000003p0 -0x1.fffffffffffebp-1 0x1.0p-28 T +CSV proj4-epsg.csv:02884 0 OK -0x1.30f1d3d5d59f2p21 0x1.2d6e0e5fb8fp23 0x1.b5d2e2becp4 0x1.0000000000003p0 -0x1.0000000000011p0 0x1.0p-28 T +CSV proj4-epsg.csv:02885 0 OK -0x1.8e463fd058334p21 0x1.2d3428b8bbc31p23 0x1.b5d2e2becp4 0x1.000000000001p0 -0x1.fffffffffffd9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:02886 0 OK -0x1.30f4c2e8946aap21 0x1.2d6e1f2f672dap23 0x1.560686fd8p5 0x1.000000000000ep0 -0x1.0000000000013p0 0x1.0p-29 T +CSV proj4-epsg.csv:02887 0 OK -0x1.8e495c65b2678p21 0x1.2d343a11c2a6dp23 0x1.560686fd8p5 0x1.000000000000ep0 -0x1.fffffffffffdcp-1 0x1.0p-29 T +CSV proj4-epsg.csv:02888 0 OK -0x1.f202da3610ff2p21 0x1.2ce5f4bfa75b5p23 0x1.560686fd8p5 0x1.0000000000063p0 -0x1.fffffffffffcep-1 0x1.0p-29 T +CSV proj4-epsg.csv:02889 0 OK -0x1.30f4c2e8946aap21 -0x1.df70684c692d5p16 0x1.560686fd8p5 0x1.000000000000ep0 -0x1.ffffffffffff9p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02890 0 OK -0x1.8e495c65b2678p21 -0x1.fc62f71eac99bp16 0x1.560686fd8p5 0x1.000000000000ep0 -0x1.ffffffffffff5p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02891 0 OK -0x1.f202da3610ff2p21 -0x1.11c2d016292c8p17 0x1.560686fd8p5 0x1.0000000000063p0 -0x1.fffffffffffdcp-1 0x1.0p-29 T +CSV proj4-epsg.csv:02892 0 OK 0x1.2fa92b4905efdp24 0x1.81a79af758af5p19 0x1.13ff732ed4p10 0x1.0000000000071p0 -0x1.ffffffffe2e85p-1 0x1.8p-29 T +CSV proj4-epsg.csv:02893 0 OK -0x1.8d25fdee03b95p23 -0x1.223b74ee941ecp23 0x1.13ff732ed4p10 0x1.ffffe0e9a44acp-1 -0x1.ffffd371114b1p-1 -0x1.a28p-17 F +CSV proj4-epsg.csv:02894 0 OK -0x1.44293e144ed3p23 -0x1.26e000fe63918p23 0x1.13ff732ed4p10 0x1.ffffffa8cff7ap-1 -0x1.ffffffb982bc8p-1 -0x1.14p-23 F +CSV proj4-epsg.csv:02895 0 OK -0x1.0ecd3e0e6344fp23 -0x1.292ff52922b9p23 0x1.13ff732ed4p10 0x1.fffffffd64869p-1 -0x1.fffffffe73921p-1 -0x1.8p-29 F +CSV proj4-epsg.csv:02896 0 OK 0x1.1f41f2f49888dp23 -0x1.d152c20e5ae9fp17 -0x1.1bc9937e1p7 -0x1.38f063c5f9d0dp1 -0x1.821b3df1effe8p0 -0x1.5f8838024p4 T +CSV proj4-epsg.csv:02897 0 OK 0x1.037cbba281f9cp23 -0x1.87b5a2d8c759ap20 -0x1.1bc9937e1p7 -0x1.1b960233e20e2p0 -0x1.4393b2534bc02p0 -0x1.a22fe8ec8p3 T +CSV proj4-epsg.csv:02898 0 OK 0x1.74ef978eee178p20 -0x1.4ef4c2f48b49dp18 -0x1.ea248c9dfp6 0x1.08d05b836f0e7p5 -0x1.5604cacb7f2e4p3 -0x1.14239a43p6 T +CSV proj4-epsg.csv:02899 0 OK 0x1.bc5079e43842p18 -0x1.a8b920adb1d85p18 -0x1.ea248c9dfp6 0x1.c6e6c198d836dp6 -0x1.9a670dd969638p5 -0x1.4821194e2p5 T +CSV proj4-epsg.csv:02900 0 EXC:java.lang.IllegalStateException -0x1.0499d293c8b88p20 -0x1.13533f453de14p19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:02901 0 OK -0x1.5e1c8d0e223d1p23 -0x1.4ef4c2f48b49dp18 -0x1.ea248c9dfp6 0x1.08d05b836f0e7p5 -0x1.5604cacb7f2e4p3 -0x1.14239a43p6 T +CSV proj4-epsg.csv:02902 0 OK -0x1.9d5c7c30de3dfp23 -0x1.a8b920adb1d85p18 -0x1.ea248c9dfp6 0x1.c6e6c198d836dp6 -0x1.9a670dd969638p5 -0x1.4821194e2p5 T +CSV proj4-epsg.csv:02903 0 EXC:java.lang.IllegalStateException -0x1.ea56ba5279171p23 -0x1.13533f453de14p19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:02904 0 OK -0x1.5e1c8d0e223d1p23 -0x1.4ef4c2f48b49dp18 -0x1.ea248c9dfp6 0x1.08d05b836f0e7p5 -0x1.5604cacb7f2e4p3 -0x1.14239a43p6 T +CSV proj4-epsg.csv:02905 0 OK -0x1.9d5c7c30de3dfp23 -0x1.a8b920adb1d85p18 -0x1.ea248c9dfp6 0x1.c6e6c198d836dp6 -0x1.9a670dd969638p5 -0x1.4821194e2p5 T +CSV proj4-epsg.csv:02906 0 EXC:java.lang.IllegalStateException -0x1.ea56ba5279171p23 -0x1.13533f453de14p19 -0x1.ea248c9dfp6 NaN NaN NaN T +CSV proj4-epsg.csv:02907 0 OK -0x1.748efb682542ep18 -0x1.811be91c2e0fcp22 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe1d1p-1 0x0.0p0 F +CSV proj4-epsg.csv:02908 0 OK -0x1.0318a51303116p20 -0x1.6e1865d1afd58p22 0x1.21ece3482p6 0x1.ffffffffffff7p-1 -0x1.0000000000049p0 0x1.0p-29 T +CSV proj4-epsg.csv:02909 0 OK -0x1.c272944c0c458p18 -0x1.61e365d1afd58p22 0x1.21ece3482p6 0x1.ffffffffffff7p-1 -0x1.0000000000049p0 0x1.0p-29 T +CSV proj4-epsg.csv:02910 0 OK -0x1.0318a51303116p20 -0x1.6e1865d1afd58p22 0x1.21ece3482p6 0x1.ffffffffffff7p-1 -0x1.0000000000049p0 0x1.0p-29 T +CSV proj4-epsg.csv:02911 0 OK 0x1.abd2b3de5664p23 -0x1.d76431def6fd2p18 -0x1.1c5c01b93cp9 0x1.ffffdf116707ap-1 -0x1.ffffd0f9f638dp-1 -0x1.a978p-17 T +CSV proj4-epsg.csv:02912 0 OK 0x1.b59472f49b031p23 0x1.60610139df05p16 -0x1.1c5c01b93cp9 -0x1.28513a9524246p6 -0x1.e8002c2133e91p4 -0x1.67254bd7e8p8 T +CSV proj4-epsg.csv:02913 0 OK 0x1.966b4fbda0e58p23 0x1.075cfa80ad59cp17 -0x1.1c5c01b93cp9 -0x1.3906ae6a2e5c2p5 -0x1.bef41aa6a5ab2p3 -0x1.92b31aec28p7 T +CSV proj4-epsg.csv:02914 0 OK 0x1.7a0712070615ap23 0x1.50f8269a45af8p17 -0x1.1c5c01b93cp9 -0x1.4a1a609b92a44p4 -0x1.b010d8bc93f49p2 -0x1.9aab2632bp6 T +CSV proj4-epsg.csv:02915 0 OK 0x1.60112000dec18p23 0x1.8f286c72f70cp17 -0x1.1c5c01b93cp9 -0x1.57ac57b84e9eap3 -0x1.c8a16c3a94efep1 -0x1.ae6d3449cp5 T +CSV proj4-epsg.csv:02916 0 OK 0x1.b59472f49b031p23 0x1.60610139df05p16 -0x1.1c5c01b93cp9 -0x1.28513a9524246p6 -0x1.e8002c2133e91p4 -0x1.67254bd7e8p8 T +CSV proj4-epsg.csv:02917 0 OK 0x1.966b4fbda0e58p23 0x1.075cfa80ad59cp17 -0x1.1c5c01b93cp9 -0x1.3906ae6a2e5c2p5 -0x1.bef41aa6a5ab2p3 -0x1.92b31aec28p7 T +CSV proj4-epsg.csv:02918 0 OK 0x1.7a0712070615ap23 0x1.50f8269a45af8p17 -0x1.1c5c01b93cp9 -0x1.4a1a609b92a44p4 -0x1.b010d8bc93f49p2 -0x1.9aab2632bp6 T +CSV proj4-epsg.csv:02919 0 OK 0x1.60112000dec18p23 0x1.8f286c72f70cp17 -0x1.1c5c01b93cp9 -0x1.57ac57b84e9eap3 -0x1.c8a16c3a94efep1 -0x1.ae6d3449cp5 T +CSV proj4-epsg.csv:02920 0 OK -0x1.7f73f65d71654p18 0x1.2dc6c2a0ef6aap23 -0x1.d8db723d2p5 0x1.ffffffffffffbp-1 -0x1.0000000000015p0 0x1.0p-30 T +CSV proj4-epsg.csv:02921 0 OK -0x1.05fe1261b6245p20 0x1.2db4ba3d7c0ccp23 -0x1.d8db723d2p5 0x1.0000000000012p0 -0x1.fffffffffffbcp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02922 0 OK -0x1.495a6ad83725ap19 0x1.2dc083480533cp23 -0x1.d8db723d2p5 0x1.000004847a51fp0 -0x1.ffffffe6f0ba7p-1 -0x1.b88p-20 T +CSV proj4-epsg.csv:02923 0 OK -0x1.650123497de76p19 0x1.2dbf0cc31062bp23 -0x1.d8db723d2p5 0x1.00000665bfb8bp0 -0x1.ffffffdcee949p-1 -0x1.37ap-19 T +CSV proj4-epsg.csv:02924 0 OK 0x1.91b79632f2eabp23 0x1.27247dc84c5dep23 0x0.0p0 -0x1.9230bf764a42ap4 -0x1.0cb6239d2109ep3 0x0.0p0 T +CSV proj4-epsg.csv:02925 0 OK 0x1.9590024d4403cp23 0x1.282b27ad14cf2p23 0x0.0p0 -0x1.a50e1aeca45afp3 -0x1.12fc74f04c593p2 0x0.0p0 T +CSV proj4-epsg.csv:02926 0 OK 0x1.9ba096958e2ep23 0x1.2909391a3562p23 0x0.0p0 -0x1.ad7fbf25e022cp2 -0x1.3cf08ed297a1p1 0x0.0p0 T +CSV proj4-epsg.csv:02927 0 OK 0x1.a3a30094874c5p23 0x1.29c536f629ad5p23 0x0.0p0 -0x1.9b4cc16e1b4f4p1 -0x1.a974ce556c508p0 0x0.0p0 T +CSV proj4-epsg.csv:02928 0 OK 0x1.ad593c517c0fdp23 0x1.2a64a0e1cd877p23 0x0.0p0 -0x1.4dc3719fbe9b1p0 -0x1.4bd3b2c8a0ef2p0 0x0.0p0 T +CSV proj4-epsg.csv:02929 0 OK 0x1.b88cb3355e30ep23 0x1.2aec15bf3cf36p23 0x0.0p0 -0x1.06fd36c7cb848p-2 -0x1.21b66df1d8259p0 0x0.0p0 T +CSV proj4-epsg.csv:02930 0 OK 0x1.c50d6cc7053bep23 0x1.2b5f73f8f3471p23 0x0.0p0 0x1.45d850b2fa048p-2 -0x1.0ed1aad2e02eep0 0x0.0p0 T +CSV proj4-epsg.csv:02931 0 OK 0x1.91b79632de805p23 0x1.27247dc857ed8p23 0x0.0p0 -0x1.9230bf75adfbdp4 -0x1.0cb6239c71164p3 0x0.0p0 T +CSV proj4-epsg.csv:02932 0 OK 0x1.9590024d32c8ap23 0x1.282b27ad201f8p23 0x0.0p0 -0x1.a50e1aec0a50fp3 -0x1.12fc74efc3cb4p2 0x0.0p0 T +CSV proj4-epsg.csv:02933 0 OK 0x1.9ba096957fb79p23 0x1.2909391a407dfp23 0x0.0p0 -0x1.ad7fbf2543fc3p2 -0x1.3cf08ed231e39p1 0x0.0p0 T +CSV proj4-epsg.csv:02934 0 OK 0x1.a3a300947b3b2p23 0x1.29c536f6349e2p23 0x0.0p0 -0x1.9b4cc16d7693cp1 -0x1.a974ce55266ddp0 0x0.0p0 T +CSV proj4-epsg.csv:02935 0 OK 0x1.ad593c51720efp23 0x1.2a64a0e1d854fp23 0x0.0p0 -0x1.4dc3719f07efp0 -0x1.4bd3b2c88d12fp0 0x0.0p0 T +CSV proj4-epsg.csv:02936 0 OK 0x1.b88cb33555f4cp23 0x1.2aec15bf47a43p23 0x0.0p0 -0x1.06fd36c620263p-2 -0x1.21b66df1d5954p0 0x0.0p0 T +CSV proj4-epsg.csv:02937 0 OK 0x1.c50d6cc6fe81cp23 0x1.2b5f73f8fde0ep23 0x0.0p0 0x1.45d850b4000b9p-2 -0x1.0ed1aad2e28e8p0 0x0.0p0 T +CSV proj4-epsg.csv:02938 0 OK 0x1.91b92f0f44d87p23 0x1.2724df4cc01dap23 -0x1.9f4542fbcp6 -0x1.9225e6c69ce36p4 -0x1.0cdd2500293c5p3 -0x1.ccdab71c4p5 T +CSV proj4-epsg.csv:02939 0 OK 0x1.95916fe740324p23 0x1.282bc167ead0bp23 -0x1.9f4542fbcp6 -0x1.a5006fe19c259p3 -0x1.131e0ace3adafp2 -0x1.153c2d3a8p5 T +CSV proj4-epsg.csv:02940 0 OK 0x1.9ba1dbb282118p23 0x1.290a02557317p23 -0x1.9f4542fbcp6 -0x1.ad6f4cc9886a5p2 -0x1.3d0d7b398ebe4p1 -0x1.39a8fd808p4 T +CSV proj4-epsg.csv:02941 0 OK 0x1.a3a41fb2d60d3p23 0x1.29c6286086b24p23 -0x1.9f4542fbcp6 -0x1.9b399a1099278p1 -0x1.a98d8f8c9947dp0 -0x1.5a95efabp3 T +CSV proj4-epsg.csv:02942 0 OK 0x1.ad5a37adf02c1p23 0x1.2a65b4572a84cp23 -0x1.9f4542fbcp6 -0x1.4dadbe6bd885p0 -0x1.4bde22ceb35e7p0 -0x1.7ad2366dp2 T +CSV proj4-epsg.csv:02943 0 OK 0x1.b88d8ccff2e46p23 0x1.2aed4618d6224p23 -0x1.9f4542fbcp6 -0x1.06cd5e25ec505p-2 -0x1.21bab6e72b214p0 -0x1.9b1572b4p1 T +CSV proj4-epsg.csv:02944 0 OK 0x1.c50e266738542p23 0x1.2b60bce467fb6p23 -0x1.9f4542fbcp6 0x1.45f1e5a176babp-2 -0x1.0ed3597d1f83dp0 -0x1.bac34e3p0 T +CSV proj4-epsg.csv:02945 0 OK -0x1.b09ef41426648p20 0x1.2d9818a5e2eebp23 0x1.4b71dc1fp4 0x1.000000000000ep0 -0x1.fffffffffffe2p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02946 0 OK -0x1.30f13257cedf1p21 0x1.2d6e0a01b5b6p23 0x1.4b71dc1fp4 0x1.fffffffffffc5p-1 -0x1.fffffffffffc5p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02947 0 OK -0x1.8e4594875a5ccp21 0x1.2d3424318fcbcp23 0x1.4b71dc1fp4 0x1.ffffffffffffep-1 -0x1.000000000000ep0 0x1.0p-30 T +CSV proj4-epsg.csv:02948 0 OK 0x1.8046f25560e61p20 0x1.bc11215c27855p16 0x1.4b71dc1fp4 0x1.000029adf8143p0 -0x1.ffffff391a172p-1 -0x1.3afp-18 T +CSV proj4-epsg.csv:02949 0 OK 0x1.b88ed0038016bp20 0x1.c04517404175ep16 0x1.4b71dc1fp4 0x1.00007b0a4a41dp0 -0x1.fffffe0687577p-1 -0x1.cf38p-17 T +CSV proj4-epsg.csv:02950 0 OK 0x1.f1689a2d39c83p20 0x1.c51d6316172fdp16 0x1.4b71dc1fp4 0x1.000147674d485p0 -0x1.fffffbb7dbc7ep-1 -0x1.32f8p-15 T +CSV proj4-epsg.csv:02951 0 OK 0x1.1574c2e77e4dbp21 0x1.caa28a766a912p16 0x1.4b71dc1fp4 0x1.00031f7adf8cp0 -0x1.fffff82a1c6d2p-1 -0x1.752bp-14 T +CSV proj4-epsg.csv:02952 0 OK 0x1.3293f515f48a1p21 0x1.d0de840284852p16 0x1.4b71dc1fp4 0x1.000718a059992p0 -0x1.fffff4b2684b4p-1 -0x1.a5f88p-13 T +CSV proj4-epsg.csv:02953 0 OK 0x1.501db6bb3ba68p21 0x1.d7dce29b4b4c5p16 0x1.4b71dc1fp4 0x1.000f2bc624d75p0 -0x1.fffff704ef458p-1 -0x1.c0b9cp-12 T +CSV proj4-epsg.csv:02954 0 OK 0x1.6e1e9ab1f8843p21 0x1.dfab082d05a04p16 0x1.4b71dc1fp4 0x1.001eca1312e7p0 -0x1.000007cce58bbp0 -0x1.c4bcap-11 T +CSV proj4-epsg.csv:02955 0 OK 0x1.8ca40e0784df8p21 0x1.e85860f8a09a5p16 0x1.4b71dc1fp4 0x1.003bc06c7593fp0 -0x1.00003361877b8p0 -0x1.b4831p-10 T +CSV proj4-epsg.csv:02956 0 OK 0x1.abbc74c6ef2c5p21 0x1.f1f6a8597b448p16 0x1.4b71dc1fp4 0x1.006f8de219b26p0 -0x1.0000ab0e37701p0 -0x1.9494bp-9 T +CSV proj4-epsg.csv:02957 0 OK 0x1.cb77494fd31b3p21 0x1.fc9a381ce7bdcp16 0x1.4b71dc1fp4 0x1.00c960d0234c6p0 -0x1.0001cc123399dp0 -0x1.6a4258p-8 T +CSV proj4-epsg.csv:02958 0 OK -0x1.7fcdb6c6bd606p18 -0x1.b5b81c302545bp16 0x1.3ca07db23p7 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02959 0 OK -0x1.55d99e0cb0d64p19 -0x1.eaea4376d6218p21 0x1.3ca07db23p7 0x1.ffffffffffffp-1 -0x1.ffffffffdfd5ep-1 -0x1.0p-30 F +CSV proj4-epsg.csv:02960 0 OK -0x1.472cef82d2f4ap19 -0x1.c0030b6ededd3p21 0x1.3ca07db23p7 0x1.0000000000006p0 -0x1.ffffffffdfd5ep-1 -0x1.0p-30 F +CSV proj4-epsg.csv:02961 0 OK 0x1.02cd65f4b613dp23 0x1.2ac1a684bdb1dp23 -0x1.83d5e7a06p5 0x1.ffffffffd92a1p-1 -0x1.ffffffffed2efp-1 0x1.8p-29 T +CSV proj4-epsg.csv:02962 0 OK 0x1.bdf1cbcca2036p22 0x1.2baae11fa59e1p23 -0x1.83d5e7a06p5 0x1.fffffffffcd25p-1 -0x1.fffffffffead4p-1 0x1.0p-28 T +CSV proj4-epsg.csv:02963 0 OK 0x1.7f7a400c3cb5dp22 0x1.2c4d95591f48dp23 -0x1.83d5e7a06p5 0x1.ffffffffffacep-1 -0x1.ffffffffffdf4p-1 0x1.0p-28 T +CSV proj4-epsg.csv:02964 0 OK 0x1.478b7dce29569p22 0x1.2cc33359a4d2cp23 -0x1.83d5e7a06p5 0x1.fffffffffff48p-1 -0x1.fffffffffff95p-1 0x1.0p-28 T +CSV proj4-epsg.csv:02965 0 OK 0x1.1462fd683ad4ap22 0x1.2d19e67f8dae7p23 -0x1.83d5e7a06p5 0x1.ffffffffffff4p-1 -0x1.000000000000fp0 0x1.0p-28 T +CSV proj4-epsg.csv:02966 0 OK -0x1.0f0af069c491bp22 -0x1.722db15775259p21 0x1.4929c17dp6 0x1.fffffffffffcep-1 -0x1.ffffffffdffb6p-1 0x0.0p0 F +CSV proj4-epsg.csv:02967 0 OK -0x1.0f0af069c491bp22 -0x1.722db15775259p21 0x1.4929c17dp6 0x1.fffffffffffcep-1 -0x1.ffffffffdffb6p-1 0x0.0p0 F +CSV proj4-epsg.csv:02968 0 OK -0x1.24e16cd6b37d8p22 -0x1.ae061f6a21edep21 0x1.4929c17dp6 0x1.0000000000005p0 -0x1.0000000000019p0 0x1.0p-30 T +CSV proj4-epsg.csv:02969 0 OK -0x1.7fcb50cac1038p18 -0x1.b3fd6ec3f0227p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:02970 0 OK -0x1.c74c682b7f567p21 -0x1.1f50f9e1a6f27p21 0x1.0341baf7ap6 0x1.0160bffa5317cp0 -0x1.00045b7f996cfp0 0x1.5a1712p-7 T +CSV proj4-epsg.csv:02971 0 OK -0x1.60afff5a40b35p21 -0x1.4203ebb56923fp21 0x1.0341baf7ap6 0x1.006f6b1235ac8p0 -0x1.0000aeccbfec8p0 0x1.b4df28p-9 T +CSV proj4-epsg.csv:02972 0 OK -0x1.18b1fc3b512fap21 -0x1.8be7b241c2a2cp21 0x1.0341baf7ap6 0x1.001ebb469c4f2p0 -0x1.000008dbd5ab4p0 0x1.e1a8cp-11 T +CSV proj4-epsg.csv:02973 0 OK -0x1.18b1fc3b512fap21 -0x1.11d5b241c2a2cp21 0x1.0341baf7ap6 0x1.001ebb469c4f2p0 -0x1.000008dbd5ab4p0 0x1.e1a8cp-11 T +CSV proj4-epsg.csv:02974 0 OK 0x1.194193f1a69fp21 -0x1.c0cd1d2e69f43p16 -0x1.48cc11fb48p7 0x1.000000000001p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02975 0 OK 0x1.8b2130da2cdf3p20 -0x1.b5ff150b1a0fap16 -0x1.48cc11fb48p7 0x1.000000000001p0 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:02976 0 OK 0x1.cdace13398599p19 -0x1.b05b902e9bfeap16 -0x1.48cc11fb48p7 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02977 0 OK 0x1.0f057add6ad63p18 -0x1.af8fbd0f0da57p16 -0x1.48cc11fb48p7 0x1.ffffffffffffdp-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02978 0 OK -0x1.7fb7d6c391b7ep18 -0x1.b390207a44b3fp16 -0x1.48cc11fb48p7 0x1.0000000000002p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02979 0 OK -0x1.061036824cdfcp20 -0x1.bc96f6615c7ccp16 -0x1.48cc11fb48p7 0x1.000000000000ap0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02980 0 OK -0x1.b0a2546e520cep20 -0x1.cb2c89384bec1p16 -0x1.48cc11fb48p7 0x1.000000000001p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02981 0 OK -0x1.30f3358584202p21 -0x1.e03bd2410cec2p16 -0x1.48cc11fb48p7 0x1.0000000000002p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02982 0 OK -0x1.8e47cf54b5db5p21 -0x1.fd3991d01bbaap16 -0x1.48cc11fb48p7 0x1.0000000000002p0 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:02983 0 OK -0x1.f2010c4e776d2p21 -0x1.1235914eb2d5dp17 -0x1.48cc11fb48p7 0x1.000000000001fp0 -0x1.fffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:02984 0 OK -0x1.2f2dedf9d1015p22 -0x1.2cb4b3737d315p17 -0x1.48cc11fb48p7 0x1.000000000013ep0 -0x1.fffffffffff09p-1 0x1.0p-30 T +CSV proj4-epsg.csv:02985 0 OK 0x1.2a84958b33153p19 -0x1.af5d033dbbabp16 -0x1.48cc11fb48p7 0x1.ffffffffff33bp-1 -0x1.ffffffffffff7p-1 0x1.0p-29 T +CSV proj4-epsg.csv:02986 0 OK 0x1.ab349860b199p15 -0x1.b05b53d7e6347p16 -0x1.48cc11fb48p7 0x1.0000000239329p0 -0x1.fffffffff7e1bp-1 0x1.0p-29 T +CSV proj4-epsg.csv:02987 0 OK -0x1.6b3c9da11759cp22 -0x1.5224619e12eafp17 0x1.bf93402aa8p7 0x1.0000000000cdfp0 -0x1.ffffffffef646p-1 0x1.81e2p-15 T +CSV proj4-epsg.csv:02988 0 OK -0x1.af76581798a1p22 -0x1.85b7a8922c449p17 0x1.bf93402aa8p7 0x1.0000000008d58p0 -0x1.ffffffffe7e61p-1 0x1.81e2p-15 T +CSV proj4-epsg.csv:02989 0 OK -0x1.061456042d488p20 -0x1.bd06eb5acd319p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:02990 0 OK -0x1.117fe892be734p21 -0x1.4a295a48e8983p22 -0x1.28a41541bp6 0x1.ffffffffffffp-1 -0x1.0000000000008p0 0x1.0p-30 T +CSV proj4-epsg.csv:02991 0 OK -0x1.8d4e7d0501e09p23 -0x1.29ba95ba3a69fp24 0x1.578ada9cp0 0x1.ffffe01671cc9p-1 -0x1.ffffd228539c2p-1 0x1.7dp-22 F +CSV proj4-epsg.csv:02992 0 OK -0x1.4445abcce5358p23 -0x1.2c0e0e016f7cdp24 0x1.578ada9cp0 0x1.ffffffa696746p-1 -0x1.ffffffb79fa74p-1 0x1.4p-28 F +CSV proj4-epsg.csv:02993 0 OK -0x1.0ee3796553b72p23 -0x1.2d3679c724c53p24 0x1.578ada9cp0 0x1.fffffffd53fb9p-1 -0x1.fffffffe695e3p-1 0x1.0p-30 F +CSV proj4-epsg.csv:02994 0 OK -0x1.c8919b64fb86ap22 -0x1.2de7a230185fep24 0x1.578ada9cp0 0x1.ffffffffda3d9p-1 -0x1.ffffffffedb72p-1 0x1.0p-29 F +CSV proj4-epsg.csv:02995 0 OK -0x1.80e9076f83d13p22 -0x1.2e5c415436ee3p24 0x1.578ada9cp0 0x1.fffffffffcfcep-1 -0x1.fffffffffeb2cp-1 0x1.8p-29 F +CSV proj4-epsg.csv:02996 0 OK -0x1.4271d0c63b5e7p22 -0x1.2ead9d2760d9fp24 0x1.578ada9cp0 0x1.ffffffffffac7p-1 -0x1.ffffffffffdfbp-1 0x1.0p-30 F +CSV proj4-epsg.csv:02997 0 OK -0x1.8d4d939d90aa7p23 -0x1.29ba6a9a4e748p24 0x0.0p0 0x1.ffffe018e8629p-1 -0x1.ffffd22d1a692p-1 0x0.0p0 F +CSV proj4-epsg.csv:02998 0 OK -0x1.444500c1ff3cep23 -0x1.2c0dd879e283cp24 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a68c4p-1 0x0.0p0 F +CSV proj4-epsg.csv:02999 0 OK -0x1.0ee2f0bde4d6dp23 -0x1.2d363fb18b0c8p24 0x0.0p0 0x1.fffffffd541e6p-1 -0x1.fffffffe697fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03000 0 OK -0x1.c890b7bb14b01p22 -0x1.2de7658c2da1p24 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbbdp-1 0x0.0p0 F +CSV proj4-epsg.csv:03001 0 OK -0x1.80e845424c527p22 -0x1.2e5c03112e1eap24 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb55p-1 0x0.0p0 F +CSV proj4-epsg.csv:03002 0 OK -0x1.8d4d939d90aa7p23 -0x1.2247d5349ce9p23 0x0.0p0 0x1.ffffe018e8629p-1 -0x1.ffffd22d1a692p-1 0x0.0p0 F +CSV proj4-epsg.csv:03003 0 OK -0x1.444500c1ff3cep23 -0x1.26eeb0f3c5078p23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a68c4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03004 0 OK -0x1.0ee2f0bde4d6dp23 -0x1.293f7f631619p23 0x0.0p0 0x1.fffffffd541e6p-1 -0x1.fffffffe697fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03005 0 OK -0x1.c890b7bb14b01p22 -0x1.2aa1cb185b42p23 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbbdp-1 0x0.0p0 F +CSV proj4-epsg.csv:03006 0 OK -0x1.80e845424c527p22 -0x1.2b8b06225c3d4p23 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb55p-1 0x0.0p0 F +CSV proj4-epsg.csv:03007 0 OK -0x1.427128c7a7f98p22 -0x1.2c2dbb92b0f2ep23 0x0.0p0 0x1.ffffffffffa3bp-1 -0x1.ffffffffffd52p-1 0x0.0p0 F +CSV proj4-epsg.csv:03008 0 OK -0x1.0a82c7b83b7d2p22 -0x1.2ca35ade27afap23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffffebp-1 0x0.0p0 F +CSV proj4-epsg.csv:03009 0 OK -0x1.8d4e7d0501e09p23 -0x1.22482b7474d3ep23 0x1.578ada9cp0 0x1.ffffe01671cc9p-1 -0x1.ffffd228539c2p-1 0x1.7dp-22 F +CSV proj4-epsg.csv:03010 0 OK -0x1.4445abcce5358p23 -0x1.26ef1c02def9ap23 0x1.578ada9cp0 0x1.ffffffa696746p-1 -0x1.ffffffb79fa74p-1 0x1.4p-28 F +CSV proj4-epsg.csv:03011 0 OK -0x1.0ee3796553b72p23 -0x1.293ff38e498a6p23 0x1.578ada9cp0 0x1.fffffffd53fb9p-1 -0x1.fffffffe695e3p-1 0x1.0p-30 F +CSV proj4-epsg.csv:03012 0 OK -0x1.c8919b64fb86ap22 -0x1.2aa2446030bfcp23 0x1.578ada9cp0 0x1.ffffffffda3d9p-1 -0x1.ffffffffedb72p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03013 0 OK -0x1.80e9076f83d13p22 -0x1.2b8b82a86ddc6p23 0x1.578ada9cp0 0x1.fffffffffcfcep-1 -0x1.fffffffffeb2cp-1 0x1.8p-29 F +CSV proj4-epsg.csv:03014 0 OK -0x1.4271d0c63b5e7p22 -0x1.2c2e3a4ec1b3ep23 0x1.578ada9cp0 0x1.ffffffffffac7p-1 -0x1.ffffffffffdfbp-1 0x1.0p-30 F +CSV proj4-epsg.csv:03015 0 OK -0x1.0a835a50ea515p22 -0x1.2ca3db2da647p23 0x1.578ada9cp0 0x1.0000000000013p0 -0x1.ffffffffffff4p-1 0x1.0p-30 F +CSV proj4-epsg.csv:03016 0 OK -0x1.8d17154c480ccp23 -0x1.29ae3fd53892ep24 0x1.3d4a7e374cp9 0x1.ffffe2472184p-1 -0x1.ffffd522e350ap-1 -0x1.95fp-18 F +CSV proj4-epsg.csv:03017 0 OK -0x1.8d17698fddf85p23 -0x1.29ae68d3c7538p24 0x1.40c7c744aep9 0x1.ffffe24599089p-1 -0x1.ffffd522978bap-1 -0x1.9bfp-18 F +CSV proj4-epsg.csv:03018 0 OK 0x1.c5991582359b9p24 -0x1.7d86361f4ec83p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffdff13p-1 0x0.0p0 F +CSV proj4-epsg.csv:03019 0 OK 0x1.1705af5a28b81p23 -0x1.6592313b0e7e6p16 -0x1.1035bd3948p7 0x1.ffffffffffffdp-1 -0x1.ffffffffe0a84p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03020 0 OK -0x1.1753afa072261p23 -0x1.8dc316ed83e01p23 0x1.3eaf141b82p9 -0x1.e155bcda10eafp3 -0x1.5c690c3fc7aaep4 -0x1.2b64c11638p8 T +CSV proj4-epsg.csv:03021 0 OK -0x1.ff7bd5f5db702p22 -0x1.d242edb7638c8p17 0x1.107aa9d65p9 0x1.0000000074617p0 -0x1.ffffffff7f857p-1 0x1.0p-29 T +CSV proj4-epsg.csv:03022 0 OK -0x1.30e4833c94b9ap23 -0x1.26c816481e5ebp18 0x1.107aa9d65p9 0x1.0000000bfe461p0 -0x1.ffffffeeb82c2p-1 0x1.6p-25 T +CSV proj4-epsg.csv:03023 0 OK -0x1.71c8d463addd8p23 -0x1.99726bc080653p18 0x1.107aa9d65p9 0x1.000002e59cdcp0 -0x1.fffff978a0783p-1 0x1.7aap-19 T +CSV proj4-epsg.csv:03024 0 OK -0x1.30e59a884167bp23 -0x1.26db8cc334694p18 0x1.0b4943aafp9 0x1.0000000bfed5cp0 -0x1.ffffffeeb5e39p-1 0x1.78p-25 T +CSV proj4-epsg.csv:03025 0 OK -0x1.71ca54a84ee62p23 -0x1.998e80696c982p18 0x1.0b4943aafp9 0x1.000002e5b7e89p0 -0x1.fffff977a29bp-1 0x1.9c4p-19 T +CSV proj4-epsg.csv:03026 0 OK -0x1.d4b46bef6a59p23 -0x1.623b7564fdp19 0x1.0b4943aafp9 0x1.0001e8ae183c5p0 -0x1.ffecb3ac75adfp-1 0x1.0dc87p-10 T +CSV proj4-epsg.csv:03027 0 OK -0x1.181eadb9e2d11p23 -0x1.8d9e141b2880cp23 0x1.0b4943aafp9 -0x1.df27beb2f0bfdp3 -0x1.5b2bd997edc2bp4 -0x1.1d3513e7ep8 T +CSV proj4-epsg.csv:03028 0 OK -0x1.a8cbfe0fed816p22 0x1.c375e5c12287ep19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe3b81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03029 0 OK -0x1.6b05f3410365ap22 -0x1.6a96b39d574c2p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe3b0ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03030 0 OK -0x1.848e690ce865ap22 0x1.27da549eaf69ep18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe3a9bp-1 0x0.0p0 F +CSV proj4-epsg.csv:03031 0 OK -0x1.a239baeb087eep22 0x1.7ee956d5b5356p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe3b0ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03032 0 OK -0x1.99e433ed73ac8p22 0x1.8fb5182bf778bp19 0x0.0p0 0x1.fffffffffff28p-1 -0x1.ffffffffe3b81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03033 0 OK -0x1.c594cc63c3d28p22 0x1.5c12cfa2512bp20 0x1.3eaf141b82p9 0x1.fffffffffffe4p-1 -0x1.ffffffffe39dap-1 0x1.0p-29 F +CSV proj4-epsg.csv:03034 0 OK -0x1.4bff342af05aep22 -0x1.4b4ec8f5a6d78p18 0x1.107aa9d65p9 0x1.000000000001p0 -0x1.ffffffffe3a9fp-1 0x1.0p-29 F +CSV proj4-epsg.csv:03035 0 OK -0x1.6357b3e3d7416p22 0x1.0eb4931111878p18 0x1.107aa9d65p9 0x1.fffffffffffaep-1 -0x1.ffffffffe3a9fp-1 0x1.0p-29 F +CSV proj4-epsg.csv:03036 0 OK -0x1.4c00417acb0f9p22 -0x1.4b4bb506685cp18 0x1.0b4943aafp9 0x1.0000000000031p0 -0x1.ffffffffe39e1p-1 0x1.0p-30 F +CSV proj4-epsg.csv:03037 0 OK -0x1.6358b4b26a092p22 0x1.0eb64ae440a22p18 0x1.0b4943aafp9 0x1.000000000006bp0 -0x1.ffffffffe3a54p-1 0x1.0p-30 F +CSV proj4-epsg.csv:03038 0 OK -0x1.c5942c3d8b972p22 0x1.5c109d2d0803ep20 0x1.0b4943aafp9 0x1.fffffffffff7dp-1 -0x1.ffffffffe3a54p-1 0x1.0p-30 F +CSV proj4-epsg.csv:03039 0 OK -0x1.7e797c12d4062p22 0x1.5e2db074f0194p19 0x1.0b4943aafp9 0x1.ffffffffffffp-1 -0x1.ffffffffe3b39p-1 0x1.0p-30 F +CSV proj4-epsg.csv:03040 0 OK -0x1.effc8fc8fe288p22 0x1.7c92515b95642p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe3b81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03041 0 OK -0x1.76da39e4ae97p22 0x1.6d78efb465083p19 0x1.0b4943aafp9 0x1.0000000000031p0 -0x1.ffffffffe396fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03042 0 OK -0x1.5c70f8ecb11b1p23 -0x1.3ae7113b0e98cp19 0x1.9e960aac56p9 0x1.d5ca0a8ff8eebp-1 0x1.bb722960aa1d7p-1 -0x1.134e04f8p0 F +CSV proj4-epsg.csv:03043 0 OK -0x1.8d174230affb1p23 -0x1.29b3b04358fb7p24 0x1.9e960aac56p9 0x1.ffffe22b4c409p-1 -0x1.ffffd5376325cp-1 -0x1.bc08p-17 F +CSV proj4-epsg.csv:03044 0 OK -0x1.2701323dd7c88p19 0x1.273e91a6e0ac3p18 0x1.9e960aac56p9 0x1.ffffffffffff9p-1 -0x1.ffffffffe3aa3p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03045 0 OK -0x1.f26300af12d8cp21 -0x1.8155d0091ac16p20 0x1.8684ebd348p7 0x1.fffffffffffe4p-1 -0x1.ffffffffdfcb9p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03046 0 OK 0x1.abd913dc5c046p23 -0x1.d73d7301c4b91p18 0x1.c8f1c12a8p3 0x1.ffffdeff2f8f3p-1 -0x1.ffffd0e817e68p-1 -0x1.69c8p-17 T +CSV proj4-epsg.csv:03047 0 OK 0x1.62cd059c26f9fp23 -0x1.42c9ab70530f4p18 0x1.c8f1c12a8p3 0x1.ffffffa3ca59dp-1 -0x1.ffffffb5b3f96p-1 -0x1.44p-24 T +CSV proj4-epsg.csv:03048 0 OK 0x1.2d69a923baafep23 -0x1.f1d273c2172efp17 0x1.c8f1c12a8p3 0x1.fffffffd3f269p-1 -0x1.fffffffe5eabap-1 0x1.0p-30 T +CSV proj4-epsg.csv:03049 0 OK 0x1.abd6ecfe884f1p23 -0x1.d723e82e5db6ap18 0x1.b568782ccp4 0x1.ffffdf0169a16p-1 -0x1.ffffd0f05b5c8p-1 -0x1.9de8p-17 T +CSV proj4-epsg.csv:03050 0 OK 0x1.62cb881c6669bp23 -0x1.42b9828e83dbcp18 0x1.b568782ccp4 0x1.ffffffa3d1136p-1 -0x1.ffffffb5be749p-1 -0x1.8p-24 T +CSV proj4-epsg.csv:03051 0 OK 0x1.2d68818b3e69fp23 -0x1.f1ba88c7b223bp17 0x1.b568782ccp4 0x1.fffffffd3f532p-1 -0x1.fffffffe5ede2p-1 -0x1.0p-29 T +CSV proj4-epsg.csv:03052 0 OK 0x1.02cd711661d56p23 -0x1.9973511d6340ap17 0x1.b568782ccp4 0x1.ffffffffd92a8p-1 -0x1.ffffffffed3f9p-1 0x1.0p-28 T +CSV proj4-epsg.csv:03053 0 OK 0x1.abd6ecfe884f1p23 0x1.2273e0be8d125p23 0x1.b568782ccp4 0x1.ffffdf0169a16p-1 -0x1.ffffd0f05b5bcp-1 -0x1.9de8p-17 T +CSV proj4-epsg.csv:03054 0 OK 0x1.62cb881c6669bp23 0x1.271733eb8be12p23 0x1.b568782ccp4 0x1.ffffffa3d1136p-1 -0x1.ffffffb5be74ep-1 -0x1.8p-24 T +CSV proj4-epsg.csv:03055 0 OK 0x1.2d68818b3e69fp23 0x1.296615dce1377p23 0x1.b568782ccp4 0x1.fffffffd3f532p-1 -0x1.fffffffe5ede7p-1 -0x1.0p-29 T +CSV proj4-epsg.csv:03056 0 OK 0x1.02cd711661d56p23 0x1.2ac732bb8a73p23 0x1.b568782ccp4 0x1.ffffffffd92a8p-1 -0x1.ffffffffed3efp-1 0x1.0p-28 T +CSV proj4-epsg.csv:03057 0 OK 0x1.bdf1d0b51abd7p22 0x1.2bafa3e0843a1p23 0x1.b568782ccp4 0x1.fffffffffcddap-1 -0x1.fffffffffeabfp-1 0x1.0p-28 T +CSV proj4-epsg.csv:03058 0 OK 0x1.c527513dc3fa9p23 0x1.8d894af2e18cbp20 0x1.b568782ccp4 -0x1.349144f604cc1p7 -0x1.34fddff968d8fp6 0x1.2b5562ac8ap9 T +CSV proj4-epsg.csv:03059 0 OK 0x1.a1363f042ed6ap23 0x1.a0836e79f493bp20 0x1.b568782ccp4 -0x1.d6de2584ecb75p5 -0x1.6e7fb35223e5bp4 0x1.0f6856a6ap7 T +CSV proj4-epsg.csv:03060 0 OK 0x1.7e8e9f135d62dp23 0x1.b21ea92841ab6p20 0x1.b568782ccp4 -0x1.2369c815db134p4 -0x1.7aa1ed9fb3618p2 -0x1.4d01b8698p3 T +CSV proj4-epsg.csv:03061 0 OK 0x1.e53dc4030317bp18 -0x1.321154aa292fap19 0x1.7c77bff48p4 0x1.ffffffffe40fep-1 -0x1.ffffffffffe54p-1 0x0.0p0 T +CSV proj4-epsg.csv:03062 0 OK 0x1.0eee95bd0dd06p18 -0x1.affbc75cbeffp16 0x0.0p0 0x1.0000000000001p0 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:03063 0 OK 0x1.2fa9c85f9237ap24 0x1.818fad972ae81p19 0x1.4a3c631b3p10 0x1.ffffffffffea5p-1 -0x1.ffffffffe2e8dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03064 0 OK 0x1.193c2ea7d63c8p21 -0x1.c1475f306155p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03065 0 OK 0x1.8b18492d65bb8p20 -0x1.b676ab548e1c4p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:03066 0 OK 0x1.cd9e95e324977p19 -0x1.b0d1d521833a8p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:03067 0 OK 0x1.0eef90dd87bf6p18 -0x1.b005f8f714ee2p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03068 0 OK -0x1.7fc74dbaff74ep18 -0x1.b4079b49507e3p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03069 0 OK -0x1.06127e1f9054p20 -0x1.bd110967f7482p16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:03070 0 OK -0x1.b0a304adbef02p20 -0x1.cbaab330f32b8p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03071 0 OK -0x1.30f2bce56f83cp21 -0x1.e0bfd09accdfbp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:03072 0 OK -0x1.8e467b4591d3bp21 -0x1.fdc5838a882c1p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:03073 0 OK -0x1.f1feca3784c06p21 -0x1.1280ddebf625fp17 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffe2p-1 0x0.0p0 T +CSV proj4-epsg.csv:03074 0 OK -0x1.2f2c4670a1686p22 -0x1.2d0720eaad94cp17 0x0.0p0 0x1.0000000000108p0 -0x1.fffffffffff14p-1 0x0.0p0 T +CSV proj4-epsg.csv:03075 0 OK -0x1.0422a6da79db4p21 -0x1.d55204d7e9f85p16 0x0.0p0 0x1.000a6af8f0b9cp0 -0x1.fffff5367ad71p-1 0x0.0p0 T +CSV proj4-epsg.csv:03076 0 OK -0x1.7fcff0cb4f832p18 0x1.2dc5bb4a73731p23 0x1.64f650a8p0 0x1.fffffffffffdcp-1 -0x1.0000000000005p0 0x1.0p-30 T +CSV proj4-epsg.csv:03077 0 OK 0x1.478e8f6045ea2p20 -0x1.c2e68c012ad6dp21 -0x1.219eade2d8p7 0x1.0000000000001p0 -0x1.ffffffffdfe9dp-1 0x1.0p-29 F +CSV proj4-epsg.csv:03078 0 OK 0x1.41261d5d5084p20 -0x1.8ada03851f234p21 -0x1.219eade2d8p7 0x1.ffffffffffffbp-1 -0x1.ffffffffdfff4p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03079 0 OK 0x1.e662512439fbep20 -0x1.48343b256b2a1p21 -0x1.219eade2d8p7 0x1.ffffffffffffbp-1 -0x1.ffffffffdfff4p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03080 0 OK 0x1.e6631fe3648b4p20 -0x1.4835ce2a73e87p21 -0x1.219eade2d8p7 0x1.ffffffffffffbp-1 -0x1.ffffffffdfff4p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03081 0 OK 0x1.155a931154c34p21 -0x1.1335120613657p21 -0x1.219eade2d8p7 0x1.0000000000005p0 -0x1.ffffffffdff11p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03082 0 OK -0x1.f1fd837a8c1cap21 -0x1.12a8ef6fce25ep17 0x1.7c0c42b37p6 0x1.000000000007cp0 -0x1.fffffffffffe7p-1 0x1.0p-30 T +CSV proj4-epsg.csv:03083 0 OK 0x1.0f0574a09d418p18 -0x1.b080414842f4ap16 -0x1.050183eecp4 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03084 0 OK -0x1.7fb42b774aea6p18 -0x1.b482f7800b31cp16 -0x1.050183eecp4 0x1.ffffffffffffp-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:03085 0 OK -0x1.3651628164ff6p17 -0x1.0e08c53cb5396p19 -0x1.050183eecp4 0x1.0000000113353p0 -0x1.fffffffffc7dcp-1 0x0.0p0 T +CSV proj4-epsg.csv:03086 0 OK -0x1.44e10d775084cp17 -0x1.0e66e819917acp19 -0x1.050183eecp4 0x1.0000006b55da3p0 -0x1.fffffffdb8734p-1 -0x1.5p-25 T +CSV proj4-epsg.csv:03087 0 OK -0x1.5b912e38b6d6p17 -0x1.0f0c10546b1a8p19 -0x1.050183eecp4 0x1.000008f8afc6ep0 -0x1.ffffffcf6b618p-1 -0x1.c38p-21 T +CSV proj4-epsg.csv:03088 0 OK -0x1.7fd03f9f28e9ep18 0x1.2dc5b359bbbbcp23 0x1.2a15c3bp-2 0x1.ffffffffffffbp-1 -0x1.fffffffffffc3p-1 0x1.0p-28 T +CSV proj4-epsg.csv:03089 0 OK 0x1.2863169b3252ap19 -0x1.b45bb912176cdp16 -0x1.1ed6d55bp6 0x1.000000b3944b7p0 -0x1.00000002156f1p0 0x1.671fp-10 T +CSV proj4-epsg.csv:03090 0 OK 0x1.ce2a79fc57732p19 -0x1.bd66e97f55b5cp16 -0x1.1ed6d55bp6 0x1.0000297f898a8p0 -0x1.ffffff4359c45p-1 0x1.66984p-10 T +CSV proj4-epsg.csv:03091 0 OK -0x1.7faace2e3ebaep18 -0x1.b4326f410d29fp16 -0x1.18e85b024p5 0x1.ffffffffffff7p-1 -0x1.0000000000002p0 0x1.0p-29 T +CSV proj4-epsg.csv:03092 0 OK -0x1.7faace2e3ebaep18 0x1.2dc49b217de5bp23 -0x1.18e85b024p5 0x1.ffffffffffff7p-1 -0x1.fffffffffffdcp-1 0x1.0p-29 T +CSV proj4-epsg.csv:03093 0 OK 0x1.60d085401c73fp19 -0x1.2f6c7fa9e9e02p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0p0 0x0.0p0 F +CSV proj4-epsg.csv:03094 0 OK 0x1.54167296d83ccp20 -0x1.2f687e046b93ap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff9ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03095 0 OK 0x1.fa37a3d0235e9p20 -0x1.2f5f748d19387p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffee5p-1 0x0.0p0 F +CSV proj4-epsg.csv:03096 0 OK 0x1.5264660b5c3fp21 -0x1.2f50dace52c98p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffa3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03097 0 OK 0x1.ab0607c3b2b1p21 -0x1.2f3bc584cb427p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff5p-1 0x0.0p0 F +CSV proj4-epsg.csv:03098 0 OK 0x1.042d28313e32ap22 -0x1.2f1ebf7926172p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffebp-1 0x0.0p0 F +CSV proj4-epsg.csv:03099 0 OK 0x1.3609b069c1aecp22 -0x1.2ef7829217f6fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffff41p-1 0x0.0p0 F +CSV proj4-epsg.csv:03100 0 OK 0x1.6c371f2a7d601p22 -0x1.2ec274b35789ep24 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffe76p-1 0x0.0p0 F +CSV proj4-epsg.csv:03101 0 OK 0x1.a8440580ab0edp22 -0x1.2e79a7e3b14c1p24 0x0.0p0 0x1.0000000000be3p0 -0x1.ffffffffff64p-1 0x0.0p0 F +CSV proj4-epsg.csv:03102 0 OK 0x1.ec7d14ed61124p22 -0x1.2e12bcaa8b07dp24 0x0.0p0 0x1.0000000008853p0 -0x1.fffffffff82c9p-1 0x0.0p0 F +CSV proj4-epsg.csv:03103 0 OK 0x1.1e45705ae1292p23 -0x1.2d79dbc541d16p24 0x0.0p0 0x1.0000000085362p0 -0x1.ffffffff6d4bap-1 0x0.0p0 F +CSV proj4-epsg.csv:03104 0 OK 0x1.4f6f0b30b0889p23 -0x1.2c839c1d43a06p24 0x0.0p0 0x1.0000000dbb824p0 -0x1.ffffffec45857p-1 0x0.0p0 F +CSV proj4-epsg.csv:03105 0 OK 0x1.905b100684276p23 -0x1.2ab938203f52ep24 0x0.0p0 0x1.00000351dfc1dp0 -0x1.fffff88ba702bp-1 0x0.0p0 F +CSV proj4-epsg.csv:03106 0 OK 0x1.f366f954d3caap23 -0x1.260a1f67e4b6p24 0x0.0p0 0x1.000235cd3477cp0 -0x1.ffe9ea41ea977p-1 0x0.0p0 F +CSV proj4-epsg.csv:03107 0 OK 0x1.107f94847aa3dp23 -0x1.6ecdd5ac3dedfp22 0x0.0p0 -0x1.5a792bdc65ba9p4 -0x1.7ba6c6a549f4cp4 0x0.0p0 F +CSV proj4-epsg.csv:03108 0 OK 0x1.abe2789d4fb85p23 -0x1.d8fd35c7f1711p18 0x0.0p0 0x1.ffffdd7b19acp-1 -0x1.ffffce6446488p-1 0x0.0p0 T +CSV proj4-epsg.csv:03109 0 OK 0x1.62d0ad431cf46p23 -0x1.43e4ba40fd47fp18 0x0.0p0 0x1.ffffff9f586c6p-1 -0x1.ffffffb1c1793p-1 0x0.0p0 T +CSV proj4-epsg.csv:03110 0 OK 0x1.2d6b56cb2a83ap23 -0x1.f37a20554774fp17 0x0.0p0 0x1.fffffffd1ccf3p-1 -0x1.fffffffe488f2p-1 0x0.0p0 T +CSV proj4-epsg.csv:03111 0 OK 0x1.02cf3a6360821p23 -0x1.9adde0ace7ba8p17 0x0.0p0 0x1.ffffffffd73ddp-1 -0x1.ffffffffec402p-1 0x0.0p0 T +CSV proj4-epsg.csv:03112 0 OK 0x1.bdf4597e02baap22 -0x1.608b4f0aa4d9dp17 0x0.0p0 0x1.fffffffffcb3bp-1 -0x1.fffffffffe9c2p-1 0x0.0p0 T +CSV proj4-epsg.csv:03113 0 OK 0x1.ac5b7bae7eeb8p25 -0x1.8c9b259e98a73p23 0x0.0p0 0x1.78aaaaaaaaaa9p6 -0x1.5d6b64b7c3f45p8 0x0.0p0 T +CSV proj4-epsg.csv:03114 0 OK 0x1.c0e2b1898022p25 -0x1.8bb0ebb1328f7p23 0x0.0p0 0x1.72p6 -0x1.1ac65ffc0a66fp9 0x0.0p0 T +CSV proj4-epsg.csv:03115 0 OK -0x1.15df25aa6f875p23 0x1.1548a8da9e097p26 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03116 0 OK 0x1.9ca880450467p24 0x1.615b25eaba639p25 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03117 0 OK 0x1.42019693d7e3dp25 0x1.12d7f00985252p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03118 0 OK 0x1.44a46f4ea82efp25 0x1.08dada08c044cp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c0ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03119 0 OK 0x1.4548863d40e76p25 0x1.ed10ee834a90cp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03120 0 OK 0x1.453913958b273p25 0x1.cdbe4a47baf69p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03121 0 OK 0x1.46368f0fca123p25 0x1.ac8c97cb4f7bfp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03122 0 OK 0x1.4552f7e312604p25 0x1.876e372f4ae13p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03123 0 OK 0x1.580537721405p25 0x1.a907237879ca3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03124 0 OK 0x1.1be28089c6e0cp25 0x1.041424a6256a1p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03125 0 OK 0x1.1b1b8a881c3ap25 0x1.f88cec49218efp21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03126 0 OK 0x1.330537598d38cp25 0x1.39354eb46aa1cp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03127 0 OK 0x1.333957baecc36p25 0x1.35319aa60b7eep23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03128 0 OK 0x1.337863f437d39p25 0x1.2b40a92b15304p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03129 0 OK 0x1.daf7a73877722p24 -0x1.4b8561cdfbbcdp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03130 0 OK 0x1.433b43189d6eap25 -0x1.caf48e24f38ap23 0x0.0p0 -0x1.a039519e5f77fp5 -0x1.3bf5a94b425b3p4 0x0.0p0 T +CSV proj4-epsg.csv:03131 0 OK 0x1.7706f0a43f677p25 -0x1.3ceedc17a96dbp23 0x0.0p0 -0x1.581d8fdbe0a0dp7 -0x1.646f48f401d63p6 0x0.0p0 T +CSV proj4-epsg.csv:03132 0 OK 0x1.815aa5e9d0ec5p25 -0x1.3f0477e1e27aep23 0x0.0p0 0x1.2468ec3f5258ep7 -0x1.d70c5b91f0fbap6 0x0.0p0 T +CSV proj4-epsg.csv:03133 0 OK 0x1.0854da35e0002p25 0x1.56d09731a57e2p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03134 0 OK 0x1.8317eafd4651ap25 -0x1.7e38e0108489dp23 0x0.0p0 0x1.1498c87762b99p7 -0x1.ed8ead91e108fp6 0x0.0p0 T +CSV proj4-epsg.csv:03135 0 OK 0x1.98f1f03b3a8e6p25 -0x1.82cd8156a5432p23 0x0.0p0 0x1.7f55555555556p6 -0x1.b200168586588p7 0x0.0p0 T +CSV proj4-epsg.csv:03136 0 OK 0x1.cba1b54edc9dp25 -0x1.d8399150ffa6bp23 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.686ff0b071054p9 0x0.0p0 T +CSV proj4-epsg.csv:03137 0 OK 0x1.aa5eef78f93ffp25 -0x1.d9e7840751aa8p23 0x0.0p0 0x1.7955555555555p6 -0x1.4d161b95b7041p8 0x0.0p0 T +CSV proj4-epsg.csv:03138 0 OK 0x1.bba7256d86ad9p25 -0x1.ddc9c941d8d3dp23 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f52ad76341136p8 0x0.0p0 T +CSV proj4-epsg.csv:03139 0 OK 0x1.227063529e586p25 0x1.563ccbdc915bbp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03140 0 OK 0x1.219bb528b4c78p25 0x1.4ccde70e497bbp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03141 0 OK 0x1.2823e26dc631ap25 0x1.a6cdbe76258d9p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03142 0 OK 0x1.289d923a43dd9p25 0x1.ad332c0ea696ep22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03143 0 OK 0x1.0e390969b18b1p25 0x1.7f43902d80478p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03144 0 OK 0x1.10629e909e6b5p25 0x1.fa93bfaf680d2p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03145 0 OK 0x1.1b2e76d240da2p25 0x1.ea41eecaecd53p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03146 0 OK 0x1.17d2725d4b0eap25 0x1.a701edfa313dbp21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0e4bp-1 0x0.0p0 F +CSV proj4-epsg.csv:03147 0 OK 0x1.0e678144c7ed1p25 -0x1.01a5e20e057b7p24 0x0.0p0 -0x1.795c34eed0eep3 -0x1.f11d5534a2c88p1 0x0.0p0 T +CSV proj4-epsg.csv:03148 0 OK 0x1.1a29ca6b6f544p25 -0x1.f9f526b307cdap23 0x0.0p0 -0x1.0f5a8250ad9bbp4 -0x1.60cd3938da5a7p2 0x0.0p0 T +CSV proj4-epsg.csv:03149 0 OK 0x1.eb466f78566ffp24 -0x1.d7b6d42fd20c6p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03150 0 OK 0x1.d6cec6f5a5cabp24 -0x1.71d7d8d3d5211p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03151 0 OK 0x1.c9bb753e08a98p24 -0x1.b7cf2a616b4a1p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03152 0 OK 0x1.253673e340205p25 0x1.700b70b1008fcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03153 0 OK 0x1.25bfb1cda5ebbp25 0x1.87427f732c7ffp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03154 0 OK 0x1.2446cf02e69d5p25 0x1.778c958413d05p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03155 0 OK 0x1.d236bac973852p25 -0x1.8c0adb34a156fp23 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a12ef377cbe8ep9 0x0.0p0 T +CSV proj4-epsg.csv:03156 0 OK 0x1.580537721405p25 0x1.0da491bc3ce52p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03157 0 OK 0x1.935fd9c5eb742p25 -0x1.00b1f8e4e50bep24 0x0.0p0 0x1.8155555555554p6 -0x1.78979e18302d4p7 0x0.0p0 T +CSV proj4-epsg.csv:03158 0 OK 0x1.ab5b1a5c879b1p25 -0x1.0349d2d2832bcp24 0x0.0p0 0x1.78fffffffffffp6 -0x1.55272b637077cp8 0x0.0p0 T +CSV proj4-epsg.csv:03159 0 OK 0x1.d11a081f2d4c8p25 -0x1.079c4f2896c1dp24 0x0.0p0 0x1.6cffffffffffep6 -0x1.97209fab1bef4p9 0x0.0p0 T +CSV proj4-epsg.csv:03160 0 OK 0x1.1ab7cd83fcf4ep25 0x1.85957eb6659fap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03161 0 OK 0x1.14a983a63ee4ap25 0x1.f10ca97aa1a22p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03162 0 OK 0x1.128b87c9e6c5ep25 0x1.ce097e6557dd3p20 0x0.0p0 0x1.0000000000079p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03163 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:03164 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:03165 0 OK 0x1.6b4cba2bb2fabp23 0x1.d91492189c9bdp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03166 0 OK 0x1.6bf3f7d7c5bd2p23 0x1.f56249f19d493p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03167 0 OK 0x1.6a285ba9b19bap23 0x1.e23a9948fade7p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03168 0 OK 0x1.69ecfd5d62aep23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03169 0 OK 0x1.67ef1fdb5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03170 0 OK 0x1.6a20e7bff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03171 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:03172 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:03173 0 OK 0x1.6b4cba2bb2fabp23 0x1.d91492189c9bdp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03174 0 OK 0x1.6bf3f7d7c5bd2p23 0x1.f56249f19d493p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03175 0 OK 0x1.6a285ba9b19bap23 0x1.e23a9948fade7p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03176 0 OK 0x1.69ecfd5d62aep23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03177 0 OK 0x1.67ef1fdb5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03178 0 OK 0x1.6a20e7bff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03179 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:03180 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:03181 0 OK 0x1.6b4cba2bb2fabp23 0x1.d91492189c9bdp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03182 0 OK 0x1.6bf3f7d7c5bd2p23 0x1.f56249f19d493p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03183 0 OK 0x1.6a285ba9b19bap23 0x1.e23a9948fade7p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03184 0 OK 0x1.69ecfd5d62aep23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03185 0 OK 0x1.67ef1fdb5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03186 0 OK 0x1.6a20e7bff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03187 0 OK 0x1.1216b518515fbp25 -0x1.00bb345b5ff81p24 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b69729p1 0x0.0p0 T +CSV proj4-epsg.csv:03188 0 OK 0x1.2cdd804802d33p25 -0x1.f9fa4b8afac7ep23 0x0.0p0 -0x1.0f4cd69ecfcafp4 -0x1.60b274c5f7282p2 0x0.0p0 T +CSV proj4-epsg.csv:03189 0 OK 0x1.29fb409793633p25 0x1.8406424858c5dp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03190 0 OK 0x1.2a846cb9081b9p25 0x1.9b3d41e0410fcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03191 0 OK 0x1.290b72dcd66c4p25 0x1.8b8735b9c75dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03192 0 OK 0x1.28dac11787645p25 0x1.00b33e826f25dp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03193 0 OK 0x1.04f760c635c03p25 -0x1.2326b291032bfp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03194 0 OK 0x1.06c427c4a5f4ep25 0x1.d865d79271e28p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:03195 0 OK 0x1.1216b518515fbp25 -0x1.00bb345b5ff81p24 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b69729p1 0x0.0p0 T +CSV proj4-epsg.csv:03196 0 OK 0x1.2cdd804802d33p25 -0x1.f9fa4b8afac7ep23 0x0.0p0 -0x1.0f4cd69ecfcafp4 -0x1.60b274c5f7282p2 0x0.0p0 T +CSV proj4-epsg.csv:03197 0 OK 0x1.29fb409793633p25 0x1.8406424858c5dp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03198 0 OK 0x1.2a846cb9081b9p25 0x1.9b3d41e0410fcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03199 0 OK 0x1.290b72dcd66c4p25 0x1.8b8735b9c75dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03200 0 OK 0x1.28dac11787645p25 0x1.00b33e826f25dp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03201 0 OK 0x1.04f760c635c03p25 -0x1.2326b291032bfp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03202 0 OK 0x1.06c427c4a5f4ep25 0x1.d865d79271e28p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:03203 0 OK 0x1.1216b518515fbp25 -0x1.00bb345b5ff81p24 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b69729p1 0x0.0p0 T +CSV proj4-epsg.csv:03204 0 OK 0x1.2cdd804802d33p25 -0x1.f9fa4b8afac7ep23 0x0.0p0 -0x1.0f4cd69ecfcafp4 -0x1.60b274c5f7282p2 0x0.0p0 T +CSV proj4-epsg.csv:03205 0 OK 0x1.29fb409793633p25 0x1.8406424858c5dp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03206 0 OK 0x1.2a846cb9081b9p25 0x1.9b3d41e0410fcp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03207 0 OK 0x1.290b72dcd66c4p25 0x1.8b8735b9c75dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03208 0 OK 0x1.28dac11787645p25 0x1.00b33e826f25dp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03209 0 OK 0x1.04f760c635c03p25 -0x1.2326b291032bfp16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03210 0 OK 0x1.06c427c4a5f4ep25 0x1.d865d79271e28p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:03211 0 OK 0x1.e0e351fd8fdbcp23 -0x1.ed4ff64fb2b4cp18 0x0.0p0 0x1.e69051969d207p6 -0x1.0ed46b594f471p7 0x0.0p0 T +CSV proj4-epsg.csv:03212 0 OK 0x1.cdd80837d631cp23 -0x1.ce626cc5c402fp18 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:03213 0 OK 0x1.f4ec0c008e452p23 -0x1.077b947949932p19 0x0.0p0 0x1.7ffffffffffffp6 -0x1.9db3b1cb682edp7 0x0.0p0 T +CSV proj4-epsg.csv:03214 0 OK 0x1.101c31e8bf327p24 -0x1.2db35f2e5b08bp19 0x0.0p0 0x1.7400000000001p6 -0x1.e8ee26e0b30e6p8 0x0.0p0 T +CSV proj4-epsg.csv:03215 0 OK 0x1.c76966e9bcacbp22 -0x1.6e8c3d6214c34p17 0x0.0p0 0x1.c7b2d97438cb1p-2 -0x1.0b3a6dc534e2ap0 0x0.0p0 T +CSV proj4-epsg.csv:03216 0 OK 0x1.eaa520329793p22 -0x1.89e649f88ee14p17 0x0.0p0 -0x1.a79dda5053ffdp-6 -0x1.19ac1ee7891d1p0 0x0.0p0 T +CSV proj4-epsg.csv:03217 0 OK 0x1.60d037913c217p19 -0x1.2f6d13e9d1c9fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe9p-1 0x0.0p0 F +CSV proj4-epsg.csv:03218 0 OK 0x1.5415d36ebfddbp20 -0x1.2f6912477f8e6p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:03219 0 OK 0x1.fa367e1f90554p20 -0x1.2f6008d960e79p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000003p0 0x0.0p0 F +CSV proj4-epsg.csv:03220 0 OK 0x1.52638256df787p21 -0x1.2f516f2f97ebbp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000bp0 0x0.0p0 F +CSV proj4-epsg.csv:03221 0 OK 0x1.ab04bce56f842p21 -0x1.2f3c5a122e11fp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdcp-1 0x0.0p0 F +CSV proj4-epsg.csv:03222 0 OK 0x1.042c3da2c8e9dp22 -0x1.2f1f545f3e56ap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000022p0 0x0.0p0 F +CSV proj4-epsg.csv:03223 0 OK 0x1.3608651bc260ap22 -0x1.2ef81826f0f29p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000025p0 0x0.0p0 F +CSV proj4-epsg.csv:03224 0 OK 0x1.6c354670a1686p22 -0x1.2ec30ba0f383bp24 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffeep-1 0x0.0p0 F +CSV proj4-epsg.csv:03225 0 OK 0x1.a84153a7eb669p22 -0x1.2e7a418a9d1bep24 0x0.0p0 0x1.0000000000b7p0 -0x1.ffffffffff776p-1 0x0.0p0 F +CSV proj4-epsg.csv:03226 0 OK 0x1.ec79008450956p22 -0x1.2e135c211531bp24 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8ca7p-1 0x0.0p0 F +CSV proj4-epsg.csv:03227 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03228 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:03229 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:03230 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:03231 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:03232 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:03233 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:03234 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03235 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:03236 0 OK 0x1.bdf145425a89fp22 -0x1.608b68d2bba1p17 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb6ep-1 0x0.0p0 T +CSV proj4-epsg.csv:03237 0 OK 0x1.7f7a28c7b0261p22 -0x1.37de0cbd82361p17 0x0.0p0 0x1.ffffffffffa74p-1 -0x1.ffffffffffe14p-1 0x0.0p0 T +CSV proj4-epsg.csv:03238 0 OK 0x1.05d6efba110a7p24 -0x1.e38f0fb2eeb2ep21 0x0.0p0 0x1.78aaaaaaaaaa9p6 -0x1.5d381d52f85d1p8 0x0.0p0 T +CSV proj4-epsg.csv:03239 0 OK 0x1.1874bf12da2efp24 -0x1.e2713ad6a21cp21 0x0.0p0 0x1.72p6 -0x1.1a9b871f523f5p9 0x0.0p0 T +CSV proj4-epsg.csv:03240 0 OK -0x1.52da39f041974p21 0x1.520e32d4ea287p24 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03241 0 OK 0x1.fc5834de3a8b6p22 0x1.aecfabf47dfacp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03242 0 OK 0x1.b30648786fb7dp23 0x1.6d984477b3a64p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03243 0 OK 0x1.b63cf39a83ab7p23 0x1.616a989bf8p22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03244 0 OK 0x1.b704ed5565bb6p23 0x1.4b140364636b1p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03245 0 OK 0x1.b6f205de9ceadp23 0x1.37fbd09973042p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03246 0 OK 0x1.b826f46eb2a9fp23 0x1.23bf98c7f0e14p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03247 0 OK 0x1.b71163ebb0895p23 0x1.0d1ef10799bdep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:03248 0 OK 0x1.53b7a0614cb41p23 0x1.3d089dafa38a1p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03249 0 OK 0x1.52c4f88ae2f39p23 0x1.952d4945767a9p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03250 0 OK 0x1.7f9fabc39ec8dp23 0x1.a30b5135da228p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03251 0 OK 0x1.7fdf27bfa7bddp23 0x1.9e265778ceebap21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03252 0 OK 0x1.802bf2d15954p23 0x1.920787366d41p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03253 0 OK 0x1.254361aa903efp23 -0x1.49e5c14724ef8p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03254 0 OK 0x1.8b85201b6f4bap23 -0x1.17ca73ead35e1p22 0x0.0p0 -0x1.a021277f890b6p5 -0x1.3bd38f3541789p4 0x0.0p0 T +CSV proj4-epsg.csv:03255 0 OK 0x1.caaa0d8f3a765p23 -0x1.826b7d98b9784p21 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9d03p6 0x0.0p0 T +CSV proj4-epsg.csv:03256 0 OK 0x1.d7410067f197dp23 -0x1.84f5f9ea4cb3cp21 0x0.0p0 0x1.2487d95566a92p7 -0x1.d6cce86e0ee06p6 0x0.0p0 T +CSV proj4-epsg.csv:03257 0 OK 0x1.41faf44fb3893p23 0x1.a1c1b331a60e4p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03258 0 OK 0x1.d95fd49418ec4p23 -0x1.d205f2c4df9a6p21 0x0.0p0 0x1.14b9080aa5db9p7 -0x1.ed4beb29ecaf4p6 0x0.0p0 T +CSV proj4-epsg.csv:03259 0 OK 0x1.01a2e06e6ddfep24 -0x1.d79b6bfc52996p21 0x0.0p0 0x1.7f55555555556p6 -0x1.b1c29493f4b19p7 0x0.0p0 T +CSV proj4-epsg.csv:03260 0 OK 0x1.1a6dbffff8542p24 -0x1.1fe09c74b2f92p22 0x0.0p0 0x1.6eaaaaaaaaaadp6 -0x1.68387f2d8723bp9 0x0.0p0 T +CSV proj4-epsg.csv:03261 0 OK 0x1.031a5391336ffp24 -0x1.11a4a7ac3eb6dp22 0x0.0p0 0x1.7955555555555p6 -0x1.4ce563a64d1adp8 0x0.0p0 T +CSV proj4-epsg.csv:03262 0 OK 0x1.19d819f8cba2cp24 -0x1.1402adf4721cep22 0x0.0p0 0x1.73aaaaaaaaaabp6 -0x1.f4df7d2d5aae8p8 0x0.0p0 T +CSV proj4-epsg.csv:03263 0 OK 0x1.7d4775ead306cp23 0x1.4aabad43674c4p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03264 0 OK 0x1.5dbf93402a1p23 0x1.95b318b3d3521p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03265 0 OK 0x1.62a8f283c8118p23 0x1.01b6bfec23dd9p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03266 0 OK 0x1.633d3b8562244p23 0x1.3670fb7cd7093p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03267 0 OK 0x1.4596b0e3881dcp23 0x1.97bd06b82855ep18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03268 0 OK 0x1.48bfc4b7b9355p23 0x1.146b3c6161574p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03269 0 OK 0x1.652b6f003c36ap23 0x1.2f52257756a74p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03270 0 OK 0x1.6112cdef64c8dp23 0x1.06536645b5fbap20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2677p-1 0x0.0p0 F +CSV proj4-epsg.csv:03271 0 OK 0x1.4e2b6bb6e907ap23 -0x1.3901e426513dep22 0x0.0p0 -0x1.7949a83363bd9p3 -0x1.f0fde79b6973bp1 0x0.0p0 T +CSV proj4-epsg.csv:03272 0 OK 0x1.6ed0cd4c8bfe8p23 -0x1.3471d3684b5dep22 0x0.0p0 -0x1.0f4cd69ecfcb1p4 -0x1.60b274c5f7292p2 0x0.0p0 T +CSV proj4-epsg.csv:03273 0 OK 0x1.303fb5dee8c06p23 -0x1.0db8f2673c046p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03274 0 OK 0x1.1f878132a3453p23 -0x1.534b8f539b7f4p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03275 0 OK 0x1.246f2e5bd85f1p23 -0x1.0c2b3d8ee8a25p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03276 0 OK 0x1.1d1bec8cfdfc7p24 0x1.dad95b3c2ae93p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03277 0 OK 0x1.f5dfd8e9bfdbep23 0x1.30f84d5602c05p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03278 0 OK 0x1.b642caff5c954p23 0x1.1b88ba0a42f22p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03279 0 OK 0x1.6b4cba2bb1a5cp23 0x1.d9149218a7432p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03280 0 OK 0x1.6bf3f7d7c4683p23 0x1.f56249f1a7f08p20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03281 0 OK 0x1.6a285ba9b046bp23 0x1.e23a99490585cp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03282 0 OK 0x1.1e7021a600c6ep24 -0x1.e09c2310d7b8fp21 0x0.0p0 0x1.6caaaaaaaaaacp6 -0x1.a0ee36bc491e3p9 0x0.0p0 T +CSV proj4-epsg.csv:03283 0 OK -0x1.f1fc9646694bp21 -0x1.137273a1fd025p17 0x1.248a7f8fb8p7 0x1.000000000001cp0 -0x1.fffffffffffd7p-1 0x1.0p-28 T +CSV proj4-epsg.csv:03284 0 OK -0x1.2f2badbb608bep22 -0x1.2e1117b3c17a5p17 0x1.248a7f8fb8p7 0x1.000000000013ap0 -0x1.ffffffffffeebp-1 0x1.0p-28 T +CSV proj4-epsg.csv:03285 0 OK -0x1.6b388bc7878bap22 -0x1.52982d8aa843ep17 0x1.248a7f8fb8p7 0x1.0000000000cc1p0 -0x1.ffffffffff5bap-1 0x1.8p-29 T +CSV proj4-epsg.csv:03286 0 OK -0x1.af71a1c543bc3p22 -0x1.863c50de38e37p17 0x1.248a7f8fb8p7 0x1.0000000008d3bp0 -0x1.fffffffff7dc3p-1 0x1.0p-28 T +CSV proj4-epsg.csv:03287 0 OK 0x1.2d649f0c1a689p23 -0x1.f428c382a75d3p17 -0x1.e9408a8f7p7 0x1.fffffffd41211p-1 -0x1.fffffffe5d79dp-1 -0x1.0p-30 T +CSV proj4-epsg.csv:03288 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.ce0ff7a888dd4p31 -0x1.9c41d3adbd8f5p32 -0x1.15ba0b6a84p8 NaN NaN NaN T +CSV proj4-epsg.csv:03289 0 OK -0x1.3e571a425aa88p20 -0x1.2d8e16ad962f8p23 -0x1.15ba0b6a84p8 0x1.0000000048265p0 -0x1.00000002b49d6p0 0x1.52838p-13 F +CSV proj4-epsg.csv:03290 0 OK -0x1.2deabd5f67084p19 -0x1.2da3c1f78dcbp23 -0x1.15ba0b6a84p8 0x1.0000000048265p0 -0x1.00000002b49cep0 0x1.52838p-13 F +CSV proj4-epsg.csv:03291 0 OK 0x1.aaa7cdff135dp15 -0x1.2daf10c05bc0ep23 -0x1.15ba0b6a84p8 0x1.0000000048265p0 -0x1.00000002b49b4p0 0x1.52838p-13 F +CSV proj4-epsg.csv:03292 0 OK -0x1.131187da65893p19 -0x1.8f4db61368138p22 0x1.4dd21ec704p8 0x1.0000000ca787ep0 -0x1.fffffda4b6431p-1 0x1.9b8564p-8 T +CSV proj4-epsg.csv:03293 0 OK -0x1.92a152659e182p19 -0x1.8f5583b6331e7p22 0x1.4dd21ec704p8 0x1.00000063117eep0 -0x1.fffffda2da12dp-1 0x1.9b85f4p-8 T +CSV proj4-epsg.csv:03294 0 OK -0x1.096f95cb0f9e3p20 -0x1.8f60571c57fc3p22 0x1.4dd21ec704p8 0x1.0000028b55f3cp0 -0x1.fffffd96b01c6p-1 0x1.9b897cp-8 T +CSV proj4-epsg.csv:03295 0 OK -0x1.4ea42ca467bf8p20 -0x1.8f6f6676db13ep22 0x1.4dd21ec704p8 0x1.00000e2a6254p0 -0x1.fffffd5ae892dp-1 0x1.9b9c5p-8 T +CSV proj4-epsg.csv:03296 0 OK -0x1.b5619c6f1387dp20 -0x1.8f8c49a05e802p22 0x1.4dd21ec704p8 0x1.0000735019ba9p0 -0x1.fffffbcb0d4e8p-1 0x1.9c3e54p-8 T +CSV proj4-epsg.csv:03297 0 OK -0x1.13d3156a7ed89p21 -0x1.8fb5ba633f5dfp22 0x1.4dd21ec704p8 0x1.0002f6798716p0 -0x1.fffff636f1622p-1 0x1.a03268p-8 T +CSV proj4-epsg.csv:03298 0 OK -0x1.4e6e50a6c5caap21 -0x1.8feaa8dae5dp22 0x1.4dd21ec704p8 0x1.000e83cbec972p0 -0x1.fffff51077359p-1 0x1.b1f9f8p-8 T +CSV proj4-epsg.csv:03299 0 OK -0x1.8d74b54d3eb5p21 -0x1.902fb51fd4e96p22 0x1.4dd21ec704p8 0x1.003caefd566a1p0 -0x1.0000362fb06dfp0 0x1.f70464p-8 T +CSV proj4-epsg.csv:03300 0 OK 0x1.8b13cd7e73b16p20 -0x1.b69c163fc4cebp16 -0x1.d15da5e9p4 0x1.ffffffffffffep-1 -0x1.0p0 0x1.0p-30 T +CSV proj4-epsg.csv:03301 0 OK 0x1.f27885962d3cep19 -0x1.12f244577299p22 -0x1.d15da5e9p4 0x1.fffffcc32ba32p-1 -0x1.fffffff6f12bp-1 -0x1.9ap-23 T +CSV proj4-epsg.csv:03302 0 OK 0x1.f27885962d3cep19 -0x1.12f244577299p22 -0x1.d15da5e9p4 0x1.fffffcc32ba32p-1 -0x1.fffffff6f12bp-1 -0x1.9ap-23 T +CSV proj4-epsg.csv:03303 0 OK -0x1.0c3b3e44a71bp19 -0x1.6b36d79776ebp22 0x0.0p0 0x1.0000000000005p0 -0x1.ffffffffe728fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03304 0 OK 0x1.7e3df1fb6feb6p18 -0x1.743d346538731p22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfdb4p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03305 0 OK 0x1.846183bd02df8p18 -0x1.5b8bd8fdd26ecp22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe99p-1 0x1.0p-28 F +CSV proj4-epsg.csv:03306 0 OK 0x1.8a33bc404234p18 -0x1.437b93c397a37p22 0x1.f3f6c2d7ap5 0x1.ffffffffffffdp-1 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03307 0 OK -0x1.771a2f38bfc13p17 -0x1.33802e8c05219p22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03308 0 OK 0x1.7e3df1fb6feb6p18 -0x1.3734346538731p22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfdb4p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03309 0 OK 0x1.846183bd02df8p18 -0x1.c2f3b1fba4dd8p21 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe99p-1 0x1.0p-28 F +CSV proj4-epsg.csv:03310 0 OK 0x1.8a33bc404234p18 -0x1.18c127872f46ep21 0x1.f3f6c2d7ap5 0x1.ffffffffffffdp-1 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03311 0 OK -0x1.771a2f38bfc13p17 -0x1.fae17460290c8p19 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03312 0 OK 0x1.7e3df1fb6feb6p18 -0x1.3734346538731p22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfdb4p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03313 0 OK 0x1.846183bd02df8p18 -0x1.c2f3b1fba4dd8p21 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe99p-1 0x1.0p-28 F +CSV proj4-epsg.csv:03314 0 OK 0x1.8a33bc404234p18 -0x1.18c127872f46ep21 0x1.f3f6c2d7ap5 0x1.ffffffffffffdp-1 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03315 0 OK -0x1.771a2f38bfc13p17 -0x1.fae17460290c8p19 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03316 0 OK 0x1.7e3df1fb6feb6p18 -0x1.743d346538731p22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfdb4p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03317 0 OK 0x1.846183bd02df8p18 -0x1.5b8bd8fdd26ecp22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe99p-1 0x1.0p-28 F +CSV proj4-epsg.csv:03318 0 OK 0x1.8a33bc404234p18 -0x1.437b93c397a37p22 0x1.f3f6c2d7ap5 0x1.ffffffffffffdp-1 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03319 0 OK -0x1.771a2f38bfc13p17 -0x1.33802e8c05219p22 0x1.f3f6c2d7ap5 0x1.0p0 -0x1.ffffffffdfe26p-1 0x1.8p-29 F +CSV proj4-epsg.csv:03320 0 OK 0x1.666697f8da5c6p19 -0x1.58221e30bda8fp22 0x1.0d9ca65c48p8 0x1.fffffffeb5663p-1 -0x1.00000000af0f1p0 0x1.e607p-14 T +CSV proj4-epsg.csv:03321 0 OK -0x1.bc04f5b5de462p21 -0x1.ad976ac2d721ap21 0x1.b7a4bb691p6 0x1.ffebe714cfb7cp-1 -0x1.fe1658b2b1504p-1 0x1.7e779ep-5 T +CSV proj4-epsg.csv:03322 0 OK -0x1.da92eac0584f5p21 -0x1.339589a8172aep21 0x1.b7a4bb691p6 0x1.0175f2d4b842ap0 -0x1.0004c2469ef34p0 0x1.13cea38p-5 T +CSV proj4-epsg.csv:03323 0 OK -0x1.bc04f5b5de462p21 -0x1.33856ac2d721ap21 0x1.b7a4bb691p6 0x1.ffebe714cfb7cp-1 -0x1.fe1658b2b1504p-1 0x1.7e779ep-5 T +CSV proj4-epsg.csv:03324 0 OK -0x1.7fd902a6c0f6ap18 0x1.2dc73ceff454dp23 0x1.de61ea37cp4 0x1.fffffffffffebp-1 -0x1.0000000000012p0 0x1.0p-30 T +CSV proj4-epsg.csv:03325 0 OK -0x1.8d4d939e015f2p23 -0x1.2247d53474dfep23 0x0.0p0 0x1.ffffe018e84d1p-1 -0x1.ffffd22d1a4bcp-1 0x0.0p0 F +CSV proj4-epsg.csv:03326 0 OK -0x1.444500c22d4d1p23 -0x1.26eeb0f3aaf9ap23 0x0.0p0 0x1.ffffffa69d72p-1 -0x1.ffffffb7a691ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03327 0 OK -0x1.0ee2f0bdfbc87p23 -0x1.293f7f62ff32ap23 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6983p-1 0x0.0p0 F +CSV proj4-epsg.csv:03328 0 OK -0x1.c890b7bb2db4ap22 -0x1.2aa1cb184568p23 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03329 0 OK -0x1.80e845425a8a2p22 -0x1.2b8b062246cf4p23 0x0.0p0 0x1.fffffffffce5dp-1 -0x1.fffffffffeb3cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03330 0 OK -0x1.427128c7b0261p22 -0x1.2c2dbb929bb4ep23 0x0.0p0 0x1.ffffffffffa3bp-1 -0x1.ffffffffffd95p-1 0x0.0p0 F +CSV proj4-epsg.csv:03331 0 OK -0x1.0a82c7b84020bp22 -0x1.2ca35ade12886p23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.fffffffffff64p-1 0x0.0p0 F +CSV proj4-epsg.csv:03332 0 OK -0x1.aeb543db2a3f4p21 -0x1.2cfa0f32ef8bep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03333 0 OK -0x1.4f75cee806a84p21 -0x1.2d3a4dbd6fbfcp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffeep-1 0x0.0p0 F +CSV proj4-epsg.csv:03334 0 OK -0x1.eadb6f7769d3ap20 -0x1.2d695f39b9a04p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000008p0 0x0.0p0 F +CSV proj4-epsg.csv:03335 0 OK -0x1.3e545d4fac78ep20 -0x1.2d8aa50730fb2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffdp-1 0x0.0p0 F +CSV proj4-epsg.csv:03336 0 OK 0x1.884639085e276p20 -0x1.b3d9a621b637ep16 -0x1.043027ba18p7 0x1.000000a34efbbp0 -0x1.fffffffc6bcddp-1 0x1.f364p-14 T +CSV proj4-epsg.csv:03337 0 OK 0x1.d637f9771b4e2p20 -0x1.bce1e4978e03ap16 -0x1.043027ba18p7 0x1.000029533ac98p0 -0x1.ffffff3d47782p-1 0x1.da1ep-14 T +CSV proj4-epsg.csv:03338 0 OK 0x1.0fdcda6f72814p21 -0x1.cb79aa4a35056p16 -0x1.043027ba18p7 0x1.00031be1f2363p0 -0x1.fffff86a6da7bp-1 0x1.a3cp-20 T +CSV proj4-epsg.csv:03339 0 OK 0x1.314548693d46ap21 -0x1.e08b45cee7c2fp16 -0x1.043027ba18p7 0x1.001eb5912d533p0 -0x1.000008d53743p0 -0x1.103e4p-10 T +CSV proj4-epsg.csv:03340 0 OK 0x1.4dff0c971cb65p21 -0x1.fd86de36d1776p16 -0x1.043027ba18p7 0x1.00c90ee2637cdp0 -0x1.0001d2202a43ep0 -0x1.e6adc8p-8 T +CSV proj4-epsg.csv:03341 0 OK 0x1.6464b84412f98p21 -0x1.124e311357ccap17 -0x1.043027ba18p7 0x1.03eedce547279p0 -0x1.0014505efc5b7p0 -0x1.3298b9p-5 T +CSV proj4-epsg.csv:03342 0 OK 0x1.7261001bc2a6ep21 -0x1.2c8a0d3ebb93cp17 -0x1.043027ba18p7 0x1.107b54e0a036ep0 -0x1.0097ff59cfadap0 -0x1.3f0f876p-3 T +CSV proj4-epsg.csv:03343 0 OK 0x1.7545279aca72p21 -0x1.4fe8501454263p17 -0x1.043027ba18p7 0x1.3d82083930d68p0 -0x1.039c0834c0dfbp0 -0x1.25fc0378p-1 T +CSV proj4-epsg.csv:03344 0 OK 0x1.6994d38c7580cp21 -0x1.8003970b9a7a1p17 -0x1.043027ba18p7 0x1.d624a7bf512e1p0 -0x1.137fd91aa9f4dp0 -0x1.f677b2cp0 T +CSV proj4-epsg.csv:03345 0 OK 0x1.4ac59736865cp21 -0x1.c21ec0c70b7fap17 -0x1.043027ba18p7 0x1.e88fe4678b9ep1 -0x1.63134c757f022p0 -0x1.9c3de4eap2 T +CSV proj4-epsg.csv:03346 0 OK 0x1.12f08fd3e274cp21 -0x1.0ee7ad1cfab19p18 -0x1.043027ba18p7 0x1.4dedf8cf5a747p3 -0x1.769c99f5b6a54p1 -0x1.4c7dfff04p4 T +CSV proj4-epsg.csv:03347 0 OK 0x1.74e8c3fdc875p20 -0x1.4eeead9ec6aaap18 -0x1.043027ba18p7 0x1.08d48d572d1p5 -0x1.56052bad1f346p3 -0x1.ff0c16becp5 T +CSV proj4-epsg.csv:03348 0 OK 0x1.bc2f6560cd98p18 -0x1.a8b190d91820bp18 -0x1.043027ba18p7 0x1.c6edef4aa6cf8p6 -0x1.9a67b611a3473p5 -0x1.67bf623fp5 T +CSV proj4-epsg.csv:03349 0 EXC:java.lang.IllegalStateException -0x1.04a3f55394d88p20 -0x1.134e6dbcb336bp19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:03350 0 OK -0x1.80071bde87626p18 -0x1.b3d9a621b637ep16 -0x1.043027ba18p7 0x1.000000a34efc2p0 -0x1.fffffffc6bcddp-1 0x1.f364p-14 T +CSV proj4-epsg.csv:03351 0 OK -0x1.06340688e4b1ep20 -0x1.bce1e4978e03ap16 -0x1.043027ba18p7 0x1.000029533ac98p0 -0x1.ffffff3d47782p-1 0x1.da1ep-14 T +CSV proj4-epsg.csv:03352 0 OK -0x1.b0d64b211afd8p20 -0x1.cb79aa4a35056p16 -0x1.043027ba18p7 0x1.00031be1f2363p0 -0x1.fffff86a6da7bp-1 0x1.a3cp-20 T +CSV proj4-epsg.csv:03353 0 OK -0x1.3114b796c2b96p21 -0x1.e08b45cee7c2fp16 -0x1.043027ba18p7 0x1.001eb5912d533p0 -0x1.000008d53743p0 -0x1.103e4p-10 T +CSV proj4-epsg.csv:03354 0 OK -0x1.8e6cf368e349bp21 -0x1.fd86de36d1776p16 -0x1.043027ba18p7 0x1.00c90ee2637cdp0 -0x1.0001d2202a43ep0 -0x1.e6adc8p-8 T +CSV proj4-epsg.csv:03355 0 OK -0x1.f21947bbed068p21 -0x1.124e311357ccap17 -0x1.043027ba18p7 0x1.03eedce547279p0 -0x1.0014505efc5b7p0 -0x1.3298b9p-5 T +CSV proj4-epsg.csv:03356 0 OK -0x1.2f177ff21eac9p22 -0x1.2c8a0d3ebb93cp17 -0x1.043027ba18p7 0x1.107b54e0a036ep0 -0x1.0097ff59cfadap0 -0x1.3f0f876p-3 T +CSV proj4-epsg.csv:03357 0 OK -0x1.6aae6c329ac7p22 -0x1.4fe8501454263p17 -0x1.043027ba18p7 0x1.3d82083930d68p0 -0x1.039c0834c0dfbp0 -0x1.25fc0378p-1 T +CSV proj4-epsg.csv:03358 0 OK -0x1.ad8f9639c53fap22 -0x1.8003970b9a7a1p17 -0x1.043027ba18p7 0x1.d624a7bf512e1p0 -0x1.137fd91aa9f4dp0 -0x1.f677b2cp0 T +CSV proj4-epsg.csv:03359 0 OK -0x1.fa003464bcd2p22 -0x1.c21ec0c70b7fap17 -0x1.043027ba18p7 0x1.e88fe4678b9ep1 -0x1.63134c757f022p0 -0x1.9c3de4eap2 T +CSV proj4-epsg.csv:03360 0 OK -0x1.2979dc0b0762dp23 -0x1.0ee7ad1cfab19p18 -0x1.043027ba18p7 0x1.4dedf8cf5a747p3 -0x1.769c99f5b6a54p1 -0x1.4c7dfff04p4 T +CSV proj4-epsg.csv:03361 0 OK -0x1.5e1d678046f16p23 -0x1.4eeead9ec6aaap18 -0x1.043027ba18p7 0x1.08d48d572d1p5 -0x1.56052bad1f346p3 -0x1.ff0c16becp5 T +CSV proj4-epsg.csv:03362 0 OK -0x1.9d5d84d4f9934p23 -0x1.a8b190d91820bp18 -0x1.043027ba18p7 0x1.c6edef4aa6cf8p6 -0x1.9a67b611a3473p5 -0x1.67bf623fp5 T +CSV proj4-epsg.csv:03363 0 EXC:java.lang.IllegalStateException -0x1.ea57feaa729b1p23 -0x1.134e6dbcb336bp19 -0x1.043027ba18p7 NaN NaN NaN T +CSV proj4-epsg.csv:03364 0 OK -0x1.7f42660a138d4p22 -0x1.3ab469000dcd9p21 -0x1.d62309d35p6 0x1.4064a00dd38abp0 -0x1.03d82564728dap0 -0x1.3bfc3f8cp0 T +CSV proj4-epsg.csv:03365 0 OK -0x1.29da98314fb4fp19 -0x1.82e8fa705e916p22 0x1.38018c34ep7 0x1.00000000c2f5fp0 -0x1.0000000405853p0 0x1.1ef62p-11 T +CSV proj4-epsg.csv:03366 0 OK -0x1.bc5730629f69ep18 -0x1.66a69a705e916p22 0x1.38018c34ep7 0x1.00000000c2f5fp0 -0x1.0000000405853p0 0x1.1ef62p-11 T +CSV proj4-epsg.csv:03367 0 OK 0x1.5365bc4bd5244p23 0x1.2c37313607245p23 0x1.0a000b67cp5 0x1.ffffffffffffdp-1 -0x1.00000000000e1p0 0x1.0p-29 F +CSV proj4-epsg.csv:03368 0 OK 0x1.5365b51cc3f29p23 0x1.2c372a8ff558p23 0x1.58cfb3ee8p5 0x1.0000000000026p0 -0x1.fffffffffff3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03369 0 OK 0x1.abd28c8d585cfp23 -0x1.d87e9d8ab84dep18 0x1.0a000b67cp5 0x1.ffffe0128e2fcp-1 -0x1.ffffd22d0cf09p-1 -0x1.158p-20 T +CSV proj4-epsg.csv:03370 0 OK 0x1.62c9d69af6e75p23 -0x1.43b13bbc97f01p18 0x1.0a000b67cp5 0x1.ffffffa693186p-1 -0x1.ffffffb7a7e93p-1 -0x1.cp-28 T +CSV proj4-epsg.csv:03371 0 OK 0x1.2d67b4b355bcp23 -0x1.f33d091b59e88p17 0x1.0a000b67cp5 0x1.fffffffd53f48p-1 -0x1.fffffffe698f5p-1 -0x1.0p-30 T +CSV proj4-epsg.csv:03372 0 OK 0x1.02cd13af156a6p23 -0x1.9ab29ca0c0b1cp17 0x1.0a000b67cp5 0x1.ffffffffda3e9p-1 -0x1.ffffffffedbb6p-1 0x1.0p-29 T +CSV proj4-epsg.csv:03373 0 OK 0x1.bdf1a2180b57dp22 -0x1.60697566d140cp17 0x1.0a000b67cp5 0x1.fffffffffce86p-1 -0x1.fffffffffeb7p-1 0x0.0p0 T +CSV proj4-epsg.csv:03374 0 OK 0x1.abd268c34f55p23 -0x1.d880bf9cb3d17p18 0x1.58cfb3ee8p5 0x1.ffffe013907bfp-1 -0x1.ffffd22e0fd8bp-1 -0x1.168p-20 T +CSV proj4-epsg.csv:03375 0 OK 0x1.62c9bf579ad42p23 -0x1.43b2ce0dc3216p18 0x1.58cfb3ee8p5 0x1.ffffffa695513p-1 -0x1.ffffffb7a93d8p-1 -0x1.0p-27 T +CSV proj4-epsg.csv:03376 0 OK 0x1.2d67a343d6403p23 -0x1.f33f88938d2d3p17 0x1.58cfb3ee8p5 0x1.fffffffd540eap-1 -0x1.fffffffe6995dp-1 -0x1.0p-29 T +CSV proj4-epsg.csv:03377 0 OK 0x1.02cd0598e787bp23 -0x1.9ab4b3accf547p17 0x1.58cfb3ee8p5 0x1.ffffffffda4abp-1 -0x1.ffffffffedbb4p-1 0x0.0p0 T +CSV proj4-epsg.csv:03378 0 OK 0x1.bdf18a37564c9p22 -0x1.606b45a4a0d65p17 0x1.58cfb3ee8p5 0x1.fffffffffced3p-1 -0x1.fffffffffeb6dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03379 0 OK 0x1.abd28c8d585cfp23 0x1.22690b13aa3d9p23 0x1.0a000b67cp5 0x1.ffffe0128e2fcp-1 -0x1.ffffd22d0cf0cp-1 -0x1.158p-20 T +CSV proj4-epsg.csv:03380 0 OK 0x1.62c9d69af6e75p23 0x1.270f76221b408p23 0x1.0a000b67cp5 0x1.ffffffa693186p-1 -0x1.ffffffb7a7e8fp-1 -0x1.cp-28 T +CSV proj4-epsg.csv:03381 0 OK 0x1.2d67b4b355bcp23 0x1.29600bdb92986p23 0x1.0a000b67cp5 0x1.fffffffd53f48p-1 -0x1.fffffffe698eep-1 -0x1.0p-30 T +CSV proj4-epsg.csv:03382 0 OK 0x1.02cd13af156a6p23 0x1.2ac2358d7cfd4p23 0x1.0a000b67cp5 0x1.ffffffffda3e9p-1 -0x1.ffffffffedb94p-1 0x1.0p-29 T +CSV proj4-epsg.csv:03383 0 OK 0x1.bdf1a2180b57dp22 0x1.2bab5a2a64bbp23 0x1.0a000b67cp5 0x1.fffffffffce86p-1 -0x1.fffffffffeb5ep-1 0x1.0p-30 T +CSV proj4-epsg.csv:03384 0 OK 0x1.7f7a75f18c2f6p22 0x1.2c4dfff22288dp23 0x1.0a000b67cp5 0x1.ffffffffffa9dp-1 -0x1.ffffffffffe26p-1 0x1.0p-29 T +CSV proj4-epsg.csv:03385 0 OK 0x1.478c0732b0c08p22 0x1.2cc393ea3ebaep23 0x1.0a000b67cp5 0x1.fffffffffff51p-1 -0x1.fffffffffffa3p-1 0x1.0p-29 T +CSV proj4-epsg.csv:03386 0 OK 0x1.1463d50f3c404p22 0x1.2d1a3fe50a18bp23 0x1.0a000b67cp5 0x1.000000000001bp0 -0x1.fffffffffffd2p-1 0x1.0p-29 T +CSV proj4-epsg.csv:03387 0 OK 0x1.abd268c34f55p23 0x1.2268fa031a617p23 0x1.58cfb3ee8p5 0x1.ffffe013907bfp-1 -0x1.ffffd22e0fd96p-1 -0x1.168p-20 T +CSV proj4-epsg.csv:03388 0 OK 0x1.62c9bf579ad42p23 0x1.270f698f91e6fp23 0x1.58cfb3ee8p5 0x1.ffffffa695513p-1 -0x1.ffffffb7a93e8p-1 -0x1.0p-27 T +CSV proj4-epsg.csv:03389 0 OK 0x1.2d67a343d6403p23 0x1.296001ddb1cb5p23 0x1.58cfb3ee8p5 0x1.fffffffd540eap-1 -0x1.fffffffe69948p-1 -0x1.0p-29 T +CSV proj4-epsg.csv:03390 0 OK 0x1.02cd0598e787bp23 0x1.2ac22d314cc2bp23 0x1.58cfb3ee8p5 0x1.ffffffffda4abp-1 -0x1.ffffffffedbabp-1 0x0.0p0 T +CSV proj4-epsg.csv:03391 0 OK 0x1.bdf18a37564c9p22 0x1.2bab52e96d7cap23 0x1.58cfb3ee8p5 0x1.fffffffffced3p-1 -0x1.fffffffffeb92p-1 0x0.0p0 T +CSV proj4-epsg.csv:03392 0 OK 0x1.7f7a6101bd0e3p22 0x1.2c4df97a38f38p23 0x1.58cfb3ee8p5 0x1.ffffffffffb5fp-1 -0x1.ffffffffffe0dp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03393 0 OK 0x1.478bf45b8c9a6p22 0x1.2cc38e052eaf2p23 0x1.58cfb3ee8p5 0x1.fffffffffff68p-1 -0x1.fffffffffffbcp-1 0x0.0p0 T +CSV proj4-epsg.csv:03394 0 OK 0x1.1463c3bf7b9bfp22 0x1.2d1a3a6ccb59cp23 0x1.58cfb3ee8p5 0x1.000000000000ap0 -0x1.0000000000003p0 0x0.0p0 T +CSV proj4-epsg.csv:03395 0 OK 0x1.2d6af7afa3d2p23 0x1.295deba5ea465p23 0x1.a33d9d45cp6 0x1.fffffffd3fbbep-1 -0x1.fffffffe5d0ap-1 0x0.0p0 T +CSV proj4-epsg.csv:03396 0 OK 0x1.02cf85f31a1dcp23 0x1.2ac07f7e03f6ep23 0x1.a33d9d45cp6 0x1.ffffffffd929cp-1 -0x1.ffffffffed2acp-1 0x1.8p-29 T +CSV proj4-epsg.csv:03397 0 OK -0x1.060e05e1e9221p20 0x1.2db4e3c16fa42p23 0x1.f3c0cdb3p4 0x1.fffffffffffd2p-1 -0x1.0000000000003p0 0x1.0p-28 T +CSV proj4-epsg.csv:03398 0 OK 0x1.111fa7d2a3735p20 -0x1.1b63c71240a35p21 0x1.f3c0cdb3p4 0x1.0000031c13b01p0 -0x1.ffffffeeccc9fp-1 0x1.25p-22 T +CSV proj4-epsg.csv:03399 0 OK 0x1.487db40c58d3ap20 -0x1.1b4bc67ca9558p21 0x1.f3c0cdb3p4 0x1.00000c490001p0 -0x1.ffffffbfd6ff4p-1 0x1.208p-20 T +CSV proj4-epsg.csv:03400 0 OK 0x1.80460501863f4p20 -0x1.1b2f0d0f09cf6p21 0x1.f3c0cdb3p4 0x1.0000294dcefccp0 -0x1.ffffff3e3d11cp-1 0x1.e46p-19 T +CSV proj4-epsg.csv:03401 0 OK 0x1.b88c021f3d897p20 -0x1.1b0d6a70d3664p21 0x1.f3c0cdb3p4 0x1.00007a2a2ce41p0 -0x1.fffffe1488f47p-1 0x1.67ap-17 T +CSV proj4-epsg.csv:03402 0 OK 0x1.f163e5e6bee6ap20 -0x1.1ae6a4d85d79ep21 0x1.f3c0cdb3p4 0x1.0001458b4a6fep0 -0x1.fffffbda46628p-1 0x1.e134p-16 T +CSV proj4-epsg.csv:03403 0 OK 0x1.157171f5173ccp21 -0x1.1aba78176cea5p21 0x1.f3c0cdb3p4 0x1.00031bd1b2d62p0 -0x1.fffff877e1f5ap-1 0x1.277p-14 T +CSV proj4-epsg.csv:03404 0 OK 0x1.328fa8f5c28b4p21 -0x1.1a8894778f026p21 0x1.f3c0cdb3p4 0x1.000711dc798a5p0 -0x1.fffff55679a1ep-1 0x1.51aa8p-13 T +CSV proj4-epsg.csv:03405 0 OK 0x1.50186a410135ap21 -0x1.1a509d60637b4p21 0x1.f3c0cdb3p4 0x1.000f1fed86463p0 -0x1.fffff84bcdf3fp-1 0x1.6b2ep-12 T +CSV proj4-epsg.csv:03406 0 OK -0x1.30f4c97d9e373p21 -0x1.e0b615f3f1d38p16 0x0.0p0 0x1.0000000000015p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03407 0 OK -0x1.8e495cc70879ep21 -0x1.fdbc4e42dc52ap16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:03408 0 OK -0x1.4d632fb684254p22 0x1.2e14852e3dde5p21 -0x1.db1eccc1p5 0x1.ffffffffffff4p-1 -0x1.ffffffffe1dd7p-1 0x1.0p-30 T +CSV proj4-epsg.csv:03409 0 OK -0x1.4d632fb684254p22 0x1.2e14852e3dde5p21 -0x1.db1eccc1p5 0x1.ffffffffffff4p-1 -0x1.ffffffffe1dd7p-1 0x1.0p-30 T +CSV proj4-epsg.csv:03410 0 OK -0x1.2f2ad2a853aa4p22 0x1.2c79e562e8f19p23 -0x1.db1eccc1p5 0x1.0000000000137p0 -0x1.ffffffffffedcp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03411 0 OK -0x1.6b371fc2e75a9p22 0x1.2be870e55c174p23 -0x1.db1eccc1p5 0x1.0000000000bbbp0 -0x1.ffffffffff6b3p-1 0x1.0p-30 T +CSV proj4-epsg.csv:03412 0 OK -0x1.44250236b5ff9p23 -0x1.2c0642f065cfep24 0x1.782d373c2ap10 0x1.ffffffac20772p-1 -0x1.ffffffbc32c14p-1 -0x1.0ep-23 F +CSV proj4-epsg.csv:03413 0 OK -0x1.0ecab6c243103p23 -0x1.2d2e1c8a12ef2p24 0x1.782d373c2ap10 0x1.fffffffd7dd4ep-1 -0x1.fffffffe82a09p-1 -0x1.8p-28 F +CSV proj4-epsg.csv:03414 0 OK 0x1.da45bf21f89aep19 0x1.dbd07f1232597p19 0x1.782d373c2ap10 0x1.fffffffffff58p-1 -0x1.ffffffffe3b96p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03415 0 OK 0x1.e917ed1b91ffep25 0x1.eaaf030b61359p25 0x1.782d373c2ap10 0x1.fffffffffff58p-1 -0x1.ffffffffe3b96p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03416 0 OK 0x1.2a269e9561e22p24 0x1.2b1ec74993bfdp24 0x1.782d373c2ap10 0x1.fffffffffff58p-1 -0x1.ffffffffe3b96p-1 0x1.0p-29 F +CSV proj4-epsg.csv:03417 0 OK 0x1.266cb69809204p20 -0x1.6189a4c2cc731p22 0x1.12960e343p8 0x1.fffffd16ac9f7p-1 -0x1.ffffffffb09efp-1 0x1.21f3p-14 T +CSV proj4-epsg.csv:03418 0 OK 0x1.266cb6a5b46c8p20 -0x1.6189a50d488a9p22 0x1.9b4815842p5 0x1.fffffd16aca3fp-1 -0x1.ffffffffb09fdp-1 0x1.21f3p-14 T +CSV proj4-epsg.csv:03419 0 OK 0x1.266cb69809204p20 -0x1.6189a4c2cc731p22 0x1.12960e343p8 0x1.fffffd16ac9f7p-1 -0x1.ffffffffb09efp-1 0x1.21f3p-14 T +CSV proj4-epsg.csv:03420 0 OK 0x1.266cb6a5f5aaep20 -0x1.6189a4eed6b12p22 0x1.129df1ae1cp8 0x1.fffffd16ac9d9p-1 -0x1.ffffffffb0a2ap-1 0x1.21f4p-14 T +CSV proj4-epsg.csv:03421 0 OK 0x1.0a6451206d3f3p25 -0x1.8a38fa5faee36p22 -0x1.6e4c9c8bdp6 0x1.007e06b1afa2cp0 -0x1.c050f70ed9a53p-1 0x1.0d89f8b8p0 T +CSV proj4-epsg.csv:03422 0 OK -0x1.6b394d41d3e95p22 -0x1.516d0c5add3dap17 0x0.0p0 0x1.0000000000afep0 -0x1.ffffffffff6e7p-1 0x0.0p0 T +CSV proj4-epsg.csv:03423 0 OK -0x1.af712254bfe67p22 -0x1.84dfd94dc711p17 0x0.0p0 0x1.0000000007e41p0 -0x1.fffffffff8c3fp-1 0x0.0p0 T +CSV proj4-epsg.csv:03424 0 OK 0x1.086acf76c046ep18 -0x1.f155910f1f77p21 -0x1.ed5ccf5a8p4 0x1.0p0 -0x1.ffffffffdfebdp-1 0x1.0p-28 F +CSV proj4-epsg.csv:03425 0 OK 0x1.0e0f70a86761ap18 -0x1.c5daec3e9db7dp21 -0x1.ed5ccf5a8p4 0x1.0000000000003p0 -0x1.ffffffffdff31p-1 0x1.0p-28 F +CSV proj4-epsg.csv:03426 0 OK 0x1.082190d2e356ap18 -0x1.f14c644420842p21 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe006bp-1 0x0.0p0 F +CSV proj4-epsg.csv:03427 0 OK 0x1.0dc7f5bddc05ep18 -0x1.c5d1fd4cbe479p21 0x0.0p0 0x1.0000000000001p0 -0x1.ffffffffdff85p-1 0x0.0p0 F +CSV proj4-epsg.csv:03428 0 OK 0x1.8b1db1a2aebaep20 -0x1.b7a2d18286caap16 0x1.cc897188ep6 0x1.fffffffdc76dbp-1 -0x1.000000002ee41p0 0x1.e8a1dp-10 T +CSV proj4-epsg.csv:03429 0 OK 0x1.cda7cfa84d137p19 -0x1.b1f9d5d83ff7p16 0x1.cc897188ep6 0x1.fffffffdc76d4p-1 -0x1.000000002ee41p0 0x1.e8a1dp-10 T +CSV proj4-epsg.csv:03430 0 OK 0x1.0eff2d3ae2f18p18 -0x1.b12d4978b4cp16 0x1.cc897188ep6 0x1.fffffffdc76dbp-1 -0x1.000000002ee4p0 0x1.e8a1dp-10 T +CSV proj4-epsg.csv:03431 0 OK -0x1.7fba6d1e3b2fcp18 -0x1.b531a65380195p16 0x1.cc897188ep6 0x1.fffffffdc76bep-1 -0x1.000000002ee41p0 0x1.e8a1dp-10 T +CSV proj4-epsg.csv:03432 0 OK 0x1.0855c39fef915p18 -0x1.f15533a17562ep21 0x1.cc897188ep6 0x1.fffffffdc76e2p-1 -0x1.000000001edb9p0 0x1.e8a1dp-10 F +CSV proj4-epsg.csv:03433 0 OK 0x1.0dfbcc253ea2dp18 -0x1.c5da80fd7d13bp21 0x1.cc897188ep6 0x1.fffffffdc76dep-1 -0x1.000000001ed46p0 0x1.e8a1dp-10 F +CSV proj4-epsg.csv:03434 0 OK -0x1.45c11eefe81dp17 -0x1.bed4333ebe1e5p16 0x0.0p0 0x1.000040e594275p0 -0x1.fffffedf9730dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03435 0 OK 0x1.19370d0a93c59p21 -0x1.c1a503b4b745ep16 -0x1.4f7242d66p6 0x1.fffffffffffd3p-1 -0x1.ffffffffffffep-1 0x1.0p-28 T +CSV proj4-epsg.csv:03436 0 OK 0x1.02ce41bfc3cb6p23 -0x1.9986487190bcdp17 0x1.6774b53p2 0x1.ffffffffd9338p-1 -0x1.ffffffffed3ep-1 0x1.8p-29 T +CSV proj4-epsg.csv:03437 0 OK 0x1.deb00c713e8d1p22 -0x1.75dc2705a7f0ep17 0x1.6774b53p2 0x1.45f65f679c4b3p-2 -0x1.0ec4168c98c5p0 -0x1.1a0d5204p0 T +CSV proj4-epsg.csv:03438 0 OK 0x1.f298c81dcfa8dp22 -0x1.856b6c17066b1p17 0x1.6774b53p2 0x1.3a2f5ae0e7686p-5 -0x1.1775b25022c53p0 -0x1.7a9d53fcp0 T +CSV proj4-epsg.csv:03439 0 OK 0x1.f2bcbe9c6fe9dp22 -0x1.8589577475496p17 0x1.6774b53p2 0x1.3a2f5ae0e6f5dp-5 -0x1.1775b25022c53p0 -0x1.7a9d53fcp0 T +CSV proj4-epsg.csv:03440 0 OK -0x1.fd92bd6532c0cp19 -0x1.380ab14777655p22 0x1.3384fca918p7 0x1.000001b9eef4p0 -0x1.00000099ab82p0 0x1.2fd51cp-8 T +CSV proj4-epsg.csv:03441 0 OK -0x1.51cbf4db26a67p20 -0x1.381c855926915p22 0x1.3384fca918p7 0x1.00000f0b795b6p0 -0x1.000000777fde8p0 0x1.2fe8d8p-8 T +CSV proj4-epsg.csv:03442 0 OK -0x1.a5c500c01f345p20 -0x1.3833bb20675cbp22 0x1.3384fca918p7 0x1.00005617c5326p0 -0x1.ffffffcb64921p-1 0x1.3050bcp-8 T +CSV proj4-epsg.csv:03443 0 OK -0x1.fd92bd6532c09p19 -0x1.380ab14777655p22 0x1.3384fca918p7 0x1.000001b9eef3ap0 -0x1.00000099ab82p0 0x1.2fd51cp-8 T +CSV proj4-epsg.csv:03444 0 OK -0x1.51cbf4db26a66p20 -0x1.381c855926915p22 0x1.3384fca918p7 0x1.00000f0b795b6p0 -0x1.000000777fde8p0 0x1.2fe8d8p-8 T +CSV proj4-epsg.csv:03445 0 OK -0x1.a5c500c01f342p20 -0x1.3833bb20675cbp22 0x1.3384fca918p7 0x1.00005617c5326p0 -0x1.ffffffcb64923p-1 0x1.3050bcp-8 T +CSV proj4-epsg.csv:03446 0 OK -0x1.b454bd6532c09p19 -0x1.380ab14777655p22 0x1.3384fca918p7 0x1.000001b9eef3ap0 -0x1.00000099ab82p0 0x1.2fd51cp-8 T +CSV proj4-epsg.csv:03447 0 OK -0x1.c7dde9b64d4ccp19 -0x1.381c855926915p22 0x1.3384fca918p7 0x1.00000f0b795b6p0 -0x1.000000777fde8p0 0x1.2fe8d8p-8 T +CSV proj4-epsg.csv:03448 0 OK -0x1.dd5401803e684p19 -0x1.3833bb20675cbp22 0x1.3384fca918p7 0x1.00005617c5326p0 -0x1.ffffffcb64923p-1 0x1.3050bcp-8 T +CSV proj4-epsg.csv:03449 0 OK 0x1.df3aeb6c92f6p21 -0x1.beeec76705753p16 0x1.3384fca918p7 0x1.0000292da7b44p0 -0x1.0000003d265c7p0 0x1.300f3p-8 T +CSV proj4-epsg.csv:03450 0 OK 0x1.177ed59cdebap22 -0x1.c584c6e63cd2ap16 0x1.3384fca918p7 0x1.0000c9c560f55p0 -0x1.fffffe556c6fcp-1 0x1.30f85p-8 T +CSV proj4-epsg.csv:03451 0 OK 0x1.3f082e71d88f7p22 -0x1.cd98751426525p16 0x1.3384fca918p7 0x1.00031c245dd32p0 -0x1.fffff99f36c31p-1 0x1.3449acp-8 T +CSV proj4-epsg.csv:03452 0 OK 0x1.6626e295c2f52p22 -0x1.d74a780ed4f55p16 0x1.3384fca918p7 0x1.000a6b2ec424ep0 -0x1.fffff66c96cb8p-1 0x1.3e8bd4p-8 T +CSV proj4-epsg.csv:03453 0 OK 0x1.df3fd6bdcac1p21 -0x1.bee356625383p16 0x1.3384fca918p7 0x1.0000292da7b28p0 -0x1.0000003d265c7p0 0x1.300f3p-8 T +CSV proj4-epsg.csv:03454 0 OK 0x1.1781d5e952506p22 -0x1.c5792ab82f8e4p16 0x1.3384fca918p7 0x1.0000c9c560f55p0 -0x1.fffffe556c6fcp-1 0x1.30f85p-8 T +CSV proj4-epsg.csv:03455 0 OK 0x1.3f0bbba309aa4p22 -0x1.cd8ca3f759017p16 0x1.3384fca918p7 0x1.00031c245dd22p0 -0x1.fffff99f36c31p-1 0x1.3449acp-8 T +CSV proj4-epsg.csv:03456 0 OK 0x1.3f0bbba309aa4p22 -0x1.cd8ca3f759017p16 0x1.3384fca918p7 0x1.00031c245dd22p0 -0x1.fffff99f36c31p-1 0x1.3449acp-8 T +CSV proj4-epsg.csv:03457 0 OK 0x1.662aff6697647p22 -0x1.d73e6767eb1b5p16 0x1.3384fca918p7 0x1.000a6b2ec424p0 -0x1.fffff66c96cb8p-1 0x1.3e8bd4p-8 T +CSV proj4-epsg.csv:03458 0 OK -0x1.fd58427460db6p19 -0x1.b7a868b258082p16 0x1.17e5e978cp6 0x1.000001e0f88bcp0 -0x1.fffffff57b7cdp-1 -0x1.b5p-22 T +CSV proj4-epsg.csv:03459 0 OK -0x1.51ae6a90b0cf2p20 -0x1.bc1d95e68b2d9p16 0x1.17e5e978cp6 0x1.00000f29d49a9p0 -0x1.ffffffb170932p-1 -0x1.bccp-19 T +CSV proj4-epsg.csv:03460 0 OK -0x1.a5a712b1a36d3p20 -0x1.c1eb59cd9965fp16 0x1.17e5e978cp6 0x1.0000560f46b85p0 -0x1.fffffe8f20932p-1 -0x1.3c94p-16 T +CSV proj4-epsg.csv:03461 0 OK -0x1.b454bd6532c09p19 -0x1.b76c51ddd9552p16 0x1.3384fca918p7 0x1.000001b9eef3ap0 -0x1.00000099ab82ap0 0x1.2fd51cp-8 T +CSV proj4-epsg.csv:03462 0 OK -0x1.c7dde9b64d4ccp19 -0x1.bbe15649a4545p16 0x1.3384fca918p7 0x1.00000f0b795b6p0 -0x1.000000777fdebp0 0x1.2fe8d8p-8 T +CSV proj4-epsg.csv:03463 0 OK -0x1.dd5401803e684p19 -0x1.c1aec819d72b4p16 0x1.3384fca918p7 0x1.00005617c5326p0 -0x1.ffffffcb64914p-1 0x1.3050bcp-8 T +CSV proj4-epsg.csv:03464 0 OK -0x1.67b7317549a1dp20 -0x1.4ca09097550b2p22 0x1.3384fca918p7 0x1.ffffffaed32edp-1 -0x1.0000009ee5f7dp0 0x1.2fd258p-8 F +CSV proj4-epsg.csv:03465 0 OK -0x1.b41a427460db6p19 -0x1.b7a868b258082p16 0x1.17e5e978cp6 0x1.000001e0f88bcp0 -0x1.fffffff57b7cdp-1 -0x1.b5p-22 T +CSV proj4-epsg.csv:03466 0 OK -0x1.c7a2d521619e4p19 -0x1.bc1d95e68b2d9p16 0x1.17e5e978cp6 0x1.00000f29d49a9p0 -0x1.ffffffb170932p-1 -0x1.bccp-19 T +CSV proj4-epsg.csv:03467 0 OK -0x1.dd18256346da6p19 -0x1.c1eb59cd9965fp16 0x1.17e5e978cp6 0x1.0000560f46b85p0 -0x1.fffffe8f20932p-1 -0x1.3c94p-16 T +CSV proj4-epsg.csv:03468 0 OK -0x1.fd58427460db6p19 -0x1.b7a868b258082p16 0x1.17e5e978cp6 0x1.000001e0f88bcp0 -0x1.fffffff57b7cdp-1 -0x1.b5p-22 T +CSV proj4-epsg.csv:03469 0 OK -0x1.51ae6a90b0cf2p20 -0x1.bc1d95e68b2d9p16 0x1.17e5e978cp6 0x1.00000f29d49a9p0 -0x1.ffffffb170932p-1 -0x1.bccp-19 T +CSV proj4-epsg.csv:03470 0 OK -0x1.a5a712b1a36d3p20 -0x1.c1eb59cd9965fp16 0x1.17e5e978cp6 0x1.0000560f46b85p0 -0x1.fffffe8f20932p-1 -0x1.3c94p-16 T +CSV proj4-epsg.csv:03471 0 OK -0x1.b454bd6532c09p19 -0x1.b76c51ddd9552p16 0x1.3384fca918p7 0x1.000001b9eef3ap0 -0x1.00000099ab82ap0 0x1.2fd51cp-8 T +CSV proj4-epsg.csv:03472 0 OK -0x1.c7dde9b64d4ccp19 -0x1.bbe15649a4545p16 0x1.3384fca918p7 0x1.00000f0b795b6p0 -0x1.000000777fdebp0 0x1.2fe8d8p-8 T +CSV proj4-epsg.csv:03473 0 OK -0x1.dd5401803e684p19 -0x1.c1aec819d72b4p16 0x1.3384fca918p7 0x1.00005617c5326p0 -0x1.ffffffcb64914p-1 0x1.3050bcp-8 T +CSV proj4-epsg.csv:03474 0 OK -0x1.67b7317549a1dp20 -0x1.4ca09097550b2p22 0x1.3384fca918p7 0x1.ffffffaed32edp-1 -0x1.0000009ee5f7dp0 0x1.2fd258p-8 F +CSV proj4-epsg.csv:03475 0 OK -0x1.7301ea3f03ee1p18 -0x1.8119b3258bc23p22 -0x1.15738bebd8p7 0x1.00000000cb41fp0 -0x1.000000032131p0 0x1.1d278p-11 F +CSV proj4-epsg.csv:03476 0 OK -0x1.74a1baf5f78fcp18 -0x1.81188583d9c97p22 -0x1.15738bebd8p7 0x1.00000000cb41dp0 -0x1.000000032131p0 0x1.1d278p-11 F +CSV proj4-epsg.csv:03477 0 OK 0x1.37dcbd58e5914p20 -0x1.b1d0dec4b081fp16 0x1.a4d2328e3p6 0x1.fffffffffc9d3p-1 -0x1.fffffff8fd87ap-1 0x1.d84c8p-11 T +CSV proj4-epsg.csv:03478 0 OK 0x1.da54497e403e3p20 -0x1.b337805baca37p16 0x1.a4d2328e3p6 0x1.00000007feca6p0 -0x1.fffffff8da78bp-1 0x1.d84cep-11 T +CSV proj4-epsg.csv:03479 0 OK 0x1.3e3596d46f72ap21 -0x1.b5d6b6b36e3cbp16 0x1.a4d2328e3p6 0x1.000000a2d7621p0 -0x1.fffffff57c564p-1 0x1.d852ap-11 T +CSV proj4-epsg.csv:03480 0 OK 0x1.8ef2ed3b41e0ap21 -0x1.b9b7ffd460a42p16 0x1.a4d2328e3p6 0x1.000006519e22bp0 -0x1.ffffffd6943eep-1 0x1.d8888p-11 T +CSV proj4-epsg.csv:03481 0 OK 0x1.df4343f789787p21 -0x1.bee9a8dbff5f7p16 0x1.a4d2328e3p6 0x1.0000294812232p0 -0x1.ffffff362168p-1 0x1.d9cfep-11 T +CSV proj4-epsg.csv:03482 0 OK 0x1.da54497e403e3p20 -0x1.b337805baca37p16 0x1.a4d2328e3p6 0x1.00000007feca6p0 -0x1.fffffff8da78bp-1 0x1.d84cep-11 T +CSV proj4-epsg.csv:03483 0 OK 0x1.3e3596d46f72ap21 -0x1.b5d6b6b36e3cbp16 0x1.a4d2328e3p6 0x1.000000a2d7621p0 -0x1.fffffff57c564p-1 0x1.d852ap-11 T +CSV proj4-epsg.csv:03484 0 OK 0x1.8ef2ed3b41e0ap21 -0x1.b9b7ffd460a42p16 0x1.a4d2328e3p6 0x1.000006519e22bp0 -0x1.ffffffd6943eep-1 0x1.d8888p-11 T +CSV proj4-epsg.csv:03485 0 OK 0x1.df4343f789787p21 -0x1.bee9a8dbff5f7p16 0x1.a4d2328e3p6 0x1.0000294812232p0 -0x1.ffffff362168p-1 0x1.d9cfep-11 T +CSV proj4-epsg.csv:03486 0 OK 0x1.1934d40e58236p21 -0x1.c13ee29302ce4p16 -0x1.7716b9076p6 0x1.000000000000fp0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:03487 0 OK 0x1.8b0919b95527p20 -0x1.b66e93babe425p16 -0x1.7716b9076p6 0x1.ffffffffffff5p-1 -0x1.ffffffffffffbp-1 0x1.0p-29 T +CSV proj4-epsg.csv:03488 0 OK -0x1.4f25dc8cdf5e9p21 -0x1.1f77b6977d2fbp22 -0x1.65cac30fep8 0x1.fffffffffffd5p-1 -0x1.0000000000021p0 0x1.0p-28 T +CSV proj4-epsg.csv:03489 0 OK -0x1.48fdef24b532ap21 -0x1.20d823327c36cp22 -0x1.0e7238975p7 0x1.0000000000006p0 -0x1.0000000000075p0 0x1.0p-30 T +CSV proj4-epsg.csv:03490 0 OK -0x1.2f2c26b90490dp22 -0x1.2d08f8f651243p17 0x1.ac76401cp1 0x1.0000000000186p0 -0x1.fffffffffff16p-1 0x0.0p0 T +CSV proj4-epsg.csv:03491 0 OK -0x1.6b383009d72b6p22 -0x1.516e389669585p17 0x1.ac76401cp1 0x1.0000000000b42p0 -0x1.ffffffffff6e1p-1 0x1.0p-30 T +CSV proj4-epsg.csv:03492 0 OK -0x1.4bf4830ab2adep22 -0x1.3d07f07ff816p17 0x1.4a36cd274p4 0x1.2035cbe21bc5ap0 -0x1.017e7f43c4ca8p0 0x1.a0e819p-6 T +CSV proj4-epsg.csv:03493 0 OK -0x1.4c19a4d939275p22 -0x1.3d286a9a73378p17 0x1.4a36cd274p4 0x1.2035cbe21bc3ep0 -0x1.017e7f43c4ca8p0 0x1.a0e819p-6 T +CSV proj4-epsg.csv:03494 0 OK 0x1.1e422b053b6fap23 -0x1.2d7a88d7f89dbp24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7847fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03495 0 OK 0x1.4f69497584544p23 -0x1.2c846e9c251b7p24 0x0.0p0 0x1.0000000cb37ecp0 -0x1.ffffffedc14ebp-1 0x0.0p0 F +CSV proj4-epsg.csv:03496 0 OK 0x1.904f0f5a55fbap23 -0x1.2aba95d83f3ecp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f6fap-1 0x0.0p0 F +CSV proj4-epsg.csv:03497 0 OK 0x1.f3417b32694dp23 -0x1.260fe460ff0bp24 0x0.0p0 0x1.00020c662a7d5p0 -0x1.ffeba5817893ap-1 0x0.0p0 F +CSV proj4-epsg.csv:03498 0 OK 0x1.2bbb626545c31p23 -0x1.905510fae1713p22 0x0.0p0 -0x1.1345ca0668217p4 -0x1.611ff6eab1cdp4 0x0.0p0 F +CSV proj4-epsg.csv:03499 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:03500 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:03501 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03502 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:03503 0 OK 0x1.bdf145425a89fp22 -0x1.608b68d2bba1p17 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb6ep-1 0x0.0p0 T +CSV proj4-epsg.csv:03504 0 OK 0x1.abd2139e015f8p23 0x1.2267a16ee3222p23 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4a8p-1 0x0.0p0 T +CSV proj4-epsg.csv:03505 0 OK 0x1.62c980c22d4cap23 0x1.270e7d2e193bfp23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a6916p-1 0x0.0p0 T +CSV proj4-epsg.csv:03506 0 OK 0x1.2d6770bdfbc87p23 0x1.295f4b9d6d74ep23 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe69832p-1 0x0.0p0 T +CSV proj4-epsg.csv:03507 0 OK 0x1.02ccdbdd96da6p23 0x1.2ac19752b3aa6p23 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedb85p-1 0x0.0p0 T +CSV proj4-epsg.csv:03508 0 OK 0x1.bdf145425a89fp22 0x1.2baad25cb5118p23 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb59p-1 0x0.0p0 T +CSV proj4-epsg.csv:03509 0 OK 0x1.7f7a28c7b0261p22 0x1.2c4d87cd09f72p23 0x0.0p0 0x1.ffffffffffa74p-1 -0x1.ffffffffffe46p-1 0x0.0p0 T +CSV proj4-epsg.csv:03510 0 OK 0x1.478bc7b840209p22 0x1.2cc3271880caap23 0x0.0p0 0x1.fffffffffff28p-1 -0x1.fffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:03511 0 OK 0x1.1463a1ed951f6p22 0x1.2d19db6d5dce3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe4p-1 0x0.0p0 T +CSV proj4-epsg.csv:03512 0 OK 0x1.abd2139e015f8p23 -0x1.d8abd2239bbcfp18 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4b8p-1 0x0.0p0 T +CSV proj4-epsg.csv:03513 0 OK 0x1.62c980c22d4cap23 -0x1.43d05a3cd8824p18 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a691cp-1 0x0.0p0 T +CSV proj4-epsg.csv:03514 0 OK 0x1.2d6770bdfbc87p23 -0x1.f36d18a4a2c9cp17 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe6984dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03515 0 OK 0x1.02ccdbdd96da6p23 -0x1.9ada2b531569ap17 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedba6p-1 0x0.0p0 T +CSV proj4-epsg.csv:03516 0 OK 0x1.bdf145425a89fp22 -0x1.608b68d2bba1p17 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb6ep-1 0x0.0p0 T +CSV proj4-epsg.csv:03517 0 OK 0x1.abd2139e015f8p23 0x1.2267a16ee3222p23 0x0.0p0 0x1.ffffe018e8544p-1 -0x1.ffffd22d1a4a8p-1 0x0.0p0 T +CSV proj4-epsg.csv:03518 0 OK 0x1.62c980c22d4cap23 0x1.270e7d2e193bfp23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a6916p-1 0x0.0p0 T +CSV proj4-epsg.csv:03519 0 OK 0x1.2d6770bdfbc87p23 0x1.295f4b9d6d74ep23 0x0.0p0 0x1.fffffffd543bp-1 -0x1.fffffffe69832p-1 0x0.0p0 T +CSV proj4-epsg.csv:03520 0 OK 0x1.02ccdbdd96da6p23 0x1.2ac19752b3aa6p23 0x0.0p0 0x1.ffffffffda51ap-1 -0x1.ffffffffedb85p-1 0x0.0p0 T +CSV proj4-epsg.csv:03521 0 OK 0x1.bdf145425a89fp22 0x1.2baad25cb5118p23 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb59p-1 0x0.0p0 T +CSV proj4-epsg.csv:03522 0 OK 0x1.7f7a28c7b0261p22 0x1.2c4d87cd09f72p23 0x0.0p0 0x1.ffffffffffa74p-1 -0x1.ffffffffffe46p-1 0x0.0p0 T +CSV proj4-epsg.csv:03523 0 OK 0x1.478bc7b840209p22 0x1.2cc3271880caap23 0x0.0p0 0x1.fffffffffff28p-1 -0x1.fffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:03524 0 OK 0x1.1463a1ed951f6p22 0x1.2d19db6d5dce3p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe4p-1 0x0.0p0 T +CSV proj4-epsg.csv:03525 0 OK 0x1.346d941260737p25 0x1.ade91b650f92ep23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03526 0 OK 0x1.34d5aca4c0fa6p25 0x1.a6a9210b796e8p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03527 0 OK 0x1.35714ef5b22c1p25 0x1.9f0456d52f01dp23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03528 0 OK 0x1.2bd968d2a2e64p25 0x1.fb545b8bd8253p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03529 0 OK 0x1.2adacf382fbfep25 0x1.e7ba7cb36d652p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03530 0 OK 0x1.253bf21b184dfp25 -0x1.f7f8d0602fd2dp23 0x0.0p0 -0x1.769991aad1352p4 -0x1.f0caead5d999cp2 0x0.0p0 T +CSV proj4-epsg.csv:03531 0 OK 0x1.4863c7d171cb6p25 -0x1.d31f2a29a531cp23 0x0.0p0 -0x1.62e01f67670cdp5 -0x1.045a32fb5cc03p4 0x0.0p0 T +CSV proj4-epsg.csv:03532 0 OK 0x1.3a32fe4ac6459p25 -0x1.df9e2cb47a902p23 0x0.0p0 -0x1.4a9954f9ab3d2p5 -0x1.de393a77622a4p3 0x0.0p0 T +CSV proj4-epsg.csv:03533 0 OK 0x1.4d47f750ae02fp25 -0x1.e2f0bd6a3c214p23 0x0.0p0 -0x1.0ac4480313c57p6 -0x1.ad27e01b171cdp4 0x0.0p0 T +CSV proj4-epsg.csv:03534 0 OK 0x1.5f70c409ceb94p25 -0x1.e648a743190efp23 0x0.0p0 -0x1.98f3ede305139p6 -0x1.6eff320d8812bp5 0x0.0p0 T +CSV proj4-epsg.csv:03535 0 OK 0x1.e52f8250f75bdp24 -0x1.1f9a196bf95f4p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03536 0 OK 0x1.ff41f061775e6p24 -0x1.bea914407c14cp15 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03537 0 OK 0x1.2dd274f38165cp25 0x1.2299a64987abep23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03538 0 OK 0x1.2d7b85ab4d5fcp25 0x1.1d6964afab054p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03539 0 OK 0x1.0d128230130d3p25 0x1.162aef7dbf1bbp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03540 0 OK 0x1.0b66b96eb5161p25 0x1.0e4770f39b4e7p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03541 0 OK 0x1.275b40c031c52p25 0x1.8ddc6bbc5538dp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03542 0 OK 0x1.2700bd7475281p25 0x1.7fb057864fbdp22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03543 0 OK 0x1.3b222609b9a7p25 0x1.1e19986656b1p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03544 0 OK 0x1.3ddf73ff244cbp25 0x1.1444d66c63f8p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03545 0 OK 0x1.0361bb5c553a5p25 -0x1.56b09dbea5744p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03546 0 OK 0x1.022bb963844b9p25 -0x1.6e96bf6bb0ee5p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03547 0 OK 0x1.23fcbd1cb9414p25 -0x1.e80880b723934p23 0x0.0p0 -0x1.69786229a1e1ap4 -0x1.ddbca7fd05435p2 0x0.0p0 T +CSV proj4-epsg.csv:03548 0 OK 0x1.037564a5541b6p25 0x1.0209db7ca1966p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03549 0 OK 0x1.0247d109b6bedp25 0x1.b26b2183fd961p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c0ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03550 0 OK 0x1.2c7825becf8b6p25 0x1.0dee57040ddc4p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03551 0 OK 0x1.2c88c187c5dc8p25 0x1.0c034d519d32fp23 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03552 0 OK 0x1.013f451a2a63ap25 0x1.061610b8a5be4p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03553 0 OK 0x1.2d5803f367b2fp25 0x1.dc036fa8ae1e4p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03554 0 OK 0x1.25b459f5127a2p25 0x1.684ee4ea86e27p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03555 0 OK 0x1.2afab9abca418p25 0x1.8bbaaec72155p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03556 0 OK 0x1.281ddb8988e76p25 0x1.61d041392fd52p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03557 0 OK 0x1.26c801f9b726fp25 0x1.3afb00975c85dp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0b9bp-1 0x0.0p0 F +CSV proj4-epsg.csv:03558 0 OK 0x1.396338ca5fecp25 0x1.9175bf9dc7122p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03559 0 OK 0x1.3a3ca17b9fa94p25 0x1.8c21f96adee92p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0dd8p-1 0x0.0p0 F +CSV proj4-epsg.csv:03560 0 OK 0x1.3b84861e1eac8p25 0x1.7666627ee5503p23 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03561 0 OK 0x1.2b9a41c7261c3p25 -0x1.f8fde5bd7eaecp23 0x0.0p0 -0x1.bf94b3b1d8a3ep4 -0x1.2f20b9170dfd3p3 0x0.0p0 T +CSV proj4-epsg.csv:03562 0 OK 0x1.01e8f1d8c80aep25 -0x1.cfc90bdf292d3p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03563 0 OK 0x1.0098ed02b4e39p25 -0x1.9b9488ce62884p18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03564 0 OK 0x1.3725c5dab9b66p25 0x1.2c5d68f194574p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03565 0 OK 0x1.3936bc542d87ap25 0x1.237459696809p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03566 0 OK 0x1.0534952b88f8dp25 -0x1.2019599db1a7p16 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03567 0 OK 0x1.07016ad8cb494p25 0x1.d9261b883541fp18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03568 0 OK 0x1.1f7368a741e23p25 0x1.08d5ed05b0fdep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03569 0 OK 0x1.1e625ce0d736bp25 0x1.03d9d3580fb87p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03570 0 OK 0x1.1d376108d366bp25 0x1.04d0423f0a5b2p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03571 0 OK 0x1.49196cecbe225p23 0x1.580f8a5f4247fp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0d66p-1 0x0.0p0 F +CSV proj4-epsg.csv:03572 0 OK 0x1.4878e19e97bc5p23 0x1.4b66a33511a01p19 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03573 0 OK 0x1.c327009da2e32p25 -0x1.eecfe8f22d32cp20 0x0.0p0 0x1.7400000000001p6 -0x1.e9379798d328ap8 0x0.0p0 T +CSV proj4-epsg.csv:03574 0 OK 0x1.7f99e4691505bp25 -0x1.7b2ae2d1db16cp20 0x0.0p0 -0x1.581d8fdbe0a0dp7 -0x1.646f48f401d6p6 0x0.0p0 T +CSV proj4-epsg.csv:03575 0 OK 0x1.c327009da2e32p25 -0x1.eecfe8f22d32cp20 0x0.0p0 0x1.7400000000001p6 -0x1.e9379798d328ap8 0x0.0p0 T +CSV proj4-epsg.csv:03576 0 OK 0x1.7f99e4691505bp25 -0x1.7b2ae2d1db16cp20 0x0.0p0 -0x1.581d8fdbe0a0dp7 -0x1.646f48f401d6p6 0x0.0p0 T +CSV proj4-epsg.csv:03577 0 OK 0x1.c76c50bcd7496p22 -0x1.6e8b794a13cc3p17 0x0.0p0 0x1.c794823138561p-2 -0x1.0b3a0b2adb3adp0 0x0.0p0 T +CSV proj4-epsg.csv:03578 0 OK 0x1.eaa885ede2fd6p22 -0x1.89e6524d3011p17 0x0.0p0 -0x1.aaab745ce4dc9p-6 -0x1.19ac228ab7345p0 0x0.0p0 T +CSV proj4-epsg.csv:03579 0 OK 0x1.04f431afb9a36p23 -0x1.a446f9d3aae55p17 0x0.0p0 -0x1.67c91d367f9fp-1 -0x1.329ec9deaa66cp0 0x0.0p0 T +CSV proj4-epsg.csv:03580 0 OK 0x1.18fd413320f3ap23 -0x1.c90147e201cbdp17 0x0.0p0 -0x1.0ee266394fa22p1 -0x1.716f48edd3973p0 0x0.0p0 T +CSV proj4-epsg.csv:03581 0 OK 0x1.2e9df8627e368p23 -0x1.f4464f83fa836p17 0x0.0p0 -0x1.2cc1b2c6cf8bap2 -0x1.fd1eb5bb308e7p0 0x0.0p0 T +CSV proj4-epsg.csv:03582 0 OK 0x1.46108987c0024p23 -0x1.13ac69249e86cp18 0x0.0p0 -0x1.2e39c70fdfad5p3 -0x1.9a55f3fc92a1cp1 0x0.0p0 T +CSV proj4-epsg.csv:03583 0 OK 0x1.23712284e29c9p23 -0x1.73cdb10eb8be7p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe0cf3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03584 0 OK 0x1.168fc343c8f2cp25 0x1.7f4967881eee5p21 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe0c81p-1 0x0.0p0 F +CSV proj4-epsg.csv:03585 0 OK 0x1.78206c898da1cp23 0x1.0a84ef7491b8ap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03586 0 OK 0x1.69ecfd5d61591p23 0x1.38f82f99e3851p21 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03587 0 OK 0x1.6a00742d44bdp23 -0x1.333be5fe10f52p22 0x0.0p0 -0x1.7686103837988p4 -0x1.f0a00a5db8281p2 0x0.0p0 T +CSV proj4-epsg.csv:03588 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:03589 0 OK 0x1.80a02ace2648ap23 -0x1.1c9acc079b1dep22 0x0.0p0 -0x1.567267c0929f9p5 -0x1.f2c604aaa8be9p3 0x0.0p0 T +CSV proj4-epsg.csv:03590 0 OK 0x1.994c26431b469p23 -0x1.26698bba6217ap22 0x0.0p0 -0x1.0ab431bafa2d7p6 -0x1.acf729614cab7p4 0x0.0p0 T +CSV proj4-epsg.csv:03591 0 OK 0x1.b27cc5d80250ep23 -0x1.28733d05df362p22 0x0.0p0 -0x1.98d990063ec6cp6 -0x1.6ed261eb7328p5 0x0.0p0 T +CSV proj4-epsg.csv:03592 0 OK 0x1.279ff9888b715p23 -0x1.4cb0e59d69ed3p19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03593 0 OK 0x1.37a9f52baa452p23 -0x1.13d271129e1c2p14 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03594 0 OK 0x1.6fb165c9065a4p23 0x1.62464b038399bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03595 0 OK 0x1.6f4754db09495p23 0x1.5bf2c4f5ce6f8p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03596 0 OK 0x1.47c330687a4fbp23 0x1.52e912879c2bp18 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03597 0 OK 0x1.45b98b14707a9p23 0x1.494b817e1bac7p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03598 0 OK 0x1.67cea956d147ap23 0x1.e504b1f970c3fp20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03599 0 OK 0x1.67603867febddp23 0x1.d3bd835722efp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03600 0 OK 0x1.b9e7ad424f0a3p23 0x1.5ccd4e1188ecep22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03601 0 OK 0x1.9eba1738f13fdp23 0x1.50d0bec9aeb44p22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03602 0 OK 0x1.3bf29e9fc4c02p23 -0x1.a247f1cb11a1dp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03603 0 OK 0x1.3a95771a16649p23 -0x1.aeb07ce58fc44p17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03604 0 OK 0x1.6260ccf61c887p23 -0x1.29848050ed706p22 0x0.0p0 -0x1.6965a34d8a5a8p4 -0x1.dd93f429dc627p2 0x0.0p0 T +CSV proj4-epsg.csv:03605 0 OK 0x1.3b8c644d42174p23 0x1.9c6a5d24c256ep17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03606 0 OK 0x1.6e0afe1503ac1p23 0x1.4912db8d06b7bp21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03607 0 OK 0x1.6e1f2824f9b61p23 0x1.46bc1ed71df32p21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe28b4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03608 0 OK 0x1.4b047d4d0086bp23 0x1.517bfb4099862p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03609 0 OK 0x1.62e65f3763a56p23 0x1.9c38bcddef3dep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03610 0 OK 0x1.6826274d485ddp23 0x1.dcbab5baa6ffep21 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03611 0 OK 0x1.6f4668b190045p23 0x1.2fb6062bcac2cp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2926p-1 0x0.0p0 F +CSV proj4-epsg.csv:03612 0 OK 0x1.68bb8f51b7b46p23 0x1.5ff87bbe0f19dp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03613 0 OK 0x1.5df2e99177a9ep23 0x1.912b856bef2dap22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03614 0 OK 0x1.7abd8927cff7ap23 0x1.31c09f82825dap22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03615 0 OK 0x1.7bc684036876dp23 0x1.6b8a3feeece7ep22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03616 0 OK 0x1.7d5629263629ap23 0x1.9b53a36e26486p22 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03617 0 OK 0x1.77de7bb0f38a4p23 -0x1.33db0875d1bf3p22 0x0.0p0 -0x1.bf7ce334221d1p4 -0x1.2f04f08531c1p3 0x0.0p0 T +CSV proj4-epsg.csv:03618 0 OK 0x1.92a758fe6d9e2p23 0x1.c4e20324affb3p20 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03619 0 OK 0x1.910d9c19c2e6dp23 0x1.a9712c4cace6ep19 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe26e9p-1 0x0.0p0 F +CSV proj4-epsg.csv:03620 0 OK 0x1.7802cd64ba298p23 0x1.6e31d6a1963cdp22 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03621 0 OK 0x1.7a87a09c328d4p23 0x1.6354a1625a49bp22 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03622 0 OK 0x1.3e2bb7db5ad39p23 -0x1.62f8e28d4bd9p14 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03623 0 OK 0x1.405d7fbff6184p23 0x1.1ff96ae61d7fbp17 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03624 0 OK 0x1.5e2bbcc3e3fa8p23 0x1.42d4f14491f36p20 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03625 0 OK 0x1.5cdec35d189f2p23 0x1.3cc10a25ec8dfp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03626 0 OK 0x1.5b7227d1fcf54p23 0x1.3ded7947a4d6dp20 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03627 0 OK 0x1.e55aab52362f8p22 -0x1.d3e6352759774p18 0x0.0p0 0x1.000000000004p0 -0x1.ffffffffe275cp-1 0x0.0p0 F +CSV proj4-epsg.csv:03628 0 OK 0x1.c320dd12e6dep25 -0x1.eec42d8adafc8p20 0x0.0p0 0x1.7400000000001p6 -0x1.e8ee26e0b30efp8 0x0.0p0 T +CSV proj4-epsg.csv:03629 0 OK 0x1.7f9534d1e68f3p25 -0x1.7b23478c1a5f1p20 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:03630 0 OK 0x1.e49be65553059p22 -0x1.8508c7274704ap17 0x0.0p0 0x1.2cd4478ec90bfp-4 -0x1.16640d4a8025p0 0x0.0p0 T +CSV proj4-epsg.csv:03631 0 OK 0x1.c76966e9bcacbp22 -0x1.6e8c3d6214c34p17 0x0.0p0 0x1.c7b2d97438cb1p-2 -0x1.0b3a6dc534e2ap0 0x0.0p0 T +CSV proj4-epsg.csv:03632 0 OK 0x1.eaa520329793p22 -0x1.89e649f88ee14p17 0x0.0p0 -0x1.a79dda5053ffdp-6 -0x1.19ac1ee7891d1p0 0x0.0p0 T +CSV proj4-epsg.csv:03633 0 OK 0x1.04f243f38b0c8p23 -0x1.a4462218bc936p17 0x0.0p0 -0x1.67a39707f8c09p-1 -0x1.329d98b24afdap0 0x0.0p0 T +CSV proj4-epsg.csv:03634 0 OK 0x1.18fb030a80a67p23 -0x1.c8ff42bb86b8cp17 0x0.0p0 -0x1.0ed1edd378c7ep1 -0x1.716a0fb489a9bp0 0x0.0p0 T +CSV proj4-epsg.csv:03635 0 OK 0x1.2e9b5dd4f53bbp23 -0x1.f442d98f40bp17 0x0.0p0 -0x1.2cb274d597d4cp2 -0x1.fd0e5bed75f06p0 0x0.0p0 T +CSV proj4-epsg.csv:03636 0 OK 0x1.460d851c5e45ep23 -0x1.13a9ce031ed91p18 0x0.0p0 -0x1.2e2b0449cc9c8p3 -0x1.9a3f4382db347p1 0x0.0p0 T +CSV proj4-epsg.csv:03637 0 OK 0x1.5f93851e465bap23 -0x1.31d86d8ab61adp18 0x0.0p0 -0x1.2389b4d62fa57p4 -0x1.7bce59eaa739bp2 0x0.0p0 T +CSV proj4-epsg.csv:03638 0 OK 0x1.7b782fe029ceap23 -0x1.55901ad7cbc07p18 0x0.0p0 -0x1.14d9bb1f208c7p5 -0x1.8381b345defbdp3 0x0.0p0 T +CSV proj4-epsg.csv:03639 0 OK 0x1.9a101a9d4e39cp23 -0x1.7fdc4002f942ap18 0x0.0p0 -0x1.0602e4aea1a9ap6 -0x1.a39b9d29f98d3p4 0x0.0p0 T +CSV proj4-epsg.csv:03640 0 OK 0x1.bbbaaf24bde46p23 -0x1.b1f6fcc259cd2p18 0x0.0p0 -0x1.f1c40c5a4f6f9p6 -0x1.d709308222544p5 0x0.0p0 T +CSV proj4-epsg.csv:03641 0 OK 0x1.e0e351fd8fdbcp23 -0x1.ed4ff64fb2b4cp18 0x0.0p0 0x1.e69051969d207p6 -0x1.0ed46b594f471p7 0x0.0p0 T +CSV proj4-epsg.csv:03642 0 OK 0x1.cdd80837d631cp23 -0x1.ce626cc5c402fp18 0x0.0p0 -0x1.58057e087b03fp7 -0x1.6440823aa9cffp6 0x0.0p0 T +CSV proj4-epsg.csv:03643 0 OK 0x1.f4ec0c008e452p23 -0x1.077b947949932p19 0x0.0p0 0x1.7ffffffffffffp6 -0x1.9db3b1cb682edp7 0x0.0p0 T +CSV proj4-epsg.csv:03644 0 OK 0x1.101c31e8bf327p24 -0x1.2db35f2e5b08bp19 0x0.0p0 0x1.7400000000001p6 -0x1.e8ee26e0b30e6p8 0x0.0p0 T +CSV proj4-epsg.csv:03645 0 OK 0x1.237227298b8p23 -0x1.73edc5a635c6bp19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03646 0 OK 0x1.5f893f9ff8dc1p23 0x1.dc39dad629f42p19 0x0.0p0 0x1.0000000000006p0 -0x1.ffffffffe2841p-1 0x0.0p0 F +CSV proj4-epsg.csv:03647 0 OK 0x1.60d2597774112p19 -0x1.2f6d097ace468p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0038p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03648 0 OK 0x1.5416e36c223dp20 -0x1.2f6907c5b7f08p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.ffffffffeff61p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03649 0 OK 0x1.fa379045c2be7p20 -0x1.2f5ffe36ed10bp24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00a3p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03650 0 OK 0x1.52640e3138f0fp21 -0x1.2f51645c983a3p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00cp-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03651 0 OK 0x1.ab054d7b2fc78p21 -0x1.2f3c4efb982a6p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0089p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03652 0 OK 0x1.042c897a90ab4p22 -0x1.2f1f48ed1c463p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0075p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03653 0 OK 0x1.3608b6037e289p22 -0x1.2ef80c39a08c5p24 0x1.452f68cp-1 0x1.0000000000087p0 -0x1.fffffffff00d9p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03654 0 OK 0x1.6c359e70d9569p22 -0x1.2ec2ff0c857aep24 0x1.452f68cp-1 0x1.000000000016cp0 -0x1.ffffffffeff7ap-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03655 0 OK 0x1.a841b5a505698p22 -0x1.2e7a340e7183bp24 0x1.452f68cp-1 0x1.0000000000b45p0 -0x1.ffffffffef7ccp-1 0x1.81dep-15 F +CSV proj4-epsg.csv:03656 0 OK 0x1.ec7970e20d519p22 -0x1.2e134d57359d5p24 0x1.452f68cp-1 0x1.0000000007e4fp0 -0x1.ffffffffe8cdfp-1 0x1.81dap-15 F +CSV proj4-epsg.csv:03657 0 OK 0x1.1e426e01fd2fdp23 -0x1.2d7a780fd88f5p24 0x1.452f68cp-1 0x1.000000007b44fp0 -0x1.ffffffff684a1p-1 0x1.81d8p-15 F +CSV proj4-epsg.csv:03658 0 OK 0x1.4f699decf4f3p23 -0x1.2c845a77869bdp24 0x1.452f68cp-1 0x1.0000000cb3833p0 -0x1.ffffffedb100dp-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03659 0 OK 0x1.904f84114b82fp23 -0x1.2aba7aec4719ap24 0x1.452f68cp-1 0x1.00000311abad7p0 -0x1.fffff91c22d07p-1 0x1.81fap-15 F +CSV proj4-epsg.csv:03660 0 OK 0x1.f3423f187ed2p23 -0x1.260fb4048baf3p24 0x1.452f68cp-1 0x1.00020c44a97fep0 -0x1.ffeba4b790ff3p-1 0x1.e7fcp-15 F +CSV proj4-epsg.csv:03661 0 OK 0x1.2b8b6baa82fa1p23 -0x1.90546f69a39a1p22 0x1.452f68cp-1 -0x1.1380d65ec3f79p4 -0x1.6173393902a1bp4 -0x1.95e18fb8p0 F +CSV proj4-epsg.csv:03662 0 OK 0x1.abd16f7d90dcfp23 -0x1.d8af215caa05ap18 0x1.452f68cp-1 0x1.ffffe01b02937p-1 -0x1.ffffd22f5cb7ap-1 0x1.82c2p-15 T +CSV proj4-epsg.csv:03663 0 OK 0x1.62c9108a02f2cp23 -0x1.43d305ef6ed21p18 0x1.452f68cp-1 0x1.ffffffa6a1d85p-1 -0x1.ffffffb799449p-1 0x1.81d8p-15 T +CSV proj4-epsg.csv:03664 0 OK 0x1.2d671a493de01p23 -0x1.f37181bc47573p17 0x1.452f68cp-1 0x1.fffffffd544b4p-1 -0x1.fffffffe599a3p-1 0x1.81d2p-15 T +CSV proj4-epsg.csv:03665 0 OK 0x1.02cc94e0fcf12p23 -0x1.9addf1235f5e3p17 0x1.452f68cp-1 0x1.ffffffffda451p-1 -0x1.ffffffffddc37p-1 0x1.81dep-15 T +CSV proj4-epsg.csv:03666 0 OK 0x1.bdf0cbd84cffp22 -0x1.608ebb541eabfp17 0x1.452f68cp-1 0x1.fffffffffcf26p-1 -0x1.ffffffffeebf5p-1 0x1.81ep-15 T +CSV proj4-epsg.csv:03667 0 OK 0x1.7f79bde71b171p22 -0x1.37e10b75f5b25p17 0x1.452f68cp-1 0x1.ffffffffffa93p-1 -0x1.ffffffffefe93p-1 0x1.81dep-15 T +CSV proj4-epsg.csv:03668 0 OK 0x1.478b678a577b3p22 -0x1.1a78fa9544105p17 0x1.452f68cp-1 0x1.fffffffffff7dp-1 -0x1.fffffffff004cp-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03669 0 OK 0x1.146349d25f5ep22 -0x1.04cbb726e4358p17 0x1.452f68cp-1 0x1.fffffffffffb7p-1 -0x1.fffffffff007ep-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03670 0 OK 0x1.c9872b0a7707cp21 -0x1.e977e4a39a73dp16 0x1.452f68cp-1 0x1.0000000000006p0 -0x1.fffffffff0085p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03671 0 OK 0x1.6f7f1d5366f76p21 -0x1.d1eef5312802dp16 0x1.452f68cp-1 0x1.fffffffffffb7p-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03672 0 OK 0x1.193b9b676ddd8p21 -0x1.c14bed1714d52p16 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0085p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03673 0 OK 0x1.8b172d243755fp20 -0x1.b67b25cfab202p16 0x1.452f68cp-1 0x1.0000000000006p0 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03674 0 OK 0x1.cd9c6c02d257ap19 -0x1.b0d6490bc5d7dp16 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03675 0 OK 0x1.0eeb4d1117dep18 -0x1.b00a72d018662p16 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff0085p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03676 0 OK -0x1.7fcb8db088f38p18 -0x1.b40c27e66e6d4p16 0x1.452f68cp-1 0x1.fffffffffffe2p-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03677 0 OK -0x1.06139045c2bd9p20 -0x1.bd15b6b14e387p16 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03678 0 OK -0x1.b0a41c6271e1ep20 -0x1.cbaf910624b44p16 0x1.452f68cp-1 0x1.fffffffffffd3p-1 -0x1.fffffffff0089p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03679 0 OK -0x1.30f34d7b2fc78p21 -0x1.e0c4f20634811p16 0x1.452f68cp-1 0x1.fffffffffffd3p-1 -0x1.fffffffff0087p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03680 0 OK -0x1.8e4712f521572p21 -0x1.fdcb008218b45p16 0x1.452f68cp-1 0x1.ffffffffffffp-1 -0x1.fffffffff0083p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03681 0 OK -0x1.f1ff6c06fc50cp21 -0x1.1283d9fee942cp17 0x1.452f68cp-1 0x1.0000000000031p0 -0x1.fffffffff006cp-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03682 0 OK -0x1.2f2c9e70d9569p22 -0x1.2d0a708c7202p17 0x1.452f68cp-1 0x1.0000000000133p0 -0x1.ffffffffeff99p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03683 0 OK -0x1.6b38b5a505694p22 -0x1.516fef966d9bep17 0x1.452f68cp-1 0x1.0000000000b62p0 -0x1.ffffffffef768p-1 0x1.81dep-15 T +CSV proj4-epsg.csv:03684 0 OK -0x1.af7070e20d51cp22 -0x1.84e34b3460c92p17 0x1.452f68cp-1 0x1.0000000007e34p0 -0x1.ffffffffe8c9fp-1 0x1.81dap-15 T +CSV proj4-epsg.csv:03685 0 OK -0x1.ff7bdc03fa5f6p22 -0x1.d14deee2e7d0ep17 0x1.452f68cp-1 0x1.000000007b417p0 -0x1.ffffffff6850fp-1 0x1.81d8p-15 T +CSV proj4-epsg.csv:03686 0 OK -0x1.30e51decf4f34p23 -0x1.262e5d85f0c54p18 0x1.452f68cp-1 0x1.0000000cb37fap0 -0x1.ffffffedb1028p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03687 0 OK -0x1.71cb04114b82fp23 -0x1.98a64055d151bp18 0x1.452f68cp-1 0x1.00000311abad7p0 -0x1.fffff91c22ce7p-1 0x1.81fap-15 T +CSV proj4-epsg.csv:03688 0 OK -0x1.d4bdbf187ed1ap23 -0x1.61abfd2255f8ap19 0x1.452f68cp-1 0x1.00020c44a97fep0 -0x1.ffeba4b791025p-1 0x1.e7fcp-15 T +CSV proj4-epsg.csv:03689 0 OK -0x1.0d06ebaa82e77p23 -0x1.9a0ff0266af61p23 0x1.452f68cp-1 -0x1.1380d65ec4181p4 -0x1.6173393902bc1p4 -0x1.95e18fb8p0 T +CSV proj4-epsg.csv:03690 0 OK -0x1.8d4cef7d90dc9p23 -0x1.29ba57682bb6dp24 0x1.452f68cp-1 0x1.ffffe01b02937p-1 -0x1.ffffd22f5cb7ap-1 0x1.82c2p-15 F +CSV proj4-epsg.csv:03691 0 OK -0x1.4444908a02f35p23 -0x1.2c0dc7d5e0a3ap24 0x1.452f68cp-1 0x1.ffffffa6a1d85p-1 -0x1.ffffffb7993fcp-1 0x1.81d8p-15 F +CSV proj4-epsg.csv:03692 0 OK -0x1.0ee29a493de04p23 -0x1.2d3630ea25d04p24 0x1.452f68cp-1 0x1.fffffffd54441p-1 -0x1.fffffffe59995p-1 0x1.81d2p-15 F +CSV proj4-epsg.csv:03693 0 OK -0x1.c89029c1f9e28p22 -0x1.2de7580b57a02p24 0x1.452f68cp-1 0x1.ffffffffda4c6p-1 -0x1.ffffffffddc7p-1 0x1.81dep-15 F +CSV proj4-epsg.csv:03694 0 OK -0x1.80e7cbd84cff8p22 -0x1.2e5bf676f6219p24 0x1.452f68cp-1 0x1.fffffffffcfd1p-1 -0x1.ffffffffeec15p-1 0x1.81ep-15 F +CSV proj4-epsg.csv:03695 0 OK -0x1.4270bde71b175p22 -0x1.2ead51d6b2737p24 0x1.452f68cp-1 0x1.ffffffffffaccp-1 -0x1.ffffffffefeep-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03696 0 OK -0x1.0a82678a577b7p22 -0x1.2ee821f873d6cp24 0x1.452f68cp-1 0x1.fffffffffff44p-1 -0x1.fffffffff0023p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03697 0 OK -0x1.aeb493a4bebccp21 -0x1.2f137c7f50967p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0153p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03698 0 OK -0x1.4f752b0a7707fp21 -0x1.2f339c08fac47p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0095p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03699 0 OK -0x1.eada3aa6cdf04p20 -0x1.2f4b24f86d36ep24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff007p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03700 0 OK -0x1.3e5336cedbbb5p20 -0x1.2f5bc800874a1p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0187p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03701 0 OK -0x1.2de65a486eac8p19 -0x1.2f6698c7ceb3cp24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00d4p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03702 0 OK 0x1.aab93fd2da63p15 -0x1.2f6c3da492991p24 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0093p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03703 0 OK 0x1.60d2597774112p19 -0x1.2dad12f59c8dp23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0038p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03704 0 OK 0x1.5416e36c223dp20 -0x1.2da50f8b6fe1p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.ffffffffeff61p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03705 0 OK 0x1.fa379045c2be7p20 -0x1.2d92fc6dda216p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00a3p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03706 0 OK 0x1.52640e3138f0fp21 -0x1.2d75c8b930746p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00cp-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03707 0 OK 0x1.ab054d7b2fc78p21 -0x1.2d4b9df73054cp23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0089p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03708 0 OK 0x1.042c897a90ab4p22 -0x1.2d1191da388c6p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0075p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03709 0 OK 0x1.3608b6037e289p22 -0x1.2cc318734118ap23 0x1.452f68cp-1 0x1.0000000000087p0 -0x1.fffffffff00d9p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03710 0 OK 0x1.6c359e70d9569p22 -0x1.2c58fe190af5cp23 0x1.452f68cp-1 0x1.000000000016cp0 -0x1.ffffffffeff7ap-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03711 0 OK 0x1.a841b5a505698p22 -0x1.2bc7681ce3076p23 0x1.452f68cp-1 0x1.0000000000b45p0 -0x1.ffffffffef7ccp-1 0x1.81dep-15 F +CSV proj4-epsg.csv:03712 0 OK 0x1.ec7970e20d519p22 -0x1.2af99aae6b3aap23 0x1.452f68cp-1 0x1.0000000007e4fp0 -0x1.ffffffffe8cdfp-1 0x1.81dap-15 F +CSV proj4-epsg.csv:03713 0 OK 0x1.1e426e01fd2fdp23 -0x1.29c7f01fb11eap23 0x1.452f68cp-1 0x1.000000007b44fp0 -0x1.ffffffff684a1p-1 0x1.81d8p-15 F +CSV proj4-epsg.csv:03714 0 OK 0x1.4f699decf4f3p23 -0x1.27dbb4ef0d37ap23 0x1.452f68cp-1 0x1.0000000cb3833p0 -0x1.ffffffedb100dp-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03715 0 OK 0x1.904f84114b82fp23 -0x1.2447f5d88e334p23 0x1.452f68cp-1 0x1.00000311abad7p0 -0x1.fffff91c22d07p-1 0x1.81fap-15 F +CSV proj4-epsg.csv:03716 0 OK 0x1.f3423f187ed2p23 -0x1.1af26809175e6p23 0x1.452f68cp-1 0x1.00020c44a97fep0 -0x1.ffeba4b790ff3p-1 0x1.e7fcp-15 F +CSV proj4-epsg.csv:03717 0 OK 0x1.2b8b6baa82fa1p23 0x1.a40b212cb8cbep21 0x1.452f68cp-1 -0x1.1380d65ec3f79p4 -0x1.6173393902a1bp4 -0x1.95e18fb8p0 F +CSV proj4-epsg.csv:03718 0 OK 0x1.abd16f7d90dcfp23 0x1.226786f51aafdp23 0x1.452f68cp-1 0x1.ffffe01b02937p-1 -0x1.ffffd22f5cb81p-1 0x1.82c2p-15 T +CSV proj4-epsg.csv:03719 0 OK 0x1.62c9108a02f2cp23 0x1.270e67d084897p23 0x1.452f68cp-1 0x1.ffffffa6a1d85p-1 -0x1.ffffffb799449p-1 0x1.81d8p-15 T +CSV proj4-epsg.csv:03720 0 OK 0x1.2d671a493de01p23 0x1.295f39f90ee2ap23 0x1.452f68cp-1 0x1.fffffffd544b4p-1 -0x1.fffffffe599bp-1 0x1.81d2p-15 T +CSV proj4-epsg.csv:03721 0 OK 0x1.02cc94e0fcf12p23 0x1.2ac1883b72828p23 0x1.452f68cp-1 0x1.ffffffffda451p-1 -0x1.ffffffffddc5dp-1 0x1.81dep-15 T +CSV proj4-epsg.csv:03722 0 OK 0x1.bdf0cbd84cffp22 0x1.2baac512af855p23 0x1.452f68cp-1 0x1.fffffffffcf26p-1 -0x1.ffffffffeebf5p-1 0x1.81ep-15 T +CSV proj4-epsg.csv:03723 0 OK 0x1.7f79bde71b171p22 0x1.2c4d7bd228293p23 0x1.452f68cp-1 0x1.ffffffffffa93p-1 -0x1.ffffffffefec4p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03724 0 OK 0x1.478b678a577b3p22 0x1.2cc31c15aaefcp23 0x1.452f68cp-1 0x1.fffffffffff7dp-1 -0x1.fffffffff0045p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03725 0 OK 0x1.146349d25f5ep22 0x1.2d19d123646f3p23 0x1.452f68cp-1 0x1.fffffffffffb7p-1 -0x1.fffffffff0053p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03726 0 OK 0x1.c9872b0a7707cp21 0x1.2d5a1036b8cb2p23 0x1.452f68cp-1 0x1.0000000000006p0 -0x1.fffffffff0048p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03727 0 OK 0x1.6f7f1d5366f76p21 0x1.2d8922159dbp23 0x1.452f68cp-1 0x1.fffffffffffb7p-1 -0x1.fffffffff0056p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03728 0 OK 0x1.193b9b676ddd8p21 0x1.2daa6825d1d65p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00bep-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03729 0 OK 0x1.8b172d243755fp20 0x1.2dc009b460a9cp23 0x1.452f68cp-1 0x1.0000000000006p0 -0x1.fffffffff0085p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03730 0 OK 0x1.cd9c6c02d257ap19 0x1.2dcb536de8745p23 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff008ap-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03731 0 OK 0x1.0eeb4d1117dep18 0x1.2dcceb1a5fcf3p23 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff00a9p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03732 0 OK -0x1.7fcb8db088f38p18 0x1.2dc4e7b033232p23 0x1.452f68cp-1 0x1.fffffffffffe2p-1 -0x1.fffffffff00bep-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03733 0 OK -0x1.06139045c2bd9p20 0x1.2db2d4929d639p23 0x1.452f68cp-1 0x1.ffffffffffffep-1 -0x1.fffffffff007ep-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03734 0 OK -0x1.b0a41c6271e1ep20 0x1.2d95a0ddf3b69p23 0x1.452f68cp-1 0x1.fffffffffffd3p-1 -0x1.fffffffff00cep-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03735 0 OK -0x1.30f34d7b2fc78p21 0x1.2d6b761bf397p23 0x1.452f68cp-1 0x1.fffffffffffd3p-1 -0x1.fffffffff0075p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03736 0 OK -0x1.8e4712f521572p21 0x1.2d3169fefbce9p23 0x1.452f68cp-1 0x1.ffffffffffffp-1 -0x1.fffffffff00cp-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03737 0 OK -0x1.f1ff6c06fc50cp21 0x1.2ce2f098045afp23 0x1.452f68cp-1 0x1.0000000000031p0 -0x1.fffffffff009p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03738 0 OK -0x1.2f2c9e70d9569p22 0x1.2c78d63dce38p23 0x1.452f68cp-1 0x1.0000000000133p0 -0x1.ffffffffeff63p-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03739 0 OK -0x1.6b38b5a505694p22 0x1.2be74041a6499p23 0x1.452f68cp-1 0x1.0000000000b62p0 -0x1.ffffffffef76cp-1 0x1.81dep-15 T +CSV proj4-epsg.csv:03740 0 OK -0x1.af7070e20d51cp22 0x1.2b1972d32e7cep23 0x1.452f68cp-1 0x1.0000000007e34p0 -0x1.ffffffffe8c86p-1 0x1.81dap-15 T +CSV proj4-epsg.csv:03741 0 OK -0x1.ff7bdc03fa5f6p22 0x1.29e7c8447460cp23 0x1.452f68cp-1 0x1.000000007b417p0 -0x1.ffffffff68502p-1 0x1.81d8p-15 T +CSV proj4-epsg.csv:03742 0 OK -0x1.30e51decf4f34p23 0x1.27fb8d13d079dp23 0x1.452f68cp-1 0x1.0000000cb37fap0 -0x1.ffffffedb103fp-1 0x1.81dcp-15 T +CSV proj4-epsg.csv:03743 0 OK -0x1.71cb04114b82fp23 0x1.2467cdfd51757p23 0x1.452f68cp-1 0x1.00000311abad7p0 -0x1.fffff91c22ceep-1 0x1.81fap-15 T +CSV proj4-epsg.csv:03744 0 OK -0x1.d4bdbf187ed1ap23 0x1.1b12402ddaa07p23 0x1.452f68cp-1 0x1.00020c44a97fep0 -0x1.ffeba4b79102ep-1 0x1.e7fcp-15 T +CSV proj4-epsg.csv:03745 0 OK -0x1.0d06ebaa82e77p23 -0x1.a38bc099abd84p21 0x1.452f68cp-1 -0x1.1380d65ec4181p4 -0x1.6173393902bc1p4 -0x1.95e18fb8p0 T +CSV proj4-epsg.csv:03746 0 OK -0x1.8d4cef7d90dc9p23 -0x1.2247aed0576dap23 0x1.452f68cp-1 0x1.ffffe01b02937p-1 -0x1.ffffd22f5cb7ap-1 0x1.82c2p-15 F +CSV proj4-epsg.csv:03747 0 OK -0x1.4444908a02f35p23 -0x1.26ee8fabc1474p23 0x1.452f68cp-1 0x1.ffffffa6a1d85p-1 -0x1.ffffffb7993fcp-1 0x1.81d8p-15 F +CSV proj4-epsg.csv:03748 0 OK -0x1.0ee29a493de04p23 -0x1.293f61d44ba08p23 0x1.452f68cp-1 0x1.fffffffd54441p-1 -0x1.fffffffe59995p-1 0x1.81d2p-15 F +CSV proj4-epsg.csv:03749 0 OK -0x1.c89029c1f9e28p22 -0x1.2aa1b016af404p23 0x1.452f68cp-1 0x1.ffffffffda4c6p-1 -0x1.ffffffffddc7p-1 0x1.81dep-15 F +CSV proj4-epsg.csv:03750 0 OK -0x1.80e7cbd84cff8p22 -0x1.2b8aecedec432p23 0x1.452f68cp-1 0x1.fffffffffcfd1p-1 -0x1.ffffffffeec15p-1 0x1.81ep-15 F +CSV proj4-epsg.csv:03751 0 OK -0x1.4270bde71b175p22 -0x1.2c2da3ad64e6ep23 0x1.452f68cp-1 0x1.ffffffffffaccp-1 -0x1.ffffffffefeep-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03752 0 OK -0x1.0a82678a577b7p22 -0x1.2ca343f0e7ad8p23 0x1.452f68cp-1 0x1.fffffffffff44p-1 -0x1.fffffffff0023p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03753 0 OK -0x1.aeb493a4bebccp21 -0x1.2cf9f8fea12cep23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0153p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03754 0 OK -0x1.4f752b0a7707fp21 -0x1.2d3a3811f588ep23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0095p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03755 0 OK -0x1.eada3aa6cdf04p20 -0x1.2d6949f0da6dcp23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff007p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03756 0 OK -0x1.3e5336cedbbb5p20 -0x1.2d8a90010e942p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0187p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03757 0 OK -0x1.2de65a486eac8p19 -0x1.2da0318f9d678p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff00d4p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03758 0 OK 0x1.aab93fd2da63p15 -0x1.2dab7b4925322p23 0x1.452f68cp-1 0x1.0000000000015p0 -0x1.fffffffff0093p-1 0x1.81dcp-15 F +CSV proj4-epsg.csv:03759 0 OK 0x1.60d35ace0c71fp19 -0x1.2f6d0c134ea54p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd95p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03760 0 OK 0x1.5417655c9a232p20 -0x1.2f690a608cc3ap24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd896p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03761 0 OK 0x1.fa3814fc36a02p20 -0x1.2f6000db8af87p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd921p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03762 0 OK 0x1.526452c4d2857p21 -0x1.2f51671301f1dp24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd87bp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03763 0 OK 0x1.ab0595406d5dep21 -0x1.2f3c51cce0185p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd82p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03764 0 OK 0x1.042caf8f093e3p22 -0x1.2f1f4be40fa29p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd84ep-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03765 0 OK 0x1.3608df0f1fcbbp22 -0x1.2ef80f63be003p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd83p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03766 0 OK 0x1.6c35cb7f28fc2p22 -0x1.2ec3027b7b0a4p24 0x1.1d3cd39dp2 0x1.0000000000143p0 -0x1.ffffffffdd747p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03767 0 OK 0x1.a841e835521bbp22 -0x1.2e7a37da94597p24 0x1.1d3cd39dp2 0x1.0000000000b1cp0 -0x1.ffffffffdcf89p-1 0x1.a081p-14 F +CSV proj4-epsg.csv:03768 0 OK 0x1.ec79ab3ebf305p22 -0x1.2e1351a3e036fp24 0x1.1d3cd39dp2 0x1.0000000007db3p0 -0x1.ffffffffd6514p-1 0x1.a083p-14 F +CSV proj4-epsg.csv:03769 0 OK 0x1.1e4290feb10dfp23 -0x1.2d7a7d13bc5c9p24 0x1.1d3cd39dp2 0x1.000000007b426p0 -0x1.ffffffff55ca2p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03770 0 OK 0x1.4f69ca4ce24cdp23 -0x1.2c84608db25f6p24 0x1.1d3cd39dp2 0x1.0000000cb3af2p0 -0x1.ffffffed9e59p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03771 0 OK 0x1.904fc20673413p23 -0x1.2aba82b5c7b89p24 0x1.1d3cd39dp2 0x1.00000311bbc0fp0 -0x1.fffff91bfabd6p-1 0x1.a08ap-14 F +CSV proj4-epsg.csv:03772 0 OK 0x1.f342ab6b9c2b5p23 -0x1.260fbde992142p24 0x1.1d3cd39dp2 0x1.00020c6026c1cp0 -0x1.ffeba434a20f6p-1 0x1.b607p-14 F +CSV proj4-epsg.csv:03773 0 OK 0x1.2b76d84764c5ap23 -0x1.9035c5d5e9a4ep22 0x1.1d3cd39dp2 -0x1.13b6b169c3cc8p4 -0x1.6185a2d5faf7fp4 -0x1.4d7886cp-1 F +CSV proj4-epsg.csv:03774 0 OK 0x1.abd12b3af7c85p23 -0x1.d8ab9a7c7c0d9p18 0x1.1d3cd39dp2 0x1.ffffe01b3e73dp-1 -0x1.ffffd2304fd41p-1 0x1.a0b3p-14 T +CSV proj4-epsg.csv:03775 0 OK 0x1.62c8e1339accep23 -0x1.43d0c5db5afb3p18 0x1.1d3cd39dp2 0x1.ffffffa6a29b7p-1 -0x1.ffffffb78813cp-1 0x1.a084p-14 T +CSV proj4-epsg.csv:03776 0 OK 0x1.2d66f595b9a86p23 -0x1.f36e2939a590ap17 0x1.1d3cd39dp2 0x1.fffffffd545b6p-1 -0x1.fffffffe471e8p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03777 0 OK 0x1.02cc769787e51p23 -0x1.9adb40bdbb48bp17 0x1.1d3cd39dp2 0x1.ffffffffda4e2p-1 -0x1.ffffffffcb429p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03778 0 OK 0x1.bdf097c208b97p22 -0x1.608c764f29e9ep17 0x1.1d3cd39dp2 0x1.fffffffffce9ap-1 -0x1.ffffffffdc3e7p-1 0x1.a083p-14 T +CSV proj4-epsg.csv:03779 0 OK 0x1.7f798fc1130a7p22 -0x1.37df0fee89e42p17 0x1.1d3cd39dp2 0x1.ffffffffffb22p-1 -0x1.ffffffffdd685p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03780 0 OK 0x1.478b3db13fb58p22 -0x1.1a773391b3497p17 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd83cp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03781 0 OK 0x1.146323258a066p22 -0x1.04ca16a4ffbbp17 0x1.1d3cd39dp2 0x1.0000000000041p0 -0x1.ffffffffdd86dp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03782 0 OK 0x1.c986e26481daep21 -0x1.e974dcc0fc432p16 0x1.1d3cd39dp2 0x1.0000000000007p0 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03783 0 OK 0x1.6f7ed81e63715p21 -0x1.d1ec179053bddp16 0x1.1d3cd39dp2 0x1.0000000000025p0 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03784 0 OK 0x1.193b589f609bp21 -0x1.c1492e0994ea2p16 0x1.1d3cd39dp2 0x1.0000000000016p0 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03785 0 OK 0x1.8b16aab5fb574p20 -0x1.b6787bb495171p16 0x1.1d3cd39dp2 0x1.ffffffffffff4p-1 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03786 0 OK 0x1.cd9b6a59ece57p19 -0x1.b0d3ab8c0331ap16 0x1.1d3cd39dp2 0x1.ffffffffffff9p-1 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03787 0 OK 0x1.0ee94a63e71dap18 -0x1.b007da4fb99c7p16 0x1.1d3cd39dp2 0x1.0000000000005p0 -0x1.ffffffffdd874p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03788 0 OK -0x1.7fcd9572688aap18 -0x1.b4098d119b41ep16 0x1.1d3cd39dp2 0x1.ffffffffffff4p-1 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03789 0 OK -0x1.061414fc369edp20 -0x1.bd131213666efp16 0x1.1d3cd39dp2 0x1.0000000000016p0 -0x1.ffffffffdd874p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03790 0 OK -0x1.b0a4a589a50a6p20 -0x1.cbacda9c6d159p16 0x1.1d3cd39dp2 0x1.ffffffffffff4p-1 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03791 0 OK -0x1.30f395406d5dbp21 -0x1.e0c220be46a03p16 0x1.1d3cd39dp2 0x1.0000000000007p0 -0x1.ffffffffdd877p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03792 0 OK -0x1.8e475f1e127c7p21 -0x1.fdc8098ebc55ep16 0x1.1d3cd39dp2 0x1.0000000000041p0 -0x1.ffffffffdd87p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03793 0 OK -0x1.f1ffbe1e3f96cp21 -0x1.128244f02f5e5p17 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd85bp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03794 0 OK -0x1.2f2ccb7f28fc1p22 -0x1.2d08b911aa55fp17 0x1.1d3cd39dp2 0x1.0000000000127p0 -0x1.ffffffffdd789p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03795 0 OK -0x1.6b38e835521b5p22 -0x1.516e098502bf1p17 0x1.1d3cd39dp2 0x1.0000000000b3ap0 -0x1.ffffffffdcf58p-1 0x1.a081p-14 T +CSV proj4-epsg.csv:03796 0 OK -0x1.af70ab3ebf308p22 -0x1.84e124df13f65p17 0x1.1d3cd39dp2 0x1.0000000007e26p0 -0x1.ffffffffd648fp-1 0x1.a083p-14 T +CSV proj4-epsg.csv:03797 0 OK -0x1.ff7c21fd621b8p22 -0x1.d14b6cf101304p17 0x1.1d3cd39dp2 0x1.000000007b45fp0 -0x1.ffffffff55cfdp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03798 0 OK -0x1.30e54a4ce24d2p23 -0x1.262cd7faffe6cp18 0x1.1d3cd39dp2 0x1.0000000cb3abap0 -0x1.ffffffed9e5fbp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03799 0 OK -0x1.71cb420673416p23 -0x1.98a44df5a9945p18 0x1.1d3cd39dp2 0x1.00000311bbbd6p0 -0x1.fffff91bfab95p-1 0x1.a08ap-14 T +CSV proj4-epsg.csv:03800 0 OK -0x1.d4be2b6b9c2bp23 -0x1.61aac0818959p19 0x1.1d3cd39dp2 0x1.00020c6026c1cp0 -0x1.ffeba434a212bp-1 0x1.b607p-14 T +CSV proj4-epsg.csv:03801 0 OK -0x1.0cf2584764a1bp23 -0x1.9a1f44f047fbdp23 0x1.1d3cd39dp2 -0x1.13b6b169c417bp4 -0x1.6185a2d5fb24p4 -0x1.4d7886a8p-1 T +CSV proj4-epsg.csv:03802 0 OK -0x1.8d4cab3af7c7fp23 -0x1.29ba6583ac6ebp24 0x1.1d3cd39dp2 0x1.ffffe01b3e6cbp-1 -0x1.ffffd2304fd41p-1 0x1.a0b3p-14 F +CSV proj4-epsg.csv:03803 0 OK -0x1.444461339acd8p23 -0x1.2c0dd0d630f2fp24 0x1.1d3cd39dp2 0x1.ffffffa6a29b7p-1 -0x1.ffffffb788163p-1 0x1.a084p-14 F +CSV proj4-epsg.csv:03804 0 OK -0x1.0ee27595b9a86p23 -0x1.2d36379b2b13cp24 0x1.1d3cd39dp2 0x1.fffffffd545b6p-1 -0x1.fffffffe471bbp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03805 0 OK -0x1.c88fed2f0fca2p22 -0x1.2de75d6c22e85p24 0x1.1d3cd39dp2 0x1.ffffffffda472p-1 -0x1.ffffffffcb476p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03806 0 OK -0x1.80e797c208b9ep22 -0x1.2e5bfb01000b1p24 0x1.1d3cd39dp2 0x1.fffffffffce9ap-1 -0x1.ffffffffdc3f9p-1 0x1.a083p-14 F +CSV proj4-epsg.csv:03807 0 OK -0x1.42708fc1130a7p22 -0x1.2ead55cdc14b1p24 0x1.1d3cd39dp2 0x1.ffffffffffa76p-1 -0x1.ffffffffdd692p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03808 0 OK -0x1.0a823db13fb5bp22 -0x1.2ee825867af85p24 0x1.1d3cd39dp2 0x1.ffffffffffefp-1 -0x1.ffffffffdd7bdp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03809 0 OK -0x1.aeb4464b140d2p21 -0x1.2f137fc0545f7p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8ecp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03810 0 OK -0x1.4f74e26481daep21 -0x1.2f339f10dd62ap24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8dcp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03811 0 OK -0x1.ead9b03cc6e34p20 -0x1.2f4b27d60e0b3p24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd774p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03812 0 OK -0x1.3e52b13ec135fp20 -0x1.2f5bcabf94cap24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8cdp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03813 0 OK -0x1.2de5556bf6ae8p19 -0x1.2f669b71e9c9dp24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd7cfp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03814 0 OK 0x1.aac95a61318e8p15 -0x1.2f6c4042125bbp24 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8ap-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03815 0 OK 0x1.60d35ace0c71fp19 -0x1.2dad18269d4a8p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd95p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03816 0 OK 0x1.5417655c9a232p20 -0x1.2da514c119874p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd896p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03817 0 OK 0x1.fa3814fc36a02p20 -0x1.2d9301b715f0ep23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd921p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03818 0 OK 0x1.526452c4d2857p21 -0x1.2d75ce2603e3ap23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd87bp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03819 0 OK 0x1.ab0595406d5dep21 -0x1.2d4ba399c030ap23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd82p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03820 0 OK 0x1.042caf8f093e3p22 -0x1.2d1197c81f452p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd84ep-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03821 0 OK 0x1.3608df0f1fcbbp22 -0x1.2cc31ec77c006p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd83p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03822 0 OK 0x1.6c35cb7f28fc2p22 -0x1.2c5904f6f6148p23 0x1.1d3cd39dp2 0x1.0000000000143p0 -0x1.ffffffffdd747p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03823 0 OK 0x1.a841e835521bbp22 -0x1.2bc76fb528b2ep23 0x1.1d3cd39dp2 0x1.0000000000b1cp0 -0x1.ffffffffdcf89p-1 0x1.a081p-14 F +CSV proj4-epsg.csv:03824 0 OK 0x1.ec79ab3ebf305p22 -0x1.2af9a347c06dep23 0x1.1d3cd39dp2 0x1.0000000007db3p0 -0x1.ffffffffd6514p-1 0x1.a083p-14 F +CSV proj4-epsg.csv:03825 0 OK 0x1.1e4290feb10dfp23 -0x1.29c7fa2778b92p23 0x1.1d3cd39dp2 0x1.000000007b426p0 -0x1.ffffffff55ca2p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03826 0 OK 0x1.4f69ca4ce24cdp23 -0x1.27dbc11b64becp23 0x1.1d3cd39dp2 0x1.0000000cb3af2p0 -0x1.ffffffed9e59p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03827 0 OK 0x1.904fc20673413p23 -0x1.2448056b8f712p23 0x1.1d3cd39dp2 0x1.00000311bbc0fp0 -0x1.fffff91bfabd6p-1 0x1.a08ap-14 F +CSV proj4-epsg.csv:03828 0 OK 0x1.f342ab6b9c2b5p23 -0x1.1af27bd324284p23 0x1.1d3cd39dp2 0x1.00020c6026c1cp0 -0x1.ffeba434a20f6p-1 0x1.b607p-14 F +CSV proj4-epsg.csv:03829 0 OK 0x1.2b76d84764c5ap23 0x1.a44874542cb64p21 0x1.1d3cd39dp2 -0x1.13b6b169c3cc8p4 -0x1.6185a2d5faf7fp4 -0x1.4d7886cp-1 F +CSV proj4-epsg.csv:03830 0 OK 0x1.abd12b3af7c85p23 0x1.2267a32c1c1f9p23 0x1.1d3cd39dp2 0x1.ffffe01b3e73dp-1 -0x1.ffffd2304fd48p-1 0x1.a0b3p-14 T +CSV proj4-epsg.csv:03831 0 OK 0x1.62c8e1339accep23 0x1.270e79d125282p23 0x1.1d3cd39dp2 0x1.ffffffa6a29b7p-1 -0x1.ffffffb78815p-1 0x1.a084p-14 T +CSV proj4-epsg.csv:03832 0 OK 0x1.2d66f595b9a86p23 0x1.295f475b1969cp23 0x1.1d3cd39dp2 0x1.fffffffd545b6p-1 -0x1.fffffffe471ddp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03833 0 OK 0x1.02cc769787e51p23 0x1.2ac192fd0912ep23 0x1.1d3cd39dp2 0x1.ffffffffda4e2p-1 -0x1.ffffffffcb419p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03834 0 OK 0x1.bdf097c208b97p22 0x1.2baace26c3586p23 0x1.1d3cd39dp2 0x1.fffffffffce5fp-1 -0x1.ffffffffdc3b7p-1 0x1.a083p-14 T +CSV proj4-epsg.csv:03835 0 OK 0x1.7f798fc1130a7p22 0x1.2c4d83c045d87p23 0x1.1d3cd39dp2 0x1.ffffffffffb22p-1 -0x1.ffffffffdd682p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03836 0 OK 0x1.478b3db13fb58p22 0x1.2cc32331b932ep23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd813p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03837 0 OK 0x1.146323258a066p22 0x1.2d19d7a56c011p23 0x1.1d3cd39dp2 0x1.0000000000041p0 -0x1.ffffffffdd88dp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03838 0 OK 0x1.c986e26481daep21 0x1.2d5a16467e078p23 0x1.1d3cd39dp2 0x1.0000000000007p0 -0x1.ffffffffdd843p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03839 0 OK 0x1.6f7ed81e63715p21 0x1.2d8927d0df588p23 0x1.1d3cd39dp2 0x1.0000000000025p0 -0x1.ffffffffdd89dp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03840 0 OK 0x1.193b589f609bp21 0x1.2daa6da3ecd63p23 0x1.1d3cd39dp2 0x1.0000000000016p0 -0x1.ffffffffdd85p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03841 0 OK 0x1.8b16aab5fb574p20 0x1.2dc00f0896d5dp23 0x1.1d3cd39dp2 0x1.ffffffffffff4p-1 -0x1.ffffffffdd889p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03842 0 OK 0x1.cd9b6a59ece57p19 0x1.2dcb58a8e7f9ap23 0x1.1d3cd39dp2 0x1.ffffffffffff9p-1 -0x1.ffffffffdd859p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03843 0 OK 0x1.0ee94a63e71dap18 0x1.2dccf04b608ccp23 0x1.1d3cd39dp2 0x1.0000000000005p0 -0x1.ffffffffdd8b6p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03844 0 OK -0x1.7fcd9572688aap18 0x1.2dc4ece5dcc98p23 0x1.1d3cd39dp2 0x1.ffffffffffff4p-1 -0x1.ffffffffdd855p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03845 0 OK -0x1.061414fc369edp20 0x1.2db2d9dbd9332p23 0x1.1d3cd39dp2 0x1.0000000000016p0 -0x1.ffffffffdd889p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03846 0 OK -0x1.b0a4a589a50a6p20 0x1.2d95a64ac725dp23 0x1.1d3cd39dp2 0x1.ffffffffffff4p-1 -0x1.ffffffffdd8ap-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03847 0 OK -0x1.30f395406d5dbp21 0x1.2d6b7bbe8372cp23 0x1.1d3cd39dp2 0x1.0000000000007p0 -0x1.ffffffffdd874p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03848 0 OK -0x1.8e475f1e127c7p21 0x1.2d316fece2875p23 0x1.1d3cd39dp2 0x1.0000000000041p0 -0x1.ffffffffdd892p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03849 0 OK -0x1.f1ffbe1e3f96cp21 0x1.2ce2f6ec3f428p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd88dp-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03850 0 OK -0x1.2f2ccb7f28fc1p22 0x1.2c78dd1bb956bp23 0x1.1d3cd39dp2 0x1.0000000000127p0 -0x1.ffffffffdd757p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03851 0 OK -0x1.6b38e835521b5p22 0x1.2be747d9ebf5p23 0x1.1d3cd39dp2 0x1.0000000000b3ap0 -0x1.ffffffffdcf6ep-1 0x1.a081p-14 T +CSV proj4-epsg.csv:03852 0 OK -0x1.af70ab3ebf308p22 0x1.2b197b6c83b02p23 0x1.1d3cd39dp2 0x1.0000000007e26p0 -0x1.ffffffffd64b3p-1 0x1.a083p-14 T +CSV proj4-epsg.csv:03853 0 OK -0x1.ff7c21fd621b8p22 0x1.29e7d24c3bfb4p23 0x1.1d3cd39dp2 0x1.000000007b45fp0 -0x1.ffffffff55cf8p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03854 0 OK -0x1.30e54a4ce24d2p23 0x1.27fb99402800dp23 0x1.1d3cd39dp2 0x1.0000000cb3abap0 -0x1.ffffffed9e5e8p-1 0x1.a082p-14 T +CSV proj4-epsg.csv:03855 0 OK -0x1.71cb420673416p23 0x1.2467dd9052b36p23 0x1.1d3cd39dp2 0x1.00000311bbbd6p0 -0x1.fffff91bfab8ep-1 0x1.a08ap-14 T +CSV proj4-epsg.csv:03856 0 OK -0x1.d4be2b6b9c2bp23 0x1.1b1253f7e76a7p23 0x1.1d3cd39dp2 0x1.00020c6026c1cp0 -0x1.ffeba434a212bp-1 0x1.b607p-14 T +CSV proj4-epsg.csv:03857 0 OK -0x1.0cf2584764a1bp23 -0x1.a3c913c11fef4p21 0x1.1d3cd39dp2 -0x1.13b6b169c417bp4 -0x1.6185a2d5fb24p4 -0x1.4d7886a8p-1 T +CSV proj4-epsg.csv:03858 0 OK -0x1.8d4cab3af7c7fp23 -0x1.2247cb0758dd6p23 0x1.1d3cd39dp2 0x1.ffffe01b3e6cbp-1 -0x1.ffffd2304fd41p-1 0x1.a0b3p-14 F +CSV proj4-epsg.csv:03859 0 OK -0x1.444461339acd8p23 -0x1.26eea1ac61e5ep23 0x1.1d3cd39dp2 0x1.ffffffa6a29b7p-1 -0x1.ffffffb788163p-1 0x1.a084p-14 F +CSV proj4-epsg.csv:03860 0 OK -0x1.0ee27595b9a86p23 -0x1.293f6f3656278p23 0x1.1d3cd39dp2 0x1.fffffffd545b6p-1 -0x1.fffffffe471bbp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03861 0 OK -0x1.c88fed2f0fca2p22 -0x1.2aa1bad845d0ap23 0x1.1d3cd39dp2 0x1.ffffffffda472p-1 -0x1.ffffffffcb476p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03862 0 OK -0x1.80e797c208b9ep22 -0x1.2b8af60200162p23 0x1.1d3cd39dp2 0x1.fffffffffce9ap-1 -0x1.ffffffffdc3f9p-1 0x1.a083p-14 F +CSV proj4-epsg.csv:03863 0 OK -0x1.42708fc1130a7p22 -0x1.2c2dab9b82962p23 0x1.1d3cd39dp2 0x1.ffffffffffa76p-1 -0x1.ffffffffdd692p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03864 0 OK -0x1.0a823db13fb5bp22 -0x1.2ca34b0cf5f0ap23 0x1.1d3cd39dp2 0x1.ffffffffffefp-1 -0x1.ffffffffdd7bdp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03865 0 OK -0x1.aeb4464b140d2p21 -0x1.2cf9ff80a8beep23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8ecp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03866 0 OK -0x1.4f74e26481daep21 -0x1.2d3a3e21bac54p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8dcp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03867 0 OK -0x1.ead9b03cc6e34p20 -0x1.2d694fac1c166p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd774p-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03868 0 OK -0x1.3e52b13ec135fp20 -0x1.2d8a957f2994p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8cdp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03869 0 OK -0x1.2de5556bf6ae8p19 -0x1.2da036e3d393ap23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd7cfp-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03870 0 OK 0x1.aac95a61318e8p15 -0x1.2dab808424b76p23 0x1.1d3cd39dp2 0x1.fffffffffffd7p-1 -0x1.ffffffffdd8ap-1 0x1.a082p-14 F +CSV proj4-epsg.csv:03871 0 OK 0x1.60d037913c2p19 -0x1.2f6d13e9dc53dp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe7p-1 0x0.0p0 F +CSV proj4-epsg.csv:03872 0 OK 0x1.5415d36ebfc26p20 -0x1.2f6912478a184p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000ep0 0x0.0p0 F +CSV proj4-epsg.csv:03873 0 OK 0x1.fa367e1f8fc34p20 -0x1.2f6008d96b719p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffd3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03874 0 OK 0x1.52638256de9aep21 -0x1.2f516f2fa276p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000021p0 0x0.0p0 F +CSV proj4-epsg.csv:03875 0 OK 0x1.ab04bce56d7f1p21 -0x1.2f3c5a12389d2p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffcap-1 0x0.0p0 F +CSV proj4-epsg.csv:03876 0 OK 0x1.042c3da2c6de2p22 -0x1.2f1f545f48e3dp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffb9p-1 0x0.0p0 F +CSV proj4-epsg.csv:03877 0 OK 0x1.3608651bbe902p22 -0x1.2ef81826fb83ep24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000006bp0 0x0.0p0 F +CSV proj4-epsg.csv:03878 0 OK 0x1.6c3546709a9f9p22 -0x1.2ec30ba0fe1dfp24 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffe3dp-1 0x0.0p0 F +CSV proj4-epsg.csv:03879 0 OK 0x1.a84153a7df944p22 -0x1.2e7a418aa7c8dp24 0x0.0p0 0x1.0000000000afep0 -0x1.ffffffffff674p-1 0x0.0p0 F +CSV proj4-epsg.csv:03880 0 OK 0x1.ec7900843bebfp22 -0x1.2e135c2120077p24 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8c7p-1 0x0.0p0 F +CSV proj4-epsg.csv:03881 0 OK 0x1.1e422b0528d3p23 -0x1.2d7a88d803d4ep24 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff78484p-1 0x0.0p0 F +CSV proj4-epsg.csv:03882 0 OK 0x1.4f69497560584p23 -0x1.2c846e9c31624p24 0x0.0p0 0x1.0000000cb37b3p0 -0x1.ffffffedc14fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03883 0 OK 0x1.904f0f5a05294p23 -0x1.2aba95d84f80bp24 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f73ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03884 0 OK 0x1.f3417b315e5edp23 -0x1.260fe4612fa03p24 0x0.0p0 0x1.00020c662957bp0 -0x1.ffeba58184ef2p-1 0x0.0p0 F +CSV proj4-epsg.csv:03885 0 OK 0x1.2bbb6329697bep23 -0x1.905511edfe213p22 0x0.0p0 -0x1.1345c830eae38p4 -0x1.611ff61fe8c5ep4 0x0.0p0 F +CSV proj4-epsg.csv:03886 0 OK 0x1.abd2139d90ab2p23 -0x1.d8abd2214c5a3p18 0x0.0p0 0x1.ffffe018e869bp-1 -0x1.ffffd22d1a66p-1 0x0.0p0 T +CSV proj4-epsg.csv:03887 0 OK 0x1.62c980c1ff3c8p23 -0x1.43d05a3c488d3p18 0x0.0p0 0x1.ffffffa69d877p-1 -0x1.ffffffb7a6913p-1 0x0.0p0 T +CSV proj4-epsg.csv:03888 0 OK 0x1.2d6770bde4d6dp23 -0x1.f36d18a44cb97p17 0x0.0p0 0x1.fffffffd542cbp-1 -0x1.fffffffe6984fp-1 0x0.0p0 T +CSV proj4-epsg.csv:03889 0 OK 0x1.02ccdbdd8a582p23 -0x1.9ada2b5302754p17 0x0.0p0 0x1.ffffffffda4a7p-1 -0x1.ffffffffedbabp-1 0x0.0p0 T +CSV proj4-epsg.csv:03890 0 OK 0x1.bdf145424c521p22 -0x1.608b68d2c3a55p17 0x0.0p0 0x1.fffffffffcf09p-1 -0x1.fffffffffeb6bp-1 0x0.0p0 T +CSV proj4-epsg.csv:03891 0 OK 0x1.7f7a28c7a7f9dp22 -0x1.37de0cbd9642cp17 0x0.0p0 0x1.ffffffffffb59p-1 -0x1.ffffffffffe0dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03892 0 OK 0x1.478bc7b83b7cfp22 -0x1.1a7639dfe710bp17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffc5p-1 0x0.0p0 T +CSV proj4-epsg.csv:03893 0 OK 0x1.1463a1ed92962p22 -0x1.04c924a8a8e4p17 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff9p-1 0x0.0p0 T +CSV proj4-epsg.csv:03894 0 OK 0x1.c987cee80412p21 -0x1.e97304113a6bfp16 0x0.0p0 0x1.fffffffffffb7p-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:03895 0 OK 0x1.6f7fb7bbb3bd7p21 -0x1.d1ea45ec4b4efp16 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:03896 0 OK 0x1.193c2ea7d5ce4p21 -0x1.c1475f309e538p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03897 0 OK 0x1.8b18492d65869p20 -0x1.b676ab54cb3c9p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.0000000000001p0 0x0.0p0 T +CSV proj4-epsg.csv:03898 0 OK 0x1.cd9e95e3248fep19 -0x1.b0d1d521c0606p16 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:03899 0 OK 0x1.0eef90dd87c24p18 -0x1.b005f8f752143p16 0x0.0p0 0x1.0000000000001p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03900 0 OK -0x1.7fc74dbaff08p18 -0x1.b4079b498da1fp16 0x0.0p0 0x1.fffffffffffe2p-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03901 0 OK -0x1.06127e1f8fc1cp20 -0x1.bd11096834577p16 0x0.0p0 0x1.0000000000006p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03902 0 OK -0x1.b0a304adbd352p20 -0x1.cbaab3312fec8p16 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:03903 0 OK -0x1.30f2bce56d7edp21 -0x1.e0bfd09b08c98p16 0x0.0p0 0x1.ffffffffffffp-1 -0x1.ffffffffffffdp-1 0x0.0p0 T +CSV proj4-epsg.csv:03904 0 OK -0x1.8e467b458dbc3p21 -0x1.fdc5838ac21eap16 0x0.0p0 0x1.0000000000023p0 -0x1.ffffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:03905 0 OK -0x1.f1feca377d1f6p21 -0x1.1280ddec11006p17 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffe2p-1 0x0.0p0 T +CSV proj4-epsg.csv:03906 0 OK -0x1.2f2c46709a9f5p22 -0x1.2d0720eac3ffep17 0x0.0p0 0x1.0000000000141p0 -0x1.fffffffffff12p-1 0x0.0p0 T +CSV proj4-epsg.csv:03907 0 OK -0x1.6b3853a7df93cp22 -0x1.516c2c15ee8f6p17 0x0.0p0 0x1.0000000000b54p0 -0x1.ffffffffff6e3p-1 0x0.0p0 T +CSV proj4-epsg.csv:03908 0 OK -0x1.af7000843bebfp22 -0x1.84dee0d9cf3e1p17 0x0.0p0 0x1.0000000007e41p0 -0x1.fffffffff8c1cp-1 0x0.0p0 T +CSV proj4-epsg.csv:03909 0 OK -0x1.ff7b560a51a58p22 -0x1.d1488567e8847p17 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff784a6p-1 0x0.0p0 T +CSV proj4-epsg.csv:03910 0 OK -0x1.30e4c9756058ap23 -0x1.262ad1a890e8p18 0x0.0p0 0x1.0000000cb3779p0 -0x1.ffffffedc14d5p-1 0x0.0p0 T +CSV proj4-epsg.csv:03911 0 OK -0x1.71ca8f5a05294p23 -0x1.98a102a109502p18 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f737p-1 0x0.0p0 T +CSV proj4-epsg.csv:03912 0 OK -0x1.d4bcfb315e5edp23 -0x1.61a6b03480b7ep19 0x0.0p0 0x1.00020c6629542p0 -0x1.ffeba58184f1fp-1 0x0.0p0 T +CSV proj4-epsg.csv:03913 0 OK -0x1.0d36e329696acp23 -0x1.9a0faacea83e4p23 0x0.0p0 -0x1.1345c830eafdfp4 -0x1.611ff61fe8e03p4 0x0.0p0 T +CSV proj4-epsg.csv:03914 0 OK -0x1.8d4d939d90aa7p23 -0x1.29ba6a9a4e748p24 0x0.0p0 0x1.ffffe018e8629p-1 -0x1.ffffd22d1a692p-1 0x0.0p0 F +CSV proj4-epsg.csv:03915 0 OK -0x1.444500c1ff3cep23 -0x1.2c0dd879e283cp24 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a68c4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03916 0 OK -0x1.0ee2f0bde4d6dp23 -0x1.2d363fb18b0c8p24 0x0.0p0 0x1.fffffffd541e6p-1 -0x1.fffffffe697fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03917 0 OK -0x1.c890b7bb14b01p22 -0x1.2de7658c2da1p24 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbbdp-1 0x0.0p0 F +CSV proj4-epsg.csv:03918 0 OK -0x1.80e845424c527p22 -0x1.2e5c03112e1eap24 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb55p-1 0x0.0p0 F +CSV proj4-epsg.csv:03919 0 OK -0x1.427128c7a7f98p22 -0x1.2ead5dc958797p24 0x0.0p0 0x1.ffffffffffa3bp-1 -0x1.ffffffffffd52p-1 0x0.0p0 F +CSV proj4-epsg.csv:03920 0 OK -0x1.0a82c7b83b7d2p22 -0x1.2ee82d6f13d7dp24 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffffebp-1 0x0.0p0 F +CSV proj4-epsg.csv:03921 0 OK -0x1.aeb543db252cep21 -0x1.2f13879982542p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000002dp0 0x0.0p0 F +CSV proj4-epsg.csv:03922 0 OK -0x1.4f75cee80411ep21 -0x1.2f33a6dec26b8p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000001p0 0x0.0p0 F +CSV proj4-epsg.csv:03923 0 OK -0x1.eadb6f77677bap20 -0x1.2f4b2f9ce75a9p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000057p0 0x0.0p0 F +CSV proj4-epsg.csv:03924 0 OK -0x1.3e545d4fab9c5p20 -0x1.2f5bd283a307ap24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffcp-1 0x0.0p0 F +CSV proj4-epsg.csv:03925 0 OK -0x1.2de8925acb0dp19 -0x1.2f66a3377edabp24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000cp0 0x0.0p0 F +CSV proj4-epsg.csv:03926 0 OK 0x1.aa96a1cdb6edp15 -0x1.2f6c480db1e59p24 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000019p0 0x0.0p0 F +CSV proj4-epsg.csv:03927 0 OK 0x1.0f88c5e7111fcp21 -0x1.4b4f5ff5930c4p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffe27cfp-1 0x0.0p0 F +CSV proj4-epsg.csv:03928 0 OK 0x1.b2d77da4a0c31p16 -0x1.b2d77da4a0c31p16 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03929 0 OK 0x1.b2d77da4a0c31p16 -0x1.b2d77da4a0c31p16 0x0.0p0 0x1.0p0 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:03930 0 OK 0x1.c320dd12c27c9p25 -0x1.eec42d8a8e61fp20 0x0.0p0 0x1.7400000000001p6 -0x1.e8ee26de93d47p8 0x0.0p0 T +CSV proj4-epsg.csv:03931 0 OK 0x1.7f9534d1cb897p25 -0x1.7b23478be9e86p20 0x0.0p0 -0x1.58057e07c8f32p7 -0x1.644082394fcd8p6 0x0.0p0 T +CSV proj4-epsg.csv:03932 0 OK 0x1.60d037913c2p19 -0x1.2dad27d3b8a7ap23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffe7p-1 0x0.0p0 F +CSV proj4-epsg.csv:03933 0 OK 0x1.5415d36ebfc26p20 -0x1.2da5248f14308p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000ep0 0x0.0p0 F +CSV proj4-epsg.csv:03934 0 OK 0x1.fa367e1f8fc34p20 -0x1.2d9311b2d6e32p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffd3p-1 0x0.0p0 F +CSV proj4-epsg.csv:03935 0 OK 0x1.52638256de9aep21 -0x1.2d75de5f44ecp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000021p0 0x0.0p0 F +CSV proj4-epsg.csv:03936 0 OK 0x1.ab04bce56d7f1p21 -0x1.2d4bb424713a4p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffcap-1 0x0.0p0 F +CSV proj4-epsg.csv:03937 0 OK 0x1.042c3da2c6de2p22 -0x1.2d11a8be91c7ap23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffb9p-1 0x0.0p0 F +CSV proj4-epsg.csv:03938 0 OK 0x1.3608651bbe902p22 -0x1.2cc3304df707cp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000006bp0 0x0.0p0 F +CSV proj4-epsg.csv:03939 0 OK 0x1.6c3546709a9f9p22 -0x1.2c591741fc3bep23 0x0.0p0 0x1.0000000000125p0 -0x1.ffffffffffe3dp-1 0x0.0p0 F +CSV proj4-epsg.csv:03940 0 OK 0x1.a84153a7df944p22 -0x1.2bc783154f91ap23 0x0.0p0 0x1.0000000000afep0 -0x1.ffffffffff674p-1 0x0.0p0 F +CSV proj4-epsg.csv:03941 0 OK 0x1.ec7900843bebfp22 -0x1.2af9b842400eep23 0x0.0p0 0x1.0000000007e08p0 -0x1.fffffffff8c7p-1 0x0.0p0 F +CSV proj4-epsg.csv:03942 0 OK 0x1.1e422b0528d3p23 -0x1.29c811b007a9cp23 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff78484p-1 0x0.0p0 F +CSV proj4-epsg.csv:03943 0 OK 0x1.4f69497560584p23 -0x1.27dbdd3862c48p23 0x0.0p0 0x1.0000000cb37b3p0 -0x1.ffffffedc14fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03944 0 OK 0x1.904f0f5a05294p23 -0x1.24482bb09f016p23 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f73ep-1 0x0.0p0 F +CSV proj4-epsg.csv:03945 0 OK 0x1.f3417b315e5edp23 -0x1.1af2c8c25f406p23 0x0.0p0 0x1.00020c662957bp0 -0x1.ffeba58184ef2p-1 0x0.0p0 F +CSV proj4-epsg.csv:03946 0 OK 0x1.2bbb6329697bep23 0x1.a409dc2403bdap21 0x0.0p0 -0x1.1345c830eae38p4 -0x1.611ff61fe8c5ep4 0x0.0p0 F +CSV proj4-epsg.csv:03947 0 OK 0x1.abd2139d90ab2p23 0x1.2267a16ef59d3p23 0x0.0p0 0x1.ffffe018e869bp-1 -0x1.ffffd22d1a65dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03948 0 OK 0x1.62c980c1ff3c8p23 0x1.270e7d2e1dbb9p23 0x0.0p0 0x1.ffffffa69d877p-1 -0x1.ffffffb7a6927p-1 0x0.0p0 T +CSV proj4-epsg.csv:03949 0 OK 0x1.2d6770bde4d6dp23 0x1.295f4b9d6ecd2p23 0x0.0p0 0x1.fffffffd542cbp-1 -0x1.fffffffe69836p-1 0x0.0p0 T +CSV proj4-epsg.csv:03950 0 OK 0x1.02ccdbdd8a582p23 0x1.2ac19752b3f63p23 0x0.0p0 0x1.ffffffffda4a7p-1 -0x1.ffffffffedb92p-1 0x0.0p0 T +CSV proj4-epsg.csv:03951 0 OK 0x1.bdf145424c521p22 0x1.2baad25cb4f17p23 0x0.0p0 0x1.fffffffffcf09p-1 -0x1.fffffffffeb4cp-1 0x0.0p0 T +CSV proj4-epsg.csv:03952 0 OK 0x1.7f7a28c7a7f9dp22 0x1.2c4d87cd09a6fp23 0x0.0p0 0x1.ffffffffffb59p-1 -0x1.ffffffffffe2dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03953 0 OK 0x1.478bc7b83b7cfp22 0x1.2cc327188063cp23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffbp-1 0x0.0p0 T +CSV proj4-epsg.csv:03954 0 OK 0x1.1463a1ed92962p22 0x1.2d19db6d5d5c7p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.ffffffffffff9p-1 0x0.0p0 T +CSV proj4-epsg.csv:03955 0 OK 0x1.c987cee80412p21 0x1.2d5a19f7dd8b3p23 0x0.0p0 0x1.fffffffffffb7p-1 -0x1.fffffffffffcp-1 0x0.0p0 T +CSV proj4-epsg.csv:03956 0 OK 0x1.6f7fb7bbb3bd7p21 0x1.2d892b7427696p23 0x0.0p0 0x1.0000000000006p0 -0x1.000000000000ap0 0x0.0p0 T +CSV proj4-epsg.csv:03957 0 OK 0x1.193c2ea7d5ce4p21 0x1.2daa71419ec36p23 0x0.0p0 0x1.ffffffffffffp-1 -0x1.fffffffffffbcp-1 0x0.0p0 T +CSV proj4-epsg.csv:03958 0 OK 0x1.8b18492d65869p20 0x1.2dc012a956698p23 0x0.0p0 0x1.ffffffffffffp-1 -0x1.000000000002p0 0x0.0p0 T +CSV proj4-epsg.csv:03959 0 OK 0x1.cd9e95e3248fep19 0x1.2dcb5c55bc7f4p23 0x0.0p0 0x1.ffffffffffffep-1 -0x1.ffffffffffff7p-1 0x0.0p0 T +CSV proj4-epsg.csv:03960 0 OK 0x1.0eef90dd87c24p18 0x1.2dccf40e115bdp23 0x0.0p0 0x1.0000000000001p0 -0x1.0000000000024p0 0x0.0p0 T +CSV proj4-epsg.csv:03961 0 OK -0x1.7fc74dbaff08p18 0x1.2dc4f0c96ce4cp23 0x0.0p0 0x1.fffffffffffe2p-1 -0x1.fffffffffffdcp-1 0x0.0p0 T +CSV proj4-epsg.csv:03962 0 OK -0x1.06127e1f8fc1cp20 0x1.2db2dded2f975p23 0x0.0p0 0x1.0000000000006p0 -0x1.0000000000005p0 0x0.0p0 T +CSV proj4-epsg.csv:03963 0 OK -0x1.b0a304adbd352p20 0x1.2d95aa999da02p23 0x0.0p0 0x1.0000000000023p0 -0x1.000000000001fp0 0x0.0p0 T +CSV proj4-epsg.csv:03964 0 OK -0x1.30f2bce56d7edp21 0x1.2d6b805ec9ee7p23 0x0.0p0 0x1.ffffffffffffp-1 -0x1.fffffffffffe2p-1 0x0.0p0 T +CSV proj4-epsg.csv:03965 0 OK -0x1.8e467b458dbc3p21 0x1.2d3174f8ea7bcp23 0x0.0p0 0x1.0000000000023p0 -0x1.0000000000008p0 0x0.0p0 T +CSV proj4-epsg.csv:03966 0 OK -0x1.f1feca377d1f6p21 0x1.2ce2fc884fbcp23 0x0.0p0 0x1.0000000000023p0 -0x1.fffffffffffd7p-1 0x0.0p0 T +CSV proj4-epsg.csv:03967 0 OK -0x1.2f2c46709a9f5p22 0x1.2c78e37c54fp23 0x0.0p0 0x1.0000000000141p0 -0x1.fffffffffff16p-1 0x0.0p0 T +CSV proj4-epsg.csv:03968 0 OK -0x1.6b3853a7df93cp22 0x1.2be74f4fa845cp23 0x0.0p0 0x1.0000000000b54p0 -0x1.ffffffffff6f3p-1 0x0.0p0 T +CSV proj4-epsg.csv:03969 0 OK -0x1.af7000843bebfp22 0x1.2b19847c98c3p23 0x0.0p0 0x1.0000000007e41p0 -0x1.fffffffff8c45p-1 0x0.0p0 T +CSV proj4-epsg.csv:03970 0 OK -0x1.ff7b560a51a58p22 0x1.29e7ddea605dfp23 0x0.0p0 0x1.000000007b407p0 -0x1.ffffffff7849dp-1 0x0.0p0 T +CSV proj4-epsg.csv:03971 0 OK -0x1.30e4c9756058ap23 0x1.27fba972bb78cp23 0x0.0p0 0x1.0000000cb3779p0 -0x1.ffffffedc14d5p-1 0x0.0p0 T +CSV proj4-epsg.csv:03972 0 OK -0x1.71ca8f5a05294p23 0x1.2467f7eaf7b58p23 0x0.0p0 0x1.00000311a8bc8p0 -0x1.fffff91c5f736p-1 0x0.0p0 T +CSV proj4-epsg.csv:03973 0 OK -0x1.d4bcfb315e5edp23 0x1.1b1294fcb7f48p23 0x0.0p0 0x1.00020c6629542p0 -0x1.ffeba58184f22p-1 0x0.0p0 T +CSV proj4-epsg.csv:03974 0 OK -0x1.0d36e329696acp23 -0x1.a38aab3aa0f9p21 0x0.0p0 -0x1.1345c830eafdfp4 -0x1.611ff61fe8e03p4 0x0.0p0 T +CSV proj4-epsg.csv:03975 0 OK -0x1.8d4d939d90aa7p23 -0x1.2247d5349ce9p23 0x0.0p0 0x1.ffffe018e8629p-1 -0x1.ffffd22d1a692p-1 0x0.0p0 F +CSV proj4-epsg.csv:03976 0 OK -0x1.444500c1ff3cep23 -0x1.26eeb0f3c5078p23 0x0.0p0 0x1.ffffffa69d792p-1 -0x1.ffffffb7a68c4p-1 0x0.0p0 F +CSV proj4-epsg.csv:03977 0 OK -0x1.0ee2f0bde4d6dp23 -0x1.293f7f631619p23 0x0.0p0 0x1.fffffffd541e6p-1 -0x1.fffffffe697fp-1 0x0.0p0 F +CSV proj4-epsg.csv:03978 0 OK -0x1.c890b7bb14b01p22 -0x1.2aa1cb185b42p23 0x0.0p0 0x1.ffffffffda435p-1 -0x1.ffffffffedbbdp-1 0x0.0p0 F +CSV proj4-epsg.csv:03979 0 OK -0x1.80e845424c527p22 -0x1.2b8b06225c3d4p23 0x0.0p0 0x1.fffffffffcf42p-1 -0x1.fffffffffeb55p-1 0x0.0p0 F +CSV proj4-epsg.csv:03980 0 OK -0x1.427128c7a7f98p22 -0x1.2c2dbb92b0f2ep23 0x0.0p0 0x1.ffffffffffa3bp-1 -0x1.ffffffffffd52p-1 0x0.0p0 F +CSV proj4-epsg.csv:03981 0 OK -0x1.0a82c7b83b7d2p22 -0x1.2ca35ade27afap23 0x0.0p0 0x1.ffffffffffeb5p-1 -0x1.ffffffffffebp-1 0x0.0p0 F +CSV proj4-epsg.csv:03982 0 OK -0x1.aeb543db252cep21 -0x1.2cfa0f3304a84p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000002dp0 0x0.0p0 F +CSV proj4-epsg.csv:03983 0 OK -0x1.4f75cee80411ep21 -0x1.2d3a4dbd84d7p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000001p0 0x0.0p0 F +CSV proj4-epsg.csv:03984 0 OK -0x1.eadb6f77677bap20 -0x1.2d695f39ceb52p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000057p0 0x0.0p0 F +CSV proj4-epsg.csv:03985 0 OK -0x1.3e545d4fab9c5p20 -0x1.2d8aa507460f4p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.fffffffffffcp-1 0x0.0p0 F +CSV proj4-epsg.csv:03986 0 OK -0x1.2de8925acb0dp19 -0x1.2da0466efdb56p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.000000000000cp0 0x0.0p0 F +CSV proj4-epsg.csv:03987 0 OK 0x1.aa96a1cdb6edp15 -0x1.2dab901b63cb2p23 0x0.0p0 0x1.fffffffffff9ap-1 -0x1.0000000000019p0 0x0.0p0 F +CSV proj4-epsg.csv:03988 0 OK 0x1.0e99c65d108c2p21 0x1.b802534ecd258p23 0x0.0p0 0x1.0000000000005p0 -0x1.ffffffffe2841p-1 0x0.0p0 T +CSV proj4-epsg.csv:03989 0 OK -0x1.bf287a2f79416p21 0x1.2d0d4a73cf30fp23 0x0.0p0 0x1.01ce659a5b0edp0 -0x1.00068a3e095e6p0 0x0.0p0 T +CSV proj4-epsg.csv:03990 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03991 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03992 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03993 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03994 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03995 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03996 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:03997 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03998 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:03999 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04000 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04001 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04002 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04003 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04004 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04005 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04006 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04007 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04008 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04009 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04010 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04011 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04012 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04013 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04014 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04015 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04016 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04017 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04018 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04019 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04020 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04021 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04022 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04023 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04024 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04025 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04026 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04027 0 OK 0x1.85300f07b068ap22 0x1.b2c56122e9782p16 -0x1.afe9fa32a19adp16 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:04028 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04029 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04030 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04031 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04032 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04033 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04034 0 OK 0x1.85300f07b068ap22 0x1.b2c56122e9782p16 -0x1.afe9fa32a19adp16 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:04035 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04036 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04037 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04038 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04039 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04040 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04041 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04042 0 OK 0x1.852c43374177ap22 0x1.b2c1237fcfde8p16 -0x1.afe8e53f1c125p16 0x1.0p0 -0x1.ffffffffffffep-1 -0x1.0p-30 T +CSV proj4-epsg.csv:04043 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04044 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04045 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04046 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04047 0 OK 0x1.85300f07b068ap22 0x1.b2c56122e9782p16 -0x1.afe9fa32a19adp16 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:04048 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04049 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04050 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04051 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04052 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04053 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04054 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04055 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04056 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04057 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04058 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04059 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04060 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04061 0 OK 0x1.852c1f39e0f4fp22 0x1.b2c0fb4b53747p16 -0x1.afe8c24f6ec2fp16 0x1.0p0 -0x1.ffffffffffffdp-1 0x1.0p-29 T +CSV proj4-epsg.csv:04062 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04063 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04064 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04065 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04066 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04067 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04068 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04069 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04070 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04071 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04072 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04073 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04074 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04075 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04076 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04077 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04078 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04079 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04080 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04081 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04082 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04083 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04084 0 OK 0x1.85300f07b068ap22 0x1.b2c56122e9782p16 -0x1.afe9fa32a19adp16 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:04085 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04086 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04087 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04088 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04089 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04090 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04091 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04092 0 OK 0x1.852c1b3a2435fp22 0x1.b2c0f6d3af30fp16 -0x1.afe8bf4076a5bp16 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:04093 0 OK 0x1.852c1b3a2435fp22 0x1.b2c0f6d3af30fp16 -0x1.afe8bf4076a5bp16 0x1.ffffffffffffep-1 -0x1.0p0 0x0.0p0 T +CSV proj4-epsg.csv:04094 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04095 0 OK 0x1.852dd3170e779p22 0x1.b2c2e2355adfbp16 -0x1.afeac0f4b13dfp16 0x1.ffffffffffffep-1 -0x1.0000000000001p0 -0x1.0p-29 T +CSV proj4-epsg.csv:04096 0 OK 0x1.852dd3170e779p22 0x1.b2c2e2355adfbp16 -0x1.afeac0f4b13dfp16 0x1.ffffffffffffep-1 -0x1.0000000000001p0 -0x1.0p-29 T +CSV proj4-epsg.csv:04097 0 OK 0x1.852d390777e05p22 0x1.b2c2361a70325p16 -0x1.afe1b5fd53ee4p16 0x1.0p0 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:04098 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04099 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04100 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04101 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04102 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04103 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04104 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04105 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04106 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04107 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04108 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04109 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04110 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04111 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04112 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04113 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04114 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04115 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04116 0 OK 0x1.852dd3170e779p22 0x1.b2c2e2355adfbp16 -0x1.afeac0f4b13dfp16 0x1.ffffffffffffep-1 -0x1.0000000000001p0 -0x1.0p-29 T +CSV proj4-epsg.csv:04117 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04118 0 OK 0x1.852094aa64586p22 0x1.b2b416aeefa8bp16 -0x1.afde2cfc17e1bp16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x0.0p0 T +CSV proj4-epsg.csv:04119 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04120 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04121 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04122 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04123 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04124 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04125 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04126 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04127 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04128 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04129 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04130 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04131 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04132 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04133 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04134 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04135 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04136 0 OK 0x1.852c233994e4p22 0x1.b2c0ffc2eddfcp16 -0x1.afe8c65ae71dep16 0x1.ffffffffffffep-1 -0x1.ffffffffffffep-1 0x1.0p-30 T +CSV proj4-epsg.csv:04137 0 OK 0x1.852c233994e62p22 0x1.b2c0ffc2ede22p16 -0x1.afe8c65aa9f24p16 0x1.ffffffffffffep-1 -0x1.ffffffffffffdp-1 0x1.0p-30 T +CSV proj4-epsg.csv:04138 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04139 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04140 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04141 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04142 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04143 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04144 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04145 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04146 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04147 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04148 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04149 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04150 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04151 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04152 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04153 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04154 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04155 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04156 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04157 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04158 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04159 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04160 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04161 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04162 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04163 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04164 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04165 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04166 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04167 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04168 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04169 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04170 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04171 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04172 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04173 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04174 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04175 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04176 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04177 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04178 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04179 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04180 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04181 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04182 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04183 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04184 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04185 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04186 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04187 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04188 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04189 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04190 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04191 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04192 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04193 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04194 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04195 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04196 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04197 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04198 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04199 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04200 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04201 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04202 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04203 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04204 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04205 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04206 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04207 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04208 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04209 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04210 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04211 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04212 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04213 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04214 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04215 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04216 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04217 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04218 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04219 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04220 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04221 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04222 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04223 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04224 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04225 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04226 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04227 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04228 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04229 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04230 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04231 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04232 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04233 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04234 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04235 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04236 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04237 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04238 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04239 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04240 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04241 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04242 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04243 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04244 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04245 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04246 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04247 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04248 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04249 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04250 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04251 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04252 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04253 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04254 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04255 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04256 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04257 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04258 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04259 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04260 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04261 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04262 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04263 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04264 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04265 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04266 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04267 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04268 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04269 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04270 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04271 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04272 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04273 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04274 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04275 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04276 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04277 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04278 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04279 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04280 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +CSV proj4-epsg.csv:04281 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +PAIR t00/epsg:3821>epsg:2012 0 OK 0x1.3e2acdc2438dfp23 0x0.0p0 0x0.0p0 -0x1.0b437b325cafp3 0x0.0p0 0x0.0p0 T +PAIR t00/epsg:3821>epsg:2012 1 OK 0x1.16888476dd81ep23 -0x1.1bc35a91b5b3dp20 0x0.0p0 -0x1.28804867e4e9cp3 -0x1.d2e7fb596e9adp2 0x0.0p0 F +PAIR t00/epsg:3821>epsg:2012 2 OK 0x1.6455d9c2c6101p23 -0x1.8844fb65d78f2p20 0x0.0p0 -0x1.3289dac8e8662p5 -0x1.471d04bf3cf17p5 0x0.0p0 F +PAIR t00/epsg:3821>epsg:2012 3 OK 0x1.16888476dd81ep23 0x1.1bc35a91b5b3dp20 0x0.0p0 -0x1.28804867e4e9cp3 0x1.d2e7fb596e9adp2 0x0.0p0 F +PAIR t00/epsg:3821>epsg:2012 4 OK 0x1.6455d9c2c6101p23 0x1.8844fb65d78f2p20 0x0.0p0 -0x1.3289dac8e8662p5 0x1.471d04bf3cf17p5 0x0.0p0 F +PAIR t00/epsg:4007>epsg:2025 0 OK 0x1.39f4e15d852fcp24 0x0.0p0 0x0.0p0 0x1.5bfffffffffffp6 0x0.0p0 0x0.0p0 F +PAIR t00/epsg:4007>epsg:2025 1 OK 0x1.0b0499d01b581p24 -0x1.729133d3cdf04p21 0x0.0p0 0x1.5bfffffffffffp6 -0x1.15744dadaf863p12 0x0.0p0 F +PAIR t00/epsg:4007>epsg:2025 2 OK 0x1.6282b3b5517p24 -0x1.2982652f0cap22 0x0.0p0 0x1.5bfffffffffffp6 -0x1.49a51ea4d2b0bp18 0x0.0p0 F +PAIR t00/epsg:4007>epsg:2025 3 OK 0x1.0b0499d01b581p24 0x1.729133d3cdf04p21 0x0.0p0 0x1.5bfffffffffffp6 0x1.15744dadaf863p12 0x0.0p0 F +PAIR t00/epsg:4007>epsg:2025 4 OK 0x1.6282b3b5517p24 0x1.2982652f0cap22 0x0.0p0 0x1.5bfffffffffffp6 0x1.49a51ea4d2b0bp18 0x0.0p0 F +PAIR t00/epsg:4014>epsg:2081 0 OK 0x1.8d57cb37b6b0fp23 0x1.313ee09915443p23 0x0.0p0 -0x1.691cfce176a4dp3 0x0.0p0 0x0.0p0 T +PAIR t00/epsg:4014>epsg:2081 1 OK 0x1.63f2f4dddbce4p23 0x1.0c2e08dc59d5p23 0x0.0p0 -0x1.5ea59d1af0e0dp3 -0x1.0e64614599c9ap3 0x0.0p0 F +PAIR t00/epsg:4014>epsg:2081 2 OK 0x1.b50a32d9ae292p23 0x1.fae2700eb5a3ep22 0x0.0p0 -0x1.cefeb38bc7486p5 -0x1.df1432ed26dp5 0x0.0p0 F +PAIR t00/epsg:4014>epsg:2081 3 OK 0x1.63f2f4dddbce4p23 0x1.564fb855d0b37p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t00/epsg:4014>epsg:2081 4 OK 0x1.b50a32d9ae292p23 0x1.650c892acfb67p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t00/epsg:4024>epsg:2163 0 OK 0x1.211d9ad7d9359p23 0x1.206151047c23bp20 0x0.0p0 0x0.0p0 -0x1.ca5dc1a63c1f8p-51 0x0.0p0 T +PAIR t00/epsg:4024>epsg:2163 1 OK 0x1.23627757725d5p23 -0x1.1a09d5c73b547p11 0x0.0p0 -0x1.3ffffffffffebp2 -0x1.4000000000004p2 0x0.0p0 F +PAIR t00/epsg:4024>epsg:2163 2 OK 0x1.3049860eae0cfp23 0x1.3150d846f05fcp20 0x0.0p0 0x1.3ffffffffffebp2 -0x1.3ffffffffffeap2 0x0.0p0 F +PAIR t00/epsg:4024>epsg:2163 3 OK 0x1.10d75ac9c8816p23 0x1.0e9470973f246p20 0x0.0p0 -0x1.3ffffffffffebp2 0x1.3fffffffffff8p2 0x0.0p0 F +PAIR t00/epsg:4024>epsg:2163 4 OK 0x1.1a27e07d094fcp23 0x1.1e1f690473747p21 0x0.0p0 0x1.3fffffffffffap2 0x1.4000000000003p2 0x0.0p0 F +PAIR t00/epsg:4034>epsg:2328 0 OK 0x1.cdd05c9ad21p15 0x0.0p0 0x0.0p0 0x1.06582720f2688p7 0x0.0p0 0x0.0p0 T +PAIR t00/epsg:4034>epsg:2328 1 OK -0x1.afc37a63ba1bp20 -0x1.52ba4e33a673ep21 0x0.0p0 -0x1.8cp6 -0x1.14110c215499fp11 0x0.0p0 F +PAIR t00/epsg:4034>epsg:2328 2 OK 0x1.f48559d548ec8p20 -0x1.beee270763b9ep20 0x0.0p0 0x1.b759b70a5455fp6 -0x1.9a4755cf38b02p6 0x0.0p0 F +PAIR t00/epsg:4034>epsg:2328 3 OK -0x1.afc37a63ba1bp20 0x1.52ba4e33a673ep21 0x0.0p0 -0x1.8cp6 0x1.14110c215499fp11 0x0.0p0 F +PAIR t00/epsg:4034>epsg:2328 4 OK 0x1.f48559d548ec8p20 0x1.beee270763b9ep20 0x0.0p0 0x1.b759b70a5455fp6 0x1.9a4755cf38b02p6 0x0.0p0 F +PAIR t00/epsg:4045>epsg:2341 0 OK -0x1.2db06c31492ecp24 0x0.0p0 0x0.0p0 -0x1.5bfffffffffffp6 0x0.0p0 0x0.0p0 F +PAIR t00/epsg:4045>epsg:2341 1 OK -0x1.563e6581fb657p24 -0x1.2981d9930abf5p22 0x0.0p0 -0x1.5bfffffffffffp6 -0x1.493b0816029b3p18 0x0.0p0 F +PAIR t00/epsg:4045>epsg:2341 2 OK -0x1.fd7ff35b80658p23 -0x1.7292106b25b69p21 0x0.0p0 -0x1.5bfffffffffffp6 -0x1.153e61074a572p12 0x0.0p0 F +PAIR t00/epsg:4045>epsg:2341 3 OK -0x1.563e6581fb657p24 0x1.2981d9930abf5p22 0x0.0p0 -0x1.5bfffffffffffp6 0x1.493b0816029b3p18 0x0.0p0 F +PAIR t00/epsg:4045>epsg:2341 4 OK -0x1.fd7ff35b80658p23 0x1.7292106b25b69p21 0x0.0p0 -0x1.5bfffffffffffp6 0x1.153e61074a572p12 0x0.0p0 F +PAIR t00/epsg:4128>epsg:2353 0 OK 0x1.7bd33992705bep23 0x0.0p0 0x0.0p0 -0x1.7400000000001p6 0x0.0p0 0x0.0p0 T +PAIR t00/epsg:4128>epsg:2353 1 OK 0x1.38c658cc9eae6p23 -0x1.bde865bcd25d8p21 0x0.0p0 -0x1.7400000000001p6 -0x1.3e017fe6bd64ap14 0x0.0p0 F +PAIR t00/epsg:4128>epsg:2353 2 OK 0x1.c6fa1b22489b7p23 -0x1.1cc71679b00e7p21 0x0.0p0 -0x1.7400000000001p6 -0x1.2c69f8f2fdd1fp9 0x0.0p0 F +PAIR t00/epsg:4128>epsg:2353 3 OK 0x1.38c658cc9eae6p23 0x1.bde865bcd25d8p21 0x0.0p0 -0x1.7400000000001p6 0x1.3e017fe6bd64ap14 0x0.0p0 F +PAIR t00/epsg:4128>epsg:2353 4 OK 0x1.c6fa1b22489b7p23 0x1.1cc71679b00e7p21 0x0.0p0 -0x1.7400000000001p6 0x1.2c69f8f2fdd1fp9 0x0.0p0 F +PAIR t00/epsg:4174>epsg:2366 0 OK -0x1.e95de0e935c6cp23 0x0.0p0 0x0.0p0 -0x1.bp5 0x0.0p0 0x0.0p0 F +PAIR t00/epsg:4174>epsg:2366 1 OK -0x1.6b10528f4328cp24 -0x1.85efbb3fee4cdp24 0x0.0p0 0x1.f8p6 -0x1.68p6 0x0.0p0 F +PAIR t00/epsg:4174>epsg:2366 2 OK -0x1.2ac942b793aa8p22 -0x1.d9482d48a50bcp23 0x0.0p0 0x1.f8p6 -0x1.68p6 0x0.0p0 F +PAIR t00/epsg:4174>epsg:2366 3 OK -0x1.6b10528f4328cp24 0x1.85efbb3fee4cdp24 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t00/epsg:4174>epsg:2366 4 OK -0x1.2ac942b793aa8p22 0x1.d9482d48a50bcp23 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:3821>epsg:2048 0 OK 0x1.0716806f5fc51p21 -0x0.0p0 0x0.0p0 0x1.0198cf49e3c4cp-15 0x0.0p0 0x0.0p0 T +PAIR t01/epsg:3821>epsg:2048 1 OK 0x1.4ebe965fa8c05p21 0x1.278efae277446p19 0x0.0p0 -0x1.3ffc46f91f652p2 -0x1.3ffffddffe52cp2 0x0.0p0 F +PAIR t01/epsg:3821>epsg:2048 2 OK 0x1.7ed7fdbbd42f7p20 0x1.163e067df2f88p19 0x0.0p0 0x1.400009b29b978p2 -0x1.3fffff8dcc613p2 0x0.0p0 F +PAIR t01/epsg:3821>epsg:2048 3 OK 0x1.4ebe965fa8c05p21 -0x1.278efae277446p19 0x0.0p0 -0x1.3ffc46f91f652p2 0x1.3ffffddffe52cp2 0x0.0p0 F +PAIR t01/epsg:3821>epsg:2048 4 OK 0x1.7ed7fdbbd42f7p20 -0x1.163e067df2f88p19 0x0.0p0 0x1.400009b29b978p2 0x1.3fffff8dcc613p2 0x0.0p0 F +PAIR t01/epsg:4007>epsg:2108 0 OK -0x1.3b6b5369b66afp28 0x1.3cd1a26edc71cp22 0x0.0p0 -0x1.a9c71c71c7209p1 0x0.0p0 0x0.0p0 F +PAIR t01/epsg:4007>epsg:2108 1 OK 0x1.3803d6e267ebcp28 -0x1.95c16145247bbp27 0x0.0p0 0x1.6158e38e38e38p7 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4007>epsg:2108 2 OK -0x1.f4954248f26c1p27 -0x1.314568a37bfa9p27 0x0.0p0 0x1.6158e38e38e38p7 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4007>epsg:2108 3 OK 0x1.3803d6e267ebcp28 0x1.a98e7b6c1242ep27 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4007>epsg:2108 4 OK -0x1.f4954248f26c1p27 0x1.451282ca69c1ap27 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4014>epsg:2121 0 OK -0x1.052690017a5fep28 0x1.52bfcf20be70cp22 0x0.0p0 -0x1.20a61d950c85cp3 0x0.0p0 0x0.0p0 F +PAIR t01/epsg:4014>epsg:2121 1 OK -0x1.20558915dcf9ep28 -0x1.6ec0a878d7a1fp27 0x0.0p0 0x1.55f59e26af37bp7 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4014>epsg:2121 2 OK -0x1.9e482a383037p27 -0x1.d91720810bc22p26 0x0.0p0 0x1.55f59e26af37bp7 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4014>epsg:2121 3 OK -0x1.20558915dcf9ep28 0x1.83eca56ae389p27 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4014>epsg:2121 4 OK -0x1.9e482a383037p27 0x1.01b78d3291c81p27 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4024>epsg:2134 0 OK -0x1.edcbb991ab04cp18 0x1.c9b399e2c8deep24 0x0.0p0 0x0.0p0 0x1.f6bf772c2aca1p-48 0x0.0p0 F +PAIR t01/epsg:4024>epsg:2134 1 OK 0x1.b74224c1e1208p15 -0x1.2024f3a583bb6p23 0x0.0p0 -0x1.3fffffffffffap2 -0x1.400000000000bp2 0x0.0p0 F +PAIR t01/epsg:4024>epsg:2134 2 OK -0x1.049ecd60e2a5p20 -0x1.1fab1b31e0658p23 0x0.0p0 0x1.3fffffffffffap2 -0x1.4000000000027p2 0x0.0p0 F +PAIR t01/epsg:4024>epsg:2134 3 OK 0x1.b74224c1e1208p15 0x1.c13f79d2c1ddbp24 0x0.0p0 -0x1.3fffffffffffap2 0x1.400000000000bp2 0x0.0p0 F +PAIR t01/epsg:4024>epsg:2134 4 OK -0x1.049ecd60e2a5p20 0x1.c1028d98f032cp24 0x0.0p0 0x1.3fffffffffffap2 0x1.4000000000027p2 0x0.0p0 F +PAIR t01/epsg:4034>epsg:2150 0 OK Infinity Infinity 0x0.0p0 0x1.8cp6 Infinity 0x0.0p0 T +PAIR t01/epsg:4034>epsg:2150 1 OK 0x1.9ef6fa061e9f9p23 -0x1.1942bfd0632f2p21 0x0.0p0 -0x1.3fffffa69c525p2 -0x1.40000333ac125p2 0x0.0p0 F +PAIR t01/epsg:4034>epsg:2150 2 OK Infinity Infinity 0x0.0p0 0x1.8cp6 Infinity 0x0.0p0 F +PAIR t01/epsg:4034>epsg:2150 3 OK 0x1.9ef6fa061e9f9p23 0x1.1942bfd0632f2p21 0x0.0p0 -0x1.3fffffa69c525p2 0x1.40000333ac125p2 0x0.0p0 F +PAIR t01/epsg:4034>epsg:2150 4 OK Infinity Infinity 0x0.0p0 0x1.8cp6 Infinity 0x0.0p0 F +PAIR t01/epsg:4045>epsg:2193 0 OK -0x1.1613244c0857ap28 0x1.312dp23 0x0.0p0 -0x1.bffffffffffep2 0x0.0p0 0x0.0p0 F +PAIR t01/epsg:4045>epsg:2193 1 OK -0x1.32b2ff5e85041p28 -0x1.86e37223c0c9cp27 0x0.0p0 0x1.5ap7 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4045>epsg:2193 2 OK -0x1.b8b3d870a05f7p27 -0x1.f4cf30c410efep26 0x0.0p0 0x1.5ap7 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4045>epsg:2193 3 OK -0x1.32b2ff5e85041p28 0x1.ad091223c0c9cp27 0x0.0p0 0x1.5ap7 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4045>epsg:2193 4 OK -0x1.b8b3d870a05f7p27 0x1.208d38620877fp27 0x0.0p0 0x1.5ap7 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4128>epsg:22174 0 OK 0x1.9ca12026a5493p23 0x1.313c5b755dd09p23 0x0.0p0 -0x1.b25834fb914ebp1 0x0.0p0 0x0.0p0 T +PAIR t01/epsg:4128>epsg:22174 1 OK 0x1.79966a6967a54p23 0x1.11d48d9d635cp23 0x0.0p0 -0x1.a5967bf31a9dbp2 -0x1.6b1fce115ce2ep2 0x0.0p0 F +PAIR t01/epsg:4128>epsg:22174 2 OK 0x1.bebe0d2ea77c2p23 0x1.073b6ec99ba3ep23 0x0.0p0 -0x1.39e9f7aa69e6bp3 -0x1.e8e133174f3a8p3 0x0.0p0 F +PAIR t01/epsg:4128>epsg:22174 3 OK 0x1.79966a6967a54p23 0x1.50a4294d58452p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4128>epsg:22174 4 OK 0x1.bebe0d2ea77c2p23 0x1.5b3d48211ffd3p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4174>epsg:2224 0 OK 0x1.e7e30fb672828p26 -0x1.577f5e01c0cfap23 0x0.0p0 0x1.09p6 0x0.0p0 0x0.0p0 F +PAIR t01/epsg:4174>epsg:2224 1 OK 0x1.918c4f2c10e49p26 -0x1.2693029f92392p25 0x0.0p0 -0x1.c7p6 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4174>epsg:2224 2 OK 0x1.14abdaf180ecp27 -0x1.b0559ba52c0e2p25 0x0.0p0 -0x1.c7p6 -0x1.68p6 0x0.0p0 F +PAIR t01/epsg:4174>epsg:2224 3 OK 0x1.918c4f2c10e49p26 0x1.eb4d4e7ac7456p23 0x0.0p0 0x1.09p6 0x1.3f3813586af8fp33 0x0.0p0 F +PAIR t01/epsg:4174>epsg:2224 4 OK 0x1.14abdaf180ecp27 0x1.0495eca44ba64p25 0x0.0p0 -0x1.c7p6 0x1.68p6 0x0.0p0 F +PAIR t02/epsg:3821>epsg:2006 0 OK 0x1.1870a3ceafdf3p23 -0x1.34ace6f3be737p9 0x1.dee7d53bap5 -0x1.6393f66e8bcap1 -0x1.0f7cb17abae6fp-10 -0x1.8227ec3fp2 T +PAIR t02/epsg:3821>epsg:2006 1 OK 0x1.ec9e0e9bb8c8bp22 -0x1.ea12004029675p19 0x1.89253eefep6 -0x1.91b5e13fc252ep2 -0x1.60ca6e2456a38p2 -0x1.64ad9f73p2 F +PAIR t02/epsg:3821>epsg:2006 2 OK 0x1.39bab7ab5e8f3p23 -0x1.455bd8264866dp20 0x1.303d78a16p6 -0x1.b0e269e54cc7cp2 -0x1.9a39c86576187p3 -0x1.325388b8p6 F +PAIR t02/epsg:3821>epsg:2006 3 OK 0x1.eca01f5c12dddp22 0x1.e98d9bfa9e37p19 0x1.757c9d5eep5 -0x1.91ac764b4a0b9p2 0x1.60c102e9e7031p2 -0x1.35ba0a6p-2 F +PAIR t02/epsg:3821>epsg:2006 4 OK 0x1.39bc7dcf3bc28p23 0x1.45048e1e83135p20 0x1.875963b1p4 -0x1.b044c93213234p2 0x1.99ec687af04f9p3 0x1.95e4d77cp1 F +PAIR t02/epsg:4007>epsg:20355 0 OK -0x1.9e7fcec00078bp21 -0x1.310c5eaf667eep23 0x1.0ba5ab0f5p8 0x1.98e5b7234e355p-47 0x1.e79fe6e14a158p-46 0x0.0p0 F +PAIR t02/epsg:4007>epsg:20355 1 OK -0x1.4dc402bbb6861p21 -0x1.1df1bd2d57ed6p23 0x1.113f9d85ep8 -0x1.4p2 -0x1.3fffffffffff9p2 0x1.0p-30 F +PAIR t02/epsg:4007>epsg:20355 2 OK -0x1.ef310741733p21 -0x1.1ba2ee95d5fa4p23 0x1.19955b5444p8 0x1.4000000000003p2 -0x1.3ffffffffffe3p2 -0x1.0p-29 F +PAIR t02/epsg:4007>epsg:20355 3 OK -0x1.4dc47f664eca1p21 0x1.c0272e4171696p24 0x1.ee8ed4faa8p7 -0x1.4p2 0x1.4000000000007p2 -0x1.0p-30 F +PAIR t02/epsg:4007>epsg:20355 4 OK -0x1.ef31d4a9379d2p21 0x1.beffeedd1a218p24 0x1.ff3a5511c8p7 0x1.4000000000003p2 0x1.4000000000001p2 -0x1.0p-30 F +PAIR t02/epsg:4014>epsg:2044 0 OK -0x1.4775380731046p23 0x1.8fa109f60d5cfp9 0x1.5b612f89cp4 -0x1.2c0091a9b4ea1p6 0x1.5bf17fe2971a8p5 0x1.ab78997b2p7 F +PAIR t02/epsg:4014>epsg:2044 1 EXC:java.lang.IllegalStateException -0x1.bf57f86f3b02ep23 -0x1.0f055850c9859p23 0x1.047d89cep2 NaN NaN NaN F +PAIR t02/epsg:4014>epsg:2044 2 EXC:java.lang.IllegalStateException -0x1.6480ccfbaac48p22 -0x1.482f33b2b883cp22 0x1.6e134e8c4p4 NaN NaN NaN F +PAIR t02/epsg:4014>epsg:2044 3 EXC:java.lang.IllegalStateException -0x1.bf54043ba77f2p23 0x1.0f1413f1b468cp23 0x1.de3743cfp3 NaN NaN NaN F +PAIR t02/epsg:4014>epsg:2044 4 EXC:java.lang.IllegalStateException -0x1.647c21ddf3c8p22 0x1.484130e17f8f8p22 0x1.0e07b613ap5 NaN NaN NaN F +PAIR t02/epsg:4024>epsg:2064 0 OK 0x1.6f87ae8c68983p20 0x1.237ee0a277d76p3 0x1.2ce25d808p4 -0x1.10055227a602ap-48 0x0.0p0 -0x1.0p-30 T +PAIR t02/epsg:4024>epsg:2064 1 OK 0x1.ccb4c4794f1a8p19 -0x1.0e837c93ff752p19 0x1.5800589e6p5 -0x1.3fffffffffffdp2 -0x1.4000000000003p2 -0x1.0p-29 F +PAIR t02/epsg:4024>epsg:2064 2 OK 0x1.f8b3dd969840ap20 -0x1.162133d6a94ebp19 -0x1.f979dcc8p0 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x0.0p0 F +PAIR t02/epsg:4024>epsg:2064 3 OK 0x1.ccb4c0f8a72c8p19 0x1.0e85bb8a1965fp19 0x1.648d95f98p5 -0x1.4000000000001p2 0x1.3fffffffffffep2 -0x1.0p-30 F +PAIR t02/epsg:4024>epsg:2064 4 OK 0x1.f8b3d72a37381p20 0x1.162382d08ff1bp19 -0x1.9f45dap-2 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.8p-29 F +PAIR t02/epsg:4034>epsg:2079 0 OK -0x1.cdbe42ee3ac9ep20 0x1.46a6050f4fc18p7 -0x1.6ff8fd2ap4 -0x1.0c7f5f64995b4p-48 0x1.2f7be9ffcae92p-62 0x0.0p0 T +PAIR t02/epsg:4034>epsg:2079 1 OK -0x1.2f6a2844b10ddp21 -0x1.2c30af2f61b9fp19 -0x1.7dc1420c4p5 -0x1.3fffffffffffcp2 -0x1.3fffffffffffep2 0x0.0p0 F +PAIR t02/epsg:4034>epsg:2079 2 OK -0x1.3ca3e1252f8afp20 -0x1.18a582ef94d4bp19 -0x1.e84b18f4cp4 0x1.4000000000003p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +PAIR t02/epsg:4034>epsg:2079 3 OK -0x1.2f69b55516cdp21 0x1.2c5adec85a66cp19 -0x1.52569b53cp4 -0x1.4p2 0x1.4000000000001p2 0x1.0p-29 F +PAIR t02/epsg:4034>epsg:2079 4 OK -0x1.3ca362d4c635bp20 0x1.18ccfb7a7ec6fp19 -0x1.f8fbdeaap1 0x1.4000000000003p2 0x1.3fffffffffffdp2 0x1.0p-30 F +PAIR t02/epsg:4045>epsg:2092 0 OK 0x1.5fe0d96317e4ep21 -0x1.aa02153a79383p6 -0x1.b2ec6f7efep9 0x1.2e195f35139cbp-2 -0x1.7e3eb7adafe39p-17 -0x1.6b4bcd1p-1 T +PAIR t02/epsg:4045>epsg:2092 1 OK 0x1.ece6f8e980dp20 -0x1.de4813c48aa24p19 -0x1.b59919a5b2p9 -0x1.fca6c82d12047p1 -0x1.58e17d85ae93p2 -0x1.98c18764p1 F +PAIR t02/epsg:4045>epsg:2092 2 OK 0x1.ca42c30535178p21 -0x1.845c74b1158a7p19 -0x1.a99dd1b742p9 0x1.4722f27775ac2p2 -0x1.4166dcc528839p2 -0x1.2703b92p-2 F +PAIR t02/epsg:4045>epsg:2092 3 OK 0x1.ece532901b0f8p20 0x1.de2acce2c2313p19 -0x1.bb7010a3bp9 -0x1.fcaa012aa74ddp1 0x1.58dfe08db4424p2 -0x1.24d3c69p1 F +PAIR t02/epsg:4045>epsg:2092 4 OK 0x1.ca423ad21c8b8p21 0x1.8444943d0e3bp19 -0x1.af74c742a6p9 0x1.4722db7ae7e1bp2 0x1.4166c5b2f285ep2 -0x1.e57fb1cp-3 F +PAIR t02/epsg:4128>epsg:21100 0 OK 0x1.2df7b531ce2ecp24 0x1.b77a3ae6bdcbep19 0x1.289204eb63p10 0x1.3e87e257e2d26p-46 -0x1.f890638d73839p-41 -0x1.0p-29 T +PAIR t02/epsg:4128>epsg:21100 1 OK 0x1.258066cdc0105p24 0x1.541b94c1c5d3cp18 0x1.34f8565e0dp10 -0x1.3fffffffffff5p2 -0x1.3fffffffffe1bp2 0x1.0p-30 F +PAIR t02/epsg:4128>epsg:21100 2 OK 0x1.366f039ea34ecp24 0x1.5418fe6cb49fep18 0x1.17687d08d9p10 0x1.3ffffffffffc6p2 -0x1.3fffffffffe29p2 -0x1.0p-30 F +PAIR t02/epsg:4128>epsg:21100 3 OK 0x1.258066cdc0105p24 0x1.627355a87b078p20 0x1.37260b004bp10 -0x1.3fffffffffff5p2 0x1.3fffffffffe2bp2 -0x1.8p-29 F +PAIR t02/epsg:4128>epsg:21100 4 OK 0x1.366f039ea34ecp24 0x1.6273fb455dbb4p20 0x1.199634552cp10 0x1.3ffffffffffc6p2 0x1.3fffffffffe2p2 -0x1.0p-29 F +PAIR t02/epsg:4174>epsg:21418 0 OK -0x1.47723bb1eb4fp23 0x1.0792cba516af2p10 0x1.399e85a3ap5 -0x1.2c006b95b7789p6 0x1.cae534297041dp5 0x1.cd7beaf91p6 F +PAIR t02/epsg:4174>epsg:21418 1 EXC:java.lang.IllegalStateException -0x1.bf5449be4cf4ep23 -0x1.0f05d4282b1d6p23 0x1.17c26ac64p4 NaN NaN NaN F +PAIR t02/epsg:4174>epsg:21418 2 EXC:java.lang.IllegalStateException -0x1.647b362b0283p22 -0x1.482f87345cc7bp22 0x1.625eed168p5 NaN NaN NaN F +PAIR t02/epsg:4174>epsg:21418 3 EXC:java.lang.IllegalStateException -0x1.bf4f127a1221p23 0x1.0f19433a576dap23 0x1.fd482d304p4 NaN NaN NaN F +PAIR t02/epsg:4174>epsg:21418 4 EXC:java.lang.IllegalStateException -0x1.64750d9d7449p22 0x1.484741ca1dcc3p22 0x1.d521ae77ep5 NaN NaN NaN F +PAIR t03/epsg:3821>epsg:20009 0 OK 0x1.5fe04d045d4a4p21 0x1.03431b76e590fp7 -0x1.b0427fc8ap6 0x1.2e19c820872ddp-2 0x1.d149fe512f3f9p-17 -0x1.593e4edp-1 T +PAIR t03/epsg:3821>epsg:20009 1 OK 0x1.ece28d6b79f8p20 -0x1.de230e101b2e6p19 -0x1.f9820b8bfp6 -0x1.fcaa2091e2731p1 -0x1.58dfff90b39adp2 -0x1.c260150cp0 F +PAIR t03/epsg:3821>epsg:20009 2 OK 0x1.ca41f9b370f5p21 -0x1.843de383b9bbcp19 -0x1.9e979fa9p6 0x1.4722cfdca34d4p2 -0x1.4166c39ee06dfp2 -0x1.cf09dd8p-3 F +PAIR t03/epsg:3821>epsg:20009 3 OK 0x1.ece4b66bec0d8p20 0x1.de46b0a410daep19 -0x1.c0a3ed0d1p6 -0x1.fca6346e31bdfp1 0x1.58e1f642ae14ap2 -0x1.6e4cb748p1 F +PAIR t03/epsg:3821>epsg:20009 4 OK 0x1.ca429f78da5ep21 0x1.845af3678d37ep19 -0x1.65b98e88bp6 0x1.4722ebd6ba716p2 0x1.4166dfb40a381p2 -0x1.27233p-2 F +PAIR t03/epsg:4007>epsg:20022 0 EXC:java.lang.IllegalStateException -0x1.4350361b82b42p25 0x1.b93c05f38819dp11 0x1.9948e6138p4 NaN NaN NaN F +PAIR t03/epsg:4007>epsg:20022 1 OK -0x1.8463422b0f966p25 -0x1.c3bf27258ba7ep24 0x1.44868472p2 -0x1.3da4997d10eaap6 -0x1.67fec784e1a01p6 0x1.4a43c1ea6cp8 F +PAIR t03/epsg:4007>epsg:20022 2 OK -0x1.c7cab380534aap24 -0x1.131fdfcf9f714p24 0x1.bccb61308p4 -0x1.3da4997d10eaap6 -0x1.67fec7852a595p6 0x1.60fe5d97b4p8 F +PAIR t03/epsg:4007>epsg:20022 3 OK -0x1.845f187c85088p25 0x1.c3decfe5f3ec9p24 0x1.3494d394p4 -0x1.3da4997d10eaap6 0x1.67fec783052d5p6 0x1.6ab879182p7 F +PAIR t03/epsg:4007>epsg:20022 4 OK -0x1.c7c5803cb346ap24 0x1.13333fe009947p24 0x1.501f2f17ap5 -0x1.3da4997d10eaap6 0x1.67fec7834de76p6 0x1.982da9c39p7 F +PAIR t03/epsg:4014>epsg:20066 0 OK -0x1.9ea350b535fe7p21 0x1.85842f011a074p6 -0x1.2dd6b7624p4 0x1.0aea8fa687483p-8 0x1.12b830946e54ap-25 -0x1.30cd36p-7 T +PAIR t03/epsg:4014>epsg:20066 1 OK -0x1.ef4d6ab4e556cp21 -0x1.5693ce8084c73p19 -0x1.3e8a42458p5 -0x1.3ef812ebb29a2p2 -0x1.401a20fd15343p2 -0x1.068f4cp-5 F +PAIR t03/epsg:4014>epsg:20066 2 OK -0x1.4de5c4ba78f1bp21 -0x1.31be070b2fbafp19 -0x1.116ac1218p4 0x1.400ee9c3bed7ap2 -0x1.40004db0a1918p2 -0x1.0c9898p-9 F +PAIR t03/epsg:4014>epsg:20066 3 OK -0x1.ef4cfad0d24f6p21 0x1.56ad82572e3e3p19 -0x1.99a26291cp4 -0x1.3ef810eb1cccap2 0x1.401a2314e71d3p2 -0x1.2b9e47p-5 F +PAIR t03/epsg:4014>epsg:20066 4 OK -0x1.4de5808094298p21 0x1.31d5011968356p19 -0x1.6fc6a506p1 0x1.400ee9c55ee6dp2 0x1.40004db838a07p2 -0x1.137b2p-9 F +PAIR t03/epsg:4024>epsg:20079 0 OK -0x1.0a87704b64bf1p25 0x0.0p0 0x0.0p0 -0x1.13fffffffffffp6 0x0.0p0 0x0.0p0 F +PAIR t03/epsg:4024>epsg:20079 1 OK -0x1.2f01e3eee3ff9p25 -0x1.6f8329fc2767bp23 0x0.0p0 0x1.bcp6 -0x1.68p6 0x0.0p0 F +PAIR t03/epsg:4024>epsg:20079 2 OK -0x1.b6975b064e582p24 -0x1.baf6ca9026301p22 0x0.0p0 -0x1.13fffffffffffp6 -0x1.3cc8568ccfd9cp27 0x0.0p0 F +PAIR t03/epsg:4024>epsg:20079 3 OK -0x1.2f01e3eee3ff9p25 0x1.6f8329fc2767bp23 0x0.0p0 0x1.bcp6 0x1.68p6 0x0.0p0 F +PAIR t03/epsg:4024>epsg:20079 4 OK -0x1.b6975b064e582p24 0x1.baf6ca9026301p22 0x0.0p0 -0x1.13fffffffffffp6 0x1.3cc8568ccfd9cp27 0x0.0p0 F +PAIR t03/epsg:4034>epsg:20092 0 EXC:java.lang.IllegalStateException 0x1.063334eb1cb3bp28 0x1.80fecfdb7f4afp14 -0x1.2eb8c8644p4 NaN NaN NaN F +PAIR t03/epsg:4034>epsg:20092 1 OK 0x1.a050afa617f56p27 -0x1.ee9cda7473dfap26 -0x1.3efae9c32p5 -0x1.3da4997d126f2p6 -0x1.67fec785c9981p6 0x1.8457cab464p8 F +PAIR t03/epsg:4034>epsg:20092 2 OK 0x1.2168c2d9bcdd3p28 -0x1.79974c5559143p27 -0x1.124c101dp4 -0x1.3da4997d126f2p6 -0x1.67fec7861250fp6 0x1.9b126697p8 F +PAIR t03/epsg:4034>epsg:20092 3 OK 0x1.a04ca7b8f87e3p27 0x1.eebf2f123c34bp26 -0x1.9a83b17p4 -0x1.3da4997d126f2p6 0x1.67fec783ed27fp6 0x1.dee0689fe8p7 F +PAIR t03/epsg:4034>epsg:20092 4 OK 0x1.2165cff94c7f2p28 0x1.79b17522969aep27 -0x1.76d11bf4p1 -0x1.3da4997d126f2p6 0x1.67fec78435e19p6 0x1.062accdb1p8 F +PAIR t03/epsg:4045>epsg:2094 0 OK -0x1.c4907d284b5b4p24 -0x1.999cb081801b3p4 -0x1.a0b67941acp9 -0x1.27ffc4b9f0b09p6 -0x1.cec2c582c348bp0 -0x1.ef35f3p-3 F +PAIR t03/epsg:4045>epsg:2094 1 EXC:java.lang.IllegalStateException -0x1.013c63278dc37p25 -0x1.1d15e1a3a3aa7p23 -0x1.9fef77c594p9 NaN NaN NaN F +PAIR t03/epsg:4045>epsg:2094 2 EXC:java.lang.IllegalStateException -0x1.76ff7fd9c4c33p24 -0x1.58d0fe9c5926p22 -0x1.9fef77c594p9 NaN NaN NaN F +PAIR t03/epsg:4045>epsg:2094 3 EXC:java.lang.IllegalStateException -0x1.013c6b447f068p25 0x1.1d1568ed469e6p23 -0x1.a019dce42cp9 NaN NaN NaN F +PAIR t03/epsg:4045>epsg:2094 4 EXC:java.lang.IllegalStateException -0x1.76ff897360e44p24 0x1.58d06b69ad362p22 -0x1.a019dce42cp9 NaN NaN NaN F +PAIR t03/epsg:4128>epsg:2392 0 OK -0x1.f00587e112dep17 0x1.2218e307fa462p7 -0x1.7c4ff1f19p6 0x1.e4b774f3fa033p-13 0x1.e39a1d19543a2p-27 -0x1.0276p-15 T +PAIR t03/epsg:4128>epsg:2392 1 OK -0x1.a49a78b60da2p19 -0x1.34a2f26ec68a7p19 -0x1.cacadfe3p6 -0x1.3feb6e8e336b2p2 -0x1.40008b3af3496p2 -0x1.b3e01p-10 F +PAIR t03/epsg:4128>epsg:2392 2 OK 0x1.594d15c256f28p18 -0x1.1d782eae573cep19 -0x1.917aac129p6 0x1.40007beb4951ap2 -0x1.3ffffcb7437e1p2 0x1.966fp-14 F +PAIR t03/epsg:4128>epsg:2392 3 OK -0x1.a494d71ae2208p19 0x1.34cc1efc3841p19 -0x1.75cb908cp6 -0x1.3feb6ee84d1dap2 0x1.40008b9ea3f78p2 -0x1.7ed12p-10 F +PAIR t03/epsg:4128>epsg:2392 4 OK 0x1.5955c862c62c8p18 0x1.1d9785bcc745bp19 -0x1.3c9a57d13p6 0x1.40007be6f2b96p2 0x1.3ffffccb860fep2 0x1.d17f8p-12 F +PAIR t03/epsg:4174>epsg:2468 0 OK -0x1.7560d98272f35p22 0x1.0341a40434743p7 0x1.fef6211e4p4 0x1.2e19c83c74374p-2 0x1.d14d78d199488p-17 -0x1.593e4ef8p-1 T +PAIR t03/epsg:4174>epsg:2468 1 OK -0x1.aa1874aa0e306p22 -0x1.de1cde2bf30aep19 0x1.8c742be1p3 -0x1.fcaaced47c3c1p1 -0x1.58dffb359b67p2 -0x1.8f7d42bp0 F +PAIR t03/epsg:4174>epsg:2468 2 OK -0x1.4030118e0435cp22 -0x1.8438d7c735477p19 0x1.18f1e7622p5 0x1.4722cb0218f7bp2 -0x1.4166c36bb5f62p2 -0x1.b8e7afp-3 F +PAIR t03/epsg:4174>epsg:2468 3 OK -0x1.aa17ea6c778fap22 0x1.de4080911b647p19 0x1.a9af991d4p4 -0x1.fca6e2c5114f5p1 0x1.58e1f1ea78a8bp2 -0x1.54d75192p1 F +PAIR t03/epsg:4174>epsg:2468 4 OK -0x1.402fbeacd4f61p22 0x1.8455e78398e32p19 0x1.8aac8e3c2p5 0x1.4722e6fba0e03p2 0x1.4166df810ba6dp2 -0x1.1c10607p-2 F +PAIR t04/epsg:3821>epsg:26703 0 OK 0x1.0b2c3a5d3c38ap21 0x1.311c7e9356059p24 0x0.0p0 0x0.0p0 0x1.ebb50dbfb0996p-48 0x0.0p0 F +PAIR t04/epsg:3821>epsg:26703 1 OK 0x1.514c28a7c8b36p21 -0x1.2822fc6feb911p24 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4000000000021p2 0x0.0p0 F +PAIR t04/epsg:3821>epsg:26703 2 OK 0x1.8a162653a609p20 -0x1.288c6d53024a7p24 0x0.0p0 0x1.3fffffffffffap2 -0x1.3ffffffffffffp2 0x0.0p0 F +PAIR t04/epsg:3821>epsg:26703 3 OK 0x1.514c28a7c8b36p21 0x1.2822fc6feb911p24 0x0.0p0 -0x1.3fffffffffffap2 0x1.4000000000021p2 0x0.0p0 F +PAIR t04/epsg:3821>epsg:26703 4 OK 0x1.8a162653a609p20 0x1.288c6d53024a7p24 0x0.0p0 0x1.3fffffffffffap2 0x1.3ffffffffffffp2 0x0.0p0 F +PAIR t04/epsg:4007>epsg:26716 0 OK Infinity Infinity 0x0.0p0 0x1.73fffffffffffp6 Infinity 0x0.0p0 T +PAIR t04/epsg:4007>epsg:26716 1 OK 0x1.f85a1dcaa2fdep23 -0x1.e1ad72a51fb6fp21 0x0.0p0 -0x1.40018c51cf642p2 -0x1.3ffac679a2679p2 0x0.0p0 F +PAIR t04/epsg:4007>epsg:26716 2 OK Infinity Infinity 0x0.0p0 0x1.73fffffffffffp6 Infinity 0x0.0p0 F +PAIR t04/epsg:4007>epsg:26716 3 OK 0x1.f85a1dcaa2fdep23 0x1.e1ad72a51fb6fp21 0x0.0p0 -0x1.40018c51cf642p2 0x1.3ffac679a2679p2 0x0.0p0 F +PAIR t04/epsg:4007>epsg:26716 4 OK Infinity Infinity 0x0.0p0 0x1.73fffffffffffp6 Infinity 0x0.0p0 F +PAIR t04/epsg:4014>epsg:26735 0 OK 0x1.e2bccaf5c381fp28 -0x1.2b9f969ce4cc4p24 0x0.0p0 0x1.a000000000003p4 0x0.0p0 0x0.0p0 F +PAIR t04/epsg:4014>epsg:26735 1 OK 0x1.7fe41bf32c761p28 -0x1.a057c21419eacp27 0x0.0p0 -0x1.34p7 -0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4014>epsg:26735 2 OK 0x1.0d864041368c5p29 -0x1.3d2d505efb76fp28 0x0.0p0 -0x1.34p7 -0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4014>epsg:26735 3 OK 0x1.7fe41bf32c761p28 0x1.556fdc6ce0b7bp27 0x0.0p0 -0x1.34p7 0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4014>epsg:26735 4 OK 0x1.0d864041368c5p29 0x1.17b95d8b5edd6p28 0x0.0p0 -0x1.34p7 0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4024>epsg:26748 0 OK 0x1.b1856f67214dp26 -0x1.57778b5db6648p23 0x0.0p0 0x1.1755555555552p6 0x0.0p0 0x0.0p0 F +PAIR t04/epsg:4024>epsg:26748 1 OK 0x1.668af7d07203ep26 -0x1.04118c6f965c3p25 0x0.0p0 -0x1.b8aaaaaaaaaadp6 -0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4024>epsg:26748 2 OK 0x1.ebbff0027f38ap26 -0x1.76d48edb8e2bp25 0x0.0p0 -0x1.b8aaaaaaaaaadp6 -0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4024>epsg:26748 3 OK 0x1.668af7d07203ep26 0x1.61571b02eca7bp23 0x0.0p0 0x1.1755555555552p6 0x1.fb130e061bc08p25 0x0.0p0 F +PAIR t04/epsg:4024>epsg:26748 4 OK 0x1.ebbff0027f38ap26 0x1.9631925965f17p24 0x0.0p0 0x1.1755555555553p6 -0x1.5c83c96c1e6c3p36 0x0.0p0 F +PAIR t04/epsg:4034>epsg:26766 0 OK 0x1.78f6b0de31472p25 -0x1.4c5e653c18619p23 0x0.0p0 -0x1.4ef9cc0e4804fp7 0x0.0p0 0x0.0p0 T +PAIR t04/epsg:4034>epsg:26766 1 OK 0x1.45128d41225cbp25 -0x1.06132bab2890ep24 0x0.0p0 -0x1.2714ef5315cfap7 -0x1.1c9be5d4a5524p7 0x0.0p0 F +PAIR t04/epsg:4034>epsg:26766 2 OK 0x1.a8593b51ba52ep25 -0x1.388971eec64cfp24 0x0.0p0 0x1.8755555555554p6 -0x1.9d27a8dd68f0ep11 0x0.0p0 F +PAIR t04/epsg:4034>epsg:26766 3 OK 0x1.45128d41225cbp25 -0x1.192ce643bf429p22 0x0.0p0 -0x1.2714ef5315cfap7 0x1.1c9be5d4a5525p7 0x0.0p0 F +PAIR t04/epsg:4034>epsg:26766 4 OK 0x1.a8593b51ba52ep25 -0x1.3d4f34d5214ap20 0x0.0p0 0x1.8755555555554p6 0x1.9d27a8dd68f0cp11 0x0.0p0 F +PAIR t04/epsg:4045>epsg:26779 0 OK 0x1.0969730dc5f3ep25 0x1.69dd27209e31cp20 0x0.0p0 0x1.ca5dc1a63c1f8p-47 0x0.0p0 0x0.0p0 T +PAIR t04/epsg:4045>epsg:26779 1 OK 0x1.0bdedb2194eb3p25 -0x1.acd518cb61e6dp20 0x0.0p0 -0x1.3ffffffffffebp2 -0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t04/epsg:4045>epsg:26779 2 OK 0x1.21ed9d87c0e46p25 0x1.e8077fc282c96p20 0x0.0p0 0x1.4000000000008p2 -0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t04/epsg:4045>epsg:26779 3 OK 0x1.e408040a288b8p24 0x1.1ad5de453664fp20 0x0.0p0 -0x1.3fffffffffffap2 0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t04/epsg:4045>epsg:26779 4 OK 0x1.05d0d1ecc84afp25 0x1.1476ca564fb34p22 0x0.0p0 0x1.3fffffffffffap2 0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t04/epsg:4128>epsg:26795 0 OK 0x1.d9505799224d2p25 -0x1.51ee7a2c47941p23 0x0.0p0 0x1.66aaaaaaaaaabp6 0x0.0p0 0x0.0p0 F +PAIR t04/epsg:4128>epsg:26795 1 OK 0x1.93a2546de1708p25 -0x1.2fd7f6b4aaeb2p24 0x0.0p0 0x1.66aaaaaaaaaabp6 -0x1.b939e3ecce4f4p10 0x0.0p0 F +PAIR t04/epsg:4128>epsg:26795 2 OK 0x1.0b34206c1d232p26 -0x1.7f55914161016p24 0x0.0p0 0x1.66aaaaaaaaaabp6 -0x1.559886b558ca7p16 0x0.0p0 F +PAIR t04/epsg:4128>epsg:26795 3 OK 0x1.93a2546de1708p25 -0x1.10b41bbce5479p21 0x0.0p0 0x1.66aaaaaaaaaabp6 0x1.b939e3ecce4f4p10 0x0.0p0 F +PAIR t04/epsg:4128>epsg:26795 4 OK 0x1.0b34206c1d232p26 0x1.6b38b8a8cb6adp21 0x0.0p0 0x1.66aaaaaaaaaabp6 0x1.559886b558ca7p16 0x0.0p0 F +PAIR t04/epsg:4174>epsg:32007 0 OK 0x1.02b9de43f7521p27 -0x1.8119e2233c9b8p23 0x0.0p0 0x1.01aaaaaaaaaaep6 0x0.0p0 0x0.0p0 F +PAIR t04/epsg:4174>epsg:32007 1 OK 0x1.a8a647f426063p26 -0x1.454c2138b1db3p25 0x0.0p0 -0x1.ce55555555554p6 -0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4174>epsg:32007 2 OK 0x1.2577b6575c229p27 -0x1.dc651e12733d3p25 0x0.0p0 -0x1.ce55555555554p6 -0x1.68p6 0x0.0p0 F +PAIR t04/epsg:4174>epsg:32007 3 OK 0x1.a8a647f426063p26 0x1.097e604e271adp24 0x0.0p0 0x1.01aaaaaaaaaaep6 0x1.ab6438f6ae744p40 0x0.0p0 F +PAIR t04/epsg:4174>epsg:32007 4 OK 0x1.2577b6575c229p27 0x1.1bd82d00d4ef6p25 0x0.0p0 -0x1.ce55555555554p6 0x1.68p6 0x0.0p0 F +PAIR t10/epsg:3824>epsg:2012 0 OK 0x1.3e2acdc2438dfp23 0x0.0p0 0x0.0p0 -0x1.0b437b325cafp3 0x0.0p0 0x0.0p0 T +PAIR t10/epsg:3824>epsg:2012 1 OK 0x1.16888476dd81ep23 -0x1.1bc35a91b5b3dp20 0x0.0p0 -0x1.28804867e4e9cp3 -0x1.d2e7fb596e9adp2 0x0.0p0 F +PAIR t10/epsg:3824>epsg:2012 2 OK 0x1.6455d9c2c6101p23 -0x1.8844fb65d78f2p20 0x0.0p0 -0x1.3289dac8e8662p5 -0x1.471d04bf3cf17p5 0x0.0p0 F +PAIR t10/epsg:3824>epsg:2012 3 OK 0x1.16888476dd81ep23 0x1.1bc35a91b5b3dp20 0x0.0p0 -0x1.28804867e4e9cp3 0x1.d2e7fb596e9adp2 0x0.0p0 F +PAIR t10/epsg:3824>epsg:2012 4 OK 0x1.6455d9c2c6101p23 0x1.8844fb65d78f2p20 0x0.0p0 -0x1.3289dac8e8662p5 0x1.471d04bf3cf17p5 0x0.0p0 F +PAIR t10/epsg:4075>epsg:2025 0 OK 0x1.39f4e15d852fcp24 0x0.0p0 0x0.0p0 0x1.5bfffffffffffp6 0x0.0p0 0x0.0p0 F +PAIR t10/epsg:4075>epsg:2025 1 OK 0x1.0b0499d01b581p24 -0x1.729133d3cdf04p21 0x0.0p0 0x1.5bfffffffffffp6 -0x1.15744dadaf863p12 0x0.0p0 F +PAIR t10/epsg:4075>epsg:2025 2 OK 0x1.6282b3b5517p24 -0x1.2982652f0cap22 0x0.0p0 0x1.5bfffffffffffp6 -0x1.49a51ea4d2b0bp18 0x0.0p0 F +PAIR t10/epsg:4075>epsg:2025 3 OK 0x1.0b0499d01b581p24 0x1.729133d3cdf04p21 0x0.0p0 0x1.5bfffffffffffp6 0x1.15744dadaf863p12 0x0.0p0 F +PAIR t10/epsg:4075>epsg:2025 4 OK 0x1.6282b3b5517p24 0x1.2982652f0cap22 0x0.0p0 0x1.5bfffffffffffp6 0x1.49a51ea4d2b0bp18 0x0.0p0 F +PAIR t10/epsg:4152>epsg:2081 0 OK 0x1.8d57cb37b6b0fp23 0x1.313ee09915443p23 0x0.0p0 -0x1.691cfce176a4dp3 0x0.0p0 0x0.0p0 T +PAIR t10/epsg:4152>epsg:2081 1 OK 0x1.63f2f4dddbce4p23 0x1.0c2e08dc59d5p23 0x0.0p0 -0x1.5ea59d1af0e0dp3 -0x1.0e64614599c9ap3 0x0.0p0 F +PAIR t10/epsg:4152>epsg:2081 2 OK 0x1.b50a32d9ae292p23 0x1.fae2700eb5a3ep22 0x0.0p0 -0x1.cefeb38bc7486p5 -0x1.df1432ed26dp5 0x0.0p0 F +PAIR t10/epsg:4152>epsg:2081 3 OK 0x1.63f2f4dddbce4p23 0x1.564fb855d0b37p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t10/epsg:4152>epsg:2081 4 OK 0x1.b50a32d9ae292p23 0x1.650c892acfb67p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t10/epsg:4173>epsg:2163 0 OK 0x1.211d9ad7d9359p23 0x1.206151047c23bp20 0x0.0p0 0x0.0p0 -0x1.ca5dc1a63c1f8p-51 0x0.0p0 T +PAIR t10/epsg:4173>epsg:2163 1 OK 0x1.23627757725d5p23 -0x1.1a09d5c73b547p11 0x0.0p0 -0x1.3ffffffffffebp2 -0x1.4000000000004p2 0x0.0p0 F +PAIR t10/epsg:4173>epsg:2163 2 OK 0x1.3049860eae0cfp23 0x1.3150d846f05fcp20 0x0.0p0 0x1.3ffffffffffebp2 -0x1.3ffffffffffeap2 0x0.0p0 F +PAIR t10/epsg:4173>epsg:2163 3 OK 0x1.10d75ac9c8816p23 0x1.0e9470973f246p20 0x0.0p0 -0x1.3ffffffffffebp2 0x1.3fffffffffff8p2 0x0.0p0 F +PAIR t10/epsg:4173>epsg:2163 4 OK 0x1.1a27e07d094fcp23 0x1.1e1f690473747p21 0x0.0p0 0x1.3fffffffffffap2 0x1.4000000000003p2 0x0.0p0 F +PAIR t10/epsg:4283>epsg:2328 0 OK 0x1.cdd05c9ad21p15 0x0.0p0 0x0.0p0 0x1.06582720f2688p7 0x0.0p0 0x0.0p0 T +PAIR t10/epsg:4283>epsg:2328 1 OK -0x1.afc37a63ba1bp20 -0x1.52ba4e33a673ep21 0x0.0p0 -0x1.8cp6 -0x1.14110c215499fp11 0x0.0p0 F +PAIR t10/epsg:4283>epsg:2328 2 OK 0x1.f48559d548ec8p20 -0x1.beee270763b9ep20 0x0.0p0 0x1.b759b70a5455fp6 -0x1.9a4755cf38b02p6 0x0.0p0 F +PAIR t10/epsg:4283>epsg:2328 3 OK -0x1.afc37a63ba1bp20 0x1.52ba4e33a673ep21 0x0.0p0 -0x1.8cp6 0x1.14110c215499fp11 0x0.0p0 F +PAIR t10/epsg:4283>epsg:2328 4 OK 0x1.f48559d548ec8p20 0x1.beee270763b9ep20 0x0.0p0 0x1.b759b70a5455fp6 0x1.9a4755cf38b02p6 0x0.0p0 F +PAIR t10/epsg:4617>epsg:2341 0 OK -0x1.2db06c31492ecp24 0x0.0p0 0x0.0p0 -0x1.5bfffffffffffp6 0x0.0p0 0x0.0p0 F +PAIR t10/epsg:4617>epsg:2341 1 OK -0x1.563e6581fb657p24 -0x1.2981d9930abf5p22 0x0.0p0 -0x1.5bfffffffffffp6 -0x1.493b0816029b3p18 0x0.0p0 F +PAIR t10/epsg:4617>epsg:2341 2 OK -0x1.fd7ff35b80658p23 -0x1.7292106b25b69p21 0x0.0p0 -0x1.5bfffffffffffp6 -0x1.153e61074a572p12 0x0.0p0 F +PAIR t10/epsg:4617>epsg:2341 3 OK -0x1.563e6581fb657p24 0x1.2981d9930abf5p22 0x0.0p0 -0x1.5bfffffffffffp6 0x1.493b0816029b3p18 0x0.0p0 F +PAIR t10/epsg:4617>epsg:2341 4 OK -0x1.fd7ff35b80658p23 0x1.7292106b25b69p21 0x0.0p0 -0x1.5bfffffffffffp6 0x1.153e61074a572p12 0x0.0p0 F +PAIR t10/epsg:4667>epsg:2353 0 OK 0x1.7bd33992705bep23 0x0.0p0 0x0.0p0 -0x1.7400000000001p6 0x0.0p0 0x0.0p0 T +PAIR t10/epsg:4667>epsg:2353 1 OK 0x1.38c658cc9eae6p23 -0x1.bde865bcd25d8p21 0x0.0p0 -0x1.7400000000001p6 -0x1.3e017fe6bd64ap14 0x0.0p0 F +PAIR t10/epsg:4667>epsg:2353 2 OK 0x1.c6fa1b22489b7p23 -0x1.1cc71679b00e7p21 0x0.0p0 -0x1.7400000000001p6 -0x1.2c69f8f2fdd1fp9 0x0.0p0 F +PAIR t10/epsg:4667>epsg:2353 3 OK 0x1.38c658cc9eae6p23 0x1.bde865bcd25d8p21 0x0.0p0 -0x1.7400000000001p6 0x1.3e017fe6bd64ap14 0x0.0p0 F +PAIR t10/epsg:4667>epsg:2353 4 OK 0x1.c6fa1b22489b7p23 0x1.1cc71679b00e7p21 0x0.0p0 -0x1.7400000000001p6 0x1.2c69f8f2fdd1fp9 0x0.0p0 F +PAIR t10/epsg:4737>epsg:2366 0 OK -0x1.e95de0e935c6cp23 0x0.0p0 0x0.0p0 -0x1.bp5 0x0.0p0 0x0.0p0 F +PAIR t10/epsg:4737>epsg:2366 1 OK -0x1.6b10528f4328cp24 -0x1.85efbb3fee4cdp24 0x0.0p0 0x1.f8p6 -0x1.68p6 0x0.0p0 F +PAIR t10/epsg:4737>epsg:2366 2 OK -0x1.2ac942b793aa8p22 -0x1.d9482d48a50bcp23 0x0.0p0 0x1.f8p6 -0x1.68p6 0x0.0p0 F +PAIR t10/epsg:4737>epsg:2366 3 OK -0x1.6b10528f4328cp24 0x1.85efbb3fee4cdp24 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t10/epsg:4737>epsg:2366 4 OK -0x1.2ac942b793aa8p22 0x1.d9482d48a50bcp23 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:3824>epsg:2048 0 OK 0x1.0716806f5fc51p21 -0x0.0p0 0x0.0p0 0x1.0198cf49e3c4cp-15 0x0.0p0 0x0.0p0 T +PAIR t11/epsg:3824>epsg:2048 1 OK 0x1.4ebe965fa8c05p21 0x1.278efae277446p19 0x0.0p0 -0x1.3ffc46f91f652p2 -0x1.3ffffddffe52cp2 0x0.0p0 F +PAIR t11/epsg:3824>epsg:2048 2 OK 0x1.7ed7fdbbd42f7p20 0x1.163e067df2f88p19 0x0.0p0 0x1.400009b29b978p2 -0x1.3fffff8dcc613p2 0x0.0p0 F +PAIR t11/epsg:3824>epsg:2048 3 OK 0x1.4ebe965fa8c05p21 -0x1.278efae277446p19 0x0.0p0 -0x1.3ffc46f91f652p2 0x1.3ffffddffe52cp2 0x0.0p0 F +PAIR t11/epsg:3824>epsg:2048 4 OK 0x1.7ed7fdbbd42f7p20 -0x1.163e067df2f88p19 0x0.0p0 0x1.400009b29b978p2 0x1.3fffff8dcc613p2 0x0.0p0 F +PAIR t11/epsg:4075>epsg:2108 0 OK -0x1.3b6b5369b66afp28 0x1.3cd1a26edc71cp22 0x0.0p0 -0x1.a9c71c71c7209p1 0x0.0p0 0x0.0p0 F +PAIR t11/epsg:4075>epsg:2108 1 OK 0x1.3803d6e267ebcp28 -0x1.95c16145247bbp27 0x0.0p0 0x1.6158e38e38e38p7 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4075>epsg:2108 2 OK -0x1.f4954248f26c1p27 -0x1.314568a37bfa9p27 0x0.0p0 0x1.6158e38e38e38p7 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4075>epsg:2108 3 OK 0x1.3803d6e267ebcp28 0x1.a98e7b6c1242ep27 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4075>epsg:2108 4 OK -0x1.f4954248f26c1p27 0x1.451282ca69c1ap27 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4152>epsg:2121 0 OK -0x1.052690017a5fep28 0x1.52bfcf20be70cp22 0x0.0p0 -0x1.20a61d950c85cp3 0x0.0p0 0x0.0p0 F +PAIR t11/epsg:4152>epsg:2121 1 OK -0x1.20558915dcf9ep28 -0x1.6ec0a878d7a1fp27 0x0.0p0 0x1.55f59e26af37bp7 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4152>epsg:2121 2 OK -0x1.9e482a383037p27 -0x1.d91720810bc22p26 0x0.0p0 0x1.55f59e26af37bp7 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4152>epsg:2121 3 OK -0x1.20558915dcf9ep28 0x1.83eca56ae389p27 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4152>epsg:2121 4 OK -0x1.9e482a383037p27 0x1.01b78d3291c81p27 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4173>epsg:2134 0 OK -0x1.edcbb991ab04cp18 0x1.c9b399e2c8deep24 0x0.0p0 0x0.0p0 0x1.f6bf772c2aca1p-48 0x0.0p0 F +PAIR t11/epsg:4173>epsg:2134 1 OK 0x1.b74224c1e1208p15 -0x1.2024f3a583bb6p23 0x0.0p0 -0x1.3fffffffffffap2 -0x1.400000000000bp2 0x0.0p0 F +PAIR t11/epsg:4173>epsg:2134 2 OK -0x1.049ecd60e2a5p20 -0x1.1fab1b31e0658p23 0x0.0p0 0x1.3fffffffffffap2 -0x1.4000000000027p2 0x0.0p0 F +PAIR t11/epsg:4173>epsg:2134 3 OK 0x1.b74224c1e1208p15 0x1.c13f79d2c1ddbp24 0x0.0p0 -0x1.3fffffffffffap2 0x1.400000000000bp2 0x0.0p0 F +PAIR t11/epsg:4173>epsg:2134 4 OK -0x1.049ecd60e2a5p20 0x1.c1028d98f032cp24 0x0.0p0 0x1.3fffffffffffap2 0x1.4000000000027p2 0x0.0p0 F +PAIR t11/epsg:4283>epsg:2150 0 OK Infinity Infinity 0x0.0p0 0x1.8cp6 Infinity 0x0.0p0 T +PAIR t11/epsg:4283>epsg:2150 1 OK 0x1.9ef6fa061e9f9p23 -0x1.1942bfd0632f2p21 0x0.0p0 -0x1.3fffffa69c525p2 -0x1.40000333ac125p2 0x0.0p0 F +PAIR t11/epsg:4283>epsg:2150 2 OK Infinity Infinity 0x0.0p0 0x1.8cp6 Infinity 0x0.0p0 F +PAIR t11/epsg:4283>epsg:2150 3 OK 0x1.9ef6fa061e9f9p23 0x1.1942bfd0632f2p21 0x0.0p0 -0x1.3fffffa69c525p2 0x1.40000333ac125p2 0x0.0p0 F +PAIR t11/epsg:4283>epsg:2150 4 OK Infinity Infinity 0x0.0p0 0x1.8cp6 Infinity 0x0.0p0 F +PAIR t11/epsg:4617>epsg:2193 0 OK -0x1.1613244c0857ap28 0x1.312dp23 0x0.0p0 -0x1.bffffffffffep2 0x0.0p0 0x0.0p0 F +PAIR t11/epsg:4617>epsg:2193 1 OK -0x1.32b2ff5e85041p28 -0x1.86e37223c0c9cp27 0x0.0p0 0x1.5ap7 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4617>epsg:2193 2 OK -0x1.b8b3d870a05f7p27 -0x1.f4cf30c410efep26 0x0.0p0 0x1.5ap7 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4617>epsg:2193 3 OK -0x1.32b2ff5e85041p28 0x1.ad091223c0c9cp27 0x0.0p0 0x1.5ap7 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4617>epsg:2193 4 OK -0x1.b8b3d870a05f7p27 0x1.208d38620877fp27 0x0.0p0 0x1.5ap7 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4667>epsg:22174 0 OK 0x1.9ca12026a5493p23 0x1.313c5b755dd09p23 0x0.0p0 -0x1.b25834fb914ebp1 0x0.0p0 0x0.0p0 T +PAIR t11/epsg:4667>epsg:22174 1 OK 0x1.79966a6967a54p23 0x1.11d48d9d635cp23 0x0.0p0 -0x1.a5967bf31a9dbp2 -0x1.6b1fce115ce2ep2 0x0.0p0 F +PAIR t11/epsg:4667>epsg:22174 2 OK 0x1.bebe0d2ea77c2p23 0x1.073b6ec99ba3ep23 0x0.0p0 -0x1.39e9f7aa69e6bp3 -0x1.e8e133174f3a8p3 0x0.0p0 F +PAIR t11/epsg:4667>epsg:22174 3 OK 0x1.79966a6967a54p23 0x1.50a4294d58452p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4667>epsg:22174 4 OK 0x1.bebe0d2ea77c2p23 0x1.5b3d48211ffd3p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4737>epsg:2224 0 OK 0x1.e7e30fb672828p26 -0x1.577f5e01c0cfap23 0x0.0p0 0x1.09p6 0x0.0p0 0x0.0p0 F +PAIR t11/epsg:4737>epsg:2224 1 OK 0x1.918c4f2c10e49p26 -0x1.2693029f92392p25 0x0.0p0 -0x1.c7p6 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4737>epsg:2224 2 OK 0x1.14abdaf180ecp27 -0x1.b0559ba52c0e2p25 0x0.0p0 -0x1.c7p6 -0x1.68p6 0x0.0p0 F +PAIR t11/epsg:4737>epsg:2224 3 OK 0x1.918c4f2c10e49p26 0x1.eb4d4e7ac7456p23 0x0.0p0 0x1.09p6 0x1.3f3813586af8fp33 0x0.0p0 F +PAIR t11/epsg:4737>epsg:2224 4 OK 0x1.14abdaf180ecp27 0x1.0495eca44ba64p25 0x0.0p0 -0x1.c7p6 0x1.68p6 0x0.0p0 F +PAIR t12/epsg:3824>epsg:2006 0 OK 0x1.1870a3ce35e98p23 -0x1.34ad306568e7cp9 0x1.26e7d53fcp5 -0x1.6393f66a1c77ap1 -0x1.0f7ceeb883472p-10 -0x1.8227ec4dp2 T +PAIR t12/epsg:3824>epsg:2006 1 OK 0x1.ec9e0e830a2cep22 -0x1.ea12063cd632bp19 0x1.2d29dd6a7p6 -0x1.91b5e1abeaeecp2 -0x1.60ca6e2a9f664p2 -0x1.64bd7db1p2 F +PAIR t12/epsg:3824>epsg:2006 2 OK 0x1.39bab796397aap23 -0x1.455bdc1892a78p20 0x1.a8842e3ccp5 -0x1.b0e270fc2a928p2 -0x1.9a39c8eaec399p3 -0x1.326cd716dp6 F +PAIR t12/epsg:3824>epsg:2006 3 OK 0x1.eca01f43e8475p22 0x1.e98da1d7dce2cp19 0x1.7b0baa968p4 -0x1.91ac76b514338p2 0x1.60c102ee0b935p2 -0x1.36b75d5p-2 F +PAIR t12/epsg:3824>epsg:2006 4 OK 0x1.39bc7dba88056p23 0x1.450491fc1a086p20 0x1.76bd3928p0 -0x1.b044d02104b41p2 0x1.99ec68ee8a533p3 0x1.92bcf712p1 F +PAIR t12/epsg:4075>epsg:20355 0 OK -0x1.9e7fcec2e21adp21 -0x1.310c5ead262bep23 0x1.bc01faa5bp6 -0x1.0341ed5ab04efp-47 0x1.0fac54d9a6f2dp-46 0x1.0p-30 F +PAIR t12/epsg:4075>epsg:20355 1 OK -0x1.4dc3ed974758cp21 -0x1.1df14b49c10ap23 0x1.db3a6848bp6 -0x1.4000000000001p2 -0x1.3fffffffffffbp2 -0x1.0p-30 F +PAIR t12/epsg:4075>epsg:20355 2 OK -0x1.ef30e46866f8p21 -0x1.1ba26f284f8d8p23 0x1.fc915dfcfp6 0x1.400000000001dp2 -0x1.3ffffffffffedp2 -0x1.8p-29 F +PAIR t12/epsg:4075>epsg:20355 3 OK -0x1.4dc46a45841f1p21 0x1.c026f551a639ap24 0x1.735731a4ap6 -0x1.4p2 0x1.4000000000001p2 0x0.0p0 F +PAIR t12/epsg:4075>epsg:20355 4 OK -0x1.ef31b1d625886p21 0x1.beffaf2888c77p24 0x1.94ae304dcp6 0x1.4000000000001p2 0x1.3ffffffffffe6p2 -0x1.0p-30 F +PAIR t12/epsg:4152>epsg:2044 0 OK -0x1.477537ff199d2p23 0x1.8fa2d9c2ba045p9 -0x1.69f480e8ep6 -0x1.2c0091aad5d9p6 0x1.5beca4d4da712p5 0x1.83c151846p5 F +PAIR t12/epsg:4152>epsg:2044 1 EXC:java.lang.IllegalStateException -0x1.bf560bdc83152p23 -0x1.0f0c83afaa918p23 -0x1.a5f049e16p6 NaN NaN NaN F +PAIR t12/epsg:4152>epsg:2044 2 EXC:java.lang.IllegalStateException -0x1.647e876429bb4p22 -0x1.4837f4b1b6625p22 -0x1.5ab352f95p6 NaN NaN NaN F +PAIR t12/epsg:4152>epsg:2044 3 EXC:java.lang.IllegalStateException -0x1.bf52178a1579ap23 0x1.0f1b3f4e1fe07p23 -0x1.7a7002ea2p6 NaN NaN NaN F +PAIR t12/epsg:4152>epsg:2044 4 EXC:java.lang.IllegalStateException -0x1.6479dc21df15cp22 0x1.4849f1e0ca9bcp22 -0x1.2f331478ap6 NaN NaN NaN F +PAIR t12/epsg:4173>epsg:2064 0 OK 0x1.6f87ae7a3a274p20 0x1.23802652b678bp3 -0x1.64c76899dp6 -0x1.56318594fbe46p-50 0x0.0p0 0x1.0p-29 T +PAIR t12/epsg:4173>epsg:2064 1 OK 0x1.ccb4c46d1836p19 -0x1.0e836d98df8d9p19 -0x1.0414cb266p6 -0x1.4p2 -0x1.4p2 0x1.0p-30 F +PAIR t12/epsg:4173>epsg:2064 2 OK 0x1.f8b3ddaedc6aap20 -0x1.16212470b1feep19 -0x1.b7fadefc1p6 0x1.4000000000001p2 -0x1.4000000000001p2 0x0.0p0 F +PAIR t12/epsg:4173>epsg:2064 3 OK 0x1.ccb4c0ec6c8fdp19 0x1.0e85ac917c377p19 -0x1.fb9c59a32p5 -0x1.4000000000001p2 0x1.4000000000001p2 0x0.0p0 F +PAIR t12/epsg:4173>epsg:2064 4 OK 0x1.f8b3d742748efp20 0x1.1623736d2d491p19 -0x1.b1b43dbbdp6 0x1.3ffffffffffffp2 0x1.4000000000001p2 -0x1.0p-30 F +PAIR t12/epsg:4283>epsg:2079 0 OK -0x1.cdbe42e6965b4p20 0x1.46a77ffebc313p7 -0x1.0e4943ea48p7 0x1.b139691711fa5p-50 0x1.2f74bf1dfac6dp-62 0x0.0p0 T +PAIR t12/epsg:4283>epsg:2079 1 OK -0x1.2f6a115ec5b2ep21 -0x1.2c391591d63a6p19 -0x1.3a709e9058p7 -0x1.3fffffffffffdp2 -0x1.3ffffffffffffp2 0x0.0p0 F +PAIR t12/epsg:4283>epsg:2079 2 OK -0x1.3ca3c7f91355dp20 -0x1.18ad5eec30c29p19 -0x1.1809b30df8p7 0x1.3fffffffffffbp2 -0x1.4000000000003p2 -0x1.0p-30 F +PAIR t12/epsg:4283>epsg:2079 3 OK -0x1.2f699e6b7c95ap21 0x1.2c6345572e03bp19 -0x1.0549a55ef8p7 -0x1.3fffffffffffdp2 0x1.4000000000001p2 -0x1.0p-30 F +PAIR t12/epsg:4283>epsg:2079 4 OK -0x1.3ca349a49b9cdp20 0x1.18d4d7a14b47bp19 -0x1.c5c586a31p6 0x1.4000000000002p2 0x1.4000000000001p2 -0x1.0p-30 F +PAIR t12/epsg:4617>epsg:2092 0 OK 0x1.5fe0d928a47bap21 -0x1.a9f3a92850104p6 -0x1.fff86f1bp4 0x1.2e195fdaad4cbp-2 -0x1.7e376faedd68dp-17 -0x1.6b4bcde8p-1 T +PAIR t12/epsg:4617>epsg:2092 1 OK 0x1.ece68c250f804p20 -0x1.de411a7e2fbdfp19 -0x1.35e7ba1aap5 -0x1.fca78c69c106cp1 -0x1.58e178aa9415bp2 -0x1.7c1244a2p1 F +PAIR t12/epsg:4617>epsg:2092 2 OK 0x1.ca42a2605909p21 -0x1.8456c4afb3bc3p19 -0x1.d8ccd6a88p3 0x1.4722ed0195bfbp2 -0x1.4166dc8c3babap2 -0x1.1a89a5ep-2 F +PAIR t12/epsg:4617>epsg:2092 3 OK 0x1.ece4c5e17d51cp20 0x1.de23d495aca52p19 -0x1.9355cac56p5 -0x1.fcaac53de8cd8p1 0x1.58dfdbbb467a1p2 -0x1.08283464p1 F +PAIR t12/epsg:4617>epsg:2092 4 OK 0x1.ca421a33cf95cp21 0x1.843ee50824276p19 -0x1.a7425e58cp4 0x1.4722d6062e31ep2 0x1.4166c57a7f4fp2 -0x1.cc8eb98p-3 F +PAIR t12/epsg:4667>epsg:21100 0 OK 0x1.2df7b52fea248p24 0x1.b77a3aeb36ae4p19 0x1.17386b5375p10 0x1.7fa951b221af6p-46 -0x1.f9aea9f51254cp-41 -0x1.0p-30 T +PAIR t12/epsg:4667>epsg:21100 1 OK 0x1.258066cbe78bbp24 0x1.541147ffcb85p18 0x1.2411f69575p10 -0x1.3fffffffffffap2 -0x1.3fffffffffe17p2 -0x1.8p-29 F +PAIR t12/epsg:4667>epsg:21100 2 OK 0x1.366f039c9aab5p24 0x1.540eb19c39f46p18 0x1.06821e5a7dp10 0x1.3ffffffffffe5p2 -0x1.3fffffffffe22p2 -0x1.8p-29 F +PAIR t12/epsg:4667>epsg:21100 3 OK 0x1.258066cbe78bbp24 0x1.6275e8dd54421p20 0x1.263fb5d2dap10 -0x1.3fffffffffffap2 0x1.3fffffffffe1ap2 -0x1.0p-29 F +PAIR t12/epsg:4667>epsg:21100 4 OK 0x1.366f039c9aab5p24 0x1.62768e7dd7176p20 0x1.08afe04204p10 0x1.3ffffffffffe5p2 0x1.3fffffffffe19p2 -0x1.8p-29 F +PAIR t12/epsg:4737>epsg:21418 0 OK -0x1.47723ba129eaep23 0x1.079488088c4c8p10 -0x1.ef30bd2ap6 -0x1.2c006b97861f2p6 0x1.cae57ce788b6ap5 -0x1.188ff91p-1 F +PAIR t12/epsg:4737>epsg:21418 1 EXC:java.lang.IllegalStateException -0x1.bf53631a9ebaap23 -0x1.0f092f4de3532p23 -0x1.208da997dp7 NaN NaN NaN F +PAIR t12/epsg:4737>epsg:21418 2 EXC:java.lang.IllegalStateException -0x1.647a25d5ace68p22 -0x1.4833a038f6329p22 -0x1.d5dc7a154p6 NaN NaN NaN F +PAIR t12/epsg:4737>epsg:21418 3 EXC:java.lang.IllegalStateException -0x1.bf4e2bbd60ce6p23 0x1.0f1c9e74bf3efp23 -0x1.03dc913bp7 NaN NaN NaN F +PAIR t12/epsg:4737>epsg:21418 4 EXC:java.lang.IllegalStateException -0x1.6473fd2a7ee48p22 0x1.484b5aea03901p22 -0x1.9c7a5945dp6 NaN NaN NaN F +PAIR t13/epsg:3824>epsg:20009 0 OK 0x1.5fe04d05e2daap21 0x1.0343592592e43p7 -0x1.0621408dep7 0x1.2e19c81bf0ba8p-2 0x1.d14a6745cb06fp-17 -0x1.593e4edp-1 T +PAIR t13/epsg:3824>epsg:20009 1 OK 0x1.ece28dc836a1p20 -0x1.de2313d35f919p19 -0x1.2abeb81888p7 -0x1.fcaa1ff17d702p1 -0x1.58dfff9414f8p2 -0x1.c28fa24cp0 F +PAIR t13/epsg:3824>epsg:20009 2 OK 0x1.ca41f9cfa7108p21 -0x1.843de836f223ap19 -0x1.fa9304504p6 0x1.4722cfe10b483p2 -0x1.4166c39f05786p2 -0x1.cf1e8c6p-3 F +PAIR t13/epsg:3824>epsg:20009 3 OK 0x1.ece4b6c932c6p20 0x1.de46b66fcafcep19 -0x1.0e4fa8808p7 -0x1.fca633ccd0486p1 0x1.58e1f64681a99p2 -0x1.6e6481ap1 F +PAIR t13/epsg:3824>epsg:20009 4 OK 0x1.ca429f9539e04p21 0x1.845af821ad149p19 -0x1.c1b4f27edp6 0x1.4722ebdb29734p2 0x1.4166dfb435a1p2 -0x1.272d891p-2 F +PAIR t13/epsg:4075>epsg:20022 0 EXC:java.lang.IllegalStateException -0x1.43503613438e8p25 0x1.b93ed0e28ee31p11 -0x1.0621408dep7 NaN NaN NaN F +PAIR t13/epsg:4075>epsg:20022 1 OK -0x1.8461f7eb321d6p25 -0x1.c3c8f6bee5486p24 -0x1.2abeb81888p7 -0x1.3da4997d10eaap6 -0x1.67fec77ba6e2bp6 0x1.4bf5d8f3ep5 F +PAIR t13/epsg:4075>epsg:20022 2 OK -0x1.c7c916f14a178p24 -0x1.1325e0e407d81p24 -0x1.fa9304504p6 -0x1.3da4997d10eaap6 -0x1.67fec77befa04p6 0x1.00e5570aep6 F +PAIR t13/epsg:4075>epsg:20022 3 OK -0x1.845dce1f11f3cp25 0x1.c3e89f8769637p24 -0x1.0e4fa8808p7 -0x1.3da4997d10eaap6 0x1.67fec779ca54ep6 -0x1.ada1d66d6p6 F +PAIR t13/epsg:4075>epsg:20022 4 OK -0x1.c7c3e388a106ep24 0x1.133940fb2afd3p24 -0x1.c1b4f27edp6 -0x1.3da4997d10eaap6 0x1.67fec77a13133p6 -0x1.52b7793b2p6 F +PAIR t13/epsg:4152>epsg:20066 0 OK -0x1.9ea350af954b8p21 0x1.8585f3161a408p6 -0x1.0621408dep7 0x1.0aea8f8c420c4p-8 0x1.12b1b3775321cp-25 -0x1.30cd36p-7 T +PAIR t13/epsg:4152>epsg:20066 1 OK -0x1.ef4d41093ddd4p21 -0x1.569d5fd159b3bp19 -0x1.2abeb81888p7 -0x1.3ef8122d0143ap2 -0x1.401a21099f196p2 -0x1.145abep-5 F +PAIR t13/epsg:4152>epsg:20066 2 OK -0x1.4de5ab4fee8ap21 -0x1.31c6949cb94acp19 -0x1.fa9304504p6 0x1.400ee9c457e4ep2 -0x1.40004db149047p2 -0x1.0f28ap-9 F +PAIR t13/epsg:4152>epsg:20066 3 OK -0x1.ef4cd12198f82p21 0x1.56b713c206da2p19 -0x1.0e4fa8808p7 -0x1.3ef8102c5861bp2 0x1.401a232166e1fp2 -0x1.396bea8p-5 F +PAIR t13/epsg:4152>epsg:20066 4 OK -0x1.4de56713da4f5p21 0x1.31dd8ec3031c8p19 -0x1.c1b4f27edp6 0x1.400ee9c5f8276p2 0x1.40004db8e009ep2 -0x1.160bbp-9 F +PAIR t13/epsg:4173>epsg:20079 0 EXC:java.lang.IllegalStateException -0x1.0a84df30cf94ep25 0x1.627a027a21d37p10 -0x1.0621408dep7 NaN NaN NaN F +PAIR t13/epsg:4173>epsg:20079 1 OK -0x1.2effdf859d95bp25 -0x1.6f713e55fd8c4p23 -0x1.2abeb81888p7 -0x1.3da4997d100fdp6 -0x1.67fec77ba6e2bp6 0x1.4bf5d8f3ep5 F +PAIR t13/epsg:4173>epsg:20079 2 EXC:java.lang.IllegalStateException -0x1.b69447c13824dp24 -0x1.bae08460ed854p22 -0x1.fa9304504p6 NaN NaN NaN F +PAIR t13/epsg:4173>epsg:20079 3 OK -0x1.2efe1e843486cp25 0x1.6f8b3e3925d2ap23 -0x1.0e4fa8808p7 -0x1.3da4997d100fdp6 0x1.67fec779ca54ep6 -0x1.ada1d66d6p6 F +PAIR t13/epsg:4173>epsg:20079 4 EXC:java.lang.IllegalStateException -0x1.b6922e7162132p24 0x1.bb00160c9a276p22 -0x1.c1b4f27edp6 NaN NaN NaN F +PAIR t13/epsg:4283>epsg:20092 0 EXC:java.lang.IllegalStateException 0x1.063334ee23871p28 0x1.81008e8024753p14 -0x1.0621408dep7 NaN NaN NaN F +PAIR t13/epsg:4283>epsg:20092 1 OK 0x1.a04f2f98c2f9bp27 -0x1.eea9a1dbee1dbp26 -0x1.2abeb81888p7 -0x1.3da4997d126f1p6 -0x1.67fec77ba6e2bp6 0x1.4bf5d8f3ep5 F +PAIR t13/epsg:4283>epsg:20092 2 OK 0x1.2167a9e8596dep28 -0x1.79a10918d1ff3p27 -0x1.fa9304504p6 -0x1.3da4997d126f1p6 -0x1.67fec77befa04p6 0x1.00e5570aep6 F +PAIR t13/epsg:4283>epsg:20092 3 OK 0x1.a04b278c8c20cp27 0x1.eecbf661ccd3cp26 -0x1.0e4fa8808p7 -0x1.3da4997d126f1p6 0x1.67fec779ca54ep6 -0x1.ada1d66d6p6 F +PAIR t13/epsg:4283>epsg:20092 4 OK 0x1.2164b6f130419p28 0x1.79bb31d2bc36cp27 -0x1.c1b4f27edp6 -0x1.3da4997d126f1p6 0x1.67fec77a13133p6 -0x1.52b7793b2p6 F +PAIR t13/epsg:4617>epsg:2094 0 OK -0x1.c4907d284b5b8p24 -0x1.998ed265a501bp4 0x1.1b1e9aaep2 -0x1.27ffc4b9f0b09p6 -0x1.ceb9f24dacea1p0 -0x1.e864b9p-5 F +PAIR t13/epsg:4617>epsg:2094 1 EXC:java.lang.IllegalStateException -0x1.013ca749ccfaap25 -0x1.1d11ebdd0429cp23 0x1.259d2c9dp2 NaN NaN NaN F +PAIR t13/epsg:4617>epsg:2094 2 EXC:java.lang.IllegalStateException -0x1.76ffd078dfbd4p24 -0x1.58cc2a6704815p22 0x1.259d2c9dp2 NaN NaN NaN F +PAIR t13/epsg:4617>epsg:2094 3 EXC:java.lang.IllegalStateException -0x1.013caf665b9ffp25 0x1.1d11732a67fa1p23 0x1.106aecfdp2 NaN NaN NaN F +PAIR t13/epsg:4617>epsg:2094 4 EXC:java.lang.IllegalStateException -0x1.76ffda1207052p24 0x1.58cb9738fa361p22 0x1.106aecfdp2 NaN NaN NaN F +PAIR t13/epsg:4667>epsg:2392 0 OK -0x1.f00587c0e1bep17 0x1.2219a2a084ccdp7 -0x1.48f4b8294p7 0x1.e4b774dd9d097p-13 0x1.e390d4583aa0ap-27 -0x1.0278p-15 T +PAIR t13/epsg:4667>epsg:2392 1 OK -0x1.a49a2ff390f94p19 -0x1.34a8d2eaac32fp19 -0x1.6c986d095p7 -0x1.3feb6e8cc7cd2p2 -0x1.40008b3b9262fp2 -0x1.ba215p-10 F +PAIR t13/epsg:4667>epsg:2392 2 OK 0x1.594d6962f5c38p18 -0x1.1d7d9f82942c3p19 -0x1.4ff0540ccp7 0x1.40007beb1bc62p2 -0x1.3ffffcb7474a1p2 0x1.98c2p-14 F +PAIR t13/epsg:4667>epsg:2392 3 OK -0x1.a4948e3c03cbp19 0x1.34d1ff8c69923p19 -0x1.4217f67708p7 -0x1.3feb6ee6e30b2p2 0x1.40008b9f414bdp2 -0x1.85162p-10 F +PAIR t13/epsg:4667>epsg:2392 4 OK 0x1.59561c2ee801p18 0x1.1d9cf6a4f5a4cp19 -0x1.257f5b5028p7 0x1.40007be6c51adp2 0x1.3ffffccb89799p2 0x1.d215p-12 F +PAIR t13/epsg:4737>epsg:2468 0 OK -0x1.7560d97d0e92bp22 0x1.0343592592e43p7 -0x1.0621408dep7 0x1.2e19c81bf0ba8p-2 0x1.d14a6745cb06fp-17 -0x1.593e4edp-1 T +PAIR t13/epsg:4737>epsg:2468 1 OK -0x1.aa185c8df257cp22 -0x1.de2313d35f919p19 -0x1.2abeb81888p7 -0x1.fcaa1ff17d702p1 -0x1.58dfff9414f8p2 -0x1.c28fa24cp0 F +PAIR t13/epsg:4737>epsg:2468 2 OK -0x1.403003182c77cp22 -0x1.843de836f223ap19 -0x1.fa9304504p6 0x1.4722cfe10b483p2 -0x1.4166c39f05786p2 -0x1.cf1e8c6p-3 F +PAIR t13/epsg:4737>epsg:2468 3 OK -0x1.aa17d24db34e8p22 0x1.de46b66fcafcep19 -0x1.0e4fa8808p7 -0x1.fca633ccd0486p1 0x1.58e1f64681a99p2 -0x1.6e6481ap1 F +PAIR t13/epsg:4737>epsg:2468 4 OK -0x1.402fb035630fep22 0x1.845af821ad149p19 -0x1.c1b4f27edp6 0x1.4722ebdb29734p2 0x1.4166dfb435a1p2 -0x1.272d891p-2 F +PAIR t14/epsg:3824>epsg:26703 0 OK 0x1.0b2c3a5d3c38ap21 0x1.311c7e9356059p24 0x0.0p0 0x0.0p0 0x1.ebb50dbfb0996p-48 0x0.0p0 F +PAIR t14/epsg:3824>epsg:26703 1 OK 0x1.514c28a7c8b36p21 -0x1.2822fc6feb911p24 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4000000000021p2 0x0.0p0 F +PAIR t14/epsg:3824>epsg:26703 2 OK 0x1.8a162653a609p20 -0x1.288c6d53024a7p24 0x0.0p0 0x1.3fffffffffffap2 -0x1.3ffffffffffffp2 0x0.0p0 F +PAIR t14/epsg:3824>epsg:26703 3 OK 0x1.514c28a7c8b36p21 0x1.2822fc6feb911p24 0x0.0p0 -0x1.3fffffffffffap2 0x1.4000000000021p2 0x0.0p0 F +PAIR t14/epsg:3824>epsg:26703 4 OK 0x1.8a162653a609p20 0x1.288c6d53024a7p24 0x0.0p0 0x1.3fffffffffffap2 0x1.3ffffffffffffp2 0x0.0p0 F +PAIR t14/epsg:4075>epsg:26716 0 OK Infinity Infinity 0x0.0p0 0x1.73fffffffffffp6 Infinity 0x0.0p0 T +PAIR t14/epsg:4075>epsg:26716 1 OK 0x1.f85a1dcaa2fdep23 -0x1.e1ad72a51fb6fp21 0x0.0p0 -0x1.40018c51cf642p2 -0x1.3ffac679a2679p2 0x0.0p0 F +PAIR t14/epsg:4075>epsg:26716 2 OK Infinity Infinity 0x0.0p0 0x1.73fffffffffffp6 Infinity 0x0.0p0 F +PAIR t14/epsg:4075>epsg:26716 3 OK 0x1.f85a1dcaa2fdep23 0x1.e1ad72a51fb6fp21 0x0.0p0 -0x1.40018c51cf642p2 0x1.3ffac679a2679p2 0x0.0p0 F +PAIR t14/epsg:4075>epsg:26716 4 OK Infinity Infinity 0x0.0p0 0x1.73fffffffffffp6 Infinity 0x0.0p0 F +PAIR t14/epsg:4152>epsg:26735 0 OK 0x1.e2bccaf5c381fp28 -0x1.2b9f969ce4cc4p24 0x0.0p0 0x1.a000000000003p4 0x0.0p0 0x0.0p0 F +PAIR t14/epsg:4152>epsg:26735 1 OK 0x1.7fe41bf32c761p28 -0x1.a057c21419eacp27 0x0.0p0 -0x1.34p7 -0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4152>epsg:26735 2 OK 0x1.0d864041368c5p29 -0x1.3d2d505efb76fp28 0x0.0p0 -0x1.34p7 -0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4152>epsg:26735 3 OK 0x1.7fe41bf32c761p28 0x1.556fdc6ce0b7bp27 0x0.0p0 -0x1.34p7 0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4152>epsg:26735 4 OK 0x1.0d864041368c5p29 0x1.17b95d8b5edd6p28 0x0.0p0 -0x1.34p7 0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4173>epsg:26748 0 OK 0x1.b1856f67214dp26 -0x1.57778b5db6648p23 0x0.0p0 0x1.1755555555552p6 0x0.0p0 0x0.0p0 F +PAIR t14/epsg:4173>epsg:26748 1 OK 0x1.668af7d07203ep26 -0x1.04118c6f965c3p25 0x0.0p0 -0x1.b8aaaaaaaaaadp6 -0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4173>epsg:26748 2 OK 0x1.ebbff0027f38ap26 -0x1.76d48edb8e2bp25 0x0.0p0 -0x1.b8aaaaaaaaaadp6 -0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4173>epsg:26748 3 OK 0x1.668af7d07203ep26 0x1.61571b02eca7bp23 0x0.0p0 0x1.1755555555552p6 0x1.fb130e061bc08p25 0x0.0p0 F +PAIR t14/epsg:4173>epsg:26748 4 OK 0x1.ebbff0027f38ap26 0x1.9631925965f17p24 0x0.0p0 0x1.1755555555553p6 -0x1.5c83c96c1e6c3p36 0x0.0p0 F +PAIR t14/epsg:4283>epsg:26766 0 OK 0x1.78f6b0de31472p25 -0x1.4c5e653c18619p23 0x0.0p0 -0x1.4ef9cc0e4804fp7 0x0.0p0 0x0.0p0 T +PAIR t14/epsg:4283>epsg:26766 1 OK 0x1.45128d41225cbp25 -0x1.06132bab2890ep24 0x0.0p0 -0x1.2714ef5315cfap7 -0x1.1c9be5d4a5524p7 0x0.0p0 F +PAIR t14/epsg:4283>epsg:26766 2 OK 0x1.a8593b51ba52ep25 -0x1.388971eec64cfp24 0x0.0p0 0x1.8755555555554p6 -0x1.9d27a8dd68f0ep11 0x0.0p0 F +PAIR t14/epsg:4283>epsg:26766 3 OK 0x1.45128d41225cbp25 -0x1.192ce643bf429p22 0x0.0p0 -0x1.2714ef5315cfap7 0x1.1c9be5d4a5525p7 0x0.0p0 F +PAIR t14/epsg:4283>epsg:26766 4 OK 0x1.a8593b51ba52ep25 -0x1.3d4f34d5214ap20 0x0.0p0 0x1.8755555555554p6 0x1.9d27a8dd68f0cp11 0x0.0p0 F +PAIR t14/epsg:4617>epsg:26779 0 OK 0x1.0969730dc5f3ep25 0x1.69dd27209e31cp20 0x0.0p0 0x1.ca5dc1a63c1f8p-47 0x0.0p0 0x0.0p0 T +PAIR t14/epsg:4617>epsg:26779 1 OK 0x1.0bdedb2194eb3p25 -0x1.acd518cb61e6dp20 0x0.0p0 -0x1.3ffffffffffebp2 -0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t14/epsg:4617>epsg:26779 2 OK 0x1.21ed9d87c0e46p25 0x1.e8077fc282c96p20 0x0.0p0 0x1.4000000000008p2 -0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t14/epsg:4617>epsg:26779 3 OK 0x1.e408040a288b8p24 0x1.1ad5de453664fp20 0x0.0p0 -0x1.3fffffffffffap2 0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t14/epsg:4617>epsg:26779 4 OK 0x1.05d0d1ecc84afp25 0x1.1476ca564fb34p22 0x0.0p0 0x1.3fffffffffffap2 0x1.3fffffffffde8p2 0x0.0p0 F +PAIR t14/epsg:4667>epsg:26795 0 OK 0x1.d9505799224d2p25 -0x1.51ee7a2c47941p23 0x0.0p0 0x1.66aaaaaaaaaabp6 0x0.0p0 0x0.0p0 F +PAIR t14/epsg:4667>epsg:26795 1 OK 0x1.93a2546de1708p25 -0x1.2fd7f6b4aaeb2p24 0x0.0p0 0x1.66aaaaaaaaaabp6 -0x1.b939e3ecce4f4p10 0x0.0p0 F +PAIR t14/epsg:4667>epsg:26795 2 OK 0x1.0b34206c1d232p26 -0x1.7f55914161016p24 0x0.0p0 0x1.66aaaaaaaaaabp6 -0x1.559886b558ca7p16 0x0.0p0 F +PAIR t14/epsg:4667>epsg:26795 3 OK 0x1.93a2546de1708p25 -0x1.10b41bbce5479p21 0x0.0p0 0x1.66aaaaaaaaaabp6 0x1.b939e3ecce4f4p10 0x0.0p0 F +PAIR t14/epsg:4667>epsg:26795 4 OK 0x1.0b34206c1d232p26 0x1.6b38b8a8cb6adp21 0x0.0p0 0x1.66aaaaaaaaaabp6 0x1.559886b558ca7p16 0x0.0p0 F +PAIR t14/epsg:4737>epsg:32007 0 OK 0x1.02b9de43f7521p27 -0x1.8119e2233c9b8p23 0x0.0p0 0x1.01aaaaaaaaaaep6 0x0.0p0 0x0.0p0 F +PAIR t14/epsg:4737>epsg:32007 1 OK 0x1.a8a647f426063p26 -0x1.454c2138b1db3p25 0x0.0p0 -0x1.ce55555555554p6 -0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4737>epsg:32007 2 OK 0x1.2577b6575c229p27 -0x1.dc651e12733d3p25 0x0.0p0 -0x1.ce55555555554p6 -0x1.68p6 0x0.0p0 F +PAIR t14/epsg:4737>epsg:32007 3 OK 0x1.a8a647f426063p26 0x1.097e604e271adp24 0x0.0p0 0x1.01aaaaaaaaaaep6 0x1.ab6438f6ae744p40 0x0.0p0 F +PAIR t14/epsg:4737>epsg:32007 4 OK 0x1.2577b6575c229p27 0x1.1bd82d00d4ef6p25 0x0.0p0 -0x1.ce55555555554p6 0x1.68p6 0x0.0p0 F +PAIR t20/epsg:3906>epsg:2012 0 OK 0x1.3e271a051ef8p23 0x1.287976691f21cp10 -0x1.fce4f357cp6 -0x1.0b31f27437556p3 0x1.dec5ab06e6d51p-8 -0x1.64efb3168p4 T +PAIR t20/epsg:3906>epsg:2012 1 OK 0x1.16876b796ad3p23 -0x1.1b81a60a158a9p20 -0x1.349eca291p7 -0x1.28681454d37e5p3 -0x1.d2b7c5d85cccdp2 0x1.5c37d465p3 F +PAIR t20/epsg:3906>epsg:2012 2 OK 0x1.6452702798ee8p23 -0x1.87e69602edee3p20 -0x1.7b1d470f98p7 -0x1.320f952ba70c8p5 -0x1.469e1500d19b3p5 0x1.2f46488cap8 F +PAIR t20/epsg:3906>epsg:2012 3 OK 0x1.16852bab0f442p23 0x1.1bfd9877df00bp20 -0x1.1a913eee1p6 -0x1.288b9c37a9f4bp3 0x1.d2fe3b9f63b87p2 -0x1.b58a58d64p4 F +PAIR t20/epsg:3906>epsg:2012 4 OK 0x1.644e88412537cp23 0x1.8890868427b5fp20 -0x1.a78dbeb4dp6 -0x1.32b228157cbbfp5 0x1.473d5bdb5409dp5 -0x1.e16ad91088p7 F +PAIR t20/epsg:4132>epsg:2025 0 OK 0x1.39f175d6379c9p24 0x1.5e247b7b7381dp11 -0x1.8d8fa04818p7 0x1.5bfdd7ad62fdbp6 0x1.d487810ab9dc5p2 -0x1.ce4b08451p6 F +PAIR t20/epsg:4132>epsg:2025 1 EXC:java.lang.IllegalStateException 0x1.0b03691557ebp24 -0x1.7248e75c2c87p21 -0x1.b433bb3c5p7 NaN NaN NaN F +PAIR t20/epsg:4132>epsg:2025 2 EXC:java.lang.IllegalStateException 0x1.6282992a579d1p24 -0x1.294a27597b8acp22 -0x1.ed093e9ecp7 NaN NaN NaN F +PAIR t20/epsg:4132>epsg:2025 3 EXC:java.lang.IllegalStateException 0x1.0aff9208c0d42p24 0x1.72cb56040fa52p21 -0x1.2a20590138p7 NaN NaN NaN F +PAIR t20/epsg:4132>epsg:2025 4 EXC:java.lang.IllegalStateException 0x1.627bf221ba5p24 0x1.29b1d9111892p22 -0x1.62f5b3cd08p7 NaN NaN NaN F +PAIR t20/epsg:4145>epsg:2081 0 OK 0x1.8d64c533c998bp23 0x1.31439113fd977p23 -0x1.91dbb07614p9 -0x1.6992014f821bcp3 0x1.58c744744b9dcp-8 0x1.162adf2c9p7 T +PAIR t20/epsg:4145>epsg:2081 1 OK 0x1.63fef31a81aaap23 0x1.0c2fa785fafa6p23 -0x1.b9908c0438p9 -0x1.5ee16302bd8d8p3 -0x1.0e87a39817ccbp3 0x1.5479880b9p6 F +PAIR t20/epsg:4145>epsg:2081 2 OK 0x1.b5193b219d70cp23 0x1.fae69494975cap22 -0x1.7e5a628fd2p9 -0x1.cf8ea754cd454p5 -0x1.df8e212af01d7p5 0x1.092afb39e8p9 F +PAIR t20/epsg:4145>epsg:2081 3 OK 0x1.63fdc63c77cd4p23 0x1.5655e2ac09ac9p23 -0x1.a56e3e1bdcp9 -0x1.c2252bd0e87bp6 0x1.67f93aac7972dp6 -0x1.061a4aaae4p8 F +PAIR t20/epsg:4145>epsg:2081 4 OK 0x1.b5172f7c09aa5p23 0x1.651540cec8692p23 -0x1.6a382d51bcp9 -0x1.c2252bd0e87bp6 0x1.67f93ab4afdfep6 -0x1.1f5c5247cp7 F +PAIR t20/epsg:4155>epsg:2163 0 OK 0x1.211d1e9ebf5fcp23 0x1.206b9a20f992dp20 0x1.c0133893a54p12 0x1.460687b46f8bdp-49 0x1.8e67f9c8f1bb2p-47 -0x1.0p-30 T +PAIR t20/epsg:4155>epsg:2163 1 OK 0x1.23546f9c9436bp23 0x1.e349a7ca57e83p10 0x1.b502d3ea1fp12 -0x1.3ffffffffffeep2 -0x1.4000000000003p2 -0x1.0p-30 F +PAIR t20/epsg:4155>epsg:2163 2 OK 0x1.303829cf50429p23 0x1.325a842894783p20 0x1.b569a26204cp12 0x1.400000000000ep2 -0x1.4000000000006p2 -0x1.0p-30 F +PAIR t20/epsg:4155>epsg:2163 3 OK 0x1.10e90cb253f0bp23 0x1.0dc3ecb8637b1p20 0x1.b65a54c9b2p12 -0x1.400000000000bp2 0x1.400000000001ep2 -0x1.0p-30 F +PAIR t20/epsg:4155>epsg:2163 4 OK 0x1.1a3c68848026bp23 0x1.1dbc35fa0d045p21 0x1.b6c1232ae98p12 0x1.4000000000001p2 0x1.4000000000005p2 -0x1.0p-30 F +PAIR t20/epsg:4168>epsg:2328 0 OK 0x1.ceb275a65b2p15 0x1.4a9bf58a2dbcap10 -0x1.37ef13b6cp5 0x1.0653b69b86d85p7 0x1.889138bbf93e3p-3 -0x1.632672f208p8 T +PAIR t20/epsg:4168>epsg:2328 1 EXC:java.lang.IllegalStateException -0x1.afd6e5636f2bp20 -0x1.528799ae68186p21 -0x1.163e3b453p6 NaN NaN NaN F +PAIR t20/epsg:4168>epsg:2328 2 EXC:java.lang.IllegalStateException 0x1.f48127927aacp20 -0x1.bea9318bac282p20 -0x1.0003eca89p6 NaN NaN NaN F +PAIR t20/epsg:4168>epsg:2328 3 EXC:java.lang.IllegalStateException -0x1.afaa36ced4038p20 0x1.52e8baa23f2dbp21 -0x1.addfc93cp3 NaN NaN NaN F +PAIR t20/epsg:4168>epsg:2328 4 EXC:java.lang.IllegalStateException 0x1.f49aa8282f1a8p20 0x1.bf2aa62b64fc4p20 -0x1.f81b7726p2 NaN NaN NaN F +PAIR t20/epsg:4192>epsg:2341 0 OK -0x1.2db412aabb563p24 -0x1.36248b74d6dfp9 0x1.4f3957d2cp5 -0x1.5bfe059523096p6 -0x1.9f1313030241dp0 -0x1.741c6c6478p8 F +PAIR t20/epsg:4192>epsg:2341 1 EXC:java.lang.IllegalStateException -0x1.564241fd5a449p24 -0x1.2993e2bc10f72p22 0x1.065b63e8dp6 NaN NaN NaN F +PAIR t20/epsg:4192>epsg:2341 2 EXC:java.lang.IllegalStateException -0x1.fd845655bf39ap23 -0x1.72a7219093055p21 0x1.1a0408476p5 NaN NaN NaN F +PAIR t20/epsg:4192>epsg:2341 3 EXC:java.lang.IllegalStateException -0x1.5643bb1e45a9p24 0x1.297cec7ce16b8p22 0x1.926ab8b7p5 NaN NaN NaN F +PAIR t20/epsg:4192>epsg:2341 4 EXC:java.lang.IllegalStateException -0x1.fd8609ba8f4dp23 0x1.728a3f767cabbp21 0x1.3f6fa5998p4 NaN NaN NaN F +PAIR t20/epsg:4207>epsg:2353 0 OK 0x1.7bd12d4f3d76ep23 0x1.14e27de81c7c2p9 -0x1.c05be1fb2p5 -0x1.73fd3c6dc0ea6p6 0x1.5777f2e46f77p-2 -0x1.7d0be26d1cp8 T +PAIR t20/epsg:4207>epsg:2353 1 EXC:java.lang.IllegalStateException 0x1.38c1d924f3a08p23 -0x1.bdda28c684a46p21 -0x1.d199b992p5 NaN NaN NaN F +PAIR t20/epsg:4207>epsg:2353 2 EXC:java.lang.IllegalStateException 0x1.c6f887749c3a5p23 -0x1.1cbc3e919e753p21 -0x1.12e0c16dep6 NaN NaN NaN F +PAIR t20/epsg:4207>epsg:2353 3 EXC:java.lang.IllegalStateException 0x1.38c45b4a5b7fep23 0x1.be0310af4e671p21 -0x1.41129cfeap5 NaN NaN NaN F +PAIR t20/epsg:4207>epsg:2353 4 EXC:java.lang.IllegalStateException 0x1.c6f9f75c1e47dp23 0x1.1cd6a2c9d7b39p21 -0x1.953a568e8p5 NaN NaN NaN F +PAIR t20/epsg:4214>epsg:2366 0 EXC:java.lang.IllegalStateException -0x1.e973917dcb6d4p23 -0x1.7f3b883655087p11 0x1.e335a938cp6 NaN NaN NaN F +PAIR t20/epsg:4214>epsg:2366 1 OK -0x1.6b18d324cec48p24 -0x1.8603f4f403bap24 0x1.1a9024ffdp7 0x1.7f5f0f0f4dc8ep6 -0x1.67fe93bc887a1p6 -0x1.85fa449ccp5 F +PAIR t20/epsg:4214>epsg:2366 2 OK -0x1.2ae27ddb45f2p22 -0x1.d961a083f5c1p23 0x1.c9e1a374ap6 0x1.7f5f0f0f4dc8ep6 -0x1.67fe93bc2476ap6 -0x1.2e3bc8d8cp6 F +PAIR t20/epsg:4214>epsg:2366 3 OK -0x1.6b2023aba828p24 0x1.85e8596a7c14dp24 0x1.fbbe356bap6 0x1.7f5f0f0f4dc8ep6 0x1.67fe93beb8f39p6 0x1.96072f811p6 F +PAIR t20/epsg:4214>epsg:2366 4 OK -0x1.2af4a2cdef7d8p22 0x1.d93ff1531ee8fp23 0x1.907f7ef6bp6 0x1.7f5f0f0f4dc8ep6 0x1.67fe93be54f14p6 0x1.2ac8790cap6 F +PAIR t21/epsg:3906>epsg:2048 0 OK 0x1.071d36a74d28dp21 -0x1.fbdef2f55e4bp8 -0x1.ce96b432cp5 0x1.01d590ddb4c13p-15 -0x1.9c693c72c3d26p-31 0x1.c8bbp-14 T +PAIR t21/epsg:3906>epsg:2048 1 OK 0x1.4ec42ae021f5fp21 0x1.2747a1abd470dp19 -0x1.5ad504adcp6 -0x1.3ffc46633001bp2 -0x1.3ffffddff439dp2 0x1.25764p-11 F +PAIR t21/epsg:3906>epsg:2048 2 OK 0x1.7ee9935ea492dp20 0x1.15fb39b6f7f32p19 -0x1.e7d203b98p6 0x1.400009b69025p2 -0x1.3fffff8dbd2d8p2 0x1.40c8p-17 F +PAIR t21/epsg:3906>epsg:2048 3 OK 0x1.4ec2e5cedef71p21 -0x1.27ca60ec6ac9bp19 -0x1.85e1916ep1 -0x1.3ffc466f55617p2 0x1.3ffffde190719p2 0x1.29deap-11 F +PAIR t21/epsg:3906>epsg:2048 4 OK 0x1.7ee83c97d9a65p20 -0x1.16766608ae43dp19 -0x1.3257232acp5 0x1.400009b5fee6fp2 0x1.3fffff8d91086p2 0x1.7c6p-17 F +PAIR t21/epsg:4132>epsg:2108 0 EXC:java.lang.IllegalStateException -0x1.3b6f3b089b16ap28 0x1.4614c8070ecbep22 -0x1.02c2d39a68p7 NaN NaN NaN F +PAIR t21/epsg:4132>epsg:2108 1 OK 0x1.38082594ab375p28 -0x1.956d0a4b4299cp27 -0x1.2cffc1b4ep7 0x1.10efcfb326776p5 -0x1.67fd535cc6b9ep6 0x1.e2ea5a0c84p8 F +PAIR t21/epsg:4132>epsg:2108 2 OK -0x1.f4a80729d64aep27 -0x1.310f916b2602ap27 -0x1.65d54734bp7 0x1.10efcfb326776p5 -0x1.67fd535bff84dp6 0x1.c67f974d18p8 F +PAIR t21/epsg:4132>epsg:2108 3 OK 0x1.37f88b2da27b5p28 0x1.a9c5e3418ec85p27 -0x1.45ddff539p6 0x1.10efcfb326776p5 0x1.67fd5348f93ddp6 -0x1.e057fa668p7 F +PAIR t21/epsg:4132>epsg:2108 4 OK -0x1.f48fae11e171fp27 0x1.4546c43fdcdd7p27 -0x1.b788b929p6 0x1.10efcfb326776p5 0x1.67fd534831fdep6 -0x1.0c96aba82p8 F +PAIR t21/epsg:4145>epsg:2121 0 EXC:java.lang.IllegalStateException -0x1.0518e25196355p28 0x1.57010a7d811dbp22 -0x1.145bb07716p9 NaN NaN NaN F +PAIR t21/epsg:4145>epsg:2121 1 OK -0x1.204a29f319a67p28 -0x1.6e843ddc51e5ap27 -0x1.3c6905c3b4p9 -0x1.c2252bd0e9592p6 -0x1.67f93ad001ffap6 0x1.f49cb7b7cp7 F +PAIR t21/epsg:4145>epsg:2121 2 OK -0x1.9e38e2182c414p27 -0x1.d8c6b24f74616p26 -0x1.0132db768cp9 -0x1.c2252bd0e9592p6 -0x1.67f93ad8381ap6 0x1.70bab068fp8 F +PAIR t21/epsg:4145>epsg:2121 3 OK -0x1.2041d1ad98967p28 0x1.83fa3d6bbaf2bp27 -0x1.2846dd80c6p9 -0x1.c2252bd0e9592p6 0x1.67f93ab2c346cp6 -0x1.56daa6de6p7 F +PAIR t21/epsg:4145>epsg:2121 4 OK -0x1.9e2d7a00c65b6p27 0x1.01bfe5f1738aep27 -0x1.da2197bb04p8 -0x1.c2252bd0e9592p6 0x1.67f93abaf9a4bp6 -0x1.a80981aecp5 F +PAIR t21/epsg:4155>epsg:2134 0 OK -0x1.edd5164ec7a52p18 0x1.c9b31c615985p24 0x1.d3389c2a4p4 0x1.4608e28b1c90bp-49 -0x1.2d8544ba36b9p-48 0x1.0p-30 F +PAIR t21/epsg:4155>epsg:2134 1 OK 0x1.b7049e1dab248p15 -0x1.2026550f4aa04p23 0x1.a5594eee8p3 -0x1.400000000000bp2 -0x1.3fffffffffff3p2 -0x1.0p-29 F +PAIR t21/epsg:4155>epsg:2134 2 OK -0x1.04a1e36979a68p20 -0x1.1fac8601a4564p23 0x1.3979ca1bcp4 0x1.3fffffffffff3p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +PAIR t21/epsg:4155>epsg:2134 3 OK 0x1.b707a2966663p15 0x1.c13f32f9a766bp24 0x1.163cd842p5 -0x1.400000000000bp2 0x1.400000000000dp2 0x0.0p0 F +PAIR t21/epsg:4155>epsg:2134 4 OK -0x1.04a18ae9adb8bp20 0x1.c102448dc5c31p24 0x1.49a35e166p5 0x1.3fffffffffff2p2 0x1.4000000000003p2 0x0.0p0 F +PAIR t21/epsg:4168>epsg:2150 0 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.1fef13b6ep5 NaN NaN NaN T +PAIR t21/epsg:4168>epsg:2150 1 OK 0x1.9efb331e2bca9p23 -0x1.191c498ba61c8p21 -0x1.0a3e6ecf1p6 -0x1.3fffffa47a7f5p2 -0x1.400003344abf5p2 0x1.275p-18 F +PAIR t21/epsg:4168>epsg:2150 2 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.e8084064ap5 NaN NaN NaN F +PAIR t21/epsg:4168>epsg:2150 3 OK 0x1.9ef3db5a6e607p23 0x1.1967fcd33bb09p21 -0x1.4de1667f8p3 -0x1.3fffffa8a6589p2 0x1.400003334d3edp2 -0x1.163p-18 F +PAIR t21/epsg:4168>epsg:2150 4 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.381eb1aep2 NaN NaN NaN F +PAIR t21/epsg:4192>epsg:2193 0 EXC:java.lang.IllegalStateException -0x1.1616de8e61cf3p28 0x1.304bdcc419527p23 0x1.673957d2cp5 NaN NaN NaN F +PAIR t21/epsg:4192>epsg:2193 1 OK -0x1.32b5b6afed121p28 -0x1.86fa4d0847551p27 0x1.125b304afp6 0x1.424a136fce751p5 -0x1.67fd85e865b12p6 -0x1.6579769c38p7 F +PAIR t21/epsg:4192>epsg:2193 2 OK -0x1.b8b6b9f8081e7p27 -0x1.f4ec65bac3f58p26 0x1.3203a10b6p5 0x1.424a136fce751p5 -0x1.67fd85e7a0b36p6 -0x1.a226267df8p7 F +PAIR t21/epsg:4192>epsg:2193 3 OK -0x1.32b9206b49d3ap28 0x1.ad0166c5f1b2ap27 0x1.aa6a518bcp5 0x1.424a136fce751p5 0x1.67fd85ec7555bp6 -0x1.29fd6cb64p4 F +PAIR t21/epsg:4192>epsg:2193 4 OK -0x1.b8bb68c197867p27 0x1.2087b931be49fp27 0x1.6f6ed742cp4 0x1.424a136fce751p5 0x1.67fd85ebb05a4p6 -0x1.87b19c41ap5 F +PAIR t21/epsg:4207>epsg:22174 0 OK 0x1.9ca02587c597cp23 0x1.313e18b29ffb1p23 -0x1.a85be1fb6p5 -0x1.b246d6d2f0568p1 0x1.f0f85f91da0e2p-12 -0x1.079bdc9cp2 T +PAIR t21/epsg:4207>epsg:22174 1 OK 0x1.79955ce5cc989p23 0x1.11d60d93fbe5dp23 -0x1.b99a20bc2p5 -0x1.a58ed90f8bf0cp2 -0x1.6b1b4e3aa0527p2 -0x1.6bbea2bcp0 F +PAIR t21/epsg:4207>epsg:22174 2 OK 0x1.bebdbb3fbf7d5p23 0x1.073d4d31f6174p23 -0x1.06e0f5031p6 -0x1.39caec841a424p3 -0x1.e8c8989a98ef4p3 -0x1.01d2037cp2 F +PAIR t21/epsg:4207>epsg:22174 3 OK 0x1.7994fb4368a02p23 0x1.50a5a1c3fc73fp23 -0x1.2913043cep5 0x1.6890c33431105p3 0x1.67fd286392132p6 -0x1.2c66156128p8 F +PAIR t21/epsg:4207>epsg:22174 4 OK 0x1.bebd13278cfcap23 0x1.5b3f5b8553001p23 -0x1.7d3abdcdp5 0x1.6890c33431105p3 0x1.67fd286343b17p6 -0x1.36eb0c92fcp8 F +PAIR t21/epsg:4214>epsg:2224 0 EXC:java.lang.IllegalStateException 0x1.e7dd63620adabp26 -0x1.57a9903f87a16p23 0x1.ef35a938dp6 NaN NaN NaN F +PAIR t21/epsg:4214>epsg:2224 1 OK 0x1.9186e7f379c97p26 -0x1.269697d2cfd21p25 0x1.20900b312p7 0x1.7f5f0f0f4dc37p6 -0x1.67fe93bc8892bp6 -0x1.85c5755b8p5 F +PAIR t21/epsg:4214>epsg:2224 2 OK 0x1.14a7c6b031c5cp27 -0x1.b05bb6d3851a2p25 0x1.d5e16fd7p6 0x1.7f5f0f0f4dc37p6 -0x1.67fe93bc248f5p6 -0x1.2e2161387p6 F +PAIR t21/epsg:4214>epsg:2224 3 EXC:java.lang.IllegalStateException 0x1.9188e93badf7p26 0x1.eb1fbc922fe6dp23 0x1.03df00eafp7 NaN NaN NaN F +PAIR t21/epsg:4214>epsg:2224 4 OK 0x1.14a970de716b9p27 0x1.048357a0e4783p25 0x1.9c7f4b60fp6 0x1.7f5f0f0f4dc37p6 0x1.67fe93be5509fp6 0x1.2ae2e0b4ep6 F +PAIR t22/epsg:3906>epsg:2006 0 OK 0x1.186d718637d5p23 0x1.7fbe51acad21bp8 -0x1.4fa8ea5a8p4 -0x1.637c86cfe3eb4p1 0x1.5164ba111aaedp-11 -0x1.e1fbbbfe8p3 T +PAIR t22/epsg:3906>epsg:2006 1 OK 0x1.ec9bf7b30226fp22 -0x1.e997a0b06a103p19 -0x1.6e2d11a7p3 -0x1.91a9dff0bc37ap2 -0x1.60bfd57f1c8ecp2 -0x1.ea304d6ep1 F +PAIR t22/epsg:3906>epsg:2006 2 OK 0x1.39b7aec6854fbp23 -0x1.4507f71336c35p20 -0x1.13a71f577p6 -0x1.b00248568b0a4p2 -0x1.99d1bb216bb22p3 -0x1.39541e6e4p5 F +PAIR t22/epsg:3906>epsg:2006 3 OK 0x1.ec9aaf1024771p22 0x1.e9e9ec7fbb012p19 0x1.4a151fc88p4 -0x1.91afba212bb57p2 0x1.60c5aff7758f5p2 -0x1.c6b71a36p2 F +PAIR t22/epsg:3906>epsg:2006 4 OK 0x1.39b69486df86bp23 0x1.453e391f3ee33p20 -0x1.26b7d1d64p5 -0x1.b06433d2e187bp2 0x1.9a01ccd820c63p3 -0x1.62d23a1c3p6 F +PAIR t22/epsg:4132>epsg:20355 0 OK -0x1.9e79b434b1a05p21 0x1.c9b2ba4baca5fp24 -0x1.2639e50bcp4 -0x1.95b1c8dabbf41p-48 0x1.782b477bcdc84p-49 -0x1.0p-30 F +PAIR t22/epsg:4132>epsg:20355 1 OK -0x1.4dbe2352ebc15p21 -0x1.1df5370e927aep23 -0x1.fb42164ecp4 -0x1.3ffffffffffffp2 -0x1.3fffffffffff6p2 0x0.0p0 F +PAIR t22/epsg:4132>epsg:20355 2 OK -0x1.ef2c7300a86b8p21 -0x1.1ba6cee6b5baep23 -0x1.9e4720ebcp5 0x1.3fffffffffffdp2 -0x1.4000000000005p2 0x1.0p-29 F +PAIR t22/epsg:4132>epsg:20355 3 OK -0x1.4dbd549e05859p21 0x1.c0256eefce015p24 0x1.6b727fbbp3 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +PAIR t22/epsg:4132>epsg:20355 4 OK -0x1.ef2b1e69fcc56p21 0x1.befdf8b0a663p24 -0x1.1724b91f8p3 0x1.3fffffffffffep2 0x1.3ffffffffffe9p2 0x1.0p-30 F +PAIR t22/epsg:4145>epsg:2044 0 EXC:java.lang.IllegalStateException -0x1.474907205b70ap23 0x1.d5b8175cbc0d6p11 -0x1.41987a777ap9 NaN NaN NaN F +PAIR t22/epsg:4145>epsg:2044 1 EXC:java.lang.IllegalStateException -0x1.bf28ca0ef46acp23 -0x1.0edc65aa40a49p23 -0x1.71253bd1d8p9 NaN NaN NaN F +PAIR t22/epsg:4145>epsg:2044 2 EXC:java.lang.IllegalStateException -0x1.64439c4da3cdcp22 -0x1.47fe708f6961p22 -0x1.2c8793569ep9 NaN NaN NaN F +PAIR t22/epsg:4145>epsg:2044 3 EXC:java.lang.IllegalStateException -0x1.bf163298fd872p23 0x1.0f21a9c9d9e29p23 -0x1.5793057f0ep9 NaN NaN NaN F +PAIR t22/epsg:4145>epsg:2044 4 EXC:java.lang.IllegalStateException -0x1.642da8e784decp22 0x1.485303fcc649cp22 -0x1.12f5815094p9 NaN NaN NaN F +PAIR t22/epsg:4155>epsg:2064 0 OK 0x1.6f8a05afab796p20 0x1.0d3b709c0934dp7 -0x1.dff53a6cep5 0x1.550bfb1a1ca38p-49 0x0.0p0 -0x1.0p-30 T +PAIR t22/epsg:4155>epsg:2064 1 OK 0x1.ccb89cde5d0bep19 -0x1.0e6d56f09f324p19 -0x1.9ed868adap5 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +PAIR t22/epsg:4155>epsg:2064 2 OK 0x1.f8b6f3be61937p20 -0x1.160a77646bc53p19 -0x1.699fbcf25p6 0x1.3fffffffffffdp2 -0x1.3fffffffffffdp2 0x0.0p0 F +PAIR t22/epsg:4155>epsg:2064 3 OK 0x1.ccb8691bfb13ap19 0x1.0e8e87b669837p19 -0x1.cac0e51cp4 -0x1.4000000000001p2 0x1.4000000000001p2 -0x1.0p-29 F +PAIR t22/epsg:4155>epsg:2064 4 OK 0x1.f8b694d3672eep20 0x1.162c94d60f1a9p19 -0x1.0ce39ce74p6 0x1.3fffffffffffbp2 0x1.3ffffffffffffp2 0x1.0p-30 F +PAIR t22/epsg:4168>epsg:2079 0 OK -0x1.cdbc1e4b78922p20 0x1.fc46f456cec84p8 -0x1.5640d002ep7 0x1.e5d424ba1856p-49 -0x1.2f76bf44b0143p-60 0x0.0p0 T +PAIR t22/epsg:4168>epsg:2079 1 OK -0x1.2f6a0d9510a0ap21 -0x1.2c0af2da86999p19 -0x1.bf8bd045ap7 -0x1.3fffffffffffdp2 -0x1.3ffffffffffffp2 0x0.0p0 F +PAIR t22/epsg:4168>epsg:2079 2 OK -0x1.3ca11f4919e9dp20 -0x1.18820fd99a2bap19 -0x1.9207788d18p7 0x1.3fffffffffffdp2 -0x1.4000000000002p2 0x0.0p0 F +PAIR t22/epsg:4168>epsg:2079 3 OK -0x1.2f68a7dcfb684p21 0x1.2c8e3bfe37619p19 -0x1.1a23a398b8p7 -0x1.3fffffffffffdp2 0x1.4000000000001p2 0x0.0p0 F +PAIR t22/epsg:4168>epsg:2079 4 OK -0x1.3c9f962a01f15p20 0x1.18fce5df5b1e4p19 -0x1.d93ee5a07p6 0x1.4p2 0x1.3fffffffffffep2 0x1.0p-29 F +PAIR t22/epsg:4192>epsg:2092 0 OK 0x1.5fd84112df0cep21 -0x1.ebc3b8803e748p7 0x1.9cdd2323p3 0x1.2e30651c8c188p-2 -0x1.b9742522edaeep-16 0x1.7f73c78p-3 T +PAIR t22/epsg:4192>epsg:2092 1 OK 0x1.ecd2ff301aec8p20 -0x1.de59879f03f4fp19 0x1.dd8efe42cp4 -0x1.fc99b611fcb31p1 -0x1.58e5865c07487p2 -0x1.65d8e5ep-3 F +PAIR t22/epsg:4192>epsg:2092 2 OK 0x1.ca3c0c03dbc5ep21 -0x1.84697d780c8afp19 0x1.77972a304p4 0x1.472383c6f99ffp2 -0x1.416711f93dc8ap2 -0x1.15dffep-7 F +PAIR t22/epsg:4192>epsg:2092 3 OK 0x1.eccee639dcf24p20 0x1.de15effc34b37p19 0x1.70dae1dcp1 -0x1.fca1276c1946dp1 0x1.58e1cc76eb76cp2 0x1.ea9e4828p0 F +PAIR t22/epsg:4192>epsg:2092 4 OK 0x1.ca3ad192b32dp21 0x1.84325da7f62c9p19 -0x1.bee4a246p1 0x1.47234eb108dbep2 0x1.4166dcaf84cd3p2 0x1.bffe014p-4 F +PAIR t22/epsg:4207>epsg:21100 0 OK 0x1.2df778cc1d5p24 0x1.b78724e8537e7p19 0x1.09f603a155p10 0x1.6ca394cb6093cp-46 -0x1.8499ff1d99b5cp-39 0x1.0p-30 T +PAIR t22/epsg:4207>epsg:21100 1 OK 0x1.25800fe4f00c6p24 0x1.542893737630ap18 0x1.1645cd7163p10 -0x1.4000000000021p2 -0x1.3fffffffffe18p2 0x1.8p-29 F +PAIR t22/epsg:4207>epsg:21100 2 OK 0x1.366ee1bcec0b8p24 0x1.5425c238c8a7ep18 0x1.ec28c41dcap9 0x1.3ffffffffffe9p2 -0x1.3fffffffffe25p2 0x1.0p-29 F +PAIR t22/epsg:4207>epsg:21100 3 OK 0x1.25800fe4f00c6p24 0x1.627cffdf4643dp20 0x1.1cf7adcb8p10 -0x1.4000000000021p2 0x1.3fffffffffe1ap2 0x1.0p-29 F +PAIR t22/epsg:4207>epsg:21100 4 OK 0x1.366ee1bcec0b8p24 0x1.627db44770802p20 0x1.f98c96a75ep9 0x1.3ffffffffffe9p2 0x1.3fffffffffe2bp2 0x0.0p0 F +PAIR t22/epsg:4214>epsg:21418 0 OK -0x1.477c3cc9942c6p23 0x0.0p0 0x0.0p0 -0x1.2c00000000001p6 0x0.0p0 0x0.0p0 F +PAIR t22/epsg:4214>epsg:21418 1 OK -0x1.bf5c24815148cp23 -0x1.0f177cfb0943dp23 0x0.0p0 -0x1.2c00000000001p6 -0x1.b40b2f12036d1p37 0x0.0p0 F +PAIR t22/epsg:4214>epsg:21418 2 OK -0x1.64870dad43a14p22 -0x1.484557436c56dp22 0x0.0p0 -0x1.2c00000000001p6 -0x1.08c81be15efe6p20 0x0.0p0 F +PAIR t22/epsg:4214>epsg:21418 3 OK -0x1.bf5c24815148cp23 0x1.0f177cfb0943dp23 0x0.0p0 -0x1.2c00000000001p6 0x1.b40b2f12036d1p37 0x0.0p0 F +PAIR t22/epsg:4214>epsg:21418 4 OK -0x1.64870dad43a14p22 0x1.484557436c56dp22 0x0.0p0 -0x1.2c00000000001p6 0x1.08c81be15efe6p20 0x0.0p0 F +PAIR t23/epsg:3906>epsg:20009 0 OK 0x1.5fd650d240cc4p21 0x1.be4b0be9fe547p9 -0x1.79c5e75a28p7 0x1.2e3fb9036b958p-2 0x1.90b3ad111874ep-14 0x1.8455809p-2 T +PAIR t23/epsg:3906>epsg:20009 1 OK 0x1.eccc228871eep20 -0x1.ddb333fbbc76ep19 -0x1.d8275b8eep7 -0x1.fca9b49f3c82dp1 -0x1.58dc6be0406a9p2 0x1.1efa6a6bp2 F +PAIR t23/epsg:3906>epsg:20009 2 OK 0x1.ca343c732f7e6p21 -0x1.83e44b702c85dp19 -0x1.f131e5e29p7 0x1.4723a4205c4bfp2 -0x1.4166b0e683566p2 0x1.ee6ac9bp-2 F +PAIR t23/epsg:3906>epsg:20009 3 OK 0x1.ecdb020d6ac68p20 0x1.dea891e18f076p19 -0x1.1465bea0cp7 -0x1.fc8eb037acfa2p1 0x1.58e9f298433fcp2 -0x1.8d81fc1ep1 F +PAIR t23/epsg:3906>epsg:20009 4 OK 0x1.ca38b1e235c3p21 0x1.84ac67e452ed3p19 -0x1.2d702f9a58p7 0x1.472464e631694p2 0x1.41677269635a5p2 0x1.c2efaa8p-5 F +PAIR t23/epsg:4132>epsg:20022 0 EXC:java.lang.IllegalStateException -0x1.43569cd40474fp25 0x1.430666a874c0dp14 -0x1.047199dde4p8 NaN NaN NaN F +PAIR t23/epsg:4132>epsg:20022 1 OK -0x1.8475378fbf76cp25 -0x1.c37d862a2a373p24 -0x1.2bdecfb958p8 0x1.c132326724ae2p2 -0x1.67fd8b0fe6c91p6 0x1.063472da9p9 F +PAIR t23/epsg:4132>epsg:20022 2 OK -0x1.c7dfaff3ac168p24 -0x1.12f6c90ed26f1p24 -0x1.318ebfc54cp8 0x1.c132326724adcp2 -0x1.67fd8b0fc2292p6 0x1.035c7adf1ep9 F +PAIR t23/epsg:4132>epsg:20022 3 OK -0x1.845cd606e0f2ep25 0x1.c436f1b5d5c94p24 -0x1.b13e29971p7 0x1.c132326724ae2p2 0x1.67fd8af9f6a04p6 -0x1.5b94d1274cp8 F +PAIR t23/epsg:4132>epsg:20022 4 OK -0x1.c7c13afc7d47p24 0x1.1368428ebfbf7p24 -0x1.bc9dffe3bp7 0x1.c132326724ae2p2 0x1.67fd8af9d1fdep6 -0x1.6144bc389p8 F +PAIR t23/epsg:4145>epsg:20066 0 OK -0x1.9e89e0c5eb56ap21 0x1.753231f5c46d8p8 -0x1.55e1d877dep9 0x1.0a783c7389566p-8 0x1.067e7f68a0b83p-23 -0x1.d887f4p-5 T +PAIR t23/epsg:4145>epsg:20066 1 OK -0x1.ef3206be58bbep21 -0x1.56735c4978e1bp19 -0x1.87168fd8a8p9 -0x1.3ef880c66d4d2p2 -0x1.401a0f91bf958p2 -0x1.cbc58ap-3 F +PAIR t23/epsg:4145>epsg:20066 2 OK -0x1.4dcee64896d29p21 -0x1.31a20861d2f88p19 -0x1.408322d366p9 0x1.400ee2a04b08ep2 -0x1.40004d65d0099p2 -0x1.9423eap-7 F +PAIR t23/epsg:4145>epsg:20066 3 OK -0x1.ef3059f9bc878p21 0x1.56d5dcaf6679bp19 -0x1.6bd892ac7cp9 -0x1.3ef8791e0f80ep2 0x1.401a179298541p2 -0x1.ef40554p-3 F +PAIR t23/epsg:4145>epsg:20066 4 OK -0x1.4dcde0d8fda89p21 0x1.31fa16e896a3ep19 -0x1.25454d6e1cp9 0x1.400ee2a674f96p2 0x1.40004d82ce49cp2 -0x1.9ab762p-7 F +PAIR t23/epsg:4155>epsg:20079 0 EXC:java.lang.IllegalStateException -0x1.0a841f7f35408p25 0x1.beb186cd5cf15p11 -0x1.9771eedf2p6 NaN NaN NaN F +PAIR t23/epsg:4155>epsg:20079 1 OK -0x1.2f01184171241p25 -0x1.6f53b9406f80bp23 -0x1.1067b5a828p7 -0x1.cb01ad03b75c3p5 -0x1.67fe2c36cc122p6 0x1.9ffb184d04p8 F +PAIR t23/epsg:4155>epsg:20079 2 EXC:java.lang.IllegalStateException -0x1.b69527a34b852p24 -0x1.babbd78390059p22 -0x1.ac3152048p6 NaN NaN NaN F +PAIR t23/epsg:4155>epsg:20079 3 OK -0x1.2efcacb92b8bfp25 0x1.6f95407688a25p23 -0x1.917f51e4cp6 -0x1.cb01ad03b75c3p5 0x1.67fe2c2fc6672p6 0x1.45832ea6cp5 F +PAIR t23/epsg:4155>epsg:20079 4 EXC:java.lang.IllegalStateException -0x1.b68fdd944aaadp24 0x1.bb0b68046941fp22 -0x1.1ce163d06p6 NaN NaN NaN F +PAIR t23/epsg:4168>epsg:20092 0 EXC:java.lang.IllegalStateException 0x1.0633d8c71ea53p28 0x1.dc41ec5641df7p16 -0x1.4e1a911a68p7 NaN NaN NaN F +PAIR t23/epsg:4168>epsg:20092 1 OK 0x1.a057dfabc6cc8p27 -0x1.ee644a992120dp26 -0x1.afdbaff4bp7 -0x1.20b5c910361dfp5 -0x1.67fd7709db79cp6 0x1.299169af14p8 F +PAIR t23/epsg:4168>epsg:20092 2 OK 0x1.216ec26720961p28 -0x1.796d59aa57p27 -0x1.7748e45d48p7 -0x1.20b5c910361dfp5 -0x1.67fd770a9771ap6 0x1.45dacf11ecp8 F +PAIR t23/epsg:4168>epsg:20092 3 OK 0x1.a043ed1e88567p27 0x1.ef0e290e402ddp26 -0x1.232b7ee2bp7 -0x1.20b5c910361dfp5 0x1.67fd76f6baef3p6 -0x1.b7353711fp8 F +PAIR t23/epsg:4168>epsg:20092 4 OK 0x1.21602acff2518p28 0x1.79eeca1d17278p27 -0x1.d531b8e9fp6 -0x1.20b5c910361dfp5 0x1.67fd76f776f18p6 -0x1.9aebe643f4p8 F +PAIR t23/epsg:4192>epsg:2094 0 OK -0x1.c4965c2241b19p24 -0x1.2dcd2858d1f44p10 0x1.8a9d41e4ap5 -0x1.27e451a246146p6 -0x1.5520bb0d7dddbp6 -0x1.ab2388b8p7 F +PAIR t23/epsg:4192>epsg:2094 1 EXC:java.lang.IllegalStateException -0x1.013f9aa22af1p25 -0x1.1d234d77f8d21p23 0x1.24b510ad8p6 NaN NaN NaN F +PAIR t23/epsg:4192>epsg:2094 2 EXC:java.lang.IllegalStateException -0x1.77031535880fap24 -0x1.58e01dd61ed32p22 0x1.56b75c2dcp5 NaN NaN NaN F +PAIR t23/epsg:4192>epsg:2094 3 EXC:java.lang.IllegalStateException -0x1.0141193020007p25 0x1.1d0d112ee9c05p23 0x1.cc77c79eap5 NaN NaN NaN F +PAIR t23/epsg:4192>epsg:2094 4 EXC:java.lang.IllegalStateException -0x1.7704d9e08e275p24 0x1.58c500b587d64p22 0x1.b389b678cp4 NaN NaN NaN F +PAIR t23/epsg:4207>epsg:2392 0 OK -0x1.f026b42344bp17 0x1.029494e6f3bd3p8 -0x1.b30b07a43p7 0x1.e4ca45d5f0f5ep-13 0x1.db8e3133e636cp-27 0x1.bfd1p-13 T +PAIR t23/epsg:4207>epsg:2392 1 OK -0x1.a4a7392d261a8p19 -0x1.349c21a87354ap19 -0x1.dafeb1ca18p7 -0x1.3feb6d8117b3bp2 -0x1.40008b41855d4p2 0x1.13a5cp-12 F +PAIR t23/epsg:4207>epsg:2392 2 OK 0x1.5943bc6fa0c98p18 -0x1.1d7192e0089e1p19 -0x1.d3601adecp7 0x1.40007bee55e27p2 -0x1.3ffffcb750a81p2 0x1.dc77p-14 F +PAIR t23/epsg:4207>epsg:2392 3 OK -0x1.a4a02a63631ap19 0x1.34e2c7a8fcdd9p19 -0x1.8c5c21d488p7 -0x1.3feb6dd414566p2 0x1.40008bb5a159ep2 0x1.69f2cp-12 F +PAIR t23/epsg:4207>epsg:2392 4 OK 0x1.594e12dbebf2p18 0x1.1dac33424dd7dp19 -0x1.84cd05cdf8p7 0x1.40007be91aa43p2 0x1.3ffffccb55a4ep2 0x1.e5f44p-12 F +PAIR t23/epsg:4214>epsg:2468 0 OK -0x1.7564a5bc3d486p22 -0x1.2d1957c92003ep0 -0x1.d112517bp2 0x1.2e3086f854785p-2 -0x1.0e492afc932ccp-23 0x1.ef861acp-4 T +PAIR t23/epsg:4214>epsg:2468 1 OK -0x1.aa1c358a643c2p22 -0x1.de38a6dadba4bp19 -0x1.46178e37p2 -0x1.fc9df2466398ep1 -0x1.58e35e3523ce7p2 0x1.af2e457p-2 F +PAIR t23/epsg:4214>epsg:2468 2 OK -0x1.40334d9dc9bb3p22 -0x1.844f175ded36fp19 -0x1.25af69c28p3 0x1.472374b82f44p2 -0x1.4166f7e411de8p2 0x1.62affd8p-5 F +PAIR t23/epsg:4214>epsg:2468 3 OK -0x1.aa1c36cb85ec4p22 0x1.de385415795f9p19 -0x1.4e58f043p2 -0x1.fc9dfb639394bp1 0x1.58e359a5193bp2 0x1.b96c962p-2 F +PAIR t23/epsg:4214>epsg:2468 4 OK -0x1.40334e5e515ccp22 0x1.844ed3dd0ea4bp19 -0x1.29d01af4p3 0x1.472374772ce44p2 0x1.4166f7a2d0bd8p2 0x1.674e498p-5 F +PAIR t24/epsg:3906>epsg:26703 0 OK 0x1.0b32cb6456a5dp21 0x1.311a8db4b6301p24 -0x1.fce4f357cp6 0x1.a64a39682a9cdp-48 0x1.41150d2249d9cp-48 -0x1.0p-30 F +PAIR t24/epsg:3906>epsg:26703 1 OK 0x1.51516a622f77fp21 -0x1.2824fc961fe48p24 -0x1.349eca291p7 -0x1.3fffffffffff3p2 -0x1.400000000001fp2 0x1.0p-30 F +PAIR t24/epsg:3906>epsg:26703 2 OK 0x1.8a273806dd6aep20 -0x1.288e539cf41f8p24 -0x1.7b1d470f98p7 0x1.3fffffffffff5p2 -0x1.3ffffffffffefp2 0x0.0p0 F +PAIR t24/epsg:3906>epsg:26703 3 OK 0x1.5150681b2a022p21 0x1.282103d112fe6p24 -0x1.1a913eee1p6 -0x1.3fffffffffff4p2 0x1.3fffffffffffcp2 0x1.8p-29 F +PAIR t24/epsg:3906>epsg:26703 4 OK 0x1.8a264942bb662p20 0x1.288a88fff22c8p24 -0x1.a78dbeb4dp6 0x1.3fffffffffff5p2 0x1.3fffffffffff7p2 0x0.0p0 F +PAIR t24/epsg:4132>epsg:26716 0 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.8d8fa04818p7 NaN NaN NaN T +PAIR t24/epsg:4132>epsg:26716 1 OK 0x1.f85f413599504p23 -0x1.e15a49cf95db4p21 -0x1.b433bb3c5p7 -0x1.400193d3dade6p2 -0x1.3ffac77b88c32p2 -0x1.47b32p-9 F +PAIR t24/epsg:4132>epsg:26716 2 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.ed093e9ecp7 NaN NaN NaN F +PAIR t24/epsg:4132>epsg:26716 3 OK 0x1.f846da92b3f11p23 0x1.e1d329c96979fp21 -0x1.2a20590138p7 -0x1.400186bd56b6p2 0x1.3ffacba0d32fp2 0x1.efe29p-10 F +PAIR t24/epsg:4132>epsg:26716 4 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.62f5b3cd08p7 NaN NaN NaN F +PAIR t24/epsg:4145>epsg:26735 0 EXC:java.lang.IllegalStateException 0x1.e2d6d47af721ap28 -0x1.29f7f8adacc43p24 -0x1.370ee3a7a2p9 NaN NaN NaN F +PAIR t24/epsg:4145>epsg:26735 1 OK 0x1.7ffcfc6763bbap28 -0x1.a0579e5843a0dp27 -0x1.5e35d5d61cp9 -0x1.c2252bd0e92fap6 -0x1.67f93abfa28e3p6 0x1.c623a3b48p3 F +PAIR t24/epsg:4145>epsg:26735 2 OK 0x1.0d96e179dd4aap29 -0x1.3d29886f0953cp28 -0x1.22ffadbd72p9 -0x1.c2252bd0e92fap6 -0x1.67f93ac7d8dp6 0x1.093ada838p7 F +PAIR t24/epsg:4145>epsg:26735 3 OK 0x1.7ff39aaad5cb8p28 0x1.55ba899c3a0bap27 -0x1.4a134b8ba8p9 -0x1.c2252bd0e92fap6 0x1.67f93aa263558p6 -0x1.9789ce1e5cp8 F +PAIR t24/epsg:4145>epsg:26735 4 OK 0x1.0d8fc8b6711e8p29 0x1.17f05b093755p28 -0x1.0edd3c1dcap9 -0x1.c2252bd0e92fap6 0x1.67f93aaa99dadp6 -0x1.211daf4fdcp8 F +PAIR t24/epsg:4155>epsg:26748 0 EXC:java.lang.IllegalStateException 0x1.b186a0252d1fdp26 -0x1.5742953b2d989p23 -0x1.4196e511ep5 NaN NaN NaN F +PAIR t24/epsg:4155>epsg:26748 1 OK 0x1.668d186f7a19cp26 -0x1.0407cc2c08678p25 -0x1.b3762108p5 -0x1.806c922999d63p4 -0x1.67ff2abdc73bdp6 0x1.14bc65e6d8p7 F +PAIR t24/epsg:4155>epsg:26748 2 OK 0x1.ebc3dd0a2869ep26 -0x1.76c4f0602adbep25 -0x1.800f919fep5 -0x1.806c922999d63p4 -0x1.67ff2abdd543bp6 0x1.219609c0d8p7 F +PAIR t24/epsg:4155>epsg:26748 3 EXC:java.lang.IllegalStateException 0x1.668a9712d3b94p26 0x1.617baa0f28e93p23 -0x1.068c52bd6p5 NaN NaN NaN F +PAIR t24/epsg:4155>epsg:26748 4 EXC:java.lang.IllegalStateException 0x1.ebbfab15c03e4p26 0x1.96508982425b4p24 -0x1.a64b9da64p4 NaN NaN NaN F +PAIR t24/epsg:4168>epsg:26766 0 OK 0x1.78f7715f6c723p25 -0x1.4c3ac5f53d184p23 -0x1.a591234c1p6 -0x1.4efe87bbd68adp7 0x1.0ffac39ff862ep-2 -0x1.83d88118ap8 T +PAIR t24/epsg:4168>epsg:26766 1 EXC:java.lang.IllegalStateException 0x1.451418ff35eddp25 -0x1.0606bcc1beb8ep24 -0x1.0c52d89d88p7 NaN NaN NaN F +PAIR t24/epsg:4168>epsg:26766 2 EXC:java.lang.IllegalStateException 0x1.a85cc5f63053cp25 -0x1.38772fade8edbp24 -0x1.0135b1b91p7 NaN NaN NaN F +PAIR t24/epsg:4168>epsg:26766 3 EXC:java.lang.IllegalStateException 0x1.45114e3ae6a1dp25 -0x1.18efa61d2ea0ap22 -0x1.381f2a338p6 NaN NaN NaN F +PAIR t24/epsg:4168>epsg:26766 4 EXC:java.lang.IllegalStateException 0x1.a857e225bcb82p25 -0x1.3bd4a2f164785p20 -0x1.21e4e952cp6 NaN NaN NaN F +PAIR t24/epsg:4192>epsg:26779 0 OK 0x1.0969283b8ed66p25 0x1.69acbe0833962p20 -0x1.87f3b6b5p4 -0x1.1576f89077ee3p-46 0x1.cfc722b660eaap-40 0x0.0p0 T +PAIR t24/epsg:4192>epsg:26779 1 OK 0x1.0bdea1037bc8bp25 -0x1.ad1286db1c138p20 0x1.fb5c6328p-1 -0x1.3ffffffffffeep2 -0x1.3fffffffffdffp2 0x1.4p-28 F +PAIR t24/epsg:4192>epsg:26779 2 OK 0x1.21edc92a8bf05p25 0x1.e7d127dbed8b9p20 -0x1.d58a89e4p4 0x1.4000000000003p2 -0x1.3fffffffffe0ap2 0x0.0p0 F +PAIR t24/epsg:4192>epsg:26779 3 OK 0x1.e406a7b1a2ec7p24 0x1.1aabd81ccaaf7p20 -0x1.c983c38fp3 -0x1.400000000000ap2 0x1.3fffffffffep2 0x1.0p-29 F +PAIR t24/epsg:4192>epsg:26779 4 OK 0x1.05d06c0a04e21p25 0x1.146d9f5a1b062p22 -0x1.6513cdc3cp5 0x1.4000000000011p2 0x1.3fffffffffdebp2 0x0.0p0 F +PAIR t24/epsg:4207>epsg:26795 0 OK 0x1.d94e743aa8893p25 -0x1.51ddeb8ad7d7p23 -0x1.e9c78a932p6 0x1.66a7df6f37689p6 0x1.c16d8996b4fafp-1 -0x1.e6a5ec432p7 F +PAIR t24/epsg:4207>epsg:26795 1 EXC:java.lang.IllegalStateException 0x1.93a07d4c3bcf5p25 -0x1.2fd3a33bb87d6p24 -0x1.eb32bcaccp6 NaN NaN NaN F +PAIR t24/epsg:4207>epsg:26795 2 EXC:java.lang.IllegalStateException 0x1.0b33d396bd3c9p26 -0x1.7f4fea8d36f26p24 -0x1.0aa34fe03p7 NaN NaN NaN F +PAIR t24/epsg:4207>epsg:26795 3 EXC:java.lang.IllegalStateException 0x1.939f119110dbdp25 -0x1.10730f3232e08p21 -0x1.a2edce9acp6 NaN NaN NaN F +PAIR t24/epsg:4207>epsg:26795 4 EXC:java.lang.IllegalStateException 0x1.0b3297596c14ep26 0x1.6ba852ba01836p21 -0x1.cd01a9d13p6 NaN NaN NaN F +PAIR t24/epsg:4214>epsg:32007 0 EXC:java.lang.IllegalStateException 0x1.02b6d51f71063p27 -0x1.814839ec04f2ap23 0x1.b3381f43cp5 NaN NaN NaN F +PAIR t24/epsg:4214>epsg:32007 1 OK 0x1.a89feba1e7ac4p26 -0x1.45542a2522521p25 0x1.32bb90dfcp6 0x1.7f5f0f0f4dd4fp6 -0x1.67fe93b917c79p6 -0x1.1cd56ebeb4p8 F +PAIR t24/epsg:4214>epsg:32007 2 OK 0x1.2572df81857a1p27 -0x1.dc729cfe2f9p25 0x1.8ef9dca7ap5 0x1.7f5f0f0f4dd4fp6 -0x1.67fe93b8b3c25p6 -0x1.37a5176184p8 F +PAIR t24/epsg:4214>epsg:32007 3 EXC:java.lang.IllegalStateException 0x1.a8a220071061bp26 0x1.096d9f5e3f551p24 0x1.f2b0c9ec4p5 NaN NaN NaN F +PAIR t24/epsg:4214>epsg:32007 4 OK 0x1.2574b2185bdabp27 0x1.1bca9d01783f6p25 0x1.1c3364ffap5 0x1.7f5f0f0f4dd4fp6 0x1.67fe93bae4469p6 -0x1.42c8997b6p7 F +PAIR t30/epsg:3819>epsg:2012 0 OK 0x1.3e2d80ab3c356p23 0x1.7677539b32f85p10 -0x1.d6efd833d8p7 -0x1.0b5c0afa78832p3 0x1.34577b8a50631p-7 0x1.7eaf2ac6cp4 T +PAIR t30/epsg:3819>epsg:2012 1 OK 0x1.168d3813bbfd9p23 -0x1.1b7abaf93fa1ap20 -0x1.2536b10034p8 -0x1.287cc3660f04ap3 -0x1.d2ce0a51bb2c6p2 0x1.167738faep5 F +PAIR t30/epsg:3819>epsg:2012 2 OK 0x1.645a8a5bf1513p23 -0x1.87db26dcd4c14p20 -0x1.1018774ef8p8 -0x1.3242695a93555p5 -0x1.46c7ef65a0298p5 0x1.d554cbb668p8 F +PAIR t30/epsg:3819>epsg:2012 3 OK 0x1.168a106997615p23 0x1.1c13f7b89163cp20 -0x1.9694c207cp7 -0x1.28a6518e2c85ep3 0x1.d326402bd9aafp2 -0x1.91428c79p2 F +PAIR t30/epsg:3819>epsg:2012 4 OK 0x1.645517ba689b2p23 0x1.88b510f401568p20 -0x1.6c4b1bb33p7 -0x1.330b1834763e4p5 0x1.479441e333d8ap5 -0x1.cbc9a45afp6 F +PAIR t30/epsg:4188>epsg:2025 0 OK 0x1.39f1bdf4ecfa9p24 0x1.f8fcf4b7e2fa9p11 -0x1.b1ff52a6fp6 0x1.5c04bccb87ad3p6 0x1.51d8d69862605p3 0x1.d7e9e94f2p8 F +PAIR t30/epsg:4188>epsg:2025 1 EXC:java.lang.IllegalStateException 0x1.0b0576d5ea577p24 -0x1.723057aae01fp21 -0x1.274c2266bp7 NaN NaN NaN F +PAIR t30/epsg:4188>epsg:2025 2 EXC:java.lang.IllegalStateException 0x1.6282b1e659337p24 -0x1.29334253ab823p22 -0x1.54a526019p7 NaN NaN NaN F +PAIR t30/epsg:4188>epsg:2025 3 EXC:java.lang.IllegalStateException 0x1.0afffd905337fp24 0x1.72ed99de832c6p21 -0x1.89c18e73ap5 NaN NaN NaN F +PAIR t30/epsg:4188>epsg:2025 4 EXC:java.lang.IllegalStateException 0x1.62794899ac1ap24 0x1.29c8421eafffp22 -0x1.1f9934b8p6 NaN NaN NaN F +PAIR t30/epsg:4232>epsg:2081 0 OK 0x1.8d57e8f04fe8fp23 0x1.31438f283b885p23 -0x1.d68e5368ep8 -0x1.69193c7cdfe64p3 0x1.57c54bf3f312cp-8 -0x1.13bfd8088p3 T +PAIR t30/epsg:4232>epsg:2081 1 OK 0x1.63f3359b47772p23 0x1.0c323f532bc03p23 -0x1.e920e0561p8 -0x1.5e92dd4793965p3 -0x1.0e55dbd5c4362p3 0x1.25be19c48p3 F +PAIR t30/epsg:4232>epsg:2081 2 OK 0x1.b50c0b6d82ef9p23 0x1.faeda1e582d7ep22 -0x1.eb0abf028p8 -0x1.cebbe965ce3bcp5 -0x1.dede8491ab99bp5 0x1.ec824a181p6 F +PAIR t30/epsg:4232>epsg:2081 3 OK 0x1.63f2094acc096p23 0x1.565347b382489p23 -0x1.c0eaeb778p8 0x1.e50906d6e9e5dp0 0x1.67fcf1cf3173ep6 -0x1.1c02bcba5p8 F +PAIR t30/epsg:4232>epsg:2081 4 OK 0x1.b50a00b339b1bp23 0x1.6511b5c7af014p23 -0x1.c2d4c9581cp8 0x1.e50906d6e9e5dp0 0x1.67fcf1cf22202p6 -0x1.1dec9a93d8p8 F +PAIR t30/epsg:4289>epsg:2163 0 OK 0x1.211b751fa11bcp23 0x1.207cf61a43edp20 0x1.b4f6f807ecp12 0x1.a698b1d6c02fdp-33 -0x1.1b95b57d052b4p-30 0x1.1c96cp-11 T +PAIR t30/epsg:4289>epsg:2163 1 OK 0x1.235353dfe28c9p23 0x1.1d345c5de2f3cp11 0x1.a7deb4b8dap12 -0x1.3fffffffe03afp2 -0x1.40000000c0197p2 0x1.23c9ap-11 F +PAIR t30/epsg:4289>epsg:2163 2 OK 0x1.3036873594cccp23 0x1.3267fffd5658ep20 0x1.a869a7f3944p12 0x1.400000001e3c6p2 -0x1.400000009489p2 0x1.2618cp-11 F +PAIR t30/epsg:4289>epsg:2163 3 OK 0x1.10e7692323902p23 0x1.0dd8d589f842bp20 0x1.ace8b4a563p12 -0x1.3fffffffba74dp2 0x1.3ffffffe69b46p2 0x1.0d9bcp-11 F +PAIR t30/epsg:4289>epsg:2163 4 OK 0x1.1a3a564a320acp23 0x1.1dc214a7f5a46p21 0x1.ad73a77019cp12 0x1.400000004c8c6p2 0x1.3ffffffe92108p2 0x1.1307ep-11 F +PAIR t30/epsg:4322>epsg:2328 0 OK 0x1.ce49504fd3ep15 0x1.27b33f07a8f03p4 -0x1.c73ec81ap1 0x1.0655febe11082p7 0x1.5f19b3c8b103dp-9 -0x1.58b7p-13 T +PAIR t30/epsg:4322>epsg:2328 1 EXC:java.lang.IllegalStateException -0x1.afbf7ad5279p20 -0x1.52b90a306fbc7p21 -0x1.f93a1a08p1 NaN NaN NaN F +PAIR t30/epsg:4322>epsg:2328 2 EXC:java.lang.IllegalStateException 0x1.f4884b6af0008p20 -0x1.beec941b8c8cfp20 -0x1.f93a1a08p1 NaN NaN NaN F +PAIR t30/epsg:4322>epsg:2328 3 EXC:java.lang.IllegalStateException -0x1.afbedaf99339p20 0x1.52ba65ad75d46p21 -0x1.94d2d34cp1 NaN NaN NaN F +PAIR t30/epsg:4322>epsg:2328 4 EXC:java.lang.IllegalStateException 0x1.f488a6a893c78p20 0x1.beee63413e803p20 -0x1.94d2d34cp1 NaN NaN NaN F +PAIR t30/epsg:4660>epsg:2341 0 OK -0x1.2db1b245dfb5bp24 0x1.81f7959f45899p11 0x1.4e7405b436p10 -0x1.5c0274ebe9bb5p6 0x1.0282b5886249p3 0x1.85103638bap10 F +PAIR t30/epsg:4660>epsg:2341 1 EXC:java.lang.IllegalStateException -0x1.564186f1eb0c5p24 -0x1.293ca4a84e47p22 0x1.4c10041192p10 NaN NaN NaN F +PAIR t30/epsg:4660>epsg:2341 2 EXC:java.lang.IllegalStateException -0x1.fd89f9306ff56p23 -0x1.723b0f8fc2d6ap21 0x1.640e009cdap10 NaN NaN NaN F +PAIR t30/epsg:4660>epsg:2341 3 EXC:java.lang.IllegalStateException -0x1.563bb51d80d1p24 0x1.29abe66de0ae5p22 0x1.34c4a7defbp10 NaN NaN NaN F +PAIR t30/epsg:4660>epsg:2341 4 EXC:java.lang.IllegalStateException -0x1.fd81dd25687c4p23 0x1.72d19a430c381p21 0x1.4cc53aa38ap10 NaN NaN NaN F +PAIR t30/epsg:4691>epsg:2353 0 OK 0x1.7bd7129b52952p23 0x1.313fe593e2e2cp10 0x1.092de0c67cp9 -0x1.7401926557643p6 0x1.7a493ab7c72b8p-1 0x1.75e9f23e98p8 T +PAIR t30/epsg:4691>epsg:2353 1 EXC:java.lang.IllegalStateException 0x1.38c7df3482f86p23 -0x1.bdacefe1fd61ep21 0x1.f3a5898328p8 NaN NaN NaN F +PAIR t30/epsg:4691>epsg:2353 2 EXC:java.lang.IllegalStateException 0x1.c6fab276a760ap23 -0x1.1ca42da16ef46p21 0x1.06d0eb5e42p9 NaN NaN NaN F +PAIR t30/epsg:4691>epsg:2353 3 EXC:java.lang.IllegalStateException 0x1.38ce4274c7886p23 0x1.be09ce955748fp21 0x1.093798310ap9 NaN NaN NaN F +PAIR t30/epsg:4691>epsg:2353 4 EXC:java.lang.IllegalStateException 0x1.c6fe3eed80237p23 0x1.1cdb9e0b5f225p21 0x1.16331c977ap9 NaN NaN NaN F +PAIR t30/epsg:4817>epsg:2366 0 EXC:java.lang.IllegalStateException 0x1.a3ee5169f35cp20 0x1.5e660d4841868p13 -0x1.3d9c45e7ep8 NaN NaN NaN F +PAIR t30/epsg:4817>epsg:2366 1 OK -0x1.cd6cd8f9312ep21 -0x1.c7f504b869d92p23 -0x1.6c20830f08p8 -0x1.1860a96d0a2d8p7 -0x1.67fc021765ad4p6 0x1.46580c5b14p9 F +PAIR t30/epsg:4817>epsg:2366 2 EXC:java.lang.IllegalStateException 0x1.1404905153e76p23 -0x1.12aeb46648d46p23 -0x1.65455419acp8 NaN NaN NaN F +PAIR t30/epsg:4817>epsg:2366 3 OK -0x1.ccab4defeeep21 0x1.c8bba0937d7ecp23 -0x1.196417df68p8 0x1.1a2421172424fp7 0x1.67fd169ec921ap6 -0x1.ab24310e18p7 F +PAIR t30/epsg:4817>epsg:2366 4 EXC:java.lang.IllegalStateException 0x1.142432607fa34p23 0x1.13312ce767bb5p23 -0x1.127c7ef81cp8 NaN NaN NaN F +PAIR t31/epsg:3819>epsg:2048 0 OK 0x1.07119b131d799p21 -0x1.40b285093cb6dp9 -0x1.4c230bafe8p7 0x1.019ac8d5da0fp-15 -0x1.b26d6ef785f22p-28 0x1.5ec2cp-10 T +PAIR t31/epsg:3819>epsg:2048 1 OK 0x1.4eb8366f7ea24p21 0x1.273772728a459p19 -0x1.c338c11fbp7 -0x1.3ffc47769cda7p2 -0x1.3ffffdea3dd04p2 0x1.14382p-11 F +PAIR t31/epsg:3819>epsg:2048 2 OK 0x1.7ed2170e5944ep20 0x1.15e93a668f342p19 -0x1.98fc394be8p7 0x1.400009c3c6ddcp2 -0x1.3fffff9476eb4p2 0x1.de466p-10 F +PAIR t31/epsg:3819>epsg:2048 3 OK 0x1.4eb76f80e5f99p21 -0x1.27d9a8efa4eeap19 -0x1.0f641319c8p7 -0x1.3ffc4772a9f17p2 0x1.3ffffdd76f486p2 0x1.67354p-12 F +PAIR t31/epsg:3819>epsg:2048 4 OK 0x1.7ed1b182321edp20 -0x1.1687b2abc8e86p19 -0x1.ca34fc352p6 0x1.400009c401edap2 0x1.3fffff8abd758p2 0x1.b22eap-10 F +PAIR t31/epsg:4188>epsg:2108 0 EXC:java.lang.IllegalStateException -0x1.3b6ee78dea65bp28 0x1.4a2d59bde2d43p22 -0x1.38cb731d4p5 NaN NaN NaN F +PAIR t31/epsg:4188>epsg:2108 1 OK 0x1.380d264034226p28 -0x1.95528df685664p27 -0x1.402f37532p6 0x1.43327d610a7c8p7 -0x1.67fb464df18f3p6 0x1.d01552261ap9 F +PAIR t31/epsg:4188>epsg:2108 2 OK -0x1.f4aefcdbfb964p27 -0x1.30fb8d6cc7aap27 -0x1.9ae14b77p6 0x1.43327edab88ffp7 -0x1.67fb464ce1ae7p6 0x1.c4bf15b054p9 F +PAIR t31/epsg:4188>epsg:2108 3 OK 0x1.37f6a958f6506p28 0x1.a9ea6a4de1e7ep27 0x1.2602a7p4 0x1.509d8d348b0c9p7 0x1.67fb8b43850f9p6 -0x1.9a69bb708p6 F +PAIR t31/epsg:4188>epsg:2108 4 OK -0x1.f48bd4186197fp27 0x1.4560be38ee154p27 -0x1.137bd8d7p2 0x1.509d8b8b915bdp7 0x1.67fb8b4274f7ep6 -0x1.f521f244dp6 F +PAIR t31/epsg:4232>epsg:2121 0 EXC:java.lang.IllegalStateException -0x1.0526706fcce95p28 0x1.56ffcd592a40ap22 -0x1.b71ca6d5ep7 NaN NaN NaN F +PAIR t31/epsg:4232>epsg:2121 1 OK -0x1.205ac66ccad8ap28 -0x1.6e976de37d0f9p27 -0x1.dda3995dap7 0x1.e50906d73de91p0 -0x1.67fcf1df34f7fp6 0x1.c7abb0cfc8p7 F +PAIR t31/epsg:4232>epsg:2121 2 OK -0x1.9e4d848394846p27 -0x1.d8de3d603d031p26 -0x1.e17756c47p7 0x1.e50906d73de91p0 -0x1.67fcf1df25a4cp6 0x1.c3d7f3772p7 F +PAIR t31/epsg:4232>epsg:2121 3 OK -0x1.205270ca0c764p28 0x1.840d585b90942p27 -0x1.8d3845fcf8p7 0x1.e50906d73de91p0 0x1.67fcf1d207bf6p6 -0x1.82ab7f01b8p7 F +PAIR t31/epsg:4232>epsg:2121 4 OK -0x1.9e421ffe7ded6p27 0x1.01cb9d6efadf8p27 -0x1.910c01cc58p7 0x1.e50906d73de91p0 0x1.67fcf1d1f86bbp6 -0x1.867f3ac2ep7 F +PAIR t31/epsg:4289>epsg:2134 0 OK -0x1.edc9bed5ba04p18 0x1.c9b1cd898d9bfp24 -0x1.2920f0af4p7 0x1.a6918836ac6e9p-33 -0x1.1b957fbe75a09p-30 0x1.1c96cp-11 F +PAIR t31/epsg:4289>epsg:2134 1 OK 0x1.b6eb5e53bc79p15 -0x1.2028cbef397f2p23 -0x1.8a8bfc5a58p7 -0x1.3fffffffe03bep2 -0x1.40000000c019ap2 0x1.23c9ap-11 F +PAIR t31/epsg:4289>epsg:2134 2 OK -0x1.049bc01004bebp20 -0x1.1faf0f0bec24ep23 -0x1.792d27b0b8p7 0x1.400000001e3bap2 -0x1.4000000094877p2 0x1.2618ap-11 F +PAIR t31/epsg:4289>epsg:2134 3 OK 0x1.b6f1c9880a07p15 0x1.c13dd7bc3a0d5p24 -0x1.d07b54d4cp6 -0x1.3fffffffba74dp2 0x1.3ffffffe69b31p2 0x1.0d9bcp-11 F +PAIR t31/epsg:4289>epsg:2134 4 OK -0x1.049a9d4fe18fdp20 0x1.c100e46e3e9b8p24 -0x1.adc06412ep6 0x1.400000004c8a9p2 0x1.3ffffffe920fbp2 0x1.1307ep-11 F +PAIR t31/epsg:4322>epsg:2150 0 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.1cfb206p-1 NaN NaN NaN T +PAIR t31/epsg:4322>epsg:2150 1 OK 0x1.9ef787ef17e4p23 -0x1.194301781199cp21 -0x1.e50234c8p-1 -0x1.3fffffa69ba5cp2 -0x1.40000333c05f2p2 0x1.7f9p-15 F +PAIR t31/epsg:4322>epsg:2150 2 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.e50234c8p-1 NaN NaN NaN F +PAIR t31/epsg:4322>epsg:2150 3 OK 0x1.9ef76da9e67b5p23 0x1.1944104b71fb3p21 -0x1.4d9468cp-3 -0x1.3fffffa6aa91cp2 0x1.40000333bcd3ep2 0x1.7e8ap-15 F +PAIR t31/epsg:4322>epsg:2150 4 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.4d9468cp-3 NaN NaN NaN F +PAIR t31/epsg:4660>epsg:2193 0 EXC:java.lang.IllegalStateException -0x1.161470d7b4141p28 0x1.358db9cddaa08p23 0x1.4f3405b435p10 NaN NaN NaN F +PAIR t31/epsg:4660>epsg:2193 1 OK -0x1.32bbdfb390763p28 -0x1.8687bb0870b49p27 0x1.4cd000d981p10 -0x1.3d9cb49988595p7 -0x1.67ecc2c5858cfp6 0x1.060abfd88ap9 F +PAIR t31/epsg:4660>epsg:2193 2 OK -0x1.b8c76ddb8696ep27 -0x1.f455fcd31c51ap26 0x1.64cdfd64e8p10 -0x1.3d9cbd4117f28p7 -0x1.67ecc2cf8371ap6 0x1.360684146p9 F +PAIR t31/epsg:4660>epsg:2193 3 OK -0x1.32acc17064ecep28 0x1.ad40f76307265p27 0x1.3584a4a46dp10 -0x1.6d543e1742d0ep6 0x1.67fcd1ecacbp6 0x1.7a28d7391cp10 F +PAIR t31/epsg:4660>epsg:2193 4 OK -0x1.b8afdeaa28c64p27 0x1.20b960de04542p27 0x1.4d853768e7p10 -0x1.6d51c46f7211dp6 0x1.67fcd1f1df762p6 0x1.92294f8d18p10 F +PAIR t31/epsg:4691>epsg:22174 0 OK 0x1.9ca2f6f24ed5ap23 0x1.314031467a9dfp23 0x1.0aade0c67cp9 -0x1.b272a2ce1301dp1 0x1.04273d794abecp-10 0x1.2769eafcp3 T +PAIR t31/epsg:4691>epsg:22174 1 OK 0x1.7998a920f9a8fp23 0x1.11d83502ccdd4p23 0x1.f6a57c9ffp8 -0x1.a597d3e528296p2 -0x1.6b1e7c4626185p2 0x1.cc50dcccp2 F +PAIR t31/epsg:4691>epsg:22174 2 OK 0x1.bec068e3cd334p23 0x1.0740063d48775p23 0x1.0850e4ec92p9 -0x1.39d58788144bp3 -0x1.e8ccfe555d7d9p3 0x1.4d8a59808p6 F +PAIR t31/epsg:4691>epsg:22174 3 OK 0x1.7998057e184cbp23 0x1.50a7575e10a53p23 0x1.0ab791bcap9 -0x1.ec999379dba45p6 0x1.67fd42da84708p6 0x1.05f323168p7 F +PAIR t31/epsg:4691>epsg:22174 4 OK 0x1.bebf58ec454c4p23 0x1.5b411c33466b7p23 0x1.17b316232ap9 -0x1.ec997f38b5e49p6 0x1.67fd42db1be36p6 0x1.39e11107e8p7 F +PAIR t31/epsg:4817>epsg:2224 0 EXC:java.lang.IllegalStateException 0x1.5cfc438466504p27 -0x1.55b512d719a3p23 -0x1.3a9c45e7ep8 NaN NaN NaN F +PAIR t31/epsg:4817>epsg:2224 1 OK 0x1.1b50c1be42998p27 -0x1.bce7596330f3ap25 -0x1.69208fef6p8 -0x1.1860a96a3f959p7 -0x1.67fc021765d48p6 0x1.465b59515p9 F +PAIR t31/epsg:4817>epsg:2224 2 OK 0x1.8b4447d042f7cp27 -0x1.532fec608914cp26 -0x1.624560f984p8 -0x1.1860a684a25ep7 -0x1.67fc02178e9adp6 0x1.49c8ef6712p9 F +PAIR t31/epsg:4817>epsg:2224 3 OK 0x1.1b456d47a553p27 0x1.11c09a17e28d4p25 -0x1.166424cb94p8 0x1.1a242111e68edp7 0x1.67fd169ec9418p6 -0x1.ab16fd4cdp7 F +PAIR t31/epsg:4817>epsg:2224 4 OK 0x1.8b30ba27edf45p27 0x1.fbb0c500586e4p25 -0x1.0f7c8be4c4p8 0x1.1a241b95b6592p7 0x1.67fd169eea8a1p6 -0x1.9d47d11dfp7 F +PAIR t32/epsg:3819>epsg:2006 0 OK 0x1.1872f8ac877cdp23 0x1.4380bbc4f7496p9 -0x1.02791c2d9p7 -0x1.63b4a956edf9ap1 0x1.2b843a22c0499p-10 0x1.220cf818p-1 T +PAIR t32/epsg:3819>epsg:2006 1 OK 0x1.eca616c7e72p22 -0x1.e98a09e92036ap19 -0x1.2cb733cf78p7 -0x1.91b6993392fe5p2 -0x1.60c4d42415715p2 0x1.af66a7ccp1 F +PAIR t32/epsg:3819>epsg:2006 2 OK 0x1.39be8e8e5bb2ap23 -0x1.44fd4b4ab3813p20 -0x1.2eee9434c8p7 -0x1.b072ed1f16fbp2 -0x1.99f7002e5ad05p3 0x1.cfae6a838p4 F +PAIR t32/epsg:3819>epsg:2006 3 OK 0x1.eca35bf4bfc62p22 0x1.ea0f2899b5259p19 -0x1.c01ee5ac7p6 -0x1.91bec189a7088p2 0x1.60cebdc70b59p2 -0x1.14f711a8p-1 F +PAIR t32/epsg:3819>epsg:2006 4 OK 0x1.39bc44b833b1ep23 0x1.455b901fc234bp20 -0x1.c472ccfaap6 -0x1.b10fcd19b959cp2 0x1.9a4b5b781e149p3 -0x1.e30d64dap4 F +PAIR t32/epsg:4188>epsg:20355 0 OK -0x1.9e7a355a3a84bp21 0x1.c9b1e93d4773ep24 0x1.1f8d572c6p6 -0x1.4a2b6e4b6561ep-32 -0x1.ea0c10fd0383dp-31 0x1.1721p-14 F +PAIR t32/epsg:4188>epsg:20355 1 OK -0x1.4dc1050905eccp21 -0x1.1df6a6851e7a4p23 0x1.35f99987p5 -0x1.400000006c8bfp2 -0x1.40000001009p2 0x1.7d7cp-14 F +PAIR t32/epsg:4188>epsg:20355 2 OK -0x1.ef2acf4df462cp21 -0x1.1ba86ed875e1cp23 0x1.868760738p4 0x1.3fffffffd29e1p2 -0x1.400000010bb3ap2 0x1.4fb8p-14 F +PAIR t32/epsg:4188>epsg:20355 3 OK -0x1.4dbfd2c6a030ap21 0x1.c024956f7432p24 0x1.bcc8dd15fp6 -0x1.4000000078e4p2 0x1.3fffffff286c5p2 0x1.e2f4p-15 F +PAIR t32/epsg:4188>epsg:20355 4 OK -0x1.ef28c66781cf4p21 0x1.befd15c8f4569p24 0x1.836763f1p6 0x1.3fffffffcda6ap2 0x1.3fffffff224bp2 0x1.7d34p-15 F +PAIR t32/epsg:4232>epsg:2044 0 EXC:java.lang.IllegalStateException -0x1.4774d215a165cp23 0x1.d557a7f7d36cp11 -0x1.360ad7f3fcp8 NaN NaN NaN F +PAIR t32/epsg:4232>epsg:2044 1 EXC:java.lang.IllegalStateException -0x1.bf600fd7c6bfcp23 -0x1.0eee3fb49ecf8p23 -0x1.584d4db3c8p8 NaN NaN NaN F +PAIR t32/epsg:4232>epsg:2044 2 EXC:java.lang.IllegalStateException -0x1.6484b85c489p22 -0x1.4810d2e7948c3p22 -0x1.4767aa26c8p8 NaN NaN NaN F +PAIR t32/epsg:4232>epsg:2044 3 EXC:java.lang.IllegalStateException -0x1.bf4d7c734f058p23 0x1.0f33760b3b36p23 -0x1.2537c082bcp8 NaN NaN NaN F +PAIR t32/epsg:4232>epsg:2044 4 EXC:java.lang.IllegalStateException -0x1.646ec9c60443p22 0x1.4865549693213p22 -0x1.145225e378p8 NaN NaN NaN F +PAIR t32/epsg:4289>epsg:2064 0 OK 0x1.6f872fb18445cp20 0x1.d57659b080e8dp8 -0x1.db84266c2p7 0x1.a69694c32faep-33 -0x1.1b9617622de5ep-30 0x1.1c96cp-11 T +PAIR t32/epsg:4289>epsg:2064 1 OK 0x1.ccba3097ac7cdp19 -0x1.0e45e8ea59488p19 -0x1.064c8c9d78p8 -0x1.3fffffffe03bfp2 -0x1.40000000c0196p2 0x1.23c9ap-11 F +PAIR t32/epsg:4289>epsg:2064 2 OK 0x1.f8b0d03f5eb6ap20 -0x1.15e1e6af252cfp19 -0x1.2a95b55594p8 0x1.400000001e3bp2 -0x1.4000000094879p2 0x1.2618ap-11 F +PAIR t32/epsg:4289>epsg:2064 3 OK 0x1.ccb9c679bc10dp19 0x1.0eb9ef85e1932p19 -0x1.67236bf24p7 -0x1.3fffffffba74bp2 0x1.3ffffffe69b3bp2 0x1.0d9c2p-11 F +PAIR t32/epsg:4289>epsg:2064 4 OK 0x1.f8afa71779544p20 0x1.165898eebdd1bp19 -0x1.afb6d27a38p7 0x1.400000004c8b4p2 0x1.3ffffffe9210bp2 0x1.1307ap-11 F +PAIR t32/epsg:4322>epsg:2079 0 OK -0x1.cdbd1d45d63c6p20 0x1.504b9e47cb97bp7 -0x1.0f660df9d8p7 0x1.1c136a492acb2p-47 0x0.0p0 0x1.81f4p-15 T +PAIR t32/epsg:4322>epsg:2079 1 OK -0x1.2f697b5d1cdfdp21 -0x1.2c385d991bd03p19 -0x1.3c556d3eap7 -0x1.400000000000bp2 -0x1.3ffffffff611fp2 0x1.7f0cp-15 F +PAIR t32/epsg:4322>epsg:2079 2 OK -0x1.3ca2adf815e8bp20 -0x1.18acbcc38acc4p19 -0x1.19ee88adc8p7 0x1.3fffffffffff8p2 -0x1.3ffffffff611cp2 0x1.7f14p-15 F +PAIR t32/epsg:4322>epsg:2079 3 OK -0x1.2f69050581173p21 0x1.2c63cc1e16e0bp19 -0x1.059cd585bp7 -0x1.3fffffffffff9p2 0x1.3ffffffff611dp2 0x1.7f0ep-15 F +PAIR t32/epsg:4322>epsg:2079 4 OK -0x1.3ca22be96d4ecp20 0x1.18d55fb606609p19 -0x1.c66bf5629p6 0x1.4000000000002p2 0x1.3ffffffff611fp2 0x1.7f1p-15 F +PAIR t32/epsg:4660>epsg:2092 0 OK 0x1.5fddd88ea5e84p21 0x1.25b783b1febeap9 0x1.4733c2af3ep10 0x1.2e2e4d71edd6dp-2 0x1.c10e9c45d3271p-15 -0x1.aaba15c2p1 T +PAIR t32/epsg:4660>epsg:2092 1 OK 0x1.ece51d0b167f4p20 -0x1.ddcf16585ff7cp19 0x1.432084d7d1p10 -0x1.fcb2809256231p1 -0x1.58dc93ede112dp2 -0x1.0e2a9d034p4 F +PAIR t32/epsg:4660>epsg:2092 2 OK 0x1.ca3a5acc9de14p21 -0x1.83f5172fcb71bp19 0x1.611be15d26p10 0x1.4723614e2efcbp2 -0x1.4166bc55e7071p2 -0x1.20b5e12p0 F +PAIR t32/epsg:4660>epsg:2092 3 OK 0x1.ece8fbedb40ecp20 0x1.de6a002226fcfp19 0x1.28e9b9f74ap10 -0x1.fc9e0f34712f2p1 0x1.58e42d09fc102p2 -0x1.1854db548p3 F +PAIR t32/epsg:4660>epsg:2092 4 OK 0x1.ca3c808598aecp21 0x1.847f8d6b90fe7p19 0x1.46e7b5edc3p10 0x1.4723f0b4ad771p2 0x1.416733d5bf64ep2 -0x1.55193d8p-1 F +PAIR t32/epsg:4691>epsg:21100 0 OK 0x1.2df826af35b38p24 0x1.b796b499e59c9p19 0x1.9c8eb223adp10 -0x1.fed8e4a5a08fp-28 -0x1.600e8de93782ep-28 0x1.4a438p-11 T +PAIR t32/epsg:4691>epsg:21100 1 OK 0x1.2580e2c4f6132p24 0x1.5454ca17895aap18 0x1.a1bacd9043p10 -0x1.400000088d15bp2 -0x1.400000062ea98p2 0x1.cffep-11 F +PAIR t32/epsg:4691>epsg:21100 2 OK 0x1.366f593759a3p24 0x1.544e5f7da6cfcp18 0x1.8aaa2f0eecp10 0x1.3ffffff951e2p2 -0x1.40000006e9f1cp2 0x1.3f16ep-11 F +PAIR t32/epsg:4691>epsg:21100 3 OK 0x1.2580f3638485cp24 0x1.62829b42409bap20 0x1.ab9a95f166p10 -0x1.400000091fb95p2 0x1.3ffffffbe37c4p2 0x1.6e51ap-11 F +PAIR t32/epsg:4691>epsg:21100 4 OK 0x1.366f6b6a7a775p24 0x1.62820306744a7p20 0x1.9488b2ec66p10 0x1.3ffffff8e992bp2 0x1.3ffffffba442ep2 0x1.a844cp-12 F +PAIR t32/epsg:4817>epsg:21418 0 OK -0x1.3748c74e89058p21 0x1.1a5b729ead9dfp12 -0x1.9966dc2038p8 -0x1.56e543acad068p6 0x1.030b6af5a1dbcp4 0x1.347dac056cp8 F +PAIR t32/epsg:4817>epsg:21418 1 EXC:java.lang.IllegalStateException -0x1.44bc1b4b854d4p22 -0x1.3c70b67a5090ap22 -0x1.dca353f9b8p8 NaN NaN NaN F +PAIR t32/epsg:4817>epsg:21418 2 EXC:java.lang.IllegalStateException 0x1.4af130a12dd2p19 -0x1.8868ef3051c27p21 -0x1.baedbddc3p8 NaN NaN NaN F +PAIR t32/epsg:4817>epsg:21418 3 EXC:java.lang.IllegalStateException -0x1.44969a16ab2a8p22 0x1.3d13a15f88871p22 -0x1.7b8ebf6b54p8 NaN NaN NaN F +PAIR t32/epsg:4817>epsg:21418 4 EXC:java.lang.IllegalStateException 0x1.4ba944bbed5ap19 0x1.894364b3673e3p21 -0x1.59ccdbc9d8p8 NaN NaN NaN F +PAIR t33/epsg:3819>epsg:20009 0 OK 0x1.5fe7965019d4p21 0x1.1147b6ca314cfp10 -0x1.291f61e9b8p8 0x1.2e0b6664ed3d3p-2 0x1.d17d1541812bp-14 -0x1.4adbf938p0 T +PAIR t33/epsg:3819>epsg:20009 1 OK 0x1.ecf0f034ee624p20 -0x1.dd92dc887350fp19 -0x1.76f8a7c17cp8 -0x1.fcc479926296ep1 -0x1.58d5e0c4d55e9p2 -0x1.fbd4c9bp-1 F +PAIR t33/epsg:3819>epsg:20009 2 OK 0x1.ca44140b7e4eap21 -0x1.83c6e111d2f15p19 -0x1.4b202d83f4p8 0x1.472223dad4e92p2 -0x1.416647d55c089p2 -0x1.29cbe8ep-3 F +PAIR t33/epsg:3819>epsg:20009 3 OK 0x1.ed005717a8248p20 0x1.debb1bbce0244p19 -0x1.0ed707e308p8 -0x1.fca1f33fc3cb4p1 0x1.58e5ce6f0f7p2 -0x1.22309d0f8p3 F +PAIR t33/epsg:3819>epsg:20009 4 OK 0x1.ca48b5e37cde4p21 0x1.84c03e405425ap19 -0x1.c5f045c168p7 0x1.472329963d16dp2 0x1.41672bcbcd3c3p2 -0x1.33aff49p-1 F +PAIR t33/epsg:4188>epsg:20022 0 EXC:java.lang.IllegalStateException -0x1.4356144688bc8p25 0x1.b97a7b9fa6164p14 -0x1.5451ee5b78p7 NaN NaN NaN F +PAIR t33/epsg:4188>epsg:20022 1 OK -0x1.84763699ac25ep25 -0x1.c3596cd0f599ep24 -0x1.cad3a6ebc8p7 0x1.6029d589a33a9p7 -0x1.67fbbb09ffb71p6 0x1.e4d4bc9522p9 F +PAIR t33/epsg:4188>epsg:20022 2 OK -0x1.c7e81014338fep24 -0x1.12e546feac37fp24 -0x1.cab85ea3d8p7 0x1.6029d5888b68bp7 -0x1.67fbbb0a004cdp6 0x1.e4db8ea36p9 F +PAIR t33/epsg:4188>epsg:20022 3 OK -0x1.84548206e961ep25 0x1.c457a586bb7c9p24 -0x1.d31973518p6 -0x1.5fca1cb6390f4p7 0x1.67fbd9a0c3e32p6 -0x1.a4050d4d8p7 F +PAIR t33/epsg:4188>epsg:20022 4 OK -0x1.c7be4437d98aap24 0x1.137f844e046aep24 -0x1.d2e9924b9p6 -0x1.5fca1cb535164p7 0x1.67fbd9a0c466ap6 -0x1.a3ed1cd7bp7 F +PAIR t33/epsg:4232>epsg:20066 0 OK -0x1.9ea31640013b2p21 0x1.74d509ce27242p8 -0x1.5e9e2bffb8p8 0x1.0ae5f08979824p-8 0x1.06eeb6fc4ff33p-23 -0x1.15abc6p-7 T +PAIR t33/epsg:4232>epsg:20066 1 OK -0x1.ef4edd015b266p21 -0x1.5674433b0a963p19 -0x1.843075d394p8 -0x1.3ef8155169382p2 -0x1.401a1e81bb2f6p2 -0x1.f2d0c8p-7 F +PAIR t33/epsg:4232>epsg:20066 2 OK -0x1.4de4db295747bp21 -0x1.31a166cc1081ap19 -0x1.6f5f6649ap8 0x1.400ee929b81eap2 -0x1.40004da2754e5p2 -0x1.238998p-9 F +PAIR t33/epsg:4232>epsg:20066 3 OK -0x1.ef4d3095fbaf4p21 0x1.56d6ab4bf50a8p19 -0x1.4dc36c5d9cp8 -0x1.3ef80da6b9667p2 0x1.401a2685443d6p2 -0x1.0a98dap-5 F +PAIR t33/epsg:4232>epsg:20066 4 OK -0x1.4de3d5efd6944p21 0x1.31f95f29d540ap19 -0x1.38f2688bccp8 0x1.400ee92ff067fp2 0x1.40004dbf83305p2 -0x1.3de53p-9 F +PAIR t33/epsg:4289>epsg:20079 0 EXC:java.lang.IllegalStateException -0x1.0a85071d3d382p25 0x1.2368237d7acbdp13 -0x1.179fa58aecp8 NaN NaN NaN F +PAIR t33/epsg:4289>epsg:20079 1 OK -0x1.2f043e91b64b9p25 -0x1.6f20e130e4576p23 -0x1.5aa3986e64p8 -0x1.44c01ad0b7911p7 -0x1.67fae6fa87fb1p6 0x1.dea8a6400ap9 F +PAIR t33/epsg:4289>epsg:20079 2 EXC:java.lang.IllegalStateException -0x1.b69c77006a6ddp24 -0x1.ba844ece98963p22 -0x1.3b3a0e46ap8 NaN NaN NaN F +PAIR t33/epsg:4289>epsg:20079 3 OK -0x1.2ef8a20ba216dp25 0x1.6fcc1e296f9e2p23 -0x1.f68a122138p7 -0x1.41590185ed858p7 0x1.67faa3fcbcb67p6 -0x1.4df5c6c3cp5 F +PAIR t33/epsg:4289>epsg:20079 4 EXC:java.lang.IllegalStateException -0x1.b68ea0410581cp24 0x1.bb53671d33299p22 -0x1.b7b889733p7 NaN NaN NaN F +PAIR t33/epsg:4322>epsg:20092 0 EXC:java.lang.IllegalStateException 0x1.06338cf0e7decp28 0x1.963f3c1ef13cbp14 -0x1.073e06066p7 NaN NaN NaN F +PAIR t33/epsg:4322>epsg:20092 1 OK 0x1.a04fd7a152545p27 -0x1.eea988f17b66fp26 -0x1.2ca3861dap7 -0x1.3da4c1d46169fp6 -0x1.67fec77bb0f73p6 0x1.6b3adc03cp5 F +PAIR t33/epsg:4322>epsg:20092 2 OK 0x1.21681db0edfd8p28 -0x1.79a0ef84c1f55p27 -0x1.fe5c9cff1p6 -0x1.3da4c1d46169fp6 -0x1.67fec77bf9b4bp6 0x1.1087da94fp6 F +PAIR t33/epsg:4322>epsg:20092 3 OK 0x1.a04b96a229c2dp27 0x1.eecdc26d5ab1bp26 -0x1.0ea2d8c968p7 -0x1.3da4c1d46169fp6 0x1.67fec779ba1e3p6 -0x1.bedc10268p6 F +PAIR t33/epsg:4322>epsg:20092 4 OK 0x1.2165011102a6ep28 0x1.79bc89c6ab1cfp27 -0x1.c25b5072p6 -0x1.3da4c1d46169fp6 0x1.67fec77a02dc9p6 -0x1.63f1b1aebp6 F +PAIR t33/epsg:4660>epsg:2094 0 EXC:java.lang.IllegalStateException -0x1.c49289805afa1p24 0x1.6e057b0918eb4p12 0x1.504f2a82cbp10 NaN NaN NaN F +PAIR t33/epsg:4660>epsg:2094 1 EXC:java.lang.IllegalStateException -0x1.013ffdefd4b99p25 -0x1.1cd03fc420a88p23 0x1.4df5a3d8aep10 NaN NaN NaN F +PAIR t33/epsg:4660>epsg:2094 2 EXC:java.lang.IllegalStateException -0x1.7708f8eae71a4p24 -0x1.587cbd6c0d96ap22 0x1.65f3a0c683p10 NaN NaN NaN F +PAIR t33/epsg:4660>epsg:2094 3 EXC:java.lang.IllegalStateException -0x1.013a037ce83fep25 0x1.1d394e4cd160bp23 0x1.369515ae07p10 NaN NaN NaN F +PAIR t33/epsg:4660>epsg:2094 4 EXC:java.lang.IllegalStateException -0x1.770098e8f50c7p24 0x1.5906917a3233ep22 0x1.4e95a8e84p10 NaN NaN NaN F +PAIR t33/epsg:4691>epsg:2392 0 OK -0x1.efc7342b18bcp17 0x1.8b5d1a12ba2efp8 0x1.70e2b18ec8p8 0x1.e48933adbcaap-13 0x1.a0557ea3b87b5p-27 -0x1.088p-18 T +PAIR t33/epsg:4691>epsg:2392 1 OK -0x1.a48a60452845p19 -0x1.3481736408553p19 0x1.405ac46c68p8 -0x1.3feb704e7b9dp2 -0x1.40008b06f740fp2 -0x1.1c9474p-8 F +PAIR t33/epsg:4691>epsg:2392 2 OK 0x1.5961fc2b7649p18 -0x1.1d5ba5b6414c4p19 0x1.68aada15dcp8 0x1.40007bdba3f49p2 -0x1.3ffffcbe2564bp2 0x1.4da14p-11 F +PAIR t33/epsg:4691>epsg:2392 3 OK -0x1.a47f1c1888378p19 0x1.34ee00fbff18fp19 0x1.74648667fcp8 -0x1.3feb70dc00ff6p2 0x1.40008bab9d7b8p2 -0x1.28b14cp-8 F +PAIR t33/epsg:4691>epsg:2392 4 OK 0x1.5972f69953f88p18 0x1.1db4c0ee87107p19 0x1.9ca788ef24p8 0x1.40007bd2a5f7ap2 0x1.3ffffcc7b7e46p2 0x1.9b2f6p-11 F +PAIR t33/epsg:4817>epsg:2468 0 OK -0x1.0d138913590e5p22 0x1.89f41a745d45ep9 -0x1.a4e43c326p8 0x1.b8280dfeb856dp-6 0x1.759066003c84p-19 -0x1.2fb8d98p-4 T +PAIR t33/epsg:4817>epsg:2468 1 OK -0x1.39457ca17b15ep22 -0x1.7eff1b7ef3547p19 -0x1.e6199f239cp8 -0x1.39f57192001e2p2 -0x1.411f7f2111b26p2 -0x1.27fa796p-3 F +PAIR t33/epsg:4817>epsg:2468 2 OK -0x1.c18a67fedf4a6p21 -0x1.4a67d5a368d7dp19 -0x1.c81f26fd18p8 0x1.4080b0d60e2e2p2 -0x1.400978efe719ap2 -0x1.119c54p-7 F +PAIR t33/epsg:4817>epsg:2468 3 OK -0x1.394431d5973b4p22 0x1.7fcb80cb746f4p19 -0x1.8525f95c44p8 -0x1.39f4aa29df061p2 0x1.412009e817d72p2 -0x1.edb4589p-2 F +PAIR t33/epsg:4817>epsg:2468 4 OK -0x1.c1890bd895b36p21 0x1.4b253901668f8p19 -0x1.671f2fe464p8 0x1.4080b9903a149p2 0x1.40097d4957a9dp2 -0x1.163471p-6 F +PAIR t34/epsg:3819>epsg:26703 0 OK 0x1.0b2770282a26fp21 0x1.311a0b12608efp24 -0x1.d6efd833d8p7 0x1.17be0087b7a1bp-26 -0x1.470682e2467fdp-28 0x1.6fd86p-10 F +PAIR t34/epsg:3819>epsg:26703 1 OK 0x1.5145c4f6cbeccp21 -0x1.282577c793291p24 -0x1.2536b10034p8 -0x1.3ffffff0195a9p2 -0x1.400000079c31ep2 0x1.3e7cfp-10 F +PAIR t34/epsg:3819>epsg:26703 2 OK 0x1.8a100837350eep20 -0x1.288edf0f79858p24 -0x1.1018774ef8p8 0x1.40000011e876fp2 -0x1.4000000673fc8p2 0x1.df45fp-10 F +PAIR t34/epsg:3819>epsg:26703 3 OK 0x1.51454b23edb86p21 0x1.28208a7ba6823p24 -0x1.9694c207cp7 -0x1.3fffffef8c644p2 0x1.3ffffffcf5342p2 0x1.0bf4cp-10 F +PAIR t34/epsg:3819>epsg:26703 4 OK 0x1.8a102359012a2p20 0x1.2889fe6f34c3dp24 -0x1.6c4b1bb33p7 0x1.400000129cccp2 0x1.3ffffffd0db03p2 0x1.b2aeep-10 F +PAIR t34/epsg:4188>epsg:26716 0 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.b1ff52a6fp6 NaN NaN NaN T +PAIR t34/epsg:4188>epsg:26716 1 OK 0x1.f8673713079f5p23 -0x1.e149fe4b13d5dp21 -0x1.274c2266bp7 -0x1.40019643dc87cp2 -0x1.3ffac56ad77cap2 -0x1.9996bp-9 F +PAIR t34/epsg:4188>epsg:26716 2 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.54a526019p7 NaN NaN NaN F +PAIR t34/epsg:4188>epsg:26716 3 OK 0x1.f8440defe9d0dp23 0x1.e1f9db47ebd85p21 -0x1.89c18e73ap5 -0x1.4001833df2192p2 0x1.3ffacb5793579p2 0x1.9674d8p-9 F +PAIR t34/epsg:4188>epsg:26716 4 EXC:java.lang.IllegalStateException Infinity Infinity -0x1.1f9934b8p6 NaN NaN NaN F +PAIR t34/epsg:4232>epsg:26735 0 EXC:java.lang.IllegalStateException 0x1.e2bd065c1bc9dp28 -0x1.29f8addf40aeap24 -0x1.20f4b9cc0cp8 NaN NaN NaN F +PAIR t34/epsg:4232>epsg:26735 1 OK 0x1.7fe7e74fa2cffp28 -0x1.a0330757c5aep27 -0x1.326b7f719cp8 0x1.e50906d711a28p0 -0x1.67fcf1d7d1f1bp6 -0x1.08eeb4bap3 F +PAIR t34/epsg:4232>epsg:26735 2 OK 0x1.0d8a6176de4cfp29 -0x1.3d124a04122c1p28 -0x1.34555e12c8p8 0x1.e50906d711a28p0 -0x1.67fcf1d7c29e4p6 -0x1.462a87fcp3 F +PAIR t34/epsg:4232>epsg:26735 3 OK 0x1.7fde89ca4e05ep28 0x1.5595d24ee7e2ap27 -0x1.0a3511fc9cp8 0x1.e50906d711a28p0 0x1.67fcf1caa47f9p6 -0x1.ad7249c9d8p8 F +PAIR t34/epsg:4232>epsg:26735 4 OK 0x1.0d834bba45cfdp29 0x1.17d90449fac3dp28 -0x1.0c1eefd204p8 0x1.e50906d711a28p0 0x1.67fcf1ca952bap6 -0x1.af5c27983p8 F +PAIR t34/epsg:4289>epsg:26748 0 EXC:java.lang.IllegalStateException 0x1.b1852e5579417p26 -0x1.56b549bdee7c1p23 -0x1.b3edbd5318p7 NaN NaN NaN F +PAIR t34/epsg:4289>epsg:26748 1 OK 0x1.66908f2175301p26 -0x1.03efef84b6cd2p25 -0x1.08e012ce4cp8 -0x1.6044289ac70a7p7 -0x1.67fae7c730fe1p6 0x1.53d9d72032p9 F +PAIR t34/epsg:4289>epsg:26748 2 OK 0x1.ebc56ca45ede9p26 -0x1.769a1835305cep25 -0x1.0030a7dd4cp8 -0x1.604428d2778c2p7 -0x1.67fae7c7a7706p6 0x1.58318b6f12p9 F +PAIR t34/epsg:4289>epsg:26748 3 EXC:java.lang.IllegalStateException 0x1.66876818a6bfp26 0x1.61e6acc3cc2ap23 -0x1.6f6ecde48p7 NaN NaN NaN F +PAIR t34/epsg:4289>epsg:26748 4 EXC:java.lang.IllegalStateException 0x1.ebb625e0e5fbcp26 0x1.96a0608573dd1p24 -0x1.5e11580818p7 NaN NaN NaN F +PAIR t34/epsg:4322>epsg:26766 0 OK 0x1.78f717ff86852p25 -0x1.4c5de5cafa297p23 -0x1.17d38fda6p6 -0x1.4efc90bc66e25p7 0x1.e676422c182c3p-9 -0x1.02788p-12 T +PAIR t34/epsg:4322>epsg:26766 1 EXC:java.lang.IllegalStateException 0x1.4512b93b17486p25 -0x1.0614e84304fdep24 -0x1.122f19a78p6 NaN NaN NaN F +PAIR t34/epsg:4322>epsg:26766 2 EXC:java.lang.IllegalStateException 0x1.a85969458f31ap25 -0x1.388c1ab849cebp24 -0x1.122f19a78p6 NaN NaN NaN F +PAIR t34/epsg:4322>epsg:26766 3 EXC:java.lang.IllegalStateException 0x1.4512af3de08cfp25 -0x1.192466d5d16b4p22 -0x1.0f0bd02b8p6 NaN NaN NaN F +PAIR t34/epsg:4322>epsg:26766 4 EXC:java.lang.IllegalStateException 0x1.a85957c707185p25 -0x1.3d1b48b9a8f43p20 -0x1.0f0bd02b8p6 NaN NaN NaN F +PAIR t34/epsg:4660>epsg:26779 0 OK 0x1.09666de6b0431p25 0x1.6a1421f6dc8a2p20 0x1.3dda6c1f54p10 0x1.316bdeaf3558ap-22 0x1.821cdb1c20b3ap-23 0x1.abc65ecp-3 T +PAIR t34/epsg:4660>epsg:26779 1 OK 0x1.0bdc22bdab4b5p25 -0x1.ac78975e62e28p20 0x1.3be9794d2fp10 -0x1.3ffffe0e4649p2 -0x1.3ffffeccb4ec9p2 0x1.93a496p-3 F +PAIR t34/epsg:4660>epsg:26779 2 OK 0x1.21e969b8a4326p25 0x1.e837c65f6bf4dp20 0x1.53e7711f85p10 0x1.40000104ec055p2 -0x1.3fffff603c1e5p2 0x1.afce802p-3 F +PAIR t34/epsg:4660>epsg:26779 3 OK 0x1.e403e86f90f6cp24 0x1.1b0e49867bb2cp20 0x1.249e75dd79p10 -0x1.3ffffea874565p2 0x1.400000e452ec1p2 0x1.a77ec62p-3 F +PAIR t34/epsg:4660>epsg:26779 4 OK 0x1.05cdc09f86e8cp25 0x1.147c3b9702697p22 0x1.3c9f0b92f6p10 0x1.40000064eeb0cp2 0x1.4000003e40bfdp2 0x1.b8091dp-3 F +PAIR t34/epsg:4691>epsg:26795 0 OK 0x1.d953e38bc22afp25 -0x1.51c9f7200faf9p23 0x1.cff55b2bb8p8 0x1.66acf4794e59ap6 0x1.f019bf02cfcafp0 0x1.d56232294p5 F +PAIR t34/epsg:4691>epsg:26795 1 EXC:java.lang.IllegalStateException 0x1.93a70990c753dp25 -0x1.2fcbdd7771454p24 0x1.b30bc64868p8 NaN NaN NaN F +PAIR t34/epsg:4691>epsg:26795 2 EXC:java.lang.IllegalStateException 0x1.0b36ee972d4dp26 -0x1.7f4359427197cp24 0x1.cd081a0678p8 NaN NaN NaN F +PAIR t34/epsg:4691>epsg:26795 3 EXC:java.lang.IllegalStateException 0x1.93a43423021bfp25 -0x1.102ed10067e9dp21 0x1.d1d6368cd4p8 NaN NaN NaN F +PAIR t34/epsg:4691>epsg:26795 4 EXC:java.lang.IllegalStateException 0x1.0b34a37f48588p26 0x1.6bf6e2b4c9073p21 0x1.ebcd36e3fcp8 NaN NaN NaN F +PAIR t34/epsg:4817>epsg:32007 0 EXC:java.lang.IllegalStateException 0x1.7314970c92e97p27 -0x1.7f234248cc272p23 -0x1.8002ac33a4p8 NaN NaN NaN F +PAIR t34/epsg:4817>epsg:32007 1 OK 0x1.2c9141d55909ap27 -0x1.ea2daff92a3d7p25 -0x1.acbaac1044p8 -0x1.18610d2eae022p7 -0x1.67fc0211e98d9p6 0x1.a09957e72cp8 F +PAIR t34/epsg:4817>epsg:32007 2 OK 0x1.a4228090ae2bep27 -0x1.7488b3aca8ac5p26 -0x1.a5df8f287p8 -0x1.18610a49125f3p7 -0x1.67fc021212545p6 0x1.a7747204bp8 F +PAIR t34/epsg:4817>epsg:32007 3 OK 0x1.2c84e152a19adp27 0x1.2a485accb5b9p25 -0x1.59fc9ad2e4p8 0x1.1a24dca3a8f69p7 0x1.67fd169a570afp6 -0x1.c1a73348e8p8 F +PAIR t34/epsg:4817>epsg:32007 4 OK 0x1.a40d395ba1eacp27 0x1.14d75c37748ecp26 -0x1.5314f058ep8 0x1.1a24d72761038p7 0x1.67fd169a7854bp6 -0x1.babf8b9e5p8 F +PAIR t40/epsg:4267>epsg:2012 0 OK -0x1.12b9c8c663236p21 0x1.5145e25f35277p22 0x0.0p0 -0x1.8fdf080df8729p6 0x1.6807b3bc72554p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2012 1 OK -0x1.7ab9aee1cd544p21 0x1.40e66c1955d51p22 0x0.0p0 -0x1.ab625eb31ba91p6 0x1.404b050295237p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2012 2 OK -0x1.ca4b59779b0c8p20 0x1.2205feb54b38fp22 0x0.0p0 -0x1.73b536956fa32p6 0x1.40006a9667f79p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2012 3 OK -0x1.2e1b2d0e006a3p21 0x1.8285d697bf5c2p22 0x0.0p0 -0x1.aad98e456b5c5p6 0x1.905920432f1f9p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2012 4 OK -0x1.6faac4b726adbp20 0x1.6582365d7ea57p22 0x0.0p0 -0x1.73b3f29c4f0bp6 0x1.90007c605cf94p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2163 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2163 1 OK -0x1.25efa53e11a82p19 -0x1.02d3143da8abep19 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2163 2 OK 0x1.25efa53e11a82p19 -0x1.02d3143da8abep19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2163 3 OK -0x1.ed3389a61b7abp18 0x1.1a650a24bbb2fp19 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2163 4 OK 0x1.ed3389a61b7abp18 0x1.1a650a24bbb2fp19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2353 0 OK -0x1.66edb7a88dfa8p25 -0x1.1275b36289124p25 0x0.0p0 0x1.5cp6 -0x1.68p6 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2353 1 OK -0x1.179039150d489p25 0x1.0d8b532f4f769p24 0x0.0p0 0x1.5cp6 0x1.68p6 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2353 2 OK 0x1.21ca00a1f5b76p27 0x1.1f1520ab12452p21 0x0.0p0 -0x1.74p6 0x1.33e9f52a4e824p34 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2353 3 OK -0x1.1f91d1ea23e8cp23 -0x1.bce88cc3ce7fap24 0x0.0p0 0x1.5cp6 -0x1.68p6 0x0.0p0 F +PAIR t40/epsg:4267>epsg:2353 4 OK 0x1.7952fba6777e2p26 -0x1.1f1e31b5be99cp26 0x0.0p0 0x1.5cp6 -0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2025 0 OK -0x1.e29814048b348p17 0x1.31abfc4c2d50dp22 0x0.0p0 -0x1.8fffffff5d64p6 0x1.67fffffeb223p5 0x0.0p0 F +PAIR t40/esri:104000>epsg:2025 1 OK -0x1.b6d4cc604972cp19 0x1.142e012e9617bp22 0x0.0p0 -0x1.ac48c4614ed2ap6 0x1.3ffffff2c5b3cp5 0x0.0p0 F +PAIR t40/esri:104000>epsg:2025 2 OK 0x1.2f9513abd6081p18 0x1.0e513994a3a8bp22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 F +PAIR t40/esri:104000>epsg:2025 3 OK -0x1.56d5097afdda4p19 0x1.57f95b2acaa01p22 0x0.0p0 -0x1.ac48c31a27546p6 0x1.8fffffe2846bfp5 0x0.0p0 F +PAIR t40/esri:104000>epsg:2025 4 OK 0x1.2ea1bab82fb23p18 0x1.5223b18cc61dcp22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +PAIR t40/esri:104000>epsg:2328 0 OK -0x1.3e7968e8286a6p26 -0x1.ae0a36bee803ep25 0x0.0p0 0x1.44p6 -0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2328 1 OK -0x1.14cd946c0acabp26 0x1.880597f9940f4p23 0x0.0p0 0x1.44p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2328 2 OK 0x1.a1e0df35719efp26 0x1.46c835e970defp23 0x0.0p0 0x1.44p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2328 3 OK -0x1.11d2174cc4634p25 -0x1.5b7cb7df735bdp25 0x0.0p0 0x1.44p6 -0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2328 4 OK 0x1.080c3a4201c1ap26 -0x1.8d226fe223dd9p25 0x0.0p0 0x1.44p6 -0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2366 0 OK 0x1.096dd9ce3ac03p25 0x1.6c611b07caae3p23 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2366 1 OK 0x1.2f956ee4fd957p25 0x1.2158457cfe2bcp24 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2366 2 OK 0x1.9f4fc88768b34p24 0x1.4bede26b4300bp24 0x0.0p0 0x1.f8p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:104000>epsg:2366 3 OK 0x1.35512548516b4p25 0x1.31875ee7b86bbp23 0x0.0p0 -0x1.bp5 -0x1.1d3f3325095b4p53 0x0.0p0 F +PAIR t40/esri:104000>epsg:2366 4 OK 0x1.f319746e2d616p24 0x1.1390587f00a27p22 0x0.0p0 -0x1.bp5 0x1.7e0936d58bda1p7 0x0.0p0 F +PAIR t40/esri:4267>epsg:2081 0 OK 0x1.dd5709f08718p15 0x1.d85939948b141p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2081 1 OK -0x1.7bd8ef5951e98p19 0x1.cfab47f3b0a43p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2081 2 OK 0x1.b4f6c73b0925p18 0x1.c11c74fbfb3ddp23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2081 3 OK -0x1.5f82652bcabfp17 0x1.f0a755b99ee23p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2081 4 OK 0x1.83dce8bf1ef8ap19 0x1.e2e57a9a3b912p23 0x0.0p0 -0x1.14p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2341 0 OK -0x1.bda1bb1ea344cp25 -0x1.3a109c01da317p24 0x0.0p0 0x1.74p6 -0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2341 1 OK -0x1.739a70e465a65p25 0x1.395f9ee4ad1a5p24 0x0.0p0 0x1.74p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2341 2 OK -0x1.6ae69ad372f4fp26 0x1.41ccb2c8647e1p23 0x0.0p0 0x1.74p6 0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2341 3 OK -0x1.ba19f52bb814cp24 -0x1.ff1430be5361ep23 0x0.0p0 0x1.74p6 -0x1.68p6 0x0.0p0 F +PAIR t40/esri:4267>epsg:2341 4 OK -0x1.a01483861b4ecp25 -0x1.90d45bd615cbp25 0x0.0p0 0x1.74p6 -0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2048 0 OK 0x1.e0d59b19f4fbp18 -0x1.911f5d9e78d35p23 0x0.0p0 0x1.3p4 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2048 1 OK -0x1.0a99a67460e7bp21 -0x1.1e2f54c79cf9ep24 0x0.0p0 0x1.3p4 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2048 2 OK 0x1.c5ab6f34c42eep21 -0x1.d0b2c2fa76fbbp23 0x0.0p0 0x1.3p4 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2048 3 OK -0x1.8a7cebd2bfc8ep20 -0x1.36a3827532dddp23 0x0.0p0 0x1.3p4 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2048 4 OK 0x1.24d9ed08322f4p21 -0x1.58c4df335749dp23 0x0.0p0 0x1.3p4 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2134 0 OK 0x1.75c144e9d4d5ap22 0x1.2f727252c1d0cp24 0x0.0p0 -0x1.9000000000006p6 0x1.67fffffffffd8p5 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2134 1 OK 0x1.a0f01014e060fp22 0x1.2109104ec248ep24 0x0.0p0 -0x1.ac48c6001f10cp6 0x1.4000000000047p5 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2134 2 OK 0x1.a3f3cb9652c36p22 0x1.3d53a37fe3738p24 0x0.0p0 -0x1.73b739ffe0eddp6 0x1.3fffffffffff7p5 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2134 3 OK 0x1.43ab11986996bp22 0x1.25b96cf432d44p24 0x0.0p0 -0x1.ac48c6001f0b2p6 0x1.8fffffffffffep5 0x0.0p0 F +PAIR t41/epsg:4267>epsg:2134 4 OK 0x1.457a862acd3f8p22 0x1.39c3b0878a15fp24 0x0.0p0 -0x1.73b739ffe0f4cp6 0x1.8fffffffffffcp5 0x0.0p0 F +PAIR t41/epsg:4267>epsg:22174 0 OK 0x1.85c092467934ep20 0x1.df1cf22ac081p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:22174 1 OK 0x1.58185e30d41bp19 0x1.d887e5dd5fca2p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:22174 2 OK 0x1.d6be94f7fbefp20 0x1.c64878f1160cap23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:22174 3 OK 0x1.5c1f82d7d101p20 0x1.f8b0a8036b282p23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t41/epsg:4267>epsg:22174 4 OK 0x1.21f98a9452409p21 0x1.e7dd06dbe879cp23 0x0.0p0 -0x1.f8p5 0x1.68p6 0x0.0p0 F +PAIR t41/esri:104000>epsg:2108 0 OK 0x1.65ab9b17041d7p22 0x1.bc4de28366317p23 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:104000>epsg:2108 1 OK 0x1.8fcd3afb8acbcp22 0x1.9d404afb35518p23 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:104000>epsg:2108 2 OK 0x1.9e330a200094fp22 0x1.e0d9decf10deap23 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:104000>epsg:2108 3 OK 0x1.326ce776c3c54p22 0x1.a9861ec7b7f01p23 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:104000>epsg:2108 4 OK 0x1.300b85d52d8dcp22 0x1.d0714d5b77804p23 0x0.0p0 0x1.6158e38e38e38p7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:104000>epsg:2150 0 OK -0x1.e6d94ec959a5p19 0x1.3b0c994a090acp22 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2150 1 OK -0x1.a804cd57410d4p20 0x1.22fff3334d69bp22 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2150 2 OK -0x1.fb53fa7161c6ap18 0x1.127221c08aaf8p22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.3fffffffffffep5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2150 3 OK -0x1.4ad70f31bf3bcp20 0x1.666d9ddb5d54fp22 0x0.0p0 -0x1.ac48c6001f0abp6 0x1.9000000000001p5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2150 4 OK -0x1.5982cd5b68afep18 0x1.563c0c5c7d3f1p22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9000000000002p5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2224 0 OK 0x1.03ca92754f51fp22 0x1.49c0dd28fb6f5p22 0x0.0p0 -0x1.900001ce79d02p6 0x1.67ffffe7756bbp5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2224 1 OK 0x1.39f0f950b2dc7p21 0x1.987825ab5af73p21 0x0.0p0 -0x1.ac48c60038c78p6 0x1.3fffffff37596p5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2224 2 OK 0x1.8ffafce78cde9p22 0x1.e566ca94fb7c4p21 0x0.0p0 -0x1.73b7815bec8f4p6 0x1.40000ab0bdb27p5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2224 3 OK 0x1.15231c402fc09p21 0x1.aac13c94b2c4p22 0x0.0p0 -0x1.ac48c600cbffp6 0x1.8ffffffee7461p5 0x0.0p0 F +PAIR t41/esri:104000>epsg:2224 4 OK 0x1.545a5848ec08ap22 0x1.d0bec66fd76cp22 0x0.0p0 -0x1.73b7b0681c407p6 0x1.90000c1d87277p5 0x0.0p0 F +PAIR t41/esri:4267>epsg:2121 0 OK 0x1.620e3bfad20a3p22 0x1.dc861a4110029p23 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:4267>epsg:2121 1 OK 0x1.9c41020027e98p22 0x1.c0eb9c2ad617ep23 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:4267>epsg:2121 2 OK 0x1.8fca298e3bc5ap22 0x1.06862278c092ep24 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:4267>epsg:2121 3 OK 0x1.36b4993583391p22 0x1.c40b50255eeep23 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:4267>epsg:2121 4 OK 0x1.200892c01a28ep22 0x1.ea2cb6f7d9c55p23 0x0.0p0 0x1.55f59e26af37bp7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:4267>epsg:2193 0 OK 0x1.ad9971419eba8p22 0x1.2e45e8cab1b36p24 0x0.0p0 -0x1.bfffffffffffdp2 0x1.dc1e703268555p34 0x0.0p0 F +PAIR t41/esri:4267>epsg:2193 1 OK 0x1.e1c37d1b7f719p22 0x1.1fbc509604fdcp24 0x0.0p0 -0x1.bfffffffffffdp2 0x1.402b7d1caad52p18 0x0.0p0 F +PAIR t41/esri:4267>epsg:2193 2 OK 0x1.dfbf7cdd1d7d5p22 0x1.44431ade43032p24 0x0.0p0 0x1.5ap7 0x1.68p6 0x0.0p0 F +PAIR t41/esri:4267>epsg:2193 3 OK 0x1.7f01d19d73fd5p22 0x1.2313cde2b9721p24 0x0.0p0 -0x1.bfffffffffffdp2 0x1.05021c2276b1p17 0x0.0p0 F +PAIR t41/esri:4267>epsg:2193 4 OK 0x1.70172b03969efp22 0x1.3664ad60e403ep24 0x0.0p0 0x1.5ap7 0x1.68p6 0x0.0p0 F +PAIR t42/epsg:4267>epsg:2006 0 OK -0x1.3acfab24c1fc5p21 0x1.5e17d80491699p22 -0x1.f60a8d79ep6 -0x1.8f46aeb82d47ap6 0x1.68325a29f03d3p5 -0x1.37d8e43p-2 F +PAIR t42/epsg:4267>epsg:2006 1 OK -0x1.a8b26b26bf9f3p21 0x1.51b5523337d23p22 -0x1.fb1361017p6 -0x1.a7db3f52d250cp6 0x1.419c2b671dfe5p5 -0x1.0763c1cap1 F +PAIR t42/epsg:4267>epsg:2006 2 OK -0x1.138a7f4e87cdap21 0x1.2be95287f061p22 -0x1.7b9bdcd58p6 -0x1.73a82d492dffdp6 0x1.4003e409a7927p5 -0x1.8a8e7ap-6 F +PAIR t42/epsg:4267>epsg:2006 3 OK -0x1.4e1091a852c53p21 0x1.91a23ae8831ddp22 -0x1.33232867ep7 -0x1.a54044cb1af26p6 0x1.91eb0bbee2c54p5 -0x1.7604220ap1 F +PAIR t42/epsg:4267>epsg:2006 4 OK -0x1.b5a6864202214p20 0x1.6ef08e1a4164p22 -0x1.fb512e398p6 -0x1.739f04a81229fp6 0x1.9004966f987d2p5 -0x1.1a3b7fp-5 F +PAIR t42/epsg:4267>epsg:2064 0 OK -0x1.38bc9e9237135p22 0x1.3480d4708aa8p23 0x1.899b8ce578p7 -0x1.9000000000008p6 0x1.67fffffffffd2p5 0x1.0p-29 F +PAIR t42/epsg:4267>epsg:2064 1 OK -0x1.63eaee04d9f4p22 0x1.51533fb5ed97cp23 0x1.82fe03bep7 -0x1.ac48c6001f11cp6 0x1.4000000000051p5 0x0.0p0 F +PAIR t42/epsg:4267>epsg:2064 2 OK -0x1.66ee38e773228p22 0x1.18bea756b92ffp23 0x1.9c7fdfe32p7 -0x1.73b739ffe0edp6 0x1.3fffffffffff7p5 0x0.0p0 F +PAIR t42/epsg:4267>epsg:2064 3 OK -0x1.06a713f391023p22 0x1.47f2f08769c38p23 0x1.709991c758p7 -0x1.ac48c6001f0b5p6 0x1.8fffffffffffep5 -0x1.0p-30 F +PAIR t42/epsg:4267>epsg:2064 4 OK -0x1.08765847d5b86p22 0x1.1fde6dc7cbf39p23 0x1.8600c3c958p7 -0x1.73b739ffe0f4ep6 0x1.8fffffffffffbp5 0x0.0p0 F +PAIR t42/epsg:4267>epsg:21100 0 OK 0x1.0950b620097cdp23 0x1.8b1462afa3681p22 0x1.1829178babp10 -0x1.9000000000001p6 0x1.67ffffffffff5p5 0x1.0p-29 F +PAIR t42/epsg:4267>epsg:21100 1 OK 0x1.e2bd2c24c077bp22 0x1.5d48fddf756p22 0x1.1a74c98959p10 -0x1.ac48c6001f0aap6 0x1.3ffffffffffe5p5 -0x1.0p-30 F +PAIR t42/epsg:4267>epsg:21100 2 OK 0x1.2141ef9c4073ep23 0x1.5d476b5491237p22 0x1.31895fe2a6p10 -0x1.73b739ffe0f56p6 0x1.3ffffffffffe8p5 -0x1.0p-28 F +PAIR t42/epsg:4267>epsg:21100 3 OK 0x1.e2bf587035a3fp22 0x1.bd1aa37b8042fp22 0x1.fc44af7c1p9 -0x1.ac48c6001f0aep6 0x1.8fffffffff9ep5 0x0.0p0 F +PAIR t42/epsg:4267>epsg:21100 4 OK 0x1.2142bbc7d9862p23 0x1.bd18681c1c553p22 0x1.11805f14dbp10 -0x1.73b739ffe0f54p6 0x1.8fffffffff9ep5 0x0.0p0 F +PAIR t42/esri:104000>epsg:20355 0 OK 0x1.4d421f5b5f994p22 0x1.55695eb4f5754p24 -0x1.c6940ca398p7 -0x1.9000000000008p6 0x1.6800000000005p5 0x1.0p-29 F +PAIR t42/esri:104000>epsg:20355 1 OK 0x1.8dcb3947474e2p22 0x1.4fe181c6573acp24 -0x1.a905f033ep7 -0x1.ac48c6001f0dp6 0x1.400000000003ep5 0x0.0p0 F +PAIR t42/esri:104000>epsg:20355 2 OK 0x1.55767cafa4489p22 0x1.658971c2776b4p24 -0x1.7a6338c798p7 -0x1.73b739ffe0f57p6 0x1.3fffffffffff4p5 0x0.0p0 F +PAIR t42/esri:104000>epsg:20355 3 OK 0x1.37f06263c4dcfp22 0x1.4731c7afd1ae7p24 -0x1.0595754938p8 -0x1.ac48c6001f0aap6 0x1.9000000000004p5 -0x1.0p-29 F +PAIR t42/esri:104000>epsg:20355 4 OK 0x1.1322ef08f05bap22 0x1.57ed9f816aaafp24 -0x1.e408ffce5p7 -0x1.73b739ffe0f55p6 0x1.9000000000001p5 0x1.0p-30 F +PAIR t42/esri:104000>epsg:2079 0 OK -0x1.e6c75d2b2762ep21 0x1.8dbff2f548dc6p23 -0x1.cc4b709c4p7 -0x1.8fffffffffffep6 0x1.67ffffffffffbp5 0x0.0p0 F +PAIR t42/esri:104000>epsg:2079 1 OK -0x1.e2f399a761a2cp21 0x1.ac83d992f7ad1p23 -0x1.e53dac3c2p7 -0x1.ac48c6001f0adp6 0x1.3ffffffffffffp5 0x1.0p-30 F +PAIR t42/esri:104000>epsg:2079 2 OK -0x1.33822c2df3757p22 0x1.88b811b3cd978p23 -0x1.c0b12ec0f8p7 -0x1.73b739ffe0f45p6 0x1.3ffffffffffedp5 0x0.0p0 F +PAIR t42/esri:104000>epsg:2079 3 OK -0x1.75a0523bca683p21 0x1.8e2e13b196736p23 -0x1.d2d3167e48p7 -0x1.ac48c6001f0adp6 0x1.9000000000001p5 0x1.0p-30 F +PAIR t42/esri:104000>epsg:2079 4 OK -0x1.d069491e89916p21 0x1.710917fe70dbcp23 -0x1.b42809dc3p7 -0x1.73b739ffe0f54p6 0x1.9000000000004p5 -0x1.0p-30 F +PAIR t42/esri:104000>epsg:21418 0 EXC:java.lang.IllegalStateException -0x1.b576cf757770ep23 -0x1.cc2555e447b5dp19 -0x1.9c2da192ep7 NaN NaN NaN F +PAIR t42/esri:104000>epsg:21418 1 OK -0x1.816ff95c79b84p22 0x1.5412b5d426892p24 -0x1.84dcf5004p7 -0x1.50a0f0f0b3dc1p6 0x1.67fe93c03f3b2p6 0x1.3e9ac616p1 F +PAIR t42/esri:104000>epsg:21418 2 OK -0x1.153e0d78ed1b9p25 0x1.2cbb3700b8cdfp24 -0x1.94d8a43128p7 -0x1.50a0f0f0b3dc1p6 0x1.67fe93c0216c3p6 -0x1.60288311p2 F +PAIR t42/esri:104000>epsg:21418 3 EXC:java.lang.IllegalStateException 0x1.71fbe376e63b4p21 -0x1.81d1b961663aap19 -0x1.a0e64671dp7 NaN NaN NaN F +PAIR t42/esri:104000>epsg:21418 4 OK -0x1.af6e79b5a5718p23 -0x1.3cfd74da3e328p24 -0x1.ae4fa2bc28p7 -0x1.50a0f0f0b3dc1p6 -0x1.67fe93c257df2p6 0x1.24baf08e3p7 F +PAIR t42/esri:4267>epsg:2044 0 EXC:java.lang.IllegalStateException -0x1.b582ac5bbfe74p23 -0x1.cbe2486d86897p19 -0x1.8056613508p7 NaN NaN NaN F +PAIR t42/esri:4267>epsg:2044 1 OK -0x1.817d207108c84p22 0x1.541882970629bp24 -0x1.69f394773p7 -0x1.8cbad90635c33p6 0x1.67fefe7d0796ap6 0x1.1ed4ef0eap5 F +PAIR t42/esri:4267>epsg:2044 2 OK -0x1.1540b81ecec09p25 0x1.2cc7604c55bd7p24 -0x1.6a8ac3aafp7 -0x1.8cbad90635c33p6 0x1.67fefe7d06cf5p6 0x1.1c78323fap5 F +PAIR t42/esri:4267>epsg:2044 3 EXC:java.lang.IllegalStateException 0x1.71d940e74c3ecp21 -0x1.8209beb1f22e9p19 -0x1.935827ac78p7 NaN NaN NaN F +PAIR t42/esri:4267>epsg:2044 4 OK -0x1.af7e85ad6e4dap23 -0x1.3d00ec22bbec4p24 -0x1.93d703d5bp7 -0x1.8cbad90635c33p6 -0x1.67fefe7e1964ap6 0x1.1761288dap7 F +PAIR t42/esri:4267>epsg:2092 0 EXC:java.lang.IllegalStateException 0x1.118b4e48c3d2ep25 0x1.80145695b0e48p21 -0x1.37826e63ecp8 NaN NaN NaN F +PAIR t42/esri:4267>epsg:2092 1 OK 0x1.9d461e728decap25 0x1.424d629d2a654p24 -0x1.2b0828ffb4p8 -0x1.db5ee24c6c85p6 0x1.67fe8e44a49ap6 0x1.7982bcba6p5 F +PAIR t42/esri:4267>epsg:2092 2 OK 0x1.b1c4df01b8bd4p24 0x1.50db9fcae2f5bp24 -0x1.216f5a4018p8 -0x1.db5ee24c6c85p6 0x1.67fe8e44c8efap6 0x1.c64932b6cp5 F +PAIR t42/esri:4267>epsg:2092 3 OK 0x1.15ce0a5593b87p25 -0x1.9e7487ef8c268p23 -0x1.4a1050c3ecp8 -0x1.db5ee24c6c85p6 -0x1.67fe8e4233c2dp6 -0x1.d75f40b05p6 F +PAIR t42/esri:4267>epsg:2092 4 EXC:java.lang.IllegalStateException 0x1.47cd47003a5eap24 0x1.39e1520ce5ce4p21 -0x1.4202c90fb8p8 NaN NaN NaN F +PAIR t43/epsg:4267>epsg:20009 0 EXC:java.lang.IllegalStateException 0x1.118d15bb9957cp25 0x1.7fb17f8cf351dp21 -0x1.778ce603d8p7 NaN NaN NaN F +PAIR t43/epsg:4267>epsg:20009 1 OK 0x1.9d4ac902030d5p25 0x1.4235db5abf128p24 -0x1.5cadfcd218p7 -0x1.3da4997d0d553p6 0x1.67fec77f44dffp6 0x1.5ebff7ebcp4 F +PAIR t43/epsg:4267>epsg:20009 2 OK 0x1.b1cbad6c00b1bp24 0x1.50ce84803740bp24 -0x1.6e57f26438p7 -0x1.3da4997d0d553p6 0x1.67fec77f289cbp6 0x1.a2e09ac98p3 F +PAIR t43/epsg:4267>epsg:20009 3 OK 0x1.15ce8d7d58579p25 -0x1.9e872999a02b9p23 -0x1.7f1151f798p7 -0x1.3da4997d0d553p6 -0x1.67fec78117d66p6 0x1.4fb21af99p7 F +PAIR t43/epsg:4267>epsg:20009 4 EXC:java.lang.IllegalStateException 0x1.47ce4c6dfb64cp24 0x1.39b5c331c5551p21 -0x1.8de3baacd8p7 NaN NaN NaN F +PAIR t43/epsg:4267>epsg:20079 0 EXC:java.lang.IllegalStateException -0x1.5e4fbebc3bd5cp24 0x1.26f4700c1eb11p22 -0x1.778ce603d8p7 NaN NaN NaN F +PAIR t43/epsg:4267>epsg:20079 1 OK -0x1.e317b520aa3cbp23 0x1.4d9dd0200b29ep24 -0x1.5cadfcd218p7 -0x1.3da4997d100fdp6 0x1.67fec77f44dffp6 0x1.5ebff7ebcp4 F +PAIR t43/epsg:4267>epsg:20079 2 OK -0x1.2e479b8bdf7a8p25 0x1.4972184a89219p24 -0x1.6e57f26438p7 -0x1.3da4997d100fdp6 0x1.67fec77f289cbp6 0x1.a2e09ac98p3 F +PAIR t43/epsg:4267>epsg:20079 3 EXC:java.lang.IllegalStateException -0x1.2edc49a9ada24p23 0x1.e4724e81ffa59p21 -0x1.7f1151f798p7 NaN NaN NaN F +PAIR t43/epsg:4267>epsg:20079 4 OK -0x1.6b875bc0cb18bp24 -0x1.40197af520acbp23 -0x1.8de3baacd8p7 -0x1.3da4997d100fdp6 -0x1.67fec781001f7p6 0x1.40dfb27b18p7 F +PAIR t43/epsg:4267>epsg:2392 0 OK 0x1.f6b47a24dffecp21 0x1.90fb8da472213p23 -0x1.edc725019p7 -0x1.b961b3d9e0f2ep6 0x1.67fdbf5638dc8p6 -0x1.efb4619a4p4 F +PAIR t43/epsg:4267>epsg:2392 1 OK 0x1.ed3234cc99b76p22 0x1.2ff9d73a8a238p24 -0x1.fd98676a9p7 -0x1.b961b8857e579p6 0x1.67fdbf5623ff9p6 -0x1.371f40a54p5 F +PAIR t43/epsg:4267>epsg:2392 2 OK 0x1.5537f56f698d8p18 0x1.f6b07d6a1cb5ap23 -0x1.df3ffca2bp7 -0x1.b961af8fbbd05p6 0x1.67fdbf564c06p6 -0x1.7b7b133e4p4 F +PAIR t43/epsg:4267>epsg:2392 3 EXC:java.lang.IllegalStateException 0x1.8064a6053e3e6p22 0x1.1208ee11848ebp23 -0x1.f816ad59p7 NaN NaN NaN F +PAIR t43/epsg:4267>epsg:2392 4 OK 0x1.274e5333f558fp20 0x1.55963e65b8608p23 -0x1.de9dba081p7 -0x1.b961af5fd2d65p6 0x1.67fdbf564cdc1p6 -0x1.7668fdeap4 F +PAIR t43/esri:104000>epsg:20022 0 OK 0x1.02248239f2a1ep24 0x1.7dccff8354e56p23 -0x1.778ce603d8p7 -0x1.3da4997d10eaap6 0x1.67fec77f19e17p6 0x1.0f9162ef8p3 F +PAIR t43/esri:104000>epsg:20022 1 OK 0x1.48887bb345c52p24 0x1.162f5c57a424cp24 -0x1.5cadfcd218p7 -0x1.3da4997d10eaap6 0x1.67fec77f44dffp6 0x1.5ebff7ebcp4 F +PAIR t43/esri:104000>epsg:20022 2 OK 0x1.43591f08319cbp23 0x1.451eee22259f5p24 -0x1.6e57f26438p7 -0x1.3da4997d10eaap6 0x1.67fec77f289cbp6 0x1.a2e09ac98p3 F +PAIR t43/esri:104000>epsg:20022 3 OK 0x1.4ad4a457213bfp24 0x1.418cf766a2347p23 -0x1.7f1151f798p7 -0x1.3da4997d10eaap6 0x1.67fec77f0dda5p6 0x1.2e954aep2 F +PAIR t43/esri:104000>epsg:20022 4 EXC:java.lang.IllegalStateException 0x1.c28bc353eb1fep23 0x1.7a9f067d4e145p22 -0x1.8de3baacd8p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:20092 0 EXC:java.lang.IllegalStateException 0x1.589a5aa5a6e6p22 0x1.e9828eb9f75f3p22 -0x1.778ce603d8p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:20092 1 EXC:java.lang.IllegalStateException 0x1.6841105ebedfp22 0x1.a7cbc054de6edp22 -0x1.5cadfcd218p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:20092 2 EXC:java.lang.IllegalStateException 0x1.9aa8d815df49bp22 0x1.065dcb92c4e9cp23 -0x1.6e57f26438p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:20092 3 EXC:java.lang.IllegalStateException 0x1.1ebb8b081ae64p22 0x1.d8e6607a87841p22 -0x1.7f1151f798p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:20092 4 EXC:java.lang.IllegalStateException 0x1.3a8b42316c164p22 0x1.1003acaad7eacp23 -0x1.8de3baacd8p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:2468 0 EXC:java.lang.IllegalStateException 0x1.99c5eb7732af9p24 0x1.7fb17f8cf351dp21 -0x1.778ce603d8p7 NaN NaN NaN F +PAIR t43/esri:104000>epsg:2468 1 OK 0x1.58a0a902030d5p25 0x1.4235db5abf128p24 -0x1.5cadfcd218p7 -0x1.3da4997d0d553p6 0x1.67fec77f44dffp6 0x1.5ebff7ebcp4 F +PAIR t43/esri:104000>epsg:2468 2 OK 0x1.28776d6c00b1bp24 0x1.50ce84803740bp24 -0x1.6e57f26438p7 -0x1.3da4997d0d553p6 0x1.67fec77f289cbp6 0x1.a2e09ac98p3 F +PAIR t43/esri:104000>epsg:2468 3 OK 0x1.a248dafab0af2p24 -0x1.9e872999a02b9p23 -0x1.7f1151f798p7 -0x1.3da4997d0d553p6 -0x1.67fec78117d66p6 0x1.4fb21af99p7 F +PAIR t43/esri:104000>epsg:2468 4 EXC:java.lang.IllegalStateException 0x1.7cf418dbf6c99p23 0x1.39b5c331c5551p21 -0x1.8de3baacd8p7 NaN NaN NaN F +PAIR t43/esri:4267>epsg:20066 0 OK 0x1.c7ecdabb5ded9p22 0x1.72ec93a2a2497p23 -0x1.778ce603d8p7 -0x1.3da4997d0cdc4p6 0x1.67fec77f19e17p6 0x1.0f9162ef8p3 F +PAIR t43/esri:4267>epsg:20066 1 OK 0x1.bdced62ed51ccp23 0x1.49e0dd954ec02p24 -0x1.5cadfcd218p7 -0x1.3da4997d0cdc4p6 0x1.67fec77f44dffp6 0x1.5ebff7ebcp4 F +PAIR t43/esri:4267>epsg:20066 2 OK 0x1.3d4a4730803b4p21 0x1.1dae9c22a6e67p24 -0x1.6e57f26438p7 -0x1.3da4997d0cdc4p6 0x1.67fec77f289cbp6 0x1.a2e09ac98p3 F +PAIR t43/esri:4267>epsg:20066 3 EXC:java.lang.IllegalStateException 0x1.2461f1d45fd9ep23 0x1.38373dc3b00f7p22 -0x1.7f1151f798p7 NaN NaN NaN F +PAIR t43/esri:4267>epsg:20066 4 OK 0x1.f72870b54047p20 0x1.3773ef7c5a8a6p23 -0x1.8de3baacd8p7 -0x1.3da4997d0cdc4p6 0x1.67fec77ef6232p6 -0x1.576f89ep1 F +PAIR t43/esri:4267>epsg:2094 0 EXC:java.lang.IllegalStateException -0x1.d31f1ef2b3ecap24 0x1.5c34c58217702p17 -0x1.7306add08p5 NaN NaN NaN F +PAIR t43/esri:4267>epsg:2094 1 OK -0x1.5b079e809d232p24 0x1.53a296dd18be8p24 -0x1.99649f13p4 0x0.0p0 0x1.68p6 0x1.193c1b2d88p7 F +PAIR t43/esri:4267>epsg:2094 2 OK -0x1.89f01e8e9757p25 0x1.3317db26dd32dp24 -0x1.99649f13p4 0x0.0p0 0x1.68p6 0x1.193c1b2d88p7 F +PAIR t43/esri:4267>epsg:2094 3 OK -0x1.ac9f452c74d6bp23 0x1.ec4d924920368p16 -0x1.0cafbff06p6 0x1.48fa7bc50889p7 0x1.3d1e4341bb448p4 -0x1.c43ba223fp6 F +PAIR t43/esri:4267>epsg:2094 4 OK -0x1.d34bbac239dafp24 -0x1.1f60d7f2bb9ddp24 -0x1.0cafbff06p6 0x0.0p0 -0x1.68p6 0x1.7cee6f20ap6 F +PAIR t44/epsg:4267>epsg:26703 0 OK 0x1.468d1550fd1e1p22 0x1.c68240be9a2dp22 0x0.0p0 -0x1.8fffffffffff9p6 0x1.67fffffffffffp5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26703 1 OK 0x1.4c082dd066e0fp22 0x1.8697664907befp22 0x0.0p0 -0x1.ac48c6001f0bp6 0x1.3fffffffffff9p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26703 2 OK 0x1.8742f8fcc53d4p22 0x1.d977f74c6773cp22 0x0.0p0 -0x1.73b739ffe0f28p6 0x1.4000000000021p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26703 3 OK 0x1.0ca8e80c0644p22 0x1.bede2a45a56fbp22 0x0.0p0 -0x1.ac48c6001f0aap6 0x1.9p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26703 4 OK 0x1.33d7cffd32556p22 0x1.ffbbf212d8145p22 0x0.0p0 -0x1.73b739ffe0f55p6 0x1.9000000000005p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26748 0 OK 0x1.7e0bb64800822p21 0x1.4142f419abbb7p22 0x0.0p0 -0x1.9000001a5e2d1p6 0x1.67fffff5ad0a8p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26748 1 OK 0x1.4dcf273ac57bcp20 0x1.91b3d0dbf73bbp21 0x0.0p0 -0x1.ac48c6001e23dp6 0x1.3ffffffffdeaep5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26748 2 OK 0x1.45fce9e8c6c33p22 0x1.c9f6b1929cb95p21 0x0.0p0 -0x1.73b7456f9d111p6 0x1.400000ec9523ap5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26748 3 OK 0x1.2bd0a2a239b59p20 0x1.a75d5a2b0304bp22 0x0.0p0 -0x1.ac48c6001ec04p6 0x1.8ffffffffd174p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26748 4 OK 0x1.1547f112b89bp22 0x1.c34760d86768p22 0x0.0p0 -0x1.73b74d83d26dp6 0x1.900000ea8efc6p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26795 0 OK -0x1.e8674c2c3c977p20 0x1.4b65e5829327ep22 0x0.0p0 -0x1.8fffffefc0e7fp6 0x1.67fffff8084dfp5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26795 1 OK -0x1.005b3dcda5c92p22 0x1.dccc9236b4145p21 0x0.0p0 -0x1.ac48bd63481c9p6 0x1.400000956820dp5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26795 2 OK -0x1.bbc56a2e5b8bap17 0x1.a75ee94cbd02cp21 0x0.0p0 -0x1.73b739ffe1509p6 0x1.3fffffffff469p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26795 3 OK -0x1.a2478edbb74cep21 0x1.ccbb2100ab194p22 0x0.0p0 -0x1.ac48b7391eac4p6 0x1.9000008a99784p5 0x0.0p0 F +PAIR t44/epsg:4267>epsg:26795 4 OK -0x1.af997b6372b7cp16 0x1.b2353c2b866b6p22 0x0.0p0 -0x1.73b739ffe11bbp6 0x1.8ffffffffefccp5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26716 0 OK -0x1.0023cf7b1e62p19 0x1.352e9b1cee50fp22 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26716 1 OK -0x1.2995c1bf4db45p20 0x1.1a519fc9ba84cp22 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26716 2 OK -0x1.876e8cacafcp12 0x1.0f44050ab3d7bp22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26716 3 OK -0x1.c77a84bebd52ep19 0x1.5dfee8aac61b4p22 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26716 4 OK 0x1.25c8f4125554cp16 0x1.53112fbcc1657p22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26766 0 OK -0x1.f5efd70437071p21 0x1.6cd28380f20ddp22 0x0.0p0 -0x1.8fffeabfbbd39p6 0x1.6800018e5cfcbp5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26766 1 OK -0x1.8d54e42c5a432p22 0x1.1c095c5f9a53bp22 0x0.0p0 -0x1.ac4723d42ee7cp6 0x1.4000541f6fb62p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26766 2 OK -0x1.335fb9ca54a42p21 0x1.d2a4151accc05p21 0x0.0p0 -0x1.73b739e1925f3p6 0x1.3ffffff55d645p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26766 3 OK -0x1.44b70b6a08e1ep22 0x1.f98971f1e499dp22 0x0.0p0 -0x1.ac461bdc230e7p6 0x1.900061fdb24a5p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:26766 4 OK -0x1.ef4998108f6b7p20 0x1.c7ce2fb4985fbp22 0x0.0p0 -0x1.73b739c2cbc2p6 0x1.8ffffff08b356p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:32007 0 OK 0x1.148333d9058b4p22 0x1.f7a504f826838p21 0x0.0p0 -0x1.900005e56326dp6 0x1.68000019131abp5 0x0.0p0 F +PAIR t44/esri:104000>epsg:32007 1 OK 0x1.6050ac30123ebp21 0x1.ee94fb76bf79bp20 0x0.0p0 -0x1.ac48c602c51cdp6 0x1.3ffffffcd1ed7p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:32007 2 OK 0x1.a3711bc3a5791p22 0x1.4f14d10de7f01p21 0x0.0p0 -0x1.73b7dd3bf3f3fp6 0x1.40001c86e120ap5 0x0.0p0 F +PAIR t44/esri:104000>epsg:32007 3 OK 0x1.31473bb242b68p21 0x1.5a263197e9ac2p22 0x0.0p0 -0x1.ac48c606f395p6 0x1.8ffffffb84695p5 0x0.0p0 F +PAIR t44/esri:104000>epsg:32007 4 OK 0x1.620ff494b1f1cp22 0x1.855f70d1ca4e9p22 0x0.0p0 -0x1.73b846880efabp6 0x1.900020dd9fc5ap5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26735 0 OK 0x1.af5776537f8e9p23 0x1.f4a96605f03b1p20 0x0.0p0 -0x1.d811e068457cdp6 0x1.825d2beb73d24p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26735 1 OK 0x1.a3ac9de599f47p23 -0x1.135181865693fp20 0x0.0p0 -0x1.b3cbbeeca5e1ap6 0x1.42d2b2907ecc4p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26735 2 OK 0x1.0b75082dc7bp24 0x1.151df4f14159fp21 0x0.0p0 0x1.2776ab9d588e5p7 0x1.0ddb6b4a009e1p6 0x0.0p0 F +PAIR t44/esri:4267>epsg:26735 3 OK 0x1.55336deb6423dp23 0x1.1503f7948861cp21 0x0.0p0 -0x1.b833e086232fcp6 0x1.935d6681ba4d5p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26735 4 OK 0x1.a5ded072ea322p23 0x1.375dbd23c5b61p22 0x0.0p0 0x1.51a00602a09b4p6 0x1.46ed01c00503p6 0x0.0p0 F +PAIR t44/esri:4267>epsg:26779 0 OK -0x1.fc380b605bf3bp20 0x1.78eb974e74d2bp21 0x0.0p0 -0x1.9p6 0x1.67ffffffffff3p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26779 1 OK -0x1.0851a07632cc9p22 0x1.9ec28d4e3e105p20 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.3ffffffffffe5p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26779 2 OK -0x1.a2b6a69edb7acp18 0x1.f484f4663d34ap19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.3ffffffffffe5p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26779 3 OK -0x1.a2992c0d18baep21 0x1.412f8ba5cd9ap22 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.8fffffffff97p5 0x0.0p0 F +PAIR t44/esri:4267>epsg:26779 4 OK -0x1.43e82d9652c8p16 0x1.1deaa8a382aabp22 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.8fffffffff971p5 0x0.0p0 F +REG epsg:2000 0 OK 0x1.86ap18 0x0.0p0 0x0.0p0 -0x1.fp5 0x0.0p0 0x0.0p0 T +REG epsg:2000 1 OK -0x1.2e96895585988p17 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 -0x1.3fffffffea4bep2 0x0.0p0 F +REG epsg:2000 2 OK 0x1.d245a25561656p19 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 -0x1.3fffffffea4bep2 0x0.0p0 F +REG epsg:2000 3 OK -0x1.2e96895585988p17 0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 0x1.3fffffffea4bep2 0x0.0p0 F +REG epsg:2000 4 OK 0x1.d245a25561656p19 0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 0x1.3fffffffea4bep2 0x0.0p0 F +REG epsg:20004 0 OK 0x1.12aa7bca20c95p22 0x1.463e8bdfd0b3ep6 -0x1.4a21a780fp6 0x1.4ffffffffffffp4 0x0.0p0 0x1.546p-19 T +REG epsg:20004 1 OK 0x1.e18ef349cf4c8p21 -0x1.0ef5d59feb7dcp19 -0x1.94dcab54bp6 0x1.0000000075116p4 -0x1.3fffffffea5fap2 0x1.512p-19 F +REG epsg:20004 2 OK 0x1.348d7df68544ep22 -0x1.0ef5d3aa98974p19 -0x1.39e4fad07p6 0x1.9fffffff8a9dp4 -0x1.3fffffffea4ebp2 0x1.51cp-19 F +REG epsg:20004 3 OK 0x1.e18efd3c9e2f4p21 0x1.0f0a395d06691p19 -0x1.5bfea8784p6 0x1.00000000750f9p4 0x1.3fffffffea5e4p2 0x1.50cp-19 F +REG epsg:20004 4 OK 0x1.348d78fc89875p22 0x1.0f0a37678e3bbp19 -0x1.010705549p6 0x1.9fffffff8a9efp4 0x1.3fffffffea4d5p2 0x1.51ap-19 F +REG epsg:20005 0 OK 0x1.4fb36edb9c05ap22 0x1.463e5e1eaf988p6 -0x1.13e683023p6 0x1.bp4 0x0.0p0 0x1.544p-19 T +REG epsg:20005 1 OK 0x1.2dd0716baa0efp22 -0x1.0ef5af877fac4p19 -0x1.5deb8a43ep6 0x1.6000000075121p4 -0x1.3fffffffea5f9p2 0x1.50ep-19 F +REG epsg:20005 2 OK 0x1.71966c528d6cbp22 -0x1.0ef5ad92281d2p19 -0x1.0532b4f06p6 0x1.ffffffff8a9e4p4 -0x1.3fffffffea4f2p2 0x1.516p-19 F +REG epsg:20005 3 OK 0x1.2dd07665114ecp22 0x1.0f0a1341c44a5p19 -0x1.250d8f7bap6 0x1.6000000075105p4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:20005 4 OK 0x1.7196675895a82p22 0x1.0f0a114c47739p19 -0x1.98a98e682p5 0x1.ffffffff8aa01p4 0x1.3fffffffea4dcp2 0x1.518p-19 F +REG epsg:20006 0 OK 0x1.8cbc5c540b2cep22 0x1.463e31c1b23aep6 -0x1.bea2eaf3ap5 0x1.07fffffffffffp5 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:20006 1 OK 0x1.6ad96374afc6p22 -0x1.0ef58a979b34fp19 -0x1.2820df94bp6 0x1.c000000075135p4 -0x1.3fffffffea5f5p2 0x1.50cp-19 F +REG epsg:20006 2 OK 0x1.ae9f553a26871p22 -0x1.0ef588a23cbp19 -0x1.a53f7a188p5 0x1.2fffffffc5502p5 -0x1.3fffffffea4f7p2 0x1.51cp-19 F +REG epsg:20006 3 OK 0x1.6ad9686e17b5dp22 0x1.0f09ee4f1f9b4p19 -0x1.de85d96a6p5 0x1.c000000075118p4 0x1.3fffffffea5dap2 0x1.516p-19 F +REG epsg:20006 4 OK 0x1.ae9f5040337cap22 0x1.0f09ec599bcdbp19 -0x1.3383ad7fap5 0x1.2fffffffc551p5 0x1.3fffffffea4ep2 0x1.51ap-19 F +REG epsg:20007 0 OK 0x1.c9c5446768e4dp22 0x1.463e0745453e2p6 -0x1.59ebf3162p5 0x1.3800000000001p5 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20007 1 OK 0x1.a7e24fe725fc9p22 -0x1.0ef56737d6c7p19 -0x1.e82715018p5 0x1.100000003a8a9p5 -0x1.3fffffffea5f2p2 0x1.50ep-19 F +REG epsg:20007 2 OK 0x1.eba838ee1958fp22 -0x1.0ef565426f124p19 -0x1.4573d7766p5 0x1.5fffffffc5513p5 -0x1.3fffffffea4fdp2 0x1.51ap-19 F +REG epsg:20007 3 OK 0x1.a7e254e08f7cp22 0x1.0f09caecb8c23p19 -0x1.766b3e91ep5 0x1.100000003a89cp5 0x1.3fffffffea5d8p2 0x1.51p-19 F +REG epsg:20007 4 OK 0x1.eba833f42bbc9p22 0x1.0f09c8f72bc37p19 -0x1.a77031e74p4 0x1.5fffffffc5521p5 0x1.3fffffffea4e5p2 0x1.51ep-19 F +REG epsg:20008 0 OK 0x1.036713ac6888p23 0x1.463ddf209114p6 -0x1.f5853094cp4 0x1.67ffffffffffep5 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:20008 1 OK 0x1.e4eb36f9e5fddp22 -0x1.0ef545cb6889cp19 -0x1.84ab11f42p5 0x1.400000003a8b8p5 -0x1.3fffffffea5e9p2 0x1.50cp-19 F +REG epsg:20008 2 OK 0x1.14588bdee29e9p23 -0x1.0ef543d5f585p19 -0x1.d81e5ee88p4 0x1.8fffffffc5526p5 -0x1.3fffffffea506p2 0x1.51cp-19 F +REG epsg:20008 3 OK 0x1.e4eb3bf351e82p22 0x1.0f09a97dcd4ap19 -0x1.12ef4a256p5 0x1.400000003a8a9p5 0x1.3fffffffea5dp2 0x1.51p-19 F +REG epsg:20008 4 OK 0x1.14588961eed9bp23 0x1.0f09a78834f99p19 -0x1.e94df85a8p3 0x1.8fffffffc5534p5 0x1.3fffffffea4fp2 0x1.51ep-19 F +REG epsg:20009 0 OK 0x1.21eb82bce2413p23 0x1.463db9c42bd77p6 -0x1.446381a24p4 0x1.97ffffffffffep5 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:20009 1 OK 0x1.10fa0c796da2ap23 -0x1.0ef526b00de8bp19 -0x1.26e4bc718p5 0x1.700000003a8cbp5 -0x1.3fffffffea5dfp2 0x1.50ep-19 F +REG epsg:20009 2 OK 0x1.32dcf90320badp23 -0x1.0ef524ba8d932p19 -0x1.341874b44p4 0x1.bfffffffc5541p5 -0x1.3fffffffea511p2 0x1.51ap-19 F +REG epsg:20009 3 OK 0x1.10fa0ef625378p23 0x1.0f098a6021995p19 -0x1.6a5204dap4 0x1.700000003a8bcp5 0x1.3fffffffea5c9p2 0x1.50ep-19 F +REG epsg:20009 4 OK 0x1.32dcf68630491p23 0x1.0f09886a7bf5ep19 -0x1.4284a85ep2 0x1.bfffffffc554fp5 0x1.3fffffffea4f9p2 0x1.51ap-19 F +REG epsg:2001 0 OK 0x1.86da04fafd2efp18 -0x1.1bdbb68ca4aafp6 -0x1.6ad67c1cp2 -0x1.fp5 0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:2001 1 OK -0x1.2e1d5f741b0a4p17 -0x1.0ee55e4facda7p19 -0x1.1cd942ae4p4 -0x1.0bffffffe2072p6 -0x1.3fffffffea5b9p2 -0x1.2p-27 F +REG epsg:2001 2 OK 0x1.d2615d35611b1p19 -0x1.0ee55e512dd42p19 0x1.68427be84p4 -0x1.c80000003c3e2p5 -0x1.3fffffffea3bep2 0x1.0p-27 F +REG epsg:2001 3 OK -0x1.2e1de9ef2c74cp17 0x1.0ed3a0bb2c432p19 -0x1.e2e2ad62cp4 -0x1.0bffffffe206cp6 0x1.3fffffffea5dp2 -0x1.2p-27 F +REG epsg:2001 4 OK 0x1.d2617fdb8697ep19 0x1.0ed3a0bcad0bap19 0x1.4472c79ap3 -0x1.c80000003c3eep5 0x1.3fffffffea3d3p2 0x1.2p-27 F +REG epsg:20010 0 OK 0x1.406fef94a22d9p23 0x1.463d9798dd9afp6 -0x1.44c74b3c8p3 0x1.c800000000001p5 0x0.0p0 0x1.54p-19 T +REG epsg:20010 1 OK 0x1.2f7e7b131fa8cp23 -0x1.0ef50a3d04b87p19 -0x1.9fb62de7p4 0x1.a00000003a8e5p5 -0x1.3fffffffea5d7p2 0x1.512p-19 F +REG epsg:20010 2 OK 0x1.51616418ac042p23 -0x1.0ef5084775361p19 -0x1.4143f08p3 0x1.efffffffc5559p5 -0x1.3fffffffea51dp2 0x1.518p-19 F +REG epsg:20010 3 OK 0x1.2f7e7d8fd942fp23 0x1.0f096deafa03fp19 -0x1.787da6ef8p3 0x1.a00000003a8d6p5 0x1.3fffffffea5bfp2 0x1.50ep-19 F +REG epsg:20010 4 OK 0x1.5161619bbf26p23 0x1.0f096bf54531ap19 0x1.0b54f2b5p2 0x1.efffffffc5569p5 0x1.3fffffffea506p2 0x1.51ap-19 F +REG epsg:20011 0 OK 0x1.5ef45a6963c27p23 0x1.463d78fe7a9afp6 -0x1.14bf763cp0 0x1.f7ffffffffffep5 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20011 1 OK 0x1.4e02e77ad6afp23 -0x1.0ef4f0c216984p19 -0x1.01047ccdp4 0x1.d00000003a8ffp5 -0x1.3fffffffea5cfp2 0x1.50cp-19 F +REG epsg:20011 2 OK 0x1.6fe5cd5a2e825p23 -0x1.0ef4eecc7638p19 -0x1.f587ece8p0 0x1.0fffffffe2abbp6 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:20011 3 OK 0x1.4e02e9f792ae9p23 0x1.0f09546e261a6p19 -0x1.d8d39b38p0 0x1.d00000003a8efp5 0x1.3fffffffea5b7p2 0x1.50cp-19 F +REG epsg:20011 4 OK 0x1.6fe5cadd456e4p23 0x1.0f09527860679p19 0x1.883d46388p3 0x1.0fffffffe2ac3p6 0x1.3fffffffea513p2 0x1.51cp-19 F +REG epsg:20012 0 OK 0x1.7d78c37686a5bp23 0x1.463d5e4ad68dbp6 0x1.b532671ap2 0x1.14p6 0x0.0p0 0x1.542p-19 T +REG epsg:20012 1 OK 0x1.6c8751e7884d5p23 -0x1.0ef4da86b93c1p19 -0x1.cdc5ec8ap2 0x1.000000001d48cp6 -0x1.3fffffffea5cp2 0x1.512p-19 F +REG epsg:20012 2 OK 0x1.8e6a350772b81p23 -0x1.0ef4d891067c3p19 0x1.39657375p2 0x1.27ffffffe2acbp6 -0x1.3fffffffea534p2 0x1.51cp-19 F +REG epsg:20012 3 OK 0x1.6c875464470b9p23 0x1.0f093e3120e2ep19 0x1.c016cc96p2 0x1.000000001d485p6 0x1.3fffffffea5aap2 0x1.512p-19 F +REG epsg:20012 4 OK 0x1.8e6a328a8d99dp23 0x1.0f093c3b48cddp19 0x1.31d06ea68p4 0x1.27ffffffe2ad2p6 0x1.3fffffffea51fp2 0x1.51cp-19 F +REG epsg:20013 0 OK 0x1.9bfd2afc68277p23 0x1.463d47c8d4012p6 0x1.b005fea7p3 0x1.2cp6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20013 1 OK 0x1.8b0bba95b7efep23 -0x1.0ef4c7c94612bp19 0x1.dd717cp-2 0x1.180000001d49dp6 -0x1.3fffffffea5b5p2 0x1.514p-19 F +REG epsg:20013 2 OK 0x1.acee9b64b0bb6p23 -0x1.0ef4c5d37fa52p19 0x1.4e7fe69d8p3 0x1.3fffffffe2adbp6 -0x1.3fffffffea541p2 0x1.51ap-19 F +REG epsg:20013 3 OK 0x1.8b0bbd1279be6p23 0x1.0f092b7248711p19 0x1.d5d9c44c8p3 0x1.180000001d495p6 0x1.3fffffffea59ep2 0x1.516p-19 F +REG epsg:20013 4 OK 0x1.acee98e7cfb3cp23 0x1.0f09297c5cab5p19 0x1.8ab6f8054p4 0x1.3fffffffe2ae2p6 0x1.3fffffffea52bp2 0x1.51ap-19 F +REG epsg:20014 0 OK 0x1.ba81913faebfdp23 0x1.463d35b79266ep6 0x1.2dabef1acp4 0x1.44p6 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:20014 1 OK 0x1.a99021c6cd1ffp23 -0x1.0ef4b8be4b768p19 0x1.b9624cbbp2 0x1.300000001d4acp6 -0x1.3fffffffea5aap2 0x1.514p-19 F +REG epsg:20014 2 OK 0x1.cb7300b9cee5ap23 -0x1.0ef4b6c87044cp19 0x1.d4c3de38p3 0x1.57ffffffe2aedp6 -0x1.3fffffffea55p2 0x1.51ap-19 F +REG epsg:20014 3 OK 0x1.a99024439247bp23 0x1.0f091c662f097p19 0x1.51cfa0438p4 0x1.300000001d4a5p6 0x1.3fffffffea594p2 0x1.51p-19 F +REG epsg:20014 4 OK 0x1.cb72fe3cf209dp23 0x1.0f091a702e7c6p19 0x1.cdd8e9f3cp4 0x1.57ffffffe2af4p6 0x1.3fffffffea539p2 0x1.518p-19 F +REG epsg:20015 0 OK 0x1.d905f688898ap23 0x1.463d2849bd1d6p6 0x1.6d572a978p4 0x1.5cp6 0x0.0p0 0x1.542p-19 T +REG epsg:20015 1 OK 0x1.c81487c05c17ep23 -0x1.0ef4ad8ff956dp19 0x1.802cbbba8p3 0x1.480000001d4bcp6 -0x1.3fffffffea598p2 0x1.516p-19 F +REG epsg:20015 2 OK 0x1.e9f765519831cp23 -0x1.0ef4ab9a0884fp19 0x1.1703080dcp4 0x1.6fffffffe2afep6 -0x1.3fffffffea55fp2 0x1.514p-19 F +REG epsg:20015 3 OK 0x1.c8148a3d24d88p23 0x1.0f09113707bf5p19 0x1.a38d5eedp4 0x1.480000001d4b5p6 0x1.3fffffffea582p2 0x1.514p-19 F +REG epsg:20015 4 OK 0x1.e9f762d4bf8b6p23 0x1.0f090f40f18fp19 0x1.fa79fc54cp4 0x1.6fffffffe2b06p6 0x1.3fffffffea548p2 0x1.514p-19 F +REG epsg:20016 0 OK 0x1.f78a5b21e5d7bp23 0x1.463d1fa4fd619p6 0x1.9652209acp4 0x1.7400000000001p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20016 1 OK 0x1.e698eccb62a42p23 -0x1.0ef4a65daaf1cp19 0x1.f793c9d88p3 0x1.600000001d4cdp6 -0x1.3fffffffea58dp2 0x1.51p-19 F +REG epsg:20016 2 OK 0x1.043de4bc75406p24 -0x1.0ef4a467a3e07p19 0x1.2ca613184p4 0x1.87ffffffe2b1p6 -0x1.3fffffffea56dp2 0x1.514p-19 F +REG epsg:20016 3 OK 0x1.e698ef482f333p23 0x1.0f090a043026cp19 0x1.df40dd34cp4 0x1.600000001d4c7p6 0x1.3fffffffea575p2 0x1.514p-19 F +REG epsg:20016 4 OK 0x1.043de37e0b06cp24 0x1.0f09080e03b3cp19 0x1.080e8218ep5 0x1.87ffffffe2b18p6 0x1.3fffffffea556p2 0x1.518p-19 F +REG epsg:20017 0 OK 0x1.0b075fac4e8adp24 0x1.463d1be190bb3p6 0x1.a829e201cp4 0x1.8c00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:20017 1 OK 0x1.028ea899bdba3p24 -0x1.0ef4a33b8eebap19 0x1.20cbb7da4p4 0x1.780000001d4e2p6 -0x1.3fffffffea57dp2 0x1.514p-19 F +REG epsg:20017 2 OK 0x1.138016beef86ep24 -0x1.0ef4a145713afp19 0x1.2b0e61574p4 0x1.9fffffffe2b23p6 -0x1.3fffffffea57dp2 0x1.51p-19 F +REG epsg:20017 3 OK 0x1.028ea9d825fe5p24 0x1.0f0906e1d864fp19 0x1.022155588p5 0x1.780000001d4dap6 0x1.3fffffffea566p2 0x1.51p-19 F +REG epsg:20017 4 OK 0x1.13801580875fcp24 0x1.0f0904eb954f5p19 0x1.0742a955ep5 0x1.9fffffffe2b2ap6 0x1.3fffffffea568p2 0x1.51p-19 F +REG epsg:20018 0 OK 0x1.1a4991bd4ea65p24 0x1.463d1d0a0507bp6 0x1.a2ac63ffcp4 0x1.a400000000002p6 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20018 1 OK 0x1.11d0daa3050c7p24 -0x1.0ef4a4326ebb9p19 0x1.2eb40c318p4 0x1.900000001d4f2p6 -0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:20018 2 OK 0x1.22c248d777b72p24 -0x1.0ef4a23c3a4b9p19 0x1.12406a388p4 0x1.b7ffffffe2b33p6 -0x1.3fffffffea58ap2 0x1.514p-19 F +REG epsg:20018 3 OK 0x1.11d0dbe16f5dp24 0x1.0f0907d8ca989p19 0x1.09157e7e6p5 0x1.900000001d4e9p6 0x1.3fffffffea558p2 0x1.51p-19 F +REG epsg:20018 4 OK 0x1.22c247991195dp24 0x1.0f0905e270c04p19 0x1.f5b75f32cp4 0x1.b7ffffffe2b3cp6 0x1.3fffffffea575p2 0x1.514p-19 F +REG epsg:20019 0 OK 0x1.298bc3eb074dbp24 0x1.463d231b1ae3cp6 0x1.85e90c734p4 0x1.bcp6 0x0.0p0 0x1.542p-19 T +REG epsg:20019 1 OK 0x1.21130ca8b1012p24 -0x1.0ef4a93f9609fp19 0x1.255be0958p4 0x1.a80000001d504p6 -0x1.3fffffffea561p2 0x1.518p-19 F +REG epsg:20019 2 OK 0x1.32047b2d0cc33p24 -0x1.0ef4a7494afabp19 0x1.c5037de5p3 0x1.cfffffffe2b45p6 -0x1.3fffffffea59cp2 0x1.516p-19 F +REG epsg:20019 3 OK 0x1.21130de71d684p24 0x1.0f090ce652361p19 0x1.046969606p5 0x1.a80000001d4fcp6 0x1.3fffffffea545p2 0x1.51ap-19 F +REG epsg:20019 4 OK 0x1.320479eea8951p24 0x1.0f090aefe1bb2p19 0x1.c5f8baf2p4 0x1.cfffffffe2b4dp6 0x1.3fffffffea583p2 0x1.512p-19 F +REG epsg:2002 0 OK 0x1.85afb1d7d0ebcp18 -0x1.0bdc0c13cad12p9 0x1.30ce06fbcp7 -0x1.fp5 0x0.0p0 0x1.0p-30 T +REG epsg:2002 1 OK -0x1.30696762c774p17 -0x1.0f1dba144de34p19 0x1.1b411b9178p8 -0x1.0bffffffe1a6ep6 -0x1.3fffffffea063p2 0x1.0p-25 F +REG epsg:2002 2 OK 0x1.d1ca0a8ef0e6ep19 -0x1.0f1dba0e0bcaep19 0x1.d10b081acp6 -0x1.c80000003b75fp5 -0x1.3fffffffea89dp2 -0x1.fp-26 F +REG epsg:2002 3 OK -0x1.306d7efa4e26cp17 0x1.0e97cd323ee33p19 0x1.7ba2f556e8p7 -0x1.0bffffffe1a3bp6 0x1.3fffffffea104p2 0x1.0p-25 F +REG epsg:2002 4 OK 0x1.d1cb0f8e189f5p19 0x1.0e97cd2c02d0cp19 0x1.6d27fb88p4 -0x1.c80000003b7c1p5 0x1.3fffffffea939p2 -0x1.ep-26 F +REG epsg:20020 0 OK 0x1.38cdf65c3c075p24 0x1.463d2e03cec63p6 0x1.523086b44p4 0x1.d400000000004p6 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:20020 1 OK 0x1.30553ed1f56eep24 -0x1.0ef4b254da438p19 0x1.04dd6a258p4 0x1.c00000001d516p6 -0x1.3fffffffea54fp2 0x1.514p-19 F +REG epsg:20020 2 OK 0x1.4146ade6026a6p24 -0x1.0ef4b05e78f52p19 0x1.38b08eecp3 0x1.e7ffffffe2b58p6 -0x1.3fffffffea5a9p2 0x1.518p-19 F +REG epsg:20020 3 OK 0x1.3055401063f0ep24 0x1.0f0915fc439cap19 0x1.e85461184p4 0x1.c00000001d50ep6 0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:20020 4 OK 0x1.4146aca7a0178p24 0x1.0f091405bcdf4p19 0x1.7fcf4dc68p4 0x1.e7ffffffe2b5fp6 0x1.3fffffffea593p2 0x1.512p-19 F +REG epsg:20021 0 OK 0x1.48102936f31d4p24 0x1.463d3da588b23p6 0x1.0813e164cp4 0x1.ebfffffffffffp6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20021 1 OK 0x1.3f977145a25dcp24 -0x1.0ef4bf58c251fp19 0x1.9b2795f9p3 0x1.d80000001d529p6 -0x1.3fffffffea545p2 0x1.512p-19 F +REG epsg:20021 2 OK 0x1.5088e12795c07p24 -0x1.0ef4bd624b633p19 0x1.02232bb2p2 0x1.ffffffffe2b67p6 -0x1.3fffffffea5b4p2 0x1.50ep-19 F +REG epsg:20021 3 OK 0x1.3f97728412f8fp24 0x1.0f09230123cfbp19 0x1.b10aca108p4 0x1.d80000001d522p6 0x1.3fffffffea52ap2 0x1.51ap-19 F +REG epsg:20021 4 OK 0x1.5088dfe9352bap24 0x1.0f09210a876efp19 0x1.23ffdebdcp4 0x1.ffffffffe2b6cp6 0x1.3fffffffea5a1p2 0x1.51p-19 F +REG epsg:20022 0 OK 0x1.57525ca00afdep24 0x1.463d51d471fc3p6 0x1.50c5ef54p3 0x1.02p7 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20022 1 OK 0x1.4ed9a429b730dp24 -0x1.0ef4d026ce03dp19 0x1.0034254cp3 0x1.f00000001d537p6 -0x1.3fffffffea536p2 0x1.51ap-19 F +REG epsg:20022 2 OK 0x1.5fcb151584c1p24 -0x1.0ef4ce3042511p19 -0x1.7f59c062p1 0x1.0bfffffff15bbp7 -0x1.3fffffffea5c5p2 0x1.50ep-19 F +REG epsg:20022 3 OK 0x1.4ed9a56829ddap24 0x1.0f0933d06fe69p19 0x1.63911d1e4p4 0x1.f00000001d52fp6 0x1.3fffffffea51fp2 0x1.518p-19 F +REG epsg:20022 4 OK 0x1.5fcb13d725c84p24 0x1.0f0931d9bebe9p19 0x1.6717d89cp3 0x1.0bfffffff15bfp7 0x1.3fffffffea5acp2 0x1.514p-19 F +REG epsg:20023 0 OK 0x1.669490bad2d76p24 0x1.463d6a57f02eap6 0x1.a15152bcp1 0x1.0ep7 0x0.0p0 0x1.544p-19 T +REG epsg:20023 1 OK 0x1.5e1bd7a2f8196p24 -0x1.0ef4e48fdc621p19 0x1.d498b4e8p0 0x1.040000000eaa4p7 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:20023 2 OK 0x1.6f0d49d1aa144p24 -0x1.0ef4e2993d018p19 -0x1.6790baefp3 0x1.17fffffff15c2p7 -0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:20023 3 OK 0x1.5e1bd8e16cca8p24 0x1.0f09483b03671p19 0x1.00c0a44dcp4 0x1.040000000eaap7 0x1.3fffffffea512p2 0x1.514p-19 F +REG epsg:20023 4 OK 0x1.6f0d48934c90fp24 0x1.0f0946443e8e7p19 0x1.7d76d238p1 0x1.17fffffff15c7p7 0x1.3fffffffea5b6p2 0x1.516p-19 F +REG epsg:20024 0 OK 0x1.75d6c5a8a794p24 0x1.463d86eb43bcep6 -0x1.4d4242bp2 0x1.1a00000000001p7 0x0.0p0 0x1.54p-19 T +REG epsg:20024 1 OK 0x1.6d5e0bd486fc6p24 -0x1.0ef4fc5aafcf4p19 -0x1.67229e2dp2 0x1.100000000eaabp7 -0x1.3fffffffea51ap2 0x1.52p-19 F +REG epsg:20024 2 OK 0x1.7e4f7f7b9e1eep24 -0x1.0ef4fa63fe0f3p19 -0x1.499cd05f8p4 0x1.23fffffff15c9p7 -0x1.3fffffffea5dap2 0x1.50ep-19 F +REG epsg:20024 3 OK 0x1.6d5e0d12fd9eep24 0x1.0f0960079c70bp19 0x1.135d05ed8p3 0x1.100000000eaa8p7 0x1.3fffffffea5p2 0x1.52p-19 F +REG epsg:20024 4 OK 0x1.7e4f7e3d41e66p24 0x1.0f095e10c535dp19 -0x1.98960a64p2 0x1.23fffffff15cdp7 0x1.3fffffffea5c2p2 0x1.50ep-19 F +REG epsg:20025 0 OK 0x1.8518fb8896493p24 0x1.463da73e48be3p6 -0x1.d92280d7p3 0x1.26p7 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:20025 1 OK 0x1.7ca040df80ecbp24 -0x1.0ef517448e83p19 -0x1.c79d2479p3 0x1.1c0000000eab2p7 -0x1.3fffffffea50ep2 0x1.51cp-19 F +REG epsg:20025 2 OK 0x1.8d91b6305e661p24 -0x1.0ef5154dcbe4cp19 -0x1.efc457ed4p4 0x1.2ffffffff15dp7 -0x1.3fffffffea5e4p2 0x1.50ep-19 F +REG epsg:20025 3 OK 0x1.7ca0421df9681p24 0x1.0f097af37c42ep19 -0x1.5d4dbap-6 0x1.1c0000000eaafp7 0x1.3fffffffea4f6p2 0x1.51cp-19 F +REG epsg:20025 4 OK 0x1.8d91b4f2034a1p24 0x1.0f0978fc94278p19 -0x1.0c4cf1b84p4 0x1.2ffffffff15d3p7 0x1.3fffffffea5cdp2 0x1.50ap-19 F +REG epsg:20026 0 OK 0x1.945b327705227p24 0x1.463dcaf657a0ap6 -0x1.95ea1277p4 0x1.3200000000001p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20026 1 OK 0x1.8be276e2a14d3p24 -0x1.0ef53501fd9d7p19 -0x1.7f451961cp4 0x1.280000000eab7p7 -0x1.3fffffffea503p2 0x1.51cp-19 F +REG epsg:20026 2 OK 0x1.9cd3ee09fc406p24 -0x1.0ef5330b2bd1fp19 -0x1.523678eacp5 0x1.3bfffffff15d4p7 -0x1.3fffffffea5ecp2 0x1.51p-19 F +REG epsg:20026 3 OK 0x1.8be278211b83dp24 0x1.0f0998b3225ebp19 -0x1.379b876e8p3 0x1.280000000eab5p7 0x1.3fffffffea4edp2 0x1.51cp-19 F +REG epsg:20026 4 OK 0x1.9cd3eccba20f7p24 0x1.0f0996bc2b14p19 -0x1.c0f5711p4 0x1.3bfffffff15d8p7 0x1.3fffffffea5d6p2 0x1.50cp-19 F +REG epsg:20027 0 OK 0x1.a39d6a8d63b9fp24 0x1.463df1af4352fp6 -0x1.26c008184p5 0x1.3ep7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20027 1 OK 0x1.9b24adf9eb9fdp24 -0x1.0ef5553f94c81p19 -0x1.153c1bb7ep5 0x1.340000000eabep7 -0x1.3fffffffea4f9p2 0x1.51ep-19 F +REG epsg:20027 2 OK 0x1.ac16271f53b87p24 -0x1.0ef55348b5ab2p19 -0x1.b2cdf6984p5 0x1.47fffffff15d8p7 -0x1.3fffffffea5f5p2 0x1.50ap-19 F +REG epsg:20027 3 OK 0x1.9b24af38676f3p24 0x1.0f09b8f320378p19 -0x1.4700c899p4 0x1.340000000eabbp7 0x1.3fffffffea4e3p2 0x1.51ap-19 F +REG epsg:20027 4 OK 0x1.ac1625e0fa3eap24 0x1.0f09b6fc1b993p19 -0x1.41122801p5 0x1.47fffffff15ddp7 0x1.3fffffffea5dep2 0x1.50ep-19 F +REG epsg:20028 0 OK 0x1.b2dfa3e1e3c02p24 0x1.463e1afc72284p6 -0x1.88a82964ap5 0x1.4ap7 0x0.0p0 0x1.544p-19 T +REG epsg:20028 1 OK 0x1.aa66e63e5cf2bp24 -0x1.0ef577a2e8139p19 -0x1.71c3e1b64p5 0x1.400000000eac3p7 -0x1.3fffffffea4f2p2 0x1.51ep-19 F +REG epsg:20028 2 OK 0x1.bb586183cb6ccp24 -0x1.0ef575abfda56p19 -0x1.0c4cdddafp6 0x1.53fffffff15ddp7 -0x1.3fffffffea5f9p2 0x1.51p-19 F +REG epsg:20028 3 OK 0x1.aa66e77cda33dp24 0x1.0f09db590321ep19 -0x1.00081caf6p5 0x1.400000000eabep7 0x1.3fffffffea4dbp2 0x1.52p-19 F +REG epsg:20028 4 OK 0x1.bb58604572741p24 0x1.0f09d961f330dp19 -0x1.a6ddde26ap5 0x1.53fffffff15e1p7 0x1.3fffffffea5e3p2 0x1.51p-19 F +REG epsg:20029 0 OK 0x1.c221de873ab9p24 0x1.463e466a0e5aep6 -0x1.ef9ad39cep5 0x1.56p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20029 1 OK 0x1.b9a91fc5a5c84p24 -0x1.0ef59bcb8581bp19 -0x1.d43659bb8p5 0x1.4c0000000eac7p7 -0x1.3fffffffea4ebp2 0x1.518p-19 F +REG epsg:20029 2 OK 0x1.ca9a9d471e224p24 -0x1.0ef599d491e2bp19 -0x1.413e22f51p6 0x1.5ffffffff15ep7 -0x1.3fffffffea601p2 0x1.508p-19 F +REG epsg:20029 3 OK 0x1.b9a9210424503p24 0x1.0f09ff8451f1p19 -0x1.627a863a8p5 0x1.4c0000000eac3p7 0x1.3fffffffea4d3p2 0x1.51ep-19 F +REG epsg:20029 4 OK 0x1.ca9a9c08c5734p24 0x1.0f09fd8d38cdbp19 -0x1.08602c645p6 0x1.5ffffffff15e3p7 0x1.3fffffffea5e8p2 0x1.50ep-19 F +REG epsg:2003 0 OK 0x1.86770bd2e5fb4p18 -0x1.73cfbde821603p6 0x1.55ef138cep5 -0x1.fp5 0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:2003 1 OK -0x1.2ee123d42033p17 -0x1.0ee795ebf04dp19 0x1.0a3089b1dp6 -0x1.0bffffffe1e7p6 -0x1.3fffffffea408p2 0x1.cp-28 F +REG epsg:2003 2 OK 0x1.d22f5486ae29bp19 -0x1.0ee795eae0478p19 0x1.30b335eeep5 -0x1.c80000003bfc4p5 -0x1.3fffffffea56ep2 -0x1.8p-29 F +REG epsg:2003 3 OK -0x1.2ee1d957f315cp17 0x1.0ed05922f08c1p19 0x1.92ae451dep5 -0x1.0bffffffe1e67p6 0x1.3fffffffea425p2 0x1.4p-28 F +REG epsg:2003 4 OK 0x1.d22f81e0d040cp19 0x1.0ed05921e0b42p19 0x1.5e0082f48p4 -0x1.c80000003bfd5p5 0x1.3fffffffea58ap2 -0x1.8p-28 F +REG epsg:20030 0 OK 0x1.d1641a8c6d7fp24 0x1.463e737e4adccp6 -0x1.2d3ba49ep6 0x1.62p7 -0x1.2f74bf1dcf457p-62 0x1.54p-19 T +REG epsg:20030 1 OK 0x1.c8eb5aa1ed3e9p24 -0x1.0ef5c15403778p19 -0x1.1dbfb3186p6 0x1.580000000eacbp7 -0x1.3fffffffea4e7p2 0x1.51ap-19 F +REG epsg:20030 2 OK 0x1.d9dcda752ea1ap24 -0x1.0ef5bf5d08e11p19 -0x1.77a64d3e7p6 -0x1.640000000ea1fp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:20030 3 OK 0x1.c8eb5be06cdebp24 0x1.0f0a250f9b7c6p19 -0x1.c9c3837fap5 0x1.580000000eac7p7 0x1.3fffffffea4cfp2 0x1.52p-19 F +REG epsg:20030 4 OK 0x1.d9dcd936d6042p24 0x1.0f0a23187b60ap19 -0x1.3ec84eadap6 -0x1.640000000ea1bp7 0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:20031 0 OK 0x1.e0a657fca61e1p24 0x1.463ea1bab8e7dp6 -0x1.6408e9415p6 -0x1.62p7 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:20031 1 OK 0x1.d82d96e19e20ep24 -0x1.0ef5e7d31d1ffp19 -0x1.533eab99fp6 0x1.640000000eacdp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:20031 2 OK 0x1.e91f1915e65b8p24 -0x1.0ef5e5dc1ddecp19 -0x1.aeecc3a18p6 -0x1.580000000ea1fp7 -0x1.3fffffffea604p2 0x1.50ap-19 F +REG epsg:20031 3 OK 0x1.d82d98201ea7ap24 0x1.0f0a4b919317ep19 -0x1.1a60b263ap6 0x1.640000000eac9p7 0x1.3fffffffea4cbp2 0x1.51ap-19 F +REG epsg:20031 4 OK 0x1.e91f17d78d972p24 0x1.0f0a499a6e50ep19 -0x1.760ebceffp6 -0x1.580000000ea1bp7 0x1.3fffffffea5ecp2 0x1.50ap-19 F +REG epsg:20032 0 OK 0x1.efe896df147d4p24 0x1.463ed09daa8ddp6 -0x1.9b9b8306bp6 -0x1.56p7 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20032 1 OK 0x1.e76fd48f3e727p24 -0x1.0ef60edcd9a3p19 -0x1.8a020b83cp6 -0x1.5ffffffff1532p7 -0x1.3fffffffea4ep2 0x1.516p-19 F +REG epsg:20032 2 OK 0x1.f861592d1f30fp24 -0x1.0ef60ce5d8106p19 -0x1.e6767d49ep6 -0x1.4c0000000ea1ep7 -0x1.3fffffffea606p2 0x1.508p-19 F +REG epsg:20032 3 OK 0x1.e76fd5cdbfab9p24 0x1.0f0a729e37e13p19 -0x1.51240a3fbp6 -0x1.5ffffffff1536p7 0x1.3fffffffea4c8p2 0x1.522p-19 F +REG epsg:20032 4 OK 0x1.f86157eec60dbp24 0x1.0f0a70a710c87p19 -0x1.ad986e6d7p6 -0x1.4c0000000ea1ap7 0x1.3fffffffea5fp2 0x1.50ap-19 F +REG epsg:2004 0 OK 0x1.864f7f9fdbf9ep18 -0x1.6ccf76e505c4fp8 0x1.eca7b760bp6 -0x1.fp5 -0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:2004 1 OK -0x1.2f2bb5f85aebp17 -0x1.0f08af285bb2dp19 0x1.6f9d91d9b8p7 -0x1.0bffffffe1db2p6 -0x1.3fffffffea33cp2 0x1.0p-27 F +REG epsg:2004 2 OK 0x1.d21a6cb0cc1c6p19 -0x1.0f08af2643a24p19 0x1.ff761cf55p6 -0x1.c80000003bdfcp5 -0x1.3fffffffea5fcp2 -0x1.6p-27 F +REG epsg:2004 3 OK -0x1.2f2e7e8ae04c4p17 0x1.0ead7c11afc8ap19 0x1.e0b80edb5p6 -0x1.0bffffffe1d9p6 0x1.3fffffffea3a8p2 0x1.cp-28 F +REG epsg:2004 4 OK 0x1.d21b1ea0cb0c3p19 0x1.0ead7c0f9917ep19 0x1.00f274d49p6 -0x1.c80000003be41p5 0x1.3fffffffea669p2 -0x1.ap-27 F +REG epsg:2005 0 OK 0x1.86888c046ef7ep18 -0x1.d7c2b8d895fa9p7 0x1.69b6c9bf4p5 -0x1.fp5 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:2005 1 OK -0x1.2ebd7c3a44f08p17 -0x1.0ef96c7c82403p19 0x1.2d89cbf6dp6 -0x1.0bffffffe1ed3p6 -0x1.3fffffffea443p2 0x1.8p-28 F +REG epsg:2005 2 OK 0x1.d237eaf0a23adp19 -0x1.0ef96c7be662cp19 0x1.d8b10a318p5 -0x1.c80000003c06ep5 -0x1.3fffffffea50ep2 -0x1.0p-29 F +REG epsg:2005 3 OK -0x1.2ebf48c9aee08p17 0x1.0ebe74a67b36bp19 0x1.11f2f6804p5 -0x1.0bffffffe1ebdp6 0x1.3fffffffea487p2 0x1.0p-29 F +REG epsg:2005 4 OK 0x1.d2385e0a9275dp19 0x1.0ebe74a5df9b9p19 0x1.1f20628e4p4 -0x1.c80000003c09bp5 0x1.3fffffffea557p2 -0x1.0p-29 F +REG epsg:2006 0 OK 0x1.86b1db8a1c81fp18 -0x1.27d943e4641c2p8 0x1.1b52cfb32p6 -0x1.fp5 0x0.0p0 0x1.0p-30 T +REG epsg:2006 1 OK -0x1.2e6985a86fb34p17 -0x1.0f00a371467acp19 0x1.6ebac03c3p6 -0x1.0bffffffe1fb1p6 -0x1.3fffffffea4f2p2 -0x1.8p-29 F +REG epsg:2006 2 OK 0x1.d24c3d0d76ce4p19 -0x1.0f00a371bd3ep19 0x1.a05e40fccp6 -0x1.c80000003c217p5 -0x1.3fffffffea452p2 0x1.8p-29 F +REG epsg:2006 3 OK -0x1.2e6bc721b3424p17 0x1.0eb6adc20b2b9p19 0x1.40a7e0ed4p5 -0x1.0bffffffe1f95p6 0x1.3fffffffea547p2 -0x1.0p-28 F +REG epsg:2006 4 OK 0x1.d24ccd753fb47p19 0x1.0eb6adc281afbp19 0x1.a3ef176c6p5 -0x1.c80000003c24fp5 0x1.3fffffffea4abp2 0x1.8p-29 F +REG epsg:20064 0 OK 0x1.e867bca20c957p18 0x1.463e8bdfd0b3ep6 -0x1.4a21a780fp6 0x1.5p4 0x0.0p0 0x1.546p-19 T +REG epsg:20064 1 OK -0x1.ae432d8c2cdep15 -0x1.0ef5d59feb7dcp19 -0x1.94dcab54bp6 0x1.0000000075118p4 -0x1.3fffffffea5fbp2 0x1.51p-19 F +REG epsg:20064 2 OK 0x1.01a5f7da15138p20 -0x1.0ef5d3aa98974p19 -0x1.39e4fad07p6 0x1.9fffffff8a9dp4 -0x1.3fffffffea4ebp2 0x1.51cp-19 F +REG epsg:20064 3 OK -0x1.ae40b0d8743p15 0x1.0f0a395d06691p19 -0x1.5bfea8784p6 0x1.00000000750f9p4 0x1.3fffffffea5e4p2 0x1.50cp-19 F +REG epsg:20064 4 OK 0x1.01a5e3f2261d2p20 0x1.0f0a37678e3bbp19 -0x1.010705549p6 0x1.9fffffff8a9edp4 0x1.3fffffffea4d5p2 0x1.51ap-19 F +REG epsg:20065 0 OK 0x1.e866edb9c05a1p18 0x1.463e5e1eaf988p6 -0x1.13e683023p6 0x1.bp4 0x0.0p0 0x1.544p-19 T +REG epsg:20065 1 OK -0x1.ae474a2af887p15 -0x1.0ef5af877fac4p19 -0x1.5deb8a43ep6 0x1.6000000075121p4 -0x1.3fffffffea5f9p2 0x1.50ep-19 F +REG epsg:20065 2 OK 0x1.01a5b14a35b2bp20 -0x1.0ef5ad92281d2p19 -0x1.0532b4f06p6 0x1.ffffffff8a9e4p4 -0x1.3fffffffea4f2p2 0x1.516p-19 F +REG epsg:20065 3 OK -0x1.ae44cd7758a1p15 0x1.0f0a1341c44a5p19 -0x1.250d8f7bap6 0x1.6000000075105p4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:20065 4 OK 0x1.01a59d6256a06p20 0x1.0f0a114c47739p19 -0x1.98a98e682p5 0x1.ffffffff8aa01p4 0x1.3fffffffea4dcp2 0x1.518p-19 F +REG epsg:20066 0 OK 0x1.e865c540b2cddp18 0x1.463e31c1b23aep6 -0x1.bea2eaf3ap5 0x1.07fffffffffffp5 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:20066 1 OK -0x1.ae4e45a81cfdp15 -0x1.0ef58a979b34fp19 -0x1.2820df94bp6 0x1.c000000075136p4 -0x1.3fffffffea5f6p2 0x1.508p-19 F +REG epsg:20066 2 OK 0x1.01a554e89a1c4p20 -0x1.0ef588a23cbp19 -0x1.a53f7a188p5 0x1.2fffffffc5502p5 -0x1.3fffffffea4f7p2 0x1.51cp-19 F +REG epsg:20066 3 OK -0x1.ae4bc8f42519p15 0x1.0f09ee4f1f9b4p19 -0x1.de85d96a6p5 0x1.c000000075117p4 0x1.3fffffffea5dbp2 0x1.514p-19 F +REG epsg:20066 4 OK 0x1.01a54100cdf28p20 0x1.0f09ec599bcdbp19 -0x1.3383ad7fap5 0x1.2fffffffc551p5 0x1.3fffffffea4ep2 0x1.51ap-19 F +REG epsg:20067 0 OK 0x1.e86446768e4cdp18 0x1.463e0745453e2p6 -0x1.59ebf3162p5 0x1.3800000000001p5 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20067 1 OK -0x1.ae580c6d01b8p15 -0x1.0ef56737d6c7p19 -0x1.e82715018p5 0x1.100000003a8a9p5 -0x1.3fffffffea5f2p2 0x1.50ep-19 F +REG epsg:20067 2 OK 0x1.01a4e3b86563cp20 -0x1.0ef565426f124p19 -0x1.4573d7766p5 0x1.5fffffffc5513p5 -0x1.3fffffffea4fdp2 0x1.51ap-19 F +REG epsg:20067 3 OK -0x1.ae558fb84201p15 0x1.0f09caecb8c23p19 -0x1.766b3e91ep5 0x1.100000003a89ap5 0x1.3fffffffea5d8p2 0x1.51p-19 F +REG epsg:20067 4 OK 0x1.01a4cfd0aef22p20 0x1.0f09c8f72bc37p19 -0x1.a77031e74p4 0x1.5fffffffc552p5 0x1.3fffffffea4e6p2 0x1.51ep-19 F +REG epsg:20068 0 OK 0x1.e862758d1100dp18 0x1.463ddf209114p6 -0x1.f5853094cp4 0x1.68p5 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:20068 1 OK -0x1.ae64830d0116p15 -0x1.0ef545cb6889cp19 -0x1.84ab11f42p5 0x1.400000003a8b8p5 -0x1.3fffffffea5e9p2 0x1.50cp-19 F +REG epsg:20068 2 OK 0x1.01a45ef714f45p20 -0x1.0ef543d5f585p19 -0x1.d81e5ee88p4 0x1.8fffffffc5525p5 -0x1.3fffffffea506p2 0x1.51ep-19 F +REG epsg:20068 3 OK -0x1.ae6206570beep15 0x1.0f09a97dcd4ap19 -0x1.12ef4a256p5 0x1.400000003a8a9p5 0x1.3fffffffea5dp2 0x1.51p-19 F +REG epsg:20068 4 OK 0x1.01a44b0f76cd5p20 0x1.0f09a78834f99p19 -0x1.e94df85a8p3 0x1.8fffffffc5534p5 0x1.3fffffffea4fp2 0x1.51cp-19 F +REG epsg:20069 0 OK 0x1.e860579c48266p18 0x1.463db9c42bd77p6 -0x1.446381a24p4 0x1.97fffffffffffp5 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:20069 1 OK -0x1.ae7386925d5ep15 -0x1.0ef526b00de8bp19 -0x1.26e4bc718p5 0x1.700000003a8cbp5 -0x1.3fffffffea5dfp2 0x1.50ep-19 F +REG epsg:20069 2 OK 0x1.01a3c81905d66p20 -0x1.0ef524ba8d932p19 -0x1.341874b44p4 0x1.bfffffffc553fp5 -0x1.3fffffffea512p2 0x1.518p-19 F +REG epsg:20069 3 OK -0x1.ae7109dac887p15 0x1.0f098a6021995p19 -0x1.6a5204dap4 0x1.700000003a8bcp5 0x1.3fffffffea5c9p2 0x1.50ep-19 F +REG epsg:20069 4 OK 0x1.01a3b43182486p20 0x1.0f09886a7bf5ep19 -0x1.4284a85ep2 0x1.bfffffffc554fp5 0x1.3fffffffea4f9p2 0x1.51ap-19 F +REG epsg:2007 0 OK 0x1.864dd2d9c0bb3p18 -0x1.12773fa3a0916p8 0x1.6669018cdp6 -0x1.f000000000002p5 0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:2007 1 OK -0x1.2f30dc876c6c8p17 -0x1.0efdc2838e799p19 0x1.1e68d43a28p7 -0x1.0bffffffe1da3p6 -0x1.3fffffffea34p2 0x1.4p-27 F +REG epsg:2007 2 OK 0x1.d21a0985bfab7p19 -0x1.0efdc2816bcbp19 0x1.5864b3413p6 -0x1.c80000003bdf9p5 -0x1.3fffffffea60dp2 -0x1.4p-27 F +REG epsg:2007 3 OK -0x1.2f32f4a570e38p17 0x1.0eb92549974a5p19 0x1.7d561cfa9p6 -0x1.0bffffffe1d88p6 0x1.3fffffffea39p2 0x1.0p-27 F +REG epsg:2007 4 OK 0x1.d21a8f64d4512p19 0x1.0eb9254775a9bp19 0x1.31d16d53cp5 -0x1.c80000003be2ep5 0x1.3fffffffea66p2 -0x1.ap-27 F +REG epsg:20070 0 OK 0x1.e85df29445b18p18 0x1.463d9798dd9afp6 -0x1.44c74b3c8p3 0x1.c800000000001p5 0x0.0p0 0x1.54p-19 T +REG epsg:20070 1 OK -0x1.ae84ece05747p15 -0x1.0ef50a3d04b87p19 -0x1.9fb62de7p4 0x1.a00000003a8e3p5 -0x1.3fffffffea5d6p2 0x1.514p-19 F +REG epsg:20070 2 OK 0x1.01a320c56020fp20 -0x1.0ef5084775361p19 -0x1.4143f08p3 0x1.efffffffc5559p5 -0x1.3fffffffea51dp2 0x1.518p-19 F +REG epsg:20070 3 OK -0x1.ae827026bd12p15 0x1.0f096deafa03fp19 -0x1.787da6ef8p3 0x1.a00000003a8d6p5 0x1.3fffffffea5bfp2 0x1.50ep-19 F +REG epsg:20070 4 OK 0x1.01a30cddf92fep20 0x1.0f096bf54531ap19 0x1.0b54f2b5p2 0x1.efffffffc5569p5 0x1.3fffffffea506p2 0x1.51ap-19 F +REG epsg:20071 0 OK 0x1.e85b4d2c784ddp18 0x1.463d78fe7a9afp6 -0x1.14bf763cp0 0x1.f7ffffffffffep5 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20071 1 OK -0x1.ae98852951p15 -0x1.0ef4f0c216984p19 -0x1.01047ccdp4 0x1.d00000003a8ffp5 -0x1.3fffffffea5cfp2 0x1.50cp-19 F +REG epsg:20071 2 OK 0x1.01a26ad17412ap20 -0x1.0ef4eecc7638p19 -0x1.f587ece8p0 0x1.0fffffffe2abbp6 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:20071 3 OK -0x1.ae96086d516dp15 0x1.0f09546e261a6p19 -0x1.d8d39b38p0 0x1.d00000003a8efp5 0x1.3fffffffea5b7p2 0x1.50cp-19 F +REG epsg:20071 4 OK 0x1.01a256ea2b72p20 0x1.0f09527860679p19 0x1.883d46388p3 0x1.0fffffffe2ac3p6 0x1.3fffffffea513p2 0x1.51cp-19 F +REG epsg:20072 0 OK 0x1.e8586ed0d4b6cp18 0x1.463d5e4ad68dbp6 0x1.b532671ap2 0x1.14p6 0x0.0p0 0x1.542p-19 T +REG epsg:20072 1 OK -0x1.aeae1877b2a9p15 -0x1.0ef4da86b93c1p19 -0x1.cdc5ec8ap2 0x1.000000001d48cp6 -0x1.3fffffffea5cp2 0x1.512p-19 F +REG epsg:20072 2 OK 0x1.01a1a83b95c05p20 -0x1.0ef4d891067c3p19 0x1.39657375p2 0x1.27ffffffe2acbp6 -0x1.3fffffffea534p2 0x1.51cp-19 F +REG epsg:20072 3 OK -0x1.aeab9bb8f46bp15 0x1.0f093e3120e2ep19 0x1.c016cc96p2 0x1.000000001d485p6 0x1.3fffffffea5aap2 0x1.512p-19 F +REG epsg:20072 4 OK 0x1.01a194546ccebp20 0x1.0f093c3b48cddp19 0x1.31d06ea68p4 0x1.27ffffffe2ad2p6 0x1.3fffffffea51fp2 0x1.51cp-19 F +REG epsg:20073 0 OK 0x1.e8555f8d04ed5p18 0x1.463d47c8d4012p6 0x1.b005fea7p3 0x1.2cp6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20073 1 OK -0x1.aec56a481028p15 -0x1.0ef4c7c94612bp19 0x1.dd717cp-2 0x1.180000001d49cp6 -0x1.3fffffffea5b6p2 0x1.50ep-19 F +REG epsg:20073 2 OK 0x1.01a0db2585dadp20 -0x1.0ef4c5d37fa52p19 0x1.4e7fe69d8p3 0x1.3fffffffe2adap6 -0x1.3fffffffea542p2 0x1.516p-19 F +REG epsg:20073 3 OK -0x1.aec2ed8641a8p15 0x1.0f092b7248711p19 0x1.d5d9c44c8p3 0x1.180000001d495p6 0x1.3fffffffea59ep2 0x1.516p-19 F +REG epsg:20073 4 OK 0x1.01a0c73e7d9dep20 0x1.0f09297c5cab5p19 0x1.8ab6f8054p4 0x1.3fffffffe2ae2p6 0x1.3fffffffea52bp2 0x1.51ap-19 F +REG epsg:20074 0 OK 0x1.e85227f5d7f9fp18 0x1.463d35b79266ep6 0x1.2dabef1acp4 0x1.44p6 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:20074 1 OK -0x1.aede3932e014p15 -0x1.0ef4b8be4b768p19 0x1.b9624cbbp2 0x1.300000001d4acp6 -0x1.3fffffffea5aap2 0x1.514p-19 F +REG epsg:20074 2 OK 0x1.01a005ce772dp20 -0x1.0ef4b6c87044cp19 0x1.d4c3de38p3 0x1.57ffffffe2aedp6 -0x1.3fffffffea55p2 0x1.51ap-19 F +REG epsg:20074 3 OK -0x1.aedbbc6db854p15 0x1.0f091c662f097p19 0x1.51cfa0438p4 0x1.300000001d4a5p6 0x1.3fffffffea594p2 0x1.51p-19 F +REG epsg:20074 4 OK 0x1.019ff1e7904ecp20 0x1.0f091a702e7c6p19 0x1.cdd8e9f3cp4 0x1.57ffffffe2af4p6 0x1.3fffffffea539p2 0x1.518p-19 F +REG epsg:20075 0 OK 0x1.e84ed111313f7p18 0x1.463d2849bd1d6p6 0x1.6d572a978p4 0x1.5cp6 0x0.0p0 0x1.542p-19 T +REG epsg:20075 1 OK -0x1.aef83fa3e827p15 -0x1.0ef4ad8ff956dp19 0x1.802cbbba8p3 0x1.480000001d4bcp6 -0x1.3fffffffea598p2 0x1.516p-19 F +REG epsg:20075 2 OK 0x1.019f2a8cc18e2p20 -0x1.0ef4ab9a0884fp19 0x1.1703080dcp4 0x1.6fffffffe2afep6 -0x1.3fffffffea55fp2 0x1.514p-19 F +REG epsg:20075 3 OK -0x1.aef5c2db2787p15 0x1.0f09113707bf5p19 0x1.a38d5eedp4 0x1.480000001d4b4p6 0x1.3fffffffea582p2 0x1.514p-19 F +REG epsg:20075 4 OK 0x1.019f16a5fc5bp20 0x1.0f090f40f18fp19 0x1.fa79fc54cp4 0x1.6fffffffe2b06p6 0x1.3fffffffea548p2 0x1.514p-19 F +REG epsg:20076 0 OK 0x1.e84b643cbaf5ep18 0x1.463d1fa4fd619p6 0x1.9652209acp4 0x1.7400000000001p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20076 1 OK -0x1.af13349d5bd8p15 -0x1.0ef4a65daaf1cp19 0x1.f793c9d88p3 0x1.600000001d4cep6 -0x1.3fffffffea58dp2 0x1.51p-19 F +REG epsg:20076 2 OK 0x1.019e4bc75405ep20 -0x1.0ef4a467a3e07p19 0x1.2ca613184p4 0x1.87ffffffe2b1p6 -0x1.3fffffffea56dp2 0x1.514p-19 F +REG epsg:20076 3 OK -0x1.af10b7d0ccd5p15 0x1.0f090a043026cp19 0x1.df40dd34cp4 0x1.600000001d4c7p6 0x1.3fffffffea575p2 0x1.514p-19 F +REG epsg:20076 4 OK 0x1.019e37e0b06bcp20 0x1.0f09080e03b3cp19 0x1.080e8218ep5 0x1.87ffffffe2b18p6 0x1.3fffffffea556p2 0x1.518p-19 F +REG epsg:20077 0 OK 0x1.e847eb13a2b4cp18 0x1.463d1be190bb3p6 0x1.a829e201cp4 0x1.8c00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:20077 1 OK -0x1.af2ecc848badp15 -0x1.0ef4a33b8eebap19 0x1.20cbb7da4p4 0x1.780000001d4ep6 -0x1.3fffffffea57dp2 0x1.514p-19 F +REG epsg:20077 2 OK 0x1.019d6beef86dap20 -0x1.0ef4a145713afp19 0x1.2b0e61574p4 0x1.9fffffffe2b23p6 -0x1.3fffffffea57dp2 0x1.51p-19 F +REG epsg:20077 3 OK -0x1.af2c4fb4036cp15 0x1.0f0906e1d864fp19 0x1.022155588p5 0x1.780000001d4d8p6 0x1.3fffffffea567p2 0x1.50ep-19 F +REG epsg:20077 4 OK 0x1.019d580875fc4p20 0x1.0f0904eb954f5p19 0x1.0742a955ep5 0x1.9fffffffe2b2ap6 0x1.3fffffffea568p2 0x1.51p-19 F +REG epsg:20078 0 OK 0x1.e8446f53a992ep18 0x1.463d1d0a0507bp6 0x1.a2ac63ffcp4 0x1.a400000000001p6 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20078 1 OK -0x1.af4ab9f5e722p15 -0x1.0ef4a4326ebb9p19 0x1.2eb40c318p4 0x1.900000001d4f2p6 -0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:20078 2 OK 0x1.019c8d777b728p20 -0x1.0ef4a23c3a4b9p19 0x1.12406a388p4 0x1.b7ffffffe2b34p6 -0x1.3fffffffea58ap2 0x1.514p-19 F +REG epsg:20078 3 OK -0x1.af483d2145fp15 0x1.0f0907d8ca989p19 0x1.09157e7e6p5 0x1.900000001d4eap6 0x1.3fffffffea557p2 0x1.512p-19 F +REG epsg:20078 4 OK 0x1.019c7991195cbp20 0x1.0f0905e270c04p19 0x1.f5b75f32cp4 0x1.b7ffffffe2b3bp6 0x1.3fffffffea575p2 0x1.518p-19 F +REG epsg:20079 0 OK 0x1.e840fac1d36cfp18 0x1.463d231b1ae3cp6 0x1.85e90c734p4 0x1.bc00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:20079 1 OK -0x1.af66ae9dfddp15 -0x1.0ef4a93f9609fp19 0x1.255be0958p4 0x1.a80000001d504p6 -0x1.3fffffffea562p2 0x1.516p-19 F +REG epsg:20079 2 OK 0x1.019bb2d0cc32bp20 -0x1.0ef4a7494afabp19 0x1.c5037de5p3 0x1.cfffffffe2b45p6 -0x1.3fffffffea59cp2 0x1.512p-19 F +REG epsg:20079 3 OK -0x1.af6431c52f75p15 0x1.0f090ce652361p19 0x1.046969606p5 0x1.a80000001d4fcp6 0x1.3fffffffea545p2 0x1.51ap-19 F +REG epsg:20079 4 OK 0x1.019b9eea89508p20 0x1.0f090aefe1bb2p19 0x1.c5f8baf2p4 0x1.cfffffffe2b4dp6 0x1.3fffffffea583p2 0x1.512p-19 F +REG epsg:2008 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG epsg:2008 1 OK -0x1.e8f3aaf36b4bp17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e3ffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2008 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.940000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2008 3 OK -0x1.e8f3aaf36b4bp17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e3ffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2008 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.940000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:20080 0 OK 0x1.e83d970f01d21p18 0x1.463d2e03cec63p6 0x1.523086b44p4 0x1.d400000000002p6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20080 1 OK -0x1.af825c15223ap15 -0x1.0ef4b254da438p19 0x1.04dd6a258p4 0x1.c00000001d516p6 -0x1.3fffffffea54fp2 0x1.516p-19 F +REG epsg:20080 2 OK 0x1.019ade6026a62p20 -0x1.0ef4b05e78f52p19 0x1.38b08eecp3 0x1.e7ffffffe2b58p6 -0x1.3fffffffea5a9p2 0x1.518p-19 F +REG epsg:20080 3 OK -0x1.af7fdf381e36p15 0x1.0f0915fc439cap19 0x1.e85461184p4 0x1.c00000001d50ep6 0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:20080 4 OK 0x1.019aca7a01782p20 0x1.0f091405bcdf4p19 0x1.7fcf4dc68p4 0x1.e7ffffffe2b5fp6 0x1.3fffffffea593p2 0x1.512p-19 F +REG epsg:20081 0 OK 0x1.e83a4dbcc74ffp18 0x1.463d3da588b23p6 0x1.0813e164cp4 0x1.ebfffffffffffp6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20081 1 OK -0x1.af9d74bb448p15 -0x1.0ef4bf58c251fp19 0x1.9b2795f9p3 0x1.d80000001d529p6 -0x1.3fffffffea545p2 0x1.512p-19 F +REG epsg:20081 2 OK 0x1.019a12795c07p20 -0x1.0ef4bd624b633p19 0x1.02232bb2p2 0x1.ffffffffe2b67p6 -0x1.3fffffffea5b4p2 0x1.50ep-19 F +REG epsg:20081 3 OK -0x1.af9af7da0e2p15 0x1.0f09230123cfbp19 0x1.b10aca108p4 0x1.d80000001d522p6 0x1.3fffffffea52ap2 0x1.51ap-19 F +REG epsg:20081 4 OK 0x1.0199fe9352ba6p20 0x1.0f09210a876efp19 0x1.23ffdebdcp4 0x1.ffffffffe2b6cp6 0x1.3fffffffea5a1p2 0x1.51p-19 F +REG epsg:20082 0 OK 0x1.e8372802bf77bp18 0x1.463d51d471fc3p6 0x1.50c5ef54p3 0x1.02p7 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20082 1 OK -0x1.afb7ac919e69p15 -0x1.0ef4d026ce03dp19 0x1.0034254cp3 0x1.f00000001d537p6 -0x1.3fffffffea536p2 0x1.51ap-19 F +REG epsg:20082 2 OK 0x1.019951584c107p20 -0x1.0ef4ce3042511p19 -0x1.7f59c062p1 0x1.0bfffffff15bcp7 -0x1.3fffffffea5c5p2 0x1.50ep-19 F +REG epsg:20082 3 OK -0x1.afb52fac44bep15 0x1.0f0933d06fe69p19 0x1.63911d1e4p4 0x1.f00000001d52fp6 0x1.3fffffffea51fp2 0x1.518p-19 F +REG epsg:20082 4 OK 0x1.01993d725c844p20 0x1.0f0931d9bebe9p19 0x1.6717d89cp3 0x1.0bfffffff15bfp7 0x1.3fffffffea5acp2 0x1.514p-19 F +REG epsg:20083 0 OK 0x1.e8342eb4b5d8ep18 0x1.463d6a57f02eap6 0x1.a15152bcp1 0x1.0ep7 0x0.0p0 0x1.544p-19 T +REG epsg:20083 1 OK -0x1.afd0ba0fcd39p15 -0x1.0ef4e48fdc621p19 0x1.d498b4e8p0 0x1.040000000eaa4p7 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:20083 2 OK 0x1.01989d1aa1438p20 -0x1.0ef4e2993d018p19 -0x1.6790baefp3 0x1.17fffffff15c2p7 -0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:20083 3 OK -0x1.afce3d266af1p15 0x1.0f09483b03671p19 0x1.00c0a44dcp4 0x1.040000000eaap7 0x1.3fffffffea512p2 0x1.514p-19 F +REG epsg:20083 4 OK 0x1.01988934c90e9p20 0x1.0f0946443e8e7p19 0x1.7d76d238p1 0x1.17fffffff15c6p7 0x1.3fffffffea5b6p2 0x1.516p-19 F +REG epsg:20084 0 OK 0x1.e8316a29e4fe3p18 0x1.463d86eb43bcep6 -0x1.4d4242bp2 0x1.1ap7 0x0.0p0 0x1.54p-19 T +REG epsg:20084 1 OK -0x1.afe856f20731p15 -0x1.0ef4fc5aafcf4p19 -0x1.67229e2dp2 0x1.100000000eaabp7 -0x1.3fffffffea51ap2 0x1.52p-19 F +REG epsg:20084 2 OK 0x1.0197f7b9e1ee4p20 -0x1.0ef4fa63fe0f3p19 -0x1.499cd05f8p4 0x1.23fffffff15c9p7 -0x1.3fffffffea5dap2 0x1.50ep-19 F +REG epsg:20084 3 OK -0x1.afe5da04c248p15 0x1.0f0960079c70bp19 0x1.135d05ed8p3 0x1.100000000eaa8p7 0x1.3fffffffea501p2 0x1.51ep-19 F +REG epsg:20084 4 OK 0x1.0197e3d41e65fp20 0x1.0f095e10c535dp19 -0x1.98960a64p2 0x1.23fffffff15cdp7 0x1.3fffffffea5c2p2 0x1.50ep-19 F +REG epsg:20085 0 OK 0x1.e82ee225924bbp18 0x1.463da73e48be3p6 -0x1.d92280d7p3 0x1.26p7 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:20085 1 OK -0x1.affe40fe2695p15 -0x1.0ef517448e83p19 -0x1.c79d2479p3 0x1.1c0000000eab2p7 -0x1.3fffffffea50ep2 0x1.51cp-19 F +REG epsg:20085 2 OK 0x1.01976305e6612p20 -0x1.0ef5154dcbe4cp19 -0x1.efc457ed4p4 0x1.2ffffffff15dp7 -0x1.3fffffffea5e4p2 0x1.50ep-19 F +REG epsg:20085 3 OK -0x1.affbc40d2fefp15 0x1.0f097af37c42ep19 -0x1.5d4dbap-6 0x1.1c0000000eaaep7 0x1.3fffffffea4f5p2 0x1.51cp-19 F +REG epsg:20085 4 OK 0x1.01974f2034a0dp20 0x1.0f0978fc94278p19 -0x1.0c4cf1b84p4 0x1.2ffffffff15d3p7 0x1.3fffffffea5cdp2 0x1.50ap-19 F +REG epsg:20086 0 OK 0x1.e82c9dc1489ap18 0x1.463dcaf657a0ap6 -0x1.95ea1277p4 0x1.32p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20086 1 OK -0x1.b0123abd6595p15 -0x1.0ef53501fd9d7p19 -0x1.7f451961cp4 0x1.280000000eab7p7 -0x1.3fffffffea503p2 0x1.51cp-19 F +REG epsg:20086 2 OK 0x1.0196e09fc406p20 -0x1.0ef5330b2bd1fp19 -0x1.523678eacp5 0x1.3bfffffff15d4p7 -0x1.3fffffffea5ecp2 0x1.51p-19 F +REG epsg:20086 3 OK -0x1.b00fbdc8f86fp15 0x1.0f0998b3225ebp19 -0x1.379b876e8p3 0x1.280000000eab4p7 0x1.3fffffffea4edp2 0x1.51ap-19 F +REG epsg:20086 4 OK 0x1.0196ccba20f74p20 0x1.0f0996bc2b14p19 -0x1.c0f5711p4 0x1.3bfffffff15d8p7 0x1.3fffffffea5d6p2 0x1.50cp-19 F +REG epsg:20087 0 OK 0x1.e82aa358ee7bbp18 0x1.463df1af4352fp6 -0x1.26c008184p5 0x1.3ep7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20087 1 OK -0x1.b0240c28c053p15 -0x1.0ef5553f94c81p19 -0x1.153c1bb7ep5 0x1.340000000eabfp7 -0x1.3fffffffea4f9p2 0x1.52p-19 F +REG epsg:20087 2 OK 0x1.019671f53b872p20 -0x1.0ef55348b5ab2p19 -0x1.b2cdf6984p5 0x1.47fffffff15d9p7 -0x1.3fffffffea5f5p2 0x1.50cp-19 F +REG epsg:20087 3 OK -0x1.b0218f3121a2p15 0x1.0f09b8f320378p19 -0x1.4700c899p4 0x1.340000000eabbp7 0x1.3fffffffea4e3p2 0x1.51ap-19 F +REG epsg:20087 4 OK 0x1.01965e0fa3ea2p20 0x1.0f09b6fc1b993p19 -0x1.41122801p5 0x1.47fffffff15ddp7 0x1.3fffffffea5ddp2 0x1.50ep-19 F +REG epsg:20088 0 OK 0x1.e828f878f0072p18 0x1.463e1afc72284p6 -0x1.88a82964ap5 0x1.4ap7 0x0.0p0 0x1.544p-19 T +REG epsg:20088 1 OK -0x1.b03383461aabp15 -0x1.0ef577a2e8139p19 -0x1.71c3e1b64p5 0x1.400000000eac3p7 -0x1.3fffffffea4f1p2 0x1.52p-19 F +REG epsg:20088 2 OK 0x1.0196183cb6cbep20 -0x1.0ef575abfda56p19 -0x1.0c4cdddafp6 0x1.53fffffff15ddp7 -0x1.3fffffffea5f9p2 0x1.51p-19 F +REG epsg:20088 3 OK -0x1.b031064b9856p15 0x1.0f09db590321ep19 -0x1.00081caf6p5 0x1.400000000eabep7 0x1.3fffffffea4dbp2 0x1.52p-19 F +REG epsg:20088 4 OK 0x1.019604572740ep20 0x1.0f09d961f330dp19 -0x1.a6ddde26ap5 0x1.53fffffff15e1p7 0x1.3fffffffea5e3p2 0x1.51p-19 F +REG epsg:20089 0 OK 0x1.e827a1ceae3edp18 0x1.463e466a0e5aep6 -0x1.ef9ad39cep5 0x1.56p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:20089 1 OK -0x1.b04074b46f84p15 -0x1.0ef59bcb8581bp19 -0x1.d43659bb8p5 0x1.4c0000000eac7p7 -0x1.3fffffffea4ebp2 0x1.518p-19 F +REG epsg:20089 2 OK 0x1.0195d471e223ap20 -0x1.0ef599d491e2bp19 -0x1.413e22f51p6 0x1.5ffffffff15ep7 -0x1.3fffffffea601p2 0x1.508p-19 F +REG epsg:20089 3 OK -0x1.b03df7b75f95p15 0x1.0f09ff8451f1p19 -0x1.627a863a8p5 0x1.4c0000000eac4p7 0x1.3fffffffea4d4p2 0x1.52p-19 F +REG epsg:20089 4 OK 0x1.0195c08c57341p20 0x1.0f09fd8d38cdbp19 -0x1.08602c645p6 0x1.5ffffffff15e3p7 0x1.3fffffffea5e8p2 0x1.50ep-19 F +REG epsg:2009 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG epsg:2009 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2009 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2009 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2009 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:20090 0 OK 0x1.e826a31b5fc07p18 0x1.463e737e4adccp6 -0x1.2d3ba49ep6 0x1.62p7 -0x1.2f74bf1dcf457p-62 0x1.54p-19 T +REG epsg:20090 1 OK -0x1.b04abc2582eep15 -0x1.0ef5c15403778p19 -0x1.1dbfb3186p6 0x1.580000000eacbp7 -0x1.3fffffffea4e7p2 0x1.51ap-19 F +REG epsg:20090 2 OK 0x1.0195a752ea19bp20 -0x1.0ef5bf5d08e11p19 -0x1.77a64d3e7p6 -0x1.640000000ea1fp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:20090 3 OK -0x1.b0483f264291p15 0x1.0f0a250f9b7c6p19 -0x1.c9c3837fap5 0x1.580000000eac7p7 0x1.3fffffffea4cfp2 0x1.52p-19 F +REG epsg:20090 4 OK 0x1.0195936d60424p20 0x1.0f0a23187b60ap19 -0x1.3ec84eadap6 -0x1.640000000ea1bp7 0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:20091 0 OK 0x1.e825ff2987834p18 0x1.463ea1bab8e7dp6 -0x1.6408e9415p6 -0x1.62p7 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:20091 1 OK -0x1.b0523cc3be38p15 -0x1.0ef5e7d31d1ffp19 -0x1.533eab99fp6 0x1.640000000eacdp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:20091 2 OK 0x1.0195915e65b86p20 -0x1.0ef5e5dc1ddecp19 -0x1.aeecc3a18p6 -0x1.580000000ea1ep7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:20091 3 OK -0x1.b04fbfc2b0cp15 0x1.0f0a4b919317ep19 -0x1.1a60b263ap6 0x1.640000000eac9p7 0x1.3fffffffea4cbp2 0x1.51ap-19 F +REG epsg:20091 4 OK 0x1.01957d78d9728p20 0x1.0f0a499a6e50ep19 -0x1.760ebceffp6 -0x1.580000000ea1ap7 0x1.3fffffffea5edp2 0x1.508p-19 F +REG epsg:20092 0 OK 0x1.e825b7c51f4fep18 0x1.463ed09daa8ddp6 -0x1.9b9b8306bp6 -0x1.56p7 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:20092 1 OK -0x1.b056e1831b1dp15 -0x1.0ef60edcd9a3p19 -0x1.8a020b83cp6 -0x1.5ffffffff1532p7 -0x1.3fffffffea4ep2 0x1.516p-19 F +REG epsg:20092 2 OK 0x1.019592d1f30f5p20 -0x1.0ef60ce5d8106p19 -0x1.e6767d49ep6 -0x1.4c0000000ea1dp7 -0x1.3fffffffea606p2 0x1.508p-19 F +REG epsg:20092 3 OK -0x1.b0546480a8eap15 0x1.0f0a729e37e13p19 -0x1.51240a3fbp6 -0x1.5ffffffff1536p7 0x1.3fffffffea4c8p2 0x1.522p-19 F +REG epsg:20092 4 OK 0x1.01957eec60db5p20 0x1.0f0a70a710c87p19 -0x1.ad986e6d7p6 -0x1.4c0000000ea1ap7 0x1.3fffffffea5fp2 0x1.50ap-19 F +REG epsg:2010 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2010 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2010 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2010 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2010 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2011 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:2011 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2011 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2011 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2011 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2012 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG epsg:2012 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2012 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2012 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2012 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2013 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG epsg:2013 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2dffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2013 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.060000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2013 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2dffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2013 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.060000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:20135 0 OK 0x1.e83881c8e8ac4p18 -0x1.97d584e5bd378p7 0x1.549aada0ep5 0x1.bp4 0x0.0p0 -0x1.0p-30 T +REG epsg:20135 1 OK -0x1.ade63e3fb0a4p15 -0x1.0efc6519cd66ap19 0x1.0cd75fb8ep6 0x1.6p4 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:20135 2 OK 0x1.018b72cadf1c6p20 -0x1.0efc6519666cp19 0x1.c38f28bccp5 0x1.0p5 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:20135 3 OK -0x1.adec76c3c065p15 0x1.0ec96ad8c9dcfp19 0x1.fa5d5dcfcp4 0x1.6p4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20135 4 OK 0x1.018ba48c2ae64p20 0x1.0ec96ad863081p19 0x1.4e1df107cp4 0x1.0p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20136 0 OK 0x1.e8348ce60ab8dp18 -0x1.97d5a3d0c314ap7 0x1.19fb34d02p5 0x1.07fffffffffffp5 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:20136 1 OK -0x1.ae072b1f1193p15 -0x1.0efc79b20791ep19 0x1.ea809048ap5 0x1.bffffffffffffp4 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:20136 2 OK 0x1.018a7fbd77f6cp20 -0x1.0efc79b1864f5p19 0x1.7e627e916p5 0x1.3p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:20136 3 OK -0x1.ae0d63b01ae8p15 0x1.0ec97f6d2e6f3p19 0x1.9c00dcc68p4 0x1.bffffffffffffp4 0x1.4p2 -0x1.0p-29 F +REG epsg:20136 4 OK 0x1.018ab17e7279ep20 0x1.0ec97f6cad5c3p19 0x1.8788d399p3 0x1.3p5 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:20137 0 OK 0x1.e830ce8f8ac2p18 -0x1.97d5c98bfb6bbp7 0x1.a4e142d4cp4 0x1.3800000000001p5 0x0.0p0 -0x1.0p-30 T +REG epsg:20137 1 OK -0x1.ae26ab593385p15 -0x1.0efc92d40f231p19 0x1.ade8cb7dp5 0x1.1000000000001p5 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:20137 2 OK 0x1.01899c913f822p20 -0x1.0efc92d375067p19 0x1.2cfb789aep5 0x1.6p5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:20137 3 OK -0x1.ae2ce3f6e667p15 0x1.0ec9988a88195p19 0x1.22d1269bp4 0x1.1p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:20137 4 OK 0x1.0189ce51f0357p20 0x1.0ec99889ee357p19 0x1.07b10fdp1 0x1.6p5 0x1.4p2 -0x1.0p-29 F +REG epsg:20138 0 OK 0x1.e82d51453abd6p18 -0x1.97d5f5ad95ceep7 0x1.fb0e621d8p3 0x1.67fffffffffffp5 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:20138 1 OK -0x1.ae446694c56fp15 -0x1.0efcb039686f8p19 0x1.649161444p5 0x1.4000000000001p5 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:20138 2 OK 0x1.0188cbc35c1fp20 -0x1.0efcb038b72cbp19 0x1.a07cc87a4p4 0x1.9p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20138 3 OK -0x1.ae4a9f3eae5p15 0x1.0ec9b5ea68502p19 0x1.20443865p3 0x1.4000000000001p5 0x1.3fffffffffffcp2 0x0.0p0 F +REG epsg:20138 4 OK 0x1.0188fd83cb486p20 0x1.0ec9b5e9b74eap19 -0x1.310895f98p3 0x1.8ffffffffffffp5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2014 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG epsg:2014 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2014 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2014 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2014 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2015 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG epsg:2015 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2015 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2015 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2015 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2016 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG epsg:2016 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2016 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2016 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2016 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2017 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG epsg:2017 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2017 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2017 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2017 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2018 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG epsg:2018 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2018 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2018 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2018 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2019 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG epsg:2019 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2019 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2019 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2019 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2020 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.4ap6 0x0.0p0 0x0.0p0 T +REG epsg:2020 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.5dffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2020 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.360000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2020 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.5dffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2020 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.360000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2021 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2021 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.57ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2021 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.300000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2021 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.57ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2021 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.300000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2022 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:2022 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.63ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2022 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.3c0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2022 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.63ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2022 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.3c0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2023 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:2023 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2023 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.480000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2023 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2023 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.480000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2024 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:2024 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.7bffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2024 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.540000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2024 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.7bffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2024 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.540000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:20248 0 OK 0x1.e82572417f41dp18 0x1.b99583d66aac5p22 0x1.b59beccp5 0x1.a4000000024ddp6 -0x1.900000000758cp4 0x1.74dep-15 F +REG epsg:20248 1 OK -0x1.fdfb39f4e622p14 0x1.96ff34617e3bdp22 0x1.2c8b9be48p6 0x1.8deeb47e7cc13p6 -0x1.e000000008199p4 0x1.749p-15 F +REG epsg:20248 2 OK 0x1.f815256d53489p19 0x1.96ff3081ff026p22 0x1.afc87ba18p5 0x1.ba114b8187412p6 -0x1.e000000005069p4 0x1.9494p-15 F +REG epsg:20248 3 OK -0x1.305deee9a9d18p16 0x1.dac863b7bde78p22 0x1.bcc7a26b4p5 0x1.8deeb47e7d2e9p6 -0x1.40000000095ebp4 0x1.4adep-15 F +REG epsg:20248 4 OK 0x1.0718aa729a884p20 0x1.dac85e18afcdap22 0x1.050d96ef6p5 0x1.ba114b8187c27p6 -0x1.4000000006693p4 0x1.7942p-15 F +REG epsg:20249 0 OK 0x1.e82542dbf4fe9p18 0x1.b99568ed6b282p22 0x1.5483d5966p5 0x1.bc000000020aep6 -0x1.9000000005ac1p4 0x1.8944p-15 F +REG epsg:20249 1 OK -0x1.fe019d3f0ec6p14 0x1.96ff14bdc8582p22 0x1.fda0cdf8ap5 0x1.a5eeb47e7c98p6 -0x1.e0000000066e9p4 0x1.86bcp-15 F +REG epsg:20249 2 OK 0x1.f815303c65b2p19 0x1.96ff11aa7485cp22 0x1.528e5444p5 0x1.d2114b8186dbdp6 -0x1.e000000003668p4 0x1.a25cp-15 F +REG epsg:20249 3 OK -0x1.305febc3d2a7p16 0x1.dac84c808439cp22 0x1.5986fc8bap5 0x1.a5eeb47e7d10bp6 -0x1.4000000007c6bp4 0x1.64dap-15 F +REG epsg:20249 4 OK 0x1.0718af23c804p20 0x1.dac847d20919p22 0x1.3fc69cb94p4 0x1.d2114b818765fp6 -0x1.4000000004cafp4 0x1.8ebcp-15 F +REG epsg:2025 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:2025 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.87ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2025 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.600000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2025 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.87ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2025 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.600000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:20250 0 OK 0x1.e825704c6250ep18 0x1.b9954e81e362cp22 0x1.e5e614d3cp4 0x1.d400000001a7dp6 -0x1.900000000407bp4 0x1.9a9cp-15 F +REG epsg:20250 1 OK -0x1.fe022f5d2dbap14 0x1.96fef58a6fd3p22 0x1.a0c78ae26p5 0x1.bdeeb47e7c4d1p6 -0x1.e000000004c24p4 0x1.9704p-15 F +REG epsg:20250 2 OK 0x1.f81569e1f64e1p19 0x1.96fef352b70fdp22 0x1.eba24b208p4 0x1.ea114b81865aap6 -0x1.e000000001e01p4 0x1.ac46p-15 F +REG epsg:20250 3 OK -0x1.306078beea09p16 0x1.dac835c2d7aap22 0x1.e98b2aee4p4 0x1.bdeeb47e7ccfep6 -0x1.4000000006262p4 0x1.7ceep-15 F +REG epsg:20250 4 OK 0x1.0718cb003fc07p20 0x1.dac83217202eap22 0x1.da0790d3p2 0x1.ea114b8186ec2p6 -0x1.400000000339ap4 0x1.a004p-15 F +REG epsg:20251 0 OK 0x1.e825fa13776d8p18 0x1.b99534ddede27p22 0x1.23f663bc8p4 0x1.ec00000001284p6 -0x1.900000000278p4 0x1.a7d4p-15 F +REG epsg:20251 1 OK -0x1.fdfceeb35de4p14 0x1.96fed71ef7b9cp22 0x1.438fd9f54p5 0x1.d5eeb47e7be32p6 -0x1.e000000003259p4 0x1.a43cp-15 F +REG epsg:20251 2 OK 0x1.f815d1bc65ec5p19 0x1.96fed5cfe1bfap22 0x1.352a19c1cp4 0x1.0108a5c0c2e13p7 -0x1.e000000000801p4 0x1.b176p-15 F +REG epsg:20251 3 OK -0x1.305f944ef5c38p16 0x1.dac81fbe81088p22 0x1.1f3c0bb38p4 0x1.d5eeb47e7c6e9p6 -0x1.400000000489p4 0x1.91dap-15 F +REG epsg:20251 4 OK 0x1.0718fdb9e599dp20 0x1.dac81d24e81d1p22 -0x1.3df9dba6p2 0x1.0108a5c0c32ccp7 -0x1.4000000001bfep4 0x1.abfcp-15 F +REG epsg:20252 0 OK 0x1.e826deaee5d31p18 0x1.b9951c4975a21p22 0x1.95623013p2 0x1.020000000048bp7 -0x1.9000000001087p4 0x1.afe2p-15 F +REG epsg:20252 1 OK -0x1.fdf1e9fb1708p14 0x1.96feb9d0b2ba7p22 0x1.cdfe5fb28p4 0x1.edeeb47e7b5dbp6 -0x1.e000000001a48p4 0x1.ad7p-15 F +REG epsg:20252 2 OK 0x1.f81666a87ae26p19 0x1.96feb974bac6ep22 0x1.0767bf4bp3 0x1.0d08a5c0c28cap7 -0x1.dfffffffff518p4 0x1.b14cp-15 F +REG epsg:20252 3 OK -0x1.305d40f420eep16 0x1.dac80ab14180ep22 0x1.59602a98p2 0x1.edeeb47e7bf03p6 -0x1.4000000002fbp4 0x1.a254p-15 F +REG epsg:20252 4 OK 0x1.071946c27bf64p20 0x1.dac80936213bap22 -0x1.100f18d9p4 0x1.0d08a5c0c2da4p7 -0x1.400000000066ep4 0x1.b1d4p-15 F +REG epsg:20253 0 OK 0x1.e8281b9d9a6b3p18 0x1.b99505096c54bp22 -0x1.4f733461p2 0x1.0dfffffffff49p7 -0x1.8fffffffffc32p4 0x1.b228p-15 F +REG epsg:20253 1 OK -0x1.fde14019f6bp14 0x1.96fe9df1d3cd7p22 0x1.18325a338p4 0x1.02f75a3f3d613p7 -0x1.e0000000004c1p4 0x1.b1d2p-15 F +REG epsg:20253 2 OK 0x1.f8172704913b8p19 0x1.96fe9e90cb3bcp22 -0x1.367517ccp1 0x1.1908a5c0c2331p7 -0x1.dffffffffe5cp4 0x1.ab4ap-15 F +REG epsg:20253 3 OK -0x1.30598533bde5p16 0x1.dac7f6d625616p22 -0x1.bbb58a53p2 0x1.02f75a3f3dad3p7 -0x1.4000000001862p4 0x1.ad5ep-15 F +REG epsg:20253 4 OK 0x1.0719a54d325dcp20 0x1.dac7f682b45cbp22 -0x1.c913e4908p4 0x1.1908a5c0c282p7 -0x1.3fffffffff354p4 0x1.b0fp-15 F +REG epsg:20254 0 OK 0x1.e829ad66c253fp18 0x1.b994ef5f08ff1p22 -0x1.05a22ce44p4 0x1.19ffffffff9b8p7 -0x1.8ffffffffeafdp4 0x1.ae0ap-15 F +REG epsg:20254 1 OK -0x1.fdcb1fcb2afcp14 0x1.96fe83d087a18p22 0x1.9ee62f6fp2 0x1.0ef75a3f3d0bap7 -0x1.dfffffffff261p4 0x1.b0bep-15 F +REG epsg:20254 2 OK 0x1.f81810b52d843p19 0x1.96fe856f7ffbp22 -0x1.90fe5a1c8p3 0x1.2508a5c0c1d88p7 -0x1.dffffffffda56p4 0x1.9f3ep-15 F +REG epsg:20254 3 OK -0x1.30546b86022ep16 0x1.dac7e464de751p22 -0x1.2e6aec624p4 0x1.0ef75a3f3d598p7 -0x1.400000000032dp4 0x1.b226p-15 F +REG epsg:20254 4 OK 0x1.071a1850e39f5p20 0x1.dac7e53f15f5ap22 -0x1.3c42f3618p5 0x1.2508a5c0c227cp7 -0x1.3ffffffffe31ap4 0x1.a8fap-15 F +REG epsg:20255 0 OK 0x1.e82b8fa3868e7p18 0x1.b994db8711044p22 -0x1.ae04f44fcp4 0x1.25ffffffff411p7 -0x1.8ffffffffdd3cp4 0x1.a354p-15 F +REG epsg:20255 1 OK -0x1.fdafc71c76cep14 0x1.96fe6bb6194e2p22 -0x1.05f4472fp2 0x1.1af75a3f3cb1ap7 -0x1.dffffffffe3a6p4 0x1.a9ccp-15 F +REG epsg:20255 2 OK 0x1.f819212ae5575p19 0x1.96fe6e5756126p22 -0x1.5f983a3dcp4 0x1.3108a5c0c180cp7 -0x1.dffffffffd301p4 0x1.8d38p-15 F +REG epsg:20255 3 OK -0x1.304e0238ae938p16 0x1.dac7d39127c5ap22 -0x1.e607792ecp4 0x1.1af75a3f3d00ap7 -0x1.3fffffffff088p4 0x1.b024p-15 F +REG epsg:20255 4 OK 0x1.071a9e8afd305p20 0x1.dac7d59bb2f78p22 -0x1.8e3c82c76p5 0x1.3108a5c0c1cf7p7 -0x1.3ffffffffd5f2p4 0x1.9a04p-15 F +REG epsg:20256 0 OK 0x1.e82dbd0b63a9bp18 0x1.b994c9b92da7dp22 -0x1.25966b4bap5 0x1.31fffffffee96p7 -0x1.8ffffffffd324p4 0x1.921cp-15 F +REG epsg:20256 1 OK -0x1.fd8f82c03324p14 0x1.96fe55e624b6p22 -0x1.c32dc111p3 0x1.26f75a3f3c573p7 -0x1.dffffffffd8dep4 0x1.9cbcp-15 F +REG epsg:20256 2 OK 0x1.f81a55698d53dp19 0x1.96fe598914ff8p22 -0x1.ea71fb008p4 0x1.3d08a5c0c12fap7 -0x1.dffffffffcfcfp4 0x1.758cp-15 F +REG epsg:20256 3 OK -0x1.30465b46f4ee8p16 0x1.dac7c48a347a8p22 -0x1.49e003ffap5 0x1.26f75a3f3ca66p7 -0x1.3ffffffffe0c3p4 0x1.a714p-15 F +REG epsg:20256 4 OK 0x1.071b368307baap20 0x1.dac7c7c468f2ap22 -0x1.d990b2726p5 0x1.3d08a5c0c17cfp7 -0x1.3ffffffffcbe6p4 0x1.8446p-15 F +REG epsg:20257 0 OK 0x1.e8302f82fa9ep18 0x1.b994ba274fe5p22 -0x1.6db0830e6p5 0x1.3dfffffffe984p7 -0x1.8ffffffffccb5p4 0x1.7abp-15 F +REG epsg:20257 1 OK -0x1.fd6aad363d32p14 0x1.96fe429dd8d9p22 -0x1.76d2d0b9p4 0x1.32f75a3f3c004p7 -0x1.dffffffffd23cp4 0x1.89cap-15 F +REG epsg:20257 2 OK 0x1.f81baa109835cp19 0x1.96fe473f18f2ep22 -0x1.33c37cc1cp5 0x1.4908a5c0c0e8fp7 -0x1.dffffffffd08bp4 0x1.58c6p-15 F +REG epsg:20257 3 OK -0x1.303d8c270c828p16 0x1.dac7b77a2b6aep22 -0x1.9ad6aa876p5 0x1.32f75a3f3c4ecp7 -0x1.3ffffffffd419p4 0x1.96f6p-15 F +REG epsg:20257 4 OK 0x1.071bde8ec6e62p20 0x1.dac7bbe00b032p22 -0x1.0eb61c1fbp6 0x1.4908a5c0c133fp7 -0x1.3ffffffffc4f6p4 0x1.6878p-15 F +REG epsg:20258 0 OK 0x1.e832e02d313b1p18 0x1.b994acfd244e8p22 -0x1.ae868476cp5 0x1.49fffffffe513p7 -0x1.8ffffffffc9d5p4 0x1.5dacp-15 F +REG epsg:20258 1 OK -0x1.fd41adce2bc4p14 0x1.96fe32134c2c4p22 -0x1.ff8e4d038p4 0x1.3ef75a3f3bb09p7 -0x1.dffffffffcfadp4 0x1.713ap-15 F +REG epsg:20258 2 OK 0x1.f81d1b648f85cp19 0x1.96fe37acaf12cp22 -0x1.6abc2f10ep5 0x1.5508a5c0c0afep7 -0x1.dffffffffd4d6p4 0x1.37c2p-15 F +REG epsg:20258 3 OK -0x1.3033ad8e02d7p16 0x1.dac7ac85b0d9ep22 -0x1.e5049851p5 0x1.3ef75a3f3bfd9p7 -0x1.3ffffffffca96p4 0x1.8034p-15 F +REG epsg:20258 4 OK 0x1.071c94d6e4c18p20 0x1.dac7b20ff4e28p22 -0x1.2c885f548p6 0x1.5508a5c0c0f7dp7 -0x1.3ffffffffc0f3p4 0x1.4758p-15 F +REG epsg:2026 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2026 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.93ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2026 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6c0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2026 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.93ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2026 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6c0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:2027 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:2027 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2027 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:2027 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2027 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:2028 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:2028 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:2028 2 OK 0x1.01900c6b20dc2p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.48p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2028 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:2028 4 OK 0x1.01900c6b20dc2p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.48p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2029 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2029 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2029 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:2029 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2029 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:2030 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2030 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:2030 2 OK 0x1.01900c6b20dc2p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2030 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:2030 4 OK 0x1.01900c6b20dc2p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2031 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2031 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2031 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:2031 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2031 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:2032 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2032 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:2032 2 OK 0x1.01900c6b20dc2p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2032 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:2032 4 OK 0x1.01900c6b20dc2p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2033 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:2033 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.28p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2033 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:2033 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.28p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2033 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:2034 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:2034 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2034 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:2034 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2034 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:20348 0 OK 0x1.e8248cd4e3ef9p18 0x1.b99580bfbc8fcp22 0x1.95565649p5 0x1.a400000000001p6 -0x1.9000000000001p4 -0x1.8p-29 F +REG epsg:20348 1 OK -0x1.fe077d03e628p14 0x1.96ff2e98c5938p22 0x1.262157fe6p6 0x1.8deeb47e7a8d3p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:20348 2 OK 0x1.f814c8983cc99p19 0x1.96ff2e9944914p22 0x1.8f49e52p5 0x1.ba114b818572ep6 -0x1.dfffffffffffap4 0x1.0p-29 F +REG epsg:20348 3 OK -0x1.306265a83b85p16 0x1.dac85e8c802e7p22 0x1.9e359e51p5 0x1.8deeb47e7a8d3p6 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:20348 4 OK 0x1.07186ca6731d8p20 0x1.dac85e8cf8e61p22 0x1.a25311e48p4 0x1.ba114b818572fp6 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:20349 0 OK 0x1.e8247067634b5p18 0x1.b995679555194p22 0x1.295d11956p5 0x1.bc00000000001p6 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:20349 1 OK -0x1.fe0d917c331ap14 0x1.96ff109d82ceap22 0x1.e5dc24676p5 0x1.a5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:20349 2 OK 0x1.f814dcce9ef9fp19 0x1.96ff109e02291p22 0x1.284bd0dbp5 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:20349 3 OK -0x1.30641c09f1508p16 0x1.dac84a039d5bep22 0x1.2f1912042p5 0x1.a5eeb47e7a8d3p6 -0x1.4p4 0x0.0p0 F +REG epsg:20349 4 OK 0x1.071879d5a1501p20 0x1.dac84a04166c5p22 0x1.85a2367f8p3 0x1.d2114b818572dp6 -0x1.4p4 0x1.0p-29 F +REG epsg:2035 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2035 1 OK -0x1.ad818d641b6cp15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:2035 2 OK 0x1.01900c6b20dc4p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2035 3 OK -0x1.ad818d641b6cp15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:2035 4 OK 0x1.01900c6b20dc4p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:20350 0 OK 0x1.e824b7b7976bep18 0x1.b9954e7a1cdf8p22 0x1.7b4a048p4 0x1.d4p6 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:20350 1 OK -0x1.fe0d677a982ep14 0x1.96fef2b458374p22 0x1.7ea9c72c6p5 0x1.bdeeb47e7a8d3p6 -0x1.e000000000005p4 -0x1.0p-30 F +REG epsg:20350 2 OK 0x1.f81522cf4d09dp19 0x1.96fef2b4d6896p22 0x1.852b35b8cp4 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:20350 3 OK -0x1.306442ae6d3ep16 0x1.dac835871ee18p22 0x1.7e3eb85bp4 0x1.bdeeb47e7a8d3p6 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:20350 4 OK 0x1.07189fe82c7cp20 0x1.dac8358796f76p22 -0x1.9e95927cp0 0x1.ea114b818572cp6 -0x1.4p4 0x1.0p-30 F +REG epsg:20351 0 OK 0x1.e82561fda465fp18 0x1.b99535b47f0c2p22 0x1.4d7126b48p3 0x1.ec00000000001p6 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:20351 1 OK -0x1.fe06ff726e56p14 0x1.96fed5312abafp22 0x1.17cd0a28ap5 0x1.d5eeb47e7a8d4p6 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:20351 2 OK 0x1.f81599d6025d8p19 0x1.96fed531a6a27p22 0x1.7d122e3cp3 0x1.0108a5c0c2b97p7 -0x1.e000000000003p4 -0x1.8p-29 F +REG epsg:20351 3 OK -0x1.3062d928a0ca8p16 0x1.dac821507a96ap22 0x1.3e0a37ea8p3 0x1.d5eeb47e7a8d3p6 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:20351 4 OK 0x1.0718de7355fa4p20 0x1.dac82150f0616p22 -0x1.e2e261d68p3 0x1.0108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:20352 0 OK 0x1.e8266d5c1bef9p18 0x1.b9951d89f6e82p22 -0x1.452fc93ap1 0x1.0200000000001p7 -0x1.9000000000002p4 -0x1.8p-29 F +REG epsg:20352 1 OK -0x1.fdfa6b59442ep14 0x1.96feb866c1788p22 0x1.64ccdf00cp4 0x1.edeeb47e7a8d1p6 -0x1.e000000000001p4 -0x1.0p-28 F +REG epsg:20352 2 OK 0x1.f8164094f8a68p19 0x1.96feb867399aep22 -0x1.2197fcp-4 0x1.0d08a5c0c2b97p7 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:20352 3 OK -0x1.305fe36de392p16 0x1.dac80d986297p22 -0x1.e844b74ep1 0x1.edeeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:20352 4 OK 0x1.071934c7bb56ep20 0x1.dac80d98d4ccep22 -0x1.c169e4c5cp4 0x1.0d08a5c0c2b97p7 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:20353 0 OK 0x1.e827d6e536e04p18 0x1.b995063e4cf63p22 -0x1.e117fbcc8p3 0x1.0ep7 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:20353 1 OK -0x1.fde7ce7495f8p14 0x1.96fe9ca5dd906p22 0x1.3e4981a6p3 0x1.02f75a3f3d46ap7 -0x1.e000000000003p4 0x1.8p-29 F +REG epsg:20353 2 OK 0x1.f81715388f579p19 0x1.96fe9ca6509d8p22 -0x1.6f767dd5p3 0x1.1908a5c0c2b97p7 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:20353 3 OK -0x1.305b69cadfa78p16 0x1.dac7fa96263a2p22 -0x1.13812a3c8p4 0x1.02f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:20353 4 OK 0x1.0719a1f341db2p20 0x1.dac7fa96939b8p22 -0x1.43c61024ep5 0x1.1908a5c0c2b97p7 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:20354 0 OK 0x1.e8299aa30ab0ep18 0x1.b994f012d8cep22 -0x1.aec8cb41cp4 0x1.1ap7 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:20354 1 OK -0x1.fdcf5cf6fa58p14 0x1.96fe823c579bdp22 -0x1.f33e1318p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x1.0p-30 F +REG epsg:20354 2 OK 0x1.f818156c6a952p19 0x1.96fe823cc452p22 -0x1.6343b2704p4 0x1.2508a5c0c2b97p7 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:20354 3 OK -0x1.305578cc51698p16 0x1.dac7e87f16ebep22 -0x1.e20b0f754p4 0x1.0ef75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:20354 4 OK 0x1.071a24c3bd3e5p20 0x1.dac7e87f7e46dp22 -0x1.a0d6130fap5 0x1.2508a5c0c2b97p7 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:20355 0 OK 0x1.e82bb3a2a3e0bp18 0x1.b994db45c9cdep22 -0x1.30a364e92p5 0x1.26p7 -0x1.9000000000001p4 -0x1.8p-29 F +REG epsg:20355 1 OK -0x1.fdb15b6dd094p14 0x1.96fe6974454c6p22 -0x1.a84e44df8p3 0x1.1af75a3f3d469p7 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:20355 2 OK 0x1.f8193e61fb448p19 0x1.96fe6974aa7cp22 -0x1.00ece8b7p5 0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 -0x1.0p-28 F +REG epsg:20355 3 OK -0x1.304e211bda938p16 0x1.dac7d785f2992p22 -0x1.53317b6acp5 0x1.1af75a3f3d468p7 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:20355 4 OK 0x1.071abbca4a169p20 0x1.dac7d78652ccep22 -0x1.f6dff3794p5 0x1.3108a5c0c2b98p7 -0x1.4p4 0x1.0p-30 F +REG epsg:20356 0 OK 0x1.e82e1c01e69abp18 0x1.b994c81178a66p22 -0x1.8308a9998p5 0x1.32p7 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:20356 1 OK -0x1.fd8e1e010baap14 0x1.96fe529329953p22 -0x1.7db978534p4 0x1.26f75a3f3d46ap7 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:20356 2 OK 0x1.f81a8cd85e13ep19 0x1.96fe52938623cp22 -0x1.48e0653fcp5 0x1.3d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:20356 3 OK -0x1.304577514a91p16 0x1.dac7c7da55554p22 -0x1.af31143ap5 0x1.26f75a3f3d46ap7 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:20356 4 OK 0x1.071b655f52ae6p20 0x1.dac7c7daad552p22 -0x1.22792e7b4p6 0x1.3d08a5c0c2b97p7 -0x1.4p4 0x1.0p-29 F +REG epsg:20357 0 OK 0x1.e830cd000e61ap18 0x1.b994b6abc3a8ap22 -0x1.cdad17364p5 0x1.3ep7 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:20357 1 OK -0x1.fd66078733fep14 0x1.96fe3dd931a6ap22 -0x1.0d07a100ap5 0x1.32f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:20357 2 OK 0x1.f81bfd257b63dp19 0x1.96fe3dd984921p22 -0x1.88b27de92p5 0x1.4908a5c0c2b97p7 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:20357 3 OK -0x1.303b93b8e00f8p16 0x1.dac7b9a833c76p22 -0x1.020123436p6 0x1.32f75a3f3d469p7 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:20357 4 OK 0x1.071c1fa73306p20 0x1.dac7b9a8829dep22 -0x1.451929aa8p6 0x1.4908a5c0c2b97p7 -0x1.4p4 0x1.0p-29 F +REG epsg:20358 0 OK 0x1.e833bf109e75fp18 0x1.b994a74577a34p22 -0x1.07dfa8257p6 0x1.4ap7 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:20358 1 OK -0x1.fd39887038bp14 0x1.96fe2b8080e0ap22 -0x1.53b8ff486p5 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:20358 2 OK 0x1.f81d8b404e43ep19 0x1.96fe2b80c9419p22 -0x1.bfb02fb42p5 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:20358 3 OK -0x1.3030920f24c48p16 0x1.dac7ad175fd6ep22 -0x1.285b95713p6 0x1.3ef75a3f3d469p7 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:20358 4 OK 0x1.071ce8976ecd4p20 0x1.dac7ad17a4a82p22 -0x1.62eecc77fp6 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:2036 0 OK 0x1.312dp21 0x1.c9c37ffffffffp22 0x0.0p0 -0x1.0ap6 0x1.7400000000001p5 0x0.0p0 F +REG epsg:2036 1 OK 0x1.ce1a8a750db01p20 0x1.a978de915c05p22 0x0.0p0 -0x1.270e06f120d03p6 0x1.4c00000000006p5 0x0.0p0 F +REG epsg:2036 2 OK 0x1.7b4cbac57927dp21 0x1.a978de915c05p22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4c00000000006p5 0x0.0p0 F +REG epsg:2036 3 OK 0x1.e71a4c9b7b18fp20 0x1.ed32b7846d712p22 0x0.0p0 -0x1.270e06f120d03p6 0x1.9cp5 0x0.0p0 F +REG epsg:2036 4 OK 0x1.6eccd9b242736p21 0x1.ed32b7846d712p22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 0x0.0p0 F +REG epsg:2037 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:2037 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:2037 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:2037 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:2037 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:2038 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:2038 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:2038 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:2038 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:2038 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:2039 0 OK 0x1.aca07c487b31ap17 0x1.321566c7e5298p19 -0x1.4f5d5f0c8p4 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d1ap4 -0x1.0p-29 F +REG epsg:2039 1 OK -0x1.65762fe1446f8p18 0x1.50b5837d934cp16 -0x1.4261f18b8p3 0x1.d5359f29c48eap4 0x1.abc013839abebp4 0x0.0p0 F +REG epsg:2039 2 OK 0x1.890b55facad74p19 0x1.50b583698e3e8p16 -0x1.75bf8ad94p4 0x1.48aae3fa5b819p5 0x1.abc013839ad9ap4 0x1.0p-30 F +REG epsg:2039 3 OK -0x1.2abffb4538806p18 0x1.2465500bb04b4p20 -0x1.326920b5p4 0x1.d5359f29f3689p4 0x1.25e009c1a35a5p5 -0x1.8p-29 F +REG epsg:2039 4 OK 0x1.6bb03bb4bd7b7p19 0x1.2465500a9d4b8p20 -0x1.f125a06bp4 0x1.48aae3fa44246p5 0x1.25e009c1a37a8p5 -0x1.0p-28 F +REG epsg:2040 0 OK 0x1.e83c6887eb3b3p18 -0x1.d2cfe32bb26b8p8 0x1.ef3236a3p3 -0x1.8000000000001p1 -0x1.2f74bf1dcfcaep-59 0x1.0p-30 T +REG epsg:2040 1 OK -0x1.adc7b9bd064fp15 -0x1.0f1d8d8e42345p19 0x1.ef12cb2eap5 -0x1.0000000000002p3 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:2040 2 OK 0x1.018c720a95c57p20 -0x1.0f1d8d8df5206p19 0x1.aea324ba4p5 0x1.0000000000001p1 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2040 3 OK -0x1.add5f74b94fcp15 0x1.0ea8da953254fp19 -0x1.386c8252cp4 -0x1.0p3 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2040 4 OK 0x1.018ce3f230f9cp20 0x1.0ea8da94e581cp19 -0x1.b94c3bc44p4 0x1.0000000000001p1 0x1.3fffffffffffep2 -0x1.8p-29 F +REG epsg:2041 0 OK 0x1.e83c67ba2e06p18 -0x1.d29a274e6875bp8 0x1.e786b3aap3 -0x1.8000000000001p1 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:2041 1 OK -0x1.adc7cba32e71p15 -0x1.0f1d87833987p19 0x1.ed0864f7ap5 -0x1.ffffffffffffdp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:2041 2 OK 0x1.018c7232e7aa6p20 -0x1.0f1d8782ec6ddp19 0x1.ac9446d54p5 0x1.0000000000001p1 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:2041 3 OK -0x1.add6078e325cp15 0x1.0ea8e1f9041f2p19 -0x1.3beb5efccp4 -0x1.ffffffffffffep2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:2041 4 OK 0x1.018ce40d66c17p20 0x1.0ea8e1f8b746cp19 -0x1.bcd407c5p4 0x1.0000000000001p1 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:2042 0 OK 0x1.e83fce153448bp18 -0x1.d2cfcf21949c5p8 0x1.39fd6822p4 -0x1.2000000000002p3 0x1.c72f1eacb7b03p-60 0x1.0p-30 T +REG epsg:2042 1 OK -0x1.adabd4d11cf5p15 -0x1.0f1d81e360369p19 0x1.0349be634p6 -0x1.c000000000003p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:2042 2 OK 0x1.018d45abfce2p20 -0x1.0f1d81e329b78p19 0x1.d90586cdep5 -0x1.0000000000002p2 -0x1.4p2 -0x1.8p-29 F +REG epsg:2042 3 OK -0x1.adba12471ce8p15 0x1.0ea8ceef48ccp19 -0x1.096af78d4p4 -0x1.c000000000003p3 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2042 4 OK 0x1.018db7943f59cp20 0x1.0ea8ceef127abp19 -0x1.648730388p4 -0x1.ffffffffffffep1 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2043 0 OK 0x1.e83fcbae4e8dap18 -0x1.d29a13435a6b7p8 0x1.36326832cp4 -0x1.2p3 0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:2043 1 OK -0x1.adabf362b876p15 -0x1.0f1d7bd673ebcp19 0x1.02496f0bap6 -0x1.c000000000001p3 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2043 2 OK 0x1.018d456d15308p20 -0x1.0f1d7bd63d5cdp19 0x1.d6f78e00ep5 -0x1.ffffffffffffdp1 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2043 3 OK -0x1.adba2f353aep15 0x1.0ea8d65137341p19 -0x1.0cd6451bcp4 -0x1.c000000000001p3 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2043 4 OK 0x1.018db7483b1fcp20 0x1.0ea8d65100d3p19 -0x1.680d3210cp4 -0x1.0000000000002p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20436 0 OK 0x1.e865ffac7bd11p18 -0x1.bfd22bb176405p2 -0x1.445f744ap1 0x1.07fffffffffffp5 0x0.0p0 0x1.0p-29 T +REG epsg:20436 1 OK -0x1.ac856ca67bf5p15 -0x1.0ee441fc49fd1p19 -0x1.b1571cd68p3 0x1.bffffffffffffp4 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:20436 2 OK 0x1.01972b549b4cp20 -0x1.0ee441fd0ea22p19 0x1.d35ca5c7p2 0x1.3p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20436 3 OK -0x1.ac85a345a432p15 0x1.0ee2822ddce3dp19 -0x1.d862be398p3 0x1.bffffffffffffp4 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:20436 4 OK 0x1.01972d09c4b2ep20 0x1.0ee2822ea1868p19 0x1.854573d7p2 0x1.3p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20437 0 OK 0x1.e85f5812a8ca3p18 -0x1.bfd1f7df3c1bdp2 0x1.14de993d8p3 0x1.37fffffffffffp5 -0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:20437 1 OK -0x1.acb8b8c3a824p15 -0x1.0ee4228f9403cp19 -0x1.073ce06p-3 0x1.1p5 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:20437 2 OK 0x1.019571e308d43p20 -0x1.0ee422902d121p19 0x1.01787913p4 0x1.6p5 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:20437 3 OK -0x1.acb8ef636865p15 0x1.0ee262c15a53ep19 -0x1.59447bdp0 0x1.1p5 0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:20437 4 OK 0x1.019573982c4d1p20 0x1.0ee262c1f3606p19 0x1.dbe55cbap3 0x1.6000000000001p5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:20438 0 OK 0x1.e8586f013f5f7p18 -0x1.bfd1d13aa3044p2 0x1.0fe6a8634p4 0x1.67ffffffffffep5 0x1.c72f1eacb7b06p-66 -0x1.0p-30 T +REG epsg:20438 1 OK -0x1.acee8f07469dp15 -0x1.0ee40b20add21p19 0x1.519e4f21p3 0x1.4000000000001p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20438 2 OK 0x1.0193ac06a5d19p20 -0x1.0ee40b211995fp19 0x1.5f8280958p4 0x1.9p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20438 3 OK -0x1.aceec5a7aa3cp15 0x1.0ee24b529a78ap19 0x1.2a92b778p3 0x1.4p5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:20438 4 OK 0x1.0193adbbc34e4p20 0x1.0ee24b53063b3p19 0x1.4bfcb71p4 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:20439 0 OK 0x1.e85157d98de84p18 -0x1.bfd1b83006b9fp2 0x1.6663d85e8p4 0x1.98p5 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:20439 1 OK -0x1.ad26587508cp15 -0x1.0ee3fbf14cddcp19 0x1.260e261f4p4 0x1.7p5 -0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:20439 2 OK 0x1.0191deb847c53p20 -0x1.0ee3fbf18a246p19 0x1.8ded85e44p4 0x1.c000000000001p5 -0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:20439 3 OK -0x1.ad268f161952p15 0x1.0ee23c23525c2p19 0x1.12885bdf8p4 0x1.7p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20439 4 OK 0x1.0191e06d5f487p20 0x1.0ee23c238fa2p19 0x1.7a67bcf48p4 0x1.c000000000001p5 0x1.4000000000004p2 -0x1.0p-30 F +REG epsg:2044 0 OK 0x1.1a49730d22447p24 0x1.f31ee11f0532cp5 -0x1.f9c06fc6p2 0x1.a400000000002p6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2044 1 OK 0x1.11d0b941fe1b9p24 -0x1.0ef764730be01p19 -0x1.46fb44b28p3 0x1.900000001d51cp6 -0x1.3fffffffeae06p2 0x0.0p0 F +REG epsg:2044 2 OK 0x1.22c22cd7ab153p24 -0x1.0ef76472c2952p19 -0x1.205f7739p4 0x1.b7ffffffe2b59p6 -0x1.3fffffffeae67p2 -0x1.8p-29 F +REG epsg:2044 3 OK 0x1.11d0ba35958b1p24 0x1.0f06fd48bdef3p19 0x1.5059c1bp-1 0x1.900000001d518p6 0x1.3fffffffeadf5p2 0x0.0p0 F +REG epsg:2044 4 OK 0x1.22c22be41db19p24 0x1.0f06fd48749bep19 -0x1.c97be316p2 0x1.b7ffffffe2b5fp6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG epsg:20440 0 OK 0x1.e84a267e15c66p18 -0x1.bfd1ad059f0e6p2 0x1.8cf44f108p4 0x1.c800000000001p5 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:20440 1 OK -0x1.ad5f789937c5p15 -0x1.0ee3f52c05a46p19 0x1.744f43188p4 0x1.ap5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20440 2 OK 0x1.01900f05a2f4p20 -0x1.0ee3f52c13bedp19 0x1.8c375be4p4 0x1.fp5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:20440 3 OK -0x1.ad5faf3afcf9p15 0x1.0ee2355e16368p19 0x1.60c979d6p4 0x1.ap5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20440 4 OK 0x1.019010bab4912p20 0x1.0ee2355e2450bp19 0x1.78b192eecp4 0x1.fp5 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:2045 0 OK 0x1.298ba8d5a044p24 0x1.f31efc35cc79ep5 -0x1.a4c4fa85p3 0x1.bcp6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2045 1 OK 0x1.2112ee95cda8ep24 -0x1.0ef773313b91p19 -0x1.d136da92p3 0x1.a80000001d528p6 -0x1.3fffffffeadfep2 -0x1.0p-30 F +REG epsg:2045 2 OK 0x1.32046314b4436p24 -0x1.0ef77330e19f8p19 -0x1.81dffe328p4 0x1.cfffffffe2b66p6 -0x1.3fffffffeae7p2 -0x1.8p-29 F +REG epsg:2045 3 OK 0x1.2112ef8966642p24 0x1.0f070c07c4a23p19 -0x1.d4d7a8dcp1 0x1.a80000001d524p6 0x1.3fffffffeadecp2 -0x1.0p-29 F +REG epsg:2045 4 OK 0x1.3204622127dc9p24 0x1.0f070c076aa6ap19 -0x1.a7bee98e8p3 0x1.cfffffffe2b6dp6 0x1.3fffffffeae6p2 -0x1.8p-29 F +REG epsg:2046 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:2046 1 OK 0x1.0f17135ef94abp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.40000000ea80dp3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2046 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2046 3 OK 0x1.0f17135ef94abp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.40000000ea80dp3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2046 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2047 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.1p4 0x0.0p0 0x0.0p0 T +REG epsg:2047 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.80000000ea80fp3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2047 2 OK -0x1.0f17135ef94aap19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.5fffffff8abfap4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2047 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.80000000ea80fp3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2047 4 OK -0x1.0f17135ef94aap19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.5fffffff8abfap4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2048 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.3p4 0x0.0p0 0x0.0p0 T +REG epsg:2048 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.c0000000ea80fp3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2048 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.7fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2048 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.c0000000ea80fp3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2048 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.7fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2049 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:2049 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.0000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2049 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.9fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2049 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.0000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2049 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.9fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:20499 0 OK 0x1.e85157d98de84p18 -0x1.bfd1b83006b9fp2 0x1.6663d85e8p4 0x1.98p5 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:20499 1 OK -0x1.ad26587508cp15 -0x1.0ee3fbf14cddcp19 0x1.260e261f4p4 0x1.7p5 -0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:20499 2 OK 0x1.0191deb847c53p20 -0x1.0ee3fbf18a246p19 0x1.8ded85e44p4 0x1.c000000000001p5 -0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:20499 3 OK -0x1.ad268f161952p15 0x1.0ee23c23525c2p19 0x1.12885bdf8p4 0x1.7p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20499 4 OK 0x1.0191e06d5f487p20 0x1.0ee23c238fa2p19 0x1.7a67bcf48p4 0x1.c000000000001p5 0x1.4000000000004p2 -0x1.0p-30 F +REG epsg:2050 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.7p4 0x0.0p0 0x0.0p0 T +REG epsg:2050 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.2000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2050 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.bfffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2050 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.2000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2050 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.bfffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2051 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.9p4 0x0.0p0 0x0.0p0 T +REG epsg:2051 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.4000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2051 2 OK -0x1.0f17135ef94aap19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.dfffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2051 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.4000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2051 4 OK -0x1.0f17135ef94aap19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.dfffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2052 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:2052 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.6000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2052 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.ffffffff8abfap4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2052 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.6000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2052 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.ffffffff8abfap4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2053 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.d000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:2053 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.8000000075408p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2053 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.0fffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2053 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.8000000075408p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2053 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.0fffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:20538 0 OK 0x1.e85d346033eb6p18 -0x1.67da969d989bp5 0x1.2d515952cp5 0x1.67fffffffffffp5 -0x1.2f74bf1dcfcaep-64 0x1.0p-30 T +REG epsg:20538 1 OK -0x1.acc43e3a9d49p15 -0x1.0ee8903737bc8p19 0x1.08bda9464p5 0x1.3ffffffffffffp5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:20538 2 OK 0x1.0194bc334614p20 -0x1.0ee89037c242dp19 0x1.7e9d4a224p5 0x1.8ffffffffffffp5 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:20538 3 OK -0x1.acc59d63b20ap15 0x1.0edd517a81a8ep19 0x1.93faf3c64p4 0x1.4p5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:20538 4 OK 0x1.0194c72d697f6p20 0x1.0edd517b0c23ep19 0x1.3fdd244f6p5 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:20539 0 OK 0x1.e859488ff6e44p18 -0x1.67da7891ffc5p5 0x1.6de38a22cp5 0x1.98p5 0x0.0p0 -0x1.0p-30 T +REG epsg:20539 1 OK -0x1.ace2364c66f7p15 -0x1.0ee8798a71391p19 0x1.53b850d74p5 0x1.7000000000001p5 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:20539 2 OK 0x1.0193b608825c5p20 -0x1.0ee8798ae2265p19 0x1.b3cbe096ap5 0x1.c000000000001p5 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:20539 3 OK -0x1.ace39577ab74p15 0x1.0edd3acea99c5p19 0x1.14f827896p5 0x1.7000000000001p5 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:20539 4 OK 0x1.0193c1028ed1p20 0x1.0edd3acf1a807p19 0x1.750bbf148p5 0x1.c000000000001p5 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:2054 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.fp4 0x0.0p0 0x0.0p0 T +REG epsg:2054 1 OK 0x1.0f17135ef94aap19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.a000000075408p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2054 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.1fffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2054 3 OK 0x1.0f17135ef94aap19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.a000000075408p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2054 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.1fffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2055 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:2055 1 OK 0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.c000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2055 2 OK -0x1.0f17135ef94adp19 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.2fffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2055 3 OK 0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.c000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2055 4 OK -0x1.0f17135ef94adp19 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.2fffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2056 0 OK 0x1.3d64431e1c68fp21 0x1.250130e3aa727p20 -0x1.8cf180eecp5 0x1.dc22222222222p2 0x1.779e86cdcd1e1p5 0x1.8p-29 F +REG epsg:2056 1 OK 0x1.e62e9c95fc57fp20 0x1.484e321ca758bp19 -0x1.f2cc1da12p5 0x1.d5d9fb9bbffcfp-4 0x1.4f9e86cdcd1e5p5 0x1.0p-30 F +REG epsg:2056 2 OK 0x1.87b136a2cb12p21 0x1.484e56b0bf528p19 -0x1.84f6514f8p5 0x1.d8766e2aeaa26p3 0x1.4f9e86cdcd1e7p5 -0x1.8p-29 F +REG epsg:2056 3 OK 0x1.ff88b8cfee2dcp20 0x1.b2b9498daa8c6p20 -0x1.218694408p5 0x1.d5d9fb9bc0013p-4 0x1.9f9e86cdcd1e7p5 0x1.8p-29 F +REG epsg:2056 4 OK 0x1.7b042aff9ba34p21 0x1.b2b938df237edp20 -0x1.8d01f7ae8p4 0x1.d8766e2aeaa26p3 0x1.9f9e86cdcd1e7p5 0x1.0p-30 F +REG epsg:2057 0 OK 0x1.4177ddbe252f5p19 0x1.73b70a3a2e44ep21 0x1.8b029e0c4p4 0x1.a4d40c57b582p5 0x1.b84d1f6f014c1p4 -0x1.0p-30 F +REG epsg:2057 1 OK 0x1.2fac42a93da5p16 0x1.3173a12871b5bp21 0x1.b66fbe0c8p3 0x1.77b9ae635ab67p5 0x1.684d1f6f01486p4 -0x1.0p-30 F +REG epsg:2057 2 OK 0x1.2e7f18352447p20 0x1.3172d097e64adp21 0x1.7967937c8p3 0x1.d1ee6a4c104d8p5 0x1.684d1f6f01486p4 -0x1.8p-29 F +REG epsg:2057 3 OK 0x1.f54ad85bad8e8p16 0x1.b91564fdfac81p21 0x1.14aa07736p5 0x1.77b9ae635ab66p5 0x1.04268fb780a7cp5 0x1.0p-29 F +REG epsg:2057 4 OK 0x1.2221acaabe21p20 0x1.b914755914ceap21 0x1.06bc8f8aap5 0x1.d1ee6a4c104d8p5 0x1.04268fb780a8p5 0x1.0p-30 F +REG epsg:2058 0 OK 0x1.e84aa68f177bep18 0x1.47df67ce31772p7 -0x1.2bb68f085p6 0x1.67fffffffffffp5 0x0.0p0 0x0.0p0 T +REG epsg:2058 1 OK -0x1.ad6f630b46a6p15 -0x1.0ecfafa5b56a1p19 -0x1.6b2758dabp6 0x1.4000000000001p5 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2058 2 OK 0x1.0190ce6251288p20 -0x1.0ecfafa5c6c1p19 -0x1.63c95fce2p6 0x1.8ffffffffffffp5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2058 3 OK -0x1.ad6a630a6ebap15 0x1.0ef8ab3ab6e1ep19 -0x1.f19c48666p5 0x1.4000000000001p5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2058 4 OK 0x1.0190a661e6beap20 0x1.0ef8ab3ac83dep19 -0x1.e2e05aa8ap5 0x1.8ffffffffffffp5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2059 0 OK 0x1.e846096cc78dbp18 0x1.47df675105841p7 -0x1.2b22f04f3p6 0x1.97fffffffffffp5 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:2059 1 OK -0x1.ad9445f94a6cp15 -0x1.0ecfaf3e1f90fp19 -0x1.642b702d2p6 0x1.7p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2059 2 OK 0x1.018fa6e4637bep20 -0x1.0ecfaf3e12b94p19 -0x1.69a048fa5p6 0x1.cp5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2059 3 OK -0x1.ad8f45eda075p15 0x1.0ef8aad311876p19 -0x1.e3a47b2c8p5 0x1.6ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:2059 4 OK 0x1.018f7ee44ffd8p20 0x1.0ef8aad304abdp19 -0x1.ee8e298cap5 0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:2060 0 OK 0x1.e84171cbf7d74p18 0x1.47df6d6023ab9p7 -0x1.32483bfc4p6 0x1.c800000000001p5 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:2060 1 OK -0x1.adb952a3b095p15 -0x1.0ecfb44288ba8p19 -0x1.64e11593cp6 0x1.ap5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2060 2 OK 0x1.018e83751e20ep20 -0x1.0ecfb4425dd88p19 -0x1.771972b05p6 0x1.fp5 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:2060 3 OK -0x1.adb4528cf534p15 0x1.0ef8afd83b121p19 -0x1.e50fc58e6p5 0x1.a000000000001p5 0x1.4p2 0x1.0p-29 F +REG epsg:2060 4 OK 0x1.018e5b755ec4p20 0x1.0ef8afd810234p19 -0x1.04c03a809p6 0x1.fp5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2061 0 OK 0x1.e83cec8dc76e7p18 0x1.47df79ea8e164p7 -0x1.411267b1cp6 0x1.f7ffffffffffep5 -0x1.c72f1eacb7b09p-61 -0x1.0p-28 T +REG epsg:2061 1 OK -0x1.adde21222a62p15 -0x1.0ecfbea4defe1p19 -0x1.6d464b9e9p6 0x1.d000000000003p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2061 2 OK 0x1.018d6745da316p20 -0x1.0ecfbea4968b4p19 -0x1.8c0f138b3p6 0x1.1p6 -0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:2061 3 OK -0x1.add921003d3cp15 0x1.0ef8ba3c1f7dbp19 -0x1.f5da2cad4p5 0x1.d000000000001p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2061 4 OK 0x1.018d3f466b401p20 0x1.0ef8ba3bd6f57p19 -0x1.19b5d528fp6 0x1.1p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2062 0 OK 0x1.be8570e10f5a8p19 0x1.28254ffb8975dp19 0x0.0p0 -0x1.ca5dc1a63c1f8p-51 0x1.3ffffffffffe5p5 0x0.0p0 F +REG epsg:2062 1 OK 0x1.4c3b4688814a6p18 0x1.8036ba376b08p15 0x0.0p0 -0x1.a1baf7138d7c9p2 0x1.17fffffffffccp5 0x0.0p0 F +REG epsg:2062 2 OK 0x1.763ae30dab51p20 0x1.80f7fe430592p16 0x0.0p0 0x1.a1baf7138d7cbp2 0x1.17fffffffffcep5 0x0.0p0 F +REG epsg:2062 3 OK 0x1.6ec3e2f145877p18 0x1.1af847539cf48p20 0x0.0p0 -0x1.a1baf7138d7c9p2 0x1.67ffffffffff3p5 0x0.0p0 F +REG epsg:2062 4 OK 0x1.573ae2cc97deap20 0x1.25620a4ef2b52p20 0x0.0p0 0x1.a1baf7138d7c9p2 0x1.67ffffffffff3p5 0x0.0p0 F +REG epsg:2063 0 OK 0x1.e80af7fdb29dcp18 0x1.1fe2c69a4cd48p3 -0x1.6f1e4656cp4 -0x1.dffffffffffffp3 0x0.0p0 -0x1.0p-30 T +REG epsg:2063 1 OK -0x1.af612db0adbp15 -0x1.0ee280312a10dp19 -0x1.1d350d9p-1 -0x1.3ffffffffffffp4 -0x1.3fffffffffffcp2 -0x1.0p-30 F +REG epsg:2063 2 OK 0x1.018085391d142p20 -0x1.0ee2802f953adp19 -0x1.57b8926ep5 -0x1.4p3 -0x1.4p2 -0x1.8p-29 F +REG epsg:2063 3 OK -0x1.af60e768302ep15 0x1.0ee4bff1c7cccp19 0x1.030c02ap0 -0x1.3fffffffffffep4 0x1.4p2 0x1.0p-30 F +REG epsg:2063 4 OK 0x1.01808307571b5p20 0x1.0ee4bff032f01p19 -0x1.4b2b58a14p5 -0x1.3ffffffffffffp3 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:2064 0 OK 0x1.e808f8aeb120dp18 0x1.1fe31416cf39p3 -0x1.87b174de6p5 -0x1.2000000000002p3 0x0.0p0 0x0.0p0 T +REG epsg:2064 1 OK -0x1.af75ac4c35a7p15 -0x1.0ee2c94890baep19 -0x1.9aea7842cp4 -0x1.c000000000001p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:2064 2 OK 0x1.01802984db7eap20 -0x1.0ee2c946eedc5p19 -0x1.15e9a2972p6 -0x1.0p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2064 3 OK -0x1.af7566033dbcp15 0x1.0ee50909c8371p19 -0x1.81d009268p4 -0x1.cp3 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:2064 4 OK 0x1.0180275315d1ep20 0x1.0ee509082651dp19 -0x1.0fa303f84p6 -0x1.0000000000002p2 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2065 0 OK 0x1.35b28db7cf7fp20 -0x1.ed98e67edd373p19 0x1.f7cf995b8p3 0x1.54000004567e4p5 0x1.8c0000003949cp5 0x1.80bfap-11 F +REG epsg:2065 1 OK 0x1.82f4792ffbfcep19 -0x1.9633d320d7927p20 -0x1.2517e2638p3 0x1.1668c3d9b60fcp5 0x1.63ffffffa67acp5 0x1.82cb8p-12 F +REG epsg:2065 2 OK 0x1.e5f84a05f3573p20 -0x1.512c9c89a3c7ap20 0x1.a2b02b4c8p5 0x1.91973c2e01cf7p5 0x1.63ffffff28147p5 0x1.4a565p-10 F +REG epsg:2065 3 OK 0x1.3c5ba188108d8p19 -0x1.117363b90165dp19 -0x1.151f6b53p2 0x1.1668c3da53257p5 0x1.b40000014bf37p5 0x1.0c98p-11 F +REG epsg:2065 4 OK 0x1.8aa60d9c1c801p20 -0x1.3f3d2d2f7fffep18 0x1.6dc2350aep5 0x1.91973c2f201ddp5 0x1.b4000000a36a1p5 0x1.43c79p-10 F +REG epsg:2066 0 OK 0x1.6e35fffffffffp17 0x1.5f8ffffffffffp17 0x0.0p0 -0x1.e57cf23a74585p5 0x1.6811d8e0ef223p3 0x0.0p0 F +REG epsg:2066 1 OK -0x1.3f735e11a6fbp21 -0x1.37e961a193f32p21 0x0.0p0 -0x1.0722d1e07a8d5p6 0x1.9023b0bb31827p2 0x0.0p0 F +REG epsg:2066 2 OK 0x1.6d3a1e11a6fb8p21 -0x1.37e961a193f32p21 0x0.0p0 -0x1.bcb440b3f395fp5 0x1.9023b0bb31827p2 0x0.0p0 F +REG epsg:2066 3 OK -0x1.33c85dce4a73dp21 0x1.69c3caf72367ep21 0x0.0p0 -0x1.0722d28bb5699p6 0x1.0408ec0c63915p4 0x0.0p0 F +REG epsg:2066 4 OK 0x1.618f1dce4a745p21 0x1.69c3caf72368p21 0x0.0p0 -0x1.bcb43f5d7ddd6p5 0x1.0408ec0c63915p4 0x0.0p0 F +REG epsg:2067 0 OK 0x1.e81de399c7643p18 -0x1.57548a4a6aa06p7 0x1.4304d867bp6 -0x1.f8p5 -0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:2067 1 OK -0x1.aeb55944acc2p15 -0x1.0ef7ed3984bf4p19 0x1.b218ba0a7p6 -0x1.1p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:2067 2 OK 0x1.01849c76af11p20 -0x1.0ef7ed3870175p19 0x1.3d0e09df3p6 -0x1.d000000000003p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2067 3 OK -0x1.aeba95fb70b9p15 0x1.0ecd0303ce792p19 0x1.3a5b81562p6 -0x1.1p6 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2067 4 OK 0x1.0184c655eb2a6p20 0x1.0ecd0302ba269p19 0x1.8aa159db2p5 -0x1.d000000000003p5 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2068 0 OK 0x1.86c7dab580a24p17 0x1.30e6065a6b8b3p7 -0x1.e44b5c317p6 0x1.2000000000002p3 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:2068 1 OK -0x1.5abf440bdd748p18 -0x1.0ee670f68f3f1p19 -0x1.1b27dd0428p7 0x1.00000001d7a0ep2 -0x1.3fffffffeac1fp2 -0x1.8p-29 F +REG epsg:2068 2 OK 0x1.70c38f84c5701p19 -0x1.0ee670f711736p19 -0x1.fef162318p6 0x1.bfffffff13c87p3 -0x1.3fffffffeab75p2 0x1.0p-29 F +REG epsg:2068 3 OK -0x1.5abeaf4603c94p18 0x1.0f0c8d6567a1fp19 -0x1.cc01d8d8ap6 0x1.00000001d792cp2 0x1.3fffffffeabf5p2 -0x1.0p-30 F +REG epsg:2068 4 OK 0x1.70c3451c6773fp19 0x1.0f0c8d65e9fap19 -0x1.94a3903a3p6 0x1.bfffffff13cf8p3 0x1.3fffffffeab48p2 0x1.0p-29 F +REG epsg:2069 0 OK 0x1.86c59025f56d3p17 0x1.30e5fdd40e3f9p7 -0x1.d97bad403p6 0x1.5fffffffffffep3 0x0.0p0 0x1.0p-30 T +REG epsg:2069 1 OK -0x1.5ac05a5160786p18 -0x1.0ee6695ebdc78p19 -0x1.14feceaca8p7 0x1.80000001d7a69p2 -0x1.3fffffffeac19p2 -0x1.8p-29 F +REG epsg:2069 2 OK 0x1.70c2f55daf3b8p19 -0x1.0ee6695f38813p19 -0x1.f5ce2a066p6 0x1.ffffffff13cb8p3 -0x1.3fffffffeab7ap2 0x0.0p0 F +REG epsg:2069 3 OK -0x1.5abfc58b43208p18 0x1.0f0c85cc8785fp19 -0x1.bfafbf8cap6 0x1.80000001d7989p2 0x1.3fffffffeabefp2 -0x1.0p-29 F +REG epsg:2069 4 OK 0x1.70c2aaf57f812p19 0x1.0f0c85cd02616p19 -0x1.8b805a92p6 0x1.ffffffff13d28p3 0x1.3fffffffeab4ep2 0x1.0p-29 F +REG epsg:2070 0 OK 0x1.86c339df5bbbbp17 0x1.30e5f5d029379p7 -0x1.cf5174617p6 0x1.a000000000001p3 0x0.0p0 0x1.0p-30 T +REG epsg:2070 1 OK -0x1.5ac1775849ec4p18 -0x1.0ee6623b2204p19 -0x1.0f23c8e82p7 0x1.00000000ebd61p3 -0x1.3fffffffeac14p2 -0x1.0p-29 F +REG epsg:2070 2 OK 0x1.70c258bbba357p19 -0x1.0ee6623b951c8p19 -0x1.ed5749838p6 0x1.1fffffff89e76p4 -0x1.3fffffffeab8p2 -0x1.0p-30 F +REG epsg:2070 3 OK -0x1.5ac0e291e6902p18 0x1.0f0c7ea7ed4c3p19 -0x1.b3f9b73bbp6 0x1.00000000ebcf2p3 0x1.3fffffffeabe9p2 -0x1.0p-30 F +REG epsg:2070 4 OK 0x1.70c20e53b92a9p19 0x1.0f0c7ea860845p19 -0x1.83097c62cp6 0x1.1fffffff89eadp4 0x1.3fffffffeab53p2 0x1.0p-29 F +REG epsg:2071 0 OK 0x1.86c0d89c4b116p17 0x1.30e5ee513c59p7 -0x1.c5cfdd27ep6 0x1.dfffffffffffep3 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:2071 1 OK -0x1.5ac29ac7b4854p18 -0x1.0ee65b8df5e86p19 -0x1.09989f39b8p7 0x1.40000000ebd93p3 -0x1.3fffffffeac11p2 0x0.0p0 F +REG epsg:2071 2 OK 0x1.70c1b9cfc026ep19 -0x1.0ee65b8e613b9p19 -0x1.e58f6474fp6 0x1.3fffffff89e8fp4 -0x1.3fffffffeab85p2 0x0.0p0 F +REG epsg:2071 3 OK -0x1.5ac2060108e34p18 0x1.0f0c77f9d338p19 -0x1.a8e366eb3p6 0x1.40000000ebd21p3 0x1.3fffffffeabe6p2 -0x1.0p-30 F +REG epsg:2071 4 OK 0x1.70c16f67ee2acp19 0x1.0f0c77fa3ea89p19 -0x1.7b419977bp6 0x1.3fffffff89ec7p4 0x1.3fffffffeab55p2 0x1.8p-28 F +REG epsg:2072 0 OK 0x1.86be6d1ac7ef8p17 0x1.30e5e7599e11ep7 -0x1.bcf9de8e7p6 0x1.1p4 -0x1.2f74bf1dcfcbp-62 -0x1.8p-29 T +REG epsg:2072 1 OK -0x1.5ac3c444bb6e2p18 -0x1.0ee655594e78fp19 -0x1.045f0c3c6p7 0x1.80000000ebdc2p3 -0x1.3fffffffeac0cp2 -0x1.0p-30 F +REG epsg:2072 2 OK 0x1.70c118cb51922p19 -0x1.0ee65559b1e4fp19 -0x1.de78e8141p6 0x1.5fffffff89ea9p4 -0x1.3fffffffeab8ep2 0x1.0p-30 F +REG epsg:2072 3 OK -0x1.5ac32f7dc55bp18 0x1.0f0c71c44e978p19 -0x1.9e7043cfep6 0x1.80000000ebd51p3 0x1.3fffffffeabe1p2 -0x1.0p-30 F +REG epsg:2072 4 OK 0x1.70c0ce63aef4fp19 0x1.0f0c71c4b21ebp19 -0x1.742b1f09dp6 0x1.5fffffff89ee1p4 0x1.3fffffffeab5bp2 0x1.0p-30 F +REG epsg:2073 0 OK 0x1.86bbf81c088ccp17 0x1.30e5e0eb7a9d2p7 -0x1.b4d23a0b1p6 0x1.3000000000001p4 0x0.0p0 -0x1.0p-30 T +REG epsg:2073 1 OK -0x1.5ac4f372969bep18 -0x1.0ee64f9f1b23ap19 -0x1.fef162318p6 0x1.c0000000ebdf4p3 -0x1.3fffffffeac08p2 -0x1.0p-29 F +REG epsg:2073 2 OK 0x1.70c075e0a63fcp19 -0x1.0ee64f9f76895p19 -0x1.d8160a45fp6 0x1.7fffffff89ec1p4 -0x1.3fffffffeab91p2 -0x1.0p-30 F +REG epsg:2073 3 OK -0x1.5ac45eab5403ep18 0x1.0f0c6c094f1dfp19 -0x1.94a3903a3p6 0x1.c0000000ebd85p3 0x1.3fffffffeabdbp2 -0x1.8p-29 F +REG epsg:2073 4 OK 0x1.70c02b7933438p19 0x1.0f0c6c09aa9cbp19 -0x1.6dc842fd2p6 0x1.7fffffff89efap4 0x1.3fffffffeab63p2 0x0.0p0 F +REG epsg:2074 0 OK 0x1.86b97a64389a9p17 0x1.30e5db08d3562p7 -0x1.ad5b7ab4p6 0x1.5p4 0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:2074 1 OK -0x1.5ac627f2b7c0ep18 -0x1.0ee64a612526ap19 -0x1.f5ce2a066p6 0x1.0000000075f12p4 -0x1.3fffffffeac02p2 -0x1.0p-28 F +REG epsg:2074 2 OK 0x1.70bfd1428d954p19 -0x1.0ee64a6178692p19 -0x1.d268c8e9fp6 0x1.9fffffff89edfp4 -0x1.3fffffffeab95p2 0x1.0p-30 F +REG epsg:2074 3 OK -0x1.5ac5932b26a7ep18 0x1.0f0c66ca9e49p19 -0x1.8b805a92p6 0x1.0000000075edap4 0x1.3fffffffeabd5p2 -0x1.0p-30 F +REG epsg:2074 4 OK 0x1.70bf86db4a6c8p19 0x1.0f0c66caf1a26p19 -0x1.681b0330ap6 0x1.9fffffff89f16p4 0x1.3fffffffeab67p2 0x1.0p-30 F +REG epsg:2075 0 OK 0x1.86b6f4ba3c152p17 0x1.30e5d5b37e182p7 -0x1.a697f4739p6 0x1.6ffffffffffffp4 0x0.0p0 0x1.0p-30 T +REG epsg:2075 1 OK -0x1.5ac76164e7c5p18 -0x1.0ee645a10f01p19 -0x1.ed5749838p6 0x1.2000000075f2cp4 -0x1.3fffffffeabfep2 -0x1.4p-28 F +REG epsg:2075 2 OK 0x1.70bf2b245ebbep19 -0x1.0ee645a15a061p19 -0x1.cd72e93c8p6 0x1.bfffffff89ef9p4 -0x1.3fffffffeab9ap2 0x1.0p-30 F +REG epsg:2075 3 OK -0x1.5ac6cc9d0647p18 0x1.0f0c6209ded2p19 -0x1.83097c62cp6 0x1.2000000075ef4p4 0x1.3fffffffeabcep2 -0x1.0p-30 F +REG epsg:2075 4 OK 0x1.70bee0bd4b8aap19 0x1.0f0c620a29ebep19 -0x1.632524e04p6 0x1.bfffffff89f3p4 0x1.3fffffffeab6fp2 0x0.0p0 F +REG epsg:2076 0 OK 0x1.86b467e77143p17 0x1.30e5d0ed24ac3p7 -0x1.a089c34fp6 0x1.8ffffffffffffp4 0x0.0p0 0x1.0p-30 T +REG epsg:2076 1 OK -0x1.5ac89f6764c8cp18 -0x1.0ee6416053f07p19 -0x1.e58f6474fp6 0x1.4000000075f46p4 -0x1.3fffffffeabf8p2 -0x1.0p-28 F +REG epsg:2076 2 OK 0x1.70be83b9e8ap19 -0x1.0ee6416096a08p19 -0x1.c935f747fp6 0x1.dfffffff89f12p4 -0x1.3fffffffeab9bp2 0x1.4p-28 F +REG epsg:2076 3 OK -0x1.5ac80a9f311b8p18 0x1.0f0c5dc88c2bap19 -0x1.7b419977bp6 0x1.4000000075f0fp4 0x1.3fffffffeabcbp2 0x1.0p-29 F +REG epsg:2076 4 OK 0x1.70be3953057b3p19 0x1.0f0c5dc8ceee3p19 -0x1.5ee83415ep6 0x1.dfffffff89f49p4 0x1.3fffffffeab72p2 0x1.0p-28 F +REG epsg:2077 0 OK 0x1.e85bebd2ed936p18 0x1.30ce9b345f879p7 -0x1.e44b5c317p6 0x1.2000000000002p3 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:2077 1 OK -0x1.aced0d5dc25ep15 -0x1.0ed1a2512000bp19 -0x1.1b27dd0428p7 0x1.0p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2077 2 OK 0x1.01955e666f1f6p20 -0x1.0ed1a251a2358p19 -0x1.fef162318p6 0x1.c000000000003p3 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:2077 3 OK -0x1.ace8678a5e6ep15 0x1.0ef7bbd299f01p19 -0x1.cc01d8d8ap6 0x1.0000000000003p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2077 4 OK 0x1.019539351ba22p20 0x1.0ef7bbd31c48ap19 -0x1.94a3903a3p6 0x1.c000000000003p3 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2078 0 OK 0x1.e8586b0b39451p18 0x1.30ce832d08f21p7 -0x1.c5cfdd27ep6 0x1.dfffffffffffep3 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:2078 1 OK -0x1.ad07c12f489ap15 -0x1.0ed18cea2b9ebp19 -0x1.09989f39b8p7 0x1.3ffffffffffffp3 -0x1.3fffffffffffep2 0x1.0p-30 F +REG epsg:2078 2 OK 0x1.0194739df64fap20 -0x1.0ed18cea96f24p19 -0x1.e58f6474fp6 0x1.4p4 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2078 3 OK -0x1.ad031b555576p15 0x1.0ef7a668aab56p19 -0x1.a8e366eb3p6 0x1.3ffffffffffffp3 0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:2078 4 OK 0x1.01944e6ce8ccfp20 0x1.0ef7a66916266p19 -0x1.7b419977bp6 0x1.4p4 0x1.4p2 0x1.0p-30 F +REG epsg:2079 0 OK 0x1.e854bc37a02d4p18 0x1.30ce6fe61b169p7 -0x1.ad5b7ab4p6 0x1.5p4 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:2079 1 OK -0x1.ad242858bdb3p15 -0x1.0ed17bbeac937p19 -0x1.f5ce2a066p6 0x1.ffffffffffffep3 -0x1.3fffffffffffep2 -0x1.0p-29 F +REG epsg:2079 2 OK 0x1.01937f6a201eap20 -0x1.0ed17bbeffd64p19 -0x1.d268c8e9fp6 0x1.9ffffffffffffp4 -0x1.4p2 0x0.0p0 F +REG epsg:2079 3 OK -0x1.ad1f82779f62p15 0x1.0ef7953ac7abfp19 -0x1.8b805a92p6 0x1.0p4 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:2079 4 OK 0x1.01935a395a004p20 0x1.0ef7953b1b059p19 -0x1.681b0330ap6 0x1.ap4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:20790 0 OK 0x1.e09e8e734e40fp19 0x1.4bef00c8707fap18 -0x1.69651aac2p5 0x1.fffffd45bc52dp-1 0x1.3d555550c9c1fp5 -0x1.9p-25 F +REG epsg:20790 1 OK 0x1.af6e4877845a8p18 -0x1.ec08d125eb5f8p17 -0x1.226f3e1f8p5 -0x1.5fb5410fa4ca1p2 0x1.1555555554c79p5 -0x1.0p-30 F +REG epsg:20790 2 OK 0x1.90116f5e93c65p20 -0x1.15029a0daf5dap17 -0x1.a058ba0acp4 0x1.dfb5118fac4f7p2 0x1.1555557ece83bp5 0x1.1ep-18 F +REG epsg:20790 3 OK 0x1.8f984d1eed0ccp18 0x1.a33c50f566c99p19 -0x1.0ea0e163bp6 -0x1.5fb5410fa71eep2 0x1.65555555545a8p5 -0x1.0p-30 F +REG epsg:20790 4 OK 0x1.5f6cd2bebe6ap20 0x1.dc5557419e86p19 -0x1.d61fbb9eap5 0x1.dfb4e1e4af4cep2 0x1.65555573155adp5 0x1.b57p-18 F +REG epsg:20791 0 OK 0x1.7ef68e734e40fp19 0x1.37b8064383fd4p15 -0x1.69651aac2p5 0x1.fffffd45bc52dp-1 0x1.3d555550c9c1fp5 -0x1.9p-25 F +REG epsg:20791 1 OK 0x1.d83c90ef08b5p17 -0x1.0d7e34497ad7ep19 -0x1.226f3e1f8p5 -0x1.5fb5410fa4ca1p2 0x1.1555555554c79p5 -0x1.0p-30 F +REG epsg:20791 2 OK 0x1.5f3d6f5e93c65p20 -0x1.af794d06d7aedp18 -0x1.a058ba0acp4 0x1.dfb5118fac4f7p2 0x1.1555557ece83bp5 0x1.1ep-18 F +REG epsg:20791 3 OK 0x1.98909a3dda198p17 0x1.10c050f566c99p19 -0x1.0ea0e163bp6 -0x1.5fb5410fa71eep2 0x1.65555555545a8p5 -0x1.0p-30 F +REG epsg:20791 4 OK 0x1.2e98d2bebe6ap20 0x1.49d957419e86p19 -0x1.d61fbb9eap5 0x1.dfb4e1e4af4cep2 0x1.65555573155adp5 0x1.b57p-18 F +REG epsg:2080 0 OK 0x1.e850e9ac6b795p18 0x1.30ce6195a58f3p7 -0x1.9b32cabd8p6 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:2080 1 OK -0x1.ad41f3310c4p15 -0x1.0ed16efec9ad4p19 -0x1.de78e8141p6 0x1.5ffffffffffffp4 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2080 2 OK 0x1.01928477d1f5ep20 -0x1.0ed16eff03f3bp19 -0x1.c5b3456aap6 0x1.ffffffffffffep4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2080 3 OK -0x1.ad3d4d483ae6p15 0x1.0ef788791e566p19 -0x1.742b1f09dp6 0x1.6p4 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2080 4 OK 0x1.01925f4753dd2p20 0x1.0ef7887958acfp19 -0x1.5b65832fap6 0x1.0p5 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:2081 0 OK 0x1.312dp21 0x1.b453d9c057babp16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG epsg:2081 1 OK 0x1.255df71535f4ap21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bcp6 -0x1.68329508d1466p6 0x0.0p0 F +REG epsg:2081 2 OK 0x1.3cfc08eaca0b6p21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508d1466p6 0x0.0p0 F +REG epsg:2081 3 OK 0x1.ec308cfc9a632p20 0x1.1136208e33694p18 0x0.0p0 0x1.bcp6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG epsg:2081 4 OK 0x1.6c41b981b2ce7p21 0x1.1136208e33694p18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG epsg:2082 0 OK 0x1.312c0a79e32dfp21 0x1.b4509cd21a2a7p16 0x1.ac49ae704p4 -0x1.1400000000004p6 -0x1.63fffffffffffp6 -0x1.0p-30 F +REG epsg:2082 1 OK 0x1.255d2e45943adp21 0x1.b45c4bbb35c18p15 0x1.b342a808p4 0x1.afaf0668068edp4 -0x1.67ffb79352bcap6 0x1.be302fep-2 F +REG epsg:2082 2 OK 0x1.3cfae6af3ec1fp21 0x1.b45c4bcb07a52p15 0x1.a46ae504p4 0x1.afaf0668068edp4 -0x1.67ffb793520c7p6 -0x1.f7c0912p-2 F +REG epsg:2082 3 EXC:java.lang.IllegalStateException 0x1.ec306093d97c7p20 0x1.1132e37904607p18 0x1.bd1ae59fcp4 NaN NaN NaN F +REG epsg:2082 4 EXC:java.lang.IllegalStateException 0x1.6c3fe4887ebafp21 0x1.1132e3cff5f0dp18 0x1.72fb3957p4 NaN NaN NaN F +REG epsg:20822 0 OK 0x1.e8386034ba4cfp18 0x1.b99a35b853fdap22 -0x1.05aa4096p3 -0x1.98p5 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:20822 1 OK -0x1.fce7becdab3cp14 0x1.9703cdf2e7bc7p22 -0x1.5fcf840dcp4 -0x1.c42297030ae5cp5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:20822 2 OK 0x1.f81f9e160c911p19 0x1.9703cdf31fd32p22 -0x1.0330a2812p5 -0x1.6bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:20822 3 OK -0x1.3015df5ed7e28p16 0x1.dacd283fefc89p22 0x1.9fb2c1318p3 -0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:20822 4 OK 0x1.071d8e04f9beap20 0x1.dacd2840252bap22 0x1.b1c872f4p0 -0x1.6bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:20823 0 OK 0x1.e83022c3aaaedp18 0x1.b99a27ba2befp22 -0x1.f5d4091f8p3 -0x1.68p5 -0x1.8fffffffffffep4 0x1.0p-29 F +REG epsg:20823 1 OK -0x1.fd6dfb239662p14 0x1.9703bd47148dep22 -0x1.a619b7448p4 -0x1.942297030ae5ep5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:20823 2 OK 0x1.f81b927ca1e08p19 0x1.9703bd476a35ep22 -0x1.52421927p5 -0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:20823 3 OK -0x1.303789dae0938p16 0x1.dacd1cd501cap22 0x1.072931668p3 -0x1.942297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:20823 4 OK 0x1.071b89ee33168p20 0x1.dacd1cd55352p22 -0x1.20f3be128p3 -0x1.3bdd68fcf51a4p5 -0x1.4000000000003p4 0x1.8p-29 F +REG epsg:20824 0 OK 0x1.e828283f77e5cp18 0x1.b99a13fcc0aap22 -0x1.a450bd634p4 -0x1.37fffffffffffp5 -0x1.8ffffffffffffp4 -0x1.8p-29 F +REG epsg:20824 1 OK -0x1.fdf1043dc17ap14 0x1.9703a5c266caep22 -0x1.0e58ba7cp5 -0x1.642297030ae5ep5 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:20824 2 OK 0x1.f817b036ac86bp19 0x1.9703a5c2d90fap22 -0x1.b81595d28p5 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:20824 3 OK -0x1.305872c8151bp16 0x1.dacd0cb9989cap22 0x1.733b49ep-3 -0x1.642297030ae5cp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:20824 4 OK 0x1.07199b3514cecp20 0x1.dacd0cba05614p22 -0x1.6d7372a3p4 -0x1.0bdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:2083 0 OK 0x1.312a5692f114ep21 0x1.b500402dbb1f7p16 -0x1.fc9f16534p5 -0x1.1400000000001p6 -0x1.64p6 -0x1.0p-30 F +REG epsg:2083 1 OK 0x1.255b6f3d33933p21 0x1.b5ba05a60fc7ep15 -0x1.feb221afcp5 0x1.555523143f45cp6 -0x1.67fe32760c82dp6 0x1.66226f88p1 F +REG epsg:2083 2 OK 0x1.3cf93deb7b7fdp21 0x1.b5ba05d19eb2ep15 -0x1.09a58704bp6 0x1.555523143f45cp6 -0x1.67fe327600578p6 0x1.c93a9f2p-3 F +REG epsg:2083 3 EXC:java.lang.IllegalStateException 0x1.ec2c915eed03p20 0x1.115f8176bbac4p18 -0x1.ac3641e38p5 NaN NaN NaN F +REG epsg:2083 4 EXC:java.lang.IllegalStateException 0x1.6c3e641a422c8p21 0x1.115f826796a3cp18 -0x1.09895ef34p6 NaN NaN NaN F +REG epsg:2084 0 OK 0x1.e832b6cc03963p18 0x1.b995df50e18bfp22 -0x1.163dfc13cp5 -0x1.13fffffffffffp6 -0x1.8fffffffffffep4 0x1.0p-29 F +REG epsg:2084 1 OK -0x1.fd42e985f08ap14 0x1.96ff6e936a682p22 -0x1.5d52c62bcp4 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2084 2 OK 0x1.f81cce00e236bp19 0x1.96ff6e93b6d23p22 -0x1.202036762p5 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:2084 3 OK -0x1.3031149a24088p16 0x1.dac8da8237508p22 -0x1.186bfccbp5 -0x1.2a114b818572ep6 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG epsg:2084 4 OK 0x1.071c6c9da80abp20 0x1.dac8da827ffcep22 -0x1.9389c4956p5 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2085 0 OK 0x1.e848p18 0x1.11ba010624dd3p18 0x0.0p0 -0x1.44p6 0x1.65999999998a2p4 0x0.0p0 F +REG epsg:2085 1 OK -0x1.2b3735c29451p16 -0x1.0153d4e9de713p18 0x0.0p0 -0x1.599fdd28e3eaap6 0x1.159999999987fp4 0x0.0p0 F +REG epsg:2085 2 OK 0x1.06d7735c29451p20 -0x1.0153d4e9de713p18 0x0.0p0 -0x1.2e6022d71c156p6 0x1.159999999987fp4 0x0.0p0 F +REG epsg:2085 3 OK -0x1.1fbbe7194309p15 0x1.9c51c7a10eaap19 0x0.0p0 -0x1.599fdd28e3eaap6 0x1.b5999999998d2p4 0x0.0p0 F +REG epsg:2085 4 OK 0x1.fa43be7194309p19 0x1.9c51c7a10eaap19 0x0.0p0 -0x1.2e6022d71c156p6 0x1.b5999999998d2p4 0x0.0p0 F +REG epsg:2086 0 OK 0x1.e848p18 0x1.bf83783126e98p17 0x0.0p0 -0x1.3355555555555p6 0x1.4b7777777767p4 0x0.0p0 F +REG epsg:2086 1 OK -0x1.24f0679f94638p16 -0x1.340b277f9c38cp18 0x0.0p0 -0x1.48b745942595bp6 0x1.f6eeeeeeeeccdp3 0x0.0p0 F +REG epsg:2086 2 OK 0x1.06730679f9464p20 -0x1.340b277f9c38cp18 0x0.0p0 -0x1.1df365168514fp6 0x1.f6eeeeeeeeccdp3 0x0.0p0 F +REG epsg:2086 3 OK -0x1.2c1f70ac8d9bp15 0x1.82ea47fed178fp19 0x0.0p0 -0x1.48b745942595bp6 0x1.9b7777777769dp4 0x0.0p0 F +REG epsg:2086 4 OK 0x1.fb09f70ac8d9bp19 0x1.82ea47fed178fp19 0x0.0p0 -0x1.1df365168514fp6 0x1.9b7777777769dp4 0x0.0p0 F +REG epsg:2087 0 OK 0x1.e85a31d11e07dp18 0x1.30ce8e9c8f6abp7 -0x1.d451ae1ccp6 0x1.8000000000001p3 0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:2087 1 OK -0x1.acfa2becc271p15 -0x1.0ed197199cc86p19 -0x1.12076cec1p7 0x1.c0000001d7a96p2 -0x1.3fffffffeac19p2 -0x1.0p-28 F +REG epsg:2087 2 OK 0x1.0194ea586f656p20 -0x1.0ed1971a13acep19 -0x1.f17d034ep6 0x1.0fffffff89e6bp4 -0x1.3fffffffeab7cp2 0x1.0p-29 F +REG epsg:2087 3 OK -0x1.acf586162c76p15 0x1.0ef7b09986e97p19 -0x1.b9c0fdadp6 0x1.c0000001d79b4p2 0x1.3fffffffeabefp2 -0x1.0p-29 F +REG epsg:2087 4 OK 0x1.0194c5273eb2cp20 0x1.0ef7b099fdeecp19 -0x1.872f35098p6 0x1.0fffffff89ea3p4 0x1.3fffffffeab5p2 0x1.0p-29 F +REG epsg:2088 0 OK 0x1.e839fce00647p18 -0x1.aed157d643a7cp8 0x1.21c937b808p7 0x1.5ffffffffffffp3 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:2088 1 OK -0x1.adc52d2b3238p15 -0x1.0f17a23601c05p19 0x1.780b008f78p7 0x1.80000001e0ea2p2 -0x1.3fffffffea458p2 0x0.0p0 F +REG epsg:2088 2 OK 0x1.018b27d043d48p20 -0x1.0f17a235a461bp19 0x1.6491f242dp7 0x1.ffffffff0fd4bp3 -0x1.3fffffffea4d2p2 -0x1.8p-29 F +REG epsg:2088 3 OK -0x1.add2518d03a3p15 0x1.0eabeecaed89ap19 0x1.c38d6fff5p6 0x1.80000001e112bp2 0x1.3fffffffea4d7p2 -0x1.0p-28 F +REG epsg:2088 4 OK 0x1.018b90ede9a6p20 0x1.0eabeeca90734p19 0x1.9c9b35213p6 0x1.ffffffff0fc09p3 0x1.3fffffffea552p2 -0x1.8p-29 F +REG epsg:2089 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:2089 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2089 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2089 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2089 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2090 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:2090 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2090 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2090 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2090 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2091 0 OK 0x1.036697ae3ec5dp23 -0x1.0bff87e78fd81p6 0x1.5a922326ep5 0x1.67ffffffffffep5 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2091 1 OK 0x1.e4ea5dee74e1ep22 -0x1.0f0700d55d3fbp19 0x1.6179b1508p5 0x1.400000003a93ep5 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:2091 2 OK 0x1.145800665e824p23 -0x1.0f0700d5a4d6fp19 0x1.9e606a5ecp5 0x1.8fffffffc55ep5 -0x1.3fffffffeadfbp2 -0x1.0p-30 F +REG epsg:2091 3 OK 0x1.e4ea59d84942fp22 0x1.0ef641009a776p19 0x1.040bf0c86p5 0x1.400000003a94ap5 0x1.3fffffffeae6dp2 0x0.0p0 F +REG epsg:2091 4 OK 0x1.14580271895d3p23 0x1.0ef64100e205ep19 0x1.40f2b131ap5 0x1.8fffffffc55d6p5 0x1.3fffffffeae0cp2 -0x1.0p-30 F +REG epsg:2092 0 OK 0x1.21eaf790da586p23 -0x1.0bff7d7fab492p6 0x1.789968ef8p5 0x1.9800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2092 1 OK 0x1.10f98f807b7a2p23 -0x1.0f06f648baaf1p19 0x1.8a6dc6d4cp5 0x1.700000003a966p5 -0x1.3fffffffeae45p2 -0x1.0p-30 F +REG epsg:2092 2 OK 0x1.32dc5fa1ecd8fp23 -0x1.0f06f648e80e8p19 0x1.b10614d1cp5 0x1.bfffffffc560cp5 -0x1.3fffffffeae0ap2 -0x1.0p-29 F +REG epsg:2092 3 OK 0x1.10f98d75620cbp23 0x1.0ef636749d13ap19 0x1.2d000b3f2p5 0x1.700000003a972p5 0x1.3fffffffeae5ap2 -0x1.0p-30 F +REG epsg:2092 4 OK 0x1.32dc61ad139cap23 0x1.0ef63674ca6dap19 0x1.53985de58p5 0x1.bfffffffc5602p5 0x1.3fffffffeae1ep2 0x1.0p-30 F +REG epsg:2093 0 OK 0x1.e83c53eacafd4p18 0x1.f31ee54003a87p5 -0x1.167751458p3 0x1.a800000000001p6 0x0.0p0 -0x1.0p-30 T +REG epsg:2093 1 OK -0x1.af911a844506p15 -0x1.0ef766b24e45ep19 -0x1.5b8af6c2p3 0x1.940000001d51fp6 -0x1.3fffffffeae05p2 0x1.0p-29 F +REG epsg:2093 2 OK 0x1.019ab2bf7205dp20 -0x1.0ef766b20224dp19 -0x1.2f7cf616cp4 0x1.bbffffffe2b5cp6 -0x1.3fffffffeae67p2 0x1.0p-30 F +REG epsg:2093 3 OK -0x1.af8f3354f681p15 0x1.0f06ff88211a8p19 0x1.d7b172p-7 0x1.940000001d519p6 0x1.3fffffffeadf3p2 0x1.0p-28 F +REG epsg:2093 4 OK 0x1.019aa3869e884p20 0x1.0f06ff87d4f0ep19 -0x1.02f8ebe1p3 0x1.bbffffffe2b61p6 0x1.3fffffffeae56p2 -0x1.0p-30 F +REG epsg:20934 0 OK 0x1.e85030ceff77cp18 0x1.b99c53faba658p22 -0x1.7ebc2ab7p4 0x1.5p4 -0x1.8fffffffffffep4 -0x1.0p-30 F +REG epsg:20934 1 OK -0x1.fb6b9bbefc74p14 0x1.9705e673c6bb2p22 -0x1.fd6bda1fcp4 0x1.ef75a3f3d468ep3 -0x1.dffffffffffffp4 0x1.0p-29 F +REG epsg:20934 2 OK 0x1.f82b8db6fb629p19 0x1.9705e673a8f84p22 -0x1.a6199787p4 0x1.a8452e0615cb9p4 -0x1.e000000000005p4 0x1.0p-30 F +REG epsg:20934 3 OK -0x1.2fb8ede32353p16 0x1.dacf4c3c7720ep22 -0x1.3dc4f2668p4 0x1.ef75a3f3d468cp3 -0x1.3ffffffffffffp4 0x1.8p-29 F +REG epsg:20934 4 OK 0x1.0723a74c1095ap20 0x1.dacf4c3c5acfcp22 -0x1.be0a0bb38p3 0x1.a8452e0615cb9p4 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:20935 0 OK 0x1.e84bd0e390bd6p18 0x1.b99c583bf23aap22 -0x1.5a391ea6p4 0x1.bp4 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:20935 1 OK -0x1.fbb0e0888784p14 0x1.9705eb8570036p22 -0x1.c35fde034p4 0x1.57bad1f9ea349p4 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:20935 2 OK 0x1.f82957ec80a8fp19 0x1.9705eb8562258p22 -0x1.9ab12b268p4 0x1.042297030ae5cp5 -0x1.e000000000005p4 -0x1.0p-29 F +REG epsg:20935 3 OK -0x1.2fca36c7614b8p16 0x1.dacf4fb52e67fp22 -0x1.fd91a9c9p3 0x1.57bad1f9ea348p4 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:20935 4 OK 0x1.07228be135c96p20 0x1.dacf4fb521367p22 -0x1.a5485264p3 0x1.042297030ae5ep5 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:20936 0 OK 0x1.e84766445c564p18 0x1.b99c595fa55p22 -0x1.5071eb9e4p4 0x1.0800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:20936 1 OK -0x1.fbf758f0844ep14 0x1.9705ece0efbdp22 -0x1.a2882f07p4 0x1.b7bad1f9ea345p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:20936 2 OK 0x1.f827210b24422p19 0x1.9705ece0f1ebap22 -0x1.a8ef24f58p4 0x1.342297030ae5cp5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:20936 3 OK -0x1.2fdbd2ac417f8p16 0x1.dacf50a329c3ap22 -0x1.b64bd2bbp3 0x1.b7bad1f9ea34ap4 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:20936 4 OK 0x1.0721704c7ac8p20 0x1.dacf50a32bd73p22 -0x1.c43098608p3 0x1.342297030ae5ep5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2094 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.a800000000001p6 -0x1.2f74bf1dbb5b8p-69 0x1.a0a2p-14 T +REG epsg:2094 1 OK -0x1.ada7001d0dd2p15 -0x1.0ee398b6f0d04p19 0x1.259d2fefp2 0x1.940000001d521p6 -0x1.3fffffffd56f4p2 0x1.9d79p-14 F +REG epsg:2094 2 OK 0x1.018e12dfa0327p20 -0x1.0ee38c6f7c186p19 0x1.259d2feep2 0x1.bbffffffe2b21p6 -0x1.3fffffffd5728p2 0x1.9d79p-14 F +REG epsg:2094 3 OK -0x1.ada70ef1a843p15 0x1.0ee31f2acf877p19 0x1.106af05p2 0x1.940000001d521p6 0x1.3fffffffd56f4p2 0x1.9d79p-14 F +REG epsg:2094 4 OK 0x1.018e1356423ddp20 0x1.0ee312e36043ap19 0x1.106af04fp2 0x1.bbffffffe2b21p6 0x1.3fffffffd5729p2 0x1.9d7ap-14 F +REG epsg:2095 0 OK 0x1.e8161e724c4b9p18 -0x1.afd415a1a7825p4 -0x1.2691221e4p4 -0x1.dfffffffffffep3 -0x1.2f74bf1dcfcaep-64 0x1.0p-30 T +REG epsg:2095 1 OK -0x1.af06ee02907dp15 -0x1.0ee6ee51829e9p19 0x1.947e28ep-3 -0x1.3ffffffffffffp4 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2095 2 OK 0x1.0183467fde222p20 -0x1.0ee6ee503bb95p19 -0x1.13b23242ep5 -0x1.3fffffffffffep3 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:2095 3 OK -0x1.af07c0d0e864p15 0x1.0ee02f0f9fb75p19 -0x1.20910f78p2 -0x1.3ffffffffffffp4 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2095 4 OK 0x1.01834d151c19ep20 0x1.0ee02f0e58e2p19 -0x1.3958dfda2p5 -0x1.4p3 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:2096 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.02p7 0x1.3p5 0x0.0p0 F +REG epsg:2096 1 OK -0x1.802ca939eee84p18 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.ea9ea071cbf1bp6 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:2096 2 OK 0x1.8366549cf7756p19 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.0eb0afc71a073p7 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:2096 3 OK -0x1.35f5174ae52e6p18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.ea9ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:2096 4 OK 0x1.5e4a8ba572986p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0eb0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:2097 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:2097 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.e29ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:2097 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.0ab0afc71a073p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:2097 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.e29ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:2097 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0ab0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:2098 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.f400000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:2098 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.da9ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:2098 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.06b0afc71a072p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:2098 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.da9ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:2098 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.06b0afc6f4377p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:2099 0 OK 0x1.86ap16 0x1.86ap16 0x0.0p0 0x1.9617530eca864p5 0x1.961e26af37c04p4 0x0.0p0 F +REG epsg:2099 1 OK -0x1.d26ed72fc8f28p18 -0x1.b19079e4ae824p18 0x0.0p0 0x1.69d132ba71df2p5 0x1.461e261bb5b06p4 0x0.0p0 F +REG epsg:2099 2 OK 0x1.4adf6b97e479ap19 -0x1.b19079e4ae824p18 0x0.0p0 0x1.c25d7363232d6p5 0x1.461e261bb5b06p4 0x0.0p0 F +REG epsg:2099 3 OK -0x1.a5983ee492b7cp18 0x1.45be7815de14ap19 0x0.0p0 0x1.69d1301aaf10dp5 0x1.e61e26dde78d8p4 0x0.0p0 F +REG epsg:2099 4 OK 0x1.34741f72495c4p19 0x1.45be7815de14ap19 0x0.0p0 0x1.c25d7602e5fbcp5 0x1.e61e26dde78d8p4 0x0.0p0 F +REG epsg:2100 0 OK 0x1.e8229c7935824p18 -0x1.ed07e68cfe8bfp7 0x1.305aa68bfp7 0x1.8000000000001p4 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:2100 1 OK -0x1.ae82003e2793p15 -0x1.0f008036081e2p19 0x1.73029c9bap7 0x1.30000000756a6p4 -0x1.3fffffffead5ap2 0x1.8p-28 F +REG epsg:2100 2 OK 0x1.01855e2356e76p20 -0x1.0f00803513292p19 0x1.3f0cb56388p7 0x1.cfffffff8af61p4 -0x1.3fffffffeae9bp2 -0x1.4p-27 F +REG epsg:2100 3 OK -0x1.ae898587ad27p15 0x1.0ec2dfbcb3c25p19 0x1.1d08f7c3cp7 0x1.30000000757p4 0x1.3fffffffeada1p2 0x1.cp-28 F +REG epsg:2100 4 OK 0x1.01859a4561064p20 0x1.0ec2dfbbbf39ep19 0x1.d225f2e23p6 0x1.cfffffff8af05p4 0x1.3fffffffeaeep2 -0x1.4p-27 F +REG epsg:2101 0 OK 0x0.0p0 -0x1.9b99f1a9fbe77p15 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG epsg:2101 1 OK -0x1.1408e750d1f92p19 -0x1.25ea29a148f24p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2101 2 OK 0x1.1408e750d1f9ep19 -0x1.25ea29a148f24p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2101 3 OK -0x1.0b927d4cc048cp19 0x1.ed9b5d2d72cadp18 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2101 4 OK 0x1.0b927d4cc0498p19 0x1.ed9b5d2d72cadp18 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2102 0 OK 0x1.86ap17 0x1.1fb9839581062p17 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG epsg:2102 1 OK -0x1.64c1cea1a3f24p18 -0x1.8884534291e49p18 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2102 2 OK 0x1.75b0e750d1f9ep19 -0x1.8884534291e49p18 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2102 3 OK -0x1.53d4fa9980918p18 0x1.5875ae96b9656p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2102 4 OK 0x1.6d3a7d4cc0498p19 0x1.5875ae96b9656p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2103 0 OK 0x1.e848p18 0x1.b4d4c1cac0831p18 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG epsg:2103 1 OK -0x1.fe4e750d1f92p15 -0x1.8e314d0a47924p16 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2103 2 OK 0x1.041673a868fcfp20 -0x1.8e314d0a47924p16 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2103 3 OK -0x1.76e7d4cc048cp15 0x1.eaf1ae96b9656p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2103 4 OK 0x1.ffb67d4cc0498p19 0x1.eaf1ae96b9656p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:21035 0 OK 0x1.e8372ef9bd3efp18 0x1.b99c4e6159938p22 -0x1.6ed48351p5 0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:21035 1 OK -0x1.fd02fc846b18p14 0x1.9705d902146b9p22 -0x1.69388fbecp5 0x1.57bad1f9ea348p4 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:21035 2 OK 0x1.f81f46c95d368p19 0x1.9705d902517eap22 -0x1.c2dcae96p5 0x1.042297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:21035 3 OK -0x1.301ef3df993b8p16 0x1.dacf4e2da47bfp22 -0x1.059f6474p5 0x1.57bad1f9ea348p4 -0x1.4000000000002p4 -0x1.0p-29 F +REG epsg:21035 4 OK 0x1.071d86adc5432p20 0x1.dacf4e2dde994p22 -0x1.66e3b275cp5 0x1.042297030ae5dp5 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:21036 0 OK 0x1.e8337b01147e4p18 0x1.b99c41264b932p22 -0x1.a79960f12p5 0x1.08p5 -0x1.8ffffffffffffp4 -0x1.0p-30 F +REG epsg:21036 1 OK -0x1.fd407f8ac9dap14 0x1.9705c93eb8c76p22 -0x1.95588598ap5 0x1.b7bad1f9ea347p4 -0x1.dfffffffffffap4 -0x1.0p-30 F +REG epsg:21036 2 OK 0x1.f81d7ee475d83p19 0x1.9705c93f034a7p22 -0x1.015cebee5p6 0x1.342297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:21036 3 OK -0x1.302e6e8c6275p16 0x1.dacf4361f5514p22 -0x1.35804b252p5 0x1.b7bad1f9ea34ap4 -0x1.3fffffffffffep4 -0x1.0p-30 F +REG epsg:21036 4 OK 0x1.071ca4595647ep20 0x1.dacf43623c382p22 -0x1.ac2faccb8p5 0x1.342297030ae5dp5 -0x1.3fffffffffffep4 -0x1.0p-30 F +REG epsg:21037 0 OK 0x1.e83000951be98p18 0x1.b99c315fc4a8bp22 -0x1.eb4980488p5 0x1.37fffffffffffp5 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:21037 1 OK -0x1.fd7ad929186cp14 0x1.9705b67333ebbp22 -0x1.cc7480cbcp5 0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffap4 -0x1.0p-30 F +REG epsg:21037 2 OK 0x1.f81bd7414ef0fp19 0x1.9705b6738b0c4p22 -0x1.26302082ep6 0x1.642297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:21037 3 OK -0x1.303d23da5437p16 0x1.dacf3682b53a3p22 -0x1.714c6f108p5 0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:21037 4 OK 0x1.071bd2757b2cap20 0x1.dacf368308226p22 -0x1.fc1a067e6p5 0x1.642297030ae5dp5 -0x1.4p4 0x1.0p-29 F +REG epsg:2104 0 OK -0x1.0a5p14 -0x1.698fe147ae148p14 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG epsg:2104 1 OK -0x1.1c5b6750d1f92p19 -0x1.177d0990e6a47p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2104 2 OK 0x1.0bb66750d1f9ep19 -0x1.177d0990e6a47p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG epsg:2104 3 OK -0x1.13e4fd4cc048cp19 0x1.053acea71bb34p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2104 4 OK 0x1.033ffd4cc0498p19 0x1.053acea71bb34p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG epsg:2105 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5d8740da740dcp7 -0x1.2709abcdf0123p5 0x0.0p0 F +REG epsg:2105 1 OK -0x1.d08668074683cp16 0x1.b96a6c64d446cp17 0x0.0p0 0x1.5106d779d9002p7 -0x1.4f09abcd5a428p5 0x0.0p0 F +REG epsg:2105 2 OK 0x1.c0b0cd00e8d08p19 0x1.b96a6c64d446cp17 0x0.0p0 -0x1.65f855c4f0e4ap7 -0x1.4f09abcd5a428p5 0x0.0p0 F +REG epsg:2105 3 OK -0x1.76c9697d13684p17 0x1.4689a71d5c278p20 0x0.0p0 0x1.5106d779ba9ecp7 -0x1.fe13579b44dc4p4 0x0.0p0 F +REG epsg:2105 4 OK 0x1.e4525a5f44da1p19 0x1.4689a71d5c278p20 0x0.0p0 -0x1.65f855c4d2834p7 -0x1.fe13579b44dc4p4 0x0.0p0 F +REG epsg:2106 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.60eea61d950c8p7 -0x1.2e16c16c16c17p5 0x0.0p0 F +REG epsg:2106 1 OK -0x1.cc191f4c6d87cp16 0x1.b8269d7118b08p17 0x0.0p0 0x1.54487b7d35482p7 -0x1.5616c16b6fadbp5 0x0.0p0 F +REG epsg:2106 2 OK 0x1.c02323e98db1p19 0x1.b8269d7118b08p17 0x0.0p0 -0x1.626b2f420b2f1p7 -0x1.5616c16b6fadbp5 0x0.0p0 F +REG epsg:2106 3 OK -0x1.79393c5260064p17 0x1.466891405150fp20 0x0.0p0 0x1.54487b7d11187p7 -0x1.0616c16bbd8e3p5 0x0.0p0 F +REG epsg:2106 4 OK 0x1.e4ee4f1498019p19 0x1.466891405150fp20 0x0.0p0 -0x1.626b2f41e6ff7p7 -0x1.0616c16bbd8e3p5 0x0.0p0 F +REG epsg:2107 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.63c56789abce1p7 -0x1.34fedcba98765p5 0x0.0p0 F +REG epsg:2107 1 OK -0x1.c7733486bc9e8p16 0x1.b700b1160576p17 0x0.0p0 0x1.56f89f482d573p7 -0x1.5cfedcb9dec1cp5 0x0.0p0 F +REG epsg:2107 2 OK 0x1.bf8e6690d793dp19 0x1.b700b1160576p17 0x0.0p0 -0x1.5f6dd034d5bb1p7 -0x1.5cfedcb9dec1cp5 0x0.0p0 F +REG epsg:2107 3 OK -0x1.7b8c9d132bab4p17 0x1.4643cb75af311p20 0x0.0p0 0x1.56f89f4802e0bp7 -0x1.0cfedcba32385p5 0x0.0p0 F +REG epsg:2107 4 OK 0x1.e5832744caeadp19 0x1.4643cb75af311p20 0x0.0p0 -0x1.5f6dd034ab449p7 -0x1.0cfedcba32385p5 0x0.0p0 F +REG epsg:2108 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.6158e38e38e38p7 -0x1.3d34e81b4e81bp5 0x0.0p0 F +REG epsg:2108 1 OK -0x1.c1c4e44a56004p16 0x1.b59cb7ecffaacp17 0x0.0p0 0x1.545bfc8a4b737p7 -0x1.6534e81a7c3dcp5 0x0.0p0 F +REG epsg:2108 2 OK 0x1.bed89c894acp19 0x1.b59cb7ecffaacp17 0x0.0p0 -0x1.61aa356dd9ac7p7 -0x1.6534e81a7c3dcp5 0x0.0p0 F +REG epsg:2108 3 OK -0x1.7e6295d90b918p17 0x1.461698af3cdf8p20 0x0.0p0 0x1.545bfc8a18ab3p7 -0x1.1534e81ad6371p5 0x0.0p0 F +REG epsg:2108 4 OK 0x1.e638a57642e46p19 0x1.461698af3cdf8p20 0x0.0p0 -0x1.61aa356da6e43p7 -0x1.1534e81ad6371p5 0x0.0p0 F +REG epsg:2109 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5c749f49f49f5p7 -0x1.39159e26af37dp5 0x0.0p0 F +REG epsg:2109 1 OK -0x1.c4a48bff7a28cp16 0x1.b65055aaad014p17 0x0.0p0 0x1.4f902f719a9c4p7 -0x1.61159e25e99fdp5 0x0.0p0 F +REG epsg:2109 2 OK 0x1.bf34917fef452p19 0x1.b65055aaad014p17 0x0.0p0 -0x1.66a6f0ddb15dap7 -0x1.61159e25e99fdp5 0x0.0p0 F +REG epsg:2109 3 OK -0x1.7cf397b3bc8acp17 0x1.462d7ec70000cp20 0x0.0p0 0x1.4f902f716c20fp7 -0x1.11159e26405b8p5 0x0.0p0 F +REG epsg:2109 4 OK 0x1.e5dce5ecef22bp19 0x1.462d7ec70000cp20 0x0.0p0 -0x1.66a6f0dd82e24p7 -0x1.11159e26405b8p5 0x0.0p0 F +REG epsg:21095 0 OK 0x1.e8372f0762858p18 0x1.2de0abbd50896p8 0x1.092e29a84p5 0x1.bp4 -0x1.2f74bf1dcfcbp-61 -0x1.8p-29 T +REG epsg:21095 1 OK -0x1.adfa2e55440fp15 -0x1.0ebd46b039a5cp19 0x1.c6b15f488p3 0x1.6p4 -0x1.4p2 -0x1.0p-29 F +REG epsg:21095 2 OK 0x1.018b68e5fda0ep20 -0x1.0ebd46afca179p19 0x1.4317ebc6p1 0x1.ffffffffffffep4 -0x1.4p2 -0x1.8p-29 F +REG epsg:21095 3 OK -0x1.adf0f8c091fdp15 0x1.0f08be35e48c3p19 0x1.0b6c417e6p6 0x1.6p4 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:21095 4 OK 0x1.018b1f3de48b8p20 0x1.0f08be3574c12p19 0x1.b95ddccfcp5 0x1.ffffffffffffep4 0x1.3fffffffffffcp2 -0x1.0p-30 F +REG epsg:21096 0 OK 0x1.e8337b11932b6p18 0x1.2de0c43133a78p8 0x1.9515ec258p4 0x1.07fffffffffffp5 0x0.0p0 0x1.0p-29 T +REG epsg:21096 1 OK -0x1.ae192a24cfeep15 -0x1.0ebd5cac6bef6p19 0x1.ee6d85d9p2 0x1.bfffffffffffep4 -0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:21096 2 OK 0x1.018a86c5f9552p20 -0x1.0ebd5cabe3d62p19 -0x1.a216166p2 0x1.3000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:21096 3 OK -0x1.ae0ff47ddd0ep15 0x1.0f08d438277f1p19 0x1.e2f9f8252p5 0x1.bffffffffffffp4 0x1.4p2 0x0.0p0 F +REG epsg:21096 4 OK 0x1.018a3d1e4ea5cp20 0x1.0f08d4379f1bbp19 0x1.70e9c2bc6p5 0x1.3p5 0x1.4p2 -0x1.0p-29 F +REG epsg:21097 0 OK 0x1.e83000a82ed69p18 0x1.2de0e159210b8p8 0x1.ff6e29b9p3 0x1.37fffffffffffp5 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:21097 1 OK -0x1.ae369c7842aep15 -0x1.0ebd76e32530bp19 -0x1.52dbc45p-2 0x1.1p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:21097 2 OK 0x1.0189b52082abcp20 -0x1.0ebd76e2860cfp19 -0x1.1017bb3b8p4 0x1.6000000000001p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:21097 3 OK -0x1.ae2d66bf9a63p15 0x1.0f08ee761c0c5p19 0x1.a286b2faep5 0x1.1p5 0x1.4000000000001p2 -0x1.0p-28 F +REG epsg:21097 4 OK 0x1.01896b793b2d2p20 0x1.0f08ee757c91ep19 0x1.1d20d58c4p5 0x1.6p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2110 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5f47ae147ae14p7 -0x1.3c1907f6e5d4cp5 0x0.0p0 F +REG epsg:2110 1 OK -0x1.c28be7e6a5f3p16 0x1.b5cd37d212ecp17 0x0.0p0 0x1.52516bbfa023bp7 -0x1.641907f6170b3p5 0x0.0p0 F +REG epsg:2110 2 OK 0x1.bef17cfcd4be6p19 0x1.b5cd37d212ecp17 0x0.0p0 -0x1.63c20f96aa612p7 -0x1.641907f6170b3p5 0x0.0p0 F +REG epsg:2110 3 OK -0x1.7dff5a17557ccp17 0x1.461ccc62cca3p20 0x0.0p0 0x1.52516bbf6e8a2p7 -0x1.141907f670274p5 0x0.0p0 F +REG epsg:2110 4 OK 0x1.e61fd685d55f3p19 0x1.461ccc62cca3p20 0x0.0p0 -0x1.63c20f9678c79p7 -0x1.141907f670274p5 0x0.0p0 F +REG epsg:21100 0 OK -0x1.e567662a97c68p22 0x1.b77a3b3512375p19 -0x1.d06a27e74p4 0x1.b8p6 -0x1.f686e7a19869dp-41 -0x1.0p-30 T +REG epsg:21100 1 OK -0x1.03a317c9daf4fp23 0x1.53f7546a97ef8p18 -0x1.18262c8a4p4 0x1.a400000000001p6 -0x1.3fffffffffe2p2 -0x1.0p-29 F +REG epsg:21100 2 OK -0x1.c3889cbaf21cp22 0x1.53f6de52101a6p18 -0x1.34ab98a6ap5 0x1.cc00000000002p6 -0x1.3fffffffffe26p2 -0x1.0p-29 F +REG epsg:21100 3 OK -0x1.03a317c9daf4fp23 0x1.627c660f0b8b6p20 -0x1.195f5d968p3 0x1.a400000000001p6 0x1.3fffffffffe3p2 -0x1.0p-28 F +REG epsg:21100 4 OK -0x1.c3889cbaf21cp22 0x1.627c8396893dap20 -0x1.dde09526cp4 0x1.cc00000000002p6 0x1.3fffffffffe21p2 -0x1.0p-29 F +REG epsg:2111 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5ef9e26af37bep7 -0x1.41ef8091a2b3cp5 0x0.0p0 F +REG epsg:2111 1 OK -0x1.be6ab400c2db8p16 0x1.b4cc5b6396e3p17 0x0.0p0 0x1.51e020eb97faap7 -0x1.69ef8090c1016p5 0x0.0p0 F +REG epsg:2111 2 OK 0x1.be6d5680185a6p19 0x1.b4cc5b6396e34p17 0x0.0p0 -0x1.63ec5c15b102fp7 -0x1.69ef8090c1016p5 0x0.0p0 F +REG epsg:2111 3 OK -0x1.800e1766e30b8p17 0x1.45fbca5561faap20 0x0.0p0 0x1.51e020eb5fee7p7 -0x1.19ef80911e98ap5 0x0.0p0 F +REG epsg:2111 4 OK 0x1.e6a385d9b8c1ap19 0x1.45fbca5561faap20 0x0.0p0 -0x1.63ec5c1578f6bp7 -0x1.19ef80911e98ap5 0x0.0p0 F +REG epsg:2112 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5f4b60b60b60bp7 -0x1.4766f8091a2b3p5 0x0.0p0 F +REG epsg:2112 1 OK -0x1.ba76dd74d65e8p16 0x1.b3d851e575388p17 0x0.0p0 0x1.520f2ec97abap7 -0x1.6f66f80825601p5 0x0.0p0 F +REG epsg:2112 2 OK 0x1.bdeedbae9acacp19 0x1.b3d851e57539p17 0x0.0p0 -0x1.63786d5d63f8ap7 -0x1.6f66f80825602p5 0x0.0p0 F +REG epsg:2112 3 OK -0x1.820547eb07db4p17 0x1.45dc0dea75e43p20 0x0.0p0 0x1.520f2ec93c1c3p7 -0x1.1f66f80886f51p5 0x0.0p0 F +REG epsg:2112 4 OK 0x1.e72151fac1f59p19 0x1.45dc0dea75e44p20 0x0.0p0 -0x1.63786d5d255adp7 -0x1.1f66f80886f5p5 0x0.0p0 F +REG epsg:2113 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5d8d82d82d82ep7 -0x1.4a68acf13579ap5 0x0.0p0 F +REG epsg:2113 1 OK -0x1.b840fced2768p16 0x1.b3509c9d4339cp17 0x0.0p0 0x1.503ddcfe601bbp7 -0x1.7268acf03592cp5 0x0.0p0 F +REG epsg:2113 2 OK 0x1.bda81f9da4edp19 0x1.b3509c9d4339cp17 0x0.0p0 -0x1.6522d74e0515fp7 -0x1.7268acf03592cp5 0x0.0p0 F +REG epsg:2113 3 OK -0x1.831e493cd663cp17 0x1.45ca3e54b18c8p20 0x0.0p0 0x1.503ddcfe1da3cp7 -0x1.2268acf0993cep5 0x0.0p0 F +REG epsg:2113 4 OK 0x1.e767924f3598fp19 0x1.45ca3e54b18c8p20 0x0.0p0 -0x1.6522d74dc29dfp7 -0x1.2268acf0993cep5 0x0.0p0 F +REG epsg:2114 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5958091a2b3c3p7 -0x1.45b7c048d159fp5 0x0.0p0 F +REG epsg:2114 1 OK -0x1.bbb0f46649274p16 0x1.b423e22ec12d4p17 0x0.0p0 0x1.4c2694269a09ap7 -0x1.6db7c047e2975p5 0x0.0p0 F +REG epsg:2114 2 OK 0x1.be161e8cc924ep19 0x1.b423e22ec12d4p17 0x0.0p0 0x1.66897e0dbc6ecp7 -0x1.6db7c047e2975p5 0x0.0p0 F +REG epsg:2114 3 OK -0x1.81692ede16dfp17 0x1.45e5ebc1deadp20 0x0.0p0 0x1.4c2694265d80ep7 -0x1.1db7c04842f8p5 0x0.0p0 F +REG epsg:2114 4 OK 0x1.e6fa4bb785b7cp19 0x1.45e5ebc1deadp20 0x0.0p0 0x1.66897e0df8f79p7 -0x1.1db7c04842f8p5 0x0.0p0 F +REG epsg:21148 0 OK 0x1.e8190b5cf3201p18 0x1.b9986d787af44p22 0x1.6475b065cp4 0x1.a400000000001p6 -0x1.9000000000001p4 -0x1.8p-29 F +REG epsg:21148 1 OK -0x1.fec5a4e9b2cap14 0x1.970210d3a622cp22 0x1.f639670e6p5 0x1.8deeb47e7a8d2p6 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:21148 2 OK 0x1.f80f385a59d32p19 0x1.970210d44dd82p22 0x1.f7c72b77cp4 0x1.ba114b818572fp6 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:21148 3 OK -0x1.3093912c226ep16 0x1.dacb558683992p22 0x1.971532edcp4 0x1.8deeb47e7a8d3p6 -0x1.3fffffffffffdp4 0x1.0p-28 F +REG epsg:21148 4 OK 0x1.0715be986a632p20 0x1.dacb558722fabp22 -0x1.105bae47p3 0x1.ba114b818572fp6 -0x1.4p4 0x1.0p-29 F +REG epsg:21149 0 OK 0x1.e82d08739cbb8p18 0x1.b9985345b167p22 0x1.074293378p3 0x1.bcp6 -0x1.8fffffffffffep4 -0x1.0p-30 F +REG epsg:21149 1 OK -0x1.fd8a4d759dc4p14 0x1.9701f19d79adap22 0x1.5605618d4p5 0x1.a5eeb47e7a8d3p6 -0x1.e000000000003p4 -0x1.0p-30 F +REG epsg:21149 2 OK 0x1.f8195ac76a037p19 0x1.9701f19dd9f78p22 0x1.8c80c5224p4 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:21149 3 OK -0x1.3044ee5731c7p16 0x1.dacb40261d33bp22 0x1.db5bd2aep1 0x1.a5eeb47e7a8d3p6 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:21149 4 OK 0x1.071ad307c0418p20 0x1.dacb402678b62p22 -0x1.f928e1898p3 0x1.d2114b818572fp6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2115 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5a992c5f92c62p7 -0x1.4a320fedcba98p5 0x0.0p0 F +REG epsg:2115 1 OK -0x1.b8695cf0a01b4p16 0x1.b35a46b06626cp17 0x0.0p0 0x1.4d4aeafcf39f1p7 -0x1.72320feccc902p5 0x0.0p0 F +REG epsg:2115 2 OK 0x1.bdad2b9e14026p19 0x1.b35a46b066274p17 0x0.0p0 0x1.67e76dc231ed1p7 -0x1.72320feccc902p5 0x0.0p0 F +REG epsg:2115 3 OK -0x1.830a3f0757f58p17 0x1.45cb840954833p20 0x0.0p0 0x1.4d4aeafcb16e9p7 -0x1.22320fed30153p5 0x0.0p0 F +REG epsg:2115 4 OK 0x1.e7628fc1d5fc3p19 0x1.45cb840954834p20 0x0.0p0 0x1.67e76dc2741d9p7 -0x1.22320fed30152p5 0x0.0p0 F +REG epsg:21150 0 OK 0x1.e84151339ca95p18 0x1.b9984758bcee4p22 0x1.d49702fp0 0x1.d400000000002p6 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:21150 1 OK -0x1.fc47ca7efdbcp14 0x1.9701e36865802p22 0x1.de8f4b0ccp4 0x1.bdeeb47e7a8d3p6 -0x1.e000000000005p4 0x1.0p-30 F +REG epsg:21150 2 OK 0x1.f8238f81af8cfp19 0x1.9701e3687d5bep22 0x1.974dae6fp4 0x1.ea114b818573p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:21150 3 OK -0x1.2ff464ad22758p16 0x1.dacb366b2172cp22 -0x1.4715d2ffp3 0x1.bdeeb47e7a8d3p6 -0x1.4000000000003p4 -0x1.8p-29 F +REG epsg:21150 4 OK 0x1.071feedecb838p20 0x1.dacb366b381f8p22 -0x1.e1b8a42a8p3 0x1.ea114b818572ep6 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:2116 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5837c048d159fp7 -0x1.4a5159e26af37p5 0x0.0p0 F +REG epsg:2116 1 OK -0x1.b8523c58af24cp16 0x1.b354bd6bb6b08p17 0x0.0p0 0x1.4ae8b2bba02f7p7 -0x1.725159e16b647p5 0x0.0p0 F +REG epsg:2116 2 OK 0x1.bdaa478b15e4ap19 0x1.b354bd6bb6b08p17 0x0.0p0 0x1.6586cdd602847p7 -0x1.725159e16b647p5 0x0.0p0 F +REG epsg:2116 3 OK -0x1.8315b9b89cc38p17 0x1.45cac979bbaffp20 0x0.0p0 0x1.4ae8b2bb5dd61p7 -0x1.225159e1cefeap5 0x0.0p0 F +REG epsg:2116 4 OK 0x1.e7656e6e2730ep19 0x1.45cac979bbaffp20 0x0.0p0 0x1.6586cdd644dddp7 -0x1.225159e1cefeap5 0x0.0p0 F +REG epsg:2117 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.572987654321p7 -0x1.4e7c048d159e2p5 0x0.0p0 F +REG epsg:2117 1 OK -0x1.b536f37004dp16 0x1.b296edbb028d8p17 0x0.0p0 0x1.49beea632f817p7 -0x1.767c048c05f06p5 0x0.0p0 F +REG epsg:2117 2 OK 0x1.bd46de6e009bp19 0x1.b296edbb028d8p17 0x0.0p0 0x1.6494246756c0ap7 -0x1.767c048c05f05p5 0x0.0p0 F +REG epsg:2117 3 OK -0x1.84a02ae32172p17 0x1.45b1ae66bd0fcp20 0x0.0p0 0x1.49beea62e7858p7 -0x1.267c048c6c441p5 0x0.0p0 F +REG epsg:2117 4 OK 0x1.e7c80ab8c85dcp19 0x1.45b1ae66bd0fbp20 0x0.0p0 0x1.649424679ebc8p7 -0x1.267c048c6c441p5 0x0.0p0 F +REG epsg:2118 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.57197530eca85p7 -0x1.52ab3c4d5e6f8p5 0x0.0p0 F +REG epsg:2118 1 OK -0x1.b20a8c87159b4p16 0x1.b1d629d8e631cp17 0x0.0p0 0x1.49926c79be04ap7 -0x1.7aab3c4c3da8ap5 0x0.0p0 F +REG epsg:2118 2 OK 0x1.bce15190e2b36p19 0x1.b1d629d8e631cp17 0x0.0p0 0x1.64a07de81b4bfp7 -0x1.7aab3c4c3da8ap5 0x0.0p0 F +REG epsg:2118 3 OK -0x1.86327fc7da3a8p17 0x1.4597f146a1cc4p20 0x0.0p0 0x1.49926c796ffdfp7 -0x1.2aab3c4ca67dbp5 0x0.0p0 F +REG epsg:2118 4 OK 0x1.e82c9ff1f68eap19 0x1.4597f146a1cc4p20 0x0.0p0 0x1.64a07de86952bp7 -0x1.2aab3c4ca67dbp5 0x0.0p0 F +REG epsg:2119 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5a051eb851eb8p7 -0x1.5582d82d82d82p5 0x0.0p0 F +REG epsg:2119 1 OK -0x1.afdaa4a120524p16 0x1.b151f9d37e4f8p17 0x0.0p0 0x1.4c6a586071179p7 -0x1.7d82d82c55e98p5 0x0.0p0 F +REG epsg:2119 2 OK 0x1.bc9b5494240a4p19 0x1.b151f9d37e4f8p17 0x0.0p0 0x1.679fe51032bf7p7 -0x1.7d82d82c55e98p5 0x0.0p0 F +REG epsg:2119 3 OK -0x1.87476e6a2c364p17 0x1.45862605b4c28p20 0x0.0p0 0x1.4c6a58601eb9bp7 -0x1.2d82d82cc04a5p5 0x0.0p0 F +REG epsg:2119 4 OK 0x1.e871db9a8b0d9p19 0x1.45862605b4c28p20 0x0.0p0 0x1.679fe510851d6p7 -0x1.2d82d82cc04a5p5 0x0.0p0 F +REG epsg:2120 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5b9a98765431fp7 -0x1.4c5b05b05b05ap5 0x0.0p0 F +REG epsg:2120 1 OK -0x1.b6cef654a91a4p16 0x1.b2f82c15113d8p17 0x0.0p0 0x1.4e3e279084c37p7 -0x1.745b05af53b09p5 0x0.0p0 F +REG epsg:2120 2 OK 0x1.bd79deca95234p19 0x1.b2f82c15113d8p17 0x0.0p0 -0x1.6708f6a3dc5fap7 -0x1.745b05af53b09p5 0x0.0p0 F +REG epsg:2120 3 OK -0x1.83d5e0523e5f4p17 0x1.45be9297c784p20 0x0.0p0 0x1.4e3e27903fb44p7 -0x1.245b05afb8a68p5 0x0.0p0 F +REG epsg:2120 4 OK 0x1.e79578148f97dp19 0x1.45be9297c784p20 0x0.0p0 -0x1.6708f6a397506p7 -0x1.245b05afb8a68p5 0x0.0p0 F +REG epsg:2121 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.55f59e26af37bp7 -0x1.5716c16c16c17p5 0x0.0p0 F +REG epsg:2121 1 OK -0x1.aea0ee8b23c3p16 0x1.b10826472239p17 0x0.0p0 0x1.484fba946c20dp7 -0x1.7f16c16ae2e16p5 0x0.0p0 F +REG epsg:2121 2 OK 0x1.bc741dd164796p19 0x1.b10826472239p17 0x0.0p0 0x1.639b81b8f24ebp7 -0x1.7f16c16ae2e16p5 0x0.0p0 F +REG epsg:2121 3 OK -0x1.87e277cd8d33cp17 0x1.457c28b76d532p20 0x0.0p0 0x1.484fba941743ap7 -0x1.2f16c16b4e0e1p5 0x0.0p0 F +REG epsg:2121 4 OK 0x1.e8989df3634e3p19 0x1.457c28b76d531p20 0x0.0p0 0x1.639b81b9472bdp7 -0x1.2f16c16b4e0e2p5 0x0.0p0 F +REG epsg:2122 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.54858bf258bf1p7 -0x1.58e147ae147aep5 0x0.0p0 F +REG epsg:2122 1 OK -0x1.ad3a40d454fb8p16 0x1.b0b3f3209c0f8p17 0x0.0p0 0x1.46d2e76a86351p7 -0x1.80e147acd88cbp5 0x0.0p0 F +REG epsg:2122 2 OK 0x1.bc47481a8a9e8p19 0x1.b0b3f3209c1p17 0x0.0p0 0x1.6238307a2b491p7 -0x1.80e147acd88cbp5 0x0.0p0 F +REG epsg:2122 3 OK -0x1.88939dbfd86a4p17 0x1.4570b868c03dap20 0x0.0p0 0x1.46d2e76a2e6dep7 -0x1.30e147ad44924p5 0x0.0p0 F +REG epsg:2122 4 OK 0x1.e8c4e76ff6195p19 0x1.4570b868c03dap20 0x0.0p0 0x1.6238307a83104p7 -0x1.30e147ad44924p5 0x0.0p0 F +REG epsg:2123 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.513654320fedcp7 -0x1.5fd27d27d27d4p5 0x0.0p0 F +REG epsg:2123 1 OK -0x1.a7b1a65607a1cp16 0x1.af69938970af4p17 0x0.0p0 0x1.4350d79ee0b33p7 -0x1.87d27d267587ep5 0x0.0p0 F +REG epsg:2123 2 OK 0x1.bb9634cac0f44p19 0x1.af69938970af4p17 0x0.0p0 0x1.5f1bd0c53f285p7 -0x1.87d27d267587ep5 0x0.0p0 F +REG epsg:2123 3 OK -0x1.8b4e1a2f50348p17 0x1.45435c9508be8p20 0x0.0p0 0x1.4350d79e7cc53p7 -0x1.37d27d26e42b3p5 0x0.0p0 F +REG epsg:2123 4 OK 0x1.e973868bd40d2p19 0x1.45435c9508be8p20 0x0.0p0 0x1.5f1bd0c5a3165p7 -0x1.37d27d26e42b3p5 0x0.0p0 F +REG epsg:2124 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5974320fedcbdp7 -0x1.5cb97530eca87p5 0x0.0p0 F +REG epsg:2124 1 OK -0x1.aa2f09d3fec48p16 0x1.affdcbc6623acp17 0x0.0p0 0x1.4ba5ad89739fdp7 -0x1.84b9752f9eccdp5 0x0.0p0 F +REG epsg:2124 2 OK 0x1.bbe5e13a7fd7ap19 0x1.affdcbc6623b4p17 0x0.0p0 0x1.6742b69667f7dp7 -0x1.84b9752f9eccdp5 0x0.0p0 F +REG epsg:2124 3 OK -0x1.8a140dd1f1428p17 0x1.4557ce6aae484p20 0x0.0p0 0x1.4ba5ad89154adp7 -0x1.34b975300c69p5 0x0.0p0 F +REG epsg:2124 4 OK 0x1.e92503747c4f7p19 0x1.4557ce6aae486p20 0x0.0p0 0x1.6742b696c64ccp7 -0x1.34b975300c69p5 0x0.0p0 F +REG epsg:2125 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.56b89abcdf01p7 -0x1.5dfd27d27d27dp5 0x0.0p0 F +REG epsg:2125 1 OK -0x1.a92be932fe9dcp16 0x1.afc174105bd4p17 0x0.0p0 0x1.48e0c44dedea9p7 -0x1.85fd27d12934bp5 0x0.0p0 F +REG epsg:2125 2 OK 0x1.bbc57d265fd4cp19 0x1.afc174105bd38p17 0x0.0p0 0x1.6490712bd0177p7 -0x1.85fd27d12934bp5 0x0.0p0 F +REG epsg:2125 3 OK -0x1.8a93c631c6c5p17 0x1.454f80712452ap20 0x0.0p0 0x1.48e0c44d8d55cp7 -0x1.35fd27d19743cp5 0x0.0p0 F +REG epsg:2125 4 OK 0x1.e944f18c71b27p19 0x1.454f80712452ap20 0x0.0p0 0x1.6490712c30ac4p7 -0x1.35fd27d19743cp5 0x0.0p0 F +REG epsg:2126 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.561d4c3b2a19p7 -0x1.63372ea61d952p5 0x0.0p0 F +REG epsg:2126 1 OK -0x1.a4ed693ab2148p16 0x1.aec5b3d16bb0cp17 0x0.0p0 0x1.481e1dd7c3931p7 -0x1.8b372ea4af634p5 0x0.0p0 F +REG epsg:2126 2 OK 0x1.bb3dad2756429p19 0x1.aec5b3d16bb0cp17 0x0.0p0 0x1.641c7a9e909efp7 -0x1.8b372ea4af634p5 0x0.0p0 F +REG epsg:2126 3 OK -0x1.8caa9e68e55ap17 0x1.452c93483500cp20 0x0.0p0 0x1.481e1dd759298p7 -0x1.3b372ea51edb2p5 0x0.0p0 F +REG epsg:2126 4 OK 0x1.e9caa79a39568p19 0x1.452c93483500cp20 0x0.0p0 0x1.641c7a9efb088p7 -0x1.3b372ea51edb2p5 0x0.0p0 F +REG epsg:2127 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.52ef5c28f5c29p7 -0x1.65e147ae147aep5 0x0.0p0 F +REG epsg:2127 1 OK -0x1.a2b9bfc523048p16 0x1.ae43e5bddd5f4p17 0x0.0p0 0x1.44db9a3db3aadp7 -0x1.8de147ac98394p5 0x0.0p0 F +REG epsg:2127 2 OK 0x1.baf737f8a4609p19 0x1.ae43e5bddd5f4p17 0x0.0p0 0x1.61031e1437da5p7 -0x1.8de147ac98394p5 0x0.0p0 F +REG epsg:2127 3 OK -0x1.8dbfa8daa13ecp17 0x1.451a636ebb6edp20 0x0.0p0 0x1.44db9a3d43e3ap7 -0x1.3de147ad081abp5 0x0.0p0 F +REG epsg:2127 4 OK 0x1.ea0fea36a84fbp19 0x1.451a636ebb6edp20 0x0.0p0 0x1.61031e14a7a18p7 -0x1.3de147ad081abp5 0x0.0p0 F +REG epsg:2128 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.50cc16c16c16cp7 -0x1.690fedcba9877p5 0x0.0p0 F +REG epsg:2128 1 OK -0x1.a00f9b6d2f96p16 0x1.ada7895296ap17 0x0.0p0 0x1.429f48738bff1p7 -0x1.910fedca1bd9cp5 0x0.0p0 F +REG epsg:2128 2 OK 0x1.baa1f36da5f2cp19 0x1.ada7895296ap17 0x0.0p0 0x1.5ef8e50f4c2e8p7 -0x1.910fedca1bd9cp5 0x0.0p0 F +REG epsg:2128 3 OK -0x1.8f0e8aa040d7p17 0x1.4504511bc0b08p20 0x0.0p0 0x1.429f487315781p7 -0x1.410fedca8bea5p5 0x0.0p0 F +REG epsg:2128 4 OK 0x1.ea63a2a81035cp19 0x1.4504511bc0b08p20 0x0.0p0 0x1.5ef8e50fc2b57p7 -0x1.410fedca8bea5p5 0x0.0p0 F +REG epsg:2129 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.4f7a2b3c4d5e7p7 -0x1.6c82468acf135p5 0x0.0p0 F +REG epsg:2129 1 OK -0x1.9d217db12150cp16 0x1.acfc832a1a76cp17 0x0.0p0 0x1.4131a313f80c4p7 -0x1.948246892dbadp5 0x0.0p0 F +REG epsg:2129 2 OK 0x1.ba442fb6242b2p19 0x1.acfc832a1a764p17 0x0.0p0 0x1.5dc2b364a2b0bp7 -0x1.948246892dbadp5 0x0.0p0 F +REG epsg:2129 3 OK -0x1.907e4c8b0e8b4p17 0x1.44ebf7b538f4p20 0x0.0p0 0x1.4131a31379c27p7 -0x1.448246899d933p5 0x0.0p0 F +REG epsg:2129 4 OK 0x1.eabf9322c3a3fp19 0x1.44ebf7b538f3fp20 0x0.0p0 0x1.5dc2b36520fa7p7 -0x1.448246899d934p5 0x0.0p0 F +REG epsg:21291 0 OK 0x1.8675a49bf7286p18 -0x1.a2f8a2f9fe42ep8 0x1.154282676p7 -0x1.f000000000002p5 0x1.2f74bf1dcfcaep-60 -0x1.0p-30 T +REG epsg:21291 1 OK -0x1.2ede8af009f5cp17 -0x1.0f0f48c65e341p19 0x1.7d406dd218p7 -0x1.0bffffffe1e8p6 -0x1.3fffffffea3ddp2 0x1.0p-28 F +REG epsg:21291 2 OK 0x1.d22d47208c79fp19 -0x1.0f0f48c544017p19 0x1.4261c5e78p7 -0x1.c80000003bf85p5 -0x1.3fffffffea54ep2 -0x1.8p-29 F +REG epsg:21291 3 OK -0x1.2ee1bd12a6af4p17 0x1.0ea68b8219009p19 0x1.d63480c77p6 -0x1.0bffffffe1e59p6 0x1.3fffffffea45bp2 0x1.0p-28 F +REG epsg:21291 4 OK 0x1.d22e1389655bfp19 0x1.0ea68b80ffa27p19 0x1.6076d7f2p6 -0x1.c80000003bfd4p5 0x1.3fffffffea5cap2 -0x1.cp-28 F +REG epsg:21292 0 OK 0x1.d1efd92c8ba11p14 0x1.23c30dfba5c91p16 0x1.7a90c53cep5 -0x1.dc7a4fa4fa4f8p5 0x1.a5a4fa4fa4fa7p3 -0x1.8p-29 F +REG epsg:21292 1 OK -0x1.061990ad06ce2p19 -0x1.cf9fc28969bd6p18 0x1.6c7a58dcbp6 -0x1.02c7984b40461p6 0x1.05a4fa4f91172p3 0x1.8p-28 F +REG epsg:21292 2 OK 0x1.23388dfe6982ep19 -0x1.cf9fc28d6fe74p18 0x1.d9c015af8p5 -0x1.b3656eb373da7p5 0x1.05a4fa4f912d4p3 -0x1.4p-27 F +REG epsg:21292 3 OK -0x1.f604dce359e6ep18 0x1.3657fb6460af4p19 0x1.2479a48e2p5 -0x1.02c7984b5bde9p6 0x1.22d27d27c0a51p4 -0x1.0p-29 F +REG epsg:21292 4 OK 0x1.18216bb61330ap19 0x1.3657fb60a3dbcp19 0x1.7c1aecd8p2 -0x1.b3656eb33cdf7p5 0x1.22d27d27c0b88p4 0x0.0p0 F +REG epsg:2130 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5541b4e81b4e7p7 -0x1.6e87654320feep5 0x0.0p0 F +REG epsg:2130 1 OK -0x1.9b6445685dcdp16 0x1.ac9774f54b958p17 0x0.0p0 0x1.46e8a1663a63dp7 -0x1.9687654173b9ep5 0x0.0p0 F +REG epsg:2130 2 OK 0x1.ba0c88ad0bb9ap19 0x1.ac9774f54b958p17 0x0.0p0 0x1.639ac869fc391p7 -0x1.9687654173b9ep5 0x0.0p0 F +REG epsg:2130 3 OK -0x1.915854c503478p17 0x1.44dd7a0a8974ap20 0x0.0p0 0x1.46e8a165b751dp7 -0x1.46876541e3385p5 0x0.0p0 F +REG epsg:2130 4 OK 0x1.eaf6153140d1ep19 0x1.44dd7a0a8974ap20 0x0.0p0 0x1.639ac86a7f4bp7 -0x1.46876541e3385p5 0x0.0p0 F +REG epsg:2131 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5490a3d70a3d7p7 -0x1.6ee41fdb97532p5 0x0.0p0 F +REG epsg:2131 1 OK -0x1.9affc7e49e89p16 0x1.ac90e1f1e906cp17 0x0.0p0 0x1.463492ddbfcd7p7 -0x1.96e41fd9e7e29p5 0x0.0p0 F +REG epsg:2131 2 OK 0x1.b9fff8fc93d12p19 0x1.ac90e1f1e906cp17 0x0.0p0 0x1.62ecb4d054ad7p7 -0x1.96e41fd9e7e29p5 0x0.0p0 F +REG epsg:2131 3 OK -0x1.917383f0a29dcp17 0x1.44d988bfc9e06p20 0x0.0p0 0x1.463492dd3bdb2p7 -0x1.46e41fda574c4p5 0x0.0p0 F +REG epsg:2131 4 OK 0x1.eafce0fc28a77p19 0x1.44d988bfc9e06p20 0x0.0p0 0x1.62ecb4d0d89fdp7 -0x1.46e41fda574c4p5 0x0.0p0 F +REG epsg:2132 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.50af8091a2b3dp7 -0x1.74ccccccccccdp5 0x0.0p0 F +REG epsg:2132 1 OK -0x1.95e2ca474dddp16 0x1.ab59bfb5ee1c4p17 0x0.0p0 0x1.4221a1625de5ap7 -0x1.9ccccccaf890ep5 0x0.0p0 F +REG epsg:2132 2 OK 0x1.b95c5948e9bbap19 0x1.ab59bfb5ee1c4p17 0x0.0p0 0x1.5f3d5fc0e7821p7 -0x1.9ccccccaf890ep5 0x0.0p0 F +REG epsg:2132 3 OK -0x1.9409619b5d26cp17 0x1.44af692d88dc6p20 0x0.0p0 0x1.4221a161cac53p7 -0x1.4ccccccb65c78p5 0x0.0p0 F +REG epsg:2132 4 OK 0x1.eba25866d749bp19 0x1.44af692d88dc6p20 0x0.0p0 0x1.5f3d5fc17aa28p7 -0x1.4ccccccb65c78p5 0x0.0p0 F +REG epsg:2133 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.4ap7 -0x1.9p4 0x0.0p0 F +REG epsg:2133 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2133 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2133 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2133 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2134 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:2134 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2134 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2134 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2134 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2135 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.62p7 -0x1.9p4 0x0.0p0 F +REG epsg:2135 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2135 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2135 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2135 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2136 0 OK 0x1.b7684e4e0da7fp19 -0x1.fd9451ae0520cp9 0x1.5834140bp3 -0x1.0p0 0x1.2aaaaaaaaaaaap2 0x0.0p0 F +REG epsg:2136 1 OK -0x1.c81f20992675dp19 -0x1.bb1a88c10a0ccp20 0x1.412205256p5 -0x1.81107a2be1365p2 -0x1.555555553cc5fp-2 0x0.0p0 T +REG epsg:2136 2 OK 0x1.4dbbef44e7d6ap21 -0x1.bb1a88c104bc2p20 0x1.193aa1e66p5 0x1.01107a2be18ap2 -0x1.555555553cca5p-2 0x0.0p0 T +REG epsg:2136 3 OK -0x1.bb729fb89d0abp19 0x1.bdce426aec912p20 -0x1.c204ffd48p3 -0x1.81107a2c98eaap2 0x1.3555555542434p3 -0x1.8p-29 F +REG epsg:2136 4 OK 0x1.4a90cf0a14531p21 0x1.bdce426a5d34bp20 -0x1.2fafaf024p4 0x1.01107a2c9921fp2 0x1.3555555542466p3 -0x1.8p-29 F +REG epsg:2137 0 OK 0x1.e840df538e11ap18 -0x1.41de8d51ff90ap8 0x1.244a9404cp5 -0x1.0p0 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:2137 1 OK -0x1.ada2c16733c1p15 -0x1.0f0b316d4a575p19 0x1.0b33c0475p6 -0x1.7ffffffe257d3p2 -0x1.3fffffffea97dp2 -0x1.0p-30 F +REG epsg:2137 2 OK 0x1.018d85b00b1cdp20 -0x1.0f0b316d1b61bp19 0x1.eec882b6ap5 0x1.fffffffc4b8ecp1 -0x1.3fffffffea9bdp2 -0x1.8p-28 F +REG epsg:2137 3 OK -0x1.adac92c0244bp15 0x1.0ebaba77715d1p19 0x1.557a0c67p3 -0x1.7ffffffe255f4p2 0x1.3fffffffea9ddp2 -0x1.0p-30 F +REG epsg:2137 4 OK 0x1.018dd438c46ap20 0x1.0ebaba7742828p19 0x1.6dfb7207p2 0x1.fffffffc4b53p1 0x1.3fffffffeaa1ap2 -0x1.4p-28 F +REG epsg:2138 0 OK 0x0.0p0 0x1.b11f4b13029bdp19 0x0.0p0 -0x1.12p6 0x1.9fffffffffb6bp5 0x0.0p0 F +REG epsg:2138 1 OK -0x1.0b3ba5eb1ae96p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.27fffffffffd6p5 0x0.0p0 F +REG epsg:2138 2 OK 0x1.0b3ba5eb1ae97p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.611672e32a5cdp5 0x1.27fffffffffd6p5 0x0.0p0 F +REG epsg:2138 3 OK -0x1.053679725c65fp20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff5p6 0x0.0p0 F +REG epsg:2138 4 OK 0x1.053679725c66p20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.611672e32a5cdp5 0x1.0bffffffffff5p6 0x0.0p0 F +REG epsg:2139 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG epsg:2139 1 OK -0x1.e8f08b04c4de4p17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2139 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2139 3 OK -0x1.e8f08b04c4de4p17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2139 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2140 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG epsg:2140 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2140 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2140 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2140 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2141 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2141 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2141 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2141 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2141 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:21413 0 OK 0x1.9bfd2e7228d73p23 0x1.4932b508d762dp6 0x1.28672dc5ap5 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:21413 1 OK 0x1.8b0bc25dbbf05p23 -0x1.0ef4690a83657p19 0x1.7f5f42c8p4 0x1.180000001d496p6 -0x1.3fffffffeae78p2 0x0.0p0 F +REG epsg:21413 2 OK 0x1.acee9a8818282p23 -0x1.0ef4690add843p19 0x1.0c66594a2p5 0x1.3fffffffe2adbp6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:21413 3 OK 0x1.8b0bc4e04248bp23 0x1.0f08fc09ec9cap19 0x1.32733b214p5 0x1.180000001d49p6 0x1.3fffffffeae6p2 -0x1.8p-29 F +REG epsg:21413 4 OK 0x1.acee9805713fdp23 0x1.0f08fc0a46c8cp19 0x1.7f29e7a54p5 0x1.3fffffffe2ae2p6 0x1.3fffffffeadecp2 -0x1.0p-29 F +REG epsg:21414 0 OK 0x1.ba818f8473b2ap23 0x1.4932a4157555ep6 0x1.50397eb48p5 0x1.44p6 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:21414 1 OK 0x1.a990244d14969p23 -0x1.0ef45b0e0dd3ep19 0x1.e3e48b748p4 0x1.300000001d4acp6 -0x1.3fffffffeae68p2 -0x1.0p-29 F +REG epsg:21414 2 OK 0x1.cb72fabce9132p23 -0x1.0ef45b0e4eb7cp19 0x1.292d7ea74p5 0x1.57ffffffe2aefp6 -0x1.3fffffffeae15p2 0x1.0p-30 F +REG epsg:21414 3 OK 0x1.a99026cf9f1b4p23 0x1.0f08ee0c69f9ep19 0x1.64b5d8026p5 0x1.300000001d4a3p6 0x1.3fffffffeae54p2 -0x1.8p-29 F +REG epsg:21414 4 OK 0x1.cb72f83a471cdp23 0x1.0f08ee0caae74p19 0x1.9bf108bd6p5 0x1.57ffffffe2af7p6 0x1.3fffffffeadfep2 -0x1.0p-29 F +REG epsg:21415 0 OK 0x1.d905efb7bb014p23 0x1.493298bafec32p6 0x1.6ae58599p5 0x1.5cp6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:21415 1 OK 0x1.c814851457944p23 -0x1.0ef451afed098p19 0x1.1775a444ap5 0x1.480000001d4cp6 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:21415 2 OK 0x1.e9f75a5bc5711p23 -0x1.0ef451b013fadp19 0x1.389a77718p5 0x1.6fffffffe2b04p6 -0x1.3fffffffeae27p2 -0x1.0p-29 F +REG epsg:21415 3 OK 0x1.c8148796e686ep23 0x1.0f08e4ad94f84p19 0x1.8a3930fcp5 0x1.480000001d4b8p6 0x1.3fffffffeae41p2 -0x1.0p-29 F +REG epsg:21415 4 OK 0x1.e9f757d9286cfp23 0x1.0f08e4adbbef6p19 0x1.ab5dff3dcp5 0x1.6fffffffe2b0dp6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:21416 0 OK 0x1.f78a4f652e38ap23 0x1.493293194a84bp6 0x1.782074a24p5 0x1.7400000000001p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:21416 1 OK 0x1.e698e50b15689p23 -0x1.0ef44d0a664e3p19 0x1.2fd08771cp5 0x1.600000001d4d2p6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:21416 2 OK 0x1.043ddcdfbe75dp24 -0x1.0ef44d0a72decp19 0x1.3a82006b6p5 0x1.87ffffffe2b1ap6 -0x1.3fffffffeae38p2 -0x1.0p-29 F +REG epsg:21416 3 OK 0x1.e698e78da8fe3p23 0x1.0f08e007b4d96p19 0x1.a294108c4p5 0x1.600000001d4ccp6 0x1.3fffffffeae31p2 -0x1.0p-30 F +REG epsg:21416 4 OK 0x1.043ddb9e72661p24 0x1.0f08e007c16bbp19 0x1.ad4587ef8p5 0x1.87ffffffe2b22p6 0x1.3fffffffeae1cp2 0x1.0p-30 F +REG epsg:21417 0 OK 0x1.0b075773ba077p24 0x1.4932934023b0cp6 0x1.77c530ddp5 0x1.8cp6 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:21417 1 OK 0x1.028ea24593a3bp24 -0x1.0ef44d2a81846p19 0x1.3abea0f44p5 0x1.780000001d4e8p6 -0x1.3fffffffeae38p2 -0x1.8p-29 F +REG epsg:21417 2 OK 0x1.13800ca1c27fcp24 -0x1.0ef44d2a73908p19 0x1.2edec23fp5 0x1.9fffffffe2b2ep6 -0x1.3fffffffeae48p2 -0x1.8p-29 F +REG epsg:21417 3 OK 0x1.028ea386dfd4p24 0x1.0f08e027d27a4p19 0x1.ad82286f2p5 0x1.780000001d4e1p6 0x1.3fffffffeae1dp2 -0x1.8p-29 F +REG epsg:21417 4 OK 0x1.13800b6078d4ap24 0x1.0f08e027c4845p19 0x1.a1a24b7cep5 0x1.9fffffffe2b36p6 0x1.3fffffffeae3p2 -0x1.8p-29 F +REG epsg:21418 0 OK 0x1.1a49874cd625fp24 0x1.4932992f1d556p6 0x1.69d4ba3ecp5 0x1.a400000000001p6 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:21418 1 OK 0x1.11d0d1f7d9948p24 -0x1.0ef4520fe4a1fp19 0x1.382149482p5 0x1.900000001d4fep6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:21418 2 OK 0x1.22c23ca17c449p24 -0x1.0ef4520fbc515p19 0x1.15d16078ep5 0x1.b7ffffffe2b44p6 -0x1.3fffffffeae5ap2 -0x1.8p-29 F +REG epsg:21418 3 OK 0x1.11d0d3392837ap24 0x1.0f08e50d93c9fp19 0x1.aae4d1264p5 0x1.900000001d4f6p6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:21418 4 OK 0x1.22c23b6034e9bp24 0x1.0f08e50d6b734p19 0x1.8894ed6e8p5 0x1.b7ffffffe2b4cp6 0x1.3fffffffeae44p2 -0x1.0p-29 F +REG epsg:21419 0 OK 0x1.298bb76b3823p24 0x1.4932a4d593a99p6 0x1.4e7628d8ap5 0x1.bc00000000002p6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:21419 1 OK 0x1.211301ca161b6p24 -0x1.0ef45bacd4acap19 0x1.27ffd5a78p5 0x1.a80000001d513p6 -0x1.3fffffffeae13p2 -0x1.0p-30 F +REG epsg:21419 2 OK 0x1.32046d0bcc27fp24 -0x1.0ef45bac92713p19 0x1.df403c038p4 0x1.cfffffffe2b59p6 -0x1.3fffffffeae67p2 -0x1.0p-30 F +REG epsg:21419 3 OK 0x1.2113030b6737cp24 0x1.0f08eeab3cc5ep19 0x1.9ac35feacp5 0x1.a80000001d50ap6 0x1.3fffffffeadfbp2 -0x1.0p-30 F +REG epsg:21419 4 OK 0x1.32046bca87026p24 0x1.0f08eeaafa80cp19 0x1.6263b0a1ep5 0x1.cfffffffe2b5fp6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG epsg:2142 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:2142 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2142 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2142 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2142 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:21420 0 OK 0x1.38cde7fb6a6c6p24 0x1.4932b612dab14p6 0x1.25f63f382p5 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:21420 1 OK 0x1.305531e9a92fp24 -0x1.0ef469e65c37p19 0x1.0a87837cap5 0x1.c00000001d526p6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:21420 2 OK 0x1.41469e0c67ad5p24 -0x1.0ef469e600cc6p19 0x1.796c30384p4 0x1.e7ffffffe2b6cp6 -0x1.3fffffffeae79p2 0x0.0p0 F +REG epsg:21420 3 OK 0x1.3055332afcc43p24 0x1.0f08fce5d5fa4p19 0x1.7d4b121fp5 0x1.c00000001d51fp6 0x1.3fffffffeade7p2 0x1.0p-29 F +REG epsg:21420 4 OK 0x1.41469ccb249c2p24 0x1.0f08fce57a822p19 0x1.2f79b24a4p5 0x1.e7ffffffe2b73p6 0x1.3fffffffeae62p2 -0x1.8p-29 F +REG epsg:21421 0 OK 0x1.48101928b84d9p24 0x1.4932ccb699d49p6 0x1.e18d26578p4 0x1.ec00000000001p6 0x0.0p0 0x1.8p-29 T +REG epsg:21421 1 OK 0x1.3f97628319ed1p24 -0x1.0ef47c9496f2dp19 0x1.c015f3098p4 0x1.d80000001d53bp6 -0x1.3fffffffeadefp2 0x0.0p0 F +REG epsg:21421 2 OK 0x1.5088cfcd5ee82p24 -0x1.0ef47c94235b9p19 0x1.f688682ap3 0x1.ffffffffe2b7ep6 -0x1.3fffffffeae89p2 -0x1.0p-30 F +REG epsg:21421 3 OK 0x1.3f9763c46ff3ap24 0x1.0f090f9578196p19 0x1.52ce8e754p5 0x1.d80000001d534p6 0x1.3fffffffeadd9p2 0x1.0p-28 F +REG epsg:21421 4 OK 0x1.5088ce8c1dc46p24 0x1.0f090f950470fp19 0x1.e0cb7b294p4 0x1.ffffffffe2b85p6 0x1.3fffffffeae7p2 -0x1.0p-28 F +REG epsg:21422 0 OK 0x1.57524b1cb4891p24 0x1.4932e88153656p6 0x1.5ef89e878p4 0x1.0200000000001p7 0x1.2f74bf1dcfcacp-62 0x1.8p-29 T +REG epsg:21422 1 OK 0x1.4ed993c199be5p24 -0x1.0ef4938321848p19 0x1.5202c022cp4 0x1.f00000001d54cp6 -0x1.3fffffffeade6p2 0x0.0p0 F +REG epsg:21422 2 OK 0x1.5fcb0276a6881p24 -0x1.0ef4938297073p19 0x1.98a86546p2 0x1.0bfffffff15c8p7 -0x1.3fffffffeae97p2 -0x1.0p-28 F +REG epsg:21422 3 OK 0x1.4ed99502f227fp24 0x1.0f092685bbd78p19 0x1.1bc4fd2c6p5 0x1.f00000001d547p6 0x1.3fffffffeadcap2 0x1.0p-30 F +REG epsg:21422 4 OK 0x1.5fcb013567257p24 0x1.0f0926853145bp19 0x1.4bb176864p4 0x1.0bfffffff15ccp7 0x1.3fffffffeae7fp2 -0x1.8p-29 F +REG epsg:21423 0 OK 0x1.66947dfec4c3ep24 0x1.49330925169afp6 0x1.8b3a4237p3 0x1.0ep7 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:21423 1 OK 0x1.5e1bc5ce8b37ep24 -0x1.0ef4ae71ac5e7p19 0x1.98144ba28p3 0x1.040000000eaaep7 -0x1.3fffffffeadd6p2 0x1.0p-30 F +REG epsg:21423 2 OK 0x1.6f0d362da7cdp24 -0x1.0ef4ae710c828p19 -0x1.10ffcd26p2 0x1.17fffffff15cep7 -0x1.3fffffffeaea5p2 -0x1.8p-29 F +REG epsg:21423 3 OK 0x1.5e1bc70fe5efap24 0x1.0f0941764cd2p19 0x1.b19173e84p4 0x1.040000000eaacp7 0x1.3fffffffeadbcp2 0x1.8p-29 F +REG epsg:21423 4 OK 0x1.6f0d34ec69fa4p24 0x1.0f094175acde7p19 0x1.428f06688p3 0x1.17fffffff15d1p7 0x1.3fffffffeae8dp2 -0x1.0p-29 F +REG epsg:2143 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG epsg:2143 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2143 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2143 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2143 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2144 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG epsg:2144 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2144 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2144 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2144 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2145 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG epsg:2145 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2145 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2145 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2145 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:21453 0 OK 0x1.e855ce451ae59p18 0x1.4932b508d762dp6 0x1.28672dc5ap5 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:21453 1 OK -0x1.aebda2440fa9p15 -0x1.0ef4690a83657p19 0x1.7f5f42c8p4 0x1.180000001d497p6 -0x1.3fffffffeae79p2 -0x1.0p-30 F +REG epsg:21453 2 OK 0x1.01a0d440c1411p20 -0x1.0ef4690add843p19 0x1.0c66594a2p5 0x1.3fffffffe2adbp6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:21453 3 OK -0x1.aebb1fbdb756p15 0x1.0f08fc09ec9cap19 0x1.32733b214p5 0x1.180000001d48fp6 0x1.3fffffffeae6p2 -0x1.0p-29 F +REG epsg:21453 4 OK 0x1.01a0c02b89feap20 0x1.0f08fc0a46c8cp19 0x1.7f29e7a54p5 0x1.3fffffffe2ae2p6 0x1.3fffffffeadecp2 -0x1.0p-29 F +REG epsg:21454 0 OK 0x1.e851f08e76535p18 0x1.4932a4157555ep6 0x1.50397eb48p5 0x1.44p6 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:21454 1 OK -0x1.aedbb2eb6973p15 -0x1.0ef45b0e0dd3ep19 0x1.e3e48b748p4 0x1.300000001d4abp6 -0x1.3fffffffeae69p2 -0x1.8p-29 F +REG epsg:21454 2 OK 0x1.019fd5e748992p20 -0x1.0ef45b0e4eb7cp19 0x1.292d7ea74p5 0x1.57ffffffe2aefp6 -0x1.3fffffffeae15p2 0x1.0p-30 F +REG epsg:21454 3 OK -0x1.aed93060e4b9p15 0x1.0f08ee0c69f9ep19 0x1.64b5d8026p5 0x1.300000001d4a3p6 0x1.3fffffffeae54p2 -0x1.8p-29 F +REG epsg:21454 4 OK 0x1.019fc1d238e66p20 0x1.0f08ee0caae74p19 0x1.9bf108bd6p5 0x1.57ffffffe2af7p6 0x1.3fffffffeadfep2 -0x1.0p-29 F +REG epsg:21455 0 OK 0x1.e84df6f760283p18 0x1.493298bafec32p6 0x1.6ae58599p5 0x1.5cp6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:21455 1 OK -0x1.aefaeba86bc5p15 -0x1.0ef451afed098p19 0x1.1775a444ap5 0x1.480000001d4cp6 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:21455 2 OK 0x1.019ed2de2b88cp20 -0x1.0ef451b013fadp19 0x1.389a77718p5 0x1.6fffffffe2b05p6 -0x1.3fffffffeae27p2 -0x1.0p-29 F +REG epsg:21455 3 OK -0x1.aef869197927p15 0x1.0f08e4ad94f84p19 0x1.8a3930fcp5 0x1.480000001d4b7p6 0x1.3fffffffeae41p2 -0x1.0p-29 F +REG epsg:21455 4 OK 0x1.019ebec94367ap20 0x1.0f08e4adbbef6p19 0x1.ab5dff3dcp5 0x1.6fffffffe2b0dp6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:21456 0 OK 0x1.e849eca5c7142p18 0x1.493293194a84bp6 0x1.782074a24p5 0x1.7400000000001p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:21456 1 OK -0x1.af1af4ea976bp15 -0x1.0ef44d0a664e3p19 0x1.2fd08771cp5 0x1.600000001d4d3p6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:21456 2 OK 0x1.019dcdfbe75d2p20 -0x1.0ef44d0a72decp19 0x1.3a82006b6p5 0x1.87ffffffe2b1ap6 -0x1.3fffffffeae38p2 -0x1.0p-29 F +REG epsg:21456 3 OK -0x1.af18725701d7p15 0x1.0f08e007b4d96p19 0x1.a294108c4p5 0x1.600000001d4cbp6 0x1.3fffffffeae31p2 -0x1.0p-30 F +REG epsg:21456 4 OK 0x1.019db9e72660ep20 0x1.0f08e007c16bbp19 0x1.ad4587ef8p5 0x1.87ffffffe2b22p6 0x1.3fffffffeae1cp2 0x1.0p-30 F +REG epsg:21457 0 OK 0x1.e845dcee81dcfp18 0x1.4932934023b0cp6 0x1.77c530ddp5 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:21457 1 OK -0x1.af3b74d8b893p15 -0x1.0ef44d2a81846p19 0x1.3abea0f44p5 0x1.780000001d4e9p6 -0x1.3fffffffeae38p2 -0x1.8p-29 F +REG epsg:21457 2 OK 0x1.019cca1c27fc6p20 -0x1.0ef44d2a73908p19 0x1.2edec23fp5 0x1.9fffffffe2b2fp6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:21457 3 OK -0x1.af38f24057f8p15 0x1.0f08e027d27a4p19 0x1.ad82286f2p5 0x1.780000001d4e2p6 0x1.3fffffffeae1dp2 -0x1.8p-29 F +REG epsg:21457 4 OK 0x1.019cb6078d4a2p20 0x1.0f08e027c4845p19 0x1.a1a24b7cep5 0x1.9fffffffe2b36p6 0x1.3fffffffeae3p2 -0x1.8p-29 F +REG epsg:21458 0 OK 0x1.e841d335897bcp18 0x1.4932992f1d556p6 0x1.69d4ba3ecp5 0x1.a400000000001p6 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:21458 1 OK -0x1.af5c104cd6f7p15 -0x1.0ef4520fe4a1fp19 0x1.382149482p5 0x1.900000001d4fep6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:21458 2 OK 0x1.019bca17c448ep20 -0x1.0ef4520fbc515p19 0x1.15d16078ep5 0x1.b7ffffffe2b44p6 -0x1.3fffffffeae5ap2 -0x1.8p-29 F +REG epsg:21458 3 OK -0x1.af598daf90b7p15 0x1.0f08e50d93c9fp19 0x1.aae4d1264p5 0x1.900000001d4f6p6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:21458 4 OK 0x1.019bb6034e9aap20 0x1.0f08e50d6b734p19 0x1.8894ed6e8p5 0x1.b7ffffffe2b4bp6 0x1.3fffffffeae44p2 -0x1.8p-29 F +REG epsg:21459 0 OK 0x1.e83ddace08beap18 0x1.4932a4d593a99p6 0x1.4e7628d8ap5 0x1.bcp6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:21459 1 OK -0x1.af7c6bd3c943p15 -0x1.0ef45bacd4acap19 0x1.27ffd5a78p5 0x1.a80000001d512p6 -0x1.3fffffffeae14p2 -0x1.0p-29 F +REG epsg:21459 2 OK 0x1.019ad0bcc27e9p20 -0x1.0ef45bac92713p19 0x1.df403c038p4 0x1.cfffffffe2b57p6 -0x1.3fffffffeae67p2 -0x1.0p-30 F +REG epsg:21459 3 OK -0x1.af79e9319076p15 0x1.0f08eeab3cc5ep19 0x1.9ac35feacp5 0x1.a80000001d50bp6 0x1.3fffffffeadfap2 0x0.0p0 F +REG epsg:21459 4 OK 0x1.019abca870266p20 0x1.0f08eeaafa80cp19 0x1.6263b0a1ep5 0x1.cfffffffe2b6p6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG epsg:2146 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG epsg:2146 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2146 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2146 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2146 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:21460 0 OK 0x1.e839feda9b172p18 0x1.4932b612dab14p6 0x1.25f63f382p5 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:21460 1 OK -0x1.af9c2cada1f1p15 -0x1.0ef469e65c37p19 0x1.0a87837cap5 0x1.c00000001d527p6 -0x1.3fffffffeae02p2 0x0.0p0 F +REG epsg:21460 2 OK 0x1.0199e0c67ad4ap20 -0x1.0ef469e600cc6p19 0x1.796c30384p4 0x1.e7ffffffe2b68p6 -0x1.3fffffffeae7ap2 0x0.0p0 F +REG epsg:21460 3 OK -0x1.af99aa067795p15 0x1.0f08fce5d5fa4p19 0x1.7d4b121fp5 0x1.c00000001d52p6 0x1.3fffffffeade7p2 0x1.0p-29 F +REG epsg:21460 4 OK 0x1.0199ccb249c19p20 0x1.0f08fce57a822p19 0x1.2f79b24a4p5 0x1.e7ffffffe2b6fp6 0x1.3fffffffeae62p2 -0x1.8p-29 F +REG epsg:21461 0 OK 0x1.e8364a2e13638p18 0x1.4932ccb699d49p6 0x1.e18d26578p4 0x1.ec00000000001p6 0x0.0p0 0x1.8p-29 T +REG epsg:21461 1 OK -0x1.afbaf9cc25d1p15 -0x1.0ef47c9496f2dp19 0x1.c015f3098p4 0x1.d80000001d53bp6 -0x1.3fffffffeadf1p2 0x0.0p0 F +REG epsg:21461 2 OK 0x1.0198fcd5ee81ep20 -0x1.0ef47c94235b9p19 0x1.f688682ap3 0x1.ffffffffe2b7cp6 -0x1.3fffffffeae89p2 -0x1.0p-30 F +REG epsg:21461 3 OK -0x1.afb8772018bbp15 0x1.0f090f9578196p19 0x1.52ce8e754p5 0x1.d80000001d534p6 0x1.3fffffffeadd9p2 0x1.0p-28 F +REG epsg:21461 4 OK 0x1.0198e8c1dc45cp20 0x1.0f090f950470fp19 0x1.e0cb7b294p4 0x1.ffffffffe2b85p6 0x1.3fffffffeae7p2 -0x1.0p-28 F +REG epsg:21462 0 OK 0x1.e832c72d2242p18 0x1.4932e88153656p6 0x1.5ef89e878p4 0x1.02p7 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:21462 1 OK -0x1.afd87ccc8365p15 -0x1.0ef4938321848p19 0x1.5202c022cp4 0x1.f00000001d54cp6 -0x1.3fffffffeade6p2 0x0.0p0 F +REG epsg:21462 2 OK 0x1.0198276a68814p20 -0x1.0ef4938297073p19 0x1.98a86546p2 0x1.0bfffffff15c8p7 -0x1.3fffffffeae95p2 -0x1.0p-28 F +REG epsg:21462 3 OK -0x1.afd5fa1bb024p15 0x1.0f092685bbd78p19 0x1.1bc4fd2c6p5 0x1.f00000001d547p6 0x1.3fffffffeadcap2 0x1.0p-30 F +REG epsg:21462 4 OK 0x1.0198135672572p20 0x1.0f0926853145bp19 0x1.4bb176864p4 0x1.0bfffffff15ccp7 0x1.3fffffffeae7fp2 -0x1.8p-29 F +REG epsg:21463 0 OK 0x1.e82f7fb130f6cp18 0x1.49330925169afp6 0x1.8b3a4237p3 0x1.0ep7 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:21463 1 OK -0x1.aff462e99037p15 -0x1.0ef4ae71ac5e7p19 0x1.98144ba28p3 0x1.040000000eabp7 -0x1.3fffffffeadd6p2 0x1.0p-29 F +REG epsg:21463 2 OK 0x1.019762da7ccfep20 -0x1.0ef4ae710c828p19 -0x1.10ffcd26p2 0x1.17fffffff15cep7 -0x1.3fffffffeaea5p2 -0x1.8p-29 F +REG epsg:21463 3 OK -0x1.aff1e03420b7p15 0x1.0f0941764cd2p19 0x1.b19173e84p4 0x1.040000000eaadp7 0x1.3fffffffeadbcp2 0x1.8p-29 F +REG epsg:21463 4 OK 0x1.01974ec69fa48p20 0x1.0f094175acde7p19 0x1.428f06688p3 0x1.17fffffff15d2p7 0x1.3fffffffeae8dp2 -0x1.0p-29 F +REG epsg:2147 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG epsg:2147 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2147 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2147 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2147 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:21473 0 OK 0x1.e855ce451ae59p18 0x1.4932b508d762dp6 0x1.28672dc5ap5 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:21473 1 OK -0x1.aebda2440fa9p15 -0x1.0ef4690a83657p19 0x1.7f5f42c8p4 0x1.180000001d497p6 -0x1.3fffffffeae79p2 -0x1.0p-30 F +REG epsg:21473 2 OK 0x1.01a0d440c1411p20 -0x1.0ef4690add843p19 0x1.0c66594a2p5 0x1.3fffffffe2adbp6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:21473 3 OK -0x1.aebb1fbdb756p15 0x1.0f08fc09ec9cap19 0x1.32733b214p5 0x1.180000001d48fp6 0x1.3fffffffeae6p2 -0x1.0p-29 F +REG epsg:21473 4 OK 0x1.01a0c02b89feap20 0x1.0f08fc0a46c8cp19 0x1.7f29e7a54p5 0x1.3fffffffe2ae2p6 0x1.3fffffffeadecp2 -0x1.0p-29 F +REG epsg:21474 0 OK 0x1.e851f08e76535p18 0x1.4932a4157555ep6 0x1.50397eb48p5 0x1.44p6 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:21474 1 OK -0x1.aedbb2eb6973p15 -0x1.0ef45b0e0dd3ep19 0x1.e3e48b748p4 0x1.300000001d4abp6 -0x1.3fffffffeae69p2 -0x1.8p-29 F +REG epsg:21474 2 OK 0x1.019fd5e748992p20 -0x1.0ef45b0e4eb7cp19 0x1.292d7ea74p5 0x1.57ffffffe2aefp6 -0x1.3fffffffeae15p2 0x1.0p-30 F +REG epsg:21474 3 OK -0x1.aed93060e4b9p15 0x1.0f08ee0c69f9ep19 0x1.64b5d8026p5 0x1.300000001d4a3p6 0x1.3fffffffeae54p2 -0x1.8p-29 F +REG epsg:21474 4 OK 0x1.019fc1d238e66p20 0x1.0f08ee0caae74p19 0x1.9bf108bd6p5 0x1.57ffffffe2af7p6 0x1.3fffffffeadfep2 -0x1.0p-29 F +REG epsg:21475 0 OK 0x1.e84df6f760283p18 0x1.493298bafec32p6 0x1.6ae58599p5 0x1.5cp6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:21475 1 OK -0x1.aefaeba86bc5p15 -0x1.0ef451afed098p19 0x1.1775a444ap5 0x1.480000001d4cp6 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:21475 2 OK 0x1.019ed2de2b88cp20 -0x1.0ef451b013fadp19 0x1.389a77718p5 0x1.6fffffffe2b05p6 -0x1.3fffffffeae27p2 -0x1.0p-29 F +REG epsg:21475 3 OK -0x1.aef869197927p15 0x1.0f08e4ad94f84p19 0x1.8a3930fcp5 0x1.480000001d4b7p6 0x1.3fffffffeae41p2 -0x1.0p-29 F +REG epsg:21475 4 OK 0x1.019ebec94367ap20 0x1.0f08e4adbbef6p19 0x1.ab5dff3dcp5 0x1.6fffffffe2b0dp6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:21476 0 OK 0x1.e849eca5c7142p18 0x1.493293194a84bp6 0x1.782074a24p5 0x1.7400000000001p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:21476 1 OK -0x1.af1af4ea976bp15 -0x1.0ef44d0a664e3p19 0x1.2fd08771cp5 0x1.600000001d4d3p6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:21476 2 OK 0x1.019dcdfbe75d2p20 -0x1.0ef44d0a72decp19 0x1.3a82006b6p5 0x1.87ffffffe2b1ap6 -0x1.3fffffffeae38p2 -0x1.0p-29 F +REG epsg:21476 3 OK -0x1.af18725701d7p15 0x1.0f08e007b4d96p19 0x1.a294108c4p5 0x1.600000001d4cbp6 0x1.3fffffffeae31p2 -0x1.0p-30 F +REG epsg:21476 4 OK 0x1.019db9e72660ep20 0x1.0f08e007c16bbp19 0x1.ad4587ef8p5 0x1.87ffffffe2b22p6 0x1.3fffffffeae1cp2 0x1.0p-30 F +REG epsg:21477 0 OK 0x1.e845dcee81dcfp18 0x1.4932934023b0cp6 0x1.77c530ddp5 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:21477 1 OK -0x1.af3b74d8b893p15 -0x1.0ef44d2a81846p19 0x1.3abea0f44p5 0x1.780000001d4e9p6 -0x1.3fffffffeae38p2 -0x1.8p-29 F +REG epsg:21477 2 OK 0x1.019cca1c27fc6p20 -0x1.0ef44d2a73908p19 0x1.2edec23fp5 0x1.9fffffffe2b2fp6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:21477 3 OK -0x1.af38f24057f8p15 0x1.0f08e027d27a4p19 0x1.ad82286f2p5 0x1.780000001d4e2p6 0x1.3fffffffeae1dp2 -0x1.8p-29 F +REG epsg:21477 4 OK 0x1.019cb6078d4a2p20 0x1.0f08e027c4845p19 0x1.a1a24b7cep5 0x1.9fffffffe2b36p6 0x1.3fffffffeae3p2 -0x1.8p-29 F +REG epsg:21478 0 OK 0x1.e841d335897bcp18 0x1.4932992f1d556p6 0x1.69d4ba3ecp5 0x1.a400000000001p6 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:21478 1 OK -0x1.af5c104cd6f7p15 -0x1.0ef4520fe4a1fp19 0x1.382149482p5 0x1.900000001d4fep6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:21478 2 OK 0x1.019bca17c448ep20 -0x1.0ef4520fbc515p19 0x1.15d16078ep5 0x1.b7ffffffe2b44p6 -0x1.3fffffffeae5ap2 -0x1.8p-29 F +REG epsg:21478 3 OK -0x1.af598daf90b7p15 0x1.0f08e50d93c9fp19 0x1.aae4d1264p5 0x1.900000001d4f6p6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:21478 4 OK 0x1.019bb6034e9aap20 0x1.0f08e50d6b734p19 0x1.8894ed6e8p5 0x1.b7ffffffe2b4bp6 0x1.3fffffffeae44p2 -0x1.8p-29 F +REG epsg:21479 0 OK 0x1.e83ddace08beap18 0x1.4932a4d593a99p6 0x1.4e7628d8ap5 0x1.bcp6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:21479 1 OK -0x1.af7c6bd3c943p15 -0x1.0ef45bacd4acap19 0x1.27ffd5a78p5 0x1.a80000001d512p6 -0x1.3fffffffeae14p2 -0x1.0p-29 F +REG epsg:21479 2 OK 0x1.019ad0bcc27e9p20 -0x1.0ef45bac92713p19 0x1.df403c038p4 0x1.cfffffffe2b57p6 -0x1.3fffffffeae67p2 -0x1.0p-30 F +REG epsg:21479 3 OK -0x1.af79e9319076p15 0x1.0f08eeab3cc5ep19 0x1.9ac35feacp5 0x1.a80000001d50bp6 0x1.3fffffffeadfap2 0x0.0p0 F +REG epsg:21479 4 OK 0x1.019abca870266p20 0x1.0f08eeaafa80cp19 0x1.6263b0a1ep5 0x1.cfffffffe2b6p6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG epsg:2148 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2148 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:2148 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:2148 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:2148 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:21480 0 OK 0x1.e839feda9b172p18 0x1.4932b612dab14p6 0x1.25f63f382p5 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:21480 1 OK -0x1.af9c2cada1f1p15 -0x1.0ef469e65c37p19 0x1.0a87837cap5 0x1.c00000001d527p6 -0x1.3fffffffeae02p2 0x0.0p0 F +REG epsg:21480 2 OK 0x1.0199e0c67ad4ap20 -0x1.0ef469e600cc6p19 0x1.796c30384p4 0x1.e7ffffffe2b68p6 -0x1.3fffffffeae7ap2 0x0.0p0 F +REG epsg:21480 3 OK -0x1.af99aa067795p15 0x1.0f08fce5d5fa4p19 0x1.7d4b121fp5 0x1.c00000001d52p6 0x1.3fffffffeade7p2 0x1.0p-29 F +REG epsg:21480 4 OK 0x1.0199ccb249c19p20 0x1.0f08fce57a822p19 0x1.2f79b24a4p5 0x1.e7ffffffe2b6fp6 0x1.3fffffffeae62p2 -0x1.8p-29 F +REG epsg:21481 0 OK 0x1.e8364a2e13638p18 0x1.4932ccb699d49p6 0x1.e18d26578p4 0x1.ec00000000001p6 0x0.0p0 0x1.8p-29 T +REG epsg:21481 1 OK -0x1.afbaf9cc25d1p15 -0x1.0ef47c9496f2dp19 0x1.c015f3098p4 0x1.d80000001d53bp6 -0x1.3fffffffeadf1p2 0x0.0p0 F +REG epsg:21481 2 OK 0x1.0198fcd5ee81ep20 -0x1.0ef47c94235b9p19 0x1.f688682ap3 0x1.ffffffffe2b7cp6 -0x1.3fffffffeae89p2 -0x1.0p-30 F +REG epsg:21481 3 OK -0x1.afb8772018bbp15 0x1.0f090f9578196p19 0x1.52ce8e754p5 0x1.d80000001d534p6 0x1.3fffffffeadd9p2 0x1.0p-28 F +REG epsg:21481 4 OK 0x1.0198e8c1dc45cp20 0x1.0f090f950470fp19 0x1.e0cb7b294p4 0x1.ffffffffe2b85p6 0x1.3fffffffeae7p2 -0x1.0p-28 F +REG epsg:21482 0 OK 0x1.e832c72d2242p18 0x1.4932e88153656p6 0x1.5ef89e878p4 0x1.02p7 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:21482 1 OK -0x1.afd87ccc8365p15 -0x1.0ef4938321848p19 0x1.5202c022cp4 0x1.f00000001d54cp6 -0x1.3fffffffeade6p2 0x0.0p0 F +REG epsg:21482 2 OK 0x1.0198276a68814p20 -0x1.0ef4938297073p19 0x1.98a86546p2 0x1.0bfffffff15c8p7 -0x1.3fffffffeae95p2 -0x1.0p-28 F +REG epsg:21482 3 OK -0x1.afd5fa1bb024p15 0x1.0f092685bbd78p19 0x1.1bc4fd2c6p5 0x1.f00000001d547p6 0x1.3fffffffeadcap2 0x1.0p-30 F +REG epsg:21482 4 OK 0x1.0198135672572p20 0x1.0f0926853145bp19 0x1.4bb176864p4 0x1.0bfffffff15ccp7 0x1.3fffffffeae7fp2 -0x1.8p-29 F +REG epsg:21483 0 OK 0x1.e82f7fb130f6cp18 0x1.49330925169afp6 0x1.8b3a4237p3 0x1.0ep7 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:21483 1 OK -0x1.aff462e99037p15 -0x1.0ef4ae71ac5e7p19 0x1.98144ba28p3 0x1.040000000eabp7 -0x1.3fffffffeadd6p2 0x1.0p-29 F +REG epsg:21483 2 OK 0x1.019762da7ccfep20 -0x1.0ef4ae710c828p19 -0x1.10ffcd26p2 0x1.17fffffff15cep7 -0x1.3fffffffeaea5p2 -0x1.8p-29 F +REG epsg:21483 3 OK -0x1.aff1e03420b7p15 0x1.0f0941764cd2p19 0x1.b19173e84p4 0x1.040000000eaadp7 0x1.3fffffffeadbcp2 0x1.8p-29 F +REG epsg:21483 4 OK 0x1.01974ec69fa48p20 0x1.0f094175acde7p19 0x1.428f06688p3 0x1.17fffffff15d2p7 0x1.3fffffffeae8dp2 -0x1.0p-29 F +REG epsg:2149 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2149 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:2149 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:2149 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:2149 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:2150 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2150 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:2150 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:2150 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:2150 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:21500 0 OK -0x1.cf93f523539e8p14 0x1.1ec7e4d152f2fp21 0x0.0p0 0x0.0p0 0x1.17aaaaaaaaaa8p6 0x0.0p0 F +REG epsg:21500 1 OK -0x1.4d30035af5dbbp21 0x1.841555a966164p20 0x0.0p0 -0x1.5d75df526a7fdp5 0x1.b7555555552dbp5 0x0.0p0 F +REG epsg:21500 2 OK 0x1.38c7a82bc001ep21 0x1.37fed6572b10ap20 0x0.0p0 0x1.5d75df526a7fbp5 0x1.b7555555552dbp5 0x0.0p0 F +REG epsg:21500 3 OK -0x1.d853dd2899d54p18 0x1.16690060969cfp22 0x0.0p0 -0x1.5d75df526a7fbp5 0x1.53aaaaaaaaaaap6 0x0.0p0 F +REG epsg:21500 4 OK 0x1.4c72db8fd25c8p19 0x1.12396169a8da8p22 0x0.0p0 0x1.5d75df526a7ffp5 0x1.53aaaaaaaaaabp6 0x0.0p0 F +REG epsg:2151 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2151 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:2151 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:2151 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:2151 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:2152 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:2152 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:2152 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:2152 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:2152 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:2153 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2153 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:2153 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:2153 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:2153 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:2154 0 OK 0x1.55ccp19 0x1.92d5p22 0x0.0p0 0x1.8000000000001p1 0x1.73ffffffffff7p5 0x0.0p0 F +REG epsg:2154 1 OK 0x1.6a0cf44086008p16 0x1.729e7bddea80fp22 0x0.0p0 -0x1.10e06f120d01fp2 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:2154 2 OK 0x1.3f2b30bbf7ap20 0x1.729e7bddea80fp22 0x0.0p0 0x1.487037890681p3 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:2154 3 OK 0x1.7c86bcd6a7b4ep17 0x1.b6337589211cap22 0x0.0p0 -0x1.10e06f120d01fp2 0x1.9bffffffffb4p5 0x0.0p0 F +REG epsg:2154 4 OK 0x1.263b28652b096p20 0x1.b6337589211cap22 0x0.0p0 0x1.487037890680fp3 0x1.9bffffffffb4p5 0x0.0p0 F +REG epsg:2155 0 OK 0x1.e896ef9e584a2p18 -0x1.ca9b9a70befddp10 -0x1.3e6f98da9p6 0x1.54p7 -0x1.c888888888667p3 -0x1.0p-29 F +REG epsg:2155 1 OK -0x1.39e43faf50822p20 -0x1.c111d0254233fp20 -0x1.272110cdp5 0x1.49ae8908a9a94p7 -0x1.344444444432bp4 0x1.0p-29 F +REG epsg:2155 2 OK 0x1.1717dc9f698e1p21 -0x1.c111835451018p20 -0x1.48d8bf8f4p4 0x1.5e5176f75656dp7 -0x1.3444444444333p4 0x0.0p0 F +REG epsg:2155 3 OK -0x1.4d94abab14a0bp20 0x1.b616693c98a13p20 -0x1.0d44fe2fp7 0x1.49ae8908a9a94p7 -0x1.28888888886c5p3 0x1.0p-30 F +REG epsg:2155 4 OK 0x1.20f0109d2918ep21 0x1.b6161c02be01bp20 -0x1.d6360054fp6 0x1.5e5176f75656dp7 -0x1.28888888886dcp3 -0x1.0p-30 F +REG epsg:2156 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:2156 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2156 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2156 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2156 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2157 0 OK 0x1.24f8p19 0x1.6e36p19 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG epsg:2157 1 OK -0x1.454499d35e9cp14 0x1.bd79609950d2ap17 0x0.0p0 -0x1.067e6c224688ap4 0x1.83fffffbf6bf5p5 0x0.0p0 F +REG epsg:2157 2 OK 0x1.2a0d12674d7a7p20 0x1.bd79609950d2ap17 0x0.0p0 0x1.9f9b0891a2273p-2 0x1.83fffffbf6bf5p5 0x0.0p0 F +REG epsg:2157 3 OK 0x1.b0b75b8629ca8p16 0x1.467cba23ee39p20 0x0.0p0 -0x1.067e6c148101dp4 0x1.d3fffffc3a92fp5 0x0.0p0 F +REG epsg:2157 4 OK 0x1.09ec8a479d636p20 0x1.467cba23ee39p20 0x0.0p0 0x1.9f9b052040732p-2 0x1.d3fffffc3a92fp5 0x0.0p0 F +REG epsg:2158 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:2158 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:2158 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG epsg:2158 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:2158 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG epsg:2159 0 OK 0x1.e847fffffffffp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p3 0x1.aaaaaaaaaaaabp2 0x0.0p0 F +REG epsg:2159 1 OK -0x1.47323ffac7633p20 -0x1.ba48610fd4fb2p20 0x0.0p0 -0x1.108b6bcfeaad5p4 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG epsg:2159 2 OK 0x1.1dab1ffd63b1ap21 -0x1.ba48610fd4fb2p20 0x0.0p0 -0x1.bdd250c0554abp2 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG epsg:2159 3 OK -0x1.3e1d53111cea5p20 0x1.bedd9e4a4c215p20 0x0.0p0 -0x1.108b6bd02abe3p4 0x1.755555553efd7p3 0x0.0p0 F +REG epsg:2159 4 OK 0x1.1920a9888e753p21 0x1.bedd9e4a4c215p20 0x0.0p0 -0x1.bdd250bf55075p2 0x1.755555553efd7p3 0x0.0p0 F +REG epsg:2160 0 OK 0x1.86a0000000002p19 0x1.24f8000000001p19 0x0.0p0 -0x1.8000000000001p3 0x1.aaaaaaaaaaaabp2 0x0.0p0 F +REG epsg:2160 1 OK -0x1.fbe87ff58ec64p19 -0x1.27cc610fd4fb2p20 0x0.0p0 -0x1.108b6bcfeaad5p4 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG epsg:2160 2 OK 0x1.424a1ffd63b1ap21 -0x1.27cc610fd4fb2p20 0x0.0p0 -0x1.bdd250c0554acp2 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG epsg:2160 3 OK -0x1.e9bea62239d48p19 0x1.28accf252610bp21 0x0.0p0 -0x1.108b6bd02abe3p4 0x1.755555553efd8p3 0x0.0p0 F +REG epsg:2160 4 OK 0x1.3dbfa9888e754p21 0x1.28accf252610bp21 0x0.0p0 -0x1.bdd250bf55075p2 0x1.755555553efd8p3 0x0.0p0 F +REG epsg:2161 0 OK 0x1.e84cb9e9a32bfp18 -0x1.93d70e74db30ap6 -0x1.a1b7fbd9p4 -0x1.dfffffffffffep3 0x0.0p0 0x0.0p0 T +REG epsg:2161 1 OK -0x1.ad51fa14bd07p15 -0x1.0ef0478bfcdbbp19 -0x1.0f40b929cp4 -0x1.4p4 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2161 2 OK 0x1.0190ecc933de8p20 -0x1.0ef0478c1c38p19 -0x1.b56a86f48p3 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2161 3 OK -0x1.ad550e71959ep15 0x1.0ed70a527a574p19 -0x1.147bcd4d8p5 -0x1.4p4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2161 4 OK 0x1.0191056c8817ep20 0x1.0ed70a5299adfp19 -0x1.f46c1b598p4 -0x1.3ffffffffffffp3 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2162 0 OK 0x1.e84a73f11c46bp18 -0x1.93d7082a9b42bp6 -0x1.89a1482a4p4 -0x1.2p3 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:2162 1 OK -0x1.ad63e70fffcdp15 -0x1.0ef04351036a6p19 -0x1.d56b91fp3 -0x1.c000000000001p3 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2162 2 OK 0x1.01905932fe868p20 -0x1.0ef0435113b11p19 -0x1.9ee104878p3 -0x1.0000000000001p2 -0x1.3fffffffffffdp2 -0x1.0p-29 F +REG epsg:2162 3 OK -0x1.ad66fb6ffe1ap15 0x1.0ed70617e4bd7p19 -0x1.023651e08p5 -0x1.c000000000003p3 0x1.4p2 -0x1.0p-29 F +REG epsg:2162 4 OK 0x1.019071d637479p20 0x1.0ed70617f5014p19 -0x1.e92758154p4 -0x1.ffffffffffffdp1 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:2163 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG epsg:2163 1 OK -0x1.25efa53e11a82p19 -0x1.02d3143da8abep19 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:2163 2 OK 0x1.25efa53e11a82p19 -0x1.02d3143da8abep19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:2163 3 OK -0x1.ed3389a61b7abp18 0x1.1a650a24bbb2fp19 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG epsg:2163 4 OK 0x1.ed3389a61b7abp18 0x1.1a650a24bbb2fp19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG epsg:2164 0 OK 0x1.e83d873bc12cep18 -0x1.d2cfdbba70f0ep8 0x1.10414d14p4 -0x1.4p2 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:2164 1 OK -0x1.adbe7f77ce0cp15 -0x1.0f1d8938e3385p19 0x1.f83207b4ap5 -0x1.3fffffff0f8f3p3 -0x1.3fffffffea456p2 -0x1.0p-30 F +REG epsg:2164 2 OK 0x1.018cb7930b28ep20 -0x1.0f1d89389d9bdp19 0x1.bdfc1c128p5 -0x1.e073285a72cc1p-30 -0x1.3fffffffea4bp2 -0x1.0p-29 F +REG epsg:2164 3 OK -0x1.adccbcfe2dbap15 0x1.0ea8d641abf39p19 -0x1.262df9e98p4 -0x1.3fffffff0f794p3 0x1.3fffffffea4dep2 0x0.0p0 F +REG epsg:2164 4 OK 0x1.018d297adcd1ep20 0x1.0ea8d6416691ap19 -0x1.9a9a33398p4 -0x1.e09f14ddde752p-30 0x1.3fffffffea53ap2 -0x1.0p-28 F +REG epsg:2165 0 OK 0x1.e83d85e52812p18 -0x1.d29a1fdd4969p8 0x1.0c6df063cp4 -0x1.3ffffffffffffp2 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:2165 1 OK -0x1.adbe959e3438p15 -0x1.0f1d832d6ef4dp19 0x1.f62a4df2cp5 -0x1.3fffffff0f8f4p3 -0x1.3fffffffea456p2 0x1.0p-30 F +REG epsg:2165 2 OK 0x1.018cb798f0bb6p20 -0x1.0f1d832d294f8p19 0x1.bbecf1dc8p5 -0x1.e073308e67022p-30 -0x1.3fffffffea4bp2 -0x1.8p-29 F +REG epsg:2165 3 OK -0x1.adccd1810d97p15 0x1.0ea8dda5121efp19 -0x1.29a77da74p4 -0x1.3fffffff0f793p3 0x1.3fffffffea4e1p2 -0x1.0p-30 F +REG epsg:2165 4 OK 0x1.018d2973a623dp20 0x1.0ea8dda4ccb43p19 -0x1.9e2297e04p4 -0x1.e09f2b654813p-30 0x1.3fffffffea539p2 -0x1.8p-29 F +REG epsg:2166 0 OK 0x1.ab42dca372b33p21 0x1.3801725a0b661p6 -0x1.caffa40e1p6 0x1.1ffffffffffffp3 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:2166 1 OK 0x1.677cc3291110ep21 -0x1.0ef69d2bae95ap19 -0x1.087e39832p7 0x1.00000001d44ccp2 -0x1.3fffffffeaeb4p2 -0x1.cp-28 F +REG epsg:2166 2 OK 0x1.ef08f62b384edp21 -0x1.0ef69d2c77a7ep19 -0x1.bb265d0dbp6 0x1.bfffffff153acp3 -0x1.3fffffffeadacp2 0x1.8p-29 F +REG epsg:2166 3 OK 0x1.677cccacc266ep21 0x1.0f0a1d18fa519p19 -0x1.da99d0d88p6 0x1.00000001d445ap2 0x1.3fffffffeae9bp2 -0x1.8p-28 F +REG epsg:2166 4 OK 0x1.ef08eca672b5fp21 0x1.0f0a1d19c3803p19 -0x1.84c3c6f24p6 0x1.bfffffff153e6p3 0x1.3fffffffead95p2 0x0.0p0 F +REG epsg:2167 0 OK 0x1.12aa6f0dfe177p22 0x1.38015d72a97a7p6 -0x1.b11763edep6 0x1.7ffffffffffffp3 0x0.0p0 0x1.0p-30 T +REG epsg:2167 1 OK 0x1.e18ec92147b7ep21 -0x1.0ef68af8b259bp19 -0x1.f756eacfep6 0x1.c0000001d44bcp2 -0x1.3fffffffeaeb1p2 -0x1.8p-29 F +REG epsg:2167 2 OK 0x1.348d79920d5c2p22 -0x1.0ef68af97bbf4p19 -0x1.a16023a77p6 0x1.0fffffff8a9dap4 -0x1.3fffffffeadaap2 0x1.8p-29 F +REG epsg:2167 3 OK 0x1.e18ed2a4f6f21p21 0x1.0f0a0ae4b2424p19 -0x1.c0f44c3d7p6 0x1.c0000001d444cp2 0x1.3fffffffeae9dp2 -0x1.0p-28 F +REG epsg:2167 4 OK 0x1.348d74cfab691p22 0x1.0f0a0ae57bc41p19 -0x1.6afd912bdp6 0x1.0fffffff8a9f7p4 0x1.3fffffffead93p2 0x1.0p-28 F +REG epsg:2168 0 OK 0x1.4fb36e6ee4577p22 0x1.3801488aab346p6 -0x1.972e60473p6 0x1.e000000000001p3 0x0.0p0 -0x1.0p-30 T +REG epsg:2168 1 OK 0x1.2dd066316f054p22 -0x1.0ef678c52e44dp19 -0x1.dd9277b1dp6 0x1.40000000ea25bp3 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:2168 2 OK 0x1.719676b30d0a6p22 -0x1.0ef678c5f7701p19 -0x1.87b75106dp6 0x1.3fffffff8a9dap4 -0x1.3fffffffeadadp2 0x1.4p-28 F +REG epsg:2168 3 OK 0x1.2dd06af345c4fp22 0x1.0f09f8afe2501p19 -0x1.a72fdcbf1p6 0x1.40000000ea222p3 0x1.3fffffffeae9fp2 -0x1.cp-28 F +REG epsg:2168 4 OK 0x1.719671f0ac214p22 0x1.0f09f8b0ab97ap19 -0x1.5154c227p6 0x1.3fffffff8a9f7p4 0x1.3fffffffead94p2 0x1.8p-28 F +REG epsg:2169 0 OK 0x1.3816f211bbebdp16 0x1.862956a77ac1cp16 -0x1.7f4076098p5 0x1.8aaaaab4dbd8p2 0x1.8eaaaaaa1311dp5 0x1.0fbc1p-9 F +REG epsg:2169 1 OK -0x1.044cd37f4a841p19 -0x1.a0adb6cb5922cp18 -0x1.5f72b83cap5 -0x1.95c9ed1dec6e4p0 0x1.66aaaaa7c2c98p5 0x1.09915p-9 F +REG epsg:2169 2 OK 0x1.5251936a41564p19 -0x1.a0afb0485d24p18 -0x1.9a64ea6fep5 0x1.bd63e8568bdbep3 0x1.66aaaaa7de105p5 0x1.27a558p-9 F +REG epsg:2169 3 OK -0x1.97ec19f0e584ep18 0x1.4de8a17db084ap19 -0x1.8636d6432p5 -0x1.95c9ec926e6c8p0 0x1.b6aaaaa778bb4p5 0x1.e682ep-10 F +REG epsg:2169 4 OK 0x1.19fce04dd3958p19 0x1.4de79ad87c344p19 -0x1.b61186074p5 0x1.bd63e849d5838p3 0x1.b6aaaaa771f0fp5 0x1.129fc8p-9 F +REG epsg:2170 0 OK 0x1.e82ea586aa2fbp18 -0x1.ccf3203c60e8bp8 0x1.1edbb89048p7 0x1.dfffffffa2ee3p3 -0x1.49a0cd9a236e5p-25 0x1.13bf9cp-8 T +REG epsg:2170 1 OK -0x1.af86e2b5f2ecp15 -0x1.0f2e6c6b56ab9p19 0x1.6cb37a42f8p7 0x1.3ffffffef317ap3 -0x1.400000284742ep2 0x1.469d64p-8 F +REG epsg:2170 2 OK 0x1.0191bcbfa5a38p20 -0x1.0f31b26f28c63p19 0x1.8265385d58p7 0x1.4000000033169p4 -0x1.400000286ceccp2 0x1.450f28p-8 F +REG epsg:2170 3 OK -0x1.af5b631a46f3p15 0x1.0ebec695e0fedp19 0x1.95fdda569p6 0x1.3ffffffe93bf5p3 0x1.3fffffd78e993p2 0x1.cdbf08p-9 F +REG epsg:2170 4 OK 0x1.0193fb2271b3dp20 0x1.0ebae0af86894p19 0x1.c13f4afa8p6 0x1.4000000052b15p4 0x1.3fffffd77457dp2 0x1.ca0b18p-9 F +REG epsg:2171 0 OK 0x1.1b070f0ec8d6ap22 0x1.58aade0a2bd5cp22 -0x1.f975b7ec4p4 0x1.515555555069cp4 0x1.94ffffffeff98p5 0x1.9f82p-14 F +REG epsg:2171 1 OK 0x1.eaf9fbafa3adcp21 0x1.38a58e1f007ap22 -0x1.8683ca53cp5 0x1.a6750a37c34ep3 0x1.6cfffffff238ep5 0x1.c55ep-14 F +REG epsg:2171 2 OK 0x1.409116b36add8p22 0x1.38a5896f00965p22 -0x1.443caf818p4 0x1.cf70258ec1866p4 0x1.6cfffffff1e1fp5 0x1.be85p-14 F +REG epsg:2171 3 OK 0x1.f96e9ec73431bp21 0x1.7c51269a453c2p22 -0x1.47c4aa71p5 0x1.a6750a37c13b6p3 0x1.bcffffffee593p5 0x1.7a2p-14 F +REG epsg:2171 4 OK 0x1.3956d93c3bc95p22 0x1.7c51196985032p22 -0x1.1ebc0ac64p4 0x1.cf70258ebd2d2p4 0x1.bcffffffee531p5 0x1.726bp-14 F +REG epsg:2172 0 OK 0x1.18f3d0bf60b6ep22 0x1.625f2eedbc05p22 -0x1.dcada9828p4 0x1.580b60b605998p4 0x1.a803fb72d983p5 0x1.8cc2p-14 F +REG epsg:2172 1 OK 0x1.e6323109d8ca9p21 0x1.42888781d2d7bp22 -0x1.766d6ae56p5 0x1.a636e8f72ebc6p3 0x1.8003fb72db82ap5 0x1.b53cp-14 F +REG epsg:2172 2 OK 0x1.3ece7eb281b91p22 0x1.428881ea41a53p22 -0x1.20cbb8d2cp4 0x1.dcfb4cf076852p4 0x1.8003fb72db386p5 0x1.ad65p-14 F +REG epsg:2172 3 OK 0x1.f5f0f499a37cp21 0x1.8628c668c8c59p22 -0x1.3b170fe6p5 0x1.a636e8f72c6e5p3 0x1.d003fb72d81d3p5 0x1.65d7p-14 F +REG epsg:2172 4 OK 0x1.36ef329128497p22 0x1.8628b8ba56904p22 -0x1.09d2a95ep4 0x1.dcfb4cf0717c8p4 0x1.d003fb72d82b5p5 0x1.5d75p-14 F +REG epsg:2173 0 OK 0x1.ab622c26316c6p21 0x1.6e26ee383cbd4p22 -0x1.23fe8fd14p5 0x1.102222221e3a1p4 0x1.acaaaaaa99a18p5 0x1.89f5p-14 F +REG epsg:2173 1 OK 0x1.5f82b1367aebp21 0x1.4e5ca900fe2d9p22 -0x1.b28d898b6p5 0x1.12bfbb2c37548p3 0x1.84aaaaaa9b8eap5 0x1.b189p-14 F +REG epsg:2173 2 OK 0x1.f741924e15234p21 0x1.4e5ca350ebf47p22 -0x1.93f94e5f4p4 0x1.96e466ae229afp4 0x1.84aaaaaa9b5fdp5 0x1.ac45p-14 F +REG epsg:2173 3 OK 0x1.6f97b9f3784dep21 0x1.91f98edb77d64p22 -0x1.6a818423p5 0x1.12bfbb2c373d4p3 0x1.d4aaaaaa98431p5 0x1.613cp-14 F +REG epsg:2173 4 OK 0x1.e72cb560f590ep21 0x1.91f981152ddc4p22 -0x1.667d24cp4 0x1.96e466ae1e742p4 0x1.d4aaaaaa984efp5 0x1.5ba9p-14 F +REG epsg:2174 0 OK 0x1.c40aa8d81b3b7p21 0x1.5772798341888p22 -0x1.31b416a3ap5 0x1.0ac16c16be091p4 0x1.9d5dddddcd7e3p5 0x1.9936p-14 F +REG epsg:2174 1 OK 0x1.78b180a62323bp21 0x1.3780eeb6eda8ep22 -0x1.c16919c16p5 0x1.13855653050abp3 0x1.755dddddcf9d7p5 0x1.bed9p-14 F +REG epsg:2174 2 OK 0x1.07b1deb1b3142p22 0x1.3780e9c102e7dp22 -0x1.b4a99c32p4 0x1.8bc02d03fb283p4 0x1.755dddddcf672p5 0x1.ba2ep-14 F +REG epsg:2174 3 OK 0x1.87b328737eb5bp21 0x1.7b2800451437p22 -0x1.76fd9efb8p5 0x1.1385565304f28p3 0x1.c55dddddcbed7p5 0x1.71bdp-14 F +REG epsg:2174 4 OK 0x1.00311f707d02ep22 0x1.7b27f2e18382p22 -0x1.7be66bf8p4 0x1.8bc02d03f7828p4 0x1.c55dddddcbedfp5 0x1.6c96p-14 F +REG epsg:2175 0 OK 0x1.cf21b33195becp17 -0x1.1edc4692d6018p22 -0x1.5a673e9d2p6 0x1.2f5555555787fp4 0x1.c0d5d8180a6f1p-32 0x1.c2bp-14 T +REG epsg:2175 1 OK -0x1.369cd90e86828p18 -0x1.40bc2917cfb61p22 -0x1.a97ef19e3p6 0x1.beaaaaab97a4p3 -0x1.3fffffff682f3p2 0x1.9cb8p-14 F +REG epsg:2175 2 OK 0x1.82df83fabd353p19 -0x1.40bc1fd6e4a65p22 -0x1.41a8e1adap6 0x1.7f555554e3c2ep4 -0x1.3fffffff6b718p2 0x1.a2f6p-14 F +REG epsg:2175 3 OK -0x1.369d09c51623ap18 -0x1.f9f8d778df227p21 -0x1.744a7b738p6 0x1.beaaaaab96ad6p3 0x1.4000000047f02p2 0x1.df11p-14 F +REG epsg:2175 4 OK 0x1.82df21236a2adp19 -0x1.f9f8cb54de3abp21 -0x1.0c722ff6cp6 0x1.7f555554e272ep4 0x1.4000000044045p2 0x1.e331p-14 F +REG epsg:2176 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:2176 1 OK 0x1.2dcf4893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.40000000ea80dp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2176 2 OK 0x1.7193b76c0b97p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2176 3 OK 0x1.2dcf4893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.40000000ea80dp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2176 4 OK 0x1.7193b76c0b97p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2177 0 OK 0x1.8cba8p22 0x0.0p0 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG epsg:2177 1 OK 0x1.6ad84893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.a0000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2177 2 OK 0x1.ae9cb76c0b97p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.6fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2177 3 OK 0x1.6ad84893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.a0000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2177 4 OK 0x1.ae9cb76c0b97p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.6fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2178 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:2178 1 OK 0x1.a7e14893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.0000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2178 2 OK 0x1.eba5b76c0b97p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.9fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2178 3 OK 0x1.a7e14893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.0000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2178 4 OK 0x1.eba5b76c0b97p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.9fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:21780 0 OK -0x1.141487b93ef2p19 0x1.a58b43f8f8debp14 -0x1.a14d127bp5 0x1.7bf25ddf0f7bdp-51 0x1.779e86cdcd1eap5 0x1.0p-29 F +REG epsg:21780 1 OK -0x1.2a12bdda97f43p20 -0x1.ae809337718ccp18 -0x1.c674d1b0ap5 -0x1.d4caba33b322p2 0x1.4f9e86cdcd1e7p5 0x1.0p-30 F +REG epsg:21780 2 OK -0x1.2813df1b3f83bp13 -0x1.0f8ff88d64249p19 -0x1.dd4cf541cp5 0x1.d4caba33b322p2 0x1.4f9e86cdcd1e6p5 -0x1.0p-30 F +REG epsg:21780 3 OK -0x1.eec71e77355f4p19 0x1.3ec6fec3be9b7p19 -0x1.f98f37b58p4 -0x1.d4caba33b321ep2 0x1.9f9e86cdcd1e4p5 0x1.8p-29 F +REG epsg:21780 4 OK -0x1.ea3d679f2daa5p12 0x1.0ff353217a00ep19 -0x1.0fb60a162p5 0x1.d4caba33b3221p2 0x1.9f9e86cdcd1e7p5 0x1.0p-30 F +REG epsg:21781 0 OK 0x1.25010c7871a3ep19 0x1.86e9871d5393bp17 -0x1.8cf180eecp5 0x1.dc22222222223p2 0x1.779e86cdcd1e1p5 0x1.8p-29 F +REG epsg:21781 1 OK -0x1.0cb1b501d408p13 -0x1.3ff39bc6b14eap18 -0x1.f2cc1da12p5 0x1.d5d9fb9bbffcfp-4 0x1.4f9e86cdcd1e5p5 0x1.0p-30 F +REG epsg:21781 2 OK 0x1.271a6d459623fp20 -0x1.3ff3529e815bp18 -0x1.84f6514f8p5 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e7p5 -0x1.8p-29 F +REG epsg:21781 3 OK 0x1.740b8cfee2dbcp16 0x1.7d2a931b5518dp19 -0x1.218694408p5 0x1.d5d9fb9bbff9fp-4 0x1.9f9e86cdcd1e7p5 0x1.8p-29 F +REG epsg:21781 4 OK 0x1.0dc055ff37468p20 0x1.7d2a71be46fdap19 -0x1.8d01f7ae8p4 0x1.d8766e2aeaa26p3 0x1.9f9e86cdcd1e7p5 0x1.0p-30 F +REG epsg:21782 0 OK 0x1.218f0e347b02dp6 0x1.261c754e4edap7 -0x1.8cf180eecp5 0x1.dc22222222223p2 0x1.779e86cdcd1e1p5 0x1.8p-29 F +REG epsg:21782 1 OK -0x1.292ac6d407502p19 -0x1.01a1cde358a75p19 -0x1.f2cc1da12p5 0x1.d5d9fb9bbffcfp-4 0x1.4f9e86cdcd1e5p5 0x1.0p-30 F +REG epsg:21782 2 OK 0x1.293cda8b2c47ep19 -0x1.01a1a94f40ad8p19 -0x1.84f6514f8p5 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e7p5 -0x1.8p-29 F +REG epsg:21782 3 OK -0x1.eced1cc047491p18 0x1.1b82931b5518dp19 -0x1.218694408p5 0x1.d5d9fb9bbff9fp-4 0x1.9f9e86cdcd1e7p5 0x1.8p-29 F +REG epsg:21782 4 OK 0x1.ed1157fcdd19ep18 0x1.1b8271be46fdap19 -0x1.8d01f7ae8p4 0x1.d8766e2aeaa24p3 0x1.9f9e86cdcd1e7p5 0x1.0p-30 F +REG epsg:2179 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:2179 1 OK 0x1.e4ea4893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2179 2 OK 0x1.14575bb605cb8p23 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.cfffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2179 3 OK 0x1.e4ea4893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2179 4 OK 0x1.14575bb605cb8p23 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.cfffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2180 0 OK 0x1.e848p18 -0x1.437c8p22 0x0.0p0 0x1.3p4 0x0.0p0 0x0.0p0 T +REG epsg:2180 1 OK -0x1.ac27f0e7f9bbp15 -0x1.6556516e3b3ep22 0x0.0p0 0x1.c0000000ea80fp3 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:2180 2 OK 0x1.01853f873fcdep20 -0x1.6556516e3b3ep22 0x0.0p0 0x1.7fffffff8abf9p4 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:2180 3 OK -0x1.ac27f0e7f9bbp15 -0x1.21a2ae91c4c2p22 0x0.0p0 0x1.c0000000ea80fp3 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:2180 4 OK 0x1.01853f873fcdep20 -0x1.21a2ae91c4c2p22 0x0.0p0 0x1.7fffffff8abf9p4 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:21817 0 OK 0x1.e7f0574b76ca6p18 0x1.3ddf6bc0b1f08p8 0x1.3fdf4a6p0 -0x1.44p6 0x0.0p0 0x1.0p-30 T +REG epsg:21817 1 OK -0x1.b03702cfc5bdp15 -0x1.0ebb9bdd9cab1p19 0x1.61e222bap1 -0x1.58p6 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:21817 2 OK 0x1.0179e365edb7ep20 -0x1.0ebb9bdb5eab5p19 -0x1.d1289d58cp5 -0x1.3p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:21817 3 OK -0x1.b02d4f55eaaap15 0x1.0f0b130e7862dp19 0x1.d18f22ebp5 -0x1.58p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:21817 4 OK 0x1.017995e315e0dp20 0x1.0f0b130c3919ap19 -0x1.5b685398p1 -0x1.3p6 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:21818 0 OK 0x1.e7ea3b5f86c9dp18 0x1.3ddfe8dc4f5bp8 -0x1.26603629ap5 -0x1.2cp6 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:21818 1 OK -0x1.b06e7d19caf3p15 -0x1.0ebc06af8896cp19 -0x1.06f6cc63ap5 -0x1.4p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:21818 2 OK 0x1.0178913c65c08p20 -0x1.0ebc06ad230c8p19 -0x1.881982f3fp6 -0x1.18p6 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:21818 3 OK -0x1.b064c978b409p15 0x1.0f0b7dff6c2b5p19 0x1.68f5af9c8p4 -0x1.4p6 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:21818 4 OK 0x1.017843ba11854p20 0x1.0f0b7dfd0541p19 -0x1.54c036dccp5 -0x1.18p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2188 0 OK 0x1.e8a543a36cb6ep18 -0x1.43dea5abc2396p6 0x1.ace0b62dp3 -0x1.07fffffffffffp5 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2188 1 OK -0x1.aa8764ed3a4dp15 -0x1.0eed543610e3ep19 -0x1.a8369e16p3 -0x1.3p5 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:2188 2 OK 0x1.01a6dd445219cp20 -0x1.0eed543874992p19 0x1.9c60d51e6p5 -0x1.cp4 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2188 3 OK -0x1.aa89dcafafcap15 0x1.0ed9167703dbbp19 -0x1.b6033a0a8p4 -0x1.3p5 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:2188 4 OK 0x1.01a6f10929c1ap20 0x1.0ed9167967379p19 0x1.2b6d2b554p5 -0x1.c000000000002p4 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:2189 0 OK 0x1.e82e9d3311871p18 0x1.2fe1e236f4c01p5 -0x1.4a126ab27p6 -0x1.bp4 -0x1.2f74bf1dcfcaep-64 0x0.0p0 T +REG epsg:2189 1 OK -0x1.ae4f14f39072p15 -0x1.0edf834756922p19 -0x1.3664b1b04p6 -0x1.ffffffffffffep4 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2189 2 OK 0x1.0189c72b6b81ep20 -0x1.0edf8346b0741p19 -0x1.7cf34bad6p6 -0x1.6000000000001p4 -0x1.4000000000001p2 -0x1.0p-28 F +REG epsg:2189 3 OK -0x1.ae4dec4dfa16p15 0x1.0ee9024204b06p19 -0x1.1be5e168fp6 -0x1.ffffffffffffep4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2189 4 OK 0x1.0189bde71bfb8p20 0x1.0ee902415e86ep19 -0x1.627476909p6 -0x1.6000000000001p4 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:21891 0 OK 0x1.e81a19bed76bdp19 0x1.e86f28e4cc47cp19 0x1.049db342p1 -0x1.3452dbd194238p6 0x1.2656ca290d0fcp2 0x1.0p-30 F +REG epsg:21891 1 OK 0x1.ae34554ec60a6p18 0x1.b4c6e2e087b1cp18 0x1.6c47b29dp2 -0x1.486365b0dfd31p6 -0x1.9a935d6f12015p-2 0x1.ap-27 T +REG epsg:21891 2 OK 0x1.7c8d040f534bfp20 0x1.b4c6e2e0e9fc8p18 -0x1.d422a7a64p5 -0x1.204251f24830fp6 -0x1.9a935d6f12442p-2 -0x1.6p-27 T +REG epsg:21891 3 OK 0x1.b5d43f2849c72p18 0x1.7c33885eb706ep20 0x1.ded2a849cp5 -0x1.486365b0eb25p6 0x1.332b651473974p3 0x1.8p-27 F +REG epsg:21891 4 OK 0x1.7aa509b70a9c6p20 0x1.7c33885c8910cp20 -0x1.ba9d0b3cp1 -0x1.204251f23cf5bp6 0x1.332b651473c2fp3 -0x1.8p-28 F +REG epsg:21892 0 OK 0x1.e818ac86a4056p19 0x1.e86f5b08c5979p19 -0x1.16e0ad91p4 -0x1.2852dbd194238p6 0x1.2656ca290d0fap2 0x1.0p-29 F +REG epsg:21892 1 OK 0x1.ae310d2640046p18 0x1.b4c6da2045638p18 -0x1.9871b1d18p3 -0x1.3c6365b0dfd1fp6 -0x1.9a935d6f12p-2 0x1.cp-27 T +REG epsg:21892 2 OK 0x1.7c8c68de681d5p20 0x1.b4c6da20aab26p18 -0x1.3bdfa531bp6 -0x1.144251f248303p6 -0x1.9a935d6f12449p-2 -0x1.ap-27 T +REG epsg:21892 3 OK 0x1.b5d0fa1414cp18 0x1.7c33bce1cbda6p20 0x1.4d3de6b56p5 -0x1.3c6365b0eb243p6 0x1.332b651473969p3 0x1.0p-27 F +REG epsg:21892 4 OK 0x1.7aa46dc21cc49p20 0x1.7c33bcdf8cc5ap20 -0x1.79f94d89p4 -0x1.144251f23cf51p6 0x1.332b651473c37p3 -0x1.cp-28 F +REG epsg:21893 0 OK 0x1.e8176082c6731p19 0x1.e86f8ea3c9eccp19 -0x1.2bb738894p5 -0x1.1c52dbd194238p6 0x1.2656ca290d0fbp2 0x1.0p-30 F +REG epsg:21893 1 OK 0x1.ae2e043250218p18 0x1.b4c6d11e8e76ep18 -0x1.fe0f1dd5cp4 -0x1.306365b0dfd0ep6 -0x1.9a935d6f11ff7p-2 0x1.cp-27 T +REG epsg:21893 2 OK 0x1.7c8bdf14efc4ap20 0x1.b4c6d11ef682p18 -0x1.8f9709dd4p6 -0x1.084251f2482f5p6 -0x1.9a935d6f1245dp-2 -0x1.6p-27 T +REG epsg:21893 3 OK 0x1.b5cdf44b4a2f6p18 0x1.7c33f2eda78cep20 0x1.6cec8cf7cp4 -0x1.306365b0eb237p6 0x1.332b65147395fp3 0x1.2p-27 F +REG epsg:21893 4 OK 0x1.7aa3e32ed9cc6p20 0x1.7c33f2eb58f22p20 -0x1.6213f4bdep5 -0x1.084251f23cf48p6 0x1.332b651473c3fp3 -0x1.2p-27 F +REG epsg:21894 0 OK 0x1.e816369c45b0dp19 0x1.e86fc391a520bp19 -0x1.d01a56404p5 -0x1.1052dbd194238p6 0x1.2656ca290d0fcp2 0x1.8p-29 F +REG epsg:21894 1 OK 0x1.ae2b3c943afp18 0x1.b4c6c7e1b47cap18 -0x1.9ccd275a4p5 -0x1.246365b0dfcfep6 -0x1.9a935d6f11fdep-2 0x1.ap-27 T +REG epsg:21894 2 OK 0x1.7c8b6713a1e78p20 0x1.b4c6c7e21efa4p18 -0x1.e4fcc50d9p6 -0x1.f884a3e4905d2p5 -0x1.9a935d6f12463p-2 -0x1.0p-26 T +REG epsg:21894 3 OK 0x1.b5cb2fecf54b4p18 0x1.7c342a5c5f99ap20 0x1.ae5913b2p1 -0x1.246365b0eb22ep6 0x1.332b651473956p3 0x1.0p-27 F +REG epsg:21894 4 OK 0x1.7aa36a5e86c7ap20 0x1.7c342a5a031bcp20 -0x1.053df2d16p6 -0x1.f884a3e479e7fp5 0x1.332b651473c47p3 -0x1.8p-27 F +REG epsg:21896 0 OK 0x1.e81a19bed76bdp19 0x1.e86f28e4cc47cp19 0x1.049db342p1 -0x1.3452dbd194238p6 0x1.2656ca290d0fcp2 0x1.0p-30 F +REG epsg:21896 1 OK 0x1.ae34554ec60a6p18 0x1.b4c6e2e087b1cp18 0x1.6c47b29dp2 -0x1.486365b0dfd31p6 -0x1.9a935d6f12015p-2 0x1.ap-27 T +REG epsg:21896 2 OK 0x1.7c8d040f534bfp20 0x1.b4c6e2e0e9fc8p18 -0x1.d422a7a64p5 -0x1.204251f24830fp6 -0x1.9a935d6f12442p-2 -0x1.6p-27 T +REG epsg:21896 3 OK 0x1.b5d43f2849c72p18 0x1.7c33885eb706ep20 0x1.ded2a849cp5 -0x1.486365b0eb25p6 0x1.332b651473974p3 0x1.8p-27 F +REG epsg:21896 4 OK 0x1.7aa509b70a9c6p20 0x1.7c33885c8910cp20 -0x1.ba9d0b3cp1 -0x1.204251f23cf5bp6 0x1.332b651473c2fp3 -0x1.8p-28 F +REG epsg:21897 0 OK 0x1.e818ac86a4056p19 0x1.e86f5b08c5979p19 -0x1.16e0ad91p4 -0x1.2852dbd194238p6 0x1.2656ca290d0fap2 0x1.0p-29 F +REG epsg:21897 1 OK 0x1.ae310d2640046p18 0x1.b4c6da2045638p18 -0x1.9871b1d18p3 -0x1.3c6365b0dfd1fp6 -0x1.9a935d6f12p-2 0x1.cp-27 T +REG epsg:21897 2 OK 0x1.7c8c68de681d5p20 0x1.b4c6da20aab26p18 -0x1.3bdfa531bp6 -0x1.144251f248303p6 -0x1.9a935d6f12449p-2 -0x1.ap-27 T +REG epsg:21897 3 OK 0x1.b5d0fa1414cp18 0x1.7c33bce1cbda6p20 0x1.4d3de6b56p5 -0x1.3c6365b0eb243p6 0x1.332b651473969p3 0x1.0p-27 F +REG epsg:21897 4 OK 0x1.7aa46dc21cc49p20 0x1.7c33bcdf8cc5ap20 -0x1.79f94d89p4 -0x1.144251f23cf51p6 0x1.332b651473c37p3 -0x1.cp-28 F +REG epsg:21898 0 OK 0x1.e8176082c6731p19 0x1.e86f8ea3c9eccp19 -0x1.2bb738894p5 -0x1.1c52dbd194238p6 0x1.2656ca290d0fbp2 0x1.0p-30 F +REG epsg:21898 1 OK 0x1.ae2e043250218p18 0x1.b4c6d11e8e76ep18 -0x1.fe0f1dd5cp4 -0x1.306365b0dfd0ep6 -0x1.9a935d6f11ff7p-2 0x1.cp-27 T +REG epsg:21898 2 OK 0x1.7c8bdf14efc4ap20 0x1.b4c6d11ef682p18 -0x1.8f9709dd4p6 -0x1.084251f2482f5p6 -0x1.9a935d6f1245dp-2 -0x1.6p-27 T +REG epsg:21898 3 OK 0x1.b5cdf44b4a2f6p18 0x1.7c33f2eda78cep20 0x1.6cec8cf7cp4 -0x1.306365b0eb237p6 0x1.332b65147395fp3 0x1.2p-27 F +REG epsg:21898 4 OK 0x1.7aa3e32ed9cc6p20 0x1.7c33f2eb58f22p20 -0x1.6213f4bdep5 -0x1.084251f23cf48p6 0x1.332b651473c3fp3 -0x1.2p-27 F +REG epsg:21899 0 OK 0x1.e816369c45b0dp19 0x1.e86fc391a520bp19 -0x1.d01a56404p5 -0x1.1052dbd194238p6 0x1.2656ca290d0fcp2 0x1.8p-29 F +REG epsg:21899 1 OK 0x1.ae2b3c943afp18 0x1.b4c6c7e1b47cap18 -0x1.9ccd275a4p5 -0x1.246365b0dfcfep6 -0x1.9a935d6f11fdep-2 0x1.ap-27 T +REG epsg:21899 2 OK 0x1.7c8b6713a1e78p20 0x1.b4c6c7e21efa4p18 -0x1.e4fcc50d9p6 -0x1.f884a3e4905d2p5 -0x1.9a935d6f12463p-2 -0x1.0p-26 T +REG epsg:21899 3 OK 0x1.b5cb2fecf54b4p18 0x1.7c342a5c5f99ap20 0x1.ae5913b2p1 -0x1.246365b0eb22ep6 0x1.332b651473956p3 0x1.0p-27 F +REG epsg:21899 4 OK 0x1.7aa36a5e86c7ap20 0x1.7c342a5a031bcp20 -0x1.053df2d16p6 -0x1.f884a3e479e7fp5 0x1.332b651473c47p3 -0x1.8p-27 F +REG epsg:2190 0 OK 0x1.e83fa2a8120dep18 -0x1.a7d4afe4fc242p5 -0x1.8736919cp2 -0x1.b000000000002p4 -0x1.2f74bf1dcfcaep-64 -0x1.0p-30 T +REG epsg:2190 1 OK -0x1.adb842489075p15 -0x1.0eea0b66a86a3p19 0x1.f3fdca4p-3 -0x1.0p5 -0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:2190 2 OK 0x1.018d935f75d7ep20 -0x1.0eea0b6671941p19 -0x1.64597dd4p2 -0x1.6000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:2190 3 OK -0x1.adb9dff65a96p15 0x1.0edcccdd8421ep19 -0x1.1fd11e958p3 -0x1.0p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2190 4 OK 0x1.018da04c7e84ep20 0x1.0edcccdd4d511p19 -0x1.d9cde66fp3 -0x1.6p4 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2191 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:2191 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:2191 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:2191 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG epsg:2191 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG epsg:2192 0 OK 0x1.2503cb82dfc52p19 0x1.0c915df2fd06ap21 -0x1.a099a61b6p5 0x1.2b2a53490b9b1p1 0x1.766666666665ep5 0x1.0p-30 F +REG epsg:2192 1 OK -0x1.01a2165f3414p13 0x1.983f2393bfb98p20 -0x1.1e2cb519dp6 -0x1.3de1330a236dcp2 0x1.4e6666666665p5 0x0.0p0 F +REG epsg:2192 2 OK 0x1.27070d1d2b1d8p20 0x1.983f3acfb5628p20 -0x1.ad3fa82a2p5 0x1.3485c32997845p3 0x1.4e6666666664fp5 0x1.0p-29 F +REG epsg:2192 3 OK 0x1.7338f78bd4p16 0x1.536548e8509f7p21 -0x1.99a059ca8p5 -0x1.3de1330a236dbp2 0x1.9e666666661cep5 0x0.0p0 F +REG epsg:2192 4 OK 0x1.0dd03e75b6ce6p20 0x1.53653da26375ap21 -0x1.22eb0a7d6p5 0x1.3485c32997845p3 0x1.9e666666661cep5 0x0.0p0 F +REG epsg:2193 0 OK 0x1.86ap20 0x1.312dp23 0x0.0p0 0x1.5ap7 0x0.0p0 0x0.0p0 T +REG epsg:2193 1 OK 0x1.fe44af182796bp19 0x1.203eca48c0a19p23 0x0.0p0 0x1.500000000ea81p7 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:2193 2 OK 0x1.070ed439f61a5p21 0x1.203eca48c0a19p23 0x0.0p0 0x1.63fffffff157fp7 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:2193 3 OK 0x1.fe44af182796bp19 0x1.421b35b73f5e7p23 0x0.0p0 0x1.500000000ea81p7 0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:2193 4 OK 0x1.070ed439f61a5p21 0x1.421b35b73f5e7p23 0x0.0p0 0x1.63fffffff157fp7 0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:2194 0 OK 0x1.e8b7b1afe83p18 -0x1.c2524d1c69d8fp10 -0x1.3f22eb378p5 -0x1.54p7 -0x1.c888888888669p3 0x0.0p0 F +REG epsg:2194 1 OK -0x1.39db5c686e6cap20 -0x1.c10f16179abc6p20 -0x1.c0b719d8p0 -0x1.5e5176f75656dp7 -0x1.344444444433bp4 0x1.0p-30 F +REG epsg:2194 2 OK 0x1.171b9bdd79781p21 -0x1.c10ea966a8cadp20 0x1.55da05e38p4 -0x1.49ae8908a9a94p7 -0x1.344444444432ep4 0x1.0p-30 F +REG epsg:2194 3 OK -0x1.4d8bc12b8e586p20 0x1.b617d7f6e6a3p20 -0x1.879645dbfp6 -0x1.5e5176f75656dp7 -0x1.28888888886ecp3 0x1.0p-29 F +REG epsg:2194 4 OK 0x1.20f3cb6a5fff5p21 0x1.b6176ab07ca0fp20 -0x1.26e732939p6 -0x1.49ae8908a9a94p7 -0x1.28888888886d6p3 -0x1.8p-29 F +REG epsg:2195 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:2195 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2195 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2195 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2195 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2196 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.3p3 0x0.0p0 0x0.0p0 T +REG epsg:2196 1 OK -0x1.5ad736202ab3cp18 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.20000001d501dp2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2196 2 OK 0x1.70bb9b101559ep19 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.cfffffff157f3p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2196 3 OK -0x1.5ad736202ab3cp18 0x1.0efba3766bdbdp19 0x0.0p0 0x1.20000001d501dp2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2196 4 OK 0x1.70bb9b101559ep19 0x1.0efba3766bdbdp19 0x0.0p0 0x1.cfffffff157f3p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2197 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:2197 1 OK -0x1.aef9b101559ep15 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.c0000001d501ep2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2197 2 OK 0x1.019bcd880aacfp20 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2197 3 OK -0x1.aef9b101559ep15 0x1.0efba3766bdbdp19 0x0.0p0 0x1.c0000001d501ep2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2197 4 OK 0x1.019bcd880aacfp20 0x1.0efba3766bdbdp19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2198 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:2198 1 OK 0x1.50b9d9420d07cp18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.40000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2198 2 OK 0x1.634589af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2198 3 OK 0x1.50b9d9420d07cp18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.40000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2198 4 OK 0x1.634589af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2199 0 OK 0x1.12a9f62c619f6p22 0x1.68c721f22456cp6 -0x1.b95cfb06p3 0x1.4ffffffe1113bp4 0x1.0633651ef47b1p-26 0x1.2a59e8p-9 T +REG epsg:2199 1 OK 0x1.e18db1ae00a89p21 -0x1.0ef361291fb76p19 -0x1.030edbe7cp4 0x1.fffffffc35e4bp3 -0x1.3ffffff02adc2p2 0x1.18d788p-9 F +REG epsg:2199 2 OK 0x1.348cce795cfd6p22 -0x1.0ef5bbd3fd531p19 -0x1.2d6350facp4 0x1.9ffffffdb7bbap4 -0x1.3fffffeeee6edp2 0x1.e244ap-10 F +REG epsg:2199 3 OK 0x1.e18e4076db8abp21 0x1.0f0c131391b27p19 -0x1.2d2e26808p3 0x1.fffffffd11fedp3 0x1.4000000ed9e65p2 0x1.61a08p-9 F +REG epsg:2199 4 OK 0x1.348d1120e6397p22 0x1.0f0a22a3720b9p19 -0x1.827af97a8p3 0x1.9ffffffe063cbp4 0x1.400000108e6b8p2 0x1.40e55p-9 F +REG epsg:2200 0 OK 0x1.24f8p18 0x1.86a0000000009p19 0x0.0p0 -0x1.0ap6 0x1.7400000000001p5 0x0.0p0 F +REG epsg:2200 1 OK -0x1.2c05ca0703d76p18 0x1.0895f3c10fddp18 0x0.0p0 -0x1.270e06f120d03p6 0x1.4c00000000006p5 0x0.0p0 F +REG epsg:2200 2 OK 0x1.bafae50381eb2p19 0x1.0895f3c10fddp18 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4c00000000006p5 0x0.0p0 F +REG epsg:2200 3 OK -0x1.900d86fa44c38p17 0x1.510cdb26819bcp20 0x0.0p0 -0x1.270e06f120d03p6 0x1.9cp5 0x0.0p0 F +REG epsg:2200 4 OK 0x1.88fb61be91306p19 0x1.510cdb26819bcp20 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 0x0.0p0 F +REG epsg:2201 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2201 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:2201 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:2201 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:2201 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:2202 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:2202 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:2202 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:2202 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:2202 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:2203 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:2203 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:2203 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:2203 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:2203 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:22032 0 OK 0x1.e89bce803a8bbp18 0x1.b99b086ca94bap22 -0x1.a557425acp5 0x1.2000000000001p3 -0x1.9000000000001p4 0x1.8p-29 F +REG epsg:22032 1 OK -0x1.f6b8d373741ap14 0x1.970490c69038ep22 -0x1.38c83c77ap6 0x1.bdd68fcf51a36p1 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:22032 2 OK 0x1.f851957bc9816p19 0x1.970490c55fd82p22 -0x1.65a8e9404p4 0x1.d08a5c0c2b973p3 -0x1.e000000000005p4 0x1.0p-30 F +REG epsg:22032 3 OK -0x1.2e8db2eb0d24p16 0x1.dace0a6dcfad6p22 -0x1.4b2de4c26p6 0x1.bdd68fcf51a36p1 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:22032 4 OK 0x1.0736c2b2ee83ap20 0x1.dace0a6cae1f3p22 -0x1.633d3724p4 0x1.d08a5c0c2b973p3 -0x1.4000000000003p4 0x1.8p-29 F +REG epsg:22033 0 OK 0x1.e8989d0df76dfp18 0x1.b99b42b0eb5d4p22 -0x1.56af04854p4 0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x1.0p-30 F +REG epsg:22033 1 OK -0x1.f6e1f40e32eep14 0x1.9704d631a378p22 -0x1.7b461ee2ap5 0x1.2f75a3f3d469p3 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:22033 2 OK 0x1.f84fad0bf9735p19 0x1.9704d6307e7f6p22 0x1.9383f677p2 0x1.48452e0615cb9p4 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:22033 3 OK -0x1.2e97891353e48p16 0x1.dace39f8c68f4p22 -0x1.8b1d9c88ap5 0x1.2f75a3f3d468dp3 -0x1.4p4 0x1.0p-29 F +REG epsg:22033 4 OK 0x1.0735c7594de78p20 0x1.dace39f7afdf4p22 0x1.1c9db518p3 0x1.48452e0615cb9p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2204 0 OK 0x1.e848000000005p20 0x1.98ae6165757c9p18 0x0.0p0 -0x1.58p6 0x1.1c55555555525p5 0x0.0p0 F +REG epsg:2204 1 OK 0x1.48a9b01bb5104p20 -0x1.9cce8b3075516p17 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.0e5555555551bp5 0x0.0p0 F +REG epsg:2204 2 OK 0x1.43f327f22578cp21 -0x1.9cce8b3075516p17 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.0e5555555551bp5 0x0.0p0 F +REG epsg:2204 3 OK 0x1.4f7f8bea72af4p20 0x1.0365632baf946p20 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.2a5555555552dp5 0x0.0p0 F +REG epsg:2204 4 OK 0x1.40883a0ac6a93p21 0x1.0365632baf946p20 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.2a5555555552dp5 0x0.0p0 F +REG epsg:2205 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:2205 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2205 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2205 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2205 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2206 0 OK 0x1.21eb1fa515f06p23 0x1.e40285d1a020cp6 -0x1.01fae5091p7 0x1.bp4 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:2206 1 OK 0x1.10f99629e1eb2p23 -0x1.0ef1658382673p19 -0x1.1fd894672p7 0x1.6000000075f26p4 -0x1.3fffffffeabf8p2 -0x1.0p-30 F +REG epsg:2206 2 OK 0x1.32dca9219edf1p23 -0x1.0ef16583d0847p19 -0x1.0f3cf3218p7 0x1.ffffffff89ee9p4 -0x1.3fffffffeab92p2 0x1.0p-29 F +REG epsg:2206 3 OK 0x1.10f999da9d36ep23 0x1.0f0fa56acf1afp19 -0x1.eb530d324p6 0x1.6000000075ef8p4 0x1.3fffffffeabd3p2 0x0.0p0 F +REG epsg:2206 4 OK 0x1.32dca570ba1d8p23 0x1.0f0fa56b1d495p19 -0x1.ca1bd1e62p6 0x1.ffffffff89f16p4 0x1.3fffffffeab6ep2 0x1.0p-29 F +REG epsg:2207 0 OK 0x1.406f92be1c7c3p23 0x1.e4027a2004951p6 -0x1.fa9e354d6p6 0x1.dffffffffffffp4 0x1.c72f1eacb7b03p-62 0x1.0p-30 T +REG epsg:2207 1 OK 0x1.2f7e09aaa38ddp23 -0x1.0ef15ef394d56p19 -0x1.1a171a8108p7 0x1.9000000075f47p4 -0x1.3fffffffeabf1p2 -0x1.8p-29 F +REG epsg:2207 2 OK 0x1.51611bd2bc5ecp23 -0x1.0ef15ef3d869ep19 -0x1.0bb901e3e8p7 0x1.17ffffffc4f86p5 -0x1.3fffffffeab9ap2 0x1.0p-29 F +REG epsg:2207 3 OK 0x1.2f7e0d5b61615p23 0x1.0f0f9eda27eap19 -0x1.dfd01be8fp6 0x1.9000000075f19p4 0x1.3fffffffeabcfp2 -0x1.8p-29 F +REG epsg:2207 4 OK 0x1.51611821daad4p23 0x1.0f0f9eda6b8d4p19 -0x1.c313f0f3ap6 0x1.17ffffffc4f9ep5 0x1.3fffffffeab76p2 0x1.0p-30 F +REG epsg:2208 0 OK 0x1.5ef4059d14dfbp23 0x1.e4027023412bcp6 -0x1.f2a39e996p6 0x1.07fffffffffffp5 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:2208 1 OK 0x1.4e027ce23030cp23 -0x1.0ef15958cd291p19 -0x1.14fdc20a88p7 0x1.c000000075f63p4 -0x1.3fffffffeabebp2 -0x1.0p-30 F +REG epsg:2208 2 OK 0x1.6fe58e58f1bb4p23 -0x1.0ef159590605p19 -0x1.08e746c6fp7 0x1.2fffffffc4f9bp5 -0x1.3fffffffeab9fp2 -0x1.0p-30 F +REG epsg:2208 3 OK 0x1.4e028092f0a29p23 0x1.0f0f993ec1b4ep19 -0x1.d59d6d356p6 0x1.c000000075f39p4 0x1.3fffffffeabc5p2 0x1.0p-29 F +REG epsg:2208 4 OK 0x1.6fe58aa8131c6p23 0x1.0f0f993efa9d6p19 -0x1.bd707bf48p6 0x1.2fffffffc4fafp5 0x1.3fffffffeab7dp2 0x1.0p-30 F +REG epsg:2209 0 OK 0x1.7d78784b35572p23 0x1.e40267e257b55p6 -0x1.ec0b9f1dbp6 0x1.2p5 0x1.c72f1eacb7b05p-62 0x0.0p0 T +REG epsg:2209 1 OK 0x1.6c86efd97febfp23 -0x1.0ef154b71a049p19 -0x1.10901ee54p7 0x1.f000000075f89p4 -0x1.3fffffffeabe1p2 -0x1.0p-30 F +REG epsg:2209 2 OK 0x1.8e6a00bdb3766p23 -0x1.0ef154b747ffep19 -0x1.06c9bc2ecp7 0x1.47ffffffc4fa9p5 -0x1.3fffffffeaba9p2 -0x1.0p-30 F +REG epsg:2209 3 OK 0x1.6c86f38a4310bp23 0x1.0f0f949c8b8d6p19 -0x1.ccc228d99p6 0x1.f000000075f5ep4 0x1.3fffffffeabbep2 0x1.0p-30 F +REG epsg:2209 4 OK 0x1.8e69fd0cd7eabp23 0x1.0f0f949cb992cp19 -0x1.b93567b09p6 0x1.47ffffffc4fcp5 0x1.3fffffffeab85p2 0x0.0p0 F +REG epsg:22091 0 OK 0x1.e89a95da3d114p18 0x1.312ecdd08f54ap23 0x1.c2f581a2p2 0x1.7000000000001p3 -0x1.27320989f80adp-48 -0x1.0p-30 T +REG epsg:22091 1 OK -0x1.aae2646ba35ap15 0x1.2040990fc0648p23 -0x1.4052edd32p5 0x1.a0000001df19ap2 -0x1.3fffffffea654p2 -0x1.cp-27 F +REG epsg:22091 2 OK 0x1.01a45e5e2415ep20 0x1.2040990f9e2cp23 0x1.15843daf4p4 0x1.07ffffff87602p4 -0x1.3fffffffea378p2 0x1.8p-27 F +REG epsg:22091 3 OK -0x1.aadb5a5e5ab5p15 0x1.421d028975a88p23 0x1.d5937ecp-3 0x1.a0000001df041p2 0x1.3fffffffea61p2 -0x1.4p-27 F +REG epsg:22091 4 OK 0x1.01a425fca3765p20 0x1.421d028997ef4p23 0x1.cce9e0ebcp5 0x1.07ffffff87659p4 0x1.3fffffffea335p2 0x1.4p-27 F +REG epsg:22092 0 OK 0x1.e89a5280f244ep18 0x1.312ecdd08193p23 0x1.3d9dfbffp3 0x1.8000000000001p3 0x1.546cc826418b7p-50 -0x1.0p-30 T +REG epsg:22092 1 OK -0x1.aae3ff495509p15 0x1.204099911fe58p23 -0x1.28bbb4f7ap5 0x1.c0000001df1adp2 -0x1.3fffffffea64dp2 -0x1.cp-27 F +REG epsg:22092 2 OK 0x1.01a449882f447p20 0x1.20409990fdc86p23 0x1.41c5eb028p4 0x1.0fffffff87609p4 -0x1.3fffffffea38p2 0x1.0p-27 F +REG epsg:22092 3 OK -0x1.aadcf53bcdb7p15 0x1.421d0207fadbcp23 0x1.96cc2864p1 0x1.c0000001df054p2 0x1.3fffffffea608p2 -0x1.6p-27 F +REG epsg:22092 4 OK 0x1.01a41126ba9fep20 0x1.421d02081d071p23 0x1.e30aae5ep5 0x1.0fffffff87661p4 0x1.3fffffffea334p2 0x1.8p-27 F +REG epsg:2210 0 OK 0x1.9bfcead1d6626p23 0x1.e402616312994p6 -0x1.e6dad736fp6 0x1.37ffffffffffep5 0x0.0p0 0x1.0p-30 T +REG epsg:2210 1 OK 0x1.8b0b6299b7e7ap23 -0x1.0ef15111bb495p19 -0x1.0cd14c7838p7 0x1.100000003afd7p5 -0x1.3fffffffeabdcp2 -0x1.0p-30 F +REG epsg:2210 2 OK 0x1.acee730a8d898p23 -0x1.0ef15111de434p19 -0x1.0561de1298p7 0x1.5fffffffc4fbbp5 -0x1.3fffffffeabafp2 -0x1.0p-29 F +REG epsg:2210 3 OK 0x1.8b0b664a7dd22p23 0x1.0f0f90f6c5b0cp19 -0x1.c54485a1ep6 0x1.100000003afc2p5 0x1.3fffffffeabbbp2 -0x1.0p-30 F +REG epsg:2210 4 OK 0x1.acee6f59b50f5p23 0x1.0f0f90f6e8b25p19 -0x1.b665ac151p6 0x1.5fffffffc4fd2p5 0x1.3fffffffeab89p2 0x1.0p-28 F +REG epsg:2211 0 OK 0x1.ba815d3a6c36ap23 0x1.e4025caa00c82p6 -0x1.e314eb371p6 0x1.5p5 0x1.c72f1eacb7b05p-62 0x0.0p0 T +REG epsg:2211 1 OK 0x1.a98fd52c23f23p23 -0x1.0ef14e6b3fcf7p19 -0x1.09c3eb821p7 0x1.280000003afe8p5 -0x1.3fffffffeabd5p2 -0x1.0p-29 F +REG epsg:2211 2 OK 0x1.cb72e5491cb29p23 -0x1.0ef14e6b57af9p19 -0x1.04b0a8f168p7 0x1.77ffffffc4fcdp5 -0x1.3fffffffeabb7p2 -0x1.0p-29 F +REG epsg:2211 3 OK 0x1.a98fd8dcecb34p23 0x1.0f0f8e4fff3f7p19 -0x1.bf29c50a7p6 0x1.280000003afdp5 0x1.3fffffffeabb2p2 -0x1.0p-30 F +REG epsg:2211 4 OK 0x1.cb72e1984746p23 0x1.0f0f8e501724ap19 -0x1.b50342201p6 0x1.77ffffffc4fe4p5 0x1.3fffffffeab91p2 -0x1.0p-30 F +REG epsg:2212 0 OK 0x1.d905cf8e801c4p23 0x1.e40259ba72874p6 -0x1.e0bc80d78p6 0x1.67fffffffffffp5 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2212 1 OK 0x1.c814479a2ffadp23 -0x1.0ef14cc5839bcp19 -0x1.076a20411p7 0x1.400000003aff9p5 -0x1.3fffffffeabcep2 -0x1.0p-29 F +REG epsg:2212 2 OK 0x1.e9f7578307b64p23 -0x1.0ef14cc59050fp19 -0x1.04b69920b8p7 0x1.8fffffffc4fep5 -0x1.3fffffffeabbep2 0x0.0p0 F +REG epsg:2212 3 OK 0x1.c8144b4afba16p23 0x1.0f0f8caa1472ep19 -0x1.ba762f8f3p6 0x1.400000003afe4p5 0x1.3fffffffeababp2 -0x1.0p-29 F +REG epsg:2212 4 OK 0x1.e9f753d235515p23 0x1.0f0f8caa212acp19 -0x1.b50f227c3p6 0x1.8fffffffc4ff4p5 0x1.3fffffffeab9ap2 -0x1.0p-30 F +REG epsg:2213 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:2213 1 OK -0x1.ad750e7d8698p15 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2213 2 OK 0x1.018fa873ec34ep20 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.17ffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2213 3 OK -0x1.ad750e7d8698p15 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2213 4 OK 0x1.018fa873ec34ep20 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.17ffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2214 0 OK 0x1.e858c29fec2bp19 0x1.e852f399d519ap19 -0x1.08339a1bcp4 0x1.5000000000002p3 -0x1.d43922e2ff9e1p-53 -0x1.0p-30 T +REG epsg:2214 1 OK 0x1.b30da3b063b96p18 0x1.b33214694b52p18 -0x1.272faa3acp5 0x1.60000001d74dcp2 -0x1.3fffffffeac5bp2 -0x1.8p-28 F +REG epsg:2214 2 OK 0x1.7b9559d15772p20 0x1.b332146794442p18 -0x1.b2f7dc138p3 0x1.efffffff13ab4p3 -0x1.3fffffffeab3bp2 0x1.0p-29 F +REG epsg:2214 3 OK 0x1.b30df92d74b7ap18 0x1.7b866e680dc32p20 -0x1.59c7b222cp4 0x1.60000001d745ep2 0x1.3fffffffeac44p2 -0x1.0p-27 F +REG epsg:2214 4 OK 0x1.7b95446f71334p20 0x1.7b866e687b97ep20 0x1.b1b79534p0 0x1.efffffff13af8p3 0x1.3fffffffeab2p2 0x1.0p-28 F +REG epsg:2215 0 OK 0x1.e86ab2395e591p18 0x1.4b1188199bcafp5 -0x1.26cabee58p4 0x1.2p3 0x1.2f74bf1dcfcacp-64 0x1.8p-29 T +REG epsg:2215 1 OK -0x1.ac630c5cc067p15 -0x1.0ede672000276p19 -0x1.013a98a98p5 0x1.0000000000002p2 -0x1.4p2 -0x1.8p-29 F +REG epsg:2215 2 OK 0x1.0198719d3b462p20 -0x1.0ede6720e64cp19 -0x1.016dfd1fp3 0x1.c000000000001p3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2215 3 OK -0x1.ac61c94844d6p15 0x1.0ee8bf958dde9p19 -0x1.8efb9443p4 0x1.0p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2215 4 OK 0x1.019867834e0adp20 0x1.0ee8bf9674142p19 -0x1.a7afc988p-1 0x1.c000000000001p3 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2216 0 OK 0x1.e81271df9da06p18 0x1.79dd1040fd0f5p7 -0x1.ede9767de8p7 -0x1.97fffffffffffp5 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:2216 1 OK -0x1.af4f4973ab5ap15 -0x1.0ece7318dc7f8p19 -0x1.e852b85ep7 -0x1.c000000000001p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2216 2 OK 0x1.0183b30a4f677p20 -0x1.0ece73177f607p19 -0x1.195fc5c6dp8 -0x1.7p5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:2216 3 OK -0x1.af49859ca1fcp15 0x1.0efdae54da093p19 -0x1.a66e867e2p7 -0x1.cp5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2216 4 OK 0x1.018384f4a7efep20 0x1.0efdae537c72dp19 -0x1.f0db4050dp7 -0x1.7p5 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:2217 0 OK 0x1.e812a1ee0f5e8p18 0x1.79dd67e67027ap7 -0x1.0d60dda7f4p8 -0x1.68p5 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:2217 1 OK -0x1.af51ad5e22abp15 -0x1.0eceb2113f1bep19 -0x1.0a7a99e948p8 -0x1.8ffffffffffffp5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2217 2 OK 0x1.0183de3113fb8p20 -0x1.0eceb20fe35ddp19 -0x1.2f8f9f25b4p8 -0x1.4p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:2217 3 OK -0x1.af4be9839d9ap15 0x1.0efded581b39cp19 -0x1.d310f2bcbp7 -0x1.8ffffffffffffp5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2217 4 OK 0x1.0183b01b4887fp20 0x1.0efded56bf04dp19 -0x1.0e9d71f7acp8 -0x1.4p5 0x1.3fffffffffffep2 -0x1.0p-29 F +REG epsg:22171 0 OK 0x1.6e36p20 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.2p6 -0x1.64p6 0x0.0p0 F +REG epsg:22171 1 OK 0x1.5698411b88857p20 0x1.b45655538e461p15 0x0.0p0 0x1.bp6 -0x1.68329508fef8bp6 0x0.0p0 F +REG epsg:22171 2 OK 0x1.85d3bee4777a9p20 0x1.b45655538e464p15 0x0.0p0 0x1.bp6 -0x1.68329508fef8bp6 0x0.0p0 F +REG epsg:22171 3 OK 0x1.f01c5648f332bp19 0x1.113262ef4fcfdp18 0x0.0p0 0x1.bp6 -0x1.68d3a0e26d577p6 0x0.0p0 F +REG epsg:22171 4 OK 0x1.e45dd4db8666ap20 0x1.113262ef4fcffp18 0x0.0p0 0x1.bp6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:22172 0 OK 0x1.312dp21 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG epsg:22172 1 OK 0x1.255e208dc442bp21 0x1.b45655538e464p15 0x0.0p0 0x1.bcp6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:22172 2 OK 0x1.3cfbdf723bbd5p21 0x1.b45655538e464p15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:22172 3 OK 0x1.ec322b2479996p20 0x1.113262ef4fcffp18 0x0.0p0 0x1.bcp6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:22172 4 OK 0x1.6c40ea6dc3335p21 0x1.113262ef4fcffp18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:22173 0 OK 0x1.ab3fp21 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.08p6 -0x1.64p6 0x0.0p0 F +REG epsg:22173 1 OK 0x1.9f70208dc442bp21 0x1.b45655538e464p15 0x0.0p0 0x1.c8p6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:22173 2 OK 0x1.b70ddf723bbd5p21 0x1.b45655538e461p15 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:22173 3 OK 0x1.702b15923cccbp21 0x1.113262ef4fcffp18 0x0.0p0 0x1.c8p6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:22173 4 OK 0x1.e652ea6dc3335p21 0x1.113262ef4fcfdp18 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:22174 0 OK 0x1.12a88p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.f8p5 -0x1.64p6 0x0.0p0 F +REG epsg:22174 1 OK 0x1.0cc11046e2216p22 0x1.b45655538e461p15 0x0.0p0 0x1.d4p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22174 2 OK 0x1.188fefb91ddeap22 0x1.b45655538e464p15 0x0.0p0 0x1.d4p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22174 3 OK 0x1.ea3d15923cccbp21 0x1.113262ef4fcfdp18 0x0.0p0 0x1.d4p6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:22174 4 OK 0x1.30327536e199ap22 0x1.113262ef4fcffp18 0x0.0p0 0x1.d4p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:22175 0 OK 0x1.4fb18p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 F +REG epsg:22175 1 OK 0x1.49ca1046e2216p22 0x1.b45655538e464p15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22175 2 OK 0x1.5598efb91ddeap22 0x1.b45655538e464p15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22175 3 OK 0x1.32278ac91e666p22 0x1.113262ef4fcffp18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:22175 4 OK 0x1.6d3b7536e199ap22 0x1.113262ef4fcffp18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:22176 0 OK 0x1.8cba8p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.c800000000001p5 -0x1.64p6 0x0.0p0 F +REG epsg:22176 1 OK 0x1.86d31046e2216p22 0x1.b45655538e464p15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22176 2 OK 0x1.92a1efb91ddeap22 0x1.b45655538e461p15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22176 3 OK 0x1.6f308ac91e666p22 0x1.113262ef4fcffp18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:22176 4 OK 0x1.aa447536e199bp22 0x1.113262ef4fcfdp18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0e26d579p6 0x0.0p0 F +REG epsg:22177 0 OK 0x1.c9c38p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.bp5 -0x1.64p6 0x0.0p0 F +REG epsg:22177 1 OK 0x1.c3dc1046e2216p22 0x1.b45655538e461p15 0x0.0p0 0x1.f8p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22177 2 OK 0x1.cfaaefb91ddeap22 0x1.b45655538e464p15 0x0.0p0 0x1.f8p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:22177 3 OK 0x1.ac398ac91e665p22 0x1.113262ef4fcfdp18 0x0.0p0 0x1.f8p6 -0x1.68d3a0e26d579p6 0x0.0p0 F +REG epsg:22177 4 OK 0x1.e74d7536e199ap22 0x1.113262ef4fcffp18 0x0.0p0 0x1.f8p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:22181 0 OK 0x1.6e36p20 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.2p6 -0x1.64p6 0x0.0p0 F +REG epsg:22181 1 OK 0x1.5698411b8a317p20 0x1.b45655536f62cp15 0x0.0p0 0x1.bp6 -0x1.68329508fef9dp6 0x0.0p0 F +REG epsg:22181 2 OK 0x1.85d3bee475ce8p20 0x1.b45655536f62fp15 0x0.0p0 0x1.bp6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22181 3 OK 0x1.f01c564903ce4p19 0x1.113262ef3c9d4p18 0x0.0p0 0x1.bp6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22181 4 OK 0x1.e45dd4db7e18ep20 0x1.113262ef3c9d7p18 0x0.0p0 0x1.bp6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22182 0 OK 0x1.312dp21 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG epsg:22182 1 OK 0x1.255e208dc518cp21 0x1.b45655536f62fp15 0x0.0p0 0x1.bcp6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22182 2 OK 0x1.3cfbdf723ae74p21 0x1.b45655536f62fp15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22182 3 OK 0x1.ec322b2481e72p20 0x1.113262ef3c9d7p18 0x0.0p0 0x1.bcp6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22182 4 OK 0x1.6c40ea6dbf0c7p21 0x1.113262ef3c9d7p18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22183 0 OK 0x1.ab3fp21 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.08p6 -0x1.64p6 0x0.0p0 F +REG epsg:22183 1 OK 0x1.9f70208dc518cp21 0x1.b45655536f62fp15 0x0.0p0 0x1.c8p6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22183 2 OK 0x1.b70ddf723ae74p21 0x1.b45655536f62cp15 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68329508fef9cp6 0x0.0p0 F +REG epsg:22183 3 OK 0x1.702b159240f39p21 0x1.113262ef3c9d7p18 0x0.0p0 0x1.c8p6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22183 4 OK 0x1.e652ea6dbf0c7p21 0x1.113262ef3c9d4p18 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22184 0 OK 0x1.12a88p22 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.f8p5 -0x1.64p6 0x0.0p0 F +REG epsg:22184 1 OK 0x1.0cc11046e28c6p22 0x1.b45655536f62cp15 0x0.0p0 0x1.d4p6 -0x1.68329508fef9cp6 0x0.0p0 F +REG epsg:22184 2 OK 0x1.188fefb91d73ap22 0x1.b45655536f62fp15 0x0.0p0 0x1.d4p6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22184 3 OK 0x1.ea3d159240f39p21 0x1.113262ef3c9d4p18 0x0.0p0 0x1.d4p6 -0x1.68d3a0e26d59dp6 0x0.0p0 F +REG epsg:22184 4 OK 0x1.30327536df863p22 0x1.113262ef3c9d7p18 0x0.0p0 0x1.d4p6 -0x1.68d3a0e26d59ap6 0x0.0p0 F +REG epsg:22185 0 OK 0x1.4fb18p22 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 F +REG epsg:22185 1 OK 0x1.49ca1046e28c6p22 0x1.b45655536f62fp15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22185 2 OK 0x1.5598efb91d73ap22 0x1.b45655536f62fp15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22185 3 OK 0x1.32278ac92079dp22 0x1.113262ef3c9d7p18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0e26d59ap6 0x0.0p0 F +REG epsg:22185 4 OK 0x1.6d3b7536df863p22 0x1.113262ef3c9d7p18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0e26d59ap6 0x0.0p0 F +REG epsg:22186 0 OK 0x1.8cba8p22 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.c800000000001p5 -0x1.64p6 0x0.0p0 F +REG epsg:22186 1 OK 0x1.86d31046e28c6p22 0x1.b45655536f62fp15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22186 2 OK 0x1.92a1efb91d73ap22 0x1.b45655536f62cp15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508fef9cp6 0x0.0p0 F +REG epsg:22186 3 OK 0x1.6f308ac92079dp22 0x1.113262ef3c9d7p18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0e26d59ap6 0x0.0p0 F +REG epsg:22186 4 OK 0x1.aa447536df864p22 0x1.113262ef3c9d4p18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0e26d5ap6 0x0.0p0 F +REG epsg:22187 0 OK 0x1.c9c38p22 0x1.b44ddd6afe25p16 0x0.0p0 -0x1.bp5 -0x1.64p6 0x0.0p0 F +REG epsg:22187 1 OK 0x1.c3dc1046e28c6p22 0x1.b45655536f62cp15 0x0.0p0 0x1.f8p6 -0x1.68329508fef9cp6 0x0.0p0 F +REG epsg:22187 2 OK 0x1.cfaaefb91d73ap22 0x1.b45655536f62fp15 0x0.0p0 0x1.f8p6 -0x1.68329508fef8dp6 0x0.0p0 F +REG epsg:22187 3 OK 0x1.ac398ac92079cp22 0x1.113262ef3c9d4p18 0x0.0p0 0x1.f8p6 -0x1.68d3a0e26d5ap6 0x0.0p0 F +REG epsg:22187 4 OK 0x1.e74d7536df863p22 0x1.113262ef3c9d7p18 0x0.0p0 0x1.f8p6 -0x1.68d3a0e26d59ap6 0x0.0p0 F +REG epsg:2219 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:2219 1 OK -0x1.ad74b58702bfp15 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.28p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2219 2 OK 0x1.018fa5ac38159p20 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:2219 3 OK -0x1.ad74b58702bfp15 0x1.0ee355cc581aep19 0x0.0p0 -0x1.28p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2219 4 OK 0x1.018fa5ac38159p20 0x1.0ee355cc581aep19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:22191 0 OK 0x1.6e3c2bb281d47p20 0x1.b4fe223ec4305p16 -0x1.0a75b58dep6 -0x1.2000000000003p6 -0x1.63fffffffffffp6 -0x1.0p-30 F +REG epsg:22191 1 OK 0x1.569e5c463cb1ap20 0x1.b5b5bc4f74f38p15 -0x1.168a0d80fp6 0x1.12d6c9e97b59p7 -0x1.67fe284313f9p6 0x1.d1bdp-13 F +REG epsg:22191 2 OK 0x1.85d9fb18482ecp20 0x1.b5b5bc1cf6691p15 -0x1.0a9a199e1p6 0x1.12d6c9e97b59p7 -0x1.67fe28432263cp6 0x1.7e05c348p1 F +REG epsg:22191 3 EXC:java.lang.IllegalStateException 0x1.f02819e3a03dbp19 0x1.115effc339355p18 -0x1.19f5ce3a2p6 NaN NaN NaN F +REG epsg:22191 4 EXC:java.lang.IllegalStateException 0x1.e4644b48dd1e1p20 0x1.115efeac09e25p18 -0x1.bcb15410cp5 NaN NaN NaN F +REG epsg:22192 0 OK 0x1.312fcb765b7a3p21 0x1.b5030f6d52913p16 -0x1.0a1da8676p6 -0x1.1400000000004p6 -0x1.64p6 -0x1.0p-30 F +REG epsg:22192 1 OK 0x1.2560e3c1885f9p21 0x1.b5bf973e78eb5p15 -0x1.15ce2018ap6 0x1.12d6c9e97b646p7 -0x1.67fe284314dbfp6 0x1.784f3fcp-3 F +REG epsg:22192 2 OK 0x1.3cfeb3283e567p21 0x1.b5bf9710be793p15 -0x1.0afdf9da4p6 0x1.12d6c9e97b646p7 -0x1.67fe284321eb2p6 0x1.7189bbc4p1 F +REG epsg:22192 3 EXC:java.lang.IllegalStateException 0x1.ec3778694d045p20 0x1.11603bae46983p18 -0x1.164b50258p6 NaN NaN NaN F +REG epsg:22192 4 EXC:java.lang.IllegalStateException 0x1.6c43db18d292bp21 0x1.11603ab165badp18 -0x1.c096de942p5 NaN NaN NaN F +REG epsg:22193 0 OK 0x1.ab417f1d70006p21 0x1.b5077e522c8d8p16 -0x1.09ce6c66fp6 -0x1.0800000000005p6 -0x1.64p6 -0x1.0p-29 F +REG epsg:22193 1 OK 0x1.9f729769cfa63p21 0x1.b5c8758b2d3c8p15 -0x1.1512d0171p6 0x1.12d6c9e97b701p7 -0x1.67fe284315be3p6 0x1.7777a17p-2 F +REG epsg:22193 2 OK 0x1.b71066ce71108p21 0x1.b5c875625626dp15 -0x1.0b6a0dd66p6 0x1.12d6c9e97b701p7 -0x1.67fe28432168ap6 0x1.64073c42p1 F +REG epsg:22193 3 EXC:java.lang.IllegalStateException 0x1.702d6ff6aadf3p21 0x1.116157f5464c9p18 -0x1.12a3e4237p6 NaN NaN NaN F +REG epsg:22193 4 EXC:java.lang.IllegalStateException 0x1.e6558e9aa19b1p21 0x1.11615713644e1p18 -0x1.c4ce54fe6p5 NaN NaN NaN F +REG epsg:22194 0 OK 0x1.12a99882085bap22 0x1.b50b6bd0fe425p16 -0x1.098839254p6 -0x1.f7fffffffffeap5 -0x1.64p6 -0x1.0p-29 F +REG epsg:22194 1 OK 0x1.0cc224a8c2c8dp22 0x1.b5d050fc8d735p15 -0x1.1458a0eacp6 0x1.12d6c9e97b7cp7 -0x1.67fe2843169f1p6 0x1.18d366d8p-1 F +REG epsg:22194 2 OK 0x1.18910c5a27914p22 0x1.b5d050d8b59f6p15 -0x1.0bde09bc3p6 0x1.12d6c9e97b7cp7 -0x1.67fe284320dc8p6 0x1.5587bf88p1 F +REG epsg:22194 3 EXC:java.lang.IllegalStateException 0x1.ea3f21f474709p21 0x1.116253d0c009dp18 -0x1.0f021a90ep6 NaN NaN NaN F +REG epsg:22194 4 EXC:java.lang.IllegalStateException 0x1.3033a02fc3fffp22 0x1.1162530a7a755p18 -0x1.c954c1e0ep5 NaN NaN NaN F +REG epsg:22195 0 OK 0x1.4fb270b08542p22 0x1.b50ed5283f67cp16 -0x1.094b3fe43p6 -0x1.dffffffffffe1p5 -0x1.64p6 -0x1.0p-30 F +REG epsg:22195 1 OK 0x1.49cafcd7bb235p22 0x1.b5d7240f3752p15 -0x1.13a015383p6 0x1.12d6c9e97b882p7 -0x1.67fe2843177dfp6 0x1.7519402p-1 F +REG epsg:22195 2 OK 0x1.5599e48852ff1p22 0x1.b5d723f077393p15 -0x1.0c599c29bp6 0x1.12d6c9e97b882p7 -0x1.67fe284320475p6 0x1.461571d8p1 F +REG epsg:22195 3 EXC:java.lang.IllegalStateException 0x1.322869325fe83p22 0x1.11632e8ffb137p18 -0x1.0b687fd77p6 NaN NaN NaN F +REG epsg:22195 4 EXC:java.lang.IllegalStateException 0x1.6d3c784f3522fp22 0x1.11632de5dc327p18 -0x1.ce26f866p5 NaN NaN NaN F +REG epsg:22196 0 OK 0x1.8cbb48361f418p22 0x1.b511b7f3229cdp16 -0x1.0917ab6cbp6 -0x1.c7ffffffffffdp5 -0x1.64p6 -0x1.0p-30 F +REG epsg:22196 1 OK 0x1.86d3d45dc11b8p22 0x1.b5dce9f94925cp15 -0x1.12e9ae7d2p6 0x1.12d6c9e97b948p7 -0x1.67fe2843185a3p6 0x1.d04c9dbp-1 F +REG epsg:22196 2 OK 0x1.92a2bc0dab9b6p22 0x1.b5dce9dfb5dbap15 -0x1.0cdc6e69ap6 0x1.12d6c9e97b948p7 -0x1.67fe28431fa94p6 0x1.35bb29dap1 F +REG epsg:22196 3 EXC:java.lang.IllegalStateException 0x1.6f3140bfb040ap22 0x1.1163e7997a3b6p18 -0x1.07d99aa1bp6 NaN NaN NaN F +REG epsg:22196 4 EXC:java.lang.IllegalStateException 0x1.aa454fc79f4d6p22 0x1.1163e70bf8ac3p18 -0x1.d3419688ep5 NaN NaN NaN F +REG epsg:22197 0 OK 0x1.c9c41f2f3d693p22 0x1.b514122b4354ep16 -0x1.08ed9fefcp6 -0x1.afffffffffff4p5 -0x1.6400000000001p6 -0x1.0p-30 F +REG epsg:22197 1 OK 0x1.c3dcab573b76p22 0x1.b5e19eadbe3a6p15 -0x1.1235ecb61p6 0x1.12d6c9e97ba11p7 -0x1.67fe284319335p6 0x1.1516c09cp0 F +REG epsg:22197 2 OK 0x1.cfab930698a51p22 0x1.b5e19e9969256p15 -0x1.0d6624b0fp6 0x1.12d6c9e97ba11p7 -0x1.67fe28431f03p6 0x1.248460fp1 F +REG epsg:22197 3 EXC:java.lang.IllegalStateException 0x1.ac3a17be8ce0ap22 0x1.11647e6b67915p18 -0x1.0457ea17ep6 NaN NaN NaN F +REG epsg:22197 4 EXC:java.lang.IllegalStateException 0x1.e74e26b572c87p22 0x1.11647dfae6016p18 -0x1.d8a107794p5 NaN NaN NaN F +REG epsg:2220 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:2220 1 OK -0x1.ad74b58702bfp15 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2220 2 OK 0x1.018fa5ac38159p20 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:2220 3 OK -0x1.ad74b58702bfp15 0x1.0ee355cc581aep19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2220 4 OK 0x1.018fa5ac38159p20 0x1.0ee355cc581aep19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:2222 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:2222 1 OK -0x1.2955adc19bf4ap20 -0x1.b1576a448ef9fp20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2222 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2222 3 OK -0x1.f51cd4f10d22bp19 0x1.c8caf79f992b3p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2222 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2223 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:2223 1 OK -0x1.2955adc19bf6cp20 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2223 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2223 3 OK -0x1.f51cd4f10d26dp19 0x1.c8caf79f992b5p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2223 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:22234 0 OK 0x1.e855045a15c2ap18 0x1.b99c4c96cf1c2p22 -0x1.726f1839p4 0x1.5p4 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:22234 1 OK -0x1.fb1e1319ee76p14 0x1.9705df573b15bp22 -0x1.0427d04dp5 0x1.ef75a3f3d468ep3 -0x1.dfffffffffffcp4 0x1.8p-29 F +REG epsg:22234 2 OK 0x1.f82df502caabfp19 0x1.9705df570bc91p22 -0x1.7d8921f2p4 0x1.a8452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:22234 3 OK -0x1.2fa5917d87858p16 0x1.dacf4494101cdp22 -0x1.5000a05bcp4 0x1.ef75a3f3d468cp3 -0x1.4p4 0x0.0p0 F +REG epsg:22234 4 OK 0x1.0724db4f05a55p20 0x1.dacf4493e31cp22 -0x1.72d7d2adp3 0x1.a8452e0615cb9p4 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:22235 0 OK 0x1.e8509e3a3f23bp18 0x1.b99c544180744p22 -0x1.30a46535cp4 0x1.bp4 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:22235 1 OK -0x1.fb6325cbf1dep14 0x1.9705e8798c29cp22 -0x1.b2494583cp4 0x1.57bad1f9ea347p4 -0x1.e000000000003p4 0x1.8p-29 F +REG epsg:22235 2 OK 0x1.f82bb77329825p19 0x1.9705e8796cd88p22 -0x1.56687c7fcp4 0x1.042297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:22235 3 OK -0x1.2fb6c72e5dap16 0x1.dacf4ad57d32cp22 -0x1.e551ae04p3 0x1.57bad1f9ea348p4 -0x1.4p4 -0x1.0p-29 F +REG epsg:22235 4 OK 0x1.0723bb96b981p20 0x1.dacf4ad55f66cp22 -0x1.1dee4f778p3 0x1.042297030ae5dp5 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:22236 0 OK 0x1.e84c1feed9f4dp18 0x1.b99c58c58145cp22 -0x1.09e43c7dp4 0x1.0800000000001p5 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:22236 1 OK -0x1.fbaa452ba59p14 0x1.9705eddac6814p22 -0x1.757a45788p4 0x1.b7bad1f9ea348p4 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:22236 2 OK 0x1.f829721d441b9p19 0x1.9705eddab783cp22 -0x1.4980e06c4p4 0x1.342297030ae5dp5 -0x1.e000000000005p4 -0x1.0p-29 F +REG epsg:22236 3 OK -0x1.2fc88635969a8p16 0x1.dacf4e84b290ap22 -0x1.615b20b4p3 0x1.b7bad1f9ea34ap4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:22236 4 OK 0x1.0722985dfb4fp20 0x1.dacf4e84a44d8p22 -0x1.01ed04e58p3 0x1.342297030ae5dp5 -0x1.4000000000003p4 -0x1.8p-29 F +REG epsg:2224 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:2224 1 OK -0x1.2959acb81e492p20 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2224 2 OK 0x1.3f92d65c0f249p21 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2224 3 OK -0x1.f5240678a3757p19 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2224 4 OK 0x1.282f019e28dd5p21 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2225 0 OK 0x1.907e0aab020c9p22 0x1.f84139ea5bec8p20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:2225 1 OK 0x1.5a9aac8aa75adp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:2225 2 OK 0x1.c66168cb5cbddp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG epsg:2225 3 OK 0x1.5e3cf1995b983p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2225 4 OK 0x1.c2bf23bca8808p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2226 0 OK 0x1.907e0aab020c9p22 0x1.f0d0c4b71a618p20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:2226 1 OK 0x1.5eab6b70b08cdp22 0x1.33306016f5618p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:2226 2 OK 0x1.c250a9e5538bdp22 0x1.33306016f5604p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:2226 3 OK 0x1.619d4b79c2d2p22 0x1.5a314358c1612p21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:2226 4 OK 0x1.bf5ec9dc4146bp22 0x1.5a314358c1608p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:2227 0 OK 0x1.907e0aab020c9p22 0x1.e66c4c0a100b3p20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:2227 1 OK 0x1.643b4190e173ep22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:2227 2 OK 0x1.bcc0d3c522a5cp22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:2227 3 OK 0x1.6677dd7c37cccp22 0x1.4a4240453b028p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:2227 4 OK 0x1.ba8437d9cc4cep22 0x1.4a4240453b028p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:22275 0 OK -0x1.147af84d38498p6 -0x1.23ff717c1e34p8 0x1.79719c138p5 0x1.dfffffffffffep3 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:22275 1 OK 0x1.0f0e2f758e56ep19 0x1.0eda1b5de37f6p19 0x1.129d941fp4 0x1.40000000f0383p3 -0x1.3fffffffea541p2 -0x1.4p-28 F +REG epsg:22275 2 OK -0x1.0f1f7746922a5p19 0x1.0eda1b5e5621p19 0x1.d2a76fc74p4 0x1.3fffffff87b67p4 -0x1.3fffffffea4adp2 -0x1.0p-30 F +REG epsg:22275 3 OK 0x1.0f0da0f7e0d3ap19 -0x1.0f231a9a7bce1p19 0x1.10445c145p6 0x1.40000000f02a7p3 0x1.3fffffffea4edp2 -0x1.8p-29 F +REG epsg:22275 4 OK -0x1.0f1ee8bfdab89p19 -0x1.0f231a9aeeacp19 0x1.4046b9b6cp6 0x1.3fffffff87bd5p4 0x1.3fffffffea458p2 0x0.0p0 F +REG epsg:22277 0 OK -0x1.fc24987351e05p5 -0x1.23ff6a7db5bb9p8 0x1.8bf71079cp5 0x1.1000000000001p4 0x0.0p0 -0x1.0p-30 T +REG epsg:22277 1 OK 0x1.0f0edc4db09e3p19 0x1.0eda14dd06e21p19 0x1.3f28c9p4 0x1.80000000f03bcp3 -0x1.3fffffffea53ep2 -0x1.8p-29 F +REG epsg:22277 2 OK -0x1.0f1ebd913cf15p19 0x1.0eda14dd703a5p19 0x1.efa20c9ccp4 0x1.5fffffff87b86p4 -0x1.3fffffffea4b3p2 0x1.0p-30 F +REG epsg:22277 3 OK 0x1.0f0e4dcfaf859p19 -0x1.0f231417e3204p19 0x1.1b67236f7p6 0x1.80000000f02ep3 0x1.3fffffffea4e6p2 0x0.0p0 F +REG epsg:22277 4 OK -0x1.0f1e2f0aed763p19 -0x1.0f2314184cbp19 0x1.47855d1b6p6 0x1.5fffffff87bf4p4 0x1.3fffffffea45cp2 -0x1.0p-30 F +REG epsg:22279 0 OK -0x1.ceb4c67125661p5 -0x1.23ff641796ed1p8 0x1.9ce93957ap5 0x1.3p4 0x0.0p0 0x1.0p-30 T +REG epsg:22279 1 OK 0x1.0f0f8c2bcd9c2p19 0x1.0eda0ee9c6a78p19 0x1.68af0b6p4 0x1.c0000000f03f7p3 -0x1.3fffffffea537p2 -0x1.8p-29 F +REG epsg:22279 2 OK -0x1.0f1e01ee09cdfp19 0x1.0eda0eea26957p19 0x1.04b056af4p5 0x1.7fffffff87ba4p4 -0x1.3fffffffea4bap2 -0x1.0p-30 F +REG epsg:22279 3 OK 0x1.0f0efdad76c49p19 -0x1.0f230e230c9aep19 0x1.25c8ae8ffp6 0x1.c0000000f031bp3 0x1.3fffffffea4ep2 -0x1.cp-28 F +REG epsg:22279 4 OK -0x1.0f1d736822b7p19 -0x1.0f230e236cbb5p19 0x1.4df501e85p6 0x1.7fffffff87c13p4 0x1.3fffffffea461p2 -0x1.0p-30 F +REG epsg:2228 0 OK 0x1.907e0aab020c9p22 0x1.e5aadbb861009p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:2228 1 OK 0x1.64ab3a8ebe896p22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:2228 2 OK 0x1.bc50dac7458fcp22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:2228 3 OK 0x1.66c728b16e633p22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:2228 4 OK 0x1.ba34eca495b5fp22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:22281 0 OK -0x1.a0b4a6439ebc7p5 -0x1.23ff5e4bc0a11p8 0x1.ac42cdb88p5 0x1.5p4 0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:22281 1 OK 0x1.0f103ed90beaap19 0x1.0eda0985fdd5ap19 0x1.8f2367f4p4 0x1.0000000078217p4 -0x1.3fffffffea53p2 -0x1.0p-29 F +REG epsg:22281 2 OK -0x1.0f1d44977db53p19 0x1.0eda0986543afp19 0x1.0feda54fep5 0x1.9fffffff87bc4p4 -0x1.3fffffffea4bfp2 0x1.0p-30 F +REG epsg:22281 3 OK 0x1.0f0fb05a5d458p19 -0x1.0f2308bdd3c2bp19 0x1.2f65c0a51p6 0x1.00000000781abp4 0x1.3fffffffea4dbp2 -0x1.4p-28 F +REG epsg:22281 4 OK -0x1.0f1cb611ff4f9p19 -0x1.0f2308be2a558p19 0x1.5393a6431p6 0x1.9fffffff87c31p4 0x1.3fffffffea468p2 0x1.0p-29 F +REG epsg:22283 0 OK -0x1.72329098d6895p5 -0x1.23ff591c0192bp8 0x1.b9ff04154p5 0x1.6ffffffffffffp4 0x0.0p0 0x1.8p-29 T +REG epsg:22283 1 OK 0x1.0f10f41db1e74p19 0x1.0eda04b35ab52p19 0x1.b279e089p4 0x1.2000000078237p4 -0x1.3fffffffea52cp2 -0x1.4p-28 F +REG epsg:22283 2 OK -0x1.0f1c85c8a5594p19 0x1.0eda04b3a7767p19 0x1.198570d5ap5 0x1.bfffffff87be1p4 -0x1.3fffffffea4c3p2 -0x1.0p-30 F +REG epsg:22283 3 OK 0x1.0f10659ea9816p19 -0x1.0f2303e9e752cp19 0x1.383b5a239p6 0x1.20000000781c9p4 0x1.3fffffffea4d3p2 -0x1.8p-29 F +REG epsg:22283 4 OK -0x1.0f1bf7438fd17p19 -0x1.0f2303ea343c9p19 0x1.585f897f5p6 0x1.bfffffff87c5p4 0x1.3fffffffea46ep2 -0x1.0p-30 F +REG epsg:22285 0 OK -0x1.433d06a48ab25p5 -0x1.23ff5489f7dp8 0x1.c61993d1ap5 0x1.9000000000002p4 -0x1.2f74bf1dcfcafp-60 -0x1.0p-29 T +REG epsg:22285 1 OK 0x1.0f11abc137169p19 0x1.0eda00735e4a7p19 0x1.d2a76fc74p4 0x1.4000000078254p4 -0x1.3fffffffea524p2 -0x1.0p-28 F +REG epsg:22285 2 OK -0x1.0f1bc5bd02bfap19 0x1.0eda0073a14fep19 0x1.2174bb5c4p5 0x1.dfffffff87cp4 -0x1.3fffffffea4ccp2 -0x1.0p-30 F +REG epsg:22285 3 OK 0x1.0f111d41d3187p19 -0x1.0f22ffa8c8b68p19 0x1.4046b9b6cp6 0x1.40000000781e6p4 0x1.3fffffffea4ccp2 -0x1.8p-29 F +REG epsg:22285 4 OK -0x1.0f1b373856215p19 -0x1.0f22ffa90bdf3p19 0x1.5c572cacp6 0x1.dfffffff87c6cp4 0x1.3fffffffea474p2 0x1.0p-29 F +REG epsg:22287 0 OK -0x1.13e2ad99bb0b2p5 -0x1.23ff509710382p8 0x1.d08eb6946p5 0x1.afffffffffffep4 -0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:22287 1 OK 0x1.0f12658a55c15p19 0x1.0ed9fcc75bdeap19 0x1.efa20c9ccp4 0x1.6000000078274p4 -0x1.3fffffffea51ep2 0x0.0p0 F +REG epsg:22287 2 OK -0x1.0f1b04b07ab3ap19 0x1.0ed9fcc795131p19 0x1.27b90b636p5 0x1.ffffffff87c23p4 -0x1.3fffffffea4d2p2 0x1.0p-30 F +REG epsg:22287 3 OK 0x1.0f11d70a94708p19 -0x1.0f22fbfbcb916p19 0x1.47855d1b6p6 0x1.6000000078206p4 0x1.3fffffffea4c7p2 -0x1.8p-29 F +REG epsg:22287 4 OK -0x1.0f1a762c36e9cp19 -0x1.0f22fbfc04e3fp19 0x1.5f795308fp6 0x1.ffffffff87c8ep4 0x1.3fffffffea47dp2 -0x1.0p-30 F +REG epsg:22289 0 OK -0x1.c864943465d69p4 -0x1.23ff4d44860aap8 0x1.d95b29704p5 0x1.cffffffffffffp4 0x0.0p0 0x1.0p-30 T +REG epsg:22289 1 OK 0x1.0f13213f1cd3ap19 0x1.0ed9f9b078954p19 0x1.04b056af4p5 0x1.8000000078292p4 -0x1.3fffffffea518p2 -0x1.0p-29 F +REG epsg:22289 2 OK -0x1.0f1a42df42174p19 0x1.0ed9f9b0a7e66p19 0x1.2c506c93ap5 0x1.0fffffffc3e22p5 -0x1.3fffffffea4dap2 -0x1.8p-29 F +REG epsg:22289 3 OK 0x1.0f1292befc924p19 -0x1.0f22f8e415553p19 0x1.4df501e85p6 0x1.8000000078226p4 0x1.3fffffffea4c1p2 -0x1.8p-29 F +REG epsg:22289 4 OK -0x1.0f19b45b66ec4p19 -0x1.0f22f8e444bf6p19 0x1.61c5026bdp6 0x1.0fffffffc3e5ap5 0x1.3fffffffea485p2 0x0.0p0 F +REG epsg:2229 0 OK 0x1.907e0aab020c9p22 0x1.e7dc46f7cec99p20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:2229 1 OK 0x1.639369c06914p22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:2229 2 OK 0x1.bd68ab959b05bp22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:2229 3 OK 0x1.65a65a5ce593p22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:2229 4 OK 0x1.bb55baf91e86ap22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:22291 0 OK -0x1.687577376d5dap4 -0x1.23ff4a9362843p8 0x1.e07c2debcp5 0x1.efffffffffffep4 0x0.0p0 0x1.0p-30 T +REG epsg:22291 1 OK 0x1.0f13dea501eb4p19 0x1.0ed9f72fab10cp19 0x1.0feda54fep5 0x1.a0000000782b1p4 -0x1.3fffffffea51p2 -0x1.0p-30 F +REG epsg:22291 2 OK -0x1.0f198085cb1ffp19 0x1.0ed9f72fd06fep19 0x1.2f39705cap5 0x1.1fffffffc3e2fp5 -0x1.3fffffffea4dcp2 0x1.0p-30 F +REG epsg:22291 3 OK 0x1.0f13502481395p19 -0x1.0f22f6629ce63p19 0x1.5393a6431p6 0x1.a000000078244p4 0x1.3fffffffea4bbp2 -0x1.0p-30 F +REG epsg:22291 4 OK -0x1.0f18f202583d9p19 -0x1.0f22f662c259p19 0x1.6339838c3p6 0x1.1fffffffc3e66p5 0x1.3fffffffea487p2 0x1.0p-29 F +REG epsg:22293 0 OK -0x1.0815ef88842abp4 -0x1.23ff48847c8c9p8 0x1.e5ef8adb4p5 0x1.07fffffffffffp5 0x0.0p0 0x1.0p-30 T +REG epsg:22293 1 OK 0x1.0f149d80f39a3p19 0x1.0ed9f545bb264p19 0x1.198570d5ap5 0x1.c0000000782d2p4 -0x1.3fffffffea50bp2 -0x1.0p-29 F +REG epsg:22293 2 OK -0x1.0f18bde0b27fp19 0x1.0ed9f545d687bp19 0x1.30732e642p5 0x1.2fffffffc3e41p5 -0x1.3fffffffea4e6p2 -0x1.0p-29 F +REG epsg:22293 3 OK 0x1.0f140f001115cp19 -0x1.0f22f4782a4eap19 0x1.585f897f5p6 0x1.c000000078264p4 0x1.3fffffffea4b3p2 -0x1.0p-29 F +REG epsg:22293 4 OK -0x1.0f182f5da76e8p19 -0x1.0f22f47845be7p19 0x1.63d6623d5p6 0x1.2fffffffc3e78p5 0x1.3fffffffea49p2 0x1.0p-30 F +REG epsg:2230 0 OK 0x1.907e0aab020c9p22 0x1.dcbd320fca31ap20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:2230 1 OK 0x1.697149d028833p22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:2230 2 OK 0x1.b78acb85db95ap22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:2230 3 OK 0x1.6af09de1e9cf6p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:2230 4 OK 0x1.b60b77741a498p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:2231 0 OK 0x1.6e36000000004p21 0x1.349e033e4d4bp20 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:2231 1 OK 0x1.2c1b34e9bf8dfp21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:2231 2 OK 0x1.b050cb1640729p21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:2231 3 OK 0x1.2edc82fbcaf4dp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:2231 4 OK 0x1.ad8f7d04350bbp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:2232 0 OK 0x1.6e36000000004p21 0x1.4959ca39b0238p20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:2232 1 OK 0x1.165b50c53d54dp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:2232 2 OK 0x1.c610af3ac2abbp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:2232 3 OK 0x1.1af84f5f35b68p21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:2232 4 OK 0x1.c173b0a0ca4ap21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:2233 0 OK 0x1.6e36000000004p21 0x1.42aa603777e92p20 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:2233 1 OK 0x1.1d7ce35315bap21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:2233 2 OK 0x1.beef1cacea468p21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:2233 3 OK 0x1.213c0acae25b4p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:2233 4 OK 0x1.bb2ff5351da54p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:22332 0 OK 0x1.e83c3ce59f7c6p18 -0x1.aed14fd02ce4bp8 0x1.2562f33a78p7 0x1.2000000000001p3 -0x1.2f74bf1dcfcacp-61 0x1.8p-29 T +REG epsg:22332 1 OK -0x1.adb2dd0c4e74p15 -0x1.0f179d26545ccp19 0x1.7a0d79f2cp7 0x1.0000000000002p2 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:22332 2 OK 0x1.018bb5538eceap20 -0x1.0f179d2605f56p19 0x1.69b4ec324p7 0x1.cp3 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:22332 3 OK -0x1.adc0015f8194p15 0x1.0eabe9bd3d9d9p19 0x1.c79265e5dp6 0x1.0p2 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:22332 4 OK 0x1.018c1e719e0ap20 0x1.0eabe9bcef72ep19 0x1.a6e130fc3p6 0x1.c000000000001p3 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2234 0 OK 0x1.e848000000005p19 0x1.500fa66b4a167p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:2234 1 OK 0x1.2cd17519787cp19 0x1.336c49b7fa353p18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:2234 2 OK 0x1.51df457343c25p20 0x1.336c49b7fa353p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:2234 3 OK 0x1.32acebaa46e8ap19 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2234 4 OK 0x1.4ef18a2adc8cp20 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2235 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:2235 1 OK -0x1.3b284352bd372p20 -0x1.adf90da921e84p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:2235 2 OK 0x1.3dc68c5566cd6p21 -0x1.adf90da921e83p20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:2235 3 OK -0x1.fc8e1e7bfa79ep19 0x1.cc6842bfb4f9fp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:2235 4 OK 0x1.1f55f24b06d03p21 0x1.cc6842bfb4fap20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:2236 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:2236 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2236 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2236 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2236 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2237 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:2237 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2237 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2237 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2237 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2238 0 OK 0x1.e097400000006p20 0x1.36c124f6ea723p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:2238 1 OK 0x1.41af8ade6517p20 -0x1.312f13394fda2p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:2238 2 OK 0x1.3fbf7a90cd745p21 -0x1.312f13394fda2p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:2238 3 OK 0x1.472fd7933cbd8p20 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:2238 4 OK 0x1.3cff543661a11p21 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:2239 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2239 1 OK -0x1.331c47ab8351ap20 -0x1.b1c692296f919p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2239 2 OK 0x1.39c08e81c9daap21 -0x1.b1c692296f919p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:2239 3 OK -0x1.062aefbe75fbdp20 0x1.c850c02f2b578p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2239 4 OK 0x1.2347e28b432fap21 0x1.c850c02f2b579p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:22391 0 OK 0x1.e83b39039e666p18 0x1.24cdef13a146ap18 -0x1.21d6c3d36p5 0x1.3cccccccccccdp3 0x1.1ffffffffffd3p5 -0x1.0p-30 F +REG epsg:22391 1 OK -0x1.66eb0f60116a8p16 -0x1.cdd330ed73f98p17 -0x1.104eb3a74p4 0x1.dc1dd293b6becp1 0x1.effffffffff66p4 0x0.0p0 F +REG epsg:22391 2 OK 0x1.0a8c4e6dd69ccp20 -0x1.cdd3957eeb334p17 -0x1.a748ad348p4 0x1.0149127a55f4fp4 0x1.effffffffff69p4 0x0.0p0 F +REG epsg:22391 3 OK -0x1.502dc5fa8f75p14 0x1.a9bc8f42b2c62p19 -0x1.77ee33c78p5 0x1.dc1dd293b6beep1 0x1.47fffffffffe4p5 0x1.0p-30 F +REG epsg:22391 4 OK 0x1.f2bca56d8449p19 0x1.a9bca7de42a98p19 -0x1.ba652fb9ap5 0x1.0149127a55f5p4 0x1.47fffffffffe9p5 0x1.0p-30 F +REG epsg:22392 0 OK 0x1.e83b3904828cdp18 0x1.24ca9e6136af7p18 -0x1.bfde0472cp4 0x1.3cccccccccccep3 0x1.0a6666666662bp5 0x0.0p0 F +REG epsg:22392 1 OK -0x1.59a67a576dc1p16 -0x1.d11898ed8aaep17 -0x1.ddb0bbb3p2 0x1.f5792b2e61d7ep1 0x1.c4ccccccccc0ep4 0x1.0p-30 F +REG epsg:22392 2 OK 0x1.09b805071defcp20 -0x1.d118fd7302fep17 -0x1.0d8d6684cp4 0x1.fc3b4ece0123dp3 0x1.c4ccccccccc0cp4 0x1.0p-30 F +REG epsg:22392 3 OK -0x1.84da13761a9cp14 0x1.a8e0c3d166e94p19 -0x1.3da5a1d7cp5 0x1.f5792b2e61d7ep1 0x1.3266666666643p5 0x0.0p0 F +REG epsg:22392 4 OK 0x1.f46208077c8d5p19 0x1.a8e0dc7641e76p19 -0x1.808d7b43ap5 0x1.fc3b4ece0123bp3 0x1.3266666666643p5 0x1.0p-30 F +REG epsg:2240 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2240 1 OK 0x1.75870bf1b12dp18 -0x1.b1c692296f919p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:2240 2 OK 0x1.00ffc9eae0d48p22 -0x1.b1c692296f919p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2240 3 OK 0x1.14a635d2f3426p19 0x1.c850c02f2b579p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2240 4 OK 0x1.eb86e7df3afe2p21 0x1.c850c02f2b578p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2241 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2241 1 OK -0x1.3f5f872489a3ep20 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2241 2 OK 0x1.3fe22e3e4d033p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2241 3 OK -0x1.f402248a55288p19 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2241 4 OK 0x1.1d32f3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2242 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2242 1 OK -0x1.3c4f9c92268acp18 -0x1.abd3c4bd17e74p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2242 2 OK 0x1.b807fe3e4d034p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2242 3 OK -0x1.36ae48a5526ap15 0x1.ce73bbe339dbfp20 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2242 4 OK 0x1.9558c3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2243 0 OK 0x1.4064d5560418cp21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2243 1 OK 0x1.4272e3f9da294p19 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2243 2 OK 0x1.181678d6c8d3ap22 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2243 3 OK 0x1.cd2f4e1a7f8fp19 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2243 4 OK 0x1.06beeb92b426ep22 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2244 0 OK 0x1.4064d54fdf3b9p18 0x1.8f79a00000005p19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:2244 1 OK -0x1.8ab2401dc3b64p20 -0x1.ccfbdef59791fp19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2244 2 OK 0x1.15725562d9aa9p21 -0x1.ccfbdef59791dp19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2244 3 OK -0x1.4ee8c9d0e722cp20 0x1.49ee42718b251p21 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2244 4 OK 0x1.ef1b3478d6c19p20 0x1.49ee42718b252p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2245 0 OK 0x1.6871700000004p21 0x1.8f79a00000005p19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:2245 1 OK 0x1.ec2ed51c88f6cp19 -0x1.ccfbdef59791fp19 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2245 2 OK 0x1.2aeb955c6ee16p22 -0x1.ccfbdef59791fp19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2245 3 OK 0x1.31e0e0db210eep20 0x1.49ee42718b251p21 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2245 4 OK 0x1.1bf937c937bc8p22 0x1.49ee42718b251p21 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2246 0 OK 0x1.907e0aac08315p20 0x1.04cae2b6b9b91p18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:2246 1 OK 0x1.0aeb10e9b927p20 -0x1.feccc02444d94p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2246 2 OK 0x1.0b0882372b9ddp21 -0x1.feccc02444d94p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2246 3 OK 0x1.1034910620ffcp20 0x1.89d6f5d769758p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2246 4 OK 0x1.0863c228f7b17p21 0x1.89d6f5d769758p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2247 0 OK 0x1.907e0aac08315p20 0x1.d79a53ca86cdfp20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:2247 1 OK 0x1.fd4ce85362396p19 0x1.4aec624c3c358p20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:2247 2 OK 0x1.112ad0972fa28p21 0x1.4aec624c3c358p20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:2247 3 OK 0x1.04b1690895058p20 0x1.33abac378504bp21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:2247 4 OK 0x1.0e255627bdae1p21 0x1.33abac378504bp21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:2248 0 OK 0x1.4064d553f7cf1p20 0x1.3d1efd3b91187p18 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:2248 1 OK 0x1.3a7910c1d2d03p19 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:2248 2 OK 0x1.e38d22470636p20 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:2248 3 OK 0x1.4a5177c329c8p19 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:2248 4 OK 0x1.dba0eec65aba2p20 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:2249 0 OK 0x1.4064d55810628p19 0x1.51cf01db587dap21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:2249 1 OK 0x1.7b96f1026fcp14 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:2249 2 OK 0x1.3a76799406a38p20 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:2249 3 OK 0x1.bbb272668874p15 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:2249 4 OK 0x1.328741c4dc1eep20 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:2250 0 OK 0x1.907e0aac08315p20 0x1.57f5cca07ddf3p16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:2250 1 OK 0x1.35d5e8a5c7bd2p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:2250 2 OK 0x1.eb262cb248a58p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:2250 3 OK 0x1.3890cdb380798p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:2250 4 OK 0x1.e86b47a48fe92p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:2251 0 OK 0x1.907e3f28f5c29p24 0x1.9983d81e6921fp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:2251 1 OK 0x1.831fd4ce40c4cp24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:2251 2 OK 0x1.9ddca983aac05p24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:2251 3 OK 0x1.843129ecee803p24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:2251 4 OK 0x1.9ccb5464fd04ep24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:2252 0 OK 0x1.2c5eaf5eb851fp24 0x1.a8432a3145b09p18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:2252 1 OK 0x1.1e863b657d643p24 -0x1.962954cc373abp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:2252 2 OK 0x1.3a372357f33fap24 -0x1.962954cc373abp18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:2252 3 OK 0x1.1f9deb7dde65ap24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:2252 4 OK 0x1.391f733f923e3p24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:22521 0 OK 0x1.e85c1d194a834p18 0x1.b997c01ddac22p22 -0x1.adb19e62p2 -0x1.c800000000001p5 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:22521 1 OK -0x1.faa6c02ae42ep14 0x1.9701592e2149p22 -0x1.273a20adcp4 -0x1.f42297030ae5cp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:22521 2 OK 0x1.f8315332ea12p19 0x1.9701592dd90dcp22 -0x1.432f191bp2 -0x1.9bdd68fcf51a2p5 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:22521 3 OK -0x1.2f880229c90fp16 0x1.dacab1de5c4d2p22 -0x1.7d24c208p3 -0x1.f42297030ae5cp5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:22521 4 OK 0x1.07268ebf36964p20 0x1.dacab1de1795cp22 0x1.50cc3c2cp1 -0x1.9bdd68fcf51a3p5 -0x1.4p4 0x1.0p-30 F +REG epsg:22522 0 OK 0x1.e85561ab3e1e5p18 0x1.b997cbfc8016cp22 -0x1.64469eep-2 -0x1.97fffffffffffp5 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:22522 1 OK -0x1.fb106ff2cffap14 0x1.97016752448b2p22 -0x1.44ecfa2ep3 -0x1.c42297030ae5dp5 -0x1.e000000000001p4 0x1.0p-30 F +REG epsg:22522 2 OK 0x1.f82de53b075c5p19 0x1.97016752147b6p22 -0x1.3cd8e674p0 -0x1.6bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:22522 3 OK -0x1.2fa256eb1d8bp16 0x1.dacabb8dc09aap22 -0x1.741ccdeep1 -0x1.c42297030ae5cp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:22522 4 OK 0x1.0724d64eeadcep20 0x1.dacabb8d92e1dp22 0x1.b11fd6cbp2 -0x1.6bdd68fcf51a3p5 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:22523 0 OK 0x1.e84e80b5f9ee6p18 0x1.b997d3086145bp22 0x1.b7333c9p1 -0x1.68p5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:22523 1 OK -0x1.fb7d4b5670eap14 0x1.97016fb753dbfp22 -0x1.112301c6p2 -0x1.942297030ae5cp5 -0x1.e000000000005p4 -0x1.0p-29 F +REG epsg:22523 2 OK 0x1.f82a6b188fc04p19 0x1.97016fb73c808p22 0x1.0aabbf8p-4 -0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:22523 3 OK -0x1.2fbd8003e6bf8p16 0x1.dacac14d9d21ap22 0x1.bd681edp1 -0x1.942297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:22523 4 OK 0x1.0723186061328p20 0x1.dacac14d86e94p22 0x1.05cc37cf8p3 -0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:22524 0 OK 0x1.e8478d8412282p18 0x1.b997d52dbbf09p22 0x1.25422a85p2 -0x1.38p5 -0x1.8ffffffffffffp4 -0x1.0p-30 F +REG epsg:22524 1 OK -0x1.fbec210b869cp14 0x1.97017245c4ddfp22 -0x1.b7214d98p-1 -0x1.642297030ae5fp5 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:22524 2 OK 0x1.f826ee8be37e1p19 0x1.97017245c6792p22 -0x1.27d8d354p0 -0x1.0bdd68fcf51a3p5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:22524 3 OK -0x1.2fd931484d8d8p16 0x1.dacac30dd2961p22 0x1.cb83843ap2 -0x1.642297030ae5cp5 -0x1.4p4 0x1.0p-29 F +REG epsg:22524 4 OK 0x1.072159d63351fp20 0x1.dacac30dd41d4p22 0x1.b6d22f89p2 -0x1.0bdd68fcf51a2p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:22525 0 OK 0x1.e8409b933badfp18 0x1.b997d2668b9dep22 0x1.8bcd503p1 -0x1.08p5 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:22525 1 OK -0x1.fc5bba3c3c24p14 0x1.97016ef66c653p22 0x1.3f4149p-5 -0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:22525 2 OK 0x1.f823795c2783ep19 0x1.97016ef686f2ap22 -0x1.38bdc8d2p2 -0x1.b7bad1f9ea34ap4 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:22525 3 OK -0x1.2ff51d0eb4cb8p16 0x1.dacac0c97822bp22 0x1.04e3eb8cp3 -0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:22525 4 OK 0x1.071f9f94aef68p20 0x1.dacac0c991652p22 0x1.6775ab5ep1 -0x1.b7bad1f9ea34ap4 -0x1.4000000000002p4 0x1.0p-30 F +REG epsg:2253 0 OK 0x1.907e3f28f5c28p23 0x1.818af27c31519p18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2253 1 OK 0x1.7778c79e94e8bp23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:2253 2 OK 0x1.a983b6b3569c4p23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:2253 3 OK 0x1.7927ff3c5604fp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:2253 4 OK 0x1.a7d47f15957ffp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:2254 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:2254 1 OK -0x1.c528da114b511p19 -0x1.b202d186cc333p20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2254 2 OK 0x1.6195d68452d49p21 -0x1.b202d186cc333p20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2254 3 OK -0x1.6d13c32e22509p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2254 4 OK 0x1.4b9090cb88947p21 0x1.c81a512182c17p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2255 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:2255 1 OK 0x1.7741a12d4899cp18 -0x1.b202d186cc333p20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2255 2 OK 0x1.00e42097275ep22 -0x1.b202d186cc333p20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2255 3 OK 0x1.13b5e779cd4d6p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2255 4 OK 0x1.ebc2fb75847bep21 0x1.c81a512182c17p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2256 0 OK 0x1.e0977efdf3b63p20 0x1.a6c8bd0f5d9f5p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:2256 1 OK 0x1.3ca7fcc422cbp16 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:2256 2 OK 0x1.d6b23f17d2a06p21 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:2256 3 OK 0x1.79b79a00e21fp18 0x1.45d92b5d83149p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:2256 4 OK 0x1.b1608bbdd772cp21 0x1.45d92b5d83149p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:2257 0 OK 0x1.0853300000003p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:2257 1 OK -0x1.5012ef61028f4p20 -0x1.b15833ac79502p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2257 2 OK 0x1.2c330fb08147cp21 -0x1.b15833ac79502p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2257 3 OK -0x1.214b965a2235p20 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2257 4 OK 0x1.14cf632d111aap21 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2258 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:2258 1 OK -0x1.0ef596d91f928p18 -0x1.b157317808227p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2258 2 OK 0x1.b25cbd872c23ap21 -0x1.b157317808227p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2258 3 OK -0x1.4f6288ed1a5dp16 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2258 4 OK 0x1.9af91ef371044p21 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2259 0 OK 0x1.4c689d560418cp21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:2259 1 OK 0x1.8927959598ba4p19 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2259 2 OK 0x1.1b43aaa351018p22 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2259 3 OK 0x1.e6b67617f7ec6p19 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2259 4 OK 0x1.0f91ce93051b3p22 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2260 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:2260 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2260 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2260 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2260 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2261 0 OK 0x1.907e0aa7ef9ep19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:2261 1 OK -0x1.1556b8086776ap20 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2261 2 OK 0x1.52ea61582b8a5p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2261 3 OK -0x1.a7e3120738976p19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2261 4 OK 0x1.3237c9d5c5f4ep21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2262 0 OK 0x1.18583aac08314p20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:2262 1 OK -0x1.8a7b0560ae28cp19 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2262 2 OK 0x1.7af6fc0433bb7p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2262 3 OK -0x1.07b0a75717d2ep19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2262 4 OK 0x1.5a446481ce26p21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2263 0 OK 0x1.e097400000009p19 0x1.34584a46de43p17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:2263 1 OK 0x1.2b56a357b7e14p19 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:2263 2 OK 0x1.4aebee54240ffp20 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:2263 3 OK 0x1.30b017f7ec667p19 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:2263 4 OK 0x1.483f340409cd6p20 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:2264 0 OK 0x1.e848000000005p20 0x1.ad7545588e65p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:2264 1 OK 0x1.0a3d4a3582c3ep20 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:2264 2 OK 0x1.63295ae53e9dep21 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:2264 3 OK 0x1.16ff5d3fb333cp20 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:2264 4 OK 0x1.5cc851602665fp21 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:2265 0 OK 0x1.e0977efdf3b63p20 0x1.34b8635602885p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:2265 1 OK 0x1.409ca1da0a5ddp20 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:2265 2 OK 0x1.40492e10ee87bp21 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:2265 3 OK 0x1.4af8a0f982deep20 0x1.d42e49f062e38p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2265 4 OK 0x1.3b1b2e8132473p21 0x1.d42e49f062e38p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2266 0 OK 0x1.e0977efdf3b63p20 0x1.437e15732559cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:2266 1 OK 0x1.38eb67f7cefd8p20 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:2266 2 OK 0x1.4421cb020c37ep21 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:2266 3 OK 0x1.43cd789910c28p20 0x1.ea990182f140ap19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:2266 4 OK 0x1.3eb0c2b16b556p21 0x1.ea990182f140ap19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:2267 0 OK 0x1.e097400000006p20 0x1.3a030d3f271bcp18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:2267 1 OK 0x1.3f60bce6c66c8p20 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:2267 2 OK 0x1.40e6e18c9cca2p21 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:2267 3 OK 0x1.466e4a61d6408p20 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:2267 4 OK 0x1.3d601acf14e02p21 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:2268 0 OK 0x1.e097400000006p20 0x1.519f1c006078p18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:2268 1 OK 0x1.332c99d21eee2p20 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:2268 2 OK 0x1.4700f316f0895p21 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:2268 3 OK 0x1.3addbc4eed52ep20 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:2268 4 OK 0x1.432861d88956fp21 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:2269 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:2269 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:2269 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:2269 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:2269 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:2270 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:2270 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:2270 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:2270 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:2270 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:22700 0 OK 0x1.24d96f3b1562ep18 0x1.2503c40183bb7p18 -0x1.dd4170b48p3 0x1.2accccccccccdp5 0x1.15333333333p5 0x1.0p-30 F +REG epsg:22700 1 OK -0x1.1b6ce7912f7ccp18 -0x1.cf0e3b9e13078p17 -0x1.d76c973fp2 0x1.f45a283b2e20ap4 0x1.da666666665bcp4 -0x1.0p-30 F +REG epsg:22700 2 OK 0x1.b28fe765ac86cp19 -0x1.cf0f2c0ae0f1p17 -0x1.ddfda05ap4 0x1.5b6c857c02894p5 0x1.da666666665bcp4 0x0.0p0 F +REG epsg:22700 3 OK -0x1.b421c54f3526p17 0x1.a968d578ada26p19 -0x1.27483b38p-1 0x1.f45a283b2e20ap4 0x1.3d33333333316p5 0x1.0p-29 F +REG epsg:22700 4 OK 0x1.91e1dc87dfe56p19 0x1.a9691067b7949p19 -0x1.484a2aafcp4 0x1.5b6c857c02894p5 0x1.3d33333333315p5 0x1.0p-30 F +REG epsg:2271 0 OK 0x1.e097400000006p20 0x1.3d4353fa5fbadp18 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:2271 1 OK 0x1.3d0a98c7262b4p20 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:2271 2 OK 0x1.4211f39c6ceacp21 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:2271 3 OK 0x1.45b47e1aeae0ep20 0x1.e030c687b6f13p19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:2271 4 OK 0x1.3dbd00f28a8ffp21 0x1.e030c687b6f13p19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:2272 0 OK 0x1.e097400000006p20 0x1.228706283a7ddp18 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:2272 1 OK 0x1.4b41287d38872p20 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:2272 2 OK 0x1.3af6abc163bcdp21 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:2272 3 OK 0x1.5248e02a502bbp20 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:2272 4 OK 0x1.3772cfead7ea8p21 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:2273 0 OK 0x1.e847fffffffffp20 0x1.0a7b29855bfffp19 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:2273 1 OK 0x1.a6b7fa6e5a964p19 -0x1.0104117a0f575p19 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:2273 2 OK 0x1.7e9a0164695a6p21 -0x1.0104117a0f575p19 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:2273 3 OK 0x1.cbc29b0bbdc86p19 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:2273 4 OK 0x1.7557593d108dep21 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:2274 0 OK 0x1.e097400000006p20 0x1.7249af14fd5fap18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:2274 1 OK 0x1.21cff166c8dd1p20 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:2274 2 OK 0x1.4faf474c9b926p21 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:2274 3 OK 0x1.2b7ae3b3fa782p20 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:2274 4 OK 0x1.4ad9ce2602c4dp21 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:2275 0 OK 0x1.4064d55810628p19 0x1.c0fe8fdb31172p21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:2275 1 OK -0x1.3f2832962a478p17 0x1.61539a6f805e3p21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:2275 2 OK 0x1.6849dbaad5aa6p20 0x1.61539a6f805e3p21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:2275 3 OK -0x1.d6bce3b2d8b88p16 0x1.11a734805e99cp22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:2275 4 OK 0x1.5dd0a3933ded1p20 0x1.11a734805e99cp22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:2276 0 OK 0x1.e097400000006p20 0x1.aa07448f1fd21p22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:2276 1 OK 0x1.0e08d221ed162p20 0x1.77a266cdd0422p22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:2276 2 OK 0x1.5992d6ef09755p21 0x1.77a266cdd0422p22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:2276 3 OK 0x1.18ae070a3968ap20 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:2276 4 OK 0x1.54403c7ae34c1p21 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:2277 0 OK 0x1.18583aa9fbe7ap21 0x1.38abba7c13556p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:2277 1 OK 0x1.66573f1cbd669p20 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:2277 2 OK 0x1.7d84d5c5991c8p21 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:2277 3 OK 0x1.6f78cd5a43b24p20 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:2277 4 OK 0x1.78f40ea6d5f6ap21 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:22770 0 OK 0x1.24d96f3b1562ep18 0x1.2503c40183bb7p18 -0x1.dd4170b48p3 0x1.2accccccccccdp5 0x1.15333333333p5 0x1.0p-30 F +REG epsg:22770 1 OK -0x1.1b6ce7912f7ccp18 -0x1.cf0e3b9e13078p17 -0x1.d76c973fp2 0x1.f45a283b2e20ap4 0x1.da666666665bcp4 -0x1.0p-30 F +REG epsg:22770 2 OK 0x1.b28fe765ac86cp19 -0x1.cf0f2c0ae0f1p17 -0x1.ddfda05ap4 0x1.5b6c857c02894p5 0x1.da666666665bcp4 0x0.0p0 F +REG epsg:22770 3 OK -0x1.b421c54f3526p17 0x1.a968d578ada26p19 -0x1.27483b38p-1 0x1.f45a283b2e20ap4 0x1.3d33333333316p5 0x1.0p-29 F +REG epsg:22770 4 OK 0x1.91e1dc87dfe56p19 0x1.a9691067b7949p19 -0x1.484a2aafcp4 0x1.5b6c857c02894p5 0x1.3d33333333315p5 0x1.0p-30 F +REG epsg:2278 0 OK 0x1.e097400000006p20 0x1.9e15d995fed96p23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:2278 1 OK 0x1.00cc87766a532p20 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:2278 2 OK 0x1.6030fc44cad64p21 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:2278 3 OK 0x1.0b39a79d764fp20 0x1.b999bb2d94beep23 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:2278 4 OK 0x1.5afa6c3144d86p21 0x1.b999bb2d94beep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:22780 0 OK -0x1.fb1f5e623c42ap6 0x1.79352ce493ad2p5 -0x1.28346fe98p4 0x1.3933333333334p5 0x1.1199999999998p5 0x1.0p-30 F +REG epsg:22780 1 OK -0x1.1f9676a7aec81p19 -0x1.06be876f279a8p19 -0x1.50086b9b8p3 0x1.08d64d61eda3fp5 0x1.d333333333339p4 0x1.0p-30 F +REG epsg:22780 2 OK 0x1.1f76c765c6287p19 -0x1.06bea72eb7045p19 -0x1.0e92da9c2p5 0x1.6990190478c28p5 0x1.d333333333336p4 0x0.0p0 F +REG epsg:22780 3 OK -0x1.fecac6984db39p18 0x1.17100179b320ap19 -0x1.dc9b76f6p1 0x1.08d64d61eda3fp5 0x1.3999999999999p5 0x1.0p-29 F +REG epsg:22780 4 OK 0x1.fe8b5d19c43d6p18 0x1.17101f57c5f2dp19 -0x1.86d2a61bp4 0x1.6990190478c28p5 0x1.3999999999999p5 0x0.0p0 F +REG epsg:2279 0 OK 0x1.e097400000009p19 0x1.0050fa905671ap24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:2279 1 OK 0x1.5a737b344956cp17 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:2279 2 OK 0x1.b548d09976d6ep20 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:2279 3 OK 0x1.959b7d15aec24p17 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:2279 4 OK 0x1.ade3d05d4a296p20 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:2280 0 OK 0x1.907e3f2b020c4p20 0x1.b0bcb31dc80ddp21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:2280 1 OK 0x1.0c2d791b0ddfdp20 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:2280 2 OK 0x1.0a67829d7b1c6p21 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:2280 3 OK 0x1.11e2dc82e7e8p20 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:2280 4 OK 0x1.078cd0e98e184p21 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:2281 0 OK 0x1.907e3f2b020c4p20 0x1.aa3e8395be8cep22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:2281 1 OK 0x1.7593ba36d54f5p19 0x1.77a162f228e24p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:2281 2 OK 0x1.3319509d4cb7fp21 0x1.77a162f228e24p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:2281 3 OK 0x1.913c3b56f469ap19 0x1.de9a059a5b245p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:2281 4 OK 0x1.2c2f305544f16p21 0x1.de9a059a5b245p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:2282 0 OK 0x1.907e3f2b020c4p20 0x1.35b8f277f903cp23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:2282 1 OK 0x1.edab35460106dp19 0x1.233be022151cdp23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:2282 2 OK 0x1.151371d981ca1p21 0x1.233be022151cdp23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:2282 3 OK 0x1.fb40883a07bdp19 0x1.48a3d66522362p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:2282 4 OK 0x1.11ae1d1c801c8p21 0x1.48a3d66522362p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:2283 0 OK 0x1.5e6e495581066p23 0x1.a18871711cb3ap22 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:2283 1 OK 0x1.4cf5197041c02p23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:2283 2 OK 0x1.6fe7793ac04cap23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:2283 3 OK 0x1.4daf24ae7391ap23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:2283 4 OK 0x1.6f2d6dfc8e7b2p23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:22832 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:22832 1 OK -0x1.ad89324e3d9ap15 -0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:22832 2 OK 0x1.0190499271ecep20 -0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:22832 3 OK -0x1.ad89324e3d9ap15 0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:22832 4 OK 0x1.0190499271ecep20 0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2284 0 OK 0x1.5e6e495581066p23 0x1.b4c9df24ac0d8p21 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:2284 1 OK 0x1.4bcff5cb476d5p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:2284 2 OK 0x1.710c9cdfba9f7p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:2284 3 OK 0x1.4c99ab85b93fcp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:2284 4 OK 0x1.7042e72548cdp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:2285 0 OK 0x1.907e0aac08315p20 0x1.34b943da25dc3p18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:2285 1 OK 0x1.e1046a555e29ep19 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:2285 2 OK 0x1.183cf016b0a7cp21 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:2285 3 OK 0x1.f5bf3365debffp19 0x1.d42f38a973c76p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2285 4 OK 0x1.130e3dd290822p21 0x1.d42f38a973c76p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2286 0 OK 0x1.907e0aac08315p20 0x1.641db43fe1665p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:2286 1 OK 0x1.aeba938e29b6cp19 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:2286 2 OK 0x1.24cf65c87dc3ap21 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:2286 3 OK 0x1.c8e23804965acp19 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:2286 4 OK 0x1.1e457caae29aap21 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:2287 0 OK 0x1.e097400000006p20 0x1.1ce0d17f7cab7p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:2287 1 OK 0x1.4d9405f33b671p20 -0x1.1462814d34f12p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:2287 2 OK 0x1.39cd3d06624cep21 -0x1.1462814d34f12p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:2287 3 OK 0x1.55d5a07b34e9ep20 0x1.af67f5201dffp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:2287 4 OK 0x1.35ac6fc2658b7p21 0x1.af67f5201dffp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:2288 0 OK 0x1.e097400000006p20 0x1.28adfc81f1783p18 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:2288 1 OK 0x1.477bd35a7b7f1p20 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:2288 2 OK 0x1.3cd95652c240ep21 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:2288 3 OK 0x1.500ba7b16b424p20 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:2288 4 OK 0x1.38916c274a5f4p21 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:2289 0 OK 0x1.e097400000006p20 0x1.6fca8cd604f09p18 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:2289 1 OK 0x1.21d65e6fa50cp20 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:2289 2 OK 0x1.4fac10c82d79ep21 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:2289 3 OK 0x1.2e4ecb4ca001cp20 0x1.16ea191559a8fp20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:2289 4 OK 0x1.496fda59afffp21 0x1.16ea191559a8fp20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:2290 0 OK 0x1.55ccp19 0x1.86a000000001ep18 0x0.0p0 -0x1.f8p5 0x1.7a00000000002p5 0x0.0p0 F +REG epsg:2290 1 OK 0x1.65270e0611e6p16 -0x1.f54c1a2d10c1p16 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51fffffffffffp5 0x0.0p0 F +REG epsg:2290 2 OK 0x1.3f798f1f9ee18p20 -0x1.f54c1a2d10c1p16 0x0.0p0 -0x1.bd129258af177p5 0x1.51fffffffffffp5 0x0.0p0 F +REG epsg:2290 3 OK 0x1.7fe57a1633c14p17 0x1.df17a2424735cp19 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2290 4 OK 0x1.25cf50bd3987cp20 0x1.df17a2424735cp19 0x0.0p0 -0x1.bd129258af177p5 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2291 0 OK 0x1.86ap18 0x1.86a000000000fp19 0x0.0p0 -0x1.f8p5 0x1.7a00000000002p5 0x0.0p0 F +REG epsg:2291 1 OK -0x1.975c78fcf70dp17 0x1.094cf974bbcfcp18 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51fffffffffffp5 0x0.0p0 F +REG epsg:2291 2 OK 0x1.ec771e3f3dc2fp19 0x1.094cf974bbcfcp18 0x0.0p0 -0x1.bd129258af177p5 0x1.51fffffffffffp5 0x0.0p0 F +REG epsg:2291 3 OK -0x1.94150bd3987d8p16 0x1.5133d121239aep20 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2291 4 OK 0x1.b922a17a730f8p19 0x1.5133d121239aep20 0x0.0p0 -0x1.bd129258af177p5 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2292 0 OK 0x1.86ap18 0x1.86a0000000009p19 0x0.0p0 -0x1.f8p5 0x1.7a00000000002p5 0x0.0p0 F +REG epsg:2292 1 OK -0x1.975c9153a2d7cp17 0x1.094ceece0c4f2p18 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51ffffffffffbp5 0x0.0p0 F +REG epsg:2292 2 OK 0x1.ec772454e8b5bp19 0x1.094ceece0c4f2p18 0x0.0p0 -0x1.bd129258af178p5 0x1.51ffffffffffbp5 0x0.0p0 F +REG epsg:2292 3 OK -0x1.9415340a0c274p16 0x1.5133d40cea573p20 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2292 4 OK 0x1.b922a6814184ap19 0x1.5133d40cea573p20 0x0.0p0 -0x1.bd129258af179p5 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2294 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2294 1 OK 0x1.e18cf8b42dc8ap21 -0x1.0ef825cdefab2p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2294 2 OK 0x1.348a83a5e91bcp22 -0x1.0ef825cdefab3p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2294 3 OK 0x1.e18cf8b42dc8ap21 0x1.0ef825cdefab2p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2294 4 OK 0x1.348a83a5e91bcp22 0x1.0ef825cdefab3p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2295 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:2295 1 OK 0x1.2dcf7c5a16e43p22 -0x1.0ef825cdefab3p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2295 2 OK 0x1.719383a5e91bbp22 -0x1.0ef825cdefab2p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2295 3 OK 0x1.2dcf7c5a16e43p22 0x1.0ef825cdefab3p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2295 4 OK 0x1.719383a5e91bbp22 0x1.0ef825cdefab2p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:22991 0 OK 0x1.24ced4fb33459p18 0x1.0c8d317726bd5p20 -0x1.3a0a39f58p4 0x1.1800000000001p5 0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:22991 1 OK -0x1.14fe37ff0c826p18 0x1.10a5485ae6e41p19 -0x1.ef22678cp1 0x1.d39fbba3ca7ddp4 0x1.8fffffffc83f9p4 -0x1.cp-28 F +REG epsg:22991 2 OK 0x1.af4df0bcad6e2p19 0x1.10a548558bc5ap19 -0x1.0f2832f12p5 0x1.4630222e1a996p5 0x1.8fffffffc8703p4 0x1.0p-28 F +REG epsg:22991 3 OK -0x1.bc62f52e4bc3p17 0x1.97a6ae52bb25ep20 -0x1.e2a3905bp2 0x1.d39fbba3cd3e9p4 0x1.17ffffffc24c1p5 -0x1.8p-28 F +REG epsg:22991 4 OK 0x1.93e7921cb8c2dp19 0x1.97a6ae5050889p20 -0x1.1570e5f18p5 0x1.4630222e19444p5 0x1.17ffffffc285ep5 0x1.0p-30 F +REG epsg:22992 0 OK 0x1.2c36d8346e7b7p19 0x1.8b7facd4fcb5dp19 -0x1.38ad55dp3 0x1.f000000000002p4 0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:22992 1 OK 0x1.ea0dfd23818cp14 0x1.06155a49f426ep18 0x1.8539c07p2 0x1.939fbba3ca7f2p4 0x1.8fffffffc8404p4 -0x1.4p-28 F +REG epsg:22992 2 OK 0x1.248ea02195704p20 0x1.06155a3f76834p18 -0x1.751cf8464p4 0x1.2630222e1a99ap5 0x1.8fffffffc86ffp4 0x1.8p-29 F +REG epsg:22992 3 OK 0x1.55b6485eabc4p16 0x1.50d94528e3746p20 0x1.73aaa61p0 0x1.939fbba3cd3f2p4 0x1.17ffffffc24cfp5 -0x1.0p-28 F +REG epsg:22992 4 OK 0x1.16db7399ce36ap20 0x1.50d9452685986p20 -0x1.91f3d11e8p4 0x1.2630222e1944ap5 0x1.17ffffffc2857p5 0x1.8p-29 F +REG epsg:22993 0 OK 0x1.55b85f0e72dadp19 0x1.8693ec03a5b05p17 -0x1.2ae882ep-3 0x1.bp4 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:22993 1 OK 0x1.c690a1fe67ccp16 -0x1.4d9fd4da48414p18 0x1.f70437dp3 0x1.539fbba3ca806p4 0x1.8fffffffc8412p4 -0x1.4p-28 F +REG epsg:22993 2 OK 0x1.394f54d120a24p20 -0x1.4d9fd4e4802d2p18 -0x1.9d3bd3288p3 0x1.0630222e1a9ap5 0x1.8fffffffc86f7p4 0x1.0p-28 F +REG epsg:22993 3 OK 0x1.50e19fcabe1acp17 0x1.77d7bcecc76d3p19 0x1.453452bap3 0x1.539fbba3cd3fdp4 0x1.17ffffffc24e1p5 -0x1.0p-27 F +REG epsg:22993 4 OK 0x1.2b9c2b00d2bfp20 0x1.77d7bce82b224p19 -0x1.f6ef3d4f8p3 0x1.0630222e1944fp5 0x1.17ffffffc284ep5 0x1.8p-29 F +REG epsg:22994 0 OK 0x1.55b85f0e72dadp19 0x1.24f67d8074b61p20 -0x1.2ae882ep-3 0x1.bp4 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:22994 1 OK 0x1.c690a1fe67ccp16 0x1.41781592dbdf6p19 0x1.f70437dp3 0x1.539fbba3ca806p4 0x1.8fffffffc8412p4 -0x1.4p-28 F +REG epsg:22994 2 OK 0x1.394f54d120a24p20 0x1.4178158dbfe97p19 -0x1.9d3bd3288p3 0x1.0630222e1a9ap5 0x1.8fffffffc86f7p4 0x1.0p-28 F +REG epsg:22994 3 OK 0x1.50e19fcabe1acp17 0x1.b00fde7663b6ap20 0x1.453452bap3 0x1.539fbba3cd3fdp4 0x1.17ffffffc24e1p5 -0x1.cp-28 F +REG epsg:22994 4 OK 0x1.2b9c2b00d2bfp20 0x1.b00fde7415912p20 -0x1.f6ef3d4f8p3 0x1.0630222e1944fp5 0x1.17ffffffc284ep5 0x1.8p-29 F +REG epsg:23028 0 OK 0x1.e865489e15686p18 0x1.e3d232c9205bp6 -0x1.80a7296398p7 -0x1.dfffffffffffep3 0x1.c72f1eacb7b03p-62 0x1.0p-30 T +REG epsg:23028 1 OK -0x1.acae09e1b3b4p15 -0x1.0ed658cbfcfc1p19 -0x1.a999bd1248p7 -0x1.3ffffffffffffp4 -0x1.4p2 0x1.0p-29 F +REG epsg:23028 2 OK 0x1.019814b81eaa6p20 -0x1.0ed658ccbc22ap19 -0x1.80e7c60d08p7 -0x1.3ffffffffffffp3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23028 3 OK -0x1.acaa599dfb78p15 0x1.0ef495adf7d03p19 -0x1.7f6a91368p7 -0x1.3ffffffffffffp4 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:23028 4 OK 0x1.0197f732d47c2p20 0x1.0ef495aeb720ap19 -0x1.56b8a3122p7 -0x1.4p3 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:23029 0 OK 0x1.e863972e8ba7ep18 0x1.e3d1f7178fd08p6 -0x1.68cc95df18p7 -0x1.2p3 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:23029 1 OK -0x1.acb9837ac24ep15 -0x1.0ed6374c528adp19 -0x1.90c05e5f7p7 -0x1.c000000000001p3 -0x1.4p2 -0x1.0p-29 F +REG epsg:23029 2 OK 0x1.019797cba4524p20 -0x1.0ed6374d06af2p19 -0x1.6a68be896p7 -0x1.0000000000001p2 -0x1.4p2 -0x1.8p-29 F +REG epsg:23029 3 OK -0x1.acb5d335765ap15 0x1.0ef4742a99cdfp19 -0x1.669137ef7p7 -0x1.c000000000001p3 0x1.4000000000001p2 0x0.0p0 F +REG epsg:23029 4 OK 0x1.01977a467c7fdp20 0x1.0ef4742b4e198p19 -0x1.4039a076fp7 -0x1.0000000000001p2 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:23030 0 OK 0x1.e861985cec944p18 0x1.e3d1bf451645cp6 -0x1.527e0ad4cp7 -0x1.8p1 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:23030 1 OK -0x1.acc78a8849f9p15 -0x1.0ed617f8d6c42p19 -0x1.793a4136e8p7 -0x1.0000000000001p3 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:23030 2 OK 0x1.019708997da7cp20 -0x1.0ed617f97deaap19 -0x1.55a8826b7p7 0x1.0000000000001p1 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23030 3 OK -0x1.acc3da40cd9p15 0x1.0ef454d3a7ea8p19 -0x1.4f0b1fe8d8p7 -0x1.0000000000001p3 0x1.3fffffffffffep2 0x1.0p-30 F +REG epsg:23030 4 OK 0x1.0196eb147baep20 0x1.0ef454d44f35ap19 -0x1.2b7968dff8p7 0x1.ffffffffffffep0 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23031 0 OK 0x1.e85f51c201ecep18 0x1.e3d18bee429f8p6 -0x1.3dfa189178p7 0x1.8000000000001p1 0x0.0p0 -0x1.0p-30 T +REG epsg:23031 1 OK -0x1.acd7f7b19c01p15 -0x1.0ed5fb296500cp19 -0x1.63495fd5ap7 -0x1.ffffffffffffep0 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:23031 2 OK 0x1.019668b34efb2p20 -0x1.0ed5fb29fd526p19 -0x1.42e144cf2p7 0x1.0000000000001p3 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:23031 3 OK -0x1.acd44767588ep15 0x1.0ef4380107349p19 -0x1.391a4351p7 -0x1.0000000000002p1 0x1.3fffffffffffep2 0x1.0p-30 F +REG epsg:23031 4 OK 0x1.01964b2e75ecdp20 0x1.0ef438019fa78p19 -0x1.18b22f5c78p7 0x1.0000000000001p3 0x1.3fffffffffffep2 0x1.0p-30 F +REG epsg:23032 0 OK 0x1.e85cc9bfe5f6fp18 0x1.e3d15da310b5p6 -0x1.2b7a49166p7 0x1.2000000000001p3 -0x1.c72f1eacb7b05p-62 0x0.0p0 T +REG epsg:23032 1 OK -0x1.acea9ce3d4d1p15 -0x1.0ed5e12eca20bp19 -0x1.4f2b43d398p7 0x1.ffffffffffffdp1 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:23032 2 OK 0x1.0195b9d993f4cp20 -0x1.0ed5e12f51f01p19 -0x1.3247b067e8p7 0x1.c000000000001p3 -0x1.4p2 -0x1.0p-29 F +REG epsg:23032 3 OK -0x1.ace6ec963b84p15 0x1.0ef41e038d798p19 -0x1.24fc2bb29p7 0x1.0000000000002p2 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:23032 4 OK 0x1.01959c54e671dp20 0x1.0ef41e0415667p19 -0x1.08189e9468p7 0x1.c000000000001p3 0x1.4p2 -0x1.0p-29 F +REG epsg:23033 0 OK 0x1.e85a07701c118p18 0x1.e3d134e5559a4p6 -0x1.1b327ebd38p7 0x1.dfffffffffffep3 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:23033 1 OK -0x1.acff45d3189dp15 -0x1.0ed5ca51e1fcap19 -0x1.3d185991p7 0x1.3ffffffffffffp3 -0x1.4p2 -0x1.8p-29 F +REG epsg:23033 2 OK 0x1.0194fdf6b5b59p20 -0x1.0ed5ca5257ca7p19 -0x1.240a53cea8p7 0x1.4p4 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:23033 3 OK -0x1.acfb9581a408p15 0x1.0ef407241e9e9p19 -0x1.12e9456168p7 0x1.3ffffffffffffp3 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:23033 4 OK 0x1.0194e07235e3ap20 0x1.0ef4072494862p19 -0x1.f3b68a2cap6 0x1.4p4 0x1.4000000000002p2 0x1.0p-30 F +REG epsg:23034 0 OK 0x1.e857128fa7081p18 0x1.e3d11227539a3p6 -0x1.0d5062b8ap7 0x1.5p4 0x0.0p0 0x1.0p-30 T +REG epsg:23034 1 OK -0x1.ad15b88d42dap15 -0x1.0ed5b6d2cb1efp19 -0x1.2d4351fb68p7 0x1.0p4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23034 2 OK 0x1.01943719ab696p20 -0x1.0ed5b6d32d9ebp19 -0x1.18511ef3fp7 0x1.a000000000001p4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23034 3 OK -0x1.ad1208377859p15 0x1.0ef3f3a2e044p19 -0x1.0314414008p7 0x1.0000000000001p4 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23034 4 OK 0x1.019419955aee4p20 0x1.0ef3f3a342d96p19 -0x1.dc442594ep6 0x1.9ffffffffffffp4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23035 0 OK 0x1.e853f36955517p18 0x1.e3d0f5ca79de6p6 -0x1.01fae5091p7 0x1.bp4 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:23035 1 OK -0x1.ad2db61c69eap15 -0x1.0ed5a6e832fe8p19 -0x1.1fd894672p7 0x1.6000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:23035 2 OK 0x1.0193677034718p20 -0x1.0ed5a6e8811a1p19 -0x1.0f3cf3218p7 0x1.ffffffffffffep4 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23035 3 OK -0x1.ad2a05c1db07p15 0x1.0ef3e3b685eb9p19 -0x1.eb530d324p6 0x1.6p4 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23035 4 OK 0x1.019349ec146e2p20 0x1.0ef3e3b6d4184p19 -0x1.ca1bd1e62p6 0x1.ffffffffffffep4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23036 0 OK 0x1.e850b2be7fd68p18 0x1.e3d0e01e53451p6 -0x1.f2a39e996p6 0x1.07fffffffffffp5 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:23036 1 OK -0x1.ad46fb3771d9p15 -0x1.0ed59abebcb37p19 -0x1.14fdc20a88p7 0x1.bffffffffffffp4 -0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:23036 2 OK 0x1.01929140bc46p20 -0x1.0ed59abef58e2p19 -0x1.08e746c6fp7 0x1.3p5 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:23036 3 OK -0x1.ad434ad7bd7cp15 0x1.0ef3d78bb79bep19 -0x1.d59d6d356p6 0x1.bffffffffffffp4 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:23036 4 OK 0x1.019273bccd534p20 0x1.0ef3d78bf0831p19 -0x1.bd707bf48p6 0x1.3p5 0x1.4p2 -0x1.0p-29 F +REG epsg:23037 0 OK 0x1.e84d59ae7c8dap18 0x1.e3d0d15fa760fp6 -0x1.e6dad736fp6 0x1.37ffffffffffep5 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:23037 1 OK -0x1.ad6140febd5ap15 -0x1.0ed5927883d29p19 -0x1.0cd14c7838p7 0x1.1p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:23037 2 OK 0x1.0191b6e3f9362p20 -0x1.0ed59278a6cbdp19 -0x1.0561de1298p7 0x1.6000000000001p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:23037 3 OK -0x1.ad5d909990d5p15 0x1.0ef3cf4494aebp19 -0x1.c54485a1ep6 0x1.1000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG epsg:23037 4 OK 0x1.019199603b637p20 0x1.0ef3cf44b7af7p19 -0x1.b665ac151p6 0x1.6000000000001p5 0x1.4000000000002p2 0x1.0p-29 F +REG epsg:23038 0 OK 0x1.e849f19d09ac6p18 0x1.e3d0c9b7d013ap6 -0x1.e0bc80d78p6 0x1.67fffffffffffp5 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:23038 1 OK -0x1.ad7c3dc2edc2p15 -0x1.0ed58e2cbccf8p19 -0x1.076a20411p7 0x1.4p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:23038 2 OK 0x1.0190dabe57e67p20 -0x1.0ed58e2cc9846p19 -0x1.04b69920b8p7 0x1.9p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23038 3 OK -0x1.ad788d5805c4p15 0x1.0ef3caf85427ap19 -0x1.ba762f8f3p6 0x1.4000000000001p5 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:23038 4 OK 0x1.0190bd3acab96p20 0x1.0ef3caf860df3p19 -0x1.b50f227c3p6 0x1.9p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2308 0 OK 0x1.e8265380ebfadp18 0x1.312d63f5de444p23 -0x1.aca6cd81p4 0x1.b400000000002p6 0x1.184e76a371176p-47 0x0.0p0 T +REG epsg:2308 1 OK -0x1.ae8798ffbac7p15 0x1.203f294469aa3p23 -0x1.c41493bdp3 0x1.a00000001d3d1p6 -0x1.3fffffffeaef8p2 0x1.8p-29 F +REG epsg:2308 2 OK 0x1.0187666cac542p20 0x1.203f2944775b4p23 -0x1.2c3bbd76ep5 0x1.c7ffffffe2d8bp6 -0x1.3fffffffeb01bp2 -0x1.4p-28 F +REG epsg:2308 3 OK -0x1.ae86128f2a05p15 0x1.421b9ea59baefp23 -0x1.5a4f44p2 0x1.a00000001d3cdp6 0x1.3fffffffeaee6p2 0x1.4p-28 F +REG epsg:2308 4 OK 0x1.01875a3aa9ed2p20 0x1.421b9ea58dfcap23 -0x1.cd00e04dp4 0x1.c7ffffffe2d8fp6 0x1.3fffffffeb002p2 -0x1.8p-29 F +REG epsg:2309 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.d000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2309 1 OK -0x1.ad750e7d838ap15 0x1.203eca48be405p23 0x0.0p0 0x1.bc0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2309 2 OK 0x1.018fa873ec1bfp20 0x1.203eca48be405p23 0x0.0p0 0x1.e3ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2309 3 OK -0x1.ad750e7d838ap15 0x1.421b35b741bfbp23 0x0.0p0 0x1.bc0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2309 4 OK 0x1.018fa873ec1bfp20 0x1.421b35b741bfbp23 0x0.0p0 0x1.e3ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23090 0 OK 0x1.e8607da703df3p18 0x1.e3d1a500e79c2p6 -0x1.47ff05dd9p7 0x1.24e35df6fbef3p-53 -0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:23090 1 OK -0x1.accf76f25e74p15 -0x1.0ed6093b4d70dp19 -0x1.6e0b33b988p7 -0x1.3ffffffe28747p2 -0x1.3fffffffeac29p2 -0x1.0p-29 F +REG epsg:23090 2 OK 0x1.0196baa0df2a6p20 -0x1.0ed6093bed586p19 -0x1.4c02561ffp7 0x1.3ffffffe2776cp2 -0x1.3fffffffeab56p2 0x1.0p-29 F +REG epsg:23090 3 OK -0x1.accbc6a99196p15 0x1.0ef446147da2ep19 -0x1.43dc14dc2p7 -0x1.3ffffffe287f9p2 0x1.3fffffffeac08p2 -0x1.0p-28 F +REG epsg:23090 4 OK 0x1.01969d1bf1508p20 0x1.0ef446151dad7p19 -0x1.21d33eaf58p7 0x1.3ffffffe2781cp2 0x1.3fffffffeab36p2 0x1.8p-29 F +REG epsg:23095 0 OK 0x1.e85e80af7f0a5p18 0x1.e3d17be9a159bp6 -0x1.379375b4p7 0x1.3ffffffffffffp2 -0x1.2f74bf1dcfcbp-62 -0x1.8p-29 T +REG epsg:23095 1 OK -0x1.acddf1f94126p15 -0x1.0ed5f22c22cbp19 -0x1.5c5de8f718p7 0x1.d7954765ae393p-30 -0x1.3fffffffeac22p2 -0x1.0p-29 F +REG epsg:23095 2 OK 0x1.01962ffb90d4cp20 -0x1.0ed5f22cb5bdap19 -0x1.3d185991p7 0x1.3fffffff13c0dp3 -0x1.3fffffffeab62p2 0x1.0p-30 F +REG epsg:23095 3 OK -0x1.acda41adf135p15 0x1.0ef42f02c6b83p19 -0x1.322ecdf4fp7 0x1.d78a1692df886p-30 0x1.3fffffffeabffp2 -0x1.0p-30 F +REG epsg:23095 4 OK 0x1.01961276c60bp20 0x1.0ef42f0359cb1p19 -0x1.12e9456168p7 0x1.3fffffff13c67p3 0x1.3fffffffeab44p2 0x0.0p0 F +REG epsg:2310 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:2310 1 OK -0x1.ad750e7d837ep15 0x1.203eca48be405p23 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2310 2 OK 0x1.018fa873ec1bfp20 0x1.203eca48be405p23 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2310 3 OK -0x1.ad750e7d837ep15 0x1.421b35b741bfbp23 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2310 4 OK 0x1.018fa873ec1bfp20 0x1.421b35b741bfbp23 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2311 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG epsg:2311 1 OK -0x1.ad750e7d8384p15 -0x1.0ee35b741bfafp19 0x0.0p0 0x1.000000075406dp0 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2311 2 OK 0x1.018fa873ec1c2p20 -0x1.0ee35b741bfafp19 0x0.0p0 0x1.5fffffff157f3p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2311 3 OK -0x1.ad750e7d8384p15 0x1.0ee35b741bfafp19 0x0.0p0 0x1.000000075406dp0 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2311 4 OK 0x1.018fa873ec1c2p20 0x1.0ee35b741bfafp19 0x0.0p0 0x1.5fffffff157f3p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2312 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:2312 1 OK -0x1.ad892fd8997p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2312 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2312 3 OK -0x1.ad892fd8997p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2312 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2313 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:2313 1 OK -0x1.ad892fd8997p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2313 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2313 3 OK -0x1.ad892fd8997p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2313 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2314 0 OK 0x1.14e27809b135cp18 0x1.a04f0ed74ec3p17 0x1.4f7b149f4p5 -0x1.eaaaaaaaaaaadp5 0x1.4e22222222223p3 0x1.0p-30 F +REG epsg:2314 1 OK -0x1.7e1392f8eced8p20 -0x1.84fccc09d49ccp20 0x1.555cadd3fp6 -0x1.09ab8c8a7bb3ep6 0x1.5c44435f04bd9p2 -0x1.0f6p-19 F +REG epsg:2314 2 OK 0x1.0442785e5e94dp21 -0x1.84fccc09bf1f7p20 0x1.1b419932bp6 -0x1.c1fe3c40709f7p5 0x1.5c44435f6c1e7p2 -0x1.fdp-21 F +REG epsg:2314 3 OK -0x1.6fd0a231f3fc7p20 0x1.f44969222d2a1p20 0x1.ab518dcb8p3 -0x1.09ab8d29e1fc5p6 0x1.ee222159ae6c9p3 -0x1.58dp-18 F +REG epsg:2314 4 OK 0x1.fa41fdbc14fe1p20 0x1.f44969224b3fbp20 -0x1.6c7ac808p-1 -0x1.c1fe3b021f0fbp5 0x1.ee22215a1526cp3 0x1.4b8p-19 F +REG epsg:2315 0 OK 0x1.e85e596139b58p18 0x1.b995eed8d9d38p22 -0x1.0c643fbaap5 -0x1.14p6 -0x1.8ffffffffffffp4 -0x1.8p-29 F +REG epsg:2315 1 OK -0x1.fa8871f2b944p14 0x1.96ff7e8a7b51cp22 -0x1.1bf17688cp5 -0x1.2a114b818572ep6 -0x1.e000000000005p4 0x1.0p-30 F +REG epsg:2315 2 OK 0x1.f8329d095f575p19 0x1.96ff7e8a2b164p22 -0x1.499f9c3e4p4 -0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:2315 3 OK -0x1.2f8264eb7596p16 0x1.dac8e99fd1015p22 -0x1.8a300286ap5 -0x1.2a114b818572ep6 -0x1.3ffffffffffffp4 -0x1.0p-29 F +REG epsg:2315 4 OK 0x1.072753122cb26p20 0x1.dac8e99f84b33p22 -0x1.08ebfb3e2p5 -0x1.fbdd68fcf51a4p5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:2316 0 OK 0x1.e859864db2e75p18 0x1.b995fcfa4bcccp22 -0x1.9f879be6cp4 -0x1.f8p5 -0x1.9000000000004p4 -0x1.8p-29 F +REG epsg:2316 1 OK -0x1.fad338f135ep14 0x1.96ff8f602a71ap22 -0x1.aad79ac98p4 -0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2316 2 OK 0x1.f830202890358p19 0x1.96ff8f5feb858p22 -0x1.e006bb96p3 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2316 3 OK -0x1.2f94fb0eb6738p16 0x1.dac8f527894f4p22 -0x1.3daa8fe06p5 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG epsg:2316 4 OK 0x1.072612e6863f5p20 0x1.dac8f5274d77cp22 -0x1.b09c3eac8p4 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:2317 0 OK 0x1.e85ff51626d3p19 0x1.e8756d702a199p19 0x1.033775845p6 -0x1.07fffffffffffp6 0x1.7fffffffffe1ap2 -0x1.0p-30 F +REG epsg:2317 1 OK 0x1.3e3bbbb5165d4p18 0x1.4c555c2a361d8p18 0x1.1479199cp2 -0x1.2021d7c64dfb1p6 -0x1.ea835b398dd91p-38 0x0.0p0 T +REG epsg:2317 2 OK 0x1.98d1051a3b58p20 0x1.4c566a1b0038ep18 0x1.6549bb2a8p5 -0x1.dfbc50736409cp5 -0x1.eefb160077d79p-38 -0x1.0p-29 T +REG epsg:2317 3 OK 0x1.4c82a7a8c9d96p18 0x1.97346860761aap20 0x1.4367a592fp6 -0x1.2021d7c64dfb1p6 0x1.7fffffffffe5ep3 0x1.0p-30 F +REG epsg:2317 4 OK 0x1.953f4bc9c7069p20 0x1.973425205c6b8p20 0x1.e13dba06bp6 -0x1.dfbc50736409cp5 0x1.7fffffffffddfp3 -0x1.0p-30 F +REG epsg:2318 0 OK 0x1.9928fd594402fp5 -0x1.3470a25335d37p13 0x1.ff2b9d9bp2 0x1.8000000000001p5 0x1.8ffffffffff29p4 0x1.0p-30 F +REG epsg:2318 1 OK -0x1.c489fe760516dp20 -0x1.7ca30dc0c04bap20 -0x1.0223d071p3 0x1.f73075edbe9d7p4 0x1.3fffffffffe3ep3 -0x1.0p-30 F +REG epsg:2318 2 OK 0x1.c49052dae7cebp20 -0x1.7ca29aa1092b9p20 0x1.4e8947cp4 0x1.0233e2849058bp6 0x1.3fffffffffe5p3 -0x1.8p-29 F +REG epsg:2318 3 OK -0x1.6137d1f08ed36p20 0x1.aa2ac50ddeb67p20 -0x1.e0b4d85c4p4 0x1.f73075edbe9d8p4 0x1.3ffffffffffe4p5 0x0.0p0 F +REG epsg:2318 4 OK 0x1.613e4580678d9p20 0x1.aa2a577954532p20 -0x1.e0576403p2 0x1.0233e2849058bp6 0x1.3ffffffffffe4p5 0x0.0p0 F +REG epsg:2319 0 OK 0x1.e853f4a2be0cp18 0x1.e40285d1a020cp6 -0x1.01fae5091p7 0x1.bp4 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:2319 1 OK -0x1.aee9d61e14dfp15 -0x1.0ef1658382673p19 -0x1.1fd894672p7 0x1.6000000075f26p4 -0x1.3fffffffeabf8p2 -0x1.0p-30 F +REG epsg:2319 2 OK 0x1.01a1490cf6f8ap20 -0x1.0ef16583d0847p19 -0x1.0f3cf3218p7 0x1.ffffffff89eebp4 -0x1.3fffffffeab93p2 0x1.0p-30 F +REG epsg:2319 3 OK -0x1.aee62562c91ap15 0x1.0f0fa56acf1afp19 -0x1.eb530d324p6 0x1.6000000075ef8p4 0x1.3fffffffeabd4p2 -0x1.0p-30 F +REG epsg:2319 4 OK 0x1.01a12b85d0ec3p20 0x1.0f0fa56b1d495p19 -0x1.ca1bd1e62p6 0x1.ffffffff89f18p4 0x1.3fffffffeab6ep2 0x1.0p-29 F +REG epsg:2320 0 OK 0x1.e85257c38f86p18 0x1.e4027a2004951p6 -0x1.fa9e354d6p6 0x1.dffffffffffffp4 0x1.c72f1eacb7b03p-62 0x1.0p-30 T +REG epsg:2320 1 OK -0x1.aef6555c722fp15 -0x1.0ef15ef394d56p19 -0x1.1a171a8108p7 0x1.9000000075f47p4 -0x1.3fffffffeabf1p2 -0x1.8p-29 F +REG epsg:2320 2 OK 0x1.01a0de95e2f63p20 -0x1.0ef15ef3d869ep19 -0x1.0bb901e3e8p7 0x1.17ffffffc4f87p5 -0x1.3fffffffeab99p2 0x1.8p-29 F +REG epsg:2320 3 OK -0x1.aef2a49e9eaap15 0x1.0f0f9eda27eap19 -0x1.dfd01be8fp6 0x1.9000000075f1ap4 0x1.3fffffffeabdp2 -0x1.4p-28 F +REG epsg:2320 4 OK 0x1.01a0c10ed56ap20 0x1.0f0f9eda6b8d4p19 -0x1.c313f0f3ap6 0x1.17ffffffc4f9ep5 0x1.3fffffffeab76p2 0x1.0p-30 F +REG epsg:2321 0 OK 0x1.e850b3a29bf5fp18 0x1.e4027023412bcp6 -0x1.f2a39e996p6 0x1.07fffffffffffp5 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:2321 1 OK -0x1.af031dcfcf38p15 -0x1.0ef15958cd291p19 -0x1.14fdc20a88p7 0x1.c000000075f66p4 -0x1.3fffffffeabecp2 -0x1.0p-29 F +REG epsg:2321 2 OK 0x1.01a072c78dd9cp20 -0x1.0ef159590605p19 -0x1.08e746c6fp7 0x1.2fffffffc4f99p5 -0x1.3fffffffeab9fp2 -0x1.0p-30 F +REG epsg:2321 3 OK -0x1.aeff6d0f5d6fp15 0x1.0f0f993ec1b4ep19 -0x1.d59d6d356p6 0x1.c000000075f3bp4 0x1.3fffffffeabc6p2 0x1.0p-30 F +REG epsg:2321 4 OK 0x1.01a0554098e31p20 0x1.0f0f993efa9d6p19 -0x1.bd707bf48p6 0x1.2fffffffc4fb1p5 0x1.3fffffffeab7dp2 0x1.0p-30 F +REG epsg:2322 0 OK 0x1.e84f0966aae5p18 0x1.e40267e257b55p6 -0x1.ec0b9f1dbp6 0x1.2p5 0x1.c72f1eacb7b03p-62 0x1.0p-30 T +REG epsg:2322 1 OK -0x1.af102680140ep15 -0x1.0ef154b71a049p19 -0x1.10901ee54p7 0x1.f000000075f89p4 -0x1.3fffffffeabe1p2 -0x1.0p-30 F +REG epsg:2322 2 OK 0x1.01a005ed9bb34p20 -0x1.0ef154b747ffep19 -0x1.06c9bc2ecp7 0x1.47ffffffc4faap5 -0x1.3fffffffeaba8p2 0x0.0p0 F +REG epsg:2322 3 OK -0x1.af0c75bcef51p15 0x1.0f0f949c8b8d6p19 -0x1.ccc228d99p6 0x1.f000000075f5bp4 0x1.3fffffffeabbdp2 0x1.0p-29 F +REG epsg:2322 4 OK 0x1.019fe866bf55bp20 0x1.0f0f949cb992cp19 -0x1.b93567b09p6 0x1.47ffffffc4fc1p5 0x1.3fffffffeab84p2 0x1.0p-30 F +REG epsg:2323 0 OK 0x1.e84d5a3acc4c9p18 0x1.e402616312994p6 -0x1.e6dad736fp6 0x1.37ffffffffffep5 0x0.0p0 0x1.0p-30 T +REG epsg:2323 1 OK -0x1.af1d66481863p15 -0x1.0ef15111bb495p19 -0x1.0cd14c7838p7 0x1.100000003afd5p5 -0x1.3fffffffeabdbp2 0x0.0p0 F +REG epsg:2323 2 OK 0x1.019f98546c4c1p20 -0x1.0ef15111de434p19 -0x1.0561de1298p7 0x1.5fffffffc4fbcp5 -0x1.3fffffffeabaep2 0x0.0p0 F +REG epsg:2323 3 OK -0x1.af19b5822de5p15 0x1.0f0f90f6c5b0cp19 -0x1.c54485a1ep6 0x1.100000003afc1p5 0x1.3fffffffeabbbp2 0x0.0p0 F +REG epsg:2323 4 OK 0x1.019f7acda87a6p20 0x1.0f0f90f6e8b25p19 -0x1.b665ac151p6 0x1.5fffffffc4fd2p5 0x1.3fffffffeab89p2 0x1.0p-28 F +REG epsg:23239 0 OK 0x1.e804c300ab7a6p18 -0x1.cd300ef392e2cp7 0x1.a2a3318dep6 0x1.97ffffffffffep5 0x0.0p0 0x1.82p-15 T +REG epsg:23239 1 OK -0x1.af78c9dbff08p15 -0x1.0eff0c9dde551p19 0x1.2741ce0268p7 0x1.6fffffffffffep5 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:23239 2 OK 0x1.017e27a24132cp20 -0x1.0eff043fd40abp19 0x1.9f8788572p6 0x1.bffffffffffffp5 -0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:23239 3 OK -0x1.af7fd358372p15 0x1.0ec5671904ed9p19 0x1.ada7ac00cp6 0x1.6fffffffffffep5 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:23239 4 OK 0x1.017e5fe03aee6p20 0x1.0ec55ebcbdf51p19 0x1.fd569f0fep5 0x1.bffffffffffffp5 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:2324 0 OK 0x1.e84ba74d86d32p18 0x1.e4025caa00c82p6 -0x1.e314eb371p6 0x1.5p5 0x1.c72f1eacb7b03p-62 0x1.0p-30 T +REG epsg:2324 1 OK -0x1.af2ad3dc0dd3p15 -0x1.0ef14e6b3fcf7p19 -0x1.09c3eb821p7 0x1.280000003afe8p5 -0x1.3fffffffeabd5p2 -0x1.0p-29 F +REG epsg:2324 2 OK 0x1.019f2a48e5948p20 -0x1.0ef14e6b57af9p19 -0x1.04b0a8f168p7 0x1.77ffffffc4fcdp5 -0x1.3fffffffeabb7p2 -0x1.0p-29 F +REG epsg:2324 3 OK -0x1.af2723134cbbp15 0x1.0f0f8e4fff3f7p19 -0x1.bf29c50a7p6 0x1.280000003afd1p5 0x1.3fffffffeabb3p2 -0x1.0p-29 F +REG epsg:2324 4 OK 0x1.019f0cc23a3p20 0x1.0f0f8e501724ap19 -0x1.b50342201p6 0x1.77ffffffc4fe4p5 0x1.3fffffffeab91p2 -0x1.0p-30 F +REG epsg:23240 0 OK 0x1.e7ff68290cd72p18 -0x1.cd30924c0779fp7 0x1.3485dde1bp6 0x1.c7ffffffffffep5 -0x1.2f74bf1dc653ap-62 0x1.81fcp-15 T +REG epsg:23240 1 OK -0x1.afa867ffc2bdp15 -0x1.0eff59fcc799ep19 0x1.e8ad95bf8p6 0x1.ap5 -0x1.3ffffffff6119p2 0x1.7f1p-15 F +REG epsg:23240 2 OK 0x1.017cf723afbd6p20 -0x1.0eff519e952cp19 0x1.2acf5c0a7p6 0x1.efffffffffffcp5 -0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:23240 3 OK -0x1.afaf7193aa29p15 0x1.0ec5b467a43dcp19 0x1.47d17b5e6p6 0x1.ap5 0x1.3ffffffff611bp2 0x1.7f1p-15 F +REG epsg:23240 4 OK 0x1.017d2f614bac9p20 0x1.0ec5ac0b35319p19 0x1.13e5e55a4p5 0x1.efffffffffffcp5 0x1.3ffffffff611fp2 0x1.7f0cp-15 F +REG epsg:2325 0 OK 0x1.e849f1d00387ep18 0x1.e40259ba72874p6 -0x1.e0bc80d78p6 0x1.67fffffffffffp5 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2325 1 OK -0x1.af3865d0052ep15 -0x1.0ef14cc5839bcp19 -0x1.076a20411p7 0x1.400000003aff9p5 -0x1.3fffffffeabcep2 -0x1.0p-29 F +REG epsg:2325 2 OK 0x1.019ebc183db1cp20 -0x1.0ef14cc59050fp19 -0x1.04b69920b8p7 0x1.8fffffffc4fdfp5 -0x1.3fffffffeabbep2 -0x1.0p-30 F +REG epsg:2325 3 OK -0x1.af34b5045ea1p15 0x1.0f0f8caa1472ep19 -0x1.ba762f8f3p6 0x1.400000003afe2p5 0x1.3fffffffeababp2 -0x1.0p-29 F +REG epsg:2325 4 OK 0x1.019e9e91aa8acp20 0x1.0f0f8caa212acp19 -0x1.b50f227c3p6 0x1.8fffffffc4ff6p5 0x1.3fffffffeab9ap2 -0x1.0p-30 F +REG epsg:2326 0 OK 0x1.986b271b24301p19 0x1.9004ea304f73p19 0x1.5be582cp1 0x1.c8b6d744b106fp6 0x1.64fe7f856ac0ep4 0x1.00c7p-13 F +REG epsg:2326 1 OK 0x1.fe1ec6afe1178p17 0x1.0b64c66e915bap18 0x1.935bbe27p3 0x1.b3187ac84842bp6 0x1.14fe7f8529d52p4 0x1.9aefp-14 F +REG epsg:2326 2 OK 0x1.58a8165bff38ap20 0x1.0b6805e6fba36p18 -0x1.139d024ecp5 0x1.de5533c113cafp6 0x1.14fe7f8526aacp4 0x1.adf5p-13 F +REG epsg:2326 3 OK 0x1.25f7f88e28796p18 0x1.520f77182de52p20 0x1.1f7862cb8p5 0x1.b3187ac83190fp6 0x1.b4fe7f8571c76p4 0x1.116ap-14 F +REG epsg:2326 4 OK 0x1.4eec5947f3a46p20 0x1.52103c9a9e58ap20 -0x1.f656f0fap2 0x1.de5533c133a6dp6 0x1.b4fe7f8562d79p4 0x1.5e368p-13 F +REG epsg:2327 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2327 1 OK 0x1.8b0b4e445a9c8p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2327 2 OK 0x1.acee31bba5637p23 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2327 3 OK 0x1.8b0b4e445a9c8p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2327 4 OK 0x1.acee31bba5637p23 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2328 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2328 1 OK 0x1.a98fce445a9c9p23 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2328 2 OK 0x1.cb72b1bba5638p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2328 3 OK 0x1.a98fce445a9c9p23 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2328 4 OK 0x1.cb72b1bba5638p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2329 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:2329 1 OK 0x1.c8144e445a9c9p23 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2329 2 OK 0x1.e9f731bba5638p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2329 3 OK 0x1.c8144e445a9c9p23 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2329 4 OK 0x1.e9f731bba5638p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2330 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:2330 1 OK 0x1.e698ce445a9c8p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2330 2 OK 0x1.043dd8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2330 3 OK 0x1.e698ce445a9c8p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2330 4 OK 0x1.043dd8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2331 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:2331 1 OK 0x1.028ea7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2331 2 OK 0x1.138018ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2331 3 OK 0x1.028ea7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2331 4 OK 0x1.138018ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2332 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2332 1 OK 0x1.11d0e7222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2332 2 OK 0x1.22c258ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2332 3 OK 0x1.11d0e7222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2332 4 OK 0x1.22c258ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2333 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:2333 1 OK 0x1.211327222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2333 2 OK 0x1.320498ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2333 3 OK 0x1.211327222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2333 4 OK 0x1.320498ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2334 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2334 1 OK 0x1.305567222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2334 2 OK 0x1.4146d8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2334 3 OK 0x1.305567222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2334 4 OK 0x1.4146d8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2335 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2335 1 OK 0x1.3f97a7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2335 2 OK 0x1.508918ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2335 3 OK 0x1.3f97a7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2335 4 OK 0x1.508918ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2336 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:2336 1 OK 0x1.4ed9e7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2336 2 OK 0x1.5fcb58ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2336 3 OK 0x1.4ed9e7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2336 4 OK 0x1.5fcb58ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2337 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:2337 1 OK 0x1.5e1c27222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2337 2 OK 0x1.6f0d98ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2337 3 OK 0x1.5e1c27222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2337 4 OK 0x1.6f0d98ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2338 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2338 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2338 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2338 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2338 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2339 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2339 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2339 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2339 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2339 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2340 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:2340 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2340 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2340 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2340 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2341 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:2341 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2341 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2341 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2341 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2342 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:2342 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2342 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2342 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2342 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2343 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2343 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2343 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2343 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2343 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23433 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:23433 1 OK -0x1.ad89324e3d8ap15 -0x1.0edd0485be135p19 0x0.0p0 0x1.4000000000001p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23433 2 OK 0x1.0190499271ed5p20 -0x1.0edd0485be135p19 0x0.0p0 0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23433 3 OK -0x1.ad89324e3d8ap15 0x1.0edd0485be135p19 0x0.0p0 0x1.4000000000001p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23433 4 OK 0x1.0190499271ed5p20 0x1.0edd0485be135p19 0x0.0p0 0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2344 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:2344 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2344 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2344 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2344 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2345 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2345 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2345 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2345 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2345 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2346 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2346 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2346 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2346 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2346 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2347 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:2347 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2347 2 OK 0x1.019d8ddd2b1c6p20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2347 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2347 4 OK 0x1.019d8ddd2b1c6p20 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2348 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:2348 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2348 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2348 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2348 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2349 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2349 1 OK 0x1.7ca0a7222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2349 2 OK 0x1.8d9218ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2349 3 OK 0x1.7ca0a7222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2349 4 OK 0x1.8d9218ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2350 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG epsg:2350 1 OK 0x1.8be2e7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2350 2 OK 0x1.9cd458ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2350 3 OK 0x1.8be2e7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2350 4 OK 0x1.9cd458ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2351 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2351 1 OK 0x1.9b2527222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2351 2 OK 0x1.ac1698ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2351 3 OK 0x1.9b2527222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2351 4 OK 0x1.ac1698ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2352 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:2352 1 OK 0x1.aa6767222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2352 2 OK 0x1.bb58d8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2352 3 OK 0x1.aa6767222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2352 4 OK 0x1.bb58d8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2353 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:2353 1 OK 0x1.b9a9a7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2353 2 OK 0x1.ca9b18ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2353 3 OK 0x1.b9a9a7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2353 4 OK 0x1.ca9b18ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2354 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:2354 1 OK 0x1.c8ebe7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2354 2 OK 0x1.d9dd58ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2354 3 OK 0x1.c8ebe7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2354 4 OK 0x1.d9dd58ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2355 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:2355 1 OK 0x1.d82e27222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2355 2 OK 0x1.e91f98ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2355 3 OK 0x1.d82e27222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2355 4 OK 0x1.e91f98ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2356 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2356 1 OK 0x1.e77067222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2356 2 OK 0x1.f861d8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2356 3 OK 0x1.e77067222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2356 4 OK 0x1.f861d8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2357 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:2357 1 OK 0x1.f6b2a7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2357 2 OK 0x1.03d20c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2357 3 OK 0x1.f6b2a7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2357 4 OK 0x1.03d20c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2358 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG epsg:2358 1 OK 0x1.02fa739116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2358 2 OK 0x1.0b732c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2358 3 OK 0x1.02fa739116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2358 4 OK 0x1.0b732c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2359 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2359 1 OK 0x1.0a9b939116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2359 2 OK 0x1.13144c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2359 3 OK 0x1.0a9b939116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2359 4 OK 0x1.13144c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2360 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG epsg:2360 1 OK 0x1.123cb39116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2360 2 OK 0x1.1ab56c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2360 3 OK 0x1.123cb39116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2360 4 OK 0x1.1ab56c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2361 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:2361 1 OK 0x1.19ddd39116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2361 2 OK 0x1.22568c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2361 3 OK 0x1.19ddd39116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2361 4 OK 0x1.22568c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2362 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2362 1 OK 0x1.217ef39116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2362 2 OK 0x1.29f7ac6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2362 3 OK 0x1.217ef39116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2362 4 OK 0x1.29f7ac6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2363 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2363 1 OK 0x1.2920139116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2363 2 OK 0x1.3198cc6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2363 3 OK 0x1.2920139116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2363 4 OK 0x1.3198cc6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2364 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:2364 1 OK 0x1.30c1339116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2364 2 OK 0x1.3939ec6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2364 3 OK 0x1.30c1339116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2364 4 OK 0x1.3939ec6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2365 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2365 1 OK 0x1.3862539116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2365 2 OK 0x1.40db0c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2365 3 OK 0x1.3862539116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2365 4 OK 0x1.40db0c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2366 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG epsg:2366 1 OK 0x1.4003739116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2366 2 OK 0x1.487c2c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2366 3 OK 0x1.4003739116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2366 4 OK 0x1.487c2c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2367 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:2367 1 OK 0x1.47a4939116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2367 2 OK 0x1.501d4c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2367 3 OK 0x1.47a4939116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2367 4 OK 0x1.501d4c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2368 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:2368 1 OK 0x1.4f45b39116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2368 2 OK 0x1.57be6c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2368 3 OK 0x1.4f45b39116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2368 4 OK 0x1.57be6c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2369 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:2369 1 OK 0x1.56e6d39116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2369 2 OK 0x1.5f5f8c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2369 3 OK 0x1.56e6d39116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2369 4 OK 0x1.5f5f8c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2370 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2370 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2370 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2370 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2370 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23700 0 OK 0x1.3d6c9d11f8a3ep19 0x1.86aef29e9f0dfp17 -0x1.d3f087734p4 0x1.30c6f3335106bp4 0x1.7927b7e555893p5 -0x1.0p-30 F +REG epsg:23700 1 OK 0x1.4132b08d78c1p15 -0x1.3fd7c9217bb5ep18 -0x1.3dccadbc8p5 0x1.765029a744903p3 0x1.5127b7e555896p5 -0x1.0p-30 F +REG epsg:23700 2 OK 0x1.3363047892992p20 -0x1.3fd7734f82618p18 -0x1.79cf76168p4 0x1.a665d192ffc57p4 0x1.5127b7e555894p5 -0x1.0p-30 F +REG epsg:23700 3 OK 0x1.1c788332cb21cp17 0x1.7d2ada64cc115p19 -0x1.0938f7c16p5 0x1.765029a744903p3 0x1.a127b7e555896p5 0x1.0p-29 F +REG epsg:23700 4 OK 0x1.19dd8f6eec668p20 0x1.7d2ab34be1681p19 -0x1.3d1578ccp4 0x1.a665d192ffc56p4 0x1.a127b7e55589cp5 0x0.0p0 F +REG epsg:2371 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG epsg:2371 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2371 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2371 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2371 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2372 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2372 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2372 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2372 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2372 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2373 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:2373 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2373 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2373 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2373 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2374 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:2374 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2374 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2374 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2374 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2375 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:2375 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2375 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2375 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2375 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2376 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:2376 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2376 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2376 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2376 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2377 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2377 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2377 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2377 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2377 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2378 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:2378 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2378 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2378 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2378 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2379 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG epsg:2379 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2379 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2379 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2379 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2380 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2380 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2380 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2380 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2380 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2381 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG epsg:2381 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2381 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2381 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2381 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2382 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:2382 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2382 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2382 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2382 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2383 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2383 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2383 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2383 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2383 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23830 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.7ap6 0x0.0p0 0x0.0p0 T +REG epsg:23830 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.660000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23830 2 OK 0x1.70b822c131068p19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.8dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23830 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.660000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23830 4 OK 0x1.70b822c131068p19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.8dffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23831 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.86p6 0x0.0p0 0x0.0p0 T +REG epsg:23831 1 OK -0x1.5ad04582620dp18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.720000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23831 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.99ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23831 3 OK -0x1.5ad04582620dp18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.720000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23831 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.99ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23832 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.9200000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:23832 1 OK -0x1.5ad04582620dp18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.7e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23832 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.a5ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23832 3 OK -0x1.5ad04582620dp18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.7e0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23832 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.a5ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23833 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.9ep6 0x0.0p0 0x0.0p0 T +REG epsg:23833 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.8a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23833 2 OK 0x1.70b822c131068p19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.b1ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23833 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.8a0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23833 4 OK 0x1.70b822c131068p19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.b1ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23834 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.aap6 0x0.0p0 0x0.0p0 T +REG epsg:23834 1 OK -0x1.5ad04582620dp18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.960000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23834 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.bdffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23834 3 OK -0x1.5ad04582620dp18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.960000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23834 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.bdffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23835 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.b600000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:23835 1 OK -0x1.5ad04582620dp18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.a20000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23835 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.c9ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23835 3 OK -0x1.5ad04582620dp18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.a20000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23835 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.c9ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23836 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.c2p6 0x0.0p0 0x0.0p0 T +REG epsg:23836 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.ae0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23836 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.d5ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23836 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.ae0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23836 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.d5ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23837 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.cdfffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:23837 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.ba0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23837 2 OK 0x1.70b822c131074p19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.e1ffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23837 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.ba0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23837 4 OK 0x1.70b822c131074p19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.e1ffffffe2bp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23838 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.da00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:23838 1 OK -0x1.5ad04582620dp18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.c60000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23838 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.edffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23838 3 OK -0x1.5ad04582620dp18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.c60000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23838 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.edffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23839 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.e6p6 0x0.0p0 0x0.0p0 T +REG epsg:23839 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.d20000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23839 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.f9ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23839 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.d20000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23839 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.f9ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:2384 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2384 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2384 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2384 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2384 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23840 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.f1fffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:23840 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.de0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23840 2 OK 0x1.70b822c131074p19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.02fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23840 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.de0000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23840 4 OK 0x1.70b822c131074p19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.02fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23841 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.fe00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:23841 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.ea0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23841 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.08fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23841 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.ea0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23841 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.08fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23842 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.05p7 0x0.0p0 0x0.0p0 T +REG epsg:23842 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.f60000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23842 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.0efffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23842 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.f60000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23842 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.0efffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23843 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.0bp7 0x0.0p0 0x0.0p0 T +REG epsg:23843 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.010000000ea8p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23843 2 OK 0x1.70b822c131074p19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.14fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23843 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.010000000ea8p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23843 4 OK 0x1.70b822c131074p19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.14fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23844 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.11p7 0x0.0p0 0x0.0p0 T +REG epsg:23844 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.070000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23844 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.1afffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23844 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.070000000ea81p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23844 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.1afffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23845 0 OK 0x1.86ap17 0x1.6e36p20 0x0.0p0 0x1.17p7 0x0.0p0 0x0.0p0 T +REG epsg:23845 1 OK -0x1.5ad04582620b8p18 0x1.cd73d489c80b9p19 0x0.0p0 0x1.0d0000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23845 2 OK 0x1.70b822c13105cp19 0x1.cd73d489c80b9p19 0x0.0p0 0x1.20fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23845 3 OK -0x1.5ad04582620b8p18 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.0d0000000ea81p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23845 4 OK 0x1.70b822c13105cp19 0x1.f5b215bb1bfa4p20 0x0.0p0 0x1.20fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:23846 0 OK 0x1.e841d07e6e2a4p18 -0x1.3fdf5a1648a9dp2 -0x1.28d9a92dp3 0x1.7400000000001p6 0x0.0p0 -0x1.0p-30 T +REG epsg:23846 1 OK -0x1.ada8161b534cp15 -0x1.0ee4154adb1b3p19 -0x1.b28c7aacp2 0x1.6p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:23846 2 OK 0x1.018e28eaee741p20 -0x1.0ee4154ab2baep19 -0x1.62d0bba98p3 0x1.88p6 -0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:23846 3 OK -0x1.ada83d2259b9p15 0x1.0ee2d56e2f22ap19 -0x1.ea540b4dp2 0x1.6p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23846 4 OK 0x1.018e2a231f902p20 0x1.0ee2d56e06c2dp19 -0x1.7eb485388p3 0x1.88p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:23847 0 OK 0x1.e8417d65bc9efp18 -0x1.3fdf62e597cbcp2 -0x1.7e0cac098p3 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-67 -0x1.0p-30 T +REG epsg:23847 1 OK -0x1.adab253393ffp15 -0x1.0ee41cc58ed1fp19 -0x1.2a37b6a9p3 0x1.7800000000001p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23847 2 OK 0x1.018e17d712dc8p20 -0x1.0ee41cc56453fp19 -0x1.baf9ebe4p3 0x1.a000000000001p6 -0x1.3fffffffffffep2 0x1.0p-30 F +REG epsg:23847 3 OK -0x1.adab4c3aa395p15 0x1.0ee2dce8da1bep19 -0x1.461b7fb6p3 0x1.7800000000001p6 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:23847 4 OK 0x1.018e190f43e29p20 0x1.0ee2dce8af9e4p19 -0x1.d6ddb63dp3 0x1.a000000000001p6 0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:23848 0 OK 0x1.e8413c8f7d0fap18 -0x1.3fdf6c1b8e854p2 -0x1.d72071558p3 0x1.a400000000001p6 -0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:23848 1 OK -0x1.adada799e029p15 -0x1.0ee4249768fb3p19 -0x1.7fcd69d2p3 0x1.9000000000001p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:23848 2 OK 0x1.018e0b7eefcd8p20 -0x1.0ee424973cd69p19 -0x1.0b18a9008p4 0x1.b800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:23848 3 OK -0x1.adadcea0f7bep15 0x1.0ee2e4baab21ap19 -0x1.9bb133a38p3 0x1.9000000000001p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23848 4 OK 0x1.018e0cb720c94p20 0x1.0ee2e4ba7efd6p19 -0x1.190a8e974p4 0x1.b800000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23849 0 OK 0x1.e8410eb18b861p18 -0x1.3fdf759e574e2p2 -0x1.198d90cbp4 0x1.bcp6 0x0.0p0 0x1.0p-30 T +REG epsg:23849 1 OK -0x1.adaf964461cep15 -0x1.0ee42caa7add9p19 -0x1.d9174b0fp3 0x1.a800000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23849 2 OK 0x1.018e040525328p20 -0x1.0ee42caa4d8e4p19 -0x1.39bb8b3d8p4 0x1.d000000000001p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:23849 3 OK -0x1.adafbd4b8025p15 0x1.0ee2eccdb3947p19 -0x1.f4fb15afp3 0x1.a800000000001p6 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:23849 4 OK 0x1.018e053d562fbp20 0x1.0ee2eccd86459p19 -0x1.47ad713f4p4 0x1.d000000000001p6 0x1.4000000000001p2 0x0.0p0 F +REG epsg:2385 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:2385 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2385 2 OK 0x1.019d8ddd2b1c6p20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2385 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2385 4 OK 0x1.019d8ddd2b1c6p20 0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:23850 0 OK 0x1.e840f44c8f30fp18 -0x1.3fdf7f534522ep2 -0x1.487d60becp4 0x1.d4p6 0x0.0p0 0x1.0p-30 T +REG epsg:23850 1 OK -0x1.adb0ebc79e99p15 -0x1.0ee434e81ed0ap19 -0x1.1a8d758e4p4 0x1.c000000000001p6 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:23850 2 OK 0x1.018e017eab39ap20 -0x1.0ee434e7f0d5dp19 -0x1.68e2ceaa8p4 0x1.e8p6 -0x1.4p2 0x1.0p-29 F +REG epsg:23850 3 OK -0x1.adb112cec25ap15 0x1.0ee2f50b4de62p19 -0x1.287f5b47cp4 0x1.c000000000001p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:23850 4 OK 0x1.018e02b6dc44p20 0x1.0ee2f50b1febap19 -0x1.76d4b5194p4 0x1.e8p6 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:23851 0 OK 0x1.e840edaa91cb8p18 -0x1.3fdf891f1e567p2 -0x1.77dc02c38p4 0x1.ec00000000001p6 -0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:23851 1 OK -0x1.adb1a465a9d4p15 -0x1.0ee43d3937c1p19 -0x1.496b1accp4 0x1.d800000000003p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23851 2 OK 0x1.018e03f29794bp20 -0x1.0ee43d39099bap19 -0x1.980a31f44p4 0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:23851 3 OK -0x1.adb1cb6cd1a2p15 0x1.0ee2fd5c5d1e8p19 -0x1.575d00f1cp4 0x1.d800000000003p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:23851 4 OK 0x1.018e052ac8b7cp20 0x1.0ee2fd5c2ef96p19 -0x1.a5fc18dp4 0x1.0p7 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23852 0 OK 0x1.e840fade2f99cp18 -0x1.3fdf92e668ed7p2 -0x1.a7249a36p4 0x1.02p7 0x0.0p0 -0x1.0p-30 T +REG epsg:23852 1 OK -0x1.adb1be18a5b2p15 -0x1.0ee445867204ap19 -0x1.78a1227p4 0x1.fp6 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:23852 2 OK 0x1.018e0b5a09852p20 -0x1.0ee4458644362p19 -0x1.c6ad7360cp4 0x1.0cp7 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23852 3 OK -0x1.adb1e51fd01fp15 0x1.0ee305a98dae9p19 -0x1.86930903cp4 0x1.fp6 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:23852 4 OK 0x1.018e0c923acc4p20 0x1.0ee305a95fe05p19 -0x1.d49f5aa84p4 0x1.0cp7 0x1.3fffffffffffcp2 -0x1.0p-30 F +REG epsg:23853 0 OK 0x1.e8411bc26345fp18 -0x1.3fdf9c8db7afdp2 -0x1.d5d288378p4 0x1.0ep7 0x0.0p0 0x1.8p-29 T +REG epsg:23853 1 OK -0x1.adb138986ed9p15 -0x1.0ee44db884c7dp19 -0x1.a7ab21b88p4 0x1.04p7 -0x1.4p2 -0x1.0p-29 F +REG epsg:23853 2 OK 0x1.018e17a03d234p20 -0x1.0ee44db857d07p19 -0x1.f449c3c3cp4 0x1.18p7 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:23853 3 OK -0x1.adb15f9f9a6ep15 0x1.0ee30ddb96dddp19 -0x1.b59d08b84p4 0x1.04p7 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:23853 4 OK 0x1.018e18d86e996p20 0x1.0ee30ddb69e7p19 -0x1.011dd5ba2p5 0x1.18p7 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2386 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2386 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2386 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2386 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2386 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23866 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:23866 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23866 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23866 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23866 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23867 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:23867 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.78p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23867 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23867 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.78p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23867 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23868 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:23868 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:23868 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:23868 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:23868 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:23869 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:23869 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:23869 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:23869 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:23869 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:2387 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG epsg:2387 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2387 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2387 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2387 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23870 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:23870 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23870 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.e8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23870 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23870 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.e8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23871 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:23871 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:23871 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23871 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:23871 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:23872 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:23872 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:23872 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG epsg:23872 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:23872 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.0cp7 0x1.4p2 0x0.0p0 F +REG epsg:23877 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23877 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23877 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23877 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23877 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a2114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23878 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23878 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23878 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23878 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23878 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ba114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23879 0 OK 0x1.e848000000042p18 0x1.b997b10295082p22 0x0.0p0 0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23879 1 OK -0x1.fbe5023d96bp14 0x1.97014c751fc11p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23879 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23879 3 OK -0x1.2fd8271ec17d8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23879 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d2114b818572dp6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:2388 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:2388 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2388 2 OK 0x1.019d8ddd2b1c6p20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:2388 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2388 4 OK 0x1.019d8ddd2b1c6p20 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:23880 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23880 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23880 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23880 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23880 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ea114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23881 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23881 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23881 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23881 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23881 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23882 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23882 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23882 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23882 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23882 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23883 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23883 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23883 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23883 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23883 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23884 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:23884 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23884 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23884 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23884 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:23886 0 OK 0x1.e841d07e7e0dcp18 0x1.b9978e0a5db36p22 -0x1.09c206968p3 0x1.7400000000001p6 -0x1.8ffffffffffffp4 -0x1.8p-29 F +REG epsg:23886 1 OK -0x1.fc4ac862d5cep14 0x1.970126884822ep22 -0x1.9a118814p2 0x1.5deeb47e7a8d2p6 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:23886 2 OK 0x1.f82426ba73cacp19 0x1.970126885e42ap22 -0x1.50ed7608p3 0x1.8a114b818572fp6 -0x1.dfffffffffff8p4 0x1.0p-29 F +REG epsg:23886 3 OK -0x1.2ff1a53e5be4p16 0x1.daca805aca081p22 -0x1.87e2515bp2 0x1.5deeb47e7a8d2p6 -0x1.3fffffffffffep4 -0x1.0p-30 F +REG epsg:23886 4 OK 0x1.0720028e30862p20 0x1.daca805adf136p22 -0x1.530dfff4p3 0x1.8a114b818572fp6 -0x1.4000000000003p4 -0x1.0p-29 F +REG epsg:23887 0 OK 0x1.e8417d65d1a29p18 0x1.b997898a9b44ep22 -0x1.56f982dc8p3 0x1.8cp6 -0x1.9000000000003p4 -0x1.8p-29 F +REG epsg:23887 1 OK -0x1.fc50bee98346p14 0x1.9701212c18958p22 -0x1.13043c67p3 0x1.75eeb47e7a8d3p6 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:23887 2 OK 0x1.f82403559f0efp19 0x1.9701212c2fde2p22 -0x1.9dd4c60e8p3 0x1.a2114b818572fp6 -0x1.e000000000001p4 0x1.0p-30 F +REG epsg:23887 3 OK -0x1.2ff32baefe6d8p16 0x1.daca7caefcc74p22 -0x1.0fe0952d8p3 0x1.75eeb47e7a8d3p6 -0x1.4000000000003p4 -0x1.0p-29 F +REG epsg:23887 4 OK 0x1.071ff168a1418p20 0x1.daca7caf12ed2p22 -0x1.a67ffc8ap3 0x1.a2114b818572fp6 -0x1.4p4 0x1.0p-30 F +REG epsg:23888 0 OK 0x1.e8413c8f97919p18 0x1.b99784d66c304p22 -0x1.a7b4bdc68p3 0x1.a400000000001p6 -0x1.9000000000002p4 -0x1.8p-29 F +REG epsg:23888 1 OK -0x1.fc559a3ec7d6p14 0x1.97011b9174136p22 -0x1.5d1a2635p3 0x1.8deeb47e7a8d3p6 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:23888 2 OK 0x1.f823e959c6af4p19 0x1.97011b918c43ap22 -0x1.ed512f738p3 0x1.ba114b818572fp6 -0x1.dfffffffffffep4 0x1.0p-29 F +REG epsg:23888 3 OK -0x1.2ff46bb9c44e8p16 0x1.daca78d868cf6p22 -0x1.6043cep3 0x1.8deeb47e7a8d3p6 -0x1.4000000000003p4 0x1.0p-29 F +REG epsg:23888 4 OK 0x1.071fe4fdfbe84p20 0x1.daca78d87fd19p22 -0x1.fcbf4ef9p3 0x1.ba114b818572fp6 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:23889 0 OK 0x1.e8410eb1abad5p18 0x1.b9977ffb01e9cp22 -0x1.fb1148548p3 0x1.bc00000000001p6 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:23889 1 OK -0x1.fc594cc3476ap14 0x1.970115c812732p22 -0x1.aa7ab651p3 0x1.a5eeb47e7a8d3p6 -0x1.e000000000005p4 0x0.0p0 F +REG epsg:23889 2 OK 0x1.f823d90fcc5ep19 0x1.970115c82b472p22 -0x1.1f41e0afcp4 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:23889 3 OK -0x1.2ff561dd02078p16 0x1.daca74e1d207p22 -0x1.b4395b17p3 0x1.a5eeb47e7a8d3p6 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:23889 4 OK 0x1.071fdd711447fp20 0x1.daca74e1e9a4ep22 -0x1.2a6d07cb4p4 0x1.d2114b818572dp6 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:2389 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:2389 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2389 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2389 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2389 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:23890 0 OK 0x1.e840f44cb4f2dp18 0x1.b9977b05fbf0bp22 -0x1.2812a97c8p4 0x1.d4p6 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:23890 1 OK -0x1.fc5bcc18268ep14 0x1.97010fe02ea5ap22 -0x1.fa4ce615p3 0x1.bdeeb47e7a8d3p6 -0x1.dfffffffffffap4 0x1.0p-29 F +REG epsg:23890 2 OK 0x1.f823d2a560b5cp19 0x1.97010fe047d78p22 -0x1.48445efa4p4 0x1.ea114b818572ep6 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:23890 3 OK -0x1.2ff60b66553a8p16 0x1.daca70d6561fp22 -0x1.056adfe58p4 0x1.bdeeb47e7a8d2p6 -0x1.4000000000002p4 -0x1.0p-29 F +REG epsg:23890 4 OK 0x1.071fdad718265p20 0x1.daca70d66e166p22 -0x1.56ec9095cp4 0x1.ea114b818573p6 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:23891 0 OK 0x1.e840edaabce15p18 0x1.b9977605419a1p22 -0x1.53011eb04p4 0x1.ec00000000001p6 -0x1.9000000000001p4 -0x1.8p-29 F +REG epsg:23891 1 OK -0x1.fc5d113c1c3p14 0x1.970109ea592f6p22 -0x1.25d86a0a4p4 0x1.d5eeb47e7a8d3p6 -0x1.e000000000001p4 0x1.0p-29 F +REG epsg:23891 2 OK 0x1.f823d62c8327bp19 0x1.970109ea7278cp22 -0x1.713d0c8dp4 0x1.0108a5c0c2b97p7 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:23891 3 OK -0x1.2ff6667a33b28p16 0x1.daca6cc14d658p22 -0x1.319307b2p4 0x1.d5eeb47e7a8d3p6 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:23891 4 OK 0x1.071fdd3753e3cp20 0x1.daca6cc16573p22 -0x1.836173048p4 0x1.0108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:23892 0 OK 0x1.e840fade5f847p18 0x1.b9977106db10fp22 -0x1.7ddb99dcp4 0x1.0200000000001p7 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:23892 1 OK -0x1.fc5d189f1cbep14 0x1.970103f749b44p22 -0x1.4ee11cp4 0x1.edeeb47e7a8d1p6 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:23892 2 OK 0x1.f823e39b4f5c9p19 0x1.970103f762cep22 -0x1.99b8fedacp4 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:23892 3 OK -0x1.2ff6721922ep16 0x1.daca68ae2af38p22 -0x1.5e194b38p4 0x1.edeeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG epsg:23892 4 OK 0x1.071fe48b1df46p20 0x1.daca68ae42d3cp22 -0x1.af4efe15cp4 0x1.0d08a5c0c2b96p7 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:23893 0 OK 0x1.e8411bc2974bcp18 0x1.b9976c18c9fc2p22 -0x1.a829e914cp4 0x1.0ep7 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:23893 1 OK -0x1.fc5be22c57ccp14 0x1.9700fe17b0132p22 -0x1.77cd71764p4 0x1.02f75a3f3d468p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:23893 2 OK 0x1.f823facc18fb8p19 0x1.9700fe17c8b7p22 -0x1.c146a9238p4 0x1.1908a5c0c2b96p7 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:23893 3 OK -0x1.2ff62e2283d48p16 0x1.daca64a85c902p22 -0x1.8a80c8bf4p4 0x1.02f75a3f3d469p7 -0x1.3fffffffffffep4 -0x1.0p-30 F +REG epsg:23893 4 OK 0x1.071ff0bde9907p20 0x1.daca64a874004p22 -0x1.da39fc55cp4 0x1.1908a5c0c2b97p7 -0x1.4p4 -0x1.0p-30 F +REG epsg:23894 0 OK 0x1.e8414ffb24db8p18 0x1.b9976748e2342p22 -0x1.d175638e4p4 0x1.1a00000000001p7 -0x1.9000000000003p4 0x1.0p-30 F +REG epsg:23894 1 OK -0x1.fc59714a723p14 0x1.9700f85c0598dp22 -0x1.a02aa27e8p4 0x1.0ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:23894 2 OK 0x1.f8241b7dd54cp19 0x1.9700f85c1d818p22 -0x1.e7771af64p4 0x1.2508a5c0c2b97p7 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:23894 3 OK -0x1.2ff59b54ef628p16 0x1.daca60bb2aa27p22 -0x1.b64cf4d4p4 0x1.0ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:23894 4 OK 0x1.072001ad804fap20 0x1.daca60bb4160cp22 -0x1.01d506bb6p5 0x1.2508a5c0c2b97p7 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2390 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:2390 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2390 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2390 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2390 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2391 0 OK 0x1.6e3b514e900f9p20 0x1.3a0a780b19b71p6 -0x1.1aa361beep7 0x1.5000000254177p4 0x1.27411bfe90617p-27 0x1.2e8b2p-11 T +REG epsg:2391 1 OK 0x1.cd5c7573c8a53p19 -0x1.0ef527327939ap19 -0x1.37a3468f5p7 0x1.000000023130fp4 -0x1.3ffffff92b698p2 0x1.2bfb4p-12 F +REG epsg:2391 2 OK 0x1.f5c6da5300bbbp20 -0x1.0ef8535cc35b7p19 -0x1.28d6ccb4dp7 0x1.a00000028387dp4 -0x1.3ffffff95e1eep2 0x1.490bp-11 F +REG epsg:2391 3 OK 0x1.cd5fcbe758d5cp19 0x1.0f0bdefe1c0abp19 -0x1.0d43465a4p7 0x1.000000021b33dp4 0x1.4000000bc124ep2 0x1.46538p-11 F +REG epsg:2391 4 OK 0x1.f5c84a463fd5dp20 0x1.0f08dc5d89fd9p19 -0x1.fd0b4f3f6p6 0x1.a00000025bc9ep4 0x1.4000000afd97dp2 0x1.f040ep-11 F +REG epsg:2392 0 OK 0x1.312f7644ed4d8p21 0x1.1c766b7842645p6 -0x1.168375c0b8p7 0x1.80000002adf8p4 0x1.222889246a9e1p-27 0x1.679b8p-11 T +REG epsg:2392 1 OK 0x1.dad1dc41eccb4p20 -0x1.0ef614dba6081p19 -0x1.3271279fe8p7 0x1.3000000298172p4 -0x1.3ffffff937343p2 0x1.8366cp-12 F +REG epsg:2392 2 OK 0x1.74f53b0e89d05p21 -0x1.0ef9335ccab4cp19 -0x1.25d4b617fp7 0x1.d0000002d2f16p4 -0x1.3ffffff9740d6p2 0x1.8fd7cp-11 F +REG epsg:2392 3 OK 0x1.dad3809bc11d4p20 0x1.0f0ae5bd7be25p19 -0x1.0815b0caa8p7 0x1.300000027cad4p4 0x1.4000000b91fe9p2 0x1.6fd98p-11 F +REG epsg:2392 4 OK 0x1.74f5ef9b49957p21 0x1.0f07f0c5e977dp19 -0x1.f70fb10d6p6 0x1.d0000002a6154p4 0x1.4000000aae7bfp2 0x1.19a72p-10 F +REG epsg:2393 0 OK 0x1.ab4143173118fp21 0x1.fee102dc02fdbp5 -0x1.130dbc3058p7 0x1.b000000300549p4 0x1.1c4461d7a60d2p-27 0x1.a8566p-11 T +REG epsg:2393 1 OK 0x1.677abe2302c81p21 -0x1.0ef70013c3e7fp19 -0x1.2de38e1678p7 0x1.60000002f91e4p4 -0x1.3ffffff945defp2 0x1.ec7bp-12 F +REG epsg:2393 2 OK 0x1.ef0708a7d9dcdp21 -0x1.0efa0eca0d0e6p19 -0x1.237ffe496p7 0x1.000000018ca9bp5 -0x1.3ffffff98d609p2 0x1.dd42p-11 F +REG epsg:2393 3 OK 0x1.677b8c56e65e4p21 0x1.0f09f0cc3efc8p19 -0x1.038c90812p7 0x1.60000002d85aep4 0x1.4000000b58d79p2 0x1.a1ba4p-11 F +REG epsg:2393 4 OK 0x1.ef07b93e9de8fp21 0x1.0f070b9f6213bp19 -0x1.f26e9bbcp6 0x1.0000000173bbfp5 0x1.4000000a56adfp2 0x1.3e43bp-10 F +REG epsg:2394 0 OK 0x1.12a987a0fe105p22 0x1.c61a2dff6f579p5 -0x1.1044a29428p7 0x1.e00000034a462p4 0x1.1598c8553c6dcp-27 0x1.f0066p-11 T +REG epsg:2394 1 OK 0x1.e18c8d84c3a4cp21 -0x1.0ef7e835c914dp19 -0x1.29fdabd4ep7 0x1.90000003533bdp4 -0x1.3ffffff9578bcp2 0x1.330cp-11 F +REG epsg:2394 2 OK 0x1.348c6b0c66c6dp22 -0x1.0efae50a95694p19 -0x1.21da480ac8p7 0x1.18000001aaf69p5 -0x1.3ffffff9aa47ep2 0x1.183aap-10 F +REG epsg:2394 3 OK 0x1.e18d57395d926p21 0x1.0f0900d641707p19 -0x1.ff5628789p6 0x1.900000032d35fp4 0x1.4000000b16047p2 0x1.db674p-11 F +REG epsg:2394 4 OK 0x1.348cc119a0b6ap22 0x1.0f062d8abb4ffp19 -0x1.ef2b4ef38p6 0x1.180000018f9bp5 0x1.40000009f6ad8p2 0x1.658c9p-10 F +REG epsg:23946 0 OK 0x1.e888ead35682cp18 -0x1.2ae0c6d9c167dp8 0x1.9137966dp5 0x1.7400000000001p6 0x1.c72f1eacb7b08p-60 -0x1.8p-29 T +REG epsg:23946 1 OK -0x1.ab60397a836p15 -0x1.0f082dd8af639p19 0x1.d36039324p5 0x1.5ffffffffffffp6 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:23946 2 OK 0x1.019f7760cc77dp20 -0x1.0f082dda54aep19 0x1.9e25de26ep6 0x1.8800000000001p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23946 3 OK -0x1.ab6956936cdep15 0x1.0ebd7649fb032p19 0x1.93236ff5p2 0x1.5ffffffffffffp6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23946 4 OK 0x1.019fc05af7068p20 0x1.0ebd764b9f6bp19 0x1.9b50b3b38p5 0x1.8800000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23947 0 OK 0x1.e89dbbaaf4e13p18 -0x1.2ae0652a48db8p8 0x1.47000f5e8p6 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:23947 1 OK -0x1.aab435aeaffbp15 -0x1.0f07d50ab306ap19 0x1.4a2fbcfdep6 0x1.7800000000001p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23947 2 OK 0x1.01a47fbc3a83ep20 -0x1.0f07d50cdfc07p19 0x1.1c416cf2cp7 0x1.a000000000001p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:23947 3 OK -0x1.aabd52657fa2p15 0x1.0ebd1d943964dp19 0x1.e6c82dafp4 0x1.7800000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:23947 4 OK 0x1.01a4c8b8e7823p20 0x1.0ebd1d9664f36p19 0x1.6805a8d2cp6 0x1.a000000000001p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:23948 0 OK 0x1.e8b19bf582dfcp18 -0x1.2adfe9184477p8 0x1.e788064f8p6 0x1.a400000000001p6 -0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:23948 1 OK -0x1.aa0e3b10fffcp15 -0x1.0f0764405225ap19 0x1.cddefa11p6 0x1.9000000000001p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:23948 2 OK 0x1.01a9401a06896p20 -0x1.0f076443007c5p19 0x1.79b9607ef8p7 0x1.b800000000001p6 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:23948 3 OK -0x1.aa1757675638p15 0x1.0ebcace89e95ep19 0x1.fac31efe6p5 0x1.9000000000001p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:23948 4 OK 0x1.01a9891902808p20 0x1.0ebcaceb4b7bdp19 0x1.117afa5a8p7 0x1.b800000000001p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2395 0 OK 0x1.036697ae3ec5dp23 -0x1.0bff87e78fd81p6 0x1.5a922326ep5 0x1.67ffffffffffep5 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2395 1 OK 0x1.e4ea5dee74e1ep22 -0x1.0f0700d55d3fbp19 0x1.6179b1508p5 0x1.400000003a93ep5 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:2395 2 OK 0x1.145800665e824p23 -0x1.0f0700d5a4d6fp19 0x1.9e606a5ecp5 0x1.8fffffffc55ep5 -0x1.3fffffffeadfbp2 -0x1.0p-30 F +REG epsg:2395 3 OK 0x1.e4ea59d84942fp22 0x1.0ef641009a776p19 0x1.040bf0c86p5 0x1.400000003a94ap5 0x1.3fffffffeae6dp2 0x0.0p0 F +REG epsg:2395 4 OK 0x1.14580271895d3p23 0x1.0ef64100e205ep19 0x1.40f2b131ap5 0x1.8fffffffc55d6p5 0x1.3fffffffeae0cp2 -0x1.0p-30 F +REG epsg:2396 0 OK 0x1.21eaf790da586p23 -0x1.0bff7d7fab492p6 0x1.789968ef8p5 0x1.9800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2396 1 OK 0x1.10f98f807b7a2p23 -0x1.0f06f648baaf1p19 0x1.8a6dc6d4cp5 0x1.700000003a966p5 -0x1.3fffffffeae45p2 -0x1.0p-30 F +REG epsg:2396 2 OK 0x1.32dc5fa1ecd8fp23 -0x1.0f06f648e80e8p19 0x1.b10614d1cp5 0x1.bfffffffc560cp5 -0x1.3fffffffeae0ap2 -0x1.0p-29 F +REG epsg:2396 3 OK 0x1.10f98d75620cbp23 0x1.0ef636749d13ap19 0x1.2d000b3f2p5 0x1.700000003a972p5 0x1.3fffffffeae5ap2 -0x1.0p-30 F +REG epsg:2396 4 OK 0x1.32dc61ad139cap23 0x1.0ef63674ca6dap19 0x1.53985de58p5 0x1.bfffffffc5602p5 0x1.3fffffffeae1ep2 0x1.0p-30 F +REG epsg:2397 0 OK 0x1.ab4310129a03ep21 0x1.57d9bb1ccf30fp6 -0x1.dd0a48709p6 0x1.1ffffffffba12p3 -0x1.8a76fb97eeffbp-38 0x1.1c18p-17 T +REG epsg:2397 1 OK 0x1.677cf930ac3d1p21 -0x1.0ef5a179ca1d2p19 -0x1.1514768d38p7 0x1.00000001cd698p2 -0x1.3fffffffec43ep2 0x1.31ep-17 F +REG epsg:2397 2 OK 0x1.ef092b5d0f959p21 -0x1.0ef590c42fff8p19 -0x1.d0bd6715p6 0x1.bfffffff1056dp3 -0x1.3fffffffed136p2 0x1.0acp-17 F +REG epsg:2397 3 OK 0x1.677d0032f6ecap21 0x1.0f0b0d8eb9515p19 -0x1.e9361772dp6 0x1.00000001ccbeep2 0x1.3fffffffe9d94p2 0x1.2c38p-17 F +REG epsg:2397 4 OK 0x1.ef091ba469021p21 0x1.0f0b1f82bc10dp19 -0x1.8fc9facb6p6 0x1.bfffffff100f8p3 0x1.3fffffffe96efp2 0x1.021p-17 F +REG epsg:2398 0 OK 0x1.12aa8856cf7d2p22 0x1.588af2ae4b19dp6 -0x1.c21023d32p6 0x1.7ffffffffb38dp3 -0x1.b9d959b997cdfp-38 0x1.0f18p-17 T +REG epsg:2398 1 OK 0x1.e18efebdd4f88p21 -0x1.0ef58a066902p19 -0x1.07b506192p7 0x1.c0000001cc6f3p2 -0x1.3fffffffec863p2 0x1.279p-17 F +REG epsg:2398 2 OK 0x1.348d93c5e6f1p22 -0x1.0ef5773bf3858p19 -0x1.b5f11a497p6 0x1.0fffffff88023p4 -0x1.3fffffffed58ap2 0x1.f89p-18 F +REG epsg:2398 3 OK 0x1.e18f053a4c9cfp21 0x1.0f0aff19f92f1p19 -0x1.ce77106c7p6 0x1.c0000001cbc79p2 0x1.3fffffffe9bafp2 0x1.20ep-17 F +REG epsg:2398 4 OK 0x1.348d8ba6a32b4p22 0x1.0f0b1322d6bfdp19 -0x1.74fd73fe4p6 0x1.0fffffff87dfap4 0x1.3fffffffe95abp2 0x1.e61p-18 F +REG epsg:2399 0 OK 0x1.4fb3873ac4b1fp22 0x1.594fff2c520b8p6 -0x1.a71b67a03p6 0x1.dffffffffaddep3 -0x1.e8059fdfe6a99p-38 0x1.01p-17 T +REG epsg:2399 1 OK 0x1.2dd080ba9b53bp22 -0x1.0ef571f15f17cp19 -0x1.f4912828fp6 0x1.40000000e5c5cp3 -0x1.3fffffffecc9ep2 0x1.1bdp-17 F +REG epsg:2399 2 OK 0x1.71969073541eap22 -0x1.0ef55d1fad095p19 -0x1.9b49923eap6 0x1.3fffffff87e06p4 -0x1.3fffffffed9d5p2 0x1.daep-18 F +REG epsg:2399 3 OK 0x1.2dd083b7a462fp22 0x1.0f0af14e7e5b5p19 -0x1.b39e00272p6 0x1.40000000e573fp3 0x1.3fffffffe99fcp2 0x1.144p-17 F +REG epsg:2399 4 OK 0x1.71968812d5967p22 0x1.0f0b075e96cdcp19 -0x1.5a55ac4c9p6 0x1.3fffffff87bf3p4 0x1.3fffffffe949p2 0x1.c66p-18 F +REG epsg:2400 0 OK 0x1.6e4823555869p20 -0x1.0a164b0bb25ccp9 0x1.4a3067a704p8 0x1.f9dd695c19ep3 -0x1.395893ab88c28p-29 0x1.0c1a52p-7 T +REG epsg:2400 1 OK 0x1.cd7d74a4c9508p19 -0x1.0f3de43a3b7a4p19 0x1.7afa7200dp8 0x1.59dd695c54e5ap3 -0x1.3ffffffe1e469p2 0x1.0c3b0ep-7 F +REG epsg:2400 2 OK 0x1.f5d1a0f0dadb2p20 -0x1.0f3e252d990e6p19 0x1.87aab6ff6p8 0x1.4ceeb4aceb1f4p4 -0x1.3ffffffa11c2bp2 0x1.0ac5d8p-7 F +REG epsg:2400 3 OK 0x1.cd7c255b95b46p19 0x1.0eb8b15248e88p19 0x1.11ed6aa6dp8 0x1.59dd695e5459cp3 0x1.3ffffff54a75ap2 0x1.06fee6p-7 F +REG epsg:2400 4 OK 0x1.f5d21f681c988p20 0x1.0eb9445748c56p19 0x1.1e9e243358p8 0x1.4ceeb4adef774p4 0x1.3ffffff94a5a8p2 0x1.0a4f9cp-7 F +REG epsg:2401 0 OK 0x1.85199739146b9p24 0x1.4932b508d762dp6 0x1.28672dc5ap5 0x1.2bfffffffffffp6 0x0.0p0 0x1.0p-30 T +REG epsg:2401 1 OK 0x1.7ca0e12eddf83p24 -0x1.0ef4690a83657p19 0x1.7f5f42c8p4 0x1.180000001d497p6 -0x1.3fffffffeae79p2 -0x1.0p-30 F +REG epsg:2401 2 OK 0x1.8d924d440c141p24 -0x1.0ef4690add843p19 0x1.0c66594a2p5 0x1.3fffffffe2adbp6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:2401 3 OK 0x1.7ca0e27021245p24 0x1.0f08fc09ec9cap19 0x1.32733b214p5 0x1.180000001d48ep6 0x1.3fffffffeae6p2 -0x1.0p-29 F +REG epsg:2401 4 OK 0x1.8d924c02b89ffp24 0x1.0f08fc0a46c8cp19 0x1.7f29e7a54p5 0x1.3fffffffe2ae3p6 0x1.3fffffffeadeap2 0x0.0p0 F +REG epsg:2402 0 OK 0x1.945bcf8e56123p24 0x1.4932abdea4ad5p6 0x1.3deefea9cp5 0x1.37fffffffffffp6 -0x1.2f74bf1dcfcbp-63 -0x1.8p-29 T +REG epsg:2402 1 OK 0x1.8be319bfe3323p24 -0x1.0ef4617aa4fadp19 0x1.b4c1be8dp4 0x1.240000001d4ap6 -0x1.3fffffffeae6ep2 0x0.0p0 F +REG epsg:2402 2 OK 0x1.9cd4855d6f597p24 -0x1.0ef4617af2979p19 0x1.1c7104b88p5 0x1.4bffffffe2ae4p6 -0x1.3fffffffeae0bp2 0x1.0p-30 F +REG epsg:2402 3 OK 0x1.8be31b012765p24 0x1.0f08f4797cb7ap19 0x1.4d24750d8p5 0x1.240000001d498p6 0x1.3fffffffeae5ap2 -0x1.0p-29 F +REG epsg:2402 4 OK 0x1.9cd4841c1d215p24 0x1.0f08f479ca5fdp19 0x1.8f3490b2cp5 0x1.4bffffffe2aebp6 0x1.3fffffffeadf3p2 0x1.0p-29 F +REG epsg:2403 0 OK 0x1.a39e07c239d95p24 0x1.4932a4157555ep6 0x1.50397eb48p5 0x1.44p6 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:2403 1 OK 0x1.9b2552268a4b4p24 -0x1.0ef45b0e0dd3ep19 0x1.e3e48b748p4 0x1.300000001d4aap6 -0x1.3fffffffeae68p2 -0x1.0p-29 F +REG epsg:2403 2 OK 0x1.ac16bd5e74899p24 -0x1.0ef45b0e4eb7cp19 0x1.292d7ea74p5 0x1.57ffffffe2aefp6 -0x1.3fffffffeae15p2 0x1.0p-30 F +REG epsg:2403 3 OK 0x1.9b255367cf8dap24 0x1.0f08ee0c69f9ep19 0x1.64b5d8026p5 0x1.300000001d4a3p6 0x1.3fffffffeae54p2 -0x1.8p-29 F +REG epsg:2403 4 OK 0x1.ac16bc1d238e6p24 0x1.0f08ee0caae74p19 0x1.9bf108bd6p5 0x1.57ffffffe2af6p6 0x1.3fffffffeadfep2 -0x1.0p-29 F +REG epsg:2404 0 OK 0x1.b2e03fda384a6p24 0x1.49329db2bfbd1p6 0x1.5f39d884p5 0x1.4ffffffffffffp6 0x0.0p0 -0x1.0p-30 T +REG epsg:2404 1 OK 0x1.aa678a6828308p24 -0x1.0ef455c93fbfdp19 0x1.06534b882p5 0x1.3c0000001d4b6p6 -0x1.3fffffffeae5ep2 -0x1.8p-29 F +REG epsg:2404 2 OK 0x1.bb58f54cb7dep24 -0x1.0ef455c973bcbp19 0x1.3292d772ep5 0x1.63ffffffe2afap6 -0x1.3fffffffeae1cp2 0x0.0p0 F +REG epsg:2404 3 OK 0x1.aa678ba96e8aap24 0x1.0f08e8c736897p19 0x1.7916daca6p5 0x1.3c0000001d4adp6 0x1.3fffffffeae4bp2 -0x1.0p-29 F +REG epsg:2404 4 OK 0x1.bb58f40b681fcp24 0x1.0f08e8c76a8dfp19 0x1.a55660242p5 0x1.63ffffffe2b01p6 0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:24047 0 OK 0x1.e89ba7455713ep18 -0x1.20e15c784f296p8 0x1.662c586e8p6 0x1.8c00000000001p6 0x0.0p0 -0x1.0p-30 T +REG epsg:24047 1 OK -0x1.aac3a5a0e489p15 -0x1.0f067f47b95e7p19 0x1.6886d0b7cp6 0x1.7800000000001p6 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:24047 2 OK 0x1.01a3f107ffe6p20 -0x1.0f067f49d8a7ap19 0x1.2888fa5f78p7 0x1.a000000000001p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:24047 3 OK -0x1.aacc7459cbcfp15 0x1.0ebe478dee76p19 0x1.3e04871d2p5 0x1.7800000000001p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24047 4 OK 0x1.01a437936f2e8p20 0x1.0ebe47900ca4cp19 0x1.878de0c57p6 0x1.a000000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24048 0 OK 0x1.e8af565c1add5p18 -0x1.20e0e746c8383p8 0x1.0186d92bf8p7 0x1.a400000000001p6 0x0.0p0 0x1.0p-30 T +REG epsg:24048 1 OK -0x1.aa1f5d324102p15 -0x1.0f06110e8ba93p19 0x1.e8daf008ep6 0x1.9000000000001p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:24048 2 OK 0x1.01a8a65d54932p20 -0x1.0f0611112b4d7p19 0x1.840efc1d08p7 0x1.b800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:24048 3 OK -0x1.aa282b8ef441p15 0x1.0ebdd971d229ap19 0x1.1f56a5c03p6 0x1.9000000000001p6 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:24048 4 OK 0x1.01a8eceafaaf4p20 0x1.0ebdd9747071p19 0x1.1f4d21d25p7 0x1.b800000000001p6 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:2405 0 OK 0x1.c22277dbdd80ap24 0x1.493298bafec32p6 0x1.6ae58599p5 0x1.5cp6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2405 1 OK 0x1.b9a9c28a2bca2p24 -0x1.0ef451afed098p19 0x1.1775a444ap5 0x1.480000001d4cp6 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:2405 2 OK 0x1.ca9b2d2de2b89p24 -0x1.0ef451b013fadp19 0x1.389a77718p5 0x1.6fffffffe2b06p6 -0x1.3fffffffeae26p2 -0x1.0p-29 F +REG epsg:2405 3 OK 0x1.b9a9c3cb73437p24 0x1.0f08e4ad94f84p19 0x1.8a3930fcp5 0x1.480000001d4b8p6 0x1.3fffffffeae41p2 -0x1.0p-29 F +REG epsg:2405 4 OK 0x1.ca9b2bec94368p24 0x1.0f08e4adbbef6p19 0x1.ab5dff3dcp5 0x1.6fffffffe2b0dp6 0x1.3fffffffeae0fp2 -0x1.0p-29 F +REG epsg:2406 0 OK 0x1.d164afccc5447p24 0x1.49329531aea3fp6 0x1.733455b6cp5 0x1.6800000000002p6 0x0.0p0 -0x1.0p-30 T +REG epsg:2406 1 OK 0x1.c8ebfa921a2b8p24 -0x1.0ef44ec4f5df1p19 0x1.254d4a58cp5 0x1.540000001d4c8p6 -0x1.3fffffffeae4ep2 -0x1.8p-29 F +REG epsg:2406 2 OK 0x1.d9dd6507a7aa9p24 -0x1.0ef44ec50fa91p19 0x1.3b4023978p5 0x1.7bffffffe2b0fp6 -0x1.3fffffffeae2ep2 -0x1.0p-30 F +REG epsg:2406 3 OK 0x1.c8ebfbd362caap24 0x1.0f08e1c265abfp19 0x1.9810d5026p5 0x1.540000001d4cp6 0x1.3fffffffeae37p2 -0x1.0p-29 F +REG epsg:2406 4 OK 0x1.d9dd63c65a62fp24 0x1.0f08e1c27f79cp19 0x1.ae03aaff6p5 0x1.7bffffffe2b18p6 0x1.3fffffffeae16p2 0x1.0p-30 F +REG epsg:2407 0 OK 0x1.e0a6e7b2971c5p24 0x1.493293194a84bp6 0x1.782074a24p5 0x1.7400000000001p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2407 1 OK 0x1.d82e32858ab45p24 -0x1.0ef44d0a664e3p19 0x1.2fd08771cp5 0x1.600000001d4d4p6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:2407 2 OK 0x1.e91f9cdfbe75dp24 -0x1.0ef44d0a72decp19 0x1.3a82006b6p5 0x1.87ffffffe2b1ap6 -0x1.3fffffffeae38p2 -0x1.0p-29 F +REG epsg:2407 3 OK 0x1.d82e33c6d47f1p24 0x1.0f08e007b4d96p19 0x1.a294108c4p5 0x1.600000001d4cbp6 0x1.3fffffffeae31p2 -0x1.0p-30 F +REG epsg:2407 4 OK 0x1.e91f9b9e72661p24 0x1.0f08e007c16bbp19 0x1.ad4587ef8p5 0x1.87ffffffe2b22p6 0x1.3fffffffeae1cp2 0x1.0p-30 F +REG epsg:2408 0 OK 0x1.efe91f930255ap24 0x1.493292734ab6fp6 0x1.79a66e38ep5 0x1.8000000000002p6 0x0.0p0 -0x1.0p-30 T +REG epsg:2408 1 OK 0x1.e7706a6a2323fp24 -0x1.0ef44c8174d43p19 0x1.36f7fb504p5 0x1.6c0000001d4dfp6 -0x1.3fffffffeae3ep2 0x0.0p0 F +REG epsg:2408 2 OK 0x1.f861d4bbe009cp24 -0x1.0ef44c8174224p19 0x1.36609354ep5 0x1.93ffffffe2b24p6 -0x1.3fffffffeae4p2 -0x1.0p-29 F +REG epsg:2408 3 OK 0x1.e7706bab6e1f6p24 0x1.0f08df7eb9154p19 0x1.a9bb835a8p5 0x1.6c0000001d4d7p6 0x1.3fffffffeae25p2 -0x1.0p-30 F +REG epsg:2408 4 OK 0x1.f861d37a952e7p24 0x1.0f08df7eb8633p19 0x1.a9241b75ap5 0x1.93ffffffe2b2dp6 0x1.3fffffffeae25p2 -0x1.0p-30 F +REG epsg:2409 0 OK 0x1.ff2b5773ba077p24 0x1.4932934023b0cp6 0x1.77c530ddp5 0x1.8cp6 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:2409 1 OK 0x1.f6b2a24593a3bp24 -0x1.0ef44d2a81846p19 0x1.3abea0f44p5 0x1.780000001d4e8p6 -0x1.3fffffffeae38p2 -0x1.8p-29 F +REG epsg:2409 2 OK 0x1.03d20650e13fep25 -0x1.0ef44d2a73908p19 0x1.2edec23fp5 0x1.9fffffffe2b2ep6 -0x1.3fffffffeae48p2 -0x1.8p-29 F +REG epsg:2409 3 OK 0x1.f6b2a386dfd4p24 0x1.0f08e027d27a4p19 0x1.ad82286f2p5 0x1.780000001d4e1p6 0x1.3fffffffeae1dp2 -0x1.8p-29 F +REG epsg:2409 4 OK 0x1.03d205b03c6a5p25 0x1.0f08e027c4845p19 0x1.a1a24b7cep5 0x1.9fffffffe2b36p6 0x1.3fffffffeae3p2 -0x1.8p-29 F +REG epsg:2410 0 OK 0x1.0736c7ad3889bp25 0x1.4932957f45badp6 0x1.727e0e34ep5 0x1.98p6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2410 1 OK 0x1.02fa6d0ec964ap25 -0x1.0ef44f0515c4ep19 0x1.3b21d224cp5 0x1.840000001d4f3p6 -0x1.3fffffffeae2bp2 0x0.0p0 F +REG epsg:2410 2 OK 0x1.0b73224b8a8cdp25 -0x1.0ef44f04fa992p19 0x1.2401d1908p5 0x1.abffffffe2b3ap6 -0x1.3fffffffeae5p2 -0x1.0p-29 F +REG epsg:2410 3 OK 0x1.02fa6daf7018ep25 0x1.0f08e2028a656p19 0x1.ade55990ep5 0x1.840000001d4edp6 0x1.3fffffffeae15p2 0x0.0p0 F +REG epsg:2410 4 OK 0x1.0b7321aae64ccp25 0x1.0f08e2026f358p19 0x1.96c55c6b8p5 0x1.abffffffe2b3fp6 0x1.3fffffffeae37p2 0x0.0p0 F +REG epsg:24100 0 OK 0x1.0c8dfffffffffp19 0x1.869ffffffffffp18 0x0.0p0 -0x1.34p6 0x1.1fffffffffee1p4 0x0.0p0 F +REG epsg:24100 1 OK -0x1.4439b6b4b4294p20 -0x1.5387a4faa069ap20 0x0.0p0 -0x1.49077c9109a7dp6 0x1.9fffffffffdeap3 0x0.0p0 F +REG epsg:24100 2 OK 0x1.2863db5a5a153p21 -0x1.5387a4faa069ap20 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.9fffffffffdeap3 0x0.0p0 F +REG epsg:24100 3 OK -0x1.2b0f961f9b4d8p20 0x1.11dd18438ccddp21 0x0.0p0 -0x1.49077c9109a7dp6 0x1.6ffffffffffp4 0x0.0p0 F +REG epsg:24100 4 OK 0x1.1bcecb0fcda75p21 0x1.11dd18438ccddp21 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.6ffffffffffp4 0x0.0p0 F +REG epsg:2411 0 OK 0x1.0ed7e3a66b12fp25 0x1.4932992f1d556p6 0x1.69d4ba3ecp5 0x1.a4p6 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:2411 1 OK 0x1.0a9b88fbecca4p25 -0x1.0ef4520fe4a1fp19 0x1.382149482p5 0x1.900000001d4fep6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:2411 2 OK 0x1.13143e50be224p25 -0x1.0ef4520fbc515p19 0x1.15d16078ep5 0x1.b7ffffffe2b41p6 -0x1.3fffffffeae5ap2 -0x1.0p-29 F +REG epsg:2411 3 OK 0x1.0a9b899c941bdp25 0x1.0f08e50d93c9fp19 0x1.aae4d1264p5 0x1.900000001d4f6p6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:2411 4 OK 0x1.13143db01a74dp25 0x1.0f08e50d6b734p19 0x1.8894ed6e8p5 0x1.b7ffffffe2b49p6 0x1.3fffffffeae44p2 -0x1.8p-29 F +REG epsg:2412 0 OK 0x1.1678ffa847dd1p25 0x1.49329e4d14533p6 0x1.5dcf48b8p5 0x1.bp6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2412 1 OK 0x1.123ca4ed0fb62p25 -0x1.0ef45648cbb67p19 0x1.31bf2198ap5 0x1.9c0000001d507p6 -0x1.3fffffffeae1ap2 -0x1.0p-30 F +REG epsg:2412 2 OK 0x1.1ab55a6346d22p25 -0x1.0ef45648965d9p19 0x1.04576397cp5 0x1.c3ffffffe2b4bp6 -0x1.3fffffffeae6p2 -0x1.0p-29 F +REG epsg:2412 3 OK 0x1.123ca58db7a5ep25 0x1.0f08e946cc19bp19 0x1.a482aa698p5 0x1.9c0000001d503p6 0x1.3fffffffeae04p2 0x0.0p0 F +REG epsg:2412 4 OK 0x1.1ab559c2a3b3fp25 0x1.0f08e94696b8fp19 0x1.771af325p5 0x1.c3ffffffe2b56p6 0x1.3fffffffeae4dp2 -0x1.8p-29 F +REG epsg:2413 0 OK 0x1.1e1a1bb59c118p25 0x1.4932a4d593a99p6 0x1.4e7628d8ap5 0x1.bc00000000002p6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2413 1 OK 0x1.19ddc0e50b0dbp25 -0x1.0ef45bacd4acap19 0x1.27ffd5a78p5 0x1.a80000001d513p6 -0x1.3fffffffeae13p2 -0x1.0p-30 F +REG epsg:2413 2 OK 0x1.22567685e613fp25 -0x1.0ef45bac92713p19 0x1.df403c038p4 0x1.cfffffffe2b57p6 -0x1.3fffffffeae67p2 -0x1.0p-30 F +REG epsg:2413 3 OK 0x1.19ddc185b39bep25 0x1.0f08eeab3cc5ep19 0x1.9ac35feacp5 0x1.a80000001d50ap6 0x1.3fffffffeadfbp2 -0x1.0p-30 F +REG epsg:2413 4 OK 0x1.225675e543813p25 0x1.0f08eeaafa80cp19 0x1.6263b0a1ep5 0x1.cfffffffe2b5fp6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG epsg:2414 0 OK 0x1.25bb37d12cceap25 0x1.4932acc405f55p6 0x1.3bd41f69cp5 0x1.c800000000003p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2414 1 OK 0x1.217edce6b2e92p25 -0x1.0ef4623837504p19 0x1.1aea3c3a4p5 0x1.b40000001d51cp6 -0x1.3fffffffeae0bp2 0x1.8p-29 F +REG epsg:2414 2 OK 0x1.29f792bb52161p25 -0x1.0ef46237e8615p19 0x1.af74314b8p4 0x1.dbffffffe2b63p6 -0x1.3fffffffeae72p2 -0x1.8p-29 F +REG epsg:2414 3 OK 0x1.217edd875c15cp25 0x1.0f08f5371d51cp19 0x1.8dadc86e4p5 0x1.b40000001d515p6 0x1.3fffffffeadf3p2 -0x1.0p-30 F +REG epsg:2414 4 OK 0x1.29f7921ab00aap25 0x1.0f08f536ce572p19 0x1.4a7daed1ep5 0x1.dbffffffe2b6ap6 0x1.3fffffffeae5bp2 -0x1.4p-28 F +REG epsg:2415 0 OK 0x1.2d5c53fdb5363p25 0x1.4932b612dab14p6 0x1.25f63f382p5 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2415 1 OK 0x1.291ff8f4d4978p25 -0x1.0ef469e65c37p19 0x1.0a87837cap5 0x1.c00000001d526p6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:2415 2 OK 0x1.3198af0633d6ap25 -0x1.0ef469e600cc6p19 0x1.796c30384p4 0x1.e7ffffffe2b68p6 -0x1.3fffffffeae7ap2 0x0.0p0 F +REG epsg:2415 3 OK 0x1.291ff9957e622p25 0x1.0f08fce5d5fa4p19 0x1.7d4b121fp5 0x1.c00000001d522p6 0x1.3fffffffeade8p2 0x1.0p-30 F +REG epsg:2415 4 OK 0x1.3198ae65924e1p25 0x1.0f08fce57a822p19 0x1.2f79b24a4p5 0x1.e7ffffffe2b73p6 0x1.3fffffffeae62p2 -0x1.8p-29 F +REG epsg:2416 0 OK 0x1.34fd703de483p25 0x1.4932c0bb8a1dfp6 0x1.0cebdfe62p5 0x1.dfffffffffffep6 0x0.0p0 0x1.0p-30 T +REG epsg:2416 1 OK 0x1.30c1151234a79p25 -0x1.0ef472b1dff7ep19 0x1.edc655244p4 0x1.cc0000001d533p6 -0x1.3fffffffeadf8p2 0x1.0p-29 F +REG epsg:2416 2 OK 0x1.3939cb6925464p25 -0x1.0ef472b178523p19 0x1.3d4e21c2p4 0x1.f3ffffffe2b76p6 -0x1.3fffffffeae8p2 0x0.0p0 F +REG epsg:2416 3 OK 0x1.30c115b2df0f3p25 0x1.0f0905b202ef4p19 0x1.69a6bc1ecp5 0x1.cc0000001d52cp6 0x1.3fffffffeade6p2 0x1.0p-29 F +REG epsg:2416 4 OK 0x1.3939cac8843b9p25 0x1.0f0905b19b3a1p19 0x1.116aaf84ep5 0x1.f3ffffffe2b78p6 0x1.3fffffffeae68p2 -0x1.8p-29 F +REG epsg:2417 0 OK 0x1.3c9e8c945c26cp25 0x1.4932ccb699d49p6 0x1.e18d26578p4 0x1.ebfffffffffffp6 0x0.0p0 0x1.0p-29 T +REG epsg:2417 1 OK 0x1.386231418cf69p25 -0x1.0ef47c9496f2dp19 0x1.c015f3098p4 0x1.d80000001d53dp6 -0x1.3fffffffeadf1p2 0x1.0p-29 F +REG epsg:2417 2 OK 0x1.40dae7e6af741p25 -0x1.0ef47c94235b9p19 0x1.f688682ap3 0x1.ffffffffe2b7ep6 -0x1.3fffffffeae89p2 -0x1.0p-30 F +REG epsg:2417 3 OK 0x1.386231e237f9dp25 0x1.0f090f9578196p19 0x1.52ce8e754p5 0x1.d80000001d534p6 0x1.3fffffffeadd9p2 0x1.0p-28 F +REG epsg:2417 4 OK 0x1.40dae7460ee23p25 0x1.0f090f950470fp19 0x1.e0cb7b294p4 0x1.ffffffffe2b85p6 0x1.3fffffffeae7p2 -0x1.0p-28 F +REG epsg:2418 0 OK 0x1.443fa903adf19p25 0x1.4932d9fba2077p6 0x1.a3343101p4 0x1.f7ffffffffffep6 0x0.0p0 0x1.0p-30 T +REG epsg:2418 1 OK 0x1.40034d858ac6ep25 -0x1.0ef4878791a4ep19 0x1.8c1def32p4 0x1.e40000001d547p6 -0x1.3fffffffeadecp2 0x0.0p0 F +REG epsg:2418 2 OK 0x1.487c048148c73p25 -0x1.0ef48787126d9p19 0x1.66f979f28p3 0x1.05fffffff15c1p7 -0x1.3fffffffeae92p2 -0x1.0p-28 F +REG epsg:2418 3 OK 0x1.40034e263664p25 0x1.0f091a894570ap19 0x1.38d290644p5 0x1.e40000001d53dp6 0x1.3fffffffeadd4p2 -0x1.0p-30 F +REG epsg:2418 4 OK 0x1.487c03e0a8a88p25 0x1.0f091a88c6266p19 0x1.99040eb5cp4 0x1.05fffffff15c5p7 0x1.3fffffffeae78p2 0x1.0p-30 F +REG epsg:2419 0 OK 0x1.4be0c58e5a448p25 0x1.4932e88153656p6 0x1.5ef89e878p4 0x1.01fffffffffffp7 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:2419 1 OK 0x1.47a469e0ccdf2p25 -0x1.0ef4938321848p19 0x1.5202c022cp4 0x1.f00000001d54cp6 -0x1.3fffffffeade6p2 0x0.0p0 F +REG epsg:2419 2 OK 0x1.501d213b53441p25 -0x1.0ef4938297073p19 0x1.98a86546p2 0x1.0bfffffff15c8p7 -0x1.3fffffffeae95p2 -0x1.0p-28 F +REG epsg:2419 3 OK 0x1.47a46a817913fp25 0x1.0f092685bbd78p19 0x1.1bc4fd2c6p5 0x1.f00000001d541p6 0x1.3fffffffeadcap2 0x1.0p-30 F +REG epsg:2419 4 OK 0x1.501d209ab392cp25 0x1.0f0926853145bp19 0x1.4bb176864p4 0x1.0bfffffff15ccp7 0x1.3fffffffeae7fp2 -0x1.8p-29 F +REG epsg:2420 0 OK 0x1.5381e236ce506p25 0x1.4932f83d7da21p6 0x1.150a4ec44p4 0x1.07fffffffffffp7 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:2420 1 OK 0x1.4f458655e1b3dp25 -0x1.0ef4a07ede659p19 0x1.11ed2ac5cp4 0x1.fc0000001d556p6 -0x1.3fffffffeaddcp2 0x1.0p-29 F +REG epsg:2420 2 OK 0x1.57be3e171ae03p25 -0x1.0ef4a07e49044p19 0x1.38289c6p0 0x1.11fffffff15cap7 -0x1.3fffffffeae9fp2 -0x1.0p-28 F +REG epsg:2420 3 OK 0x1.4f4586f68e7dbp25 0x1.0f09338272804p19 0x1.f7746e7ep4 0x1.fc0000001d54fp6 0x1.3fffffffeadc3p2 0x1.0p-30 F +REG epsg:2420 4 OK 0x1.57be3d767b962p25 0x1.0f093381dd08dp19 0x1.f213e67dp3 0x1.11fffffff15dp7 0x1.3fffffffeae88p2 -0x1.8p-29 F +REG epsg:24200 0 OK 0x1.e80e9d5d0e434p17 0x1.2467c826c3c9ep17 0x1.37bf02abp3 -0x1.34p6 0x1.1fffffffffeecp4 0x0.0p0 F +REG epsg:24200 1 OK -0x1.3af6015b9f646p18 -0x1.82da194e3f6fcp18 0x1.6d431d8dep5 -0x1.49077c9109a7dp6 0x1.9fffffffffdf4p3 0x1.0p-30 F +REG epsg:24200 2 OK 0x1.918251656c319p19 -0x1.82da89d8f74f4p18 0x1.92a247424p4 -0x1.1ef8836ef6583p6 0x1.9fffffffffe02p3 0x1.0p-30 F +REG epsg:24200 3 OK -0x1.1c47427bedb78p18 0x1.5b7b1766c9ad5p19 -0x1.4f42c7b5p2 -0x1.49077c9109a7dp6 0x1.6ffffffffff0bp4 -0x1.8p-29 F +REG epsg:24200 4 OK 0x1.822aee3e43ec8p19 0x1.5b7b4f1717764p19 -0x1.8994992cp4 -0x1.1ef8836ef6583p6 0x1.6ffffffffff0dp4 0x1.8p-29 F +REG epsg:2421 0 OK 0x1.5b22feff6261fp25 0x1.49330925169afp6 0x1.8b3a4237p3 0x1.0ep7 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:2421 1 OK 0x1.56e6a2e7459bfp25 -0x1.0ef4ae71ac5e7p19 0x1.98144ba28p3 0x1.040000000eaaep7 -0x1.3fffffffeadd6p2 0x1.0p-30 F +REG epsg:2421 2 OK 0x1.5f5f5b16d3e68p25 -0x1.0ef4ae710c828p19 -0x1.10ffcd26p2 0x1.17fffffff15cep7 -0x1.3fffffffeaea5p2 -0x1.8p-29 F +REG epsg:2421 3 OK 0x1.56e6a387f2f7dp25 0x1.0f0941764cd2p19 0x1.b19173e84p4 0x1.040000000eaacp7 0x1.3fffffffeadbcp2 0x1.8p-29 F +REG epsg:2421 4 OK 0x1.5f5f5a7634fd2p25 0x1.0f094175acde7p19 0x1.428f06688p3 0x1.17fffffff15d1p7 0x1.3fffffffeae8dp2 -0x1.0p-29 F +REG epsg:2422 0 OK 0x1.e855ce451ae59p18 0x1.4932b508d762dp6 0x1.28672dc5ap5 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2422 1 OK -0x1.aebda2440fa9p15 -0x1.0ef4690a83657p19 0x1.7f5f42c8p4 0x1.180000001d497p6 -0x1.3fffffffeae79p2 -0x1.0p-30 F +REG epsg:2422 2 OK 0x1.01a0d440c1411p20 -0x1.0ef4690add843p19 0x1.0c66594a2p5 0x1.3fffffffe2adbp6 -0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:2422 3 OK -0x1.aebb1fbdb756p15 0x1.0f08fc09ec9cap19 0x1.32733b214p5 0x1.180000001d48fp6 0x1.3fffffffeae6p2 -0x1.0p-29 F +REG epsg:2422 4 OK 0x1.01a0c02b89feap20 0x1.0f08fc0a46c8cp19 0x1.7f29e7a54p5 0x1.3fffffffe2ae2p6 0x1.3fffffffeadecp2 -0x1.0p-29 F +REG epsg:2423 0 OK 0x1.e853e395848dcp18 0x1.4932abdea4ad5p6 0x1.3deefea9cp5 0x1.38p6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2423 1 OK -0x1.aecc80399b91p15 -0x1.0ef4617aa4fadp19 0x1.b4c1be8dp4 0x1.240000001d4ap6 -0x1.3fffffffeae6ep2 0x0.0p0 F +REG epsg:2423 2 OK 0x1.01a055d6f597p20 -0x1.0ef4617af2979p19 0x1.1c7104b88p5 0x1.4bffffffe2ae4p6 -0x1.3fffffffeae0bp2 0x1.0p-30 F +REG epsg:2423 3 OK -0x1.aec9fdb135fbp15 0x1.0f08f4797cb7ap19 0x1.4d24750d8p5 0x1.240000001d499p6 0x1.3fffffffeae5ap2 -0x1.0p-29 F +REG epsg:2423 4 OK 0x1.01a041c1d2154p20 0x1.0f08f479ca5fdp19 0x1.8f3490b2cp5 0x1.4bffffffe2aecp6 0x1.3fffffffeadf4p2 0x1.0p-30 F +REG epsg:2424 0 OK 0x1.e851f08e76535p18 0x1.4932a4157555ep6 0x1.50397eb48p5 0x1.44p6 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:2424 1 OK -0x1.aedbb2eb6973p15 -0x1.0ef45b0e0dd3ep19 0x1.e3e48b748p4 0x1.300000001d4abp6 -0x1.3fffffffeae69p2 -0x1.8p-29 F +REG epsg:2424 2 OK 0x1.019fd5e748992p20 -0x1.0ef45b0e4eb7cp19 0x1.292d7ea74p5 0x1.57ffffffe2aefp6 -0x1.3fffffffeae15p2 0x1.0p-30 F +REG epsg:2424 3 OK -0x1.aed93060e4b9p15 0x1.0f08ee0c69f9ep19 0x1.64b5d8026p5 0x1.300000001d4a3p6 0x1.3fffffffeae54p2 -0x1.8p-29 F +REG epsg:2424 4 OK 0x1.019fc1d238e66p20 0x1.0f08ee0caae74p19 0x1.9bf108bd6p5 0x1.57ffffffe2af7p6 0x1.3fffffffeadfep2 -0x1.0p-29 F +REG epsg:2425 0 OK 0x1.e84ff68e12994p18 0x1.49329db2bfbd1p6 0x1.5f39d884p5 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:2425 1 OK -0x1.aeeb2faf9f01p15 -0x1.0ef455c93fbfdp19 0x1.06534b882p5 0x1.3c0000001d4b4p6 -0x1.3fffffffeae5ep2 -0x1.8p-29 F +REG epsg:2425 2 OK 0x1.019f54cb7ddf8p20 -0x1.0ef455c973bcbp19 0x1.3292d772ep5 0x1.63ffffffe2af9p6 -0x1.3fffffffeae1cp2 0x0.0p0 F +REG epsg:2425 3 OK -0x1.aee8ad22eac1p15 0x1.0f08e8c736897p19 0x1.7916daca6p5 0x1.3c0000001d4adp6 0x1.3fffffffeae4bp2 -0x1.0p-29 F +REG epsg:2425 4 OK 0x1.019f40b681fc5p20 0x1.0f08e8c76a8dfp19 0x1.a55660242p5 0x1.63ffffffe2b01p6 0x1.3fffffffeae03p2 -0x1.0p-30 F +REG epsg:2426 0 OK 0x1.e84df6f760283p18 0x1.493298bafec32p6 0x1.6ae58599p5 0x1.5cp6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2426 1 OK -0x1.aefaeba86bc5p15 -0x1.0ef451afed098p19 0x1.1775a444ap5 0x1.480000001d4cp6 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG epsg:2426 2 OK 0x1.019ed2de2b88cp20 -0x1.0ef451b013fadp19 0x1.389a77718p5 0x1.6fffffffe2b05p6 -0x1.3fffffffeae27p2 -0x1.0p-29 F +REG epsg:2426 3 OK -0x1.aef869197927p15 0x1.0f08e4ad94f84p19 0x1.8a3930fcp5 0x1.480000001d4b7p6 0x1.3fffffffeae41p2 -0x1.0p-29 F +REG epsg:2426 4 OK 0x1.019ebec94367ap20 0x1.0f08e4adbbef6p19 0x1.ab5dff3dcp5 0x1.6fffffffe2b0dp6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:2427 0 OK 0x1.e84bf331511a3p18 0x1.49329531aea3fp6 0x1.733455b6cp5 0x1.68p6 0x0.0p0 -0x1.0p-30 T +REG epsg:2427 1 OK -0x1.af0adbcba8f5p15 -0x1.0ef44ec4f5df1p19 0x1.254d4a58cp5 0x1.540000001d4c9p6 -0x1.3fffffffeae4ep2 -0x1.0p-29 F +REG epsg:2427 2 OK 0x1.019e507a7aa92p20 -0x1.0ef44ec50fa91p19 0x1.3b4023978p5 0x1.7bffffffe2b1p6 -0x1.3fffffffeae2ep2 -0x1.0p-30 F +REG epsg:2427 3 OK -0x1.af08593a6ab2p15 0x1.0f08e1c265abfp19 0x1.9810d5026p5 0x1.540000001d4c2p6 0x1.3fffffffeae37p2 -0x1.0p-29 F +REG epsg:2427 4 OK 0x1.019e3c65a62eep20 0x1.0f08e1c27f79cp19 0x1.ae03aaff6p5 0x1.7bffffffe2b18p6 0x1.3fffffffeae16p2 0x1.0p-30 F +REG epsg:2428 0 OK 0x1.e849eca5c7142p18 0x1.493293194a84bp6 0x1.782074a24p5 0x1.7400000000001p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2428 1 OK -0x1.af1af4ea976bp15 -0x1.0ef44d0a664e3p19 0x1.2fd08771cp5 0x1.600000001d4d3p6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:2428 2 OK 0x1.019dcdfbe75d2p20 -0x1.0ef44d0a72decp19 0x1.3a82006b6p5 0x1.87ffffffe2b1ap6 -0x1.3fffffffeae38p2 -0x1.0p-29 F +REG epsg:2428 3 OK -0x1.af18725701d7p15 0x1.0f08e007b4d96p19 0x1.a294108c4p5 0x1.600000001d4cbp6 0x1.3fffffffeae31p2 -0x1.0p-30 F +REG epsg:2428 4 OK 0x1.019db9e72660ep20 0x1.0f08e007c16bbp19 0x1.ad4587ef8p5 0x1.87ffffffe2b22p6 0x1.3fffffffeae1cp2 0x1.0p-30 F +REG epsg:2429 0 OK 0x1.e847e4c09566bp18 0x1.493292734ab6fp6 0x1.79a66e38ep5 0x1.8000000000001p6 0x0.0p0 -0x1.0p-30 T +REG epsg:2429 1 OK -0x1.af2b2bb9b825p15 -0x1.0ef44c8174d43p19 0x1.36f7fb504p5 0x1.6c0000001d4dep6 -0x1.3fffffffeae3ep2 0x0.0p0 F +REG epsg:2429 2 OK 0x1.019d4bbe009cp20 -0x1.0ef44c8174224p19 0x1.36609354ep5 0x1.93ffffffe2b24p6 -0x1.3fffffffeae4p2 -0x1.0p-29 F +REG epsg:2429 3 OK -0x1.af28a923c13dp15 0x1.0f08df7eb9154p19 0x1.a9bb835a8p5 0x1.6c0000001d4d7p6 0x1.3fffffffeae25p2 -0x1.0p-30 F +REG epsg:2429 4 OK 0x1.019d37a952e6ep20 0x1.0f08df7eb8633p19 0x1.a9241b75ap5 0x1.93ffffffe2b2bp6 0x1.3fffffffeae25p2 -0x1.0p-30 F +REG epsg:2430 0 OK 0x1.e845dcee81dcfp18 0x1.4932934023b0cp6 0x1.77c530ddp5 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:2430 1 OK -0x1.af3b74d8b893p15 -0x1.0ef44d2a81846p19 0x1.3abea0f44p5 0x1.780000001d4e9p6 -0x1.3fffffffeae38p2 -0x1.8p-29 F +REG epsg:2430 2 OK 0x1.019cca1c27fc6p20 -0x1.0ef44d2a73908p19 0x1.2edec23fp5 0x1.9fffffffe2b2fp6 -0x1.3fffffffeae48p2 -0x1.0p-29 F +REG epsg:2430 3 OK -0x1.af38f24057f8p15 0x1.0f08e027d27a4p19 0x1.ad82286f2p5 0x1.780000001d4e2p6 0x1.3fffffffeae1dp2 -0x1.8p-29 F +REG epsg:2430 4 OK 0x1.019cb6078d4a2p20 0x1.0f08e027c4845p19 0x1.a1a24b7cep5 0x1.9fffffffe2b36p6 0x1.3fffffffeae3p2 -0x1.8p-29 F +REG epsg:24305 0 OK 0x1.e872e3c1dd467p18 -0x1.0be40d80ee907p8 0x1.7484fe10cp5 0x1.5cp6 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:24305 1 OK -0x1.ac118b520eb5p15 -0x1.0f04585ceeb55p19 0x1.de8376fcap5 0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:24305 2 OK 0x1.0199fe58b1bfap20 -0x1.0f04585e04ff5p19 0x1.667bc4456p6 0x1.7000000000001p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24305 3 OK -0x1.ac19b6dbdefp15 0x1.0ec15febaee2cp19 0x1.a30ceb648p3 0x1.48p6 0x1.3fffffffffffdp2 -0x1.0p-30 F +REG epsg:24305 4 OK 0x1.019a3fbf4c386p20 0x1.0ec15fecc4a6ep19 0x1.5737bfa46p5 0x1.7000000000001p6 0x1.4p2 -0x1.8p-29 F +REG epsg:24306 0 OK 0x1.e887eb8107caep18 -0x1.0be3cf6d18457p8 0x1.13dec4a8p6 0x1.7400000000001p6 0x0.0p0 -0x1.0p-30 T +REG epsg:24306 1 OK -0x1.ab6568e4654dp15 -0x1.0f0419678d599p19 0x1.2af4a2b09p6 0x1.6p6 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:24306 2 OK 0x1.019f2133390fep20 -0x1.0f0419692c46fp19 0x1.dca4a8671p6 0x1.8800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:24306 3 OK -0x1.ab6d9417c654p15 0x1.0ec12105b34efp19 0x1.c05285e34p4 0x1.6p6 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:24306 4 OK 0x1.019f629c2c88ap20 0x1.0ec1210751746p19 0x1.21c4fd0e5p6 0x1.8800000000001p6 0x1.3fffffffffffep2 0x1.0p-30 F +REG epsg:2431 0 OK 0x1.e843d69c44d9fp18 0x1.4932957f45badp6 0x1.727e0e34ep5 0x1.9800000000001p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:2431 1 OK -0x1.af4bc4da6d89p15 -0x1.0ef44f0515c4ep19 0x1.3b21d224cp5 0x1.840000001d4f3p6 -0x1.3fffffffeae2bp2 0x0.0p0 F +REG epsg:2431 2 OK 0x1.019c497151992p20 -0x1.0ef44f04fa992p19 0x1.2401d1908p5 0x1.abffffffe2b38p6 -0x1.3fffffffeae5p2 -0x1.8p-29 F +REG epsg:2431 3 OK -0x1.af49423f9c95p15 0x1.0f08e2028a656p19 0x1.ade55990ep5 0x1.840000001d4ebp6 0x1.3fffffffeae15p2 0x0.0p0 F +REG epsg:2431 4 OK 0x1.019c355cc9984p20 0x1.0f08e2026f358p19 0x1.96c55c6b8p5 0x1.abffffffe2b4p6 0x1.3fffffffeae38p2 0x0.0p0 F +REG epsg:24311 0 OK 0x1.e839a3a951e61p18 -0x1.cdced50b9dfcbp7 0x1.8e767c907p6 0x1.f8p5 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:24311 1 OK -0x1.add2ec441048p15 -0x1.0eff239dbdee8p19 0x1.01e20ddcd8p7 0x1.d000000000003p5 -0x1.3fffffffffffcp2 -0x1.0p-30 F +REG epsg:24311 2 OK 0x1.018b692cbaac2p20 -0x1.0eff239d60ab5p19 0x1.dbd87ca75p6 0x1.1000000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24311 3 OK -0x1.add9f7ba75bfp15 0x1.0ec56a40b2cb2p19 0x1.62b16a43dp6 0x1.d000000000001p5 0x1.3fffffffffffcp2 0x1.8p-29 F +REG epsg:24311 4 OK 0x1.018ba185751dbp20 0x1.0ec56a4055aebp19 0x1.3ac5ba907p6 0x1.1000000000001p6 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:24312 0 OK 0x1.e84cf27030f13p18 -0x1.cdcede7a1b98p7 0x1.8690a6e79p6 0x1.14p6 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:24312 1 OK -0x1.ad38ccf2a126p15 -0x1.0eff2929df1c3p19 0x1.e11795964p6 0x1.0p6 -0x1.4p2 0x1.0p-29 F +REG epsg:24312 2 OK 0x1.01903fa32461ep20 -0x1.0eff2929ff3c9p19 0x1.eed813737p6 0x1.28p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:24312 3 OK -0x1.ad3fd8298802p15 0x1.0ec56fcba8a3fp19 0x1.4004d5aebp6 0x1.0p6 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:24312 4 OK 0x1.019077fde1a7cp20 0x1.0ec56fcbc8b6fp19 0x1.4dc559465p6 0x1.28p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24313 0 OK 0x1.e8603355bda93p18 -0x1.cdcec1461fc62p7 0x1.9f04db7ep6 0x1.2bfffffffffffp6 0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:24313 1 OK -0x1.ac9db541b7e6p15 -0x1.0eff17fbb9521p19 0x1.de9971b93p6 0x1.18p6 -0x1.4p2 0x1.0p-30 F +REG epsg:24313 2 OK 0x1.01950765e096ep20 -0x1.0eff17fc567fep19 0x1.10efbb726p7 0x1.4p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:24313 3 OK -0x1.aca4c0378bb2p15 0x1.0ec55ea122166p19 0x1.3d86b0c7cp6 0x1.18p6 0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:24313 4 OK 0x1.01953fc2912d6p20 0x1.0ec55ea1bf02bp19 0x1.80ccd1f93p6 0x1.4p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2432 0 OK 0x1.e841d335897bcp18 0x1.4932992f1d556p6 0x1.69d4ba3ecp5 0x1.a400000000001p6 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2432 1 OK -0x1.af5c104cd6f7p15 -0x1.0ef4520fe4a1fp19 0x1.382149482p5 0x1.900000001d4fep6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:2432 2 OK 0x1.019bca17c448ep20 -0x1.0ef4520fbc515p19 0x1.15d16078ep5 0x1.b7ffffffe2b44p6 -0x1.3fffffffeae5ap2 -0x1.8p-29 F +REG epsg:2432 3 OK -0x1.af598daf90b7p15 0x1.0f08e50d93c9fp19 0x1.aae4d1264p5 0x1.900000001d4f6p6 0x1.3fffffffeae1p2 -0x1.0p-29 F +REG epsg:2432 4 OK 0x1.019bb6034e9aap20 0x1.0f08e50d6b734p19 0x1.8894ed6e8p5 0x1.b7ffffffe2b4bp6 0x1.3fffffffeae44p2 -0x1.8p-29 F +REG epsg:2433 0 OK 0x1.e83fd423ee88ep18 0x1.49329e4d14533p6 0x1.5dcf48b8p5 0x1.b000000000001p6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2433 1 OK -0x1.af6c4bc12767p15 -0x1.0ef45648cbb67p19 0x1.31bf2198ap5 0x1.9c0000001d509p6 -0x1.3fffffffeae1ap2 -0x1.0p-30 F +REG epsg:2433 2 OK 0x1.019b4c68da45p20 -0x1.0ef45648965d9p19 0x1.04576397cp5 0x1.c3ffffffe2b4ep6 -0x1.3fffffffeae6p2 -0x1.0p-29 F +REG epsg:2433 3 OK -0x1.af69c92168ap15 0x1.0f08e946cc19bp19 0x1.a482aa698p5 0x1.9c0000001d501p6 0x1.3fffffffeae04p2 0x0.0p0 F +REG epsg:2433 4 OK 0x1.019b3854767dcp20 0x1.0f08e94696b8fp19 0x1.771af325p5 0x1.c3ffffffe2b55p6 0x1.3fffffffeae4bp2 -0x1.8p-29 F +REG epsg:2434 0 OK 0x1.e83ddace08beap18 0x1.4932a4d593a99p6 0x1.4e7628d8ap5 0x1.bcp6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:2434 1 OK -0x1.af7c6bd3c943p15 -0x1.0ef45bacd4acap19 0x1.27ffd5a78p5 0x1.a80000001d512p6 -0x1.3fffffffeae14p2 -0x1.0p-29 F +REG epsg:2434 2 OK 0x1.019ad0bcc27e9p20 -0x1.0ef45bac92713p19 0x1.df403c038p4 0x1.cfffffffe2b57p6 -0x1.3fffffffeae67p2 -0x1.0p-30 F +REG epsg:2434 3 OK -0x1.af79e9319076p15 0x1.0f08eeab3cc5ep19 0x1.9ac35feacp5 0x1.a80000001d50bp6 0x1.3fffffffeadfap2 0x0.0p0 F +REG epsg:2434 4 OK 0x1.019abca870266p20 0x1.0f08eeaafa80cp19 0x1.6263b0a1ep5 0x1.cfffffffe2b6p6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG epsg:24342 0 OK 0x1.e84ae921913f7p18 -0x1.00e53741bda72p8 0x1.6829f3d8cp5 0x1.14p6 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:24342 1 OK -0x1.ad51d430ce0ap15 -0x1.0f02fcb21130ep19 0x1.1c2ada3a6p6 0x1.0p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:24342 2 OK 0x1.019003344e9bap20 -0x1.0f02fcb224131p19 0x1.244231f75p6 0x1.28p6 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:24342 3 OK -0x1.ad59aa71d5f1p15 0x1.0ec2c3f045ba4p19 0x1.a3da4c028p4 0x1.0p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:24342 4 OK 0x1.019041e70265fp20 0x1.0ec2c3f05893dp19 0x1.c437b9f6p4 0x1.28p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24343 0 OK 0x1.e85f9acd1faa2p18 -0x1.00e5287a8ba8bp8 0x1.94a7b3e2cp5 0x1.2bfffffffffffp6 0x1.c72f1eacb7b06p-60 -0x1.0p-29 T +REG epsg:24343 1 OK -0x1.acab4ecbe771p15 -0x1.0f02ed10d6403p19 0x1.157b1c9dap6 0x1.18p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24343 2 OK 0x1.019527ed24d9bp20 -0x1.0f02ed116f69dp19 0x1.57191c96cp6 0x1.4p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:24343 3 OK -0x1.acb324bf5cb9p15 0x1.0ec2b452b5414p19 0x1.891b492bp4 0x1.18p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24343 4 OK 0x1.019566a22faf3p20 0x1.0ec2b4534e242p19 0x1.47c9e159p5 0x1.4p6 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:24344 0 OK 0x1.e8740a3da3cb2p18 -0x1.00e502c70eb34p8 0x1.031456bd7p6 0x1.44p6 0x0.0p0 0x1.0p-30 T +REG epsg:24344 1 OK -0x1.ac055be666f9p15 -0x1.0f02c53184fc6p19 0x1.3165e4d13p6 0x1.3p6 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:24344 2 OK 0x1.019a301c49babp20 -0x1.0f02c532a2d36p19 0x1.abd270eaap6 0x1.58p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:24344 3 OK -0x1.ac0d318b274p15 0x1.0ec28c7cbdf7ep19 0x1.f8c69db9p4 0x1.3p6 0x1.4p2 -0x1.0p-29 F +REG epsg:24344 4 OK 0x1.019a6ed39345ep20 0x1.0ec28c7ddb4acp19 0x1.f13cd8886p5 0x1.58p6 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:24345 0 OK 0x1.e887fe1cd315ep18 -0x1.00e4c69119197p8 0x1.5db7340f4p6 0x1.5cp6 0x0.0p0 -0x1.0p-30 T +REG epsg:24345 1 OK -0x1.ab61cd1f2136p15 -0x1.0f02858407cf9p19 0x1.6f9cde3a2p6 0x1.48p6 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:24345 2 OK 0x1.019f0da36c36ep20 -0x1.0f028585a7568p19 0x1.10c03b9a1p7 0x1.7000000000001p6 -0x1.3fffffffffffdp2 -0x1.8p-29 F +REG epsg:24345 3 OK -0x1.ab69a274e70ep15 0x1.0ec24cde30092p19 0x1.78d17b58ep5 0x1.48p6 0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:24345 4 OK 0x1.019f4c5cd5d4ap20 0x1.0ec24cdfcedp19 0x1.6e4ca916ap6 0x1.7000000000001p6 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:24346 0 OK 0x1.e89b3e6f7826ep18 -0x1.00e47481aad88p8 0x1.d93e23838p6 0x1.7400000000001p6 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:24346 1 OK -0x1.aac26d5d26c6p15 -0x1.0f022ebb19cdp19 0x1.cf7178dp6 0x1.6p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24346 2 OK 0x1.01a3b2dc080e4p20 -0x1.0f022ebd36a9dp19 0x1.5b6c808bep7 0x1.8800000000001p6 -0x1.4000000000004p2 -0x1.0p-28 F +REG epsg:24346 3 OK -0x1.aaca42648a9p15 0x1.0ec1f6299c9cep19 0x1.1c3d84ab4p6 0x1.6p6 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:24346 4 OK 0x1.01a3f1976d244p20 0x1.0ec1f62bb87fap19 0x1.01d2bc1828p7 0x1.8800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:24347 0 OK 0x1.e8ad9532ab3dbp18 -0x1.00e40d7f1639fp8 0x1.3a27476e98p7 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:24347 1 OK -0x1.aa28fbc6e204p15 -0x1.0f01c1ca4ff2ep19 0x1.27eb69b768p7 0x1.7800000000001p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:24347 2 OK 0x1.01a812bdbb25cp20 -0x1.0f01c1cce4781p19 0x1.b51c847e2p7 0x1.a000000000001p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:24347 3 OK -0x1.aa30d0815824p15 0x1.0ec189525f91p19 0x1.9ca31acabp6 0x1.7800000000001p6 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:24347 4 OK 0x1.01a8517af1892p20 0x1.0ec18954f2e51p19 0x1.5b82e99a58p7 0x1.a000000000001p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:2435 0 OK 0x1.e83be896674d8p18 0x1.4932acc405f55p6 0x1.3bd41f69cp5 0x1.c800000000001p6 0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG epsg:2435 1 OK -0x1.af8c65345b84p15 -0x1.0ef4623837504p19 0x1.1aea3c3a4p5 0x1.b40000001d51cp6 -0x1.3fffffffeae0bp2 0x1.8p-29 F +REG epsg:2435 2 OK 0x1.019a576a42c16p20 -0x1.0ef46237e8615p19 0x1.af74314b8p4 0x1.dbffffffe2b63p6 -0x1.3fffffffeae71p2 -0x1.0p-29 F +REG epsg:2435 3 OK -0x1.af89e28fa8f3p15 0x1.0f08f5371d51cp19 0x1.8dadc86e4p5 0x1.b40000001d516p6 0x1.3fffffffeadf2p2 0x0.0p0 F +REG epsg:2435 4 OK 0x1.019a43560153cp20 0x1.0f08f536ce572p19 0x1.4a7daed1ep5 0x1.dbffffffe2b6ap6 0x1.3fffffffeae5bp2 -0x1.4p-28 F +REG epsg:2436 0 OK 0x1.e839feda9b172p18 0x1.4932b612dab14p6 0x1.25f63f382p5 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2436 1 OK -0x1.af9c2cada1f1p15 -0x1.0ef469e65c37p19 0x1.0a87837cap5 0x1.c00000001d527p6 -0x1.3fffffffeae02p2 0x0.0p0 F +REG epsg:2436 2 OK 0x1.0199e0c67ad4ap20 -0x1.0ef469e600cc6p19 0x1.796c30384p4 0x1.e7ffffffe2b68p6 -0x1.3fffffffeae7ap2 0x0.0p0 F +REG epsg:2436 3 OK -0x1.af99aa067795p15 0x1.0f08fce5d5fa4p19 0x1.7d4b121fp5 0x1.c00000001d52p6 0x1.3fffffffeade7p2 0x1.0p-29 F +REG epsg:2436 4 OK 0x1.0199ccb249c19p20 0x1.0f08fce57a822p19 0x1.2f79b24a4p5 0x1.e7ffffffe2b6fp6 0x1.3fffffffeae62p2 -0x1.8p-29 F +REG epsg:2437 0 OK 0x1.e8381ef24182dp18 0x1.4932c0bb8a1dfp6 0x1.0cebdfe62p5 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:2437 1 OK -0x1.afabb72d61bdp15 -0x1.0ef472b1dff7ep19 0x1.edc655244p4 0x1.cc0000001d533p6 -0x1.3fffffffeadf8p2 0x1.0p-29 F +REG epsg:2437 2 OK 0x1.01996d24a8c72p20 -0x1.0ef472b178523p19 0x1.3d4e21c2p4 0x1.f3ffffffe2b72p6 -0x1.3fffffffeae82p2 -0x1.0p-29 F +REG epsg:2437 3 OK -0x1.afa93483c34ep15 0x1.0f0905b202ef4p19 0x1.69a6bc1ecp5 0x1.cc0000001d52cp6 0x1.3fffffffeade6p2 0x1.0p-29 F +REG epsg:2437 4 OK 0x1.019959108772ep20 0x1.0f0905b19b3a1p19 0x1.116aaf84ep5 0x1.f3ffffffe2b7bp6 0x1.3fffffffeae68p2 -0x1.8p-29 F +REG epsg:24370 0 OK 0x1.1f895ffffffffp21 0x1.3c298p21 0x0.0p0 0x1.1p6 0x1.3bfffffffffe6p5 0x0.0p0 F +REG epsg:24370 1 OK 0x1.9fff140c277a1p20 0x1.e9f46d2ba2d05p20 0x0.0p0 0x1.ec294c4167daep5 0x1.13fffffffffd1p5 0x0.0p0 F +REG epsg:24370 2 OK 0x1.6f1335f9ec42bp21 0x1.e9f46d2ba2d05p20 0x0.0p0 0x1.29eb59df4c129p6 0x1.13fffffffffd1p5 0x0.0p0 F +REG epsg:24370 3 OK 0x1.b54b5eb8c6a95p20 0x1.88c1289115584p21 0x0.0p0 0x1.ec294c4167daep5 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:24370 4 OK 0x1.646d10a39cab1p21 0x1.88c1289115584p21 0x0.0p0 0x1.29eb59df4c129p6 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:24371 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.1p6 0x1.03fffffffffc7p5 0x0.0p0 F +REG epsg:24371 1 OK 0x1.1fdcaf08508fbp21 0x1.921522769766ap18 0x0.0p0 0x1.f0928b4db1cb9p5 0x1.b7fffffffff4fp4 0x0.0p0 F +REG epsg:24371 2 OK 0x1.bc8f50f7af7p21 0x1.921522769766ap18 0x0.0p0 0x1.27b6ba59271a3p6 0x1.b7fffffffff4fp4 0x0.0p0 F +REG epsg:24371 3 OK 0x1.28168404d6ac9p21 0x1.8c23900c67f4p20 0x0.0p0 0x1.f0928b4db1cb9p5 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:24371 4 OK 0x1.b4557bfb29532p21 0x1.8c23900c67f4p20 0x0.0p0 0x1.27b6ba59271a3p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:24372 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.28p6 0x1.9ffffffffff45p4 0x0.0p0 F +REG epsg:24372 1 OK 0x1.20d60015f831dp21 0x1.8e5d404af8d22p18 0x0.0p0 0x1.11bf7a6273dbcp6 0x1.4ffffffffff1cp4 0x0.0p0 F +REG epsg:24372 2 OK 0x1.bb95ffea07ce1p21 0x1.8e5d404af8d22p18 0x0.0p0 0x1.3e40859d8c244p6 0x1.4ffffffffff1cp4 0x0.0p0 F +REG epsg:24372 3 OK 0x1.2720fef7a368ep21 0x1.8b1d7a896f263p20 0x0.0p0 0x1.11bf7a6273dbcp6 0x1.effffffffff81p4 0x0.0p0 F +REG epsg:24372 4 OK 0x1.b54b01085c97p21 0x1.8b1d7a896f263p20 0x0.0p0 0x1.3e40859d8c244p6 0x1.effffffffff81p4 0x0.0p0 F +REG epsg:24373 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.4p6 0x1.2ffffffffff18p4 0x0.0p0 F +REG epsg:24373 1 OK 0x1.21c5ab2cef746p21 0x1.8ad611053f1acp18 0x0.0p0 0x1.2ad8fb6bb699ap6 0x1.bfffffffffe1dp3 0x0.0p0 F +REG epsg:24373 2 OK 0x1.baa654d3108bcp21 0x1.8ad611053f1acp18 0x0.0p0 0x1.5527049449666p6 0x1.bfffffffffe1dp3 0x0.0p0 F +REG epsg:24373 3 OK 0x1.2636315fabda6p21 0x1.8a1d5b63f3cd3p20 0x0.0p0 0x1.2ad8fb6bb699ap6 0x1.7ffffffffff33p4 0x0.0p0 F +REG epsg:24373 4 OK 0x1.b635cea05425bp21 0x1.8a1d5b63f3cd3p20 0x0.0p0 0x1.5527049449666p6 0x1.7ffffffffff33p4 0x0.0p0 F +REG epsg:24374 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.4p6 0x1.7fffffffffe3fp3 0x0.0p0 F +REG epsg:24374 1 OK 0x1.22a16b854db06p21 0x1.879171a139bc8p18 0x0.0p0 0x1.2b8d9dbc49a16p6 0x1.bfffffffffda3p2 0x0.0p0 F +REG epsg:24374 2 OK 0x1.b9ca947ab24f8p21 0x1.879171a139bc8p18 0x0.0p0 0x1.54726243b65eap6 0x1.bfffffffffda3p2 0x0.0p0 F +REG epsg:24374 3 OK 0x1.255ea29e154a4p21 0x1.89323e4414a3ep20 0x0.0p0 0x1.2b8d9dbc49a16p6 0x1.0ffffffffff13p4 0x0.0p0 F +REG epsg:24374 4 OK 0x1.b70d5d61eab5ap21 0x1.89323e4414a3ep20 0x0.0p0 0x1.54726243b65eap6 0x1.0ffffffffff13p4 0x0.0p0 F +REG epsg:24375 0 OK 0x1.4ee33b723e7aap21 0x1.be774adc5eb17p19 -0x1.d584e7208p3 0x1.68p6 0x1.9ffffffffff45p4 -0x1.0p-29 F +REG epsg:24375 1 OK 0x1.082055b53f783p21 0x1.6c2e092e42bb2p18 -0x1.958f08ed8p4 0x1.51bf7a6273dbcp6 0x1.4ffffffffff12p4 0x0.0p0 F +REG epsg:24375 2 OK 0x1.95a61fcd6d67ep21 0x1.6c2edb0ff0b4ap18 0x1.ac90d34p3 0x1.7e40859d8c245p6 0x1.4ffffffffff13p4 0x0.0p0 F +REG epsg:24375 3 OK 0x1.0de1917c36458p21 0x1.694c3045c9e18p20 -0x1.db273057p4 0x1.51bf7a6273dbcp6 0x1.effffffffff78p4 -0x1.0p-29 F +REG epsg:24375 4 OK 0x1.8fe4e69f2a958p21 0x1.694bfc89e6aacp20 0x1.77d474b1p2 0x1.7e40859d8c245p6 0x1.effffffffff7bp4 0x0.0p0 F +REG epsg:24376 0 OK 0x1.4edd1a6c5ad93p21 0x1.be804d6e2939ep19 0x1.202a62872p5 0x1.1p6 0x1.03fffffffffc8p5 0x1.8p-29 F +REG epsg:24376 1 OK 0x1.07364dcd9ebc4p21 0x1.6fa6fd74b7596p18 0x1.2fd099f2p5 0x1.f0928b4db1cb9p5 0x1.b7fffffffff55p4 -0x1.0p-30 F +REG epsg:24376 2 OK 0x1.9683e6fc65ff4p21 0x1.6fa7043debf82p18 0x1.39f27c5f6p5 0x1.27b6ba59271a3p6 0x1.b7fffffffff53p4 0x0.0p0 F +REG epsg:24376 3 OK 0x1.0ebc0d70324dp21 0x1.6a404ba16a552p20 0x1.600132be6p5 0x1.f0928b4db1cb9p5 0x1.2bfffffffffep5 -0x1.0p-30 F +REG epsg:24376 4 OK 0x1.8efe2775d8de6p21 0x1.6a4049f6ee12p20 0x1.69113554p5 0x1.27b6ba59271a3p6 0x1.2bfffffffffdfp5 -0x1.0p-30 F +REG epsg:24377 0 OK 0x1.4edf82cc7f853p21 0x1.be780b771305ep19 0x1.3f98b991cp5 0x1.28p6 0x1.9ffffffffff46p4 0x1.0p-30 F +REG epsg:24377 1 OK 0x1.081cc54f74bccp21 0x1.6c30f344783c2p18 0x1.41b09c1acp5 0x1.11bf7a6273dbdp6 0x1.4ffffffffff1ap4 0x1.0p-29 F +REG epsg:24377 2 OK 0x1.95a23fbe9c573p21 0x1.6c3145b2fc7fcp18 0x1.bb6a576aap5 0x1.3e40859d8c244p6 0x1.4ffffffffff0fp4 -0x1.0p-30 F +REG epsg:24377 3 OK 0x1.0dddfd1252398p21 0x1.694c334c03eaep20 0x1.1ad030f42p5 0x1.11bf7a6273dbcp6 0x1.effffffffff74p4 -0x1.0p-29 F +REG epsg:24377 4 OK 0x1.8fe10900cfd74p21 0x1.694c1efa6432ap20 0x1.8a937bf7cp5 0x1.3e40859d8c243p6 0x1.effffffffff74p4 0x1.0p-29 F +REG epsg:24378 0 OK 0x1.4edcca7dd2331p21 0x1.be812fc9f2c2p19 -0x1.5e0902368p4 0x1.1000000000001p6 0x1.03fffffffffc3p5 0x1.8p-29 F +REG epsg:24378 1 OK 0x1.0735d333e288ap21 0x1.6fa78db3235dcp18 -0x1.33e47b56cp4 0x1.f0928b4db1cb9p5 0x1.b7fffffffff53p4 0x1.0p-29 F +REG epsg:24378 2 OK 0x1.9683c1cc6a759p21 0x1.6fa78b8c5ae08p18 -0x1.3a5143268p4 0x1.27b6ba59271a3p6 0x1.b7fffffffff53p4 0x1.0p-30 F +REG epsg:24378 3 OK 0x1.0ebb973d3153bp21 0x1.6a410e7948f1ep20 -0x1.8188afb9p3 0x1.f0928b4db1cb9p5 0x1.2bfffffffffdfp5 0x0.0p0 F +REG epsg:24378 4 OK 0x1.8efdfdba38fa8p21 0x1.6a410f0081a14p20 -0x1.8d06eb7p3 0x1.27b6ba59271a3p6 0x1.2bfffffffffdep5 0x1.0p-30 F +REG epsg:24379 0 OK 0x1.4edf60d7def8p21 0x1.be781c6986bfp19 -0x1.2fc2dc164p4 0x1.28p6 0x1.9ffffffffff3dp4 -0x1.0p-29 F +REG epsg:24379 1 OK 0x1.081c786d24c18p21 0x1.6c2fd5d54dfecp18 -0x1.20484dp4 0x1.11bf7a6273dbcp6 0x1.4ffffffffff1ap4 -0x1.0p-30 F +REG epsg:24379 2 OK 0x1.95a248bd2d70bp21 0x1.6c3024fb79c4cp18 -0x1.b43d9eccp1 0x1.3e40859d8c245p6 0x1.4ffffffffff15p4 0x1.0p-29 F +REG epsg:24379 3 OK 0x1.0dddb3a7aee9ap21 0x1.694c8f22f779ep20 -0x1.6c6f0bf24p4 0x1.11bf7a6273dbcp6 0x1.effffffffff7dp4 0x1.0p-29 F +REG epsg:24379 4 OK 0x1.8fe10e7d4eb2p21 0x1.694c7ba07697ep20 -0x1.2ba03bbc8p3 0x1.3e40859d8c244p6 0x1.effffffffff72p4 0x1.0p-30 F +REG epsg:2438 0 OK 0x1.e8364a2e13638p18 0x1.4932ccb699d49p6 0x1.e18d26578p4 0x1.ec00000000001p6 0x0.0p0 0x1.8p-29 T +REG epsg:2438 1 OK -0x1.afbaf9cc25d1p15 -0x1.0ef47c9496f2dp19 0x1.c015f3098p4 0x1.d80000001d53bp6 -0x1.3fffffffeadf1p2 0x0.0p0 F +REG epsg:2438 2 OK 0x1.0198fcd5ee81ep20 -0x1.0ef47c94235b9p19 0x1.f688682ap3 0x1.ffffffffe2b7cp6 -0x1.3fffffffeae89p2 -0x1.0p-30 F +REG epsg:2438 3 OK -0x1.afb8772018bbp15 0x1.0f090f9578196p19 0x1.52ce8e754p5 0x1.d80000001d534p6 0x1.3fffffffeadd9p2 0x1.0p-28 F +REG epsg:2438 4 OK 0x1.0198e8c1dc45cp20 0x1.0f090f950470fp19 0x1.e0cb7b294p4 0x1.ffffffffe2b85p6 0x1.3fffffffeae7p2 -0x1.0p-28 F +REG epsg:24380 0 OK 0x1.4ee611201acdep21 0x1.be7538a075306p19 0x1.c7aab2e8p4 0x1.6800000000001p6 0x1.9ffffffffff4bp4 -0x1.0p-30 F +REG epsg:24380 1 OK 0x1.08234a9e545adp21 0x1.6c2aa790fd63ap18 0x1.74f217498p3 0x1.51bf7a6273dbcp6 0x1.4ffffffffff1fp4 0x0.0p0 F +REG epsg:24380 2 OK 0x1.95a8d5ba41429p21 0x1.6c2bc8e439dc6p18 0x1.043ac6aaep6 0x1.7e40859d8c244p6 0x1.4ffffffffff13p4 0x0.0p0 F +REG epsg:24380 3 OK 0x1.0de484571d39cp21 0x1.694af3b74a078p20 0x1.1ddc3a61p2 0x1.51bf7a6273dbcp6 0x1.effffffffff76p4 -0x1.0p-29 F +REG epsg:24380 4 OK 0x1.8fe79f95be443p21 0x1.694aac67b0dc4p20 0x1.abfd498cap5 0x1.7e40859d8c245p6 0x1.effffffffff7bp4 -0x1.0p-29 F +REG epsg:24381 0 OK 0x1.4ee1f0203a061p21 0x1.be6eefc929d72p19 0x1.013be6dcp0 0x1.4000000000001p6 0x1.2ffffffffff06p4 0x0.0p0 F +REG epsg:24381 1 OK 0x1.08fa4de21d6f5p21 0x1.68e4ae7c9eef6p18 0x1.3e737d88p-1 0x1.2ad8fb6bb699ap6 0x1.bfffffffffe26p3 -0x1.8p-29 F +REG epsg:24381 2 OK 0x1.94c9919b17868p21 0x1.68e54ddadf78ep18 0x1.dba385efcp4 0x1.5527049449666p6 0x1.bfffffffffe0cp3 0x0.0p0 F +REG epsg:24381 3 OK 0x1.0d09a10fcd1dfp21 0x1.685d6560cea64p20 -0x1.09e70f3bp4 0x1.2ad8fb6bb699ap6 0x1.7ffffffffff32p4 0x0.0p0 F +REG epsg:24381 4 OK 0x1.90ba3fd259194p21 0x1.685d3df17f9cep20 0x1.5919b7758p3 0x1.5527049449666p6 0x1.7ffffffffff2ep4 -0x1.0p-30 F +REG epsg:24382 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.68p6 0x1.9ffffffffff45p4 0x0.0p0 F +REG epsg:24382 1 OK 0x1.20d60015f831dp21 0x1.8e5d404af8d22p18 0x0.0p0 0x1.51bf7a6273dbcp6 0x1.4ffffffffff1cp4 0x0.0p0 F +REG epsg:24382 2 OK 0x1.bb95ffea07ce1p21 0x1.8e5d404af8d22p18 0x0.0p0 0x1.7e40859d8c244p6 0x1.4ffffffffff1cp4 0x0.0p0 F +REG epsg:24382 3 OK 0x1.2720fef7a368ep21 0x1.8b1d7a896f263p20 0x0.0p0 0x1.51bf7a6273dbcp6 0x1.effffffffff81p4 0x0.0p0 F +REG epsg:24382 4 OK 0x1.b54b01085c97p21 0x1.8b1d7a896f263p20 0x0.0p0 0x1.7e40859d8c244p6 0x1.effffffffff81p4 0x0.0p0 F +REG epsg:24383 0 OK 0x1.4ee1f01f5ec47p21 0x1.be6745d19c9dep19 0x1.16b37eabp4 0x1.4p6 0x1.7fffffffffe3cp3 0x1.0p-30 F +REG epsg:24383 1 OK 0x1.09c356e18e4cbp21 0x1.65d93860dd666p18 0x1.63a2f01fp4 0x1.2b8d9dbc49a16p6 0x1.bfffffffffd55p2 0x0.0p0 F +REG epsg:24383 2 OK 0x1.940088ddc26b3p21 0x1.65d9d7853c95p18 0x1.98138dfaap5 0x1.54726243b65eap6 0x1.bfffffffffd71p2 0x1.0p-30 F +REG epsg:24383 3 OK 0x1.0c44944dd67ecp21 0x1.67823f5e5fae4p20 -0x1.7f5b607cp2 0x1.2b8d9dbc49a16p6 0x1.0ffffffffffp4 0x1.0p-30 F +REG epsg:24383 4 OK 0x1.917f4c4de1894p21 0x1.678217d95ef2ap20 0x1.5bdd67644p4 0x1.54726243b65eap6 0x1.0fffffffffeffp4 0x1.0p-30 F +REG epsg:2439 0 OK 0x1.e83481d6f8c7cp18 0x1.4932d9fba2077p6 0x1.a3343101p4 0x1.f7ffffffffffep6 0x0.0p0 0x1.0p-30 T +REG epsg:2439 1 OK -0x1.afc9e9d4e481p15 -0x1.0ef4878791a4ep19 0x1.8c1def32p4 0x1.e40000001d547p6 -0x1.3fffffffeadecp2 0x0.0p0 F +REG epsg:2439 2 OK 0x1.0198902918e62p20 -0x1.0ef48787126d9p19 0x1.66f979f28p3 0x1.05fffffff15c1p7 -0x1.3fffffffeae92p2 -0x1.0p-28 F +REG epsg:2439 3 OK -0x1.afc767266fecp15 0x1.0f091a894570ap19 0x1.38d290644p5 0x1.e40000001d53dp6 0x1.3fffffffeadd4p2 -0x1.0p-30 F +REG epsg:2439 4 OK 0x1.01987c151510bp20 0x1.0f091a88c6266p19 0x1.99040eb5cp4 0x1.05fffffff15c5p7 0x1.3fffffffeae78p2 0x1.0p-30 F +REG epsg:2440 0 OK 0x1.e832c72d2242p18 0x1.4932e88153656p6 0x1.5ef89e878p4 0x1.02p7 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:2440 1 OK -0x1.afd87ccc8365p15 -0x1.0ef4938321848p19 0x1.5202c022cp4 0x1.f00000001d54cp6 -0x1.3fffffffeade6p2 0x0.0p0 F +REG epsg:2440 2 OK 0x1.0198276a68814p20 -0x1.0ef4938297073p19 0x1.98a86546p2 0x1.0bfffffff15c8p7 -0x1.3fffffffeae95p2 -0x1.0p-28 F +REG epsg:2440 3 OK -0x1.afd5fa1bb024p15 0x1.0f092685bbd78p19 0x1.1bc4fd2c6p5 0x1.f00000001d547p6 0x1.3fffffffeadcap2 0x1.0p-30 F +REG epsg:2440 4 OK 0x1.0198135672572p20 0x1.0f0926853145bp19 0x1.4bb176864p4 0x1.0bfffffff15ccp7 0x1.3fffffffeae7fp2 -0x1.8p-29 F +REG epsg:2441 0 OK 0x1.e8311b672830bp18 0x1.4932f83d7da21p6 0x1.150a4ec44p4 0x1.07fffffffffffp7 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:2441 1 OK -0x1.afe6a87930b7p15 -0x1.0ef4a07ede659p19 0x1.11ed2ac5cp4 0x1.fc0000001d556p6 -0x1.3fffffffeaddcp2 0x1.0p-29 F +REG epsg:2441 2 OK 0x1.0197c2e35c06ep20 -0x1.0ef4a07e49044p19 0x1.38289c6p0 0x1.11fffffff15ccp7 -0x1.3fffffffeaeap2 -0x1.4p-28 F +REG epsg:2441 3 OK -0x1.afe425c60944p15 0x1.0f09338272804p19 0x1.f7746e7ep4 0x1.fc0000001d54fp6 0x1.3fffffffeadc3p2 0x1.0p-30 F +REG epsg:2441 4 OK 0x1.0197aecf72c32p20 0x1.0f093381dd08dp19 0x1.f213e67dp3 0x1.11fffffff15cep7 0x1.3fffffffeae88p2 -0x1.8p-29 F +REG epsg:2442 0 OK 0x1.e82f7fb130f6cp18 0x1.49330925169afp6 0x1.8b3a4237p3 0x1.0ep7 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:2442 1 OK -0x1.aff462e99037p15 -0x1.0ef4ae71ac5e7p19 0x1.98144ba28p3 0x1.040000000eabp7 -0x1.3fffffffeadd6p2 0x1.0p-29 F +REG epsg:2442 2 OK 0x1.019762da7ccfep20 -0x1.0ef4ae710c828p19 -0x1.10ffcd26p2 0x1.17fffffff15cep7 -0x1.3fffffffeaea5p2 -0x1.8p-29 F +REG epsg:2442 3 OK -0x1.aff1e03420b7p15 0x1.0f0941764cd2p19 0x1.b19173e84p4 0x1.040000000eaadp7 0x1.3fffffffeadbcp2 0x1.8p-29 F +REG epsg:2442 4 OK 0x1.01974ec69fa48p20 0x1.0f094175acde7p19 0x1.428f06688p3 0x1.17fffffff15d2p7 0x1.3fffffffeae8dp2 -0x1.0p-29 F +REG epsg:2443 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.03p7 0x1.08p5 0x0.0p0 F +REG epsg:2443 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.ee27199592545p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:2443 2 OK 0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.0eec733536d5ep7 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:2443 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.ee271995a79bdp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:2443 4 OK 0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.0eec73352c322p7 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:2444 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.08p5 0x0.0p0 F +REG epsg:2444 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.f427199592544p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:2444 2 OK 0x1.1e99185b35cf5p19 -0x1.079d1e65d514p19 0x0.0p0 0x1.11ec733536d5ep7 0x1.bfffffffaa7b5p4 0x0.0p0 F +REG epsg:2444 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.f4271995a79bcp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:2444 4 OK 0x1.ff8aa2fffc27ap18 0x1.170e640889041p19 0x0.0p0 0x1.11ec73352c323p7 0x1.2fffffffa48f9p5 0x0.0p0 F +REG epsg:2445 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0855555555557p7 0x1.2p5 0x0.0p0 F +REG epsg:2445 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.f7f1ffa584661p6 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2445 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.14b1aad7e877dp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2445 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.f7f1ffa5b6a87p6 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2445 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.14b1aad7cf56ap7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2446 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0bp7 0x1.08p5 0x0.0p0 F +REG epsg:2446 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.fe27199592544p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:2446 2 OK 0x1.1e99185b35cf5p19 -0x1.079d1e65d514p19 0x0.0p0 0x1.16ec733536d5ep7 0x1.bfffffffaa7b5p4 0x0.0p0 F +REG epsg:2446 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.fe271995a79bcp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:2446 4 OK 0x1.ff8aa2fffc27ap18 0x1.170e640889041p19 0x0.0p0 0x1.16ec73352c323p7 0x1.2fffffffa48f9p5 0x0.0p0 F +REG epsg:2447 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0caaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG epsg:2447 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.004e552817883p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2447 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1907002d3dccfp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2447 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.004e552830a96p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2447 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1907002d24abcp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2448 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.2p5 0x0.0p0 F +REG epsg:2448 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.03a3aa7d6cddap7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2448 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1c5c558293227p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2448 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.03a3aa7d85fedp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2448 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1c5c55827a014p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2449 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1255555555557p7 0x1.2p5 0x0.0p0 F +REG epsg:2449 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.05f8ffd2c2331p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2449 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1eb1aad7e877dp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2449 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.05f8ffd2db544p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2449 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1eb1aad7cf56ap7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2450 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.15p7 0x1.2p5 0x0.0p0 F +REG epsg:2450 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.08a3aa7d6cdd9p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2450 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.215c558293226p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2450 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.08a3aa7d85fecp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2450 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.215c55827a013p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:24500 0 OK 0x1.d7c44e0d2af73p14 0x1.d4d59c572386fp14 0x1.04113a3dp2 0x1.9f69796a1f706p6 0x1.49a3364223021p0 0x0.0p0 T +REG epsg:24500 1 OK -0x1.0088b8c2b1f13p19 -0x1.0013d6b3a8848p19 -0x1.096d51058p3 0x1.8b682e4d6a382p6 -0x1.db2e63bae8b37p1 0x1.c8p-22 F +REG epsg:24500 2 OK 0x1.1e04cec5b0ea5p19 -0x1.0013d6b395412p19 0x1.94d92a11cp4 0x1.b36ac486de475p6 -0x1.db2e63b9b02b1p1 -0x1.668p-21 F +REG epsg:24500 3 OK -0x1.fef27734840aep18 0x1.1deabb3f66639p19 -0x1.d2cdda1ep2 0x1.8b682e397c9b2p6 0x1.9268cca5e1697p2 0x1.31p-20 F +REG epsg:24500 4 OK 0x1.1cf551fbe696dp19 0x1.1deabb3f480dfp19 0x1.a2c02eac8p4 0x1.b36ac49adda94p6 0x1.9268cca4e3121p2 -0x1.056p-19 F +REG epsg:2451 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.17aaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG epsg:2451 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.0b4e552817883p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2451 2 OK 0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.2407002d3dcdp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:2451 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.0b4e552830a96p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2451 4 OK 0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.2407002d24abdp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:2452 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.19aaaaaaaaaa9p7 0x1.4p5 0x0.0p0 F +REG epsg:2452 1 OK -0x1.23201c494f8a1p19 -0x1.0566f93f3781cp19 0x0.0p0 0x1.0c9cd2f1fe4c3p7 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2452 2 OK 0x1.23201c494f8a1p19 -0x1.0566f93f3781cp19 0x0.0p0 0x1.26b882635708fp7 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2452 3 OK -0x1.f6861830d491cp18 0x1.19504fd8b077cp19 0x0.0p0 0x1.0c9cd2f234253p7 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2452 4 OK 0x1.f6861830d491cp18 0x1.19504fd8b077cp19 0x0.0p0 0x1.26b88263212ffp7 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2453 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.188p7 0x1.6p5 0x0.0p0 F +REG epsg:2453 1 OK -0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.0a992e63a60fbp7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:2453 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2666d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:2453 3 OK -0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.0a992e640a525p7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:2453 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2666d19bf5adbp7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:2454 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1c8p7 0x1.6p5 0x0.0p0 F +REG epsg:2454 1 OK -0x1.262087c7cec8cp19 -0x1.03ddb3f855d8p19 0x0.0p0 0x1.0e992e63a60fap7 0x1.37ffffff10d88p5 0x0.0p0 F +REG epsg:2454 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2a66d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:2454 3 OK -0x1.f0767dc282fcap18 0x1.1ac080d27bb82p19 0x0.0p0 0x1.0e992e640a524p7 0x1.87fffffea2285p5 0x0.0p0 F +REG epsg:2454 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2a66d19bf5adcp7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:24547 0 OK 0x1.e8668d987be3p18 -0x1.3fdf5a3040091p2 -0x1.29c5b2a58p3 0x1.8c00000000001p6 0x1.c72f1eacb7b06p-66 -0x1.0p-30 T +REG epsg:24547 1 OK -0x1.ac81f5830c8dp15 -0x1.0ee418d91ef5dp19 -0x1.cf4edac38p3 0x1.7800000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24547 2 OK 0x1.01975690b3c11p20 -0x1.0ee418d9e4cc5p19 0x1.b04f539ep2 0x1.ap6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24547 3 OK -0x1.ac821c898be7p15 0x1.0ee2d8fc7f70bp19 -0x1.eb33328cp3 0x1.7800000000001p6 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:24547 4 OK 0x1.019757c90ac46p20 0x1.0ee2d8fd45453p19 0x1.7886b04ep2 0x1.ap6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:24548 0 OK 0x1.e87c62ecd72b8p18 -0x1.3fdf20a180d4bp2 0x1.02e5dd72p3 0x1.a400000000001p6 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:24548 1 OK -0x1.abd044b3eb31p15 -0x1.0ee3e7fb6dc07p19 -0x1.3347c44dp2 0x1.9000000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24548 2 OK 0x1.019cb3c5dab4p20 -0x1.0ee3e7fcc114cp19 0x1.f9af2c8c4p4 0x1.b8p6 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:24548 3 OK -0x1.abd06bb8c504p15 0x1.0ee2a81f07567p19 -0x1.6b106e48p2 0x1.9000000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24548 4 OK 0x1.019cb4fe3d93fp20 0x1.0ee2a8205aa7dp19 0x1.ebbd074e4p4 0x1.b8p6 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:2455 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.208p7 0x1.6p5 0x0.0p0 F +REG epsg:2455 1 OK -0x1.262087c7cec8cp19 -0x1.03ddb3f855d8p19 0x0.0p0 0x1.12992e63a60fap7 0x1.37ffffff10d88p5 0x0.0p0 F +REG epsg:2455 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2e66d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:2455 3 OK -0x1.f0767dc282fcap18 0x1.1ac080d27bb82p19 0x0.0p0 0x1.12992e640a524p7 0x1.87fffffea2285p5 0x0.0p0 F +REG epsg:2455 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2e66d19bf5adcp7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:2456 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1cp7 0x1.ap4 0x0.0p0 F +REG epsg:2456 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.10dfbd31358f9p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2456 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.272042ceca708p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2456 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.10dfbd312d01cp7 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:2456 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.272042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:2457 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fe00000000001p6 0x1.ap4 0x0.0p0 F +REG epsg:2457 1 OK -0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.e7bf7a626b1f1p6 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2457 2 OK 0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.0a2042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2457 3 OK -0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.e7bf7a625a037p6 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:2457 4 OK 0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.0a2042ced2fe5p7 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:24571 0 OK 0x1.6f67d4b0ea70bp14 0x1.57a8087912bc3p14 -0x1.cf922dp-3 0x1.9900000000001p6 0x1.ffffffffffd0ep1 0x1.0p-30 F +REG epsg:24571 1 OK -0x1.1068ac10943a8p12 -0x1.55716dfba347dp12 -0x1.90388f99p3 0x1.84f37f5af8063p6 -0x1.ffffffffe3b1cp-1 0x1.0p-30 T +REG epsg:24571 2 OK 0x1.902326c985323p15 -0x1.579aaefac4de2p12 0x1.12a3dff9p4 0x1.ad0c80a507fap6 -0x1.ffffffffe3ac1p-1 0x1.0p-29 T +REG epsg:24571 3 OK -0x1.e1bf42b69cd8p11 0x1.83ef198366ee5p15 -0x1.e129f353p2 0x1.84f37f5af8063p6 0x1.1fffffffffe83p3 0x0.0p0 F +REG epsg:24571 4 OK 0x1.8ed1dd8c501edp15 0x1.83aec3d42915p15 0x1.5cafa1b3cp4 0x1.ad0c80a507f9fp6 0x1.1fffffffffe86p3 0x1.0p-30 F +REG epsg:2458 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fp6 0x1.ap4 0x0.0p0 F +REG epsg:2458 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.d9bf7a626b1f2p6 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2458 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.032042ceca708p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2458 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.d9bf7a625a038p6 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:2458 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.032042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:2459 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.ap4 0x0.0p0 F +REG epsg:2459 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.f5bf7a626b1f2p6 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2459 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.112042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2459 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.f5bf7a625a036p6 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:2459 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.112042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:2460 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.4p4 0x0.0p0 F +REG epsg:2460 1 OK -0x1.17bfa80c570dcp19 -0x1.0aceb1bfe8ccep19 0x0.0p0 0x1.055bb474834a2p7 0x1.dfffffffda459p3 0x0.0p0 F +REG epsg:2460 2 OK 0x1.17bfa80c570c5p19 -0x1.0aceb1bfe8ccfp19 0x0.0p0 0x1.1aa44b8b7cb5ep7 0x1.dfffffffda459p3 0x0.0p0 F +REG epsg:2460 3 OK -0x1.067ecfe186601p19 0x1.137d4b9ce03dfp19 0x0.0p0 0x1.055bb47474ecdp7 0x1.8fffffffde571p4 0x0.0p0 F +REG epsg:2460 4 OK 0x1.067ecfe1865ebp19 0x1.137d4b9ce03dfp19 0x0.0p0 0x1.1aa44b8b8b133p7 0x1.8fffffffde571p4 0x0.0p0 F +REG epsg:24600 0 OK 0x1.6e31d305b30a5p20 0x1.1ca3d7c72f456p20 0x1.3f6c7528p0 0x1.68p5 0x1.03fffffffffbdp5 0x1.0p-29 F +REG epsg:24600 1 OK 0x1.bdc816c759f6fp19 0x1.329a8b0c43b64p19 0x1.12c4da3d2p5 0x1.38928b4db1cbap5 0x1.b7fffffffff3ap4 -0x1.0p-29 F +REG epsg:24600 2 OK 0x1.fd7f9bc355868p20 0x1.329a6a31b9053p19 0x1.616f6d81p4 0x1.976d74b24e346p5 0x1.b7fffffffff36p4 0x1.0p-30 F +REG epsg:24600 3 OK 0x1.dbdf1f4ec61e7p19 0x1.a7a429e92a434p20 -0x1.53a0e0618p4 0x1.38928b4db1cbbp5 0x1.2bfffffffffdbp5 0x1.0p-30 F +REG epsg:24600 4 OK 0x1.ee74156146e7ap20 0x1.a7a43a0566fc8p20 -0x1.0183340fap5 0x1.976d74b24e345p5 0x1.2bfffffffffdap5 0x1.0p-29 F +REG epsg:2461 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.34p7 0x1.ap4 0x0.0p0 F +REG epsg:2461 1 OK -0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.28dfbd31358f9p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2461 2 OK 0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.3f2042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:2461 3 OK -0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.28dfbd312d01cp7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:2461 4 OK 0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.3f2042ced2fe5p7 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:2462 0 OK 0x1.12a9f62c619f6p22 0x1.68c721f22456cp6 -0x1.b95cfb06p3 0x1.4ffffffe1113bp4 0x1.0633651ef47b1p-26 0x1.2a59e8p-9 T +REG epsg:2462 1 OK 0x1.e18db1ae00a89p21 -0x1.0ef361291fb76p19 -0x1.030edbe7cp4 0x1.fffffffc35e4bp3 -0x1.3ffffff02adc2p2 0x1.18d788p-9 F +REG epsg:2462 2 OK 0x1.348cce795cfd6p22 -0x1.0ef5bbd3fd531p19 -0x1.2d6350facp4 0x1.9ffffffdb7bbap4 -0x1.3fffffeeee6edp2 0x1.e244ap-10 F +REG epsg:2462 3 OK 0x1.e18e4076db8abp21 0x1.0f0c131391b27p19 -0x1.2d2e26808p3 0x1.fffffffd11fedp3 0x1.4000000ed9e65p2 0x1.61a08p-9 F +REG epsg:2462 4 OK 0x1.348d1120e6397p22 0x1.0f0a22a3720b9p19 -0x1.827af97a8p3 0x1.9ffffffe063cbp4 0x1.400000108e6b8p2 0x1.40e55p-9 F +REG epsg:2463 0 OK 0x1.e867bca20c957p18 0x1.463e8bdfd0b3ep6 -0x1.4a21a780fp6 0x1.5p4 0x0.0p0 0x1.546p-19 T +REG epsg:2463 1 OK -0x1.ae432d8c2cdep15 -0x1.0ef5d59feb7dcp19 -0x1.94dcab54bp6 0x1.0000000075118p4 -0x1.3fffffffea5fbp2 0x1.51p-19 F +REG epsg:2463 2 OK 0x1.01a5f7da15138p20 -0x1.0ef5d3aa98974p19 -0x1.39e4fad07p6 0x1.9fffffff8a9dp4 -0x1.3fffffffea4ebp2 0x1.51cp-19 F +REG epsg:2463 3 OK -0x1.ae40b0d8743p15 0x1.0f0a395d06691p19 -0x1.5bfea8784p6 0x1.00000000750f9p4 0x1.3fffffffea5e4p2 0x1.50cp-19 F +REG epsg:2463 4 OK 0x1.01a5e3f2261d2p20 0x1.0f0a37678e3bbp19 -0x1.010705549p6 0x1.9fffffff8a9edp4 0x1.3fffffffea4d5p2 0x1.51ap-19 F +REG epsg:2464 0 OK 0x1.e866edb9c05a1p18 0x1.463e5e1eaf988p6 -0x1.13e683023p6 0x1.bp4 0x0.0p0 0x1.544p-19 T +REG epsg:2464 1 OK -0x1.ae474a2af887p15 -0x1.0ef5af877fac4p19 -0x1.5deb8a43ep6 0x1.6000000075121p4 -0x1.3fffffffea5f9p2 0x1.50ep-19 F +REG epsg:2464 2 OK 0x1.01a5b14a35b2bp20 -0x1.0ef5ad92281d2p19 -0x1.0532b4f06p6 0x1.ffffffff8a9e4p4 -0x1.3fffffffea4f2p2 0x1.516p-19 F +REG epsg:2464 3 OK -0x1.ae44cd7758a1p15 0x1.0f0a1341c44a5p19 -0x1.250d8f7bap6 0x1.6000000075105p4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:2464 4 OK 0x1.01a59d6256a06p20 0x1.0f0a114c47739p19 -0x1.98a98e682p5 0x1.ffffffff8aa01p4 0x1.3fffffffea4dcp2 0x1.518p-19 F +REG epsg:2465 0 OK 0x1.e865c540b2cddp18 0x1.463e31c1b23aep6 -0x1.bea2eaf3ap5 0x1.07fffffffffffp5 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2465 1 OK -0x1.ae4e45a81cfdp15 -0x1.0ef58a979b34fp19 -0x1.2820df94bp6 0x1.c000000075136p4 -0x1.3fffffffea5f6p2 0x1.508p-19 F +REG epsg:2465 2 OK 0x1.01a554e89a1c4p20 -0x1.0ef588a23cbp19 -0x1.a53f7a188p5 0x1.2fffffffc5502p5 -0x1.3fffffffea4f7p2 0x1.51cp-19 F +REG epsg:2465 3 OK -0x1.ae4bc8f42519p15 0x1.0f09ee4f1f9b4p19 -0x1.de85d96a6p5 0x1.c000000075117p4 0x1.3fffffffea5dbp2 0x1.514p-19 F +REG epsg:2465 4 OK 0x1.01a54100cdf28p20 0x1.0f09ec599bcdbp19 -0x1.3383ad7fap5 0x1.2fffffffc551p5 0x1.3fffffffea4ep2 0x1.51ap-19 F +REG epsg:2466 0 OK 0x1.e86446768e4cdp18 0x1.463e0745453e2p6 -0x1.59ebf3162p5 0x1.3800000000001p5 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2466 1 OK -0x1.ae580c6d01b8p15 -0x1.0ef56737d6c7p19 -0x1.e82715018p5 0x1.100000003a8a9p5 -0x1.3fffffffea5f2p2 0x1.50ep-19 F +REG epsg:2466 2 OK 0x1.01a4e3b86563cp20 -0x1.0ef565426f124p19 -0x1.4573d7766p5 0x1.5fffffffc5513p5 -0x1.3fffffffea4fdp2 0x1.51ap-19 F +REG epsg:2466 3 OK -0x1.ae558fb84201p15 0x1.0f09caecb8c23p19 -0x1.766b3e91ep5 0x1.100000003a89ap5 0x1.3fffffffea5d8p2 0x1.51p-19 F +REG epsg:2466 4 OK 0x1.01a4cfd0aef22p20 0x1.0f09c8f72bc37p19 -0x1.a77031e74p4 0x1.5fffffffc552p5 0x1.3fffffffea4e6p2 0x1.51ep-19 F +REG epsg:2467 0 OK 0x1.e862758d1100dp18 0x1.463ddf209114p6 -0x1.f5853094cp4 0x1.68p5 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2467 1 OK -0x1.ae64830d0116p15 -0x1.0ef545cb6889cp19 -0x1.84ab11f42p5 0x1.400000003a8b8p5 -0x1.3fffffffea5e9p2 0x1.50cp-19 F +REG epsg:2467 2 OK 0x1.01a45ef714f45p20 -0x1.0ef543d5f585p19 -0x1.d81e5ee88p4 0x1.8fffffffc5525p5 -0x1.3fffffffea506p2 0x1.51ep-19 F +REG epsg:2467 3 OK -0x1.ae6206570beep15 0x1.0f09a97dcd4ap19 -0x1.12ef4a256p5 0x1.400000003a8a9p5 0x1.3fffffffea5dp2 0x1.51p-19 F +REG epsg:2467 4 OK 0x1.01a44b0f76cd5p20 0x1.0f09a78834f99p19 -0x1.e94df85a8p3 0x1.8fffffffc5534p5 0x1.3fffffffea4fp2 0x1.51cp-19 F +REG epsg:2468 0 OK 0x1.e860579c48266p18 0x1.463db9c42bd77p6 -0x1.446381a24p4 0x1.97fffffffffffp5 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2468 1 OK -0x1.ae7386925d5ep15 -0x1.0ef526b00de8bp19 -0x1.26e4bc718p5 0x1.700000003a8cbp5 -0x1.3fffffffea5dfp2 0x1.50ep-19 F +REG epsg:2468 2 OK 0x1.01a3c81905d66p20 -0x1.0ef524ba8d932p19 -0x1.341874b44p4 0x1.bfffffffc553fp5 -0x1.3fffffffea512p2 0x1.518p-19 F +REG epsg:2468 3 OK -0x1.ae7109dac887p15 0x1.0f098a6021995p19 -0x1.6a5204dap4 0x1.700000003a8bcp5 0x1.3fffffffea5c9p2 0x1.50ep-19 F +REG epsg:2468 4 OK 0x1.01a3b43182486p20 0x1.0f09886a7bf5ep19 -0x1.4284a85ep2 0x1.bfffffffc554fp5 0x1.3fffffffea4f9p2 0x1.51ap-19 F +REG epsg:2469 0 OK 0x1.e85df29445b18p18 0x1.463d9798dd9afp6 -0x1.44c74b3c8p3 0x1.c800000000001p5 0x0.0p0 0x1.54p-19 T +REG epsg:2469 1 OK -0x1.ae84ece05747p15 -0x1.0ef50a3d04b87p19 -0x1.9fb62de7p4 0x1.a00000003a8e3p5 -0x1.3fffffffea5d6p2 0x1.514p-19 F +REG epsg:2469 2 OK 0x1.01a320c56020fp20 -0x1.0ef5084775361p19 -0x1.4143f08p3 0x1.efffffffc5559p5 -0x1.3fffffffea51dp2 0x1.518p-19 F +REG epsg:2469 3 OK -0x1.ae827026bd12p15 0x1.0f096deafa03fp19 -0x1.787da6ef8p3 0x1.a00000003a8d6p5 0x1.3fffffffea5bfp2 0x1.50ep-19 F +REG epsg:2469 4 OK 0x1.01a30cddf92fep20 0x1.0f096bf54531ap19 0x1.0b54f2b5p2 0x1.efffffffc5569p5 0x1.3fffffffea506p2 0x1.51ap-19 F +REG epsg:2470 0 OK 0x1.e85b4d2c784ddp18 0x1.463d78fe7a9afp6 -0x1.14bf763cp0 0x1.f7ffffffffffep5 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2470 1 OK -0x1.ae98852951p15 -0x1.0ef4f0c216984p19 -0x1.01047ccdp4 0x1.d00000003a8ffp5 -0x1.3fffffffea5cfp2 0x1.50cp-19 F +REG epsg:2470 2 OK 0x1.01a26ad17412ap20 -0x1.0ef4eecc7638p19 -0x1.f587ece8p0 0x1.0fffffffe2abbp6 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:2470 3 OK -0x1.ae96086d516dp15 0x1.0f09546e261a6p19 -0x1.d8d39b38p0 0x1.d00000003a8efp5 0x1.3fffffffea5b7p2 0x1.50cp-19 F +REG epsg:2470 4 OK 0x1.01a256ea2b72p20 0x1.0f09527860679p19 0x1.883d46388p3 0x1.0fffffffe2ac3p6 0x1.3fffffffea513p2 0x1.51cp-19 F +REG epsg:2471 0 OK 0x1.e8586ed0d4b6cp18 0x1.463d5e4ad68dbp6 0x1.b532671ap2 0x1.14p6 0x0.0p0 0x1.542p-19 T +REG epsg:2471 1 OK -0x1.aeae1877b2a9p15 -0x1.0ef4da86b93c1p19 -0x1.cdc5ec8ap2 0x1.000000001d48cp6 -0x1.3fffffffea5cp2 0x1.512p-19 F +REG epsg:2471 2 OK 0x1.01a1a83b95c05p20 -0x1.0ef4d891067c3p19 0x1.39657375p2 0x1.27ffffffe2acbp6 -0x1.3fffffffea534p2 0x1.51cp-19 F +REG epsg:2471 3 OK -0x1.aeab9bb8f46bp15 0x1.0f093e3120e2ep19 0x1.c016cc96p2 0x1.000000001d485p6 0x1.3fffffffea5aap2 0x1.512p-19 F +REG epsg:2471 4 OK 0x1.01a194546ccebp20 0x1.0f093c3b48cddp19 0x1.31d06ea68p4 0x1.27ffffffe2ad2p6 0x1.3fffffffea51fp2 0x1.51cp-19 F +REG epsg:24718 0 OK 0x1.e882ddaf1ec87p18 0x1.65c2cfcf2e3d5p8 -0x1.2577f27dcp6 -0x1.2bfffffffffffp6 -0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG epsg:24718 1 OK -0x1.abb055dac23bp15 -0x1.0eb77110320f1p19 -0x1.f6ad3aa7cp6 -0x1.4p6 -0x1.3fffffffffffep2 -0x1.0p-29 F +REG epsg:24718 2 OK 0x1.019ef1c13a74bp20 -0x1.0eb77111b2e55p19 -0x1.5310bf09p6 -0x1.18p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:24718 3 OK -0x1.aba56d9c172cp15 0x1.0f10e1042ddcdp19 -0x1.fa4343374p5 -0x1.4p6 0x1.4000000000002p2 -0x1.4p-28 F +REG epsg:24718 4 OK 0x1.019e9a6c66ba4p20 0x1.0f10e105afab8p19 -0x1.66163e418p4 -0x1.18p6 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:24719 0 OK 0x1.e87de74e47165p18 0x1.65c27849d4ce8p8 -0x1.8dbfb8d7ap5 -0x1.14p6 0x1.2f74bf1dcfcadp-60 0x1.0p-29 T +REG epsg:24719 1 OK -0x1.abd3ee60e7a1p15 -0x1.0eb72eac03b3ap19 -0x1.91e7880e1p6 -0x1.28p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:24719 2 OK 0x1.019d935016cdap20 -0x1.0eb72ead6442fp19 -0x1.f82bd7312p5 -0x1.0p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:24719 3 OK -0x1.abc90610c0e3p15 0x1.0f109e8a4a57bp19 -0x1.30b86011ep5 -0x1.28p6 0x1.4p2 0x1.0p-29 F +REG epsg:24719 4 OK 0x1.019d3bfc4e72p20 0x1.0f109e8babcacp19 -0x1.457a205p-1 -0x1.0p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2472 0 OK 0x1.e8555f8d04ed5p18 0x1.463d47c8d4012p6 0x1.b005fea7p3 0x1.2cp6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2472 1 OK -0x1.aec56a481028p15 -0x1.0ef4c7c94612bp19 0x1.dd717cp-2 0x1.180000001d49cp6 -0x1.3fffffffea5b6p2 0x1.50ep-19 F +REG epsg:2472 2 OK 0x1.01a0db2585dadp20 -0x1.0ef4c5d37fa52p19 0x1.4e7fe69d8p3 0x1.3fffffffe2adap6 -0x1.3fffffffea542p2 0x1.516p-19 F +REG epsg:2472 3 OK -0x1.aec2ed8641a8p15 0x1.0f092b7248711p19 0x1.d5d9c44c8p3 0x1.180000001d495p6 0x1.3fffffffea59ep2 0x1.516p-19 F +REG epsg:2472 4 OK 0x1.01a0c73e7d9dep20 0x1.0f09297c5cab5p19 0x1.8ab6f8054p4 0x1.3fffffffe2ae2p6 0x1.3fffffffea52bp2 0x1.51ap-19 F +REG epsg:24720 0 OK 0x1.e87859c0efd2ap18 0x1.65c228edc61d3p8 -0x1.c4675ae0cp4 -0x1.f8p5 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:24720 1 OK -0x1.abfca2526022p15 -0x1.0eb6f278bc4bcp19 -0x1.3510ab902p6 -0x1.1p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24720 2 OK 0x1.019c122373357p20 -0x1.0eb6f279f8abbp19 -0x1.5d5c3402cp5 -0x1.d000000000001p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24720 3 OK -0x1.abf1b9ecf851p15 0x1.0f10624353fc6p19 -0x1.dc2c7b9b8p3 -0x1.1p6 0x1.4p2 0x1.0p-30 F +REG epsg:24720 4 OK 0x1.019bbad0c87fdp20 0x1.0f1062449128ap19 0x1.2b72ad8f8p4 -0x1.d000000000001p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2473 0 OK 0x1.e85227f5d7f9fp18 0x1.463d35b79266ep6 0x1.2dabef1acp4 0x1.44p6 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2473 1 OK -0x1.aede3932e014p15 -0x1.0ef4b8be4b768p19 0x1.b9624cbbp2 0x1.300000001d4acp6 -0x1.3fffffffea5aap2 0x1.514p-19 F +REG epsg:2473 2 OK 0x1.01a005ce772dp20 -0x1.0ef4b6c87044cp19 0x1.d4c3de38p3 0x1.57ffffffe2aedp6 -0x1.3fffffffea55p2 0x1.51ap-19 F +REG epsg:2473 3 OK -0x1.aedbbc6db854p15 0x1.0f091c662f097p19 0x1.51cfa0438p4 0x1.300000001d4a5p6 0x1.3fffffffea594p2 0x1.51p-19 F +REG epsg:2473 4 OK 0x1.019ff1e7904ecp20 0x1.0f091a702e7c6p19 0x1.cdd8e9f3cp4 0x1.57ffffffe2af4p6 0x1.3fffffffea539p2 0x1.518p-19 F +REG epsg:2474 0 OK 0x1.e84ed111313f7p18 0x1.463d2849bd1d6p6 0x1.6d572a978p4 0x1.5cp6 0x0.0p0 0x1.542p-19 T +REG epsg:2474 1 OK -0x1.aef83fa3e827p15 -0x1.0ef4ad8ff956dp19 0x1.802cbbba8p3 0x1.480000001d4bcp6 -0x1.3fffffffea598p2 0x1.516p-19 F +REG epsg:2474 2 OK 0x1.019f2a8cc18e2p20 -0x1.0ef4ab9a0884fp19 0x1.1703080dcp4 0x1.6fffffffe2afep6 -0x1.3fffffffea55fp2 0x1.514p-19 F +REG epsg:2474 3 OK -0x1.aef5c2db2787p15 0x1.0f09113707bf5p19 0x1.a38d5eedp4 0x1.480000001d4b4p6 0x1.3fffffffea582p2 0x1.514p-19 F +REG epsg:2474 4 OK 0x1.019f16a5fc5bp20 0x1.0f090f40f18fp19 0x1.fa79fc54cp4 0x1.6fffffffe2b06p6 0x1.3fffffffea548p2 0x1.514p-19 F +REG epsg:2475 0 OK 0x1.e84b643cbaf5ep18 0x1.463d1fa4fd619p6 0x1.9652209acp4 0x1.7400000000001p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2475 1 OK -0x1.af13349d5bd8p15 -0x1.0ef4a65daaf1cp19 0x1.f793c9d88p3 0x1.600000001d4cep6 -0x1.3fffffffea58dp2 0x1.51p-19 F +REG epsg:2475 2 OK 0x1.019e4bc75405ep20 -0x1.0ef4a467a3e07p19 0x1.2ca613184p4 0x1.87ffffffe2b1p6 -0x1.3fffffffea56dp2 0x1.514p-19 F +REG epsg:2475 3 OK -0x1.af10b7d0ccd5p15 0x1.0f090a043026cp19 0x1.df40dd34cp4 0x1.600000001d4c7p6 0x1.3fffffffea575p2 0x1.514p-19 F +REG epsg:2475 4 OK 0x1.019e37e0b06bcp20 0x1.0f09080e03b3cp19 0x1.080e8218ep5 0x1.87ffffffe2b18p6 0x1.3fffffffea556p2 0x1.518p-19 F +REG epsg:2476 0 OK 0x1.e847eb13a2b4cp18 0x1.463d1be190bb3p6 0x1.a829e201cp4 0x1.8c00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2476 1 OK -0x1.af2ecc848badp15 -0x1.0ef4a33b8eebap19 0x1.20cbb7da4p4 0x1.780000001d4ep6 -0x1.3fffffffea57dp2 0x1.514p-19 F +REG epsg:2476 2 OK 0x1.019d6beef86dap20 -0x1.0ef4a145713afp19 0x1.2b0e61574p4 0x1.9fffffffe2b23p6 -0x1.3fffffffea57dp2 0x1.51p-19 F +REG epsg:2476 3 OK -0x1.af2c4fb4036cp15 0x1.0f0906e1d864fp19 0x1.022155588p5 0x1.780000001d4d8p6 0x1.3fffffffea567p2 0x1.50ep-19 F +REG epsg:2476 4 OK 0x1.019d580875fc4p20 0x1.0f0904eb954f5p19 0x1.0742a955ep5 0x1.9fffffffe2b2ap6 0x1.3fffffffea568p2 0x1.51p-19 F +REG epsg:2477 0 OK 0x1.e8446f53a992ep18 0x1.463d1d0a0507bp6 0x1.a2ac63ffcp4 0x1.a400000000001p6 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2477 1 OK -0x1.af4ab9f5e722p15 -0x1.0ef4a4326ebb9p19 0x1.2eb40c318p4 0x1.900000001d4f2p6 -0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:2477 2 OK 0x1.019c8d777b728p20 -0x1.0ef4a23c3a4b9p19 0x1.12406a388p4 0x1.b7ffffffe2b34p6 -0x1.3fffffffea58ap2 0x1.514p-19 F +REG epsg:2477 3 OK -0x1.af483d2145fp15 0x1.0f0907d8ca989p19 0x1.09157e7e6p5 0x1.900000001d4eap6 0x1.3fffffffea557p2 0x1.512p-19 F +REG epsg:2477 4 OK 0x1.019c7991195cbp20 0x1.0f0905e270c04p19 0x1.f5b75f32cp4 0x1.b7ffffffe2b3bp6 0x1.3fffffffea575p2 0x1.518p-19 F +REG epsg:2478 0 OK 0x1.e840fac1d36cfp18 0x1.463d231b1ae3cp6 0x1.85e90c734p4 0x1.bc00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2478 1 OK -0x1.af66ae9dfddp15 -0x1.0ef4a93f9609fp19 0x1.255be0958p4 0x1.a80000001d504p6 -0x1.3fffffffea562p2 0x1.516p-19 F +REG epsg:2478 2 OK 0x1.019bb2d0cc32bp20 -0x1.0ef4a7494afabp19 0x1.c5037de5p3 0x1.cfffffffe2b45p6 -0x1.3fffffffea59cp2 0x1.512p-19 F +REG epsg:2478 3 OK -0x1.af6431c52f75p15 0x1.0f090ce652361p19 0x1.046969606p5 0x1.a80000001d4fcp6 0x1.3fffffffea545p2 0x1.51ap-19 F +REG epsg:2478 4 OK 0x1.019b9eea89508p20 0x1.0f090aefe1bb2p19 0x1.c5f8baf2p4 0x1.cfffffffe2b4dp6 0x1.3fffffffea583p2 0x1.512p-19 F +REG epsg:2479 0 OK 0x1.e83d970f01d21p18 0x1.463d2e03cec63p6 0x1.523086b44p4 0x1.d400000000002p6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2479 1 OK -0x1.af825c15223ap15 -0x1.0ef4b254da438p19 0x1.04dd6a258p4 0x1.c00000001d516p6 -0x1.3fffffffea54fp2 0x1.516p-19 F +REG epsg:2479 2 OK 0x1.019ade6026a62p20 -0x1.0ef4b05e78f52p19 0x1.38b08eecp3 0x1.e7ffffffe2b58p6 -0x1.3fffffffea5a9p2 0x1.518p-19 F +REG epsg:2479 3 OK -0x1.af7fdf381e36p15 0x1.0f0915fc439cap19 0x1.e85461184p4 0x1.c00000001d50ep6 0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:2479 4 OK 0x1.019aca7a01782p20 0x1.0f091405bcdf4p19 0x1.7fcf4dc68p4 0x1.e7ffffffe2b5fp6 0x1.3fffffffea593p2 0x1.512p-19 F +REG epsg:2480 0 OK 0x1.e83a4dbcc74ffp18 0x1.463d3da588b23p6 0x1.0813e164cp4 0x1.ebfffffffffffp6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2480 1 OK -0x1.af9d74bb448p15 -0x1.0ef4bf58c251fp19 0x1.9b2795f9p3 0x1.d80000001d529p6 -0x1.3fffffffea545p2 0x1.512p-19 F +REG epsg:2480 2 OK 0x1.019a12795c07p20 -0x1.0ef4bd624b633p19 0x1.02232bb2p2 0x1.ffffffffe2b67p6 -0x1.3fffffffea5b4p2 0x1.50ep-19 F +REG epsg:2480 3 OK -0x1.af9af7da0e2p15 0x1.0f09230123cfbp19 0x1.b10aca108p4 0x1.d80000001d522p6 0x1.3fffffffea52ap2 0x1.51ap-19 F +REG epsg:2480 4 OK 0x1.0199fe9352ba6p20 0x1.0f09210a876efp19 0x1.23ffdebdcp4 0x1.ffffffffe2b6cp6 0x1.3fffffffea5a1p2 0x1.51p-19 F +REG epsg:2481 0 OK 0x1.e8372802bf77bp18 0x1.463d51d471fc3p6 0x1.50c5ef54p3 0x1.02p7 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2481 1 OK -0x1.afb7ac919e69p15 -0x1.0ef4d026ce03dp19 0x1.0034254cp3 0x1.f00000001d537p6 -0x1.3fffffffea536p2 0x1.51ap-19 F +REG epsg:2481 2 OK 0x1.019951584c107p20 -0x1.0ef4ce3042511p19 -0x1.7f59c062p1 0x1.0bfffffff15bcp7 -0x1.3fffffffea5c5p2 0x1.50ep-19 F +REG epsg:2481 3 OK -0x1.afb52fac44bep15 0x1.0f0933d06fe69p19 0x1.63911d1e4p4 0x1.f00000001d52fp6 0x1.3fffffffea51fp2 0x1.518p-19 F +REG epsg:2481 4 OK 0x1.01993d725c844p20 0x1.0f0931d9bebe9p19 0x1.6717d89cp3 0x1.0bfffffff15bfp7 0x1.3fffffffea5acp2 0x1.514p-19 F +REG epsg:24817 0 OK 0x1.e8883e827538cp18 0x1.77da000d3557ap8 -0x1.08ae3c72ep5 -0x1.44p6 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:24817 1 OK -0x1.ab7e979ab19ap15 -0x1.0eb4bd0648c17p19 -0x1.648e43042p6 -0x1.58p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:24817 2 OK 0x1.01a0143ee438p20 -0x1.0eb4bd07ed0f6p19 -0x1.63fe119dp5 -0x1.3p6 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:24817 3 OK -0x1.ab732251172ap15 0x1.0f12b2bceda55p19 -0x1.79912f344p4 -0x1.58p6 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:24817 4 OK 0x1.019fb87ef526ep20 0x1.0f12b2be93109p19 0x1.50a9d571p4 -0x1.3p6 0x1.4000000000001p2 0x0.0p0 F +REG epsg:24818 0 OK 0x1.e882333a0d60fp18 0x1.77d99c37802fap8 -0x1.da1787adp2 -0x1.2cp6 0x1.c72f1eacb7b03p-60 0x1.0p-30 T +REG epsg:24818 1 OK -0x1.abaa7d4c2287p15 -0x1.0eb474f0ae8cfp19 -0x1.ec73e73aap5 -0x1.4p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:24818 2 OK 0x1.019e6dc23155ap20 -0x1.0eb474f22b81ep19 -0x1.51dce33f4p4 -0x1.18p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:24818 3 OK -0x1.ab9f07eb0df5p15 0x1.0f126a8e90686p19 0x1.fdf719ccp1 -0x1.4p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:24818 4 OK 0x1.019e12038f86fp20 0x1.0f126a900e5fbp19 0x1.63640be66p5 -0x1.18p6 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:24819 0 OK 0x1.e87b84b9388a2p18 0x1.77d942c21d21bp8 0x1.f33ba9cbp3 -0x1.14p6 0x0.0p0 -0x1.0p-30 T +REG epsg:24819 1 OK -0x1.abdbf361e782p15 -0x1.0eb434590e82dp19 -0x1.23359418cp5 -0x1.28p6 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:24819 2 OK 0x1.019ca22bc1174p20 -0x1.0eb4345a5fe2bp19 -0x1.351af05p-1 -0x1.0p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:24819 3 OK -0x1.abd07de4f7b3p15 0x1.0f1229e0c0302p19 0x1.d23a78a38p4 -0x1.28p6 0x1.3fffffffffffdp2 -0x1.0p-29 F +REG epsg:24819 4 OK 0x1.019c466e80757p20 0x1.0f1229e21274ep19 0x1.03bed142dp6 -0x1.0p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2482 0 OK 0x1.e8342eb4b5d8ep18 0x1.463d6a57f02eap6 0x1.a15152bcp1 0x1.0ep7 0x0.0p0 0x1.544p-19 T +REG epsg:2482 1 OK -0x1.afd0ba0fcd39p15 -0x1.0ef4e48fdc621p19 0x1.d498b4e8p0 0x1.040000000eaa4p7 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:2482 2 OK 0x1.01989d1aa1438p20 -0x1.0ef4e2993d018p19 -0x1.6790baefp3 0x1.17fffffff15c2p7 -0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:2482 3 OK -0x1.afce3d266af1p15 0x1.0f09483b03671p19 0x1.00c0a44dcp4 0x1.040000000eaap7 0x1.3fffffffea512p2 0x1.514p-19 F +REG epsg:2482 4 OK 0x1.01988934c90e9p20 0x1.0f0946443e8e7p19 0x1.7d76d238p1 0x1.17fffffff15c6p7 0x1.3fffffffea5b6p2 0x1.516p-19 F +REG epsg:24820 0 OK 0x1.e87445bd6aa51p18 0x1.77d8f4a7e64a1p8 0x1.1d831eaf2p5 -0x1.f8p5 0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:24820 1 OK -0x1.ac126f21ad88p15 -0x1.0eb3fbf4886c8p19 -0x1.be57bb5dp3 -0x1.1p6 -0x1.4p2 -0x1.0p-29 F +REG epsg:24820 2 OK 0x1.019ab6848dd0ep20 -0x1.0eb3fbf5aa765p19 0x1.0d07937d8p4 -0x1.d000000000001p5 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:24820 3 OK -0x1.ac06f984cf88p15 0x1.0f11f168dafe2p19 0x1.9cbc67ceap5 -0x1.1p6 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:24820 4 OK 0x1.019a5ac8be683p20 0x1.0f11f169fdcc9p19 0x1.496abcc7ep6 -0x1.d000000000001p5 0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:24821 0 OK 0x1.e86c8a992099fp18 0x1.77d8b2c3dc95ap8 0x1.a516fd16ep5 -0x1.c800000000001p5 0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:24821 1 OK -0x1.ac4d57bcc5fap15 -0x1.0eb3cc613d21ep19 0x1.639a4d61p2 -0x1.fp5 -0x1.4p2 0x1.0p-29 F +REG epsg:24821 2 OK 0x1.0198b02f754acp20 -0x1.0eb3cc622c9a7p19 0x1.ef26cefa8p4 -0x1.ap5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:24821 3 OK -0x1.ac41e1fc405fp15 0x1.0f11c1c537fbbp19 0x1.1c629b456p6 -0x1.fp5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:24821 4 OK 0x1.01985475231cp20 0x1.0f11c1c628168p19 0x1.81f26554cp6 -0x1.a000000000001p5 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:2483 0 OK 0x1.e8316a29e4fe3p18 0x1.463d86eb43bcep6 -0x1.4d4242bp2 0x1.1ap7 0x0.0p0 0x1.54p-19 T +REG epsg:2483 1 OK -0x1.afe856f20731p15 -0x1.0ef4fc5aafcf4p19 -0x1.67229e2dp2 0x1.100000000eaabp7 -0x1.3fffffffea51ap2 0x1.52p-19 F +REG epsg:2483 2 OK 0x1.0197f7b9e1ee4p20 -0x1.0ef4fa63fe0f3p19 -0x1.499cd05f8p4 0x1.23fffffff15c9p7 -0x1.3fffffffea5dap2 0x1.50ep-19 F +REG epsg:2483 3 OK -0x1.afe5da04c248p15 0x1.0f0960079c70bp19 0x1.135d05ed8p3 0x1.100000000eaa8p7 0x1.3fffffffea501p2 0x1.51ep-19 F +REG epsg:2483 4 OK 0x1.0197e3d41e65fp20 0x1.0f095e10c535dp19 -0x1.98960a64p2 0x1.23fffffff15cdp7 0x1.3fffffffea5c2p2 0x1.50ep-19 F +REG epsg:2484 0 OK 0x1.e82ee225924bbp18 0x1.463da73e48be3p6 -0x1.d92280d7p3 0x1.26p7 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2484 1 OK -0x1.affe40fe2695p15 -0x1.0ef517448e83p19 -0x1.c79d2479p3 0x1.1c0000000eab2p7 -0x1.3fffffffea50ep2 0x1.51cp-19 F +REG epsg:2484 2 OK 0x1.01976305e6612p20 -0x1.0ef5154dcbe4cp19 -0x1.efc457ed4p4 0x1.2ffffffff15dp7 -0x1.3fffffffea5e4p2 0x1.50ep-19 F +REG epsg:2484 3 OK -0x1.affbc40d2fefp15 0x1.0f097af37c42ep19 -0x1.5d4dbap-6 0x1.1c0000000eaaep7 0x1.3fffffffea4f5p2 0x1.51cp-19 F +REG epsg:2484 4 OK 0x1.01974f2034a0dp20 0x1.0f0978fc94278p19 -0x1.0c4cf1b84p4 0x1.2ffffffff15d3p7 0x1.3fffffffea5cdp2 0x1.50ap-19 F +REG epsg:2485 0 OK 0x1.e82c9dc1489ap18 0x1.463dcaf657a0ap6 -0x1.95ea1277p4 0x1.32p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2485 1 OK -0x1.b0123abd6595p15 -0x1.0ef53501fd9d7p19 -0x1.7f451961cp4 0x1.280000000eab7p7 -0x1.3fffffffea503p2 0x1.51cp-19 F +REG epsg:2485 2 OK 0x1.0196e09fc406p20 -0x1.0ef5330b2bd1fp19 -0x1.523678eacp5 0x1.3bfffffff15d4p7 -0x1.3fffffffea5ecp2 0x1.51p-19 F +REG epsg:2485 3 OK -0x1.b00fbdc8f86fp15 0x1.0f0998b3225ebp19 -0x1.379b876e8p3 0x1.280000000eab4p7 0x1.3fffffffea4edp2 0x1.51ap-19 F +REG epsg:2485 4 OK 0x1.0196ccba20f74p20 0x1.0f0996bc2b14p19 -0x1.c0f5711p4 0x1.3bfffffff15d8p7 0x1.3fffffffea5d6p2 0x1.50cp-19 F +REG epsg:2486 0 OK 0x1.e82aa358ee7bbp18 0x1.463df1af4352fp6 -0x1.26c008184p5 0x1.3ep7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2486 1 OK -0x1.b0240c28c053p15 -0x1.0ef5553f94c81p19 -0x1.153c1bb7ep5 0x1.340000000eabfp7 -0x1.3fffffffea4f9p2 0x1.52p-19 F +REG epsg:2486 2 OK 0x1.019671f53b872p20 -0x1.0ef55348b5ab2p19 -0x1.b2cdf6984p5 0x1.47fffffff15d9p7 -0x1.3fffffffea5f5p2 0x1.50cp-19 F +REG epsg:2486 3 OK -0x1.b0218f3121a2p15 0x1.0f09b8f320378p19 -0x1.4700c899p4 0x1.340000000eabbp7 0x1.3fffffffea4e3p2 0x1.51ap-19 F +REG epsg:2486 4 OK 0x1.01965e0fa3ea2p20 0x1.0f09b6fc1b993p19 -0x1.41122801p5 0x1.47fffffff15ddp7 0x1.3fffffffea5ddp2 0x1.50ep-19 F +REG epsg:2487 0 OK 0x1.e828f878f0072p18 0x1.463e1afc72284p6 -0x1.88a82964ap5 0x1.4ap7 0x0.0p0 0x1.544p-19 T +REG epsg:2487 1 OK -0x1.b03383461aabp15 -0x1.0ef577a2e8139p19 -0x1.71c3e1b64p5 0x1.400000000eac3p7 -0x1.3fffffffea4f1p2 0x1.52p-19 F +REG epsg:2487 2 OK 0x1.0196183cb6cbep20 -0x1.0ef575abfda56p19 -0x1.0c4cdddafp6 0x1.53fffffff15ddp7 -0x1.3fffffffea5f9p2 0x1.51p-19 F +REG epsg:2487 3 OK -0x1.b031064b9856p15 0x1.0f09db590321ep19 -0x1.00081caf6p5 0x1.400000000eabep7 0x1.3fffffffea4dbp2 0x1.52p-19 F +REG epsg:2487 4 OK 0x1.019604572740ep20 0x1.0f09d961f330dp19 -0x1.a6ddde26ap5 0x1.53fffffff15e1p7 0x1.3fffffffea5e3p2 0x1.51p-19 F +REG epsg:24877 0 OK 0x1.e8883eee02412p18 0x1.b99cc79b775dep22 -0x1.88436b8268p7 -0x1.44p6 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:24877 1 OK -0x1.f82d3ce52b2cp14 0x1.97061c459a0a4p22 -0x1.f38b8b2fd8p7 -0x1.5a114b818572ep6 -0x1.e000000000003p4 -0x1.8p-29 F +REG epsg:24877 2 OK 0x1.f849a934a7ba8p19 0x1.97061c44b46dep22 -0x1.9dedeee588p7 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:24877 3 OK -0x1.2ee616b42b54p16 0x1.dacffb12dcae5p22 -0x1.78af4faeap7 -0x1.5a114b818572ep6 -0x1.3fffffffffffdp4 0x1.0p-28 F +REG epsg:24877 4 OK 0x1.0732810bb35d6p20 0x1.dacffb1201df4p22 -0x1.1bc9807848p7 -0x1.2deeb47e7a8d2p6 -0x1.3fffffffffffdp4 -0x1.0p-30 F +REG epsg:24878 0 OK 0x1.e882339cee5eap18 0x1.b99cf2fe89ef3p22 -0x1.59b812aeap7 -0x1.2c00000000001p6 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:24878 1 OK -0x1.f88686da05b8p14 0x1.97064ff6b880bp22 -0x1.c33f7d164p7 -0x1.42114b818572ep6 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:24878 2 OK 0x1.f846682aedad1p19 0x1.97064ff5e8644p22 -0x1.75afde8c28p7 -0x1.15eeb47e7a8d2p6 -0x1.e000000000001p4 0x1.0p-30 F +REG epsg:24878 3 OK -0x1.2efc1446a35cp16 0x1.dad01e7975102p22 -0x1.4447a1b8dp7 -0x1.42114b818572ep6 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:24878 4 OK 0x1.0730db38317d4p20 0x1.dad01e78aec06p22 -0x1.e03e6794dp6 -0x1.15eeb47e7a8d1p6 -0x1.4000000000002p4 -0x1.0p-29 F +REG epsg:24879 0 OK 0x1.e87b8511e52b4p18 0x1.b99d19df36acap22 -0x1.300317df08p7 -0x1.14p6 -0x1.9000000000002p4 -0x1.8p-29 F +REG epsg:24879 1 OK -0x1.f8eac9f193fap14 0x1.97067e4878106p22 -0x1.9720855748p7 -0x1.2a114b818572ep6 -0x1.e000000000001p4 0x1.0p-30 F +REG epsg:24879 2 OK 0x1.f842dbaf29235p19 0x1.97067e47bfc4p22 -0x1.527869eb8p7 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:24879 3 OK -0x1.2f14d8f35af9p16 0x1.dad03e322241ep22 -0x1.1467f97bfp7 -0x1.2a114b818572ep6 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:24879 4 OK 0x1.072f103902238p20 0x1.dad03e3172a4cp22 -0x1.93d1e3f5bp6 -0x1.fbdd68fcf51a4p5 -0x1.4p4 0x0.0p0 F +REG epsg:2488 0 OK 0x1.e827a1ceae3edp18 0x1.463e466a0e5aep6 -0x1.ef9ad39cep5 0x1.56p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2488 1 OK -0x1.b04074b46f84p15 -0x1.0ef59bcb8581bp19 -0x1.d43659bb8p5 0x1.4c0000000eac7p7 -0x1.3fffffffea4ebp2 0x1.518p-19 F +REG epsg:2488 2 OK 0x1.0195d471e223ap20 -0x1.0ef599d491e2bp19 -0x1.413e22f51p6 0x1.5ffffffff15ep7 -0x1.3fffffffea601p2 0x1.508p-19 F +REG epsg:2488 3 OK -0x1.b03df7b75f95p15 0x1.0f09ff8451f1p19 -0x1.627a863a8p5 0x1.4c0000000eac4p7 0x1.3fffffffea4d4p2 0x1.52p-19 F +REG epsg:2488 4 OK 0x1.0195c08c57341p20 0x1.0f09fd8d38cdbp19 -0x1.08602c645p6 0x1.5ffffffff15e3p7 0x1.3fffffffea5e8p2 0x1.50ep-19 F +REG epsg:24880 0 OK 0x1.e874460a7aca6p18 0x1.b99d3bd07881ep22 -0x1.0b997284bp7 -0x1.f8p5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:24880 1 OK -0x1.f958ecf59f56p14 0x1.9706a6b8f52bp22 -0x1.6faa60f89p7 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:24880 2 OK 0x1.f83f0db558d08p19 0x1.9706a6b856bbp22 -0x1.34aa54a798p7 -0x1.cbdd68fcf51a2p5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:24880 3 OK -0x1.2f301f4225c9p16 0x1.dad059e3f0a3dp22 -0x1.d32d33f96p6 -0x1.12114b818572ep6 -0x1.3fffffffffffdp4 0x1.0p-28 F +REG epsg:24880 4 OK 0x1.072d251578942p20 0x1.dad059e359ac8p22 -0x1.5323c9c8ap6 -0x1.cbdd68fcf51a2p5 -0x1.3fffffffffffep4 -0x1.0p-30 F +REG epsg:24881 0 OK 0x1.e86c8ad9552c4p18 0x1.b99d587321a6cp22 -0x1.d9c281a06p6 -0x1.c8p5 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:24881 1 OK -0x1.f9cfbb0082fap14 0x1.9706c8d6c9d34p22 -0x1.4d4bbb69cp7 -0x1.f42297030ae5cp5 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:24881 2 OK 0x1.f83b08e916fc5p19 0x1.9706c8d647036p22 -0x1.1c9934fcp7 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffap4 0x0.0p0 F +REG epsg:24881 3 OK -0x1.2f4d9ab3fa07p16 0x1.dad0714137af4p22 -0x1.889730346p6 -0x1.f42297030ae5cp5 -0x1.4000000000002p4 0x1.0p-30 F +REG epsg:24881 4 OK 0x1.072b1f2f032dp20 0x1.dad07140bb0b6p22 -0x1.1ee97d0b6p6 -0x1.9bdd68fcf51a3p5 -0x1.4000000000003p4 0x1.8p-29 F +REG epsg:24882 0 OK 0x1.e864692d2f3e8p18 0x1.b99d6f76e6535p22 -0x1.a86152cf9p6 -0x1.97fffffffffffp5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:24882 1 OK -0x1.fa4de6df68dp14 0x1.9706e4424b62ep22 -0x1.3064f83d6p7 -0x1.c42297030ae5cp5 -0x1.e000000000003p4 -0x1.8p-29 F +REG epsg:24882 2 OK 0x1.f836d88fae205p19 0x1.9706e441e5a83p22 -0x1.0a8889667p7 -0x1.6bdd68fcf51a3p5 -0x1.dfffffffffffap4 0x1.8p-29 F +REG epsg:24882 3 OK -0x1.2f6cf89974f2p16 0x1.dad084087391cp22 -0x1.49df13cc9p6 -0x1.c42297030ae5ep5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:24882 4 OK 0x1.07290432153c5p20 0x1.dad0840812a45p22 -0x1.ef6aeb08ep5 -0x1.6bdd68fcf51a3p5 -0x1.4000000000002p4 0x1.0p-29 F +REG epsg:2489 0 OK 0x1.e826a31b5fc07p18 0x1.463e737e4adccp6 -0x1.2d3ba49ep6 0x1.62p7 -0x1.2f74bf1dcf457p-62 0x1.54p-19 T +REG epsg:2489 1 OK -0x1.b04abc2582eep15 -0x1.0ef5c15403778p19 -0x1.1dbfb3186p6 0x1.580000000eacbp7 -0x1.3fffffffea4e7p2 0x1.51ap-19 F +REG epsg:2489 2 OK 0x1.0195a752ea19bp20 -0x1.0ef5bf5d08e11p19 -0x1.77a64d3e7p6 -0x1.640000000ea1fp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2489 3 OK -0x1.b0483f264291p15 0x1.0f0a250f9b7c6p19 -0x1.c9c3837fap5 0x1.580000000eac7p7 0x1.3fffffffea4cfp2 0x1.52p-19 F +REG epsg:2489 4 OK 0x1.0195936d60424p20 0x1.0f0a23187b60ap19 -0x1.3ec84eadap6 -0x1.640000000ea1bp7 0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:24891 0 OK 0x1.b217902d2d9b9p17 0x1.5c70cb2f73c2fp20 -0x1.197444939p6 -0x1.42p6 -0x1.8000000000001p2 -0x1.0p-29 F +REG epsg:24891 1 OK -0x1.4015d3e9ecdccp18 0x1.a8a7645461915p19 -0x1.f86ad024ap6 -0x1.561c33cfd880ep6 -0x1.5fffffffeaefcp3 -0x1.0p-27 F +REG epsg:24891 2 OK 0x1.7916b2873f645p19 0x1.a8a76450f7086p19 -0x1.48d106c2bp6 -0x1.2de3cc302799fp6 -0x1.5fffffffeacdbp3 0x1.8p-29 F +REG epsg:24891 3 OK -0x1.4a08e13a69642p18 0x1.e34c6b038944fp20 -0x1.e4f9e0608p5 -0x1.561c33cfca13bp6 -0x1.ffffffffdb769p-1 -0x1.8p-27 T +REG epsg:24891 4 OK 0x1.7e10390c27951p19 0x1.e34c6b035e444p20 -0x1.fd098ab48p3 -0x1.2de3cc30361b4p6 -0x1.ffffffffdb3d3p-1 0x1.8p-27 T +REG epsg:24892 0 OK 0x1.5fad9e7cb4d6cp19 0x1.fbfcf3f8b21abp19 -0x1.297b1bf49p6 -0x1.3p6 -0x1.2ffffffffffffp3 0x0.0p0 F +REG epsg:24892 1 OK 0x1.52d8a449739d4p17 0x1.d641519707198p18 -0x1.0185931f98p7 -0x1.444731b0c922p6 -0x1.cfffffffe519p3 -0x1.8p-29 F +REG epsg:24892 2 OK 0x1.35528a2b3fadcp20 0x1.d641518ef415cp18 -0x1.60c52d74ep6 -0x1.1bb8ce4f36ec3p6 -0x1.cfffffffe4f18p3 -0x1.0p-29 F +REG epsg:24892 3 OK 0x1.332b41bfa0308p17 0x1.846d2f31b55b4p20 -0x1.f8101d32ap5 -0x1.444731b0b39dp6 -0x1.1fffffffeaeadp2 -0x1.6p-27 F +REG epsg:24892 4 OK 0x1.3948366dfcffcp20 0x1.846d2f30fef1ep20 -0x1.53c01cbe4p4 -0x1.1bb8ce4f4c8d1p6 -0x1.1fffffffeacbdp2 0x1.cp-28 F +REG epsg:24893 0 OK 0x1.434b4f7566fe5p20 0x1.fc0a95495824fp19 -0x1.a85a2c7b8p5 -0x1.1ap6 -0x1.3p3 0x0.0p0 F +REG epsg:24893 1 OK 0x1.7b91b5c74ad4bp19 0x1.d64117dd578ccp18 -0x1.a7681c072p6 -0x1.2e4731b0c9214p6 -0x1.cfffffffe5176p3 -0x1.8p-28 F +REG epsg:24893 2 OK 0x1.c8cdc4395f145p20 0x1.d64117d614fb4p18 -0x1.1596deb7cp6 -0x1.05b8ce4f36eb8p6 -0x1.cfffffffe4f37p3 -0x1.8p-29 F +REG epsg:24893 3 OK 0x1.73a5f8c83bb3dp19 0x1.847ac5289d27ep20 -0x1.3b58455ccp5 -0x1.2e4731b0b39afp6 -0x1.1fffffffeae9ap2 -0x1.0p-27 F +REG epsg:24893 4 OK 0x1.ccc3a2abb55c7p20 0x1.847ac527f9246p20 -0x1.e17f2eecp0 -0x1.05b8ce4f4c8adp6 -0x1.1fffffffeacd8p2 0x1.4p-28 F +REG epsg:2490 0 OK 0x1.e825ff2987834p18 0x1.463ea1bab8e7dp6 -0x1.6408e9415p6 -0x1.62p7 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2490 1 OK -0x1.b0523cc3be38p15 -0x1.0ef5e7d31d1ffp19 -0x1.533eab99fp6 0x1.640000000eacdp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:2490 2 OK 0x1.0195915e65b86p20 -0x1.0ef5e5dc1ddecp19 -0x1.aeecc3a18p6 -0x1.580000000ea1ep7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2490 3 OK -0x1.b04fbfc2b0cp15 0x1.0f0a4b919317ep19 -0x1.1a60b263ap6 0x1.640000000eac9p7 0x1.3fffffffea4cbp2 0x1.51ap-19 F +REG epsg:2490 4 OK 0x1.01957d78d9728p20 0x1.0f0a499a6e50ep19 -0x1.760ebceffp6 -0x1.580000000ea1ap7 0x1.3fffffffea5edp2 0x1.508p-19 F +REG epsg:2491 0 OK 0x1.e825b7c51f4fep18 0x1.463ed09daa8ddp6 -0x1.9b9b8306bp6 -0x1.56p7 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2491 1 OK -0x1.b056e1831b1dp15 -0x1.0ef60edcd9a3p19 -0x1.8a020b83cp6 -0x1.5ffffffff1532p7 -0x1.3fffffffea4ep2 0x1.516p-19 F +REG epsg:2491 2 OK 0x1.019592d1f30f5p20 -0x1.0ef60ce5d8106p19 -0x1.e6767d49ep6 -0x1.4c0000000ea1dp7 -0x1.3fffffffea606p2 0x1.508p-19 F +REG epsg:2491 3 OK -0x1.b0546480a8eap15 0x1.0f0a729e37e13p19 -0x1.51240a3fbp6 -0x1.5ffffffff1536p7 0x1.3fffffffea4c8p2 0x1.522p-19 F +REG epsg:2491 4 OK 0x1.01957eec60db5p20 0x1.0f0a70a710c87p19 -0x1.ad986e6d7p6 -0x1.4c0000000ea1ap7 0x1.3fffffffea5fp2 0x1.50ap-19 F +REG epsg:2492 0 OK 0x1.e8657aca2f876p18 0x1.6e5d35b8097aep6 -0x1.b308a6078p6 0x1.1ffffffffc7fbp3 -0x1.0bbcf0681ce59p-34 0x1.f1fp-14 T +REG epsg:2492 1 OK -0x1.ae59f6d38496p15 -0x1.0ef4dd166c5bcp19 -0x1.008733ba68p7 0x1.00000001da634p2 -0x1.3fffffffdc811p2 0x1.f265p-14 F +REG epsg:2492 2 OK 0x1.01a588821ec9cp20 -0x1.0ef4da205930fp19 -0x1.9d8a0f70bp6 0x1.bfffffff14673p3 -0x1.3fffffffeeca5p2 0x1.f3b6p-14 F +REG epsg:2492 3 OK -0x1.ae56e77403a3p15 0x1.0f0bcc2741636p19 -0x1.c8994a67cp6 0x1.00000001c7ef2p2 0x1.3fffffffcdcc8p2 0x1.ee0ap-14 F +REG epsg:2492 4 OK 0x1.01a57978f426ap20 0x1.0f0bb65f4a753p19 -0x1.65155b301p6 0x1.bfffffff0b75cp3 0x1.3fffffffbbd09p2 0x1.e49cp-14 F +REG epsg:2493 0 OK 0x1.e86552befe949p18 0x1.6d6bcd4a9ceefp6 -0x1.77189b31fp6 0x1.dffffffffa553p3 -0x1.baf3683900cc4p-34 0x1.eeaap-14 T +REG epsg:2493 1 OK -0x1.ae58ce90a405p15 -0x1.0ef4b77140cf8p19 -0x1.c55b3050bp6 0x1.40000000ead5ap3 -0x1.3fffffffe78c2p2 0x1.f3b8p-14 F +REG epsg:2493 2 OK 0x1.01a5682268fd7p20 -0x1.0ef4baa37889ep19 -0x1.6245fca59p6 0x1.3fffffff89269p4 -0x1.3ffffffff990fp2 0x1.f26p-14 F +REG epsg:2493 3 OK -0x1.ae555c382edbp15 0x1.0f0b9d93dcf4p19 -0x1.8ce646419p6 0x1.40000000e1b9ap3 0x1.3fffffffc2f4ep2 0x1.e8dep-14 F +REG epsg:2493 4 OK 0x1.01a55c314b5a9p20 0x1.0f0b81a3a2cc5p19 -0x1.29d1b62bp6 0x1.3fffffff84d1ep4 0x1.3fffffffb180dp2 0x1.dd05p-14 F +REG epsg:2494 0 OK 0x1.e864c6ad7539ep18 0x1.6c051c7d5a47ap6 -0x1.3bbf9776p6 0x1.4ffffffffc356p4 -0x1.32a7c92ec86fep-33 0x1.e9ebp-14 T +REG epsg:2494 1 OK -0x1.ae5acbb57d0dp15 -0x1.0ef495f651c79p19 -0x1.89b2d54f3p6 0x1.00000000744cbp4 -0x1.3ffffffff278cp2 0x1.f367p-14 F +REG epsg:2494 2 OK 0x1.01a52f005d804p20 -0x1.0ef49f2527862p19 -0x1.2822ad974p6 0x1.9fffffff883cbp4 -0x1.400000000403bp2 0x1.ef9fp-14 F +REG epsg:2494 3 OK -0x1.ae56f9231d75p15 0x1.0f0b6baa84e9bp19 -0x1.513e41dp6 0x1.000000006fda7p4 0x1.3fffffffb8651p2 0x1.e23p-14 F +REG epsg:2494 4 OK 0x1.01a526116cd7ep20 0x1.0f0b49bdaf2e8p19 -0x1.df5ded54p5 0x1.9fffffff84185p4 0x1.3fffffffa7a74p2 0x1.d44p-14 F +REG epsg:2495 0 OK 0x1.e863d81e9c8d7p18 0x1.6a2d118fde25ep6 -0x1.01a40f9d1p6 0x1.affffffffb6a6p4 -0x1.8479cdd1b311fp-33 0x1.e3f3p-14 T +REG epsg:2495 1 OK -0x1.ae5fe8ac9919p15 -0x1.0ef4790384b3cp19 -0x1.4ebcaa025p6 0x1.60000000734a7p4 -0x1.3ffffffffd269p2 0x1.f192p-14 F +REG epsg:2495 2 OK 0x1.01a4ddbc45d0fp20 -0x1.0ef487f2810b7p19 -0x1.df866456ap5 0x1.ffffffff877f8p4 -0x1.400000000e028p2 0x1.ebb8p-14 F +REG epsg:2495 3 OK -0x1.ae5bb9ad3b3dp15 0x1.0f0b36f738154p19 -0x1.16488fb2cp6 0x1.600000006f007p4 0x1.3fffffffae39dp2 0x1.da2ap-14 F +REG epsg:2495 4 OK 0x1.01a4d7b131fcep20 0x1.0f0b0f4a38ecfp19 -0x1.6ea055ffp5 0x1.ffffffff8396fp4 0x1.3fffffff9e5dp2 0x1.caa1p-14 F +REG epsg:2496 0 OK 0x1.e86289afb7efp18 0x1.67e8d8a93528dp6 -0x1.92d1fb5f8p5 0x1.07fffffffd695p5 -0x1.d20a450caa51bp-33 0x1.dcfap-14 T +REG epsg:2496 1 OK -0x1.ae68171d4206p15 -0x1.0ef460ea08dccp19 -0x1.151e0dea6p6 0x1.c0000000726e9p4 -0x1.4000000007757p2 0x1.ee6dp-14 F +REG epsg:2496 2 OK 0x1.01a4753a1a53p20 -0x1.0ef4754c937f8p19 -0x1.738b4d7ecp5 0x1.2fffffffc37b4p5 -0x1.40000000176e8p2 0x1.e6e5p-14 F +REG epsg:2496 3 OK -0x1.ae6390810acfp15 0x1.0f0b000dc7353p19 -0x1.b9551c2b2p5 0x1.c00000006e58dp4 0x1.3fffffffa48cap2 0x1.d118p-14 F +REG epsg:2496 4 OK 0x1.01a471ec781a4p20 0x1.0f0ad2ed31b09p19 -0x1.02a6db39cp5 0x1.2fffffffc1aa8p5 0x1.3fffffff95b93p2 0x1.c06ep-14 F +REG epsg:2497 0 OK 0x1.e860df0aee214p18 0x1.653ecd53f6ce3p6 -0x1.27582fbd8p5 0x1.37fffffffd3a7p5 -0x1.0d3fd0be14e2p-32 0x1.d553p-14 T +REG epsg:2497 1 OK -0x1.ae734013cddfp15 -0x1.0ef44ded73cbfp19 -0x1.baf1394c2p5 0x1.1000000038e13p5 -0x1.4000000011463p2 0x1.ea29p-14 F +REG epsg:2497 2 OK 0x1.01a3f69f027d5p20 -0x1.0ef46767aa68bp19 -0x1.0d82f177cp5 0x1.5fffffffc353p5 -0x1.40000000202a7p2 0x1.e173p-14 F +REG epsg:2497 3 OK -0x1.ae6e67a09a5ap15 0x1.0f0ac788365b7p19 -0x1.4a0badcb4p5 0x1.1000000036f62p5 0x1.3fffffff9b769p2 0x1.c73bp-14 F +REG epsg:2497 4 OK 0x1.01a3f5e0b75b4p20 0x1.0f0a954fe7a25p19 -0x1.3940a69fp4 0x1.5fffffffc1aadp5 0x1.3fffffff8dd05p2 0x1.b60dp-14 F +REG epsg:2498 0 OK 0x1.e85edcdd00683p18 0x1.623668a7cb3e6p6 -0x1.841058d8p4 0x1.67fffffffd2a7p5 -0x1.2e875424d023dp-32 0x1.cd5p-14 T +REG epsg:2498 1 OK -0x1.ae8144420cebp15 -0x1.0ef4404303d74p19 -0x1.50d0d162cp5 0x1.4000000038a5dp5 -0x1.400000001a79ep2 0x1.e519p-14 F +REG epsg:2498 2 OK 0x1.01a3634e1e495p20 -0x1.0ef45e6abbdafp19 -0x1.5d16f79a8p4 0x1.8fffffffc3485p5 -0x1.400000002819ap2 0x1.dbb3p-14 F +REG epsg:2498 3 OK -0x1.ae7c20a340c1p15 0x1.0f0a8e050cf0bp19 -0x1.bfd9ea564p4 0x1.4000000036dffp5 0x1.3fffffff930dep2 0x1.bcf1p-14 F +REG epsg:2498 4 OK 0x1.01a364e9e1c33p20 0x1.0f0a571f2a91cp19 -0x1.ed57255ep2 0x1.8fffffffc1cd5p5 0x1.3fffffff86b5ep2 0x1.abd9p-14 F +REG epsg:2499 0 OK 0x1.e85c88c82cbaap18 0x1.5ed82c52758afp6 -0x1.8ff85f6p3 0x1.97fffffffd3a7p5 -0x1.4c7e552f9e203p-32 0x1.c54fp-14 T +REG epsg:2499 1 OK -0x1.ae91fc572249p15 -0x1.0ef438110ae8fp19 -0x1.da0916cf4p4 0x1.7000000038879p5 -0x1.4000000022f33p2 0x1.df84p-14 F +REG epsg:2499 2 OK 0x1.01a2bce4a1e74p20 -0x1.0ef45a6efb4abp19 -0x1.5ebd18f88p3 0x1.bfffffffc35b3p5 -0x1.400000002f22fp2 0x1.d5fdp-14 F +REG epsg:2499 3 OK -0x1.ae8c950af285p15 0x1.0f0a54259919p19 -0x1.f08a53798p3 0x1.7000000036ebfp5 0x1.3fffffff8b66dp2 0x1.b297p-14 F +REG epsg:2499 4 OK 0x1.01a2c09e93024p20 0x1.0f0a1909674b6p19 0x1.92f1ca28p1 0x1.bfffffffc2119p5 0x1.3fffffff8079ap2 0x1.a233p-14 F +REG epsg:2500 0 OK 0x1.e859e9545fa21p18 0x1.5b2d8abb3c4c4p6 -0x1.c8363d2p0 0x1.c7fffffffd695p5 -0x1.66d0c8670396fp-32 0x1.bda6p-14 T +REG epsg:2500 1 OK -0x1.aea5396dd307p15 -0x1.0ef4356e83206p19 -0x1.21489c774p4 0x1.a00000003886dp5 -0x1.400000002a973p2 0x1.d9bfp-14 F +REG epsg:2500 2 OK 0x1.01a205354ea0fp20 -0x1.0ef45b7f92f61p19 -0x1.3c3db9a8p0 0x1.efffffffc389cp5 -0x1.40000000352f2p2 0x1.d09cp-14 F +REG epsg:2500 3 OK -0x1.ae9f96b041eap15 0x1.0f0a1a8c2b54cp19 -0x1.fc46e74ep1 0x1.a00000003719dp5 0x1.3fffffff84938p2 0x1.a88ap-14 F +REG epsg:2500 4 OK 0x1.01a20acb9bd6p20 0x1.0f09dbbcbe70fp19 0x1.9be8671dp3 0x1.efffffffc275p5 0x1.3fffffff7b2abp2 0x1.9975p-14 F +REG epsg:25000 0 OK 0x1.0bdd328d4364p18 -0x1.3cd6eeb52b06p8 -0x1.2c8d09cf8p3 -0x1.0p0 0x1.2aaaaaaaaaaa9p2 0x1.0p-29 F +REG epsg:25000 1 OK -0x1.160d2fe859d5ep18 -0x1.0e1ea235f2b15p19 0x1.65103ab6p4 -0x1.81107a2bda1d6p2 -0x1.555555553c621p-2 0x1.8p-29 T +REG epsg:25000 2 OK 0x1.96e3ca77e71e8p19 -0x1.0e1ea235efa0ap19 0x1.1a47441d4p4 0x1.01107a2bda6cap2 -0x1.555555553c66dp-2 -0x1.0p-29 T +REG epsg:25000 3 OK -0x1.0e535b4d692bp18 0x1.0fc2c28029374p19 -0x1.07f405468p5 -0x1.81107a2c94253p2 0x1.3555555541fc2p3 -0x1.0p-30 F +REG epsg:25000 4 OK 0x1.9306e027496fep19 0x1.0fc2c27fd6a37p19 -0x1.2cd0d0296p5 0x1.01107a2c94594p2 0x1.3555555541ff7p3 -0x1.0p-30 F +REG epsg:2501 0 OK 0x1.e85705dce26edp18 0x1.5740cc83a554p6 0x1.f1e47d2ap2 0x1.f7fffffffdb51p5 -0x1.7d34d9bed3961p-32 0x1.b6acp-14 T +REG epsg:2501 1 OK -0x1.aebac590135fp15 -0x1.0ef43862ce78cp19 -0x1.e5997b08p2 0x1.d000000038a34p5 -0x1.40000000314d3p2 0x1.d41ep-14 F +REG epsg:2501 2 OK 0x1.01a13e4355ab6p20 -0x1.0ef4619984aa1p19 0x1.d012c341p2 0x1.0fffffffe1e8ap6 -0x1.400000003a29ep2 0x1.cbdep-14 F +REG epsg:2501 3 OK -0x1.aeb4f043d7f9p15 0x1.0f09e1da4f50fp19 0x1.a153735bp2 0x1.d00000003768ep5 0x1.3fffffff7ea3bp2 0x1.9f23p-14 F +REG epsg:2501 4 OK 0x1.01a1456ef5854p20 0x1.0f099fe51c2b1p19 0x1.55b7c8814p4 0x1.0fffffffe17a3p6 0x1.3fffffff76d3cp2 0x1.91f5p-14 F +REG epsg:2502 0 OK 0x1.e853e67bb8f2fp18 0x1.531cf3afd7cbdp6 0x1.014c4722p4 0x1.13ffffffff0d5p6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:2502 1 OK -0x1.aed2644e6315p15 -0x1.0ef440e5a2293p19 0x1.bc6c7294p0 0x1.000000001c6d3p6 -0x1.4000000036fe9p2 0x1.ceeep-14 F +REG epsg:2502 2 OK 0x1.01a06a3cb3314p20 -0x1.0ef46cabb239cp19 0x1.ccfc8c3d8p3 0x1.27ffffffe216cp6 -0x1.400000003e031p2 0x1.c801p-14 F +REG epsg:2502 3 OK -0x1.aecc65e3fd6bp15 0x1.0f09aaaf06e55p19 0x1.fafa6a1p3 0x1.000000001beb1p6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:2502 4 OK 0x1.01a072b22b872p20 0x1.0f09662a5611p19 0x1.c82c33684p4 0x1.27ffffffe1c5bp6 0x1.3fffffff737fp2 0x1.8bf9p-14 F +REG epsg:2503 0 OK 0x1.e85093f2e8aa7p18 0x1.4ecd9cc7863f7p6 0x1.70818d5c8p4 0x1.2bffffffff4abp6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:2503 1 OK -0x1.aeebd3694e46p15 -0x1.0ef44edf1df97p19 0x1.3938e4c3p3 0x1.180000001c94ap6 -0x1.400000003b98fp2 0x1.ca76p-14 F +REG epsg:2503 2 OK 0x1.019f8b741174ap20 -0x1.0ef47c970d8eep19 0x1.4267d52c8p4 0x1.3fffffffe24cep6 -0x1.4000000040ad6p2 0x1.c53fp-14 F +REG epsg:2503 3 OK -0x1.aee5b5c48e3cp15 0x1.0f0975a50c35cp19 0x1.7e4dd6398p4 0x1.180000001c2efp6 0x1.3fffffff75a11p2 0x1.8fc2p-14 F +REG epsg:2503 4 OK 0x1.019f94e44b1afp20 0x1.0f092f2e54891p19 0x1.120839ccp5 0x1.3fffffffe219fp6 0x1.3fffffff71339p2 0x1.87bdp-14 F +REG epsg:2504 0 OK 0x1.e84d1793e92fap18 0x1.4a5ede45ed732p6 0x1.c8e10c6a8p4 0x1.43ffffffff8ffp6 -0x1.a691e019f05bap-32 0x1.a8aep-14 T +REG epsg:2504 1 OK -0x1.af06cb8b38a2p15 -0x1.0ef462280f43bp19 0x1.07b14d7d8p4 0x1.300000001cc5ep6 -0x1.400000003f0cap2 0x1.c6f4p-14 F +REG epsg:2504 2 OK 0x1.019ea45a452b7p20 -0x1.0ef4912eefce8p19 0x1.86bf9696p4 0x1.57ffffffe2886p6 -0x1.40000000421ffp2 0x1.c3b8p-14 F +REG epsg:2504 3 OK -0x1.af0098e7816ep15 0x1.0f0943511fd52p19 0x1.e95d79248p4 0x1.300000001c7dcp6 0x1.3fffffff72a23p2 0x1.8a57p-14 F +REG epsg:2504 4 OK 0x1.019eae7369c44p20 0x1.0f08fb8b4ccbbp19 0x1.34316849ap5 0x1.57ffffffe2741p6 0x1.3fffffff6ff61p2 0x1.8566p-14 F +REG epsg:2505 0 OK 0x1.e8497b2582935p18 0x1.45dd26b42e0c5p6 0x1.04b9750fp5 0x1.5bffffffffda2p6 -0x1.ab403431476cdp-32 0x1.a702p-14 T +REG epsg:2505 1 OK -0x1.af2301106aabp15 -0x1.0ef47a8a5eeccp19 0x1.5bd905cf4p4 0x1.480000001cfe2p6 -0x1.40000000414ddp2 0x1.c494p-14 F +REG epsg:2505 2 OK 0x1.019db777754bep20 -0x1.0ef4aa399698ap19 0x1.b2c5dd98cp4 0x1.6fffffffe2c5ep6 -0x1.400000004255fp2 0x1.c37cp-14 F +REG epsg:2505 3 OK -0x1.af1cc3e400bdp15 0x1.0f09144067adbp19 0x1.1ebfecdecp5 0x1.480000001cd46p6 0x1.3fffffff70aeap2 0x1.86bep-14 F +REG epsg:2505 4 OK 0x1.019dc1e5d4cbp20 0x1.0f08cbd210809p19 0x1.4a31d65b4p5 0x1.6fffffffe2d09p6 0x1.3fffffff6fc99p2 0x1.8511p-14 F +REG epsg:2506 0 OK 0x1.e845c8c8631ebp18 0x1.415519cd00c9dp6 0x1.18c107564p5 0x1.740000000026p6 -0x1.ab40342ee8834p-32 0x1.a703p-14 T +REG epsg:2506 1 OK -0x1.af4024db2dc5p15 -0x1.0ef497c1a91aep19 0x1.98279585cp4 0x1.600000001d3a8p6 -0x1.4000000042554p2 0x1.c37ap-14 F +REG epsg:2506 2 OK 0x1.019cc764018c6p20 -0x1.0ef4c770c607dp19 0x1.c5ff3187cp4 0x1.87ffffffe3025p6 -0x1.40000000414e6p2 0x1.c497p-14 F +REG epsg:2506 3 OK -0x1.af39e7b9dfd4p15 0x1.0f08e8f6e33b5p19 0x1.3ce480982p5 0x1.600000001d2fap6 0x1.3fffffff6fca1p2 0x1.850dp-14 F +REG epsg:2506 4 OK 0x1.019cd1d2fce8dp20 0x1.0f08a08877afp19 0x1.53cbcf428p5 0x1.87ffffffe32bdp6 0x1.3fffffff70aep2 0x1.86bfp-14 F +REG epsg:2507 0 OK 0x1.e8420adab915ep18 0x1.3cd36d0b752bdp6 0x1.204f103bep5 0x1.8c00000000703p6 -0x1.a691e01532885p-32 0x1.a8b2p-14 T +REG epsg:2507 1 OK -0x1.af5de531a6ffp15 -0x1.0ef4b97bfd00bp19 0x1.bbf3d986p4 0x1.780000001d782p6 -0x1.40000000421f7p2 0x1.c3b5p-14 F +REG epsg:2507 2 OK 0x1.019bd6c13b6c6p20 -0x1.0ef4e8828da81p19 0x1.c035a801cp4 0x1.9fffffffe33acp6 -0x1.400000003f0d1p2 0x1.c6f5p-14 F +REG epsg:2507 3 OK -0x1.af57b2af2451p15 0x1.0f08c1edf96f3p19 0x1.4ec7edc54p5 0x1.780000001d8c3p6 0x1.3fffffff6ff6ap2 0x1.8564p-14 F +REG epsg:2507 4 OK 0x1.019be0dc31f28p20 0x1.0f087a27e976p19 0x1.50e4655bp5 0x1.9fffffffe3828p6 0x1.3fffffff72a1ep2 0x1.8a58p-14 F +REG epsg:2508 0 OK 0x1.e83e4bdb203b8p18 0x1.3864c408098e7p6 0x1.1b4e5f8cp5 0x1.a400000000b58p6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:2508 1 OK -0x1.af7beea302bp15 -0x1.0ef4df5ac2a6p19 0x1.c6d96bacp4 0x1.900000001db39p6 -0x1.4000000040acap2 0x1.c53fp-14 F +REG epsg:2508 2 OK 0x1.019ae832062a6p20 -0x1.0ef50d122e3cdp19 0x1.a1797c24p4 0x1.b7ffffffe36cp6 -0x1.400000003b999p2 0x1.ca79p-14 F +REG epsg:2508 3 OK -0x1.af75d1353191p15 0x1.0f089f9324494p19 0x1.543808ebep5 0x1.900000001de64p6 0x1.3fffffff7133bp2 0x1.87bep-14 F +REG epsg:2508 4 OK 0x1.019af1a542d1p20 0x1.0f08591c07a41p19 0x1.4183bd9ecp5 0x1.b7ffffffe3d15p6 0x1.3fffffff75a0cp2 0x1.8fc4p-14 F +REG epsg:2509 0 OK 0x1.e83a964b34717p18 0x1.34158d07f56f1p6 0x1.09ccfd192p5 0x1.bc00000000f2ep6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:2509 1 OK -0x1.af99ecf16cbep15 -0x1.0ef508f3c4276p19 0x1.b8b9bc51p4 0x1.a80000001de9ep6 -0x1.400000003e023p2 0x1.c803p-14 F +REG epsg:2509 2 OK 0x1.0199fe537261bp20 -0x1.0ef534b91dd34p19 0x1.6a20e103p4 0x1.cfffffffe393ap6 -0x1.4000000036ff7p2 0x1.ceefp-14 F +REG epsg:2509 3 OK -0x1.af93eed31453p15 0x1.0f088246bddeep19 0x1.4d2591bbap5 0x1.a80000001e3acp6 0x1.3fffffff737f6p2 0x1.8bf6p-14 F +REG epsg:2509 4 OK 0x1.019a06cd16891p20 0x1.0f083dc180ebbp19 0x1.25d4f8cd2p5 0x1.cfffffffe415ap6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:2510 0 OK 0x1.e836f4921bed2p18 0x1.2ff1de21f173ap6 0x1.d7f802c48p4 0x1.d400000001258p6 -0x1.7d34d9c5f0528p-32 0x1.b6acp-14 T +REG epsg:2510 1 OK -0x1.afb78bfe4852p15 -0x1.0ef535d257872p19 0x1.91bc68028p4 0x1.c00000001e184p6 -0x1.400000003a293p2 0x1.cbddp-14 F +REG epsg:2510 2 OK 0x1.01991bb569ed3p20 -0x1.0ef55f082746ep19 0x1.1ac70ffbp4 0x1.e7ffffffe3af6p6 -0x1.40000000314dep2 0x1.d422p-14 F +REG epsg:2510 3 OK -0x1.afb1b71260dap15 0x1.0f086a5af22d9p19 0x1.39a45dd72p5 0x1.c00000001e864p6 0x1.3fffffff76d4p2 0x1.91f3p-14 F +REG epsg:2510 4 OK 0x1.019922e652f4bp20 0x1.0f0828650cff6p19 0x1.fc4b74fcp4 0x1.e7ffffffe44c4p6 0x1.3fffffff7ea3cp2 0x1.9f2ap-14 F +REG epsg:2511 0 OK 0x1.e83370df5b9eep18 0x1.2c05535a26509p6 0x1.845e17d3cp4 0x1.ec000000014b6p6 -0x1.66d0c86245c3cp-32 0x1.bda9p-14 T +REG epsg:2511 1 OK -0x1.afd478b61056p15 -0x1.0ef56578a5cb2p19 0x1.524ec86bp4 0x1.d80000001e3cp6 -0x1.40000000352dfp2 0x1.d09dp-14 F +REG epsg:2511 2 OK 0x1.019842d380a8dp20 -0x1.0ef58b88a2155p19 0x1.68952acdp3 0x1.ffffffffe3bdcp6 -0x1.400000002a98ap2 0x1.d9bdp-14 F +REG epsg:2511 3 OK -0x1.afced66c08acp15 0x1.0f085812d8ad7p19 0x1.19eb21306p5 0x1.d80000001ec64p6 0x1.3fffffff7b2a8p2 0x1.9974p-14 F +REG epsg:2511 4 OK 0x1.0198487025e46p20 0x1.0f081942956f3p19 0x1.95ca9ed6cp4 0x1.ffffffffe4741p6 0x1.3fffffff84943p2 0x1.a889p-14 F +REG epsg:2512 0 OK 0x1.e830150e47619p18 0x1.285aee1438787p6 0x1.19b6b171p4 0x1.0200000000b16p7 -0x1.4c7e5531fd09ap-32 0x1.c55p-14 T +REG epsg:2512 1 OK -0x1.aff061f94af1p15 -0x1.0ef597610bd72p19 0x1.f6458361p3 0x1.f00000001e535p6 -0x1.400000002f21cp2 0x1.d5fcp-14 F +REG epsg:2512 2 OK 0x1.0197760dfe394p20 -0x1.0ef5b9bdbf127p19 0x1.be5704ecp1 0x1.0bfffffff1deep7 -0x1.4000000022f46p2 0x1.df87p-14 F +REG epsg:2512 3 OK -0x1.afeafb3292b8p15 0x1.0f084ba1b828fp19 0x1.dca5a952cp4 0x1.f00000001ef81p6 0x1.3fffffff8079ap2 0x1.a232p-14 F +REG epsg:2512 4 OK 0x1.019779cf44bcfp20 0x1.0f0810848da07p19 0x1.1946eaba8p4 0x1.0bfffffff245ap7 0x1.3fffffff8b67bp2 0x1.b297p-14 F +REG epsg:2513 0 OK 0x1.e82cea8a5e1f1p18 0x1.24fcf636aa084p6 0x1.3259de8fp3 0x1.0e00000000b55p7 -0x1.2e8754201250cp-32 0x1.cd51p-14 T +REG epsg:2513 1 OK -0x1.b00af9800488p15 -0x1.0ef5caff9121cp19 0x1.1a599f58p3 0x1.040000000f2eap7 -0x1.4000000028183p2 0x1.dbb5p-14 F +REG epsg:2513 2 OK 0x1.0196b7a33439bp20 -0x1.0ef5e925e660bp19 -0x1.656b8856p2 0x1.17fffffff1d77p7 -0x1.400000001a7b1p2 0x1.e51cp-14 F +REG epsg:2513 3 OK -0x1.b005d677243ap15 0x1.0f08452a76e9cp19 0x1.6eab792ccp4 0x1.040000000f8d5p7 0x1.3fffffff86b5ap2 0x1.abdbp-14 F +REG epsg:2513 4 OK 0x1.0196b947364d8p20 0x1.0f080e437bba1p19 0x1.103b2051p3 0x1.17fffffff248bp7 0x1.3fffffff930ecp2 0x1.bcf1p-14 F +REG epsg:2514 0 OK 0x1.e829fa34df4bbp18 0x1.21f4dd5610fbfp6 0x1.0a5473ap-2 0x1.1a00000000b16p7 -0x1.0d3fd0c073cb7p-32 0x1.d555p-14 T +REG epsg:2514 1 OK -0x1.b023f4b554d7p15 -0x1.0ef5ffc3702efp19 0x1.342b0a2p-1 0x1.100000000f2c2p7 -0x1.400000002028ep2 0x1.e171p-14 F +REG epsg:2514 2 OK 0x1.019609a933b33p20 -0x1.0ef6193c22d1cp19 -0x1.fb1f39208p3 0x1.23fffffff1c8cp7 -0x1.400000001147ep2 0x1.ea2cp-14 F +REG epsg:2514 3 OK -0x1.b01f1ce6d941p15 0x1.0f0844bf38cebp19 0x1.d63847928p3 0x1.100000000f961p7 0x1.3fffffff8dcfcp2 0x1.b60bp-14 F +REG epsg:2514 4 OK 0x1.019608f3f99b8p20 0x1.0f081285b3d11p19 -0x1.c1a50a9p0 0x1.23fffffff2436p7 0x1.3fffffff9b77fp2 0x1.c73ep-14 F +REG epsg:2515 0 OK 0x1.e8274c4be3c9ep18 0x1.1f4b2438f27b9p6 -0x1.47647134p3 0x1.2600000000a5bp7 -0x1.d20a4507ec7ebp-33 0x1.dcfbp-14 T +REG epsg:2515 1 OK -0x1.b03b0d88853ap15 -0x1.0ef63518ac822p19 -0x1.1c1d6a28p3 0x1.1c0000000f222p7 -0x1.40000000176cbp2 0x1.e6e5p-14 F +REG epsg:2515 2 OK 0x1.01956e07f3484p20 -0x1.0ef6497996b8dp19 -0x1.b306c4664p4 0x1.2ffffffff1b37p7 -0x1.400000000777ap2 0x1.ee6ap-14 F +REG epsg:2515 3 OK -0x1.b036879e007fp15 0x1.0f084a612c5ccp19 0x1.4da28d3dp2 0x1.1c0000000f964p7 0x1.3fffffff95b8p2 0x1.c071p-14 F +REG epsg:2515 4 OK 0x1.01956ac41b79cp20 0x1.0f081d3f4616ep19 -0x1.a32848ed8p3 0x1.2ffffffff235fp7 0x1.3fffffffa48e2p2 0x1.d11bp-14 F +REG epsg:2516 0 OK 0x1.e824e8533ffap18 0x1.1d0742fe84bb7p6 -0x1.5c8ee79fp4 0x1.320000000092cp7 -0x1.8479cddb2eb7dp-33 0x1.e3f4p-14 T +REG epsg:2516 1 OK -0x1.b05003319021p15 -0x1.0ef66a69b196ap19 -0x1.3839ea6e8p4 0x1.280000000f113p7 -0x1.400000000e007p2 0x1.ebbap-14 F +REG epsg:2516 2 OK 0x1.0194e673f69e5p20 -0x1.0ef67956f61a9p19 -0x1.3be1b32cp5 0x1.3bfffffff1981p7 -0x1.3ffffffffd289p2 0x1.f195p-14 F +REG epsg:2516 3 OK -0x1.b04bd4eee9aep15 0x1.0f085600875b8p19 -0x1.5b16420cp2 0x1.280000000f8e3p7 0x1.3fffffff9e5bbp2 0x1.ca9fp-14 F +REG epsg:2516 4 OK 0x1.0194e0734b766p20 0x1.0f082e52203ep19 -0x1.9652f084cp4 0x1.3bfffffff2213p7 0x1.3fffffffae3b9p2 0x1.da31p-14 F +REG epsg:2517 0 OK 0x1.e822d4ff6fd63p18 0x1.1b2f942b39a1ap6 -0x1.123320966p5 0x1.3e00000000796p7 -0x1.32a7c9254cc9dp-33 0x1.e9edp-14 T +REG epsg:2517 1 OK -0x1.b0629ae6d185p15 -0x1.0ef69f20f654ep19 -0x1.f30303dfp4 0x1.340000000ef9ap7 -0x1.4000000004014p2 0x1.efa4p-14 F +REG epsg:2517 2 OK 0x1.0194746986014p20 -0x1.0ef6a84e0215fp19 -0x1.a4cedccbcp5 0x1.47fffffff178p7 -0x1.3ffffffff27bp2 0x1.f369p-14 F +REG epsg:2517 3 OK -0x1.b05ec91a19e5p15 0x1.0f08677cb306p19 -0x1.11912b674p4 0x1.340000000f7e4p7 0x1.3fffffffa7a5cp2 0x1.d44p-14 F +REG epsg:2517 4 OK 0x1.01946b857f625p20 0x1.0f08458e61b72p19 -0x1.341772f8ep5 0x1.47fffffff2062p7 0x1.3fffffffb8675p2 0x1.e232p-14 F +REG epsg:2518 0 OK 0x1.e8211822c8388p18 0x1.19c942d5d992ep6 -0x1.7c83e3b38p5 0x1.4a000000005aap7 -0x1.baf3682609804p-34 0x1.eeabp-14 T +REG epsg:2518 1 OK -0x1.b072a081eabep15 -0x1.0ef6d2aaa06bbp19 -0x1.5e2f110f6p5 0x1.400000000edc9p7 -0x1.3ffffffff98e6p2 0x1.f25ep-14 F +REG epsg:2518 2 OK 0x1.019419288395p20 -0x1.0ef6d5db015d2p19 -0x1.09924aca6p6 0x1.53fffffff1546p7 -0x1.3fffffffe78edp2 0x1.f3bbp-14 F +REG epsg:2518 3 OK -0x1.b06f2ef5e16p15 0x1.0f087ea4a7575p19 -0x1.daee470d8p4 0x1.400000000f673p7 0x1.3fffffffb17f3p2 0x1.dd03p-14 F +REG epsg:2518 4 OK 0x1.01940d42b2fddp20 0x1.0f0862b2e1da9p19 -0x1.a26db6972p5 0x1.53fffffff1e61p7 0x1.3fffffffc2f78p2 0x1.e8e1p-14 F +REG epsg:2519 0 OK 0x1.e81fb69d21fc7p18 0x1.18d83c2735ef1p6 -0x1.ec0f8e3eap5 0x1.560000000038p7 -0x1.0bbcf071988b7p-34 0x1.f1f1p-14 T +REG epsg:2519 1 OK -0x1.b07fe7120c2fp15 -0x1.0ef7047622f6p19 -0x1.c90b43caep5 0x1.4c0000000ebb3p7 -0x1.3fffffffeec78p2 0x1.f3b3p-14 F +REG epsg:2519 2 OK 0x1.0193d5b0e9e4cp20 -0x1.0ef7017e31a22p19 -0x1.42d6b4223p6 0x1.5ffffffff12edp7 -0x1.3fffffffdc84p2 0x1.f267p-14 F +REG epsg:2519 3 OK -0x1.b07cd8837ba3p15 0x1.0f089b3774725p19 -0x1.58541025p5 0x1.4c0000000f4a4p7 0x1.3fffffffbbce8p2 0x1.e499p-14 F +REG epsg:2519 4 OK 0x1.0193c6b34fcbap20 0x1.0f08856de6899p19 -0x1.0a7b6629ep6 0x1.5ffffffff1c25p7 0x1.3fffffffcdcfdp2 0x1.ee0dp-14 F +REG epsg:2520 0 OK 0x1.e81eb44e2ce35p18 0x1.185f24552e34bp6 -0x1.2fcea2c8bp6 0x1.620000000012fp7 -0x1.665e69a78691ap-36 0x1.f39cp-14 T +REG epsg:2520 1 OK -0x1.b08a495a08f5p15 -0x1.0ef733f7d3e41p19 -0x1.1c7532073p6 0x1.580000000e96bp7 -0x1.3fffffffe3ccdp2 0x1.f38p-14 F +REG epsg:2520 2 OK 0x1.0193aabffd932p20 -0x1.0ef72abd2de94p19 -0x1.7d940bd7dp6 -0x1.640000000ef71p7 -0x1.3fffffffd17a7p2 0x1.ef6dp-14 F +REG epsg:2520 3 OK -0x1.b0879f7018a1p15 0x1.0f08bce4f8a41p19 -0x1.c833a3718p5 0x1.580000000f28dp7 0x1.3fffffffc679p2 0x1.eadp-14 F +REG epsg:2520 4 OK 0x1.0193989d4722cp20 0x1.0f08ad5e0946p19 -0x1.4538bb243p6 -0x1.640000000e634p7 0x1.3fffffffd8d27p2 0x1.f197p-14 F +REG epsg:2521 0 OK 0x1.e81e140a90a6dp18 0x1.185f4f3803453p6 -0x1.6af478571p6 -0x1.620000000013p7 0x1.6623c281da0e3p-36 0x1.f39fp-14 T +REG epsg:2521 1 OK -0x1.b091aa38d3ffp15 -0x1.0ef760aa73b54p19 -0x1.564956839p6 0x1.640000000e70ep7 -0x1.3fffffffd8be5p2 0x1.f1a2p-14 F +REG epsg:2521 2 OK 0x1.019398ce3a11ap20 -0x1.0ef7512445d51p19 -0x1.b92591dbbp6 -0x1.580000000f1bcp7 -0x1.3fffffffc6915p2 0x1.eac3p-14 F +REG epsg:2521 3 OK -0x1.b08f65806477p15 0x1.0f08e34ec106p19 -0x1.1dee0bab3p6 0x1.640000000f044p7 0x1.3fffffffd1621p2 0x1.ef74p-14 F +REG epsg:2521 4 OK 0x1.01938381e68fcp20 0x1.0f08da1348425p19 -0x1.80ca1a322p6 -0x1.580000000e894p7 0x1.3fffffffe3e09p2 0x1.f376p-14 F +REG epsg:2522 0 OK 0x1.e81dd793fab74p18 0x1.18d8bc8edd145p6 -0x1.a6d3629c1p6 -0x1.5600000000381p7 0x1.0bae46b1a910ap-34 0x1.f1fp-14 T +REG epsg:2522 1 OK -0x1.b095f4fb4041p15 -0x1.0ef78a10a33a6p19 -0x1.915fdd8cfp6 -0x1.5ffffffff1b4dp7 -0x1.3fffffffcdbc1p2 0x1.ee12p-14 F +REG epsg:2522 2 OK 0x1.0193a00dff436p20 -0x1.0ef77447c2295p19 -0x1.f4e432b3cp6 -0x1.4c0000000f3d7p7 -0x1.3fffffffbbe62p2 0x1.e491p-14 F +REG epsg:2522 3 OK -0x1.b09414e55ed3p15 0x1.0f090e091248dp19 -0x1.590483dfap6 -0x1.5ffffffff121ap7 0x1.3fffffffdc6b9p2 0x1.f27p-14 F +REG epsg:2522 4 OK 0x1.0193879c6cb3fp20 0x1.0f090b10406a7p19 -0x1.bc887047p6 -0x1.4c0000000eadep7 0x1.3fffffffeedafp2 0x1.f3b1p-14 F +REG epsg:2523 0 OK 0x1.c9c54c6ad753ap22 0x1.6c051c7d5a47ap6 -0x1.3bbf9776p6 0x1.4ffffffffc356p4 -0x1.32a7c92ec86fep-33 0x1.e9ebp-14 T +REG epsg:2523 1 OK 0x1.a7e24a689505ep22 -0x1.0ef495f651c79p19 -0x1.89b2d54f3p6 0x1.00000000744c9p4 -0x1.3ffffffff278bp2 0x1.f368p-14 F +REG epsg:2523 2 OK 0x1.eba84bc017601p22 -0x1.0ef49f2527862p19 -0x1.2822ad974p6 0x1.9fffffff883cbp4 -0x1.400000000403bp2 0x1.ef9fp-14 F +REG epsg:2523 3 OK 0x1.a7e2520db9c51p22 0x1.0f0b6baa84e9bp19 -0x1.513e41dp6 0x1.000000006fda5p4 0x1.3fffffffb8651p2 0x1.e231p-14 F +REG epsg:2523 4 OK 0x1.eba849845b36p22 0x1.0f0b49bdaf2e8p19 -0x1.df5ded54p5 0x1.9fffffff84187p4 0x1.3fffffffa7a74p2 0x1.d441p-14 F +REG epsg:25231 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:25231 1 OK -0x1.ad89324e3d93p15 -0x1.0edd0485be135p19 0x0.0p0 -0x1.0000000000001p1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:25231 2 OK 0x1.0190499271ed2p20 -0x1.0edd0485be135p19 0x0.0p0 0x1.0p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:25231 3 OK -0x1.ad89324e3d93p15 0x1.0edd0485be135p19 0x0.0p0 -0x1.0000000000001p1 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:25231 4 OK 0x1.0190499271ed2p20 0x1.0edd0485be135p19 0x0.0p0 0x1.0p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2524 0 OK 0x1.036722dc922d7p23 0x1.6b26f6d456e34p6 -0x1.1e7fda219p6 0x1.7ffffffffbc9ep4 -0x1.5c0ae595aaa34p-33 0x1.e713p-14 T +REG epsg:2524 1 OK 0x1.e4eb46122fd61p22 -0x1.0ef486e684ec9p19 -0x1.6c1712883p6 0x1.3000000073c75p4 -0x1.3ffffffff7d98p2 0x1.f2a8p-14 F +REG epsg:2524 2 OK 0x1.1458a12abc658p23 -0x1.0ef492fe0377ap19 -0x1.0bb070ab2p6 0x1.cfffffff87d83p4 -0x1.400000000913ap2 0x1.edcdp-14 F +REG epsg:2524 3 OK 0x1.e4eb4e14d5c7p22 0x1.0f0b51a10a352p19 -0x1.33a2b75ffp6 0x1.300000006f67bp4 0x1.3fffffffb3412p2 0x1.de56p-14 F +REG epsg:2524 4 OK 0x1.1458a03ba5dcfp23 0x1.0f0b2ccb8aec2p19 -0x1.a67a1b69cp5 0x1.cfffffff83d04p4 0x1.3fffffffa2eecp2 0x1.cf85p-14 F +REG epsg:2525 0 OK 0x1.21eb9ec0f4e47p23 0x1.6a2d118fde25ep6 -0x1.01a40f9d1p6 0x1.affffffffb6aap4 -0x1.8479cdd1b312p-33 0x1.e3f2p-14 T +REG epsg:2525 1 OK 0x1.10fa20175366ep23 -0x1.0ef4790384b3cp19 -0x1.4ebcaa025p6 0x1.60000000734a4p4 -0x1.3ffffffffd26ap2 0x1.f191p-14 F +REG epsg:2525 2 OK 0x1.32dd1bb788ba2p23 -0x1.0ef487f2810b7p19 -0x1.df866456ap5 0x1.ffffffff877fbp4 -0x1.400000000e028p2 0x1.ebb7p-14 F +REG epsg:2525 3 OK 0x1.10fa244652c4cp23 0x1.0f0b36f738154p19 -0x1.16488fb2cp6 0x1.600000006f005p4 0x1.3fffffffae39dp2 0x1.da2ap-14 F +REG epsg:2525 4 OK 0x1.32dd1af6263fap23 0x1.0f0b0f4a38ecfp19 -0x1.6ea055ffp5 0x1.ffffffff8396fp4 0x1.3fffffff9e5dp2 0x1.caa1p-14 F +REG epsg:2526 0 OK 0x1.407019e575db4p23 0x1.69181c0de2017p6 -0x1.ca80ef55p5 0x1.dffffffffb178p4 -0x1.abd822e38f938p-33 0x1.e09p-14 T +REG epsg:2526 1 OK 0x1.2f7e9c610e07ap23 -0x1.0ef46c570f444p19 -0x1.31b8345e9p6 0x1.9000000072d6ep4 -0x1.40000000025c1p2 0x1.f024p-14 F +REG epsg:2526 2 OK 0x1.5161958a43cd5p23 -0x1.0ef47e0a5ff87p19 -0x1.a8dd14e12p5 0x1.17ffffffc39ap5 -0x1.4000000012ccbp2 0x1.e968p-14 F +REG epsg:2526 3 OK 0x1.2f7ea0bc858bap23 0x1.0f0b1bbfc41c5p19 -0x1.f288c677ap5 0x1.900000006ea5dp4 0x1.3fffffffa951cp2 0x1.d5bep-14 F +REG epsg:2526 4 OK 0x1.516194f561d12p23 0x1.0f0af14e6d357p19 -0x1.37f7cd458p5 0x1.17ffffffc1b6ep5 0x1.3fffffff99f49p2 0x1.c593p-14 F +REG epsg:2527 0 OK 0x1.5ef4944d7dbf7p23 0x1.67e8d8a93528dp6 -0x1.92d1fb5f8p5 0x1.07fffffffd694p5 -0x1.d20a450caa51bp-33 0x1.dcfap-14 T +REG epsg:2527 1 OK 0x1.4e0317e8e2bep23 -0x1.0ef460ea08dccp19 -0x1.151e0dea6p6 0x1.c0000000726ecp4 -0x1.4000000007756p2 0x1.ee6ep-14 F +REG epsg:2527 2 OK 0x1.6fe60ea7434a6p23 -0x1.0ef4754c937f8p19 -0x1.738b4d7ecp5 0x1.2fffffffc37b4p5 -0x1.40000000176e8p2 0x1.e6e5p-14 F +REG epsg:2527 3 OK 0x1.4e031c6f7ef53p23 0x1.0f0b000dc7353p19 -0x1.b9551c2b2p5 0x1.c00000006e58dp4 0x1.3fffffffa48cap2 0x1.d118p-14 F +REG epsg:2527 4 OK 0x1.6fe60e3d8f034p23 0x1.0f0ad2ed31b09p19 -0x1.02a6db39cp5 0x1.2fffffffc1aa7p5 0x1.3fffffff95b93p2 0x1.c06ep-14 F +REG epsg:2528 0 OK 0x1.7d790dfcf97aap23 0x1.66a01c311dc91p6 -0x1.5c62557dp5 0x1.1ffffffffd4dfp5 -0x1.f6f5671710bedp-33 0x1.d938p-14 T +REG epsg:2528 1 OK 0x1.6c8792b1f485cp23 -0x1.0ef456c47597ep19 -0x1.f20490af2p5 0x1.f00000007211fp4 -0x1.400000000c6f7p2 0x1.ec6dp-14 F +REG epsg:2528 2 OK 0x1.8e6a87135c5d9p23 -0x1.0ef46dbf3d8c5p19 -0x1.3fb677a52p5 0x1.47ffffffc3636p5 -0x1.400000001be43p2 0x1.e43ap-14 F +REG epsg:2528 3 OK 0x1.6c87976243b81p23 0x1.0f0ae3f4b03c1p19 -0x1.811e43712p5 0x1.f00000006e1a6p4 0x1.3fffffff9fed5p2 0x1.cc3ap-14 F +REG epsg:2528 4 OK 0x1.8e6a86d364b6ap23 0x1.0f0ab43bd76b9p19 -0x1.9da5d1774p4 0x1.47ffffffc1a64p5 0x1.3fffffff91acp2 0x1.bb3ep-14 F +REG epsg:2529 0 OK 0x1.9bfd86f857711p23 0x1.653ecd53f6ce3p6 -0x1.27582fbd8p5 0x1.37fffffffd3a7p5 -0x1.0d3fd0be14e2p-32 0x1.d553p-14 T +REG epsg:2529 1 OK 0x1.8b0c0cbfec322p23 -0x1.0ef44ded73cbfp19 -0x1.baf1394c2p5 0x1.1000000038e13p5 -0x1.4000000011463p2 0x1.ea29p-14 F +REG epsg:2529 2 OK 0x1.aceefed3e04fbp23 -0x1.0ef46767aa68bp19 -0x1.0d82f177cp5 0x1.5fffffffc3531p5 -0x1.40000000202a8p2 0x1.e172p-14 F +REG epsg:2529 3 OK 0x1.8b0c11985f65ap23 0x1.0f0ac788365b7p19 -0x1.4a0badcb4p5 0x1.1000000036f61p5 0x1.3fffffff9b768p2 0x1.c73ep-14 F +REG epsg:2529 4 OK 0x1.aceefebc16eb6p23 0x1.0f0a954fe7a25p19 -0x1.3940a69fp4 0x1.5fffffffc1aacp5 0x1.3fffffff8dd05p2 0x1.b60dp-14 F +REG epsg:2530 0 OK 0x1.ba81ff4484654p23 0x1.63c5e3fd48a72p6 -0x1.e7b182a2p4 0x1.4ffffffffd2eap5 -0x1.1e48021b044d6p-32 0x1.d157p-14 T +REG epsg:2530 1 OK 0x1.a9908616f5dbbp23 -0x1.0ef4466b370dap19 -0x1.8528ba9bap5 0x1.2800000038bffp5 -0x1.4000000015f57p2 0x1.e7b7p-14 F +REG epsg:2530 2 OK 0x1.cb7375ee98ca8p23 -0x1.0ef4624a4d05p19 -0x1.ba27e8898p4 0x1.77ffffffc349fp5 -0x1.40000000243d3p2 0x1.de96p-14 F +REG epsg:2530 3 OK 0x1.a9908b15e1ec8p23 0x1.0f0aaadc4b37cp19 -0x1.1443ffa34p5 0x1.2800000036e6bp5 0x1.3fffffff972b4p2 0x1.c21cp-14 F +REG epsg:2530 4 OK 0x1.cb7375fd531a4p23 0x1.0f0a763f14a25p19 -0x1.b0c94e6ap3 0x1.77ffffffc1b7dp5 0x1.3fffffff8a284p2 0x1.b0e5p-14 F +REG epsg:2531 0 OK 0x1.d90676e6e8034p23 0x1.623668a7cb3e6p6 -0x1.841058d8p4 0x1.67fffffffd2a7p5 -0x1.2e875424d023dp-32 0x1.cd5p-14 T +REG epsg:2531 1 OK 0x1.c814febbbdf31p23 -0x1.0ef4404303d74p19 -0x1.50d0d162cp5 0x1.4000000038a5dp5 -0x1.400000001a79ep2 0x1.e519p-14 F +REG epsg:2531 2 OK 0x1.e9f7ec69c3c93p23 -0x1.0ef45e6abbdafp19 -0x1.5d16f79a8p4 0x1.8fffffffc3485p5 -0x1.400000002819bp2 0x1.dbb2p-14 F +REG epsg:2531 3 OK 0x1.c81503df5cbf4p23 0x1.0f0a8e050cf0bp19 -0x1.bfd9ea564p4 0x1.4000000036dffp5 0x1.3fffffff930dep2 0x1.bcf1p-14 F +REG epsg:2531 4 OK 0x1.e9f7ec9d3c386p23 0x1.0f0a571f2a91cp19 -0x1.ed57255ep2 0x1.8fffffffc1cd5p5 0x1.3fffffff86b5ep2 0x1.abd9p-14 F +REG epsg:2532 0 OK 0x1.f78aede561158p23 0x1.609173a3cb546p6 -0x1.2412c9da8p4 0x1.7ffffffffd2e8p5 -0x1.3df260615c2f8p-32 0x1.c947p-14 T +REG epsg:2532 1 OK 0x1.e69976b36df8cp23 -0x1.0ef43b792bd75p19 -0x1.1e0e37c08p5 0x1.580000003893p5 -0x1.400000001ecfbp2 0x1.e256p-14 F +REG epsg:2532 2 OK 0x1.043e3126079b4p24 -0x1.0ef45bcbae68cp19 -0x1.04145cdf8p4 0x1.a7ffffffc34e3p5 -0x1.400000002bbcap2 0x1.d8d1p-14 F +REG epsg:2532 3 OK 0x1.e6997bf9df9edp23 0x1.0f0a7116b8037p19 -0x1.5a568fc98p4 0x1.5800000036e1bp5 0x1.3fffffff8f20fp2 0x1.b7cp-14 F +REG epsg:2532 4 OK 0x1.043e31513334ap24 0x1.0f0a38060024dp19 -0x1.12aac276p1 0x1.a7ffffffc1eb5p5 0x1.3fffffff837b1p2 0x1.a6fp-14 F +REG epsg:2533 0 OK 0x1.0b07b22320b2fp24 0x1.5ed82c52758afp6 -0x1.8ff85f6p3 0x1.97fffffffd3a9p5 -0x1.4c7e552f9e203p-32 0x1.c54fp-14 T +REG epsg:2533 1 OK 0x1.028ef701d46eep24 -0x1.0ef438110ae8fp19 -0x1.da0916cf4p4 0x1.700000003887bp5 -0x1.4000000022f35p2 0x1.df84p-14 F +REG epsg:2533 2 OK 0x1.13806bce4a1e7p24 -0x1.0ef45a6efb4abp19 -0x1.5ebd18f88p3 0x1.bfffffffc35b2p5 -0x1.400000002f23p2 0x1.d5fcp-14 F +REG epsg:2533 3 OK 0x1.028ef9b57a86cp24 0x1.0f0a54259919p19 -0x1.f08a53798p3 0x1.7000000036ecp5 0x1.3fffffff8b66ep2 0x1.b297p-14 F +REG epsg:2533 4 OK 0x1.13806c09e9302p24 0x1.0f0a1909674b6p19 0x1.92f1ca28p1 0x1.bfffffffc2117p5 0x1.3fffffff8079ap2 0x1.a233p-14 F +REG epsg:2534 0 OK 0x1.1a49ed0824a74p24 0x1.5d0bc8569131ap6 -0x1.c0349daep2 0x1.affffffffd4e3p5 -0x1.5a20fda461e8ap-32 0x1.c168p-14 T +REG epsg:2534 1 OK 0x1.11d1325943875p24 -0x1.0ef4360d04badp19 -0x1.7bac694b8p4 0x1.8800000038838p5 -0x1.4000000026e1bp2 0x1.dca4p-14 F +REG epsg:2534 2 OK 0x1.22c2a6316925fp24 -0x1.0ef45a5596f13p19 -0x1.7cc3d8bbp2 0x1.d7ffffffc36f5p5 -0x1.40000000324a1p2 0x1.d33ep-14 F +REG epsg:2534 3 OK 0x1.11d1351c4f358p24 0x1.0f0a3745fec7fp19 -0x1.33d50ed8p3 0x1.8800000036fe8p5 0x1.3fffffff87e1dp2 0x1.ad7dp-14 F +REG epsg:2534 4 OK 0x1.22c2a67c743b8p24 0x1.0f09fa3f1de1cp19 0x1.0512fa738p3 0x1.d7ffffffc23f7p5 0x1.3fffffff7db3cp2 0x1.9dadp-14 F +REG epsg:2535 0 OK 0x1.298c27a5517e9p24 0x1.5b2d8abb3c4c4p6 -0x1.c8363d2p0 0x1.c7fffffffd698p5 -0x1.66d0c8670397p-32 0x1.bda5p-14 T +REG epsg:2535 1 OK 0x1.21136d6349168p24 -0x1.0ef4356e83206p19 -0x1.21489c774p4 0x1.a00000003886ep5 -0x1.400000002a973p2 0x1.d9bfp-14 F +REG epsg:2535 2 OK 0x1.3204e05354ea1p24 -0x1.0ef45b7f92f61p19 -0x1.3c3db9a8p0 0x1.efffffffc389cp5 -0x1.40000000352f2p2 0x1.d09cp-14 F +REG epsg:2535 3 OK 0x1.21137034a7df1p24 0x1.0f0a1a8c2b54cp19 -0x1.fc46e74ep1 0x1.a0000000371ap5 0x1.3fffffff84938p2 0x1.a88ap-14 F +REG epsg:2535 4 OK 0x1.3204e0acb9bd6p24 0x1.0f09dbbcbe70fp19 0x1.9be8671dp3 0x1.efffffffc275p5 0x1.3fffffff7b2abp2 0x1.9975p-14 F +REG epsg:2536 0 OK 0x1.38ce61fe6eb5ep24 0x1.593ec3114145bp6 0x1.9333ef56p1 0x1.dffffffffd8bcp5 -0x1.7284ce7fefb7fp-32 0x1.ba0fp-14 T +REG epsg:2536 1 OK 0x1.3055a823603c4p24 -0x1.0ef43635f5179p19 -0x1.963a389dp3 0x1.b800000038915p5 -0x1.400000002e118p2 0x1.d6e2p-14 F +REG epsg:2536 2 OK 0x1.41471a382b61p24 -0x1.0ef45dec1e10ep19 0x1.959eb97ep1 0x1.03ffffffe1d54p6 -0x1.4000000037cfcp2 0x1.ce23p-14 F +REG epsg:2536 3 OK 0x1.3055ab01f5966p24 0x1.0f09fe0c467ccp19 0x1.6a06b4c8p0 0x1.b8000000373d3p5 0x1.3fffffff817e6p2 0x1.a3b6p-14 F +REG epsg:2536 4 OK 0x1.41471a9ecd9a5p24 0x1.0f09bd97b1053p19 0x1.146971ddcp4 0x1.03ffffffe158bp6 0x1.3fffffff78df7p2 0x1.9588p-14 F +REG epsg:2537 0 OK 0x1.48109c177389cp24 0x1.5740cc83a554p6 0x1.f1e47d2ap2 0x1.f7fffffffdb53p5 -0x1.7d34d9bed395fp-32 0x1.b6adp-14 T +REG epsg:2537 1 OK 0x1.3f97e29d37f65p24 -0x1.0ef43862ce78cp19 -0x1.e5997b08p2 0x1.d000000038a34p5 -0x1.40000000314d3p2 0x1.d41ep-14 F +REG epsg:2537 2 OK 0x1.508953e4355abp24 -0x1.0ef4619984aa1p19 0x1.d012c341p2 0x1.0fffffffe1e88p6 -0x1.400000003a29ep2 0x1.cbep-14 F +REG epsg:2537 3 OK 0x1.3f97e587de14p24 0x1.0f09e1da4f50fp19 0x1.a153735bp2 0x1.d00000003768dp5 0x1.3fffffff7ea3bp2 0x1.9f23p-14 F +REG epsg:2537 4 OK 0x1.50895456ef585p24 0x1.0f099fe51c2b1p19 0x1.55b7c8814p4 0x1.0fffffffe17a3p6 0x1.3fffffff76d3cp2 0x1.91f5p-14 F +REG epsg:2538 0 OK 0x1.5752d5f4842d8p24 0x1.55350ce414bcap6 0x1.83010eb2p3 0x1.07fffffffef28p6 -0x1.86d96a5749f17p-32 0x1.b38ap-14 T +REG epsg:2538 1 OK 0x1.4eda1cd4b08a7p24 -0x1.0ef43bf3885b9p19 -0x1.62edca96p1 0x1.e800000038bbbp5 -0x1.400000003447ep2 0x1.d172p-14 F +REG epsg:2538 2 OK 0x1.5fcb8d5be37f9p24 -0x1.0ef46685320d8p19 0x1.6001ba8f8p3 0x1.1bffffffe1fe7p6 -0x1.400000003c3bcp2 0x1.c9d2p-14 F +REG epsg:2538 3 OK 0x1.4eda1fca3926bp24 0x1.0f09c60a0e301p19 0x1.6ab6479dp3 0x1.e8000000379bep5 0x1.3fffffff7c054p2 0x1.9ad1p-14 F +REG epsg:2538 4 OK 0x1.5fcb8dd98723ep24 0x1.0f0982b9d6193p19 0x1.91b1653dcp4 0x1.1bffffffe19eap6 0x1.3fffffff7508ap2 0x1.8ec2p-14 F +REG epsg:2539 0 OK 0x1.66950f99eee3dp24 0x1.531cf3afd7cbdp6 0x1.014c4722p4 0x1.13ffffffff0d5p6 -0x1.8f6bbc1796825p-32 0x1.b0bp-14 T +REG epsg:2539 1 OK 0x1.5e1c56cdd8ce7p24 -0x1.0ef440e5a2293p19 0x1.bc6c7294p0 0x1.000000001c6d3p6 -0x1.4000000036febp2 0x1.ceecp-14 F +REG epsg:2539 2 OK 0x1.6f0dc6a3cb331p24 -0x1.0ef46cabb239cp19 0x1.ccfc8c3d8p3 0x1.27ffffffe216cp6 -0x1.400000003e031p2 0x1.c801p-14 F +REG epsg:2539 3 OK 0x1.5e1c59cd0e015p24 0x1.0f09aaaf06e55p19 0x1.fafa6a1p3 0x1.000000001beb2p6 0x1.3fffffff79a49p2 0x1.96cap-14 F +REG epsg:2539 4 OK 0x1.6f0dc72b22b87p24 0x1.0f09662a5611p19 0x1.c82c33684p4 0x1.27ffffffe1c5bp6 0x1.3fffffff737fp2 0x1.8bf9p-14 F +REG epsg:25391 0 OK 0x1.e821a2e258b83p18 0x1.97fbc9409e2a3p5 -0x1.e95e95014p5 0x1.d4p6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:25391 1 OK -0x1.b037d3d7996ap15 -0x1.0ef5f25dc5d75p19 -0x1.946da530cp5 0x1.c00000001dddp6 -0x1.3fffffffea71dp2 0x1.0p-29 F +REG epsg:25391 2 OK 0x1.01928fef1836bp20 -0x1.0ef5f25cc8fedp19 -0x1.34ce988c7p6 0x1.e7ffffffe23c1p6 -0x1.3fffffffea868p2 -0x1.8p-28 F +REG epsg:25391 3 OK -0x1.b036457f634ap15 0x1.0f02b2203a3fep19 -0x1.4d4dde54ap5 0x1.c00000001ddcbp6 0x1.3fffffffea70dp2 0x1.4p-28 F +REG epsg:25391 4 OK 0x1.0192837e17276p20 0x1.0f02b21f3d502p19 -0x1.113eab51p6 0x1.e7ffffffe23c8p6 0x1.3fffffffea85cp2 -0x1.cp-28 F +REG epsg:25392 0 OK 0x1.e821967bff368p18 0x1.97fbdfe0cbab4p5 -0x1.0a20abf1fp6 0x1.dc00000000002p6 -0x1.c72f1eacb7b06p-63 -0x1.0p-30 T +REG epsg:25392 1 OK -0x1.b03925549dfep15 -0x1.0ef6016e2cce2p19 -0x1.beda8f474p5 0x1.c80000001ddd1p6 -0x1.3fffffffea71bp2 0x1.0p-28 F +REG epsg:25392 2 OK 0x1.01929447cb0bbp20 -0x1.0ef6016d2faacp19 -0x1.4a27816a2p6 0x1.efffffffe23c2p6 -0x1.3fffffffea868p2 -0x1.0p-28 F +REG epsg:25392 3 OK -0x1.b03796fc1cdcp15 0x1.0f02c13154cadp19 -0x1.77bac484ap5 0x1.c80000001ddccp6 0x1.3fffffffea70cp2 0x1.4p-28 F +REG epsg:25392 4 OK 0x1.019287d6c8358p20 0x1.0f02c13057903p19 -0x1.269792382p6 0x1.efffffffe23c7p6 0x1.3fffffffea858p2 -0x1.4p-28 F +REG epsg:25393 0 OK 0x1.e8219610aed3p18 0x1.97fbf684c189bp5 -0x1.1f95a1ee4p6 0x1.e400000000002p6 -0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:25393 1 OK -0x1.b03a172098d8p15 -0x1.0ef610811858bp19 -0x1.e96fde30ep5 0x1.d00000001dddp6 -0x1.3fffffffea71cp2 0x1.0p-29 F +REG epsg:25393 2 OK 0x1.01929ba084631p20 -0x1.0ef610801b396p19 -0x1.5f7352febp6 0x1.f7ffffffe23c2p6 -0x1.3fffffffea867p2 -0x1.8p-28 F +REG epsg:25393 3 OK -0x1.b03888c7d56ap15 0x1.0f02d044f407ap19 -0x1.a2500f836p5 0x1.d00000001ddcdp6 0x1.3fffffffea70cp2 0x1.4p-28 F +REG epsg:25393 4 OK 0x1.01928f2f7f7f8p20 0x1.0f02d043f6d12p19 -0x1.3be361d73p6 0x1.f7ffffffe23c7p6 0x1.3fffffffea859p2 -0x1.0p-28 F +REG epsg:25394 0 OK 0x1.e821a1a08afdbp18 0x1.97fc0d257008p5 -0x1.35077b391p6 0x1.ebfffffffffffp6 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:25394 1 OK -0x1.b03aa8f00fdap15 -0x1.0ef61f91d4e18p19 -0x1.0a1024eecp6 0x1.d80000001ddd2p6 -0x1.3fffffffea71ap2 0x1.4p-28 F +REG epsg:25394 2 OK 0x1.0192a5f6fa212p20 -0x1.0ef61f90d8155p19 -0x1.74ab68e03p6 0x1.ffffffffe23cp6 -0x1.3fffffffea867p2 -0x1.4p-28 F +REG epsg:25394 3 OK -0x1.b0391a9712edp15 0x1.0f02df566428ap19 -0x1.cd0077432p5 0x1.d80000001ddcep6 0x1.3fffffffea70cp2 0x1.4p-28 F +REG epsg:25394 4 OK 0x1.01929985f2ea9p20 0x1.0f02df5567453p19 -0x1.511b75c5p6 0x1.ffffffffe23c5p6 0x1.3fffffffea85ap2 -0x1.8p-29 F +REG epsg:25395 0 OK 0x1.e821b927fa8ecp18 0x1.97fc23bbc86c5p5 -0x1.4a6f878dcp6 0x1.f400000000001p6 0x1.2f74bf1dcfcbp-64 -0x1.8p-29 T +REG epsg:25395 1 OK -0x1.b03ada957901p15 -0x1.0ef62e9baf7ffp19 -0x1.1f6f40e3bp6 0x1.e00000001dddp6 -0x1.3fffffffea71bp2 0x1.0p-28 F +REG epsg:25395 2 OK 0x1.0192b347f357bp20 -0x1.0ef62e9ab355bp19 -0x1.89c924cb1p6 0x1.03fffffff11ep7 -0x1.3fffffffea865p2 -0x1.cp-28 F +REG epsg:25395 3 OK -0x1.b0394c3c4b7p15 0x1.0f02ee60f20d3p19 -0x1.f7beab3eep5 0x1.e00000001ddcdp6 0x1.3fffffffea70bp2 0x1.0p-28 F +REG epsg:25395 4 OK 0x1.0192a6d6e9892p20 0x1.0f02ee5ff5cbbp19 -0x1.66392fbedp6 0x1.03fffffff11e2p7 0x1.3fffffffea856p2 -0x1.cp-28 F +REG epsg:2540 0 OK 0x1.75d7490c28f9p24 0x1.50f9f90e0093dp6 0x1.3baf9bab8p4 0x1.1fffffffff2adp6 -0x1.96e5cb4ec6756p-32 0x1.ae27p-14 T +REG epsg:2540 1 OK 0x1.6d5e908ceb4f3p24 -0x1.0ef44735a35dep19 0x1.7b5211cap2 0x1.0c0000001c7fap6 -0x1.40000000396fap2 0x1.cc97p-14 F +REG epsg:2540 2 OK 0x1.7e4fffc0a35c4p24 -0x1.0ef47408b44dap19 0x1.1756afee8p4 0x1.33ffffffe2311p6 -0x1.400000003f7efp2 0x1.c67bp-14 F +REG epsg:2540 3 OK 0x1.6d5e939490671p24 0x1.0f098fdc6af84p19 0x1.408873f9p4 0x1.0c0000001c0bbp6 0x1.3fffffff77829p2 0x1.9318p-14 F +REG epsg:2540 4 OK 0x1.7e500050722e8p24 0x1.0f094a4aa605p19 0x1.f901f96b4p4 0x1.33ffffffe1efp6 0x1.3fffffff7237dp2 0x1.899ep-14 F +REG epsg:2541 0 OK 0x1.8519824fcba2bp24 0x1.4ecd9cc7863f7p6 0x1.70818d5c8p4 0x1.2bffffffff4abp6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:2541 1 OK 0x1.7ca0ca164b58ep24 -0x1.0ef44edf1df97p19 0x1.3938e4c3p3 0x1.180000001c94ap6 -0x1.400000003b98fp2 0x1.ca76p-14 F +REG epsg:2541 2 OK 0x1.8d9238b741175p24 -0x1.0ef47c970d8eep19 0x1.4267d52c8p4 0x1.3fffffffe24cfp6 -0x1.4000000040ad6p2 0x1.c53fp-14 F +REG epsg:2541 3 OK 0x1.7ca0cd251db8ep24 0x1.0f0975a50c35cp19 0x1.7e4dd6398p4 0x1.180000001c2eep6 0x1.3fffffff75a12p2 0x1.8fc1p-14 F +REG epsg:2541 4 OK 0x1.8d92394e44b1bp24 0x1.0f092f2e54891p19 0x1.120839ccp5 0x1.3fffffffe219fp6 0x1.3fffffff71339p2 0x1.87bdp-14 F +REG epsg:2542 0 OK 0x1.945bbb6990c59p24 0x1.4c99653a07032p6 0x1.9f9d0cbbp4 0x1.37ffffffff6c9p6 -0x1.a27cee48e1d52p-32 0x1.aa21p-14 T +REG epsg:2542 1 OK 0x1.8be3036e81e38p24 -0x1.0ef457dcb19ap19 0x1.a9e66fd28p3 0x1.240000001cac3p6 -0x1.400000003d785p2 0x1.c893p-14 F +REG epsg:2542 2 OK 0x1.9cd4718c94519p24 -0x1.0ef48650bd0b5p19 0x1.67937e39cp4 0x1.4bffffffe26a4p6 -0x1.40000000418dep2 0x1.c454p-14 F +REG epsg:2542 3 OK 0x1.8be3068339e5dp24 0x1.0f095c1b4f7c2p19 0x1.b6a204868p4 0x1.240000001c554p6 0x1.3fffffff74009p2 0x1.8cd7p-14 F +REG epsg:2542 4 OK 0x1.9cd4722985213p24 0x1.0f0914e8671b1p19 0x1.249cb617ep5 0x1.4bffffffe2468p6 0x1.3fffffff7072dp2 0x1.8652p-14 F +REG epsg:2543 0 OK 0x1.a39df45e4fa4cp24 0x1.4a5ede45ed732p6 0x1.c8e10c6a8p4 0x1.43ffffffff8ffp6 -0x1.a691e019f05bap-32 0x1.a8aep-14 T +REG epsg:2543 1 OK 0x1.9b253c9a3a63bp24 -0x1.0ef462280f43bp19 0x1.07b14d7d8p4 0x1.300000001cc5ep6 -0x1.400000003f0cap2 0x1.c6f4p-14 F +REG epsg:2543 2 OK 0x1.ac16aa45a452bp24 -0x1.0ef4912eefce8p19 0x1.86bf9696p4 0x1.57ffffffe2885p6 -0x1.40000000421ffp2 0x1.c3b8p-14 F +REG epsg:2543 3 OK 0x1.9b253fb38c3f5p24 0x1.0f0943511fd52p19 0x1.e95d79248p4 0x1.300000001c7ddp6 0x1.3fffffff72a25p2 0x1.8a56p-14 F +REG epsg:2543 4 OK 0x1.ac16aae7369c4p24 0x1.0f08fb8b4ccbbp19 0x1.34316849ap5 0x1.57ffffffe274p6 0x1.3fffffff6ff63p2 0x1.8564p-14 F +REG epsg:2544 0 OK 0x1.b2e02d32f97c7p24 0x1.481f9838b940fp6 0x1.ec30985bcp4 0x1.4fffffffffb49p6 -0x1.a97e511f93032p-32 0x1.a7a3p-14 T +REG epsg:2544 1 OK 0x1.aa67759e3f847p24 -0x1.0ef46db9fdcbep19 0x1.34b318d2p4 0x1.3c0000001ce13p6 -0x1.400000004053fp2 0x1.c59dp-14 F +REG epsg:2544 2 OK 0x1.bb58e2e78c35ep24 -0x1.0ef49d2a05abdp19 0x1.9fd63f28cp4 0x1.63ffffffe2a6fp6 -0x1.400000004262bp2 0x1.c371p-14 F +REG epsg:2544 3 OK 0x1.aa6778badc361p24 0x1.0f092b57e1e2fp19 0x1.0b2e4dcf8p5 0x1.3c0000001ca84p6 0x1.3fffffff7186cp2 0x1.8849p-14 F +REG epsg:2544 4 OK 0x1.bb58e38c70fe7p24 0x1.0f08e328d14e8p19 0x1.40bb61c88p5 0x1.63ffffffe2a23p6 0x1.3fffffff6fbd9p2 0x1.84fap-14 F +REG epsg:2545 0 OK 0x1.c22265ec960a5p24 0x1.45dd26b42e0c5p6 0x1.04b9750fp5 0x1.5bffffffffda2p6 -0x1.ab403431476cdp-32 0x1.a702p-14 T +REG epsg:2545 1 OK 0x1.b9a9ae7f77cabp24 -0x1.0ef47a8a5eeccp19 0x1.5bd905cf4p4 0x1.480000001cfe3p6 -0x1.40000000414dcp2 0x1.c495p-14 F +REG epsg:2545 2 OK 0x1.ca9b1b777754cp24 -0x1.0ef4aa399698ap19 0x1.b2c5dd98cp4 0x1.6fffffffe2c5fp6 -0x1.400000004255fp2 0x1.c37cp-14 F +REG epsg:2545 3 OK 0x1.b9a9b19e0dffap24 0x1.0f09144067adbp19 0x1.1ebfecdecp5 0x1.480000001cd46p6 0x1.3fffffff70aeap2 0x1.86bep-14 F +REG epsg:2545 4 OK 0x1.ca9b1c1e5d4cbp24 0x1.0f08cbd210809p19 0x1.4a31d65b4p5 0x1.6fffffffe2d09p6 0x1.3fffffff6fc99p2 0x1.8511p-14 F +REG epsg:2546 0 OK 0x1.d1649e904005fp24 0x1.43991f932d27ap6 0x1.1049bd1fp5 0x1.68p6 -0x1.abd64da0ea87dp-32 0x1.a6cfp-14 T +REG epsg:2546 1 OK 0x1.c8ebe742e2249p24 -0x1.0ef4889034f5ap19 0x1.7d079cbd4p4 0x1.540000001d1bfp6 -0x1.4000000041f92p2 0x1.c3e1p-14 F +REG epsg:2546 2 OK 0x1.d9dd53fa9da6ep24 -0x1.0ef4b85478914p19 0x1.bf8128a9cp4 0x1.7bffffffe2e49p6 -0x1.4000000041f9bp2 0x1.c3e1p-14 F +REG epsg:2546 3 OK 0x1.c8ebea621f27bp24 0x1.0f08fe1ae4d6bp19 0x1.2f55ded44p5 0x1.540000001d01ap6 0x1.3fffffff701a4p2 0x1.85a4p-14 F +REG epsg:2546 4 OK 0x1.d9dd54a23216ap24 0x1.0f08b5976a66p19 0x1.508e22564p5 0x1.7bffffffe2fe8p6 0x1.3fffffff7019dp2 0x1.85a6p-14 F +REG epsg:2547 0 OK 0x1.e0a6d723218c8p24 0x1.415519cd00c9dp6 0x1.18c107564p5 0x1.7400000000261p6 -0x1.ab40342ee8834p-32 0x1.a703p-14 T +REG epsg:2547 1 OK 0x1.d82e1fed92692p24 -0x1.0ef497c1a91aep19 0x1.98279585cp4 0x1.600000001d3a9p6 -0x1.4000000042554p2 0x1.c37ap-14 F +REG epsg:2547 2 OK 0x1.e91f8c764018cp24 -0x1.0ef4c770c607dp19 0x1.c5ff3187cp4 0x1.87ffffffe3025p6 -0x1.40000000414e6p2 0x1.c497p-14 F +REG epsg:2547 3 OK 0x1.d82e230c23101p24 0x1.0f08e8f6e33b5p19 0x1.3ce480982p5 0x1.600000001d2f9p6 0x1.3fffffff6fca1p2 0x1.850dp-14 F +REG epsg:2547 4 OK 0x1.e91f8d1d2fce9p24 0x1.0f08a08877afp19 0x1.53cbcf428p5 0x1.87ffffffe32bdp6 0x1.3fffffff70adfp2 0x1.86bep-14 F +REG epsg:2548 0 OK 0x1.efe90faa7080ep24 0x1.3f12ac57e03dep6 0x1.1e1963116p5 0x1.80000000004b8p6 -0x1.a97e511ad5302p-32 0x1.a7a3p-14 T +REG epsg:2548 1 OK 0x1.e7705884adc7cp24 -0x1.0ef4a814125c7p19 0x1.ad25e80d4p4 0x1.6c0000001d597p6 -0x1.4000000042622p2 0x1.c36fp-14 F +REG epsg:2548 2 OK 0x1.f861c4efa4dcap24 -0x1.0ef4d783e4d4fp19 0x1.c63b6a10cp4 0x1.93ffffffe31f5p6 -0x1.400000004054cp2 0x1.c59fp-14 F +REG epsg:2548 3 OK 0x1.e7705ba13f614p24 0x1.0f08d4e3380ddp19 0x1.47624f0eap5 0x1.6c0000001d5dfp6 0x1.3fffffff6fbdfp2 0x1.84f8p-14 F +REG epsg:2548 4 OK 0x1.f861c5949d1a3p24 0x1.0f088cb3fec6ep19 0x1.53e896ffp5 0x1.93ffffffe357fp6 0x1.3fffffff71863p2 0x1.884fp-14 F +REG epsg:2549 0 OK 0x1.ff2b482b6ae45p24 0x1.3cd36d0b752bdp6 0x1.204f103bep5 0x1.8c00000000702p6 -0x1.a691e01532885p-32 0x1.a8b2p-14 T +REG epsg:2549 1 OK 0x1.f6b2910d672c8p24 -0x1.0ef4b97bfd00bp19 0x1.bbf3d986p4 0x1.780000001d782p6 -0x1.40000000421f7p2 0x1.c3b5p-14 F +REG epsg:2549 2 OK 0x1.03d1feb609db6p25 -0x1.0ef4e8828da81p19 0x1.c035a801cp4 0x1.9fffffffe33acp6 -0x1.400000003f0dp2 0x1.c6f6p-14 F +REG epsg:2549 3 OK 0x1.f6b29426a86ddp24 0x1.0f08c1edf96f3p19 0x1.4ec7edc54p5 0x1.780000001d8c1p6 0x1.3fffffff6ff68p2 0x1.8564p-14 F +REG epsg:2549 4 OK 0x1.03d1ff06e18f9p25 0x1.0f087a27e976p19 0x1.50e4655bp5 0x1.9fffffffe3827p6 0x1.3fffffff72a1ep2 0x1.8a58p-14 F +REG epsg:2550 0 OK 0x1.e83ba9a2783dp18 0x1.b996d108210eep22 0x1.af8fcb44cp4 0x1.d400000000002p6 -0x1.8fffffffffffdp4 0x1.0p-29 F +REG epsg:2550 1 OK -0x1.fc971bd05004p14 0x1.9700764672f6ep22 0x1.04458acfbp6 0x1.bdeeb47e7a8d3p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2550 2 OK 0x1.f820627720752p19 0x1.970076469f0bp22 0x1.c6c4dd56ap5 0x1.ea114b818573p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2550 3 OK -0x1.300977b82d338p16 0x1.dac9b74a24b4p22 0x1.190a781a8p3 0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 -0x1.0p-29 F +REG epsg:2550 4 OK 0x1.071e6c41761b6p20 0x1.dac9b74a4e942p22 -0x1.1c0f9aep-3 0x1.ea114b818573p6 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:2551 0 OK 0x1.0736c055a9947p25 0x1.3a98ef842a153p6 0x1.1f6081efp5 0x1.9800000000938p6 -0x1.a27cee48e1d5p-32 0x1.aa23p-14 T +REG epsg:2551 1 OK 0x1.02fa64c67dcd3p25 -0x1.0ef4cbed329cdp19 0x1.c48706cc4p4 0x1.840000001d965p6 -0x1.40000000418d4p2 0x1.c452p-14 F +REG epsg:2551 2 OK 0x1.0b731af86924cp25 -0x1.0ef4fa60d3f0ep19 0x1.b3f2251b8p4 0x1.abffffffe3546p6 -0x1.400000003d79p2 0x1.c895p-14 F +REG epsg:2551 3 OK 0x1.02fa6650cec6p25 0x1.0f08b024748c3p19 0x1.53102c1cap5 0x1.840000001db9cp6 0x1.3fffffff70735p2 0x1.8651p-14 F +REG epsg:2551 4 OK 0x1.0b731b46f4e6fp25 0x1.0f0868f13b205p19 0x1.4ac158218p5 0x1.abffffffe3ab3p6 0x1.3fffffff74005p2 0x1.8cd9p-14 F +REG epsg:2552 0 OK 0x1.0ed7dc97b6407p25 0x1.3864c408098e7p6 0x1.1b4e5f8cp5 0x1.a400000000b56p6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:2552 1 OK 0x1.0a9b8104573f5p25 -0x1.0ef4df5ac2a6p19 0x1.c6d96bacp4 0x1.900000001db38p6 -0x1.4000000040acap2 0x1.c53fp-14 F +REG epsg:2552 2 OK 0x1.1314374190315p25 -0x1.0ef50d122e3cdp19 0x1.a1797c24p4 0x1.b7ffffffe36bfp6 -0x1.400000003b999p2 0x1.ca77p-14 F +REG epsg:2552 3 OK 0x1.0a9b828bb2b3ap25 0x1.0f089f9324494p19 0x1.543808ebep5 0x1.900000001de66p6 0x1.3fffffff7133bp2 0x1.87bep-14 F +REG epsg:2552 4 OK 0x1.1314378d2a168p25 0x1.0f08591c07a41p19 0x1.4183bd9ecp5 0x1.b7ffffffe3d13p6 0x1.3fffffff75a0dp2 0x1.8fc3p-14 F +REG epsg:2553 0 OK 0x1.1678f8de7b96fp25 0x1.3638766df4ac2p6 0x1.141b8444ap5 0x1.b000000000d53p6 -0x1.96e5cb51255ecp-32 0x1.ae29p-14 T +REG epsg:2553 1 OK 0x1.123c9d42e2ffdp25 -0x1.0ef4f3b70b856p19 0x1.c2e96717p4 0x1.9c0000001dcf7p6 -0x1.400000003f7dfp2 0x1.c67cp-14 F +REG epsg:2553 2 OK 0x1.1ab553941a264p25 -0x1.0ef520897f022p19 0x1.88d8a2e2p4 0x1.c3ffffffe3811p6 -0x1.4000000039709p2 0x1.cc9ap-14 F +REG epsg:2553 3 OK 0x1.123c9ec6a5267p25 0x1.0f089045a881ap19 0x1.523eb49bep5 0x1.9c0000001e117p6 0x1.3fffffff72384p2 0x1.899ap-14 F +REG epsg:2553 4 OK 0x1.1ab553dc1e548p25 0x1.0f084ab36ae09p19 0x1.3532119aap5 0x1.c3ffffffe3f4ep6 0x1.3fffffff7782ap2 0x1.9316p-14 F +REG epsg:2554 0 OK 0x1.1e1a152c9668ep25 0x1.34158d07f56f1p6 0x1.09ccfd192p5 0x1.bc00000000f2cp6 -0x1.8f6bbc19f56bep-32 0x1.b0bp-14 T +REG epsg:2554 1 OK 0x1.19ddb984c3a4dp25 -0x1.0ef508f3c4276p19 0x1.b8b9bc51p4 0x1.a80000001de9cp6 -0x1.400000003e023p2 0x1.c803p-14 F +REG epsg:2554 2 OK 0x1.22566ff29b931p25 -0x1.0ef534b91dd34p19 0x1.6a20e103p4 0x1.cfffffffe393ap6 -0x1.4000000036ff7p2 0x1.ceefp-14 F +REG epsg:2554 3 OK 0x1.19ddbb044b3afp25 0x1.0f088246bddeep19 0x1.4d2591bbap5 0x1.a80000001e3acp6 0x1.3fffffff737f6p2 0x1.8bf6p-14 F +REG epsg:2554 4 OK 0x1.2256703668b45p25 0x1.0f083dc180ebbp19 0x1.25d4f8cd2p5 0x1.cfffffffe415cp6 0x1.3fffffff79a48p2 0x1.96cap-14 F +REG epsg:2555 0 OK 0x1.25bb31849e621p25 0x1.31fd87916fd4p6 0x1.f8d40aa1p4 0x1.c8000000010d9p6 -0x1.86d96a528c1e5p-32 0x1.b38cp-14 T +REG epsg:2555 1 OK 0x1.217ed5cc996e3p25 -0x1.0ef51f020601dp19 0x1.a85190f8p4 0x1.b40000001e025p6 -0x1.400000003c3abp2 0x1.c9d1p-14 F +REG epsg:2555 2 OK 0x1.29f78c5fa0a22p25 -0x1.0ef54992e0f39p19 0x1.4567c4p4 0x1.dbffffffe3a3p6 -0x1.4000000034488p2 0x1.d174p-14 F +REG epsg:2555 3 OK 0x1.217ed74748288p25 0x1.0f0875a03651bp19 0x1.44f034042p5 0x1.b40000001e61dp6 0x1.3fffffff7508fp2 0x1.8ecp-14 F +REG epsg:2555 4 OK 0x1.29f78c9e98555p25 0x1.0f08324f5efap19 0x1.13773accp5 0x1.dbffffffe432fp6 0x1.3fffffff7c055p2 0x1.9ad3p-14 F +REG epsg:2556 0 OK 0x1.2d5c4de92437ep25 0x1.2ff1de21f173ap6 0x1.d7f802c48p4 0x1.d40000000125ap6 -0x1.7d34d9c5f0527p-32 0x1.b6adp-14 T +REG epsg:2556 1 OK 0x1.291ff21d006dfp25 -0x1.0ef535d257872p19 0x1.91bc68028p4 0x1.c00000001e184p6 -0x1.400000003a295p2 0x1.cbdap-14 F +REG epsg:2556 2 OK 0x1.3198a8ddab4f7p25 -0x1.0ef55f082746ep19 0x1.1ac70ffbp4 0x1.e7ffffffe3afap6 -0x1.40000000314dep2 0x1.d421p-14 F +REG epsg:2556 3 OK 0x1.291ff3923b67dp25 0x1.0f086a5af22d9p19 0x1.39a45dd72p5 0x1.c00000001e866p6 0x1.3fffffff76d3fp2 0x1.91f5p-14 F +REG epsg:2556 4 OK 0x1.3198a9173297ap25 0x1.0f0828650cff6p19 0x1.fc4b74fcp4 0x1.e7ffffffe44c4p6 0x1.3fffffff7ea3dp2 0x1.9f28p-14 F +REG epsg:2557 0 OK 0x1.34fd6a5cafdc3p25 0x1.2df400255c648p6 0x1.b11cf0c54p4 0x1.e0000000013a1p6 -0x1.7284ce78d2fb5p-32 0x1.ba13p-14 T +REG epsg:2557 1 OK 0x1.30c10e788eb3ap25 -0x1.0ef54d54b700dp19 0x1.750a19b18p4 0x1.cc0000001e2bap6 -0x1.4000000037cecp2 0x1.ce24p-14 F +REG epsg:2557 2 OK 0x1.3939c56f31a5dp25 -0x1.0ef57509e2944p19 0x1.d4b95b558p3 0x1.f3ffffffe3b88p6 -0x1.400000002e128p2 0x1.d6e4p-14 F +REG epsg:2557 3 OK 0x1.30c10fe7bedbap25 0x1.0f08607ed9eeap19 0x1.2b49fc35ap5 0x1.cc0000001ea7fp6 0x1.3fffffff78df9p2 0x1.9586p-14 F +REG epsg:2557 4 OK 0x1.3939c5a2b1574p25 0x1.0f082009800d2p19 0x1.cbdeda194p4 0x1.f3ffffffe4621p6 0x1.3fffffff817eap2 0x1.a3bbp-14 F +REG epsg:2558 0 OK 0x1.3c9e86e1beb74p25 0x1.2c05535a26509p6 0x1.845e17d3cp4 0x1.ec000000014b6p6 -0x1.66d0c86245c3cp-32 0x1.bda9p-14 T +REG epsg:2558 1 OK 0x1.38622ae1d27bfp25 -0x1.0ef56578a5cb2p19 0x1.524ec86bp4 0x1.d80000001e3c4p6 -0x1.40000000352dfp2 0x1.d09dp-14 F +REG epsg:2558 2 OK 0x1.40dae2169c054p25 -0x1.0ef58b88a2155p19 0x1.68952acdp3 0x1.ffffffffe3bdap6 -0x1.400000002a98ap2 0x1.d9bdp-14 F +REG epsg:2558 3 OK 0x1.38622c4a64fddp25 0x1.0f085812d8ad7p19 0x1.19eb21306p5 0x1.d80000001ec62p6 0x1.3fffffff7b2a7p2 0x1.9973p-14 F +REG epsg:2558 4 OK 0x1.40dae243812f2p25 0x1.0f081942956f3p19 0x1.95ca9ed6cp4 0x1.ffffffffe473fp6 0x1.3fffffff84943p2 0x1.a889p-14 F +REG epsg:2559 0 OK 0x1.443fa37ac1e83p25 0x1.2a2732d66074dp6 0x1.51dadd0ccp4 0x1.f80000000158cp6 -0x1.5a20fd9fa4155p-32 0x1.c16ep-14 T +REG epsg:2559 1 OK 0x1.4003475b50659p25 -0x1.0ef57e2d33e6p19 0x1.29a2d29fp4 0x1.e40000001e495p6 -0x1.400000003248fp2 0x1.d33bp-14 F +REG epsg:2559 2 OK 0x1.487bfed64372bp25 -0x1.0ef5a2749d4b5p19 0x1.e2dadd2dp2 0x1.05fffffff1dfcp7 -0x1.4000000026e29p2 0x1.dca7p-14 F +REG epsg:2559 3 OK 0x1.400348bcb7118p25 0x1.0f08511cd7443p19 0x1.0593fcd6cp5 0x1.e40000001ee11p6 0x1.3fffffff7db3dp2 0x1.9dbp-14 F +REG epsg:2559 4 OK 0x1.487bfefbffc62p25 0x1.0f0814150e8fep19 0x1.5a34b4cfcp4 0x1.05fffffff240ep7 0x1.3fffffff87e26p2 0x1.ad7fp-14 F +REG epsg:2560 0 OK 0x1.4be0c02a1c8ecp25 0x1.285aee1438787p6 0x1.19b6b171p4 0x1.0200000000b15p7 -0x1.4c7e5531fd09ap-32 0x1.c55p-14 T +REG epsg:2560 1 OK 0x1.47a463e781ad4p25 -0x1.0ef597610bd72p19 0x1.f6458361p3 0x1.f00000001e535p6 -0x1.400000002f21cp2 0x1.d5fcp-14 F +REG epsg:2560 2 OK 0x1.501d1bb06ff1dp25 -0x1.0ef5b9bdbf127p19 0x1.be5704ecp1 0x1.0bfffffff1deep7 -0x1.4000000022f46p2 0x1.df87p-14 F +REG epsg:2560 3 OK 0x1.47a46541335b5p25 0x1.0f084ba1b828fp19 0x1.dca5a952cp4 0x1.f00000001ef81p6 0x1.3fffffff8079ap2 0x1.a232p-14 F +REG epsg:2560 4 OK 0x1.501d1bce7a25ep25 0x1.0f0810848da07p19 0x1.1946eaba8p4 0x1.0bfffffff2458p7 0x1.3fffffff8b67bp2 0x1.b297p-14 F +REG epsg:2561 0 OK 0x1.5381dcf2221e5p25 0x1.26a1c8069cdc7p6 0x1.b831f2148p3 0x1.0800000000b47p7 -0x1.3df2605efd45ep-32 0x1.c94ap-14 T +REG epsg:2561 1 OK 0x1.4f458088d2716p25 -0x1.0ef5b1027ed28p19 0x1.8dde6bda8p3 0x1.fc0000001e5a4p6 -0x1.400000002bbb6p2 0x1.d8d3p-14 F +REG epsg:2561 2 OK 0x1.57be38a756eb9p25 -0x1.0ef5d153b0e7bp19 -0x1.c96c3078p-1 0x1.11fffffff1dc2p7 -0x1.400000001ed0ep2 0x1.e259p-14 F +REG epsg:2561 3 OK 0x1.4f4581da4b61ep25 0x1.0f0847a554002p19 0x1.a86ff3348p4 0x1.fc0000001f0b4p6 0x1.3fffffff837acp2 0x1.a6f1p-14 F +REG epsg:2561 4 OK 0x1.57be38bd2b1dep25 0x1.0f080e93930d1p19 0x1.a65d9e27p3 0x1.11fffffff2486p7 0x1.3fffffff8f21bp2 0x1.b7c5p-14 F +REG epsg:2562 0 OK 0x1.5b22f9d514bc4p25 0x1.24fcf636aa084p6 0x1.3259de8fp3 0x1.0e00000000b55p7 -0x1.2e8754201250cp-32 0x1.cd51p-14 T +REG epsg:2562 1 OK 0x1.56e69d419ffeep25 -0x1.0ef5caff9121cp19 0x1.1a599f58p3 0x1.040000000f2eap7 -0x1.4000000028183p2 0x1.dbb5p-14 F +REG epsg:2562 2 OK 0x1.5f5f55bd19a1dp25 -0x1.0ef5e925e660bp19 -0x1.656b8856p2 0x1.17fffffff1d77p7 -0x1.400000001a7b1p2 0x1.e51cp-14 F +REG epsg:2562 3 OK 0x1.56e69e8a6236fp25 0x1.0f08452a76e9cp19 0x1.6eab792ccp4 0x1.040000000f8d5p7 0x1.3fffffff86b5ap2 0x1.abdbp-14 F +REG epsg:2562 4 OK 0x1.5f5f55ca39b27p25 0x1.0f080e437bba1p19 0x1.103b2051p3 0x1.17fffffff248cp7 0x1.3fffffff930eap2 0x1.bcf3p-14 F +REG epsg:2563 0 OK 0x1.62c416d523aa6p25 0x1.236d9fea7ed74p6 0x1.448622ap2 0x1.1400000000b44p7 -0x1.1e480218a563ep-32 0x1.d157p-14 T +REG epsg:2563 1 OK 0x1.5e87ba143728bp25 -0x1.0ef5e54606c27p19 0x1.38105667p2 0x1.0a0000000f2e1p7 -0x1.40000000243cp2 0x1.de95p-14 F +REG epsg:2563 2 OK 0x1.670072f3c3b05p25 -0x1.0ef60123a8c72p19 -0x1.525ded6d8p3 0x1.1dfffffff1d0fp7 -0x1.4000000015f6ep2 0x1.e7b9p-14 F +REG epsg:2563 3 OK 0x1.5e87bb53caca8p25 0x1.0f084432de898p19 0x1.2f80c3604p4 0x1.0a0000000f92ap7 0x1.3fffffff8a27cp2 0x1.b0e9p-14 F +REG epsg:2563 4 OK 0x1.670072f7b79acp25 0x1.0f080f94800fdp19 0x1.c23eccacp1 0x1.1dfffffff2471p7 0x1.3fffffff972c5p2 0x1.c21ep-14 F +REG epsg:2564 0 OK 0x1.6a6533f469be9p25 0x1.21f4dd5610fbfp6 0x1.0a5473ap-2 0x1.1a00000000b15p7 -0x1.0d3fd0c073cb7p-32 0x1.d555p-14 T +REG epsg:2564 1 OK 0x1.6628d702d2aadp25 -0x1.0ef5ffc3702efp19 0x1.342b0a2p-1 0x1.100000000f2c2p7 -0x1.400000002028ep2 0x1.e171p-14 F +REG epsg:2564 2 OK 0x1.6ea1904d499dap25 -0x1.0ef6193c22d1cp19 -0x1.fb1f39208p3 0x1.23fffffff1c8dp7 -0x1.400000001147ap2 0x1.ea2fp-14 F +REG epsg:2564 3 OK 0x1.6628d838c649bp25 0x1.0f0844bf38cebp19 0x1.d63847928p3 0x1.100000000f961p7 0x1.3fffffff8dcfcp2 0x1.b60bp-14 F +REG epsg:2564 4 OK 0x1.6ea190479fccep25 0x1.0f081285b3d11p19 -0x1.c1a50a9p0 0x1.23fffffff2437p7 0x1.3fffffff9b77fp2 0x1.c73ep-14 F +REG epsg:2565 0 OK 0x1.72065134ebe8ap25 0x1.2093b6d692866p6 -0x1.3616cfe6p2 0x1.2000000000ac7p7 -0x1.f6f567208c64fp-33 0x1.d936p-14 T +REG epsg:2565 1 OK 0x1.6dc9f40f99996p25 -0x1.0ef61a65374f9p19 -0x1.fe5b662ap1 0x1.160000000f27fp7 -0x1.400000001be2bp2 0x1.e438p-14 F +REG epsg:2565 2 OK 0x1.7642adcb877bcp25 -0x1.0ef6315e6c73bp19 -0x1.56419fa8p4 0x1.29fffffff1beep7 -0x1.400000000c716p2 0x1.ec6bp-14 F +REG epsg:2565 3 OK 0x1.6dc9f53b82899p25 0x1.0f0846cf2378fp19 0x1.435b2e508p3 0x1.160000000f975p7 0x1.3fffffff91ab4p2 0x1.bb4p-14 F +REG epsg:2565 4 OK 0x1.7642adbbd519fp25 0x1.0f08171506c19p19 -0x1.d336e622p2 0x1.29fffffff23d8p7 0x1.3fffffff9feebp2 0x1.cc3fp-14 F +REG epsg:2566 0 OK 0x1.79a76e9897c79p25 0x1.1f4b2438f27b9p6 -0x1.47647134p3 0x1.2600000000a5ap7 -0x1.d20a450caa51bp-33 0x1.dcfbp-14 T +REG epsg:2566 1 OK 0x1.756b113c9ddebp25 -0x1.0ef63518ac822p19 -0x1.1c1d6a28p3 0x1.1c0000000f222p7 -0x1.40000000176cbp2 0x1.e6e5p-14 F +REG epsg:2566 2 OK 0x1.7de3cb703f9a4p25 -0x1.0ef6497996b8dp19 -0x1.b306c4664p4 0x1.2ffffffff1b35p7 -0x1.400000000777ap2 0x1.ee6bp-14 F +REG epsg:2566 3 OK 0x1.756b125e187fep25 0x1.0f084a612c5ccp19 0x1.4da28d3dp2 0x1.1c0000000f964p7 0x1.3fffffff95b8p2 0x1.c071p-14 F +REG epsg:2566 4 OK 0x1.7de3cb5620dbdp25 0x1.0f081d3f4616ep19 -0x1.a32848ed8p3 0x1.2ffffffff235fp7 0x1.3fffffffa48e2p2 0x1.d11bp-14 F +REG epsg:2567 0 OK 0x1.81488c21424f6p25 0x1.1e1c0c0bfaa97p6 -0x1.fc3f8ad7p3 0x1.2c000000009dp7 -0x1.abd822ed0b395p-33 0x1.e092p-14 T +REG epsg:2567 1 OK 0x1.7d0c2e8bdac6dp25 -0x1.0ef64fcb13b73p19 -0x1.c1e32e008p3 0x1.220000000f1a9p7 -0x1.4000000012cacp2 0x1.e964p-14 F +REG epsg:2567 2 OK 0x1.8584e93d194a2p25 -0x1.0ef6617cb7a6cp19 -0x1.09cef99e6p5 0x1.35fffffff1a66p7 -0x1.40000000025ep2 0x1.f028p-14 F +REG epsg:2567 3 OK 0x1.7d0c2fa28aca6p25 0x1.0f084f72d266ap19 0x1.0866098p-5 0x1.220000000f934p7 0x1.3fffffff99f3bp2 0x1.c59p-14 F +REG epsg:2567 4 OK 0x1.8584e91831b38p25 0x1.0f0825001eb69p19 -0x1.322c7901cp4 0x1.35fffffff22c7p7 0x1.3fffffffa9539p2 0x1.d5c1p-14 F +REG epsg:2568 0 OK 0x1.88e9a9d0a67ffp25 0x1.1d0742fe84bb7p6 -0x1.5c8ee79fp4 0x1.320000000092bp7 -0x1.8479cddb2eb7fp-33 0x1.e3f2p-14 T +REG epsg:2568 1 OK 0x1.84ad4bff339bfp25 -0x1.0ef66a69b196ap19 -0x1.3839ea6e8p4 0x1.280000000f111p7 -0x1.400000000e007p2 0x1.ebbap-14 F +REG epsg:2568 2 OK 0x1.8d2607339fb4fp25 -0x1.0ef67956f61a9p19 -0x1.3be1b32cp5 0x1.3bfffffff198p7 -0x1.3ffffffffd28bp2 0x1.f193p-14 F +REG epsg:2568 3 OK 0x1.84ad4d0ac4459p25 0x1.0f085600875b8p19 -0x1.5b16420cp2 0x1.280000000f8e2p7 0x1.3fffffff9e5bcp2 0x1.ca9ep-14 F +REG epsg:2568 4 OK 0x1.8d2607039a5bbp25 0x1.0f082e52203ep19 -0x1.9652f084cp4 0x1.3bfffffff2212p7 0x1.3fffffffae3b9p2 0x1.da32p-14 F +REG epsg:2569 0 OK 0x1.908ac7a8642ep25 0x1.1c0d8b4a38233p6 -0x1.bebd5cbep4 0x1.380000000086bp7 -0x1.5c0ae582b3573p-33 0x1.e715p-14 T +REG epsg:2569 1 OK 0x1.8c4e699872535p25 -0x1.0ef684e1d8a2ep19 -0x1.93aa7191p4 0x1.2e0000000f061p7 -0x1.4000000009112p2 0x1.edd1p-14 F +REG epsg:2569 2 OK 0x1.94c7255540c74p25 -0x1.0ef690f7959b2p19 -0x1.6f986c914p5 0x1.41fffffff1888p7 -0x1.3ffffffff7dcp2 0x1.f2a9p-14 F +REG epsg:2569 3 OK 0x1.8c4e6a9896b47p25 0x1.0f085e05b2576p19 -0x1.646ed0f2p3 0x1.2e0000000f871p7 0x1.3fffffffa2ed5p2 0x1.cf88p-14 F +REG epsg:2569 4 OK 0x1.94c72519d08dbp25 0x1.0f08392ec0d2dp19 -0x1.fdc145b7p4 0x1.41fffffff2146p7 0x1.3fffffffb3438p2 0x1.de55p-14 F +REG epsg:2570 0 OK 0x1.982be5a9fedfbp25 0x1.1b2f942b39a1ap6 -0x1.123320966p5 0x1.3e00000000797p7 -0x1.32a7c9254cc9dp-33 0x1.e9edp-14 T +REG epsg:2570 1 OK 0x1.93ef8759464bap25 -0x1.0ef69f20f654ep19 -0x1.f30303dfp4 0x1.340000000ef9ap7 -0x1.4000000004014p2 0x1.efa4p-14 F +REG epsg:2570 2 OK 0x1.9c6843a34c301p25 -0x1.0ef6a84e0215fp19 -0x1.a4cedccbcp5 0x1.47fffffff1781p7 -0x1.3ffffffff27b1p2 0x1.f366p-14 F +REG epsg:2570 3 OK 0x1.93ef884db9798p25 0x1.0f08677cb306p19 -0x1.11912b674p4 0x1.340000000f7e2p7 0x1.3fffffffa7a5dp2 0x1.d43fp-14 F +REG epsg:2570 4 OK 0x1.9c68435c2bfb1p25 0x1.0f08458e61b72p19 -0x1.341772f8ep5 0x1.47fffffff2062p7 0x1.3fffffffb8675p2 0x1.e232p-14 F +REG epsg:25700 0 OK -0x1.e56b5810b904ep22 0x1.b761d5b5c05d6p19 0x1.934dd1d4p5 0x1.b800000000001p6 0x1.6f632f31c2acp-39 -0x1.0p-30 T +REG epsg:25700 1 OK -0x1.03a502dd1f34ap23 0x1.53c8bed642a1ap18 0x1.91839742bp6 0x1.a4p6 -0x1.3fffffffffe2bp2 -0x1.0p-30 F +REG epsg:25700 2 OK -0x1.c38caa531ea52p22 0x1.53c7522d2036ep18 0x1.1a9a714a2p5 0x1.cc00000000002p6 -0x1.3fffffffffe23p2 -0x1.0p-29 F +REG epsg:25700 3 OK -0x1.03a502dd1f34ap23 0x1.626fa6255ed9fp20 0x1.2be00784bp6 0x1.a4p6 0x1.3fffffffffe19p2 -0x1.0p-29 F +REG epsg:25700 4 OK -0x1.c38caa531ea52p22 0x1.627001436e53ap20 0x1.3d4b240b8p3 0x1.cc00000000002p6 0x1.3fffffffffe2ap2 -0x1.0p-29 F +REG epsg:2571 0 OK 0x1.9fcd03d6dcbc2p25 0x1.1a6df9652c2b9p6 -0x1.46a1203c2p5 0x1.44000000006aap7 -0x1.086d82d2cd343p-33 0x1.ec79p-14 T +REG epsg:2571 1 OK 0x1.9b90a543431e8p25 -0x1.0ef6b914a022ap19 -0x1.2b005d89cp5 0x1.3a0000000eebbp7 -0x1.3ffffffffed44p2 0x1.f128p-14 F +REG epsg:2571 2 OK 0x1.a409621ef274fp25 -0x1.0ef6bf49db824p19 -0x1.db5fad952p5 0x1.4dfffffff1668p7 -0x1.3fffffffed0adp2 0x1.f3cp-14 F +REG epsg:2571 3 OK 0x1.9b90a62bc8629p25 0x1.0f08725ee593fp19 -0x1.748ff232p4 0x1.3a0000000f738p7 0x1.3fffffffac821p2 0x1.d8c3p-14 F +REG epsg:2571 4 OK 0x1.a40961cbe55cfp25 0x1.0f08536854a38p19 -0x1.6aa892122p5 0x1.4dfffffff1f69p7 0x1.3fffffffbda4fp2 0x1.e5b4p-14 F +REG epsg:2572 0 OK 0x1.a76e223045907p25 0x1.19c942d5d992ep6 -0x1.7c83e3b38p5 0x1.4a000000005aap7 -0x1.baf3682609804p-34 0x1.eeabp-14 T +REG epsg:2572 1 OK 0x1.a331c357df855p25 -0x1.0ef6d2aaa06bbp19 -0x1.5e2f110f6p5 0x1.400000000edc9p7 -0x1.3ffffffff98e6p2 0x1.f25ep-14 F +REG epsg:2572 2 OK 0x1.abaa80c9441cbp25 -0x1.0ef6d5db015d2p19 -0x1.09924aca6p6 0x1.53fffffff1547p7 -0x1.3fffffffe78eep2 0x1.f3b9p-14 F +REG epsg:2572 3 OK 0x1.a331c4344287ap25 0x1.0f087ea4a7575p19 -0x1.daee470d8p4 0x1.400000000f671p7 0x1.3fffffffb17f2p2 0x1.ddp-14 F +REG epsg:2572 4 OK 0x1.abaa806a1597fp25 0x1.0f0862b2e1da9p19 -0x1.a26db6972p5 0x1.53fffffff1e61p7 0x1.3fffffffc2f78p2 0x1.e8e1p-14 F +REG epsg:2573 0 OK 0x1.af0f40b761e99p25 0x1.1941e415cfcd7p6 -0x1.b3b59bcap5 0x1.500000000049cp7 -0x1.63d500d33b27ap-34 0x1.f07ep-14 T +REG epsg:2573 1 OK 0x1.aad2e1987451fp25 -0x1.0ef6ebd1033f5p19 -0x1.92e9b2f12p5 0x1.460000000ecc7p7 -0x1.3ffffffff4333p2 0x1.f33fp-14 F +REG epsg:2573 2 OK 0x1.b34b9fa330ef8p25 -0x1.0ef6ebf19dfaap19 -0x1.25fb399f6p6 0x1.59fffffff141cp7 -0x1.3fffffffe20b5p2 0x1.f345p-14 F +REG epsg:2573 3 OK 0x1.aad2e268893e3p25 0x1.0f088c455c29dp19 -0x1.22322b194p5 0x1.460000000f595p7 0x1.3fffffffb699ap2 0x1.e0fep-14 F +REG epsg:2573 4 OK 0x1.b34b9f37b4f74p25 0x1.0f0873634efc4p19 -0x1.db3fbed1p5 0x1.59fffffff1d49p7 0x1.3fffffffc85c6p2 0x1.ebaap-14 F +REG epsg:2574 0 OK 0x1.b6b05f6d3a44p25 0x1.18d83c2735ef1p6 -0x1.ec0f8e3eap5 0x1.5600000000381p7 -0x1.0bbcf071988b8p-34 0x1.f1fp-14 T +REG epsg:2574 1 OK 0x1.b27400063b7cfp25 -0x1.0ef7047622f6p19 -0x1.c90b43caep5 0x1.4c0000000ebb2p7 -0x1.3fffffffeec77p2 0x1.f3b5p-14 F +REG epsg:2574 2 OK 0x1.baecbead874f2p25 -0x1.0ef7017e31a22p19 -0x1.42d6b4223p6 0x1.5ffffffff12ecp7 -0x1.3fffffffdc84p2 0x1.f267p-14 F +REG epsg:2574 3 OK 0x1.b27400c9df211p25 0x1.0f089b3774725p19 -0x1.58541025p5 0x1.4c0000000f4a3p7 0x1.3fffffffbbce8p2 0x1.e498p-14 F +REG epsg:2574 4 OK 0x1.baecbe359a7e6p25 0x1.0f08856de6899p19 -0x1.0a7b6629ep6 0x1.5ffffffff1c26p7 0x1.3fffffffcdcfbp2 0x1.ee0dp-14 F +REG epsg:2575 0 OK 0x1.be517e52b6522p25 0x1.188c953311ed6p6 -0x1.12b518774p6 0x1.5c0000000025ap7 -0x1.65d20f7398d3cp-35 0x1.f2fbp-14 T +REG epsg:2575 1 OK 0x1.ba151ea24f494p25 -0x1.0ef71c88b4925p19 -0x1.0036e42a6p6 0x1.520000000ea93p7 -0x1.3fffffffe94e9p2 0x1.f3cfp-14 F +REG epsg:2575 2 OK 0x1.c28ddde8f3a5bp25 -0x1.0ef716719d6e2p19 -0x1.60107ac81p6 0x1.65fffffff11bcp7 -0x1.3fffffffd6fd1p2 0x1.f12p-14 F +REG epsg:2575 3 OK 0x1.ba151f59672e2p25 0x1.0f08ab7073d94p19 -0x1.8fb6d7276p5 0x1.520000000f39fp7 0x1.3fffffffc119dp2 0x1.e7e7p-14 F +REG epsg:2575 4 OK 0x1.c28ddd647b521p25 0x1.0f0898c6001cp19 -0x1.27b52ffc6p6 0x1.65fffffff1afbp7 0x1.3fffffffd34dcp2 0x1.f006p-14 F +REG epsg:2576 0 OK 0x1.c5f29d689c59cp25 0x1.185f24552e34bp6 -0x1.2fcea2c8bp6 0x1.620000000012ep7 -0x1.665e69a786919p-36 0x1.f39dp-14 T +REG epsg:2576 1 OK 0x1.c1b63d6da97dcp25 -0x1.0ef733f7d3e41p19 -0x1.1c7532073p6 0x1.580000000e96bp7 -0x1.3fffffffe3ccdp2 0x1.f38p-14 F +REG epsg:2576 2 OK 0x1.ca2efd55ffecap25 -0x1.0ef72abd2de94p19 -0x1.7d940bd7dp6 -0x1.640000000ef7p7 -0x1.3fffffffd17a8p2 0x1.ef6bp-14 F +REG epsg:2576 3 OK 0x1.c1b63e1823f9dp25 0x1.0f08bce4f8a41p19 -0x1.c833a3718p5 0x1.580000000f28cp7 0x1.3fffffffc679p2 0x1.ead1p-14 F +REG epsg:2576 4 OK 0x1.ca2efcc4ea391p25 0x1.0f08ad5e0946p19 -0x1.4538bb243p6 -0x1.640000000e635p7 0x1.3fffffffd8d27p2 0x1.f197p-14 F +REG epsg:2577 0 OK 0x1.c9c32caf90a8bp25 0x1.18500976c3c5ap6 -0x1.4d3ffafb8p6 0x1.67fffffffffffp7 -0x1.d53b8c4d99189p-48 0x1.f3d3p-14 F +REG epsg:2577 1 OK 0x1.c586cc6922b64p25 -0x1.0ef74ab30f624p19 -0x1.392cba3fbp6 0x1.5e0000000e83ep7 -0x1.3fffffffde461p2 0x1.f2c7p-14 F +REG epsg:2577 2 OK 0x1.cdff8cf5134bap25 -0x1.0ef73e52a55dap19 -0x1.9b4cb1cbfp6 -0x1.5e0000000f09bp7 -0x1.3fffffffcbffep2 0x1.ed4ap-14 F +REG epsg:2577 3 OK 0x1.c586cd06f6f9fp25 0x1.0f08cf88c3af1p19 -0x1.00d169344p6 0x1.5e0000000f16ep7 0x1.3fffffffcbe78p2 0x1.ed56p-14 F +REG epsg:2577 4 OK 0x1.cdff8c5757353p25 0x1.0f08c3278f17fp19 -0x1.62f152205p6 -0x1.5e0000000e768p7 0x1.3fffffffde5a2p2 0x1.f2bap-14 F +REG epsg:2578 0 OK 0x1.d534dc2815215p25 0x1.185f4f3803453p6 -0x1.6af478571p6 -0x1.620000000013p7 0x1.6623c281da0e3p-36 0x1.f39fp-14 T +REG epsg:2578 1 OK 0x1.d0f87b9571cbp25 -0x1.0ef760aa73b54p19 -0x1.564956839p6 0x1.640000000e70ep7 -0x1.3fffffffd8be5p2 0x1.f1a2p-14 F +REG epsg:2578 2 OK 0x1.d9713cc671d09p25 -0x1.0ef7512445d51p19 -0x1.b92591dbbp6 -0x1.580000000f1bcp7 -0x1.3fffffffc6915p2 0x1.eac3p-14 F +REG epsg:2578 3 OK 0x1.d0f87c269fe6ep25 0x1.0f08e34ec106p19 -0x1.1dee0bab3p6 0x1.640000000f044p7 0x1.3fffffffd1621p2 0x1.ef74p-14 F +REG epsg:2578 4 OK 0x1.d9713c1c0f348p25 0x1.0f08da1348425p19 -0x1.80ca1a322p6 -0x1.580000000e894p7 0x1.3fffffffe3e09p2 0x1.f376p-14 F +REG epsg:2579 0 OK 0x1.dcd5fbd288df7p25 0x1.188ceae88cf55p6 -0x1.88d74300ep6 -0x1.5c0000000025bp7 0x1.65b4bbcdcb462p-35 0x1.f2fap-14 T +REG epsg:2579 1 OK 0x1.d8999af32b50bp25 -0x1.0ef775ce96e83p19 -0x1.73b699919p6 -0x1.65fffffff1a23p7 -0x1.3fffffffd3399p2 0x1.f013p-14 F +REG epsg:2579 2 OK 0x1.e1125cca3c3f3p25 -0x1.0ef76324dabc8p19 -0x1.d709ba9c7p6 -0x1.520000000f2dp7 -0x1.3fffffffc131fp2 0x1.e7dap-14 F +REG epsg:2579 3 OK 0x1.d8999b77bc358p25 0x1.0f08f829110fap19 -0x1.3b5b4bd8p6 -0x1.65fffffff10ebp7 0x1.3fffffffd6e4bp2 0x1.f12ap-14 F +REG epsg:2579 4 OK 0x1.e1125c133bdbp25 0x1.0f08f2111fcf6p19 -0x1.9eae22002p6 -0x1.520000000e9bbp7 0x1.3fffffffe9623p2 0x1.f3c6p-14 F +REG epsg:2580 0 OK 0x1.e4771baf27f57p25 0x1.18d8bc8edd145p6 -0x1.a6d3629c1p6 -0x1.5600000000381p7 0x1.0bae46b1a910ap-34 0x1.f1fp-14 T +REG epsg:2580 1 OK 0x1.e03aba82c12ffp25 -0x1.0ef78a10a33a6p19 -0x1.915fdd8cfp6 -0x1.5ffffffff1b4dp7 -0x1.3fffffffcdbc1p2 0x1.ee12p-14 F +REG epsg:2580 2 OK 0x1.e8b37d006ffa2p25 -0x1.0ef77447c2295p19 -0x1.f4e432b3cp6 -0x1.4c0000000f3d6p7 -0x1.3fffffffbbe61p2 0x1.e492p-14 F +REG epsg:2580 3 OK 0x1.e03abafac6a85p25 0x1.0f090e091248dp19 -0x1.590483dfap6 -0x1.5ffffffff1219p7 0x1.3fffffffdc6b9p2 0x1.f27p-14 F +REG epsg:2580 4 OK 0x1.e8b37c3ce365ap25 0x1.0f090b10406a7p19 -0x1.bc887047p6 -0x1.4c0000000eadep7 0x1.3fffffffeedafp2 0x1.f3b1p-14 F +REG epsg:2581 0 OK 0x1.ec183bbe0b41fp25 0x1.19428efea7a7fp6 -0x1.c4d3cd00dp6 -0x1.500000000049dp7 0x1.63c656e3e16edp-34 0x1.f07ep-14 T +REG epsg:2581 1 OK 0x1.e7dbda448254fp25 -0x1.0ef79d626187ap19 -0x1.af3052791p6 -0x1.59fffffff1c71p7 -0x1.3fffffffc848dp2 0x1.ebb3p-14 F +REG epsg:2581 2 OK 0x1.f0549d68e704bp25 -0x1.0ef78480f5b68p19 -0x1.095003c788p7 -0x1.460000000f4cbp7 -0x1.3fffffffb6b1p2 0x1.e0f4p-14 F +REG epsg:2581 3 OK 0x1.e7dbdab016f8ep25 0x1.0f0924df6b88bp19 -0x1.76d4e3ce7p6 -0x1.59fffffff134cp7 0x1.3fffffffe1f3p2 0x1.f34ep-14 F +REG epsg:2581 4 OK 0x1.f0549c98e8a5bp25 0x1.0f0924ff202f2p19 -0x1.da4412915p6 -0x1.460000000ebf3p7 0x1.3ffffffff446cp2 0x1.f334p-14 F +REG epsg:2582 0 OK 0x1.e864c6ad7539ep18 0x1.6c051c7d5a47ap6 -0x1.3bbf9776p6 0x1.4ffffffffc356p4 -0x1.32a7c92ec86fep-33 0x1.e9ebp-14 T +REG epsg:2582 1 OK -0x1.ae5acbb57d0dp15 -0x1.0ef495f651c79p19 -0x1.89b2d54f3p6 0x1.00000000744cbp4 -0x1.3ffffffff278cp2 0x1.f367p-14 F +REG epsg:2582 2 OK 0x1.01a52f005d804p20 -0x1.0ef49f2527862p19 -0x1.2822ad974p6 0x1.9fffffff883cbp4 -0x1.400000000403bp2 0x1.ef9fp-14 F +REG epsg:2582 3 OK -0x1.ae56f9231d75p15 0x1.0f0b6baa84e9bp19 -0x1.513e41dp6 0x1.000000006fda7p4 0x1.3fffffffb8651p2 0x1.e23p-14 F +REG epsg:2582 4 OK 0x1.01a526116cd7ep20 0x1.0f0b49bdaf2e8p19 -0x1.df5ded54p5 0x1.9fffffff84185p4 0x1.3fffffffa7a74p2 0x1.d44p-14 F +REG epsg:25828 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:25828 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:25828 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:25828 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:25828 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:25829 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:25829 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:25829 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG epsg:25829 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:25829 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG epsg:2583 0 OK 0x1.e8645b9245ae5p18 0x1.6b26f6d456e34p6 -0x1.1e7fda219p6 0x1.7ffffffffbc9fp4 -0x1.5c0ae595aaa34p-33 0x1.e713p-14 T +REG epsg:2583 1 OK -0x1.ae5cf6e814f5p15 -0x1.0ef486e684ec9p19 -0x1.6c1712883p6 0x1.3000000073c76p4 -0x1.3ffffffff7d98p2 0x1.f2a8p-14 F +REG epsg:2583 2 OK 0x1.01a50955e32bfp20 -0x1.0ef492fe0377ap19 -0x1.0bb070ab2p6 0x1.cfffffff87d81p4 -0x1.400000000913ap2 0x1.edcdp-14 F +REG epsg:2583 3 OK -0x1.ae58f5951c82p15 0x1.0f0b51a10a352p19 -0x1.33a2b75ffp6 0x1.300000006f67bp4 0x1.3fffffffb3412p2 0x1.de56p-14 F +REG epsg:2583 4 OK 0x1.01a501dd2ee78p20 0x1.0f0b2ccb8aec2p19 -0x1.a67a1b69cp5 0x1.cfffffff83d04p4 0x1.3fffffffa2eecp2 0x1.cf85p-14 F +REG epsg:25830 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:25830 1 OK -0x1.ad750e9eb001p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG epsg:25830 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.4p2 0x0.0p0 F +REG epsg:25830 3 OK -0x1.ad750e9eb001p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG epsg:25830 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 0x1.4p2 0x0.0p0 F +REG epsg:25831 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:25831 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep0 -0x1.4p2 0x0.0p0 F +REG epsg:25831 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG epsg:25831 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep0 0x1.4p2 0x0.0p0 F +REG epsg:25831 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG epsg:25832 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:25832 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:25832 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:25832 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:25832 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:25833 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:25833 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:25833 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:25833 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:25833 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:25834 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:25834 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:25834 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:25834 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:25834 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:25835 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:25835 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 -0x1.4p2 0x0.0p0 F +REG epsg:25835 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 -0x1.4p2 0x0.0p0 F +REG epsg:25835 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 0x1.4p2 0x0.0p0 F +REG epsg:25835 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 0x1.4p2 0x0.0p0 F +REG epsg:25836 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:25836 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:25836 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 -0x1.4p2 0x0.0p0 F +REG epsg:25836 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 0x1.4p2 0x0.0p0 F +REG epsg:25836 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 0x1.4p2 0x0.0p0 F +REG epsg:25837 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:25837 1 OK -0x1.ad750e9eafecp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 -0x1.4p2 0x0.0p0 F +REG epsg:25837 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 -0x1.4p2 0x0.0p0 F +REG epsg:25837 3 OK -0x1.ad750e9eafecp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 0x1.4p2 0x0.0p0 F +REG epsg:25837 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 0x1.4p2 0x0.0p0 F +REG epsg:25838 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:25838 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 -0x1.4p2 0x0.0p0 F +REG epsg:25838 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 -0x1.4p2 0x0.0p0 F +REG epsg:25838 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 0x1.4p2 0x0.0p0 F +REG epsg:25838 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:2584 0 OK 0x1.e863d81e9c8d7p18 0x1.6a2d118fde25ep6 -0x1.01a40f9d1p6 0x1.affffffffb6a6p4 -0x1.8479cdd1b311fp-33 0x1.e3f3p-14 T +REG epsg:2584 1 OK -0x1.ae5fe8ac9919p15 -0x1.0ef4790384b3cp19 -0x1.4ebcaa025p6 0x1.60000000734a7p4 -0x1.3ffffffffd269p2 0x1.f192p-14 F +REG epsg:2584 2 OK 0x1.01a4ddbc45d0fp20 -0x1.0ef487f2810b7p19 -0x1.df866456ap5 0x1.ffffffff877f8p4 -0x1.400000000e028p2 0x1.ebb8p-14 F +REG epsg:2584 3 OK -0x1.ae5bb9ad3b3dp15 0x1.0f0b36f738154p19 -0x1.16488fb2cp6 0x1.600000006f007p4 0x1.3fffffffae39dp2 0x1.da2ap-14 F +REG epsg:2584 4 OK 0x1.01a4d7b131fcep20 0x1.0f0b0f4a38ecfp19 -0x1.6ea055ffp5 0x1.ffffffff8396fp4 0x1.3fffffff9e5dp2 0x1.caa1p-14 F +REG epsg:2585 0 OK 0x1.e8633caebb681p18 0x1.69181c0de2017p6 -0x1.ca80ef55p5 0x1.dffffffffb178p4 -0x1.abd822e38f938p-33 0x1.e09p-14 T +REG epsg:2585 1 OK -0x1.ae639ef1f85ap15 -0x1.0ef46c570f444p19 -0x1.31b8345e9p6 0x1.9000000072d71p4 -0x1.40000000025c2p2 0x1.f023p-14 F +REG epsg:2585 2 OK 0x1.01a4ac521e6a4p20 -0x1.0ef47e0a5ff87p19 -0x1.a8dd14e12p5 0x1.17ffffffc399ep5 -0x1.4000000012ccap2 0x1.e969p-14 F +REG epsg:2585 3 OK -0x1.ae5f437a7466p15 0x1.0f0b1bbfc41c5p19 -0x1.f288c677ap5 0x1.900000006ea5bp4 0x1.3fffffffa951cp2 0x1.d5bep-14 F +REG epsg:2585 4 OK 0x1.01a4a7ab0e88ep20 0x1.0f0af14e6d357p19 -0x1.37f7cd458p5 0x1.17ffffffc1b6ep5 0x1.3fffffff99f4bp2 0x1.c593p-14 F +REG epsg:2586 0 OK 0x1.e86289afb7efp18 0x1.67e8d8a93528dp6 -0x1.92d1fb5f8p5 0x1.07fffffffd695p5 -0x1.d20a450caa51bp-33 0x1.dcfap-14 T +REG epsg:2586 1 OK -0x1.ae68171d4206p15 -0x1.0ef460ea08dccp19 -0x1.151e0dea6p6 0x1.c0000000726e9p4 -0x1.4000000007757p2 0x1.ee6dp-14 F +REG epsg:2586 2 OK 0x1.01a4753a1a53p20 -0x1.0ef4754c937f8p19 -0x1.738b4d7ecp5 0x1.2fffffffc37b4p5 -0x1.40000000176e8p2 0x1.e6e5p-14 F +REG epsg:2586 3 OK -0x1.ae6390810acfp15 0x1.0f0b000dc7353p19 -0x1.b9551c2b2p5 0x1.c00000006e58dp4 0x1.3fffffffa48cap2 0x1.d118p-14 F +REG epsg:2586 4 OK 0x1.01a471ec781a4p20 0x1.0f0ad2ed31b09p19 -0x1.02a6db39cp5 0x1.2fffffffc1aa8p5 0x1.3fffffff95b93p2 0x1.c06ep-14 F +REG epsg:2587 0 OK 0x1.e861bf9f2f548p18 0x1.66a01c311dc91p6 -0x1.5c62557dp5 0x1.1ffffffffd4e1p5 -0x1.f6f5671252ebdp-33 0x1.d938p-14 T +REG epsg:2587 1 OK -0x1.ae6d4e0b7a4p15 -0x1.0ef456c47597ep19 -0x1.f20490af2p5 0x1.f00000007211fp4 -0x1.400000000c6f7p2 0x1.ec6dp-14 F +REG epsg:2587 2 OK 0x1.01a4389ae2ec6p20 -0x1.0ef46dbf3d8c5p19 -0x1.3fb677a52p5 0x1.47ffffffc3636p5 -0x1.400000001be43p2 0x1.e43ap-14 F +REG epsg:2587 3 OK -0x1.ae689dbc47e9p15 0x1.0f0ae3f4b03c1p19 -0x1.811e43712p5 0x1.f00000006e1aap4 0x1.3fffffff9fed5p2 0x1.cc3ap-14 F +REG epsg:2587 4 OK 0x1.01a4369b25b54p20 0x1.0f0ab43bd76b9p19 -0x1.9da5d1774p4 0x1.47ffffffc1a65p5 0x1.3fffffff91abfp2 0x1.bb3fp-14 F +REG epsg:2588 0 OK 0x1.e860df0aee214p18 0x1.653ecd53f6ce3p6 -0x1.27582fbd8p5 0x1.37fffffffd3a7p5 -0x1.0d3fd0be14e2p-32 0x1.d553p-14 T +REG epsg:2588 1 OK -0x1.ae734013cddfp15 -0x1.0ef44ded73cbfp19 -0x1.baf1394c2p5 0x1.1000000038e13p5 -0x1.4000000011463p2 0x1.ea29p-14 F +REG epsg:2588 2 OK 0x1.01a3f69f027d5p20 -0x1.0ef46767aa68bp19 -0x1.0d82f177cp5 0x1.5fffffffc353p5 -0x1.40000000202a7p2 0x1.e173p-14 F +REG epsg:2588 3 OK -0x1.ae6e67a09a5ap15 0x1.0f0ac788365b7p19 -0x1.4a0badcb4p5 0x1.1000000036f62p5 0x1.3fffffff9b769p2 0x1.c73bp-14 F +REG epsg:2588 4 OK 0x1.01a3f5e0b75b4p20 0x1.0f0a954fe7a25p19 -0x1.3940a69fp4 0x1.5fffffffc1aadp5 0x1.3fffffff8dd05p2 0x1.b60dp-14 F +REG epsg:25884 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:25884 1 OK -0x1.ad750e7d869bp15 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:25884 2 OK 0x1.018fa873ec34ep20 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:25884 3 OK -0x1.ad750e7d869bp15 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:25884 4 OK 0x1.018fa873ec34ep20 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2589 0 OK 0x1.e85fe8908ca76p18 0x1.63c5e3fd48a72p6 -0x1.e7b182a2p4 0x1.4ffffffffd2e9p5 -0x1.1e48021b044d6p-32 0x1.d157p-14 T +REG epsg:2589 1 OK -0x1.ae79e90a2455p15 -0x1.0ef4466b370dap19 -0x1.8528ba9bap5 0x1.2800000038bffp5 -0x1.4000000015f58p2 0x1.e7b6p-14 F +REG epsg:2589 2 OK 0x1.01a3af74c6542p20 -0x1.0ef4624a4d05p19 -0x1.ba27e8898p4 0x1.77ffffffc34ap5 -0x1.40000000243d4p2 0x1.de95p-14 F +REG epsg:2589 3 OK -0x1.ae74ea1e137fp15 0x1.0f0aaadc4b37cp19 -0x1.1443ffa34p5 0x1.2800000036e6dp5 0x1.3fffffff972b4p2 0x1.c21cp-14 F +REG epsg:2589 4 OK 0x1.01a3afea98d2p20 0x1.0f0a763f14a25p19 -0x1.b0c94e6ap3 0x1.77ffffffc1b7dp5 0x1.3fffffff8a284p2 0x1.b0e5p-14 F +REG epsg:2590 0 OK 0x1.e85edcdd00683p18 0x1.623668a7cb3e6p6 -0x1.841058d8p4 0x1.67fffffffd2a7p5 -0x1.2e875424d023dp-32 0x1.cd5p-14 T +REG epsg:2590 1 OK -0x1.ae8144420cebp15 -0x1.0ef4404303d74p19 -0x1.50d0d162cp5 0x1.4000000038a5dp5 -0x1.400000001a79ep2 0x1.e519p-14 F +REG epsg:2590 2 OK 0x1.01a3634e1e495p20 -0x1.0ef45e6abbdafp19 -0x1.5d16f79a8p4 0x1.8fffffffc3485p5 -0x1.400000002819ap2 0x1.dbb3p-14 F +REG epsg:2590 3 OK -0x1.ae7c20a340c1p15 0x1.0f0a8e050cf0bp19 -0x1.bfd9ea564p4 0x1.4000000036dffp5 0x1.3fffffff930dep2 0x1.bcf1p-14 F +REG epsg:2590 4 OK 0x1.01a364e9e1c33p20 0x1.0f0a571f2a91cp19 -0x1.ed57255ep2 0x1.8fffffffc1cd5p5 0x1.3fffffff86b5ep2 0x1.abd9p-14 F +REG epsg:2591 0 OK 0x1.e85dbcac22b0dp18 0x1.609173a3cb546p6 -0x1.2412c9da8p4 0x1.7ffffffffd2eap5 -0x1.3df260615c2f8p-32 0x1.c947p-14 T +REG epsg:2591 1 OK -0x1.ae894c92073ep15 -0x1.0ef43b792bd75p19 -0x1.1e0e37c08p5 0x1.580000003893p5 -0x1.400000001ecfbp2 0x1.e256p-14 F +REG epsg:2591 2 OK 0x1.01a3126079b3cp20 -0x1.0ef45bcbae68cp19 -0x1.04145cdf8p4 0x1.a7ffffffc34e2p5 -0x1.400000002bbcbp2 0x1.d8dp-14 F +REG epsg:2591 3 OK -0x1.ae8406206131p15 0x1.0f0a7116b8037p19 -0x1.5a568fc98p4 0x1.5800000036e1bp5 0x1.3fffffff8f20fp2 0x1.b7cp-14 F +REG epsg:2591 4 OK 0x1.01a31513334a1p20 0x1.0f0a38060024dp19 -0x1.12aac276p1 0x1.a7ffffffc1eb5p5 0x1.3fffffff837b1p2 0x1.a6fp-14 F +REG epsg:2592 0 OK 0x1.e85c88c82cbaap18 0x1.5ed82c52758afp6 -0x1.8ff85f6p3 0x1.97fffffffd3a7p5 -0x1.4c7e552f9e203p-32 0x1.c54fp-14 T +REG epsg:2592 1 OK -0x1.ae91fc572249p15 -0x1.0ef438110ae8fp19 -0x1.da0916cf4p4 0x1.7000000038879p5 -0x1.4000000022f33p2 0x1.df84p-14 F +REG epsg:2592 2 OK 0x1.01a2bce4a1e74p20 -0x1.0ef45a6efb4abp19 -0x1.5ebd18f88p3 0x1.bfffffffc35b3p5 -0x1.400000002f22fp2 0x1.d5fdp-14 F +REG epsg:2592 3 OK -0x1.ae8c950af285p15 0x1.0f0a54259919p19 -0x1.f08a53798p3 0x1.7000000036ebfp5 0x1.3fffffff8b66dp2 0x1.b297p-14 F +REG epsg:2592 4 OK 0x1.01a2c09e93024p20 0x1.0f0a1909674b6p19 0x1.92f1ca28p1 0x1.bfffffffc2119p5 0x1.3fffffff8079ap2 0x1.a233p-14 F +REG epsg:2593 0 OK 0x1.e85b420929cf2p18 0x1.5d0bc8569131ap6 -0x1.c0349daep2 0x1.affffffffd4e2p5 -0x1.5a20fda461e89p-32 0x1.c169p-14 T +REG epsg:2593 1 OK -0x1.ae9b4d78f15ep15 -0x1.0ef4360d04badp19 -0x1.7bac694b8p4 0x1.8800000038838p5 -0x1.4000000026e1bp2 0x1.dca4p-14 F +REG epsg:2593 2 OK 0x1.01a26316925eap20 -0x1.0ef45a5596f13p19 -0x1.7cc3d8bbp2 0x1.d7ffffffc36f3p5 -0x1.40000000324a1p2 0x1.d33fp-14 F +REG epsg:2593 3 OK -0x1.ae95c76194fdp15 0x1.0f0a3745fec7fp19 -0x1.33d50ed8p3 0x1.8800000036fe8p5 0x1.3fffffff87e1dp2 0x1.ad7dp-14 F +REG epsg:2593 4 OK 0x1.01a267c743b84p20 0x1.0f09fa3f1de1cp19 0x1.0512fa738p3 0x1.d7ffffffc23f7p5 0x1.3fffffff7db3cp2 0x1.9dadp-14 F +REG epsg:25932 0 OK 0x1.e83f63ae94575p18 0x1.b99919c1db07dp22 -0x1.8721d4cacp5 0x1.2000000000001p3 -0x1.9p4 0x1.8p-29 F +REG epsg:25932 1 OK -0x1.fc82f4eb3bdp14 0x1.9702a38f8d951p22 -0x1.d3691ebc2p5 0x1.bdd68fcf51a3ep1 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:25932 2 OK 0x1.f8237b4ae2663p19 0x1.9702a38fac788p22 -0x1.00a79aff9p6 0x1.d08a5c0c2b973p3 -0x1.dfffffffffffap4 0x1.8p-29 F +REG epsg:25932 3 OK -0x1.2ffe0c21d687p16 0x1.dacc1a2a93519p22 -0x1.200597d6ep5 0x1.bdd68fcf51a39p1 -0x1.4p4 -0x1.0p-29 F +REG epsg:25932 4 OK 0x1.071f9292e9f2bp20 0x1.dacc1a2ab0b74p22 -0x1.51d32b138p5 0x1.d08a5c0c2b971p3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:2594 0 OK 0x1.e859e9545fa21p18 0x1.5b2d8abb3c4c4p6 -0x1.c8363d2p0 0x1.c7fffffffd695p5 -0x1.66d0c8670396fp-32 0x1.bda6p-14 T +REG epsg:2594 1 OK -0x1.aea5396dd307p15 -0x1.0ef4356e83206p19 -0x1.21489c774p4 0x1.a00000003886dp5 -0x1.400000002a973p2 0x1.d9bfp-14 F +REG epsg:2594 2 OK 0x1.01a205354ea0fp20 -0x1.0ef45b7f92f61p19 -0x1.3c3db9a8p0 0x1.efffffffc389cp5 -0x1.40000000352f2p2 0x1.d09cp-14 F +REG epsg:2594 3 OK -0x1.ae9f96b041eap15 0x1.0f0a1a8c2b54cp19 -0x1.fc46e74ep1 0x1.a00000003719dp5 0x1.3fffffff84938p2 0x1.a88ap-14 F +REG epsg:2594 4 OK 0x1.01a20acb9bd6p20 0x1.0f09dbbcbe70fp19 0x1.9be8671dp3 0x1.efffffffc275p5 0x1.3fffffff7b2abp2 0x1.9975p-14 F +REG epsg:2595 0 OK 0x1.e8587f9bad78cp18 0x1.593ec3114145bp6 0x1.9333ef56p1 0x1.dffffffffd8bcp5 -0x1.7284ce7fefb7fp-32 0x1.ba0fp-14 T +REG epsg:2595 1 OK -0x1.aeafb93f8771p15 -0x1.0ef43635f5179p19 -0x1.963a389dp3 0x1.b800000038918p5 -0x1.400000002e117p2 0x1.d6e4p-14 F +REG epsg:2595 2 OK 0x1.01a1a382b6104p20 -0x1.0ef45dec1e10ep19 0x1.959eb97ep1 0x1.03ffffffe1d54p6 -0x1.4000000037cfcp2 0x1.ce23p-14 F +REG epsg:2595 3 OK -0x1.aea9fc14d333p15 0x1.0f09fe0c467ccp19 0x1.6a06b4c8p0 0x1.b8000000373d5p5 0x1.3fffffff817e6p2 0x1.a3b5p-14 F +REG epsg:2595 4 OK 0x1.01a1a9ecd9a58p20 0x1.0f09bd97b1053p19 0x1.146971ddcp4 0x1.03ffffffe158dp6 0x1.3fffffff78df6p2 0x1.958bp-14 F +REG epsg:2596 0 OK 0x1.e85705dce26edp18 0x1.5740cc83a554p6 0x1.f1e47d2ap2 0x1.f7fffffffdb51p5 -0x1.7d34d9bed3961p-32 0x1.b6acp-14 T +REG epsg:2596 1 OK -0x1.aebac590135fp15 -0x1.0ef43862ce78cp19 -0x1.e5997b08p2 0x1.d000000038a34p5 -0x1.40000000314d3p2 0x1.d41ep-14 F +REG epsg:2596 2 OK 0x1.01a13e4355ab6p20 -0x1.0ef4619984aa1p19 0x1.d012c341p2 0x1.0fffffffe1e8ap6 -0x1.400000003a29ep2 0x1.cbdep-14 F +REG epsg:2596 3 OK -0x1.aeb4f043d7f9p15 0x1.0f09e1da4f50fp19 0x1.a153735bp2 0x1.d00000003768ep5 0x1.3fffffff7ea3bp2 0x1.9f23p-14 F +REG epsg:2596 4 OK 0x1.01a1456ef5854p20 0x1.0f099fe51c2b1p19 0x1.55b7c8814p4 0x1.0fffffffe17a3p6 0x1.3fffffff76d3cp2 0x1.91f5p-14 F +REG epsg:2597 0 OK 0x1.e8557d210b607p18 0x1.55350ce414bcap6 0x1.83010eb2p3 0x1.07fffffffef28p6 -0x1.86d96a5749f17p-32 0x1.b38ap-14 T +REG epsg:2597 1 OK -0x1.aec6569eeb26p15 -0x1.0ef43bf3885b9p19 -0x1.62edca96p1 0x1.e800000038bb9p5 -0x1.400000003447ep2 0x1.d172p-14 F +REG epsg:2597 2 OK 0x1.01a0d5be37f96p20 -0x1.0ef46685320d8p19 0x1.6001ba8f8p3 0x1.1bffffffe1fe7p6 -0x1.400000003c3bcp2 0x1.c9d2p-14 F +REG epsg:2597 3 OK -0x1.aec06b8db2a5p15 0x1.0f09c60a0e301p19 0x1.6ab6479dp3 0x1.e8000000379bep5 0x1.3fffffff7c054p2 0x1.9ad1p-14 F +REG epsg:2597 4 OK 0x1.01a0dd98723dep20 0x1.0f0982b9d6193p19 0x1.91b1653dcp4 0x1.1bffffffe19eap6 0x1.3fffffff7508ap2 0x1.8ec2p-14 F +REG epsg:2598 0 OK 0x1.e853e67bb8f2fp18 0x1.531cf3afd7cbdp6 0x1.014c4722p4 0x1.13ffffffff0d5p6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:2598 1 OK -0x1.aed2644e6315p15 -0x1.0ef440e5a2293p19 0x1.bc6c7294p0 0x1.000000001c6d3p6 -0x1.4000000036fe9p2 0x1.ceeep-14 F +REG epsg:2598 2 OK 0x1.01a06a3cb3314p20 -0x1.0ef46cabb239cp19 0x1.ccfc8c3d8p3 0x1.27ffffffe216cp6 -0x1.400000003e031p2 0x1.c801p-14 F +REG epsg:2598 3 OK -0x1.aecc65e3fd6bp15 0x1.0f09aaaf06e55p19 0x1.fafa6a1p3 0x1.000000001beb1p6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:2598 4 OK 0x1.01a072b22b872p20 0x1.0f09662a5611p19 0x1.c82c33684p4 0x1.27ffffffe1c5bp6 0x1.3fffffff737fp2 0x1.8bf9p-14 F +REG epsg:2599 0 OK 0x1.e852430a3e403p18 0x1.50f9f90e0093dp6 0x1.3baf9bab8p4 0x1.1fffffffff2adp6 -0x1.96e5cb4ec6756p-32 0x1.ae27p-14 T +REG epsg:2599 1 OK -0x1.aedee62961a6p15 -0x1.0ef44735a35dep19 0x1.7b5211cap2 0x1.0c0000001c7fap6 -0x1.40000000396fap2 0x1.cc97p-14 F +REG epsg:2599 2 OK 0x1.019ffc0a35c42p20 -0x1.0ef47408b44dap19 0x1.1756afee8p4 0x1.33ffffffe2311p6 -0x1.400000003f7edp2 0x1.c67bp-14 F +REG epsg:2599 3 OK -0x1.aed8d6df31efp15 0x1.0f098fdc6af84p19 0x1.408873f9p4 0x1.0c0000001c0b9p6 0x1.3fffffff7782ap2 0x1.9317p-14 F +REG epsg:2599 4 OK 0x1.01a0050722e7cp20 0x1.0f094a4aa605p19 0x1.f901f96b4p4 0x1.33ffffffe1eefp6 0x1.3fffffff7237dp2 0x1.89ap-14 F +REG epsg:2600 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:2600 1 OK -0x1.ae5322368f2fp15 -0x1.0ef13b755de07p19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:2600 2 OK 0x1.01969911b4798p20 -0x1.0ef13b755de07p19 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:2600 3 OK -0x1.ae5322368f2fp15 0x1.0ef13b755de07p19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:2600 4 OK 0x1.01969911b4798p20 0x1.0ef13b755de07p19 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:2601 0 OK 0x1.e85093f2e8aa7p18 0x1.4ecd9cc7863f7p6 0x1.70818d5c8p4 0x1.2bffffffff4abp6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:2601 1 OK -0x1.aeebd3694e46p15 -0x1.0ef44edf1df97p19 0x1.3938e4c3p3 0x1.180000001c94ap6 -0x1.400000003b98fp2 0x1.ca76p-14 F +REG epsg:2601 2 OK 0x1.019f8b741174ap20 -0x1.0ef47c970d8eep19 0x1.4267d52c8p4 0x1.3fffffffe24cep6 -0x1.4000000040ad6p2 0x1.c53fp-14 F +REG epsg:2601 3 OK -0x1.aee5b5c48e3cp15 0x1.0f0975a50c35cp19 0x1.7e4dd6398p4 0x1.180000001c2efp6 0x1.3fffffff75a11p2 0x1.8fc2p-14 F +REG epsg:2601 4 OK 0x1.019f94e44b1afp20 0x1.0f092f2e54891p19 0x1.120839ccp5 0x1.3fffffffe219fp6 0x1.3fffffff71339p2 0x1.87bdp-14 F +REG epsg:2602 0 OK 0x1.e84eda6431628p18 0x1.4c99653a07032p6 0x1.9f9d0cbbp4 0x1.37ffffffff6c8p6 -0x1.a27cee4b40be9p-32 0x1.aa22p-14 T +REG epsg:2602 1 OK -0x1.aef922fc3909p15 -0x1.0ef457dcb19ap19 0x1.a9e66fd28p3 0x1.240000001cac2p6 -0x1.400000003d786p2 0x1.c892p-14 F +REG epsg:2602 2 OK 0x1.019f18c94518fp20 -0x1.0ef48650bd0b5p19 0x1.67937e39cp4 0x1.4bffffffe26a4p6 -0x1.40000000418dep2 0x1.c454p-14 F +REG epsg:2602 3 OK -0x1.aef2f98c346bp15 0x1.0f095c1b4f7c2p19 0x1.b6a204868p4 0x1.240000001c552p6 0x1.3fffffff74009p2 0x1.8cd7p-14 F +REG epsg:2602 4 OK 0x1.019f22985212fp20 0x1.0f0914e8671b1p19 0x1.249cb617ep5 0x1.4bffffffe2468p6 0x1.3fffffff7072dp2 0x1.8652p-14 F +REG epsg:2603 0 OK 0x1.e84d1793e92fap18 0x1.4a5ede45ed732p6 0x1.c8e10c6a8p4 0x1.43ffffffff8ffp6 -0x1.a691e019f05bap-32 0x1.a8aep-14 T +REG epsg:2603 1 OK -0x1.af06cb8b38a2p15 -0x1.0ef462280f43bp19 0x1.07b14d7d8p4 0x1.300000001cc5ep6 -0x1.400000003f0cap2 0x1.c6f4p-14 F +REG epsg:2603 2 OK 0x1.019ea45a452b7p20 -0x1.0ef4912eefce8p19 0x1.86bf9696p4 0x1.57ffffffe2886p6 -0x1.40000000421ffp2 0x1.c3b8p-14 F +REG epsg:2603 3 OK -0x1.af0098e7816ep15 0x1.0f0943511fd52p19 0x1.e95d79248p4 0x1.300000001c7dcp6 0x1.3fffffff72a23p2 0x1.8a57p-14 F +REG epsg:2603 4 OK 0x1.019eae7369c44p20 0x1.0f08fb8b4ccbbp19 0x1.34316849ap5 0x1.57ffffffe2741p6 0x1.3fffffff6ff61p2 0x1.8566p-14 F +REG epsg:2604 0 OK 0x1.e84b4cbe5f1ccp18 0x1.481f9838b940fp6 0x1.ec30985bcp4 0x1.4fffffffffb49p6 -0x1.a97e511f93032p-32 0x1.a7a3p-14 T +REG epsg:2604 1 OK -0x1.af14c380f71ap15 -0x1.0ef46db9fdcbep19 0x1.34b318d2p4 0x1.3c0000001ce13p6 -0x1.400000004053fp2 0x1.c59dp-14 F +REG epsg:2604 2 OK 0x1.019e2e78c35e8p20 -0x1.0ef49d2a05abdp19 0x1.9fd63f28cp4 0x1.63ffffffe2a7p6 -0x1.400000004262bp2 0x1.c371p-14 F +REG epsg:2604 3 OK -0x1.af0e8a4793ep15 0x1.0f092b57e1e2fp19 0x1.0b2e4dcf8p5 0x1.3c0000001ca84p6 0x1.3fffffff7186cp2 0x1.8849p-14 F +REG epsg:2604 4 OK 0x1.019e38c70fe7p20 0x1.0f08e328d14e8p19 0x1.40bb61c88p5 0x1.63ffffffe2a23p6 0x1.3fffffff6fbd9p2 0x1.84fap-14 F +REG epsg:2605 0 OK 0x1.e8497b2582935p18 0x1.45dd26b42e0c5p6 0x1.04b9750fp5 0x1.5bffffffffda2p6 -0x1.ab403431476cdp-32 0x1.a702p-14 T +REG epsg:2605 1 OK -0x1.af2301106aabp15 -0x1.0ef47a8a5eeccp19 0x1.5bd905cf4p4 0x1.480000001cfe2p6 -0x1.40000000414ddp2 0x1.c494p-14 F +REG epsg:2605 2 OK 0x1.019db777754bep20 -0x1.0ef4aa399698ap19 0x1.b2c5dd98cp4 0x1.6fffffffe2c5ep6 -0x1.400000004255fp2 0x1.c37cp-14 F +REG epsg:2605 3 OK -0x1.af1cc3e400bdp15 0x1.0f09144067adbp19 0x1.1ebfecdecp5 0x1.480000001cd46p6 0x1.3fffffff70aeap2 0x1.86bep-14 F +REG epsg:2605 4 OK 0x1.019dc1e5d4cbp20 0x1.0f08cbd210809p19 0x1.4a31d65b4p5 0x1.6fffffffe2d09p6 0x1.3fffffff6fc99p2 0x1.8511p-14 F +REG epsg:2606 0 OK 0x1.e847a410017c5p18 0x1.43991f932d27ap6 0x1.1049bd1fp5 0x1.68p6 -0x1.abd64da0ea87dp-32 0x1.a6cfp-14 T +REG epsg:2606 1 OK -0x1.af317a3bb6d1p15 -0x1.0ef4889034f5ap19 0x1.7d079cbd4p4 0x1.540000001d1c1p6 -0x1.4000000041f92p2 0x1.c3e1p-14 F +REG epsg:2606 2 OK 0x1.019d3fa9da6dap20 -0x1.0ef4b85478914p19 0x1.bf8128a9cp4 0x1.7bffffffe2e48p6 -0x1.4000000041f9cp2 0x1.c3e1p-14 F +REG epsg:2606 3 OK -0x1.af2b3bc1b0a4p15 0x1.0f08fe1ae4d6bp19 0x1.2f55ded44p5 0x1.540000001d01ap6 0x1.3fffffff701a4p2 0x1.85a4p-14 F +REG epsg:2606 4 OK 0x1.019d4a23216a1p20 0x1.0f08b5976a66p19 0x1.508e22564p5 0x1.7bffffffe2fe9p6 0x1.3fffffff7019dp2 0x1.85a6p-14 F +REG epsg:2607 0 OK 0x1.e845c8c8631ebp18 0x1.415519cd00c9dp6 0x1.18c107564p5 0x1.740000000026p6 -0x1.ab40342ee8834p-32 0x1.a703p-14 T +REG epsg:2607 1 OK -0x1.af4024db2dc5p15 -0x1.0ef497c1a91aep19 0x1.98279585cp4 0x1.600000001d3a8p6 -0x1.4000000042554p2 0x1.c37ap-14 F +REG epsg:2607 2 OK 0x1.019cc764018c6p20 -0x1.0ef4c770c607dp19 0x1.c5ff3187cp4 0x1.87ffffffe3025p6 -0x1.40000000414e6p2 0x1.c497p-14 F +REG epsg:2607 3 OK -0x1.af39e7b9dfd4p15 0x1.0f08e8f6e33b5p19 0x1.3ce480982p5 0x1.600000001d2fap6 0x1.3fffffff6fca1p2 0x1.850dp-14 F +REG epsg:2607 4 OK 0x1.019cd1d2fce8dp20 0x1.0f08a08877afp19 0x1.53cbcf428p5 0x1.87ffffffe32bdp6 0x1.3fffffff70aep2 0x1.86bfp-14 F +REG epsg:2608 0 OK 0x1.e843ea9c20376p18 0x1.3f12ac57e03dep6 0x1.1e1963116p5 0x1.80000000004b8p6 -0x1.a97e511ad5302p-32 0x1.a7a3p-14 T +REG epsg:2608 1 OK -0x1.af4ef6a47085p15 -0x1.0ef4a814125c7p19 0x1.ad25e80d4p4 0x1.6c0000001d597p6 -0x1.4000000042622p2 0x1.c36fp-14 F +REG epsg:2608 2 OK 0x1.019c4efa4dca1p20 -0x1.0ef4d783e4d4fp19 0x1.c63b6a10cp4 0x1.93ffffffe31f5p6 -0x1.400000004054cp2 0x1.c59fp-14 F +REG epsg:2608 3 OK -0x1.af48bd813d79p15 0x1.0f08d4e3380ddp19 0x1.47624f0eap5 0x1.6c0000001d5ep6 0x1.3fffffff6fbdfp2 0x1.84f8p-14 F +REG epsg:2608 4 OK 0x1.019c5949d1a3p20 0x1.0f088cb3fec6ep19 0x1.53e896ffp5 0x1.93ffffffe357fp6 0x1.3fffffff71863p2 0x1.884fp-14 F +REG epsg:2609 0 OK 0x1.e8420adab915ep18 0x1.3cd36d0b752bdp6 0x1.204f103bep5 0x1.8c00000000703p6 -0x1.a691e01532885p-32 0x1.a8b2p-14 T +REG epsg:2609 1 OK -0x1.af5de531a6ffp15 -0x1.0ef4b97bfd00bp19 0x1.bbf3d986p4 0x1.780000001d782p6 -0x1.40000000421f7p2 0x1.c3b5p-14 F +REG epsg:2609 2 OK 0x1.019bd6c13b6c6p20 -0x1.0ef4e8828da81p19 0x1.c035a801cp4 0x1.9fffffffe33acp6 -0x1.400000003f0d1p2 0x1.c6f5p-14 F +REG epsg:2609 3 OK -0x1.af57b2af2451p15 0x1.0f08c1edf96f3p19 0x1.4ec7edc54p5 0x1.780000001d8c3p6 0x1.3fffffff6ff6ap2 0x1.8564p-14 F +REG epsg:2609 4 OK 0x1.019be0dc31f28p20 0x1.0f087a27e976p19 0x1.50e4655bp5 0x1.9fffffffe3828p6 0x1.3fffffff72a1ep2 0x1.8a58p-14 F +REG epsg:2610 0 OK 0x1.e8402ad4ca3a7p18 0x1.3a98ef842a153p6 0x1.1f6081efp5 0x1.980000000093ap6 -0x1.a27cee4682eb7p-32 0x1.aa24p-14 T +REG epsg:2610 1 OK -0x1.af6ce608cb46p15 -0x1.0ef4cbed329cdp19 0x1.c48706cc4p4 0x1.840000001d964p6 -0x1.40000000418d4p2 0x1.c452p-14 F +REG epsg:2610 2 OK 0x1.019b5f0d2498p20 -0x1.0ef4fa60d3f0ep19 0x1.b3f2251b8p4 0x1.abffffffe3546p6 -0x1.400000003d79p2 0x1.c895p-14 F +REG epsg:2610 3 OK -0x1.af66bcc4e81p15 0x1.0f08b024748c3p19 0x1.53102c1cap5 0x1.840000001db9ap6 0x1.3fffffff70735p2 0x1.8652p-14 F +REG epsg:2610 4 OK 0x1.019b68de9cdd8p20 0x1.0f0868f13b205p19 0x1.4ac158218p5 0x1.abffffffe3ab2p6 0x1.3fffffff74006p2 0x1.8cd8p-14 F +REG epsg:2611 0 OK 0x1.e83e4bdb203b8p18 0x1.3864c408098e7p6 0x1.1b4e5f8cp5 0x1.a400000000b58p6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:2611 1 OK -0x1.af7beea302bp15 -0x1.0ef4df5ac2a6p19 0x1.c6d96bacp4 0x1.900000001db39p6 -0x1.4000000040acap2 0x1.c53fp-14 F +REG epsg:2611 2 OK 0x1.019ae832062a6p20 -0x1.0ef50d122e3cdp19 0x1.a1797c24p4 0x1.b7ffffffe36cp6 -0x1.400000003b999p2 0x1.ca79p-14 F +REG epsg:2611 3 OK -0x1.af75d1353191p15 0x1.0f089f9324494p19 0x1.543808ebep5 0x1.900000001de64p6 0x1.3fffffff7133bp2 0x1.87bep-14 F +REG epsg:2611 4 OK 0x1.019af1a542d1p20 0x1.0f08591c07a41p19 0x1.4183bd9ecp5 0x1.b7ffffffe3d15p6 0x1.3fffffff75a0cp2 0x1.8fc4p-14 F +REG epsg:2612 0 OK 0x1.e83c6f3dcb7b5p18 0x1.3638766df4ac2p6 0x1.141b8444ap5 0x1.b000000000d55p6 -0x1.96e5cb4ec6754p-32 0x1.ae29p-14 T +REG epsg:2612 1 OK -0x1.af8af47400a8p15 -0x1.0ef4f3b70b856p19 0x1.c2e96717p4 0x1.9c0000001dcf9p6 -0x1.400000003f7ep2 0x1.c67cp-14 F +REG epsg:2612 2 OK 0x1.019a728344c8dp20 -0x1.0ef520897f022p19 0x1.88d8a2e2p4 0x1.c3ffffffe3813p6 -0x1.4000000039708p2 0x1.cc99p-14 F +REG epsg:2612 3 OK -0x1.af84e56b663fp15 0x1.0f089045a881ap19 0x1.523eb49bep5 0x1.9c0000001e117p6 0x1.3fffffff72384p2 0x1.899ap-14 F +REG epsg:2612 4 OK 0x1.019a7b83ca90ep20 0x1.0f084ab36ae09p19 0x1.3532119aap5 0x1.c3ffffffe3f5p6 0x1.3fffffff7782ap2 0x1.9316p-14 F +REG epsg:2613 0 OK 0x1.e83a964b34717p18 0x1.34158d07f56f1p6 0x1.09ccfd192p5 0x1.bc00000000f2ep6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:2613 1 OK -0x1.af99ecf16cbep15 -0x1.0ef508f3c4276p19 0x1.b8b9bc51p4 0x1.a80000001de9ep6 -0x1.400000003e023p2 0x1.c803p-14 F +REG epsg:2613 2 OK 0x1.0199fe537261bp20 -0x1.0ef534b91dd34p19 0x1.6a20e103p4 0x1.cfffffffe393ap6 -0x1.4000000036ff7p2 0x1.ceefp-14 F +REG epsg:2613 3 OK -0x1.af93eed31453p15 0x1.0f088246bddeep19 0x1.4d2591bbap5 0x1.a80000001e3acp6 0x1.3fffffff737f6p2 0x1.8bf6p-14 F +REG epsg:2613 4 OK 0x1.019a06cd16891p20 0x1.0f083dc180ebbp19 0x1.25d4f8cd2p5 0x1.cfffffffe415ap6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:2614 0 OK 0x1.e838c24f310a9p18 0x1.31fd87916fd4p6 0x1.f8d40aa1p4 0x1.c8000000010dbp6 -0x1.86d96a528c1e5p-32 0x1.b38dp-14 T +REG epsg:2614 1 OK -0x1.afa8cd9a4758p15 -0x1.0ef51f020601dp19 0x1.a85190f8p4 0x1.b40000001e023p6 -0x1.400000003c3aap2 0x1.c9d1p-14 F +REG epsg:2614 2 OK 0x1.01998bf414444p20 -0x1.0ef54992e0f39p19 0x1.4567c4p4 0x1.dbffffffe3a3p6 -0x1.4000000034488p2 0x1.d174p-14 F +REG epsg:2614 3 OK -0x1.afa2e2df5e06p15 0x1.0f0875a03651bp19 0x1.44f034042p5 0x1.b40000001e61dp6 0x1.3fffffff7508fp2 0x1.8ecp-14 F +REG epsg:2614 4 OK 0x1.019993d30aa92p20 0x1.0f08324f5efap19 0x1.13773accp5 0x1.dbffffffe432bp6 0x1.3fffffff7c056p2 0x1.9ad2p-14 F +REG epsg:2615 0 OK 0x1.e836f4921bed2p18 0x1.2ff1de21f173ap6 0x1.d7f802c48p4 0x1.d400000001258p6 -0x1.7d34d9c5f0528p-32 0x1.b6acp-14 T +REG epsg:2615 1 OK -0x1.afb78bfe4852p15 -0x1.0ef535d257872p19 0x1.91bc68028p4 0x1.c00000001e184p6 -0x1.400000003a293p2 0x1.cbddp-14 F +REG epsg:2615 2 OK 0x1.01991bb569ed3p20 -0x1.0ef55f082746ep19 0x1.1ac70ffbp4 0x1.e7ffffffe3af6p6 -0x1.40000000314dep2 0x1.d422p-14 F +REG epsg:2615 3 OK -0x1.afb1b71260dap15 0x1.0f086a5af22d9p19 0x1.39a45dd72p5 0x1.c00000001e864p6 0x1.3fffffff76d4p2 0x1.91f3p-14 F +REG epsg:2615 4 OK 0x1.019922e652f4bp20 0x1.0f0828650cff6p19 0x1.fc4b74fcp4 0x1.e7ffffffe44c4p6 0x1.3fffffff7ea3cp2 0x1.9f2ap-14 F +REG epsg:2616 0 OK 0x1.e8352e57ee186p18 0x1.2df400255c648p6 0x1.b11cf0c54p4 0x1.e0000000013a1p6 -0x1.7284ce78d2fb5p-32 0x1.ba13p-14 T +REG epsg:2616 1 OK -0x1.afc61dc53182p15 -0x1.0ef54d54b700dp19 0x1.750a19b18p4 0x1.cc0000001e2bap6 -0x1.4000000037cecp2 0x1.ce24p-14 F +REG epsg:2616 2 OK 0x1.0198ade634b94p20 -0x1.0ef57509e2944p19 0x1.d4b95b558p3 0x1.f3ffffffe3b87p6 -0x1.400000002e126p2 0x1.d6e6p-14 F +REG epsg:2616 3 OK -0x1.afc06104919p15 0x1.0f08607ed9eeap19 0x1.2b49fc35ap5 0x1.cc0000001ea7dp6 0x1.3fffffff78df9p2 0x1.9586p-14 F +REG epsg:2616 4 OK 0x1.0198b4562ae84p20 0x1.0f082009800d2p19 0x1.cbdeda194p4 0x1.f3ffffffe4621p6 0x1.3fffffff817eap2 0x1.a3bbp-14 F +REG epsg:2617 0 OK 0x1.e83370df5b9eep18 0x1.2c05535a26509p6 0x1.845e17d3cp4 0x1.ec000000014b6p6 -0x1.66d0c86245c3cp-32 0x1.bda9p-14 T +REG epsg:2617 1 OK -0x1.afd478b61056p15 -0x1.0ef56578a5cb2p19 0x1.524ec86bp4 0x1.d80000001e3cp6 -0x1.40000000352dfp2 0x1.d09dp-14 F +REG epsg:2617 2 OK 0x1.019842d380a8dp20 -0x1.0ef58b88a2155p19 0x1.68952acdp3 0x1.ffffffffe3bdcp6 -0x1.400000002a98ap2 0x1.d9bdp-14 F +REG epsg:2617 3 OK -0x1.afced66c08acp15 0x1.0f085812d8ad7p19 0x1.19eb21306p5 0x1.d80000001ec64p6 0x1.3fffffff7b2a8p2 0x1.9974p-14 F +REG epsg:2617 4 OK 0x1.0198487025e46p20 0x1.0f081942956f3p19 0x1.95ca9ed6cp4 0x1.ffffffffe4741p6 0x1.3fffffff84943p2 0x1.a889p-14 F +REG epsg:2618 0 OK 0x1.e831bd60f419fp18 0x1.2a2732d66074dp6 0x1.51dadd0ccp4 0x1.f80000000158ep6 -0x1.5a20fd9fa4155p-32 0x1.c16ep-14 T +REG epsg:2618 1 OK -0x1.afe292be69abp15 -0x1.0ef57e2d33e6p19 0x1.29a2d29fp4 0x1.e40000001e498p6 -0x1.400000003248fp2 0x1.d33bp-14 F +REG epsg:2618 2 OK 0x1.0197dac86e568p20 -0x1.0ef5a2749d4b5p19 0x1.e2dadd2dp2 0x1.05fffffff1dfcp7 -0x1.4000000026e28p2 0x1.dca9p-14 F +REG epsg:2618 3 OK -0x1.afdd0d23ba16p15 0x1.0f08511cd7443p19 0x1.0593fcd6cp5 0x1.e40000001ee0fp6 0x1.3fffffff7db3cp2 0x1.9db1p-14 F +REG epsg:2618 4 OK 0x1.0197df7ff8c3bp20 0x1.0f0814150e8fep19 0x1.5a34b4cfcp4 0x1.05fffffff240dp7 0x1.3fffffff87e25p2 0x1.ad8p-14 F +REG epsg:2619 0 OK 0x1.e830150e47619p18 0x1.285aee1438787p6 0x1.19b6b171p4 0x1.0200000000b16p7 -0x1.4c7e5531fd09ap-32 0x1.c55p-14 T +REG epsg:2619 1 OK -0x1.aff061f94af1p15 -0x1.0ef597610bd72p19 0x1.f6458361p3 0x1.f00000001e535p6 -0x1.400000002f21cp2 0x1.d5fcp-14 F +REG epsg:2619 2 OK 0x1.0197760dfe394p20 -0x1.0ef5b9bdbf127p19 0x1.be5704ecp1 0x1.0bfffffff1deep7 -0x1.4000000022f46p2 0x1.df87p-14 F +REG epsg:2619 3 OK -0x1.afeafb3292b8p15 0x1.0f084ba1b828fp19 0x1.dca5a952cp4 0x1.f00000001ef81p6 0x1.3fffffff8079ap2 0x1.a232p-14 F +REG epsg:2619 4 OK 0x1.019779cf44bcfp20 0x1.0f0810848da07p19 0x1.1946eaba8p4 0x1.0bfffffff245ap7 0x1.3fffffff8b67bp2 0x1.b297p-14 F +REG epsg:26191 0 OK 0x1.e822f23d3826fp18 0x1.2540963aca163p18 -0x1.79a036748p5 -0x1.599999999999ap2 0x1.0a6666666662ap5 -0x1.0p-29 F +REG epsg:26191 1 OK -0x1.5a095eb30bc38p16 -0x1.d02d113448a8cp17 -0x1.cc1a98664p5 -0x1.6c3b4ece0123dp3 0x1.c4ccccccccc0fp4 0x0.0p0 F +REG epsg:26191 2 OK 0x1.09b21191b144ap20 -0x1.d02e34784bddp17 -0x1.52e549f47p6 0x1.2a1b534678a0ep-1 0x1.c4ccccccccc09p4 0x0.0p0 F +REG epsg:26191 3 OK -0x1.866552744e4ep14 0x1.a91bdd10b6cd4p19 -0x1.12920c198p3 -0x1.6c3b4ece0123cp3 0x1.3266666666644p5 0x1.0p-30 F +REG epsg:26191 4 OK 0x1.f456182f9f6dfp19 0x1.a91c2497ffc9fp19 -0x1.06aa78a5ap5 0x1.2a1b534678a0cp-1 0x1.3266666666641p5 0x1.8p-29 F +REG epsg:26192 0 OK 0x1.e822f24f3edf1p18 0x1.253af855852d1p18 -0x1.03176ecc4p6 -0x1.5999999999999p2 0x1.db33333333283p4 0x0.0p0 F +REG epsg:26192 1 OK -0x1.49837313739dp16 -0x1.d42e27c2a4158p17 -0x1.23c4bd50ep6 -0x1.64ff6ec44c139p3 0x1.8b3333333324bp4 0x0.0p0 F +REG epsg:26192 2 OK 0x1.08a9b28f79dc4p20 -0x1.d42f4ad709c4cp17 -0x1.8fd9397bdp6 0x1.6cbaa5564f3fdp-2 0x1.8b33333333248p4 -0x1.0p-30 F +REG epsg:26192 3 OK -0x1.c784c21b404p14 0x1.a804f210a9481p19 -0x1.bb78ba094p4 -0x1.64ff6ec44c13ap3 0x1.1599999999964p5 0x1.0p-29 F +REG epsg:26192 4 OK 0x1.f65f1462532a9p19 0x1.a80539b817641p19 -0x1.a15824298p5 0x1.6cbaa5564f406p-2 0x1.1599999999964p5 0x1.0p-30 F +REG epsg:26193 0 OK 0x1.24eebc9bc256ep20 0x1.86dc35181b1fcp18 -0x1.43237c865p6 -0x1.599999999999ap2 0x1.a1999999998c1p4 -0x1.0p-30 F +REG epsg:26193 1 OK 0x1.2e88ea6850be3p19 -0x1.148dc77bdbb64p17 -0x1.59b8cd4b7p6 -0x1.5ef7df1d0876bp3 0x1.519999999988cp4 0x0.0p0 F +REG epsg:26193 2 OK 0x1.b29905ee7fd42p20 -0x1.148eea5ef0bfcp17 -0x1.c516cd1bep6 0x1.579160dbb741ap-3 0x1.5199999999891p4 -0x1.0p-30 F +REG epsg:26193 3 OK 0x1.45ace4c361b48p19 0x1.d7d0392d175f9p19 -0x1.6dc80371p5 -0x1.5ef7df1d08769p3 0x1.f19999999990ap4 -0x1.0p-29 F +REG epsg:26193 4 OK 0x1.a70705234106ap20 0x1.d7d080f0f0749p19 -0x1.196e5e869p6 0x1.579160dbb73f6p-3 0x1.f1999999998fep4 -0x1.0p-29 F +REG epsg:26194 0 OK 0x1.24eebc91db7fp20 0x1.86dc35587696dp18 -0x1.43237c865p6 -0x1.599999999999ap2 0x1.a1999999998c1p4 -0x1.0p-30 F +REG epsg:26194 1 OK 0x1.2e87bb7889a58p19 -0x1.14923232c8d94p17 -0x1.59b8cd4b7p6 -0x1.5ef7df1d0876bp3 0x1.519999999988cp4 0x0.0p0 F +REG epsg:26194 2 OK 0x1.b2999d5297bdap20 -0x1.1493551714d2cp17 -0x1.c516cd1bep6 0x1.579160dbb73a7p-3 0x1.5199999999891p4 -0x1.0p-30 F +REG epsg:26194 3 OK 0x1.45abce8fe6aaep19 0x1.d7d160bc39759p19 -0x1.6dc80371p5 -0x1.5ef7df1d08769p3 0x1.f19999999990ap4 -0x1.0p-29 F +REG epsg:26194 4 OK 0x1.a70790292f0b2p20 0x1.d7d1a8805f40cp19 -0x1.196e5e869p6 0x1.579160dbb73f6p-3 0x1.f1999999998fep4 -0x1.0p-29 F +REG epsg:26195 0 OK 0x1.6e2cbc906d3b1p20 0x1.86d466bfa1a68p18 -0x1.7bd9cba66p6 -0x1.5999999999999p2 0x1.67ffffffffefbp4 -0x1.0p-30 F +REG epsg:26195 1 OK 0x1.c2d2caca67cd6p19 -0x1.180a70211a168p17 -0x1.86f8616dfp6 -0x1.59fb95a35d029p3 0x1.17ffffffffeep4 0x0.0p0 F +REG epsg:26195 2 OK 0x1.faf0155fe2a7cp20 -0x1.180b92d42f324p17 -0x1.f1aa591dfp6 0x1.87f0270da410bp-7 0x1.17ffffffffedfp4 0x0.0p0 F +REG epsg:26195 3 OK 0x1.d661c581a27a2p19 0x1.d6d66f8764d32p19 -0x1.f250f61f6p5 -0x1.59fb95a35d02bp3 0x1.b7fffffffff3dp4 0x0.0p0 F +REG epsg:26195 4 OK 0x1.f12894f55c755p20 0x1.d6d6b76547276p19 -0x1.5c63b3b2ap6 0x1.87f0270da3eb4p-7 0x1.b7fffffffff35p4 0x0.0p0 F +REG epsg:2620 0 OK 0x1.e82e79110f27ap18 0x1.26a1c8069cdc7p6 0x1.b831f2148p3 0x1.0800000000b47p7 -0x1.3df2605efd45ep-32 0x1.c94ap-14 T +REG epsg:2620 1 OK -0x1.affddcb63a7ap15 -0x1.0ef5b1027ed28p19 0x1.8dde6bda8p3 0x1.fc0000001e5a4p6 -0x1.400000002bbb6p2 0x1.d8d3p-14 F +REG epsg:2620 2 OK 0x1.019714eadd71cp20 -0x1.0ef5d153b0e7bp19 -0x1.c96c3078p-1 0x1.11fffffff1dcp7 -0x1.400000001ed0fp2 0x1.e259p-14 F +REG epsg:2620 3 OK -0x1.aff896d27875p15 0x1.0f0847a554002p19 0x1.a86ff3348p4 0x1.fc0000001f0b4p6 0x1.3fffffff837acp2 0x1.a6f1p-14 F +REG epsg:2620 4 OK 0x1.019717a563bbp20 0x1.0f080e93930d1p19 0x1.a65d9e27p3 0x1.11fffffff2484p7 0x1.3fffffff8f21bp2 0x1.b7c5p-14 F +REG epsg:2621 0 OK 0x1.e82cea8a5e1f1p18 0x1.24fcf636aa084p6 0x1.3259de8fp3 0x1.0e00000000b55p7 -0x1.2e8754201250cp-32 0x1.cd51p-14 T +REG epsg:2621 1 OK -0x1.b00af9800488p15 -0x1.0ef5caff9121cp19 0x1.1a599f58p3 0x1.040000000f2eap7 -0x1.4000000028183p2 0x1.dbb5p-14 F +REG epsg:2621 2 OK 0x1.0196b7a33439bp20 -0x1.0ef5e925e660bp19 -0x1.656b8856p2 0x1.17fffffff1d77p7 -0x1.400000001a7b1p2 0x1.e51cp-14 F +REG epsg:2621 3 OK -0x1.b005d677243ap15 0x1.0f08452a76e9cp19 0x1.6eab792ccp4 0x1.040000000f8d5p7 0x1.3fffffff86b5ap2 0x1.abdbp-14 F +REG epsg:2621 4 OK 0x1.0196b947364d8p20 0x1.0f080e437bba1p19 0x1.103b2051p3 0x1.17fffffff248bp7 0x1.3fffffff930ecp2 0x1.bcf1p-14 F +REG epsg:2622 0 OK 0x1.e82b6a91d533p18 0x1.236d9fea7ed74p6 0x1.448622ap2 0x1.1400000000b45p7 -0x1.1e480216467a4p-32 0x1.d158p-14 T +REG epsg:2622 1 OK -0x1.b017af235d22p15 -0x1.0ef5e54606c27p19 0x1.38105667p2 0x1.0a0000000f2e3p7 -0x1.40000000243cp2 0x1.de95p-14 F +REG epsg:2622 2 OK 0x1.01965e78760abp20 -0x1.0ef60123a8c72p19 -0x1.525ded6d8p3 0x1.1dfffffff1d1p7 -0x1.4000000015f6ep2 0x1.e7b9p-14 F +REG epsg:2622 3 OK -0x1.b012b0d4d5f9p15 0x1.0f084432de898p19 0x1.2f80c3604p4 0x1.0a0000000f92bp7 0x1.3fffffff8a27bp2 0x1.b0e8p-14 F +REG epsg:2622 4 OK 0x1.01965ef6f3586p20 0x1.0f080f94800fdp19 0x1.c23eccacp1 0x1.1dfffffff2472p7 0x1.3fffffff972c6p2 0x1.c21dp-14 F +REG epsg:2623 0 OK 0x1.e829fa34df4bbp18 0x1.21f4dd5610fbfp6 0x1.0a5473ap-2 0x1.1a00000000b16p7 -0x1.0d3fd0c073cb7p-32 0x1.d555p-14 T +REG epsg:2623 1 OK -0x1.b023f4b554d7p15 -0x1.0ef5ffc3702efp19 0x1.342b0a2p-1 0x1.100000000f2c2p7 -0x1.400000002028ep2 0x1.e171p-14 F +REG epsg:2623 2 OK 0x1.019609a933b33p20 -0x1.0ef6193c22d1cp19 -0x1.fb1f39208p3 0x1.23fffffff1c8cp7 -0x1.400000001147ep2 0x1.ea2cp-14 F +REG epsg:2623 3 OK -0x1.b01f1ce6d941p15 0x1.0f0844bf38cebp19 0x1.d63847928p3 0x1.100000000f961p7 0x1.3fffffff8dcfcp2 0x1.b60bp-14 F +REG epsg:2623 4 OK 0x1.019608f3f99b8p20 0x1.0f081285b3d11p19 -0x1.c1a50a9p0 0x1.23fffffff2436p7 0x1.3fffffff9b77fp2 0x1.c73ep-14 F +REG epsg:26237 0 OK 0x1.e85dd6d61b8b2p18 -0x1.dfcf12cbd288fp5 -0x1.74012fb78p3 0x1.37fffffffffffp5 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:26237 1 OK -0x1.acc72c5528eap15 -0x1.0eeaff98eca34p19 -0x1.18e96e858p3 0x1.1p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:26237 2 OK 0x1.019524deab8d1p20 -0x1.0eeaff997adb4p19 0x1.9983b61ap2 0x1.6p5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:26237 3 OK -0x1.acc900aba464p15 0x1.0edc014141f1p19 -0x1.33cfb60acp4 0x1.1p5 0x1.4p2 -0x1.0p-29 F +REG epsg:26237 4 OK 0x1.019533828be97p20 0x1.0edc0141d019bp19 -0x1.03e7dbecp2 0x1.6p5 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:2624 0 OK 0x1.e8289a75f4507p18 0x1.2093b6d692866p6 -0x1.3616cfe6p2 0x1.2000000000ac7p7 -0x1.f6f567208c64fp-33 0x1.d936p-14 T +REG epsg:2624 1 OK -0x1.b02fc1999a66p15 -0x1.0ef61a65374f9p19 -0x1.fe5b662ap1 0x1.160000000f28p7 -0x1.400000001be2cp2 0x1.e43ap-14 F +REG epsg:2624 2 OK 0x1.0195b970ef77bp20 -0x1.0ef6315e6c73bp19 -0x1.56419fa8p4 0x1.29fffffff1beep7 -0x1.400000000c716p2 0x1.ec6bp-14 F +REG epsg:2624 3 OK -0x1.b02b11f5d9d9p15 0x1.0f0846cf2378fp19 0x1.435b2e508p3 0x1.160000000f974p7 0x1.3fffffff91ab3p2 0x1.bb4p-14 F +REG epsg:2624 4 OK 0x1.0195b77aa33eep20 0x1.0f08171506c19p19 -0x1.d336e622p2 0x1.29fffffff23d9p7 0x1.3fffffff9feebp2 0x1.cc3fp-14 F +REG epsg:2625 0 OK 0x1.e8274c4be3c9ep18 0x1.1f4b2438f27b9p6 -0x1.47647134p3 0x1.2600000000a5bp7 -0x1.d20a4507ec7ebp-33 0x1.dcfbp-14 T +REG epsg:2625 1 OK -0x1.b03b0d88853ap15 -0x1.0ef63518ac822p19 -0x1.1c1d6a28p3 0x1.1c0000000f222p7 -0x1.40000000176cbp2 0x1.e6e5p-14 F +REG epsg:2625 2 OK 0x1.01956e07f3484p20 -0x1.0ef6497996b8dp19 -0x1.b306c4664p4 0x1.2ffffffff1b37p7 -0x1.400000000777ap2 0x1.ee6ap-14 F +REG epsg:2625 3 OK -0x1.b036879e007fp15 0x1.0f084a612c5ccp19 0x1.4da28d3dp2 0x1.1c0000000f964p7 0x1.3fffffff95b8p2 0x1.c071p-14 F +REG epsg:2625 4 OK 0x1.01956ac41b79cp20 0x1.0f081d3f4616ep19 -0x1.a32848ed8p3 0x1.2ffffffff235fp7 0x1.3fffffffa48e2p2 0x1.d11bp-14 F +REG epsg:2626 0 OK 0x1.e82610a127b39p18 0x1.1e1c0c0bfaa97p6 -0x1.fc3f8ad7p3 0x1.2c000000009d1p7 -0x1.abd822ed0b395p-33 0x1.e092p-14 T +REG epsg:2626 1 OK -0x1.b045d094e4bbp15 -0x1.0ef64fcb13b73p19 -0x1.c1e32e008p3 0x1.220000000f1a9p7 -0x1.4000000012cacp2 0x1.e964p-14 F +REG epsg:2626 2 OK 0x1.019527a32944ap20 -0x1.0ef6617cb7a6cp19 -0x1.09cef99e6p5 0x1.35fffffff1a67p7 -0x1.40000000025ep2 0x1.f028p-14 F +REG epsg:2626 3 OK -0x1.b04175d4d682p15 0x1.0f084f72d266ap19 0x1.0866098p-5 0x1.220000000f934p7 0x1.3fffffff99f3bp2 0x1.c59p-14 F +REG epsg:2626 4 OK 0x1.0195230636702p20 0x1.0f0825001eb69p19 -0x1.322c7901cp4 0x1.35fffffff22c7p7 0x1.3fffffffa9539p2 0x1.d5c1p-14 F +REG epsg:2627 0 OK 0x1.e824e8533ffap18 0x1.1d0742fe84bb7p6 -0x1.5c8ee79fp4 0x1.320000000092cp7 -0x1.8479cddb2eb7dp-33 0x1.e3f4p-14 T +REG epsg:2627 1 OK -0x1.b05003319021p15 -0x1.0ef66a69b196ap19 -0x1.3839ea6e8p4 0x1.280000000f113p7 -0x1.400000000e007p2 0x1.ebbap-14 F +REG epsg:2627 2 OK 0x1.0194e673f69e5p20 -0x1.0ef67956f61a9p19 -0x1.3be1b32cp5 0x1.3bfffffff1981p7 -0x1.3ffffffffd289p2 0x1.f195p-14 F +REG epsg:2627 3 OK -0x1.b04bd4eee9aep15 0x1.0f085600875b8p19 -0x1.5b16420cp2 0x1.280000000f8e3p7 0x1.3fffffff9e5bbp2 0x1.ca9fp-14 F +REG epsg:2627 4 OK 0x1.0194e0734b766p20 0x1.0f082e52203ep19 -0x1.9652f084cp4 0x1.3bfffffff2213p7 0x1.3fffffffae3b9p2 0x1.da31p-14 F +REG epsg:2628 0 OK 0x1.e823d43217032p18 0x1.1c0d8b4a38233p6 -0x1.bebd5cbep4 0x1.380000000086cp7 -0x1.5c0ae582b3573p-33 0x1.e715p-14 T +REG epsg:2628 1 OK -0x1.b0599e36b2b4p15 -0x1.0ef684e1d8a2ep19 -0x1.93aa7191p4 0x1.2e0000000f062p7 -0x1.4000000009112p2 0x1.edd1p-14 F +REG epsg:2628 2 OK 0x1.0194aaa818e8dp20 -0x1.0ef690f7959b2p19 -0x1.6f986c914p5 0x1.41fffffff1888p7 -0x1.3ffffffff7dcp2 0x1.f2a7p-14 F +REG epsg:2628 3 OK -0x1.b0559da52e36p15 0x1.0f085e05b2576p19 -0x1.646ed0f2p3 0x1.2e0000000f872p7 0x1.3fffffffa2ed5p2 0x1.cf87p-14 F +REG epsg:2628 4 OK 0x1.0194a33a11b58p20 0x1.0f08392ec0d2dp19 -0x1.fdc145b7p4 0x1.41fffffff2145p7 0x1.3fffffffb3438p2 0x1.de56p-14 F +REG epsg:2629 0 OK 0x1.e822d4ff6fd63p18 0x1.1b2f942b39a1ap6 -0x1.123320966p5 0x1.3e00000000796p7 -0x1.32a7c9254cc9dp-33 0x1.e9edp-14 T +REG epsg:2629 1 OK -0x1.b0629ae6d185p15 -0x1.0ef69f20f654ep19 -0x1.f30303dfp4 0x1.340000000ef9ap7 -0x1.4000000004014p2 0x1.efa4p-14 F +REG epsg:2629 2 OK 0x1.0194746986014p20 -0x1.0ef6a84e0215fp19 -0x1.a4cedccbcp5 0x1.47fffffff178p7 -0x1.3ffffffff27bp2 0x1.f369p-14 F +REG epsg:2629 3 OK -0x1.b05ec91a19e5p15 0x1.0f08677cb306p19 -0x1.11912b674p4 0x1.340000000f7e4p7 0x1.3fffffffa7a5cp2 0x1.d44p-14 F +REG epsg:2629 4 OK 0x1.01946b857f625p20 0x1.0f08458e61b72p19 -0x1.341772f8ep5 0x1.47fffffff2062p7 0x1.3fffffffb8675p2 0x1.e232p-14 F +REG epsg:2630 0 OK 0x1.e821eb6e5e0ddp18 0x1.1a6df9652c2b9p6 -0x1.46a1203c2p5 0x1.44000000006a9p7 -0x1.086d82d2cd343p-33 0x1.ec79p-14 T +REG epsg:2630 1 OK -0x1.b06af2f385ebp15 -0x1.0ef6b914a022ap19 -0x1.2b005d89cp5 0x1.3a0000000eebcp7 -0x1.3ffffffffed42p2 0x1.f12ap-14 F +REG epsg:2630 2 OK 0x1.019443de4e9dep20 -0x1.0ef6bf49db824p19 -0x1.db5fad952p5 0x1.4dfffffff1668p7 -0x1.3fffffffed0adp2 0x1.f3cp-14 F +REG epsg:2630 3 OK -0x1.b06750de75cp15 0x1.0f08725ee593fp19 -0x1.748ff232p4 0x1.3a0000000f738p7 0x1.3fffffffac821p2 0x1.d8c3p-14 F +REG epsg:2630 4 OK 0x1.0194397cab9dfp20 0x1.0f08536854a38p19 -0x1.6aa892122p5 0x1.4dfffffff1f69p7 0x1.3fffffffbda4fp2 0x1.e5b4p-14 F +REG epsg:2631 0 OK 0x1.e8211822c8388p18 0x1.19c942d5d992ep6 -0x1.7c83e3b38p5 0x1.4a000000005aap7 -0x1.baf3682609804p-34 0x1.eeabp-14 T +REG epsg:2631 1 OK -0x1.b072a081eabep15 -0x1.0ef6d2aaa06bbp19 -0x1.5e2f110f6p5 0x1.400000000edc9p7 -0x1.3ffffffff98e6p2 0x1.f25ep-14 F +REG epsg:2631 2 OK 0x1.019419288395p20 -0x1.0ef6d5db015d2p19 -0x1.09924aca6p6 0x1.53fffffff1546p7 -0x1.3fffffffe78edp2 0x1.f3bbp-14 F +REG epsg:2631 3 OK -0x1.b06f2ef5e16p15 0x1.0f087ea4a7575p19 -0x1.daee470d8p4 0x1.400000000f673p7 0x1.3fffffffb17f3p2 0x1.dd03p-14 F +REG epsg:2631 4 OK 0x1.01940d42b2fddp20 0x1.0f0862b2e1da9p19 -0x1.a26db6972p5 0x1.53fffffff1e61p7 0x1.3fffffffc2f78p2 0x1.e8e1p-14 F +REG epsg:2632 0 OK 0x1.e8205bb0f4c8bp18 0x1.1941e415cfcd7p6 -0x1.b3b59bcap5 0x1.500000000049cp7 -0x1.63d500d33b27ap-34 0x1.f07ep-14 T +REG epsg:2632 1 OK -0x1.b0799e2eb847p15 -0x1.0ef6ebd1033f5p19 -0x1.92e9b2f12p5 0x1.460000000ecc5p7 -0x1.3ffffffff4333p2 0x1.f33fp-14 F +REG epsg:2632 2 OK 0x1.0193f4661defap20 -0x1.0ef6ebf19dfaap19 -0x1.25fb399f6p6 0x1.59fffffff141cp7 -0x1.3fffffffe20b5p2 0x1.f345p-14 F +REG epsg:2632 3 OK -0x1.b0765ddb072cp15 0x1.0f088c455c29dp19 -0x1.22322b194p5 0x1.460000000f596p7 0x1.3fffffffb699ap2 0x1.e0fep-14 F +REG epsg:2632 4 OK 0x1.0193e6f69ee71p20 0x1.0f0873634efc4p19 -0x1.db3fbed1p5 0x1.59fffffff1d48p7 0x1.3fffffffc85c7p2 0x1.ebabp-14 F +REG epsg:2633 0 OK 0x1.e81fb69d21fc7p18 0x1.18d83c2735ef1p6 -0x1.ec0f8e3eap5 0x1.560000000038p7 -0x1.0bbcf071988b7p-34 0x1.f1f1p-14 T +REG epsg:2633 1 OK -0x1.b07fe7120c2fp15 -0x1.0ef7047622f6p19 -0x1.c90b43caep5 0x1.4c0000000ebb3p7 -0x1.3fffffffeec78p2 0x1.f3b3p-14 F +REG epsg:2633 2 OK 0x1.0193d5b0e9e4cp20 -0x1.0ef7017e31a22p19 -0x1.42d6b4223p6 0x1.5ffffffff12edp7 -0x1.3fffffffdc84p2 0x1.f267p-14 F +REG epsg:2633 3 OK -0x1.b07cd8837ba3p15 0x1.0f089b3774725p19 -0x1.58541025p5 0x1.4c0000000f4a4p7 0x1.3fffffffbbce8p2 0x1.e499p-14 F +REG epsg:2633 4 OK 0x1.0193c6b34fcbap20 0x1.0f08856de6899p19 -0x1.0a7b6629ep6 0x1.5ffffffff1c25p7 0x1.3fffffffcdcfdp2 0x1.ee0dp-14 F +REG epsg:26331 0 OK 0x1.e85e0172bdd18p18 -0x1.e7ce551ab60b5p6 -0x1.ecdda50b8p3 0x1.8000000000001p1 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:26331 1 OK -0x1.acc58f503c1ep15 -0x1.0ef2c92d09272p19 -0x1.50120e018p3 -0x1.ffffffffffffbp0 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:26331 2 OK 0x1.01952d45131dcp20 -0x1.0ef2c92d9b362p19 0x1.32780752p2 0x1.0p3 -0x1.4p2 -0x1.8p-29 F +REG epsg:26331 3 OK -0x1.acc9477863c6p15 0x1.0ed44c8a99fc3p19 -0x1.fc52dbf74p4 -0x1.ffffffffffffbp0 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:26331 4 OK 0x1.01954b08bbf3ap20 0x1.0ed44c8b2beb1p19 -0x1.07ab9d4e8p4 0x1.0p3 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:26332 0 OK 0x1.e85b5ba834329p18 -0x1.e7ce2953fb98dp6 -0x1.ae915cedp2 0x1.2000000000001p3 0x1.2f74bf1dcfcacp-62 0x1.8p-29 T +REG epsg:26332 1 OK -0x1.acd93c5575cdp15 -0x1.0ef2b0ccf178ep19 -0x1.f298e408p-1 0x1.0p2 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:26332 2 OK 0x1.019477c5e81dp20 -0x1.0ef2b0cd71faap19 0x1.8f458ba6p3 0x1.c000000000003p3 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:26332 3 OK -0x1.acdcf4813f66p15 0x1.0ed4342d39323p19 -0x1.63de7a8c4p4 0x1.0000000000001p2 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:26332 4 OK 0x1.0194958963f14p20 0x1.0ed4342db997bp19 -0x1.194d7c7fp3 0x1.c000000000003p3 0x1.4p2 -0x1.8p-29 F +REG epsg:2634 0 OK 0x1.e81f295b2910bp18 0x1.188c953311ed6p6 -0x1.12b518774p6 0x1.5c0000000025ap7 -0x1.65d20f7398d3cp-35 0x1.f2fbp-14 T +REG epsg:2634 1 OK -0x1.b08576c2daf7p15 -0x1.0ef71c88b4925p19 -0x1.0036e42a6p6 0x1.520000000ea94p7 -0x1.3fffffffe94e8p2 0x1.f3d1p-14 F +REG epsg:2634 2 OK 0x1.0193bd1e74b6dp20 -0x1.0ef716719d6e2p19 -0x1.60107ac81p6 0x1.65fffffff11bdp7 -0x1.3fffffffd6fd1p2 0x1.f12p-14 F +REG epsg:2634 3 OK -0x1.b0829a634772p15 0x1.0f08ab7073d94p19 -0x1.8fb6d7276p5 0x1.520000000f3a1p7 0x1.3fffffffc119dp2 0x1.e7e7p-14 F +REG epsg:2634 4 OK 0x1.0193ac8f6a42cp20 0x1.0f0898c6001cp19 -0x1.27b52ffc6p6 0x1.65fffffff1afcp7 0x1.3fffffffd34dcp2 0x1.f006p-14 F +REG epsg:2635 0 OK 0x1.e81eb44e2ce35p18 0x1.185f24552e34bp6 -0x1.2fcea2c8bp6 0x1.620000000012fp7 -0x1.665e69a78691ap-36 0x1.f39cp-14 T +REG epsg:2635 1 OK -0x1.b08a495a08f5p15 -0x1.0ef733f7d3e41p19 -0x1.1c7532073p6 0x1.580000000e96bp7 -0x1.3fffffffe3ccdp2 0x1.f38p-14 F +REG epsg:2635 2 OK 0x1.0193aabffd932p20 -0x1.0ef72abd2de94p19 -0x1.7d940bd7dp6 -0x1.640000000ef71p7 -0x1.3fffffffd17a7p2 0x1.ef6dp-14 F +REG epsg:2635 3 OK -0x1.b0879f7018a1p15 0x1.0f08bce4f8a41p19 -0x1.c833a3718p5 0x1.580000000f28dp7 0x1.3fffffffc679p2 0x1.eadp-14 F +REG epsg:2635 4 OK 0x1.0193989d4722cp20 0x1.0f08ad5e0946p19 -0x1.4538bb243p6 -0x1.640000000e634p7 0x1.3fffffffd8d27p2 0x1.f197p-14 F +REG epsg:2636 0 OK 0x1.e81e57c8545a4p18 0x1.18500976c3c5ap6 -0x1.4d3ffafb8p6 0x1.68p7 -0x1.d53b8c4d99189p-48 0x1.f3d3p-14 F +REG epsg:2636 1 OK -0x1.b08e5b75272p15 -0x1.0ef74ab30f624p19 -0x1.392cba3fbp6 0x1.5e0000000e83dp7 -0x1.3fffffffde461p2 0x1.f2c7p-14 F +REG epsg:2636 2 OK 0x1.01939ea26973bp20 -0x1.0ef73e52a55dap19 -0x1.9b4cb1cbfp6 -0x1.5e0000000f09cp7 -0x1.3fffffffcbffep2 0x1.ed4ap-14 F +REG epsg:2636 3 OK -0x1.b08be424185ap15 0x1.0f08cf88c3af1p19 -0x1.00d169344p6 0x1.5e0000000f16dp7 0x1.3fffffffcbe78p2 0x1.ed56p-14 F +REG epsg:2636 4 OK 0x1.01938aeae6a6cp20 0x1.0f08c3278f17fp19 -0x1.62f152205p6 -0x1.5e0000000e767p7 0x1.3fffffffde5a1p2 0x1.f2bbp-14 F +REG epsg:2637 0 OK 0x1.e81e140a90a6dp18 0x1.185f4f3803453p6 -0x1.6af478571p6 -0x1.620000000013p7 0x1.6623c281da0e3p-36 0x1.f39fp-14 T +REG epsg:2637 1 OK -0x1.b091aa38d3ffp15 -0x1.0ef760aa73b54p19 -0x1.564956839p6 0x1.640000000e70ep7 -0x1.3fffffffd8be5p2 0x1.f1a2p-14 F +REG epsg:2637 2 OK 0x1.019398ce3a11ap20 -0x1.0ef7512445d51p19 -0x1.b92591dbbp6 -0x1.580000000f1bcp7 -0x1.3fffffffc6915p2 0x1.eac3p-14 F +REG epsg:2637 3 OK -0x1.b08f65806477p15 0x1.0f08e34ec106p19 -0x1.1dee0bab3p6 0x1.640000000f044p7 0x1.3fffffffd1621p2 0x1.ef74p-14 F +REG epsg:2637 4 OK 0x1.01938381e68fcp20 0x1.0f08da1348425p19 -0x1.80ca1a322p6 -0x1.580000000e894p7 0x1.3fffffffe3e09p2 0x1.f376p-14 F +REG epsg:2638 0 OK 0x1.e81de9446fb5ap18 0x1.188ceae88cf55p6 -0x1.88d74300ep6 -0x1.5c0000000025cp7 0x1.65b4bbcdcb462p-35 0x1.f2fbp-14 T +REG epsg:2638 1 OK -0x1.b0943352bd28p15 -0x1.0ef775ce96e83p19 -0x1.73b699919p6 -0x1.65fffffff1a22p7 -0x1.3fffffffd3399p2 0x1.f013p-14 F +REG epsg:2638 2 OK 0x1.0193994787e52p20 -0x1.0ef76324dabc8p19 -0x1.d709ba9c7p6 -0x1.520000000f2dp7 -0x1.3fffffffc132p2 0x1.e7dap-14 F +REG epsg:2638 3 OK -0x1.b092210f29f1p15 0x1.0f08f829110fap19 -0x1.3b5b4bd8p6 -0x1.65fffffff10ebp7 0x1.3fffffffd6e4bp2 0x1.f12ap-14 F +REG epsg:2638 4 OK 0x1.019382677b5fp20 0x1.0f08f2111fcf6p19 -0x1.9eae22002p6 -0x1.520000000e9bcp7 0x1.3fffffffe9624p2 0x1.f3c7p-14 F +REG epsg:2639 0 OK 0x1.e81dd793fab74p18 0x1.18d8bc8edd145p6 -0x1.a6d3629c1p6 -0x1.5600000000381p7 0x1.0bae46b1a910ap-34 0x1.f1fp-14 T +REG epsg:2639 1 OK -0x1.b095f4fb4041p15 -0x1.0ef78a10a33a6p19 -0x1.915fdd8cfp6 -0x1.5ffffffff1b4dp7 -0x1.3fffffffcdbc1p2 0x1.ee12p-14 F +REG epsg:2639 2 OK 0x1.0193a00dff436p20 -0x1.0ef77447c2295p19 -0x1.f4e432b3cp6 -0x1.4c0000000f3d7p7 -0x1.3fffffffbbe62p2 0x1.e491p-14 F +REG epsg:2639 3 OK -0x1.b09414e55ed3p15 0x1.0f090e091248dp19 -0x1.590483dfap6 -0x1.5ffffffff121ap7 0x1.3fffffffdc6b9p2 0x1.f27p-14 F +REG epsg:2639 4 OK 0x1.0193879c6cb3fp20 0x1.0f090b10406a7p19 -0x1.bc887047p6 -0x1.4c0000000eadep7 0x1.3fffffffeedafp2 0x1.f3b1p-14 F +REG epsg:26391 0 OK 0x1.c2d3ddf2cb4fbp17 -0x1.4073308091f8ep6 -0x1.42ff9c3ap4 0x1.2p2 0x1.0000000000001p2 0x0.0p0 F +REG epsg:26391 1 OK -0x1.3ff2c7909d162p18 -0x1.0e24340f40af5p19 -0x1.2c1af8324p4 -0x1.064052732b747p-1 -0x1.ffffffffdb3afp-1 -0x1.8p-29 T +REG epsg:26391 2 OK 0x1.816352e49e21fp19 -0x1.0e24340f5dbb8p19 -0x1.e8f68e1cp1 0x1.3064052732399p3 -0x1.ffffffffdb27p-1 0x1.0p-28 T +REG epsg:26391 3 OK -0x1.3953c950fbd98p18 0x1.0fbbf00631bfap19 -0x1.054c28eb8p5 -0x1.064052782dd7fp-1 0x1.1fffffffedcd8p3 -0x1.0p-29 F +REG epsg:26391 4 OK 0x1.7e13d3c618805p19 0x1.0fbbf00729313p19 -0x1.1e8424038p4 0x1.306405278285p3 0x1.1fffffffedc3ep3 0x1.4p-28 F +REG epsg:26392 0 OK 0x1.47750ae621ec6p19 -0x1.420bc94de5297p6 -0x1.cf52398a8p3 0x1.1p3 0x1.0000000000002p2 0x1.0p-30 F +REG epsg:26392 1 OK 0x1.b635fd67224ap16 -0x1.0e2430d5fed7bp19 -0x1.8ded96d68p3 0x1.be6feb6335366p1 -0x1.ffffffffdb3abp-1 -0x1.8p-29 T +REG epsg:26392 2 OK 0x1.2c11ab1fb10b6p20 -0x1.0e2430d61979dp19 0x1.421c6588p0 0x1.b0640527323f1p3 -0x1.ffffffffdb28bp-1 0x1.0p-29 T +REG epsg:26392 3 OK 0x1.d0b1f344a8458p16 0x1.0fbbd32b6e101p19 -0x1.a6af00a5p4 0x1.be6feb61f498p1 0x1.1fffffffedcd3p3 -0x1.8p-29 F +REG epsg:26392 4 OK 0x1.2a69ebc272308p20 0x1.0fbbd32c50f06p19 -0x1.9c80f9ff8p3 0x1.b06405278288ep3 0x1.1fffffffedc43p3 0x1.8p-28 F +REG epsg:26393 0 OK 0x1.0f1a890c269b8p20 -0x1.437ff32aee4c2p6 -0x1.28ef16058p3 0x1.9p3 0x1.0000000000001p2 0x1.0p-30 F +REG epsg:26393 1 OK 0x1.0d86d57c566e6p19 -0x1.0e242de6531d3p19 -0x1.a5aed2a1p2 0x1.df37f5b19aa5bp2 -0x1.ffffffffdb398p-1 0x1.0p-30 T +REG epsg:26393 2 OK 0x1.9771a7689b8acp20 -0x1.0e242de66b33cp19 0x1.72e02769p2 0x1.1832029399227p4 -0x1.ffffffffdb289p-1 0x1.0p-30 T +REG epsg:26393 3 OK 0x1.10d653dcd2943p19 0x1.0fbbb8e353a66p19 -0x1.4a471e3e8p4 0x1.df37f5b0fa537p2 0x1.1fffffffedccbp3 0x1.0p-30 F +REG epsg:26393 4 OK 0x1.95c9e838e9c8ep20 0x1.0fbbb8e420d8ep19 -0x1.0d1861978p3 0x1.18320293c1469p4 0x1.1fffffffedc4bp3 -0x1.0p-30 F +REG epsg:2640 0 OK 0x1.e81ddf05a0f76p18 0x1.19428efea7a7fp6 -0x1.c4d3cd00dp6 -0x1.500000000049dp7 0x1.63c656e3e16edp-34 0x1.f07ep-14 T +REG epsg:2640 1 OK -0x1.b096edf6ac3ap15 -0x1.0ef79d626187ap19 -0x1.af3052791p6 -0x1.59fffffff1c71p7 -0x1.3fffffffc848dp2 0x1.ebb3p-14 F +REG epsg:2640 2 OK 0x1.0193ad1ce096p20 -0x1.0ef78480f5b68p19 -0x1.095003c788p7 -0x1.460000000f4cbp7 -0x1.3fffffffb6b1p2 0x1.e0f4p-14 F +REG epsg:2640 3 OK -0x1.b0953fa41c84p15 0x1.0f0924df6b88bp19 -0x1.76d4e3ce7p6 -0x1.59fffffff134cp7 0x1.3fffffffe1f3p2 0x1.f34ep-14 F +REG epsg:2640 4 OK 0x1.0193931d14b55p20 0x1.0f0924ff202f2p19 -0x1.da4412915p6 -0x1.460000000ebf4p7 0x1.3ffffffff446bp2 0x1.f335p-14 F +REG epsg:2641 0 OK 0x1.c9c57bca20c95p22 0x1.463e8bdfd0b3ep6 -0x1.4a21a780fp6 0x1.4ffffffffffffp4 0x0.0p0 0x1.546p-19 T +REG epsg:2641 1 OK 0x1.a7e279a4e7a64p22 -0x1.0ef5d59feb7dcp19 -0x1.94dcab54bp6 0x1.0000000075116p4 -0x1.3fffffffea5fap2 0x1.512p-19 F +REG epsg:2641 2 OK 0x1.eba87df68544ep22 -0x1.0ef5d3aa98974p19 -0x1.39e4fad07p6 0x1.9fffffff8a9dp4 -0x1.3fffffffea4ebp2 0x1.51cp-19 F +REG epsg:2641 3 OK 0x1.a7e27e9e4f17ap22 0x1.0f0a395d06691p19 -0x1.5bfea8784p6 0x1.00000000750f9p4 0x1.3fffffffea5e4p2 0x1.50cp-19 F +REG epsg:2641 4 OK 0x1.eba878fc89875p22 0x1.0f0a37678e3bbp19 -0x1.010705549p6 0x1.9fffffff8a9efp4 0x1.3fffffffea4d5p2 0x1.51ap-19 F +REG epsg:2642 0 OK 0x1.03673b0451ff6p23 0x1.463e74daadadep6 -0x1.2ed8bd408p6 0x1.8000000000001p4 0x0.0p0 0x1.53ep-19 T +REG epsg:2642 1 OK 0x1.e4eb7641d33a9p22 -0x1.0ef5c275422e6p19 -0x1.7948df416p6 0x1.300000007511ep4 -0x1.3fffffffea5fdp2 0x1.50ap-19 F +REG epsg:2642 2 OK 0x1.1458baeb46514p23 -0x1.0ef5c07fed3ep19 -0x1.1f510bfc3p6 0x1.cfffffff8a9d8p4 -0x1.3fffffffea4ecp2 0x1.51cp-19 F +REG epsg:2642 3 OK 0x1.e4eb7b3b3a76fp22 0x1.0f0a2630efae6p19 -0x1.406ae073p6 0x1.30000000750ffp4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:2642 4 OK 0x1.1458b86e49644p23 0x1.0f0a243b7577p19 -0x1.cce634d18p5 0x1.cfffffff8a9f5p4 0x1.3fffffffea4d7p2 0x1.51ap-19 F +REG epsg:2643 0 OK 0x1.21ebb76dce02dp23 0x1.463e5e1eaf988p6 -0x1.13e683023p6 0x1.bp4 0x0.0p0 0x1.544p-19 T +REG epsg:2643 1 OK 0x1.10fa38b5d5078p23 -0x1.0ef5af877fac4p19 -0x1.5deb8a43ep6 0x1.6000000075122p4 -0x1.3fffffffea5f9p2 0x1.50ep-19 F +REG epsg:2643 2 OK 0x1.32dd362946b65p23 -0x1.0ef5ad92281d2p19 -0x1.0532b4f06p6 0x1.ffffffff8a9e3p4 -0x1.3fffffffea4f3p2 0x1.518p-19 F +REG epsg:2643 3 OK 0x1.10fa3b3288a76p23 0x1.0f0a1341c44a5p19 -0x1.250d8f7bap6 0x1.6000000075105p4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:2643 4 OK 0x1.32dd33ac4ad41p23 0x1.0f0a114c47739p19 -0x1.98a98e682p5 0x1.ffffffff8aa01p4 0x1.3fffffffea4dcp2 0x1.518p-19 F +REG epsg:26432 0 OK 0x1.e83f203504af4p18 0x1.b99909569d09ap22 -0x1.83910053ep5 0x1.2p3 -0x1.9000000000001p4 0x1.8p-29 F +REG epsg:26432 1 OK -0x1.fc86e74098c8p14 0x1.9702934f338dp22 -0x1.cc40094eep5 0x1.bdd68fcf51a3ap1 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:26432 2 OK 0x1.f8235763af852p19 0x1.9702934f53628p22 -0x1.fb8dcce64p5 0x1.d08a5c0c2b973p3 -0x1.e000000000001p4 0x1.0p-30 F +REG epsg:26432 3 OK -0x1.2fff17e4d347p16 0x1.dacc09963f798p22 -0x1.1e8630054p5 0x1.bdd68fcf51a39p1 -0x1.4p4 0x1.0p-29 F +REG epsg:26432 4 OK 0x1.071f81921aedap20 0x1.dacc09965dc5bp22 -0x1.51da08252p5 0x1.d08a5c0c2b973p3 -0x1.4p4 0x1.0p-30 F +REG epsg:2644 0 OK 0x1.4070332409126p23 0x1.463e47bbca156p6 -0x1.f2bbc2114p5 0x1.e000000000003p4 0x0.0p0 0x1.53ep-19 T +REG epsg:2644 1 OK 0x1.2f7eb592e89cp23 -0x1.0ef59ce3ec056p19 -0x1.42d7dfcbfp6 0x1.900000007512bp4 -0x1.3fffffffea5f8p2 0x1.50ep-19 F +REG epsg:2644 2 OK 0x1.5161b0b89a965p23 -0x1.0ef59aee9143dp19 -0x1.d7389277ep5 0x1.17ffffffc54f9p5 -0x1.3fffffffea4f4p2 0x1.51cp-19 F +REG epsg:2644 3 OK 0x1.2f7eb80f9c59ep23 0x1.0f0a009ccd47dp19 -0x1.09f9e8ff1p6 0x1.900000007511p4 0x1.3fffffffea5e1p2 0x1.50cp-19 F +REG epsg:2644 4 OK 0x1.5161ae3b9fd6ep23 0x1.0f09fea74d3e2p19 -0x1.657cbe85ep5 0x1.17ffffffc5508p5 0x1.3fffffffea4dep2 0x1.51ap-19 F +REG epsg:2645 0 OK 0x1.5ef4ae2a05967p23 0x1.463e31c1b23aep6 -0x1.bea2eaf3ap5 0x1.07fffffffffffp5 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2645 1 OK 0x1.4e0331ba57e3p23 -0x1.0ef58a979b34fp19 -0x1.2820df94bp6 0x1.c000000075135p4 -0x1.3fffffffea5f5p2 0x1.50cp-19 F +REG epsg:2645 2 OK 0x1.6fe62a9d13438p23 -0x1.0ef588a23cbp19 -0x1.a53f7a188p5 0x1.2fffffffc55p5 -0x1.3fffffffea4f7p2 0x1.51cp-19 F +REG epsg:2645 3 OK 0x1.4e0334370bdaep23 0x1.0f09ee4f1f9b4p19 -0x1.de85d96a6p5 0x1.c000000075116p4 0x1.3fffffffea5dap2 0x1.516p-19 F +REG epsg:2645 4 OK 0x1.6fe6282019be5p23 0x1.0f09ec599bcdbp19 -0x1.3383ad7fap5 0x1.2fffffffc551p5 0x1.3fffffffea4ep2 0x1.51ap-19 F +REG epsg:2646 0 OK 0x1.7d792883419f8p23 0x1.463e1c3fd391p6 -0x1.8ba70ea22p5 0x1.2p5 0x1.2f74bf1dcf456p-62 0x1.542p-19 T +REG epsg:2646 1 OK 0x1.6c87ad2ed5d6cp23 -0x1.0ef578af63f73p19 -0x1.0dd948502p6 0x1.f000000075141p4 -0x1.3fffffffea5f4p2 0x1.51p-19 F +REG epsg:2646 2 OK 0x1.8e6aa3daf9f04p23 -0x1.0ef576ba01201p19 -0x1.749d31264p5 0x1.47ffffffc5508p5 -0x1.3fffffffea4fap2 0x1.51ap-19 F +REG epsg:2646 3 OK 0x1.6c87afab8a24bp23 0x1.0f09dc6592f61p19 -0x1.a9f6b29cap5 0x1.f000000075124p4 0x1.3fffffffea5dap2 0x1.50cp-19 F +REG epsg:2646 4 OK 0x1.8e6aa15e01bbdp23 0x1.0f09da700ad5ap19 -0x1.02e16bb42p5 0x1.47ffffffc5519p5 0x1.3fffffffea4e2p2 0x1.51ep-19 F +REG epsg:2647 0 OK 0x1.9bfda233b4726p23 0x1.463e0745453e2p6 -0x1.59ebf3162p5 0x1.37fffffffffffp5 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2647 1 OK 0x1.8b0c27f392fe4p23 -0x1.0ef56737d6c7p19 -0x1.e82715018p5 0x1.100000003a8a9p5 -0x1.3fffffffea5f2p2 0x1.50ep-19 F +REG epsg:2647 2 OK 0x1.acef1c770cac8p23 -0x1.0ef565426f124p19 -0x1.4573d7766p5 0x1.5fffffffc5514p5 -0x1.3fffffffea4fdp2 0x1.51ap-19 F +REG epsg:2647 3 OK 0x1.8b0c2a7047bep23 0x1.0f09caecb8c23p19 -0x1.766b3e91ep5 0x1.100000003a89cp5 0x1.3fffffffea5d8p2 0x1.51p-19 F +REG epsg:2647 4 OK 0x1.acef19fa15de4p23 0x1.0f09c8f72bc37p19 -0x1.a77031e74p4 0x1.5fffffffc552p5 0x1.3fffffffea4e6p2 0x1.51ep-19 F +REG epsg:2648 0 OK 0x1.ba821b3fcbbfbp23 0x1.463df2e0bf72cp6 -0x1.29947d332p5 0x1.4fffffffffffep5 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2648 1 OK 0x1.a990a20c3b302p23 -0x1.0ef5563d350d6p19 -0x1.b5c377114p5 0x1.280000003a8afp5 -0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:2648 2 OK 0x1.cb7394767b118p23 -0x1.0ef55447c7f3p19 -0x1.17e4845c8p5 0x1.77ffffffc551cp5 -0x1.3fffffffea504p2 0x1.518p-19 F +REG epsg:2648 3 OK 0x1.a990a488f07d1p23 0x1.0f09b9f0d352fp19 -0x1.4407a80aep5 0x1.280000003a8a1p5 0x1.3fffffffea5d6p2 0x1.508p-19 F +REG epsg:2648 4 OK 0x1.cb7391f985be3p23 0x1.0f09b7fb40ed9p19 -0x1.4c51991ap4 0x1.77ffffffc552bp5 0x1.3fffffffea4ecp2 0x1.516p-19 F +REG epsg:2649 0 OK 0x1.d90693ac6888p23 0x1.463ddf209114p6 -0x1.f5853094cp4 0x1.67ffffffffffep5 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2649 1 OK 0x1.c8151b7cf2fefp23 -0x1.0ef545cb6889cp19 -0x1.84ab11f42p5 0x1.400000003a8bap5 -0x1.3fffffffea5e9p2 0x1.50cp-19 F +REG epsg:2649 2 OK 0x1.e9f80bdee29e9p23 -0x1.0ef543d5f585p19 -0x1.d81e5ee88p4 0x1.8fffffffc5526p5 -0x1.3fffffffea506p2 0x1.51cp-19 F +REG epsg:2649 3 OK 0x1.c8151df9a8f41p23 0x1.0f09a97dcd4ap19 -0x1.12ef4a256p5 0x1.400000003a8a9p5 0x1.3fffffffea5dp2 0x1.51p-19 F +REG epsg:2649 4 OK 0x1.e9f80961eed9bp23 0x1.0f09a78834f99p19 -0x1.e94df85a8p3 0x1.8fffffffc5534p5 0x1.3fffffffea4fp2 0x1.51ep-19 F +REG epsg:2650 0 OK 0x1.f78b0b7edbaf3p23 0x1.463dcc1295b3cp6 -0x1.9b2e3ca1cp4 0x1.8000000000001p5 0x0.0p0 0x1.544p-19 T +REG epsg:2650 1 OK 0x1.e699944a54d06p23 -0x1.0ef535edfaf49p19 -0x1.5500585fep5 0x1.580000003a8c1p5 -0x1.3fffffffea5e9p2 0x1.508p-19 F +REG epsg:2650 2 OK 0x1.043e415b2563dp24 -0x1.0ef533f881854p19 -0x1.84253468cp4 0x1.a7ffffffc553p5 -0x1.3fffffffea50ap2 0x1.52p-19 F +REG epsg:2650 3 OK 0x1.e69996c70b886p23 0x1.0f09999f313c8p19 -0x1.c6892f27p4 0x1.580000003a8b3p5 0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:2650 4 OK 0x1.043e401cac51ep24 0x1.0f0997a992806p19 -0x1.415bbc0ep3 0x1.a7ffffffc5542p5 0x1.3fffffffea4f2p2 0x1.51ep-19 F +REG epsg:2651 0 OK 0x1.0b07c15e7120ap24 0x1.463db9c42bd77p6 -0x1.446381a24p4 0x1.9800000000001p5 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2651 1 OK 0x1.028f063cb6d15p24 -0x1.0ef526b00de8bp19 -0x1.26e4bc718p5 0x1.700000003a8cbp5 -0x1.3fffffffea5dfp2 0x1.50ep-19 F +REG epsg:2651 2 OK 0x1.13807c81905d6p24 -0x1.0ef524ba8d932p19 -0x1.341874b44p4 0x1.bfffffffc553dp5 -0x1.3fffffffea512p2 0x1.518p-19 F +REG epsg:2651 3 OK 0x1.028f077b129bcp24 0x1.0f098a6021995p19 -0x1.6a5204dap4 0x1.700000003a8bcp5 0x1.3fffffffea5c9p2 0x1.50ep-19 F +REG epsg:2651 4 OK 0x1.13807b4318248p24 0x1.0f09886a7bf5ep19 -0x1.4284a85ep2 0x1.bfffffffc554dp5 0x1.3fffffffea4fap2 0x1.518p-19 F +REG epsg:2652 0 OK 0x1.1a49fcb650b5ep24 0x1.463da8422b971p6 -0x1.e2c3cacp3 0x1.bp5 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2652 1 OK 0x1.11d14207dcc05p24 -0x1.0ef5181c53147p19 -0x1.f4f1306a4p4 0x1.880000003a8d6p5 -0x1.3fffffffea5dap2 0x1.51p-19 F +REG epsg:2652 2 OK 0x1.22c2b766196e8p24 -0x1.0ef51626cb615p19 -0x1.d06094f5p3 0x1.d7ffffffc554ep5 -0x1.3fffffffea517p2 0x1.51cp-19 F +REG epsg:2652 3 OK 0x1.11d143463905ep24 0x1.0f097bcb50da8p19 -0x1.1179c972p4 0x1.880000003a8c7p5 0x1.3fffffffea5c3p2 0x1.50cp-19 F +REG epsg:2652 4 OK 0x1.22c2b627a216dp24 0x1.0f0979d5a3d89p19 -0x1.2e42c1fp-2 0x1.d7ffffffc555ep5 0x1.3fffffffea4fep2 0x1.51cp-19 F +REG epsg:2653 0 OK 0x1.298c37ca5116cp24 0x1.463d9798dd9afp6 -0x1.44c74b3c8p3 0x1.c7fffffffffffp5 0x0.0p0 0x1.54p-19 T +REG epsg:2653 1 OK 0x1.21137d898fd46p24 -0x1.0ef50a3d04b87p19 -0x1.9fb62de7p4 0x1.a00000003a8e5p5 -0x1.3fffffffea5d7p2 0x1.512p-19 F +REG epsg:2653 2 OK 0x1.3204f20c56021p24 -0x1.0ef5084775361p19 -0x1.4143f08p3 0x1.efffffffc5559p5 -0x1.3fffffffea51dp2 0x1.518p-19 F +REG epsg:2653 3 OK 0x1.21137ec7eca17p24 0x1.0f096deafa03fp19 -0x1.787da6ef8p3 0x1.a00000003a8d3p5 0x1.3fffffffea5bfp2 0x1.50ep-19 F +REG epsg:2653 4 OK 0x1.3204f0cddf93p24 0x1.0f096bf54531ap19 0x1.0b54f2b5p2 0x1.efffffffc5569p5 0x1.3fffffffea506p2 0x1.51ap-19 F +REG epsg:2654 0 OK 0x1.38ce729de6606p24 0x1.463d87d3f27e2p6 -0x1.5e80bcffp2 0x1.dffffffffffffp5 0x0.0p0 0x1.542p-19 T +REG epsg:2654 1 OK 0x1.3055b8c4f7343p24 -0x1.0ef4fd1bde7cp19 -0x1.4e543eabp4 0x1.b80000003a8f1p5 -0x1.3fffffffea5d3p2 0x1.50cp-19 F +REG epsg:2654 2 OK 0x1.41472c780737bp24 -0x1.0ef4fb2646bdep19 -0x1.767ecbdfp2 0x1.03ffffffe2ab3p6 -0x1.3fffffffea521p2 0x1.518p-19 F +REG epsg:2654 3 OK 0x1.3055ba035494dp24 0x1.0f0960c8d9763p19 -0x1.ab73c0cbp2 0x1.b80000003a8e1p5 0x1.3fffffffea5bbp2 0x1.512p-19 F +REG epsg:2654 4 OK 0x1.41472b3991b81p24 0x1.0f095ed31c66dp19 0x1.0baef0368p3 0x1.03ffffffe2abbp6 0x1.3fffffffea508p2 0x1.51ap-19 F +REG epsg:2655 0 OK 0x1.4810ad34b1e13p24 0x1.463d78fe7a9afp6 -0x1.14bf763cp0 0x1.f7ffffffffffep5 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2655 1 OK 0x1.3f97f3bd6b578p24 -0x1.0ef4f0c216984p19 -0x1.01047ccdp4 0x1.d00000003a8ffp5 -0x1.3fffffffea5cfp2 0x1.50cp-19 F +REG epsg:2655 2 OK 0x1.508966ad17413p24 -0x1.0ef4eecc7638p19 -0x1.f587ece8p0 0x1.0fffffffe2abcp6 -0x1.3fffffffea528p2 0x1.51ap-19 F +REG epsg:2655 3 OK 0x1.3f97f4fbc9575p24 0x1.0f09546e261a6p19 -0x1.d8d39b38p0 0x1.d00000003a8f3p5 0x1.3fffffffea5b7p2 0x1.50cp-19 F +REG epsg:2655 4 OK 0x1.5089656ea2b72p24 0x1.0f09527860679p19 0x1.883d46388p3 0x1.0fffffffe2ac3p6 0x1.3fffffffea513p2 0x1.51cp-19 F +REG epsg:2656 0 OK 0x1.5752e7927f8dp24 0x1.463d6b22de487p6 0x1.833d4b4ap1 0x1.08p6 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2656 1 OK 0x1.4eda2e7673ae4p24 -0x1.0ef4e53857639p19 -0x1.6ffa4e408p3 0x1.e80000003a909p5 -0x1.3fffffffea5cap2 0x1.50cp-19 F +REG epsg:2656 2 OK 0x1.5fcba0af96a34p24 -0x1.0ef4e342ae00ap19 0x1.a07f1cdcp0 0x1.1bffffffe2ac1p6 -0x1.3fffffffea53p2 0x1.516p-19 F +REG epsg:2656 3 OK 0x1.4eda2fb4d2586p24 0x1.0f0948e38aebap19 0x1.5bd089e4p1 0x1.e80000003a8fcp5 0x1.3fffffffea5b1p2 0x1.50ap-19 F +REG epsg:2656 4 OK 0x1.5fcb9f7123145p24 0x1.0f0946edbc34dp19 0x1.fafe16908p3 0x1.1bffffffe2acap6 0x1.3fffffffea517p2 0x1.514p-19 F +REG epsg:2657 0 OK 0x1.669521bb4352ep24 0x1.463d5e4ad68dbp6 0x1.b532671ap2 0x1.1400000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2657 1 OK 0x1.5e1c68f3c426bp24 -0x1.0ef4da86b93c1p19 -0x1.cdc5ec8ap2 0x1.000000001d48dp6 -0x1.3fffffffea5c1p2 0x1.51p-19 F +REG epsg:2657 2 OK 0x1.6f0dda83b95cp24 -0x1.0ef4d891067c3p19 0x1.39657375p2 0x1.27ffffffe2acbp6 -0x1.3fffffffea534p2 0x1.51cp-19 F +REG epsg:2657 3 OK 0x1.5e1c6a322385dp24 0x1.0f093e3120e2ep19 0x1.c016cc96p2 0x1.000000001d486p6 0x1.3fffffffea5aap2 0x1.514p-19 F +REG epsg:2657 4 OK 0x1.6f0dd94546ccfp24 0x1.0f093c3b48cddp19 0x1.31d06ea68p4 0x1.27ffffffe2ad3p6 0x1.3fffffffea51fp2 0x1.51cp-19 F +REG epsg:2658 0 OK 0x1.75d75bb316573p24 0x1.463d527f66503p6 0x1.4a703fb98p3 0x1.2000000000002p6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2658 1 OK 0x1.6d5ea3393a93fp24 -0x1.0ef4d0b4bcdb7p19 -0x1.9c8c8866p1 0x1.0c0000001d496p6 -0x1.3fffffffea5b9p2 0x1.514p-19 F +REG epsg:2658 2 OK 0x1.7e50142dd3ef5p24 -0x1.0ef4cebf006b2p19 0x1.f5dc340dp2 0x1.33ffffffe2ad3p6 -0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:2658 3 OK 0x1.6d5ea4779ab24p24 0x1.0f09345e69488p19 0x1.5fcb27aep3 0x1.0c0000001d48dp6 0x1.3fffffffea5a3p2 0x1.512p-19 F +REG epsg:2658 4 OK 0x1.7e5012ef62643p24 0x1.0f0932688781ap19 0x1.60ee17de4p4 0x1.33ffffffe2adbp6 0x1.3fffffffea527p2 0x1.512p-19 F +REG epsg:2659 0 OK 0x1.8519957e3413bp24 0x1.463d47c8d4012p6 0x1.b005fea7p3 0x1.2bfffffffffffp6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2659 1 OK 0x1.7ca0dd4adbf7fp24 -0x1.0ef4c7c94612bp19 0x1.dd717cp-2 0x1.180000001d49dp6 -0x1.3fffffffea5b5p2 0x1.514p-19 F +REG epsg:2659 2 OK 0x1.8d924db2585dbp24 -0x1.0ef4c5d37fa52p19 0x1.4e7fe69d8p3 0x1.3fffffffe2adbp6 -0x1.3fffffffea541p2 0x1.51ap-19 F +REG epsg:2659 3 OK 0x1.7ca0de893cdf3p24 0x1.0f092b7248711p19 0x1.d5d9c44c8p3 0x1.180000001d495p6 0x1.3fffffffea59ep2 0x1.516p-19 F +REG epsg:2659 4 OK 0x1.8d924c73e7d9ep24 0x1.0f09297c5cab5p19 0x1.8ab6f8054p4 0x1.3fffffffe2ae2p6 0x1.3fffffffea52bp2 0x1.51ap-19 F +REG epsg:26591 0 OK 0x1.933f0c3bdf27p16 -0x1.40cc6e6aafe8bp6 -0x1.2e2f249dap6 -0x1.b9e606bd86fa2p1 -0x1.2d33a7967e67p-30 0x1.53b98p-10 T +REG epsg:26591 1 OK -0x1.c628920f28f0cp18 -0x1.1af1fa2dd0785p19 -0x1.44f1b13bp6 -0x1.0e7965abe809dp3 -0x1.3ffffe0719cf6p2 0x1.3e9fp-10 F +REG epsg:26591 2 OK 0x1.47e7767538d1ap19 -0x1.1034524282fbdp19 -0x1.1e8860fa8p6 0x1.8c33e2606b534p0 -0x1.3fffffffa9898p2 0x1.6ca12p-10 F +REG epsg:26591 3 OK -0x1.c627b2f27c31p18 0x1.1ade5381d546cp19 -0x1.3e6ff5cfcp6 -0x1.0e7965abb2b9bp3 0x1.3ffffe0496b99p2 0x1.312c1p-10 F +REG epsg:26591 4 OK 0x1.47e7d4d35d416p19 0x1.101fdf4a73c63p19 -0x1.180e045ap6 0x1.8c33e2628894cp0 0x1.3ffffffdd648dp2 0x1.63f75p-10 F +REG epsg:26592 0 OK 0x1.12393eee3ba4bp20 -0x1.4df981394892ap6 -0x1.1948761b6p6 0x1.4619f94057d4bp1 -0x1.b8fda0b798796p-31 0x1.6b884p-10 T +REG epsg:26592 1 OK 0x1.0ef67962efb7p19 -0x1.1af277ee15f99p19 -0x1.2c6c1bc2fp6 -0x1.39e596b045e05p1 -0x1.3ffffe06b559ap2 0x1.5a618p-10 F +REG epsg:26592 2 OK 0x1.9cf913526961cp20 -0x1.1034970867c2fp19 -0x1.0d8e0ff17p6 0x1.e30cf896d5d15p2 -0x1.3fffffff48c5bp2 0x1.7d0a8p-10 F +REG epsg:26592 3 OK 0x1.0ef6acbb6153cp19 0x1.1addc4dae3ebap19 -0x1.25ef2f53fp6 -0x1.39e596af23d3bp1 0x1.3ffffe04c20d5p2 0x1.4fc9fp-10 F +REG epsg:26592 4 OK 0x1.9cf926a619bb8p20 0x1.101f8adbab011p19 -0x1.07168bc4p6 0x1.e30cf89760c3cp2 0x1.3ffffffe193d5p2 0x1.7769fp-10 F +REG epsg:2660 0 OK 0x1.945bcf20f75f5p24 0x1.463d3e2ea3d08p6 0x1.058994d7p4 0x1.37fffffffffffp6 0x0.0p0 0x1.54p-19 T +REG epsg:2660 1 OK 0x1.8be3172cd1b15p24 -0x1.0ef4bfca96f56p19 0x1.ebd8f8b8p1 0x1.240000001d4a3p6 -0x1.3fffffffea5afp2 0x1.50ep-19 F +REG epsg:2660 2 OK 0x1.9cd48715d305ap24 -0x1.0ef4bdd4c645p19 0x1.972d7ccd8p3 0x1.4bffffffe2ae3p6 -0x1.3fffffffea54cp2 0x1.516p-19 F +REG epsg:2660 3 OK 0x1.8be3186b336aap24 0x1.0f09237300e76p19 0x1.20f2335bcp4 0x1.240000001d49cp6 0x1.3fffffffea599p2 0x1.518p-19 F +REG epsg:2660 4 OK 0x1.9cd485d7638bdp24 0x1.0f09217d0add5p19 0x1.af0dbdc5cp4 0x1.4bffffffe2aeap6 0x1.3fffffffea533p2 0x1.51ep-19 F +REG epsg:2661 0 OK 0x1.a39e089fd75fep24 0x1.463d35b79266ep6 0x1.2dabef1acp4 0x1.43fffffffffffp6 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2661 1 OK 0x1.9b2550e3668ffp24 -0x1.0ef4b8be4b768p19 0x1.b9624cbbp2 0x1.300000001d4acp6 -0x1.3fffffffea5aap2 0x1.514p-19 F +REG epsg:2661 2 OK 0x1.ac16c05ce772dp24 -0x1.0ef4b6c87044cp19 0x1.d4c3de38p3 0x1.57ffffffe2aedp6 -0x1.3fffffffea55p2 0x1.51ap-19 F +REG epsg:2661 3 OK 0x1.9b255221c923dp24 0x1.0f091c662f097p19 0x1.51cfa0438p4 0x1.300000001d4a4p6 0x1.3fffffffea593p2 0x1.514p-19 F +REG epsg:2661 4 OK 0x1.ac16bf1e7904fp24 0x1.0f091a702e7c6p19 0x1.cdd8e9f3cp4 0x1.57ffffffe2af4p6 0x1.3fffffffea539p2 0x1.518p-19 F +REG epsg:2662 0 OK 0x1.b2e041ff64686p24 0x1.463d2e69902c5p6 0x1.504de53f8p4 0x1.5000000000001p6 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2662 1 OK 0x1.aa678a7303d2p24 -0x1.0ef4b2a95578cp19 0x1.33d7b231p3 0x1.3c0000001d4b4p6 -0x1.3fffffffea59fp2 0x1.516p-19 F +REG epsg:2662 2 OK 0x1.bb58f98c4d1cfp24 -0x1.0ef4b0b36f8eap19 0x1.038bea4dp4 0x1.63ffffffe2af4p6 -0x1.3fffffffea556p2 0x1.516p-19 F +REG epsg:2662 3 OK 0x1.aa678bb167487p24 0x1.0f091650c5181p19 0x1.7d62dfc48p4 0x1.3c0000001d4adp6 0x1.3fffffffea58cp2 0x1.51p-19 F +REG epsg:2662 4 OK 0x1.bb58f84ddfbc3p24 0x1.0f09145ab9d11p19 0x1.e702e1718p4 0x1.63ffffffe2afcp6 0x1.3fffffffea541p2 0x1.51ap-19 F +REG epsg:2663 0 OK 0x1.c2227b4444c5p24 0x1.463d2849bd1d6p6 0x1.6d572a978p4 0x1.5cp6 0x0.0p0 0x1.542p-19 T +REG epsg:2663 1 OK 0x1.b9a9c3e02e0bfp24 -0x1.0ef4ad8ff956dp19 0x1.802cbbba8p3 0x1.480000001d4bcp6 -0x1.3fffffffea598p2 0x1.516p-19 F +REG epsg:2663 2 OK 0x1.ca9b32a8cc18ep24 -0x1.0ef4ab9a0884fp19 0x1.1703080dcp4 0x1.6fffffffe2afep6 -0x1.3fffffffea55fp2 0x1.514p-19 F +REG epsg:2663 3 OK 0x1.b9a9c51e926c4p24 0x1.0f09113707bf5p19 0x1.a38d5eedp4 0x1.480000001d4b5p6 0x1.3fffffffea582p2 0x1.514p-19 F +REG epsg:2663 4 OK 0x1.ca9b316a5fc5bp24 0x1.0f090f40f18fp19 0x1.fa79fc54cp4 0x1.6fffffffe2b06p6 0x1.3fffffffea548p2 0x1.514p-19 F +REG epsg:26632 0 OK 0x1.e86531b985306p18 -0x1.4fddd9323c337p5 -0x1.2c5fbca04p4 0x1.2000000000001p3 0x1.c72f1eacb7b06p-63 -0x1.0p-29 T +REG epsg:26632 1 OK -0x1.ac8ddab81dc6p15 -0x1.0ee8d3c151dc6p19 -0x1.7519d90e8p4 0x1.ffffffffffffdp1 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:26632 2 OK 0x1.019707ca5ec36p20 -0x1.0ee8d3c213905p19 -0x1.84388678p1 0x1.c000000000001p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:26632 3 OK -0x1.ac8f227e991ep15 0x1.0ede54e98faa6p19 -0x1.ea3fe2174p4 0x1.0000000000001p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:26632 4 OK 0x1.01971209abc66p20 0x1.0ede54ea514fdp19 -0x1.4b5a02858p3 0x1.c000000000003p3 0x1.4p2 0x0.0p0 F +REG epsg:2664 0 OK 0x1.d164b47331788p24 0x1.463d235c65339p6 0x1.84b35faf8p4 0x1.68p6 0x0.0p0 0x1.542p-19 T +REG epsg:2664 1 OK 0x1.c8ebfd2f81fcdp24 -0x1.0ef4a975cae5bp19 0x1.c17ab443p3 0x1.540000001d4c7p6 -0x1.3fffffffea591p2 0x1.516p-19 F +REG epsg:2664 2 OK 0x1.d9dd6bb739bdap24 -0x1.0ef4a77fcf041p19 0x1.24b9a0098p4 0x1.7bffffffe2b08p6 -0x1.3fffffffea567p2 0x1.518p-19 F +REG epsg:2664 3 OK 0x1.c8ebfe6de74dbp24 0x1.0f090d1c8b187p19 0x1.c4345664p4 0x1.540000001d4bfp6 0x1.3fffffffea57bp2 0x1.518p-19 F +REG epsg:2664 4 OK 0x1.d9dd6a78ce77bp24 0x1.0f090b2669d6bp19 0x1.041849266p5 0x1.7bffffffe2b0fp6 0x1.3fffffffea54ep2 0x1.514p-19 F +REG epsg:2665 0 OK 0x1.e0a6ed90f2ebdp24 0x1.463d1fa4fd619p6 0x1.9652209acp4 0x1.74p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2665 1 OK 0x1.d82e3665b1521p24 -0x1.0ef4a65daaf1cp19 0x1.f793c9d88p3 0x1.600000001d4cdp6 -0x1.3fffffffea58dp2 0x1.51p-19 F +REG epsg:2665 2 OK 0x1.e91fa4bc75406p24 -0x1.0ef4a467a3e07p19 0x1.2ca613184p4 0x1.87ffffffe2b1p6 -0x1.3fffffffea56dp2 0x1.514p-19 F +REG epsg:2665 3 OK 0x1.d82e37a417999p24 0x1.0f090a043026cp19 0x1.df40dd34cp4 0x1.600000001d4c6p6 0x1.3fffffffea574p2 0x1.518p-19 F +REG epsg:2665 4 OK 0x1.e91fa37e0b06cp24 0x1.0f09080e03b3cp19 0x1.080e8218ep5 0x1.87ffffffe2b18p6 0x1.3fffffffea556p2 0x1.518p-19 F +REG epsg:2666 0 OK 0x1.efe926a25d934p24 0x1.463d1d262126ep6 0x1.a22710728p4 0x1.8000000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2666 1 OK 0x1.e7706f877f5cep24 -0x1.0ef4a449c53a2p19 0x1.112903be4p4 0x1.6c0000001d4d7p6 -0x1.3fffffffea584p2 0x1.51ap-19 F +REG epsg:2666 2 OK 0x1.f861ddbd6449fp24 -0x1.0ef4a253b2e14p19 0x1.2ec2d1ff4p4 0x1.93ffffffe2b19p6 -0x1.3fffffffea577p2 0x1.514p-19 F +REG epsg:2666 3 OK 0x1.e77070c5e6a06p24 0x1.0f0907f022d2bp19 0x1.f49ff8e2p4 0x1.6c0000001d4d1p6 0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:2666 4 OK 0x1.f861dc7efb1adp24 0x1.0f0905f9eb168p19 0x1.091ce1648p5 0x1.93ffffffe2b2p6 0x1.3fffffffea55ep2 0x1.514p-19 F +REG epsg:2667 0 OK 0x1.ff2b5fac4e8adp24 0x1.463d1be190bb3p6 0x1.a829e201cp4 0x1.8c00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2667 1 OK 0x1.f6b2a899bdba3p24 -0x1.0ef4a33b8eebap19 0x1.20cbb7da4p4 0x1.780000001d4e2p6 -0x1.3fffffffea57dp2 0x1.514p-19 F +REG epsg:2667 2 OK 0x1.03d20b5f77c37p25 -0x1.0ef4a145713afp19 0x1.2b0e61574p4 0x1.9fffffffe2b23p6 -0x1.3fffffffea57dp2 0x1.51p-19 F +REG epsg:2667 3 OK 0x1.f6b2a9d825fe5p24 0x1.0f0906e1d864fp19 0x1.022155588p5 0x1.780000001d4dap6 0x1.3fffffffea566p2 0x1.51p-19 F +REG epsg:2667 4 OK 0x1.03d20ac043afep25 0x1.0f0904eb954f5p19 0x1.0742a955ep5 0x1.9fffffffe2b2ap6 0x1.3fffffffea568p2 0x1.51p-19 F +REG epsg:2668 0 OK 0x1.0736cc59d416ap25 0x1.463d1bd82fd4bp6 0x1.a8565d984p4 0x1.9800000000003p6 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2668 1 OK 0x1.02fa70d0a478dp25 -0x1.0ef4a333c599dp19 0x1.2aa708d14p4 0x1.840000001d4ebp6 -0x1.3fffffffea575p2 0x1.514p-19 F +REG epsg:2668 2 OK 0x1.0b7327e2ff9afp25 -0x1.0ef4a13d9c899p19 0x1.218b5a954p4 0x1.abffffffe2b2ap6 -0x1.3fffffffea583p2 0x1.518p-19 F +REG epsg:2668 3 OK 0x1.02fa716fd91d2p25 0x1.0f0906da0e7f3p19 0x1.070efd1bp5 0x1.840000001d4ep6 0x1.3fffffffea55ep2 0x1.51ap-19 F +REG epsg:2668 4 OK 0x1.0b732743cc09dp25 0x1.0f0904e3c0083p19 0x1.028126a8p5 0x1.abffffffe2b32p6 0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:2669 0 OK 0x1.0ed7e8dea7532p25 0x1.463d1d0a0507bp6 0x1.a2ac63ffcp4 0x1.a4p6 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2669 1 OK 0x1.0a9b8d5182863p25 -0x1.0ef4a4326ebb9p19 0x1.2eb40c318p4 0x1.900000001d4efp6 -0x1.3fffffffea56cp2 0x1.51cp-19 F +REG epsg:2669 2 OK 0x1.1314446bbbdb9p25 -0x1.0ef4a23c3a4b9p19 0x1.12406a388p4 0x1.b7ffffffe2b33p6 -0x1.3fffffffea58ap2 0x1.514p-19 F +REG epsg:2669 3 OK 0x1.0a9b8df0b7ae8p25 0x1.0f0907d8ca989p19 0x1.09157e7e6p5 0x1.900000001d4e9p6 0x1.3fffffffea558p2 0x1.51p-19 F +REG epsg:2669 4 OK 0x1.131443cc88caep25 0x1.0f0905e270c04p19 0x1.f5b75f32cp4 0x1.b7ffffffe2b3ap6 0x1.3fffffffea576p2 0x1.514p-19 F +REG epsg:26692 0 OK 0x1.e86531a427effp18 0x1.b99718149ddeap22 0x1.a3d8b21c8p5 0x1.2p3 -0x1.9000000000003p4 0x1.0p-30 F +REG epsg:26692 1 OK -0x1.f9f825d4cc6ep14 0x1.9700c68da1897p22 0x1.0b170c09p6 0x1.bdd68fcf51a39p1 -0x1.e000000000001p4 -0x1.8p-29 F +REG epsg:26692 2 OK 0x1.f834f2edc0d85p19 0x1.9700c68d37355p22 0x1.58e63d22dp6 0x1.d08a5c0c2b975p3 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:26692 3 OK -0x1.2f609d31fa85p16 0x1.dac9f5780fc5dp22 0x1.3c3ad29f4p4 0x1.bdd68fcf51a33p1 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:26692 4 OK 0x1.0728a2c046e09p20 0x1.dac9f577aabdep22 0x1.46f938456p5 0x1.d08a5c0c2b973p3 -0x1.4p4 0x1.0p-29 F +REG epsg:2670 0 OK 0x1.1679056712428p25 0x1.463d1f7639c28p6 0x1.972fee938p4 0x1.b000000000003p6 0x0.0p0 0x1.53ep-19 T +REG epsg:2670 1 OK 0x1.123ca9d1ed13bp25 -0x1.0ef4a636d7a5fp19 0x1.2cefea5fp4 0x1.9c0000001d4fbp6 -0x1.3fffffffea565p2 0x1.518p-19 F +REG epsg:2670 2 OK 0x1.1ab560fc1b0e9p25 -0x1.0ef4a44097de5p19 0x1.fa709639p3 0x1.c3ffffffe2b4p6 -0x1.3fffffffea593p2 0x1.514p-19 F +REG epsg:2670 3 OK 0x1.123caa7122c13p25 0x1.0f0909dd59f8ep19 0x1.08336db68p5 0x1.9c0000001d4f4p6 0x1.3fffffffea54fp2 0x1.51ap-19 F +REG epsg:2670 4 OK 0x1.1ab5605ce87cp25 0x1.0f0907e6f4c71p19 0x1.e0af432fp4 0x1.c3ffffffe2b45p6 0x1.3fffffffea57bp2 0x1.516p-19 F +REG epsg:26701 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.62p7 0x1.68p5 0x0.0p0 F +REG epsg:26701 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 0x1.5fdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26701 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.53db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26701 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 0x1.5fdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26701 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.53db9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26702 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.56p7 0x1.68p5 0x0.0p0 F +REG epsg:26702 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.642463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26702 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.47db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26702 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.642463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26702 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.47db9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26703 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.4ap7 0x1.68p5 0x0.0p0 F +REG epsg:26703 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.582463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26703 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26703 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.582463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26703 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26704 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.3ep7 0x1.68p5 0x0.0p0 F +REG epsg:26704 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.4c2463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26704 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26704 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.4c2463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26704 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26705 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.32p7 0x1.68p5 0x0.0p0 F +REG epsg:26705 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.402463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26705 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26705 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.402463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26705 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26706 0 OK 0x1.e848000000022p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.26p7 0x1.68p5 0x0.0p0 F +REG epsg:26706 1 OK -0x1.95bacc669d1d8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.342463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26706 2 OK 0x1.0d7facc669d3p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26706 3 OK -0x1.99a5174d6b98p12 0x1.5380b21056044p22 0x0.0p0 -0x1.342463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26706 4 OK 0x1.eb7b4a2e9ad94p19 0x1.5380b21056045p22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.9p5 0x0.0p0 F +REG epsg:26707 0 OK 0x1.e847fffffffdep18 0x1.301f34d63e508p22 0x0.0p0 -0x1.1ap7 0x1.68p5 0x0.0p0 F +REG epsg:26707 1 OK -0x1.95bacc669d3p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.282463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26707 2 OK 0x1.0d7facc669d1ep20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26707 3 OK -0x1.99a5174d6c9cp12 0x1.5380b21056045p22 0x0.0p0 -0x1.282463000f856p7 0x1.9p5 0x0.0p0 F +REG epsg:26707 4 OK 0x1.eb7b4a2e9ad73p19 0x1.5380b21056044p22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26708 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.0ep7 0x1.68p5 0x0.0p0 F +REG epsg:26708 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.1c2463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26708 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26708 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.1c2463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26708 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26709 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.02p7 0x1.68p5 0x0.0p0 F +REG epsg:26709 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.102463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26709 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26709 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.102463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26709 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:2671 0 OK 0x1.1e1a21f583a6ep25 0x1.463d231b1ae3cp6 0x1.85e90c734p4 0x1.bc00000000003p6 0x0.0p0 0x1.54p-19 T +REG epsg:2671 1 OK 0x1.19ddc65458809p25 -0x1.0ef4a93f9609fp19 0x1.255be0958p4 0x1.a80000001d504p6 -0x1.3fffffffea561p2 0x1.518p-19 F +REG epsg:2671 2 OK 0x1.22567d9686619p25 -0x1.0ef4a7494afabp19 0x1.c5037de5p3 0x1.cfffffffe2b44p6 -0x1.3fffffffea59cp2 0x1.512p-19 F +REG epsg:2671 3 OK 0x1.19ddc6f38eb42p25 0x1.0f090ce652361p19 0x1.046969606p5 0x1.a80000001d4fcp6 0x1.3fffffffea545p2 0x1.51ap-19 F +REG epsg:2671 4 OK 0x1.22567cf7544a8p25 0x1.0f090aefe1bb2p19 0x1.c5f8baf2p4 0x1.cfffffffe2b4dp6 0x1.3fffffffea585p2 0x1.512p-19 F +REG epsg:26710 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.ec00000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:26710 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.042463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26710 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26710 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.042463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26710 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26711 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.d4p6 0x1.68p5 0x0.0p0 F +REG epsg:26711 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26711 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26711 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26711 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26712 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.bcp6 0x1.68p5 0x0.0p0 F +REG epsg:26712 1 OK -0x1.95bacc669d218p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26712 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26712 3 OK -0x1.99a5174d6bd8p12 0x1.5380b21056044p22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26712 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26713 0 OK 0x1.e847fffffffefp18 0x1.301f34d63e508p22 0x0.0p0 -0x1.a400000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:26713 1 OK -0x1.95bacc669d2b8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26713 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26713 3 OK -0x1.99a5174d6c4cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26713 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26714 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.8cp6 0x1.68p5 0x0.0p0 F +REG epsg:26714 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26714 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26714 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26714 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26715 0 OK 0x1.e847fffffffefp18 0x1.301f34d63e508p22 0x0.0p0 -0x1.74p6 0x1.68p5 0x0.0p0 F +REG epsg:26715 1 OK -0x1.95bacc669d2b8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26715 2 OK 0x1.0d7facc669d22p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26715 3 OK -0x1.99a5174d6c4cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26715 4 OK 0x1.eb7b4a2e9ad7bp19 0x1.5380b21056044p22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26716 0 OK 0x1.e848000000011p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.5cp6 0x1.68p5 0x0.0p0 F +REG epsg:26716 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26716 2 OK 0x1.0d7facc669d2cp20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26716 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26716 4 OK 0x1.eb7b4a2e9ad8ap19 0x1.5380b21056044p22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26717 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.44p6 0x1.68p5 0x0.0p0 F +REG epsg:26717 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26717 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26717 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26717 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26718 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.2cp6 0x1.68p5 0x0.0p0 F +REG epsg:26718 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26718 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26718 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26718 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26719 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.14p6 0x1.68p5 0x0.0p0 F +REG epsg:26719 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26719 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26719 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26719 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:2672 0 OK 0x1.25bb3e8c66088p25 0x1.463d27f619eb6p6 0x1.6ee3dcdf4p4 0x1.c800000000003p6 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2672 1 OK 0x1.217ee2db37c47p25 -0x1.0ef4ad4a88f2ap19 0x1.17fd4008p4 0x1.b40000001d50dp6 -0x1.3fffffffea557p2 0x1.51ap-19 F +REG epsg:2672 2 OK 0x1.29f79a3d5ff62p25 -0x1.0ef4ab5432b3ep19 0x1.845f07cap3 0x1.dbffffffe2b4ap6 -0x1.3fffffffea5a3p2 0x1.512p-19 F +REG epsg:2672 3 OK 0x1.217ee37a6e7ebp25 0x1.0f0910f19232ep19 0x1.fb74342a8p4 0x1.b40000001d508p6 0x1.3fffffffea541p2 0x1.516p-19 F +REG epsg:2672 4 OK 0x1.29f7999e2e579p25 0x1.0f090efb1686cp19 0x1.a5a684a58p4 0x1.dbffffffe2b57p6 0x1.3fffffffea589p2 0x1.512p-19 F +REG epsg:26720 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.f8p5 0x1.68p5 0x0.0p0 F +REG epsg:26720 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26720 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26720 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26720 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26721 0 OK 0x1.e848000000011p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.c800000000001p5 0x1.68p5 0x0.0p0 F +REG epsg:26721 1 OK -0x1.95bacc669d218p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26721 2 OK 0x1.0d7facc669d2ep20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.8f6e73ffc1ea8p5 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26721 3 OK -0x1.99a5174d6bd8p12 0x1.5380b21056044p22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26721 4 OK 0x1.eb7b4a2e9ad8ep19 0x1.5380b21056044p22 0x0.0p0 -0x1.8f6e73ffc1ea8p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26722 0 OK 0x1.e848000000009p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.98p5 0x1.68p5 0x0.0p0 F +REG epsg:26722 1 OK -0x1.95bacc669d218p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.d0918c003e157p5 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26722 2 OK 0x1.0d7facc669d29p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.5f6e73ffc1ea8p5 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26722 3 OK -0x1.99a5174d6bd8p12 0x1.5380b21056044p22 0x0.0p0 -0x1.d0918c003e157p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26722 4 OK 0x1.eb7b4a2e9ad86p19 0x1.5380b21056044p22 0x0.0p0 -0x1.5f6e73ffc1ea9p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:26729 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG epsg:26729 1 OK -0x1.59bbcc451cc46p20 -0x1.b1915fd794404p20 0x0.0p0 -0x1.6e8b909db4109p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG epsg:26729 2 OK 0x1.26efe6228e61bp21 -0x1.b1915fd794404p20 0x0.0p0 -0x1.401f1a0cf69a2p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG epsg:26729 3 OK -0x1.2be06b84012c9p20 0x1.c89117549007p20 0x0.0p0 -0x1.6e8b909db0aa7p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG epsg:26729 4 OK 0x1.100235c20095dp21 0x1.c89117549006fp20 0x0.0p0 -0x1.401f1a0cfa004p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG epsg:2673 0 OK 0x1.2d5c5b2e1e03ap25 0x1.463d2e03cec63p6 0x1.523086b44p4 0x1.d4p6 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2673 1 OK 0x1.291fff68fab77p25 -0x1.0ef4b254da438p19 0x1.04dd6a258p4 0x1.c00000001d516p6 -0x1.3fffffffea54fp2 0x1.514p-19 F +REG epsg:2673 2 OK 0x1.3198b6f301353p25 -0x1.0ef4b05e78f52p19 0x1.38b08eecp3 0x1.e7ffffffe2b58p6 -0x1.3fffffffea5a9p2 0x1.518p-19 F +REG epsg:2673 3 OK 0x1.2920000831f87p25 0x1.0f0915fc439cap19 0x1.e85461184p4 0x1.c00000001d50ep6 0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:2673 4 OK 0x1.3198b653d00bcp25 0x1.0f091405bcdf4p19 0x1.7fcf4dc68p4 0x1.e7ffffffe2b5fp6 0x1.3fffffffea593p2 0x1.512p-19 F +REG epsg:26730 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:26730 1 OK -0x1.5942ca8f0db3ap20 -0x1.b1c5acd71e1dfp20 0x0.0p0 -0x1.751811170dd69p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG epsg:26730 2 OK 0x1.26b3654786d9ep21 -0x1.b1c5acd71e1dfp20 0x0.0p0 -0x1.46e7eee8f2297p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG epsg:26730 3 OK -0x1.2c5176ea6dd58p20 0x1.c8511ef2c7c8p20 0x0.0p0 -0x1.751811170d69ep6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG epsg:26730 4 OK 0x1.103abb7536eadp21 0x1.c8511ef2c7c8p20 0x0.0p0 -0x1.46e7eee8f2963p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG epsg:26731 0 OK 0x1.47d6568c3dd7cp21 0x1.ccbde785138a8p20 0x0.0p0 -0x1.0b55555555556p7 0x1.c7ffffffffe6p5 0x0.0p0 F +REG epsg:26731 1 OK 0x1.2c587395d5f5p19 0x1.78df5f9a27ap17 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.9fffffffffb6cp5 0x0.0p0 F +REG epsg:26731 2 OK 0x1.21eb4d90a1e38p22 0x1.7f3bd741f984p17 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffb6ap5 0x0.0p0 F +REG epsg:26731 3 OK 0x1.0f2d59d3e843p20 0x1.d2a4cd5726054p21 0x0.0p0 -0x1.1db1b1b64ab13p7 0x1.effffffffff8fp5 0x0.0p0 F +REG epsg:26731 4 OK 0x1.0433c99627672p22 0x1.d3427fb41f1dcp21 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.effffffffff8fp5 0x0.0p0 F +REG epsg:26732 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG epsg:26732 1 OK -0x1.7832e8e4606d7p20 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.2d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26732 2 OK 0x1.362b74723036p21 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.0afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26732 3 OK -0x1.0cd6e1619c97bp20 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.2d035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26732 4 OK 0x1.007d70b0ce4b5p21 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.0afcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26733 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG epsg:26733 1 OK -0x1.7832e8e4606d7p20 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.35035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26733 2 OK 0x1.362b74723036dp21 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.12fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26733 3 OK -0x1.0cd6e1619c97bp20 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.35035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26733 4 OK 0x1.007d70b0ce4bfp21 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.12fcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26734 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG epsg:26734 1 OK -0x1.7832e8e4606bdp20 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.3d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26734 2 OK 0x1.362b74723036dp21 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.1afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26734 3 OK -0x1.0cd6e1619c967p20 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.3d035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26734 4 OK 0x1.007d70b0ce4bfp21 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.1afcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26735 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG epsg:26735 1 OK -0x1.7832e8e4606bdp20 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.45035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26735 2 OK 0x1.362b74723036dp21 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.22fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26735 3 OK -0x1.0cd6e1619c967p20 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.45035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26735 4 OK 0x1.007d70b0ce4bfp21 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.22fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26736 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG epsg:26736 1 OK -0x1.7832e8e4606d7p20 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.4d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26736 2 OK 0x1.362b74723036p21 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.2afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26736 3 OK -0x1.0cd6e1619c97bp20 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.4d035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26736 4 OK 0x1.007d70b0ce4b5p21 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.2afcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26737 0 OK 0x1.55cc000000003p19 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG epsg:26737 1 OK -0x1.475ee8e4606d6p20 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.55035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26737 2 OK 0x1.4e9574723036p21 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.32fcaafc23cp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26737 3 OK -0x1.b805c2c3392f5p19 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.55035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26737 4 OK 0x1.18e770b0ce4b5p21 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.32fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26738 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG epsg:26738 1 OK -0x1.7832e8e4606bdp20 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.5d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26738 2 OK 0x1.362b74723036dp21 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.3afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26738 3 OK -0x1.0cd6e1619c967p20 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.5d035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26738 4 OK 0x1.007d70b0ce4bfp21 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.3afcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26739 0 OK 0x1.24f8000000003p19 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG epsg:26739 1 OK -0x1.5fc8e8e4606bcp20 -0x1.a1864512abb7fp20 0x0.0p0 -0x1.65035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26739 2 OK 0x1.426074723036dp21 -0x1.a1864512abb7dp20 0x0.0p0 -0x1.42fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG epsg:26739 3 OK -0x1.e8d9c2c3392cdp19 0x1.d6db33a7497f4p20 0x0.0p0 -0x1.65035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:26739 4 OK 0x1.0cb270b0ce4bfp21 0x1.d6db33a7497f7p20 0x0.0p0 -0x1.42fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG epsg:2674 0 OK 0x1.34fd77dd089aep25 0x1.463d353ffa309p6 0x1.2fe32d1bcp4 0x1.e000000000001p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2674 1 OK 0x1.30c11c000c5c7p25 -0x1.0ef4b85b00b57p19 0x1.d813940c8p3 0x1.cc0000001d51ep6 -0x1.3fffffffea549p2 0x1.51cp-19 F +REG epsg:2674 2 OK 0x1.3939d3b9b9295p25 -0x1.0ef4b664947f6p19 0x1.c45a5a3ep2 0x1.f3ffffffe2b5fp6 -0x1.3fffffffea5b2p2 0x1.50ap-19 F +REG epsg:2674 3 OK 0x1.30c11c9f44241p25 0x1.0f091c02dce88p19 0x1.cf80c49fp4 0x1.cc0000001d51ap6 0x1.3fffffffea53p2 0x1.51ap-19 F +REG epsg:2674 4 OK 0x1.3939d31a88716p25 0x1.0f091a0c4b41dp19 0x1.548da33c8p4 0x1.f3ffffffe2b66p6 0x1.3fffffffea598p2 0x1.508p-19 F +REG epsg:26740 0 OK 0x1.6e36000000004p21 0x1.f90afa959da1bp18 0x0.0p0 -0x1.6p7 0x1.a355555555119p5 0x0.0p0 F +REG epsg:26740 1 OK 0x1.cf24f0bf28857p20 -0x1.d67fca3ce8439p18 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa39fp5 0x0.0p0 F +REG epsg:26740 2 OK 0x1.f4d987a06bbdcp21 -0x1.d67fca3ce8439p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa39fp5 0x0.0p0 F +REG epsg:26740 3 OK 0x1.efc3d4937bb6ep20 0x1.8288418ff6914p20 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffd9ep5 0x0.0p0 F +REG epsg:26740 4 OK 0x1.e48a15b642251p21 0x1.8288418ff6914p20 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffd9ep5 0x0.0p0 F +REG epsg:26741 0 OK 0x1.e848000000005p20 0x1.9f0ad61e5cd69p18 0x0.0p0 -0x1.e8p6 0x1.43fffffffffe6p5 0x0.0p0 F +REG epsg:26741 1 OK 0x1.10b92589ab32p20 -0x1.9013b67605a7ep18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555535p5 0x0.0p0 F +REG epsg:26741 2 OK 0x1.5feb6d3b2a665p21 -0x1.9013b67605a7ep18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555535p5 0x0.0p0 F +REG epsg:26741 3 OK 0x1.1f4229cc316f9p20 0x1.3adf49e54c7cdp20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa95p5 0x0.0p0 F +REG epsg:26741 4 OK 0x1.58a6eb19e747ap21 0x1.3adf49e54c7cdp20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa95p5 0x0.0p0 F +REG epsg:26742 0 OK 0x1.e848000000005p20 0x1.8148d1b3b0afbp18 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe3p5 0x0.0p0 F +REG epsg:26742 1 OK 0x1.20fc48ca36fd8p20 -0x1.75344c364ea74p18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa7cp5 0x0.0p0 F +REG epsg:26742 2 OK 0x1.57c9db9ae4809p21 -0x1.75344c364ea74p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7cp5 0x0.0p0 F +REG epsg:26742 3 OK 0x1.2cc3b9656eb3p20 0x1.23e317654b49cp20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.475555555554p5 0x0.0p0 F +REG epsg:26742 4 OK 0x1.51e6234d48a5ep21 0x1.23e317654b49cp20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.475555555554p5 0x0.0p0 F +REG epsg:26743 0 OK 0x1.e848000000005p20 0x1.57b6f48b115cap18 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb96p5 0x0.0p0 F +REG epsg:26743 1 OK 0x1.373bcbd6bf00bp20 -0x1.4e90f89df5f4ep18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444415p5 0x0.0p0 F +REG epsg:26743 2 OK 0x1.4caa1a14a081p21 -0x1.4e90f89df5f4ep18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444413p5 0x0.0p0 F +REG epsg:26743 3 OK 0x1.402e2e49b0448p20 0x1.04050bb8fef64p20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333316p5 0x0.0p0 F +REG epsg:26743 4 OK 0x1.4830e8db27dfp21 0x1.04050bb8fef64p20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333316p5 0x0.0p0 F +REG epsg:26744 0 OK 0x1.e848000000005p20 0x1.54b1071b2d452p18 0x0.0p0 -0x1.dcp6 0x1.225555555552ap5 0x0.0p0 F +REG epsg:26744 1 OK 0x1.38fbbaa856bdep20 -0x1.4c1516565ba67p18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffccp5 0x0.0p0 F +REG epsg:26744 2 OK 0x1.4bca22abd4a16p21 -0x1.4c1516565ba67p18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffccp5 0x0.0p0 F +REG epsg:26744 3 OK 0x1.416b6581f542p20 0x1.01a00f7795b4ap20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa87p5 0x0.0p0 F +REG epsg:26744 4 OK 0x1.47924d3f055f5p21 0x1.01a00f7795b4ap20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa87p5 0x0.0p0 F +REG epsg:26745 0 OK 0x1.e848000000005p20 0x1.5d7658f313c2fp18 0x0.0p0 -0x1.d800000000001p6 0x1.13ddddddddda9p5 0x0.0p0 F +REG epsg:26745 1 OK 0x1.349c7e060dba3p20 -0x1.5501734957a52p18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221dfp5 0x0.0p0 F +REG epsg:26745 2 OK 0x1.4df9c0fcf9244p21 -0x1.5501734957a52p18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221dfp5 0x0.0p0 F +REG epsg:26745 3 OK 0x1.3ce83131d0cfdp20 0x1.082db193d95e6p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.239999999996fp5 0x0.0p0 F +REG epsg:26745 4 OK 0x1.49d3e76717996p21 0x1.082db193d95e6p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.239999999996fp5 0x0.0p0 F +REG epsg:26746 0 OK 0x1.e848000000005p20 0x1.30fa27dd889d2p18 0x0.0p0 -0x1.d1p6 0x1.08333333332f5p5 0x0.0p0 F +REG epsg:26746 1 OK 0x1.4c1426a9bfb5ap20 -0x1.2ae470c831192p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee52p4 0x0.0p0 F +REG epsg:26746 2 OK 0x1.423decab2025p21 -0x1.2ae470c831192p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee52p4 0x0.0p0 F +REG epsg:26746 3 OK 0x1.52116ae0eef52p20 0x1.cc7a21fd48d07p19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebdp5 0x0.0p0 F +REG epsg:26746 4 OK 0x1.3f3f4a8f88854p21 0x1.cc7a21fd48d07p19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeebdp5 0x0.0p0 F +REG epsg:26747 0 OK 0x1.ff1224a3d70a8p21 0x1.9a1dd56f0ae9bp18 0x0.0p0 -0x1.d955555555552p6 0x1.11222222221ecp5 0x0.0p0 F +REG epsg:26747 1 OK 0x1.d1ea7f244cec6p21 0x1.c71080a10d308p15 0x0.0p0 -0x1.de2a91549c3cfp6 0x1.09222222221e5p5 0x0.0p0 F +REG epsg:26747 2 OK 0x1.161ce511b093cp22 0x1.c71080a10d308p15 0x0.0p0 -0x1.d48019560e6d8p6 0x1.09222222221e5p5 0x0.0p0 F +REG epsg:26747 3 OK 0x1.d2f7b14a8a9cp21 0x1.7fd133b09ecb8p19 0x0.0p0 -0x1.de2a91549c3cfp6 0x1.19222222221f1p5 0x0.0p0 F +REG epsg:26747 4 OK 0x1.15964bfe91bcp22 0x1.7fd133b09ecb8p19 0x0.0p0 -0x1.d48019560e6d8p6 0x1.19222222221f1p5 0x0.0p0 F +REG epsg:26748 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:26748 1 OK -0x1.5a2b9c2bc88a9p20 -0x1.b152c65f46cfbp20 0x0.0p0 -0x1.cfffd464bd7dfp6 0x1.9fffffffbf24cp4 0x0.0p0 F +REG epsg:26748 2 OK 0x1.2727ce15e445ep21 -0x1.b152c65f46cf9p20 0x0.0p0 -0x1.a15580f097d7bp6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:26748 3 OK -0x1.2b64c487b07c7p20 0x1.c8c76a71ba588p20 0x0.0p0 -0x1.cfffd464b6efp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:26748 4 OK 0x1.0fc46243d83edp21 0x1.c8c76a71ba588p20 0x0.0p0 -0x1.a15580f09e669p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:26749 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:26749 1 OK -0x1.5a2b9c2bc88ccp20 -0x1.b152c65f46cf9p20 0x0.0p0 -0x1.d6ffd464bd7ep6 0x1.9fffffffbf24cp4 0x0.0p0 F +REG epsg:26749 2 OK 0x1.2727ce15e445ep21 -0x1.b152c65f46cf9p20 0x0.0p0 -0x1.a85580f097d7bp6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:26749 3 OK -0x1.2b64c487b07e7p20 0x1.c8c76a71ba589p20 0x0.0p0 -0x1.d6ffd464b6ef1p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:26749 4 OK 0x1.0fc46243d83edp21 0x1.c8c76a71ba588p20 0x0.0p0 -0x1.a85580f09e669p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:2675 0 OK 0x1.3c9e949b798eap25 0x1.463d3da588b23p6 0x1.0813e164cp4 0x1.ebfffffffffffp6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2675 1 OK 0x1.386238a2d12eep25 -0x1.0ef4bf58c251fp19 0x1.9b2795f9p3 0x1.d80000001d529p6 -0x1.3fffffffea545p2 0x1.512p-19 F +REG epsg:2675 2 OK 0x1.40daf093cae04p25 -0x1.0ef4bd624b633p19 0x1.02232bb2p2 0x1.ffffffffe2b67p6 -0x1.3fffffffea5b3p2 0x1.50ep-19 F +REG epsg:2675 3 OK 0x1.38623942097c8p25 0x1.0f09230123cfbp19 0x1.b10aca108p4 0x1.d80000001d526p6 0x1.3fffffffea52dp2 0x1.516p-19 F +REG epsg:2675 4 OK 0x1.40daeff49a95dp25 0x1.0f09210a876efp19 0x1.23ffdebdcp4 0x1.ffffffffe2b6cp6 0x1.3fffffffea5a1p2 0x1.51p-19 F +REG epsg:26750 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:26750 1 OK -0x1.5a2f9b268308fp20 -0x1.b156791110694p20 0x0.0p0 -0x1.de5529ba12d32p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:26750 2 OK 0x1.2729cd9341849p21 -0x1.b156791110694p20 0x0.0p0 -0x1.afaad645ed2cep6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:26750 3 OK -0x1.2b685d509efc1p20 0x1.c8cb506208c87p20 0x0.0p0 -0x1.de5529ba0c443p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:26750 4 OK 0x1.0fc62ea84f7e2p21 0x1.c8cb506208c87p20 0x0.0p0 -0x1.afaad645f3bbbp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:26751 0 OK 0x1.e848000000005p20 0x1.51aadd8a552ep18 0x0.0p0 -0x1.7p6 0x1.1a44444444415p5 0x0.0p0 F +REG epsg:26751 1 OK 0x1.3ab5089e9d128p20 -0x1.49874bff34941p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110d6p5 0x0.0p0 F +REG epsg:26751 2 OK 0x1.4aed7bb0b1771p21 -0x1.49874bff34941p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110d6p5 0x0.0p0 F +REG epsg:26751 3 OK 0x1.42b09b297b3b3p20 0x1.fe7fcfc77ca69p19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.297777777774dp5 0x0.0p0 F +REG epsg:26751 4 OK 0x1.46efb26b4262cp21 0x1.fe7fcfc77ca69p19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.297777777774dp5 0x0.0p0 F +REG epsg:26752 0 OK 0x1.e848000000005p20 0x1.751cd28cb66c7p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb83p5 0x0.0p0 F +REG epsg:26752 1 OK 0x1.2844620ab4c82p20 -0x1.6bbd325f3bf6ap18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd4fp4 0x0.0p0 F +REG epsg:26752 2 OK 0x1.5425cefaa59c4p21 -0x1.6bbd325f3bf6ap18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd4fp4 0x0.0p0 F +REG epsg:26752 3 OK 0x1.3178446559863p20 0x1.1a23ed476f36ep20 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888885ep5 0x0.0p0 F +REG epsg:26752 4 OK 0x1.4f8bddcd533d4p21 0x1.1a23ed476f36ep20 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888885ep5 0x0.0p0 F +REG epsg:26753 0 OK 0x1.e848000000005p20 0x1.01e6d748c0a95p18 0x0.0p0 -0x1.a6p6 0x1.407777777775dp5 0x0.0p0 F +REG epsg:26753 1 OK 0x1.64118e10826acp20 -0x1.f88af256c2c3bp17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddcp5 0x0.0p0 F +REG epsg:26753 2 OK 0x1.363f38f7becafp21 -0x1.f88af256c2c3bp17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddcp5 0x0.0p0 F +REG epsg:26753 3 OK 0x1.699423d79f172p20 0x1.859cf2a084875p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fap5 0x0.0p0 F +REG epsg:26753 4 OK 0x1.337dee143074cp21 0x1.859cf2a084875p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fap5 0x0.0p0 F +REG epsg:26754 0 OK 0x1.e848000000005p20 0x1.54d5548443daap18 0x0.0p0 -0x1.a6p6 0x1.3655555555536p5 0x0.0p0 F +REG epsg:26754 1 OK 0x1.38918a3d8a95cp20 -0x1.4b636eba5a8bcp18 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdap5 0x0.0p0 F +REG epsg:26754 2 OK 0x1.4bff3ae13ab57p21 -0x1.4b636eba5a8bcp18 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdap5 0x0.0p0 F +REG epsg:26754 3 OK 0x1.41cb7b523fa4cp20 0x1.01ec048e0627dp20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa92p5 0x0.0p0 F +REG epsg:26754 4 OK 0x1.47624256e02dfp21 0x1.01ec048e0627dp20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa92p5 0x0.0p0 F +REG epsg:26755 0 OK 0x1.e848000000005p20 0x1.3a17a25a7c1cdp18 0x0.0p0 -0x1.a6p6 0x1.2c6666666664p5 0x0.0p0 F +REG epsg:26755 1 OK 0x1.46d4cd2855bbp20 -0x1.327075f9463adp18 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444415p5 0x0.0p0 F +REG epsg:26755 2 OK 0x1.44dd996bd522dp21 -0x1.327075f9463adp18 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444415p5 0x0.0p0 F +REG epsg:26755 3 OK 0x1.4e531117350cfp20 0x1.dae2717bef397p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:26755 4 OK 0x1.411e77746579ep21 0x1.dae2717bef397p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:26756 0 OK 0x1.24f8000000003p19 0x1.6fad2114ebc5ep17 0x0.0p0 -0x1.23p6 0x1.4acccccccccb8p5 0x0.0p0 F +REG epsg:26756 1 OK 0x1.a600bfeb48284p17 -0x1.69b5d1658f875p17 0x0.0p0 -0x1.28818d3773553p6 0x1.428888888887p5 0x0.0p0 F +REG epsg:26756 2 OK 0x1.e06fd0052df65p19 -0x1.69b5d1658f875p17 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.428888888887p5 0x0.0p0 F +REG epsg:26756 3 OK 0x1.bd6e82f4b8d68p17 0x1.153a7ae9d4673p19 0x0.0p0 -0x1.28818d3773553p6 0x1.53111111111p5 0x0.0p0 F +REG epsg:26756 4 OK 0x1.da945f42d1cacp19 0x1.153a7ae9d4673p19 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.53111111111p5 0x0.0p0 F +REG epsg:26757 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:26757 1 OK -0x1.614b5b374c4e7p20 -0x1.adf5fd2ece012p20 0x0.0p0 -0x1.470c0a38e06acp6 0x1.07ffffffa238ep5 0x0.0p0 F +REG epsg:26757 2 OK 0x1.2ab7ad9ba627dp21 -0x1.adf5fd2ece011p20 0x0.0p0 -0x1.14494b1c74eaap6 0x1.07ffffffa238ep5 0x0.0p0 F +REG epsg:26757 3 OK -0x1.246a795ad40c8p20 0x1.cc667775e2dd1p20 0x0.0p0 -0x1.470c0a3894519p6 0x1.57ffffff51f56p5 0x0.0p0 F +REG epsg:26757 4 OK 0x1.0c473cad6a06dp21 0x1.cc667775e2dd2p20 0x0.0p0 -0x1.14494b1cc103dp6 0x1.57ffffff51f56p5 0x0.0p0 F +REG epsg:26758 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:26758 1 OK -0x1.5455f70007f3fp20 -0x1.b410a901266cdp20 0x0.0p0 -0x1.59f3301236c33p6 0x1.355555553897bp4 0x0.0p0 F +REG epsg:26758 2 OK 0x1.243cfb8003fa1p21 -0x1.b410a901266cdp20 0x0.0p0 -0x1.2e0ccfedc93cdp6 0x1.355555553897bp4 0x0.0p0 F +REG epsg:26758 3 OK -0x1.3127ed2a7068ep20 0x1.c5bfa2c3a663p20 0x0.0p0 -0x1.59f330124d234p6 0x1.d55555551ab68p4 0x0.0p0 F +REG epsg:26758 4 OK 0x1.12a5f69538348p21 0x1.c5bfa2c3a663p20 0x0.0p0 -0x1.2e0ccfedb2dccp6 0x1.d55555551ab68p4 0x0.0p0 F +REG epsg:26759 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:26759 1 OK -0x1.5455f70007f3fp20 -0x1.b410a901266cdp20 0x0.0p0 -0x1.5df3301236c33p6 0x1.355555553897bp4 0x0.0p0 F +REG epsg:26759 2 OK 0x1.243cfb8003fa1p21 -0x1.b410a901266cdp20 0x0.0p0 -0x1.320ccfedc93cdp6 0x1.355555553897bp4 0x0.0p0 F +REG epsg:26759 3 OK -0x1.3127ed2a7068ep20 0x1.c5bfa2c3a663p20 0x0.0p0 -0x1.5df330124d234p6 0x1.d55555551ab68p4 0x0.0p0 F +REG epsg:26759 4 OK 0x1.12a5f69538348p21 0x1.c5bfa2c3a663p20 0x0.0p0 -0x1.320ccfedb2dccp6 0x1.d55555551ab68p4 0x0.0p0 F +REG epsg:2676 0 OK 0x1.443fb16bb9bb5p25 0x1.463d472e962c6p6 0x1.b5bd245p3 0x1.f7ffffffffffep6 0x1.c72f1eacb6e8p-62 0x1.546p-19 T +REG epsg:2676 1 OK 0x1.40035553a5751p25 -0x1.0ef4c74937691p19 0x1.532198ce8p3 0x1.e40000001d53p6 -0x1.3fffffffea53bp2 0x1.518p-19 F +REG epsg:2676 2 OK 0x1.487c0d836bd47p25 -0x1.0ef4c552b5f93p19 0x1.5a1eb8fp-1 0x1.05fffffff15b8p7 -0x1.3fffffffea5bcp2 0x1.512p-19 F +REG epsg:2676 3 OK 0x1.400355f2de47cp25 0x1.0f092af23044dp19 0x1.8d07d0c7p4 0x1.e40000001d52bp6 0x1.3fffffffea523p2 0x1.52p-19 F +REG epsg:2676 4 OK 0x1.487c0ce43bf35p25 0x1.0f0928fb89614p19 0x1.dc9022fc8p3 0x1.05fffffff15bbp7 0x1.3fffffffea5a7p2 0x1.514p-19 F +REG epsg:26760 0 OK 0x1.e848000000005p20 0x1.36be34905be72p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff5fp4 0x0.0p0 F +REG epsg:26760 1 OK 0x1.495f83d321e84p20 -0x1.312bfdcccfd41p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff48p4 0x0.0p0 F +REG epsg:26760 2 OK 0x1.43983e166f0bap21 -0x1.312bfdcccfd41p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff48p4 0x0.0p0 F +REG epsg:26760 3 OK 0x1.4edfc37b6cfdp20 0x1.d4e49e3559dc3p19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff79p4 0x0.0p0 F +REG epsg:26760 4 OK 0x1.40d81e4249814p21 0x1.d4e49e3559dc3p19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG epsg:26766 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:26766 1 OK -0x1.593ecd99af28cp20 -0x1.b1c1f93264312p20 0x0.0p0 -0x1.5fc2bbc1b8814p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG epsg:26766 2 OK 0x1.26b166ccd795p21 -0x1.b1c1f93264311p20 0x0.0p0 -0x1.319299939cd42p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG epsg:26766 3 OK -0x1.2c4ddc2440fb5p20 0x1.c84d3a0d6c8dbp20 0x0.0p0 -0x1.5fc2bbc1b8149p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG epsg:26766 4 OK 0x1.1038ee12207e4p21 0x1.c84d3a0d6c8dcp20 0x0.0p0 -0x1.319299939d40dp6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG epsg:26767 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:26767 1 OK -0x1.593ecd99af29dp20 -0x1.b1c1f93264311p20 0x0.0p0 -0x1.67c2bbc1b8815p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG epsg:26767 2 OK 0x1.26b166ccd7947p21 -0x1.b1c1f93264312p20 0x0.0p0 -0x1.399299939cd42p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG epsg:26767 3 OK -0x1.2c4ddc2440fc6p20 0x1.c84d3a0d6c8dcp20 0x0.0p0 -0x1.67c2bbc1b8149p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG epsg:26767 4 OK 0x1.1038ee12207dcp21 0x1.c84d3a0d6c8dbp20 0x0.0p0 -0x1.399299939d40dp6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG epsg:26768 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:26768 1 OK -0x1.6582eb3f68668p20 -0x1.abd176d9867bbp20 0x0.0p0 -0x1.db708506b142p6 0x1.25555554adcd3p5 0x0.0p0 F +REG epsg:26768 2 OK 0x1.2cd3759fb4335p21 -0x1.abd176d9867bbp20 0x0.0p0 -0x1.a5e4d04ea413cp6 0x1.25555554adcd3p5 0x0.0p0 F +REG epsg:26768 3 OK -0x1.2024b495d21fap20 0x1.ce72c63a28ac9p20 0x0.0p0 -0x1.db70850623abap6 0x1.75555554471d5p5 0x0.0p0 F +REG epsg:26768 4 OK 0x1.0a245a4ae90fep21 0x1.ce72c63a28ac9p20 0x0.0p0 -0x1.a5e4d04f31aap6 0x1.75555554471d5p5 0x0.0p0 F +REG epsg:26769 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:26769 1 OK -0x1.6582eb3f68658p20 -0x1.abd176d9867bdp20 0x0.0p0 -0x1.e2c5da5c06973p6 0x1.25555554adcd3p5 0x0.0p0 F +REG epsg:26769 2 OK 0x1.2cd3759fb4335p21 -0x1.abd176d9867bbp20 0x0.0p0 -0x1.ad3a25a3f968fp6 0x1.25555554adcd3p5 0x0.0p0 F +REG epsg:26769 3 OK -0x1.2024b495d21ecp20 0x1.ce72c63a28ac8p20 0x0.0p0 -0x1.e2c5da5b7900cp6 0x1.75555554471d5p5 0x0.0p0 F +REG epsg:26769 4 OK 0x1.0a245a4ae90fep21 0x1.ce72c63a28ac9p20 0x0.0p0 -0x1.ad3a25a486ff3p6 0x1.75555554471d5p5 0x0.0p0 F +REG epsg:2677 0 OK 0x1.4be0ce50057efp25 0x1.463d51d471fc3p6 0x1.50c5ef54p3 0x1.02p7 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2677 1 OK 0x1.47a47214db986p25 -0x1.0ef4d026ce03dp19 0x1.0034254cp3 0x1.f00000001d535p6 -0x1.3fffffffea535p2 0x1.518p-19 F +REG epsg:2677 2 OK 0x1.501d2a8ac2608p25 -0x1.0ef4ce3042511p19 -0x1.7f59c062p1 0x1.0bfffffff15bbp7 -0x1.3fffffffea5c5p2 0x1.50ep-19 F +REG epsg:2677 3 OK 0x1.47a472b414eedp25 0x1.0f0933d06fe69p19 0x1.63911d1e4p4 0x1.f00000001d52fp6 0x1.3fffffffea51fp2 0x1.518p-19 F +REG epsg:2677 4 OK 0x1.501d29eb92e42p25 0x1.0f0931d9bebe9p19 0x1.6717d89cp3 0x1.0bfffffff15bfp7 0x1.3fffffffea5acp2 0x1.514p-19 F +REG epsg:26770 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:26770 1 OK -0x1.6581321b3547bp20 -0x1.abcfed52a022dp20 0x0.0p0 -0x1.e9c5da5c06972p6 0x1.25555554adcd3p5 0x0.0p0 F +REG epsg:26770 2 OK 0x1.2cd2990d9aa3fp21 -0x1.abcfed52a022dp20 0x0.0p0 -0x1.b43a25a3f968fp6 0x1.25555554adcd3p5 0x0.0p0 F +REG epsg:26770 3 OK -0x1.20233b4072242p20 0x1.ce711cd8899c9p20 0x0.0p0 -0x1.e9c5da5b7900cp6 0x1.75555554471d5p5 0x0.0p0 F +REG epsg:26770 4 OK 0x1.0a239da039122p21 0x1.ce711cd8899c9p20 0x0.0p0 -0x1.b43a25a486ff4p6 0x1.75555554471d5p5 0x0.0p0 F +REG epsg:26771 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:26771 1 OK -0x1.5fd807e9ee9eep20 -0x1.aea87df00f413p20 0x0.0p0 -0x1.7a44648b879a6p6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG epsg:26771 2 OK 0x1.29fe03f4f74fp21 -0x1.aea87df00f414p20 0x0.0p0 -0x1.4866461f23105p6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG epsg:26771 3 OK -0x1.25d80eff720ecp20 0x1.cbacaed185268p20 0x0.0p0 -0x1.7a44648b4d3d2p6 0x1.4d555554c1c21p5 0x0.0p0 F +REG epsg:26771 4 OK 0x1.0cfe077fb907p21 0x1.cbacaed185268p20 0x0.0p0 -0x1.4866461f5d6d8p6 0x1.4d555554c1c21p5 0x0.0p0 F +REG epsg:26772 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:26772 1 OK -0x1.5fd3ed65de291p20 -0x1.aea4c34e7b8dbp20 0x0.0p0 -0x1.8199b9e0dcefbp6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG epsg:26772 2 OK 0x1.29fbf6b2ef152p21 -0x1.aea4c34e7b8dap20 0x0.0p0 -0x1.4fbb9b747865bp6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG epsg:26772 3 OK -0x1.25d4750c93e9cp20 0x1.cba8b3de0635p20 0x0.0p0 -0x1.8199b9e0a2928p6 0x1.4d555554c1c21p5 0x0.0p0 F +REG epsg:26772 4 OK 0x1.0cfc3a8649f56p21 0x1.cba8b3de0635p20 0x0.0p0 -0x1.4fbb9b74b2c2ep6 0x1.4d555554c1c21p5 0x0.0p0 F +REG epsg:26773 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:26773 1 OK -0x1.60bc18aaebb1ap20 -0x1.ae379507de353p20 0x0.0p0 -0x1.6fe04911dfa77p6 0x1.03ffffffa954bp5 0x0.0p0 F +REG epsg:26773 2 OK 0x1.2a700c5575d97p21 -0x1.ae379507de352p20 0x0.0p0 -0x1.3d750c4375adfp6 0x1.03ffffffa954ap5 0x0.0p0 F +REG epsg:26773 3 OK -0x1.24f2f6c0a8092p20 0x1.cc1dccd452ad2p20 0x0.0p0 -0x1.6fe049119a84cp6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG epsg:26773 4 OK 0x1.0c8b7b6054052p21 0x1.cc1dccd452ad3p20 0x0.0p0 -0x1.3d750c43bad0ap6 0x1.53ffffff5c59p5 0x0.0p0 F +REG epsg:26774 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:26774 1 OK -0x1.60bc18aaebb1ap20 -0x1.ae379507de353p20 0x0.0p0 -0x1.758af3bc8a52p6 0x1.03ffffffa954bp5 0x0.0p0 F +REG epsg:26774 2 OK 0x1.2a700c5575d8ep21 -0x1.ae379507de353p20 0x0.0p0 -0x1.431fb6ee2058ap6 0x1.03ffffffa954bp5 0x0.0p0 F +REG epsg:26774 3 OK -0x1.24f2f6c0a8092p20 0x1.cc1dccd452ad2p20 0x0.0p0 -0x1.758af3bc452f5p6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG epsg:26774 4 OK 0x1.0c8b7b605404ap21 0x1.cc1dccd452ad2p20 0x0.0p0 -0x1.431fb6ee657b5p6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG epsg:26775 0 OK 0x1.e848000000005p20 0x1.3a5b60e00d338p18 0x0.0p0 -0x1.76p6 0x1.53111111111p5 0x0.0p0 F +REG epsg:26775 1 OK 0x1.4617b90fd6aeep20 -0x1.313a445dff91dp18 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed6p5 0x0.0p0 F +REG epsg:26775 2 OK 0x1.453c237814a8ep21 -0x1.313a445dff91dp18 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed6p5 0x0.0p0 F +REG epsg:26775 3 OK 0x1.4efc8fe7095fap20 0x1.dbf2b454b7bcap19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333327p5 0x0.0p0 F +REG epsg:26775 4 OK 0x1.40c9b80c7b508p21 0x1.dbf2b454b7bcap19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333327p5 0x0.0p0 F +REG epsg:26776 0 OK 0x1.e848000000005p20 0x1.3d3df78f17a1cp18 0x0.0p0 -0x1.76p6 0x1.4722222222209p5 0x0.0p0 F +REG epsg:26776 1 OK 0x1.44c2c089fe7ccp20 -0x1.346ca62803d9p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddbfp5 0x0.0p0 F +REG epsg:26776 2 OK 0x1.45e69fbb00c17p21 -0x1.346ca62803d9p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddbfp5 0x0.0p0 F +REG epsg:26776 3 OK 0x1.4d5d6efeaf35p20 0x1.e0236a698db5ap19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666652p5 0x0.0p0 F +REG epsg:26776 4 OK 0x1.41994880a8656p21 0x1.e0236a698db5ap19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666652p5 0x0.0p0 F +REG epsg:26777 0 OK 0x1.e848000000005p20 0x1.01db5a08c1ff7p18 0x0.0p0 -0x1.88p6 0x1.387777777775ap5 0x0.0p0 F +REG epsg:26777 1 OK 0x1.642bf4c50dab6p20 -0x1.f8dae63281a23p17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbbp5 0x0.0p0 F +REG epsg:26777 2 OK 0x1.3632059d792a2p21 -0x1.f8dae63281a23p17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbbp5 0x0.0p0 F +REG epsg:26777 3 OK 0x1.697d3e5933dd2p20 0x1.8573fe5c6817p19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f7p5 0x0.0p0 F +REG epsg:26777 4 OK 0x1.338960d366115p21 0x1.8573fe5c6817p19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f7p5 0x0.0p0 F +REG epsg:26778 0 OK 0x1.e848000000005p20 0x1.51ccec4897d6bp18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeecap5 0x0.0p0 F +REG epsg:26778 1 OK 0x1.3a5562add16aep20 -0x1.48ea72bd968d5p18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb88p5 0x0.0p0 F +REG epsg:26778 2 OK 0x1.4b1d4ea9174b6p21 -0x1.48ea72bd968d5p18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb88p5 0x0.0p0 F +REG epsg:26778 3 OK 0x1.43064e7e00035p20 0x1.ff09be4f390a6p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222206p5 0x0.0p0 F +REG epsg:26778 4 OK 0x1.46c4d8c0ffff2p21 0x1.ff09be4f390a6p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222206p5 0x0.0p0 F +REG epsg:26779 0 OK 0x1.e848000000005p20 0x1.04c96de11ecfcp18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbdp5 0x0.0p0 F +REG epsg:26779 1 OK 0x1.62b43264b9ca3p20 -0x1.fec9958f3482ap17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221f9p5 0x0.0p0 F +REG epsg:26779 2 OK 0x1.36ede6cda31b4p21 -0x1.fec9958f3482ap17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221f9p5 0x0.0p0 F +REG epsg:26779 3 OK 0x1.67fdab3052dc8p20 0x1.89d4eec3dac76p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999997ep5 0x0.0p0 F +REG epsg:26779 4 OK 0x1.34492a67d6921p21 0x1.89d4eec3dac76p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999997ep5 0x0.0p0 F +REG epsg:2678 0 OK 0x1.5381eb4a8b279p25 0x1.463d5d8fa3ab6p6 0x1.c311f688p2 0x1.0800000000001p7 0x0.0p0 0x1.544p-19 T +REG epsg:2678 1 OK 0x1.4f458ee8ba843p25 -0x1.0ef4d9eb4dca5p19 0x1.4532d5adp2 0x1.fc0000001d543p6 -0x1.3fffffffea52cp2 0x1.516p-19 F +REG epsg:2678 2 OK 0x1.57be47abe43dp25 -0x1.0ef4d7f4b81a6p19 -0x1.be0a2232p2 0x1.11fffffff15bep7 -0x1.3fffffffea5cap2 0x1.50ep-19 F +REG epsg:2678 3 OK 0x1.4f458f87f45cbp25 0x1.0f093d95a9e65p19 0x1.34c3c6c6p4 0x1.fc0000001d53bp6 0x1.3fffffffea516p2 0x1.518p-19 F +REG epsg:2678 4 OK 0x1.57be470cb5209p25 0x1.0f093b9eeebfbp19 0x1.cfd2949dp2 0x1.11fffffff15c4p7 0x1.3fffffffea5b1p2 0x1.50ap-19 F +REG epsg:26780 0 OK 0x1.e848000000005p20 0x1.1c6f660c1ac1fp18 0x0.0p0 -0x1.57p6 0x1.29111111110ebp5 0x0.0p0 F +REG epsg:26780 1 OK 0x1.566f8985a2c8ep20 -0x1.1644bd7817aap18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c44444444415p5 0x0.0p0 F +REG epsg:26780 2 OK 0x1.3d103b3d2e9b6p21 -0x1.1644bd7817aap18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c44444444415p5 0x0.0p0 F +REG epsg:26780 3 OK 0x1.5c7a75357d8fcp20 0x1.adb02ce725407p19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbdp5 0x0.0p0 F +REG epsg:26780 4 OK 0x1.3a0ac5654137fp21 0x1.adb02ce725407p19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbdp5 0x0.0p0 F +REG epsg:26781 0 OK 0x1.e848000000005p20 0x1.63387839c1e67p18 0x0.0p0 -0x1.72p6 0x1.faaaaaaaaaa1ep4 0x0.0p0 F +REG epsg:26781 1 OK 0x1.31f5603f1f5cp20 -0x1.5b64548ad4f51p18 0x0.0p0 -0x1.7b66402708f87p6 0x1.daaaaaaaaaa08p4 0x0.0p0 F +REG epsg:26781 2 OK 0x1.4f4d4fe07051cp21 -0x1.5b64548ad4f51p18 0x0.0p0 -0x1.6899bfd8f7079p6 0x1.daaaaaaaaaa08p4 0x0.0p0 F +REG epsg:26781 3 OK 0x1.39a96b57f9fc2p20 0x1.0c5ba7a58dd77p20 0x0.0p0 -0x1.7b66402708f87p6 0x1.0d55555555518p5 0x0.0p0 F +REG epsg:26781 4 OK 0x1.4b734a540301cp21 0x1.0c5ba7a58dd77p20 0x0.0p0 -0x1.6899bfd8f7079p6 0x1.0d55555555518p5 0x0.0p0 F +REG epsg:26782 0 OK 0x1.e848000000005p20 0x1.690a633037d0ep18 0x0.0p0 -0x1.6d55555555555p6 0x1.daeeeeeeeee47p4 0x0.0p0 F +REG epsg:26782 1 OK 0x1.2f297a982494ap20 -0x1.61921e205c014p18 0x0.0p0 -0x1.76b1f683c31b1p6 0x1.ba666666665a4p4 0x0.0p0 F +REG epsg:26782 2 OK 0x1.50b342b3edb6p21 -0x1.61921e205c014p18 0x0.0p0 -0x1.63f8b426e78f9p6 0x1.ba666666665a4p4 0x0.0p0 F +REG epsg:26782 3 OK 0x1.36897f546ccf2p20 0x1.10a3d676f15f6p20 0x0.0p0 -0x1.76b1f683c31b1p6 0x1.fb777777776eap4 0x0.0p0 F +REG epsg:26782 4 OK 0x1.4d034055c998cp21 0x1.10a3d676f15f6p20 0x0.0p0 -0x1.63f8b426e78f9p6 0x1.fb777777776eap4 0x0.0p0 F +REG epsg:26783 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:26783 1 OK -0x1.68372dfd9f601p20 -0x1.aa650e476e855p20 0x0.0p0 -0x1.2db9bac64d549p6 0x1.36aaaaa9beeb5p5 0x0.0p0 F +REG epsg:26783 2 OK 0x1.2e2d96fecfb02p21 -0x1.aa650e476e855p20 0x0.0p0 -0x1.ec8c8a736556ep5 0x1.36aaaaa9beeb5p5 0x0.0p0 F +REG epsg:26783 3 OK -0x1.1d5dd00608d06p20 0x1.cfba0b5b637e1p20 0x0.0p0 -0x1.2db9bac5889c8p6 0x1.86aaaaa94f70ap5 0x0.0p0 F +REG epsg:26783 4 OK 0x1.08c0e80304684p21 0x1.cfba0b5b637e1p20 0x0.0p0 -0x1.ec8c8a74eec7p5 0x1.86aaaaa94f70ap5 0x0.0p0 F +REG epsg:26784 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26784 1 OK -0x1.66f769510bb5ap20 -0x1.ab161afb7e78dp20 0x0.0p0 -0x1.33f07961a4db4p6 0x1.2eaaaaa9e1404p5 0x0.0p0 F +REG epsg:26784 2 OK 0x1.2d8db4a885db6p21 -0x1.ab161afb7e78cp20 0x0.0p0 -0x1.fac9b7e760f43p5 0x1.2eaaaaa9e1404p5 0x0.0p0 F +REG epsg:26784 3 OK -0x1.1eb10500d8ad9p20 0x1.cf2656b2b6b2fp20 0x0.0p0 -0x1.33f07960fb83cp6 0x1.7eaaaaa97521p5 0x0.0p0 F +REG epsg:26784 4 OK 0x1.096a82806c574p21 0x1.cf2656b2b6b31p20 0x0.0p0 -0x1.fac9b7e8b3a32p5 0x1.7eaaaaa97521p5 0x0.0p0 F +REG epsg:26785 0 OK 0x1.86a0000000006p19 0x1.1f79bc1a87b09p18 0x0.0p0 -0x1.34p6 0x1.3522222222203p5 0x0.0p0 F +REG epsg:26785 1 OK 0x1.7dd5c3fcb5334p17 -0x1.18d0d3f90edp18 0x0.0p0 -0x1.3c477eb6c7662p6 0x1.283333333330dp5 0x0.0p0 F +REG epsg:26785 2 OK 0x1.56e54780695bp20 -0x1.18d0d3f90edp18 0x0.0p0 -0x1.2bb881493899ep6 0x1.283333333330dp5 0x0.0p0 F +REG epsg:26785 3 OK 0x1.b1fb73fee206p17 0x1.b279ef89d26c1p19 0x0.0p0 -0x1.3c477eb6c7662p6 0x1.42111111110f5p5 0x0.0p0 F +REG epsg:26785 4 OK 0x1.5060918023c09p20 0x1.b279ef89d26c1p19 0x0.0p0 -0x1.2bb881493899ep6 0x1.42111111110f5p5 0x0.0p0 F +REG epsg:26786 0 OK 0x1.24f8000000003p19 0x1.2b82a89279429p18 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba6p5 0x0.0p0 F +REG epsg:26786 1 OK -0x1.f2465062511ap14 -0x1.2362130d718eep18 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.4144444444429p5 0x0.0p0 F +REG epsg:26786 2 OK 0x1.2cc119418944ap20 -0x1.2362130d718eep18 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.4144444444429p5 0x0.0p0 F +REG epsg:26786 3 OK 0x1.30b978f910cp9 0x1.c5335007a71a5p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333325p5 0x0.0p0 F +REG epsg:26786 4 OK 0x1.24d1e8d0e0de2p20 0x1.c5335007a71a5p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333325p5 0x0.0p0 F +REG epsg:26787 0 OK 0x1.86a0000000004p17 0x1.57f46d9b8385bp16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed8p5 0x0.0p0 F +REG epsg:26787 1 OK -0x1.4ea5f7be44d96p17 -0x1.0b0b0df402162p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG epsg:26787 2 OK 0x1.16f97def91368p19 -0x1.0b0b0df402162p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG epsg:26787 3 OK -0x1.38cee5449abb2p17 0x1.bc8c8cca2b231p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG epsg:26787 4 OK 0x1.1183b95126aeep19 0x1.bc8c8cca2b231p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG epsg:2679 0 OK 0x1.5b23085d696bbp25 0x1.463d6a57f02eap6 0x1.a15152bcp1 0x1.0ep7 0x0.0p0 0x1.544p-19 T +REG epsg:2679 1 OK 0x1.56e6abd17c0cbp25 -0x1.0ef4e48fdc621p19 0x1.d498b4e8p0 0x1.040000000eaa4p7 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:2679 2 OK 0x1.5f5f64e8d50a2p25 -0x1.0ef4e2993d018p19 -0x1.6790baefp3 0x1.17fffffff15c2p7 -0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:2679 3 OK 0x1.56e6ac70b6654p25 0x1.0f09483b03671p19 0x1.00c0a44dcp4 0x1.040000000eaap7 0x1.3fffffffea512p2 0x1.514p-19 F +REG epsg:2679 4 OK 0x1.5f5f6449a6487p25 0x1.0f0946443e8e7p19 0x1.7d76d238p1 0x1.17fffffff15c4p7 0x1.3fffffffea5b8p2 0x1.512p-19 F +REG epsg:26791 0 OK 0x1.e848000000005p20 0x1.7befb045a410ep18 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887ec4p5 0x0.0p0 F +REG epsg:26791 1 OK 0x1.22024e946370dp20 -0x1.6bcdef382033dp18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26791 2 OK 0x1.5746d8b5ce47ep21 -0x1.6bcdef382033dp18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26791 3 OK 0x1.318c6e2fd8f42p20 0x1.20c087a00bbb8p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d999999992afp5 0x0.0p0 F +REG epsg:26791 4 OK 0x1.4f81c8e813864p21 0x1.20c087a00bbb8p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d999999992afp5 0x0.0p0 F +REG epsg:26792 0 OK 0x1.e848000000005p20 0x1.6d013d8ac9852p18 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26792 1 OK 0x1.2a6bd672506fap20 -0x1.5eee96e606b4cp18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fccccccccccp5 0x0.0p0 F +REG epsg:26792 2 OK 0x1.531214c6d7c88p21 -0x1.5eee96e606b4cp18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fccccccccccp5 0x0.0p0 F +REG epsg:26792 3 OK 0x1.3806d6080da23p20 0x1.1517874ad65d5p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999096p5 0x0.0p0 F +REG epsg:26792 4 OK 0x1.4c4494fbf92f4p21 0x1.1517874ad65d5p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999096p5 0x0.0p0 F +REG epsg:26793 0 OK 0x1.e848000000005p20 0x1.8a8e84618f142p18 0x0.0p0 -0x1.78p6 0x1.60ddddddddddp5 0x0.0p0 F +REG epsg:26793 1 OK 0x1.1ae9a10cc4e2ep20 -0x1.7b2964a8c553fp18 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220dp5 0x0.0p0 F +REG epsg:26793 2 OK 0x1.5ad32f799d8f6p21 -0x1.7b2964a8c553fp18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220dp5 0x0.0p0 F +REG epsg:26793 3 OK 0x1.29d0423ae53b4p20 0x1.2b922d3205562p20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999991p5 0x0.0p0 F +REG epsg:26793 4 OK 0x1.535fdee28d632p21 0x1.2b922d3205562p20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999991p5 0x0.0p0 F +REG epsg:26794 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.daaaaaaaaaaadp4 0x0.0p0 F +REG epsg:26794 1 OK -0x1.58f814ec7cc7bp20 -0x1.b1ed1cd51b72cp20 0x0.0p0 -0x1.7a59b545bae7bp6 0x1.8aaaaaaa74adp4 0x0.0p0 F +REG epsg:26794 2 OK 0x1.268e0a763e648p21 -0x1.b1ed1cd51b72ap20 0x0.0p0 -0x1.4c50f564efc2fp6 0x1.8aaaaaaa74adp4 0x0.0p0 F +REG epsg:26794 3 OK -0x1.2ca0f56460712p20 0x1.c82bee98dd29dp20 0x0.0p0 -0x1.7a59b545bc5d4p6 0x1.1555555519b31p5 0x0.0p0 F +REG epsg:26794 4 OK 0x1.10627ab230392p21 0x1.c82bee98dd29ep20 0x0.0p0 -0x1.4c50f564ee4d6p6 0x1.1555555519b31p5 0x0.0p0 F +REG epsg:26795 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.e8p4 0x0.0p0 F +REG epsg:26795 1 OK -0x1.59b98b2be257dp20 -0x1.b18f48fa6fe8fp20 0x0.0p0 -0x1.808b909db4109p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG epsg:26795 2 OK 0x1.26eec595f12b7p21 -0x1.b18f48fa6fe8fp20 0x0.0p0 -0x1.521f1a0cf69a2p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG epsg:26795 3 OK -0x1.2bde62fcddaf7p20 0x1.c88ee41822dcep20 0x0.0p0 -0x1.808b909db0aa7p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG epsg:26795 4 OK 0x1.1001317e6ed75p21 0x1.c88ee41822dcdp20 0x0.0p0 -0x1.521f1a0cfa004p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG epsg:26796 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:26796 1 OK -0x1.5ef2a0e33564ap20 -0x1.af10e35ffb22ap20 0x0.0p0 -0x1.82ab5906e69dcp6 0x1.ed555554cfd06p4 0x0.0p0 F +REG epsg:26796 2 OK 0x1.298b50719ab26p21 -0x1.af10e35ffb22ap20 0x0.0p0 -0x1.5154a6f919625p6 0x1.ed555554cfd06p4 0x0.0p0 F +REG epsg:26796 3 OK -0x1.26b2b49941f71p20 0x1.cb376fc0ca7dcp20 0x0.0p0 -0x1.82ab5906b6119p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG epsg:26796 4 OK 0x1.0d6b5a4ca0fbap21 0x1.cb376fc0ca7dcp20 0x0.0p0 -0x1.5154a6f949ee8p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG epsg:26797 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:26797 1 OK -0x1.5ef2a0e33564ap20 -0x1.af10e35ffb22ap20 0x0.0p0 -0x1.8aab5906e69dbp6 0x1.ed555554cfd06p4 0x0.0p0 F +REG epsg:26797 2 OK 0x1.298b50719ab26p21 -0x1.af10e35ffb22ap20 0x0.0p0 -0x1.5954a6f919624p6 0x1.ed555554cfd06p4 0x0.0p0 F +REG epsg:26797 3 OK -0x1.26b2b49941f71p20 0x1.cb376fc0ca7dcp20 0x0.0p0 -0x1.8aab5906b6118p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG epsg:26797 4 OK 0x1.0d6b5a4ca0fbap21 0x1.cb376fc0ca7dcp20 0x0.0p0 -0x1.5954a6f949ee8p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG epsg:26798 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG epsg:26798 1 OK -0x1.5f4cc426516f7p20 -0x1.aee68167aa693p20 0x0.0p0 -0x1.92c619320982fp6 0x1.f2aaaaaa1e07cp4 0x0.0p0 F +REG epsg:26798 2 OK 0x1.29b8621328b7dp21 -0x1.aee68167aa693p20 0x0.0p0 -0x1.6139e6cdf67d1p6 0x1.f2aaaaaa1e07cp4 0x0.0p0 F +REG epsg:26798 3 OK -0x1.265ae7b29fcf5p20 0x1.cb65171e7a069p20 0x0.0p0 -0x1.92c61931d5255p6 0x1.49555554cab49p5 0x0.0p0 F +REG epsg:26798 4 OK 0x1.0d3f73d94fe7cp21 0x1.cb65171e7a069p20 0x0.0p0 -0x1.6139e6ce2adabp6 0x1.49555554cab49p5 0x0.0p0 F +REG epsg:26799 0 OK 0x1.ff1224a3d70a8p21 0x1.fc4bbaade15dbp21 0x0.0p0 -0x1.d955555555552p6 0x1.11222222221ecp5 0x0.0p0 F +REG epsg:26799 1 OK 0x1.d1ea7f244cec6p21 0x1.d024420284354p21 0x0.0p0 -0x1.de2a91549c3cfp6 0x1.09222222221e5p5 0x0.0p0 F +REG epsg:26799 2 OK 0x1.161ce511b093cp22 0x1.d024420284354p21 0x0.0p0 -0x1.d48019560e6d8p6 0x1.09222222221e5p5 0x0.0p0 F +REG epsg:26799 3 OK 0x1.d2f7b14a8a9cp21 0x1.147e267613d9bp22 0x0.0p0 -0x1.de2a91549c3cfp6 0x1.19222222221f1p5 0x0.0p0 F +REG epsg:26799 4 OK 0x1.15964bfe91bcp22 0x1.147e267613d9bp22 0x0.0p0 -0x1.d48019560e6d8p6 0x1.19222222221f1p5 0x0.0p0 F +REG epsg:2680 0 OK 0x1.62c4258aaded8p25 0x1.463d78245faa4p6 -0x1.a82f96e8p-1 0x1.14p7 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2680 1 OK 0x1.5e87c8d14b5f9p25 -0x1.0ef4f00d023b9p19 -0x1.bcaed408p0 0x1.0a0000000eaa7p7 -0x1.3fffffffea521p2 0x1.51cp-19 F +REG epsg:2680 2 OK 0x1.6700824384e5cp25 -0x1.0ef4ee16597e2p19 -0x1.f9199f308p3 0x1.1dfffffff15c7p7 -0x1.3fffffffea5d5p2 0x1.51p-19 F +REG epsg:2680 3 OK 0x1.5e87c9708635dp25 0x1.0f0953b9044bp19 0x1.8f586848p3 0x1.0a0000000eaa2p7 0x1.3fffffffea50cp2 0x1.518p-19 F +REG epsg:2680 4 OK 0x1.670081a456799p25 0x1.0f0951c23613fp19 -0x1.9158d26cp0 0x1.1dfffffff15c9p7 0x1.3fffffffea5bcp2 0x1.514p-19 F +REG epsg:26801 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 0x0.0p0 F +REG epsg:26801 1 OK -0x1.65533a6e8141cp20 -0x1.abef8274b51e7p20 0x0.0p0 -0x1.695eda12c9f02p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG epsg:26801 2 OK 0x1.2cbb9d3740a18p21 -0x1.abef8274b51e6p20 0x0.0p0 -0x1.33f67b428b653p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG epsg:26801 3 OK -0x1.205c78a850c72p20 0x1.ce5dcc4851458p20 0x0.0p0 -0x1.695eda123ffe3p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:26801 4 OK 0x1.0a403c5428641p21 0x1.ce5dcc4851459p20 0x0.0p0 -0x1.33f67b4315573p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:26802 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.57p6 0x1.4cp5 0x0.0p0 F +REG epsg:26802 1 OK -0x1.654f1585bacfp20 -0x1.abebcf6d91dap20 0x0.0p0 -0x1.71b42f681f458p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG epsg:26802 2 OK 0x1.2cb98ac2dd671p21 -0x1.abebcf6d91da2p20 0x0.0p0 -0x1.3c4bd097e0ba9p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG epsg:26802 3 OK -0x1.2058ec5dc869ap20 0x1.ce59cd0f06e9p20 0x0.0p0 -0x1.71b42f6795538p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:26802 4 OK 0x1.0a3e762ee4347p21 0x1.ce59cd0f06e8fp20 0x0.0p0 -0x1.3c4bd0986aac8p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:26803 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.63p6 0x1.4cp5 0x0.0p0 F +REG epsg:26803 1 OK -0x1.654f1585bacfp20 -0x1.abebcf6d91dap20 0x0.0p0 -0x1.7db42f681f458p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG epsg:26803 2 OK 0x1.2cb98ac2dd679p21 -0x1.abebcf6d91dap20 0x0.0p0 -0x1.484bd097e0ba8p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG epsg:26803 3 OK -0x1.2058ec5dc869ap20 0x1.ce59cd0f06e9p20 0x0.0p0 -0x1.7db42f6795539p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:26803 4 OK 0x1.0a3e762ee434ep21 0x1.ce59cd0f06e9p20 0x0.0p0 -0x1.484bd0986aac7p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:2681 0 OK 0x1.6a6542d453cap25 0x1.463d86eb43bcep6 -0x1.4d4242bp2 0x1.1a00000000001p7 0x0.0p0 0x1.54p-19 T +REG epsg:2681 1 OK 0x1.6628e5ea437e3p25 -0x1.0ef4fc5aafcf4p19 -0x1.67229e2dp2 0x1.100000000eaabp7 -0x1.3fffffffea51ap2 0x1.52p-19 F +REG epsg:2681 2 OK 0x1.6ea19fbdcf0f7p25 -0x1.0ef4fa63fe0f3p19 -0x1.499cd05f8p4 0x1.23fffffff15c9p7 -0x1.3fffffffea5dap2 0x1.50ep-19 F +REG epsg:2681 3 OK 0x1.6628e6897ecf7p25 0x1.0f0960079c70bp19 0x1.135d05ed8p3 0x1.100000000eaa8p7 0x1.3fffffffea5p2 0x1.52p-19 F +REG epsg:2681 4 OK 0x1.6ea19f1ea0f33p25 0x1.0f095e10c535dp19 -0x1.98960a64p2 0x1.23fffffff15cdp7 0x1.3fffffffea5c2p2 0x1.50ep-19 F +REG epsg:26811 0 OK 0x1.e848000000005p20 0x1.9986df9d60d78p18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:26811 1 OK 0x1.125dce232f06bp20 -0x1.87cdd5350c7ffp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111101p5 0x0.0p0 F +REG epsg:26811 2 OK 0x1.5f1918ee687c8p21 -0x1.87cdd5350c7ffp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111101p5 0x0.0p0 F +REG epsg:26811 3 OK 0x1.237341a9e14bbp20 0x1.37516c1de4a32p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd515p5 0x0.0p0 F +REG epsg:26811 4 OK 0x1.568e5f2b0f5ap21 0x1.37516c1de4a32p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd515p5 0x0.0p0 F +REG epsg:26812 0 OK 0x1.e848000000005p20 0x1.a845fee3dc059p18 0x0.0p0 -0x1.5155555555555p6 0x1.6411111111106p5 0x0.0p0 F +REG epsg:26812 1 OK 0x1.0abd223301402p20 -0x1.962b9c07dcde4p18 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.50fffffffffedp5 0x0.0p0 F +REG epsg:26812 2 OK 0x1.62e96ee67f604p21 -0x1.962b9c07dcde4p18 0x0.0p0 -0x1.43f7235fee391p6 0x1.50fffffffffedp5 0x0.0p0 F +REG epsg:26812 3 OK 0x1.1c3842eb15ec6p20 0x1.42792d3619a72p20 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.7722222222219p5 0x0.0p0 F +REG epsg:26812 4 OK 0x1.5a2bde8a750a2p21 0x1.42792d3619a72p20 0x0.0p0 -0x1.43f7235fee391p6 0x1.7722222222219p5 0x0.0p0 F +REG epsg:26813 0 OK 0x1.e848000000005p20 0x1.818d28da7bcc1p18 0x0.0p0 -0x1.5155555555555p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:26813 1 OK 0x1.20190d1d3fd8cp20 -0x1.73a809eafcd9dp18 0x0.0p0 -0x1.5d1a9f6347bf8p6 0x1.435555555553cp5 0x0.0p0 F +REG epsg:26813 2 OK 0x1.583b79716013fp21 -0x1.73a809eafcd9dp18 0x0.0p0 -0x1.45900b4762eb2p6 0x1.435555555553cp5 0x0.0p0 F +REG epsg:26813 3 OK 0x1.2d92dec69057ep20 0x1.247d00af03a23p20 0x0.0p0 -0x1.5d1a9f6347bf8p6 0x1.65fffffffffefp5 0x0.0p0 F +REG epsg:26813 4 OK 0x1.517e909cb7d46p21 0x1.247d00af03a23p20 0x0.0p0 -0x1.45900b4762eb2p6 0x1.65fffffffffefp5 0x0.0p0 F +REG epsg:26814 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26814 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26814 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26814 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26814 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26815 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26815 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26815 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26815 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26815 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26819 0 OK 0x1.86a00000154ebp19 0x1.aaec4d462d6c8p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26819 1 OK 0x1.0dc2f831f413p19 -0x1.a76ffae931a5p13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26819 2 OK 0x1.ff7d07ce368a6p19 -0x1.a76ffae931a5p13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26819 3 OK 0x1.173c0bb15f242p19 0x1.c1b439bad449ep18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26819 4 OK 0x1.f603f44ecb794p19 0x1.c1b439bad449ep18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:2682 0 OK 0x1.7206603c42354p25 0x1.463d96a23e499p6 -0x1.3ba3d2f68p3 0x1.2p7 0x0.0p0 0x1.542p-19 T +REG epsg:2682 1 OK 0x1.6dca031e6dc38p25 -0x1.0ef5097043456p19 -0x1.3908496c8p3 0x1.160000000eaaep7 -0x1.3fffffffea516p2 0x1.51cp-19 F +REG epsg:2682 2 OK 0x1.7642bd59789b2p25 -0x1.0ef5077988e2ep19 -0x1.9ac24db6p4 0x1.29fffffff15cbp7 -0x1.3fffffffea5e1p2 0x1.51p-19 F +REG epsg:2682 3 OK 0x1.6dca03bda98cbp25 0x1.0f096d1e295cp19 0x1.1bcc3e6fp2 0x1.160000000eaacp7 0x1.3fffffffea4fdp2 0x1.51cp-19 F +REG epsg:2682 4 OK 0x1.7642bcba4ac9p25 0x1.0f096b27497d7p19 -0x1.6e95e8018p3 0x1.29fffffff15dp7 0x1.3fffffffea5c6p2 0x1.50ep-19 F +REG epsg:26820 0 OK 0x1.86a00000154ebp19 0x1.a1d24afc4d6ecp17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26820 1 OK 0x1.12e3b279afdb7p19 -0x1.29e4a9d8ad17p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26820 2 OK 0x1.fa5c4d867ac1fp19 -0x1.29e4a9d8ad17p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26820 3 OK 0x1.1b2ef331109d4p19 0x1.b37d29ffb7b62p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26820 4 OK 0x1.f2110ccf1a002p19 0x1.b37d29ffb7b62p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26821 0 OK 0x1.86a00000154ebp19 0x1.b3d65cf7f43dap17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26821 1 OK 0x1.096f7aac0ade4p19 -0x1.1ea0672c0c054p14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26821 2 OK 0x1.01e842aa0fdfep20 -0x1.1ea0672c0c054p14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26821 3 OK 0x1.1284e79be426p19 0x1.cee59de0b4fb6p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26821 4 OK 0x1.fabb18644677ep19 0x1.cee59de0b4fb6p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26822 0 OK 0x1.e84800002a9d5p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:26822 1 OK 0x1.fc0e2fc991e28p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26822 2 OK 0x1.a8c63a06f861p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26822 3 OK 0x1.411c2fa6e804cp17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26822 4 OK 0x1.9800f416709c2p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26823 0 OK 0x1.e0974p20 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:26823 1 OK 0x1.afc72a5b2dc7ep20 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26823 2 OK 0x1.08b3aad2691c1p21 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26823 3 OK 0x1.b22b2bd7ecdp20 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26823 4 OK 0x1.0781aa140998p21 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26824 0 OK 0x1.e0974p20 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:26824 1 OK 0x1.ac091b03ddb9ep20 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26824 2 OK 0x1.0a92b27e11231p21 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26824 3 OK 0x1.aeaa631c4a119p20 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26824 4 OK 0x1.09420e71daf73p21 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26825 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26825 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26825 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26825 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26825 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26826 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26826 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26826 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26826 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26826 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:2683 0 OK 0x1.79a77dc44b249p25 0x1.463da73e48be3p6 -0x1.d92280d7p3 0x1.25fffffffffffp7 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2683 1 OK 0x1.756b206fc0766p25 -0x1.0ef517448e83p19 -0x1.c79d2479p3 0x1.1c0000000eab3p7 -0x1.3fffffffea50ep2 0x1.51cp-19 F +REG epsg:2683 2 OK 0x1.7de3db182f331p25 -0x1.0ef5154dcbe4cp19 -0x1.efc457ed4p4 0x1.2ffffffff15dp7 -0x1.3fffffffea5e3p2 0x1.51p-19 F +REG epsg:2683 3 OK 0x1.756b210efcb4p25 0x1.0f097af37c42ep19 -0x1.5d4dbap-6 0x1.1c0000000eaadp7 0x1.3fffffffea4f5p2 0x1.51cp-19 F +REG epsg:2683 4 OK 0x1.7de3da7901a5p25 0x1.0f0978fc94278p19 -0x1.0c4cf1b84p4 0x1.2ffffffff15d2p7 0x1.3fffffffea5cdp2 0x1.50ap-19 F +REG epsg:26830 0 OK 0x1.86a00000154ebp19 0x1.aaec4d462d6c8p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26830 1 OK 0x1.0dc2f831f413p19 -0x1.a76ffae931a5p13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26830 2 OK 0x1.ff7d07ce368a6p19 -0x1.a76ffae931a5p13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26830 3 OK 0x1.173c0bb15f242p19 0x1.c1b439bad449ep18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26830 4 OK 0x1.f603f44ecb794p19 0x1.c1b439bad449ep18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26831 0 OK 0x1.86a00000154ebp19 0x1.a1d24afc4d6ecp17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26831 1 OK 0x1.12e3b279afdb7p19 -0x1.29e4a9d8ad17p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26831 2 OK 0x1.fa5c4d867ac1fp19 -0x1.29e4a9d8ad17p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26831 3 OK 0x1.1b2ef331109d4p19 0x1.b37d29ffb7b62p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26831 4 OK 0x1.f2110ccf1a002p19 0x1.b37d29ffb7b62p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26832 0 OK 0x1.86a00000154ebp19 0x1.b3d65cf7f43dap17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26832 1 OK 0x1.096f7aac0ade4p19 -0x1.1ea0672c0c054p14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26832 2 OK 0x1.01e842aa0fdfep20 -0x1.1ea0672c0c054p14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26832 3 OK 0x1.1284e79be426p19 0x1.cee59de0b4fb6p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26832 4 OK 0x1.fabb18644677ep19 0x1.cee59de0b4fb6p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26833 0 OK 0x1.e84800002a9d5p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:26833 1 OK 0x1.fc0e2fc991e28p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26833 2 OK 0x1.a8c63a06f861p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26833 3 OK 0x1.411c2fa6e804cp17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26833 4 OK 0x1.9800f416709c2p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26834 0 OK 0x1.e0974p20 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:26834 1 OK 0x1.afc72a5b2dc7ep20 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26834 2 OK 0x1.08b3aad2691c1p21 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26834 3 OK 0x1.b22b2bd7ecdp20 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26834 4 OK 0x1.0781aa140998p21 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26835 0 OK 0x1.e0974p20 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:26835 1 OK 0x1.ac091b03ddb9ep20 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26835 2 OK 0x1.0a92b27e11231p21 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26835 3 OK 0x1.aeaa631c4a119p20 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26835 4 OK 0x1.09420e71daf73p21 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26836 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26836 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26836 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26836 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26836 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26837 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26837 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26837 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26837 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26837 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:2684 0 OK 0x1.81489b6e2a07bp25 0x1.463db8b3bbce8p6 -0x1.3f5754becp4 0x1.2c00000000001p7 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2684 1 OK 0x1.7d0c3de01d68ep25 -0x1.0ef525cddd9b5p19 -0x1.2f75eacd4p4 0x1.220000000eab6p7 -0x1.3fffffffea508p2 0x1.518p-19 F +REG epsg:2684 2 OK 0x1.8584f8fb87ea2p25 -0x1.0ef523d7132dbp19 -0x1.2433a4d72p5 0x1.35fffffff15d1p7 -0x1.3fffffffea5eap2 0x1.51p-19 F +REG epsg:2684 3 OK 0x1.7d0c3e7f5a176p25 0x1.0f09897de07f9p19 -0x1.2ffa837cp2 0x1.220000000eab3p7 0x1.3fffffffea4fp2 0x1.51ap-19 F +REG epsg:2684 4 OK 0x1.8584f85c5a9a1p25 0x1.0f098786f0939p19 -0x1.64efd6704p4 0x1.35fffffff15d5p7 0x1.3fffffffea5d1p2 0x1.51p-19 F +REG epsg:26841 0 OK 0x1.86a00000154ebp19 0x1.aaec4d462d6c8p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26841 1 OK 0x1.0dc2f831f413p19 -0x1.a76ffae931a5p13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26841 2 OK 0x1.ff7d07ce368a6p19 -0x1.a76ffae931a5p13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26841 3 OK 0x1.173c0bb15f242p19 0x1.c1b439bad449ep18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26841 4 OK 0x1.f603f44ecb794p19 0x1.c1b439bad449ep18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26842 0 OK 0x1.86a00000154ebp19 0x1.a1d24afc4d6ecp17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26842 1 OK 0x1.12e3b279afdb7p19 -0x1.29e4a9d8ad17p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26842 2 OK 0x1.fa5c4d867ac1fp19 -0x1.29e4a9d8ad17p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26842 3 OK 0x1.1b2ef331109d4p19 0x1.b37d29ffb7b62p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26842 4 OK 0x1.f2110ccf1a002p19 0x1.b37d29ffb7b62p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26843 0 OK 0x1.86a00000154ebp19 0x1.b3d65cf7f43dap17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26843 1 OK 0x1.096f7aac0ade4p19 -0x1.1ea0672c0c054p14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26843 2 OK 0x1.01e842aa0fdfep20 -0x1.1ea0672c0c054p14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26843 3 OK 0x1.1284e79be426p19 0x1.cee59de0b4fb6p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26843 4 OK 0x1.fabb18644677ep19 0x1.cee59de0b4fb6p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26844 0 OK 0x1.e84800002a9d5p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:26844 1 OK 0x1.fc0e2fc991e28p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26844 2 OK 0x1.a8c63a06f861p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26844 3 OK 0x1.411c2fa6e804cp17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26844 4 OK 0x1.9800f416709c2p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26845 0 OK 0x1.e0974p20 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:26845 1 OK 0x1.afc72a5b2dc7ep20 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26845 2 OK 0x1.08b3aad2691c1p21 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26845 3 OK 0x1.b22b2bd7ecdp20 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26845 4 OK 0x1.0781aa140998p21 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26846 0 OK 0x1.e0974p20 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:26846 1 OK 0x1.ac091b03ddb9ep20 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26846 2 OK 0x1.0a92b27e11231p21 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26846 3 OK 0x1.aeaa631c4a119p20 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26846 4 OK 0x1.09420e71daf73p21 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26847 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26847 1 OK -0x1.e3860df712139p19 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26847 2 OK 0x1.692d237dc4853p21 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.ecb403e7f2d2dp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26847 3 OK -0x1.4eb20da18b725p19 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26847 4 OK 0x1.43f8236862dcep21 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26848 0 OK 0x1.6871700000004p21 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26848 1 OK 0x1.dfb912e887544p19 -0x1.ab1829e1bd76bp20 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26848 2 OK 0x1.2c7a4da2ef15fp22 -0x1.ab1829e1bd769p20 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26848 3 OK 0x1.38232403b5cefp20 0x1.cf2707cb433ddp20 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26848 4 OK 0x1.1a68a6ff128ccp22 0x1.cf2707cb433dep20 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26849 0 OK 0x1.4064d55566cf7p21 0x1.5e2a74ed7415ap19 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26849 1 OK 0x1.ba857c0cd30dp20 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26849 2 OK 0x1.a386eca464186p21 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26849 3 OK 0x1.ca0f9eb37f2a3p20 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26849 4 OK 0x1.9bc1db510e09cp21 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:2685 0 OK 0x1.88e9b93b82913p25 0x1.463dcaf657a0ap6 -0x1.95ea1277p4 0x1.31fffffffffffp7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2685 1 OK 0x1.84ad5b7150a6ap25 -0x1.0ef53501fd9d7p19 -0x1.7f451961cp4 0x1.280000000eab9p7 -0x1.3fffffffea504p2 0x1.51ap-19 F +REG epsg:2685 2 OK 0x1.8d261704fe203p25 -0x1.0ef5330b2bd1fp19 -0x1.523678eacp5 0x1.3bfffffff15d4p7 -0x1.3fffffffea5ecp2 0x1.51p-19 F +REG epsg:2685 3 OK 0x1.84ad5c108dc1ep25 0x1.0f0998b3225ebp19 -0x1.379b876e8p3 0x1.280000000eab4p7 0x1.3fffffffea4ecp2 0x1.51ap-19 F +REG epsg:2685 4 OK 0x1.8d261665d107cp25 0x1.0f0996bc2b14p19 -0x1.c0f5711p4 0x1.3bfffffff15d9p7 0x1.3fffffffea5d7p2 0x1.50ap-19 F +REG epsg:26850 0 OK 0x1.4064d55566cf7p21 0x1.56b35d2f0c193p19 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26850 1 OK 0x1.c2eee7a76769bp20 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26850 2 OK 0x1.9f5236d719eap21 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26850 3 OK 0x1.d089ec96c7bc2p20 0x1.65310f83b70e4p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26850 4 OK 0x1.9884b45f69c0dp21 0x1.65310f83b70e4p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26851 0 OK 0x1.4064d55566cf7p21 0x1.657a38f269fb8p19 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26851 1 OK 0x1.b36cbd2e0fb2p20 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26851 2 OK 0x1.a7134c13c5c65p21 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26851 3 OK 0x1.c25367e1c0d1cp20 0x1.7bac03774b0eap20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26851 4 OK 0x1.9f9ff6b9ed367p21 0x1.7bac03774b0eap20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26852 0 OK 0x1.907e0aaacd9ecp20 0x1.199c3402171a3p19 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:26852 1 OK 0x1.a0b616e027ecp18 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26852 2 OK 0x1.5c6747cec8a14p21 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26852 3 OK 0x1.07608efa56844p19 0x1.ad3050594afd7p20 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26852 4 OK 0x1.4ea5e6ec37fdbp21 0x1.ad3050594afd7p20 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26853 0 OK 0x1.e097400000006p20 0x1.373abe8baa894p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:26853 1 OK 0x1.4071ade5988bep20 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26853 2 OK 0x1.405e690d33ba7p21 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26853 3 OK 0x1.4849917f14ad2p20 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26853 4 OK 0x1.3c72774075a9dp21 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26854 0 OK 0x1.e097400000006p20 0x1.4edb0661224aep18 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:26854 1 OK 0x1.342a71c0862adp20 -0x1.460752e85b78bp18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26854 2 OK 0x1.4682071fbcebp21 -0x1.460752e85b78bp18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26854 3 OK 0x1.3ccb5e7f95feap20 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26854 4 OK 0x1.423190c035011p21 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26855 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26855 1 OK -0x1.e3860df712139p19 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26855 2 OK 0x1.692d237dc4853p21 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.ecb403e7f2d2dp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26855 3 OK -0x1.4eb20da18b725p19 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26855 4 OK 0x1.43f8236862dcep21 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26856 0 OK 0x1.6871700000004p21 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26856 1 OK 0x1.dfb912e887544p19 -0x1.ab1829e1bd76bp20 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26856 2 OK 0x1.2c7a4da2ef15fp22 -0x1.ab1829e1bd769p20 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26856 3 OK 0x1.38232403b5cefp20 0x1.cf2707cb433ddp20 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26856 4 OK 0x1.1a68a6ff128ccp22 0x1.cf2707cb433dep20 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26857 0 OK 0x1.4064d55566cf7p21 0x1.5e2a74ed7415ap19 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26857 1 OK 0x1.ba857c0cd30dp20 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26857 2 OK 0x1.a386eca464186p21 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26857 3 OK 0x1.ca0f9eb37f2a3p20 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26857 4 OK 0x1.9bc1db510e09cp21 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26858 0 OK 0x1.4064d55566cf7p21 0x1.56b35d2f0c193p19 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26858 1 OK 0x1.c2eee7a76769bp20 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26858 2 OK 0x1.9f5236d719eap21 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26858 3 OK 0x1.d089ec96c7bc2p20 0x1.65310f83b70e4p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26858 4 OK 0x1.9884b45f69c0dp21 0x1.65310f83b70e4p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26859 0 OK 0x1.4064d55566cf7p21 0x1.657a38f269fb8p19 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26859 1 OK 0x1.b36cbd2e0fb2p20 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26859 2 OK 0x1.a7134c13c5c65p21 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26859 3 OK 0x1.c25367e1c0d1cp20 0x1.7bac03774b0eap20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26859 4 OK 0x1.9f9ff6b9ed367p21 0x1.7bac03774b0eap20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:2686 0 OK 0x1.908ad72ddf90ap25 0x1.463dddf94c64fp6 -0x1.f00cbb13p4 0x1.37fffffffffffp7 0x0.0p0 0x1.542p-19 T +REG epsg:2686 1 OK 0x1.8c4e79250f31ap25 -0x1.0ef544d643bbcp19 -0x1.d3041e7cp4 0x1.2e0000000eabbp7 -0x1.3fffffffea4fdp2 0x1.522p-19 F +REG epsg:2686 2 OK 0x1.94c73535f2774p25 -0x1.0ef542df6b09bp19 -0x1.81ca5f886p5 0x1.41fffffff15d7p7 -0x1.3fffffffea5f4p2 0x1.51p-19 F +REG epsg:2686 3 OK 0x1.8c4e79c44cb57p25 0x1.0f09a88896477p19 -0x1.df1979028p3 0x1.2e0000000eab8p7 0x1.3fffffffea4e7p2 0x1.522p-19 F +REG epsg:2686 4 OK 0x1.94c73496c58fep25 0x1.0f09a6919814ep19 -0x1.100e98262p5 0x1.41fffffff15dap7 0x1.3fffffffea5d7p2 0x1.514p-19 F +REG epsg:26860 0 OK 0x1.907e0aaacd9ecp20 0x1.199c3402171a3p19 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:26860 1 OK 0x1.a0b616e027ecp18 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26860 2 OK 0x1.5c6747cec8a14p21 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26860 3 OK 0x1.07608efa56844p19 0x1.ad3050594afd7p20 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26860 4 OK 0x1.4ea5e6ec37fdbp21 0x1.ad3050594afd7p20 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26861 0 OK 0x1.e097400000006p20 0x1.373abe8baa894p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:26861 1 OK 0x1.4071ade5988bep20 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26861 2 OK 0x1.405e690d33ba7p21 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26861 3 OK 0x1.4849917f14ad2p20 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26861 4 OK 0x1.3c72774075a9dp21 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26862 0 OK 0x1.e097400000006p20 0x1.4edb0661224aep18 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:26862 1 OK 0x1.342a71c0862adp20 -0x1.460752e85b78bp18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26862 2 OK 0x1.4682071fbcebp21 -0x1.460752e85b78bp18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26862 3 OK 0x1.3ccb5e7f95feap20 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26862 4 OK 0x1.423190c035011p21 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26863 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26863 1 OK -0x1.e3860df712139p19 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26863 2 OK 0x1.692d237dc4853p21 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.ecb403e7f2d2dp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26863 3 OK -0x1.4eb20da18b725p19 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26863 4 OK 0x1.43f8236862dcep21 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26864 0 OK 0x1.6871700000004p21 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26864 1 OK 0x1.dfb912e887544p19 -0x1.ab1829e1bd76bp20 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26864 2 OK 0x1.2c7a4da2ef15fp22 -0x1.ab1829e1bd769p20 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26864 3 OK 0x1.38232403b5cefp20 0x1.cf2707cb433ddp20 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26864 4 OK 0x1.1a68a6ff128ccp22 0x1.cf2707cb433dep20 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26865 0 OK 0x1.4064d55566cf7p21 0x1.5e2a74ed7415ap19 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26865 1 OK 0x1.ba857c0cd30dp20 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26865 2 OK 0x1.a386eca464186p21 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26865 3 OK 0x1.ca0f9eb37f2a3p20 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26865 4 OK 0x1.9bc1db510e09cp21 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26866 0 OK 0x1.4064d55566cf7p21 0x1.56b35d2f0c193p19 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26866 1 OK 0x1.c2eee7a76769bp20 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26866 2 OK 0x1.9f5236d719eap21 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26866 3 OK 0x1.d089ec96c7bc2p20 0x1.65310f83b70e4p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26866 4 OK 0x1.9884b45f69c0dp21 0x1.65310f83b70e4p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26867 0 OK 0x1.4064d55566cf7p21 0x1.657a38f269fb8p19 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26867 1 OK 0x1.b36cbd2e0fb2p20 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26867 2 OK 0x1.a7134c13c5c65p21 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26867 3 OK 0x1.c25367e1c0d1cp20 0x1.7bac03774b0eap20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26867 4 OK 0x1.9f9ff6b9ed367p21 0x1.7bac03774b0eap20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26868 0 OK 0x1.907e0aaacd9ecp20 0x1.199c3402171a3p19 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:26868 1 OK 0x1.a0b616e027ecp18 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26868 2 OK 0x1.5c6747cec8a14p21 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:26868 3 OK 0x1.07608efa56844p19 0x1.ad3050594afd7p20 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26868 4 OK 0x1.4ea5e6ec37fdbp21 0x1.ad3050594afd7p20 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:26869 0 OK 0x1.e097400000006p20 0x1.373abe8baa894p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:26869 1 OK 0x1.4071ade5988bep20 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26869 2 OK 0x1.405e690d33ba7p21 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:26869 3 OK 0x1.4849917f14ad2p20 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:26869 4 OK 0x1.3c72774075a9dp21 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:2687 0 OK 0x1.982bf546b1dcfp25 0x1.463df1af4352fp6 -0x1.26c008184p5 0x1.3dfffffffffffp7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2687 1 OK 0x1.93ef96fcf5cffp25 -0x1.0ef5553f94c81p19 -0x1.153c1bb7ep5 0x1.340000000eacp7 -0x1.3fffffffea4fap2 0x1.51ep-19 F +REG epsg:2687 2 OK 0x1.9c68538fa9dc4p25 -0x1.0ef55348b5ab2p19 -0x1.b2cdf6984p5 0x1.47fffffff15dbp7 -0x1.3fffffffea5f5p2 0x1.50cp-19 F +REG epsg:2687 3 OK 0x1.93ef979c33b79p25 0x1.0f09b8f320378p19 -0x1.4700c899p4 0x1.340000000eab9p7 0x1.3fffffffea4e3p2 0x1.51ap-19 F +REG epsg:2687 4 OK 0x1.9c6852f07d1f5p25 0x1.0f09b6fc1b993p19 -0x1.41122801p5 0x1.47fffffff15ddp7 0x1.3fffffffea5dep2 0x1.50ep-19 F +REG epsg:26870 0 OK 0x1.e097400000006p20 0x1.4edb0661224aep18 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:26870 1 OK 0x1.342a71c0862adp20 -0x1.460752e85b78bp18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26870 2 OK 0x1.4682071fbcebp21 -0x1.460752e85b78bp18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:26870 3 OK 0x1.3ccb5e7f95feap20 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:26870 4 OK 0x1.423190c035011p21 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:2688 0 OK 0x1.9fcd13874f51fp25 0x1.463e060a68044p6 -0x1.57013ff34p5 0x1.4400000000001p7 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2688 1 OK 0x1.9b90b4fa87e9ap25 -0x1.0ef566326cfd8p19 -0x1.42b203cdp5 0x1.3a0000000eacp7 -0x1.3fffffffea4fbp2 0x1.516p-19 F +REG epsg:2688 2 OK 0x1.a40972134ca3p25 -0x1.0ef5643b87f58p19 -0x1.e51ed9fcap5 0x1.4dfffffff15dbp7 -0x1.3fffffffea5f8p2 0x1.50cp-19 F +REG epsg:2688 3 OK 0x1.9b90b599c6305p25 0x1.0f09c9e73b8eap19 -0x1.a1ec8b63cp4 0x1.3a0000000eabdp7 0x1.3fffffffea4e1p2 0x1.51ap-19 F +REG epsg:2688 4 OK 0x1.a40971742009dp25 0x1.0f09c7f031049p19 -0x1.736303ff4p5 0x1.4dfffffff15dep7 0x1.3fffffffea5e1p2 0x1.50cp-19 F +REG epsg:2689 0 OK 0x1.a76e31f0f1e01p25 0x1.463e1afc72284p6 -0x1.88a82964ap5 0x1.4ap7 0x0.0p0 0x1.544p-19 T +REG epsg:2689 1 OK 0x1.a331d31f2e795p25 -0x1.0ef577a2e8139p19 -0x1.71c3e1b64p5 0x1.400000000eac3p7 -0x1.3fffffffea4fp2 0x1.51ep-19 F +REG epsg:2689 2 OK 0x1.abaa90c1e5b66p25 -0x1.0ef575abfda56p19 -0x1.0c4cdddafp6 0x1.53fffffff15ddp7 -0x1.3fffffffea5f9p2 0x1.51p-19 F +REG epsg:2689 3 OK 0x1.a331d3be6d19fp25 0x1.0f09db590321ep19 -0x1.00081caf6p5 0x1.400000000eabfp7 0x1.3fffffffea4dbp2 0x1.522p-19 F +REG epsg:2689 4 OK 0x1.abaa9022b93ap25 0x1.0f09d961f330dp19 -0x1.a6ddde26ap5 0x1.53fffffff15ep7 0x1.3fffffffea5e3p2 0x1.51p-19 F +REG epsg:26891 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.4ap6 0x0.0p0 0x0.0p0 T +REG epsg:26891 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.5dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26891 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.360000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26891 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.5dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26891 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.360000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26892 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:26892 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.57ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26892 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26892 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.57ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26892 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26893 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:26893 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.63ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26893 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.3c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26893 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.63ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26893 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.3c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26894 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:26894 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26894 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26894 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26894 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26895 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:26895 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26895 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26895 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26895 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26896 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:26896 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26896 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.600000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26896 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26896 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.600000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26897 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:26897 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.93ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26897 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26897 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.93ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26897 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26898 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.a8p5 0x0.0p0 0x0.0p0 T +REG epsg:26898 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26898 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.800000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26898 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26898 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.800000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26899 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.cp5 0x0.0p0 0x0.0p0 T +REG epsg:26899 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26899 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.980000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26899 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:26899 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.980000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2690 0 OK 0x1.af0f5084b6b07p25 0x1.463e3076af892p6 -0x1.bb91edb4cp5 0x1.4ffffffffffffp7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2690 1 OK 0x1.aad2f16c370eap25 -0x1.0ef58984c997ep19 -0x1.a250ae9b8p5 0x1.460000000eac4p7 -0x1.3fffffffea4ebp2 0x1.51ep-19 F +REG epsg:2690 2 OK 0x1.b34baf9c61dc8p25 -0x1.0ef5878dda4bap19 -0x1.268d3e535p6 0x1.59fffffff15dep7 -0x1.3fffffffea5fdp2 0x1.50ep-19 F +REG epsg:2690 3 OK 0x1.aad2f20b7603cp25 0x1.0f09ed3c39956p19 -0x1.3094e2714p5 0x1.460000000eac1p7 0x1.3fffffffea4d6p2 0x1.51ap-19 F +REG epsg:2690 4 OK 0x1.b34baefd35762p25 0x1.0f09eb4524c57p19 -0x1.db5e975fp5 0x1.59fffffff15e3p7 0x1.3fffffffea5e4p2 0x1.50ep-19 F +REG epsg:26901 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.62p7 0x1.68p5 0x0.0p0 F +REG epsg:26901 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 0x1.5fdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26901 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.53db9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26901 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 0x1.5fdb9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26901 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.53db9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26902 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.56p7 0x1.68p5 0x0.0p0 F +REG epsg:26902 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.642463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26902 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.47db9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26902 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.642463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26902 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.47db9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26903 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.4ap7 0x1.68p5 0x0.0p0 F +REG epsg:26903 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.582463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26903 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26903 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.582463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26903 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26904 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.3ep7 0x1.68p5 0x0.0p0 F +REG epsg:26904 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.4c2463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26904 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26904 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.4c2463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26904 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26905 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.32p7 0x1.68p5 0x0.0p0 F +REG epsg:26905 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.402463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26905 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26905 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.402463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26905 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26906 0 OK 0x1.e848000000022p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.26p7 0x1.68p5 0x0.0p0 F +REG epsg:26906 1 OK -0x1.95aae58cba618p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.342463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26906 2 OK 0x1.0d7eae58cba74p20 0x1.0fb6fd44cdb3bp22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26906 3 OK -0x1.989b4f65ea08p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.342463000f856p7 0x1.9p5 0x0.0p0 F +REG epsg:26906 4 OK 0x1.eb79369ecbd62p19 0x1.53841a99fc572p22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.9000000000001p5 0x0.0p0 F +REG epsg:26907 0 OK 0x1.e847fffffffdep18 0x1.30229999b59c6p22 0x0.0p0 -0x1.1ap7 0x1.68p5 0x0.0p0 F +REG epsg:26907 1 OK -0x1.95aae58cba748p16 0x1.0fb6fd44cdb3bp22 0x0.0p0 -0x1.282463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:26907 2 OK 0x1.0d7eae58cba62p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26907 3 OK -0x1.989b4f65eb0cp12 0x1.53841a99fc572p22 0x0.0p0 -0x1.282463000f856p7 0x1.9000000000001p5 0x0.0p0 F +REG epsg:26907 4 OK 0x1.eb79369ecbd41p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.9p5 0x0.0p0 F +REG epsg:26908 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.0ep7 0x1.68p5 0x0.0p0 F +REG epsg:26908 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.1c2463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26908 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26908 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.1c2463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26908 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26909 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.02p7 0x1.68p5 0x0.0p0 F +REG epsg:26909 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.102463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26909 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26909 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.102463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26909 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:2691 0 OK 0x1.b6b06f439d5c8p25 0x1.463e466a0e5aep6 -0x1.ef9ad39cep5 0x1.56p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2691 1 OK 0x1.b2740fe2d2e42p25 -0x1.0ef59bcb8581bp19 -0x1.d43659bb8p5 0x1.4c0000000eac7p7 -0x1.3fffffffea4ebp2 0x1.518p-19 F +REG epsg:2691 2 OK 0x1.baeccea38f112p25 -0x1.0ef599d491e2bp19 -0x1.413e22f51p6 0x1.5ffffffff15ep7 -0x1.3fffffffea601p2 0x1.508p-19 F +REG epsg:2691 3 OK 0x1.b274108212282p25 0x1.0f09ff8451f1p19 -0x1.627a863a8p5 0x1.4c0000000eac5p7 0x1.3fffffffea4d5p2 0x1.52p-19 F +REG epsg:2691 4 OK 0x1.baecce0462b9ap25 0x1.0f09fd8d38cdbp19 -0x1.08602c645p6 0x1.5ffffffff15e3p7 0x1.3fffffffea5e8p2 0x1.50ep-19 F +REG epsg:26910 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.ec00000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:26910 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.042463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26910 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26910 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.042463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26910 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26911 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.d4p6 0x1.68p5 0x0.0p0 F +REG epsg:26911 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26911 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26911 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26911 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26912 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.bcp6 0x1.68p5 0x0.0p0 F +REG epsg:26912 1 OK -0x1.95aae58cba67p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26912 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26912 3 OK -0x1.989b4f65ea5p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26912 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26913 0 OK 0x1.e847fffffffefp18 0x1.30229999b59c6p22 0x0.0p0 -0x1.a400000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:26913 1 OK -0x1.95aae58cba7p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26913 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26913 3 OK -0x1.989b4f65eaccp12 0x1.53841a99fc571p22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26913 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26914 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.8cp6 0x1.68p5 0x0.0p0 F +REG epsg:26914 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26914 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26914 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26914 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26915 0 OK 0x1.e847fffffffefp18 0x1.30229999b59c6p22 0x0.0p0 -0x1.74p6 0x1.68p5 0x0.0p0 F +REG epsg:26915 1 OK -0x1.95aae58cba7p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26915 2 OK 0x1.0d7eae58cba67p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26915 3 OK -0x1.989b4f65eaccp12 0x1.53841a99fc571p22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26915 4 OK 0x1.eb79369ecbd4ap19 0x1.53841a99fc571p22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26916 0 OK 0x1.e848000000011p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.5cp6 0x1.68p5 0x0.0p0 F +REG epsg:26916 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26916 2 OK 0x1.0d7eae58cba7p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26916 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26916 4 OK 0x1.eb79369ecbd5ap19 0x1.53841a99fc571p22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26917 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.44p6 0x1.68p5 0x0.0p0 F +REG epsg:26917 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26917 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26917 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26917 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26918 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.2cp6 0x1.68p5 0x0.0p0 F +REG epsg:26918 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26918 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26918 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26918 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26919 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.14p6 0x1.68p5 0x0.0p0 F +REG epsg:26919 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26919 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26919 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26919 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:2692 0 OK 0x1.be518e2e873a8p25 0x1.463e5cc727cddp6 -0x1.124f2c2b8p6 0x1.5bfffffffffffp7 0x0.0p0 0x1.542p-19 T +REG epsg:2692 1 OK 0x1.ba152e841608fp25 -0x1.0ef5ae6a48ff9p19 -0x1.03a8f029bp6 0x1.520000000eac8p7 -0x1.3fffffffea4e5p2 0x1.524p-19 F +REG epsg:2692 2 OK 0x1.c28dedd81bf47p25 -0x1.0ef5ac73519c7p19 -0x1.5c4cd1574p6 0x1.65fffffff15e1p7 -0x1.3fffffffea6p2 0x1.50ep-19 F +REG epsg:2692 3 OK 0x1.ba152f235596p25 0x1.0f0a1224786f1p19 -0x1.9596054eap5 0x1.520000000eac5p7 0x1.3fffffffea4cep2 0x1.522p-19 F +REG epsg:2692 4 OK 0x1.c28ded38efa4ep25 0x1.0f0a102d5b873p19 -0x1.236ed6ccp6 0x1.65fffffff15e5p7 0x1.3fffffffea5ecp2 0x1.50ap-19 F +REG epsg:26920 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.f8p5 0x1.68p5 0x0.0p0 F +REG epsg:26920 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26920 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26920 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26920 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26921 0 OK 0x1.e848000000011p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.c800000000001p5 0x1.68p5 0x0.0p0 F +REG epsg:26921 1 OK -0x1.95aae58cba67p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26921 2 OK 0x1.0d7eae58cba72p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.8f6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26921 3 OK -0x1.989b4f65ea5p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26921 4 OK 0x1.eb79369ecbd5cp19 0x1.53841a99fc571p22 0x0.0p0 -0x1.8f6e73ffc1ea9p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26922 0 OK 0x1.e848000000009p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.98p5 0x1.68p5 0x0.0p0 F +REG epsg:26922 1 OK -0x1.95aae58cba67p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.d0918c003e157p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26922 2 OK 0x1.0d7eae58cba6ep20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.5f6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26922 3 OK -0x1.989b4f65ea5p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.d0918c003e157p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26922 4 OK 0x1.eb79369ecbd54p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.5f6e73ffc1ea9p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26923 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.68p5 0x1.68p5 0x0.0p0 F +REG epsg:26923 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.a0918c003e158p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26923 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.2f6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:26923 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.a0918c003e158p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26923 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.2f6e73ffc1ea8p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:26929 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG epsg:26929 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG epsg:26929 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG epsg:26929 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:26929 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:2693 0 OK 0x1.c5f2ad4636bf8p25 0x1.463e737e4adccp6 -0x1.2d3ba49ep6 0x1.62p7 -0x1.2f74bf1dcf457p-62 0x1.54p-19 T +REG epsg:2693 1 OK 0x1.c1b64d50f69f4p25 -0x1.0ef5c15403778p19 -0x1.1dbfb3186p6 0x1.580000000eacap7 -0x1.3fffffffea4e7p2 0x1.51ap-19 F +REG epsg:2693 2 OK 0x1.ca2f0d3a9750dp25 -0x1.0ef5bf5d08e11p19 -0x1.77a64d3e7p6 -0x1.640000000ea1fp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2693 3 OK 0x1.c1b64df0366f6p25 0x1.0f0a250f9b7c6p19 -0x1.c9c3837fap5 0x1.580000000eac8p7 0x1.3fffffffea4cfp2 0x1.52p-19 F +REG epsg:2693 4 OK 0x1.ca2f0c9b6b021p25 0x1.0f0a23187b60ap19 -0x1.3ec84eadap6 -0x1.640000000ea1bp7 0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:26930 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:26930 1 OK 0x1.02d19c77044p14 -0x1.087061b7c104ap19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:26930 2 OK 0x1.20ecb98e23efp20 -0x1.087061b7c104ap19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:26930 3 OK 0x1.1be3a4fd1d818p16 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:26930 4 OK 0x1.1339c5b02e27ep20 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:26931 0 OK 0x1.8fbe978036a34p19 0x1.18cf360b43f08p19 0x0.0p0 -0x1.0b55555555557p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:26931 1 OK 0x1.6e66e9057dp17 0x1.ca9154cf8ep15 0x0.0p0 -0x1.1db1b1b64ab15p7 0x1.9fffffffffbaap5 0x0.0p0 F +REG epsg:26931 2 OK 0x1.617cb717a7deep20 0x1.d252ddb583bp15 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:26931 3 OK 0x1.4aba437879f4p18 0x1.1c6f1a198f6f4p20 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.effffffffff93p5 0x0.0p0 F +REG epsg:26931 4 OK 0x1.3d41bfcebc39cp20 0x1.1ccf3b7cbc02cp20 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.effffffffff94p5 0x0.0p0 F +REG epsg:26932 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG epsg:26932 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.2d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26932 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.0afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26932 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.2d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26932 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.0afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26933 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG epsg:26933 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.35035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26933 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.12fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26933 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.35035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26933 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.12fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26934 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG epsg:26934 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.3d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26934 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.1afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26934 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.3d035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26934 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.1afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26935 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG epsg:26935 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.45035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26935 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.22fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26935 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.45035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26935 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.22fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26936 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG epsg:26936 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.4d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26936 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.2afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26936 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.4d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26936 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.2afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26937 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG epsg:26937 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.55035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26937 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.32fcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26937 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.55035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26937 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.32fcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26938 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG epsg:26938 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.5d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26938 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.3afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26938 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.5d035501f888p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26938 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.3afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:26939 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG epsg:26939 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.65035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:26939 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.42fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:26939 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.65035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:26939 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.42fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:2694 0 OK 0x1.c9c33c8b4ef6cp25 0x1.463e8a7f874f6p6 -0x1.487feeee2p6 -0x1.68p7 0x0.0p0 0x1.54p-19 F +REG epsg:2694 1 OK 0x1.c586dc4a4c2f6p25 -0x1.0ef5d47b6fafdp19 -0x1.384d276bap6 0x1.5e0000000eacbp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:2694 2 OK 0x1.cdff9ccb6fb69p25 -0x1.0ef5d28472798p19 -0x1.933765ee6p6 -0x1.5e0000000ea1cp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2694 3 OK 0x1.c586dce98c3c5p25 0x1.0f0a383874e23p19 -0x1.fede6456ep5 0x1.5e0000000eac7p7 0x1.3fffffffea4cbp2 0x1.522p-19 F +REG epsg:2694 4 OK 0x1.cdff9c2c4361ap25 0x1.0f0a364152265p19 -0x1.5a59634fcp6 -0x1.5e0000000ea19p7 0x1.3fffffffea5ecp2 0x1.512p-19 F +REG epsg:26940 0 OK 0x1.e848p19 0x1.33df8afe9429fp17 0x0.0p0 -0x1.6p7 0x1.a355555555154p5 0x0.0p0 F +REG epsg:26940 1 OK 0x1.4422779e37856p19 -0x1.1ed11dc93382bp17 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG epsg:26940 2 OK 0x1.4636c430e43d5p20 -0x1.1ed11dc93382bp17 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG epsg:26940 3 OK 0x1.580525cdf719ep19 0x1.d741d626e2c06p18 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG epsg:26940 4 OK 0x1.3c456d1904731p20 0x1.d741d626e2c06p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG epsg:26941 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:26941 1 OK 0x1.a694a7721358p20 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:26941 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:26941 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:26941 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:26942 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:26942 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:26942 2 OK 0x1.12833bad34ff3p21 0x1.7686899058616p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:26942 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6c2p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:26942 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:26943 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:26943 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:26943 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:26943 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:26943 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:26944 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:26944 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:26944 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:26944 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:26944 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:26945 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:26945 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:26945 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:26945 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:26945 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:26946 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:26946 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:26946 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:26946 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:26946 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:26948 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:26948 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:26948 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:26948 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:26948 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:26949 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:26949 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:26949 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:26949 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:26949 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2695 0 OK 0x1.d534ebfe530fp25 0x1.463ea1bab8e7dp6 -0x1.6408e9415p6 -0x1.6200000000001p7 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2695 1 OK 0x1.d0f88b70cf107p25 -0x1.0ef5e7d31d1ffp19 -0x1.533eab99fp6 0x1.640000000eacdp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:2695 2 OK 0x1.d9714c8af32dcp25 -0x1.0ef5e5dc1ddecp19 -0x1.aeecc3a18p6 -0x1.580000000ea1fp7 -0x1.3fffffffea604p2 0x1.50ap-19 F +REG epsg:2695 3 OK 0x1.d0f88c100f53dp25 0x1.0f0a4b919317ep19 -0x1.1a60b263ap6 0x1.640000000eac9p7 0x1.3fffffffea4cbp2 0x1.51ap-19 F +REG epsg:2695 4 OK 0x1.d9714bebc6cb9p25 0x1.0f0a499a6e50ep19 -0x1.760ebceffp6 -0x1.580000000ea1bp7 0x1.3fffffffea5ecp2 0x1.50ap-19 F +REG epsg:26950 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:26950 1 OK -0x1.6a878bb7ed38p18 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:26950 2 OK 0x1.859fc5dbf69cp19 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:26950 3 OK -0x1.317ed19066ebep18 0x1.16785ef123969p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:26950 4 OK 0x1.691b68c83375fp19 0x1.16785ef123969p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:26951 0 OK 0x1.86ap18 0x1.9bb240973abadp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:26951 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b129p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:26951 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b129p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:26951 3 OK 0x1.797b25aa020dcp17 0x1.3735788b95813p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:26951 4 OK 0x1.284136957f7c9p19 0x1.3735788b95813p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:26952 0 OK 0x1.86ap18 0x1.f85a78d71c1e8p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:26952 1 OK 0x1.390d3a7ad5114p17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:26952 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:26952 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:26952 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:26953 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:26953 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:26953 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:26953 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:26953 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:26954 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:26954 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:26954 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:26954 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:26954 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:26955 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:26955 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:26955 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:26955 3 OK 0x1.60a2ad403160fp19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:26955 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:26956 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abb7p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:26956 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:26956 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:26956 3 OK 0x1.75e64473bf831p17 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:26956 4 OK 0x1.985d2bcd7fae6p18 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:26957 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:26957 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:26957 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:26957 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:26957 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:26958 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:26958 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:26958 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:26958 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:26958 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:26959 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:26959 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:26959 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:26959 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:26959 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2696 0 OK 0x1.dcd60b9fa5feep25 0x1.463eb91f92b79p6 -0x1.7fc341872p6 -0x1.5bfffffffffffp7 -0x1.2f74bf1dcf458p-62 0x1.53ep-19 T +REG epsg:2696 1 OK 0x1.d899aac517e6dp25 -0x1.0ef5fb4d795dbp19 -0x1.6e8157dfcp6 -0x1.65fffffff1533p7 -0x1.3fffffffea4e1p2 0x1.52p-19 F +REG epsg:2696 2 OK 0x1.e1126c794f002p25 -0x1.0ef5f95678a81p19 -0x1.cab2f51a8p6 -0x1.520000000ea1dp7 -0x1.3fffffffea605p2 0x1.50cp-19 F +REG epsg:2696 3 OK 0x1.d899ab64585a1p25 0x1.0f0a5f0d62b07p19 -0x1.35a35aa73p6 -0x1.65fffffff1538p7 0x1.3fffffffea4c7p2 0x1.51ep-19 F +REG epsg:2696 4 OK 0x1.e1126bda2289bp25 0x1.0f0a5d163c74cp19 -0x1.91d4ea534p6 -0x1.520000000ea19p7 0x1.3fffffffea5edp2 0x1.51p-19 F +REG epsg:26960 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:26960 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002aep16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:26960 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002aep16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:26960 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:26960 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:26961 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG epsg:26961 1 OK -0x1.189e532ce2828p16 -0x1.0b145d531a7efp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG epsg:26961 2 OK 0x1.05ade532ce282p20 -0x1.0b145d531a7efp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG epsg:26961 3 OK -0x1.2e8eb60eec2fp15 0x1.1337c2eae2b2fp19 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG epsg:26961 4 OK 0x1.fb30eb60eec2fp19 0x1.1337c2eae2b2fp19 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG epsg:26962 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG epsg:26962 1 OK -0x1.1e4804260d93p16 -0x1.0ac07b5fe1fdbp19 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG epsg:26962 2 OK 0x1.0608804260d9ep20 -0x1.0ac07b5fe1fdap19 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG epsg:26962 3 OK -0x1.2379871f4e76p15 0x1.139768118dd2p19 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG epsg:26962 4 OK 0x1.fa7f9871f4e8cp19 0x1.139768118dd21p19 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532545p4 0x0.0p0 F +REG epsg:26963 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG epsg:26963 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:26963 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:26963 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:26963 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:26964 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG epsg:26964 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG epsg:26964 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG epsg:26964 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG epsg:26964 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG epsg:26965 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG epsg:26965 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG epsg:26965 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG epsg:26965 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG epsg:26965 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG epsg:26966 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:26966 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:26966 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:26966 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:26966 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:26967 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:26967 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:26967 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:26967 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:26967 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:26968 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:26968 1 OK -0x1.85616a723a06p18 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:26968 2 OK 0x1.8600b5391d03p19 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:26968 3 OK -0x1.30ce4325f0855p18 0x1.19e94e9402c22p19 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:26968 4 OK 0x1.5bb72192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:26969 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:26969 1 OK -0x1.81a5a9c8e8128p16 -0x1.04cdd2a40a263p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:26969 2 OK 0x1.0c3e5a9c8e818p20 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:26969 3 OK -0x1.7ac864be1088p13 0x1.19e94e9402c21p19 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:26969 4 OK 0x1.ee332192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2697 0 OK 0x1.e4772b6f8a3eap25 0x1.463ed09daa8ddp6 -0x1.9b9b8306bp6 -0x1.56p7 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2697 1 OK 0x1.e03aca479f394p25 -0x1.0ef60edcd9a3p19 -0x1.8a020b83cp6 -0x1.5ffffffff1531p7 -0x1.3fffffffea4e1p2 0x1.51ap-19 F +REG epsg:2697 2 OK 0x1.e8b38c968f988p25 -0x1.0ef60ce5d8106p19 -0x1.e6767d49ep6 -0x1.4c0000000ea1cp7 -0x1.3fffffffea606p2 0x1.50ap-19 F +REG epsg:2697 3 OK 0x1.e03acae6dfd5cp25 0x1.0f0a729e37e13p19 -0x1.51240a3fbp6 -0x1.5ffffffff1537p7 0x1.3fffffffea4c8p2 0x1.522p-19 F +REG epsg:2697 4 OK 0x1.e8b38bf76306ep25 0x1.0f0a70a710c87p19 -0x1.ad986e6d7p6 -0x1.4c0000000ea19p7 0x1.3fffffffea5eep2 0x1.50cp-19 F +REG epsg:26970 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:26970 1 OK 0x1.89215ec34d45p17 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:26970 2 OK 0x1.557bd42796576p20 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:26970 3 OK 0x1.192388e235138p18 0x1.19e84b4359962p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:26970 4 OK 0x1.40571dc772bb2p20 0x1.19e84b4359962p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:26971 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:26971 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:26971 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:26971 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:26971 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:26972 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:26972 1 OK 0x1.a750195edb798p16 -0x1.06875fc1616cep19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:26972 2 OK 0x1.3b56fe6a1248cp20 -0x1.06875fc1616cdp19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dcp4 0x0.0p0 F +REG epsg:26972 3 OK 0x1.6115074dc79c6p17 0x1.1836b2e30beebp19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:26972 4 OK 0x1.29a95f16470ccp20 0x1.1836b2e30beecp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:26973 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:26973 1 OK -0x1.e136f546b674cp18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:26973 2 OK 0x1.52437aa35b3b1p19 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:26973 3 OK -0x1.9852805abae41p18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:26973 4 OK 0x1.2dd1402d5d72ap19 0x1.928ff7cb858e7p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:26974 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:26974 1 OK 0x1.2c090ab9498b4p18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:26974 2 OK 0x1.6c71bd51ad9d3p20 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:26974 3 OK 0x1.74ed7fa5451bfp18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:26974 4 OK 0x1.5a38a016aeb9p20 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:26975 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:26975 1 OK 0x1.3cc6ee6e8294ep20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:26975 2 OK 0x1.9fa511917d6b2p20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:26975 3 OK 0x1.3f7cec2641663p20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:26975 4 OK 0x1.9cef13d9be99dp20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:26976 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:26976 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:26976 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:26976 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:26976 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:26977 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:26977 1 OK 0x1.cb1f1458ef103p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:26977 2 OK 0x1.13d83ae9c43b6p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:26977 3 OK 0x1.d81683a3ea361p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:26977 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:26978 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:26978 1 OK 0x1.651ae3466f2f2p17 0x1.225e5e1328bcap18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:26978 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bcap18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:26978 3 OK 0x1.7a4c446942232p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:26978 4 OK 0x1.280ceee5af77dp19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:26979 0 OK 0x1.e848p18 0x1.94a7f22e85bdp14 0x0.0p0 -0x1.51p6 0x1.2ddddddddddbcp5 0x0.0p0 F +REG epsg:26979 1 OK 0x1.79f715e225e0ep18 -0x1.49679bd8ed604p16 0x0.0p0 -0x1.560ec7d05efd7p6 0x1.25dddddddddb9p5 0x0.0p0 F +REG epsg:26979 2 OK 0x1.2b4c750eed0f9p19 -0x1.49679bd8ed604p16 0x0.0p0 -0x1.4bf1382fa1029p6 0x1.25dddddddddb9p5 0x0.0p0 F +REG epsg:26979 3 OK 0x1.7ce88d303879cp18 0x1.0cd7f0f322e7dp17 0x0.0p0 -0x1.560ec7d05efd7p6 0x1.35dddddddddbfp5 0x0.0p0 F +REG epsg:26979 4 OK 0x1.29d3b967e3c32p19 0x1.0cd7f0f322e7dp17 0x0.0p0 -0x1.4bf1382fa1029p6 0x1.35dddddddddbfp5 0x0.0p0 F +REG epsg:2698 0 OK 0x1.ec184b6e219ap25 0x1.463ee824847cbp6 -0x1.b77e24068p6 -0x1.5p7 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2698 1 OK 0x1.e7dbe9f8bd1bcp25 -0x1.0ef622738464fp19 -0x1.a5ad7a425p6 -0x1.59fffffff1533p7 -0x1.3fffffffea4e1p2 0x1.516p-19 F +REG epsg:2698 2 OK 0x1.f054ace2a07a4p25 -0x1.0ef6207c828d2p19 -0x1.0111f07ccp7 -0x1.460000000ea1fp7 -0x1.3fffffffea602p2 0x1.508p-19 F +REG epsg:2698 3 OK 0x1.e7dbea97fddadp25 0x1.0f0a863658197p19 -0x1.6ccf74eccp6 -0x1.59fffffff1536p7 0x1.3fffffffea4c8p2 0x1.51ap-19 F +REG epsg:2698 4 OK 0x1.f054ac4373c69p25 0x1.0f0a843f30bb9p19 -0x1.c945ce0bp6 -0x1.460000000ea1bp7 0x1.3fffffffea5edp2 0x1.51p-19 F +REG epsg:26980 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:26980 1 OK 0x1.36785c3381cdep18 0x1.93766c01072c4p18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:26980 2 OK 0x1.4d0bd1e63f187p19 0x1.93766c01072c4p18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:26980 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:26980 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:26981 0 OK 0x1.e848p19 0x1.d532d46be5665p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:26981 1 OK 0x1.6fab4a4b43fbfp19 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:26981 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:26981 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:26981 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:26982 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:26982 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:26982 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:26982 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:26982 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:26983 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:26983 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26983 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:26983 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26983 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:26984 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:26984 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26984 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:26984 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26984 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:26985 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:26985 1 OK 0x1.7f67f8df8368dp17 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:26985 2 OK 0x1.26c601c81f25dp19 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:26985 3 OK 0x1.92b98c3d8bc66p17 0x1.24621bba84e0bp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:26985 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84e0bp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:26986 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:26986 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:26986 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:26986 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:26986 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:26987 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:26987 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:26987 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:26987 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:26987 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:26988 0 OK 0x1.e848p22 0x1.f347dc7be971fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:26988 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:26988 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:26988 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:26988 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:26989 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:26989 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:26989 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:26989 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:26989 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:2699 0 OK 0x1.e867bca20c957p18 0x1.463e8bdfd0b3ep6 -0x1.4a21a780fp6 0x1.5p4 0x0.0p0 0x1.546p-19 T +REG epsg:2699 1 OK -0x1.ae432d8c2cdep15 -0x1.0ef5d59feb7dcp19 -0x1.94dcab54bp6 0x1.0000000075118p4 -0x1.3fffffffea5fbp2 0x1.51p-19 F +REG epsg:2699 2 OK 0x1.01a5f7da15138p20 -0x1.0ef5d3aa98974p19 -0x1.39e4fad07p6 0x1.9fffffff8a9dp4 -0x1.3fffffffea4ebp2 0x1.51cp-19 F +REG epsg:2699 3 OK -0x1.ae40b0d8743p15 0x1.0f0a395d06691p19 -0x1.5bfea8784p6 0x1.00000000750f9p4 0x1.3fffffffea5e4p2 0x1.50cp-19 F +REG epsg:2699 4 OK 0x1.01a5e3f2261d2p20 0x1.0f0a37678e3bbp19 -0x1.010705549p6 0x1.9fffffff8a9edp4 0x1.3fffffffea4d5p2 0x1.51ap-19 F +REG epsg:26990 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:26990 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:26990 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:26990 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:26990 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:26991 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:26991 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26991 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:26991 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26991 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:26992 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:26992 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26992 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:26992 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26992 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:26993 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:26993 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26993 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:26993 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26993 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:26994 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:26994 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:26994 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:26994 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:26994 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:26995 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:26995 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:26995 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:26995 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:26995 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:26996 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:26996 1 OK -0x1.4c8d5deffd5fap18 -0x1.06c963762fa92p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:26996 2 OK 0x1.9a6aaef7feafdp19 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:26996 3 OK -0x1.07f8838806987p18 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:26996 4 OK 0x1.782041c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:26997 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:26997 1 OK -0x1.61a577bff57e8p16 -0x1.06c963762fa92p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:26997 2 OK 0x1.0a3e577bff57ep20 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:26997 3 OK -0x1.3d4838806987p14 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:26997 4 OK 0x1.f23241c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:26998 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG epsg:26998 1 OK 0x1.f9e988e88c2ccp17 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:26998 2 OK 0x1.5fcccee2ee7a6p20 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:26998 3 OK 0x1.42628ec44b0f3p18 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:26998 4 OK 0x1.4e715c4eed3c3p20 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.6139e6ce2bc88p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:2700 0 OK 0x1.e867608a3fec2p18 0x1.463e74daadadep6 -0x1.2ed8bd408p6 0x1.8000000000001p4 0x0.0p0 0x1.53ep-19 T +REG epsg:2700 1 OK -0x1.ae44df1662b6p15 -0x1.0ef5c275422e6p19 -0x1.7948df416p6 0x1.300000007511ep4 -0x1.3fffffffea5fdp2 0x1.50ap-19 F +REG epsg:2700 2 OK 0x1.01a5d75a328ap20 -0x1.0ef5c07fed3ep19 -0x1.1f510bfc3p6 0x1.cfffffff8a9d8p4 -0x1.3fffffffea4ecp2 0x1.51cp-19 F +REG epsg:2700 3 OK -0x1.ae426262c489p15 0x1.0f0a2630efae6p19 -0x1.406ae073p6 0x1.30000000750ffp4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:2700 4 OK 0x1.01a5c3724b222p20 0x1.0f0a243b7577p19 -0x1.cce634d18p5 0x1.cfffffff8a9f7p4 0x1.3fffffffea4d7p2 0x1.51ap-19 F +REG epsg:2701 0 OK 0x1.e866edb9c05a1p18 0x1.463e5e1eaf988p6 -0x1.13e683023p6 0x1.bp4 0x0.0p0 0x1.544p-19 T +REG epsg:2701 1 OK -0x1.ae474a2af887p15 -0x1.0ef5af877fac4p19 -0x1.5deb8a43ep6 0x1.6000000075121p4 -0x1.3fffffffea5f9p2 0x1.50ep-19 F +REG epsg:2701 2 OK 0x1.01a5b14a35b2bp20 -0x1.0ef5ad92281d2p19 -0x1.0532b4f06p6 0x1.ffffffff8a9e4p4 -0x1.3fffffffea4f2p2 0x1.516p-19 F +REG epsg:2701 3 OK -0x1.ae44cd7758a1p15 0x1.0f0a1341c44a5p19 -0x1.250d8f7bap6 0x1.6000000075105p4 0x1.3fffffffea5e2p2 0x1.51p-19 F +REG epsg:2701 4 OK 0x1.01a59d6256a06p20 0x1.0f0a114c47739p19 -0x1.98a98e682p5 0x1.ffffffff8aa01p4 0x1.3fffffffea4dcp2 0x1.518p-19 F +REG epsg:2702 0 OK 0x1.e8666481224cp18 0x1.463e47bbca156p6 -0x1.f2bbc2114p5 0x1.e000000000003p4 0x0.0p0 0x1.53ep-19 T +REG epsg:2702 1 OK -0x1.ae4a6d1763f9p15 -0x1.0ef59ce3ec056p19 -0x1.42d7dfcbfp6 0x1.900000007512dp4 -0x1.3fffffffea5f8p2 0x1.50ep-19 F +REG epsg:2702 2 OK 0x1.01a585c4d4b27p20 -0x1.0ef59aee9143dp19 -0x1.d7389277ep5 0x1.17ffffffc54f9p5 -0x1.3fffffffea4f4p2 0x1.51cp-19 F +REG epsg:2702 3 OK -0x1.ae47f063a625p15 0x1.0f0a009ccd47dp19 -0x1.09f9e8ff1p6 0x1.900000007510ep4 0x1.3fffffffea5dfp2 0x1.50ep-19 F +REG epsg:2702 4 OK 0x1.01a571dcfeb7p20 0x1.0f09fea74d3e2p19 -0x1.657cbe85ep5 0x1.17ffffffc5508p5 0x1.3fffffffea4dep2 0x1.51ap-19 F +REG epsg:2703 0 OK 0x1.e865c540b2cddp18 0x1.463e31c1b23aep6 -0x1.bea2eaf3ap5 0x1.07fffffffffffp5 -0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2703 1 OK -0x1.ae4e45a81cfdp15 -0x1.0ef58a979b34fp19 -0x1.2820df94bp6 0x1.c000000075136p4 -0x1.3fffffffea5f6p2 0x1.508p-19 F +REG epsg:2703 2 OK 0x1.01a554e89a1c4p20 -0x1.0ef588a23cbp19 -0x1.a53f7a188p5 0x1.2fffffffc5502p5 -0x1.3fffffffea4f7p2 0x1.51cp-19 F +REG epsg:2703 3 OK -0x1.ae4bc8f42519p15 0x1.0f09ee4f1f9b4p19 -0x1.de85d96a6p5 0x1.c000000075117p4 0x1.3fffffffea5dbp2 0x1.514p-19 F +REG epsg:2703 4 OK 0x1.01a54100cdf28p20 0x1.0f09ec599bcdbp19 -0x1.3383ad7fap5 0x1.2fffffffc551p5 0x1.3fffffffea4ep2 0x1.51ap-19 F +REG epsg:27037 0 OK 0x1.e83f2325b72b7p18 -0x1.7cd638ece5ccfp8 0x1.67198a00fp7 0x1.3800000000001p5 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:27037 1 OK -0x1.ad96ba384badp15 -0x1.0f1101862ef6fp19 0x1.b08918157p7 0x1.1000000000002p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:27037 2 OK 0x1.018c475ea6decp20 -0x1.0f110185f3dc2p19 0x1.a4380c9cbp7 0x1.6p5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:27037 3 OK -0x1.ada25824e37ap15 0x1.0eb1ccc750ac7p19 0x1.2bb3a9dd2p7 0x1.1000000000002p5 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:27037 4 OK 0x1.018ca44b0563cp20 0x1.0eb1ccc715bap19 0x1.1f6295ee2p7 0x1.6p5 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:27038 0 OK 0x1.e83791194de48p18 -0x1.7cd64dd37e0a7p8 0x1.5c7d763218p7 0x1.67fffffffffffp5 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:27038 1 OK -0x1.add4369fabefp15 -0x1.0f1110701245fp19 0x1.ab445312p7 0x1.4p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:27038 2 OK 0x1.018a6a3695ad8p20 -0x1.0f11106fa4b14p19 0x1.946df4d9cp7 0x1.8fffffffffffep5 -0x1.3fffffffffffcp2 0x1.0p-30 F +REG epsg:27038 3 OK -0x1.addfd4b78069p15 0x1.0eb1dbac04cf5p19 0x1.266ee13bp7 0x1.4p5 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:27038 4 OK 0x1.018ac721b8c03p20 0x1.0eb1dbab9785bp19 0x1.0f98735218p7 0x1.8fffffffffffep5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:27039 0 OK 0x1.e8302d22c8377p18 -0x1.7cd66f16a528fp8 0x1.4b9afdb408p7 0x1.98p5 0x0.0p0 -0x1.0p-30 T +REG epsg:27039 1 OK -0x1.ae10cdbcb282p15 -0x1.0f11282bf3b31p19 0x1.9fa55991ap7 0x1.7p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:27039 2 OK 0x1.01889cef4407cp20 -0x1.0f11282b54dd2p19 0x1.7e89b43fd8p7 0x1.c000000000001p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:27039 3 OK -0x1.ae1c6bffe841p15 0x1.0eb1f35fa6296p19 0x1.1acfdfbeb8p7 0x1.7p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:27039 4 OK 0x1.0188f9d93c85ap20 0x1.0eb1f35f07c03p19 0x1.f368475bdp6 0x1.c000000000001p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2704 0 OK 0x1.e865106833f0ep18 0x1.463e1c3fd391p6 -0x1.8ba70ea22p5 0x1.2000000000001p5 0x1.2f74bf1dcf456p-62 0x1.542p-19 T +REG epsg:2704 1 OK -0x1.ae52d12a2944p15 -0x1.0ef578af63f73p19 -0x1.0dd948502p6 0x1.f000000075141p4 -0x1.3fffffffea5f4p2 0x1.51p-19 F +REG epsg:2704 2 OK 0x1.01a51ed7cf824p20 -0x1.0ef576ba01201p19 -0x1.749d31264p5 0x1.47ffffffc5509p5 -0x1.3fffffffea4fap2 0x1.51ap-19 F +REG epsg:2704 3 OK -0x1.ae505475db55p15 0x1.0f09dc6592f61p19 -0x1.a9f6b29cap5 0x1.f000000075122p4 0x1.3fffffffea5dap2 0x1.50cp-19 F +REG epsg:2704 4 OK 0x1.01a50af00dde4p20 0x1.0f09da700ad5ap19 -0x1.02e16bb42p5 0x1.47ffffffc5518p5 0x1.3fffffffea4e2p2 0x1.51ep-19 F +REG epsg:27040 0 OK 0x1.e8290bfc0ff77p18 -0x1.7cd69c59164e1p8 0x1.34a17a8b6p7 0x1.c800000000001p5 0x0.0p0 -0x1.0p-30 T +REG epsg:27040 1 OK -0x1.ae4bd5a37ef5p15 -0x1.0f11487746359p19 0x1.8dccc2a298p7 0x1.ap5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:27040 2 OK 0x1.0186e496565f8p20 -0x1.0f11487677e32p19 0x1.62c8af8bf8p7 0x1.fp5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:27040 3 OK -0x1.ae577411c0f5p15 0x1.0eb2139fbed4ap19 0x1.08f73c8cd8p7 0x1.ap5 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:27040 4 OK 0x1.0187417f386b8p20 0x1.0eb2139ef10f3p19 0x1.bbe617d11p6 0x1.fp5 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:2705 0 OK 0x1.e86446768e4cdp18 0x1.463e0745453e2p6 -0x1.59ebf3162p5 0x1.3800000000001p5 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2705 1 OK -0x1.ae580c6d01b8p15 -0x1.0ef56737d6c7p19 -0x1.e82715018p5 0x1.100000003a8a9p5 -0x1.3fffffffea5f2p2 0x1.50ep-19 F +REG epsg:2705 2 OK 0x1.01a4e3b86563cp20 -0x1.0ef565426f124p19 -0x1.4573d7766p5 0x1.5fffffffc5513p5 -0x1.3fffffffea4fdp2 0x1.51ap-19 F +REG epsg:2705 3 OK -0x1.ae558fb84201p15 0x1.0f09caecb8c23p19 -0x1.766b3e91ep5 0x1.100000003a89ap5 0x1.3fffffffea5d8p2 0x1.51p-19 F +REG epsg:2705 4 OK 0x1.01a4cfd0aef22p20 0x1.0f09c8f72bc37p19 -0x1.a77031e74p4 0x1.5fffffffc552p5 0x1.3fffffffea4e6p2 0x1.51ep-19 F +REG epsg:2706 0 OK 0x1.e86367f977f6bp18 0x1.463df2e0bf72cp6 -0x1.29947d332p5 0x1.4ffffffffffffp5 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2706 1 OK -0x1.ae5df3c4cfd9p15 -0x1.0ef5563d350d6p19 -0x1.b5c377114p5 0x1.280000003a8bp5 -0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:2706 2 OK 0x1.01a4a3b3d88cp20 -0x1.0ef55447c7f3p19 -0x1.17e4845c8p5 0x1.77ffffffc551cp5 -0x1.3fffffffea504p2 0x1.518p-19 F +REG epsg:2706 3 OK -0x1.ae5b770f82edp15 0x1.0f09b9f0d352fp19 -0x1.4407a80aep5 0x1.280000003a8a2p5 0x1.3fffffffea5d6p2 0x1.508p-19 F +REG epsg:2706 4 OK 0x1.01a48fcc2df18p20 0x1.0f09b7fb40ed9p19 -0x1.4c51991ap4 0x1.77ffffffc552bp5 0x1.3fffffffea4ecp2 0x1.516p-19 F +REG epsg:2707 0 OK 0x1.e862758d1100dp18 0x1.463ddf209114p6 -0x1.f5853094cp4 0x1.68p5 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2707 1 OK -0x1.ae64830d0116p15 -0x1.0ef545cb6889cp19 -0x1.84ab11f42p5 0x1.400000003a8b8p5 -0x1.3fffffffea5e9p2 0x1.50cp-19 F +REG epsg:2707 2 OK 0x1.01a45ef714f45p20 -0x1.0ef543d5f585p19 -0x1.d81e5ee88p4 0x1.8fffffffc5525p5 -0x1.3fffffffea506p2 0x1.51ep-19 F +REG epsg:2707 3 OK -0x1.ae6206570beep15 0x1.0f09a97dcd4ap19 -0x1.12ef4a256p5 0x1.400000003a8a9p5 0x1.3fffffffea5dp2 0x1.51p-19 F +REG epsg:2707 4 OK 0x1.01a44b0f76cd5p20 0x1.0f09a78834f99p19 -0x1.e94df85a8p3 0x1.8fffffffc5534p5 0x1.3fffffffea4fp2 0x1.51cp-19 F +REG epsg:2708 0 OK 0x1.e8616fdb75e5dp18 0x1.463dcc1295b3cp6 -0x1.9b2e3ca1cp4 0x1.8000000000001p5 0x0.0p0 0x1.544p-19 T +REG epsg:2708 1 OK -0x1.ae6bb5ab2f9ep15 -0x1.0ef535edfaf49p19 -0x1.5500585fep5 0x1.580000003a8c1p5 -0x1.3fffffffea5e9p2 0x1.508p-19 F +REG epsg:2708 2 OK 0x1.01a415b2563d7p20 -0x1.0ef533f881854p19 -0x1.84253468cp4 0x1.a7ffffffc5531p5 -0x1.3fffffffea50cp2 0x1.51cp-19 F +REG epsg:2708 3 OK -0x1.ae6938f477a4p15 0x1.0f09999f313c8p19 -0x1.c6892f27p4 0x1.580000003a8b3p5 0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:2708 4 OK 0x1.01a401cac51dcp20 0x1.0f0997a992806p19 -0x1.415bbc0ep3 0x1.a7ffffffc5541p5 0x1.3fffffffea4f2p2 0x1.51ep-19 F +REG epsg:2709 0 OK 0x1.e860579c48266p18 0x1.463db9c42bd77p6 -0x1.446381a24p4 0x1.97fffffffffffp5 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2709 1 OK -0x1.ae7386925d5ep15 -0x1.0ef526b00de8bp19 -0x1.26e4bc718p5 0x1.700000003a8cbp5 -0x1.3fffffffea5dfp2 0x1.50ep-19 F +REG epsg:2709 2 OK 0x1.01a3c81905d66p20 -0x1.0ef524ba8d932p19 -0x1.341874b44p4 0x1.bfffffffc553fp5 -0x1.3fffffffea512p2 0x1.518p-19 F +REG epsg:2709 3 OK -0x1.ae7109dac887p15 0x1.0f098a6021995p19 -0x1.6a5204dap4 0x1.700000003a8bcp5 0x1.3fffffffea5c9p2 0x1.50ep-19 F +REG epsg:2709 4 OK 0x1.01a3b43182486p20 0x1.0f09886a7bf5ep19 -0x1.4284a85ep2 0x1.bfffffffc554fp5 0x1.3fffffffea4f9p2 0x1.51ap-19 F +REG epsg:2710 0 OK 0x1.e85f2d942d792p18 0x1.463da8422b971p6 -0x1.e2c3cacp3 0x1.bp5 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2710 1 OK -0x1.ae7bf0467f59p15 -0x1.0ef5181c53147p19 -0x1.f4f1306a4p4 0x1.880000003a8d8p5 -0x1.3fffffffea5dap2 0x1.51p-19 F +REG epsg:2710 2 OK 0x1.01a3766196e84p20 -0x1.0ef51626cb615p19 -0x1.d06094f5p3 0x1.d7ffffffc554fp5 -0x1.3fffffffea516p2 0x1.51ep-19 F +REG epsg:2710 3 OK -0x1.ae79738df435p15 0x1.0f097bcb50da8p19 -0x1.1179c972p4 0x1.880000003a8c9p5 0x1.3fffffffea5c2p2 0x1.50ep-19 F +REG epsg:2710 4 OK 0x1.01a3627a216d2p20 0x1.0f0979d5a3d89p19 -0x1.2e42c1fp-2 0x1.d7ffffffc555ep5 0x1.3fffffffea4fep2 0x1.51cp-19 F +REG epsg:2711 0 OK 0x1.e85df29445b18p18 0x1.463d9798dd9afp6 -0x1.44c74b3c8p3 0x1.c800000000001p5 0x0.0p0 0x1.54p-19 T +REG epsg:2711 1 OK -0x1.ae84ece05747p15 -0x1.0ef50a3d04b87p19 -0x1.9fb62de7p4 0x1.a00000003a8e3p5 -0x1.3fffffffea5d6p2 0x1.514p-19 F +REG epsg:2711 2 OK 0x1.01a320c56020fp20 -0x1.0ef5084775361p19 -0x1.4143f08p3 0x1.efffffffc5559p5 -0x1.3fffffffea51dp2 0x1.518p-19 F +REG epsg:2711 3 OK -0x1.ae827026bd12p15 0x1.0f096deafa03fp19 -0x1.787da6ef8p3 0x1.a00000003a8d6p5 0x1.3fffffffea5bfp2 0x1.50ep-19 F +REG epsg:2711 4 OK 0x1.01a30cddf92fep20 0x1.0f096bf54531ap19 0x1.0b54f2b5p2 0x1.efffffffc5569p5 0x1.3fffffffea506p2 0x1.51ap-19 F +REG epsg:2712 0 OK 0x1.e85ca77998185p18 0x1.463d87d3f27e2p6 -0x1.5e80bcffp2 0x1.dffffffffffffp5 0x0.0p0 0x1.542p-19 T +REG epsg:2712 1 OK -0x1.ae8e761197a9p15 -0x1.0ef4fd1bde7cp19 -0x1.4e543eabp4 0x1.b80000003a8fp5 -0x1.3fffffffea5d3p2 0x1.50ep-19 F +REG epsg:2712 2 OK 0x1.01a2c780737b6p20 -0x1.0ef4fb2646bdep19 -0x1.767ecbdfp2 0x1.03ffffffe2ab4p6 -0x1.3fffffffea521p2 0x1.518p-19 F +REG epsg:2712 3 OK -0x1.ae8bf956d661p15 0x1.0f0960c8d9763p19 -0x1.ab73c0cbp2 0x1.b80000003a8e1p5 0x1.3fffffffea5bbp2 0x1.512p-19 F +REG epsg:2712 4 OK 0x1.01a2b3991b814p20 0x1.0f095ed31c66dp19 0x1.0baef0368p3 0x1.03ffffffe2abbp6 0x1.3fffffffea508p2 0x1.51ap-19 F +REG epsg:27120 0 OK 0x1.e81faebe87a5cp18 -0x1.49dd0a1b17f66p7 0x1.5eafa853ap6 -0x1.f8p5 -0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:27120 1 OK -0x1.aea5e700d566p15 -0x1.0ef702555cfd4p19 0x1.c8b681628p6 -0x1.1000000000001p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:27120 2 OK 0x1.018506782f4aap20 -0x1.0ef7025454162p19 0x1.58a7f161cp6 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:27120 3 OK -0x1.aeaaef1c0f4dp15 0x1.0ecdc70c0f2e8p19 0x1.55ab9fcp6 -0x1.1000000000001p6 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:27120 4 OK 0x1.01852eb313f54p20 0x1.0ecdc70b0695fp19 0x1.cb39dcd2cp5 -0x1.d000000000001p5 0x1.4p2 -0x1.0p-29 F +REG epsg:2713 0 OK 0x1.e85b4d2c784ddp18 0x1.463d78fe7a9afp6 -0x1.14bf763cp0 0x1.f7ffffffffffep5 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2713 1 OK -0x1.ae98852951p15 -0x1.0ef4f0c216984p19 -0x1.01047ccdp4 0x1.d00000003a8ffp5 -0x1.3fffffffea5cfp2 0x1.50cp-19 F +REG epsg:2713 2 OK 0x1.01a26ad17412ap20 -0x1.0ef4eecc7638p19 -0x1.f587ece8p0 0x1.0fffffffe2abbp6 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:2713 3 OK -0x1.ae96086d516dp15 0x1.0f09546e261a6p19 -0x1.d8d39b38p0 0x1.d00000003a8efp5 0x1.3fffffffea5b7p2 0x1.50cp-19 F +REG epsg:2713 4 OK 0x1.01a256ea2b72p20 0x1.0f09527860679p19 0x1.883d46388p3 0x1.0fffffffe2ac3p6 0x1.3fffffffea513p2 0x1.51cp-19 F +REG epsg:2714 0 OK 0x1.e859e49fe33fep18 0x1.463d6b22de487p6 0x1.833d4b4ap1 0x1.08p6 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2714 1 OK -0x1.aea31318a37ep15 -0x1.0ef4e53857639p19 -0x1.6ffa4e408p3 0x1.e80000003a909p5 -0x1.3fffffffea5cap2 0x1.50cp-19 F +REG epsg:2714 2 OK 0x1.01a20af96a344p20 -0x1.0ef4e342ae00ap19 0x1.a07f1cdcp0 0x1.1bffffffe2ac3p6 -0x1.3fffffffea53p2 0x1.51ap-19 F +REG epsg:2714 3 OK -0x1.aea0965b4f49p15 0x1.0f0948e38aebap19 0x1.5bd089e4p1 0x1.e80000003a8fbp5 0x1.3fffffffea5b1p2 0x1.50ep-19 F +REG epsg:2714 4 OK 0x1.01a1f7123144dp20 0x1.0f0946edbc34dp19 0x1.fafe16908p3 0x1.1bffffffe2acap6 0x1.3fffffffea517p2 0x1.516p-19 F +REG epsg:2715 0 OK 0x1.e8586ed0d4b6cp18 0x1.463d5e4ad68dbp6 0x1.b532671ap2 0x1.14p6 0x0.0p0 0x1.542p-19 T +REG epsg:2715 1 OK -0x1.aeae1877b2a9p15 -0x1.0ef4da86b93c1p19 -0x1.cdc5ec8ap2 0x1.000000001d48cp6 -0x1.3fffffffea5cp2 0x1.512p-19 F +REG epsg:2715 2 OK 0x1.01a1a83b95c05p20 -0x1.0ef4d891067c3p19 0x1.39657375p2 0x1.27ffffffe2acbp6 -0x1.3fffffffea534p2 0x1.51cp-19 F +REG epsg:2715 3 OK -0x1.aeab9bb8f46bp15 0x1.0f093e3120e2ep19 0x1.c016cc96p2 0x1.000000001d485p6 0x1.3fffffffea5aap2 0x1.512p-19 F +REG epsg:2715 4 OK 0x1.01a194546ccebp20 0x1.0f093c3b48cddp19 0x1.31d06ea68p4 0x1.27ffffffe2ad2p6 0x1.3fffffffea51fp2 0x1.51cp-19 F +REG epsg:2716 0 OK 0x1.e856ecc595cb3p18 0x1.463d527f66503p6 0x1.4a703fb98p3 0x1.2p6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2716 1 OK -0x1.aeb98d8ad82bp15 -0x1.0ef4d0b4bcdb7p19 -0x1.9c8c8866p1 0x1.0c0000001d494p6 -0x1.3fffffffea5b9p2 0x1.514p-19 F +REG epsg:2716 2 OK 0x1.01a142dd3ef57p20 -0x1.0ef4cebf006b2p19 0x1.f5dc340dp2 0x1.33ffffffe2ad4p6 -0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:2716 3 OK -0x1.aeb710ca9b7cp15 0x1.0f09345e69488p19 0x1.5fcb27aep3 0x1.0c0000001d48dp6 0x1.3fffffffea5a3p2 0x1.512p-19 F +REG epsg:2716 4 OK 0x1.01a12ef626432p20 0x1.0f0932688781ap19 0x1.60ee17de4p4 0x1.33ffffffe2adbp6 0x1.3fffffffea527p2 0x1.512p-19 F +REG epsg:2717 0 OK 0x1.e8555f8d04ed5p18 0x1.463d47c8d4012p6 0x1.b005fea7p3 0x1.2cp6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2717 1 OK -0x1.aec56a481028p15 -0x1.0ef4c7c94612bp19 0x1.dd717cp-2 0x1.180000001d49cp6 -0x1.3fffffffea5b6p2 0x1.50ep-19 F +REG epsg:2717 2 OK 0x1.01a0db2585dadp20 -0x1.0ef4c5d37fa52p19 0x1.4e7fe69d8p3 0x1.3fffffffe2adap6 -0x1.3fffffffea542p2 0x1.516p-19 F +REG epsg:2717 3 OK -0x1.aec2ed8641a8p15 0x1.0f092b7248711p19 0x1.d5d9c44c8p3 0x1.180000001d495p6 0x1.3fffffffea59ep2 0x1.516p-19 F +REG epsg:2717 4 OK 0x1.01a0c73e7d9dep20 0x1.0f09297c5cab5p19 0x1.8ab6f8054p4 0x1.3fffffffe2ae2p6 0x1.3fffffffea52bp2 0x1.51ap-19 F +REG epsg:2718 0 OK 0x1.e853c83dd7d5ap18 0x1.463d3e2ea3d08p6 0x1.058994d7p4 0x1.38p6 0x0.0p0 0x1.54p-19 T +REG epsg:2718 1 OK -0x1.aed1a65c9d59p15 -0x1.0ef4bfca96f56p19 0x1.ebd8f8b8p1 0x1.240000001d4a3p6 -0x1.3fffffffea5afp2 0x1.50ep-19 F +REG epsg:2718 2 OK 0x1.01a0715d305ap20 -0x1.0ef4bdd4c645p19 0x1.972d7ccd8p3 0x1.4bffffffe2ae3p6 -0x1.3fffffffea54cp2 0x1.516p-19 F +REG epsg:2718 3 OK -0x1.aecf29992ac7p15 0x1.0f09237300e76p19 0x1.20f2335bcp4 0x1.240000001d49cp6 0x1.3fffffffea597p2 0x1.518p-19 F +REG epsg:2718 4 OK 0x1.01a05d7638bdp20 0x1.0f09217d0add5p19 0x1.af0dbdc5cp4 0x1.4bffffffe2aeap6 0x1.3fffffffea533p2 0x1.51ep-19 F +REG epsg:2719 0 OK 0x1.e85227f5d7f9fp18 0x1.463d35b79266ep6 0x1.2dabef1acp4 0x1.44p6 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2719 1 OK -0x1.aede3932e014p15 -0x1.0ef4b8be4b768p19 0x1.b9624cbbp2 0x1.300000001d4acp6 -0x1.3fffffffea5aap2 0x1.514p-19 F +REG epsg:2719 2 OK 0x1.01a005ce772dp20 -0x1.0ef4b6c87044cp19 0x1.d4c3de38p3 0x1.57ffffffe2aedp6 -0x1.3fffffffea55p2 0x1.51ap-19 F +REG epsg:2719 3 OK -0x1.aedbbc6db854p15 0x1.0f091c662f097p19 0x1.51cfa0438p4 0x1.300000001d4a5p6 0x1.3fffffffea594p2 0x1.51p-19 F +REG epsg:2719 4 OK 0x1.019ff1e7904ecp20 0x1.0f091a702e7c6p19 0x1.cdd8e9f3cp4 0x1.57ffffffe2af4p6 0x1.3fffffffea539p2 0x1.518p-19 F +REG epsg:2720 0 OK 0x1.e8507fd91a162p18 0x1.463d2e69902c5p6 0x1.504de53f8p4 0x1.5p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2720 1 OK -0x1.aeeb19f85bfcp15 -0x1.0ef4b2a95578cp19 0x1.33d7b231p3 0x1.3c0000001d4b4p6 -0x1.3fffffffea59fp2 0x1.516p-19 F +REG epsg:2720 2 OK 0x1.019f98c4d1cf1p20 -0x1.0ef4b0b36f8eap19 0x1.038bea4dp4 0x1.63ffffffe2af4p6 -0x1.3fffffffea556p2 0x1.516p-19 F +REG epsg:2720 3 OK -0x1.aee89d316f21p15 0x1.0f091650c5181p19 0x1.7d62dfc48p4 0x1.3c0000001d4adp6 0x1.3fffffffea58cp2 0x1.51p-19 F +REG epsg:2720 4 OK 0x1.019f84ddfbc2ap20 0x1.0f09145ab9d11p19 0x1.e702e1718p4 0x1.63ffffffe2afbp6 0x1.3fffffffea541p2 0x1.51ap-19 F +REG epsg:27200 0 OK 0x1.32651fc9e009fp21 0x1.6f9cba8139f0bp22 -0x1.cf27250ep3 0x1.5a00000000a97p7 -0x1.47ffffffe9e3cp5 0x1.0c7ap-15 F +REG epsg:27200 1 OK 0x1.e79867ac5632fp20 0x1.4c72b9ebd7e25p22 0x1.4c25b15cp0 0x1.4cbff77c13ad9p7 -0x1.6ffffffffc2eep5 0x1.53acp-16 F +REG epsg:27200 2 OK 0x1.711f9fd658812p21 0x1.4c686e80da407p22 0x1.a553f0fcp0 0x1.67400883edca7p7 -0x1.6ffffffffbf46p5 0x1.77d4p-16 F +REG epsg:27200 3 OK 0x1.d27e912966d46p20 0x1.9057158d2c642p22 -0x1.026b9e0cap5 0x1.4cbff77c13ba3p7 -0x1.1fffffffd1b2cp5 0x1.7906p-15 F +REG epsg:27200 4 OK 0x1.7b5b21033715p21 0x1.9025dcf9e621bp22 -0x1.fe4f6063cp4 0x1.67400883ed703p7 -0x1.1fffffffd1a36p5 0x1.8c7p-15 F +REG epsg:27205 0 OK 0x1.24f3f6dad2b29p18 0x1.55b3037e7b429p19 -0x1.ca2ae26bcp4 0x1.5d87577d1ed95p7 -0x1.2709f6ce6ec7bp5 0x1.6aa2p-15 F +REG epsg:27205 1 OK -0x1.ab9b6a486a66ep17 0x1.eb6531b39ef18p16 -0x1.796e9f228p3 0x1.5106ec939b9c7p7 -0x1.4f09f6cddb912p5 0x1.eep-16 F +REG epsg:27205 2 OK 0x1.8fdb84000f54p19 0x1.eb6a6f0e53c08p16 -0x1.77a910498p3 -0x1.65f83d995dbb3p7 -0x1.4f09f6cddb686p5 0x1.0ef6p-15 F +REG epsg:27205 3 OK -0x1.1d13304ad47c4p18 0x1.2e134751764b3p20 -0x1.777047db8p5 0x1.5106ec937d28p7 -0x1.fe13ed9c3c81ep4 0x1.deb4p-15 F +REG epsg:27205 4 OK 0x1.b37ce789e80bp19 0x1.2e139e77c7082p20 -0x1.76e9b3cdep5 -0x1.65f83d993fa79p7 -0x1.fe13ed9c3c9a2p4 0x1.f78ap-15 F +REG epsg:27206 0 OK 0x1.24f3a160e5a53p18 0x1.55b347cd8554dp19 -0x1.98f288b0cp4 0x1.60eeb167ed816p7 -0x1.2e170a233f53ep5 0x1.5a16p-15 F +REG epsg:27206 1 OK -0x1.a9654f2016166p17 0x1.e8dffb7ef5f6p16 -0x1.1824b8058p3 0x1.54488539a2872p7 -0x1.56170a229ae8cp5 0x1.cc1cp-16 F +REG epsg:27206 2 OK 0x1.8f4da91bdc5d4p19 0x1.e8e53cbcfb4b8p16 -0x1.1f8e3cabp3 -0x1.626b2269c7481p7 -0x1.56170a229aaf4p5 0x1.040ep-15 F +REG epsg:27206 3 OK -0x1.1e4b5dc341d42p18 0x1.2df24ed320cfp20 -0x1.5c90333ecp5 0x1.544885397e343p7 -0x1.06170a22e312bp5 0x1.c8e4p-15 F +REG epsg:27206 4 OK 0x1.b418a7da12951p19 0x1.2df2a6e11794ep20 -0x1.5eaa5e68cp5 -0x1.626b2269a3711p7 -0x1.06170a22e31b5p5 0x1.e846p-15 F +REG epsg:27207 0 OK 0x1.24f35e6967b47p18 0x1.55b38be5cc4bfp19 -0x1.699faa788p4 0x1.63c5721e43a47p7 -0x1.34ff642b6a76p5 0x1.4a5ap-15 F +REG epsg:27207 1 OK -0x1.a712a953d34f8p17 0x1.e69670c68979p16 -0x1.7712f908p2 0x1.56f8a6d7252cap7 -0x1.5cff642ab3758p5 0x1.acecp-16 F +REG epsg:27207 2 OK 0x1.8eb8bdfc1a68p19 0x1.e69bb549501dp16 -0x1.952209dap2 -0x1.5f6dc29a9d9b2p7 -0x1.5cff642ab32b1p5 0x1.f30cp-16 F +REG epsg:27207 3 OK -0x1.1f754b397c236p18 0x1.2dcda51bf868p20 -0x1.42cfcd1f4p5 0x1.56f8a6d6fa83dp7 -0x1.0cff642b00fefp5 0x1.b45ep-15 F +REG epsg:27207 4 OK 0x1.b4ad5ac0d3b36p19 0x1.2dcdfe070e8ep20 -0x1.471d29bbcp5 -0x1.5f6dc29a73865p7 -0x1.0cff642b01026p5 0x1.d948p-15 F +REG epsg:27208 0 OK 0x1.24f3d50aa54d2p18 0x1.55b3cbabc7d8dp19 -0x1.308fe1b4cp4 0x1.6158eca7769f3p7 -0x1.3d351a6c63e0cp5 0x1.3076p-15 F +REG epsg:27208 1 OK -0x1.a43a88c83a3dcp17 0x1.e3d0e7ce58868p16 -0x1.50ece9b4p1 0x1.545c047509fdap7 -0x1.65351a6b94595p5 0x1.849cp-16 F +REG epsg:27208 2 OK 0x1.8e032e82905b4p19 0x1.e3d6334330b9p16 -0x1.72eb11f6p1 -0x1.61aa2b261c7c3p7 -0x1.65351a6b94119p5 0x1.c28cp-16 F +REG epsg:27208 3 OK -0x1.20dfaeab2f862p18 0x1.2da08e4f2c89cp20 -0x1.25e7aac78p5 0x1.545c0474d707p7 -0x1.15351a6be81f2p5 0x1.99f2p-15 F +REG epsg:27208 4 OK 0x1.b56301a418f63p19 0x1.2da0e8896666cp20 -0x1.28578634p5 -0x1.61aa2b25ea0c2p7 -0x1.15351a6be81bfp5 0x1.badcp-15 F +REG epsg:27209 0 OK 0x1.24f4695598613p18 0x1.55b392b910c9cp19 -0x1.4ca0d0f3cp4 0x1.5c74bdf4c37fp7 -0x1.391608733ccc1p5 0x1.367ap-15 F +REG epsg:27209 1 OK -0x1.a5a9337ca395ap17 0x1.e536207552e28p16 -0x1.1e4ed556p2 0x1.4f904bad9733ap7 -0x1.6116087279e77p5 0x1.963cp-16 F +REG epsg:27209 2 OK 0x1.8e5f6cf2d1905p19 0x1.e53b6bb505738p16 -0x1.150e15e6p2 -0x1.66a6cfc41005fp7 -0x1.6116087279b75p5 0x1.c2ep-16 F +REG epsg:27209 3 OK -0x1.2027af2926844p18 0x1.2db75967f7f29p20 -0x1.367d9c0aap5 0x1.4f904bad689efp7 -0x1.11160872ca8ecp5 0x1.a5e2p-15 F +REG epsg:27209 4 OK 0x1.b50796765b0d5p19 0x1.2db7b33eb986cp20 -0x1.3522fe592p5 -0x1.66a6cfc3e1d13p7 -0x1.11160872ca903p5 0x1.bd7cp-15 F +REG epsg:2721 0 OK 0x1.e84ed111313f7p18 0x1.463d2849bd1d6p6 0x1.6d572a978p4 0x1.5cp6 0x0.0p0 0x1.542p-19 T +REG epsg:2721 1 OK -0x1.aef83fa3e827p15 -0x1.0ef4ad8ff956dp19 0x1.802cbbba8p3 0x1.480000001d4bcp6 -0x1.3fffffffea598p2 0x1.516p-19 F +REG epsg:2721 2 OK 0x1.019f2a8cc18e2p20 -0x1.0ef4ab9a0884fp19 0x1.1703080dcp4 0x1.6fffffffe2afep6 -0x1.3fffffffea55fp2 0x1.514p-19 F +REG epsg:2721 3 OK -0x1.aef5c2db2787p15 0x1.0f09113707bf5p19 0x1.a38d5eedp4 0x1.480000001d4b4p6 0x1.3fffffffea582p2 0x1.514p-19 F +REG epsg:2721 4 OK 0x1.019f16a5fc5bp20 0x1.0f090f40f18fp19 0x1.fa79fc54cp4 0x1.6fffffffe2b06p6 0x1.3fffffffea548p2 0x1.514p-19 F +REG epsg:27210 0 OK 0x1.24f4169fdc128p18 0x1.55b3b97b1fb08p19 -0x1.37e52b834p4 0x1.5f47b2e7792b3p7 -0x1.3c198a132c6b8p5 0x1.310ep-15 F +REG epsg:27210 1 OK -0x1.a49d70494ca5cp17 0x1.e4313014d03p16 -0x1.92b38208p1 0x1.52516d89d1b1ap7 -0x1.64198a12605aep5 0x1.88bp-16 F +REG epsg:27210 2 OK 0x1.8e1c29e5e5dacp19 0x1.e4367bf612a48p16 -0x1.9e86a186p1 -0x1.63c207badf204p7 -0x1.64198a12601c8p5 0x1.bf54p-16 F +REG epsg:27210 3 OK -0x1.20addfda8022ep18 0x1.2da6b7dc2252p20 -0x1.2a8be2b54p5 0x1.52516d899ff2p7 -0x1.14198a12b34afp5 0x1.9cdap-15 F +REG epsg:27210 4 OK 0x1.b54a5bd369352p19 0x1.2da71205ba751p20 -0x1.2b616a40cp5 -0x1.63c207baadd72p7 -0x1.14198a12b3497p5 0x1.b9ep-15 F +REG epsg:27211 0 OK 0x1.24f43aa6e5687p18 0x1.55b3ee6aa88b7p19 -0x1.1016a98ap4 0x1.5ef9e83136cb9p7 -0x1.41ef81fb30715p5 0x1.20fp-15 F +REG epsg:27211 1 OK -0x1.a28ca013a563cp17 0x1.e231825743458p16 -0x1.afd4c978p-1 0x1.51e026a91ae19p7 -0x1.69ef81fa517c9p5 0x1.6e4p-16 F +REG epsg:27211 2 OK 0x1.8d981b2652c7ep19 0x1.e236d1e65ead8p16 -0x1.d2172dfp-1 -0x1.63ec5646ad0e6p7 -0x1.69ef81fa513bap5 0x1.a3ecp-16 F +REG epsg:27211 3 OK -0x1.21b4f5d20e86cp18 0x1.2d85cf299adc2p20 -0x1.15c9f212ap5 0x1.51e026a8e2ad4p7 -0x1.19ef81faa8b8bp5 0x1.8b0cp-15 F +REG epsg:27211 4 OK 0x1.b5ce09f630df5p19 0x1.2d862a2b3b65ep20 -0x1.1663d9e24p5 -0x1.63ec564675511p7 -0x1.19ef81faa8b37p5 0x1.a7bcp-15 F +REG epsg:27212 0 OK 0x1.24f448055f6e1p18 0x1.55b424a30052p19 -0x1.d64640f2p3 0x1.5f4b716a5fd38p7 -0x1.47677da7e50fep5 0x1.12dap-15 F +REG epsg:27212 1 OK -0x1.a09250c06c504p17 0x1.e04b26ba28b98p16 0x1.4fd4c864p0 0x1.520f3c2574b62p7 -0x1.6f677da6f302ap5 0x1.565p-16 F +REG epsg:27212 2 OK 0x1.8d1995d080228p19 0x1.e0507926efeap16 0x1.37e51024p0 -0x1.63785950b4cfbp7 -0x1.6f677da6f2bbcp5 0x1.8d34p-16 F +REG epsg:27212 3 OK -0x1.22b08b619dfcep18 0x1.2d662732cebeap20 -0x1.023b9793cp5 0x1.520f3c2535eaap7 -0x1.1f677da74e11cp5 0x1.7aaep-15 F +REG epsg:27212 4 OK 0x1.b64be15d4c7d7p19 0x1.2d6682f650806p20 -0x1.031583dd2p5 -0x1.6378595076809p7 -0x1.1f677da74e086p5 0x1.983ep-15 F +REG epsg:27213 0 OK 0x1.24f490a0ba427p18 0x1.55b43b7f42a6ap19 -0x1.addb676c8p3 0x1.5d8da18b5ffb1p7 -0x1.4a691a453f6eap5 0x1.094p-15 F +REG epsg:27213 1 OK -0x1.9f76c9cda17e8p17 0x1.df3c975f1a5e8p16 0x1.342cfb54p1 0x1.503df8e77cc15p7 -0x1.72691a4442435p5 0x1.491cp-16 F +REG epsg:27213 2 OK 0x1.8cd2fd6e2190ep19 0x1.df41ec25396ap16 0x1.3accd332p1 -0x1.6522b5d0bc91ap7 -0x1.72691a444202dp5 0x1.79e8p-16 F +REG epsg:27213 3 OK -0x1.233cb807f27a2p18 0x1.2d54618d00748p20 -0x1.f08571f54p4 0x1.503df8e73a21p7 -0x1.22691a449f4fp5 0x1.719cp-15 F +REG epsg:27213 4 OK 0x1.b6923fc64177bp19 0x1.2d54bdcda2b0cp20 -0x1.ef842e2cp4 -0x1.6522b5d07a61p7 -0x1.22691a449f458p5 0x1.8bfep-15 F +REG epsg:27214 0 OK 0x1.24f50a4a0a70cp18 0x1.55b3fa744b0bap19 -0x1.ee3aa18fp3 0x1.5958167a9665ap7 -0x1.45b7d3986abcep5 0x1.1206p-15 F +REG epsg:27214 1 OK -0x1.a12e08d181f26p17 0x1.e0e10bf1f4a38p16 0x1.7b6ea65p-2 0x1.4c26a10c8f4fep7 -0x1.6db7d3977eb07p5 0x1.5e54p-16 F +REG epsg:27214 2 OK 0x1.8d41461c2b2b7p19 0x1.e0e65fd89d928p16 0x1.8c49ec58p-1 0x1.66898be89da2cp7 -0x1.6db7d3977e87dp5 0x1.7ffcp-16 F +REG epsg:27214 3 OK -0x1.2261ac7f4bb2p18 0x1.2d6ff3a49e328p20 -0x1.0adae1e28p5 0x1.4c26a10c52b3p7 -0x1.1db7d397d8982p5 0x1.801p-15 F +REG epsg:27214 4 OK 0x1.b6253417dfabp19 0x1.2d704f5f11686p20 -0x1.0714fb5f6p5 0x1.66898be8d9f37p7 -0x1.1db7d397d8959p5 0x1.922ap-15 F +REG epsg:27215 0 OK 0x1.24f4f3d5f1131p18 0x1.55b42c8804b7fp19 -0x1.b16887f78p3 0x1.5a99400d66b6bp7 -0x1.4a324480c3f15p5 0x1.074p-15 F +REG epsg:27215 1 OK -0x1.9f8a49367c2f8p17 0x1.df4f84cf32b1p16 0x1.175296d4p1 0x1.4d4afd53d91c4p7 -0x1.7232447fc78f4p5 0x1.4a7cp-16 F +REG epsg:27215 2 OK 0x1.8cd8409f26b57p19 0x1.df54da9ef3118p16 0x1.3d7b9964p1 0x1.67e782c6f47ebp7 -0x1.7232447fc75ep5 0x1.70bcp-16 F +REG epsg:27215 3 OK -0x1.2332461cce82ep18 0x1.2d55a137c6684p20 -0x1.f4b2e77ap4 0x1.4d4afd5396cfdp7 -0x1.223244802477bp5 0x1.728ap-15 F +REG epsg:27215 4 OK 0x1.b68d69e46aa4p19 0x1.2d55fd89b8323p20 -0x1.ef189c1p4 0x1.67e782c736734p7 -0x1.223244802471dp5 0x1.872cp-15 F +REG epsg:27216 0 OK 0x1.24f544baaa0f7p18 0x1.55b422d1d7479p19 -0x1.b100d1cap3 0x1.5837d28b23826p7 -0x1.4a51bd227e684p5 0x1.0554p-15 F +REG epsg:27216 1 OK -0x1.9f7e05747d3eep17 0x1.df4413f66b198p16 0x1.0c31275cp1 0x1.4ae8c2760f169p7 -0x1.7251bd21818b8p5 0x1.4b38p-16 F +REG epsg:27216 2 OK 0x1.8cd580b615103p19 0x1.df496a8dcd408p16 0x1.4bbd466ep1 0x1.6586e2a038123p7 -0x1.7251bd2181663p5 0x1.68fp-16 F +REG epsg:27216 3 OK -0x1.2337bb2f47be6p18 0x1.2d54e0a74c463p20 -0x1.f6584793p4 0x1.4ae8c275ccaabp7 -0x1.2251bd21de895p5 0x1.72d2p-15 F +REG epsg:27216 4 OK 0x1.b69075349458fp19 0x1.2d553d0d4c342p20 -0x1.ed0a3a2fp4 0x1.6586e2a07a398p7 -0x1.2251bd21de863p5 0x1.82e4p-15 F +REG epsg:27217 0 OK 0x1.24f57ae0668dep18 0x1.55b4485f499ccp19 -0x1.7a16fd0bp3 0x1.57299aeb02a62p7 -0x1.4e7c8635ca465p5 0x1.f41cp-16 F +REG epsg:27217 1 OK -0x1.9defd61ffff3cp17 0x1.ddc9bc6825ff8p16 0x1.d16b0f06p1 0x1.49befa83ed93dp7 -0x1.767c8634bd45bp5 0x1.3aa4p-16 F +REG epsg:27217 2 OK 0x1.8c722bea2b966p19 0x1.ddcf153b2b56p16 0x1.0e0ac901p2 0x1.64943b5217d8fp7 -0x1.767c8634bd244p5 0x1.5494p-16 F +REG epsg:27217 3 OK -0x1.23fcb99e54beap18 0x1.2d3bd4e185762p20 -0x1.da2fd6b4p4 0x1.49befa83a5875p7 -0x1.267c86351cdd8p5 0x1.6718p-15 F +REG epsg:27217 4 OK 0x1.b6f329fc37e82p19 0x1.2d3c31e0fbd02p20 -0x1.cf3ad836p4 0x1.64943b525fa87p7 -0x1.267c86351cdafp5 0x1.752ep-15 F +REG epsg:27218 0 OK 0x1.24f58fc6369a6p18 0x1.55b4740c10b1dp19 -0x1.42a817ccp3 0x1.57197b9fe3c45p7 -0x1.52ab67e7ba316p5 0x1.df0cp-16 F +REG epsg:27218 1 OK -0x1.9c598673bd756p17 0x1.dc49d7f09683p16 0x1.4ea2d718p2 0x1.499271bc9730ap7 -0x1.7aab67e69c155p5 0x1.29bp-16 F +REG epsg:27218 2 OK 0x1.8c0cadbc06b41p19 0x1.dc4f3298008d8p16 0x1.743cb05bp2 0x1.64a0858330792p7 -0x1.7aab67e69bf2cp5 0x1.437p-16 F +REG epsg:27218 3 OK -0x1.24c5b51c6e1ap18 0x1.2d222ce811dfbp20 -0x1.bcea7c864p4 0x1.499271bc4917dp7 -0x1.2aab67e6fe0e9p5 0x1.5b16p-15 F +REG epsg:27218 4 OK 0x1.b757bc1865d74p19 0x1.2d228a7afff8p20 -0x1.b1d9473c4p4 0x1.64a085837e548p7 -0x1.2aab67e6fe0acp5 0x1.6918p-15 F +REG epsg:27219 0 OK 0x1.24f53a2025f3ep18 0x1.55b4a05d884f3p19 -0x1.1b6bf24ap3 0x1.5a0530341c70cp7 -0x1.55834f8e0f7a6p5 0x1.d48cp-16 F +REG epsg:27219 1 OK -0x1.9b421390acadp17 0x1.db42daf4c31e8p16 0x1.9e711b4bp2 0x1.4c6a66978a41p7 -0x1.7d834f8ce5385p5 0x1.1c4cp-16 F +REG epsg:27219 2 OK 0x1.8bc67bce221a6p19 0x1.db4835f89567p16 0x1.b47e6f15p2 0x1.679ff9d0aecf3p7 -0x1.7d834f8ce503dp5 0x1.409cp-16 F +REG epsg:27219 3 OK -0x1.2550894d4cae6p18 0x1.2d10740f6989bp20 -0x1.a5d63adf4p4 0x1.4c6a669737c26p7 -0x1.2d834f8d48a6p5 0x1.51ep-15 F +REG epsg:27219 4 OK 0x1.b79cd04cbf314p19 0x1.2d10d1f473c8cp20 -0x1.9f5142f34p4 0x1.679ff9d100f6dp7 -0x1.2d834f8d489c5p5 0x1.65bap-15 F +REG epsg:2722 0 OK 0x1.e84d1ccc5e1fdp18 0x1.463d235c65339p6 0x1.84b35faf8p4 0x1.68p6 0x0.0p0 0x1.542p-19 T +REG epsg:2722 1 OK -0x1.af05a0fc066fp15 -0x1.0ef4a975cae5bp19 0x1.c17ab443p3 0x1.540000001d4c5p6 -0x1.3fffffffea591p2 0x1.514p-19 F +REG epsg:2722 2 OK 0x1.019ebb739bd9ap20 -0x1.0ef4a77fcf041p19 0x1.24b9a0098p4 0x1.7bffffffe2b08p6 -0x1.3fffffffea568p2 0x1.516p-19 F +REG epsg:2722 3 OK -0x1.af03243164a8p15 0x1.0f090d1c8b187p19 0x1.c4345664p4 0x1.540000001d4bep6 0x1.3fffffffea57bp2 0x1.518p-19 F +REG epsg:2722 4 OK 0x1.019ea78ce77bp20 0x1.0f090b2669d6bp19 0x1.041849266p5 0x1.7bffffffe2b0fp6 0x1.3fffffffea54ep2 0x1.514p-19 F +REG epsg:27220 0 OK 0x1.24f4db6fcca43p18 0x1.55b446e58d9eap19 -0x1.942de82e8p3 0x1.5b9aa97539286p7 -0x1.4c5b1bd33dc98p5 0x1.0278p-15 F +REG epsg:27220 1 OK -0x1.9ebd4830409f4p17 0x1.de8c42122ace8p16 0x1.88ac85eep1 0x1.4e3e37fd088bp7 -0x1.745b1bd2392d3p5 0x1.4118p-16 F +REG epsg:27220 2 OK 0x1.8ca4e85aaa358p19 0x1.de919893b3a28p16 0x1.a41339dcp1 -0x1.6708e5129608p7 -0x1.745b1bd238f5ap5 0x1.6ae8p-16 F +REG epsg:27220 3 OK -0x1.2398243cb31e2p18 0x1.2d48bc3f37c4cp20 -0x1.e47e48b78p4 0x1.4e3e37fcc35a9p7 -0x1.245b1bd297757p5 0x1.6c06p-15 F +REG epsg:27220 4 OK 0x1.b6c040515d086p19 0x1.2d4918d62fb0ap20 -0x1.e07417214p4 -0x1.6708e51251385p7 -0x1.245b1bd2976d6p5 0x1.82bp-15 F +REG epsg:27221 0 OK 0x1.24f5c9f764ca8p18 0x1.55b49e460acf5p19 -0x1.09641ecbp3 0x1.55f5c1b541ff9p7 -0x1.5717302d80bf8p5 0x1.c828p-16 F +REG epsg:27221 1 OK -0x1.9aa41581bb078p17 0x1.daaf3263f0b9p16 0x1.b4ce9166p2 0x1.484fdb12db673p7 -0x1.7f17302c4f80dp5 0x1.1928p-16 F +REG epsg:27221 2 OK 0x1.8b9f8c98d0502p19 0x1.dab48f0364ef8p16 0x1.e05ff172p2 0x1.639ba857a8b56p7 -0x1.7f17302c4f62dp5 0x1.2edcp-16 F +REG epsg:27221 3 OK -0x1.259d797e7cf5ep18 0x1.2d0674f4a673ep20 -0x1.9f73982dp4 0x1.484fdb12867a1p7 -0x1.2f17302cb3b15p5 0x1.4f14p-15 F +REG epsg:27221 4 OK 0x1.b7c3d7e7afb8ep19 0x1.2d06d326f01fp20 -0x1.929825a3cp4 0x1.639ba857fd6dcp7 -0x1.2f17302cb3ae6p5 0x1.5afp-15 F +REG epsg:27222 0 OK 0x1.24f60238c959cp18 0x1.55b4aac73c5a4p19 -0x1.e6a1c3a7p2 0x1.548598122203p7 -0x1.58e18adc829ccp5 0x1.be64p-16 F +REG epsg:27222 1 OK -0x1.99f0578149482p17 0x1.da074f8f2d5a8p16 0x1.d97d1c6dp2 0x1.46d2f1a92e1dp7 -0x1.80e18adb494a5p5 0x1.13c8p-16 F +REG epsg:27222 2 OK 0x1.8b72d5bc85cd8p19 0x1.da0cad107d9d8p16 0x1.0650ecd1p3 0x1.62383e7b16004p7 -0x1.80e18adb4934p5 0x1.2454p-16 F +REG epsg:27222 3 OK -0x1.25f5c7e2522a8p18 0x1.2cfb0adec66b4p20 -0x1.94db93224p4 0x1.46d2f1a8d64b9p7 -0x1.30e18adbae476p5 0x1.4aeap-15 F +REG epsg:27222 4 OK 0x1.b7f0371c263b3p19 0x1.2cfb695450d9ap20 -0x1.85c094d3cp4 0x1.62383e7b6da93p7 -0x1.30e18adbae471p5 0x1.53fap-15 F +REG epsg:27223 0 OK 0x1.24f68ff824d7fp18 0x1.55b4e7ee84dc9p19 -0x1.3a284013p2 0x1.513668a0d3604p7 -0x1.5fd28a5219ccap5 0x1.9bfcp-16 F +REG epsg:27223 1 OK -0x1.972ae74926e6cp17 0x1.d774cacfdc4dp16 0x1.3739fbf98p3 0x1.4350ebab09dc8p7 -0x1.87d28a50bf5d1p5 0x1.fcd8p-17 F +REG epsg:27223 2 OK 0x1.8ac208ccc7ebp19 0x1.d77a2ad36106p16 0x1.596f6b608p3 0x1.5f1be5969cecdp7 -0x1.87d28a50bf595p5 0x1.02e8p-16 F +REG epsg:27223 3 OK -0x1.27525dff8f822p18 0x1.2ccdcab7c032p20 -0x1.698fc661cp4 0x1.4350ebaaa5f01p7 -0x1.37d28a5126c8bp5 0x1.3a54p-15 F +REG epsg:27223 4 OK 0x1.b89f0f1505614p19 0x1.2cce2a2254cb7p20 -0x1.5543d6218p4 0x1.5f1be59700cdbp7 -0x1.37d28a5126cf4p5 0x1.3cccp-15 F +REG epsg:27224 0 OK 0x1.24f56ddc78b8bp18 0x1.55b4edf262d8cp19 -0x1.7b06082dp2 0x1.597452b7a5384p7 -0x1.5cb9a0326d6a6p5 0x1.b0c4p-16 F +REG epsg:27224 1 OK -0x1.986bdcb960b1cp17 0x1.d89d49deb2c5p16 0x1.247299c3p3 0x1.4ba5ccf576ce5p7 -0x1.84b9a03122307p5 0x1.00bcp-16 F +REG epsg:27224 2 OK 0x1.8b1123414135ep19 0x1.d8a2a79c748p16 0x1.30ef4affp3 0x1.6742d879d3d0ap7 -0x1.84b9a03121fb5p5 0x1.231p-16 F +REG epsg:27224 3 OK -0x1.26b68582351ecp18 0x1.2ce2407ef1408p20 -0x1.74606eb9cp4 0x1.4ba5ccf518578p7 -0x1.34b9a03188a34p5 0x1.3dc4p-15 F +REG epsg:27224 4 OK 0x1.b850014332da1p19 0x1.2ce29f6177ea3p20 -0x1.6cf5ebedp4 0x1.6742d87a31f2fp7 -0x1.34b9a0318897cp5 0x1.50b2p-15 F +REG epsg:27225 0 OK 0x1.24f5cfaa81ad8p18 0x1.55b4ef606f373p19 -0x1.5dc15f65p2 0x1.56b8b40615072p7 -0x1.5dfd5c7bd5e5bp5 0x1.a7a8p-16 F +REG epsg:27225 1 OK -0x1.97e97fc2aa04ep17 0x1.d824ac550c9f8p16 0x1.2e352b4f8p3 0x1.48e0dc1163d24p7 -0x1.85fd5c7a848b1p5 0x1.fc1p-17 F +REG epsg:27225 2 OK 0x1.8af0ee2a2109dp19 0x1.d82a0b242e7p16 0x1.41ea05e3p3 0x1.64908bfac65e6p7 -0x1.85fd5c7a8465dp5 0x1.168p-16 F +REG epsg:27225 3 OK -0x1.26f5ff3cbd864p18 0x1.2cd9f2399b396p20 -0x1.6eba17264p4 0x1.48e0dc110326fp7 -0x1.35fd5c7aeb692p5 0x1.3b6ap-15 F +REG epsg:27225 4 OK 0x1.b8701fb1a6f8fp19 0x1.2cda51569d4bep20 -0x1.6308cfcp4 0x1.64908bfb26ccfp7 -0x1.35fd5c7aeb631p5 0x1.48f2p-15 F +REG epsg:27226 0 OK 0x1.24f5fbdc93ba5p18 0x1.55b529361f018p19 -0x1.b030ed9ap1 0x1.561d4ffb321c2p7 -0x1.6337bf4ef27aep5 0x1.8ea8p-16 F +REG epsg:27226 1 OK -0x1.95c9ab44c5268p17 0x1.d62f072336428p16 0x1.6a49df148p3 0x1.481e1d444cbafp7 -0x1.8b37bf4d86d1dp5 0x1.d6fp-17 F +REG epsg:27226 2 OK 0x1.8a69263c97132p19 0x1.d634678686ae8p16 0x1.7f8c7f948p3 0x1.641c82b2179ep7 -0x1.8b37bf4d86ae5p5 0x1.01c8p-16 F +REG epsg:27226 3 OK -0x1.2801457335e9ap18 0x1.2cb71c3f24dfep20 -0x1.4b8ccffd8p4 0x1.481e1d43e23a4p7 -0x1.3b37bf4deef26p5 0x1.2d72p-15 F +REG epsg:27226 4 OK 0x1.b8f5ee67e1a57p19 0x1.2cb77c1110357p20 -0x1.3ee3cff84p4 0x1.641c82b281e66p7 -0x1.3b37bf4deeec9p5 0x1.39d2p-15 F +REG epsg:27227 0 OK 0x1.24f6725983328p18 0x1.55b5389a9c341p19 -0x1.34b0fedap1 0x1.52ef7d98231f4p7 -0x1.65e1d42ca09e4p5 0x1.8074p-16 F +REG epsg:27227 1 OK -0x1.94aee0536997ep17 0x1.d52bfd3c047f8p16 0x1.822cda968p3 0x1.44dbb766717aep7 -0x1.8de1d42b26d4ep5 0x1.cbc8p-17 F +REG epsg:27227 2 OK 0x1.8a22ea8c582c8p19 0x1.d5315eb0de1d8p16 0x1.9fc53c82p3 0x1.610343c9d4d53p7 -0x1.8de1d42b26c4bp5 0x1.e16p-17 F +REG epsg:27227 3 OK -0x1.288b4df12c522p18 0x1.2ca4f29b29b72p20 -0x1.3d8a1a2d8p4 0x1.44dbb76601aa2p7 -0x1.3de1d42b8f4eep5 0x1.286ep-15 F +REG epsg:27227 4 OK 0x1.b93b68ccc3bf1p19 0x1.2ca552d0ee66ap20 -0x1.2be533b8cp4 0x1.610343ca448acp7 -0x1.3de1d42b8f50fp5 0x1.2e74p-15 F +REG epsg:27228 0 OK 0x1.24f6c7fd26c64p18 0x1.55b55384ff868p19 -0x1.3b93b54cp0 0x1.50cc1ab2da039p7 -0x1.69102f3ab4c6fp5 0x1.719p-16 F +REG epsg:27228 1 OK -0x1.935935605e8eep17 0x1.d3f4533e8c93p16 0x1.a1984273p3 0x1.429f4a5c88644p7 -0x1.91102f3929823p5 0x1.bc58p-17 F +REG epsg:27228 2 OK 0x1.89cdd60c529a8p19 0x1.d3f9b57cd0c5p16 0x1.c4c03e8d8p3 0x1.5ef8eb092baa1p7 -0x1.91102f39297fap5 0x1.c278p-17 F +REG epsg:27228 3 OK -0x1.293252f3d97b4p18 0x1.2c8eeddde7aebp20 -0x1.2b0489fbp4 0x1.429f4a5c11dcfp7 -0x1.41102f3992178p5 0x1.21dap-15 F +REG epsg:27228 4 OK 0x1.b98f409abda9p19 0x1.2c8f4e815597ap20 -0x1.1603ada0cp4 0x1.5ef8eb09a22a3p7 -0x1.41102f39921f8p5 0x1.238ep-15 F +REG epsg:27229 0 OK 0x1.24f7037d1cc15p18 0x1.55b5769c7fe6p19 0x1.1756edp-4 0x1.4f7a4c17479a9p7 -0x1.6c8282dd3b389p5 0x1.6244p-16 F +REG epsg:27229 1 OK -0x1.91e1a3d4935ecp17 0x1.d29f7f6925738p16 0x1.c58a706bp3 0x1.4131c2042b22ep7 -0x1.948282db9c38ap5 0x1.a9d8p-17 F +REG epsg:27229 2 OK 0x1.89702dc7e010ap19 0x1.d2a4e244e171p16 0x1.ec16b763p3 0x1.5dc2d62a64126p7 -0x1.948282db9c3e7p5 0x1.a64p-17 F +REG epsg:27229 3 OK -0x1.29e9efa41622p18 0x1.2c76a415c8e0ep20 -0x1.15b91e73cp4 0x1.4131c203acde2p7 -0x1.448282dc047eap5 0x1.1a22p-15 F +REG epsg:27229 4 OK 0x1.b9eb4a1c372d3p19 0x1.2c77052c7d6f2p20 -0x1.fd455875p3 0x1.5dc2d62ae25d3p7 -0x1.448282dc048acp5 0x1.191cp-15 F +REG epsg:2723 0 OK 0x1.e84b643cbaf5ep18 0x1.463d1fa4fd619p6 0x1.9652209acp4 0x1.7400000000001p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2723 1 OK -0x1.af13349d5bd8p15 -0x1.0ef4a65daaf1cp19 0x1.f793c9d88p3 0x1.600000001d4cep6 -0x1.3fffffffea58dp2 0x1.51p-19 F +REG epsg:2723 2 OK 0x1.019e4bc75405ep20 -0x1.0ef4a467a3e07p19 0x1.2ca613184p4 0x1.87ffffffe2b1p6 -0x1.3fffffffea56dp2 0x1.514p-19 F +REG epsg:2723 3 OK -0x1.af10b7d0ccd5p15 0x1.0f090a043026cp19 0x1.df40dd34cp4 0x1.600000001d4c7p6 0x1.3fffffffea575p2 0x1.514p-19 F +REG epsg:2723 4 OK 0x1.019e37e0b06bcp20 0x1.0f09080e03b3cp19 0x1.080e8218ep5 0x1.87ffffffe2b18p6 0x1.3fffffffea556p2 0x1.518p-19 F +REG epsg:27230 0 OK 0x1.24f64c7e3c3d3p18 0x1.55b5af01a2a89p19 0x1.138a9708p0 0x1.5541d739c6e7cp7 -0x1.6e879216ac2dbp5 0x1.5b44p-16 F +REG epsg:27230 1 OK -0x1.9104723164734p17 0x1.d1d743970f0b8p16 0x1.ea3249828p3 0x1.46e8c2464bef5p7 -0x1.96879215014d8p5 0x1.8af8p-17 F +REG epsg:27230 2 OK 0x1.89382aab68213p19 0x1.d1dca65a7737p16 0x1.00cbf2448p4 0x1.639aec2d41feep7 -0x1.96879215012abp5 0x1.b158p-17 F +REG epsg:27230 3 OK -0x1.2a57a14234ba6p18 0x1.2c684189389cfp20 -0x1.ffb46e4ap3 0x1.46e8c245c8c5fp7 -0x1.4687921569213p5 0x1.0ff2p-15 F +REG epsg:27230 4 OK 0x1.ba216bc8fd663p19 0x1.2c68a2d9ef8d5p20 -0x1.e39ae523p3 0x1.639aec2dc4f6ap7 -0x1.46879215691b6p5 0x1.1ac2p-15 F +REG epsg:27231 0 OK 0x1.24f66558aca4ap18 0x1.55b5b043da71ep19 0x1.329ff94p0 0x1.5490af851d321p7 -0x1.6ee4611de5e82p5 0x1.5934p-16 F +REG epsg:27231 1 OK -0x1.90d1f79034fdap17 0x1.d1ca2268a0e9p16 0x1.eccb845bp3 0x1.46349c70767fbp7 -0x1.96e4611c38d84p5 0x1.8a2p-17 F +REG epsg:27231 2 OK 0x1.892ba4eff03fp19 0x1.d1cf8543eb0ep16 0x1.03002b294p4 0x1.62ecc299c3ffbp7 -0x1.96e4611c38ba4p5 0x1.ab88p-17 F +REG epsg:27231 3 OK -0x1.2a6523993ccdcp18 0x1.2c645018ccb34p20 -0x1.fc9d43a58p3 0x1.46349c6ff278ep7 -0x1.46e4611ca0953p5 0x1.0f74p-15 F +REG epsg:27231 4 OK 0x1.ba2845c489f6p19 0x1.2c64b176cd673p20 -0x1.de56a6a48p3 0x1.62ecc29a47db9p7 -0x1.46e4611ca0915p5 0x1.18e4p-15 F +REG epsg:27232 0 OK 0x1.24f7ac0a07fd9p18 0x1.55b5d9874c9fbp19 0x1.acf54ef4p1 0x1.50af8ceb357b4p7 -0x1.74ccd1d6b6464p5 0x1.3eacp-16 F +REG epsg:27232 1 OK -0x1.8e40ef48e263ep17 0x1.cf5d71673011p16 0x1.12ddd76b8p4 0x1.4221ad909eeb8p7 -0x1.9cccd1d4e446p5 0x1.6fdp-17 F +REG epsg:27232 2 OK 0x1.8888aaa4443dcp19 0x1.cf62d53b847a8p16 0x1.247e8b014p4 0x1.5f3d6c45cc117p7 -0x1.9cccd1d4e441cp5 0x1.7518p-17 F +REG epsg:27232 3 OK -0x1.2baeb1dabf481p18 0x1.2c3a4377b6804p20 -0x1.b87725d4p3 0x1.4221ad900bc88p7 -0x1.4cccd1d549a99p5 0x1.03a6p-15 F +REG epsg:27232 4 OK 0x1.bace530250e2ep19 0x1.2c3aa5a033fbcp20 -0x1.8df2bf1dp3 0x1.5f3d6c465f305p7 -0x1.4cccd1d549b27p5 0x1.052p-15 F +REG epsg:2724 0 OK 0x1.e849a89764d04p18 0x1.463d1d262126ep6 0x1.a22710728p4 0x1.8000000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2724 1 OK -0x1.af20f101463bp15 -0x1.0ef4a449c53a2p19 0x1.112903be4p4 0x1.6c0000001d4d8p6 -0x1.3fffffffea584p2 0x1.51ap-19 F +REG epsg:2724 2 OK 0x1.019ddbd6449fp20 -0x1.0ef4a253b2e14p19 0x1.2ec2d1ff4p4 0x1.93ffffffe2b19p6 -0x1.3fffffffea577p2 0x1.514p-19 F +REG epsg:2724 3 OK -0x1.af1e7432bf45p15 0x1.0f0907f022d2bp19 0x1.f49ff8e2p4 0x1.6c0000001d4d1p6 0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:2724 4 OK 0x1.019dc7efb1ad2p20 0x1.0f0905f9eb168p19 0x1.091ce1648p5 0x1.93ffffffe2b21p6 0x1.3fffffffea55ep2 0x1.514p-19 F +REG epsg:2725 0 OK 0x1.e847eb13a2b4cp18 0x1.463d1be190bb3p6 0x1.a829e201cp4 0x1.8c00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2725 1 OK -0x1.af2ecc848badp15 -0x1.0ef4a33b8eebap19 0x1.20cbb7da4p4 0x1.780000001d4ep6 -0x1.3fffffffea57dp2 0x1.514p-19 F +REG epsg:2725 2 OK 0x1.019d6beef86dap20 -0x1.0ef4a145713afp19 0x1.2b0e61574p4 0x1.9fffffffe2b23p6 -0x1.3fffffffea57dp2 0x1.51p-19 F +REG epsg:2725 3 OK -0x1.af2c4fb4036cp15 0x1.0f0906e1d864fp19 0x1.022155588p5 0x1.780000001d4d8p6 0x1.3fffffffea567p2 0x1.50ep-19 F +REG epsg:2725 4 OK 0x1.019d580875fc4p20 0x1.0f0904eb954f5p19 0x1.0742a955ep5 0x1.9fffffffe2b2ap6 0x1.3fffffffea568p2 0x1.51p-19 F +REG epsg:27258 0 OK 0x1.e84502f9ff3d7p18 0x1.b993be0a3fa56p22 -0x1.23c5590e8p6 0x1.49ffffffffb92p7 -0x1.8fffffffc5551p4 0x1.4bf2p-14 F +REG epsg:27258 1 OK -0x1.fc26f90ff9eep14 0x1.96fd2bdd9e3aap22 -0x1.bb44f7e04p5 0x1.3ef75a3f3c66ep7 -0x1.dfffffffc818p4 0x1.0d0cp-14 F +REG epsg:27258 2 OK 0x1.f826d45abc177p19 0x1.96fd3f12c886cp22 -0x1.ad5133496p5 0x1.5508a5c0c2fc7p7 -0x1.dfffffffc80cdp4 0x1.0831p-14 F +REG epsg:27258 3 OK -0x1.2ff1585bd6e8p16 0x1.dac6c7270ce0ap22 -0x1.739db067ep6 0x1.3ef75a3f3c94ap7 -0x1.3fffffffc498ep4 0x1.9605p-14 F +REG epsg:27258 4 OK 0x1.07214d40c54efp20 0x1.dac6d928a256p22 -0x1.6c08f48c2p6 0x1.5508a5c0c2eeep7 -0x1.3fffffffc4624p4 0x1.9175p-14 F +REG epsg:27259 0 OK 0x1.e843766ab1136p18 0x1.b993c591f9b6ep22 -0x1.20f740b8ap6 0x1.5600000000475p7 -0x1.8fffffffc554ep4 0x1.4bf5p-14 F +REG epsg:27259 1 OK -0x1.fc3f88f6dac6p14 0x1.96fd33a568585p22 -0x1.b1cf80576p5 0x1.4af75a3f3d042p7 -0x1.dfffffffc80cbp4 0x1.0831p-14 F +REG epsg:27259 2 OK 0x1.f8260c48bad89p19 0x1.96fd46da8bfd4p22 -0x1.ac1d8aba4p5 0x1.6108a5c0c399bp7 -0x1.dfffffffc8185p4 0x1.0d11p-14 F +REG epsg:27259 3 OK -0x1.2ff779bfbbd3p16 0x1.dac6ce7134423p22 -0x1.6e7a5efbep6 0x1.4af75a3f3d11bp7 -0x1.3fffffffc461ep4 0x1.9176p-14 F +REG epsg:27259 4 OK 0x1.0720e90e2a1b6p20 0x1.dac6e072c09c8p22 -0x1.6b607465ap6 0x1.6108a5c0c36bep7 -0x1.3fffffffc4994p4 0x1.960cp-14 F +REG epsg:2726 0 OK 0x1.e8462cea0b4cfp18 0x1.463d1bd82fd4bp6 0x1.a8565d984p4 0x1.9800000000001p6 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2726 1 OK -0x1.af3cbd6e1cdap15 -0x1.0ef4a333c599dp19 0x1.2aa708d14p4 0x1.840000001d4eap6 -0x1.3fffffffea574p2 0x1.518p-19 F +REG epsg:2726 2 OK 0x1.019cfc5ff35e6p20 -0x1.0ef4a13d9c899p19 0x1.218b5a954p4 0x1.abffffffe2b2bp6 -0x1.3fffffffea582p2 0x1.51ap-19 F +REG epsg:2726 3 OK -0x1.af3a409b8b61p15 0x1.0f0906da0e7f3p19 0x1.070efd1bp5 0x1.840000001d4e2p6 0x1.3fffffffea55fp2 0x1.518p-19 F +REG epsg:2726 4 OK 0x1.019ce879813a4p20 0x1.0f0904e3c0083p19 0x1.028126a8p5 0x1.abffffffe2b33p6 0x1.3fffffffea56dp2 0x1.518p-19 F +REG epsg:27260 0 OK 0x1.e841e274df8c8p18 0x1.b993cbf6cd31p22 -0x1.2086629ccp6 0x1.6200000000d38p7 -0x1.8fffffffc579fp4 0x1.5128p-14 F +REG epsg:27260 1 OK -0x1.fc58ccea914cp14 0x1.96fd3a20579c1p22 -0x1.acd154f18p5 0x1.56f75a3f3da32p7 -0x1.dfffffffc80ddp4 0x1.089dp-14 F +REG epsg:27260 2 OK 0x1.f825419a31aa5p19 0x1.96fd4d3d62292p22 -0x1.af71277b2p5 -0x1.62f75a3f3bcecp7 -0x1.dfffffffc831cp4 0x1.1721p-14 F +REG epsg:27260 3 OK -0x1.2ffdc3bdbf2a8p16 0x1.dac6d4da8ea06p22 -0x1.6bc353687p6 0x1.56f75a3f3d905p7 -0x1.3fffffffc466fp4 0x1.91dcp-14 F +REG epsg:27260 4 OK 0x1.07208418e5789p20 0x1.dac6e6bfb4782p22 -0x1.6d2cecce7p6 -0x1.62f75a3f3c1c6p7 -0x1.3fffffffc50cep4 0x1.9f6fp-14 F +REG epsg:2727 0 OK 0x1.e8446f53a992ep18 0x1.463d1d0a0507bp6 0x1.a2ac63ffcp4 0x1.a400000000001p6 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2727 1 OK -0x1.af4ab9f5e722p15 -0x1.0ef4a4326ebb9p19 0x1.2eb40c318p4 0x1.900000001d4f2p6 -0x1.3fffffffea56cp2 0x1.518p-19 F +REG epsg:2727 2 OK 0x1.019c8d777b728p20 -0x1.0ef4a23c3a4b9p19 0x1.12406a388p4 0x1.b7ffffffe2b34p6 -0x1.3fffffffea58ap2 0x1.514p-19 F +REG epsg:2727 3 OK -0x1.af483d2145fp15 0x1.0f0907d8ca989p19 0x1.09157e7e6p5 0x1.900000001d4eap6 0x1.3fffffffea557p2 0x1.512p-19 F +REG epsg:2727 4 OK 0x1.019c7991195cbp20 0x1.0f0905e270c04p19 0x1.f5b75f32cp4 0x1.b7ffffffe2b3bp6 0x1.3fffffffea575p2 0x1.518p-19 F +REG epsg:2728 0 OK 0x1.e842b389213d2p18 0x1.463d1f7639c28p6 0x1.972fee938p4 0x1.b000000000001p6 0x0.0p0 0x1.54p-19 T +REG epsg:2728 1 OK -0x1.af58b84bb134p15 -0x1.0ef4a636d7a5fp19 0x1.2cefea5fp4 0x1.9c0000001d4fbp6 -0x1.3fffffffea565p2 0x1.518p-19 F +REG epsg:2728 2 OK 0x1.019c1f8361d16p20 -0x1.0ef4a44097de5p19 0x1.fa709639p3 0x1.c3ffffffe2b3ep6 -0x1.3fffffffea593p2 0x1.514p-19 F +REG epsg:2728 3 OK -0x1.af563b74fb3bp15 0x1.0f0909dd59f8ep19 0x1.08336db68p5 0x1.9c0000001d4f4p6 0x1.3fffffffea54fp2 0x1.51ap-19 F +REG epsg:2728 4 OK 0x1.019c0b9d0f7ffp20 0x1.0f0907e6f4c71p19 0x1.e0af432fp4 0x1.c3ffffffe2b45p6 0x1.3fffffffea57bp2 0x1.516p-19 F +REG epsg:2729 0 OK 0x1.e840fac1d36cfp18 0x1.463d231b1ae3cp6 0x1.85e90c734p4 0x1.bc00000000001p6 0x0.0p0 0x1.542p-19 T +REG epsg:2729 1 OK -0x1.af66ae9dfddp15 -0x1.0ef4a93f9609fp19 0x1.255be0958p4 0x1.a80000001d504p6 -0x1.3fffffffea562p2 0x1.516p-19 F +REG epsg:2729 2 OK 0x1.019bb2d0cc32bp20 -0x1.0ef4a7494afabp19 0x1.c5037de5p3 0x1.cfffffffe2b45p6 -0x1.3fffffffea59cp2 0x1.512p-19 F +REG epsg:2729 3 OK -0x1.af6431c52f75p15 0x1.0f090ce652361p19 0x1.046969606p5 0x1.a80000001d4fcp6 0x1.3fffffffea545p2 0x1.51ap-19 F +REG epsg:2729 4 OK 0x1.019b9eea89508p20 0x1.0f090aefe1bb2p19 0x1.c5f8baf2p4 0x1.cfffffffe2b4dp6 0x1.3fffffffea583p2 0x1.512p-19 F +REG epsg:27291 0 OK 0x1.24f3afaba2271p18 0x1.866a94df5d943p18 -0x1.540954314p4 0x1.5f00000000f1dp7 -0x1.37ffffffe885ep5 0x1.3bfap-15 F +REG epsg:27291 1 OK -0x1.0233466bd8e54p18 -0x1.c068accb63492p17 -0x1.332bd819p2 0x1.5221e540553adp7 -0x1.5fffffff28dbep5 0x1.9bap-16 F +REG epsg:27291 2 OK 0x1.a60e1a46d90cfp19 -0x1.c065c8c48147ap17 -0x1.3794b179p2 -0x1.6421e540531e8p7 -0x1.5fffffff28a1bp5 0x1.d134p-16 F +REG epsg:27291 3 OK -0x1.565a98d0b19d2p18 0x1.e17df9a46840cp19 -0x1.39608da54p5 0x1.5221e54027b47p7 -0x1.0fffffff78afcp5 0x1.a96cp-15 F +REG epsg:27291 4 OK 0x1.d02042070bf8ap19 0x1.e17ebd95c6212p19 -0x1.39fe0df24p5 -0x1.6421e540260abp7 -0x1.0fffffff78b13p5 0x1.c5bcp-15 F +REG epsg:27292 0 OK 0x1.e8459af976d4ep18 0x1.e815c2dfe9446p18 -0x1.2964dfc2p2 0x1.57000000007f6p7 -0x1.5fffffffec1a3p5 0x1.9e8p-16 F +REG epsg:27292 1 OK -0x1.b5c2a9d081898p15 -0x1.04da5b90bc92ap17 0x1.46730bcc8p3 0x1.49192e64099adp7 -0x1.87fffffe90d85p5 0x1.ecap-17 F +REG epsg:27292 2 OK 0x1.01d14b320ae03p20 -0x1.04d76b84221f2p17 0x1.596716868p3 0x1.64e6d19bf7882p7 -0x1.87fffffe90b05p5 0x1.0fdp-16 F +REG epsg:27292 3 OK -0x1.363f8548f509ep17 0x1.0821d0343752dp20 -0x1.608da27f8p4 0x1.49192e63a53fdp7 -0x1.37fffffef8488p5 0x1.35bap-15 F +REG epsg:27292 4 OK 0x1.1aea5e03ec59cp20 0x1.0822388271a1dp20 -0x1.554a26928p4 0x1.64e6d19c5ba38p7 -0x1.37fffffef8413p5 0x1.43d6p-15 F +REG epsg:2730 0 OK 0x1.e83f4633043c7p18 0x1.463d27f619eb6p6 0x1.6ee3dcdf4p4 0x1.c800000000001p6 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2730 1 OK -0x1.af749320ee38p15 -0x1.0ef4ad4a88f2ap19 0x1.17fd4008p4 0x1.b40000001d50ep6 -0x1.3fffffffea558p2 0x1.516p-19 F +REG epsg:2730 2 OK 0x1.019b47abfec4ap20 -0x1.0ef4ab5432b3ep19 0x1.845f07cap3 0x1.dbffffffe2b4ep6 -0x1.3fffffffea5a5p2 0x1.512p-19 F +REG epsg:2730 3 OK -0x1.af721646055dp15 0x1.0f0910f19232ep19 0x1.fb74342a8p4 0x1.b40000001d506p6 0x1.3fffffffea541p2 0x1.514p-19 F +REG epsg:2730 4 OK 0x1.019b33c5caf1cp20 0x1.0f090efb1686cp19 0x1.a5a684a58p4 0x1.dbffffffe2b55p6 0x1.3fffffffea58bp2 0x1.50cp-19 F +REG epsg:2731 0 OK 0x1.e83d970f01d21p18 0x1.463d2e03cec63p6 0x1.523086b44p4 0x1.d400000000002p6 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2731 1 OK -0x1.af825c15223ap15 -0x1.0ef4b254da438p19 0x1.04dd6a258p4 0x1.c00000001d516p6 -0x1.3fffffffea54fp2 0x1.516p-19 F +REG epsg:2731 2 OK 0x1.019ade6026a62p20 -0x1.0ef4b05e78f52p19 0x1.38b08eecp3 0x1.e7ffffffe2b58p6 -0x1.3fffffffea5a9p2 0x1.518p-19 F +REG epsg:2731 3 OK -0x1.af7fdf381e36p15 0x1.0f0915fc439cap19 0x1.e85461184p4 0x1.c00000001d50ep6 0x1.3fffffffea53ap2 0x1.51ap-19 F +REG epsg:2731 4 OK 0x1.019aca7a01782p20 0x1.0f091405bcdf4p19 0x1.7fcf4dc68p4 0x1.e7ffffffe2b5fp6 0x1.3fffffffea593p2 0x1.512p-19 F +REG epsg:2732 0 OK 0x1.e83bee844d6fcp18 0x1.463d353ffa309p6 0x1.2fe32d1bcp4 0x1.e000000000001p6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2732 1 OK -0x1.af8fffce8e37p15 -0x1.0ef4b85b00b57p19 0x1.d813940c8p3 0x1.cc0000001d521p6 -0x1.3fffffffea549p2 0x1.51cp-19 F +REG epsg:2732 2 OK 0x1.019a7737252abp20 -0x1.0ef4b664947f6p19 0x1.c45a5a3ep2 0x1.f3ffffffe2b6p6 -0x1.3fffffffea5b2p2 0x1.50ep-19 F +REG epsg:2732 3 OK -0x1.af8d82ef6fdep15 0x1.0f091c02dce88p19 0x1.cf80c49fp4 0x1.cc0000001d518p6 0x1.3fffffffea53p2 0x1.51ep-19 F +REG epsg:2732 4 OK 0x1.019a63510e2cbp20 0x1.0f091a0c4b41dp19 0x1.548da33c8p4 0x1.f3ffffffe2b68p6 0x1.3fffffffea599p2 0x1.50ap-19 F +REG epsg:2733 0 OK 0x1.e83a4dbcc74ffp18 0x1.463d3da588b23p6 0x1.0813e164cp4 0x1.ebfffffffffffp6 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2733 1 OK -0x1.af9d74bb448p15 -0x1.0ef4bf58c251fp19 0x1.9b2795f9p3 0x1.d80000001d529p6 -0x1.3fffffffea545p2 0x1.512p-19 F +REG epsg:2733 2 OK 0x1.019a12795c07p20 -0x1.0ef4bd624b633p19 0x1.02232bb2p2 0x1.ffffffffe2b67p6 -0x1.3fffffffea5b4p2 0x1.50ep-19 F +REG epsg:2733 3 OK -0x1.af9af7da0e2p15 0x1.0f09230123cfbp19 0x1.b10aca108p4 0x1.d80000001d522p6 0x1.3fffffffea52ap2 0x1.51ap-19 F +REG epsg:2733 4 OK 0x1.0199fe9352ba6p20 0x1.0f09210a876efp19 0x1.23ffdebdcp4 0x1.ffffffffe2b6cp6 0x1.3fffffffea5a1p2 0x1.51p-19 F +REG epsg:2734 0 OK 0x1.e838b5dcdda8dp18 0x1.463d472e962c6p6 0x1.b5bd245p3 0x1.f7ffffffffffep6 0x1.c72f1eacb6e8p-62 0x1.546p-19 T +REG epsg:2734 1 OK -0x1.afaab16a2bb4p15 -0x1.0ef4c74937691p19 0x1.532198ce8p3 0x1.e40000001d53p6 -0x1.3fffffffea53bp2 0x1.518p-19 F +REG epsg:2734 2 OK 0x1.0199b06d7a8d3p20 -0x1.0ef4c552b5f93p19 0x1.5a1eb8fp-1 0x1.05fffffff15b6p7 -0x1.3fffffffea5bcp2 0x1.518p-19 F +REG epsg:2734 3 OK -0x1.afa83486e111p15 0x1.0f092af23044dp19 0x1.8d07d0c7p4 0x1.e40000001d529p6 0x1.3fffffffea523p2 0x1.52p-19 F +REG epsg:2734 4 OK 0x1.01999c877e699p20 0x1.0f0928fb89614p19 0x1.dc9022fc8p3 0x1.05fffffff15bbp7 0x1.3fffffffea5a7p2 0x1.514p-19 F +REG epsg:2735 0 OK 0x1.e8372802bf77bp18 0x1.463d51d471fc3p6 0x1.50c5ef54p3 0x1.02p7 0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2735 1 OK -0x1.afb7ac919e69p15 -0x1.0ef4d026ce03dp19 0x1.0034254cp3 0x1.f00000001d537p6 -0x1.3fffffffea536p2 0x1.51ap-19 F +REG epsg:2735 2 OK 0x1.019951584c107p20 -0x1.0ef4ce3042511p19 -0x1.7f59c062p1 0x1.0bfffffff15bcp7 -0x1.3fffffffea5c5p2 0x1.50ep-19 F +REG epsg:2735 3 OK -0x1.afb52fac44bep15 0x1.0f0933d06fe69p19 0x1.63911d1e4p4 0x1.f00000001d52fp6 0x1.3fffffffea51fp2 0x1.518p-19 F +REG epsg:2735 4 OK 0x1.01993d725c844p20 0x1.0f0931d9bebe9p19 0x1.6717d89cp3 0x1.0bfffffff15bfp7 0x1.3fffffffea5acp2 0x1.514p-19 F +REG epsg:2736 0 OK 0x1.e85211e9dd89cp18 0x1.b99b58d7d2596p22 -0x1.a6cd8cfbp3 0x1.0800000000001p5 -0x1.9000000000003p4 0x1.0p-30 F +REG epsg:2736 1 OK -0x1.fb4a4a700026p14 0x1.9704ef37b2183p22 -0x1.6a46a19d4p4 0x1.b7bad1f9ea348p4 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:2736 2 OK 0x1.f82c6449b5e94p19 0x1.9704ef378daf8p22 -0x1.fdd5ec0dp3 0x1.342297030ae5cp5 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:2736 3 OK -0x1.2fb06aa3be2d8p16 0x1.dace4d4c677f9p22 -0x1.3262659fp3 0x1.b7bad1f9ea34ap4 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:2736 4 OK 0x1.07240fa6f139ap20 0x1.dace4d4c44db4p22 -0x1.259caa92p1 0x1.342297030ae5dp5 -0x1.4000000000002p4 0x1.0p-30 F +REG epsg:2737 0 OK 0x1.e84ed6ea75116p18 0x1.b99b5ed5d05dcp22 -0x1.3ff58a498p3 0x1.37fffffffffffp5 -0x1.8fffffffffffep4 -0x1.8p-29 F +REG epsg:2737 1 OK -0x1.fb7cf4526b72p14 0x1.9704f65b439eap22 -0x1.28259caecp4 0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:2737 2 OK 0x1.f82abe956dc8fp19 0x1.9704f65b2ae38p22 -0x1.be75784ep3 0x1.642297030ae5dp5 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:2737 3 OK -0x1.2fbd09660054p16 0x1.dace52300be69p22 -0x1.45c05539p2 0x1.0bdd68fcf51a2p5 -0x1.4000000000002p4 0x1.0p-29 F +REG epsg:2737 4 OK 0x1.07233c10e19d7p20 0x1.dace522ff45eep22 -0x1.28a385cp-3 0x1.642297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2738 0 OK 0x1.e835a54593c5fp18 0x1.463d5d8fa3ab6p6 0x1.c311f688p2 0x1.08p7 0x0.0p0 0x1.546p-19 T +REG epsg:2738 1 OK -0x1.afc45d15ef5p15 -0x1.0ef4d9eb4dca5p19 0x1.4532d5adp2 0x1.fc0000001d543p6 -0x1.3fffffffea52cp2 0x1.516p-19 F +REG epsg:2738 2 OK 0x1.0198f57c87a05p20 -0x1.0ef4d7f4b81a6p19 -0x1.be0a2232p2 0x1.11fffffff15bfp7 -0x1.3fffffffea5cap2 0x1.50ep-19 F +REG epsg:2738 3 OK -0x1.afc1e02e8d49p15 0x1.0f093d95a9e65p19 0x1.34c3c6c6p4 0x1.fc0000001d538p6 0x1.3fffffffea515p2 0x1.51ap-19 F +REG epsg:2738 4 OK 0x1.0198e196a4112p20 0x1.0f093b9eeebfbp19 0x1.cfd2949dp2 0x1.11fffffff15c3p7 0x1.3fffffffea5b2p2 0x1.50cp-19 F +REG epsg:2739 0 OK 0x1.e8342eb4b5d8ep18 0x1.463d6a57f02eap6 0x1.a15152bcp1 0x1.0ep7 0x0.0p0 0x1.544p-19 T +REG epsg:2739 1 OK -0x1.afd0ba0fcd39p15 -0x1.0ef4e48fdc621p19 0x1.d498b4e8p0 0x1.040000000eaa4p7 -0x1.3fffffffea528p2 0x1.51cp-19 F +REG epsg:2739 2 OK 0x1.01989d1aa1438p20 -0x1.0ef4e2993d018p19 -0x1.6790baefp3 0x1.17fffffff15c2p7 -0x1.3fffffffea5cbp2 0x1.512p-19 F +REG epsg:2739 3 OK -0x1.afce3d266af1p15 0x1.0f09483b03671p19 0x1.00c0a44dcp4 0x1.040000000eaap7 0x1.3fffffffea512p2 0x1.514p-19 F +REG epsg:2739 4 OK 0x1.01988934c90e9p20 0x1.0f0946443e8e7p19 0x1.7d76d238p1 0x1.17fffffff15c6p7 0x1.3fffffffea5b6p2 0x1.516p-19 F +REG epsg:27391 0 OK -0x1.34aed390595b1p19 0x1.89217808320c1p15 0x1.93dc075p3 -0x1.2aaaa590fa021p2 0x1.cfffffefb18cep5 0x1.fd27c6p-7 F +REG epsg:27391 1 OK -0x1.48577f687fc43p20 -0x1.63cf3c36d7c22p18 0x1.1e1053268p5 -0x1.c341157926031p3 0x1.a8000840e7e01p5 0x1.0d63edp-6 F +REG epsg:27391 2 OK -0x1.50a8803c823d6p16 -0x1.0f78d8e4f2ea5p19 0x1.97c17faep3 0x1.3132eb8157cd8p2 0x1.a7fffffefd8dep5 0x1.02ecc2p-6 F +REG epsg:27391 3 OK -0x1.ec777a97f7ac5p19 0x1.5e517bf62de3fp19 0x1.21f6cd4ep4 -0x1.c340050f44032p3 0x1.f800084b2bc11p5 0x1.ffbb68p-7 F +REG epsg:27391 4 OK -0x1.fbc25c3732fbcp15 0x1.104b56a02a6d9p19 0x1.79db07c8p-1 0x1.3132eb7daf7ep2 0x1.f7fffffbd1bd4p5 0x1.eceb66p-7 F +REG epsg:27392 0 OK -0x1.34ad80e515726p19 0x1.8911aa1ffe091p15 0x1.47112e608p3 -0x1.2aaaa07a34012p1 0x1.cfffffefb6229p5 0x1.fd4fbp-7 F +REG epsg:27392 1 OK -0x1.4856d859aec19p20 -0x1.63d13eb3aaaa8p18 0x1.ffa8122ecp4 -0x1.78966ae01086fp3 0x1.a8000840d3ea2p5 0x1.0cdb34p-6 F +REG epsg:27392 2 OK -0x1.509dbea91107dp16 -0x1.0f79d87fb8a89p19 0x1.64c2d7b7p3 0x1.c68840d63e517p2 0x1.a7fffffef53b6p5 0x1.02e009p-6 F +REG epsg:27392 3 OK -0x1.ec762b5c8c1b1p19 0x1.5e5082d2725c5p19 0x1.e89b1de7p3 -0x1.78955a84d2434p3 0x1.f800084b0477ep5 0x1.ff2434p-7 F +REG epsg:27392 4 OK -0x1.fbad0ce6e0d56p15 0x1.104a5e367e3bbp19 -0x1.de278ep-2 0x1.c68840d0a8234p2 0x1.f7fffffbce202p5 0x1.ec9908p-7 F +REG epsg:27393 0 OK -0x1.34ac35a1e183ap19 0x1.89011c5cfb713p15 0x1.01fc7c47p3 0x1.45b2e73d87261p-20 0x1.cfffffefb82bbp5 0x1.fd5ec8p-7 F +REG epsg:27393 1 OK -0x1.4856345094bd9p20 -0x1.63d35a5099ae5p18 0x1.c73a975b8p4 -0x1.2debc046d6c3p3 0x1.a8000840bcc93p5 0x1.0c46b8p-6 F +REG epsg:27393 2 OK -0x1.509337cad8a4p16 -0x1.0f7ae2a636602p19 0x1.3af55dc28p3 0x1.2deecb158bfdfp3 0x1.a7fffffee9848p5 0x1.02cd48p-6 F +REG epsg:27393 3 OK -0x1.ec74e4039bcb7p19 0x1.5e4f7c9ada6b1p19 0x1.93621f958p3 -0x1.2deaaffa0cfa9p3 0x1.f800084adc2a1p5 0x1.fe60a2p-7 F +REG epsg:27393 4 OK -0x1.fb9846ce59ac8p15 0x1.104959e20de3cp19 -0x1.7487247cp0 0x1.2deecb11cb274p3 0x1.f7fffffbc911dp5 0x1.ec237ep-7 F +REG epsg:27394 0 OK -0x1.34aadb8d105d1p19 0x1.88ee92fe9cd7dp15 0x1.81511b7ep2 0x1.40000a2a8684bp1 0x1.cfffffefb78p5 0x1.fd539ap-7 F +REG epsg:27394 1 OK -0x1.48558839a6164p20 -0x1.63d5b755f1976p18 0x1.8f5d1db4cp4 -0x1.bbd780b2b0c2bp2 0x1.a8000840a06a1p5 0x1.0b9c23p-6 F +REG epsg:27394 2 OK -0x1.508836a82aa8cp16 -0x1.0f7c0b02daf23p19 0x1.1872e3dap3 0x1.7deecb15402e5p3 0x1.a7fffffed94f7p5 0x1.02b19dp-6 F +REG epsg:27394 3 OK -0x1.ec738ea6991d5p19 0x1.5e4e55a3e8ca5p19 0x1.3f009add8p3 -0x1.bbd56037a006fp2 0x1.f800084aafd42p5 0x1.fd5fa6p-7 F +REG epsg:27394 4 OK -0x1.fb82a7218ba7ap15 0x1.104836398af25p19 -0x1.22c6745ep1 0x1.7deecb1079d19p3 0x1.f7fffffbc222p5 0x1.eb7dcp-7 F +REG epsg:27395 0 OK -0x1.34a8f1dba1d2cp19 0x1.88d1f64e7b71p15 0x1.c56727b6p1 0x1.8aaaafbda74d4p2 0x1.cfffffefb1384p5 0x1.fd0fb2p-7 F +REG epsg:27395 1 OK -0x1.48549359c80dbp20 -0x1.63d95e9822953p18 0x1.463d11aacp4 -0x1.a259ac7b1125fp1 0x1.a80008406ffecp5 0x1.0a8f16p-6 F +REG epsg:27395 2 OK -0x1.5078a1380a6d6p16 -0x1.0f7dd178f47f6p19 0x1.f2657abcp2 0x1.f344206a0f42dp3 0x1.a7fffffebb05dp5 0x1.027856p-6 F +REG epsg:27395 3 OK -0x1.ec71acd67beb6p19 0x1.5e4c8bf402681p19 0x1.a1120951p2 -0x1.a2556bdc76479p1 0x1.f800084a6ca62p5 0x1.fb9146p-7 F +REG epsg:27395 4 OK -0x1.fb643554bdf19p15 0x1.104673c6d01dbp19 -0x1.819f85aep1 0x1.f3442063cdad9p3 0x1.f7fffffbb55c9p5 0x1.ea3dd6p-7 F +REG epsg:27396 0 OK -0x1.34a6f604ba9a8p19 0x1.88b0f0c0902d1p15 0x1.8c6eb238p0 0x1.455557dd88d6bp3 0x1.cfffffefa35f2p5 0x1.fc7d32p-7 F +REG epsg:27396 1 OK -0x1.48539378bac85p20 -0x1.63dd97c5f04p18 0x1.02b9c97ep4 0x1.76994c4a68927p-1 0x1.a800084031f3fp5 0x1.095349p-6 F +REG epsg:27396 2 OK -0x1.5068735314c94p16 -0x1.0f7fda20931d1p19 0x1.e2fcabf9p2 0x1.39a21034aad5ep4 0x1.a7fffffe91cecp5 0x1.021e0bp-6 F +REG epsg:27396 3 OK -0x1.ec6fbadce8c1cp19 0x1.5e4a78a43bcaap19 0x1.aa16c21ap1 0x1.76aa4d531a8ep-1 0x1.f800084a208fep5 0x1.f9296p-7 F +REG epsg:27396 4 OK -0x1.fb44d98249664p15 0x1.10446b920be14p19 -0x1.9976181cp1 0x1.39a21030bef63p4 0x1.f7fffffba4685p5 0x1.e873dep-7 F +REG epsg:27397 0 OK -0x1.34a518197d767p19 0x1.888e302c3023ep15 0x1.3881c99p-2 0x1.c55557dc27094p3 0x1.cfffffef8ea35p5 0x1.fb99fep-7 F +REG epsg:27397 1 OK -0x1.4852a08caaea3p20 -0x1.63e20b5e7df9dp18 0x1.98a632558p3 0x1.2ed329519402cp2 0x1.a800083fea81ep5 0x1.080274p-6 F +REG epsg:27397 2 OK -0x1.505934634cc94p16 -0x1.0f81fa460c9e5p19 0x1.055b4d248p3 0x1.79a21034355f9p4 0x1.a7fffffe610a1p5 0x1.019f2cp-6 F +REG epsg:27397 3 OK -0x1.ec6de815b96b9p19 0x1.5e484670f4e5ap19 0x1.84a948d8p-1 0x1.2ed549464269p2 0x1.f8000849d1da6p5 0x1.f650ecp-7 F +REG epsg:27397 4 OK -0x1.fb2792ccbcbep15 0x1.104247c5526e1p19 -0x1.5e19ab9ap1 0x1.79a2102f834eep4 0x1.f7fffffb9109fp5 0x1.e63142p-7 F +REG epsg:27398 0 OK -0x1.34a34897b95fep19 0x1.8868548f0303dp15 -0x1.7c55132p-3 0x1.25555697f4d46p4 0x1.cfffffef7266ap5 0x1.fa4ef6p-7 F +REG epsg:27398 1 OK -0x1.4851b28f16f58p20 -0x1.63e6e693ebaafp18 0x1.43c4c9d98p3 0x1.1cbee9e1f6bf4p3 0x1.a800083f96973p5 0x1.068db5p-6 F +REG epsg:27398 2 OK -0x1.504a656ac1563p16 -0x1.0f844736a3f5fp19 0x1.37419d508p3 0x1.bc4cbade476aap4 0x1.a7fffffe277e4p5 0x1.00ea3fp-6 F +REG epsg:27398 3 OK -0x1.ec6c257b44a15p19 0x1.5e45deecb1ec2p19 -0x1.3f31dc94p0 0x1.1cbff9c6413d2p3 0x1.f80008497d983p5 0x1.f2e4c2p-7 F +REG epsg:27398 4 OK -0x1.fb0b720b5307dp15 0x1.103ff2aed247fp19 -0x1.9038cd94p0 0x1.bc4cbad8cd25p4 0x1.f7fffffb7b438p5 0x1.e34d5ap-7 F +REG epsg:2740 0 OK 0x1.e832c556f6bd8p18 0x1.463d78245faa4p6 -0x1.a82f96e8p-1 0x1.13fffffffffffp7 -0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2740 1 OK -0x1.afdcbad281bp15 -0x1.0ef4f00d023b9p19 -0x1.bcaed408p0 0x1.0a0000000eaa7p7 -0x1.3fffffffea521p2 0x1.51cp-19 F +REG epsg:2740 2 OK 0x1.019848709cb7fp20 -0x1.0ef4ee16597e2p19 -0x1.f9199f308p3 0x1.1dfffffff15c7p7 -0x1.3fffffffea5d5p2 0x1.51p-19 F +REG epsg:2740 3 OK -0x1.afda3de728a7p15 0x1.0f0953b9044bp19 0x1.8f586848p3 0x1.0a0000000eaa3p7 0x1.3fffffffea50cp2 0x1.518p-19 F +REG epsg:2740 4 OK 0x1.0198348acf327p20 0x1.0f0951c23613fp19 -0x1.9158d26cp0 0x1.1dfffffff15cap7 0x1.3fffffffea5bcp2 0x1.512p-19 F +REG epsg:2741 0 OK 0x1.e8316a29e4fe3p18 0x1.463d86eb43bcep6 -0x1.4d4242bp2 0x1.1ap7 0x0.0p0 0x1.54p-19 T +REG epsg:2741 1 OK -0x1.afe856f20731p15 -0x1.0ef4fc5aafcf4p19 -0x1.67229e2dp2 0x1.100000000eaabp7 -0x1.3fffffffea51ap2 0x1.52p-19 F +REG epsg:2741 2 OK 0x1.0197f7b9e1ee4p20 -0x1.0ef4fa63fe0f3p19 -0x1.499cd05f8p4 0x1.23fffffff15c9p7 -0x1.3fffffffea5dap2 0x1.50ep-19 F +REG epsg:2741 3 OK -0x1.afe5da04c248p15 0x1.0f0960079c70bp19 0x1.135d05ed8p3 0x1.100000000eaa8p7 0x1.3fffffffea501p2 0x1.51ep-19 F +REG epsg:2741 4 OK 0x1.0197e3d41e65fp20 0x1.0f095e10c535dp19 -0x1.98960a64p2 0x1.23fffffff15cdp7 0x1.3fffffffea5c2p2 0x1.50ep-19 F +REG epsg:2742 0 OK 0x1.e8301e211a9edp18 0x1.463d96a23e499p6 -0x1.3ba3d2f68p3 0x1.2p7 0x0.0p0 0x1.542p-19 T +REG epsg:2742 1 OK -0x1.aff38648f1e8p15 -0x1.0ef5097043456p19 -0x1.3908496c8p3 0x1.160000000eaaep7 -0x1.3fffffffea516p2 0x1.51cp-19 F +REG epsg:2742 2 OK 0x1.0197ab2f13642p20 -0x1.0ef5077988e2ep19 -0x1.9ac24db6p4 0x1.29fffffff15cbp7 -0x1.3fffffffea5e1p2 0x1.51p-19 F +REG epsg:2742 3 OK -0x1.aff10959cd5bp15 0x1.0f096d1e295cp19 0x1.1bcc3e6fp2 0x1.160000000eaabp7 0x1.3fffffffea4fdp2 0x1.51ap-19 F +REG epsg:2742 4 OK 0x1.01979749591fcp20 0x1.0f096b27497d7p19 -0x1.6e95e8018p3 0x1.29fffffff15dp7 0x1.3fffffffea5c6p2 0x1.50ep-19 F +REG epsg:27429 0 OK 0x1.e835875cac7b6p18 -0x1.2513494cb9ab1p5 -0x1.a8bb9a1a8p3 -0x1.2000000000002p3 0x0.0p0 0x1.0p-30 T +REG epsg:27429 1 OK -0x1.ae0a9b1f1debp15 -0x1.0ee81482faf5dp19 -0x1.31a17669p2 -0x1.c000000000003p3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:27429 2 OK 0x1.018b187811ab6p20 -0x1.0ee8148281e47p19 -0x1.19c2f1504p4 -0x1.0p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:27429 3 OK -0x1.ae0bb932c288p15 0x1.0edeebfc4d5d7p19 -0x1.653d8468p3 -0x1.cp3 0x1.4p2 0x0.0p0 F +REG epsg:27429 4 OK 0x1.018b2168139bep20 0x1.0edeebfbd4543p19 -0x1.7ff9637cp4 -0x1.0p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2743 0 OK 0x1.e82ee225924bbp18 0x1.463da73e48be3p6 -0x1.d92280d7p3 0x1.26p7 -0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2743 1 OK -0x1.affe40fe2695p15 -0x1.0ef517448e83p19 -0x1.c79d2479p3 0x1.1c0000000eab2p7 -0x1.3fffffffea50ep2 0x1.51cp-19 F +REG epsg:2743 2 OK 0x1.01976305e6612p20 -0x1.0ef5154dcbe4cp19 -0x1.efc457ed4p4 0x1.2ffffffff15dp7 -0x1.3fffffffea5e4p2 0x1.50ep-19 F +REG epsg:2743 3 OK -0x1.affbc40d2fefp15 0x1.0f097af37c42ep19 -0x1.5d4dbap-6 0x1.1c0000000eaaep7 0x1.3fffffffea4f5p2 0x1.51cp-19 F +REG epsg:2743 4 OK 0x1.01974f2034a0dp20 0x1.0f0978fc94278p19 -0x1.0c4cf1b84p4 0x1.2ffffffff15d3p7 0x1.3fffffffea5cdp2 0x1.50ap-19 F +REG epsg:2744 0 OK 0x1.e82db71503d72p18 0x1.463db8b3bbce8p6 -0x1.3f5754becp4 0x1.2c00000000001p7 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2744 1 OK -0x1.b0087f8a5c88p15 -0x1.0ef525cddd9b5p19 -0x1.2f75eacd4p4 0x1.220000000eab6p7 -0x1.3fffffffea507p2 0x1.518p-19 F +REG epsg:2744 2 OK 0x1.01971f70fd44ep20 -0x1.0ef523d7132dbp19 -0x1.2433a4d72p5 0x1.35fffffff15d2p7 -0x1.3fffffffea5ecp2 0x1.50cp-19 F +REG epsg:2744 3 OK -0x1.b0060297a299p15 0x1.0f09897de07f9p19 -0x1.2ffa837cp2 0x1.220000000eab2p7 0x1.3fffffffea4fp2 0x1.51ap-19 F +REG epsg:2744 4 OK 0x1.01970b8b5342ep20 0x1.0f098786f0939p19 -0x1.64efd6704p4 0x1.35fffffff15d5p7 0x1.3fffffffea5d1p2 0x1.51p-19 F +REG epsg:2745 0 OK 0x1.e82c9dc1489ap18 0x1.463dcaf657a0ap6 -0x1.95ea1277p4 0x1.32p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2745 1 OK -0x1.b0123abd6595p15 -0x1.0ef53501fd9d7p19 -0x1.7f451961cp4 0x1.280000000eab7p7 -0x1.3fffffffea503p2 0x1.51cp-19 F +REG epsg:2745 2 OK 0x1.0196e09fc406p20 -0x1.0ef5330b2bd1fp19 -0x1.523678eacp5 0x1.3bfffffff15d4p7 -0x1.3fffffffea5ecp2 0x1.51p-19 F +REG epsg:2745 3 OK -0x1.b00fbdc8f86fp15 0x1.0f0998b3225ebp19 -0x1.379b876e8p3 0x1.280000000eab4p7 0x1.3fffffffea4edp2 0x1.51ap-19 F +REG epsg:2745 4 OK 0x1.0196ccba20f74p20 0x1.0f0996bc2b14p19 -0x1.c0f5711p4 0x1.3bfffffff15d8p7 0x1.3fffffffea5d6p2 0x1.50cp-19 F +REG epsg:2746 0 OK 0x1.e82b96efc853cp18 0x1.463dddf94c64fp6 -0x1.f00cbb13p4 0x1.38p7 0x0.0p0 0x1.542p-19 T +REG epsg:2746 1 OK -0x1.b01b6bc3396dp15 -0x1.0ef544d643bbcp19 -0x1.d3041e7cp4 0x1.2e0000000eabcp7 -0x1.3fffffffea4fdp2 0x1.522p-19 F +REG epsg:2746 2 OK 0x1.0196a6be4ee82p20 -0x1.0ef542df6b09bp19 -0x1.81ca5f886p5 0x1.41fffffff15d7p7 -0x1.3fffffffea5f4p2 0x1.51p-19 F +REG epsg:2746 3 OK -0x1.b018eecd2a4ep15 0x1.0f09a88896477p19 -0x1.df1979028p3 0x1.2e0000000eab8p7 0x1.3fffffffea4e6p2 0x1.522p-19 F +REG epsg:2746 4 OK 0x1.019692d8b1fc6p20 0x1.0f09a6919814ep19 -0x1.100e98262p5 0x1.41fffffff15dbp7 0x1.3fffffffea5d8p2 0x1.512p-19 F +REG epsg:2747 0 OK 0x1.e82aa358ee7bbp18 0x1.463df1af4352fp6 -0x1.26c008184p5 0x1.3ep7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2747 1 OK -0x1.b0240c28c053p15 -0x1.0ef5553f94c81p19 -0x1.153c1bb7ep5 0x1.340000000eabfp7 -0x1.3fffffffea4f9p2 0x1.52p-19 F +REG epsg:2747 2 OK 0x1.019671f53b872p20 -0x1.0ef55348b5ab2p19 -0x1.b2cdf6984p5 0x1.47fffffff15d9p7 -0x1.3fffffffea5f5p2 0x1.50cp-19 F +REG epsg:2747 3 OK -0x1.b0218f3121a2p15 0x1.0f09b8f320378p19 -0x1.4700c899p4 0x1.340000000eabbp7 0x1.3fffffffea4e3p2 0x1.51ap-19 F +REG epsg:2747 4 OK 0x1.01965e0fa3ea2p20 0x1.0f09b6fc1b993p19 -0x1.41122801p5 0x1.47fffffff15ddp7 0x1.3fffffffea5ddp2 0x1.50ep-19 F +REG epsg:2748 0 OK 0x1.e829c3a7a8f63p18 0x1.463e060a68044p6 -0x1.57013ff34p5 0x1.44p7 0x1.2f74bf1dcf455p-63 0x1.544p-19 T +REG epsg:2748 1 OK -0x1.b02c15e0598dp15 -0x1.0ef566326cfd8p19 -0x1.42b203cdp5 0x1.3a0000000eacp7 -0x1.3fffffffea4fbp2 0x1.516p-19 F +REG epsg:2748 2 OK 0x1.0196426994605p20 -0x1.0ef5643b87f58p19 -0x1.e51ed9fcap5 0x1.4dfffffff15dbp7 -0x1.3fffffffea5f8p2 0x1.50cp-19 F +REG epsg:2748 3 OK -0x1.b02998e73ec5p15 0x1.0f09c9e73b8eap19 -0x1.a1ec8b63cp4 0x1.3a0000000eabdp7 0x1.3fffffffea4e1p2 0x1.51ap-19 F +REG epsg:2748 4 OK 0x1.01962e840139dp20 0x1.0f09c7f031049p19 -0x1.736303ff4p5 0x1.4dfffffff15dep7 0x1.3fffffffea5e1p2 0x1.50cp-19 F +REG epsg:2749 0 OK 0x1.e828f878f0072p18 0x1.463e1afc72284p6 -0x1.88a82964ap5 0x1.4ap7 0x0.0p0 0x1.544p-19 T +REG epsg:2749 1 OK -0x1.b03383461aabp15 -0x1.0ef577a2e8139p19 -0x1.71c3e1b64p5 0x1.400000000eac3p7 -0x1.3fffffffea4f1p2 0x1.52p-19 F +REG epsg:2749 2 OK 0x1.0196183cb6cbep20 -0x1.0ef575abfda56p19 -0x1.0c4cdddafp6 0x1.53fffffff15ddp7 -0x1.3fffffffea5f9p2 0x1.51p-19 F +REG epsg:2749 3 OK -0x1.b031064b9856p15 0x1.0f09db590321ep19 -0x1.00081caf6p5 0x1.400000000eabep7 0x1.3fffffffea4dbp2 0x1.52p-19 F +REG epsg:2749 4 OK 0x1.019604572740ep20 0x1.0f09d961f330dp19 -0x1.a6ddde26ap5 0x1.53fffffff15e1p7 0x1.3fffffffea5e3p2 0x1.51p-19 F +REG epsg:27492 0 OK 0x1.9c5be85f5ff37p6 -0x1.60f6e992cd59ap7 -0x1.b902f6cb4p5 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x1.0p-30 F +REG epsg:27492 1 OK -0x1.22df28854672bp19 -0x1.05a26b0520914p19 -0x1.4e778e796p5 -0x1.d41333b317a4ep3 0x1.15555554dc1f9p5 -0x1.0p-28 F +REG epsg:27492 2 OK 0x1.22f8ee2bd4f3bp19 -0x1.05a26b0868883p19 -0x1.c1d88ca1p5 -0x1.a2ef9509fe476p0 0x1.15555554dc4e7p5 -0x1.0p-30 F +REG epsg:27492 3 OK -0x1.f6f30945997afp18 0x1.1924c6f8cea08p19 -0x1.d22ff38dp5 -0x1.d41333afe69f5p3 0x1.65555554819f5p5 -0x1.4p-27 F +REG epsg:27492 4 OK 0x1.f72694a2f461ap18 0x1.1924c6f68d859p19 -0x1.1afa8d6a7p6 -0x1.a2ef952376ffdp0 0x1.6555555481febp5 -0x1.1p-26 F +REG epsg:27493 0 OK 0x1.9c5be85f5ff37p6 -0x1.60f6e992cd59ap7 -0x1.b902f6cb4p5 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x1.0p-30 F +REG epsg:27493 1 OK -0x1.22df28854672bp19 -0x1.05a26b0520914p19 -0x1.4e778e796p5 -0x1.d41333b317a4ep3 0x1.15555554dc1f9p5 -0x1.0p-28 F +REG epsg:27493 2 OK 0x1.22f8ee2bd4f3bp19 -0x1.05a26b0868883p19 -0x1.c1d88ca1p5 -0x1.a2ef9509fe476p0 0x1.15555554dc4e7p5 -0x1.0p-30 F +REG epsg:27493 3 OK -0x1.f6f30945997afp18 0x1.1924c6f8cea08p19 -0x1.d22ff38dp5 -0x1.d41333afe69f5p3 0x1.65555554819f5p5 -0x1.4p-27 F +REG epsg:27493 4 OK 0x1.f72694a2f461ap18 0x1.1924c6f68d859p19 -0x1.1afa8d6a7p6 -0x1.a2ef952376ffdp0 0x1.6555555481febp5 -0x1.1p-26 F +REG epsg:2750 0 OK 0x1.e828425b58399p18 0x1.463e3076af892p6 -0x1.bb91edb4cp5 0x1.5p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2750 1 OK -0x1.b03a4f23c568p15 -0x1.0ef58984c997ep19 -0x1.a250ae9b8p5 0x1.460000000eac5p7 -0x1.3fffffffea4ebp2 0x1.51ep-19 F +REG epsg:2750 2 OK 0x1.0195f38c3b908p20 -0x1.0ef5878dda4bap19 -0x1.268d3e535p6 0x1.59fffffff15dep7 -0x1.3fffffffea5fdp2 0x1.50ep-19 F +REG epsg:2750 3 OK -0x1.b037d227f10dp15 0x1.0f09ed3c39956p19 -0x1.3094e2714p5 0x1.460000000eac1p7 0x1.3fffffffea4d6p2 0x1.51ap-19 F +REG epsg:2750 4 OK 0x1.0195dfa6aec3p20 0x1.0f09eb4524c57p19 -0x1.db5e975fp5 0x1.59fffffff15e2p7 0x1.3fffffffea5e6p2 0x1.50ep-19 F +REG epsg:27500 0 OK 0x1.431c318dd6048p18 0x1.2787d78c0bf0cp18 0x0.0p0 0x1.5999999999997p2 0x1.8bffffffffa5p5 0x0.0p0 F +REG epsg:27500 1 OK -0x1.231d2cbeca13ap18 -0x1.8c55642d11236p17 0x0.0p0 -0x1.26408f5ee218ap1 0x1.63ffffffffff8p5 0x0.0p0 F +REG epsg:27500 2 OK 0x1.c4c5bcf562aabp19 -0x1.d6982bb435f8p17 0x0.0p0 0x1.a329bd71521fap3 0x1.63ffffffffff8p5 0x0.0p0 F +REG epsg:27500 3 OK -0x1.259760236d5c8p17 0x1.b777a721a6181p19 0x0.0p0 -0x1.26408f5ee218ap1 0x1.b3ffffffffdc5p5 0x0.0p0 F +REG epsg:27500 4 OK 0x1.9e2403c5e0f6ep19 0x1.a857001e9c976p19 0x0.0p0 0x1.a329bd71521fap3 0x1.b3ffffffffdc5p5 0x0.0p0 F +REG epsg:2751 0 OK 0x1.e827a1ceae3edp18 0x1.463e466a0e5aep6 -0x1.ef9ad39cep5 0x1.56p7 0x1.2f74bf1dcf456p-63 0x1.542p-19 T +REG epsg:2751 1 OK -0x1.b04074b46f84p15 -0x1.0ef59bcb8581bp19 -0x1.d43659bb8p5 0x1.4c0000000eac7p7 -0x1.3fffffffea4ebp2 0x1.518p-19 F +REG epsg:2751 2 OK 0x1.0195d471e223ap20 -0x1.0ef599d491e2bp19 -0x1.413e22f51p6 0x1.5ffffffff15ep7 -0x1.3fffffffea601p2 0x1.508p-19 F +REG epsg:2751 3 OK -0x1.b03df7b75f95p15 0x1.0f09ff8451f1p19 -0x1.627a863a8p5 0x1.4c0000000eac4p7 0x1.3fffffffea4d4p2 0x1.52p-19 F +REG epsg:2751 4 OK 0x1.0195c08c57341p20 0x1.0f09fd8d38cdbp19 -0x1.08602c645p6 0x1.5ffffffff15e3p7 0x1.3fffffffea5e8p2 0x1.50ep-19 F +REG epsg:2752 0 OK 0x1.e82717439d424p18 0x1.463e5cc727cddp6 -0x1.124f2c2b8p6 0x1.5cp7 0x0.0p0 0x1.544p-19 T +REG epsg:2752 1 OK -0x1.b045efa7dc48p15 -0x1.0ef5ae6a48ff9p19 -0x1.03a8f029bp6 0x1.520000000eac8p7 -0x1.3fffffffea4e5p2 0x1.524p-19 F +REG epsg:2752 2 OK 0x1.0195bb037e8e8p20 -0x1.0ef5ac73519c7p19 -0x1.5c4cd1574p6 0x1.65fffffff15e1p7 -0x1.3fffffffea6p2 0x1.50ep-19 F +REG epsg:2752 3 OK -0x1.b04372a9a813p15 0x1.0f0a1224786f1p19 -0x1.9596054eap5 0x1.520000000eac4p7 0x1.3fffffffea4cep2 0x1.522p-19 F +REG epsg:2752 4 OK 0x1.0195a71df49bep20 0x1.0f0a102d5b873p19 -0x1.236ed6ccp6 0x1.65fffffff15e5p7 0x1.3fffffffea5ecp2 0x1.50ap-19 F +REG epsg:2753 0 OK 0x1.e826a31b5fc07p18 0x1.463e737e4adccp6 -0x1.2d3ba49ep6 0x1.62p7 -0x1.2f74bf1dcf457p-62 0x1.54p-19 T +REG epsg:2753 1 OK -0x1.b04abc2582eep15 -0x1.0ef5c15403778p19 -0x1.1dbfb3186p6 0x1.580000000eacbp7 -0x1.3fffffffea4e7p2 0x1.51ap-19 F +REG epsg:2753 2 OK 0x1.0195a752ea19bp20 -0x1.0ef5bf5d08e11p19 -0x1.77a64d3e7p6 -0x1.640000000ea1fp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2753 3 OK -0x1.b0483f264291p15 0x1.0f0a250f9b7c6p19 -0x1.c9c3837fap5 0x1.580000000eac7p7 0x1.3fffffffea4cfp2 0x1.52p-19 F +REG epsg:2753 4 OK 0x1.0195936d60424p20 0x1.0f0a23187b60ap19 -0x1.3ec84eadap6 -0x1.640000000ea1bp7 0x1.3fffffffea5ebp2 0x1.50cp-19 F +REG epsg:2754 0 OK 0x1.e82645a77b5ecp18 0x1.463e8a7f874f6p6 -0x1.487feeee2p6 -0x1.68p7 0x0.0p0 0x1.54p-19 F +REG epsg:2754 1 OK -0x1.b04ed6cf4275p15 -0x1.0ef5d47b6fafdp19 -0x1.384d276bap6 0x1.5e0000000eacbp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:2754 2 OK 0x1.0195996df6d19p20 -0x1.0ef5d28472798p19 -0x1.933765ee6p6 -0x1.5e0000000ea1cp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2754 3 OK -0x1.b04c59cf0ec8p15 0x1.0f0a383874e23p19 -0x1.fede6456ep5 0x1.5e0000000eac7p7 0x1.3fffffffea4cbp2 0x1.522p-19 F +REG epsg:2754 4 OK 0x1.019585886c338p20 0x1.0f0a364152265p19 -0x1.5a59634fcp6 -0x1.5e0000000ea19p7 0x1.3fffffffea5ecp2 0x1.512p-19 F +REG epsg:2755 0 OK 0x1.e825ff2987834p18 0x1.463ea1bab8e7dp6 -0x1.6408e9415p6 -0x1.62p7 0x1.2f74bf1dcf457p-63 0x1.54p-19 T +REG epsg:2755 1 OK -0x1.b0523cc3be38p15 -0x1.0ef5e7d31d1ffp19 -0x1.533eab99fp6 0x1.640000000eacdp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:2755 2 OK 0x1.0195915e65b86p20 -0x1.0ef5e5dc1ddecp19 -0x1.aeecc3a18p6 -0x1.580000000ea1ep7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:2755 3 OK -0x1.b04fbfc2b0cp15 0x1.0f0a4b919317ep19 -0x1.1a60b263ap6 0x1.640000000eac9p7 0x1.3fffffffea4cbp2 0x1.51ap-19 F +REG epsg:2755 4 OK 0x1.01957d78d9728p20 0x1.0f0a499a6e50ep19 -0x1.760ebceffp6 -0x1.580000000ea1ap7 0x1.3fffffffea5edp2 0x1.508p-19 F +REG epsg:2756 0 OK 0x1.e825cfd2ff6d2p18 0x1.463eb91f92b79p6 -0x1.7fc341872p6 -0x1.5cp7 -0x1.2f74bf1dcf458p-62 0x1.53ep-19 T +REG epsg:2756 1 OK -0x1.b054eba064dp15 -0x1.0ef5fb4d795dbp19 -0x1.6e8157dfcp6 -0x1.65fffffff1534p7 -0x1.3fffffffea4e1p2 0x1.52p-19 F +REG epsg:2756 2 OK 0x1.01958f29e004p20 -0x1.0ef5f95678a81p19 -0x1.cab2f51a8p6 -0x1.520000000ea1dp7 -0x1.3fffffffea605p2 0x1.50cp-19 F +REG epsg:2756 3 OK -0x1.b0526e9e97a8p15 0x1.0f0a5f0d62b07p19 -0x1.35a35aa73p6 -0x1.65fffffff1537p7 0x1.3fffffffea4c7p2 0x1.51ep-19 F +REG epsg:2756 4 OK 0x1.01957b4451364p20 0x1.0f0a5d163c74cp19 -0x1.91d4ea534p6 -0x1.520000000ea19p7 0x1.3fffffffea5edp2 0x1.51p-19 F +REG epsg:27561 0 OK 0x1.a4b3c0b4131bep18 0x1.8bc4a67f9539ep17 -0x1.64ed94146p5 0x1.e97664d4270bfp-54 0x1.8bffffffff8adp5 0x0.0p0 F +REG epsg:27561 1 OK -0x1.83e173e80c868p17 -0x1.2818be0db52f3p18 -0x1.a0879d66cp5 -0x1.ecb9e1490aa5fp2 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:27561 2 OK 0x1.f5c4ac785b35fp19 -0x1.4d407be52099ep18 -0x1.44cdc3156p5 0x1.ecb9e1490aa5dp2 0x1.63ffffffffff3p5 -0x1.0p-29 F +REG epsg:27561 3 OK -0x1.8c484b230a4dp15 0x1.86d32c34e9a06p19 -0x1.8a8aae45ep5 -0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27561 4 OK 0x1.cf1d15b29c739p19 0x1.77afa6c431c0ep19 -0x1.3fdcc87b6p5 0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27562 0 OK 0x1.9bcb5f49a2de8p18 0x1.8bd100ee9e0fep17 -0x1.683e3404ep5 0x1.a35e68a0d0cf5p-52 0x1.766666666665dp5 -0x1.0p-30 F +REG epsg:27562 1 OK -0x1.8ab3e93a0ee1cp17 -0x1.2bc18e2f5a771p18 -0x1.9fbe1e88ap5 -0x1.d3765caea93b1p2 0x1.4e6666666664ep5 -0x1.0p-28 F +REG epsg:27562 2 OK 0x1.ef2440962b966p19 -0x1.4f14dcae33622p18 -0x1.44c2a62e2p5 0x1.d3765caea93b2p2 0x1.4e6666666664ep5 -0x1.0p-29 F +REG epsg:27562 3 OK -0x1.0174f8d80941p16 0x1.8578cdff472a8p19 -0x1.8e2b95e6p5 -0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x1.0p-30 F +REG epsg:27562 4 OK 0x1.ccd2c66de574cp19 0x1.76ce94a41f69bp19 -0x1.42b25f5eap5 0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x0.0p0 F +REG epsg:27563 0 OK 0x1.9346af3c30566p18 0x1.8bd06a02cfd81p17 -0x1.6a31e0f76p5 -0x1.62ce8598ebb86p-52 0x1.60cccccccccbep5 -0x1.0p-29 F +REG epsg:27563 1 OK -0x1.918af6e52b534p17 -0x1.2f20de917ae0dp18 -0x1.9c12e3ed6p5 -0x1.bd9aa43c2af27p2 0x1.38cccccccccbp5 -0x1.8p-29 F +REG epsg:27563 2 OK 0x1.e8f59c84766f6p19 -0x1.5098d7d80bb36p18 -0x1.41c4430cap5 0x1.bd9aa43c2af24p2 0x1.38cccccccccadp5 0x0.0p0 F +REG epsg:27563 3 OK -0x1.394aeed4a6c28p16 0x1.842699ee33419p19 -0x1.920e12c1ap5 -0x1.bd9aa43c2af22p2 0x1.88cccccccc4f6p5 -0x1.0p-29 F +REG epsg:27563 4 OK 0x1.ca75d7891bab6p19 0x1.760525827c642p19 -0x1.45dd5ba5ap5 0x1.bd9aa43c2af23p2 0x1.88cccccccc4f8p5 0x0.0p0 F +REG epsg:27564 0 OK -0x1.78999eb6ebcbfp17 0x1.702acbb4837dp17 -0x1.6a439c026p5 0x1.09ad3aff6c1fep-55 0x1.5151eb851eb73p5 0x0.0p0 F +REG epsg:27564 1 OK -0x1.8a782d9c42918p19 -0x1.3f3ecb111f262p18 -0x1.972ed8c7ap5 -0x1.afb945304eeb6p2 0x1.2951eb851eb5fp5 0x1.0p-29 F +REG epsg:27564 2 OK 0x1.7fe31affe8663p18 -0x1.5f5e0fef92df7p18 -0x1.3d52fb30cp5 0x1.afb945304eeb7p2 0x1.2951eb851eb61p5 -0x1.0p-30 F +REG epsg:27564 3 OK -0x1.50cae5abea0afp19 0x1.7c55bfb9909eep19 -0x1.948335f64p5 -0x1.afb945304eeb4p2 0x1.7951eb851eb7fp5 0x0.0p0 F +REG epsg:27564 4 OK 0x1.47d191a8b8dbdp18 0x1.6e9eddf09cdp19 -0x1.47d93794ep5 0x1.afb945304eeb8p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG epsg:2757 0 OK 0x1.e825b7c51f4fep18 0x1.463ed09daa8ddp6 -0x1.9b9b8306bp6 -0x1.56p7 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:2757 1 OK -0x1.b056e1831b1dp15 -0x1.0ef60edcd9a3p19 -0x1.8a020b83cp6 -0x1.5ffffffff1532p7 -0x1.3fffffffea4ep2 0x1.516p-19 F +REG epsg:2757 2 OK 0x1.019592d1f30f5p20 -0x1.0ef60ce5d8106p19 -0x1.e6767d49ep6 -0x1.4c0000000ea1dp7 -0x1.3fffffffea606p2 0x1.508p-19 F +REG epsg:2757 3 OK -0x1.b0546480a8eap15 0x1.0f0a729e37e13p19 -0x1.51240a3fbp6 -0x1.5ffffffff1536p7 0x1.3fffffffea4c8p2 0x1.522p-19 F +REG epsg:2757 4 OK 0x1.01957eec60db5p20 0x1.0f0a70a710c87p19 -0x1.ad986e6d7p6 -0x1.4c0000000ea1ap7 0x1.3fffffffea5fp2 0x1.50ap-19 F +REG epsg:27571 0 OK 0x1.a4b3c0b4131bep18 0x1.259c94cff2a74p20 -0x1.64ed94146p5 0x1.e97664d4270bfp-54 0x1.8bffffffff8adp5 0x0.0p0 F +REG epsg:27571 1 OK -0x1.83e173e80c868p17 0x1.543ba0f925686p19 -0x1.a0879d66cp5 -0x1.ecb9e1490aa5fp2 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:27571 2 OK 0x1.f5c4ac785b35fp19 0x1.41a7c20d6fb31p19 -0x1.44cdc3156p5 0x1.ecb9e1490aa5dp2 0x1.63ffffffffff3p5 -0x1.0p-29 F +REG epsg:27571 3 OK -0x1.8c484b230a4dp15 0x1.b78d961a74d03p20 -0x1.8a8aae45ep5 -0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27571 4 OK 0x1.cf1d15b29c739p19 0x1.affbd36218e07p20 -0x1.3fdcc87b6p5 0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27572 0 OK 0x1.9bcb5f49a2de8p18 0x1.0ce1100ee9e1p21 -0x1.683e3404ep5 0x1.a35e68a0d0cf5p-52 0x1.766666666665dp5 -0x1.0p-30 F +REG epsg:27572 1 OK -0x1.8ab3e93a0ee1cp17 0x1.9d579c7429624p20 -0x1.9fbe1e88ap5 -0x1.d3765caea93b1p2 0x1.4e6666666664ep5 -0x1.0p-28 F +REG epsg:27572 2 OK 0x1.ef2440962b966p19 0x1.9482c8d473278p20 -0x1.44c2a62e2p5 0x1.d3765caea93b2p2 0x1.4e6666666664ep5 -0x1.0p-29 F +REG epsg:27572 3 OK -0x1.0174f8d80941p16 0x1.5582337fd1caap21 -0x1.8e2b95e6p5 -0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x1.0p-30 F +REG epsg:27572 4 OK 0x1.ccd2c66de574cp19 0x1.51d7a52907da7p21 -0x1.42b25f5eap5 0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x0.0p0 F +REG epsg:27573 0 OK 0x1.9346af3c30566p18 0x1.86f306a02cfd8p21 -0x1.6a31e0f76p5 -0x1.62ce8598ebb86p-52 0x1.60cccccccccbep5 -0x1.0p-29 F +REG epsg:27573 1 OK -0x1.918af6e52b534p17 0x1.4851e42dd0a3ep21 -0x1.9c12e3ed6p5 -0x1.bd9aa43c2af27p2 0x1.38cccccccccbp5 -0x1.8p-29 F +REG epsg:27573 2 OK 0x1.e8f59c84766f6p19 0x1.4422e504fe899p21 -0x1.41c4430cap5 0x1.bd9aa43c2af24p2 0x1.38cccccccccadp5 0x0.0p0 F +REG epsg:27573 3 OK -0x1.394aeed4a6c28p16 0x1.cf3fa67b8cd06p21 -0x1.920e12c1ap5 -0x1.bd9aa43c2af22p2 0x1.88cccccccc4f6p5 -0x1.0p-29 F +REG epsg:27573 4 OK 0x1.ca75d7891bab6p19 0x1.cbb749609f19p21 -0x1.45dd5ba5ap5 0x1.bd9aa43c2af23p2 0x1.88cccccccc4f8p5 0x0.0p0 F +REG epsg:27574 0 OK -0x1.78999eb6ebcbfp17 0x1.ff4aacbb4837dp21 -0x1.6a439c026p5 0x1.09ad3aff6c1fep-55 0x1.5151eb851eb73p5 0x0.0p0 F +REG epsg:27574 1 OK -0x1.8a782d9c42918p19 0x1.c060269ddc1b4p21 -0x1.972ed8c7ap5 -0x1.afb945304eeb6p2 0x1.2951eb851eb5fp5 0x1.0p-29 F +REG epsg:27574 2 OK 0x1.7fe31affe8663p18 0x1.bc5c3e020da41p21 -0x1.3d52fb30cp5 0x1.afb945304eeb7p2 0x1.2951eb851eb61p5 -0x1.0p-30 F +REG epsg:27574 3 OK -0x1.50cae5abea0afp19 0x1.23aeb7f73213ep22 -0x1.948335f64p5 -0x1.afb945304eeb4p2 0x1.7951eb851eb7fp5 0x0.0p0 F +REG epsg:27574 4 OK 0x1.47d191a8b8dbdp18 0x1.21f7dbbe139ap22 -0x1.47d93794ep5 0x1.afb945304eeb8p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG epsg:2758 0 OK 0x1.e825b710cd011p18 0x1.463ee824847cbp6 -0x1.b77e24068p6 -0x1.5p7 0x1.2f74bf1dcf455p-62 0x1.544p-19 T +REG epsg:2758 1 OK -0x1.b0581d0b90eap15 -0x1.0ef622738464fp19 -0x1.a5ad7a425p6 -0x1.59fffffff1533p7 -0x1.3fffffffea4e1p2 0x1.516p-19 F +REG epsg:2758 2 OK 0x1.01959c540f48cp20 -0x1.0ef6207c828d2p19 -0x1.0111f07ccp7 -0x1.460000000ea1fp7 -0x1.3fffffffea602p2 0x1.50ap-19 F +REG epsg:2758 3 OK -0x1.b055a00894c3p15 0x1.0f0a863658197p19 -0x1.6ccf74eccp6 -0x1.59fffffff1536p7 0x1.3fffffffea4c8p2 0x1.51ap-19 F +REG epsg:2758 4 OK 0x1.0195886e78d2bp20 0x1.0f0a843f30bb9p19 -0x1.c945ce0bp6 -0x1.460000000ea1ap7 0x1.3fffffffea5edp2 0x1.51p-19 F +REG epsg:27581 0 OK 0x1.a4b3c0b4131bep18 0x1.259c94cff2a74p20 -0x1.64ed94146p5 0x1.e97664d4270bfp-54 0x1.8bffffffff8adp5 0x0.0p0 F +REG epsg:27581 1 OK -0x1.83e173e80c868p17 0x1.543ba0f925686p19 -0x1.a0879d66cp5 -0x1.ecb9e1490aa5fp2 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:27581 2 OK 0x1.f5c4ac785b35fp19 0x1.41a7c20d6fb31p19 -0x1.44cdc3156p5 0x1.ecb9e1490aa5dp2 0x1.63ffffffffff3p5 -0x1.0p-29 F +REG epsg:27581 3 OK -0x1.8c484b230a4dp15 0x1.b78d961a74d03p20 -0x1.8a8aae45ep5 -0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27581 4 OK 0x1.cf1d15b29c739p19 0x1.affbd36218e07p20 -0x1.3fdcc87b6p5 0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27582 0 OK 0x1.9bcb5f49a2de8p18 0x1.0ce1100ee9e1p21 -0x1.683e3404ep5 0x1.a35e68a0d0cf5p-52 0x1.766666666665dp5 -0x1.0p-30 F +REG epsg:27582 1 OK -0x1.8ab3e93a0ee1cp17 0x1.9d579c7429624p20 -0x1.9fbe1e88ap5 -0x1.d3765caea93b1p2 0x1.4e6666666664ep5 -0x1.0p-28 F +REG epsg:27582 2 OK 0x1.ef2440962b966p19 0x1.9482c8d473278p20 -0x1.44c2a62e2p5 0x1.d3765caea93b2p2 0x1.4e6666666664ep5 -0x1.0p-29 F +REG epsg:27582 3 OK -0x1.0174f8d80941p16 0x1.5582337fd1caap21 -0x1.8e2b95e6p5 -0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x1.0p-30 F +REG epsg:27582 4 OK 0x1.ccd2c66de574cp19 0x1.51d7a52907da7p21 -0x1.42b25f5eap5 0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x0.0p0 F +REG epsg:27583 0 OK 0x1.9346af3c30566p18 0x1.86f306a02cfd8p21 -0x1.6a31e0f76p5 -0x1.62ce8598ebb86p-52 0x1.60cccccccccbep5 -0x1.0p-29 F +REG epsg:27583 1 OK -0x1.918af6e52b534p17 0x1.4851e42dd0a3ep21 -0x1.9c12e3ed6p5 -0x1.bd9aa43c2af27p2 0x1.38cccccccccbp5 -0x1.8p-29 F +REG epsg:27583 2 OK 0x1.e8f59c84766f6p19 0x1.4422e504fe899p21 -0x1.41c4430cap5 0x1.bd9aa43c2af24p2 0x1.38cccccccccadp5 0x0.0p0 F +REG epsg:27583 3 OK -0x1.394aeed4a6c28p16 0x1.cf3fa67b8cd06p21 -0x1.920e12c1ap5 -0x1.bd9aa43c2af22p2 0x1.88cccccccc4f6p5 -0x1.0p-29 F +REG epsg:27583 4 OK 0x1.ca75d7891bab6p19 0x1.cbb749609f19p21 -0x1.45dd5ba5ap5 0x1.bd9aa43c2af23p2 0x1.88cccccccc4f8p5 0x0.0p0 F +REG epsg:27584 0 OK -0x1.78999eb6ebcbfp17 0x1.ff4aacbb4837dp21 -0x1.6a439c026p5 0x1.09ad3aff6c1fep-55 0x1.5151eb851eb73p5 0x0.0p0 F +REG epsg:27584 1 OK -0x1.8a782d9c42918p19 0x1.c060269ddc1b4p21 -0x1.972ed8c7ap5 -0x1.afb945304eeb6p2 0x1.2951eb851eb5fp5 0x1.0p-29 F +REG epsg:27584 2 OK 0x1.7fe31affe8663p18 0x1.bc5c3e020da41p21 -0x1.3d52fb30cp5 0x1.afb945304eeb7p2 0x1.2951eb851eb61p5 -0x1.0p-30 F +REG epsg:27584 3 OK -0x1.50cae5abea0afp19 0x1.23aeb7f73213ep22 -0x1.948335f64p5 -0x1.afb945304eeb4p2 0x1.7951eb851eb7fp5 0x0.0p0 F +REG epsg:27584 4 OK 0x1.47d191a8b8dbdp18 0x1.21f7dbbe139ap22 -0x1.47d93794ep5 0x1.afb945304eeb8p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG epsg:2759 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG epsg:2759 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG epsg:2759 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG epsg:2759 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:2759 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:27591 0 OK 0x1.a4b3c0b4131bep18 0x1.8bc4a67f9539ep17 -0x1.64ed94146p5 0x1.e97664d4270bfp-54 0x1.8bffffffff8adp5 0x0.0p0 F +REG epsg:27591 1 OK -0x1.83e173e80c868p17 -0x1.2818be0db52f3p18 -0x1.a0879d66cp5 -0x1.ecb9e1490aa5fp2 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:27591 2 OK 0x1.f5c4ac785b35fp19 -0x1.4d407be52099ep18 -0x1.44cdc3156p5 0x1.ecb9e1490aa5dp2 0x1.63ffffffffff3p5 -0x1.0p-29 F +REG epsg:27591 3 OK -0x1.8c484b230a4dp15 0x1.86d32c34e9a06p19 -0x1.8a8aae45ep5 -0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27591 4 OK 0x1.cf1d15b29c739p19 0x1.77afa6c431c0ep19 -0x1.3fdcc87b6p5 0x1.ecb9e1490aa5dp2 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG epsg:27592 0 OK 0x1.9bcb5f49a2de8p18 0x1.8bd100ee9e0fep17 -0x1.683e3404ep5 0x1.a35e68a0d0cf5p-52 0x1.766666666665dp5 -0x1.0p-30 F +REG epsg:27592 1 OK -0x1.8ab3e93a0ee1cp17 -0x1.2bc18e2f5a771p18 -0x1.9fbe1e88ap5 -0x1.d3765caea93b1p2 0x1.4e6666666664ep5 -0x1.0p-28 F +REG epsg:27592 2 OK 0x1.ef2440962b966p19 -0x1.4f14dcae33622p18 -0x1.44c2a62e2p5 0x1.d3765caea93b2p2 0x1.4e6666666664ep5 -0x1.0p-29 F +REG epsg:27592 3 OK -0x1.0174f8d80941p16 0x1.8578cdff472a8p19 -0x1.8e2b95e6p5 -0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x1.0p-30 F +REG epsg:27592 4 OK 0x1.ccd2c66de574cp19 0x1.76ce94a41f69bp19 -0x1.42b25f5eap5 0x1.d3765caea93b1p2 0x1.9e66666666183p5 0x0.0p0 F +REG epsg:27593 0 OK 0x1.9346af3c30566p18 0x1.8bd06a02cfd81p17 -0x1.6a31e0f76p5 -0x1.62ce8598ebb86p-52 0x1.60cccccccccbep5 -0x1.0p-29 F +REG epsg:27593 1 OK -0x1.918af6e52b534p17 -0x1.2f20de917ae0dp18 -0x1.9c12e3ed6p5 -0x1.bd9aa43c2af27p2 0x1.38cccccccccbp5 -0x1.8p-29 F +REG epsg:27593 2 OK 0x1.e8f59c84766f6p19 -0x1.5098d7d80bb36p18 -0x1.41c4430cap5 0x1.bd9aa43c2af24p2 0x1.38cccccccccadp5 0x0.0p0 F +REG epsg:27593 3 OK -0x1.394aeed4a6c28p16 0x1.842699ee33419p19 -0x1.920e12c1ap5 -0x1.bd9aa43c2af22p2 0x1.88cccccccc4f6p5 -0x1.0p-29 F +REG epsg:27593 4 OK 0x1.ca75d7891bab6p19 0x1.760525827c642p19 -0x1.45dd5ba5ap5 0x1.bd9aa43c2af23p2 0x1.88cccccccc4f8p5 0x0.0p0 F +REG epsg:27594 0 OK -0x1.78999eb6ebcbfp17 0x1.702acbb4837dp17 -0x1.6a439c026p5 0x1.09ad3aff6c1fep-55 0x1.5151eb851eb73p5 0x0.0p0 F +REG epsg:27594 1 OK -0x1.8a782d9c42918p19 -0x1.3f3ecb111f262p18 -0x1.972ed8c7ap5 -0x1.afb945304eeb6p2 0x1.2951eb851eb5fp5 0x1.0p-29 F +REG epsg:27594 2 OK 0x1.7fe31affe8663p18 -0x1.5f5e0fef92df7p18 -0x1.3d52fb30cp5 0x1.afb945304eeb7p2 0x1.2951eb851eb61p5 -0x1.0p-30 F +REG epsg:27594 3 OK -0x1.50cae5abea0afp19 0x1.7c55bfb9909eep19 -0x1.948335f64p5 -0x1.afb945304eeb4p2 0x1.7951eb851eb7fp5 0x0.0p0 F +REG epsg:27594 4 OK 0x1.47d191a8b8dbdp18 0x1.6e9eddf09cdp19 -0x1.47d93794ep5 0x1.afb945304eeb8p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG epsg:2760 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2760 1 OK 0x1.02d19c77044p14 -0x1.087061b7c104ap19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2760 2 OK 0x1.20ecb98e23efp20 -0x1.087061b7c104ap19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2760 3 OK 0x1.1be3a4fd1d818p16 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2760 4 OK 0x1.1339c5b02e27ep20 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2761 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:2761 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2761 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2761 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2761 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2762 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:2762 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2762 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2762 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2762 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2763 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:2763 1 OK -0x1.6a878bb7ed38p18 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2763 2 OK 0x1.859fc5dbf69cp19 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2763 3 OK -0x1.317ed19066ebep18 0x1.16785ef123969p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2763 4 OK 0x1.691b68c83375fp19 0x1.16785ef123969p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2764 0 OK 0x1.86ap18 0x1.9bb240973abadp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:2764 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b129p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:2764 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b129p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:2764 3 OK 0x1.797b25aa020dcp17 0x1.3735788b95813p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:2764 4 OK 0x1.284136957f7c9p19 0x1.3735788b95813p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:2765 0 OK 0x1.86ap18 0x1.f85a78d71c1e8p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:2765 1 OK 0x1.390d3a7ad5114p17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:2765 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:2765 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:2765 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:2766 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:2766 1 OK 0x1.a694a7721358p20 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:2766 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:2766 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2766 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2767 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:2767 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:2767 2 OK 0x1.12833bad34ff3p21 0x1.7686899058616p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:2767 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6c2p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:2767 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:2768 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:2768 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:2768 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:2768 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:2768 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:2769 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:2769 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:2769 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:2769 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:2769 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:2770 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:2770 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:2770 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:2770 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:2770 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:27700 0 OK 0x1.86b7e887f74bbp18 -0x1.86f5b07b7cfcbp16 -0x1.68dbd5786p5 -0x1.00000000cde58p1 0x1.87fffffff0e78p5 0x1.4a7ap-15 F +REG epsg:27700 1 OK -0x1.9c22480091584p17 -0x1.325481053e9a1p19 -0x1.4e6bdf23ap5 -0x1.33e16800ef71ep3 0x1.5ffffffde9854p5 0x1.be6cp-15 F +REG epsg:27700 2 OK 0x1.edc0020e0ca56p19 -0x1.325503cde3f5ap19 -0x1.4e91b7998p4 0x1.67c2d0011e38p2 0x1.5ffffffde8efdp5 0x1.6c04p-15 F +REG epsg:27700 3 OK -0x1.82d5924091c4p16 0x1.d79a6ef8cbcd8p18 -0x1.c552df046p5 -0x1.33e167f3da8fcp3 0x1.affffffd94e61p5 0x1.2d08p-15 F +REG epsg:27700 4 OK 0x1.b7131fcc54878p19 0x1.d799818a0640cp18 -0x1.3cc1c1d26p5 0x1.67c2cfe69a96fp2 0x1.affffffd94b62p5 0x1.c4dp-16 F +REG epsg:2771 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:2771 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:2771 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:2771 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:2771 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:2772 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:2772 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:2772 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:2772 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:2772 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:2773 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:2773 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:2773 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:2773 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:2773 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:2774 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:2774 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:2774 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:2774 3 OK 0x1.60a2ad403160fp19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:2774 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:2775 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abb7p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:2775 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:2775 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:2775 3 OK 0x1.75e64473bf831p17 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2775 4 OK 0x1.985d2bcd7fae6p18 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2776 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:2776 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:2776 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:2776 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:2776 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:2777 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:2777 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2777 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2777 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2777 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2778 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:2778 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2778 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2778 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2778 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2779 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:2779 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002aep16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:2779 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002aep16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:2779 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:2779 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:2780 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2780 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2780 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:2780 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2780 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2781 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2781 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:2781 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2781 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2781 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2782 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG epsg:2782 1 OK -0x1.189e532ce2828p16 -0x1.0b145d531a7efp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG epsg:2782 2 OK 0x1.05ade532ce282p20 -0x1.0b145d531a7efp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG epsg:2782 3 OK -0x1.2e8eb60eec2fp15 0x1.1337c2eae2b2fp19 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG epsg:2782 4 OK 0x1.fb30eb60eec2fp19 0x1.1337c2eae2b2fp19 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG epsg:2783 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG epsg:2783 1 OK -0x1.1e4804260d93p16 -0x1.0ac07b5fe1fdbp19 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG epsg:2783 2 OK 0x1.0608804260d9ep20 -0x1.0ac07b5fe1fdap19 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG epsg:2783 3 OK -0x1.2379871f4e76p15 0x1.139768118dd2p19 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG epsg:2783 4 OK 0x1.fa7f9871f4e8cp19 0x1.139768118dd21p19 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532545p4 0x0.0p0 F +REG epsg:2784 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG epsg:2784 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:2784 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:2784 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:2784 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:2785 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG epsg:2785 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG epsg:2785 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG epsg:2785 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG epsg:2785 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG epsg:2786 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG epsg:2786 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG epsg:2786 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG epsg:2786 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG epsg:2786 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG epsg:2787 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2787 1 OK -0x1.85616a723a06p18 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2787 2 OK 0x1.8600b5391d03p19 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2787 3 OK -0x1.30ce4325f0855p18 0x1.19e94e9402c22p19 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2787 4 OK 0x1.5bb72192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2788 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2788 1 OK -0x1.81a5a9c8e8128p16 -0x1.04cdd2a40a263p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2788 2 OK 0x1.0c3e5a9c8e818p20 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2788 3 OK -0x1.7ac864be1088p13 0x1.19e94e9402c21p19 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2788 4 OK 0x1.ee332192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2789 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2789 1 OK 0x1.89215ec34d45p17 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2789 2 OK 0x1.557bd42796576p20 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2789 3 OK 0x1.192388e235138p18 0x1.19e84b4359962p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2789 4 OK 0x1.40571dc772bb2p20 0x1.19e84b4359962p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2790 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:2790 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:2790 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:2790 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:2790 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:2791 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:2791 1 OK 0x1.a750195edb798p16 -0x1.06875fc1616cep19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:2791 2 OK 0x1.3b56fe6a1248cp20 -0x1.06875fc1616cdp19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dcp4 0x0.0p0 F +REG epsg:2791 3 OK 0x1.6115074dc79c6p17 0x1.1836b2e30beebp19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:2791 4 OK 0x1.29a95f16470ccp20 0x1.1836b2e30beecp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:2792 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:2792 1 OK -0x1.e136f546b674cp18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2792 2 OK 0x1.52437aa35b3b1p19 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2792 3 OK -0x1.9852805abae41p18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2792 4 OK 0x1.2dd1402d5d72ap19 0x1.928ff7cb858e7p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2793 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:2793 1 OK 0x1.2c090ab9498b4p18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2793 2 OK 0x1.6c71bd51ad9d3p20 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2793 3 OK 0x1.74ed7fa5451bfp18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2793 4 OK 0x1.5a38a016aeb9p20 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2794 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2794 1 OK 0x1.3cc6ee6e8294ep20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:2794 2 OK 0x1.9fa511917d6b2p20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:2794 3 OK 0x1.3f7cec2641663p20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:2794 4 OK 0x1.9cef13d9be99dp20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:2795 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:2795 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:2795 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:2795 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:2795 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:2796 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:2796 1 OK 0x1.cb1f1458ef103p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:2796 2 OK 0x1.13d83ae9c43b6p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:2796 3 OK 0x1.d81683a3ea361p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:2796 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:2797 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:2797 1 OK 0x1.651ae3466f2f2p17 0x1.225e5e1328bcap18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:2797 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bcap18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:2797 3 OK 0x1.7a4c446942232p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:2797 4 OK 0x1.280ceee5af77dp19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:2798 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:2798 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2798 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2798 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2798 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2799 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:2799 1 OK 0x1.36785c3381cdep18 0x1.93766c01072c4p18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:2799 2 OK 0x1.4d0bd1e63f187p19 0x1.93766c01072c4p18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:2799 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:2799 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:2800 0 OK 0x1.e848p19 0x1.d532d46be5665p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:2800 1 OK 0x1.6fab4a4b43fbfp19 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:2800 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:2800 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:2800 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:2801 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:2801 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:2801 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:2801 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:2801 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:2802 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:2802 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:2802 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:2802 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:2802 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:2803 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:2803 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:2803 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:2803 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:2803 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:2804 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:2804 1 OK 0x1.7f67f8df8368dp17 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:2804 2 OK 0x1.26c601c81f25dp19 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:2804 3 OK 0x1.92b98c3d8bc66p17 0x1.24621bba84e0bp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:2804 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84e0bp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:2805 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:2805 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:2805 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:2805 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:2805 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:2806 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:2806 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:2806 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:2806 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:2806 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:2807 0 OK 0x1.e848p22 0x1.f347dc7be971fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:2807 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:2807 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:2807 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:2807 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:2808 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:2808 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:2808 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:2808 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:2808 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:2809 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2809 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:2809 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:2809 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:2809 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:2810 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:2810 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:2810 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:2810 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:2810 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:2811 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:2811 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:2811 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:2811 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:2811 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:2812 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:2812 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:2812 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:2812 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:2812 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:2813 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:2813 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2813 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2813 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2813 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2814 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:2814 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2814 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2814 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2814 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2815 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:2815 1 OK -0x1.4c8d5deffd5fap18 -0x1.06c963762fa92p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:2815 2 OK 0x1.9a6aaef7feafdp19 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:2815 3 OK -0x1.07f8838806987p18 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:2815 4 OK 0x1.782041c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:2816 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:2816 1 OK -0x1.61a577bff57e8p16 -0x1.06c963762fa92p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:2816 2 OK 0x1.0a3e577bff57ep20 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:2816 3 OK -0x1.3d4838806987p14 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:2816 4 OK 0x1.f23241c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:2817 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG epsg:2817 1 OK 0x1.f9e988e88c2ccp17 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:2817 2 OK 0x1.5fcccee2ee7a6p20 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:2817 3 OK 0x1.42628ec44b0f3p18 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:2817 4 OK 0x1.4e715c4eed3c3p20 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.6139e6ce2bc88p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:2818 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:2818 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:2818 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:2818 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:2818 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:2819 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:2819 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:2819 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:2819 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:2819 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:28191 0 OK 0x1.4c61b461d87b6p17 0x1.ef6f91d52877bp16 -0x1.af0119d09p6 0x1.19b2574d476cdp5 0x1.fbbedc552449ep4 0x1.1d2e28p-8 F +REG epsg:28191 1 OK -0x1.94bf7108b8f57p18 -0x1.942c0842f8928p18 -0x1.3ee56ed4bp6 0x1.d5549fa367d35p4 0x1.abbedbf77c0bep4 0x1.973a64p-8 F +REG epsg:28191 2 OK 0x1.7099cccb40884p19 -0x1.9418ebfc2e124p18 -0x1.eb4784e02p6 0x1.48ba5ec7469c6p5 0x1.abbedbf72c43dp4 0x1.cdf338p-8 F +REG epsg:28191 3 OK -0x1.5a55b4b6c66fbp18 0x1.549efae12a57cp19 -0x1.7730e1b3ep6 0x1.d5549a4f52662p4 0x1.25df6ead11094p5 0x1.378bf8p-9 F +REG epsg:28191 4 OK 0x1.53521ae6583cp19 0x1.54a822b9260cep19 -0x1.08d84e3a78p7 0x1.48ba616e33bcap5 0x1.25df6eac6f9e1p5 0x1.a3ff58p-9 F +REG epsg:28192 0 OK 0x1.4c61b461d878p17 0x1.131af91d52877p20 -0x1.af0119d09p6 0x1.19b2574d476cdp5 0x1.fbbedc552449ep4 0x1.1d2e28p-8 F +REG epsg:28192 1 OK -0x1.958d1c0292b5dp18 0x1.1e3204e0ac002p19 -0x1.3ee56ed4bp6 0x1.d554adecdd1b3p4 0x1.abbedc5006f66p4 0x1.9a49bcp-8 F +REG epsg:28192 2 OK 0x1.710098c14370ep19 0x1.1e3b9302bdc3ap19 -0x1.eb4784e02p6 0x1.48ba57a38ec86p5 0x1.abbedc5003113p4 0x1.ca7b28p-8 F +REG epsg:28192 3 OK -0x1.5ae9f1149363dp18 0x1.9e7380551d828p20 -0x1.7730e1b3ep6 0x1.d554aded1c5f5p4 0x1.25df6e2d23736p5 0x1.3edafp-9 F +REG epsg:28192 4 OK 0x1.539c21210df22p19 0x1.9e78143fa57e4p20 -0x1.08d84e3a78p7 0x1.48ba57a475d93p5 0x1.25df6e2cf1619p5 0x1.9b5578p-9 F +REG epsg:28193 0 OK 0x1.4c61b461d87b6p17 0x1.131af91d52878p20 -0x1.af0119d09p6 0x1.19b2574d476cdp5 0x1.fbbedc552449ep4 0x1.1d2e28p-8 F +REG epsg:28193 1 OK -0x1.94bf7108b8f57p18 0x1.1e31fbde83b6cp19 -0x1.3ee56ed4bp6 0x1.d5549fa367d35p4 0x1.abbedbf77c0bep4 0x1.973a64p-8 F +REG epsg:28193 2 OK 0x1.7099cccb40884p19 0x1.1e3b8a01e8f6ep19 -0x1.eb4784e02p6 0x1.48ba5ec7469c6p5 0x1.abbedbf72c43dp4 0x1.cdf338p-8 F +REG epsg:28193 3 OK -0x1.5a55b4b6c66fbp18 0x1.9e737d70952bep20 -0x1.7730e1b3ep6 0x1.d5549a4f52662p4 0x1.25df6ead11094p5 0x1.378bf8p-9 F +REG epsg:28193 4 OK 0x1.53521ae6583cp19 0x1.9e78115c93067p20 -0x1.08d84e3a78p7 0x1.48ba616e33bcap5 0x1.25df6eac6f9e1p5 0x1.a3ff58p-9 F +REG epsg:2820 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:2820 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:2820 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:2820 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:2820 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:2821 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:2821 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:2821 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:2821 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:2821 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:2822 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:2822 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:2822 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:2822 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:2822 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:2823 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:2823 1 OK -0x1.24fce93763534p18 -0x1.047d0f0ecdd7cp19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:2823 2 OK 0x1.b776749bb1a9p19 -0x1.047d0f0ecdd7dp19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:2823 3 OK -0x1.9bca10091ae7cp17 0x1.1a377ef14666fp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:2823 4 OK 0x1.8bea840246b96p19 0x1.1a377ef14666ep19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:28232 0 OK 0x1.e835a048fb95bp18 0x1.b99c1a73b3b4p22 -0x1.7d6c07242p5 0x1.2000000000001p3 -0x1.9000000000003p4 -0x1.0p-29 F +REG epsg:28232 1 OK -0x1.fd1c200a9fbap14 0x1.9705a473eebdap22 -0x1.6a544903ep5 0x1.bdd68fcf51a36p1 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:28232 2 OK 0x1.f81e81331f3ap19 0x1.9705a47431788p22 -0x1.cc45a336cp5 0x1.d08a5c0c2b973p3 -0x1.dfffffffffffcp4 0x1.0p-29 F +REG epsg:28232 3 OK -0x1.302572abb075p16 0x1.dacf1adac81bdp22 -0x1.1875abeb4p5 0x1.bdd68fcf51a33p1 -0x1.4p4 0x1.0p-29 F +REG epsg:28232 4 OK 0x1.071d2740d57dep20 0x1.dacf1adb079a2p22 -0x1.82bc029acp5 0x1.d08a5c0c2b96fp3 -0x1.4p4 0x0.0p0 F +REG epsg:2824 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:2824 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2824 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2824 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2824 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2825 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:2825 1 OK -0x1.99be00ac5ff96p18 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2825 2 OK 0x1.6e0100562ffcbp19 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2825 3 OK -0x1.60b5a122eb162p18 0x1.1676a4801012dp19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2825 4 OK 0x1.517cd091758b1p19 0x1.1676a4801012dp19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2826 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:2826 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2826 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2826 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2826 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2827 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:2827 1 OK 0x1.df55c7b8d8b04p17 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2827 2 OK 0x1.595b4708e4eap20 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2827 3 OK 0x1.28b35fb7a28a2p18 0x1.16772ec526b59p19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2827 4 OK 0x1.4b192812175d8p20 0x1.16772ec526b59p19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2828 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:2828 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2828 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2828 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2828 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2829 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:2829 1 OK -0x1.5221cfa7d36a2p18 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2829 2 OK 0x1.9d34e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2829 3 OK -0x1.0266eb5117679p18 0x1.19530345ad8e5p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2829 4 OK 0x1.755775a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2830 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:2830 1 OK -0x1.e0f39f4fa6d44p17 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2830 2 OK 0x1.ce08e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2830 3 OK -0x1.417dd6a22ecf2p17 0x1.19530345ad8e5p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2830 4 OK 0x1.a62b75a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2831 0 OK 0x1.24f8p18 0x1.77ef514292013p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:2831 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:2831 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:2831 3 OK 0x1.7379e78330bbep17 0x1.388171947289dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:2831 4 OK 0x1.90330c3e67a21p18 0x1.388171947289dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:2832 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:2832 1 OK 0x1.86e3d47c2716ep18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:2832 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:2832 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2832 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2833 0 OK 0x1.24f8p19 0x1.8a66ee530ab8dp16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:2833 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:2833 2 OK 0x1.8b2e86753449dp19 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:2833 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:2833 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:2834 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:2834 1 OK 0x1.65d7a1966c1d2p18 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:2834 2 OK 0x1.97042f34c9f0dp19 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:2834 3 OK 0x1.7366a7cc5f285p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:2834 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:28348 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.a400000000001p6 -0x1.9p4 0x0.0p0 F +REG epsg:28348 1 OK -0x1.fbe5023e2acap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28348 2 OK 0x1.f8272811f1531p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28348 3 OK -0x1.2fd8271ed49bp16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28348 4 OK 0x1.07218271ed47ep20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ba114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28349 0 OK 0x1.e848000000042p18 0x1.b997b102aac2p22 0x0.0p0 0x1.bcp6 -0x1.9p4 0x0.0p0 F +REG epsg:28349 1 OK -0x1.fbe5023e2a4cp14 0x1.97014c7538ba8p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28349 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28349 3 OK -0x1.2fd8271ed4788p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28349 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.d2114b818572dp6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2835 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:2835 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:2835 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:2835 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:2835 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:28350 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.d4p6 -0x1.9p4 0x0.0p0 F +REG epsg:28350 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28350 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28350 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28350 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ea114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28351 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.ec00000000001p6 -0x1.9p4 0x0.0p0 F +REG epsg:28351 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28351 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28351 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28351 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28352 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.02p7 -0x1.9p4 0x0.0p0 F +REG epsg:28352 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28352 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28352 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28352 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28353 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.0ep7 -0x1.9p4 0x0.0p0 F +REG epsg:28353 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28353 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28353 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28353 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28354 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.1ap7 -0x1.9p4 0x0.0p0 F +REG epsg:28354 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28354 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28354 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28354 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28355 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.26p7 -0x1.9p4 0x0.0p0 F +REG epsg:28355 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28355 2 OK 0x1.f8272811f156fp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28355 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28355 4 OK 0x1.07218271ed4ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28356 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.32p7 -0x1.9p4 0x0.0p0 F +REG epsg:28356 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28356 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28356 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28356 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28357 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.3ep7 -0x1.9p4 0x0.0p0 F +REG epsg:28357 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:28357 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28357 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28357 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28358 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.4ap7 -0x1.9p4 0x0.0p0 F +REG epsg:28358 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28358 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:28358 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:28358 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2836 0 OK 0x1.24f8p19 0x1.7ed816e9b443ap16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:2836 1 OK 0x1.8562e4192a9e6p18 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:2836 2 OK 0x1.873e8df36ab0dp19 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:2836 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5de8p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:2836 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5de8p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:2837 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:2837 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:2837 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:2837 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:2837 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:2838 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:2838 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:2838 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:2838 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:2838 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:2839 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:2839 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:2839 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:2839 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:2839 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:2840 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:2840 1 OK -0x1.e6349b6f89f4cp18 -0x1.0508c5f7d2c1cp19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:2840 2 OK 0x1.54c24db7c4fbp19 -0x1.0508c5f7d2c1bp19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:2840 3 OK -0x1.9359a05eb2813p18 0x1.19b7b45ee2b01p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:2840 4 OK 0x1.2b54d02f59412p19 0x1.19b7b45ee2b02p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:28402 0 OK 0x1.3130af5945f0fp21 0x1.6e5d35b8097aep6 -0x1.b308a6078p6 0x1.1ffffffffc7fcp3 -0x1.0bbcf0681ce59p-34 0x1.f1fp-14 T +REG epsg:28402 1 OK 0x1.dad5304963db5p20 -0x1.0ef4dd166c5bcp19 -0x1.008733ba68p7 0x1.00000001da634p2 -0x1.3fffffffdc811p2 0x1.f265p-14 F +REG epsg:28402 2 OK 0x1.74f6c4410f64ep21 -0x1.0ef4da205930fp19 -0x1.9d8a0f70bp6 0x1.bfffffff14673p3 -0x1.3fffffffeeca5p2 0x1.f3b6p-14 F +REG epsg:28402 3 OK 0x1.dad548c45fe2ep20 0x1.0f0bcc2741636p19 -0x1.c8994a67cp6 0x1.00000001c7ef1p2 0x1.3fffffffcdcc8p2 0x1.ee0ap-14 F +REG epsg:28402 4 OK 0x1.74f6bcbc7a135p21 0x1.0f0bb65f4a753p19 -0x1.65155b301p6 0x1.bfffffff0b75cp3 0x1.3fffffffbbd09p2 0x1.e49cp-14 F +REG epsg:28403 0 OK 0x1.ab42aa57dfd29p21 0x1.6d6bcd4a9ceefp6 -0x1.77189b31fp6 0x1.dffffffffa553p3 -0x1.baf3683900cc4p-34 0x1.eeaap-14 T +REG epsg:28403 1 OK 0x1.677c9cc5bd6ffp21 -0x1.0ef4b77140cf8p19 -0x1.c55b3050bp6 0x1.40000000ead5ap3 -0x1.3fffffffe78c2p2 0x1.f3b8p-14 F +REG epsg:28403 2 OK 0x1.ef08b411347ecp21 -0x1.0ef4baa37889ep19 -0x1.6245fca59p6 0x1.3fffffff89269p4 -0x1.3ffffffff990fp2 0x1.f26p-14 F +REG epsg:28403 3 OK 0x1.677caa8f1f449p21 0x1.0f0b9d93dcf4p19 -0x1.8ce646419p6 0x1.40000000e1b9ap3 0x1.3fffffffc2f4ep2 0x1.e8dep-14 F +REG epsg:28403 4 OK 0x1.ef08ae18a5ad4p21 0x1.0f0b81a3a2cc5p19 -0x1.29d1b62bp6 0x1.3fffffff84d1cp4 0x1.3fffffffb180dp2 0x1.dd05p-14 F +REG epsg:28404 0 OK 0x1.12aa4c6ad753ap22 0x1.6c051c7d5a47ap6 -0x1.3bbf9776p6 0x1.4ffffffffc356p4 -0x1.32a7c92ec86fep-33 0x1.e9ebp-14 T +REG epsg:28404 1 OK 0x1.e18e94d12a0bdp21 -0x1.0ef495f651c79p19 -0x1.89b2d54f3p6 0x1.00000000744cbp4 -0x1.3ffffffff278cp2 0x1.f367p-14 F +REG epsg:28404 2 OK 0x1.348d4bc017601p22 -0x1.0ef49f2527862p19 -0x1.2822ad974p6 0x1.9fffffff883cbp4 -0x1.400000000403bp2 0x1.ef9fp-14 F +REG epsg:28404 3 OK 0x1.e18ea41b738a3p21 0x1.0f0b6baa84e9bp19 -0x1.513e41dp6 0x1.000000006fda7p4 0x1.3fffffffb8651p2 0x1.e23p-14 F +REG epsg:28404 4 OK 0x1.348d49845b36p22 0x1.0f0b49bdaf2e8p19 -0x1.df5ded54p5 0x1.9fffffff84187p4 0x1.3fffffffa7a74p2 0x1.d441p-14 F +REG epsg:28405 0 OK 0x1.4fb33d81e9c8dp22 0x1.6a2d118fde25ep6 -0x1.01a40f9d1p6 0x1.affffffffb6a5p4 -0x1.8479cdd1b311fp-33 0x1.e3f3p-14 T +REG epsg:28405 1 OK 0x1.2dd0402ea6cddp22 -0x1.0ef4790384b3cp19 -0x1.4ebcaa025p6 0x1.60000000734a7p4 -0x1.3ffffffffd269p2 0x1.f192p-14 F +REG epsg:28405 2 OK 0x1.7196376f11744p22 -0x1.0ef487f2810b7p19 -0x1.df866456ap5 0x1.ffffffff877fbp4 -0x1.400000000e028p2 0x1.ebb7p-14 F +REG epsg:28405 3 OK 0x1.2dd0488ca5898p22 0x1.0f0b36f738154p19 -0x1.16488fb2cp6 0x1.600000006f005p4 0x1.3fffffffae39dp2 0x1.da2ap-14 F +REG epsg:28405 4 OK 0x1.719635ec4c7f4p22 0x1.0f0b0f4a38ecfp19 -0x1.6ea055ffp5 0x1.ffffffff8396fp4 0x1.3fffffff9e5dp2 0x1.caa1p-14 F +REG epsg:28406 0 OK 0x1.8cbc289afb7efp22 0x1.67e8d8a93528dp6 -0x1.92d1fb5f8p5 0x1.07fffffffd695p5 -0x1.d20a450caa51bp-33 0x1.dcfap-14 T +REG epsg:28406 1 OK 0x1.6ad92fd1c57bfp22 -0x1.0ef460ea08dccp19 -0x1.151e0dea6p6 0x1.c0000000726e9p4 -0x1.4000000007757p2 0x1.ee6dp-14 F +REG epsg:28406 2 OK 0x1.ae9f1d4e8694cp22 -0x1.0ef4754c937f8p19 -0x1.738b4d7ecp5 0x1.2fffffffc37b4p5 -0x1.40000000176e8p2 0x1.e6e5p-14 F +REG epsg:28406 3 OK 0x1.6ad938defdea6p22 0x1.0f0b000dc7353p19 -0x1.b9551c2b2p5 0x1.c00000006e58dp4 0x1.3fffffffa48cap2 0x1.d118p-14 F +REG epsg:28406 4 OK 0x1.ae9f1c7b1e069p22 0x1.0f0ad2ed31b09p19 -0x1.02a6db39cp5 0x1.2fffffffc1aa8p5 0x1.3fffffff95b93p2 0x1.c06ep-14 F +REG epsg:28407 0 OK 0x1.c9c50df0aee21p22 0x1.653ecd53f6ce3p6 -0x1.27582fbd8p5 0x1.37fffffffd3a7p5 -0x1.0d3fd0be14e2p-32 0x1.d553p-14 T +REG epsg:28407 1 OK 0x1.a7e2197fd8644p22 -0x1.0ef44ded73cbfp19 -0x1.baf1394c2p5 0x1.1000000038e13p5 -0x1.4000000011463p2 0x1.ea29p-14 F +REG epsg:28407 2 OK 0x1.eba7fda7c09f5p22 -0x1.0ef46767aa68bp19 -0x1.0d82f177cp5 0x1.5fffffffc352fp5 -0x1.40000000202a7p2 0x1.e173p-14 F +REG epsg:28407 3 OK 0x1.a7e22330becb5p22 0x1.0f0ac788365b7p19 -0x1.4a0badcb4p5 0x1.1000000036f63p5 0x1.3fffffff9b768p2 0x1.c73ep-14 F +REG epsg:28407 4 OK 0x1.eba7fd782dd6dp22 0x1.0f0a954fe7a25p19 -0x1.3940a69fp4 0x1.5fffffffc1aadp5 0x1.3fffffff8dd05p2 0x1.b60dp-14 F +REG epsg:28408 0 OK 0x1.0366f6e6e8034p23 0x1.623668a7cb3e6p6 -0x1.841058d8p4 0x1.67fffffffd2a7p5 -0x1.2e875424d023dp-32 0x1.cd5p-14 T +REG epsg:28408 1 OK 0x1.e4eafd777be63p22 -0x1.0ef4404303d74p19 -0x1.50d0d162cp5 0x1.4000000038a5dp5 -0x1.400000001a79ep2 0x1.e519p-14 F +REG epsg:28408 2 OK 0x1.14586c69c3c93p23 -0x1.0ef45e6abbdafp19 -0x1.5d16f79a8p4 0x1.8fffffffc3485p5 -0x1.400000002819bp2 0x1.dbb2p-14 F +REG epsg:28408 3 OK 0x1.e4eb07beb97e8p22 0x1.0f0a8e050cf0bp19 -0x1.bfd9ea564p4 0x1.4000000036dffp5 0x1.3fffffff930dep2 0x1.bcf1p-14 F +REG epsg:28408 4 OK 0x1.14586c9d3c386p23 0x1.0f0a571f2a91cp19 -0x1.ed57255ep2 0x1.8fffffffc1cd5p5 0x1.3fffffff86b5ep2 0x1.abd9p-14 F +REG epsg:28409 0 OK 0x1.21eb64464165dp23 0x1.5ed82c52758afp6 -0x1.8ff85f6p3 0x1.97fffffffd3a6p5 -0x1.4c7e552f9e204p-32 0x1.c54ep-14 T +REG epsg:28409 1 OK 0x1.10f9ee03a8ddbp23 -0x1.0ef438110ae8fp19 -0x1.da0916cf4p4 0x1.7000000038878p5 -0x1.4000000022f34p2 0x1.df85p-14 F +REG epsg:28409 2 OK 0x1.32dcd79c943cep23 -0x1.0ef45a6efb4abp19 -0x1.5ebd18f88p3 0x1.bfffffffc35b2p5 -0x1.400000002f23p2 0x1.d5fcp-14 F +REG epsg:28409 3 OK 0x1.10f9f36af50d8p23 0x1.0f0a54259919p19 -0x1.f08a53798p3 0x1.7000000036ecp5 0x1.3fffffff8b66ep2 0x1.b297p-14 F +REG epsg:28409 4 OK 0x1.32dcd813d2604p23 0x1.0f0a1909674b6p19 0x1.92f1ca28p1 0x1.bfffffffc2117p5 0x1.3fffffff8079ap2 0x1.a233p-14 F +REG epsg:2841 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:2841 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda99882p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:2841 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda99882p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:2841 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e36p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:2841 4 OK 0x1.8670ba72bc014p19 0x1.3052f091f3e36p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:28410 0 OK 0x1.406fcf4aa2fd1p23 0x1.5b2d8abb3c4c4p6 -0x1.c8363d2p0 0x1.c7fffffffd695p5 -0x1.66d0c8670396fp-32 0x1.bda6p-14 T +REG epsg:28410 1 OK 0x1.2f7e5ac6922dp23 -0x1.0ef4356e83206p19 -0x1.21489c774p4 0x1.a00000003886ep5 -0x1.400000002a973p2 0x1.d9bfp-14 F +REG epsg:28410 2 OK 0x1.516140a6a9d42p23 -0x1.0ef45b7f92f61p19 -0x1.3c3db9a8p0 0x1.efffffffc389cp5 -0x1.40000000352f2p2 0x1.d09cp-14 F +REG epsg:28410 3 OK 0x1.2f7e60694fbe1p23 0x1.0f0a1a8c2b54cp19 -0x1.fc46e74ep1 0x1.a00000003719cp5 0x1.3fffffff84938p2 0x1.a88ap-14 F +REG epsg:28410 4 OK 0x1.51614159737acp23 0x1.0f09dbbcbe70fp19 0x1.9be8671dp3 0x1.efffffffc275p5 0x1.3fffffff7b2abp2 0x1.9975p-14 F +REG epsg:28411 0 OK 0x1.5ef4382ee7137p23 0x1.5740cc83a554p6 0x1.f1e47d2ap2 0x1.f7fffffffdb4fp5 -0x1.7d34d9bed395fp-32 0x1.b6adp-14 T +REG epsg:28411 1 OK 0x1.4e02c53a6fecap23 -0x1.0ef43862ce78cp19 -0x1.e5997b08p2 0x1.d000000038a34p5 -0x1.40000000314d3p2 0x1.d41ep-14 F +REG epsg:28411 2 OK 0x1.6fe5a7c86ab57p23 -0x1.0ef4619984aa1p19 0x1.d012c341p2 0x1.0fffffffe1e8ap6 -0x1.400000003a29ep2 0x1.cbdep-14 F +REG epsg:28411 3 OK 0x1.4e02cb0fbc28p23 0x1.0f09e1da4f50fp19 0x1.a153735bp2 0x1.d00000003768dp5 0x1.3fffffff7ea3bp2 0x1.9f23p-14 F +REG epsg:28411 4 OK 0x1.6fe5a8addeb0ap23 0x1.0f099fe51c2b1p19 0x1.55b7c8814p4 0x1.0fffffffe17a3p6 0x1.3fffffff76d3cp2 0x1.91f5p-14 F +REG epsg:28412 0 OK 0x1.7d789f33ddc79p23 0x1.531cf3afd7cbdp6 0x1.014c4722p4 0x1.13ffffffff0d4p6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:28412 1 OK 0x1.6c872d9bb19cfp23 -0x1.0ef440e5a2293p19 0x1.bc6c7294p0 0x1.000000001c6d3p6 -0x1.4000000036fe9p2 0x1.ceeep-14 F +REG epsg:28412 2 OK 0x1.8e6a0d4796662p23 -0x1.0ef46cabb239cp19 0x1.ccfc8c3d8p3 0x1.27ffffffe216cp6 -0x1.400000003e031p2 0x1.c801p-14 F +REG epsg:28412 3 OK 0x1.6c87339a1c029p23 0x1.0f09aaaf06e55p19 0x1.fafa6a1p3 0x1.000000001beb1p6 0x1.3fffffff79a49p2 0x1.96c9p-14 F +REG epsg:28412 4 OK 0x1.8e6a0e564570ep23 0x1.0f09662a5611p19 0x1.c82c33684p4 0x1.27ffffffe1c5bp6 0x1.3fffffff737fp2 0x1.8bf9p-14 F +REG epsg:28413 0 OK 0x1.9bfd049f97455p23 0x1.4ecd9cc7863f7p6 0x1.70818d5c8p4 0x1.2bffffffff4abp6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:28413 1 OK 0x1.8b0b942c96b1cp23 -0x1.0ef44edf1df97p19 0x1.3938e4c3p3 0x1.180000001c94ap6 -0x1.400000003b98fp2 0x1.ca76p-14 F +REG epsg:28413 2 OK 0x1.acee716e822e9p23 -0x1.0ef47c970d8eep19 0x1.4267d52c8p4 0x1.3fffffffe24cep6 -0x1.4000000040ad6p2 0x1.c53fp-14 F +REG epsg:28413 3 OK 0x1.8b0b9a4a3b71cp23 0x1.0f0975a50c35cp19 0x1.7e4dd6398p4 0x1.180000001c2eep6 0x1.3fffffff75a12p2 0x1.8fc1p-14 F +REG epsg:28413 4 OK 0x1.acee729c89636p23 0x1.0f092f2e54891p19 0x1.120839ccp5 0x1.3fffffffe219fp6 0x1.3fffffff71339p2 0x1.87bdp-14 F +REG epsg:28414 0 OK 0x1.ba8168bc9f498p23 0x1.4a5ede45ed732p6 0x1.c8e10c6a8p4 0x1.43ffffffff8ffp6 -0x1.a691e019f05bap-32 0x1.a8aep-14 T +REG epsg:28414 1 OK 0x1.a98ff93474c76p23 -0x1.0ef462280f43bp19 0x1.07b14d7d8p4 0x1.300000001cc5ep6 -0x1.400000003f0cap2 0x1.c6f4p-14 F +REG epsg:28414 2 OK 0x1.cb72d48b48a57p23 -0x1.0ef4912eefce8p19 0x1.86bf9696p4 0x1.57ffffffe2886p6 -0x1.40000000421ffp2 0x1.c3b8p-14 F +REG epsg:28414 3 OK 0x1.a98fff67187e9p23 0x1.0f0943511fd52p19 0x1.e95d79248p4 0x1.300000001c7dcp6 0x1.3fffffff72a23p2 0x1.8a57p-14 F +REG epsg:28414 4 OK 0x1.cb72d5ce6d388p23 0x1.0f08fb8b4ccbbp19 0x1.34316849ap5 0x1.57ffffffe274p6 0x1.3fffffff6ff63p2 0x1.8564p-14 F +REG epsg:28415 0 OK 0x1.d905cbd92c14ap23 0x1.45dd26b42e0c5p6 0x1.04b9750fp5 0x1.5bffffffffda2p6 -0x1.ab403431476cdp-32 0x1.a702p-14 T +REG epsg:28415 1 OK 0x1.c8145cfeef955p23 -0x1.0ef47a8a5eeccp19 0x1.5bd905cf4p4 0x1.480000001cfe2p6 -0x1.40000000414ddp2 0x1.c494p-14 F +REG epsg:28415 2 OK 0x1.e9f736eeeea98p23 -0x1.0ef4aa399698ap19 0x1.b2c5dd98cp4 0x1.6fffffffe2c5fp6 -0x1.400000004255fp2 0x1.c37cp-14 F +REG epsg:28415 3 OK 0x1.c814633c1bff4p23 0x1.0f09144067adbp19 0x1.1ebfecdecp5 0x1.480000001cd46p6 0x1.3fffffff70aeap2 0x1.86bep-14 F +REG epsg:28415 4 OK 0x1.e9f7383cba996p23 0x1.0f08cbd210809p19 0x1.4a31d65b4p5 0x1.6fffffffe2d09p6 0x1.3fffffff6fc99p2 0x1.8511p-14 F +REG epsg:28416 0 OK 0x1.f78a2e464318fp23 0x1.415519cd00c9dp6 0x1.18c107564p5 0x1.740000000026p6 -0x1.ab40342ee8834p-32 0x1.a703p-14 T +REG epsg:28416 1 OK 0x1.e698bfdb24d24p23 -0x1.0ef497c1a91aep19 0x1.98279585cp4 0x1.600000001d3a9p6 -0x1.4000000042554p2 0x1.c37ap-14 F +REG epsg:28416 2 OK 0x1.043dcc764018cp24 -0x1.0ef4c770c607dp19 0x1.c5ff3187cp4 0x1.87ffffffe3025p6 -0x1.40000000414e6p2 0x1.c497p-14 F +REG epsg:28416 3 OK 0x1.e698c61846203p23 0x1.0f08e8f6e33b5p19 0x1.3ce480982p5 0x1.600000001d2fbp6 0x1.3fffffff6fca1p2 0x1.850dp-14 F +REG epsg:28416 4 OK 0x1.043dcd1d2fce9p24 0x1.0f08a08877afp19 0x1.53cbcf428p5 0x1.87ffffffe32bdp6 0x1.3fffffff70adfp2 0x1.86bep-14 F +REG epsg:28417 0 OK 0x1.0b07482b6ae45p24 0x1.3cd36d0b752bdp6 0x1.204f103bep5 0x1.8c00000000702p6 -0x1.a691e01532885p-32 0x1.a8b2p-14 T +REG epsg:28417 1 OK 0x1.028e910d672c8p24 -0x1.0ef4b97bfd00bp19 0x1.bbf3d986p4 0x1.780000001d782p6 -0x1.40000000421f7p2 0x1.c3b5p-14 F +REG epsg:28417 2 OK 0x1.137ffd6c13b6cp24 -0x1.0ef4e8828da81p19 0x1.c035a801cp4 0x1.9fffffffe33acp6 -0x1.400000003f0dp2 0x1.c6f6p-14 F +REG epsg:28417 3 OK 0x1.028e9426a86ddp24 0x1.0f08c1edf96f3p19 0x1.4ec7edc54p5 0x1.780000001d8c1p6 0x1.3fffffff6ff68p2 0x1.8564p-14 F +REG epsg:28417 4 OK 0x1.137ffe0dc31f3p24 0x1.0f087a27e976p19 0x1.50e4655bp5 0x1.9fffffffe3829p6 0x1.3fffffff72a1dp2 0x1.8a58p-14 F +REG epsg:28418 0 OK 0x1.1a49792f6c80fp24 0x1.3864c408098e7p6 0x1.1b4e5f8cp5 0x1.a400000000b58p6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:28418 1 OK 0x1.11d0c208ae7eap24 -0x1.0ef4df5ac2a6p19 0x1.c6d96bacp4 0x1.900000001db38p6 -0x1.4000000040acap2 0x1.c53fp-14 F +REG epsg:28418 2 OK 0x1.22c22e832062ap24 -0x1.0ef50d122e3cdp19 0x1.a1797c24p4 0x1.b7ffffffe36bfp6 -0x1.400000003b999p2 0x1.ca77p-14 F +REG epsg:28418 3 OK 0x1.11d0c51765673p24 0x1.0f089f9324494p19 0x1.543808ebep5 0x1.900000001de62p6 0x1.3fffffff7133bp2 0x1.87bfp-14 F +REG epsg:28418 4 OK 0x1.22c22f1a542d1p24 0x1.0f08591c07a41p19 0x1.4183bd9ecp5 0x1.b7ffffffe3d15p6 0x1.3fffffff75a0cp2 0x1.8fc4p-14 F +REG epsg:28419 0 OK 0x1.298baa592cd1cp24 0x1.34158d07f56f1p6 0x1.09ccfd192p5 0x1.bc00000000f2cp6 -0x1.8f6bbc19f56bep-32 0x1.b0bp-14 T +REG epsg:28419 1 OK 0x1.2112f3098749ap24 -0x1.0ef508f3c4276p19 0x1.b8b9bc51p4 0x1.a80000001de9cp6 -0x1.400000003e023p2 0x1.c803p-14 F +REG epsg:28419 2 OK 0x1.32045fe537262p24 -0x1.0ef534b91dd34p19 0x1.6a20e103p4 0x1.cfffffffe393ap6 -0x1.4000000036ff7p2 0x1.ceefp-14 F +REG epsg:28419 3 OK 0x1.2112f6089675dp24 0x1.0f088246bddeep19 0x1.4d2591bbap5 0x1.a80000001e3abp6 0x1.3fffffff737f4p2 0x1.8bf6p-14 F +REG epsg:28419 4 OK 0x1.3204606cd1689p24 0x1.0f083dc180ebbp19 0x1.25d4f8cd2p5 0x1.cfffffffe415ap6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:2842 0 OK 0x1.24f8p19 0x1.c069e4aef592fp16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:2842 1 OK 0x1.614d92de92fd1p18 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:2842 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:2842 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:2842 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:28420 0 OK 0x1.38cddbd2486fbp24 0x1.2ff1de21f173ap6 0x1.d7f802c48p4 0x1.d400000001258p6 -0x1.7d34d9c5f0528p-32 0x1.b6acp-14 T +REG epsg:28420 1 OK 0x1.3055243a00dbdp24 -0x1.0ef535d257872p19 0x1.91bc68028p4 0x1.c00000001e182p6 -0x1.400000003a291p2 0x1.cbdep-14 F +REG epsg:28420 2 OK 0x1.414691bb569edp24 -0x1.0ef55f082746ep19 0x1.1ac70ffbp4 0x1.e7ffffffe3af6p6 -0x1.40000000314dep2 0x1.d422p-14 F +REG epsg:28420 3 OK 0x1.3055272476cf9p24 0x1.0f086a5af22d9p19 0x1.39a45dd72p5 0x1.c00000001e864p6 0x1.3fffffff76d4p2 0x1.91f3p-14 F +REG epsg:28420 4 OK 0x1.4146922e652f5p24 0x1.0f0828650cff6p19 0x1.fc4b74fcp4 0x1.e7ffffffe44c4p6 0x1.3fffffff7ea3cp2 0x1.9f2ap-14 F +REG epsg:28421 0 OK 0x1.48100dc37d6e8p24 0x1.2c05535a26509p6 0x1.845e17d3cp4 0x1.ec000000014b6p6 -0x1.66d0c86245c3cp-32 0x1.bda9p-14 T +REG epsg:28421 1 OK 0x1.3f9755c3a4f7dp24 -0x1.0ef56578a5cb2p19 0x1.524ec86bp4 0x1.d80000001e3cp6 -0x1.40000000352dfp2 0x1.d09dp-14 F +REG epsg:28421 2 OK 0x1.5088c42d380a9p24 -0x1.0ef58b88a2155p19 0x1.68952acdp3 0x1.ffffffffe3bdcp6 -0x1.400000002a98ap2 0x1.d9bdp-14 F +REG epsg:28421 3 OK 0x1.3f975894c9fbbp24 0x1.0f085812d8ad7p19 0x1.19eb21306p5 0x1.d80000001ec65p6 0x1.3fffffff7b2a9p2 0x1.9973p-14 F +REG epsg:28421 4 OK 0x1.5088c487025e4p24 0x1.0f081942956f3p19 0x1.95ca9ed6cp4 0x1.ffffffffe473fp6 0x1.3fffffff84943p2 0x1.a889p-14 F +REG epsg:28422 0 OK 0x1.57524054391d8p24 0x1.285aee1438787p6 0x1.19b6b171p4 0x1.0200000000b15p7 -0x1.4c7e5531fd09ap-32 0x1.c55p-14 T +REG epsg:28422 1 OK 0x1.4ed987cf035a8p24 -0x1.0ef597610bd72p19 0x1.f6458361p3 0x1.f00000001e535p6 -0x1.400000002f21cp2 0x1.d5fcp-14 F +REG epsg:28422 2 OK 0x1.5fcaf760dfe39p24 -0x1.0ef5b9bdbf127p19 0x1.be5704ecp1 0x1.0bfffffff1deep7 -0x1.4000000022f46p2 0x1.df87p-14 F +REG epsg:28422 3 OK 0x1.4ed98a8266b6ap24 0x1.0f084ba1b828fp19 0x1.dca5a952cp4 0x1.f00000001ef81p6 0x1.3fffffff8079ap2 0x1.a232p-14 F +REG epsg:28422 4 OK 0x1.5fcaf79cf44bdp24 0x1.0f0810848da07p19 0x1.1946eaba8p4 0x1.0bfffffff245ap7 0x1.3fffffff8b67bp2 0x1.b297p-14 F +REG epsg:28423 0 OK 0x1.669473aa29788p24 0x1.24fcf636aa084p6 0x1.3259de8fp3 0x1.0e00000000b55p7 -0x1.2e8754201250cp-32 0x1.cd51p-14 T +REG epsg:28423 1 OK 0x1.5e1bba833ffdcp24 -0x1.0ef5caff9121cp19 0x1.1a599f58p3 0x1.040000000f2eap7 -0x1.4000000028183p2 0x1.dbb5p-14 F +REG epsg:28423 2 OK 0x1.6f0d2b7a3343ap24 -0x1.0ef5e925e660bp19 -0x1.656b8856p2 0x1.17fffffff1d77p7 -0x1.400000001a7b1p2 0x1.e51cp-14 F +REG epsg:28423 3 OK 0x1.5e1bbd14c46dep24 0x1.0f08452a76e9cp19 0x1.6eab792ccp4 0x1.040000000f8d5p7 0x1.3fffffff86b5ap2 0x1.abdbp-14 F +REG epsg:28423 4 OK 0x1.6f0d2b947364ep24 0x1.0f080e437bba1p19 0x1.103b2051p3 0x1.17fffffff248cp7 0x1.3fffffff930eap2 0x1.bcf3p-14 F +REG epsg:28424 0 OK 0x1.75d6a7e8d37d3p24 0x1.21f4dd5610fbfp6 0x1.0a5473ap-2 0x1.1a00000000b16p7 -0x1.0d3fd0c073cb7p-32 0x1.d555p-14 T +REG epsg:28424 1 OK 0x1.6d5dee05a5559p24 -0x1.0ef5ffc3702efp19 0x1.342b0a2p-1 0x1.100000000f2cp7 -0x1.400000002028ep2 0x1.e171p-14 F +REG epsg:28424 2 OK 0x1.7e4f609a933b3p24 -0x1.0ef6193c22d1cp19 -0x1.fb1f39208p3 0x1.23fffffff1c8bp7 -0x1.400000001147dp2 0x1.ea2ep-14 F +REG epsg:28424 3 OK 0x1.6d5df0718c936p24 0x1.0f0844bf38cebp19 0x1.d63847928p3 0x1.100000000f961p7 0x1.3fffffff8dcfcp2 0x1.b60bp-14 F +REG epsg:28424 4 OK 0x1.7e4f608f3f99cp24 0x1.0f081285b3d11p19 -0x1.c1a50a9p0 0x1.23fffffff2437p7 0x1.3fffffff9b77fp2 0x1.c73ep-14 F +REG epsg:28425 0 OK 0x1.8518dd312f8f2p24 0x1.1f4b2438f27b9p6 -0x1.47647134p3 0x1.2600000000a5ap7 -0x1.d20a450caa51bp-33 0x1.dcfbp-14 T +REG epsg:28425 1 OK 0x1.7ca022793bbd6p24 -0x1.0ef63518ac822p19 -0x1.1c1d6a28p3 0x1.1c0000000f222p7 -0x1.40000000176cbp2 0x1.e6e5p-14 F +REG epsg:28425 2 OK 0x1.8d9196e07f348p24 -0x1.0ef6497996b8dp19 -0x1.b306c4664p4 0x1.2ffffffff1b35p7 -0x1.400000000777ap2 0x1.ee6bp-14 F +REG epsg:28425 3 OK 0x1.7ca024bc30ffcp24 0x1.0f084a612c5ccp19 0x1.4da28d3dp2 0x1.1c0000000f964p7 0x1.3fffffff95b8p2 0x1.c071p-14 F +REG epsg:28425 4 OK 0x1.8d9196ac41b7ap24 0x1.0f081d3f4616ep19 -0x1.a32848ed8p3 0x1.2ffffffff235fp7 0x1.3fffffffa48e2p2 0x1.d11bp-14 F +REG epsg:28426 0 OK 0x1.945b13a14cfffp24 0x1.1d0742fe84bb7p6 -0x1.5c8ee79fp4 0x1.320000000092dp7 -0x1.8479cddb2eb7ep-33 0x1.e3f3p-14 T +REG epsg:28426 1 OK 0x1.8be257fe6737fp24 -0x1.0ef66a69b196ap19 -0x1.3839ea6e8p4 0x1.280000000f113p7 -0x1.400000000e007p2 0x1.ebbap-14 F +REG epsg:28426 2 OK 0x1.9cd3ce673f69ep24 -0x1.0ef67956f61a9p19 -0x1.3be1b32cp5 0x1.3bfffffff198p7 -0x1.3ffffffffd28bp2 0x1.f193p-14 F +REG epsg:28426 3 OK 0x1.8be25a15888b3p24 0x1.0f085600875b8p19 -0x1.5b16420cp2 0x1.280000000f8e3p7 0x1.3fffffff9e5bbp2 0x1.ca9fp-14 F +REG epsg:28426 4 OK 0x1.9cd3ce0734b76p24 0x1.0f082e52203ep19 -0x1.9652f084cp4 0x1.3bfffffff2212p7 0x1.3fffffffae3b9p2 0x1.da32p-14 F +REG epsg:28427 0 OK 0x1.a39d4b53fdbf6p24 0x1.1b2f942b39a1ap6 -0x1.123320966p5 0x1.3e00000000797p7 -0x1.32a7c9254cc9dp-33 0x1.e9edp-14 T +REG epsg:28427 1 OK 0x1.9b248eb28c974p24 -0x1.0ef69f20f654ep19 -0x1.f30303dfp4 0x1.340000000ef9ap7 -0x1.4000000004014p2 0x1.efa4p-14 F +REG epsg:28427 2 OK 0x1.ac16074698601p24 -0x1.0ef6a84e0215fp19 -0x1.a4cedccbcp5 0x1.47fffffff177fp7 -0x1.3ffffffff27bp2 0x1.f369p-14 F +REG epsg:28427 3 OK 0x1.9b24909b72f31p24 0x1.0f08677cb306p19 -0x1.11912b674p4 0x1.340000000f7e4p7 0x1.3fffffffa7a5cp2 0x1.d44p-14 F +REG epsg:28427 4 OK 0x1.ac1606b857f62p24 0x1.0f08458e61b72p19 -0x1.341772f8ep5 0x1.47fffffff2062p7 0x1.3fffffffb8675p2 0x1.e232p-14 F +REG epsg:28428 0 OK 0x1.b2df84608b20ep24 0x1.19c942d5d992ep6 -0x1.7c83e3b38p5 0x1.4a000000005aap7 -0x1.baf3682609804p-34 0x1.eeabp-14 T +REG epsg:28428 1 OK 0x1.aa66c6afbf0aap24 -0x1.0ef6d2aaa06bbp19 -0x1.5e2f110f6p5 0x1.400000000edc9p7 -0x1.3ffffffff98e6p2 0x1.f25ep-14 F +REG epsg:28428 2 OK 0x1.bb58419288395p24 -0x1.0ef6d5db015d2p19 -0x1.09924aca6p6 0x1.53fffffff1546p7 -0x1.3fffffffe78edp2 0x1.f3bbp-14 F +REG epsg:28428 3 OK 0x1.aa66c868850f5p24 0x1.0f087ea4a7575p19 -0x1.daee470d8p4 0x1.400000000f673p7 0x1.3fffffffb17f3p2 0x1.dd03p-14 F +REG epsg:28428 4 OK 0x1.bb5840d42b2fep24 0x1.0f0862b2e1da9p19 -0x1.a26db6972p5 0x1.53fffffff1e61p7 0x1.3fffffffc2f78p2 0x1.e8e1p-14 F +REG epsg:28429 0 OK 0x1.c221beda7487fp24 0x1.18d83c2735ef1p6 -0x1.ec0f8e3eap5 0x1.560000000038p7 -0x1.0bbcf071988b7p-34 0x1.f1f1p-14 T +REG epsg:28429 1 OK 0x1.b9a9000c76f9fp24 -0x1.0ef7047622f6p19 -0x1.c90b43caep5 0x1.4c0000000ebb3p7 -0x1.3fffffffeec78p2 0x1.f3b3p-14 F +REG epsg:28429 2 OK 0x1.ca9a7d5b0e9e5p24 -0x1.0ef7017e31a22p19 -0x1.42d6b4223p6 0x1.5ffffffff12edp7 -0x1.3fffffffdc84p2 0x1.f267p-14 F +REG epsg:28429 3 OK 0x1.b9a90193be423p24 0x1.0f089b3774725p19 -0x1.58541025p5 0x1.4c0000000f4a4p7 0x1.3fffffffbbce8p2 0x1.e499p-14 F +REG epsg:28429 4 OK 0x1.ca9a7c6b34fccp24 0x1.0f08856de6899p19 -0x1.0a7b6629ep6 0x1.5ffffffff1c26p7 0x1.3fffffffcdcfbp2 0x1.ee0dp-14 F +REG epsg:2843 0 OK 0x1.24f8p19 0x1.c374b0c96a7e1p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:2843 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:2843 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:2843 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dce04p18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:2843 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dce04p18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:28430 0 OK 0x1.d163fad138b39p24 0x1.185f24552e34bp6 -0x1.2fcea2c8bp6 0x1.620000000012fp7 -0x1.665e69a78691ap-36 0x1.f39cp-14 T +REG epsg:28430 1 OK 0x1.c8eb3adb52fb8p24 -0x1.0ef733f7d3e41p19 -0x1.1c7532073p6 0x1.580000000e96bp7 -0x1.3fffffffe3ccdp2 0x1.f38p-14 F +REG epsg:28430 2 OK 0x1.d9dcbaabffd93p24 -0x1.0ef72abd2de94p19 -0x1.7d940bd7dp6 -0x1.640000000ef71p7 -0x1.3fffffffd17a7p2 0x1.ef6dp-14 F +REG epsg:28430 3 OK 0x1.c8eb3c3047f3bp24 0x1.0f08bce4f8a41p19 -0x1.c833a3718p5 0x1.580000000f28ep7 0x1.3fffffffc679p2 0x1.ead1p-14 F +REG epsg:28430 4 OK 0x1.d9dcb989d4723p24 0x1.0f08ad5e0946p19 -0x1.4538bb243p6 -0x1.640000000e634p7 0x1.3fffffffd8d27p2 0x1.f197p-14 F +REG epsg:28431 0 OK 0x1.e0a638502a42ap24 0x1.185f4f3803453p6 -0x1.6af478571p6 -0x1.620000000013p7 0x1.6623c281da0e3p-36 0x1.f39fp-14 T +REG epsg:28431 1 OK 0x1.d82d772ae396p24 -0x1.0ef760aa73b54p19 -0x1.564956839p6 0x1.640000000e70ep7 -0x1.3fffffffd8be5p2 0x1.f1a2p-14 F +REG epsg:28431 2 OK 0x1.e91ef98ce3a12p24 -0x1.0ef7512445d51p19 -0x1.b92591dbbp6 -0x1.580000000f1bcp7 -0x1.3fffffffc6915p2 0x1.eac3p-14 F +REG epsg:28431 3 OK 0x1.d82d784d3fcdcp24 0x1.0f08e34ec106p19 -0x1.1dee0bab3p6 0x1.640000000f044p7 0x1.3fffffffd1621p2 0x1.ef74p-14 F +REG epsg:28431 4 OK 0x1.e91ef8381e69p24 0x1.0f08da1348425p19 -0x1.80ca1a322p6 -0x1.580000000e894p7 0x1.3fffffffe3e09p2 0x1.f376p-14 F +REG epsg:28432 0 OK 0x1.efe8775e4feaep24 0x1.18d8bc8edd145p6 -0x1.a6d3629c1p6 -0x1.5600000000381p7 0x1.0bae46b1a910ap-34 0x1.f1fp-14 T +REG epsg:28432 1 OK 0x1.e76fb505825fep24 -0x1.0ef78a10a33a6p19 -0x1.915fdd8cfp6 -0x1.5ffffffff1b4dp7 -0x1.3fffffffcdbc1p2 0x1.ee12p-14 F +REG epsg:28432 2 OK 0x1.f8613a00dff43p24 -0x1.0ef77447c2295p19 -0x1.f4e432b3cp6 -0x1.4c0000000f3d7p7 -0x1.3fffffffbbe62p2 0x1.e491p-14 F +REG epsg:28432 3 OK 0x1.e76fb5f58d509p24 0x1.0f090e091248dp19 -0x1.590483dfap6 -0x1.5ffffffff121bp7 0x1.3fffffffdc6bap2 0x1.f26fp-14 F +REG epsg:28432 4 OK 0x1.f8613879c6cb4p24 0x1.0f090b10406a7p19 -0x1.bc887047p6 -0x1.4c0000000eadep7 0x1.3fffffffeedafp2 0x1.f3b1p-14 F +REG epsg:2844 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:2844 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:2844 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:2844 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:2844 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:2845 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:2845 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:2845 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:2845 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:2845 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:2846 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:2846 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:2846 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:2846 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:2846 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:28462 0 OK 0x1.e8657aca2f876p18 0x1.6e5d35b8097aep6 -0x1.b308a6078p6 0x1.1ffffffffc7fbp3 -0x1.0bbcf0681ce59p-34 0x1.f1fp-14 T +REG epsg:28462 1 OK -0x1.ae59f6d38496p15 -0x1.0ef4dd166c5bcp19 -0x1.008733ba68p7 0x1.00000001da634p2 -0x1.3fffffffdc811p2 0x1.f265p-14 F +REG epsg:28462 2 OK 0x1.01a588821ec9cp20 -0x1.0ef4da205930fp19 -0x1.9d8a0f70bp6 0x1.bfffffff14673p3 -0x1.3fffffffeeca5p2 0x1.f3b6p-14 F +REG epsg:28462 3 OK -0x1.ae56e77403a3p15 0x1.0f0bcc2741636p19 -0x1.c8994a67cp6 0x1.00000001c7ef2p2 0x1.3fffffffcdcc8p2 0x1.ee0ap-14 F +REG epsg:28462 4 OK 0x1.01a57978f426ap20 0x1.0f0bb65f4a753p19 -0x1.65155b301p6 0x1.bfffffff0b75cp3 0x1.3fffffffbbd09p2 0x1.e49cp-14 F +REG epsg:28463 0 OK 0x1.e86552befe949p18 0x1.6d6bcd4a9ceefp6 -0x1.77189b31fp6 0x1.dffffffffa553p3 -0x1.baf3683900cc4p-34 0x1.eeaap-14 T +REG epsg:28463 1 OK -0x1.ae58ce90a405p15 -0x1.0ef4b77140cf8p19 -0x1.c55b3050bp6 0x1.40000000ead5ap3 -0x1.3fffffffe78c2p2 0x1.f3b8p-14 F +REG epsg:28463 2 OK 0x1.01a5682268fd7p20 -0x1.0ef4baa37889ep19 -0x1.6245fca59p6 0x1.3fffffff89269p4 -0x1.3ffffffff990fp2 0x1.f26p-14 F +REG epsg:28463 3 OK -0x1.ae555c382edbp15 0x1.0f0b9d93dcf4p19 -0x1.8ce646419p6 0x1.40000000e1b9ap3 0x1.3fffffffc2f4ep2 0x1.e8dep-14 F +REG epsg:28463 4 OK 0x1.01a55c314b5a9p20 0x1.0f0b81a3a2cc5p19 -0x1.29d1b62bp6 0x1.3fffffff84d1ep4 0x1.3fffffffb180dp2 0x1.dd05p-14 F +REG epsg:28464 0 OK 0x1.e864c6ad7539ep18 0x1.6c051c7d5a47ap6 -0x1.3bbf9776p6 0x1.4ffffffffc356p4 -0x1.32a7c92ec86fep-33 0x1.e9ebp-14 T +REG epsg:28464 1 OK -0x1.ae5acbb57d0dp15 -0x1.0ef495f651c79p19 -0x1.89b2d54f3p6 0x1.00000000744cbp4 -0x1.3ffffffff278cp2 0x1.f367p-14 F +REG epsg:28464 2 OK 0x1.01a52f005d804p20 -0x1.0ef49f2527862p19 -0x1.2822ad974p6 0x1.9fffffff883cbp4 -0x1.400000000403bp2 0x1.ef9fp-14 F +REG epsg:28464 3 OK -0x1.ae56f9231d75p15 0x1.0f0b6baa84e9bp19 -0x1.513e41dp6 0x1.000000006fda7p4 0x1.3fffffffb8651p2 0x1.e23p-14 F +REG epsg:28464 4 OK 0x1.01a526116cd7ep20 0x1.0f0b49bdaf2e8p19 -0x1.df5ded54p5 0x1.9fffffff84185p4 0x1.3fffffffa7a74p2 0x1.d44p-14 F +REG epsg:28465 0 OK 0x1.e863d81e9c8d7p18 0x1.6a2d118fde25ep6 -0x1.01a40f9d1p6 0x1.affffffffb6a6p4 -0x1.8479cdd1b311fp-33 0x1.e3f3p-14 T +REG epsg:28465 1 OK -0x1.ae5fe8ac9919p15 -0x1.0ef4790384b3cp19 -0x1.4ebcaa025p6 0x1.60000000734a7p4 -0x1.3ffffffffd269p2 0x1.f192p-14 F +REG epsg:28465 2 OK 0x1.01a4ddbc45d0fp20 -0x1.0ef487f2810b7p19 -0x1.df866456ap5 0x1.ffffffff877f8p4 -0x1.400000000e028p2 0x1.ebb8p-14 F +REG epsg:28465 3 OK -0x1.ae5bb9ad3b3dp15 0x1.0f0b36f738154p19 -0x1.16488fb2cp6 0x1.600000006f007p4 0x1.3fffffffae39dp2 0x1.da2ap-14 F +REG epsg:28465 4 OK 0x1.01a4d7b131fcep20 0x1.0f0b0f4a38ecfp19 -0x1.6ea055ffp5 0x1.ffffffff8396fp4 0x1.3fffffff9e5dp2 0x1.caa1p-14 F +REG epsg:28466 0 OK 0x1.e86289afb7efp18 0x1.67e8d8a93528dp6 -0x1.92d1fb5f8p5 0x1.07fffffffd695p5 -0x1.d20a450caa51bp-33 0x1.dcfap-14 T +REG epsg:28466 1 OK -0x1.ae68171d4206p15 -0x1.0ef460ea08dccp19 -0x1.151e0dea6p6 0x1.c0000000726e9p4 -0x1.4000000007757p2 0x1.ee6dp-14 F +REG epsg:28466 2 OK 0x1.01a4753a1a53p20 -0x1.0ef4754c937f8p19 -0x1.738b4d7ecp5 0x1.2fffffffc37b4p5 -0x1.40000000176e8p2 0x1.e6e5p-14 F +REG epsg:28466 3 OK -0x1.ae6390810acfp15 0x1.0f0b000dc7353p19 -0x1.b9551c2b2p5 0x1.c00000006e58dp4 0x1.3fffffffa48cap2 0x1.d118p-14 F +REG epsg:28466 4 OK 0x1.01a471ec781a4p20 0x1.0f0ad2ed31b09p19 -0x1.02a6db39cp5 0x1.2fffffffc1aa8p5 0x1.3fffffff95b93p2 0x1.c06ep-14 F +REG epsg:28467 0 OK 0x1.e860df0aee214p18 0x1.653ecd53f6ce3p6 -0x1.27582fbd8p5 0x1.37fffffffd3a7p5 -0x1.0d3fd0be14e2p-32 0x1.d553p-14 T +REG epsg:28467 1 OK -0x1.ae734013cddfp15 -0x1.0ef44ded73cbfp19 -0x1.baf1394c2p5 0x1.1000000038e13p5 -0x1.4000000011463p2 0x1.ea29p-14 F +REG epsg:28467 2 OK 0x1.01a3f69f027d5p20 -0x1.0ef46767aa68bp19 -0x1.0d82f177cp5 0x1.5fffffffc353p5 -0x1.40000000202a7p2 0x1.e173p-14 F +REG epsg:28467 3 OK -0x1.ae6e67a09a5ap15 0x1.0f0ac788365b7p19 -0x1.4a0badcb4p5 0x1.1000000036f62p5 0x1.3fffffff9b769p2 0x1.c73bp-14 F +REG epsg:28467 4 OK 0x1.01a3f5e0b75b4p20 0x1.0f0a954fe7a25p19 -0x1.3940a69fp4 0x1.5fffffffc1aadp5 0x1.3fffffff8dd05p2 0x1.b60dp-14 F +REG epsg:28468 0 OK 0x1.e85edcdd00683p18 0x1.623668a7cb3e6p6 -0x1.841058d8p4 0x1.67fffffffd2a7p5 -0x1.2e875424d023dp-32 0x1.cd5p-14 T +REG epsg:28468 1 OK -0x1.ae8144420cebp15 -0x1.0ef4404303d74p19 -0x1.50d0d162cp5 0x1.4000000038a5dp5 -0x1.400000001a79ep2 0x1.e519p-14 F +REG epsg:28468 2 OK 0x1.01a3634e1e495p20 -0x1.0ef45e6abbdafp19 -0x1.5d16f79a8p4 0x1.8fffffffc3485p5 -0x1.400000002819ap2 0x1.dbb3p-14 F +REG epsg:28468 3 OK -0x1.ae7c20a340c1p15 0x1.0f0a8e050cf0bp19 -0x1.bfd9ea564p4 0x1.4000000036dffp5 0x1.3fffffff930dep2 0x1.bcf1p-14 F +REG epsg:28468 4 OK 0x1.01a364e9e1c33p20 0x1.0f0a571f2a91cp19 -0x1.ed57255ep2 0x1.8fffffffc1cd5p5 0x1.3fffffff86b5ep2 0x1.abd9p-14 F +REG epsg:28469 0 OK 0x1.e85c88c82cbaap18 0x1.5ed82c52758afp6 -0x1.8ff85f6p3 0x1.97fffffffd3a7p5 -0x1.4c7e552f9e203p-32 0x1.c54fp-14 T +REG epsg:28469 1 OK -0x1.ae91fc572249p15 -0x1.0ef438110ae8fp19 -0x1.da0916cf4p4 0x1.7000000038879p5 -0x1.4000000022f33p2 0x1.df84p-14 F +REG epsg:28469 2 OK 0x1.01a2bce4a1e74p20 -0x1.0ef45a6efb4abp19 -0x1.5ebd18f88p3 0x1.bfffffffc35b3p5 -0x1.400000002f22fp2 0x1.d5fdp-14 F +REG epsg:28469 3 OK -0x1.ae8c950af285p15 0x1.0f0a54259919p19 -0x1.f08a53798p3 0x1.7000000036ebfp5 0x1.3fffffff8b66dp2 0x1.b297p-14 F +REG epsg:28469 4 OK 0x1.01a2c09e93024p20 0x1.0f0a1909674b6p19 0x1.92f1ca28p1 0x1.bfffffffc2119p5 0x1.3fffffff8079ap2 0x1.a233p-14 F +REG epsg:2847 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:2847 1 OK 0x1.39170370f731bp18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:2847 2 OK 0x1.ad647e4784668p19 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:2847 3 OK 0x1.45cd37c6ce462p18 0x1.0d334102db22ep22 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:2847 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db22ep22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:28470 0 OK 0x1.e859e9545fa21p18 0x1.5b2d8abb3c4c4p6 -0x1.c8363d2p0 0x1.c7fffffffd695p5 -0x1.66d0c8670396fp-32 0x1.bda6p-14 T +REG epsg:28470 1 OK -0x1.aea5396dd307p15 -0x1.0ef4356e83206p19 -0x1.21489c774p4 0x1.a00000003886dp5 -0x1.400000002a973p2 0x1.d9bfp-14 F +REG epsg:28470 2 OK 0x1.01a205354ea0fp20 -0x1.0ef45b7f92f61p19 -0x1.3c3db9a8p0 0x1.efffffffc389cp5 -0x1.40000000352f2p2 0x1.d09cp-14 F +REG epsg:28470 3 OK -0x1.ae9f96b041eap15 0x1.0f0a1a8c2b54cp19 -0x1.fc46e74ep1 0x1.a00000003719dp5 0x1.3fffffff84938p2 0x1.a88ap-14 F +REG epsg:28470 4 OK 0x1.01a20acb9bd6p20 0x1.0f09dbbcbe70fp19 0x1.9be8671dp3 0x1.efffffffc275p5 0x1.3fffffff7b2abp2 0x1.9975p-14 F +REG epsg:28471 0 OK 0x1.e85705dce26edp18 0x1.5740cc83a554p6 0x1.f1e47d2ap2 0x1.f7fffffffdb51p5 -0x1.7d34d9bed3961p-32 0x1.b6acp-14 T +REG epsg:28471 1 OK -0x1.aebac590135fp15 -0x1.0ef43862ce78cp19 -0x1.e5997b08p2 0x1.d000000038a34p5 -0x1.40000000314d3p2 0x1.d41ep-14 F +REG epsg:28471 2 OK 0x1.01a13e4355ab6p20 -0x1.0ef4619984aa1p19 0x1.d012c341p2 0x1.0fffffffe1e8ap6 -0x1.400000003a29ep2 0x1.cbdep-14 F +REG epsg:28471 3 OK -0x1.aeb4f043d7f9p15 0x1.0f09e1da4f50fp19 0x1.a153735bp2 0x1.d00000003768ep5 0x1.3fffffff7ea3bp2 0x1.9f23p-14 F +REG epsg:28471 4 OK 0x1.01a1456ef5854p20 0x1.0f099fe51c2b1p19 0x1.55b7c8814p4 0x1.0fffffffe17a3p6 0x1.3fffffff76d3cp2 0x1.91f5p-14 F +REG epsg:28472 0 OK 0x1.e853e67bb8f2fp18 0x1.531cf3afd7cbdp6 0x1.014c4722p4 0x1.13ffffffff0d5p6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:28472 1 OK -0x1.aed2644e6315p15 -0x1.0ef440e5a2293p19 0x1.bc6c7294p0 0x1.000000001c6d3p6 -0x1.4000000036fe9p2 0x1.ceeep-14 F +REG epsg:28472 2 OK 0x1.01a06a3cb3314p20 -0x1.0ef46cabb239cp19 0x1.ccfc8c3d8p3 0x1.27ffffffe216cp6 -0x1.400000003e031p2 0x1.c801p-14 F +REG epsg:28472 3 OK -0x1.aecc65e3fd6bp15 0x1.0f09aaaf06e55p19 0x1.fafa6a1p3 0x1.000000001beb1p6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:28472 4 OK 0x1.01a072b22b872p20 0x1.0f09662a5611p19 0x1.c82c33684p4 0x1.27ffffffe1c5bp6 0x1.3fffffff737fp2 0x1.8bf9p-14 F +REG epsg:28473 0 OK 0x1.e85093f2e8aa7p18 0x1.4ecd9cc7863f7p6 0x1.70818d5c8p4 0x1.2bffffffff4abp6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:28473 1 OK -0x1.aeebd3694e46p15 -0x1.0ef44edf1df97p19 0x1.3938e4c3p3 0x1.180000001c94ap6 -0x1.400000003b98fp2 0x1.ca76p-14 F +REG epsg:28473 2 OK 0x1.019f8b741174ap20 -0x1.0ef47c970d8eep19 0x1.4267d52c8p4 0x1.3fffffffe24cep6 -0x1.4000000040ad6p2 0x1.c53fp-14 F +REG epsg:28473 3 OK -0x1.aee5b5c48e3cp15 0x1.0f0975a50c35cp19 0x1.7e4dd6398p4 0x1.180000001c2efp6 0x1.3fffffff75a11p2 0x1.8fc2p-14 F +REG epsg:28473 4 OK 0x1.019f94e44b1afp20 0x1.0f092f2e54891p19 0x1.120839ccp5 0x1.3fffffffe219fp6 0x1.3fffffff71339p2 0x1.87bdp-14 F +REG epsg:28474 0 OK 0x1.e84d1793e92fap18 0x1.4a5ede45ed732p6 0x1.c8e10c6a8p4 0x1.43ffffffff8ffp6 -0x1.a691e019f05bap-32 0x1.a8aep-14 T +REG epsg:28474 1 OK -0x1.af06cb8b38a2p15 -0x1.0ef462280f43bp19 0x1.07b14d7d8p4 0x1.300000001cc5ep6 -0x1.400000003f0cap2 0x1.c6f4p-14 F +REG epsg:28474 2 OK 0x1.019ea45a452b7p20 -0x1.0ef4912eefce8p19 0x1.86bf9696p4 0x1.57ffffffe2886p6 -0x1.40000000421ffp2 0x1.c3b8p-14 F +REG epsg:28474 3 OK -0x1.af0098e7816ep15 0x1.0f0943511fd52p19 0x1.e95d79248p4 0x1.300000001c7dcp6 0x1.3fffffff72a23p2 0x1.8a57p-14 F +REG epsg:28474 4 OK 0x1.019eae7369c44p20 0x1.0f08fb8b4ccbbp19 0x1.34316849ap5 0x1.57ffffffe2741p6 0x1.3fffffff6ff61p2 0x1.8566p-14 F +REG epsg:28475 0 OK 0x1.e8497b2582935p18 0x1.45dd26b42e0c5p6 0x1.04b9750fp5 0x1.5bffffffffda2p6 -0x1.ab403431476cdp-32 0x1.a702p-14 T +REG epsg:28475 1 OK -0x1.af2301106aabp15 -0x1.0ef47a8a5eeccp19 0x1.5bd905cf4p4 0x1.480000001cfe2p6 -0x1.40000000414ddp2 0x1.c494p-14 F +REG epsg:28475 2 OK 0x1.019db777754bep20 -0x1.0ef4aa399698ap19 0x1.b2c5dd98cp4 0x1.6fffffffe2c5ep6 -0x1.400000004255fp2 0x1.c37cp-14 F +REG epsg:28475 3 OK -0x1.af1cc3e400bdp15 0x1.0f09144067adbp19 0x1.1ebfecdecp5 0x1.480000001cd46p6 0x1.3fffffff70aeap2 0x1.86bep-14 F +REG epsg:28475 4 OK 0x1.019dc1e5d4cbp20 0x1.0f08cbd210809p19 0x1.4a31d65b4p5 0x1.6fffffffe2d09p6 0x1.3fffffff6fc99p2 0x1.8511p-14 F +REG epsg:28476 0 OK 0x1.e845c8c8631ebp18 0x1.415519cd00c9dp6 0x1.18c107564p5 0x1.740000000026p6 -0x1.ab40342ee8834p-32 0x1.a703p-14 T +REG epsg:28476 1 OK -0x1.af4024db2dc5p15 -0x1.0ef497c1a91aep19 0x1.98279585cp4 0x1.600000001d3a8p6 -0x1.4000000042554p2 0x1.c37ap-14 F +REG epsg:28476 2 OK 0x1.019cc764018c6p20 -0x1.0ef4c770c607dp19 0x1.c5ff3187cp4 0x1.87ffffffe3025p6 -0x1.40000000414e6p2 0x1.c497p-14 F +REG epsg:28476 3 OK -0x1.af39e7b9dfd4p15 0x1.0f08e8f6e33b5p19 0x1.3ce480982p5 0x1.600000001d2fap6 0x1.3fffffff6fca1p2 0x1.850dp-14 F +REG epsg:28476 4 OK 0x1.019cd1d2fce8dp20 0x1.0f08a08877afp19 0x1.53cbcf428p5 0x1.87ffffffe32bdp6 0x1.3fffffff70aep2 0x1.86bfp-14 F +REG epsg:28477 0 OK 0x1.e8420adab915ep18 0x1.3cd36d0b752bdp6 0x1.204f103bep5 0x1.8c00000000703p6 -0x1.a691e01532885p-32 0x1.a8b2p-14 T +REG epsg:28477 1 OK -0x1.af5de531a6ffp15 -0x1.0ef4b97bfd00bp19 0x1.bbf3d986p4 0x1.780000001d782p6 -0x1.40000000421f7p2 0x1.c3b5p-14 F +REG epsg:28477 2 OK 0x1.019bd6c13b6c6p20 -0x1.0ef4e8828da81p19 0x1.c035a801cp4 0x1.9fffffffe33acp6 -0x1.400000003f0d1p2 0x1.c6f5p-14 F +REG epsg:28477 3 OK -0x1.af57b2af2451p15 0x1.0f08c1edf96f3p19 0x1.4ec7edc54p5 0x1.780000001d8c3p6 0x1.3fffffff6ff6ap2 0x1.8564p-14 F +REG epsg:28477 4 OK 0x1.019be0dc31f28p20 0x1.0f087a27e976p19 0x1.50e4655bp5 0x1.9fffffffe3828p6 0x1.3fffffff72a1ep2 0x1.8a58p-14 F +REG epsg:28478 0 OK 0x1.e83e4bdb203b8p18 0x1.3864c408098e7p6 0x1.1b4e5f8cp5 0x1.a400000000b58p6 -0x1.9d4258f786dc7p-32 0x1.abf5p-14 T +REG epsg:28478 1 OK -0x1.af7beea302bp15 -0x1.0ef4df5ac2a6p19 0x1.c6d96bacp4 0x1.900000001db39p6 -0x1.4000000040acap2 0x1.c53fp-14 F +REG epsg:28478 2 OK 0x1.019ae832062a6p20 -0x1.0ef50d122e3cdp19 0x1.a1797c24p4 0x1.b7ffffffe36cp6 -0x1.400000003b999p2 0x1.ca79p-14 F +REG epsg:28478 3 OK -0x1.af75d1353191p15 0x1.0f089f9324494p19 0x1.543808ebep5 0x1.900000001de64p6 0x1.3fffffff7133bp2 0x1.87bep-14 F +REG epsg:28478 4 OK 0x1.019af1a542d1p20 0x1.0f08591c07a41p19 0x1.4183bd9ecp5 0x1.b7ffffffe3d15p6 0x1.3fffffff75a0cp2 0x1.8fc4p-14 F +REG epsg:28479 0 OK 0x1.e83a964b34717p18 0x1.34158d07f56f1p6 0x1.09ccfd192p5 0x1.bc00000000f2ep6 -0x1.8f6bbc19f56bdp-32 0x1.b0b1p-14 T +REG epsg:28479 1 OK -0x1.af99ecf16cbep15 -0x1.0ef508f3c4276p19 0x1.b8b9bc51p4 0x1.a80000001de9ep6 -0x1.400000003e023p2 0x1.c803p-14 F +REG epsg:28479 2 OK 0x1.0199fe537261bp20 -0x1.0ef534b91dd34p19 0x1.6a20e103p4 0x1.cfffffffe393ap6 -0x1.4000000036ff7p2 0x1.ceefp-14 F +REG epsg:28479 3 OK -0x1.af93eed31453p15 0x1.0f088246bddeep19 0x1.4d2591bbap5 0x1.a80000001e3acp6 0x1.3fffffff737f6p2 0x1.8bf6p-14 F +REG epsg:28479 4 OK 0x1.019a06cd16891p20 0x1.0f083dc180ebbp19 0x1.25d4f8cd2p5 0x1.cfffffffe415ap6 0x1.3fffffff79a4ap2 0x1.96c9p-14 F +REG epsg:2848 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:2848 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:2848 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:2848 3 OK 0x1.ee847b1cd767p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:2848 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:28480 0 OK 0x1.e836f4921bed2p18 0x1.2ff1de21f173ap6 0x1.d7f802c48p4 0x1.d400000001258p6 -0x1.7d34d9c5f0528p-32 0x1.b6acp-14 T +REG epsg:28480 1 OK -0x1.afb78bfe4852p15 -0x1.0ef535d257872p19 0x1.91bc68028p4 0x1.c00000001e184p6 -0x1.400000003a293p2 0x1.cbddp-14 F +REG epsg:28480 2 OK 0x1.01991bb569ed3p20 -0x1.0ef55f082746ep19 0x1.1ac70ffbp4 0x1.e7ffffffe3af6p6 -0x1.40000000314dep2 0x1.d422p-14 F +REG epsg:28480 3 OK -0x1.afb1b71260dap15 0x1.0f086a5af22d9p19 0x1.39a45dd72p5 0x1.c00000001e864p6 0x1.3fffffff76d4p2 0x1.91f3p-14 F +REG epsg:28480 4 OK 0x1.019922e652f4bp20 0x1.0f0828650cff6p19 0x1.fc4b74fcp4 0x1.e7ffffffe44c4p6 0x1.3fffffff7ea3cp2 0x1.9f2ap-14 F +REG epsg:28481 0 OK 0x1.e83370df5b9eep18 0x1.2c05535a26509p6 0x1.845e17d3cp4 0x1.ec000000014b6p6 -0x1.66d0c86245c3cp-32 0x1.bda9p-14 T +REG epsg:28481 1 OK -0x1.afd478b61056p15 -0x1.0ef56578a5cb2p19 0x1.524ec86bp4 0x1.d80000001e3cp6 -0x1.40000000352dfp2 0x1.d09dp-14 F +REG epsg:28481 2 OK 0x1.019842d380a8dp20 -0x1.0ef58b88a2155p19 0x1.68952acdp3 0x1.ffffffffe3bdcp6 -0x1.400000002a98ap2 0x1.d9bdp-14 F +REG epsg:28481 3 OK -0x1.afced66c08acp15 0x1.0f085812d8ad7p19 0x1.19eb21306p5 0x1.d80000001ec64p6 0x1.3fffffff7b2a8p2 0x1.9974p-14 F +REG epsg:28481 4 OK 0x1.0198487025e46p20 0x1.0f081942956f3p19 0x1.95ca9ed6cp4 0x1.ffffffffe4741p6 0x1.3fffffff84943p2 0x1.a889p-14 F +REG epsg:28482 0 OK 0x1.e830150e47619p18 0x1.285aee1438787p6 0x1.19b6b171p4 0x1.0200000000b16p7 -0x1.4c7e5531fd09ap-32 0x1.c55p-14 T +REG epsg:28482 1 OK -0x1.aff061f94af1p15 -0x1.0ef597610bd72p19 0x1.f6458361p3 0x1.f00000001e535p6 -0x1.400000002f21cp2 0x1.d5fcp-14 F +REG epsg:28482 2 OK 0x1.0197760dfe394p20 -0x1.0ef5b9bdbf127p19 0x1.be5704ecp1 0x1.0bfffffff1deep7 -0x1.4000000022f46p2 0x1.df87p-14 F +REG epsg:28482 3 OK -0x1.afeafb3292b8p15 0x1.0f084ba1b828fp19 0x1.dca5a952cp4 0x1.f00000001ef81p6 0x1.3fffffff8079ap2 0x1.a232p-14 F +REG epsg:28482 4 OK 0x1.019779cf44bcfp20 0x1.0f0810848da07p19 0x1.1946eaba8p4 0x1.0bfffffff245ap7 0x1.3fffffff8b67bp2 0x1.b297p-14 F +REG epsg:28483 0 OK 0x1.e82cea8a5e1f1p18 0x1.24fcf636aa084p6 0x1.3259de8fp3 0x1.0e00000000b55p7 -0x1.2e8754201250cp-32 0x1.cd51p-14 T +REG epsg:28483 1 OK -0x1.b00af9800488p15 -0x1.0ef5caff9121cp19 0x1.1a599f58p3 0x1.040000000f2eap7 -0x1.4000000028183p2 0x1.dbb5p-14 F +REG epsg:28483 2 OK 0x1.0196b7a33439bp20 -0x1.0ef5e925e660bp19 -0x1.656b8856p2 0x1.17fffffff1d77p7 -0x1.400000001a7b1p2 0x1.e51cp-14 F +REG epsg:28483 3 OK -0x1.b005d677243ap15 0x1.0f08452a76e9cp19 0x1.6eab792ccp4 0x1.040000000f8d5p7 0x1.3fffffff86b5ap2 0x1.abdbp-14 F +REG epsg:28483 4 OK 0x1.0196b947364d8p20 0x1.0f080e437bba1p19 0x1.103b2051p3 0x1.17fffffff248bp7 0x1.3fffffff930ecp2 0x1.bcf1p-14 F +REG epsg:28484 0 OK 0x1.e829fa34df4bbp18 0x1.21f4dd5610fbfp6 0x1.0a5473ap-2 0x1.1a00000000b16p7 -0x1.0d3fd0c073cb7p-32 0x1.d555p-14 T +REG epsg:28484 1 OK -0x1.b023f4b554d7p15 -0x1.0ef5ffc3702efp19 0x1.342b0a2p-1 0x1.100000000f2c2p7 -0x1.400000002028ep2 0x1.e171p-14 F +REG epsg:28484 2 OK 0x1.019609a933b33p20 -0x1.0ef6193c22d1cp19 -0x1.fb1f39208p3 0x1.23fffffff1c8cp7 -0x1.400000001147ep2 0x1.ea2cp-14 F +REG epsg:28484 3 OK -0x1.b01f1ce6d941p15 0x1.0f0844bf38cebp19 0x1.d63847928p3 0x1.100000000f961p7 0x1.3fffffff8dcfcp2 0x1.b60bp-14 F +REG epsg:28484 4 OK 0x1.019608f3f99b8p20 0x1.0f081285b3d11p19 -0x1.c1a50a9p0 0x1.23fffffff2436p7 0x1.3fffffff9b77fp2 0x1.c73ep-14 F +REG epsg:28485 0 OK 0x1.e8274c4be3c9ep18 0x1.1f4b2438f27b9p6 -0x1.47647134p3 0x1.2600000000a5bp7 -0x1.d20a4507ec7ebp-33 0x1.dcfbp-14 T +REG epsg:28485 1 OK -0x1.b03b0d88853ap15 -0x1.0ef63518ac822p19 -0x1.1c1d6a28p3 0x1.1c0000000f222p7 -0x1.40000000176cbp2 0x1.e6e5p-14 F +REG epsg:28485 2 OK 0x1.01956e07f3484p20 -0x1.0ef6497996b8dp19 -0x1.b306c4664p4 0x1.2ffffffff1b37p7 -0x1.400000000777ap2 0x1.ee6ap-14 F +REG epsg:28485 3 OK -0x1.b036879e007fp15 0x1.0f084a612c5ccp19 0x1.4da28d3dp2 0x1.1c0000000f964p7 0x1.3fffffff95b8p2 0x1.c071p-14 F +REG epsg:28485 4 OK 0x1.01956ac41b79cp20 0x1.0f081d3f4616ep19 -0x1.a32848ed8p3 0x1.2ffffffff235fp7 0x1.3fffffffa48e2p2 0x1.d11bp-14 F +REG epsg:28486 0 OK 0x1.e824e8533ffap18 0x1.1d0742fe84bb7p6 -0x1.5c8ee79fp4 0x1.320000000092cp7 -0x1.8479cddb2eb7dp-33 0x1.e3f4p-14 T +REG epsg:28486 1 OK -0x1.b05003319021p15 -0x1.0ef66a69b196ap19 -0x1.3839ea6e8p4 0x1.280000000f113p7 -0x1.400000000e007p2 0x1.ebbap-14 F +REG epsg:28486 2 OK 0x1.0194e673f69e5p20 -0x1.0ef67956f61a9p19 -0x1.3be1b32cp5 0x1.3bfffffff1981p7 -0x1.3ffffffffd289p2 0x1.f195p-14 F +REG epsg:28486 3 OK -0x1.b04bd4eee9aep15 0x1.0f085600875b8p19 -0x1.5b16420cp2 0x1.280000000f8e3p7 0x1.3fffffff9e5bbp2 0x1.ca9fp-14 F +REG epsg:28486 4 OK 0x1.0194e0734b766p20 0x1.0f082e52203ep19 -0x1.9652f084cp4 0x1.3bfffffff2213p7 0x1.3fffffffae3b9p2 0x1.da31p-14 F +REG epsg:28487 0 OK 0x1.e822d4ff6fd63p18 0x1.1b2f942b39a1ap6 -0x1.123320966p5 0x1.3e00000000796p7 -0x1.32a7c9254cc9dp-33 0x1.e9edp-14 T +REG epsg:28487 1 OK -0x1.b0629ae6d185p15 -0x1.0ef69f20f654ep19 -0x1.f30303dfp4 0x1.340000000ef9ap7 -0x1.4000000004014p2 0x1.efa4p-14 F +REG epsg:28487 2 OK 0x1.0194746986014p20 -0x1.0ef6a84e0215fp19 -0x1.a4cedccbcp5 0x1.47fffffff178p7 -0x1.3ffffffff27bp2 0x1.f369p-14 F +REG epsg:28487 3 OK -0x1.b05ec91a19e5p15 0x1.0f08677cb306p19 -0x1.11912b674p4 0x1.340000000f7e4p7 0x1.3fffffffa7a5cp2 0x1.d44p-14 F +REG epsg:28487 4 OK 0x1.01946b857f625p20 0x1.0f08458e61b72p19 -0x1.341772f8ep5 0x1.47fffffff2062p7 0x1.3fffffffb8675p2 0x1.e232p-14 F +REG epsg:28488 0 OK 0x1.e8211822c8388p18 0x1.19c942d5d992ep6 -0x1.7c83e3b38p5 0x1.4a000000005aap7 -0x1.baf3682609804p-34 0x1.eeabp-14 T +REG epsg:28488 1 OK -0x1.b072a081eabep15 -0x1.0ef6d2aaa06bbp19 -0x1.5e2f110f6p5 0x1.400000000edc9p7 -0x1.3ffffffff98e6p2 0x1.f25ep-14 F +REG epsg:28488 2 OK 0x1.019419288395p20 -0x1.0ef6d5db015d2p19 -0x1.09924aca6p6 0x1.53fffffff1546p7 -0x1.3fffffffe78edp2 0x1.f3bbp-14 F +REG epsg:28488 3 OK -0x1.b06f2ef5e16p15 0x1.0f087ea4a7575p19 -0x1.daee470d8p4 0x1.400000000f673p7 0x1.3fffffffb17f3p2 0x1.dd03p-14 F +REG epsg:28488 4 OK 0x1.01940d42b2fddp20 0x1.0f0862b2e1da9p19 -0x1.a26db6972p5 0x1.53fffffff1e61p7 0x1.3fffffffc2f78p2 0x1.e8e1p-14 F +REG epsg:28489 0 OK 0x1.e81fb69d21fc7p18 0x1.18d83c2735ef1p6 -0x1.ec0f8e3eap5 0x1.560000000038p7 -0x1.0bbcf071988b7p-34 0x1.f1f1p-14 T +REG epsg:28489 1 OK -0x1.b07fe7120c2fp15 -0x1.0ef7047622f6p19 -0x1.c90b43caep5 0x1.4c0000000ebb3p7 -0x1.3fffffffeec78p2 0x1.f3b3p-14 F +REG epsg:28489 2 OK 0x1.0193d5b0e9e4cp20 -0x1.0ef7017e31a22p19 -0x1.42d6b4223p6 0x1.5ffffffff12edp7 -0x1.3fffffffdc84p2 0x1.f267p-14 F +REG epsg:28489 3 OK -0x1.b07cd8837ba3p15 0x1.0f089b3774725p19 -0x1.58541025p5 0x1.4c0000000f4a4p7 0x1.3fffffffbbce8p2 0x1.e499p-14 F +REG epsg:28489 4 OK 0x1.0193c6b34fcbap20 0x1.0f08856de6899p19 -0x1.0a7b6629ep6 0x1.5ffffffff1c25p7 0x1.3fffffffcdcfdp2 0x1.ee0dp-14 F +REG epsg:2849 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:2849 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:2849 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:2849 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:2849 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:28490 0 OK 0x1.e81eb44e2ce35p18 0x1.185f24552e34bp6 -0x1.2fcea2c8bp6 0x1.620000000012fp7 -0x1.665e69a78691ap-36 0x1.f39cp-14 T +REG epsg:28490 1 OK -0x1.b08a495a08f5p15 -0x1.0ef733f7d3e41p19 -0x1.1c7532073p6 0x1.580000000e96bp7 -0x1.3fffffffe3ccdp2 0x1.f38p-14 F +REG epsg:28490 2 OK 0x1.0193aabffd932p20 -0x1.0ef72abd2de94p19 -0x1.7d940bd7dp6 -0x1.640000000ef71p7 -0x1.3fffffffd17a7p2 0x1.ef6dp-14 F +REG epsg:28490 3 OK -0x1.b0879f7018a1p15 0x1.0f08bce4f8a41p19 -0x1.c833a3718p5 0x1.580000000f28dp7 0x1.3fffffffc679p2 0x1.eadp-14 F +REG epsg:28490 4 OK 0x1.0193989d4722cp20 0x1.0f08ad5e0946p19 -0x1.4538bb243p6 -0x1.640000000e634p7 0x1.3fffffffd8d27p2 0x1.f197p-14 F +REG epsg:28491 0 OK 0x1.e81e140a90a6dp18 0x1.185f4f3803453p6 -0x1.6af478571p6 -0x1.620000000013p7 0x1.6623c281da0e3p-36 0x1.f39fp-14 T +REG epsg:28491 1 OK -0x1.b091aa38d3ffp15 -0x1.0ef760aa73b54p19 -0x1.564956839p6 0x1.640000000e70ep7 -0x1.3fffffffd8be5p2 0x1.f1a2p-14 F +REG epsg:28491 2 OK 0x1.019398ce3a11ap20 -0x1.0ef7512445d51p19 -0x1.b92591dbbp6 -0x1.580000000f1bcp7 -0x1.3fffffffc6915p2 0x1.eac3p-14 F +REG epsg:28491 3 OK -0x1.b08f65806477p15 0x1.0f08e34ec106p19 -0x1.1dee0bab3p6 0x1.640000000f044p7 0x1.3fffffffd1621p2 0x1.ef74p-14 F +REG epsg:28491 4 OK 0x1.01938381e68fcp20 0x1.0f08da1348425p19 -0x1.80ca1a322p6 -0x1.580000000e894p7 0x1.3fffffffe3e09p2 0x1.f376p-14 F +REG epsg:28492 0 OK 0x1.e81dd793fab74p18 0x1.18d8bc8edd145p6 -0x1.a6d3629c1p6 -0x1.5600000000381p7 0x1.0bae46b1a910ap-34 0x1.f1fp-14 T +REG epsg:28492 1 OK -0x1.b095f4fb4041p15 -0x1.0ef78a10a33a6p19 -0x1.915fdd8cfp6 -0x1.5ffffffff1b4dp7 -0x1.3fffffffcdbc1p2 0x1.ee12p-14 F +REG epsg:28492 2 OK 0x1.0193a00dff436p20 -0x1.0ef77447c2295p19 -0x1.f4e432b3cp6 -0x1.4c0000000f3d7p7 -0x1.3fffffffbbe62p2 0x1.e491p-14 F +REG epsg:28492 3 OK -0x1.b09414e55ed3p15 0x1.0f090e091248dp19 -0x1.590483dfap6 -0x1.5ffffffff121ap7 0x1.3fffffffdc6b9p2 0x1.f27p-14 F +REG epsg:28492 4 OK 0x1.0193879c6cb3fp20 0x1.0f090b10406a7p19 -0x1.bc887047p6 -0x1.4c0000000eadep7 0x1.3fffffffeedafp2 0x1.f3b1p-14 F +REG epsg:2850 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:2850 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:2850 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:2850 3 OK 0x1.e92fa135fb9ffp17 0x1.23c16caecd927p21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:2850 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd927p21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:2851 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:2851 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:2851 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:2851 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:2851 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:2852 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:2852 1 OK -0x1.86b2371ea2d1p16 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:2852 2 OK 0x1.0c8f2371ea2d6p20 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:2852 3 OK -0x1.5297458080bap13 0x1.1a3752e74fe61p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:2852 4 OK 0x1.ed925d1602037p19 0x1.1a3752e74fe62p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:2853 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:2853 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:2853 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:2853 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:2853 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:2854 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:2854 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:2854 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:2854 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6491p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:2854 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6491p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:2855 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:2855 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:2855 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:2855 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2855 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2856 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:2856 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fbap16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:2856 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fbap16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:2856 3 OK 0x1.16844fa8b2f1cp18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:2856 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:2857 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:2857 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:2857 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:2857 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:2857 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:2858 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:2858 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:2858 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:2858 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:2858 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:2859 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:2859 1 OK 0x1.96b30a2e34c9p18 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:2859 2 OK 0x1.7e967ae8e59b8p19 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:2859 3 OK 0x1.a0c3f35264cb7p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:2859 4 OK 0x1.798e0656cd9a4p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:2860 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:2860 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:2860 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:2860 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:2860 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:28600 0 OK 0x1.86c67f9d43e3p17 0x1.24e519002b74fp18 0x1.d052a2474p4 0x1.99bbbbbbbbbbcp5 0x1.8733333333332p4 -0x1.0p-30 F +REG epsg:28600 1 OK -0x1.708348067086ep18 -0x1.dd8104edde63cp17 0x1.ad54e775p4 0x1.6dcaf9f8ceb25p5 0x1.3733333316715p4 0x1.0p-30 F +REG epsg:28600 2 OK 0x1.7ba4e3f0045e2p19 -0x1.dd8104e5db714p17 0x1.45d9df1cp5 0x1.c5ac7d7ea8c75p5 0x1.373333331664dp4 -0x1.0p-30 F +REG epsg:28600 3 OK -0x1.4562ac8777a92p18 0x1.a71b7a80f0a3p19 0x1.c7ac716fp3 0x1.6dcaf9f8a3256p5 0x1.d7333332f8385p4 0x1.0p-30 F +REG epsg:28600 4 OK 0x1.6614962a90b04p19 0x1.a71b7a8315976p19 0x1.b1316211cp4 0x1.c5ac7d7ed4655p5 0x1.d7333332f81e9p4 -0x1.4p-28 F +REG epsg:2861 0 OK 0x1.24f8p19 0x1.c0697505b68fdp16 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:2861 1 OK 0x1.615ed51025e25p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:2861 2 OK 0x1.99409577ed0e4p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:2861 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:2861 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:2862 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:2862 1 OK -0x1.83ac2769fab28p18 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2862 2 OK 0x1.852613b4fd58ap19 -0x1.053b9f9c695ap19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2862 3 OK -0x1.3283c083e845cp18 0x1.197f5851c9bdap19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2862 4 OK 0x1.5c91e041f4226p19 0x1.197f5851c9bd9p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2863 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:2863 1 OK -0x1.80b84ed3f5628p17 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2863 2 OK 0x1.e6ce13b4fd594p19 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2863 3 OK -0x1.bccf020fa113p16 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2863 4 OK 0x1.be39e041f422ep19 0x1.4a535851c9bdap19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2864 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:2864 1 OK 0x1.79ec4b02a6cp11 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2864 2 OK 0x1.243b09da7eacap20 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2864 3 OK 0x1.5070fdf05ee9p16 0x1.197f5851c9bdap19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2864 4 OK 0x1.0ff0f020fa117p20 0x1.197f5851c9bdap19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2865 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:2865 1 OK 0x1.8c87b12c0a9bp17 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2865 2 OK 0x1.550f09da7eac5p20 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:2865 3 OK 0x1.176c3f7c17ba4p18 0x1.4a535851c9bdap19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2865 4 OK 0x1.40c4f020fa113p20 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:2866 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG epsg:2866 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:2866 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:2866 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:2866 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:2867 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:2867 1 OK -0x1.2955adc19bf4ap20 -0x1.b1576a448ef9fp20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2867 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2867 3 OK -0x1.f51cd4f10d22bp19 0x1.c8caf79f992b3p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2867 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2868 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:2868 1 OK -0x1.2955adc19bf6cp20 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2868 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2868 3 OK -0x1.f51cd4f10d26dp19 0x1.c8caf79f992b5p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:2868 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2869 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:2869 1 OK -0x1.2959acb81e492p20 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2869 2 OK 0x1.3f92d65c0f249p21 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2869 3 OK -0x1.f5240678a3757p19 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2869 4 OK 0x1.282f019e28dd5p21 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2870 0 OK 0x1.907e0aab020c9p22 0x1.f84139ea5bec8p20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:2870 1 OK 0x1.5a9aac8aa75adp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:2870 2 OK 0x1.c66168cb5cbddp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG epsg:2870 3 OK 0x1.5e3cf1995b983p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2870 4 OK 0x1.c2bf23bca8808p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2871 0 OK 0x1.907e0aab020c9p22 0x1.f0d0c4b71a618p20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:2871 1 OK 0x1.5eab6b70b08cdp22 0x1.33306016f5618p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:2871 2 OK 0x1.c250a9e5538bdp22 0x1.33306016f5604p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:2871 3 OK 0x1.619d4b79c2d2p22 0x1.5a314358c1612p21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:2871 4 OK 0x1.bf5ec9dc4146bp22 0x1.5a314358c1608p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:2872 0 OK 0x1.907e0aab020c9p22 0x1.e66c4c0a100b3p20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:2872 1 OK 0x1.643b4190e173ep22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:2872 2 OK 0x1.bcc0d3c522a5cp22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:2872 3 OK 0x1.6677dd7c37cccp22 0x1.4a4240453b028p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:2872 4 OK 0x1.ba8437d9cc4cep22 0x1.4a4240453b028p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:2873 0 OK 0x1.907e0aab020c9p22 0x1.e5aadbb861009p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:2873 1 OK 0x1.64ab3a8ebe896p22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:2873 2 OK 0x1.bc50dac7458fcp22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:2873 3 OK 0x1.66c728b16e633p22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:2873 4 OK 0x1.ba34eca495b5fp22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:2874 0 OK 0x1.907e0aab020c9p22 0x1.e7dc46f7cec99p20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:2874 1 OK 0x1.639369c06914p22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:2874 2 OK 0x1.bd68ab959b05bp22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:2874 3 OK 0x1.65a65a5ce593p22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:2874 4 OK 0x1.bb55baf91e86ap22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:2875 0 OK 0x1.907e0aab020c9p22 0x1.dcbd320fca31ap20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:2875 1 OK 0x1.697149d028833p22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:2875 2 OK 0x1.b78acb85db95ap22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:2875 3 OK 0x1.6af09de1e9cf6p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:2875 4 OK 0x1.b60b77741a498p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:2876 0 OK 0x1.6e36000000004p21 0x1.349e033e4d4bp20 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:2876 1 OK 0x1.2c1b34e9bf8dfp21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:2876 2 OK 0x1.b050cb1640729p21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:2876 3 OK 0x1.2edc82fbcaf4dp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:2876 4 OK 0x1.ad8f7d04350bbp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:2877 0 OK 0x1.6e36000000004p21 0x1.4959ca39b0238p20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:2877 1 OK 0x1.165b50c53d54dp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:2877 2 OK 0x1.c610af3ac2abbp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:2877 3 OK 0x1.1af84f5f35b68p21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:2877 4 OK 0x1.c173b0a0ca4ap21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:2878 0 OK 0x1.6e36000000004p21 0x1.42aa603777e92p20 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:2878 1 OK 0x1.1d7ce35315bap21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:2878 2 OK 0x1.beef1cacea468p21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:2878 3 OK 0x1.213c0acae25b4p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:2878 4 OK 0x1.bb2ff5351da54p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:2879 0 OK 0x1.e848000000005p19 0x1.500fa66b4a167p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:2879 1 OK 0x1.2cd17519787cp19 0x1.336c49b7fa353p18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:2879 2 OK 0x1.51df457343c25p20 0x1.336c49b7fa353p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:2879 3 OK 0x1.32acebaa46e8ap19 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2879 4 OK 0x1.4ef18a2adc8cp20 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:2880 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:2880 1 OK -0x1.3b284352bd372p20 -0x1.adf90da921e84p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:2880 2 OK 0x1.3dc68c5566cd6p21 -0x1.adf90da921e83p20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:2880 3 OK -0x1.fc8e1e7bfa79ep19 0x1.cc6842bfb4f9fp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:2880 4 OK 0x1.1f55f24b06d03p21 0x1.cc6842bfb4fap20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:2881 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:2881 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2881 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2881 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2881 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2882 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:2882 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2882 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:2882 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2882 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:2883 0 OK 0x1.e097400000006p20 0x1.36c124f6ea723p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:2883 1 OK 0x1.41af8ade6517p20 -0x1.312f13394fda2p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:2883 2 OK 0x1.3fbf7a90cd745p21 -0x1.312f13394fda2p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:2883 3 OK 0x1.472fd7933cbd8p20 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:2883 4 OK 0x1.3cff543661a11p21 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:2884 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2884 1 OK -0x1.331c47ab8351ap20 -0x1.b1c692296f919p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2884 2 OK 0x1.39c08e81c9daap21 -0x1.b1c692296f919p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:2884 3 OK -0x1.062aefbe75fbdp20 0x1.c850c02f2b578p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2884 4 OK 0x1.2347e28b432fap21 0x1.c850c02f2b579p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2885 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2885 1 OK 0x1.75870bf1b12dp18 -0x1.b1c692296f919p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:2885 2 OK 0x1.00ffc9eae0d48p22 -0x1.b1c692296f919p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:2885 3 OK 0x1.14a635d2f3426p19 0x1.c850c02f2b579p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2885 4 OK 0x1.eb86e7df3afe2p21 0x1.c850c02f2b578p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:2886 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2886 1 OK -0x1.3f5f872489a3ep20 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2886 2 OK 0x1.3fe22e3e4d033p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2886 3 OK -0x1.f402248a55288p19 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2886 4 OK 0x1.1d32f3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2887 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2887 1 OK -0x1.3c4f9c92268acp18 -0x1.abd3c4bd17e74p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2887 2 OK 0x1.b807fe3e4d034p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2887 3 OK -0x1.36ae48a5526ap15 0x1.ce73bbe339dbfp20 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2887 4 OK 0x1.9558c3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2888 0 OK 0x1.4064d5560418cp21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:2888 1 OK 0x1.4272e3f9da294p19 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2888 2 OK 0x1.181678d6c8d3ap22 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:2888 3 OK 0x1.cd2f4e1a7f8fp19 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2888 4 OK 0x1.06beeb92b426ep22 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:2889 0 OK 0x1.4064d54fdf3b9p18 0x1.8f79a00000005p19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:2889 1 OK -0x1.8ab2401dc3b64p20 -0x1.ccfbdef59791fp19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2889 2 OK 0x1.15725562d9aa9p21 -0x1.ccfbdef59791dp19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2889 3 OK -0x1.4ee8c9d0e722cp20 0x1.49ee42718b251p21 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2889 4 OK 0x1.ef1b3478d6c19p20 0x1.49ee42718b252p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2890 0 OK 0x1.6871700000004p21 0x1.8f79a00000005p19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:2890 1 OK 0x1.ec2ed51c88f6cp19 -0x1.ccfbdef59791fp19 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2890 2 OK 0x1.2aeb955c6ee16p22 -0x1.ccfbdef59791fp19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2890 3 OK 0x1.31e0e0db210eep20 0x1.49ee42718b251p21 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2890 4 OK 0x1.1bf937c937bc8p22 0x1.49ee42718b251p21 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2891 0 OK 0x1.907e0aac08315p20 0x1.04cae2b6b9b91p18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:2891 1 OK 0x1.0aeb10e9b927p20 -0x1.feccc02444d94p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2891 2 OK 0x1.0b0882372b9ddp21 -0x1.feccc02444d94p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:2891 3 OK 0x1.1034910620ffcp20 0x1.89d6f5d769758p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2891 4 OK 0x1.0863c228f7b17p21 0x1.89d6f5d769758p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:2892 0 OK 0x1.907e0aac08315p20 0x1.d79a53ca86cdfp20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:2892 1 OK 0x1.fd4ce85362396p19 0x1.4aec624c3c358p20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:2892 2 OK 0x1.112ad0972fa28p21 0x1.4aec624c3c358p20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:2892 3 OK 0x1.04b1690895058p20 0x1.33abac378504bp21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:2892 4 OK 0x1.0e255627bdae1p21 0x1.33abac378504bp21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:2893 0 OK 0x1.4064d553f7cf1p20 0x1.3d1efd3b91187p18 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:2893 1 OK 0x1.3a7910c1d2d03p19 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:2893 2 OK 0x1.e38d22470636p20 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:2893 3 OK 0x1.4a5177c329c8p19 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:2893 4 OK 0x1.dba0eec65aba2p20 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:2894 0 OK 0x1.4064d55810628p19 0x1.51cf01db587dap21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:2894 1 OK 0x1.7b96f1026fcp14 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:2894 2 OK 0x1.3a76799406a38p20 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:2894 3 OK 0x1.bbb272668874p15 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:2894 4 OK 0x1.328741c4dc1eep20 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:2895 0 OK 0x1.907e0aac08315p20 0x1.57f5cca07ddf3p16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:2895 1 OK 0x1.35d5e8a5c7bd2p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:2895 2 OK 0x1.eb262cb248a58p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:2895 3 OK 0x1.3890cdb380798p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:2895 4 OK 0x1.e86b47a48fe92p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:2896 0 OK 0x1.907e3f28f5c29p24 0x1.9983d81e6921fp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:2896 1 OK 0x1.831fd4ce40c4cp24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:2896 2 OK 0x1.9ddca983aac05p24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:2896 3 OK 0x1.843129ecee803p24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:2896 4 OK 0x1.9ccb5464fd04ep24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:2897 0 OK 0x1.2c5eaf5eb851fp24 0x1.a8432a3145b09p18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:2897 1 OK 0x1.1e863b657d643p24 -0x1.962954cc373abp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:2897 2 OK 0x1.3a372357f33fap24 -0x1.962954cc373abp18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:2897 3 OK 0x1.1f9deb7dde65ap24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:2897 4 OK 0x1.391f733f923e3p24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:2898 0 OK 0x1.907e3f28f5c28p23 0x1.818af27c31519p18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:2898 1 OK 0x1.7778c79e94e8bp23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:2898 2 OK 0x1.a983b6b3569c4p23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:2898 3 OK 0x1.7927ff3c5604fp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:2898 4 OK 0x1.a7d47f15957ffp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:2899 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:2899 1 OK -0x1.c528da114b511p19 -0x1.b202d186cc333p20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2899 2 OK 0x1.6195d68452d49p21 -0x1.b202d186cc333p20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2899 3 OK -0x1.6d13c32e22509p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2899 4 OK 0x1.4b9090cb88947p21 0x1.c81a512182c17p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:28991 0 OK 0x1.dca07d86bac48p4 0x1.b7d0e0f1d0b75p6 -0x1.5ad56103p5 0x1.58cf1359281efp2 0x1.a13fd11ab4981p5 0x1.1522p-13 F +REG epsg:28991 1 OK -0x1.2dec75b806af1p19 -0x1.fe730fdfb3509p18 -0x1.6bf64e9f6p5 -0x1.618eba20b83afp1 0x1.793fd11aae136p5 0x1.46128p-13 F +REG epsg:28991 2 OK 0x1.2df4fdd8b91ebp19 -0x1.fe708d3793305p18 -0x1.66cf092c6p5 0x1.b132c1e1197abp3 0x1.793fd11aab856p5 0x1.9228p-13 F +REG epsg:28991 3 OK -0x1.e1ae147ec9493p18 0x1.1dfaa47e846e8p19 -0x1.d17ffac1cp4 -0x1.618eba1fe212cp1 0x1.c93fd11ac114ap5 0x1.570fp-14 F +REG epsg:28991 4 OK 0x1.e1ba8c04eada2p18 0x1.1dfbaebbe8a5p19 -0x1.c942576dp4 0x1.b132c1e1601adp3 0x1.c93fd11abb7f4p5 0x1.dba6p-14 F +REG epsg:28992 0 OK 0x1.2ecae503ec35dp17 0x1.c4417d0e0f1d1p18 -0x1.5ad56103p5 0x1.58cf1359281efp2 0x1.a13fd11ab4981p5 0x1.1522p-13 F +REG epsg:28992 1 OK -0x1.c47aeb700d5e2p18 -0x1.d2687efd9a848p15 -0x1.6bf64e9f6p5 -0x1.618eba20b83afp1 0x1.793fd11aae136p5 0x1.46128p-13 F +REG epsg:28992 2 OK 0x1.79a3fdd8b91ebp19 -0x1.d25469bc99828p15 -0x1.66cf092c6p5 0x1.b132c1e1197abp3 0x1.793fd11aab856p5 0x1.9228p-13 F +REG epsg:28992 3 OK -0x1.4a50147ec9493p18 0x1.0006d23f42374p20 -0x1.d17ffac1cp4 -0x1.618eba1fe212cp1 0x1.c93fd11ac114ap5 0x1.570fp-14 F +REG epsg:28992 4 OK 0x1.3c8c4602756d1p19 0x1.0007575df4528p20 -0x1.c942576dp4 0x1.b132c1e1601adp3 0x1.c93fd11abb7f4p5 0x1.dba6p-14 F +REG epsg:2900 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:2900 1 OK 0x1.7741a12d4899cp18 -0x1.b202d186cc333p20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2900 2 OK 0x1.00e42097275ep22 -0x1.b202d186cc333p20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:2900 3 OK 0x1.13b5e779cd4d6p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2900 4 OK 0x1.ebc2fb75847bep21 0x1.c81a512182c17p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:2901 0 OK 0x1.e0977efdf3b63p20 0x1.a6c8bd0f5d9f5p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:2901 1 OK 0x1.3ca7fcc422cbp16 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:2901 2 OK 0x1.d6b23f17d2a06p21 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:2901 3 OK 0x1.79b79a00e21fp18 0x1.45d92b5d83149p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:2901 4 OK 0x1.b1608bbdd772cp21 0x1.45d92b5d83149p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:2902 0 OK 0x1.0853300000003p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:2902 1 OK -0x1.5012ef61028f4p20 -0x1.b15833ac79502p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2902 2 OK 0x1.2c330fb08147cp21 -0x1.b15833ac79502p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2902 3 OK -0x1.214b965a2235p20 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2902 4 OK 0x1.14cf632d111aap21 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2903 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:2903 1 OK -0x1.0ef596d91f928p18 -0x1.b157317808227p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2903 2 OK 0x1.b25cbd872c23ap21 -0x1.b157317808227p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2903 3 OK -0x1.4f6288ed1a5dp16 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2903 4 OK 0x1.9af91ef371044p21 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2904 0 OK 0x1.4c689d560418cp21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:2904 1 OK 0x1.8927959598ba4p19 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2904 2 OK 0x1.1b43aaa351018p22 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:2904 3 OK 0x1.e6b67617f7ec6p19 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2904 4 OK 0x1.0f91ce93051b3p22 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:2905 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:2905 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2905 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:2905 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2905 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:2906 0 OK 0x1.907e0aa7ef9ep19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:2906 1 OK -0x1.1556b8086776ap20 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2906 2 OK 0x1.52ea61582b8a5p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2906 3 OK -0x1.a7e3120738976p19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2906 4 OK 0x1.3237c9d5c5f4ep21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2907 0 OK 0x1.18583aac08314p20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:2907 1 OK -0x1.8a7b0560ae28cp19 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2907 2 OK 0x1.7af6fc0433bb7p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:2907 3 OK -0x1.07b0a75717d2ep19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2907 4 OK 0x1.5a446481ce26p21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:2908 0 OK 0x1.e097400000009p19 0x1.34584a46de43p17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:2908 1 OK 0x1.2b56a357b7e14p19 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:2908 2 OK 0x1.4aebee54240ffp20 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:2908 3 OK 0x1.30b017f7ec667p19 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:2908 4 OK 0x1.483f340409cd6p20 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:2909 0 OK 0x1.e0977efdf3b63p20 0x1.34b8635602885p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:2909 1 OK 0x1.409ca1da0a5ddp20 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:2909 2 OK 0x1.40492e10ee87bp21 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:2909 3 OK 0x1.4af8a0f982deep20 0x1.d42e49f062e38p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2909 4 OK 0x1.3b1b2e8132473p21 0x1.d42e49f062e38p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2910 0 OK 0x1.e0977efdf3b63p20 0x1.437e15732559cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:2910 1 OK 0x1.38eb67f7cefd8p20 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:2910 2 OK 0x1.4421cb020c37ep21 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:2910 3 OK 0x1.43cd789910c28p20 0x1.ea990182f140ap19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:2910 4 OK 0x1.3eb0c2b16b556p21 0x1.ea990182f140ap19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:29100 0 OK 0x1.312db61abaa8fp22 0x1.312d528d714c7p23 0x1.6a04ae9p3 -0x1.b000000000001p5 -0x1.4f7c94480fd94p-47 -0x1.0p-30 T +REG epsg:29100 1 OK 0x1.0f560fb021597p22 0x1.2020702806b12p23 0x1.c42420ep1 -0x1.d800000000001p5 -0x1.4000000000025p2 0x1.0p-30 F +REG epsg:29100 2 OK 0x1.53055b22fa98ap22 0x1.2020702ca23c9p23 0x1.6e02e5828p3 -0x1.87fffffffffffp5 -0x1.3fffffffffff7p2 0x0.0p0 F +REG epsg:29100 3 OK 0x1.0f56123220c7ep22 0x1.423a34ecb0597p23 0x1.55bb1da68p3 -0x1.d800000000001p5 0x1.4000000000014p2 -0x1.0p-30 F +REG epsg:29100 4 OK 0x1.530558a0e08d3p22 0x1.423a34e814a2fp23 0x1.295a741e8p4 -0x1.8800000000001p5 0x1.400000000002bp2 -0x1.0p-30 F +REG epsg:29101 0 OK 0x1.312dce1ee8b3cp22 0x1.312d4d8f1959dp23 0x1.3d747255cp4 -0x1.b000000000001p5 -0x1.586e6d7d350ddp-46 0x1.8p-29 T +REG epsg:29101 1 OK 0x1.0f562aa350199p22 0x1.20206cbdb17eap23 0x1.760a37fb8p3 -0x1.d7fffffffffffp5 -0x1.3ffffffffffd6p2 -0x1.0p-29 F +REG epsg:29101 2 OK 0x1.530570096c19ep22 0x1.20206cc2e8979p23 0x1.4a30823f4p4 -0x1.8800000000001p5 -0x1.3fffffffffff5p2 -0x1.0p-30 F +REG epsg:29101 3 OK 0x1.0f562cfe77fcap22 0x1.423a2e5ab5558p23 0x1.267373f34p4 -0x1.d7fffffffffffp5 0x1.3ffffffffffe6p2 -0x1.0p-30 F +REG epsg:29101 4 OK 0x1.53056dae27e9dp22 0x1.423a2e557e0e8p23 0x1.b59ed0438p4 -0x1.88p5 0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:2911 0 OK 0x1.e097400000006p20 0x1.3a030d3f271bcp18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:2911 1 OK 0x1.3f60bce6c66c8p20 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:2911 2 OK 0x1.40e6e18c9cca2p21 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:2911 3 OK 0x1.466e4a61d6408p20 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:2911 4 OK 0x1.3d601acf14e02p21 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:29118 0 OK 0x1.e855b1bbf0e22p18 0x1.47de825f368fep5 -0x1.d1fc3d89p2 -0x1.2bfffffffffffp6 -0x1.2f74bf1dcfcaep-64 -0x1.0p-30 T +REG epsg:29118 1 OK -0x1.ad0965fbfd3dp15 -0x1.0ede505226158p19 -0x1.f738428p3 -0x1.3ffffffffffffp6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29118 2 OK 0x1.0193241980a34p20 -0x1.0ede50527f761p19 -0x1.8d6ef4dp2 -0x1.18p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29118 3 OK -0x1.ad0826015741p15 0x1.0ee88f303f523p19 -0x1.1285ff838p3 -0x1.3ffffffffffffp6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29118 4 OK 0x1.01931a192ab7ep20 0x1.0ee88f3098b96p19 0x1.dfab212p-1 -0x1.18p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:29119 0 OK 0x1.e8553569e2564p18 0x1.47de6f3c9fb7ap5 -0x1.a39bb718p0 -0x1.13fffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:29119 1 OK -0x1.ad0c4de0913dp15 -0x1.0ede407925f91p19 -0x1.3ea679e58p3 -0x1.28p6 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:29119 2 OK 0x1.0192fd2f34e5cp20 -0x1.0ede40797c308p19 -0x1.8f20f4f8p-1 -0x1.0p6 -0x1.3fffffffffffbp2 0x1.0p-29 F +REG epsg:29119 3 OK -0x1.ad0b0de5d9f7p15 0x1.0ee87f56a755dp19 -0x1.67d11238p1 -0x1.28p6 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:29119 4 OK 0x1.0192f32ee300dp20 0x1.0ee87f56fd93dp19 0x1.978020a1p2 -0x1.0p6 0x1.4p2 -0x1.8p-29 F +REG epsg:2912 0 OK 0x1.e097400000006p20 0x1.519f1c006078p18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:2912 1 OK 0x1.332c99d21eee2p20 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:2912 2 OK 0x1.4700f316f0895p21 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:2912 3 OK 0x1.3addbc4eed52ep20 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:2912 4 OK 0x1.432861d88956fp21 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:29120 0 OK 0x1.e854940bc4c31p18 0x1.47de5ce53d274p5 0x1.e267ea9cp1 -0x1.f8p5 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:29120 1 OK -0x1.ad10688de7dep15 -0x1.0ede3148717a1p19 -0x1.17cee986p2 -0x1.1p6 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:29120 2 OK 0x1.0192cd5508187p20 -0x1.0ede3148c396ap19 0x1.1791a579p2 -0x1.d000000000001p5 -0x1.4p2 0x1.0p-29 F +REG epsg:29120 3 OK -0x1.ad0f2893073bp15 0x1.0ee870256143fp19 0x1.632acd7cp1 -0x1.1p6 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29120 4 OK 0x1.0192c354bad58p20 0x1.0ee87025b3666p19 0x1.707ae62fp3 -0x1.d000000000001p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:29121 0 OK 0x1.e853cf66370c4p18 0x1.47de4b8c8022cp5 0x1.1c44d7088p3 -0x1.c800000000001p5 -0x1.2f74bf1dcfcaep-64 0x0.0p0 T +REG epsg:29121 1 OK -0x1.ad15aa80e881p15 -0x1.0ede22eaa359p19 0x1.f0f75aa8p-1 -0x1.fp5 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29121 2 OK 0x1.019295113261ep20 -0x1.0ede22eaf073cp19 0x1.25ab24d6p3 -0x1.ap5 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:29121 3 OK -0x1.ad146a85c6dfp15 0x1.0ee861c70975p19 0x1.03c19128p3 -0x1.fp5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29121 4 OK 0x1.01928b10ea4fap20 0x1.0ee861c756958p19 0x1.052e96758p4 -0x1.ap5 0x1.4p2 -0x1.0p-29 F +REG epsg:29122 0 OK 0x1.e852e9a0ca15dp18 0x1.47de3b630fa8ap5 0x1.b4c2126p3 -0x1.97fffffffffffp5 -0x1.2f74bf1dcfcaep-64 -0x1.0p-30 T +REG epsg:29122 1 OK -0x1.ad1c04fa569dp15 -0x1.0ede158806c53p19 0x1.80bd839fp2 -0x1.bffffffffffffp5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:29122 2 OK 0x1.01925501841e6p20 -0x1.0ede15884e059p19 0x1.b3054bf6p3 -0x1.6ffffffffffffp5 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29122 3 OK -0x1.ad1ac4fedd12p15 0x1.0ee85463ec9aap19 0x1.a510d16p3 -0x1.cp5 0x1.4p2 -0x1.8p-29 F +REG epsg:29122 4 OK 0x1.01924b0141bcep20 0x1.0ee8546433e07p19 0x1.4bdba4cb4p4 -0x1.6ffffffffffffp5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2913 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:2913 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:2913 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:2913 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:2913 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:2914 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:2914 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:2914 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:2914 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:2914 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:2915 0 OK 0x1.e097400000006p20 0x1.7249af14fd5fap18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:2915 1 OK 0x1.21cff166c8dd1p20 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:2915 2 OK 0x1.4faf474c9b926p21 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:2915 3 OK 0x1.2b7ae3b3fa782p20 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:2915 4 OK 0x1.4ad9ce2602c4dp21 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:2916 0 OK 0x1.4064d55810628p19 0x1.c0fe8fdb31172p21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:2916 1 OK -0x1.3f2832962a478p17 0x1.61539a6f805e3p21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:2916 2 OK 0x1.6849dbaad5aa6p20 0x1.61539a6f805e3p21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:2916 3 OK -0x1.d6bce3b2d8b88p16 0x1.11a734805e99cp22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:2916 4 OK 0x1.5dd0a3933ded1p20 0x1.11a734805e99cp22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:29168 0 OK 0x1.e857dbd7e12b2p18 0x1.34096c3839f8bp5 -0x1.78a34d3cp0 -0x1.2cp6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:29168 1 OK -0x1.acf709359919p15 -0x1.0ede8f5322a3p19 -0x1.4fea82378p3 -0x1.4p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:29168 2 OK 0x1.0193a64319bfcp20 -0x1.0ede8f538a26ep19 0x1.0b753b98p-1 -0x1.18p6 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:29168 3 OK -0x1.acf5dc973281p15 0x1.0ee82f89e0304p19 -0x1.e43683f4p1 -0x1.4p6 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:29168 4 OK 0x1.01939cdd9a7b4p20 0x1.0ee82f8a47bb7p19 0x1.cf2838edp2 -0x1.18p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29169 0 OK 0x1.e85735a2cf28cp18 0x1.34095775613adp5 0x1.42d47ad2p2 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:29169 1 OK -0x1.acfb1963f16cp15 -0x1.0ede7d05fa677p19 -0x1.e7258f6cp1 -0x1.2800000000001p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29169 2 OK 0x1.019373a977266p20 -0x1.0ede7d065db1bp19 0x1.b0d163dap2 -0x1.ffffffffffffep5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29169 3 OK -0x1.acf9ecc56b92p15 0x1.0ee81d3c132d1p19 0x1.744db9fep1 -0x1.2800000000001p6 0x1.4p2 -0x1.0p-29 F +REG epsg:29169 4 OK 0x1.01936a43fca3cp20 0x1.0ee81d3c767e4p19 0x1.af456ccc8p3 -0x1.ffffffffffffep5 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:2917 0 OK 0x1.e097400000006p20 0x1.aa07448f1fd21p22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:2917 1 OK 0x1.0e08d221ed162p20 0x1.77a266cdd0422p22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:2917 2 OK 0x1.5992d6ef09755p21 0x1.77a266cdd0422p22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:2917 3 OK 0x1.18ae070a3968ap20 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:2917 4 OK 0x1.54403c7ae34c1p21 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:29170 0 OK 0x1.e85664c50d862p18 0x1.340943ad2d96bp5 0x1.6813d3efp3 -0x1.f7ffffffffffep5 -0x1.2f74bf1dcfcbp-64 -0x1.8p-29 T +REG epsg:29170 1 OK -0x1.ad008c81569ap15 -0x1.0ede6b95c5cc3p19 0x1.51c03e4p1 -0x1.1p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29170 2 OK 0x1.019336d2d0b7p20 -0x1.0ede6b9623c5fp19 0x1.947dd70b8p3 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29170 3 OK -0x1.acff5fe29718p15 0x1.0ee80bcb418f8p19 0x1.2b4cd3988p3 -0x1.1p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:29170 4 OK 0x1.01932d6d5b9bep20 0x1.0ee80bcb9f8fdp19 0x1.35ad426ccp4 -0x1.d000000000001p5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:29171 0 OK 0x1.e8556b8875674p18 0x1.340931171aa63p5 0x1.115d9397p4 -0x1.c800000000001p5 -0x1.2f74bf1dcfcacp-64 0x1.8p-29 T +REG epsg:29171 1 OK -0x1.ad07534491abp15 -0x1.0ede5b336d9b4p19 0x1.187f6f4d8p3 -0x1.fp5 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:29171 2 OK 0x1.0192f069cb37ap20 -0x1.0ede5b33c53c8p19 0x1.21739e914p4 -0x1.ap5 -0x1.4p2 -0x1.0p-29 F +REG epsg:29171 3 OK -0x1.ad0626a57ecp15 0x1.0ee7fb6855da3p19 0x1.ef5c25b8p3 -0x1.fp5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:29171 4 OK 0x1.0192e7045c1a6p20 0x1.0ee7fb68ad816p19 0x1.8ce1ef6ap4 -0x1.ap5 0x1.4p2 -0x1.0p-29 F +REG epsg:29172 0 OK 0x1.e8544ca8191f6p18 0x1.34091fe749577p5 0x1.67aa59a58p4 -0x1.97fffffffffffp5 0x1.2f74bf1dcfcacp-63 0x1.8p-29 T +REG epsg:29172 1 OK -0x1.ad0f5aabd59cp15 -0x1.0ede4c0ce5ac2p19 0x1.d03ed53dp3 -0x1.cp5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:29172 2 OK 0x1.0192a133e3b3p20 -0x1.0ede4c0d35fe3p19 0x1.70dddb3d4p4 -0x1.7000000000001p5 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:29172 3 OK -0x1.ad0e2e0c5668p15 0x1.0ee7ec4145822p19 0x1.538dbf724p4 -0x1.cp5 0x1.4p2 -0x1.0p-29 F +REG epsg:29172 4 OK 0x1.019297ce7b194p20 0x1.0ee7ec4195d9bp19 0x1.dc4c2692cp4 -0x1.7p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:29177 0 OK 0x1.e85607a7d5054p18 0x1.b9982e47de03bp22 -0x1.f35539afp4 -0x1.44p6 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:29177 1 OK -0x1.fb1024fb25cep14 0x1.9701be8007f5p22 -0x1.3b7f33e56p5 -0x1.5a114b818572ep6 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:29177 2 OK 0x1.f82e88e05665cp19 0x1.9701be7fd5ce2p22 -0x1.e16a6720cp4 -0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:29177 3 OK -0x1.2fa28a1e8ec68p16 0x1.dacb288b144dap22 -0x1.05e5dd2d6p5 -0x1.5a114b818572ep6 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:29177 4 OK 0x1.07252c80cdc9ep20 0x1.dacb288ae496bp22 -0x1.697e84314p4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 0x1.0p-29 F +REG epsg:29178 0 OK 0x1.e855b1be90696p18 0x1.b998381afa64bp22 -0x1.9f05ac834p4 -0x1.2cp6 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:29178 1 OK -0x1.fb13d5779bbp14 0x1.9701ca347e5aep22 -0x1.1281dd25cp5 -0x1.42114b818572ep6 -0x1.dfffffffffffap4 0x1.8p-29 F +REG epsg:29178 2 OK 0x1.f82e507a98c7ap19 0x1.9701ca344d65cp22 -0x1.9303a7cep4 -0x1.15eeb47e7a8d3p6 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:29178 3 OK -0x1.2fa363039e67p16 0x1.dacb308f51683p22 -0x1.b2d7df6d8p4 -0x1.42114b818572ep6 -0x1.4000000000002p4 0x1.4p-28 F +REG epsg:29178 4 OK 0x1.07250f1a362dp20 0x1.dacb308f22d46p22 -0x1.146c816a8p4 -0x1.15eeb47e7a8d2p6 -0x1.3fffffffffffep4 -0x1.0p-30 F +REG epsg:29179 0 OK 0x1.e855356c7c855p18 0x1.b99841a396417p22 -0x1.4d3572b0cp4 -0x1.14p6 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:29179 1 OK -0x1.fb19f941a55p14 0x1.9701d59031d4ap22 -0x1.d49c616d4p4 -0x1.2a114b818572fp6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29179 2 OK 0x1.f82e054649f7ep19 0x1.9701d590029aap22 -0x1.47c9bc758p4 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:29179 3 OK -0x1.2fa4d94e1bc7p16 0x1.dacb3856c3ba4p22 -0x1.5b99a8708p4 -0x1.2a114b818572ep6 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:29179 4 OK 0x1.0724e85570078p20 0x1.dacb385696cc2p22 -0x1.8598ee1e8p3 -0x1.fbdd68fcf51a4p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2918 0 OK 0x1.18583aa9fbe7ap21 0x1.38abba7c13556p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:2918 1 OK 0x1.66573f1cbd669p20 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:2918 2 OK 0x1.7d84d5c5991c8p21 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:2918 3 OK 0x1.6f78cd5a43b24p20 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:2918 4 OK 0x1.78f40ea6d5f6ap21 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:29180 0 OK 0x1.e854940e50047p18 0x1.b9984ac6f450ep22 -0x1.fd9407d18p3 -0x1.f8p5 -0x1.8fffffffffffdp4 -0x1.0p-29 F +REG epsg:29180 1 OK -0x1.fb227f20627ap14 0x1.9701e0734704ap22 -0x1.86a9e0d4p4 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29180 2 OK 0x1.f82da8165ae88p19 0x1.9701e0731a0a5p22 -0x1.008fa2fc8p4 -0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x1.0p-30 F +REG epsg:29180 3 OK -0x1.2fa6e8e4206dp16 0x1.dacb3fcb99c47p22 -0x1.0705c7cacp4 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:29180 4 OK 0x1.0724b89f39774p20 0x1.dacb3fcb6efa2p22 -0x1.d60d5612p2 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG epsg:29181 0 OK 0x1.e853cf68a982p18 0x1.b998536b73466p22 -0x1.693ea5e78p3 -0x1.c8p5 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:29181 1 OK -0x1.fb2d4f2bdabep14 0x1.9701eabf34e4p22 -0x1.3c06d840cp4 -0x1.f42297030ae5cp5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:29181 2 OK 0x1.f82d39f02c3bep19 0x1.9701eabf0aa7ep22 -0x1.7c3a43348p3 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:29181 3 OK -0x1.2fa98bfdd3958p16 0x1.dacb46d8e9c1fp22 -0x1.6c12ebe08p3 -0x1.f42297030ae5cp5 -0x1.4p4 0x1.0p-30 F +REG epsg:29181 4 OK 0x1.0724807d65b64p20 0x1.dacb46d8c193bp22 -0x1.6b4f09aap1 -0x1.9bdd68fcf51a3p5 -0x1.4p4 0x1.0p-29 F +REG epsg:29182 0 OK 0x1.e852e9a319d16p18 0x1.b9985b78d5b4p22 -0x1.be159356p2 -0x1.9800000000001p5 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:29182 1 OK -0x1.fb3a4b100cacp14 0x1.9701f4571a65cp22 -0x1.eb093cc2p3 -0x1.c42297030ae5dp5 -0x1.e000000000003p4 -0x1.8p-29 F +REG epsg:29182 2 OK 0x1.f82cbc08b114cp19 0x1.9701f456f35e8p22 -0x1.02592d14p3 -0x1.6bdd68fcf51a4p5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:29182 3 OK -0x1.2facbb35a1a6p16 0x1.dacb4d6aec4eep22 -0x1.a61f6035p2 -0x1.c42297030ae5cp5 -0x1.4000000000003p4 -0x1.0p-29 F +REG epsg:29182 4 OK 0x1.0724408d65b7bp20 0x1.dacb4d6ac72dbp22 0x1.4b5ad5dp0 -0x1.6bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:29183 0 OK 0x1.e851e54218e53p18 0x1.b99862d886052p22 -0x1.81f04ae8p1 -0x1.68p5 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:29183 1 OK -0x1.fb494e6201p14 0x1.9701fd200f75cp22 -0x1.67d1eb588p3 -0x1.942297030ae5dp5 -0x1.e000000000003p4 0x1.8p-29 F +REG epsg:29183 2 OK 0x1.f82c2fc10c864p19 0x1.9701fd1fec11p22 -0x1.29a3b56cp2 -0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:29183 3 OK -0x1.2fb06d9cfbe58p16 0x1.dacb536f33e13p22 -0x1.12bc177ep1 -0x1.942297030ae5ep5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:29183 4 OK 0x1.0723f9828e8a8p20 0x1.dacb536f12354p22 0x1.4087830dp2 -0x1.3bdd68fcf51a3p5 -0x1.4000000000002p4 -0x1.0p-29 F +REG epsg:29184 0 OK 0x1.e850c51ff60ebp18 0x1.b9986975d5d4bp22 0x1.10a88d38p-1 -0x1.38p5 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:29184 1 OK -0x1.fb5a2f05f1aep14 0x1.97020501706dp22 -0x1.dfaf871cp2 -0x1.642297030ae5dp5 -0x1.dfffffffffffcp4 -0x1.8p-29 F +REG epsg:29184 2 OK 0x1.f82b96a2b30a4p19 0x1.97020501510e2p22 -0x1.a6bbf91cp0 -0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:29184 3 OK -0x1.2fb498d5664e8p16 0x1.dacb58d4e075ep22 0x1.ebfdec24p0 -0x1.642297030ae5cp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:29184 4 OK 0x1.0723ac242258p20 0x1.dacb58d4c29dep22 0x1.08681d8ep3 -0x1.0bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:29185 0 OK 0x1.e84f8c64d7a95p18 0x1.b9986f3e37ed6p22 0x1.d12a7ff8p1 -0x1.08p5 -0x1.8fffffffffffep4 -0x1.0p-30 F +REG epsg:29185 1 OK -0x1.fb6cbda564e8p14 0x1.97020be5232b8p22 -0x1.08d68d7bp2 -0x1.342297030ae5cp5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:29185 2 OK 0x1.f82af25b1afa4p19 0x1.97020be5082aep22 0x1.c88b43dp-1 -0x1.b7bad1f9ea348p4 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:29185 3 OK -0x1.2fb9312d8d1a8p16 0x1.dacb5d8ccee4cp22 0x1.641ef242p2 -0x1.342297030ae5dp5 -0x1.4p4 0x0.0p0 F +REG epsg:29185 4 OK 0x1.0723594b21858p20 0x1.dacb5d8cb5349p22 0x1.60b4579dp3 -0x1.b7bad1f9ea348p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:29187 0 OK 0x1.e858559500c1cp18 0x1.b9982d816ee48p22 -0x1.9c7c1cdacp4 -0x1.44p6 -0x1.8ffffffffffffp4 0x1.0p-30 F +REG epsg:29187 1 OK -0x1.fae97770971ap14 0x1.9701bfaacbe8cp22 -0x1.16859e68ep5 -0x1.5a114b818572ep6 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:29187 2 OK 0x1.f82fa163ebb62p19 0x1.9701bfaa91838p22 -0x1.7ee5ce014p4 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:29187 3 OK -0x1.2f98d4e5d683p16 0x1.dacb25e6a33ap22 -0x1.c302ffe3p4 -0x1.5a114b818572ep6 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:29187 4 OK 0x1.0725b825a6a96p20 0x1.dacb25e66bab8p22 -0x1.060d5d2dcp4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 0x1.0p-30 F +REG epsg:29188 0 OK 0x1.e857dbdad77d8p18 0x1.b99838e9f500ep22 -0x1.3a957cb98p4 -0x1.2cp6 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:29188 1 OK -0x1.faef1fa95a36p14 0x1.9701cd4242aeap22 -0x1.cd64979cp4 -0x1.42114b818572fp6 -0x1.dfffffffffffcp4 0x1.8p-29 F +REG epsg:29188 2 OK 0x1.f82f54eb047d6p19 0x1.9701cd4209faap22 -0x1.2450efe1cp4 -0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:29188 3 OK -0x1.2f9a28a0c4d78p16 0x1.dacb2f35adaf4p22 -0x1.5b397606cp4 -0x1.42114b818572ep6 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:29188 4 OK 0x1.07259083dd882p20 0x1.dacb2f3577bd3p22 -0x1.4787ff6fp3 -0x1.15eeb47e7a8d2p6 -0x1.4p4 0x1.0p-30 F +REG epsg:29189 0 OK 0x1.e85735a5befefp18 0x1.b99843ec7150ap22 -0x1.b834f883p3 -0x1.14p6 -0x1.8ffffffffffffp4 -0x1.0p-30 F +REG epsg:29189 1 OK -0x1.faf7a107b48p14 0x1.9701da60281a4p22 -0x1.7011aa4ap4 -0x1.2a114b818572ep6 -0x1.e000000000001p4 -0x1.8p-29 F +REG epsg:29189 2 OK 0x1.f82ef2c0247e3p19 0x1.9701da5ff1b6ep22 -0x1.9bd40447p3 -0x1.fbdd68fcf51a5p5 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:29189 3 OK -0x1.2f9c336d0dbc8p16 0x1.dacb383175568p22 -0x1.ebeca1dcp3 -0x1.2a114b818572ep6 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:29189 4 OK 0x1.07255e15901b9p20 0x1.dacb383141985p22 -0x1.180e5811p2 -0x1.fbdd68fcf51a4p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2919 0 OK 0x1.e097400000006p20 0x1.9e15d995fed96p23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:2919 1 OK 0x1.00cc87766a532p20 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:2919 2 OK 0x1.6030fc44cad64p21 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:2919 3 OK 0x1.0b39a79d764fp20 0x1.b999bb2d94beep23 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:2919 4 OK 0x1.5afa6c3144d86p21 0x1.b999bb2d94beep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:29190 0 OK 0x1.e85664c7eb2ddp18 0x1.b9984e6a02bc2p22 -0x1.0428345ep3 -0x1.f8p5 -0x1.9p4 0x1.8p-29 F +REG epsg:29190 1 OK -0x1.fb02e3b026e4p14 0x1.9701e6dfb22b8p22 -0x1.1618355ep4 -0x1.12114b818572ep6 -0x1.e000000000001p4 -0x1.0p-29 F +REG epsg:29190 2 OK 0x1.f82e7bf6a560dp19 0x1.9701e6df7eb16p22 -0x1.f28d6bc4p2 -0x1.cbdd68fcf51a1p5 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:29190 3 OK -0x1.2f9eef903bce8p16 0x1.dacb40c0c7edfp22 -0x1.28ab29efp3 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:29190 4 OK 0x1.072521683294cp20 0x1.dacb40c096f5p22 0x1.22cecb84p0 -0x1.cbdd68fcf51a2p5 -0x1.4000000000002p4 -0x1.0p-29 F +REG epsg:29191 0 OK 0x1.e8556b8b34d6dp18 0x1.b99858453d02ap22 -0x1.6bf6af54p1 -0x1.c8p5 -0x1.9000000000001p4 -0x1.0p-29 F +REG epsg:29191 1 OK -0x1.fb10c80d1688p14 0x1.9701f29dd313fp22 -0x1.80e9285fp3 -0x1.f42297030ae5cp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:29191 2 OK 0x1.f82df1dbb573ep19 0x1.9701f29da313ep22 -0x1.8b077dbp1 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:29191 3 OK -0x1.2fa2555e78be8p16 0x1.dacb48cba36e8p22 -0x1.bb48a5bcp1 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG epsg:29191 4 OK 0x1.0724db25f5dc2p20 0x1.dacb48cb75c46p22 0x1.8f58bca1p2 -0x1.9bdd68fcf51a4p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:29192 0 OK 0x1.e8544caaae41fp18 0x1.b99861627b3e4p22 0x1.05c0a53cp1 -0x1.9800000000001p5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:29192 1 OK -0x1.fb212727668ep14 0x1.9701fd799b862p22 -0x1.c05be47dp2 -0x1.c42297030ae5dp5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:29192 2 OK 0x1.f82d55f2b11bp19 0x1.9701fd796f87p22 0x1.30a2a3b8p0 -0x1.6bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:29192 3 OK -0x1.2fa65b50126e8p16 0x1.dacb503b795f4p22 0x1.fca8f01cp0 -0x1.c42297030ae5cp5 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:29192 4 OK 0x1.07248c13ea2e2p20 0x1.dacb503b4f846p22 0x1.5c264f108p3 -0x1.6bdd68fcf51a3p5 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:29193 0 OK 0x1.e8530b4afa583p18 0x1.b99869a82d6acp22 0x1.9ed519ebp2 -0x1.68p5 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:29193 1 OK -0x1.fb33d313c55p14 0x1.9702075497134p22 -0x1.2f065f76p1 -0x1.942297030ae5ep5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29193 2 OK 0x1.f82ca9f0e449ep19 0x1.970207546f90cp22 0x1.3f7836a3p2 -0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29193 3 OK -0x1.2faaf61c36b68p16 0x1.dacb56fb6e189p22 0x1.c143088cp2 -0x1.942297030ae5dp5 -0x1.4p4 0x1.0p-30 F +REG epsg:29193 4 OK 0x1.0724350fd65b6p20 0x1.dacb56fb48828p22 0x1.e0273c068p3 -0x1.3bdd68fcf51a4p5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:29194 0 OK 0x1.e851aaf17babbp18 0x1.b99870ff20152p22 0x1.4d634935p3 -0x1.37fffffffffffp5 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:29194 1 OK -0x1.fb4897737998p14 0x1.9702101321926p22 0x1.d5dce6d4p0 -0x1.642297030ae5dp5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:29194 2 OK 0x1.f82befb8bff61p19 0x1.97021012fefbcp22 0x1.08e03f3dp3 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29194 3 OK -0x1.2fb018d89a5fp16 0x1.dacb5cf89341cp22 0x1.728f568cp3 -0x1.642297030ae5dp5 -0x1.4000000000001p4 0x1.8p-29 F +REG epsg:29194 4 OK 0x1.0723d70dc9bccp20 0x1.dacb5cf8725a2p22 0x1.291e74abcp4 -0x1.0bdd68fcf51a2p5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:29195 0 OK 0x1.e8502f7a7452cp18 0x1.b9987752bd6c4p22 0x1.b9f90d288p3 -0x1.08p5 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:29195 1 OK -0x1.fb5f3a07459p14 0x1.9702179cb4a6p22 0x1.63a0ee41p2 -0x1.342297030ae5dp5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29195 2 OK 0x1.f82b295490fbfp19 0x1.9702179c975c6p22 0x1.6059dbd8p3 -0x1.b7bad1f9ea345p4 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:29195 3 OK -0x1.2fb5b51db2b8p16 0x1.dacb62221ce7ep22 0x1.f3c54a3ap3 -0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:29195 4 OK 0x1.072373156faeap20 0x1.dacb6222010b5p22 0x1.5893aea04p4 -0x1.b7bad1f9ea34ap4 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:2920 0 OK 0x1.e097400000009p19 0x1.0050fa905671ap24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:2920 1 OK 0x1.5a737b344956cp17 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:2920 2 OK 0x1.b548d09976d6ep20 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:2920 3 OK 0x1.959b7d15aec24p17 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:2920 4 OK 0x1.ade3d05d4a296p20 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:2921 0 OK 0x1.907e3f2b020c4p20 0x1.b0bcb31dc80ddp21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:2921 1 OK 0x1.0c2d791b0ddfdp20 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:2921 2 OK 0x1.0a67829d7b1c6p21 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:2921 3 OK 0x1.11e2dc82e7e8p20 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:2921 4 OK 0x1.078cd0e98e184p21 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:2922 0 OK 0x1.907e3f2b020c4p20 0x1.aa3e8395be8cep22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:2922 1 OK 0x1.7593ba36d54f5p19 0x1.77a162f228e24p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:2922 2 OK 0x1.3319509d4cb7fp21 0x1.77a162f228e24p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:2922 3 OK 0x1.913c3b56f469ap19 0x1.de9a059a5b245p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:2922 4 OK 0x1.2c2f305544f16p21 0x1.de9a059a5b245p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:29220 0 OK 0x1.e894a9c74c109p18 0x1.b9962fdc09811p22 -0x1.4a1f14d48p5 -0x1.f7ffffffffffep5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:29220 1 OK -0x1.f72675075ffep14 0x1.96ffbcc2815fp22 -0x1.f587e1d72p5 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:29220 2 OK 0x1.f84dddc4df418p19 0x1.96ffbcc16e358p22 -0x1.7384bdcbp3 -0x1.cbdd68fcf51a2p5 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:29220 3 OK -0x1.2ea9b40b6dc2p16 0x1.dac92d52b0c1p22 -0x1.2cb533837p6 -0x1.12114b818572ep6 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:29220 4 OK 0x1.0734f06470864p20 0x1.dac92d51ab0a2p22 -0x1.3c00d099p4 -0x1.cbdd68fcf51a2p5 -0x1.4000000000003p4 -0x1.0p-30 F +REG epsg:29221 0 OK 0x1.e88f8b4f1a822p18 0x1.b9966461ad2a9p22 -0x1.a31ba7e48p3 -0x1.c800000000001p5 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:29221 1 OK -0x1.f76f61b901f2p14 0x1.96fffb553c44cp22 -0x1.118e7962p5 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x1.0p-30 F +REG epsg:29221 2 OK 0x1.f84b06ad8bda3p19 0x1.96fffb543b546p22 0x1.af3b48fb8p3 -0x1.9bdd68fcf51a3p5 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:29221 3 OK -0x1.2ebb887dfe8p16 0x1.dac9582df71fdp22 -0x1.620c55286p5 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:29221 4 OK 0x1.07337e6ae3e9cp20 0x1.dac9582d02c14p22 0x1.de0ff12bp2 -0x1.9bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2923 0 OK 0x1.907e3f2b020c4p20 0x1.35b8f277f903cp23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:2923 1 OK 0x1.edab35460106dp19 0x1.233be022151cdp23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:2923 2 OK 0x1.151371d981ca1p21 0x1.233be022151cdp23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:2923 3 OK 0x1.fb40883a07bdp19 0x1.48a3d66522362p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:2923 4 OK 0x1.11ae1d1c801c8p21 0x1.48a3d66522362p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:2924 0 OK 0x1.5e6e495581066p23 0x1.a18871711cb3ap22 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:2924 1 OK 0x1.4cf5197041c02p23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:2924 2 OK 0x1.6fe7793ac04cap23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:2924 3 OK 0x1.4daf24ae7391ap23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:2924 4 OK 0x1.6f2d6dfc8e7b2p23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:2925 0 OK 0x1.5e6e495581066p23 0x1.b4c9df24ac0d8p21 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:2925 1 OK 0x1.4bcff5cb476d5p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:2925 2 OK 0x1.710c9cdfba9f7p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:2925 3 OK 0x1.4c99ab85b93fcp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:2925 4 OK 0x1.7042e72548cdp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:2926 0 OK 0x1.907e0aac08315p20 0x1.34b943da25dc3p18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:2926 1 OK 0x1.e1046a555e29ep19 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:2926 2 OK 0x1.183cf016b0a7cp21 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:2926 3 OK 0x1.f5bf3365debffp19 0x1.d42f38a973c76p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2926 4 OK 0x1.130e3dd290822p21 0x1.d42f38a973c76p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:2927 0 OK 0x1.907e0aac08315p20 0x1.641db43fe1665p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:2927 1 OK 0x1.aeba938e29b6cp19 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:2927 2 OK 0x1.24cf65c87dc3ap21 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:2927 3 OK 0x1.c8e23804965acp19 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:2927 4 OK 0x1.1e457caae29aap21 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:2928 0 OK 0x1.e097400000006p20 0x1.1ce0d17f7cab7p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:2928 1 OK 0x1.4d9405f33b671p20 -0x1.1462814d34f12p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:2928 2 OK 0x1.39cd3d06624cep21 -0x1.1462814d34f12p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:2928 3 OK 0x1.55d5a07b34e9ep20 0x1.af67f5201dffp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:2928 4 OK 0x1.35ac6fc2658b7p21 0x1.af67f5201dffp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:2929 0 OK 0x1.e097400000006p20 0x1.28adfc81f1783p18 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:2929 1 OK 0x1.477bd35a7b7f1p20 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:2929 2 OK 0x1.3cd95652c240ep21 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:2929 3 OK 0x1.500ba7b16b424p20 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:2929 4 OK 0x1.38916c274a5f4p21 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:2930 0 OK 0x1.e097400000006p20 0x1.6fca8cd604f09p18 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:2930 1 OK 0x1.21d65e6fa50cp20 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:2930 2 OK 0x1.4fac10c82d79ep21 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:2930 3 OK 0x1.2e4ecb4ca001cp20 0x1.16ea191559a8fp20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:2930 4 OK 0x1.496fda59afffp21 0x1.16ea191559a8fp20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:2931 0 OK 0x1.e85739a88aac3p18 -0x1.77d955f3ed7ap7 0x1.55068c148p3 0x1.ap3 0x0.0p0 0x1.0p-30 T +REG epsg:2931 1 OK -0x1.acf6465f0168p15 -0x1.0efabf0695c34p19 0x1.7779716c4p4 0x1.00000000f033fp3 -0x1.3fffffffea4edp2 0x0.0p0 F +REG epsg:2931 2 OK 0x1.01934f12b3a8ap20 -0x1.0efabf06fadc7p19 0x1.105f3789p5 0x1.1fffffff87bep4 -0x1.3fffffffea468p2 0x1.0p-30 F +REG epsg:2931 3 OK -0x1.acfc01aeba1fp15 0x1.0ecbc442cf2c8p19 -0x1.29cde427p3 0x1.00000000f03ccp3 0x1.3fffffffea525p2 -0x1.0p-30 F +REG epsg:2931 4 OK 0x1.01937cefc1c1fp20 0x1.0ecbc44334239p19 0x1.45e44f54p0 0x1.1fffffff87b98p4 0x1.3fffffffea4a4p2 -0x1.0p-29 F +REG epsg:2932 0 OK 0x1.86c69e7758688p17 0x1.24e54aa78ec2ep18 0x1.d5d81b898p4 0x1.99bbbbbbedfd5p5 0x1.87333332e8d9ap4 0x1.49878p-13 F +REG epsg:2932 1 OK -0x1.70838f332d554p18 -0x1.dd7df4bac6c84p17 0x1.706029c2p4 0x1.6dcaf9f8fa40dp5 0x1.37333332c22fcp4 0x1.4371p-13 F +REG epsg:2932 2 OK 0x1.7ba4441adf29ep19 -0x1.dd8144f9b7ce4p17 0x1.44541874cp5 0x1.c5ac7d7ed8436p5 0x1.37333332c6982p4 0x1.ae0a8p-13 F +REG epsg:2932 3 OK -0x1.4561375e1daecp18 0x1.a71bbaa417b2dp19 0x1.dfbb239c8p3 0x1.6dcaf9f8d64a7p5 0x1.d7333332b9752p4 0x1.d8a8p-14 F +REG epsg:2932 4 OK 0x1.6614c65911c51p19 0x1.a71ae45f135c5p19 0x1.f2a00879cp4 0x1.c5ac7d7f0d3b7p5 0x1.d7333332b6f1ep4 0x1.581e8p-13 F +REG epsg:2933 0 OK 0x1.e83bde4dc92p18 0x1.b996e51ffeda1p22 0x1.b2c1a216cp4 0x1.d4p6 -0x1.9000000000003p4 -0x1.0p-29 F +REG epsg:2933 1 OK -0x1.fc93e66ce96ap14 0x1.97008a6e08297p22 0x1.030103b5p6 0x1.bdeeb47e7a8d3p6 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:2933 2 OK 0x1.f8207d7771eafp19 0x1.97008a6e33816p22 0x1.c5549a8a6p5 0x1.ea114b818573p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2933 3 OK -0x1.3008966c80c88p16 0x1.dac9cb52b4d2bp22 0x1.2ab8b09f8p3 0x1.bdeeb47e7a8d3p6 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:2933 4 OK 0x1.071e78829ac3cp20 0x1.dac9cb52dep22 0x1.200b74ap-1 0x1.ea114b818573p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:29333 0 OK 0x1.e8586d8c9b8a3p18 0x1.b99b93277f58dp22 -0x1.abffcd2ecp4 0x1.dfffffffffffep3 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:29333 1 OK -0x1.fae703ade468p14 0x1.970524901a121p22 -0x1.ce5841c8p4 0x1.2f75a3f3d468fp3 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:29333 2 OK 0x1.f82fa5bc54da6p19 0x1.9705248fdf7dcp22 -0x1.1f2e7be4p4 0x1.48452e0615cb9p4 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:29333 3 OK -0x1.2f989dea301p16 0x1.dace8c68cd319p22 -0x1.a64314d64p4 0x1.2f75a3f3d468dp3 -0x1.4p4 0x1.0p-30 F +REG epsg:29333 4 OK 0x1.0725c0b1866c8p20 0x1.dace8c6895783p22 -0x1.d065fc268p3 0x1.48452e0615cb9p4 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2934 0 OK -0x1.e567c382c2aap22 0x1.b76ee3ed766c7p19 -0x1.45e591fecp5 0x1.b800000000001p6 0x1.97e1a6bbe6467p-41 -0x1.8p-29 T +REG epsg:2934 1 OK -0x1.03a34880abab7p23 0x1.53e07046c63fep18 -0x1.32ac6d7c8p4 0x1.a4p6 -0x1.3fffffffffe22p2 -0x1.0p-28 F +REG epsg:2934 2 OK -0x1.c388f5fc62fb8p22 0x1.53dfe360d44b8p18 -0x1.6273a59d8p5 0x1.cc00000000002p6 -0x1.3fffffffffe2cp2 0x1.0p-30 F +REG epsg:2934 3 OK -0x1.03a34880abab7p23 0x1.6276c7e535feap20 -0x1.a50883c8cp4 0x1.a4p6 0x1.3fffffffffe29p2 -0x1.0p-28 F +REG epsg:2934 4 OK -0x1.c388f5fc62fb8p22 0x1.6276eb1d5e558p20 -0x1.9ba1bfa26p5 0x1.cc00000000002p6 0x1.3fffffffffe24p2 0x0.0p0 F +REG epsg:2935 0 OK 0x1.3d68044ff7794p20 0x1.6358a1a5c9758p6 -0x1.f4ddbd8f8p4 0x1.4c444444416efp5 0x1.ddddddcc04e86p-4 0x1.d17dp-14 T +REG epsg:2935 1 OK 0x1.6bac1b569e93ap19 -0x1.0eee11b4e1ba8p19 -0x1.8c05b149p5 0x1.24443ed54267p5 -0x1.388888889ebdbp2 0x1.e7d2p-14 F +REG epsg:2935 2 OK 0x1.c4f9e6e315ea4p20 -0x1.0eee2d833d206p19 -0x1.c618bd948p4 0x1.744449b342269p5 -0x1.38888888ad1d7p2 0x1.dea5p-14 F +REG epsg:2935 3 OK 0x1.6bc51b472183bp19 0x1.0f10e514a33e9p19 -0x1.1b53f5532p5 0x1.24443ed53ff68p5 0x1.477777770e6abp2 0x1.c25cp-14 F +REG epsg:2935 4 OK 0x1.c4ed8f44a34a3p20 0x1.0f10b08f8146p19 -0x1.c9b47baep3 0x1.744449b34125bp5 0x1.4777777701543p2 0x1.b10ap-14 F +REG epsg:2936 0 OK 0x1.18c5e11b679b9p21 0x1.61bf893d89c8ap6 -0x1.90b1f50a8p4 0x1.64444444416ap5 0x1.ddddddcaff433p-4 0x1.cd6ep-14 T +REG epsg:2936 1 OK 0x1.a9f9d3b103d8cp20 -0x1.0eee0bbf4561ep19 -0x1.576fa569cp5 0x1.3c443ed5424cp5 -0x1.38888888a3489p2 0x1.e534p-14 F +REG epsg:2936 2 OK 0x1.5c8ecdc11b3ccp21 -0x1.0eee29daf89cp19 -0x1.6867e2838p4 0x1.8c4449b34224p5 -0x1.38888888b101fp2 0x1.dbbep-14 F +REG epsg:2936 3 OK 0x1.aa0654cf84d6cp20 0x1.0f10c7d9e6263p19 -0x1.cd8723488p4 0x1.3c443ed53fee8p5 0x1.477777770a47ep2 0x1.bd2bp-14 F +REG epsg:2936 4 OK 0x1.5c88a286c82d7p21 0x1.0f109107cebd2p19 -0x1.0e67fab18p3 0x1.8c4449b3413a1p5 0x1.47777776fddb3p2 0x1.abf4p-14 F +REG epsg:2937 0 OK 0x1.92d7bd7b4d861p21 0x1.6011428d04b55p6 -0x1.301f110f4p4 0x1.7c444444416dp5 0x1.ddddddca06c6ap-4 0x1.c96p-14 T +REG epsg:2937 1 OK 0x1.4f0eca238b8fdp21 -0x1.0eee0723a600fp19 -0x1.246956c18p5 0x1.54443ed542386p5 -0x1.38888888a7a57p2 0x1.e26ep-14 F +REG epsg:2937 2 OK 0x1.d6a0a5a8d6275p21 -0x1.0eee276f15582p19 -0x1.0ebb92aap4 0x1.a44449b34228fp5 -0x1.38888888b4ad9p2 0x1.d8d3p-14 F +REG epsg:2937 3 OK 0x1.4f150b3e8355fp21 0x1.0f10aa88b017p19 -0x1.6785a8d8cp4 0x1.54443ed53fef3p5 0x1.4777777706557p2 0x1.b7eep-14 F +REG epsg:2937 4 OK 0x1.d69a7afbf4455p21 0x1.0f1071873852dp19 -0x1.6c900906p1 0x1.a44449b341574p5 0x1.47777776fa999p2 0x1.a6fap-14 F +REG epsg:29371 0 OK -0x1.651ff18c5b502p4 -0x1.6935b484bcffdp5 -0x1.bf7b34fd8p4 0x1.6000000000001p3 -0x1.5ffffffffffffp4 0x1.0p-29 F +REG epsg:29371 1 OK 0x1.059144018c776p19 0x1.13ffe808a9af9p19 -0x1.d1abaf4a4p4 0x1.66de6f117efc4p2 -0x1.afffffffd542fp4 -0x1.0p-29 F +REG epsg:29371 2 OK -0x1.0596d888251bbp19 0x1.13ffe80941065p19 -0x1.95da9e378p4 0x1.0648643ba04a6p4 -0x1.afffffffd53d6p4 -0x1.0p-30 F +REG epsg:29371 3 OK 0x1.18b97f2fafee8p19 -0x1.0a68c1a31784p19 -0x1.53863a8b8p4 0x1.66de6f132537ap2 -0x1.0fffffffe98c3p4 0x1.0p-29 F +REG epsg:29371 4 OK -0x1.18bf13b818f6p19 -0x1.0a68c1a295d43p19 -0x1.1352f8484p4 0x1.0648643b36af3p4 -0x1.0fffffffe9895p4 0x1.0p-29 F +REG epsg:29373 0 OK -0x1.6071bee5211dp5 -0x1.6cae8e7e926aap5 -0x1.ae4aa4b2p4 0x1.ap3 -0x1.5ffffffffffffp4 0x1.0p-30 F +REG epsg:29373 1 OK 0x1.058e89b0fa221p19 0x1.13ffd714ef632p19 -0x1.de596236p4 0x1.e6de6f117f0ebp2 -0x1.afffffffd5457p4 -0x1.0p-30 F +REG epsg:29373 2 OK -0x1.05998d4c69c3ap19 0x1.13ffd7161a1adp19 -0x1.6848a279cp4 0x1.2648643ba04f2p4 -0x1.afffffffd53abp4 0x0.0p0 F +REG epsg:29373 3 OK 0x1.18b6c47173887p19 -0x1.0a68cc90d46fap19 -0x1.6121c882p4 0x1.e6de6f132531fp2 -0x1.0fffffffe98dcp4 -0x1.0p-30 F +REG epsg:29373 4 OK -0x1.18c1c8107592cp19 -0x1.0a68cc8fd4746p19 -0x1.c4d4215cp3 0x1.2648643b36adap4 -0x1.0fffffffe9882p4 -0x1.0p-29 F +REG epsg:29375 0 OK -0x1.06f2c824c75d5p6 -0x1.726ccf6e8175ep5 -0x1.91dba5b84p4 0x1.e000000000001p3 -0x1.6000000000001p4 -0x1.0p-30 F +REG epsg:29375 1 OK 0x1.058bcf47b8043p19 0x1.13ffbb0ac2342p19 -0x1.e032c9f6p4 0x1.336f3788bf90ep3 -0x1.afffffffd5485p4 -0x1.0p-29 F +REG epsg:29375 2 OK -0x1.059c3e8857426p19 0x1.13ffbb0c7ff2dp19 -0x1.30073100cp4 0x1.4648643ba053ap4 -0x1.afffffffd537fp4 0x1.0p-30 F +REG epsg:29375 3 OK 0x1.18b4095361e12p19 -0x1.0a68dea46b918p19 -0x1.631de1984p4 0x1.336f378992962p3 -0x1.0fffffffe98f3p4 0x1.0p-29 F +REG epsg:29375 4 OK -0x1.18c4789950225p19 -0x1.0a68dea2ed985p19 -0x1.4c1279b4p3 0x1.4648643b36ac4p4 -0x1.0fffffffe986bp4 -0x1.0p-29 F +REG epsg:29377 0 OK -0x1.5d5aa7eab1ee3p6 -0x1.7a6eac836ec92p5 -0x1.6a3716f88p4 0x1.1p4 -0x1.5fffffffffffdp4 0x1.0p-30 F +REG epsg:29377 1 OK 0x1.0589159fa9a2dp19 0x1.13ff93f2e2274p19 -0x1.d73752dap4 0x1.736f3788bf9a2p3 -0x1.afffffffd54acp4 0x1.0p-29 F +REG epsg:29377 2 OK -0x1.059eeb64e7634p19 0x1.13ff93f532677p19 -0x1.da4fad6dp3 0x1.6648643ba0582p4 -0x1.afffffffd5357p4 -0x1.0p-29 F +REG epsg:29377 3 OK 0x1.18b14eaf9801p19 -0x1.0a68f7d838c5ep19 -0x1.5979e74a8p4 0x1.736f378992935p3 -0x1.0fffffffe990ap4 -0x1.0p-30 F +REG epsg:29377 4 OK -0x1.18c7247bd94f6p19 -0x1.0a68f7d63d426p19 -0x1.790d4c3ep2 0x1.6648643b36aabp4 -0x1.0fffffffe9853p4 0x1.0p-30 F +REG epsg:29379 0 OK -0x1.b35589d2758a2p6 -0x1.84b1a60c16235p5 -0x1.3769569ap4 0x1.3000000000001p4 -0x1.5ffffffffffffp4 0x1.0p-30 F +REG epsg:29379 1 OK 0x1.05865d927625ap19 0x1.13ff61d982497p19 -0x1.c369ca44cp4 0x1.b36f3788bfa39p3 -0x1.afffffffd54dap4 0x1.0p-30 F +REG epsg:29379 2 OK -0x1.05a1930c7166cp19 0x1.13ff61dc64589p19 -0x1.3f7ee0dd8p3 0x1.8648643ba05cdp4 -0x1.afffffffd532bp4 -0x1.0p-29 F +REG epsg:29379 3 OK 0x1.18ae95600cb3fp19 -0x1.0a6918245ea07p19 -0x1.4438db904p4 0x1.b36f378992908p3 -0x1.0fffffffe9921p4 -0x1.0p-29 F +REG epsg:29379 4 OK -0x1.18c9cae2b5657p19 -0x1.0a691821e62bap19 -0x1.65d6f46p-1 0x1.8648643b36a95p4 -0x1.0fffffffe983bp4 0x1.0p-29 F +REG epsg:2938 0 OK 0x1.0674cbb056897p22 0x1.5e4efb7f4f37ep6 -0x1.a6d1a8dep3 0x1.944444444177fp5 0x1.ddddddc91c20ap-4 0x1.c55dp-14 T +REG epsg:2938 1 OK 0x1.c920a7cd0459dp21 -0x1.0eee03e53f052p19 -0x1.e62d250dp4 0x1.6c443ed5422bep5 -0x1.38888888abd0ap2 0x1.df96p-14 F +REG epsg:2938 2 OK 0x1.28593da26f04ep22 -0x1.0eee2641460aap19 -0x1.72a5727fp3 0x1.bc4449b342352p5 -0x1.38888888b81d1p2 0x1.d5f6p-14 F +REG epsg:2938 3 OK 0x1.c926e96be8e4bp21 0x1.0f108d35931afp19 -0x1.04eb0df3p4 0x1.6c443ed53ff84p5 0x1.4777777702954p2 0x1.b2bfp-14 F +REG epsg:2938 4 OK 0x1.2856288eca826p22 0x1.0f105223d887fp19 0x1.3e6696bep1 0x1.bc4449b3417c6p5 0x1.47777776f790fp2 0x1.a234p-14 F +REG epsg:29381 0 OK -0x1.04644d790c012p7 -0x1.9132883f141cap5 -0x1.f3047c4dp3 0x1.5p4 -0x1.6000000000001p4 0x1.0p-29 F +REG epsg:29381 1 OK 0x1.0583a7f94464ep19 0x1.13ff24ce44de1p19 -0x1.a4d05dc9cp4 0x1.f36f3788bfacbp3 -0x1.afffffffd5502p4 0x1.0p-28 F +REG epsg:29381 2 OK -0x1.05a434aaecb2p19 0x1.13ff24d1b7ddap19 -0x1.1f98918ap2 0x1.a648643ba0612p4 -0x1.afffffffd5304p4 -0x1.8p-29 F +REG epsg:29381 3 OK 0x1.18abde3e4c7e6p19 -0x1.0a693f7ec8e28p19 -0x1.23615feecp4 0x1.f36f3789928d6p3 -0x1.0fffffffe9936p4 -0x1.0p-30 F +REG epsg:29381 4 OK -0x1.18cc6afa3eea6p19 -0x1.0a693f7bd43acp19 0x1.4c6aa80ep2 0x1.a648643b36a7fp4 -0x1.0fffffffe9829p4 -0x1.0p-30 F +REG epsg:29383 0 OK -0x1.2ecc9963c1ef2p7 -0x1.9fed6c3b32c94p5 -0x1.612a3b2d8p3 0x1.7000000000001p4 -0x1.6000000000001p4 -0x1.0p-30 F +REG epsg:29383 1 OK 0x1.0580f5ac771a7p19 0x1.13fedce4367e1p19 -0x1.7b749944p4 0x1.19b79bc45fdbp4 -0x1.afffffffd552bp4 0x1.0p-29 F +REG epsg:29383 2 OK -0x1.05a6cf6e3306dp19 0x1.13fedce839656p19 0x1.a48a555cp0 0x1.c648643ba065cp4 -0x1.afffffffd52dep4 -0x1.4p-28 F +REG epsg:29383 3 OK 0x1.18a92a2335abbp19 -0x1.0a696ddb2fa09p19 -0x1.edfb66c88p3 0x1.19b79bc4c9457p4 -0x1.0fffffffe994ep4 -0x1.0p-29 F +REG epsg:29383 4 OK -0x1.18cf03f0c8b74p19 -0x1.0a696dd7bfaadp19 0x1.78f6cf03p3 0x1.c648643b36a68p4 -0x1.0fffffffe981p4 0x1.0p-30 F +REG epsg:29385 0 OK -0x1.58d66dc59352ep7 -0x1.b0ddb93f73f7bp5 -0x1.72e2d52cp2 0x1.9p4 -0x1.6000000000001p4 -0x1.0p-30 F +REG epsg:29385 1 OK 0x1.057e478369552p19 0x1.13fe8a31c8236p19 -0x1.476363d7cp4 0x1.39b79bc45fdf9p4 -0x1.afffffffd5555p4 0x0.0p0 F +REG epsg:29385 2 OK -0x1.05a96286421a2p19 0x1.13fe8a3659bc4p19 0x1.0d5c96ad8p3 0x1.e648643ba06a3p4 -0x1.afffffffd52b4p4 -0x1.4p-28 F +REG epsg:29385 3 OK 0x1.18a679e6b49bbp19 -0x1.0a69a32b1b19fp19 -0x1.7e375e7p3 0x1.39b79bc4c9442p4 -0x1.0fffffffe9964p4 -0x1.0p-28 F +REG epsg:29385 4 OK -0x1.18d194f6df6bfp19 -0x1.0a69a32730df9p19 0x1.30d2a0a58p4 0x1.e648643b36a52p4 -0x1.0fffffffe97fep4 -0x1.0p-30 F +REG epsg:2939 0 OK 0x1.18c59455253p21 0x1.5e0d6904dda68p6 -0x1.97fbfd41p3 0x1.962222221f567p5 0x1.11111106a54c2p-3 0x1.c4f5p-14 T +REG epsg:2939 1 OK 0x1.a9f8685de85ecp20 -0x1.0eed20d5ac7bfp19 -0x1.de3e56fap4 0x1.6e221b093cd19p5 -0x1.377777779b33bp2 0x1.df4ep-14 F +REG epsg:2939 2 OK 0x1.5c8ee8bf37b65p21 -0x1.0eed436485f3ep19 -0x1.64e506dep3 0x1.be22293b034acp5 -0x1.37777777a770ap2 0x1.d5afp-14 F +REG epsg:2939 3 OK 0x1.aa06af23cebffp20 0x1.0f116df0119b3p19 -0x1.fa1f9962p3 0x1.6e221b093a8a4p5 0x1.48888888133ebp2 0x1.b23ep-14 F +REG epsg:2939 4 OK 0x1.5c87dced2d17dp21 0x1.0f1132acc6245p19 0x1.74ad392ep1 0x1.be22293b02a92p5 0x1.488888880849cp2 0x1.a1b9p-14 F +REG epsg:2940 0 OK 0x1.92d76bacd555p21 0x1.5c3550d786f1ap6 -0x1.cee85134p2 0x1.ae2222221f69ep5 0x1.1111110637cf3p-3 0x1.c109p-14 T +REG epsg:2940 1 OK 0x1.4f0e0f1dc2183p21 -0x1.0eed1f1f5b86ep19 -0x1.7f907769p4 0x1.86221b093ccd2p5 -0x1.377777779f259p2 0x1.dc65p-14 F +REG epsg:2940 2 OK 0x1.d6a0bc03586dp21 -0x1.0eed439ba3f77p19 -0x1.879215c3p2 0x1.d622293b035e7p5 -0x1.37777777aa9c3p2 0x1.d2e5p-14 F +REG epsg:2940 3 OK 0x1.4f1532fbbb2ccp21 0x1.0f1150a4bd44cp19 -0x1.3cdba8c38p3 0x1.86221b093a9cbp5 0x1.488888880fb79p2 0x1.ad1dp-14 F +REG epsg:2940 4 OK 0x1.d699b0ae231e9p21 0x1.0f1113745cefap19 0x1.fc63bcdp2 0x1.d622293b02d71p5 0x1.488888880581p2 0x1.9d2cp-14 F +REG epsg:2941 0 OK 0x1.0674a061b31bbp22 0x1.5a4bec5a259e7p6 -0x1.fd6bd6f4p0 0x1.c62222221f84fp5 0x1.11111105d1e24p-3 0x1.bd3cp-14 T +REG epsg:2941 1 OK 0x1.c91fe79f09022p21 -0x1.0eed1ec94196fp19 -0x1.24d69f82cp4 0x1.9e221b093cd04p5 -0x1.37777777a2df7p2 0x1.d97cp-14 F +REG epsg:2941 2 OK 0x1.2859469da321fp22 -0x1.0eed4510eb309p19 -0x1.612ffcd4p0 0x1.ee22293b0379p5 -0x1.37777777ad85ap2 0x1.d03dp-14 F +REG epsg:2941 3 OK 0x1.c9270bef84d7cp21 0x1.0f113382daf78p19 -0x1.0efe45fbp2 0x1.9e221b093ab7ap5 0x1.488888880c671p2 0x1.a81dp-14 F +REG epsg:2941 4 OK 0x1.2855c12d28314p22 0x1.0f10f4876b56ep19 0x1.95c056788p3 0x1.ee22293b030c6p5 0x1.4888888802f48p2 0x1.98e8p-14 F +REG epsg:2942 0 OK 0x1.e8a4608ed8566p18 -0x1.39ddbbeb56fa3p8 0x1.4d239a7cfp7 -0x1.dffffffffffffp3 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:2942 1 OK -0x1.aa705b8d372p15 -0x1.0f08c275ee0e4p19 0x1.3eb930254p7 -0x1.3ffffffffffffp4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2942 2 OK 0x1.01a5b3653a64p20 -0x1.0f08c2784e46cp19 0x1.bf1923e808p7 -0x1.4000000000002p3 -0x1.4p2 -0x1.8p-29 F +REG epsg:2942 3 OK -0x1.aa79ec6f0f42p15 0x1.0eba4badd6abp19 0x1.a284bdc01p6 -0x1.3ffffffffffffp4 0x1.3fffffffffffcp2 -0x1.0p-30 F +REG epsg:2942 4 OK 0x1.01a600064314ep20 0x1.0eba4bb0358cap19 0x1.51a29b4f4p7 -0x1.4p3 0x1.4000000000004p2 -0x1.8p-29 F +REG epsg:2943 0 OK 0x1.e8789fbb2447cp18 -0x1.dfceeca5b0413p5 -0x1.f8080f0ep1 -0x1.dffffffffffffp3 -0x1.2f74bf1dcfcaep-64 0x1.0p-30 T +REG epsg:2943 1 OK -0x1.abefdad3d34cp15 -0x1.0eeae532f5ed6p19 -0x1.0c950f528p4 -0x1.3fffffffffffep4 -0x1.4000000000003p2 -0x1.0p-30 F +REG epsg:2943 2 OK 0x1.019bcedbd17bap20 -0x1.0eeae53434b65p19 0x1.0ffe6654cp4 -0x1.3ffffffffffffp3 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:2943 3 OK -0x1.abf1aef3864p15 0x1.0edbe6dba9bddp19 -0x1.b3eb8771cp4 -0x1.3ffffffffffffp4 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:2943 4 OK 0x1.019bdd7f6bf44p20 0x1.0edbe6dce8647p19 0x1.a2a0a2bdp2 -0x1.4p3 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2944 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG epsg:2944 1 OK -0x1.e8f08b04c4de4p17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2944 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2944 3 OK -0x1.e8f08b04c4de4p17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2944 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2945 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG epsg:2945 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2945 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2945 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2945 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2946 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2946 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2946 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2946 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2946 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2947 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:2947 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2947 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2947 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2947 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2948 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG epsg:2948 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2948 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2948 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2948 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2949 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG epsg:2949 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2949 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2949 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2949 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2950 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG epsg:2950 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2950 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2950 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2950 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2951 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG epsg:2951 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2951 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2951 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2951 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2952 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG epsg:2952 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2952 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2952 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2952 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:2953 0 OK 0x1.312dp21 0x1.c9c37ffffffffp22 0x0.0p0 -0x1.0ap6 0x1.7400000000001p5 0x0.0p0 F +REG epsg:2953 1 OK 0x1.ce1a8a750db01p20 0x1.a978de915c05p22 0x0.0p0 -0x1.270e06f120d03p6 0x1.4c00000000006p5 0x0.0p0 F +REG epsg:2953 2 OK 0x1.7b4cbac57927dp21 0x1.a978de915c05p22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4c00000000006p5 0x0.0p0 F +REG epsg:2953 3 OK 0x1.e71a4c9b7b18fp20 0x1.ed32b7846d712p22 0x0.0p0 -0x1.270e06f120d03p6 0x1.9cp5 0x0.0p0 F +REG epsg:2953 4 OK 0x1.6eccd9b242736p21 0x1.ed32b7846d712p22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 0x0.0p0 F +REG epsg:2954 0 OK 0x1.86ap18 0x1.86a0000000009p19 0x0.0p0 -0x1.f8p5 0x1.7a00000000002p5 0x0.0p0 F +REG epsg:2954 1 OK -0x1.975c9153a2d7cp17 0x1.094ceece0c4f2p18 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51ffffffffffbp5 0x0.0p0 F +REG epsg:2954 2 OK 0x1.ec772454e8b5bp19 0x1.094ceece0c4f2p18 0x0.0p0 -0x1.bd129258af178p5 0x1.51ffffffffffbp5 0x0.0p0 F +REG epsg:2954 3 OK -0x1.9415340a0c274p16 0x1.5133d40cea573p20 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2954 4 OK 0x1.b922a6814184ap19 0x1.5133d40cea573p20 0x0.0p0 -0x1.bd129258af179p5 0x1.a200000000001p5 0x0.0p0 F +REG epsg:2955 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:2955 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:2955 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:2955 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:2955 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:2956 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:2956 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:2956 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:2956 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:2956 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:2957 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:2957 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:2957 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:2957 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:2957 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:2958 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:2958 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:2958 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:2958 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:2958 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:2959 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:2959 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:2959 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:2959 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:2959 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:2960 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:2960 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:2960 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:2960 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:2960 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:2961 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:2961 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:2961 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:2961 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:2961 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:2962 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:2962 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:2962 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:2962 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:2962 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:29635 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:29635 1 OK -0x1.ad89324e3d9bp15 -0x1.0edd0485be135p19 0x0.0p0 0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29635 2 OK 0x1.0190499271ecep20 -0x1.0edd0485be135p19 0x0.0p0 0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29635 3 OK -0x1.ad89324e3d9bp15 0x1.0edd0485be135p19 0x0.0p0 0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29635 4 OK 0x1.0190499271ecep20 0x1.0edd0485be135p19 0x0.0p0 0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29636 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:29636 1 OK -0x1.ad89324e3da1p15 -0x1.0edd0485be135p19 0x0.0p0 0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29636 2 OK 0x1.0190499271ecbp20 -0x1.0edd0485be135p19 0x0.0p0 0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29636 3 OK -0x1.ad89324e3da1p15 0x1.0edd0485be135p19 0x0.0p0 0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:29636 4 OK 0x1.0190499271ecbp20 0x1.0edd0485be135p19 0x0.0p0 0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2964 0 OK 0x0.0p0 0x1.4d909a7d0fab7p21 0x0.0p0 -0x1.34p7 0x1.cc00000000003p5 0x0.0p0 F +REG epsg:2964 1 OK -0x1.cb7a2eae3479bp22 -0x1.0764ad7f4b4bep20 0x0.0p0 0x1.642a4c850f0f2p7 0x1.53ffffffffffdp5 0x0.0p0 F +REG epsg:2964 2 OK 0x1.cb7a2eae347a8p22 -0x1.0764ad7f4b4ap20 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.53ffffffffffdp5 0x0.0p0 F +REG epsg:2964 3 OK -0x1.791703ae2941dp21 0x1.0e1e6dc5388aap23 0x0.0p0 0x1.642a4c850f0f2p7 0x1.2200000000001p6 0x0.0p0 F +REG epsg:2964 4 OK 0x1.791703ae29428p21 0x1.0e1e6dc5388abp23 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.2200000000001p6 0x0.0p0 F +REG epsg:2965 0 OK 0x1.4064d54fdf3b9p18 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:2965 1 OK -0x1.8ab2401dc3b64p20 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2965 2 OK 0x1.15725562d9aa9p21 -0x1.cbf7744da7f42p19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2965 3 OK -0x1.4ee8c9d0e722cp20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2965 4 OK 0x1.ef1b3478d6c19p20 0x1.4a2f5d1b870c9p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2966 0 OK 0x1.6871700000004p21 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:2966 1 OK 0x1.ec2ed51c88f6cp19 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2966 2 OK 0x1.2aeb955c6ee16p22 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2966 3 OK 0x1.31e0e0db210eep20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2966 4 OK 0x1.1bf937c937bc8p22 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2967 0 OK 0x1.4064d54fdf3b9p18 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:2967 1 OK -0x1.8ab2401dc3b64p20 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2967 2 OK 0x1.15725562d9aa9p21 -0x1.cbf7744da7f42p19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2967 3 OK -0x1.4ee8c9d0e722cp20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2967 4 OK 0x1.ef1b3478d6c19p20 0x1.4a2f5d1b870c9p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2968 0 OK 0x1.6871700000004p21 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:2968 1 OK 0x1.ec2ed51c88f6cp19 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2968 2 OK 0x1.2aeb955c6ee16p22 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:2968 3 OK 0x1.31e0e0db210eep20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2968 4 OK 0x1.1bf937c937bc8p22 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:2969 0 OK 0x1.e80d5bb5318dcp18 0x1.add591d5af5d5p8 -0x1.70d52ae05p6 -0x1.f8p5 -0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG epsg:2969 1 OK -0x1.af60cbb1b71ep15 -0x1.0eaea3b70ae0fp19 -0x1.b74e03c32p6 -0x1.1p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:2969 2 OK 0x1.0181b3fbb1252p20 -0x1.0eaea3b58bbf8p19 -0x1.2d25830dfp7 -0x1.d000000000003p5 -0x1.4p2 0x1.0p-29 F +REG epsg:2969 3 OK -0x1.af53ae15dc88p15 0x1.0f1a1834b309ap19 -0x1.16fa4b902p5 -0x1.1p6 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:2969 4 OK 0x1.01814b2567b94p20 0x1.0f1a183332be9p19 -0x1.2e79a9c3cp6 -0x1.d000000000001p5 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:2970 0 OK 0x1.e8b1ccad5c0f2p18 0x1.2be1ecd39f6c7p8 -0x1.a9c566e68p5 -0x1.f8p5 0x1.2f74bf1dcfcaep-60 -0x1.0p-30 T +REG epsg:2970 1 OK -0x1.aa347a0689acp15 -0x1.0ebe748de6a81p19 -0x1.d3be4a79p6 -0x1.1p6 -0x1.4p2 -0x1.0p-29 F +REG epsg:2970 2 OK 0x1.01aa8a8df6561p20 -0x1.0ebe74909abd3p19 -0x1.5b5f1a526p5 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:2970 3 OK -0x1.aa2b564fea68p15 0x1.0f096c68511bfp19 -0x1.02919f854p6 -0x1.1p6 0x1.4000000000002p2 -0x1.0p-28 F +REG epsg:2970 4 OK 0x1.01aa4153d4444p20 0x1.0f096c6b06a7bp19 0x1.1be3f5e78p3 -0x1.d000000000001p5 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:29700 0 OK 0x1.2c85f5eb16eabp17 0x1.85e271c690447p19 0x1.0d2793ce8p4 0x1.60ccccccccccep5 -0x1.2e66666666561p4 -0x1.0p-30 F +REG epsg:29700 1 OK -0x1.6f88cc514b12ep18 0x1.ba65c13570878p17 0x1.a072544p-2 0x1.3685409764ccdp5 -0x1.7e66666666584p4 0x0.0p0 F +REG epsg:29700 2 OK 0x1.55e6f003d6472p19 0x1.db4408aac53bp17 0x1.e184ad97p2 0x1.8b14590234ccep5 -0x1.7e66666666581p4 0x0.0p0 F +REG epsg:29700 3 OK -0x1.a0cbd262fc0fap18 0x1.4713db1d91a3dp20 0x1.698106d28p4 0x1.3685409764ccdp5 -0x1.bcccccccccac6p3 -0x1.0p-30 F +REG epsg:29700 4 OK 0x1.5eece1d0479e4p19 0x1.49cd80143592ep20 0x1.e268add68p4 0x1.8b14590234ccep5 -0x1.bcccccccccac2p3 -0x1.0p-30 F +REG epsg:29702 0 OK 0x1.2c85f5eb16eabp17 0x1.85e271c690447p19 0x1.0d2793ce8p4 0x1.60ccccccccccep5 -0x1.2e66666666561p4 -0x1.0p-30 F +REG epsg:29702 1 OK -0x1.6f88cc514b12ep18 0x1.ba65c13570878p17 0x1.a072544p-2 0x1.3685409764ccdp5 -0x1.7e66666666584p4 0x0.0p0 F +REG epsg:29702 2 OK 0x1.55e6f003d6472p19 0x1.db4408aac53bp17 0x1.e184ad97p2 0x1.8b14590234ccep5 -0x1.7e66666666581p4 0x0.0p0 F +REG epsg:29702 3 OK -0x1.a0cbd262fc0fap18 0x1.4713db1d91a3dp20 0x1.698106d28p4 0x1.3685409764ccdp5 -0x1.bcccccccccac6p3 -0x1.0p-30 F +REG epsg:29702 4 OK 0x1.5eece1d0479e4p19 0x1.49cd80143592ep20 0x1.e268add68p4 0x1.8b14590234ccep5 -0x1.bcccccccccac2p3 -0x1.0p-30 F +REG epsg:2971 0 OK 0x1.e847f38def8f7p18 -0x1.b7d225d9f5b67p6 0x1.66628c1c2p5 -0x1.98p5 -0x1.c72f1eacb7b06p-62 -0x1.0p-30 T +REG epsg:2971 1 OK -0x1.ad6c06252a2ap15 -0x1.0ef09b9223eap19 0x1.a6c65984cp5 -0x1.c000000000001p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2971 2 OK 0x1.018f59f817357p20 -0x1.0ef09b9223986p19 0x1.a6812b054p5 -0x1.7000000000001p5 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:2971 3 OK -0x1.ad6f60a6f384p15 0x1.0ed51eaa82b38p19 0x1.0d62284dcp5 -0x1.c000000000001p5 0x1.4000000000004p2 -0x1.0p-30 F +REG epsg:2971 4 OK 0x1.018f74cc24466p20 0x1.0ed51eaa8261bp19 0x1.0d1cf9c08p5 -0x1.7p5 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:2972 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:2972 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:2972 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:2972 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:2972 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:2973 0 OK 0x1.e7e7e6f7705fep18 -0x1.2ddfeda540aeep7 0x1.78252ca8ep6 -0x1.f8p5 -0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:2973 1 OK -0x1.b06343cacc21p15 -0x1.0ef530ae3a9c7p19 0x1.154eb9f6e8p7 -0x1.1p6 -0x1.4000000000002p2 0x0.0p0 F +REG epsg:2973 2 OK 0x1.01770d4f49b8ep20 -0x1.0ef530abc3287p19 0x1.1f8620845p6 -0x1.d000000000001p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2973 3 OK -0x1.b067df1293c9p15 0x1.0ecf7500ffc0dp19 0x1.c1558b1ep6 -0x1.1p6 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:2973 4 OK 0x1.0177321c893p20 0x1.0ecf74fe88f88p19 0x1.6c7bddfc6p5 -0x1.d000000000001p5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:29738 0 OK 0x1.e8515d8bb0876p18 0x1.b99951915c5bcp22 0x1.83668bc8p1 0x1.68p5 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:29738 1 OK -0x1.fb5279d1c92p14 0x1.9702edeaf0763p22 -0x1.c3f400dp3 0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG epsg:29738 2 OK 0x1.f82bf1666accap19 0x1.9702edeaced42p22 -0x1.f88745c4p2 0x1.942297030ae5ep5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29738 3 OK -0x1.2fb157c5a5498p16 0x1.dacc402524dc4p22 0x1.46945c398p3 0x1.3bdd68fcf51a3p5 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:29738 4 OK 0x1.0723c4493802p20 0x1.dacc402504dacp22 0x1.0fa08c864p4 0x1.942297030ae5dp5 -0x1.4000000000003p4 0x1.0p-29 F +REG epsg:29739 0 OK 0x1.e8495a6af2efap18 0x1.b999555db548ap22 0x1.44141e62p2 0x1.98p5 -0x1.9000000000002p4 0x1.8p-29 F +REG epsg:29739 1 OK -0x1.fbd2063db9dap14 0x1.9702f27154105p22 -0x1.308822dp3 0x1.6bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:29739 2 OK 0x1.f827ea9ea352ap19 0x1.9702f2714f344p22 -0x1.13add4b58p3 0x1.c42297030ae5ep5 -0x1.dfffffffffffcp4 -0x1.8p-29 F +REG epsg:29739 3 OK -0x1.2fd1337806a08p16 0x1.dacc433e7c7dep22 0x1.e68a6f318p3 0x1.6bdd68fcf51a3p5 -0x1.4000000000001p4 0x1.8p-29 F +REG epsg:29739 4 OK 0x1.0721c06dfd786p20 0x1.dacc433e77dep22 0x1.02ec83aecp4 0x1.c42297030ae5dp5 -0x1.3fffffffffffep4 -0x1.0p-29 F +REG epsg:2975 0 OK 0x1.e847fffffffeap18 0x1.b997b102aac2p22 0x0.0p0 0x1.c800000000001p5 -0x1.9p4 0x0.0p0 F +REG epsg:2975 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2975 2 OK 0x1.f8272811f153dp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2975 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2975 4 OK 0x1.07218271ed484p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2976 0 OK 0x1.e84a78e4b0da8p18 0x1.b99528046588p22 0x1.67e01ec8p3 -0x1.26p7 -0x1.9000000000004p4 -0x1.0p-30 F +REG epsg:2976 1 OK -0x1.fbb618582daep14 0x1.96fec7d59f78cp22 0x1.4025975e8p4 -0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2976 2 OK 0x1.f82829aa0f572p19 0x1.96fec7d596964p22 0x1.5a80d3eb8p4 -0x1.1af75a3f3d469p7 -0x1.e000000000005p4 0x1.0p-30 F +REG epsg:2976 3 OK -0x1.2fce3e40c60c8p16 0x1.dac8134c9d686p22 -0x1.e1f2d484p0 -0x1.3108a5c0c2b98p7 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:2976 4 OK 0x1.07222058895c8p20 0x1.dac8134c94f5ep22 -0x1.85f519cp-4 -0x1.1af75a3f3d469p7 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:2977 0 OK 0x1.e88ed86fd5618p18 0x1.b99654004bc82p22 -0x1.21ecb522p3 -0x1.3200000001645p7 -0x1.900000002e83bp4 0x1.7638p-17 F +REG epsg:2977 1 OK -0x1.f761633ef53ep14 0x1.96ffdc4509ad7p22 -0x1.d1e282ee8p4 -0x1.3d08a5c0c87ccp7 -0x1.e0000000484f1p4 0x1.25bp-15 F +REG epsg:2977 2 OK 0x1.f84b3151b2e62p19 0x1.970002c6414cbp22 0x1.0b2170ef4p4 -0x1.26f75a3f3a54cp7 -0x1.e000000049a5cp4 0x1.f1bcp-16 F +REG epsg:2977 3 OK -0x1.2ec231bddae4p16 0x1.dac92dfa06a0ep22 -0x1.3c1d5524ep5 -0x1.3d08a5c0c82b4p7 -0x1.40000000109a1p4 0x1.4048p-17 F +REG epsg:2977 4 OK 0x1.0732ef63b0307p20 0x1.dac958d5777fap22 0x1.46a1b1e18p3 -0x1.26f75a3f3a7e4p7 -0x1.40000000115e8p4 0x1.e44p-19 F +REG epsg:2978 0 OK 0x1.e87000b1b0773p18 0x1.b996aaf590b72p22 0x1.06074fbbp3 -0x1.1ap7 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:2978 1 OK -0x1.f9617f50ff36p14 0x1.9700497db9f43p22 -0x1.082a0313p2 -0x1.2508a5c0c2b96p7 -0x1.e000000000001p4 0x1.0p-30 F +REG epsg:2978 2 OK 0x1.f83b0cda0828bp19 0x1.9700497d2a3afp22 0x1.686d0dcdcp4 -0x1.0ef75a3f3d469p7 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:2978 3 OK -0x1.2f37a46848c3p16 0x1.dac997770d732p22 -0x1.47472db08p3 -0x1.2508a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2978 4 OK 0x1.072b7ac055846p20 0x1.dac9977684c23p22 0x1.2b1b25548p4 -0x1.0ef75a3f3d469p7 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:2979 0 OK 0x1.e87a938e2d3e3p18 0x1.b9955ec1feaaep22 -0x1.40419fa47p6 0x1.14p6 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:2979 1 OK -0x1.f8d33490c564p14 0x1.96fedde1e06p22 -0x1.5f74dccd6p6 0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:2979 2 OK 0x1.f8412d686ff4bp19 0x1.96fedde12afa4p22 -0x1.b1512d23cp5 0x1.2a114b818572ep6 -0x1.e000000000001p4 -0x1.8p-29 F +REG epsg:2979 3 OK -0x1.2f15f6e44c38p16 0x1.dac86978c4b12p22 -0x1.b2d389d6ep6 0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:2979 4 OK 0x1.072ea960b687fp20 0x1.dac86978182aep22 -0x1.208fae8a1p6 0x1.2a114b818572ep6 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:2980 0 OK 0x1.e80eec6447077p18 0x1.b99bc931f64b6p22 -0x1.f695c4d8ep5 0x1.68p5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:2980 1 OK -0x1.ff942feb00fap14 0x1.97054dac7d0cbp22 -0x1.1d886e053p6 0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:2980 2 OK 0x1.f80b8d91825bcp19 0x1.97054dad49a8ep22 -0x1.b5a806ca9p6 0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2980 3 OK -0x1.30bfd6b0f2eep16 0x1.daceceb22a198p22 -0x1.1a3621f6p4 0x1.3bdd68fcf51a4p5 -0x1.4p4 0x1.0p-29 F +REG epsg:2980 4 OK 0x1.0713737680ab2p20 0x1.daceceb2ecf48p22 -0x1.d73b16d7ap5 0x1.942297030ae5cp5 -0x1.4p4 0x1.0p-29 F +REG epsg:2981 0 OK 0x1.e8936d24a464p18 0x1.b99b0bebe2c77p22 -0x1.6b60e1ca5p6 0x1.4ap7 -0x1.9000000000005p4 -0x1.0p-29 F +REG epsg:2981 1 OK -0x1.f7540208d716p14 0x1.9704867884a73p22 -0x1.1644dc0dap7 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:2981 2 OK 0x1.f84e0d9e01721p19 0x1.9704867776668p22 -0x1.63820d4fbp6 0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 -0x1.0p-30 F +REG epsg:2981 3 OK -0x1.2eb0b704d964p16 0x1.dace1afb6d341p22 -0x1.8585338bep6 0x1.3ef75a3f3d469p7 -0x1.3fffffffffffep4 0x1.0p-28 F +REG epsg:2981 4 OK 0x1.0734c2373e22ap20 0x1.dace1afa6bd9dp22 -0x1.56c842f38p5 0x1.5508a5c0c2b98p7 -0x1.4p4 0x1.0p-29 F +REG epsg:2982 0 OK 0x1.e7f3281d3b4d7p18 0x1.b99265a4e0eddp22 -0x1.4871aaabcp5 0x1.4ap7 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:2982 1 OK -0x1.009ba6a50b7p15 0x1.96fbf318cc09cp22 0x1.9c3eba03p3 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:2982 2 OK 0x1.f7fce23be0ef8p19 0x1.96fbf319fcb7ap22 -0x1.5d313203ep5 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:2982 3 OK -0x1.31319cc65acb8p16 0x1.dac5629a6fa5dp22 -0x1.2a4b2346p5 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2982 4 OK 0x1.070cad8b14774p20 0x1.dac5629b91346p22 -0x1.8a82d7c9bp6 0x1.5508a5c0c2b98p7 -0x1.4p4 -0x1.0p-29 F +REG epsg:2983 0 OK 0x1.e849b124a45d2p18 0x1.b995f94f8675ap22 -0x1.1ac79749p8 0x1.4a0000005b7c2p7 -0x1.90000004b9a1dp4 0x1.44d49ap-7 F +REG epsg:2983 1 OK -0x1.fc0532b604d6p14 0x1.96ff2e047bc2p22 -0x1.eec1958f78p7 0x1.3ef75a3f82ca8p7 -0x1.e00000040c915p4 0x1.4a117cp-7 F +REG epsg:2983 2 OK 0x1.f82b15d00a06fp19 0x1.96ff467a7a97p22 -0x1.1b156d611cp8 0x1.5508a5c0f525cp7 -0x1.e00000022d299p4 0x1.51a256p-7 F +REG epsg:2983 3 OK -0x1.2fee9af9af1p16 0x1.dac92488044e4p22 -0x1.1756a2ed74p8 0x1.3ef75a3fb2a5fp7 -0x1.400000071f998p4 0x1.2f7538p-7 F +REG epsg:2983 4 OK 0x1.07232aad663fap20 0x1.dac95b214eebep22 -0x1.3e0dba2bc4p8 0x1.5508a5c13195p7 -0x1.400000051eccfp4 0x1.403c2ap-7 F +REG epsg:2984 0 OK 0x1.86ap18 0x1.24e87602f0f6ep18 -0x1.dd86590f9p7 0x1.4cp7 -0x1.57fffffffff0ap4 0x0.0p0 F +REG epsg:2984 1 OK 0x1.a6e1cce93a59cp17 0x1.be8b074394cb6p16 -0x1.d9cc21d7dp7 0x1.486ad95cf6aa6p7 -0x1.72aaaaaaaa9c3p4 -0x1.0p-30 F +REG epsg:2984 2 OK 0x1.1ce78cc5b1699p19 0x1.be8b074394cb6p16 -0x1.d9cc21d7ep7 0x1.4f9526a30955bp7 -0x1.72aaaaaaaa9c2p4 -0x1.0p-30 F +REG epsg:2984 3 OK 0x1.9e9f16ae9e052p17 0x1.d81141c7f2462p18 -0x1.e106b30858p7 0x1.486ad95cf6aa6p7 -0x1.3d55555555453p4 0x0.0p0 F +REG epsg:2984 4 OK 0x1.1ef83a54587ecp19 0x1.d81141c7f2462p18 -0x1.e106b30868p7 0x1.4f9526a30955bp7 -0x1.3d55555555454p4 -0x1.8p-29 F +REG epsg:29849 0 OK 0x1.e7e5802f5b6bfp18 0x1.7fd922a086627p5 -0x1.d70d70174p4 0x1.bcp6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:29849 1 OK -0x1.b08eb477035dp15 -0x1.0eddb237f794fp19 0x1.737d8046p2 0x1.a800000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:29849 2 OK 0x1.0177356a9bb52p20 -0x1.0eddb2357a25ep19 -0x1.f53096c74p5 0x1.d000000000001p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29849 3 OK -0x1.b08d3d786035p15 0x1.0ee9b0e6d3233p19 0x1.c581d507p3 0x1.a800000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:29849 4 OK 0x1.017729b6e2deap20 0x1.0ee9b0e4557d1p19 -0x1.b23fa227ap5 0x1.d000000000001p6 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:29850 0 OK 0x1.e7fcb5fdbd85ap18 0x1.7fd9b35a6513bp5 -0x1.079103b87p6 0x1.d4p6 0x0.0p0 -0x1.0p-29 T +REG epsg:29850 1 OK -0x1.afdb58bca8acp15 -0x1.0ede18992c6c7p19 -0x1.3379cecd8p5 0x1.c000000000001p6 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:29850 2 OK 0x1.017d35871ec01p20 -0x1.0ede1897458b7p19 -0x1.6b07b878cp6 0x1.e800000000001p6 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:29850 3 OK -0x1.afd9e1cc5763p15 0x1.0eea174c84a37p19 -0x1.e111d5e4cp4 0x1.c000000000001p6 0x1.4p2 0x1.0p-29 F +REG epsg:29850 4 OK 0x1.017d29d2d8fc9p20 0x1.0eea174a9d985p19 -0x1.498f346dap6 0x1.e800000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:2987 0 OK 0x1.e80be4711dce1p18 -0x1.74f6d96f629acp8 0x1.1825b12414p8 -0x1.c800000000001p5 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:2987 1 OK -0x1.af1f6fb83938p15 -0x1.0f0ee9c973b6ap19 0x1.4cb2919d74p8 -0x1.efffffffffffep5 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:2987 2 OK 0x1.017eed8d831a7p20 -0x1.0f0ee9c7e429dp19 0x1.22ee610364p8 -0x1.a000000000001p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:2987 3 OK -0x1.af2ad1156fb7p15 0x1.0eb1acdc120dp19 0x1.0ba7d79dc8p8 -0x1.efffffffffffep5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:2987 4 OK 0x1.017f488456afap20 0x1.0eb1acda838bap19 0x1.c3c715d448p7 -0x1.a000000000001p5 0x1.4p2 -0x1.8p-29 F +REG epsg:29871 0 OK 0x1.cc573c1545b07p14 0x1.5983b1e42c7cep14 -0x1.918730944p5 0x1.cc00000000002p6 0x1.ffffffffffd3fp1 0x0.0p0 F +REG epsg:29871 1 OK 0x1.bc6138fd3ba1p10 -0x1.51659892806e4p12 -0x1.71a9a9ec4p4 0x1.b7f37f5af8063p6 -0x1.ffffffffe3b69p-1 0x1.0p-28 T +REG epsg:29871 2 OK 0x1.c061c779240dap15 -0x1.4a466a6cfb9e4p12 -0x1.44eae0af1p6 0x1.e00c80a507f9dp6 -0x1.ffffffffe3af7p-1 0x1.8p-29 T +REG epsg:29871 3 OK 0x1.d2e5454e172bp10 0x1.84274428bbaf8p15 -0x1.16da5a9e8p3 0x1.b7f37f5af8063p6 0x1.1fffffffffe91p3 -0x1.0p-30 F +REG epsg:29871 4 OK 0x1.bbd529912fe1ep15 0x1.8504ccde8ae8cp15 -0x1.0887d17a6p6 0x1.e00c80a507f9fp6 0x1.1fffffffffe95p3 0x1.0p-30 F +REG epsg:29872 0 OK 0x1.dab9f60723e2ep20 0x1.644fcf86f70b1p20 -0x1.918730944p5 0x1.cc00000000002p6 0x1.ffffffffffd3fp1 0x0.0p0 F +REG epsg:29872 1 OK 0x1.ca4443d865cdp16 -0x1.5bf0c5086fc88p18 -0x1.71a9a9ec4p4 0x1.b7f37f5af8063p6 -0x1.ffffffffe3b69p-1 0x1.0p-28 T +REG epsg:29872 2 OK 0x1.ce64d5bd87309p21 -0x1.54989d71bed2p18 -0x1.44eae0af1p6 0x1.e00c80a507f9dp6 -0x1.ffffffffe3af7p-1 0x1.8p-29 T +REG epsg:29872 3 OK 0x1.e17c708bc833p16 0x1.90487e53d6223p21 -0x1.16da5a9e8p3 0x1.b7f37f5af8063p6 0x1.1fffffffffe91p3 -0x1.0p-30 F +REG epsg:29872 4 OK 0x1.c9b3d2e653636p21 0x1.912cf34f53d53p21 -0x1.0887d17a6p6 0x1.e00c80a507f9fp6 0x1.1fffffffffe95p3 0x1.0p-30 F +REG epsg:29873 0 OK 0x1.216489141e93ap19 0x1.b26a1f55237b1p18 -0x1.918730944p5 0x1.cc00000000002p6 0x1.ffffffffffd3fp1 0x0.0p0 F +REG epsg:29873 1 OK 0x1.175bdd9cf17fp15 -0x1.a83556484e378p16 -0x1.71a9a9ec4p4 0x1.b7f37f5af8063p6 -0x1.ffffffffe3b69p-1 0x1.0p-28 T +REG epsg:29873 2 OK 0x1.19dff47376572p20 -0x1.9f410e7518eb8p16 -0x1.44eae0af1p6 0x1.e00c80a507f9dp6 -0x1.ffffffffe3af7p-1 0x1.8p-29 T +REG epsg:29873 3 OK 0x1.25836da0f1dep15 0x1.e8063f31d28a6p19 -0x1.16da5a9e8p3 0x1.b7f37f5af8063p6 0x1.1fffffffffe91p3 -0x1.0p-30 F +REG epsg:29873 4 OK 0x1.1703d1dde2493p20 0x1.e91cc7f625f37p19 -0x1.0887d17a6p6 0x1.e00c80a507f9fp6 0x1.1fffffffffe95p3 0x1.0p-30 F +REG epsg:2988 0 OK 0x1.e823bfc59d132p18 0x1.b999704d415cbp22 -0x1.06b2b9b85p6 -0x1.62p7 -0x1.9000000000003p4 -0x1.0p-28 F +REG epsg:2988 1 OK -0x1.fe43705fbfeep14 0x1.9702f40ea5346p22 -0x1.0f3242297p6 0x1.62f75a3f3d46ap7 -0x1.dfffffffffffep4 0x1.8p-29 F +REG epsg:2988 2 OK 0x1.f815db196edb8p19 0x1.9702f40f2731p22 -0x1.6fd05675ap6 -0x1.56f75a3f3d469p7 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:2988 3 OK -0x1.306df588306p16 0x1.dacc76855a26cp22 -0x1.4689c126p5 0x1.62f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:2988 4 OK 0x1.0718bf205c0a9p20 0x1.dacc7685d5e17p22 -0x1.0c1adde55p6 -0x1.56f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:2989 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:2989 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2989 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2989 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2989 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:2990 0 OK 0x1.8b6bff53d06e3p15 0x1.3b3134b95b757p17 -0x1.c5c2b2bc8p3 0x1.bc44444444443p5 -0x1.51ddddddddddep4 0x1.8p-29 F +REG epsg:2990 1 OK -0x1.da9513e97b1p18 -0x1.8a00b47111d1ap18 -0x1.7a11fe8c38p7 0x1.9163239d5862p5 -0x1.a1ddddddb78adp4 0x1.0p-30 F +REG epsg:2990 2 OK 0x1.1eb80b637ca73p19 -0x1.8a00b49124c34p18 -0x1.5828a487cp6 0x1.e72564eb30a07p5 -0x1.a1ddddddb702cp4 -0x1.9p-26 F +REG epsg:2990 3 OK -0x1.ff2f0b7630b74p18 0x1.5962dc7e3b7ffp19 0x1.7bcc29f0ep5 0x1.9163239d8fc8ep5 -0x1.01ddddddc9158p4 -0x1.0p-26 F +REG epsg:2990 4 OK 0x1.310505ec3aec4p19 0x1.5962dc70e2ec9p19 0x1.3b56daa05p7 0x1.e72564eaf882ep5 -0x1.01ddddddc8c9fp4 -0x1.0p-30 F +REG epsg:29900 0 OK 0x1.86b88119eeb33p17 0x1.e83c3f9db5de6p17 -0x1.b7324ba3p5 -0x1.000000007a24cp3 0x1.ac00000015b7dp5 0x1.861ep-15 F +REG epsg:29900 1 OK -0x1.9b08b940e2e38p18 -0x1.09ae394e6059ep18 -0x1.aa8fcce5p5 -0x1.067e6c228df01p4 0x1.83fffffc08ee9p5 0x1.9dcep-15 F +REG epsg:29900 2 OK 0x1.90e14f67a1815p19 -0x1.09ac835047216p18 -0x1.49f4e672cp5 0x1.9f9b0885d7897p-2 0x1.83fffffc0d148p5 0x1.b478p-16 F +REG epsg:29900 3 OK -0x1.1a81045f6abe4p18 0x1.98e209b57cee4p19 -0x1.b752ab472p5 -0x1.067e6c14d815p4 0x1.d3fffffc545bfp5 0x1.26fbp-14 F +REG epsg:29900 4 OK 0x1.509bfa7869eccp19 0x1.98e2aaaaf881cp19 -0x1.6b1eb649ap5 0x1.9f9b05119281ep-2 0x1.d3fffffc58f6ap5 0x1.be3cp-15 F +REG epsg:29901 0 OK 0x1.86b8822452c0cp17 0x1.e83c9456d9295p17 -0x1.15a4da2814p8 -0x1.000000007a24bp3 0x1.ac00000015b7cp5 0x1.862p-15 F +REG epsg:29901 1 OK -0x1.9b08b39678458p18 -0x1.09ae0d658f6f7p18 -0x1.141fe86c1p8 -0x1.067e6c228defap4 0x1.83fffffc08ee9p5 0x1.9dcep-15 F +REG epsg:29901 2 OK 0x1.90e14d17a11cp19 -0x1.09ac57677ca12p18 -0x1.080c245634p8 0x1.9f9b0885d75a8p-2 0x1.83fffffc0d14bp5 0x1.b474p-16 F +REG epsg:29901 3 OK -0x1.1a80fea1e3308p18 0x1.98e21d4a2cb35p19 -0x1.159acb7364p8 -0x1.067e6c14d8151p4 0x1.d3fffffc545c1p5 0x1.26fap-14 F +REG epsg:29901 4 OK 0x1.509bf81ed6dfp19 0x1.98e2be3fa5317p19 -0x1.0c13fb672cp8 0x1.9f9b051192565p-2 0x1.d3fffffc58f6cp5 0x1.be4p-15 F +REG epsg:29902 0 OK 0x1.86b88119eeb33p17 0x1.e83c3f9db5de6p17 -0x1.b7324ba3p5 -0x1.000000007a24cp3 0x1.ac00000015b7dp5 0x1.861ep-15 F +REG epsg:29902 1 OK -0x1.9b08b940e2e38p18 -0x1.09ae394e6059ep18 -0x1.aa8fcce5p5 -0x1.067e6c228df01p4 0x1.83fffffc08ee9p5 0x1.9dcep-15 F +REG epsg:29902 2 OK 0x1.90e14f67a1815p19 -0x1.09ac835047216p18 -0x1.49f4e672cp5 0x1.9f9b0885d7897p-2 0x1.83fffffc0d148p5 0x1.b478p-16 F +REG epsg:29902 3 OK -0x1.1a81045f6abe4p18 0x1.98e209b57cee4p19 -0x1.b752ab472p5 -0x1.067e6c14d815p4 0x1.d3fffffc545bfp5 0x1.26fbp-14 F +REG epsg:29902 4 OK 0x1.509bfa7869eccp19 0x1.98e2aaaaf881cp19 -0x1.6b1eb649ap5 0x1.9f9b05119281ep-2 0x1.d3fffffc58f6ap5 0x1.be3cp-15 F +REG epsg:29903 0 OK 0x1.86b8822490aafp17 0x1.e83c3957aa35fp17 -0x1.b75592d5ap5 -0x1.000000007a24ap3 0x1.ac00000015b7cp5 0x1.8622p-15 F +REG epsg:29903 1 OK -0x1.9b08b8d08e14ep18 -0x1.09ae3c89b41ccp18 -0x1.aaac3bfb6p5 -0x1.067e6c228df07p4 0x1.83fffffc08ee9p5 0x1.9dccp-15 F +REG epsg:29903 2 OK 0x1.90e14fb4c8697p19 -0x1.09ac868b9a8dfp18 -0x1.4a0e1b056p5 0x1.9f9b0885d7891p-2 0x1.83fffffc0d14cp5 0x1.b46cp-16 F +REG epsg:29903 3 OK -0x1.1a8103f54a307p18 0x1.98e20831847acp19 -0x1.b7802b918p5 -0x1.067e6c14d815bp4 0x1.d3fffffc545c1p5 0x1.26fap-14 F +REG epsg:29903 4 OK 0x1.509bfac8aae24p19 0x1.98e2a927002d8p19 -0x1.6b49aad5cp5 0x1.9f9b051192786p-2 0x1.d3fffffc58f6ap5 0x1.be4p-15 F +REG epsg:2991 0 OK 0x1.86ap18 0x1.96e208b941ca4p17 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:2991 1 OK -0x1.58224050f8eep15 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2991 2 OK 0x1.9c2224050f901p19 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2991 3 OK 0x1.0a4c279e8ba6p13 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2991 4 OK 0x1.8276cf6185d27p19 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2992 0 OK 0x1.4064ff53f7cedp20 0x1.4dbabd3e95b5ap19 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:2992 1 OK -0x1.1a43107856f38p17 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2992 2 OK 0x1.5209305b7d3fp21 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2992 3 OK 0x1.b4d6f6677e14p14 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2992 4 OK 0x1.3cfb516728d38p21 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2993 0 OK 0x1.86ap18 0x1.96e208b941ca4p17 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:2993 1 OK -0x1.58224050f8eep15 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2993 2 OK 0x1.9c2224050f901p19 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2993 3 OK 0x1.0a4c279e8ba6p13 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2993 4 OK 0x1.8276cf6185d27p19 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2994 0 OK 0x1.4064ff53f7cedp20 0x1.4dbabd3e95b5ap19 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:2994 1 OK -0x1.1a43107856f38p17 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2994 2 OK 0x1.5209305b7d3fp21 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:2994 3 OK 0x1.b4d6f6677e14p14 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2994 4 OK 0x1.3cfb516728d38p21 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:2995 0 OK 0x1.e88583b9104fp18 0x1.b999772950f6cp22 -0x1.47925ab63p6 0x1.49fffffffffffp7 -0x1.9000000000005p4 0x1.0p-30 F +REG epsg:2995 1 OK -0x1.f82c9bc3b78cp14 0x1.9702f51ce4b9ap22 -0x1.d27b35826p6 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2995 2 OK 0x1.f846e8e73ef71p19 0x1.9702f51c083a6p22 -0x1.2e87ac3d9p6 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2995 3 OK -0x1.2ee85724d73d8p16 0x1.dacc82f721bcep22 -0x1.706bc1c4fp6 0x1.3ef75a3f3d469p7 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:2995 4 OK 0x1.0731477c7f396p20 0x1.dacc82f64fd7ap22 -0x1.7d0c25d74p5 0x1.5508a5c0c2b98p7 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:2996 0 OK 0x1.e7f3281d3b4d7p18 0x1.b99265a4e0eddp22 -0x1.4871aaabcp5 0x1.4ap7 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:2996 1 OK -0x1.009ba6a50b7p15 0x1.96fbf318cc09cp22 0x1.9c3eba03p3 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:2996 2 OK 0x1.f7fce23be0ef8p19 0x1.96fbf319fcb7ap22 -0x1.5d313203ep5 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:2996 3 OK -0x1.31319cc65acb8p16 0x1.dac5629a6fa5dp22 -0x1.2a4b2346p5 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:2996 4 OK 0x1.070cad8b14774p20 0x1.dac5629b91346p22 -0x1.8a82d7c9bp6 0x1.5508a5c0c2b98p7 -0x1.4p4 -0x1.0p-29 F +REG epsg:2997 0 OK 0x1.e7fd9599f1756p18 0x1.b991664f52dd4p22 -0x1.b9140467ap6 0x1.49fffff6b747p7 -0x1.900000167c818p4 0x1.811e13cp-4 F +REG epsg:2997 1 OK -0x1.00a95ca8515bp15 0x1.96f9929bb4046p22 -0x1.710da8cfep6 0x1.3ef75a38af6dfp7 -0x1.e000000d5750fp4 0x1.96e54ecp-4 F +REG epsg:2997 2 OK 0x1.f80d894d226cbp19 0x1.96fa2531bb1p22 -0x1.6f55f2b4f8p7 0x1.5508a5b618276p7 -0x1.e000001fbbe8ap4 0x1.749653p-4 F +REG epsg:2997 3 OK -0x1.315e042472108p16 0x1.dac51089abb2cp22 -0x1.8cd09cdbcp4 0x1.3ef75a37bbf92p7 -0x1.4000000ea71bcp4 0x1.8e63c1cp-4 F +REG epsg:2997 4 OK 0x1.0712168bfee99p20 0x1.dac5cf7f552e4p22 -0x1.efac29164p6 0x1.5508a5b538bc2p7 -0x1.4000001ef47e5p4 0x1.61c555cp-4 F +REG epsg:2998 0 OK 0x1.e7f2c0a7c07c7p18 0x1.b9926d97de37ap22 -0x1.3243b12b8p5 0x1.4ap7 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:2998 1 OK -0x1.009e73d6b0afp15 0x1.96fbfc08ab00cp22 0x1.f2f592988p3 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x1.8p-29 F +REG epsg:2998 2 OK 0x1.f7fca798f7d66p19 0x1.96fbfc09dd26cp22 -0x1.49aaf87c4p5 0x1.5508a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2998 3 OK -0x1.3132f68c0886p16 0x1.dac5699a385d4p22 -0x1.11c299a18p5 0x1.3ef75a3f3d469p7 -0x1.3fffffffffffdp4 -0x1.0p-30 F +REG epsg:2998 4 OK 0x1.070c8f6c611fcp20 0x1.dac5699b5b50ep22 -0x1.7f69c5d4cp6 0x1.5508a5c0c2b98p7 -0x1.3fffffffffffcp4 0x1.0p-28 F +REG epsg:2999 0 OK 0x1.e743b54a54215p18 0x1.b99d370d59c13p22 -0x1.8029ece19p6 0x1.67fffffffffffp5 -0x1.9000000000003p4 0x1.0p-30 F +REG epsg:2999 1 OK -0x1.062abe40aa55p15 0x1.9706af6ee6f87p22 -0x1.663fafef6p5 0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:2999 2 OK 0x1.f7a65fa2da55ap19 0x1.9706af728b38cp22 -0x1.b46f21c15p7 0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:2999 3 OK -0x1.33ef016a010a8p16 0x1.dad04828d5c93p22 0x1.eab2c292cp4 0x1.3bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:2999 4 OK 0x1.06e0ca1616c4dp20 0x1.dad0482c4df59p22 -0x1.3b0997eb1p7 0x1.942297030ae5dp5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:3000 0 OK 0x1.dc0e7d6e93e26p21 0x1.b76ee3ed766c7p19 -0x1.45e591fecp5 0x1.b800000000001p6 0x1.97e1a6bbe6467p-41 -0x1.8p-29 T +REG epsg:3000 1 OK 0x1.9850e2716a88cp21 0x1.53e07046c63fep18 -0x1.32ac6d7c8p4 0x1.a400000000001p6 -0x1.3fffffffffe22p2 -0x1.0p-28 F +REG epsg:3000 2 OK 0x1.0fe60c3da99fbp22 0x1.53dfe360d44b8p18 -0x1.6273a59d8p5 0x1.cc00000000002p6 -0x1.3fffffffffe2cp2 0x1.0p-30 F +REG epsg:3000 3 OK 0x1.9850e2716a88cp21 0x1.6276c7e535feap20 -0x1.a50883c8cp4 0x1.a400000000001p6 0x1.3fffffffffe29p2 -0x1.0p-28 F +REG epsg:3000 4 OK 0x1.0fe60c3da99fbp22 0x1.6276eb1d5e558p20 -0x1.9ba1bfa26p5 0x1.cc00000000002p6 0x1.3fffffffffe24p2 0x0.0p0 F +REG epsg:3001 0 OK 0x1.dc0f381ee9a97p21 0x1.b77a3b3512375p19 -0x1.d06a27e74p4 0x1.b800000000001p6 -0x1.f686e7a19869dp-41 -0x1.0p-30 T +REG epsg:3001 1 OK 0x1.9851a54cad62cp21 0x1.53f7546a97ef8p18 -0x1.18262c8a4p4 0x1.a400000000001p6 -0x1.3fffffffffe2p2 -0x1.0p-29 F +REG epsg:3001 2 OK 0x1.0fe6657f1a7f4p22 0x1.53f6de52101a6p18 -0x1.34ab98a6ap5 0x1.cc00000000002p6 -0x1.3fffffffffe26p2 -0x1.0p-29 F +REG epsg:3001 3 OK 0x1.9851a54cad62cp21 0x1.627c660f0b8b6p20 -0x1.195f5d968p3 0x1.a400000000001p6 0x1.3fffffffffe3p2 -0x1.0p-28 F +REG epsg:3001 4 OK 0x1.0fe6657f1a7f4p22 0x1.627c8396893dap20 -0x1.dde09526cp4 0x1.cc00000000002p6 0x1.3fffffffffe21p2 -0x1.0p-29 F +REG epsg:3002 0 OK 0x1.dc075452a72c9p21 0x1.b761d5b5c05d6p19 0x1.934dd1d4p5 0x1.b800000000001p6 0x1.6f632f31c2acp-39 -0x1.0p-30 T +REG epsg:3002 1 OK 0x1.9849f8ff9c641p21 0x1.53c8bed642a1ap18 0x1.91839742bp6 0x1.a400000000001p6 -0x1.3fffffffffe2bp2 -0x1.0p-29 F +REG epsg:3002 2 OK 0x1.0fe257e6edf6p22 0x1.53c7522d2036ep18 0x1.1a9a714a2p5 0x1.cc00000000002p6 -0x1.3fffffffffe23p2 -0x1.0p-29 F +REG epsg:3002 3 OK 0x1.9849f8ff9c641p21 0x1.626fa6255ed9fp20 0x1.2be00784bp6 0x1.a400000000001p6 0x1.3fffffffffe1cp2 -0x1.8p-29 F +REG epsg:3002 4 OK 0x1.0fe257e6edf6p22 0x1.627001436e53ap20 0x1.3d4b240b8p3 0x1.cc00000000002p6 0x1.3fffffffffe2ap2 -0x1.0p-29 F +REG epsg:3003 0 OK 0x1.6e36a20cc359p20 -0x1.4f6cbfe4eb5cep6 -0x1.08011dc07p6 0x1.200000011a394p3 -0x1.0b86918ec47bfp-31 0x1.7d8ep-10 T +REG epsg:3003 1 OK 0x1.cd703ee81d04dp19 -0x1.0eef39df245e7p19 -0x1.17068b04ap6 0x1.00000004def9bp2 -0x1.40000000b39fcp2 0x1.7434dp-10 F +REG epsg:3003 2 OK 0x1.f5b4f94c1824cp20 -0x1.0eef8572a7f1fp19 -0x1.00a55b23ep6 0x1.bfffffff76f0ep3 -0x1.4000000017f28p2 0x1.864bp-10 F +REG epsg:3003 3 OK 0x1.cd709a308ffdp19 0x1.0eda99672b30ep19 -0x1.108d7d876p6 0x1.0000000567c5ep2 0x1.3fffffff22a2ap2 0x1.6cc68p-10 F +REG epsg:3003 4 OK 0x1.f5b5226ab4df6p20 0x1.0eda38494a34ap19 -0x1.f45f1173ap5 0x1.bfffffffbd54p3 0x1.3fffffff9c088p2 0x1.83ffp-10 F +REG epsg:3004 0 OK 0x1.339df33ef9dffp21 -0x1.53de1be033d5fp6 -0x1.f9ea76e22p5 0x1.e000000067ea9p3 -0x1.855de694ec0ap-33 0x1.862cp-10 T +REG epsg:3004 1 OK 0x1.dfbd75860947fp20 -0x1.0eef711ea662cp19 -0x1.07fc5b0f2p6 0x1.40000001c63b8p3 -0x1.4000000054903p2 0x1.819eap-10 F +REG epsg:3004 2 OK 0x1.775d23d92338ep21 -0x1.0eef85c4e50fap19 -0x1.f382d6c96p5 0x1.3fffffff601dbp4 -0x1.3fffffffc212cp2 0x1.86a11p-10 F +REG epsg:3004 3 OK 0x1.dfbd87919231p20 0x1.0eda52a3b871ep19 -0x1.0185a6cc8p6 0x1.400000020c191p3 0x1.3fffffff68e44p2 0x1.7d40ep-10 F +REG epsg:3004 4 OK 0x1.775d2a9c907a9p21 0x1.0eda2872fe9c6p19 -0x1.e697c5132p5 0x1.3fffffff83671p4 0x1.3fffffffeec37p2 0x1.8775p-10 F +REG epsg:3005 0 OK 0x1.e848p19 0x1.6d8c1d68821cp19 0x0.0p0 -0x1.f8p6 0x1.9e00000000002p5 0x0.0p0 F +REG epsg:3005 1 OK -0x1.c62a75cd29c5cp19 -0x1.ab1541aa2717p18 0x0.0p0 -0x1.279cb3f010beap7 0x1.31ffffffffffep5 0x0.0p0 F +REG epsg:3005 2 OK 0x1.65ae9d734a716p21 -0x1.ab1541aa2717cp18 0x0.0p0 -0x1.a0c6981fde82bp6 0x1.31ffffffffffcp5 0x0.0p0 F +REG epsg:3005 3 OK -0x1.8bb2c0898714p14 0x1.25c515169618ep21 0x0.0p0 -0x1.279cb3f010beap7 0x1.05p6 0x0.0p0 F +REG epsg:3005 4 OK 0x1.ee76cb02261c4p20 0x1.25c515169618dp21 0x0.0p0 -0x1.a0c6981fde82bp6 0x1.04fffffffffffp6 0x0.0p0 F +REG epsg:3006 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3006 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:3006 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:3006 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:3006 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:3007 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:3007 1 OK -0x1.8bb226bdf2f86p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000001d501ep2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3007 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3007 3 OK -0x1.8bb226bdf2f86p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000001d501ep2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3007 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3008 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.bp3 0x0.0p0 0x0.0p0 T +REG epsg:3008 1 OK -0x1.8bb226bdf2f84p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.10000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3008 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.27ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3008 3 OK -0x1.8bb226bdf2f84p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.10000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3008 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.27ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3009 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3009 1 OK -0x1.8bb226bdf2f84p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.40000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3009 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3009 3 OK -0x1.8bb226bdf2f84p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.40000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3009 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3010 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.08p4 0x0.0p0 0x0.0p0 T +REG epsg:3010 1 OK -0x1.8bb226bdf2f86p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.70000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3010 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3010 3 OK -0x1.8bb226bdf2f86p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.70000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3010 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3011 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG epsg:3011 1 OK -0x1.8bb226bdf2f84p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a0000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3011 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3011 3 OK -0x1.8bb226bdf2f84p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a0000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3011 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3012 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.c800000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:3012 1 OK -0x1.8bb226bdf2f86p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.28000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3012 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.33ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3012 3 OK -0x1.8bb226bdf2f86p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.28000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3012 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.33ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3013 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.f8p3 0x0.0p0 0x0.0p0 T +REG epsg:3013 1 OK -0x1.8bb226bdf2f84p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.58000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3013 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4bffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3013 3 OK -0x1.8bb226bdf2f84p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.58000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3013 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4bffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3014 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.14p4 0x0.0p0 0x0.0p0 T +REG epsg:3014 1 OK -0x1.8bb226bdf2f84p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.88000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3014 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.63ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3014 3 OK -0x1.8bb226bdf2f84p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.88000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3014 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.63ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3015 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.2cp4 0x0.0p0 0x0.0p0 T +REG epsg:3015 1 OK -0x1.8bb226bdf2f86p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b8000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3015 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3015 3 OK -0x1.8bb226bdf2f86p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b8000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3015 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3016 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.44p4 0x0.0p0 0x0.0p0 T +REG epsg:3016 1 OK -0x1.8bb226bdf2f86p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e8000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3016 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.93ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3016 3 OK -0x1.8bb226bdf2f86p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e8000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3016 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.93ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:30161 0 OK 0x1.a36ba87aa8fdfp7 -0x1.6f6aa859e54dfp8 -0x1.c6fd09c42p5 0x1.03p7 0x1.0800000000001p5 0x0.0p0 F +REG epsg:30161 1 OK -0x1.1e7f284e65244p19 -0x1.07cbb3bd2bc49p19 -0x1.3848fd13ep5 0x1.ee2719959298bp6 0x1.bfffffffaaf6bp4 0x0.0p0 F +REG epsg:30161 2 OK 0x1.1eb395fb7f6c7p19 -0x1.07cbb3b5ae071p19 -0x1.2064b8bp-1 0x1.0eec733536c47p7 0x1.bfffffffaa9a3p4 -0x1.2p-26 F +REG epsg:30161 3 OK -0x1.ff58024b7938p18 0x1.16e12677233d6p19 -0x1.94effc5b5p6 0x1.ee271995a7d1ep6 0x1.2fffffffa509ap5 -0x1.ap-27 F +REG epsg:30161 4 OK 0x1.ffc0ddb2c7364p18 0x1.16e1267d560bbp19 -0x1.0b97cca3ap6 0x1.0eec73352c158p7 0x1.2fffffffa49c7p5 -0x1.2p-26 F +REG epsg:30162 0 OK 0x1.bca525961c279p7 -0x1.727f22f4d5834p8 -0x1.a108d501ep5 0x1.06p7 0x1.07fffffffffffp5 0x0.0p0 F +REG epsg:30162 1 OK -0x1.1e7d86011bf5cp19 -0x1.07cc096a80678p19 -0x1.19cc8965ep5 0x1.f427199592999p6 0x1.bfffffffaaf9bp4 -0x1.4p-28 F +REG epsg:30162 2 OK 0x1.1eb51ae117ad2p19 -0x1.07cc09628f25ap19 0x1.63ec0cdep2 0x1.11ec733536c5p7 0x1.bfffffffaa97bp4 -0x1.5p-26 F +REG epsg:30162 3 OK -0x1.ff54c3b62cd79p18 0x1.16e0b64ba7b17p19 -0x1.87554c457p6 0x1.f4271995a7d19p6 0x1.2fffffffa50d4p5 -0x1.8p-27 F +REG epsg:30162 4 OK 0x1.ffc3ed84a428cp18 0x1.16e0b6523a185p19 -0x1.eb750c94ep5 0x1.11ec73352c157p7 0x1.2fffffffa4992p5 -0x1.4p-26 F +REG epsg:30163 0 OK 0x1.d00e4343b34ebp7 -0x1.4ee30bbfc3a73p8 -0x1.0b2af3ad8p6 0x1.0855555555557p7 0x1.2000000000002p5 0x1.0p-30 F +REG epsg:30163 1 OK -0x1.2054c3f30bc06p19 -0x1.06e499c65feecp19 -0x1.aec78e7ecp5 0x1.f7f1ffa584bfdp6 0x1.efffffff79744p4 -0x1.4p-28 F +REG epsg:30163 2 OK 0x1.208ec5f72314ap19 -0x1.06e499bd62bccp19 -0x1.6078998b8p3 0x1.14b1aad7e85d5p7 0x1.efffffff78d58p4 -0x1.8p-26 F +REG epsg:30163 3 OK -0x1.fbaa2cebe438bp18 0x1.17d3e7d3d00aep19 -0x1.b7a9126b2p6 0x1.f7f1ffa5b6cebp6 0x1.47ffffff7a859p5 -0x1.1p-26 F +REG epsg:30163 4 OK 0x1.fc1e30f957c79p18 0x1.17d3e7daa740ep19 -0x1.20cea5e09p6 0x1.14b1aad7cf292p7 0x1.47ffffff79d28p5 -0x1.3p-26 F +REG epsg:30164 0 OK 0x1.e600125f6c794p7 -0x1.7806ab6549e94p8 -0x1.5ce598702p5 0x1.0bp7 0x1.08p5 -0x1.0p-30 F +REG epsg:30164 1 OK -0x1.1e7ad5ea90e07p19 -0x1.07cca33ab93d4p19 -0x1.c340992acp4 0x1.fe271995929b5p6 0x1.bfffffffaafe8p4 -0x1.0p-28 F +REG epsg:30164 2 OK 0x1.1eb7962d68dd1p19 -0x1.07cca3320a858p19 0x1.06054275p4 0x1.16ec733536c5cp7 0x1.bfffffffaa936p4 -0x1.4p-26 F +REG epsg:30164 3 OK -0x1.ff4f6e5810e25p18 0x1.16dfeceb9e4d8p19 -0x1.6e4434cfp6 0x1.fe271995a7d15p6 0x1.2fffffffa512fp5 -0x1.cp-27 F +REG epsg:30164 4 OK 0x1.ffc8eeeecd99ep18 0x1.16dfecf2cd83fp19 -0x1.9e3d37a1p5 0x1.16ec73352c157p7 0x1.2fffffffa4943p5 -0x1.6p-26 F +REG epsg:30165 0 OK 0x1.f395c452ec62dp7 -0x1.543df02a1a14bp8 -0x1.db5a83adap5 0x1.0caaaaaaaaaa9p7 0x1.2p5 0x1.0p-29 F +REG epsg:30165 1 OK -0x1.2052745746cadp19 -0x1.06e531377ec37p19 -0x1.7dc4acaap5 0x1.004e552817b5dp7 0x1.efffffff797a9p4 -0x1.0p-28 F +REG epsg:30165 2 OK 0x1.2090e74fd0e2ap19 -0x1.06e5312dd10a9p19 -0x1.9be3044cp0 0x1.1907002d3db32p7 0x1.efffffff78cfep4 -0x1.ap-26 F +REG epsg:30165 3 OK -0x1.fba5982b17146p18 0x1.17d3274802451p19 -0x1.a21570fc1p6 0x1.004e552830bb5p7 0x1.47ffffff7a8ccp5 -0x1.6p-26 F +REG epsg:30165 4 OK 0x1.fc227e23096ccp18 0x1.17d3274f5fdbbp19 -0x1.ff5c92ca2p5 0x1.1907002d247d5p7 0x1.47ffffff79cc3p5 -0x1.5p-26 F +REG epsg:30166 0 OK 0x1.073742c2f0be8p8 -0x1.58a0ac9846eb6p8 -0x1.ab0c5f938p5 0x1.1p7 0x1.2000000000001p5 0x0.0p0 F +REG epsg:30166 1 OK -0x1.2050b3d7f55bfp19 -0x1.06e5ad3eae323p19 -0x1.54cc3808ap5 0x1.03a3aa7d6d0bcp7 0x1.efffffff797f9p4 -0x1.0p-28 F +REG epsg:30166 2 OK 0x1.209281ebde365p19 -0x1.06e5ad347b094p19 0x1.7f61f116p2 0x1.1c5c558293092p7 0x1.efffffff78cbap4 -0x1.9p-26 F +REG epsg:30166 3 OK -0x1.fba21fbe3d853p18 0x1.17d28996eb989p19 -0x1.900c02b13p6 0x1.03a3aa7d860fep7 0x1.47ffffff7a926p5 -0x1.4p-26 F +REG epsg:30166 4 OK 0x1.fc25bbee53edep18 0x1.17d2899eaec4cp19 -0x1.c9d55fe18p5 0x1.1c5c558279d22p7 0x1.47ffffff79c76p5 -0x1.4p-26 F +REG epsg:30167 0 OK 0x1.107af7a889495p8 -0x1.5bd550ff0e4c9p8 -0x1.87bd930b2p5 0x1.1255555555557p7 0x1.2000000000001p5 0x0.0p0 F +REG epsg:30167 1 OK -0x1.204f7d87810adp19 -0x1.06e607e694f9fp19 -0x1.3672774c6p5 0x1.05f8ffd2c261ap7 0x1.efffffff7982dp4 -0x1.8p-28 F +REG epsg:30167 2 OK 0x1.20939c8ad6918p19 -0x1.06e607dc05b0ep19 0x1.6fd23bfe8p3 0x1.1eb1aad7e85eep7 0x1.efffffff78c88p4 -0x1.dp-26 F +REG epsg:30167 3 OK -0x1.fb9fb960cf654p18 0x1.17d21653ebc4ep19 -0x1.82af7595p6 0x1.05f8ffd2db64dp7 0x1.47ffffff7a96p5 -0x1.3p-26 F +REG epsg:30167 4 OK 0x1.fc27f770d1771p18 0x1.17d2165bf5144p19 -0x1.a310549a2p5 0x1.1eb1aad7cf271p7 0x1.47ffffff79c3ep5 -0x1.1p-26 F +REG epsg:30168 0 OK 0x1.1aee0368d1d55p8 -0x1.5fa1b790550ccp8 -0x1.5de7410d4p5 0x1.14fffffffffffp7 0x1.2p5 0x1.0p-29 F +REG epsg:30168 1 OK -0x1.204e1ebc8d08cp19 -0x1.06e6735239cecp19 -0x1.121800342p5 0x1.08a3aa7d6d0c9p7 0x1.efffffff79868p4 -0x1.0p-28 F +REG epsg:30168 2 OK 0x1.2094da8547fa9p19 -0x1.06e673474293bp19 0x1.1f7b1f4cp4 0x1.215c55829309dp7 0x1.efffffff78c56p4 -0x1.cp-26 F +REG epsg:30168 3 OK -0x1.fb9d0336e14cp18 0x1.17d18dc04cfccp19 -0x1.72ae62f08p6 0x1.08a3aa7d860ebp7 0x1.47ffffff7a9a7p5 -0x1.7p-26 F +REG epsg:30168 4 OK 0x1.fc2a7ad2ffb9fp18 0x1.17d18dc8a56dfp19 -0x1.7577cf1a8p5 0x1.215c558279d12p7 0x1.47ffffff79c04p5 -0x1.3p-26 F +REG epsg:30169 0 OK 0x1.2539d4980ad3ap8 -0x1.639270109732p8 -0x1.3280e25b8p5 0x1.17aaaaaaaaaa8p7 0x1.2p5 -0x1.0p-30 F +REG epsg:30169 1 OK -0x1.204cc43c11fafp19 -0x1.06e6e2c0fe33ap19 -0x1.d7f65a208p4 0x1.0b4e552817b79p7 0x1.efffffff798a9p4 -0x1.cp-28 F +REG epsg:30169 2 OK 0x1.209612fb7e465p19 -0x1.06e6e2b5a0861p19 0x1.8a1dfa74p4 0x1.2407002d3db4ep7 0x1.efffffff78c22p4 -0x1.cp-26 F +REG epsg:30169 3 OK -0x1.fb9a55e8d4974p18 0x1.17d10012c2df8p19 -0x1.61e70c188p6 0x1.0b4e552830b8ap7 0x1.47ffffff7a9ecp5 -0x1.5p-26 F +REG epsg:30169 4 OK 0x1.fc2cf373c1504p18 0x1.17d1001b69523p19 -0x1.4685c36b2p5 0x1.2407002d247b2p7 0x1.47ffffff79bcap5 -0x1.7p-26 F +REG epsg:3017 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.5cp4 0x0.0p0 0x0.0p0 T +REG epsg:3017 1 OK -0x1.8bb226bdf2f8p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0c00000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3017 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.abffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3017 3 OK -0x1.8bb226bdf2f8p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0c00000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3017 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.abffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:30170 0 OK 0x1.2cd85edc29d8bp8 -0x1.33c908b9e0fccp8 -0x1.cb3203c3ap5 0x1.19aaaaaaaaaaap7 0x1.4000000000003p5 -0x1.0p-29 F +REG epsg:30170 1 OK -0x1.22fada87cbad8p19 -0x1.058e1b8b78adcp19 -0x1.abb7af88ep5 0x1.0c9cd2f1fe7ffp7 0x1.17ffffff81a22p5 -0x1.ep-27 F +REG epsg:30170 2 OK 0x1.234610e742594p19 -0x1.058e1b7ebbbd8p19 0x1.4969c52p1 0x1.26b8826356d6p7 0x1.17ffffff80e46p5 -0x1.3p-25 F +REG epsg:30170 3 OK -0x1.f63c8dce67392p18 0x1.192a897d1ca97p19 -0x1.9e4382744p6 0x1.0c9cd2f2340dbp7 0x1.67ffffff2615fp5 -0x1.3p-25 F +REG epsg:30170 4 OK 0x1.f6d2fa8a111e4p18 0x1.192a8985c6572p19 -0x1.b989afbf8p5 0x1.26b8826320c8dp7 0x1.67ffffff24969p5 -0x1.6p-27 F +REG epsg:30171 0 OK 0x1.2869c2330e93bp8 -0x1.f8c60d85d3ea2p7 -0x1.3cedaf14bp6 0x1.188p7 0x1.5ffffffffffffp5 0x1.0p-30 F +REG epsg:30171 1 OK -0x1.25fc251e7dbbp19 -0x1.03fe230c29218p19 -0x1.3ea76a685p6 0x1.0a992e63a62dep7 0x1.37ffffff123c6p5 -0x1.68p-25 F +REG epsg:30171 2 OK 0x1.26463fd1251a2p19 -0x1.03fe22feb71f9p19 -0x1.7e5b34e14p4 0x1.2666d19c597d5p7 0x1.37ffffff10e18p5 -0x1.28p-25 F +REG epsg:30171 3 OK -0x1.f02e5f2893368p18 0x1.1aa1e6ea5b65fp19 -0x1.deab40625p6 0x1.0a992e6409e1ep7 0x1.87fffffea4477p5 -0x1.14p-24 F +REG epsg:30171 4 OK 0x1.f0c2947af76d8p18 0x1.1aa1e6f27cb1p19 -0x1.225badcc2p6 0x1.2666d19bf4ccfp7 0x1.87fffffea1e44p5 0x1.4p-26 F +REG epsg:30172 0 OK 0x1.377b3249ce88bp8 -0x1.03c1e6562c88ep8 -0x1.1e63f917fp6 0x1.1c8p7 0x1.6p5 0x0.0p0 F +REG epsg:30172 1 OK -0x1.25fa2a12ad0dfp19 -0x1.03fefaa11d53fp19 -0x1.23930c1cdp6 0x1.0e992e63a62b5p7 0x1.37ffffff12461p5 -0x1.8p-25 F +REG epsg:30172 2 OK 0x1.2648092444c22p19 -0x1.03fefa92fbd7fp19 -0x1.c95c45388p3 0x1.2a66d19c597b9p7 0x1.37ffffff10d97p5 -0x1.0p-25 F +REG epsg:30172 3 OK -0x1.f02a7770f82cbp18 0x1.1aa0e50875387p19 -0x1.c7cef78b8p6 0x1.0e992e6409d85p7 0x1.87fffffea4585p5 -0x1.24p-24 F +REG epsg:30172 4 OK 0x1.f0c6358252869p18 0x1.1aa0e51100adbp19 -0x1.01ecc38p6 0x1.2a66d19bf4c53p7 0x1.87fffffea1d5fp5 0x1.3p-26 F +REG epsg:30173 0 OK 0x1.462b786a186d7p8 -0x1.0b7d22477920cp8 -0x1.fcb729e6cp5 0x1.208p7 0x1.6000000000002p5 -0x1.0p-30 F +REG epsg:30173 1 OK -0x1.25f839f4a950ep19 -0x1.03ffdcc37b97p19 -0x1.06bfba3e7p6 0x1.12992e63a6291p7 0x1.37ffffff124fbp5 -0x1.88p-25 F +REG epsg:30173 2 OK 0x1.2649c51a8d8ap19 -0x1.03ffdcb4aef65p19 -0x1.14a6f891p2 0x1.2e66d19c5979cp7 0x1.37ffffff10d1cp5 -0x1.3p-25 F +REG epsg:30173 3 OK -0x1.f026a648f3eedp18 0x1.1a9fd6870a395p19 -0x1.af795dc5cp6 0x1.12992e6409cf3p7 0x1.87fffffea468ep5 -0x1.34p-24 F +REG epsg:30173 4 OK 0x1.f0c9bc844f375p18 0x1.1a9fd68ffd3d2p19 -0x1.c08484e1ap5 0x1.2e66d19bf4bdbp7 0x1.87fffffea1c84p5 0x1.4p-26 F +REG epsg:30174 0 OK 0x1.359cc88c77636p8 -0x1.dc5fd7ffa9ac2p8 0x1.63027ba44p5 0x1.1cp7 0x1.a000000000002p4 -0x1.0p-29 F +REG epsg:30174 1 OK -0x1.1a90b779b012p19 -0x1.09a9fc0d5b094p19 0x1.f0381ae4p5 0x1.10dfbd31359a4p7 0x1.4fffffffde71bp4 0x1.0p-30 F +REG epsg:30174 2 OK 0x1.1ade1f01e6f8p19 -0x1.09a9fc04c14fdp19 0x1.d851f5464p6 0x1.272042ceca6c9p7 0x1.4fffffffde37cp4 -0x1.8p-28 F +REG epsg:30174 3 OK -0x1.036f55f071ecp19 0x1.14d160971335dp19 -0x1.2da51b36cp4 0x1.10dfbd312d1dep7 0x1.efffffffb853dp4 -0x1.0p-30 F +REG epsg:30174 4 OK 0x1.03bcbd970c423p19 0x1.14d1609fd1e73p19 0x1.04e6cb3b6p5 0x1.272042ced2f56p7 0x1.efffffffb7d5bp4 -0x1.4p-26 F +REG epsg:30175 0 OK 0x1.81572fd5f33c8p7 -0x1.c05e086567d24p8 -0x1.a22c4c53p3 0x1.fe00000000001p6 0x1.9ffffffffffffp4 0x1.0p-30 F +REG epsg:30175 1 OK -0x1.1aa00317efd59p19 -0x1.09a7195cf6fb8p19 0x1.a74513418p3 0x1.e7bf7a626b319p6 0x1.4fffffffde663p4 -0x1.0p-28 F +REG epsg:30175 2 OK 0x1.1ad02e347324cp19 -0x1.09a719579e588p19 0x1.80de27d3ap5 0x1.0a2042ceca6b6p7 0x1.4fffffffde421p4 -0x1.0p-28 F +REG epsg:30175 3 OK -0x1.037e862ca6613p19 0x1.14d584f4fd279p19 -0x1.fd466008ap5 0x1.e7bf7a625a345p6 0x1.efffffffb83aap4 -0x1.0p-29 F +REG epsg:30175 4 OK 0x1.03aeb159a8071p19 0x1.14d584fa6c9e4p19 -0x1.fa1f56b5p4 0x1.0a2042ced2f1ep7 0x1.efffffffb7ebfp4 -0x1.8p-27 F +REG epsg:30176 0 OK 0x1.449a0e77a07e9p7 -0x1.bb9d1c339626cp8 -0x1.6d1596eb4p4 0x1.fp6 0x1.a000000000001p4 0x0.0p0 F +REG epsg:30176 1 OK -0x1.1aa3ec5cf53d1p19 -0x1.09a69bfc5d1b3p19 0x1.79653889p2 0x1.d9bf7a626b30fp6 0x1.4fffffffde634p4 -0x1.0p-29 F +REG epsg:30176 2 OK 0x1.1acc7fccd7adp19 -0x1.09a69bf7dc699p19 0x1.1a3d662a8p5 0x1.032042ceca6b2p7 0x1.4fffffffde44fp4 -0x1.0p-28 F +REG epsg:30176 3 OK -0x1.03826acc24b42p19 0x1.14d638eea1f79p19 -0x1.198f33321p6 0x1.d9bf7a625a326p6 0x1.efffffffb8346p4 0x0.0p0 F +REG epsg:30176 4 OK 0x1.03aafe4993791p19 0x1.14d638f335dd2p19 -0x1.5b4a5875ap5 0x1.032042ced2f1p7 0x1.efffffffb7f1cp4 -0x1.4p-27 F +REG epsg:30177 0 OK 0x1.bca43f4049fe1p7 -0x1.c5ecb70d41153p8 -0x1.ab644fa4p0 0x1.06p7 0x1.a000000000002p4 -0x1.0p-30 F +REG epsg:30177 1 OK -0x1.1a9c2bda36df4p19 -0x1.09a7abf06f31p19 0x1.653b01268p4 0x1.f5bf7a626b326p6 0x1.4fffffffde693p4 -0x1.cp-28 F +REG epsg:30177 2 OK 0x1.1ad3c0a0d32bp19 -0x1.09a7abea43983p19 0x1.f49bfbd9ep5 0x1.112042ceca6bbp7 0x1.4fffffffde3f6p4 -0x1.0p-28 F +REG epsg:30177 3 OK -0x1.037ab45dc0b92p19 0x1.14d4b28d33068p19 -0x1.ba6f4732ap5 0x1.f5bf7a625a363p6 0x1.efffffffb8414p4 -0x1.8p-29 F +REG epsg:30177 4 OK 0x1.03b24937f2d1p19 0x1.14d4b2937901p19 -0x1.25954c364p4 0x1.112042ced2f2dp7 0x1.efffffffb7e66p4 -0x1.ap-27 F +REG epsg:30178 0 OK 0x1.0735f75cd31acp8 -0x1.06bdeef72264dp9 0x1.14e91aab1p6 0x1.1p7 0x1.4000000000001p4 0x1.8p-29 F +REG epsg:30178 1 OK -0x1.179d7439694a5p19 -0x1.0b0fac37b4172p19 0x1.7decc5583p6 0x1.055bb4748340ep7 0x1.dfffffffda8fbp3 -0x1.0p-27 F +REG epsg:30178 2 OK 0x1.17df4202c92d2p19 -0x1.0b0fac3267037p19 0x1.1d4a0fe8ap7 0x1.1aa44b8b7cb63p7 0x1.dfffffffda54fp3 0x0.0p0 F +REG epsg:30178 3 OK -0x1.065da820a12b1p19 0x1.133ae15dab8d6p19 0x1.4ec32d2p2 0x1.055bb47474fcap7 0x1.8fffffffde918p4 0x0.0p0 F +REG epsg:30178 4 OK 0x1.069f760f33e5ep19 0x1.133ae1645a896p19 0x1.8bded2e78p5 0x1.1aa44b8b8b0eap7 0x1.8fffffffde5e8p4 -0x1.2p-27 F +REG epsg:30179 0 OK 0x1.87c30739d5e57p8 -0x1.fcaf523e7333bp8 0x1.ba9703119p6 0x1.34p7 0x1.9ffffffffffffp4 0x0.0p0 F +REG epsg:30179 1 OK -0x1.1a85aa9aa9ed5p19 -0x1.09ad503d6320ep19 0x1.ec690ba6bp6 0x1.28dfbd31359b5p7 0x1.4fffffffde7a2p4 -0x1.0p-28 F +REG epsg:30179 2 OK 0x1.1ae79bc71d9cp19 -0x1.09ad50327dbc1p19 0x1.840e263cfp7 0x1.3f2042ceca6d4p7 0x1.4fffffffde30bp4 -0x1.4p-27 F +REG epsg:30179 3 OK -0x1.036468a989981p19 0x1.14cc994bc856ep19 0x1.29cb30a3p5 0x1.28dfbd312d209p7 0x1.efffffffb8666p4 0x1.0p-30 F +REG epsg:30179 4 OK 0x1.03c65a021c4bfp19 0x1.14cc9956dcec8p19 0x1.99615cb76p6 0x1.3f2042ced2f7dp7 0x1.efffffffb7c69p4 -0x1.3p-26 F +REG epsg:3018 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.74p4 0x0.0p0 0x0.0p0 T +REG epsg:3018 1 OK -0x1.8bb226bdf2f86p18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2400000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3018 2 OK 0x1.5855135ef97c3p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c3ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3018 3 OK -0x1.8bb226bdf2f86p18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2400000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3018 4 OK 0x1.5855135ef97c3p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c3ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3019 0 OK 0x1.6e461d76af2b6p20 -0x1.0a7ca92ec570dp9 0x1.45b7f94778p8 0x1.69dd695c63dc8p3 -0x1.11e779e85d36ep-28 0x1.0b862cp-7 T +REG epsg:3019 1 OK 0x1.cd796befbff9p19 -0x1.0f3e19c514d27p19 0x1.795a6a9d54p8 0x1.93bad2b93d733p2 -0x1.3fffffffea815p2 0x1.0c60f6p-7 F +REG epsg:3019 2 OK 0x1.f5cfa900bbe2ep20 -0x1.0f3e3befec83dp19 0x1.806b8882p8 0x1.04eeb4ad120eep4 -0x1.3ffffffbe520ap2 0x1.0b9ff8p-7 F +REG epsg:3019 3 OK 0x1.cd77fdb327f4cp19 0x1.0eb894e5aba8bp19 0x1.104cfe3bdp8 0x1.93bad2bd29abap2 0x1.3ffffff38a36fp2 0x1.050a1p-7 F +REG epsg:3019 4 OK 0x1.f5d017ff1897p20 0x1.0eb946b31a76bp19 0x1.175ed3e08p8 0x1.04eeb4ae15423p4 0x1.3ffffff77a047p2 0x1.090134p-7 F +REG epsg:3020 0 OK 0x1.6e472119d2494p20 -0x1.0a428497ed532p9 0x1.47a2d24af4p8 0x1.b1dd695c3f4bep3 -0x1.aee8cdd7c0916p-29 0x1.0bda1ep-7 T +REG epsg:3020 1 OK 0x1.cd7b70d56991bp19 -0x1.0f3dfe2c813ep19 0x1.79d8b2b698p8 0x1.11dd695c7a4a3p3 -0x1.3fffffff05334p2 0x1.0c57c2p-7 F +REG epsg:3020 2 OK 0x1.f5d0a620732d6p20 -0x1.0f3e2fb071e95p19 0x1.83bb57b8a8p8 0x1.28eeb4acfe931p4 -0x1.3ffffffafb6fep2 0x1.0b3d3cp-7 F +REG epsg:3020 3 OK 0x1.cd7a12075677cp19 0x1.0eb8a5b86c2c8p19 0x1.10cb7c8f58p8 0x1.11dd695e75769p3 0x1.3ffffff4690d7p2 0x1.060d08p-7 F +REG epsg:3020 4 OK 0x1.f5d11cd5a2cap20 0x1.0eb9482ccf137p19 0x1.1aaeb7d5fcp8 0x1.28eeb4ae028cp4 0x1.3ffffff861aa5p2 0x1.09b26cp-7 F +REG epsg:30200 0 OK 0x1.a385ae1e3349ap18 0x1.3b62ae26fd9b8p18 0x1.4f7b149f4p5 -0x1.eaaaaaaaaaaadp5 0x1.4e22222222223p3 0x1.0p-30 F +REG epsg:30200 1 OK -0x1.2173ad673f208p21 -0x1.26afff6c4bbc9p21 0x1.555cadd3fp6 -0x1.09ab8c8a7bb3ep6 0x1.5c44435f04bd9p2 -0x1.0f6p-19 F +REG epsg:30200 2 OK 0x1.8a55327f78085p21 -0x1.26afff6c3b74ep21 0x1.1b419932bp6 -0x1.c1fe3c40709f7p5 0x1.5c44435f6c1e7p2 -0x1.fdp-21 F +REG epsg:30200 3 OK -0x1.16a5d0355bbf4p21 0x1.7b014fa587105p21 0x1.ab518dcb8p3 -0x1.09ab8d29e1fc5p6 0x1.ee222159ae6c9p3 -0x1.58dp-18 F +REG epsg:30200 4 OK 0x1.7f87539e00636p21 0x1.7b014fa59ddafp21 -0x1.6c7ac808p-1 -0x1.c1fe3b021f0fbp5 0x1.ee22215a1526cp3 0x1.4b8p-19 F +REG epsg:3021 0 OK 0x1.6e4823555869p20 -0x1.0a164b0bb25ccp9 0x1.4a3067a704p8 0x1.f9dd695c19ep3 -0x1.395893ab88c28p-29 0x1.0c1a52p-7 T +REG epsg:3021 1 OK 0x1.cd7d74a4c9508p19 -0x1.0f3de43a3b7a4p19 0x1.7afa7200dp8 0x1.59dd695c54e5ap3 -0x1.3ffffffe1e469p2 0x1.0c3b0ep-7 F +REG epsg:3021 2 OK 0x1.f5d1a0f0dadb2p20 -0x1.0f3e252d990e6p19 0x1.87aab6ff6p8 0x1.4ceeb4aceb1f4p4 -0x1.3ffffffa11c2bp2 0x1.0ac5d8p-7 F +REG epsg:3021 3 OK 0x1.cd7c255b95b46p19 0x1.0eb8b15248e88p19 0x1.11ed6aa6dp8 0x1.59dd695e5459cp3 0x1.3ffffff54a75ap2 0x1.06fee6p-7 F +REG epsg:3021 4 OK 0x1.f5d21f681c988p20 0x1.0eb9445748c56p19 0x1.1e9e243358p8 0x1.4ceeb4adef774p4 0x1.3ffffff94a5a8p2 0x1.0a4f9cp-7 F +REG epsg:3022 0 OK 0x1.6e4923c34dc67p20 -0x1.09f80dfed6a96p9 0x1.4d5fb750b8p8 0x1.20eeb4adf9e9dp4 -0x1.86995a9b1d625p-30 0x1.0c4658p-7 T +REG epsg:3022 1 OK 0x1.cd7f769239ac2p19 -0x1.0f3dcbf881d57p19 0x1.7cbf361634p8 0x1.a1dd695c2ec46p3 -0x1.3ffffffd361a3p2 0x1.0c0a42p-7 F +REG epsg:3022 2 OK 0x1.f5d2990eed1eep20 -0x1.0f3e1c6b882ecp19 0x1.8c38189e1cp8 0x1.70eeb4acd7d18p4 -0x1.3ffffff92875fp2 0x1.0a39ecp-7 F +REG epsg:3022 3 OK 0x1.cd7e36de1f98fp19 0x1.0eb8b7aeadbf4p19 0x1.13b2560a24p8 0x1.a1dd695e31b6ap3 0x1.3ffffff62e197p2 0x1.07ded2p-7 F +REG epsg:3022 4 OK 0x1.f5d31f5070156p20 0x1.0eb93b340b7afp19 0x1.232b8b3b4cp8 0x1.70eeb4addc21fp4 0x1.3ffffffa33b94p2 0x1.0ad87p-7 F +REG epsg:3023 0 OK 0x1.6e4a21fe74f36p20 -0x1.09e7d96035dd8p9 0x1.512f7f6394p8 0x1.44eeb4ade6b18p4 -0x1.33cece21ab7ebp-31 0x1.0c5dfep-7 T +REG epsg:3023 1 OK 0x1.cd8175d2d385ep19 -0x1.0f3db570e7cd3p19 0x1.7f264c34d4p8 0x1.e9dd695c08207p3 -0x1.3ffffffc4d0bap2 0x1.0bc538p-7 F +REG epsg:3023 2 OK 0x1.f5d38e18b4dc8p20 -0x1.0f3e156db44e7p19 0x1.9161b07b08p8 0x1.94eeb4acc4c91p4 -0x1.3ffffff83fe57p2 0x1.0999bap-7 F +REG epsg:3023 3 OK 0x1.cd8045bde6164p19 0x1.0eb8b8cb184e3p19 0x1.16198be7ccp8 0x1.e9dd695e0dc59p3 0x1.3ffffff713a24p2 0x1.08ac14p-7 F +REG epsg:3023 4 OK 0x1.f5d41c2994c9ap20 0x1.0eb92cc6b347bp19 0x1.285520d2p8 0x1.94eeb4adc8ab1p4 0x1.3ffffffb1d6b5p2 0x1.0b4cc2p-7 F +REG epsg:3024 0 OK 0x1.6e4b1da26ed59p20 -0x1.09e5b394108d2p9 0x1.559e3ea01p8 0x1.68eeb4add365ap4 0x1.4c1d1390eeaf5p-32 0x1.0c61p-7 T +REG epsg:3024 1 OK 0x1.cd83719cbe4f9p19 -0x1.0f3da0ac5246dp19 0x1.822ec184c4p8 0x1.18eeb4adf09a7p4 -0x1.3ffffffb63796p2 0x1.0b6b9cp-7 F +REG epsg:3024 2 OK 0x1.f5d47fad7457ap20 -0x1.0f3e1036dfdb3p19 0x1.972574d048p8 0x1.b8eeb4acb2239p4 -0x1.3ffffff7586c5p2 0x1.08e598p-7 F +REG epsg:3024 3 OK 0x1.cd82512ae5b73p19 0x1.0eb8b4a718eacp19 0x1.1922195b54p8 0x1.18eeb4aef4606p4 0x1.3ffffff7fab72p2 0x1.096608p-7 F +REG epsg:3024 4 OK 0x1.f5d5158fb79a7p20 0x1.0eb91914f2f4bp19 0x1.2e18db3244p8 0x1.b8eeb4adb530cp4 0x1.3ffffffc0713p2 0x1.0bac7p-7 F +REG epsg:3025 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.69dd695bb473bp3 0x0.0p0 0x0.0p0 T +REG epsg:3025 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.93bad2b93bc34p2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3025 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.04eeb4ad6582ep4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3025 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.93bad2b93bc34p2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3025 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.04eeb4ad6582ep4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3026 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.b1dd695bb473bp3 0x0.0p0 0x0.0p0 T +REG epsg:3026 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.11dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3026 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.28eeb4ad6582ep4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3026 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.11dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3026 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.28eeb4ad6582ep4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3027 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.f9dd695bb473bp3 0x0.0p0 0x0.0p0 T +REG epsg:3027 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3027 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3027 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3027 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3028 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.20eeb4adda39dp4 0x0.0p0 0x0.0p0 T +REG epsg:3028 1 OK 0x1.cd5cfb40da732p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.a1dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3028 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.70eeb4ad6582dp4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3028 3 OK 0x1.cd5cfb40da732p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.a1dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3028 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.70eeb4ad6582dp4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3029 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.44eeb4adda39dp4 0x0.0p0 0x0.0p0 T +REG epsg:3029 1 OK 0x1.cd5cfb40da734p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.e9dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3029 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.94eeb4ad6582dp4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3029 3 OK 0x1.cd5cfb40da734p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.e9dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3029 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.94eeb4ad6582dp4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3030 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.68eeb4adda39dp4 0x0.0p0 0x0.0p0 T +REG epsg:3030 1 OK 0x1.cd5cfb40da734p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.18eeb4ae4ef0dp4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3030 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.b8eeb4ad6582dp4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3030 3 OK 0x1.cd5cfb40da734p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.18eeb4ae4ef0dp4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3030 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.b8eeb4ad6582dp4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3031 0 OK 0x0.0p0 0x1.f91d3b4848819p19 0x0.0p0 0x0.0p0 -0x1.41fffffffffe5p6 0x0.0p0 T +REG epsg:3031 1 OK -0x1.6f92113756933p16 0x1.a86f16c31e39p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3031 2 OK 0x1.6f92113756933p16 0x1.a86f16c31e39p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3031 3 OK -0x1.1d9be4ac03975p21 0x1.49caf617b9fe8p20 0x0.0p0 -0x1.dfffffffffffep5 -0x1.05fffffffffeep6 0x0.0p0 T +REG epsg:3031 4 OK 0x1.1d9be4ac03975p21 0x1.49caf617b9fe8p20 0x0.0p0 0x1.dfffffffffffep5 -0x1.05fffffffffeep6 0x0.0p0 T +REG epsg:3032 0 OK 0x1.6e36p22 0x1.ad59a76909103p22 0x0.0p0 0x1.18p6 -0x1.41fffffffffe5p6 0x0.0p0 T +REG epsg:3032 1 OK 0x1.6877b7bb22a5bp22 0x1.7186de2d863c7p22 0x0.0p0 0x1.3ffffffffffc7p3 -0x1.64p6 0x0.0p0 T +REG epsg:3032 2 OK 0x1.73f44844dd5a5p22 0x1.7186de2d863c7p22 0x0.0p0 0x1.0400000000004p7 -0x1.64p6 0x0.0p0 T +REG epsg:3032 3 OK 0x1.bed01b53fc68bp21 0x1.c0a8bd85ee7fap22 0x0.0p0 0x1.4000000000008p3 -0x1.05fffffffffeep6 0x0.0p0 T +REG epsg:3032 4 OK 0x1.fd03f25601cbbp22 0x1.c0a8bd85ee7f9p22 0x0.0p0 0x1.04p7 -0x1.05fffffffffeep6 0x0.0p0 T +REG epsg:3033 0 OK 0x1.6e36p22 0x1.186481ad55a8fp22 0x0.0p0 0x1.18p6 -0x1.f1fffffffff9bp5 0x0.0p0 F +REG epsg:3033 1 OK 0x1.3fd28b7f65238p22 0x1.4ace910255eb9p21 0x0.0p0 0x1.2e46ad17b5935p5 -0x1.35p6 0x0.0p0 F +REG epsg:3033 2 OK 0x1.9c9974809adc8p22 0x1.4ace910255eb9p21 0x0.0p0 0x1.98dca97425365p6 -0x1.35p6 0x0.0p0 F +REG epsg:3033 3 OK 0x1.ac19b810b314cp21 0x1.588162ad68d1p22 0x0.0p0 0x1.2e46ad17b5935p5 -0x1.79ffffffff64dp5 0x0.0p0 F +REG epsg:3033 4 OK 0x1.032f91fbd33adp23 0x1.588162ad68d1p22 0x0.0p0 0x1.98dca97425365p6 -0x1.79ffffffff64dp5 0x0.0p0 F +REG epsg:30339 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:30339 1 OK -0x1.ad8003e0da35p15 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:30339 2 OK 0x1.0190001f06d2dp20 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:30339 3 OK -0x1.ad8003e0da35p15 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:30339 4 OK 0x1.0190001f06d2dp20 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:3034 0 OK 0x1.e848p21 0x1.3b91a4f6d5e36p21 0x0.0p0 0x1.4p3 0x1.8fffffffff9cbp5 0x0.0p0 F +REG epsg:3034 1 OK 0x1.d1131ac886607p20 0x1.3acb00a95c2fep20 0x0.0p0 -0x1.aabf5806334p3 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:3034 2 OK 0x1.7403394dde67ep22 0x1.3acb00a95c2fep20 0x0.0p0 0x1.0aafd6018cdp5 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:3034 3 OK 0x1.641e7265a5b0ap21 0x1.0bcff6536c9adp22 0x0.0p0 -0x1.aabf5806333f9p3 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:3034 4 OK 0x1.3638c6cd2d27bp22 0x1.0bcff6536c9adp22 0x0.0p0 0x1.0aafd6018ccfep5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:30340 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:30340 1 OK -0x1.ad8003e0da54p15 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:30340 2 OK 0x1.0190001f06d1ap20 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:30340 3 OK -0x1.ad8003e0da54p15 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:30340 4 OK 0x1.0190001f06d1ap20 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:3035 0 OK 0x1.07bbap22 0x1.87d88p21 0x0.0p0 0x1.4p3 0x1.ap5 0x0.0p0 F +REG epsg:3035 1 OK 0x1.c42c77ba5a209p21 0x1.481c3cc432a15p21 0x0.0p0 0x1.e0ef7421c3dccp0 0x1.7800000049096p5 0x0.0p0 F +REG epsg:3035 2 OK 0x1.2d610422d2efcp22 0x1.481c3cc432a15p21 0x0.0p0 0x1.21f108bde3c25p4 0x1.7800000049096p5 0x0.0p0 F +REG epsg:3035 3 OK 0x1.d34e2eee16ef2p21 0x1.cf2d17f906ecep21 0x0.0p0 0x1.e0ef7421c3dbep0 0x1.c800000006232p5 0x0.0p0 F +REG epsg:3035 4 OK 0x1.25d02888f4887p22 0x1.cf2d17f906ecep21 0x0.0p0 0x1.21f108bde3c24p4 0x1.c800000006232p5 0x0.0p0 F +REG epsg:3036 0 OK 0x1.e847ffffffff5p18 0x1.b997b10295082p22 0x0.0p0 0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:3036 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.b7bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3036 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3036 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3036 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3037 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:3037 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3037 2 OK 0x1.f8272811ecb88p19 0x1.97014c751fc1p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3037 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3037 4 OK 0x1.07218271ec198p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3038 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:3038 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p5 -0x1.4p2 0x0.0p0 F +REG epsg:3038 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:3038 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p5 0x1.4p2 0x0.0p0 F +REG epsg:3038 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6000000000001p4 0x1.4p2 0x0.0p0 F +REG epsg:3039 0 OK 0x1.e847fffffffeep18 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:3039 1 OK -0x1.ad750e9eb002p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:3039 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:3039 3 OK -0x1.ad750e9eb002p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:3039 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:3040 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3040 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:3040 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:3040 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:3040 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:3041 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3041 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:3041 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG epsg:3041 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:3041 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG epsg:3042 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:3042 1 OK -0x1.ad750e9eb001p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG epsg:3042 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.4p2 0x0.0p0 F +REG epsg:3042 3 OK -0x1.ad750e9eb001p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG epsg:3042 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 0x1.4p2 0x0.0p0 F +REG epsg:3043 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:3043 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep0 -0x1.4p2 0x0.0p0 F +REG epsg:3043 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG epsg:3043 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep0 0x1.4p2 0x0.0p0 F +REG epsg:3043 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG epsg:3044 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3044 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:3044 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:3044 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:3044 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:3045 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3045 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:3045 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:3045 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:3045 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:3046 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:3046 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:3046 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:3046 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:3046 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:3047 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:3047 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 -0x1.4p2 0x0.0p0 F +REG epsg:3047 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 -0x1.4p2 0x0.0p0 F +REG epsg:3047 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 0x1.4p2 0x0.0p0 F +REG epsg:3047 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 0x1.4p2 0x0.0p0 F +REG epsg:3048 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:3048 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:3048 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 -0x1.4p2 0x0.0p0 F +REG epsg:3048 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 0x1.4p2 0x0.0p0 F +REG epsg:3048 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 0x1.4p2 0x0.0p0 F +REG epsg:3049 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:3049 1 OK -0x1.ad750e9eafecp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 -0x1.4p2 0x0.0p0 F +REG epsg:3049 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 -0x1.4p2 0x0.0p0 F +REG epsg:3049 3 OK -0x1.ad750e9eafecp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 0x1.4p2 0x0.0p0 F +REG epsg:3049 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 0x1.4p2 0x0.0p0 F +REG epsg:30491 0 OK 0x1.e884ccad7b76dp18 0x1.2510ab46c5054p18 -0x1.c5d598dc4p5 0x1.5999999999999p1 0x1.1ffffffffffdp5 0x1.8p-29 F +REG epsg:30491 1 OK -0x1.65c6de5e8757p16 -0x1.cd4fb16f35a94p17 -0x1.5c1459402p6 -0x1.bd7bc705e2daap1 0x1.effffffffff5fp4 0x0.0p0 F +REG epsg:30491 2 OK 0x1.0a9ecfa9e4a46p20 -0x1.cd4dd31d5ac84p17 -0x1.50f442214p5 0x1.1c2bbe8e45838p3 0x1.effffffffff66p4 0x0.0p0 F +REG epsg:30491 3 OK -0x1.4b9ace68965ap14 0x1.a9de6dbb8b437p19 -0x1.0d30d8b39p6 -0x1.bd7bc705e2dacp1 0x1.47fffffffffe7p5 0x1.0p-30 F +REG epsg:30491 4 OK 0x1.f2e1ab90ae726p19 0x1.a9ddf894f0afbp19 -0x1.bc3ba0c08p4 0x1.1c2bbe8e45837p3 0x1.47fffffffffe4p5 0x1.8p-29 F +REG epsg:30492 0 OK 0x1.e884ccb114659p18 0x1.250d09ea8814bp18 -0x1.e862c8756p5 0x1.599999999999ap1 0x1.0a66666666628p5 0x1.0p-29 F +REG epsg:30492 1 OK -0x1.58836a97a1a68p16 -0x1.d09643da0577p17 -0x1.66fa1e097p6 -0x1.a4206e6b37c1ep1 0x1.c4ccccccccc0fp4 -0x1.0p-30 F +REG epsg:30492 2 OK 0x1.09ca98dae5c91p20 -0x1.d09465c04536cp17 -0x1.68c35436ap5 0x1.15d4e8679abd4p3 0x1.c4ccccccccc15p4 -0x1.0p-29 F +REG epsg:30492 3 OK -0x1.804b55e1a392p14 0x1.a9029df9e666bp19 -0x1.233cfc3cdp6 -0x1.a4206e6b37c1ep1 0x1.3266666666643p5 0x1.0p-30 F +REG epsg:30492 4 OK 0x1.f4872ef8d740dp19 0x1.a90228a6f5c91p19 -0x1.081cdfc48p5 0x1.15d4e8679abd6p3 0x1.3266666666643p5 0x0.0p0 F +REG epsg:30493 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.599999999999ap1 0x1.1ffffffffffd2p5 0x0.0p0 F +REG epsg:30493 1 OK -0x1.66c781502ecf8p16 -0x1.cd71a2eb56f78p17 0x0.0p0 -0x1.bd7bc705e2da9p1 0x1.effffffffff68p4 0x0.0p0 F +REG epsg:30493 2 OK 0x1.0a90781502edp20 -0x1.cd71a2eb56f78p17 0x0.0p0 0x1.1c2bbe8e45838p3 0x1.effffffffff68p4 0x0.0p0 F +REG epsg:30493 3 OK -0x1.4faafbbbba66p14 0x1.a9cf509bf47efp19 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.47fffffffffe8p5 0x0.0p0 F +REG epsg:30493 4 OK 0x1.f2c557ddddd33p19 0x1.a9cf509bf47efp19 0x0.0p0 0x1.1c2bbe8e45838p3 0x1.47fffffffffe8p5 0x0.0p0 F +REG epsg:30494 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.599999999999ap1 0x1.0a66666666628p5 0x0.0p0 F +REG epsg:30494 1 OK -0x1.5982463318118p16 -0x1.d0aee0b7fb184p17 0x0.0p0 -0x1.a4206e6b37c1fp1 0x1.c4ccccccccc11p4 0x0.0p0 F +REG epsg:30494 2 OK 0x1.09bc246331811p20 -0x1.d0aee0b7fb184p17 0x0.0p0 0x1.15d4e8679abd4p3 0x1.c4ccccccccc11p4 0x0.0p0 F +REG epsg:30494 3 OK -0x1.8455188cc5bep14 0x1.a8f4be0f88419p19 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.3266666666645p5 0x0.0p0 F +REG epsg:30494 4 OK 0x1.f46aa8c4662dep19 0x1.a8f4be0f88419p19 0x0.0p0 0x1.15d4e8679abd5p3 0x1.3266666666645p5 0x0.0p0 F +REG epsg:3050 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:3050 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 -0x1.4p2 0x0.0p0 F +REG epsg:3050 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 -0x1.4p2 0x0.0p0 F +REG epsg:3050 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 0x1.4p2 0x0.0p0 F +REG epsg:3050 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:3051 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:3051 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:3051 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:3051 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:3051 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:3054 0 OK 0x1.e845d11aeedc3p18 0x1.4be035f48b654p6 -0x1.493ca19ef8p7 -0x1.bp4 0x0.0p0 -0x1.0p-30 T +REG epsg:3054 1 OK -0x1.ada464328e48p15 -0x1.0edaca7afdb05p19 -0x1.561de4af78p7 -0x1.ffffffffffffep4 -0x1.4p2 -0x1.8p-29 F +REG epsg:3054 2 OK 0x1.01900bad2416ap20 -0x1.0edaca7aef6dbp19 -0x1.5926952d28p7 -0x1.6p4 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3054 3 OK -0x1.ada1dc57524ep15 0x1.0eef8851b0b0fp19 -0x1.392e3e00f8p7 -0x1.0p5 0x1.4p2 -0x1.0p-29 F +REG epsg:3054 4 OK 0x1.018ff76e73c2cp20 0x1.0eef8851a26c1p19 -0x1.3c36ee0a7p7 -0x1.5ffffffffffffp4 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3055 0 OK 0x1.e84392825b1e6p18 0x1.4be03ab6fb391p6 -0x1.4c0270cfcp7 -0x1.5p4 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:3055 1 OK -0x1.adb696b0d615p15 -0x1.0edace5fe5199p19 -0x1.574f0e99dp7 -0x1.a000000000001p4 -0x1.3fffffffffffdp2 -0x1.0p-30 F +REG epsg:3055 2 OK 0x1.018f7df2d7078p20 -0x1.0edace5fc82dfp19 -0x1.5d764172a8p7 -0x1.0p4 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3055 3 OK -0x1.adb40ed2d2f3p15 0x1.0eef8c36e3a8dp19 -0x1.3a5f67bdbp7 -0x1.a000000000001p4 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:3055 4 OK 0x1.018f69b43b312p20 0x1.0eef8c36c6b89p19 -0x1.408699aacp7 -0x1.0000000000001p4 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3056 0 OK 0x1.e8416054daf8cp18 0x1.4be042abd7724p6 -0x1.50a5073b4p7 -0x1.dfffffffffffep3 -0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG epsg:3056 1 OK -0x1.adc88f36bedfp15 -0x1.0edad4e2661f8p19 -0x1.5a6201b288p7 -0x1.4000000000001p4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3056 2 OK 0x1.018ef49e5bc26p20 -0x1.0edad4e23adc2p19 -0x1.639674f96p7 -0x1.3ffffffffffffp3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3056 3 OK -0x1.adc60755f0b8p15 0x1.0eef92b9e2fc9p19 -0x1.3d725a60ap7 -0x1.4000000000001p4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3056 4 OK 0x1.018ee05fd35e5p20 0x1.0eef92b9b7b2cp19 -0x1.46a6cc46b8p7 -0x1.3fffffffffffep3 0x1.4p2 0x1.0p-29 F +REG epsg:3057 0 OK 0x1.e848p18 0x1.e848p18 0x0.0p0 -0x1.3p4 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:3057 1 OK 0x1.3bb38735293bbp18 0x1.49d1faaeb94b6p18 0x0.0p0 -0x1.68c9f1497133ap4 0x1.fbfffffffffbbp5 0x0.0p0 F +REG epsg:3057 2 OK 0x1.4a6e3c656b624p19 0x1.49d1faaeb94b6p18 0x0.0p0 -0x1.ee6c1d6d1d98cp3 0x1.fbfffffffffbbp5 0x0.0p0 F +REG epsg:3057 3 OK 0x1.4e07f9e735b72p18 0x1.47f9f86563ee9p19 0x0.0p0 -0x1.68c9f1497133ap4 0x1.09ffffffffff2p6 0x0.0p0 F +REG epsg:3057 4 OK 0x1.4144030c65248p19 0x1.47f9f86563ee9p19 0x0.0p0 -0x1.ee6c1d6d1d98cp3 0x1.09ffffffffff2p6 0x0.0p0 F +REG epsg:3058 0 OK 0x1.86038317a53b4p15 -0x1.dc192cfcfcf59p22 -0x1.3807d7e49p10 -0x1.0fffff092cc6ep3 0x1.461fe4891a3dep-22 0x1.92553acp-3 T +REG epsg:3058 1 OK -0x1.ed8f1e463f0f8p18 -0x1.fdfa15a858a8dp22 -0x1.32cd945a34p10 -0x1.affffeb6127d4p3 -0x1.3ffffe5a90cd3p2 0x1.6f2c2dep-3 F +REG epsg:3058 2 OK 0x1.2780622b1d8dfp19 -0x1.fdfb2d77d93e4p22 -0x1.50d549fbdap10 -0x1.bffffc6233b7bp1 -0x1.3ffffee1c0814p2 0x1.98df6f8p-3 F +REG epsg:3058 3 OK -0x1.ed7ddc52165bp18 -0x1.ba37521b533bcp22 -0x1.1b7dbe9101p10 -0x1.affffefed9324p3 0x1.40000170a4515p2 0x1.8c731eep-3 F +REG epsg:3058 4 OK 0x1.2786f91ea5f69p19 -0x1.ba381f034653p22 -0x1.398a0f56ccp10 -0x1.bffffd98ed071p1 0x1.400000cb7ab26p2 0x1.ab0485ep-3 F +REG epsg:3059 0 OK 0x1.e848p18 -0x1.6e36p22 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3059 1 OK -0x1.ad750e7d869bp15 -0x1.90126b6e7ebcep22 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3059 2 OK 0x1.018fa873ec34ep20 -0x1.90126b6e7ebcep22 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3059 3 OK -0x1.ad750e7d869bp15 -0x1.4c59949181432p22 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3059 4 OK 0x1.018fa873ec34ep20 -0x1.4c59949181432p22 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3060 0 OK 0x1.e7f3198f7bacap18 0x1.b9926832f383bp22 -0x1.3ddc77e92p5 0x1.4ap7 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:3060 1 OK -0x1.009be52d05b2p15 0x1.96fbf61fb1157p22 0x1.c50cf305p3 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:3060 2 OK 0x1.f7fcd796850acp19 0x1.96fbf620e1f9ep22 -0x1.534b38054p5 0x1.5508a5c0c2b97p7 -0x1.e000000000003p4 0x1.0p-30 F +REG epsg:3060 3 OK -0x1.3131b72028a18p16 0x1.dac564b452ba2p22 -0x1.1f3132c66p5 0x1.3ef75a3f3d469p7 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:3060 4 OK 0x1.070ca7e9c8c9cp20 0x1.dac564b5747c4p22 -0x1.851ff62f6p6 0x1.5508a5c0c2b98p7 -0x1.3fffffffffffcp4 0x1.0p-29 F +REG epsg:3061 0 OK 0x1.e8a43ff778562p18 -0x1.38972a42e4de9p8 0x1.5568833e18p7 -0x1.dffffffffffffp3 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:3061 1 OK -0x1.aa70ad900762p15 -0x1.0f088e06f83d4p19 0x1.46cbb7993p7 -0x1.3ffffffffffffp4 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3061 2 OK 0x1.01a5a5a99b1f2p20 -0x1.0f088e0957ab5p19 0x1.c6fe60eb4p7 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3061 3 OK -0x1.aa7a347da405p15 0x1.0eba68e2969b6p19 0x1.b38d969bp6 -0x1.3fffffffffffep4 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:3061 4 OK 0x1.01a5f1faddcb2p20 0x1.0eba68e4f4b3fp19 0x1.59f9bce6b8p7 -0x1.3ffffffffffffp3 0x1.3fffffffffffcp2 0x0.0p0 F +REG epsg:3062 0 OK 0x1.e84000a5ecf0bp18 -0x1.b9a1b266a313fp5 -0x1.42d4df8dp2 -0x1.bp4 -0x1.2f74bf1dcfcaep-64 0x0.0p0 T +REG epsg:3062 1 OK -0x1.adb51a2b6a6ep15 -0x1.0eea4f99b7c1dp19 0x1.5ef5655p0 -0x1.0p5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:3062 2 OK 0x1.018da91dc8f16p20 -0x1.0eea4f998353ap19 -0x1.0be844dp2 -0x1.6000000000001p4 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3062 3 OK -0x1.adb6c938bbffp15 0x1.0edc82a9affd4p19 -0x1.082d01228p3 -0x1.0p5 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:3062 4 OK 0x1.018db695ce3b1p20 0x1.0edc82a97b941p19 -0x1.b9ffe1eap3 -0x1.6000000000002p4 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3063 0 OK 0x1.e82f01fe31714p18 0x1.2f06cfcafb719p5 -0x1.434a32fd3p6 -0x1.afffffffffffep4 0x1.2f74bf1dcfcadp-64 0x1.0p-29 T +REG epsg:3063 1 OK -0x1.ae4ba2d3732bp15 -0x1.0edf81f03f378p19 -0x1.302c2f885p6 -0x1.0p5 -0x1.4000000000001p2 -0x1.0p-28 F +REG epsg:3063 2 OK 0x1.0189de0050b1ap20 -0x1.0edf81ef9bab6p19 -0x1.75a2a4f8ep6 -0x1.5ffffffffffffp4 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:3063 3 OK -0x1.ae4a7b03f8ebp15 0x1.0ee8fa1268fe2p19 -0x1.15c07903ap6 -0x1.0p5 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:3063 4 OK 0x1.0189d4c2ae00fp20 0x1.0ee8fa11c566fp19 -0x1.5b36e9b54p6 -0x1.6000000000002p4 0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:3064 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3064 1 OK -0x1.ad750e9eace1p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000002p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3064 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3064 3 OK -0x1.ad750e9eace1p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000002p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3064 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3065 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3065 1 OK -0x1.ad750e9eacd3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3065 2 OK 0x1.018fa874f5679p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3065 3 OK -0x1.ad750e9eacd3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3065 4 OK 0x1.018fa874f5679p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3066 0 OK 0x1.e84e79d60a2d3p18 -0x1.6e32382cc4f87p21 -0x1.ea2894d4bp6 0x1.28p5 -0x1.d8ab18afaf697p-51 -0x1.0p-29 T +REG epsg:3066 1 OK -0x1.ae36792c7cbfp15 -0x1.b1eedd05c210ap21 -0x1.0f3cf3218p7 0x1.000000003afcap5 -0x1.3fffffffeabe3p2 -0x1.0p-30 F +REG epsg:3066 2 OK 0x1.0198f0ba2eaep20 -0x1.b1eedd05cca4ep21 -0x1.063d88c528p7 0x1.4fffffffc4fbp5 -0x1.3fffffffeabaap2 -0x1.0p-30 F +REG epsg:3066 3 OK -0x1.ae32c898cca8p15 -0x1.2a7593640a1f2p21 -0x1.ca1bd1e62p6 0x1.000000003afb4p5 0x1.3fffffffeabbcp2 0x0.0p0 F +REG epsg:3066 4 OK 0x1.0198d334dd848p20 -0x1.2a759363ff888p21 -0x1.b81d011a7p6 0x1.4fffffffc4fc7p5 0x1.3fffffffeab87p2 0x1.0p-30 F +REG epsg:3067 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:3067 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 -0x1.4p2 0x0.0p0 F +REG epsg:3067 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 -0x1.4p2 0x0.0p0 F +REG epsg:3067 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 0x1.4p2 0x0.0p0 F +REG epsg:3067 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 0x1.4p2 0x0.0p0 F +REG epsg:3068 0 OK 0x1.397173594ec2dp15 0x1.3d585033260eep13 -0x1.481d6ebf2p5 0x1.b4120d6c865fap3 0x1.a35964442090fp5 0x1.b263p-12 F +REG epsg:3068 1 OK -0x1.19eb9ec692729p19 -0x1.f545121d72932p18 -0x1.b299b9aacp5 0x1.5b729201de18ep2 0x1.7b5968a72e8a9p5 0x1.e1db4p-12 F +REG epsg:3068 2 OK 0x1.411ad5154d2a6p19 -0x1.f5428d7aa62e9p18 -0x1.47ab166f8p5 0x1.5d3569227a854p4 0x1.7b5968a955c83p5 0x1.3a9p-12 F +REG epsg:3068 3 OK -0x1.b8bb2328ad00cp18 0x1.2341b7d713a28p19 -0x1.ab6cf672cp4 0x1.5b730c2de72bcp2 0x1.cb596ad850c32p5 0x1.21514p-12 F +REG epsg:3068 4 OK 0x1.038a5ac41d2acp19 0x1.2342e3f554f52p19 -0x1.013c18b4cp4 0x1.5d354a8e57841p4 0x1.cb596adc89909p5 0x1.8afdp-13 F +REG epsg:3069 0 OK 0x1.e848p18 -0x1.12a88p22 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:3069 1 OK -0x1.ad818d425ccdp15 -0x1.34845ee5769bep22 0x0.0p0 -0x1.7bffffffe22fap6 -0x1.3fffffffea7bcp2 0x0.0p0 F +REG epsg:3069 2 OK 0x1.01900c6a12e6p20 -0x1.34845ee5769bep22 0x0.0p0 -0x1.540000001dd07p6 -0x1.3fffffffea7bcp2 0x0.0p0 F +REG epsg:3069 3 OK -0x1.ad818d425ccdp15 -0x1.e199423512c84p21 0x0.0p0 -0x1.7bffffffe22fap6 0x1.3fffffffea7bcp2 0x0.0p0 F +REG epsg:3069 4 OK 0x1.01900c6a12e6p20 -0x1.e199423512c84p21 0x0.0p0 -0x1.540000001dd07p6 0x1.3fffffffea7bcp2 0x0.0p0 F +REG epsg:3070 0 OK 0x1.fbdp18 -0x1.117p22 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:3070 1 OK -0x1.11350e7d86a1p15 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3070 2 OK 0x1.0671a873ec34ap20 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3070 3 OK -0x1.11350e7d86a1p15 -0x1.df27292302865p21 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3070 4 OK 0x1.0671a873ec34ap20 -0x1.df27292302865p21 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3071 0 OK 0x1.fbdp18 -0x1.117p22 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:3071 1 OK -0x1.11350e7d86a1p15 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3071 2 OK 0x1.0671a873ec34ap20 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3071 3 OK -0x1.11350e7d86a1p15 -0x1.df27292302865p21 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3071 4 OK 0x1.0671a873ec34ap20 -0x1.df27292302865p21 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3072 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:3072 1 OK 0x1.7e3b0ade7c6b8p16 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.2b39bac64b449p6 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:3072 2 OK 0x1.3de84f5218394p20 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.e78c8a736976fp5 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:3072 3 OK 0x1.75a4e0362c05cp17 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.2b39bac587a75p6 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:3072 4 OK 0x1.271763f93a7f4p20 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.e78c8a74f0b16p5 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:30729 0 OK 0x1.e8615fab8d011p18 -0x1.2a3c58f745116p8 0x1.68c84cb47p6 -0x1.1ffffffea8c47p3 0x1.d1c15b66d10acp-32 0x1.dd4ebp-10 T +REG epsg:30729 1 OK -0x1.ac92b062b68dp15 -0x1.0f07f5e445addp19 0x1.d0d4006dbp6 -0x1.bffffffdd55ecp3 -0x1.3fffffff5719p2 0x1.ca024p-10 F +REG epsg:30729 2 OK 0x1.019573fdf6bd3p20 -0x1.0f079074a50fdp19 0x1.11e810e218p7 -0x1.fffffffd1aa9p1 -0x1.3fffffffc1dfbp2 0x1.e57ddp-10 F +REG epsg:30729 3 OK -0x1.aca4d25913e2p15 0x1.0ebd0afb9177ep19 0x1.6e5ba07e8p5 -0x1.bffffffe146b3p3 0x1.40000000bb2b9p2 0x1.d09d1p-10 F +REG epsg:30729 4 OK 0x1.0195a7f7ba88cp20 0x1.0ebd5ee97168dp19 0x1.0a2db067bp6 -0x1.fffffffe1de11p1 0x1.4000000026b7cp2 0x1.e75dbp-10 F +REG epsg:3073 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.148p6 0x1.58p5 0x0.0p0 F +REG epsg:3073 1 OK -0x1.89ccd65c37aep16 -0x1.044b5fd699029p19 0x0.0p0 -0x1.2fd8b7731de0bp6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:3073 2 OK 0x1.0cc0cd65c37b2p20 -0x1.044b5fd699028p19 0x0.0p0 -0x1.f24e9119c43e8p5 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:3073 3 OK -0x1.3a04f0a91f9ep13 0x1.1a67361ef3739p19 0x0.0p0 -0x1.2fd8b7727134ep6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:3073 4 OK 0x1.ed3013c2a47fp19 0x1.1a67361ef373ap19 0x0.0p0 -0x1.f24e911b1d961p5 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:30730 0 OK 0x1.e85c2ad22af94p18 -0x1.2912db12bedb3p8 0x1.96828d64dp6 -0x1.7ffffffe377f2p1 0x1.30be705749ef9p-33 0x1.e7836p-10 T +REG epsg:30730 1 OK -0x1.acbc4f775b59p15 -0x1.0f07917d5873ap19 0x1.02b819e8a8p7 -0x1.fffffffd5c031p2 -0x1.3fffffff94086p2 0x1.ddc7p-10 F +REG epsg:30730 2 OK 0x1.01940746ce234p20 -0x1.0f076a40a7957p19 0x1.24fa879b68p7 0x1.fffffffe7b55ep0 -0x1.400000000e1d1p2 0x1.e8853p-10 F +REG epsg:30730 3 OK -0x1.acca8981940cp15 0x1.0ebd2f273c50fp19 0x1.d7997aa4ap5 -0x1.fffffffddcafbp2 0x1.400000005fc68p2 0x1.e18f2p-10 F +REG epsg:30730 4 OK 0x1.01945a7eb7275p20 0x1.0ebd44e19c0b2p19 0x1.3052f0666p6 0x1.fffffffc74043p0 0x1.3fffffffd7d67p2 0x1.e7854p-10 F +REG epsg:30731 0 OK 0x1.e856b0d4e5907p18 -0x1.29168e29fc11bp8 0x1.bb46c08dap6 0x1.7ffffffe20214p1 -0x1.45633a92c7638p-33 0x1.e761dp-10 T +REG epsg:30731 1 OK -0x1.ace87ddf73cap15 -0x1.0f0758dd09097p19 0x1.18c44a6618p7 -0x1.fffffffca2de4p0 -0x1.3fffffffda50dp2 0x1.e7a5ep-10 F +REG epsg:30731 2 OK 0x1.01928c4d34fbep20 -0x1.0f077028b2699p19 0x1.336b003038p7 0x1.fffffffdd15f5p2 -0x1.4000000062978p2 0x1.e1424p-10 F +REG epsg:30731 3 OK -0x1.acf2cab26201p15 0x1.0ebd3422b9a72p19 0x1.17e66841ap6 -0x1.fffffffeaa3c7p0 0x1.400000000b7e4p2 0x1.e890bp-10 F +REG epsg:30731 4 OK 0x1.0192feeea7a3fp20 0x1.0ebd0b5429ffdp19 0x1.4d32c09edp6 0x1.fffffffd50bfp2 0x1.3fffffff91c8dp2 0x1.dd64fp-10 F +REG epsg:30732 0 OK 0x1.e851010fb473dp18 -0x1.2a47678741c9bp8 0x1.d6adc9882p6 0x1.1ffffffea32eep3 -0x1.dbfd73c9c0d6ep-32 0x1.dcebbp-10 T +REG epsg:30732 1 OK -0x1.ad16bfb206acp15 -0x1.0f074ca21a1dp19 0x1.2a50bc55p7 0x1.fffffffe06973p1 -0x1.4000000029683p2 0x1.e73c2p-10 F +REG epsg:30732 2 OK 0x1.019107380543cp20 -0x1.0f07a21c285d4p19 0x1.3d10fbeb7p7 0x1.bffffffe0f373p3 -0x1.40000000be257p2 0x1.d0122p-10 F +REG epsg:30732 3 OK -0x1.ad1d2505a659p15 0x1.0ebd19e0194d3p19 0x1.3aff22bd2p6 0x1.fffffffd036b5p1 0x1.3fffffffbf78ep2 0x1.e546dp-10 F +REG epsg:30732 4 OK 0x1.019199164d4a1p20 0x1.0ebcb2e28c337p19 0x1.607c26d21p6 0x1.bffffffdd0357p3 0x1.3fffffff55169p2 0x1.c9629p-10 F +REG epsg:3074 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.198p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3074 1 OK -0x1.258170cf9dfa8p18 -0x1.045c58ea73f2bp19 0x0.0p0 -0x1.34c5ceb6f8417p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3074 2 OK 0x1.b7b8b867cefddp19 -0x1.045c58ea73f2ap19 0x0.0p0 -0x1.fc7462920f7dp5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3074 3 OK -0x1.9ac570c807e5ap17 0x1.1a5791ee1ae34p19 0x0.0p0 -0x1.34c5ceb64fe08p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3074 4 OK 0x1.8ba95c3201f9ep19 0x1.1a5791ee1ae35p19 0x0.0p0 -0x1.fc746293603efp5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3075 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:3075 1 OK 0x1.7e3b0ade7c6b8p16 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.2b39bac64b449p6 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:3075 2 OK 0x1.3de84f5218394p20 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.e78c8a736976fp5 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:3075 3 OK 0x1.75a4e0362c05cp17 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.2b39bac587a75p6 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:3075 4 OK 0x1.271763f93a7f4p20 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.e78c8a74f0b16p5 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:3076 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.148p6 0x1.58p5 0x0.0p0 F +REG epsg:3076 1 OK -0x1.89ccd65c37aep16 -0x1.044b5fd699029p19 0x0.0p0 -0x1.2fd8b7731de0bp6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:3076 2 OK 0x1.0cc0cd65c37b2p20 -0x1.044b5fd699028p19 0x0.0p0 -0x1.f24e9119c43e8p5 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:3076 3 OK -0x1.3a04f0a91f9ep13 0x1.1a67361ef3739p19 0x0.0p0 -0x1.2fd8b7727134ep6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:3076 4 OK 0x1.ed3013c2a47fp19 0x1.1a67361ef373ap19 0x0.0p0 -0x1.f24e911b1d961p5 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:3077 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.198p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3077 1 OK -0x1.258170cf9dfa8p18 -0x1.045c58ea73f2bp19 0x0.0p0 -0x1.34c5ceb6f8417p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3077 2 OK 0x1.b7b8b867cefddp19 -0x1.045c58ea73f2ap19 0x0.0p0 -0x1.fc7462920f7dp5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3077 3 OK -0x1.9ac570c807e5ap17 0x1.1a5791ee1ae34p19 0x0.0p0 -0x1.34c5ceb64fe08p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3077 4 OK 0x1.8ba95c3201f9ep19 0x1.1a5791ee1ae35p19 0x0.0p0 -0x1.fc746293603efp5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3078 0 OK 0x1.e820102717124p18 0x1.021b09b534a38p19 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c54p5 0x0.0p0 F +REG epsg:3078 1 OK -0x1.9b81a058acb8p16 -0x1.331112c037p11 0x0.0p0 -0x1.747029aea2077p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:3078 2 OK 0x1.0d79243918fb8p20 -0x1.922d16d199p10 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:3078 3 OK -0x1.78e84bb8396p12 0x1.0e768407c4d04p20 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f9268p5 0x0.0p0 F +REG epsg:3078 4 OK 0x1.eb6d7bde8efa8p19 0x1.0ebc1c9adda5p20 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f9267fp5 0x0.0p0 F +REG epsg:3079 0 OK 0x1.e820102717124p18 0x1.021b09b534a38p19 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c54p5 0x0.0p0 F +REG epsg:3079 1 OK -0x1.9b81a058acb8p16 -0x1.331112c037p11 0x0.0p0 -0x1.747029aea2077p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:3079 2 OK 0x1.0d79243918fb8p20 -0x1.922d16d199p10 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:3079 3 OK -0x1.78e84bb8396p12 0x1.0e768407c4d04p20 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f9268p5 0x0.0p0 F +REG epsg:3079 4 OK 0x1.eb6d7bde8efa8p19 0x1.0ebc1c9adda5p20 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f9267fp5 0x0.0p0 F +REG epsg:30791 0 OK 0x1.e87a55919fe88p18 0x1.250b27d582e2bp18 -0x1.7ab9fa42ap5 0x1.59999993b2ce6p1 0x1.1ffffffff5ecp5 0x1.df3cbp-10 F +REG epsg:30791 1 OK -0x1.65f10269e0338p16 -0x1.cd59714ed7c18p17 -0x1.5f435c09cp5 -0x1.bd7bc7074a5aap1 0x1.effffffff5b9ap4 0x1.e7b8ep-10 F +REG epsg:30791 2 OK 0x1.0a9c11cac1f9p20 -0x1.cd5a374e76304p17 -0x1.d8ad389cp4 0x1.1c2bbe8c10ce4p3 0x1.efffffffecfaep4 0x1.d173bp-10 F +REG epsg:30791 3 OK -0x1.4c405b0b920bp14 0x1.a9dbad6525d1dp19 -0x1.008ffed4fp6 -0x1.bd7bc708d83a2p1 0x1.47fffffff81d4p5 0x1.e60d8p-10 F +REG epsg:30791 4 OK 0x1.f2dcafcb444bcp19 0x1.a9db3a90b873fp19 -0x1.9bf1c0674p5 0x1.1c2bbe8bae5f9p3 0x1.47fffffffb027p5 0x1.cf91ep-10 F +REG epsg:30792 0 OK 0x1.e87a2a089e9c3p18 0x1.25079661536afp18 -0x1.4ab0041a6p5 0x1.599999941a217p1 0x1.0a6666665c37dp5 0x1.dff88p-10 F +REG epsg:30792 1 OK -0x1.58ad40d4490fp16 -0x1.d09f7aa0db914p17 -0x1.237a78414p5 -0x1.a4206e6c61aabp1 0x1.c4ccccccc3b6p4 0x1.e7f31p-10 F +REG epsg:30792 2 OK 0x1.09c7c16faaa62p20 -0x1.d0a0318990988p17 -0x1.626450ffcp4 0x1.15d4e86584307p3 0x1.c4ccccccb78b8p4 0x1.d2cb9p-10 F +REG epsg:30792 3 OK -0x1.80f066b70ebap14 0x1.a8ffc6772a69p19 -0x1.d9e82a214p5 -0x1.a4206e6dd63d9p1 0x1.326666665efd4p5 0x1.e66e5p-10 F +REG epsg:30792 4 OK 0x1.f48200ea19b78p19 0x1.a8ff560385d7fp19 -0x1.740da9e72p5 0x1.15d4e86527fc1p3 0x1.326666665fe56p5 0x1.d0837p-10 F +REG epsg:3080 0 OK 0x1.6e35fffffffffp21 0x1.6e35fffffffffp21 0x0.0p0 -0x1.9p6 0x1.f2aaaaaaaaa19p4 0x0.0p0 F +REG epsg:3080 1 OK 0x1.8f130bedc07cp15 0x1.7b5bbb015fd78p18 0x0.0p0 -0x1.b30f7855f93e3p6 0x1.7aaaaaaaaa9c2p4 0x0.0p0 F +REG epsg:3080 2 OK 0x1.6b17d9e8247fp22 0x1.7b5bbb015fd78p18 0x0.0p0 -0x1.6cf087aa06c1dp6 0x1.7aaaaaaaaa9c2p4 0x0.0p0 F +REG epsg:3080 3 OK 0x1.d7e962ba22cfp18 0x1.63edc2a533a34p22 0x0.0p0 -0x1.b30f7855f93e3p6 0x1.3555555555532p5 0x0.0p0 F +REG epsg:3080 4 OK 0x1.50b769d45dd3p22 0x1.63edc2a533a34p22 0x0.0p0 -0x1.6cf087aa06c1dp6 0x1.3555555555532p5 0x0.0p0 F +REG epsg:30800 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.f9dd695bb473bp3 0x0.0p0 0x0.0p0 T +REG epsg:30800 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:30800 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:30800 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:30800 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3081 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.9p6 0x1.f2aaaaaaaaa24p4 0x0.0p0 F +REG epsg:3081 1 OK 0x1.8b407967e4cp16 0x1.8e60bc6000c94p17 0x0.0p0 -0x1.b30f7855f93e3p6 0x1.7aaaaaaaaa9dp4 0x0.0p0 F +REG epsg:3081 2 OK 0x1.cf93f86981b4p20 0x1.8e60bc6000c94p17 0x0.0p0 -0x1.6cf087aa06c1dp6 0x1.7aaaaaaaaa9dp4 0x0.0p0 F +REG epsg:3081 3 OK 0x1.c6e706c00d39cp17 0x1.c6da25337957cp20 0x0.0p0 -0x1.b30f7855f93e3p6 0x1.3555555555535p5 0x0.0p0 F +REG epsg:3081 4 OK 0x1.af6b1f27fe58cp20 0x1.c6da25337957cp20 0x0.0p0 -0x1.6cf087aa06c1dp6 0x1.3555555555535p5 0x0.0p0 F +REG epsg:3082 0 OK 0x1.6e36p20 0x1.6b3f181ccaf38p22 0x0.0p0 -0x1.9p6 0x1.a7fffffffff3dp4 0x0.0p0 F +REG epsg:3082 1 OK -0x1.9da60efa07794p18 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:3082 2 OK 0x1.a1eac1df40efp21 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:3082 3 OK 0x1.4e6b2e2b90abp16 0x1.d7918821cdb8p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:3082 4 OK 0x1.63c2a68ea37a8p21 0x1.d7918821cdb8p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:3083 0 OK 0x1.6e36p20 0x1.a716635e144bap22 0x0.0p0 -0x1.9p6 0x1.a800000000004p4 0x0.0p0 F +REG epsg:3083 1 OK -0x1.925736575ccbp18 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:3083 2 OK 0x1.a080e6caeb993p21 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:3083 3 OK 0x1.47c634c0d12bp16 0x1.097e212fc44c2p23 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:3083 4 OK 0x1.63f7ce59f9768p21 0x1.097e212fc44c2p23 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:3084 0 OK 0x1.6e36p20 0x1.6b3f181ccaf38p22 0x0.0p0 -0x1.9p6 0x1.a7fffffffff3dp4 0x0.0p0 F +REG epsg:3084 1 OK -0x1.9da60efa07794p18 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:3084 2 OK 0x1.a1eac1df40efp21 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:3084 3 OK 0x1.4e6b2e2b90abp16 0x1.d7918821cdb8p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:3084 4 OK 0x1.63c2a68ea37a8p21 0x1.d7918821cdb8p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:3085 0 OK 0x1.6e36p20 0x1.a716635e144bap22 0x0.0p0 -0x1.9p6 0x1.a800000000004p4 0x0.0p0 F +REG epsg:3085 1 OK -0x1.925736575ccbp18 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:3085 2 OK 0x1.a080e6caeb993p21 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:3085 3 OK 0x1.47c634c0d12bp16 0x1.097e212fc44c2p23 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:3085 4 OK 0x1.63f7ce59f9768p21 0x1.097e212fc44c2p23 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:3086 0 OK 0x1.86ap18 0x1.96480dd1d2e11p18 0x0.0p0 -0x1.5p6 0x1.bbffffffffffep4 0x0.0p0 F +REG epsg:3086 1 OK -0x1.de96bdd8a0d5cp18 -0x1.768b3d3936413p18 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:3086 2 OK 0x1.3af5af7628357p20 -0x1.768b3d3936413p18 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:3086 3 OK -0x1.6f31ce783807cp18 0x1.36f299ee9091p20 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3086 4 OK 0x1.1f1c739e0e01fp20 0x1.36f299ee9091p20 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3087 0 OK 0x1.86ap18 0x1.96480dd1d2e11p18 0x0.0p0 -0x1.5p6 0x1.bbffffffffffep4 0x0.0p0 F +REG epsg:3087 1 OK -0x1.de96bdd8a0d5cp18 -0x1.768b3d3936413p18 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:3087 2 OK 0x1.3af5af7628357p20 -0x1.768b3d3936413p18 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:3087 3 OK -0x1.6f31ce783807cp18 0x1.36f299ee9091p20 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3087 4 OK 0x1.1f1c739e0e01fp20 0x1.36f299ee9091p20 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3088 0 OK 0x1.6e36p20 0x1.13c08027f5c87p20 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:3088 1 OK 0x1.2cbd88791104cp20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3088 2 OK 0x1.afae7786eefb4p20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3088 3 OK 0x1.30b9c63bda1abp20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3088 4 OK 0x1.abb239c425e55p20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3089 0 OK 0x1.2c5e880000003p22 0x1.c4591d51ef696p21 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:3089 1 OK 0x1.ed56e9caddbb6p21 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3089 2 OK 0x1.62119b1a9122bp22 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3089 3 OK 0x1.f3e088b4bdff2p21 0x1.16d727df74a24p22 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3089 4 OK 0x1.5ecccba5a100dp22 0x1.16d727df74a24p22 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3090 0 OK 0x1.6e36p20 0x1.13c08027f5c87p20 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:3090 1 OK 0x1.2cbd88791104cp20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3090 2 OK 0x1.afae7786eefb4p20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3090 3 OK 0x1.30b9c63bda1abp20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3090 4 OK 0x1.abb239c425e55p20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3091 0 OK 0x1.2c5e880000003p22 0x1.c4591d51ef696p21 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:3091 1 OK 0x1.ed56e9caddbb6p21 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3091 2 OK 0x1.62119b1a9122bp22 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3091 3 OK 0x1.f3e088b4bdff2p21 0x1.16d727df74a24p22 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3091 4 OK 0x1.5ecccba5a100dp22 0x1.16d727df74a24p22 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3092 0 OK 0x1.e86e5d24b8e65p18 -0x1.541ad442c7eb5p9 0x1.d54dd3fb1p7 0x1.ec00000000001p6 -0x1.2f74bf1dcfcaep-58 -0x1.0p-30 T +REG epsg:3092 1 OK -0x1.ac0ec3d3d697p15 -0x1.0f35d272cb426p19 0x1.1bf8304fap8 0x1.d800000000003p6 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:3092 2 OK 0x1.0197a4c478ab8p20 -0x1.0f35d273c6d9ap19 0x1.36a1567f04p8 0x1.0p7 -0x1.4p2 0x1.0p-30 F +REG epsg:3092 3 OK -0x1.ac23825e170ep15 0x1.0e8bc67aa0bc8p19 0x1.4aaf2b5b78p7 0x1.d800000000003p6 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:3092 4 OK 0x1.01984ad02d4b3p20 0x1.0e8bc67b9b20ep19 0x1.8001b928ap7 0x1.0p7 0x1.4p2 -0x1.0p-29 F +REG epsg:3093 0 OK 0x1.e87b59bc2aeffp18 -0x1.541a920ff42e6p9 0x1.faeff213e8p7 0x1.0200000000001p7 -0x1.2f74bf1dcfcaep-59 0x1.0p-30 T +REG epsg:3093 1 OK -0x1.aba39a8f866cp15 -0x1.0f359d87534a4p19 0x1.2a21674c9p8 0x1.efffffffffffep6 -0x1.4p2 -0x1.8p-29 F +REG epsg:3093 2 OK 0x1.019ac9ccb1d8dp20 -0x1.0f359d88a42c4p19 0x1.4dd0f5989p8 0x1.0cp7 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:3093 3 OK -0x1.abb8588f0fd4p15 0x1.0e8b91afff9c8p19 0x1.6701bc1688p7 0x1.efffffffffffep6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3093 4 OK 0x1.019b6fdbfb408p20 0x1.0e8b91b14ee38p19 0x1.ae613043p7 0x1.0cp7 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3094 0 OK 0x1.e887c6442fd8ap18 -0x1.541a3d1d31878p9 0x1.159d69762p8 0x1.0ep7 0x1.2f74bf1dcfcaep-60 -0x1.0p-30 T +REG epsg:3094 1 OK -0x1.ab3c04fa1dc1p15 -0x1.0f35599ecb6dep19 0x1.3dc6ad82d4p8 0x1.0400000000001p7 -0x1.4p2 0x0.0p0 F +REG epsg:3094 2 OK 0x1.019dc36a6a928p20 -0x1.0f3559a06e047p19 0x1.6a1886cf8p8 0x1.18p7 -0x1.4p2 -0x1.0p-29 F +REG epsg:3094 3 OK -0x1.ab50c271037p15 0x1.0e8b4df19ba43p19 0x1.8e4c78b9fp7 0x1.04p7 0x1.4p2 0x1.0p-30 F +REG epsg:3094 4 OK 0x1.019e697d01828p20 0x1.0e8b4df33c3c3p19 0x1.e6f098183p7 0x1.18p7 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3095 0 OK 0x1.e8937fe28b262p18 -0x1.5419d658de59ep9 0x1.32d37dc48cp8 0x1.19fffffffffffp7 0x0.0p0 0x0.0p0 T +REG epsg:3095 1 OK -0x1.aad925a9e09dp15 -0x1.0f350777c16fbp19 0x1.56b0e5a564p8 0x1.1p7 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:3095 2 OK 0x1.01a08945264b9p20 -0x1.0f350779b1448p19 0x1.8b28b4636p8 0x1.23fffffffffffp7 -0x1.4p2 -0x1.0p-29 F +REG epsg:3095 3 OK -0x1.aaede29bb56p15 0x1.0e8afbfd8c571p19 0x1.c02126247p7 0x1.1p7 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:3095 4 OK 0x1.01a12f5aba3f9p20 0x1.0e8afbff79cf3p19 0x1.1488a23224p8 0x1.23fffffffffffp7 0x1.4p2 -0x1.0p-29 F +REG epsg:3096 0 OK 0x1.e89e65b33f515p18 -0x1.54195ee357222p9 0x1.54c8431e3p8 0x1.2600000000001p7 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:3096 1 OK -0x1.aa7c11fa9466p15 -0x1.0f34a7f8b9dacp19 0x1.749a2a36acp8 0x1.1bfffffffffffp7 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3096 2 OK 0x1.01a31395b478bp20 -0x1.0f34a7faf1a1dp19 0x1.b0a4bd6acp8 0x1.3p7 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3096 3 OK -0x1.aa90ce6c606ep15 0x1.0e8a9cb9c7344p19 0x1.fbf3f8af4p7 0x1.1bfffffffffffp7 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:3096 4 OK 0x1.01a3b9adec8a6p20 0x1.0e8a9cbbfc475p19 0x1.3a04d93874p8 0x1.3p7 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:3097 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3097 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3097 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:3097 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3097 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p7 0x1.4p2 0x0.0p0 F +REG epsg:3098 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:3098 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:3098 2 OK 0x1.018fa874f5812p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3098 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:3098 4 OK 0x1.018fa874f5812p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3099 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:3099 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.04p7 -0x1.4p2 0x0.0p0 F +REG epsg:3099 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.18p7 -0x1.4p2 0x0.0p0 F +REG epsg:3099 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.04p7 0x1.4p2 0x0.0p0 F +REG epsg:3099 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.18p7 0x1.4p2 0x0.0p0 F +REG epsg:3100 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:3100 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:3100 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.24p7 -0x1.4p2 0x0.0p0 F +REG epsg:3100 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:3100 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.24p7 0x1.4p2 0x0.0p0 F +REG epsg:3101 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:3101 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3101 2 OK 0x1.018fa874f5812p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3101 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1cp7 0x1.4p2 0x0.0p0 F +REG epsg:3101 4 OK 0x1.018fa874f5812p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3102 0 OK 0x1.e8b7b1afe83p18 0x1.2f28574c7d2ffp18 -0x1.3f22eb378p5 -0x1.54p7 -0x1.c888888888669p3 0x0.0p0 F +REG epsg:3102 1 OK -0x1.39db5c686e6cap20 -0x1.74d46bb13455fp20 -0x1.c0b719d8p0 -0x1.5e5176f75656dp7 -0x1.344444444433bp4 0x1.0p-30 F +REG epsg:3102 2 OK 0x1.171b9bdd79781p21 -0x1.74d3ff0042646p20 0x1.55da05e38p4 -0x1.49ae8908a9a94p7 -0x1.344444444432ep4 0x1.0p-30 F +REG epsg:3102 3 OK -0x1.4d8bc12b8e586p20 0x1.0129412ea684cp21 -0x1.879645dbfp6 -0x1.5e5176f75656dp7 -0x1.28888888886ecp3 0x1.0p-29 F +REG epsg:3102 4 OK 0x1.20f3cb6a5fff5p21 0x1.01290a8b7183bp21 -0x1.26e732939p6 -0x1.49ae8908a9a94p7 -0x1.28888888886d6p3 -0x1.8p-29 F +REG epsg:31028 0 OK 0x1.e81c13b6c812dp18 -0x1.63dc090387e89p6 -0x1.105935dc6p5 -0x1.dfffffffffffep3 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:31028 1 OK -0x1.aed8bd8f5734p15 -0x1.0eeede054823dp19 -0x1.1f24db548p3 -0x1.4p4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:31028 2 OK 0x1.0184cfa4edba2p20 -0x1.0eeede0424c04p19 -0x1.3bf29650ep5 -0x1.3ffffffffffffp3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:31028 3 OK -0x1.aedb74802fcfp15 0x1.0ed8a0758b707p19 -0x1.87d0a371cp4 -0x1.4p4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:31028 4 OK 0x1.0184e558f420cp20 0x1.0ed8a074683bbp19 -0x1.b811d864ep5 -0x1.4p3 0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:3103 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3103 1 OK -0x1.ad892fd8998fp15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3103 2 OK 0x1.0190497ec4cb8p20 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3103 3 OK -0x1.ad892fd8998fp15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3103 4 OK 0x1.0190497ec4cb8p20 0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3104 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3104 1 OK -0x1.ad892fd8998p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3104 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffep1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3104 3 OK -0x1.ad892fd8998p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3104 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffep1 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3105 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:3105 1 OK -0x1.ad892fd89987p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.0p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3105 2 OK 0x1.0190497ec4cbbp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3105 3 OK -0x1.ad892fd89987p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.0p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3105 4 OK 0x1.0190497ec4cbbp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.ffffffffffffbp0 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3106 0 OK 0x1.e88ee52ea5c11p18 -0x1.04fd8c2c71f63p8 0x1.f3111767dp6 0x1.68p6 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:3106 1 OK -0x1.ab24064de57cp15 -0x1.0f029fe116a49p19 0x1.fc5ad69f7p6 0x1.540000001cdc3p6 -0x1.3fffffffeb39cp2 -0x1.0p-27 F +REG epsg:3106 2 OK 0x1.01a092fa7332ep20 -0x1.0f029fe2e333ap19 0x1.60b763c1e8p7 0x1.7bffffffe2f6ep6 -0x1.3fffffffeb143p2 0x1.8p-27 F +REG epsg:3106 3 OK -0x1.ab2bfb82407fp15 0x1.0ec1610bfe862p19 0x1.464aecbep6 0x1.540000001cddap6 0x1.3fffffffeb3e4p2 -0x1.0p-27 F +REG epsg:3106 4 OK 0x1.01a0d2b4aaec2p20 0x1.0ec1610dca3dp19 0x1.05af9d3608p7 0x1.7bffffffe2f55p6 0x1.3fffffffeb18fp2 0x1.2p-27 F +REG epsg:3107 0 OK 0x1.e848p19 0x1.e848p20 0x0.0p0 0x1.0ep7 -0x1.fffffffffff7dp4 0x0.0p0 F +REG epsg:3107 1 OK 0x1.71e08ec5b5c48p17 0x1.06bb3ac46168dp20 0x0.0p0 0x1.f6442ba72d213p6 -0x1.3ffffffffffebp5 0x0.0p0 F +REG epsg:3107 2 OK 0x1.ba0bee274948p20 0x1.06bb3ac46168dp20 0x0.0p0 0x1.20ddea2c696f7p7 -0x1.3ffffffffffebp5 0x0.0p0 F +REG epsg:3107 3 OK 0x1.0dae95d7cae9p15 0x1.5b4ca92e8194ap21 0x0.0p0 0x1.f6442ba72d213p6 -0x1.7ffffffffff24p4 0x0.0p0 F +REG epsg:3107 4 OK 0x1.dfda8b5141a96p20 0x1.5b4ca92e8194ap21 0x0.0p0 0x1.20ddea2c696f7p7 -0x1.7ffffffffff24p4 0x0.0p0 F +REG epsg:3108 0 OK 0x1.6f3p15 0x1.86ap15 0x0.0p0 -0x1.3555555555556p1 0x1.8cp5 0x0.0p0 F +REG epsg:3108 1 OK -0x1.140849d0502b2p19 -0x1.d1c06d8fe733p18 0x0.0p0 -0x1.43b245ecc1e88p3 0x1.63fffffdce15p5 0x0.0p0 F +REG epsg:3108 2 OK 0x1.41ee49d0502b2p19 -0x1.d1c06d8fe733p18 0x0.0p0 0x1.520f36842e7bbp2 0x1.63fffffdce15p5 0x0.0p0 F +REG epsg:3108 3 OK -0x1.b8b7d853e655cp18 0x1.3567490498d33p19 0x0.0p0 -0x1.43b245de86697p3 0x1.b3fffffd7f31ap5 0x0.0p0 F +REG epsg:3108 4 OK 0x1.0a41ec29f32aep19 0x1.3567490498d33p19 0x0.0p0 0x1.520f3667b77d8p2 0x1.b3fffffd7f31ap5 0x0.0p0 F +REG epsg:3109 0 OK 0x1.388p15 0x1.117p16 0x0.0p0 -0x1.1147ae147ae14p1 0x1.89ccccccccccdp5 0x0.0p0 F +REG epsg:3109 1 OK -0x1.172fb43190f71p19 -0x1.be841d581416cp18 0x0.0p0 -0x1.394f221ce6211p3 0x1.61cccccab2208p5 0x0.0p0 F +REG epsg:3109 2 OK 0x1.3e3fb43190f71p19 -0x1.be841d581416cp18 0x0.0p0 0x1.615696255160cp2 0x1.61cccccab2208p5 0x0.0p0 F +REG epsg:3109 3 OK -0x1.c01a7719d432ap18 0x1.3f0d476695df7p19 0x0.0p0 -0x1.394f220f420c2p3 0x1.b1ccccca5e71dp5 0x0.0p0 F +REG epsg:3109 4 OK 0x1.071d3b8cea195p19 0x1.3f0d476695df7p19 0x0.0p0 0x1.6156960a0936ep2 0x1.b1ccccca5e71dp5 0x0.0p0 F +REG epsg:3110 0 OK 0x1.3129626d59226p21 0x1.12a5e1ee1cc17p22 0x1.1272fc108p3 0x1.21fffffffef49p7 -0x1.27fffffffebfep5 0x1.9b3ap-15 F +REG epsg:3110 1 OK 0x1.16abd023b0f6ap21 0x1.04ec77857261cp22 0x1.19a7496f4p4 0x1.1cfdd0266746bp7 -0x1.37fffffffecc8p5 0x1.9efap-15 F +REG epsg:3110 2 OK 0x1.4ba6f701b3594p21 0x1.04ec77973ccb9p22 0x1.44b7c486p3 0x1.27022fd99679p7 -0x1.37fffffffeac6p5 0x1.91fep-15 F +REG epsg:3110 3 OK 0x1.153eea7010367p21 0x1.2002845f68f07p22 0x1.d17e81cp2 0x1.1cfdd026676f5p7 -0x1.17fffffffee35p5 0x1.a33ep-15 F +REG epsg:3110 4 OK 0x1.4d13d832563dap21 0x1.200286a48586ap22 -0x1.2bd201b8p-1 0x1.27022fd996a1ap7 -0x1.17fffffffeb25p5 0x1.96dcp-15 F +REG epsg:3111 0 OK 0x1.312dp21 0x1.312dp21 0x0.0p0 0x1.22p7 -0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:3111 1 OK 0x1.16af6ae880181p21 0x1.15ba29568fd5dp21 0x0.0p0 0x1.1cfdd02668412p7 -0x1.37fffffffffe2p5 0x0.0p0 F +REG epsg:3111 2 OK 0x1.4baa95177fe7ap21 0x1.15ba29568fd6p21 0x0.0p0 0x1.27022fd997beep7 -0x1.37fffffffffdfp5 0x0.0p0 F +REG epsg:3111 3 OK 0x1.15428709f06f5p21 0x1.4be6490335d32p21 0x0.0p0 0x1.1cfdd02668412p7 -0x1.17fffffffffd3p5 0x0.0p0 F +REG epsg:3111 4 OK 0x1.4d1778f60f906p21 0x1.4be6490335d35p21 0x0.0p0 0x1.27022fd997beep7 -0x1.17fffffffffd3p5 0x0.0p0 F +REG epsg:3112 0 OK 0x0.0p0 -0x1.f9e88fbbaa997p20 0x0.0p0 0x1.0cp7 -0x1.1fffffffffefbp4 0x0.0p0 F +REG epsg:3112 1 OK -0x1.646729d93909bp20 -0x1.d1295c9604974p21 0x0.0p0 0x1.d8e98a4ce308ap6 -0x1.07fffffffffc8p5 0x0.0p0 F +REG epsg:3112 2 OK 0x1.646729d93909bp20 -0x1.d1295c9604974p21 0x0.0p0 0x1.2b8b3ad98e7bcp7 -0x1.07fffffffffc8p5 0x0.0p0 F +REG epsg:3112 3 OK -0x1.cb07e36c5fb14p20 -0x1.d38459192da8dp18 0x0.0p0 0x1.d8e98a4ce308ap6 -0x1.7fffffffffdbp1 0x0.0p0 F +REG epsg:3112 4 OK 0x1.cb07e36c5fb14p20 -0x1.d38459192da8dp18 0x0.0p0 0x1.2b8b3ad98e7bcp7 -0x1.7fffffffffdbp1 0x0.0p0 F +REG epsg:31121 0 OK 0x1.e86f3504a2929p18 0x1.65db6d8ac9b87p8 -0x1.81294267p2 -0x1.c800000000001p5 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:31121 1 OK -0x1.ac41ec32bfb6p15 -0x1.0eb6b0c9c27cep19 -0x1.a014df5e6p5 -0x1.f000000000002p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:31121 2 OK 0x1.0199aa0b3136ap20 -0x1.0eb6b0cac3259p19 -0x1.8c46b54cp4 -0x1.a000000000001p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:31121 3 OK -0x1.ac3702de33f2p15 0x1.0f1026e59d58ap19 0x1.4c922537p3 -0x1.fp5 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:31121 4 OK 0x1.019952b3fac8ep20 0x1.0f1026e69ea7p19 0x1.2d1581598p5 -0x1.ap5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3113 0 OK 0x1.86ap15 0x1.86ap16 0x0.0p0 0x1.32p7 -0x1.cp4 0x0.0p0 F +REG epsg:3113 1 OK -0x1.d451c410d6d6p18 -0x1.c9997f7187ecp18 0x0.0p0 0x1.26ac9ee431717p7 -0x1.07ffffffd0d8fp5 0x0.0p0 F +REG epsg:3113 2 OK 0x1.1afce2086b6c4p19 -0x1.c9997f7187ec4p18 0x0.0p0 0x1.3d53611bce8eap7 -0x1.07ffffffd0d9p5 0x0.0p0 F +REG epsg:3113 3 OK -0x1.0363373762186p19 0x1.39cb5736660d5p19 0x0.0p0 0x1.26ac9ee436276p7 -0x1.6fffffffd5222p4 0x0.0p0 F +REG epsg:3113 4 OK 0x1.343737376219dp19 0x1.39cb5736660d4p19 0x0.0p0 0x1.3d53611bc9d8bp7 -0x1.6fffffffd5223p4 0x0.0p0 F +REG epsg:3114 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.404f5e3c3d0ecp6 0x1.262825cadc795p2 0x0.0p0 F +REG epsg:3114 1 OK 0x1.ae914d586fca6p18 0x1.b4783723eacb2p18 0x0.0p0 -0x1.545fe2da83a5cp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3114 2 OK 0x1.7ca3aca9e40d6p20 0x1.b4783723eacb2p18 0x0.0p0 -0x1.2c3ed99df677dp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3114 3 OK 0x1.b62eceec89a28p18 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.545fe2da8ed7fp6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3114 4 OK 0x1.7abc4c44dd976p20 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.2c3ed99deb45ap6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3115 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.344f5e3c3d0ecp6 0x1.262825cadc795p2 0x0.0p0 F +REG epsg:3115 1 OK 0x1.ae914d586fca6p18 0x1.b4783723eacb2p18 0x0.0p0 -0x1.485fe2da83a5bp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3115 2 OK 0x1.7ca3aca9e40d6p20 0x1.b4783723eacb2p18 0x0.0p0 -0x1.203ed99df677dp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3115 3 OK 0x1.b62eceec89a28p18 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.485fe2da8ed7fp6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3115 4 OK 0x1.7abc4c44dd976p20 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.203ed99deb459p6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:31154 0 OK 0x1.e86bf30d575dep18 0x1.65db5063bddb1p8 0x1.db5bb5ep0 -0x1.bp5 0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:31154 1 OK -0x1.ac5a9e157b95p15 -0x1.0eb69aadfc1c8p19 -0x1.58815c52ap5 -0x1.d7ffffffc5168p5 -0x1.3fffffffeac8cp2 -0x1.cp-28 F +REG epsg:31154 2 OK 0x1.0198ce9b5fc76p20 -0x1.0eb69aaee7684p19 -0x1.21575744p4 -0x1.880000003b182p5 -0x1.3fffffffeab59p2 0x1.4p-28 F +REG epsg:31154 3 OK -0x1.ac4fb4b2e317p15 0x1.0f1010c29be92p19 0x1.356fbc4c4p4 -0x1.d7ffffffc51aap5 0x1.3fffffffeac27p2 -0x1.cp-28 F +REG epsg:31154 4 OK 0x1.01987744c4586p20 0x1.0f1010c387ccep19 0x1.628d0ddaap5 -0x1.880000003b13fp5 0x1.3fffffffeaaf4p2 0x1.4p-28 F +REG epsg:3116 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.284f5e3c3d0ecp6 0x1.262825cadc795p2 0x0.0p0 F +REG epsg:3116 1 OK 0x1.ae914d586fca6p18 0x1.b4783723eacb2p18 0x0.0p0 -0x1.3c5fe2da83a5bp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3116 2 OK 0x1.7ca3aca9e40d6p20 0x1.b4783723eacb2p18 0x0.0p0 -0x1.143ed99df677dp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3116 3 OK 0x1.b62eceec89a28p18 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.3c5fe2da8ed7fp6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3116 4 OK 0x1.7abc4c44dd976p20 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.143ed99deb459p6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3117 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.1c4f5e3c3d0ecp6 0x1.262825cadc795p2 0x0.0p0 F +REG epsg:3117 1 OK 0x1.ae914d586fca6p18 0x1.b4783723eacb2p18 0x0.0p0 -0x1.305fe2da83a5cp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3117 2 OK 0x1.7ca3aca9e40d6p20 0x1.b4783723eacb2p18 0x0.0p0 -0x1.083ed99df677dp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3117 3 OK 0x1.b62eceec89a28p18 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.305fe2da8ed7fp6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3117 4 OK 0x1.7abc4c44dd976p20 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.083ed99deb45ap6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:31170 0 OK 0x1.e86dca40e3067p18 0x1.65db606fbd692p8 -0x1.3d2bae64p1 -0x1.bd77777777778p5 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:31170 1 OK -0x1.ac4ca4f7a8efp15 -0x1.0eb6a6d955a73p19 -0x1.8009380cap5 -0x1.e57777773c8fp5 -0x1.3fffffffeac95p2 -0x1.0p-28 F +REG epsg:31170 2 OK 0x1.01994a6e0daf4p20 -0x1.0eb6a6da4cf99p19 -0x1.5bf0743fcp4 -0x1.95777777b290ep5 -0x1.3fffffffeab5p2 0x1.0p-28 F +REG epsg:31170 3 OK -0x1.ac41bb9d0bbp15 0x1.0f101cf1f0585p19 0x1.ccc06fcp3 -0x1.e57777773c932p5 0x1.3fffffffeac2ep2 -0x1.4p-28 F +REG epsg:31170 4 OK 0x1.0198f3171b05ap20 0x1.0f101cf2e84a9p19 0x1.45409245ep5 -0x1.95777777b28cap5 0x1.3fffffffeaaebp2 0x1.0p-29 F +REG epsg:31171 0 OK 0x1.e86dcd282ab31p18 0x1.65f6df0171cap8 -0x1.3d2bae64p1 -0x1.bd77777777778p5 0x0.0p0 0x1.0p-30 T +REG epsg:31171 1 OK -0x1.ad99abc72d5dp15 -0x1.0ecb736c25818p19 -0x1.8009380cap5 -0x1.e57777773c8fp5 -0x1.3fffffffeac93p2 -0x1.0p-28 F +REG epsg:31171 2 OK 0x1.01a3b4183091ep20 -0x1.0ecb736d1ce6ep19 -0x1.5bf0743fcp4 -0x1.95777777b290ep5 -0x1.3fffffffeab4fp2 0x1.0p-28 F +REG epsg:31171 3 OK -0x1.ad8ec195f291p15 0x1.0f24f06455e92p19 0x1.ccc06fcp3 -0x1.e57777773c932p5 0x1.3fffffffeac2fp2 -0x1.4p-28 F +REG epsg:31171 4 OK 0x1.01a35cba880dap20 0x1.0f24f0654dee5p19 0x1.45409245ep5 -0x1.95777777b28cap5 0x1.3fffffffeaaeap2 0x1.0p-29 F +REG epsg:3118 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.104f5e3c3d0ecp6 0x1.262825cadc795p2 0x0.0p0 F +REG epsg:3118 1 OK 0x1.ae914d586fca6p18 0x1.b4783723eacb2p18 0x0.0p0 -0x1.245fe2da83a5bp6 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3118 2 OK 0x1.7ca3aca9e40d6p20 0x1.b4783723eacb2p18 0x0.0p0 -0x1.f87db33becefap5 -0x1.9d7da3521b52ep-2 0x0.0p0 T +REG epsg:3118 3 OK 0x1.b62eceec89a28p18 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.245fe2da8ed7fp6 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3118 4 OK 0x1.7abc4c44dd976p20 0x1.7c1fe39919f94p20 0x0.0p0 -0x1.f87db33bd68b2p5 0x1.331412e55b851p3 0x0.0p0 F +REG epsg:3119 0 OK 0x1.e858c29fec2bp19 0x1.e852f399d519ap19 -0x1.08339a1bcp4 0x1.5000000000002p3 -0x1.d43922e2ff9e1p-53 -0x1.0p-30 T +REG epsg:3119 1 OK 0x1.b30da3b063b96p18 0x1.b33214694b52p18 -0x1.272faa3acp5 0x1.60000001d74dcp2 -0x1.3fffffffeac5bp2 -0x1.8p-28 F +REG epsg:3119 2 OK 0x1.7b9559d15772p20 0x1.b332146794442p18 -0x1.b2f7dc138p3 0x1.efffffff13ab4p3 -0x1.3fffffffeab3bp2 0x1.0p-29 F +REG epsg:3119 3 OK 0x1.b30df92d74b7ap18 0x1.7b866e680dc32p20 -0x1.59c7b222cp4 0x1.60000001d745ep2 0x1.3fffffffeac44p2 -0x1.0p-27 F +REG epsg:3119 4 OK 0x1.7b95446f71334p20 0x1.7b866e687b97ep20 0x1.b1b79534p0 0x1.efffffff13af8p3 0x1.3fffffffeab2p2 0x1.0p-28 F +REG epsg:3120 0 OK 0x1.1b070f0ec8d6ap22 0x1.4dae5e0a2bd5cp22 -0x1.f975b7ec4p4 0x1.515555555069cp4 0x1.94ffffffeff98p5 0x1.9f82p-14 F +REG epsg:3120 1 OK 0x1.eaf9fbafa3adcp21 0x1.2da90e1f007ap22 -0x1.8683ca53cp5 0x1.a6750a37c34ep3 0x1.6cfffffff238ep5 0x1.c55ep-14 F +REG epsg:3120 2 OK 0x1.409116b36add8p22 0x1.2da9096f00965p22 -0x1.443caf818p4 0x1.cf70258ec1866p4 0x1.6cfffffff1e1fp5 0x1.be85p-14 F +REG epsg:3120 3 OK 0x1.f96e9ec73431bp21 0x1.7154a69a453c2p22 -0x1.47c4aa71p5 0x1.a6750a37c13b6p3 0x1.bcffffffee593p5 0x1.7a2p-14 F +REG epsg:3120 4 OK 0x1.3956d93c3bc95p22 0x1.7154996985032p22 -0x1.1ebc0ac64p4 0x1.cf70258ebd2d2p4 0x1.bcffffffee531p5 0x1.726bp-14 F +REG epsg:3121 0 OK 0x1.e817be8bf604p18 0x1.f5ec7e590e657p5 -0x1.e55029aacp5 0x1.d3ffffffbc4e8p6 -0x1.a783006a018d3p-27 0x1.aff38p-12 T +REG epsg:3121 1 OK -0x1.b0a712895dc7p15 -0x1.0ef2a8ff2fcfep19 -0x1.93c8c0a2ep5 0x1.bfffffff9c406p6 -0x1.400000108e636p2 0x1.9f92ap-11 F +REG epsg:3121 2 OK 0x1.018f266a374d6p20 -0x1.0ef66f1a3fb03p19 -0x1.2e015133ep6 0x1.e7ffffffe1c2cp6 -0x1.40000010e2a61p2 0x1.5237cp-11 F +REG epsg:3121 3 OK -0x1.b06777b97dffp15 0x1.0f06363593969p19 -0x1.51e427d9ap5 0x1.bfffffff95d83p6 0x1.3ffffff6c9d1ap2 0x1.5623cp-12 F +REG epsg:3121 4 OK 0x1.01910c3db93d4p20 0x1.0f02407882f9cp19 -0x1.0d345eaap6 0x1.e7ffffffe1babp6 0x1.3ffffff6b781ap2 0x1.67abp-13 F +REG epsg:3122 0 OK 0x1.e817bfc19004ap18 0x1.c41bf3f046f75p5 -0x1.06cbecf91p6 0x1.dbffffffd70cdp6 -0x1.a88e6290452b6p-27 0x1.962d8p-12 T +REG epsg:3122 1 OK -0x1.b0a7fc22ee33p15 -0x1.0ef37d2f33be8p19 -0x1.bbbe14bap5 0x1.c7ffffffb54c3p6 -0x1.40000010ac77ep2 0x1.8400ap-11 F +REG epsg:3122 2 OK 0x1.018f2d17bcd23p20 -0x1.0ef745bb54e57p19 -0x1.41f88ba05p6 0x1.effffffffc1d9p6 -0x1.40000010df694p2 0x1.5534ep-11 F +REG epsg:3122 3 OK -0x1.b0683a648e16p15 0x1.0f057e526741bp19 -0x1.79e850bd8p5 0x1.c7ffffffb027cp6 0x1.3ffffff6c32cep2 0x1.1c468p-12 F +REG epsg:3122 4 OK 0x1.01911427f2e52p20 0x1.0f01862435b77p19 -0x1.21331abe4p6 0x1.effffffffd5d8p6 0x1.3ffffff6b8347p2 0x1.74328p-13 F +REG epsg:3123 0 OK 0x1.e817cc35cff6cp18 0x1.9233c24f44e98p5 -0x1.1aebf29bap6 0x1.e3fffffff1fe2p6 -0x1.a91558d4c8157p-27 0x1.8924cp-12 T +REG epsg:3123 1 OK -0x1.b0a881e44311p15 -0x1.0ef45255e8629p19 -0x1.e3cb07c86p5 0x1.cfffffffcedcbp6 -0x1.40000010c3f98p2 0x1.6e63ep-11 F +REG epsg:3123 2 OK 0x1.018f36e15c543p20 -0x1.0ef81c1d9774dp19 -0x1.55dc5cf82p6 0x1.f80000001657ap6 -0x1.40000010d576cp2 0x1.5e62cp-11 F +REG epsg:3123 3 OK -0x1.b068aca78208p15 0x1.0f04c5732e5a1p19 -0x1.a2042b396p5 0x1.cfffffffcafdbp6 0x1.3ffffff6be09fp2 0x1.ddda8p-13 F +REG epsg:3123 4 OK 0x1.01911e92c8722p20 0x1.0f00cc095f88p19 -0x1.351e6b609p6 0x1.f800000018decp6 0x1.3ffffff6ba599p2 0x1.9ab5p-13 F +REG epsg:3124 0 OK 0x1.e817e3e4d534ap18 0x1.60437a501afd4p5 -0x1.2f01ded5p6 0x1.ec0000000d00bp6 -0x1.a917b91e71457p-27 0x1.88e94p-12 T +REG epsg:3124 1 OK -0x1.b0a8a3a3950fp15 -0x1.0ef52830d2a43p19 -0x1.05f18df5p6 0x1.d7ffffffe8d16p6 -0x1.40000010d4d81p2 0x1.5ed7ep-11 F +REG epsg:3124 2 OK 0x1.018f43c408dp20 -0x1.0ef8f1fe29b02p19 -0x1.69a6911b6p6 0x1.000000001827bp7 -0x1.40000010c4d56p2 0x1.6db6p-11 F +REG epsg:3124 3 OK -0x1.b068ce5ea9c3p15 0x1.0f040bd191f6ap19 -0x1.ca2b34c2ap5 0x1.d7ffffffe6393p6 0x1.3ffffff6ba61cp2 0x1.9ca1p-13 F +REG epsg:3124 4 OK 0x1.01912b7afa803p20 0x1.0f0012620c28cp19 -0x1.48f01a1a5p6 0x1.000000001a0eap7 0x1.3ffffff6bdf48p2 0x1.db03p-13 F +REG epsg:3125 0 OK 0x1.e81806c73e72ep18 0x1.2e5aaf5775ecep5 -0x1.43076de3ap6 0x1.f400000027f36p6 -0x1.a89582af84ccdp-27 0x1.957a4p-12 T +REG epsg:3125 1 OK -0x1.b0a861564dd5p15 -0x1.0ef5fe7d3f214p19 -0x1.19fce7e19p6 0x1.e00000000309ap6 -0x1.40000010df084p2 0x1.55706p-11 F +REG epsg:3125 2 OK 0x1.018f53bbbde58p20 -0x1.0ef9c71a56473p19 -0x1.7d50fbe7ep6 0x1.0400000024f21p7 -0x1.40000010ad91p2 0x1.831a4p-11 F +REG epsg:3125 3 OK -0x1.b0689f7f74b7p15 0x1.0f0351a777e29p19 -0x1.f250e7544p5 0x1.e000000001b8ep6 0x1.3ffffff6b82fep2 0x1.752c8p-13 F +REG epsg:3125 4 OK 0x1.01913adc82dd6p20 0x1.0eff59682361fp19 -0x1.5ca1f8748p6 0x1.04000000277bbp7 0x1.3ffffff6c30a7p2 0x1.1a634p-12 F +REG epsg:31251 0 OK 0x1.e7efcf3ef8d3bp20 -0x1.31352c4da37f5p22 0x1.58b3e32edp7 0x1.bfffee968be55p4 -0x1.41d9272a4044ep-25 0x1.23693cp-8 T +REG epsg:31251 1 OK 0x1.59b34fe40305p20 -0x1.53cb286a2c6fp22 0x1.8fbaf16898p7 0x1.6ffffeeae0ab2p4 -0x1.3ffffff05b226p2 0x1.47cae8p-8 F +REG epsg:31251 2 OK 0x1.3b124e240d74fp21 -0x1.55c896a1b67f2p22 0x1.d242e74d88p7 0x1.07ffb83ae155cp5 -0x1.3ffffb11dfe88p2 0x1.7f7874p-8 F +REG epsg:31251 3 OK 0x1.59b6576957891p20 -0x1.0e9e46b28aee1p22 0x1.dbe09b96ep6 0x1.6ffffeeafa461p4 0x1.3fffff9fcfdfep2 0x1.d05d28p-9 F +REG epsg:31251 4 OK 0x1.3b147d75b70c4p21 -0x1.0ca2aaf039213p22 0x1.3067c611f8p7 0x1.07ffb837fd92cp5 0x1.3ffffabdbd8b8p2 0x1.221844p-8 F +REG epsg:31252 0 OK 0x1.e7f1b02507eep20 -0x1.31354fa1c8c59p22 0x1.6e4214b7f8p7 0x1.efffee9679f99p4 -0x1.3db4487c2e0a6p-25 0x1.2a9e5cp-8 T +REG epsg:31252 1 OK 0x1.59b5322feed08p20 -0x1.53cb4aeae1f77p22 0x1.a028e563bp7 0x1.9ffffeeb4d675p4 -0x1.3fffffeffa2edp2 0x1.4bb64cp-8 F +REG epsg:31252 2 OK 0x1.3b133ce630cd6p21 -0x1.55c8b990d548p22 0x1.eca263b0a8p7 0x1.1fffb83940fe3p5 -0x1.3ffffb1103fe8p2 0x1.8bbe8p-8 F +REG epsg:31252 3 OK 0x1.59b83b960e3ecp20 -0x1.0e9e6a5b31a34p22 0x1.fcb278896p6 0x1.9ffffeeb7e52ep4 0x1.3fffffa0100d5p2 0x1.d9b0ep-9 F +REG epsg:31252 4 OK 0x1.3b156d49188d2p21 -0x1.0ca2cf282e112p22 0x1.4ac27b9aap7 0x1.1fffb8366999dp5 0x1.3ffffabe5ddap2 0x1.2ff7c8p-8 F +REG epsg:31253 0 OK 0x1.e7f386e8bb85p20 -0x1.31357277d56dap22 0x1.86c7f27628p7 0x1.0ffff74b31bcap5 -0x1.38adabc3e638ep-25 0x1.332584p-8 T +REG epsg:31253 1 OK 0x1.59b70d7398e8ap20 -0x1.53cb6c841fed6p22 0x1.b3a38c44bp7 0x1.cffffeebb5739p4 -0x1.3fffffef7871ep2 0x1.50ef4cp-8 F +REG epsg:31253 2 OK 0x1.3b1425bcfb38cp21 -0x1.55c8db2e52099p22 0x1.04ec731a4cp8 0x1.37ffb837a65a2p5 -0x1.3ffffb1006ea2p2 0x1.98f2f8p-8 F +REG epsg:31253 3 OK 0x1.59ba17694d9e2p20 -0x1.0e9e8e47bb378p22 0x1.11ceec65b8p7 0x1.cffffeebfd809p4 0x1.3fffffa067923p2 0x1.e624f8p-9 F +REG epsg:31253 4 OK 0x1.3b16567492a38p21 -0x1.0ca2f35d08eb5p22 0x1.67f4516d9p7 0x1.37ffb834dc74dp5 0x1.3ffffabf177cap2 0x1.3f054p-8 F +REG epsg:31254 0 OK -0x1.29cb584e484d5p7 -0x1.3133fe4092da1p22 0x1.188fd9a9cp7 0x1.4aaaaaa8a26b5p3 -0x1.480ffe3cb24a4p-25 0x1.1667fcp-8 T +REG epsg:31254 1 OK -0x1.0f2954db9b842p19 -0x1.5313775fc847dp22 0x1.6eae87e3a8p7 0x1.555555504d23dp2 -0x1.40000027b6e6cp2 0x1.4c8d2cp-8 F +REG epsg:31254 2 OK 0x1.0f0085798bbe5p19 -0x1.5313df97709ffp22 0x1.73e2fe87a8p7 0x1.eaaaaaa988a29p3 -0x1.4000002889bd2p2 0x1.43dcep-8 F +REG epsg:31254 3 OK -0x1.0f26a12b4cc53p19 -0x1.0f5412cb93723p22 0x1.9a03c8861p6 0x1.5555554efbb5fp2 0x1.3fffffd7f3c1fp2 0x1.dbe508p-9 F +REG epsg:31254 4 OK 0x1.0f04fdeac6083p19 -0x1.0f548f0020c59p22 0x1.a44ab57cap6 0x1.eaaaaaa97db93p3 0x1.3fffffd7603f2p2 0x1.c73268p-9 F +REG epsg:31255 0 OK -0x1.d963c008cf2dep6 -0x1.313420c42df82p22 0x1.1bb8ca6f88p7 0x1.aaaaaaa9b4289p3 -0x1.4951d53da8378p-25 0x1.1445e8p-8 T +REG epsg:31255 1 OK -0x1.0f258099d18ddp19 -0x1.5313991d39bb9p22 0x1.6c85a4adf8p7 0x1.0aaaaaa9158fap3 -0x1.400000281ce2fp2 0x1.485d4cp-8 F +REG epsg:31255 2 OK 0x1.0f0450eb58c83p19 -0x1.531401c4e7c8cp22 0x1.7c56905858p7 0x1.2555555542a48p4 -0x1.400000288086cp2 0x1.443eccp-8 F +REG epsg:31255 3 OK -0x1.0f22c968f93b9p19 -0x1.0f5435a556577p22 0x1.95a7d9b5bp6 0x1.0aaaaaa89bea3p3 0x1.3fffffd7ac3eap2 0x1.d1e9bp-9 F +REG epsg:31255 4 OK 0x1.0f08cceb9cc26p19 -0x1.0f54b249decaep22 0x1.b527a2d9ap6 0x1.255555555505ap4 0x1.3fffffd766a99p2 0x1.c81b6p-9 F +REG epsg:31256 0 OK -0x1.5fb059253fca8p6 -0x1.3134435d529d9p22 0x1.2213557158p7 0x1.05555555644cfp4 -0x1.49ac92060788cp-25 0x1.13ab94p-8 T +REG epsg:31256 1 OK -0x1.0f21aaa125783p19 -0x1.5313ba88d6ed8p22 0x1.6d8db28aa8p7 0x1.6aaaaaaa0c0d9p3 -0x1.4000002861c47p2 0x1.458478p-8 F +REG epsg:31256 2 OK 0x1.0f08153461ecep19 -0x1.53142350158adp22 0x1.87eff974f8p7 0x1.55555555bfd1ap4 -0x1.4000002855d01p2 0x1.460464p-8 F +REG epsg:31256 3 OK -0x1.0f1ef27682626p19 -0x1.0f54594c76c82p22 0x1.97adc0828p6 0x1.6aaaaaa9c1cfp3 0x1.3fffffd77c12cp2 0x1.cb226p-9 F +REG epsg:31256 4 OK 0x1.0f0c923ce40e7p19 -0x1.0f54d6108417bp22 0x1.cc504a3p6 0x1.55555555e9fc2p4 0x1.3fffffd7847cap2 0x1.cc5298p-9 F +REG epsg:31257 0 OK 0x1.24ad8d29ec6dfp17 -0x1.3133fe4092da1p22 0x1.188fd9a9cp7 0x1.4aaaaaa8a26b5p3 -0x1.480ffe3cb24a4p-25 0x1.1667fcp-8 T +REG epsg:31257 1 OK -0x1.8bd6a9b737084p18 -0x1.5313775fc847dp22 0x1.6eae87e3a8p7 0x1.555555504d23dp2 -0x1.40000027b6e6cp2 0x1.4c8d2cp-8 F +REG epsg:31257 2 OK 0x1.583e85798bbe5p19 -0x1.5313df97709ffp22 0x1.73e2fe87a8p7 0x1.eaaaaaa988a29p3 -0x1.4000002889bd2p2 0x1.43dcep-8 F +REG epsg:31257 3 OK -0x1.8bd14256998a6p18 -0x1.0f5412cb93723p22 0x1.9a03c8861p6 0x1.5555554efbb5fp2 0x1.3fffffd7f3c1fp2 0x1.dbe508p-9 F +REG epsg:31257 4 OK 0x1.5842fdeac6083p19 -0x1.0f548f0020c59p22 0x1.a44ab57cap6 0x1.eaaaaaa97db93p3 0x1.3fffffd7603f2p2 0x1.c73268p-9 F +REG epsg:31258 0 OK 0x1.b75669c3ff731p18 -0x1.313420c42df82p22 0x1.1bb8ca6f88p7 0x1.aaaaaaa9b4289p3 -0x1.4951d53da8378p-25 0x1.1445e8p-8 T +REG epsg:31258 1 OK -0x1.9b5c04ce8c6e8p16 -0x1.5313991d39bb9p22 0x1.6c85a4adf8p7 0x1.0aaaaaa9158fap3 -0x1.400000281ce2fp2 0x1.485d4cp-8 F +REG epsg:31258 2 OK 0x1.eabe50eb58c83p19 -0x1.531401c4e7c8cp22 0x1.7c56905858p7 0x1.2555555542a48p4 -0x1.400000288086cp2 0x1.443eccp-8 F +REG epsg:31258 3 OK -0x1.9b464b47c9dc8p16 -0x1.0f5435a556577p22 0x1.95a7d9b5bp6 0x1.0aaaaaa89bea3p3 0x1.3fffffd7ac3eap2 0x1.d1e9bp-9 F +REG epsg:31258 4 OK 0x1.eac2cceb9cc26p19 -0x1.0f54b249decaep22 0x1.b527a2d9ap6 0x1.255555555505ap4 0x1.3fffffd766a99p2 0x1.c81b6p-9 F +REG epsg:31259 0 OK 0x1.6e2b027d36d6p19 -0x1.3134435d529d9p22 0x1.2213557158p7 0x1.05555555644cfp4 -0x1.49ac92060788cp-25 0x1.13ab94p-8 T +REG epsg:31259 1 OK 0x1.7c51557b6a1f4p17 -0x1.5313ba88d6ed8p22 0x1.6d8db28aa8p7 0x1.6aaaaaaa0c0d9p3 -0x1.4000002861c47p2 0x1.458478p-8 F +REG epsg:31259 2 OK 0x1.3e9f0a9a30f67p20 -0x1.53142350158adp22 0x1.87eff974f8p7 0x1.55555555bfd1ap4 -0x1.4000002855d01p2 0x1.460464p-8 F +REG epsg:31259 3 OK 0x1.7c5c3625f6768p17 -0x1.0f54594c76c82p22 0x1.97adc0828p6 0x1.6aaaaaa9c1cfp3 0x1.3fffffd77c12cp2 0x1.cb226p-9 F +REG epsg:31259 4 OK 0x1.3ea1491e72074p20 -0x1.0f54d6108417bp22 0x1.cc504a3p6 0x1.55555555e9fc2p4 0x1.3fffffd7847cap2 0x1.cc5298p-9 F +REG epsg:3126 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3p4 0x0.0p0 0x0.0p0 T +REG epsg:3126 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3126 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3126 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3126 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:31265 0 OK 0x1.4fafea4e07df6p22 -0x1.ccfeed6b01c1p8 0x1.1edbb89048p7 0x1.dfffffffa2ee1p3 -0x1.49a0cd9a236e5p-25 0x1.13bf9cp-8 T +REG epsg:31265 1 OK 0x1.2dcd141cc872ep22 -0x1.0f355dcfa26fep19 0x1.6cb37a42f8p7 0x1.3ffffffef317dp3 -0x1.400000284742fp2 0x1.469d64p-8 F +REG epsg:31265 2 OK 0x1.71924d35fbfebp22 -0x1.0f38a3e8e91acp19 0x1.8265385d58p7 0x1.4000000033169p4 -0x1.400000286ceccp2 0x1.450f28p-8 F +REG epsg:31265 3 OK 0x1.2dcd6b1e39fe1p22 0x1.0ec5b51e681f6p19 0x1.95fdda569p6 0x1.3ffffffe93bf9p3 0x1.3fffffd78e994p2 0x1.cdbfp-9 F +REG epsg:31265 4 OK 0x1.7192dcd25c2dcp22 0x1.0ec1cf1e812c5p19 0x1.c13f4afa8p6 0x1.4000000052b14p4 0x1.3fffffd77457cp2 0x1.ca0b2p-9 F +REG epsg:31266 0 OK 0x1.8cb96395a3295p22 -0x1.d5a594df06f9ep8 0x1.26fab425ap7 0x1.200000005bc86p4 -0x1.497b079a0f8d4p-25 0x1.13fffcp-8 T +REG epsg:31266 1 OK 0x1.6ad68ed51e687p22 -0x1.0f36676fa4193p19 0x1.6f813804fp7 0x1.9fffffffec811p3 -0x1.40000028799fdp2 0x1.44873p-8 F +REG epsg:31266 2 OK 0x1.ae9bc51b3bbddp22 -0x1.0f39ad1f6eff3p19 0x1.8fbaf16898p7 0x1.70000000aefdap4 -0x1.400000282faa8p2 0x1.47982cp-8 F +REG epsg:31266 3 OK 0x1.6ad6e5c8d2852p22 0x1.0ec494aae4f4ep19 0x1.9b8f1d107p6 0x1.9fffffffbcb0fp3 0x1.3fffffd76b6a3p2 0x1.c8c7a8p-9 F +REG epsg:31266 4 OK 0x1.ae9c54abab765p22 0x1.0ec0af14dc54fp19 0x1.dbe09b96ep6 0x1.70000000e653p4 0x1.3fffffd79f293p2 0x1.d0141p-9 F +REG epsg:31267 0 OK 0x1.c9c2dbd912492p22 -0x1.de482d164569ep8 0x1.3243633dap7 0x1.50000000e5186p4 -0x1.486e101753fb4p-25 0x1.15c8ep-8 T +REG epsg:31267 1 OK 0x1.a7e0093e52991p22 -0x1.0f376d5e13354p19 0x1.757dcef3c8p7 0x1.0000000074719p4 -0x1.400000288a83ap2 0x1.43d3b8p-8 F +REG epsg:31267 2 OK 0x1.eba53b9825082p22 -0x1.0f3ab02069753p19 0x1.a028e563bp7 0x1.a00000012779p4 -0x1.40000027d13abp2 0x1.4b7acp-8 F +REG epsg:31267 3 OK 0x1.a7e05fd367fa9p22 0x1.0ec36f059cf0ap19 0x1.a77e10c44p6 0x1.00000000745e3p4 0x1.3fffffd75fa28p2 0x1.c71cap-9 F +REG epsg:31267 4 OK 0x1.eba5cacbbf58ep22 0x1.0ebf8c5d74475p19 0x1.fcb278896p6 0x1.a00000017661fp4 0x1.3fffffd7e1551p2 0x1.d955ep-9 F +REG epsg:31268 0 OK 0x1.03662961f65ffp23 -0x1.e6e0a685da4a8p8 0x1.40adda5b58p7 0x1.800000016be5dp4 -0x1.467aa3cca5a9p-25 0x1.191564p-8 T +REG epsg:31268 1 OK 0x1.e4e983027a793p22 -0x1.0f386ee319085p19 0x1.7ea50b6378p7 0x1.30000000f2a41p4 -0x1.4000002879dd7p2 0x1.4484e4p-8 F +REG epsg:31268 2 OK 0x1.1457582cc74dcp23 -0x1.0f3bac361045bp19 0x1.b3a38c44bp7 0x1.d00000019b1d6p4 -0x1.4000002751fd4p2 0x1.50aafp-8 F +REG epsg:31268 3 OK 0x1.e4e9d8e85250ep22 0x1.0ec244fcaaa78p19 0x1.b9c255488p6 0x1.300000010a65cp4 0x1.3fffffd76b454p2 0x1.c8c24p-9 F +REG epsg:31268 4 OK 0x1.14579f6fd7e18p23 0x1.0ebe67c454e9p19 0x1.11ceec65b8p7 0x1.d00000020162bp4 0x1.3fffffd83aca7p2 0x1.e5b88p-9 F +REG epsg:3127 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4p4 0x0.0p0 0x0.0p0 T +REG epsg:3127 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e0000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3127 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3127 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e0000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3127 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:31275 0 OK 0x1.4fafea586aa3p22 -0x1.ccf3203c60e8bp8 0x1.1edbb89048p7 0x1.dfffffffa2ee5p3 -0x1.49a0cd9a236e5p-25 0x1.13bf9cp-8 T +REG epsg:31275 1 OK 0x1.2dcdf23a941a2p22 -0x1.0f2e6c6b56ab9p19 0x1.6cb37a42f8p7 0x1.3ffffffef3178p3 -0x1.400000284742dp2 0x1.469d68p-8 F +REG epsg:31275 2 OK 0x1.71916f2fe968ep22 -0x1.0f31b26f28c63p19 0x1.8265385d58p7 0x1.4000000033169p4 -0x1.400000286ceccp2 0x1.450f28p-8 F +REG epsg:31275 3 OK 0x1.2dce4939cb722p22 0x1.0ebec695e0fedp19 0x1.95fdda569p6 0x1.3ffffffe93bf7p3 0x1.3fffffd78e994p2 0x1.cdbfp-9 F +REG epsg:31275 4 OK 0x1.7191fec89c6cfp22 0x1.0ebae0af86894p19 0x1.c13f4afa8p6 0x1.4000000052b14p4 0x1.3fffffd77457cp2 0x1.ca0b2p-9 F +REG epsg:31276 0 OK 0x1.8cb9639ceb1b5p22 -0x1.d5998efe71166p8 0x1.26fab425ap7 0x1.200000005bc86p4 -0x1.497b079a0f8d4p-25 0x1.13fffcp-8 T +REG epsg:31276 1 OK 0x1.6ad76cefc5cdbp22 -0x1.0f2f76048b881p19 0x1.6f813804fp7 0x1.9fffffffec814p3 -0x1.40000028799fcp2 0x1.448734p-8 F +REG epsg:31276 2 OK 0x1.ae9ae7121768cp22 -0x1.0f32bb9ee491p19 0x1.8fbaf16898p7 0x1.70000000aefdbp4 -0x1.400000282faa8p2 0x1.47982cp-8 F +REG epsg:31276 3 OK 0x1.6ad7c3e140112p22 0x1.0ebda629c0392p19 0x1.9b8f1d107p6 0x1.9fffffffbcb0ep3 0x1.3fffffd76b6a3p2 0x1.c8c7a8p-9 F +REG epsg:31276 4 OK 0x1.ae9b769eda447p22 0x1.0eb9c0ad4160ep19 0x1.dbe09b96ep6 0x1.70000000e652fp4 0x1.3fffffd79f293p2 0x1.d01408p-9 F +REG epsg:31277 0 OK 0x1.c9c2dbdd46129p22 -0x1.de3bee9e553a3p8 0x1.3243633dap7 0x1.50000000e5186p4 -0x1.486e101753fb4p-25 0x1.15c8ep-8 T +REG epsg:31277 1 OK 0x1.a7e0e755d7c2cp22 -0x1.0f307bec460c3p19 0x1.757dcef3c8p7 0x1.0000000074719p4 -0x1.400000288a839p2 0x1.43d3b8p-8 F +REG epsg:31277 2 OK 0x1.eba45d8bf82d4p22 -0x1.0f33be993d9ecp19 0x1.a028e563bp7 0x1.a00000012778ep4 -0x1.40000027d13acp2 0x1.4b7ab8p-8 F +REG epsg:31277 3 OK 0x1.a7e13de8b5b73p22 0x1.0ebc808bfca48p19 0x1.a77e10c44p6 0x1.00000000745e3p4 0x1.3fffffd75fa28p2 0x1.c71cap-9 F +REG epsg:31277 4 OK 0x1.eba4ecbbe801bp22 0x1.0eb89dfd4a909p19 0x1.fcb278896p6 0x1.a000000176622p4 0x1.3fffffd7e1552p2 0x1.d955ep-9 F +REG epsg:31278 0 OK 0x1.c9c2dbdd46129p22 -0x1.de3bee9e553a3p8 0x1.3243633dap7 0x1.50000000e5186p4 -0x1.486e101753fb4p-25 0x1.15c8ep-8 T +REG epsg:31278 1 OK 0x1.a7e0e755d7c2cp22 -0x1.0f307bec460c3p19 0x1.757dcef3c8p7 0x1.0000000074719p4 -0x1.400000288a839p2 0x1.43d3b8p-8 F +REG epsg:31278 2 OK 0x1.eba45d8bf82d4p22 -0x1.0f33be993d9ecp19 0x1.a028e563bp7 0x1.a00000012778ep4 -0x1.40000027d13acp2 0x1.4b7ab8p-8 F +REG epsg:31278 3 OK 0x1.a7e13de8b5b73p22 0x1.0ebc808bfca48p19 0x1.a77e10c44p6 0x1.00000000745e3p4 0x1.3fffffd75fa28p2 0x1.c71cap-9 F +REG epsg:31278 4 OK 0x1.eba4ecbbe801bp22 0x1.0eb89dfd4a909p19 0x1.fcb278896p6 0x1.a000000176622p4 0x1.3fffffd7e1552p2 0x1.d955ep-9 F +REG epsg:31279 0 OK 0x1.036629628a999p23 -0x1.e6d42fb8e2be2p8 0x1.40adda5b58p7 0x1.800000016be5ep4 -0x1.467aa3cca5a8fp-25 0x1.191568p-8 T +REG epsg:31279 1 OK 0x1.e4ea6116e1a11p22 -0x1.0f317d6ab4311p19 0x1.7ea50b6378p7 0x1.30000000f2a41p4 -0x1.4000002879dd7p2 0x1.4484e4p-8 F +REG epsg:31279 2 OK 0x1.1456e925324acp23 -0x1.0f34baa8705f7p19 0x1.b3a38c44bp7 0x1.d00000019b1d7p4 -0x1.4000002751fd2p2 0x1.50aaf4p-8 F +REG epsg:31279 3 OK 0x1.e4eab6fa86881p22 0x1.0ebb568aab8f2p19 0x1.b9c255488p6 0x1.300000010a65bp4 0x1.3fffffd76b452p2 0x1.c8c248p-9 F +REG epsg:31279 4 OK 0x1.145730666fd8bp23 0x1.0eb7796ba8c47p19 0x1.11ceec65b8p7 0x1.d00000020162bp4 0x1.3fffffd83aca7p2 0x1.e5b88p-9 F +REG epsg:3128 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:3128 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3128 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3128 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3128 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:31281 0 OK 0x1.e80ec3554ae0dp20 -0x1.f7ec870d189f2p8 0x1.d207c94968p7 0x1.bfffee8b71c64p4 0x1.084b48e1d06c2p-31 0x1.30558p-13 T +REG epsg:31281 1 OK 0x1.59d2942316b1ep20 -0x1.14f1c2bdc8d05p19 0x1.d5ab4341e8p7 0x1.6ffffee8f8f63p4 -0x1.3fffffc7ea5b8p2 0x1.22ap-17 F +REG epsg:31281 2 OK 0x1.3b2295c90b5fcp21 -0x1.24d9db940eb96p19 0x1.41905507ap8 0x1.07ffb81a5a2fcp5 -0x1.3ffffae805f22p2 0x1.556a2p-10 F +REG epsg:31281 3 OK 0x1.59d3c77f07922p20 0x1.1477438640277p19 0x1.2e51aad668p7 0x1.6ffffee8e6829p4 0x1.3fffffc8004cep2 0x1.058p-17 F +REG epsg:31281 4 OK 0x1.3b23c3be124d7p21 0x1.2458682bfd8c3p19 0x1.dbc7a7c6b8p7 0x1.07ffb81911976p5 0x1.3ffffae8be107p2 0x1.50212p-10 F +REG epsg:31282 0 OK 0x1.e8107563eb5c7p20 -0x1.f7ec261baa5f9p8 0x1.03d97534dp8 0x1.efffee8aef06ep4 0x1.0850eac2e47acp-31 0x1.401c8p-13 T +REG epsg:31282 1 OK 0x1.59d461393359ep20 -0x1.14f18ec843aa2p19 0x1.03388efa6cp8 0x1.9ffffee8ed5d4p4 -0x1.3fffffc7e830ap2 0x1.33ap-17 F +REG epsg:31282 2 OK 0x1.3b23615271ea5p21 -0x1.24d9a18ba1654p19 0x1.5e7010f918p8 0x1.1fffb818c0ff8p5 -0x1.3ffffae804c74p2 0x1.640f6p-10 F +REG epsg:31282 3 OK 0x1.59d594963dee3p20 0x1.14770fa7773fdp19 0x1.5f17afc088p7 0x1.9ffffee8dae8dp4 0x1.3fffffc7fe231p2 0x1.168p-17 F +REG epsg:31282 4 OK 0x1.3b248f47b0ce3p21 0x1.24582e3ce8664p19 0x1.0ac3a8d2ap8 0x1.1fffb81778646p5 0x1.3ffffae8bcd8dp2 0x1.5ec6fp-10 F +REG epsg:31283 0 OK 0x1.e8120f4264b37p20 -0x1.f7ebbbea130cp8 0x1.1fffd90f3cp8 0x1.0ffff7453986ap5 0x1.08563c54d3084p-31 0x1.4f048p-13 T +REG epsg:31283 1 OK 0x1.59d618b60377bp20 -0x1.14f155ddd5f88p19 0x1.1d09c28c7cp8 0x1.cffffee8e246cp4 -0x1.3fffffc7e61fcp2 0x1.43e8p-17 F +REG epsg:31283 2 OK 0x1.3b241f78ab8a9p21 -0x1.24d961f8f40f1p19 0x1.7c7e0e39ap8 0x1.37ffb8174078cp5 -0x1.3ffffae80393ep2 0x1.71bcbp-10 F +REG epsg:31283 3 OK 0x1.59d74c140a30bp20 0x1.1476d6d5f109cp19 0x1.92ba4395d8p7 0x1.cffffee8cfd1dp4 0x1.3fffffc7fc12fp2 0x1.26b8p-17 F +REG epsg:31283 4 OK 0x1.3b254d6e0b794p21 0x1.2457eec5fea53p19 0x1.28d1c0168p8 0x1.37ffb815f7dafp5 0x1.3ffffae8bb9a3p2 0x1.6c74ap-10 F +REG epsg:31284 0 OK 0x1.24ad8d29ec6dfp17 -0x1.bf9024b683ef5p8 0x1.188fd9a9cp7 0x1.4aaaaaa8a26b5p3 -0x1.480ffe28ea5ep-25 0x1.1667fcp-8 T +REG epsg:31284 1 OK -0x1.8bd6a9b737084p18 -0x1.0f33bafe423ebp19 0x1.6eae87e3a8p7 0x1.555555504d23dp2 -0x1.40000027b6e7p2 0x1.4c8d2cp-8 F +REG epsg:31284 2 OK 0x1.583e85798bbe5p19 -0x1.0f36fcbb84ffap19 0x1.73e2fe87a8p7 0x1.eaaaaaa988a29p3 -0x1.4000002889bd3p2 0x1.43dcep-8 F +REG epsg:31284 3 OK -0x1.8bd14256998a6p18 0x1.0ec769a3646e8p19 0x1.9a03c8861p6 0x1.5555554efbb5fp2 0x1.3fffffd7f3c1fp2 0x1.dbe508p-9 F +REG epsg:31284 4 OK 0x1.5842fdeac6083p19 0x1.0ec387fef9d37p19 0x1.a44ab57cap6 0x1.eaaaaaa97db93p3 0x1.3fffffd7603fp2 0x1.c73268p-9 F +REG epsg:31285 0 OK 0x1.b75669c3ff731p18 -0x1.c8310b7e067bcp8 0x1.1bb8ca6f88p7 0x1.aaaaaaa9b4289p3 -0x1.4951d3716f68ap-25 0x1.1445e8p-8 T +REG epsg:31285 1 OK -0x1.9b5c04ce8c6e8p16 -0x1.0f34c8e9cddc7p19 0x1.6c85a4adf8p7 0x1.0aaaaaa9158fap3 -0x1.400000281ce2dp2 0x1.485d4cp-8 F +REG epsg:31285 2 OK 0x1.eabe50eb58c83p19 -0x1.0f380e273e46p19 0x1.7c56905858p7 0x1.2555555542a48p4 -0x1.400000288086cp2 0x1.443eccp-8 F +REG epsg:31285 3 OK -0x1.9b464b47c9dc8p16 0x1.0ec652d54d44ap19 0x1.95a7d9b5bp6 0x1.0aaaaaa89bea3p3 0x1.3fffffd7ac3ecp2 0x1.d1e9bp-9 F +REG epsg:31285 4 OK 0x1.eac2cceb9cc26p19 0x1.0ec26db109a91p19 0x1.b527a2d9ap6 0x1.255555555505ap4 0x1.3fffffd766a9bp2 0x1.c81b6p-9 F +REG epsg:31286 0 OK 0x1.6e2b027d36d6p19 -0x1.d0d754a765c62p8 0x1.2213557158p7 0x1.05555555644cfp4 -0x1.49ac94207c70ep-25 0x1.13ab94p-8 T +REG epsg:31286 1 OK 0x1.7c51557b6a1f4p17 -0x1.0f35d446b76cp19 0x1.6d8db28aa8p7 0x1.6aaaaaaa0c0d9p3 -0x1.4000002861c47p2 0x1.458478p-8 F +REG epsg:31286 2 OK 0x1.3e9f0a9a30f67p20 -0x1.0f391a80ac56bp19 0x1.87eff974f8p7 0x1.55555555bfd1ap4 -0x1.4000002855d05p2 0x1.460464p-8 F +REG epsg:31286 3 OK 0x1.7c5c3625f6768p17 0x1.0ec5359c49bf3p19 0x1.97adc0828p6 0x1.6aaaaaa9c1cfp3 0x1.3fffffd77c12dp2 0x1.cb226p-9 F +REG epsg:31286 4 OK 0x1.3ea1491e72074p20 0x1.0ec14f7bdf429p19 0x1.cc504a3p6 0x1.55555555e9fc2p4 0x1.3fffffd7847cbp2 0x1.cc5298p-9 F +REG epsg:31287 0 OK 0x1.86adeb691c01p18 0x1.86ae638bff1acp18 -0x1.79f8091b8p5 0x1.aaaaaaa8aaf33p3 0x1.7c00000072d91p5 0x1.c66cp-16 F +REG epsg:31287 1 OK 0x1.6d05dc55db168p15 0x1.2b843aff8d714p16 -0x1.90758243cp5 0x1.1c9195cca4cccp3 0x1.63ffffffe20b5p5 0x1.1687p-14 F +REG epsg:31287 2 OK 0x1.6fda9c28b1edp19 0x1.2b6ab89fcabf8p16 -0x1.68fcc324p5 0x1.1c61dfc2769d6p4 0x1.63ffffffeb64fp5 0x1.242p-18 F +REG epsg:31287 3 OK 0x1.4b74fb32c1bacp16 0x1.6aab8e399a5bp19 -0x1.658841ceap5 0x1.1c9195cc103ddp3 0x1.94000000f04dbp5 0x1.27e28p-13 F +REG epsg:31287 4 OK 0x1.5d426a880680ep19 0x1.6aa8a6fe81f38p19 -0x1.4264a0148p5 0x1.1c61dfc289143p4 0x1.94000000fb71bp5 0x1.68bdp-14 F +REG epsg:31288 0 OK 0x1.0656e1aaa5706p21 -0x1.f7ec870d189f2p8 0x1.d207c94968p7 0x1.bfffee8b71c61p4 0x1.084b48e1d06c2p-31 0x1.30558p-13 T +REG epsg:31288 1 OK 0x1.7e71942316b1ep20 -0x1.14f1c2bdc8d05p19 0x1.d5ab4341e8p7 0x1.6ffffee8f8f63p4 -0x1.3fffffc7ea5b8p2 0x1.22ap-17 F +REG epsg:31288 2 OK 0x1.4d7215c90b5fcp21 -0x1.24d9db940eb96p19 0x1.41905507ap8 0x1.07ffb81a5a2fcp5 -0x1.3ffffae805f22p2 0x1.556a2p-10 F +REG epsg:31288 3 OK 0x1.7e72c77f07922p20 0x1.1477438640277p19 0x1.2e51aad668p7 0x1.6ffffee8e6829p4 0x1.3fffffc8004cep2 0x1.058p-17 F +REG epsg:31288 4 OK 0x1.4d7343be124d7p21 0x1.2458682bfd8c3p19 0x1.dbc7a7c6b8p7 0x1.07ffb81911976p5 0x1.3ffffae8be107p2 0x1.50212p-10 F +REG epsg:31289 0 OK 0x1.2af6bab1f5ae4p21 -0x1.f7ec261baa5f9p8 0x1.03d97534dp8 0x1.efffee8aef072p4 0x1.0850eac2e47acp-31 0x1.401c8p-13 T +REG epsg:31289 1 OK 0x1.c7b161393359ep20 -0x1.14f18ec843aa2p19 0x1.03388efa6cp8 0x1.9ffffee8ed5d4p4 -0x1.3fffffc7e830ap2 0x1.33ap-17 F +REG epsg:31289 2 OK 0x1.7211e15271ea5p21 -0x1.24d9a18ba1654p19 0x1.5e7010f918p8 0x1.1fffb818c0ff8p5 -0x1.3ffffae804c74p2 0x1.640f6p-10 F +REG epsg:31289 3 OK 0x1.c7b294963dee3p20 0x1.14770fa7773fdp19 0x1.5f17afc088p7 0x1.9ffffee8dae8dp4 0x1.3fffffc7fe231p2 0x1.168p-17 F +REG epsg:31289 4 OK 0x1.72130f47b0ce3p21 0x1.24582e3ce8664p19 0x1.0ac3a8d2ap8 0x1.1fffb81778646p5 0x1.3ffffae8bcd8dp2 0x1.5ec6fp-10 F +REG epsg:3129 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.6p4 0x0.0p0 0x0.0p0 T +REG epsg:3129 1 OK -0x1.af3135ef97cp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3129 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.afffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3129 3 OK -0x1.af3135ef97cp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3129 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.afffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:31290 0 OK 0x1.4f9687a13259cp21 -0x1.f7ebbbea130cp8 0x1.1fffd90f3cp8 0x1.0ffff7453986ap5 0x1.08563c54d3084p-31 0x1.4f048p-13 T +REG epsg:31290 1 OK 0x1.08788c5b01bbep21 -0x1.14f155ddd5f88p19 0x1.1d09c28c7cp8 0x1.cffffee8e246dp4 -0x1.3fffffc7e61fbp2 0x1.43fp-17 F +REG epsg:31290 2 OK 0x1.96b19f78ab8a9p21 -0x1.24d961f8f40f1p19 0x1.7c7e0e39ap8 0x1.37ffb8174078cp5 -0x1.3ffffae80393ep2 0x1.71bcbp-10 F +REG epsg:31290 3 OK 0x1.0879260a05186p21 0x1.1476d6d5f109cp19 0x1.92ba4395d8p7 0x1.cffffee8cfd1dp4 0x1.3fffffc7fc12fp2 0x1.26b8p-17 F +REG epsg:31290 4 OK 0x1.96b2cd6e0b794p21 0x1.2457eec5fea53p19 0x1.28d1c0168p8 0x1.37ffb815f7dafp5 0x1.3ffffae8bb9a3p2 0x1.6c74ap-10 F +REG epsg:31291 0 OK 0x1.e80ec3554ae0dp20 -0x1.f7ec870d189f2p8 0x1.d207c94968p7 0x1.bfffee8b71c64p4 0x1.084b48e1d06c2p-31 0x1.30558p-13 T +REG epsg:31291 1 OK 0x1.59d2942316b1ep20 -0x1.14f1c2bdc8d05p19 0x1.d5ab4341e8p7 0x1.6ffffee8f8f63p4 -0x1.3fffffc7ea5b8p2 0x1.22ap-17 F +REG epsg:31291 2 OK 0x1.3b2295c90b5fcp21 -0x1.24d9db940eb96p19 0x1.41905507ap8 0x1.07ffb81a5a2fcp5 -0x1.3ffffae805f22p2 0x1.556a2p-10 F +REG epsg:31291 3 OK 0x1.59d3c77f07922p20 0x1.1477438640277p19 0x1.2e51aad668p7 0x1.6ffffee8e6829p4 0x1.3fffffc8004cep2 0x1.058p-17 F +REG epsg:31291 4 OK 0x1.3b23c3be124d7p21 0x1.2458682bfd8c3p19 0x1.dbc7a7c6b8p7 0x1.07ffb81911976p5 0x1.3ffffae8be107p2 0x1.50212p-10 F +REG epsg:31292 0 OK 0x1.e8107563eb5c7p20 -0x1.f7ec261baa5f9p8 0x1.03d97534dp8 0x1.efffee8aef06ep4 0x1.0850eac2e47acp-31 0x1.401c8p-13 T +REG epsg:31292 1 OK 0x1.59d461393359ep20 -0x1.14f18ec843aa2p19 0x1.03388efa6cp8 0x1.9ffffee8ed5d4p4 -0x1.3fffffc7e830ap2 0x1.33ap-17 F +REG epsg:31292 2 OK 0x1.3b23615271ea5p21 -0x1.24d9a18ba1654p19 0x1.5e7010f918p8 0x1.1fffb818c0ff8p5 -0x1.3ffffae804c74p2 0x1.640f6p-10 F +REG epsg:31292 3 OK 0x1.59d594963dee3p20 0x1.14770fa7773fdp19 0x1.5f17afc088p7 0x1.9ffffee8dae8dp4 0x1.3fffffc7fe231p2 0x1.168p-17 F +REG epsg:31292 4 OK 0x1.3b248f47b0ce3p21 0x1.24582e3ce8664p19 0x1.0ac3a8d2ap8 0x1.1fffb81778646p5 0x1.3ffffae8bcd8dp2 0x1.5ec6fp-10 F +REG epsg:31293 0 OK 0x1.e8120f4264b37p20 -0x1.f7ebbbea130cp8 0x1.1fffd90f3cp8 0x1.0ffff7453986ap5 0x1.08563c54d3084p-31 0x1.4f048p-13 T +REG epsg:31293 1 OK 0x1.59d618b60377bp20 -0x1.14f155ddd5f88p19 0x1.1d09c28c7cp8 0x1.cffffee8e246cp4 -0x1.3fffffc7e61fcp2 0x1.43e8p-17 F +REG epsg:31293 2 OK 0x1.3b241f78ab8a9p21 -0x1.24d961f8f40f1p19 0x1.7c7e0e39ap8 0x1.37ffb8174078cp5 -0x1.3ffffae80393ep2 0x1.71bcbp-10 F +REG epsg:31293 3 OK 0x1.59d74c140a30bp20 0x1.1476d6d5f109cp19 0x1.92ba4395d8p7 0x1.cffffee8cfd1dp4 0x1.3fffffc7fc12fp2 0x1.26b8p-17 F +REG epsg:31293 4 OK 0x1.3b254d6e0b794p21 0x1.2457eec5fea53p19 0x1.28d1c0168p8 0x1.37ffb815f7dafp5 0x1.3ffffae8bb9a3p2 0x1.6c74ap-10 F +REG epsg:31294 0 OK 0x1.24ad8d29ec6dfp17 -0x1.bf9024b683ef5p8 0x1.188fd9a9cp7 0x1.4aaaaaa8a26b5p3 -0x1.480ffe28ea5ep-25 0x1.1667fcp-8 T +REG epsg:31294 1 OK -0x1.8bd6a9b737084p18 -0x1.0f33bafe423ebp19 0x1.6eae87e3a8p7 0x1.555555504d23dp2 -0x1.40000027b6e7p2 0x1.4c8d2cp-8 F +REG epsg:31294 2 OK 0x1.583e85798bbe5p19 -0x1.0f36fcbb84ffap19 0x1.73e2fe87a8p7 0x1.eaaaaaa988a29p3 -0x1.4000002889bd3p2 0x1.43dcep-8 F +REG epsg:31294 3 OK -0x1.8bd14256998a6p18 0x1.0ec769a3646e8p19 0x1.9a03c8861p6 0x1.5555554efbb5fp2 0x1.3fffffd7f3c1fp2 0x1.dbe508p-9 F +REG epsg:31294 4 OK 0x1.5842fdeac6083p19 0x1.0ec387fef9d37p19 0x1.a44ab57cap6 0x1.eaaaaaa97db93p3 0x1.3fffffd7603fp2 0x1.c73268p-9 F +REG epsg:31295 0 OK 0x1.b75669c3ff731p18 -0x1.c8310b7e067bcp8 0x1.1bb8ca6f88p7 0x1.aaaaaaa9b4289p3 -0x1.4951d3716f68ap-25 0x1.1445e8p-8 T +REG epsg:31295 1 OK -0x1.9b5c04ce8c6e8p16 -0x1.0f34c8e9cddc7p19 0x1.6c85a4adf8p7 0x1.0aaaaaa9158fap3 -0x1.400000281ce2dp2 0x1.485d4cp-8 F +REG epsg:31295 2 OK 0x1.eabe50eb58c83p19 -0x1.0f380e273e46p19 0x1.7c56905858p7 0x1.2555555542a48p4 -0x1.400000288086cp2 0x1.443eccp-8 F +REG epsg:31295 3 OK -0x1.9b464b47c9dc8p16 0x1.0ec652d54d44ap19 0x1.95a7d9b5bp6 0x1.0aaaaaa89bea3p3 0x1.3fffffd7ac3ecp2 0x1.d1e9bp-9 F +REG epsg:31295 4 OK 0x1.eac2cceb9cc26p19 0x1.0ec26db109a91p19 0x1.b527a2d9ap6 0x1.255555555505ap4 0x1.3fffffd766a9bp2 0x1.c81b6p-9 F +REG epsg:31296 0 OK 0x1.6e2b027d36d6p19 -0x1.d0d754a765c62p8 0x1.2213557158p7 0x1.05555555644cfp4 -0x1.49ac94207c70ep-25 0x1.13ab94p-8 T +REG epsg:31296 1 OK 0x1.7c51557b6a1f4p17 -0x1.0f35d446b76cp19 0x1.6d8db28aa8p7 0x1.6aaaaaaa0c0d9p3 -0x1.4000002861c47p2 0x1.458478p-8 F +REG epsg:31296 2 OK 0x1.3e9f0a9a30f67p20 -0x1.0f391a80ac56bp19 0x1.87eff974f8p7 0x1.55555555bfd1ap4 -0x1.4000002855d05p2 0x1.460464p-8 F +REG epsg:31296 3 OK 0x1.7c5c3625f6768p17 0x1.0ec5359c49bf3p19 0x1.97adc0828p6 0x1.6aaaaaa9c1cfp3 0x1.3fffffd77c12dp2 0x1.cb226p-9 F +REG epsg:31296 4 OK 0x1.3ea1491e72074p20 0x1.0ec14f7bdf429p19 0x1.cc504a3p6 0x1.55555555e9fc2p4 0x1.3fffffd7847cbp2 0x1.cc5298p-9 F +REG epsg:31297 0 OK 0x1.86adeb691c01p18 0x1.86ae638bff1acp18 -0x1.79f8091b8p5 0x1.aaaaaaa8aaf33p3 0x1.7c00000072d91p5 0x1.c66cp-16 F +REG epsg:31297 1 OK 0x1.6d05dc55db168p15 0x1.2b843aff8d714p16 -0x1.90758243cp5 0x1.1c9195cca4cccp3 0x1.63ffffffe20b5p5 0x1.1687p-14 F +REG epsg:31297 2 OK 0x1.6fda9c28b1edp19 0x1.2b6ab89fcabf8p16 -0x1.68fcc324p5 0x1.1c61dfc2769d6p4 0x1.63ffffffeb64fp5 0x1.242p-18 F +REG epsg:31297 3 OK 0x1.4b74fb32c1bacp16 0x1.6aab8e399a5bp19 -0x1.658841ceap5 0x1.1c9195cc103ddp3 0x1.94000000f04dbp5 0x1.27e28p-13 F +REG epsg:31297 4 OK 0x1.5d426a880680ep19 0x1.6aa8a6fe81f38p19 -0x1.4264a0148p5 0x1.1c61dfc289143p4 0x1.94000000fb71bp5 0x1.68bdp-14 F +REG epsg:3130 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.7p4 0x0.0p0 0x0.0p0 T +REG epsg:3130 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3130 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.bfffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3130 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3130 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.bfffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:31300 0 OK 0x1.24d1cd7f04c0cp17 0x1.1e24e92daf03p21 -0x1.db8266ea4p4 0x1.16d819b816d14p2 0x1.17aaaaaa9bb71p6 0x1.bdbcp-15 F +REG epsg:31300 1 OK -0x1.313a94d3fd687p21 0x1.5c643662f6e1ap20 -0x1.e5769da1p4 -0x1.3a9adc1bc9535p5 0x1.b7555555216f4p5 0x1.ee18p-15 F +REG epsg:31300 2 OK 0x1.55d4ec07cd9c2p21 0x1.5c62297ac2944p20 -0x1.38e8e4545p6 0x1.8050e28937412p5 0x1.b7555555081c6p5 0x1.01b4cp-12 F +REG epsg:31300 3 OK -0x1.a7241b1434ba9p18 0x1.1438b4178d12p22 -0x1.3561d8a5ap5 -0x1.3a9adc1b54c38p5 0x1.53aaaaaabb44ap6 0x1.a2f8p-16 F +REG epsg:31300 4 OK 0x1.65fa9e0122c4cp19 0x1.1438f740eb4bfp22 -0x1.7072d5562p5 0x1.8050e28b05532p5 0x1.53aaaaaa9ef9ep6 0x1.e43p-15 F +REG epsg:3131 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3131 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3131 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3131 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3131 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3132 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.9p4 0x0.0p0 0x0.0p0 T +REG epsg:3132 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3132 2 OK 0x1.019d89af7cbep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dfffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3132 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3132 4 OK 0x1.019d89af7cbep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dfffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3133 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ap4 0x0.0p0 0x0.0p0 T +REG epsg:3133 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3133 2 OK 0x1.019d89af7cbep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.efffffff8abfap4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3133 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3133 4 OK 0x1.019d89af7cbep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.efffffff8abfap4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3134 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:3134 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3134 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abfap4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3134 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3134 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abfap4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3135 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.cp4 0x0.0p0 0x0.0p0 T +REG epsg:3135 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3135 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.07ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3135 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3135 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.07ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3136 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3136 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3136 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3136 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3136 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3137 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:3137 1 OK -0x1.af3135ef97cp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3137 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3137 3 OK -0x1.af3135ef97cp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3137 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:31370 0 OK 0x1.24d1ca9b146adp17 0x1.1e24e9d58c92fp21 -0x1.db9205b44p4 0x1.1784e6cf74743p2 0x1.17aaaabd9f576p6 0x1.bddep-15 F +REG epsg:31370 1 OK -0x1.313a951417d7p21 0x1.5c64380517a8p20 -0x1.e56ad7d58p4 -0x1.3a8542c82a0a5p5 0x1.b755557b28b13p5 0x1.ee2ep-15 F +REG epsg:31370 2 OK 0x1.55d4ebf8e32a6p21 0x1.5c622b2d1c6bap20 -0x1.38f549b41p6 0x1.80667c7b6f5d6p5 0x1.b755557b0f5e1p5 0x1.01bbcp-12 F +REG epsg:31370 3 OK -0x1.a7241b754437ep18 0x1.1438b461128f1p22 -0x1.3560f0c7p5 -0x1.3a8542c7b564fp5 0x1.53aaaabdbee58p6 0x1.a2f8p-16 F +REG epsg:31370 4 OK 0x1.65fa9c46e4722p19 0x1.1438f7954b06fp22 -0x1.7076a7c0cp5 0x1.80667c7d3d6b1p5 0x1.53aaaabda299fp6 0x1.e43ep-15 F +REG epsg:3138 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.fp4 0x0.0p0 0x0.0p0 T +REG epsg:3138 1 OK -0x1.af3135ef97cp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3138 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1fffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3138 3 OK -0x1.af3135ef97cp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3138 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1fffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3140 0 OK 0x1.ad0494144ff5fp16 0x1.144c230ab838cp17 -0x1.f54afc4f4p5 0x1.64p7 -0x1.2p4 -0x1.0p-30 F +REG epsg:3140 1 OK -0x1.a2ffa0ab4eeeep18 -0x1.9be6bdc1c727cp18 -0x1.425103474p6 0x1.597c40e4bd6fdp7 -0x1.6fffffbd1fa78p4 0x1.59a4p-15 F +REG epsg:3140 2 OK 0x1.3cc09bc82bd62p19 -0x1.9be6bdc15616ap18 -0x1.c82afcbb8p3 -0x1.617c40e3347cfp7 -0x1.6fffffbc3c17fp4 -0x1.4066p-15 F +REG epsg:3140 3 OK -0x1.c1af59756eea4p18 0x1.5058663ae02d2p19 -0x1.b7ca168dfp6 0x1.597c4167fb66ap7 -0x1.9fffff071ccbbp3 0x1.1e4p-16 F +REG epsg:3140 4 OK 0x1.4c186d5dd03f3p19 0x1.5058663b91dc8p19 -0x1.3def06df8p5 -0x1.617c41676f70ep7 -0x1.9fffff04ecadap3 -0x1.eddp-17 F +REG epsg:3141 0 OK 0x1.e8ab87945a3c3p18 0x1.b99a61311b58cp22 -0x1.7c7135b28p6 0x1.62p7 -0x1.8ffffffffffffp4 -0x1.0p-30 F +REG epsg:3141 1 OK -0x1.f5d27eeaf974p14 0x1.9703da4c37235p22 -0x1.2735c2e13p7 0x1.56f75a3f3d468p7 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:3141 2 OK 0x1.f85a1c12740fbp19 0x1.9703da4ad286p22 -0x1.4526267e7p6 -0x1.62f75a3f3d469p7 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:3141 3 OK -0x1.2e51043efd3bp16 0x1.dacd71a5d53aep22 -0x1.c7e051f7bp6 0x1.56f75a3f3d469p7 -0x1.4p4 0x1.0p-30 F +REG epsg:3141 4 OK 0x1.073ad455644d8p20 0x1.dacd71a481ae8p22 -0x1.50153c1f6p5 -0x1.62f75a3f3d469p7 -0x1.3ffffffffffffp4 0x1.8p-29 F +REG epsg:3142 0 OK 0x1.e8a498b976ffp18 0x1.b99aa5458c3f8p22 -0x1.d4c34eba4p5 -0x1.62p7 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:3142 1 OK -0x1.f635c8953bdep14 0x1.97042b6869596p22 -0x1.ba421b805p6 0x1.62f75a3f3d469p7 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:3142 2 OK 0x1.f856477d33f06p19 0x1.97042b671d52fp22 -0x1.86ee49b42p5 -0x1.56f75a3f3d469p7 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:3142 3 OK -0x1.2e695178c6148p16 0x1.dacda93286a8fp22 -0x1.271ca4c16p6 0x1.62f75a3f3d468p7 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:3142 4 OK 0x1.0738e1b608a32p20 0x1.dacda9314a8b9p22 -0x1.b53bf56fp2 -0x1.56f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3143 0 OK 0x1.e846f9d901e9fp20 0x1.e847de7976659p21 0x1.daee574cp0 0x1.658p7 -0x1.0ffffffff8028p4 0x1.6114p-15 F +REG epsg:3143 1 OK 0x1.645a450e89086p20 0x1.a3989cb0347c5p21 0x1.1b6cf4p1 0x1.5b0b07734dac8p7 -0x1.5fffffffddc27p4 0x1.4bf6p-15 F +REG epsg:3143 2 OK 0x1.3619de7cdb8b9p21 0x1.a398a56decf4ep21 0x1.1b6cf4p1 -0x1.600b07734dacep7 -0x1.5fffffffddc4ap4 0x1.4bfap-15 F +REG epsg:3143 3 OK 0x1.5d1bbd949048cp20 0x1.159210dbf8b0fp22 0x1.7bccef94p0 0x1.5b0b07735c6e7p7 -0x1.7fffffffd7707p3 0x1.7158p-15 F +REG epsg:3143 4 OK 0x1.39b91413f59f9p21 0x1.1592136b6ad46p22 0x1.7bccef98p0 -0x1.600b07735c6d7p7 -0x1.7fffffffd7731p3 0x1.715ap-15 F +REG epsg:3146 0 OK 0x1.8cbc51924fe84p22 0x1.6cc6e6a4f319dp6 -0x1.594ec1b34p6 0x1.1ffffffffcab5p4 -0x1.086d82dc48da4p-33 0x1.ec76p-14 T +REG epsg:3146 1 OK 0x1.6ad94d2ecae1ap22 -0x1.0ef4a6285a0a1p19 -0x1.a77b2bd63p6 0x1.a0000000e9b1dp3 -0x1.3fffffffed087p2 0x1.f3c3p-14 F +REG epsg:3146 2 OK 0x1.ae9f53a8516b5p22 -0x1.0ef4ac5f6679fp19 -0x1.4505f340fp6 0x1.6fffffff88ac8p4 -0x1.3ffffffffed6dp2 0x1.f12bp-14 F +REG epsg:3146 3 OK 0x1.6ad9547487a3ap22 0x1.0f0b850163192p19 -0x1.6f0668a9fp6 0x1.a0000000e0ae8p3 0x1.3fffffffbda26p2 0x1.e5b3p-14 F +REG epsg:3146 4 OK 0x1.ae9f510d20d0cp22 0x1.0f0b660c561c8p19 -0x1.0c91f06b3p6 0x1.6fffffff846ebp4 0x1.3fffffffac83ap2 0x1.d8c2p-14 F +REG epsg:31461 0 OK 0x1.6e3819bc9c26ap20 -0x1.a120d5abedb9ap8 0x1.7ff888092p6 0x1.7ffffffffac64p1 0x1.756412b0eb70ep-31 0x1.d9c26p-11 T +REG epsg:31461 1 OK 0x1.cd5afa3eea849p19 -0x1.0f319a40d0d0bp19 0x1.185bf1702p7 -0x1.fffffff8d4ae8p0 -0x1.3ffffffe74cep2 0x1.cfa12p-11 F +REG epsg:31461 2 OK 0x1.f5c2a4ad3daaap20 -0x1.0f31e264f1788p19 0x1.09ab70bb28p7 0x1.fffffffe2a496p2 -0x1.3ffffffe6f789p2 0x1.cf3d4p-11 F +REG epsg:31461 3 OK 0x1.cd5a516033ac2p19 0x1.0ec9760752f6ep19 0x1.0d1e46e6cp6 -0x1.fffffff8b33dap0 0x1.3fffffffddc1bp2 0x1.dd01ep-11 F +REG epsg:31461 4 OK 0x1.f5c31c5b6c0b8p20 0x1.0ec977fc1cb74p19 0x1.df77c2668p5 0x1.fffffffe2cbacp2 0x1.3fffffffe336ep2 0x1.dd042p-11 F +REG epsg:31462 0 OK 0x1.312f0903f2ba9p21 -0x1.a175c70c1c6e6p8 0x1.7a693e1fbp6 0x1.7ffffffffe322p2 0x1.782b97293f155p-31 0x1.d9b5cp-11 T +REG epsg:31462 1 OK 0x1.dad3736e07a5ep20 -0x1.0f31a8a5a6415p19 0x1.10208bbbp7 0x1.00000007310cap0 -0x1.3ffffffe72a3ap2 0x1.cf786p-11 F +REG epsg:31462 2 OK 0x1.74f44f6c49757p21 -0x1.0f31f10ccce7cp19 0x1.0c62910008p7 0x1.5fffffff15e8ep3 -0x1.3ffffffe6ef35p2 0x1.cf33p-11 F +REG epsg:31462 3 OK 0x1.dad31f218ecb3p20 0x1.0ec96f72a5b3dp19 0x1.f94e17e3ep5 0x1.000000074bd2bp0 0x1.3fffffffe000ap2 0x1.dd032p-11 F +REG epsg:31462 4 OK 0x1.74f48b54fa3cp21 0x1.0ec97124d1f45p19 0x1.ea5380612p5 0x1.5fffffff1646fp3 0x1.3fffffffe3bc4p2 0x1.dd044p-11 F +REG epsg:31463 0 OK 0x1.ab4205661c1dfp21 -0x1.a1cb3497fc6b6p8 0x1.7b75392cp6 0x1.1fffffffff833p3 0x1.79eb2185db613p-31 0x1.d9aep-11 T +REG epsg:31463 1 OK 0x1.677cb643a0be8p21 -0x1.0f31b2823b74fp19 0x1.0b2b0a86bp7 0x1.00000001cdbcbp2 -0x1.3ffffffe70f7bp2 0x1.cf58ap-11 F +REG epsg:31463 2 OK 0x1.ef074b9be47c8p21 -0x1.0f31fb139ccb7p19 0x1.12623627cp7 0x1.bfffffff16ae1p3 -0x1.3ffffffe6eeebp2 0x1.cf32ep-11 F +REG epsg:31463 3 OK 0x1.677c8c289e238p21 0x1.0ec9641ddf858p19 0x1.e5773bb64p5 0x1.00000001d2bf1p2 0x1.3fffffffe1bd8p2 0x1.dd03ep-11 F +REG epsg:31463 4 OK 0x1.ef07878ff2659p21 0x1.0ec965a6374bap19 0x1.0128adbfap6 0x1.bfffffff1630ep3 0x1.3fffffffe3bcdp2 0x1.dd044p-11 F +REG epsg:31464 0 OK 0x1.12aa80a9d2ee7p22 -0x1.a220e259caf66p8 0x1.831bbd173p6 0x1.7fffffffffee8p3 0x1.7aa177ccd5177p-31 0x1.d9aaap-11 T +REG epsg:31464 1 OK 0x1.e18fb3844f4bbp21 -0x1.0f31b7cfa481p19 0x1.097ee8dc38p7 0x1.c0000001cf3e9p2 -0x1.3ffffffe6fcb6p2 0x1.cf424p-11 F +REG epsg:31464 2 OK 0x1.348d231a3791cp22 -0x1.0f32007257972p19 0x1.1ba62a5d7p7 0x1.0fffffff8bb91p4 -0x1.3ffffffe6f6adp2 0x1.cf3c8p-11 F +REG epsg:31464 3 OK 0x1.e18f896e472bfp21 0x1.0ec95410f4728p19 0x1.dec5e5fd6p5 0x1.c0000001d28dcp2 0x1.3fffffffe2f75p2 0x1.dd03ap-11 F +REG epsg:31464 4 OK 0x1.348d4116cae0ap22 0x1.0ec955885e21p19 0x1.13b03e782p6 0x1.0fffffff8b0d3p4 0x1.3fffffffe338ap2 0x1.dd046p-11 F +REG epsg:31465 0 OK 0x1.4fb3fe0ddec1ep22 -0x1.a276942eb4abcp8 0x1.91576b3e5p6 0x1.e00000000059fp3 0x1.7a4e1a02673d4p-31 0x1.d9ac6p-11 T +REG epsg:31465 1 OK 0x1.2dd15863a779cp22 -0x1.0f31b88a28edep19 0x1.0b1d533a1p7 0x1.40000000e863p3 -0x1.3ffffffe6f1fp2 0x1.cf35p-11 F +REG epsg:31465 2 OK 0x1.71969f4303443p22 -0x1.0f32012538adcp19 0x1.2827ecd12p7 0x1.3fffffff8c1a5p4 -0x1.3ffffffe70678p2 0x1.cf504p-11 F +REG epsg:31465 3 OK 0x1.2dd14357ff3d3p22 0x1.0ec93f5728b6fp19 0x1.e53ec9472p5 0x1.40000000e9303p3 0x1.3fffffffe3acfp2 0x1.dd04p-11 F +REG epsg:31465 4 OK 0x1.7196bd3efeec6p22 0x1.0ec940d696924p19 0x1.2cb370f75p6 0x1.3fffffff8b015p4 0x1.3fffffffe2301p2 0x1.dd044p-11 F +REG epsg:31466 0 OK 0x1.312f0903f2ba9p21 -0x1.a175c70c1c6e6p8 0x1.7a693e1fbp6 0x1.7ffffffffe322p2 0x1.782b97293f155p-31 0x1.d9b5cp-11 T +REG epsg:31466 1 OK 0x1.dad3736e07a5ep20 -0x1.0f31a8a5a6415p19 0x1.10208bbbp7 0x1.00000007310cap0 -0x1.3ffffffe72a3ap2 0x1.cf786p-11 F +REG epsg:31466 2 OK 0x1.74f44f6c49757p21 -0x1.0f31f10ccce7cp19 0x1.0c62910008p7 0x1.5fffffff15e8ep3 -0x1.3ffffffe6ef35p2 0x1.cf33p-11 F +REG epsg:31466 3 OK 0x1.dad31f218ecb3p20 0x1.0ec96f72a5b3dp19 0x1.f94e17e3ep5 0x1.000000074bd2bp0 0x1.3fffffffe000ap2 0x1.dd032p-11 F +REG epsg:31466 4 OK 0x1.74f48b54fa3cp21 0x1.0ec97124d1f45p19 0x1.ea5380612p5 0x1.5fffffff1646fp3 0x1.3fffffffe3bc4p2 0x1.dd044p-11 F +REG epsg:31467 0 OK 0x1.ab4205661c1dfp21 -0x1.a1cb3497fc6b6p8 0x1.7b75392cp6 0x1.1fffffffff833p3 0x1.79eb2185db613p-31 0x1.d9aep-11 T +REG epsg:31467 1 OK 0x1.677cb643a0be8p21 -0x1.0f31b2823b74fp19 0x1.0b2b0a86bp7 0x1.00000001cdbcbp2 -0x1.3ffffffe70f7bp2 0x1.cf58ap-11 F +REG epsg:31467 2 OK 0x1.ef074b9be47c8p21 -0x1.0f31fb139ccb7p19 0x1.12623627cp7 0x1.bfffffff16ae1p3 -0x1.3ffffffe6eeebp2 0x1.cf32ep-11 F +REG epsg:31467 3 OK 0x1.677c8c289e238p21 0x1.0ec9641ddf858p19 0x1.e5773bb64p5 0x1.00000001d2bf1p2 0x1.3fffffffe1bd8p2 0x1.dd03ep-11 F +REG epsg:31467 4 OK 0x1.ef07878ff2659p21 0x1.0ec965a6374bap19 0x1.0128adbfap6 0x1.bfffffff1630ep3 0x1.3fffffffe3bcdp2 0x1.dd044p-11 F +REG epsg:31468 0 OK 0x1.12aa80a9d2ee7p22 -0x1.a220e259caf66p8 0x1.831bbd173p6 0x1.7fffffffffee8p3 0x1.7aa177ccd5177p-31 0x1.d9aaap-11 T +REG epsg:31468 1 OK 0x1.e18fb3844f4bbp21 -0x1.0f31b7cfa481p19 0x1.097ee8dc38p7 0x1.c0000001cf3e9p2 -0x1.3ffffffe6fcb6p2 0x1.cf424p-11 F +REG epsg:31468 2 OK 0x1.348d231a3791cp22 -0x1.0f32007257972p19 0x1.1ba62a5d7p7 0x1.0fffffff8bb91p4 -0x1.3ffffffe6f6adp2 0x1.cf3c8p-11 F +REG epsg:31468 3 OK 0x1.e18f896e472bfp21 0x1.0ec95410f4728p19 0x1.dec5e5fd6p5 0x1.c0000001d28dcp2 0x1.3fffffffe2f75p2 0x1.dd03ap-11 F +REG epsg:31468 4 OK 0x1.348d4116cae0ap22 0x1.0ec955885e21p19 0x1.13b03e782p6 0x1.0fffffff8b0d3p4 0x1.3fffffffe338ap2 0x1.dd046p-11 F +REG epsg:31469 0 OK 0x1.4fb3fe0ddec1ep22 -0x1.a276942eb4abcp8 0x1.91576b3e5p6 0x1.e00000000059fp3 0x1.7a4e1a02673d4p-31 0x1.d9ac6p-11 T +REG epsg:31469 1 OK 0x1.2dd15863a779cp22 -0x1.0f31b88a28edep19 0x1.0b1d533a1p7 0x1.40000000e863p3 -0x1.3ffffffe6f1fp2 0x1.cf35p-11 F +REG epsg:31469 2 OK 0x1.71969f4303443p22 -0x1.0f32012538adcp19 0x1.2827ecd12p7 0x1.3fffffff8c1a5p4 -0x1.3ffffffe70678p2 0x1.cf504p-11 F +REG epsg:31469 3 OK 0x1.2dd14357ff3d3p22 0x1.0ec93f5728b6fp19 0x1.e53ec9472p5 0x1.40000000e9303p3 0x1.3fffffffe3acfp2 0x1.dd04p-11 F +REG epsg:31469 4 OK 0x1.7196bd3efeec6p22 0x1.0ec940d696924p19 0x1.2cb370f75p6 0x1.3fffffff8b015p4 0x1.3fffffffe2301p2 0x1.dd044p-11 F +REG epsg:3147 0 OK 0x1.e8651924fe83ap18 0x1.6cc6e6a4f319dp6 -0x1.594ec1b34p6 0x1.1ffffffffcab4p4 -0x1.086d82dc48da4p-33 0x1.ec76p-14 T +REG epsg:3147 1 OK -0x1.ae59689a8f2cp15 -0x1.0ef4a6285a0a1p19 -0x1.a77b2bd63p6 0x1.a0000000e9b2p3 -0x1.3fffffffed087p2 0x1.f3c3p-14 F +REG epsg:3147 2 OK 0x1.01a54ea145ad6p20 -0x1.0ef4ac5f6679fp19 -0x1.4505f340fp6 0x1.6fffffff88ac8p4 -0x1.3ffffffffed6dp2 0x1.f12bp-14 F +REG epsg:3147 3 OK -0x1.ae55c5bc2e3p15 0x1.0f0b850163192p19 -0x1.6f0668a9fp6 0x1.a0000000e0ae8p3 0x1.3fffffffbda26p2 0x1.e5b3p-14 F +REG epsg:3147 4 OK 0x1.01a544348342fp20 0x1.0f0b660c561c8p19 -0x1.0c91f06b3p6 0x1.6fffffff846ebp4 0x1.3fffffffac83ap2 0x1.d8c2p-14 F +REG epsg:3148 0 OK 0x1.e8b0c679b69d5p18 -0x1.3cdec250e9053p8 0x1.e789b0b82p5 0x1.a400000000001p6 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:3148 1 OK -0x1.aa1f34e84cf3p15 -0x1.0f0a4f483abbdp19 0x1.c6caece42p5 0x1.9000000000002p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:3148 2 OK 0x1.01a95d2933e6p20 -0x1.0f0a4f4ae2e0bp19 0x1.0353e1db38p7 0x1.b800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3148 3 OK -0x1.aa28ddbd206cp15 0x1.0ebb184467353p19 0x1.96992e3cp0 0x1.9000000000001p6 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3148 4 OK 0x1.01a9aa8d9b3b1p20 0x1.0ebb18470dd67p19 0x1.299d587b6p6 0x1.b800000000001p6 0x1.3fffffffffffcp2 0x1.0p-30 F +REG epsg:3149 0 OK 0x1.e8c5172fdcb05p18 -0x1.3cde244af850cp8 0x1.b49ecbeb2p6 0x1.bcp6 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:3149 1 OK -0x1.a9744fd7541ep15 -0x1.0f09c7c75107ap19 0x1.868b863c7p6 0x1.a800000000001p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3149 2 OK 0x1.01ae2e69608c1p20 -0x1.0f09c7ca7dd2bp19 0x1.71237fda88p7 0x1.d000000000001p6 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:3149 3 OK -0x1.a97df841777bp15 0x1.0eba90eaaf715p19 0x1.5301a38cp5 0x1.a800000000001p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3149 4 OK 0x1.01ae7bd037132p20 0x1.0eba90edda6d4p19 0x1.029e89023p7 0x1.d000000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3150 0 OK 0x1.8cbc801c0831fp22 0x1.463ea31df1b09p6 -0x1.65ae1caacp6 0x1.2p4 -0x1.2f74bf1dcf458p-63 0x1.53ep-19 T +REG epsg:3150 1 OK 0x1.6ad97b92869bep22 -0x1.0ef5e8fa08cbcp19 -0x1.b09394d2ep6 0x1.a0000000ea229p3 -0x1.3fffffffea5fdp2 0x1.50cp-19 F +REG epsg:3150 2 OK 0x1.ae9f84acc396bp22 -0x1.0ef5e704b7588p19 -0x1.54dbdb573p6 0x1.6fffffff8a9c4p4 -0x1.3fffffffea4e8p2 0x1.522p-19 F +REG epsg:3150 3 OK 0x1.6ad9808bee7a8p22 0x1.0f0a4cb894aaep19 -0x1.77b58de3p6 0x1.a0000000ea1edp3 0x1.3fffffffea5e5p2 0x1.50cp-19 F +REG epsg:3150 4 OK 0x1.ae9f7fb2c628ap22 0x1.0f0a4ac31df1p19 -0x1.1bfde1e42p6 0x1.6fffffff8a9e4p4 0x1.3fffffffea4dp2 0x1.522p-19 F +REG epsg:3151 0 OK 0x1.e86801c0831f6p18 0x1.463ea31df1b09p6 -0x1.65ae1caacp6 0x1.2000000000001p4 -0x1.2f74bf1dcf459p-63 0x1.53cp-19 T +REG epsg:3151 1 OK -0x1.ae4236bcb214p15 -0x1.0ef5e8fa08cbcp19 -0x1.b09394d2ep6 0x1.a0000000ea228p3 -0x1.3fffffffea5fdp2 0x1.50cp-19 F +REG epsg:3151 2 OK 0x1.01a612b30e5acp20 -0x1.0ef5e704b7588p19 -0x1.54dbdb573p6 0x1.6fffffff8a9c4p4 -0x1.3fffffffea4e8p2 0x1.522p-19 F +REG epsg:3151 3 OK -0x1.ae3fba08c2cp15 0x1.0f0a4cb894aaep19 -0x1.77b58de3p6 0x1.a0000000ea1edp3 0x1.3fffffffea5e5p2 0x1.50cp-19 F +REG epsg:3151 4 OK 0x1.01a5fecb18a26p20 0x1.0f0a4ac31df1p19 -0x1.1bfde1e42p6 0x1.6fffffff8a9e4p4 0x1.3fffffffea4dp2 0x1.51ep-19 F +REG epsg:3152 0 OK 0x1.87522e48e8a72p16 -0x1.8cc41b226809dp22 0x0.0p0 0x1.20ecb5350092dp4 0x0.0p0 0x0.0p0 T +REG epsg:3152 1 OK -0x1.bc58cedc230e8p18 -0x1.aea3f1cd686fbp22 0x0.0p0 0x1.a1d96a6aeba68p3 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3152 2 OK 0x1.4000f3004bb1p19 -0x1.aea3f1cd686fbp22 0x0.0p0 0x1.70ecb5348b526p4 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3152 3 OK -0x1.bc58cedc230e8p18 -0x1.6ae4447767a3fp22 0x0.0p0 0x1.a1d96a6aeba68p3 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3152 4 OK 0x1.4000f3004bb1p19 -0x1.6ae4447767a3fp22 0x0.0p0 0x1.70ecb5348b526p4 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:31528 0 OK 0x1.e80af7fdb29dcp18 0x1.1fe2c69a4cd48p3 -0x1.6f1e4656cp4 -0x1.dffffffffffffp3 0x0.0p0 -0x1.0p-30 T +REG epsg:31528 1 OK -0x1.af612db0adbp15 -0x1.0ee280312a10dp19 -0x1.1d350d9p-1 -0x1.3ffffffffffffp4 -0x1.3fffffffffffcp2 -0x1.0p-30 F +REG epsg:31528 2 OK 0x1.018085391d142p20 -0x1.0ee2802f953adp19 -0x1.57b8926ep5 -0x1.4p3 -0x1.4p2 -0x1.8p-29 F +REG epsg:31528 3 OK -0x1.af60e768302ep15 0x1.0ee4bff1c7cccp19 0x1.030c02ap0 -0x1.3fffffffffffep4 0x1.4p2 0x1.0p-30 F +REG epsg:31528 4 OK 0x1.01808307571b5p20 0x1.0ee4bff032f01p19 -0x1.4b2b58a14p5 -0x1.3ffffffffffffp3 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:31529 0 OK 0x1.e808f8aeb120dp18 0x1.1fe31416cf39p3 -0x1.87b174de6p5 -0x1.2000000000002p3 0x0.0p0 0x0.0p0 T +REG epsg:31529 1 OK -0x1.af75ac4c35a7p15 -0x1.0ee2c94890baep19 -0x1.9aea7842cp4 -0x1.c000000000001p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:31529 2 OK 0x1.01802984db7eap20 -0x1.0ee2c946eedc5p19 -0x1.15e9a2972p6 -0x1.0p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:31529 3 OK -0x1.af7566033dbcp15 0x1.0ee50909c8371p19 -0x1.81d009268p4 -0x1.cp3 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:31529 4 OK 0x1.0180275315d1ep20 0x1.0ee509082651dp19 -0x1.0fa303f84p6 -0x1.0000000000002p2 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:3153 0 OK 0x1.e848p19 0x1.6d8c1d68821cp19 0x0.0p0 -0x1.f8p6 0x1.9e00000000002p5 0x0.0p0 F +REG epsg:3153 1 OK -0x1.c62a75cd29c5cp19 -0x1.ab1541aa2717p18 0x0.0p0 -0x1.279cb3f010beap7 0x1.31ffffffffffep5 0x0.0p0 F +REG epsg:3153 2 OK 0x1.65ae9d734a716p21 -0x1.ab1541aa2717cp18 0x0.0p0 -0x1.a0c6981fde82bp6 0x1.31ffffffffffcp5 0x0.0p0 F +REG epsg:3153 3 OK -0x1.8bb2c0898714p14 0x1.25c515169618ep21 0x0.0p0 -0x1.279cb3f010beap7 0x1.05p6 0x0.0p0 F +REG epsg:3153 4 OK 0x1.ee76cb02261c4p20 0x1.25c515169618dp21 0x0.0p0 -0x1.a0c6981fde82bp6 0x1.04fffffffffffp6 0x0.0p0 F +REG epsg:3154 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:3154 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.24p7 -0x1.4p2 0x0.0p0 F +REG epsg:3154 2 OK 0x1.018fa874f57eep20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:3154 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.24p7 0x1.4p2 0x0.0p0 F +REG epsg:3154 4 OK 0x1.018fa874f57eep20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:3155 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:3155 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p7 -0x1.4p2 0x0.0p0 F +REG epsg:3155 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.04p7 -0x1.4p2 0x0.0p0 F +REG epsg:3155 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p7 0x1.4p2 0x0.0p0 F +REG epsg:3155 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.04p7 0x1.4p2 0x0.0p0 F +REG epsg:3156 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:3156 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3156 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:3156 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0cp7 0x1.4p2 0x0.0p0 F +REG epsg:3156 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:3157 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3157 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:3157 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3157 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 0x1.4p2 0x0.0p0 F +REG epsg:3157 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3158 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:3158 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:3158 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:3158 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:3158 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:3159 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:3159 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:3159 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:3159 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:3159 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:3160 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:3160 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:3160 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:3160 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:3160 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:31600 0 OK 0x1.e869bb98faff6p18 0x1.e89d440402185p18 -0x1.24bbd60ccp4 0x1.96478a4fd92c8p4 0x1.6f33333333332p5 0x1.0p-29 F +REG epsg:31600 1 OK -0x1.9da354851e908p16 -0x1.c7ab6d8875ecp14 -0x1.e97ffb74ap5 0x1.235290d1d9941p4 0x1.4733333333336p5 0x1.0p-29 F +REG epsg:31600 2 OK 0x1.0e0f10d807b7cp20 -0x1.c7a72a67ede4p14 -0x1.1d596a13cp5 0x1.049e41e6ec625p5 0x1.4733333333338p5 -0x1.0p-30 F +REG epsg:31600 3 OK -0x1.60d97da6c48p12 0x1.07bcc377ba148p20 0x1.239f0cfp-2 0x1.235290d1d9942p4 0x1.9733333333337p5 -0x1.0p-29 F +REG epsg:31600 4 OK 0x1.eb2b72ecf9b69p19 0x1.07bcb3e866ba4p20 0x1.593c15268p4 0x1.049e41e6ec626p5 0x1.9733333333334p5 -0x1.0p-29 F +REG epsg:3161 0 OK 0x1.c61ap19 0x1.302211d43489bp23 0x0.0p0 -0x1.54p6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:3161 1 OK -0x1.31406ed1e242ep20 0x1.fcd09e1624663p22 0x0.0p0 -0x1.9730da8022b5bp6 0x1.77ffffffffe3ap3 0x0.0p0 F +REG epsg:3161 2 OK 0x1.7bad3768f121bp21 0x1.fcd09e1624663p22 0x0.0p0 -0x1.10cf257fdd4a5p6 0x1.77ffffffffe32p3 0x0.0p0 F +REG epsg:3161 3 OK -0x1.c3725ca0e0a14p18 0x1.69339a1fc1aep23 0x0.0p0 -0x1.9730da8022b5bp6 0x1.4dfffffffffebp5 0x0.0p0 F +REG epsg:3161 4 OK 0x1.1b7b4b941c145p21 0x1.69339a1fc1aep23 0x0.0p0 -0x1.10cf257fdd4a5p6 0x1.4dfffffffffebp5 0x0.0p0 F +REG epsg:3162 0 OK 0x1.c61ap19 0x1.302211d43489bp23 0x0.0p0 -0x1.54p6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:3162 1 OK -0x1.31406ed1e242ep20 0x1.fcd09e1624663p22 0x0.0p0 -0x1.9730da8022b5bp6 0x1.77ffffffffe3ap3 0x0.0p0 F +REG epsg:3162 2 OK 0x1.7bad3768f121bp21 0x1.fcd09e1624663p22 0x0.0p0 -0x1.10cf257fdd4a5p6 0x1.77ffffffffe32p3 0x0.0p0 F +REG epsg:3162 3 OK -0x1.c3725ca0e0a14p18 0x1.69339a1fc1aep23 0x0.0p0 -0x1.9730da8022b5bp6 0x1.4dfffffffffebp5 0x0.0p0 F +REG epsg:3162 4 OK 0x1.1b7b4b941c145p21 0x1.69339a1fc1aep23 0x0.0p0 -0x1.10cf257fdd4a5p6 0x1.4dfffffffffebp5 0x0.0p0 F +REG epsg:3163 0 OK 0x1.86ap18 0x1.24f8p18 0x0.0p0 0x1.4cp7 -0x1.57fffffffff13p4 0x0.0p0 F +REG epsg:3163 1 OK 0x1.a6e53baa80df8p17 0x1.bed02b779f868p16 0x0.0p0 0x1.486ad95cf6aa6p7 -0x1.72aaaaaaaa9c3p4 0x0.0p0 F +REG epsg:3163 2 OK 0x1.1ce6b1155fc82p19 0x1.bed02b779f868p16 0x0.0p0 0x1.4f9526a30955bp7 -0x1.72aaaaaaaa9c3p4 0x0.0p0 F +REG epsg:3163 3 OK 0x1.9ea299d095322p17 0x1.d81f11c7d22c8p18 0x0.0p0 0x1.486ad95cf6aa6p7 -0x1.3d5555555545cp4 0x0.0p0 F +REG epsg:3163 4 OK 0x1.1ef7598bdab38p19 0x1.d81f11c7d22c8p18 0x0.0p0 0x1.4f9526a30955bp7 -0x1.3d5555555545cp4 0x0.0p0 F +REG epsg:3164 0 OK 0x1.e8484186a71fp18 0x1.b997a0f1c7eb4p22 -0x1.f5967b2d6p5 0x1.49fffffffffffp7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:3164 1 OK -0x1.fbf5a7ea6c2p14 0x1.970125f824eep22 -0x1.efae81c6ep5 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3164 2 OK 0x1.f827eec6455b5p19 0x1.970125f82403ep22 -0x1.ee51350c6p5 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:3164 3 OK -0x1.2fdcd31f3f0b8p16 0x1.dacaa5fb0dad8p22 -0x1.f52edb008p5 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3164 4 OK 0x1.0721edf57bed2p20 0x1.dacaa5fb0ccedp22 -0x1.f3b3d7d02p5 0x1.5508a5c0c2b98p7 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:3165 0 OK -0x1.566515a46e66ep8 -0x1.312bc7eccd2f9p8 -0x1.e4eeb81dep5 0x1.4ce285a0be511p7 -0x1.6450a84be3f51p4 -0x1.0p-29 F +REG epsg:3165 1 OK -0x1.b14bfe61eac5ep16 -0x1.b357b88ee3c28p16 -0x1.8aca8c624p5 0x1.4ab940fef1e6p7 -0x1.7450a84be3f56p4 0x0.0p0 F +REG epsg:3165 2 OK 0x1.ae9f33eb2b256p16 -0x1.b357ee2534ad1p16 -0x1.e9e19a33ep5 0x1.4f0bca428abc2p7 -0x1.7450a84be3f59p4 0x0.0p0 F +REG epsg:3165 3 OK -0x1.b77afab3007f3p16 0x1.adcbb5dbbd2cep16 -0x1.df9aa1aap5 0x1.4ab940fef1e6p7 -0x1.5450a84be3f4cp4 0x0.0p0 F +REG epsg:3165 4 OK 0x1.b4ce31212ff6cp16 0x1.adcbeb46f116bp16 -0x1.2008204c4p6 0x1.4f0bca428abc2p7 -0x1.5450a84be3f43p4 0x0.0p0 F +REG epsg:3166 0 OK -0x1.4ebdf0c583f8ep8 -0x1.348b8fca8ffb5p8 -0x1.e4ef3a6d2p5 0x1.4ce28f5c28f5cp7 -0x1.6450c83fb71f7p4 0x1.0p-30 F +REG epsg:3166 1 OK -0x1.b14456f765c28p16 -0x1.b35b1899c2445p16 -0x1.8acb0c846p5 0x1.4ab94ab276e68p7 -0x1.7450c83fb71ffp4 0x1.0p-29 F +REG epsg:3166 2 OK 0x1.aea6daca63edcp16 -0x1.b35b4e3014224p16 -0x1.e9e21bf7ep5 0x1.4f0bd405db05p7 -0x1.7450c83fb7206p4 0x1.0p-30 F +REG epsg:3166 3 OK -0x1.b77353e633215p16 0x1.adc85606b8f44p16 -0x1.df9b2457ap5 0x1.4ab94ab276e67p7 -0x1.5450c83fb71fp4 -0x1.0p-29 F +REG epsg:3166 4 OK 0x1.b4d5d89e2073bp16 0x1.adc88b71edb91p16 -0x1.200862889p6 0x1.4f0bd405db05p7 -0x1.5450c83fb71fcp4 -0x1.0p-29 F +REG epsg:3167 0 OK -0x1.c550bdc75842bp13 0x1.57a295f5af7dep14 0x0.0p0 0x1.99p6 0x1.ffffffffffd07p1 0x0.0p0 F +REG epsg:3167 1 OK -0x1.4b0df0c7d43bp15 -0x1.55667abee1ac3p12 0x0.0p0 0x1.84f37f5af8063p6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG epsg:3167 2 OK 0x1.9c4f7f9e17e24p13 -0x1.579057a89b68bp12 0x0.0p0 0x1.ad0c80a507f9fp6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG epsg:3167 3 OK -0x1.471cd52bae99bp15 0x1.83e82fd7cf6fcp15 0x0.0p0 0x1.84f37f5af8063p6 0x1.1fffffffffe84p3 0x0.0p0 F +REG epsg:3167 4 OK 0x1.9709e4eaeace9p13 0x1.83a7ebaad0c4bp15 0x0.0p0 0x1.ad0c80a507f9fp6 0x1.1fffffffffe84p3 0x0.0p0 F +REG epsg:3168 0 OK 0x1.cdc5ada75139ep18 0x1.b00d2cf2f4ed4p18 0x0.0p0 0x1.99p6 0x1.ffffffffffd07p1 0x0.0p0 F +REG epsg:3168 1 OK -0x1.56e0b290ba428p16 -0x1.ad3dde2e946cfp16 0x0.0p0 0x1.84f37f5af8063p6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG epsg:3168 2 OK 0x1.f6f92ea4bdf1p19 -0x1.aff63cfe09b41p16 0x0.0p0 0x1.ad0c80a507f9fp6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG epsg:3168 3 OK -0x1.2f3ab59547a78p16 0x1.e7b6e18edd85p19 0x0.0p0 0x1.84f37f5af8063p6 0x1.1fffffffffe84p3 0x0.0p0 F +REG epsg:3168 4 OK 0x1.f550f800908a2p19 0x1.e766144860ca1p19 0x0.0p0 0x1.ad0c80a507f9fp6 0x1.1fffffffffe84p3 0x0.0p0 F +REG epsg:3169 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.3ep7 -0x1.9p4 0x0.0p0 F +REG epsg:3169 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3169 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3169 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3169 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3170 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.4ap7 -0x1.9p4 0x0.0p0 F +REG epsg:3170 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3170 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3170 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3170 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31700 0 OK 0x1.e8665de121c16p18 0x1.e8500fd35fea1p18 -0x1.20e5953b8p5 0x1.9p4 0x1.7p5 0x0.0p0 F +REG epsg:31700 1 OK -0x1.9e917cbaa3148p16 -0x1.cbbf772d7d2ep14 -0x1.96c141c78p5 0x1.1cd5e1cf3d2a8p4 0x1.47ffffffffffcp5 0x1.0p-30 F +REG epsg:31700 2 OK 0x1.0e1c44b46b4d4p20 -0x1.cbbba03ba07ap14 -0x1.bddec1134p4 0x1.01950f18616acp5 0x1.47ffffffffffcp5 0x1.0p-30 F +REG epsg:31700 3 OK -0x1.595ebd1f2f6cp12 0x1.07b1aab193cacp20 -0x1.5a49a56acp5 0x1.1cd5e1cf3d2a8p4 0x1.97fffffffffffp5 0x1.0p-30 F +REG epsg:31700 4 OK 0x1.eb191f4c32975p19 0x1.07b19cb24049fp20 -0x1.820434548p4 0x1.01950f18616acp5 0x1.97ffffffffffep5 0x1.0p-30 F +REG epsg:3171 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:3171 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3171 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3171 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3171 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3172 0 OK 0x1.e87f1f84ef1a9p18 0x1.b999a07e264c9p22 -0x1.ddccb76dep5 0x1.56p7 -0x1.8fffffffffffep4 0x1.0p-29 F +REG epsg:3172 1 OK -0x1.f88bce16333p14 0x1.9703265ac9e62p22 -0x1.75a02794fp6 0x1.4af75a3f3d469p7 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:3172 2 OK 0x1.f8437e3dfd927p19 0x1.9703265a04386p22 -0x1.c56afd6cp5 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:3172 3 OK -0x1.2effd2ddab768p16 0x1.dacca4b094b32p22 -0x1.0baab4d4bp6 0x1.4af75a3f3d469p7 -0x1.4p4 0x1.8p-29 F +REG epsg:3172 4 OK 0x1.072f8d1909718p20 0x1.dacca4afd888ap22 -0x1.b103692b4p4 0x1.6108a5c0c2b97p7 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:3174 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.51d2e5de15ca7p6 0x1.6c8d43d039694p5 0x0.0p0 F +REG epsg:3174 1 OK 0x1.13d9c4d0d418p17 0x1.18ba69b098e56p18 0x0.0p0 -0x1.7934c824f364bp6 0x1.35699e0e73606p5 0x0.0p0 F +REG epsg:3174 2 OK 0x1.c5ccc765e57ccp20 0x1.18ba69b098e3cp18 0x0.0p0 -0x1.2a71039738303p6 0x1.35699e0e73605p5 0x0.0p0 F +REG epsg:3174 3 OK 0x1.409e6d3be1c8cp18 0x1.b931c58f2b025p20 0x0.0p0 -0x1.7934c824f364bp6 0x1.a3b0e991ff71ap5 0x0.0p0 F +REG epsg:3174 4 OK 0x1.982064b1078d9p20 0x1.b931c58f2b022p20 0x0.0p0 -0x1.2a71039738303p6 0x1.a3b0e991ff71ap5 0x0.0p0 F +REG epsg:3175 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.4cfe9813879c4p6 0x1.6c8d43d039694p5 0x0.0p0 F +REG epsg:3175 1 OK 0x1.13d9c4d0d41a4p17 0x1.18ba69b098e3cp18 0x0.0p0 -0x1.74607a5a65368p6 0x1.35699e0e73605p5 0x0.0p0 F +REG epsg:3175 2 OK 0x1.c5ccc765e57dp20 0x1.18ba69b098e56p18 0x0.0p0 -0x1.259cb5ccaa02p6 0x1.35699e0e73606p5 0x0.0p0 F +REG epsg:3175 3 OK 0x1.409e6d3be1c9cp18 0x1.b931c58f2b022p20 0x0.0p0 -0x1.74607a5a65368p6 0x1.a3b0e991ff71ap5 0x0.0p0 F +REG epsg:3175 4 OK 0x1.982064b1078ddp20 0x1.b931c58f2b025p20 0x0.0p0 -0x1.259cb5ccaa02p6 0x1.a3b0e991ff71ap5 0x0.0p0 F +REG epsg:3176 0 OK 0x1.e8b43f423bb8bp18 -0x1.3cdea9ee2a993p8 0x1.11877594ep6 0x1.a800000000001p6 0x0.0p0 -0x1.0p-30 T +REG epsg:3176 1 OK -0x1.aa0223bd5151p15 -0x1.0f0a3a5f0b322p19 0x1.f835a457cp5 0x1.940000001cd07p6 -0x1.3fffffffeb42bp2 -0x1.cp-27 F +REG epsg:3176 2 OK 0x1.01aa31066e444p20 -0x1.0f0a3a61c9c3p19 0x1.1481e6b878p7 0x1.bbffffffe2eabp6 -0x1.3fffffffeb09bp2 0x1.cp-27 F +REG epsg:3176 3 OK -0x1.aa0bcc80247cp15 0x1.0ebb0361441abp19 0x1.f0fce929p2 0x1.940000001cd24p6 0x1.3fffffffeb484p2 -0x1.ap-27 F +REG epsg:3176 4 OK 0x1.01aa7e6b41f4dp20 0x1.0ebb0364011b3p19 0x1.4bf975d9ep6 0x1.bbffffffe2e8fp6 0x1.3fffffffeb0f9p2 0x1.ap-27 F +REG epsg:3177 0 OK 0x1.e84d7fb005629p19 0x1.48a040c304527p1 -0x1.3934424dp4 0x1.1p4 0x1.2f74bf1dcfcacp-67 0x1.8p-29 T +REG epsg:3177 1 OK 0x1.b452353fcfb4p18 -0x1.0e0c2f8ad5103p19 -0x1.8b2da053cp4 0x1.80000000ebdf6p3 -0x1.3fffffffeabecp2 -0x1.0p-29 F +REG epsg:3177 2 OK 0x1.7b38f26954e1fp20 -0x1.0e0c2f8b1d1abp19 -0x1.108856c7p4 0x1.5fffffff89f3cp4 -0x1.3fffffffeab91p2 0x1.0p-29 F +REG epsg:3177 3 OK 0x1.b45237c13bd6cp18 0x1.0e0cd3d9957e3p19 -0x1.83fe2445cp4 0x1.80000000ebdf3p3 0x1.3fffffffeabebp2 0x0.0p0 F +REG epsg:3177 4 OK 0x1.7b38f1c8f35a4p20 0x1.0e0cd3d9dd892p19 -0x1.0958db4b8p4 0x1.5fffffff89f3dp4 0x1.3fffffffeab91p2 0x0.0p0 F +REG epsg:3178 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:3178 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:3178 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:3178 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:3178 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:3179 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:3179 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:3179 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:3179 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:3179 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:3180 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:3180 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:3180 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:3180 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:3180 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:3181 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:3181 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:3181 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:3181 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:3181 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:3182 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:3182 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:3182 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:3182 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:3182 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:3183 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:3183 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p5 -0x1.4p2 0x0.0p0 F +REG epsg:3183 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:3183 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p5 0x1.4p2 0x0.0p0 F +REG epsg:3183 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:31838 0 OK 0x1.e84871177addcp18 -0x1.66419bd6323adp1 0x1.92c4a0cp2 0x1.67fffffffffffp5 0x1.2f74bf1dcfcaep-68 0x0.0p0 T +REG epsg:31838 1 OK -0x1.ad70634c2fbep15 -0x1.0ee3a35627103p19 0x1.9580fe8ap2 0x1.4000000000001p5 -0x1.4000000000002p2 -0x1.0p-28 F +REG epsg:31838 2 OK 0x1.018fbba67cefep20 -0x1.0ee3a35629f28p19 0x1.a92660bp2 0x1.8ffffffffffffp5 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:31838 3 OK -0x1.ad707926e47bp15 0x1.0ee2f036d9731p19 0x1.76446d82p2 0x1.4p5 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:31838 4 OK 0x1.018fbc5552de6p20 0x1.0ee2f036dc556p19 0x1.89e9cfcp2 0x1.8ffffffffffffp5 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:31839 0 OK 0x1.e84846636ac8p18 -0x1.66419b4798fa2p1 0x1.9c6340dep2 0x1.97fffffffffffp5 0x0.0p0 0x1.0p-30 T +REG epsg:31839 1 OK -0x1.ad71b2412169p15 -0x1.0ee3a2ea104abp19 0x1.a2c2759fp2 0x1.6ffffffffffffp5 -0x1.4000000000002p2 -0x1.0p-28 F +REG epsg:31839 2 OK 0x1.018fb0c3f8f3p20 -0x1.0ee3a2ea12163p19 0x1.aefcc02p2 0x1.cp5 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:31839 3 OK -0x1.ad71c81bd7c1p15 0x1.0ee2efcac2f45p19 0x1.8385e4aap2 0x1.6ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:31839 4 OK 0x1.018fb172ced2fp20 0x1.0ee2efcac4bfdp19 0x1.8fc02f36p2 0x1.cp5 0x1.4p2 0x1.0p-29 F +REG epsg:3184 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 -0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:3184 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p5 -0x1.4p2 0x0.0p0 F +REG epsg:3184 2 OK 0x1.018fa874f57f6p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p5 -0x1.4p2 0x0.0p0 F +REG epsg:3184 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p5 0x1.4p2 0x0.0p0 F +REG epsg:3184 4 OK 0x1.018fa874f57f6p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p5 0x1.4p2 0x0.0p0 F +REG epsg:3185 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:3185 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p5 -0x1.4p2 0x0.0p0 F +REG epsg:3185 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp4 -0x1.4p2 0x0.0p0 F +REG epsg:3185 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p5 0x1.4p2 0x0.0p0 F +REG epsg:3185 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp4 0x1.4p2 0x0.0p0 F +REG epsg:3186 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:3186 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p5 -0x1.4p2 0x0.0p0 F +REG epsg:3186 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:3186 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p5 0x1.4p2 0x0.0p0 F +REG epsg:3186 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6000000000001p4 0x1.4p2 0x0.0p0 F +REG epsg:3187 0 OK 0x1.e847fffffffeep18 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:3187 1 OK -0x1.ad750e9eb002p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:3187 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:3187 3 OK -0x1.ad750e9eb002p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:3187 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:3188 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3188 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:3188 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:3188 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:3188 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:3189 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3189 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:3189 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG epsg:3189 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:3189 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG epsg:3190 0 OK 0x1.86c5f5b5c8d92p17 0x1.49c3a0720a8bep1 -0x1.bf88d8864p4 0x1.2000000000001p3 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:3190 1 OK -0x1.5ac4d8c691c9cp18 -0x1.0efb9f223384cp19 -0x1.1e5106e9cp5 0x1.00000001d7967p2 -0x1.3fffffffeac0fp2 -0x1.0p-28 F +REG epsg:3190 2 OK 0x1.70c5675e237dp19 -0x1.0efb9f22afd3fp19 -0x1.69b2ab6acp4 0x1.bfffffff13d2ap3 -0x1.3fffffffeab6dp2 0x1.0p-29 F +REG epsg:3190 3 OK -0x1.5ac4d642f5e46p18 0x1.0efc4402a2756p19 -0x1.1ab948796p5 0x1.00000001d7965p2 0x1.3fffffffeac0cp2 -0x1.0p-29 F +REG epsg:3190 4 OK 0x1.70c5661c3f1e1p19 0x1.0efc44031ec53p19 -0x1.62832f84cp4 0x1.bfffffff13d2ap3 0x1.3fffffffeab6ap2 0x1.0p-29 F +REG epsg:31900 0 OK 0x1.e8423f66a1a9p18 -0x1.3313ac99cc5cap1 0x1.614e9862p2 0x1.8000000000001p5 0x1.2f74bf1dcfcaep-68 -0x1.0p-30 T +REG epsg:31900 1 OK -0x1.ada214eaf3ep15 -0x1.0ee398b691b35p19 0x1.ebeb2c79p2 0x1.580000003aa3ep5 -0x1.3fffffffeadf8p2 -0x1.0p-29 F +REG epsg:31900 2 OK 0x1.018e3055e0371p20 -0x1.0ee398b66c278p19 0x1.d83450b2p1 0x1.a7ffffffc5639p5 -0x1.3fffffffeae28p2 -0x1.0p-30 F +REG epsg:31900 3 OK -0x1.ada227a6a131p15 0x1.0ee2ff2e04d05p19 0x1.d124f9afp2 0x1.580000003aa3fp5 0x1.3fffffffeadf8p2 0x0.0p0 F +REG epsg:31900 4 OK 0x1.018e30ebba774p20 0x1.0ee2ff2ddf44cp19 0x1.a2a7e8e4p1 0x1.a7ffffffc5639p5 0x1.3fffffffeae2bp2 -0x1.0p-30 F +REG epsg:31901 0 OK 0x1.e8423ecfc6e93p18 -0x1.333321a84dd39p1 0x1.614e9862p2 0x1.8000000000001p5 0x1.2f74bf1dcfcaep-68 -0x1.0p-30 T +REG epsg:31901 1 OK -0x1.af5e40f9cc54p15 -0x1.0eff58bfa8318p19 0x1.ebeb2c79p2 0x1.580000003aa3ep5 -0x1.3fffffffeadf8p2 -0x1.0p-29 F +REG epsg:31901 2 OK 0x1.019c116ae91d6p20 -0x1.0eff58bf82a1ep19 0x1.d83450b2p1 0x1.a7ffffffc5639p5 -0x1.3fffffffeae29p2 -0x1.0p-30 F +REG epsg:31901 3 OK -0x1.af5e53b764ebp15 0x1.0efebf2760e8fp19 0x1.d124f9afp2 0x1.580000003aa3fp5 0x1.3fffffffeadf8p2 0x0.0p0 F +REG epsg:31901 4 OK 0x1.019c1200d2b77p20 0x1.0efebf273b599p19 0x1.a2a7e8e4p1 0x1.a7ffffffc5639p5 0x1.3fffffffeae2bp2 -0x1.0p-30 F +REG epsg:3191 0 OK 0x1.86c20b887e4a3p17 0x1.49c397ded3db3p1 -0x1.9750a0278p4 0x1.6p3 0x1.c72f1eacb7b02p-67 0x1.0p-29 T +REG epsg:3191 1 OK -0x1.5ac6bfe9131bep18 -0x1.0efb9811d6792p19 -0x1.04ebcbdacp5 0x1.80000001d7a05p2 -0x1.3fffffffeac08p2 -0x1.0p-29 F +REG epsg:3191 2 OK 0x1.70c465d573e72p19 -0x1.0efb981245f7bp19 -0x1.4ca91b294p4 0x1.ffffffff13d79p3 -0x1.3fffffffeab75p2 0x0.0p0 F +REG epsg:3191 3 OK -0x1.5ac6bd6575188p18 0x1.0efc3cf24128ep19 -0x1.01540d88cp5 0x1.80000001d7a01p2 0x1.3fffffffeac04p2 -0x1.0p-28 F +REG epsg:3191 4 OK 0x1.70c4649390c94p19 0x1.0efc3cf2b0a8p19 -0x1.45799f65cp4 0x1.ffffffff13d7bp3 0x1.3fffffffeab72p2 0x0.0p0 F +REG epsg:3192 0 OK 0x1.86be16bd253cbp17 0x1.49c3903b93d3fp1 -0x1.737de766cp4 0x1.a000000000001p3 0x1.c72f1eacb7b03p-67 0x1.0p-30 T +REG epsg:3192 1 OK -0x1.5ac8ade17bcbcp18 -0x1.0efb91c72746ep19 -0x1.db4c94c9p4 0x1.00000000ebd52p3 -0x1.3fffffffeabfep2 -0x1.0p-29 F +REG epsg:3192 2 OK 0x1.70c36268a7885p19 -0x1.0efb91c789d1ep19 -0x1.3419fdcf8p4 0x1.1fffffff89ee7p4 -0x1.3fffffffeab7bp2 0x0.0p0 F +REG epsg:3192 3 OK -0x1.5ac8ab5ddb9e8p18 0x1.0efc36a78e2cfp19 -0x1.d41d185c8p4 0x1.00000000ebd51p3 0x1.3fffffffeabffp2 -0x1.0p-28 F +REG epsg:3192 4 OK 0x1.70c36126c5abcp19 0x1.0efc36a7f0b85p19 -0x1.2cea8228cp4 0x1.1fffffff89ee7p4 0x1.3fffffffeab7ep2 0x1.0p-28 F +REG epsg:3193 0 OK 0x1.86ba188f98d9fp17 0x1.49c3898aac2a7p1 -0x1.541bda46cp4 0x1.dfffffffffffep3 0x1.c72f1eacb7b03p-67 0x1.0p-30 T +REG epsg:3193 1 OK -0x1.5acaa215be254p18 -0x1.0efb8c441c30dp19 -0x1.b10f88edp4 0x1.40000000ebda3p3 -0x1.3fffffffeabf7p2 -0x1.0p-29 F +REG epsg:3193 2 OK 0x1.70c25d68a62d5p19 -0x1.0efb8c4471a9p19 -0x1.200cfc158p4 0x1.3fffffff89f11p4 -0x1.3fffffffeab88p2 0x1.8p-29 F +REG epsg:3193 3 OK -0x1.5aca9f921bc34p18 0x1.0efc31247fc5p19 -0x1.a9e00cb2p4 0x1.40000000ebda1p3 0x1.3fffffffeabf6p2 -0x1.0p-29 F +REG epsg:3193 4 OK 0x1.70c25c26c5923p19 0x1.0efc3124d53d7p19 -0x1.18dd80874p4 0x1.3fffffff89f12p4 0x1.3fffffffeab85p2 0x1.0p-29 F +REG epsg:3194 0 OK 0x1.86b6123ea136ap17 0x1.49c383ce3300ap1 -0x1.3934424dp4 0x1.1p4 0x1.2f74bf1dcfcacp-68 0x1.8p-29 T +REG epsg:3194 1 OK -0x1.5acc9be9daeaap18 -0x1.0efb878a6d379p19 -0x1.8b2da053cp4 0x1.80000000ebdf5p3 -0x1.3fffffffeabecp2 -0x1.0p-29 F +REG epsg:3194 2 OK 0x1.70c15726d5551p19 -0x1.0efb878ab581fp19 -0x1.108856c7p4 0x1.5fffffff89f3dp4 -0x1.3fffffffeab91p2 0x1.0p-30 F +REG epsg:3194 3 OK -0x1.5acc996636498p18 0x1.0efc2c6acdf35p19 -0x1.83fe2445cp4 0x1.80000000ebdf4p3 0x1.3fffffffeabebp2 0x0.0p0 F +REG epsg:3194 4 OK 0x1.70c155e4f5faep19 0x1.0efc2c6b163e1p19 -0x1.0958db4b8p4 0x1.5fffffff89f3dp4 0x1.3fffffffeab91p2 0x0.0p0 F +REG epsg:3195 0 OK 0x1.86b2050b8fef7p17 0x1.49c37f07f2408p1 -0x1.22cf83764p4 0x1.3000000000001p4 0x1.2f74bf1dcfcadp-67 0x1.0p-29 T +REG epsg:3195 1 OK -0x1.5ace9ac011f32p18 -0x1.0efb839b93922p19 -0x1.69b2ab6acp4 0x1.c0000000ebe4ap3 -0x1.3fffffffeabe4p2 -0x1.0p-29 F +REG epsg:3195 2 OK 0x1.70c04ff4fed0ap19 -0x1.0efb839bce97bp19 -0x1.0590e4cecp4 0x1.7fffffff89f65p4 -0x1.3fffffffeab97p2 -0x1.0p-30 F +REG epsg:3195 3 OK -0x1.5ace983c6b094p18 0x1.0efc287bf1efbp19 -0x1.62832f84cp4 0x1.c0000000ebe49p3 0x1.3fffffffeabe4p2 0x0.0p0 F +REG epsg:3195 4 OK 0x1.70c04eb320b6dp19 0x1.0efc287c2cf58p19 -0x1.fcc2d2cp3 0x1.7fffffff89f67p4 0x1.3fffffffeab98p2 -0x1.0p-29 F +REG epsg:3196 0 OK 0x1.86adf239dbfaep17 0x1.49c37b39670bbp1 -0x1.10f499968p4 0x1.5000000000001p4 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:3196 1 OK -0x1.5ad09df9135f6p18 -0x1.0efb8078c9372p19 -0x1.4ca91b294p4 0x1.0000000075f4dp4 -0x1.3fffffffeabdbp2 -0x1.0p-29 F +REG epsg:3196 2 OK 0x1.70bf482537447p19 -0x1.0efb8078f6e53p19 -0x1.fe542369p3 0x1.9fffffff89f91p4 -0x1.3fffffffeab9fp2 0x1.0p-30 F +REG epsg:3196 3 OK -0x1.5ad09b756a23ap18 0x1.0efc255925b13p19 -0x1.45799f65cp4 0x1.0000000075f4dp4 0x1.3fffffffeabdbp2 -0x1.0p-29 F +REG epsg:3196 4 OK 0x1.70bf46e35a699p19 0x1.0efc2559535fbp19 -0x1.eff52c9bp3 0x1.9fffffff89f94p4 0x1.3fffffffeab9fp2 0x1.0p-29 F +REG epsg:31965 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:31965 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:31965 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:31965 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:31965 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:31966 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:31966 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:31966 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:31966 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:31966 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:31967 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:31967 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:31967 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:31967 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:31967 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:31968 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:31968 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:31968 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:31968 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:31968 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:31969 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:31969 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:31969 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:31969 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:31969 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:3197 0 OK 0x1.86a9db0ebcd11p17 0x1.49c37863c145fp1 -0x1.03a9162bcp4 0x1.7p4 0x1.2f74bf1dcfcacp-67 0x1.8p-29 T +REG epsg:3197 1 OK -0x1.5ad2a4f4313e6p18 -0x1.0efb7e23087b9p19 -0x1.3419fdcf8p4 0x1.2000000075f78p4 -0x1.3fffffffeabd5p2 -0x1.8p-29 F +REG epsg:3197 2 OK 0x1.70be4009c48f2p19 -0x1.0efb7e2328c4p19 -0x1.faabb9228p3 0x1.bfffffff89fb9p4 -0x1.3fffffffeabaap2 -0x1.0p-30 F +REG epsg:3197 3 OK -0x1.5ad2a27085a86p18 0x1.0efc2303638dep19 -0x1.2cea8228cp4 0x1.2000000075f78p4 0x1.3fffffffeabd3p2 0x1.0p-29 F +REG epsg:3197 4 OK 0x1.70be3ec7e8f1ep19 0x1.0efc230383d64p19 -0x1.ec4cc258p3 0x1.bfffffff89fbcp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG epsg:31970 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:31970 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:31970 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:31970 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:31970 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:31971 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:31971 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:31971 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:31971 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:31971 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:31972 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:31972 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:31972 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:31972 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:31972 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:31973 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:31973 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:31973 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:31973 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:31973 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:31974 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:31974 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:31974 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:31974 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:31974 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:31975 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:31975 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:31975 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:31975 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:31975 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:31976 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:31976 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:31976 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:31976 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:31976 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:31977 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.44p6 -0x1.9p4 0x0.0p0 F +REG epsg:31977 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31977 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31977 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31977 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31978 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG epsg:31978 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31978 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31978 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31978 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31979 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:31979 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31979 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31979 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:31979 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3198 0 OK 0x1.86a5c0d0c50ccp17 0x1.49c37687e3365p1 -0x1.f5e23d49p3 0x1.8ffffffffffffp4 0x1.2f74bf1dcfcadp-68 0x1.0p-29 T +REG epsg:3198 1 OK -0x1.5ad4af0f91aa8p18 -0x1.0efb7c9b0bc5p19 -0x1.200cfc158p4 0x1.4000000075fa1p4 -0x1.3fffffffeabcbp2 0x1.0p-30 F +REG epsg:3198 2 OK 0x1.70bd37f50425ep19 -0x1.0efb7c9b1e9d3p19 -0x1.0014d7668p4 0x1.dfffffff89fe3p4 -0x1.3fffffffeabb2p2 0x0.0p0 F +REG epsg:3198 3 OK -0x1.5ad4ac8be3b3p18 0x1.0efc217b65eb1p19 -0x1.18dd80874p4 0x1.4000000075fa1p4 0x1.3fffffffeabc9p2 0x1.0p-30 F +REG epsg:3198 4 OK 0x1.70bd36b329c43p19 0x1.0efc217b78c37p19 -0x1.f1cab7fdp3 0x1.dfffffff89fe7p4 0x1.3fffffffeabbp2 0x1.0p-29 F +REG epsg:31980 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.f8p5 -0x1.9p4 0x0.0p0 F +REG epsg:31980 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31980 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31980 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31980 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31981 0 OK 0x1.e848000000016p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.c800000000001p5 -0x1.9p4 0x0.0p0 F +REG epsg:31981 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:31981 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31981 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31981 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31982 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 -0x1.98p5 -0x1.9p4 0x0.0p0 F +REG epsg:31982 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31982 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31982 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31982 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31983 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.68p5 -0x1.9p4 0x0.0p0 F +REG epsg:31983 1 OK -0x1.fbe5023e2a96p14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31983 2 OK 0x1.f8272811f154bp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31983 3 OK -0x1.2fd8271ed48c8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31983 4 OK 0x1.07218271ed48cp20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31984 0 OK 0x1.e847ffffffff5p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.38p5 -0x1.9p4 0x0.0p0 F +REG epsg:31984 1 OK -0x1.fbe5023e2aaap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31984 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31984 3 OK -0x1.2fd8271ed492p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31984 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31985 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 -0x1.08p5 -0x1.9p4 0x0.0p0 F +REG epsg:31985 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31985 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31985 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31985 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31986 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:31986 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:31986 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:31986 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:31986 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:31987 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:31987 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:31987 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:31987 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:31987 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:31988 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:31988 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:31988 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:31988 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:31988 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:31989 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:31989 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:31989 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:31989 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:31989 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:3199 0 OK 0x1.e85af9278460bp18 0x1.49a61411963c8p1 -0x1.bf88d8864p4 0x1.2000000000001p3 0x1.c72f1eacb7b03p-67 0x1.0p-30 T +REG epsg:3199 1 OK -0x1.ace230fc31b7p15 -0x1.0ee357203628cp19 -0x1.1e5106e9cp5 0x1.0000000000003p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3199 2 OK 0x1.01948e2b9dd2fp20 -0x1.0ee35720b276dp19 -0x1.69b2ab6acp4 0x1.c000000000001p3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3199 3 OK -0x1.ace21ce11fe5p15 0x1.0ee3fbf1df08fp19 -0x1.1ab948796p5 0x1.0000000000003p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3199 4 OK 0x1.01948d8aba0f4p20 0x1.0ee3fbf25b578p19 -0x1.62832f84cp4 0x1.cp3 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:31990 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:31990 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:31990 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:31990 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:31990 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:31991 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:31991 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:31991 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:31991 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:31991 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:31992 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.44p6 -0x1.9p4 0x0.0p0 F +REG epsg:31992 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31992 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31992 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31992 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31993 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG epsg:31993 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31993 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31993 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31993 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31994 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:31994 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31994 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31994 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:31994 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31995 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.f8p5 -0x1.9p4 0x0.0p0 F +REG epsg:31995 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31995 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31995 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31995 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31996 0 OK 0x1.e848000000016p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.c800000000001p5 -0x1.9p4 0x0.0p0 F +REG epsg:31996 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:31996 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31996 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31996 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31997 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 -0x1.98p5 -0x1.9p4 0x0.0p0 F +REG epsg:31997 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31997 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31997 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31997 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31998 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.68p5 -0x1.9p4 0x0.0p0 F +REG epsg:31998 1 OK -0x1.fbe5023e2a96p14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31998 2 OK 0x1.f8272811f154bp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31998 3 OK -0x1.2fd8271ed48c8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31998 4 OK 0x1.07218271ed48cp20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31999 0 OK 0x1.e847ffffffff5p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.38p5 -0x1.9p4 0x0.0p0 F +REG epsg:31999 1 OK -0x1.fbe5023e2aaap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31999 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:31999 3 OK -0x1.2fd8271ed492p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:31999 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:3200 0 OK 0x1.6e328fbbece81p20 0x1.1cacc87cda05fp20 0x1.157feb03p4 0x1.68p5 0x1.03fffffffffbcp5 0x1.0p-30 F +REG epsg:3200 1 OK 0x1.bdc9bee66150ap19 0x1.32ac95af0b4e2p19 0x1.28ef10a4p5 0x1.38928b4db1cbap5 0x1.b7fffffffff39p4 0x1.0p-29 F +REG epsg:3200 2 OK 0x1.fd8040ee324bcp20 0x1.32ac7aa30edd2p19 0x1.b0623a344p4 0x1.976d74b24e346p5 0x1.b7fffffffff38p4 0x1.0p-30 F +REG epsg:3200 3 OK 0x1.dbe0c2b7eed9fp19 0x1.a7ad04b1436c6p20 0x1.a5e3597dp2 0x1.38928b4db1cbbp5 0x1.2bfffffffffd8p5 0x1.0p-30 F +REG epsg:3200 4 OK 0x1.ee74bd46d0fb2p20 0x1.a7ad11f64b178p20 -0x1.37af74b8p1 0x1.976d74b24e346p5 0x1.2bfffffffffdcp5 -0x1.0p-30 F +REG epsg:32000 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 -0x1.08p5 -0x1.9p4 0x0.0p0 F +REG epsg:32000 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:32000 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:32000 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:32000 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:32001 0 OK 0x1.e848000000005p20 0x1.31c66175b2204p18 0x0.0p0 -0x1.b600000000001p6 0x1.7edddddddd48bp5 0x0.0p0 F +REG epsg:32001 1 OK 0x1.49dc28b078534p20 -0x1.27446f29eaa17p18 0x0.0p0 -0x1.c03be7769007bp6 0x1.7122222222219p5 0x0.0p0 F +REG epsg:32001 2 OK 0x1.4359eba7c3d72p21 -0x1.27446f29eaa17p18 0x0.0p0 -0x1.abc418896ff86p6 0x1.7122222222219p5 0x0.0p0 F +REG epsg:32001 3 OK 0x1.540d36b23d7ecp20 0x1.cfa82df47c937p19 0x0.0p0 -0x1.c03be7769007bp6 0x1.8c9999999928cp5 0x0.0p0 F +REG epsg:32001 4 OK 0x1.3e4164a6e1415p21 0x1.cfa82df47c937p19 0x0.0p0 -0x1.abc418896ff86p6 0x1.8c9999999928cp5 0x0.0p0 F +REG epsg:32002 0 OK 0x1.e848000000005p20 0x1.6d0f14451e298p18 0x0.0p0 -0x1.b600000000001p6 0x1.76dddddddddd5p5 0x0.0p0 F +REG epsg:32002 1 OK 0x1.2a36bbaace49ep20 -0x1.5e8dc5ef80071p18 0x0.0p0 -0x1.c1fde20665f2fp6 0x1.667777777776dp5 0x0.0p0 F +REG epsg:32002 2 OK 0x1.532ca22a98dbdp21 -0x1.5e8dc5ef80071p18 0x0.0p0 -0x1.aa021df99a0d1p6 0x1.667777777776bp5 0x0.0p0 F +REG epsg:32002 3 OK 0x1.38389edac30f6p20 0x1.1539ab4e07355p20 0x0.0p0 -0x1.c1fde20665f2fp6 0x1.8744444443c61p5 0x0.0p0 F +REG epsg:32002 4 OK 0x1.4c2bb0929e791p21 0x1.1539ab4e07355p20 0x0.0p0 -0x1.aa021df99a0d1p6 0x1.8744444443c61p5 0x0.0p0 F +REG epsg:32003 0 OK 0x1.e848000000005p20 0x1.ab46ad5a6d109p18 0x0.0p0 -0x1.b600000000001p6 0x1.699999999998fp5 0x0.0p0 F +REG epsg:32003 1 OK 0x1.08ea87bcc82c6p20 -0x1.98729460d70cp18 0x0.0p0 -0x1.c39fc45f44299p6 0x1.5666666666655p5 0x0.0p0 F +REG epsg:32003 2 OK 0x1.63d2bc219beaap21 -0x1.98729460d70cp18 0x0.0p0 -0x1.a8603ba0bbd67p6 0x1.5666666666655p5 0x0.0p0 F +REG epsg:32003 3 OK 0x1.1b12d76b22272p20 0x1.44e20ffe1425ep20 0x0.0p0 -0x1.c39fc45f44299p6 0x1.7ccccccccc316p5 0x0.0p0 F +REG epsg:32003 4 OK 0x1.5abe944a6eed3p21 0x1.44e20ffe1425ep20 0x0.0p0 -0x1.a8603ba0bbd67p6 0x1.7ccccccccc316p5 0x0.0p0 F +REG epsg:32005 0 OK 0x1.e848000000005p20 0x1.07ede325ba70cp18 0x0.0p0 -0x1.9p6 0x1.5099999999986p5 0x0.0p0 F +REG epsg:32005 1 OK 0x1.60bb8bf5de012p20 -0x1.0195ec406b82ep18 0x0.0p0 -0x1.97fe570c30a39p6 0x1.44bbbbbbbbba6p5 0x0.0p0 F +REG epsg:32005 2 OK 0x1.37ea3a0510ffcp21 -0x1.0195ec406b82ep18 0x0.0p0 -0x1.8801a8f3cf5c7p6 0x1.44bbbbbbbbba6p5 0x0.0p0 F +REG epsg:32005 3 OK 0x1.66eea2345f04ap20 0x1.8efbbc1e5c323p19 0x0.0p0 -0x1.97fe570c30a39p6 0x1.5c77777777769p5 0x0.0p0 F +REG epsg:32005 4 OK 0x1.34d0aee5d07ep21 0x1.8efbbc1e5c323p19 0x0.0p0 -0x1.8801a8f3cf5c7p6 0x1.5c77777777769p5 0x0.0p0 F +REG epsg:32006 0 OK 0x1.e848000000005p20 0x1.6ca91487a9ccdp18 0x0.0p0 -0x1.8ep6 0x1.458888888887p5 0x0.0p0 F +REG epsg:32006 1 OK 0x1.2b9f96f40ff98p20 -0x1.611010b897926p18 0x0.0p0 -0x1.98d08e5c9d95fp6 0x1.35222222221fdp5 0x0.0p0 F +REG epsg:32006 2 OK 0x1.52783485f804p21 -0x1.611010b897926p18 0x0.0p0 -0x1.832f71a3626a1p6 0x1.35222222221fdp5 0x0.0p0 F +REG epsg:32006 3 OK 0x1.36e9d0fe2830dp20 0x1.144b208e2f1fep20 0x0.0p0 -0x1.98d08e5c9d95fp6 0x1.55eeeeeeeeedcp5 0x0.0p0 F +REG epsg:32006 4 OK 0x1.4cd31780ebe86p21 0x1.144b208e2f1fep20 0x0.0p0 -0x1.832f71a3626a1p6 0x1.55eeeeeeeeedcp5 0x0.0p0 F +REG epsg:32007 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:32007 1 OK -0x1.5dd1a2f05f053p20 -0x1.af96b40da635ep20 0x0.0p0 -0x1.e6acb8641fdf4p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG epsg:32007 2 OK 0x1.28fad1782f834p21 -0x1.af96b40da635dp20 0x0.0p0 -0x1.b5fdf2468acb2p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG epsg:32007 3 OK -0x1.27c9ee60ea9d3p20 0x1.caa3fd77a6229p20 0x0.0p0 -0x1.e6acb863facd7p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG epsg:32007 4 OK 0x1.0df6f730754f2p21 0x1.caa3fd77a622ap20 0x0.0p0 -0x1.b5fdf246afddp6 0x1.3dffffff8c1dbp5 0x0.0p0 F +REG epsg:32008 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:32008 1 OK -0x1.5dd1a2f05f053p20 -0x1.af96b40da635ep20 0x0.0p0 -0x1.eb020db97534dp6 0x1.dbffffff8f108p4 0x0.0p0 F +REG epsg:32008 2 OK 0x1.28fad1782f82bp21 -0x1.af96b40da635ep20 0x0.0p0 -0x1.ba53479be020cp6 0x1.dbffffff8f108p4 0x0.0p0 F +REG epsg:32008 3 OK -0x1.27c9ee60ea9d3p20 0x1.caa3fd77a6229p20 0x0.0p0 -0x1.eb020db95023p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG epsg:32008 4 OK 0x1.0df6f730754ebp21 0x1.caa3fd77a6229p20 0x0.0p0 -0x1.ba53479c0532ap6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG epsg:32009 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:32009 1 OK -0x1.5dd1a2f05f053p20 -0x1.af96b40da635ep20 0x0.0p0 -0x1.f2acb8641fdf3p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG epsg:32009 2 OK 0x1.28fad1782f82bp21 -0x1.af96b40da635ep20 0x0.0p0 -0x1.c1fdf2468acb2p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG epsg:32009 3 OK -0x1.27c9ee60ea9d3p20 0x1.caa3fd77a6229p20 0x0.0p0 -0x1.f2acb863facd6p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG epsg:32009 4 OK 0x1.0df6f730754ebp21 0x1.caa3fd77a6229p20 0x0.0p0 -0x1.c1fdf246afddp6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG epsg:3201 0 OK 0x1.e8550b1c7e95cp18 0x1.49a5fd2c453d5p1 -0x1.541bda46cp4 0x1.dfffffffffffep3 0x1.2f74bf1dcfcaep-66 0x1.0p-30 T +REG epsg:3201 1 OK -0x1.ad10774fbb93p15 -0x1.0ee34443cfa2ap19 -0x1.b10f88edp4 0x1.3ffffffffffffp3 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3201 2 OK 0x1.01930953b9cdap20 -0x1.0ee344442519fp19 -0x1.200cfc158p4 0x1.3ffffffffffffp4 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:3201 3 OK -0x1.ad10633475dfp15 0x1.0ee3e9156d276p19 -0x1.a9e00cb2p4 0x1.4000000000001p3 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3201 4 OK 0x1.019308b2d7ebbp20 0x1.0ee3e915c29fp19 -0x1.18dd80874p4 0x1.3ffffffffffffp4 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:32010 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:32010 1 OK -0x1.668c52aa5dadap20 -0x1.ab4d273aabac4p20 0x0.0p0 -0x1.39cb22ddbd575p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG epsg:32010 2 OK 0x1.2d5829552ed66p21 -0x1.ab4d273aabac5p20 0x0.0p0 -0x1.038a327797fe2p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG epsg:32010 3 OK -0x1.1f1d47180d63dp20 0x1.cef33a5cc804fp20 0x0.0p0 -0x1.39cb22dd1c5afp6 0x1.7bfffffed62fdp5 0x0.0p0 F +REG epsg:32010 4 OK 0x1.09a0a38c06b19p21 0x1.cef33a5cc804fp20 0x0.0p0 -0x1.038a327838fa8p6 0x1.7bfffffed62fep5 0x0.0p0 F +REG epsg:32011 0 OK 0x1.e848000000005p20 0x0.0p0 0x0.0p0 -0x1.2aaaaaaaaaaabp6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:32011 1 OK 0x1.7ffdfa0084c8p15 -0x1.ad7e99a761c5ep20 0x0.0p0 -0x1.44576bc148ab5p6 0x1.0eaaaaaa3fb07p5 0x0.0p0 F +REG epsg:32011 2 OK 0x1.e2480817fded3p21 -0x1.ad7e99a761c5ep20 0x0.0p0 -0x1.10fde9940caa1p6 0x1.0eaaaaaa3fb07p5 0x0.0p0 F +REG epsg:32011 3 OK 0x1.2aea890de597p18 0x1.ccd926da4f78dp20 0x0.0p0 -0x1.44576bc0f00d1p6 0x1.5eaaaaa9e9fc6p5 0x0.0p0 F +REG epsg:32011 4 OK 0x1.c2eaaede434d7p21 0x1.ccd926da4f78dp20 0x0.0p0 -0x1.10fde99465486p6 0x1.5eaaaaa9e9fc6p5 0x0.0p0 F +REG epsg:32012 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:32012 1 OK -0x1.5a2cb32bc62f4p20 -0x1.b153c89116075p20 0x0.0p0 -0x1.b8aa7f0f68285p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:32012 2 OK 0x1.27285995e317bp21 -0x1.b153c89116075p20 0x0.0p0 -0x1.8a002b9b42821p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:32012 3 OK -0x1.2b65bfa88082p20 0x1.c8c87a9d6304ep20 0x0.0p0 -0x1.b8aa7f0f61997p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:32012 4 OK 0x1.0fc4dfd440411p21 0x1.c8c87a9d6304ep20 0x0.0p0 -0x1.8a002b9b4910ep6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:32013 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:32013 1 OK -0x1.5a2b9c2bc88bap20 -0x1.b152c65f46cf9p20 0x0.0p0 -0x1.c05529ba12d33p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:32013 2 OK 0x1.2727ce15e445ep21 -0x1.b152c65f46cf9p20 0x0.0p0 -0x1.91aad645ed2cep6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:32013 3 OK -0x1.2b64c487b07d7p20 0x1.c8c76a71ba588p20 0x0.0p0 -0x1.c05529ba0c444p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:32013 4 OK 0x1.0fc46243d83edp21 0x1.c8c76a71ba588p20 0x0.0p0 -0x1.91aad645f3bbcp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:32014 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:32014 1 OK -0x1.5a2d9bad136e2p20 -0x1.b1549fbbce424p20 0x0.0p0 -0x1.c6aa7f0f68285p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:32014 2 OK 0x1.2728cdd689b72p21 -0x1.b1549fbbce424p20 0x0.0p0 -0x1.98002b9b4282p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG epsg:32014 3 OK -0x1.2b6690efb0ea2p20 0x1.c8c95d6db6967p20 0x0.0p0 -0x1.c6aa7f0f61997p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:32014 4 OK 0x1.0fc54877d8752p21 0x1.c8c95d6db6967p20 0x0.0p0 -0x1.98002b9b4910ep6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG epsg:32015 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.2955555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:32015 1 OK -0x1.638a24749bbaep20 -0x1.acd3aa80bc26ap20 0x0.0p0 -0x1.437104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG epsg:32015 2 OK 0x1.2bd7123a4ddd8p21 -0x1.acd3aa80bc26ap20 0x0.0p0 -0x1.0f39a5e3fb04bp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG epsg:32015 3 OK -0x1.2224c0a68538bp20 0x1.cd7f4b51768efp20 0x0.0p0 -0x1.437104c6435aap6 0x1.67ffffff2235bp5 0x0.0p0 F +REG epsg:32015 4 OK 0x1.0b246053429c7p21 0x1.cd7f4b51768efp20 0x0.0p0 -0x1.0f39a5e467501p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG epsg:32016 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:32016 1 OK -0x1.6386937aab072p20 -0x1.acd076c72b6a1p20 0x0.0p0 -0x1.4c7104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG epsg:32016 2 OK 0x1.2bd549bd5583ap21 -0x1.acd076c72b6a1p20 0x0.0p0 -0x1.1839a5e3fb04bp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG epsg:32016 3 OK -0x1.2221acae9f0c1p20 0x1.cd7bd92462b9p20 0x0.0p0 -0x1.4c7104c6435abp6 0x1.67ffffff2235bp5 0x0.0p0 F +REG epsg:32016 4 OK 0x1.0b22d6574f862p21 0x1.cd7bd92462b9p20 0x0.0p0 -0x1.1839a5e4675p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG epsg:32017 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:32017 1 OK -0x1.6386937aab072p20 -0x1.acd076c72b6a1p20 0x0.0p0 -0x1.547104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG epsg:32017 2 OK 0x1.2bd549bd5583ap21 -0x1.acd076c72b6a1p20 0x0.0p0 -0x1.2039a5e3fb04cp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG epsg:32017 3 OK -0x1.2221acae9f0c1p20 0x1.cd7bd92462b9p20 0x0.0p0 -0x1.547104c6435abp6 0x1.67ffffff2235bp5 0x0.0p0 F +REG epsg:32017 4 OK 0x1.0b22d6574f862p21 0x1.cd7bd92462b9p20 0x0.0p0 -0x1.2039a5e4675p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG epsg:32018 0 OK 0x1.e848000000005p19 0x1.7b8050864a59p16 0x0.0p0 -0x1.28p6 0x1.4622222222209p5 0x0.0p0 F +REG epsg:32018 1 OK 0x1.33046af3d550ap19 -0x1.022c021b0574ap18 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.3e22222222204p5 0x0.0p0 F +REG epsg:32018 2 OK 0x1.4ec5ca861558p20 -0x1.022c021b0574ap18 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.3e22222222204p5 0x0.0p0 F +REG epsg:32018 3 OK 0x1.38614ece85decp19 0x1.c55c1e2365fb7p18 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.4e2222222220dp5 0x0.0p0 F +REG epsg:32018 4 OK 0x1.4c175898bd10fp20 0x1.c55c1e2365fb7p18 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.4e2222222220dp5 0x0.0p0 F +REG epsg:32019 0 OK 0x1.e848000000005p20 0x1.ad7227a0bfa74p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa77p5 0x0.0p0 F +REG epsg:32019 1 OK 0x1.0a3c0fede3364p20 -0x1.a0670d69a9749p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555514p5 0x0.0p0 F +REG epsg:32019 2 OK 0x1.6329f8090e64bp21 -0x1.a0670d69a9749p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555514p5 0x0.0p0 F +REG epsg:32019 3 OK 0x1.16fe0c3651444p20 0x1.454587797617p20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffd6p5 0x0.0p0 F +REG epsg:32019 4 OK 0x1.5cc8f9e4d75dbp21 0x1.454587797617p20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffd6p5 0x0.0p0 F +REG epsg:3202 0 OK 0x1.e84ef87cf9bd3p18 0x1.49a5eedc488b6p1 -0x1.10f499968p4 0x1.5000000000001p4 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG epsg:3202 1 OK -0x1.ad4052204ad7p15 -0x1.0ee338798b35fp19 -0x1.4ca91b294p4 0x1.0p4 -0x1.4p2 -0x1.8p-29 F +REG epsg:3202 2 OK 0x1.01917ed55ea28p20 -0x1.0ee33879b8e3ap19 -0x1.fe542369p3 0x1.ap4 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:3202 3 OK -0x1.ad403e04ce5cp15 0x1.0ee3dd4b21a14p19 -0x1.45799f65cp4 0x1.0p4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3202 4 OK 0x1.01917e347ea09p20 0x1.0ee3dd4b4f4f5p19 -0x1.eff52c9bp3 0x1.ap4 0x1.4p2 0x1.0p-29 F +REG epsg:32020 0 OK 0x1.e848000000005p20 0x1.34b7f9384e354p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee59cp5 0x0.0p0 F +REG epsg:32020 1 OK 0x1.484bfad484994p20 -0x1.2a052c42909bcp18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:32020 2 OK 0x1.44220295bdb42p21 -0x1.2a052c42909bcp18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:32020 3 OK 0x1.52a7f6f6d4a85p20 0x1.d42de7fb53939p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG epsg:32020 4 OK 0x1.3ef4048495ac9p21 0x1.d42de7fb53939p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG epsg:32021 0 OK 0x1.e848000000005p20 0x1.437d6fdbde18cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999998ep5 0x0.0p0 F +REG epsg:32021 1 OK 0x1.409abc9ca85f6p20 -0x1.3841e3075a51bp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111103p5 0x0.0p0 F +REG epsg:32021 2 OK 0x1.47faa1b1abd11p21 -0x1.3841e3075a51bp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111103p5 0x0.0p0 F +REG epsg:32021 3 OK 0x1.4b7cc84dac084p20 0x1.ea984bce24194p19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.832222222198fp5 0x0.0p0 F +REG epsg:32021 4 OK 0x1.42899bd929fcap21 0x1.ea984bce24194p19 0x0.0p0 -0x1.876dc813d644fp6 0x1.832222222198fp5 0x0.0p0 F +REG epsg:32022 0 OK 0x1.e848000000005p20 0x1.69b54ae78c127p18 0x0.0p0 -0x1.4ap6 0x1.457777777775fp5 0x0.0p0 F +REG epsg:32022 1 OK 0x1.2d30e0a020f2p20 -0x1.5e4b33871e99dp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333314p5 0x0.0p0 F +REG epsg:32022 2 OK 0x1.51af8fafef86ep21 -0x1.5e4b33871e99dp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333314p5 0x0.0p0 F +REG epsg:32022 3 OK 0x1.384fcb322f7aap20 0x1.1208079fc3a1fp20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbaap5 0x0.0p0 F +REG epsg:32022 4 OK 0x1.4c201a66e8428p21 0x1.1208079fc3a1fp20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbaap5 0x0.0p0 F +REG epsg:32023 0 OK 0x1.e848000000005p20 0x1.6999b41e2e245p18 0x0.0p0 -0x1.4ap6 0x1.3822222222204p5 0x0.0p0 F +REG epsg:32023 1 OK 0x1.2d86c557cef82p20 -0x1.5edd2c7a9a14fp18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb6p5 0x0.0p0 F +REG epsg:32023 2 OK 0x1.51849d541883cp21 -0x1.5edd2c7a9a14fp18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb6p5 0x0.0p0 F +REG epsg:32023 3 OK 0x1.3801c56454e8cp20 0x1.11ccff0b402c8p20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.486666666665p5 0x0.0p0 F +REG epsg:32023 4 OK 0x1.4c471d4dd58b8p21 0x1.11ccff0b402c8p20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.486666666665p5 0x0.0p0 F +REG epsg:32024 0 OK 0x1.e848000000005p20 0x1.3a00eef358bb3p18 0x0.0p0 -0x1.88p6 0x1.1f111111110e6p5 0x0.0p0 F +REG epsg:32024 1 OK 0x1.47108e8c4d08p20 -0x1.32d01a63c5c7p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeb9p5 0x0.0p0 F +REG epsg:32024 2 OK 0x1.44bfb8b9d97c5p21 -0x1.32d01a63c5c7p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeb9p5 0x0.0p0 F +REG epsg:32024 3 OK 0x1.4e1e103b1fdcdp20 0x1.da8a3c49d8758p19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d3333333330ep5 0x0.0p0 F +REG epsg:32024 4 OK 0x1.4138f7e27011ep21 0x1.da8a3c49d8758p19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d3333333330ep5 0x0.0p0 F +REG epsg:32025 0 OK 0x1.e848000000005p20 0x1.519c92eff77dp18 0x0.0p0 -0x1.88p6 0x1.124444444440dp5 0x0.0p0 F +REG epsg:32025 1 OK 0x1.3adc653ec35fap20 -0x1.49c7432c38b8ap18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:32025 2 OK 0x1.4ad9cd609e508p21 -0x1.49c7432c38b8ap18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:32025 3 OK 0x1.428d7962d6a34p20 0x1.fe46877557932p19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:32025 4 OK 0x1.4701434e94aebp21 0x1.fe46877557932p19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:32026 0 OK 0x1.e848000000005p20 0x1.9f5c3198cfd7bp18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:32026 1 OK 0x1.0f7eb8ce7c649p20 -0x1.8dd4fc12ae646p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53fffffffffebp5 0x0.0p0 F +REG epsg:32026 2 OK 0x1.6088a398c1cep21 -0x1.8dd4fc12ae646p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53fffffffffebp5 0x0.0p0 F +REG epsg:32026 3 OK 0x1.206912c10d333p20 0x1.3ba962cda776cp20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:32026 4 OK 0x1.5813769f7966cp21 0x1.3ba962cda776cp20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:32027 0 OK 0x1.e848000000005p20 0x1.9f367a61259abp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:32027 1 OK 0x1.10150cba3e0afp20 -0x1.8eea4ec3aa20fp18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe6p5 0x0.0p0 F +REG epsg:32027 2 OK 0x1.603d79a2e0faep21 -0x1.8eea4ec3aa20fp18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe6p5 0x0.0p0 F +REG epsg:32027 3 OK 0x1.1fdb84a1f3944p20 0x1.3b49cba08a93fp20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554ap5 0x0.0p0 F +REG epsg:32027 4 OK 0x1.585a3daf06363p21 0x1.3b49cba08a93fp20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554ap5 0x0.0p0 F +REG epsg:32028 0 OK 0x1.e848000000005p20 0x1.3d41fbb4531b9p18 0x0.0p0 -0x1.37p6 0x1.487777777776p5 0x0.0p0 F +REG epsg:32028 1 OK 0x1.44ba447fa203ap20 -0x1.3461b51339a05p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333315p5 0x0.0p0 F +REG epsg:32028 2 OK 0x1.45eaddc02efe8p21 -0x1.3461b51339a05p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333315p5 0x0.0p0 F +REG epsg:32028 3 OK 0x1.4d6420eab641bp20 0x1.e02effd268b4cp19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:32028 4 OK 0x1.4195ef8aa4df8p21 0x1.e02effd268b4cp19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:32029 0 OK 0x1.e848000000005p20 0x1.04e0252d4edd6p18 0x0.0p0 -0x1.37p6 0x1.408888888886dp5 0x0.0p0 F +REG epsg:32029 1 OK 0x1.6281c1bb46374p20 -0x1.fe35eb9b9f015p17 0x0.0p0 -0x1.3eaa770d743d9p6 0x1.34cccccccccafp5 0x0.0p0 F +REG epsg:32029 2 OK 0x1.37071f225ce4bp21 -0x1.fe35eb9b9f015p17 0x0.0p0 -0x1.2f5588f28bc27p6 0x1.34cccccccccafp5 0x0.0p0 F +REG epsg:32029 3 OK 0x1.6828a0f0c1315p20 0x1.8a227bc7a8204p19 0x0.0p0 -0x1.3eaa770d743d9p6 0x1.4c4444444442dp5 0x0.0p0 F +REG epsg:32029 4 OK 0x1.3433af879f67ap21 0x1.8a227bc7a8204p19 0x0.0p0 -0x1.2f5588f28bc27p6 0x1.4c4444444442dp5 0x0.0p0 F +REG epsg:3203 0 OK 0x1.e848d250e4358p18 0x1.49a5e949c29dcp1 -0x1.ed9ed622p3 0x1.afffffffffffep4 0x1.c72f1eacb7b02p-67 0x1.0p-29 T +REG epsg:3203 1 OK -0x1.ad713b386533p15 -0x1.0ee333e278a32p19 -0x1.108856c7p4 0x1.6000000000002p4 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:3203 2 OK 0x1.018ff302e678cp20 -0x1.0ee333e27e056p19 -0x1.076626fb8p4 0x1.0p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3203 3 OK -0x1.ad71271caf9dp15 0x1.0ee3d8b40c4aep19 -0x1.0958db4b8p4 0x1.6000000000002p4 0x1.4000000000003p2 -0x1.0p-29 F +REG epsg:3203 4 OK 0x1.018ff262084fep20 0x1.0ee3d8b411ad2p19 -0x1.0036ab8a8p4 0x1.0p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:32030 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:32030 1 OK -0x1.64d4543ca9cefp20 -0x1.ac320cf3202ap20 0x0.0p0 -0x1.3888a96f00826p6 0x1.20aaaaaa11e74p5 0x0.0p0 F +REG epsg:32030 2 OK 0x1.2c7c2a1e54e81p21 -0x1.ac320cf32029fp20 0x0.0p0 -0x1.03775690ff7dap6 0x1.20aaaaaa11e74p5 0x0.0p0 F +REG epsg:32030 3 OK -0x1.20df2995c08f6p20 0x1.ce21472acac6dp20 0x0.0p0 -0x1.3888a96e7f594p6 0x1.70aaaaa9ae613p5 0x0.0p0 F +REG epsg:32030 4 OK 0x1.0a8194cae0483p21 0x1.ce21472acac6fp20 0x0.0p0 -0x1.0377569180a6cp6 0x1.70aaaaa9ae613p5 0x0.0p0 F +REG epsg:32031 0 OK 0x1.e848000000005p20 0x1.5d73a9123157cp18 0x0.0p0 -0x1.44p6 0x1.0fddddddddda8p5 0x0.0p0 F +REG epsg:32031 1 OK 0x1.34ac8b4ebf6fdp20 -0x1.55249d20c7e86p18 0x0.0p0 -0x1.4d7caf89e58b5p6 0x1.00222222221ep5 0x0.0p0 F +REG epsg:32031 2 OK 0x1.4df1ba58a047ep21 -0x1.55249d20c7e86p18 0x0.0p0 -0x1.3a8350761a74cp6 0x1.00222222221ep5 0x0.0p0 F +REG epsg:32031 3 OK 0x1.3cd72707590a9p20 0x1.0821621266441p20 0x0.0p0 -0x1.4d7caf89e58b5p6 0x1.1f9999999996dp5 0x0.0p0 F +REG epsg:32031 4 OK 0x1.49dc6c7c537a8p21 0x1.0821621266441p20 0x0.0p0 -0x1.3a8350761a74cp6 0x1.1f9999999996dp5 0x0.0p0 F +REG epsg:32033 0 OK 0x1.e848000000005p20 0x1.45ade0e067fe8p18 0x0.0p0 -0x1.44p6 0x1.05fffffffffbfp5 0x0.0p0 F +REG epsg:32033 1 OK 0x1.414b6b6ed4f6ap20 -0x1.3ed0e27e0ce0dp18 0x0.0p0 -0x1.4cb828dd9db44p6 0x1.eeaaaaaaaaa16p4 0x0.0p0 F +REG epsg:32033 2 OK 0x1.47a24a4895848p21 -0x1.3ed0e27e0ce0dp18 0x0.0p0 -0x1.3b47d722624bdp6 0x1.eeaaaaaaaaa16p4 0x0.0p0 F +REG epsg:32033 3 OK 0x1.480b37d49777ap20 0x1.ebeb70cb69345p19 0x0.0p0 -0x1.4cb828dd9db44p6 0x1.14aaaaaaaaa72p5 0x0.0p0 F +REG epsg:32033 4 OK 0x1.44426415b444p21 0x1.ebeb70cb69345p19 0x0.0p0 -0x1.3b47d722624bdp6 0x1.14aaaaaaaaa72p5 0x0.0p0 F +REG epsg:32034 0 OK 0x1.e848000000005p20 0x1.4952ad64f219fp18 0x0.0p0 -0x1.9p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:32034 1 OK 0x1.3dc8ba731dce2p20 -0x1.3e67c794e502bp18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444435p5 0x0.0p0 F +REG epsg:32034 2 OK 0x1.4963a2c67118cp21 -0x1.3e67c794e502bp18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444435p5 0x0.0p0 F +REG epsg:32034 3 OK 0x1.4861e0c6d7d91p20 0x1.f336ecc04da1ep19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd3p5 0x0.0p0 F +REG epsg:32034 4 OK 0x1.44170f9c94136p21 0x1.f336ecc04da1ep19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd3p5 0x0.0p0 F +REG epsg:32035 0 OK 0x1.e848000000005p20 0x1.6fc9c2293e018p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeeep5 0x0.0p0 F +REG epsg:32035 1 OK 0x1.2977a40042902p20 -0x1.62cdbe64374acp18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666654p5 0x0.0p0 F +REG epsg:32035 2 OK 0x1.538c2dffdeb84p21 -0x1.62cdbe64374acp18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666654p5 0x0.0p0 F +REG epsg:32035 3 OK 0x1.360e6b7392936p20 0x1.16f354a14fb9ep20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776bp5 0x0.0p0 F +REG epsg:32035 4 OK 0x1.4d40ca4636b6ap21 0x1.16f354a14fb9ep20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776bp5 0x0.0p0 F +REG epsg:32036 0 OK 0x1.86a0000000004p16 0x1.37066165757c8p18 0x0.0p0 -0x1.58p6 0x1.1c55555555525p5 0x0.0p0 F +REG epsg:32036 1 OK -0x1.0e689fc895e02p19 -0x1.300f45983aa8cp18 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.0e5555555551bp5 0x0.0p0 F +REG epsg:32036 2 OK 0x1.70109fc895e24p19 -0x1.300f45983aa8cp18 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.0e5555555551bp5 0x0.0p0 F +REG epsg:32036 3 OK -0x1.00bce82b1aa22p19 0x1.d5f6c6575f28cp19 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.2a5555555552dp5 0x0.0p0 F +REG epsg:32036 4 OK 0x1.6264e82b1aa42p19 0x1.d5f6c6575f28cp19 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.2a5555555552dp5 0x0.0p0 F +REG epsg:32037 0 OK 0x1.e848000000005p20 0x1.840161a27cdd6p18 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8ap5 0x0.0p0 F +REG epsg:32037 1 OK 0x1.202f70dcd1034p20 -0x1.795077638b89dp18 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:32037 2 OK 0x1.58304791977e2p21 -0x1.795077638b89dp18 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:32037 3 OK 0x1.2aa8966fbf118p20 0x1.259ed12fa03cep20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ap5 0x0.0p0 F +REG epsg:32037 4 OK 0x1.52f3b4c820772p21 0x1.259ed12fa03cep20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ap5 0x0.0p0 F +REG epsg:32038 0 OK 0x1.e848000000005p20 0x1.9890420827933p18 0x0.0p0 -0x1.86p6 0x1.068888888884bp5 0x0.0p0 F +REG epsg:32038 1 OK 0x1.15b8783e29117p20 -0x1.8db69c3c0ca51p18 0x0.0p0 -0x1.90f271ed65e92p6 0x1.e8444444443bp4 0x0.0p0 F +REG epsg:32038 2 OK 0x1.5d6bc3e0eb77ap21 -0x1.8db69c3c0ca51p18 0x0.0p0 -0x1.7b0d8e129a16ep6 0x1.e8444444443bp4 0x0.0p0 F +REG epsg:32038 3 OK 0x1.205d9776da94dp20 0x1.3519ae4a5ef64p20 0x0.0p0 -0x1.90f271ed65e92p6 0x1.18eeeeeeeeebdp5 0x0.0p0 F +REG epsg:32038 4 OK 0x1.5819344492b5ep21 0x1.3519ae4a5ef64p20 0x0.0p0 -0x1.7b0d8e129a16ep6 0x1.18eeeeeeeeebdp5 0x0.0p0 F +REG epsg:32039 0 OK 0x1.e848000000005p20 0x1.89a2b883e667dp18 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665cep4 0x0.0p0 F +REG epsg:32039 1 OK 0x1.1dedc9595f256p20 -0x1.805b8e5f2ebf3p18 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee3bp4 0x0.0p0 F +REG epsg:32039 2 OK 0x1.59511b53506e2p21 -0x1.805b8e5f2ebf3p18 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee3bp4 0x0.0p0 F +REG epsg:32039 3 OK 0x1.270f42da97831p20 0x1.29888a4c9936ap20 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb2p5 0x0.0p0 F +REG epsg:32039 4 OK 0x1.54c05e92b43f5p21 0x1.29888a4c9936ap20 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb2p5 0x0.0p0 F +REG epsg:3204 0 OK 0x0.0p0 0x1.cf026779fea19p20 0x0.0p0 -0x1.08p6 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:3204 1 OK -0x1.105c3f779e872p17 0x1.a4cf3b5d9e45cp16 0x0.0p0 -0x1.f4f8aa2fccddbp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3204 2 OK 0x1.105c3f779e873p17 0x1.a4cf3b5d9e45bp16 0x0.0p0 -0x1.b0755d0332251p2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3204 3 OK -0x1.5a492a6130642p21 0x1.0b838ef5fb971p21 0x0.0p0 -0x1.f4f8aa2fccddbp6 -0x1.e2aaaaaaaa9fcp5 0x0.0p0 F +REG epsg:3204 4 OK 0x1.5a492a6130643p21 0x1.0b838ef5fb971p21 0x0.0p0 -0x1.b0755d033225fp2 -0x1.e2aaaaaaaa9fcp5 0x0.0p0 F +REG epsg:32040 0 OK 0x1.e848000000005p20 0x1.b2f591a96fa6dp18 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4p4 0x0.0p0 F +REG epsg:32040 1 OK 0x1.087c3b4e962e8p20 -0x1.a864f986dfbebp18 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbae9p4 0x0.0p0 F +REG epsg:32040 2 OK 0x1.6409e258b4e88p21 -0x1.a864f986dfbebp18 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbae9p4 0x0.0p0 F +REG epsg:32040 3 OK 0x1.12e941cf6a543p20 0x1.48da7a4e9365dp20 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:32040 4 OK 0x1.5ed35f184ad5bp21 0x1.48da7a4e9365dp20 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:32041 0 OK 0x1.e848000000005p20 0x1.8088d36e9a7b9p18 0x0.0p0 -0x1.8ap6 0x1.abfffffffff35p4 0x0.0p0 F +REG epsg:32041 1 OK 0x1.2349f0764e97ep20 -0x1.7911b19f5764cp18 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555471p4 0x0.0p0 F +REG epsg:32041 2 OK 0x1.56a307c4d8b4fp21 -0x1.7911b19f5764cp18 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555471p4 0x0.0p0 F +REG epsg:32041 3 OK 0x1.2aaedcb32547ap20 0x1.2247753dae5a8p20 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG epsg:32041 4 OK 0x1.52f091a66d5dp21 0x1.2247753dae5a8p20 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG epsg:32042 0 OK 0x1.e848000000005p20 0x1.01f268b083f69p18 0x0.0p0 -0x1.bep6 0x1.4877777777761p5 0x0.0p0 F +REG epsg:32042 1 OK 0x1.63f669ce934ccp20 -0x1.f837f2c1822dp17 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc3p5 0x0.0p0 F +REG epsg:32042 2 OK 0x1.364ccb18b659fp21 -0x1.f837f2c1822dp17 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc3p5 0x0.0p0 F +REG epsg:32042 3 OK 0x1.69abc6983c54cp20 0x1.85c6ac18d706ap19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.5411111111101p5 0x0.0p0 F +REG epsg:32042 4 OK 0x1.33721cb3e1d5fp21 0x1.85c6ac18d706ap19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.5411111111101p5 0x0.0p0 F +REG epsg:32043 0 OK 0x1.e848000000005p20 0x1.9c01f97d1a4c9p18 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed2p5 0x0.0p0 F +REG epsg:32043 1 OK 0x1.129263cc17a79p20 -0x1.8dcb24ad93eacp18 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:32043 2 OK 0x1.5efece19f42cp21 -0x1.8dcb24ad93eacp18 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:32043 3 OK 0x1.2066919867041p20 0x1.386d9269adeb4p20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777763p5 0x0.0p0 F +REG epsg:32043 4 OK 0x1.5814b733cc7ddp21 0x1.386d9269adeb4p20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777763p5 0x0.0p0 F +REG epsg:32044 0 OK 0x1.e848000000005p20 0x1.2b4673389e3ccp18 0x0.0p0 -0x1.bep6 0x1.2c111111110eap5 0x0.0p0 F +REG epsg:32044 1 OK 0x1.4e9e81de76328p20 -0x1.2457ce869af55p18 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996dp5 0x0.0p0 F +REG epsg:32044 2 OK 0x1.40f8bf10c4e69p21 -0x1.2457ce869af55p18 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996dp5 0x0.0p0 F +REG epsg:32044 3 OK 0x1.55692072985p20 0x1.c44fbc738cfe2p19 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886dp5 0x0.0p0 F +REG epsg:32044 4 OK 0x1.3d936fc6b3d7dp21 0x1.c44fbc738cfe2p19 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886dp5 0x0.0p0 F +REG epsg:32045 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:32045 1 OK -0x1.668c07aaad292p20 -0x1.ab4ce48ce2976p20 0x0.0p0 -0x1.3d20783312acap6 0x1.2bffffff40e62p5 0x0.0p0 F +REG epsg:32045 2 OK 0x1.2d5803d556952p21 -0x1.ab4ce48ce2975p20 0x0.0p0 -0x1.06df87cced536p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG epsg:32045 3 OK -0x1.1f1d073dfd9dp20 0x1.cef2f21ee792ap20 0x0.0p0 -0x1.3d20783271b03p6 0x1.7bfffffed62fep5 0x0.0p0 F +REG epsg:32045 4 OK 0x1.09a0839efecfp21 0x1.cef2f21ee792ap20 0x0.0p0 -0x1.06df87cd8e4fdp6 0x1.7bfffffed62fdp5 0x0.0p0 F +REG epsg:32046 0 OK 0x1.e848000000005p20 0x1.10a4ecd25a052p18 0x0.0p0 -0x1.3ap6 0x1.3377777777755p5 0x0.0p0 F +REG epsg:32046 1 OK 0x1.5c7da25e5268ep20 -0x1.0ab4e588a1833p18 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333307p5 0x0.0p0 F +REG epsg:32046 2 OK 0x1.3a092ed0d6cbep21 -0x1.0ab4e588a1833p18 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333307p5 0x0.0p0 F +REG epsg:32046 3 OK 0x1.624df469bca16p20 0x1.9be26d361e4dcp19 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba1p5 0x0.0p0 F +REG epsg:32046 4 OK 0x1.372105cb21afap21 0x1.9be26d361e4dcp19 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba1p5 0x0.0p0 F +REG epsg:32047 0 OK 0x1.e848000000005p20 0x1.225cdc64eb6ffp18 0x0.0p0 -0x1.3ap6 0x1.293333333330cp5 0x0.0p0 F +REG epsg:32047 1 OK 0x1.53547f0e42241p20 -0x1.1bedf86df1371p18 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:32047 2 OK 0x1.3e9dc078deee4p21 -0x1.1bedf86df1371p18 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:32047 3 OK 0x1.59a22350b145ap20 0x1.b6b52ff535152p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444426p5 0x0.0p0 F +REG epsg:32047 4 OK 0x1.3b76ee57a75d8p21 0x1.b6b52ff535152p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444426p5 0x0.0p0 F +REG epsg:32048 0 OK 0x1.e848000000005p20 0x1.34b90230d6a2bp18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee59ep5 0x0.0p0 F +REG epsg:32048 1 OK 0x1.484aed7f6257dp20 -0x1.2a05624f4bd45p18 0x0.0p0 -0x1.edab194698fc4p6 0x1.711111111110ap5 0x0.0p0 F +REG epsg:32048 2 OK 0x1.442289404ed54p21 -0x1.2a05624f4bd45p18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:32048 3 OK 0x1.52a85065c0da4p20 0x1.d42f141208b6p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG epsg:32048 4 OK 0x1.3ef3d7cd1f94p21 0x1.d42f141208b6p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG epsg:32049 0 OK 0x1.e848000000005p20 0x1.641d1f836751fp18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:32049 1 OK 0x1.2f25de9d87db3p20 -0x1.5695d085c1af7p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaa9cp5 0x0.0p0 F +REG epsg:32049 2 OK 0x1.50b510b13c12cp21 -0x1.5695d085c1af7p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaa9cp5 0x0.0p0 F +REG epsg:32049 3 OK 0x1.3c39ac38cf716p20 0x1.0e4c9b39fa017p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa204p5 0x0.0p0 F +REG epsg:32049 4 OK 0x1.4a2b29e39847ap21 0x1.0e4c9b39fa017p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa204p5 0x0.0p0 F +REG epsg:3205 0 OK 0x0.0p0 0x1.cf026779fea19p20 0x0.0p0 -0x1.bp5 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:3205 1 OK -0x1.105c3f779e872p17 0x1.a4cf3b5d9e45cp16 0x0.0p0 -0x1.c4f8aa2fccddap6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3205 2 OK 0x1.105c3f779e872p17 0x1.a4cf3b5d9e45cp16 0x0.0p0 0x1.4f8aa2fccdda5p2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3205 3 OK -0x1.5a492a6130642p21 0x1.0b838ef5fb971p21 0x0.0p0 -0x1.c4f8aa2fccddap6 -0x1.e2aaaaaaaa9fcp5 0x0.0p0 F +REG epsg:3205 4 OK 0x1.5a492a6130642p21 0x1.0b838ef5fb971p21 0x0.0p0 0x1.4f8aa2fccdda5p2 -0x1.e2aaaaaaaa9fcp5 0x0.0p0 F +REG epsg:32050 0 OK 0x1.e848000000005p20 0x1.37392b2c37c73p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe2p5 0x0.0p0 F +REG epsg:32050 1 OK 0x1.48216a51a5d9ap20 -0x1.2f324a6f01ebap18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdbp5 0x0.0p0 F +REG epsg:32050 2 OK 0x1.44374ad72d138p21 -0x1.2f324a6f01ebap18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdbp5 0x0.0p0 F +REG epsg:32050 3 OK 0x1.4ff9442fdbc7ap20 0x1.d6bffc056774fp19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe8p5 0x0.0p0 F +REG epsg:32050 4 OK 0x1.404b5de8121c8p21 0x1.d6bffc056774fp19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe8p5 0x0.0p0 F +REG epsg:32051 0 OK 0x1.e848000000005p20 0x1.4ed917413d69fp18 0x0.0p0 -0x1.44p6 0x1.2f88888888864p5 0x0.0p0 F +REG epsg:32051 1 OK 0x1.3bda25624121ap20 -0x1.46052eb0aaf5dp18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774bp5 0x0.0p0 F +REG epsg:32051 2 OK 0x1.4a5aed4edf6f8p21 -0x1.46052eb0aaf5dp18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774bp5 0x0.0p0 F +REG epsg:32051 3 OK 0x1.447b05e1733b3p20 0x1.fa95c6e62b5bdp19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997ep5 0x0.0p0 F +REG epsg:32051 4 OK 0x1.460a7d0f4662cp21 0x1.fa95c6e62b5bdp19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997ep5 0x0.0p0 F +REG epsg:32052 0 OK 0x1.e848000000005p20 0x1.1ce050c60d57dp18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:32052 1 OK 0x1.5543adbca3ecp20 -0x1.1461d2e8d6f52p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeedep5 0x0.0p0 F +REG epsg:32052 2 OK 0x1.3da62921ae0a5p21 -0x1.1461d2e8d6f52p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeedep5 0x0.0p0 F +REG epsg:32052 3 OK 0x1.5d8544f5ef83cp20 0x1.af67680cef8dp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887ec8p5 0x0.0p0 F +REG epsg:32052 4 OK 0x1.39855d85083e7p21 0x1.af67680cef8dp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887ec8p5 0x0.0p0 F +REG epsg:32053 0 OK 0x1.e848000000005p20 0x1.28ad4456c5bcp18 0x0.0p0 -0x1.68p6 0x1.6555555555548p5 0x0.0p0 F +REG epsg:32053 1 OK 0x1.4f2b787b6498p20 -0x1.1fdf67a78d254p18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:32053 2 OK 0x1.40b243c24db45p21 -0x1.1fdf67a78d254p18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:32053 3 OK 0x1.57bb47f6f3766p20 0x1.c142cb3a5720cp19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaap5 0x0.0p0 F +REG epsg:32053 4 OK 0x1.3c6a5c0486452p21 0x1.c142cb3a5720cp19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaap5 0x0.0p0 F +REG epsg:32054 0 OK 0x1.e848000000005p20 0x1.6fc956dadbd09p18 0x0.0p0 -0x1.68p6 0x1.5844444444432p5 0x0.0p0 F +REG epsg:32054 1 OK 0x1.2985ceb0b8654p20 -0x1.62f125bb7b617p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba2p5 0x0.0p0 F +REG epsg:32054 2 OK 0x1.538518a7a3cd4p21 -0x1.62f125bb7b617p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba2p5 0x0.0p0 F +REG epsg:32054 3 OK 0x1.35fe31de8c068p20 0x1.16e95aec36ad4p20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc3p5 0x0.0p0 F +REG epsg:32054 4 OK 0x1.4d48e710b9fcap21 0x1.16e95aec36ad4p20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc3p5 0x0.0p0 F +REG epsg:32055 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.4555555555554p5 0x0.0p0 F +REG epsg:32055 1 OK -0x1.644ef77bb6f8p20 -0x1.ac6c6280697cdp20 0x0.0p0 -0x1.bf08b5e8fc3e2p6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32055 2 OK 0x1.2c397bbddb7b9p21 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.8a4c9f6c59178p6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32055 3 OK -0x1.215944612f03ap20 0x1.cddd90f4d95c2p20 0x0.0p0 -0x1.bf08b5e8836e5p6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32055 4 OK 0x1.0abea23097817p21 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.8a4c9f6cd1e76p6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32056 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.ad55555555553p6 0x1.4555555555554p5 0x0.0p0 F +REG epsg:32056 1 OK -0x1.644ef77bb6f7p20 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.c7b36093a6e88p6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32056 2 OK 0x1.2c397bbddb7b9p21 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.92f74a1703c1fp6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32056 3 OK -0x1.215944612f02cp20 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.c7b360932e18ap6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32056 4 OK 0x1.0abea23097817p21 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.92f74a177c91cp6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32057 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.4555555555554p5 0x0.0p0 F +REG epsg:32057 1 OK -0x1.644ef77bb6f7p20 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.cd5e0b3e51935p6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32057 2 OK 0x1.2c397bbddb7b9p21 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.98a1f4c1ae6ccp6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32057 3 OK -0x1.215944612f02cp20 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.cd5e0b3dd8c37p6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32057 4 OK 0x1.0abea23097817p21 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.98a1f4c2273c9p6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32058 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.b855555555553p6 0x1.4555555555554p5 0x0.0p0 F +REG epsg:32058 1 OK -0x1.644ef77bb6f7p20 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.d2b36093a6e87p6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32058 2 OK 0x1.2c397bbddb7b9p21 -0x1.ac6c6280697cep20 0x0.0p0 -0x1.9df74a1703c1ep6 0x1.1d555554c6521p5 0x0.0p0 F +REG epsg:32058 3 OK -0x1.215944612f02cp20 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.d2b360932e18ap6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:32058 4 OK 0x1.0abea23097817p21 0x1.cddd90f4d95cp20 0x0.0p0 -0x1.9df74a177c91cp6 0x1.6d55555465318p5 0x0.0p0 F +REG epsg:3206 0 OK 0x0.0p0 0x1.cf026779fea19p20 0x0.0p0 -0x1.5p5 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:3206 1 OK -0x1.105c3f779e872p17 0x1.a4cf3b5d9e45cp16 0x0.0p0 -0x1.94f8aa2fccddap6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3206 2 OK 0x1.105c3f779e873p17 0x1.a4cf3b5d9e45bp16 0x0.0p0 0x1.13e2a8bf3376cp4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3206 3 OK -0x1.5a492a6130642p21 0x1.0b838ef5fb972p21 0x0.0p0 -0x1.94f8aa2fccddap6 -0x1.e2aaaaaaaa9fcp5 0x0.0p0 F +REG epsg:3206 4 OK 0x1.5a492a6130643p21 0x1.0b838ef5fb971p21 0x0.0p0 0x1.13e2a8bf33769p4 -0x1.e2aaaaaaaa9fcp5 0x0.0p0 F +REG epsg:32061 0 OK 0x1.e848p18 0x1.1d5c650e56042p18 0x0.0p0 -0x1.6955555555555p6 0x1.0d11111110ffbp4 0x0.0p0 F +REG epsg:32061 1 OK -0x1.165b184a7d518p16 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.7a2222222202cp3 0x0.0p0 F +REG epsg:32061 2 OK 0x1.0589b184a7d52p20 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.547098bde0a83p6 0x1.7a2222222202cp3 0x0.0p0 F +REG epsg:32061 3 OK -0x1.4870ab69dd0fp15 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.5d1111111100cp4 0x0.0p0 F +REG epsg:32061 4 OK 0x1.fccf0ab69dd0fp19 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.547098bde0a83p6 0x1.5d1111111100cp4 0x0.0p0 F +REG epsg:32062 0 OK 0x1.e848p18 0x1.3e5a2b9581062p18 0x0.0p0 -0x1.6955555555555p6 0x1.dcccccccccaa6p3 0x0.0p0 F +REG epsg:32062 1 OK -0x1.0f6665440c788p16 -0x1.afe63c9762358p17 0x0.0p0 -0x1.7e077a4bda7ebp6 0x1.3cccccccccb07p3 0x0.0p0 F +REG epsg:32062 2 OK 0x1.051a665440c72p20 -0x1.afe63c9762358p17 0x0.0p0 -0x1.54a3305ed02cp6 0x1.3cccccccccb07p3 0x0.0p0 F +REG epsg:32062 3 OK -0x1.55df0a3a2db3p15 0x1.b0c2dc55d354dp19 0x0.0p0 -0x1.7e077a4bda7ebp6 0x1.3e66666666552p4 0x0.0p0 F +REG epsg:32062 4 OK 0x1.fda5f0a3a2da7p19 0x1.b0c2dc55d354dp19 0x0.0p0 -0x1.54a3305ed02cp6 0x1.3e66666666552p4 0x0.0p0 F +REG epsg:32064 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:32064 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.9fffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32064 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.780000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32064 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.9fffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32064 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.780000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32065 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32065 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.87ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32065 2 OK 0x1.a68297ce015a1p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.600000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32065 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.87ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32065 4 OK 0x1.a68297ce015a1p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.600000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32066 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32066 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.6fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32066 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.480000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32066 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.6fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32066 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.480000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32067 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32067 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.57ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32067 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.300000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32067 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.57ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32067 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.300000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3207 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 -0x1.5cp7 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3207 1 OK -0x1.ebe43295acaa4p16 0x1.5ac37fceb775dp16 0x0.0p0 0x1.f8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3207 2 OK 0x1.ebe43295aca9fp16 0x1.5ac37fceb7764p16 0x0.0p0 -0x1.c800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3207 3 OK -0x1.44d011991522p21 0x1.c9f5bbf8f04b1p20 0x0.0p0 0x1.f8p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3207 4 OK 0x1.44d011991521dp21 0x1.c9f5bbf8f04bap20 0x0.0p0 -0x1.c800000000001p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32074 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:32074 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.9fffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32074 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.780000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32074 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.9fffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32074 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.780000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32075 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32075 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.87ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32075 2 OK 0x1.a68297ce015a1p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.600000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32075 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.87ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32075 4 OK 0x1.a68297ce015a1p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.600000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32076 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32076 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.6fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32076 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.480000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32076 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.6fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32076 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.480000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32077 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32077 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.57ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32077 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.300000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32077 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.57ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32077 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.300000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3208 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 -0x1.08p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3208 1 OK -0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 -0x1.f8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3208 2 OK 0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 -0x1.7fffffffffffbp2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3208 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 -0x1.f8p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3208 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 -0x1.7fffffffffffbp2 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32081 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.a8p5 0x0.0p0 0x0.0p0 T +REG epsg:32081 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cfffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32081 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.800000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32081 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cfffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32081 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.800000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32082 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.cp5 0x0.0p0 0x0.0p0 T +REG epsg:32082 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e7ffffffc45f2p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32082 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.980000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32082 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e7ffffffc45f2p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32082 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.980000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32083 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG epsg:32083 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32083 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32083 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32083 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32084 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:32084 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32084 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32084 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32084 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32085 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:32085 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32085 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32085 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32085 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32086 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG epsg:32086 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32086 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32086 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:32086 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3209 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 -0x1.bp5 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3209 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 -0x1.c800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3209 2 OK 0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.800000000000ap2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3209 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 -0x1.c800000000001p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3209 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.800000000000ap2 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32098 0 OK 0x0.0p0 0x1.b11f4b13029bdp19 0x0.0p0 -0x1.12p6 0x1.9fffffffffb6bp5 0x0.0p0 F +REG epsg:32098 1 OK -0x1.0b3ba5eb1ae96p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.27fffffffffd6p5 0x0.0p0 F +REG epsg:32098 2 OK 0x1.0b3ba5eb1ae97p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.611672e32a5cdp5 0x1.27fffffffffd6p5 0x0.0p0 F +REG epsg:32098 3 OK -0x1.053679725c65fp20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff5p6 0x0.0p0 F +REG epsg:32098 4 OK 0x1.053679725c66p20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.611672e32a5cdp5 0x1.0bffffffffff5p6 0x0.0p0 F +REG epsg:32099 0 OK 0x1.e848000000005p20 0x1.8088d36e9a7b9p18 0x0.0p0 -0x1.6d55555555555p6 0x1.abfffffffff35p4 0x0.0p0 F +REG epsg:32099 1 OK 0x1.2349f0764e97ep20 -0x1.7911b19f5764cp18 0x0.0p0 -0x1.7709e6ac1bc4dp6 0x1.895555555546dp4 0x0.0p0 F +REG epsg:32099 2 OK 0x1.56a307c4d8b46p21 -0x1.7911b19f5764cp18 0x0.0p0 -0x1.63a0c3fe8ee5dp6 0x1.895555555546dp4 0x0.0p0 F +REG epsg:32099 3 OK 0x1.2aaedcb32547ap20 0x1.2247753dae5a8p20 0x0.0p0 -0x1.7709e6ac1bc4dp6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG epsg:32099 4 OK 0x1.52f091a66d5c8p21 0x1.2247753dae5a8p20 0x0.0p0 -0x1.63a0c3fe8ee5dp6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG epsg:3210 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.5p5 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3210 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 -0x1.2000000000002p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3210 2 OK 0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.9800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3210 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 -0x1.2000000000002p4 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3210 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.9800000000001p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32100 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:32100 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:32100 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:32100 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:32100 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:32104 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:32104 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:32104 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:32104 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:32104 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:32107 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:32107 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:32107 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:32107 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:32107 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:32108 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:32108 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:32108 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:32108 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:32108 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:32109 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:32109 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:32109 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:32109 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:32109 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3211 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.bp5 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3211 1 OK -0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 -0x1.800000000000ap2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3211 2 OK 0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.c800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3211 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 -0x1.800000000000ap2 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3211 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.c800000000001p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32110 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:32110 1 OK -0x1.24fce93763534p18 -0x1.047d0f0ecdd7cp19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:32110 2 OK 0x1.b776749bb1a9p19 -0x1.047d0f0ecdd7dp19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:32110 3 OK -0x1.9bca10091ae7cp17 0x1.1a377ef14666fp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:32110 4 OK 0x1.8bea840246b96p19 0x1.1a377ef14666ep19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:32111 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:32111 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:32111 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:32111 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:32111 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:32112 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:32112 1 OK -0x1.99be00ac5ff96p18 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:32112 2 OK 0x1.6e0100562ffcbp19 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:32112 3 OK -0x1.60b5a122eb162p18 0x1.1676a4801012dp19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:32112 4 OK 0x1.517cd091758b1p19 0x1.1676a4801012dp19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:32113 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:32113 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:32113 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:32113 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:32113 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:32114 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:32114 1 OK 0x1.df55c7b8d8b04p17 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:32114 2 OK 0x1.595b4708e4eap20 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:32114 3 OK 0x1.28b35fb7a28a2p18 0x1.16772ec526b59p19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:32114 4 OK 0x1.4b192812175d8p20 0x1.16772ec526b59p19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:32115 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:32115 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:32115 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:32115 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:32115 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:32116 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:32116 1 OK -0x1.5221cfa7d36a2p18 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:32116 2 OK 0x1.9d34e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:32116 3 OK -0x1.0266eb5117679p18 0x1.19530345ad8e5p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:32116 4 OK 0x1.755775a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:32117 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:32117 1 OK -0x1.e0f39f4fa6d44p17 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:32117 2 OK 0x1.ce08e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:32117 3 OK -0x1.417dd6a22ecf2p17 0x1.19530345ad8e5p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:32117 4 OK 0x1.a62b75a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:32118 0 OK 0x1.24f8p18 0x1.77ef514292013p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:32118 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:32118 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:32118 3 OK 0x1.7379e78330bbep17 0x1.388171947289dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:32118 4 OK 0x1.90330c3e67a21p18 0x1.388171947289dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:32119 0 OK 0x1.29a8270a3d70ap19 0x1.05cc553074f97p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:32119 1 OK 0x1.449988c24f902p18 -0x1.fbb202943916cp16 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:32119 2 OK 0x1.b10389b353188p19 -0x1.fbb202943916cp16 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:32119 3 OK 0x1.54278a411c66cp18 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:32119 4 OK 0x1.a93c88f3ecad4p19 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3212 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.08p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3212 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.7fffffffffffbp2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3212 2 OK 0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.f8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3212 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.7fffffffffffbp2 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3212 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.f8p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32120 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:32120 1 OK 0x1.86e3d47c2716ep18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:32120 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:32120 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:32120 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:32121 0 OK 0x1.24f8p19 0x1.8a66ee530ab8dp16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:32121 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:32121 2 OK 0x1.8b2e86753449dp19 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:32121 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:32121 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:32122 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:32122 1 OK 0x1.65d7a1966c1d2p18 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:32122 2 OK 0x1.97042f34c9f0dp19 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:32122 3 OK 0x1.7366a7cc5f285p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:32122 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:32123 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:32123 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:32123 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:32123 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:32123 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:32124 0 OK 0x1.24f8p19 0x1.7ed816e9b443ap16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:32124 1 OK 0x1.8562e4192a9e6p18 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:32124 2 OK 0x1.873e8df36ab0dp19 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:32124 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5de8p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:32124 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5de8p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:32125 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:32125 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:32125 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:32125 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:32125 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:32126 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:32126 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:32126 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:32126 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:32126 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:32127 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:32127 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:32127 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:32127 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:32127 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:32128 0 OK 0x1.24f8p19 0x1.82cecd83b5059p16 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:32128 1 OK 0x1.8289a2cb236a6p18 -0x1.77fcaead221dp16 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:32128 2 OK 0x1.88ab2e9a6e4adp19 -0x1.77fcaead221dp16 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:32128 3 OK 0x1.8d19b32c1129cp18 0x1.24b9880b7720fp18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:32128 4 OK 0x1.83632669f76b2p19 0x1.24b9880b7720fp18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:32129 0 OK 0x1.24f8p19 0x1.623635ef1cb8ap16 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:32129 1 OK 0x1.93ddc76008933p18 -0x1.59729314e624fp16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:32129 2 OK 0x1.80011c4ffbb66p19 -0x1.59729314e624fp16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:32129 3 OK 0x1.9c6fffae6b3c8p18 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:32129 4 OK 0x1.7bb80028ca61cp19 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3213 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.38p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3213 1 OK -0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.1fffffffffffcp4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3213 2 OK 0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.1400000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3213 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.1fffffffffffcp4 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3213 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.1400000000001p7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32130 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:32130 1 OK -0x1.e6349b6f89f4cp18 -0x1.0508c5f7d2c1cp19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:32130 2 OK 0x1.54c24db7c4fbp19 -0x1.0508c5f7d2c1bp19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:32130 3 OK -0x1.9359a05eb2813p18 0x1.19b7b45ee2b01p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:32130 4 OK 0x1.2b54d02f59412p19 0x1.19b7b45ee2b02p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:32133 0 OK 0x1.29a8p19 0x1.44e4cd737cdd2p17 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:32133 1 OK 0x1.01b075d8c695p18 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:32133 2 OK 0x1.d277c5139cb58p19 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:32133 3 OK 0x1.184511ebb6ddcp18 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:32133 4 OK 0x1.c72d770a24912p19 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:32134 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:32134 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda99882p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:32134 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda99882p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:32134 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e36p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:32134 4 OK 0x1.8670ba72bc014p19 0x1.3052f091f3e36p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:32135 0 OK 0x1.24f8p19 0x1.c069e4aef592fp16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:32135 1 OK 0x1.614d92de92fd1p18 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:32135 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:32135 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:32135 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:32136 0 OK 0x1.24f8p19 0x1.c374b0c96a7e1p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:32136 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:32136 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:32136 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dce04p18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:32136 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dce04p18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:32137 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:32137 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:32137 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:32137 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:32137 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:32138 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:32138 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:32138 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:32138 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:32138 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:32139 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:32139 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:32139 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:32139 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:32139 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:3214 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.68p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3214 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.dfffffffffffep4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3214 2 OK 0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.2cp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3214 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.dfffffffffffep4 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3214 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.2cp7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32140 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:32140 1 OK 0x1.39170370f731bp18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:32140 2 OK 0x1.ad647e4784668p19 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:32140 3 OK 0x1.45cd37c6ce462p18 0x1.0d334102db22ep22 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:32140 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db22ep22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:32141 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:32141 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:32141 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:32141 3 OK 0x1.ee847b1cd767p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:32141 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:32142 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:32142 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:32142 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:32142 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:32142 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:32143 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:32143 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:32143 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:32143 3 OK 0x1.e92fa135fb9ffp17 0x1.23c16caecd927p21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:32143 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd927p21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:32144 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:32144 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:32144 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:32144 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:32144 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:32145 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:32145 1 OK -0x1.86b2371ea2d1p16 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:32145 2 OK 0x1.0c8f2371ea2d6p20 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:32145 3 OK -0x1.5297458080bap13 0x1.1a3752e74fe61p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:32145 4 OK 0x1.ed925d1602037p19 0x1.1a3752e74fe62p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:32146 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:32146 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:32146 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:32146 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:32146 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:32147 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:32147 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:32147 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:32147 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6491p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:32147 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6491p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:32148 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:32148 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:32148 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:32148 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:32148 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:32149 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:32149 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fbap16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:32149 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fbap16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:32149 3 OK 0x1.16844fa8b2f1cp18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:32149 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:3215 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.98p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3215 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.4ffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3215 2 OK 0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.44p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3215 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.4ffffffffffffp5 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3215 4 OK 0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.44p7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32150 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:32150 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:32150 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:32150 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:32150 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:32151 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:32151 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:32151 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:32151 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:32151 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:32152 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:32152 1 OK 0x1.96b30a2e34c9p18 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:32152 2 OK 0x1.7e967ae8e59b8p19 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:32152 3 OK 0x1.a0c3f35264cb7p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:32152 4 OK 0x1.798e0656cd9a4p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:32153 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:32153 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:32153 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:32153 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:32153 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:32154 0 OK 0x1.24f8p19 0x1.c0697505b68fdp16 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:32154 1 OK 0x1.615ed51025e25p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:32154 2 OK 0x1.99409577ed0e4p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:32154 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:32154 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:32155 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:32155 1 OK -0x1.83ac2769fab28p18 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32155 2 OK 0x1.852613b4fd58ap19 -0x1.053b9f9c695ap19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32155 3 OK -0x1.3283c083e845cp18 0x1.197f5851c9bdap19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32155 4 OK 0x1.5c91e041f4226p19 0x1.197f5851c9bd9p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32156 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:32156 1 OK -0x1.80b84ed3f5628p17 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32156 2 OK 0x1.e6ce13b4fd594p19 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32156 3 OK -0x1.bccf020fa113p16 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32156 4 OK 0x1.be39e041f422ep19 0x1.4a535851c9bdap19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32157 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:32157 1 OK 0x1.79ec4b02a6cp11 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32157 2 OK 0x1.243b09da7eacap20 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32157 3 OK 0x1.5070fdf05ee9p16 0x1.197f5851c9bdap19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32157 4 OK 0x1.0ff0f020fa117p20 0x1.197f5851c9bdap19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32158 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:32158 1 OK 0x1.8c87b12c0a9bp17 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32158 2 OK 0x1.550f09da7eac5p20 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:32158 3 OK 0x1.176c3f7c17ba4p18 0x1.4a535851c9bdap19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:32158 4 OK 0x1.40c4f020fa113p20 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3216 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.c800000000001p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3216 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.bp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3216 2 OK 0x1.ebe43295aca9fp16 0x1.5ac37fceb7764p16 0x0.0p0 0x1.5cp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3216 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.bp5 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3216 4 OK 0x1.44d011991521dp21 0x1.c9f5bbf8f04bap20 0x0.0p0 0x1.5cp7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32161 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG epsg:32161 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:32161 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:32161 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:32161 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:32164 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:32164 1 OK -0x1.603e91b2cc22p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.9fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32164 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.780000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32164 3 OK -0x1.603e91b2cc22p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.9fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32164 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.780000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32165 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32165 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32165 2 OK 0x1.a681f3d37eadep21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.600000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32165 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32165 4 OK 0x1.a681f3d37eadep21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.600000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32166 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32166 1 OK -0x1.603e91b2cc22p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.6fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32166 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32166 3 OK -0x1.603e91b2cc22p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.6fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32166 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32167 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32167 1 OK -0x1.603e91b2cc22p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.57ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32167 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32167 3 OK -0x1.603e91b2cc22p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.57ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32167 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3217 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.f8p6 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3217 1 OK -0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.07fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3217 2 OK 0x1.ebe43295acaa4p16 0x1.5ac37fceb775dp16 0x0.0p0 -0x1.5bfffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3217 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.07fffffffffffp6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3217 4 OK 0x1.44d011991522p21 0x1.c9f5bbf8f04b1p20 0x0.0p0 -0x1.5bfffffffffffp7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3218 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.14p7 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3218 1 OK -0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.37fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3218 2 OK 0x1.ebe43295acaa4p16 0x1.5ac37fceb775dp16 0x0.0p0 -0x1.43fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3218 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.37fffffffffffp6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3218 4 OK 0x1.44d011991522p21 0x1.c9f5bbf8f04b1p20 0x0.0p0 -0x1.43fffffffffffp7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32180 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG epsg:32180 1 OK -0x1.e8f08b04c4de4p17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32180 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32180 3 OK -0x1.e8f08b04c4de4p17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32180 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32181 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.a8p5 0x0.0p0 0x0.0p0 T +REG epsg:32181 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32181 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.800000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32181 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32181 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.800000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32182 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.cp5 0x0.0p0 0x0.0p0 T +REG epsg:32182 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32182 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.980000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32182 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32182 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.980000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32183 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG epsg:32183 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32183 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32183 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32183 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32184 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:32184 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32184 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32184 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32184 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32185 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:32185 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32185 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32185 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32185 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32186 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG epsg:32186 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32186 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32186 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32186 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32187 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG epsg:32187 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32187 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32187 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32187 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32188 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG epsg:32188 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32188 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32188 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32188 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32189 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG epsg:32189 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32189 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32189 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32189 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3219 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.2cp7 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3219 1 OK -0x1.ebe43295acaa3p16 0x1.5ac37fceb7761p16 0x0.0p0 0x1.68p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3219 2 OK 0x1.ebe43295aca9fp16 0x1.5ac37fceb7764p16 0x0.0p0 -0x1.2cp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3219 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b6p20 0x0.0p0 0x1.68p6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3219 4 OK 0x1.44d011991521dp21 0x1.c9f5bbf8f04bap20 0x0.0p0 -0x1.2cp7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32190 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG epsg:32190 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32190 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32190 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32190 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32191 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.4ap6 0x0.0p0 0x0.0p0 T +REG epsg:32191 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.5dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32191 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.360000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32191 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.5dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32191 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.360000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32192 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32192 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.57ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32192 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32192 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.57ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32192 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32193 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:32193 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.63ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32193 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.3c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32193 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.63ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32193 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.3c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32194 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32194 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32194 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32194 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32194 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32195 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:32195 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32195 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32195 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32195 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32196 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32196 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32196 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.600000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32196 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32196 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.600000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32197 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:32197 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.93ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32197 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32197 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.93ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32197 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32198 0 OK 0x0.0p0 0x1.b11f865aa09bep19 0x0.0p0 -0x1.12p6 0x1.9fffffffffbaap5 0x0.0p0 F +REG epsg:32198 1 OK -0x1.0b3a102762b28p21 -0x1.939aa034d63p18 0x0.0p0 -0x1.7374c68e6ad1bp6 0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:32198 2 OK 0x1.0b3a102762b29p21 -0x1.939aa034d63p18 0x0.0p0 -0x1.611672e32a5cbp5 0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:32198 3 OK -0x1.0533a90ea204cp20 0x1.4f35822fcef41p21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff6p6 0x0.0p0 F +REG epsg:32198 4 OK 0x1.0533a90ea204dp20 0x1.4f35822fcef41p21 0x0.0p0 -0x1.611672e32a5cbp5 0x1.0bffffffffff6p6 0x0.0p0 F +REG epsg:32199 0 OK 0x1.e848p19 0x1.f8eb3a7b179ffp16 0x0.0p0 -0x1.6d55555555555p6 0x1.aaaaaaaaaa9eep4 0x0.0p0 F +REG epsg:32199 1 OK 0x1.66c66cddf8956p19 -0x1.ee62e8730c364p16 0x0.0p0 -0x1.77c7107b1a9e2p6 0x1.8555555555483p4 0x0.0p0 F +REG epsg:32199 2 OK 0x1.34e4c99103b55p20 -0x1.ee62e8730c364p16 0x0.0p0 -0x1.62e39a2f900c8p6 0x1.8555555555483p4 0x0.0p0 F +REG epsg:32199 3 OK 0x1.6bffd1251689cp19 0x1.7d54bff3741ccp18 0x0.0p0 -0x1.77c7107b1a9e2p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG epsg:32199 4 OK 0x1.3248176d74bb2p20 0x1.7d54bff3741ccp18 0x0.0p0 -0x1.62e39a2f900c8p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG epsg:3220 0 OK 0x0.0p0 0x1.7ffe9adddf8f4p20 0x0.0p0 0x1.44p7 -0x1.3555555555556p6 0x0.0p0 F +REG epsg:3220 1 OK -0x1.ebe43295acaa1p16 0x1.5ac37fceb7762p16 0x0.0p0 0x1.97fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3220 2 OK 0x1.ebe43295acaa4p16 0x1.5ac37fceb775dp16 0x0.0p0 -0x1.13fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3220 3 OK -0x1.44d011991521ep21 0x1.c9f5bbf8f04b7p20 0x0.0p0 0x1.97fffffffffffp6 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:3220 4 OK 0x1.44d011991522p21 0x1.c9f5bbf8f04b1p20 0x0.0p0 -0x1.13fffffffffffp7 -0x1.f2aaaaaaaaa47p5 0x0.0p0 F +REG epsg:32201 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.62p7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32201 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.6400000000001p7 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32201 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.58p7 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32201 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.6400000000001p7 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32201 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.58p7 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32202 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.56p7 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32202 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.6p7 -0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32202 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.4cp7 -0x1.3ffffffff612p2 0x1.7f08p-15 F +REG epsg:32202 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.6p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32202 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.4cp7 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32203 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.4ap7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32203 1 OK -0x1.ad96e36aa925p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.54p7 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32203 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.4000000000001p7 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32203 3 OK -0x1.ad97068a7c0ap15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.54p7 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32203 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.4000000000001p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32204 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.3e00000000001p7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32204 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.48p7 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32204 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.34p7 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32204 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.48p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32204 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.34p7 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32205 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.32p7 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32205 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.3cp7 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32205 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.28p7 -0x1.3ffffffff611fp2 0x1.7f0cp-15 F +REG epsg:32205 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.3bfffffffffffp7 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32205 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.28p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32206 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.26p7 0x0.0p0 0x1.81fap-15 T +REG epsg:32206 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.3p7 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32206 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.1cp7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32206 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.3p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32206 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.1cp7 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32207 0 OK 0x1.e843b810caf29p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.1ap7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32207 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.23fffffffffffp7 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32207 2 OK 0x1.018e9324c3d1ep20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.1p7 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32207 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.24p7 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32207 4 OK 0x1.018e943dbded2p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.1p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32208 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.0ep7 -0x1.2f74bf1dc653ap-67 0x1.81fcp-15 T +REG epsg:32208 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.17fffffffffffp7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32208 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.04p7 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32208 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.18p7 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32208 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.04p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32209 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.0200000000001p7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32209 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.0cp7 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32209 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.fp6 -0x1.3ffffffff612p2 0x1.7f08p-15 F +REG epsg:32209 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.0cp7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32209 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.fp6 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:3221 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 -0x1.98p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3221 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.44p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3221 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.5000000000001p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3221 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.44p7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3221 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.4ffffffffffffp5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32210 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.ec00000000001p6 0x0.0p0 0x1.81fcp-15 T +REG epsg:32210 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.0000000000001p7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32210 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 -0x1.d800000000003p6 -0x1.3ffffffff611ep2 0x1.7f0ap-15 F +REG epsg:32210 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.0p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32210 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.d800000000003p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32211 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.d4p6 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32211 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.e8p6 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32211 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 -0x1.c000000000001p6 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32211 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.e8p6 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32211 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.c000000000001p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32212 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.bc00000000002p6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32212 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad28p-1 -0x1.d000000000001p6 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32212 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.a8p6 -0x1.3ffffffff611fp2 0x1.7f08p-15 F +REG epsg:32212 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f2p-3 -0x1.d000000000001p6 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32212 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.a800000000001p6 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32213 0 OK 0x1.e843b810caf42p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.a400000000001p6 -0x1.2f74bf1dc653ap-67 0x1.81fcp-15 T +REG epsg:32213 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.b800000000001p6 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32213 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209d9fp19 0x1.e508ad48p-1 -0x1.9000000000001p6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32213 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.b800000000001p6 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32213 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f8p-3 -0x1.9000000000001p6 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32214 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.8c00000000001p6 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32214 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.a000000000001p6 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32214 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.7800000000001p6 -0x1.3ffffffff611ep2 0x1.7f0ep-15 F +REG epsg:32214 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.a000000000001p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32214 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.7800000000001p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32215 0 OK 0x1.e843b810caf42p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.7400000000001p6 0x0.0p0 0x1.81fap-15 T +REG epsg:32215 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.8800000000001p6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32215 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209da1p19 0x1.e508ad28p-1 -0x1.6p6 -0x1.3ffffffff612p2 0x1.7f04p-15 F +REG epsg:32215 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.8800000000001p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32215 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f2p-3 -0x1.6p6 0x1.3ffffffff611dp2 0x1.7f04p-15 F +REG epsg:32216 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.5cp6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32216 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.7000000000001p6 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32216 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.48p6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32216 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.7000000000001p6 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32216 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.48p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32217 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.44p6 0x0.0p0 0x1.81fap-15 T +REG epsg:32217 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad28p-1 -0x1.58p6 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32217 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.3p6 -0x1.3ffffffff611fp2 0x1.7f0cp-15 F +REG epsg:32217 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f2p-3 -0x1.58p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32217 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.3p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32218 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.2cp6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32218 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.4p6 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32218 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.18p6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32218 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.4p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32218 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.18p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32219 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.14p6 -0x1.2f74bf1dc653ap-67 0x1.81fcp-15 T +REG epsg:32219 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.28p6 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32219 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 -0x1.0p6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32219 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.28p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32219 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.0p6 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:3222 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 -0x1.68p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3222 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.2bfffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3222 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.e000000000001p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3222 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.2cp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3222 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.dfffffffffffep4 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32220 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.f8p5 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32220 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.1p6 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32220 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.d000000000001p5 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32220 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.1p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32220 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.d000000000001p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32221 0 OK 0x1.e843b810caf7ep18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.c800000000001p5 0x0.0p0 0x1.81fcp-15 T +REG epsg:32221 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.fp5 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32221 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.a000000000001p5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32221 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.fp5 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32221 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.a000000000001p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32222 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.98p5 0x0.0p0 0x1.81fcp-15 T +REG epsg:32222 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.cp5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32222 2 OK 0x1.018e9324c3d33p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.6ffffffffffffp5 -0x1.3ffffffff611cp2 0x1.7f1p-15 F +REG epsg:32222 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.cp5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32222 4 OK 0x1.018e943dbdee6p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.7p5 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32223 0 OK 0x1.e843b810caf7ep18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.67ffffffffffep5 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32223 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.8fffffffffffep5 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32223 2 OK 0x1.018e9324c3d33p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.3ffffffffffffp5 -0x1.3ffffffff612p2 0x1.7f08p-15 F +REG epsg:32223 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.8fffffffffffep5 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32223 4 OK 0x1.018e943dbdee6p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.3ffffffffffffp5 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32224 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.38p5 0x0.0p0 0x1.81fap-15 T +REG epsg:32224 1 OK -0x1.ad96e36aa905p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.6p5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32224 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.1p5 -0x1.3ffffffff611ep2 0x1.7f0cp-15 F +REG epsg:32224 3 OK -0x1.ad97068a7becp15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.6p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32224 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.1p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32225 0 OK 0x1.e843b810caf7ep18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.07fffffffffffp5 0x0.0p0 0x1.81fcp-15 T +REG epsg:32225 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.3000000000002p5 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32225 2 OK 0x1.018e9324c3d35p20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 -0x1.bffffffffffffp4 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32225 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.3000000000002p5 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32225 4 OK 0x1.018e943dbdee8p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.bffffffffffffp4 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32226 0 OK 0x1.e843b810caf66p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.bp4 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32226 1 OK -0x1.ad96e36aa905p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.0p5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32226 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 -0x1.6000000000001p4 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32226 3 OK -0x1.ad97068a7becp15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.0p5 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32226 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.6000000000002p4 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32227 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.5p4 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32227 1 OK -0x1.ad96e36aa914p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.a000000000002p4 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32227 2 OK 0x1.018e9324c3d2ep20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.0000000000001p4 -0x1.3ffffffff612p2 0x1.7f0ap-15 F +REG epsg:32227 3 OK -0x1.ad97068a7bfbp15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.ap4 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32227 4 OK 0x1.018e943dbdeep20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.0000000000001p4 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32228 0 OK 0x1.e843b810caf48p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.dffffffffffffp3 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32228 1 OK -0x1.ad96e36aa91ep15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.4p4 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32228 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 -0x1.3ffffffffffffp3 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32228 3 OK -0x1.ad97068a7c04p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.4p4 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32228 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 -0x1.3ffffffffffffp3 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32229 0 OK 0x1.e843b810caf6cp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 -0x1.2000000000001p3 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32229 1 OK -0x1.ad96e36aa90bp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 -0x1.cp3 -0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32229 2 OK 0x1.018e9324c3d31p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 -0x1.0000000000002p2 -0x1.3ffffffff611ep2 0x1.7f0ep-15 F +REG epsg:32229 3 OK -0x1.ad97068a7bf1p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 -0x1.bffffffffffffp3 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32229 4 OK 0x1.018e943dbdee4p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 -0x1.0000000000001p2 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:3223 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 -0x1.38p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3223 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.13fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3223 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.2000000000004p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3223 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.14p7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3223 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.2p4 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32230 0 OK 0x1.e843b810caf5cp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 -0x1.8p1 0x0.0p0 0x1.81fap-15 T +REG epsg:32230 1 OK -0x1.ad96e36aa91p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 -0x1.0p3 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32230 2 OK 0x1.018e9324c3d2ep20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.0000000000003p1 -0x1.3ffffffff611ep2 0x1.7f0cp-15 F +REG epsg:32230 3 OK -0x1.ad97068a7bf6p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.ffffffffffffep2 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32230 4 OK 0x1.018e943dbdeep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.ffffffffffff7p0 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32231 0 OK 0x1.e843b810caf7ep18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.8000000000003p1 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32231 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 -0x1.0000000000002p1 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32231 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.0p3 -0x1.3ffffffff611cp2 0x1.7f0cp-15 F +REG epsg:32231 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 -0x1.ffffffffffff9p0 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32231 4 OK 0x1.018e943dbdee8p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.ffffffffffffdp2 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32232 0 OK 0x1.e843b810caf6cp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.2000000000001p3 0x0.0p0 0x1.81fap-15 T +REG epsg:32232 1 OK -0x1.ad96e36aa907p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad28p-1 0x1.0000000000001p2 -0x1.3ffffffff611cp2 0x1.7f06p-15 F +REG epsg:32232 2 OK 0x1.018e9324c3d32p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.cp3 -0x1.3ffffffff611fp2 0x1.7f0cp-15 F +REG epsg:32232 3 OK -0x1.ad97068a7beep15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f2p-3 0x1.0000000000001p2 0x1.3ffffffff611ep2 0x1.7f04p-15 F +REG epsg:32232 4 OK 0x1.018e943dbdee6p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.c000000000002p3 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32233 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.dffffffffffffp3 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32233 1 OK -0x1.ad96e36aa8f9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.3ffffffffffffp3 -0x1.3ffffffff611ep2 0x1.7f0ap-15 F +REG epsg:32233 2 OK 0x1.018e9324c3d39p20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 0x1.3ffffffffffffp4 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32233 3 OK -0x1.ad97068a7bdfp15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.3ffffffffffffp3 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32233 4 OK 0x1.018e943dbdeecp20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.3ffffffffffffp4 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32234 0 OK 0x1.e843b810caf7ep18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.5p4 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32234 1 OK -0x1.ad96e36aa903p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 0x1.0p4 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32234 2 OK 0x1.018e9324c3d35p20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 0x1.ap4 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32234 3 OK -0x1.ad97068a7be8p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.0000000000001p4 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32234 4 OK 0x1.018e943dbdee8p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.ap4 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32235 0 OK 0x1.e843b810caf6p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.afffffffffffep4 0x0.0p0 0x1.81fcp-15 T +REG epsg:32235 1 OK -0x1.ad96e36aa905p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.5ffffffffffffp4 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32235 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.0p5 -0x1.3ffffffff612p2 0x1.7f08p-15 F +REG epsg:32235 3 OK -0x1.ad97068a7becp15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.6000000000001p4 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32235 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.0p5 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32236 0 OK 0x1.e843b810caf4ep18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.07fffffffffffp5 0x0.0p0 0x1.81fcp-15 T +REG epsg:32236 1 OK -0x1.ad96e36aa914p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad48p-1 0x1.bffffffffffffp4 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32236 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.3000000000001p5 -0x1.3ffffffff612p2 0x1.7f08p-15 F +REG epsg:32236 3 OK -0x1.ad97068a7bfbp15 0x1.0ee2ca1d5cca9p19 0x1.4dae6f8p-3 0x1.bfffffffffffep4 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32236 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.3p5 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32237 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.3800000000001p5 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32237 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.1p5 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32237 2 OK 0x1.018e9324c3d33p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.6p5 -0x1.3ffffffff611cp2 0x1.7f1p-15 F +REG epsg:32237 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.1p5 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32237 4 OK 0x1.018e943dbdee6p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.6p5 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32238 0 OK 0x1.e843b810caf66p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.67ffffffffffep5 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32238 1 OK -0x1.ad96e36aa905p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad28p-1 0x1.4000000000001p5 -0x1.3ffffffff611dp2 0x1.7f06p-15 F +REG epsg:32238 2 OK 0x1.018e9324c3d3p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.8ffffffffffffp5 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32238 3 OK -0x1.ad97068a7becp15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f2p-3 0x1.4000000000001p5 0x1.3ffffffff611ep2 0x1.7f06p-15 F +REG epsg:32238 4 OK 0x1.018e943dbdee2p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.8ffffffffffffp5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32239 0 OK 0x1.e843b810caf97p18 -0x1.1fe27c535b252p2 0x1.1d018f7p-1 0x1.97fffffffffffp5 0x0.0p0 0x1.81fcp-15 T +REG epsg:32239 1 OK -0x1.ad96e36aa8e7p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad4p-1 0x1.7p5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32239 2 OK 0x1.018e9324c3d3cp20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.cp5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32239 3 OK -0x1.ad97068a7bcdp15 0x1.0ee2ca1d5cca9p19 0x1.4dae6f6p-3 0x1.7p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32239 4 OK 0x1.018e943dbdeefp20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.cp5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:3224 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 -0x1.08p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3224 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.f8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3224 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.800000000000ap2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3224 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.f8p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3224 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.7fffffffffffbp2 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32240 0 OK 0x1.e843b810caf4ep18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.c800000000001p5 0x0.0p0 0x1.81fcp-15 T +REG epsg:32240 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.9ffffffffffffp5 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32240 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.f000000000002p5 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32240 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.ap5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32240 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.f000000000002p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32241 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.f8p5 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32241 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad38p-1 0x1.d000000000001p5 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32241 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.1p6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32241 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.d000000000001p5 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32241 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.1p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32242 0 OK 0x1.e843b810caf29p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.1400000000001p6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32242 1 OK -0x1.ad96e36aa925p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.0p6 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32242 2 OK 0x1.018e9324c3d24p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.28p6 -0x1.3ffffffff6121p2 0x1.7f08p-15 F +REG epsg:32242 3 OK -0x1.ad97068a7c0ap15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.0p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32242 4 OK 0x1.018e943dbded8p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.28p6 0x1.3ffffffff611ep2 0x1.7f04p-15 F +REG epsg:32243 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.2c00000000001p6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32243 1 OK -0x1.ad96e36aa925p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.18p6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32243 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.4p6 -0x1.3ffffffff611ep2 0x1.7f0cp-15 F +REG epsg:32243 3 OK -0x1.ad97068a7c0ap15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.17fffffffffffp6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32243 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.4p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32244 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.44p6 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32244 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.3p6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32244 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.58p6 -0x1.3ffffffff611ep2 0x1.7f0cp-15 F +REG epsg:32244 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.3p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32244 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.58p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32245 0 OK 0x1.e843b810caf29p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.5cp6 0x0.0p0 0x1.81fap-15 T +REG epsg:32245 1 OK -0x1.ad96e36aa925p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.48p6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32245 2 OK 0x1.018e9324c3d24p20 -0x1.0ee3e1a209da1p19 0x1.e508ad28p-1 0x1.7000000000001p6 -0x1.3ffffffff612p2 0x1.7f04p-15 F +REG epsg:32245 3 OK -0x1.ad97068a7c0ap15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.48p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32245 4 OK 0x1.018e943dbded8p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f2p-3 0x1.7000000000001p6 0x1.3ffffffff611dp2 0x1.7f04p-15 F +REG epsg:32246 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.7400000000001p6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32246 1 OK -0x1.ad96e36aa918p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.6p6 -0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32246 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.8800000000001p6 -0x1.3ffffffff611ep2 0x1.7f0cp-15 F +REG epsg:32246 3 OK -0x1.ad97068a7bfep15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.6p6 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32246 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.8800000000001p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32247 0 OK 0x1.e843b810caf72p18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.8c00000000001p6 0x0.0p0 0x1.81fap-15 T +REG epsg:32247 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad28p-1 0x1.7800000000001p6 -0x1.3ffffffff611bp2 0x1.7f0ap-15 F +REG epsg:32247 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.a000000000001p6 -0x1.3ffffffff611ep2 0x1.7f0cp-15 F +REG epsg:32247 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f2p-3 0x1.7800000000001p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32247 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.a000000000001p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32248 0 OK 0x1.e843b810caf42p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.a400000000001p6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32248 1 OK -0x1.ad96e36aa925p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.9000000000001p6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32248 2 OK 0x1.018e9324c3d24p20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 0x1.b800000000001p6 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32248 3 OK -0x1.ad97068a7c0ap15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.9000000000001p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32248 4 OK 0x1.018e943dbded8p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.b800000000001p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32249 0 OK 0x1.e843b810cafbbp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.bcp6 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32249 1 OK -0x1.ad96e36aa8e7p15 -0x1.0ee3e9fd73bd8p19 0x1.e508ad38p-1 0x1.a800000000001p6 -0x1.3ffffffff611bp2 0x1.7f08p-15 F +REG epsg:32249 2 OK 0x1.018e9324c3d4ep20 -0x1.0ee3e1a209da1p19 0x1.e508ad4p-1 0x1.d000000000003p6 -0x1.3ffffffff611ep2 0x1.7f0ep-15 F +REG epsg:32249 3 OK -0x1.ad97068a7bcdp15 0x1.0ee2ca1d5cca9p19 0x1.4dae6f6p-3 0x1.a800000000001p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32249 4 OK 0x1.018e943dbdf02p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f6p-3 0x1.d000000000003p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:3225 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 -0x1.2p4 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3225 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.37fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3225 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.4ffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3225 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.38p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3225 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.5000000000001p5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32250 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.d400000000002p6 0x0.0p0 0x1.81fap-15 T +REG epsg:32250 1 OK -0x1.ad96e36aa9p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.c000000000001p6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32250 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.e800000000001p6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32250 3 OK -0x1.ad97068a7be5p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.c000000000001p6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32250 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.e800000000001p6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32251 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.ec00000000001p6 0x0.0p0 0x1.81fcp-15 T +REG epsg:32251 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad48p-1 0x1.d7fffffffffffp6 -0x1.3ffffffff611bp2 0x1.7f1p-15 F +REG epsg:32251 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.ffffffffffffep6 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32251 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5cca9p19 0x1.4dae6f8p-3 0x1.d7fffffffffffp6 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32251 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.ffffffffffffep6 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32252 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.02p7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32252 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.efffffffffffep6 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32252 2 OK 0x1.018e9324c3d4ep20 -0x1.0ee3e1a209da1p19 0x1.e508ad4p-1 0x1.0cp7 -0x1.3ffffffff611ep2 0x1.7f1p-15 F +REG epsg:32252 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.efffffffffffep6 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32252 4 OK 0x1.018e943dbdf02p20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f6p-3 0x1.0cp7 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32253 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.0e00000000001p7 -0x1.2f74bf1dc653ap-67 0x1.81fap-15 T +REG epsg:32253 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.0400000000001p7 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32253 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.1800000000001p7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32253 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.0400000000001p7 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:32253 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.1800000000001p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32254 0 OK 0x1.e843b810cafbbp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.1ap7 0x0.0p0 0x1.81fap-15 T +REG epsg:32254 1 OK -0x1.ad96e36aa8dap15 -0x1.0ee3e9fd73bd9p19 0x1.e508ad4p-1 0x1.1000000000001p7 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32254 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.23fffffffffffp7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32254 3 OK -0x1.ad97068a7bc1p15 0x1.0ee2ca1d5cca9p19 0x1.4dae6f6p-3 0x1.1p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32254 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.23fffffffffffp7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32255 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.26p7 0x0.0p0 0x1.81fap-15 T +REG epsg:32255 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.1bfffffffffffp7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32255 2 OK 0x1.018e9324c3d42p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.3p7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32255 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.1bfffffffffffp7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32255 4 OK 0x1.018e943dbdef4p20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.3p7 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32256 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.32p7 -0x1.2f74bf1dc653cp-67 0x1.81f6p-15 T +REG epsg:32256 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.28p7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32256 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.3cp7 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:32256 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.2800000000001p7 0x1.3ffffffff611bp2 0x1.7f0ep-15 F +REG epsg:32256 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.3cp7 0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32257 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.3dfffffffffffp7 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32257 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.34p7 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:32257 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209dap19 0x1.e508ad4p-1 0x1.48p7 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32257 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.34p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32257 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.47fffffffffffp7 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32258 0 OK 0x1.e843b810caf29p18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.4ap7 -0x1.2f74bf1dc653ap-67 0x1.81fcp-15 T +REG epsg:32258 1 OK -0x1.ad96e36aa925p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.4p7 -0x1.3ffffffff611dp2 0x1.7f0cp-15 F +REG epsg:32258 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209d9fp19 0x1.e508ad38p-1 0x1.54p7 -0x1.3ffffffff611ep2 0x1.7f0ap-15 F +REG epsg:32258 3 OK -0x1.ad97068a7c0ap15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.4p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32258 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb13p19 0x1.4dae6f6p-3 0x1.54p7 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32259 0 OK 0x1.e843b810caf5ap18 -0x1.1fe27c535b254p2 0x1.1d018f6p-1 0x1.56p7 -0x1.2f74bf1dc653bp-67 0x1.81f8p-15 T +REG epsg:32259 1 OK -0x1.ad96e36aa90cp15 -0x1.0ee3e9fd73bdap19 0x1.e508ad38p-1 0x1.4cp7 -0x1.3ffffffff611bp2 0x1.7f0cp-15 F +REG epsg:32259 2 OK 0x1.018e9324c3d2ap20 -0x1.0ee3e1a209da1p19 0x1.e508ad38p-1 0x1.6p7 -0x1.3ffffffff611ep2 0x1.7f0ep-15 F +REG epsg:32259 3 OK -0x1.ad97068a7bf2p15 0x1.0ee2ca1d5ccabp19 0x1.4dae6f4p-3 0x1.4cp7 0x1.3ffffffff611cp2 0x1.7f0ap-15 F +REG epsg:32259 4 OK 0x1.018e943dbdedep20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f4p-3 0x1.6p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:3226 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 -0x1.8000000000001p2 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3226 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.07fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3226 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.afffffffffffdp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3226 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.08p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3226 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.affffffffffffp5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32260 0 OK 0x1.e843b810caf8bp18 -0x1.1fe27c535b253p2 0x1.1d018f68p-1 0x1.62p7 0x0.0p0 0x1.81fap-15 T +REG epsg:32260 1 OK -0x1.ad96e36aa8f3p15 -0x1.0ee3e9fd73bdap19 0x1.e508ad4p-1 0x1.58p7 -0x1.3ffffffff611cp2 0x1.7f0ep-15 F +REG epsg:32260 2 OK 0x1.018e9324c3d36p20 -0x1.0ee3e1a209da1p19 0x1.e508ad28p-1 -0x1.64p7 -0x1.3ffffffff611fp2 0x1.7f08p-15 F +REG epsg:32260 3 OK -0x1.ad97068a7bd9p15 0x1.0ee2ca1d5ccaap19 0x1.4dae6f6p-3 0x1.58p7 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:32260 4 OK 0x1.018e943dbdeeap20 0x1.0ee2c1c1fbb14p19 0x1.4dae6f2p-3 -0x1.64p7 0x1.3ffffffff611dp2 0x1.7f08p-15 F +REG epsg:3227 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.8000000000001p2 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3227 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.afffffffffffdp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3227 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.07fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3227 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.affffffffffffp5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3227 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.08p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3228 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.2p4 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3228 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.4ffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3228 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.37fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3228 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.5000000000001p5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3228 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.38p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3229 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.dffffffffffffp4 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3229 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.dfffffffffffcp4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3229 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.68p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3229 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.dffffffffffffp4 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3229 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.68p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3230 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.5p5 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3230 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 -0x1.1fffffffffffep4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3230 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.97fffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3230 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 -0x1.2000000000002p4 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3230 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.9800000000001p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32301 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d6p22 0x1.36191694p1 -0x1.62p7 -0x1.8ffffffff50fcp4 0x1.3d34p-15 F +REG epsg:32301 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d64328p1 0x1.62f75a3f3d469p7 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32301 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.56f75a3f3d469p7 -0x1.dffffffff3a3ap4 0x1.21b4p-15 F +REG epsg:32301 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.62f75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32301 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.56f75a3f3d469p7 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32302 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.56p7 -0x1.8ffffffff50fap4 0x1.3d34p-15 F +REG epsg:32302 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d64328p1 -0x1.6108a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32302 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.4af75a3f3d469p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32302 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.6108a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32302 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.4af75a3f3d469p7 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32303 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d6p22 0x1.36191694p1 -0x1.4ap7 -0x1.8ffffffff50fcp4 0x1.3d34p-15 F +REG epsg:32303 1 OK -0x1.fc1f1c61f8acp14 0x1.97013e1dcb446p22 0x1.60d6432ep1 -0x1.5508a5c0c2b98p7 -0x1.dffffffff3a36p4 0x1.21b4p-15 F +REG epsg:32303 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.3ef75a3f3d469p7 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32303 3 OK -0x1.2fe7fd26785p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.5508a5c0c2b98p7 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:32303 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.3ef75a3f3d469p7 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32304 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.3e00000000001p7 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32304 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.4908a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32304 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.32f75a3f3d469p7 -0x1.dffffffff3a34p4 0x1.21bap-15 F +REG epsg:32304 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.4908a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32304 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.32f75a3f3d469p7 -0x1.3ffffffff6d1p4 0x1.54f6p-15 F +REG epsg:32305 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.32p7 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32305 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.3d08a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32305 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.26f75a3f3d46ap7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32305 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.3d08a5c0c2b98p7 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32305 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.26f75a3f3d46ap7 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32306 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.26p7 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32306 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.3108a5c0c2b98p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32306 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.1af75a3f3d469p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32306 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941474cp1 -0x1.3108a5c0c2b98p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32306 4 OK 0x1.07207ada98504p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.1af75a3f3d469p7 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32307 0 OK 0x1.e8441e26ee94p18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.1ap7 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32307 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.2508a5c0c2b96p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32307 2 OK 0x1.f82540c4b77c3p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.0ef75a3f3d469p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32307 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.2508a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32307 4 OK 0x1.07207ada984eep20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.0ef75a3f3d469p7 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32308 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.0dfffffffffffp7 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32308 1 OK -0x1.fc1f1c61f854p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.1908a5c0c2b96p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32308 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.02f75a3f3d46ap7 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32308 3 OK -0x1.2fe7fd267837p16 0x1.daca902abb5a6p22 0x1.0941474cp1 -0x1.1908a5c0c2b96p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32308 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.02f75a3f3d469p7 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32309 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.02p7 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32309 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.0d08a5c0c2b98p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32309 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.edeeb47e7a8dp6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32309 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.0d08a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32309 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.edeeb47e7a8dp6 -0x1.3ffffffff6d1p4 0x1.54f6p-15 F +REG epsg:3231 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.bp5 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3231 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.7ffffffffffedp2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3231 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.c8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3231 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 -0x1.7fffffffffffbp2 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3231 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.c800000000001p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32310 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.ec00000000001p6 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32310 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.0108a5c0c2b98p7 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32310 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.d5eeb47e7a8d3p6 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32310 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a7p22 0x1.0941475p1 -0x1.0108a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32310 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.d5eeb47e7a8d3p6 -0x1.3ffffffff6d12p4 0x1.54f4p-15 F +REG epsg:32311 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.d4p6 -0x1.8ffffffff50fap4 0x1.3d34p-15 F +REG epsg:32311 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb446p22 0x1.60d6432ep1 -0x1.ea114b818573p6 -0x1.dffffffff3a36p4 0x1.21b4p-15 F +REG epsg:32311 2 OK 0x1.f82540c4b77e2p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.bdeeb47e7a8d2p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32311 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a7p22 0x1.0941475p1 -0x1.ea114b818573p6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32311 4 OK 0x1.07207ada984fep20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.bdeeb47e7a8d3p6 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32312 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.bc00000000001p6 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32312 1 OK -0x1.fc1f1c61f84p14 0x1.97013e1dcb444p22 0x1.60d64328p1 -0x1.d2114b818572dp6 -0x1.dffffffff3a3bp4 0x1.21bp-15 F +REG epsg:32312 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d64328p1 -0x1.a5eeb47e7a8d3p6 -0x1.dffffffff3a3bp4 0x1.21bp-15 F +REG epsg:32312 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.d2114b818572dp6 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32312 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.a5eeb47e7a8d4p6 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32313 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.a400000000001p6 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32313 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb446p22 0x1.60d6432ep1 -0x1.ba114b818572ep6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32313 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.8deeb47e7a8d4p6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32313 3 OK -0x1.2fe7fd2678488p16 0x1.daca902abb5a6p22 0x1.0941474cp1 -0x1.ba114b818572fp6 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:32313 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.8deeb47e7a8d4p6 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32314 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.8c00000000001p6 -0x1.8ffffffff50f8p4 0x1.3d38p-15 F +REG epsg:32314 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb446p22 0x1.60d6432ep1 -0x1.a2114b818572fp6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32314 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.75eeb47e7a8d3p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32314 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.a2114b818572fp6 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32314 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.75eeb47e7a8d3p6 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32315 0 OK 0x1.e8441e26ee956p18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.7400000000001p6 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32315 1 OK -0x1.fc1f1c61f89ap14 0x1.97013e1dcb446p22 0x1.60d6433p1 -0x1.8a114b818572fp6 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32315 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.5deeb47e7a8d2p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32315 3 OK -0x1.2fe7fd2678488p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.8a114b818572fp6 -0x1.3ffffffff6d13p4 0x1.54eep-15 F +REG epsg:32315 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.5deeb47e7a8d2p6 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32316 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d6p22 0x1.36191694p1 -0x1.5cp6 -0x1.8ffffffff50fcp4 0x1.3d34p-15 F +REG epsg:32316 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d64328p1 -0x1.72114b818572fp6 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32316 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.45eeb47e7a8d2p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32316 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.72114b818572fp6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32316 4 OK 0x1.07207ada98504p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.45eeb47e7a8d2p6 -0x1.3ffffffff6d1p4 0x1.54f4p-15 F +REG epsg:32317 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.44p6 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32317 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d64328p1 -0x1.5a114b818572ep6 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32317 2 OK 0x1.f82540c4b77e2p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.2deeb47e7a8d2p6 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32317 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.5a114b818572ep6 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32317 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.2deeb47e7a8d3p6 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32318 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.2cp6 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32318 1 OK -0x1.fc1f1c61f86cp14 0x1.97013e1dcb446p22 0x1.60d6432ep1 -0x1.42114b818572ep6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32318 2 OK 0x1.f82540c4b77e4p19 0x1.970143dd3cc5ep22 0x1.60d6432ep1 -0x1.15eeb47e7a8d1p6 -0x1.dffffffff3a3ap4 0x1.21b4p-15 F +REG epsg:32318 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a7p22 0x1.0941475p1 -0x1.42114b818572ep6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32318 4 OK 0x1.07207ada984fep20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32319 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.14p6 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32319 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.2a114b818572ep6 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32319 2 OK 0x1.f82540c4b77e2p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.fbdd68fcf51a4p5 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32319 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.2a114b818572ep6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32319 4 OK 0x1.07207ada984fep20 0x1.daca946fc4639p22 0x1.0941474cp1 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:3232 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.08p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3232 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.800000000000ap2 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3232 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.f8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3232 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.7fffffffffffbp2 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3232 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.f8p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32320 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.f8p5 -0x1.8ffffffff50f8p4 0x1.3d34p-15 F +REG epsg:32320 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.12114b818572ep6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32320 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.cbdd68fcf51a1p5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32320 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.12114b818572ep6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32320 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32321 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.c8p5 -0x1.8ffffffff50f8p4 0x1.3d38p-15 F +REG epsg:32321 1 OK -0x1.fc1f1c61f854p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.f42297030ae5cp5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32321 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.9bdd68fcf51a3p5 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32321 3 OK -0x1.2fe7fd267837p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.f42297030ae5cp5 -0x1.3ffffffff6d1p4 0x1.54f6p-15 F +REG epsg:32321 4 OK 0x1.07207ada98508p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.9bdd68fcf51a3p5 -0x1.3ffffffff6d0fp4 0x1.54fp-15 F +REG epsg:32322 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.9800000000001p5 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32322 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.c42297030ae5cp5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32322 2 OK 0x1.f82540c4b77e9p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.6bdd68fcf51a4p5 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32322 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941474cp1 -0x1.c42297030ae5cp5 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:32322 4 OK 0x1.07207ada985p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.6bdd68fcf51a4p5 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32323 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.68p5 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32323 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb446p22 0x1.60d6433p1 -0x1.942297030ae5ep5 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32323 2 OK 0x1.f82540c4b77e8p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.3bdd68fcf51a3p5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32323 3 OK -0x1.2fe7fd2678408p16 0x1.daca902abb5a6p22 0x1.0941474cp1 -0x1.942297030ae5dp5 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:32323 4 OK 0x1.07207ada984fep20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.3bdd68fcf51a2p5 -0x1.3ffffffff6d12p4 0x1.54f4p-15 F +REG epsg:32324 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.38p5 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32324 1 OK -0x1.fc1f1c61f898p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.642297030ae5ep5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32324 2 OK 0x1.f82540c4b77e4p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.0bdd68fcf51a2p5 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32324 3 OK -0x1.2fe7fd2678488p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.642297030ae5ep5 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:32324 4 OK 0x1.07207ada984fep20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.0bdd68fcf51a2p5 -0x1.3ffffffff6d12p4 0x1.54f4p-15 F +REG epsg:32325 0 OK 0x1.e8441e26ee98dp18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.08p5 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32325 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.342297030ae5dp5 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32325 2 OK 0x1.f82540c4b77eap19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.b7bad1f9ea345p4 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32325 3 OK -0x1.2fe7fd2678408p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.342297030ae5dp5 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32325 4 OK 0x1.07207ada985p20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.b7bad1f9ea345p4 -0x1.3ffffffff6d12p4 0x1.54f4p-15 F +REG epsg:32326 0 OK 0x1.e8441e26ee977p18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.bp4 -0x1.8ffffffff50f8p4 0x1.3d38p-15 F +REG epsg:32326 1 OK -0x1.fc1f1c61f86cp14 0x1.97013e1dcb446p22 0x1.60d6433p1 -0x1.042297030ae5cp5 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32326 2 OK 0x1.f82540c4b77e4p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.57bad1f9ea348p4 -0x1.dffffffff3a38p4 0x1.21b6p-15 F +REG epsg:32326 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a7p22 0x1.0941475p1 -0x1.042297030ae5ep5 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32326 4 OK 0x1.07207ada984fdp20 0x1.daca946fc4639p22 0x1.0941475p1 -0x1.57bad1f9ea348p4 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32327 0 OK 0x1.e8441e26ee967p18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.5p4 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32327 1 OK -0x1.fc1f1c61f884p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.a8452e0615cb8p4 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32327 2 OK 0x1.f82540c4b77ddp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.ef75a3f3d468cp3 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32327 3 OK -0x1.2fe7fd2678448p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.a8452e0615cb8p4 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32327 4 OK 0x1.07207ada984fcp20 0x1.daca946fc4639p22 0x1.0941474cp1 -0x1.ef75a3f3d468ep3 -0x1.3ffffffff6d13p4 0x1.54eep-15 F +REG epsg:32328 0 OK 0x1.e8441e26ee967p18 0x1.b997a427da0d8p22 0x1.3619169ap1 -0x1.dfffffffffffep3 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32328 1 OK -0x1.fc1f1c61f898p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.48452e0615cbap4 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32328 2 OK 0x1.f82540c4b77d5p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 -0x1.2f75a3f3d469p3 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32328 3 OK -0x1.2fe7fd26784a8p16 0x1.daca902abb5a6p22 0x1.0941474cp1 -0x1.48452e0615cb9p4 -0x1.3ffffffff6d1p4 0x1.54ecp-15 F +REG epsg:32328 4 OK 0x1.07207ada984f6p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.2f75a3f3d4691p3 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32329 0 OK 0x1.e8441e26ee97dp18 0x1.b997a427da0d8p22 0x1.36191698p1 -0x1.2p3 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32329 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.d08a5c0c2b975p3 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32329 2 OK 0x1.f82540c4b77e4p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.bdd68fcf51a34p1 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32329 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.d08a5c0c2b975p3 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32329 4 OK 0x1.07207ada985p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.bdd68fcf51a34p1 -0x1.3ffffffff6d1p4 0x1.54f4p-15 F +REG epsg:3233 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.38p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3233 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.2000000000004p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3233 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.13fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3233 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.2p4 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3233 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.14p7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32330 0 OK 0x1.e8441e26ee96dp18 0x1.b997a427da0d7p22 0x1.36191698p1 -0x1.8000000000001p1 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32330 1 OK -0x1.fc1f1c61f886p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 -0x1.108a5c0c2b973p3 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32330 2 OK 0x1.f82540c4b77ddp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.42297030ae5ccp1 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32330 3 OK -0x1.2fe7fd267844p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.108a5c0c2b973p3 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32330 4 OK 0x1.07207ada984fcp20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.42297030ae5cfp1 -0x1.3ffffffff6d1p4 0x1.54f4p-15 F +REG epsg:32331 0 OK 0x1.e8441e26ee98dp18 0x1.b997a427da0d6p22 0x1.36191694p1 0x1.8000000000002p1 -0x1.8ffffffff50fcp4 0x1.3d34p-15 F +REG epsg:32331 1 OK -0x1.fc1f1c61f86cp14 0x1.97013e1dcb444p22 0x1.60d64328p1 -0x1.42297030ae5c8p1 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32331 2 OK 0x1.f82540c4b77ecp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.108a5c0c2b974p3 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32331 3 OK -0x1.2fe7fd26783d8p16 0x1.daca902abb5a6p22 0x1.0941475p1 -0x1.42297030ae5cbp1 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32331 4 OK 0x1.07207ada98502p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.108a5c0c2b973p3 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32332 0 OK 0x1.e8441e26ee97dp18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.2000000000001p3 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32332 1 OK -0x1.fc1f1c61f876p14 0x1.97013e1dcb444p22 0x1.60d64328p1 0x1.bdd68fcf51a3bp1 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32332 2 OK 0x1.f82540c4b77e8p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.d08a5c0c2b975p3 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32332 3 OK -0x1.2fe7fd2678418p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.bdd68fcf51a35p1 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32332 4 OK 0x1.07207ada985p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.d08a5c0c2b973p3 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32333 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.dffffffffffffp3 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32333 1 OK -0x1.fc1f1c61f85ep14 0x1.97013e1dcb446p22 0x1.60d6432ep1 0x1.2f75a3f3d468fp3 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32333 2 OK 0x1.f82540c4b77f2p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.48452e0615cbbp4 -0x1.dffffffff3a38p4 0x1.21b6p-15 F +REG epsg:32333 3 OK -0x1.2fe7fd267839p16 0x1.daca902abb5a7p22 0x1.0941475p1 0x1.2f75a3f3d468fp3 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:32333 4 OK 0x1.07207ada98506p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.48452e0615cbap4 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32334 0 OK 0x1.e8441e26ee98dp18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.5p4 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32334 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.ef75a3f3d468cp3 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32334 2 OK 0x1.f82540c4b77eap19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.a8452e0615cb8p4 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32334 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.ef75a3f3d468fp3 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32334 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941474cp1 0x1.a8452e0615cbap4 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:32335 0 OK 0x1.e8441e26ee97dp18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.b000000000002p4 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32335 1 OK -0x1.fc1f1c61f874p14 0x1.97013e1dcb444p22 0x1.60d64328p1 0x1.57bad1f9ea347p4 -0x1.dffffffff3a3bp4 0x1.21bp-15 F +REG epsg:32335 2 OK 0x1.f82540c4b77e2p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.042297030ae5cp5 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32335 3 OK -0x1.2fe7fd26783e8p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.57bad1f9ea348p4 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32335 4 OK 0x1.07207ada984fep20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.042297030ae5bp5 -0x1.3ffffffff6d0fp4 0x1.54f6p-15 F +REG epsg:32336 0 OK 0x1.e8441e26ee977p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.08p5 -0x1.8ffffffff50f8p4 0x1.3d38p-15 F +REG epsg:32336 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.b7bad1f9ea34ap4 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32336 2 OK 0x1.f82540c4b77ddp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.342297030ae5dp5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32336 3 OK -0x1.2fe7fd2678418p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.b7bad1f9ea347p4 -0x1.3ffffffff6d1p4 0x1.54f6p-15 F +REG epsg:32336 4 OK 0x1.07207ada984fcp20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.342297030ae5dp5 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32337 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.37fffffffffffp5 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32337 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.0bdd68fcf51a4p5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32337 2 OK 0x1.f82540c4b77f2p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.642297030ae5dp5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32337 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.0bdd68fcf51a3p5 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32337 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.642297030ae5cp5 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32338 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.6800000000001p5 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32338 1 OK -0x1.fc1f1c61f874p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.3bdd68fcf51a4p5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32338 2 OK 0x1.f82540c4b77e9p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.942297030ae5cp5 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32338 3 OK -0x1.2fe7fd2678408p16 0x1.daca902abb5a6p22 0x1.0941474cp1 0x1.3bdd68fcf51a3p5 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32338 4 OK 0x1.07207ada984fep20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.942297030ae5ep5 -0x1.3ffffffff6d11p4 0x1.54f8p-15 F +REG epsg:32339 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.97fffffffffffp5 -0x1.8ffffffff50f5p4 0x1.3d3ep-15 F +REG epsg:32339 1 OK -0x1.fc1f1c61f854p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.6bdd68fcf51a4p5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32339 2 OK 0x1.f82540c4b77f2p19 0x1.970143dd3cc5cp22 0x1.60d64328p1 0x1.c42297030ae5cp5 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32339 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.6bdd68fcf51a3p5 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:32339 4 OK 0x1.07207ada9850ap20 0x1.daca946fc4639p22 0x1.0941474cp1 0x1.c42297030ae5dp5 -0x1.3ffffffff6d12p4 0x1.54fp-15 F +REG epsg:3234 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.68p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3234 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.e000000000001p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3234 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.2bfffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3234 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.dfffffffffffep4 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3234 4 OK 0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.2cp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32340 0 OK 0x1.e8441e26ee961p18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.c800000000001p5 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32340 1 OK -0x1.fc1f1c61f89ap14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.9bdd68fcf51a3p5 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32340 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.f42297030ae5cp5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32340 3 OK -0x1.2fe7fd26784c8p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.9bdd68fcf51a3p5 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32340 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.f42297030ae5ep5 -0x1.3ffffffff6d12p4 0x1.54f4p-15 F +REG epsg:32341 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.f8p5 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32341 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.cbdd68fcf51a2p5 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32341 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.12114b818572dp6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32341 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.cbdd68fcf51a2p5 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32341 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.12114b818572ep6 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32342 0 OK 0x1.e8441e26ee94p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.1400000000001p6 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32342 1 OK -0x1.fc1f1c61f8acp14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.fbdd68fcf51a4p5 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32342 2 OK 0x1.f82540c4b77cdp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.2a114b818572ep6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32342 3 OK -0x1.2fe7fd26784fp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.fbdd68fcf51a4p5 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32342 4 OK 0x1.07207ada984f2p20 0x1.daca946fc4639p22 0x1.0941474cp1 0x1.2a114b818572ep6 -0x1.3ffffffff6d13p4 0x1.54eep-15 F +REG epsg:32343 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.2cp6 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32343 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.15eeb47e7a8d2p6 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32343 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.42114b818572ep6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32343 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941474cp1 0x1.15eeb47e7a8d3p6 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:32343 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.42114b818572ep6 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32344 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.44p6 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32344 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.2deeb47e7a8d2p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32344 2 OK 0x1.f82540c4b77e2p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.5a114b818572ep6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32344 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.2deeb47e7a8d2p6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32344 4 OK 0x1.07207ada984fep20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.5a114b818572ep6 -0x1.3ffffffff6d1p4 0x1.54f4p-15 F +REG epsg:32345 0 OK 0x1.e8441e26ee94p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.5cp6 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32345 1 OK -0x1.fc1f1c61f8acp14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.45eeb47e7a8d2p6 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32345 2 OK 0x1.f82540c4b77cdp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.72114b818572fp6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32345 3 OK -0x1.2fe7fd26784fp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.45eeb47e7a8d2p6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32345 4 OK 0x1.07207ada984f2p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.72114b818572fp6 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32346 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d6p22 0x1.36191694p1 0x1.7400000000001p6 -0x1.8ffffffff50fcp4 0x1.3d34p-15 F +REG epsg:32346 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d64328p1 0x1.5deeb47e7a8d2p6 -0x1.dffffffff3a3bp4 0x1.21aep-15 F +REG epsg:32346 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.8a114b818572fp6 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32346 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.5deeb47e7a8d2p6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32346 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.8a114b818572fp6 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32347 0 OK 0x1.e8441e26ee982p18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.8c00000000001p6 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32347 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.75eeb47e7a8d3p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32347 2 OK 0x1.f82540c4b77e4p19 0x1.970143dd3cc5ep22 0x1.60d6432ep1 0x1.a2114b818572fp6 -0x1.dffffffff3a36p4 0x1.21b4p-15 F +REG epsg:32347 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.75eeb47e7a8d3p6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32347 4 OK 0x1.07207ada984fep20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.a2114b818572fp6 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:32348 0 OK 0x1.e8441e26ee956p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.a400000000001p6 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32348 1 OK -0x1.fc1f1c61f8acp14 0x1.97013e1dcb446p22 0x1.60d6432ep1 0x1.8deeb47e7a8d3p6 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32348 2 OK 0x1.f82540c4b77cep19 0x1.970143dd3cc5ep22 0x1.60d6432ep1 0x1.ba114b818572fp6 -0x1.dffffffff3a3ap4 0x1.21b2p-15 F +REG epsg:32348 3 OK -0x1.2fe7fd26785p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.8deeb47e7a8d3p6 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:32348 4 OK 0x1.07207ada984f2p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.ba114b818572fp6 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32349 0 OK 0x1.e8441e26ee9c4p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.bcp6 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32349 1 OK -0x1.fc1f1c61f814p14 0x1.97013e1dcb446p22 0x1.60d64328p1 0x1.a5eeb47e7a8d4p6 -0x1.dffffffff3a36p4 0x1.21bp-15 F +REG epsg:32349 2 OK 0x1.f82540c4b7801p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.d2114b818572fp6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32349 3 OK -0x1.2fe7fd26782cp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.a5eeb47e7a8d3p6 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32349 4 OK 0x1.07207ada9850fp20 0x1.daca946fc4639p22 0x1.0941474cp1 0x1.d2114b818572fp6 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:3235 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.98p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3235 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.5000000000001p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3235 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.44p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3235 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.4ffffffffffffp5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3235 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.44p7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32350 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.d400000000002p6 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32350 1 OK -0x1.fc1f1c61f86ap14 0x1.97013e1dcb444p22 0x1.60d64328p1 0x1.bdeeb47e7a8d3p6 -0x1.dffffffff3a3bp4 0x1.21bp-15 F +REG epsg:32350 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.ea114b818572ep6 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32350 3 OK -0x1.2fe7fd26783dp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.bdeeb47e7a8d3p6 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32350 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.ea114b818572ep6 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32351 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.ec00000000001p6 -0x1.8ffffffff50f8p4 0x1.3d3ap-15 F +REG epsg:32351 1 OK -0x1.fc1f1c61f82cp14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.d5eeb47e7a8d4p6 -0x1.dffffffff3a3ap4 0x1.21b8p-15 F +REG epsg:32351 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.0108a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32351 3 OK -0x1.2fe7fd26782cp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.d5eeb47e7a8d3p6 -0x1.3ffffffff6d1p4 0x1.54f6p-15 F +REG epsg:32351 4 OK 0x1.07207ada98504p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.0108a5c0c2b97p7 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32352 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.01fffffffffffp7 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32352 1 OK -0x1.fc1f1c61f854p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.edeeb47e7a8d1p6 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32352 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.0d08a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32352 3 OK -0x1.2fe7fd26782cp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.edeeb47e7a8d1p6 -0x1.3ffffffff6d1p4 0x1.54f6p-15 F +REG epsg:32352 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.0d08a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32353 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.0e00000000001p7 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32353 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.02f75a3f3d469p7 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32353 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.1908a5c0c2b96p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32353 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941474cp1 0x1.02f75a3f3d468p7 -0x1.3ffffffff6d12p4 0x1.54eep-15 F +REG epsg:32353 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.1908a5c0c2b97p7 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32354 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.1ap7 -0x1.8ffffffff50f5p4 0x1.3d3ep-15 F +REG epsg:32354 1 OK -0x1.fc1f1c61f82cp14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.0ef75a3f3d46ap7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32354 2 OK 0x1.f82540c4b77edp19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.2508a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32354 3 OK -0x1.2fe7fd267837p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.0ef75a3f3d469p7 -0x1.3ffffffff6d12p4 0x1.54f2p-15 F +REG epsg:32354 4 OK 0x1.07207ada98504p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.2508a5c0c2b97p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32355 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d8p22 0x1.36191698p1 0x1.26p7 -0x1.8ffffffff50f7p4 0x1.3d36p-15 F +REG epsg:32355 1 OK -0x1.fc1f1c61f82cp14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.1af75a3f3d469p7 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32355 2 OK 0x1.f82540c4b7801p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.3108a5c0c2b98p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32355 3 OK -0x1.2fe7fd267837p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.1af75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32355 4 OK 0x1.07207ada9850fp20 0x1.daca946fc4639p22 0x1.0941474cp1 0x1.3108a5c0c2b98p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32356 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.32p7 -0x1.8ffffffff50f7p4 0x1.3d3ap-15 F +REG epsg:32356 1 OK -0x1.fc1f1c61f856p14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.26f75a3f3d46ap7 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32356 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.3d08a5c0c2b96p7 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32356 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a7p22 0x1.0941475p1 0x1.26f75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32356 4 OK 0x1.07207ada984f8p20 0x1.daca946fc4639p22 0x1.0941475p1 0x1.3d08a5c0c2b97p7 -0x1.3ffffffff6d13p4 0x1.54f2p-15 F +REG epsg:32357 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.3ep7 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32357 1 OK -0x1.fc1f1c61f854p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.32f75a3f3d469p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32357 2 OK 0x1.f82540c4b7801p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.4908a5c0c2b98p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32357 3 OK -0x1.2fe7fd267837p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.32f75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32357 4 OK 0x1.07207ada9850fp20 0x1.daca946fc4639p22 0x1.0941474cp1 0x1.4908a5c0c2b97p7 -0x1.3ffffffff6d12p4 0x1.54fp-15 F +REG epsg:32358 0 OK 0x1.e8441e26ee94p18 0x1.b997a427da0d8p22 0x1.3619169ap1 0x1.4ap7 -0x1.8ffffffff50f5p4 0x1.3d3ep-15 F +REG epsg:32358 1 OK -0x1.fc1f1c61f8acp14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.3ef75a3f3d469p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32358 2 OK 0x1.f82540c4b77d8p19 0x1.970143dd3cc5ep22 0x1.60d6433p1 0x1.5508a5c0c2b97p7 -0x1.dffffffff3a36p4 0x1.21b6p-15 F +REG epsg:32358 3 OK -0x1.2fe7fd26784fp16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.3ef75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32358 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.5508a5c0c2b98p7 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:32359 0 OK 0x1.e8441e26ee96cp18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.56p7 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32359 1 OK -0x1.fc1f1c61f88p14 0x1.97013e1dcb444p22 0x1.60d6432cp1 0x1.4af75a3f3d468p7 -0x1.dffffffff3a3dp4 0x1.21b2p-15 F +REG epsg:32359 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 0x1.6108a5c0c2b97p7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32359 3 OK -0x1.2fe7fd267843p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.4af75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f2p-15 F +REG epsg:32359 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 0x1.6108a5c0c2b97p7 -0x1.3ffffffff6d1p4 0x1.54fp-15 F +REG epsg:3236 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.c800000000001p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3236 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.b000000000002p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3236 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.5cp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3236 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.bp5 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3236 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee433p20 0x0.0p0 0x1.5cp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32360 0 OK 0x1.e8441e26ee998p18 0x1.b997a427da0d7p22 0x1.36191698p1 0x1.62p7 -0x1.8ffffffff50f9p4 0x1.3d36p-15 F +REG epsg:32360 1 OK -0x1.fc1f1c61f856p14 0x1.97013e1dcb446p22 0x1.60d6433p1 0x1.56f75a3f3d469p7 -0x1.dffffffff3a36p4 0x1.21b8p-15 F +REG epsg:32360 2 OK 0x1.f82540c4b77d7p19 0x1.970143dd3cc5cp22 0x1.60d6432cp1 -0x1.62f75a3f3d46ap7 -0x1.dffffffff3a3bp4 0x1.21b4p-15 F +REG epsg:32360 3 OK -0x1.2fe7fd267837p16 0x1.daca902abb5a6p22 0x1.0941475p1 0x1.56f75a3f3d469p7 -0x1.3ffffffff6d11p4 0x1.54f4p-15 F +REG epsg:32360 4 OK 0x1.07207ada984f8p20 0x1.daca946fc463ap22 0x1.0941475p1 -0x1.62f75a3f3d46ap7 -0x1.3ffffffff6d0fp4 0x1.54f4p-15 F +REG epsg:3237 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.f8p6 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3237 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.0800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3237 2 OK 0x1.c145bc2130ed7p16 0x1.2aa585bd8daep16 0x0.0p0 -0x1.5bfffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3237 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.08p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3237 4 OK 0x1.2cf07e321caa5p21 0x1.9016d8b2ee42ap20 0x0.0p0 -0x1.5bfffffffffffp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3238 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.14p7 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3238 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.3800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3238 2 OK 0x1.c145bc2130ed7p16 0x1.2aa585bd8daep16 0x0.0p0 -0x1.43fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3238 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.38p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3238 4 OK 0x1.2cf07e321caa5p21 0x1.9016d8b2ee42ap20 0x0.0p0 -0x1.43fffffffffffp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3239 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.2cp7 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3239 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae3p16 0x0.0p0 0x1.6800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3239 2 OK 0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 -0x1.2cp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3239 3 OK -0x1.2cf07e321caa3p21 0x1.9016d8b2ee42fp20 0x0.0p0 0x1.68p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3239 4 OK 0x1.2cf07e321caa2p21 0x1.9016d8b2ee433p20 0x0.0p0 -0x1.2cp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3240 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.44p7 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3240 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.9800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3240 2 OK 0x1.c145bc2130ed7p16 0x1.2aa585bd8daep16 0x0.0p0 -0x1.13fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3240 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee432p20 0x0.0p0 0x1.98p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3240 4 OK 0x1.2cf07e321caa5p21 0x1.9016d8b2ee42ap20 0x0.0p0 -0x1.13fffffffffffp7 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32401 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.62p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32401 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2febp2 0x1.64p7 -0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32401 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.58p7 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32401 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04cp2 0x1.64p7 0x1.3fffffffea8fep2 0x1.9d76p-14 F +REG epsg:32401 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.58p7 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG epsg:32402 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.56p7 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG epsg:32402 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.6p7 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32402 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.4cp7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32402 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.6p7 0x1.3fffffffea8ffp2 0x1.9d76p-14 F +REG epsg:32402 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.4cp7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32403 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.4ap7 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG epsg:32403 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.54p7 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32403 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.3ffffffffffffp7 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32403 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.54p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32403 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.3ffffffffffffp7 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG epsg:32404 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.3ep7 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG epsg:32404 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.48p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32404 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.34p7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32404 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.48p7 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32404 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.34p7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32405 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.32p7 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG epsg:32405 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.3cp7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32405 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.28p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32405 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.3cp7 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32405 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.28p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32406 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.25fffffffffffp7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32406 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.3p7 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32406 2 OK 0x1.018e12e0a96aap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.1cp7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32406 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.3p7 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32406 4 OK 0x1.018e13574b762p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.1cp7 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG epsg:32407 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.19fffffffffffp7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a2p-14 T +REG epsg:32407 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.24p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32407 2 OK 0x1.018e12e0a9686p20 -0x1.0ee38c6f9142ap19 0x1.259d2fedp2 -0x1.1000000000001p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32407 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.24p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32407 4 OK 0x1.018e13574b73ep20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.1000000000001p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32408 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.0ep7 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG epsg:32408 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.18p7 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32408 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.04p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32408 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.18p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32408 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.04p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32409 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.0200000000001p7 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG epsg:32409 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.0cp7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32409 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.efffffffffffep6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32409 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.0cp7 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32409 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 -0x1.efffffffffffep6 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:3241 0 OK 0x0.0p0 0x1.38ad31132592ap20 0x0.0p0 0x1.5cp7 -0x1.3d5555555551ap6 0x0.0p0 F +REG epsg:3241 1 OK -0x1.c145bc2130ed4p16 0x1.2aa585bd8dae6p16 0x0.0p0 0x1.c800000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3241 2 OK 0x1.c145bc2130ed7p16 0x1.2aa585bd8daep16 0x0.0p0 -0x1.f8p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3241 3 OK -0x1.2cf07e321caa2p21 0x1.9016d8b2ee433p20 0x0.0p0 0x1.c800000000001p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:3241 4 OK 0x1.2cf07e321caa5p21 0x1.9016d8b2ee42ap20 0x0.0p0 -0x1.f8p6 -0x1.015555555553bp6 0x0.0p0 F +REG epsg:32410 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.ec00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32410 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.0p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32410 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 -0x1.d800000000003p6 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32410 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.0p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32410 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af05p2 -0x1.d800000000003p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32411 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.d4p6 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG epsg:32411 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.e8p6 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32411 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.c000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32411 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.e8p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32411 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.c000000000001p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32412 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.bc00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32412 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.d000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32412 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.a800000000001p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32412 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.d000000000001p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32412 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.a800000000001p6 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32413 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.a400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32413 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.b800000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32413 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 -0x1.9000000000001p6 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32413 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.b800000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32413 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af05p2 -0x1.9000000000001p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32414 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.8c00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32414 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.a000000000001p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32414 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.7800000000001p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32414 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.a000000000001p6 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32414 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.7800000000001p6 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32415 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.7400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32415 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.8800000000001p6 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32415 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.6p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32415 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.8800000000001p6 0x1.3fffffffea8ffp2 0x1.9d76p-14 F +REG epsg:32415 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.6p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32416 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.5cp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32416 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2febp2 -0x1.7000000000001p6 -0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32416 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.48p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32416 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04cp2 -0x1.7000000000001p6 0x1.3fffffffea8fep2 0x1.9d76p-14 F +REG epsg:32416 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.48p6 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG epsg:32417 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.44p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32417 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.58p6 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32417 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.3p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32417 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.58p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32417 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.3p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32418 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.2c00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32418 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.3ffffffffffffp6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32418 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.18p6 -0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:32418 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.3ffffffffffffp6 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:32418 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.18p6 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32419 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.1400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32419 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.28p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32419 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.0p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32419 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.28p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32419 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.0p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:3242 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.32p7 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3242 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf0ep16 0x0.0p0 0x1.25fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3242 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.74p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3242 3 OK -0x1.15a363798d316p21 0x1.5f4a3b502a57p20 0x0.0p0 0x1.25fffffffffffp7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3242 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.73ffffffffffep6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32420 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.f8p5 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG epsg:32420 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.1000000000001p6 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32420 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.d000000000003p5 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32420 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.1000000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32420 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.d000000000003p5 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32421 0 OK 0x1.e841b5ba6825p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.c800000000001p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32421 1 OK -0x1.ada7003e3944p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.efffffffffffep5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32421 2 OK 0x1.018e12e0a96a4p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.a000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32421 3 OK -0x1.ada70f12d3bap15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.efffffffffffep5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32421 4 OK 0x1.018e13574b75cp20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.ap5 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG epsg:32422 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.98p5 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG epsg:32422 1 OK -0x1.ada7003e3955p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.cp5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32422 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.7000000000002p5 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32422 3 OK -0x1.ada70f12d3cbp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.cp5 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32422 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.7000000000002p5 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG epsg:32423 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.67ffffffffffep5 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG epsg:32423 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.9p5 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32423 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.4p5 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32423 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.9p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32423 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 -0x1.4p5 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32424 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.3800000000001p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32424 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.6p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32424 2 OK 0x1.018e12e0a9696p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.1p5 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32424 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.6p5 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32424 4 OK 0x1.018e13574b74cp20 0x1.0ee312e3756ddp19 0x1.106af04ep2 -0x1.1p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32425 0 OK 0x1.e841b5ba6825p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.08p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32425 1 OK -0x1.ada7003e3955p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.2ffffffffffffp5 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32425 2 OK 0x1.018e12e0a96a2p20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 -0x1.c000000000002p4 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32425 3 OK -0x1.ada70f12d3cbp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.2ffffffffffffp5 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32425 4 OK 0x1.018e13574b75ap20 0x1.0ee312e3756dcp19 0x1.106af05p2 -0x1.cp4 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32426 0 OK 0x1.e841b5ba68237p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.bp4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32426 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.0p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32426 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.5ffffffffffffp4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32426 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.0p5 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32426 4 OK 0x1.018e13574b754p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.6p4 0x1.3fffffffea8fap2 0x1.9d7ap-14 F +REG epsg:32427 0 OK 0x1.e841b5ba6821fp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.5p4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32427 1 OK -0x1.ada7003e3963p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.9ffffffffffffp4 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32427 2 OK 0x1.018e12e0a969bp20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.ffffffffffffep3 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32427 3 OK -0x1.ada70f12d3d7p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.9ffffffffffffp4 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32427 4 OK 0x1.018e13574b751p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.0p4 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32428 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.e000000000001p3 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG epsg:32428 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.3fffffffffffep4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32428 2 OK 0x1.018e12e0a9697p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.3ffffffffffffp3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32428 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.3ffffffffffffp4 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32428 4 OK 0x1.018e13574b74ep20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.3ffffffffffffp3 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32429 0 OK 0x1.e841b5ba68234p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.2000000000001p3 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG epsg:32429 1 OK -0x1.ada7003e396p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.c000000000001p3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32429 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.0000000000001p2 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32429 3 OK -0x1.ada70f12d3d4p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.c000000000001p3 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32429 4 OK 0x1.018e13574b755p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.0000000000001p2 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:3243 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.0ep7 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3243 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf0ep16 0x0.0p0 0x1.49fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3243 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.2cp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3243 3 OK -0x1.15a363798d316p21 0x1.5f4a3b502a57p20 0x0.0p0 0x1.49fffffffffffp7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3243 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.2bffffffffffep6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32430 0 OK 0x1.e841b5ba68227p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.8000000000001p1 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32430 1 OK -0x1.ada7003e3964p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.0p3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32430 2 OK 0x1.018e12e0a969bp20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.0000000000005p1 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32430 3 OK -0x1.ada70f12d3d8p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.ffffffffffffep2 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32430 4 OK 0x1.018e13574b751p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.ffffffffffffep0 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32431 0 OK 0x1.e841b5ba68247p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.8000000000001p1 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32431 1 OK -0x1.ada7003e3952p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.ffffffffffff9p0 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32431 2 OK 0x1.018e12e0a96a1p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.ffffffffffffdp2 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32431 3 OK -0x1.ada70f12d3c9p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.0000000000002p1 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32431 4 OK 0x1.018e13574b759p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.ffffffffffffdp2 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG epsg:32432 0 OK 0x1.e841b5ba68237p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.2000000000001p3 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32432 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.0000000000001p2 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32432 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.bffffffffffffp3 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32432 3 OK -0x1.ada70f12d3dp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.0p2 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32432 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.cp3 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32433 0 OK 0x1.e841b5ba6825p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.dfffffffffffep3 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32433 1 OK -0x1.ada7003e394bp15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.4000000000002p3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32433 2 OK 0x1.018e12e0a96a4p20 -0x1.0ee38c6f91429p19 0x1.259d2ffp2 0x1.4000000000001p4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32433 3 OK -0x1.ada70f12d3cp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.4p3 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:32433 4 OK 0x1.018e13574b75cp20 0x1.0ee312e3756dbp19 0x1.106af051p2 0x1.4p4 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32434 0 OK 0x1.e841b5ba6824ap18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.5p4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32434 1 OK -0x1.ada7003e3952p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.0000000000001p4 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32434 2 OK 0x1.018e12e0a96a2p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.9ffffffffffffp4 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32434 3 OK -0x1.ada70f12d3c9p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.0p4 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32434 4 OK 0x1.018e13574b75ap20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.ap4 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32435 0 OK 0x1.e841b5ba68237p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.bp4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a2p-14 T +REG epsg:32435 1 OK -0x1.ada7003e395ap15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.6000000000001p4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32435 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.0p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32435 3 OK -0x1.ada70f12d3cep15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.6000000000001p4 0x1.3fffffffea8fdp2 0x1.9d7ap-14 F +REG epsg:32435 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.ffffffffffffep4 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32436 0 OK 0x1.e841b5ba6821fp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.07fffffffffffp5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32436 1 OK -0x1.ada7003e3963p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 0x1.cp4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32436 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.3000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32436 3 OK -0x1.ada70f12d3d7p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 0x1.cp4 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32436 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.3000000000001p5 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32437 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.37fffffffffffp5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32437 1 OK -0x1.ada7003e394ap15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.1p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32437 2 OK 0x1.018e12e0a96a1p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.5ffffffffffffp5 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32437 3 OK -0x1.ada70f12d3cp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.1p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32437 4 OK 0x1.018e13574b759p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.5ffffffffffffp5 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32438 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 0x1.67fffffffffffp5 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG epsg:32438 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.4000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32438 2 OK 0x1.018e12e0a969cp20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.8ffffffffffffp5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32438 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.4000000000001p5 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32438 4 OK 0x1.018e13574b752p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.8ffffffffffffp5 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32439 0 OK 0x1.e841b5ba6825cp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.98p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32439 1 OK -0x1.ada7003e394ap15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.7p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32439 2 OK 0x1.018e12e0a96a8p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.c000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32439 3 OK -0x1.ada70f12d3cp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.7000000000001p5 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32439 4 OK 0x1.018e13574b75fp20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.c000000000001p5 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:3244 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.d4p6 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3244 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.6200000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3244 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.c800000000001p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3244 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.6200000000001p7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3244 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.c7ffffffffffdp5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32440 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.c800000000001p5 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG epsg:32440 1 OK -0x1.ada7003e3963p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.a000000000001p5 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32440 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.efffffffffffep5 -0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:32440 3 OK -0x1.ada70f12d3d7p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.a000000000001p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32440 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.efffffffffffep5 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32441 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.f8p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32441 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.d000000000003p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32441 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.1p6 -0x1.3fffffffea8fdp2 0x1.9d7ap-14 F +REG epsg:32441 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.d000000000003p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32441 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.1p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32442 0 OK 0x1.e841b5ba681e2p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.13fffffffffffp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32442 1 OK -0x1.ada7003e3974p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.0000000000001p6 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:32442 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.28p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32442 3 OK -0x1.ada70f12d3e9p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.0000000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32442 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.28p6 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32443 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 0x1.2cp6 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG epsg:32443 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.18p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32443 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.3ffffffffffffp6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32443 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.18p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32443 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.3ffffffffffffp6 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32444 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 0x1.44p6 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG epsg:32444 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.3p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32444 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.58p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32444 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.3p6 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32444 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.58p6 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32445 0 OK 0x1.e841b5ba681fbp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.5cp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32445 1 OK -0x1.ada7003e398p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 0x1.47fffffffffffp6 -0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32445 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.7000000000001p6 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32445 3 OK -0x1.ada70f12d3f5p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 0x1.47fffffffffffp6 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32445 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.7000000000001p6 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32446 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.7400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32446 1 OK -0x1.ada7003e3974p15 -0x1.0ee398b705fddp19 0x1.259d2febp2 0x1.6p6 -0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32446 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.8800000000001p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32446 3 OK -0x1.ada70f12d3e9p15 0x1.0ee31f2ae4b5p19 0x1.106af04cp2 0x1.6p6 0x1.3fffffffea8fep2 0x1.9d76p-14 F +REG epsg:32446 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.8800000000001p6 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32447 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 0x1.8c00000000001p6 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG epsg:32447 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.7800000000001p6 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32447 2 OK 0x1.018e12e0a96a4p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.a000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32447 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.7800000000001p6 0x1.3fffffffea8ffp2 0x1.9d76p-14 F +REG epsg:32447 4 OK 0x1.018e13574b75cp20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.a000000000001p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32448 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.a400000000001p6 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG epsg:32448 1 OK -0x1.ada7003e3974p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.9000000000001p6 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32448 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f91429p19 0x1.259d2ffp2 0x1.b800000000001p6 -0x1.3fffffffea8fcp2 0x1.9d7bp-14 F +REG epsg:32448 3 OK -0x1.ada70f12d3e9p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.9000000000001p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32448 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dbp19 0x1.106af051p2 0x1.b800000000001p6 0x1.3fffffffea8fap2 0x1.9d7ap-14 F +REG epsg:32449 0 OK 0x1.e841b5ba6828cp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.bc00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32449 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.a800000000001p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32449 2 OK 0x1.018e12e0a96b6p20 -0x1.0ee38c6f9142bp19 0x1.259d2feep2 0x1.d000000000001p6 -0x1.3fffffffea8fcp2 0x1.9d7bp-14 F +REG epsg:32449 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4fp19 0x1.106af04fp2 0x1.a800000000001p6 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32449 4 OK 0x1.018e13574b76ep20 0x1.0ee312e3756ddp19 0x1.106af04fp2 0x1.d000000000001p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:3245 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.8cp6 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3245 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.3e00000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3245 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.37ffffffffffdp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3245 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.3e00000000001p7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3245 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.37ffffffffffdp5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32450 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.d4p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32450 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.c000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32450 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.e8p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32450 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.c000000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32450 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.e8p6 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32451 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.ebfffffffffffp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32451 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.d800000000003p6 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32451 2 OK 0x1.018e12e0a96aap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.0p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32451 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.d800000000003p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32451 4 OK 0x1.018e13574b762p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.0p7 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG epsg:32452 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.02p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32452 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.fp6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32452 2 OK 0x1.018e12e0a96b6p20 -0x1.0ee38c6f9142bp19 0x1.259d2fefp2 0x1.0cp7 -0x1.3fffffffea8fdp2 0x1.9d7bp-14 F +REG epsg:32452 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.f000000000002p6 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:32452 4 OK 0x1.018e13574b76ep20 0x1.0ee312e3756dcp19 0x1.106af05p2 0x1.0cp7 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32453 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 0x1.0ep7 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG epsg:32453 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.04p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32453 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.18p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32453 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.04p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32453 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.18p7 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG epsg:32454 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.1ap7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32454 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.1000000000001p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32454 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.23fffffffffffp7 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:32454 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.1p7 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32454 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.23fffffffffffp7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:32455 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.26p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32455 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.1cp7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32455 2 OK 0x1.018e12e0a96b6p20 -0x1.0ee38c6f9142bp19 0x1.259d2fefp2 0x1.3p7 -0x1.3fffffffea8ffp2 0x1.9d79p-14 F +REG epsg:32455 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.1cp7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32455 4 OK 0x1.018e13574b76ep20 0x1.0ee312e3756dcp19 0x1.106af05p2 0x1.3p7 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32456 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.32p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32456 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.28p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32456 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.3cp7 -0x1.3fffffffea8fdp2 0x1.9d7ap-14 F +REG epsg:32456 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.28p7 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32456 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.3cp7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32457 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 0x1.3ep7 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG epsg:32457 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.34p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32457 2 OK 0x1.018e12e0a96aap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.48p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32457 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.34p7 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:32457 4 OK 0x1.018e13574b762p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.48p7 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG epsg:32458 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.4ap7 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG epsg:32458 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.4p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32458 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 0x1.54p7 -0x1.3fffffffea8fcp2 0x1.9d7bp-14 F +REG epsg:32458 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.4p7 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:32458 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af05p2 0x1.54p7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:32459 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.56p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32459 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.4cp7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32459 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.6p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:32459 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.4cp7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32459 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.6p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG epsg:3246 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.44p6 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3246 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.1a00000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3246 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.5000000000001p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3246 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.1a00000000001p7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3246 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.4fffffffffffap4 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32460 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.62p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:32460 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.58p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG epsg:32460 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.6400000000001p7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:32460 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.58p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:32460 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.6400000000001p7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG epsg:3247 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.f8p5 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3247 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.ec00000000002p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3247 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.800000000000ap1 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3247 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.ec00000000002p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3247 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.7ffffffffffdp1 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3248 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.bp4 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3248 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.5cp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3248 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.0800000000003p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3248 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.5c00000000001p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3248 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.0800000000003p5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3249 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 -0x1.2p3 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3249 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.14p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3249 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.9800000000003p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3249 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.1400000000001p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3249 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.9800000000003p5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3250 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.2p3 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3250 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.9800000000003p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3250 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.14p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3250 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.9800000000003p5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3250 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.1400000000001p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32501 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.62p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32501 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.62f75a3f3d46ap7 -0x1.dfffffffe5505p4 0x1.38bep-14 F +REG epsg:32501 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.56f75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32501 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.62f75a3f3d46ap7 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32501 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.56f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32502 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.56p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32502 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.6108a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32502 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.4af75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32502 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.6108a5c0c2b97p7 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32502 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.4af75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32503 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.49fffffffffffp7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32503 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.5508a5c0c2b98p7 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG epsg:32503 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.3ef75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32503 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.5508a5c0c2b98p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32503 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.3ef75a3f3d469p7 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32504 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dbp22 0x1.4c12245ap2 -0x1.3ep7 -0x1.8fffffffe8626p4 0x1.566ap-14 F +REG epsg:32504 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.4908a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32504 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.32f75a3f3d468p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32504 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.4908a5c0c2b97p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32504 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.32f75a3f3d469p7 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32505 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.32p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32505 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.3d08a5c0c2b96p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32505 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.26f75a3f3d468p7 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32505 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.3d08a5c0c2b97p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32505 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.26f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32506 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.2600000000001p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32506 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.3108a5c0c2b98p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32506 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.1af75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32506 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.3108a5c0c2b98p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32506 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.1af75a3f3d469p7 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32507 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.19fffffffffffp7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32507 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.2508a5c0c2b97p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32507 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.0ef75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32507 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.2508a5c0c2b97p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32507 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.0ef75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32508 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.0ep7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32508 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.1908a5c0c2b96p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32508 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.02f75a3f3d468p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32508 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.1908a5c0c2b96p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32508 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.02f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32509 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.0200000000001p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32509 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.0d08a5c0c2b97p7 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32509 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.edeeb47e7a8d1p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32509 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.0d08a5c0c2b97p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32509 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.edeeb47e7a8d1p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:3251 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.bp4 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3251 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 -0x1.0800000000003p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3251 2 OK 0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.5cp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3251 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 -0x1.0800000000003p5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3251 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.5c00000000001p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32510 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.ec00000000002p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32510 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.0108a5c0c2b97p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32510 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.d5eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32510 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.0108a5c0c2b97p7 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32510 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.d5eeb47e7a8d3p6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32511 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.d4p6 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32511 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.ea114b818573p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32511 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.bdeeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32511 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.ea114b818573p6 -0x1.3fffffffec2ccp4 0x1.700bp-14 F +REG epsg:32511 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699bacp22 0x1.431caffp2 -0x1.bdeeb47e7a8d3p6 -0x1.3fffffffec2cep4 0x1.700bp-14 F +REG epsg:32512 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.bc00000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32512 1 OK -0x1.fc3b79ff103ap14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.d2114b818572dp6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32512 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.a5eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32512 3 OK -0x1.2fefa6e9eb888p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.d2114b818572dp6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32512 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.a5eeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32513 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.a400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32513 1 OK -0x1.fc3b79ff107ap14 0x1.970145d62e2ap22 0x1.5481365p2 -0x1.ba114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32513 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.8deeb47e7a8d3p6 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32513 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.ba114b818572fp6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32513 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.8deeb47e7a8d3p6 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32514 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245dp2 -0x1.8c00000000001p6 -0x1.8fffffffe8621p4 0x1.566fp-14 F +REG epsg:32514 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.a2114b818572fp6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32514 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.75eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32514 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.a2114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32514 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.75eeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32515 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.7400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32515 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.8a114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32515 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.5deeb47e7a8d2p6 -0x1.dfffffffe5502p4 0x1.38bbp-14 F +REG epsg:32515 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.8a114b818572fp6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32515 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.5deeb47e7a8d2p6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32516 0 OK 0x1.e8424bb999d03p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.5bfffffffffffp6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32516 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.72114b818572fp6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32516 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.45eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32516 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.72114b818572fp6 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32516 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.45eeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32517 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245ep2 -0x1.44p6 -0x1.8fffffffe8621p4 0x1.567p-14 F +REG epsg:32517 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.5a114b818572ep6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32517 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32517 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.5a114b818572ep6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32517 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.2deeb47e7a8d1p6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32518 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.2c00000000001p6 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32518 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.42114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32518 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.15eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32518 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.42114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32518 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699badp22 0x1.431caff1p2 -0x1.15eeb47e7a8d1p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32519 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.1400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32519 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.2a114b818572ep6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32519 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32519 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.2a114b818572ep6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32519 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.fbdd68fcf51a4p5 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:3252 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.68p5 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3252 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 -0x1.dfffffffffffep3 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3252 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.a400000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3252 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 -0x1.e00000000000cp3 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3252 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.a400000000001p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32520 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.f7ffffffffffep5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32520 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.12114b818572dp6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32520 2 OK 0x1.f82464d9d662fp19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32520 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.12114b818572ep6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32520 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.cbdd68fcf51a2p5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32521 0 OK 0x1.e8424bb999d03p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.c800000000001p5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32521 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.f42297030ae5ep5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32521 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32521 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.f42297030ae5cp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32521 4 OK 0x1.072002d7f84c4p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.9bdd68fcf51a3p5 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:32522 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.97fffffffffffp5 -0x1.8fffffffe8625p4 0x1.566bp-14 F +REG epsg:32522 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.c42297030ae5cp5 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32522 2 OK 0x1.f82464d9d6629p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.6bdd68fcf51a4p5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32522 3 OK -0x1.2fefa6e9eb91p16 0x1.daca990096ff6p22 0x1.431caffp2 -0x1.c42297030ae5ep5 -0x1.3fffffffec2cdp4 0x1.7008p-14 F +REG epsg:32522 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.6bdd68fcf51a3p5 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:32523 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.68p5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32523 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.942297030ae5cp5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32523 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.3bdd68fcf51a3p5 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32523 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.942297030ae5cp5 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32523 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.3bdd68fcf51a3p5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32524 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.37ffffffffffep5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32524 1 OK -0x1.fc3b79ff108p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.642297030ae5dp5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32524 2 OK 0x1.f82464d9d661fp19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32524 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.642297030ae5dp5 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32524 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.0bdd68fcf51a1p5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32525 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.0800000000001p5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32525 1 OK -0x1.fc3b79ff1058p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.342297030ae5dp5 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32525 2 OK 0x1.f82464d9d6629p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.b7bad1f9ea348p4 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32525 3 OK -0x1.2fefa6e9eb91p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.342297030ae5dp5 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32525 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.b7bad1f9ea348p4 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32526 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.bp4 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32526 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.042297030ae5cp5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32526 2 OK 0x1.f82464d9d6621p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.57bad1f9ea347p4 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32526 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.042297030ae5dp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32526 4 OK 0x1.072002d7f84bbp20 0x1.daca9f4699bacp22 0x1.431caffp2 -0x1.57bad1f9ea348p4 -0x1.3fffffffec2cep4 0x1.700bp-14 F +REG epsg:32527 0 OK 0x1.e8424bb999cd1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.5p4 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32527 1 OK -0x1.fc3b79ff106ep14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.a8452e0615cb9p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32527 2 OK 0x1.f82464d9d661dp19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.ef75a3f3d468ep3 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32527 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.a8452e0615cb8p4 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32527 4 OK 0x1.072002d7f84bbp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.ef75a3f3d468ep3 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32528 0 OK 0x1.e8424bb999cc6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.dffffffffffffp3 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32528 1 OK -0x1.fc3b79ff107cp14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.48452e0615cb9p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32528 2 OK 0x1.f82464d9d6613p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.2f75a3f3d468fp3 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32528 3 OK -0x1.2fefa6e9eb9b8p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.48452e0615cb8p4 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32528 4 OK 0x1.072002d7f84b6p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.2f75a3f3d469p3 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32529 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 -0x1.2p3 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32529 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.d08a5c0c2b973p3 -0x1.dfffffffe5505p4 0x1.38bbp-14 F +REG epsg:32529 2 OK 0x1.f82464d9d6622p19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.bdd68fcf51a3bp1 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32529 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.d08a5c0c2b96ep3 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32529 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.bdd68fcf51a36p1 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:3253 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.f8p5 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3253 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.800000000000ap1 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3253 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.ec00000000002p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3253 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.7ffffffffffdp1 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3253 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.ec00000000002p6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32530 0 OK 0x1.e8424bb999cd2p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.8000000000001p1 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32530 1 OK -0x1.fc3b79ff106ep14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.108a5c0c2b972p3 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32530 2 OK 0x1.f82464d9d661dp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.42297030ae5cdp1 -0x1.dfffffffe5502p4 0x1.38bbp-14 F +REG epsg:32530 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.108a5c0c2b973p3 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32530 4 OK 0x1.072002d7f84bbp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.42297030ae5c8p1 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32531 0 OK 0x1.e8424bb999cf1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.8000000000002p1 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32531 1 OK -0x1.fc3b79ff1054p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.42297030ae5c8p1 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32531 2 OK 0x1.f82464d9d662bp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.108a5c0c2b973p3 -0x1.dfffffffe55p4 0x1.38bep-14 F +REG epsg:32531 3 OK -0x1.2fefa6e9eb908p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.42297030ae5c8p1 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32531 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.108a5c0c2b972p3 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32532 0 OK 0x1.e8424bb999cdfp18 0x1.b997ad9dfe7dcp22 0x1.4c12245ep2 0x1.2p3 -0x1.8fffffffe8621p4 0x1.567p-14 F +REG epsg:32532 1 OK -0x1.fc3b79ff106p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.bdd68fcf51a39p1 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32532 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.d08a5c0c2b971p3 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32532 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.bdd68fcf51a3cp1 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32532 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.d08a5c0c2b973p3 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32533 0 OK 0x1.e8424bb999cf7p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.dffffffffffffp3 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32533 1 OK -0x1.fc3b79ff103cp14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.2f75a3f3d469p3 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32533 2 OK 0x1.f82464d9d6632p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.48452e0615cbbp4 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32533 3 OK -0x1.2fefa6e9eb8b8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.2f75a3f3d468fp3 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG epsg:32533 4 OK 0x1.072002d7f84c6p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.48452e0615cbap4 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:32534 0 OK 0x1.e8424bb999cf7p18 0x1.b997ad9dfe7dbp22 0x1.4c12245ap2 0x1.5000000000001p4 -0x1.8fffffffe8626p4 0x1.566ap-14 F +REG epsg:32534 1 OK -0x1.fc3b79ff1058p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.ef75a3f3d468ep3 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32534 2 OK 0x1.f82464d9d6629p19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.a8452e0615cbbp4 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32534 3 OK -0x1.2fefa6e9eb8f8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.ef75a3f3d468fp3 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32534 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.a8452e0615cb8p4 -0x1.3fffffffec2cbp4 0x1.700ap-14 F +REG epsg:32535 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.b000000000002p4 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32535 1 OK -0x1.fc3b79ff105cp14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.57bad1f9ea348p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32535 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.042297030ae5ep5 -0x1.dfffffffe55p4 0x1.38bep-14 F +REG epsg:32535 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.57bad1f9ea348p4 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32535 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.042297030ae5ep5 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32536 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.07fffffffffffp5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32536 1 OK -0x1.fc3b79ff1072p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.b7bad1f9ea347p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32536 2 OK 0x1.f82464d9d661fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.342297030ae5dp5 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32536 3 OK -0x1.2fefa6e9eb958p16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.b7bad1f9ea348p4 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG epsg:32536 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.342297030ae5dp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32537 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.3800000000001p5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32537 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.0bdd68fcf51a2p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32537 2 OK 0x1.f82464d9d662fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.642297030ae5dp5 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32537 3 OK -0x1.2fefa6e9eb91p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.0bdd68fcf51a3p5 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32537 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.642297030ae5cp5 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32538 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.67fffffffffffp5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32538 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.3bdd68fcf51a3p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32538 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.942297030ae5ep5 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32538 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.3bdd68fcf51a2p5 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32538 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.942297030ae5dp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32539 0 OK 0x1.e8424bb999d03p18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 0x1.98p5 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32539 1 OK -0x1.fc3b79ff103ap14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.6bdd68fcf51a4p5 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32539 2 OK 0x1.f82464d9d662fp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.c42297030ae5cp5 -0x1.dfffffffe5502p4 0x1.38bbp-14 F +REG epsg:32539 3 OK -0x1.2fefa6e9eb888p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.6bdd68fcf51a4p5 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32539 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.c42297030ae5fp5 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:3254 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.44p6 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3254 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.5000000000001p4 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3254 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.1a00000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3254 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.4fffffffffffap4 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3254 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.1a00000000001p7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32540 0 OK 0x1.e8424bb999cb5p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.c7fffffffffffp5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32540 1 OK -0x1.fc3b79ff108p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.9bdd68fcf51a4p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32540 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.f42297030ae5cp5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32540 3 OK -0x1.2fefa6e9eb9dp16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.9bdd68fcf51a3p5 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG epsg:32540 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.f42297030ae5cp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32541 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245dp2 0x1.f800000000002p5 -0x1.8fffffffe8622p4 0x1.566dp-14 F +REG epsg:32541 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.cbdd68fcf51a2p5 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32541 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.12114b818572ep6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32541 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.cbdd68fcf51a4p5 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32541 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699bacp22 0x1.431caffp2 0x1.12114b818572dp6 -0x1.3fffffffec2dp4 0x1.7009p-14 F +REG epsg:32542 0 OK 0x1.e8424bb999c94p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.13fffffffffffp6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32542 1 OK -0x1.fc3b79ff108cp14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.fbdd68fcf51a5p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32542 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.2a114b818572ep6 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32542 3 OK -0x1.2fefa6e9eba5p16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.fbdd68fcf51a4p5 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32542 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.2a114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32543 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.2bfffffffffffp6 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32543 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e2ap22 0x1.5481365p2 0x1.15eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38cp-14 F +REG epsg:32543 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.42114b818572fp6 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32543 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.15eeb47e7a8d2p6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32543 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.42114b818572dp6 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32544 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 0x1.4400000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32544 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.2deeb47e7a8d2p6 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG epsg:32544 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.5a114b818572ep6 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32544 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.2deeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32544 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.5a114b818572ep6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32545 0 OK 0x1.e8424bb999c94p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.5bfffffffffffp6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32545 1 OK -0x1.fc3b79ff108cp14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.45eeb47e7a8d3p6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32545 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.72114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32545 3 OK -0x1.2fefa6e9eb9fp16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.45eeb47e7a8d2p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32545 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.72114b818572fp6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32546 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.7400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32546 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.5deeb47e7a8d2p6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32546 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.8a114b818572fp6 -0x1.dfffffffe55p4 0x1.38bep-14 F +REG epsg:32546 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.5deeb47e7a8d2p6 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32546 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.8a114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32547 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 0x1.8c00000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32547 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.75eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG epsg:32547 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481365p2 0x1.a2114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32547 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.75eeb47e7a8d3p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32547 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.a2114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32548 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.a400000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32548 1 OK -0x1.fc3b79ff108cp14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.8deeb47e7a8d3p6 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG epsg:32548 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.ba114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32548 3 OK -0x1.2fefa6e9eb9fp16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.8deeb47e7a8d3p6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32548 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.ba114b818572fp6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG epsg:32549 0 OK 0x1.e8424bb999d2fp18 0x1.b997ad9dfe7dbp22 0x1.4c12245ap2 0x1.bc00000000001p6 -0x1.8fffffffe8626p4 0x1.566ap-14 F +REG epsg:32549 1 OK -0x1.fc3b79ff101p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.a5eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32549 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.d2114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32549 3 OK -0x1.2fefa6e9eb7dp16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.a5eeb47e7a8d3p6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32549 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.d2114b818572dp6 -0x1.3fffffffec2cbp4 0x1.700ap-14 F +REG epsg:3255 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.8cp6 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3255 1 OK -0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.37ffffffffffdp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3255 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.3e00000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3255 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.37ffffffffffdp5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3255 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.3e00000000001p7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32550 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.d4p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32550 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.bdeeb47e7a8d3p6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32550 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.ea114b818573p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32550 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caffp2 0x1.bdeeb47e7a8d2p6 -0x1.3fffffffec2cdp4 0x1.7008p-14 F +REG epsg:32550 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.ea114b818572cp6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32551 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.ec00000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32551 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e2ap22 0x1.5481364ep2 0x1.d5eeb47e7a8d3p6 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG epsg:32551 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.0108a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32551 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.d5eeb47e7a8d3p6 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG epsg:32551 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.0108a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:32552 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.0200000000001p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32552 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.edeeb47e7a8d1p6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32552 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.0d08a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32552 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.edeeb47e7a8d1p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32552 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.0d08a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:32553 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.0ep7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32553 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.02f75a3f3d46ap7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG epsg:32553 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.1908a5c0c2b96p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32553 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.02f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32553 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.1908a5c0c2b96p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32554 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.1a00000000001p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32554 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.0ef75a3f3d469p7 -0x1.dfffffffe5507p4 0x1.38bcp-14 F +REG epsg:32554 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.2508a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32554 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.0ef75a3f3d469p7 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG epsg:32554 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.2508a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG epsg:32555 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.26p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32555 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.1af75a3f3d469p7 -0x1.dfffffffe5507p4 0x1.38bcp-14 F +REG epsg:32555 2 OK 0x1.f82464d9d664fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.3108a5c0c2b98p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32555 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.1af75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32555 4 OK 0x1.072002d7f84d6p20 0x1.daca9f4699badp22 0x1.431caff1p2 0x1.3108a5c0c2b98p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32556 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245dp2 0x1.32p7 -0x1.8fffffffe8622p4 0x1.566dp-14 F +REG epsg:32556 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.26f75a3f3d469p7 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32556 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.3d08a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG epsg:32556 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.26f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:32556 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699bacp22 0x1.431caffp2 0x1.3d08a5c0c2b97p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32557 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.3ep7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32557 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.32f75a3f3d469p7 -0x1.dfffffffe5505p4 0x1.38bep-14 F +REG epsg:32557 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.4908a5c0c2b97p7 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32557 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.32f75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32557 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.4908a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG epsg:32558 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.4ap7 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG epsg:32558 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.3ef75a3f3d469p7 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG epsg:32558 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.5508a5c0c2b98p7 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG epsg:32558 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.3ef75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG epsg:32558 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.5508a5c0c2b98p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32559 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.56p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG epsg:32559 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.4af75a3f3d469p7 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG epsg:32559 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.6108a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG epsg:32559 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.4af75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG epsg:32559 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.6108a5c0c2b97p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG epsg:3256 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.d4p6 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3256 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.c800000000001p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3256 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf1p16 0x0.0p0 0x1.6200000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3256 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.c7ffffffffffdp5 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3256 4 OK 0x1.15a363798d315p21 0x1.5f4a3b502a573p20 0x0.0p0 0x1.6200000000001p7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:32560 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.62p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG epsg:32560 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.56f75a3f3d469p7 -0x1.dfffffffe5505p4 0x1.38bdp-14 F +REG epsg:32560 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.62f75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG epsg:32560 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.56f75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG epsg:32560 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.62f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700ap-14 F +REG epsg:3257 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.0ep7 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3257 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.2cp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3257 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf0ep16 0x0.0p0 -0x1.49fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3257 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.2bffffffffffep6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3257 4 OK 0x1.15a363798d316p21 0x1.5f4a3b502a57p20 0x0.0p0 -0x1.49fffffffffffp7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3258 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.32p7 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3258 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.74p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3258 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf0ep16 0x0.0p0 -0x1.25fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3258 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.73ffffffffffep6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3258 4 OK 0x1.15a363798d316p21 0x1.5f4a3b502a57p20 0x0.0p0 -0x1.25fffffffffffp7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3259 0 OK 0x0.0p0 0x1.ee907a0e6d5f9p19 0x0.0p0 0x1.56p7 -0x1.4555555555547p6 0x0.0p0 F +REG epsg:3259 1 OK -0x1.a2a75270ee963p16 0x1.08db5e5dcbf11p16 0x0.0p0 0x1.bcp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3259 2 OK 0x1.a2a75270ee965p16 0x1.08db5e5dcbf0ep16 0x0.0p0 -0x1.01fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3259 3 OK -0x1.15a363798d315p21 0x1.5f4a3b502a574p20 0x0.0p0 0x1.bbffffffffffep6 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3259 4 OK 0x1.15a363798d316p21 0x1.5f4a3b502a57p20 0x0.0p0 -0x1.01fffffffffffp7 -0x1.0955555555548p6 0x0.0p0 F +REG epsg:3260 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.5p7 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3260 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14668p15 0x0.0p0 0x1.08p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3260 2 OK 0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.affffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3260 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bep20 0x0.0p0 0x1.08p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3260 4 OK 0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.bp6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32601 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:32601 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.64p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32601 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32601 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.64p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32601 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32602 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:32602 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32602 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32602 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32602 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32603 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG epsg:32603 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.54p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32603 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32603 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.54p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32603 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32604 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:32604 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32604 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.34p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32604 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32604 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.34p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32605 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:32605 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32605 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32605 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32605 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32606 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:32606 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32606 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32606 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32606 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32607 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:32607 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.24p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32607 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:32607 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.24p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32607 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:32608 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:32608 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32608 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.04p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32608 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32608 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.04p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32609 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:32609 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32609 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32609 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32609 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3261 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.2p7 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3261 1 OK -0x1.8dc9f34645603p16 0x1.e3d45fff1465bp15 0x0.0p0 0x1.37fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3261 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 -0x1.5p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3261 3 OK -0x1.d65648b7553b3p20 0x1.1e08edbd698b6p20 0x0.0p0 0x1.37fffffffffffp7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3261 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 -0x1.5p6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32610 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:32610 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32610 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d800000000001p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32610 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32610 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d800000000001p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32611 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:32611 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.e8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32611 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32611 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.e8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32611 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32612 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:32612 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32612 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.a8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32612 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32612 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.a8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32613 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:32613 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.b8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32613 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32613 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.b8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32613 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32614 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:32614 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32614 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.78p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32614 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32614 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.78p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32615 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32615 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32615 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32615 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32615 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32616 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32616 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32616 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32616 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32616 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32617 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32617 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32617 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32617 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32617 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32618 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:32618 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32618 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32618 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32618 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32619 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:32619 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32619 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32619 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32619 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3262 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.dffffffffffffp6 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3262 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.68p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3262 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3262 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.68p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3262 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 -0x1.dffffffffffffp5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32620 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:32620 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32620 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32620 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32620 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32621 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:32621 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32621 2 OK 0x1.018fa874f5678p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32621 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32621 4 OK 0x1.018fa874f5678p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32622 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:32622 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32622 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32622 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32622 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32623 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:32623 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32623 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32623 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32623 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32624 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 -0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:32624 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32624 2 OK 0x1.018fa874f566cp20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32624 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32624 4 OK 0x1.018fa874f566cp20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32625 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:32625 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32625 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32625 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32625 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32626 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:32626 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32626 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32626 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32626 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32627 0 OK 0x1.e847fffffffeep18 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:32627 1 OK -0x1.ad750e9eacedp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32627 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32627 3 OK -0x1.ad750e9eacedp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32627 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32628 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:32628 1 OK -0x1.ad750e9eacf2p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32628 2 OK 0x1.018fa874f566ap20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32628 3 OK -0x1.ad750e9eacf2p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32628 4 OK 0x1.018fa874f566ap20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32629 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:32629 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32629 2 OK 0x1.018fa874f567p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000003p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32629 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.bffffffffffffp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32629 4 OK 0x1.018fa874f567p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000003p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3263 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.8000000000001p6 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3263 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14668p15 0x0.0p0 -0x1.38p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3263 2 OK 0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.1fffffffffffep5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3263 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bep20 0x0.0p0 -0x1.38p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3263 4 OK 0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.2p5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32630 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:32630 1 OK -0x1.ad750e9eaceap15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32630 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000003p1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32630 3 OK -0x1.ad750e9eaceap15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32630 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000003p1 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32631 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:32631 1 OK -0x1.ad750e9eacdbp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000001p1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32631 2 OK 0x1.018fa874f5675p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ffffffffffffep2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32631 3 OK -0x1.ad750e9eacdbp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000001p1 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32631 4 OK 0x1.018fa874f5675p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ffffffffffffep2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32632 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:32632 1 OK -0x1.ad750e9eace1p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000002p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32632 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32632 3 OK -0x1.ad750e9eace1p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000002p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32632 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32633 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:32633 1 OK -0x1.ad750e9eacd3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32633 2 OK 0x1.018fa874f5679p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32633 3 OK -0x1.ad750e9eacd3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32633 4 OK 0x1.018fa874f5679p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32634 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:32634 1 OK -0x1.ad750e9eacdbp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32634 2 OK 0x1.018fa874f5676p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32634 3 OK -0x1.ad750e9eacdbp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32634 4 OK 0x1.018fa874f5676p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32635 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:32635 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32635 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32635 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32635 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32636 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:32636 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32636 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32636 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32636 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32637 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:32637 1 OK -0x1.ad750e9eacd8p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32637 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32637 3 OK -0x1.ad750e9eacd8p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32637 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32638 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:32638 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32638 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32638 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32638 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32639 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:32639 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32639 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32639 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32639 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3264 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.2p6 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3264 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.0800000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3264 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 -0x1.8000000000002p3 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3264 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.08p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3264 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 -0x1.8000000000002p3 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32640 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:32640 1 OK -0x1.ad750e9eacfp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32640 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32640 3 OK -0x1.ad750e9eacfp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32640 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32641 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:32641 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32641 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32641 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.d000000000001p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32641 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32642 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:32642 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:32642 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:32642 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:32642 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:32643 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:32643 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32643 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32643 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32643 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32644 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32644 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32644 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32644 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.3p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32644 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32645 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32645 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:32645 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:32645 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:32645 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:32646 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32646 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32646 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32646 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32646 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32647 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:32647 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.78p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32647 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32647 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.78p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32647 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32648 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:32648 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:32648 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:32648 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:32648 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:32649 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:32649 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:32649 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:32649 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:32649 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3265 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.8000000000001p5 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3265 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 -0x1.bp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3265 2 OK 0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 0x1.800000000000ap3 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3265 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 -0x1.bp6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3265 4 OK 0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 0x1.8000000000002p3 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32650 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:32650 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32650 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.e8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32650 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32650 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.e8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32651 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:32651 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:32651 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32651 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:32651 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32652 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:32652 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:32652 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG epsg:32652 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:32652 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.0cp7 0x1.4p2 0x0.0p0 F +REG epsg:32653 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:32653 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.04p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32653 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.18p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32653 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.04p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32653 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.18p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32654 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:32654 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:32654 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.24p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32654 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:32654 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.24p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32655 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:32655 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1cp7 -0x1.4p2 0x0.0p0 F +REG epsg:32655 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.3p7 -0x1.4p2 0x0.0p0 F +REG epsg:32655 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1cp7 0x1.4p2 0x0.0p0 F +REG epsg:32655 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.3p7 0x1.4p2 0x0.0p0 F +REG epsg:32656 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:32656 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.28p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32656 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32656 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.28p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32656 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.3cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32657 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:32657 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.34p7 -0x1.4p2 0x0.0p0 F +REG epsg:32657 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.48p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32657 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.34p7 0x1.4p2 0x0.0p0 F +REG epsg:32657 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.48p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32658 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG epsg:32658 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32658 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.54p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32658 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32658 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.54p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32659 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:32659 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32659 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32659 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32659 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3266 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 -0x1.8000000000001p4 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3266 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.5000000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3266 2 OK 0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 0x1.2000000000003p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3266 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.5000000000001p6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3266 4 OK 0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 0x1.2000000000001p5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32660 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:32660 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.58p7 -0x1.4p2 0x0.0p0 F +REG epsg:32660 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6400000000001p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32660 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.58p7 0x1.4p2 0x0.0p0 F +REG epsg:32660 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6400000000001p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:32661 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 0x0.0p0 0x1.64p6 0x0.0p0 T +REG epsg:32661 1 OK 0x1.72d6fc9d0d4dep20 0x1.a479f4de72c24p20 0x0.0p0 -0x1.dfffffffffffep5 0x1.54p6 0x0.0p0 T +REG epsg:32661 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 0x1.dfffffffffffep5 0x1.54p6 0x0.0p0 T +REG epsg:32661 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf5p20 0x0.0p0 -0x1.dfffffffffff6p5 0x1.64p6 0x0.0p0 T +REG epsg:32661 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf5p20 0x0.0p0 0x1.dfffffffffff6p5 0x1.64p6 0x0.0p0 T +REG epsg:32662 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:32662 1 OK -0x1.0fc6ae86e479fp19 -0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:32662 2 OK 0x1.0fc6ae86e479fp19 -0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:32662 3 OK -0x1.0fc6ae86e479fp19 0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:32662 4 OK 0x1.0fc6ae86e479fp19 0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:32663 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:32663 1 OK -0x1.0fc6ae86e479fp19 -0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:32663 2 OK 0x1.0fc6ae86e479fp19 -0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:32663 3 OK -0x1.0fc6ae86e479fp19 0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:32663 4 OK 0x1.0fc6ae86e479fp19 0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:32664 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:32664 1 OK -0x1.603e91b2c9998p17 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.9fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32664 2 OK 0x1.a681f3d37e84cp21 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.780000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32664 3 OK -0x1.603e91b2c9998p17 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.9fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32664 4 OK 0x1.a681f3d37e84cp21 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.780000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32665 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:32665 1 OK -0x1.603e91b2c98f8p17 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32665 2 OK 0x1.a681f3d37e856p21 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.600000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32665 3 OK -0x1.603e91b2c98f8p17 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32665 4 OK 0x1.a681f3d37e856p21 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.600000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32666 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:32666 1 OK -0x1.603e91b2c9998p17 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.6fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32666 2 OK 0x1.a681f3d37e84cp21 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32666 3 OK -0x1.603e91b2c9998p17 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.6fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32666 4 OK 0x1.a681f3d37e84cp21 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32667 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:32667 1 OK -0x1.603e91b2c9998p17 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.57ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32667 2 OK 0x1.a681f3d37e84cp21 -0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32667 3 OK -0x1.603e91b2c9998p17 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.57ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:32667 4 OK 0x1.a681f3d37e84cp21 0x1.bc5e8f83e85a9p20 0x0.0p0 -0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3267 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x0.0p0 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3267 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3267 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3267 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 -0x1.dffffffffffffp5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3267 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 0x1.dffffffffffffp5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3268 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.8000000000001p4 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3268 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.2000000000003p5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3268 2 OK 0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 0x1.5000000000001p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3268 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.2000000000001p5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3268 4 OK 0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 0x1.5000000000001p6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3269 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.8000000000001p5 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3269 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 -0x1.800000000000ap3 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3269 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 0x1.bp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3269 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 -0x1.8000000000002p3 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3269 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 0x1.bp6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3270 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.2p6 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3270 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 0x1.8000000000002p3 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3270 2 OK 0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 0x1.0800000000001p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3270 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 0x1.8000000000002p3 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3270 4 OK 0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 0x1.08p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32701 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32701 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32701 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32701 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32701 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32702 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32702 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32702 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32702 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32702 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32703 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32703 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32703 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32703 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.5508a5c0c2b98p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32703 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3ef75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32704 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.3ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32704 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32704 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32704 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.4908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32704 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.32f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32705 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.32p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32705 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32705 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32705 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3d08a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32705 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.26f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32706 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 -0x1.26p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32706 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32706 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32706 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3108a5c0c2b98p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32706 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.1af75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32707 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 -0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32707 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32707 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32707 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32707 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32708 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32708 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32708 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32708 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.1908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32708 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.02f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32709 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32709 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32709 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32709 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0d08a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32709 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.edeeb47e7a8d1p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3271 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.8000000000001p6 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3271 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 0x1.1fffffffffffep5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3271 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14668p15 0x0.0p0 0x1.38p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3271 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 0x1.2p5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3271 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bep20 0x0.0p0 0x1.38p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32710 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32710 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32710 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32710 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32710 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.d5eeb47e7a8d3p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32711 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32711 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32711 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32711 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.ea114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32711 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32712 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32712 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32712 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32712 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.d2114b818572dp6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32712 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.a5eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32713 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 -0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32713 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32713 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32713 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.ba114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32713 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.8deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32714 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32714 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32714 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32714 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.a2114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32714 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.75eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32715 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 -0x1.74p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32715 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32715 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.5deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32715 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.8a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32715 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.5deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32716 0 OK 0x1.e848000000016p18 0x1.b997b10295082p22 0x0.0p0 -0x1.5cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32716 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.72114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32716 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.45eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32716 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.72114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32716 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.45eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32717 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32717 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32717 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32717 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32717 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32718 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32718 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32718 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32718 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32718 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32719 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32719 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32719 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32719 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32719 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3272 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.dffffffffffffp6 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3272 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3272 2 OK 0x1.8dc9f34645603p16 0x1.e3d45fff1465bp15 0x0.0p0 -0x1.67fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3272 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 0x1.dffffffffffffp5 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3272 4 OK 0x1.d65648b7553b3p20 0x1.1e08edbd698b6p20 0x0.0p0 -0x1.67fffffffffffp7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32720 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32720 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32720 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32720 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.12114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32720 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32721 0 OK 0x1.e848000000016p18 0x1.b997b10295082p22 0x0.0p0 -0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32721 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32721 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32721 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32721 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32722 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32722 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32722 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32722 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32722 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32723 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32723 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32723 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32723 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32723 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32724 0 OK 0x1.e847ffffffff5p18 0x1.b997b10295082p22 0x0.0p0 -0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32724 1 OK -0x1.fbe5023d971p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32724 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32724 3 OK -0x1.2fd8271ec1988p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32724 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32725 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 -0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32725 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32725 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.b7bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32725 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32725 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32726 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32726 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32726 2 OK 0x1.f8272811ecb79p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.57bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32726 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32726 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.57bad1f9ea348p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32727 0 OK 0x1.e847fffffffefp18 0x1.b997b10295082p22 0x0.0p0 -0x1.5p4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32727 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.a8452e0615cb8p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32727 2 OK 0x1.f8272811ecb73p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.ef75a3f3d468fp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32727 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.a8452e0615cb9p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32727 4 OK 0x1.07218271ec18fp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.ef75a3f3d468cp3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32728 0 OK 0x1.e847fffffffe4p18 0x1.b997b10295082p22 0x0.0p0 -0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32728 1 OK -0x1.fbe5023d9714p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.48452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32728 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.2f75a3f3d468ep3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32728 3 OK -0x1.2fd8271ec19a8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.48452e0615cbap4 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32728 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2f75a3f3d468ep3 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32729 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32729 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.d08a5c0c2b973p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32729 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.bdd68fcf51a36p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32729 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.d08a5c0c2b973p3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32729 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.bdd68fcf51a38p1 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3273 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.2p7 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3273 1 OK -0x1.8dc9f346455fep16 0x1.e3d45fff14665p15 0x0.0p0 0x1.5p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3273 2 OK 0x1.8dc9f34645603p16 0x1.e3d45fff1465bp15 0x0.0p0 -0x1.37fffffffffffp7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3273 3 OK -0x1.d65648b7553aep20 0x1.1e08edbd698bbp20 0x0.0p0 0x1.5p6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3273 4 OK 0x1.d65648b7553b3p20 0x1.1e08edbd698b6p20 0x0.0p0 -0x1.37fffffffffffp7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32730 0 OK 0x1.e847ffffffff1p18 0x1.b997b10295082p22 0x0.0p0 -0x1.8000000000001p1 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32730 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.108a5c0c2b97p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32730 2 OK 0x1.f8272811ecb73p19 0x1.97014c751fc11p22 0x0.0p0 0x1.42297030ae5c4p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32730 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.108a5c0c2b972p3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32730 4 OK 0x1.07218271ec18fp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.42297030ae5cfp1 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32731 0 OK 0x1.e84800000000fp18 0x1.b997b10295082p22 0x0.0p0 0x1.8000000000001p1 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32731 1 OK -0x1.fbe5023d96e6p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.42297030ae5c4p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32731 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 0x1.108a5c0c2b97p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32731 3 OK -0x1.2fd8271ec18fp16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.42297030ae5cfp1 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32731 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.108a5c0c2b972p3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32732 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32732 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.bdd68fcf51a36p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32732 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32732 3 OK -0x1.2fd8271ec192p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.bdd68fcf51a38p1 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32732 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32733 0 OK 0x1.e84800000001cp18 0x1.b997b10295082p22 0x0.0p0 0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32733 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32733 2 OK 0x1.f8272811ecb8ap19 0x1.97014c751fc1p22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32733 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32733 4 OK 0x1.07218271ec19ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32734 0 OK 0x1.e848000000011p18 0x1.b997b10295082p22 0x0.0p0 0x1.5p4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32734 1 OK -0x1.fbe5023d96e6p14 0x1.97014c751fc11p22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32734 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 0x1.a8452e0615cb8p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32734 3 OK -0x1.2fd8271ec18fp16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ef75a3f3d468cp3 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32734 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32735 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32735 1 OK -0x1.fbe5023d96f2p14 0x1.97014c751fc11p22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32735 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32735 3 OK -0x1.2fd8271ec1908p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32735 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.042297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32736 0 OK 0x1.e847ffffffff5p18 0x1.b997b10295082p22 0x0.0p0 0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32736 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.b7bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32736 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32736 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32736 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32737 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32737 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32737 2 OK 0x1.f8272811ecb88p19 0x1.97014c751fc1p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32737 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32737 4 OK 0x1.07218271ec198p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32738 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32738 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32738 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32738 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32738 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.942297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32739 0 OK 0x1.e848000000021p18 0x1.b997b10295082p22 0x0.0p0 0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32739 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32739 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32739 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32739 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:3274 0 OK 0x0.0p0 0x1.74abcf0b6320bp19 0x0.0p0 0x1.5p7 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3274 1 OK -0x1.8dc9f34645601p16 0x1.e3d45fff1466p15 0x0.0p0 0x1.affffffffffffp6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3274 2 OK 0x1.8dc9f346455fep16 0x1.e3d45fff14668p15 0x0.0p0 -0x1.08p7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3274 3 OK -0x1.d65648b7553b1p20 0x1.1e08edbd698b9p20 0x0.0p0 0x1.bp6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3274 4 OK 0x1.d65648b7553aep20 0x1.1e08edbd698bep20 0x0.0p0 -0x1.08p7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:32740 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32740 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32740 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32740 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32740 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32741 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32741 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32741 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32741 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32741 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.12114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32742 0 OK 0x1.e847fffffffbep18 0x1.b997b10295082p22 0x0.0p0 0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32742 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32742 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32742 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32742 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2a114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32743 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32743 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32743 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32743 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32743 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.42114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32744 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32744 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32744 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32744 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32744 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.5a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32745 0 OK 0x1.e847fffffffbep18 0x1.b997b10295082p22 0x0.0p0 0x1.5cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32745 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.45eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32745 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.72114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32745 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.45eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32745 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.72114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32746 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 0x1.74p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32746 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32746 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32746 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32746 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.8a114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32747 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32747 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32747 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32747 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32747 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a2114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32748 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32748 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32748 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32748 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32748 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ba114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32749 0 OK 0x1.e848000000042p18 0x1.b997b10295082p22 0x0.0p0 0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32749 1 OK -0x1.fbe5023d96bp14 0x1.97014c751fc11p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32749 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32749 3 OK -0x1.2fd8271ec17d8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32749 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d2114b818572dp6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:3275 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.4ap7 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3275 1 OK -0x1.77200595d262ap16 0x1.b1283a2ff2e7cp15 0x0.0p0 0x1.0dfffffffffffp7 -0x1.64p6 0x0.0p0 T +REG epsg:3275 2 OK 0x1.77200595d2627p16 0x1.b1283a2ff2e88p15 0x0.0p0 -0x1.a400000000001p6 -0x1.64p6 0x0.0p0 T +REG epsg:3275 3 OK -0x1.5915bcec1e8dap20 0x1.8e78409d93b7p19 0x0.0p0 0x1.0dfffffffffffp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3275 4 OK 0x1.5915bcec1e8d7p20 0x1.8e78409d93b7dp19 0x0.0p0 -0x1.a400000000001p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:32750 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32750 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32750 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32750 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32750 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ea114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32751 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32751 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32751 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32751 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32751 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32752 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32752 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32752 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32752 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32752 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32753 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32753 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32753 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32753 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32753 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32754 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32754 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32754 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32754 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32754 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32755 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.26p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32755 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32755 2 OK 0x1.f8272811ecba1p19 0x1.97014c751fc1p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32755 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32755 4 OK 0x1.07218271ec1a7p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32756 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.32p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32756 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32756 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32756 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32756 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32757 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.3ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32757 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32757 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32757 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32757 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32758 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32758 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32758 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32758 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32758 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32759 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32759 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32759 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32759 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:32759 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:3276 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.0ep7 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3276 1 OK -0x1.77200595d262ap16 0x1.b1283a2ff2e7cp15 0x0.0p0 0x1.49fffffffffffp7 -0x1.64p6 0x0.0p0 T +REG epsg:3276 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 -0x1.2cp6 -0x1.64p6 0x0.0p0 T +REG epsg:3276 3 OK -0x1.5915bcec1e8dap20 0x1.8e78409d93b7p19 0x0.0p0 0x1.49fffffffffffp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3276 4 OK 0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 -0x1.2cp6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:32760 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:32760 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32760 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:32760 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32760 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:32761 0 OK 0x1.e848p20 0x1.01b194293450ap21 0x0.0p0 0x0.0p0 -0x1.64p6 0x0.0p0 T +REG epsg:32761 1 OK 0x1.d0ce8368c99abp20 0x1.f5d594293450bp20 0x0.0p0 -0x1.dfffffffffff6p5 -0x1.64p6 0x0.0p0 T +REG epsg:32761 2 OK 0x1.ffc17c9736655p20 0x1.f5d594293450bp20 0x0.0p0 0x1.dfffffffffff6p5 -0x1.64p6 0x0.0p0 T +REG epsg:32761 3 OK 0x1.72d6fc9d0d4dep20 0x1.160b0590c69eep21 0x0.0p0 -0x1.dfffffffffffep5 -0x1.54p6 0x0.0p0 T +REG epsg:32761 4 OK 0x1.2edc81b179591p21 0x1.160b0590c69eep21 0x0.0p0 0x1.dfffffffffffep5 -0x1.54p6 0x0.0p0 T +REG epsg:32766 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG epsg:32766 1 OK -0x1.ad750e7d8384p15 0x1.203eca48be405p23 0x0.0p0 0x1.f000000075406p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:32766 2 OK 0x1.018fa873ec1c2p20 0x1.203eca48be405p23 0x0.0p0 0x1.47ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:32766 3 OK -0x1.ad750e7d8384p15 0x1.421b35b741bfbp23 0x0.0p0 0x1.f000000075406p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:32766 4 OK 0x1.018fa873ec1c2p20 0x1.421b35b741bfbp23 0x0.0p0 0x1.47ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3277 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.a400000000001p6 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3277 1 OK -0x1.77200595d2627p16 0x1.b1283a2ff2e88p15 0x0.0p0 -0x1.4ap7 -0x1.64p6 0x0.0p0 T +REG epsg:3277 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.68p5 -0x1.64p6 0x0.0p0 T +REG epsg:3277 3 OK -0x1.5915bcec1e8d7p20 0x1.8e78409d93b7dp19 0x0.0p0 -0x1.4ap7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3277 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.68p5 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3278 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.2cp6 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3278 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 -0x1.0ep7 -0x1.64p6 0x0.0p0 T +REG epsg:3278 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.dfffffffffffep3 -0x1.64p6 0x0.0p0 T +REG epsg:3278 3 OK -0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 -0x1.0ep7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3278 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.dfffffffffffep3 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3279 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.68p5 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3279 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.a400000000001p6 -0x1.64p6 0x0.0p0 T +REG epsg:3279 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 0x1.dfffffffffffep3 -0x1.64p6 0x0.0p0 T +REG epsg:3279 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.a400000000001p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3279 4 OK 0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 0x1.dfffffffffffep3 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3280 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.dffffffffffffp3 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3280 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.2cp6 -0x1.64p6 0x0.0p0 T +REG epsg:3280 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 0x1.68p5 -0x1.64p6 0x0.0p0 T +REG epsg:3280 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.2cp6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3280 4 OK 0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 0x1.68p5 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3281 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.dffffffffffffp3 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3281 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 -0x1.68p5 -0x1.64p6 0x0.0p0 T +REG epsg:3281 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.2cp6 -0x1.64p6 0x0.0p0 T +REG epsg:3281 3 OK -0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 -0x1.68p5 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3281 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.2cp6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3282 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.68p5 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3282 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 -0x1.dfffffffffffep3 -0x1.64p6 0x0.0p0 T +REG epsg:3282 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.a400000000001p6 -0x1.64p6 0x0.0p0 T +REG epsg:3282 3 OK -0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 -0x1.dfffffffffffep3 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3282 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.a400000000001p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3283 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.2cp6 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3283 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.dfffffffffffep3 -0x1.64p6 0x0.0p0 T +REG epsg:3283 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 0x1.0ep7 -0x1.64p6 0x0.0p0 T +REG epsg:3283 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.dfffffffffffep3 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3283 4 OK 0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 0x1.0ep7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3284 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.a400000000001p6 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3284 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.68p5 -0x1.64p6 0x0.0p0 T +REG epsg:3284 2 OK 0x1.77200595d2627p16 0x1.b1283a2ff2e88p15 0x0.0p0 0x1.4ap7 -0x1.64p6 0x0.0p0 T +REG epsg:3284 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.68p5 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3284 4 OK 0x1.5915bcec1e8d7p20 0x1.8e78409d93b7dp19 0x0.0p0 0x1.4ap7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3285 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.0ep7 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3285 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 0x1.2cp6 -0x1.64p6 0x0.0p0 T +REG epsg:3285 2 OK 0x1.77200595d262ap16 0x1.b1283a2ff2e7cp15 0x0.0p0 -0x1.49fffffffffffp7 -0x1.64p6 0x0.0p0 T +REG epsg:3285 3 OK -0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 0x1.2cp6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3285 4 OK 0x1.5915bcec1e8dap20 0x1.8e78409d93b7p19 0x0.0p0 -0x1.49fffffffffffp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3286 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.4ap7 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3286 1 OK -0x1.77200595d2627p16 0x1.b1283a2ff2e88p15 0x0.0p0 0x1.a400000000001p6 -0x1.64p6 0x0.0p0 T +REG epsg:3286 2 OK 0x1.77200595d262ap16 0x1.b1283a2ff2e7cp15 0x0.0p0 -0x1.0dfffffffffffp7 -0x1.64p6 0x0.0p0 T +REG epsg:3286 3 OK -0x1.5915bcec1e8d7p20 0x1.8e78409d93b7dp19 0x0.0p0 0x1.a400000000001p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3286 4 OK 0x1.5915bcec1e8dap20 0x1.8e78409d93b7p19 0x0.0p0 -0x1.0dfffffffffffp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3287 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.2cp7 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3287 1 OK -0x1.77200595d2627p16 0x1.b1283a2ff2e88p15 0x0.0p0 0x1.2cp7 -0x1.64p6 0x0.0p0 T +REG epsg:3287 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.68p6 -0x1.64p6 0x0.0p0 T +REG epsg:3287 3 OK -0x1.5915bcec1e8d7p20 0x1.8e78409d93b7dp19 0x0.0p0 0x1.2cp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3287 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.68p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3288 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.68p6 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3288 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.2cp7 -0x1.64p6 0x0.0p0 T +REG epsg:3288 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.dfffffffffffep4 -0x1.64p6 0x0.0p0 T +REG epsg:3288 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.2cp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3288 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.dfffffffffffep4 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3289 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 -0x1.dffffffffffffp4 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3289 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 -0x1.68p6 -0x1.64p6 0x0.0p0 T +REG epsg:3289 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 0x1.dffffffffffffp4 -0x1.64p6 0x0.0p0 T +REG epsg:3289 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 -0x1.68p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3289 4 OK 0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 0x1.dffffffffffffp4 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3290 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.dffffffffffffp4 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3290 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 -0x1.dffffffffffffp4 -0x1.64p6 0x0.0p0 T +REG epsg:3290 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.68p6 -0x1.64p6 0x0.0p0 T +REG epsg:3290 3 OK -0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 -0x1.dffffffffffffp4 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3290 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.68p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3291 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.68p6 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3291 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.dfffffffffffep4 -0x1.64p6 0x0.0p0 T +REG epsg:3291 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.2cp7 -0x1.64p6 0x0.0p0 T +REG epsg:3291 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.dfffffffffffep4 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3291 4 OK 0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.2cp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3292 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x1.2cp7 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3292 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e82p15 0x0.0p0 0x1.68p6 -0x1.64p6 0x0.0p0 T +REG epsg:3292 2 OK 0x1.77200595d2627p16 0x1.b1283a2ff2e88p15 0x0.0p0 -0x1.2cp7 -0x1.64p6 0x0.0p0 T +REG epsg:3292 3 OK -0x1.5915bcec1e8d9p20 0x1.8e78409d93b77p19 0x0.0p0 0x1.68p6 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3292 4 OK 0x1.5915bcec1e8d7p20 0x1.8e78409d93b7dp19 0x0.0p0 -0x1.2cp7 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3293 0 OK 0x0.0p0 0x1.0869146032e25p19 0x0.0p0 0x0.0p0 -0x1.547a2b3c4d5e7p6 0x0.0p0 T +REG epsg:3293 1 OK -0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3293 2 OK 0x1.77200595d2628p16 0x1.b1283a2ff2e85p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3293 3 OK -0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 -0x1.dffffffffffffp5 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3293 4 OK 0x1.5915bcec1e8d8p20 0x1.8e78409d93b7ap19 0x0.0p0 0x1.dffffffffffffp5 -0x1.2d6e81b4e81b5p6 0x0.0p0 T +REG epsg:3294 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.44p7 -0x1.37fffffffffffp6 0x0.0p0 F +REG epsg:3294 1 OK -0x1.c2842f5b16eaep17 -0x1.3b8fa8e728728p18 0x0.0p0 0x1.2a591bfffa017p7 -0x1.42aaaaaaaaa92p6 0x0.0p0 F +REG epsg:3294 2 OK 0x1.c2842f5b16eaep17 -0x1.3b8fa8e728728p18 0x0.0p0 0x1.5da6e40005fe9p7 -0x1.42aaaaaaaaa92p6 0x0.0p0 F +REG epsg:3294 3 OK -0x1.5f96d9c899308p18 0x1.f82c10d964002p17 0x0.0p0 0x1.2a591bfffa017p7 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:3294 4 OK 0x1.5f96d9c899308p18 0x1.f82c10d964002p17 0x0.0p0 0x1.5da6e40005fe9p7 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:3296 0 OK 0x1.e847e02193073p18 0x1.b997b08ef21bep22 -0x1.8d5e17ap-3 -0x1.31ffffffffff8p7 -0x1.9000000000003p4 0x1.6p-27 F +REG epsg:3296 1 OK -0x1.fbe7488948e6p14 0x1.97014c188c122p22 -0x1.52a8236p-3 -0x1.3d08a5c0c2b91p7 -0x1.e00000000000ep4 0x1.2p-27 F +REG epsg:3296 2 OK 0x1.f827174b51d9ep19 0x1.97014bbbeb842p22 -0x1.f74a108p-3 -0x1.26f75a3f3d46p7 -0x1.e000000000008p4 0x1.1p-26 F +REG epsg:3296 3 OK -0x1.2fd8a03c5cd9p16 0x1.dacaa05245b1cp22 -0x1.159973ap-3 -0x1.3d08a5c0c2b91p7 -0x1.3fffffffffff6p4 0x1.4p-27 F +REG epsg:3296 4 OK 0x1.07217b91ffd6ep20 0x1.daca9fed398a2p22 -0x1.c86ea44p-3 -0x1.26f75a3f3d46p7 -0x1.3fffffffffff7p4 0x1.4p-26 F +REG epsg:3297 0 OK 0x1.e847e23ac3967p18 0x1.b997b04574ed6p22 -0x1.e96656cp-3 -0x1.25ffffffffff8p7 -0x1.9000000000005p4 0x1.ep-27 F +REG epsg:3297 1 OK -0x1.fbe7281df1bep14 0x1.97014bc8b2d28p22 -0x1.ad89eb8p-3 -0x1.3108a5c0c2b8fp7 -0x1.e00000000000fp4 0x1.cp-28 F +REG epsg:3297 2 OK 0x1.f82718895457p19 0x1.97014b7094c9cp22 -0x1.25b1026p-2 -0x1.1af75a3f3d45fp7 -0x1.e000000000005p4 0x1.6p-26 F +REG epsg:3297 3 OK -0x1.2fd89986c9afp16 0x1.dacaa00a12c63p22 -0x1.78523bp-3 -0x1.3108a5c0c2b9p7 -0x1.3fffffffffffap4 0x1.8p-27 F +REG epsg:3297 4 OK 0x1.07217c1ff543ap20 0x1.daca9faa5702p22 -0x1.11e35b3p-2 -0x1.1af75a3f3d46p7 -0x1.3fffffffffff8p4 0x1.6p-26 F +REG epsg:3298 0 OK 0x1.e847e4caacd12p18 0x1.b997b00088214p22 -0x1.208806fp-2 -0x1.19ffffffffff6p7 -0x1.8fffffffffffdp4 0x1.7p-26 F +REG epsg:3298 1 OK -0x1.fbe6ffadf07p14 0x1.97014b7d3a57ep22 -0x1.029100fp-2 -0x1.2508a5c0c2b8dp7 -0x1.e000000000008p4 0x1.ep-27 F +REG epsg:3298 2 OK 0x1.f8271a04b370ap19 0x1.97014b2a61d5p22 -0x1.4d3ac7dp-2 -0x1.0ef75a3f3d45fp7 -0x1.e000000000001p4 0x1.bp-26 F +REG epsg:3298 3 OK -0x1.2fd891033d23p16 0x1.daca9fc5cd617p22 -0x1.d7782dcp-3 -0x1.2508a5c0c2b8ep7 -0x1.3fffffffffff6p4 0x1.1p-26 F +REG epsg:3298 4 OK 0x1.07217cc92588p20 0x1.daca9f6c47c73p22 -0x1.3cd5875p-2 -0x1.0ef75a3f3d46p7 -0x1.3fffffffffff1p4 0x1.bp-26 F +REG epsg:3299 0 OK 0x1.e847e7ca1f118p18 0x1.b997afc0ed098p22 -0x1.49b2ae9p-2 -0x1.0dffffffffff6p7 -0x1.8fffffffffffcp4 0x1.cp-26 F +REG epsg:3299 1 OK -0x1.fbe6cfaaaf8cp14 0x1.97014b36f64fdp22 -0x1.2c3d5c4p-2 -0x1.1908a5c0c2b8dp7 -0x1.e000000000005p4 0x1.5p-26 F +REG epsg:3299 2 OK 0x1.f8271bb9471dfp19 0x1.97014aea178acp22 -0x1.71d3732p-2 -0x1.02f75a3f3d45fp7 -0x1.dfffffffffffep4 0x1.fp-26 F +REG epsg:3299 3 OK -0x1.2fd886c9984cp16 0x1.daca9f8634ffap22 -0x1.1900366p-2 -0x1.1908a5c0c2b8ep7 -0x1.3fffffffffff2p4 0x1.ap-26 F +REG epsg:3299 4 OK 0x1.07217d8bb61d4p20 0x1.daca9f33b9e9ep22 -0x1.649562p-2 -0x1.02f75a3f3d45fp7 -0x1.3fffffffffff2p4 0x1.1p-25 F +REG epsg:3300 0 OK 0x1.e8484430f9dbap18 0x1.8b455dfce81d1p22 0x1.56ff8ep-2 0x1.800000000000fp4 0x1.d3674efdabe08p5 0x1.d8p-25 F +REG epsg:3300 1 OK 0x1.184cb83a7c49ep18 0x1.7f432609724a4p22 0x1.46b8726p-2 0x1.4883ca5790831p4 0x1.c4e097a3ae648p5 0x1.dp-25 F +REG epsg:3300 2 OK 0x1.5c21e7eb1241p19 0x1.7f43260504b8bp22 0x1.69be777p-2 0x1.b77c35a86f7f1p4 0x1.c4e097a3ae646p5 0x1.e8p-25 F +REG epsg:3300 3 OK 0x1.2cb70614c31b4p18 0x1.97ebb5ce1f569p22 0x1.45649f8p-2 0x1.4883ca579082bp4 0x1.e1ee0657a9596p5 0x1.ep-25 F +REG epsg:3300 4 OK 0x1.51ecc15169542p19 0x1.97ebb5c82614bp22 0x1.64f93c2p-2 0x1.b77c35a86f7ecp4 0x1.e1ee0657a9594p5 0x1.fp-25 F +REG epsg:3301 0 OK 0x1.e848p18 0x1.8b455f21c74fp22 0x0.0p0 0x1.8000000000001p4 0x1.d3674efdabdfdp5 0x0.0p0 F +REG epsg:3301 1 OK 0x1.184c73b0ad198p18 0x1.7f4327245fe5bp22 0x0.0p0 0x1.4883ca579082p4 0x1.c4e097a3ae63dp5 0x0.0p0 F +REG epsg:3301 2 OK 0x1.5c21c627a9732p19 0x1.7f4327245fe5bp22 0x0.0p0 0x1.b77c35a86f7ep4 0x1.c4e097a3ae63dp5 0x0.0p0 F +REG epsg:3301 3 OK 0x1.2cb6c13cd6657p18 0x1.97ebb6f825063p22 0x0.0p0 0x1.4883ca579082p4 0x1.e1ee0657a959p5 0x0.0p0 F +REG epsg:3301 4 OK 0x1.51ec9f6194cd3p19 0x1.97ebb6f825063p22 0x0.0p0 0x1.b77c35a86f7ep4 0x1.e1ee0657a959p5 0x0.0p0 F +REG epsg:3302 0 OK 0x1.e818bc27b8c4dp18 0x1.b9971ba00ead1p22 0x1.33ed7a2dp3 -0x1.1a00000009003p7 -0x1.90000001129b6p4 0x1.ef3p-14 F +REG epsg:3302 1 OK -0x1.fe8bba71b84p14 0x1.9700bf5c98328p22 0x1.8b9997034p4 -0x1.2508a5c0da9b7p7 -0x1.e00000015e469p4 0x1.f4cp-13 F +REG epsg:3302 2 OK 0x1.f80f76d093eb7p19 0x1.970104940e5d9p22 -0x1.67fb7b45p3 -0x1.0ef75a3f376dfp7 -0x1.e000000168107p4 0x1.ad138p-13 F +REG epsg:3302 3 OK -0x1.30936a709ddf8p16 0x1.dac9ba9b8ddcfp22 0x1.b404ae8b8p4 -0x1.2508a5c0d9b9ep7 -0x1.40000000afda1p4 0x1.7425p-14 F +REG epsg:3302 4 OK 0x1.071471f41f3eep20 0x1.daca09279bedap22 -0x1.7868b3ad8p3 -0x1.0ef75a3f37a48p7 -0x1.40000000b628bp4 0x1.a348p-15 F +REG epsg:3303 0 OK 0x1.e95f81bfc76fbp18 0x1.b9524a4c284aep22 0x1.151ebabb9ep9 -0x1.1a00002f84195p7 -0x1.9000004474615p4 0x1.d237ddcp-1 F +REG epsg:3303 1 OK -0x1.e763e7001ec2p14 0x1.96bde55088f92p22 0x1.4fb08478cap9 -0x1.2508a5d37cf43p7 -0x1.e0000010cd6d7p4 0x1.dc752dc8p-1 F +REG epsg:3303 2 OK 0x1.f8a325decddacp19 0x1.96bec80b2c162p22 0x1.83111d9ddp9 -0x1.0ef75a82436a3p7 -0x1.e000007d37848p4 0x1.c714e3cp-1 F +REG epsg:3303 3 OK -0x1.2b0d8bc9aee08p16 0x1.da8246bf6bd8p22 0x1.33b386d1b8p8 -0x1.2508a5da7996fp7 -0x1.4000001b3b4f4p4 0x1.daa46a88p-1 F +REG epsg:3303 4 OK 0x1.075c83387d338p20 0x1.da837c64d5ac8p22 0x1.a34e1d1708p8 -0x1.0ef75a88ef88ep7 -0x1.4000007f87c6ep4 0x1.bd837ep-1 F +REG epsg:3304 0 OK 0x1.e8471a195c011p18 0x1.b99539b8ae62dp22 0x1.5734eaf98p3 -0x1.25fffffffb1e7p7 -0x1.9000000060c72p4 0x1.7e78p-16 F +REG epsg:3304 1 OK -0x1.fbf3a7293bccp14 0x1.96ff109a7cac8p22 0x1.25b0bdb1cp4 -0x1.3108a5c0c7b64p7 -0x1.e0000000a0449p4 0x1.f0f8p-15 F +REG epsg:3304 2 OK 0x1.f824be197627fp19 0x1.96fed6325a3bap22 0x1.3ac28bfecp4 -0x1.1af75a3f2e646p7 -0x1.e00000009ba5fp4 0x1.472p-14 F +REG epsg:3304 3 OK -0x1.2fcd82093215p16 0x1.dac82c9739acep22 -0x1.066693aap1 -0x1.3108a5c0c76d8p7 -0x1.400000001e464p4 0x1.368p-18 F +REG epsg:3304 4 OK 0x1.072157d5834p20 0x1.dac7ebbb3a4dp22 -0x1.4669483p-1 -0x1.1af75a3f2f3f6p7 -0x1.400000001bab7p4 0x1.aaa4p-16 F +REG epsg:3305 0 OK 0x1.e846411af5f71p18 0x1.b995146af9c16p22 0x1.54e499998p3 -0x1.25ffffffeea43p7 -0x1.90000000ac48fp4 0x1.d166p-15 F +REG epsg:3305 1 OK -0x1.fc0d925b0ff2p14 0x1.96fef285ff08p22 0x1.280260b44p4 -0x1.3108a5c0c27f5p7 -0x1.e00000011ffe7p4 0x1.b0d1p-14 F +REG epsg:3305 2 OK 0x1.f8240fdb00b37p19 0x1.96fea519583d2p22 0x1.3e89e7b74p4 -0x1.1af75a3f1a507p7 -0x1.e00000010f884p4 0x1.64418p-13 F +REG epsg:3305 3 OK -0x1.2fcf072c78488p16 0x1.dac8140dedc3p22 -0x1.29ca41e2p1 -0x1.3108a5c0c282ap7 -0x1.4000000039cap4 0x1.136p-18 F +REG epsg:3305 4 OK 0x1.072152b65d57ap20 0x1.dac7be0d3c65ap22 -0x1.a4054e4p-1 -0x1.1af75a3f1c528p7 -0x1.40000000307b9p4 0x1.478dp-14 F +REG epsg:3306 0 OK 0x1.e842bd3a2ee4ep18 0x1.b997377dbd566p22 -0x1.b1e27b568p3 -0x1.32p7 -0x1.8ffffffffffffp4 -0x1.8p-29 F +REG epsg:3306 1 OK -0x1.fc3e02740dep14 0x1.9700ce2c4ce82p22 -0x1.b831b24cp3 -0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3306 2 OK 0x1.f824ad47a0192p19 0x1.9700ce2c5fcc4p22 -0x1.142ebc508p4 -0x1.26f75a3f3d469p7 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:3306 3 OK -0x1.2fee64850ed3p16 0x1.daca2b895dc4bp22 -0x1.8e3e1bc9p3 -0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:3306 4 OK 0x1.072044e1282d1p20 0x1.daca2b896fbd1p22 -0x1.03fa4d218p4 -0x1.26f75a3f3d46ap7 -0x1.4p4 0x1.0p-29 F +REG epsg:3307 0 OK 0x1.e8480609ffc88p18 -0x1.5c054e88eab74p-1 0x1.dd7a878p-4 0x1.98p5 0x1.2f74bf1dcfcaep-70 -0x1.0p-30 T +REG epsg:3307 1 OK -0x1.ad74d678f7f9p15 -0x1.0ee370e0829ccp19 0x1.558455cp-3 0x1.7p5 -0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:3307 2 OK 0x1.018fa9b8ccaa8p20 -0x1.0ee370e082c42p19 0x1.77167d8p-3 0x1.bffffffffffffp5 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:3307 3 OK -0x1.ad74dbc7b0e3p15 0x1.0ee345603625fp19 0x1.8b0e1f8p-5 0x1.7p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3307 4 OK 0x1.018fa9e34272cp20 0x1.0ee34560364d8p19 0x1.08ab5fp-4 0x1.c000000000001p5 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:3308 0 OK 0x1.1bd04p23 0x1.12a88p22 0x0.0p0 0x1.26p7 -0x1.09fffffffffc9p5 0x0.0p0 F +REG epsg:3308 1 OK 0x1.0bcdf33eca366p23 0x1.dfbd6dc44bc32p21 0x0.0p0 0x1.1a0ad8cb2ee1cp7 -0x1.31fffffffffe2p5 0x0.0p0 F +REG epsg:3308 2 OK 0x1.2bd28cc135c9bp23 0x1.dfbd6dc44bc32p21 0x0.0p0 0x1.31f52734d11e4p7 -0x1.31fffffffffe2p5 0x0.0p0 F +REG epsg:3308 3 OK 0x1.09de26210c25dp23 0x1.33798802a3723p22 0x0.0p0 0x1.1a0ad8cb2ee1cp7 -0x1.c3fffffffff54p4 0x0.0p0 F +REG epsg:3308 4 OK 0x1.2dc259def3da4p23 0x1.33798802a3723p22 0x0.0p0 0x1.31f52734d11e4p7 -0x1.c3fffffffff54p4 0x0.0p0 F +REG epsg:3309 0 OK 0x0.0p0 -0x1.dbbb626268b07p20 0x0.0p0 -0x1.dffffffffffffp6 0x1.43ffffffffffap4 0x0.0p0 F +REG epsg:3309 1 OK -0x1.e3bd7375d5a1ap20 -0x1.95e822e432d84p21 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.5000000000001p2 0x0.0p0 F +REG epsg:3309 2 OK 0x1.e3bd7375d5a14p20 -0x1.95e822e432d84p21 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.5000000000001p2 0x0.0p0 F +REG epsg:3309 3 OK -0x1.613a84efdf2cbp20 -0x1.69f34eafb261p17 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.1ap5 0x0.0p0 F +REG epsg:3309 4 OK 0x1.613a84efdf2c6p20 -0x1.69f34eafb261p17 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.1ap5 0x0.0p0 F +REG epsg:3310 0 OK 0x0.0p0 -0x1.dbb469232363dp20 0x0.0p0 -0x1.dffffffffffffp6 0x1.4400000000002p4 0x0.0p0 F +REG epsg:3310 1 OK -0x1.e3bcdf3fff717p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:3310 2 OK 0x1.e3bcdf3fff711p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:3310 3 OK -0x1.613869004e067p20 -0x1.699d483196edp17 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3310 4 OK 0x1.613869004e063p20 -0x1.699d483196edp17 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3311 0 OK 0x0.0p0 -0x1.dbb469232363dp20 0x0.0p0 -0x1.dffffffffffffp6 0x1.4400000000002p4 0x0.0p0 F +REG epsg:3311 1 OK -0x1.e3bcdf3fff717p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:3311 2 OK 0x1.e3bcdf3fff711p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:3311 3 OK -0x1.613869004e067p20 -0x1.699d483196edp17 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3311 4 OK 0x1.613869004e063p20 -0x1.699d483196edp17 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3312 0 OK 0x1.e84fada5e04dep18 -0x1.b7d22d218d80ap6 0x1.5995bffa2p5 -0x1.c800000000001p5 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:3312 1 OK -0x1.ad2e7c1ad0d4p15 -0x1.0ef0a010e7926p19 0x1.8498980b8p5 -0x1.fp5 -0x1.4p2 -0x1.0p-29 F +REG epsg:3312 2 OK 0x1.01914ab9e0403p20 -0x1.0ef0a01119f7dp19 0x1.af471e1a4p5 -0x1.a000000000001p5 -0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:3312 3 OK -0x1.ad31d69096b7p15 0x1.0ed52328d2d25p19 0x1.d668c01a8p4 -0x1.fp5 0x1.4p2 -0x1.8p-29 F +REG epsg:3312 4 OK 0x1.0191658e50138p20 0x1.0ed52329052d9p19 0x1.15e2ee934p5 -0x1.a000000000001p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3313 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:3313 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:3313 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:3313 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:3313 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:3314 0 OK -0x1.26e5f5bec603ep5 -0x1.37eebdd208359p19 0x1.13eb5ed5p2 0x1.ap4 -0x1.6fffffffffd88p2 0x1.0p-30 F +REG epsg:3314 1 OK -0x1.2ee505675f7cap20 -0x1.d7db48fc21f26p20 -0x1.a33da9e64p4 0x1.ce2398df2927p3 -0x1.13ffffffffedcp4 0x1.0p-30 F +REG epsg:3314 2 OK 0x1.2ee075d94c303p20 -0x1.d7db6ada3f84dp20 -0x1.42674b016p5 0x1.2c7719c835b61p5 -0x1.13ffffffffefp4 -0x1.0p-30 F +REG epsg:3314 3 OK -0x1.42a40d5d8cc24p20 0x1.32e9ddc0c0c5ap19 0x1.e7d2bc20ep5 0x1.ce2398df29272p3 0x1.6fffffffffdbp2 0x1.0p-30 F +REG epsg:3314 4 OK 0x1.429f665eca96p20 0x1.32ea59e0b26aep19 0x1.7252dc5c8p5 0x1.2c7719c835b62p5 0x1.6fffffffffd9dp2 -0x1.0p-30 F +REG epsg:3315 0 OK -0x1.26a5ba68b5cefp5 0x1.8571e6ea0d914p7 -0x1.d7d524eep2 0x1.ap4 -0x1.2000000000001p3 0x1.0p-30 F +REG epsg:3315 1 OK -0x1.0b5142c078409p19 -0x1.10c7913008da5p19 -0x1.4163a5a68p4 0x1.4f00b6d791e5ap4 -0x1.bfffffffe598ep3 0x1.8p-29 F +REG epsg:3315 2 OK 0x1.0b480d82dc98ep19 -0x1.10c7912f6b855p19 -0x1.a6513061p4 0x1.f0ff49286e244p4 -0x1.bfffffffe59ecp3 0x1.8p-29 F +REG epsg:3315 3 OK -0x1.12d13b5c6d0a2p19 0x1.0d2fa35d470dbp19 0x1.bfb35fac8p3 0x1.4f00b6d7e566dp4 -0x1.ffffffffda0a5p1 -0x1.0p-29 F +REG epsg:3315 4 OK 0x1.12c8062056e9ep19 0x1.0d2fa35d79cdap19 0x1.e05879cep2 0x1.f0ff49281ab3ep4 -0x1.ffffffffda131p1 -0x1.0p-28 F +REG epsg:3316 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.6p4 0x0.0p0 0x0.0p0 T +REG epsg:3316 1 OK -0x1.aed64ed80e36p15 0x1.203de2bfed327p23 0x0.0p0 0x1.100000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3316 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.afffffff87cc4p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3316 3 OK -0x1.aed64ed80e36p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.100000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3316 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.afffffff87cc4p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3317 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3317 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.300000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3317 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.cfffffff87cc5p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3317 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.300000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3317 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.cfffffff87cc5p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3318 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:3318 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.c0000001e0cf1p2 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3318 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.0fffffff87cc4p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3318 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.c0000001e0cf1p2 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3318 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.0fffffff87cc4p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3319 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.cp3 0x0.0p0 0x0.0p0 T +REG epsg:3319 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.20000000f0678p3 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3319 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.2fffffff87cc4p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3319 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.20000000f0678p3 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3319 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.2fffffff87cc4p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3320 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.0p4 0x0.0p0 0x0.0p0 T +REG epsg:3320 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.60000000f0678p3 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3320 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.4fffffff87cc3p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3320 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.60000000f0678p3 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3320 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.4fffffff87cc3p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3321 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG epsg:3321 1 OK -0x1.aed64ed80e37p15 0x1.203de2bfed327p23 0x0.0p0 0x1.a0000000f0679p3 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3321 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.6fffffff87cc4p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3321 3 OK -0x1.aed64ed80e37p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.a0000000f0679p3 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3321 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.6fffffff87cc4p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3322 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.4p4 0x0.0p0 0x0.0p0 T +REG epsg:3322 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.e0000000f0677p3 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3322 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.8fffffff87cc3p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3322 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.e0000000f0677p3 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3322 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.8fffffff87cc3p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3323 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.6p4 0x0.0p0 0x0.0p0 T +REG epsg:3323 1 OK -0x1.aed64ed80e36p15 0x1.203de2bfed327p23 0x0.0p0 0x1.100000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3323 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.afffffff87cc4p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3323 3 OK -0x1.aed64ed80e36p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.100000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3323 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.afffffff87cc4p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3324 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3324 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.300000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3324 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.cfffffff87cc5p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3324 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.300000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3324 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.cfffffff87cc5p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3325 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.ap4 0x0.0p0 0x0.0p0 T +REG epsg:3325 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.500000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3325 2 OK 0x1.019ab276c071bp20 0x1.203de2bfed327p23 0x0.0p0 0x1.efffffff87cc4p4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3325 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.500000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3325 4 OK 0x1.019ab276c071bp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.efffffff87cc4p4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3326 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.cp4 0x0.0p0 0x0.0p0 T +REG epsg:3326 1 OK -0x1.aed64ed80e39p15 0x1.203de2bfed327p23 0x0.0p0 0x1.700000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3326 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.07ffffffc3e62p5 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3326 3 OK -0x1.aed64ed80e39p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.700000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3326 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.07ffffffc3e62p5 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3327 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:3327 1 OK -0x1.aed64ed80e36p15 0x1.203de2bfed327p23 0x0.0p0 0x1.900000007833cp4 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3327 2 OK 0x1.019ab276c071cp20 0x1.203de2bfed327p23 0x0.0p0 0x1.17ffffffc3e62p5 -0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3327 3 OK -0x1.aed64ed80e36p15 0x1.421c1d4012cd9p23 0x0.0p0 0x1.900000007833cp4 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3327 4 OK 0x1.019ab276c071cp20 0x1.421c1d4012cd9p23 0x0.0p0 0x1.17ffffffc3e62p5 0x1.3fffffffea4b4p2 0x0.0p0 F +REG epsg:3328 0 OK 0x1.e8672c954f7dcp18 0x1.e850494f346c4p18 -0x1.0f2c5bc3p5 0x1.32aaaaaaa6222p4 0x1.a155555544c39p5 0x1.946fp-14 F +REG epsg:3328 1 OK -0x1.cd8b7972ee94p16 -0x1.62099fb33949p14 -0x1.9b24ac856p5 0x1.607a59f58a995p3 0x1.7955555546d9p5 0x1.bb57p-14 F +REG epsg:3328 2 OK 0x1.110c25e11d118p20 -0x1.620ed44bd132p14 -0x1.691fabd4p4 0x1.b518285a8919bp4 0x1.7955555546962p5 0x1.b522p-14 F +REG epsg:3328 3 OK 0x1.b42d2c1fd9b4p12 0x1.09048c3995f68p20 -0x1.584abbf6ap5 0x1.607a59f589638p3 0x1.c95555554344p5 0x1.6d5ep-14 F +REG epsg:3328 4 OK 0x1.e4ff2a7f8bedcp19 0x1.09045636f591ap20 -0x1.40c92246p4 0x1.b518285a84ccfp4 0x1.c95555554348ep5 0x1.6698p-14 F +REG epsg:3329 0 OK 0x1.4fb3709c8cdc4p22 0x1.365dd89246892p6 -0x1.83d62475p6 0x1.e000000002c99p3 0x1.c58b73effecf5p-32 0x1.c0fep-14 T +REG epsg:3329 1 OK 0x1.2dd06c22a4077p22 -0x1.0ef6ac945247ep19 -0x1.d2df933bdp6 0x1.40000000eaf74p3 -0x1.3fffffff67bc8p2 0x1.9bdep-14 F +REG epsg:3329 2 OK 0x1.71967ce6882c4p22 -0x1.0ef661e819e1ep19 -0x1.6a8404744p6 0x1.3fffffff8d831p4 -0x1.3fffffff69c0bp2 0x1.9fd7p-14 F +REG epsg:3329 3 OK 0x1.2dd0690279b79p22 0x1.0f09d4586e2dap19 -0x1.9dac0312ep6 0x1.40000000eaae9p3 0x1.4000000048759p2 0x1.de83p-14 F +REG epsg:3329 4 OK 0x1.71967076f8188p22 0x1.0f0a058d32249p19 -0x1.354e32a61p6 0x1.3fffffff8c87dp4 0x1.4000000045f97p2 0x1.e123p-14 F +REG epsg:3330 0 OK 0x1.8cbc6e990c1a4p22 0x1.38b15533f78bap6 -0x1.6469f5226p6 0x1.2000000002019p4 0x1.c22d09de76becp-32 0x1.c234p-14 T +REG epsg:3330 1 OK 0x1.6ad96cd21d4e2p22 -0x1.0ef683a9eaf8bp19 -0x1.b38413fefp6 0x1.a0000000ec7e1p3 -0x1.3fffffff6807ep2 0x1.9c7p-14 F +REG epsg:3330 2 OK 0x1.ae9f78213b778p22 -0x1.0ef6397381c26p19 -0x1.4b8206bbcp6 0x1.6fffffff8e361p4 -0x1.3fffffff6afd4p2 0x1.a221p-14 F +REG epsg:3330 3 OK 0x1.6ad969c0cd5aap22 0x1.0f09d11ba0f97p19 -0x1.7e4fd5697p6 0x1.a0000000ebb16p3 0x1.40000000481dcp2 0x1.dee1p-14 F +REG epsg:3330 4 OK 0x1.ae9f6bc068e69p22 0x1.0f0a01da9861p19 -0x1.164b8adf9p6 0x1.6fffffff8cfa7p4 0x1.40000000448abp2 0x1.e2a8p-14 F +REG epsg:3331 0 OK 0x1.c9c56af13f397p22 0x1.3aff90ac7a15bp6 -0x1.4523c69c2p6 0x1.500000000298dp4 0x1.bd92bf256ca1p-32 0x1.c3dcp-14 T +REG epsg:3331 1 OK 0x1.a7e26bd744ff1p22 -0x1.0ef65aeeb0b33p19 -0x1.9429cd71cp6 0x1.0000000076ff8p4 -0x1.3fffffff689bcp2 0x1.9d8ap-14 F +REG epsg:3331 2 OK 0x1.eba871b83755bp22 -0x1.0ef6115939b73p19 -0x1.2cca3c809p6 0x1.9fffffff8ee06p4 -0x1.3fffffff6c80cp2 0x1.a4e6p-14 F +REG epsg:3331 3 OK 0x1.a7e268da3a8f3p22 0x1.0f09cde511ee1p19 -0x1.5ef4e131bp6 0x1.0000000076577p4 0x1.400000004771ap2 0x1.df98p-14 F +REG epsg:3331 4 OK 0x1.eba8656b8db54p22 0x1.0f09fe03186ccp19 -0x1.ef2631d5ep5 0x1.9fffffff8d659p4 0x1.4000000042caap2 0x1.e472p-14 F +REG epsg:3332 0 OK 0x1.036732d3db9f6p23 0x1.3d46ecd6f1d8cp6 -0x1.26198a9a4p6 0x1.800000000328cp4 0x1.b7bfce8f18464p-32 0x1.c5e6p-14 T +REG epsg:3332 1 OK 0x1.e4eb6932cb83fp22 -0x1.0ef6327f37e83p19 -0x1.74e6bf6e8p6 0x1.3000000077bb8p4 -0x1.3fffffff69787p2 0x1.9f23p-14 F +REG epsg:3332 2 OK 0x1.1458b4d7fdcf2p23 -0x1.0ef5e9b56537fp19 -0x1.0e7233887p6 0x1.cfffffff8f805p4 -0x1.3fffffff6e4a9p2 0x1.a821p-14 F +REG epsg:3332 3 OK 0x1.e4eb664f63847p22 0x1.0f09cab702343p19 -0x1.3fb126bf5p6 0x1.3000000076d22p4 0x1.4000000046718p2 0x1.e0adp-14 F +REG epsg:3332 4 OK 0x1.1458aebe6c1aap23 0x1.0f09fa0964689p19 -0x1.b274d6066p5 0x1.cfffffff8dc71p4 0x1.4000000040ba7p2 0x1.e688p-14 F +REG epsg:3333 0 OK 0x1.ab42e13919b88p21 0x1.365dd89246892p6 -0x1.83d62475p6 0x1.e000000002c99p3 0x1.c58b73effecf5p-32 0x1.c0fep-14 T +REG epsg:3333 1 OK 0x1.677cd845480eep21 -0x1.0ef6ac945247ep19 -0x1.d2df933bdp6 0x1.40000000eaf74p3 -0x1.3fffffff67bc8p2 0x1.9bdep-14 F +REG epsg:3333 2 OK 0x1.ef08f9cd10587p21 -0x1.0ef661e819e1ep19 -0x1.6a8404744p6 0x1.3fffffff8d83p4 -0x1.3fffffff69c0bp2 0x1.9fd7p-14 F +REG epsg:3333 3 OK 0x1.677cd204f36f1p21 0x1.0f09d4586e2dap19 -0x1.9dac0312ep6 0x1.40000000eaae7p3 0x1.4000000048759p2 0x1.de83p-14 F +REG epsg:3333 4 OK 0x1.ef08e0edf030fp21 0x1.0f0a058d32249p19 -0x1.354e32a61p6 0x1.3fffffff8c87bp4 0x1.4000000045f98p2 0x1.e122p-14 F +REG epsg:3334 0 OK 0x1.12aa6af13f397p22 0x1.3aff90ac7a15bp6 -0x1.4523c69c2p6 0x1.500000000298dp4 0x1.bd92bf256ca1p-32 0x1.c3dcp-14 T +REG epsg:3334 1 OK 0x1.e18ed7ae89fe2p21 -0x1.0ef65aeeb0b33p19 -0x1.9429cd71cp6 0x1.0000000076ff8p4 -0x1.3fffffff689bcp2 0x1.9d8ap-14 F +REG epsg:3334 2 OK 0x1.348d71b83755bp22 -0x1.0ef6115939b73p19 -0x1.2cca3c809p6 0x1.9fffffff8ee06p4 -0x1.3fffffff6c80cp2 0x1.a4e6p-14 F +REG epsg:3334 3 OK 0x1.e18ed1b4751e6p21 0x1.0f09cde511ee1p19 -0x1.5ef4e131bp6 0x1.0000000076577p4 0x1.400000004771ap2 0x1.df98p-14 F +REG epsg:3334 4 OK 0x1.348d656b8db54p22 0x1.0f09fe03186ccp19 -0x1.ef2631d5ep5 0x1.9fffffff8d659p4 0x1.4000000042caap2 0x1.e472p-14 F +REG epsg:3335 0 OK 0x1.4fb35ec02a48ep22 0x1.3f85d061ba469p6 -0x1.076108be9p6 0x1.b000000003af9p4 0x1.b0b84e3cea286p-32 0x1.c856p-14 T +REG epsg:3335 1 OK 0x1.2dd064e68bec5p22 -0x1.0ef60a77dfd2ap19 -0x1.55d0d97e4p6 0x1.6000000078712p4 -0x1.3fffffff6a9ccp2 0x1.a146p-14 F +REG epsg:3335 2 OK 0x1.7196600e2b7dep22 -0x1.0ef5c2a3d4921p19 -0x1.e11e6cc7cp5 0x1.ffffffff9014cp4 -0x1.3fffffff7059ep2 0x1.abc8p-14 F +REG epsg:3335 3 OK 0x1.2dd06222114c1p22 0x1.0f09c793acfd4p19 -0x1.209a96151p6 0x1.6000000077473p4 0x1.40000000451dep2 0x1.e20dp-14 F +REG epsg:3335 4 OK 0x1.719653f9d9a91p22 0x1.0f09f5f046739p19 -0x1.76ad98594p5 0x1.ffffffff8e1e5p4 0x1.400000003e5cp2 0x1.e8dfp-14 F +REG epsg:3336 0 OK 0x1.e87a938e2d3e3p18 0x1.b9955ec1feaaep22 -0x1.40419fa47p6 0x1.14p6 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:3336 1 OK -0x1.f8d33490c564p14 0x1.96fedde1e06p22 -0x1.5f74dccd6p6 0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:3336 2 OK 0x1.f8412d686ff4bp19 0x1.96fedde12afa4p22 -0x1.b1512d23cp5 0x1.2a114b818572ep6 -0x1.e000000000001p4 -0x1.8p-29 F +REG epsg:3336 3 OK -0x1.2f15f6e44c38p16 0x1.dac86978c4b12p22 -0x1.b2d389d6ep6 0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:3336 4 OK 0x1.072ea960b687fp20 0x1.dac86978182aep22 -0x1.208fae8a1p6 0x1.2a114b818572ep6 -0x1.3fffffffffffep4 0x1.8p-29 F +REG epsg:3337 0 OK 0x1.e7ec2954f2762p19 0x1.e8724a07a9811p19 0x1.423c091cp4 0x1.cc2cb40abd99ap5 -0x1.431f012345561p4 -0x1.0p-29 F +REG epsg:3337 1 OK 0x1.c18bf9229ac0cp18 0x1.ab09f9af39704p18 0x1.a712c70dap5 0x1.a18df0792ae77p5 -0x1.931f012345595p4 0x1.0p-29 F +REG epsg:3337 2 OK 0x1.778924e06304ep20 0x1.ab07314efc7b8p18 -0x1.1a447fbe1p6 0x1.f6cb779c504b7p5 -0x1.931f012345593p4 0x0.0p0 F +REG epsg:3337 3 OK 0x1.9ece35cc93498p18 0x1.793e6fc5114dap20 0x1.d0298c3f5p6 0x1.a18df0792ae77p5 -0x1.e63e02468aaafp3 -0x1.0p-29 F +REG epsg:3337 4 OK 0x1.8038a32c91b02p20 0x1.793f23fb3407ap20 -0x1.f3d5b04d8p3 0x1.f6cb779c504b7p5 -0x1.e63e02468aacbp3 0x1.0p-29 F +REG epsg:3338 0 OK 0x0.0p0 0x1.96adf1aec1aa1p19 0x0.0p0 -0x1.34p7 0x1.cbffffffffffep5 0x0.0p0 F +REG epsg:3338 1 OK -0x1.18171f0f3270bp21 -0x1.4125960900542p18 0x0.0p0 0x1.642a4c850f0f2p7 0x1.54p5 0x0.0p0 F +REG epsg:3338 2 OK 0x1.18171f0f32714p21 -0x1.412596090051dp18 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.54p5 0x0.0p0 F +REG epsg:3338 3 OK -0x1.cbba8109d854ep19 0x1.49526b059ff17p21 0x0.0p0 0x1.642a4c850f0f2p7 0x1.22p6 0x0.0p0 F +REG epsg:3338 4 OK 0x1.cbba8109d855bp19 0x1.49526b059ff18p21 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.22p6 0x0.0p0 F +REG epsg:3339 0 OK 0x1.e86a7af858e66p18 0x1.312e51c42af9cp23 -0x1.23209e2cp0 0x1.8000000000001p3 0x1.3432921a4709fp-48 0x1.0p-30 T +REG epsg:3339 1 OK -0x1.adb0d565dd04p15 0x1.203ece94995c9p23 -0x1.a083e69c8p4 0x1.c0000001e0147p2 -0x1.3fffffffea57dp2 -0x1.8p-29 F +REG epsg:3339 2 OK 0x1.01a2c446cf60ap20 0x1.203ece948b12cp23 -0x1.0a4a29c2p1 0x1.0fffffff87a02p4 -0x1.3fffffffea44dp2 0x1.0p-28 F +REG epsg:3339 3 OK -0x1.adabaef02959p15 0x1.421dd4edf35fdp23 0x1.b4b4affcp1 0x1.c0000001e0049p2 0x1.3fffffffea543p2 -0x1.0p-27 F +REG epsg:3339 4 OK 0x1.01a29b0dea64ep20 0x1.421dd4ee01aep23 0x1.b5d0c2aa8p4 0x1.0fffffff87a42p4 0x1.3fffffffea416p2 0x1.0p-29 F +REG epsg:3340 0 OK 0x1.e8697dad205bcp18 0x1.312e51c41a64p23 0x1.cdf1f7a6p1 0x1.cp3 -0x1.2982b98f3e449p-47 0x1.0p-29 T +REG epsg:3340 1 OK -0x1.adb7ecd9819dp15 0x1.203ecf69f10efp23 -0x1.4fa7a59p4 0x1.20000000f00cap3 -0x1.3fffffffea572p2 -0x1.cp-28 F +REG epsg:3340 2 OK 0x1.01a27e5beac6bp20 0x1.203ecf69e32dcp23 0x1.249e2ac6p1 0x1.2fffffff87a19p4 -0x1.3fffffffea449p2 0x1.8p-28 F +REG epsg:3340 3 OK -0x1.adb2c6622a1fp15 0x1.421dd4187ac51p23 0x1.0ee57cd7p3 0x1.20000000f004bp3 0x1.3fffffffea53bp2 -0x1.0p-28 F +REG epsg:3340 4 OK 0x1.01a255231efe8p20 0x1.421dd41888aa8p23 0x1.fbadb7f4p4 0x1.2fffffff87a5bp4 0x1.3fffffffea41bp2 0x1.4p-28 F +REG epsg:3341 0 OK 0x1.e86875eff36c6p18 0x1.312e51c40a4c8p23 0x1.06d9c938p3 0x1.0p4 0x1.2b32338efca82p-48 -0x1.0p-30 T +REG epsg:3341 1 OK -0x1.adbf5e221fe5p15 0x1.203ed038f1e1bp23 -0x1.00ce98e4cp4 0x1.60000000f00f2p3 -0x1.3fffffffea572p2 -0x1.4p-28 F +REG epsg:3341 2 OK 0x1.01a23606aa1bfp20 0x1.203ed038e46d8p23 0x1.9fe61047p2 0x1.4fffffff87a3p4 -0x1.3fffffffea44ep2 0x1.0p-30 F +REG epsg:3341 3 OK -0x1.adba37a9058fp15 0x1.421dd3495a044p23 0x1.ac976625p3 0x1.60000000f0072p3 0x1.3fffffffea541p2 -0x1.0p-27 F +REG epsg:3341 4 OK 0x1.01a20ccdf8238p20 0x1.421dd349677c9p23 0x1.1f89b112ep5 0x1.4fffffff87a71p4 0x1.3fffffffea429p2 -0x1.0p-30 F +REG epsg:3342 0 OK 0x1.e868f8960fc12p18 0x1.b99a3e10f04aep22 -0x1.c8887b94p3 0x1.dfffffffffffep3 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:3342 1 OK -0x1.f9d7ecda4532p14 0x1.9703d441fd44p22 -0x1.2a5a45f88p4 0x1.2f75a3f3d469p3 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3342 2 OK 0x1.f837b82135336p19 0x1.9703d4418567bp22 0x1.a93b12a8p1 0x1.48452e0615cb8p4 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:3342 3 OK -0x1.2f55f8559a9ep16 0x1.dacd32c4e231cp22 -0x1.ea1ed425p4 0x1.2f75a3f3d468dp3 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:3342 4 OK 0x1.0729dbebf6854p20 0x1.dacd32c470346p22 -0x1.b2d72566p2 0x1.48452e0615cb9p4 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:3343 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3343 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:3343 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:3343 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:3343 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:3344 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3344 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:3344 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG epsg:3344 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:3344 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG epsg:3345 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:3345 1 OK -0x1.ad750e9eb001p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG epsg:3345 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.4p2 0x0.0p0 F +REG epsg:3345 3 OK -0x1.ad750e9eb001p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG epsg:3345 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 0x1.4p2 0x0.0p0 F +REG epsg:3346 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3346 1 OK -0x1.ae5322368f2fp15 -0x1.0ef13b755de07p19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:3346 2 OK 0x1.01969911b4798p20 -0x1.0ef13b755de07p19 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:3346 3 OK -0x1.ae5322368f2fp15 0x1.0ef13b755de07p19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:3346 4 OK 0x1.01969911b4798p20 0x1.0ef13b755de07p19 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:3347 0 OK 0x1.7a6bp22 0x1.690e840c54be6p21 0x0.0p0 -0x1.6f77777777777p6 0x1.f7fffffffffafp5 0x0.0p0 F +REG epsg:3347 1 OK 0x1.d40f075c358cdp21 0x1.db24f788e473ep20 0x0.0p0 -0x1.f3a0c615d61b6p6 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3347 2 OK 0x1.05673e28f29cdp23 0x1.db24f788e4741p20 0x0.0p0 -0x1.d69c51b231a7p5 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3347 3 OK 0x1.4d65e100828f2p22 0x1.248ec7dfde858p22 0x0.0p0 -0x1.f3a0c615d61b4p6 0x1.38p6 0x0.0p0 F +REG epsg:3347 4 OK 0x1.a7701eff7d70fp22 0x1.248ec7dfde858p22 0x0.0p0 -0x1.d69c51b231a6cp5 0x1.38p6 0x0.0p0 F +REG epsg:3348 0 OK 0x1.7a6bp22 0x1.690e840c54be6p21 0x0.0p0 -0x1.6f77777777777p6 0x1.f7fffffffffafp5 0x0.0p0 F +REG epsg:3348 1 OK 0x1.d40f075c358cdp21 0x1.db24f788e473ep20 0x0.0p0 -0x1.f3a0c615d61b6p6 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3348 2 OK 0x1.05673e28f29cdp23 0x1.db24f788e4741p20 0x0.0p0 -0x1.d69c51b231a7p5 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3348 3 OK 0x1.4d65e100828f2p22 0x1.248ec7dfde858p22 0x0.0p0 -0x1.f3a0c615d61b4p6 0x1.38p6 0x0.0p0 F +REG epsg:3348 4 OK 0x1.a7701eff7d70fp22 0x1.248ec7dfde858p22 0x0.0p0 -0x1.d69c51b231a6cp5 0x1.38p6 0x0.0p0 F +REG epsg:3349 0 OK 0x0.0p0 0x1.854a64p-31 0x0.0p0 -0x1.2cp7 0x0.0p0 0x0.0p0 T +REG epsg:3349 1 OK -0x1.0fc6ae86e4799p19 -0x1.0e4dfb191d5f6p19 0x0.0p0 -0x1.36p7 -0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3349 2 OK 0x1.0fc6ae86e4799p19 -0x1.0e4dfb191d5f6p19 0x0.0p0 -0x1.22p7 -0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3349 3 OK -0x1.0fc6ae86e4799p19 0x1.0e4dfb191d5ffp19 0x0.0p0 -0x1.36p7 0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3349 4 OK 0x1.0fc6ae86e4799p19 0x1.0e4dfb191d5ffp19 0x0.0p0 -0x1.22p7 0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3350 0 OK 0x1.e8814fbae1037p17 0x1.6b814f084e4fp6 -0x1.31e2409f5p6 0x1.5f3333332f3a5p4 0x1.9999998f7f711p-4 0x1.e8d3p-14 T +REG epsg:3350 1 OK -0x1.2a0495439dbf8p18 -0x1.0eef3bce26f11p19 -0x1.7fb8f665dp6 0x1.0f332b37665fcp4 -0x1.399999998e9cep2 0x1.f32ap-14 F +REG epsg:3350 2 OK 0x1.8942dbe8ca8a6p19 -0x1.0eef462afe4d7p19 -0x1.1e7bdc1cp6 0x1.af333b2efc2d6p4 -0x1.39999999a01p2 0x1.eeeep-14 F +REG epsg:3350 3 OK -0x1.29d9c600643dcp18 0x1.0f10b89c6f713p19 -0x1.474bda024p6 0x1.0f332b3760f48p4 0x1.466666661c5d6p2 0x1.e0b3p-14 F +REG epsg:3350 4 OK 0x1.892da1efb4f19p19 0x1.0f10958527652p19 -0x1.cc2e7dd7cp5 0x1.af333b2ef9113p4 0x1.466666660bc52p2 0x1.d262p-14 F +REG epsg:3351 0 OK 0x1.31340d449cfedp20 0x1.6a8d49aa9c85fp6 -0x1.14bff807p6 0x1.8f3333332ed2dp4 0x1.9999998e36dc4p-4 0x1.e5d8p-14 T +REG epsg:3351 1 OK 0x1.53458ec2e2e9fp19 -0x1.0eef2d84eb2e1p19 -0x1.622e83ea8p6 0x1.3f332b3765dd3p4 -0x1.3999999993f81p2 0x1.f242p-14 F +REG epsg:3351 2 OK 0x1.b8c54668b63fp20 -0x1.0eef3ac56d5d1p19 -0x1.0230808a4p6 0x1.df333b2efbccap4 -0x1.39999999a515dp2 0x1.ecfdp-14 F +REG epsg:3351 3 OK 0x1.535af94819af2p19 0x1.0f109df58f08cp19 -0x1.29c3f1b65p6 0x1.3f332b3760854p4 0x1.4666666617439p2 0x1.dcb6p-14 F +REG epsg:3351 4 OK 0x1.b8baaae1621c3p20 0x1.0f1077fb0f1d8p19 -0x1.939ce003cp5 0x1.df333b2ef8cdfp4 0x1.46666666071a7p2 0x1.cd9p-14 F +REG epsg:3352 0 OK 0x1.12abf54140709p21 0x1.697de9aeec2fdp6 -0x1.f0102826ap5 0x1.bf3333332e775p4 0x1.9999998cf636p-4 0x1.e2ap-14 T +REG epsg:3352 1 OK 0x1.9dc6ade3e5692p20 -0x1.0eef206a2c06ap19 -0x1.44ebf9dbep6 0x1.6f332b3765635p4 -0x1.39999999993e4p2 0x1.f10bp-14 F +REG epsg:3352 2 OK 0x1.56748c7b87301p21 -0x1.0eef307c89a55p19 -0x1.cce0d0478p5 0x1.07999d977dbc7p5 -0x1.39999999a9f99p2 0x1.eacap-14 F +REG epsg:3352 3 OK 0x1.9dd1648f60294p20 0x1.0f1082b5b6d1ap19 -0x1.0c83f4abfp6 0x1.6f332b3760221p4 0x1.4666666612472p2 0x1.d86fp-14 F +REG epsg:3352 4 OK 0x1.566f3f6dfe9b5p21 0x1.0f1059e9ca4dcp19 -0x1.5c21c23f4p5 0x1.07999d977c4d1p5 0x1.4666666602971p2 0x1.c891p-14 F +REG epsg:3353 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:3353 1 OK -0x1.fc406e18ccf6p14 0x1.9700891db3eb6p22 0x0.0p0 0x1.bdd68fcf51a38p1 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:3353 2 OK 0x1.f82a0370c667cp19 0x1.9700891db3eb6p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:3353 3 OK -0x1.2fefde056e328p16 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.bdd68fcf51a32p1 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:3353 4 OK 0x1.0722fde056e32p20 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:3354 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:3354 1 OK -0x1.fc406e18ccf6p14 0x1.9700891db3eb6p22 0x0.0p0 0x1.bdd68fcf51a38p1 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:3354 2 OK 0x1.f82a0370c667cp19 0x1.9700891db3eb6p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:3354 3 OK -0x1.2fefde056e328p16 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.bdd68fcf51a32p1 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:3354 4 OK 0x1.0722fde056e32p20 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:3355 0 OK 0x1.2c3584e813d8cp19 0x1.8b7d0baf935d4p19 -0x1.dbe2ba0ep2 0x1.efffffffffffep4 0x1.dfffffffffffap4 -0x1.0p-30 F +REG epsg:3355 1 OK 0x1.e9e5158d9e62p14 0x1.0610240ad9182p18 0x1.64d1c9b98p3 0x1.939fbba3ca7d3p4 0x1.8fffffffc83fp4 -0x1.8p-28 F +REG epsg:3355 2 OK 0x1.248df071f830fp20 0x1.061023ffaaa82p18 -0x1.42f18e1f8p4 0x1.2630222e1a97fp5 0x1.8fffffffc871fp4 0x1.4p-28 F +REG epsg:3355 3 OK 0x1.55abb749664e8p16 0x1.50d7f16ec6565p20 0x1.6220d2ap1 0x1.939fbba3cd3dp4 0x1.17ffffffc24bcp5 -0x1.4p-28 F +REG epsg:3355 4 OK 0x1.16dac95d0051fp20 0x1.50d7f16c40a0ep20 -0x1.98dff39cp4 0x1.2630222e1943ep5 0x1.17ffffffc287bp5 0x1.0p-28 F +REG epsg:3356 0 OK 0x1.e84852dd784ffp18 -0x1.59f0735249e5ep7 -0x1.505c47988p4 -0x1.4400000572dp6 0x1.46f09a2c71cf1p-24 0x1.821e64p-7 T +REG epsg:3356 1 OK -0x1.ad539ff56ad9p15 -0x1.0efd7be4fac35p19 -0x1.2c2dfa0fap5 -0x1.580000060edfdp6 -0x1.3fffffb98967ap2 0x1.8bfc76p-7 F +REG epsg:3356 2 OK 0x1.0191e87924578p20 -0x1.0ef6e4ac3bbf5p19 -0x1.38a4d54bp2 -0x1.300000054968p6 -0x1.3fffffb262f23p2 0x1.20193ep-7 F +REG epsg:3356 3 OK -0x1.adb70e3a538dp15 0x1.0ecc01b3e658ep19 -0x1.07d077558p5 -0x1.580000055e286p6 0x1.400000501d3bfp2 0x1.e54838p-7 F +REG epsg:3356 4 OK 0x1.018ec03b78281p20 0x1.0ed1e2a305d56p19 -0x1.1f192c3p-2 -0x1.30000004c00b6p6 0x1.4000005c8e9f2p2 0x1.85038ep-7 F +REG epsg:3357 0 OK 0x1.e830ffbbb11c6p18 -0x1.96ee9e9c8553dp7 0x1.ed11b2c88p4 -0x1.43ffffffd92cep6 -0x1.33e6a96508b2cp-27 0x1.6e86ap-10 T +REG epsg:3357 1 OK -0x1.ae4b7c9112d6p15 -0x1.0efd79a2cba82p19 0x1.86526ca1cp5 -0x1.57ffffffe5f1ap6 -0x1.4000000944b0cp2 0x1.9171ap-10 F +REG epsg:3357 2 OK 0x1.018a1b1b93999p20 -0x1.0efecc7c8b823p19 0x1.85ac177c4p5 -0x1.2fffffffd67fap6 -0x1.40000008a383bp2 0x1.a5895p-10 F +REG epsg:3357 3 OK -0x1.ae38e7b8cce4p15 0x1.0ecc1bb3ff99dp19 0x1.15667ec6cp4 -0x1.57ffffffdf594p6 0x1.3ffffff5d5417p2 0x1.353cep-10 F +REG epsg:3357 4 OK 0x1.018b07cd2a443p20 0x1.0eca6f896d6f8p19 0x1.13dfeb414p4 -0x1.2fffffffcb453p6 0x1.3ffffff650b7cp2 0x1.4e9b4p-10 F +REG epsg:3358 0 OK 0x1.29a8270a3d70ap19 0x1.05cc553074f97p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:3358 1 OK 0x1.449988c24f902p18 -0x1.fbb202943916cp16 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3358 2 OK 0x1.b10389b353188p19 -0x1.fbb202943916cp16 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3358 3 OK 0x1.54278a411c66cp18 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3358 4 OK 0x1.a93c88f3ecad4p19 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3359 0 OK 0x1.e848400008638p20 0x1.ad757da2ceab4p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:3359 1 OK 0x1.0a3d6d1b0a7cbp20 -0x1.a06ab2d4485b9p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3359 2 OK 0x1.632989728324ap21 -0x1.a06ab2d4485b9p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3359 3 OK 0x1.16ff81d15269ep20 0x1.4547d48a3e3b9p20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3359 4 OK 0x1.5cc87f175f2e1p21 0x1.4547d48a3e3b9p20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3360 0 OK 0x1.29a8p19 0x1.44e4cd737cdd2p17 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:3360 1 OK 0x1.01b075d8c695p18 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3360 2 OK 0x1.d277c5139cb58p19 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3360 3 OK 0x1.184511ebb6ddcp18 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3360 4 OK 0x1.c72d770a24912p19 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3361 0 OK 0x1.e847fffffffffp20 0x1.0a7b29855bfffp19 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:3361 1 OK 0x1.a6b7fa6e5a964p19 -0x1.0104117a0f575p19 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3361 2 OK 0x1.7e9a0164695a6p21 -0x1.0104117a0f575p19 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3361 3 OK 0x1.cbc29b0bbdc86p19 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3361 4 OK 0x1.7557593d108dep21 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3362 0 OK 0x1.24f8p19 0x1.82cecd83b5059p16 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:3362 1 OK 0x1.8289a2cb236a6p18 -0x1.77fcaead221dp16 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3362 2 OK 0x1.88ab2e9a6e4adp19 -0x1.77fcaead221dp16 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3362 3 OK 0x1.8d19b32c1129cp18 0x1.24b9880b7720fp18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3362 4 OK 0x1.83632669f76b2p19 0x1.24b9880b7720fp18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3363 0 OK 0x1.e097400000006p20 0x1.3d4353fa5fbadp18 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:3363 1 OK 0x1.3d0a98c7262b4p20 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3363 2 OK 0x1.4211f39c6ceacp21 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3363 3 OK 0x1.45b47e1aeae0ep20 0x1.e030c687b6f13p19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3363 4 OK 0x1.3dbd00f28a8ffp21 0x1.e030c687b6f13p19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3364 0 OK 0x1.24f8p19 0x1.623635ef1cb8ap16 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:3364 1 OK 0x1.93ddc76008933p18 -0x1.59729314e624fp16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3364 2 OK 0x1.80011c4ffbb66p19 -0x1.59729314e624fp16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3364 3 OK 0x1.9c6fffae6b3c8p18 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3364 4 OK 0x1.7bb80028ca61cp19 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3365 0 OK 0x1.e097400000006p20 0x1.228706283a7ddp18 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:3365 1 OK 0x1.4b41287d38872p20 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3365 2 OK 0x1.3af6abc163bcdp21 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3365 3 OK 0x1.5248e02a502bbp20 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3365 4 OK 0x1.3772cfead7ea8p21 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3366 0 OK 0x1.3a6727cfa3d61p15 0x1.29f7bbeb639e3p14 0x0.0p0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 0x0.0p0 F +REG epsg:3366 1 OK -0x1.04dde2171ff29p19 -0x1.00fe656c980bp19 0x0.0p0 0x1.b31879960ffaep6 0x1.14fe7ef444ab2p4 0x0.0p0 F +REG epsg:3366 2 OK 0x1.2c2ac711146d5p19 -0x1.00fe656c980bp19 0x0.0p0 0x1.de5534f2ed106p6 0x1.14fe7ef444ab2p4 0x0.0p0 F +REG epsg:3366 3 OK -0x1.e2f73e4522746p18 0x1.1d678f1e63804p19 0x0.0p0 0x1.b318785eb3dc6p6 0x1.b4fe7f7a82ffp4 0x0.0p0 F +REG epsg:3366 4 OK 0x1.18c8841c85b4fp19 0x1.1d678f1e63804p19 0x0.0p0 0x1.de55362a492edp6 0x1.b4fe7f7a82ffp4 0x0.0p0 F +REG epsg:3367 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3367 1 OK -0x1.ad892fd8998fp15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3367 2 OK 0x1.0190497ec4cb8p20 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3367 3 OK -0x1.ad892fd8998fp15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3367 4 OK 0x1.0190497ec4cb8p20 0x1.0edd047bd8483p19 0x0.0p0 -0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3368 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3368 1 OK -0x1.ad892fd8998p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3368 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffep1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3368 3 OK -0x1.ad892fd8998p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3368 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffep1 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3369 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:3369 1 OK -0x1.ad892fd89987p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.0p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3369 2 OK 0x1.0190497ec4cbbp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3369 3 OK -0x1.ad892fd89987p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.0p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3369 4 OK 0x1.0190497ec4cbbp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.ffffffffffffbp0 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3370 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 0x1.56p7 0x1.68p5 0x0.0p0 F +REG epsg:3370 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 0x1.47db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:3370 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 0x1.642463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:3370 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 0x1.47db9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:3370 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 0x1.642463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:3371 0 OK 0x1.e848000000022p18 0x1.301f34d63e508p22 0x0.0p0 0x1.62p7 0x1.68p5 0x0.0p0 F +REG epsg:3371 1 OK -0x1.95bacc669d1d8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 0x1.53db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:3371 2 OK 0x1.0d7facc669d3ap20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.5fdb9cfff07a9p7 0x1.4p5 0x0.0p0 F +REG epsg:3371 3 OK -0x1.99a5174d6b98p12 0x1.5380b21056044p22 0x0.0p0 0x1.53db9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG epsg:3371 4 OK 0x1.eb7b4a2e9ada2p19 0x1.5380b21056045p22 0x0.0p0 -0x1.5fdb9cfff07a9p7 0x1.9p5 0x0.0p0 F +REG epsg:3372 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 0x1.56p7 0x1.68p5 0x0.0p0 F +REG epsg:3372 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 0x1.47db9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:3372 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 0x1.642463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:3372 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 0x1.47db9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:3372 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 0x1.642463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG epsg:3373 0 OK 0x1.e848000000022p18 0x1.30229999b59c6p22 0x0.0p0 0x1.62p7 0x1.68p5 0x0.0p0 F +REG epsg:3373 1 OK -0x1.95aae58cba618p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 0x1.53db9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG epsg:3373 2 OK 0x1.0d7eae58cba7ep20 0x1.0fb6fd44cdb3bp22 0x0.0p0 -0x1.5fdb9cfff07a9p7 0x1.4000000000001p5 0x0.0p0 F +REG epsg:3373 3 OK -0x1.989b4f65ea08p12 0x1.53841a99fc571p22 0x0.0p0 0x1.53db9cfff07aap7 0x1.9p5 0x0.0p0 F +REG epsg:3373 4 OK 0x1.eb79369ecbd71p19 0x1.53841a99fc572p22 0x0.0p0 -0x1.5fdb9cfff07a9p7 0x1.9000000000001p5 0x0.0p0 F +REG epsg:3374 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3374 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:3374 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p2 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:3374 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG epsg:3374 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p2 0x1.4000000000001p2 0x0.0p0 F +REG epsg:3375 0 OK 0x1.cdbf9b44c1f35p18 0x1.b0158650d2b8dp18 0x0.0p0 0x1.99p6 0x1.ffffffffffd07p1 0x0.0p0 F +REG epsg:3375 1 OK -0x1.5742db7ff39d8p16 -0x1.ad45e313e1ae7p16 0x0.0p0 0x1.84f37f5af8063p6 -0x1.ffffffffe27cfp-1 0x0.0p0 T +REG epsg:3375 2 OK 0x1.f6ff57f8ade66p19 -0x1.affe636c2229fp16 0x0.0p0 0x1.ad0c80a507f9fp6 -0x1.ffffffffe275cp-1 0x0.0p0 T +REG epsg:3375 3 OK -0x1.2f9c0f08b585p16 0x1.e7c06044148c4p19 0x0.0p0 0x1.84f37f5af8063p6 0x1.1fffffffffe6fp3 0x0.0p0 F +REG epsg:3375 4 OK 0x1.f5571a390bc5dp19 0x1.e76f8f24d27cbp19 0x0.0p0 0x1.ad0c80a507f9fp6 0x1.1fffffffffe6fp3 0x0.0p0 F +REG epsg:3376 0 OK 0x1.205724b81a965p19 0x1.b082b7125218cp18 0x0.0p0 0x1.ccp6 0x1.ffffffffffd07p1 0x0.0p0 F +REG epsg:3376 1 OK 0x1.068c0a71caf7cp15 -0x1.afd00590d0b7fp16 0x0.0p0 0x1.b7f37f5af8062p6 -0x1.ffffffffe27cfp-1 0x0.0p0 T +REG epsg:3376 2 OK 0x1.195905b4dfa26p20 -0x1.a6d9033cb77ecp16 0x0.0p0 0x1.e00c80a507f9dp6 -0x1.ffffffffe275cp-1 0x0.0p0 T +REG epsg:3376 3 OK 0x1.14b88f59478ap15 0x1.e71229f3fade9p19 0x0.0p0 0x1.b7f37f5af8062p6 0x1.1fffffffffe6fp3 0x0.0p0 F +REG epsg:3376 4 OK 0x1.167ccdb15398dp20 0x1.e82860b60e0d4p19 0x0.0p0 0x1.e00c80a507f9dp6 0x1.1fffffffffe6fp3 0x0.0p0 F +REG epsg:3377 0 OK -0x1.ced47ef9db22dp13 0x1.11b28f5c28f5cp13 0x0.0p0 0x1.9db634eaab7b6p6 0x1.0f9333ad7cbd7p1 0x0.0p0 F +REG epsg:3377 1 OK -0x1.16da4324b4e95p19 -0x1.0a478c81b7817p19 0x0.0p0 0x1.89b2b1b834ac4p6 -0x1.706ccb6cab7bbp1 0x0.0p0 F +REG epsg:3377 2 OK 0x1.08639f2ce6103p19 -0x1.0a478c81b7817p19 0x0.0p0 0x1.b1b9b81d224a8p6 -0x1.706ccb6cab7bbp1 0x0.0p0 F +REG epsg:3377 3 OK -0x1.151acf5d2d5c7p19 0x1.13b7d272f9c77p19 0x0.0p0 0x1.89b2b19758017p6 0x1.c7c998d2203fep2 0x0.0p0 F +REG epsg:3377 4 OK 0x1.06a42b655e835p19 0x1.13b7d272f9c77p19 0x0.0p0 0x1.b1b9b83dfef55p6 0x1.c7c998d2203fep2 0x0.0p0 F +REG epsg:3378 0 OK 0x1.cb391eb851eb8p11 -0x1.09092b020c49cp12 0x0.0p0 0x1.97e64d81daa7fp6 0x1.57572ad6ccd11p1 0x0.0p0 F +REG epsg:3378 1 OK -0x1.0e0f0888e0858p19 -0x1.1082c4f9f28d3p19 0x0.0p0 0x1.83e0afd011308p6 -0x1.28a8d46e95cfep1 0x0.0p0 F +REG epsg:3378 2 OK 0x1.11a57ac651296p19 -0x1.1082c4f9f28d3p19 0x0.0p0 0x1.abebeb33a41f7p6 -0x1.28a8d46e95cfep1 0x0.0p0 F +REG epsg:3378 3 OK -0x1.0bd92e129edc7p19 0x1.0d7d4c909bd77p19 0x0.0p0 0x1.83e0afa689198p6 0x1.ebab94567425ap2 0x0.0p0 F +REG epsg:3378 4 OK 0x1.0f6fa0500f805p19 0x1.0d7d4c909bd77p19 0x0.0p0 0x1.abebeb5d2c366p6 0x1.ebab94567425ap2 0x0.0p0 F +REG epsg:3379 0 OK -0x1.cc83a5e353f7dp12 0x1.955dba5e353f8p12 0x0.0p0 0x1.9979235e62443p6 0x1.e27b4f13dad81p1 0x0.0p0 F +REG epsg:3379 1 OK -0x1.13e6879c83d22p19 -0x1.0b0ca58a0f817p19 0x0.0p0 0x1.856e09c8197d9p6 -0x1.3b09610f4c804p0 0x0.0p0 T +REG epsg:3379 2 OK 0x1.0cb47904f6824p19 -0x1.0b0ca58a0f817p19 0x0.0p0 0x1.ad843cf4ab0adp6 -0x1.3b09610f4c804p0 0x0.0p0 T +REG epsg:3379 3 OK -0x1.10cac739ea15p19 0x1.12f53bb2dab6p19 0x0.0p0 0x1.856e098dca438p6 0x1.189ed32bd5084p3 0x0.0p0 F +REG epsg:3379 4 OK 0x1.0998b8a25cc52p19 0x1.12f53bb2dab6p19 0x0.0p0 0x1.ad843d2efa44fp6 0x1.189ed32bd5084p3 0x0.0p0 F +REG epsg:3380 0 OK -0x1.1028526e978d5p15 0x1.b9201916872bp15 0x0.0p0 0x1.958e724e13121p6 0x1.d7a2947f7e656p1 0x0.0p0 F +REG epsg:3380 1 OK -0x1.21470648e322ep19 -0x1.e553ab55278c2p18 0x0.0p0 0x1.8183d742f559p6 -0x1.50bad62a65b18p0 0x0.0p0 T +REG epsg:3380 2 OK 0x1.fe83f7f620627p18 -0x1.e553ab55278c2p18 0x0.0p0 0x1.a9990d5930cb3p6 -0x1.50bad62a65b18p0 0x0.0p0 T +REG epsg:3380 3 OK -0x1.1e3d36a78f4c7p19 0x1.2b57e1e2f645fp19 0x0.0p0 0x1.8183d709f47e4p6 0x1.15e8a487d39ap3 0x0.0p0 F +REG epsg:3380 4 OK 0x1.f87058b378b59p18 0x1.2b57e1e2f645fp19 0x0.0p0 0x1.a9990d9231a5fp6 0x1.15e8a487d39ap3 0x0.0p0 F +REG epsg:3381 0 OK 0x1.3228fae147ae1p14 0x1.a57ca3d70a3d7p11 0x0.0p0 0x1.9c47f6555c52ep6 0x1.3e7b74eb64679p2 0x0.0p0 F +REG epsg:3381 1 OK -0x1.073ca2dc9e921p19 -0x1.0c5270927236cp19 0x0.0p0 0x1.8834972050237p6 -0x1.848b13a08beacp-6 0x0.0p0 T +REG epsg:3381 2 OK 0x1.1a5f328ab30cfp19 -0x1.0c5270927236cp19 0x0.0p0 0x1.b05b558a68825p6 -0x1.848b13a08beacp-6 0x0.0p0 T +REG epsg:3381 3 OK -0x1.0320f0667311fp19 0x1.11b226f889d74p19 0x0.0p0 0x1.883496d370ebep6 0x1.3f3db9ce3ef8bp3 0x0.0p0 F +REG epsg:3381 4 OK 0x1.16438014878cdp19 0x1.11b226f889d74p19 0x0.0p0 0x1.b05b55d747b9ep6 0x1.3f3db9ce3ef8bp3 0x0.0p0 F +REG epsg:3382 0 OK -0x1.769fbe76c8b44p4 0x1.f24395810624ep5 0x0.0p0 0x1.9160a45ad5983p6 0x1.5afa24b609838p2 0x0.0p0 F +REG epsg:3382 1 OK -0x1.11005cc3ad627p19 -0x1.0dd8c55d8735dp19 0x0.0p0 0x1.7d49a29191e08p6 0x1.afa24a489dcfdp-2 0x0.0p0 T +REG epsg:3382 2 OK 0x1.10fa8244b3875p19 -0x1.0dd8c55d8735dp19 0x0.0p0 0x1.a577a624194fep6 0x1.afa24a489dcfdp-2 0x0.0p0 T +REG epsg:3382 3 OK -0x1.0c8603a94e5a7p19 0x1.102d0157ec5c3p19 0x0.0p0 0x1.7d49a23ddf427p6 0x1.4d7d11aed7cbbp3 0x0.0p0 F +REG epsg:3382 4 OK 0x1.0c80292a547f5p19 0x1.102d0157ec5c3p19 0x0.0p0 0x1.a577a677cbeep6 0x1.4d7d11aed7cbbp3 0x0.0p0 F +REG epsg:3383 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.928ba4de595d9p6 0x1.7dbd329f5fc41p2 0x0.0p0 F +REG epsg:3383 1 OK -0x1.11378654e9d15p19 -0x1.0dc411014e9c8p19 0x0.0p0 0x1.7e6fc634d2891p6 0x1.ede993b946a1bp-1 0x0.0p0 T +REG epsg:3383 2 OK 0x1.11378654e9d15p19 -0x1.0dc411014e9c8p19 0x0.0p0 0x1.a6a78387e032p6 0x1.ede993b946a1bp-1 0x0.0p0 T +REG epsg:3383 3 OK -0x1.0c49836a90a39p19 0x1.10434969ee51ep19 0x0.0p0 0x1.7e6fc5d8d10fep6 0x1.5ede989e2ca4fp3 0x0.0p0 F +REG epsg:3383 4 OK 0x1.0c49836a90a39p19 0x1.10434969ee51ep19 0x0.0p0 0x1.a6a783e3e1ab4p6 0x1.5ede989e2ca4fp3 0x0.0p0 F +REG epsg:3384 0 OK -0x1.c4dd2f1a9fbe7p0 0x1.04a763b645a1dp17 0x0.0p0 0x1.9342fafe20a33p6 0x1.36fae378696e7p2 0x0.0p0 F +REG epsg:3384 1 OK -0x1.10c1a40f43337p19 -0x1.99a878699d04p18 0x0.0p0 0x1.7f30835e03604p6 -0x1.20a3903886f4bp-3 0x0.0p0 T +REG epsg:3384 2 OK 0x1.10c132d7f76d9p19 -0x1.99a878699d04p18 0x0.0p0 0x1.a755729e3de62p6 -0x1.20a3903886f4bp-3 0x0.0p0 T +REG epsg:3384 3 OK -0x1.0cbed76790db4p19 0x1.51300fb517a85p19 0x0.0p0 0x1.7f308312f0c51p6 0x1.3b7d71160d18dp3 0x0.0p0 F +REG epsg:3384 4 OK 0x1.0cbe663045156p19 0x1.51300fb517a85p19 0x0.0p0 0x1.a75572e950815p6 0x1.3b7d71160d18dp3 0x0.0p0 F +REG epsg:3385 0 OK 0x1.9d5eced916873p13 0x1.111f26e978d5p13 0x0.0p0 0x1.992e53d50ab87p6 0x1.7e3e27c19e53dp2 0x0.0p0 F +REG epsg:3385 1 OK -0x1.0ac2e2da900ecp19 -0x1.097f2abe088bp19 0x0.0p0 0x1.8512623dfc20ap6 0x1.f1f13cc8967c6p-1 0x0.0p0 T +REG epsg:3385 2 OK 0x1.17add95158c3dp19 -0x1.097f2abe088bp19 0x0.0p0 0x1.ad4a456c19504p6 0x1.f1f13cc8967c6p-1 0x0.0p0 T +REG epsg:3385 3 OK -0x1.05d3326ddc1fep19 0x1.148835cc6d4f9p19 0x0.0p0 0x1.851261e1dbe03p6 0x1.5f1f132f3907fp3 0x0.0p0 F +REG epsg:3385 4 OK 0x1.12be28e4a4d4ep19 0x1.148835cc6d4f9p19 0x0.0p0 0x1.ad4a45c83990bp6 0x1.5f1f132f3907ep3 0x0.0p0 F +REG epsg:3386 0 OK 0x1.e85ed0d739f07p18 0x1.5817e65806448p6 -0x1.1f6a9b3b88p7 0x1.20000001f3aeep4 0x1.2b8a8701a4a7ap-27 0x1.fb8b8p-12 T +REG epsg:3386 1 OK -0x1.aead128b8beep15 -0x1.0ef437befdde4p19 -0x1.3d76459508p7 0x1.a00000038b0d8p3 -0x1.3ffffff92261ep2 0x1.ce568p-13 F +REG epsg:3386 2 OK 0x1.01a33dab2b318p20 -0x1.0ef76f67217bap19 -0x1.2c8425baa8p7 0x1.700000022befep4 -0x1.3ffffff94b67fp2 0x1.099fap-11 F +REG epsg:3386 3 OK -0x1.ae76f23198c7p15 0x1.0f0cdbdf3d289p19 -0x1.1311af0f98p7 0x1.a00000036a0b6p3 0x1.4000000be6042p2 0x1.259e8p-11 F +REG epsg:3386 4 OK 0x1.01a4b3612363ep20 0x1.0f09cdc0f711ap19 -0x1.022ea1c4dp7 0x1.70000002096c6p4 0x1.4000000b438dfp2 0x1.b41e6p-11 F +REG epsg:3387 0 OK 0x1.4fb26d74d64b8p22 0x1.8ec02e795ad84p5 -0x1.0e2a1d55a8p7 0x1.08000001c57edp5 0x1.0e2a6acca30f3p-27 0x1.1ef1p-10 T +REG epsg:3387 1 OK 0x1.2dcf2e342ae0bp22 -0x1.0ef8cc9ed62f9p19 -0x1.26c23d124p7 0x1.c0000003a5789p4 -0x1.3ffffff96c625p2 0x1.7778p-11 F +REG epsg:3387 2 OK 0x1.719551c26f1e2p22 -0x1.0efbb58810417p19 -0x1.20e4bb5518p7 0x1.30000001c40d6p5 -0x1.3ffffff9caf5ap2 0x1.4446ep-10 F +REG epsg:3387 3 OK 0x1.2dcf908d455ebp22 0x1.0f081683e08f7p19 -0x1.f8e7ea3a9p6 0x1.c00000037a4bp4 0x1.4000000ac9e7cp2 0x1.0e1ddp-10 F +REG epsg:3387 4 OK 0x1.7195a54fe99b4p22 0x1.0f055723c6cd6p19 -0x1.ed4814f1fp6 0x1.30000001a656bp5 0x1.400000098f03cp2 0x1.8f11ep-10 F +REG epsg:3388 0 OK 0x1.fa61bf12dd2dap6 0x1.3942e2a458acap22 0x1.01cf78de4p4 0x1.97fffffff5c1p5 0x1.4ffffffff10aap5 0x1.23a2p-15 F +REG epsg:3388 1 OK -0x1.6da797e742813p19 0x1.0d60d8cff5c0fp22 0x1.65112918p2 0x1.622cb8898295fp5 0x1.27ffffffefb2dp5 0x1.943cp-15 F +REG epsg:3388 2 OK 0x1.6dc431b22b9d9p19 0x1.0d60832343488p22 0x1.9b02bf2a4p4 0x1.cdd347766b992p5 0x1.27ffffffefc62p5 0x1.4adp-15 F +REG epsg:3388 3 OK -0x1.6da427f17e238p19 0x1.68c60c533626fp22 0x1.85a0f6a9p2 0x1.622cb8897f932p5 0x1.77fffffff268ap5 0x1.05dap-15 F +REG epsg:3388 4 OK 0x1.6dc71a7f4632cp19 0x1.68c594f64ef74p22 0x1.7424aa494p4 0x1.cdd34776695a4p5 0x1.77fffffff32fp5 0x1.8114p-16 F +REG epsg:3389 0 OK 0x1.cd93bcaf90a8bp25 0x1.18500976c3c5ap6 -0x1.4d3ffafb8p6 0x1.67fffffffffffp7 -0x1.d53b8c4d99189p-48 0x1.f3d3p-14 F +REG epsg:3389 1 OK 0x1.c9575c6922b64p25 -0x1.0ef74ab30f624p19 -0x1.392cba3fbp6 0x1.5e0000000e83ep7 -0x1.3fffffffde461p2 0x1.f2c7p-14 F +REG epsg:3389 2 OK 0x1.d1d01cf5134bap25 -0x1.0ef73e52a55dap19 -0x1.9b4cb1cbfp6 -0x1.5e0000000f09bp7 -0x1.3fffffffcbffep2 0x1.ed4ap-14 F +REG epsg:3389 3 OK 0x1.c9575d06f6f9fp25 0x1.0f08cf88c3af1p19 -0x1.00d169344p6 0x1.5e0000000f16ep7 0x1.3fffffffcbe78p2 0x1.ed56p-14 F +REG epsg:3389 4 OK 0x1.d1d01c5757353p25 0x1.0f08c3278f17fp19 -0x1.62f152205p6 -0x1.5e0000000e768p7 0x1.3fffffffde5a2p2 0x1.f2bap-14 F +REG epsg:3390 0 OK 0x1.cd93cc8b4ef6cp25 0x1.463e8a7f874f6p6 -0x1.487feeee2p6 -0x1.68p7 0x0.0p0 0x1.54p-19 F +REG epsg:3390 1 OK 0x1.c9576c4a4c2f6p25 -0x1.0ef5d47b6fafdp19 -0x1.384d276bap6 0x1.5e0000000eacbp7 -0x1.3fffffffea4e4p2 0x1.51ap-19 F +REG epsg:3390 2 OK 0x1.d1d02ccb6fb69p25 -0x1.0ef5d28472798p19 -0x1.933765ee6p6 -0x1.5e0000000ea1cp7 -0x1.3fffffffea603p2 0x1.50cp-19 F +REG epsg:3390 3 OK 0x1.c9576ce98c3c5p25 0x1.0f0a383874e23p19 -0x1.fede6456ep5 0x1.5e0000000eac7p7 0x1.3fffffffea4cbp2 0x1.522p-19 F +REG epsg:3390 4 OK 0x1.d1d02c2c4361ap25 0x1.0f0a364152265p19 -0x1.5a59634fcp6 -0x1.5e0000000ea19p7 0x1.3fffffffea5ecp2 0x1.512p-19 F +REG epsg:3391 0 OK 0x1.e89467098c388p18 -0x1.06ca7fc405e11p8 0x1.60bea7d3ep5 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:3391 1 OK -0x1.ab05e6c57f12p15 -0x1.0f03bcc03e17p19 0x1.4f6261b42p5 0x1.1p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:3391 2 OK 0x1.01a262f201d9cp20 -0x1.0f03bcc23a0b3p19 0x1.7c0c01f54p6 0x1.5ffffffffffffp5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3391 3 OK -0x1.ab0de9b7be44p15 0x1.0ec20ab01d1f7p19 -0x1.f41e4a64p1 0x1.1p5 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:3391 4 OK 0x1.01a2a31b91736p20 0x1.0ec20ab218235p19 0x1.897486e9ap5 0x1.5ffffffffffffp5 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:3392 0 OK 0x1.e88fe71b5d007p18 -0x1.06ca2b35f953bp8 0x1.2cc70bae3p6 0x1.67fffffffffffp5 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:3392 1 OK -0x1.ab248080c086p15 -0x1.0f0365559a118p19 0x1.2967b60a5p6 0x1.4p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3392 2 OK 0x1.01a117c59c67ap20 -0x1.0f03655778664p19 0x1.f140d447bp6 0x1.8ffffffffffffp5 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:3392 3 OK -0x1.ab2c837c414ap15 0x1.0ec1b35a71ed6p19 0x1.c857416f8p4 0x1.3ffffffffffffp5 0x1.4p2 -0x1.8p-29 F +REG epsg:3392 4 OK 0x1.01a157ee66c35p20 0x1.0ec1b35c4f602p19 0x1.39ef4d57fp6 0x1.8ffffffffffffp5 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:3393 0 OK 0x1.e88a9d85a660dp18 -0x1.06c9dc3c84b1dp8 0x1.a0f9060e6p6 0x1.97fffffffffffp5 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:3393 1 OK -0x1.ab49c2b719b4p15 -0x1.0f0313afeb0ccp19 0x1.a410b56f3p6 0x1.7p5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:3393 2 OK 0x1.019f9d08b606fp20 -0x1.0f0313b1a676p19 0x1.2e9bd291dp7 0x1.bffffffffffffp5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3393 3 OK -0x1.ab51c5bf55c5p15 0x1.0ec161c85966p19 0x1.d97e13cf4p5 0x1.7p5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3393 4 OK 0x1.019fdd30a779p20 0x1.0ec161ca13fd9p19 0x1.a5e65162cp6 0x1.bffffffffffffp5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3394 0 OK 0x1.6e31b48400277p20 0x1.1cae91733dd27p20 0x1.466d35d4p4 0x1.67fffffffffffp5 0x1.03fffffffffb9p5 0x1.0p-30 F +REG epsg:3394 1 OK 0x1.bdc81197bdedbp19 0x1.32b0335d0d97ep19 0x1.37e795014p5 0x1.38928b4db1cbap5 0x1.b7fffffffff39p4 0x1.0p-30 F +REG epsg:3394 2 OK 0x1.fd7f615fd2b06p20 0x1.32b0119530983p19 0x1.a61c17a54p4 0x1.976d74b24e346p5 0x1.b7fffffffff39p4 0x0.0p0 F +REG epsg:3394 3 OK 0x1.dbdf1402868eep19 0x1.a7aec7902e14ep20 0x1.a9e24f028p3 0x1.38928b4db1cbap5 0x1.2bfffffffffdap5 0x1.0p-30 F +REG epsg:3394 4 OK 0x1.ee73ddfc9b46cp20 0x1.a7aed823691ddp20 0x1.0452a7f8p1 0x1.976d74b24e346p5 0x1.2bfffffffffdap5 0x1.0p-29 F +REG epsg:3395 0 OK 0x0.0p0 0x1.854a64p-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3395 1 OK -0x1.0fc6ae86e479fp19 -0x1.0e4dfb191d5f6p19 0x0.0p0 -0x1.4p2 -0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3395 2 OK 0x1.0fc6ae86e479fp19 -0x1.0e4dfb191d5f6p19 0x0.0p0 0x1.4p2 -0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3395 3 OK -0x1.0fc6ae86e479fp19 0x1.0e4dfb191d5ffp19 0x0.0p0 -0x1.4p2 0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3395 4 OK 0x1.0fc6ae86e479fp19 0x1.0e4dfb191d5ffp19 0x0.0p0 0x1.4p2 0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3396 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:3396 1 OK 0x1.677b3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3396 2 OK 0x1.ef02c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3396 3 OK 0x1.677b3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3396 4 OK 0x1.ef02c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3397 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:3397 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3397 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3397 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3397 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3398 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:3398 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3398 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3398 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3398 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3399 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3399 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3399 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3399 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3399 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:3400 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ccp6 0x0.0p0 0x0.0p0 T +REG epsg:3400 1 OK -0x1.abb8e70b756bp15 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3400 2 OK 0x1.0181c7385bab6p20 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3400 3 OK -0x1.abb8e70b756bp15 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3400 4 OK 0x1.0181c7385bab6p20 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3401 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.ccp6 0x0.0p0 0x0.0p0 T +REG epsg:3401 1 OK -0x1.0edf8e70b756bp19 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3401 2 OK 0x1.0edf8e70b756bp19 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3401 3 OK -0x1.0edf8e70b756bp19 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3401 4 OK 0x1.0edf8e70b756bp19 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3402 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ccp6 0x0.0p0 0x0.0p0 T +REG epsg:3402 1 OK -0x1.abb8e70b756bp15 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3402 2 OK 0x1.0181c7385bab6p20 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3402 3 OK -0x1.abb8e70b756bp15 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3402 4 OK 0x1.0181c7385bab6p20 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3403 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.ccp6 0x0.0p0 0x0.0p0 T +REG epsg:3403 1 OK -0x1.0edf8e70b756bp19 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3403 2 OK 0x1.0edf8e70b756bp19 -0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3403 3 OK -0x1.0edf8e70b756bp19 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.dfffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3403 4 OK 0x1.0edf8e70b756bp19 0x1.0ec79b7125f34p19 0x0.0p0 -0x1.b80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3404 0 OK 0x1.e848000000005p20 0x1.ad7545588e65p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:3404 1 OK 0x1.0a3d4a3582c3ep20 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3404 2 OK 0x1.63295ae53e9dep21 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3404 3 OK 0x1.16ff5d3fb333cp20 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3404 4 OK 0x1.5cc851602665fp21 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3405 0 OK 0x1.e8171a1b164c2p18 0x1.bd2588d58b59cp6 -0x1.aa09672a8p3 0x1.a3ffffffffff9p6 0x1.185b5ab90f7b5p-43 0x1.4p-28 T +REG epsg:3405 1 OK -0x1.aeffdda7ed08p15 -0x1.0ed5952e810cfp19 -0x1.7d7c9455p2 0x1.8fffffffffff5p6 -0x1.3ffffffffffbp2 0x1.8p-28 F +REG epsg:3405 2 OK 0x1.01838daa542f6p20 -0x1.0ed5916c09f1fp19 -0x1.3f5355f16p5 0x1.b7ffffffffffdp6 -0x1.3ffffffffffacp2 0x1.0p-29 F +REG epsg:3405 3 OK -0x1.aefcb2cab53ap15 0x1.0ef1639a8cf72p19 0x1.aeea6d98p3 0x1.8fffffffffff5p6 0x1.40000000000c2p2 0x1.2p-27 F +REG epsg:3405 4 OK 0x1.018370a30fa38p20 0x1.0ef1673982ad3p19 -0x1.47d155ab4p4 0x1.b7ffffffffffdp6 0x1.40000000000c6p2 0x1.4p-27 F +REG epsg:3406 0 OK 0x1.e817acdd5335dp18 0x1.bd6da7d0bc321p6 -0x1.0d82cb1ap5 0x1.bbffffffffffep6 0x1.1c1594d60839dp-43 0x1.8p-29 T +REG epsg:3406 1 OK -0x1.aefed0893f4p15 -0x1.0ed5cc30650f1p19 -0x1.a61632a84p4 0x1.a7ffffffffffap6 -0x1.3ffffffffffb2p2 0x1.0p-30 F +REG epsg:3406 2 OK 0x1.0183cea95845cp20 -0x1.0ed5c8616171ap19 -0x1.df7f08d7ep5 0x1.d000000000004p6 -0x1.3ffffffffffbp2 -0x1.0p-29 F +REG epsg:3406 3 OK -0x1.aefba673d9f9p15 0x1.0ef19f11c45e9p19 -0x1.bd0503c2p2 0x1.a7ffffffffffap6 0x1.40000000000c2p2 0x1.cp-28 F +REG epsg:3406 4 OK 0x1.0183b19ba3eeep20 0x1.0ef1a2bd4e412p19 -0x1.441412842p5 0x1.d000000000001p6 0x1.40000000000c8p2 0x1.8p-28 F +REG epsg:3407 0 OK 0x1.01e0f5c28f5c2p17 0x1.e8cbeb851eb83p15 0x0.0p0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 0x0.0p0 F +REG epsg:3407 1 OK -0x1.abef50ef081b1p20 -0x1.a594d8b6d9c3bp20 0x0.0p0 0x1.b31879960ffaep6 0x1.14fe7ef444ab2p4 0x0.0p0 F +REG epsg:3407 2 OK 0x1.ec678e5fabf21p20 -0x1.a594d8b6d9c3bp20 0x0.0p0 0x1.de5534f2ed106p6 0x1.14fe7ef444ab2p4 0x0.0p0 F +REG epsg:3407 3 OK -0x1.8c230cdffe01ap20 0x1.d42ffebaab56p20 0x0.0p0 0x1.b318785eb3dc6p6 0x1.b4fe7f7a82ffp4 0x0.0p0 F +REG epsg:3407 4 OK 0x1.cc9b4a50a1d8ap20 0x1.d42ffebaab56p20 0x0.0p0 0x1.de55362a492edp6 0x1.b4fe7f7a82ffp4 0x0.0p0 F +REG epsg:3408 0 OK 0x0.0p0 -0x1.b25d7e9f726e6p16 0x0.0p0 0x0.0p0 0x1.64p6 0x0.0p0 F +REG epsg:3408 1 OK -0x1.d6122764176a7p18 -0x1.0f6543f9da9c4p18 0x0.0p0 -0x1.dffffffffffffp5 0x1.54p6 0x0.0p0 F +REG epsg:3408 2 OK 0x1.d6122764176a7p18 -0x1.0f6543f9da9c4p18 0x0.0p0 0x1.dffffffffffffp5 0x1.54p6 0x0.0p0 F +REG epsg:3408 3 OK -0x1.782bdaecfa8fap16 -0x1.b25d7e9f726e8p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 F +REG epsg:3408 4 OK 0x1.782bdaecfa8fap16 -0x1.b25d7e9f726e8p15 0x0.0p0 0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 F +REG epsg:3409 0 OK 0x0.0p0 0x1.b25d7e9f726bap16 0x0.0p0 0x0.0p0 -0x1.64p6 0x0.0p0 F +REG epsg:3409 1 OK -0x1.782bdaecfa8d3p16 0x1.b25d7e9f726bbp15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 F +REG epsg:3409 2 OK 0x1.782bdaecfa8d3p16 0x1.b25d7e9f726bbp15 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 F +REG epsg:3409 3 OK -0x1.d6122764176b1p18 0x1.0f6543f9da9cap18 0x0.0p0 -0x1.dffffffffffffp5 -0x1.54p6 0x0.0p0 F +REG epsg:3409 4 OK 0x1.d6122764176b1p18 0x1.0f6543f9da9cap18 0x0.0p0 0x1.dffffffffffffp5 -0x1.54p6 0x0.0p0 F +REG epsg:3410 0 OK 0x0.0p0 0x1.c106f19b60efp21 0x0.0p0 0x0.0p0 0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:3410 1 OK -0x1.0f7b50f590c98p19 0x1.7b88bc7055c07p21 0x0.0p0 -0x1.7181116f43fe3p2 0x1.9p4 0x0.0p0 F +REG epsg:3410 2 OK 0x1.0f7b50f590c98p19 0x1.7b88bc7055c07p21 0x0.0p0 0x1.7181116f43fe3p2 0x1.9p4 0x0.0p0 F +REG epsg:3410 3 OK -0x1.0f7b50f590c98p19 0x1.018d27167cca4p22 0x0.0p0 -0x1.7181116f43fe3p2 0x1.18p5 0x0.0p0 F +REG epsg:3410 4 OK 0x1.0f7b50f590c98p19 0x1.018d27167cca4p22 0x0.0p0 0x1.7181116f43fe3p2 0x1.18p5 0x0.0p0 F +REG epsg:3411 0 OK 0x0.0p0 -0x1.091f730184fbbp20 0x0.0p0 -0x1.68p5 0x1.3ffffffffffd8p6 0x0.0p0 T +REG epsg:3411 1 OK -0x1.22c055322ffe8p21 -0x1.4fbb0e0454982p20 0x0.0p0 -0x1.a400000000001p6 0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3411 2 OK 0x1.22c055322ffe7p21 -0x1.4fbb0e0454985p20 0x0.0p0 0x1.dfffffffffffep3 0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3411 3 OK -0x1.6e7a79529dfap16 -0x1.a72c3e0a1bde4p15 0x0.0p0 -0x1.a400000000001p6 0x1.64p6 0x0.0p0 T +REG epsg:3411 4 OK 0x1.6e7a79529df9ep16 -0x1.a72c3e0a1bde7p15 0x0.0p0 0x1.dfffffffffffep3 0x1.64p6 0x0.0p0 T +REG epsg:3412 0 OK 0x0.0p0 0x1.091f730184fbbp20 0x0.0p0 0x0.0p0 -0x1.3ffffffffffd8p6 0x0.0p0 T +REG epsg:3412 1 OK -0x1.6e7a79529df9ep16 0x1.a72c3e0a1bde7p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3412 2 OK 0x1.6e7a79529df9ep16 0x1.a72c3e0a1bde7p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3412 3 OK -0x1.22c055322ffe7p21 0x1.4fbb0e0454985p20 0x0.0p0 -0x1.dffffffffffffp5 -0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3412 4 OK 0x1.22c055322ffe7p21 0x1.4fbb0e0454985p20 0x0.0p0 0x1.dffffffffffffp5 -0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3413 0 OK 0x0.0p0 -0x1.091e04c21f442p20 0x0.0p0 -0x1.68p5 0x1.3ffffffffffd8p6 0x0.0p0 T +REG epsg:3413 1 OK -0x1.22bec2cac19acp21 -0x1.4fb93d5c5b48p20 0x0.0p0 -0x1.a400000000001p6 0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3413 2 OK 0x1.22bec2cac19abp21 -0x1.4fb93d5c5b483p20 0x0.0p0 0x1.dfffffffffffep3 0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3413 3 OK -0x1.6e787f3de6fa1p16 -0x1.a729f5aae685ep15 0x0.0p0 -0x1.a400000000001p6 0x1.64p6 0x0.0p0 T +REG epsg:3413 4 OK 0x1.6e787f3de6f9fp16 -0x1.a729f5aae6861p15 0x0.0p0 0x1.dfffffffffffep3 0x1.64p6 0x0.0p0 T +REG epsg:3414 0 OK 0x1.b586916872b02p14 0x1.2eb124dd2f1aap15 0x0.0p0 0x1.9f55555555553p6 0x1.5ddddddddddep0 0x0.0p0 T +REG epsg:3414 1 OK -0x1.01fb944c83004p19 -0x1.f796914f829e3p18 0x0.0p0 0x1.8b53e05f90e4cp6 -0x1.d1111110f1b23p1 0x0.0p0 F +REG epsg:3414 2 OK 0x1.1d53fd630a2b4p19 -0x1.f796914f829e3p18 0x0.0p0 0x1.b356ca4b19c5bp6 -0x1.d1111110f1b23p1 0x0.0p0 F +REG epsg:3414 3 OK -0x1.00da522bfb24dp19 0x1.22336a743b8b6p19 0x0.0p0 0x1.8b53e05f8d7f4p6 0x1.977777775d313p2 0x0.0p0 F +REG epsg:3414 4 OK 0x1.1c32bb42824fdp19 0x1.22336a743b8b6p19 0x0.0p0 0x1.b356ca4b1d2b3p6 0x1.977777775d313p2 0x0.0p0 F +REG epsg:3415 0 OK 0x1.e842217bab29ap18 0x1.e84785817e5dbp18 0x1.db93af2ep1 0x1.c800000000001p6 0x1.4fffffffeb4dfp4 0x1.6b49p-14 F +REG epsg:3415 1 OK -0x1.7a9d4335a65dcp17 -0x1.25cfd70a5028p17 0x1.f5772208p1 0x1.ae4ae299c950fp6 0x1.dfffffffe106ep3 0x1.84dp-14 F +REG epsg:3415 2 OK 0x1.23749bb162992p20 -0x1.25d0d25b879e4p17 0x1.f5772204p1 0x1.e1b51d6636af2p6 0x1.dfffffffe106ep3 0x1.84cep-14 F +REG epsg:3415 3 OK -0x1.123a5d34630ep17 0x1.1f88d9567369dp20 0x1.c232e404p1 0x1.ae4ae299c950fp6 0x1.afffffffe7048p4 0x1.4bp-14 F +REG epsg:3415 4 OK 0x1.16687b141c346p20 0x1.1f88bc57c4ab8p20 0x1.c232e402p1 0x1.e1b51d6636af2p6 0x1.afffffffe7053p4 0x1.4affp-14 F +REG epsg:3416 0 OK 0x1.86ap18 0x1.86ap18 0x0.0p0 0x1.aaaaaaaaaaaa9p3 0x1.7bffffffff6acp5 0x0.0p0 F +REG epsg:3416 1 OK 0x1.6cb19823ba1cp15 0x1.2b3f7df09ece8p16 0x0.0p0 0x1.1c9195d1a8502p3 0x1.63ffffffffff6p5 0x0.0p0 F +REG epsg:3416 2 OK 0x1.6fd4e67dc45e6p19 0x1.2b3f7df09ece8p16 0x0.0p0 0x1.1c61dfc1d6829p4 0x1.63ffffffffff6p5 0x0.0p0 F +REG epsg:3416 3 OK 0x1.4b3274eb09eb8p16 0x1.6aa2b350b4d75p19 0x0.0p0 0x1.1c9195d1a8503p3 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:3416 4 OK 0x1.5d39b1629ec2ap19 0x1.6aa2b350b4d75p19 0x0.0p0 0x1.1c61dfc1d6829p4 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:3417 0 OK 0x1.2c5e880000003p22 0x1.b7c99ac66682ep21 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3417 1 OK 0x1.03d2bd0e9684ap22 0x1.6a5697a973562p21 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3417 2 OK 0x1.54ea52f1697bcp22 0x1.6a5697a973562p21 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3417 3 OK 0x1.060bf4adabb8cp22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3417 4 OK 0x1.52b11b525447ap22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3418 0 OK 0x1.907e0aaacd9ecp20 0x1.3d3f567def798p18 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:3418 1 OK 0x1.d9f3bc9d1907p19 -0x1.346e3812466f1p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3418 2 OK 0x1.1a011b83875c8p21 -0x1.346e3812466f1p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3418 3 OK 0x1.eb292b95746acp19 0x1.e0253b431c934p19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3418 4 OK 0x1.15b3bfc57083ap21 0x1.e0253b431c934p19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3419 0 OK 0x1.4064d5553261cp20 0x1.01dcb007f3f81p18 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:3419 1 OK 0x1.7893406bdf08p19 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3419 2 OK 0x1.c4800a74753e8p20 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3419 3 OK 0x1.8335e132b4628p19 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3419 4 OK 0x1.bf2eba110a914p20 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3420 0 OK 0x1.4064d5553261cp20 0x1.94d890b712fafp20 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:3420 1 OK 0x1.24e688993b282p19 0x1.dc5355d74337p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3420 2 OK 0x1.ee56665dc7308p20 0x1.dc5355d74337p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3420 3 OK 0x1.3648799a8a6c2p19 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3420 4 OK 0x1.e5a56ddd1f8e6p20 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3421 0 OK 0x1.4064d5559b3d4p19 0x1.907e0aaaacda5p24 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:3421 1 OK -0x1.37aeca059b545p20 0x1.758464046d1dap24 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3421 2 OK 0x1.3c09cfad9b496p21 0x1.758464046d1dap24 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3421 3 OK -0x1.01a6b768bc94ep20 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3421 4 OK 0x1.2105c65f2be98p21 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3422 0 OK 0x1.907e0aaacd9ecp20 0x1.2c5e880000003p24 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:3422 1 OK -0x1.1d8ca8166d50cp18 0x1.1164e159c0438p24 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3422 2 OK 0x1.b42f9fad9b48ep21 0x1.1164e159c0438p24 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3422 3 OK -0x1.15b1768bc94cp16 0x1.4908f019e4711p24 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3422 4 OK 0x1.992b965f2be92p21 0x1.4908f019e4711p24 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3423 0 OK 0x1.4064d55566cf7p21 0x1.907e0aaaa64c8p23 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:3423 1 OK 0x1.51d0ebf4c957ep19 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3423 2 OK 0x1.162ab7d6cda47p22 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3423 3 OK 0x1.bde1112e86d6cp19 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3423 4 OK 0x1.08a8b32f95f4ap22 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3424 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3424 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3424 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3424 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3424 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3425 0 OK 0x1.2c5e880000003p22 0x1.b7c99ac66682ep21 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3425 1 OK 0x1.03d2bd0e9684ap22 0x1.6a5697a973562p21 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3425 2 OK 0x1.54ea52f1697bcp22 0x1.6a5697a973562p21 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3425 3 OK 0x1.060bf4adabb8cp22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3425 4 OK 0x1.52b11b525447ap22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3426 0 OK 0x1.907e0aaacd9ecp20 0x1.3d3f567def798p18 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:3426 1 OK 0x1.d9f3bc9d1907p19 -0x1.346e3812466f1p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3426 2 OK 0x1.1a011b83875c8p21 -0x1.346e3812466f1p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3426 3 OK 0x1.eb292b95746acp19 0x1.e0253b431c934p19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3426 4 OK 0x1.15b3bfc57083ap21 0x1.e0253b431c934p19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3427 0 OK 0x1.4064d5553261cp20 0x1.01dcb007f3f81p18 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:3427 1 OK 0x1.7893406bdf08p19 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3427 2 OK 0x1.c4800a74753e8p20 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3427 3 OK 0x1.8335e132b4628p19 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3427 4 OK 0x1.bf2eba110a914p20 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3428 0 OK 0x1.4064d5553261cp20 0x1.94d890b712fafp20 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:3428 1 OK 0x1.24e688993b282p19 0x1.dc5355d74337p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3428 2 OK 0x1.ee56665dc7308p20 0x1.dc5355d74337p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3428 3 OK 0x1.3648799a8a6c2p19 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3428 4 OK 0x1.e5a56ddd1f8e6p20 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3429 0 OK 0x1.4064d5559b3d4p19 0x1.907e0aaaacda5p24 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:3429 1 OK -0x1.37aeca059b545p20 0x1.758464046d1dap24 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3429 2 OK 0x1.3c09cfad9b496p21 0x1.758464046d1dap24 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3429 3 OK -0x1.01a6b768bc94ep20 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3429 4 OK 0x1.2105c65f2be98p21 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3430 0 OK 0x1.907e0aaacd9ecp20 0x1.2c5e880000003p24 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:3430 1 OK -0x1.1d8ca8166d50cp18 0x1.1164e159c0438p24 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3430 2 OK 0x1.b42f9fad9b48ep21 0x1.1164e159c0438p24 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3430 3 OK -0x1.15b1768bc94cp16 0x1.4908f019e4711p24 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3430 4 OK 0x1.992b965f2be92p21 0x1.4908f019e4711p24 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3431 0 OK 0x1.4064d55566cf7p21 0x1.907e0aaaa64c8p23 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:3431 1 OK 0x1.51d0ebf4c957ep19 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3431 2 OK 0x1.162ab7d6cda47p22 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3431 3 OK 0x1.bde1112e86d6cp19 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3431 4 OK 0x1.08a8b32f95f4ap22 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3432 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3432 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3432 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3432 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3432 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3433 0 OK 0x1.4064d5553261cp20 0x1.51ad3e78a054ep18 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:3433 1 OK 0x1.25a5b3020ca3dp19 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3433 2 OK 0x1.edf6d1295e71ap20 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3433 3 OK 0x1.359cf3f53fba3p19 0x1.fe8320bb299fep19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3433 4 OK 0x1.e5fb30afc4e66p20 0x1.fe8320bb299fep19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3434 0 OK 0x1.4064d5553261cp20 0x1.9dacc412dbbd3p20 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:3434 1 OK 0x1.00c480df08f65p19 0x1.cae97f93705a1p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3434 2 OK 0x1.0033b51d70243p21 0x1.cae97f93705a1p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3434 3 OK 0x1.132c692442758p19 0x1.2d456552182ddp21 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3434 4 OK 0x1.f73376184388cp20 0x1.2d456552182ddp21 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3435 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3435 1 OK -0x1.d337aa27ec9e1p19 -0x1.aeabd35d8d29ap20 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3435 2 OK 0x1.65198a89fb275p21 -0x1.aeabd35d8d29cp20 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3435 3 OK -0x1.5f3708e5701fbp19 0x1.cbaec69ae12c3p20 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3435 4 OK 0x1.481962395c07cp21 0x1.cbaec69ae12c1p20 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3436 0 OK 0x1.18583aaa99311p21 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3436 1 OK 0x1.5b346afe606c8p18 -0x1.aea818b495afap20 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3436 2 OK 0x1.02a4f3fab32a9p22 -0x1.aea818b495af9p20 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3436 3 OK 0x1.2199d59dc334ep19 0x1.cbaacba2be8fep20 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3436 4 OK 0x1.e849ffedc1956p21 0x1.cbaacba2be8ffp20 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3437 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:3437 1 OK -0x1.e09f4e5bd1c2fp19 -0x1.ab4f482af396dp20 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3437 2 OK 0x1.68737396f4708p21 -0x1.ab4f482af396ep20 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3437 3 OK -0x1.51c0c6017ea79p19 0x1.cef3ff10b2be5p20 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3437 4 OK 0x1.44bbd1805fa9cp21 0x1.cef3ff10b2be4p20 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3438 0 OK 0x1.4064d554c9862p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3438 1 OK -0x1.8eca3057f111p20 -0x1.ac3478cdae1a8p20 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3438 2 OK 0x1.177e4d812aea9p21 -0x1.ac3478cdae1a6p20 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3438 3 OK -0x1.4ad4c4046bdfp20 0x1.ce225d894e1a8p20 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3438 4 OK 0x1.eb072eaed0a3p20 0x1.ce225d894e1a9p20 0x0.0p0 -0x1.0377569181a1dp6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3439 0 OK 0x1.e807f88ef67d9p18 -0x1.7e9d8ae8e90aap7 0x1.18d6c5f9cp6 0x1.97ffffffcc1b4p5 0x1.816279878fef7p-26 0x1.56f038p-7 T +REG epsg:3439 1 OK -0x1.af48fb879162p15 -0x1.0efa43f65b58bp19 0x1.56cdf1c75p6 0x1.6fffffffa5b25p5 -0x1.3fffffe0a42e7p2 0x1.47eb3cp-7 F +REG epsg:3439 2 OK 0x1.017eef7ae2e54p20 -0x1.0ef871483a5d3p19 0x1.57db2263p6 0x1.bfffffffce5c4p5 -0x1.3fffffdf837ep2 0x1.45527ep-7 F +REG epsg:3439 3 OK -0x1.af63b2da07dfp15 0x1.0ec91bb572cbep19 0x1.badb6b12ap5 0x1.6fffffffd706bp5 0x1.4000000eb9a57p2 0x1.633f5ep-7 F +REG epsg:3439 4 OK 0x1.017e6ea6b924p20 0x1.0ec9f2e363511p19 0x1.bd0fbae42p5 0x1.bfffffffe87ebp5 0x1.4000000ff3898p2 0x1.620cp-7 F +REG epsg:3440 0 OK 0x1.e8006bf5822a1p18 -0x1.71996127579e8p7 0x1.13280c58fp6 0x1.c7ffffffdea43p5 0x1.8abd63b50cbc1p-26 0x1.55fcbap-7 T +REG epsg:3440 1 OK -0x1.af855d83a841p15 -0x1.0ef97bd58601p19 0x1.5ba42202ap6 0x1.9fffffffbd48fp5 -0x1.3fffffdfe19bfp2 0x1.462e0cp-7 F +REG epsg:3440 2 OK 0x1.017d106090a0ap20 -0x1.0ef7a0e112831p19 0x1.47b5bf087p6 0x1.efffffffe9574p5 -0x1.3fffffdf2cb54p2 0x1.448596p-7 F +REG epsg:3440 3 OK -0x1.afa0999b58f4p15 0x1.0ec9ebd3ac3a4p19 0x1.c497376fcp5 0x1.9fffffffe0d52p5 0x1.4000000f8d0f2p2 0x1.6272eep-7 F +REG epsg:3440 4 OK 0x1.017c8b60c42bap20 0x1.0ecacb4784e3fp19 0x1.9cd4efa2ep5 0x1.effffffff521bp5 0x1.4000001052284p2 0x1.61aaa8p-7 F +REG epsg:3441 0 OK 0x1.4064d5553261cp20 0x1.51ad3e78a054ep18 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:3441 1 OK 0x1.25a5b3020ca3dp19 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3441 2 OK 0x1.edf6d1295e71ap20 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3441 3 OK 0x1.359cf3f53fba3p19 0x1.fe8320bb299fep19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3441 4 OK 0x1.e5fb30afc4e66p20 0x1.fe8320bb299fep19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3442 0 OK 0x1.4064d5553261cp20 0x1.9dacc412dbbd3p20 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:3442 1 OK 0x1.00c480df08f65p19 0x1.cae97f93705a1p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3442 2 OK 0x1.0033b51d70243p21 0x1.cae97f93705a1p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3442 3 OK 0x1.132c692442758p19 0x1.2d456552182ddp21 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3442 4 OK 0x1.f73376184388cp20 0x1.2d456552182ddp21 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3443 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3443 1 OK -0x1.d337aa27ec9e1p19 -0x1.aeabd35d8d29ap20 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3443 2 OK 0x1.65198a89fb275p21 -0x1.aeabd35d8d29cp20 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3443 3 OK -0x1.5f3708e5701fbp19 0x1.cbaec69ae12c3p20 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3443 4 OK 0x1.481962395c07cp21 0x1.cbaec69ae12c1p20 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3444 0 OK 0x1.18583aaa99311p21 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3444 1 OK 0x1.5b346afe606c8p18 -0x1.aea818b495afap20 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3444 2 OK 0x1.02a4f3fab32a9p22 -0x1.aea818b495af9p20 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3444 3 OK 0x1.2199d59dc334ep19 0x1.cbaacba2be8fep20 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3444 4 OK 0x1.e849ffedc1956p21 0x1.cbaacba2be8ffp20 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3445 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:3445 1 OK -0x1.e09f4e5bd1c2fp19 -0x1.ab4f482af396dp20 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3445 2 OK 0x1.68737396f4708p21 -0x1.ab4f482af396ep20 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3445 3 OK -0x1.51c0c6017ea79p19 0x1.cef3ff10b2be5p20 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3445 4 OK 0x1.44bbd1805fa9cp21 0x1.cef3ff10b2be4p20 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3446 0 OK 0x1.4064d554c9862p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3446 1 OK -0x1.8eca3057f111p20 -0x1.ac3478cdae1a8p20 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3446 2 OK 0x1.177e4d812aea9p21 -0x1.ac3478cdae1a6p20 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3446 3 OK -0x1.4ad4c4046bdfp20 0x1.ce225d894e1a8p20 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3446 4 OK 0x1.eb072eaed0a3p20 0x1.ce225d894e1a9p20 0x0.0p0 -0x1.0377569181a1dp6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3447 0 OK 0x1.259cp17 0x1.040758346ebcap17 0x0.0p0 0x1.16fd646817cfbp2 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:3447 1 OK -0x1.3ee21896298p11 -0x1.969d1f1a0204p13 0x0.0p0 0x1.21ab3723f107dp1 0x1.8955555554e34p5 0x0.0p0 F +REG epsg:3447 2 OK 0x1.2819c4312c53p18 -0x1.969d1f1a0204p13 0x0.0p0 0x1.9d252d3e371b9p2 0x1.8955555554e34p5 0x0.0p0 F +REG epsg:3447 3 OK 0x1.6be43088dac8p12 0x1.14de4f1f3c089p18 0x0.0p0 0x1.21ab3723f107cp1 0x1.9eaaaaaaaa63p5 0x0.0p0 F +REG epsg:3447 4 OK 0x1.1fec6f3ddc94ep18 0x1.14de4f1f3c089p18 0x0.0p0 0x1.9d252d3e371b9p2 0x1.9eaaaaaaaa63p5 0x0.0p0 F +REG epsg:3448 0 OK 0x1.6e36p19 0x1.3d62p19 0x0.0p0 -0x1.34p6 0x1.1fffffffffefep4 0x0.0p0 F +REG epsg:3448 1 OK 0x1.5adce6b95ce84p17 0x1.96d65c640e78p16 0x0.0p0 -0x1.49077c9109a7dp6 0x1.9fffffffffe15p3 0x0.0p0 F +REG epsg:3448 2 OK 0x1.42da6328d4636p20 0x1.96d65c640e78p16 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.9fffffffffe15p3 0x0.0p0 F +REG epsg:3448 3 OK 0x1.983a719bcfd8p17 0x1.27e1ada50f3aep20 0x0.0p0 -0x1.49077c9109a7dp6 0x1.6ffffffffff0ep4 0x0.0p0 F +REG epsg:3448 4 OK 0x1.3b2eb1cc86056p20 0x1.27e1ada50f3aep20 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.6ffffffffff0ep4 0x0.0p0 F +REG epsg:3449 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:3449 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3449 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3449 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3449 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3450 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:3450 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3450 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3450 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3450 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:3451 0 OK 0x1.907e0aaa99312p21 0x1.80d72f309a9c2p18 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:3451 1 OK 0x1.2d90b4fd585dcp21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3451 2 OK 0x1.f36b6057da04p21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3451 3 OK 0x1.3214ef0c8300ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3451 4 OK 0x1.eee72648af60ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3452 0 OK 0x1.907e0aaa99312p21 0x1.86a7c427d74f8p18 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:3452 1 OK 0x1.2c2fc6b261b4ap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3452 2 OK 0x1.f4cc4ea2d0adap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3452 3 OK 0x1.3080083a31b84p21 0x1.27283341722fap20 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3452 4 OK 0x1.f07c0d1b00aap21 0x1.27283341722fap20 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3453 0 OK 0x1.907e0aaa99312p21 0x1.9e237f0f4ed86p18 0x0.0p0 -0x1.6d55555555555p6 0x1.aaaaaaaaaa9eep4 0x0.0p0 F +REG epsg:3453 1 OK 0x1.26453411166a5p21 -0x1.957ff3ab96fa3p18 0x0.0p0 -0x1.77c7107b1a9e2p6 0x1.8555555555483p4 0x0.0p0 F +REG epsg:3453 2 OK 0x1.fab6e1441bf7fp21 -0x1.957ff3ab96fa3p18 0x0.0p0 -0x1.62e39a2f900c8p6 0x1.8555555555483p4 0x0.0p0 F +REG epsg:3453 3 OK 0x1.2a8e24a97f922p21 0x1.38c55a3d63a9fp20 0x0.0p0 -0x1.77c7107b1a9e2p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG epsg:3453 4 OK 0x1.f66df0abb2d02p21 0x1.38c55a3d63a9fp20 0x0.0p0 -0x1.62e39a2f900c8p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG epsg:3454 0 OK 0x1.e097400000006p20 0x1.6fcae86be05b3p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:3454 1 OK 0x1.21c83698cc15p20 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3454 2 OK 0x1.4fb324b399f5ep21 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3454 3 OK 0x1.2e5f0748dbcb6p20 0x1.16f406e89be55p20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3454 4 OK 0x1.4967bc5b921abp21 0x1.16f406e89be55p20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3455 0 OK 0x1.e097400000006p20 0x1.6fcae86be05b3p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:3455 1 OK 0x1.21c83698cc15p20 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3455 2 OK 0x1.4fb324b399f5ep21 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3455 3 OK 0x1.2e5f0748dbcb6p20 0x1.16f406e89be55p20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3455 4 OK 0x1.4967bc5b921abp21 0x1.16f406e89be55p20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3456 0 OK 0x1.907e0aaa99312p21 0x1.80d72f309a9c2p18 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:3456 1 OK 0x1.2d90b4fd585dcp21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3456 2 OK 0x1.f36b6057da04p21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3456 3 OK 0x1.3214ef0c8300ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3456 4 OK 0x1.eee72648af60ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3457 0 OK 0x1.907e0aaa99312p21 0x1.86a7c427d74f8p18 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:3457 1 OK 0x1.2c2fc6b261b4ap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3457 2 OK 0x1.f4cc4ea2d0adap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3457 3 OK 0x1.3080083a31b84p21 0x1.27283341722fap20 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3457 4 OK 0x1.f07c0d1b00aap21 0x1.27283341722fap20 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3458 0 OK 0x1.e097400000006p20 0x1.495377ea606a5p18 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:3458 1 OK 0x1.361934b47e738p20 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:3458 2 OK 0x1.458aa5a5c0c62p21 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:3458 3 OK 0x1.40b260ebae5d4p20 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:3458 4 OK 0x1.403e0f8a28d15p21 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:3459 0 OK 0x1.e097400000006p20 0x1.6fcae86be05b3p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:3459 1 OK 0x1.21c83698cc15p20 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3459 2 OK 0x1.4fb324b399f5ep21 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3459 3 OK 0x1.2e5f0748dbcb6p20 0x1.16f406e89be55p20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3459 4 OK 0x1.4967bc5b921abp21 0x1.16f406e89be55p20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3460 0 OK 0x1.e846f9d901e9fp20 0x1.e847de7976659p21 0x1.daee574cp0 0x1.658p7 -0x1.0ffffffff8028p4 0x1.6114p-15 F +REG epsg:3460 1 OK 0x1.645a450e89086p20 0x1.a3989cb0347c5p21 0x1.1b6cf4p1 0x1.5b0b07734dac8p7 -0x1.5fffffffddc27p4 0x1.4bf6p-15 F +REG epsg:3460 2 OK 0x1.3619de7cdb8b9p21 0x1.a398a56decf4ep21 0x1.1b6cf4p1 -0x1.600b07734dacep7 -0x1.5fffffffddc4ap4 0x1.4bfap-15 F +REG epsg:3460 3 OK 0x1.5d1bbd949048cp20 0x1.159210dbf8b0fp22 0x1.7bccef94p0 0x1.5b0b07735c6e7p7 -0x1.7fffffffd7707p3 0x1.7158p-15 F +REG epsg:3460 4 OK 0x1.39b91413f59f9p21 0x1.1592136b6ad46p22 0x1.7bccef98p0 -0x1.600b07735c6d7p7 -0x1.7fffffffd7731p3 0x1.715ap-15 F +REG epsg:3461 0 OK 0x1.e8446fe56c7b4p18 -0x1.efcda8d076786p6 -0x1.6735bfa1cp4 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3461 1 OK -0x1.ad934e5e6674p15 -0x1.0ef31cf44dap19 -0x1.0e13a8b98p3 -0x1.4000000000001p4 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3461 2 OK 0x1.018ed262e1bbbp20 -0x1.0ef31cf435faep19 -0x1.5d4caaa98p3 -0x1.3ffffffffffffp3 -0x1.3fffffffffffdp2 -0x1.8p-29 F +REG epsg:3461 3 OK -0x1.ad971650bfep15 0x1.0ed4205dc0456p19 -0x1.e0e7bafecp4 -0x1.4000000000001p4 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:3461 4 OK 0x1.018ef0a20f392p20 0x1.0ed4205da8a5cp19 -0x1.04422269p5 -0x1.3ffffffffffffp3 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:3462 0 OK 0x1.e8421cbb33e29p18 -0x1.efcdb2faedb97p6 -0x1.86ebaa3d8p4 -0x1.2000000000001p3 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:3462 1 OK -0x1.ada63fdd9f67p15 -0x1.0ef3228611e92p19 -0x1.332b415ap3 -0x1.c000000000001p3 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3462 2 OK 0x1.018e4057eeed3p20 -0x1.0ef32285ead6bp19 -0x1.b616009c8p3 -0x1.0p2 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:3462 3 OK -0x1.adaa07d455bbp15 0x1.0ed425eee32dbp19 -0x1.f3738b74cp4 -0x1.c000000000003p3 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3462 4 OK 0x1.018e5e96fd376p20 0x1.0ed425eebc23fp19 -0x1.1a747cdcap5 -0x1.0000000000002p2 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG epsg:3463 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.148p6 0x1.5cp5 0x0.0p0 F +REG epsg:3463 1 OK -0x1.8cea4cb9322ep16 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.30126c96fd076p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:3463 2 OK 0x1.0cf2a4cb9322ep20 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.f1db26d205f14p5 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:3463 3 OK -0x1.20c56a52693cp13 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.30126c9642e66p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:3463 4 OK 0x1.eccb15a949a4fp19 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.f1db26d37a334p5 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:3464 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.148p6 0x1.5cp5 0x0.0p0 F +REG epsg:3464 1 OK -0x1.8cea4cb9322ep16 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.30126c96fd076p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:3464 2 OK 0x1.0cf2a4cb9322ep20 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.f1db26d205f14p5 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:3464 3 OK -0x1.20c56a52693cp13 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.30126c9642e66p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:3464 4 OK 0x1.eccb15a949a4fp19 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.f1db26d37a334p5 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:3465 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG epsg:3465 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG epsg:3465 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG epsg:3465 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:3465 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:3466 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3466 1 OK 0x1.02d19c77044p14 -0x1.087061b7c104ap19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:3466 2 OK 0x1.20ecb98e23efp20 -0x1.087061b7c104ap19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:3466 3 OK 0x1.1be3a4fd1d818p16 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3466 4 OK 0x1.1339c5b02e27ep20 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3467 0 OK 0x0.0p0 0x1.96adf1aec1aa1p19 0x0.0p0 -0x1.34p7 0x1.cbffffffffffep5 0x0.0p0 F +REG epsg:3467 1 OK -0x1.18171f0f3270bp21 -0x1.4125960900542p18 0x0.0p0 0x1.642a4c850f0f2p7 0x1.54p5 0x0.0p0 F +REG epsg:3467 2 OK 0x1.18171f0f32714p21 -0x1.412596090051dp18 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.54p5 0x0.0p0 F +REG epsg:3467 3 OK -0x1.cbba8109d854ep19 0x1.49526b059ff17p21 0x0.0p0 0x1.642a4c850f0f2p7 0x1.22p6 0x0.0p0 F +REG epsg:3467 4 OK 0x1.cbba8109d855bp19 0x1.49526b059ff18p21 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.22p6 0x0.0p0 F +REG epsg:3468 0 OK 0x1.8fbe978036a34p19 0x1.18cf360b43f08p19 0x0.0p0 -0x1.0b55555555557p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:3468 1 OK 0x1.6e66e9057dp17 0x1.ca9154cf8ep15 0x0.0p0 -0x1.1db1b1b64ab15p7 0x1.9fffffffffbaap5 0x0.0p0 F +REG epsg:3468 2 OK 0x1.617cb717a7deep20 0x1.d252ddb583bp15 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:3468 3 OK 0x1.4aba437879f4p18 0x1.1c6f1a198f6f4p20 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.effffffffff93p5 0x0.0p0 F +REG epsg:3468 4 OK 0x1.3d41bfcebc39cp20 0x1.1ccf3b7cbc02cp20 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.effffffffff94p5 0x0.0p0 F +REG epsg:3469 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG epsg:3469 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.2d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3469 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.0afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3469 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.2d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3469 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.0afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3470 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG epsg:3470 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.35035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3470 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.12fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3470 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.35035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3470 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.12fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3471 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG epsg:3471 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.3d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3471 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.1afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3471 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.3d035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3471 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.1afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3472 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG epsg:3472 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.45035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3472 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.22fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3472 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.45035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3472 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.22fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3473 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG epsg:3473 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.4d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3473 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.2afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3473 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.4d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3473 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.2afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3474 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG epsg:3474 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.55035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3474 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.32fcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3474 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.55035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3474 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.32fcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3475 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG epsg:3475 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.5d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3475 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.3afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3475 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.5d035501f888p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3475 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.3afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3476 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG epsg:3476 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.65035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:3476 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.42fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:3476 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.65035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:3476 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.42fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:3477 0 OK 0x1.e848p19 0x1.33df8afe9429fp17 0x0.0p0 -0x1.6p7 0x1.a355555555154p5 0x0.0p0 F +REG epsg:3477 1 OK 0x1.4422779e37856p19 -0x1.1ed11dc93382bp17 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG epsg:3477 2 OK 0x1.4636c430e43d5p20 -0x1.1ed11dc93382bp17 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG epsg:3477 3 OK 0x1.580525cdf719ep19 0x1.d741d626e2c06p18 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG epsg:3477 4 OK 0x1.3c456d1904731p20 0x1.d741d626e2c06p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG epsg:3478 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:3478 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3478 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3478 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:3478 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3479 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:3479 1 OK -0x1.2955adc19bf6cp20 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3479 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3479 3 OK -0x1.f51cd4f10d26dp19 0x1.c8caf79f992b5p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:3479 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3480 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:3480 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3480 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3480 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3480 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3481 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:3481 1 OK -0x1.2955adc19bf4ap20 -0x1.b1576a448ef9fp20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3481 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3481 3 OK -0x1.f51cd4f10d22bp19 0x1.c8caf79f992b3p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3481 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3482 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:3482 1 OK -0x1.6a878bb7ed38p18 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3482 2 OK 0x1.859fc5dbf69cp19 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3482 3 OK -0x1.317ed19066ebep18 0x1.16785ef123969p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:3482 4 OK 0x1.691b68c83375fp19 0x1.16785ef123969p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:3483 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:3483 1 OK -0x1.2959acb81e492p20 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3483 2 OK 0x1.3f92d65c0f249p21 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3483 3 OK -0x1.f5240678a3757p19 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3483 4 OK 0x1.282f019e28dd5p21 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3484 0 OK 0x1.86ap18 0x1.9bb240973abadp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:3484 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b129p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3484 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b129p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3484 3 OK 0x1.797b25aa020dcp17 0x1.3735788b95813p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3484 4 OK 0x1.284136957f7c9p19 0x1.3735788b95813p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3485 0 OK 0x1.4064d5553261cp20 0x1.51ad3e78a054ep18 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:3485 1 OK 0x1.25a5b3020ca3dp19 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3485 2 OK 0x1.edf6d1295e71ap20 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:3485 3 OK 0x1.359cf3f53fba3p19 0x1.fe8320bb299fep19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3485 4 OK 0x1.e5fb30afc4e66p20 0x1.fe8320bb299fep19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:3486 0 OK 0x1.86ap18 0x1.f85a78d71c1e8p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:3486 1 OK 0x1.390d3a7ad5114p17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3486 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3486 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3486 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3487 0 OK 0x1.4064d5553261cp20 0x1.9dacc412dbbd3p20 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:3487 1 OK 0x1.00c480df08f65p19 0x1.cae97f93705a1p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3487 2 OK 0x1.0033b51d70243p21 0x1.cae97f93705a1p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:3487 3 OK 0x1.132c692442758p19 0x1.2d456552182ddp21 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3487 4 OK 0x1.f73376184388cp20 0x1.2d456552182ddp21 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:3488 0 OK 0x0.0p0 -0x1.dbb469232363dp20 0x0.0p0 -0x1.dffffffffffffp6 0x1.4400000000002p4 0x0.0p0 F +REG epsg:3488 1 OK -0x1.e3bcdf3fff717p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:3488 2 OK 0x1.e3bcdf3fff711p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:3488 3 OK -0x1.613869004e067p20 -0x1.699d483196edp17 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3488 4 OK 0x1.613869004e063p20 -0x1.699d483196edp17 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3489 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:3489 1 OK 0x1.a694a7721358p20 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:3489 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:3489 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:3489 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:3490 0 OK 0x1.907e0aab020c9p22 0x1.f84139ea5bec8p20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:3490 1 OK 0x1.5a9aac8aa75adp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:3490 2 OK 0x1.c66168cb5cbddp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG epsg:3490 3 OK 0x1.5e3cf1995b983p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:3490 4 OK 0x1.c2bf23bca8808p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:3491 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:3491 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:3491 2 OK 0x1.12833bad34ff3p21 0x1.7686899058616p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:3491 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6c2p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:3491 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:3492 0 OK 0x1.907e0aab020c9p22 0x1.f0d0c4b71a618p20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:3492 1 OK 0x1.5eab6b70b08cdp22 0x1.33306016f5618p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:3492 2 OK 0x1.c250a9e5538bdp22 0x1.33306016f5604p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:3492 3 OK 0x1.619d4b79c2d2p22 0x1.5a314358c1612p21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:3492 4 OK 0x1.bf5ec9dc4146bp22 0x1.5a314358c1608p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:3493 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:3493 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:3493 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:3493 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:3493 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:3494 0 OK 0x1.907e0aab020c9p22 0x1.e66c4c0a100b3p20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:3494 1 OK 0x1.643b4190e173ep22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:3494 2 OK 0x1.bcc0d3c522a5cp22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:3494 3 OK 0x1.6677dd7c37cccp22 0x1.4a4240453b028p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:3494 4 OK 0x1.ba8437d9cc4cep22 0x1.4a4240453b028p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:3495 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:3495 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:3495 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:3495 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:3495 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:3496 0 OK 0x1.907e0aab020c9p22 0x1.e5aadbb861009p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:3496 1 OK 0x1.64ab3a8ebe896p22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:3496 2 OK 0x1.bc50dac7458fcp22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:3496 3 OK 0x1.66c728b16e633p22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:3496 4 OK 0x1.ba34eca495b5fp22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:3497 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:3497 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:3497 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:3497 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:3497 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:3498 0 OK 0x1.907e0aab020c9p22 0x1.e7dc46f7cec99p20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:3498 1 OK 0x1.639369c06914p22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:3498 2 OK 0x1.bd68ab959b05bp22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:3498 3 OK 0x1.65a65a5ce593p22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:3498 4 OK 0x1.bb55baf91e86ap22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:3499 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:3499 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:3499 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:3499 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:3499 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:3500 0 OK 0x1.907e0aab020c9p22 0x1.dcbd320fca31ap20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:3500 1 OK 0x1.697149d028833p22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:3500 2 OK 0x1.b78acb85db95ap22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:3500 3 OK 0x1.6af09de1e9cf6p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:3500 4 OK 0x1.b60b77741a498p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:3501 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:3501 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:3501 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:3501 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:3501 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:3502 0 OK 0x1.6e36000000004p21 0x1.4959ca39b0238p20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:3502 1 OK 0x1.165b50c53d54dp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:3502 2 OK 0x1.c610af3ac2abbp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:3502 3 OK 0x1.1af84f5f35b68p21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:3502 4 OK 0x1.c173b0a0ca4ap21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:3503 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:3503 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:3503 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:3503 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:3503 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:3504 0 OK 0x1.6e36000000004p21 0x1.349e033e4d4bp20 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:3504 1 OK 0x1.2c1b34e9bf8dfp21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:3504 2 OK 0x1.b050cb1640729p21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:3504 3 OK 0x1.2edc82fbcaf4dp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:3504 4 OK 0x1.ad8f7d04350bbp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:3505 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:3505 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:3505 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:3505 3 OK 0x1.60a2ad403160fp19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:3505 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:3506 0 OK 0x1.6e36000000004p21 0x1.42aa603777e92p20 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:3506 1 OK 0x1.1d7ce35315bap21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:3506 2 OK 0x1.beef1cacea468p21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:3506 3 OK 0x1.213c0acae25b4p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:3506 4 OK 0x1.bb2ff5351da54p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:3507 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abb7p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:3507 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:3507 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:3507 3 OK 0x1.75e64473bf831p17 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3507 4 OK 0x1.985d2bcd7fae6p18 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3508 0 OK 0x1.e848000000005p19 0x1.500fa66b4a167p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:3508 1 OK 0x1.2cd17519787cp19 0x1.336c49b7fa353p18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:3508 2 OK 0x1.51df457343c25p20 0x1.336c49b7fa353p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:3508 3 OK 0x1.32acebaa46e8ap19 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3508 4 OK 0x1.4ef18a2adc8cp20 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3509 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:3509 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:3509 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:3509 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:3509 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:3510 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:3510 1 OK -0x1.3b284352bd372p20 -0x1.adf90da921e84p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:3510 2 OK 0x1.3dc68c5566cd6p21 -0x1.adf90da921e83p20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:3510 3 OK -0x1.fc8e1e7bfa79ep19 0x1.cc6842bfb4f9fp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:3510 4 OK 0x1.1f55f24b06d03p21 0x1.cc6842bfb4fap20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:3511 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:3511 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3511 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3511 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3511 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3512 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:3512 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3512 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3512 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3512 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3513 0 OK 0x1.86ap18 0x1.96480dd1d2e11p18 0x0.0p0 -0x1.5p6 0x1.bbffffffffffep4 0x0.0p0 F +REG epsg:3513 1 OK -0x1.de96bdd8a0d5cp18 -0x1.768b3d3936413p18 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:3513 2 OK 0x1.3af5af7628357p20 -0x1.768b3d3936413p18 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:3513 3 OK -0x1.6f31ce783807cp18 0x1.36f299ee9091p20 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3513 4 OK 0x1.1f1c739e0e01fp20 0x1.36f299ee9091p20 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:3514 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:3514 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002aep16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:3514 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002aep16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:3514 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:3514 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:3515 0 OK 0x1.e097400000006p20 0x1.36c124f6ea723p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:3515 1 OK 0x1.41af8ade6517p20 -0x1.312f13394fda2p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:3515 2 OK 0x1.3fbf7a90cd745p21 -0x1.312f13394fda2p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:3515 3 OK 0x1.472fd7933cbd8p20 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:3515 4 OK 0x1.3cff543661a11p21 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:3516 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:3516 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3516 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3516 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3516 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3517 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:3517 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3517 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:3517 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3517 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:3518 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3518 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:3518 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:3518 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3518 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3519 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3519 1 OK -0x1.331c47ab8351ap20 -0x1.b1c692296f919p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:3519 2 OK 0x1.39c08e81c9daap21 -0x1.b1c692296f919p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:3519 3 OK -0x1.062aefbe75fbdp20 0x1.c850c02f2b578p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3519 4 OK 0x1.2347e28b432fap21 0x1.c850c02f2b579p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3520 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3520 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:3520 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:3520 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3520 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3521 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:3521 1 OK 0x1.75870bf1b12dp18 -0x1.b1c692296f919p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:3521 2 OK 0x1.00ffc9eae0d48p22 -0x1.b1c692296f919p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:3521 3 OK 0x1.14a635d2f3426p19 0x1.c850c02f2b579p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3521 4 OK 0x1.eb86e7df3afe2p21 0x1.c850c02f2b578p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:3522 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:3522 1 OK -0x1.81a5a9c8e8128p16 -0x1.04cdd2a40a263p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3522 2 OK 0x1.0c3e5a9c8e818p20 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3522 3 OK -0x1.7ac864be1088p13 0x1.19e94e9402c21p19 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3522 4 OK 0x1.ee332192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3523 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:3523 1 OK -0x1.3c4f9c92268acp18 -0x1.abd3c4bd17e74p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3523 2 OK 0x1.b807fe3e4d034p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3523 3 OK -0x1.36ae48a5526ap15 0x1.ce73bbe339dbfp20 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3523 4 OK 0x1.9558c3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3524 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:3524 1 OK -0x1.85616a723a06p18 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3524 2 OK 0x1.8600b5391d03p19 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3524 3 OK -0x1.30ce4325f0855p18 0x1.19e94e9402c22p19 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3524 4 OK 0x1.5bb72192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3525 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:3525 1 OK -0x1.3f5f872489a3ep20 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3525 2 OK 0x1.3fe22e3e4d033p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3525 3 OK -0x1.f402248a55288p19 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3525 4 OK 0x1.1d32f3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3526 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:3526 1 OK 0x1.89215ec34d45p17 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3526 2 OK 0x1.557bd42796576p20 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3526 3 OK 0x1.192388e235138p18 0x1.19e84b4359962p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3526 4 OK 0x1.40571dc772bb2p20 0x1.19e84b4359962p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3527 0 OK 0x1.4064d5560418cp21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:3527 1 OK 0x1.4272e3f9da294p19 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3527 2 OK 0x1.181678d6c8d3ap22 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:3527 3 OK 0x1.cd2f4e1a7f8fp19 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3527 4 OK 0x1.06beeb92b426ep22 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:3528 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3528 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3528 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3528 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3528 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3529 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3529 1 OK -0x1.d337aa27ec9e1p19 -0x1.aeabd35d8d29ap20 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3529 2 OK 0x1.65198a89fb275p21 -0x1.aeabd35d8d29cp20 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3529 3 OK -0x1.5f3708e5701fbp19 0x1.cbaec69ae12c3p20 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3529 4 OK 0x1.481962395c07cp21 0x1.cbaec69ae12c1p20 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3530 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3530 1 OK 0x1.a750195edb798p16 -0x1.06875fc1616cep19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3530 2 OK 0x1.3b56fe6a1248cp20 -0x1.06875fc1616cdp19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dcp4 0x0.0p0 F +REG epsg:3530 3 OK 0x1.6115074dc79c6p17 0x1.1836b2e30beebp19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3530 4 OK 0x1.29a95f16470ccp20 0x1.1836b2e30beecp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3531 0 OK 0x1.18583aaa99311p21 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:3531 1 OK 0x1.5b346afe606c8p18 -0x1.aea818b495afap20 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3531 2 OK 0x1.02a4f3fab32a9p22 -0x1.aea818b495af9p20 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:3531 3 OK 0x1.2199d59dc334ep19 0x1.cbaacba2be8fep20 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3531 4 OK 0x1.e849ffedc1956p21 0x1.cbaacba2be8ffp20 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:3532 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:3532 1 OK -0x1.e136f546b674cp18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3532 2 OK 0x1.52437aa35b3b1p19 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3532 3 OK -0x1.9852805abae41p18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3532 4 OK 0x1.2dd1402d5d72ap19 0x1.928ff7cb858e7p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3533 0 OK 0x1.4064d54fdf3b9p18 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:3533 1 OK -0x1.8ab2401dc3b64p20 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3533 2 OK 0x1.15725562d9aa9p21 -0x1.cbf7744da7f42p19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3533 3 OK -0x1.4ee8c9d0e722cp20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3533 4 OK 0x1.ef1b3478d6c19p20 0x1.4a2f5d1b870c9p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3534 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:3534 1 OK 0x1.2c090ab9498b4p18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3534 2 OK 0x1.6c71bd51ad9d3p20 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3534 3 OK 0x1.74ed7fa5451bfp18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3534 4 OK 0x1.5a38a016aeb9p20 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3535 0 OK 0x1.6871700000004p21 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:3535 1 OK 0x1.ec2ed51c88f6cp19 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3535 2 OK 0x1.2aeb955c6ee16p22 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:3535 3 OK 0x1.31e0e0db210eep20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3535 4 OK 0x1.1bf937c937bc8p22 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:3536 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3536 1 OK 0x1.3cc6ee6e8294ep20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3536 2 OK 0x1.9fa511917d6b2p20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3536 3 OK 0x1.3f7cec2641663p20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3536 4 OK 0x1.9cef13d9be99dp20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3537 0 OK 0x1.2c5e880000003p22 0x1.b7c99ac66682ep21 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:3537 1 OK 0x1.03d2bd0e9684ap22 0x1.6a5697a973562p21 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3537 2 OK 0x1.54ea52f1697bcp22 0x1.6a5697a973562p21 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:3537 3 OK 0x1.060bf4adabb8cp22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3537 4 OK 0x1.52b11b525447ap22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:3538 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:3538 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3538 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3538 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3538 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3539 0 OK 0x1.907e0aaacd9ecp20 0x1.3d3f567def798p18 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:3539 1 OK 0x1.d9f3bc9d1907p19 -0x1.346e3812466f1p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3539 2 OK 0x1.1a011b83875c8p21 -0x1.346e3812466f1p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:3539 3 OK 0x1.eb292b95746acp19 0x1.e0253b431c934p19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3539 4 OK 0x1.15b3bfc57083ap21 0x1.e0253b431c934p19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:3540 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:3540 1 OK 0x1.cb1f1458ef103p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3540 2 OK 0x1.13d83ae9c43b6p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3540 3 OK 0x1.d81683a3ea361p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3540 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3541 0 OK 0x1.4064d5553261cp20 0x1.01dcb007f3f81p18 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:3541 1 OK 0x1.7893406bdf08p19 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3541 2 OK 0x1.c4800a74753e8p20 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:3541 3 OK 0x1.8335e132b4628p19 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3541 4 OK 0x1.bf2eba110a914p20 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:3542 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:3542 1 OK 0x1.651ae3466f2f2p17 0x1.225e5e1328bcap18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3542 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bcap18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3542 3 OK 0x1.7a4c446942232p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3542 4 OK 0x1.280ceee5af77dp19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3543 0 OK 0x1.4064d5553261cp20 0x1.94d890b712fafp20 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:3543 1 OK 0x1.24e688993b282p19 0x1.dc5355d74337p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3543 2 OK 0x1.ee56665dc7308p20 0x1.dc5355d74337p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:3543 3 OK 0x1.3648799a8a6c2p19 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3543 4 OK 0x1.e5a56ddd1f8e6p20 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:3544 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:3544 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:3544 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:3544 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:3544 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:3545 0 OK 0x1.907e0aac08315p20 0x1.04cae2b6b9b91p18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:3545 1 OK 0x1.0aeb10e9b927p20 -0x1.feccc02444d94p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:3545 2 OK 0x1.0b0882372b9ddp21 -0x1.feccc02444d94p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:3545 3 OK 0x1.1034910620ffcp20 0x1.89d6f5d769758p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:3545 4 OK 0x1.0863c228f7b17p21 0x1.89d6f5d769758p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:3546 0 OK 0x1.6e36p20 0x1.13c08027f5c87p20 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:3546 1 OK 0x1.2cbd88791104cp20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3546 2 OK 0x1.afae7786eefb4p20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3546 3 OK 0x1.30b9c63bda1abp20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3546 4 OK 0x1.abb239c425e55p20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3547 0 OK 0x1.2c5e880000003p22 0x1.c4591d51ef696p21 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:3547 1 OK 0x1.ed56e9caddbb6p21 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3547 2 OK 0x1.62119b1a9122bp22 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:3547 3 OK 0x1.f3e088b4bdff2p21 0x1.16d727df74a24p22 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3547 4 OK 0x1.5ecccba5a100dp22 0x1.16d727df74a24p22 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:3548 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:3548 1 OK 0x1.36785c3381cdep18 0x1.93766c01072c4p18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:3548 2 OK 0x1.4d0bd1e63f187p19 0x1.93766c01072c4p18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:3548 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:3548 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:3549 0 OK 0x1.907e0aac08315p20 0x1.d79a53ca86cdfp20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:3549 1 OK 0x1.fd4ce85362396p19 0x1.4aec624c3c358p20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:3549 2 OK 0x1.112ad0972fa28p21 0x1.4aec624c3c358p20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:3549 3 OK 0x1.04b1690895058p20 0x1.33abac378504bp21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:3549 4 OK 0x1.0e255627bdae1p21 0x1.33abac378504bp21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:3550 0 OK 0x1.e848p19 0x1.d532d46be5665p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:3550 1 OK 0x1.6fab4a4b43fbfp19 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3550 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3550 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3550 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3551 0 OK 0x1.907e0aaa99312p21 0x1.80d72f309a9c2p18 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:3551 1 OK 0x1.2d90b4fd585dcp21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3551 2 OK 0x1.f36b6057da04p21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:3551 3 OK 0x1.3214ef0c8300ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3551 4 OK 0x1.eee72648af60ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:3552 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:3552 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3552 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3552 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3552 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3553 0 OK 0x1.907e0aaa99312p21 0x1.86a7c427d74f8p18 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:3553 1 OK 0x1.2c2fc6b261b4ap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3553 2 OK 0x1.f4cc4ea2d0adap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:3553 3 OK 0x1.3080083a31b84p21 0x1.27283341722fap20 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3553 4 OK 0x1.f07c0d1b00aap21 0x1.27283341722fap20 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:3554 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.148p6 0x1.5cp5 0x0.0p0 F +REG epsg:3554 1 OK -0x1.8cea4cb9322ep16 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.30126c96fd076p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:3554 2 OK 0x1.0cf2a4cb9322ep20 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.f1db26d205f14p5 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:3554 3 OK -0x1.20c56a52693cp13 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.30126c9642e66p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:3554 4 OK 0x1.eccb15a949a4fp19 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.f1db26d37a334p5 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:3555 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:3555 1 OK 0x1.7e3b0ade7c6b8p16 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.2b39bac64b449p6 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:3555 2 OK 0x1.3de84f5218394p20 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.e78c8a736976fp5 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:3555 3 OK 0x1.75a4e0362c05cp17 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.2b39bac587a75p6 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:3555 4 OK 0x1.271763f93a7f4p20 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.e78c8a74f0b16p5 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:3556 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.198p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3556 1 OK -0x1.258170cf9dfa8p18 -0x1.045c58ea73f2bp19 0x0.0p0 -0x1.34c5ceb6f8417p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3556 2 OK 0x1.b7b8b867cefddp19 -0x1.045c58ea73f2ap19 0x0.0p0 -0x1.fc7462920f7dp5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3556 3 OK -0x1.9ac570c807e5ap17 0x1.1a5791ee1ae34p19 0x0.0p0 -0x1.34c5ceb64fe08p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3556 4 OK 0x1.8ba95c3201f9ep19 0x1.1a5791ee1ae35p19 0x0.0p0 -0x1.fc746293603efp5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3557 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:3557 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:3557 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:3557 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:3557 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:3558 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3558 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3558 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:3558 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3558 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:3559 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:3559 1 OK 0x1.7f67f8df8368dp17 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:3559 2 OK 0x1.26c601c81f25dp19 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:3559 3 OK 0x1.92b98c3d8bc66p17 0x1.24621bba84e0bp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:3559 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84e0bp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:3560 0 OK 0x1.907e0aaacd9ecp20 0x1.b0bc7a657e017p21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:3560 1 OK 0x1.0c2d55f29f20ap20 0x1.70fa64a012202p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3560 2 OK 0x1.0a675fb17e0e7p21 0x1.70fa64a012202p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3560 3 OK 0x1.11e2b89aed1aep20 0x1.f1f0137167a99p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3560 4 OK 0x1.078cae5d57115p21 0x1.f1f0137167a99p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3561 0 OK 0x1.e75e8bc0ce644p18 0x1.1405ec62352d1p10 -0x1.6c7c9e8aep5 -0x1.37p7 0x1.2d55555555554p4 0x1.0p-29 F +REG epsg:3561 1 OK -0x1.50325c2165ee6p20 -0x1.b5daf6ed1a22ap20 -0x1.7daae31bap5 -0x1.4190cfacb33e6p7 0x1.baaaaaaa87daep3 0x1.cp-28 F +REG epsg:3561 2 OK 0x1.21f0d08d72a28p21 -0x1.b5daf6f5e0c58p20 -0x1.8a6895ea2p6 -0x1.2c6f30534cb52p7 0x1.baaaaaaa8815dp3 -0x1.0p-30 F +REG epsg:3561 3 OK -0x1.35abc8bed7b09p20 0x1.c3bea14cbc634p20 0x1.2be8472p3 -0x1.4190cfacc23bp7 0x1.7d555555374edp4 -0x1.0p-29 F +REG epsg:3561 4 OK 0x1.14ad871480794p21 0x1.c3bea14111bb1p20 -0x1.34929f082p5 -0x1.2c6f30533dcf7p7 0x1.7d55555537807p4 0x1.4p-27 F +REG epsg:3562 0 OK 0x1.e75d8c5077f43p18 0x1.1a3efddd86589p10 -0x1.f2d2f7528p4 -0x1.3955555555557p7 0x1.4555555555555p4 -0x1.0p-30 F +REG epsg:3562 1 OK -0x1.515b9f58cf805p20 -0x1.b54f8c23acab4p20 -0x1.0f710945ap5 -0x1.43ff74a32e43ap7 0x1.eaaaaaaa82fd9p3 0x1.0p-27 F +REG epsg:3562 2 OK 0x1.2285324cfc991p21 -0x1.b54f8c2d6e042p20 -0x1.54ac226ffp6 -0x1.2eab36077c5e2p7 0x1.eaaaaaaa83403p3 -0x1.0p-30 F +REG epsg:3562 3 OK -0x1.3488e36753e8fp20 0x1.c45cd181f5a0fp20 0x1.8550bbeacp4 -0x1.43ff74a33ccb3p7 0x1.9555555531b47p4 -0x1.0p-29 F +REG epsg:3562 4 OK 0x1.141bd48f044b9p21 0x1.c45cd175cc4d9p20 -0x1.7afe001fcp4 -0x1.2eab36076decep7 0x1.9555555531efp4 0x1.cp-28 F +REG epsg:3563 0 OK 0x1.e75c85680b8c3p18 0x1.1c655b1cf5d0ep10 -0x1.3eada51c4p4 -0x1.3cp7 0x1.52aaaaaaaaaadp4 -0x1.0p-30 F +REG epsg:3563 1 OK -0x1.52061a7523102p20 -0x1.b503e631327e6p20 -0x1.6d83a117p4 -0x1.46b9354850b5cp7 0x1.02aaaaaa95505p4 0x1.8p-28 F +REG epsg:3563 2 OK 0x1.22da2e20e45e3p21 -0x1.b503e63b8432cp20 -0x1.2982898d4p6 -0x1.3146cab7af434p7 0x1.02aaaaaa95744p4 -0x1.0p-29 F +REG epsg:3563 3 OK -0x1.33e7738508feap20 0x1.c4b84d4ba8e8dp20 0x1.1e54b13b4p5 -0x1.46b935485ed01p7 0x1.a2aaaaaa834cep4 -0x1.0p-29 F +REG epsg:3563 4 OK 0x1.13cadae4e683fp21 0x1.c4b84d3f36fa6p20 -0x1.8ba3edf58p3 -0x1.3146cab7a13e8p7 0x1.a2aaaaaa838dap4 0x1.2p-27 F +REG epsg:3564 0 OK 0x1.e75b8638f650ep18 0x1.1d3af80784366p10 -0x1.1bc871f88p3 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG epsg:3564 1 OK -0x1.528dae869ee9ep20 -0x1.b4c4dcd054e73p20 -0x1.7ad542ad8p3 -0x1.49c5d1c731143p7 0x1.0d5555553ea8ap4 0x1.8p-28 F +REG epsg:3564 2 OK 0x1.231db85dbbbfcp21 -0x1.b4c4dcdb1c58ap20 -0x1.fd2e6ffbep5 -0x1.343a2e38cee68p7 0x1.0d5555553eceap4 -0x1.0p-28 F +REG epsg:3564 3 OK -0x1.3362e5e623a5ap20 0x1.c4ffc13def70bp20 0x1.7742f16c2p5 -0x1.49c5d1c73ebefp7 0x1.ad5555552a9bp4 0x1.0p-29 F +REG epsg:3564 4 OK 0x1.1388544a8170fp21 0x1.c4ffc1314307p20 -0x1.64497a64p0 -0x1.343a2e38c1509p7 0x1.ad5555552ae17p4 0x1.2p-27 F +REG epsg:3565 0 OK 0x1.e75b217ba44cp18 0x1.1b75629e42e6cp10 -0x1.b0877f04p2 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG epsg:3565 1 OK -0x1.526cea3751296p20 -0x1.b4d6194716628p20 -0x1.30b35d388p3 -0x1.4b17f4409c2c7p7 0x1.0aaaaaaa94554p4 0x1.cp-28 F +REG epsg:3565 2 OK 0x1.230d3d068b1dcp21 -0x1.b4d61951c80e4p20 -0x1.eb378b08cp5 -0x1.3592b66a0e78bp7 0x1.0aaaaaaa947aap4 0x1.0p-28 F +REG epsg:3565 3 OK -0x1.338555032459cp20 0x1.c4ee833b0dcb6p20 0x1.86e2e356cp5 -0x1.4b17f440a9f51p7 0x1.aaaaaaaa80dp4 -0x1.0p-28 F +REG epsg:3565 4 OK 0x1.139972a931993p21 0x1.c4ee832e66b6bp20 0x1.ddb235ep-2 -0x1.3592b66a00c52p7 0x1.aaaaaaaa81152p4 0x1.2p-27 F +REG epsg:3566 0 OK 0x1.907e0aaacd9ecp20 0x1.aa3e4bb76c698p22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:3566 1 OK 0x1.7593893be5e41p19 0x1.77a131b627cc9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3566 2 OK 0x1.3319285bd4254p21 0x1.77a131b627cc9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3566 3 OK 0x1.913c06bbf6b0cp19 0x1.de99c6df35e9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3566 4 OK 0x1.2c2f08fbcff22p21 0x1.de99c6df35e9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3567 0 OK 0x1.907e0aaacd9ecp20 0x1.35b8c9df6e973p23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:3567 1 OK 0x1.edaaf48d75935p19 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3567 2 OK 0x1.15134d8770397p21 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3567 3 OK 0x1.fb4045b9b4a78p19 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3567 4 OK 0x1.11adf93c60746p21 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3568 0 OK 0x1.907e0aaacd9ecp20 0x1.b0bc7a657e017p21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:3568 1 OK 0x1.0c2d55f29f20ap20 0x1.70fa64a012202p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3568 2 OK 0x1.0a675fb17e0e7p21 0x1.70fa64a012202p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3568 3 OK 0x1.11e2b89aed1aep20 0x1.f1f0137167a99p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3568 4 OK 0x1.078cae5d57115p21 0x1.f1f0137167a99p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3569 0 OK 0x1.907e0aaacd9ecp20 0x1.aa3e4bb76c698p22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:3569 1 OK 0x1.7593893be5e41p19 0x1.77a131b627cc9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3569 2 OK 0x1.3319285bd4254p21 0x1.77a131b627cc9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3569 3 OK 0x1.913c06bbf6b0cp19 0x1.de99c6df35e9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3569 4 OK 0x1.2c2f08fbcff22p21 0x1.de99c6df35e9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3570 0 OK 0x1.907e0aaacd9ecp20 0x1.35b8c9df6e973p23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:3570 1 OK 0x1.edaaf48d75935p19 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3570 2 OK 0x1.15134d8770397p21 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3570 3 OK 0x1.fb4045b9b4a78p19 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3570 4 OK 0x1.11adf93c60746p21 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3571 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 0x1.68p7 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3571 1 OK -0x1.d826d2218e41p18 -0x1.1098cd0a6adb6p18 0x0.0p0 0x1.dffffffffffffp6 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3571 2 OK 0x1.d826d2218e411p18 -0x1.1098cd0a6adb2p18 0x0.0p0 -0x1.dfffffffffffep6 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3571 3 OK -0x1.79d87f2a2b357p16 -0x1.b44c727f91c2dp15 0x0.0p0 0x1.dffffffffffffp6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3571 4 OK 0x1.79d87f2a2b359p16 -0x1.b44c727f91c27p15 0x0.0p0 -0x1.dfffffffffffep6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3572 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 -0x1.2cp7 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3572 1 OK -0x1.d826d2218e40dp18 -0x1.1098cd0a6adbap18 0x0.0p0 0x1.2cp7 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3572 2 OK 0x1.d826d2218e41p18 -0x1.1098cd0a6adb6p18 0x0.0p0 -0x1.68p6 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3572 3 OK -0x1.79d87f2a2b356p16 -0x1.b44c727f91c33p15 0x0.0p0 0x1.2cp7 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3572 4 OK 0x1.79d87f2a2b357p16 -0x1.b44c727f91c2dp15 0x0.0p0 -0x1.68p6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3573 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 -0x1.9p6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3573 1 OK -0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.4p7 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3573 2 OK 0x1.d826d2218e41p18 -0x1.1098cd0a6adb6p18 0x0.0p0 -0x1.3ffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3573 3 OK -0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 -0x1.4p7 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3573 4 OK 0x1.79d87f2a2b357p16 -0x1.b44c727f91c2dp15 0x0.0p0 -0x1.3ffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3574 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 -0x1.4p5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3574 1 OK -0x1.d826d2218e41p18 -0x1.1098cd0a6adb6p18 0x0.0p0 -0x1.9000000000001p6 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3574 2 OK 0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 0x1.3ffffffffffffp4 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3574 3 OK -0x1.79d87f2a2b357p16 -0x1.b44c727f91c2dp15 0x0.0p0 -0x1.9000000000001p6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3574 4 OK 0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 0x1.3ffffffffffffp4 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3575 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 0x1.4p3 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3575 1 OK -0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.8ffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3575 2 OK 0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 0x1.18p6 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3575 3 OK -0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 -0x1.8ffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3575 4 OK 0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 0x1.18p6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3576 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 0x1.68p6 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3576 1 OK -0x1.d826d2218e41p18 -0x1.1098cd0a6adb6p18 0x0.0p0 0x1.dfffffffffffep4 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3576 2 OK 0x1.d826d2218e41p18 -0x1.1098cd0a6adb6p18 0x0.0p0 0x1.2cp7 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3576 3 OK -0x1.79d87f2a2b357p16 -0x1.b44c727f91c2dp15 0x0.0p0 0x1.dfffffffffffep4 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3576 4 OK 0x1.79d87f2a2b357p16 -0x1.b44c727f91c2dp15 0x0.0p0 0x1.2cp7 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3577 0 OK 0x0.0p0 -0x1.d548b0cf1664ap20 0x0.0p0 0x1.08p7 -0x1.1ffffffffffffp4 0x0.0p0 F +REG epsg:3577 1 OK -0x1.645831c4ae432p20 -0x1.c25bea00c1bafp21 0x0.0p0 0x1.d0e98a4ce3089p6 -0x1.0800000000002p5 0x0.0p0 F +REG epsg:3577 2 OK 0x1.645831c4ae432p20 -0x1.c25bea00c1bafp21 0x0.0p0 0x1.278b3ad98e7bcp7 -0x1.0800000000002p5 0x0.0p0 F +REG epsg:3577 3 OK -0x1.c747c0847216ap20 -0x1.9d93c2072c975p18 0x0.0p0 0x1.d0e98a4ce3089p6 -0x1.8000000000014p1 0x0.0p0 F +REG epsg:3577 4 OK 0x1.c747c0847216ap20 -0x1.9d93c2072c975p18 0x0.0p0 0x1.278b3ad98e7bcp7 -0x1.8000000000014p1 0x0.0p0 F +REG epsg:3578 0 OK 0x1.e848p18 0x1.e8da2d5d358e8p19 0x0.0p0 -0x1.09p7 0x1.fbffffffffffap5 0x0.0p0 F +REG epsg:3578 1 OK -0x1.862219ae909fep19 0x1.9b6aaeb1f6872p17 0x0.0p0 -0x1.31574215d4f9p7 0x1.b400000000002p5 0x0.0p0 F +REG epsg:3578 2 OK 0x1.b7350cd7484ffp20 0x1.9b6aaeb1f6872p17 0x0.0p0 -0x1.c1517bd4560dfp6 0x1.b400000000002p5 0x0.0p0 F +REG epsg:3578 3 OK -0x1.51f213fed247cp17 0x1.01bd4c09220cp21 0x0.0p0 -0x1.31574215d4f9p7 0x1.22p6 0x0.0p0 F +REG epsg:3578 4 OK 0x1.1e62427fda49p20 0x1.01bd4c09220cp21 0x0.0p0 -0x1.c1517bd4560dfp6 0x1.22p6 0x0.0p0 F +REG epsg:3579 0 OK 0x1.e848p18 0x1.e8da2d5d358e8p19 0x0.0p0 -0x1.09p7 0x1.fbffffffffffap5 0x0.0p0 F +REG epsg:3579 1 OK -0x1.862219ae909fep19 0x1.9b6aaeb1f6872p17 0x0.0p0 -0x1.31574215d4f9p7 0x1.b400000000002p5 0x0.0p0 F +REG epsg:3579 2 OK 0x1.b7350cd7484ffp20 0x1.9b6aaeb1f6872p17 0x0.0p0 -0x1.c1517bd4560dfp6 0x1.b400000000002p5 0x0.0p0 F +REG epsg:3579 3 OK -0x1.51f213fed247cp17 0x1.01bd4c09220cp21 0x0.0p0 -0x1.31574215d4f9p7 0x1.22p6 0x0.0p0 F +REG epsg:3579 4 OK 0x1.1e62427fda49p20 0x1.01bd4c09220cp21 0x0.0p0 -0x1.c1517bd4560dfp6 0x1.22p6 0x0.0p0 F +REG epsg:3580 0 OK 0x0.0p0 0x1.3da5469f115bfp22 0x0.0p0 -0x1.cp6 0x1.17fffffffffd2p5 0x0.0p0 F +REG epsg:3580 1 OK -0x1.27d3503c9a7e8p21 0x1.b41e40739ad73p21 0x0.0p0 -0x1.049f8c80e38c9p7 0x1.3ffffffffff0ap4 0x0.0p0 F +REG epsg:3580 2 OK 0x1.27d3503c9a7e8p21 0x1.b41e40739ad73p21 0x0.0p0 -0x1.76c0e6fe38e6ep6 0x1.3ffffffffff0ap4 0x0.0p0 F +REG epsg:3580 3 OK -0x1.4620aad9153b3p20 0x1.b6b9f54f596e9p22 0x0.0p0 -0x1.049f8c80e38c9p7 0x1.8fffffffff9ccp5 0x0.0p0 F +REG epsg:3580 4 OK 0x1.4620aad9153b3p20 0x1.b6b9f54f596e9p22 0x0.0p0 -0x1.76c0e6fe38e6ep6 0x1.8fffffffff9ccp5 0x0.0p0 F +REG epsg:3581 0 OK 0x0.0p0 0x1.3da5469f115bfp22 0x0.0p0 -0x1.cp6 0x1.17fffffffffd2p5 0x0.0p0 F +REG epsg:3581 1 OK -0x1.27d3503c9a7e8p21 0x1.b41e40739ad73p21 0x0.0p0 -0x1.049f8c80e38c9p7 0x1.3ffffffffff0ap4 0x0.0p0 F +REG epsg:3581 2 OK 0x1.27d3503c9a7e8p21 0x1.b41e40739ad73p21 0x0.0p0 -0x1.76c0e6fe38e6ep6 0x1.3ffffffffff0ap4 0x0.0p0 F +REG epsg:3581 3 OK -0x1.4620aad9153b3p20 0x1.b6b9f54f596e9p22 0x0.0p0 -0x1.049f8c80e38c9p7 0x1.8fffffffff9ccp5 0x0.0p0 F +REG epsg:3581 4 OK 0x1.4620aad9153b3p20 0x1.b6b9f54f596e9p22 0x0.0p0 -0x1.76c0e6fe38e6ep6 0x1.8fffffffff9ccp5 0x0.0p0 F +REG epsg:3582 0 OK 0x1.4064d553f7cf1p20 0x1.3d1efd3b91187p18 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:3582 1 OK 0x1.3a7910c1d2d03p19 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:3582 2 OK 0x1.e38d22470636p20 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:3582 3 OK 0x1.4a5177c329c8p19 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:3582 4 OK 0x1.dba0eec65aba2p20 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:3583 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:3583 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:3583 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:3583 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:3583 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:3584 0 OK 0x1.907e0aac08315p20 0x1.57f5cca07ddf3p16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:3584 1 OK 0x1.35d5e8a5c7bd2p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:3584 2 OK 0x1.eb262cb248a58p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:3584 3 OK 0x1.3890cdb380798p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:3584 4 OK 0x1.e86b47a48fe92p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:3585 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:3585 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:3585 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:3585 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:3585 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:3586 0 OK 0x1.4064d55810628p19 0x1.51cf01db587dap21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:3586 1 OK 0x1.7b96f1026fcp14 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:3586 2 OK 0x1.3a76799406a38p20 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:3586 3 OK 0x1.bbb272668874p15 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:3586 4 OK 0x1.328741c4dc1eep20 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:3587 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:3587 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:3587 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:3587 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:3587 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:3588 0 OK 0x1.2c5eaf5eb851fp24 0x1.a8432a3145b09p18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:3588 1 OK 0x1.1e863b657d643p24 -0x1.962954cc373abp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:3588 2 OK 0x1.3a372357f33fap24 -0x1.962954cc373abp18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:3588 3 OK 0x1.1f9deb7dde65ap24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:3588 4 OK 0x1.391f733f923e3p24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:3589 0 OK 0x1.e848p22 0x1.f347dc7be971fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:3589 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:3589 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:3589 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:3589 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:3590 0 OK 0x1.907e3f28f5c29p24 0x1.9983d81e6921fp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:3590 1 OK 0x1.831fd4ce40c4cp24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:3590 2 OK 0x1.9ddca983aac05p24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:3590 3 OK 0x1.843129ecee803p24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:3590 4 OK 0x1.9ccb5464fd04ep24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:3591 0 OK 0x1.e820102717124p18 0x1.021b09b534a38p19 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c54p5 0x0.0p0 F +REG epsg:3591 1 OK -0x1.9b81a058acb8p16 -0x1.331112c037p11 0x0.0p0 -0x1.747029aea2077p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:3591 2 OK 0x1.0d79243918fb8p20 -0x1.922d16d199p10 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:3591 3 OK -0x1.78e84bb8396p12 0x1.0e768407c4d04p20 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f9268p5 0x0.0p0 F +REG epsg:3591 4 OK 0x1.eb6d7bde8efa8p19 0x1.0ebc1c9adda5p20 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f9267fp5 0x0.0p0 F +REG epsg:3592 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:3592 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:3592 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:3592 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:3592 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:3593 0 OK 0x1.907e3f28f5c28p23 0x1.818af27c31519p18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:3593 1 OK 0x1.7778c79e94e8bp23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:3593 2 OK 0x1.a983b6b3569c4p23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:3593 3 OK 0x1.7927ff3c5604fp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:3593 4 OK 0x1.a7d47f15957ffp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:3594 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:3594 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:3594 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:3594 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:3594 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:3595 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:3595 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3595 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3595 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:3595 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:3596 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:3596 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:3596 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:3596 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:3596 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:3597 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:3597 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3597 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3597 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3597 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3598 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:3598 1 OK -0x1.c528da114b511p19 -0x1.b202d186cc333p20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3598 2 OK 0x1.6195d68452d49p21 -0x1.b202d186cc333p20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3598 3 OK -0x1.6d13c32e22509p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3598 4 OK 0x1.4b9090cb88947p21 0x1.c81a512182c17p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3599 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:3599 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3599 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3599 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3599 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3600 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:3600 1 OK 0x1.7741a12d4899cp18 -0x1.b202d186cc333p20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3600 2 OK 0x1.00e42097275ep22 -0x1.b202d186cc333p20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:3600 3 OK 0x1.13b5e779cd4d6p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3600 4 OK 0x1.ebc2fb75847bep21 0x1.c81a512182c17p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:3601 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:3601 1 OK -0x1.61a577bff57e8p16 -0x1.06c963762fa92p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:3601 2 OK 0x1.0a3e577bff57ep20 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:3601 3 OK -0x1.3d4838806987p14 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:3601 4 OK 0x1.f23241c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:3602 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:3602 1 OK -0x1.4c8d5deffd5fap18 -0x1.06c963762fa92p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:3602 2 OK 0x1.9a6aaef7feafdp19 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:3602 3 OK -0x1.07f8838806987p18 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:3602 4 OK 0x1.782041c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:3603 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG epsg:3603 1 OK 0x1.f9e988e88c2ccp17 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:3603 2 OK 0x1.5fcccee2ee7a6p20 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:3603 3 OK 0x1.42628ec44b0f3p18 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:3603 4 OK 0x1.4e715c4eed3c3p20 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.6139e6ce2bc88p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:3604 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:3604 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:3604 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:3604 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:3604 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:3605 0 OK 0x1.e0977efdf3b63p20 0x1.a6c8bd0f5d9f5p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:3605 1 OK 0x1.3ca7fcc422cbp16 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:3605 2 OK 0x1.d6b23f17d2a06p21 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:3605 3 OK 0x1.79b79a00e21fp18 0x1.45d92b5d83149p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:3605 4 OK 0x1.b1608bbdd772cp21 0x1.45d92b5d83149p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:3606 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:3606 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:3606 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:3606 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:3606 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:3607 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:3607 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3607 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3607 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3607 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3608 0 OK 0x1.907e0aaacd9ecp20 0x1.2c5e880000003p24 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:3608 1 OK -0x1.1d8ca8166d50cp18 0x1.1164e159c0438p24 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3608 2 OK 0x1.b42f9fad9b48ep21 0x1.1164e159c0438p24 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3608 3 OK -0x1.15b1768bc94cp16 0x1.4908f019e4711p24 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3608 4 OK 0x1.992b965f2be92p21 0x1.4908f019e4711p24 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3609 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:3609 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3609 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3609 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3609 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3610 0 OK 0x1.4064d5559b3d4p19 0x1.907e0aaaacda5p24 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:3610 1 OK -0x1.37aeca059b545p20 0x1.758464046d1dap24 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3610 2 OK 0x1.3c09cfad9b496p21 0x1.758464046d1dap24 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3610 3 OK -0x1.01a6b768bc94ep20 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3610 4 OK 0x1.2105c65f2be98p21 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3611 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:3611 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3611 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3611 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3611 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3612 0 OK 0x1.4064d55566cf7p21 0x1.907e0aaaa64c8p23 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:3612 1 OK 0x1.51d0ebf4c957ep19 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3612 2 OK 0x1.162ab7d6cda47p22 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:3612 3 OK 0x1.bde1112e86d6cp19 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3612 4 OK 0x1.08a8b32f95f4ap22 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:3613 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:3613 1 OK -0x1.24fce93763534p18 -0x1.047d0f0ecdd7cp19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3613 2 OK 0x1.b776749bb1a9p19 -0x1.047d0f0ecdd7dp19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3613 3 OK -0x1.9bca10091ae7cp17 0x1.1a377ef14666fp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3613 4 OK 0x1.8bea840246b96p19 0x1.1a377ef14666ep19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3614 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:3614 1 OK -0x1.e09f4e5bd1c2fp19 -0x1.ab4f482af396dp20 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3614 2 OK 0x1.68737396f4708p21 -0x1.ab4f482af396ep20 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3614 3 OK -0x1.51c0c6017ea79p19 0x1.cef3ff10b2be5p20 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3614 4 OK 0x1.44bbd1805fa9cp21 0x1.cef3ff10b2be4p20 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3615 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3615 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3615 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3615 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3615 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3616 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3616 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3616 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3616 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3616 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3617 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:3617 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3617 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3617 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3617 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3618 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:3618 1 OK -0x1.0ef596d91f928p18 -0x1.b157317808227p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3618 2 OK 0x1.b25cbd872c23ap21 -0x1.b157317808227p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3618 3 OK -0x1.4f6288ed1a5dp16 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3618 4 OK 0x1.9af91ef371044p21 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3619 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:3619 1 OK -0x1.99be00ac5ff96p18 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3619 2 OK 0x1.6e0100562ffcbp19 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3619 3 OK -0x1.60b5a122eb162p18 0x1.1676a4801012dp19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:3619 4 OK 0x1.517cd091758b1p19 0x1.1676a4801012dp19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:3620 0 OK 0x1.0853300000003p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:3620 1 OK -0x1.5012ef61028f4p20 -0x1.b15833ac79502p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3620 2 OK 0x1.2c330fb08147cp21 -0x1.b15833ac79502p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3620 3 OK -0x1.214b965a2235p20 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3620 4 OK 0x1.14cf632d111aap21 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3621 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:3621 1 OK 0x1.df55c7b8d8b04p17 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3621 2 OK 0x1.595b4708e4eap20 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3621 3 OK 0x1.28b35fb7a28a2p18 0x1.16772ec526b59p19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3621 4 OK 0x1.4b192812175d8p20 0x1.16772ec526b59p19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3622 0 OK 0x1.4c689d560418cp21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:3622 1 OK 0x1.8927959598ba4p19 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3622 2 OK 0x1.1b43aaa351018p22 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:3622 3 OK 0x1.e6b67617f7ec6p19 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3622 4 OK 0x1.0f91ce93051b3p22 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:3623 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:3623 1 OK -0x1.5221cfa7d36a2p18 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3623 2 OK 0x1.9d34e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3623 3 OK -0x1.0266eb5117679p18 0x1.19530345ad8e5p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3623 4 OK 0x1.755775a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3624 0 OK 0x1.907e0aa7ef9ep19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:3624 1 OK -0x1.1556b8086776ap20 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3624 2 OK 0x1.52ea61582b8a5p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3624 3 OK -0x1.a7e3120738976p19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3624 4 OK 0x1.3237c9d5c5f4ep21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3625 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3625 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3625 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3625 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3625 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3626 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3626 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3626 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:3626 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3626 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:3627 0 OK 0x1.24f8p18 0x1.77ef514292013p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:3627 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:3627 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:3627 3 OK 0x1.7379e78330bbep17 0x1.388171947289dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:3627 4 OK 0x1.90330c3e67a21p18 0x1.388171947289dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:3628 0 OK 0x1.e097400000009p19 0x1.34584a46de43p17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:3628 1 OK 0x1.2b56a357b7e14p19 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:3628 2 OK 0x1.4aebee54240ffp20 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:3628 3 OK 0x1.30b017f7ec667p19 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:3628 4 OK 0x1.483f340409cd6p20 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:3629 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:3629 1 OK -0x1.e0f39f4fa6d44p17 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3629 2 OK 0x1.ce08e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3629 3 OK -0x1.417dd6a22ecf2p17 0x1.19530345ad8e5p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3629 4 OK 0x1.a62b75a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3630 0 OK 0x1.18583aac08314p20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:3630 1 OK -0x1.8a7b0560ae28cp19 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3630 2 OK 0x1.7af6fc0433bb7p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:3630 3 OK -0x1.07b0a75717d2ep19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3630 4 OK 0x1.5a446481ce26p21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:3631 0 OK 0x1.29a8270a3d70ap19 0x1.05cc553074f97p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:3631 1 OK 0x1.449988c24f902p18 -0x1.fbb202943916cp16 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3631 2 OK 0x1.b10389b353188p19 -0x1.fbb202943916cp16 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3631 3 OK 0x1.54278a411c66cp18 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3631 4 OK 0x1.a93c88f3ecad4p19 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3632 0 OK 0x1.e848000000005p20 0x1.ad7545588e65p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:3632 1 OK 0x1.0a3d4a3582c3ep20 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3632 2 OK 0x1.63295ae53e9dep21 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:3632 3 OK 0x1.16ff5d3fb333cp20 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3632 4 OK 0x1.5cc851602665fp21 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:3633 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:3633 1 OK 0x1.86e3d47c2716ep18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:3633 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:3633 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3633 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3634 0 OK 0x1.e0977efdf3b63p20 0x1.34b8635602885p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:3634 1 OK 0x1.409ca1da0a5ddp20 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:3634 2 OK 0x1.40492e10ee87bp21 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:3634 3 OK 0x1.4af8a0f982deep20 0x1.d42e49f062e38p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3634 4 OK 0x1.3b1b2e8132473p21 0x1.d42e49f062e38p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3635 0 OK 0x1.24f8p19 0x1.8a66ee530ab8dp16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:3635 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:3635 2 OK 0x1.8b2e86753449dp19 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:3635 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:3635 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:3636 0 OK 0x1.e0977efdf3b63p20 0x1.437e15732559cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:3636 1 OK 0x1.38eb67f7cefd8p20 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:3636 2 OK 0x1.4421cb020c37ep21 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:3636 3 OK 0x1.43cd789910c28p20 0x1.ea990182f140ap19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:3636 4 OK 0x1.3eb0c2b16b556p21 0x1.ea990182f140ap19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:3637 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:3637 1 OK 0x1.65d7a1966c1d2p18 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3637 2 OK 0x1.97042f34c9f0dp19 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3637 3 OK 0x1.7366a7cc5f285p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3637 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3638 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:3638 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3638 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3638 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3638 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3639 0 OK 0x1.24f8p19 0x1.7ed816e9b443ap16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:3639 1 OK 0x1.8562e4192a9e6p18 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:3639 2 OK 0x1.873e8df36ab0dp19 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:3639 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5de8p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:3639 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5de8p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:3640 0 OK 0x1.e097400000006p20 0x1.3a030d3f271bcp18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:3640 1 OK 0x1.3f60bce6c66c8p20 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:3640 2 OK 0x1.40e6e18c9cca2p21 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:3640 3 OK 0x1.466e4a61d6408p20 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:3640 4 OK 0x1.3d601acf14e02p21 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:3641 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:3641 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:3641 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:3641 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:3641 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:3642 0 OK 0x1.e097400000006p20 0x1.519f1c006078p18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:3642 1 OK 0x1.332c99d21eee2p20 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:3642 2 OK 0x1.4700f316f0895p21 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:3642 3 OK 0x1.3addbc4eed52ep20 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:3642 4 OK 0x1.432861d88956fp21 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:3643 0 OK 0x1.86ap18 0x1.96e208b941ca4p17 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:3643 1 OK -0x1.58224050f8eep15 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:3643 2 OK 0x1.9c2224050f901p19 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:3643 3 OK 0x1.0a4c279e8ba6p13 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:3643 4 OK 0x1.8276cf6185d27p19 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:3644 0 OK 0x1.4064ff53f7cedp20 0x1.4dbabd3e95b5ap19 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:3644 1 OK -0x1.1a43107856f38p17 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:3644 2 OK 0x1.5209305b7d3fp21 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:3644 3 OK 0x1.b4d6f6677e14p14 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:3644 4 OK 0x1.3cfb516728d38p21 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:3645 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:3645 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:3645 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:3645 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:3645 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:3646 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:3646 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:3646 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:3646 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:3646 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:3647 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:3647 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:3647 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:3647 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:3647 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:3648 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:3648 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:3648 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:3648 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:3648 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:3649 0 OK 0x1.24f8p19 0x1.82cecd83b5059p16 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:3649 1 OK 0x1.8289a2cb236a6p18 -0x1.77fcaead221dp16 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3649 2 OK 0x1.88ab2e9a6e4adp19 -0x1.77fcaead221dp16 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3649 3 OK 0x1.8d19b32c1129cp18 0x1.24b9880b7720fp18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3649 4 OK 0x1.83632669f76b2p19 0x1.24b9880b7720fp18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3650 0 OK 0x1.e097400000006p20 0x1.3d4353fa5fbadp18 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:3650 1 OK 0x1.3d0a98c7262b4p20 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3650 2 OK 0x1.4211f39c6ceacp21 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:3650 3 OK 0x1.45b47e1aeae0ep20 0x1.e030c687b6f13p19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3650 4 OK 0x1.3dbd00f28a8ffp21 0x1.e030c687b6f13p19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:3651 0 OK 0x1.24f8p19 0x1.623635ef1cb8ap16 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:3651 1 OK 0x1.93ddc76008933p18 -0x1.59729314e624fp16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3651 2 OK 0x1.80011c4ffbb66p19 -0x1.59729314e624fp16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3651 3 OK 0x1.9c6fffae6b3c8p18 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3651 4 OK 0x1.7bb80028ca61cp19 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3652 0 OK 0x1.e097400000006p20 0x1.228706283a7ddp18 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:3652 1 OK 0x1.4b41287d38872p20 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3652 2 OK 0x1.3af6abc163bcdp21 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:3652 3 OK 0x1.5248e02a502bbp20 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3652 4 OK 0x1.3772cfead7ea8p21 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:3653 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3653 1 OK -0x1.e6349b6f89f4cp18 -0x1.0508c5f7d2c1cp19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3653 2 OK 0x1.54c24db7c4fbp19 -0x1.0508c5f7d2c1bp19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3653 3 OK -0x1.9359a05eb2813p18 0x1.19b7b45ee2b01p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3653 4 OK 0x1.2b54d02f59412p19 0x1.19b7b45ee2b02p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3654 0 OK 0x1.4064d554c9862p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:3654 1 OK -0x1.8eca3057f111p20 -0x1.ac3478cdae1a8p20 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3654 2 OK 0x1.177e4d812aea9p21 -0x1.ac3478cdae1a6p20 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:3654 3 OK -0x1.4ad4c4046bdfp20 0x1.ce225d894e1a8p20 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3654 4 OK 0x1.eb072eaed0a3p20 0x1.ce225d894e1a9p20 0x0.0p0 -0x1.0377569181a1dp6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:3655 0 OK 0x1.29a8p19 0x1.44e4cd737cdd2p17 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:3655 1 OK 0x1.01b075d8c695p18 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3655 2 OK 0x1.d277c5139cb58p19 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3655 3 OK 0x1.184511ebb6ddcp18 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3655 4 OK 0x1.c72d770a24912p19 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3656 0 OK 0x1.e847fffffffffp20 0x1.0a7b29855bfffp19 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:3656 1 OK 0x1.a6b7fa6e5a964p19 -0x1.0104117a0f575p19 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3656 2 OK 0x1.7e9a0164695a6p21 -0x1.0104117a0f575p19 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:3656 3 OK 0x1.cbc29b0bbdc86p19 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3656 4 OK 0x1.7557593d108dep21 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:3657 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:3657 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda99882p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:3657 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda99882p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:3657 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e36p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:3657 4 OK 0x1.8670ba72bc014p19 0x1.3052f091f3e36p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:3658 0 OK 0x1.e097400000006p20 0x1.495377ea606a5p18 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:3658 1 OK 0x1.361934b47e738p20 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:3658 2 OK 0x1.458aa5a5c0c62p21 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:3658 3 OK 0x1.40b260ebae5d4p20 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:3658 4 OK 0x1.403e0f8a28d15p21 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:3659 0 OK 0x1.24f8p19 0x1.c069e4aef592fp16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:3659 1 OK 0x1.614d92de92fd1p18 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3659 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3659 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3659 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3660 0 OK 0x1.e097400000006p20 0x1.6fcae86be05b3p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:3660 1 OK 0x1.21c83698cc15p20 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3660 2 OK 0x1.4fb324b399f5ep21 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:3660 3 OK 0x1.2e5f0748dbcb6p20 0x1.16f406e89be55p20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3660 4 OK 0x1.4967bc5b921abp21 0x1.16f406e89be55p20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:3661 0 OK 0x1.24f8p19 0x1.c374b0c96a7e1p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:3661 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:3661 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:3661 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dce04p18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:3661 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dce04p18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:3662 0 OK 0x1.e097400000006p20 0x1.7249af14fd5fap18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:3662 1 OK 0x1.21cff166c8dd1p20 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:3662 2 OK 0x1.4faf474c9b926p21 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:3662 3 OK 0x1.2b7ae3b3fa782p20 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:3662 4 OK 0x1.4ad9ce2602c4dp21 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:3663 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:3663 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:3663 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:3663 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:3663 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:3664 0 OK 0x1.18583aa9fbe7ap21 0x1.38abba7c13556p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:3664 1 OK 0x1.66573f1cbd669p20 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:3664 2 OK 0x1.7d84d5c5991c8p21 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:3664 3 OK 0x1.6f78cd5a43b24p20 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:3664 4 OK 0x1.78f40ea6d5f6ap21 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:3665 0 OK 0x1.6e36p20 0x1.a716635e144bap22 0x0.0p0 -0x1.9p6 0x1.a800000000004p4 0x0.0p0 F +REG epsg:3665 1 OK -0x1.925736575ccbp18 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:3665 2 OK 0x1.a080e6caeb993p21 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:3665 3 OK 0x1.47c634c0d12bp16 0x1.097e212fc44c2p23 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:3665 4 OK 0x1.63f7ce59f9768p21 0x1.097e212fc44c2p23 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:3666 0 OK 0x1.6e36p20 0x1.6b3f181ccaf38p22 0x0.0p0 -0x1.9p6 0x1.a7fffffffff3dp4 0x0.0p0 F +REG epsg:3666 1 OK -0x1.9da60efa07794p18 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:3666 2 OK 0x1.a1eac1df40efp21 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:3666 3 OK 0x1.4e6b2e2b90abp16 0x1.d7918821cdb8p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:3666 4 OK 0x1.63c2a68ea37a8p21 0x1.d7918821cdb8p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:3667 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:3667 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:3667 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:3667 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:3667 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:3668 0 OK 0x1.4064d55810628p19 0x1.c0fe8fdb31172p21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:3668 1 OK -0x1.3f2832962a478p17 0x1.61539a6f805e3p21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:3668 2 OK 0x1.6849dbaad5aa6p20 0x1.61539a6f805e3p21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:3668 3 OK -0x1.d6bce3b2d8b88p16 0x1.11a734805e99cp22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:3668 4 OK 0x1.5dd0a3933ded1p20 0x1.11a734805e99cp22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:3669 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:3669 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:3669 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:3669 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:3669 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:3670 0 OK 0x1.e097400000006p20 0x1.aa07448f1fd21p22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:3670 1 OK 0x1.0e08d221ed162p20 0x1.77a266cdd0422p22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:3670 2 OK 0x1.5992d6ef09755p21 0x1.77a266cdd0422p22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:3670 3 OK 0x1.18ae070a3968ap20 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:3670 4 OK 0x1.54403c7ae34c1p21 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:3671 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:3671 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:3671 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:3671 3 OK 0x1.ee847b1cd767p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:3671 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:3672 0 OK 0x1.e097400000009p19 0x1.0050fa905671ap24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:3672 1 OK 0x1.5a737b344956cp17 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:3672 2 OK 0x1.b548d09976d6ep20 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:3672 3 OK 0x1.959b7d15aec24p17 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:3672 4 OK 0x1.ade3d05d4a296p20 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:3673 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:3673 1 OK 0x1.39170370f731bp18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:3673 2 OK 0x1.ad647e4784668p19 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:3673 3 OK 0x1.45cd37c6ce462p18 0x1.0d334102db22ep22 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:3673 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db22ep22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:3674 0 OK 0x1.e097400000006p20 0x1.9e15d995fed96p23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:3674 1 OK 0x1.00cc87766a532p20 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:3674 2 OK 0x1.6030fc44cad64p21 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:3674 3 OK 0x1.0b39a79d764fp20 0x1.b999bb2d94beep23 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:3674 4 OK 0x1.5afa6c3144d86p21 0x1.b999bb2d94beep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:3675 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:3675 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3675 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3675 3 OK 0x1.e92fa135fb9ffp17 0x1.23c16caecd927p21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3675 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd927p21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3676 0 OK 0x1.907e3f2b020c4p20 0x1.aa3e8395be8cep22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:3676 1 OK 0x1.7593ba36d54f5p19 0x1.77a162f228e24p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3676 2 OK 0x1.3319509d4cb7fp21 0x1.77a162f228e24p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3676 3 OK 0x1.913c3b56f469ap19 0x1.de9a059a5b245p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3676 4 OK 0x1.2c2f305544f16p21 0x1.de9a059a5b245p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3677 0 OK 0x1.907e0aaacd9ecp20 0x1.aa3e4bb76c698p22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:3677 1 OK 0x1.7593893be5e41p19 0x1.77a131b627cc9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3677 2 OK 0x1.3319285bd4254p21 0x1.77a131b627cc9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:3677 3 OK 0x1.913c06bbf6b0cp19 0x1.de99c6df35e9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3677 4 OK 0x1.2c2f08fbcff22p21 0x1.de99c6df35e9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:3678 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:3678 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3678 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3678 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3678 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3679 0 OK 0x1.907e3f2b020c4p20 0x1.b0bcb31dc80ddp21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:3679 1 OK 0x1.0c2d791b0ddfdp20 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3679 2 OK 0x1.0a67829d7b1c6p21 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3679 3 OK 0x1.11e2dc82e7e8p20 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3679 4 OK 0x1.078cd0e98e184p21 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3680 0 OK 0x1.907e0aaacd9ecp20 0x1.b0bc7a657e017p21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:3680 1 OK 0x1.0c2d55f29f20ap20 0x1.70fa64a012202p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3680 2 OK 0x1.0a675fb17e0e7p21 0x1.70fa64a012202p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:3680 3 OK 0x1.11e2b89aed1aep20 0x1.f1f0137167a99p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3680 4 OK 0x1.078cae5d57115p21 0x1.f1f0137167a99p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:3681 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:3681 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3681 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3681 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3681 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3682 0 OK 0x1.907e3f2b020c4p20 0x1.35b8f277f903cp23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:3682 1 OK 0x1.edab35460106dp19 0x1.233be022151cdp23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3682 2 OK 0x1.151371d981ca1p21 0x1.233be022151cdp23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3682 3 OK 0x1.fb40883a07bdp19 0x1.48a3d66522362p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3682 4 OK 0x1.11ae1d1c801c8p21 0x1.48a3d66522362p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3683 0 OK 0x1.907e0aaacd9ecp20 0x1.35b8c9df6e973p23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:3683 1 OK 0x1.edaaf48d75935p19 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3683 2 OK 0x1.15134d8770397p21 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:3683 3 OK 0x1.fb4045b9b4a78p19 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3683 4 OK 0x1.11adf93c60746p21 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:3684 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:3684 1 OK -0x1.86b2371ea2d1p16 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3684 2 OK 0x1.0c8f2371ea2d6p20 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:3684 3 OK -0x1.5297458080bap13 0x1.1a3752e74fe61p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3684 4 OK 0x1.ed925d1602037p19 0x1.1a3752e74fe62p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:3685 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:3685 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:3685 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:3685 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:3685 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:3686 0 OK 0x1.5e6e495581066p23 0x1.a18871711cb3ap22 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:3686 1 OK 0x1.4cf5197041c02p23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:3686 2 OK 0x1.6fe7793ac04cap23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:3686 3 OK 0x1.4daf24ae7391ap23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:3686 4 OK 0x1.6f2d6dfc8e7b2p23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:3687 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:3687 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:3687 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:3687 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6491p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:3687 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6491p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:3688 0 OK 0x1.5e6e495581066p23 0x1.b4c9df24ac0d8p21 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:3688 1 OK 0x1.4bcff5cb476d5p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:3688 2 OK 0x1.710c9cdfba9f7p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:3688 3 OK 0x1.4c99ab85b93fcp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:3688 4 OK 0x1.7042e72548cdp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:3689 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:3689 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:3689 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:3689 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3689 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3690 0 OK 0x1.907e0aac08315p20 0x1.34b943da25dc3p18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:3690 1 OK 0x1.e1046a555e29ep19 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:3690 2 OK 0x1.183cf016b0a7cp21 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:3690 3 OK 0x1.f5bf3365debffp19 0x1.d42f38a973c76p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3690 4 OK 0x1.130e3dd290822p21 0x1.d42f38a973c76p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:3691 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:3691 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fbap16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:3691 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fbap16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:3691 3 OK 0x1.16844fa8b2f1cp18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:3691 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:3692 0 OK 0x1.907e0aac08315p20 0x1.641db43fe1665p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:3692 1 OK 0x1.aeba938e29b6cp19 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:3692 2 OK 0x1.24cf65c87dc3ap21 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:3692 3 OK 0x1.c8e23804965acp19 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:3692 4 OK 0x1.1e457caae29aap21 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:3693 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:3693 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:3693 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:3693 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:3693 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:3694 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:3694 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:3694 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:3694 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:3694 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:3695 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:3695 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:3695 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:3695 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:3695 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:3696 0 OK 0x1.e097400000006p20 0x1.28adfc81f1783p18 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:3696 1 OK 0x1.477bd35a7b7f1p20 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:3696 2 OK 0x1.3cd95652c240ep21 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:3696 3 OK 0x1.500ba7b16b424p20 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:3696 4 OK 0x1.38916c274a5f4p21 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:3697 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:3697 1 OK 0x1.96b30a2e34c9p18 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:3697 2 OK 0x1.7e967ae8e59b8p19 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:3697 3 OK 0x1.a0c3f35264cb7p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:3697 4 OK 0x1.798e0656cd9a4p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:3698 0 OK 0x1.e097400000006p20 0x1.1ce0d17f7cab7p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:3698 1 OK 0x1.4d9405f33b671p20 -0x1.1462814d34f12p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:3698 2 OK 0x1.39cd3d06624cep21 -0x1.1462814d34f12p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:3698 3 OK 0x1.55d5a07b34e9ep20 0x1.af67f5201dffp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:3698 4 OK 0x1.35ac6fc2658b7p21 0x1.af67f5201dffp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:3699 0 OK 0x1.24f8p19 0x1.c0697505b68fdp16 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:3699 1 OK 0x1.615ed51025e25p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:3699 2 OK 0x1.99409577ed0e4p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:3699 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:3699 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:3700 0 OK 0x1.e097400000006p20 0x1.6fca8cd604f09p18 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:3700 1 OK 0x1.21d65e6fa50cp20 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:3700 2 OK 0x1.4fac10c82d79ep21 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:3700 3 OK 0x1.2e4ecb4ca001cp20 0x1.16ea191559a8fp20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:3700 4 OK 0x1.496fda59afffp21 0x1.16ea191559a8fp20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:3701 0 OK 0x1.fbdp18 -0x1.117p22 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:3701 1 OK -0x1.11350e7d86a1p15 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3701 2 OK 0x1.0671a873ec34ap20 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:3701 3 OK -0x1.11350e7d86a1p15 -0x1.df27292302865p21 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3701 4 OK 0x1.0671a873ec34ap20 -0x1.df27292302865p21 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3702 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:3702 1 OK -0x1.83ac2769fab28p18 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3702 2 OK 0x1.852613b4fd58ap19 -0x1.053b9f9c695ap19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3702 3 OK -0x1.3283c083e845cp18 0x1.197f5851c9bdap19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3702 4 OK 0x1.5c91e041f4226p19 0x1.197f5851c9bd9p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3703 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3703 1 OK -0x1.80b84ed3f5628p17 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3703 2 OK 0x1.e6ce13b4fd594p19 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3703 3 OK -0x1.bccf020fa113p16 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3703 4 OK 0x1.be39e041f422ep19 0x1.4a535851c9bdap19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3704 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:3704 1 OK 0x1.79ec4b02a6cp11 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3704 2 OK 0x1.243b09da7eacap20 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3704 3 OK 0x1.5070fdf05ee9p16 0x1.197f5851c9bdap19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3704 4 OK 0x1.0ff0f020fa117p20 0x1.197f5851c9bdap19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3705 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3705 1 OK 0x1.8c87b12c0a9bp17 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3705 2 OK 0x1.550f09da7eac5p20 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3705 3 OK 0x1.176c3f7c17ba4p18 0x1.4a535851c9bdap19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3705 4 OK 0x1.40c4f020fa113p20 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3706 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:3706 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3706 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p7 -0x1.4p2 0x0.0p0 F +REG epsg:3706 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4cp7 0x1.4p2 0x0.0p0 F +REG epsg:3706 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p7 0x1.4p2 0x0.0p0 F +REG epsg:3707 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:3707 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.58p7 -0x1.4p2 0x0.0p0 F +REG epsg:3707 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6400000000001p7 -0x1.4p2 0x0.0p0 F +REG epsg:3707 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.58p7 0x1.4p2 0x0.0p0 F +REG epsg:3707 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6400000000001p7 0x1.4p2 0x0.0p0 F +REG epsg:3708 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:3708 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.64p7 -0x1.4p2 0x0.0p0 F +REG epsg:3708 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p7 -0x1.4p2 0x0.0p0 F +REG epsg:3708 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.64p7 0x1.4p2 0x0.0p0 F +REG epsg:3708 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p7 0x1.4p2 0x0.0p0 F +REG epsg:3709 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:3709 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p7 -0x1.4p2 0x0.0p0 F +REG epsg:3709 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3709 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p7 0x1.4p2 0x0.0p0 F +REG epsg:3709 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4cp7 0x1.4p2 0x0.0p0 F +REG epsg:3710 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG epsg:3710 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.54p7 -0x1.4p2 0x0.0p0 F +REG epsg:3710 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p7 -0x1.4p2 0x0.0p0 F +REG epsg:3710 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.54p7 0x1.4p2 0x0.0p0 F +REG epsg:3710 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p7 0x1.4p2 0x0.0p0 F +REG epsg:3711 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:3711 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 -0x1.4p2 0x0.0p0 F +REG epsg:3711 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 -0x1.4p2 0x0.0p0 F +REG epsg:3711 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 0x1.4p2 0x0.0p0 F +REG epsg:3711 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 0x1.4p2 0x0.0p0 F +REG epsg:3712 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:3712 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3712 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 -0x1.4p2 0x0.0p0 F +REG epsg:3712 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 0x1.4p2 0x0.0p0 F +REG epsg:3712 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 0x1.4p2 0x0.0p0 F +REG epsg:3713 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:3713 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p7 -0x1.4p2 0x0.0p0 F +REG epsg:3713 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3713 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p7 0x1.4p2 0x0.0p0 F +REG epsg:3713 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1cp7 0x1.4p2 0x0.0p0 F +REG epsg:3714 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:3714 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.24p7 -0x1.4p2 0x0.0p0 F +REG epsg:3714 2 OK 0x1.018fa874f57eep20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:3714 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.24p7 0x1.4p2 0x0.0p0 F +REG epsg:3714 4 OK 0x1.018fa874f57eep20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:3715 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:3715 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p7 -0x1.4p2 0x0.0p0 F +REG epsg:3715 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.04p7 -0x1.4p2 0x0.0p0 F +REG epsg:3715 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p7 0x1.4p2 0x0.0p0 F +REG epsg:3715 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.04p7 0x1.4p2 0x0.0p0 F +REG epsg:3716 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:3716 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3716 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:3716 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0cp7 0x1.4p2 0x0.0p0 F +REG epsg:3716 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:3717 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3717 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:3717 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3717 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 0x1.4p2 0x0.0p0 F +REG epsg:3717 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3718 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:3718 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:3718 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:3718 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:3718 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:3719 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:3719 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3719 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:3719 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3719 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:3720 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3720 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:3720 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:3720 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:3720 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:3721 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:3721 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:3721 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:3721 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:3721 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:3722 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:3722 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:3722 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:3722 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:3722 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:3723 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:3723 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:3723 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:3723 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:3723 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:3724 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:3724 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:3724 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:3724 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:3724 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:3725 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:3725 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:3725 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:3725 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:3725 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:3726 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:3726 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:3726 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:3726 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:3726 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:3727 0 OK 0x1.39b2ffd4f41b9p17 0x1.9164d2e56dd5ep15 -0x1.c5c2b2bc8p3 0x1.bc44444444443p5 -0x1.51ddddddddddep4 0x1.8p-29 F +REG epsg:3727 1 OK -0x1.6f2913e97b1p18 -0x1.f56cb47111d1ap18 -0x1.7a11fe8c38p7 0x1.9163239d5862p5 -0x1.a1ddddddb78adp4 0x1.0p-30 F +REG epsg:3727 2 OK 0x1.546e0b637ca73p19 -0x1.f56cb49124c34p18 -0x1.5828a487cp6 0x1.e72564eb30a07p5 -0x1.a1ddddddb702cp4 -0x1.9p-26 F +REG epsg:3727 3 OK -0x1.93c30b7630b74p18 0x1.23acdc7e3b7ffp19 0x1.7bcc29f0ep5 0x1.9163239d8fc8ep5 -0x1.01ddddddc9158p4 -0x1.0p-26 F +REG epsg:3727 4 OK 0x1.66bb05ec3aec4p19 0x1.23acdc70e2ec9p19 0x1.3b56daa05p7 0x1.e72564eaf882ep5 -0x1.01ddddddc8c9fp4 -0x1.0p-30 F +REG epsg:3728 0 OK 0x1.e097400000006p20 0x1.69b6e7707aa02p18 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:3728 1 OK 0x1.258157aea187cp20 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3728 2 OK 0x1.4dd69428af3cp21 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3728 3 OK 0x1.30a04e375c57ep20 0x1.12091514d80d2p20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3728 4 OK 0x1.484718e451d4p21 0x1.12091514d80d2p20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3729 0 OK 0x1.e097400000006p20 0x1.699b9c3b7e55dp18 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:3729 1 OK 0x1.25d72ef511beap20 -0x1.5edf5422de247p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3729 2 OK 0x1.4daba8857720ap21 -0x1.5edf5422de247p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3729 3 OK 0x1.30523c7b25078p20 0x1.11ce460665ccap20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3729 4 OK 0x1.486e21c26d7c2p21 0x1.11ce460665ccap20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3730 0 OK 0x1.4064d5559b3d4p19 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:3730 1 OK -0x1.3df8e1d20ab9dp20 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3730 2 OK 0x1.3f2edb93d2fbp21 -0x1.ac87e3296ef47p20 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3730 3 OK -0x1.f6cfcee5c363p19 0x1.cdc5e985502abp20 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3730 4 OK 0x1.1de65e643e76fp21 0x1.cdc5e985502aap20 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3731 0 OK 0x1.4064d5553261cp20 0x1.4064d554c9862p18 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3731 1 OK -0x1.3b8cee4f4beb4p19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3731 2 OK 0x1.8f4810e9055d2p21 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3731 3 OK -0x1.6cd5f321f3b6p18 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3731 4 OK 0x1.6dff93b970d8fp21 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3732 0 OK 0x1.e097400000006p20 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:3732 1 OK 0x1.35f9c193d3f8p13 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3732 2 OK 0x1.df61463e6c2c6p21 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3732 3 OK 0x1.13f3b78942c1p18 0x1.cdc5e985502abp20 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3732 4 OK 0x1.be18c90ed7a84p21 0x1.cdc5e985502abp20 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3733 0 OK 0x1.4064d55566cf7p21 0x1.4064d554c9862p18 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3733 1 OK 0x1.453cbc5bea8cep19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3733 2 OK 0x1.17bd3dc9e97d9p22 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3733 3 OK 0x1.ca5eb11a3c9d8p19 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3733 4 OK 0x1.0718ff321f3b8p22 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.9e0816808ff29p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3734 0 OK 0x1.e097400000006p20 0x1.69b6e7707aa02p18 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:3734 1 OK 0x1.258157aea187cp20 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3734 2 OK 0x1.4dd69428af3cp21 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3734 3 OK 0x1.30a04e375c57ep20 0x1.12091514d80d2p20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3734 4 OK 0x1.484718e451d4p21 0x1.12091514d80d2p20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3735 0 OK 0x1.e097400000006p20 0x1.699b9c3b7e55dp18 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:3735 1 OK 0x1.25d72ef511beap20 -0x1.5edf5422de247p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3735 2 OK 0x1.4daba8857720ap21 -0x1.5edf5422de247p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3735 3 OK 0x1.30523c7b25078p20 0x1.11ce460665ccap20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3735 4 OK 0x1.486e21c26d7c2p21 0x1.11ce460665ccap20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3736 0 OK 0x1.4064d5559b3d4p19 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:3736 1 OK -0x1.3df8e1d20ab9dp20 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3736 2 OK 0x1.3f2edb93d2fbp21 -0x1.ac87e3296ef47p20 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3736 3 OK -0x1.f6cfcee5c363p19 0x1.cdc5e985502abp20 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3736 4 OK 0x1.1de65e643e76fp21 0x1.cdc5e985502aap20 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3737 0 OK 0x1.4064d5553261cp20 0x1.4064d554c9862p18 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3737 1 OK -0x1.3b8cee4f4beb4p19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3737 2 OK 0x1.8f4810e9055d2p21 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3737 3 OK -0x1.6cd5f321f3b6p18 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3737 4 OK 0x1.6dff93b970d8fp21 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3738 0 OK 0x1.e097400000006p20 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:3738 1 OK 0x1.35f9c193d3f8p13 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3738 2 OK 0x1.df61463e6c2c6p21 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3738 3 OK 0x1.13f3b78942c1p18 0x1.cdc5e985502abp20 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3738 4 OK 0x1.be18c90ed7a84p21 0x1.cdc5e985502abp20 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3739 0 OK 0x1.4064d55566cf7p21 0x1.4064d554c9862p18 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3739 1 OK 0x1.453cbc5bea8cep19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3739 2 OK 0x1.17bd3dc9e97d9p22 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3739 3 OK 0x1.ca5eb11a3c9d8p19 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3739 4 OK 0x1.0718ff321f3b8p22 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.9e0816808ff29p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3740 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3740 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:3740 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3740 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 0x1.4p2 0x0.0p0 F +REG epsg:3740 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3741 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:3741 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:3741 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:3741 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:3741 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:3742 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:3742 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:3742 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:3742 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:3742 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:3743 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3743 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:3743 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:3743 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:3743 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:3744 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:3744 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:3744 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:3744 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:3744 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:3745 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:3745 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:3745 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:3745 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:3745 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:3746 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:3746 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:3746 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:3746 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:3746 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:3747 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:3747 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:3747 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:3747 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:3747 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:3748 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:3748 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:3748 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:3748 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:3748 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:3749 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:3749 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:3749 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:3749 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:3749 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:3750 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:3750 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 -0x1.4p2 0x0.0p0 F +REG epsg:3750 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 -0x1.4p2 0x0.0p0 F +REG epsg:3750 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 0x1.4p2 0x0.0p0 F +REG epsg:3750 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 0x1.4p2 0x0.0p0 F +REG epsg:3751 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:3751 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 -0x1.4p2 0x0.0p0 F +REG epsg:3751 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 -0x1.4p2 0x0.0p0 F +REG epsg:3751 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 0x1.4p2 0x0.0p0 F +REG epsg:3751 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 0x1.4p2 0x0.0p0 F +REG epsg:3752 0 OK 0x0.0p0 -0x1.3037ba13ae741p22 0x0.0p0 0x1.9p6 -0x1.47fffffffffeap5 0x0.0p0 F +REG epsg:3752 1 OK -0x1.681b5b79686eep19 -0x1.5eed7e2f7969cp22 0x0.0p0 0x1.757feef827d5fp6 -0x1.6fffffffffff7p5 0x0.0p0 F +REG epsg:3752 2 OK 0x1.681b5b79686eep19 -0x1.5eed7e2f7969cp22 0x0.0p0 0x1.aa801107d82a1p6 -0x1.6fffffffffff7p5 0x0.0p0 F +REG epsg:3752 3 OK -0x1.681b5b79686eep19 -0x1.04f4c3bca79dap22 0x0.0p0 0x1.757feef827d5fp6 -0x1.1ffffffffffd5p5 0x0.0p0 F +REG epsg:3752 4 OK 0x1.681b5b79686eep19 -0x1.04f4c3bca79dap22 0x0.0p0 0x1.aa801107d82a1p6 -0x1.1ffffffffffd5p5 0x0.0p0 F +REG epsg:3753 0 OK 0x1.e097400000006p20 0x1.69b6e7707aa02p18 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:3753 1 OK 0x1.258157aea187cp20 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3753 2 OK 0x1.4dd69428af3cp21 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:3753 3 OK 0x1.30a04e375c57ep20 0x1.12091514d80d2p20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3753 4 OK 0x1.484718e451d4p21 0x1.12091514d80d2p20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:3754 0 OK 0x1.e097400000006p20 0x1.699b9c3b7e55dp18 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:3754 1 OK 0x1.25d72ef511beap20 -0x1.5edf5422de247p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3754 2 OK 0x1.4daba8857720ap21 -0x1.5edf5422de247p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:3754 3 OK 0x1.30523c7b25078p20 0x1.11ce460665ccap20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3754 4 OK 0x1.486e21c26d7c2p21 0x1.11ce460665ccap20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:3755 0 OK 0x1.4064d5559b3d4p19 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:3755 1 OK -0x1.3df8e1d20ab9dp20 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3755 2 OK 0x1.3f2edb93d2fbp21 -0x1.ac87e3296ef47p20 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3755 3 OK -0x1.f6cfcee5c363p19 0x1.cdc5e985502abp20 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3755 4 OK 0x1.1de65e643e76fp21 0x1.cdc5e985502aap20 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3756 0 OK 0x1.4064d5553261cp20 0x1.4064d554c9862p18 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3756 1 OK -0x1.3b8cee4f4beb4p19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3756 2 OK 0x1.8f4810e9055d2p21 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3756 3 OK -0x1.6cd5f321f3b6p18 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3756 4 OK 0x1.6dff93b970d8fp21 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3757 0 OK 0x1.e097400000006p20 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:3757 1 OK 0x1.35f9c193d3f8p13 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3757 2 OK 0x1.df61463e6c2c6p21 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3757 3 OK 0x1.13f3b78942c1p18 0x1.cdc5e985502abp20 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3757 4 OK 0x1.be18c90ed7a84p21 0x1.cdc5e985502abp20 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3758 0 OK 0x1.4064d55566cf7p21 0x1.4064d554c9862p18 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:3758 1 OK 0x1.453cbc5bea8cep19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3758 2 OK 0x1.17bd3dc9e97d9p22 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:3758 3 OK 0x1.ca5eb11a3c9d8p19 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3758 4 OK 0x1.0718ff321f3b8p22 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.9e0816808ff29p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:3759 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG epsg:3759 1 OK -0x1.daf24a1372338p17 -0x1.b54aa78e6cebep20 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:3759 2 OK 0x1.ae2d2f4c04c2p21 -0x1.b54aa78e6cebep20 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:3759 3 OK -0x1.d40be5bffd3ep16 0x1.c470db440df0cp20 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:3759 4 OK 0x1.9f1e69d8cd88bp21 0x1.c470db440df0cp20 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:3760 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG epsg:3760 1 OK -0x1.daf24a1372338p17 -0x1.b54aa78e6cebep20 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:3760 2 OK 0x1.ae2d2f4c04c2p21 -0x1.b54aa78e6cebep20 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:3760 3 OK -0x1.d40be5bffd3ep16 0x1.c470db440df0cp20 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:3760 4 OK 0x1.9f1e69d8cd88bp21 0x1.c470db440df0cp20 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:3761 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:3761 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:3761 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:3761 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:3761 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:3762 0 OK 0x0.0p0 0x1.b2d745bd34fabp15 0x0.0p0 -0x1.28p5 -0x1.b3ffffffffd57p5 0x0.0p0 F +REG epsg:3762 1 OK -0x1.a9227ae32268bp16 -0x1.bd4e2aa7a67a6p15 0x0.0p0 -0x1.35c6c29450f8fp5 -0x1.bbffffffffddap5 0x0.0p0 F +REG epsg:3762 2 OK 0x1.a9227ae32268bp16 -0x1.bd4e2aa7a67a6p15 0x0.0p0 -0x1.1a393d6baf071p5 -0x1.bbffffffffddap5 0x0.0p0 F +REG epsg:3762 3 OK -0x1.be61127f8cf94p16 0x1.436109965cffdp17 0x0.0p0 -0x1.35c6c29450f8fp5 -0x1.abffffffffcc2p5 0x0.0p0 F +REG epsg:3762 4 OK 0x1.be61127f8cf94p16 0x1.436109965cffdp17 0x0.0p0 -0x1.1a393d6baf071p5 -0x1.abffffffffcc2p5 0x0.0p0 F +REG epsg:3763 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.04426c684fbc5p3 0x1.3d5897d33791ap5 0x0.0p0 F +REG epsg:3763 1 OK -0x1.22ebc592162a1p19 -0x1.058ba10bf97ap19 0x0.0p0 -0x1.d41e46bfb3407p3 0x1.155897d2bef1dp5 0x0.0p0 F +REG epsg:3763 2 OK 0x1.22ebc592162a1p19 -0x1.058ba10bf97ap19 0x0.0p0 -0x1.a334908761c21p0 0x1.155897d2bef1dp5 0x0.0p0 F +REG epsg:3763 3 OK -0x1.f70af41e7abb5p18 0x1.193a58d622ac7p19 0x0.0p0 -0x1.d41e46bc84557p3 0x1.655897d264dcbp5 0x0.0p0 F +REG epsg:3763 4 OK 0x1.f70af41e7abb5p18 0x1.193a58d622ac7p19 0x0.0p0 -0x1.a33490a0d9196p0 0x1.655897d264dcbp5 0x0.0p0 F +REG epsg:3764 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 -0x1.61p7 -0x1.6p5 0x0.0p0 F +REG epsg:3764 1 OK -0x1.a78cced114fc4p16 0x1.af6107cbf9ac4p17 0x0.0p0 0x1.61192e640a523p7 -0x1.87fffffea2285p5 0x0.0p0 F +REG epsg:3764 2 OK 0x1.bb9199da229f8p19 0x1.af6107cbf9ac4p17 0x0.0p0 -0x1.53192e640a524p7 -0x1.87fffffea2285p5 0x0.0p0 F +REG epsg:3764 3 OK -0x1.8b603e42009d4p17 0x1.45422d996481ap20 0x0.0p0 0x1.61192e63a60fap7 -0x1.37ffffff10d88p5 0x0.0p0 F +REG epsg:3764 4 OK 0x1.e9780f9080275p19 0x1.45422d996481ap20 0x0.0p0 -0x1.53192e63a60fbp7 -0x1.37ffffff10d88p5 0x0.0p0 F +REG epsg:3765 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p4 0x0.0p0 0x0.0p0 T +REG epsg:3765 1 OK -0x1.aec22c131379p15 -0x1.0ef82b7611dd6p19 0x0.0p0 0x1.70000000ea80ep3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3765 2 OK 0x1.019a1160989bcp20 -0x1.0ef82b7611dd6p19 0x0.0p0 0x1.57ffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3765 3 OK -0x1.aec22c131379p15 0x1.0ef82b7611dd6p19 0x0.0p0 0x1.70000000ea80ep3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3765 4 OK 0x1.019a1160989bcp20 0x1.0ef82b7611dd6p19 0x0.0p0 0x1.57ffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3766 0 OK 0x0.0p0 0x1.6aa265aaee218p21 0x0.0p0 0x1.08p4 0x1.6f5555555547p4 0x0.0p0 F +REG epsg:3766 1 OK -0x1.054196b2415ccp21 0x1.412760d8cb1bp20 0x0.0p0 0x1.ad4c8bd3be149p-3 0x1.fd55555555273p2 0x0.0p0 F +REG epsg:3766 2 OK 0x1.054196b2415c9p21 0x1.412760d8cb1bp20 0x0.0p0 0x1.0652b3742c41dp5 0x1.fd55555555273p2 0x0.0p0 F +REG epsg:3766 3 OK -0x1.5d4baa02592ffp20 0x1.26ae742d0097bp22 0x0.0p0 0x1.ad4c8bd3be0d7p-3 0x1.2faaaaaaaaa88p5 0x0.0p0 F +REG epsg:3766 4 OK 0x1.5d4baa02592fbp20 0x1.26ae742d0097bp22 0x0.0p0 0x1.0652b3742c41ep5 0x1.2faaaaaaaaa8ap5 0x0.0p0 F +REG epsg:3767 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3767 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:3767 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:3767 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:3767 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:3768 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:3768 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:3768 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:3768 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:3768 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:3769 0 OK 0x1.e84016d7d83fbp18 -0x1.27dfda9bbb927p8 0x1.3310bcb4ep7 -0x1.f8p5 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:3769 1 OK -0x1.ad9500d955f6p15 -0x1.0f06aaa95d7fcp19 0x1.6c604a7c2p7 -0x1.1p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:3769 2 OK 0x1.018cb36d1c19fp20 -0x1.0f06aaa9290f1p19 0x1.6161e3c538p7 -0x1.d000000000001p5 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3769 3 OK -0x1.ad9e074324bap15 0x1.0ebcb352e941cp19 0x1.052e021bd8p7 -0x1.1p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3769 4 OK 0x1.018cfb9e51adep20 0x1.0ebcb352b4edp19 0x1.f45f2b0d9p6 -0x1.d000000000001p5 0x1.3fffffffffffcp2 0x1.0p-30 F +REG epsg:3770 0 OK 0x1.0c8ep19 0x1.86ap16 0x0.0p0 -0x1.03p6 0x1.0p5 0x0.0p0 F +REG epsg:3770 1 OK -0x1.17bf5bf51c49p15 -0x1.ae2eb9450b028p18 0x0.0p0 -0x1.1a9564b7a47f4p6 0x1.afffffffb631p4 0x0.0p0 F +REG epsg:3770 2 OK 0x1.154bfadfa8e2ap20 -0x1.ae2eb9450b026p18 0x0.0p0 -0x1.d6d53690b7018p5 0x1.afffffffb631p4 0x0.0p0 F +REG epsg:3770 3 OK 0x1.85afd97d3276p14 0x1.479cb35122dcbp19 0x0.0p0 -0x1.1a9564b796e69p6 0x1.27ffffffafc0ep5 0x0.0p0 F +REG epsg:3770 4 OK 0x1.0677409a0b367p20 0x1.479cb35122dccp19 0x0.0p0 -0x1.d6d53690d232fp5 0x1.27ffffffafc0ep5 0x0.0p0 F +REG epsg:3771 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:3771 1 OK -0x1.0f10eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cfffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3771 2 OK 0x1.0f10eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.a80000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3771 3 OK -0x1.0f10eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cfffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3771 4 OK 0x1.0f10eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.a80000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3772 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3772 1 OK -0x1.0f10eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dbffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3772 2 OK 0x1.0f10eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.b40000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3772 3 OK -0x1.0f10eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dbffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3772 4 OK 0x1.0f10eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.b40000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3773 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:3773 1 OK -0x1.0f10eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e7ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3773 2 OK 0x1.0f10eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c00000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3773 3 OK -0x1.0f10eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e7ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3773 4 OK 0x1.0f10eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c00000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3774 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:3774 1 OK -0x1.0f10eabcdad3ep19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f3ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3774 2 OK 0x1.0f10eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cc0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3774 3 OK -0x1.0f10eabcdad3ep19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f3ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3774 4 OK 0x1.0f10eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cc0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3775 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:3775 1 OK -0x1.0f1022c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3775 2 OK 0x1.0f1022c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.a80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3775 3 OK -0x1.0f1022c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3775 4 OK 0x1.0f1022c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.a80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3776 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3776 1 OK -0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dbffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3776 2 OK 0x1.0f1022c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.b40000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3776 3 OK -0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dbffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3776 4 OK 0x1.0f1022c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.b40000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3777 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:3777 1 OK -0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3777 2 OK 0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3777 3 OK -0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3777 4 OK 0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3778 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:3778 1 OK -0x1.0f1022c13138cp19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3778 2 OK 0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3778 3 OK -0x1.0f1022c13138cp19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3778 4 OK 0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3779 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:3779 1 OK -0x1.0f1022c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3779 2 OK 0x1.0f1022c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.a80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3779 3 OK -0x1.0f1022c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3779 4 OK 0x1.0f1022c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.a80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3780 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:3780 1 OK -0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dbffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3780 2 OK 0x1.0f1022c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.b40000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3780 3 OK -0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dbffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3780 4 OK 0x1.0f1022c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.b40000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3781 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:3781 1 OK -0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3781 2 OK 0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3781 3 OK -0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3781 4 OK 0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3782 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:3782 1 OK -0x1.0f1022c13138cp19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3782 2 OK 0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3782 3 OK -0x1.0f1022c13138cp19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3782 4 OK 0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3783 0 OK 0x1.bbcp13 0x1.e46p13 0x0.0p0 -0x1.0439d6d33f7ddp7 -0x1.9118ca9f6c712p4 0x0.0p0 F +REG epsg:3783 1 OK -0x1.fa4c0769b251ep18 -0x1.0d42af70e584ap19 0x0.0p0 -0x1.0f4410c2c7f09p7 -0x1.e118ca9f2caf5p4 0x0.0p0 F +REG epsg:3783 2 OK 0x1.0b0403b4d92a5p19 -0x1.0d42af70e584bp19 0x0.0p0 -0x1.f25f39c76e161p6 -0x1.e118ca9f2caf3p4 0x0.0p0 F +REG epsg:3783 3 OK -0x1.1355e16a7ecd7p19 0x1.11400aecdcb7dp19 0x0.0p0 -0x1.0f4410c2bdf59p7 -0x1.4118ca9f4de96p4 0x0.0p0 F +REG epsg:3783 4 OK 0x1.2133e16a7eceep19 0x1.11400aecdcb7cp19 0x0.0p0 -0x1.f25f39c7820c2p6 -0x1.4118ca9f4de96p4 0x0.0p0 F +REG epsg:3784 0 OK 0x1.e83e053d46e8ap18 0x1.b9970a083733cp22 0x1.30581acbp2 -0x1.02p7 -0x1.9000000000002p4 0x1.0p-30 F +REG epsg:3784 1 OK -0x1.fc8313ef372ap14 0x1.9700a749c00bap22 0x1.c04410fcp2 -0x1.0d08a5c0c2b97p7 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:3784 2 OK 0x1.f8221dd11c2b4p19 0x1.9700a749e3e56p22 0x1.6b34c7fp-2 -0x1.edeeb47e7a8d1p6 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:3784 3 OK -0x1.2fffb3a25fab8p16 0x1.dac9f7c22b8a3p22 0x1.9da30fb3p2 -0x1.0d08a5c0c2b97p7 -0x1.4p4 0x1.0p-29 F +REG epsg:3784 4 OK 0x1.071efdd0aaa98p20 0x1.dac9f7c24da3ap22 -0x1.8109664p-1 -0x1.edeeb47e7a8d1p6 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:3785 0 OK 0x0.0p0 -0x1.854a64p-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3785 1 OK -0x1.0fc6ae86e479fp19 -0x1.101f283b97e4cp19 0x0.0p0 -0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG epsg:3785 2 OK 0x1.0fc6ae86e479fp19 -0x1.101f283b97e4cp19 0x0.0p0 0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG epsg:3785 3 OK -0x1.0fc6ae86e479fp19 0x1.101f283b97e3ep19 0x0.0p0 -0x1.4p2 0x1.3ffffffffffebp2 0x0.0p0 F +REG epsg:3785 4 OK 0x1.0fc6ae86e479fp19 0x1.101f283b97e3ep19 0x0.0p0 0x1.4p2 0x1.3ffffffffffebp2 0x0.0p0 F +REG epsg:3786 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3786 1 OK -0x1.0f78e7cf91b44p19 -0x1.0f78e7cf91b44p19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3786 2 OK 0x1.0f78e7cf91b44p19 -0x1.0f78e7cf91b44p19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3786 3 OK -0x1.0f78e7cf91b44p19 0x1.0f78e7cf91b44p19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3786 4 OK 0x1.0f78e7cf91b44p19 0x1.0f78e7cf91b44p19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3787 0 OK 0x1.e82ea586aa2fbp18 -0x1.313433cc80f18p22 0x1.1edbb89048p7 0x1.dfffffffa2ee3p3 -0x1.49a0cc8663f83p-25 0x1.13bf9cp-8 T +REG epsg:3787 1 OK -0x1.af86e2b5f2ecp15 -0x1.5312cd8d6ad57p22 0x1.6cb37a42f8p7 0x1.3ffffffef317ap3 -0x1.400000284742ep2 0x1.469d64p-8 F +REG epsg:3787 2 OK 0x1.0191bcbfa5a38p20 -0x1.5313364de518cp22 0x1.8265385d58p7 0x1.4000000033169p4 -0x1.400000286cec9p2 0x1.450f28p-8 F +REG epsg:3787 3 OK -0x1.af5b631a46f3p15 -0x1.0f55272d43e02p22 0x1.95fdda569p6 0x1.3ffffffe93bf5p3 0x1.3fffffd78e996p2 0x1.cdbf08p-9 F +REG epsg:3787 4 OK 0x1.0193fb2271b3dp20 -0x1.0f55a3ea0f2eep22 0x1.c13f4afa8p6 0x1.4000000052b15p4 0x1.3fffffd774576p2 0x1.ca0b18p-9 F +REG epsg:3788 0 OK 0x1.ab3fp21 0x1.312dp23 0x0.0p0 0x1.4cp7 0x0.0p0 0x0.0p0 T +REG epsg:3788 1 OK 0x1.67793b2841a11p21 0x1.203d0e4893a26p23 0x0.0p0 0x1.420000000ea81p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3788 2 OK 0x1.ef04c4d7be5efp21 0x1.203d0e4893a26p23 0x0.0p0 0x1.55fffffff157fp7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3788 3 OK 0x1.67793b2841a11p21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.420000000ea81p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3788 4 OK 0x1.ef04c4d7be5efp21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.55fffffff157fp7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3789 0 OK 0x1.ab3fp21 0x1.312dp23 0x0.0p0 0x1.52p7 0x0.0p0 0x0.0p0 T +REG epsg:3789 1 OK 0x1.67793b2841a11p21 0x1.203d0e4893a26p23 0x0.0p0 0x1.480000000ea81p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3789 2 OK 0x1.ef04c4d7be5efp21 0x1.203d0e4893a26p23 0x0.0p0 0x1.5bfffffff157fp7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3789 3 OK 0x1.67793b2841a11p21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.480000000ea81p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3789 4 OK 0x1.ef04c4d7be5efp21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.5bfffffff157fp7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3790 0 OK 0x1.ab3fp21 0x1.312dp23 0x0.0p0 0x1.66p7 0x0.0p0 0x0.0p0 T +REG epsg:3790 1 OK 0x1.67793b2841a0ap21 0x1.203d0e4893a26p23 0x0.0p0 0x1.5c0000000ea8p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3790 2 OK 0x1.ef04c4d7be5efp21 0x1.203d0e4893a26p23 0x0.0p0 -0x1.600000000ea8p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3790 3 OK 0x1.67793b2841a0ap21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.5c0000000ea8p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3790 4 OK 0x1.ef04c4d7be5efp21 0x1.421cf1b76c5dap23 0x0.0p0 -0x1.600000000ea8p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3791 0 OK 0x1.ab3fp21 0x1.312dp23 0x0.0p0 -0x1.64p7 0x0.0p0 0x0.0p0 T +REG epsg:3791 1 OK 0x1.67793b2841a11p21 0x1.203d0e4893a26p23 0x0.0p0 0x1.620000000ea81p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3791 2 OK 0x1.ef04c4d7be5efp21 0x1.203d0e4893a26p23 0x0.0p0 -0x1.5a0000000ea81p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3791 3 OK 0x1.67793b2841a11p21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.620000000ea81p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3791 4 OK 0x1.ef04c4d7be5efp21 0x1.421cf1b76c5dap23 0x0.0p0 -0x1.5a0000000ea81p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3793 0 OK 0x1.ab3fp21 0x1.312dp23 0x0.0p0 -0x1.61p7 0x0.0p0 0x0.0p0 T +REG epsg:3793 1 OK 0x1.67793b2841a11p21 0x1.203d0e4893a26p23 0x0.0p0 0x1.650000000ea8p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3793 2 OK 0x1.ef04c4d7be5f6p21 0x1.203d0e4893a26p23 0x0.0p0 -0x1.570000000ea8p7 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3793 3 OK 0x1.67793b2841a11p21 0x1.421cf1b76c5dap23 0x0.0p0 0x1.650000000ea8p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3793 4 OK 0x1.ef04c4d7be5f6p21 0x1.421cf1b76c5dap23 0x0.0p0 -0x1.570000000ea8p7 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:3794 0 OK 0x1.e848p18 -0x1.312dp22 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:3794 1 OK -0x1.aec22c131378p15 -0x1.530c056ec23bbp22 0x0.0p0 0x1.40000000ea80dp3 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3794 2 OK 0x1.019a1160989bcp20 -0x1.530c056ec23bbp22 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3794 3 OK -0x1.aec22c131378p15 -0x1.0f4dfa913dc45p22 0x0.0p0 0x1.40000000ea80dp3 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3794 4 OK 0x1.019a1160989bcp20 -0x1.0f4dfa913dc45p22 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:3795 0 OK 0x1.e848p18 0x1.11ba010624dd3p18 0x0.0p0 -0x1.44p6 0x1.65999999998a2p4 0x0.0p0 F +REG epsg:3795 1 OK 0x1.599632cc2b7f2p18 0x1.0ba6aeffd1757p17 0x0.0p0 -0x1.499f5319fdd18p6 0x1.50ccccccccbcbp4 0x0.0p0 F +REG epsg:3795 2 OK 0x1.3b7ce699ea3fcp19 0x1.0ba6aeffd1757p17 0x0.0p0 -0x1.3e60ace6022e8p6 0x1.50ccccccccbcbp4 0x0.0p0 F +REG epsg:3795 3 OK 0x1.5c35a514d563p18 0x1.9ef829c1ad111p18 0x0.0p0 -0x1.499f5319fdd18p6 0x1.7a66666666578p4 0x0.0p0 F +REG epsg:3795 4 OK 0x1.3a2d2d75954dcp19 0x1.9ef829c1ad111p18 0x0.0p0 -0x1.3e60ace6022e8p6 0x1.7a66666666578p4 0x0.0p0 F +REG epsg:3796 0 OK 0x1.e848p18 0x1.bf83783126e37p17 0x0.0p0 -0x1.3355555555555p6 0x1.4b77777777665p4 0x0.0p0 F +REG epsg:3796 1 OK 0x1.686f0b534887p18 0x1.887e64ebf348p16 0x0.0p0 -0x1.385295ec85ecep6 0x1.38ccccccccbb7p4 0x0.0p0 F +REG epsg:3796 2 OK 0x1.34107a565bbc8p19 0x1.887e64ebf348p16 0x0.0p0 -0x1.2e5814be24bdcp6 0x1.38ccccccccbb7p4 0x0.0p0 F +REG epsg:3796 3 OK 0x1.6a606253da072p18 0x1.5e626ead99934p18 0x0.0p0 -0x1.385295ec85ecep6 0x1.5e22222222129p4 0x0.0p0 F +REG epsg:3796 4 OK 0x1.3317ced612fc7p19 0x1.5e626ead99934p18 0x0.0p0 -0x1.2e5814be24bdcp6 0x1.5e22222222129p4 0x0.0p0 F +REG epsg:3797 0 OK 0x1.86ap19 0x1.45c0b6a3c7a2bp18 0x0.0p0 -0x1.18p6 0x1.77ffffffffff7p5 0x0.0p0 F +REG epsg:3797 1 OK 0x1.b99d510f4c42p15 -0x1.1d3fd88fc8025p18 0x0.0p0 -0x1.3b30d1bebb10ap6 0x1.47fffffffffeap5 0x0.0p0 F +REG epsg:3797 2 OK 0x1.78d31577859dap20 -0x1.1d3fd88fc8025p18 0x0.0p0 -0x1.e99e5c8289dedp5 0x1.47fffffffffeap5 0x0.0p0 F +REG epsg:3797 3 OK 0x1.9788a43093ecp17 0x1.f964b5910a778p19 0x0.0p0 -0x1.3b30d1bebb10ap6 0x1.a7ffffffffc36p5 0x0.0p0 F +REG epsg:3797 4 OK 0x1.53aeeb79ed824p20 0x1.f964b5910a778p19 0x0.0p0 -0x1.e99e5c8289dedp5 0x1.a7ffffffffc36p5 0x0.0p0 F +REG epsg:3798 0 OK 0x1.86ap19 0x1.45c14cfd0f6a8p18 0x0.0p0 -0x1.18p6 0x1.77ffffffffff7p5 0x0.0p0 F +REG epsg:3798 1 OK 0x1.b9c4f223bea2p15 -0x1.1d413860bb254p18 0x0.0p0 -0x1.3b30d1bebb10ap6 0x1.47fffffffffecp5 0x0.0p0 F +REG epsg:3798 2 OK 0x1.78d1d86ee20aap20 -0x1.1d413860bb26cp18 0x0.0p0 -0x1.e99e5c8289dedp5 0x1.47fffffffffebp5 0x0.0p0 F +REG epsg:3798 3 OK 0x1.9792dd1a2078p17 0x1.f964b6b2b3da5p19 0x0.0p0 -0x1.3b30d1bebb10ap6 0x1.a7ffffffffc6bp5 0x0.0p0 F +REG epsg:3798 4 OK 0x1.53ada45cbbf0cp20 0x1.f964b6b2b3d9fp19 0x0.0p0 -0x1.e99e5c8289dedp5 0x1.a7ffffffffc6bp5 0x0.0p0 F +REG epsg:3799 0 OK 0x1.86ap19 0x1.45c14cfd0f6a8p18 0x0.0p0 -0x1.18p6 0x1.77ffffffffff7p5 0x0.0p0 F +REG epsg:3799 1 OK 0x1.b9c4f223bea2p15 -0x1.1d413860bb254p18 0x0.0p0 -0x1.3b30d1bebb10ap6 0x1.47fffffffffecp5 0x0.0p0 F +REG epsg:3799 2 OK 0x1.78d1d86ee20aap20 -0x1.1d413860bb26cp18 0x0.0p0 -0x1.e99e5c8289dedp5 0x1.47fffffffffebp5 0x0.0p0 F +REG epsg:3799 3 OK 0x1.9792dd1a2078p17 0x1.f964b6b2b3da5p19 0x0.0p0 -0x1.3b30d1bebb10ap6 0x1.a7ffffffffc6bp5 0x0.0p0 F +REG epsg:3799 4 OK 0x1.53ada45cbbf0cp20 0x1.f964b6b2b3d9fp19 0x0.0p0 -0x1.e99e5c8289dedp5 0x1.a7ffffffffc6bp5 0x0.0p0 F +REG epsg:3800 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:3800 1 OK -0x1.0f10eabcdad3ep19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f3ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3800 2 OK 0x1.0f10eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cc0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3800 3 OK -0x1.0f10eabcdad3ep19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f3ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3800 4 OK 0x1.0f10eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cc0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:3801 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:3801 1 OK -0x1.0f1022c13138cp19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3801 2 OK 0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3801 3 OK -0x1.0f1022c13138cp19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3801 4 OK 0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3802 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:3802 1 OK -0x1.0f1022c13138cp19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3802 2 OK 0x1.0f1022c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3802 3 OK -0x1.0f1022c13138cp19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f3ffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3802 4 OK 0x1.0f1022c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3812 0 OK 0x1.3d0ep19 0x1.34a8d60d1baf2p19 0x0.0p0 0x1.16fd646817cfbp2 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:3812 1 OK 0x1.e4d03bced3adp18 0x1.da9917072fefep18 0x0.0p0 0x1.21ab3723f107dp1 0x1.8955555554e34p5 0x0.0p0 F +REG epsg:3812 2 OK 0x1.87b3e21896298p19 0x1.da9917072fefep18 0x0.0p0 0x1.9d252d3e371b9p2 0x1.8955555554e34p5 0x0.0p0 F +REG epsg:3812 3 OK 0x1.ecfd90c2236b2p18 0x1.7e16278f9e045p19 0x0.0p0 0x1.21ab3723f107cp1 0x1.9eaaaaaaaa63p5 0x0.0p0 F +REG epsg:3812 4 OK 0x1.839d379eee4a7p19 0x1.7e16278f9e045p19 0x0.0p0 0x1.9d252d3e371b9p2 0x1.9eaaaaaaaa63p5 0x0.0p0 F +REG epsg:3814 0 OK 0x1.e848p18 0x1.3d62p20 0x0.0p0 -0x1.67p6 0x1.04p5 0x0.0p0 F +REG epsg:3814 1 OK -0x1.5124af7818e2p16 0x1.730763013f554p19 0x0.0p0 -0x1.7eb6ba5949874p6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:3814 2 OK 0x1.09364af7818e2p20 0x1.730763013f554p19 0x0.0p0 -0x1.4f4945a6b678dp6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:3814 3 OK -0x1.7cf6761f76e6p14 0x1.c8d388b870dfp20 0x0.0p0 -0x1.7eb6ba5938334p6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:3814 4 OK 0x1.f42fb3b0fbb73p19 0x1.c8d388b870dfp20 0x0.0p0 -0x1.4f4945a6c7ccdp6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:3815 0 OK 0x1.e848p18 0x1.3d62p20 0x0.0p0 -0x1.67p6 0x1.04p5 0x0.0p0 F +REG epsg:3815 1 OK -0x1.5124af7818e2p16 0x1.730763013f554p19 0x0.0p0 -0x1.7eb6ba5949874p6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:3815 2 OK 0x1.09364af7818e2p20 0x1.730763013f554p19 0x0.0p0 -0x1.4f4945a6b678dp6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:3815 3 OK -0x1.7cf6761f76e6p14 0x1.c8d388b870dfp20 0x0.0p0 -0x1.7eb6ba5938334p6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:3815 4 OK 0x1.f42fb3b0fbb73p19 0x1.c8d388b870dfp20 0x0.0p0 -0x1.4f4945a6c7ccdp6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:3816 0 OK 0x1.e848p18 0x1.3d62p20 0x0.0p0 -0x1.67p6 0x1.04p5 0x0.0p0 F +REG epsg:3816 1 OK -0x1.5124af7818e2p16 0x1.730763013f554p19 0x0.0p0 -0x1.7eb6ba5949874p6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:3816 2 OK 0x1.09364af7818e2p20 0x1.730763013f554p19 0x0.0p0 -0x1.4f4945a6b678dp6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:3816 3 OK -0x1.7cf6761f76e6p14 0x1.c8d388b870dfp20 0x0.0p0 -0x1.7eb6ba5938334p6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:3816 4 OK 0x1.f42fb3b0fbb73p19 0x1.c8d388b870dfp20 0x0.0p0 -0x1.4f4945a6c7ccdp6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:3819 0 OK -0x1.5cbad6884acdcp-10 -0x1.674fdb457a4e9p-8 0x1.4c3ec73c1p7 0x1.17b427f4f66abp-26 -0x1.473263d9c618dp-28 0x1.6fdb4p-10 T +REG epsg:3819 1 OK -0x1.401f2faf0769ep2 -0x1.405da6ce922cbp2 0x1.c358f4fe18p7 -0x1.3ffffff01ap2 -0x1.400000079ce68p2 0x1.3e811p-10 F +REG epsg:3819 2 OK 0x1.3ff05a5dbdfefp2 -0x1.40613655a1ddbp2 0x1.991b8a444p7 0x1.40000011e7e0bp2 -0x1.4000000674b2dp2 0x1.df4bdp-10 F +REG epsg:3819 3 OK -0x1.401bbd9e247c8p2 0x1.3fadfafdf2a64p2 0x1.0f7cad9b7p7 -0x1.3fffffef8d09ep2 0x1.3ffffffcf4892p2 0x1.0bf41p-10 F +REG epsg:3819 4 OK 0x1.3ff364b40ab91p2 0x1.3faaf7bd68806p2 0x1.ca63e6a48p6 0x1.400000129c34cp2 0x1.3ffffffd0d05ap2 0x1.b2b06p-10 F +REG epsg:3821 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3821 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3821 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3821 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3821 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3822 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3822 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3822 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3822 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3822 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3824 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3824 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3824 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3824 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3824 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3825 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 0x1.dcp6 0x0.0p0 0x0.0p0 T +REG epsg:3825 1 OK -0x1.29fc4582626e6p18 -0x1.0ef82b7611dd6p19 0x0.0p0 0x1.c80000001d503p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3825 2 OK 0x1.892222c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 0x1.efffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3825 3 OK -0x1.29fc4582626e6p18 0x1.0ef82b7611dd6p19 0x0.0p0 0x1.c80000001d503p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3825 4 OK 0x1.892222c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 0x1.efffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3826 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 0x1.e4p6 0x0.0p0 0x0.0p0 T +REG epsg:3826 1 OK -0x1.29fc4582626e6p18 -0x1.0ef82b7611dd6p19 0x0.0p0 0x1.d00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3826 2 OK 0x1.892222c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 0x1.f7ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3826 3 OK -0x1.29fc4582626e6p18 0x1.0ef82b7611dd6p19 0x0.0p0 0x1.d00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3826 4 OK 0x1.892222c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 0x1.f7ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3827 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 0x1.dcp6 0x0.0p0 0x0.0p0 T +REG epsg:3827 1 OK -0x1.29fcc5a85c97ep18 -0x1.0ef868a0a2373p19 0x0.0p0 0x1.c80000001d507p6 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3827 2 OK 0x1.892262d42e4bfp19 -0x1.0ef868a0a2373p19 0x0.0p0 0x1.efffffffe2af9p6 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3827 3 OK -0x1.29fcc5a85c97ep18 0x1.0ef868a0a2373p19 0x0.0p0 0x1.c80000001d507p6 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3827 4 OK 0x1.892262d42e4bfp19 0x1.0ef868a0a2373p19 0x0.0p0 0x1.efffffffe2af9p6 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3828 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 0x1.e4p6 0x0.0p0 0x0.0p0 T +REG epsg:3828 1 OK -0x1.29fcc5a85c97ep18 -0x1.0ef868a0a2373p19 0x0.0p0 0x1.d00000001d507p6 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3828 2 OK 0x1.892262d42e4bfp19 -0x1.0ef868a0a2373p19 0x0.0p0 0x1.f7ffffffe2af9p6 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3828 3 OK -0x1.29fcc5a85c97ep18 0x1.0ef868a0a2373p19 0x0.0p0 0x1.d00000001d507p6 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3828 4 OK 0x1.892262d42e4bfp19 0x1.0ef868a0a2373p19 0x0.0p0 0x1.f7ffffffe2af9p6 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:3829 0 OK 0x1.e777c4d2b55f7p18 0x1.95d8ae36b89p7 -0x1.12e4fd4988p7 0x1.ebfffffffffffp6 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:3829 1 OK -0x1.b411ef62c891p15 -0x1.0ecb7fe56d595p19 -0x1.4bddd94d9p6 0x1.d800000000003p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3829 2 OK 0x1.015c71234aefap20 -0x1.0ecb7fe01d04cp19 -0x1.c74f655458p7 0x1.0000000000001p7 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3829 3 OK -0x1.b40bbc8c6fcap15 0x1.0efe3a8e0f327p19 -0x1.7ca6caddap5 0x1.d800000000003p6 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:3829 4 OK 0x1.015c3fb273ffcp20 0x1.0efe3a88bceb7p19 -0x1.8089c17a6p7 0x1.0000000000001p7 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:3832 0 OK 0x0.0p0 0x1.854a64p-31 0x0.0p0 0x1.2cp7 0x0.0p0 0x0.0p0 T +REG epsg:3832 1 OK -0x1.0fc6ae86e4799p19 -0x1.0e4dfb191d5f6p19 0x0.0p0 0x1.22p7 -0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3832 2 OK 0x1.0fc6ae86e4799p19 -0x1.0e4dfb191d5f6p19 0x0.0p0 0x1.36p7 -0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3832 3 OK -0x1.0fc6ae86e4799p19 0x1.0e4dfb191d5ffp19 0x0.0p0 0x1.22p7 0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3832 4 OK 0x1.0fc6ae86e4799p19 0x1.0e4dfb191d5ffp19 0x0.0p0 0x1.36p7 0x1.3fffffffffe13p2 0x0.0p0 F +REG epsg:3833 0 OK 0x1.3130df6452ed3p21 0x1.31ada5b4dc61ep6 -0x1.c2c848aa4p6 0x1.2000000000428p3 0x1.c88c10ce3c148p-32 0x1.bfeap-14 T +REG epsg:3833 1 OK 0x1.dad5971f49b03p20 -0x1.0ef6fe83c49e3p19 -0x1.08a123b4a8p7 0x1.00000001cfd17p2 -0x1.3fffffff68004p2 0x1.9c6p-14 F +REG epsg:3833 2 OK 0x1.74f702f37d854p21 -0x1.0ef6b36e834bdp19 -0x1.a90f6e1edp6 0x1.bfffffff18141p3 -0x1.3fffffff68202p2 0x1.9cc4p-14 F +REG epsg:3833 3 OK 0x1.dad58a696ae8p20 0x1.0f09dadbaa178p19 -0x1.dc1014764p6 0x1.00000001d14fbp2 0x1.4000000048264p2 0x1.ded7p-14 F +REG epsg:3833 4 OK 0x1.74f6e9fa37035p21 0x1.0f0a0c796dd62p19 -0x1.73daf58a2p6 0x1.bfffffff17226p3 0x1.4000000047ddap2 0x1.df1dp-14 F +REG epsg:3834 0 OK 0x1.3130dca372b33p21 0x1.3801725a0b661p6 -0x1.caffa40e1p6 0x1.1ffffffffffffp3 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:3834 1 OK 0x1.dad586522221cp20 -0x1.0ef69d2bae95ap19 -0x1.087e39832p7 0x1.00000001d44ccp2 -0x1.3fffffffeaeb4p2 -0x1.cp-28 F +REG epsg:3834 2 OK 0x1.74f6f62b384edp21 -0x1.0ef69d2c77a7ep19 -0x1.bb265d0dbp6 0x1.bfffffff153acp3 -0x1.3fffffffeadacp2 0x1.8p-29 F +REG epsg:3834 3 OK 0x1.dad5995984cdcp20 0x1.0f0a1d18fa519p19 -0x1.da99d0d88p6 0x1.00000001d445ap2 0x1.3fffffffeae9bp2 -0x1.8p-28 F +REG epsg:3834 4 OK 0x1.74f6eca672b5fp21 0x1.0f0a1d19c3803p19 -0x1.84c3c6f24p6 0x1.bfffffff153e6p3 0x1.3fffffffead95p2 0x0.0p0 F +REG epsg:3835 0 OK 0x1.ab42dcddc8aedp21 0x1.3801488aab346p6 -0x1.972e60473p6 0x1.dfffffffffffep3 0x0.0p0 -0x1.0p-30 T +REG epsg:3835 1 OK 0x1.677ccc62de0a8p21 -0x1.0ef678c52e44dp19 -0x1.dd9277b1dp6 0x1.40000000ea25bp3 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:3835 2 OK 0x1.ef08ed661a14cp21 -0x1.0ef678c5f7701p19 -0x1.87b75106dp6 0x1.3fffffff8a9dap4 -0x1.3fffffffeadadp2 0x1.4p-28 F +REG epsg:3835 3 OK 0x1.677cd5e68b89ep21 0x1.0f09f8afe2501p19 -0x1.a72fdcbf1p6 0x1.40000000ea222p3 0x1.3fffffffeae9fp2 -0x1.cp-28 F +REG epsg:3835 4 OK 0x1.ef08e3e158428p21 0x1.0f09f8b0ab97ap19 -0x1.5154c227p6 0x1.3fffffff8a9f7p4 0x1.3fffffffead94p2 0x1.8p-28 F +REG epsg:3836 0 OK 0x1.12aa6921486dap22 0x1.38011ef37d2c3p6 -0x1.63a2bb1aap6 0x1.5p4 0x0.0p0 -0x1.8p-29 T +REG epsg:3836 1 OK 0x1.e18ecabaf1398p21 -0x1.0ef6548f9bd6p19 -0x1.a9f52c247p6 0x1.000000007513p4 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:3836 2 OK 0x1.348d6cebba343p22 -0x1.0ef6549062e6p19 -0x1.5505c37e8p6 0x1.9fffffff8a9e6p4 -0x1.3fffffffeadaep2 0x1.0p-29 F +REG epsg:3836 3 OK 0x1.e18ed43e9c6adp21 0x1.0f09d477bbaccp19 -0x1.73929873cp6 0x1.0000000075114p4 0x1.3fffffffeae9bp2 -0x1.0p-30 F +REG epsg:3836 4 OK 0x1.348d68295bedap22 0x1.0f09d47882d8cp19 -0x1.1ea33bbfcp6 0x1.9fffffff8aa03p4 0x1.3fffffffead9ap2 0x1.4p-28 F +REG epsg:3837 0 OK 0x1.ab42df6452ed3p21 0x1.31ada5b4dc61ep6 -0x1.c2c848aa4p6 0x1.2000000000428p3 0x1.c88c10ce3c148p-32 0x1.bfeap-14 T +REG epsg:3837 1 OK 0x1.677ccb8fa4d82p21 -0x1.0ef6fe83c49e3p19 -0x1.08a123b4a8p7 0x1.00000001cfd19p2 -0x1.3fffffff68004p2 0x1.9c6p-14 F +REG epsg:3837 2 OK 0x1.ef0902f37d854p21 -0x1.0ef6b36e834bdp19 -0x1.a90f6e1edp6 0x1.bfffffff18141p3 -0x1.3fffffff68202p2 0x1.9cc4p-14 F +REG epsg:3837 3 OK 0x1.677cc534b574p21 0x1.0f09dadbaa178p19 -0x1.dc1014764p6 0x1.00000001d14fbp2 0x1.4000000048264p2 0x1.ded7p-14 F +REG epsg:3837 4 OK 0x1.ef08e9fa37035p21 0x1.0f0a0c796dd62p19 -0x1.73daf58a2p6 0x1.bfffffff17226p3 0x1.4000000047ddap2 0x1.df1dp-14 F +REG epsg:3838 0 OK 0x1.12aa70fa57625p22 0x1.3406bc9ce92a6p6 -0x1.a352482c6p6 0x1.8000000001882p3 0x1.c7aba03098f95p-32 0x1.c03dp-14 T +REG epsg:3838 1 OK 0x1.e18ed392a7c8bp21 -0x1.0ef6d59131083p19 -0x1.f2264a6d7p6 0x1.c0000001d2de2p2 -0x1.3fffffff67b9fp2 0x1.9bdap-14 F +REG epsg:3838 2 OK 0x1.348d8004c41acp22 -0x1.0ef68a9a9f31dp19 -0x1.89ba73cf3p6 0x1.0fffffff8cc92p4 -0x1.3fffffff68cc5p2 0x1.9e0ap-14 F +REG epsg:3838 3 OK 0x1.e18ecd3f89997p21 0x1.0f09d79933feep19 -0x1.bcf368f9p6 0x1.c0000001d3549p2 0x1.4000000048787p2 0x1.de7dp-14 F +REG epsg:3838 4 OK 0x1.348d738bec4adp22 0x1.0f0a09184d793p19 -0x1.54854deb6p6 0x1.0fffffff8c0edp4 0x1.4000000047154p2 0x1.dff4p-14 F +REG epsg:3839 0 OK 0x1.21ebaf6015247p23 0x1.3f85d061ba469p6 -0x1.076108be9p6 0x1.b000000003af9p4 0x1.b0b84e3cea286p-32 0x1.c856p-14 T +REG epsg:3839 1 OK 0x1.10fa327345f62p23 -0x1.0ef60a77dfd2ap19 -0x1.55d0d97e4p6 0x1.600000007870dp4 -0x1.3fffffff6a9cbp2 0x1.a147p-14 F +REG epsg:3839 2 OK 0x1.32dd300715befp23 -0x1.0ef5c2a3d4921p19 -0x1.e11e6cc7cp5 0x1.ffffffff9014cp4 -0x1.3fffffff7059ep2 0x1.abc8p-14 F +REG epsg:3839 3 OK 0x1.10fa311108a61p23 0x1.0f09c793acfd4p19 -0x1.209a96151p6 0x1.6000000077476p4 0x1.40000000451ddp2 0x1.e20ep-14 F +REG epsg:3839 4 OK 0x1.32dd29fcecd49p23 0x1.0f09f5f046739p19 -0x1.76ad98594p5 0x1.ffffffff8e1e8p4 0x1.400000003e5cp2 0x1.e8dfp-14 F +REG epsg:3840 0 OK 0x1.40702b1fb87a7p23 0x1.41baa7ed93af3p6 -0x1.d21f9e9c4p5 0x1.e0000000042c2p4 0x1.a8812ce051cebp-32 0x1.cb25p-14 T +REG epsg:3840 1 OK 0x1.2f7eaf7ac54fbp23 -0x1.0ef5e2f4be902p19 -0x1.36fdeb762p6 0x1.90000000791e9p4 -0x1.3fffffff6c085p2 0x1.a3e3p-14 F +REG epsg:3840 2 OK 0x1.5161aa6cc4c02p23 -0x1.0ef59c3ff164bp19 -0x1.a66c7afb8p5 0x1.17ffffffc84ep5 -0x1.3fffffff72ad3p2 0x1.afd6p-14 F +REG epsg:3840 3 OK 0x1.2f7eae2a994c5p23 0x1.0f09c47d45f3p19 -0x1.01c6ff7f8p6 0x1.9000000077b51p4 0x1.400000004378ap2 0x1.e3c3p-14 F +REG epsg:3840 4 OK 0x1.5161a4749f7dap23 0x1.0f09f1ba9eb6ap19 -0x1.3bfa6a872p5 0x1.17ffffffc734ep5 0x1.400000003bb11p2 0x1.eb74p-14 F +REG epsg:3841 0 OK 0x1.8cbc6c74dc01dp22 0x1.380133b0bbf17p6 -0x1.7d56c7562p6 0x1.1ffffffffffffp4 0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG epsg:3841 1 OK 0x1.6ad96675c5d5p22 -0x1.0ef6669de7cf5p19 -0x1.c3c12e45ep6 0x1.a0000000ea25dp3 -0x1.3fffffffeaeb4p2 -0x1.4p-28 F +REG epsg:3841 2 OK 0x1.ae9f727a9f328p22 -0x1.0ef6669eb0334p19 -0x1.6e3de657ep6 0x1.6fffffff8a9dfp4 -0x1.3fffffffeadaep2 0x1.0p-30 F +REG epsg:3841 3 OK 0x1.6ad96b379be86p22 0x1.0f09e68750dc7p19 -0x1.8d5e96f45p6 0x1.a0000000ea222p3 0x1.3fffffffeae9cp2 -0x1.0p-29 F +REG epsg:3841 4 OK 0x1.ae9f6db83f833p22 0x1.0f09e688195ccp19 -0x1.37db5b0dp6 0x1.6fffffff8a9fcp4 0x1.3fffffffead98p2 0x1.0p-28 F +REG epsg:3842 0 OK 0x1.8cbc6c74dc01dp22 0x1.380133b0bbf17p6 -0x1.7d56c7562p6 0x1.1ffffffffffffp4 0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG epsg:3842 1 OK 0x1.6ad96675c5d5p22 -0x1.0ef6669de7cf5p19 -0x1.c3c12e45ep6 0x1.a0000000ea25dp3 -0x1.3fffffffeaeb4p2 -0x1.4p-28 F +REG epsg:3842 2 OK 0x1.ae9f727a9f328p22 -0x1.0ef6669eb0334p19 -0x1.6e3de657ep6 0x1.6fffffff8a9dfp4 -0x1.3fffffffeadaep2 0x1.0p-30 F +REG epsg:3842 3 OK 0x1.6ad96b379be86p22 0x1.0f09e68750dc7p19 -0x1.8d5e96f45p6 0x1.a0000000ea222p3 0x1.3fffffffeae9cp2 -0x1.0p-29 F +REG epsg:3842 4 OK 0x1.ae9f6db83f833p22 0x1.0f09e688195ccp19 -0x1.37db5b0dp6 0x1.6fffffff8a9fcp4 0x1.3fffffffead98p2 0x1.0p-28 F +REG epsg:3843 0 OK 0x1.8cbc6c74dc01dp22 0x1.380133b0bbf17p6 -0x1.7d56c7562p6 0x1.1ffffffffffffp4 0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG epsg:3843 1 OK 0x1.6ad96675c5d5p22 -0x1.0ef6669de7cf5p19 -0x1.c3c12e45ep6 0x1.a0000000ea25dp3 -0x1.3fffffffeaeb4p2 -0x1.4p-28 F +REG epsg:3843 2 OK 0x1.ae9f727a9f328p22 -0x1.0ef6669eb0334p19 -0x1.6e3de657ep6 0x1.6fffffff8a9dfp4 -0x1.3fffffffeadaep2 0x1.0p-30 F +REG epsg:3843 3 OK 0x1.6ad96b379be86p22 0x1.0f09e68750dc7p19 -0x1.8d5e96f45p6 0x1.a0000000ea222p3 0x1.3fffffffeae9cp2 -0x1.0p-29 F +REG epsg:3843 4 OK 0x1.ae9f6db83f833p22 0x1.0f09e688195ccp19 -0x1.37db5b0dp6 0x1.6fffffff8a9fcp4 0x1.3fffffffead98p2 0x1.0p-28 F +REG epsg:3844 0 OK 0x1.e86d042f0cddcp18 0x1.e84944c4f21d4p18 -0x1.2dd79e102p5 0x1.8ffffffff1809p4 0x1.6ffffffffa9b9p5 0x1.df4p-15 F +REG epsg:3844 1 OK -0x1.9e72eccf45ffp16 -0x1.cc23aa85844p14 -0x1.a635fb53ap5 0x1.1cd5e1cf34688p4 0x1.47fffffffbccbp5 0x1.056ep-14 F +REG epsg:3844 2 OK 0x1.0e1dc41c668fp20 -0x1.cc19c94a925p14 -0x1.b64170e54p4 0x1.01950f185a7bap5 0x1.47fffffffac1bp5 0x1.deb2p-15 F +REG epsg:3844 3 OK -0x1.5794dd0370b4p12 0x1.07afbb4947236p20 -0x1.7b77c2a58p5 0x1.1cd5e1cf2da97p4 0x1.97fffffffa4f6p5 0x1.dbbp-15 F +REG epsg:3844 4 OK 0x1.eb1c0351ca674p19 0x1.07afc1b16705dp20 -0x1.a4429744cp4 0x1.01950f1856cfap5 0x1.97fffffffa205p5 0x1.a9b6p-15 F +REG epsg:3845 0 OK 0x1.6e37924189375p20 -0x1.4da4189374bc7p9 0x0.0p0 0x1.69ccccccccccdp3 0x0.0p0 0x0.0p0 T +REG epsg:3845 1 OK 0x1.cd57a68b45403p19 -0x1.0f52ef0c51adp19 0x0.0p0 0x1.9399999b6e9b6p2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3845 2 OK 0x1.f5c3513d6fce8p20 -0x1.0f52ef0c51adp19 0x0.0p0 0x1.04e66665f125fp4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3845 3 OK 0x1.cd57a68b45403p19 0x1.0eac1d0007f2ap19 0x0.0p0 0x1.9399999b6e9b6p2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3845 4 OK 0x1.f5c3513d6fce8p20 0x1.0eac1d0007f2ap19 0x0.0p0 0x1.04e66665f125fp4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3846 0 OK 0x1.6e38cb1eb851fp20 -0x1.4d90a3d70a3d7p9 0x0.0p0 0x1.b1ccefc0a6066p3 0x0.0p0 0x0.0p0 T +REG epsg:3846 1 OK 0x1.cd5a1bd3441d9p19 -0x1.0f52e6a1d257p19 0x0.0p0 0x1.11ccefc190875p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3846 2 OK 0x1.f5c48853ce952p20 -0x1.0f52e6a1d257p19 0x0.0p0 0x1.28e677dfddc2dp4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3846 3 OK 0x1.cd5a1bd3441d9p19 0x1.0eac1e4fe6d1ep19 0x0.0p0 0x1.11ccefc190875p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3846 4 OK 0x1.f5c48853ce952p20 0x1.0eac1e4fe6d1ep19 0x0.0p0 0x1.28e677dfddc2dp4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3847 0 OK 0x1.6e3a04624dd2fp20 -0x1.4ddb020c49ba6p9 0x0.0p0 0x1.f9cd1536a7827p3 0x0.0p0 0x0.0p0 T +REG epsg:3847 1 OK 0x1.cd5c91b97d1cp19 -0x1.0f52f5da9df8fp19 0x0.0p0 0x1.59cd153792034p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3847 2 OK 0x1.f5c5bfe7dd17ep20 -0x1.0f52f5da9df8fp19 0x0.0p0 0x1.4ce68a9ade80cp4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3847 3 OK 0x1.cd5c91b97d1cp19 0x1.0eac085997d41p19 0x0.0p0 0x1.59cd153792034p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3847 4 OK 0x1.f5c5bfe7dd17ep20 0x1.0eac085997d41p19 0x0.0p0 0x1.4ce68a9ade80cp4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3848 0 OK 0x1.6e3b385604189p20 -0x1.4e6c083126e98p9 0x0.0p0 0x1.20e69ad42c3cap4 0x0.0p0 0x0.0p0 T +REG epsg:3848 1 OK 0x1.cd5efd5d1cfbp19 -0x1.0f53166048676p19 0x0.0p0 0x1.a1cd35a942fa2p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3848 2 OK 0x1.f5c6f1fd79b3ap20 -0x1.0f53166048676p19 0x0.0p0 0x1.70e69ad3b6fc3p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3848 3 OK 0x1.cd5efd5d1cfbp19 0x1.0eabe05c2fd3ep19 0x0.0p0 0x1.a1cd35a942fa2p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3848 4 OK 0x1.f5c6f1fd79b3ap20 0x1.0eabe05c2fd3ep19 0x0.0p0 0x1.70e69ad3b6fc3p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3849 0 OK 0x1.6e3c6c3d70a3dp20 -0x1.4f5a5e353f7cfp9 0x0.0p0 0x1.44e6ac4e18d97p4 0x0.0p0 0x0.0p0 T +REG epsg:3849 1 OK 0x1.cd6168b996b98p19 -0x1.0f534e6879322p19 0x0.0p0 0x1.e9cd589d1c33cp3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3849 2 OK 0x1.f5c8241e15eaep20 -0x1.0f534e6879322p19 0x0.0p0 0x1.94e6ac4da399p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3849 3 OK 0x1.cd6168b996b98p19 0x1.0eaba1395e926p19 0x0.0p0 0x1.e9cd589d1c33cp3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3849 4 OK 0x1.f5c8241e15eaep20 0x1.0eaba1395e926p19 0x0.0p0 0x1.94e6ac4da399p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3850 0 OK 0x1.6e3d9d89374bcp20 -0x1.50474bc6a7efap9 0x0.0p0 0x1.68e6bdc805761p4 0x0.0p0 0x0.0p0 T +REG epsg:3850 1 OK 0x1.cd63d0a595057p19 -0x1.0f53844fe5333p19 0x0.0p0 0x1.18e6bdc87ab68p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3850 2 OK 0x1.f5c952bfa414bp20 -0x1.0f53844fe5333p19 0x0.0p0 0x1.b8e6bdc79035ap4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3850 3 OK 0x1.cd63d0a595057p19 0x1.0eab60aa01df3p19 0x0.0p0 0x1.18e6bdc87ab68p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3850 4 OK 0x1.f5c952bfa414bp20 0x1.0eab60aa01df3p19 0x0.0p0 0x1.b8e6bdc79035ap4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3851 0 OK 0x1.6e36p21 0x1.ab3fp22 0x0.0p0 0x1.5ap7 -0x1.47fffffffffeap5 0x0.0p0 F +REG epsg:3851 1 OK 0x1.1962e23447ee7p21 0x1.797b839dc14c9p22 0x0.0p0 0x1.477327474f15cp7 -0x1.7fffffffff761p5 0x0.0p0 F +REG epsg:3851 2 OK 0x1.c3091dcbb8115p21 0x1.797b839dc14c9p22 0x0.0p0 -0x1.637327474f15dp7 -0x1.7fffffffff761p5 0x0.0p0 F +REG epsg:3851 3 OK 0x1.053e0d444618bp21 0x1.d7e6d858f8f54p22 0x0.0p0 0x1.477327474f15cp7 -0x1.0ffffffffffcap5 0x0.0p0 F +REG epsg:3851 4 OK 0x1.d72df2bbb9e7p21 0x1.d7e6d858f8f54p22 0x0.0p0 -0x1.637327474f15dp7 -0x1.0ffffffffffcap5 0x0.0p0 F +REG epsg:3852 0 OK 0x1.e848p18 0x1.74abcf0b7d286p19 0x0.0p0 0x1.3ap7 -0x1.4d55555555555p6 0x0.0p0 F +REG epsg:3852 1 OK 0x1.84d5832e679e6p18 0x1.e3d45fff36a3p15 0x0.0p0 0x1.84p6 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3852 2 OK 0x1.25dd3e68cc30dp19 0x1.e3d45fff36a36p15 0x0.0p0 -0x1.1ep7 -0x1.6400000000001p6 0x0.0p0 F +REG epsg:3852 3 OK -0x1.5c4448b77292bp20 0x1.1e08edbd7b63ap20 0x0.0p0 0x1.84p6 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3852 4 OK 0x1.2834245bb9494p21 0x1.1e08edbd7b63dp20 0x0.0p0 -0x1.1ep7 -0x1.17ffffffffffep6 0x0.0p0 F +REG epsg:3854 0 OK 0x1.8756bd97f62b7p16 -0x1.8cc4307b98c7ep22 0x0.0p0 0x1.20ed0917d6b66p4 0x0.0p0 0x0.0p0 T +REG epsg:3854 1 OK -0x1.bc57c7d05b654p18 -0x1.aea408f2f0323p22 0x0.0p0 0x1.a1da123097edbp3 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:3854 2 OK 0x1.4001934e2b3d5p19 -0x1.aea408f2f0323p22 0x0.0p0 0x1.70ed09176175fp4 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:3854 3 OK -0x1.bc57c7d05b654p18 -0x1.6ae45804415d9p22 0x0.0p0 0x1.a1da123097edbp3 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:3854 4 OK 0x1.4001934e2b3d5p19 -0x1.6ae45804415d9p22 0x0.0p0 0x1.70ed09176175fp4 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:3857 0 OK 0x0.0p0 -0x1.854a64p-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3857 1 OK -0x1.0fc6ae86e479fp19 -0x1.101f283b97e4cp19 0x0.0p0 -0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG epsg:3857 2 OK 0x1.0fc6ae86e479fp19 -0x1.101f283b97e4cp19 0x0.0p0 0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG epsg:3857 3 OK -0x1.0fc6ae86e479fp19 0x1.101f283b97e3ep19 0x0.0p0 -0x1.4p2 0x1.3ffffffffffebp2 0x0.0p0 F +REG epsg:3857 4 OK 0x1.0fc6ae86e479fp19 0x1.101f283b97e3ep19 0x0.0p0 0x1.4p2 0x1.3ffffffffffebp2 0x0.0p0 F +REG epsg:3873 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.3p4 0x0.0p0 0x0.0p0 T +REG epsg:3873 1 OK 0x1.2113276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000000ea81p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3873 2 OK 0x1.3204989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3873 3 OK 0x1.2113276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000000ea81p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3873 4 OK 0x1.3204989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3874 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.4p4 0x0.0p0 0x0.0p0 T +REG epsg:3874 1 OK 0x1.3055676508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e0000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3874 2 OK 0x1.4146d89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3874 3 OK 0x1.3055676508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e0000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3874 4 OK 0x1.4146d89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3875 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:3875 1 OK 0x1.3f97a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3875 2 OK 0x1.5089189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3875 3 OK 0x1.3f97a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3875 4 OK 0x1.5089189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3876 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.6p4 0x0.0p0 0x0.0p0 T +REG epsg:3876 1 OK 0x1.4ed9e76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3876 2 OK 0x1.5fcb589af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.afffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3876 3 OK 0x1.4ed9e76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3876 4 OK 0x1.5fcb589af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.afffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3877 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.7p4 0x0.0p0 0x0.0p0 T +REG epsg:3877 1 OK 0x1.5e1c276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3877 2 OK 0x1.6f0d989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.bfffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3877 3 OK 0x1.5e1c276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3877 4 OK 0x1.6f0d989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.bfffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3878 0 OK 0x1.75d72p24 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3878 1 OK 0x1.6d5e676508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3878 2 OK 0x1.7e4fd89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3878 3 OK 0x1.6d5e676508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3878 4 OK 0x1.7e4fd89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3879 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.9p4 0x0.0p0 0x0.0p0 T +REG epsg:3879 1 OK 0x1.7ca0a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3879 2 OK 0x1.8d92189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dfffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3879 3 OK 0x1.7ca0a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3879 4 OK 0x1.8d92189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dfffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3880 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.ap4 0x0.0p0 0x0.0p0 T +REG epsg:3880 1 OK 0x1.8be2e76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3880 2 OK 0x1.9cd4589af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.efffffff8abfap4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3880 3 OK 0x1.8be2e76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3880 4 OK 0x1.9cd4589af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.efffffff8abfap4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3881 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:3881 1 OK 0x1.9b25276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3881 2 OK 0x1.ac16989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3881 3 OK 0x1.9b25276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3881 4 OK 0x1.ac16989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3882 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.cp4 0x0.0p0 0x0.0p0 T +REG epsg:3882 1 OK 0x1.aa67676508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3882 2 OK 0x1.bb58d89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.07ffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3882 3 OK 0x1.aa67676508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3882 4 OK 0x1.bb58d89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.07ffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3883 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.d000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:3883 1 OK 0x1.b9a9a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8000000075409p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3883 2 OK 0x1.ca9b189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3883 3 OK 0x1.b9a9a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8000000075409p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3883 4 OK 0x1.ca9b189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3884 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:3884 1 OK 0x1.c8ebe76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3884 2 OK 0x1.d9dd589af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3884 3 OK 0x1.c8ebe76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3884 4 OK 0x1.d9dd589af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3885 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.fp4 0x0.0p0 0x0.0p0 T +REG epsg:3885 1 OK 0x1.d82e276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3885 2 OK 0x1.e91f989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1fffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3885 3 OK 0x1.d82e276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3885 4 OK 0x1.e91f989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.1fffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:3887 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3887 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3887 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3887 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3887 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3889 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:3889 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3889 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:3889 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3889 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3890 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:3890 1 OK -0x1.ad750e9eafecp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 -0x1.4p2 0x0.0p0 F +REG epsg:3890 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 -0x1.4p2 0x0.0p0 F +REG epsg:3890 3 OK -0x1.ad750e9eafecp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 0x1.4p2 0x0.0p0 F +REG epsg:3890 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 0x1.4p2 0x0.0p0 F +REG epsg:3891 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:3891 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 -0x1.4p2 0x0.0p0 F +REG epsg:3891 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 -0x1.4p2 0x0.0p0 F +REG epsg:3891 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 0x1.4p2 0x0.0p0 F +REG epsg:3891 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG epsg:3892 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:3892 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:3892 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:3892 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:3892 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:3893 0 OK 0x1.86a08b27c756p19 0x1.de4aaf3c4f624p6 -0x1.c27a8304cp5 0x1.73fffffffffffp5 0x1.d06b98580964cp4 -0x1.0p-30 F +REG epsg:3893 1 OK 0x1.a9bbedb42828cp17 -0x1.087e75c9e0b65p19 -0x1.0ff9e0731p6 0x1.464113b496da2p5 0x1.806b9857d83e5p4 0x1.0p-29 F +REG epsg:3893 2 OK 0x1.51690d7228bfap20 -0x1.087e75c9bda06p19 -0x1.0ccef2fb5p6 0x1.a1beec4b6926cp5 0x1.806b9857d83d2p4 0x1.0p-30 F +REG epsg:3893 3 OK 0x1.0980634b04be8p18 0x1.15d055c24b43bp19 -0x1.78c91622ap5 0x1.464113b48d812p5 0x1.1035cc2bce5b2p5 0x1.0p-28 F +REG epsg:3893 4 OK 0x1.4440725589189p20 0x1.15d055c26bd85p19 -0x1.73096c9bcp5 0x1.a1beec4b727fep5 0x1.1035cc2bce59bp5 0x1.8p-28 F +REG epsg:3901 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3901 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3901 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3901 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3901 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3902 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3902 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3902 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3902 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3902 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3903 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3903 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3903 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3903 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3903 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:3906 0 OK 0x1.de17789478f3fp-10 -0x1.1c83c438faf2bp-8 0x1.ceee6b6d4p5 0x0.0p0 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:3906 1 OK -0x1.3feae70b24c18p2 -0x1.404e263a55174p2 0x1.5b054063bp6 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3906 2 OK 0x1.4026a9936af84p2 -0x1.404db11ee4f8p2 0x1.e80971789p6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:3906 3 OK -0x1.3feae70b24c18p2 0x1.3fc071a2b755fp2 0x1.8a01db3cp1 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:3906 4 OK 0x1.4026a9936af84p2 0x1.3fbffcba8d79cp2 0x1.32a973fd6p5 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3907 0 OK 0x1.4fb75235b93fbp22 -0x1.dff11ebf6683dp8 0x1.0b4e4bbe9p7 0x1.dfffffffffffep3 0x0.0p0 -0x1.0p-30 T +REG epsg:3907 1 OK 0x1.2dd58b7ce26e8p22 -0x1.0f32b5caa9eecp19 0x1.267a6cf77p7 0x1.40000000e89p3 -0x1.3fffffffeb0cfp2 -0x1.6p-27 F +REG epsg:3907 2 OK 0x1.719918fc63b31p22 -0x1.0f32b5cd0ae7bp19 0x1.a7e4304068p7 0x1.3fffffff8ac93p4 -0x1.3fffffffeadb9p2 0x1.cp-27 F +REG epsg:3907 3 OK 0x1.2dd56e3993506p22 0x1.0ebaba8900ab1p19 0x1.fc80f3ap5 0x1.40000000e8a5cp3 0x1.3fffffffeb158p2 -0x1.6p-27 F +REG epsg:3907 4 OK 0x1.71993649b5d12p22 0x1.0ebaba8b5f96fp19 0x1.008a70354p7 0x1.3fffffff8abe2p4 0x1.3fffffffeae45p2 0x1.ap-27 F +REG epsg:3908 0 OK 0x1.8cc0cf0e4473ap22 -0x1.dff0b9cd99ceap8 0x1.33f8c496p7 0x1.2p4 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:3908 1 OK 0x1.6adf0f65a0179p22 -0x1.0f327c9c2b8c8p19 0x1.4969f9702p7 0x1.a0000000e87b3p3 -0x1.3fffffffeb0f3p2 -0x1.8p-27 F +REG epsg:3908 2 OK 0x1.aea28ec5ea1b1p22 -0x1.0f327c9ebfcddp19 0x1.d5ab4341e8p7 0x1.6fffffff8abfcp4 -0x1.3fffffffead99p2 0x1.0p-26 F +REG epsg:3908 3 OK 0x1.6adef222ceb71p22 0x1.0eba81738be86p19 0x1.441fcf3c4p6 0x1.a0000000e890fp3 0x1.3fffffffeb17ep2 -0x1.6p-27 F +REG epsg:3908 4 OK 0x1.aea2ac13952fap22 0x1.0eba81761df05p19 0x1.2e51aad668p7 0x1.6fffffff8ab4bp4 0x1.3fffffffeae23p2 0x1.ap-27 F +REG epsg:3909 0 OK 0x1.c9ca47793fec8p22 -0x1.dff04ce2d3c16p8 0x1.5fd97dffep7 0x1.5000000000001p4 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:3909 1 OK 0x1.a7e88f6f8b5ecp22 -0x1.0f323ee98bc0bp19 0x1.6fbabe71e8p7 0x1.0000000074334p4 -0x1.3fffffffeb116p2 -0x1.8p-27 F +REG epsg:3909 2 OK 0x1.ebabff931a1ccp22 -0x1.0f323eec518aep19 0x1.03388efa6cp8 0x1.9fffffff8ab67p4 -0x1.3fffffffead7dp2 0x1.ep-27 F +REG epsg:3909 3 OK 0x1.a7e8722d35606p22 0x1.0eba43dbeff46p19 0x1.90c19b942p6 0x1.00000000743e6p4 0x1.3fffffffeb19fp2 -0x1.cp-27 F +REG epsg:3909 4 OK 0x1.ebac1ce118e4dp22 0x1.0eba43deb35acp19 0x1.5f17afc088p7 0x1.9fffffff8aab8p4 0x1.3fffffffeae08p2 0x1.ep-27 F +REG epsg:3910 0 OK 0x1.0369dd911526bp23 -0x1.dfefd84b8bbcbp8 0x1.8ed1ac19p7 0x1.8p4 0x0.0p0 0x1.0p-30 T +REG epsg:3910 1 OK 0x1.e4f20b40c8e4dp22 -0x1.0f31fcde1b505p19 0x1.9951d76cb8p7 0x1.300000007429bp4 -0x1.3fffffffeb137p2 -0x1.cp-27 F +REG epsg:3910 2 OK 0x1.145ab58a65cdcp23 -0x1.0f31fce110c1cp19 0x1.1d09c28c7cp8 0x1.cfffffff8aadap4 -0x1.3fffffffead62p2 0x1.ap-27 F +REG epsg:3910 3 OK 0x1.e4f1edfeeb964p22 0x1.0eba01ed6a9ccp19 0x1.e3f015897p6 0x1.300000007434ap4 0x1.3fffffffeb1bep2 -0x1.cp-27 F +REG epsg:3910 4 OK 0x1.145ac4318c4c9p23 0x1.0eba01f05d81ap19 0x1.92ba4395d8p7 0x1.cfffffff8aa27p4 0x1.3fffffffeadebp2 0x1.0p-26 F +REG epsg:3911 0 OK 0x1.e8a5235b93fb7p18 -0x1.dff11ebf6683dp8 0x1.0b4e4bbe9p7 0x1.dfffffffffffep3 0x0.0p0 -0x1.0p-30 T +REG epsg:3911 1 OK -0x1.abba418ec8c4p15 -0x1.0f32b5caa9eecp19 0x1.267a6cf77p7 0x1.40000000e88fdp3 -0x1.3fffffffeb0cfp2 -0x1.6p-27 F +REG epsg:3911 2 OK 0x1.01b063f18ecc4p20 -0x1.0f32b5cd0ae7bp19 0x1.a7e4304068p7 0x1.3fffffff8ac93p4 -0x1.3fffffffeadb9p2 0x1.cp-27 F +REG epsg:3911 3 OK -0x1.abc8e33657d2p15 0x1.0ebaba8900ab1p19 0x1.fc80f3ap5 0x1.40000000e8a5ap3 0x1.3fffffffeb158p2 -0x1.6p-27 F +REG epsg:3911 4 OK 0x1.01b0d926d7447p20 0x1.0ebaba8b5f96fp19 0x1.008a70354p7 0x1.3fffffff8abe2p4 0x1.3fffffffeae45p2 0x1.ap-27 F +REG epsg:3912 0 OK 0x1.e8a5235b93fb7p18 -0x1.31347fc47afdap22 0x1.0b4e4bbe9p7 0x1.dfffffffffffep3 -0x1.c2973a48242b3p-49 -0x1.0p-30 T +REG epsg:3912 1 OK -0x1.abba418ec8c4p15 -0x1.531356b9553dep22 0x1.267a6cf77p7 0x1.40000000e88fdp3 -0x1.3fffffffeb0d4p2 -0x1.6p-27 F +REG epsg:3912 2 OK 0x1.01b063f18ecc4p20 -0x1.531356b9a15cfp22 0x1.a7e4304068p7 0x1.3fffffff8ac93p4 -0x1.3fffffffeadb5p2 0x1.cp-27 F +REG epsg:3912 3 OK -0x1.abc8e33657d2p15 -0x1.0f55a8aedfeaap22 0x1.fc80f3ap5 0x1.40000000e8a5ap3 0x1.3fffffffeb157p2 -0x1.6p-27 F +REG epsg:3912 4 OK 0x1.01b0d926d7447p20 -0x1.0f55a8ae940d2p22 0x1.008a70354p7 0x1.3fffffff8abe2p4 0x1.3fffffffeae46p2 0x1.ap-27 F +REG epsg:3920 0 OK 0x1.e83d61d396ffp18 0x1.93d6cc2a7c5bfp6 -0x1.47b2014p3 -0x1.f7ffffffffffep5 -0x1.c72f1eacb7b06p-62 -0x1.0p-30 T +REG epsg:3920 1 OK -0x1.adcd237edb2ap15 -0x1.0ed6dc7b58589p19 -0x1.c017b3bp3 -0x1.1000000000001p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:3920 2 OK 0x1.018d19fc6abcep20 -0x1.0ed6dc7b12493p19 -0x1.561803548p4 -0x1.d000000000003p5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:3920 3 OK -0x1.adca0f11a306p15 0x1.0ef019b11b36bp19 0x1.cd4614acp1 -0x1.1000000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:3920 4 OK 0x1.018d0159f6e1p20 0x1.0ef019b0d51a7p19 -0x1.e31a8b34p1 -0x1.d000000000003p5 0x1.3fffffffffffcp2 0x1.0p-28 F +REG epsg:3942 0 OK 0x1.9f0ap20 0x1.24f8p20 0x0.0p0 0x1.8000000000001p1 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:3942 1 OK 0x1.75428f3e9a9a1p20 0x1.f994093024d79p19 0x0.0p0 0x1.f68dd71dbd7dcp-1 0x1.43fffffffffe9p5 0x0.0p0 F +REG epsg:3942 2 OK 0x1.c8d170c16565fp20 0x1.f994093024d79p19 0x0.0p0 0x1.412e451c48505p2 0x1.43fffffffffe9p5 0x0.0p0 F +REG epsg:3942 3 OK 0x1.772d782d92b6p20 0x1.4e1f120c26e6bp20 0x0.0p0 0x1.f68dd71dbd7dfp-1 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:3942 4 OK 0x1.c6e687d26d4ap20 0x1.4e1f120c26e6bp20 0x0.0p0 0x1.412e451c48505p2 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:3943 0 OK 0x1.9f0ap20 0x1.0c8ep21 0x0.0p0 0x1.8000000000001p1 0x1.57fffffffffefp5 0x0.0p0 F +REG epsg:3943 1 OK 0x1.75393988fdb6bp20 0x1.f0f0cf6141bb8p20 0x0.0p0 0x1.e5e47b86f9fa8p-1 0x1.4bfffffffffe8p5 0x0.0p0 F +REG epsg:3943 2 OK 0x1.c8dac67702495p20 0x1.f0f0cf6141bb8p20 0x0.0p0 0x1.4343708f20c0cp2 0x1.4bfffffffffe8p5 0x0.0p0 F +REG epsg:3943 3 OK 0x1.7735ba3d8f166p20 0x1.21248b2ed484fp21 0x0.0p0 0x1.e5e47b86f9fa8p-1 0x1.63ffffffffff4p5 0x0.0p0 F +REG epsg:3943 4 OK 0x1.c6de45c270e9ap20 0x1.21248b2ed484fp21 0x0.0p0 0x1.4343708f20c0cp2 0x1.63ffffffffff4p5 0x0.0p0 F +REG epsg:3944 0 OK 0x1.9f0ap20 0x1.86ap21 0x0.0p0 0x1.8000000000001p1 0x1.5fffffffffff2p5 0x0.0p0 F +REG epsg:3944 1 OK 0x1.752f99bd05c59p20 0x1.728be0ca528f9p21 0x0.0p0 0x1.d45ab7797af6fp-1 0x1.53fffffffffeep5 0x0.0p0 F +REG epsg:3944 2 OK 0x1.c8e46642fa3a7p20 0x1.728be0ca528f9p21 0x0.0p0 0x1.4574a910d0a13p2 0x1.53fffffffffeep5 0x0.0p0 F +REG epsg:3944 3 OK 0x1.773e4817ccbd1p20 0x1.9b399e8c81502p21 0x0.0p0 0x1.d45ab7797af6fp-1 0x1.6bffffffffff6p5 0x0.0p0 F +REG epsg:3944 4 OK 0x1.c6d5b7e83342fp20 0x1.9b399e8c81502p21 0x0.0p0 0x1.4574a910d0a13p2 0x1.6bffffffffff6p5 0x0.0p0 F +REG epsg:3945 0 OK 0x1.9f0ap20 0x1.0059p22 0x0.0p0 0x1.8000000000001p1 0x1.67ffffffffff3p5 0x0.0p0 F +REG epsg:3945 1 OK 0x1.7525aae80de71p20 0x1.ec9f6f5c6d66dp21 0x0.0p0 0x1.c1e24cc824c9dp-1 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:3945 2 OK 0x1.c8ee5517f218fp20 0x1.ec9f6f5c6d66dp21 0x0.0p0 0x1.47c3b666fb66cp2 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:3945 3 OK 0x1.77472748f6bd4p20 0x1.0aa761fdd65c8p22 0x0.0p0 0x1.c1e24cc824c9ap-1 0x1.73ffffffffff7p5 0x0.0p0 F +REG epsg:3945 4 OK 0x1.c6ccd8b70942cp20 0x1.0aa761fdd65c8p22 0x0.0p0 0x1.47c3b666fb66dp2 0x1.73ffffffffff7p5 0x0.0p0 F +REG epsg:3946 0 OK 0x1.9f0ap20 0x1.3d62p22 0x0.0p0 0x1.8000000000001p1 0x1.6fffffffffff6p5 0x0.0p0 F +REG epsg:3946 1 OK 0x1.751b67a38c652p20 0x1.33598aa6a388bp22 0x0.0p0 0x1.ae6baaf8b198dp-1 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:3946 2 OK 0x1.c8f8985c739aep20 0x1.33598aa6a388bp22 0x0.0p0 0x1.4a328aa0e9ccfp2 0x1.63ffffffffff3p5 0x0.0p0 F +REG epsg:3946 3 OK 0x1.77505dd859ae2p20 0x1.47b1fe38e2231p22 0x0.0p0 0x1.ae6baaf8b1977p-1 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:3946 4 OK 0x1.c6c3a227a651ep20 0x1.47b1fe38e2231p22 0x0.0p0 0x1.4a328aa0e9cd2p2 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:3947 0 OK 0x1.9f0ap20 0x1.7a6bp22 0x0.0p0 0x1.8000000000001p1 0x1.77ffffffffff9p5 0x0.0p0 F +REG epsg:3947 1 OK 0x1.7510ca0786109p20 0x1.70636a552a548p22 0x0.0p0 0x1.99e5c8289decep-1 0x1.6bffffffffff5p5 0x0.0p0 F +REG epsg:3947 2 OK 0x1.c90335f879ef6p20 0x1.70636a552a548p22 0x0.0p0 0x1.4cc346faec423p2 0x1.6bffffffffff5p5 0x0.0p0 F +REG epsg:3947 3 OK 0x1.7759f2563e044p20 0x1.84bca47ffa329p22 0x0.0p0 0x1.99e5c8289decep-1 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:3947 4 OK 0x1.c6ba0da9c1fbcp20 0x1.84bca47ffa329p22 0x0.0p0 0x1.4cc346faec427p2 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:3948 0 OK 0x1.9f0ap20 0x1.b774p22 0x0.0p0 0x1.8000000000001p1 0x1.7fffffffff75fp5 0x0.0p0 F +REG epsg:3948 1 OK 0x1.7505cb9b18f5ep20 0x1.ad6d57d6705bcp22 0x0.0p0 0x1.843df45913e8fp-1 0x1.73ffffffffff6p5 0x0.0p0 F +REG epsg:3948 2 OK 0x1.c90e3464e70a2p20 0x1.ad6d57d6705bcp22 0x0.0p0 0x1.4f784174dd82fp2 0x1.73ffffffffff6p5 0x0.0p0 F +REG epsg:3948 3 OK 0x1.7763ebec52d06p20 0x1.c1c7556b372cdp22 0x0.0p0 0x1.843df45913e8bp-1 0x1.8bffffffff93dp5 0x0.0p0 F +REG epsg:3948 4 OK 0x1.c6b01413ad2fap20 0x1.c1c7556b372cdp22 0x0.0p0 0x1.4f784174dd82fp2 0x1.8bffffffff93dp5 0x0.0p0 F +REG epsg:3949 0 OK 0x1.9f0ap20 0x1.f47dp22 0x0.0p0 0x1.8000000000001p1 0x1.87ffffffff8a7p5 0x0.0p0 F +REG epsg:3949 1 OK 0x1.74fa6542cba4ap20 0x1.ea77545fbd095p22 0x0.0p0 0x1.6d5fa62d507e7p-1 0x1.7bffffffff6aap5 0x0.0p0 F +REG epsg:3949 2 OK 0x1.c9199abd345b6p20 0x1.ea77545fbd095p22 0x0.0p0 0x1.52540b3a55f04p2 0x1.7bffffffff6aap5 0x0.0p0 F +REG epsg:3949 3 OK 0x1.776e527083918p20 0x1.fed211a40fd4fp22 0x0.0p0 0x1.6d5fa62d507d8p-1 0x1.93ffffffffa4ep5 0x0.0p0 F +REG epsg:3949 4 OK 0x1.c6a5ad8f7c6e8p20 0x1.fed211a40fd4fp22 0x0.0p0 0x1.52540b3a55f06p2 0x1.93ffffffffa4ep5 0x0.0p0 F +REG epsg:3950 0 OK 0x1.9f0ap20 0x1.18c3p23 0x0.0p0 0x1.8000000000001p1 0x1.8fffffffff9ccp5 0x0.0p0 F +REG epsg:3950 1 OK 0x1.74ee8f2c3dd93p20 0x1.13c0b0a10f3bp23 0x0.0p0 0x1.55343ff61466p-1 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:3950 2 OK 0x1.c92570d3c226dp20 0x1.13c0b0a10f3bp23 0x0.0p0 0x1.555978013d735p2 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:3950 3 OK 0x1.77792e7aa5f81p20 0x1.1dee6cf3bb781p23 0x0.0p0 0x1.55343ff614672p-1 0x1.9bffffffffb3ep5 0x0.0p0 F +REG epsg:3950 4 OK 0x1.c69ad1855a07fp20 0x1.1dee6cf3bb781p23 0x0.0p0 0x1.555978013d732p2 0x1.9bffffffffb3ep5 0x0.0p0 F +REG epsg:3968 0 OK 0x0.0p0 0x1.7b57e7a4b3001p17 0x0.0p0 -0x1.3ep6 0x1.2dfffffffffddp5 0x0.0p0 F +REG epsg:3968 1 OK -0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:3968 2 OK 0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:3968 3 OK -0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:3968 4 OK 0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:3969 0 OK 0x0.0p0 0x1.7b57e7a4b3001p17 0x0.0p0 -0x1.3ep6 0x1.2dfffffffffddp5 0x0.0p0 F +REG epsg:3969 1 OK -0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:3969 2 OK 0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:3969 3 OK -0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:3969 4 OK 0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:3970 0 OK 0x0.0p0 0x1.7b57e7a4b3001p17 0x0.0p0 -0x1.3ep6 0x1.2dfffffffffddp5 0x0.0p0 F +REG epsg:3970 1 OK -0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:3970 2 OK 0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:3970 3 OK -0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:3970 4 OK 0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:3973 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 0x0.0p0 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3973 1 OK -0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.dffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3973 2 OK 0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 0x1.dffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3973 3 OK -0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3973 4 OK 0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 0x1.dffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:3974 0 OK 0x0.0p0 0x1.b44c727f931e4p16 0x0.0p0 0x0.0p0 -0x1.63fffffff3e82p6 0x0.0p0 F +REG epsg:3974 1 OK -0x1.79d87f2a2c624p16 0x1.b44c727f931e6p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.63fffffff3e82p6 0x0.0p0 F +REG epsg:3974 2 OK 0x1.79d87f2a2c624p16 0x1.b44c727f931e6p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.63fffffff3e82p6 0x0.0p0 F +REG epsg:3974 3 OK -0x1.d826d2218e40ep18 0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.dffffffffffffp5 -0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3974 4 OK 0x1.d826d2218e40ep18 0x1.1098cd0a6adb8p18 0x0.0p0 0x1.dffffffffffffp5 -0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:3975 0 OK 0x0.0p0 0x1.bea12a994d954p21 0x0.0p0 0x0.0p0 0x1.dffffffccdd0fp4 0x0.0p0 F +REG epsg:3975 1 OK -0x1.1000f98f704f1p19 0x1.79631c7d3d051p21 0x0.0p0 -0x1.7181116f43fe3p2 0x1.8ffffffb7cf92p4 0x0.0p0 F +REG epsg:3975 2 OK 0x1.1000f98f704f1p19 0x1.79631c7d3d051p21 0x0.0p0 0x1.7181116f43fe3p2 0x1.8ffffffb7cf92p4 0x0.0p0 F +REG epsg:3975 3 OK -0x1.1000f98f704f1p19 0x1.00444748a4807p22 0x0.0p0 -0x1.7181116f43fe3p2 0x1.17ffffff26aa7p5 0x0.0p0 F +REG epsg:3975 4 OK 0x1.1000f98f704f1p19 0x1.00444748a4807p22 0x0.0p0 0x1.7181116f43fe3p2 0x1.17ffffff26aa7p5 0x0.0p0 F +REG epsg:3976 0 OK 0x0.0p0 0x1.091e04c21f442p20 0x0.0p0 0x0.0p0 -0x1.3ffffffffffd8p6 0x0.0p0 T +REG epsg:3976 1 OK -0x1.6e787f3de6f9fp16 0x1.a729f5aae6861p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3976 2 OK 0x1.6e787f3de6f9fp16 0x1.a729f5aae6861p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG epsg:3976 3 OK -0x1.22bec2cac19abp21 0x1.4fb93d5c5b483p20 0x0.0p0 -0x1.dffffffffffffp5 -0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3976 4 OK 0x1.22bec2cac19abp21 0x1.4fb93d5c5b483p20 0x0.0p0 0x1.dffffffffffffp5 -0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:3978 0 OK 0x0.0p0 0x1.753d47a7d166fp20 0x0.0p0 -0x1.7cp6 0x1.f7fffffffffafp5 0x0.0p0 F +REG epsg:3978 1 OK -0x1.20c6f8a3ca735p21 0x1.f914dc603178ep18 0x0.0p0 -0x1.0014a74f2f521p7 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3978 2 OK 0x1.20c6f8a3ca735p21 0x1.f914dc603178ep18 0x0.0p0 -0x1.efad62c342b7fp5 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3978 3 OK -0x1.6828f7fbeb876p19 0x1.9aadaf8751002p21 0x0.0p0 -0x1.0014a74f2f521p7 0x1.38p6 0x0.0p0 F +REG epsg:3978 4 OK 0x1.6828f7fbeb876p19 0x1.9aadaf8751002p21 0x0.0p0 -0x1.efad62c342b7fp5 0x1.38p6 0x0.0p0 F +REG epsg:3979 0 OK 0x0.0p0 0x1.753d47a7d166fp20 0x0.0p0 -0x1.7cp6 0x1.f7fffffffffafp5 0x0.0p0 F +REG epsg:3979 1 OK -0x1.20c6f8a3ca735p21 0x1.f914dc603178ep18 0x0.0p0 -0x1.0014a74f2f521p7 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3979 2 OK 0x1.20c6f8a3ca735p21 0x1.f914dc603178ep18 0x0.0p0 -0x1.efad62c342b7fp5 0x1.7fffffffff76p5 0x0.0p0 F +REG epsg:3979 3 OK -0x1.6828f7fbeb876p19 0x1.9aadaf8751002p21 0x0.0p0 -0x1.0014a74f2f521p7 0x1.38p6 0x0.0p0 F +REG epsg:3979 4 OK 0x1.6828f7fbeb876p19 0x1.9aadaf8751002p21 0x0.0p0 -0x1.efad62c342b7fp5 0x1.38p6 0x0.0p0 F +REG epsg:3985 0 OK 0x1.e83eb725ee81cp18 -0x1.436e99bb2a82cp19 0x1.69265883p4 0x1.9ffffffffffffp4 -0x1.3fffffffec9cdp0 0x1.0p-30 F +REG epsg:3985 1 OK -0x1.102f112cec241p20 -0x1.1fcf502e5bd01p21 -0x1.6ea61b278p4 0x1.5fe2c03cc205cp3 -0x1.03ffffffffeecp4 0x1.8p-29 F +REG epsg:3985 2 OK 0x1.022749f1754bap21 -0x1.1fcf63a783ee2p21 -0x1.49d055f0ep5 0x1.48074ff0cf7ebp5 -0x1.03ffffffffeebp4 0x0.0p0 F +REG epsg:3985 3 OK -0x1.3208078a880b2p20 0x1.f3d45f1557083p19 0x1.a62f9667ep6 0x1.5fe2c03cc2058p3 0x1.b7ffffffffde2p3 0x0.0p0 F +REG epsg:3985 4 OK 0x1.13139e7f47946p21 0x1.f3d560a286d6dp19 0x1.5c14c486cp6 0x1.48074ff0cf7ebp5 0x1.b7ffffffffdefp3 -0x1.0p-30 F +REG epsg:3986 0 OK 0x1.868a39f897f12p17 0x1.e87894a1be2ccp18 -0x1.44a31c7ap3 0x1.dfffffffffffep4 -0x1.2000000000004p3 -0x1.0p-30 F +REG epsg:3986 1 OK -0x1.536fa2d2b29dp18 -0x1.cb19f2b6210bp15 -0x1.639bbb9dcp4 0x1.8f00b6d791e69p4 -0x1.bfffffffe5981p3 0x1.0p-30 F +REG epsg:3986 2 OK 0x1.6cfcee52fdd59p19 -0x1.cb19f2aa80e5p15 -0x1.daeaaecfcp4 0x1.187fa4943712ap5 -0x1.bfffffffe59f6p3 0x1.0p-29 F +REG epsg:3986 3 OK -0x1.6270598b80c82p18 0x1.00b0b3045c90fp20 0x1.7956e43dp3 0x1.8f00b6d7e5692p4 -0x1.ffffffffda099p1 0x1.0p-30 F +REG epsg:3986 4 OK 0x1.747d49b12f479p19 0x1.00b0b3047a91p20 0x1.0808ff0ap2 0x1.187fa4940d5b2p5 -0x1.ffffffffda143p1 -0x1.8p-29 F +REG epsg:3987 0 OK 0x1.868be43301428p17 0x1.e878a34470c1cp18 -0x1.166d19898p3 0x1.bffffffffffffp4 -0x1.2p3 0x1.0p-30 F +REG epsg:3987 1 OK -0x1.536ec5e719ed4p18 -0x1.cb193c487462p15 -0x1.518f4e6c8p4 0x1.6f00b6d791e62p4 -0x1.bfffffffe5988p3 0x1.0p-29 F +REG epsg:3987 2 OK 0x1.6cfd54fbd27d1p19 -0x1.cb193c3db7bbp15 -0x1.bfbebc184p4 0x1.087fa49437125p5 -0x1.bfffffffe59f1p3 0x1.0p-30 F +REG epsg:3987 3 OK -0x1.626f7c2d5863ep18 0x1.00b0b4a92dc53p20 0x1.9e7368c78p3 0x1.6f00b6d7e5681p4 -0x1.ffffffffda0a7p1 -0x1.0p-29 F +REG epsg:3987 4 OK 0x1.747db0209a172p19 0x1.00b0b4a9497a6p20 0x1.77c6a0e1p2 0x1.087fa4940d5a8p5 -0x1.ffffffffda131p1 0x1.0p-30 F +REG epsg:3988 0 OK 0x1.868d94b2ed0fcp17 0x1.e878b0bb0ef99p18 -0x1.d7d524eep2 0x1.ap4 -0x1.2000000000001p3 0x1.0p-30 F +REG epsg:3988 1 OK -0x1.536de678ab51p18 -0x1.cb1894772805p15 -0x1.4163a5a68p4 0x1.4f00b6d791e5ap4 -0x1.bfffffffe598ep3 0x1.8p-29 F +REG epsg:3988 2 OK 0x1.6cfdbd8602ff7p19 -0x1.cb18946d5234p15 -0x1.a6513061p4 0x1.f0ff49286e244p4 -0x1.bfffffffe59ecp3 0x1.8p-29 F +REG epsg:3988 3 OK -0x1.626e9c558a7dap18 0x1.00b0b62c4addp20 0x1.bfb35fac8p3 0x1.4f00b6d7e566dp4 -0x1.ffffffffda0a5p1 -0x1.0p-29 F +REG epsg:3988 4 OK 0x1.747e1875f8312p19 0x1.00b0b62c643e4p20 0x1.e05879cep2 0x1.f0ff49281ab3ep4 -0x1.ffffffffda133p1 -0x1.0p-28 F +REG epsg:3989 0 OK 0x1.868f4af177806p17 0x1.e878bd0165f06p18 -0x1.8a5192a8p2 0x1.8000000000001p4 -0x1.2000000000002p3 0x1.0p-30 F +REG epsg:3989 1 OK -0x1.536d04cd160f4p18 -0x1.cb17fb769232p15 -0x1.331dcc62p4 0x1.2f00b6d791e53p4 -0x1.bfffffffe599p3 0x1.8p-29 F +REG epsg:3989 2 OK 0x1.6cfe27d0f49b2p19 -0x1.cb17fb6da65ap15 -0x1.8ea9f9e3cp4 0x1.d0ff49286e23ep4 -0x1.bfffffffe59e8p3 -0x1.0p-29 F +REG epsg:3989 3 OK -0x1.626dba49e733ap18 0x1.00b0b78d3b1dcp20 0x1.dd0c6a31p3 0x1.2f00b6d7e5657p4 -0x1.ffffffffda0acp1 0x1.0p-29 F +REG epsg:3989 4 OK 0x1.747e8290bf4f7p19 0x1.00b0b78d52234p20 0x1.20cef66ap3 0x1.d0ff49281ab2ap4 -0x1.ffffffffda12dp1 -0x1.8p-29 F +REG epsg:3991 0 OK 0x1.e8281e941dea6p18 0x1.ac4c28c80d134p16 0x1.5c67fad6ap5 -0x1.09bbbbbbbbbbdp6 0x1.222222222210dp4 -0x1.0p-30 F +REG epsg:3991 1 OK 0x1.02b26bf10312ap17 -0x1.ed07123b595dbp17 0x1.43d25e438p5 -0x1.0df13f90a9095p6 0x1.1222222222109p4 0x0.0p0 F +REG epsg:3991 2 OK 0x1.a77b835ef7fa4p19 -0x1.ed071d29619ddp17 0x1.38e868b5cp5 -0x1.058637e6ce6e3p6 0x1.122222222210bp4 0x1.0p-30 F +REG epsg:3991 3 OK 0x1.0ad926ebef9acp17 0x1.cebd214b4904ap18 0x1.80661ee42p5 -0x1.0df13f90a9095p6 0x1.322222222211p4 0x1.0p-30 F +REG epsg:3991 4 OK 0x1.a571d51639d18p19 0x1.cebd25c6301abp18 0x1.759beda6p5 -0x1.058637e6ce6e3p6 0x1.3222222222114p4 -0x1.0p-29 F +REG epsg:3992 0 OK 0x1.e8281e941dea6p18 0x1.997614640689cp17 0x1.5c67fad6ap5 -0x1.09bbbbbbbbbbdp6 0x1.222222222210dp4 -0x1.0p-30 F +REG epsg:3992 1 OK 0x1.02b26bf10312ap17 -0x1.29b7123b595d9p17 0x1.43d25e438p5 -0x1.0df13f90a9095p6 0x1.1222222222109p4 0x0.0p0 F +REG epsg:3992 2 OK 0x1.a77b835ef7fa4p19 -0x1.29b71d29619dbp17 0x1.38e868b5cp5 -0x1.058637e6ce6e3p6 0x1.122222222210bp4 0x1.0p-30 F +REG epsg:3992 3 OK 0x1.0ad926ebef9acp17 0x1.183290a5a4826p19 0x1.80661ee42p5 -0x1.0df13f90a9095p6 0x1.322222222211p4 0x1.0p-30 F +REG epsg:3992 4 OK 0x1.a571d51639d18p19 0x1.183292e3180d6p19 0x1.759beda6p5 -0x1.058637e6ce6e3p6 0x1.3222222222114p4 -0x1.0p-29 F +REG epsg:3994 0 OK 0x0.0p0 -0x1.3037ba13ae741p22 0x0.0p0 0x1.9p6 -0x1.47fffffffffeap5 0x0.0p0 F +REG epsg:3994 1 OK -0x1.681b5b79686eep19 -0x1.5eed7e2f7969cp22 0x0.0p0 0x1.757feef827d5fp6 -0x1.6fffffffffff7p5 0x0.0p0 F +REG epsg:3994 2 OK 0x1.681b5b79686eep19 -0x1.5eed7e2f7969cp22 0x0.0p0 0x1.aa801107d82a1p6 -0x1.6fffffffffff7p5 0x0.0p0 F +REG epsg:3994 3 OK -0x1.681b5b79686eep19 -0x1.04f4c3bca79dap22 0x0.0p0 0x1.757feef827d5fp6 -0x1.1ffffffffffd5p5 0x0.0p0 F +REG epsg:3994 4 OK 0x1.681b5b79686eep19 -0x1.04f4c3bca79dap22 0x0.0p0 0x1.aa801107d82a1p6 -0x1.1ffffffffffd5p5 0x0.0p0 F +REG epsg:3995 0 OK 0x0.0p0 -0x1.f91d3b4848819p19 0x0.0p0 0x0.0p0 0x1.41fffffffffe5p6 0x0.0p0 T +REG epsg:3995 1 OK -0x1.1d9be4ac03975p21 -0x1.49caf617b9fe8p20 0x0.0p0 -0x1.dfffffffffffep5 0x1.05fffffffffeep6 0x0.0p0 T +REG epsg:3995 2 OK 0x1.1d9be4ac03975p21 -0x1.49caf617b9fe8p20 0x0.0p0 0x1.dfffffffffffep5 0x1.05fffffffffeep6 0x0.0p0 T +REG epsg:3995 3 OK -0x1.6f92113756933p16 -0x1.a86f16c31e39p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG epsg:3995 4 OK 0x1.6f92113756933p16 -0x1.a86f16c31e39p15 0x0.0p0 0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG epsg:3996 0 OK 0x0.0p0 -0x1.929ec8c354d3bp19 0x0.0p0 0x0.0p0 0x1.49ffffffffffap6 0x0.0p0 T +REG epsg:3996 1 OK -0x1.086c90d7f7bbap21 -0x1.3154a46523113p20 0x0.0p0 -0x1.dffffffffffffp5 0x1.0dffffffffff6p6 0x0.0p0 T +REG epsg:3996 2 OK 0x1.086c90d7f7bbap21 -0x1.3154a46523113p20 0x0.0p0 0x1.dffffffffffffp5 0x1.0dffffffffff6p6 0x0.0p0 T +REG epsg:3996 3 OK -0x1.736c8470b005dp16 -0x1.ace224b3d8004p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG epsg:3996 4 OK 0x1.736c8470b005dp16 -0x1.ace224b3d8004p15 0x0.0p0 0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG epsg:3997 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.baaaaaaaaaaacp5 0x0.0p0 0x0.0p0 T +REG epsg:3997 1 OK -0x1.af3135ef94adp15 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.92aaaaaae54afp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3997 2 OK 0x1.019d89af7ca54p20 -0x1.0eff1b76ebf25p19 0x0.0p0 0x1.e2aaaaaa700a7p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3997 3 OK -0x1.af3135ef94adp15 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.92aaaaaae54afp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:3997 4 OK 0x1.019d89af7ca54p20 0x1.0eff1b76ebf25p19 0x0.0p0 0x1.e2aaaaaa700a7p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4000 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4000 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4000 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4000 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4000 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4001 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4001 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4001 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4001 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4001 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4002 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4002 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4002 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4002 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4002 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4003 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4003 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4003 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4003 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4003 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4004 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4004 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4004 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4004 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4004 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4005 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4005 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4005 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4005 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4005 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4006 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4006 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4006 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4006 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4006 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4007 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4007 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4007 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4007 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4007 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4008 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4008 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4008 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4008 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4008 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4009 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4009 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4009 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4009 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4009 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4010 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4010 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4010 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4010 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4010 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4011 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4011 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4011 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4011 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4011 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4012 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4012 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4012 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4012 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4012 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4013 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4013 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4013 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4013 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4013 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4014 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4014 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4014 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4014 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4014 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4015 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4015 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4015 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4015 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4015 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4016 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4016 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4016 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4016 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4016 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4018 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4018 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4018 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4018 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4018 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4019 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4019 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4019 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4019 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4019 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4020 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4020 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4020 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4020 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4020 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4021 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4021 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4021 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4021 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4021 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4022 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4022 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4022 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4022 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4022 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4023 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4023 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4023 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4023 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4023 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4024 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4024 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4024 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4024 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4024 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4025 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4025 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4025 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4025 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4025 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4026 0 OK 0x1.86ap17 -0x1.312dp22 0x0.0p0 0x1.c666666666666p4 0x0.0p0 0x0.0p0 T +REG epsg:4026 1 OK -0x1.5ad5d2cd690c8p18 -0x1.530c5e3b98085p22 0x0.0p0 0x1.76666666dba6dp4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4026 2 OK 0x1.70bae966b4861p19 -0x1.530c5e3b98085p22 0x0.0p0 0x1.0b333332f892fp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4026 3 OK -0x1.5ad5d2cd690c8p18 -0x1.0f4da1c467f7bp22 0x0.0p0 0x1.76666666dba6dp4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4026 4 OK 0x1.70bae966b4861p19 -0x1.0f4da1c467f7bp22 0x0.0p0 0x1.0b333332f892fp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4027 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4027 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4027 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4027 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4027 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4028 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4028 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4028 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4028 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4028 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4029 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4029 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4029 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4029 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4029 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4030 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4030 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4030 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4030 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4030 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4031 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4031 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4031 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4031 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4031 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4032 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4032 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4032 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4032 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4032 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4033 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4033 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4033 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4033 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4033 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4034 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4034 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4034 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4034 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4034 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4035 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4035 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4035 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4035 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4035 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4036 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4036 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4036 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4036 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4036 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4037 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:4037 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4037 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4037 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4037 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4038 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:4038 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4038 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4038 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4038 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:4039 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4039 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4039 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4039 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4039 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4041 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4041 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4041 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4041 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4041 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4042 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4042 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4042 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4042 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4042 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4043 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4043 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4043 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4043 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4043 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4044 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4044 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4044 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4044 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4044 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4045 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4045 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4045 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4045 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4045 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4046 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4046 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4046 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4046 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4046 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4047 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4047 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4047 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4047 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4047 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4048 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:4048 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.c0000001d501dp2 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4048 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4048 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.c0000001d501dp2 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4048 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4049 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.cp3 0x0.0p0 0x0.0p0 T +REG epsg:4049 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.20000000ea80ep3 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4049 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.2fffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4049 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.20000000ea80ep3 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4049 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.2fffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4050 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.0p4 0x0.0p0 0x0.0p0 T +REG epsg:4050 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.60000000ea80ep3 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4050 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.4fffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4050 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.60000000ea80ep3 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4050 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.4fffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4051 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG epsg:4051 1 OK -0x1.aec22c131378p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.a0000000ea80ep3 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4051 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.6fffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4051 3 OK -0x1.aec22c131378p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.a0000000ea80ep3 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4051 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.6fffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4052 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4052 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4052 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4052 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4052 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4053 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4053 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4053 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4053 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4053 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4054 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4054 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4054 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4054 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4054 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4055 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4055 1 OK -0x1.3ffffffffffffp2 -0x1.3dde5943b80dp2 -0x1.422f9e8eep7 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4055 2 OK 0x1.3ffffffffffffp2 -0x1.3dde5943b80dp2 -0x1.422f9e8eep7 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4055 3 OK -0x1.3ffffffffffffp2 0x1.3dde5943b80dp2 -0x1.422f9e8eep7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4055 4 OK 0x1.3ffffffffffffp2 0x1.3dde5943b80dp2 -0x1.422f9e8eep7 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4056 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.4p4 0x0.0p0 0x0.0p0 T +REG epsg:4056 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.e0000000ea80ep3 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4056 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.8fffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4056 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.e0000000ea80ep3 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4056 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.8fffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4057 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.6p4 0x0.0p0 0x0.0p0 T +REG epsg:4057 1 OK -0x1.aec22c131376p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.1000000075408p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4057 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.afffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4057 3 OK -0x1.aec22c131376p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.1000000075408p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4057 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.afffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4058 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:4058 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4058 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.cfffffff8abf9p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4058 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4058 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.cfffffff8abf9p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4059 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.ap4 0x0.0p0 0x0.0p0 T +REG epsg:4059 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.5000000075407p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4059 2 OK 0x1.019a1160989bbp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.efffffff8abfap4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4059 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.5000000075407p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4059 4 OK 0x1.019a1160989bbp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.efffffff8abfap4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4060 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.cp4 0x0.0p0 0x0.0p0 T +REG epsg:4060 1 OK -0x1.aec22c131379p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.7000000075407p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4060 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.07ffffffc55fcp5 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4060 3 OK -0x1.aec22c131379p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.7000000075407p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4060 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.07ffffffc55fcp5 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:4061 0 OK 0x1.e84800000001cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.dffffffffffffp3 -0x1.9p4 0x0.0p0 F +REG epsg:4061 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.2f75a3f3d468cp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:4061 2 OK 0x1.f8272811f1558p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.48452e0615cb8p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4061 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4061 4 OK 0x1.07218271ed493p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.48452e0615cb8p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4062 0 OK 0x1.e848000000011p18 0x1.b997b102aac2p22 0x0.0p0 0x1.5p4 -0x1.9p4 0x0.0p0 F +REG epsg:4062 1 OK -0x1.fbe5023e2a88p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.ef75a3f3d468ep3 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4062 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4062 3 OK -0x1.2fd8271ed488p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4062 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4063 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.bp4 -0x1.9p4 0x0.0p0 F +REG epsg:4063 1 OK -0x1.fbe5023e2a9p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4063 2 OK 0x1.f8272811f154bp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4063 3 OK -0x1.2fd8271ed48bp16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4063 4 OK 0x1.07218271ed48cp20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.042297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4071 0 OK 0x1.e8366af1d46cbp18 0x1.b9984cfc5e3e7p22 -0x1.73bce478p-1 -0x1.68p5 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:4071 1 OK -0x1.fd00f42b66eap14 0x1.9701e81ef6814p22 -0x1.8a3e3cc8p1 -0x1.942297030ae5dp5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:4071 2 OK 0x1.f81e727d62c93p19 0x1.9701e81f35a62p22 -0x1.d972c7c3p3 -0x1.3bdd68fcf51a4p5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:4071 3 OK -0x1.301dfb2d8c488p16 0x1.dacb3cbd3359cp22 0x1.553a9c75p3 -0x1.942297030ae5dp5 -0x1.3fffffffffffcp4 0x1.0p-29 F +REG epsg:4071 4 OK 0x1.071d151e14bcep20 0x1.dacb3cbd6f6d6p22 -0x1.0630f95ap1 -0x1.3bdd68fcf51a3p5 -0x1.4000000000002p4 0x1.0p-29 F +REG epsg:4073 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4073 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4073 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4073 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4073 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4075 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4075 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4075 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4075 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4075 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4079 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4079 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4079 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4079 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4079 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4081 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4081 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4081 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4081 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4081 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4082 0 OK 0x1.e847fffffffeep18 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:4082 1 OK -0x1.ad750e9eb002p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:4082 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:4082 3 OK -0x1.ad750e9eb002p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:4082 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:4083 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:4083 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:4083 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:4083 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:4083 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:4087 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4087 1 OK -0x1.0fc6ae86e479fp19 -0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4087 2 OK 0x1.0fc6ae86e479fp19 -0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4087 3 OK -0x1.0fc6ae86e479fp19 0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4087 4 OK 0x1.0fc6ae86e479fp19 0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4088 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4088 1 OK -0x1.0f78e7cf91b44p19 -0x1.0f78e7cf91b44p19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4088 2 OK 0x1.0f78e7cf91b44p19 -0x1.0f78e7cf91b44p19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4088 3 OK -0x1.0f78e7cf91b44p19 0x1.0f78e7cf91b44p19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4088 4 OK 0x1.0f78e7cf91b44p19 0x1.0f78e7cf91b44p19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4093 0 OK 0x1.86ap17 -0x1.312dp22 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:4093 1 OK -0x1.5adb60186fa9cp18 -0x1.530cb7086dd4fp22 0x0.0p0 0x1.00000001d501bp2 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4093 2 OK 0x1.70bdb00c37d4fp19 -0x1.530cb7086dd4fp22 0x0.0p0 0x1.bfffffff157f2p3 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4093 3 OK -0x1.5adb60186fa9cp18 -0x1.0f4d48f7922b1p22 0x0.0p0 0x1.00000001d501bp2 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4093 4 OK 0x1.70bdb00c37d4fp19 -0x1.0f4d48f7922b1p22 0x0.0p0 0x1.bfffffff157f2p3 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4094 0 OK 0x1.86ap18 -0x1.312dp22 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 T +REG epsg:4094 1 OK -0x1.2f16c030df538p17 -0x1.530cb7086dd4fp22 0x0.0p0 0x1.40000001d501bp2 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4094 2 OK 0x1.d265b00c37d4dp19 -0x1.530cb7086dd4fp22 0x0.0p0 0x1.dfffffff157f1p3 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4094 3 OK -0x1.2f16c030df538p17 -0x1.0f4d48f7922b1p22 0x0.0p0 0x1.40000001d501bp2 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4094 4 OK 0x1.d265b00c37d4dp19 -0x1.0f4d48f7922b1p22 0x0.0p0 0x1.dfffffff157f1p3 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4095 0 OK 0x1.24f8p19 -0x1.312dp22 0x0.0p0 0x1.78p3 0x0.0p0 0x0.0p0 T +REG epsg:4095 1 OK 0x1.5e24ff3c82b1p15 -0x1.530cb7086dd4fp22 0x0.0p0 0x1.b0000001d501bp2 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4095 2 OK 0x1.1a06d8061bea8p20 -0x1.530cb7086dd4fp22 0x0.0p0 0x1.0bffffff8abfap4 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4095 3 OK 0x1.5e24ff3c82b1p15 -0x1.0f4d48f7922b1p22 0x0.0p0 0x1.b0000001d501bp2 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4095 4 OK 0x1.1a06d8061bea8p20 -0x1.0f4d48f7922b1p22 0x0.0p0 0x1.0bffffff8abfap4 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:4096 0 OK 0x1.86ap19 -0x1.312dp22 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:4096 1 OK 0x1.de23b2841a0f8p17 -0x1.530ce36ed8bb4p22 0x0.0p0 0x1.40000000ea80ep3 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:4096 2 OK 0x1.4adb89af7cbe2p20 -0x1.530ce36ed8bb4p22 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:4096 3 OK 0x1.de23b2841a0f8p17 -0x1.0f4d1c912744cp22 0x0.0p0 0x1.40000000ea80ep3 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:4096 4 OK 0x1.4adb89af7cbe2p20 -0x1.0f4d1c912744cp22 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:4097 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4097 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4097 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4097 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4097 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4098 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4098 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4098 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4098 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4098 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4099 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4099 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4099 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4099 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4099 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4100 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4100 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4100 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4100 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4100 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:4120 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4120 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4120 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4120 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4120 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4121 0 OK -0x1.603b5ae1ee4e1p-11 -0x1.2453f7c9b116fp-9 0x1.8fc01f4028p7 0x0.0p0 0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:4121 1 OK -0x1.40086ef74eee8p2 -0x1.4021be6bdfa7p2 0x1.c4b0256a78p7 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4121 2 OK 0x1.3ff26b65f6d1cp2 -0x1.4021e9884bd96p2 0x1.aab6f4c3dp7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4121 3 OK -0x1.40086ef74eee8p2 0x1.3fd8f20de4617p2 0x1.6eb6a4e3ap7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4121 4 OK 0x1.3ff26b65f6d1cp2 0x1.3fd91d209cc9bp2 0x1.54bd68b098p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4122 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4122 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4122 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4122 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4122 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4123 0 OK 0x1.264f1c8cabcb6p-10 0x1.39f000864000bp-10 -0x1.48f4b8294p7 -0x1.3284012cd9076p-29 0x1.33c4f952fca25p-27 0x1.3c5dcp-12 T +REG epsg:4123 1 OK -0x1.3fee3faef5d5ap2 -0x1.3febbd270d187p2 -0x1.6c986d095p7 -0x1.400000055e727p2 -0x1.3ffffff938362p2 0x1.d7208p-13 F +REG epsg:4123 2 OK 0x1.400f40ee99678p2 -0x1.3fef632c7a9f3p2 -0x1.4ff0540ccp7 0x1.4000000088969p2 -0x1.3ffffff92c73dp2 0x1.1f288p-13 F +REG epsg:4123 3 OK -0x1.3fea7d493e1dep2 0x1.4016a9a7bd706p2 -0x1.4217f67708p7 -0x1.400000051af9ep2 0x1.4000000bf8e61p2 0x1.27b56p-11 F +REG epsg:4123 4 OK 0x1.40130f8051311p2 0x1.4012a4a369147p2 -0x1.257f5b5028p7 0x1.4000000081f86p2 0x1.4000000c29e11p2 0x1.f7efp-12 F +REG epsg:4124 0 OK 0x1.9e246d962a732p-10 -0x1.3e3a70646adbdp-8 0x1.45c720a21cp8 0x1.5278c0f69e36ap-29 -0x1.17bb94ca46bdep-27 0x1.08cb98p-7 T +REG epsg:4124 1 OK -0x1.3feb099f4ff1ap2 -0x1.40532a1aef1bdp2 0x1.8088f7370cp8 -0x1.3ffffffebaa62p2 -0x1.400000045a6b4p2 0x1.0b7ef8p-7 F +REG epsg:4124 2 OK 0x1.401f7abba7359p2 -0x1.405293213b173p2 0x1.795c3be3b8p8 0x1.400000002c347p2 -0x1.4000000083ec5p2 0x1.0c5d88p-7 F +REG epsg:4124 3 OK -0x1.3febdbe3fa7p2 0x1.3fb3fc1a26555p2 0x1.177a0d37fcp8 -0x1.3ffffffb18945p2 0x1.3fffffef7185cp2 0x1.fe312p-8 F +REG epsg:4124 4 OK 0x1.401ef40c43dcap2 0x1.3fb4c2ae705d1p2 0x1.104eac98b4p8 0x1.40000004119e2p2 0x1.3ffffff31ee63p2 0x1.046c16p-7 F +REG epsg:4125 0 OK -0x1.93a5d93684ad9p-8 -0x1.af27cebbffdffp-12 0x1.1e2a5e7facp10 0x1.2d6cb2018702p-60 0x0.0p0 -0x1.0p-29 T +REG epsg:4125 1 OK -0x1.405fb25fff7f6p2 -0x1.3fff06e5c9603p2 0x1.2d24e086aep10 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4125 2 OK 0x1.3f95e0bd3f73ap2 -0x1.400091f249b39p2 0x1.0f6111371dp10 0x1.4p2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4125 3 OK -0x1.405fb25fff7f6p2 0x1.3ff19b1170a5ap2 0x1.2b29aa0562p10 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4125 4 OK 0x1.3f95e0bd3f73ap2 0x1.3ff3260d8b162p2 0x1.0d65d8453dp10 0x1.3ffffffffffffp2 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:4126 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4126 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4126 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4126 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4126 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4127 0 OK 0x1.d6f852fd9af0bp-11 0x1.0e48486a4402ep-9 0x1.535b3b95p3 0x1.2d6cb2018701ep-62 0x0.0p0 0x0.0p0 T +REG epsg:4127 1 OK -0x1.3ff040a0b7c1bp2 -0x1.3fe387b9ce045p2 -0x1.0c1b1f6d4p4 -0x1.4p2 -0x1.4p2 -0x1.8p-29 F +REG epsg:4127 2 OK 0x1.400daff50a9a4p2 -0x1.3fe34e1eb9e46p2 0x1.374efb18p-1 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4127 3 OK -0x1.3ff040a0b7c1bp2 0x1.4026d6a7af716p2 0x1.6fd28ecdp4 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4127 4 OK 0x1.400daff50a9a4p2 0x1.40269d009c6d6p2 0x1.42d3d9ecp5 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4128 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4128 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4128 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4128 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4128 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4129 0 OK 0x1.030809a4fbc7bp-10 0x1.8d1f43ea6b66dp-9 0x1.f4e0e1ef4p5 0x1.c4230b024a82bp-62 0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4129 1 OK -0x1.3fee1c7da5a04p2 -0x1.3fd314303e657p2 0x1.8a8b9084cp4 -0x1.4p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4129 2 OK 0x1.400e7d493c77p2 -0x1.3fd2d4d5f3332p2 0x1.5e14992c4p5 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4129 3 OK -0x1.3fee1c7da5a04p2 0x1.4035f95c81654p2 0x1.4c39ffb1cp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4129 4 OK 0x1.400e7d493c77p2 0x1.4035b9eed30f4p2 0x1.98a139ff8p6 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4130 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4130 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4130 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4130 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4130 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4131 0 OK -0x1.0356d3a848819p-7 -0x1.77c10243fd11p-9 0x1.4b5ca4c05ep9 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4131 1 OK -0x1.408436da1e1c1p2 -0x1.402ba0ff2671ep2 0x1.7f7a99ddbcp9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4131 2 OK 0x1.3f80e1baa6b7p2 -0x1.402d9cee196c9p2 0x1.32fc1df984p9 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4131 3 OK -0x1.408436da1e1c1p2 0x1.3fce0e5976c4fp2 0x1.63da029734p9 -0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4131 4 OK 0x1.3f80e1baa6b7p2 0x1.3fd009b57f214p2 0x1.175b5afb22p9 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4132 0 OK 0x1.815681224820cp-10 -0x1.d5836eee61788p-9 0x1.02d1a7583p7 0x0.0p0 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4132 1 OK -0x1.3fe4ce924da42p2 -0x1.404080131a15cp2 0x1.2d11ca5c38p7 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4132 2 OK 0x1.4014f91319dfp2 -0x1.404021b446a28p2 0x1.65e6091ffp7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4132 3 OK -0x1.3fe4ce924da42p2 0x1.3fcb93d5ea974p2 0x1.45f7ab17ap6 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4132 4 OK 0x1.4014f91319dfp2 0x1.3fcb359930622p2 0x1.b7a079cbfp6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4133 0 OK 0x1.c8a1813a687fdp-18 0x1.aa982dade342bp-20 0x1.18ef9fp-5 0x1.0a60938e855efp-47 0x1.8715205d8465dp-43 0x1.0p-27 T +REG epsg:4133 1 OK -0x1.3fffe57da803dp2 -0x1.3ffff7d350ce3p2 -0x1.d172a9p-6 -0x1.4000000000024p2 -0x1.3ffffffffff62p2 0x1.4p-28 F +REG epsg:4133 2 OK 0x1.40001ae08600ep2 -0x1.3ffffb413ff5ep2 0x1.0caa878p-4 0x1.4000000000036p2 -0x1.3ffffffffff65p2 0x1.4p-28 F +REG epsg:4133 3 OK -0x1.3fffe1cb3ec93p2 0x1.400008d891c66p2 0x1.fd48fp-9 -0x1.4000000000022p2 0x1.40000000000e6p2 0x1.8p-27 F +REG epsg:4133 4 OK 0x1.40001e90393d6p2 0x1.400004cb0649ap2 0x1.90793c4p-4 0x1.4000000000031p2 0x1.40000000000e4p2 0x1.8p-27 F +REG epsg:4134 0 OK -0x1.2fd66b639b096p-12 -0x1.13c0a1f175c33p-9 -0x1.30b723be4p5 -0x1.1c2e999176f94p-29 0x1.3a92f31e3b9abp-27 0x1.671004p-7 T +REG epsg:4134 1 OK -0x1.40022b3780f9ap2 -0x1.40298f7102167p2 -0x1.4993f06fep5 -0x1.40000003deeffp2 -0x1.3fffffef99277p2 0x1.612594p-7 F +REG epsg:4134 2 OK 0x1.3ff94f7b257d9p2 -0x1.402867d0c37cfp2 -0x1.054a5498p1 0x1.3ffffffb896a5p2 -0x1.3fffffebb63bp2 0x1.5c335cp-7 F +REG epsg:4134 3 OK -0x1.4002ad1d55a46p2 0x1.3fe43e445081p2 -0x1.1e58f6ad1p6 -0x1.3fffffffc2fdp2 0x1.3ffffffeeed59p2 0x1.6a3d76p-7 F +REG epsg:4134 4 OK 0x1.3ff88a97b6c7fp2 0x1.3fe461f5fc4b1p2 -0x1.036789952p5 0x1.3fffffff59a38p2 0x1.40000002f4495p2 0x1.69fbc8p-7 F +REG epsg:4135 0 OK 0x1.4f92d47cbc04cp-9 0x1.ad245e2eeba7bp-10 -0x1.04c83746f8p7 -0x1.2d6cb2018701fp-61 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:4135 1 OK -0x1.3fd6d6f49fdbcp2 -0x1.3fec7d42d3d79p2 -0x1.514bce06fp7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4135 2 OK 0x1.402abb1d8cab4p2 -0x1.3febd90f580bcp2 -0x1.dca18c118p6 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4135 3 OK -0x1.3fd6d6f49fdbcp2 0x1.4021ec88de059p2 -0x1.123097e4e8p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4135 4 OK 0x1.402abb1d8cab4p2 0x1.4021483a3de12p2 -0x1.5e6b606adp6 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4136 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4136 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4136 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4136 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4136 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4137 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4137 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4137 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4137 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4137 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4138 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4138 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4138 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4138 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4138 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4139 0 OK -0x1.531a6e9552664p-11 0x1.deeda180e5ed3p-11 -0x1.41985c019p6 -0x1.2d6cb2018701ep-63 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4139 1 OK -0x1.400abd038eaccp2 -0x1.3ff740d3597b4p2 -0x1.44438cdddp6 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4139 2 OK 0x1.3ff58b7ffae96p2 -0x1.3ff76a501b1c5p2 -0x1.764650c61p6 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4139 3 OK -0x1.400abd038eaccp2 0x1.401511ea3ff34p2 -0x1.fbac69ce8p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4139 4 OK 0x1.3ff58b7ffae96p2 0x1.40153b6ad512cp2 -0x1.2fd8efb3cp6 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4140 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4140 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4140 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4140 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4140 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4141 0 OK -0x1.0308e9375b4abp-11 -0x1.ed1cc1b809332p-12 0x1.8000ec36p5 0x0.0p0 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:4141 1 OK -0x1.40077a008c586p2 -0x1.4006fedfdeb5dp2 0x1.c78ba5aap5 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4141 2 OK 0x1.3ff7498ce3565p2 -0x1.40071e91bc4dp2 0x1.7b241392ap5 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4141 3 OK -0x1.40077a008c586p2 0x1.3ff7a54a23ee2p2 0x1.7f085320cp5 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4141 4 OK 0x1.3ff7498ce3565p2 0x1.3ff7c4fa805cbp2 0x1.32a0b9dfap5 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4142 0 OK -0x1.f339859fa5f9ap-12 -0x1.14cf6116cc35ap-8 0x1.9beaf9d68p3 0x0.0p0 -0x1.c72f1eacb7b03p-60 0x1.0p-30 T +REG epsg:4142 1 OK -0x1.400630d09b203p2 -0x1.404c3a62470c4p2 0x1.df01aap5 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4142 2 OK 0x1.3ff6971e45aecp2 -0x1.404c58f44bf26p2 0x1.9561b320ep5 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4142 3 OK -0x1.400630d09b203p2 0x1.3fc25c517b64ap2 -0x1.588edfbf4p4 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4142 4 OK 0x1.3ff6971e45aecp2 0x1.3fc27ad67a783p2 -0x1.ebcf497fcp4 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4143 0 OK -0x1.f33986dacdc7p-12 -0x1.14af842443189p-8 0x1.943cc4e6p3 0x1.2d6cb2018701ep-63 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4143 1 OK -0x1.4006319b249eep2 -0x1.404c333d5a489p2 0x1.dcf45cdbep5 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4143 2 OK 0x1.3ff697e8c567ap2 -0x1.404c51cf5ea8cp2 0x1.935465caep5 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4143 3 OK -0x1.4006319b249eep2 0x1.3fc2650b31c9ep2 -0x1.5c138a46p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4143 4 OK 0x1.3ff697e8c567ap2 0x1.3fc2839031d74p2 -0x1.ef53f45bcp4 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4144 0 OK -0x1.d958c0307197bp-8 -0x1.3dac437392edap-9 0x1.435b0d54ecp9 0x1.2d6cb2018702p-60 0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG epsg:4144 1 OK -0x1.4079168303e67p2 -0x1.4024b0910d3e6p2 0x1.720e3a0cfp9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4144 2 OK 0x1.3f8c6bb149d59p2 -0x1.40268011bcf8cp2 0x1.2c3f356bcp9 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4144 3 OK -0x1.4079168303e67p2 0x1.3fd5949dda741p2 0x1.5ab2daa8f4p9 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4144 4 OK 0x1.3f8c6bb149d59p2 0x1.3fd763ad300dfp2 0x1.14e3b44cccp9 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4145 0 OK -0x1.91865895a07ffp-8 -0x1.11d16ce1beb9ep-9 0x1.14661a38eep9 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4145 1 OK -0x1.4068059584ad1p2 -0x1.402041a308ap2 0x1.3c73edd0a6p9 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4145 2 OK 0x1.3f9f43bc3e078p2 -0x1.4021cacb3bd26p2 0x1.013c830492p9 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4145 3 OK -0x1.4068059584ad1p2 0x1.3fdc1172cb74cp2 0x1.28520095d6p9 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4145 4 OK 0x1.3f9f43bc3e078p2 0x1.3fdd9a481d6a1p2 0x1.da34fa402cp8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4146 0 OK -0x1.b151613609a8p-8 -0x1.30a3538716c6cp-9 0x1.0f72c665eep9 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4146 1 OK -0x1.40701fcf3b8c7p2 -0x1.40242fea89a4bp2 0x1.3b067a2612p9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4146 2 OK 0x1.3f97788cb1233p2 -0x1.4025d83998656p2 0x1.f63d75852cp8 0x1.3fffffffffffep2 -0x1.4p2 0x1.0p-29 F +REG epsg:4146 3 OK -0x1.40701fcf3b8c7p2 0x1.3fd852f0a62e7p2 0x1.24a072c42cp9 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4146 4 OK 0x1.3f97788cb1233p2 0x1.3fd9fadc326c3p2 0x1.c9712b8864p8 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4147 0 OK 0x1.fe28e367cce94p-11 0x1.27d2374535bd8p-11 -0x1.69f480e8ep6 0x1.2d6cb2018701dp-62 0x1.2f74bf1dcfcadp-64 0x1.0p-29 T +REG epsg:4147 1 OK -0x1.3fefd519f8779p2 -0x1.3ff69e670e28ep2 -0x1.a5f049ac2p6 -0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4147 2 OK 0x1.400fb77318d24p2 -0x1.3ff65ffe390f4p2 -0x1.5ab352c42p6 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4147 3 OK -0x1.3fefd519f8779p2 0x1.4009092d785abp2 -0x1.7a7002b51p6 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4147 4 OK 0x1.400fb77318d24p2 0x1.4008cac115201p2 -0x1.2f3314437p6 0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4148 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4148 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4148 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4148 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4148 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4149 0 OK -0x1.1baba8131e01cp-13 -0x1.e08736809a2e5p-9 0x1.05ef9a09cp6 0x0.0p0 0x1.c72f1eacb7b05p-60 0x0.0p0 T +REG epsg:4149 1 OK -0x1.400ae6839397fp2 -0x1.4042c93701686p2 0x1.aaf7e8533p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4149 2 OK 0x1.400677dc926d7p2 -0x1.4042d1e6338fap2 0x1.a082728a1p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4149 3 OK -0x1.400ae6839397fp2 0x1.3fcb1ed161ab5p2 0x1.20a3206f4p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 -0x1.0p-29 F +REG epsg:4149 4 OK 0x1.400677dc926d7p2 0x1.3fcb277d5db2ap2 0x1.0bb82592cp5 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4150 0 OK -0x1.1baba8131e01cp-13 -0x1.e08736809a2e5p-9 0x1.05ef9a09cp6 0x0.0p0 0x1.c72f1eacb7b05p-60 0x0.0p0 T +REG epsg:4150 1 OK -0x1.400ae6839397fp2 -0x1.4042c93701686p2 0x1.aaf7e8533p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4150 2 OK 0x1.400677dc926d7p2 -0x1.4042d1e6338fap2 0x1.a082728a1p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4150 3 OK -0x1.400ae6839397fp2 0x1.3fcb1ed161ab5p2 0x1.20a3206f4p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 -0x1.0p-29 F +REG epsg:4150 4 OK 0x1.400677dc926d7p2 0x1.3fcb277d5db2ap2 0x1.0bb82592cp5 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4151 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4151 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4151 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4151 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4151 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4152 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4152 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4152 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4152 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4152 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4153 0 OK 0x1.72e2c1c6dbc22p-10 0x1.780d21a0e709dp-10 -0x1.d576dafacp6 -0x1.2d6cb2018702p-62 0x0.0p0 -0x1.0p-29 T +REG epsg:4153 1 OK -0x1.3fe7197c99846p2 -0x1.3fe9639d049d7p2 -0x1.22609db468p7 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4153 2 OK 0x1.401575880f14ap2 -0x1.3fe908e232968p2 -0x1.d75bc7ffep6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4153 3 OK -0x1.3fe7197c99846p2 0x1.40183692081ccp2 -0x1.d62815cbbp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4153 4 OK 0x1.401575880f14ap2 0x1.4017dbca11993p2 -0x1.68c2c1abfp6 0x1.3fffffffffffep2 0x1.4p2 0x1.0p-29 F +REG epsg:4154 0 OK 0x1.36d6a1e14262ep-10 0x1.84ce9ac976c9ap-10 -0x1.0bfe36beep7 -0x1.2d6cb2018702p-62 0x0.0p0 -0x1.0p-29 T +REG epsg:4154 1 OK -0x1.3feb110a30738p2 -0x1.3fe8c7bc6f023p2 -0x1.3fe54823dp7 -0x1.4p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4154 2 OK 0x1.4011eb9e09db9p2 -0x1.3fe87bb22e40dp2 -0x1.120da2115p7 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4154 3 OK -0x1.3feb110a30738p2 0x1.40193149f9ef5p2 -0x1.06b884e9bp7 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4154 4 OK 0x1.4011eb9e09db9p2 0x1.4018e53455c1bp2 -0x1.b1c1d8caap6 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4155 0 OK -0x1.5c8484977769cp-12 -0x1.2600637565001p-10 -0x1.d32dca1bcp4 0x1.2d6cb2018701fp-64 0x0.0p0 -0x1.0p-30 T +REG epsg:4155 1 OK -0x1.400460718b9a7p2 -0x1.401a284bf8773p2 -0x1.a52fe162p3 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4155 2 OK 0x1.3ff97c5f7a8a2p2 -0x1.401a3da02fe93p2 -0x1.396443188p4 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4155 3 OK -0x1.400460718b9a7p2 0x1.3ff58cca38a0ep2 -0x1.163af41bep5 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4155 4 OK 0x1.3ff97c5f7a8a2p2 0x1.3ff5a21c06156p2 -0x1.49a128ce2p5 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4156 0 OK -0x1.65f989db43ec6p-11 -0x1.1c82b2803b43ap-8 0x1.2dba2eb45p7 0x0.0p0 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4156 1 OK -0x1.4012c56ead8bp2 -0x1.404ca3304407bp2 0x1.968af9a498p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4156 2 OK 0x1.3ffc65fc62135p2 -0x1.404ccf079aa71p2 0x1.7c2566cedp7 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4156 3 OK -0x1.4012c56ead8bp2 0x1.3fbeef421c96ap2 0x1.de62552aap6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4156 4 OK 0x1.3ffc65fc62135p2 0x1.3fbf1b0641288p2 0x1.a99701ccap6 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4157 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4157 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4157 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4157 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4157 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4158 0 OK -0x1.b61e932f62dcdp-9 -0x1.9727a4524f474p-10 -0x1.f50b2bc988p7 0x1.2d6cb2018701fp-61 0x0.0p0 -0x1.0p-30 T +REG epsg:4158 1 OK -0x1.4036c1dc6ec8bp2 -0x1.401b442d30b8bp2 -0x1.951e162ee8p7 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4158 2 OK 0x1.3fc93aee24d17p2 -0x1.401c1aaa81e36p2 -0x1.0b2c15f6p8 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4158 3 OK -0x1.4036c1dc6ec8bp2 0x1.3fe891dd55cafp2 -0x1.d0fd732edp7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4158 4 OK 0x1.3fc93aee24d17p2 0x1.3fe96839088acp2 -0x1.291bd87808p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4159 0 OK 0x1.d28842ca67f3ap-11 0x1.6973c14977228p-10 -0x1.0e4943ea48p7 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4159 1 OK -0x1.3fefedf1f7799p2 -0x1.3fea76012adafp2 -0x1.3a709e75cp7 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4159 2 OK 0x1.400d1645d21adp2 -0x1.3fea3cf09252dp2 -0x1.1809b2f348p7 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4159 3 OK -0x1.3fefedf1f7799p2 0x1.40177797a3611p2 -0x1.0549a5446p7 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:4159 4 OK 0x1.400d1645d21adp2 0x1.40173e7f18ebbp2 -0x1.c5c5866dcp6 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4160 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4160 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4160 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4160 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4160 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4161 0 OK -0x1.07bf6647f7778p-13 -0x1.b9ec27c8fd014p-10 -0x1.167f4b47b4p8 0x0.0p0 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:4161 1 OK -0x1.40026a21881a4p2 -0x1.401e31a3b48f9p2 -0x1.04227bbfacp8 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4161 2 OK 0x1.3ffe4b2acf378p2 -0x1.401e39b5bd129p2 -0x1.0690d6e278p8 0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4161 3 OK -0x1.40026a21881a4p2 0x1.3fe72b052e387p2 -0x1.24a09ebfa8p8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4161 4 OK 0x1.3ffe4b2acf378p2 0x1.3fe73315d7436p2 -0x1.270efab39cp8 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4162 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4162 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4162 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4162 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4162 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4163 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4163 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4163 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4163 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4163 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4164 0 OK 0x1.44f832235f9b7p-10 -0x1.3dad2c9c2b4d4p-11 -0x1.fff86f1bp4 0x0.0p0 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:4164 1 OK -0x1.3feab6179f094p2 -0x1.4008ff46f3999p2 -0x1.35e7b9bp5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4164 2 OK 0x1.401354da71bd9p2 -0x1.4008afc0486cp2 -0x1.d8ccd4fe8p3 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4164 3 OK -0x1.3feab6179f094p2 0x1.3ff5382bcf15ap2 -0x1.9355ca5aep5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4164 4 OK 0x1.401354da71bd9p2 0x1.3ff4e8aa010ep2 -0x1.a7425d838p4 0x1.3ffffffffffffp2 0x1.3fffffffffffcp2 0x1.0p-28 F +REG epsg:4165 0 OK -0x1.29e25a649e244p-9 -0x1.000a9968dfc76p-12 -0x1.37facd8e4p6 0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-65 0x0.0p0 T +REG epsg:4165 1 OK -0x1.402301c5cf5b6p2 -0x1.4003d15c1c53fp2 -0x1.b262c996ep5 -0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4165 2 OK 0x1.3fd889aa499ebp2 -0x1.400463262837dp2 -0x1.88eb89796p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4165 3 OK -0x1.402301c5cf5b6p2 0x1.3ffbd8fc7a78ep2 -0x1.d8097ee7cp5 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4165 4 OK 0x1.3fd889aa499ebp2 0x1.3ffc6ac2ee6dap2 -0x1.9bbeecaffp6 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4166 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4166 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4166 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4166 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4166 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4167 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4167 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4167 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4167 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4167 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4168 0 OK -0x1.2d6a49b0478fcp-12 -0x1.7db2ce6925b6fp-9 0x1.2010ec58cp5 -0x1.2d6cb2018701dp-64 -0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4168 1 OK -0x1.400225aeba9c6p2 -0x1.40312071ff481p2 0x1.0a503c761p6 -0x1.3fffffffffffdp2 -0x1.4p2 0x0.0p0 F +REG epsg:4168 2 OK 0x1.3ff8ba6bf945p2 -0x1.403132e535b32p2 0x1.e82cac2e6p5 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4168 3 OK -0x1.400225aeba9c6p2 0x1.3fd2129603817p2 0x1.4e5de9bc8p3 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4168 4 OK 0x1.3ff8ba6bf945p2 0x1.3fd22503ce3c5p2 0x1.391c9f13p2 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4169 0 OK -0x1.15deebc1405cp-10 -0x1.f8ff9a85bbf82p-9 0x1.6cec5e80ap5 -0x1.2d6cb2018701ep-63 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:4169 1 OK -0x1.400fe2be2f61ap2 -0x1.40435e364e6ffp2 0x1.77ac7afb4p6 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4169 2 OK 0x1.3fed271a4736ap2 -0x1.4043a243df9b9p2 0x1.25b6bbf12p6 0x1.4000000000001p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4169 3 OK -0x1.400fe2be2f61ap2 0x1.3fc59bda104fdp2 0x1.3a85e27c8p4 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4169 4 OK 0x1.3fed271a4736ap2 0x1.3fc5dfcd2f161p2 -0x1.aa42b048p-1 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4170 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4170 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4170 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4170 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4170 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4171 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4171 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4171 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4171 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4171 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4172 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4172 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4172 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4172 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4172 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4173 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4173 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4173 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4173 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4173 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4174 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4174 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4174 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4174 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4174 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4175 0 OK -0x1.2d6ba1757cecdp-15 -0x1.def004ea1bfd6p-11 -0x1.824e9df14p4 0x1.c4230b024a83p-67 0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG epsg:4175 1 OK -0x1.3fff74a25a30dp2 -0x1.4016bc121531ap2 -0x1.a0807205p3 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4175 2 OK 0x1.3ffe4738ace6ap2 -0x1.4016be6059d3p2 -0x1.b6ba75548p3 0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4175 3 OK -0x1.3fff74a25a30dp2 0x1.3ff8ead468a6cp2 -0x1.e9f70efa4p4 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4175 4 OK 0x1.3ffe4738ace6ap2 0x1.3ff8ed2276dd3p2 -0x1.f51412a7cp4 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4176 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4176 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4176 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4176 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4176 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4178 0 OK 0x1.1cf10c6454bd8p-10 0x1.71d697c460052p-11 -0x1.0bff2aa058p7 0x1.2d6cb2018701dp-63 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:4178 1 OK -0x1.3fee86bf66233p2 -0x1.3ff4e3801872p2 -0x1.2e40268aap7 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4178 2 OK 0x1.401224a586452p2 -0x1.3ff49dc923502p2 -0x1.043a3e5778p7 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4178 3 OK -0x1.3fee86bf66233p2 0x1.400be9f4664e7p2 -0x1.130ed0245p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4178 4 OK 0x1.401224a586452p2 0x1.400ba4387a1bep2 -0x1.d211dbb44p6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4179 0 OK 0x1.1bc4c5c3db0bcp-10 0x1.62023425111ap-11 -0x1.101493e1e8p7 -0x1.c24dfe84eef62p-36 0x1.c3ad39d112cdcp-32 0x1.c1aap-14 T +REG epsg:4179 1 OK -0x1.3fee8e2f9cd32p2 -0x1.3ff5a5f738f2fp2 -0x1.365e444e98p7 -0x1.400000000d439p2 -0x1.3fffffff7f9b2p2 0x1.a11fp-14 F +REG epsg:4179 2 OK 0x1.40124eec134e3p2 -0x1.3ff5081ba6528p2 -0x1.0374db6bfp7 0x1.3ffffffffc89fp2 -0x1.3fffffff7cf56p2 0x1.9c26p-14 F +REG epsg:4179 3 OK -0x1.3feed5abfaedep2 0x1.400b66bd9a141p2 -0x1.1bc62d9b48p7 -0x1.4000000008b2ap2 0x1.400000005a4e3p2 0x1.e1fap-14 F +REG epsg:4179 4 OK 0x1.40120590eae8cp2 0x1.400b5ba552806p2 -0x1.d1b749c6fp6 0x1.3ffffffffdb51p2 0x1.400000005d616p2 0x1.deb2p-14 F +REG epsg:4180 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4180 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4180 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4180 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4180 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4181 0 OK -0x1.c81dc568aa4e5p-11 -0x1.f54fa04a64c94p-12 -0x1.0100ccfd3p6 -0x1.825575544a513p-30 0x1.3f499be1354afp-30 0x1.3a946p-9 T +REG epsg:4181 1 OK -0x1.400bc8f04a9f4p2 -0x1.4007d1c9cd643p2 -0x1.0c50451c9p6 -0x1.400000014ab58p2 -0x1.3ffffffeef684p2 0x1.3b30dp-9 F +REG epsg:4181 2 OK 0x1.3fef8b2d32369p2 -0x1.4007975f3b0dap2 -0x1.190f91333p6 0x1.3ffffffc5a92dp2 -0x1.3ffffffd04debp2 0x1.2f78p-9 F +REG epsg:4181 3 OK -0x1.400bd66c783a4p2 0x1.3ff7f2100ee01p2 -0x1.dde23b5cp5 -0x1.3fffffff4eb2ap2 0x1.3fffffff6b9ffp2 0x1.3c5778p-9 F +REG epsg:4181 4 OK 0x1.3fef1088c4ef7p2 0x1.3ff8419f2528ap2 -0x1.f75c65c6p5 0x1.3ffffffe4cf9dp2 0x1.400000016d9dep2 0x1.39ed78p-9 F +REG epsg:4182 0 OK 0x1.8df2b935e92dcp-10 -0x1.800bfcffae964p-11 0x1.5c0169507p7 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4182 1 OK -0x1.3fe1a8217ae47p2 -0x1.4009055dc446ap2 0x1.47b4e7cfb8p7 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4182 2 OK 0x1.40136627692a6p2 -0x1.4008a3fbc841fp2 0x1.82655250fp7 0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4182 3 OK -0x1.3fe1a8217ae47p2 0x1.3ff11c733ed55p2 0x1.2b781e2a7p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4182 4 OK 0x1.40136627692a6p2 0x1.3ff0bb18761a5p2 0x1.6628913ddp7 0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4183 0 OK -0x1.89422bff02b54p-10 0x1.685bc62ad074fp-12 -0x1.25fed28148p7 0x1.2d6cb2018701fp-62 0x0.0p0 -0x1.0p-30 T +REG epsg:4183 1 OK -0x1.40173d267fe54p2 -0x1.3ffb355a682a9p2 -0x1.0fd12ade9p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4183 2 OK 0x1.3fe6153282251p2 -0x1.3ffb9593da061p2 -0x1.49d08ba6e8p7 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4183 3 OK -0x1.40173d267fe54p2 0x1.40066d0630182p2 -0x1.0291babd7p7 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4183 4 OK 0x1.3fe6153282251p2 0x1.4006cd42f899p2 -0x1.3c91178c8p7 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4184 0 OK -0x1.4c070785efd9ep-10 -0x1.f698efff89427p-12 -0x1.7ffc5aae2p5 -0x1.2d6cb2018701ep-62 0x1.2f74bf1dcfcaep-64 0x0.0p0 T +REG epsg:4184 1 OK -0x1.40122329dc649p2 -0x1.4007653d5b189p2 -0x1.ffcc923d8p4 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4184 2 OK 0x1.3fe8a28d69e55p2 -0x1.4007b67e0f853p2 -0x1.c3c4b1002p5 0x1.3fffffffffffep2 -0x1.4p2 0x1.0p-29 F +REG epsg:4184 3 OK -0x1.40122329dc649p2 0x1.3ff7c01312edep2 -0x1.49cea7322p5 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4184 4 OK 0x1.3fe8a28d69e55p2 0x1.3ff8114fd8f99p2 -0x1.06d690e5ap6 0x1.3fffffffffffep2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4185 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4185 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4185 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4185 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4185 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4188 0 OK 0x1.618678c866761p-10 -0x1.5291f88ee653ep-8 0x1.39397e486p5 -0x1.4a18348e8ccb3p-32 -0x1.ea1b917c19a03p-31 0x1.172ap-14 T +REG epsg:4188 1 OK -0x1.3fefb7175748p2 -0x1.40591529ea9a4p2 0x1.4069b70ep6 -0x1.400000006c85cp2 -0x1.4000000100963p2 0x1.7d84p-14 F +REG epsg:4188 2 OK 0x1.401cb9dc931ddp2 -0x1.4057f4c90f4aap2 0x1.9b1e7cdefp6 0x1.3fffffffd2a38p2 -0x1.400000010bbb4p2 0x1.4fbfp-14 F +REG epsg:4188 3 OK -0x1.3ff085882f0e5p2 0x1.3faf9f4fa15f8p2 -0x1.2540e7b9cp4 -0x1.4000000078dd4p2 0x1.3fffffff28668p2 0x1.e3p-15 F +REG epsg:4188 4 OK 0x1.401be3de18d92p2 0x1.3fb02926dd8c5p2 0x1.16b91a25p2 0x1.3fffffffcdabap2 0x1.3fffffff22445p2 0x1.7d4p-15 F +REG epsg:4189 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4189 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4189 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4189 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4189 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4190 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4190 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4190 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4190 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4190 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4191 0 OK 0x1.01a80498b3857p-10 0x1.21b52eccd83cbp-10 -0x1.62187e568p3 -0x1.2afa66c07baf6p-27 0x1.8753326851f8ap-27 0x1.836cfp-9 T +REG epsg:4191 1 OK -0x1.3ff02cb4f3111p2 -0x1.3fec5e8936818p2 -0x1.dc294d9b8p3 -0x1.4000000a47ea9p2 -0x1.3ffffff4323efp2 0x1.7e6d18p-9 F +REG epsg:4191 2 OK 0x1.400e803cf4735p2 -0x1.3fee461fd5ec5p2 -0x1.d8b48bfp3 0x1.3ffffff57e3b1p2 -0x1.3ffffff21948fp2 0x1.4d04cp-9 F +REG epsg:4191 3 OK -0x1.3fee7b03a1f09p2 0x1.401258f6ad9f7p2 -0x1.021fa0bc8p3 -0x1.40000007b61a5p2 0x1.40000009cf4cfp2 0x1.b1b21p-9 F +REG epsg:4191 4 OK 0x1.4010917c7c6c1p2 0x1.401070b4f4502p2 -0x1.fe4a071cp2 0x1.3ffffff7b1d63p2 0x1.4000000c7978cp2 0x1.8b95a8p-9 F +REG epsg:4192 0 OK 0x1.9b62595b2537bp-10 0x1.9fd3f9f329475p-11 -0x1.672d0e9bcp5 0x0.0p0 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4192 1 OK -0x1.3fe3a2a747425p2 -0x1.3ff2f1ad59204p2 -0x1.125403c89p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4192 2 OK 0x1.40170e9d98d47p2 -0x1.3ff28d07a153ep2 -0x1.31f924954p5 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4192 3 OK -0x1.3fe3a2a747425p2 0x1.400cd51e00fa2p2 -0x1.aa5c0e538p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4192 4 OK 0x1.40170e9d98d47p2 0x1.400c707039e6p2 -0x1.6f5aa36ecp4 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4193 0 OK 0x1.65777d1555bdfp-10 0x1.88a291a2accb5p-12 -0x1.4a626c65cp5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4193 1 OK -0x1.3fe8bef55dc23p2 -0x1.40021c5ca4dc2p2 -0x1.bfd46078ap5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4193 2 OK 0x1.40156d9acb84dp2 -0x1.4001c4e17a034p2 -0x1.d9e8427f4p4 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4193 3 OK -0x1.3fe8bef55dc23p2 0x1.400e553ff6fdap2 -0x1.861783b5cp5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4193 4 OK 0x1.40156d9acb84dp2 0x1.400dfdc17da1dp2 -0x1.666ea8764p4 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4194 0 OK -0x1.44fb538a9d45p-10 0x1.c018a68fa42acp-10 -0x1.9efee5648p8 0x0.0p0 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4194 1 OK -0x1.40166c2cdf5ecp2 -0x1.3fe86674c15f5p2 -0x1.a18ca56d3p8 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4194 2 OK 0x1.3fedcd06a55a7p2 -0x1.3fe8b5f59e572p2 -0x1.b98375cce8p8 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4194 3 OK -0x1.40166c2cdf5ecp2 0x1.402031d766c0bp2 -0x1.809a51666p8 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:4194 4 OK 0x1.3fedcd06a55a7p2 0x1.40208165fcbf1p2 -0x1.9891199b5p8 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4195 0 OK -0x1.9d7d1071d0307p-9 0x1.e6069d7784426p-11 -0x1.6029f9d23cp8 -0x1.9acfbf0e976cep-45 0x0.0p0 0x1.a0ap-14 T +REG epsg:4195 1 OK -0x1.4035096232db2p2 -0x1.3ff432796e851p2 -0x1.4b4daef7bcp8 -0x1.4000000000034p2 -0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG epsg:4195 2 OK 0x1.3fcdaabec986p2 -0x1.3ff4ee4f77d58p2 -0x1.83e9edb0a8p8 0x1.3ffffffffffdp2 -0x1.3fffffffea9p2 0x1.9d74p-14 F +REG epsg:4195 3 OK -0x1.4035096232db2p2 0x1.401274a9f4251p2 -0x1.396f8fe4dcp8 -0x1.4000000000035p2 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG epsg:4195 4 OK 0x1.3fcdaabec986p2 0x1.40133091920e1p2 -0x1.720bc42744p8 0x1.3ffffffffffdp2 0x1.3fffffffea8fep2 0x1.9d74p-14 F +REG epsg:4196 0 OK -0x1.045019453c7ep-8 0x1.09879fc3c0147p-15 -0x1.94519db45p7 -0x1.06bdd67b5640cp-44 0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG epsg:4196 1 OK -0x1.40407f33eb03p2 -0x1.4000c716d4354p2 -0x1.4bd193186p7 -0x1.400000000004p2 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG epsg:4196 2 OK 0x1.3fbe57f361f11p2 -0x1.4001b7622d5fbp2 -0x1.dca3e951e8p7 0x1.3ffffffffffbdp2 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:4196 3 OK -0x1.40407f33eb03p2 0x1.4001cf9632f65p2 -0x1.4a99340b5p7 -0x1.400000000004p2 0x1.3fffffffea8fbp2 0x1.9d7cp-14 F +REG epsg:4196 4 OK 0x1.3fbe57f361f11p2 0x1.4002bfe250b1p2 -0x1.db6b895afp7 0x1.3ffffffffffbep2 0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG epsg:4197 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4197 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4197 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4197 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4197 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4198 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4198 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4198 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4198 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4198 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4199 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4199 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4199 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4199 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4199 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4200 0 OK 0x1.2ac3db46be067p-10 0x1.82b7cbff57a88p-11 -0x1.0621408dep7 0x1.0d3132789cbc8p-51 0x0.0p0 0x1.542p-19 T +REG epsg:4200 1 OK -0x1.3feda48973c63p2 -0x1.3ff45ac3e70c7p2 -0x1.2abeb7fdfp7 -0x1.3fffffffffffep2 -0x1.3fffffffff74p2 0x1.518p-19 F +REG epsg:4200 2 OK 0x1.4012fcc496024p2 -0x1.3ff40f5a59d03p2 -0x1.fa93041b3p6 0x1.4000000000001p2 -0x1.3fffffffff74p2 0x1.50ep-19 F +REG epsg:4200 3 OK -0x1.3feda48973c63p2 0x1.400c6e3f73392p2 -0x1.0e4fa865ep7 -0x1.3fffffffffffep2 0x1.3fffffffff73fp2 0x1.518p-19 F +REG epsg:4200 4 OK 0x1.4012fcc496024p2 0x1.400c22d048472p2 -0x1.c1b4f249ap6 0x1.4000000000001p2 0x1.3fffffffff742p2 0x1.50ep-19 F +REG epsg:4201 0 OK 0x1.1a9404e575d06p-13 -0x1.e3ac6f73e99b2p-10 0x1.aeddcd984p5 0x1.2d6cb2018701dp-64 -0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4201 1 OK -0x1.3ffba7aeca6b7p2 -0x1.4024f4b8f6012p2 0x1.1ee3a92bcp6 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4201 2 OK 0x1.400011f791596p2 -0x1.4024ec13215e4p2 0x1.294ed177bp6 0x1.4000000000001p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4201 3 OK -0x1.3ffba7aeca6b7p2 0x1.3fe8bb453370fp2 0x1.21474f14ep5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4201 4 OK 0x1.400011f791596p2 0x1.3fe8b2a0faf64p2 0x1.361da7574p5 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4202 0 OK 0x1.a146a75cb9728p-12 -0x1.25f3348d0c99ap-10 0x1.82a33e784p6 -0x1.903318b33f14ap-33 -0x1.a6d2e4ef956e9p-34 0x1.3f08p-15 T +REG epsg:4202 1 OK -0x1.3ff8113e38028p2 -0x1.4010bcbde7aaap2 0x1.9d2d94881p6 -0x1.400000002a476p2 -0x1.4000000016fd9p2 0x1.6906p-15 F +REG epsg:4202 2 OK 0x1.4004de3acd34dp2 -0x1.4010dcfbb3394p2 0x1.c0fa4734bp6 0x1.3fffffffce701p2 -0x1.400000001f2f7p2 0x1.3266p-15 F +REG epsg:4202 3 OK -0x1.3ff7dbfdb1722p2 0x1.3fec60c1d07c6p2 0x1.3d2d94938p6 -0x1.40000000315d9p2 0x1.3fffffffe9d0ap2 0x1.4e3cp-15 F +REG epsg:4202 4 OK 0x1.400523394d8c1p2 0x1.3fec05203dc7ap2 0x1.60f85e4f5p6 0x1.3fffffffc8256p2 0x1.3fffffffe4a84p2 0x1.0fb2p-15 F +REG epsg:4203 0 OK 0x1.c4209c7d9e2bap-12 -0x1.613c012b0c57cp-10 0x1.bc01faa5bp6 0x1.2d6cb2018701ep-64 -0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4203 1 OK -0x1.3ff735d657f87p2 -0x1.40145644ca4aap2 0x1.db3a687e1p6 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4203 2 OK 0x1.400556c3d708fp2 -0x1.40143a9aa84c6p2 0x1.fc915e325p6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4203 3 OK -0x1.3ff735d657f87p2 0x1.3fe85aa11a466p2 0x1.735731d9fp6 -0x1.4000000000001p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4203 4 OK 0x1.400556c3d708fp2 0x1.3fe83efabb68ep2 0x1.94ae30832p6 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4204 0 OK 0x1.15de9bce65b7dp-9 -0x1.098692adedd67p-14 -0x1.affb8672bp6 0x1.2d6cb2018701ep-62 0x1.2f74bf1dcfcaep-67 0x0.0p0 T +REG epsg:4204 1 OK -0x1.3fdb6d01a53d5p2 -0x1.4001cd5a2f0dp2 -0x1.008a4884p7 -0x1.4000000000001p2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4204 2 OK 0x1.4020e435a049ap2 -0x1.4001455cb184ep2 -0x1.5d29000b3p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4204 3 OK -0x1.3fdb6d01a53d5p2 0x1.3fffbc5c4d8e8p2 -0x1.02fb057f8p7 -0x1.4p2 0x1.4000000000002p2 -0x1.0p-30 F +REG epsg:4204 4 OK 0x1.4020e435a049ap2 0x1.3fff345fae80ep2 -0x1.620a77f0bp6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4205 0 OK 0x1.7fd7c114bbfc5p-10 -0x1.aabb57249837p-12 -0x1.03fdb41c6p6 0x0.0p0 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4205 1 OK -0x1.3fe774eaa8dep2 -0x1.400633e7b0362p2 -0x1.2e4cec6a9p6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4205 2 OK 0x1.40176f9301cebp2 -0x1.4005d5f96cdffp2 -0x1.7a2a57508p5 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4205 3 OK -0x1.3fe774eaa8dep2 0x1.3ff8eb4af766cp2 -0x1.4dad27601p6 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4205 4 OK 0x1.40176f9301cebp2 0x1.3ff88d608fe05p2 -0x1.b8eabadc8p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4206 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4206 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4206 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4206 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4206 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4207 0 OK 0x1.1d48e7143843fp-11 -0x1.eb6650c677012p-11 0x1.a860887e8p5 0x1.2d6cb2018701dp-63 0x0.0p0 0x1.0p-29 T +REG epsg:4207 1 OK -0x1.3ff32b977fe91p2 -0x1.400dcbeb9f308p2 0x1.b99f5aa2ap5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4207 2 OK 0x1.40050008a8abap2 -0x1.400da902e710cp2 0x1.06e284051p6 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4207 3 OK -0x1.3ff32b977fe91p2 0x1.3fef3408e859dp2 0x1.291998224p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4207 4 OK 0x1.40050008a8abap2 0x1.3fef11237da63p2 0x1.7d3f5543p5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4208 0 OK -0x1.51f6da54c92bep-9 0x1.5d919cb334357p-10 -0x1.8c01de80cp6 -0x1.2d6cb2018701dp-60 0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4208 1 OK -0x1.4028498b931fdp2 -0x1.3fea4d2b8ab7ep2 -0x1.5d93ddc6ep6 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4208 2 OK 0x1.3fd3cc60c47dep2 -0x1.3feaf28658d6ep2 -0x1.12797d6fcp7 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4208 3 OK -0x1.4028498b931fdp2 0x1.4015d3e8759cep2 -0x1.ed8986f46p5 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4208 4 OK 0x1.3fd3cc60c47dep2 0x1.401679598796dp2 -0x1.be23ab92p6 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4209 0 OK 0x1.a7de6b830a57bp-11 0x1.5c87df761a815p-9 0x1.edcc9fe9p4 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4209 1 OK -0x1.3ff0e9c47ebcfp2 -0x1.3fdbd3a617532p2 -0x1.048df58cp0 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4209 2 OK 0x1.400b677f5ea57p2 -0x1.3fdb9fcec13c6p2 0x1.d387255d8p3 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4209 3 OK -0x1.3ff0e9c47ebcfp2 0x1.40329f052b797p2 0x1.91dfd5328p5 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4209 4 OK 0x1.400b677f5ea57p2 0x1.40326b1fe966ap2 0x1.0772e5f6bp6 0x1.3fffffffffffdp2 0x1.4p2 0x0.0p0 F +REG epsg:4210 0 OK 0x1.c42023b50efa7p-15 0x1.66037cc9bacf2p-9 0x1.7ee5c9d2cp5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4210 1 OK -0x1.3ffd0e8b7bfep2 -0x1.3fda553140eddp2 0x1.672dbd3bp4 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4210 2 OK 0x1.3ffed2a8b405bp2 -0x1.3fda51bc847fbp2 0x1.77d93987cp4 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4210 3 OK -0x1.3ffd0e8b7bfep2 0x1.40337d160f9f1p2 0x1.2c6172f12p6 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4210 4 OK 0x1.3ffed2a8b405bp2 0x1.403379a05f20fp2 0x1.308c4fbf5p6 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4211 0 OK -0x1.90e501b6291cp-8 0x1.da1ca769ac4bcp-12 0x1.17386b5375p10 0x1.2d6cb2018701fp-60 0x0.0p0 -0x1.0p-30 T +REG epsg:4211 1 OK -0x1.405f5dbb607d2p2 -0x1.3ff14cba037d8p2 0x1.2411f69575p10 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4211 2 OK 0x1.3f96ec8291176p2 -0x1.3ff2d50477066p2 0x1.06821e5a7dp10 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4211 3 OK -0x1.405f5dbb607d2p2 0x1.40000edefbc6ap2 0x1.263fb5d2dap10 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4211 4 OK 0x1.3f96ec8291176p2 0x1.4001973b57f81p2 0x1.08afe04204p10 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4212 0 OK -0x1.62663dfa3b532p-9 -0x1.f0f45e30329fep-9 -0x1.2025e70ab8p7 0x0.0p0 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4212 1 OK -0x1.402cb5c33b493p2 -0x1.4046e99168994p2 -0x1.3a0d78debp6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4212 2 OK 0x1.3fd41cc798928p2 -0x1.4047972d4ea3bp2 -0x1.058f123978p7 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4212 3 OK -0x1.402cb5c33b493p2 0x1.3fcb2821ed681p2 -0x1.2f2e80c56p7 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4212 4 OK 0x1.3fd41cc798928p2 0x1.3fcbd57b6f8a4p2 -0x1.97b72595a8p7 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4213 0 OK 0x1.99be03b336dfcp-11 -0x1.bdbe1c35175f1p-10 -0x1.8c955f8p2 -0x1.2d6cb2018701fp-63 0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:4213 1 OK -0x1.3ff1d4bca52e2p2 -0x1.402372b332ac5p2 0x1.1e92624cp2 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4213 2 OK 0x1.400b70726b0a7p2 -0x1.4023408afbfb6p2 0x1.395b3d374p4 0x1.4p2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4213 3 OK -0x1.3ff1d4bca52e2p2 0x1.3febf25030b9fp2 -0x1.c4bc31eep4 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4213 4 OK 0x1.400b70726b0a7p2 0x1.3febc030951ep2 -0x1.a60a76ad8p3 0x1.4000000000001p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4214 0 OK 0x1.6b9824f17eb4dp-10 0x1.8639e493cec04p-11 -0x1.ef30bd2ap6 0x1.2d6cb2018701dp-62 0x1.2f74bf1dcfcadp-63 0x1.0p-29 T +REG epsg:4214 1 OK -0x1.3fe97ab56c0dep2 -0x1.3ff4290ef0032p2 -0x1.208da97d2p7 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4214 2 OK 0x1.4016ed6e4019fp2 -0x1.3ff3d019e9df2p2 -0x1.d5dc79e03p6 0x1.3fffffffffffep2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4214 3 OK -0x1.3fe97ab56c0dep2 0x1.400c7474d1017p2 -0x1.03dc91206p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4214 4 OK 0x1.4016ed6e4019fp2 0x1.400c1b791b898p2 -0x1.9c7a59108p6 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4215 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4215 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4215 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4215 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4215 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4216 0 OK -0x1.f59567f8c8cabp-10 -0x1.5ee4ad4ce0b2ap-9 0x1.ce23f036p1 0x1.2d6cb2018702p-61 0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG epsg:4216 1 OK -0x1.401e687b81ac4p2 -0x1.40309cfb42cb2p2 0x1.89336df6ep5 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4216 2 OK 0x1.3fdfb6369fa4p2 -0x1.403117cc00adbp2 0x1.853c8e35p3 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4216 3 OK -0x1.401e687b81ac4p2 0x1.3fd93b12f7343p2 -0x1.397eb9acp1 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4216 4 OK 0x1.3fdfb6369fa4p2 0x1.3fd9b5c2893d6p2 -0x1.3b7cd3f38p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4217 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:4217 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.4c0000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4217 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.5ffffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4217 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.4c0000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4217 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.5ffffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4218 0 OK -0x1.65f57c87ad5c6p-9 0x1.78fa78be64f1cp-9 -0x1.16fe0d0e98p9 0x1.2d6cb2018702p-61 0x0.0p0 -0x1.0p-29 T +REG epsg:4218 1 OK -0x1.4030b25c961d1p2 -0x1.3fd702d18fb69p2 -0x1.16242f6e9ep9 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4218 2 OK 0x1.3fd73594bd78ep2 -0x1.3fd7b1ed8ce42p2 -0x1.308988b41cp9 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4218 3 OK -0x1.4030b25c961d1p2 0x1.4034e3a93b728p2 -0x1.f4d8fe38c4p8 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4218 4 OK 0x1.3fd73594bd78ep2 0x1.403592f816657p2 -0x1.14d1c93ef6p9 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4219 0 OK -0x1.86e2f0764e135p-8 0x1.c7259e7d71c5bp-12 0x1.18f84db4c8p10 0x1.2d6cb2018701fp-60 0x0.0p0 -0x1.0p-30 T +REG epsg:4219 1 OK -0x1.405cc62befb04p2 -0x1.3ff1862562bcep2 0x1.257b234bd8p10 -0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4219 2 OK 0x1.3f9955f3741adp2 -0x1.3ff304a4e3bdfp2 0x1.08a8384213p10 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4219 3 OK -0x1.405cc62befb04p2 0x1.3fffb1295c929p2 0x1.2792931694p10 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4219 4 OK 0x1.3f9955f3741adp2 0x1.40012fb9a0f7p2 0x1.0abfaa8b4ep10 0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4220 0 OK 0x1.99465a0536fedp-9 0x1.11d97da046dabp-9 -0x1.e9d9bc726p5 0x1.2d6cb2018701dp-60 0x0.0p0 0x1.0p-29 T +REG epsg:4220 1 OK -0x1.3fcc2fb1c5c4ep2 -0x1.3fe699b925393p2 -0x1.b525b3754p6 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4220 2 OK 0x1.4032809e31784p2 -0x1.3fe5d17850b7p2 -0x1.876a97e72p5 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4220 3 OK -0x1.3fcc2fb1c5c4ep2 0x1.402acc1c9e8d4p2 -0x1.1410ff69fp6 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4220 4 OK 0x1.4032809e31784p2 0x1.402a03b18a4cdp2 -0x1.1507e3e18p3 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4221 0 OK -0x1.4041961c1afbp-10 -0x1.aabcc363677eap-11 -0x1.9bfddc554p6 0x1.2d6cb2018701fp-62 0x0.0p0 -0x1.0p-30 T +REG epsg:4221 1 OK -0x1.40121c1db8cd4p2 -0x1.400d91dc0eecap2 -0x1.4f1d3d258p6 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4221 2 OK 0x1.3fea142d325e5p2 -0x1.400de03cfddd2p2 -0x1.ad93962c3p6 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4221 3 OK -0x1.40121c1db8cd4p2 0x1.3ff30093bfbc3p2 -0x1.8dddd75f9p6 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4221 4 OK 0x1.3fea142d325e5p2 0x1.3ff34eee3e49fp2 -0x1.ec543fba4p6 0x1.4p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4222 0 OK 0x1.fca4a598d362bp-11 0x1.5a2901750b425p-9 0x1.7dcd63e0cp4 -0x1.2d6cb2018701fp-62 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:4222 1 OK -0x1.3fee5aa959859p2 -0x1.3fdc3b73f53cep2 -0x1.2b4b520c8p3 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4222 2 OK 0x1.400e24bf116d1p2 -0x1.3fdbfd3e3ec52p2 0x1.2cd2b62b8p3 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4222 3 OK -0x1.3fee5aa959859p2 0x1.40326fb39b174p2 0x1.4c6789494p5 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4222 4 OK 0x1.400e24bf116d1p2 0x1.4032316d4cebep2 0x1.e26ebc576p5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4223 0 OK -0x1.c41e4539fe0bcp-15 -0x1.feee818810a58p-9 0x1.2dbd44a368p7 -0x1.2d6cb2018701ep-67 0x0.0p0 0x1.0p-30 T +REG epsg:4223 1 OK -0x1.3ffd7f282915fp2 -0x1.404530b541094p2 0x1.7b35f8f188p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4223 2 OK 0x1.3ffbbb0ccbd9ap2 -0x1.4045342b1aac6p2 0x1.79208cf8bp7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4223 3 OK -0x1.3ffd7f282915fp2 0x1.3fc5f40fd7e3ep2 0x1.c9e365b02p6 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4223 4 OK 0x1.3ffbbb0ccbd9ap2 0x1.3fc5f784553aep2 0x1.c5b88a814p6 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4224 0 OK -0x1.1e8c0c4c5f6ccp-9 0x1.3ddf43689e02cp-12 -0x1.ac804655cp6 -0x1.2d6cb2018701ep-61 0x0.0p0 0x0.0p0 T +REG epsg:4224 1 OK -0x1.4021f7034dd53p2 -0x1.3ffb455441959p2 -0x1.65459aa03p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4224 2 OK 0x1.3fda5476c92bap2 -0x1.3ffbd18e526f4p2 -0x1.0727d49c18p7 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4224 3 OK -0x1.4021f7034dd53p2 0x1.40052a6d4a952p2 -0x1.4de66fdfdp6 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4224 4 OK 0x1.3fda5476c92bap2 0x1.4005b6aba60e9p2 -0x1.f6f074406p6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4225 0 OK -0x1.8d6b93ce44167p-10 0x1.388efe2908c58p-15 -0x1.6b6c107fcp5 -0x1.2d6cb2018701dp-62 0x0.0p0 0x1.0p-29 T +REG epsg:4225 1 OK -0x1.401630f22cabp2 -0x1.3ffee68525807p2 -0x1.0007c9884p5 -0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4225 2 OK 0x1.3fe483d1abeacp2 -0x1.3fff47c3fde58p2 -0x1.ea79c7e0ep5 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4225 3 OK -0x1.401630f22cabp2 0x1.40001ddd61f87p2 -0x1.f491febfcp4 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4225 4 OK 0x1.3fe483d1abeacp2 0x1.40007f1c98015p2 -0x1.e4bafbfaep5 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4226 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4226 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4226 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4226 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4226 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4227 0 OK -0x1.4175b0d0180f8p-14 -0x1.1af5b5f1c8fep-9 0x1.38e6ea1cp6 0x1.2d6cb2018701fp-66 0x1.c72f1eacb7b06p-61 -0x1.0p-30 T +REG epsg:4227 1 OK -0x1.3ffecdc81c4d5p2 -0x1.4029bc75991f1p2 0x1.93e2250ffp6 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4227 2 OK 0x1.3ffc4ae0e0532p2 -0x1.4029c160e36e5p2 0x1.8df512771p6 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4227 3 OK -0x1.3ffecdc81c4d5p2 0x1.3fe3455bd247dp2 0x1.dae39e0ccp5 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4227 4 OK 0x1.3ffc4ae0e0532p2 0x1.3fe34a460a4bp2 0x1.cf0973c1p5 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4228 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4228 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4228 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4228 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4228 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4229 0 OK -0x1.03080ef7ae74ep-10 0x1.ed1b026b696a9p-14 0x1.0c00fc26p6 0x1.2d6cb2018701fp-63 -0x1.2f74bf1dcfcaep-66 -0x1.0p-30 T +REG epsg:4229 1 OK -0x1.400e83e1368d8p2 -0x1.3ffc36458fa54p2 0x1.29a325667p6 -0x1.4p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4229 2 OK 0x1.3fee2314f6b05p2 -0x1.3ffc75a6c1e93p2 0x1.ba779d5aep5 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4229 3 OK -0x1.400e83e1368d8p2 0x1.40000ca7613e4p2 0x1.32b3871c3p6 -0x1.4p2 0x1.4000000000001p2 0x0.0p0 F +REG epsg:4229 4 OK 0x1.3fee2314f6b05p2 0x1.40004c0954147p2 0x1.cc98645b8p5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4230 0 OK 0x1.cd8cd3f95a08fp-11 0x1.1edd76f00354ep-10 -0x1.47ff05dd9p7 -0x1.c4230b024a83p-62 -0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:4230 1 OK -0x1.3ff074e964213p2 -0x1.3fef797ddb5ep2 -0x1.6e0b33b988p7 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4230 2 OK 0x1.400d4d86c4fb6p2 -0x1.3fef41085398dp2 -0x1.4c02561ffp7 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4230 3 OK -0x1.3ff074e964213p2 0x1.4013318dc74f6p2 -0x1.43dc14dc2p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4230 4 OK 0x1.400d4d86c4fb6p2 0x1.4012f912028ddp2 -0x1.21d33eaf58p7 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4231 0 OK 0x1.c42e50f745852p-11 0x1.12a079505077dp-10 -0x1.51548003c8p7 0x1.81f0ecada74cdp-42 -0x1.80bf73c1c1dfcp-42 0x1.3fp-21 T +REG epsg:4231 1 OK -0x1.3ff0cda7cea38p2 -0x1.3ff0489c465f6p2 -0x1.768ce551dp7 -0x1.3fffffffffe83p2 -0x1.4000000000182p2 0x1.3fp-21 F +REG epsg:4231 2 OK 0x1.400d0f3754687p2 -0x1.3ff011abfa08ap2 -0x1.54bb23b3dp7 0x1.3ffffffffff72p2 -0x1.3ffffffffff71p2 0x1.408p-21 F +REG epsg:4231 3 OK -0x1.3ff0cbb7e617dp2 0x1.40127bbc1cdbdp2 -0x1.4daff1ed1p7 -0x1.3fffffffffc8p2 0x1.3fffffffffc8ap2 0x1.318p-21 F +REG epsg:4231 4 OK 0x1.400d0f93584e4p2 0x1.40124271faf63p2 -0x1.2bde3c265p7 0x1.400000000017fp2 0x1.3fffffffffe85p2 0x1.3e8p-21 F +REG epsg:4232 0 OK -0x1.cc883d24a5efep-15 -0x1.11784a8f55fd4p-9 0x1.b720f23d1p7 0x1.9ba737c1e53dbp-51 0x1.2f74bf1dc653ap-61 0x1.81fap-15 T +REG epsg:4232 1 OK -0x1.3ffc9c52a33p2 -0x1.4026bd8fc0888p2 0x1.dda931c07p7 -0x1.3fffffffffffcp2 -0x1.3ffffffff6118p2 0x1.7f16p-15 F +REG epsg:4232 2 OK 0x1.3ffacfc514303p2 -0x1.4026b7355ff94p2 0x1.e17ce77448p7 0x1.3fffffffffffdp2 -0x1.3ffffffff611ap2 0x1.7f0ep-15 F +REG epsg:4232 3 OK -0x1.3ffc9c52a33p2 0x1.3fe2a37246588p2 0x1.8d3b859f18p7 -0x1.3fffffffffffcp2 0x1.3ffffffff611ap2 0x1.7f12p-15 F +REG epsg:4232 4 OK 0x1.3ffacfc514303p2 0x1.3fe29d193c2c7p2 0x1.910f3ceabp7 0x1.3fffffffffffdp2 0x1.3ffffffff6118p2 0x1.7f16p-15 F +REG epsg:4233 0 OK 0x1.79f346adec988p-9 -0x1.da275b874d9e9p-12 -0x1.d7f786ceep6 0x1.c4230b024a82bp-60 -0x1.c72f1eacb7b02p-63 0x1.0p-29 T +REG epsg:4233 1 OK -0x1.3fcf0b70fae94p2 -0x1.40085f86bc843p2 -0x1.1ba51592fp7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4233 2 OK 0x1.402d87a632004p2 -0x1.4007a68aa2c35p2 -0x1.58548d034p6 0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4233 3 OK -0x1.3fcf0b70fae94p2 0x1.3ff99d00f789bp2 -0x1.2d138323fp7 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4233 4 OK 0x1.402d87a632004p2 0x1.3ff8e40d4f492p2 -0x1.7b31540bbp6 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4234 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4234 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4234 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4234 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4234 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4235 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4235 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4235 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4235 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4235 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4236 0 OK 0x1.432cc98f5eb42p-8 0x1.e13a4e9bb8789p-10 0x1.8206e16ed4p8 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4236 1 OK -0x1.3fa7019c69c83p2 -0x1.3fdcce5ff985bp2 0x1.3c86e0de58p8 -0x1.3fffffffffffdp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4236 2 OK 0x1.404896fc0ed7ap2 -0x1.3fdb923779a88p2 0x1.9bd9bb6b88p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4236 3 OK -0x1.3fa7019c69c83p2 0x1.4018ba05bbc65p2 0x1.5fe8eba0bp8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4236 4 OK 0x1.404896fc0ed7ap2 0x1.40177da29e874p2 0x1.bf3ba34b74p8 0x1.3fffffffffffdp2 0x1.4p2 0x0.0p0 F +REG epsg:4237 0 OK 0x1.5241f6ffb3d84p-11 0x1.1a9888bc0a877p-13 -0x1.2cada5e2bp6 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4237 1 OK -0x1.3ff619f9b0df6p2 -0x1.3ffe92bd31108p2 -0x1.4934df892p6 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4237 2 OK 0x1.400b3df5d0422p2 -0x1.3ffe695ab7daap2 -0x1.17520a79ep6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4237 3 OK -0x1.3ff619f9b0df6p2 0x1.4002f8bc695c6p2 -0x1.3ed145f3cp6 -0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4237 4 OK 0x1.400b3df5d0422p2 0x1.4002cf596007cp2 -0x1.0cee723bbp6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4238 0 OK 0x1.1a95a131cd6d3p-13 -0x1.7b51970fc9fecp-15 0x1.0001490cp0 0x0.0p0 0x0.0p0 0x1.0p-30 T +REG epsg:4238 1 OK -0x1.3ffd7bbbde4f3p2 -0x1.4000778749e6ep2 -0x1.5e0e6a8p-5 -0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4238 2 OK 0x1.4001e60b09b9dp2 -0x1.40006ee2935adp2 0x1.47ef0098p1 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4238 3 OK -0x1.3ffd7bbbde4f3p2 0x1.3ffefdae918ap2 -0x1.d41d4c9p-1 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4238 4 OK 0x1.4001e60b09b9dp2 0x1.3ffef509e517bp2 0x1.b0bfd444p0 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4239 0 OK -0x1.e4887050e9c76p-8 -0x1.626b37ac3232bp-9 0x1.41db8a32dp9 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4239 1 OK -0x1.407bec49f74b6p2 -0x1.4029483e9e9ccp2 0x1.72be9e3188p9 -0x1.4p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4239 2 OK 0x1.3f89a9a9a5ba6p2 -0x1.402b22ba437ebp2 0x1.2b494629eep9 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4239 3 OK -0x1.407bec49f74b6p2 0x1.3fd105b6b00b3p2 0x1.58af999f06p9 -0x1.4000000000001p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4239 4 OK 0x1.3f89a9a9a5ba6p2 0x1.3fd2dfb0e11afp2 0x1.113a1b11f2p9 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4240 0 OK -0x1.df3bd8e870cd2p-8 -0x1.5690a1b85fcf3p-9 0x1.455b5524b6p9 0x1.2d6cb2018702p-60 0x0.0p0 -0x1.0p-29 T +REG epsg:4240 1 OK -0x1.407a8214f54bep2 -0x1.4027b9f2dc758p2 0x1.756403497ap9 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4240 2 OK 0x1.3f8ae5bbc039ep2 -0x1.40298f3ba5b34p2 0x1.2eb6bc22aap9 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4240 3 OK -0x1.407a8214f54bep2 0x1.3fd26b1bd409fp2 0x1.5c341cba4p9 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4240 4 OK 0x1.3f8ae5bbc039ep2 0x1.3fd43fe8dc334p2 0x1.1586b0c00cp9 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4241 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4241 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4241 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4241 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4241 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4242 0 OK -0x1.e7772678835e6p-10 -0x1.cdbe482e633cdp-9 -0x1.16c4f30ap7 0x1.c4230b024a831p-61 0x1.c72f1eacb7b08p-60 -0x1.8p-29 T +REG epsg:4242 1 OK -0x1.401f5df8830a5p2 -0x1.40404313ffdfap2 -0x1.54840ed3cp6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4242 2 OK 0x1.3fe26f7992d7cp2 -0x1.4040ba763b687p2 -0x1.e44c18f22p6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4242 3 OK -0x1.401f5df8830a5p2 0x1.3fcd465812ddp2 -0x1.320ec99a78p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4242 4 OK 0x1.3fe26f7992d7cp2 0x1.3fcdbd8fe233dp2 -0x1.79f30128ap7 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4243 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4243 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4243 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4243 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4243 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4244 0 OK -0x1.cf50c5ae57b1dp-8 -0x1.97bd3e8a90981p-11 0x1.deda21292ap9 0x1.2d6cb2018701fp-60 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:4244 1 OK -0x1.407293625fc0fp2 -0x1.4005d8b66800fp2 0x1.01d99c687cp10 -0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4244 2 OK 0x1.3f8aec7fc630ap2 -0x1.40079e338994p2 0x1.bf5ee05174p9 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4244 3 OK -0x1.407293625fc0fp2 0x1.3fec7643d7f6dp2 0x1.fc348fa0dp9 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4244 4 OK 0x1.3f8aec7fc630ap2 0x1.3fee3b9d5ff5fp2 0x1.b7e02c8956p9 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4245 0 OK -0x1.f4fff10b641aep-8 -0x1.7b4c27103e0bp-15 0x1.a5ff33fcaap9 0x1.2d6cb2018701fp-60 0x0.0p0 -0x1.0p-30 T +REG epsg:4245 1 OK -0x1.407d1a896e0b3p2 -0x1.3ffaedb6000c4p2 0x1.ca6bd052ep9 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4245 2 OK 0x1.3f829c3219b17p2 -0x1.3ffcd806f29aep2 0x1.8088b0cb7cp9 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4245 3 OK -0x1.407d1a896e0b3p2 0x1.3ff973e3b5bc5p2 0x1.c9fc432668p9 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4245 4 OK 0x1.3f829c3219b17p2 0x1.3ffb5e326b526p2 0x1.801922f486p9 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4246 0 OK 0x1.d7308c445b4dfp-10 -0x1.377a221cf67e5p-8 0x1.6d28ed21ep7 0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG epsg:4246 1 OK -0x1.3fdec1c0d87c6p2 -0x1.4052f67c4e1b5p2 0x1.a6d5f31e78p7 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4246 2 OK 0x1.4019a7719ac4ep2 -0x1.40528310ab403p2 0x1.ec537464ep7 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4246 3 OK -0x1.3fdec1c0d87c6p2 0x1.3fb7d4202550cp2 0x1.df3ea26eap6 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4246 4 OK 0x1.4019a7719ac4ep2 0x1.3fb760ebd4ce3p2 0x1.351d145718p7 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4247 0 OK -0x1.047042b639adbp-10 0x1.a83d59c2276f5p-9 0x1.682d5593p4 0x1.2d6cb2018701fp-63 0x0.0p0 -0x1.0p-30 T +REG epsg:4247 1 OK -0x1.400cc1667f83ap2 -0x1.3fc9e03b3b2e9p2 -0x1.dc23cf1p-2 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4247 2 OK 0x1.3fec3393b40bp2 -0x1.3fca1feac0561p2 -0x1.3ab7434ecp4 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4247 3 OK -0x1.400cc1667f83ap2 0x1.403386257c94dp2 0x1.ef5c6424p5 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4247 4 OK 0x1.3fec3393b40bp2 0x1.4033c5e9d43f6p2 0x1.55b96d3ep5 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4248 0 OK -0x1.9c15d7e7e98ecp-10 0x1.bdb190879fc2ap-9 0x1.281bc451p5 -0x1.2d6cb2018701ep-62 0x0.0p0 0x1.0p-30 T +REG epsg:4248 1 OK -0x1.40160be2f73eap2 -0x1.3fc6f2117c9c1p2 0x1.1f0efea9cp4 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4248 2 OK 0x1.3fe2897ca3e52p2 -0x1.3fc756d52fd75p2 -0x1.8e461dd1p3 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4248 3 OK -0x1.40160be2f73eap2 0x1.4035efae85383p2 0x1.4dec9484cp6 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4248 4 OK 0x1.3fe2897ca3e52p2 0x1.40365494d54b8p2 0x1.a8c0c70bep5 0x1.3fffffffffffep2 0x1.4p2 0x1.0p-29 F +REG epsg:4249 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4249 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4249 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4249 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4249 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4250 0 OK -0x1.11291470ab2f6p-12 -0x1.af83e0fb89195p-9 0x1.1dd92f458p4 -0x1.2d6cb2018701ep-65 0x0.0p0 0x1.0p-30 T +REG epsg:4250 1 OK -0x1.40029819d435bp2 -0x1.403cfcb2bb421p2 0x1.ae27b16p5 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4250 2 OK 0x1.3ffa0edf53a6bp2 -0x1.403d0d6c18d86p2 0x1.85dea6302p5 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4250 3 OK -0x1.40029819d435bp2 0x1.3fd186fd3ac01p2 -0x1.35f07c5b8p3 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4250 4 OK 0x1.3ffa0edf53a6bp2 0x1.3fd197b10a81ap2 -0x1.d71512e1p3 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4251 0 OK -0x1.78c68214a54e1p-12 -0x1.a14ac159d2b08p-11 -0x1.624ee715cp4 -0x1.2d6cb2018701ep-64 0x0.0p0 0x1.0p-30 T +REG epsg:4251 1 OK -0x1.4004ba65e6594p2 -0x1.4014bfdbf3ae8p2 -0x1.213b10cap3 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4251 2 OK 0x1.3ff8f4455eeb5p2 -0x1.4014d6ea7d8aep2 -0x1.ff7f2ffp3 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4251 3 OK -0x1.4004ba65e6594p2 0x1.3ffac51eb51fbp2 -0x1.8611b20bp4 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4251 4 OK 0x1.3ff8f4455eeb5p2 0x1.3ffadc2b64da1p2 -0x1.f533d3414p4 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4252 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4252 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4252 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4252 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4252 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4253 0 OK 0x1.6aa4d693cbe2fp-11 0x1.e3a8bbc902b31p-12 0x1.fcce2c1b6p5 -0x1.2d6cb2018701fp-63 0x1.2f74bf1dcfcaep-64 -0x1.0p-30 T +REG epsg:4253 1 OK -0x1.3ff2f4847e879p2 -0x1.3ffcf2e7ae00ap2 0x1.aa16d2f3ap5 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4253 2 OK 0x1.40099eac602d4p2 -0x1.3ffcc68920764p2 0x1.0a86f1292p6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4253 3 OK -0x1.3ff2f4847e879p2 0x1.400c0128aa2afp2 0x1.f1364d6eep5 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4253 4 OK 0x1.40099eac602d4p2 0x1.400bd4c80bb87p2 0x1.2e16a97bbp6 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x0.0p0 F +REG epsg:4254 0 OK -0x1.cd8ebc71634b2p-10 -0x1.b8f92d76d702cp-11 -0x1.0aff0de66p8 0x1.2d6cb2018701fp-61 0x0.0p0 -0x1.0p-30 T +REG epsg:4254 1 OK -0x1.401d0d745a43cp2 -0x1.40100e1a42638p2 -0x1.e21e98ad98p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4254 2 OK 0x1.3fe35bfd01fb4p2 -0x1.40107f11c0c14p2 -0x1.1318471da8p8 0x1.3fffffffffffep2 -0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:4254 3 OK -0x1.401d0d745a43cp2 0x1.3ff499eff3908p2 -0x1.01456c7714p8 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4254 4 OK 0x1.3fe35bfd01fb4p2 0x1.3ff50adddaf11p2 -0x1.234e6cf308p8 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4255 0 OK 0x1.0560c406436f6p-9 -0x1.0e425467fdf1ap-10 0x1.4805019b5p6 -0x1.2d6cb2018701fp-61 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:4255 1 OK -0x1.3fdb0a7880142p2 -0x1.400f227f96d3fp2 0x1.1b50a8648p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4255 2 OK 0x1.401c623e56ab3p2 -0x1.400ea28ffb958p2 0x1.b581a2967p6 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4255 3 OK -0x1.3fdb0a7880142p2 0x1.3fed7bbf11e89p2 0x1.97a94d64ap5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4255 4 OK 0x1.401c623e56ab3p2 0x1.3fecfbdcc6a69p2 0x1.6605c0955p6 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4256 0 OK 0x1.0309d6183967bp-9 0x1.3db7b05347903p-10 -0x1.3247925b6p7 0x1.2d6cb2018701ep-62 0x0.0p0 0x1.0p-30 T +REG epsg:4256 1 OK -0x1.3fe0261b4c05ap2 -0x1.3ff5f5243ce0fp2 -0x1.69ed7ad768p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4256 2 OK 0x1.4020e824b378ep2 -0x1.3ff5765f20647p2 -0x1.1d859ac9ap7 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4256 3 OK -0x1.3fe0261b4c05ap2 0x1.401d84a5440d2p2 -0x1.3b34e643ap7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4256 4 OK 0x1.4020e824b378ep2 0x1.401d05d0a4777p2 -0x1.dd9a31597p6 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4257 0 OK -0x1.31f57f411b1e3p-8 -0x1.598572903e21cp-10 0x1.4beabe14d8p10 -0x1.2d6cb2018701ep-60 0x0.0p0 0x0.0p0 T +REG epsg:4257 1 OK -0x1.4044eb5a1e69dp2 -0x1.400ba9175af58p2 0x1.5921956471p10 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4257 2 OK 0x1.3fabf1924f40ap2 -0x1.400cd49193ca9p2 0x1.4291e3b3a7p10 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4257 3 OK -0x1.4044eb5a1e69dp2 0x1.3fe0a36199622p2 0x1.52c7b0834bp10 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4257 4 OK 0x1.3fabf1924f40ap2 0x1.3fe1ceb3faaf8p2 0x1.3c37f8e4f6p10 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4258 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4258 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4258 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4258 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4258 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4259 0 OK 0x1.93e49290182ddp-15 0x1.db850ae1e5702p-11 0x1.8ce6e272p1 0x1.2d6cb2018701ep-67 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4259 1 OK -0x1.3ffbf07f38369p2 -0x1.3ff0472781597p2 -0x1.d5ff6833p2 -0x1.3fffffffffffdp2 -0x1.4p2 0x0.0p0 F +REG epsg:4259 2 OK 0x1.3ffd846131dc1p2 -0x1.3ff0441104befp2 -0x1.9a6e83ccp2 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4259 3 OK -0x1.3ffbf07f38369p2 0x1.400de1f08e5a2p2 0x1.4468c51bp3 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4259 4 OK 0x1.3ffd846131dc1p2 0x1.400dded9c95bep2 0x1.623131ecp3 0x1.3ffffffffffffp2 0x1.4p2 -0x1.8p-29 F +REG epsg:4260 0 OK 0x1.65777d1555bdfp-10 0x1.88a291778124dp-12 -0x1.49f1c88eap5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4260 1 OK -0x1.3fe8bef55dc23p2 -0x1.40021c39a357p2 -0x1.bf640f4eap5 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4260 2 OK 0x1.40156d9acb84dp2 -0x1.4001c4be78911p2 -0x1.d907a02a4p4 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4260 3 OK -0x1.3fe8bef55dc23p2 0x1.400e551cf4285p2 -0x1.85a73292p5 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4260 4 OK 0x1.40156d9acb84dp2 0x1.400dfd9e7adfap2 -0x1.658e062ep4 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4261 0 OK -0x1.57d0688c6f991p-10 -0x1.bdc093fa92df3p-12 -0x1.1e65748588p7 -0x1.2d6cb2018701ep-62 0x0.0p0 0x1.0p-30 T +REG epsg:4261 1 OK -0x1.4015e30f94f2ap2 -0x1.401022b659aa2p2 -0x1.ee2c361abp6 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4261 2 OK 0x1.3feae94a3b374p2 -0x1.401076de44416p2 -0x1.29cab296c8p7 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4261 3 OK -0x1.4015e30f94f2ap2 0x1.4002428d1dd9ap2 -0x1.077934ffb8p7 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:4261 4 OK 0x1.3feae94a3b374p2 0x1.400296b16c19ap2 -0x1.3a2dd0d558p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4262 0 OK -0x1.dce930dd922fep-9 -0x1.1c8345aa5b0a9p-11 0x1.936ebd3fep6 0x1.2d6cb2018701fp-61 0x0.0p0 -0x1.0p-30 T +REG epsg:4262 1 OK -0x1.4043d7396189ap2 -0x1.400eea6c68d38p2 0x1.23363921b8p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4262 2 OK 0x1.3fcc9db9d931ap2 -0x1.400fd3e1a43c2p2 0x1.2d15f6438p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4262 3 OK -0x1.4043d7396189ap2 0x1.3ffd33ead027dp2 0x1.0e4afab158p7 -0x1.4p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4262 4 OK 0x1.3fcc9db9d931ap2 0x1.3ffe1d534225bp2 0x1.033f5af1ep6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4263 0 OK 0x1.b600549dbfbc2p-11 -0x1.2142574ff16f2p-10 -0x1.424a54bc4p4 0x0.0p0 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4263 1 OK -0x1.3ff120d11955cp2 -0x1.4019e46697fb5p2 -0x1.f45d4365p3 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4263 2 OK 0x1.400c80a8f87a3p2 -0x1.4019aeca5f67fp2 0x1.0676aa6p-1 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4263 3 OK -0x1.3ff120d11955cp2 0x1.3ff5e00b3e327p2 -0x1.273c445dap5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4263 4 OK 0x1.400c80a8f87a3p2 0x1.3ff5aa74fde35p2 -0x1.4c15f8ddp4 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4264 0 OK 0x1.35b3948525e67p-15 0x1.c8fb10af91e8fp-11 0x1.f36354ccp0 0x1.2d6cb2018701dp-66 0x1.c72f1eacb7b02p-62 0x1.0p-29 T +REG epsg:4264 1 OK -0x1.3ffc2361c62ep2 -0x1.3ff0de5160c4ap2 -0x1.0124c8f38p3 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4264 2 OK 0x1.3ffd59135cd1dp2 -0x1.3ff0dbf33c3cap2 -0x1.d49cdacp2 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4264 3 OK -0x1.3ffc2361c62ep2 0x1.400d51a17ae69p2 0x1.1874737a8p3 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4264 4 OK 0x1.3ffd59135cd1dp2 0x1.400d4f4321068p2 0x1.2f4acb15p3 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4265 0 OK 0x1.fd0c1f067ee6fp-13 -0x1.7cc0fcfcc9532p-11 -0x1.219a01d91p6 0x1.06215914cab93p-28 -0x1.025d94aa5d72dp-30 0x1.626f1p-10 T +REG epsg:4265 1 OK -0x1.3ffb2a7c4ccfep2 -0x1.400c8458dc1d3p2 -0x1.364e26a83p6 -0x1.3ffffffb45075p2 -0x1.400000015dd34p2 0x1.530f9p-10 F +REG epsg:4265 2 OK 0x1.40025ab572b4p2 -0x1.400d2e8f27261p2 -0x1.14303d61fp6 0x1.40000002d0b88p2 -0x1.40000000b8c16p2 0x1.76f4cp-10 F +REG epsg:4265 3 OK -0x1.3ffa3322006b3p2 0x1.3ff5969c564d9p2 -0x1.2fcf5339bp6 -0x1.3ffffffac36c7p2 0x1.3ffffffedda37p2 0x1.47326p-10 F +REG epsg:4265 4 OK 0x1.4002eb19c5cd7p2 0x1.3ff4b3d001ce5p2 -0x1.0db7a9c43p6 0x1.400000035a197p2 0x1.3fffffff430dap2 0x1.7008p-10 F +REG epsg:4266 0 OK 0x1.32217c0404bc5p-10 -0x1.8e53407b1452dp-12 -0x1.31969a03cp5 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4266 1 OK -0x1.3febea1903171p2 -0x1.400e5b6e2d2b3p2 -0x1.5dec773cp5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4266 2 OK 0x1.40122e08f93c3p2 -0x1.400e10805adeep2 -0x1.52a9f1f24p4 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4266 3 OK -0x1.3febea1903171p2 0x1.4001f532dc30cp2 -0x1.987f88204p5 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4266 4 OK 0x1.40122e08f93c3p2 0x1.4001aa47e9576p2 -0x1.c7cff86p4 0x1.4000000000001p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4267 0 OK -0x1.9p6 0x1.68p5 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG epsg:4267 1 OK -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 F +REG epsg:4267 2 OK -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 F +REG epsg:4267 3 OK -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG epsg:4267 4 OK -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG epsg:4268 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4268 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4268 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4268 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4268 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4269 0 OK -0x1.9p6 0x1.68p5 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG epsg:4269 1 OK -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 F +REG epsg:4269 2 OK -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 F +REG epsg:4269 3 OK -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG epsg:4269 4 OK -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG epsg:4270 0 OK 0x1.6f58cd153c5cdp-10 -0x1.c3a8ebc0c718cp-9 0x1.11bc9a4ea8p7 0x1.2d6cb2018701fp-62 0x0.0p0 -0x1.0p-30 T +REG epsg:4270 1 OK -0x1.3fe5d5d5511bcp2 -0x1.403e2c361aa1cp2 0x1.3a933f75f8p7 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4270 2 OK 0x1.4013c0a356f96p2 -0x1.403dd23fe6866p2 0x1.70c040e7f8p7 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4270 3 OK -0x1.3fe5d5d5511bcp2 0x1.3fcdb22b1b0c4p2 0x1.6b7b0064dp6 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4270 4 OK 0x1.4013c0a356f96p2 0x1.3fcd58542c2d6p2 0x1.d7d54dba5p6 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4271 0 OK -0x1.b98a0b5956f7ap-9 -0x1.872f36d2b85c7p-10 -0x1.e1f9416f1p7 0x1.2d6cb2018702p-61 0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:4271 1 OK -0x1.40370fdc5274cp2 -0x1.401a2567ae3f6p2 -0x1.82dcbee92p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4271 2 OK 0x1.3fc8ae11556f4p2 -0x1.401afd90c532ep2 -0x1.028c87cd88p8 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4271 3 OK -0x1.40370fdc5274cp2 0x1.3fe97029083f4p2 -0x1.bc62e6c098p7 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4271 4 OK 0x1.3fc8ae11556f4p2 0x1.3fea483191d4bp2 -0x1.1f4faf18ccp8 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4272 0 OK -0x1.f594e709b174ap-13 -0x1.c3b8b1e103272p-10 -0x1.1921df9b68p8 0x1.165c434783ec3p-34 -0x1.66b910f03bc1cp-31 0x1.4cce8p-13 T +REG epsg:4272 1 OK -0x1.4004df7dd05d6p2 -0x1.401f0be505713p2 -0x1.0816c4653cp8 -0x1.3ffffffff793bp2 -0x1.40000000989f5p2 0x1.635ep-13 F +REG epsg:4272 2 OK 0x1.3ffcaa578ef0fp2 -0x1.401f6913d6967p2 -0x1.07365680dcp8 0x1.400000001347ap2 -0x1.40000000918b1p2 0x1.677b8p-13 F +REG epsg:4272 3 OK -0x1.40047ee9d5adfp2 0x1.3fe72d0452d77p2 -0x1.28c3f113d8p8 -0x1.3ffffffff3b69p2 0x1.3fffffff32247p2 0x1.2e38p-13 F +REG epsg:4272 4 OK 0x1.3ffd0763e9188p2 0x1.3fe6ca066e2f2p2 -0x1.27e444b1ccp8 0x1.400000001c8aep2 0x1.3fffffff382a7p2 0x1.3449p-13 F +REG epsg:4273 0 OK 0x1.0644f826f2b33p-10 -0x1.18517d6a8bd47p-8 0x1.4718f37084p8 -0x1.252ef87622b93p-31 0x1.2f9c00b93bf51p-24 0x1.ad3bccp-8 T +REG epsg:4273 1 OK -0x1.3ff64c4f525e8p2 -0x1.4044704c307bbp2 0x1.7a20e3720cp8 -0x1.40000008fd956p2 -0x1.3fffffb7cccf2p2 0x1.5b9988p-8 F +REG epsg:4273 2 OK 0x1.4010dd9c23ea1p2 -0x1.404af2c420164p2 0x1.6a00db3878p8 0x1.40000007c7a73p2 -0x1.3fffffb7bc1b7p2 0x1.5a29d8p-8 F +REG epsg:4273 3 OK -0x1.3ff015b0b5262p2 0x1.3fbf1fb0d42f8p2 0x1.2771b4aaf8p8 -0x1.40000007c3fcbp2 0x1.4000004ca5953p2 0x1.0613ap-7 F +REG epsg:4273 4 OK 0x1.401715fe66a73p2 0x1.3fb90868deaa8p2 0x1.174500f14p8 0x1.40000006b86c7p2 0x1.4000004cbf2bp2 0x1.0574d8p-7 F +REG epsg:4274 0 OK -0x1.037b6f5950c74p-10 -0x1.5b8a4e67e8921p-12 -0x1.bc30ea3f4p4 -0x1.c4230b024a82bp-62 0x0.0p0 0x1.0p-29 T +REG epsg:4274 1 OK -0x1.400d57c4de344p2 -0x1.4004c1a7e6928p2 -0x1.00133db9cp4 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4274 2 OK 0x1.3fece88c6cf06p2 -0x1.400501273e857p2 -0x1.191c545d8p5 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4274 3 OK -0x1.400d57c4de344p2 0x1.3ff9f02125f94p2 -0x1.6649ae334p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4274 4 OK 0x1.3fece88c6cf06p2 0x1.3ffa2f9e5e12fp2 -0x1.4c3796b78p5 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4275 0 OK 0x1.1a93ff16c42c8p-11 -0x1.7b5a09708feafp-9 0x1.be7787c1cp5 0x1.2d6cb2018701ep-64 0x0.0p0 0x1.0p-30 T +REG epsg:4275 1 OK -0x1.3ff501a9bb20ep2 -0x1.40361a9a5c70ap2 0x1.3f71ec08cp6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4275 2 OK 0x1.4006aacc7aa4dp2 -0x1.4035f8013747dp2 0x1.691e8802bp6 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4275 3 OK -0x1.3ff501a9bb20ep2 0x1.3fd7a25b58e73p2 0x1.813b07478p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4275 4 OK 0x1.4006aacc7aa4dp2 0x1.3fd77fcc4dd32p2 0x1.13f6ebb04p5 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4276 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4276 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4276 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4276 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4276 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4277 0 OK 0x1.d2dfa497ddb76p-11 -0x1.3cc2a1d893c2bp-8 0x1.01db0bf91p8 -0x1.b6797aa1e9a15p-35 -0x1.788e9547feacp-33 0x1.e42p-14 T +REG epsg:4277 1 OK -0x1.3ff735d02f072p2 -0x1.4052b09aba116p2 0x1.2906b2779cp8 -0x1.40000000053cfp2 -0x1.4000000011197p2 0x1.f06bp-14 F +REG epsg:4277 2 OK 0x1.40144548b0423p2 -0x1.40528712607c3p2 0x1.3ec2ff7bf4p8 0x1.3ffffffff7948p2 -0x1.400000001ed21p2 0x1.ec5p-14 F +REG epsg:4277 3 OK -0x1.3ff71be93364cp2 0x1.3fb50b42cb387p2 0x1.951562e8p7 -0x1.400000001346cp2 0x1.3fffffffc20c5p2 0x1.d8f8p-14 F +REG epsg:4277 4 OK 0x1.401467e7e396cp2 0x1.3fb4a488423b5p2 0x1.c08dac8a6p7 0x1.3fffffffeaf57p2 0x1.3fffffffb528dp2 0x1.ccfbp-14 F +REG epsg:4278 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4278 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4278 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4278 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4278 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4279 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4279 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4279 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4279 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4279 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4280 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4280 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4280 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4280 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4280 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4281 0 OK 0x1.3ecf2e211f39ep-9 -0x1.1b1305fdf426fp-8 0x1.a64eb6f94p6 -0x1.991ea6a5a6a47p-25 -0x1.1364b649640acp-23 0x1.873c44p-6 T +REG epsg:4281 1 OK -0x1.3fd19933af28bp2 -0x1.404f0056e62c2p2 0x1.205541c978p7 -0x1.400000305e86fp2 -0x1.400000761969p2 0x1.bbbbcdp-6 F +REG epsg:4281 2 OK 0x1.40279b2c8aacap2 -0x1.4048d3366eeaap2 0x1.feba9eb82p6 0x1.3fffffd8b97f2p2 -0x1.40000084b5669p2 0x1.a1aa7fp-6 F +REG epsg:4281 3 OK -0x1.3fd79932fe718p2 0x1.3fbba00b54f2bp2 0x1.523580e2bp6 -0x1.4000003f85c09p2 0x1.3fffff74fa6a4p2 0x1.6f7f1fp-6 F +REG epsg:4281 4 OK 0x1.4020ff2e78fcep2 0x1.3fc23a69fb98fp2 0x1.107962b5bp6 0x1.3fffffcdb6fe4p2 0x1.3fffff6979381p2 0x1.4daf89p-6 F +REG epsg:4282 0 OK -0x1.e062612b352dbp-12 0x1.58f95b2a1a52p-9 0x1.1e74817bap5 -0x1.2d6cb2018701ep-63 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4282 1 OK -0x1.400599a4a91edp2 -0x1.3fdc0c16245bfp2 0x1.0646d3fccp4 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4282 2 OK 0x1.3ff696aa76acfp2 -0x1.3fdc297696ae7p2 0x1.e2548e0cp2 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4282 3 OK -0x1.400599a4a91edp2 0x1.4031f4aba63a6p2 0x1.0c7c2b38cp6 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4282 4 OK 0x1.3ff696aa76acfp2 0x1.40321213e7877p2 0x1.d21fa3624p5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4283 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4283 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4283 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4283 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4283 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4284 0 OK 0x1.10f6ea5b56e1fp-10 0x1.b2e78a5068134p-11 -0x1.064e127abp7 0x1.10fdc32ee037bp-46 -0x1.d53b8c4d99189p-48 0x1.f3d2p-14 T +REG epsg:4284 1 OK -0x1.3fef3c7428d1fp2 -0x1.3ff2dbf8a70dap2 -0x1.2ca0dc0848p7 -0x1.3ffffffff2dc5p2 -0x1.3fffffffe111cp2 0x1.ed4fp-14 F +REG epsg:4284 2 OK 0x1.40115b0bc1e24p2 -0x1.3ff28a947f2dfp2 -0x1.f72190a09p6 0x1.400000000543ap2 -0x1.3ffffffff36ep2 0x1.f2c2p-14 F +REG epsg:4284 3 OK -0x1.3fef42a1305e9p2 0x1.400def6d51b5cp2 -0x1.1066492af8p7 -0x1.4000000005418p2 0x1.3ffffffff36d4p2 0x1.f2cp-14 F +REG epsg:4284 4 OK 0x1.40116139700b8p2 0x1.400d9e0255e6cp2 -0x1.beac79935p6 0x1.3ffffffff2de9p2 0x1.3fffffffe110bp2 0x1.ed5p-14 F +REG epsg:4285 0 OK 0x1.4c869f5a7f8cbp-9 -0x1.9fed9006eae17p-13 -0x1.eb55b7effp6 0x0.0p0 -0x1.2f74bf1dcfcaep-65 0x0.0p0 T +REG epsg:4285 1 OK -0x1.3fd4c8f3b2052p2 -0x1.40043fb9e59fep2 -0x1.2372f7005p7 -0x1.4000000000001p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4285 2 OK 0x1.4027ea11d9dep2 -0x1.40039cfb5ed4ep2 -0x1.82bc3cd34p6 0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4285 3 OK -0x1.3fd4c8f3b2052p2 0x1.3ffdc6773e82fp2 -0x1.2b182fabep7 -0x1.4000000000001p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4285 4 OK 0x1.4027ea11d9dep2 0x1.3ffd23bbf9d02p2 -0x1.9206a668dp6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4286 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4286 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4286 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4286 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4286 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4287 0 OK -0x1.44fb538a9d45p-10 0x1.c018a68fa42acp-10 -0x1.9efee5648p8 0x0.0p0 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4287 1 OK -0x1.40166c2cdf5ecp2 -0x1.3fe86674c15f5p2 -0x1.a18ca56d3p8 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4287 2 OK 0x1.3fedcd06a55a7p2 -0x1.3fe8b5f59e572p2 -0x1.b98375cce8p8 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4287 3 OK -0x1.40166c2cdf5ecp2 0x1.402031d766c0bp2 -0x1.809a51666p8 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:4287 4 OK 0x1.3fedcd06a55a7p2 0x1.40208165fcbf1p2 -0x1.9891199b5p8 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4288 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4288 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4288 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4288 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4288 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4289 0 OK 0x1.26c076a0767d9p-14 -0x1.0d94b13a1f2efp-8 0x1.2931fd70dp7 0x1.a653b687cb5cdp-33 -0x1.1b939ecc778b3p-30 0x1.1c9ap-11 T +REG epsg:4289 1 OK -0x1.4005f46d05635p2 -0x1.4048cecf1c5ccp2 0x1.8aa0133938p7 -0x1.3fffffffe046ap2 -0x1.40000000c0188p2 0x1.23ccep-11 F +REG epsg:4289 2 OK 0x1.4008941c05801p2 -0x1.404898793d163p2 0x1.7940e9bccp7 0x1.400000001e34fp2 -0x1.4000000094869p2 0x1.261c2p-11 F +REG epsg:4289 3 OK -0x1.40064cb2d5737p2 0x1.3fc2373e7c776p2 0x1.d098cda98p6 -0x1.3fffffffba7f5p2 0x1.3ffffffe69b7dp2 0x1.0d9fp-11 F +REG epsg:4289 4 OK 0x1.400848380e4d5p2 0x1.3fc2a739b1424p2 0x1.addcf8a0ap6 0x1.400000004c853p2 0x1.3ffffffe9215p2 0x1.130a8p-11 F +REG epsg:4291 0 OK -0x1.2d6c01780e29bp-17 0x1.84ccb60527904p-12 0x1.100045986p5 0x1.2d6cb2018701fp-69 -0x1.2f74bf1dcfcaep-64 -0x1.0p-30 T +REG epsg:4291 1 OK -0x1.3fff69c9c6e24p2 -0x1.3ff93c1487a75p2 0x1.e162ff17p4 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4291 2 OK 0x1.3fff1e6f43be6p2 -0x1.3ff93ca8079b5p2 0x1.de9bbd4a4p4 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4291 3 OK -0x1.3fff69c9c6e24p2 0x1.40055667cac23p2 0x1.29ddf533p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4291 4 OK 0x1.3fff1e6f43be6p2 0x1.400556fb503bbp2 0x1.287a5467p5 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4292 0 OK -0x1.8b9906a056caep-13 -0x1.5560f486505b6p-11 0x1.a000744f6p6 -0x1.2d6cb2018701cp-64 -0x1.2f74bf1dcfcacp-63 0x1.8p-29 T +REG epsg:4292 1 OK -0x1.3ffe850bfe789p2 -0x1.4008611e3750ap2 0x1.b86026307p6 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4292 2 OK 0x1.3ff856b204697p2 -0x1.40086d3813b6bp2 0x1.a9ca3ac16p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4292 3 OK -0x1.3ffe850bfe789p2 0x1.3ff3204232c19p2 0x1.862cdd176p6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4292 4 OK 0x1.3ff856b204697p2 0x1.3ff32c5b438dp2 0x1.7796efc39p6 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4293 0 OK -0x1.c8e409a929093p-11 0x1.298d49339e97ep-9 0x1.29202ca5ap5 0x1.2d6cb2018701fp-63 0x0.0p0 -0x1.0p-30 T +REG epsg:4293 1 OK -0x1.401635c156a86p2 -0x1.3fe11169187c4p2 0x1.bdd30651p4 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4293 2 OK 0x1.3ff9a7b1b4ad7p2 -0x1.3fe1494b26084p2 0x1.609750e3p3 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4293 3 OK -0x1.401635c156a86p2 0x1.402b2ac6650dp2 0x1.1e7a5422bp6 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4293 4 OK 0x1.3ff9a7b1b4ad7p2 0x1.402b62b5424fdp2 0x1.b6313654ep5 0x1.3fffffffffffdp2 0x1.4p2 0x0.0p0 F +REG epsg:4294 0 OK -0x1.92a8b258d5cb6p-8 -0x1.84c52af6ff60cp-12 0x1.1db86f861ep10 0x0.0p0 0x0.0p0 0x1.0p-30 T +REG epsg:4294 1 OK -0x1.405f78f4da58p2 -0x1.3ffe645c73a53p2 0x1.2c918b491bp10 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4294 2 OK 0x1.3f9625e4c1816p2 -0x1.3fffee707244cp2 0x1.0ee066b331p10 0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4294 3 OK -0x1.405f78f4da58p2 0x1.3ff24a4b9cf81p2 0x1.2ac83182b5p10 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4294 4 OK 0x1.3f9625e4c1816p2 0x1.3ff3d450dba82p2 0x1.0d170abaf8p10 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4295 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4295 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4295 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4295 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4295 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4296 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4296 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4296 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4296 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4296 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4297 0 OK 0x1.1cee96ed13852p-9 0x1.af79e1094443ap-11 -0x1.eff5426cp5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4297 1 OK -0x1.3fd9f363c2122p2 -0x1.3ff2c0aba5092p2 -0x1.6eb909226p6 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4297 2 OK 0x1.40212e93dae78p2 -0x1.3ff23540134a9p2 -0x1.8d45b2a8ap5 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4297 3 OK -0x1.3fd9f363c2122p2 0x1.400d9d83a7523p2 -0x1.2f45f5349p6 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4297 4 OK 0x1.40212e93dae78p2 0x1.400d120c7fe2bp2 -0x1.0e5fc1f54p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4298 0 OK -0x1.89cfcaf3d00c1p-8 0x1.c71be62d96f2dp-12 0x1.7b5eac415bp10 -0x1.2d6cb2018701ep-60 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:4298 1 OK -0x1.4059b52223185p2 -0x1.3feab889a3effp2 0x1.8734fcecdbp10 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4298 2 OK 0x1.3f94ce7a385c1p2 -0x1.3fec39d59f8bdp2 0x1.6a2ad846ffp10 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4298 3 OK -0x1.4059b52223185p2 0x1.3ff8e3418ba65p2 0x1.894c615c5ap10 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4298 4 OK 0x1.3f94ce7a385c1p2 0x1.3ffa649e6a103p2 0x1.6c423f39a9p10 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4299 0 OK 0x1.61840f7ad695fp-10 -0x1.528b6d28b0ce2p-8 0x1.06547f6a9cp8 -0x1.4a1834a163963p-32 -0x1.ea1b90eddae66p-31 0x1.172cp-14 T +REG epsg:4299 1 OK -0x1.3fefb7573db0dp2 -0x1.40590ebedc4c1p2 0x1.2f457b6aa4p8 -0x1.400000006c85ep2 -0x1.4000000100965p2 0x1.7d84p-14 F +REG epsg:4299 2 OK 0x1.401cb9cf50623p2 -0x1.4057ee5e9df81p2 0x1.45f27f5d7p8 0x1.3fffffffd2a37p2 -0x1.400000010bbb5p2 0x1.4fcp-14 F +REG epsg:4299 3 OK -0x1.3ff085c815863p2 0x1.3faf9c26fa727p2 0x1.99b1d7cee8p7 -0x1.4000000078dd7p2 0x1.3fffffff28669p2 0x1.e3p-15 F +REG epsg:4299 4 OK 0x1.401be3d0d60c9p2 0x1.3fb025fecc3afp2 0x1.c70f628b68p7 0x1.3fffffffcdabbp2 0x1.3fffffff22445p2 0x1.7d3ap-15 F +REG epsg:4300 0 OK 0x1.618678c866761p-10 -0x1.5291f35cb61f6p-8 0x1.065c2dbcacp8 -0x1.4a183489d7185p-32 -0x1.ea1b91859546p-31 0x1.172cp-14 T +REG epsg:4300 1 OK -0x1.3fefb7175748p2 -0x1.40591045c93bep2 0x1.2f4df9a53p8 -0x1.400000006c85cp2 -0x1.4000000100964p2 0x1.7d84p-14 F +REG epsg:4300 2 OK 0x1.401cb9dc931ddp2 -0x1.4057efe4f36d7p2 0x1.45fb2b1c04p8 0x1.3fffffffd2a38p2 -0x1.400000010bbb4p2 0x1.4fbfp-14 F +REG epsg:4300 3 OK -0x1.3ff085882f0e5p2 0x1.3faf9a6e0a98bp2 0x1.99befdd86p7 -0x1.4000000078dd5p2 0x1.3fffffff28668p2 0x1.e2fcp-15 F +REG epsg:4300 4 OK 0x1.401be3de18d92p2 0x1.3fb0244545d57p2 0x1.c71ce39e4p7 0x1.3fffffffcdabap2 0x1.3fffffff22444p2 0x1.7d3cp-15 F +REG epsg:4301 0 OK -0x1.2aac2b2624a92p-8 -0x1.934f6ee39854bp-8 0x1.bb28699d28p9 -0x1.2d6cb2018701ep-60 0x0.0p0 0x0.0p0 T +REG epsg:4301 1 OK -0x1.4048c7cf61b6dp2 -0x1.4060466666a5ap2 0x1.ee0706972p9 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4301 2 OK 0x1.3fb372b0ec57cp2 -0x1.40616b1081fb4p2 0x1.c1fad2e73cp9 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4301 3 OK -0x1.4048c7cf61b6dp2 0x1.3f97675c972d4p2 0x1.b2b869391ep9 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4301 4 OK 0x1.3fb372b0ec57cp2 0x1.3f988b5117ddap2 0x1.86abff7ee8p9 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4302 0 OK -0x1.4ef6d9777ad94p-9 -0x1.17cd60074790dp-8 -0x1.7bad56d4dp6 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4302 1 OK -0x1.40291327af3adp2 -0x1.404c06a1e0014p2 -0x1.b56fa2298p4 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4302 2 OK 0x1.3fd555fc73028p2 -0x1.404caab9ae871p2 -0x1.32f580595p6 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4302 3 OK -0x1.40291327af3adp2 0x1.3fc0ab28c1575p2 -0x1.b68552e9fp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4302 4 OK 0x1.3fd555fc73028p2 0x1.3fc14ef9e76e9p2 -0x1.3e0fc9771p7 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4303 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4303 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4303 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4303 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4303 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4304 0 OK 0x1.22d30598a3133p-9 -0x1.0d1b4d9169a49p-9 -0x1.398779c9cp5 0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4304 1 OK -0x1.3fdab532a9a72p2 -0x1.4029cf48e87ccp2 -0x1.36112b33p5 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4304 2 OK 0x1.4023697b5445p2 -0x1.402940df68ae1p2 0x1.0873aaa8p2 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4304 3 OK -0x1.3fdab532a9a72p2 0x1.3fe6cb49cb738p2 -0x1.3953094ddp6 -0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4304 4 OK 0x1.4023697b5445p2 0x1.3fe63cfdcc024p2 -0x1.1b85e59d2p5 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4306 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4306 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4306 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4306 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4306 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4307 0 OK 0x1.4909c0f3e757ap-11 -0x1.6026a52226171p-9 0x1.aa0a74fe5p6 -0x1.77f2521df9e87p-36 -0x1.4aa60045f7a13p-38 0x1.e8cp-10 T +REG epsg:4307 1 OK -0x1.3ff2e76cb109p2 -0x1.403236991ccf3p2 0x1.0e4a967c1p7 -0x1.3ffffffe402d7p2 -0x1.3fffffffb607cp2 0x1.e3fcp-10 F +REG epsg:4307 2 OK 0x1.400776ee9c487p2 -0x1.403204e757df5p2 0x1.2cc9db0e68p7 0x1.3ffffffeb6078p2 -0x1.400000003763p2 0x1.e62a1p-10 F +REG epsg:4307 3 OK -0x1.3ff323e000a57p2 0x1.3fda852b387d1p2 0x1.02f289bcfp6 -0x1.3ffffffec19cdp2 0x1.4000000034aa2p2 0x1.e6566p-10 F +REG epsg:4307 4 OK 0x1.4007b540e9bb7p2 0x1.3fda51a595dcbp2 0x1.3ff13528ep6 0x1.3ffffffe349fdp2 0x1.3fffffffb3aa7p2 0x1.e3ba6p-10 F +REG epsg:4308 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4308 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4308 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4308 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4308 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4309 0 OK -0x1.92acb47b88cf8p-10 -0x1.5edf5f6bf0de1p-12 -0x1.7ffd8ac88p6 0x0.0p0 0x1.2f74bf1dcfcaep-64 0x0.0p0 T +REG epsg:4309 1 OK -0x1.40172bb2f6ab5p2 -0x1.40059e1f51277p2 -0x1.39a5d283dp6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4309 2 OK 0x1.3fe4d66fa91ebp2 -0x1.400600a98d9a1p2 -0x1.b06b8eb54p6 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4309 3 OK -0x1.40172bb2f6ab5p2 0x1.3ffab20b3e16cp2 -0x1.537226029p6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4309 4 OK 0x1.3fe4d66fa91ebp2 0x1.3ffb149226783p2 -0x1.ca37ea207p6 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4310 0 OK -0x1.bf6cce4c7f4fbp-10 -0x1.a609b83b01786p-11 -0x1.48c9430c8p6 -0x1.2d6cb2018701ep-62 0x0.0p0 0x0.0p0 T +REG epsg:4310 1 OK -0x1.401b93b5f6e0dp2 -0x1.40158033d9b0cp2 -0x1.bc31275b8p5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4310 2 OK 0x1.3fe3a6793d173p2 -0x1.4015edb9bfd66p2 -0x1.621156c9ap6 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4310 3 OK -0x1.401b93b5f6e0dp2 0x1.3ffb39d671ee6p2 -0x1.1c283f024p6 -0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4310 4 OK 0x1.3fe3a6793d173p2 0x1.3ffba753724b6p2 -0x1.a021174cbp6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4311 0 OK -0x1.1a92e5752b71ap-10 0x1.a85bd76eab109p-9 0x1.c05c1b61p3 -0x1.2d6cb2018701ep-63 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4311 1 OK -0x1.400e3f92489a3p2 -0x1.3fc9f5b817c2fp2 -0x1.02f8cb228p3 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4311 2 OK 0x1.3feaed6fb857ep2 -0x1.3fca3ad1550f8p2 -0x1.cee0d4eap4 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4311 3 OK -0x1.400e3f92489a3p2 0x1.4033a3392953fp2 0x1.b27a531d2p5 -0x1.4p2 0x1.4000000000001p2 0x0.0p0 F +REG epsg:4311 4 OK 0x1.3feaed6fb857ep2 0x1.4033e868ffd2ap2 0x1.0bc88708ep5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4312 0 OK -0x1.2b00a855e606p-9 -0x1.efed3dbd66e2dp-9 0x1.262b6b559p7 -0x1.5e597921955abp-27 -0x1.3ce44ab9a212dp-25 0x1.29017cp-8 T +REG epsg:4312 1 OK -0x1.402ec85e6bc9ap2 -0x1.404151fb2ee33p2 0x1.8e640b3aa8p7 -0x1.4000000c8c0a5p2 -0x1.40000025760f2p2 0x1.646c4cp-8 F +REG epsg:4312 2 OK 0x1.3fdffc0634023p2 -0x1.4045a039c9ea3p2 0x1.6f1e58d678p7 0x1.3ffffff8f00d1p2 -0x1.40000027bea3ep2 0x1.4d1904p-8 F +REG epsg:4312 3 OK -0x1.402ad608de659p2 0x1.3fc9ec1aa2d07p2 0x1.d99109aa2p6 -0x1.4000000f190fbp2 0x1.3fffffd9b097dp2 0x1.0a8d8cp-8 F +REG epsg:4312 4 OK 0x1.3fe4226819216p2 0x1.3fc605c0b51c9p2 0x1.9ae48a451p6 0x1.3ffffff794333p2 0x1.3fffffd8122d5p2 0x1.dd32ap-9 F +REG epsg:4313 0 OK -0x1.014c27168e221p-10 0x1.a8cea8d8914p-11 -0x1.0fffda0018p7 0x1.c782612b798e3p-33 -0x1.ce301eb8c551p-31 0x1.1b28ap-11 T +REG epsg:4313 1 OK -0x1.400eda6c84819p2 -0x1.3ff38cecf0fc1p2 -0x1.193947eabp7 -0x1.3fffffffde187p2 -0x1.400000009453p2 0x1.2077cp-11 F +REG epsg:4313 2 OK 0x1.3fee6d1a35d7fp2 -0x1.3ff3efdec69cp2 -0x1.2b625b97b8p7 0x1.4000000018482p2 -0x1.400000005cbc9p2 0x1.22a32p-11 F +REG epsg:4313 3 OK -0x1.400e8e74e74f2p2 0x1.400e444b5d50cp2 -0x1.ea2fe73b2p6 -0x1.3fffffffab9ccp2 0x1.3ffffffe9907fp2 0x1.0daap-11 F +REG epsg:4313 4 OK 0x1.3feea8f079b36p2 0x1.400e1d9effa8bp2 -0x1.07421907p7 0x1.4000000051b84p2 0x1.3ffffffecd294p2 0x1.13d3ap-11 F +REG epsg:4314 0 OK 0x1.4c8796bbafe3cp-16 -0x1.ee1c60a7c4a65p-9 0x1.8c1f2fef5p6 -0x1.b2560de46c3eep-37 0x1.7196875c06cfbp-31 0x1.d9d38p-11 T +REG epsg:4314 1 OK -0x1.4007747c3c392p2 -0x1.40435a52ed1b2p2 0x1.23d7748568p7 -0x1.400000000989ap2 -0x1.3ffffffe8c806p2 0x1.cfd2ap-11 F +REG epsg:4314 2 OK 0x1.4007f22479676p2 -0x1.4043ae21fb105p2 0x1.0a3ebd3d38p7 0x1.3ffffffffbc6p2 -0x1.3ffffffe85899p2 0x1.cf5p-11 F +REG epsg:4314 3 OK -0x1.40074c86ddbdep2 0x1.3fc877539d2edp2 0x1.2415c0293p6 -0x1.3fffffffffad4p2 0x1.3ffffffff005ap2 0x1.dd004p-11 F +REG epsg:4314 4 OK 0x1.40081bb09234p2 0x1.3fc8787967c4p2 0x1.e1c5c097ap5 0x1.400000000012dp2 0x1.3ffffffff7314p2 0x1.dd038p-11 F +REG epsg:4315 0 OK -0x1.30f4b002f83bbp-9 0x1.556ca240c24dfp-14 -0x1.64c76899dp6 0x0.0p0 0x1.2f74bf1dcfcadp-66 0x1.0p-29 T +REG epsg:4315 1 OK -0x1.4025d27d02f04p2 -0x1.40070c178ba91p2 -0x1.0414caf13p6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4315 2 OK 0x1.3fd995cfe8921p2 -0x1.4007a15d13b57p2 -0x1.b7fadec7p6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4315 3 OK -0x1.4025d27d02f04p2 0x1.4009b4494965cp2 -0x1.fb9c5938ap5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4315 4 OK 0x1.3fd995cfe8921p2 0x1.400a49900b6eep2 -0x1.b1b43d869p6 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4316 0 OK 0x1.d8de134fb6287p-11 0x1.6c26dc40f2e5fp-9 -0x1.623de41d28p8 0x0.0p0 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:4316 1 OK -0x1.3ff28d808f94ep2 -0x1.3fd67119df4f5p2 -0x1.8441f2f66p8 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4316 2 OK 0x1.40101b3047c36p2 -0x1.3fd63745f8acap2 -0x1.72d2af4014p8 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4316 3 OK -0x1.3ff28d808f94ep2 0x1.4031205edd9d3p2 -0x1.4eb559c5c4p8 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4316 4 OK 0x1.40101b3047c36p2 0x1.4030e67abcf45p2 -0x1.3d461fb7c8p8 0x1.3fffffffffffep2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4317 0 OK 0x1.1cf1123f5f7f3p-10 0x1.6d18cb52d19c4p-11 -0x1.0fff2c3ad8p7 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4317 1 OK -0x1.3fee8d56c4264p2 -0x1.3ff50fdef415ap2 -0x1.320bc1cf4p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4317 2 OK 0x1.40122b3d9e37fp2 -0x1.3ff4ca27f2826p2 -0x1.0805d8ca78p7 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4317 3 OK -0x1.3fee8d56c4264p2 0x1.400bcac1d1bbfp2 -0x1.1733aa5358p7 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4317 4 OK 0x1.40122b3d9e37fp2 0x1.400b8505e9637p2 -0x1.da5b8e487p6 0x1.3ffffffffffffp2 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:4318 0 OK 0x1.ad87a2bc442e4p-15 -0x1.a8d697199d6f1p-16 0x1.9999b428p1 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4318 1 OK -0x1.3fff1eb13b2ccp2 -0x1.400060e6c693ep2 0x1.7660f9e2p1 -0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4318 2 OK 0x1.4000cc3612491p2 -0x1.40005d9df0b2bp2 0x1.f5128c6ep1 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4318 3 OK -0x1.3fff1eb13b2ccp2 0x1.3fff8d4e89a2fp2 0x1.37e7d59ap1 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4318 4 OK 0x1.4000cc3612491p2 0x1.3fff8a05b5e81p2 0x1.b69968c8p1 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4319 0 OK -0x1.a9c2c6d6c208fp-14 -0x1.6c2563ca387fep-16 0x1.4cccd7c58p4 0x0.0p0 -0x1.2f74bf1dcfcaep-68 0x0.0p0 T +REG epsg:4319 1 OK -0x1.4001652fcd0f1p2 -0x1.400012ee3e82dp2 0x1.5d5113f48p4 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4319 2 OK 0x1.3ffe11afc8e39p2 -0x1.40001971260d2p2 0x1.3debd5438p4 0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4319 3 OK -0x1.4001652fcd0f1p2 0x1.3fff5d9076ad3p2 0x1.569f883c8p4 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4319 4 OK 0x1.3ffe11afc8e39p2 0x1.3fff64135a909p2 0x1.373a49688p4 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4322 0 OK -0x1.42ba77d6fd961p-13 -0x1.556355976cdaap-15 0x1.1d018f6p-1 0x0.0p0 0x0.0p0 0x1.81fap-15 T +REG epsg:4322 1 OK -0x1.40028574efadfp2 -0x1.4000a8b65d726p2 0x1.e508ad4p-1 -0x1.4p2 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:4322 2 OK 0x1.3ffd7a8b1051ep2 -0x1.4000a8b65d725p2 0x1.e508ad48p-1 0x1.3fffffffffffep2 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:4322 3 OK -0x1.40028574efadfp2 0x1.3fff54a63cabap2 0x1.4dae6f6p-3 -0x1.4000000000001p2 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:4322 4 OK 0x1.3ffd7a8b1051ep2 0x1.3fff54a63cab9p2 0x1.4dae6f8p-3 0x1.3fffffffffffep2 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:4324 0 OK -0x1.da307a7ab615ap-13 -0x1.20488116c1195p-16 0x1.1b1e9aaep2 0x0.0p0 -0x1.2f74bf1dbb5b8p-69 0x1.a0a3p-14 T +REG epsg:4324 1 OK -0x1.4003b460f4f55p2 -0x1.40004662f8c4fp2 0x1.259d2fefp2 -0x1.3ffffffffffffp2 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:4324 2 OK 0x1.3ffc4b9f0b0a9p2 -0x1.40004662f8c5p2 0x1.259d2fedp2 0x1.4p2 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG epsg:4324 3 OK -0x1.4003b460f4f55p2 0x1.3fffb6cdf0a82p2 0x1.106af05p2 -0x1.3fffffffffffep2 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG epsg:4324 4 OK 0x1.3ffc4b9f0b0a9p2 0x1.3fffb6cdf0a82p2 0x1.106af04ep2 0x1.4p2 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG epsg:4326 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4326 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4326 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4326 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4326 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4328 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4328 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4328 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4328 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4328 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4330 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4330 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4330 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4330 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4330 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4331 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4331 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4331 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4331 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4331 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4332 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4332 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4332 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4332 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4332 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4333 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4333 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4333 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4333 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4333 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4334 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4334 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4334 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4334 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4334 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4335 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4335 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4335 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4335 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4335 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4336 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4336 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4336 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4336 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4336 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4337 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4337 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4337 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4337 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4337 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4338 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4338 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4338 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4338 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4338 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4340 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4340 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4340 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4340 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4340 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4342 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4342 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4342 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4342 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4342 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4344 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4344 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4344 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4344 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4344 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4346 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4346 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4346 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4346 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4346 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4348 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4348 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4348 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4348 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4348 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4350 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4350 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4350 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4350 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4350 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4352 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4352 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4352 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4352 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4352 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4354 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4354 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4354 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4354 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4354 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4356 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4356 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4356 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4356 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4356 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4358 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4358 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4358 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4358 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4358 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4360 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4360 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4360 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4360 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4360 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4362 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4362 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4362 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4362 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4362 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4364 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4364 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4364 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4364 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4364 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4366 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4366 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4366 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4366 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4366 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4368 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4368 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4368 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4368 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4368 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4370 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4370 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4370 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4370 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4370 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4372 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4372 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4372 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4372 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4372 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4374 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4374 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4374 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4374 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4374 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4376 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4376 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4376 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4376 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4376 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4378 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4378 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4378 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4378 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4378 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4380 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4380 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4380 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4380 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4380 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4382 0 OK 0x1.854e5p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4382 1 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4382 2 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4382 3 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4382 4 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4384 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4384 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4384 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4384 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4384 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4385 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4385 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4385 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4385 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4385 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4387 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4387 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4387 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4387 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4387 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4389 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4389 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4389 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4389 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4389 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4390 0 OK 0x1.79bff56d7177ep7 0x1.7148fb0d88f4ap3 0x1.9a9ffff2p1 0x1.9e4043b874df5p6 0x1.05735ee402bafp1 0x0.0p0 F +REG epsg:4390 1 OK -0x1.0f7f01787b13bp19 -0x1.0e910f855fb6ep19 -0x1.2a7444148p3 0x1.8a3d02597ee14p6 -0x1.7a8ca03070346p1 0x1.1ep-22 F +REG epsg:4390 2 OK 0x1.0fae0b836654cp19 -0x1.0e910f855064p19 0x1.793e15784p4 0x1.b243851770dadp6 -0x1.7a8ca02f7a4c4p1 -0x1.bfp-22 F +REG epsg:4390 3 OK -0x1.0dd03a02e4377p19 0x1.0f6e2e335c7bbp19 -0x1.ce516ae5p2 0x1.8a3d0239e46a7p6 0x1.c2b9ae70004f7p2 0x1.71p-20 F +REG epsg:4390 4 OK 0x1.0dff44a077fecp19 0x1.0f6e2e333bfb8p19 0x1.979d67a94p4 0x1.b243853726e52p6 0x1.c2b9ae6eed765p2 -0x1.41p-19 F +REG epsg:4391 0 OK -0x1.32c1718b9dd28p6 -0x1.d1ab95abd009p9 -0x1.a206f87cp0 0x1.97c3c131d5acfp6 0x1.5b2c19ab13866p1 0x1.0p-30 F +REG epsg:4391 1 OK -0x1.0fe717f336908p19 -0x1.0ee390ba79e32p19 -0x1.92991b488p3 0x1.83be0333a1bdfp6 -0x1.24d3e59cd8f21p1 0x1.24p-23 F +REG epsg:4391 2 OK 0x1.0fd3c38eb0ae8p19 -0x1.0ee390ba6f508p19 0x1.03f905b6p4 0x1.abc97f300cc17p6 -0x1.24d3e59c31271p1 -0x1.d8p-23 F +REG epsg:4391 3 OK -0x1.0daae1a8a92f6p19 0x1.0f1c9b52a210dp19 -0x1.2f48a857p3 0x1.83be0309acac9p6 0x1.ed960bbfe78d9p2 0x1.6d4p-20 F +REG epsg:4391 4 OK 0x1.0d978dee8172dp19 0x1.0f1c9b528382ap19 0x1.31d26fdbp4 0x1.abc97f5a21e05p6 0x1.ed960bbee38e9p2 -0x1.5a8p-19 F +REG epsg:4392 0 OK 0x1.590b957df2d8fp7 0x1.94defa13406b4p4 0x1.8f3afp-3 0x1.99bea5632b30dp6 0x1.db0123456789bp1 0x1.0p-30 F +REG epsg:4392 1 OK -0x1.1031ce8f916b8p19 -0x1.0e374d736fc7fp19 -0x1.839e317cp3 0x1.85b3e3584ce5bp6 -0x1.49fdb8a30f559p0 0x1.8p-25 T +REG epsg:4392 2 OK 0x1.105cc5d26d4fcp19 -0x1.0e374d7369678p19 0x1.204d90f7cp4 0x1.adc9676e0a883p6 -0x1.49fdb8a247f6p0 -0x1.3p-24 T +REG epsg:4392 3 OK -0x1.0d225f9d6a4c8p19 0x1.0fca7c735fcf1p19 -0x1.e3591367p2 0x1.85b3e31ef2038p6 0x1.16c0483909f1fp3 0x1.ecp-20 F +REG epsg:4392 4 OK 0x1.0d4d57d38d6bbp19 0x1.0fca7c733cf14p19 0x1.63d598fc8p4 0x1.adc967a793305p6 0x1.16c0483873efcp3 -0x1.c66p-19 F +REG epsg:4393 0 OK -0x1.5181bd1f1861cp14 0x1.b56443a60ccc5p15 -0x1.3fbec36ap1 0x1.9608713b4d0ccp6 0x1.d71586d973bc2p1 0x1.0p-29 F +REG epsg:4393 1 OK -0x1.1ad032a54926ap19 -0x1.e5cbaec8e974bp18 -0x1.b320c7148p3 0x1.81fddc8a031f1p6 -0x1.51d4f17604d4ap0 0x1.8p-25 T +REG epsg:4393 2 OK 0x1.05b7eff2bac16p19 -0x1.e5cbaec8dd6c9p18 0x1.c57ed39a8p3 0x1.aa1305ec97fd8p6 -0x1.51d4f17548c4bp0 -0x1.24p-24 T +REG epsg:4393 3 OK -0x1.17c73f8fdaf8fp19 0x1.2b1bf2b3e1354p19 -0x1.2216422a8p3 0x1.81fddc511f2d6p6 0x1.15c5611e6bf2ep3 0x1.b2p-20 F +REG epsg:4393 4 OK 0x1.02aefdbba6254p19 0x1.2b1bf2b3c1215p19 0x1.264ba48dcp4 0x1.aa130625a5c5cp6 0x1.15c5611de2167p3 -0x1.a7ep-19 F +REG epsg:4394 0 OK 0x1.66633e1745b81p7 0x1.1a6c79299fceep5 0x1.206ecedap1 0x1.9b94b17e4b17dp6 0x1.3c8d95c6edd76p2 -0x1.0p-29 F +REG epsg:4394 1 OK -0x1.10b45e031610ep19 -0x1.0df515c3db935p19 -0x1.7127538c8p3 0x1.87818e5ef041ap6 -0x1.b9351b6c39238p-5 0x1.0p-29 T +REG epsg:4394 2 OK 0x1.10e0fe6f6926p19 -0x1.0df515c3db4a4p19 0x1.3d1ec9774p4 0x1.afa7d49da5ee9p6 -0x1.b9351b6b21176p-5 0x1.cp-28 T +REG epsg:4394 3 OK -0x1.0c9f011e53289p19 0x1.100f6806b67e1p19 -0x1.4b1c508ep2 0x1.87818e129b12dp6 0x1.3e46ca3c642c8p3 0x1.4ecp-19 F +REG epsg:4394 4 OK 0x1.0ccba2dbaadb3p19 0x1.100f68068eda6p19 0x1.9b611c888p4 0x1.afa7d4ea3a7f3p6 0x1.3e46ca3bb761cp3 -0x1.3p-18 F +REG epsg:4395 0 OK 0x1.1c05102652031p7 0x1.3eef055fcae9bp5 -0x1.236fe98p2 0x1.91622b99824c4p6 0x1.5af6fd21ff2e6p2 -0x1.0p-30 F +REG epsg:4395 1 OK -0x1.10ebc9d4fdb2bp19 -0x1.0ddba559d8e4ep19 -0x1.edf771508p3 0x1.7d4b2a3bbd601p6 0x1.af6fd1086365cp-2 0x1.0p-29 T +REG epsg:4395 2 OK 0x1.110f278f238d9p19 -0x1.0ddba559daafdp19 0x1.2dcad408p3 0x1.a5792cf747504p6 0x1.af6fd10789cd1p-2 -0x1.6p-27 T +REG epsg:4395 3 OK -0x1.0c71671d90418p19 0x1.102a414dedf95p19 -0x1.09ff9f8p3 0x1.7d4b29e819a68p6 0x1.4d7b7de4c701dp3 0x1.01ap-19 F +REG epsg:4395 4 OK 0x1.0c94c5fc86093p19 0x1.102a414dcd8a7p19 0x1.0253cd27cp4 0x1.a5792d4b2219bp6 0x1.4d7b7de439408p3 -0x1.184p-18 F +REG epsg:4396 0 OK 0x1.248fa2a463948p7 0x1.6281d0a6a7753p5 -0x1.b63e3892p1 0x1.928ce58edc001p6 0x1.7dc4f8dad1425p2 0x1.0p-30 F +REG epsg:4396 1 OK -0x1.112568bde95a8p19 -0x1.0dbe8d82033b4p19 -0x1.e27941b7p3 0x1.7e7105c1664a2p6 0x1.ee27c594fd17ap-1 0x1.3p-26 T +REG epsg:4396 2 OK 0x1.1149d6ae82874p19 -0x1.0dbe8d8207841p19 0x1.51e55508p3 0x1.a6a8c55c52374p6 0x1.ee27c593fb70ep-1 -0x1.58p-25 T +REG epsg:4396 3 OK -0x1.0c3735a36a3ddp19 0x1.1048e6f8c22ecp19 -0x1.c9d7e8aap2 0x1.7e710565736ep6 0x1.5ee27bbbd2fd5p3 0x1.29ep-19 F +REG epsg:4396 4 OK 0x1.0c5ba4e00f5d9p19 0x1.1048e6f89fbaep19 0x1.204ad015cp4 0x1.a6a8c5b8837dap6 0x1.5ee27bbb3b8ffp3 -0x1.3dp-18 F +REG epsg:4397 0 OK 0x1.29cda4266aec5p7 0x1.04b86220e26e3p17 -0x1.dd819c56p1 0x1.93445e7b272f9p6 0x1.3700174d3b7b9p2 0x0.0p0 F +REG epsg:4397 1 OK -0x1.10aef4842fc23p19 -0x1.99a00c3dd7dbep18 -0x1.d9c7791p3 0x1.7f31e63c60fcdp6 -0x1.1ffd159ed11c5p-3 -0x1.0p-29 T +REG epsg:4397 2 OK 0x1.10d409af14462p19 -0x1.99a00c3dd69f2p18 0x1.67e24b078p3 0x1.a756d6b9ed651p6 -0x1.1ffd159e3964cp-3 0x0.0p0 T +REG epsg:4397 3 OK -0x1.0cac04e6b065ep19 0x1.5134617dbe5ffp19 -0x1.10b4d5a58p3 0x1.7f31e5f15b09cp6 0x1.3b800b0073109p3 0x1.f54p-20 F +REG epsg:4397 4 OK 0x1.0cd11b24aa694p19 0x1.5134617d9d914p19 0x1.1252c7d44p4 0x1.a756d70527168p6 0x1.3b800affe46d4p3 -0x1.03ap-18 F +REG epsg:4398 0 OK 0x1.5182aabf3e041p7 0x1.5a4b7c1e55a6bp5 0x1.773b7e78p-1 0x1.98b58bf258bf6p6 0x1.7936058d672c6p2 0x0.0p0 F +REG epsg:4398 1 OK -0x1.111af069405acp19 -0x1.0dc25eda556c8p19 -0x1.9aa1a852p3 0x1.849a564865b44p6 0x1.c9b02b41a138ap-1 0x1.1p-26 T +REG epsg:4398 2 OK 0x1.1144f734a2887p19 -0x1.0dc25eda59fd6p19 0x1.0bd6b8c18p4 0x1.acd0c19c4c4a6p6 0x1.c9b02b408e0b1p-1 -0x1.58p-25 T +REG epsg:4398 3 OK -0x1.0c3bec089f12dp19 0x1.1044c7397a7f2p19 -0x1.437d2b24p2 0x1.849a55ed8e0bep6 0x1.5c9b0215d6d7ap3 0x1.6d6p-19 F +REG epsg:4398 4 OK 0x1.0c65f44e7fbc2p19 0x1.1044c73952f3fp19 0x1.7fcfd8858p4 0x1.acd0c1f76b177p6 0x1.5c9b021528f2ap3 -0x1.5bcp-18 F +REG epsg:4399 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:4399 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 0x1.4c0000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4399 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 0x1.5ffffffff117cp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4399 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 0x1.4c0000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4399 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 0x1.5ffffffff117cp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4400 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:4400 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 0x1.580000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4400 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.640000000ee83p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4400 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 0x1.580000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4400 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.640000000ee83p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4401 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:4401 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 0x1.640000000ee83p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4401 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.580000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4401 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 0x1.640000000ee83p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4401 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.580000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4402 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:4402 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.5ffffffff117cp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4402 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.4c0000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4402 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.5ffffffff117cp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4402 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.4c0000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4403 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG epsg:4403 1 OK -0x1.6048d15af6efp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.53fffffff117dp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4403 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.400000000ee83p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4403 3 OK -0x1.6048d15af6efp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.53fffffff117dp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4403 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.400000000ee83p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4404 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:4404 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.47fffffff117dp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4404 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.340000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4404 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.47fffffff117dp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4404 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.340000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4405 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:4405 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.3bfffffff117cp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4405 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.280000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4405 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.3bfffffff117cp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4405 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.280000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4406 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:4406 1 OK -0x1.6048d15af6efp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.2ffffffff117dp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4406 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.1c0000000ee83p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4406 3 OK -0x1.6048d15af6efp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.2ffffffff117dp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4406 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.1c0000000ee83p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4407 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:4407 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.23fffffff117dp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4407 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.100000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4407 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.23fffffff117dp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4407 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.100000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4408 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4408 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.17fffffff117cp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4408 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.040000000ee84p7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4408 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.17fffffff117cp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4408 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.040000000ee84p7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4409 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4409 1 OK -0x1.6048d15af6efp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.0bfffffff117dp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4409 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.f00000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4409 3 OK -0x1.6048d15af6efp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.0bfffffff117dp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4409 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.f00000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4410 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4410 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.ffffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4410 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.d80000001dd08p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4410 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.ffffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4410 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.d80000001dd08p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4411 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4411 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.e7ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4411 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.c00000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4411 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.e7ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4411 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.c00000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4412 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4412 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.cfffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4412 2 OK 0x1.a68297ce015a1p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.a80000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4412 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.cfffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4412 4 OK 0x1.a68297ce015a1p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.a80000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4413 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4413 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.b7ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4413 2 OK 0x1.a68297ce015a1p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.900000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4413 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.b7ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4413 4 OK 0x1.a68297ce015a1p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.900000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4414 0 OK 0x1.86ap16 0x1.86ap17 0x0.0p0 0x1.218p7 0x1.bp3 0x0.0p0 F +REG epsg:4414 1 OK -0x1.c7f51360461e8p18 -0x1.551f4bc2b7d18p18 0x0.0p0 0x1.173741d1a2fbdp7 0x1.0fffffffebe3p3 0x0.0p0 F +REG epsg:4414 2 OK 0x1.45a289b0230f4p19 -0x1.551f4bc2b7d18p18 0x0.0p0 0x1.2bc8be2e5d044p7 0x1.0fffffffebe3p3 0x0.0p0 F +REG epsg:4414 3 OK -0x1.b134bbeee356p18 0x1.739b68ba1ce51p19 0x0.0p0 0x1.173741d1955c4p7 0x1.27ffffffee2e6p4 0x0.0p0 F +REG epsg:4414 4 OK 0x1.3a425df771abp19 0x1.739b68ba1ce51p19 0x0.0p0 0x1.2bc8be2e6aa3cp7 0x1.27ffffffee2e6p4 0x0.0p0 F +REG epsg:4415 0 OK 0x1.e83ecc942125fp18 0x1.e878a4f1fb5adp18 -0x1.d7d524eep2 0x1.ap4 -0x1.1fffffffffe61p3 0x1.0p-30 F +REG epsg:4415 1 OK -0x1.7ace21ccc72dp15 -0x1.bc4a5f19103p15 -0x1.4163a5a68p4 0x1.4f00b6d76p4 -0x1.bfffffffffddap3 0x1.0p-30 F +REG epsg:4415 2 OK 0x1.ffebae78582f8p19 -0x1.bc4b7d81fe14p15 -0x1.a6513061p4 0x1.f0ff4928ap4 -0x1.bfffffffffdb6p3 0x1.0p-30 F +REG epsg:4415 3 OK -0x1.f24f75f13895p15 0x1.00349785bb744p20 0x1.bfb35fac8p3 0x1.4f00b6d75ffffp4 -0x1.ffffffffffc9cp1 -0x1.8p-29 F +REG epsg:4415 4 OK 0x1.03b1e225016d4p20 0x1.0034a087db518p20 0x1.e05879cep2 0x1.f0ff4928ap4 -0x1.ffffffffffc51p1 -0x1.8p-29 F +REG epsg:4417 0 OK 0x1.c9c56921486dap22 0x1.38011ef37d2c3p6 -0x1.63a2bb1aap6 0x1.5p4 0x0.0p0 -0x1.8p-29 T +REG epsg:4417 1 OK 0x1.a7e2655d789ccp22 -0x1.0ef6548f9bd6p19 -0x1.a9f52c247p6 0x1.000000007513p4 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:4417 2 OK 0x1.eba86cebba343p22 -0x1.0ef6549062e6p19 -0x1.5505c37e8p6 0x1.9fffffff8a9e6p4 -0x1.3fffffffeadaep2 0x1.0p-29 F +REG epsg:4417 3 OK 0x1.a7e26a1f4e357p22 0x1.0f09d477bbaccp19 -0x1.73929873cp6 0x1.0000000075114p4 0x1.3fffffffeae9cp2 -0x1.0p-29 F +REG epsg:4417 4 OK 0x1.eba868295bedap22 0x1.0f09d47882d8cp19 -0x1.1ea33bbfcp6 0x1.9fffffff8aa03p4 0x1.3fffffffead9ap2 0x1.4p-28 F +REG epsg:4418 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4418 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.3fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4418 2 OK 0x1.a68297ce015a1p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.180000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4418 3 OK -0x1.6048d15af6dbp17 0x1.bc575b391565dp20 0x0.0p0 -0x1.3fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4418 4 OK 0x1.a68297ce015a1p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.180000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4419 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:4419 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b391565dp20 0x0.0p0 -0x1.27ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4419 2 OK 0x1.a68297ce01597p21 -0x1.bc575b391565dp20 0x0.0p0 -0x1.000000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4419 3 OK -0x1.6048d15af6e5p17 0x1.bc575b391565dp20 0x0.0p0 -0x1.27ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4419 4 OK 0x1.a68297ce01597p21 0x1.bc575b391565dp20 0x0.0p0 -0x1.000000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:4420 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:4420 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.580000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4420 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.640000000ea8p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4420 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.580000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4420 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.640000000ea8p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4421 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:4421 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.640000000ea8p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4421 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.580000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4421 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 0x1.640000000ea8p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4421 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.580000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4422 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:4422 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.5ffffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4422 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.4c0000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4422 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.5ffffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4422 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.4c0000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4423 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG epsg:4423 1 OK -0x1.603e91b2cc2dp17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.53fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4423 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.400000000ea8p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4423 3 OK -0x1.603e91b2cc2dp17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.53fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4423 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.400000000ea8p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4424 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:4424 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.47fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4424 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.340000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4424 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.47fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4424 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.340000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4425 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:4425 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.3bfffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4425 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.280000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4425 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.3bfffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4425 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.280000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4426 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:4426 1 OK -0x1.603e91b2cc2dp17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.2ffffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4426 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.1c0000000ea8p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4426 3 OK -0x1.603e91b2cc2dp17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.2ffffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4426 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.1c0000000ea8p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4427 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:4427 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.23fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4427 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.100000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4427 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.23fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4427 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.100000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4428 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4428 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4428 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4428 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4428 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4429 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4429 1 OK -0x1.603e91b2cc2dp17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.0bfffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4429 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4429 3 OK -0x1.603e91b2cc2dp17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.0bfffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4429 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4430 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4430 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4430 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4430 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4430 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4431 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4431 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4431 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4431 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4431 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4432 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4432 1 OK -0x1.603e91b2cc22p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.cfffffffe2bp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4432 2 OK 0x1.a681f3d37eadep21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.a80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4432 3 OK -0x1.603e91b2cc22p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.cfffffffe2bp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4432 4 OK 0x1.a681f3d37eadep21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.a80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4433 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4433 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.b7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4433 2 OK 0x1.a681f3d37eadep21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.900000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4433 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.b7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4433 4 OK 0x1.a681f3d37eadep21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.900000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4434 0 OK 0x1.0367323b3fb32p23 0x1.38010a617c38p6 -0x1.4a24449f3p6 0x1.8000000000001p4 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:4434 1 OK 0x1.e4eb62e94c4fdp22 -0x1.0ef642a6f5aa5p19 -0x1.90408b2e5p6 0x1.3000000075135p4 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:4434 2 OK 0x1.1458b305225cdp23 -0x1.0ef642a7bada6p19 -0x1.3c209a8e3p6 0x1.cfffffff8a9ecp4 -0x1.3fffffffeadb4p2 -0x1.0p-30 F +REG epsg:4434 3 OK 0x1.e4eb67ab219fbp22 0x1.0f09c28dcef8ep19 -0x1.59ddfb1b4p6 0x1.3000000075118p4 0x1.3fffffffeae9dp2 -0x1.4p-28 F +REG epsg:4434 4 OK 0x1.1458b0a3f404ep23 0x1.0f09c28e9444cp19 -0x1.05be164fap6 0x1.cfffffff8aa07p4 0x1.3fffffffead9cp2 0x1.4p-28 F +REG epsg:4437 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG epsg:4437 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:4437 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:4437 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:4437 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:4438 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4438 1 OK -0x1.603e91b2cc18p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4438 2 OK 0x1.a681f3d37eadep21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.180000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4438 3 OK -0x1.603e91b2cc18p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4438 4 OK 0x1.a681f3d37eadep21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.180000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4439 0 OK 0x1.907e0ab851ebcp20 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:4439 1 OK -0x1.603e91b2cc22p17 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.27ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4439 2 OK 0x1.a681f3d37ead4p21 -0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.000000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4439 3 OK -0x1.603e91b2cc22p17 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.27ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4439 4 OK 0x1.a681f3d37ead4p21 0x1.bc5e8f83a9e38p20 0x0.0p0 -0x1.000000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4455 0 OK 0x1.e848000000005p20 0x1.2285aaf28f051p18 0x0.0p0 -0x1.37p6 0x1.4133333333319p5 0x0.0p0 F +REG epsg:4455 1 OK 0x1.52f0f0e605e6p20 -0x1.1b55411ce993dp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222202p5 0x0.0p0 F +REG epsg:4455 2 OK 0x1.3ecf878cfd0d5p21 -0x1.1b55411ce993dp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222202p5 0x0.0p0 F +REG epsg:4455 3 OK 0x1.59f8a089873e8p20 0x1.b749537638421p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e4444444443p5 0x0.0p0 F +REG epsg:4455 4 OK 0x1.3b4bafbb3c611p21 0x1.b749537638421p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e4444444443p5 0x0.0p0 F +REG epsg:4456 0 OK 0x1.e848000000005p20 0x1.81102843252cap17 0x0.0p0 -0x1.28p6 0x1.4622222222209p5 0x0.0p0 F +REG epsg:4456 1 OK 0x1.8da63579eaa88p20 -0x1.410804360ae92p17 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.3e22222222204p5 0x0.0p0 F +REG epsg:4456 2 OK 0x1.2174e5430aac1p21 -0x1.410804360ae92p17 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.3e22222222204p5 0x0.0p0 F +REG epsg:4456 3 OK 0x1.9054a76742ef8p20 0x1.13820f11b2fdcp19 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.4e2222222220dp5 0x0.0p0 F +REG epsg:4456 4 OK 0x1.201dac4c5e889p21 0x1.13820f11b2fdcp19 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.4e2222222220dp5 0x0.0p0 F +REG epsg:4457 0 OK 0x1.e097400000006p20 0x1.495377ea606a5p18 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:4457 1 OK 0x1.361934b47e738p20 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:4457 2 OK 0x1.458aa5a5c0c62p21 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:4457 3 OK 0x1.40b260ebae5d4p20 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:4457 4 OK 0x1.403e0f8a28d15p21 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:4462 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.08p7 -0x1.affffffffff46p4 0x0.0p0 F +REG epsg:4462 1 OK -0x1.5b857c044c894p20 -0x1.ad489daa4f231p20 0x0.0p0 0x1.cca911a9530fep6 -0x1.4ffffffffffefp5 0x0.0p0 F +REG epsg:4462 2 OK 0x1.5b857c044c894p20 -0x1.ad489daa4f231p20 0x0.0p0 0x1.29ab772b56782p7 -0x1.4ffffffffffefp5 0x0.0p0 F +REG epsg:4462 3 OK -0x1.c7d685e4aa714p20 0x1.7672f4b1220c7p20 0x0.0p0 0x1.cca911a9530fep6 -0x1.7fffffffffe38p3 0x0.0p0 F +REG epsg:4462 4 OK 0x1.c7d685e4aa714p20 0x1.7672f4b1220c7p20 0x0.0p0 0x1.29ab772b56782p7 -0x1.7fffffffffe38p3 0x0.0p0 F +REG epsg:4463 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4463 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4463 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4463 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4463 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4465 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4465 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4465 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4465 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4465 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4467 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:4467 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:4467 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:4467 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:4467 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:4468 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4468 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4468 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4468 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4468 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4470 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4470 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4470 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4470 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4470 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4471 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.68p5 -0x1.9p4 0x0.0p0 F +REG epsg:4471 1 OK -0x1.fbe5023e2a96p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4471 2 OK 0x1.f8272811f154bp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:4471 3 OK -0x1.2fd8271ed48c8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4471 4 OK 0x1.07218271ed48cp20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:4473 0 OK 0x1.854e5p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4473 1 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4473 2 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4473 3 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4473 4 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4474 0 OK 0x1.e80eec6447077p18 0x1.b99bc931f64b6p22 -0x1.f695c4d8ep5 0x1.68p5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:4474 1 OK -0x1.ff942feb00fap14 0x1.97054dac7d0cbp22 -0x1.1d886e053p6 0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:4474 2 OK 0x1.f80b8d91825bcp19 0x1.97054dad49a8ep22 -0x1.b5a806ca9p6 0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:4474 3 OK -0x1.30bfd6b0f2eep16 0x1.daceceb22a198p22 -0x1.1a3621f6p4 0x1.3bdd68fcf51a4p5 -0x1.4p4 0x1.0p-29 F +REG epsg:4474 4 OK 0x1.0713737680ab2p20 0x1.daceceb2ecf48p22 -0x1.d73b16d7ap5 0x1.942297030ae5cp5 -0x1.4p4 0x1.0p-29 F +REG epsg:4475 0 OK 0x1.0eccb64347f3dp-11 0x1.303e848ee8c6p-9 0x1.0596402e98p7 0x0.0p0 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4475 1 OK -0x1.3ff29f3c1e63fp2 -0x1.3fd79d05515dbp2 0x1.94e47ec5dp6 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4475 2 OK 0x1.40038bebd14b4p2 -0x1.3fd77be80266bp2 0x1.bcd481185p6 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4475 3 OK -0x1.3ff29f3c1e63fp2 0x1.402361187d80ep2 0x1.23ecf7c698p7 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4475 4 OK 0x1.40038bebd14b4p2 0x1.40233ff36b22dp2 0x1.37e4efb248p7 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4479 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4479 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4479 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4479 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4479 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4481 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4481 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4481 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4481 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4481 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4483 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4483 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4483 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4483 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4483 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4484 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4484 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:4484 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:4484 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:4484 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:4485 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4485 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:4485 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:4485 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:4485 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:4486 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4486 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:4486 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:4486 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:4486 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:4487 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4487 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:4487 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:4487 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:4487 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:4488 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4488 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:4488 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:4488 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:4488 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:4489 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4489 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:4489 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:4489 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:4489 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:4490 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4490 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4490 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4490 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4490 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4491 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4491 1 OK 0x1.8b0b4eca10683p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4491 2 OK 0x1.acee3135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4491 3 OK 0x1.8b0b4eca10683p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4491 4 OK 0x1.acee3135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4492 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4492 1 OK 0x1.a98fceca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4492 2 OK 0x1.cb72b135ef97dp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4492 3 OK 0x1.a98fceca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4492 4 OK 0x1.cb72b135ef97dp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4493 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4493 1 OK 0x1.c8144eca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4493 2 OK 0x1.e9f73135ef97dp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4493 3 OK 0x1.c8144eca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4493 4 OK 0x1.e9f73135ef97dp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4494 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4494 1 OK 0x1.e698ceca10683p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4494 2 OK 0x1.043dd89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4494 3 OK 0x1.e698ceca10683p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4494 4 OK 0x1.043dd89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4495 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4495 1 OK 0x1.028ea76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4495 2 OK 0x1.1380189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4495 3 OK 0x1.028ea76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4495 4 OK 0x1.1380189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4496 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4496 1 OK 0x1.11d0e76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4496 2 OK 0x1.22c2589af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4496 3 OK 0x1.11d0e76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4496 4 OK 0x1.22c2589af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4497 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4497 1 OK 0x1.2113276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d503p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4497 2 OK 0x1.3204989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4497 3 OK 0x1.2113276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d503p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4497 4 OK 0x1.3204989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4498 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4498 1 OK 0x1.3055676508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4498 2 OK 0x1.4146d89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4498 3 OK 0x1.3055676508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4498 4 OK 0x1.4146d89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4499 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4499 1 OK 0x1.3f97a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4499 2 OK 0x1.5089189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4499 3 OK 0x1.3f97a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4499 4 OK 0x1.5089189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4500 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4500 1 OK 0x1.4ed9e76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4500 2 OK 0x1.5fcb589af7cbfp24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4500 3 OK 0x1.4ed9e76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4500 4 OK 0x1.5fcb589af7cbfp24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4501 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4501 1 OK 0x1.5e1c276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4501 2 OK 0x1.6f0d989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4501 3 OK 0x1.5e1c276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4501 4 OK 0x1.6f0d989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4502 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4502 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4502 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4502 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4502 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4503 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4503 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4503 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4503 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4503 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4504 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4504 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4504 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4504 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4504 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4505 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4505 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4505 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4505 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4505 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4506 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4506 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4506 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4506 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4506 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4507 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4507 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4507 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4507 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4507 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4508 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4508 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4508 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4508 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4508 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4509 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4509 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4509 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4509 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4509 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4510 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4510 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4510 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4510 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4510 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4511 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4511 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4511 2 OK 0x1.019d89af7cbecp20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4511 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4511 4 OK 0x1.019d89af7cbecp20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4512 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4512 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4512 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4512 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4512 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4513 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4513 1 OK 0x1.7ca0a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d503p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4513 2 OK 0x1.8d92189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4513 3 OK 0x1.7ca0a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d503p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4513 4 OK 0x1.8d92189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4514 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG epsg:4514 1 OK 0x1.8be2e76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.240000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4514 2 OK 0x1.9cd4589af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4bffffffe2afdp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4514 3 OK 0x1.8be2e76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.240000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4514 4 OK 0x1.9cd4589af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4bffffffe2afdp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4515 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4515 1 OK 0x1.9b25276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4515 2 OK 0x1.ac16989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4515 3 OK 0x1.9b25276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4515 4 OK 0x1.ac16989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4516 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:4516 1 OK 0x1.aa67676508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3c0000001d503p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4516 2 OK 0x1.bb58d89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.63ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4516 3 OK 0x1.aa67676508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3c0000001d503p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4516 4 OK 0x1.bb58d89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.63ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4517 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4517 1 OK 0x1.b9a9a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4517 2 OK 0x1.ca9b189af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2afdp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4517 3 OK 0x1.b9a9a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4517 4 OK 0x1.ca9b189af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2afdp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4518 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:4518 1 OK 0x1.c8ebe76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.540000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4518 2 OK 0x1.d9dd589af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4518 3 OK 0x1.c8ebe76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.540000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4518 4 OK 0x1.d9dd589af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4519 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4519 1 OK 0x1.d82e276508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d503p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4519 2 OK 0x1.e91f989af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4519 3 OK 0x1.d82e276508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d503p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4519 4 OK 0x1.e91f989af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4520 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4520 1 OK 0x1.e770676508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6c0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4520 2 OK 0x1.f861d89af7cbep24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.93ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4520 3 OK 0x1.e770676508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6c0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4520 4 OK 0x1.f861d89af7cbep24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.93ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4521 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4521 1 OK 0x1.f6b2a76508342p24 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4521 2 OK 0x1.03d20c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4521 3 OK 0x1.f6b2a76508342p24 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4521 4 OK 0x1.03d20c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4522 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG epsg:4522 1 OK 0x1.02fa73b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.840000001d503p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4522 2 OK 0x1.0b732c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.abffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4522 3 OK 0x1.02fa73b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.840000001d503p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4522 4 OK 0x1.0b732c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.abffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4523 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4523 1 OK 0x1.0a9b93b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4523 2 OK 0x1.13144c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4523 3 OK 0x1.0a9b93b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4523 4 OK 0x1.13144c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4524 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG epsg:4524 1 OK 0x1.123cb3b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9c0000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4524 2 OK 0x1.1ab56c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c3ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4524 3 OK 0x1.123cb3b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9c0000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4524 4 OK 0x1.1ab56c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c3ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4525 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4525 1 OK 0x1.19ddd3b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d503p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4525 2 OK 0x1.22568c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4525 3 OK 0x1.19ddd3b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d503p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4525 4 OK 0x1.22568c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4526 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4526 1 OK 0x1.217ef3b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b40000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4526 2 OK 0x1.29f7ac4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dbffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4526 3 OK 0x1.217ef3b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b40000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4526 4 OK 0x1.29f7ac4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dbffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4527 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4527 1 OK 0x1.292013b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4527 2 OK 0x1.3198cc4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4527 3 OK 0x1.292013b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4527 4 OK 0x1.3198cc4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4528 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:4528 1 OK 0x1.30c133b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cc0000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4528 2 OK 0x1.3939ec4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f3ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4528 3 OK 0x1.30c133b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cc0000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4528 4 OK 0x1.3939ec4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f3ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4529 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4529 1 OK 0x1.386253b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4529 2 OK 0x1.40db0c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4529 3 OK 0x1.386253b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4529 4 OK 0x1.40db0c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4530 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG epsg:4530 1 OK 0x1.400373b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e40000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4530 2 OK 0x1.487c2c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.05fffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4530 3 OK 0x1.400373b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e40000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4530 4 OK 0x1.487c2c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.05fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4531 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4531 1 OK 0x1.47a493b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4531 2 OK 0x1.501d4c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4531 3 OK 0x1.47a493b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4531 4 OK 0x1.501d4c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4532 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:4532 1 OK 0x1.4f45b3b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4532 2 OK 0x1.57be6c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4532 3 OK 0x1.4f45b3b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4532 4 OK 0x1.57be6c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4533 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4533 1 OK 0x1.56e6d3b2841a1p25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4533 2 OK 0x1.5f5f8c4d7be5fp25 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4533 3 OK 0x1.56e6d3b2841a1p25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4533 4 OK 0x1.5f5f8c4d7be5fp25 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4534 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4534 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4534 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4534 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4534 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4535 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG epsg:4535 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.240000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4535 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4bffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4535 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.240000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4535 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.4bffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4536 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4536 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4536 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4536 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4536 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4537 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:4537 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3c0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4537 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.63ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4537 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3c0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4537 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.63ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4538 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4538 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4538 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4538 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4538 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4539 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:4539 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.540000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4539 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4539 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.540000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4539 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4540 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4540 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4540 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4540 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4540 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4541 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4541 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6c0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4541 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.93ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4541 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6c0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4541 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.93ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4542 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4542 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4542 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4542 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.780000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4542 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4543 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG epsg:4543 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.840000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4543 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.abffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4543 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.840000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4543 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.abffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4544 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4544 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4544 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4544 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4544 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b7ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4545 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG epsg:4545 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9c0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4545 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c3ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4545 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9c0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4545 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c3ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4546 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4546 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4546 2 OK 0x1.019d89af7cbe4p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4546 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4546 4 OK 0x1.019d89af7cbe4p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4547 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4547 1 OK -0x1.af3135ef97c9p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b40000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4547 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dbffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4547 3 OK -0x1.af3135ef97c9p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.b40000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4547 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.dbffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4548 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4548 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4548 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4548 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c00000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4548 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4549 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:4549 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cc0000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4549 2 OK 0x1.019d89af7cbecp20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f3ffffffe2bp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4549 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.cc0000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4549 4 OK 0x1.019d89af7cbecp20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f3ffffffe2bp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4550 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4550 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4550 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4550 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4550 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4551 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG epsg:4551 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e40000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4551 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.05fffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4551 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e40000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4551 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.05fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4552 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4552 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4552 2 OK 0x1.019d89af7cbecp20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4552 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4552 4 OK 0x1.019d89af7cbecp20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4553 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:4553 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4553 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4553 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4553 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4554 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4554 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4554 2 OK 0x1.019d89af7cbdep20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4554 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4554 4 OK 0x1.019d89af7cbdep20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4555 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4555 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4555 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4555 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4555 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4556 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4556 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4556 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4556 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4556 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4558 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4558 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4558 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4558 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4558 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4559 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:4559 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:4559 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:4559 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:4559 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:4568 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4568 1 OK 0x1.8b0b3bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4568 2 OK 0x1.acee4401dc87bp23 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4568 3 OK 0x1.8b0b3bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4568 4 OK 0x1.acee4401dc87bp23 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4569 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4569 1 OK 0x1.a98fbbfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4569 2 OK 0x1.cb72c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4569 3 OK 0x1.a98fbbfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4569 4 OK 0x1.cb72c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4570 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4570 1 OK 0x1.c8143bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4570 2 OK 0x1.e9f74401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4570 3 OK 0x1.c8143bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4570 4 OK 0x1.e9f74401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4571 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4571 1 OK 0x1.e698bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4571 2 OK 0x1.043de200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4571 3 OK 0x1.e698bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4571 4 OK 0x1.043de200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4572 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4572 1 OK 0x1.028e9dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4572 2 OK 0x1.13802200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4572 3 OK 0x1.028e9dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4572 4 OK 0x1.13802200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4573 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4573 1 OK 0x1.11d0ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4573 2 OK 0x1.22c26200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4573 3 OK 0x1.11d0ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4573 4 OK 0x1.22c26200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4574 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4574 1 OK 0x1.21131dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4574 2 OK 0x1.3204a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4574 3 OK 0x1.21131dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4574 4 OK 0x1.3204a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4575 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4575 1 OK 0x1.30555dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4575 2 OK 0x1.4146e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4575 3 OK 0x1.30555dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4575 4 OK 0x1.4146e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4576 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4576 1 OK 0x1.3f979dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4576 2 OK 0x1.50892200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4576 3 OK 0x1.3f979dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4576 4 OK 0x1.50892200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4577 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4577 1 OK 0x1.4ed9ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4577 2 OK 0x1.5fcb6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4577 3 OK 0x1.4ed9ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4577 4 OK 0x1.5fcb6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4578 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4578 1 OK 0x1.5e1c1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4578 2 OK 0x1.6f0da200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4578 3 OK 0x1.5e1c1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4578 4 OK 0x1.6f0da200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4579 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4579 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4579 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4579 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4579 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4580 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4580 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4580 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4580 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4580 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4581 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4581 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4581 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4581 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4581 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4582 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4582 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4582 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4582 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4582 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4583 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4583 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4583 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4583 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4583 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4584 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4584 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4584 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4584 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4584 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4585 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4585 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4585 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4585 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4585 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4586 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4586 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4586 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4586 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4586 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4587 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4587 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4587 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4587 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4587 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4588 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4588 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4588 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4588 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4588 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4589 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4589 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4589 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4589 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4589 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4600 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4600 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4600 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4600 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4600 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4601 0 OK 0x1.1a93027e514d4p-13 -0x1.50ab8609abf06p-11 0x1.1db5f90568p7 0x0.0p0 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:4601 1 OK -0x1.3ffa8256625f4p2 -0x1.40102dc813888p2 0x1.28e6b8bf4p7 -0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4601 2 OK 0x1.3ffeec9b27a7p2 -0x1.40102522dcf3fp2 0x1.2e1c48cb1p7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4601 3 OK -0x1.3ffa8256625f4p2 0x1.3ffb37fa51316p2 0x1.1025b5fb4p7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4601 4 OK 0x1.3ffeec9b27a7p2 0x1.3ffb2f55aa0dbp2 0x1.155b46b1cp7 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4602 0 OK -0x1.9351a88dfcb91p-8 -0x1.3dc078b2273eap-8 -0x1.a28af2c008p9 0x1.2d6cb2018701ep-60 -0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:4602 1 OK -0x1.406e2998e43c6p2 -0x1.4060a5f8308p2 -0x1.695cc5ae46p9 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4602 2 OK 0x1.3fa482202e439p2 -0x1.40623148a7a4ep2 -0x1.a4d7d63912p9 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4602 3 OK -0x1.406e2998e43c6p2 0x1.3fc264252ff5dp2 -0x1.98167c5b5cp9 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4602 4 OK 0x1.3fa482202e439p2 0x1.3fc3eeb46523ap2 -0x1.d391c66864p9 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4603 0 OK -0x1.f73e5313cc8p-10 -0x1.b903582965654p-11 -0x1.70480eb72p7 -0x1.2d6cb2018701ep-61 0x0.0p0 0x1.0p-30 T +REG epsg:4603 1 OK -0x1.4020610106e44p2 -0x1.4017606ab1301p2 -0x1.3492c58fcp7 -0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4603 2 OK 0x1.3fe1799fd1ee9p2 -0x1.4017db9bafc65p2 -0x1.7eca8e3778p7 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4603 3 OK -0x1.4020610106e44p2 0x1.3ffbeba25e48ap2 -0x1.54ffc334p7 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4603 4 OK 0x1.3fe1799fd1ee9p2 0x1.3ffc66c8e7b1ep2 -0x1.9f37984e48p7 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4604 0 OK -0x1.a6b66159a0dbfp-9 -0x1.b0b8ad8686fd9p-9 -0x1.1e1fd7695cp8 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4604 1 OK -0x1.403713f5a69dfp2 -0x1.4040ad47f60fbp2 -0x1.b656ea295p7 -0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4604 2 OK 0x1.3fcd670edb821p2 -0x1.40417c57fb8bep2 -0x1.1982c20a9p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4604 3 OK -0x1.403713f5a69dfp2 0x1.3fd4ead100208p2 -0x1.1acd438b14p8 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4604 4 OK 0x1.3fcd670edb821p2 0x1.3fd5b99c1178dp2 -0x1.5924b98aacp8 0x1.3fffffffffffep2 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:4605 0 OK -0x1.aef18e56491cp-10 -0x1.17c79a58edc53p-9 -0x1.e48d4a445p6 -0x1.2d6cb2018701ep-61 -0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4605 1 OK -0x1.401b0c924c857p2 -0x1.402bb57e157p2 -0x1.47dacf7acp6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4605 2 OK 0x1.3fe52eba4e5e9p2 -0x1.402c1f02945e4p2 -0x1.c6f700a15p6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4605 3 OK -0x1.401b0c924c857p2 0x1.3fe6092deaa6ep2 -0x1.ec6c2c0e7p6 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4605 4 OK 0x1.3fe52eba4e5e9p2 0x1.3fe6729bb0097p2 -0x1.35c449a72p7 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4606 0 OK -0x1.2d6ae4893b202p-10 -0x1.5ee6c0c0c8ecbp-9 0x1.26e7d53fcp5 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4606 1 OK -0x1.4010eb6908aa7p2 -0x1.403297f91f387p2 0x1.2d29dd9fcp6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4606 2 OK 0x1.3feb3e4ace5a7p2 -0x1.4032e1c7b9ae1p2 0x1.a8842ea6ep5 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4606 3 OK -0x1.4010eb6908aa7p2 0x1.3fdb3589662cdp2 0x1.7b0bab6b8p4 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4606 4 OK 0x1.3feb3e4ace5a7p2 0x1.3fdb7f4411637p2 0x1.76bd4678p0 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4607 0 OK -0x1.8787e029e796p-9 -0x1.458ee420d93b5p-9 -0x1.33cd273a88p8 0x0.0p0 0x0.0p0 0x1.0p-30 T +REG epsg:4607 1 OK -0x1.4033759eb2a85p2 -0x1.4033a4731b9d7p2 -0x1.f5b8a14a48p7 -0x1.3fffffffffffdp2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4607 2 OK 0x1.3fd1944b45981p2 -0x1.403464356209ap2 -0x1.349a62a948p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4607 3 OK -0x1.4033759eb2a85p2 0x1.3fe291c0916b9p2 -0x1.2abbf6a9dp8 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4607 4 OK 0x1.3fd1944b45981p2 0x1.3fe35152cadbbp2 -0x1.647a2546d8p8 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4608 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4608 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4608 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4608 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4608 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4609 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4609 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4609 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4609 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4609 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4610 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4610 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4610 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4610 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4610 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4611 0 OK 0x1.704930fb5d792p-9 0x1.b60a16530c733p-11 -0x1.459272f26p6 0x1.c22b3c4eefd79p-33 0x1.d443540a7de1fp-34 0x1.f538ap-11 T +REG epsg:4611 1 OK -0x1.3fcff9a8b0bb9p2 -0x1.3ff2e627c5c0bp2 -0x1.e02a70a31p6 -0x1.3ffffffed3d44p2 -0x1.3fffffff65d02p2 0x1.eb3a8p-11 F +REG epsg:4611 2 OK 0x1.402bfdc8f0aafp2 -0x1.3ff25471a7c2ep2 -0x1.1fcba346ep6 0x1.3fffffffe94ecp2 -0x1.400000000a708p2 0x1.f583p-11 F +REG epsg:4611 3 OK -0x1.3fcfc46ae70bp2 0x1.400e39977e57bp2 -0x1.6fb28d06dp6 -0x1.3fffffff7a08fp2 0x1.4000000045927p2 0x1.f385ep-11 F +REG epsg:4611 4 OK 0x1.402be3d58a815p2 0x1.400d8c2049deap2 -0x1.5ea8d4938p5 0x1.3fffffff42389p2 0x1.3fffffff9d87bp2 0x1.f179ap-11 F +REG epsg:4612 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4612 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4612 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4612 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4612 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4613 0 OK -0x1.92a8b258d5cb6p-8 -0x1.84c52af6ff60cp-12 0x1.1db86f861ep10 0x0.0p0 0x0.0p0 0x1.0p-30 T +REG epsg:4613 1 OK -0x1.405f78f4da58p2 -0x1.3ffe645c73a53p2 0x1.2c918b491bp10 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4613 2 OK 0x1.3f9625e4c1816p2 -0x1.3fffee707244cp2 0x1.0ee066b331p10 0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4613 3 OK -0x1.405f78f4da58p2 0x1.3ff24a4b9cf81p2 0x1.2ac83182b5p10 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4613 4 OK 0x1.3f9625e4c1816p2 0x1.3ff3d450dba82p2 0x1.0d170abaf8p10 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4614 0 OK 0x1.3d9ea2cbd9e85p-9 0x1.36ec965d1e019p-13 -0x1.35c97690ap7 -0x1.2c973e174595dp-32 -0x1.dbaeaf4517a55p-30 0x1.83698p-13 T +REG epsg:4614 1 OK -0x1.3fd736a724fd4p2 -0x1.3ffe440cf004bp2 -0x1.6cdf6d288p7 -0x1.400000006ae34p2 -0x1.40000001cfc3fp2 0x1.d62e8p-13 F +REG epsg:4614 2 OK 0x1.4025b2dd5de32p2 -0x1.3ffe831ad9401p2 -0x1.036881a53p7 0x1.3fffffffe322bp2 -0x1.40000001de486p2 0x1.c1fe8p-13 F +REG epsg:4614 3 OK -0x1.3fd64edc7b73fp2 0x1.400408f0cf32cp2 -0x1.690491b82p7 -0x1.400000007e4dcp2 0x1.3ffffffe36a75p2 0x1.4d9e8p-13 F +REG epsg:4614 4 OK 0x1.4026a0cf78357p2 0x1.40026beeb74a6p2 -0x1.ff22d1711p6 0x1.3fffffffde08ep2 0x1.3ffffffe2cb33p2 0x1.35cep-13 F +REG epsg:4615 0 OK 0x1.2528da04de0a8p-9 -0x1.74306e643ba9bp-9 0x1.f00678e088p7 0x1.2d6cb2018701ep-62 0x0.0p0 0x0.0p0 T +REG epsg:4615 1 OK -0x1.3fd4ee5bf05f3p2 -0x1.402a8c18b3b51p2 0x1.f55305557p7 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4615 2 OK 0x1.401e381b346b7p2 -0x1.4029fc8f8fba5p2 0x1.25e5a15d34p8 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4615 3 OK -0x1.3fd4ee5bf05f3p2 0x1.3fcddc590bf0ap2 0x1.87dc9b6f2p7 -0x1.4p2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4615 4 OK 0x1.401e381b346b7p2 0x1.3fcd4cf907b5dp2 0x1.de5509c72p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4616 0 OK 0x1.23fde95eb1737p-10 -0x1.1c7c38a78d4b6p-11 0x1.30030ce34p5 0x1.2d6cb2018701ep-63 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG epsg:4616 1 OK -0x1.3fea07a572399p2 -0x1.40079ed99afa8p2 0x1.ef628ceacp4 -0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4616 2 OK 0x1.400e8726a17a3p2 -0x1.400757654c5p2 0x1.a3f18c69cp5 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4616 3 OK -0x1.3fea07a572399p2 0x1.3ff5e8bebb0a8p2 0x1.480c676f8p4 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4616 4 OK 0x1.400e8726a17a3p2 0x1.3ff5a14e5644ep2 0x1.50468c4e8p5 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4617 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4617 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4617 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4617 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4617 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4618 0 OK -0x1.494d8bba92fe2p-15 0x1.6d480b4dd52c9p-12 0x1.5ef600bd6p5 0x0.0p0 0x1.2f74bf1dcfcaep-64 0x1.0p-30 T +REG epsg:4618 1 OK -0x1.3fffc8398176ap2 -0x1.3ff976fb272dfp2 0x1.431c71d58p5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4618 2 OK 0x1.3ffe7eee18b87p2 -0x1.3ff9797fba1e2p2 0x1.3d0a59ba2p5 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4618 3 OK -0x1.3fffc8398176ap2 0x1.4004d5e400c07p2 0x1.78d38dde6p5 -0x1.3ffffffffffffp2 0x1.4000000000001p2 0x0.0p0 F +REG epsg:4618 4 OK 0x1.3ffe7eee18b87p2 0x1.4004d868aa5bfp2 0x1.72c1762eep5 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4619 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4619 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4619 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4619 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4619 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4620 0 OK 0x1.2fc64088e698ep-10 -0x1.8735d48091c2fp-10 -0x1.890f19b8p2 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4620 1 OK -0x1.3feba651c69cap2 -0x1.4020198aa0078p2 -0x1.1e64035p0 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4620 2 OK 0x1.40119edae31dfp2 -0x1.401fcf2c77ec3p2 0x1.5480dea9cp4 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4620 3 OK -0x1.3feba651c69cap2 0x1.3fef6368654b6p2 -0x1.de20088c8p4 -0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4620 4 OK 0x1.40119edae31dfp2 0x1.3fef1915702f2p2 -0x1.dee1fc24p2 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4621 0 OK -0x1.2402e77ea6e28p-9 0x1.fdbcaba713b6dp-9 -0x1.83fb07a148p8 -0x1.78c7de81e8c25p-60 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4621 1 OK -0x1.402643b29e378p2 -0x1.3fc45b3c766cp2 -0x1.9231b32b0cp8 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4621 2 OK 0x1.3fdd43732dee8p2 -0x1.3fc4ea0c6f533p2 -0x1.bd4292b9dcp8 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4621 3 OK -0x1.402643b29e378p2 0x1.40434ba462e23p2 -0x1.473c98fe5cp8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4621 4 OK 0x1.3fdd43732dee8p2 0x1.4043daac771dep2 -0x1.724d5728e4p8 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4622 0 OK 0x1.2d670bbbfe517p-13 0x1.6398b80f09bd9p-9 0x1.b003a59468p7 -0x1.2d6cb2018701fp-66 0x0.0p0 -0x1.0p-30 T +REG epsg:4622 1 OK -0x1.3ff7a1f0da428p2 -0x1.3fd013901082bp2 0x1.733be0e658p7 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4622 2 OK 0x1.3ffc57855cafcp2 -0x1.3fd00a597aa54p2 0x1.78ca4e7dp7 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4622 3 OK -0x1.3ff7a1f0da428p2 0x1.4028a16d60426p2 0x1.dbd0ef16dp7 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4622 4 OK 0x1.3ffc57855cafcp2 0x1.4028983444107p2 0x1.e15f59ac2p7 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4623 0 OK -0x1.0ecda25e6b21fp-9 -0x1.04c849c654dap-10 -0x1.03fac697cp6 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4623 1 OK -0x1.401f745c5e59cp2 -0x1.400fed4b8846bp2 -0x1.2147aedep5 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4623 2 OK 0x1.3fdbc16398055p2 -0x1.401071d97ab44p2 -0x1.306434bdcp6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4623 3 OK -0x1.401f745c5e59cp2 0x1.3fef74ad1bd59p2 -0x1.baac6d4ccp5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4623 4 OK 0x1.3fdbc16398055p2 0x1.3feff92dbf1eap2 -0x1.7d16b3a44p6 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4624 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4624 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4624 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4624 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4624 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4625 0 OK -0x1.1bc571e013c4fp-8 -0x1.66010cabadc87p-10 -0x1.b4fae07384p8 -0x1.2d6cb2018701ep-60 -0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4625 1 OK -0x1.404955e8a65f7p2 -0x1.401a7b38f5f41p2 -0x1.7bdd231edp8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4625 2 OK 0x1.3fbb741e388c6p2 -0x1.401b9114581ccp2 -0x1.cf9081026cp8 0x1.4p2 -0x1.4p2 0x1.0p-29 F +REG epsg:4625 3 OK -0x1.404955e8a65f7p2 0x1.3fede7a4b0646p2 -0x1.962faa7e94p8 -0x1.3fffffffffffep2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4625 4 OK 0x1.3fbb741e388c6p2 0x1.3feefd59c753ap2 -0x1.e9e31f2c88p8 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4626 0 OK 0x1.170eae30a9b64p-7 0x1.76008d3618c51p-7 -0x1.58cdc900bcp8 -0x1.2d6cb2018701fp-60 -0x1.2f74bf1dcfcaep-59 -0x1.0p-30 T +REG epsg:4626 1 OK -0x1.3f75aef75bb91p2 -0x1.3f4a56725fd77p2 -0x1.0bda742586p9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4626 2 OK 0x1.408cbbd27bbfcp2 -0x1.3f48355b42e22p2 -0x1.73153daeb4p8 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4626 3 OK -0x1.3f75aef75bb91p2 0x1.40bee487fa758p2 -0x1.3bb694d7c4p8 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4626 4 OK 0x1.408cbbd27bbfcp2 0x1.40bcc0fb6cfap2 -0x1.2e30c1ae7p7 0x1.3fffffffffffep2 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:4627 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4627 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4627 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4627 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4627 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4628 0 OK -0x1.138725574e2ebp-10 -0x1.6d1d89a5d3204p-10 -0x1.9cff3f0018p8 0x1.2d6cb2018701fp-63 0x0.0p0 -0x1.0p-30 T +REG epsg:4628 1 OK -0x1.40134e581591bp2 -0x1.401b06c707ac7p2 -0x1.837e4a48acp8 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4628 2 OK 0x1.3ff0ddad3f1c2p2 -0x1.401b4a394263ap2 -0x1.97cf84f28p8 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4628 3 OK -0x1.40134e581591bp2 0x1.3fed9076ba01ap2 -0x1.9e56b4a1a4p8 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4628 4 OK 0x1.3ff0ddad3f1c2p2 0x1.3fedd3df79d9dp2 -0x1.b2a7f4efd4p8 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4629 0 OK -0x1.ab9084a56d39ap-9 -0x1.ef0aed3570788p-12 -0x1.4c320045d8p8 -0x1.060c0fab3421dp-29 -0x1.4cc3a4a367164p-30 0x1.56218p-13 T +REG epsg:4629 1 OK -0x1.4036fa7f10252p2 -0x1.4009f35a79872p2 -0x1.260261644cp8 -0x1.400000022b9d8p2 -0x1.4000000176e87p2 0x1.da878p-13 F +REG epsg:4629 2 OK 0x1.3fcad35da0a83p2 -0x1.400c02bf5eccdp2 -0x1.6212a5104p8 0x1.3ffffffe42d1ap2 -0x1.40000001a63a6p2 0x1.45c6p-13 F +REG epsg:4629 3 OK -0x1.4035c667bd332p2 0x1.3ffbd26209647p2 -0x1.33d40d567cp8 -0x1.400000025017ap2 0x1.3fffffff09654p2 0x1.7e61p-13 F +REG epsg:4629 4 OK 0x1.3fcc269b6c99p2 0x1.3ffb51ae3dbb3p2 -0x1.6fe6ef72acp8 0x1.3ffffffe285b3p2 0x1.3ffffffef9e4cp2 0x1.c0a2p-14 F +REG epsg:4630 0 OK -0x1.429f6cf7a9c53p-9 -0x1.3435e28d949b5p-11 -0x1.4efe686f54p8 0x0.0p0 -0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:4630 1 OK -0x1.402968853b42dp2 -0x1.400cb596fe49cp2 -0x1.303561c904p8 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4630 2 OK 0x1.3fd8c130ec136p2 -0x1.400d538289f9ap2 -0x1.5fc9e7c65cp8 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4630 3 OK -0x1.402968853b42dp2 0x1.3ff985627508ap2 -0x1.3b8a08fd08p8 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4630 4 OK 0x1.3fd8c130ec136p2 0x1.3ffa2344a1f3fp2 -0x1.6b1e948e08p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4631 0 OK 0x1.b85f5c275ae46p-10 -0x1.e86658416e0cp-11 -0x1.8bff15777p8 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4631 1 OK -0x1.3fe6582dfd83p2 -0x1.40139f450becfp2 -0x1.91764ea1ap8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4631 2 OK 0x1.401d63bd27952p2 -0x1.4013337b52ecp2 -0x1.70fd3f6638p8 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4631 3 OK -0x1.3fe6582dfd83p2 0x1.3ff53730efc7cp2 -0x1.a36accb94p8 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4631 4 OK 0x1.401d63bd27952p2 0x1.3ff4cb71590c5p2 -0x1.82f1b775ep8 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4632 0 OK 0x1.15dbf17a1acdap-11 0x1.368ef97ad8ecbp-9 0x1.0602e9d21p7 0x0.0p0 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:4632 1 OK -0x1.3ff2660fbac06p2 -0x1.3fd6d37acfbbcp2 0x1.935b7f9d8p6 -0x1.4000000000001p2 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:4632 2 OK 0x1.4003c3b268582p2 -0x1.3fd6b18097336p2 0x1.bc5609f09p6 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4632 3 OK -0x1.3ff2660fbac06p2 0x1.40242a19e5a32p2 0x1.2503e0455p7 -0x1.4p2 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:4632 4 OK 0x1.4003c3b268582p2 0x1.402408178b921p2 0x1.39811bc148p7 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4633 0 OK -0x1.06169d4bd6074p-9 0x1.11c5dd2dfa81cp-9 -0x1.253b1fc172p9 0x1.2d6cb2018702p-61 0x0.0p0 -0x1.0p-29 T +REG epsg:4633 1 OK -0x1.40251475997f8p2 -0x1.3fe451d172d1p2 -0x1.24032a9dbap9 -0x1.4000000000001p2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4633 2 OK 0x1.3fe38f3d30d1dp2 -0x1.3fe4d20cbded7p2 -0x1.3756b7b3d2p9 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4633 3 OK -0x1.40251475997f8p2 0x1.40287f3322f77p2 -0x1.0fe20fa5eap9 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4633 4 OK 0x1.3fe38f3d30d1dp2 0x1.4028ff897a21ap2 -0x1.233594af9ap9 0x1.4p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4634 0 OK 0x1.99bf8b37b1f14p-9 -0x1.5a2387820d486p-9 -0x1.dbf7b19f68p7 -0x1.2d6cb2018701fp-61 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:4634 1 OK -0x1.3fcc9d79bcb19p2 -0x1.402daab0a6604p2 -0x1.e44f882c1p7 -0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4634 2 OK 0x1.40330cb1f43a7p2 -0x1.402ce20c4713dp2 -0x1.6b73c9b4cp7 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4634 3 OK -0x1.3fcc9d79bcb19p2 0x1.3fd777b2e511ap2 -0x1.250e4e30ep8 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4634 4 OK 0x1.40330cb1f43a7p2 0x1.3fd6af43fb76bp2 -0x1.d1409e4878p7 0x1.3fffffffffffep2 0x1.4p2 -0x1.0p-29 F +REG epsg:4635 0 OK 0x1.addfa6a6feadap-9 -0x1.3090e58babb01p-9 -0x1.3a5d4f6478p7 0x1.937950e158ef1p-26 0x1.d275604e104a8p-26 0x1.190ed4p-7 T +REG epsg:4635 1 OK -0x1.3fca3eb4d9359p2 -0x1.4025810c832c5p2 -0x1.496c925a4p7 -0x1.3fffffe249d0cp2 -0x1.3fffffddaa75dp2 0x1.ec0a4p-8 F +REG epsg:4635 2 OK 0x1.4032f21f49452p2 -0x1.4027e1fc10c6p2 -0x1.07de8397c8p7 0x1.4000001b0cea7p2 -0x1.3fffffe3fb2bbp2 0x1.17be7cp-7 F +REG epsg:4635 3 OK -0x1.3fc722e8e288bp2 0x1.3fdc76726c74ap2 -0x1.6dc95639ep7 -0x1.3fffffe8f1926p2 0x1.4000001df315cp2 0x1.1c24bp-7 F +REG epsg:4635 4 OK 0x1.40355e98fdd52p2 0x1.3fd93c0c1563p2 -0x1.2c469b535p7 0x1.40000013848c9p2 0x1.400000161a799p2 0x1.357812p-7 F +REG epsg:4636 0 OK -0x1.c8df6f3dfd513p-10 -0x1.89941b5ab0ec9p-10 -0x1.33ff580c34p9 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4636 1 OK -0x1.402140fb6284dp2 -0x1.401f52d01ec6fp2 -0x1.229bb4a3eep9 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4636 2 OK 0x1.3fe8256e49526p2 -0x1.401fc2a8f05ddp2 -0x1.3373f8a4cap9 0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4636 3 OK -0x1.402140fb6284dp2 0x1.3fee513c2b15ep2 -0x1.3113c89d76p9 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4636 4 OK 0x1.3fe8256e49526p2 0x1.3feec1040aa97p2 -0x1.41ec11a92cp9 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4637 0 OK -0x1.6aab8142f922cp-10 -0x1.97cd3c13a52c2p-10 -0x1.1fff76901ap9 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4637 1 OK -0x1.401ad9ea6e59ep2 -0x1.401fbd492c17bp2 -0x1.103c5dc7fp9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4637 2 OK 0x1.3fed84c6f9f7ep2 -0x1.4020161221fb1p2 -0x1.1d9b7bc33ep9 0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4637 3 OK -0x1.401ad9ea6e59ep2 0x1.3fecf653b6c02p2 -0x1.1f3a4e045ap9 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.8p-29 F +REG epsg:4637 4 OK 0x1.3fed84c6f9f7ep2 0x1.3fed4f0ebca92p2 -0x1.2c9970256p9 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4638 0 OK -0x1.f368dd754612ep-9 -0x1.ba553b42b6ebp-9 -0x1.42f39e3a2p6 -0x1.2d6cb2018701ep-61 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4638 1 OK -0x1.403e9210944d6p2 -0x1.403cd896d1f87p2 -0x1.300bdbc88p3 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4638 2 OK 0x1.3fc1b8a95ec7ap2 -0x1.403dcd3205247p2 -0x1.4c9d5f8b3p6 0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4638 3 OK -0x1.403e9210944d6p2 0x1.3fceb15e98be2p2 -0x1.2a2ffc6a2p6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4638 4 OK 0x1.3fc1b8a95ec7ap2 0x1.3fcfa5a686f07p2 -0x1.2866535bbp7 0x1.3ffffffffffffp2 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:4639 0 OK 0x1.36db3fab1562p-10 0x1.2d1b20eb9b136p-10 -0x1.f7ff530d58p8 -0x1.2d6cb2018702p-62 -0x1.c72f1eacb7b06p-62 -0x1.0p-29 T +REG epsg:4639 1 OK -0x1.3fefd46b087c3p2 -0x1.3ff3001712ef6p2 -0x1.05f50ccf0ep9 -0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4639 2 OK 0x1.4016af9177bc6p2 -0x1.3ff2b408267f6p2 -0x1.f4fdf0de88p8 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4639 3 OK -0x1.3fefd46b087c3p2 0x1.40187e16a748cp2 -0x1.f5c67d0fccp8 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4639 4 OK 0x1.4016af9177bc6p2 0x1.401831fee8c8dp2 -0x1.deda59902p8 0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4640 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4640 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4640 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4640 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4640 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4641 0 OK -0x1.a2ab5c32c19e6p-10 0x1.410c0ef35332p-10 -0x1.0d49bcd39ep9 -0x1.2d6cb2018701ep-61 0x0.0p0 0x1.0p-30 T +REG epsg:4641 1 OK -0x1.401dde850661ap2 -0x1.3ff1dae996e5cp2 -0x1.0a0873380cp9 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4641 2 OK 0x1.3fe98971e46d9p2 -0x1.3ff241596a8e4p2 -0x1.197824be2p9 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4641 3 OK -0x1.401dde850661ap2 0x1.4019d481b687p2 -0x1.fc75f8387cp8 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4641 4 OK 0x1.3fe98971e46d9p2 0x1.401a3afe34d4p2 -0x1.0daaa9dd66p9 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4642 0 OK 0x1.99bf8b37b1f14p-9 -0x1.5a2387820d486p-9 -0x1.dbf7b19f68p7 -0x1.2d6cb2018701fp-61 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:4642 1 OK -0x1.3fcc9d79bcb19p2 -0x1.402daab0a6604p2 -0x1.e44f882c1p7 -0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4642 2 OK 0x1.40330cb1f43a7p2 -0x1.402ce20c4713dp2 -0x1.6b73c9b4cp7 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4642 3 OK -0x1.3fcc9d79bcb19p2 0x1.3fd777b2e511ap2 -0x1.250e4e30ep8 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4642 4 OK 0x1.40330cb1f43a7p2 0x1.3fd6af43fb76bp2 -0x1.d1409e4878p7 0x1.3fffffffffffep2 0x1.4p2 -0x1.0p-29 F +REG epsg:4643 0 OK 0x1.4b82e7cbfe2b5p-8 0x1.7782a06915c3cp-7 0x1.d6f4cd36ccp9 -0x1.dbccb7f81fe89p-22 0x1.7fb5f25e1ecdcp-24 0x1.03df37p-4 T +REG epsg:4643 1 OK -0x1.3facac302dbc6p2 -0x1.3f3b0ebc041dap2 0x1.a634bf3b54p9 -0x1.400001cdcc1e3p2 -0x1.3fffffc3f89ccp2 0x1.20f8e2cp-4 F +REG epsg:4643 2 OK 0x1.4045922b301ffp2 -0x1.3f47195a65f21p2 0x1.cc49289594p9 0x1.3ffffe1046e0dp2 -0x1.3fffffbe13035p2 0x1.b3a63f8p-5 F +REG epsg:4643 3 OK -0x1.3fa1356d104b3p2 0x1.40be223a104acp2 0x1.dead7885b2p9 -0x1.400001b7fa3cbp2 0x1.4000006bdb3cbp2 0x1.2d68ad4p-4 F +REG epsg:4643 4 OK 0x1.4053d0c3c6492p2 0x1.40b01e8d81daap2 0x1.025a4f0e69p10 0x1.3ffffe23369dcp2 0x1.4000008ea3b8bp2 0x1.d28dcc8p-5 F +REG epsg:4644 0 OK 0x1.9c9c0d000922cp-9 -0x1.596462e2f7781p-9 -0x1.e19b7b0668p7 -0x1.2d6cb2018702p-61 0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG epsg:4644 1 OK -0x1.3fcc4b35915f3p2 -0x1.402d9ce0993bep2 -0x1.ea707d0e78p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4644 2 OK 0x1.4033718d04284p2 -0x1.402cd2d58d02p2 -0x1.70bcaf8fd8p7 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4644 3 OK -0x1.3fcc4b35915f3p2 0x1.3fd7997c6bbedp2 -0x1.2802ad1284p8 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4644 4 OK 0x1.4033718d04284p2 0x1.3fd6cfa7170fcp2 -0x1.d6514cb628p7 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4645 0 OK 0x0.0p0 0x0.0p0 -0x1.f6p7 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4645 1 OK -0x1.3ffffffffffffp2 -0x1.400257d088001p2 -0x1.f49dd1aed8p7 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4645 2 OK 0x1.3ffffffffffffp2 -0x1.400257d088001p2 -0x1.f49dd1aed8p7 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4645 3 OK -0x1.3ffffffffffffp2 0x1.400257d088001p2 -0x1.f49dd1aed8p7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4645 4 OK 0x1.3ffffffffffffp2 0x1.400257d088001p2 -0x1.f49dd1aed8p7 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4646 0 OK -0x1.2c33aacb89c7ap-8 0x1.a97f4ae0522d5p-9 0x1.6403e94b44p9 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4646 1 OK -0x1.403ea67050e3ep2 -0x1.3fc066ca485b7p2 0x1.6732c6aec4p9 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4646 2 OK 0x1.3fa88d89a1b2ep2 -0x1.3fc18c5cc1c5p2 0x1.3aecaaf356p9 0x1.3fffffffffffep2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4646 3 OK -0x1.403ea67050e3ep2 0x1.402a5cc6c4d43p2 0x1.867bb3b174p9 -0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4646 4 OK 0x1.3fa88d89a1b2ep2 0x1.402b82b986008p2 0x1.5a35b49c8p9 0x1.3fffffffffffep2 0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:4647 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:4647 1 OK 0x1.e7714578c13cbp24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.00000001d5015p2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4647 2 OK 0x1.f860fa873ec35p24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.bfffffff157f6p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4647 3 OK 0x1.e7714578c13cbp24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.00000001d5015p2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4647 4 OK 0x1.f860fa873ec35p24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.bfffffff157f6p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:4652 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4652 1 OK 0x1.7ca09dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4652 2 OK 0x1.8d922200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4652 3 OK 0x1.7ca09dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4652 4 OK 0x1.8d922200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4653 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG epsg:4653 1 OK 0x1.8be2ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4653 2 OK 0x1.9cd46200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4653 3 OK 0x1.8be2ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4653 4 OK 0x1.9cd46200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4654 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4654 1 OK 0x1.9b251dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4654 2 OK 0x1.ac16a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4654 3 OK 0x1.9b251dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4654 4 OK 0x1.ac16a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4655 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:4655 1 OK 0x1.aa675dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4655 2 OK 0x1.bb58e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4655 3 OK 0x1.aa675dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4655 4 OK 0x1.bb58e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4656 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4656 1 OK 0x1.b9a99dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4656 2 OK 0x1.ca9b2200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4656 3 OK 0x1.b9a99dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4656 4 OK 0x1.ca9b2200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4657 0 OK -0x1.d49e75e9226b3p-10 -0x1.7b4d983b038efp-15 0x1.1e6eeb3713p10 0x1.2d6cb2018701fp-61 -0x1.2f74bf1dcfcaep-67 -0x1.0p-30 T +REG epsg:4657 1 OK -0x1.401ced65780d5p2 -0x1.3ffcdf6404fefp2 0x1.2290fb4d65p10 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4657 2 OK 0x1.3fe259f8358d9p2 -0x1.3ffd520cf0947p2 0x1.19ed685685p10 0x1.3fffffffffffep2 -0x1.4p2 0x1.0p-29 F +REG epsg:4657 3 OK -0x1.401ced65780d5p2 0x1.3ffb658f785c3p2 0x1.22593460a2p10 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4657 4 OK 0x1.3fe259f8358d9p2 0x1.3ffbd837ddf4ap2 0x1.19b5a155d2p10 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4658 0 OK -0x1.bab6596003872p-12 0x1.898d241a8fe4fp-11 -0x1.63ffa20a18p7 0x1.2d6cb2018701fp-64 0x0.0p0 -0x1.0p-30 T +REG epsg:4658 1 OK -0x1.4005fa2caf4d8p2 -0x1.3ff519ab78f81p2 -0x1.6a07e4a1a8p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4658 2 OK 0x1.3ff82490dd7f4p2 -0x1.3ff534bfc87a2p2 -0x1.7a5a84ecep7 0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4658 3 OK -0x1.4005fa2caf4d8p2 0x1.400d9a0b59aeep2 -0x1.4d183af838p7 -0x1.4p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4658 4 OK 0x1.3ff82490dd7f4p2 0x1.400db521b690bp2 -0x1.5d6ad8d21p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4659 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4659 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4659 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4659 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4659 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4660 0 OK 0x1.1ef2169c1d4ecp-11 -0x1.02ba1fb25c137p-8 -0x1.4f27e8996dp10 0x1.313e0f17bf086p-22 0x1.8279e2a5418dcp-23 0x1.abb0a2ap-3 T +REG epsg:4660 1 OK -0x1.400767feee31ap2 -0x1.404c21301eadcp2 -0x1.4cc3e67f17p10 -0x1.3ffffe0e7ab6bp2 -0x1.3ffffecc919bdp2 0x1.938f334p-3 F +REG epsg:4660 2 OK 0x1.4014143465006p2 -0x1.4052b6544da0ep2 -0x1.64c201167bp10 0x1.40000104c5f97p2 -0x1.3fffff60186cbp2 0x1.afb729cp-3 F +REG epsg:4660 3 OK -0x1.3ffff5e975442p2 0x1.3fd09cfe2e6afp2 -0x1.35781d66f1p10 -0x1.3ffffea8a9e41p2 0x1.400000e4869f5p2 0x1.a76afp-3 F +REG epsg:4660 4 OK 0x1.40172a2548aafp2 0x1.3fcc8534b73a8p2 -0x1.4d79009646p10 0x1.40000064c7791p2 0x1.4000003e765dap2 0x1.b7f366ap-3 F +REG epsg:4661 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4661 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4661 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4661 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4661 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4662 0 OK 0x1.9a746bad0e04bp-9 -0x1.5a1d7aa410e1dp-9 -0x1.deafff5e48p7 0x1.2d6cb2018701dp-61 -0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4662 1 OK -0x1.3fcc8b596b692p2 -0x1.402dae96a92a2p2 -0x1.e71e1c89dp7 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4662 2 OK 0x1.403327c97229dp2 -0x1.402ce599b2be6p2 -0x1.6e0d043a6p7 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4662 3 OK -0x1.3fcc8b596b692p2 0x1.3fd77d1a9800fp2 -0x1.2674b4a194p8 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4662 4 OK 0x1.403327c97229dp2 0x1.3fd6b4532df13p2 -0x1.d3d81136c8p7 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4663 0 OK 0x1.235204a284274p-9 -0x1.72ad2ece2edc5p-9 0x1.f7bfc0b38p7 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4663 1 OK -0x1.3fd51c7bdc899p2 -0x1.402a4eb62bae9p2 0x1.fd09c6a1c8p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4663 2 OK 0x1.401df0868d2ebp2 -0x1.4029c013af5fcp2 0x1.297b91f2c8p8 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4663 3 OK -0x1.3fd51c7bdc899p2 0x1.3fcdff666329ap2 0x1.90054115ap7 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4663 4 OK 0x1.401df0868d2ebp2 0x1.3fcd70ec9a07fp2 0x1.e5f2cecb38p7 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4664 0 OK -0x1.4a1646a963b5dp-10 -0x1.05da6a5154ab9p-11 -0x1.7308a3f66p5 -0x1.2d6cb2018701ep-62 0x0.0p0 0x1.0p-30 T +REG epsg:4664 1 OK -0x1.4011fec7ebef2p2 -0x1.4007b440df4c4p2 -0x1.e421e8758p4 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4664 2 OK 0x1.3fe8bc432d2ebp2 -0x1.4008050815ab5p2 -0x1.b4ca509f4p5 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4664 3 OK -0x1.4011fec7ebef2p2 0x1.3ff766df4fb4ep2 -0x1.3f13f8dfap5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4664 4 OK 0x1.3fe8bc432d2ebp2 0x1.3ff7b7a2738fap2 -0x1.00e6b453ep6 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4665 0 OK -0x1.87c3efcc26601p-10 0x1.6757faee0217fp-12 -0x1.218b1e7d18p7 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4665 1 OK -0x1.40171dec8edd1p2 -0x1.3ffb323fa8b16p2 -0x1.0b7d8836fp7 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4665 2 OK 0x1.3fe625bfc60b9p2 -0x1.3ffb921b906b1p2 -0x1.454489cea8p7 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4665 3 OK -0x1.40171dec8edd1p2 0x1.400661d52bd7dp2 -0x1.fc8f4a246p6 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4665 4 OK 0x1.3fe625bfc60b9p2 0x1.4006c1b464925p2 -0x1.380ea2b758p7 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4666 0 OK 0x1.c1eab04dde96bp-10 -0x1.4f054021f66e2p-8 0x1.cf91f585dp7 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4666 1 OK -0x1.3fea6c74711e7p2 -0x1.405879c3c0fb9p2 0x1.0bd178a33p8 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4666 2 OK 0x1.4022a96a8306cp2 -0x1.40580b8c51e2dp2 0x1.2cfea57124p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4666 3 OK -0x1.3fea6c74711e7p2 0x1.3fb19d8028ceep2 0x1.52931d54cp7 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4666 4 OK 0x1.4022a96a8306cp2 0x1.3fb12f818ad51p2 0x1.94edba9198p7 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4667 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4667 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4667 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4667 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4667 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4668 0 OK 0x1.cd8cd8b7689c7p-11 0x1.1a1fa23446086p-10 -0x1.49ff0ad4ap7 0x0.0p0 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4668 1 OK -0x1.3ff078351448dp2 -0x1.3fefc85aef6bbp2 -0x1.6fae15acp7 -0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4668 2 OK 0x1.400d50d2c06e5p2 -0x1.3fef8fe558b69p2 -0x1.4da537c938p7 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4668 3 OK -0x1.3ff078351448dp2 0x1.4012e946fc0dp2 -0x1.463175d558p7 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4668 4 OK 0x1.400d50d2c06e5p2 0x1.4012b0cb42c0ap2 -0x1.24289f4008p7 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4669 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4669 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4669 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4669 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4669 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4670 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4670 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4670 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4670 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4670 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4671 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4671 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4671 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4671 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4671 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4672 0 OK 0x1.65f397079a54fp-12 -0x1.0be8ee700ce97p-10 -0x1.a9ffb688b4p8 0x0.0p0 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4672 1 OK -0x1.3ffca91a0e943p2 -0x1.4015510702e94p2 -0x1.a16d90315cp8 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4672 2 OK 0x1.4007d8a3fb959p2 -0x1.40153b1f8d41dp2 -0x1.9ad44551f4p8 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4672 3 OK -0x1.3ffca91a0e943p2 0x1.3ff3f530c6cb1p2 -0x1.b52054a33p8 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4672 4 OK 0x1.4007d8a3fb959p2 0x1.3ff3df4b9382p2 -0x1.ae87086b9p8 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4673 0 OK 0x1.3afbc8a52102p-14 -0x1.0ae3ef31880c1p-10 -0x1.aa7e04a8fp8 0x1.dc1bdbfa52db5p-50 0x0.0p0 0x1.81f2p-15 T +REG epsg:4673 1 OK -0x1.400102c7ef6b8p2 -0x1.40153a137ed16p2 -0x1.a0e13c492cp8 -0x1.3fffffffffffdp2 -0x1.3ffffffff611ep2 0x1.7f04p-15 F +REG epsg:4673 2 OK 0x1.400378b2e587bp2 -0x1.40152b621337cp2 -0x1.9c7413887p8 0x1.4000000000001p2 -0x1.3ffffffff611ep2 0x1.7f08p-15 F +REG epsg:4673 3 OK -0x1.400102c7ef6b8p2 0x1.3ff3febd1c586p2 -0x1.b480cf9228p8 -0x1.3fffffffffffep2 0x1.3ffffffff611dp2 0x1.7f06p-15 F +REG epsg:4673 4 OK 0x1.400378b2e587bp2 0x1.3ff3f00d333b8p2 -0x1.b013a5eb6p8 0x1.4000000000001p2 0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:4674 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4674 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4674 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4674 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4674 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4675 0 OK 0x1.2400206672ad9p-9 -0x1.3307c1e106897p-9 0x1.e9c308cdp4 0x1.2d6cb2018701ep-62 0x0.0p0 0x0.0p0 T +REG epsg:4675 1 OK -0x1.3fda368fdd20cp2 -0x1.402b52cc48d05p2 0x1.058e25f2cp5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4675 2 OK 0x1.4023361ee6023p2 -0x1.402ac3d01a1d2p2 0x1.2f0881fddp6 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4675 3 OK -0x1.3fda368fdd20cp2 0x1.3fdedd16a4dp2 -0x1.8e8fe76f8p3 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4675 4 OK 0x1.4023361ee6023p2 0x1.3fde4e3c4153p2 0x1.e9bf0a26p4 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4676 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4676 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4676 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4676 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4676 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4677 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4677 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4677 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4677 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4677 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4678 0 OK 0x1.34fd998f2e403p-10 0x1.76ff84fa3e7bp-12 -0x1.312ac40a78p7 -0x1.2d6cb2018702p-61 -0x1.2f74bf1dcfcafp-64 -0x1.0p-29 T +REG epsg:4678 1 OK -0x1.3fed433c0bf2bp2 -0x1.3ffad0b3e2313p2 -0x1.4e3565683p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4678 2 OK 0x1.4013e2aebf031p2 -0x1.3ffa851934994p2 -0x1.20a3879d08p7 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4678 3 OK -0x1.3fed433c0bf2bp2 0x1.40067d0c85932p2 -0x1.406c2a6ddp7 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4678 4 OK 0x1.4013e2aebf031p2 0x1.4006316f1d312p2 -0x1.12da4fe27p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4679 0 OK -0x1.2a31d594d7d72p-9 -0x1.5933f72f8aed2p-9 -0x1.00fc79e8ep5 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4679 1 OK -0x1.40243e3819cbbp2 -0x1.4032a17104258p2 0x1.148f66e58p4 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4679 2 OK 0x1.3fd9b23e74dc6p2 -0x1.4033337aa6f0bp2 -0x1.ab13ef34p4 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4679 3 OK -0x1.40243e3819cbbp2 0x1.3fdcaa537fc89p2 -0x1.0bd1dff4cp5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4679 4 OK 0x1.3fd9b23e74dc6p2 0x1.3fdd3c365516cp2 -0x1.35d221e03p6 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4680 0 OK 0x1.2b135735018fap-11 0x1.4d22336779a06p-9 -0x1.d946e319f8p7 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4680 1 OK -0x1.3ff841dac8eddp2 -0x1.3fe127f0a4fccp2 -0x1.070dc8e978p8 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4680 2 OK 0x1.400af2f0e78dap2 -0x1.3fe1035b95b3bp2 -0x1.f80dcb29e8p7 0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4680 3 OK -0x1.3ff841dac8eddp2 0x1.40341db29104fp2 -0x1.ac21c79f98p7 -0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4680 4 OK 0x1.400af2f0e78dap2 0x1.4033f9141e09p2 -0x1.96140c23ap7 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4681 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4681 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4681 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4681 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4681 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4682 0 OK -0x1.b1421c7d95526p-8 -0x1.357f56c25065p-9 0x1.20805ceb26p9 0x1.2d6cb2018701fp-60 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:4682 1 OK -0x1.406ff6bdbba09p2 -0x1.4024a524b271ap2 0x1.4c359cf27p9 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4682 2 OK 0x1.3f97571d4f16bp2 -0x1.40264d653537ap2 0x1.0c501e30dep9 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4682 3 OK -0x1.406ff6bdbba09p2 0x1.3fd7925f9d128p2 0x1.35741e31f4p9 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4682 4 OK 0x1.3f97571d4f16bp2 0x1.3fd93a3b0a95ep2 0x1.eb1d02b814p8 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4683 0 OK 0x1.5b725a5963c91p-13 0x1.d6fcb670e3c96p-10 0x1.03ef1c02p6 0x1.5c08634a71b59p-26 0x1.c314e808e7472p-28 0x1.04a76p-8 T +REG epsg:4683 1 OK -0x1.3ffa43cbe1d01p2 -0x1.3fe87002808fdp2 0x1.be5819862p5 -0x1.3fffffe7d3903p2 -0x1.3ffffff94f2f4p2 0x1.c28548p-9 F +REG epsg:4683 2 OK 0x1.40021c5728f98p2 -0x1.3fe5d60864c01p2 0x1.0dd69f978p6 0x1.400000149b504p2 -0x1.3ffffffa951e6p2 0x1.167df4p-8 F +REG epsg:4683 3 OK -0x1.3ffd053682654p2 0x1.4020a190d300ep2 0x1.00a4eaccp6 -0x1.3fffffe9a84f5p2 0x1.4000000912768p2 0x1.e7e94p-9 F +REG epsg:4683 4 OK 0x1.400007fbd8a41p2 0x1.4022ee0b6a5ccp2 0x1.2f6357ee1p6 0x1.4000001290454p2 0x1.400000067a76bp2 0x1.2499d4p-8 F +REG epsg:4684 0 OK 0x1.79f346adec988p-9 -0x1.da275b874d9e9p-12 -0x1.d7f786ceep6 0x1.c4230b024a82bp-60 -0x1.c72f1eacb7b02p-63 0x1.0p-29 T +REG epsg:4684 1 OK -0x1.3fcf0b70fae94p2 -0x1.40085f86bc843p2 -0x1.1ba51592fp7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4684 2 OK 0x1.402d87a632004p2 -0x1.4007a68aa2c35p2 -0x1.58548d034p6 0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4684 3 OK -0x1.3fcf0b70fae94p2 0x1.3ff99d00f789bp2 -0x1.2d138323fp7 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4684 4 OK 0x1.402d87a632004p2 0x1.3ff8e40d4f492p2 -0x1.7b31540bbp6 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4685 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4685 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4685 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4685 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4685 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4686 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4686 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4686 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4686 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4686 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4687 0 OK 0x1.b4224cbf0e7c5p-18 0x1.34a5acde572c8p-19 -0x1.9f9b32p-7 0x1.0a608a231fcedp-47 -0x1.87151bbc245b3p-43 0x1.2p-27 T +REG epsg:4687 1 OK -0x1.3fffe32188674p2 -0x1.3ffff8a536cd5p2 -0x1.3d62c3p-4 -0x1.4000000000024p2 -0x1.40000000000e5p2 0x1.8p-27 F +REG epsg:4687 2 OK 0x1.40001d56a091p2 -0x1.3ffff49caf4bap2 0x1.57eae6p-7 0x1.4000000000031p2 -0x1.40000000000e3p2 0x1.0p-26 F +REG epsg:4687 3 OK -0x1.3fffe6d3f1a1ep2 0x1.4000081ea855cp2 -0x1.1d4d9ap-5 -0x1.4000000000023p2 0x1.3ffffffffff63p2 0x1.cp-28 F +REG epsg:4687 4 OK 0x1.400019a6ed544p2 0x1.40000b919b713p2 0x1.b4631cp-5 0x1.4000000000034p2 0x1.3ffffffffff66p2 0x1.4p-28 F +REG epsg:4688 0 OK -0x1.cf79ef04a4b2cp-8 -0x1.040d197167812p-8 -0x1.bde71fb70ep10 0x1.b0cda7364c925p-19 -0x1.d341da45dfb41p-22 0x1.8626898p-1 T +REG epsg:4688 1 OK -0x1.40688774b3268p2 -0x1.4053fb5f115e1p2 -0x1.6ccfaccefbp10 -0x1.3ffff11aea007p2 -0x1.400002d68956bp2 0x1.69d9da38p-1 F +REG epsg:4688 2 OK 0x1.3f9b828e35a02p2 -0x1.403b58d2267ep2 -0x1.9b9e5a1d11p10 0x1.40000b184ce12p2 -0x1.400001c77ebacp2 0x1.a7aafbc8p-1 F +REG epsg:4688 3 OK -0x1.40881cf68ed7fp2 0x1.3fb7621033b02p2 -0x1.de895729fp10 -0x1.3ffff07ba6b49p2 0x1.3ffffe9bae5p2 0x1.5fda3e3p-1 F +REG epsg:4688 4 OK 0x1.3f85abb98fd0ap2 0x1.3fd4df63555d8p2 -0x1.06a5840cf08p11 0x1.40000bc5827dbp2 0x1.3ffffed87d3cdp2 0x1.a0be903p-1 F +REG epsg:4689 0 OK -0x1.64572c55fd45fp-11 -0x1.30feac94ab04cp-14 -0x1.82201d7c5ep9 -0x1.1878e0ca9ffe5p-27 -0x1.401dcd78f9p-29 0x1.d5752p-11 T +REG epsg:4689 1 OK -0x1.40115be624fafp2 -0x1.4007bb795b0bfp2 -0x1.7a5513175ap9 -0x1.400000088e8c5p2 -0x1.40000002e5ad9p2 0x1.20a7dp-10 F +REG epsg:4689 2 OK 0x1.3ff90e7f0fa95p2 -0x1.4009ea44403f4p2 -0x1.7f1baef71ep9 0x1.3ffffff7af9b7p2 -0x1.400000038e098p2 0x1.a0d1cp-11 F +REG epsg:4689 3 OK -0x1.400f7d57b1c1p2 0x1.40076ac7f4843p2 -0x1.8152f20c74p9 -0x1.40000008fc9d7p2 0x1.3ffffffe61b5ap2 0x1.0b3bcp-10 F +REG epsg:4689 4 OK 0x1.3ffb40108ddf2p2 0x1.40057b722b36p2 -0x1.861ba27bc2p9 0x1.3ffffff754ce4p2 0x1.3ffffffe41935p2 0x1.6e8bp-11 F +REG epsg:4690 0 OK -0x1.28521510fc77ap-10 -0x1.047cf4b1f6adp-9 -0x1.10d9a99daep9 -0x1.32ac7835b657ep-28 -0x1.85b8ededfc1d5p-29 0x1.a8748p-12 T +REG epsg:4690 1 OK -0x1.40147af1dc4bfp2 -0x1.402669e54895ap2 -0x1.014ddc271p9 -0x1.4000000503da1p2 -0x1.400000035f9f3p2 0x1.2125cp-11 F +REG epsg:4690 2 OK 0x1.3ff1520d89bbp2 -0x1.4024da877d0efp2 -0x1.0e96787e08p9 0x1.3ffffffbe1d84p2 -0x1.40000003d2d2cp2 0x1.94878p-12 F +REG epsg:4690 3 OK -0x1.4016437d0002dp2 0x1.3fe3a3f33589ep2 -0x1.10bd71f2bp9 -0x1.400000055db08p2 0x1.3ffffffdb437ep2 0x1.d6b5cp-12 F +REG epsg:4690 4 OK 0x1.3fef5873d122ep2 0x1.3fe5e39c63559p2 -0x1.1e0426f212p9 0x1.3ffffffb9f761p2 0x1.3ffffffd8b7dcp2 0x1.1d62cp-12 F +REG epsg:4691 0 OK -0x1.0c057a383a325p-10 -0x1.0eef29cd7029cp-9 -0x1.0aabecd388p9 -0x1.fed9778fe535cp-28 -0x1.5fb9029aed279p-28 0x1.4a41cp-11 T +REG epsg:4691 1 OK -0x1.40124c853590cp2 -0x1.4027fda6c293fp2 -0x1.f6a0cb467cp8 -0x1.400000088d172p2 -0x1.400000062ed05p2 0x1.cffb8p-11 F +REG epsg:4691 2 OK 0x1.3ff35e4263735p2 -0x1.4025b8e87713ep2 -0x1.084ecbb3fap9 0x1.3ffffff951ddfp2 -0x1.40000006ea17bp2 0x1.3f15ep-11 F +REG epsg:4691 3 OK -0x1.4014c0c9a1f9dp2 0x1.3fe1ea52ef2e1p2 -0x1.0ab5b4f57ep9 -0x1.400000091fbe3p2 0x1.3ffffffbe3922p2 0x1.6e4fap-11 F +REG epsg:4691 4 OK 0x1.3ff0ae4262d07p2 0x1.3fe4db7e842ap2 -0x1.17b17eb128p9 0x1.3ffffff8e98cbp2 0x1.3ffffffba4591p2 0x1.a8438p-12 F +REG epsg:4692 0 OK -0x1.9991e4566ad8bp-11 -0x1.c660d0c54237cp-13 -0x1.d4094f0344p8 0x1.2d6cb2018702p-62 0x0.0p0 -0x1.0p-29 T +REG epsg:4692 1 OK -0x1.400f97eb3da2fp2 -0x1.400892c8aa7b6p2 -0x1.c80eb4a3fp8 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4692 2 OK 0x1.3ff5fef8100b7p2 -0x1.4008c4e6f6a5bp2 -0x1.d72880eef8p8 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4692 3 OK -0x1.400f97eb3da2fp2 0x1.40018054664fap2 -0x1.cc3bc70b5p8 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.8p-29 F +REG epsg:4692 4 OK 0x1.3ff5fef8100b7p2 0x1.4001b27199e1ap2 -0x1.db5593fd5p8 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4693 0 OK 0x1.69b5a2683b9bcp-20 -0x1.9cb3415bbe6e3p-18 0x1.4p-25 -0x1.2d6cb2018701fp-72 0x1.2f74bf1dcfcaep-70 -0x1.0p-30 T +REG epsg:4693 1 OK -0x1.3ffffa5932e1p2 -0x1.400019bca357cp2 0x1.7ad132p-5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4693 2 OK 0x1.400005a6cd1e7p2 -0x1.400019a682c7cp2 0x1.281918p-4 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4693 3 OK -0x1.3ffffa5932e1p2 0x1.3fffe6597d2ep2 -0x1.2819038p-4 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4693 4 OK 0x1.400005a6cd1e7p2 0x1.3fffe6435ca17p2 -0x1.7ad10a8p-5 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4694 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4694 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4694 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4694 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4694 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4695 0 OK 0x1.6a3b2a0d54926p-14 0x1.2f6a1da9cdfa8p-9 0x1.12cf36416p5 0x1.2d6cb2018701ep-66 0x0.0p0 0x1.0p-30 T +REG epsg:4695 1 OK -0x1.3ffd3fcdb23c1p2 -0x1.3fdeff5d929a5p2 0x1.8710f0bep3 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4695 2 OK 0x1.4000143f5515ap2 -0x1.3fdef9d3e002dp2 0x1.bc7cec7bp3 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4695 3 OK -0x1.3ffd3fcdb23c1p2 0x1.402a8e7ff9192p2 0x1.c6b51ed84p5 -0x1.3fffffffffffep2 0x1.4p2 -0x1.0p-29 F +REG epsg:4695 4 OK 0x1.4000143f5515ap2 0x1.402a88f4fb14fp2 0x1.d410179e2p5 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4696 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4696 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4696 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4696 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4696 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4697 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4697 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4697 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4697 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4697 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4698 0 OK 0x1.b85f5c275ae46p-10 -0x1.e86658416e0cp-11 -0x1.8bff15777p8 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG epsg:4698 1 OK -0x1.3fe6582dfd83p2 -0x1.40139f450becfp2 -0x1.91764ea1ap8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4698 2 OK 0x1.401d63bd27952p2 -0x1.4013337b52ecp2 -0x1.70fd3f6638p8 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4698 3 OK -0x1.3fe6582dfd83p2 0x1.3ff53730efc7cp2 -0x1.a36accb94p8 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4698 4 OK 0x1.401d63bd27952p2 0x1.3ff4cb71590c5p2 -0x1.82f1b775ep8 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4699 0 OK -0x1.74f7c83c86decp-10 0x1.274605e5b3044p-8 0x1.48fcffc088p9 -0x1.2d6cb2018701ep-62 0x0.0p0 0x0.0p0 T +REG epsg:4699 1 OK -0x1.400d652322facp2 -0x1.3fb55848270f1p2 0x1.388d4782eep9 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4699 2 OK 0x1.3fdec674f5cfbp2 -0x1.3fb5b37650555p2 0x1.2accedad14p9 0x1.3ffffffffffffp2 -0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:4699 3 OK -0x1.400d652322facp2 0x1.4048687eb1b05p2 0x1.63f8e6a96cp9 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4699 4 OK 0x1.3fdec674f5cfbp2 0x1.4048c3d65d2bap2 0x1.5638992da6p9 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4700 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4700 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4700 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4700 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4700 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4701 0 OK 0x1.7410fa430d02fp-10 0x1.90756e253f522p-10 -0x1.01ed240bap5 0x0.0p0 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:4701 1 OK -0x1.3fe7b7b43e92ep2 -0x1.3fef2e53c5e3fp2 -0x1.d5223a344p5 -0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4701 2 OK 0x1.4016398652a2ep2 -0x1.3feed34b50504p2 -0x1.f34a2401cp4 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4701 3 OK -0x1.3fe7b7b43e92ep2 0x1.40210b44312eep2 -0x1.d32958e18p4 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4701 4 OK 0x1.4016398652a2ep2 0x1.4020b02db10c5p2 -0x1.c2f8e2f8p0 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4702 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4702 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4702 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4702 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4702 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4703 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4703 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4703 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4703 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4703 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4704 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4704 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4704 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4704 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4704 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4705 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4705 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4705 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4705 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4705 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4706 0 OK -0x1.093958d14a8b8p-10 -0x1.333deb87331ap-15 0x1.4cd80f437p6 -0x1.2d6cb2018701dp-62 0x0.0p0 0x1.0p-29 T +REG epsg:4706 1 OK -0x1.400eb186c8ebdp2 -0x1.3ffe84599c083p2 0x1.70d791c4p6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4706 2 OK 0x1.3fed8a928b2b1p2 -0x1.3ffec53f1d327p2 0x1.229ca3cc6p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4706 3 OK -0x1.400eb186c8ebdp2 0x1.3ffd524d0ef65p2 0x1.6e04aee1p6 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4706 4 OK 0x1.3fed8a928b2b1p2 0x1.3ffd933252b34p2 0x1.1fc9c056fp6 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4707 0 OK 0x1.112bc14c3e368p-10 0x1.8abf95c627fcp-9 -0x1.6cfd7d4db8p8 0x1.2d6cb2018701bp-61 0x1.2f74bf1dcfcabp-61 0x1.0p-28 T +REG epsg:4707 1 OK -0x1.3ff06528475f3p2 -0x1.3fd2c9b2bd763p2 -0x1.92874e210cp8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4707 2 OK 0x1.40128a673c341p2 -0x1.3fd286e355287p2 -0x1.7e6288f2d8p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4707 3 OK -0x1.3ff06528475f3p2 0x1.4035178ddf322p2 -0x1.587ae304dp8 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4707 4 OK 0x1.40128a673c341p2 0x1.4034d4aa24259p2 -0x1.445629ef1p8 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4708 0 OK 0x1.9e6d49f188314p-13 -0x1.01cc962133d24p-8 0x1.d403d51d94p8 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4708 1 OK -0x1.3ff670cc37a7ap2 -0x1.4039ec759382fp2 0x1.f44a31899cp8 -0x1.4000000000001p2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4708 2 OK 0x1.3ffcea76d56p2 -0x1.4039dfc67d1a6p2 0x1.f81c1977d8p8 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4708 3 OK -0x1.3ff670cc37a7ap2 0x1.3fb98631661c7p2 0x1.a878598cb8p8 -0x1.4p2 0x1.4p2 0x1.0p-29 F +REG epsg:4708 4 OK 0x1.3ffcea76d56p2 0x1.3fb97987583cdp2 0x1.ac4a4479c4p8 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4709 0 OK -0x1.613d6ee36392dp-11 0x1.42704e255050cp-9 -0x1.8bfe646c3p8 -0x1.2d6cb2018701dp-62 0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4709 1 OK -0x1.400ce7d2665dp2 -0x1.3fdbf9bd3f112p2 -0x1.9b6567be4cp8 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4709 2 OK 0x1.3ff6d42082946p2 -0x1.3fdc24f0d93f7p2 -0x1.a86b898748p8 0x1.3ffffffffffffp2 -0x1.4000000000003p2 -0x1.8p-29 F +REG epsg:4709 3 OK -0x1.400ce7d2665dp2 0x1.402c45ade539bp2 -0x1.6bfb236f6cp8 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4709 4 OK 0x1.3ff6d42082946p2 0x1.402c70ec3b16dp2 -0x1.79013ed514p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4710 0 OK -0x1.43c79a91108dap-8 0x1.24c802b6cbebdp-8 0x1.142c00cd3p6 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4710 1 OK -0x1.404cd274c2c84p2 -0x1.3fb4b23485142p2 0x1.2000e58f7p6 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4710 2 OK 0x1.3faaefb1264c1p2 -0x1.3fb5eed26e1a1p2 -0x1.78061f61p4 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4710 3 OK -0x1.404cd274c2c84p2 0x1.4046847b0f3aep2 0x1.3c376b4fdp7 -0x1.3ffffffffffffp2 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:4710 4 OK 0x1.3faaefb1264c1p2 0x1.4047c1a7e3b84p2 0x1.f4db7ae66p5 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4711 0 OK 0x1.1386b9c07f2d3p-9 0x1.da2c48252c245p-13 -0x1.76fee37338p8 0x0.0p0 -0x1.2f74bf1dcfcaep-65 0x1.0p-30 T +REG epsg:4711 1 OK -0x1.3fdf281bb1fdep2 -0x1.400082f14d897p2 -0x1.8bdbb2bed8p8 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4711 2 OK 0x1.40240956ae455p2 -0x1.3ffffc187acbfp2 -0x1.6339469b18p8 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-29 F +REG epsg:4711 3 OK -0x1.3fdf281bb1fdep2 0x1.4007e446ef0d5p2 -0x1.87800c3274p8 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4711 4 OK 0x1.40240956ae455p2 0x1.40075d6b08616p2 -0x1.5edda1e3a8p8 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4712 0 OK -0x1.f7ed9420f8b1ep-11 -0x1.f698e59a83eafp-12 -0x1.6ffdb53a6p5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4712 1 OK -0x1.400d1b97c99e8p2 -0x1.400768738d66fp2 -0x1.07a449f3ep5 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4712 2 OK 0x1.3fed9cf280698p2 -0x1.4007a61c78322p2 -0x1.9c479b338p5 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4712 3 OK -0x1.400d1b97c99e8p2 0x1.3ff7c3491d74ap2 -0x1.518ca8c48p5 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4712 4 OK 0x1.3fed9cf280698p2 0x1.3ff800ef0c8b6p2 -0x1.e63008388p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4713 0 OK 0x1.2d6bc38635961p-10 -0x1.50adf1fff07c2p-10 -0x1.192311f6ap5 -0x1.2d6cb2018701ep-63 0x0.0p0 0x0.0p0 T +REG epsg:4713 1 OK -0x1.3fec2b909a848p2 -0x1.401d13abbfb98p2 -0x1.fd121ec8cp4 -0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4713 2 OK 0x1.4011d8ca7d7a8p2 -0x1.401cc9e1b11dcp2 -0x1.32e39e408p3 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4713 3 OK -0x1.3fec2b909a848p2 0x1.3ff327c0016c3p2 -0x1.c492a37bep5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4713 4 OK 0x1.4011d8ca7d7a8p2 0x1.3ff2ddff83133p2 -0x1.12c24e1eep5 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4714 0 OK 0x1.c4b772722485ep-8 -0x1.17c03f8a5524bp-8 -0x1.efbe8680dp6 0x1.2d6cb2018701ep-60 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4714 1 OK -0x1.3f8d2ff0c6274p2 -0x1.40473d9c719p2 -0x1.2bacd8f528p7 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4714 2 OK 0x1.406f8a3314ff2p2 -0x1.4045821eaa16ap2 -0x1.04e410dp4 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4714 3 OK -0x1.3f8d2ff0c6274p2 0x1.3fbbe81bacd4cp2 -0x1.d03a77313p7 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4714 4 OK 0x1.406f8a3314ff2p2 0x1.3fba2d5cd779dp2 -0x1.8a527a1c3p6 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4715 0 OK 0x1.2fc646c6fca29p-10 -0x1.1b4ee35e6ad1bp-9 -0x1.25fd0620d8p7 -0x1.2d6cb2018702p-61 0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG epsg:4715 1 OK -0x1.3febace90c993p2 -0x1.40246d217a517p2 -0x1.12ec96d4a8p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4715 2 OK 0x1.4011a572ef535p2 -0x1.402422c3d9587p2 -0x1.cc3f66788p6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4715 3 OK -0x1.3febace90c993p2 0x1.3fdddfc23fa45p2 -0x1.663f09287p7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4715 4 OK 0x1.4011a572ef535p2 0x1.3fdd9574d6d3dp2 -0x1.39721241d8p7 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4716 0 OK 0x1.65f55b6d0589cp-9 0x1.bc8ca3c766639p-9 -0x1.127da6e59ap9 0x1.2d6cb2018701ep-61 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4716 1 OK -0x1.3fd717ed6745ap2 -0x1.3fcf2a610bb98p2 -0x1.2e8dd19ff2p9 -0x1.4000000000001p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4716 2 OK 0x1.403094ad09937p2 -0x1.3fce7b49ce2b7p2 -0x1.1428796b7ep9 0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4716 3 OK -0x1.3fd717ed6745ap2 0x1.403ddf309a90ep2 -0x1.0dde3413fp9 -0x1.4000000000002p2 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:4716 4 OK 0x1.403094ad09937p2 0x1.403d2fdd61369p2 -0x1.e6f1db71e8p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4717 0 OK -0x1.639632adff936p-10 -0x1.ad2346837162bp-10 -0x1.0d951f33dp6 0x1.2d6cb2018701fp-62 0x0.0p0 -0x1.0p-30 T +REG epsg:4717 1 OK -0x1.401632a368028p2 -0x1.40209f4d31c76p2 -0x1.25c84521p5 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4717 2 OK 0x1.3fe9c027211dap2 -0x1.4020f65a58c12p2 -0x1.f78c70dp5 0x1.3ffffffffffffp2 -0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:4717 3 OK -0x1.401632a368028p2 0x1.3feb303e339e5p2 -0x1.111a0bc92p6 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4717 4 OK 0x1.3fe9c027211dap2 0x1.3feb873cf94c4p2 -0x1.79fc43dc3p6 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4718 0 OK 0x1.d4a35040cf06bp-10 0x1.bdbae4c5484acp-8 -0x1.e0f3c776fp8 0x0.0p0 0x0.0p0 0x1.0p-30 T +REG epsg:4718 1 OK -0x1.3fe5ac256ede1p2 -0x1.3f96864dbaff6p2 -0x1.18ab3c7d88p9 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.8p-29 F +REG epsg:4718 2 OK 0x1.4020402cca016p2 -0x1.3f9613c4e07f3p2 -0x1.0763ddea96p9 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4718 3 OK -0x1.3fe5ac256ede1p2 0x1.40748664ec4bfp2 -0x1.ae3f2989e8p8 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4718 4 OK 0x1.4020402cca016p2 0x1.4074138d54d9ap2 -0x1.8bb09b4058p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4719 0 OK -0x1.5a2dc2f4cdadp-10 -0x1.072b6bf06ab2ep-10 -0x1.cdff513facp8 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4719 1 OK -0x1.40185a40da177p2 -0x1.401546b85410ep2 -0x1.b543a8aad8p8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4719 2 OK 0x1.3fed14d14eefdp2 -0x1.40159b74a1ff3p2 -0x1.ceca97173cp8 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4719 3 OK -0x1.40185a40da177p2 0x1.3ff482014147ap2 -0x1.c89d3067p8 -0x1.3fffffffffffep2 0x1.4p2 0x1.0p-29 F +REG epsg:4719 4 OK 0x1.3fed14d14eefdp2 0x1.3ff4d6b4f9666p2 -0x1.e22423ef6cp8 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4720 0 OK -0x1.42ba77d6fd961p-13 -0x1.556355976cdaap-15 0x1.1d018f6p-1 0x0.0p0 0x0.0p0 0x1.81fap-15 T +REG epsg:4720 1 OK -0x1.40028574efadfp2 -0x1.4000a8b65d726p2 0x1.e508ad4p-1 -0x1.4p2 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:4720 2 OK 0x1.3ffd7a8b1051ep2 -0x1.4000a8b65d725p2 0x1.e508ad48p-1 0x1.3fffffffffffep2 -0x1.3ffffffff611dp2 0x1.7f0ep-15 F +REG epsg:4720 3 OK -0x1.40028574efadfp2 0x1.3fff54a63cabap2 0x1.4dae6f6p-3 -0x1.4000000000001p2 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:4720 4 OK 0x1.3ffd7a8b1051ep2 0x1.3fff54a63cab9p2 0x1.4dae6f8p-3 0x1.3fffffffffffep2 0x1.3ffffffff611cp2 0x1.7f08p-15 F +REG epsg:4721 0 OK -0x1.c53fe33eca68ap-9 0x1.cc112c9f585acp-10 -0x1.0201552f56p9 0x0.0p0 0x0.0p0 0x1.0p-30 T +REG epsg:4721 1 OK -0x1.403c112dfb334p2 -0x1.3fe8ad3beb068p2 -0x1.f0cbda29fcp8 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4721 2 OK 0x1.3fcac1f45a9cep2 -0x1.3fe98b012b79dp2 -0x1.19d21a9b74p9 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4721 3 OK -0x1.403c112dfb334p2 0x1.4021f624e37fdp2 -0x1.cef83bab6p8 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4721 4 OK 0x1.3fcac1f45a9cep2 0x1.4022d41171111p2 -0x1.08e83faa3cp9 0x1.3fffffffffffcp2 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:4722 0 OK -0x1.18321f87b048cp-10 0x1.61352ad72b976p-9 0x1.0f810a012ep9 0x1.2d6cb2018701fp-62 0x0.0p0 -0x1.0p-30 T +REG epsg:4722 1 OK -0x1.40074a101e29cp2 -0x1.3fcc041f46949p2 0x1.0503d65f14p9 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4722 2 OK 0x1.3fe44404583dep2 -0x1.3fcc48a29f1ccp2 0x1.f55e4a224p8 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4722 3 OK -0x1.40074a101e29cp2 0x1.4023f9ab2ca24p2 0x1.1efc206e98p9 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4722 4 OK 0x1.3fe44404583dep2 0x1.40243e412b788p2 0x1.14a774ad5ap9 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4723 0 OK -0x1.1497c7ddcb0b4p-10 0x1.4beee1a954339p-9 0x1.8dd22d9dcp7 0x1.7338b1ba62431p-24 0x1.149d66b342348p-24 0x1.faaf6p-7 T +REG epsg:4723 1 OK -0x1.400b98ec724abp2 -0x1.3fddac0a1584ap2 0x1.7d900bcc6p7 -0x1.3fffff9e582f2p2 -0x1.3fffffba7ee0ap2 0x1.99363p-7 F +REG epsg:4723 2 OK 0x1.3fef37c9360ep2 -0x1.3fd73cbbcc1d7p2 0x1.959c755c68p7 0x1.400000617be0fp2 -0x1.3fffffc400fb7p2 0x1.0697a9p-6 F +REG epsg:4723 3 OK -0x1.40125af468ab5p2 0x1.402a0d78f5e5p2 0x1.87b9449eep7 -0x1.3fffffa9a702bp2 0x1.4000004e824dfp2 0x1.f0fcb8p-7 F +REG epsg:4723 4 OK 0x1.3fe995df70164p2 0x1.40302cd10c9cep2 0x1.9fdf108218p7 0x1.40000054184f9p2 0x1.4000003f5dda9p2 0x1.2b2bbcp-6 F +REG epsg:4724 0 OK 0x1.0019fc8e16232p-8 0x1.0f77b6713a94ep-9 -0x1.cafb249084p8 0x1.2d6cb2018701ep-61 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG epsg:4724 1 OK -0x1.3fc2a77bc2a0fp2 -0x1.3fe3b4d684e18p2 -0x1.013831b5d4p9 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4724 2 OK 0x1.4042b3a29025bp2 -0x1.3fe2ba3e0180ep2 -0x1.b6e63eae6cp8 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4724 3 OK -0x1.3fc2a77bc2a0fp2 0x1.40274f6a4732fp2 -0x1.da84ddd044p8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4724 4 OK 0x1.4042b3a29025bp2 0x1.4026549d5a3ebp2 -0x1.8efad8446cp8 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4725 0 OK 0x1.7414fe4e4f9a7p-11 0x1.deeb6c3011301p-10 -0x1.b7ff0ce0b8p8 0x0.0p0 -0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:4725 1 OK -0x1.3ff6ce70ac75dp2 -0x1.3fe70c0b6ac3cp2 -0x1.ce55a9437cp8 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4725 2 OK 0x1.400e0f9978751p2 -0x1.3fe6de884608dp2 -0x1.c09db02c94p8 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4725 3 OK -0x1.3ff6ce70ac75dp2 0x1.4022adfd47663p2 -0x1.ab1f21c22p8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4725 4 OK 0x1.400e0f9978751p2 0x1.40228071bd3c7p2 -0x1.9d672daa74p8 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4726 0 OK -0x1.6e4705ed41867p-12 -0x1.2ae5f3a2ccf0fp-9 0x1.2d6292f37p6 -0x1.51fed3d75b36ap-30 0x1.b17c8aea17f46p-30 0x1.163248p-9 T +REG epsg:4726 1 OK -0x1.4005c3357a08dp2 -0x1.402ba27f06f68p2 0x1.619861809p6 -0x1.400000018402p2 -0x1.3ffffffe17244p2 0x1.155338p-9 F +REG epsg:4726 2 OK 0x1.3ffaa02a3933fp2 -0x1.402b33cb36dd7p2 0x1.862834de1p6 0x1.3ffffffd3190dp2 -0x1.3ffffffc6981bp2 0x1.0b10e8p-9 F +REG epsg:4726 3 OK -0x1.4005e97c98c79p2 0x1.3fe0e30f6d522p2 0x1.c70ccd57ap5 -0x1.3fffffffc4c4p2 0x1.3fffffffb1cc6p2 0x1.192188p-9 F +REG epsg:4726 4 OK 0x1.3ffa27e3da756p2 0x1.3fe1151561ae1p2 0x1.0818dadep6 0x1.3ffffffee3c3p2 0x1.4000000173f3fp2 0x1.1705fp-9 F +REG epsg:4727 0 OK 0x1.7d83bd16910c8p-11 -0x1.4861165f42adep-9 -0x1.46ff28b2eep9 0x1.2d6cb2018701ep-63 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4727 1 OK -0x1.3ff94475c064bp2 -0x1.403081c36fbe8p2 -0x1.3c908377fep9 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4727 2 OK 0x1.40111c891414p2 -0x1.4030530deaee2p2 -0x1.3588060b44p9 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4727 3 OK -0x1.3ff94475c064bp2 0x1.3fdebb12b0ed2p2 -0x1.54b579946ep9 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4727 4 OK 0x1.40111c891414p2 0x1.3fde8c68fa861p2 -0x1.4dacf8a45p9 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4728 0 OK 0x1.b146e920e09f8p-11 -0x1.2d1450b30ea5ep-10 0x1.c003f7382p5 0x0.0p0 0x1.c72f1eacb7b05p-62 0x0.0p0 T +REG epsg:4728 1 OK -0x1.3fee81f1e02d8p2 -0x1.40113de0b37cep2 0x1.cb8afaa0ep5 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4728 2 OK 0x1.40099633fa838p2 -0x1.401108db7b9e6p2 0x1.25abb93a2p6 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4728 3 OK -0x1.3fee81f1e02d8p2 0x1.3febc0b84a87dp2 0x1.1a7216a4p5 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4728 4 OK 0x1.40099633fa838p2 0x1.3feb8bb9380dap2 0x1.9a3eabbaap5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4729 0 OK -0x1.849100141b77bp-10 -0x1.8e4f237a5ad7dp-12 -0x1.b3ff6b008p8 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4729 1 OK -0x1.401aaab9d944fp2 -0x1.400abc986ac02p2 -0x1.9fe9daaea8p8 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4729 2 OK 0x1.3fea18eb7b794p2 -0x1.400b1bb1a11b9p2 -0x1.bc90f56284p8 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4729 3 OK -0x1.401aaab9d944fp2 0x1.3ffe5680244edp2 -0x1.a73c27a50cp8 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4729 4 OK 0x1.3fea18eb7b794p2 0x1.3ffeb595b53e5p2 -0x1.c3e3448464p8 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4730 0 OK -0x1.8ba15cb4dcac5p-12 -0x1.8e4ee5ad8732dp-11 -0x1.a4ffd270b4p8 0x1.2d6cb2018701fp-64 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG epsg:4730 1 OK -0x1.40085ede861fap2 -0x1.4010e1af46c32p2 -0x1.980c4660f4p8 -0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4730 2 OK 0x1.3ffc01e864e56p2 -0x1.4010f9e4a8f08p2 -0x1.9f57630e84p8 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4730 3 OK -0x1.40085ede861fap2 0x1.3ff8157fcbd38p2 -0x1.a6b0dfaaap8 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG epsg:4730 4 OK 0x1.3ffc01e864e56p2 0x1.3ff82db352cf7p2 -0x1.adfbfd731p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4731 0 OK -0x1.cc61f517c74ap-9 0x1.556da777a32c1p-12 -0x1.46440d26e8p7 0x1.2d6cb2018701fp-60 -0x1.2f74bf1dcfcaep-64 -0x1.0p-30 T +REG epsg:4731 1 OK -0x1.403a33e763db1p2 -0x1.4003dd554cb8dp2 -0x1.0293e6f53p7 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4731 2 OK 0x1.3fc71c2a5da18p2 -0x1.4004beadae7c5p2 -0x1.8a5f24617p7 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4731 3 OK -0x1.403a33e763db1p2 0x1.400e7e2305167p2 -0x1.ec0d44822p6 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4731 4 OK 0x1.3fc71c2a5da18p2 0x1.400f5f82cef73p2 -0x1.7dd1d6dc6p7 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4732 0 OK -0x1.e9d2a29f6f79p-12 0x1.685ec3271398p-12 -0x1.d5ffd54718p7 -0x1.2d6cb2018701dp-63 0x1.2f74bf1dcfcadp-64 0x1.0p-29 T +REG epsg:4732 1 OK -0x1.4008f7784429ap2 -0x1.3ffdfa429d517p2 -0x1.d0aa9d33c8p7 -0x1.4000000000001p2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4732 2 OK 0x1.3ff9a8fcd052ap2 -0x1.3ffe1839a6478p2 -0x1.e2b9e5dfp7 0x1.3ffffffffffffp2 -0x1.4000000000002p2 -0x1.0p-29 F +REG epsg:4732 3 OK -0x1.4008f7784429ap2 0x1.40093206fdcb8p2 -0x1.c36b0fcc38p7 -0x1.4000000000001p2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4732 4 OK 0x1.3ff9a8fcd052ap2 0x1.40094fff10e6p2 -0x1.d57a573aap7 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4733 0 OK 0x1.0c77c7e443acap-11 -0x1.6144709a34affp-10 -0x1.077fbe3c58p9 0x1.2d6cb2018701dp-62 -0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG epsg:4733 1 OK -0x1.3ffb2a22630cap2 -0x1.401bf39129fbap2 -0x1.0215f726cap9 -0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG epsg:4733 2 OK 0x1.400bf1828e1dap2 -0x1.401bd2b509133p2 -0x1.fa45f41f2p8 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4733 3 OK -0x1.3ffb2a22630cap2 0x1.3feff6e500391p2 -0x1.0f12acddb2p9 -0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4733 4 OK 0x1.400bf1828e1dap2 0x1.3fefd60d574f7p2 -0x1.0a1fae720ep9 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4734 0 OK -0x1.01d571ea25d5ep-8 0x1.68ebcd96c8b43p-8 0x1.7d0b57a2bcp8 0x1.2d6cb2018701fp-61 0x0.0p0 -0x1.0p-30 T +REG epsg:4734 1 OK -0x1.403851c976071p2 -0x1.3f9fd709599f1p2 0x1.69e300c52p8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4734 2 OK 0x1.3fb767e0e46f2p2 -0x1.3fa0d317069fap2 0x1.1dd5ef9078p8 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4734 3 OK -0x1.403851c976071p2 0x1.40539965b2303p2 0x1.d408c866e8p8 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4734 4 OK 0x1.3fb767e0e46f2p2 0x1.405495ffa9cbap2 0x1.87fc0ab09cp8 0x1.4000000000001p2 0x1.4p2 -0x1.0p-29 F +REG epsg:4735 0 OK -0x1.0590ba6447d4p-6 0x1.4d224de7eddbbp-7 -0x1.c0d38c0d98p9 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4735 1 OK -0x1.410de246d7fb5p2 -0x1.3f62beaacc3c6p2 -0x1.a1dc20cbd8p9 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4735 2 OK 0x1.3f02c454743b4p2 -0x1.3f66bcf10cd33p2 -0x1.1e150320c7p10 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4735 3 OK -0x1.410de246d7fb5p2 0x1.40ae93b94e89ep2 -0x1.3fe2f0e566p9 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4735 4 OK 0x1.3f02c454743b4p2 0x1.40b2961aad816p2 -0x1.da2f9d9214p9 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4736 0 OK -0x1.c427c2f424d5ep-14 0x1.5c8d8ca525d72p-10 -0x1.7424ae32a4p8 0x1.2d6cb2018701fp-66 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:4736 1 OK -0x1.40051d38ccf12p2 -0x1.3ff698414789ap2 -0x1.7b4b3061b8p8 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4736 2 OK 0x1.400194ef3c75p2 -0x1.3ff69f2b9720cp2 -0x1.7d60a88d48p8 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4736 3 OK -0x1.40051d38ccf12p2 0x1.4021fe9f06841p2 -0x1.61aa8465e4p8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4736 4 OK 0x1.400194ef3c75p2 0x1.4022058a43bfep2 -0x1.63bffc0408p8 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4737 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4737 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4737 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4737 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4737 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4738 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4738 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4738 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4738 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4738 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4739 0 OK 0x1.3f1410f7b8ef9p-9 0x1.c012db4020c99p-10 -0x1.7bf737c92p6 0x1.2d6cb2018701ep-61 0x0.0p0 0x0.0p0 T +REG epsg:4739 1 OK -0x1.3fd61b7f7f289p2 -0x1.3fe4beba5508ap2 -0x1.0ef8daea68p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4739 2 OK 0x1.4025dfffcc8f5p2 -0x1.3fe422a00a28dp2 -0x1.61b6b3839p6 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4739 3 OK -0x1.3fd61b7f7f289p2 0x1.401c897b773c7p2 -0x1.9a29e637fp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4739 4 OK 0x1.4025dfffcc8f5p2 0x1.401bed463a9ecp2 -0x1.bbde4816ep5 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4740 0 OK -0x1.622f882455f72p-16 -0x1.c72f1e3a92bf9p-17 0x1.00000a38p0 -0x1.2d6cb20186d4fp-68 0x1.2f74bf1dcf9d5p-69 0x1.d08p-21 T +REG epsg:4740 1 OK -0x1.4000588be2091p2 -0x1.4000385d84ee4p2 0x1.21603a18p0 -0x1.4p2 -0x1.3fffffffffd02p2 0x1.cep-21 F +REG epsg:4740 2 OK 0x1.3fffa7741df6ep2 -0x1.4000385d84ee4p2 0x1.21603a18p0 0x1.3ffffffffffffp2 -0x1.3fffffffffd02p2 0x1.cep-21 F +REG epsg:4740 3 OK -0x1.4000588be2091p2 0x1.3fffc702cefdp2 0x1.bce16cp-1 -0x1.4p2 0x1.3fffffffffd03p2 0x1.cep-21 F +REG epsg:4740 4 OK 0x1.3fffa7741df6ep2 0x1.3fffc702cefdp2 0x1.bce16cp-1 0x1.3ffffffffffffp2 0x1.3fffffffffd03p2 0x1.cep-21 F +REG epsg:4741 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4741 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4741 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4741 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4741 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4742 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4742 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4742 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4742 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4742 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4743 0 OK 0x1.8b86784d7327bp-9 -0x1.37aba749c49a2p-9 -0x1.6e405b96d8p7 0x0.0p0 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4743 1 OK -0x1.3fcf797b1015ep2 -0x1.40310fd2dd6a5p2 -0x1.74616726ap7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4743 2 OK 0x1.40325a73d124ep2 -0x1.40304e1eba7bcp2 -0x1.ff6f4319ap6 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4743 3 OK -0x1.3fcf797b1015ep2 0x1.3fe3724aec555p2 -0x1.d00b510a28p7 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4743 4 OK 0x1.40325a73d124ep2 0x1.3fe2b0c541929p2 -0x1.5b61542068p7 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4744 0 OK 0x1.5535878fbcdap-10 -0x1.b6f9d51db11fap-9 0x1.04228b3a8p7 -0x1.2d6cb2018701fp-62 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:4744 1 OK -0x1.3fe78e7137d16p2 -0x1.403cab1a07c4dp2 0x1.2d238f13f8p7 -0x1.4000000000001p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4744 2 OK 0x1.401234dbe86dep2 -0x1.403c578ada94dp2 0x1.5f75bf39e8p7 0x1.4000000000001p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4744 3 OK -0x1.3fe78e7137d16p2 0x1.3fcf59af59bf8p2 0x1.581198e76p6 -0x1.4000000000001p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4744 4 OK 0x1.401234dbe86dep2 0x1.3fcf063c67651p2 0x1.bcb63c673p6 0x1.4000000000001p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4745 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4745 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4745 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4745 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4745 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4746 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4746 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4746 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4746 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4746 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4747 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4747 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4747 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4747 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4747 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4748 0 OK -0x1.cc61f517c74ap-9 0x1.556da8d6ab1ccp-12 -0x1.b8b70bec58p7 0x1.2d6cb2018701fp-60 0x0.0p0 -0x1.0p-30 T +REG epsg:4748 1 OK -0x1.403a33e763db1p2 -0x1.4003de9ca0e65p2 -0x1.75062474e8p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4748 2 OK 0x1.3fc71c2a5da18p2 -0x1.4004bff50473fp2 -0x1.fcd161e02p7 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4748 3 OK -0x1.403a33e763db1p2 0x1.400e7f6a63f12p2 -0x1.6878dfb3fp7 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4748 4 OK 0x1.3fc71c2a5da18p2 0x1.400f60ca2f9c1p2 -0x1.f044144e38p7 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4749 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4749 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4749 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4749 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4749 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4750 0 OK -0x1.2ffbe8a5baf7cp-13 0x1.b17bacc8e0258p-13 0x1.c21ac00f6p5 0x1.2d6cb2018701fp-65 -0x1.2f74bf1dcfcaep-65 -0x1.0p-30 T +REG epsg:4750 1 OK -0x1.4001a67e4503cp2 -0x1.3ffbe277d6162p2 0x1.b9f50c028p5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4750 2 OK 0x1.3ffce69687299p2 -0x1.3ffbebc3f84f9p2 0x1.a38aa03fep5 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4750 3 OK -0x1.4001a67e4503cp2 0x1.4002a1aba5c88p2 0x1.d9d455bap5 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4750 4 OK 0x1.3ffce69687299p2 0x1.4002aaf7f9acap2 0x1.c369eae3ep5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4751 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4751 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4751 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4751 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4751 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4752 0 OK -0x1.cb35658c4e45fp-9 0x1.a14dee9a5675dp-13 -0x1.0b5b8e2b28p8 0x1.2d6cb2018701fp-61 -0x1.2f74bf1dcfcaep-65 -0x1.0p-30 T +REG epsg:4752 1 OK -0x1.403aa943d6492p2 -0x1.40068ac0c8da8p2 -0x1.d00aebd2c8p7 -0x1.3fffffffffffep2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4752 2 OK 0x1.3fc7dcaaa26acp2 -0x1.40076b885732ep2 -0x1.2bbebfed84p8 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4752 3 OK -0x1.403aa943d6492p2 0x1.400d097a8833dp2 -0x1.c85f3e194p7 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4752 4 OK 0x1.3fc7dcaaa26acp2 0x1.400dea469a58cp2 -0x1.27e8e660f8p8 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4753 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4753 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4753 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4753 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4753 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4754 0 OK 0x1.02bd846c75f4bp-10 0x1.86e9134b2316ep-16 -0x1.54befb76p5 0x1.2d6cb2018701dp-63 0x1.2f74bf1dcfcadp-68 0x1.0p-29 T +REG epsg:4754 1 OK -0x1.3fed254da4006p2 -0x1.3fff67c9e4273p2 -0x1.a9fd9e854p5 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4754 2 OK 0x1.400d7cc8d51c8p2 -0x1.3fff287a1497p2 -0x1.115aecf4ap5 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4754 3 OK -0x1.3fed254da4006p2 0x1.40002a7c4a29p2 -0x1.a665df6fp5 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4754 4 OK 0x1.400d7cc8d51c8p2 0x1.3fffeb2c54795p2 -0x1.0dc32e93ep5 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4755 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4755 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4755 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4755 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4755 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4756 0 OK 0x1.70f60e2c31e32p-12 0x1.06c3c3691e911p-10 0x1.7c95b50178p7 0x1.163a7ae3487ffp-42 -0x1.e4a9cf8f9e8f3p-45 0x1.08p-24 T +REG epsg:4756 1 OK -0x1.3ff7c4be5abddp2 -0x1.3fed3686d90cep2 0x1.5f6b4063e8p7 -0x1.3fffffffffedp2 -0x1.4000000000053p2 0x1.f8p-25 F +REG epsg:4756 2 OK 0x1.40034a7c0ae13p2 -0x1.3fed21c8d2f71p2 0x1.6d118759b8p7 0x1.40000000000dcp2 -0x1.4000000000032p2 0x1.1cp-24 F +REG epsg:4756 3 OK -0x1.3ff7c28573c65p2 0x1.400df04515494p2 0x1.864544e5fp7 -0x1.3fffffffffebbp2 0x1.3ffffffffffc6p2 0x1.ep-25 F +REG epsg:4756 4 OK 0x1.40034c0271fdfp2 0x1.400dd7b893609p2 0x1.93eb817cep7 0x1.40000000000f5p2 0x1.3ffffffffffd6p2 0x1.0cp-24 F +REG epsg:4757 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4757 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4757 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4757 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4757 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4758 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4758 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4758 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4758 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4758 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4759 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4759 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4759 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4759 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4759 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4760 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4760 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4760 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4760 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4760 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4761 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4761 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4761 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4761 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4761 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4762 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4762 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4762 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4762 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4762 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4763 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4763 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4763 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4763 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4763 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4764 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4764 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4764 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4764 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4764 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4765 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4765 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4765 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4765 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4765 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4766 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:4766 1 OK 0x1.c8ebddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4766 2 OK 0x1.d9dd6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4766 3 OK 0x1.c8ebddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4766 4 OK 0x1.d9dd6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4767 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4767 1 OK 0x1.d82e1dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4767 2 OK 0x1.e91fa200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4767 3 OK 0x1.d82e1dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4767 4 OK 0x1.e91fa200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4768 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4768 1 OK 0x1.e7705dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4768 2 OK 0x1.f861e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4768 3 OK 0x1.e7705dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4768 4 OK 0x1.f861e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4769 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4769 1 OK 0x1.f6b29dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4769 2 OK 0x1.03d211007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4769 3 OK 0x1.f6b29dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4769 4 OK 0x1.03d211007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4770 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG epsg:4770 1 OK 0x1.02fa6eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4770 2 OK 0x1.0b7331007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4770 3 OK 0x1.02fa6eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4770 4 OK 0x1.0b7331007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4771 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4771 1 OK 0x1.0a9b8eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4771 2 OK 0x1.131451007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4771 3 OK 0x1.0a9b8eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4771 4 OK 0x1.131451007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4772 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG epsg:4772 1 OK 0x1.123caeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4772 2 OK 0x1.1ab571007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4772 3 OK 0x1.123caeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4772 4 OK 0x1.1ab571007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4773 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4773 1 OK 0x1.19ddceff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4773 2 OK 0x1.225691007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4773 3 OK 0x1.19ddceff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4773 4 OK 0x1.225691007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4774 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4774 1 OK 0x1.217eeeff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4774 2 OK 0x1.29f7b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4774 3 OK 0x1.217eeeff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4774 4 OK 0x1.29f7b1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4775 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4775 1 OK 0x1.29200eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4775 2 OK 0x1.3198d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4775 3 OK 0x1.29200eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4775 4 OK 0x1.3198d1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4776 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:4776 1 OK 0x1.30c12eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4776 2 OK 0x1.3939f1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4776 3 OK 0x1.30c12eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4776 4 OK 0x1.3939f1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4777 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4777 1 OK 0x1.38624eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4777 2 OK 0x1.40db11007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4777 3 OK 0x1.38624eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4777 4 OK 0x1.40db11007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4778 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG epsg:4778 1 OK 0x1.40036eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4778 2 OK 0x1.487c31007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4778 3 OK 0x1.40036eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4778 4 OK 0x1.487c31007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4779 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4779 1 OK 0x1.47a48eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4779 2 OK 0x1.501d51007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4779 3 OK 0x1.47a48eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4779 4 OK 0x1.501d51007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4780 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:4780 1 OK 0x1.4f45aeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4780 2 OK 0x1.57be71007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4780 3 OK 0x1.4f45aeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4780 4 OK 0x1.57be71007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4781 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4781 1 OK 0x1.56e6ceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4781 2 OK 0x1.5f5f91007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4781 3 OK 0x1.56e6ceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4781 4 OK 0x1.5f5f91007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4782 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:4782 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4782 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4782 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4782 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4783 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG epsg:4783 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4783 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4783 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4783 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4784 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:4784 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4784 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4784 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4784 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4785 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:4785 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4785 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4785 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4785 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4786 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:4786 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4786 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4786 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4786 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4787 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:4787 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4787 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4787 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4787 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4788 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:4788 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4788 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4788 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4788 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4789 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4789 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4789 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4789 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4789 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4790 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:4790 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4790 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4790 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4790 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4791 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG epsg:4791 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4791 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4791 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4791 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4792 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4792 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4792 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4792 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4792 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4793 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG epsg:4793 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4793 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4793 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4793 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4794 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:4794 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4794 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4794 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4794 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4795 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4795 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4795 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4795 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4795 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4796 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:4796 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4796 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4796 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4796 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4797 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG epsg:4797 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4797 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4797 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4797 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4798 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:4798 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4798 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4798 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4798 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4799 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG epsg:4799 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4799 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4799 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4799 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4800 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:4800 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4800 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4800 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4800 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG epsg:4801 0 OK -0x1.dc24597972486p2 -0x1.e08736809a2e5p-9 0x1.05ef9a09cp6 -0x1.9f0c2b1b1a662p-52 0x1.c72f1eacb7b05p-60 0x0.0p0 T +REG epsg:4801 1 OK -0x1.8e168452daddp3 -0x1.4042c93701686p2 0x1.aaf7e8533p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4801 2 OK -0x1.3837548b1f695p1 -0x1.4042d1e6338fap2 0x1.a082728a1p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4801 3 OK -0x1.8e168452daddp3 0x1.3fcb1ed161ab5p2 0x1.20a3206f4p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 -0x1.0p-29 F +REG epsg:4801 4 OK -0x1.3837548b1f695p1 0x1.3fcb277d5db2ap2 0x1.0bb82592cp5 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4802 0 OK 0x1.28500fe69b143p6 0x1.78fa78be64f1cp-9 -0x1.16fe0d0e98p9 0x1.a6ebf201849d2p-49 0x0.0p0 -0x1.0p-29 T +REG epsg:4802 1 OK 0x1.144fd0abcac1bp6 -0x1.3fd702d18fb69p2 -0x1.16242f6e9ep9 -0x1.4000000000001p2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4802 2 OK 0x1.3c504f2adffb1p6 -0x1.3fd7b1ed8ce42p2 -0x1.308988b41cp9 0x1.3fffffffffffcp2 -0x1.4p2 0x0.0p0 F +REG epsg:4802 3 OK 0x1.144fd0abcac1bp6 0x1.4034e3a93b728p2 -0x1.f4d8fe38c4p8 -0x1.4000000000001p2 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:4802 4 OK 0x1.3c504f2adffb1p6 0x1.403592f816657p2 -0x1.14d1c93ef6p9 0x1.3fffffffffffcp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4803 0 OK 0x1.243d084dc7fd1p3 -0x1.eb6650c677012p-11 0x1.a860887e8p5 0x1.e8322bcdb9494p-50 0x0.0p0 0x1.0p-29 T +REG epsg:4803 1 OK 0x1.087dfabcd76f4p2 -0x1.400dcbeb9f308p2 0x1.b99f5aa2ap5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4803 2 OK 0x1.c43b132e8001fp3 -0x1.400da902e710cp2 0x1.06e284051p6 0x1.3fffffffffffdp2 -0x1.4p2 0x0.0p0 F +REG epsg:4803 3 OK 0x1.087dfabcd76f4p2 0x1.3fef3408e859dp2 0x1.291998224p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4803 4 OK 0x1.c43b132e8001fp3 0x1.3fef11237da63p2 0x1.7d3f5543p5 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4804 0 OK -0x1.ab3fe2a455f24p6 -0x1.598572903e21cp-10 0x1.4beabe14d8p10 -0x1.408ed84e1fd3cp-46 0x0.0p0 0x0.0p0 T +REG epsg:4804 1 OK -0x1.bf3f6983fad46p6 -0x1.400ba9175af58p2 0x1.5921956471p10 -0x1.4000000000001p2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4804 2 OK -0x1.97405bb533f9bp6 -0x1.400cd49193ca9p2 0x1.4291e3b3a7p10 0x1.4000000000003p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4804 3 OK -0x1.bf3f6983fad46p6 0x1.3fe0a36199622p2 0x1.52c7b0834bp10 -0x1.4000000000002p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4804 4 OK -0x1.97405bb533f9bp6 0x1.3fe1ceb3faaf8p2 0x1.3c37f8e4f6p10 0x1.4000000000003p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4805 0 OK 0x1.1ab223088cfc9p4 -0x1.1c83c438faf2bp-8 0x1.ceee6b6d4p5 0x1.6e7a676c5b651p-52 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4805 1 OK 0x1.955fe1cfc2f49p3 -0x1.404e263a55174p2 0x1.5b054063bp6 -0x1.4000000000001p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4805 2 OK 0x1.6ab4550f8568cp4 -0x1.404db11ee4f8p2 0x1.e80971789p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4805 3 OK 0x1.955fe1cfc2f49p3 0x1.3fc071a2b755fp2 0x1.8a01db3cp1 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4805 4 OK 0x1.6ab4550f8568cp4 0x1.3fbffcba8d79cp2 0x1.32a973fd6p5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4806 0 OK -0x1.8e7786b512cf3p3 -0x1.7cc0fcfcc9532p-11 -0x1.219a01d91p6 0x1.06215564da658p-28 -0x1.025d94aa5d72dp-30 0x1.626f1p-10 T +REG epsg:4806 1 OK -0x1.173b8c7fac1edp4 -0x1.400c8458dc1d3p2 -0x1.364e26a83p6 -0x1.3ffffffb45073p2 -0x1.400000015dd34p2 0x1.530f9p-10 F +REG epsg:4806 2 OK -0x1.dcf0acccf0f75p2 -0x1.400d2e8f27261p2 -0x1.14303d61fp6 0x1.40000002d0b88p2 -0x1.40000000b8c16p2 0x1.76f4cp-10 F +REG epsg:4806 3 OK -0x1.173b4ea91905ap4 0x1.3ff5969c564d9p2 -0x1.2fcf5339bp6 -0x1.3ffffffac36c6p2 0x1.3ffffffedda37p2 0x1.47326p-10 F +REG epsg:4806 4 OK -0x1.dcf01c689dddep2 0x1.3ff4b3d001ce5p2 -0x1.0db7a9c43p6 0x1.400000035a198p2 0x1.3fffffff430dap2 0x1.7008p-10 F +REG epsg:4807 0 OK -0x1.2b18aa091a2ecp1 -0x1.7b5a09708feafp-9 0x1.be7787c1cp5 -0x1.fca76c6293d33p-54 0x0.0p0 0x1.0p-30 T +REG epsg:4807 1 OK -0x1.d58a2b4e40ee7p2 -0x1.40361a9a5c70ap2 0x1.3f71ec08cp6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4807 2 OK 0x1.54e3024fe9ae9p1 -0x1.4035f8013747dp2 0x1.691e8802bp6 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:4807 3 OK -0x1.d58a2b4e40ee7p2 0x1.3fd7a25b58e73p2 0x1.813b07478p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4807 4 OK 0x1.54e3024fe9ae9p1 0x1.3fd77fcc4dd32p2 0x1.13f6ebb04p5 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4808 0 OK -0x1.ab3b1ace58edcp6 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4808 1 OK -0x1.bf3b1ace58edcp6 -0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG epsg:4808 2 OK -0x1.973b1ace58eddp6 -0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG epsg:4808 3 OK -0x1.bf3b1ace58edcp6 0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG epsg:4808 4 OK -0x1.973b1ace58eddp6 0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG epsg:4809 0 OK -0x1.178ce703afb7fp2 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4809 1 OK -0x1.2bc67381d7dcp3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:4809 2 OK 0x1.4398c7e282408p-1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4809 3 OK -0x1.2bc67381d7dcp3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:4809 4 OK 0x1.4398c7e282408p-1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4810 0 OK -0x1.2ae317a350562p1 0x1.af79e1094443ap-11 -0x1.eff5426cp5 0x1.74122bb9e2a65p-55 0x0.0p0 0x0.0p0 T +REG epsg:4810 1 OK -0x1.d56f1d0847dfbp2 -0x1.3ff2c0aba5092p2 -0x1.6eb909226p6 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4810 2 OK 0x1.551809deaa34p1 -0x1.3ff23540134a9p2 -0x1.8d45b2a8ap5 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4810 3 OK -0x1.d56f1d0847dfbp2 0x1.400d9d83a7523p2 -0x1.2f45f5349p6 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4810 4 OK 0x1.551809deaa34p1 0x1.400d120c7fe2bp2 -0x1.0e5fc1f54p5 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4811 0 OK -0x1.2ae19e87a5725p1 -0x1.0d1b4d9169a49p-9 -0x1.398779c9cp5 -0x1.4cc62004efac7p-51 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:4811 1 OK -0x1.d56fded72f74ap2 -0x1.4029cf48e87ccp2 -0x1.36112b33p5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4811 2 OK 0x1.551c7fad9cefp1 -0x1.402940df68ae1p2 0x1.0873aaa8p2 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4811 3 OK -0x1.d56fded72f74ap2 0x1.3fe6cb49cb738p2 -0x1.3953094ddp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4811 4 OK 0x1.551c7fad9cefp1 0x1.3fe63cfdcc024p2 -0x1.1b85e59d2p5 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4812 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG epsg:4812 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4812 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4812 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4812 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4813 0 OK -0x1.ab415e625fc67p6 0x1.da1ca769ac4bcp-12 0x1.17386b5375p10 -0x1.2aff01d263db7p-48 0x0.0p0 -0x1.0p-30 T +REG epsg:4813 1 OK -0x1.bf4110aa0ef59p6 -0x1.3ff14cba037d8p2 0x1.2411f69575p10 -0x1.3fffffffffffap2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4813 2 OK -0x1.9741ac062fdc5p6 -0x1.3ff2d50477066p2 0x1.06821e5a7dp10 0x1.4000000000001p2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4813 3 OK -0x1.bf4110aa0ef59p6 0x1.40000edefbc6ap2 0x1.263fb5d2dap10 -0x1.3fffffffffff9p2 0x1.4p2 0x0.0p0 F +REG epsg:4813 4 OK -0x1.9741ac062fdc5p6 0x1.4001973b57f81p2 0x1.08afe04204p10 0x1.4000000000001p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4814 0 OK -0x1.20eeb4adda39dp4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4814 1 OK -0x1.70eeb4adda39dp4 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:4814 2 OK -0x1.a1dd695bb4739p3 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:4814 3 OK -0x1.70eeb4adda39dp4 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:4814 4 OK -0x1.a1dd695bb4739p3 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:4815 0 OK -0x1.7b761e4f765fep4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4815 1 OK -0x1.cb761e4f765ffp4 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:4815 2 OK -0x1.2b761e4f765fep4 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:4815 3 OK -0x1.cb761e4f765ffp4 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:4815 4 OK -0x1.2b761e4f765fep4 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:4816 0 OK -0x1.2b2c176750d5p1 -0x1.feee81c03d9a3p-9 0x1.2da11bada8p7 0x1.5824c19bce6c1p-53 -0x1.c72f1eacb7b02p-60 0x1.0p-29 T +REG epsg:4816 1 OK -0x1.d592a8ccaee38p2 -0x1.404530d84978ap2 0x1.7b19e4afap7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4816 2 OK 0x1.54cd22d08c185p1 -0x1.4045344e231cap2 0x1.790478b6dp7 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4816 3 OK -0x1.d592a8ccaee38p2 0x1.3fc5f432d2a7fp2 0x1.c9ab3d0b5p6 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:4816 4 OK 0x1.54cd22d08c185p1 0x1.3fc5f7a74fffbp2 0x1.c58061dcbp6 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4817 0 OK -0x1.5719effa60ea9p3 -0x1.18517d6a8bd47p-8 0x1.4718f37084p8 -0x1.252f11d02f117p-31 0x1.2f9c00b93bf51p-24 0x1.ad3bccp-8 T +REG epsg:4817 1 OK -0x1.f71d4849cb516p3 -0x1.4044704c307bbp2 0x1.7a20e3720cp8 -0x1.40000008fd957p2 -0x1.3fffffb7cccf2p2 0x1.5b9988p-8 F +REG epsg:4817 2 OK -0x1.6e3366a8205a3p2 -0x1.404af2c420164p2 0x1.6a00db3878p8 0x1.40000007c7a73p2 -0x1.3fffffb7bc1b7p2 0x1.5a29d8p-8 F +REG epsg:4817 3 OK -0x1.f71a2cfa7cb53p3 0x1.3fbf1fb0d42f8p2 0x1.2771b4aaf8p8 -0x1.40000007c3fcbp2 0x1.4000004ca5953p2 0x1.0613ap-7 F +REG epsg:4817 4 OK -0x1.6e2d2e45dd9d1p2 0x1.3fb90868deaa8p2 0x1.174500f14p8 0x1.40000006b86c7p2 0x1.4000004cbf2bp2 0x1.0574d8p-7 F +REG epsg:4818 0 OK 0x1.1aa7deb796f43p4 -0x1.1c82b2803b43ap-8 0x1.2dba2eb45p7 0x1.25520be0587ebp-48 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG epsg:4818 1 OK 0x1.954bf29dfe8fep3 -0x1.404ca3304407bp2 0x1.968af9a498p7 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4818 2 OK 0x1.6aa9c429c32f8p4 -0x1.404ccf079aa71p2 0x1.7c2566cedp7 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4818 3 OK 0x1.954bf29dfe8fep3 0x1.3fbeef421c96ap2 0x1.de62552aap6 -0x1.3fffffffffffdp2 0x1.3fffffffffffdp2 0x1.0p-28 F +REG epsg:4818 4 OK 0x1.6aa9c429c32f8p4 0x1.3fbf1b0641288p2 0x1.a99701ccap6 0x1.3fffffffffffdp2 0x1.4p2 0x0.0p0 F +REG epsg:4819 0 OK -0x1.2b15c2acfc5c9p1 -0x1.6026a52226171p-9 0x1.aa0a74fe5p6 -0x1.77f2786246817p-36 -0x1.4aa60045f7a13p-38 0x1.e8cp-10 T +REG epsg:4819 1 OK -0x1.d588111136d68p2 -0x1.403236991ccf3p2 0x1.0e4a967c1p7 -0x1.3ffffffe402d7p2 -0x1.3fffffffb607cp2 0x1.e3fcp-10 F +REG epsg:4819 2 OK 0x1.54e49a942cf5dp1 -0x1.403204e757df5p2 0x1.2cc9db0e68p7 0x1.3ffffffeb6078p2 -0x1.400000003763p2 0x1.e62a1p-10 F +REG epsg:4819 3 OK -0x1.d5884d848672fp2 0x1.3fda852b387d1p2 0x1.02f289bcfp6 -0x1.3ffffffec19ccp2 0x1.4000000034aa2p2 0x1.e6566p-10 F +REG epsg:4819 4 OK 0x1.54e51738c7dbep1 0x1.3fda51a595dcbp2 0x1.3ff13528ep6 0x1.3ffffffe349fdp2 0x1.3fffffffb3aa7p2 0x1.e3ba6p-10 F +REG epsg:4820 0 OK -0x1.ab41657122512p6 -0x1.84c52af6ff60cp-12 0x1.1db86f861ep10 0x1.4170e9d3a0f9p-49 0x0.0p0 0x1.0p-30 T +REG epsg:4820 1 OK -0x1.bf41125da6934p6 -0x1.3ffe645c73a53p2 0x1.2c918b491bp10 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:4820 2 OK -0x1.9741b8700cd5bp6 -0x1.3fffee707244cp2 0x1.0ee066b331p10 0x1.4000000000002p2 -0x1.4p2 0x1.0p-29 F +REG epsg:4820 3 OK -0x1.bf41125da6934p6 0x1.3ff24a4b9cf81p2 0x1.2ac83182b5p10 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG epsg:4820 4 OK -0x1.9741b8700cd5bp6 0x1.3ff3d450dba82p2 0x1.0d170abaf8p10 0x1.4000000000002p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG epsg:4821 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4821 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4821 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4821 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4821 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4822 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:4822 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4822 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4822 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4822 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG epsg:4823 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4823 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4823 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4823 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4823 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4824 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4824 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4824 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4824 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4824 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4826 0 OK 0x1.3b99ea3d70a3dp17 0x1.f5ff33b645a1dp16 0x0.0p0 -0x1.8000000000001p4 0x1.faaaaaaaaa898p3 0x0.0p0 F +REG epsg:4826 1 OK -0x1.8e4ae652a98c8p14 -0x1.aec44c2d4f8a2p15 0x0.0p0 -0x1.9bb7e386767d9p4 0x1.c55555555535cp3 0x0.0p0 F +REG epsg:4826 2 OK 0x1.547e98a29b3dp18 -0x1.aec44c2d4f8a2p15 0x0.0p0 -0x1.64481c7989827p4 0x1.c55555555535cp3 0x0.0p0 F +REG epsg:4826 3 OK -0x1.5ebe7b533a548p14 0x1.325deec15694fp18 0x0.0p0 -0x1.9bb7e386767d9p4 0x1.17ffffffffef1p4 0x0.0p0 F +REG epsg:4826 4 OK 0x1.5185d1f2a4498p18 0x1.325deec15694fp18 0x0.0p0 -0x1.64481c7989827p4 0x1.17ffffffffef1p4 0x0.0p0 F +REG epsg:4839 0 OK 0x0.0p0 0x1.21704ec5c1a64p14 0x0.0p0 0x1.5p3 0x1.9955555555048p5 0x0.0p0 F +REG epsg:4839 1 OK -0x1.2cee51627733p19 -0x1.ec6462d6061ddp18 0x0.0p0 0x1.435bfb6f51cbdp1 0x1.715555555554cp5 0x0.0p0 F +REG epsg:4839 2 OK 0x1.2cee51627733p19 -0x1.ec6462d6061ddp18 0x0.0p0 0x1.2794809215c68p4 0x1.715555555554cp5 0x0.0p0 F +REG epsg:4839 3 OK -0x1.e43d1acbf8f7p18 0x1.2600a7ca4823cp19 0x0.0p0 0x1.435bfb6f51cc1p1 0x1.c15555555537bp5 0x0.0p0 F +REG epsg:4839 4 OK 0x1.e43d1acbf8f7p18 0x1.2600a7ca4823cp19 0x0.0p0 0x1.2794809215c68p4 0x1.c15555555537bp5 0x0.0p0 F +REG epsg:4855 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.6p2 0x0.0p0 0x0.0p0 T +REG epsg:4855 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.0000000ea80e1p-1 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4855 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.4fffffff157f1p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4855 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.0000000ea80e1p-1 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4855 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.4fffffff157f1p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4856 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.ap2 0x0.0p0 0x0.0p0 T +REG epsg:4856 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.8000000754074p0 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4856 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.6fffffff157f2p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4856 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.8000000754074p0 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4856 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.6fffffff157f2p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4857 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.dffffffffffffp2 0x0.0p0 0x0.0p0 T +REG epsg:4857 1 OK -0x1.bc8626bdf2f84p18 0x1.b291c912744b8p18 0x0.0p0 0x1.40000003aa039p1 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4857 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.8fffffff157f1p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4857 3 OK -0x1.bc8626bdf2f84p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.40000003aa039p1 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4857 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.8fffffff157f1p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4858 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.1p3 0x0.0p0 0x0.0p0 T +REG epsg:4858 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.c0000003aa03bp1 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4858 2 OK 0x1.3feb135ef97c2p19 0x1.b291c912744b8p18 0x0.0p0 0x1.afffffff157f2p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4858 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.c0000003aa03bp1 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4858 4 OK 0x1.3feb135ef97c2p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.afffffff157f2p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4859 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.3p3 0x0.0p0 0x0.0p0 T +REG epsg:4859 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.20000001d501dp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4859 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.cfffffff157f3p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4859 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.20000001d501dp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4859 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.cfffffff157f3p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4860 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.5p3 0x0.0p0 0x0.0p0 T +REG epsg:4860 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.60000001d501dp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4860 2 OK 0x1.3feb135ef97c2p19 0x1.b291c912744b8p18 0x0.0p0 0x1.efffffff157f2p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4860 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.60000001d501dp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4860 4 OK 0x1.3feb135ef97c2p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.efffffff157f2p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4861 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.7p3 0x0.0p0 0x0.0p0 T +REG epsg:4861 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.a0000001d501dp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4861 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.07ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4861 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.a0000001d501dp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4861 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.07ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4862 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.9p3 0x0.0p0 0x0.0p0 T +REG epsg:4862 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.e0000001d501dp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4862 2 OK 0x1.3feb135ef97c2p19 0x1.b291c912744b8p18 0x0.0p0 0x1.17ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4862 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.e0000001d501dp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4862 4 OK 0x1.3feb135ef97c2p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.17ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4863 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.bp3 0x0.0p0 0x0.0p0 T +REG epsg:4863 1 OK -0x1.bc8626bdf2f84p18 0x1.b291c912744b8p18 0x0.0p0 0x1.10000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4863 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.27ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4863 3 OK -0x1.bc8626bdf2f84p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.10000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4863 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.27ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4864 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.d000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:4864 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.30000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4864 2 OK 0x1.3feb135ef97cp19 0x1.b291c912744b8p18 0x0.0p0 0x1.37ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4864 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.30000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4864 4 OK 0x1.3feb135ef97cp19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.37ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4865 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.fp3 0x0.0p0 0x0.0p0 T +REG epsg:4865 1 OK -0x1.bc8626bdf2f84p18 0x1.b291c912744b8p18 0x0.0p0 0x1.50000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4865 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.47ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4865 3 OK -0x1.bc8626bdf2f84p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.50000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4865 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.47ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4866 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.08p4 0x0.0p0 0x0.0p0 T +REG epsg:4866 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.70000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4866 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.57ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4866 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.70000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4866 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.57ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4867 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.18p4 0x0.0p0 0x0.0p0 T +REG epsg:4867 1 OK -0x1.bc8626bdf2f84p18 0x1.b291c912744b8p18 0x0.0p0 0x1.90000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4867 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.67ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4867 3 OK -0x1.bc8626bdf2f84p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.90000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4867 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.67ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4868 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.28p4 0x0.0p0 0x0.0p0 T +REG epsg:4868 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.b0000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4868 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.77ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4868 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.b0000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4868 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.77ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4869 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.38p4 0x0.0p0 0x0.0p0 T +REG epsg:4869 1 OK -0x1.bc8626bdf2f8p18 0x1.b291c912744b8p18 0x0.0p0 0x1.d0000000ea80fp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4869 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.87ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4869 3 OK -0x1.bc8626bdf2f8p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.d0000000ea80fp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4869 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.87ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4870 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.48p4 0x0.0p0 0x0.0p0 T +REG epsg:4870 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.f0000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4870 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.97ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4870 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.f0000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4870 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.97ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4871 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.58p4 0x0.0p0 0x0.0p0 T +REG epsg:4871 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.0800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4871 2 OK 0x1.3feb135ef97cp19 0x1.b291c912744b8p18 0x0.0p0 0x1.a7ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4871 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.0800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4871 4 OK 0x1.3feb135ef97cp19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.a7ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4872 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.68p4 0x0.0p0 0x0.0p0 T +REG epsg:4872 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.1800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4872 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.b7ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4872 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.1800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4872 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.b7ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4873 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.78p4 0x0.0p0 0x0.0p0 T +REG epsg:4873 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.2800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4873 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.c7ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4873 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.2800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4873 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.c7ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4874 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.88p4 0x0.0p0 0x0.0p0 T +REG epsg:4874 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.3800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4874 2 OK 0x1.3feb135ef97c6p19 0x1.b291c912744b8p18 0x0.0p0 0x1.d7ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4874 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.3800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4874 4 OK 0x1.3feb135ef97c6p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.d7ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4875 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.98p4 0x0.0p0 0x0.0p0 T +REG epsg:4875 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.4800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4875 2 OK 0x1.3feb135ef97cp19 0x1.b291c912744b8p18 0x0.0p0 0x1.e7ffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4875 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.4800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4875 4 OK 0x1.3feb135ef97cp19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.e7ffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4876 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.a8p4 0x0.0p0 0x0.0p0 T +REG epsg:4876 1 OK -0x1.bc8626bdf2f8p18 0x1.b291c912744b8p18 0x0.0p0 0x1.5800000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4876 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.f7ffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4876 3 OK -0x1.bc8626bdf2f8p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.5800000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4876 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.f7ffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4877 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.b8p4 0x0.0p0 0x0.0p0 T +REG epsg:4877 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.6800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4877 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.03ffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4877 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.6800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4877 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.03ffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4878 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.c800000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:4878 1 OK -0x1.bc8626bdf2f86p18 0x1.b291c912744b8p18 0x0.0p0 0x1.7800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4878 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.0bffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4878 3 OK -0x1.bc8626bdf2f86p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.7800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4878 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.0bffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4879 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.d800000000001p4 0x0.0p0 0x0.0p0 T +REG epsg:4879 1 OK -0x1.bc8626bdf2f8cp18 0x1.b291c912744b8p18 0x0.0p0 0x1.8800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4879 2 OK 0x1.3feb135ef97bdp19 0x1.b291c912744b8p18 0x0.0p0 0x1.13ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4879 3 OK -0x1.bc8626bdf2f8cp18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.8800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4879 4 OK 0x1.3feb135ef97bdp19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.13ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4880 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.e8p4 0x0.0p0 0x0.0p0 T +REG epsg:4880 1 OK -0x1.bc8626bdf2f8p18 0x1.b291c912744b8p18 0x0.0p0 0x1.9800000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4880 2 OK 0x1.3feb135ef97c3p19 0x1.b291c912744b8p18 0x0.0p0 0x1.1bffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4880 3 OK -0x1.bc8626bdf2f8p18 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.9800000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4880 4 OK 0x1.3feb135ef97c3p19 0x1.7ba38dbb62ed2p20 0x0.0p0 0x1.1bffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:4882 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4882 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4882 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4882 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4882 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4884 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4884 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4884 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4884 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4884 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4886 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4886 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4886 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4886 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4886 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4888 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4888 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4888 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4888 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4888 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4890 0 OK 0x1.854a84p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4890 1 OK 0x1.825803142b27p22 -0x1.0e67d6b0e00e8p19 -0x1.0d9f1203f24a3p19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:4890 2 OK 0x1.825803142b27p22 0x1.0e67d6b0e00e8p19 -0x1.0d9f1203f24a3p19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:4890 3 OK 0x1.825803142b27p22 -0x1.0e67d6b0e00e8p19 0x1.0d9f1203f24a3p19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:4890 4 OK 0x1.825803142b27p22 0x1.0e67d6b0e00e8p19 0x1.0d9f1203f24a3p19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-30 F +REG epsg:4892 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4892 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4892 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4892 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4892 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4894 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4894 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4894 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4894 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4894 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4896 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4896 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4896 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4896 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4896 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4897 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4897 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4897 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4897 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4897 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4899 0 OK 0x1.854e5p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4899 1 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4899 2 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4899 3 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4899 4 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4901 0 OK -0x1.2b29a485cd7b8p1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4901 1 OK -0x1.d594d242e6bdcp2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4901 2 OK 0x1.54d65b7a32847p1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4901 3 OK -0x1.d594d242e6bdcp2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4901 4 OK 0x1.54d65b7a32847p1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4902 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4902 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG epsg:4902 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4902 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:4902 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4903 0 OK 0x1.d80e61aab6515p1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4903 1 OK -0x1.4fe33caa935d6p0 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4903 2 OK 0x1.1603986aad946p3 -0x1.4p2 0x0.0p0 0x1.4000000000003p2 -0x1.4p2 0x0.0p0 F +REG epsg:4903 3 OK -0x1.4fe33caa935d6p0 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4903 4 OK 0x1.1603986aad946p3 0x1.4p2 0x0.0p0 0x1.4000000000003p2 0x1.4p2 0x0.0p0 F +REG epsg:4904 0 OK 0x1.2446a27fae1b2p3 -0x1.4f054021f66e2p-8 0x1.cf91f585dp7 0x1.6268cd4bcbbd3p-50 0x0.0p0 0x0.0p0 T +REG epsg:4904 1 OK 0x1.0886b9dfe639ep2 -0x1.405879c3c0fb9p2 0x1.0bd178a33p8 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4904 2 OK 0x1.c449e7df6d2f9p3 -0x1.40580b8c51e2dp2 0x1.2cfea57124p8 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:4904 3 OK 0x1.0886b9dfe639ep2 0x1.3fb19d8028ceep2 0x1.52931d54cp7 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4904 4 OK 0x1.c449e7df6d2f9p3 0x1.3fb12f818ad51p2 0x1.94edba9198p7 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4906 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4906 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4906 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4906 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4906 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4908 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4908 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4908 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4908 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4908 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4910 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4910 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4910 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4910 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4910 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4911 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4911 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4911 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4911 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4911 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4912 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4912 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4912 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4912 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4912 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4913 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4913 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4913 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4913 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4913 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4914 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4914 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4914 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4914 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4914 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4915 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4915 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4915 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4915 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4915 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4916 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4916 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4916 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4916 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4916 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4917 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4917 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4917 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4917 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4917 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4918 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4918 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4918 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4918 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4918 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4919 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4919 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4919 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4919 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4919 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4920 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4920 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4920 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4920 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4920 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4922 0 OK 0x1.854a6p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4922 1 OK 0x1.8257df559e00ep22 -0x1.0e67bdac51b3ap19 -0x1.0d9efc31ec71ep19 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4922 2 OK 0x1.8257df559e00ep22 0x1.0e67bdac51b3ap19 -0x1.0d9efc31ec71ep19 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:4922 3 OK 0x1.8257df559e00ep22 -0x1.0e67bdac51b3ap19 0x1.0d9efc31ec71ep19 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:4922 4 OK 0x1.8257df559e00ep22 0x1.0e67bdac51b3ap19 0x1.0d9efc31ec71ep19 0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:4924 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4924 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4924 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4924 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4924 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4926 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4926 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4926 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4926 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4926 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4928 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4928 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4928 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4928 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4928 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4930 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4930 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4930 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4930 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4930 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4932 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4932 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4932 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4932 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4932 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4934 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4934 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4934 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4934 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4934 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4936 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4936 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4936 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4936 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4936 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4938 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4938 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4938 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4938 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4938 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4940 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4940 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4940 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4940 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4940 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4942 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4942 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4942 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4942 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4942 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4944 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4944 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4944 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4944 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4944 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4946 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4946 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4946 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4946 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4946 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4948 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4948 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4948 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4948 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4948 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4950 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4950 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4950 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4950 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4950 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4952 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4952 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4952 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4952 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4952 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4954 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4954 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4954 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4954 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4954 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4956 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4956 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4956 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4956 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4956 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4958 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4958 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4958 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4958 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4958 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4960 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4960 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4960 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4960 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4960 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4962 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4962 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4962 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4962 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4962 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4964 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4964 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4964 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4964 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4964 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4966 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4966 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4966 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4966 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4966 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4968 0 OK 0x1.854e5p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4968 1 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4968 2 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 -0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4968 3 OK 0x1.825bca6cd09cbp22 -0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 -0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4968 4 OK 0x1.825bca6cd09cbp22 0x1.0e6a7bbede619p19 0x1.0d9fc0b72953ep19 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x1.0p-30 F +REG epsg:4970 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4970 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4970 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4970 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4970 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4972 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4972 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4972 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4972 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4972 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4974 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4974 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4974 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4974 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4974 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4976 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4976 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4976 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4976 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4976 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4978 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4978 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4978 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4978 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4978 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4980 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4980 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4980 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4980 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4980 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4982 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4982 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4982 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4982 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4982 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:4984 0 OK 0x1.854a5cp22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4984 1 OK 0x1.8257db5c2d879p22 -0x1.0e67bae434312p19 -0x1.0d9efa485a8p19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4984 2 OK 0x1.8257db5c2d879p22 0x1.0e67bae434312p19 -0x1.0d9efa485a8p19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4984 3 OK 0x1.8257db5c2d879p22 -0x1.0e67bae434312p19 0x1.0d9efa485a8p19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4984 4 OK 0x1.8257db5c2d879p22 0x1.0e67bae434312p19 0x1.0d9efa485a8p19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4986 0 OK 0x1.854a5cp22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG epsg:4986 1 OK 0x1.8257db5c2d879p22 -0x1.0e67bae434312p19 -0x1.0d9efa485a8p19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4986 2 OK 0x1.8257db5c2d879p22 0x1.0e67bae434312p19 -0x1.0d9efa485a8p19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4986 3 OK 0x1.8257db5c2d879p22 -0x1.0e67bae434312p19 0x1.0d9efa485a8p19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4986 4 OK 0x1.8257db5c2d879p22 0x1.0e67bae434312p19 0x1.0d9efa485a8p19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:4988 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4988 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4988 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4988 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4988 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4990 0 OK 0x1.854c14p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4990 1 OK 0x1.82598ff154608p22 -0x1.0e68ec75ac85cp19 -0x1.0da03ae81afdcp19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4990 2 OK 0x1.82598ff154608p22 0x1.0e68ec75ac85cp19 -0x1.0da03ae81afdcp19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4990 3 OK 0x1.82598ff154608p22 -0x1.0e68ec75ac85cp19 0x1.0da03ae81afdcp19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4990 4 OK 0x1.82598ff154608p22 0x1.0e68ec75ac85cp19 0x1.0da03ae81afdcp19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4992 0 OK 0x1.854c14p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4992 1 OK 0x1.82598ff154608p22 -0x1.0e68ec75ac85cp19 -0x1.0da03ae81afdcp19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4992 2 OK 0x1.82598ff154608p22 0x1.0e68ec75ac85cp19 -0x1.0da03ae81afdcp19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4992 3 OK 0x1.82598ff154608p22 -0x1.0e68ec75ac85cp19 0x1.0da03ae81afdcp19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4992 4 OK 0x1.82598ff154608p22 0x1.0e68ec75ac85cp19 0x1.0da03ae81afdcp19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4994 0 OK 0x1.854b79999999ap22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4994 1 OK 0x1.8258fdf2798d9p22 -0x1.0e688646aa481p19 -0x1.0d9a9aa0637cep19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4994 2 OK 0x1.8258fdf2798d9p22 0x1.0e688646aa481p19 -0x1.0d9a9aa0637cep19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4994 3 OK 0x1.8258fdf2798d9p22 -0x1.0e688646aa481p19 0x1.0d9a9aa0637cep19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4994 4 OK 0x1.8258fdf2798d9p22 0x1.0e688646aa481p19 0x1.0d9a9aa0637cep19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:4996 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4996 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4996 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4996 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4996 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4998 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:4998 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4998 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:4998 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:4998 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5011 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5011 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5011 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5011 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5011 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5013 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5013 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5013 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5013 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5013 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5014 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:5014 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p5 -0x1.4p2 0x0.0p0 F +REG epsg:5014 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp4 -0x1.4p2 0x0.0p0 F +REG epsg:5014 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p5 0x1.4p2 0x0.0p0 F +REG epsg:5014 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp4 0x1.4p2 0x0.0p0 F +REG epsg:5015 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:5015 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p5 -0x1.4p2 0x0.0p0 F +REG epsg:5015 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:5015 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p5 0x1.4p2 0x0.0p0 F +REG epsg:5015 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6000000000001p4 0x1.4p2 0x0.0p0 F +REG epsg:5016 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:5016 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:5016 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:5016 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:5016 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:5018 0 OK 0x1.9be74a43a1eecp6 -0x1.6168f784c2aa7p7 -0x1.b735fcf36p5 -0x1.0438932a2bac2p3 0x1.3d55555555554p5 -0x1.8p-29 F +REG epsg:5018 1 OK -0x1.22df15737abc9p19 -0x1.05a273d2a4c8p19 -0x1.988f12f06p5 -0x1.d41333b31796bp3 0x1.15555554dc59fp5 -0x1.0p-27 F +REG epsg:5018 2 OK 0x1.22f8d4060863bp19 -0x1.05a273ce48af7p19 -0x1.fe89bf22cp4 -0x1.a2ef9509fd28cp0 0x1.15555554dc1bbp5 -0x1.cp-27 F +REG epsg:5018 3 OK -0x1.f6f337f82b445p18 0x1.1924c185e754ep19 -0x1.41b35db0bp6 -0x1.d41333afe8eb4p3 0x1.655555548213fp5 -0x1.8p-26 F +REG epsg:5018 4 OK 0x1.f726b50fb51bep18 0x1.1924c188e5ed6p19 -0x1.fed93c322p5 -0x1.a2ef9523870dbp0 0x1.6555555481951p5 -0x1.1p-26 F +REG epsg:5041 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 0x0.0p0 0x1.64p6 0x0.0p0 T +REG epsg:5041 1 OK 0x1.72d6fc9d0d4dep20 0x1.a479f4de72c24p20 0x0.0p0 -0x1.dfffffffffffep5 0x1.54p6 0x0.0p0 T +REG epsg:5041 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 0x1.dfffffffffffep5 0x1.54p6 0x0.0p0 T +REG epsg:5041 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf5p20 0x0.0p0 -0x1.dfffffffffff6p5 0x1.64p6 0x0.0p0 T +REG epsg:5041 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf5p20 0x0.0p0 0x1.dfffffffffff6p5 0x1.64p6 0x0.0p0 T +REG epsg:5042 0 OK 0x1.e848p20 0x1.01b194293450ap21 0x0.0p0 0x0.0p0 -0x1.64p6 0x0.0p0 T +REG epsg:5042 1 OK 0x1.d0ce8368c99abp20 0x1.f5d594293450bp20 0x0.0p0 -0x1.dfffffffffff6p5 -0x1.64p6 0x0.0p0 T +REG epsg:5042 2 OK 0x1.ffc17c9736655p20 0x1.f5d594293450bp20 0x0.0p0 0x1.dfffffffffff6p5 -0x1.64p6 0x0.0p0 T +REG epsg:5042 3 OK 0x1.72d6fc9d0d4dep20 0x1.160b0590c69eep21 0x0.0p0 -0x1.dfffffffffffep5 -0x1.54p6 0x0.0p0 T +REG epsg:5042 4 OK 0x1.2edc81b179591p21 0x1.160b0590c69eep21 0x0.0p0 0x1.dfffffffffffep5 -0x1.54p6 0x0.0p0 T +REG epsg:5048 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:5048 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 -0x1.4p2 0x0.0p0 F +REG epsg:5048 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 -0x1.4p2 0x0.0p0 F +REG epsg:5048 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 0x1.4p2 0x0.0p0 F +REG epsg:5048 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 0x1.4p2 0x0.0p0 F +REG epsg:5069 0 OK 0x0.0p0 0x1.2f6f94d31f0bep20 0x0.0p0 -0x1.8000000000001p6 0x1.11ffffffffffcp5 0x0.0p0 F +REG epsg:5069 1 OK -0x1.ded29833e1c1cp20 -0x1.a730736b3eb6cp17 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.33ffffffffffbp4 0x0.0p0 F +REG epsg:5069 2 OK 0x1.ded29833e1c2p20 -0x1.a730736b3eb6cp17 0x0.0p0 -0x1.3769a036a9724p6 0x1.33ffffffffffbp4 0x0.0p0 F +REG epsg:5069 3 OK -0x1.44fb1b1b29362p20 0x1.73780ba32e162p21 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5069 4 OK 0x1.44fb1b1b29365p20 0x1.73780ba32e162p21 0x0.0p0 -0x1.3769a036a9724p6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5070 0 OK 0x0.0p0 0x1.2f72863472da6p20 0x0.0p0 -0x1.8000000000001p6 0x1.11ffffffffffep5 0x0.0p0 F +REG epsg:5070 1 OK -0x1.ded0fcaa50ee2p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.3400000000006p4 0x0.0p0 F +REG epsg:5070 2 OK 0x1.ded0fcaa50ee8p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.3769a036a9724p6 0x1.3400000000001p4 0x0.0p0 F +REG epsg:5070 3 OK -0x1.44f877fc565f9p20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5070 4 OK 0x1.44f877fc565fdp20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.3769a036a9724p6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5071 0 OK 0x0.0p0 0x1.2f72863472da6p20 0x0.0p0 -0x1.8000000000001p6 0x1.11ffffffffffep5 0x0.0p0 F +REG epsg:5071 1 OK -0x1.ded0fcaa50ee2p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.3400000000006p4 0x0.0p0 F +REG epsg:5071 2 OK 0x1.ded0fcaa50ee8p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.3769a036a9724p6 0x1.3400000000001p4 0x0.0p0 F +REG epsg:5071 3 OK -0x1.44f877fc565f9p20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5071 4 OK 0x1.44f877fc565fdp20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.3769a036a9724p6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5072 0 OK 0x0.0p0 0x1.2f72863472da6p20 0x0.0p0 -0x1.8000000000001p6 0x1.11ffffffffffep5 0x0.0p0 F +REG epsg:5072 1 OK -0x1.ded0fcaa50ee2p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.3400000000006p4 0x0.0p0 F +REG epsg:5072 2 OK 0x1.ded0fcaa50ee8p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.3769a036a9724p6 0x1.3400000000001p4 0x0.0p0 F +REG epsg:5072 3 OK -0x1.44f877fc565f9p20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5072 4 OK 0x1.44f877fc565fdp20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.3769a036a9724p6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:5105 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.6p2 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5105 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 -0x1.f7bb29be512b6p1 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5105 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.ddeeca6f944acp3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5105 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 -0x1.f7bb28b2102cp1 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5105 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.ddeeca2c840b1p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5106 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.ap2 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5106 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 -0x1.77bb29be512b5p1 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5106 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.fdeeca6f944adp3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5106 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 -0x1.77bb28b2102bep1 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5106 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.fdeeca2c840b1p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5107 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.dffffffffffffp2 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5107 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 -0x1.ef76537ca2567p0 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5107 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.0ef76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5107 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 -0x1.ef76516420573p0 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5107 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.0ef7651642058p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5108 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.1p3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5108 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 -0x1.deeca6f944acfp-1 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5108 2 OK 0x1.65bf7798b49f4p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.1ef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5108 3 OK -0x1.7002a3c9946fcp18 0x1.84b8587509fc2p20 0x0.0p0 -0x1.deeca2c840b04p-1 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5108 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.1ef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5109 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.3p3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5109 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.089ac835da97cp-4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5109 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.2ef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5109 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.089ae9bdfa845p-4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5109 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.2ef7651642056p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5110 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.5p3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5110 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.1089ac835da97p0 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5110 2 OK 0x1.65bf7798b49f4p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.3ef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5110 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.1089ae9bdfa83p0 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5110 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.3ef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5111 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.7p3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5111 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.0844d641aed4bp1 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5111 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.4ef76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5111 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.0844d74defd41p1 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5111 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.4ef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5112 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.9p3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5112 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.8844d641aed4bp1 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5112 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.5ef76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5112 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.8844d74defd41p1 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5112 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.5ef7651642058p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5113 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.bp3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5113 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.04226b20d76a5p2 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5113 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.6ef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5113 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.04226ba6f7eap2 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5113 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.6ef7651642056p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5114 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.d000000000001p3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5114 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.44226b20d76a7p2 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5114 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.7ef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5114 3 OK -0x1.7002a3c9946fcp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.44226ba6f7eap2 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5114 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.7ef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5115 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.fp3 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5115 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.84226b20d76a7p2 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5115 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.8ef76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5115 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.84226ba6f7ea3p2 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5115 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.8ef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5116 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.08p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5116 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.c4226b20d76a6p2 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5116 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.9ef76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5116 3 OK -0x1.7002a3c9946fcp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.c4226ba6f7eap2 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5116 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.9ef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5117 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.18p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5117 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.021135906bb53p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5117 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.aef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5117 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.021135d37bf52p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5117 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.aef7651642056p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5118 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.28p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5118 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.221135906bb53p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5118 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.bef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5118 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.221135d37bf51p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5118 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.bef7651642056p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5119 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.38p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5119 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.421135906bb53p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5119 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.cef76537ca256p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5119 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.421135d37bf51p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5119 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.cef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5120 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.48p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5120 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.621135906bb53p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5120 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.def76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5120 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.621135d37bf5p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5120 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.def7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5121 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.58p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5121 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.821135906bb54p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5121 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.eef76537ca257p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5121 3 OK -0x1.7002a3c9946fcp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.821135d37bf5p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5121 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.eef7651642057p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5122 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.68p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5122 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.a21135906bb53p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5122 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.fef76537ca258p4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5122 3 OK -0x1.7002a3c9946fbp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.a21135d37bf5p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5122 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.fef7651642058p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5123 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.78p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5123 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.c21135906bb53p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5123 2 OK 0x1.65bf7798b49f3p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.077bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5123 3 OK -0x1.7002a3c9946fcp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.c21135d37bf5p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5123 4 OK 0x1.19a951e4ca37bp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.077bb28b2102bp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5124 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.88p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5124 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.e21135906bb52p3 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5124 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.0f7bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5124 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.e21135d37bf52p3 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5124 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.0f7bb28b2102bp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5125 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.98p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5125 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.01089ac835daap4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5125 2 OK 0x1.65bf7798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.177bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5125 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.01089ae9bdfa9p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5125 4 OK 0x1.19a951e4ca37cp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.177bb28b2102cp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5126 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.a8p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5126 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.11089ac835daap4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5126 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.1f7bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5126 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.11089ae9bdfa9p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5126 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.1f7bb28b2102cp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5127 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.b8p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5127 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.21089ac835daap4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5127 2 OK 0x1.65bf7798b49f3p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.277bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5127 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.21089ae9bdfa9p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5127 4 OK 0x1.19a951e4ca37bp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.277bb28b2102bp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5128 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.c800000000001p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5128 1 OK -0x1.04177798b49f5p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.31089ac835dabp4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5128 2 OK 0x1.65bf7798b49f3p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.2f7bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5128 3 OK -0x1.7002a3c9946f9p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.31089ae9bdfaap4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5128 4 OK 0x1.19a951e4ca37bp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.2f7bb28b2102bp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5129 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.d800000000001p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5129 1 OK -0x1.04177798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.41089ac835daap4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5129 2 OK 0x1.65bf7798b49f3p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.377bb29be512bp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5129 3 OK -0x1.7002a3c9946fcp18 0x1.84b8587509fc2p20 0x0.0p0 0x1.41089ae9bdfa9p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5129 4 OK 0x1.19a951e4ca37bp19 0x1.84b8587509fc2p20 0x0.0p0 0x1.377bb28b2102cp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5130 0 OK 0x1.86ap16 0x1.e848p19 0x0.0p0 0x1.e8p4 0x1.d000000000001p5 0x0.0p0 F +REG epsg:5130 1 OK -0x1.04177798b49f3p19 0x1.d9bc2ba1caac3p18 0x0.0p0 0x1.51089ac835daap4 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5130 2 OK 0x1.65bf7798b49f6p19 0x1.d9bc2ba1caac5p18 0x0.0p0 0x1.3f7bb29be512cp5 0x1.a7fffff81d478p5 0x0.0p0 F +REG epsg:5130 3 OK -0x1.7002a3c9946f6p18 0x1.84b8587509fc2p20 0x0.0p0 0x1.51089ae9bdfa9p4 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5130 4 OK 0x1.19a951e4ca37ep19 0x1.84b8587509fc2p20 0x0.0p0 0x1.3f7bb28b2102cp5 0x1.f7fffffa56d33p5 0x0.0p0 F +REG epsg:5132 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5132 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5132 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5132 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5132 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5167 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.06p7 0x1.3p5 0x0.0p0 F +REG epsg:5167 1 OK -0x1.802ca939eee84p18 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.f29ea071cbf1bp6 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5167 2 OK 0x1.8366549cf7756p19 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.12b0afc71a073p7 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5167 3 OK -0x1.35f5174ae52e6p18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.f29ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5167 4 OK 0x1.5e4a8ba572986p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.12b0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5168 0 OK 0x1.86ap17 0x1.0c8ep19 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5168 1 OK -0x1.802ca939eeeacp18 0x1.9e052b1c039cp13 0x0.0p0 0x1.e29ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5168 2 OK 0x1.8366549cf7742p19 0x1.9e052b1c0398p13 0x0.0p0 0x1.0ab0afc71a073p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5168 3 OK -0x1.35f5174ae530cp18 0x1.12985d0c1efe4p20 0x0.0p0 0x1.e29ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5168 4 OK 0x1.5e4a8ba572973p19 0x1.12985d0c1efe4p20 0x0.0p0 0x1.0ab0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5169 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.f400000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5169 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.da9ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5169 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.06b0afc71a072p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5169 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.da9ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5169 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.06b0afc6f4377p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5170 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5170 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.e29ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5170 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.0ab0afc71a073p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5170 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.e29ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5170 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0ab0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5171 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.02p7 0x1.3p5 0x0.0p0 F +REG epsg:5171 1 OK -0x1.802ca939eee84p18 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.ea9ea071cbf1bp6 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5171 2 OK 0x1.8366549cf7756p19 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.0eb0afc71a073p7 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5171 3 OK -0x1.35f5174ae52e6p18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.ea9ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5171 4 OK 0x1.5e4a8ba572986p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0eb0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5172 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.06p7 0x1.3p5 0x0.0p0 F +REG epsg:5172 1 OK -0x1.802ca939eee84p18 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.f29ea071cbf1bp6 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5172 2 OK 0x1.8366549cf7756p19 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.12b0afc71a073p7 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5172 3 OK -0x1.35f5174ae52e6p18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.f29ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5172 4 OK 0x1.5e4a8ba572986p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.12b0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5173 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.f402f5ab4220dp6 0x1.3p5 0x0.0p0 F +REG epsg:5173 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.daa1961d0e127p6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5173 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.06b22a9cbb178p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5173 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.daa1961d59b1dp6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5173 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.06b22a9c9547dp7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5174 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.fc02f5ab4220dp6 0x1.3p5 0x0.0p0 F +REG epsg:5174 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.e2a1961d0e127p6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5174 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.0ab22a9cbb178p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5174 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.e2a1961d59b1dp6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5174 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0ab22a9c9547dp7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5175 0 OK 0x1.86ap17 0x1.0c8ep19 0x0.0p0 0x1.fc02f5ab4220dp6 0x1.3p5 0x0.0p0 F +REG epsg:5175 1 OK -0x1.802ca939eeeacp18 0x1.9e052b1c039cp13 0x0.0p0 0x1.e2a1961d0e127p6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5175 2 OK 0x1.8366549cf7742p19 0x1.9e052b1c0398p13 0x0.0p0 0x1.0ab22a9cbb178p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5175 3 OK -0x1.35f5174ae530cp18 0x1.12985d0c1efe4p20 0x0.0p0 0x1.e2a1961d59b1dp6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5175 4 OK 0x1.5e4a8ba572973p19 0x1.12985d0c1efe4p20 0x0.0p0 0x1.0ab22a9c9547dp7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5176 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.02017ad5a1106p7 0x1.3p5 0x0.0p0 F +REG epsg:5176 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.eaa1961d0e127p6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5176 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.0eb22a9cbb179p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5176 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.eaa1961d59b1dp6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5176 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0eb22a9c9547ep7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5177 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.06017ad5a1106p7 0x1.3p5 0x0.0p0 F +REG epsg:5177 1 OK -0x1.802ca939eee84p18 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.f2a1961d0e127p6 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5177 2 OK 0x1.8366549cf7756p19 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.12b22a9cbb179p7 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5177 3 OK -0x1.35f5174ae52e6p18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.f2a1961d59b1dp6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5177 4 OK 0x1.5e4a8ba572986p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.12b22a9c9547ep7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5178 0 OK 0x1.e848p19 0x1.e848p20 0x0.0p0 0x1.fe00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5178 1 OK 0x1.8d4eadad34ea8p18 0x1.654a758ba31dcp20 0x0.0p0 0x1.e49ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG epsg:5178 2 OK 0x1.84f45494b2c4cp20 0x1.654a758ba31dbp20 0x0.0p0 0x1.0bb0afc71a072p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG epsg:5178 3 OK 0x1.d77ea60dea5dp18 0x1.3a457f5990b82p21 0x0.0p0 0x1.e49ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5178 4 OK 0x1.7268567c85682p20 0x1.3a457f5990b82p21 0x0.0p0 0x1.0bb0afc6f4377p7 0x1.57ffffff547abp5 0x0.0p0 F +REG epsg:5179 0 OK 0x1.e848p19 0x1.e848p20 0x0.0p0 0x1.fe00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5179 1 OK 0x1.8d3d0804032c8p18 0x1.6546eb2ec9f7dp20 0x0.0p0 0x1.e49ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5179 2 OK 0x1.84f8bdfeff344p20 0x1.6546eb2ec9f7cp20 0x0.0p0 0x1.0bb0afc71a351p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5179 3 OK 0x1.d76f0b30c8978p18 0x1.3a47743a985f6p21 0x0.0p0 0x1.e49ea072174fp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:5179 4 OK 0x1.726c3d33cdd99p20 0x1.3a47743a985f6p21 0x0.0p0 0x1.0bb0afc6f4588p7 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:5180 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.f400000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5180 1 OK -0x1.803e50b1ebd1ep18 -0x1.1f900c6f4c37p15 0x0.0p0 0x1.da9ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5180 2 OK 0x1.836f2858f5e7cp19 -0x1.1f900c6f4c39p15 0x0.0p0 0x1.06b0afc71a351p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5180 3 OK -0x1.3604b3c143d35p18 0x1.06674734cd4b6p20 0x0.0p0 0x1.da9ea072174fp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5180 4 OK 0x1.5e5259e0a1e88p19 0x1.06674734cd4b6p20 0x0.0p0 0x1.06b0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5181 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5181 1 OK -0x1.803e50b1ebd1ep18 -0x1.1f900c6f4c37p15 0x0.0p0 0x1.e29ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5181 2 OK 0x1.836f2858f5e7cp19 -0x1.1f900c6f4c39p15 0x0.0p0 0x1.0ab0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5181 3 OK -0x1.3604b3c143d35p18 0x1.06674734cd4b6p20 0x0.0p0 0x1.e29ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5181 4 OK 0x1.5e5259e0a1e88p19 0x1.06674734cd4b6p20 0x0.0p0 0x1.0ab0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5182 0 OK 0x1.86ap17 0x1.0c8ep19 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5182 1 OK -0x1.803e50b1ebd1ep18 0x1.9c3fce42cf24p13 0x0.0p0 0x1.e29ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5182 2 OK 0x1.836f2858f5e7cp19 0x1.9c3fce42cf1cp13 0x0.0p0 0x1.0ab0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5182 3 OK -0x1.3604b3c143d35p18 0x1.129c4734cd4b6p20 0x0.0p0 0x1.e29ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5182 4 OK 0x1.5e5259e0a1e88p19 0x1.129c4734cd4b6p20 0x0.0p0 0x1.0ab0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5183 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.02p7 0x1.3p5 0x0.0p0 F +REG epsg:5183 1 OK -0x1.803e50b1ebcf8p18 -0x1.1f900c6f4c39p15 0x0.0p0 0x1.ea9ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5183 2 OK 0x1.836f2858f5e8fp19 -0x1.1f900c6f4c37p15 0x0.0p0 0x1.0eb0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5183 3 OK -0x1.3604b3c143d1p18 0x1.06674734cd4b6p20 0x0.0p0 0x1.ea9ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5183 4 OK 0x1.5e5259e0a1e9ap19 0x1.06674734cd4b6p20 0x0.0p0 0x1.0eb0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5184 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.06p7 0x1.3p5 0x0.0p0 F +REG epsg:5184 1 OK -0x1.803e50b1ebcf8p18 -0x1.1f900c6f4c39p15 0x0.0p0 0x1.f29ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5184 2 OK 0x1.836f2858f5e8fp19 -0x1.1f900c6f4c37p15 0x0.0p0 0x1.12b0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5184 3 OK -0x1.3604b3c143d1p18 0x1.06674734cd4b6p20 0x0.0p0 0x1.f29ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5184 4 OK 0x1.5e5259e0a1e9ap19 0x1.06674734cd4b6p20 0x0.0p0 0x1.12b0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5185 0 OK 0x1.86ap17 0x1.24f8p19 0x0.0p0 0x1.f400000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5185 1 OK -0x1.803e50b1ebd1ep18 0x1.edaff390b3c9p15 0x0.0p0 0x1.da9ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5185 2 OK 0x1.836f2858f5e7cp19 0x1.edaff390b3c7p15 0x0.0p0 0x1.06b0afc71a351p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5185 3 OK -0x1.3604b3c143d35p18 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.da9ea072174fp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5185 4 OK 0x1.5e5259e0a1e88p19 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.06b0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5186 0 OK 0x1.86ap17 0x1.24f8p19 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG epsg:5186 1 OK -0x1.803e50b1ebd1ep18 0x1.edaff390b3c9p15 0x0.0p0 0x1.e29ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5186 2 OK 0x1.836f2858f5e7cp19 0x1.edaff390b3c7p15 0x0.0p0 0x1.0ab0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5186 3 OK -0x1.3604b3c143d35p18 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.e29ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5186 4 OK 0x1.5e5259e0a1e88p19 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.0ab0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5187 0 OK 0x1.86ap17 0x1.24f8p19 0x0.0p0 0x1.02p7 0x1.3p5 0x0.0p0 F +REG epsg:5187 1 OK -0x1.803e50b1ebcf8p18 0x1.edaff390b3c7p15 0x0.0p0 0x1.ea9ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5187 2 OK 0x1.836f2858f5e8fp19 0x1.edaff390b3c9p15 0x0.0p0 0x1.0eb0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5187 3 OK -0x1.3604b3c143d1p18 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.ea9ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5187 4 OK 0x1.5e5259e0a1e9ap19 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.0eb0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5188 0 OK 0x1.86ap17 0x1.24f8p19 0x0.0p0 0x1.06p7 0x1.3p5 0x0.0p0 F +REG epsg:5188 1 OK -0x1.803e50b1ebcf8p18 0x1.edaff390b3c7p15 0x0.0p0 0x1.f29ea071cb95dp6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5188 2 OK 0x1.836f2858f5e8fp19 0x1.edaff390b3c9p15 0x0.0p0 0x1.12b0afc71a352p7 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:5188 3 OK -0x1.3604b3c143d1p18 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.f29ea072174f1p6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5188 4 OK 0x1.5e5259e0a1e9ap19 0x1.1ed14734cd4b6p20 0x0.0p0 0x1.12b0afc6f4588p7 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:5221 0 OK 0x1.35b2804c01fp20 -0x1.ed90f031cef9ep19 0x1.5179cb644p4 0x1.5400000000001p5 0x1.8c00000000008p5 0x1.0p-30 F +REG epsg:5221 1 OK 0x1.82f717890a0b1p19 -0x1.9630fe3f1888ap20 -0x1.464e2a02p2 0x1.1668c3d6deab6p5 0x1.6400000000006p5 -0x1.0p-29 F +REG epsg:5221 2 OK 0x1.e5f9212217ae8p20 -0x1.51271b31da6c8p20 0x1.e1f628894p5 0x1.91973c292154dp5 0x1.63ffffffffffep5 0x0.0p0 F +REG epsg:5221 3 OK 0x1.3c5957f7cb6aap19 -0x1.116df2828760dp19 -0x1.fb7f01ep-1 0x1.1668c3d6deaaep5 0x1.b4p5 0x1.0p-30 F +REG epsg:5221 4 OK 0x1.8aa496aeeab4bp20 -0x1.3f29dee7a3509p18 0x1.a1ace0c5cp5 0x1.91973c2921554p5 0x1.b400000000011p5 0x1.0p-28 F +REG epsg:5223 0 OK 0x1.e848p18 0x1.e848p18 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:5223 1 OK -0x1.ad750e7d8384p15 -0x1.abf5b741bfafp15 0x0.0p0 0x1.c0000001d501cp2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5223 2 OK 0x1.018fa873ec1c2p20 -0x1.abf5b741bfafp15 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5223 3 OK -0x1.ad750e7d8384p15 0x1.0183adba0dfd8p20 0x0.0p0 0x1.c0000001d501cp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5223 4 OK 0x1.018fa873ec1c2p20 0x1.0183adba0dfd8p20 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5228 0 OK -0x1.2396109ddafffp-9 -0x1.eb9085c7e849p-9 0x1.222da6ac2p7 -0x1.5fd497d5ae43dp-27 -0x1.2ff8eab87e6b4p-25 0x1.2597c8p-8 T +REG epsg:5228 1 OK -0x1.402db92f079f9p2 -0x1.4040c86160ad3p2 0x1.89248fc47p7 -0x1.4000000c59543p2 -0x1.40000023b51ddp2 0x1.5eefp-8 F +REG epsg:5228 2 OK 0x1.3fe0e886564a3p2 -0x1.4044f25e7be45p2 0x1.6b88f6e6cp7 0x1.3ffffff8b3ea6p2 -0x1.400000260bf16p2 0x1.479054p-8 F +REG epsg:5228 3 OK -0x1.4029e8ddf3634p2 0x1.3fca571a6f502p2 0x1.d07501965p6 -0x1.4000000eee0a4p2 0x1.3fffffdb28b82p2 0x1.08e2c8p-8 F +REG epsg:5228 4 OK 0x1.3fe4eed4a9809p2 0x1.3fc68f7af5d2fp2 0x1.951dc4427p6 0x1.3ffffff743ef2p2 0x1.3fffffd97cc73p2 0x1.d98498p-9 F +REG epsg:5229 0 OK 0x1.1aa18dfa25bbep4 -0x1.eb9085c7e849p-9 0x1.222da6ac2p7 -0x1.5fd48ef97d77fp-27 -0x1.2ff8eab87e6b4p-25 0x1.2597c8p-8 T +REG epsg:5229 1 OK 0x1.953e78bdd185ap3 -0x1.4040c86160ad3p2 0x1.89248fc47p7 -0x1.4000000c5954p2 -0x1.40000023b51ddp2 0x1.5eefp-8 F +REG epsg:5229 2 OK 0x1.6aa2e4cc403d4p4 -0x1.4044f25e7be45p2 0x1.6b88f6e6cp7 0x1.3ffffff8b3ea6p2 -0x1.400000260bf16p2 0x1.479054p-8 F +REG epsg:5229 3 OK 0x1.954060e65ba3cp3 0x1.3fca571a6f502p2 0x1.d07501965p6 -0x1.4000000eee0a3p2 0x1.3fffffdb28b82p2 0x1.08e2c8p-8 F +REG epsg:5229 4 OK 0x1.6aa3e65fd50adp4 0x1.3fc68f7af5d2fp2 0x1.951dc4427p6 0x1.3ffffff743ef1p2 0x1.3fffffd97cc73p2 0x1.d98498p-9 F +REG epsg:5233 0 OK -0x1.015f1d5da3441p-7 -0x1.4eb453ef8c73ep-12 0x1.ae9f951cdp9 -0x1.ed3c3f1329a44p-32 -0x1.fa1a5ab3af7fp-31 0x1.25782p-9 T +REG epsg:5233 1 OK -0x1.4080b24ee2eb9p2 -0x1.3fff8d57784p2 0x1.d3073ce746p9 -0x1.3fffffff5fc1cp2 -0x1.3ffffffeb51dcp2 0x1.24f11p-9 F +REG epsg:5233 2 OK 0x1.3f7f2d3b01bf8p2 -0x1.40016f4360fcfp2 0x1.90705b793ep9 0x1.3fffffffe631fp2 -0x1.4000000031783p2 0x1.262e08p-9 F +REG epsg:5233 3 OK -0x1.4080a8caf008p2 0x1.3ff54a06e2f48p2 0x1.cb6a1c06dp9 -0x1.40000000dce47p2 0x1.3ffffffe3d392p2 0x1.23d408p-9 F +REG epsg:5233 4 OK 0x1.3f7f729475bc6p2 0x1.3ff6dbe189b47p2 0x1.88d30771d6p9 0x1.3ffffffe70ae7p2 0x1.3ffffffcc8574p2 0x1.1e1658p-9 F +REG epsg:5234 0 OK 0x1.863108625e2abp17 0x1.868d8e2a96263p17 0x1.6f7eaa996p6 0x1.43163b7000ba8p6 0x1.c007de6e564ecp2 -0x1.0p-28 F +REG epsg:5234 1 OK -0x1.60ddf38246b72p18 -0x1.57c8487ff8448p18 0x1.dc3c1a8e4p6 0x1.2eefc6cce573ap6 0x1.000fbcdc9a674p1 0x1.6p-27 F +REG epsg:5234 2 OK 0x1.73877d988885ap19 -0x1.57c8488122d98p18 0x1.406517679p6 0x1.573cb0131c293p6 0x1.000fbcdc9a809p1 -0x1.2p-27 F +REG epsg:5234 3 OK -0x1.553c63b026538p18 0x1.721a1236d5363p19 0x1.c0b84799ap6 0x1.2eefc6ccd50e2p6 0x1.8003ef3714cacp3 0x1.8p-28 F +REG epsg:5234 4 OK 0x1.6db6b5b39d74bp19 0x1.721a1233a5a62p19 0x1.283141436p6 0x1.573cb0132c7b1p6 0x1.8003ef3714e9bp3 -0x1.0p-28 F +REG epsg:5235 0 OK 0x1.e810220df77fep18 0x1.e83ed49616e2ap18 0x1.80a9a8f1ep6 0x1.43163bf4575e6p6 0x1.c007b9b11ead2p2 0x1.9cc8p-10 F +REG epsg:5235 1 OK -0x1.df3d49a9896bp15 -0x1.967733b8202p15 0x1.cb68cc6cfp6 0x1.2eefc7578d556p6 0x1.000f7364210f2p1 0x1.cb866p-10 F +REG epsg:5235 2 OK 0x1.030145403b47cp20 -0x1.968b1693c1ffp15 0x1.74d714b49p6 0x1.573cb09122c41p6 0x1.000f7363feb09p1 0x1.c98c9p-10 F +REG epsg:5235 3 OK -0x1.821a08c0db4fp15 0x1.024b6cbcdcca5p20 0x1.af1d05c74p6 0x1.2eefc75779b34p6 0x1.8003dcd830feep3 0x1.6ed72p-10 F +REG epsg:5235 4 OK 0x1.0019992d886a6p20 0x1.024aa0b063e47p20 0x1.5a57b5c1bp6 0x1.573cb0913417dp6 0x1.8003dcd82ab93p3 0x1.6c4f2p-10 F +REG epsg:5243 0 OK 0x0.0p0 0x1.21704ec5c1a64p14 0x0.0p0 0x1.5p3 0x1.9955555555048p5 0x0.0p0 F +REG epsg:5243 1 OK -0x1.2cee51627733p19 -0x1.ec6462d6061ddp18 0x0.0p0 0x1.435bfb6f51cbdp1 0x1.715555555554cp5 0x0.0p0 F +REG epsg:5243 2 OK 0x1.2cee51627733p19 -0x1.ec6462d6061ddp18 0x0.0p0 0x1.2794809215c68p4 0x1.715555555554cp5 0x0.0p0 F +REG epsg:5243 3 OK -0x1.e43d1acbf8f7p18 0x1.2600a7ca4823cp19 0x0.0p0 0x1.435bfb6f51cc1p1 0x1.c15555555537bp5 0x0.0p0 F +REG epsg:5243 4 OK 0x1.e43d1acbf8f7p18 0x1.2600a7ca4823cp19 0x0.0p0 0x1.2794809215c68p4 0x1.c15555555537bp5 0x0.0p0 F +REG epsg:5244 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5244 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5244 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5244 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5244 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5246 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5246 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5246 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5246 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5246 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5247 0 OK 0x1.205724b81a965p19 0x1.b082b7125218cp18 0x0.0p0 0x1.ccp6 0x1.ffffffffffd07p1 0x0.0p0 F +REG epsg:5247 1 OK 0x1.068c0a71caf7cp15 -0x1.afd00590d0b7fp16 0x0.0p0 0x1.b7f37f5af8062p6 -0x1.ffffffffe27cfp-1 0x0.0p0 T +REG epsg:5247 2 OK 0x1.195905b4dfa26p20 -0x1.a6d9033cb77ecp16 0x0.0p0 0x1.e00c80a507f9dp6 -0x1.ffffffffe275cp-1 0x0.0p0 T +REG epsg:5247 3 OK 0x1.14b88f59478ap15 0x1.e71229f3fade9p19 0x0.0p0 0x1.b7f37f5af8062p6 0x1.1fffffffffe6fp3 0x0.0p0 F +REG epsg:5247 4 OK 0x1.167ccdb15398dp20 0x1.e82860b60e0d4p19 0x0.0p0 0x1.e00c80a507f9dp6 0x1.1fffffffffe6fp3 0x0.0p0 F +REG epsg:5250 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5250 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5250 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5250 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5250 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5252 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5252 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5252 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5252 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5252 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5253 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:5253 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5253 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abfap4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5253 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5253 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abfap4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5254 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:5254 1 OK -0x1.af3135ef97cp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5254 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5254 3 OK -0x1.af3135ef97cp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5254 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5255 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:5255 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5255 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2fffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5255 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5255 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2fffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5256 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG epsg:5256 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5256 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.47ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5256 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5256 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.47ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5257 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:5257 1 OK -0x1.af3135ef97bdp15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.100000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5257 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5fffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5257 3 OK -0x1.af3135ef97bdp15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.100000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5257 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5fffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5258 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG epsg:5258 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.280000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5258 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.77ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5258 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.280000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5258 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.77ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5259 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:5259 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.400000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5259 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5259 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.400000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5259 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5262 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5262 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5262 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5262 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5262 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5264 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5264 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5264 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5264 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5264 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5266 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:5266 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.540000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5266 2 OK 0x1.8929135ef97c9p19 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5266 3 OK -0x1.2a0a26bdf2f7ap18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.540000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5266 4 OK 0x1.8929135ef97c9p19 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5269 0 OK 0x1.21eacp23 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:5269 1 OK 0x1.10f94eca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5269 2 OK 0x1.32dc3135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abf8p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5269 3 OK 0x1.10f94eca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.6000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5269 4 OK 0x1.32dc3135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.ffffffff8abf8p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5270 0 OK 0x1.406f4p23 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:5270 1 OK 0x1.2f7dceca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5270 2 OK 0x1.5160b135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5270 3 OK 0x1.2f7dceca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5270 4 OK 0x1.5160b135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.17ffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5271 0 OK 0x1.5ef3cp23 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:5271 1 OK 0x1.4e024eca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5271 2 OK 0x1.6fe53135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2fffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5271 3 OK 0x1.4e024eca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5271 4 OK 0x1.6fe53135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.2fffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5272 0 OK 0x1.7d784p23 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG epsg:5272 1 OK 0x1.6c86ceca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f000000075408p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5272 2 OK 0x1.8e69b135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.47ffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5272 3 OK 0x1.6c86ceca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.f000000075408p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5272 4 OK 0x1.8e69b135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.47ffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5273 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:5273 1 OK 0x1.8b0b4eca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.100000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5273 2 OK 0x1.acee3135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5fffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5273 3 OK 0x1.8b0b4eca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.100000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5273 4 OK 0x1.acee3135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.5fffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5274 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG epsg:5274 1 OK 0x1.a98fceca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.280000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5274 2 OK 0x1.cb72b135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.77ffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5274 3 OK 0x1.a98fceca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.280000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5274 4 OK 0x1.cb72b135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.77ffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5275 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:5275 1 OK 0x1.c8144eca10684p23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.400000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5275 2 OK 0x1.e9f73135ef97cp23 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffffc55fcp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5275 3 OK 0x1.c8144eca10684p23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.400000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5275 4 OK 0x1.e9f73135ef97cp23 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffffc55fcp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5292 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6aeeeeeeeeeefp6 0x0.0p0 0x0.0p0 T +REG epsg:5292 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.56eeeeef0c3f1p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5292 2 OK 0x1.8929135ef97c9p19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7eeeeeeed19edp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5292 3 OK -0x1.2a0a26bdf2f7ap18 -0x1.dada72449d12ep20 0x0.0p0 0x1.56eeeeef0c3f1p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5292 4 OK 0x1.8929135ef97c9p19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7eeeeeeed19edp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5293 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6633333333333p6 0x0.0p0 0x0.0p0 T +REG epsg:5293 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5233333350835p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5293 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7a33333315e31p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5293 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5233333350835p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5293 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7a33333315e31p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5294 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6766666666666p6 0x0.0p0 0x0.0p0 T +REG epsg:5294 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5366666683b69p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5294 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7b66666649164p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5294 3 OK -0x1.2a0a26bdf2f7ap18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5366666683b69p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5294 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7b66666649164p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5295 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6822222222222p6 0x0.0p0 0x0.0p0 T +REG epsg:5295 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.542222223f724p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5295 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7c22222204d2p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5295 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.542222223f724p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5295 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7c22222204d2p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5296 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.689999999999ap6 0x0.0p0 0x0.0p0 T +REG epsg:5296 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.54999999b6e9cp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5296 2 OK 0x1.8929135ef97c9p19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7c9999997c498p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5296 3 OK -0x1.2a0a26bdf2f7ap18 -0x1.dada72449d12ep20 0x0.0p0 0x1.54999999b6e9cp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5296 4 OK 0x1.8929135ef97c9p19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7c9999997c498p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5297 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6c88888888889p6 0x0.0p0 0x0.0p0 T +REG epsg:5297 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.58888888a5d8bp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5297 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.808888886b387p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5297 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.58888888a5d8bp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5297 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.808888886b387p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5298 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6ceeeeeeeeeefp6 0x0.0p0 0x0.0p0 T +REG epsg:5298 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.58eeeeef0c3f1p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5298 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.80eeeeeed19edp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5298 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.58eeeeef0c3f1p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5298 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.80eeeeeed19edp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5299 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6566666666667p6 0x0.0p0 0x0.0p0 T +REG epsg:5299 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5166666683b68p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5299 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7966666649164p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5299 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5166666683b68p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5299 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7966666649164p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5300 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6d66666666666p6 0x0.0p0 0x0.0p0 T +REG epsg:5300 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5966666683b68p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5300 2 OK 0x1.8929135ef97c9p19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.8166666649164p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5300 3 OK -0x1.2a0a26bdf2f7ap18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5966666683b68p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5300 4 OK 0x1.8929135ef97c9p19 -0x1.dada72449d12ep20 0x0.0p0 0x1.8166666649164p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5301 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6766666666666p6 0x0.0p0 0x0.0p0 T +REG epsg:5301 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5366666683b69p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5301 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7b66666649164p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5301 3 OK -0x1.2a0a26bdf2f7ap18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5366666683b69p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5301 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7b66666649164p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5302 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6e44444444444p6 0x0.0p0 0x0.0p0 T +REG epsg:5302 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5a44444461946p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5302 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.8244444426f42p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5302 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5a44444461946p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5302 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.8244444426f42p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5303 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6444444444444p6 0x0.0p0 0x0.0p0 T +REG epsg:5303 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5044444461946p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5303 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7844444426f42p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5303 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5044444461946p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5303 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7844444426f42p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5304 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6911111111111p6 0x0.0p0 0x0.0p0 T +REG epsg:5304 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.551111112e613p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5304 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7d111110f3c0fp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5304 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.551111112e613p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5304 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7d111110f3c0fp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5305 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6633333333333p6 0x0.0p0 0x0.0p0 T +REG epsg:5305 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5233333350835p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5305 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7a33333315e31p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5305 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5233333350835p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5305 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7a33333315e31p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5306 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6fp6 0x0.0p0 0x0.0p0 T +REG epsg:5306 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5b0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5306 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.82ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5306 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5b0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5306 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.82ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5307 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6ap6 0x0.0p0 0x0.0p0 T +REG epsg:5307 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.560000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5307 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7dffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5307 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.560000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5307 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7dffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5308 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.68aaaaaaaaaabp6 0x0.0p0 0x0.0p0 T +REG epsg:5308 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.54aaaaaac7fadp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5308 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7caaaaaa8d5a9p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5308 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.54aaaaaac7fadp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5308 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7caaaaaa8d5a9p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5309 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6877777777778p6 0x0.0p0 0x0.0p0 T +REG epsg:5309 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5477777794c79p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5309 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7c7777775a275p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5309 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5477777794c79p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5309 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7c7777775a275p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5310 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6e44444444444p6 0x0.0p0 0x0.0p0 T +REG epsg:5310 1 OK -0x1.2a0a26bdf2f92p18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5a44444461946p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5310 2 OK 0x1.8929135ef97bdp19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.8244444426f42p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5310 3 OK -0x1.2a0a26bdf2f92p18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5a44444461946p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5310 4 OK 0x1.8929135ef97bdp19 -0x1.dada72449d12ep20 0x0.0p0 0x1.8244444426f42p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5311 0 OK 0x1.e848p17 -0x1.312dp21 0x0.0p0 0x1.6b77777777777p6 0x0.0p0 0x0.0p0 T +REG epsg:5311 1 OK -0x1.2a0a26bdf2f7ap18 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.5777777794c79p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5311 2 OK 0x1.8929135ef97c9p19 -0x1.74ecc6ddb1769p21 0x0.0p0 0x1.7f7777775a275p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5311 3 OK -0x1.2a0a26bdf2f7ap18 -0x1.dada72449d12ep20 0x0.0p0 0x1.5777777794c79p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5311 4 OK 0x1.8929135ef97c9p19 -0x1.dada72449d12ep20 0x0.0p0 0x1.7f7777775a275p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5316 0 OK 0x1.86ap17 -0x1.6e36p22 0x0.0p0 -0x1.cp2 0x0.0p0 0x0.0p0 T +REG epsg:5316 1 OK -0x1.5addbc251f464p18 -0x1.9015dcc5e24bfp22 0x0.0p0 -0x1.7fffffff157f2p3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5316 2 OK 0x1.70bede128fa32p19 -0x1.9015dcc5e24bfp22 0x0.0p0 -0x1.00000003aa038p1 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5316 3 OK -0x1.5addbc251f464p18 -0x1.4c56233a1db41p22 0x0.0p0 -0x1.7fffffff157f2p3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5316 4 OK 0x1.70bede128fa32p19 -0x1.4c56233a1db41p22 0x0.0p0 -0x1.00000003aa038p1 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5318 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5318 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5318 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5318 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5318 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5320 0 OK 0x1.e848p19 0x1.b8784e2287311p21 0x0.0p0 -0x1.5p6 0x1.b3fffffffff49p4 0x0.0p0 F +REG epsg:5320 1 OK -0x1.20e530851e51p20 0x1.e451e72b2663fp20 0x0.0p0 -0x1.937d81d3381cep6 0x1.87ffffffffe28p3 0x0.0p0 F +REG epsg:5320 2 OK 0x1.849698428f28cp21 0x1.e451e72b2663fp20 0x0.0p0 -0x1.0c827e2cc7e32p6 0x1.87ffffffffe21p3 0x0.0p0 F +REG epsg:5320 3 OK -0x1.794874f904a84p18 0x1.4e621af7b24dep22 0x0.0p0 -0x1.937d81d3381cep6 0x1.51fffffffffeep5 0x0.0p0 F +REG epsg:5320 4 OK 0x1.234d0e9f20953p21 0x1.4e621af7b24dep22 0x0.0p0 -0x1.0c827e2cc7e32p6 0x1.51fffffffffeep5 0x0.0p0 F +REG epsg:5321 0 OK 0x1.e848p19 0x1.b8784e2287311p21 0x0.0p0 -0x1.5p6 0x1.b3fffffffff49p4 0x0.0p0 F +REG epsg:5321 1 OK -0x1.20e530851e51p20 0x1.e451e72b2663fp20 0x0.0p0 -0x1.937d81d3381cep6 0x1.87ffffffffe28p3 0x0.0p0 F +REG epsg:5321 2 OK 0x1.849698428f28cp21 0x1.e451e72b2663fp20 0x0.0p0 -0x1.0c827e2cc7e32p6 0x1.87ffffffffe21p3 0x0.0p0 F +REG epsg:5321 3 OK -0x1.794874f904a84p18 0x1.4e621af7b24dep22 0x0.0p0 -0x1.937d81d3381cep6 0x1.51fffffffffeep5 0x0.0p0 F +REG epsg:5321 4 OK 0x1.234d0e9f20953p21 0x1.4e621af7b24dep22 0x0.0p0 -0x1.0c827e2cc7e32p6 0x1.51fffffffffeep5 0x0.0p0 F +REG epsg:5322 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5322 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5322 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5322 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5322 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5324 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5324 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5324 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5324 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5324 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5325 0 OK 0x1.9f0ap20 0x1.24f8p18 0x0.0p0 -0x1.3p4 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5325 1 OK 0x1.73e4e1cd4a4efp20 0x1.0d03f55d7296bp17 0x0.0p0 -0x1.68c9f1497133ap4 0x1.fbfffffffffbbp5 0x0.0p0 F +REG epsg:5325 2 OK 0x1.ca2f1e32b5b12p20 0x1.0d03f55d7296bp17 0x0.0p0 -0x1.ee6c1d6d1d98cp3 0x1.fbfffffffffbbp5 0x0.0p0 F +REG epsg:5325 3 OK 0x1.7879fe79cd6ddp20 0x1.cca3f0cac7dd2p18 0x0.0p0 -0x1.68c9f1497133ap4 0x1.09ffffffffff2p6 0x0.0p0 F +REG epsg:5325 4 OK 0x1.c59a018632924p20 0x1.cca3f0cac7dd2p18 0x0.0p0 -0x1.ee6c1d6d1d98cp3 0x1.09ffffffffff2p6 0x0.0p0 F +REG epsg:5329 0 OK -0x1.e5707ecc110aep22 0x1.b76ee429f91cap19 0x1.140acf25a1p10 0x1.989ca634e2471p1 0x1.9d03c4f237c39p-41 0x1.8p-29 T +REG epsg:5329 1 OK -0x1.03a6de6536fafp23 0x1.53fa5fdec6e56p18 0x1.236d8f0009p10 -0x1.cec6b3963b6c1p0 -0x1.3fffffffffe2fp2 -0x1.0p-28 F +REG epsg:5329 2 OK -0x1.c39340a9b88ecp22 0x1.53f7b1a699942p18 0x1.04cec59b99p10 0x1.0627298d38923p3 -0x1.3fffffffffe38p2 -0x1.0p-28 F +REG epsg:5329 3 OK -0x1.03a6de6536fafp23 0x1.62704c3dd2bcep20 0x1.21a4348cabp10 -0x1.cec6b3963b6c1p0 0x1.3fffffffffe23p2 -0x1.0p-28 F +REG epsg:5329 4 OK -0x1.c39340a9b88ecp22 0x1.6270f7c5656fap20 0x1.030568e4dcp10 0x1.0627298d38923p3 0x1.3fffffffffe24p2 -0x1.8p-29 F +REG epsg:5330 0 OK -0x1.e5706d178d1a6p22 0x1.b77a3aedb1ea8p19 0x1.0d980e51d2p10 0x1.989ca634e248bp1 -0x1.fa63d9aff6c78p-41 -0x1.0p-30 T +REG epsg:5330 1 OK -0x1.03a6da0aa620cp23 0x1.54107ba3f53c8p18 0x1.1af31e5869p10 -0x1.cec6b3963b703p0 -0x1.3fffffffffe37p2 -0x1.0p-29 F +REG epsg:5330 2 OK -0x1.c39325f600ff4p22 0x1.540dd1d8c4706p18 0x1.f90b55c5acp9 0x1.0627298d3891fp3 -0x1.3fffffffffe16p2 -0x1.0p-30 F +REG epsg:5330 3 OK -0x1.03a6da0aa620cp23 0x1.62761bf6a392ap20 0x1.1d20de6842p10 -0x1.cec6b3963b703p0 0x1.3fffffffffe27p2 0x0.0p0 F +REG epsg:5330 4 OK -0x1.c39325f600ff4p22 0x1.6276c671475aep20 0x1.fd66db6198p9 0x1.0627298d3891fp3 0x1.3fffffffffe1cp2 0x0.0p0 F +REG epsg:5331 0 OK -0x1.e56e19dd3d3ccp22 0x1.b761d6a01f237p19 0x1.44742aea29p10 0x1.989ca634e248dp1 0x1.6f60e7fd635e8p-39 0x1.0p-29 T +REG epsg:5331 1 OK -0x1.03a58a2ad75ecp23 0x1.53e42eccfc35cp18 0x1.526aed2bc7p10 -0x1.cec6b3963b6eep0 -0x1.3fffffffffe2dp2 -0x1.0p-29 F +REG epsg:5331 2 OK -0x1.c3911f48eace4p22 0x1.53e2160ee406ep18 0x1.3a786cafecp10 0x1.0627298d3891fp3 -0x1.3fffffffffe29p2 -0x1.0p-28 F +REG epsg:5331 3 OK -0x1.03a58a2ad75ecp23 0x1.6268cb1320ba8p20 0x1.4c1106870ep10 -0x1.cec6b3963b6eep0 0x1.3fffffffffe2ap2 -0x1.0p-29 F +REG epsg:5331 4 OK -0x1.c3911f48eace4p22 0x1.62695130a9022p20 0x1.341e7fc06bp10 0x1.0627298d3891fp3 0x1.3fffffffffe1ap2 -0x1.0p-28 F +REG epsg:5332 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5332 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5332 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5332 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5332 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5337 0 OK 0x1.e820870851dcfp18 0x1.b999fab76c462p22 -0x1.3e971bf8p5 -0x1.0800000000001p5 -0x1.8ffffffffffffp4 -0x1.0p-30 F +REG epsg:5337 1 OK -0x1.fe6f6a9fdf5cp14 0x1.970387a6d0fd1p22 -0x1.612513a4ep5 -0x1.342297030ae5ep5 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:5337 2 OK 0x1.f81402289fc1fp19 0x1.970387a75e98ap22 -0x1.19c6c3ad5p6 -0x1.b7bad1f9ea347p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5337 3 OK -0x1.30783ddb3f4fp16 0x1.daccf81ade6c2p22 -0x1.61904d908p3 -0x1.342297030ae5dp5 -0x1.4000000000003p4 0x1.0p-29 F +REG epsg:5337 4 OK 0x1.0717c74511387p20 0x1.daccf81b6537ap22 -0x1.3cb23f224p5 -0x1.b7bad1f9ea348p4 -0x1.4p4 0x0.0p0 F +REG epsg:5340 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5340 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5340 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5340 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5340 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5341 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5341 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5341 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5341 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5341 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5343 0 OK 0x1.6e36p20 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.2p6 -0x1.64p6 0x0.0p0 F +REG epsg:5343 1 OK 0x1.5698411b88857p20 0x1.b45655538e461p15 0x0.0p0 0x1.bp6 -0x1.68329508fef8bp6 0x0.0p0 F +REG epsg:5343 2 OK 0x1.85d3bee4777a9p20 0x1.b45655538e464p15 0x0.0p0 0x1.bp6 -0x1.68329508fef8bp6 0x0.0p0 F +REG epsg:5343 3 OK 0x1.f01c5648f332bp19 0x1.113262ef4fcfdp18 0x0.0p0 0x1.bp6 -0x1.68d3a0e26d577p6 0x0.0p0 F +REG epsg:5343 4 OK 0x1.e45dd4db8666ap20 0x1.113262ef4fcffp18 0x0.0p0 0x1.bp6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:5344 0 OK 0x1.312dp21 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG epsg:5344 1 OK 0x1.255e208dc442bp21 0x1.b45655538e464p15 0x0.0p0 0x1.bcp6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:5344 2 OK 0x1.3cfbdf723bbd5p21 0x1.b45655538e464p15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:5344 3 OK 0x1.ec322b2479996p20 0x1.113262ef4fcffp18 0x0.0p0 0x1.bcp6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:5344 4 OK 0x1.6c40ea6dc3335p21 0x1.113262ef4fcffp18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:5345 0 OK 0x1.ab3fp21 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.08p6 -0x1.64p6 0x0.0p0 F +REG epsg:5345 1 OK 0x1.9f70208dc442bp21 0x1.b45655538e464p15 0x0.0p0 0x1.c8p6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:5345 2 OK 0x1.b70ddf723bbd5p21 0x1.b45655538e461p15 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68329508fef8cp6 0x0.0p0 F +REG epsg:5345 3 OK 0x1.702b15923cccbp21 0x1.113262ef4fcffp18 0x0.0p0 0x1.c8p6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:5345 4 OK 0x1.e652ea6dc3335p21 0x1.113262ef4fcfdp18 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:5346 0 OK 0x1.12a88p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.f8p5 -0x1.64p6 0x0.0p0 F +REG epsg:5346 1 OK 0x1.0cc11046e2216p22 0x1.b45655538e461p15 0x0.0p0 0x1.d4p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5346 2 OK 0x1.188fefb91ddeap22 0x1.b45655538e464p15 0x0.0p0 0x1.d4p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5346 3 OK 0x1.ea3d15923cccbp21 0x1.113262ef4fcfdp18 0x0.0p0 0x1.d4p6 -0x1.68d3a0e26d576p6 0x0.0p0 F +REG epsg:5346 4 OK 0x1.30327536e199ap22 0x1.113262ef4fcffp18 0x0.0p0 0x1.d4p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:5347 0 OK 0x1.4fb18p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 F +REG epsg:5347 1 OK 0x1.49ca1046e2216p22 0x1.b45655538e464p15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5347 2 OK 0x1.5598efb91ddeap22 0x1.b45655538e464p15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5347 3 OK 0x1.32278ac91e666p22 0x1.113262ef4fcffp18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:5347 4 OK 0x1.6d3b7536e199ap22 0x1.113262ef4fcffp18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:5348 0 OK 0x1.8cba8p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.c800000000001p5 -0x1.64p6 0x0.0p0 F +REG epsg:5348 1 OK 0x1.86d31046e2216p22 0x1.b45655538e464p15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5348 2 OK 0x1.92a1efb91ddeap22 0x1.b45655538e461p15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5348 3 OK 0x1.6f308ac91e666p22 0x1.113262ef4fcffp18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:5348 4 OK 0x1.aa447536e199bp22 0x1.113262ef4fcfdp18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0e26d579p6 0x0.0p0 F +REG epsg:5349 0 OK 0x1.c9c38p22 0x1.b44ddd6b1d088p16 0x0.0p0 -0x1.bp5 -0x1.64p6 0x0.0p0 F +REG epsg:5349 1 OK 0x1.c3dc1046e2216p22 0x1.b45655538e461p15 0x0.0p0 0x1.f8p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5349 2 OK 0x1.cfaaefb91ddeap22 0x1.b45655538e464p15 0x0.0p0 0x1.f8p6 -0x1.68329508fef8ap6 0x0.0p0 F +REG epsg:5349 3 OK 0x1.ac398ac91e665p22 0x1.113262ef4fcfdp18 0x0.0p0 0x1.f8p6 -0x1.68d3a0e26d579p6 0x0.0p0 F +REG epsg:5349 4 OK 0x1.e74d7536e199ap22 0x1.113262ef4fcffp18 0x0.0p0 0x1.f8p6 -0x1.68d3a0e26d573p6 0x0.0p0 F +REG epsg:5352 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5352 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5352 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5352 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5352 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5354 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5354 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5354 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5354 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5354 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5355 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.f8p5 -0x1.9p4 0x0.0p0 F +REG epsg:5355 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5355 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5355 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5355 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5356 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:5356 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5356 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5356 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:5356 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5357 0 OK 0x1.e848000000016p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.c800000000001p5 -0x1.9p4 0x0.0p0 F +REG epsg:5357 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5357 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5357 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5357 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5358 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5358 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5358 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5358 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5358 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5360 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5360 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5360 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5360 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5360 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5361 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:5361 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5361 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5361 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:5361 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5362 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG epsg:5362 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5362 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5362 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5362 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5363 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5363 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5363 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5363 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5363 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5365 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5365 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5365 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5365 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5365 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5367 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5p6 0x0.0p0 0x0.0p0 T +REG epsg:5367 1 OK -0x1.aec22c13105cp15 -0x1.0ef82b7637f47p19 0x0.0p0 -0x1.63ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5367 2 OK 0x1.019a116098834p20 -0x1.0ef82b7637f47p19 0x0.0p0 -0x1.3c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5367 3 OK -0x1.aec22c13105cp15 0x1.0ef82b7637f47p19 0x0.0p0 -0x1.63ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5367 4 OK 0x1.019a116098834p20 0x1.0ef82b7637f47p19 0x0.0p0 -0x1.3c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5368 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5368 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5368 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5368 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5368 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5369 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5369 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5369 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5369 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5369 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5371 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5371 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5371 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5371 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5371 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5373 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5373 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5373 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5373 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5373 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5379 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5379 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5379 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5379 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5379 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5381 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5381 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5381 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5381 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5381 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5382 0 OK 0x1.e848000000016p18 0x1.b997b10295082p22 0x0.0p0 -0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5382 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5382 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5382 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:5382 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG epsg:5383 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5383 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5383 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5383 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:5383 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:5387 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG epsg:5387 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5387 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5387 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5387 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5388 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:5388 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:5388 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:5388 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:5388 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:5389 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:5389 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5389 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5389 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:5389 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5391 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5391 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5391 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5391 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5391 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5393 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5393 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5393 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5393 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5393 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5396 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.bp4 -0x1.9p4 0x0.0p0 F +REG epsg:5396 1 OK -0x1.fbe5023e2a96p14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5396 2 OK 0x1.f8272811f1548p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.57bad1f9ea348p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5396 3 OK -0x1.2fd8271ed48c8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5396 4 OK 0x1.07218271ed48bp20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.57bad1f9ea348p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5451 0 OK -0x1.c426c36a9f3c3p-11 0x1.d0b785cec66d9p-11 -0x1.1266055f3cp8 0x0.0p0 -0x1.2f74bf1dcfcaep-62 -0x1.0p-30 T +REG epsg:5451 1 OK -0x1.4010c4e1932ebp2 -0x1.3ffa2a25e72fdp2 -0x1.0f3f232e8cp8 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:5451 2 OK 0x1.3ff482a4e864dp2 -0x1.3ffa6178475acp2 -0x1.1feadabf9cp8 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:5451 3 OK -0x1.4010c4e1932ebp2 0x1.401718bba4e48p2 -0x1.fc531a47p7 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:5451 4 OK 0x1.3ff482a4e864dp2 0x1.40175012f85ffp2 -0x1.0ed541c254p8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:5456 0 OK 0x1.e812a21aaddedp18 0x1.099cfc3634ed9p18 0x1.e4560f6c8p4 -0x1.5155555555555p6 0x1.4eeeeeeeeed39p3 0x0.0p0 F +REG epsg:5456 1 OK -0x1.00d2dff2363fp16 -0x1.0e9b9d809cef8p18 0x1.1ca04cb44p5 -0x1.65abf7bf7a7a2p6 0x1.5dddddddddb9cp2 -0x1.0p-28 F +REG epsg:5456 2 OK 0x1.041680338ce7cp20 -0x1.0e9c6e4f1f372p18 -0x1.0b594aeep1 -0x1.3cfeb2eb30309p6 0x1.5dddddddddbb8p2 -0x1.8p-29 F +REG epsg:5456 3 OK -0x1.762b35391195p15 0x1.9562d5cf4cd5bp19 0x1.0079c945dp6 -0x1.65abf7bf7a7a2p6 0x1.eeeeeeeeeecbfp3 0x1.8p-29 F +REG epsg:5456 4 OK 0x1.ff7553ce16d93p19 0x1.95633db88bf6ep19 0x1.ba684ae08p4 -0x1.3cfeb2eb30309p6 0x1.eeeeeeeeeec9bp3 0x1.0p-30 F +REG epsg:5457 0 OK 0x1.e8126af3f5a2fp18 0x1.407487849699bp18 0x1.7a497f5f8p4 -0x1.4eaaaaaaaaaabp6 0x1.1fffffffffe59p3 0x1.0p-28 F +REG epsg:5457 1 OK -0x1.f7a277c77975p15 -0x1.b0c0744bfcbd4p17 0x1.dcd0d3fdcp4 -0x1.62ea7cf4d2aabp6 0x1.ffffffffffc74p1 0x1.0p-29 F +REG epsg:5457 2 OK 0x1.03c64a3ca8b64p20 -0x1.b0c21776d8eep17 -0x1.fbb04407p2 -0x1.3a6ad86082aabp6 0x1.ffffffffffcacp1 -0x1.0p-30 F +REG epsg:5457 3 OK -0x1.800fb7c9da58p15 0x1.b079a0a22eb8cp19 0x1.c7431867p5 -0x1.62ea7cf4d2aabp6 0x1.bfffffffffde4p3 0x0.0p0 F +REG epsg:5457 4 OK 0x1.0009b28b99462p20 0x1.b07a0901df734p19 0x1.434b0d214p4 -0x1.3a6ad86082aabp6 0x1.bfffffffffdc4p3 -0x1.0p-29 F +REG epsg:5458 0 OK 0x1.e848p18 0x1.1d5c650e56042p18 0x0.0p0 -0x1.6955555555555p6 0x1.0d11111110ffbp4 0x0.0p0 F +REG epsg:5458 1 OK -0x1.165b184a7d518p16 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.7a2222222202cp3 0x0.0p0 F +REG epsg:5458 2 OK 0x1.0589b184a7d52p20 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.547098bde0a83p6 0x1.7a2222222202cp3 0x0.0p0 F +REG epsg:5458 3 OK -0x1.4870ab69dd0fp15 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.5d1111111100cp4 0x0.0p0 F +REG epsg:5458 4 OK 0x1.fccf0ab69dd0fp19 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.547098bde0a83p6 0x1.5d1111111100cp4 0x0.0p0 F +REG epsg:5459 0 OK 0x1.e814e56bc6a7ap18 0x1.3e8910f8cbca2p18 0x1.05a2aac8bp6 -0x1.6955555555556p6 0x1.dcccccccccaa3p3 0x1.0p-28 F +REG epsg:5459 1 OK -0x1.10263c16c893p16 -0x1.af952b33dabdcp17 0x1.0fea7fcf1p6 -0x1.7e077a4bda7ecp6 0x1.3cccccccccb04p3 -0x1.0p-29 F +REG epsg:5459 2 OK 0x1.050cd7fb24692p20 -0x1.af96bb7ae4c5p17 0x1.fa8028c64p4 -0x1.54a3305ed02cp6 0x1.3cccccccccb03p3 0x0.0p0 F +REG epsg:5459 3 OK -0x1.575c83f9fd3dp15 0x1.b0dd1e7ca9419p19 0x1.8f2f50696p6 -0x1.7e077a4bda7ecp6 0x1.3e66666666563p4 -0x1.0p-29 F +REG epsg:5459 4 OK 0x1.fd8aab4759f77p19 0x1.b0dd81dbcc5c1p19 0x1.0481738f6p6 -0x1.54a3305ed02cp6 0x1.3e66666666561p4 -0x1.0p-29 F +REG epsg:5460 0 OK 0x1.e814575336803p18 0x1.210e071af5317p18 0x1.c94e134ep5 -0x1.64p6 0x1.b911111110eedp3 -0x1.0p-29 F +REG epsg:5460 1 OK -0x1.0c59ccbb571f8p16 -0x1.eb90094fcdd1cp17 0x1.e308ea702p5 -0x1.7897cf19bc278p6 0x1.1911111110f71p3 0x1.0p-29 F +REG epsg:5460 2 OK 0x1.04cfc9e235d4ep20 -0x1.eb919dd7ca988p17 0x1.7bab33c3p4 -0x1.4f6830e643d89p6 0x1.1911111110f73p3 0x1.0p-29 F +REG epsg:5460 3 OK -0x1.5f726d833108p15 0x1.a1e0a1898255cp19 0x1.6dc46d748p6 -0x1.7897cf19bc278p6 0x1.2c88888888777p4 -0x1.0p-29 F +REG epsg:5460 4 OK 0x1.fe0b7bf7d531ap19 0x1.a1e10605ef6dbp19 0x1.c2a84f926p5 -0x1.4f6830e643d89p6 0x1.2c88888888775p4 0x1.0p-29 F +REG epsg:5461 0 OK 0x1.e81307cd182b6p18 0x1.5fa38f905d1e4p18 0x1.681e49188p5 -0x1.56p6 0x1.bbbbbbbbbb996p3 0x0.0p0 F +REG epsg:5461 1 OK -0x1.0c871b4aea04p16 -0x1.6e41fb7ce03bcp17 0x1.83e959e2cp5 -0x1.6a99b23a23b51p6 0x1.1bbbbbbbbba2dp3 -0x1.0p-29 F +REG epsg:5461 2 OK 0x1.04d1f7137a636p20 -0x1.6e439a49f474p17 0x1.5cdac0e4p3 -0x1.41664dc5dc4bp6 0x1.1bbbbbbbbba1bp3 -0x1.8p-29 F +REG epsg:5461 3 OK -0x1.5ea585c4702p15 0x1.c12c16588e8c5p19 0x1.408beca5fp6 -0x1.6a99b23a23b51p6 0x1.2dddddddddcccp4 0x0.0p0 F +REG epsg:5461 4 OK 0x1.fdfd5de358ce3p19 0x1.c12c7d61373ecp19 0x1.611c8bc8ap5 -0x1.41664dc5dc4bp6 0x1.2dddddddddcc7p4 -0x1.0p-30 F +REG epsg:5462 0 OK 0x1.e8130786fdd46p18 0x1.1a46a1611ef9ep18 0x1.32627b182p5 -0x1.56p6 0x1.7777777777585p3 0x1.0p-29 F +REG epsg:5462 1 OK -0x1.051be684e27ap16 -0x1.facbb65d70e16p17 0x1.56bee7f64p5 -0x1.6a6d446c2c6c9p6 0x1.aeeeeeeeeec95p2 0x0.0p0 F +REG epsg:5462 2 OK 0x1.045b436f81cdep20 -0x1.facd54fd4bd8ep17 0x1.58649b6ap2 -0x1.4192bb93d3938p6 0x1.aeeeeeeeeec9p2 0x0.0p0 F +REG epsg:5462 3 OK -0x1.6d6621b3e231p15 0x1.9dff8f11d151ap19 0x1.21f7e3258p6 -0x1.6a6d446c2c6c9p6 0x1.0bbbbbbbbbaa4p4 0x1.4p-28 F +REG epsg:5462 4 OK 0x1.fee967c6b8f62p19 0x1.9dfff62bd8fd8p19 0x1.22f07d1b2p5 -0x1.4192bb93d3938p6 0x1.0bbbbbbbbbaa5p4 0x1.0p-30 F +REG epsg:5463 0 OK 0x1.e85855920f079p18 0x1.340981bb7d227p5 -0x1.071f5a54p3 -0x1.44p6 0x0.0p0 0x1.8p-29 T +REG epsg:5463 1 OK -0x1.acf4675c0c5ep15 -0x1.0edea249e9ec2p19 -0x1.15cd5b36p4 -0x1.58p6 -0x1.4p2 -0x1.8p-29 F +REG epsg:5463 2 OK 0x1.0193ce11cab2p20 -0x1.0edea24a5487p19 -0x1.80cc59cep2 -0x1.3p6 -0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:5463 3 OK -0x1.acf33abdaa49p15 0x1.0ee8428152385p19 -0x1.54bdc5efp3 -0x1.58p6 0x1.4000000000001p2 -0x1.8p-29 F +REG epsg:5463 4 OK 0x1.0193c4ac475e6p20 0x1.0ee84281bcda8p19 0x1.676aa5dp-1 -0x1.3p6 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:5464 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5464 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5464 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5464 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5464 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5466 0 OK 0x1.02ac0740b06a1p16 0x1.0931c1474ddcap17 0x0.0p0 -0x1.628705a708edep6 0x1.10fad8d548846p4 0x0.0p0 F +REG epsg:5466 1 OK -0x1.ec296c569ea9ep18 -0x1.924f2a221121dp18 0x0.0p0 -0x1.7772b7943022cp6 0x1.81f5b1aa7349ep3 0x0.0p0 F +REG epsg:5466 2 OK 0x1.36bfb7fb7b6f7p19 -0x1.924f2a221121dp18 0x0.0p0 -0x1.4d9b53b9e1b9p6 0x1.81f5b1aa7349ep3 0x0.0p0 F +REG epsg:5466 3 OK -0x1.cf126a12a29a8p18 0x1.55143f8fbf58ap19 0x0.0p0 -0x1.7772b7944e468p6 0x1.60fad8d52f962p4 0x0.0p0 F +REG epsg:5466 4 OK 0x1.283436d97d67cp19 0x1.55143f8fbf58ap19 0x0.0p0 -0x1.4d9b53b9c3954p6 0x1.60fad8d52f962p4 0x0.0p0 F +REG epsg:5467 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5467 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5467 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5467 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5467 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5469 0 OK 0x1.e848p18 0x1.1ff453645a1cbp18 0x0.0p0 -0x1.4p6 0x1.0d555555553c1p3 0x0.0p0 F +REG epsg:5469 1 OK -0x1.f1cf0a4b5d0cp15 -0x1.f21d4ecedd102p17 0x0.0p0 -0x1.5437be6a5625ep6 0x1.b5555555552dep1 0x0.0p0 F +REG epsg:5469 2 OK 0x1.03b278525ae8p20 -0x1.f21d4ecedd102p17 0x0.0p0 -0x1.2bc84195a9da2p6 0x1.b5555555552dep1 0x0.0p0 F +REG epsg:5469 3 OK -0x1.821e1e5ba756p15 0x1.a0104cc3df778p19 0x0.0p0 -0x1.5437be6a5625ep6 0x1.ad5555555533dp3 0x0.0p0 F +REG epsg:5469 4 OK 0x1.0034f0f2dd3a5p20 0x1.a0104cc3df778p19 0x0.0p0 -0x1.2bc84195a9da2p6 0x1.ad5555555533dp3 0x0.0p0 F +REG epsg:5472 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.e847fffffffffp19 0x1.0ad6c1999999ap20 0x0.0p0 NaN NaN NaN F +REG epsg:5472 1 OK 0x1.78de07fdd0846p18 0x1.da6825aa88f26p18 0x0.0p0 -0x1.5840b9c6bb871p6 -0x1.3df53279df579p2 0x0.0p0 F +REG epsg:5472 2 OK 0x1.8a107e008bdeep20 0x1.da6825aa88f26p18 0x0.0p0 -0x1.2fbf46394478fp6 -0x1.3df53279df579p2 0x0.0p0 F +REG epsg:5472 3 OK 0x1.87edbce9131dap18 0x1.a0ed879c5ec6ep20 0x0.0p0 -0x1.57beff13e2124p6 0x1.41fdcf9b3f708p2 0x0.0p0 F +REG epsg:5472 4 OK 0x1.864c90c5bb388p20 0x1.a0ed879c5ec6ep20 0x0.0p0 -0x1.304100ec1dedcp6 0x1.41fdcf9b3f708p2 0x0.0p0 F +REG epsg:5479 0 OK 0x1.ab3fp22 0x1.312dp22 0x0.0p0 0x1.46p7 -0x1.37fffffffffffp6 0x0.0p0 F +REG epsg:5479 1 OK 0x1.9d2ade8526503p22 0x1.1d7405718c364p22 0x0.0p0 0x1.2c591bfffa018p7 -0x1.42aaaaaaaaa92p6 0x0.0p0 F +REG epsg:5479 2 OK 0x1.b953217ad9afdp22 0x1.1d7405718c364p22 0x0.0p0 0x1.5fa6e40005fe9p7 -0x1.42aaaaaaaaa92p6 0x0.0p0 F +REG epsg:5479 3 OK 0x1.9545926374f85p22 0x1.40ee6086cc0b7p22 0x0.0p0 0x1.2c591bfffa018p7 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:5479 4 OK 0x1.c1386d9c8b07bp22 0x1.40ee6086cc0b7p22 0x0.0p0 0x1.5fa6e40005fe9p7 -0x1.2d55555555556p6 0x0.0p0 F +REG epsg:5480 0 OK 0x1.312dp22 0x1.6e36p21 0x0.0p0 0x1.4ap7 -0x1.2ap6 0x0.0p0 F +REG epsg:5480 1 OK 0x1.2707001cc6c4bp22 0x1.566f64db5cccep21 0x0.0p0 0x1.3d86d888b6a03p7 -0x1.30aaaaaaaaaa9p6 0x0.0p0 F +REG epsg:5480 2 OK 0x1.3b52ffe3393b6p22 0x1.566f64db5cccep21 0x0.0p0 0x1.56792777495fdp7 -0x1.30aaaaaaaaaa9p6 0x0.0p0 F +REG epsg:5480 3 OK 0x1.24a6532daa74ap22 0x1.839a443ae720fp21 0x0.0p0 0x1.3d86d888b6a03p7 -0x1.2355555555556p6 0x0.0p0 F +REG epsg:5480 4 OK 0x1.3db3acd2558b7p22 0x1.839a443ae720fp21 0x0.0p0 0x1.56792777495fdp7 -0x1.2355555555556p6 0x0.0p0 F +REG epsg:5481 0 OK 0x1.6e36p21 0x1.e848p19 0x0.0p0 0x1.4cp7 -0x1.1dfffffffffffp6 0x0.0p0 F +REG epsg:5481 1 OK 0x1.597f317e6c646p21 0x1.89dc966be3a0ap19 0x0.0p0 0x1.417eae6c4e8eep7 -0x1.24aaaaaaaaaaap6 0x0.0p0 F +REG epsg:5481 2 OK 0x1.82ecce81939b8p21 0x1.89dc966be3a0dp19 0x0.0p0 0x1.56815193b1712p7 -0x1.24aaaaaaaaaa8p6 0x0.0p0 F +REG epsg:5481 3 OK 0x1.558ded8d94a02p21 0x1.1f652d2b351edp20 0x0.0p0 0x1.417eae6c4e8eep7 -0x1.1755555555552p6 0x0.0p0 F +REG epsg:5481 4 OK 0x1.86de12726b5fcp21 0x1.1f652d2b351efp20 0x0.0p0 0x1.56815193b1712p7 -0x1.1755555555552p6 0x0.0p0 F +REG epsg:5482 0 OK 0x1.312dp22 0x1.0f3f28526a8cap20 0x0.0p0 0x1.68p7 -0x1.64p6 0x0.0p0 T +REG epsg:5482 1 OK 0x1.2b4ea0da31fc5p22 0x1.01b1942935465p20 0x0.0p0 0x1.e000000000005p6 -0x1.64p6 0x0.0p0 T +REG epsg:5482 2 OK 0x1.370b5f25ce03bp22 0x1.01b1942935465p20 0x0.0p0 -0x1.e000000000005p6 -0x1.64p6 0x0.0p0 T +REG epsg:5482 3 OK 0x1.13d0bf2741433p22 0x1.37f20b219201bp20 0x0.0p0 0x1.dfffffffffffep6 -0x1.53fffffffffffp6 0x0.0p0 T +REG epsg:5482 4 OK 0x1.4e8940d8bebcdp22 0x1.37f20b219201ap20 0x0.0p0 -0x1.dfffffffffffep6 -0x1.54p6 0x0.0p0 T +REG epsg:5487 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5487 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5487 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5487 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5487 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5489 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5489 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5489 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5489 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5489 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5490 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:5490 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:5490 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:5490 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:5490 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:5498 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5498 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5498 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5498 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5498 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5499 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5499 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5499 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5499 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5499 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5500 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5500 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5500 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5500 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5500 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5513 0 OK 0x1.64d87b3d15511p7 -0x1.1af52dbdec782p20 -0x1.f6cc866fp4 0x1.8d55555555555p4 0x1.8c00000000008p5 0x1.0p-30 F +REG epsg:5513 1 OK -0x1.2b031e26e5d91p19 -0x1.9b4032a3005d2p20 -0x1.750cc6338p5 0x1.1226dd0312abap4 0x1.63ffffffffffcp5 0x1.0p-29 F +REG epsg:5513 2 OK 0x1.2b2fa0bc57dd3p19 -0x1.9b4013794afe9p20 -0x1.911ebf54p3 0x1.0441e6d3cbff5p5 0x1.6400000000006p5 -0x1.8p-29 F +REG epsg:5513 3 OK -0x1.e93e105d2897p18 -0x1.19963b28286e8p19 -0x1.167201822p5 0x1.1226dd0312ab6p4 0x1.b400000000006p5 0x1.0p-28 F +REG epsg:5513 4 OK 0x1.e99759f47e5eap18 -0x1.1996bb96904abp19 -0x1.c2ed2eecp2 0x1.0441e6d3cbff9p5 0x1.b4p5 0x1.0p-29 F +REG epsg:5514 0 OK 0x1.64d87b3d15511p7 -0x1.1af52dbdec782p20 -0x1.f6cc866fp4 0x1.8d55555555555p4 0x1.8c00000000008p5 0x1.0p-30 F +REG epsg:5514 1 OK -0x1.2b031e26e5d91p19 -0x1.9b4032a3005d2p20 -0x1.750cc6338p5 0x1.1226dd0312abap4 0x1.63ffffffffffcp5 0x1.0p-29 F +REG epsg:5514 2 OK 0x1.2b2fa0bc57dd3p19 -0x1.9b4013794afe9p20 -0x1.911ebf54p3 0x1.0441e6d3cbff5p5 0x1.6400000000006p5 -0x1.8p-29 F +REG epsg:5514 3 OK -0x1.e93e105d2897p18 -0x1.19963b28286e8p19 -0x1.167201822p5 0x1.1226dd0312ab6p4 0x1.b400000000006p5 0x1.0p-28 F +REG epsg:5514 4 OK 0x1.e99759f47e5eap18 -0x1.1996bb96904abp19 -0x1.c2ed2eecp2 0x1.0441e6d3cbff9p5 0x1.b4p5 0x1.0p-29 F +REG epsg:5518 0 OK 0x1.55bfd8ca532b2p18 0x1.3d5b647c17247p19 -0x1.2094942ep2 -0x1.61p7 -0x1.6p5 0x0.0p0 F +REG epsg:5518 1 OK -0x1.3586b90e89992p17 0x1.149ce05e76308p16 0x1.2d0e2238p1 0x1.61192e640a358p7 -0x1.87fffffea07d3p5 0x1.8p-27 F +REG epsg:5518 2 OK 0x1.a321870719117p19 0x1.149ce06939a98p16 -0x1.57797ddp2 -0x1.53192e6409fe5p7 -0x1.87fffffea0e23p5 -0x1.8p-28 F +REG epsg:5518 3 OK -0x1.ed20fd6b68cf4p17 0x1.209fe43f50ce8p20 -0x1.8f8224c3p2 0x1.61192e63a5afbp7 -0x1.37ffffff0faecp5 0x1.8p-27 F +REG epsg:5518 4 OK 0x1.d108181607f4p19 0x1.209fe4406d2e2p20 -0x1.ec583e818p3 -0x1.53192e63a5a1ep7 -0x1.37ffffff0fe85p5 0x1.2p-27 F +REG epsg:5519 0 OK 0x1.55bfe5ad5331fp18 0x1.3d5b6a1fa8239p19 -0x1.986d08ap2 -0x1.61p7 -0x1.5ffffffff8e0fp5 0x1.901cp-16 F +REG epsg:5519 1 OK -0x1.358617b1bec1ap17 0x1.149bfa6f031fp16 -0x1.0f0801fp-1 0x1.61192e640a35p7 -0x1.87fffffe99712p5 0x1.4d0cp-16 F +REG epsg:5519 2 OK 0x1.a321b19d5957p19 0x1.149e0c61eb968p16 -0x1.9066e7d1p2 -0x1.53192e6409ffp7 -0x1.87fffffe99d38p5 0x1.4ce4p-16 F +REG epsg:5519 3 OK -0x1.ed2169a7fdb74p17 0x1.209fd742ca31ep20 -0x1.28d9d2d1p3 0x1.61192e63a5afcp7 -0x1.37ffffff08b4ep5 0x1.d3p-16 F +REG epsg:5519 4 OK 0x1.d107ff83258fp19 0x1.209ff80b69f1p20 -0x1.00f7f9bacp4 -0x1.53192e63a5a1cp7 -0x1.37ffffff08ef4p5 0x1.d2f4p-16 F +REG epsg:5520 0 OK 0x1.6e3819bc9c26ap20 -0x1.a120d5abedb9ap8 0x1.7ff888092p6 0x1.7ffffffffac64p1 0x1.756412b0eb70ep-31 0x1.d9c26p-11 T +REG epsg:5520 1 OK 0x1.cd5afa3eea849p19 -0x1.0f319a40d0d0bp19 0x1.185bf1702p7 -0x1.fffffff8d4ae8p0 -0x1.3ffffffe74cep2 0x1.cfa12p-11 F +REG epsg:5520 2 OK 0x1.f5c2a4ad3daaap20 -0x1.0f31e264f1788p19 0x1.09ab70bb28p7 0x1.fffffffe2a496p2 -0x1.3ffffffe6f789p2 0x1.cf3d4p-11 F +REG epsg:5520 3 OK 0x1.cd5a516033ac2p19 0x1.0ec9760752f6ep19 0x1.0d1e46e6cp6 -0x1.fffffff8b33dap0 0x1.3fffffffddc1bp2 0x1.dd01ep-11 F +REG epsg:5520 4 OK 0x1.f5c31c5b6c0b8p20 0x1.0ec977fc1cb74p19 0x1.df77c2668p5 0x1.fffffffe2cbacp2 0x1.3fffffffe336ep2 0x1.dd042p-11 F +REG epsg:5523 0 OK 0x1.6e36p20 0x1.4fb18p22 0x0.0p0 0x1.7p3 0x0.0p0 0x0.0p0 T +REG epsg:5523 1 OK 0x1.cd70af1827c7dp19 0x1.2dd514917c80ap22 0x0.0p0 0x1.a0000001d501cp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5523 2 OK 0x1.f5b3a873ec1c2p20 0x1.2dd514917c80ap22 0x0.0p0 0x1.07ffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5523 3 OK 0x1.cd70af1827c7dp19 0x1.718deb6e837f6p22 0x0.0p0 0x1.a0000001d501cp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5523 4 OK 0x1.f5b3a873ec1c2p20 0x1.718deb6e837f6p22 0x0.0p0 0x1.07ffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5524 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5524 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5524 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5524 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5524 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5527 0 OK -0x1.2460f6cfbd547p-15 0x1.6a6fc00bb32acp-12 0x1.62cd09dc6p5 0x1.2d6cb2018701ep-68 0x0.0p0 0x0.0p0 T +REG epsg:5527 1 OK -0x1.3fffb42e4ab7ep2 -0x1.3ff980e081f06p2 0x1.46ca6ec8p5 -0x1.4p2 -0x1.3fffffffffffcp2 0x1.0p-28 F +REG epsg:5527 2 OK 0x1.3ffe8fcf398c8p2 -0x1.3ff9831cce8d7p2 0x1.416698acp5 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x0.0p0 F +REG epsg:5527 3 OK -0x1.3fffb42e4ab7ep2 0x1.4004c91d9fe6p2 0x1.7c167208cp5 -0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:5527 4 OK 0x1.3ffe8fcf398c8p2 0x1.4004cb5a007b6p2 0x1.76b29c4bcp5 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:5530 0 OK 0x1.312dd0d37ba32p22 0x1.312d4cf476f3ap23 0x1.3ba05d75p4 -0x1.bp5 -0x1.70df2256ad776p-47 0x1.0p-29 T +REG epsg:5530 1 OK 0x1.0f562d4d7bc9ep22 0x1.20206c1de0087p23 0x1.715e4db6p3 -0x1.d800000000001p5 -0x1.3ffffffffffeap2 0x1.0p-30 F +REG epsg:5530 2 OK 0x1.530572c322824p22 0x1.20206c2328a79p23 0x1.49bb9b3ecp4 -0x1.8800000000001p5 -0x1.400000000000ap2 -0x1.0p-30 F +REG epsg:5530 3 OK 0x1.0f562fa3f0f22p22 0x1.423a2dc54d8dbp23 0x1.23474dac4p4 -0x1.d7fffffffffffp5 0x1.4000000000003p2 0x1.0p-29 F +REG epsg:5530 4 OK 0x1.5305706c90e71p22 0x1.423a2dc004cp23 0x1.b453b8118p4 -0x1.88p5 0x1.3ffffffffffd3p2 0x1.0p-30 F +REG epsg:5531 0 OK 0x1.e855965ed92c6p18 0x1.b99856ee4020dp22 -0x1.6d1490a2p1 -0x1.c8p5 -0x1.9000000000002p4 -0x1.0p-29 F +REG epsg:5531 1 OK -0x1.fb0e18ffad98p14 0x1.9701f14635352p22 -0x1.8204cad6p3 -0x1.f42297030ae5cp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5531 2 OK 0x1.f82e073720cc8p19 0x1.9701f146049bep22 -0x1.81314b5cp1 -0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x1.0p-29 F +REG epsg:5531 3 OK -0x1.2fa1aaed0d23p16 0x1.dacb4775451dp22 -0x1.c7cacdeap1 -0x1.f42297030ae5cp5 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:5531 4 OK 0x1.0724e5e8d32b6p20 0x1.dacb477516e14p22 0x1.90d561cap2 -0x1.9bdd68fcf51a3p5 -0x1.4p4 0x1.0p-30 F +REG epsg:5532 0 OK 0x1.e8544caaae41fp18 0x1.b99861627b3e4p22 0x1.05c0a53cp1 -0x1.9800000000001p5 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:5532 1 OK -0x1.fb212727668ep14 0x1.9701fd799b862p22 -0x1.c05be47dp2 -0x1.c42297030ae5dp5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:5532 2 OK 0x1.f82d55f2b11bp19 0x1.9701fd796f87p22 0x1.30a2a3b8p0 -0x1.6bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5532 3 OK -0x1.2fa65b50126e8p16 0x1.dacb503b795f4p22 0x1.fca8f01cp0 -0x1.c42297030ae5cp5 -0x1.3ffffffffffffp4 -0x1.8p-29 F +REG epsg:5532 4 OK 0x1.07248c13ea2e2p20 0x1.dacb503b4f846p22 0x1.5c264f108p3 -0x1.6bdd68fcf51a3p5 -0x1.3fffffffffffdp4 0x1.0p-29 F +REG epsg:5533 0 OK 0x1.e853372c23506p18 0x1.b998688ecfb66p22 0x1.a6896543p2 -0x1.68p5 -0x1.9000000000001p4 -0x1.0p-30 F +REG epsg:5533 1 OK -0x1.fb3108a43dcp14 0x1.97020646637c8p22 -0x1.23ea18p1 -0x1.942297030ae5bp5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:5533 2 OK 0x1.f82cbf7ec527ap19 0x1.970206463b5d2p22 0x1.4c559e4bp2 -0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:5533 3 OK -0x1.2faa4459a9b1p16 0x1.dacb55d757cccp22 0x1.c37096a9p2 -0x1.942297030ae5dp5 -0x1.3fffffffffffcp4 -0x1.0p-30 F +REG epsg:5533 4 OK 0x1.07243fe4647fp20 0x1.dacb55d731a14p22 0x1.e5353b618p3 -0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG epsg:5534 0 OK 0x1.e851d6a1332a7p18 0x1.b9987004ca442p22 0x1.53520497p3 -0x1.38p5 -0x1.9000000000001p4 0x1.8p-29 F +REG epsg:5534 1 OK -0x1.fb45cacc8d18p14 0x1.97020f29e632cp22 0x1.fbfa61cp0 -0x1.642297030ae5dp5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:5534 2 OK 0x1.f82c050374391p19 0x1.97020f29c2ffcp22 0x1.11477253p3 -0x1.0bdd68fcf51a3p5 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:5534 3 OK -0x1.2faf664b79eep16 0x1.dacb5bedcee6bp22 0x1.75cdfeb6p3 -0x1.642297030ae5ep5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:5534 4 OK 0x1.0723e1bcf5adp20 0x1.dacb5bedad6a6p22 0x1.2cb728ecp4 -0x1.0bdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:5535 0 OK 0x1.e8505a7e33275p18 0x1.b998767721048p22 0x1.c1f71b928p3 -0x1.07fffffffffffp5 -0x1.8fffffffffffep4 -0x1.0p-30 F +REG epsg:5535 1 OK -0x1.fb5c72dedc84p14 0x1.970216d813fe1p22 0x1.7121bafp2 -0x1.342297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5535 2 OK 0x1.f82b3e1f40194p19 0x1.970216d7f61a6p22 0x1.6aaf7305p3 -0x1.b7bad1f9ea347p4 -0x1.e000000000001p4 -0x1.0p-30 F +REG epsg:5535 3 OK -0x1.2fb503b413128p16 0x1.dacb61306a736p22 0x1.f92bef21p3 -0x1.342297030ae5dp5 -0x1.3fffffffffffdp4 -0x1.0p-30 F +REG epsg:5535 4 OK 0x1.07237d80d6b96p20 0x1.dacb61304e046p22 0x1.5d389bd4p4 -0x1.b7bad1f9ea34ap4 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:5536 0 OK 0x1.e848000000016p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5536 1 OK -0x1.fc406e18ccdap14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5536 2 OK 0x1.f82a0370c668cp19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5536 3 OK -0x1.2fefde056e298p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:5536 4 OK 0x1.0722fde056e3cp20 0x1.daca2fdc3ae77p22 0x0.0p0 -0x1.9bdd68fcf51a2p5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:5537 0 OK 0x1.e84800000000bp18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5537 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5537 2 OK 0x1.f82a0370c6681p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5537 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:5537 4 OK 0x1.0722fde056e36p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:5538 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5538 1 OK -0x1.fc406e18ccf8p14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5538 2 OK 0x1.f82a0370c667cp19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5538 3 OK -0x1.2fefde056e328p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:5538 4 OK 0x1.0722fde056e32p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:5539 0 OK 0x1.e847ffffffff5p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5539 1 OK -0x1.fc406e18cd0cp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5539 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.e000000000001p4 0x0.0p0 F +REG epsg:5539 3 OK -0x1.2fefde056e38p16 0x1.daca2fdc3ae77p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:5539 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG epsg:5544 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5544 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5544 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5544 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5544 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5546 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5546 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5546 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5546 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5546 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5550 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.1ap7 -0x1.9p4 0x0.0p0 F +REG epsg:5550 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5550 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5550 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5550 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5551 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.26p7 -0x1.9p4 0x0.0p0 F +REG epsg:5551 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5551 2 OK 0x1.f8272811f156fp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5551 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5551 4 OK 0x1.07218271ed4ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5552 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.32p7 -0x1.9p4 0x0.0p0 F +REG epsg:5552 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5552 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5552 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5552 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5554 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5554 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5554 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5554 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5554 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5555 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5555 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5555 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5555 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5555 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5556 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5556 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5556 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5556 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5556 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5558 0 OK 0x1.854c14p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5558 1 OK 0x1.82598ff154608p22 -0x1.0e68ec75ac85cp19 -0x1.0da03ae81afdcp19 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:5558 2 OK 0x1.82598ff154608p22 0x1.0e68ec75ac85cp19 -0x1.0da03ae81afdcp19 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:5558 3 OK 0x1.82598ff154608p22 -0x1.0e68ec75ac85cp19 0x1.0da03ae81afdcp19 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:5558 4 OK 0x1.82598ff154608p22 0x1.0e68ec75ac85cp19 0x1.0da03ae81afdcp19 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:5559 0 OK 0x1.e814e52171ddp18 0x1.1d8daa0e0745p18 0x1.1f61b7cb1p6 -0x1.6955555555556p6 0x1.0d11111110ffap4 0x1.8p-29 F +REG epsg:5559 1 OK -0x1.171a0d6ed18p16 -0x1.efeea734e9d7p17 0x1.2649d92e7p6 -0x1.7e3a11ecca028p6 0x1.7a2222222202fp3 -0x1.0p-29 F +REG epsg:5559 2 OK 0x1.057c151a3ebf6p20 -0x1.eff037a685c24p17 0x1.291ade758p5 -0x1.547098bde0a83p6 0x1.7a22222222026p3 -0x1.0p-28 F +REG epsg:5559 3 OK -0x1.49ec416beaa3p15 0x1.a0d7584459689p19 0x1.abb3407e1p6 -0x1.7e3a11ecca028p6 0x1.5d1111111100cp4 0x1.8p-29 F +REG epsg:5559 4 OK 0x1.fcb3a67533d09p19 0x1.a0d7bb9470f5dp19 0x1.21795bdecp6 -0x1.547098bde0a83p6 0x1.5d1111111100bp4 -0x1.0p-30 F +REG epsg:5561 0 OK 0x1.1672089064a1fp-10 0x1.a7865ec061607p-11 -0x1.09feed52fp7 0x1.ab37ac92d98a5p-47 -0x1.990c0aadffcp-48 0x1.a1a3p-14 T +REG epsg:5561 1 OK -0x1.3feee85197211p2 -0x1.3ff33a2694bfep2 -0x1.2fd6677868p7 -0x1.3ffffffff3cddp2 -0x1.3fffffffe63d2p2 0x1.9c08p-14 F +REG epsg:5561 2 OK 0x1.4011b64d162aep2 -0x1.3ff2e8ea2604fp2 -0x1.fdbcaa1bcp6 0x1.4000000004525p2 -0x1.3ffffffff6b8p2 0x1.a0ebp-14 F +REG epsg:5561 3 OK -0x1.3feeee7e9d202p2 0x1.400d983d562efp2 -0x1.147206749p7 -0x1.4000000004508p2 0x1.3ffffffff6b74p2 0x1.a0ebp-14 F +REG epsg:5561 4 OK 0x1.4011bc7ac627cp2 0x1.400d46fa44676p2 -0x1.c6f3f645p6 0x1.3ffffffff3cf6p2 0x1.3fffffffe63c4p2 0x1.9c08p-14 F +REG epsg:5562 0 OK 0x1.12aa5758ea3d7p22 0x1.626b7e90a9e89p6 -0x1.433aeceabp6 0x1.4ffffffffc353p4 -0x1.133dd6fedfcffp-33 0x1.97bep-14 T +REG epsg:5562 1 OK 0x1.e18eaa0e43cfbp21 -0x1.0ef4e53f1d1c7p19 -0x1.905b5bfbap6 0x1.0000000074118p4 -0x1.3ffffffff3ba2p2 0x1.a0f4p-14 F +REG epsg:5562 2 OK 0x1.348d56fda79c4p22 -0x1.0ef4efb266c7bp19 -0x1.2eb33433bp6 0x1.9fffffff88054p4 -0x1.400000000383p2 0x1.9cadp-14 F +REG epsg:5562 3 OK 0x1.e18eb90d98ce4p21 0x1.0f0b215aa9cc2p19 -0x1.59932b2e6p6 0x1.000000007013ap4 0x1.3fffffffbf997p2 0x1.9182p-14 F +REG epsg:5562 4 OK 0x1.348d54e766943p22 0x1.0f0b00b268b6ap19 -0x1.efd7bf0e6p5 0x1.9fffffff844d9p4 0x1.3fffffffb09cdp2 0x1.8418p-14 F +REG epsg:5563 0 OK 0x1.4fb348e5821b3p22 0x1.609374fc3d4fp6 -0x1.090abfa03p6 0x1.affffffffb6a5p4 -0x1.5cae2b1927726p-33 0x1.91c4p-14 T +REG epsg:5563 1 OK 0x1.2dd04b4484fb3p22 -0x1.0ef4c83dc2dbap19 -0x1.555ae7a51p6 0x1.6000000073115p4 -0x1.3ffffffffd569p2 0x1.9ed1p-14 F +REG epsg:5563 2 OK 0x1.719643205cde8p22 -0x1.0ef4d871330a9p19 -0x1.ec6a0f022p5 0x1.ffffffff874b2p4 -0x1.400000000c85p2 0x1.9875p-14 F +REG epsg:5563 3 OK 0x1.2dd0537d09678p22 0x1.0f0aec98e54cap19 -0x1.1e932fc27p6 0x1.600000006f378p4 0x1.3fffffffb67f4p2 0x1.89dp-14 F +REG epsg:5563 4 OK 0x1.719641c312dd1p22 0x1.0f0ac6307a72dp19 -0x1.7edcc4aeap5 0x1.ffffffff83c97p4 0x1.3fffffffa84f5p2 0x1.7ac4p-14 F +REG epsg:5564 0 OK 0x1.8cbc34714bb2ap22 0x1.5e4f3d56af14bp6 -0x1.a15db8ef4p5 0x1.07fffffffd694p5 -0x1.a24c8ea2251f4p-33 0x1.8accp-14 T +REG epsg:5564 1 OK 0x1.6ad93b5d35f28p22 -0x1.0ef4b00d2d77p19 -0x1.1ba5b017fp6 0x1.c00000007238p4 -0x1.40000000069f8p2 0x1.9b5bp-14 F +REG epsg:5564 2 OK 0x1.ae9f296fb11f1p22 -0x1.0ef4c5b42bep19 -0x1.8019e9f14p5 0x1.2fffffffc362dp5 -0x1.4000000015046p2 0x1.9358p-14 F +REG epsg:5564 3 OK 0x1.6ad94444f3fa9p22 0x1.0f0ab5986ee63p19 -0x1.c9bd24dcep5 0x1.c00000006e8d4p4 0x1.3fffffffadd83p2 0x1.8108p-14 F +REG epsg:5564 4 OK 0x1.ae9f28c1c3506p22 0x1.0f0a89bc6d5ap19 -0x1.128e3b3bap5 0x1.2fffffffc1c1cp5 0x1.3fffffffa0984p2 0x1.70d7p-14 F +REG epsg:5565 0 OK 0x1.c9c51a35a7b3ep22 0x1.5ba5332762931p6 -0x1.358aab64cp5 0x1.37fffffffd3a5p5 -0x1.e355bd75bd311p-33 0x1.8321p-14 T +REG epsg:5565 1 OK 0x1.a7e2257dd263fp22 -0x1.0ef49cf13345ep19 -0x1.c7bb20cp5 0x1.1000000038c79p5 -0x1.400000000f783p2 0x1.96dp-14 F +REG epsg:5565 2 OK 0x1.eba80a33b47ccp22 -0x1.0ef4b7afdd9c8p19 -0x1.19a5c29d2p5 0x1.5fffffffc33c8p5 -0x1.400000001ce5fp2 0x1.8da7p-14 F +REG epsg:5565 3 OK 0x1.a7e22f093e464p22 0x1.0f0a7cf38b454p19 -0x1.5a2e591b6p5 0x1.10000000370eap5 0x1.3fffffffa5ba2p2 0x1.7777p-14 F +REG epsg:5565 4 OK 0x1.eba80a299c3aep22 0x1.0f0a4bffd031ap19 -0x1.5837cf35cp4 0x1.5fffffffc1bfep5 0x1.3fffffff9989bp2 0x1.66b2p-14 F +REG epsg:5566 0 OK 0x1.e865758ea3d7p18 0x1.626b7e90a9e89p6 -0x1.433aeceabp6 0x1.4ffffffffc353p4 -0x1.133dd6fedfcffp-33 0x1.97bep-14 T +REG epsg:5566 1 OK -0x1.ae557c6f0c13p15 -0x1.0ef4e53f1d1c7p19 -0x1.905b5bfbap6 0x1.0000000074119p4 -0x1.3ffffffff3ba2p2 0x1.a0f4p-14 F +REG epsg:5566 2 OK 0x1.01a55bf69e711p20 -0x1.0ef4efb266c7bp19 -0x1.2eb33433bp6 0x1.9fffffff88054p4 -0x1.400000000383p2 0x1.9cadp-14 F +REG epsg:5566 3 OK -0x1.ae51bc99cc7p15 0x1.0f0b215aa9cc2p19 -0x1.59932b2e6p6 0x1.000000007013ap4 0x1.3fffffffbf997p2 0x1.9182p-14 F +REG epsg:5566 4 OK 0x1.01a5539d9a50dp20 0x1.0f0b00b268b6ap19 -0x1.efd7bf0e6p5 0x1.9fffffff844dcp4 0x1.3fffffffb09cdp2 0x1.8418p-14 F +REG epsg:5567 0 OK 0x1.e8648e5821b32p18 0x1.609374fc3d4fp6 -0x1.090abfa03p6 0x1.affffffffb6a5p4 -0x1.5cae2b1927726p-33 0x1.91c4p-14 T +REG epsg:5567 1 OK -0x1.ae5a5dbd8269p15 -0x1.0ef4c83dc2dbap19 -0x1.555ae7a51p6 0x1.6000000073115p4 -0x1.3ffffffffd569p2 0x1.9ed1p-14 F +REG epsg:5567 2 OK 0x1.01a50c81737ap20 -0x1.0ef4d871330a9p19 -0x1.ec6a0f022p5 0x1.ffffffff874b2p4 -0x1.400000000c85p2 0x1.9875p-14 F +REG epsg:5567 3 OK -0x1.ae56417b4c42p15 0x1.0f0aec98e54cap19 -0x1.1e932fc27p6 0x1.600000006f378p4 0x1.3fffffffb67f4p2 0x1.89dp-14 F +REG epsg:5567 4 OK 0x1.01a5070c4b744p20 0x1.0f0ac6307a72dp19 -0x1.7edcc4aeap5 0x1.ffffffff83c97p4 0x1.3fffffffa84f5p2 0x1.7ac4p-14 F +REG epsg:5568 0 OK 0x1.e8634714bb299p18 0x1.5e4f3d56af14bp6 -0x1.a15db8ef4p5 0x1.07fffffffd694p5 -0x1.a24c8ea2251f4p-33 0x1.8accp-14 T +REG epsg:5568 1 OK -0x1.ae62516506bfp15 -0x1.0ef4b00d2d77p19 -0x1.1ba5b017fp6 0x1.c00000007238p4 -0x1.40000000069f8p2 0x1.9b5bp-14 F +REG epsg:5568 2 OK 0x1.01a4a5bec47c2p20 -0x1.0ef4c5b42bep19 -0x1.8019e9f14p5 0x1.2fffffffc362dp5 -0x1.4000000015046p2 0x1.9359p-14 F +REG epsg:5568 3 OK -0x1.ae5ddd8602bap15 0x1.0f0ab5986ee63p19 -0x1.c9bd24dcep5 0x1.c00000006e8d4p4 0x1.3fffffffadd83p2 0x1.8108p-14 F +REG epsg:5568 4 OK 0x1.01a4a3070d418p20 0x1.0f0a89bc6d5ap19 -0x1.128e3b3bap5 0x1.2fffffffc1c1cp5 0x1.3fffffffa0984p2 0x1.70d7p-14 F +REG epsg:5569 0 OK 0x1.e861a35a7b3e6p18 0x1.5ba5332762931p6 -0x1.358aab64cp5 0x1.37fffffffd3a7p5 -0x1.e355bd75bd311p-33 0x1.8321p-14 T +REG epsg:5569 1 OK -0x1.ae6d4116ce06p15 -0x1.0ef49cf13345ep19 -0x1.c7bb20cp5 0x1.1000000038c79p5 -0x1.400000000f783p2 0x1.96dp-14 F +REG epsg:5569 2 OK 0x1.01a428ced1f31p20 -0x1.0ef4b7afdd9c8p19 -0x1.19a5c29d2p5 0x1.5fffffffc33c8p5 -0x1.400000001ce5fp2 0x1.8da7p-14 F +REG epsg:5569 3 OK -0x1.ae687b60dcdfp15 0x1.0f0a7cf38b454p19 -0x1.5a2e591b6p5 0x1.10000000370eap5 0x1.3fffffffa5ba2p2 0x1.7777p-14 F +REG epsg:5569 4 OK 0x1.01a428a670eb8p20 0x1.0f0a4bffd031ap19 -0x1.5837cf35cp4 0x1.5fffffffc1bfep5 0x1.3fffffff9989bp2 0x1.66b2p-14 F +REG epsg:5570 0 OK 0x1.c9c55758ea3d7p22 0x1.626b7e90a9e89p6 -0x1.433aeceabp6 0x1.4ffffffffc353p4 -0x1.133dd6fedfcffp-33 0x1.97bep-14 T +REG epsg:5570 1 OK 0x1.a7e2550721e7ep22 -0x1.0ef4e53f1d1c7p19 -0x1.905b5bfbap6 0x1.0000000074119p4 -0x1.3ffffffff3ba2p2 0x1.a0f4p-14 F +REG epsg:5570 2 OK 0x1.eba856fda79c4p22 -0x1.0ef4efb266c7bp19 -0x1.2eb33433bp6 0x1.9fffffff88054p4 -0x1.400000000383p2 0x1.9cadp-14 F +REG epsg:5570 3 OK 0x1.a7e25c86cc672p22 0x1.0f0b215aa9cc2p19 -0x1.59932b2e6p6 0x1.000000007013ap4 0x1.3fffffffbf997p2 0x1.9182p-14 F +REG epsg:5570 4 OK 0x1.eba854e766943p22 0x1.0f0b00b268b6ap19 -0x1.efd7bf0e6p5 0x1.9fffffff844d9p4 0x1.3fffffffb09cdp2 0x1.8418p-14 F +REG epsg:5571 0 OK 0x1.036728711f9a5p23 0x1.618d5996f637fp6 -0x1.25f266c48p6 0x1.7ffffffffbc9bp4 -0x1.38639916f459cp-33 0x1.94e6p-14 T +REG epsg:5571 1 OK 0x1.e4eb50ec88662p22 -0x1.0ef4d6291e56p19 -0x1.72bc019c2p6 0x1.30000000738d2p4 -0x1.3ffffffff890ep2 0x1.a01p-14 F +REG epsg:5571 2 OK 0x1.1458a6e6a706ap23 -0x1.0ef4e38510c24p19 -0x1.12331f8b3p6 0x1.cfffffff87a24p4 -0x1.400000000812cp2 0x1.9abp-14 F +REG epsg:5571 3 OK 0x1.e4eb58c9b4105p22 0x1.0f0b074b08191p19 -0x1.3bf40902ep6 0x1.300000006f9ffp4 0x1.3fffffffbaff6p2 0x1.8dccp-14 F +REG epsg:5571 4 OK 0x1.1458a60a4e03dp23 0x1.0f0ae3ba1d49ep19 -0x1.b6d83d6bap5 0x1.cfffffff84041p4 0x1.3fffffffac646p2 0x1.7f82p-14 F +REG epsg:5572 0 OK 0x1.21eba472c10dap23 0x1.609374fc3d4fp6 -0x1.090abfa03p6 0x1.affffffffb6a6p4 -0x1.5cae2b1927726p-33 0x1.91c4p-14 T +REG epsg:5572 1 OK 0x1.10fa25a2427d9p23 -0x1.0ef4c83dc2dbap19 -0x1.555ae7a51p6 0x1.6000000073112p4 -0x1.3ffffffffd569p2 0x1.9ed1p-14 F +REG epsg:5572 2 OK 0x1.32dd21902e6f4p23 -0x1.0ef4d871330a9p19 -0x1.ec6a0f022p5 0x1.ffffffff874b2p4 -0x1.400000000c85p2 0x1.9875p-14 F +REG epsg:5572 3 OK 0x1.10fa29be84b3cp23 0x1.0f0aec98e54cap19 -0x1.1e932fc27p6 0x1.600000006f378p4 0x1.3fffffffb67f4p2 0x1.89dp-14 F +REG epsg:5572 4 OK 0x1.32dd20e1896e8p23 0x1.0f0ac6307a72dp19 -0x1.7edcc4aeap5 0x1.ffffffff83c93p4 0x1.3fffffffa84f5p2 0x1.7ac4p-14 F +REG epsg:5573 0 OK 0x1.40701fb427001p23 0x1.5f7e801e0278p6 -0x1.d9307f248p5 0x1.dffffffffb178p4 -0x1.80041611b749ap-33 0x1.8e63p-14 T +REG epsg:5573 1 OK 0x1.2f7ea2098802ep23 -0x1.0ef4bb86ceb26p19 -0x1.384cab6b4p6 0x1.90000000729f1p4 -0x1.4000000002073p2 0x1.9d39p-14 F +REG epsg:5573 2 OK 0x1.51619b7f28ff1p23 -0x1.0ef4ce7e9334dp19 -0x1.b59920836p5 0x1.17ffffffc380cp5 -0x1.4000000010d6bp2 0x1.9601p-14 F +REG epsg:5573 3 OK 0x1.2f7ea6524259ep23 0x1.0f0ad156fcd07p19 -0x1.01853c93fp6 0x1.900000006edb8p4 0x1.3fffffffb21bep2 0x1.858bp-14 F +REG epsg:5573 4 OK 0x1.51619afd046ffp23 0x1.0f0aa82a3a0cbp19 -0x1.480c9cb04p5 0x1.17ffffffc1cf2p5 0x1.3fffffffa45f9p2 0x1.75dap-14 F +REG epsg:5574 0 OK 0x1.5ef49a38a5d95p23 0x1.5e4f3d56af14bp6 -0x1.a15db8ef4p5 0x1.07fffffffd694p5 -0x1.a24c8ea2251f4p-33 0x1.8accp-14 T +REG epsg:5574 1 OK 0x1.4e031dae9af94p23 -0x1.0ef4b00d2d77p19 -0x1.1ba5b017fp6 0x1.c00000007238p4 -0x1.40000000069f8p2 0x1.9b5bp-14 F +REG epsg:5574 2 OK 0x1.6fe614b7d88f8p23 -0x1.0ef4c5b42bep19 -0x1.8019e9f14p5 0x1.2fffffffc362bp5 -0x1.4000000015046p2 0x1.9358p-14 F +REG epsg:5574 3 OK 0x1.4e03222279fd4p23 0x1.0f0ab5986ee63p19 -0x1.c9bd24dcep5 0x1.c00000006e8d4p4 0x1.3fffffffadd83p2 0x1.8108p-14 F +REG epsg:5574 4 OK 0x1.6fe61460e1a83p23 0x1.0f0a89bc6d5ap19 -0x1.128e3b3bap5 0x1.2fffffffc1c1cp5 0x1.3fffffffa0984p2 0x1.70d7p-14 F +REG epsg:5575 0 OK 0x1.7d791404168a5p23 0x1.5d06817525848p6 -0x1.6ac457e6ep5 0x1.1ffffffffd4e2p5 -0x1.c36f8686aaecp-33 0x1.8707p-14 T +REG epsg:5575 1 OK 0x1.6c87989489d8p23 -0x1.0ef4a5d8ec1c3p19 -0x1.fef420bep5 0x1.f000000071ddp4 -0x1.400000000b1b7p2 0x1.9933p-14 F +REG epsg:5575 2 OK 0x1.8e6a8d3efeep23 -0x1.0ef4be1827d03p19 -0x1.4c11f4a3p5 0x1.47ffffffc34c2p5 -0x1.40000000190a7p2 0x1.908fp-14 F +REG epsg:5575 3 OK 0x1.6c879d321bd01p23 0x1.0f0a9970b33c6p19 -0x1.91669797cp5 0x1.f00000006e4dap4 0x1.3fffffffa9b6ep2 0x1.7c55p-14 F +REG epsg:5575 4 OK 0x1.8e6a8d11c48aep23 0x1.0f0a6afc6e3a7p19 -0x1.bd0e5226p4 0x1.47ffffffc1bc9p5 0x1.3fffffff9cfabp2 0x1.6bc9p-14 F +REG epsg:5576 0 OK 0x1.9bfd8d1ad3d9fp23 0x1.5ba5332762931p6 -0x1.358aab64cp5 0x1.37fffffffd3a5p5 -0x1.e355bd75bd311p-33 0x1.8321p-14 T +REG epsg:5576 1 OK 0x1.8b0c12bee932p23 -0x1.0ef49cf13345ep19 -0x1.c7bb20cp5 0x1.1000000038c7ap5 -0x1.400000000f783p2 0x1.96d2p-14 F +REG epsg:5576 2 OK 0x1.acef0519da3e6p23 -0x1.0ef4b7afdd9c8p19 -0x1.19a5c29d2p5 0x1.5fffffffc33c8p5 -0x1.400000001ce5fp2 0x1.8da7p-14 F +REG epsg:5576 3 OK 0x1.8b0c17849f232p23 0x1.0f0a7cf38b454p19 -0x1.5a2e591b6p5 0x1.10000000370eap5 0x1.3fffffffa5ba2p2 0x1.7777p-14 F +REG epsg:5576 4 OK 0x1.acef0514ce1d7p23 0x1.0f0a4bffd031ap19 -0x1.5837cf35cp4 0x1.5fffffffc1bfep5 0x1.3fffffff9989bp2 0x1.66b2p-14 F +REG epsg:5577 0 OK 0x1.e865758ea3d7p18 0x1.626b7e90a9e89p6 -0x1.433aeceabp6 0x1.4ffffffffc353p4 -0x1.133dd6fedfcffp-33 0x1.97bep-14 T +REG epsg:5577 1 OK -0x1.ae557c6f0c13p15 -0x1.0ef4e53f1d1c7p19 -0x1.905b5bfbap6 0x1.0000000074119p4 -0x1.3ffffffff3ba2p2 0x1.a0f4p-14 F +REG epsg:5577 2 OK 0x1.01a55bf69e711p20 -0x1.0ef4efb266c7bp19 -0x1.2eb33433bp6 0x1.9fffffff88054p4 -0x1.400000000383p2 0x1.9cadp-14 F +REG epsg:5577 3 OK -0x1.ae51bc99cc7p15 0x1.0f0b215aa9cc2p19 -0x1.59932b2e6p6 0x1.000000007013ap4 0x1.3fffffffbf997p2 0x1.9182p-14 F +REG epsg:5577 4 OK 0x1.01a5539d9a50dp20 0x1.0f0b00b268b6ap19 -0x1.efd7bf0e6p5 0x1.9fffffff844dcp4 0x1.3fffffffb09cdp2 0x1.8418p-14 F +REG epsg:5578 0 OK 0x1.e8650e23f34adp18 0x1.618d5996f637fp6 -0x1.25f266c48p6 0x1.7ffffffffbc9ep4 -0x1.38639916f459bp-33 0x1.94e7p-14 T +REG epsg:5578 1 OK -0x1.ae5789bbcceep15 -0x1.0ef4d6291e56p19 -0x1.72bc019c2p6 0x1.30000000738d2p4 -0x1.3ffffffff890ep2 0x1.a01p-14 F +REG epsg:5578 2 OK 0x1.01a537353834ep20 -0x1.0ef4e38510c24p19 -0x1.12331f8b3p6 0x1.cfffffff87a22p4 -0x1.400000000812bp2 0x1.9ab1p-14 F +REG epsg:5578 3 OK -0x1.ae539b25f7d6p15 0x1.0f0b074b08191p19 -0x1.3bf40902ep6 0x1.300000006f9ffp4 0x1.3fffffffbaff6p2 0x1.8dccp-14 F +REG epsg:5578 4 OK 0x1.01a53052701e6p20 0x1.0f0ae3ba1d49ep19 -0x1.b6d83d6bap5 0x1.cfffffff84041p4 0x1.3fffffffac646p2 0x1.7f82p-14 F +REG epsg:5579 0 OK 0x1.e8648e5821b32p18 0x1.609374fc3d4fp6 -0x1.090abfa03p6 0x1.affffffffb6a5p4 -0x1.5cae2b1927726p-33 0x1.91c4p-14 T +REG epsg:5579 1 OK -0x1.ae5a5dbd8269p15 -0x1.0ef4c83dc2dbap19 -0x1.555ae7a51p6 0x1.6000000073115p4 -0x1.3ffffffffd569p2 0x1.9ed1p-14 F +REG epsg:5579 2 OK 0x1.01a50c81737ap20 -0x1.0ef4d871330a9p19 -0x1.ec6a0f022p5 0x1.ffffffff874b2p4 -0x1.400000000c85p2 0x1.9875p-14 F +REG epsg:5579 3 OK -0x1.ae56417b4c42p15 0x1.0f0aec98e54cap19 -0x1.1e932fc27p6 0x1.600000006f378p4 0x1.3fffffffb67f4p2 0x1.89dp-14 F +REG epsg:5579 4 OK 0x1.01a5070c4b744p20 0x1.0f0ac6307a72dp19 -0x1.7edcc4aeap5 0x1.ffffffff83c97p4 0x1.3fffffffa84f5p2 0x1.7ac4p-14 F +REG epsg:5580 0 OK 0x1.e863f684e001ep18 0x1.5f7e801e0278p6 -0x1.d9307f248p5 0x1.dffffffffb178p4 -0x1.80041611b749ap-33 0x1.8e63p-14 T +REG epsg:5580 1 OK -0x1.ae5df677fd1cp15 -0x1.0ef4bb86ceb26p19 -0x1.384cab6b4p6 0x1.90000000729f3p4 -0x1.4000000002074p2 0x1.9d38p-14 F +REG epsg:5580 2 OK 0x1.01a4dbf947f85p20 -0x1.0ef4ce7e9334dp19 -0x1.b59920836p5 0x1.17ffffffc380bp5 -0x1.4000000010d6bp2 0x1.9601p-14 F +REG epsg:5580 3 OK -0x1.ae59adbda622p15 0x1.0f0ad156fcd07p19 -0x1.01853c93fp6 0x1.900000006edb8p4 0x1.3fffffffb21bep2 0x1.858bp-14 F +REG epsg:5580 4 OK 0x1.01a4d7e8237f7p20 0x1.0f0aa82a3a0cbp19 -0x1.480c9cb04p5 0x1.17ffffffc1cf1p5 0x1.3fffffffa45f9p2 0x1.75dap-14 F +REG epsg:5581 0 OK 0x1.e8634714bb299p18 0x1.5e4f3d56af14bp6 -0x1.a15db8ef4p5 0x1.07fffffffd694p5 -0x1.a24c8ea2251f4p-33 0x1.8accp-14 T +REG epsg:5581 1 OK -0x1.ae62516506bfp15 -0x1.0ef4b00d2d77p19 -0x1.1ba5b017fp6 0x1.c00000007238p4 -0x1.40000000069f8p2 0x1.9b5bp-14 F +REG epsg:5581 2 OK 0x1.01a4a5bec47c2p20 -0x1.0ef4c5b42bep19 -0x1.8019e9f14p5 0x1.2fffffffc362dp5 -0x1.4000000015046p2 0x1.9359p-14 F +REG epsg:5581 3 OK -0x1.ae5ddd8602bap15 0x1.0f0ab5986ee63p19 -0x1.c9bd24dcep5 0x1.c00000006e8d4p4 0x1.3fffffffadd83p2 0x1.8108p-14 F +REG epsg:5581 4 OK 0x1.01a4a3070d418p20 0x1.0f0a89bc6d5ap19 -0x1.128e3b3bap5 0x1.2fffffffc1c1cp5 0x1.3fffffffa0984p2 0x1.70d7p-14 F +REG epsg:5582 0 OK 0x1.e8628082d14adp18 0x1.5d06817525848p6 -0x1.6ac457e6ep5 0x1.1ffffffffd4e2p5 -0x1.c36f8686aaebfp-33 0x1.8708p-14 T +REG epsg:5582 1 OK -0x1.ae676b762801p15 -0x1.0ef4a5d8ec1c3p19 -0x1.fef420bep5 0x1.f000000071ddp4 -0x1.400000000b1b7p2 0x1.9933p-14 F +REG epsg:5582 2 OK 0x1.01a469f7f6ffcp20 -0x1.0ef4be1827d03p19 -0x1.4c11f4a3p5 0x1.47ffffffc34c2p5 -0x1.40000000190a7p2 0x1.908fp-14 F +REG epsg:5582 3 OK -0x1.ae62cde42ff4p15 0x1.0f0a9970b33c6p19 -0x1.91669797cp5 0x1.f00000006e4dap4 0x1.3fffffffa9b6ep2 0x1.7c55p-14 F +REG epsg:5582 4 OK 0x1.01a4688e24572p20 0x1.0f0a6afc6e3a7p19 -0x1.bd0e5226p4 0x1.47ffffffc1bcap5 0x1.3fffffff9cfabp2 0x1.6bc9p-14 F +REG epsg:5583 0 OK 0x1.e861a35a7b3e6p18 0x1.5ba5332762931p6 -0x1.358aab64cp5 0x1.37fffffffd3a7p5 -0x1.e355bd75bd311p-33 0x1.8321p-14 T +REG epsg:5583 1 OK -0x1.ae6d4116ce06p15 -0x1.0ef49cf13345ep19 -0x1.c7bb20cp5 0x1.1000000038c79p5 -0x1.400000000f783p2 0x1.96dp-14 F +REG epsg:5583 2 OK 0x1.01a428ced1f31p20 -0x1.0ef4b7afdd9c8p19 -0x1.19a5c29d2p5 0x1.5fffffffc33c8p5 -0x1.400000001ce5fp2 0x1.8da7p-14 F +REG epsg:5583 3 OK -0x1.ae687b60dcdfp15 0x1.0f0a7cf38b454p19 -0x1.5a2e591b6p5 0x1.10000000370eap5 0x1.3fffffffa5ba2p2 0x1.7777p-14 F +REG epsg:5583 4 OK 0x1.01a428a670eb8p20 0x1.0f0a4bffd031ap19 -0x1.5837cf35cp4 0x1.5fffffffc1bfep5 0x1.3fffffff9989bp2 0x1.66b2p-14 F +REG epsg:5588 0 OK 0x1.e847fffffffffp19 0x1.e847fffffffffp19 0x0.0p0 -0x1.0ap6 0x1.7400000000001p5 0x0.0p0 F +REG epsg:5588 1 OK -0x1.e48017cd85719p19 -0x1.67415ace7ffffp19 0x0.0p0 -0x1.270e06f120d03p6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:5588 2 OK 0x1.6d4405f3615bep21 -0x1.67415ace7ffffp19 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:5588 3 OK -0x1.4077212e64319p19 0x1.62947de0f399bp21 0x0.0p0 -0x1.270e06f120d03p6 0x1.9bffffffffffdp5 0x0.0p0 F +REG epsg:5588 4 OK 0x1.4441c84b990bfp21 0x1.62947de0f399bp21 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9bffffffffffdp5 0x0.0p0 F +REG epsg:5589 0 OK 0x1.a855a147ae148p17 0x1.b308b51eb851fp18 0x0.0p0 -0x1.628705a708edep6 0x1.10fad8d548846p4 0x0.0p0 F +REG epsg:5589 1 OK -0x1.93adfd4f91384p20 -0x1.49fb236714c96p20 0x0.0p0 -0x1.7772b7943022cp6 0x1.81f5b1aa7349ep3 0x0.0p0 F +REG epsg:5589 2 OK 0x1.fdc365a17cbd6p20 -0x1.49fb236714c96p20 0x0.0p0 -0x1.4d9b53b9e1b9p6 0x1.81f5b1aa7349ep3 0x0.0p0 F +REG epsg:5589 3 OK -0x1.7bd1d2e1fecefp20 0x1.17c24cddd3eccp21 0x0.0p0 -0x1.7772b7944e468p6 0x1.60fad8d52f962p4 0x0.0p0 F +REG epsg:5589 4 OK 0x1.e5e73b33ea541p20 0x1.17c24cddd3eccp21 0x0.0p0 -0x1.4d9b53b9c3954p6 0x1.60fad8d52f962p4 0x0.0p0 F +REG epsg:5591 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5591 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5591 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5591 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5591 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5593 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5593 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5593 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5593 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5593 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5596 0 OK 0x1.e848p19 0x0.0p0 0x0.0p0 0x1.6aaaaaaaaaaa9p3 0x0.0p0 0x0.0p0 T +REG epsg:5596 1 OK 0x1.b261d9420d07ap18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.955555572a56fp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5596 2 OK 0x1.7baf89af7cbe1p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.05555554e014dp4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5596 3 OK 0x1.b261d9420d07ap18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.955555572a56fp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5596 4 OK 0x1.7baf89af7cbe1p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.05555554e014dp4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5598 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5598 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5598 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5598 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5598 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5623 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 0x0.0p0 F +REG epsg:5623 1 OK -0x1.654e8a528f5bcp20 -0x1.abeb532bb2e43p20 0x0.0p0 -0x1.695eda12c9f02p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG epsg:5623 2 OK 0x1.2cb9452947ae8p21 -0x1.abeb532bb2e43p20 0x0.0p0 -0x1.33f67b428b653p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG epsg:5623 3 OK -0x1.20587530ee4a4p20 0x1.ce5946cdc45dep20 0x0.0p0 -0x1.695eda123ffe3p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:5623 4 OK 0x1.0a3e3a987725ap21 0x1.ce5946cdc45dfp20 0x0.0p0 -0x1.33f67b4315573p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:5624 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.57p6 0x1.4cp5 0x0.0p0 F +REG epsg:5624 1 OK -0x1.654a657428c51p20 -0x1.abe7a02dd265p20 0x0.0p0 -0x1.71b42f681f458p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG epsg:5624 2 OK 0x1.2cb732ba14622p21 -0x1.abe7a02dd265p20 0x0.0p0 -0x1.3c4bd097e0ba9p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG epsg:5624 3 OK -0x1.2054e8ef47b91p20 0x1.ce55479e7b85fp20 0x0.0p0 -0x1.71b42f6795538p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:5624 4 OK 0x1.0a3c7477a3dc3p21 0x1.ce55479e7b85dp20 0x0.0p0 -0x1.3c4bd0986aac8p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:5625 0 OK 0x1.e848000000005p18 0x0.0p0 0x0.0p0 -0x1.63p6 0x1.4cp5 0x0.0p0 F +REG epsg:5625 1 OK -0x1.654a657428c51p20 -0x1.abe7a02dd265p20 0x0.0p0 -0x1.7db42f681f458p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG epsg:5625 2 OK 0x1.2cb732ba1462ap21 -0x1.abe7a02dd265p20 0x0.0p0 -0x1.484bd097e0ba8p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG epsg:5625 3 OK -0x1.2054e8ef47b91p20 0x1.ce55479e7b85fp20 0x0.0p0 -0x1.7db42f6795539p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:5625 4 OK 0x1.0a3c7477a3dcap21 0x1.ce55479e7b85fp20 0x0.0p0 -0x1.484bd0986aac7p6 0x1.73fffffef7047p5 0x0.0p0 F +REG epsg:5627 0 OK 0x1.e85e158055001p18 0x1.e3d1741ebec0dp6 -0x1.34764a9e08p7 0x1.8000000000001p2 0x0.0p0 -0x1.0p-29 T +REG epsg:5627 1 OK -0x1.ace106494cbap15 -0x1.0ed5edcca783bp19 -0x1.58fc51c5bp7 0x1.000000075e5c9p0 -0x1.3fffffffeac21p2 -0x1.0p-30 F +REG epsg:5627 2 OK 0x1.019613061d1dbp20 -0x1.0ed5edcd37bb6p19 -0x1.3a4bb644c8p7 0x1.5fffffff13c22p3 -0x1.3fffffffeab63p2 0x1.0p-30 F +REG epsg:5627 3 OK -0x1.acdd55fd7058p15 0x1.0ef42aa2cfbe8p19 -0x1.2ecd37806p7 0x1.000000075e2fdp0 0x1.3fffffffeabfep2 -0x1.8p-29 F +REG epsg:5627 4 OK 0x1.0195f581598e1p20 0x1.0ef42aa36015cp19 -0x1.101ca2b178p7 0x1.5fffffff13c7ap3 0x1.3fffffffeab42p2 0x1.0p-29 F +REG epsg:5628 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5628 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5628 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5628 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5628 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5629 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG epsg:5629 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5629 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5629 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:5629 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.942297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG epsg:5631 0 OK 0x1.3130df6452ed3p21 0x1.31ada5b4dc61ep6 -0x1.c2c848aa4p6 0x1.2000000000428p3 0x1.c88c10ce3c148p-32 0x1.bfeap-14 T +REG epsg:5631 1 OK 0x1.dad5971f49b03p20 -0x1.0ef6fe83c49e3p19 -0x1.08a123b4a8p7 0x1.00000001cfd17p2 -0x1.3fffffff68004p2 0x1.9c6p-14 F +REG epsg:5631 2 OK 0x1.74f702f37d854p21 -0x1.0ef6b36e834bdp19 -0x1.a90f6e1edp6 0x1.bfffffff18141p3 -0x1.3fffffff68202p2 0x1.9cc4p-14 F +REG epsg:5631 3 OK 0x1.dad58a696ae8p20 0x1.0f09dadbaa178p19 -0x1.dc1014764p6 0x1.00000001d14fbp2 0x1.4000000048264p2 0x1.ded7p-14 F +REG epsg:5631 4 OK 0x1.74f6e9fa37035p21 0x1.0f0a0c796dd62p19 -0x1.73daf58a2p6 0x1.bfffffff17226p3 0x1.4000000047ddap2 0x1.df1dp-14 F +REG epsg:5632 0 OK 0x1.e848p21 0x1.3b91a4f6d5e36p21 0x0.0p0 0x1.4p3 0x1.8fffffffff9cbp5 0x0.0p0 F +REG epsg:5632 1 OK 0x1.d1131ac886607p20 0x1.3acb00a95c2fep20 0x0.0p0 -0x1.aabf5806334p3 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5632 2 OK 0x1.7403394dde67ep22 0x1.3acb00a95c2fep20 0x0.0p0 0x1.0aafd6018cdp5 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5632 3 OK 0x1.641e7265a5b0ap21 0x1.0bcff6536c9adp22 0x0.0p0 -0x1.aabf5806333f9p3 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5632 4 OK 0x1.3638c6cd2d27bp22 0x1.0bcff6536c9adp22 0x0.0p0 0x1.0aafd6018ccfep5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5633 0 OK 0x1.07bbap22 0x1.87d88p21 0x0.0p0 0x1.4p3 0x1.ap5 0x0.0p0 F +REG epsg:5633 1 OK 0x1.c42c77ba5a209p21 0x1.481c3cc432a15p21 0x0.0p0 0x1.e0ef7421c3dccp0 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5633 2 OK 0x1.2d610422d2efcp22 0x1.481c3cc432a15p21 0x0.0p0 0x1.21f108bde3c25p4 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5633 3 OK 0x1.d34e2eee16ef2p21 0x1.cf2d17f906ecep21 0x0.0p0 0x1.e0ef7421c3dbep0 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5633 4 OK 0x1.25d02888f4887p22 0x1.cf2d17f906ecep21 0x0.0p0 0x1.21f108bde3c24p4 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5634 0 OK 0x1.e848p21 0x1.3b91a4f6d5e36p21 0x0.0p0 0x1.4p3 0x1.8fffffffff9cbp5 0x0.0p0 F +REG epsg:5634 1 OK 0x1.d1131ac886607p20 0x1.3acb00a95c2fep20 0x0.0p0 -0x1.aabf5806334p3 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5634 2 OK 0x1.7403394dde67ep22 0x1.3acb00a95c2fep20 0x0.0p0 0x1.0aafd6018cdp5 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5634 3 OK 0x1.641e7265a5b0ap21 0x1.0bcff6536c9adp22 0x0.0p0 -0x1.aabf5806333f9p3 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5634 4 OK 0x1.3638c6cd2d27bp22 0x1.0bcff6536c9adp22 0x0.0p0 0x1.0aafd6018ccfep5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5635 0 OK 0x1.07bbap22 0x1.87d88p21 0x0.0p0 0x1.4p3 0x1.ap5 0x0.0p0 F +REG epsg:5635 1 OK 0x1.c42c77ba5a209p21 0x1.481c3cc432a15p21 0x0.0p0 0x1.e0ef7421c3dccp0 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5635 2 OK 0x1.2d610422d2efcp22 0x1.481c3cc432a15p21 0x0.0p0 0x1.21f108bde3c25p4 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5635 3 OK 0x1.d34e2eee16ef2p21 0x1.cf2d17f906ecep21 0x0.0p0 0x1.e0ef7421c3dbep0 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5635 4 OK 0x1.25d02888f4887p22 0x1.cf2d17f906ecep21 0x0.0p0 0x1.21f108bde3c24p4 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5636 0 OK 0x1.07bbap22 0x1.87d88p21 0x0.0p0 0x1.4p3 0x1.ap5 0x0.0p0 F +REG epsg:5636 1 OK 0x1.c42c77ba5a209p21 0x1.481c3cc432a15p21 0x0.0p0 0x1.e0ef7421c3dccp0 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5636 2 OK 0x1.2d610422d2efcp22 0x1.481c3cc432a15p21 0x0.0p0 0x1.21f108bde3c25p4 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5636 3 OK 0x1.d34e2eee16ef2p21 0x1.cf2d17f906ecep21 0x0.0p0 0x1.e0ef7421c3dbep0 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5636 4 OK 0x1.25d02888f4887p22 0x1.cf2d17f906ecep21 0x0.0p0 0x1.21f108bde3c24p4 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5637 0 OK 0x1.e848p21 0x1.3b91a4f6d5e36p21 0x0.0p0 0x1.4p3 0x1.8fffffffff9cbp5 0x0.0p0 F +REG epsg:5637 1 OK 0x1.d1131ac886607p20 0x1.3acb00a95c2fep20 0x0.0p0 -0x1.aabf5806334p3 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5637 2 OK 0x1.7403394dde67ep22 0x1.3acb00a95c2fep20 0x0.0p0 0x1.0aafd6018cdp5 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5637 3 OK 0x1.641e7265a5b0ap21 0x1.0bcff6536c9adp22 0x0.0p0 -0x1.aabf5806333f9p3 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5637 4 OK 0x1.3638c6cd2d27bp22 0x1.0bcff6536c9adp22 0x0.0p0 0x1.0aafd6018ccfep5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5638 0 OK 0x1.07bbap22 0x1.87d88p21 0x0.0p0 0x1.4p3 0x1.ap5 0x0.0p0 F +REG epsg:5638 1 OK 0x1.c42c77ba5a209p21 0x1.481c3cc432a15p21 0x0.0p0 0x1.e0ef7421c3dccp0 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5638 2 OK 0x1.2d610422d2efcp22 0x1.481c3cc432a15p21 0x0.0p0 0x1.21f108bde3c25p4 0x1.7800000049096p5 0x0.0p0 F +REG epsg:5638 3 OK 0x1.d34e2eee16ef2p21 0x1.cf2d17f906ecep21 0x0.0p0 0x1.e0ef7421c3dbep0 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5638 4 OK 0x1.25d02888f4887p22 0x1.cf2d17f906ecep21 0x0.0p0 0x1.21f108bde3c24p4 0x1.c800000006232p5 0x0.0p0 F +REG epsg:5639 0 OK 0x1.e848p21 0x1.3b91a4f6d5e36p21 0x0.0p0 0x1.4p3 0x1.8fffffffff9cbp5 0x0.0p0 F +REG epsg:5639 1 OK 0x1.d1131ac886607p20 0x1.3acb00a95c2fep20 0x0.0p0 -0x1.aabf5806334p3 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5639 2 OK 0x1.7403394dde67ep22 0x1.3acb00a95c2fep20 0x0.0p0 0x1.0aafd6018cdp5 0x1.17fffffffffdp5 0x0.0p0 F +REG epsg:5639 3 OK 0x1.641e7265a5b0ap21 0x1.0bcff6536c9adp22 0x0.0p0 -0x1.aabf5806333f9p3 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5639 4 OK 0x1.3638c6cd2d27bp22 0x1.0bcff6536c9adp22 0x0.0p0 0x1.0aafd6018ccfep5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5641 0 OK 0x1.312dp22 0x1.2a6cebd87e6ddp23 0x0.0p0 -0x1.58p5 -0x1.ffffffffe2999p0 0x0.0p0 F +REG epsg:5641 1 OK 0x1.0f2edd19d5961p22 0x1.197eaafdc49bcp23 0x0.0p0 -0x1.80063de24127ep5 -0x1.bfffffffffd78p2 0x0.0p0 F +REG epsg:5641 2 OK 0x1.532b22e62a6ap22 0x1.197eaafdc49bcp23 0x0.0p0 -0x1.2ff9c21dbed81p5 -0x1.bfffffffffd78p2 0x0.0p0 F +REG epsg:5641 3 OK 0x1.0f2edd19d5961p22 0x1.3b4dc91182f2fp23 0x0.0p0 -0x1.80063de24127ep5 0x1.7fffffffffdcdp1 0x0.0p0 F +REG epsg:5641 4 OK 0x1.532b22e62a6ap22 0x1.3b4dc91182f2fp23 0x0.0p0 -0x1.2ff9c21dbed81p5 0x1.7fffffffffdcdp1 0x0.0p0 F +REG epsg:5643 0 OK 0x1.8dfd2ec83c5c2p19 0x1.58d35cff89c82p18 -0x1.27d300c32p5 0x1.4000000000001p3 0x1.995555555502ep5 0x0.0p0 F +REG epsg:5643 1 OK 0x1.498d554b0398p13 -0x1.22692cf28e2cep18 -0x1.d629a659ep5 -0x1.99f83081fbbbdp-4 0x1.66aaaaaaaaa9ep5 0x1.0p-30 F +REG epsg:5643 2 OK 0x1.8b6a19661c415p20 -0x1.22687db3139aep18 -0x1.34307f5fep5 0x1.4199f83081fbcp4 0x1.66aaaaaaaaa9ep5 0x1.0p-29 F +REG epsg:5643 3 OK 0x1.9a596dc4edfccp17 0x1.0ce42494d5884p20 -0x1.2af07fdf4p5 -0x1.99f83081fbbdap-4 0x1.cbffffffffe9dp5 -0x1.8p-29 F +REG epsg:5643 4 OK 0x1.5ab1f9cdd62cp20 0x1.0ce411523ae38p20 -0x1.6070c2a88p4 0x1.4199f83081fbcp4 0x1.cbffffffffe9bp5 -0x1.0p-29 F +REG epsg:5644 0 OK 0x1.e848000000021p18 0x1.b997b102aac2p22 0x0.0p0 0x1.98p5 -0x1.9p4 0x0.0p0 F +REG epsg:5644 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5644 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5644 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5644 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5646 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:5646 1 OK -0x1.4073c60f9185cp18 -0x1.ab4f057cd578dp20 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:5646 2 OK 0x1.b88c836cbfdp21 -0x1.ab4f057cd578cp20 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:5646 3 OK -0x1.15b70f8c8cdp15 0x1.cef3b6d2b39a1p20 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:5646 4 OK 0x1.94d4e6e8ffd27p21 0x1.cef3b6d2b39a2p20 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:5649 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:5649 1 OK 0x1.d82f0578c13cbp24 -0x1.0ee35b73f5e6cp19 0x0.0p0 -0x1.fffffff8abfaap0 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5649 2 OK 0x1.e91eba873ec35p24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.fffffffe2afebp2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5649 3 OK 0x1.d82f0578c13cbp24 0x1.0ee35b73f5e6cp19 0x0.0p0 -0x1.fffffff8abfaap0 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5649 4 OK 0x1.e91eba873ec35p24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.fffffffe2afebp2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5650 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:5650 1 OK 0x1.f6b38578c13cbp24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.40000000ea80ap3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5650 2 OK 0x1.03d19d439f61ap25 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3fffffff8abf1p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5650 3 OK 0x1.f6b38578c13cbp24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.40000000ea80ap3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5650 4 OK 0x1.03d19d439f61ap25 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3fffffff8abf1p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5651 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG epsg:5651 1 OK 0x1.d82f0578c13cbp24 -0x1.0ee35b73f5e6cp19 0x0.0p0 -0x1.fffffff8abfaap0 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5651 2 OK 0x1.e91eba873ec35p24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.fffffffe2afebp2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5651 3 OK 0x1.d82f0578c13cbp24 0x1.0ee35b73f5e6cp19 0x0.0p0 -0x1.fffffff8abfaap0 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5651 4 OK 0x1.e91eba873ec35p24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.fffffffe2afebp2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5652 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:5652 1 OK 0x1.e7714578c13cbp24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.00000001d5015p2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5652 2 OK 0x1.f860fa873ec35p24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.bfffffff157f6p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5652 3 OK 0x1.e7714578c13cbp24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.00000001d5015p2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5652 4 OK 0x1.f860fa873ec35p24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.bfffffff157f6p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5653 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:5653 1 OK 0x1.f6b38578c13cbp24 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.40000000ea80ap3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5653 2 OK 0x1.03d19d439f61ap25 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3fffffff8abf1p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5653 3 OK 0x1.f6b38578c13cbp24 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.40000000ea80ap3 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:5653 4 OK 0x1.03d19d439f61ap25 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3fffffff8abf1p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5654 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:5654 1 OK -0x1.4073c60f9185cp18 -0x1.ab4f057cd578dp20 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:5654 2 OK 0x1.b88c836cbfdp21 -0x1.ab4f057cd578cp20 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:5654 3 OK -0x1.15b70f8c8cdp15 0x1.cef3b6d2b39a1p20 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:5654 4 OK 0x1.94d4e6e8ffd27p21 0x1.cef3b6d2b39a2p20 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:5655 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:5655 1 OK -0x1.4073c60f9185cp18 -0x1.ab4f057cd578dp20 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:5655 2 OK 0x1.b88c836cbfdp21 -0x1.ab4f057cd578cp20 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:5655 3 OK -0x1.15b70f8c8cdp15 0x1.cef3b6d2b39a1p20 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:5655 4 OK 0x1.94d4e6e8ffd27p21 0x1.cef3b6d2b39a2p20 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:5659 0 OK 0x1.e857c8330d64p18 -0x1.e844fed97fc9dp21 -0x1.08011dc07p6 0x1.200000011a394p3 -0x1.0b8651c1a1a02p-31 0x1.7d8ep-10 T +REG epsg:5659 1 OK -0x1.ad12117e2fb3p15 -0x1.15ff173be48bdp22 -0x1.17068b04ap6 0x1.00000004def9bp2 -0x1.40000000b39fcp2 0x1.7434dp-10 F +REG epsg:5659 2 OK 0x1.0194494c1824cp20 -0x1.15ff20ae54fe4p22 -0x1.00a55b23ep6 0x1.bfffffff76f0ep3 -0x1.4000000017f29p2 0x1.864bp-10 F +REG epsg:5659 3 OK -0x1.ad0c5cf7003p15 -0x1.a48bb9a63533cp21 -0x1.108d7d876p6 0x1.0000000567c5ep2 0x1.3fffffff22a2dp2 0x1.6cc67p-10 F +REG epsg:5659 4 OK 0x1.0194726ab4df6p20 -0x1.a48bd1edad72ep21 -0x1.f45f1173ap5 0x1.bfffffffbd54p3 0x1.3fffffff9c087p2 0x1.83ffp-10 F +REG epsg:5663 0 OK 0x1.ab42e13919b88p21 0x1.365dd89246892p6 -0x1.83d62475p6 0x1.e000000002c99p3 0x1.c58b73effecf5p-32 0x1.c0fep-14 T +REG epsg:5663 1 OK 0x1.677cd845480eep21 -0x1.0ef6ac945247ep19 -0x1.d2df933bdp6 0x1.40000000eaf74p3 -0x1.3fffffff67bc8p2 0x1.9bdep-14 F +REG epsg:5663 2 OK 0x1.ef08f9cd10587p21 -0x1.0ef661e819e1ep19 -0x1.6a8404744p6 0x1.3fffffff8d83p4 -0x1.3fffffff69c0bp2 0x1.9fd7p-14 F +REG epsg:5663 3 OK 0x1.677cd204f36f1p21 0x1.0f09d4586e2dap19 -0x1.9dac0312ep6 0x1.40000000eaae7p3 0x1.4000000048759p2 0x1.de83p-14 F +REG epsg:5663 4 OK 0x1.ef08e0edf030fp21 0x1.0f0a058d32249p19 -0x1.354e32a61p6 0x1.3fffffff8c87bp4 0x1.4000000045f98p2 0x1.e122p-14 F +REG epsg:5664 0 OK 0x1.3130dca372b33p21 0x1.3801725a0b661p6 -0x1.caffa40e1p6 0x1.1ffffffffffffp3 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:5664 1 OK 0x1.dad586522221cp20 -0x1.0ef69d2bae95ap19 -0x1.087e39832p7 0x1.00000001d44ccp2 -0x1.3fffffffeaeb4p2 -0x1.cp-28 F +REG epsg:5664 2 OK 0x1.74f6f62b384edp21 -0x1.0ef69d2c77a7ep19 -0x1.bb265d0dbp6 0x1.bfffffff153acp3 -0x1.3fffffffeadacp2 0x1.8p-29 F +REG epsg:5664 3 OK 0x1.dad5995984cdcp20 0x1.0f0a1d18fa519p19 -0x1.da99d0d88p6 0x1.00000001d445ap2 0x1.3fffffffeae9bp2 -0x1.8p-28 F +REG epsg:5664 4 OK 0x1.74f6eca672b5fp21 0x1.0f0a1d19c3803p19 -0x1.84c3c6f24p6 0x1.bfffffff153e6p3 0x1.3fffffffead95p2 0x0.0p0 F +REG epsg:5665 0 OK 0x1.ab42dcddc8aedp21 0x1.3801488aab346p6 -0x1.972e60473p6 0x1.dfffffffffffep3 0x0.0p0 -0x1.0p-30 T +REG epsg:5665 1 OK 0x1.677ccc62de0a8p21 -0x1.0ef678c52e44dp19 -0x1.dd9277b1dp6 0x1.40000000ea25bp3 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:5665 2 OK 0x1.ef08ed661a14cp21 -0x1.0ef678c5f7701p19 -0x1.87b75106dp6 0x1.3fffffff8a9dap4 -0x1.3fffffffeadadp2 0x1.4p-28 F +REG epsg:5665 3 OK 0x1.677cd5e68b89ep21 0x1.0f09f8afe2501p19 -0x1.a72fdcbf1p6 0x1.40000000ea222p3 0x1.3fffffffeae9fp2 -0x1.cp-28 F +REG epsg:5665 4 OK 0x1.ef08e3e158428p21 0x1.0f09f8b0ab97ap19 -0x1.5154c227p6 0x1.3fffffff8a9f7p4 0x1.3fffffffead94p2 0x1.8p-28 F +REG epsg:5666 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:5666 1 OK 0x1.677b3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5666 2 OK 0x1.ef02c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5666 3 OK 0x1.677b3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5666 4 OK 0x1.ef02c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5667 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:5667 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5667 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5667 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5667 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5668 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:5668 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5668 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5668 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5668 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5669 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:5669 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5669 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5669 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5669 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5670 0 OK 0x1.ab42df6452ed3p21 0x1.31ada5b4dc61ep6 -0x1.c2c848aa4p6 0x1.2000000000428p3 0x1.c88c10ce3c148p-32 0x1.bfeap-14 T +REG epsg:5670 1 OK 0x1.677ccb8fa4d82p21 -0x1.0ef6fe83c49e3p19 -0x1.08a123b4a8p7 0x1.00000001cfd19p2 -0x1.3fffffff68004p2 0x1.9c6p-14 F +REG epsg:5670 2 OK 0x1.ef0902f37d854p21 -0x1.0ef6b36e834bdp19 -0x1.a90f6e1edp6 0x1.bfffffff18141p3 -0x1.3fffffff68202p2 0x1.9cc4p-14 F +REG epsg:5670 3 OK 0x1.677cc534b574p21 0x1.0f09dadbaa178p19 -0x1.dc1014764p6 0x1.00000001d14fbp2 0x1.4000000048264p2 0x1.ded7p-14 F +REG epsg:5670 4 OK 0x1.ef08e9fa37035p21 0x1.0f0a0c796dd62p19 -0x1.73daf58a2p6 0x1.bfffffff17226p3 0x1.4000000047ddap2 0x1.df1dp-14 F +REG epsg:5671 0 OK 0x1.12aa70fa57625p22 0x1.3406bc9ce92a6p6 -0x1.a352482c6p6 0x1.8000000001882p3 0x1.c7aba03098f95p-32 0x1.c03dp-14 T +REG epsg:5671 1 OK 0x1.e18ed392a7c8bp21 -0x1.0ef6d59131083p19 -0x1.f2264a6d7p6 0x1.c0000001d2de2p2 -0x1.3fffffff67b9fp2 0x1.9bdap-14 F +REG epsg:5671 2 OK 0x1.348d8004c41acp22 -0x1.0ef68a9a9f31dp19 -0x1.89ba73cf3p6 0x1.0fffffff8cc92p4 -0x1.3fffffff68cc5p2 0x1.9e0ap-14 F +REG epsg:5671 3 OK 0x1.e18ecd3f89997p21 0x1.0f09d79933feep19 -0x1.bcf368f9p6 0x1.c0000001d3549p2 0x1.4000000048787p2 0x1.de7dp-14 F +REG epsg:5671 4 OK 0x1.348d738bec4adp22 0x1.0f0a09184d793p19 -0x1.54854deb6p6 0x1.0fffffff8c0edp4 0x1.4000000047154p2 0x1.dff4p-14 F +REG epsg:5672 0 OK 0x1.4fb3709c8cdc4p22 0x1.365dd89246892p6 -0x1.83d62475p6 0x1.e000000002c99p3 0x1.c58b73effecf5p-32 0x1.c0fep-14 T +REG epsg:5672 1 OK 0x1.2dd06c22a4077p22 -0x1.0ef6ac945247ep19 -0x1.d2df933bdp6 0x1.40000000eaf74p3 -0x1.3fffffff67bc8p2 0x1.9bdep-14 F +REG epsg:5672 2 OK 0x1.71967ce6882c4p22 -0x1.0ef661e819e1ep19 -0x1.6a8404744p6 0x1.3fffffff8d831p4 -0x1.3fffffff69c0bp2 0x1.9fd7p-14 F +REG epsg:5672 3 OK 0x1.2dd0690279b79p22 0x1.0f09d4586e2dap19 -0x1.9dac0312ep6 0x1.40000000eaae9p3 0x1.4000000048759p2 0x1.de83p-14 F +REG epsg:5672 4 OK 0x1.71967076f8188p22 0x1.0f0a058d32249p19 -0x1.354e32a61p6 0x1.3fffffff8c87dp4 0x1.4000000045f97p2 0x1.e123p-14 F +REG epsg:5673 0 OK 0x1.ab42dca372b33p21 0x1.3801725a0b661p6 -0x1.caffa40e1p6 0x1.1ffffffffffffp3 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG epsg:5673 1 OK 0x1.677cc3291110ep21 -0x1.0ef69d2bae95ap19 -0x1.087e39832p7 0x1.00000001d44ccp2 -0x1.3fffffffeaeb4p2 -0x1.cp-28 F +REG epsg:5673 2 OK 0x1.ef08f62b384edp21 -0x1.0ef69d2c77a7ep19 -0x1.bb265d0dbp6 0x1.bfffffff153acp3 -0x1.3fffffffeadacp2 0x1.8p-29 F +REG epsg:5673 3 OK 0x1.677cccacc266ep21 0x1.0f0a1d18fa519p19 -0x1.da99d0d88p6 0x1.00000001d445ap2 0x1.3fffffffeae9bp2 -0x1.8p-28 F +REG epsg:5673 4 OK 0x1.ef08eca672b5fp21 0x1.0f0a1d19c3803p19 -0x1.84c3c6f24p6 0x1.bfffffff153e6p3 0x1.3fffffffead95p2 0x0.0p0 F +REG epsg:5674 0 OK 0x1.12aa6f0dfe177p22 0x1.38015d72a97a7p6 -0x1.b11763edep6 0x1.7ffffffffffffp3 0x0.0p0 0x1.0p-30 T +REG epsg:5674 1 OK 0x1.e18ec92147b7ep21 -0x1.0ef68af8b259bp19 -0x1.f756eacfep6 0x1.c0000001d44bcp2 -0x1.3fffffffeaeb1p2 -0x1.8p-29 F +REG epsg:5674 2 OK 0x1.348d79920d5c2p22 -0x1.0ef68af97bbf4p19 -0x1.a16023a77p6 0x1.0fffffff8a9dap4 -0x1.3fffffffeadaap2 0x1.8p-29 F +REG epsg:5674 3 OK 0x1.e18ed2a4f6f21p21 0x1.0f0a0ae4b2424p19 -0x1.c0f44c3d7p6 0x1.c0000001d444cp2 0x1.3fffffffeae9dp2 -0x1.0p-28 F +REG epsg:5674 4 OK 0x1.348d74cfab691p22 0x1.0f0a0ae57bc41p19 -0x1.6afd912bdp6 0x1.0fffffff8a9f7p4 0x1.3fffffffead93p2 0x1.0p-28 F +REG epsg:5675 0 OK 0x1.4fb36e6ee4577p22 0x1.3801488aab346p6 -0x1.972e60473p6 0x1.e000000000001p3 0x0.0p0 -0x1.0p-30 T +REG epsg:5675 1 OK 0x1.2dd066316f054p22 -0x1.0ef678c52e44dp19 -0x1.dd9277b1dp6 0x1.40000000ea25bp3 -0x1.3fffffffeaeb4p2 -0x1.0p-28 F +REG epsg:5675 2 OK 0x1.719676b30d0a6p22 -0x1.0ef678c5f7701p19 -0x1.87b75106dp6 0x1.3fffffff8a9dap4 -0x1.3fffffffeadadp2 0x1.4p-28 F +REG epsg:5675 3 OK 0x1.2dd06af345c4fp22 0x1.0f09f8afe2501p19 -0x1.a72fdcbf1p6 0x1.40000000ea222p3 0x1.3fffffffeae9fp2 -0x1.cp-28 F +REG epsg:5675 4 OK 0x1.719671f0ac214p22 0x1.0f09f8b0ab97ap19 -0x1.5154c227p6 0x1.3fffffff8a9f7p4 0x1.3fffffffead94p2 0x1.8p-28 F +REG epsg:5676 0 OK 0x1.312f0903f2ba9p21 -0x1.a175c70c1c6e6p8 0x1.7a693e1fbp6 0x1.7ffffffffe322p2 0x1.782b97293f155p-31 0x1.d9b5cp-11 T +REG epsg:5676 1 OK 0x1.dad3736e07a5ep20 -0x1.0f31a8a5a6415p19 0x1.10208bbbp7 0x1.00000007310cap0 -0x1.3ffffffe72a3ap2 0x1.cf786p-11 F +REG epsg:5676 2 OK 0x1.74f44f6c49757p21 -0x1.0f31f10ccce7cp19 0x1.0c62910008p7 0x1.5fffffff15e8ep3 -0x1.3ffffffe6ef35p2 0x1.cf33p-11 F +REG epsg:5676 3 OK 0x1.dad31f218ecb3p20 0x1.0ec96f72a5b3dp19 0x1.f94e17e3ep5 0x1.000000074bd2bp0 0x1.3fffffffe000ap2 0x1.dd032p-11 F +REG epsg:5676 4 OK 0x1.74f48b54fa3cp21 0x1.0ec97124d1f45p19 0x1.ea5380612p5 0x1.5fffffff1646fp3 0x1.3fffffffe3bc4p2 0x1.dd044p-11 F +REG epsg:5677 0 OK 0x1.ab4205661c1dfp21 -0x1.a1cb3497fc6b6p8 0x1.7b75392cp6 0x1.1fffffffff833p3 0x1.79eb2185db613p-31 0x1.d9aep-11 T +REG epsg:5677 1 OK 0x1.677cb643a0be8p21 -0x1.0f31b2823b74fp19 0x1.0b2b0a86bp7 0x1.00000001cdbcbp2 -0x1.3ffffffe70f7bp2 0x1.cf58ap-11 F +REG epsg:5677 2 OK 0x1.ef074b9be47c8p21 -0x1.0f31fb139ccb7p19 0x1.12623627cp7 0x1.bfffffff16ae1p3 -0x1.3ffffffe6eeebp2 0x1.cf32ep-11 F +REG epsg:5677 3 OK 0x1.677c8c289e238p21 0x1.0ec9641ddf858p19 0x1.e5773bb64p5 0x1.00000001d2bf1p2 0x1.3fffffffe1bd8p2 0x1.dd03ep-11 F +REG epsg:5677 4 OK 0x1.ef07878ff2659p21 0x1.0ec965a6374bap19 0x1.0128adbfap6 0x1.bfffffff1630ep3 0x1.3fffffffe3bcdp2 0x1.dd044p-11 F +REG epsg:5678 0 OK 0x1.12aa80a9d2ee7p22 -0x1.a220e259caf66p8 0x1.831bbd173p6 0x1.7fffffffffee8p3 0x1.7aa177ccd5177p-31 0x1.d9aaap-11 T +REG epsg:5678 1 OK 0x1.e18fb3844f4bbp21 -0x1.0f31b7cfa481p19 0x1.097ee8dc38p7 0x1.c0000001cf3e9p2 -0x1.3ffffffe6fcb6p2 0x1.cf424p-11 F +REG epsg:5678 2 OK 0x1.348d231a3791cp22 -0x1.0f32007257972p19 0x1.1ba62a5d7p7 0x1.0fffffff8bb91p4 -0x1.3ffffffe6f6adp2 0x1.cf3c8p-11 F +REG epsg:5678 3 OK 0x1.e18f896e472bfp21 0x1.0ec95410f4728p19 0x1.dec5e5fd6p5 0x1.c0000001d28dcp2 0x1.3fffffffe2f75p2 0x1.dd03ap-11 F +REG epsg:5678 4 OK 0x1.348d4116cae0ap22 0x1.0ec955885e21p19 0x1.13b03e782p6 0x1.0fffffff8b0d3p4 0x1.3fffffffe338ap2 0x1.dd046p-11 F +REG epsg:5679 0 OK 0x1.4fb3fe0ddec1ep22 -0x1.a276942eb4abcp8 0x1.91576b3e5p6 0x1.e00000000059fp3 0x1.7a4e1a02673d4p-31 0x1.d9ac6p-11 T +REG epsg:5679 1 OK 0x1.2dd15863a779cp22 -0x1.0f31b88a28edep19 0x1.0b1d533a1p7 0x1.40000000e863p3 -0x1.3ffffffe6f1fp2 0x1.cf35p-11 F +REG epsg:5679 2 OK 0x1.71969f4303443p22 -0x1.0f32012538adcp19 0x1.2827ecd12p7 0x1.3fffffff8c1a5p4 -0x1.3ffffffe70678p2 0x1.cf504p-11 F +REG epsg:5679 3 OK 0x1.2dd14357ff3d3p22 0x1.0ec93f5728b6fp19 0x1.e53ec9472p5 0x1.40000000e9303p3 0x1.3fffffffe3acfp2 0x1.dd04p-11 F +REG epsg:5679 4 OK 0x1.7196bd3efeec6p22 0x1.0ec940d696924p19 0x1.2cb370f75p6 0x1.3fffffff8b015p4 0x1.3fffffffe2301p2 0x1.dd044p-11 F +REG epsg:5680 0 OK 0x1.6e3819bc9c26ap20 -0x1.a120d5abedb9ap8 0x1.7ff888092p6 0x1.7ffffffffac64p1 0x1.756412b0eb70ep-31 0x1.d9c26p-11 T +REG epsg:5680 1 OK 0x1.cd5afa3eea849p19 -0x1.0f319a40d0d0bp19 0x1.185bf1702p7 -0x1.fffffff8d4ae8p0 -0x1.3ffffffe74cep2 0x1.cfa12p-11 F +REG epsg:5680 2 OK 0x1.f5c2a4ad3daaap20 -0x1.0f31e264f1788p19 0x1.09ab70bb28p7 0x1.fffffffe2a496p2 -0x1.3ffffffe6f789p2 0x1.cf3d4p-11 F +REG epsg:5680 3 OK 0x1.cd5a516033ac2p19 0x1.0ec9760752f6ep19 0x1.0d1e46e6cp6 -0x1.fffffff8b33dap0 0x1.3fffffffddc1bp2 0x1.dd01ep-11 F +REG epsg:5680 4 OK 0x1.f5c31c5b6c0b8p20 0x1.0ec977fc1cb74p19 0x1.df77c2668p5 0x1.fffffffe2cbacp2 0x1.3fffffffe336ep2 0x1.dd042p-11 F +REG epsg:5681 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5681 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5681 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5681 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5681 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5682 0 OK 0x1.312dp21 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG epsg:5682 1 OK 0x1.dad27da06d398p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5682 2 OK 0x1.74f0c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5682 3 OK 0x1.dad27da06d398p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5682 4 OK 0x1.74f0c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5683 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:5683 1 OK 0x1.677b3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5683 2 OK 0x1.ef02c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5683 3 OK 0x1.677b3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5683 4 OK 0x1.ef02c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5684 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:5684 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5684 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5684 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5684 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5685 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:5685 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5685 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5685 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5685 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG epsg:5698 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5698 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5698 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5698 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5698 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5699 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5699 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5699 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5699 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5699 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5700 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.62p7 -0x1.9p4 0x0.0p0 F +REG epsg:5700 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:5700 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5700 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5700 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5707 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5707 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5707 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5707 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5707 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5708 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5708 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5708 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5708 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5708 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5825 0 OK 0x1.8668e36342c31p17 0x1.24e26aa308e12p19 -0x1.ff1c0254p0 0x1.2a04c24ac14d7p7 -0x1.1a8ab9514d226p5 0x1.9202p-15 F +REG epsg:5825 1 OK -0x1.39a0f911e8295p18 0x1.a1ed63ad89acp14 0x1.4640c79d4p4 0x1.1dc3585ba3349p7 -0x1.428ab950d1edcp5 0x1.9cb4p-15 F +REG epsg:5825 2 OK 0x1.60050ae184ac6p19 0x1.a1f0ed76903cp14 0x1.a98b6e4ep1 0x1.36462c39df0d3p7 -0x1.428ab950d22fp5 0x1.765ep-15 F +REG epsg:5825 3 OK -0x1.7ced833fbd96ep18 0x1.15ef2e0ff48c6p20 -0x1.690c5ed3p2 0x1.1dc3585b8e25dp7 -0x1.e51572a2211bdp4 0x1.a6fap-15 F +REG epsg:5825 4 OK 0x1.81ab181f67274p19 0x1.15ef3b528a761p20 -0x1.8f68daa3cp4 0x1.36462c39f4cc3p7 -0x1.e51572a2206c7p4 0x1.8336p-15 F +REG epsg:5828 0 OK 0x1.853ed49eb851fp22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5828 1 OK 0x1.824c68681e56p22 -0x1.0e5fb77d691abp19 -0x1.0d985f9990c77p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.8p-29 F +REG epsg:5828 2 OK 0x1.824c68681e56p22 0x1.0e5fb77d691abp19 -0x1.0d985f9990c77p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.8p-29 F +REG epsg:5828 3 OK 0x1.824c68681e56p22 -0x1.0e5fb77d691abp19 0x1.0d985f9990c77p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.8p-29 F +REG epsg:5828 4 OK 0x1.824c68681e56p22 0x1.0e5fb77d691abp19 0x1.0d985f9990c77p19 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.8p-29 F +REG epsg:5832 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5832 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5832 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5832 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5832 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5833 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5833 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5833 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5833 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5833 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5834 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5834 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5834 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5834 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5834 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5835 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5835 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5835 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5835 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5835 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5836 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:5836 1 OK -0x1.ad750e9eacd8p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5836 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5836 3 OK -0x1.ad750e9eacd8p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5836 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5837 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:5837 1 OK -0x1.ad750e9eacfp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5837 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5837 3 OK -0x1.ad750e9eacfp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5837 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:5839 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.44p6 -0x1.9p4 0x0.0p0 F +REG epsg:5839 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5839 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5839 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5839 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5842 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:5842 1 OK -0x1.ad750e7d8384p15 0x1.203eca48be405p23 0x0.0p0 0x1.c0000001d501cp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5842 2 OK 0x1.018fa873ec1c2p20 0x1.203eca48be405p23 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5842 3 OK -0x1.ad750e7d8384p15 0x1.421b35b741bfbp23 0x0.0p0 0x1.c0000001d501cp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5842 4 OK 0x1.018fa873ec1c2p20 0x1.421b35b741bfbp23 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:5844 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG epsg:5844 1 OK -0x1.aec22c131376p15 0x1.203d7d489ee23p23 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:5844 2 OK 0x1.019a1160989bcp20 0x1.203d7d489ee23p23 0x0.0p0 0x1.17ffffffc55fcp5 -0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:5844 3 OK -0x1.aec22c131376p15 0x1.421c82b7611ddp23 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:5844 4 OK 0x1.019a1160989bcp20 0x1.421c82b7611ddp23 0x0.0p0 0x1.17ffffffc55fcp5 0x1.3fffffffeae09p2 0x0.0p0 F +REG epsg:5845 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5845 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5845 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5845 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5845 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5846 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5846 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5846 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5846 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5846 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5847 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5847 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5847 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5847 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5847 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5848 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5848 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5848 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5848 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5848 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5849 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5849 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5849 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5849 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5849 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5850 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5850 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5850 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5850 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5850 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5851 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5851 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5851 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5851 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5851 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5852 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5852 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5852 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5852 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5852 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5853 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5853 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5853 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5853 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5853 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5854 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5854 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5854 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5854 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5854 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5855 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5855 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5855 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5855 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5855 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5856 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5856 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5856 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5856 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5856 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5857 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5857 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5857 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5857 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5857 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5858 0 OK 0x1.e854784236b7dp18 0x1.b998602a1e344p22 0x1.0cd93178p1 -0x1.97fffffffffffp5 -0x1.9000000000003p4 0x0.0p0 F +REG epsg:5858 1 OK -0x1.fb1e669ef6dep14 0x1.9701fc4679e94p22 -0x1.bebba3bdp2 -0x1.c42297030ae5dp5 -0x1.e000000000005p4 -0x1.0p-29 F +REG epsg:5858 2 OK 0x1.f82d6b862994ep19 0x1.9701fc464d4e4p22 0x1.542fa6dp0 -0x1.6bdd68fcf51a4p5 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:5858 3 OK -0x1.2fa5ac43f566p16 0x1.dacb4efe181bep22 0x1.f4515bb8p0 -0x1.c42297030ae5cp5 -0x1.4000000000002p4 -0x1.0p-29 F +REG epsg:5858 4 OK 0x1.072496ef0ef22p20 0x1.dacb4efdedac8p22 0x1.5f0bed5a8p3 -0x1.6bdd68fcf51a3p5 -0x1.4000000000003p4 0x1.8p-29 F +REG epsg:5875 0 OK 0x1.e85801a139391p18 0x1.b998373ca59d8p22 -0x1.3d9dfe6b4p4 -0x1.2c00000000001p6 -0x1.9000000000003p4 0x1.0p-30 F +REG epsg:5875 1 OK -0x1.faecd0339c12p14 0x1.9701cb83cd056p22 -0x1.d0980c47cp4 -0x1.42114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5875 2 OK 0x1.f82f6835e3a29p19 0x1.9701cb8393ca4p22 -0x1.25f1a902p4 -0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x1.0p-30 F +REG epsg:5875 3 OK -0x1.2f9996be3a65p16 0x1.dacb2d98dfacep22 -0x1.5fa902e9p4 -0x1.42114b818572ep6 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:5875 4 OK 0x1.07259a4903ffap20 0x1.dacb2d98a93a6p22 -0x1.4cfd1e1p3 -0x1.15eeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x1.0p-29 F +REG epsg:5876 0 OK 0x1.e8575d8cb636ap18 0x1.b998425aa8ce2p22 -0x1.bc6d8b368p3 -0x1.14p6 -0x1.8fffffffffffep4 -0x1.0p-30 F +REG epsg:5876 1 OK -0x1.faf52ad35ab6p14 0x1.9701d8c27df97p22 -0x1.726fc9168p4 -0x1.2a114b818572fp6 -0x1.e000000000003p4 -0x1.8p-29 F +REG epsg:5876 2 OK 0x1.f82f06f5a715ap19 0x1.9701d8c247074p22 -0x1.9d3d6eb98p3 -0x1.fbdd68fcf51a4p5 -0x1.e000000000003p4 0x0.0p0 F +REG epsg:5876 3 OK -0x1.2f9b97a4fa598p16 0x1.dacb36ab1d5ep22 -0x1.f2fcc48e8p3 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:5876 4 OK 0x1.0725684caa4fap20 0x1.dacb36aae9182p22 -0x1.1ef837adp2 -0x1.fbdd68fcf51a4p5 -0x1.4000000000002p4 -0x1.0p-30 F +REG epsg:5877 0 OK 0x1.e8568e5f8d0b2p18 0x1.b9984cf51b64ep22 -0x1.06711ea48p3 -0x1.f8p5 -0x1.8fffffffffffep4 -0x1.0p-30 F +REG epsg:5877 1 OK -0x1.fb004d80aecp14 0x1.9701e5647023cp22 -0x1.17939f104p4 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:5877 2 OK 0x1.f82e90dcfbfe9p19 0x1.9701e5643c15p22 -0x1.f18d58ebp2 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffap4 0x1.0p-30 F +REG epsg:5877 3 OK -0x1.2f9e4b90d9d5p16 0x1.dacb3f52008dep22 -0x1.2dcf50c08p3 -0x1.12114b818572ep6 -0x1.4p4 0x0.0p0 F +REG epsg:5877 4 OK 0x1.07252bf42e684p20 0x1.dacb3f51cf079p22 0x1.17bfff38p0 -0x1.cbdd68fcf51a2p5 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG epsg:5879 0 OK 0x1.e80eb22c92d2ep18 0x1.b99bb3d8b050fp22 -0x1.ed593828p5 0x1.68p5 -0x1.8ffffffffffffp4 -0x1.8p-29 F +REG epsg:5879 1 OK -0x1.ff97485622dep14 0x1.970538bfa1cbbp22 -0x1.16bf9745ap6 0x1.3bdd68fcf51a2p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:5879 2 OK 0x1.f80b6c1d19991p19 0x1.970538c06f3a8p22 -0x1.af7a5964dp6 0x1.942297030ae5ep5 -0x1.e000000000005p4 -0x1.0p-29 F +REG epsg:5879 3 OK -0x1.30c0af7bc81p16 0x1.daceb8f0daf36p22 -0x1.0ddac66a4p4 0x1.3bdd68fcf51a3p5 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:5879 4 OK 0x1.071363e709742p20 0x1.daceb8f19e95ep22 -0x1.d25e24158p5 0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:5880 0 OK 0x1.312dp22 0x1.312dp23 0x0.0p0 -0x1.bp5 0x0.0p0 0x0.0p0 T +REG epsg:5880 1 OK 0x1.0f5557a731221p22 0x1.20201bde144b4p23 0x0.0p0 -0x1.d800000000001p5 -0x1.4000000000019p2 0x0.0p0 F +REG epsg:5880 2 OK 0x1.5304a858ceddep22 0x1.20201bde144b4p23 0x0.0p0 -0x1.88p5 -0x1.400000000001ap2 0x0.0p0 F +REG epsg:5880 3 OK 0x1.0f5557a731221p22 0x1.4239e421ebb4cp23 0x0.0p0 -0x1.d800000000001p5 0x1.4000000000019p2 0x0.0p0 F +REG epsg:5880 4 OK 0x1.5304a858ceddep22 0x1.4239e421ebb4cp23 0x0.0p0 -0x1.88p5 0x1.400000000001ap2 0x0.0p0 F +REG epsg:5884 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5884 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5884 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5884 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5884 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5886 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:5886 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5886 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:5886 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5886 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:5887 0 OK 0x1.6e36p20 0x1.312dp22 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:5887 1 OK 0x1.cd70af182796bp19 0x1.0f50949181432p22 0x0.0p0 0x1.640000000ea8p7 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:5887 2 OK 0x1.f5b3a873ec34ap20 0x1.0f50949181432p22 0x0.0p0 -0x1.580000000ea81p7 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:5887 3 OK 0x1.cd70af182796bp19 0x1.53096b6e7ebcep22 0x0.0p0 0x1.640000000ea8p7 0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:5887 4 OK 0x1.f5b3a873ec34ap20 0x1.53096b6e7ebcep22 0x0.0p0 -0x1.580000000ea81p7 0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:5890 0 OK 0x0.0p0 -0x1.091f730184fbbp20 0x0.0p0 0x1.68p6 0x1.3ffffffffffd8p6 0x0.0p0 T +REG epsg:5890 1 OK -0x1.22c055322ffe8p21 -0x1.4fbb0e0454982p20 0x0.0p0 0x1.dfffffffffffep4 0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:5890 2 OK 0x1.22c055322ffe8p21 -0x1.4fbb0e0454982p20 0x0.0p0 0x1.2cp7 0x1.03fffffffffebp6 0x0.0p0 T +REG epsg:5890 3 OK -0x1.6e7a79529dfap16 -0x1.a72c3e0a1bde4p15 0x0.0p0 0x1.dfffffffffffep4 0x1.64p6 0x0.0p0 T +REG epsg:5890 4 OK 0x1.6e7a79529dfap16 -0x1.a72c3e0a1bde4p15 0x0.0p0 0x1.2cp7 0x1.64p6 0x0.0p0 T +REG epsg:5921 0 OK 0x0.0p0 -0x1.140f32600b4cbp15 0x0.0p0 -0x1.bcp6 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5921 1 OK -0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1bfp17 0x0.0p0 -0x1.44477d0778d06p7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5921 2 OK 0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1adp17 0x0.0p0 -0x1.dee20be21cbe6p5 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5921 3 OK -0x1.5a861c0b88532p16 0x1.b855c32012dcbp19 0x0.0p0 -0x1.44477d0778d06p7 0x1.64p6 0x0.0p0 F +REG epsg:5921 4 OK 0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 -0x1.dee20be21cbe8p5 0x1.64p6 0x0.0p0 F +REG epsg:5922 0 OK 0x0.0p0 -0x1.140f32600b4cbp15 0x0.0p0 -0x1.38p5 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5922 1 OK -0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1b3p17 0x0.0p0 -0x1.688efa0ef1a0dp6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5922 2 OK 0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1b3p17 0x0.0p0 0x1.8477d0778d068p3 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5922 3 OK -0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 -0x1.688efa0ef1a0cp6 0x1.64p6 0x0.0p0 F +REG epsg:5922 4 OK 0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 0x1.8477d0778d061p3 0x1.64p6 0x0.0p0 F +REG epsg:5923 0 OK 0x0.0p0 -0x1.140f32600b4cbp15 0x0.0p0 0x1.08p5 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5923 1 OK -0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1adp17 0x0.0p0 -0x1.223be83bc6835p4 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5923 2 OK 0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1b3p17 0x0.0p0 0x1.508efa0ef1a0dp6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5923 3 OK -0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 -0x1.223be83bc682fp4 0x1.64p6 0x0.0p0 F +REG epsg:5923 4 OK 0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 0x1.508efa0ef1a0cp6 0x1.64p6 0x0.0p0 F +REG epsg:5924 0 OK 0x0.0p0 -0x1.140f32600b4cbp15 0x0.0p0 0x1.a400000000001p6 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5924 1 OK -0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1adp17 0x0.0p0 0x1.aee20be21cbe7p5 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5924 2 OK 0x1.66e9c03cc5e78p20 -0x1.ca863c5aae1ccp17 0x0.0p0 0x1.38477d0778d06p7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5924 3 OK -0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 0x1.aee20be21cbe9p5 0x1.64p6 0x0.0p0 F +REG epsg:5924 4 OK 0x1.5a861c0b88532p16 0x1.b855c32012dcbp19 0x0.0p0 0x1.38477d0778d06p7 0x1.64p6 0x0.0p0 F +REG epsg:5925 0 OK 0x0.0p0 -0x1.140f32600b4cbp15 0x0.0p0 0x1.62p7 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5925 1 OK -0x1.66e9c03cc5e79p20 -0x1.ca863c5aae1adp17 0x0.0p0 0x1.f77105f10e5f3p6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5925 2 OK 0x1.66e9c03cc5e78p20 -0x1.ca863c5aae1ccp17 0x0.0p0 -0x1.07b882f8872fap7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5925 3 OK -0x1.5a861c0b88533p16 0x1.b855c32012dcbp19 0x0.0p0 0x1.f77105f10e5f5p6 0x1.64p6 0x0.0p0 F +REG epsg:5925 4 OK 0x1.5a861c0b88532p16 0x1.b855c32012dcbp19 0x0.0p0 -0x1.07b882f8872fap7 0x1.64p6 0x0.0p0 F +REG epsg:5926 0 OK 0x0.0p0 -0x1.0ee789c42eee2p14 0x0.0p0 -0x1.bcp6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5926 1 OK -0x1.32466a581fd2fp20 -0x1.2e03da7ecddfap19 0x0.0p0 -0x1.14b99049d9306p7 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5926 2 OK 0x1.32466a581fd2fp20 -0x1.2e03da7ecddfap19 0x0.0p0 -0x1.4e8cdf6c4d9f5p6 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5926 3 OK -0x1.c6e8ed00a3ac8p18 0x1.e0ffda79ba2fep19 0x0.0p0 -0x1.14b99049d9306p7 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5926 4 OK 0x1.c6e8ed00a3ac8p18 0x1.e0ffda79ba2fep19 0x0.0p0 -0x1.4e8cdf6c4d9f5p6 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5927 0 OK 0x0.0p0 -0x1.0ee789c42eee2p14 0x0.0p0 -0x1.38p5 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5927 1 OK -0x1.32466a581fd2ep20 -0x1.2e03da7ecddfap19 0x0.0p0 -0x1.09732093b260cp6 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5927 2 OK 0x1.32466a581fd2ep20 -0x1.2e03da7ecddfap19 0x0.0p0 -0x1.7466fb626cfa3p3 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5927 3 OK -0x1.c6e8ed00a3ac7p18 0x1.e0ffda79ba2fep19 0x0.0p0 -0x1.09732093b260bp6 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5927 4 OK 0x1.c6e8ed00a3ac7p18 0x1.e0ffda79ba2fep19 0x0.0p0 -0x1.7466fb626cfa7p3 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5928 0 OK 0x0.0p0 -0x1.0ee789c42eee2p14 0x0.0p0 0x1.08p5 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5928 1 OK -0x1.32466a581fd2fp20 -0x1.2e03da7ecddfap19 0x0.0p0 0x1.68cdf6c4d9f4bp2 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5928 2 OK 0x1.32466a581fd2ep20 -0x1.2e03da7ecddfap19 0x0.0p0 0x1.e2e6412764c16p5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5928 3 OK -0x1.c6e8ed00a3ac8p18 0x1.e0ffda79ba2fep19 0x0.0p0 0x1.68cdf6c4d9f4bp2 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5928 4 OK 0x1.c6e8ed00a3ac7p18 0x1.e0ffda79ba2fep19 0x0.0p0 0x1.e2e6412764c16p5 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5929 0 OK 0x0.0p0 -0x1.0ee789c42eee2p14 0x0.0p0 0x1.a400000000001p6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5929 1 OK -0x1.32466a581fd2fp20 -0x1.2e03da7ecddfap19 0x0.0p0 0x1.368cdf6c4d9f5p6 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5929 2 OK 0x1.32466a581fd31p20 -0x1.2e03da7ecddf7p19 0x0.0p0 0x1.08b99049d9306p7 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5929 3 OK -0x1.c6e8ed00a3ac8p18 0x1.e0ffda79ba2fep19 0x0.0p0 0x1.368cdf6c4d9f5p6 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5929 4 OK 0x1.c6e8ed00a3acbp18 0x1.e0ffda79ba3p19 0x0.0p0 0x1.08b99049d9306p7 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5930 0 OK 0x0.0p0 -0x1.0ee789c42eee2p14 0x0.0p0 0x1.62p7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5930 1 OK -0x1.32466a581fd31p20 -0x1.2e03da7ecddf7p19 0x0.0p0 0x1.2b466fb626cfap7 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5930 2 OK 0x1.32466a581fd31p20 -0x1.2e03da7ecddf7p19 0x0.0p0 -0x1.37466fb626cfap7 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5930 3 OK -0x1.c6e8ed00a3acbp18 0x1.e0ffda79ba3p19 0x0.0p0 0x1.2b466fb626cfap7 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5930 4 OK 0x1.c6e8ed00a3acbp18 0x1.e0ffda79ba3p19 0x0.0p0 -0x1.37466fb626cfap7 0x1.43fffffffffedp6 0x0.0p0 F +REG epsg:5931 0 OK 0x0.0p0 -0x1.5ffbfcfd783bep13 0x0.0p0 -0x1.bcp6 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5931 1 OK -0x1.168aeda15539dp20 -0x1.64f9b7b660d5fp19 0x0.0p0 -0x1.03dbf630f6227p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5931 2 OK 0x1.168aeda1553a1p20 -0x1.64f9b7b660d5fp19 0x0.0p0 -0x1.7048139e13bb2p6 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5931 3 OK -0x1.2bbd13d4c40e4p19 0x1.dbe99e95a6a7p19 0x0.0p0 -0x1.03dbf630f6227p7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5931 4 OK 0x1.2bbd13d4c40e8p19 0x1.dbe99e95a6a7p19 0x0.0p0 -0x1.7048139e13bb2p6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5932 0 OK 0x0.0p0 -0x1.5ffbfcfd783bep13 0x0.0p0 -0x1.38p5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5932 1 OK -0x1.168aeda1553a2p20 -0x1.64f9b7b660d5fp19 0x0.0p0 -0x1.cf6fd8c3d889dp5 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5932 2 OK 0x1.168aeda15539ep20 -0x1.64f9b7b660d5fp19 0x0.0p0 -0x1.41204e784eec9p4 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5932 3 OK -0x1.2bbd13d4c40eap19 0x1.dbe99e95a6a7p19 0x0.0p0 -0x1.cf6fd8c3d889dp5 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5932 4 OK 0x1.2bbd13d4c40e5p19 0x1.dbe99e95a6a7p19 0x0.0p0 -0x1.41204e784eec9p4 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5933 0 OK 0x0.0p0 -0x1.5ffbfcfd783bep13 0x0.0p0 0x1.08p5 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5933 1 OK -0x1.168aeda15539ep20 -0x1.64f9b7b660d5fp19 0x0.0p0 0x1.c2409cf09dd95p3 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5933 2 OK 0x1.168aeda15539ep20 -0x1.64f9b7b660d5fp19 0x0.0p0 0x1.9f6fd8c3d889cp5 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5933 3 OK -0x1.2bbd13d4c40e5p19 0x1.dbe99e95a6a7p19 0x0.0p0 0x1.c2409cf09dd95p3 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5933 4 OK 0x1.2bbd13d4c40e5p19 0x1.dbe99e95a6a7p19 0x0.0p0 0x1.9f6fd8c3d889cp5 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5934 0 OK 0x0.0p0 -0x1.5ffbfcfd783bep13 0x0.0p0 0x1.a400000000001p6 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5934 1 OK -0x1.168aeda1553a1p20 -0x1.64f9b7b660d5fp19 0x0.0p0 0x1.5848139e13bb2p6 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5934 2 OK 0x1.168aeda1553a1p20 -0x1.64f9b7b660d5fp19 0x0.0p0 0x1.efb7ec61ec44fp6 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5934 3 OK -0x1.2bbd13d4c40e8p19 0x1.dbe99e95a6a7p19 0x0.0p0 0x1.5848139e13bb2p6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5934 4 OK 0x1.2bbd13d4c40e8p19 0x1.dbe99e95a6a7p19 0x0.0p0 0x1.efb7ec61ec44fp6 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5935 0 OK 0x0.0p0 -0x1.5ffbfcfd783bep13 0x0.0p0 0x1.62p7 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:5935 1 OK -0x1.168aeda1553a1p20 -0x1.64f9b7b660d5fp19 0x0.0p0 0x1.3c2409cf09dd9p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5935 2 OK 0x1.168aeda15539ap20 -0x1.64f9b7b660d5fp19 0x0.0p0 -0x1.482409cf09dd9p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:5935 3 OK -0x1.2bbd13d4c40e8p19 0x1.dbe99e95a6a7p19 0x0.0p0 0x1.3c2409cf09dd9p7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5935 4 OK 0x1.2bbd13d4c40e1p19 0x1.dbe99e95a6a7p19 0x0.0p0 -0x1.482409cf09dd9p7 0x1.23fffffffffffp6 0x0.0p0 F +REG epsg:5936 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 -0x1.2cp7 0x1.64p6 0x0.0p0 T +REG epsg:5936 1 OK 0x1.72d6fc9d0d4dep20 0x1.a479f4de72c24p20 0x0.0p0 0x1.2cp7 0x1.54p6 0x0.0p0 T +REG epsg:5936 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 -0x1.6800000000002p6 0x1.54p6 0x0.0p0 T +REG epsg:5936 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf5p20 0x0.0p0 0x1.2c00000000002p7 0x1.64p6 0x0.0p0 T +REG epsg:5936 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf6p20 0x0.0p0 -0x1.67ffffffffffep6 0x1.64p6 0x0.0p0 T +REG epsg:5937 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 -0x1.9p6 0x1.64p6 0x0.0p0 T +REG epsg:5937 1 OK 0x1.72d6fc9d0d4dep20 0x1.a479f4de72c24p20 0x0.0p0 -0x1.3ffffffffffffp7 0x1.54p6 0x0.0p0 T +REG epsg:5937 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 -0x1.4000000000003p5 0x1.54p6 0x0.0p0 T +REG epsg:5937 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf5p20 0x0.0p0 -0x1.3fffffffffffdp7 0x1.64p6 0x0.0p0 T +REG epsg:5937 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf6p20 0x0.0p0 -0x1.3fffffffffffbp5 0x1.64p6 0x0.0p0 T +REG epsg:5938 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 -0x1.08p5 0x1.64p6 0x0.0p0 T +REG epsg:5938 1 OK 0x1.72d6fc9d0d4ddp20 0x1.a479f4de72c24p20 0x0.0p0 -0x1.7400000000001p6 0x1.54p6 0x0.0p0 T +REG epsg:5938 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 0x1.afffffffffffbp4 0x1.54p6 0x0.0p0 T +REG epsg:5938 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf6p20 0x0.0p0 -0x1.7400000000003p6 0x1.64p6 0x0.0p0 T +REG epsg:5938 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf6p20 0x0.0p0 0x1.b000000000009p4 0x1.64p6 0x0.0p0 T +REG epsg:5939 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 0x1.2p4 0x1.64p6 0x0.0p0 T +REG epsg:5939 1 OK 0x1.72d6fc9d0d4ddp20 0x1.a479f4de72c24p20 0x0.0p0 -0x1.5000000000001p5 0x1.54p6 0x0.0p0 T +REG epsg:5939 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 0x1.37fffffffffffp6 0x1.54p6 0x0.0p0 T +REG epsg:5939 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf6p20 0x0.0p0 -0x1.5000000000005p5 0x1.64p6 0x0.0p0 T +REG epsg:5939 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf5p20 0x0.0p0 0x1.37ffffffffffbp6 0x1.64p6 0x0.0p0 T +REG epsg:5940 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 0x1.a400000000001p6 0x1.64p6 0x0.0p0 T +REG epsg:5940 1 OK 0x1.72d6fc9d0d4ddp20 0x1.a479f4de72c24p20 0x0.0p0 0x1.68p5 0x1.54p6 0x0.0p0 T +REG epsg:5940 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 0x1.4ap7 0x1.54p6 0x0.0p0 T +REG epsg:5940 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf6p20 0x0.0p0 0x1.67ffffffffffcp5 0x1.64p6 0x0.0p0 T +REG epsg:5940 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf5p20 0x0.0p0 0x1.49ffffffffffep7 0x1.64p6 0x0.0p0 T +REG epsg:5942 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5942 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5942 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5942 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5942 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5945 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5945 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5945 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5945 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5945 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5946 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5946 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5946 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5946 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5946 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5947 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5947 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5947 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5947 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5947 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5948 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5948 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5948 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5948 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5948 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5949 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5949 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5949 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5949 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5949 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5950 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5950 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5950 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5950 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5950 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5951 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5951 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5951 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5951 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5951 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5952 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5952 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5952 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5952 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5952 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5953 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5953 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5953 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5953 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5953 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5954 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5954 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5954 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5954 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5954 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5955 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5955 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5955 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5955 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5955 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5956 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5956 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5956 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5956 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5956 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5957 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5957 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5957 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5957 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5957 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5958 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5958 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5958 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5958 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5958 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5959 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5959 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5959 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5959 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5959 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5960 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5960 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5960 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5960 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5960 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5961 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5961 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5961 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5961 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5961 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5962 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5962 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5962 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5962 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5962 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5963 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5963 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5963 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5963 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5963 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5964 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5964 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5964 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5964 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5964 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5965 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5965 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5965 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5965 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5965 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5966 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5966 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5966 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5966 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5966 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5967 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5967 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5967 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5967 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5967 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5968 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5968 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5968 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5968 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5968 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5969 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5969 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5969 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5969 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5969 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5970 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5970 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5970 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5970 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5970 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5971 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5971 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5971 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5971 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5971 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5972 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5972 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5972 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5972 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5972 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5973 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5973 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5973 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5973 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5973 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5974 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5974 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5974 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5974 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5974 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5975 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5975 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5975 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5975 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5975 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5976 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5976 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5976 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5976 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:5976 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6050 0 OK 0x1.85196p24 0x1.6b61d91f96f6ep20 0x0.0p0 -0x1.dffffffffffffp4 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6050 1 OK 0x1.7c2c9f4a0897dp24 0x1.45a6a375bd3c2p20 0x0.0p0 -0x1.1be2242c822c8p6 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6050 2 OK 0x1.8e0620b5f7683p24 0x1.45a6a375bd3c1p20 0x0.0p0 0x1.5f1121641163cp3 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6050 3 OK 0x1.839afe41b6aap24 0x1.cf325e1c5ce4ep20 0x0.0p0 -0x1.1be2242c822d3p6 0x1.62aaaaaaaaaabp6 0x0.0p0 F +REG epsg:6050 4 OK 0x1.8697c1be4956p24 0x1.cf325e1c5ce4ep20 0x0.0p0 0x1.5f11216411699p3 0x1.62aaaaaaaaaabp6 0x0.0p0 F +REG epsg:6051 0 OK 0x1.1a49ap24 0x1.306132a81babfp21 0x0.0p0 -0x1.ap5 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6051 1 OK 0x1.127c318b8b8bdp24 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.2fcdcfea67ff2p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6051 2 OK 0x1.22170e7474743p24 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.c0c8c0566003dp4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6051 3 OK 0x1.170e433133a1ep24 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.2fcdcfea67ff5p6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6051 4 OK 0x1.1d84fccecc5e2p24 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.c0c8c0566002dp4 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6052 0 OK 0x1.38ce2p24 0x1.306132a81babfp21 0x0.0p0 -0x1.8000000000001p3 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6052 1 OK 0x1.3100b18b8b8bdp24 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.1f9b9fd4cffe2p5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6052 2 OK 0x1.409b8e7474743p24 0x1.100c4f4e5c07bp21 0x0.0p0 0x1.7e6e7f533ff88p3 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6052 3 OK 0x1.3592c33133a1ep24 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.1f9b9fd4cffeap5 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6052 4 OK 0x1.3c097ccecc5e2p24 0x1.6342bc2c065bfp21 0x0.0p0 0x1.7e6e7f533ffa7p3 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6053 0 OK 0x1.c2226p24 0x1.aab1280214202p21 0x0.0p0 -0x1.14p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6053 1 OK 0x1.bae903f91890fp24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.57d92f57c0bep6 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6053 2 OK 0x1.c95bbc06e76f1p24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.a04da1507e83ep5 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6053 3 OK 0x1.be296c81d2d87p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.57d92f57c0bd9p6 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6053 4 OK 0x1.c61b537e2d279p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.a04da1507e84cp5 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6054 0 OK 0x1.e0a6ep24 0x1.aab1280214202p21 0x0.0p0 -0x1.38p5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6054 1 OK 0x1.d96d83f91890fp24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.bfb25eaf817cp5 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6054 2 OK 0x1.e7e03c06e76f1p24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.609b42a0fd07dp4 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6054 3 OK 0x1.dcadec81d2d87p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.bfb25eaf817b2p5 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6054 4 OK 0x1.e49fd37e2d279p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.609b42a0fd09ap4 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6055 0 OK 0x1.ff2b6p24 0x1.aab1280214202p21 0x0.0p0 -0x1.4p3 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6055 1 OK 0x1.f7f203f91890fp24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.af64bd5f02f82p4 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6055 2 OK 0x1.03325e0373b78p25 0x1.85b5af04e489ap21 0x0.0p0 0x1.bd92f57c0bd79p2 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6055 3 OK 0x1.fb326c81d2d87p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.af64bd5f02f65p4 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6055 4 OK 0x1.019229bf1693dp25 0x1.dcc7d931390e2p21 0x0.0p0 0x1.bd92f57c0be98p2 0x1.47ffffffffff6p6 0x0.0p0 F +REG epsg:6056 0 OK 0x1.38ce2p24 0x1.12725587ec7dp22 0x0.0p0 -0x1.0p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6056 1 OK 0x1.31ec318fa9a2cp24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.34a9095ff4a2dp6 0x1.2p6 0x0.0p0 F +REG epsg:6056 2 OK 0x1.3fb00e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.96aded4016ba5p5 0x1.2p6 0x0.0p0 F +REG epsg:6056 3 OK 0x1.346d34fa89343p24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.34a9095ff4a32p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6056 4 OK 0x1.3d2f0b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.96aded4016b9dp5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6057 0 OK 0x1.5752ap24 0x1.12725587ec7dp22 0x0.0p0 -0x1.38p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6057 1 OK 0x1.5070b18fa9a2cp24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.a15212bfe945ap5 0x1.2p6 0x0.0p0 F +REG epsg:6057 2 OK 0x1.5e348e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.9d5bda802d74ap4 0x1.2p6 0x0.0p0 F +REG epsg:6057 3 OK 0x1.52f1b4fa89343p24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.a15212bfe9462p5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6057 4 OK 0x1.5bb38b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.9d5bda802d73ap4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6058 0 OK 0x1.75d72p24 0x1.12725587ec7dp22 0x0.0p0 -0x1.cp3 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6058 1 OK 0x1.6ef5318fa9a2cp24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.b2a4257fd28b6p4 0x1.2p6 0x0.0p0 F +REG epsg:6058 2 OK 0x1.7cb90e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.ab7b5005ae94dp-1 0x1.2p6 0x0.0p0 F +REG epsg:6058 3 OK 0x1.717634fa89343p24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.b2a4257fd28c6p4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6058 4 OK 0x1.7a380b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.ab7b5005ae749p-1 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6059 0 OK 0x1.3c9ebp25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.fp5 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6059 1 OK 0x1.394a89b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.2325c758a7ed1p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6059 2 OK 0x1.3ff2d64fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.99b4714eb025ep5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6059 3 OK 0x1.3a4d5fd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.2325c758a7ed8p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6059 4 OK 0x1.3ef0002e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.99b4714eb025p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6060 0 OK 0x1.4be0fp25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.5p5 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6060 1 OK 0x1.488cc9b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.a64b8eb14fda2p5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6060 2 OK 0x1.4f35164fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.f368e29d604bdp4 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6060 3 OK 0x1.498f9fd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.a64b8eb14fdafp5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6060 4 OK 0x1.4e32402e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.f368e29d604a2p4 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6061 0 OK 0x1.5b233p25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.6p4 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6061 1 OK 0x1.57cf09b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.064b8eb14fda2p5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6061 2 OK 0x1.5e77564fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.66d1c53ac097ap3 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6061 3 OK 0x1.58d1dfd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.064b8eb14fdafp5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6061 4 OK 0x1.5d74802e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.66d1c53ac0941p3 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6062 0 OK 0x1.945bap24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.cp5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6062 1 OK 0x1.8ddc574b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.04a69eac31193p6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6062 2 OK 0x1.9adae8b4f3be6p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.76b2c2a79dcdcp5 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6062 3 OK 0x1.8f8b91156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.04a69eac31194p6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6062 4 OK 0x1.992baeea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.76b2c2a79dcd7p5 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6063 0 OK 0x1.b2e02p24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.3p5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6063 1 OK 0x1.ac60d74b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.794d3d5862325p5 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6063 2 OK 0x1.b95f68b4f3be6p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.cd65854f3b9b7p4 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6063 3 OK 0x1.ae1011156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.794d3d586232ap5 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6063 4 OK 0x1.b7b02eea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.cd65854f3b9aep4 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6064 0 OK 0x1.d164ap24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.4p4 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6064 1 OK 0x1.cae5574b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.d29a7ab0c464ap4 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6064 2 OK 0x1.d7e3e8b4f3be6p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.5acb0a9e7736cp3 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6064 3 OK 0x1.cc9491156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.d29a7ab0c4652p4 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6064 4 OK 0x1.d634aeea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.5acb0a9e7735cp3 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6065 0 OK 0x1.5ef3cp23 0x1.c9a4aaa2898bap22 0x0.0p0 -0x1.98p5 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6065 1 OK 0x1.5232e45e5ad2fp23 0x1.b49445e537fdep22 0x0.0p0 -0x1.d7e5a072a957fp5 0x1.effffffffff91p5 0x0.0p0 F +REG epsg:6065 2 OK 0x1.6bb49ba1a52d1p23 0x1.b49445e537fdep22 0x0.0p0 -0x1.581a5f8d56a81p5 0x1.effffffffff91p5 0x0.0p0 F +REG epsg:6065 3 OK 0x1.5510c9bba7149p23 0x1.e1970fbd5905bp22 0x0.0p0 -0x1.d7e5a072a957fp5 0x1.12aaaaaaaaaa6p6 0x0.0p0 F +REG epsg:6065 4 OK 0x1.68d6b64458eb7p23 0x1.e1970fbd5905bp22 0x0.0p0 -0x1.581a5f8d56a82p5 0x1.12aaaaaaaaaa6p6 0x0.0p0 F +REG epsg:6066 0 OK 0x1.9bfccp23 0x1.c9a4aaa2898bap22 0x0.0p0 -0x1.1p5 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6066 1 OK 0x1.8f3be45e5ad2fp23 0x1.b49445e537fdep22 0x0.0p0 -0x1.4fe5a072a958p5 0x1.effffffffff91p5 0x0.0p0 F +REG epsg:6066 2 OK 0x1.a8bd9ba1a52d1p23 0x1.b49445e537fdep22 0x0.0p0 -0x1.a034bf1aad503p4 0x1.effffffffff91p5 0x0.0p0 F +REG epsg:6066 3 OK 0x1.9219c9bba7149p23 0x1.e1970fbd5905bp22 0x0.0p0 -0x1.4fe5a072a957fp5 0x1.12aaaaaaaaaa6p6 0x0.0p0 F +REG epsg:6066 4 OK 0x1.a5dfb64458eb7p23 0x1.e1970fbd5905bp22 0x0.0p0 -0x1.a034bf1aad504p4 0x1.12aaaaaaaaaa6p6 0x0.0p0 F +REG epsg:6067 0 OK 0x1.38ce2p24 0x1.0358edaaf4b2dp23 0x0.0p0 -0x1.ap5 0x1.effffffffff93p5 0x0.0p0 F +REG epsg:6067 1 OK 0x1.3285e76b7af2dp24 0x1.f166675d65dap22 0x0.0p0 -0x1.d8cd2bfd749a4p5 0x1.d55555555545p5 0x0.0p0 F +REG epsg:6067 2 OK 0x1.3f165894850d3p24 0x1.f166675d65dap22 0x0.0p0 -0x1.6732d4028b65dp5 0x1.d55555555545p5 0x0.0p0 F +REG epsg:6067 3 OK 0x1.33c2e8ce808c2p24 0x1.0f3db842ff1fep23 0x0.0p0 -0x1.d8cd2bfd749a8p5 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6067 4 OK 0x1.3dd957317f73ep24 0x1.0f3db842ff1fep23 0x0.0p0 -0x1.6732d4028b659p5 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6068 0 OK 0x1.5752ap24 0x1.0358edaaf4b2dp23 0x0.0p0 -0x1.28p5 0x1.effffffffff93p5 0x0.0p0 F +REG epsg:6068 1 OK 0x1.510a676b7af2dp24 0x1.f166675d65dap22 0x0.0p0 -0x1.60cd2bfd749a4p5 0x1.d55555555545p5 0x0.0p0 F +REG epsg:6068 2 OK 0x1.5d9ad894850d3p24 0x1.f166675d65dap22 0x0.0p0 -0x1.de65a80516cb9p4 0x1.d55555555545p5 0x0.0p0 F +REG epsg:6068 3 OK 0x1.524768ce808c2p24 0x1.0f3db842ff1fep23 0x0.0p0 -0x1.60cd2bfd749a6p5 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6068 4 OK 0x1.5c5dd7317f73ep24 0x1.0f3db842ff1fep23 0x0.0p0 -0x1.de65a80516cb4p4 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6069 0 OK 0x1.5752ap24 0x1.306132a81babfp21 0x0.0p0 0x1.0p4 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6069 1 OK 0x1.4f85318b8b8bdp24 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.fcdcfea67ff11p2 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6069 2 OK 0x1.5f200e7474743p24 0x1.100c4f4e5c07bp21 0x0.0p0 0x1.3f9b9fd4cffe2p5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6069 3 OK 0x1.5417433133a1ep24 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.fcdcfea67ff4ep2 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6069 4 OK 0x1.5a8dfccecc5e2p24 0x1.6342bc2c065bfp21 0x0.0p0 0x1.3f9b9fd4cffeap5 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6070 0 OK 0x1.5ef3cp23 0x1.aab1280214202p21 0x0.0p0 0x1.5p4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6070 1 OK 0x1.508107f23121fp23 0x1.85b5af04e489ap21 0x0.0p0 0x1.026d0a83f4244p2 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6070 2 OK 0x1.6d66780dcede1p23 0x1.85b5af04e489ap21 0x0.0p0 0x1.2fb25eaf817b7p5 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6070 3 OK 0x1.5701d903a5b0ep23 0x1.dcc7d931390e2p21 0x0.0p0 0x1.026d0a83f426cp2 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6070 4 OK 0x1.66e5a6fc5a4f2p23 0x1.dcc7d931390e2p21 0x0.0p0 0x1.2fb25eaf817b3p5 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6071 0 OK 0x1.945bap24 0x1.12725587ec7dp22 0x0.0p0 0x1.4p3 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6071 1 OK 0x1.8d79b18fa9a2cp24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.95212bfe945afp1 0x1.2p6 0x0.0p0 F +REG epsg:6071 2 OK 0x1.9b3d8e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 0x1.72a4257fd28b6p4 0x1.2p6 0x0.0p0 F +REG epsg:6071 3 OK 0x1.8ffab4fa89343p24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.95212bfe9463p1 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6071 4 OK 0x1.98bc8b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 0x1.72a4257fd28c6p4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6072 0 OK 0x1.b2e02p24 0x1.12725587ec7dp22 0x0.0p0 0x1.1p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6072 1 OK 0x1.abfe318fa9a2cp24 0x1.fd9f0ac6760b2p21 0x0.0p0 0x1.4d5bda802d74cp4 0x1.2p6 0x0.0p0 F +REG epsg:6072 2 OK 0x1.b9c20e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 0x1.795212bfe945bp5 0x1.2p6 0x0.0p0 F +REG epsg:6072 3 OK 0x1.ae7f34fa89343p24 0x1.2b1e2275529acp22 0x0.0p0 0x1.4d5bda802d73cp4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6072 4 OK 0x1.b7410b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 0x1.795212bfe9463p5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6073 0 OK 0x1.5ef3cp23 0x1.4f85e9fb071a8p22 0x0.0p0 0x1.cp3 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6073 1 OK 0x1.51a326c121f63p23 0x1.3b3678e22b381p22 0x0.0p0 0x1.9b4714eb02587p1 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6073 2 OK 0x1.6c44593ede09dp23 0x1.3b3678e22b381p22 0x0.0p0 0x1.8c971d629fb5p4 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6073 3 OK 0x1.55ae7f46d0331p23 0x1.67e5b06d2c6a9p22 0x0.0p0 0x1.9b4714eb02598p1 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6073 4 OK 0x1.683900b92fccfp23 0x1.67e5b06d2c6a9p22 0x0.0p0 0x1.8c971d629fb4dp4 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6074 0 OK 0x1.9bfccp23 0x1.4f85e9fb071a8p22 0x0.0p0 0x1.1p5 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6074 1 OK 0x1.8eac26c121f63p23 0x1.3b3678e22b381p22 0x0.0p0 0x1.7368e29d604b1p4 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6074 2 OK 0x1.a94d593ede09dp23 0x1.3b3678e22b381p22 0x0.0p0 0x1.664b8eb14fda8p5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6074 3 OK 0x1.92b77f46d0331p23 0x1.67e5b06d2c6a9p22 0x0.0p0 0x1.7368e29d604b4p4 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6074 4 OK 0x1.a54200b92fccfp23 0x1.67e5b06d2c6a9p22 0x0.0p0 0x1.664b8eb14fda7p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6075 0 OK 0x1.75d72p24 0x1.306132a81bb98p21 0x0.0p0 0x1.a8p5 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6075 1 OK 0x1.6e09b18b8c13cp24 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.d0c8c05660028p4 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6075 2 OK 0x1.7da48e7473ec4p24 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.33cdcfea67ff6p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6075 3 OK 0x1.729bc33133dc1p24 0x1.6342bc2c02eeap21 0x0.0p0 0x1.d0c8c0566000dp4 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6075 4 OK 0x1.79127ccecc23fp24 0x1.6342bc2c02eeap21 0x0.0p0 0x1.33cdcfea67ffcp6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6076 0 OK 0x1.945bap24 0x1.306132a81bb98p21 0x0.0p0 0x1.74p6 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6076 1 OK 0x1.8c8e318b8c13cp24 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.143230159800ap6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6076 2 OK 0x1.9c290e7473ec4p24 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.d3cdcfea67ff7p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6076 3 OK 0x1.9120433133dc1p24 0x1.6342bc2c02eeap21 0x0.0p0 0x1.1432301598004p6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6076 4 OK 0x1.9796fccecc23fp24 0x1.6342bc2c02eeap21 0x0.0p0 0x1.d3cdcfea67ffcp6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6077 0 OK 0x1.9bfccp23 0x1.aab128021428fp21 0x0.0p0 0x1.ap5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6077 1 OK 0x1.8d8a07f23216fp23 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.184da1507e844p5 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6077 2 OK 0x1.aa6f780dcde91p23 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.13d92f57c0bdep6 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6077 3 OK 0x1.940ad903a63e1p23 0x1.dcc7d93135d33p21 0x0.0p0 0x1.184da1507e843p5 0x1.47ffffffffff6p6 0x0.0p0 F +REG epsg:6077 4 OK 0x1.a3eea6fc59c1fp23 0x1.dcc7d93135d33p21 0x0.0p0 0x1.13d92f57c0bdfp6 0x1.47ffffffffff6p6 0x0.0p0 F +REG epsg:6078 0 OK 0x1.d905cp23 0x1.aab128021428fp21 0x0.0p0 0x1.4cp6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6078 1 OK 0x1.ca9307f23216fp23 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.0826d0a83f422p6 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6078 2 OK 0x1.e778780dcde91p23 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.8fd92f57c0bdep6 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6078 3 OK 0x1.d113d903a63e1p23 0x1.dcc7d93135d33p21 0x0.0p0 0x1.0826d0a83f421p6 0x1.47ffffffffff6p6 0x0.0p0 F +REG epsg:6078 4 OK 0x1.e0f7a6fc59c1fp23 0x1.dcc7d93135d33p21 0x0.0p0 0x1.8fd92f57c0bdfp6 0x1.47ffffffffff6p6 0x0.0p0 F +REG epsg:6079 0 OK 0x1.0b076p24 0x1.aab128021428fp21 0x0.0p0 0x1.c800000000001p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6079 1 OK 0x1.03ce03f9190b8p24 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.8426d0a83f427p6 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6079 2 OK 0x1.1240bc06e6f48p24 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.05ec97abe05eep7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6079 3 OK 0x1.070e6c81d31f1p24 0x1.dcc7d93135d33p21 0x0.0p0 0x1.8426d0a83f42ap6 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6079 4 OK 0x1.0f00537e2ce0fp24 0x1.dcc7d93135d33p21 0x0.0p0 0x1.05ec97abe05ecp7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6080 0 OK 0x1.298bep24 0x1.aab128021428fp21 0x0.0p0 0x1.22p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6080 1 OK 0x1.225283f9190b8p24 0x1.85b5af04e6bc7p21 0x0.0p0 0x1.001368541fa13p7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6080 2 OK 0x1.30c53c06e6f48p24 0x1.85b5af04e6bc6p21 0x0.0p0 0x1.43ec97abe05edp7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6080 3 OK 0x1.2592ec81d31f1p24 0x1.dcc7d93135d33p21 0x0.0p0 0x1.001368541fa15p7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6080 4 OK 0x1.2d84d37e2ce0fp24 0x1.dcc7d93135d33p21 0x0.0p0 0x1.43ec97abe05ecp7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6081 0 OK 0x1.d164ap24 0x1.12725587ec802p22 0x0.0p0 0x1.d000000000001p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6081 1 OK 0x1.ca82b18faa138p24 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.66aded4016bap5 0x1.2p6 0x0.0p0 F +REG epsg:6081 2 OK 0x1.d8468e7055ec8p24 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.1ca9095ff4a3p6 0x1.2p6 0x0.0p0 F +REG epsg:6081 3 OK 0x1.cd03b4fa89808p24 0x1.2b1e2275511f2p22 0x0.0p0 0x1.66aded4016ba6p5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6081 4 OK 0x1.d5c58b05767f8p24 0x1.2b1e2275511f2p22 0x0.0p0 0x1.1ca9095ff4a2ep6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6082 0 OK 0x1.efe92p24 0x1.12725587ec802p22 0x0.0p0 0x1.48p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6082 1 OK 0x1.e907318faa138p24 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.1356f6a00b5dp6 0x1.2p6 0x0.0p0 F +REG epsg:6082 2 OK 0x1.f6cb0e7055ec8p24 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.7ca9095ff4a3p6 0x1.2p6 0x0.0p0 F +REG epsg:6082 3 OK 0x1.eb8834fa89808p24 0x1.2b1e2275511f2p22 0x0.0p0 0x1.1356f6a00b5d3p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6082 4 OK 0x1.f44a0b05767f8p24 0x1.2b1e2275511f2p22 0x0.0p0 0x1.7ca9095ff4a2dp6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6083 0 OK 0x1.0736dp25 0x1.12725587ec802p22 0x0.0p0 0x1.a8p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6083 1 OK 0x1.03c5d8c7d509cp25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.7356f6a00b5dp6 0x1.2p6 0x0.0p0 F +REG epsg:6083 2 OK 0x1.0aa7c7382af64p25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.dca9095ff4a31p6 0x1.2p6 0x0.0p0 F +REG epsg:6083 3 OK 0x1.05065a7d44c04p25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.7356f6a00b5d2p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6083 4 OK 0x1.09674582bb3fcp25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.dca9095ff4a2dp6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6084 0 OK 0x1.16791p25 0x1.12725587ec802p22 0x0.0p0 0x1.04p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6084 1 OK 0x1.130818c7d509cp25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.d356f6a00b5cfp6 0x1.2p6 0x0.0p0 F +REG epsg:6084 2 OK 0x1.19ea07382af64p25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.1e5484affa519p7 0x1.2p6 0x0.0p0 F +REG epsg:6084 3 OK 0x1.14489a7d44c04p25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.d356f6a00b5d3p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6084 4 OK 0x1.18a98582bb3fcp25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.1e5484affa517p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6085 0 OK 0x1.25bb5p25 0x1.12725587ec802p22 0x0.0p0 0x1.34p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6085 1 OK 0x1.224a58c7d509cp25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.19ab7b5005ae8p7 0x1.2p6 0x0.0p0 F +REG epsg:6085 2 OK 0x1.292c47382af64p25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.4e5484affa519p7 0x1.2p6 0x0.0p0 F +REG epsg:6085 3 OK 0x1.238ada7d44c04p25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.19ab7b5005aeap7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6085 4 OK 0x1.27ebc582bb3fcp25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.4e5484affa517p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6086 0 OK 0x1.34fd9p25 0x1.12725587ec802p22 0x0.0p0 0x1.66p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6086 1 OK 0x1.318c98c7d509cp25 0x1.fd9f0ac6781efp21 0x0.0p0 0x1.4bab7b5005ae8p7 0x1.2p6 0x0.0p0 F +REG epsg:6086 2 OK 0x1.386e87382af64p25 0x1.fd9f0ac6781efp21 0x0.0p0 -0x1.4fab7b5005ae7p7 0x1.2p6 0x0.0p0 F +REG epsg:6086 3 OK 0x1.32cd1a7d44c04p25 0x1.2b1e2275511f2p22 0x0.0p0 0x1.4bab7b5005aeap7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6086 4 OK 0x1.372e0582bb3fcp25 0x1.2b1e2275511f2p22 0x0.0p0 -0x1.4fab7b5005ae9p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6087 0 OK 0x1.d905cp23 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.bp5 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6087 1 OK 0x1.cbb526c122c76p23 0x1.3b3678e22c234p22 0x0.0p0 0x1.59b4714eb0256p5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6087 2 OK 0x1.e656593edd38ap23 0x1.3b3678e22c234p22 0x0.0p0 0x1.0325c758a7ed4p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6087 3 OK 0x1.cfc07f46d0d04p23 0x1.67e5b06d2b175p22 0x0.0p0 0x1.59b4714eb0257p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6087 4 OK 0x1.e24b00b92f2fcp23 0x1.67e5b06d2b176p22 0x0.0p0 0x1.0325c758a7ed4p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6088 0 OK 0x1.0b076p24 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.28p6 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6088 1 OK 0x1.045f13609163bp24 0x1.3b3678e22c234p22 0x0.0p0 0x1.f9b4714eb0258p5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6088 2 OK 0x1.11afac9f6e9c5p24 0x1.3b3678e22c234p22 0x0.0p0 0x1.5325c758a7ed5p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6088 3 OK 0x1.0664bfa368682p24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.f9b4714eb0258p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6088 4 OK 0x1.0faa005c9797ep24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.5325c758a7ed5p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6089 0 OK 0x1.298bep24 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.7cp6 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6089 1 OK 0x1.22e393609163bp24 0x1.3b3678e22c234p22 0x0.0p0 0x1.50da38a75812cp6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6089 2 OK 0x1.30342c9f6e9c5p24 0x1.3b3678e22c234p22 0x0.0p0 0x1.a725c758a7ed5p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6089 3 OK 0x1.24e93fa368682p24 0x1.67e5b06d2b176p22 0x0.0p0 0x1.50da38a75812cp6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6089 4 OK 0x1.2e2e805c9797ep24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.a725c758a7ed5p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6090 0 OK 0x1.48106p24 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.d000000000001p6 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6090 1 OK 0x1.416813609163bp24 0x1.3b3678e22c234p22 0x0.0p0 0x1.a4da38a75812cp6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6090 2 OK 0x1.4eb8ac9f6e9c5p24 0x1.3b3678e22c234p22 0x0.0p0 0x1.fb25c758a7ed6p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6090 3 OK 0x1.436dbfa368682p24 0x1.67e5b06d2b176p22 0x0.0p0 0x1.a4da38a75812cp6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6090 4 OK 0x1.4cb3005c9797ep24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.fb25c758a7ed6p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6091 0 OK 0x1.6694ep24 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.12p7 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6091 1 OK 0x1.5fec93609163bp24 0x1.3b3678e22c234p22 0x0.0p0 0x1.f8da38a75812bp6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6091 2 OK 0x1.6d3d2c9f6e9c5p24 0x1.3b3678e22c234p22 0x0.0p0 0x1.2792e3ac53f6bp7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6091 3 OK 0x1.61f23fa368682p24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.f8da38a75812dp6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6091 4 OK 0x1.6b37805c9797ep24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.2792e3ac53f6ap7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6092 0 OK 0x1.85196p24 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.3cp7 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6092 1 OK 0x1.7e7113609163bp24 0x1.3b3678e22c234p22 0x0.0p0 0x1.266d1c53ac095p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6092 2 OK 0x1.8bc1ac9f6e9c5p24 0x1.3b3678e22c234p22 0x0.0p0 0x1.5192e3ac53f6ap7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6092 3 OK 0x1.8076bfa368682p24 0x1.67e5b06d2b175p22 0x0.0p0 0x1.266d1c53ac095p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6092 4 OK 0x1.89bc005c9797ep24 0x1.67e5b06d2b176p22 0x0.0p0 0x1.5192e3ac53f6ap7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6093 0 OK 0x1.a39dep24 0x1.4f85e9fb071cbp22 0x0.0p0 0x1.66p7 0x1.1ffffffffffffp6 0x0.0p0 F +REG epsg:6093 1 OK 0x1.9cf593609163bp24 0x1.3b3678e22c234p22 0x0.0p0 0x1.506d1c53ac096p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6093 2 OK 0x1.aa462c9f6e9c5p24 0x1.3b3678e22c234p22 0x0.0p0 -0x1.546d1c53ac095p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6093 3 OK 0x1.9efb3fa368682p24 0x1.67e5b06d2b176p22 0x0.0p0 0x1.506d1c53ac096p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6093 4 OK 0x1.a840805c9797ep24 0x1.67e5b06d2b176p22 0x0.0p0 -0x1.546d1c53ac095p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6094 0 OK 0x1.c2226p24 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.46p7 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6094 1 OK 0x1.bb7a136090fb2p24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.5b92e3ac53f68p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6094 2 OK 0x1.c8caac9f6f04fp24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.306d1c53ac095p7 0x1.12aaaaaaaaaa3p6 0x0.0p0 F +REG epsg:6094 3 OK 0x1.bd7fbfa368198p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.5b92e3ac53f6cp7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6094 4 OK 0x1.c6c5005c97e68p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.306d1c53ac095p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6095 0 OK 0x1.e0a6ep24 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.26p7 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6095 1 OK 0x1.d9fe936090fb1p24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.3b92e3ac53f6bp7 0x1.12aaaaaaaaaa3p6 0x0.0p0 F +REG epsg:6095 2 OK 0x1.e74f2c9f6f04ep24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.106d1c53ac098p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6095 3 OK 0x1.dc043fa368198p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.3b92e3ac53f6bp7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6095 4 OK 0x1.e549805c97e68p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.106d1c53ac094p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6096 0 OK 0x1.ba814p23 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.4ap7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6096 1 OK 0x1.ad82ae9618833p23 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.5c534f56188cbp7 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6096 2 OK 0x1.c77fd169e77ccp23 0x1.77d5966dcbe78p22 0x0.0p0 -0x1.37acb0a9e7736p7 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6096 3 OK 0x1.b0e1222adb822p23 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.5c534f56188cap7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6096 4 OK 0x1.c4215dd5247ddp23 0x1.a4b9a8168a6d3p22 0x0.0p0 -0x1.37acb0a9e7737p7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6097 0 OK 0x1.f78a4p23 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.26p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6097 1 OK 0x1.ea8bae9618833p23 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.38534f56188cbp7 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6097 2 OK 0x1.024468b4f3be6p24 0x1.77d5966dcbe78p22 0x0.0p0 -0x1.13acb0a9e7736p7 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6097 3 OK 0x1.edea222adb822p23 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.38534f56188cap7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6097 4 OK 0x1.00952eea923efp24 0x1.a4b9a8168a6d3p22 0x0.0p0 -0x1.13acb0a9e7736p7 0x1.1fffffffffffcp6 0x0.0p0 F +REG epsg:6098 0 OK 0x1.6694ep24 0x1.6b61d91f96f6ep20 0x0.0p0 -0x1.68p6 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6098 1 OK 0x1.5da81f4a0897dp24 0x1.45a6a375bd3c1p20 0x0.0p0 -0x1.05f1121641164p7 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6098 2 OK 0x1.6f81a0b5f7683p24 0x1.45a6a375bd3c1p20 0x0.0p0 -0x1.883bb7a6fba71p5 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6098 3 OK 0x1.65167e41b6aap24 0x1.cf325e1c5ce4ep20 0x0.0p0 -0x1.05f112164116ap7 0x1.62aaaaaaaaaabp6 0x0.0p0 F +REG epsg:6098 4 OK 0x1.681341be4956p24 0x1.cf325e1c5ce4ep20 0x0.0p0 -0x1.883bb7a6fba5ap5 0x1.62aaaaaaaaaabp6 0x0.0p0 F +REG epsg:6099 0 OK 0x1.ba814p23 0x1.306132a81babfp21 0x0.0p0 -0x1.ccp6 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6099 1 OK 0x1.aae663171717ap23 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.15e6e7f533ff9p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6099 2 OK 0x1.ca1c1ce8e8e86p23 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.6c3230159800fp6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6099 3 OK 0x1.b40a86626743cp23 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.15e6e7f533ffbp7 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6099 4 OK 0x1.c0f7f99d98bc4p23 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.6c3230159800ap6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6100 0 OK 0x1.f78a4p23 0x1.306132a81babfp21 0x0.0p0 -0x1.2cp6 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6100 1 OK 0x1.e7ef63171717ap23 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.8bcdcfea67ff1p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6100 2 OK 0x1.03928e7474743p24 0x1.100c4f4e5c07bp21 0x0.0p0 -0x1.9864602b3001fp5 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6100 3 OK 0x1.f11386626743cp23 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.8bcdcfea67ff5p6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6100 4 OK 0x1.fe00f99d98bc4p23 0x1.6342bc2c065bfp21 0x0.0p0 -0x1.9864602b30017p5 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6101 0 OK 0x1.85196p24 0x1.aab1280214202p21 0x0.0p0 -0x1.02p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6101 1 OK 0x1.7de003f91890fp24 0x1.85b5af04e4899p21 0x0.0p0 -0x1.23ec97abe05fp7 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6101 2 OK 0x1.8c52bc06e76f1p24 0x1.85b5af04e4899p21 0x0.0p0 -0x1.c026d0a83f42p6 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6101 3 OK 0x1.81206c81d2d87p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.23ec97abe05ecp7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6101 4 OK 0x1.8912537e2d279p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.c026d0a83f426p6 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6102 0 OK 0x1.a39dep24 0x1.aab1280214202p21 0x0.0p0 -0x1.8cp6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6102 1 OK 0x1.9c6483f91890fp24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.cfd92f57c0bep6 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6102 2 OK 0x1.aad73c06e76f1p24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.4826d0a83f41fp6 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6102 3 OK 0x1.9fa4ec81d2d87p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.cfd92f57c0bd9p6 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6102 4 OK 0x1.a796d37e2d279p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.4826d0a83f426p6 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6103 0 OK 0x1.c2226p24 0x1.aab1280214202p21 0x0.0p0 -0x1.14p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6103 1 OK 0x1.bae903f91890fp24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.57d92f57c0bep6 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6103 2 OK 0x1.c95bbc06e76f1p24 0x1.85b5af04e489ap21 0x0.0p0 -0x1.a04da1507e83ep5 0x1.2d55555555554p6 0x0.0p0 F +REG epsg:6103 3 OK 0x1.be296c81d2d87p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.57d92f57c0bd9p6 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6103 4 OK 0x1.c61b537e2d279p24 0x1.dcc7d931390e2p21 0x0.0p0 -0x1.a04da1507e84cp5 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6104 0 OK 0x1.ba814p23 0x1.12725587ec7dp22 0x0.0p0 -0x1.02p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6104 1 OK 0x1.acbd631f53457p23 0x1.fd9f0ac6760b3p21 0x0.0p0 -0x1.1c5484affa518p7 0x1.2p6 0x0.0p0 F +REG epsg:6104 2 OK 0x1.c8451ce0acba8p23 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.cf56f6a00b5d2p6 0x1.2p6 0x0.0p0 F +REG epsg:6104 3 OK 0x1.b1bf69f512686p23 0x1.2b1e2275529acp22 0x0.0p0 -0x1.1c5484affa518p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6104 4 OK 0x1.c343160aed97ap23 0x1.2b1e2275529acp22 0x0.0p0 -0x1.cf56f6a00b5cep6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6105 0 OK 0x1.f78a4p23 0x1.12725587ec7dp22 0x0.0p0 -0x1.ap6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6105 1 OK 0x1.e9c6631f53457p23 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.d4a9095ff4a32p6 0x1.2p6 0x0.0p0 F +REG epsg:6105 2 OK 0x1.02a70e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.6b56f6a00b5d3p6 0x1.2p6 0x0.0p0 F +REG epsg:6105 3 OK 0x1.eec869f512686p23 0x1.2b1e2275529acp22 0x0.0p0 -0x1.d4a9095ff4a32p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6105 4 OK 0x1.00260b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.6b56f6a00b5cfp6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6106 0 OK 0x1.1a49ap24 0x1.12725587ec7dp22 0x0.0p0 -0x1.3cp6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6106 1 OK 0x1.1367b18fa9a2cp24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.70a9095ff4a2dp6 0x1.2p6 0x0.0p0 F +REG epsg:6106 2 OK 0x1.212b8e70565d4p24 0x1.fd9f0ac6760b2p21 0x0.0p0 -0x1.0756f6a00b5d2p6 0x1.2p6 0x0.0p0 F +REG epsg:6106 3 OK 0x1.15e8b4fa89343p24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.70a9095ff4a32p6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6106 4 OK 0x1.1eaa8b0576cbdp24 0x1.2b1e2275529acp22 0x0.0p0 -0x1.0756f6a00b5cep6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6107 0 OK 0x1.ff2b6p24 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.06p7 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6107 1 OK 0x1.f883136090fb1p24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.1b92e3ac53f6bp7 0x1.12aaaaaaaaaa3p6 0x0.0p0 F +REG epsg:6107 2 OK 0x1.02e9d64fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.e0da38a75813p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6107 3 OK 0x1.fa88bfa368198p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.1b92e3ac53f6bp7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6107 4 OK 0x1.01e7002e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.e0da38a758128p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6108 0 OK 0x1.0ed7fp25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.bcp6 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6108 1 OK 0x1.0b83c9b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.e725c758a7ed1p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6108 2 OK 0x1.122c164fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.90da38a75812fp6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6108 3 OK 0x1.0c869fd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.e725c758a7ed8p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6108 4 OK 0x1.1129402e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.90da38a758128p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6109 0 OK 0x1.1e1a3p25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.6cp6 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6109 1 OK 0x1.1ac609b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.9725c758a7ed1p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6109 2 OK 0x1.216e564fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.40da38a75812fp6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6109 3 OK 0x1.1bc8dfd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.9725c758a7ed8p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6109 4 OK 0x1.206b802e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.40da38a758128p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6110 0 OK 0x1.2d5c7p25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.1cp6 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6110 1 OK 0x1.2a0849b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.4725c758a7ed1p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6110 2 OK 0x1.30b0964fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.e1b4714eb025ep5 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6110 3 OK 0x1.2b0b1fd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.4725c758a7ed8p6 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6110 4 OK 0x1.2fadc02e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.e1b4714eb025p5 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6111 0 OK 0x1.1a49ap24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.08p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6111 1 OK 0x1.13ca574b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.1a534f56188c9p7 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6111 2 OK 0x1.20c8e8b4f3be7p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.eb596153cee69p6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6111 3 OK 0x1.157991156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.1a534f56188cap7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6111 4 OK 0x1.1f19aeea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.eb596153cee6cp6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6112 0 OK 0x1.38ce2p24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.c4p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6112 1 OK 0x1.324ed74b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.e8a69eac31194p6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6112 2 OK 0x1.3f4d68b4f3be6p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.9f596153cee6ep6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6112 3 OK 0x1.33fe11156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.e8a69eac31196p6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6112 4 OK 0x1.3d9e2eea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.9f596153cee6cp6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6113 0 OK 0x1.5752ap24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.78p6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6113 1 OK 0x1.50d3574b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.9ca69eac31193p6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6113 2 OK 0x1.5dd1e8b4f3be6p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.53596153cee6ep6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6113 3 OK 0x1.528291156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.9ca69eac31195p6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6113 4 OK 0x1.5c22aeea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.53596153cee6cp6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6114 0 OK 0x1.75d72p24 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.2cp6 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6114 1 OK 0x1.6f57d74b0c41ap24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.50a69eac31193p6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6114 2 OK 0x1.7c5668b4f3be6p24 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.07596153cee6ep6 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6114 3 OK 0x1.710711156dc11p24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.50a69eac31194p6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6114 4 OK 0x1.7aa72eea923efp24 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.07596153cee6cp6 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6115 0 OK 0x1.a39dep24 0x1.6b61d91f97293p20 0x0.0p0 0x1.dffffffffffffp4 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6115 1 OK 0x1.9ab11f4a09368p24 0x1.45a6a375bfef6p20 0x0.0p0 -0x1.5f11216411606p3 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6115 2 OK 0x1.ac8aa0b5f6c98p24 0x1.45a6a375bfef6p20 0x0.0p0 0x1.1be2242c822cp6 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6115 3 OK 0x1.a21f7e41b6c51p24 0x1.cf325e1c56149p20 0x0.0p0 -0x1.5f112164116d2p3 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6115 4 OK 0x1.a51c41be493afp24 0x1.cf325e1c56149p20 0x0.0p0 0x1.1be2242c822dap6 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6116 0 OK 0x1.c2226p24 0x1.6b61d91f97293p20 0x0.0p0 0x1.68p6 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6116 1 OK 0x1.b9359f4a09368p24 0x1.45a6a375bfef6p20 0x0.0p0 0x1.883bb7a6fba7fp5 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6116 2 OK 0x1.cb0f20b5f6c98p24 0x1.45a6a375bfef6p20 0x0.0p0 0x1.05f112164116p7 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6116 3 OK 0x1.c0a3fe41b6c51p24 0x1.cf325e1c56149p20 0x0.0p0 0x1.883bb7a6fba4cp5 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6116 4 OK 0x1.c3a0c1be493afp24 0x1.cf325e1c56149p20 0x0.0p0 0x1.05f112164116ep7 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6117 0 OK 0x1.e0a6ep24 0x1.6b61d91f97293p20 0x0.0p0 0x1.2cp7 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6117 1 OK 0x1.d7ba1f4a09368p24 0x1.45a6a375bfef6p20 0x0.0p0 0x1.b41ddbd37dd4p6 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6117 2 OK 0x1.e993a0b5f6c98p24 0x1.45a6a375bfef6p20 0x0.0p0 -0x1.520eede9beeap7 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6117 3 OK 0x1.df287e41b6c51p24 0x1.cf325e1c56149p20 0x0.0p0 0x1.b41ddbd37dd26p6 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6117 4 OK 0x1.e22541be493afp24 0x1.cf325e1c56149p20 0x0.0p0 -0x1.520eede9bee93p7 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6118 0 OK 0x1.48106p24 0x1.6b61d91f97293p20 0x0.0p0 -0x1.2cp7 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6118 1 OK 0x1.3f239f4a09368p24 0x1.45a6a375bfef6p20 0x0.0p0 0x1.520eede9beeap7 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6118 2 OK 0x1.50fd20b5f6c98p24 0x1.45a6a375bfef6p20 0x0.0p0 -0x1.b41ddbd37dd4p6 0x1.47ffffffffff9p6 0x0.0p0 F +REG epsg:6118 3 OK 0x1.4691fe41b6c51p24 0x1.cf325e1c56149p20 0x0.0p0 0x1.520eede9bee93p7 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6118 4 OK 0x1.498ec1be493afp24 0x1.cf325e1c56149p20 0x0.0p0 -0x1.b41ddbd37dd26p6 0x1.62aaaaaaaaaaap6 0x0.0p0 F +REG epsg:6119 0 OK 0x1.b2e02p24 0x1.306132a81bb98p21 0x0.0p0 0x1.0ap7 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6119 1 OK 0x1.ab12b18b8c13cp24 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.b43230159800ap6 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6119 2 OK 0x1.baad8e7473ec4p24 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.39e6e7f533ffbp7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6119 3 OK 0x1.afa4c33133dc1p24 0x1.6342bc2c02eeap21 0x0.0p0 0x1.b432301598003p6 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6119 4 OK 0x1.b61b7ccecc23fp24 0x1.6342bc2c02eeap21 0x0.0p0 0x1.39e6e7f533ffep7 0x1.5555555555555p6 0x0.0p0 F +REG epsg:6120 0 OK 0x1.406f4p23 0x1.306132a81bb98p21 0x0.0p0 0x1.4cp7 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6120 1 OK 0x1.30d4631718278p23 0x1.100c4f4e5e21fp21 0x0.0p0 0x1.1c19180acc005p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6120 2 OK 0x1.500a1ce8e7d88p23 0x1.100c4f4e5e21fp21 0x0.0p0 -0x1.5419180acc005p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6120 3 OK 0x1.39f8866267b83p23 0x1.6342bc2c02eeap21 0x0.0p0 0x1.1c19180acc008p7 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6120 4 OK 0x1.46e5f99d9847dp23 0x1.6342bc2c02eeap21 0x0.0p0 -0x1.5419180acc008p7 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6121 0 OK 0x1.7d784p23 0x1.306132a81bb98p21 0x0.0p0 -0x1.34p7 0x1.47ffffffffff8p6 0x0.0p0 F +REG epsg:6121 1 OK 0x1.6ddd631718278p23 0x1.100c4f4e5e21fp21 0x0.0p0 -0x1.63e6e7f533ffbp7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6121 2 OK 0x1.8d131ce8e7d88p23 0x1.100c4f4e5e21fp21 0x0.0p0 -0x1.0419180acc006p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6121 3 OK 0x1.7701866267b83p23 0x1.6342bc2c02eeap21 0x0.0p0 -0x1.63e6e7f533ff8p7 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6121 4 OK 0x1.83eef99d9847dp23 0x1.6342bc2c02eeap21 0x0.0p0 -0x1.0419180acc009p7 0x1.5555555555556p6 0x0.0p0 F +REG epsg:6122 0 OK 0x1.48106p24 0x1.aab128021428fp21 0x0.0p0 0x1.6p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6122 1 OK 0x1.40d703f9190b8p24 0x1.85b5af04e6bc6p21 0x0.0p0 0x1.3e1368541fa13p7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6122 2 OK 0x1.4f49bc06e6f48p24 0x1.85b5af04e6bc7p21 0x0.0p0 -0x1.4e1368541fa14p7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6122 3 OK 0x1.44176c81d31f1p24 0x1.dcc7d93135d33p21 0x0.0p0 0x1.3e1368541fa14p7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6122 4 OK 0x1.4c09537e2ce0fp24 0x1.dcc7d93135d33p21 0x0.0p0 -0x1.4e1368541fa15p7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6123 0 OK 0x1.6694ep24 0x1.aab128021428fp21 0x0.0p0 -0x1.32p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6123 1 OK 0x1.5f5b83f9190b8p24 0x1.85b5af04e6bc7p21 0x0.0p0 -0x1.53ec97abe05ecp7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6123 2 OK 0x1.6dce3c06e6f48p24 0x1.85b5af04e6bc7p21 0x0.0p0 -0x1.101368541fa14p7 0x1.2d55555555555p6 0x0.0p0 F +REG epsg:6123 3 OK 0x1.629bec81d31f1p24 0x1.dcc7d93135d33p21 0x0.0p0 -0x1.53ec97abe05ebp7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6123 4 OK 0x1.6a8dd37e2ce0fp24 0x1.dcc7d93135d33p21 0x0.0p0 -0x1.101368541fa15p7 0x1.47ffffffffff7p6 0x0.0p0 F +REG epsg:6124 0 OK 0x1.7d784p23 0x1.12725587ec802p22 0x0.0p0 -0x1.36p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6124 1 OK 0x1.6fb4631f5427p23 0x1.fd9f0ac6781efp21 0x0.0p0 -0x1.505484affa519p7 0x1.2p6 0x0.0p0 F +REG epsg:6124 2 OK 0x1.8b3c1ce0abd9p23 0x1.fd9f0ac6781efp21 0x0.0p0 -0x1.1bab7b5005ae8p7 0x1.2p6 0x0.0p0 F +REG epsg:6124 3 OK 0x1.74b669f51300fp23 0x1.2b1e2275511f2p22 0x0.0p0 -0x1.505484affa519p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6124 4 OK 0x1.863a160aecffp23 0x1.2b1e2275511f2p22 0x0.0p0 -0x1.1bab7b5005ae9p7 0x1.3aaaaaaaaaa4ep6 0x0.0p0 F +REG epsg:6125 0 OK 0x1.6a657p25 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.4p2 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6125 1 OK 0x1.671149b0487d9p25 0x1.3b3678e22b381p22 0x0.0p0 -0x1.f92e3ac53f685p3 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6125 2 OK 0x1.6db9964fb7827p25 0x1.3b3678e22b381p22 0x0.0p0 0x1.725c758a7ed0bp2 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6125 3 OK 0x1.68141fd1b40ccp25 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.f92e3ac53f6bep3 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6125 4 OK 0x1.6cb6c02e4bf34p25 0x1.67e5b06d2c6a9p22 0x0.0p0 0x1.725c758a7ed7cp2 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6128 0 OK 0x1.907e83207c8ccp20 -0x1.1bbe2a2da81e4p9 -0x1.505c47988p4 -0x1.4400000572dp6 0x1.46f09a2c768cep-24 0x1.821e64p-7 T +REG epsg:6128 1 OK -0x1.602354806412p17 -0x1.bc89a59c93f72p20 -0x1.2c2dfa0fap5 -0x1.580000060edfdp6 -0x1.3fffffb98967ap2 0x1.8bfc76p-7 F +REG epsg:6128 2 OK 0x1.a685dc180688cp21 -0x1.bc7ed5dc0c016p20 -0x1.38a4d54bp2 -0x1.300000054968p6 -0x1.3fffffb262f23p2 0x1.20193ep-7 F +REG epsg:6128 3 OK -0x1.6074e258d3a6p17 0x1.bc387bbcf2cfap20 -0x1.07d077558p5 -0x1.580000055e286p6 0x1.400000501d3c1p2 0x1.e54838p-7 F +REG epsg:6128 4 OK 0x1.a680ae3d45716p21 0x1.bc42207642aeap20 -0x1.1f192c3p-2 -0x1.30000004c00b6p6 0x1.4000005c8e9f2p2 0x1.85038ep-7 F +REG epsg:6129 0 OK 0x1.906b618b80225p20 -0x1.4dc50fde72bb5p9 0x1.ed11b2c88p4 -0x1.43ffffffd92cep6 -0x1.33e6a96508b2cp-27 0x1.6e86ap-10 T +REG epsg:6129 1 OK -0x1.60eea0f6a7a38p17 -0x1.bc89a1e81d086p20 0x1.86526ca1cp5 -0x1.57ffffffe5f1ap6 -0x1.4000000944b0cp2 0x1.9171ap-10 F +REG epsg:6129 2 OK 0x1.a6790f935e4ddp21 -0x1.bc8bcdc39234fp20 0x1.85ac177c4p5 -0x1.2fffffffd67fap6 -0x1.40000008a383bp2 0x1.a5895p-10 F +REG epsg:6129 3 OK -0x1.60df635a1844p17 0x1.bc38a663bed75p20 0x1.15667ec6cp4 -0x1.57ffffffdf594p6 0x1.3ffffff5d5417p2 0x1.353cep-10 F +REG epsg:6129 4 OK 0x1.a67a93da4cb9bp21 0x1.bc35e80460dfep20 0x1.13dfeb414p4 -0x1.2fffffffcb453p6 0x1.3ffffff650b7cp2 0x1.4e9b4p-10 F +REG epsg:6133 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6133 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6133 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6133 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6133 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6135 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6135 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6135 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6135 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6135 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6141 0 OK 0x1.681b7ffffffffp21 0x1.e01f6bc298da4p20 0x0.0p0 0x1.4244444444444p6 0x1.384444444434ap4 0x0.0p0 F +REG epsg:6141 1 OK 0x1.3b3bfc46cc21fp21 0x1.87bbba2364a85p20 0x0.0p0 0x1.3e05d87bf2564p6 0x1.2844444444343p4 0x0.0p0 F +REG epsg:6141 2 OK 0x1.94fb03b933ddfp21 0x1.87bbba2364a85p20 0x0.0p0 0x1.4682b00c96324p6 0x1.2844444444343p4 0x0.0p0 F +REG epsg:6141 3 OK 0x1.3bc869a9f44b8p21 0x1.1c89717a53c46p21 0x0.0p0 0x1.3e05d87bf2564p6 0x1.484444444434bp4 0x0.0p0 F +REG epsg:6141 4 OK 0x1.946e96560bb46p21 0x1.1c89717a53c46p21 0x0.0p0 0x1.4682b00c96324p6 0x1.484444444434bp4 0x0.0p0 F +REG epsg:6144 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6144 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6144 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6144 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6144 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6145 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6145 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6145 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6145 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6145 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6146 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6146 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6146 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6146 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6146 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6147 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6147 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6147 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6147 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6147 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6148 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6148 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6148 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6148 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6148 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6149 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6149 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6149 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6149 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6149 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6150 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6150 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6150 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6150 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6150 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6151 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6151 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6151 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6151 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6151 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6152 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6152 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6152 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6152 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6152 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6153 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6153 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6153 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6153 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6153 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6154 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6154 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6154 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6154 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6154 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6155 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6155 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6155 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6155 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6155 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6156 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6156 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6156 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6156 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6156 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6157 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6157 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6157 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6157 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6157 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6158 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6158 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6158 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6158 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6158 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6159 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6159 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6159 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6159 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6159 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6160 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6160 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6160 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6160 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6160 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6161 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6161 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6161 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6161 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6161 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6162 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6162 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6162 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6162 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6162 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6163 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6163 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6163 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6163 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6163 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6164 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6164 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6164 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6164 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6164 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6165 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6165 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6165 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6165 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6165 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6166 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6166 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6166 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6166 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6166 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6167 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6167 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6167 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6167 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6167 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6168 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6168 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6168 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6168 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6168 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6169 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6169 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6169 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6169 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6169 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6170 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6170 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6170 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6170 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6170 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6171 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6171 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6171 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6171 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6171 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6172 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6172 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6172 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6172 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6172 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6173 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6173 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6173 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6173 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6173 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6174 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6174 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6174 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6174 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6174 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6175 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6175 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6175 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6175 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6175 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6176 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6176 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6176 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6176 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6176 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6190 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6190 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6190 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6190 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6190 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6204 0 OK 0x1.e8b47793fec78p18 -0x1.dff04ce2d3c16p8 0x1.5fd97dffep7 0x1.5p4 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:6204 1 OK -0x1.ab38483a50ap15 -0x1.0f323ee98bc0bp19 0x1.6fbabe71e8p7 0x1.0000000074334p4 -0x1.3fffffffeb116p2 -0x1.8p-27 F +REG epsg:6204 2 OK 0x1.01b3fe4c68732p20 -0x1.0f323eec518aep19 0x1.03388efa6cp8 0x1.9fffffff8ab68p4 -0x1.3fffffffead7cp2 0x1.0p-26 F +REG epsg:6204 3 OK -0x1.ab46e9654fd3p15 0x1.0eba43dbeff46p19 0x1.90c19b942p6 0x1.00000000743e5p4 0x1.3fffffffeb19fp2 -0x1.cp-27 F +REG epsg:6204 4 OK 0x1.01b4738463933p20 0x1.0eba43deb35acp19 0x1.5f17afc088p7 0x1.9fffffff8aab8p4 0x1.3fffffffeae08p2 0x1.ep-27 F +REG epsg:6207 0 OK -0x1.ab8948ff71e1p-8 -0x1.22d71d4ae0c19p-9 0x1.1bc3fad68ap9 0x1.2d6cb2018702p-60 0x1.c72f1eacb7b06p-61 -0x1.0p-29 T +REG epsg:6207 1 OK -0x1.406ea7c5225adp2 -0x1.4022746e95c15p2 0x1.4666d675e8p9 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6207 2 OK 0x1.3f98e489c8f83p2 -0x1.4024171207e3fp2 0x1.07595ecaecp9 0x1.4p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:6207 3 OK -0x1.406ea7c5225adp2 0x1.3fda071211feep2 0x1.310483b6e2p9 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6207 4 OK 0x1.3f98e489c8f83p2 0x1.3fdba957c7ecep2 0x1.e3ede04e9cp8 0x1.4p2 0x1.4p2 0x1.0p-29 F +REG epsg:6210 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68p5 0x0.0p0 0x0.0p0 T +REG epsg:6210 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p5 -0x1.4p2 0x0.0p0 F +REG epsg:6210 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:6210 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p5 0x1.4p2 0x0.0p0 F +REG epsg:6210 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:6211 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 -0x1.38p5 0x0.0p0 0x0.0p0 T +REG epsg:6211 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p5 -0x1.4p2 0x0.0p0 F +REG epsg:6211 2 OK 0x1.018fa874f57f6p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p5 -0x1.4p2 0x0.0p0 F +REG epsg:6211 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p5 0x1.4p2 0x0.0p0 F +REG epsg:6211 4 OK 0x1.018fa874f57f6p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p5 0x1.4p2 0x0.0p0 F +REG epsg:6307 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG epsg:6307 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:6307 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:6307 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:6307 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:6309 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6309 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6309 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6309 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6309 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6311 0 OK 0x1.b3233dbe59b09p-19 -0x1.029dd62c587ebp-15 -0x1.bb1234038p3 -0x1.07439c51a2a5ap-41 0x1.d7e14d4bbe023p-42 0x1.833p-18 T +REG epsg:6311 1 OK -0x1.4000109e928afp2 -0x1.40009f8d457a9p2 -0x1.c82b8d418p3 -0x1.40000000000cep2 -0x1.3ffffffffff23p2 0x1.834p-18 F +REG epsg:6311 2 OK 0x1.40002c4903099p2 -0x1.40009c890d019p2 -0x1.afc107d48p3 0x1.3ffffffffe926p2 -0x1.3ffffffffeba6p2 0x1.7c4p-18 F +REG epsg:6311 3 OK -0x1.40000e82ee9cep2 0x1.3fff9d7696b07p2 -0x1.c2146d0cp3 -0x1.3ffffffffed2cp2 0x1.3ffffffffef32p2 0x1.7e5p-18 F +REG epsg:6311 4 OK 0x1.4000293895e4p2 0x1.3fff9b6a72531p2 -0x1.a9a9c8558p3 0x1.3fffffffffcbap2 0x1.40000000002d5p2 0x1.82fp-18 F +REG epsg:6312 0 OK 0x1.86a23c1e3e94bp17 -0x1.ab3f151a784dcp21 -0x1.40d298318p3 0x1.07ffffffff8a3p5 0x1.fce3d4ed148afp-37 0x1.3fcp-18 T +REG epsg:6312 1 OK -0x1.5ad6266376d1ap18 -0x1.eefe0386b30ap21 -0x1.5a46e15c8p3 0x1.c000000074452p4 -0x1.3fffffffe7183p2 0x1.3f9p-18 F +REG epsg:6312 2 OK 0x1.70bc3f63ba236p19 -0x1.eefdff8556aecp21 -0x1.2b0940398p3 0x1.2fffffffc4d34p5 -0x1.3fffffffe6301p2 0x1.185p-18 F +REG epsg:6312 3 OK -0x1.5ad6418f1efbp18 -0x1.67802a31cb9d4p21 -0x1.542a7a628p3 0x1.c0000000748a4p4 0x1.3fffffffede14p2 0x1.5fdp-18 F +REG epsg:6312 4 OK 0x1.70bc30bbda1e2p19 -0x1.6780272c55b3ap21 -0x1.24e8a6628p3 0x1.2fffffffc4f2p5 0x1.3fffffffef013p2 0x1.422p-18 F +REG epsg:6316 0 OK 0x1.c9ca47793fec8p22 -0x1.dff04ce2d3c16p8 0x1.5fd97dffep7 0x1.5000000000001p4 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:6316 1 OK 0x1.a7e88f6f8b5ecp22 -0x1.0f323ee98bc0bp19 0x1.6fbabe71e8p7 0x1.0000000074334p4 -0x1.3fffffffeb116p2 -0x1.8p-27 F +REG epsg:6316 2 OK 0x1.ebabff931a1ccp22 -0x1.0f323eec518aep19 0x1.03388efa6cp8 0x1.9fffffff8ab67p4 -0x1.3fffffffead7dp2 0x1.ep-27 F +REG epsg:6316 3 OK 0x1.a7e8722d35606p22 0x1.0eba43dbeff46p19 0x1.90c19b942p6 0x1.00000000743e6p4 0x1.3fffffffeb19fp2 -0x1.cp-27 F +REG epsg:6316 4 OK 0x1.ebac1ce118e4dp22 0x1.0eba43deb35acp19 0x1.5f17afc088p7 0x1.9fffffff8aab8p4 0x1.3fffffffeae08p2 0x1.ep-27 F +REG epsg:6317 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6317 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6317 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6317 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6317 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6318 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6318 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6318 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6318 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6318 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6320 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6320 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6320 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6320 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6320 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6322 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6322 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6322 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6322 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6322 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6323 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6323 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6323 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6323 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6323 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6325 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6325 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6325 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6325 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6325 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6328 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:6328 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6328 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p7 -0x1.4p2 0x0.0p0 F +REG epsg:6328 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4cp7 0x1.4p2 0x0.0p0 F +REG epsg:6328 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p7 0x1.4p2 0x0.0p0 F +REG epsg:6329 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:6329 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.58p7 -0x1.4p2 0x0.0p0 F +REG epsg:6329 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6400000000001p7 -0x1.4p2 0x0.0p0 F +REG epsg:6329 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.58p7 0x1.4p2 0x0.0p0 F +REG epsg:6329 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6400000000001p7 0x1.4p2 0x0.0p0 F +REG epsg:6330 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG epsg:6330 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.64p7 -0x1.4p2 0x0.0p0 F +REG epsg:6330 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p7 -0x1.4p2 0x0.0p0 F +REG epsg:6330 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.64p7 0x1.4p2 0x0.0p0 F +REG epsg:6330 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p7 0x1.4p2 0x0.0p0 F +REG epsg:6331 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG epsg:6331 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p7 -0x1.4p2 0x0.0p0 F +REG epsg:6331 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6331 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p7 0x1.4p2 0x0.0p0 F +REG epsg:6331 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4cp7 0x1.4p2 0x0.0p0 F +REG epsg:6332 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG epsg:6332 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.54p7 -0x1.4p2 0x0.0p0 F +REG epsg:6332 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p7 -0x1.4p2 0x0.0p0 F +REG epsg:6332 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.54p7 0x1.4p2 0x0.0p0 F +REG epsg:6332 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p7 0x1.4p2 0x0.0p0 F +REG epsg:6333 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:6333 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 -0x1.4p2 0x0.0p0 F +REG epsg:6333 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 -0x1.4p2 0x0.0p0 F +REG epsg:6333 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 0x1.4p2 0x0.0p0 F +REG epsg:6333 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 0x1.4p2 0x0.0p0 F +REG epsg:6334 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:6334 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6334 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 -0x1.4p2 0x0.0p0 F +REG epsg:6334 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 0x1.4p2 0x0.0p0 F +REG epsg:6334 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 0x1.4p2 0x0.0p0 F +REG epsg:6335 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:6335 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p7 -0x1.4p2 0x0.0p0 F +REG epsg:6335 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6335 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p7 0x1.4p2 0x0.0p0 F +REG epsg:6335 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1cp7 0x1.4p2 0x0.0p0 F +REG epsg:6336 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:6336 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.24p7 -0x1.4p2 0x0.0p0 F +REG epsg:6336 2 OK 0x1.018fa874f57eep20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:6336 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.24p7 0x1.4p2 0x0.0p0 F +REG epsg:6336 4 OK 0x1.018fa874f57eep20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:6337 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:6337 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p7 -0x1.4p2 0x0.0p0 F +REG epsg:6337 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.04p7 -0x1.4p2 0x0.0p0 F +REG epsg:6337 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p7 0x1.4p2 0x0.0p0 F +REG epsg:6337 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.04p7 0x1.4p2 0x0.0p0 F +REG epsg:6338 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:6338 1 OK -0x1.ad750e9eb00cp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6338 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:6338 3 OK -0x1.ad750e9eb00cp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0cp7 0x1.4p2 0x0.0p0 F +REG epsg:6338 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:6339 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:6339 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:6339 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:6339 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p7 0x1.4p2 0x0.0p0 F +REG epsg:6339 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:6340 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:6340 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:6340 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:6340 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:6340 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:6341 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:6341 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:6341 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:6341 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:6341 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:6342 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:6342 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:6342 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:6342 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:6342 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:6343 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:6343 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:6343 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:6343 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:6343 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:6344 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:6344 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:6344 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:6344 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:6344 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:6345 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:6345 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:6345 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:6345 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:6345 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:6346 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG epsg:6346 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG epsg:6346 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG epsg:6346 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG epsg:6346 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG epsg:6347 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG epsg:6347 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG epsg:6347 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG epsg:6347 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG epsg:6347 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG epsg:6348 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG epsg:6348 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG epsg:6348 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG epsg:6348 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG epsg:6348 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG epsg:6349 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6349 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6349 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6349 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6349 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6350 0 OK 0x0.0p0 0x1.2f72863472da6p20 0x0.0p0 -0x1.8000000000001p6 0x1.11ffffffffffep5 0x0.0p0 F +REG epsg:6350 1 OK -0x1.ded0fcaa50ee2p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.3400000000006p4 0x0.0p0 F +REG epsg:6350 2 OK 0x1.ded0fcaa50ee8p20 -0x1.a73b81b0d5e48p17 0x0.0p0 -0x1.3769a036a9724p6 0x1.3400000000001p4 0x0.0p0 F +REG epsg:6350 3 OK -0x1.44f877fc565f9p20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.c8965fc9568dcp6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:6350 4 OK 0x1.44f877fc565fdp20 0x1.737a24f0c83fep21 0x0.0p0 -0x1.3769a036a9724p6 0x1.89fffffffffffp5 0x0.0p0 F +REG epsg:6351 0 OK 0x1.c2226p24 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.46p7 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6351 1 OK 0x1.bb7a136090fb2p24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.5b92e3ac53f68p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6351 2 OK 0x1.c8caac9f6f04fp24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.306d1c53ac095p7 0x1.12aaaaaaaaaa3p6 0x0.0p0 F +REG epsg:6351 3 OK 0x1.bd7fbfa368198p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.5b92e3ac53f6cp7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6351 4 OK 0x1.c6c5005c97e68p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.306d1c53ac095p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6352 0 OK 0x1.e0a6ep24 0x1.4f85e9fb071a8p22 0x0.0p0 -0x1.26p7 0x1.1fffffffffffep6 0x0.0p0 F +REG epsg:6352 1 OK 0x1.d9fe936090fb1p24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.3b92e3ac53f6bp7 0x1.12aaaaaaaaaa3p6 0x0.0p0 F +REG epsg:6352 2 OK 0x1.e74f2c9f6f04ep24 0x1.3b3678e22b381p22 0x0.0p0 -0x1.106d1c53ac098p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6352 3 OK 0x1.dc043fa368198p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.3b92e3ac53f6bp7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6352 4 OK 0x1.e549805c97e68p24 0x1.67e5b06d2c6a9p22 0x0.0p0 -0x1.106d1c53ac094p7 0x1.2d55555555556p6 0x0.0p0 F +REG epsg:6353 0 OK 0x1.ba814p23 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.4ap7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6353 1 OK 0x1.ad82ae9618833p23 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.5c534f56188cbp7 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6353 2 OK 0x1.c77fd169e77ccp23 0x1.77d5966dcbe78p22 0x0.0p0 -0x1.37acb0a9e7736p7 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6353 3 OK 0x1.b0e1222adb822p23 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.5c534f56188cap7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6353 4 OK 0x1.c4215dd5247ddp23 0x1.a4b9a8168a6d3p22 0x0.0p0 -0x1.37acb0a9e7737p7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6354 0 OK 0x1.f78a4p23 0x1.8c963f6ddc2f4p22 0x0.0p0 -0x1.26p7 0x1.12aaaaaaaaaa4p6 0x0.0p0 F +REG epsg:6354 1 OK 0x1.ea8bae9618833p23 0x1.77d5966dcbe79p22 0x0.0p0 -0x1.38534f56188cbp7 0x1.0555555555542p6 0x0.0p0 F +REG epsg:6354 2 OK 0x1.024468b4f3be6p24 0x1.77d5966dcbe78p22 0x0.0p0 -0x1.13acb0a9e7736p7 0x1.0555555555541p6 0x0.0p0 F +REG epsg:6354 3 OK 0x1.edea222adb822p23 0x1.a4b9a8168a6d4p22 0x0.0p0 -0x1.38534f56188cap7 0x1.1fffffffffffdp6 0x0.0p0 F +REG epsg:6354 4 OK 0x1.00952eea923efp24 0x1.a4b9a8168a6d3p22 0x0.0p0 -0x1.13acb0a9e7736p7 0x1.1fffffffffffcp6 0x0.0p0 F +REG epsg:6355 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG epsg:6355 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG epsg:6355 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG epsg:6355 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:6355 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG epsg:6356 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6356 1 OK 0x1.02d19c77044p14 -0x1.087061b7c104ap19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:6356 2 OK 0x1.20ecb98e23efp20 -0x1.087061b7c104ap19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:6356 3 OK 0x1.1be3a4fd1d818p16 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6356 4 OK 0x1.1339c5b02e27ep20 0x1.162e01f1dd34bp19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6362 0 OK 0x1.312dp21 0x1.da4d35f8b09dp19 0x0.0p0 -0x1.98p6 0x1.4bfffffffff0bp4 0x0.0p0 F +REG epsg:6362 1 OK 0x1.3e94b78905972p19 -0x1.283483f59e2f1p19 0x0.0p0 -0x1.d8296ea5be4bap6 0x1.6fffffffffddep2 0x0.0p0 F +REG epsg:6362 2 OK 0x1.095a690edf4d2p22 -0x1.283483f59e2f1p19 0x0.0p0 -0x1.57d6915a41b47p6 0x1.6fffffffffddep2 0x0.0p0 F +REG epsg:6362 3 OK 0x1.f4e50b3816776p19 0x1.4bc51f8808e58p21 0x0.0p0 -0x1.d8296ea5be4bap6 0x1.1dfffffffffd6p5 0x0.0p0 F +REG epsg:6362 4 OK 0x1.e520bd31fa622p21 0x1.4bc51f8808e58p21 0x0.0p0 -0x1.57d6915a41b47p6 0x1.1dfffffffffd6p5 0x0.0p0 F +REG epsg:6363 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6363 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6363 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6363 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6363 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6365 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6365 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6365 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6365 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6365 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6366 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG epsg:6366 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG epsg:6366 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG epsg:6366 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG epsg:6366 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG epsg:6367 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG epsg:6367 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:6367 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG epsg:6367 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:6367 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG epsg:6368 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:6368 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG epsg:6368 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG epsg:6368 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG epsg:6368 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG epsg:6369 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG epsg:6369 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 -0x1.4p2 0x0.0p0 F +REG epsg:6369 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 -0x1.4p2 0x0.0p0 F +REG epsg:6369 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap6 0x1.4p2 0x0.0p0 F +REG epsg:6369 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.78p6 0x1.4p2 0x0.0p0 F +REG epsg:6370 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG epsg:6370 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 -0x1.4p2 0x0.0p0 F +REG epsg:6370 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG epsg:6370 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.88p6 0x1.4p2 0x0.0p0 F +REG epsg:6370 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG epsg:6371 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG epsg:6371 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG epsg:6371 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 -0x1.4p2 0x0.0p0 F +REG epsg:6371 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG epsg:6371 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p6 0x1.4p2 0x0.0p0 F +REG epsg:6372 0 OK 0x1.312dp21 0x1.da4d35f8b09dp19 0x0.0p0 -0x1.98p6 0x1.4bfffffffff0bp4 0x0.0p0 F +REG epsg:6372 1 OK 0x1.3e94b78905972p19 -0x1.283483f59e2f1p19 0x0.0p0 -0x1.d8296ea5be4bap6 0x1.6fffffffffddep2 0x0.0p0 F +REG epsg:6372 2 OK 0x1.095a690edf4d2p22 -0x1.283483f59e2f1p19 0x0.0p0 -0x1.57d6915a41b47p6 0x1.6fffffffffddep2 0x0.0p0 F +REG epsg:6372 3 OK 0x1.f4e50b3816776p19 0x1.4bc51f8808e58p21 0x0.0p0 -0x1.d8296ea5be4bap6 0x1.1dfffffffffd6p5 0x0.0p0 F +REG epsg:6372 4 OK 0x1.e520bd31fa622p21 0x1.4bc51f8808e58p21 0x0.0p0 -0x1.57d6915a41b47p6 0x1.1dfffffffffd6p5 0x0.0p0 F +REG epsg:6381 0 OK 0x1.2515758ea3d7p18 0x1.626b7e90a9e89p6 -0x1.433aeceabp6 0x1.4ffffffffc353p4 -0x1.133dd6fedfcffp-33 0x1.97bep-14 T +REG epsg:6381 1 OK -0x1.f2355f1bc304cp17 -0x1.0ef4e53f1d1c7p19 -0x1.905b5bfbap6 0x1.0000000074119p4 -0x1.3ffffffff3ba2p2 0x1.a0f4p-14 F +REG epsg:6381 2 OK 0x1.a1a2b7ed3ce22p19 -0x1.0ef4efb266c7bp19 -0x1.2eb33433bp6 0x1.9fffffff88054p4 -0x1.400000000383p2 0x1.9cadp-14 F +REG epsg:6381 3 OK -0x1.f2346f26731cp17 0x1.0f0b215aa9cc2p19 -0x1.59932b2e6p6 0x1.000000007013ap4 0x1.3fffffffbf997p2 0x1.9182p-14 F +REG epsg:6381 4 OK 0x1.a1a2a73b34a1ap19 0x1.0f0b00b268b6ap19 -0x1.efd7bf0e6p5 0x1.9fffffff844dcp4 0x1.3fffffffb09cdp2 0x1.8418p-14 F +REG epsg:6382 0 OK 0x1.25150e23f34adp18 0x1.618d5996f637fp6 -0x1.25f266c48p6 0x1.7ffffffffbc9ep4 -0x1.38639916f459bp-33 0x1.94e7p-14 T +REG epsg:6382 1 OK -0x1.f235e26ef33b8p17 -0x1.0ef4d6291e56p19 -0x1.72bc019c2p6 0x1.30000000738d2p4 -0x1.3ffffffff890ep2 0x1.a01p-14 F +REG epsg:6382 2 OK 0x1.a1a26e6a7069bp19 -0x1.0ef4e38510c24p19 -0x1.12331f8b3p6 0x1.cfffffff87a22p4 -0x1.400000000812bp2 0x1.9ab1p-14 F +REG epsg:6382 3 OK -0x1.f234e6c97df58p17 0x1.0f0b074b08191p19 -0x1.3bf40902ep6 0x1.300000006f9ffp4 0x1.3fffffffbaff6p2 0x1.8dccp-14 F +REG epsg:6382 4 OK 0x1.a1a260a4e03cdp19 0x1.0f0ae3ba1d49ep19 -0x1.b6d83d6bap5 0x1.cfffffff84041p4 0x1.3fffffffac646p2 0x1.7f82p-14 F +REG epsg:6383 0 OK 0x1.25148e5821b32p18 0x1.609374fc3d4fp6 -0x1.090abfa03p6 0x1.affffffffb6a5p4 -0x1.5cae2b1927726p-33 0x1.91c4p-14 T +REG epsg:6383 1 OK -0x1.f236976f609a4p17 -0x1.0ef4c83dc2dbap19 -0x1.555ae7a51p6 0x1.6000000073115p4 -0x1.3ffffffffd569p2 0x1.9ed1p-14 F +REG epsg:6383 2 OK 0x1.a1a21902e6f4p19 -0x1.0ef4d871330a9p19 -0x1.ec6a0f022p5 0x1.ffffffff874b2p4 -0x1.400000000c85p2 0x1.9875p-14 F +REG epsg:6383 3 OK -0x1.f235905ed3108p17 0x1.0f0aec98e54cap19 -0x1.1e932fc27p6 0x1.600000006f378p4 0x1.3fffffffb67f4p2 0x1.89dp-14 F +REG epsg:6383 4 OK 0x1.a1a20e1896e87p19 0x1.0f0ac6307a72dp19 -0x1.7edcc4aeap5 0x1.ffffffff83c97p4 0x1.3fffffffa84f5p2 0x1.7ac4p-14 F +REG epsg:6384 0 OK 0x1.2513f684e001ep18 0x1.5f7e801e0278p6 -0x1.d9307f248p5 0x1.dffffffffb178p4 -0x1.80041611b749ap-33 0x1.8e63p-14 T +REG epsg:6384 1 OK -0x1.f2377d9dff47p17 -0x1.0ef4bb86ceb26p19 -0x1.384cab6b4p6 0x1.90000000729f3p4 -0x1.4000000002074p2 0x1.9d38p-14 F +REG epsg:6384 2 OK 0x1.a1a1b7f28ff0ap19 -0x1.0ef4ce7e9334dp19 -0x1.b59920836p5 0x1.17ffffffc380bp5 -0x1.4000000010d6bp2 0x1.9601p-14 F +REG epsg:6384 3 OK -0x1.f2366b6f69888p17 0x1.0f0ad156fcd07p19 -0x1.01853c93fp6 0x1.900000006edb8p4 0x1.3fffffffb21bep2 0x1.858bp-14 F +REG epsg:6384 4 OK 0x1.a1a1afd046feep19 0x1.0f0aa82a3a0cbp19 -0x1.480c9cb04p5 0x1.17ffffffc1cf1p5 0x1.3fffffffa45f9p2 0x1.75dap-14 F +REG epsg:6385 0 OK 0x1.25134714bb299p18 0x1.5e4f3d56af14bp6 -0x1.a15db8ef4p5 0x1.07fffffffd694p5 -0x1.a24c8ea2251f4p-33 0x1.8accp-14 T +REG epsg:6385 1 OK -0x1.f238945941afcp17 -0x1.0ef4b00d2d77p19 -0x1.1ba5b017fp6 0x1.c00000007238p4 -0x1.40000000069f8p2 0x1.9b5bp-14 F +REG epsg:6385 2 OK 0x1.a1a14b7d88f85p19 -0x1.0ef4c5b42bep19 -0x1.8019e9f14p5 0x1.2fffffffc362dp5 -0x1.4000000015046p2 0x1.9359p-14 F +REG epsg:6385 3 OK -0x1.f237776180ae8p17 0x1.0f0ab5986ee63p19 -0x1.c9bd24dcep5 0x1.c00000006e8d4p4 0x1.3fffffffadd83p2 0x1.8108p-14 F +REG epsg:6385 4 OK 0x1.a1a1460e1a831p19 0x1.0f0a89bc6d5ap19 -0x1.128e3b3bap5 0x1.2fffffffc1c1cp5 0x1.3fffffffa0984p2 0x1.70d7p-14 F +REG epsg:6386 0 OK 0x1.25128082d14adp18 0x1.5d06817525848p6 -0x1.6ac457e6ep5 0x1.1ffffffffd4e2p5 -0x1.c36f8686aaebfp-33 0x1.8708p-14 T +REG epsg:6386 1 OK -0x1.f239dadd8a004p17 -0x1.0ef4a5d8ec1c3p19 -0x1.fef420bep5 0x1.f000000071ddp4 -0x1.400000000b1b7p2 0x1.9933p-14 F +REG epsg:6386 2 OK 0x1.a1a0d3efedff8p19 -0x1.0ef4be1827d03p19 -0x1.4c11f4a3p5 0x1.47ffffffc34c2p5 -0x1.40000000190a7p2 0x1.908fp-14 F +REG epsg:6386 3 OK -0x1.f238b3790bfdp17 0x1.0f0a9970b33c6p19 -0x1.91669797cp5 0x1.f00000006e4dap4 0x1.3fffffffa9b6ep2 0x1.7c55p-14 F +REG epsg:6386 4 OK 0x1.a1a0d11c48ae5p19 0x1.0f0a6afc6e3a7p19 -0x1.bd0e5226p4 0x1.47ffffffc1bcap5 0x1.3fffffff9cfabp2 0x1.6bc9p-14 F +REG epsg:6387 0 OK 0x1.2511a35a7b3e6p18 0x1.5ba5332762931p6 -0x1.358aab64cp5 0x1.37fffffffd3a7p5 -0x1.e355bd75bd311p-33 0x1.8321p-14 T +REG epsg:6387 1 OK -0x1.f23b5045b3818p17 -0x1.0ef49cf13345ep19 -0x1.c7bb20cp5 0x1.1000000038c79p5 -0x1.400000000f783p2 0x1.96dp-14 F +REG epsg:6387 2 OK 0x1.a1a0519da3e62p19 -0x1.0ef4b7afdd9c8p19 -0x1.19a5c29d2p5 0x1.5fffffffc33c8p5 -0x1.400000001ce5fp2 0x1.8da7p-14 F +REG epsg:6387 3 OK -0x1.f23a1ed83737cp17 0x1.0f0a7cf38b454p19 -0x1.5a2e591b6p5 0x1.10000000370eap5 0x1.3fffffffa5ba2p2 0x1.7777p-14 F +REG epsg:6387 4 OK 0x1.a1a0514ce1d7p19 0x1.0f0a4bffd031ap19 -0x1.5837cf35cp4 0x1.5fffffffc1bfep5 0x1.3fffffff9989bp2 0x1.66b2p-14 F +REG epsg:6391 0 OK 0x1.681b7ffffffffp21 0x1.e01f6bc298da4p20 0x0.0p0 -0x1.4244444444444p6 0x1.384444444434ap4 0x0.0p0 F +REG epsg:6391 1 OK 0x1.3b3bfc46cc21fp21 0x1.87bbba2364a85p20 0x0.0p0 -0x1.4682b00c96324p6 0x1.2844444444343p4 0x0.0p0 F +REG epsg:6391 2 OK 0x1.94fb03b933ddfp21 0x1.87bbba2364a85p20 0x0.0p0 -0x1.3e05d87bf2564p6 0x1.2844444444343p4 0x0.0p0 F +REG epsg:6391 3 OK 0x1.3bc869a9f44b8p21 0x1.1c89717a53c46p21 0x0.0p0 -0x1.4682b00c96324p6 0x1.484444444434bp4 0x0.0p0 F +REG epsg:6391 4 OK 0x1.946e96560bb46p21 0x1.1c89717a53c46p21 0x0.0p0 -0x1.3e05d87bf2564p6 0x1.484444444434bp4 0x0.0p0 F +REG epsg:6393 0 OK 0x0.0p0 0x1.96adf1aec1aa1p19 0x0.0p0 -0x1.34p7 0x1.cbffffffffffep5 0x0.0p0 F +REG epsg:6393 1 OK -0x1.18171f0f3270bp21 -0x1.4125960900542p18 0x0.0p0 0x1.642a4c850f0f2p7 0x1.54p5 0x0.0p0 F +REG epsg:6393 2 OK 0x1.18171f0f32714p21 -0x1.412596090051dp18 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.54p5 0x0.0p0 F +REG epsg:6393 3 OK -0x1.cbba8109d854ep19 0x1.49526b059ff17p21 0x0.0p0 0x1.642a4c850f0f2p7 0x1.22p6 0x0.0p0 F +REG epsg:6393 4 OK 0x1.cbba8109d855bp19 0x1.49526b059ff18p21 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.22p6 0x0.0p0 F +REG epsg:6394 0 OK 0x1.8fbe978036a34p19 0x1.18cf360b43f08p19 0x0.0p0 -0x1.0b55555555557p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG epsg:6394 1 OK 0x1.6e66e9057dp17 0x1.ca9154cf8ep15 0x0.0p0 -0x1.1db1b1b64ab15p7 0x1.9fffffffffbaap5 0x0.0p0 F +REG epsg:6394 2 OK 0x1.617cb717a7deep20 0x1.d252ddb583bp15 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:6394 3 OK 0x1.4aba437879f4p18 0x1.1c6f1a198f6f4p20 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.effffffffff93p5 0x0.0p0 F +REG epsg:6394 4 OK 0x1.3d41bfcebc39cp20 0x1.1ccf3b7cbc02cp20 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.effffffffff94p5 0x0.0p0 F +REG epsg:6395 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG epsg:6395 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.2d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6395 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.0afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6395 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.2d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6395 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.0afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6396 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG epsg:6396 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.35035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6396 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.12fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6396 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.35035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6396 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.12fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6397 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG epsg:6397 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.3d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6397 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.1afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6397 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.3d035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6397 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.1afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6398 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG epsg:6398 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.45035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6398 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.22fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6398 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.45035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6398 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.22fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6399 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG epsg:6399 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.4d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6399 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.2afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6399 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.4d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6399 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.2afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6400 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG epsg:6400 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.55035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6400 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.32fcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6400 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.55035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6400 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.32fcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6401 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG epsg:6401 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.5d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6401 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.3afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6401 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.5d035501f888p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6401 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.3afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6402 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG epsg:6402 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.65035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG epsg:6402 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.42fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG epsg:6402 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.65035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG epsg:6402 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.42fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG epsg:6403 0 OK 0x1.e848p19 0x1.33df8afe9429fp17 0x0.0p0 -0x1.6p7 0x1.a355555555154p5 0x0.0p0 F +REG epsg:6403 1 OK 0x1.4422779e37856p19 -0x1.1ed11dc93382bp17 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG epsg:6403 2 OK 0x1.4636c430e43d5p20 -0x1.1ed11dc93382bp17 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG epsg:6403 3 OK 0x1.580525cdf719ep19 0x1.d741d626e2c06p18 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG epsg:6403 4 OK 0x1.3c456d1904731p20 0x1.d741d626e2c06p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG epsg:6404 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:6404 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6404 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6404 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:6404 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6405 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:6405 1 OK -0x1.2955adc19bf6cp20 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6405 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6405 3 OK -0x1.f51cd4f10d26dp19 0x1.c8caf79f992b5p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:6405 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6406 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:6406 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6406 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6406 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6406 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6407 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG epsg:6407 1 OK -0x1.2955adc19bf4ap20 -0x1.b1576a448ef9fp20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6407 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6407 3 OK -0x1.f51cd4f10d22bp19 0x1.c8caf79f992b3p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6407 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6408 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:6408 1 OK -0x1.6a878bb7ed38p18 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6408 2 OK 0x1.859fc5dbf69cp19 -0x1.082c7bc41567fp19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6408 3 OK -0x1.317ed19066ebep18 0x1.16785ef123969p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:6408 4 OK 0x1.691b68c83375fp19 0x1.16785ef123969p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:6409 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG epsg:6409 1 OK -0x1.2959acb81e492p20 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6409 2 OK 0x1.3f92d65c0f249p21 -0x1.b15b1d007bcebp20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6409 3 OK -0x1.f5240678a3757p19 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6409 4 OK 0x1.282f019e28dd5p21 0x1.c8cedd97a9eadp20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6410 0 OK 0x1.86ap18 0x1.9bb240973abadp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:6410 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b129p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:6410 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b129p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:6410 3 OK 0x1.797b25aa020dcp17 0x1.3735788b95813p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:6410 4 OK 0x1.284136957f7c9p19 0x1.3735788b95813p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:6411 0 OK 0x1.4064d5553261cp20 0x1.51ad3e78a054ep18 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG epsg:6411 1 OK 0x1.25a5b3020ca3dp19 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:6411 2 OK 0x1.edf6d1295e71ap20 -0x1.4989df995e5dbp18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG epsg:6411 3 OK 0x1.359cf3f53fba3p19 0x1.fe8320bb299fep19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:6411 4 OK 0x1.e5fb30afc4e66p20 0x1.fe8320bb299fep19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG epsg:6412 0 OK 0x1.86ap18 0x1.f85a78d71c1e8p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:6412 1 OK 0x1.390d3a7ad5114p17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:6412 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:6412 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:6412 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:6413 0 OK 0x1.4064d5553261cp20 0x1.9dacc412dbbd3p20 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG epsg:6413 1 OK 0x1.00c480df08f65p19 0x1.cae97f93705a1p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:6413 2 OK 0x1.0033b51d70243p21 0x1.cae97f93705a1p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG epsg:6413 3 OK 0x1.132c692442758p19 0x1.2d456552182ddp21 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:6413 4 OK 0x1.f73376184388cp20 0x1.2d456552182ddp21 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG epsg:6414 0 OK 0x0.0p0 -0x1.dbb469232363dp20 0x0.0p0 -0x1.dffffffffffffp6 0x1.4400000000002p4 0x0.0p0 F +REG epsg:6414 1 OK -0x1.e3bcdf3fff717p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:6414 2 OK 0x1.e3bcdf3fff711p20 -0x1.95e746174ab2p21 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.4fffffffffffep2 0x0.0p0 F +REG epsg:6414 3 OK -0x1.613869004e067p20 -0x1.699d483196edp17 0x0.0p0 -0x1.0ff9f6a5b5901p7 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:6414 4 OK 0x1.613869004e063p20 -0x1.699d483196edp17 0x0.0p0 -0x1.a00c12b494dfdp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:6415 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:6415 1 OK 0x1.a694a7721358p20 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:6415 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:6415 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:6415 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:6416 0 OK 0x1.907e0aab020c9p22 0x1.f84139ea5bec8p20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG epsg:6416 1 OK 0x1.5a9aac8aa75adp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG epsg:6416 2 OK 0x1.c66168cb5cbddp22 0x1.2c788dbb43823p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG epsg:6416 3 OK 0x1.5e3cf1995b983p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:6416 4 OK 0x1.c2bf23bca8808p22 0x1.65af469fe062bp21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG epsg:6417 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:6417 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:6417 2 OK 0x1.12833bad34ff3p21 0x1.7686899058616p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:6417 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6c2p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:6417 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:6418 0 OK 0x1.907e0aab020c9p22 0x1.f0d0c4b71a618p20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG epsg:6418 1 OK 0x1.5eab6b70b08cdp22 0x1.33306016f5618p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG epsg:6418 2 OK 0x1.c250a9e5538bdp22 0x1.33306016f5604p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG epsg:6418 3 OK 0x1.619d4b79c2d2p22 0x1.5a314358c1612p21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG epsg:6418 4 OK 0x1.bf5ec9dc4146bp22 0x1.5a314358c1608p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG epsg:6419 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:6419 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:6419 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:6419 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:6419 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:6420 0 OK 0x1.907e0aab020c9p22 0x1.e66c4c0a100b3p20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG epsg:6420 1 OK 0x1.643b4190e173ep22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:6420 2 OK 0x1.bcc0d3c522a5cp22 0x1.3cd93a733756bp20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG epsg:6420 3 OK 0x1.6677dd7c37cccp22 0x1.4a4240453b028p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:6420 4 OK 0x1.ba8437d9cc4cep22 0x1.4a4240453b028p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG epsg:6421 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:6421 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:6421 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:6421 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:6421 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:6422 0 OK 0x1.907e0aab020c9p22 0x1.e5aadbb861009p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG epsg:6422 1 OK 0x1.64ab3a8ebe896p22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:6422 2 OK 0x1.bc50dac7458fcp22 0x1.3d782896edb1fp20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG epsg:6422 3 OK 0x1.66c728b16e633p22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:6422 4 OK 0x1.ba34eca495b5fp22 0x1.490fd34bd7e77p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG epsg:6423 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:6423 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:6423 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:6423 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:6423 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:6424 0 OK 0x1.907e0aab020c9p22 0x1.e7dc46f7cec99p20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG epsg:6424 1 OK 0x1.639369c06914p22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:6424 2 OK 0x1.bd68ab959b05bp22 0x1.3b3cfa81a21d2p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG epsg:6424 3 OK 0x1.65a65a5ce593p22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:6424 4 OK 0x1.bb55baf91e86ap22 0x1.4c56c63348d87p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG epsg:6425 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:6425 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:6425 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:6425 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:6425 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:6426 0 OK 0x1.907e0aab020c9p22 0x1.dcbd320fca31ap20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG epsg:6426 1 OK 0x1.697149d028833p22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:6426 2 OK 0x1.b78acb85db95ap22 0x1.45c4474c70b24p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG epsg:6426 3 OK 0x1.6af09de1e9cf6p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG epsg:6426 4 OK 0x1.b60b77741a498p22 0x1.3b5e6d5b4483cp21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG epsg:6427 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:6427 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:6427 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:6427 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:6427 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:6428 0 OK 0x1.6e36000000004p21 0x1.4959ca39b0238p20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG epsg:6428 1 OK 0x1.165b50c53d54dp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:6428 2 OK 0x1.c610af3ac2abbp21 0x1.4295425f91c2ep19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG epsg:6428 3 OK 0x1.1af84f5f35b68p21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:6428 4 OK 0x1.c173b0a0ca4ap21 0x1.f611413a7e33cp20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG epsg:6429 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:6429 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:6429 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:6429 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:6429 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:6430 0 OK 0x1.6e36000000004p21 0x1.349e033e4d4bp20 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG epsg:6430 1 OK 0x1.2c1b34e9bf8dfp21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:6430 2 OK 0x1.b050cb1640729p21 0x1.6a24980a9e706p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG epsg:6430 3 OK 0x1.2edc82fbcaf4dp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:6430 4 OK 0x1.ad8f7d04350bbp21 0x1.b6f34d77f3347p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG epsg:6431 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:6431 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:6431 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:6431 3 OK 0x1.60a2ad403160fp19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:6431 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:6432 0 OK 0x1.6e36000000004p21 0x1.42aa603777e92p20 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG epsg:6432 1 OK 0x1.1d7ce35315bap21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:6432 2 OK 0x1.beef1cacea468p21 0x1.4f0ebe975da94p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG epsg:6432 3 OK 0x1.213c0acae25b4p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:6432 4 OK 0x1.bb2ff5351da54p21 0x1.e19682bf13b2ep20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG epsg:6433 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abb7p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:6433 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:6433 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:6433 3 OK 0x1.75e64473bf831p17 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:6433 4 OK 0x1.985d2bcd7fae6p18 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:6434 0 OK 0x1.e848000000005p19 0x1.500fa66b4a167p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG epsg:6434 1 OK 0x1.2cd17519787cp19 0x1.336c49b7fa353p18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:6434 2 OK 0x1.51df457343c25p20 0x1.336c49b7fa353p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG epsg:6434 3 OK 0x1.32acebaa46e8ap19 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:6434 4 OK 0x1.4ef18a2adc8cp20 0x1.04afc04ea9f57p20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:6435 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:6435 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:6435 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:6435 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:6435 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:6436 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG epsg:6436 1 OK -0x1.3b284352bd372p20 -0x1.adf90da921e84p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG epsg:6436 2 OK 0x1.3dc68c5566cd6p21 -0x1.adf90da921e83p20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG epsg:6436 3 OK -0x1.fc8e1e7bfa79ep19 0x1.cc6842bfb4f9fp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG epsg:6436 4 OK 0x1.1f55f24b06d03p21 0x1.cc6842bfb4fap20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG epsg:6437 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:6437 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6437 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6437 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6437 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6438 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:6438 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6438 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6438 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6438 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6439 0 OK 0x1.86ap18 0x1.96480dd1d2e11p18 0x0.0p0 -0x1.5p6 0x1.bbffffffffffep4 0x0.0p0 F +REG epsg:6439 1 OK -0x1.de96bdd8a0d5cp18 -0x1.768b3d3936413p18 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:6439 2 OK 0x1.3af5af7628357p20 -0x1.768b3d3936413p18 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.43ffffffffffbp4 0x0.0p0 F +REG epsg:6439 3 OK -0x1.6f31ce783807cp18 0x1.36f299ee9091p20 0x0.0p0 -0x1.71e6165af8d1bp6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:6439 4 OK 0x1.1f1c739e0e01fp20 0x1.36f299ee9091p20 0x0.0p0 -0x1.2e19e9a5072e5p6 0x1.1a00000000001p5 0x0.0p0 F +REG epsg:6440 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:6440 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002aep16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:6440 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002aep16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:6440 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:6440 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:6441 0 OK 0x1.e097400000006p20 0x1.36c124f6ea723p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG epsg:6441 1 OK 0x1.41af8ade6517p20 -0x1.312f13394fda2p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:6441 2 OK 0x1.3fbf7a90cd745p21 -0x1.312f13394fda2p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG epsg:6441 3 OK 0x1.472fd7933cbd8p20 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:6441 4 OK 0x1.3cff543661a11p21 0x1.d4e8d5e1dda61p19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG epsg:6442 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:6442 1 OK -0x1.707217f16e168p18 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6442 2 OK 0x1.7b890bf8b70b4p19 -0x1.09d6c6361032bp19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6442 3 OK -0x1.458d6e4bf8b82p18 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6442 4 OK 0x1.6616b725fc5c1p19 0x1.149ddf2ba16e7p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6443 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG epsg:6443 1 OK -0x1.2e33c46130e09p20 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6443 2 OK 0x1.374c4cdca0a18p21 -0x1.b4162f9a2dfc7p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG epsg:6443 3 OK -0x1.0b055608c9846p20 0x1.c5c441662f894p20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6443 4 OK 0x1.25b515b06cf37p21 0x1.c5c441662f894p20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG epsg:6444 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6444 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:6444 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:6444 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6444 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6445 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6445 1 OK -0x1.331c47ab8351ap20 -0x1.b1c692296f919p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:6445 2 OK 0x1.39c08e81c9daap21 -0x1.b1c692296f919p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:6445 3 OK -0x1.062aefbe75fbdp20 0x1.c850c02f2b578p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6445 4 OK 0x1.2347e28b432fap21 0x1.c850c02f2b579p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6446 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6446 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:6446 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:6446 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6446 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6447 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6447 1 OK 0x1.75870bf1b12dp18 -0x1.b1c692296f919p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG epsg:6447 2 OK 0x1.00ffc9eae0d48p22 -0x1.b1c692296f919p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG epsg:6447 3 OK 0x1.14a635d2f3426p19 0x1.c850c02f2b579p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6447 4 OK 0x1.eb86e7df3afe2p21 0x1.c850c02f2b578p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG epsg:6448 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:6448 1 OK -0x1.81a5a9c8e8128p16 -0x1.04cdd2a40a263p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6448 2 OK 0x1.0c3e5a9c8e818p20 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6448 3 OK -0x1.7ac864be1088p13 0x1.19e94e9402c21p19 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6448 4 OK 0x1.ee332192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6449 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:6449 1 OK -0x1.3c4f9c92268acp18 -0x1.abd3c4bd17e74p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6449 2 OK 0x1.b807fe3e4d034p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6449 3 OK -0x1.36ae48a5526ap15 0x1.ce73bbe339dbfp20 0x0.0p0 -0x1.e2c5da5b78061p6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6449 4 OK 0x1.9558c3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6450 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:6450 1 OK -0x1.85616a723a06p18 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6450 2 OK 0x1.8600b5391d03p19 -0x1.04cdd2a40a262p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6450 3 OK -0x1.30ce4325f0855p18 0x1.19e94e9402c22p19 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6450 4 OK 0x1.5bb72192f842ap19 0x1.19e94e9402c22p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6451 0 OK 0x1.4064d55810628p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:6451 1 OK -0x1.3f5f872489a3ep20 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6451 2 OK 0x1.3fe22e3e4d033p21 -0x1.abd3c4bd17e73p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6451 3 OK -0x1.f402248a55288p19 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.db70850622b0fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6451 4 OK 0x1.1d32f3ce9d7b6p21 0x1.ce73bbe339dcp20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6452 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:6452 1 OK 0x1.89215ec34d45p17 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6452 2 OK 0x1.557bd42796576p20 -0x1.04cce2bdc0c5dp19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6452 3 OK 0x1.192388e235138p18 0x1.19e84b4359962p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6452 4 OK 0x1.40571dc772bb2p20 0x1.19e84b4359962p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6453 0 OK 0x1.4064d5560418cp21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG epsg:6453 1 OK 0x1.4272e3f9da294p19 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6453 2 OK 0x1.181678d6c8d3ap22 -0x1.abd23b3412f2dp20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG epsg:6453 3 OK 0x1.cd2f4e1a7f8fp19 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6453 4 OK 0x1.06beeb92b426ep22 0x1.ce721280b8d3bp20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG epsg:6454 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:6454 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6454 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6454 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6454 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6455 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:6455 1 OK -0x1.d337aa27ec9e1p19 -0x1.aeabd35d8d29ap20 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6455 2 OK 0x1.65198a89fb275p21 -0x1.aeabd35d8d29cp20 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6455 3 OK -0x1.5f3708e5701fbp19 0x1.cbaec69ae12c3p20 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6455 4 OK 0x1.481962395c07cp21 0x1.cbaec69ae12c1p20 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6456 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:6456 1 OK 0x1.a750195edb798p16 -0x1.06875fc1616cep19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6456 2 OK 0x1.3b56fe6a1248cp20 -0x1.06875fc1616cdp19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dcp4 0x0.0p0 F +REG epsg:6456 3 OK 0x1.6115074dc79c6p17 0x1.1836b2e30beebp19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6456 4 OK 0x1.29a95f16470ccp20 0x1.1836b2e30beecp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6457 0 OK 0x1.18583aaa99311p21 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG epsg:6457 1 OK 0x1.5b346afe606c8p18 -0x1.aea818b495afap20 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6457 2 OK 0x1.02a4f3fab32a9p22 -0x1.aea818b495af9p20 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG epsg:6457 3 OK 0x1.2199d59dc334ep19 0x1.cbaacba2be8fep20 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6457 4 OK 0x1.e849ffedc1956p21 0x1.cbaacba2be8ffp20 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG epsg:6458 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:6458 1 OK -0x1.e136f546b674cp18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6458 2 OK 0x1.52437aa35b3b1p19 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6458 3 OK -0x1.9852805abae41p18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6458 4 OK 0x1.2dd1402d5d72ap19 0x1.928ff7cb858e7p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6459 0 OK 0x1.4064d54fdf3b9p18 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG epsg:6459 1 OK -0x1.8ab2401dc3b64p20 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6459 2 OK 0x1.15725562d9aa9p21 -0x1.cbf7744da7f42p19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6459 3 OK -0x1.4ee8c9d0e722cp20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6459 4 OK 0x1.ef1b3478d6c19p20 0x1.4a2f5d1b870c9p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6460 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:6460 1 OK 0x1.2c090ab9498b4p18 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6460 2 OK 0x1.6c71bd51ad9d3p20 -0x1.18656e1a098e4p18 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6460 3 OK 0x1.74ed7fa5451bfp18 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6460 4 OK 0x1.5a38a016aeb9p20 0x1.928ff7cb858e6p19 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6461 0 OK 0x1.6871700000004p21 0x1.907e0aa7ef9ep19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG epsg:6461 1 OK 0x1.ec2ed51c88f6cp19 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.758af3bc890b2p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6461 2 OK 0x1.2aeb955c6ee16p22 -0x1.cbf7744da7f44p19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG epsg:6461 3 OK 0x1.31e0e0db210eep20 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6461 4 OK 0x1.1bf937c937bc8p22 0x1.4a2f5d1b870c8p21 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG epsg:6462 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:6462 1 OK 0x1.3cc6ee6e8294ep20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:6462 2 OK 0x1.9fa511917d6b2p20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:6462 3 OK 0x1.3f7cec2641663p20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:6462 4 OK 0x1.9cef13d9be99dp20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:6463 0 OK 0x1.2c5e880000003p22 0x1.b7c99ac66682ep21 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG epsg:6463 1 OK 0x1.03d2bd0e9684ap22 0x1.6a5697a973562p21 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:6463 2 OK 0x1.54ea52f1697bcp22 0x1.6a5697a973562p21 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG epsg:6463 3 OK 0x1.060bf4adabb8cp22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:6463 4 OK 0x1.52b11b525447ap22 0x1.03bd8a32bae0ep22 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG epsg:6464 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:6464 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:6464 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:6464 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:6464 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:6465 0 OK 0x1.907e0aaacd9ecp20 0x1.3d3f567def798p18 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG epsg:6465 1 OK 0x1.d9f3bc9d1907p19 -0x1.346e3812466f1p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:6465 2 OK 0x1.1a011b83875c8p21 -0x1.346e3812466f1p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG epsg:6465 3 OK 0x1.eb292b95746acp19 0x1.e0253b431c934p19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:6465 4 OK 0x1.15b3bfc57083ap21 0x1.e0253b431c934p19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG epsg:6466 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:6466 1 OK 0x1.cb1f1458ef103p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:6466 2 OK 0x1.13d83ae9c43b6p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:6466 3 OK 0x1.d81683a3ea361p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:6466 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:6467 0 OK 0x1.4064d5553261cp20 0x1.01dcb007f3f81p18 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG epsg:6467 1 OK 0x1.7893406bdf08p19 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:6467 2 OK 0x1.c4800a74753e8p20 -0x1.f8ddd2d37681ep17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG epsg:6467 3 OK 0x1.8335e132b4628p19 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:6467 4 OK 0x1.bf2eba110a914p20 0x1.8575d7a7c174p19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG epsg:6468 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:6468 1 OK 0x1.651ae3466f2f2p17 0x1.225e5e1328bcap18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:6468 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bcap18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:6468 3 OK 0x1.7a4c446942232p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:6468 4 OK 0x1.280ceee5af77dp19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:6469 0 OK 0x1.4064d5553261cp20 0x1.94d890b712fafp20 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG epsg:6469 1 OK 0x1.24e688993b282p19 0x1.dc5355d74337p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:6469 2 OK 0x1.ee56665dc7308p20 0x1.dc5355d74337p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG epsg:6469 3 OK 0x1.3648799a8a6c2p19 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:6469 4 OK 0x1.e5a56ddd1f8e6p20 0x1.1ff589fcabc88p21 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG epsg:6470 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:6470 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:6470 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:6470 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:6470 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:6471 0 OK 0x1.907e0aac08315p20 0x1.04cae2b6b9b91p18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG epsg:6471 1 OK 0x1.0aeb10e9b927p20 -0x1.feccc02444d94p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:6471 2 OK 0x1.0b0882372b9ddp21 -0x1.feccc02444d94p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG epsg:6471 3 OK 0x1.1034910620ffcp20 0x1.89d6f5d769758p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:6471 4 OK 0x1.0863c228f7b17p21 0x1.89d6f5d769758p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG epsg:6472 0 OK 0x1.6e36p20 0x1.13c08027f5c87p20 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:6472 1 OK 0x1.2cbd88791104cp20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:6472 2 OK 0x1.afae7786eefb4p20 0x1.ab19af9209ed8p19 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:6472 3 OK 0x1.30b9c63bda1abp20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:6472 4 OK 0x1.abb239c425e55p20 0x1.53f6847ef08abp20 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:6473 0 OK 0x1.2c5e880000003p22 0x1.c4591d51ef696p21 0x0.0p0 -0x1.57p6 0x1.2bfffffffffddp5 0x0.0p0 F +REG epsg:6473 1 OK 0x1.ed56e9caddbb6p21 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.62c3b05237b82p6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:6473 2 OK 0x1.62119b1a9122bp22 0x1.5e4fae592df7cp21 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.195555555552dp5 0x0.0p0 F +REG epsg:6473 3 OK 0x1.f3e088b4bdff2p21 0x1.16d727df74a24p22 0x0.0p0 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:6473 4 OK 0x1.5ecccba5a100dp22 0x1.16d727df74a24p22 0x0.0p0 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaa8ep5 0x0.0p0 F +REG epsg:6474 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:6474 1 OK 0x1.36785c3381cdep18 0x1.93766c01072c4p18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:6474 2 OK 0x1.4d0bd1e63f187p19 0x1.93766c01072c4p18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:6474 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:6474 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:6475 0 OK 0x1.907e0aac08315p20 0x1.d79a53ca86cdfp20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG epsg:6475 1 OK 0x1.fd4ce85362396p19 0x1.4aec624c3c358p20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:6475 2 OK 0x1.112ad0972fa28p21 0x1.4aec624c3c358p20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG epsg:6475 3 OK 0x1.04b1690895058p20 0x1.33abac378504bp21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:6475 4 OK 0x1.0e255627bdae1p21 0x1.33abac378504bp21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG epsg:6476 0 OK 0x1.e848p19 0x1.d532d46be5665p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:6476 1 OK 0x1.6fab4a4b43fbfp19 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:6476 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:6476 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:6476 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:6477 0 OK 0x1.907e0aaa99312p21 0x1.80d72f309a9c2p18 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:6477 1 OK 0x1.2d90b4fd585dcp21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:6477 2 OK 0x1.f36b6057da04p21 -0x1.77aab588f749bp18 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG epsg:6477 3 OK 0x1.3214ef0c8300ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:6477 4 OK 0x1.eee72648af60ep21 0x1.22e5faacdef92p20 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG epsg:6478 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:6478 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:6478 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:6478 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:6478 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:6479 0 OK 0x1.907e0aaa99312p21 0x1.86a7c427d74f8p18 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG epsg:6479 1 OK 0x1.2c2fc6b261b4ap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:6479 2 OK 0x1.f4cc4ea2d0adap21 -0x1.7ded25dcc0e33p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG epsg:6479 3 OK 0x1.3080083a31b84p21 0x1.27283341722fap20 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:6479 4 OK 0x1.f07c0d1b00aap21 0x1.27283341722fap20 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG epsg:6480 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.148p6 0x1.5cp5 0x0.0p0 F +REG epsg:6480 1 OK -0x1.8cea4cb9322ep16 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.30126c96fd076p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:6480 2 OK 0x1.0cf2a4cb9322ep20 -0x1.0417bf48f63b1p19 0x0.0p0 -0x1.f1db26d205f14p5 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:6480 3 OK -0x1.20c56a52693cp13 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.30126c9642e66p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:6480 4 OK 0x1.eccb15a949a4fp19 0x1.1a967c3ad692bp19 0x0.0p0 -0x1.f1db26d37a334p5 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:6481 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:6481 1 OK 0x1.7e3b0ade7c6b8p16 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.2b39bac64b449p6 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:6481 2 OK 0x1.3de84f5218394p20 -0x1.03f4b94269fd6p19 0x0.0p0 -0x1.e78c8a736976fp5 0x1.36aaaaa9c1b1cp5 0x0.0p0 F +REG epsg:6481 3 OK 0x1.75a4e0362c05cp17 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.2b39bac587a75p6 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:6481 4 OK 0x1.271763f93a7f4p20 0x1.1ab64c3a26d64p19 0x0.0p0 -0x1.e78c8a74f0b16p5 0x1.86aaaaa953696p5 0x0.0p0 F +REG epsg:6482 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.198p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6482 1 OK -0x1.258170cf9dfa8p18 -0x1.045c58ea73f2bp19 0x0.0p0 -0x1.34c5ceb6f8417p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6482 2 OK 0x1.b7b8b867cefddp19 -0x1.045c58ea73f2ap19 0x0.0p0 -0x1.fc7462920f7dp5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6482 3 OK -0x1.9ac570c807e5ap17 0x1.1a5791ee1ae34p19 0x0.0p0 -0x1.34c5ceb64fe08p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6482 4 OK 0x1.8ba95c3201f9ep19 0x1.1a5791ee1ae35p19 0x0.0p0 -0x1.fc746293603efp5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6483 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:6483 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:6483 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:6483 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:6483 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:6484 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG epsg:6484 1 OK -0x1.e3860df712139p19 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG epsg:6484 2 OK 0x1.692d237dc4853p21 -0x1.aa83ba2790b03p20 0x0.0p0 -0x1.ecb403e7f2d2dp5 0x1.3555555472628p5 0x0.0p0 F +REG epsg:6484 3 OK -0x1.4eb20da18b725p19 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG epsg:6484 4 OK 0x1.43f8236862dcep21 0x1.cfa05dbdeebap20 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG epsg:6485 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6485 1 OK 0x1.24708fa7d30c8p18 -0x1.045b756908cacp19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6485 2 OK 0x1.6e57dc160b3d3p20 -0x1.045b756908cabp19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6485 3 OK 0x1.7c8efb1369fb7p18 0x1.1a569b37919d1p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6485 4 OK 0x1.5850413b25816p20 0x1.1a569b37919d2p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6486 0 OK 0x1.6871700000004p21 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6486 1 OK 0x1.dfb912e887544p19 -0x1.ab1829e1bd76bp20 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6486 2 OK 0x1.2c7a4da2ef15fp22 -0x1.ab1829e1bd769p20 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6486 3 OK 0x1.38232403b5cefp20 0x1.cf2707cb433ddp20 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6486 4 OK 0x1.1a68a6ff128ccp22 0x1.cf2707cb433dep20 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6487 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:6487 1 OK 0x1.7f67f8df8368dp17 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:6487 2 OK 0x1.26c601c81f25dp19 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:6487 3 OK 0x1.92b98c3d8bc66p17 0x1.24621bba84e0bp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:6487 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84e0bp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:6488 0 OK 0x1.4064d553f7cf1p20 0x1.3d1efd3b91187p18 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG epsg:6488 1 OK 0x1.3a7910c1d2d03p19 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:6488 2 OK 0x1.e38d22470636p20 -0x1.3505fec9eb6d4p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG epsg:6488 3 OK 0x1.4a5177c329c8p19 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:6488 4 OK 0x1.dba0eec65aba2p20 0x1.dfa15d7c876a9p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG epsg:6489 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:6489 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:6489 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:6489 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:6489 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:6490 0 OK 0x1.907e0aac08315p20 0x1.57f5cca07ddf3p16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG epsg:6490 1 OK 0x1.35d5e8a5c7bd2p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:6490 2 OK 0x1.eb262cb248a58p20 -0x1.0b0c374f92409p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG epsg:6490 3 OK 0x1.3890cdb380798p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:6490 4 OK 0x1.e86b47a48fe92p20 0x1.bc8e2eb949a0ep18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG epsg:6491 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:6491 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:6491 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:6491 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:6491 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:6492 0 OK 0x1.4064d55810628p19 0x1.51cf01db587dap21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG epsg:6492 1 OK 0x1.7b96f1026fcp14 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:6492 2 OK 0x1.3a76799406a38p20 0x1.07f21b07f43d6p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG epsg:6492 3 OK 0x1.bbb272668874p15 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:6492 4 OK 0x1.328741c4dc1eep20 0x1.9dabbc7f5b32cp21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG epsg:6493 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:6493 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:6493 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:6493 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:6493 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:6494 0 OK 0x1.2c5eaf5eb851fp24 0x1.a8432a3145b09p18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG epsg:6494 1 OK 0x1.1e863b657d643p24 -0x1.962954cc373abp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:6494 2 OK 0x1.3a372357f33fap24 -0x1.962954cc373abp18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG epsg:6494 3 OK 0x1.1f9deb7dde65ap24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:6494 4 OK 0x1.391f733f923e3p24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG epsg:6495 0 OK 0x1.e848p22 0x1.f347dc7be971fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:6495 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:6495 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:6495 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:6495 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:6496 0 OK 0x1.907e3f28f5c29p24 0x1.9983d81e6921fp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG epsg:6496 1 OK 0x1.831fd4ce40c4cp24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:6496 2 OK 0x1.9ddca983aac05p24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG epsg:6496 3 OK 0x1.843129ecee803p24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:6496 4 OK 0x1.9ccb5464fd04ep24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG epsg:6497 0 OK 0x1.e820102717124p18 0x1.021b09b534a38p19 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c54p5 0x0.0p0 F +REG epsg:6497 1 OK -0x1.9b81a058acb8p16 -0x1.331112c037p11 0x0.0p0 -0x1.747029aea2077p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:6497 2 OK 0x1.0d79243918fb8p20 -0x1.922d16d199p10 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG epsg:6497 3 OK -0x1.78e84bb8396p12 0x1.0e768407c4d04p20 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f9268p5 0x0.0p0 F +REG epsg:6497 4 OK 0x1.eb6d7bde8efa8p19 0x1.0ebc1c9adda5p20 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f9267fp5 0x0.0p0 F +REG epsg:6498 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:6498 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:6498 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:6498 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:6498 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:6499 0 OK 0x1.907e3f28f5c28p23 0x1.818af27c31519p18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG epsg:6499 1 OK 0x1.7778c79e94e8bp23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:6499 2 OK 0x1.a983b6b3569c4p23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG epsg:6499 3 OK 0x1.7927ff3c5604fp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:6499 4 OK 0x1.a7d47f15957ffp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG epsg:6500 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:6500 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:6500 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:6500 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:6500 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:6501 0 OK 0x1.4064d55566cf7p21 0x1.56b35d2f0c193p19 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG epsg:6501 1 OK 0x1.c2eee7a76769bp20 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:6501 2 OK 0x1.9f5236d719eap21 -0x1.e8ab436b39d1p14 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG epsg:6501 3 OK 0x1.d089ec96c7bc2p20 0x1.65310f83b70e4p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:6501 4 OK 0x1.9884b45f69c0dp21 0x1.65310f83b70e4p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG epsg:6502 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:6502 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6502 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6502 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:6502 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:6503 0 OK 0x1.4064d55566cf7p21 0x1.5e2a74ed7415ap19 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG epsg:6503 1 OK 0x1.ba857c0cd30dp20 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6503 2 OK 0x1.a386eca464186p21 -0x1.5b4e9128c2cd8p15 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6503 3 OK 0x1.ca0f9eb37f2a3p20 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:6503 4 OK 0x1.9bc1db510e09cp21 0x1.70d9d9608bab2p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG epsg:6504 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:6504 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:6504 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:6504 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:6504 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:6505 0 OK 0x1.4064d55566cf7p21 0x1.657a38f269fb8p19 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG epsg:6505 1 OK 0x1.b36cbd2e0fb2p20 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:6505 2 OK 0x1.a7134c13c5c65p21 -0x1.d62fdfdbc67f8p15 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG epsg:6505 3 OK 0x1.c25367e1c0d1cp20 0x1.7bac03774b0eap20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:6505 4 OK 0x1.9f9ff6b9ed367p21 0x1.7bac03774b0eap20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG epsg:6506 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:6506 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6506 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6506 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6506 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6507 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:6507 1 OK -0x1.c528da114b511p19 -0x1.b202d186cc333p20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6507 2 OK 0x1.6195d68452d49p21 -0x1.b202d186cc333p20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6507 3 OK -0x1.6d13c32e22509p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6507 4 OK 0x1.4b9090cb88947p21 0x1.c81a512182c17p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6508 0 OK 0x1.e848p18 0x1.3d62p20 0x0.0p0 -0x1.67p6 0x1.04p5 0x0.0p0 F +REG epsg:6508 1 OK -0x1.5124af7818e2p16 0x1.730763013f554p19 0x0.0p0 -0x1.7eb6ba5949874p6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:6508 2 OK 0x1.09364af7818e2p20 0x1.730763013f554p19 0x0.0p0 -0x1.4f4945a6b678dp6 0x1.b7ffffffb0967p4 0x0.0p0 F +REG epsg:6508 3 OK -0x1.7cf6761f76e6p14 0x1.c8d388b870dfp20 0x0.0p0 -0x1.7eb6ba5938334p6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:6508 4 OK 0x1.f42fb3b0fbb73p19 0x1.c8d388b870dfp20 0x0.0p0 -0x1.4f4945a6c7ccdp6 0x1.2bffffffaa53ap5 0x0.0p0 F +REG epsg:6509 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:6509 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6509 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6509 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6509 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6510 0 OK 0x1.18583aa9fbe7ap21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG epsg:6510 1 OK 0x1.7741a12d4899cp18 -0x1.b202d186cc333p20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6510 2 OK 0x1.00e42097275ep22 -0x1.b202d186cc333p20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG epsg:6510 3 OK 0x1.13b5e779cd4d6p19 0x1.c81a512182c17p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6510 4 OK 0x1.ebc2fb75847bep21 0x1.c81a512182c17p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG epsg:6511 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:6511 1 OK -0x1.61a577bff57e8p16 -0x1.06c963762fa92p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:6511 2 OK 0x1.0a3e577bff57ep20 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:6511 3 OK -0x1.3d4838806987p14 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:6511 4 OK 0x1.f23241c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:6512 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG epsg:6512 1 OK -0x1.4c8d5deffd5fap18 -0x1.06c963762fa92p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:6512 2 OK 0x1.9a6aaef7feafdp19 -0x1.06c963762fa92p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG epsg:6512 3 OK -0x1.07f8838806987p18 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:6512 4 OK 0x1.782041c4034c4p19 0x1.17f1c3b3bb0a7p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG epsg:6513 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG epsg:6513 1 OK 0x1.f9e988e88c2ccp17 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:6513 2 OK 0x1.5fcccee2ee7a6p20 -0x1.06af82fbf5011p19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG epsg:6513 3 OK 0x1.42628ec44b0f3p18 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:6513 4 OK 0x1.4e715c4eed3c3p20 0x1.180d8ccf5ab5bp19 0x0.0p0 -0x1.6139e6ce2bc88p6 0x1.49555554cc4adp5 0x0.0p0 F +REG epsg:6514 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:6514 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:6514 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:6514 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:6514 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:6515 0 OK 0x1.e0977efdf3b63p20 0x1.a6c8bd0f5d9f5p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG epsg:6515 1 OK 0x1.3ca7fcc422cbp16 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:6515 2 OK 0x1.d6b23f17d2a06p21 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG epsg:6515 3 OK 0x1.79b79a00e21fp18 0x1.45d92b5d83149p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:6515 4 OK 0x1.b1608bbdd772cp21 0x1.45d92b5d83149p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG epsg:6516 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:6516 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:6516 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:6516 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:6516 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:6517 0 OK 0x1.907e0aaacd9ecp20 0x1.199c3402171a3p19 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:6517 1 OK 0x1.a0b616e027ecp18 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:6517 2 OK 0x1.5c6747cec8a14p21 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:6517 3 OK 0x1.07608efa56844p19 0x1.ad3050594afd7p20 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:6517 4 OK 0x1.4ea5e6ec37fdbp21 0x1.ad3050594afd7p20 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:6518 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:6518 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6518 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6518 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6518 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6519 0 OK 0x1.907e0aaacd9ecp20 0x1.2c5e880000003p24 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG epsg:6519 1 OK -0x1.1d8ca8166d50cp18 0x1.1164e159c0438p24 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6519 2 OK 0x1.b42f9fad9b48ep21 0x1.1164e159c0438p24 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6519 3 OK -0x1.15b1768bc94cp16 0x1.4908f019e4711p24 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6519 4 OK 0x1.992b965f2be92p21 0x1.4908f019e4711p24 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6520 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:6520 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6520 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6520 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6520 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6521 0 OK 0x1.4064d5559b3d4p19 0x1.907e0aaaacda5p24 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG epsg:6521 1 OK -0x1.37aeca059b545p20 0x1.758464046d1dap24 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6521 2 OK 0x1.3c09cfad9b496p21 0x1.758464046d1dap24 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6521 3 OK -0x1.01a6b768bc94ep20 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6521 4 OK 0x1.2105c65f2be98p21 0x1.ad2872c4914b3p24 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6522 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:6522 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6522 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6522 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6522 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6523 0 OK 0x1.4064d55566cf7p21 0x1.907e0aaaa64c8p23 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG epsg:6523 1 OK 0x1.51d0ebf4c957ep19 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6523 2 OK 0x1.162ab7d6cda47p22 0x1.5a8abd5e26d32p23 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG epsg:6523 3 OK 0x1.bde1112e86d6cp19 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6523 4 OK 0x1.08a8b32f95f4ap22 0x1.c9d2dade6f2e3p23 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG epsg:6524 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:6524 1 OK -0x1.24fce93763534p18 -0x1.047d0f0ecdd7cp19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6524 2 OK 0x1.b776749bb1a9p19 -0x1.047d0f0ecdd7dp19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6524 3 OK -0x1.9bca10091ae7cp17 0x1.1a377ef14666fp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6524 4 OK 0x1.8bea840246b96p19 0x1.1a377ef14666ep19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6525 0 OK 0x1.e097400000009p19 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG epsg:6525 1 OK -0x1.e09f4e5bd1c2fp19 -0x1.ab4f482af396dp20 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6525 2 OK 0x1.68737396f4708p21 -0x1.ab4f482af396ep20 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6525 3 OK -0x1.51c0c6017ea79p19 0x1.cef3ff10b2be5p20 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6525 4 OK 0x1.44bbd1805fa9cp21 0x1.cef3ff10b2be4p20 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6526 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6526 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6526 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6526 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6526 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6527 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6527 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6527 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6527 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6527 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6528 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:6528 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6528 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6528 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6528 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6529 0 OK 0x1.907e0aac08315p20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG epsg:6529 1 OK -0x1.0ef596d91f928p18 -0x1.b157317808227p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6529 2 OK 0x1.b25cbd872c23ap21 -0x1.b157317808227p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6529 3 OK -0x1.4f6288ed1a5dp16 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6529 4 OK 0x1.9af91ef371044p21 0x1.c8cabbc02c8b7p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6530 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:6530 1 OK -0x1.99be00ac5ff96p18 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6530 2 OK 0x1.6e0100562ffcbp19 -0x1.082ad809f1e8cp19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6530 3 OK -0x1.60b5a122eb162p18 0x1.1676a4801012dp19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:6530 4 OK 0x1.517cd091758b1p19 0x1.1676a4801012dp19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG epsg:6531 0 OK 0x1.0853300000003p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:6531 1 OK -0x1.5012ef61028f4p20 -0x1.b15833ac79502p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6531 2 OK 0x1.2c330fb08147cp21 -0x1.b15833ac79502p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6531 3 OK -0x1.214b965a2235p20 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6531 4 OK 0x1.14cf632d111aap21 0x1.c8cbcbedcf466p20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6532 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:6532 1 OK 0x1.df55c7b8d8b04p17 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6532 2 OK 0x1.595b4708e4eap20 -0x1.082b5b35c6831p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6532 3 OK 0x1.28b35fb7a28a2p18 0x1.16772ec526b59p19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6532 4 OK 0x1.4b192812175d8p20 0x1.16772ec526b59p19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6533 0 OK 0x1.4c689d560418cp21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG epsg:6533 1 OK 0x1.8927959598ba4p19 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6533 2 OK 0x1.1b43aaa351018p22 -0x1.b1590ad96330bp20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG epsg:6533 3 OK 0x1.e6b67617f7ec6p19 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6533 4 OK 0x1.0f91ce93051b3p22 0x1.c8ccaebfc8913p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG epsg:6534 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:6534 1 OK -0x1.5221cfa7d36a2p18 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6534 2 OK 0x1.9d34e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6534 3 OK -0x1.0266eb5117679p18 0x1.19530345ad8e5p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6534 4 OK 0x1.755775a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6535 0 OK 0x1.907e0aa7ef9ep19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:6535 1 OK -0x1.1556b8086776ap20 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6535 2 OK 0x1.52ea61582b8a5p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6535 3 OK -0x1.a7e3120738976p19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6535 4 OK 0x1.3237c9d5c5f4ep21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6536 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6536 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6536 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6536 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6536 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6537 0 OK 0x1.e097400000006p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6537 1 OK -0x1.64165d1827b3cp20 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6537 2 OK 0x1.2a30fe8c13dap21 -0x1.ad793f4f7bbc9p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG epsg:6537 3 OK -0x1.255c90ab4fb6ap20 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6537 4 OK 0x1.0ad41855a7db7p21 0x1.ccd1e8b14ec8cp20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG epsg:6538 0 OK 0x1.24f8p18 0x1.77ef514292013p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:6538 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:6538 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:6538 3 OK 0x1.7379e78330bbep17 0x1.388171947289dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:6538 4 OK 0x1.90330c3e67a21p18 0x1.388171947289dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:6539 0 OK 0x1.e097400000009p19 0x1.34584a46de43p17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG epsg:6539 1 OK 0x1.2b56a357b7e14p19 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:6539 2 OK 0x1.4aebee54240ffp20 -0x1.8dc7734d32afap17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG epsg:6539 3 OK 0x1.30b017f7ec667p19 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:6539 4 OK 0x1.483f340409cd6p20 0x1.0051d9cc95a04p19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG epsg:6540 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:6540 1 OK -0x1.e0f39f4fa6d44p17 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6540 2 OK 0x1.ce08e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6540 3 OK -0x1.417dd6a22ecf2p17 0x1.19530345ad8e5p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6540 4 OK 0x1.a62b75a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6541 0 OK 0x1.18583aac08314p20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG epsg:6541 1 OK -0x1.8a7b0560ae28cp19 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6541 2 OK 0x1.7af6fc0433bb7p21 -0x1.acd31ddaae9bbp20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6541 3 OK -0x1.07b0a75717d2ep19 0x1.cd7d305aba408p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6541 4 OK 0x1.5a446481ce26p21 0x1.cd7d305aba408p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6542 0 OK 0x1.29a8270a3d70ap19 0x1.05cc553074f97p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:6542 1 OK 0x1.449988c24f902p18 -0x1.fbb202943916cp16 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:6542 2 OK 0x1.b10389b353188p19 -0x1.fbb202943916cp16 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:6542 3 OK 0x1.54278a411c66cp18 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:6542 4 OK 0x1.a93c88f3ecad4p19 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:6543 0 OK 0x1.e848000000005p20 0x1.ad7545588e65p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG epsg:6543 1 OK 0x1.0a3d4a3582c3ep20 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:6543 2 OK 0x1.63295ae53e9dep21 -0x1.a06a7c3fa75cp18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG epsg:6543 3 OK 0x1.16ff5d3fb333cp20 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:6543 4 OK 0x1.5cc851602665fp21 0x1.4547a9e7a344cp20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG epsg:6544 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:6544 1 OK 0x1.86e3d47c2716ep18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:6544 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:6544 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6544 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6545 0 OK 0x1.e0977efdf3b63p20 0x1.34b8635602885p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:6545 1 OK 0x1.409ca1da0a5ddp20 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:6545 2 OK 0x1.40492e10ee87bp21 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG epsg:6545 3 OK 0x1.4af8a0f982deep20 0x1.d42e49f062e38p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6545 4 OK 0x1.3b1b2e8132473p21 0x1.d42e49f062e38p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6546 0 OK 0x1.24f8p19 0x1.8a66ee530ab8dp16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:6546 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:6546 2 OK 0x1.8b2e86753449dp19 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:6546 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:6546 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:6547 0 OK 0x1.e0977efdf3b63p20 0x1.437e15732559cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG epsg:6547 1 OK 0x1.38eb67f7cefd8p20 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:6547 2 OK 0x1.4421cb020c37ep21 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG epsg:6547 3 OK 0x1.43cd789910c28p20 0x1.ea990182f140ap19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:6547 4 OK 0x1.3eb0c2b16b556p21 0x1.ea990182f140ap19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG epsg:6548 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:6548 1 OK 0x1.65d7a1966c1d2p18 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:6548 2 OK 0x1.97042f34c9f0dp19 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:6548 3 OK 0x1.7366a7cc5f285p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:6548 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:6549 0 OK 0x1.e097400000006p20 0x1.69b6e7707aa02p18 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG epsg:6549 1 OK 0x1.258157aea187cp20 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:6549 2 OK 0x1.4dd69428af3cp21 -0x1.5e4d121071a24p18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG epsg:6549 3 OK 0x1.30a04e375c57ep20 0x1.12091514d80d2p20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:6549 4 OK 0x1.484718e451d4p21 0x1.12091514d80d2p20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG epsg:6550 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:6550 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:6550 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:6550 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:6550 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:6551 0 OK 0x1.e097400000006p20 0x1.699b9c3b7e55dp18 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG epsg:6551 1 OK 0x1.25d72ef511beap20 -0x1.5edf5422de247p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:6551 2 OK 0x1.4daba8857720ap21 -0x1.5edf5422de247p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG epsg:6551 3 OK 0x1.30523c7b25078p20 0x1.11ce460665ccap20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:6551 4 OK 0x1.486e21c26d7c2p21 0x1.11ce460665ccap20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG epsg:6552 0 OK 0x1.24f8p19 0x1.7ed816e9b443ap16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:6552 1 OK 0x1.8562e4192a9e6p18 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:6552 2 OK 0x1.873e8df36ab0dp19 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:6552 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5de8p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:6552 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5de8p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:6553 0 OK 0x1.e097400000006p20 0x1.3a030d3f271bcp18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG epsg:6553 1 OK 0x1.3f60bce6c66c8p20 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:6553 2 OK 0x1.40e6e18c9cca2p21 -0x1.32d2652c2355ap18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG epsg:6553 3 OK 0x1.466e4a61d6408p20 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:6553 4 OK 0x1.3d601acf14e02p21 0x1.da8d3177bcd0dp19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG epsg:6554 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:6554 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:6554 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:6554 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:6554 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:6555 0 OK 0x1.e097400000006p20 0x1.519f1c006078p18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG epsg:6555 1 OK 0x1.332c99d21eee2p20 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:6555 2 OK 0x1.4700f316f0895p21 -0x1.49c9fd9e63859p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG epsg:6555 3 OK 0x1.3addbc4eed52ep20 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:6555 4 OK 0x1.432861d88956fp21 0x1.fe4a15bf17bfdp19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG epsg:6556 0 OK 0x1.86ap18 0x1.96e208b941ca4p17 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:6556 1 OK -0x1.58224050f8eep15 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6556 2 OK 0x1.9c2224050f901p19 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6556 3 OK 0x1.0a4c279e8ba6p13 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6556 4 OK 0x1.8276cf6185d27p19 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6557 0 OK 0x1.4064ff53f7cedp20 0x1.4dbabd3e95b5ap19 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:6557 1 OK -0x1.1a43107856f38p17 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6557 2 OK 0x1.5209305b7d3fp21 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6557 3 OK 0x1.b4d6f6677e14p14 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6557 4 OK 0x1.3cfb516728d38p21 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6558 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:6558 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6558 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6558 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6558 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6559 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:6559 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6559 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6559 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6559 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6560 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:6560 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6560 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6560 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6560 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6561 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:6561 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6561 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6561 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6561 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6562 0 OK 0x1.24f8p19 0x1.82cecd83b5059p16 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:6562 1 OK 0x1.8289a2cb236a6p18 -0x1.77fcaead221dp16 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:6562 2 OK 0x1.88ab2e9a6e4adp19 -0x1.77fcaead221dp16 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:6562 3 OK 0x1.8d19b32c1129cp18 0x1.24b9880b7720fp18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:6562 4 OK 0x1.83632669f76b2p19 0x1.24b9880b7720fp18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:6563 0 OK 0x1.e097400000006p20 0x1.3d4353fa5fbadp18 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG epsg:6563 1 OK 0x1.3d0a98c7262b4p20 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:6563 2 OK 0x1.4211f39c6ceacp21 -0x1.3463408d0b9b9p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG epsg:6563 3 OK 0x1.45b47e1aeae0ep20 0x1.e030c687b6f13p19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:6563 4 OK 0x1.3dbd00f28a8ffp21 0x1.e030c687b6f13p19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG epsg:6564 0 OK 0x1.24f8p19 0x1.623635ef1cb8ap16 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:6564 1 OK 0x1.93ddc76008933p18 -0x1.59729314e624fp16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:6564 2 OK 0x1.80011c4ffbb66p19 -0x1.59729314e624fp16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:6564 3 OK 0x1.9c6fffae6b3c8p18 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:6564 4 OK 0x1.7bb80028ca61cp19 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:6565 0 OK 0x1.e097400000006p20 0x1.228706283a7ddp18 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG epsg:6565 1 OK 0x1.4b41287d38872p20 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:6565 2 OK 0x1.3af6abc163bcdp21 -0x1.1b56c665c812ep18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG epsg:6565 3 OK 0x1.5248e02a502bbp20 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:6565 4 OK 0x1.3772cfead7ea8p21 0x1.b74b291d3d9e7p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG epsg:6566 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG epsg:6566 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:6566 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG epsg:6566 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:6566 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG epsg:6567 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6567 1 OK -0x1.e6349b6f89f4cp18 -0x1.0508c5f7d2c1cp19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:6567 2 OK 0x1.54c24db7c4fbp19 -0x1.0508c5f7d2c1bp19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:6567 3 OK -0x1.9359a05eb2813p18 0x1.19b7b45ee2b01p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:6567 4 OK 0x1.2b54d02f59412p19 0x1.19b7b45ee2b02p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:6568 0 OK 0x1.4064d554c9862p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6568 1 OK -0x1.8eca3057f111p20 -0x1.ac3478cdae1a8p20 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:6568 2 OK 0x1.177e4d812aea9p21 -0x1.ac3478cdae1a6p20 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG epsg:6568 3 OK -0x1.4ad4c4046bdfp20 0x1.ce225d894e1a8p20 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:6568 4 OK 0x1.eb072eaed0a3p20 0x1.ce225d894e1a9p20 0x0.0p0 -0x1.0377569181a1dp6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG epsg:6569 0 OK 0x1.29a8p19 0x1.44e4cd737cdd2p17 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:6569 1 OK 0x1.01b075d8c695p18 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:6569 2 OK 0x1.d277c5139cb58p19 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:6569 3 OK 0x1.184511ebb6ddcp18 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:6569 4 OK 0x1.c72d770a24912p19 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:6570 0 OK 0x1.e847fffffffffp20 0x1.0a7b29855bfffp19 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG epsg:6570 1 OK 0x1.a6b7fa6e5a964p19 -0x1.0104117a0f575p19 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:6570 2 OK 0x1.7e9a0164695a6p21 -0x1.0104117a0f575p19 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG epsg:6570 3 OK 0x1.cbc29b0bbdc86p19 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:6570 4 OK 0x1.7557593d108dep21 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG epsg:6571 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:6571 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda99882p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:6571 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda99882p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:6571 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e36p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:6571 4 OK 0x1.8670ba72bc014p19 0x1.3052f091f3e36p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:6572 0 OK 0x1.e097400000006p20 0x1.495377ea606a5p18 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG epsg:6572 1 OK 0x1.361934b47e738p20 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:6572 2 OK 0x1.458aa5a5c0c62p21 -0x1.3e68cdb307d95p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG epsg:6572 3 OK 0x1.40b260ebae5d4p20 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:6572 4 OK 0x1.403e0f8a28d15p21 0x1.f337d7a6095c1p19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG epsg:6573 0 OK 0x1.24f8p19 0x1.c069e4aef592fp16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:6573 1 OK 0x1.614d92de92fd1p18 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:6573 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:6573 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6573 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6574 0 OK 0x1.e097400000006p20 0x1.6fcae86be05b3p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG epsg:6574 1 OK 0x1.21c83698cc15p20 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:6574 2 OK 0x1.4fb324b399f5ep21 -0x1.62cf2cd232ea5p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG epsg:6574 3 OK 0x1.2e5f0748dbcb6p20 0x1.16f406e89be55p20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6574 4 OK 0x1.4967bc5b921abp21 0x1.16f406e89be55p20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG epsg:6575 0 OK 0x1.24f8p19 0x1.c374b0c96a7e1p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:6575 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:6575 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:6575 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dce04p18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:6575 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dce04p18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:6576 0 OK 0x1.e097400000006p20 0x1.7249af14fd5fap18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG epsg:6576 1 OK 0x1.21cff166c8dd1p20 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:6576 2 OK 0x1.4faf474c9b926p21 -0x1.686fc945bcc3dp18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG epsg:6576 3 OK 0x1.2b7ae3b3fa782p20 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:6576 4 OK 0x1.4ad9ce2602c4dp21 0x1.181e65e2f75a1p20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG epsg:6577 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:6577 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:6577 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:6577 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:6577 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:6578 0 OK 0x1.18583aa9fbe7ap21 0x1.38abba7c13556p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG epsg:6578 1 OK 0x1.66573f1cbd669p20 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:6578 2 OK 0x1.7d84d5c5991c8p21 0x1.205b8ceeb4ae4p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG epsg:6578 3 OK 0x1.6f78cd5a43b24p20 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:6578 4 OK 0x1.78f40ea6d5f6ap21 0x1.518fea6f3bd34p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG epsg:6579 0 OK 0x1.6e36p20 0x1.a716635e144bap22 0x0.0p0 -0x1.9p6 0x1.a800000000004p4 0x0.0p0 F +REG epsg:6579 1 OK -0x1.925736575ccbp18 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:6579 2 OK 0x1.a080e6caeb993p21 0x1.4ca5b3e0fe6b6p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffff3p3 0x0.0p0 F +REG epsg:6579 3 OK 0x1.47c634c0d12bp16 0x1.097e212fc44c2p23 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:6579 4 OK 0x1.63f7ce59f9768p21 0x1.097e212fc44c2p23 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4c00000000002p5 0x0.0p0 F +REG epsg:6580 0 OK 0x1.6e36p20 0x1.6b3f181ccaf38p22 0x0.0p0 -0x1.9p6 0x1.a7fffffffff3dp4 0x0.0p0 F +REG epsg:6580 1 OK -0x1.9da60efa07794p18 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:6580 2 OK 0x1.a1eac1df40efp21 0x1.0c819d8be7dddp22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.6fffffffffe1fp3 0x0.0p0 F +REG epsg:6580 3 OK 0x1.4e6b2e2b90abp16 0x1.d7918821cdb8p22 0x0.0p0 -0x1.d30b4518d4133p6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:6580 4 OK 0x1.63c2a68ea37a8p21 0x1.d7918821cdb8p22 0x0.0p0 -0x1.4cf4bae72becep6 0x1.4bfffffffffecp5 0x0.0p0 F +REG epsg:6581 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:6581 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:6581 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:6581 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:6581 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:6582 0 OK 0x1.4064d55810628p19 0x1.c0fe8fdb31172p21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG epsg:6582 1 OK -0x1.3f2832962a478p17 0x1.61539a6f805e3p21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG epsg:6582 2 OK 0x1.6849dbaad5aa6p20 0x1.61539a6f805e3p21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG epsg:6582 3 OK -0x1.d6bce3b2d8b88p16 0x1.11a734805e99cp22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:6582 4 OK 0x1.5dd0a3933ded1p20 0x1.11a734805e99cp22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG epsg:6583 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:6583 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:6583 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:6583 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:6583 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:6584 0 OK 0x1.e097400000006p20 0x1.aa07448f1fd21p22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG epsg:6584 1 OK 0x1.0e08d221ed162p20 0x1.77a266cdd0422p22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:6584 2 OK 0x1.5992d6ef09755p21 0x1.77a266cdd0422p22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG epsg:6584 3 OK 0x1.18ae070a3968ap20 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:6584 4 OK 0x1.54403c7ae34c1p21 0x1.ddc50c43a4fcp22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG epsg:6585 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:6585 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:6585 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:6585 3 OK 0x1.ee847b1cd767p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:6585 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:6586 0 OK 0x1.e097400000009p19 0x1.0050fa905671ap24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG epsg:6586 1 OK 0x1.5a737b344956cp17 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:6586 2 OK 0x1.b548d09976d6ep20 0x1.e8d4dcffe75a7p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG epsg:6586 3 OK 0x1.959b7d15aec24p17 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:6586 4 OK 0x1.ade3d05d4a296p20 0x1.0c736d9d8321cp24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG epsg:6587 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:6587 1 OK 0x1.39170370f731bp18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:6587 2 OK 0x1.ad647e4784668p19 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:6587 3 OK 0x1.45cd37c6ce462p18 0x1.0d334102db22ep22 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:6587 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db22ep22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:6588 0 OK 0x1.e097400000006p20 0x1.9e15d995fed96p23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG epsg:6588 1 OK 0x1.00cc87766a532p20 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:6588 2 OK 0x1.6030fc44cad64p21 0x1.833abe4c7b5aep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG epsg:6588 3 OK 0x1.0b39a79d764fp20 0x1.b999bb2d94beep23 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:6588 4 OK 0x1.5afa6c3144d86p21 0x1.b999bb2d94beep23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG epsg:6589 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:6589 1 OK -0x1.86b2371ea2d1p16 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6589 2 OK 0x1.0c8f2371ea2d6p20 -0x1.047ce668d6ec6p19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6589 3 OK -0x1.5297458080bap13 0x1.1a3752e74fe61p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6589 4 OK 0x1.ed925d1602037p19 0x1.1a3752e74fe62p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6590 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG epsg:6590 1 OK -0x1.4073c60f9185cp18 -0x1.ab4f057cd578dp20 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6590 2 OK 0x1.b88c836cbfdp21 -0x1.ab4f057cd578cp20 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6590 3 OK -0x1.15b70f8c8cdp15 0x1.cef3b6d2b39a1p20 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6590 4 OK 0x1.94d4e6e8ffd27p21 0x1.cef3b6d2b39a2p20 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6591 0 OK 0x0.0p0 0x1.7b57e7a4b3001p17 0x0.0p0 -0x1.3ep6 0x1.2dfffffffffddp5 0x0.0p0 F +REG epsg:6591 1 OK -0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:6591 2 OK 0x1.8ee3e8aedb0bep18 -0x1.6898668b838f8p17 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.11fffffffffc9p5 0x0.0p0 F +REG epsg:6591 3 OK -0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.4fb4c0980fa7fp6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:6591 4 OK 0x1.6a989b32f1966p18 0x1.20f15ece62243p19 0x0.0p0 -0x1.2c4b3f67f0581p6 0x1.49fffffffffebp5 0x0.0p0 F +REG epsg:6592 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:6592 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:6592 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:6592 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:6592 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:6593 0 OK 0x1.5e6e495581066p23 0x1.a18871711cb3ap22 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG epsg:6593 1 OK 0x1.4cf5197041c02p23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:6593 2 OK 0x1.6fe7793ac04cap23 0x1.7fd2a21fc512dp22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG epsg:6593 3 OK 0x1.4daf24ae7391ap23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:6593 4 OK 0x1.6f2d6dfc8e7b2p23 0x1.c3fa9abc48eabp22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG epsg:6594 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:6594 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:6594 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:6594 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6491p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:6594 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6491p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:6595 0 OK 0x1.5e6e495581066p23 0x1.b4c9df24ac0d8p21 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG epsg:6595 1 OK 0x1.4bcff5cb476d5p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:6595 2 OK 0x1.710c9cdfba9f7p23 0x1.6d000dc7b0a56p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG epsg:6595 3 OK 0x1.4c99ab85b93fcp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:6595 4 OK 0x1.7042e72548cdp23 0x1.fe2bf52fc2e04p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG epsg:6596 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:6596 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:6596 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:6596 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6596 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6597 0 OK 0x1.907e0aac08315p20 0x1.34b943da25dc3p18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG epsg:6597 1 OK 0x1.e1046a555e29ep19 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:6597 2 OK 0x1.183cf016b0a7cp21 -0x1.2a05dbbd41b1fp18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG epsg:6597 3 OK 0x1.f5bf3365debffp19 0x1.d42f38a973c76p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6597 4 OK 0x1.130e3dd290822p21 0x1.d42f38a973c76p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG epsg:6598 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:6598 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fbap16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:6598 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fbap16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:6598 3 OK 0x1.16844fa8b2f1cp18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:6598 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:6599 0 OK 0x1.907e0aac08315p20 0x1.641db43fe1665p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG epsg:6599 1 OK 0x1.aeba938e29b6cp19 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:6599 2 OK 0x1.24cf65c87dc3ap21 -0x1.5696ad3494d03p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG epsg:6599 3 OK 0x1.c8e23804965acp19 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:6599 4 OK 0x1.1e457caae29aap21 0x1.0e4ce207389b7p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG epsg:6600 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:6600 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:6600 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:6600 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:6600 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:6601 0 OK 0x1.e097400000006p20 0x1.373abe8baa894p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG epsg:6601 1 OK 0x1.4071ade5988bep20 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:6601 2 OK 0x1.405e690d33ba7p21 -0x1.2f340d393d6fp18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG epsg:6601 3 OK 0x1.4849917f14ad2p20 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:6601 4 OK 0x1.3c72774075a9dp21 0x1.d6c21ef5506a1p19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG epsg:6602 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:6602 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:6602 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:6602 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:6602 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:6603 0 OK 0x1.e097400000006p20 0x1.4edb0661224aep18 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG epsg:6603 1 OK 0x1.342a71c0862adp20 -0x1.460752e85b78bp18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:6603 2 OK 0x1.4682071fbcebp21 -0x1.460752e85b78bp18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG epsg:6603 3 OK 0x1.3ccb5e7f95feap20 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:6603 4 OK 0x1.423190c035011p21 0x1.fa986b97cb6a8p19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG epsg:6604 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:6604 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:6604 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:6604 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:6604 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:6605 0 OK 0x1.e097400000006p20 0x1.28adfc81f1783p18 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:6605 1 OK 0x1.477bd35a7b7f1p20 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:6605 2 OK 0x1.3cd95652c240ep21 -0x1.1fe0500f281bep18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:6605 3 OK 0x1.500ba7b16b424p20 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:6605 4 OK 0x1.38916c274a5f4p21 0x1.c143a7a70eb8bp19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:6606 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:6606 1 OK 0x1.96b30a2e34c9p18 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:6606 2 OK 0x1.7e967ae8e59b8p19 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:6606 3 OK 0x1.a0c3f35264cb7p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:6606 4 OK 0x1.798e0656cd9a4p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:6607 0 OK 0x1.e097400000006p20 0x1.1ce0d17f7cab7p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG epsg:6607 1 OK 0x1.4d9405f33b671p20 -0x1.1462814d34f12p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:6607 2 OK 0x1.39cd3d06624cep21 -0x1.1462814d34f12p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG epsg:6607 3 OK 0x1.55d5a07b34e9ep20 0x1.af67f5201dffp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:6607 4 OK 0x1.35ac6fc2658b7p21 0x1.af67f5201dffp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG epsg:6608 0 OK 0x1.24f8p19 0x1.c0697505b68fdp16 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:6608 1 OK 0x1.615ed51025e25p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:6608 2 OK 0x1.99409577ed0e4p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:6608 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:6608 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:6609 0 OK 0x1.e097400000006p20 0x1.6fca8cd604f09p18 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG epsg:6609 1 OK 0x1.21d65e6fa50cp20 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:6609 2 OK 0x1.4fac10c82d79ep21 -0x1.62f2a3777f0e7p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG epsg:6609 3 OK 0x1.2e4ecb4ca001cp20 0x1.16ea191559a8fp20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:6609 4 OK 0x1.496fda59afffp21 0x1.16ea191559a8fp20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG epsg:6610 0 OK 0x1.fbdp18 -0x1.117p22 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG epsg:6610 1 OK -0x1.11350e7d86a1p15 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:6610 2 OK 0x1.0671a873ec34ap20 -0x1.334c6b6e7ebcep22 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae14p2 0x0.0p0 F +REG epsg:6610 3 OK -0x1.11350e7d86a1p15 -0x1.df27292302865p21 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6610 4 OK 0x1.0671a873ec34ap20 -0x1.df27292302865p21 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6611 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:6611 1 OK -0x1.83ac2769fab28p18 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6611 2 OK 0x1.852613b4fd58ap19 -0x1.053b9f9c695ap19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6611 3 OK -0x1.3283c083e845cp18 0x1.197f5851c9bdap19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6611 4 OK 0x1.5c91e041f4226p19 0x1.197f5851c9bd9p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6612 0 OK 0x1.4064d5559b3d4p19 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG epsg:6612 1 OK -0x1.3df8e1d20ab9dp20 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6612 2 OK 0x1.3f2edb93d2fbp21 -0x1.ac87e3296ef47p20 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6612 3 OK -0x1.f6cfcee5c363p19 0x1.cdc5e985502abp20 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6612 4 OK 0x1.1de65e643e76fp21 0x1.cdc5e985502aap20 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6613 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:6613 1 OK -0x1.80b84ed3f5628p17 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6613 2 OK 0x1.e6ce13b4fd594p19 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6613 3 OK -0x1.bccf020fa113p16 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6613 4 OK 0x1.be39e041f422ep19 0x1.4a535851c9bdap19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6614 0 OK 0x1.4064d5553261cp20 0x1.4064d554c9862p18 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:6614 1 OK -0x1.3b8cee4f4beb4p19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6614 2 OK 0x1.8f4810e9055d2p21 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6614 3 OK -0x1.6cd5f321f3b6p18 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6614 4 OK 0x1.6dff93b970d8fp21 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6615 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:6615 1 OK 0x1.8c87b12c0a9bp17 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6615 2 OK 0x1.550f09da7eac5p20 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6615 3 OK 0x1.176c3f7c17ba4p18 0x1.4a535851c9bdap19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6615 4 OK 0x1.40c4f020fa113p20 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6616 0 OK 0x1.4064d55566cf7p21 0x1.4064d554c9862p18 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG epsg:6616 1 OK 0x1.453cbc5bea8cep19 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6616 2 OK 0x1.17bd3dc9e97d9p22 -0x1.5c6eadd43c92ep20 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6616 3 OK 0x1.ca5eb11a3c9d8p19 0x1.0eef8f6d41462p21 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6616 4 OK 0x1.0718ff321f3b8p22 0x1.0eef8f6d41461p21 0x0.0p0 -0x1.9e0816808ff29p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6617 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:6617 1 OK 0x1.79ec4b02a6cp11 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6617 2 OK 0x1.243b09da7eacap20 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6617 3 OK 0x1.5070fdf05ee9p16 0x1.197f5851c9bdap19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6617 4 OK 0x1.0ff0f020fa117p20 0x1.197f5851c9bdap19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6618 0 OK 0x1.e097400000006p20 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG epsg:6618 1 OK 0x1.35f9c193d3f8p13 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6618 2 OK 0x1.df61463e6c2c6p21 -0x1.ac87e3296ef46p20 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG epsg:6618 3 OK 0x1.13f3b78942c1p18 0x1.cdc5e985502abp20 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6618 4 OK 0x1.be18c90ed7a84p21 0x1.cdc5e985502abp20 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG epsg:6619 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:6619 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:6619 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:6619 3 OK 0x1.e92fa135fb9ffp17 0x1.23c16caecd927p21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:6619 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd927p21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:6620 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:6620 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:6620 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:6620 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:6620 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:6621 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:6621 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:6621 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:6621 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:6621 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:6622 0 OK 0x0.0p0 0x1.b11f865aa09bep19 0x0.0p0 -0x1.12p6 0x1.9fffffffffbaap5 0x0.0p0 F +REG epsg:6622 1 OK -0x1.0b3a102762b28p21 -0x1.939aa034d63p18 0x0.0p0 -0x1.7374c68e6ad1bp6 0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:6622 2 OK 0x1.0b3a102762b29p21 -0x1.939aa034d63p18 0x0.0p0 -0x1.611672e32a5cbp5 0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:6622 3 OK -0x1.0533a90ea204cp20 0x1.4f35822fcef41p21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff6p6 0x0.0p0 F +REG epsg:6622 4 OK 0x1.0533a90ea204dp20 0x1.4f35822fcef41p21 0x0.0p0 -0x1.611672e32a5cbp5 0x1.0bffffffffff6p6 0x0.0p0 F +REG epsg:6623 0 OK 0x0.0p0 0x1.b382268f34de3p19 0x0.0p0 -0x1.12p6 0x1.a000000000001p5 0x0.0p0 F +REG epsg:6623 1 OK -0x1.09f993cad1c3ap21 -0x1.83138c6d71d66p18 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.27ffffffffffep5 0x0.0p0 F +REG epsg:6623 2 OK 0x1.09f993cad1c3ap21 -0x1.83138c6d71d66p18 0x0.0p0 -0x1.611672e32a5cdp5 0x1.27ffffffffffep5 0x0.0p0 F +REG epsg:6623 3 OK -0x1.07898af317a48p20 0x1.4e8d0d390372cp21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffffbp6 0x0.0p0 F +REG epsg:6623 4 OK 0x1.07898af317a49p20 0x1.4e8d0d390372cp21 0x0.0p0 -0x1.611672e32a5cdp5 0x1.0bffffffffffbp6 0x0.0p0 F +REG epsg:6624 0 OK 0x0.0p0 0x1.b382268f34de3p19 0x0.0p0 -0x1.12p6 0x1.a000000000001p5 0x0.0p0 F +REG epsg:6624 1 OK -0x1.09f993cad1c3ap21 -0x1.83138c6d71d66p18 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.27ffffffffffep5 0x0.0p0 F +REG epsg:6624 2 OK 0x1.09f993cad1c3ap21 -0x1.83138c6d71d66p18 0x0.0p0 -0x1.611672e32a5cdp5 0x1.27ffffffffffep5 0x0.0p0 F +REG epsg:6624 3 OK -0x1.07898af317a48p20 0x1.4e8d0d390372cp21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffffbp6 0x0.0p0 F +REG epsg:6624 4 OK 0x1.07898af317a49p20 0x1.4e8d0d390372cp21 0x0.0p0 -0x1.611672e32a5cdp5 0x1.0bffffffffffbp6 0x0.0p0 F +REG epsg:6625 0 OK 0x1.907e0aaacd9ecp20 0x1.aa3e4bb76c698p22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG epsg:6625 1 OK 0x1.7593893be5e41p19 0x1.77a131b627cc9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:6625 2 OK 0x1.3319285bd4254p21 0x1.77a131b627cc9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG epsg:6625 3 OK 0x1.913c06bbf6b0cp19 0x1.de99c6df35e9p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:6625 4 OK 0x1.2c2f08fbcff22p21 0x1.de99c6df35e9p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG epsg:6626 0 OK 0x1.907e0aaacd9ecp20 0x1.b0bc7a657e017p21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG epsg:6626 1 OK 0x1.0c2d55f29f20ap20 0x1.70fa64a012202p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:6626 2 OK 0x1.0a675fb17e0e7p21 0x1.70fa64a012202p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG epsg:6626 3 OK 0x1.11e2b89aed1aep20 0x1.f1f0137167a99p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:6626 4 OK 0x1.078cae5d57115p21 0x1.f1f0137167a99p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG epsg:6627 0 OK 0x1.907e0aaacd9ecp20 0x1.35b8c9df6e973p23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG epsg:6627 1 OK 0x1.edaaf48d75935p19 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:6627 2 OK 0x1.15134d8770397p21 0x1.233bb9f5ea37ep23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG epsg:6627 3 OK 0x1.fb4045b9b4a78p19 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:6627 4 OK 0x1.11adf93c60746p21 0x1.48a3ab51d35a6p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG epsg:6628 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG epsg:6628 1 OK -0x1.189e532ce2828p16 -0x1.0b145d531a7efp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG epsg:6628 2 OK 0x1.05ade532ce282p20 -0x1.0b145d531a7efp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG epsg:6628 3 OK -0x1.2e8eb60eec2fp15 0x1.1337c2eae2b2fp19 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG epsg:6628 4 OK 0x1.fb30eb60eec2fp19 0x1.1337c2eae2b2fp19 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG epsg:6629 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG epsg:6629 1 OK -0x1.1e4804260d93p16 -0x1.0ac07b5fe1fdbp19 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG epsg:6629 2 OK 0x1.0608804260d9ep20 -0x1.0ac07b5fe1fdap19 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG epsg:6629 3 OK -0x1.2379871f4e76p15 0x1.139768118dd2p19 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG epsg:6629 4 OK 0x1.fa7f9871f4e8cp19 0x1.139768118dd21p19 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532545p4 0x0.0p0 F +REG epsg:6630 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG epsg:6630 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:6630 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:6630 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:6630 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:6631 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG epsg:6631 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG epsg:6631 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG epsg:6631 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG epsg:6631 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG epsg:6632 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG epsg:6632 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG epsg:6632 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG epsg:6632 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG epsg:6632 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG epsg:6633 0 OK 0x1.907e0aaacd9ecp20 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG epsg:6633 1 OK -0x1.daf24a1372338p17 -0x1.b54aa78e6cebep20 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:6633 2 OK 0x1.ae2d2f4c04c2p21 -0x1.b54aa78e6cebep20 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG epsg:6633 3 OK -0x1.d40be5bffd3ep16 0x1.c470db440df0cp20 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:6633 4 OK 0x1.9f1e69d8cd88bp21 0x1.c470db440df0cp20 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG epsg:6634 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG epsg:6634 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 -0x1.4p2 0x0.0p0 F +REG epsg:6634 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 -0x1.4p2 0x0.0p0 F +REG epsg:6634 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.48p7 0x1.4p2 0x0.0p0 F +REG epsg:6634 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.34p7 0x1.4p2 0x0.0p0 F +REG epsg:6635 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG epsg:6635 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6635 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 -0x1.4p2 0x0.0p0 F +REG epsg:6635 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3cp7 0x1.4p2 0x0.0p0 F +REG epsg:6635 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p7 0x1.4p2 0x0.0p0 F +REG epsg:6636 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:6636 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6636 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6636 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6636 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6637 0 OK 0x1.86ap16 0x1.86ap17 0x0.0p0 0x1.218p7 0x1.bp3 0x0.0p0 F +REG epsg:6637 1 OK -0x1.c7f51360461e8p18 -0x1.551f4bc2b7d18p18 0x0.0p0 0x1.173741d1a2fbdp7 0x1.0fffffffebe3p3 0x0.0p0 F +REG epsg:6637 2 OK 0x1.45a289b0230f4p19 -0x1.551f4bc2b7d18p18 0x0.0p0 0x1.2bc8be2e5d044p7 0x1.0fffffffebe3p3 0x0.0p0 F +REG epsg:6637 3 OK -0x1.b134bbeee356p18 0x1.739b68ba1ce51p19 0x0.0p0 0x1.173741d1955c4p7 0x1.27ffffffee2e6p4 0x0.0p0 F +REG epsg:6637 4 OK 0x1.3a425df771abp19 0x1.739b68ba1ce51p19 0x0.0p0 0x1.2bc8be2e6aa3cp7 0x1.27ffffffee2e6p4 0x0.0p0 F +REG epsg:6646 0 OK 0x1.86c351d38662fp19 -0x1.c5a0557f39ec1p4 0x1.964da83dp3 0x1.7400000000001p5 0x1.d06b98580964cp4 -0x1.8p-29 F +REG epsg:6646 1 OK 0x1.aa4accd1410f4p17 -0x1.08903ceb3e496p19 -0x1.433929348p3 0x1.464113b49618ep5 0x1.806b9857d79c4p4 0x1.cp-28 F +REG epsg:6646 2 OK 0x1.5179f86f5a0a4p20 -0x1.08903ce237631p19 0x1.4ad980cd2p5 0x1.a1beec4b6a235p5 0x1.806b9857d7508p4 -0x1.0p-28 F +REG epsg:6646 3 OK 0x1.09c71e1b6608cp18 0x1.15bd1778302bcp19 -0x1.98d79f208p3 0x1.464113b48c15ep5 0x1.1035cc2bcdd35p5 0x1.cp-28 F +REG epsg:6646 4 OK 0x1.44518a729a8d2p20 0x1.15bd178091b0fp19 0x1.0f5290e22p5 0x1.a1beec4b74283p5 0x1.1035cc2bcd7bp5 -0x1.8p-28 F +REG epsg:6649 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6649 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6649 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6649 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6649 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6650 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6650 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6650 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6650 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6650 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6651 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6651 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6651 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6651 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6651 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6652 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6652 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6652 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6652 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6652 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6653 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6653 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6653 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6653 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6653 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6654 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6654 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6654 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6654 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6654 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6655 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6655 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6655 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6655 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6655 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6656 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6656 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6656 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6656 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6656 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6657 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6657 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6657 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6657 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6657 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6658 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6658 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6658 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6658 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6658 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6659 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6659 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6659 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6659 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6659 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6660 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6660 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6660 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6660 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6660 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6661 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6661 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6661 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6661 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6661 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6662 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6662 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6662 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6662 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6662 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6663 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6663 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6663 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6663 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6663 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6664 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6664 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6664 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6664 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6664 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6665 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6665 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6665 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6665 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6665 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6666 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6666 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6666 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6666 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6666 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6668 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6668 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6668 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6668 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6668 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6669 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.03p7 0x1.08p5 0x0.0p0 F +REG epsg:6669 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.ee27199592545p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:6669 2 OK 0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.0eec733536d5ep7 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:6669 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.ee271995a79bdp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:6669 4 OK 0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.0eec73352c322p7 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:6670 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.08p5 0x0.0p0 F +REG epsg:6670 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.f427199592544p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:6670 2 OK 0x1.1e99185b35cf5p19 -0x1.079d1e65d514p19 0x0.0p0 0x1.11ec733536d5ep7 0x1.bfffffffaa7b5p4 0x0.0p0 F +REG epsg:6670 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.f4271995a79bcp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:6670 4 OK 0x1.ff8aa2fffc27ap18 0x1.170e640889041p19 0x0.0p0 0x1.11ec73352c323p7 0x1.2fffffffa48f9p5 0x0.0p0 F +REG epsg:6671 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0855555555557p7 0x1.2p5 0x0.0p0 F +REG epsg:6671 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.f7f1ffa584661p6 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6671 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.14b1aad7e877dp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6671 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.f7f1ffa5b6a87p6 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6671 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.14b1aad7cf56ap7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6672 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0bp7 0x1.08p5 0x0.0p0 F +REG epsg:6672 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.fe27199592544p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG epsg:6672 2 OK 0x1.1e99185b35cf5p19 -0x1.079d1e65d514p19 0x0.0p0 0x1.16ec733536d5ep7 0x1.bfffffffaa7b5p4 0x0.0p0 F +REG epsg:6672 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.fe271995a79bcp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG epsg:6672 4 OK 0x1.ff8aa2fffc27ap18 0x1.170e640889041p19 0x0.0p0 0x1.16ec73352c323p7 0x1.2fffffffa48f9p5 0x0.0p0 F +REG epsg:6673 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0caaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG epsg:6673 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.004e552817883p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6673 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1907002d3dccfp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6673 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.004e552830a96p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6673 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1907002d24abcp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6674 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.2p5 0x0.0p0 F +REG epsg:6674 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.03a3aa7d6cddap7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6674 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1c5c558293227p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6674 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.03a3aa7d85fedp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6674 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1c5c55827a014p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6675 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1255555555557p7 0x1.2p5 0x0.0p0 F +REG epsg:6675 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.05f8ffd2c2331p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6675 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1eb1aad7e877dp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6675 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.05f8ffd2db544p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6675 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1eb1aad7cf56ap7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6676 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.15p7 0x1.2p5 0x0.0p0 F +REG epsg:6676 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.08a3aa7d6cdd9p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6676 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.215c558293226p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6676 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.08a3aa7d85fecp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6676 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.215c55827a013p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6677 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.17aaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG epsg:6677 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.0b4e552817883p7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6677 2 OK 0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.2407002d3dcdp7 0x1.efffffff78b22p4 0x0.0p0 F +REG epsg:6677 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.0b4e552830a96p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6677 4 OK 0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.2407002d24abdp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG epsg:6678 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.19aaaaaaaaaa9p7 0x1.4p5 0x0.0p0 F +REG epsg:6678 1 OK -0x1.23201c494f8a1p19 -0x1.0566f93f3781cp19 0x0.0p0 0x1.0c9cd2f1fe4c3p7 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6678 2 OK 0x1.23201c494f8a1p19 -0x1.0566f93f3781cp19 0x0.0p0 0x1.26b882635708fp7 0x1.17ffffff80dd2p5 0x0.0p0 F +REG epsg:6678 3 OK -0x1.f6861830d491cp18 0x1.19504fd8b077cp19 0x0.0p0 0x1.0c9cd2f234253p7 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6678 4 OK 0x1.f6861830d491cp18 0x1.19504fd8b077cp19 0x0.0p0 0x1.26b88263212ffp7 0x1.67ffffff24bcdp5 0x0.0p0 F +REG epsg:6679 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.188p7 0x1.6p5 0x0.0p0 F +REG epsg:6679 1 OK -0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.0a992e63a60fbp7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:6679 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2666d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:6679 3 OK -0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.0a992e640a525p7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:6679 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2666d19bf5adbp7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:6680 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1c8p7 0x1.6p5 0x0.0p0 F +REG epsg:6680 1 OK -0x1.262087c7cec8cp19 -0x1.03ddb3f855d8p19 0x0.0p0 0x1.0e992e63a60fap7 0x1.37ffffff10d88p5 0x0.0p0 F +REG epsg:6680 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2a66d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:6680 3 OK -0x1.f0767dc282fcap18 0x1.1ac080d27bb82p19 0x0.0p0 0x1.0e992e640a524p7 0x1.87fffffea2285p5 0x0.0p0 F +REG epsg:6680 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2a66d19bf5adcp7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:6681 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.208p7 0x1.6p5 0x0.0p0 F +REG epsg:6681 1 OK -0x1.262087c7cec8cp19 -0x1.03ddb3f855d8p19 0x0.0p0 0x1.12992e63a60fap7 0x1.37ffffff10d88p5 0x0.0p0 F +REG epsg:6681 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2e66d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG epsg:6681 3 OK -0x1.f0767dc282fcap18 0x1.1ac080d27bb82p19 0x0.0p0 0x1.12992e640a524p7 0x1.87fffffea2285p5 0x0.0p0 F +REG epsg:6681 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2e66d19bf5adcp7 0x1.87fffffea2284p5 0x0.0p0 F +REG epsg:6682 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1cp7 0x1.ap4 0x0.0p0 F +REG epsg:6682 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.10dfbd31358f9p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6682 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.272042ceca708p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6682 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.10dfbd312d01cp7 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:6682 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.272042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:6683 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fe00000000001p6 0x1.ap4 0x0.0p0 F +REG epsg:6683 1 OK -0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.e7bf7a626b1f1p6 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6683 2 OK 0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.0a2042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6683 3 OK -0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.e7bf7a625a037p6 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:6683 4 OK 0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.0a2042ced2fe5p7 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:6684 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fp6 0x1.ap4 0x0.0p0 F +REG epsg:6684 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.d9bf7a626b1f2p6 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6684 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.032042ceca708p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6684 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.d9bf7a625a038p6 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:6684 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.032042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:6685 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.ap4 0x0.0p0 F +REG epsg:6685 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.f5bf7a626b1f2p6 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6685 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.112042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6685 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.f5bf7a625a036p6 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:6685 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.112042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:6686 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.4p4 0x0.0p0 F +REG epsg:6686 1 OK -0x1.17bfa80c570dcp19 -0x1.0aceb1bfe8ccep19 0x0.0p0 0x1.055bb474834a2p7 0x1.dfffffffda459p3 0x0.0p0 F +REG epsg:6686 2 OK 0x1.17bfa80c570c5p19 -0x1.0aceb1bfe8ccfp19 0x0.0p0 0x1.1aa44b8b7cb5ep7 0x1.dfffffffda459p3 0x0.0p0 F +REG epsg:6686 3 OK -0x1.067ecfe186601p19 0x1.137d4b9ce03dfp19 0x0.0p0 0x1.055bb47474ecdp7 0x1.8fffffffde571p4 0x0.0p0 F +REG epsg:6686 4 OK 0x1.067ecfe1865ebp19 0x1.137d4b9ce03dfp19 0x0.0p0 0x1.1aa44b8b8b133p7 0x1.8fffffffde571p4 0x0.0p0 F +REG epsg:6687 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.34p7 0x1.ap4 0x0.0p0 F +REG epsg:6687 1 OK -0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.28dfbd31358f9p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6687 2 OK 0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.3f2042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG epsg:6687 3 OK -0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.28dfbd312d01cp7 0x1.efffffffb7d76p4 0x0.0p0 F +REG epsg:6687 4 OK 0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.3f2042ced2fe5p7 0x1.efffffffb7d74p4 0x0.0p0 F +REG epsg:6688 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:6688 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG epsg:6688 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p7 -0x1.4p2 0x0.0p0 F +REG epsg:6688 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG epsg:6688 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p7 0x1.4p2 0x0.0p0 F +REG epsg:6689 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG epsg:6689 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.fp6 -0x1.4p2 0x0.0p0 F +REG epsg:6689 2 OK 0x1.018fa874f5812p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:6689 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.fp6 0x1.4p2 0x0.0p0 F +REG epsg:6689 4 OK 0x1.018fa874f5812p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:6690 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG epsg:6690 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.04p7 -0x1.4p2 0x0.0p0 F +REG epsg:6690 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.18p7 -0x1.4p2 0x0.0p0 F +REG epsg:6690 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.04p7 0x1.4p2 0x0.0p0 F +REG epsg:6690 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.18p7 0x1.4p2 0x0.0p0 F +REG epsg:6691 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG epsg:6691 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p7 -0x1.4p2 0x0.0p0 F +REG epsg:6691 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.24p7 -0x1.4p2 0x0.0p0 F +REG epsg:6691 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p7 0x1.4p2 0x0.0p0 F +REG epsg:6691 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.24p7 0x1.4p2 0x0.0p0 F +REG epsg:6692 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG epsg:6692 1 OK -0x1.ad750e9eafdcp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1cp7 -0x1.4p2 0x0.0p0 F +REG epsg:6692 2 OK 0x1.018fa874f5812p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:6692 3 OK -0x1.ad750e9eafdcp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1cp7 0x1.4p2 0x0.0p0 F +REG epsg:6692 4 OK 0x1.018fa874f5812p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:6696 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6696 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6696 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6696 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6696 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6697 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6697 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6697 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6697 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6697 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6700 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6700 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6700 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6700 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6700 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6703 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 -0x1.dffffffffffffp5 0x0.0p0 0x0.0p0 T +REG epsg:6703 1 OK -0x1.ad750e7d838ap15 0x1.203eca48be405p23 0x0.0p0 -0x1.03ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6703 2 OK 0x1.018fa873ec1bfp20 0x1.203eca48be405p23 0x0.0p0 -0x1.b80000003aa03p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6703 3 OK -0x1.ad750e7d838ap15 0x1.421b35b741bfbp23 0x0.0p0 -0x1.03ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6703 4 OK 0x1.018fa873ec1bfp20 0x1.421b35b741bfbp23 0x0.0p0 -0x1.b80000003aa03p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6704 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6704 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6704 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6704 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6704 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6706 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6706 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6706 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6706 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6706 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6707 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:6707 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:6707 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:6707 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:6707 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:6708 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:6708 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:6708 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:6708 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:6708 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:6709 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:6709 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:6709 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:6709 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:6709 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:6720 0 OK 0x1.86ap15 0x1.3d62p20 0x0.0p0 0x1.a680000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:6720 1 OK -0x1.ed5d7b849028p18 0x1.6bc33a4b78373p19 0x0.0p0 0x1.928000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6720 2 OK 0x1.2782bdc248134p19 0x1.6bc33a4b78373p19 0x0.0p0 0x1.ba7fffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6720 3 OK -0x1.ed5d7b849028p18 0x1.c4e262da43e46p20 0x0.0p0 0x1.928000001d502p6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:6720 4 OK 0x1.2782bdc248134p19 0x1.c4e262da43e46p20 0x0.0p0 0x1.ba7fffffe2afep6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:6721 0 OK 0x1.86ap15 0x1.3d62p20 0x0.0p0 0x1.a680000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:6721 1 OK -0x1.ed5da40651a08p18 0x1.6bc3260c88303p19 0x0.0p0 0x1.928000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6721 2 OK 0x1.2782d20328cf8p19 0x1.6bc3260c88303p19 0x0.0p0 0x1.ba7fffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6721 3 OK -0x1.ed5da40651a08p18 0x1.c4e26cf9bbe7ep20 0x0.0p0 0x1.928000001d502p6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:6721 4 OK 0x1.2782d20328cf8p19 0x1.c4e26cf9bbe7ep20 0x0.0p0 0x1.ba7fffffe2afep6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:6722 0 OK 0x1.86ap15 0x1.55ccp20 0x0.0p0 0x1.838p6 0x0.0p0 0x0.0p0 T +REG epsg:6722 1 OK -0x1.ed5a26bdf2966p18 0x1.9c98e489140dbp19 0x0.0p0 0x1.6f8000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6722 2 OK 0x1.2781135ef94a7p19 0x1.9c98e489140dbp19 0x0.0p0 0x1.977fffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6722 3 OK -0x1.ed5a26bdf2966p18 0x1.dd4b8dbb75f92p20 0x0.0p0 0x1.6f8000001d502p6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:6722 4 OK 0x1.2781135ef94a7p19 0x1.dd4b8dbb75f92p20 0x0.0p0 0x1.977fffffe2afep6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:6723 0 OK 0x1.86ap15 0x1.6e36p20 0x0.0p0 0x1.838p6 0x0.0p0 0x0.0p0 T +REG epsg:6723 1 OK -0x1.ed594cedc7872p18 0x1.cd6d5167aedb9p19 0x0.0p0 0x1.6f8000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6723 2 OK 0x1.2780a676e3c2dp19 0x1.cd6d5167aedb9p19 0x0.0p0 0x1.977fffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6723 3 OK -0x1.ed594cedc7872p18 0x1.f5b5574c28924p20 0x0.0p0 0x1.6f8000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6723 4 OK 0x1.2780a676e3c2dp19 0x1.f5b5574c28924p20 0x0.0p0 0x1.977fffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6732 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.f8p5 -0x1.9p4 0x0.0p0 F +REG epsg:6732 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6732 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6732 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.4p4 0x0.0p0 F +REG epsg:6732 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6733 0 OK 0x1.e847fffffffbep18 0x1.b997b102aac2p22 0x0.0p0 0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:6733 1 OK -0x1.fbe5023e2acap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6733 2 OK 0x1.f8272811f1531p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6733 3 OK -0x1.2fd8271ed49bp16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6733 4 OK 0x1.07218271ed47ep20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6734 0 OK 0x1.e847fffffffeap18 0x1.b997b102aac2p22 0x0.0p0 0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG epsg:6734 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6734 2 OK 0x1.f8272811f153dp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6734 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG epsg:6734 4 OK 0x1.07218271ed484p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6735 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.44p6 -0x1.9p4 0x0.0p0 F +REG epsg:6735 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6735 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6735 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6735 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6736 0 OK 0x1.e847fffffffeap18 0x1.b997b102aac2p22 0x0.0p0 0x1.74p6 -0x1.9p4 0x0.0p0 F +REG epsg:6736 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6736 2 OK 0x1.f8272811f153dp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:6736 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG epsg:6736 4 OK 0x1.07218271ed484p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.8a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6737 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.8cp6 -0x1.9p4 0x0.0p0 F +REG epsg:6737 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6737 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6737 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6737 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.a2114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6738 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:6738 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6738 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:6738 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6738 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:6781 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6781 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6781 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6781 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6781 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6783 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6783 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6783 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6783 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6783 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6784 0 OK 0x1.388p15 0x0.0p0 0x0.0p0 -0x1.d755555555553p6 0x1.64p5 0x0.0p0 F +REG epsg:6784 1 OK -0x1.1313085940aecp19 -0x1.03b92209b4002p19 0x0.0p0 -0x1.f35fbcccf6d85p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6784 2 OK 0x1.3a23085940aecp19 -0x1.03b92209b4002p19 0x0.0p0 -0x1.bb4aedddb3d21p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6784 3 OK -0x1.c8b65807de2b1p18 0x1.1b03b1594514bp19 0x0.0p0 -0x1.f35fbccc1ee9ap6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6784 4 OK 0x1.0b6b2c03ef158p19 0x1.1b03b1594514bp19 0x0.0p0 -0x1.bb4aedde8bc0cp6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6785 0 OK 0x1.0050cc432ca57p17 0x0.0p0 0x0.0p0 -0x1.d755555555553p6 0x1.64p5 0x0.0p0 F +REG epsg:6785 1 OK -0x1.c33cc928ec564p20 -0x1.aa0e1999a8f4bp20 0x0.0p0 -0x1.f35fbcccf6d85p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6785 2 OK 0x1.01a87e1cdbbfdp21 -0x1.aa0e1999a8f4bp20 0x0.0p0 -0x1.bb4aedddb3d21p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6785 3 OK -0x1.7699977d62731p20 0x1.d04333b969423p20 0x0.0p0 -0x1.f35fbccc1ee9ap6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6785 4 OK 0x1.b6adca8e2d9c7p20 0x1.d04333b969423p20 0x0.0p0 -0x1.bb4aedde8bc0cp6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6786 0 OK 0x1.388p15 0x0.0p0 0x0.0p0 -0x1.d755555555553p6 0x1.64p5 0x0.0p0 F +REG epsg:6786 1 OK -0x1.1313085940aecp19 -0x1.03b92209b4002p19 0x0.0p0 -0x1.f35fbcccf6d85p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6786 2 OK 0x1.3a23085940aecp19 -0x1.03b92209b4002p19 0x0.0p0 -0x1.bb4aedddb3d21p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6786 3 OK -0x1.c8b65807de2b1p18 0x1.1b03b1594514bp19 0x0.0p0 -0x1.f35fbccc1ee9ap6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6786 4 OK 0x1.0b6b2c03ef158p19 0x1.1b03b1594514bp19 0x0.0p0 -0x1.bb4aedde8bc0cp6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6787 0 OK 0x1.0050cc432ca57p17 0x0.0p0 0x0.0p0 -0x1.d755555555553p6 0x1.64p5 0x0.0p0 F +REG epsg:6787 1 OK -0x1.c33cc928ec564p20 -0x1.aa0e1999a8f4bp20 0x0.0p0 -0x1.f35fbcccf6d85p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6787 2 OK 0x1.01a87e1cdbbfdp21 -0x1.aa0e1999a8f4bp20 0x0.0p0 -0x1.bb4aedddb3d21p6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6787 3 OK -0x1.7699977d62731p20 0x1.d04333b969423p20 0x0.0p0 -0x1.f35fbccc1ee9ap6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6787 4 OK 0x1.b6adca8e2d9c7p20 0x1.d04333b969423p20 0x0.0p0 -0x1.bb4aedde8bc0cp6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6788 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.e700000000001p6 0x1.4ep5 0x0.0p0 F +REG epsg:6788 1 OK -0x1.fad6f0f785798p18 -0x1.04d69b083987p19 0x0.0p0 -0x1.00e75f19682b7p7 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6788 2 OK 0x1.4b8b787bc2bdfp19 -0x1.04d69b083986fp19 0x0.0p0 -0x1.cc3141cd2fa92p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6788 3 OK -0x1.a5fea0bc1dbbcp18 0x1.1a0328e2ddf2dp19 0x0.0p0 -0x1.00e75f1920dc1p7 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6788 4 OK 0x1.211f505e0edefp19 0x1.1a0328e2ddf2fp19 0x0.0p0 -0x1.cc3141cdbe47ep6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6789 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.e700000000001p6 0x1.4ep5 0x0.0p0 F +REG epsg:6789 1 OK -0x1.9fb70421b373p20 -0x1.abe2651ef638dp20 0x0.0p0 -0x1.00e75f19682b7p7 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6789 2 OK 0x1.0fefb521a4e3dp21 -0x1.abe2651ef638bp20 0x0.0p0 -0x1.cc3141cd2fa92p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6789 3 OK -0x1.5a1fcc673bc19p20 0x1.ce9e614e87a32p20 0x0.0p0 -0x1.00e75f1920dc1p7 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6789 4 OK 0x1.da483288d2161p20 0x1.ce9e614e87a34p20 0x0.0p0 -0x1.cc3141cdbe47ep6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6790 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.e700000000001p6 0x1.4ep5 0x0.0p0 F +REG epsg:6790 1 OK -0x1.fad6f0f785798p18 -0x1.04d69b083987p19 0x0.0p0 -0x1.00e75f19682b7p7 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6790 2 OK 0x1.4b8b787bc2bdfp19 -0x1.04d69b083986fp19 0x0.0p0 -0x1.cc3141cd2fa92p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6790 3 OK -0x1.a5fea0bc1dbbcp18 0x1.1a0328e2ddf2dp19 0x0.0p0 -0x1.00e75f1920dc1p7 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6790 4 OK 0x1.211f505e0edefp19 0x1.1a0328e2ddf2fp19 0x0.0p0 -0x1.cc3141cdbe47ep6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6791 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.e700000000001p6 0x1.4ep5 0x0.0p0 F +REG epsg:6791 1 OK -0x1.9fb70421b373p20 -0x1.abe2651ef638dp20 0x0.0p0 -0x1.00e75f19682b7p7 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6791 2 OK 0x1.0fefb521a4e3dp21 -0x1.abe2651ef638bp20 0x0.0p0 -0x1.cc3141cd2fa92p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6791 3 OK -0x1.5a1fcc673bc19p20 0x1.ce9e614e87a32p20 0x0.0p0 -0x1.00e75f1920dc1p7 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6791 4 OK 0x1.da483288d2161p20 0x1.ce9e614e87a34p20 0x0.0p0 -0x1.cc3141cdbe47ep6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6792 0 OK 0x1.388p16 0x1.fbdp16 0x0.0p0 -0x1.e4fffffffffffp6 0x1.6555555555548p5 0x0.0p0 F +REG epsg:6792 1 OK -0x1.0040f0538e682p19 -0x1.86a98861e9368p18 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6792 2 OK 0x1.4e60f0538e66fp19 -0x1.86a98861e9368p18 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6792 3 OK -0x1.a2e30426d3dc3p18 0x1.5a01aba53d725p19 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6792 4 OK 0x1.1f91821369ed2p19 0x1.5a01aba53d71fp19 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6793 0 OK 0x1.0050cc432ca57p18 0x1.a0834bedfa43fp18 0x0.0p0 -0x1.e4fffffffffffp6 0x1.6555555555548p5 0x0.0p0 F +REG epsg:6793 1 OK -0x1.a45d16aaaae03p20 -0x1.406cd0f40ea8dp20 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6793 2 OK 0x1.1242be6620988p21 -0x1.406cd0f40ea8dp20 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6793 3 OK -0x1.57933ad69cba9p20 0x1.1bcc49ee18fd4p21 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6793 4 OK 0x1.d7bba0f8330bbp20 0x1.1bcc49ee18fcfp21 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6794 0 OK 0x1.388p16 0x1.fbdp16 0x0.0p0 -0x1.e4fffffffffffp6 0x1.6555555555548p5 0x0.0p0 F +REG epsg:6794 1 OK -0x1.0040f0538e682p19 -0x1.86a98861e9368p18 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6794 2 OK 0x1.4e60f0538e66fp19 -0x1.86a98861e9368p18 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6794 3 OK -0x1.a2e30426d3dc3p18 0x1.5a01aba53d725p19 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6794 4 OK 0x1.1f91821369ed2p19 0x1.5a01aba53d71fp19 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6795 0 OK 0x1.0050cc432ca57p18 0x1.a0834bedfa43fp18 0x0.0p0 -0x1.e4fffffffffffp6 0x1.6555555555548p5 0x0.0p0 F +REG epsg:6795 1 OK -0x1.a45d16aaaae03p20 -0x1.406cd0f40ea8dp20 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6795 2 OK 0x1.1242be6620988p21 -0x1.406cd0f40ea8dp20 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.3d55555555538p5 0x0.0p0 F +REG epsg:6795 3 OK -0x1.57933ad69cba9p20 0x1.1bcc49ee18fd4p21 0x0.0p0 -0x1.008f81b53e6c1p7 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6795 4 OK 0x1.d7bba0f8330bbp20 0x1.1bcc49ee18fcfp21 0x0.0p0 -0x1.c8e0fc958327ep6 0x1.8d55555554ec2p5 0x0.0p0 F +REG epsg:6796 0 OK 0x1.d4cp16 0x1.d4cp15 0x0.0p0 -0x1.dfp6 0x1.5d55555555545p5 0x0.0p0 F +REG epsg:6796 1 OK -0x1.d7e54fde49406p18 -0x1.cbe93eeea7d78p18 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6796 2 OK 0x1.6122a7ef24a0cp19 -0x1.cbe93eeea7d78p18 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6796 3 OK -0x1.7d7d4423fae04p18 0x1.37777f8d45ae9p19 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6796 4 OK 0x1.33eea211fd70ap19 0x1.37777f8d45ae9p19 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6797 0 OK 0x1.80793264c2f83p18 0x1.80793264c2f83p17 0x0.0p0 -0x1.dfp6 0x1.5d55555555545p5 0x0.0p0 F +REG epsg:6797 1 OK -0x1.830db8c61e271p20 -0x1.793943685ed11p20 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6797 2 OK 0x1.21a528fc3fd21p21 -0x1.793943685ed11p20 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6797 3 OK -0x1.38e6be9bd67a3p20 0x1.feefb3ac9d27fp20 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6797 4 OK 0x1.f92357ce37f71p20 0x1.feefb3ac9d27fp20 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6798 0 OK 0x1.d4cp16 0x1.d4cp15 0x0.0p0 -0x1.dfp6 0x1.5d55555555545p5 0x0.0p0 F +REG epsg:6798 1 OK -0x1.d7e54fde49406p18 -0x1.cbe93eeea7d78p18 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6798 2 OK 0x1.6122a7ef24a0cp19 -0x1.cbe93eeea7d78p18 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6798 3 OK -0x1.7d7d4423fae04p18 0x1.37777f8d45ae9p19 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6798 4 OK 0x1.33eea211fd70ap19 0x1.37777f8d45ae9p19 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6799 0 OK 0x1.80793264c2f83p18 0x1.80793264c2f83p17 0x0.0p0 -0x1.dfp6 0x1.5d55555555545p5 0x0.0p0 F +REG epsg:6799 1 OK -0x1.830db8c61e271p20 -0x1.793943685ed11p20 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6799 2 OK 0x1.21a528fc3fd21p21 -0x1.793943685ed11p20 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.3555555555536p5 0x0.0p0 F +REG epsg:6799 3 OK -0x1.38e6be9bd67a3p20 0x1.feefb3ac9d27fp20 0x0.0p0 -0x1.faa5fe0c1f8adp6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6799 4 OK 0x1.f92357ce37f71p20 0x1.feefb3ac9d27fp20 0x0.0p0 -0x1.c35a01f3e0753p6 0x1.8555555554d93p5 0x0.0p0 F +REG epsg:6800 0 OK 0x1.388p15 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.54p5 0x0.0p0 F +REG epsg:6800 1 OK -0x1.117a34bb9d86fp19 -0x1.0483f3272cf6dp19 0x0.0p0 -0x1.043ae6c4330edp7 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6800 2 OK 0x1.388a34bb9d882p19 -0x1.0483f3272cf6dp19 0x0.0p0 -0x1.d234dd22448cbp6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6800 3 OK -0x1.cbda3a72f6821p18 0x1.1a3ef62fe6adap19 0x0.0p0 -0x1.043ae6c3e306p7 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6800 4 OK 0x1.0cfd1d397b421p19 0x1.1a3ef62fe6adcp19 0x0.0p0 -0x1.d234dd22e49e6p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG epsg:6801 0 OK 0x1.0050cc432ca57p17 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.54p5 0x0.0p0 F +REG epsg:6801 1 OK -0x1.c09e23703e16fp20 -0x1.ab5ace087ed76p20 0x0.0p0 -0x1.043ae6c4330edp7 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6801 2 OK 0x1.00592b4084a12p21 -0x1.ab5ace087ed75p20 0x0.0p0 -0x1.d234dd22448cbp6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6801 3 OK -0x1.792cf21fcec52p20 0x1.cf007afd46abfp20 0x0.0p0 -0x1.043ae6c3e306p7 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6801 4 OK 0x1.b941253099f04p20 0x1.cf007afd46ac1p20 0x0.0p0 -0x1.d234dd22e49e6p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG epsg:6802 0 OK 0x1.388p15 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.54p5 0x0.0p0 F +REG epsg:6802 1 OK -0x1.117a34bb9d86fp19 -0x1.0483f3272cf6dp19 0x0.0p0 -0x1.043ae6c4330edp7 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6802 2 OK 0x1.388a34bb9d882p19 -0x1.0483f3272cf6dp19 0x0.0p0 -0x1.d234dd22448cbp6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6802 3 OK -0x1.cbda3a72f6821p18 0x1.1a3ef62fe6adap19 0x0.0p0 -0x1.043ae6c3e306p7 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6802 4 OK 0x1.0cfd1d397b421p19 0x1.1a3ef62fe6adcp19 0x0.0p0 -0x1.d234dd22e49e6p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG epsg:6803 0 OK 0x1.0050cc432ca57p17 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.54p5 0x0.0p0 F +REG epsg:6803 1 OK -0x1.c09e23703e16fp20 -0x1.ab5ace087ed76p20 0x0.0p0 -0x1.043ae6c4330edp7 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6803 2 OK 0x1.00592b4084a12p21 -0x1.ab5ace087ed75p20 0x0.0p0 -0x1.d234dd22448cbp6 0x1.2bffffff4328ep5 0x0.0p0 F +REG epsg:6803 3 OK -0x1.792cf21fcec52p20 0x1.cf007afd46abfp20 0x0.0p0 -0x1.043ae6c3e306p7 0x1.7bfffffed9962p5 0x0.0p0 F +REG epsg:6803 4 OK 0x1.b941253099f04p20 0x1.cf007afd46ac1p20 0x0.0p0 -0x1.d234dd22e49e6p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG epsg:6804 0 OK 0x1.24f8p17 0x1.d4cp14 0x0.0p0 -0x1.e200000000001p6 0x1.6d5555555554bp5 0x0.0p0 F +REG epsg:6804 1 OK -0x1.bdbb2232a1ce8p18 -0x1.e75ff751f76eep18 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6804 2 OK 0x1.7159911950e87p19 -0x1.e75ff751f76eep18 0x0.0p0 -0x1.c5617c12bb76p6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6804 3 OK -0x1.5cc97f57ffabfp18 0x1.2989d6e2dce0bp19 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6804 4 OK 0x1.40e0bfabffd7p19 0x1.2989d6e2dce0bp19 0x0.0p0 -0x1.c5617c12bb76p6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6805 0 OK 0x1.e0977efec56d6p18 0x1.8079326809d49p16 0x0.0p0 -0x1.e200000000001p6 0x1.6d5555555554bp5 0x0.0p0 F +REG epsg:6805 1 OK -0x1.6d97cf1d3cd96p20 -0x1.8fbfee2118465p20 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6805 2 OK 0x1.2ef1c74e4fc9p21 -0x1.8fbfee2118465p20 0x0.0p0 -0x1.c5617c12bb76p6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6805 3 OK -0x1.1e1422e78f8ccp20 0x1.e8168621b5318p20 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6805 4 OK 0x1.072ff13379228p21 0x1.e8168621b5318p20 0x0.0p0 -0x1.c5617c12bb76p6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6806 0 OK 0x1.24f8p17 0x1.d4cp14 0x0.0p0 -0x1.e200000000001p6 0x1.6d5555555554bp5 0x0.0p0 F +REG epsg:6806 1 OK -0x1.bdbb2232a1ce8p18 -0x1.e75ff751f76eep18 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6806 2 OK 0x1.7159911950e87p19 -0x1.e75ff751f76eep18 0x0.0p0 -0x1.c5617c12bb76p6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6806 3 OK -0x1.5cc97f57ffabfp18 0x1.2989d6e2dce0bp19 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6806 4 OK 0x1.40e0bfabffd7p19 0x1.2989d6e2dce0bp19 0x0.0p0 -0x1.c5617c12bb76p6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6807 0 OK 0x1.e0977efec56d6p18 0x1.8079326809d49p16 0x0.0p0 -0x1.e200000000001p6 0x1.6d5555555554bp5 0x0.0p0 F +REG epsg:6807 1 OK -0x1.6d97cf1d3cd96p20 -0x1.8fbfee2118465p20 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6807 2 OK 0x1.2ef1c74e4fc9p21 -0x1.8fbfee2118465p20 0x0.0p0 -0x1.c5617c12bb76p6 0x1.455555555553dp5 0x0.0p0 F +REG epsg:6807 3 OK -0x1.1e1422e78f8ccp20 0x1.e8168621b5318p20 0x0.0p0 -0x1.fe9e83ed448ap6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6807 4 OK 0x1.072ff13379228p21 0x1.e8168621b5318p20 0x0.0p0 -0x1.c5617c12bb76p6 0x1.9555555554fdp5 0x0.0p0 F +REG epsg:6808 0 OK 0x1.48b635ae806ep17 0x1.6aa4ea9465bfp17 0x0.0p0 -0x1.ebfffffffffffp6 0x1.6f55555555547p5 0x0.0p0 F +REG epsg:6808 1 OK -0x1.acba2bb55a94p18 -0x1.4fce332fc19e8p18 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6808 2 OK 0x1.7a0d2198766ap19 -0x1.4eedde7d76b3p18 0x0.0p0 -0x1.cf408c03c1837p6 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6808 3 OK -0x1.49cfb0efbcf2p18 0x1.7579ed56d019cp19 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.975555555500bp5 0x0.0p0 F +REG epsg:6808 4 OK 0x1.49a58b9f4793p19 0x1.760f459e1fd9cp19 0x0.0p0 -0x1.cf408c03c1836p6 0x1.9755555555007p5 0x0.0p0 F +REG epsg:6809 0 OK 0x1.0d9cd75e7b14p19 0x1.2971c3c3f34ap19 0x0.0p0 -0x1.ebfffffffffffp6 0x1.6f55555555547p5 0x0.0p0 F +REG epsg:6809 1 OK -0x1.5fa5772ae35bp20 -0x1.136e55a85a5p20 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6809 2 OK 0x1.3614d95f2aefp21 -0x1.12b656116976p20 0x0.0p0 -0x1.cf408c03c1837p6 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6809 3 OK -0x1.0e83b7169373p20 0x1.3254373ee2f08p21 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.975555555500bp5 0x0.0p0 F +REG epsg:6809 4 OK 0x1.0e612595cf19p21 0x1.32ceb5bde98fp21 0x0.0p0 -0x1.cf408c03c1836p6 0x1.9755555555007p5 0x0.0p0 F +REG epsg:6810 0 OK 0x1.48b635ae806ep17 0x1.6aa4ea9465bfp17 0x0.0p0 -0x1.ebfffffffffffp6 0x1.6f55555555547p5 0x0.0p0 F +REG epsg:6810 1 OK -0x1.acba2bb55a94p18 -0x1.4fce332fc19e8p18 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6810 2 OK 0x1.7a0d2198766ap19 -0x1.4eedde7d76b3p18 0x0.0p0 -0x1.cf408c03c1837p6 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6810 3 OK -0x1.49cfb0efbcf2p18 0x1.7579ed56d019cp19 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.975555555500bp5 0x0.0p0 F +REG epsg:6810 4 OK 0x1.49a58b9f4793p19 0x1.760f459e1fd9cp19 0x0.0p0 -0x1.cf408c03c1836p6 0x1.9755555555007p5 0x0.0p0 F +REG epsg:6811 0 OK 0x1.0d9cd75e7b14p19 0x1.2971c3c3f34ap19 0x0.0p0 -0x1.ebfffffffffffp6 0x1.6f55555555547p5 0x0.0p0 F +REG epsg:6811 1 OK -0x1.5fa5772ae35bp20 -0x1.136e55a85a5p20 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6811 2 OK 0x1.3614d95f2aefp21 -0x1.12b656116976p20 0x0.0p0 -0x1.cf408c03c1837p6 0x1.475555555553ep5 0x0.0p0 F +REG epsg:6811 3 OK -0x1.0e83b7169373p20 0x1.3254373ee2f08p21 0x0.0p0 -0x1.045fb9fe1f3e5p7 0x1.975555555500bp5 0x0.0p0 F +REG epsg:6811 4 OK 0x1.0e612595cf19p21 0x1.32ceb5bde98fp21 0x0.0p0 -0x1.cf408c03c1836p6 0x1.9755555555007p5 0x0.0p0 F +REG epsg:6812 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6812 1 OK -0x1.0cd5f2c74bf95p19 -0x1.045f36a3b9427p19 0x0.0p0 -0x1.044d920626cb5p7 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6812 2 OK 0x1.3da9f2c74bfa8p19 -0x1.045f36a3b9425p19 0x0.0p0 -0x1.d20f869e5d13cp6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6812 3 OK -0x1.c18c34ce29dcep18 0x1.1a5aad997a05ap19 0x0.0p0 -0x1.044d9205d29adp7 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6812 4 OK 0x1.119a1a6714ef8p19 0x1.1a5aad997a05cp19 0x0.0p0 -0x1.d20f869f0574cp6 0x1.7eaaaaa978a9fp5 0x0.0p0 F +REG epsg:6813 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6813 1 OK -0x1.b900e59b63c3cp20 -0x1.ab1e8aae81e08p20 0x0.0p0 -0x1.044d920626cb5p7 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6813 2 OK 0x1.048d12b8654a8p21 -0x1.ab1e8aae81e05p20 0x0.0p0 -0x1.d20f869e5d13cp6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6813 3 OK -0x1.70b936bbb57b9p20 0x1.cf2df27205fbcp20 0x0.0p0 -0x1.044d9205d29adp7 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6813 4 OK 0x1.c0d276911c4c8p20 0x1.cf2df27205fbfp20 0x0.0p0 -0x1.d20f869f0574cp6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6814 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6814 1 OK -0x1.0cd5f2c74bf95p19 -0x1.045f36a3b9427p19 0x0.0p0 -0x1.044d920626cb5p7 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6814 2 OK 0x1.3da9f2c74bfa8p19 -0x1.045f36a3b9425p19 0x0.0p0 -0x1.d20f869e5d13cp6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6814 3 OK -0x1.c18c34ce29dcep18 0x1.1a5aad997a05ap19 0x0.0p0 -0x1.044d9205d29adp7 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6814 4 OK 0x1.119a1a6714ef8p19 0x1.1a5aad997a05cp19 0x0.0p0 -0x1.d20f869f0574cp6 0x1.7eaaaaa978a9fp5 0x0.0p0 F +REG epsg:6815 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6815 1 OK -0x1.b900e59b63c3cp20 -0x1.ab1e8aae81e08p20 0x0.0p0 -0x1.044d920626cb5p7 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6815 2 OK 0x1.048d12b8654a8p21 -0x1.ab1e8aae81e05p20 0x0.0p0 -0x1.d20f869e5d13cp6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG epsg:6815 3 OK -0x1.70b936bbb57b9p20 0x1.cf2df27205fbcp20 0x0.0p0 -0x1.044d9205d29adp7 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6815 4 OK 0x1.c0d276911c4c8p20 0x1.cf2df27205fbfp20 0x0.0p0 -0x1.d20f869f0574cp6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG epsg:6816 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.e4p6 0x1.64p5 0x0.0p0 F +REG epsg:6816 1 OK -0x1.ff0e86476734ap18 -0x1.03b5cf1cf753ap19 0x0.0p0 -0x1.000533bbd0c19p7 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6816 2 OK 0x1.4da74323b39a5p19 -0x1.03b5cf1cf753ap19 0x0.0p0 -0x1.c7f598885e7cep6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6816 3 OK -0x1.a19fffbc5ea96p18 0x1.1b00121d8adecp19 0x0.0p0 -0x1.000533bb64ca4p7 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6816 4 OK 0x1.1eefffde2f54bp19 0x1.1b00121d8adecp19 0x0.0p0 -0x1.c7f59889366b9p6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6817 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.e4p6 0x1.64p5 0x0.0p0 F +REG epsg:6817 1 OK -0x1.a32c804756165p20 -0x1.aa08a5b9ee699p20 0x0.0p0 -0x1.000533bbd0c19p7 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6817 2 OK 0x1.11aa733476348p21 -0x1.aa08a5b9ee699p20 0x0.0p0 -0x1.c7f598885e7cep6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6817 3 OK -0x1.568a49b1b02bcp20 0x1.d03d42ac1836ep20 0x0.0p0 -0x1.000533bb64ca4p7 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6817 4 OK 0x1.d6b2afd3467e8p20 0x1.d03d42ac1836ep20 0x0.0p0 -0x1.c7f59889366b9p6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6818 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.e4p6 0x1.64p5 0x0.0p0 F +REG epsg:6818 1 OK -0x1.ff0e86476734ap18 -0x1.03b5cf1cf753ap19 0x0.0p0 -0x1.000533bbd0c19p7 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6818 2 OK 0x1.4da74323b39a5p19 -0x1.03b5cf1cf753ap19 0x0.0p0 -0x1.c7f598885e7cep6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6818 3 OK -0x1.a19fffbc5ea96p18 0x1.1b00121d8adecp19 0x0.0p0 -0x1.000533bb64ca4p7 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6818 4 OK 0x1.1eefffde2f54bp19 0x1.1b00121d8adecp19 0x0.0p0 -0x1.c7f59889366b9p6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6819 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.e4p6 0x1.64p5 0x0.0p0 F +REG epsg:6819 1 OK -0x1.a32c804756165p20 -0x1.aa08a5b9ee699p20 0x0.0p0 -0x1.000533bbd0c19p7 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6819 2 OK 0x1.11aa733476348p21 -0x1.aa08a5b9ee699p20 0x0.0p0 -0x1.c7f598885e7cep6 0x1.3bfffffefd53bp5 0x0.0p0 F +REG epsg:6819 3 OK -0x1.568a49b1b02bcp20 0x1.d03d42ac1836ep20 0x0.0p0 -0x1.000533bb64ca4p7 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6819 4 OK 0x1.d6b2afd3467e8p20 0x1.d03d42ac1836ep20 0x0.0p0 -0x1.c7f59889366b9p6 0x1.8bfffffe8db6ep5 0x0.0p0 F +REG epsg:6820 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 0x0.0p0 F +REG epsg:6820 1 OK -0x1.0d8c5a88135a9p19 -0x1.03ffdafb0a48dp19 0x0.0p0 -0x1.042d40d203e5dp7 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6820 2 OK 0x1.3e605a8813596p19 -0x1.03ffdafb0a48fp19 0x0.0p0 -0x1.d0fad3b14d8a2p6 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6820 3 OK -0x1.c01850a6eb887p18 0x1.1ab0dadfaa135p19 0x0.0p0 -0x1.042d40d1a34bdp7 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6820 4 OK 0x1.10e0285375c34p19 0x1.1ab0dadfaa133p19 0x0.0p0 -0x1.d0fad3b20ebe1p6 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6821 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 0x0.0p0 F +REG epsg:6821 1 OK -0x1.ba2c1e407264p20 -0x1.aa821d4f367f8p20 0x0.0p0 -0x1.042d40d203e5dp7 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6821 2 OK 0x1.0522af0aec98ap21 -0x1.aa821d4f367fap20 0x0.0p0 -0x1.d0fad3b14d8a2p6 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6821 3 OK -0x1.6f882f56504d2p20 0x1.cfbb50331a5adp20 0x0.0p0 -0x1.042d40d1a34bdp7 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6821 4 OK 0x1.bfa16f2bb71acp20 0x1.cfbb50331a5aap20 0x0.0p0 -0x1.d0fad3b20ebe1p6 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6822 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 0x0.0p0 F +REG epsg:6822 1 OK -0x1.0d8c5a88135a9p19 -0x1.03ffdafb0a48dp19 0x0.0p0 -0x1.042d40d203e5dp7 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6822 2 OK 0x1.3e605a8813596p19 -0x1.03ffdafb0a48fp19 0x0.0p0 -0x1.d0fad3b14d8a2p6 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6822 3 OK -0x1.c01850a6eb887p18 0x1.1ab0dadfaa135p19 0x0.0p0 -0x1.042d40d1a34bdp7 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6822 4 OK 0x1.10e0285375c34p19 0x1.1ab0dadfaa133p19 0x0.0p0 -0x1.d0fad3b20ebe1p6 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6823 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 0x0.0p0 F +REG epsg:6823 1 OK -0x1.ba2c1e407264p20 -0x1.aa821d4f367f8p20 0x0.0p0 -0x1.042d40d203e5dp7 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6823 2 OK 0x1.0522af0aec98ap21 -0x1.aa821d4f367fap20 0x0.0p0 -0x1.d0fad3b14d8a2p6 0x1.35ffffff1a0fp5 0x0.0p0 F +REG epsg:6823 3 OK -0x1.6f882f56504d2p20 0x1.cfbb50331a5adp20 0x0.0p0 -0x1.042d40d1a34bdp7 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6823 4 OK 0x1.bfa16f2bb71acp20 0x1.cfbb50331a5aap20 0x0.0p0 -0x1.d0fad3b20ebe1p6 0x1.85fffffeabff3p5 0x0.0p0 F +REG epsg:6824 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.4ep5 0x0.0p0 F +REG epsg:6824 1 OK -0x1.0c05b7b0b660bp19 -0x1.04cc1fc38a963p19 0x0.0p0 -0x1.041209c412d5fp7 0x1.25ffffff58432p5 0x0.0p0 F +REG epsg:6824 2 OK 0x1.3cd9b7b0b6632p19 -0x1.04cc1fc38a961p19 0x0.0p0 -0x1.d286972284fe5p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6824 3 OK -0x1.c33687f4f01cap18 0x1.19f7d3cc6e44ap19 0x0.0p0 -0x1.041209c3cb86ap7 0x1.75fffffef23dcp5 0x0.0p0 F +REG epsg:6824 4 OK 0x1.126f43fa78106p19 0x1.19f7d3cc6e44dp19 0x0.0p0 -0x1.d2869723139d1p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6825 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.4ep5 0x0.0p0 F +REG epsg:6825 1 OK -0x1.b7ab4f989c0dfp20 -0x1.abd1336f21d41p20 0x0.0p0 -0x1.041209c412d5fp7 0x1.25ffffff58432p5 0x0.0p0 F +REG epsg:6825 2 OK 0x1.03e247b70170ap21 -0x1.abd1336f21d3ep20 0x0.0p0 -0x1.d286972284fe5p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6825 3 OK -0x1.7216e3c0f8ad2p20 0x1.ce8bca4e0227fp20 0x0.0p0 -0x1.041209c3cb86ap7 0x1.75fffffef23dcp5 0x0.0p0 F +REG epsg:6825 4 OK 0x1.c23023965f7fdp20 0x1.ce8bca4e02284p20 0x0.0p0 -0x1.d2869723139d1p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6826 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.4ep5 0x0.0p0 F +REG epsg:6826 1 OK -0x1.0c05b7b0b660bp19 -0x1.04cc1fc38a963p19 0x0.0p0 -0x1.041209c412d5fp7 0x1.25ffffff58432p5 0x0.0p0 F +REG epsg:6826 2 OK 0x1.3cd9b7b0b6632p19 -0x1.04cc1fc38a961p19 0x0.0p0 -0x1.d286972284fe5p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6826 3 OK -0x1.c33687f4f01cap18 0x1.19f7d3cc6e44ap19 0x0.0p0 -0x1.041209c3cb86ap7 0x1.75fffffef23dcp5 0x0.0p0 F +REG epsg:6826 4 OK 0x1.126f43fa78106p19 0x1.19f7d3cc6e44dp19 0x0.0p0 -0x1.d2869723139d1p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6827 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ed55555555554p6 0x1.4ep5 0x0.0p0 F +REG epsg:6827 1 OK -0x1.b7ab4f989c0dfp20 -0x1.abd1336f21d41p20 0x0.0p0 -0x1.041209c412d5fp7 0x1.25ffffff58432p5 0x0.0p0 F +REG epsg:6827 2 OK 0x1.03e247b70170ap21 -0x1.abd1336f21d3ep20 0x0.0p0 -0x1.d286972284fe5p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:6827 3 OK -0x1.7216e3c0f8ad2p20 0x1.ce8bca4e0227fp20 0x0.0p0 -0x1.041209c3cb86ap7 0x1.75fffffef23dcp5 0x0.0p0 F +REG epsg:6827 4 OK 0x1.c23023965f7fdp20 0x1.ce8bca4e02284p20 0x0.0p0 -0x1.d2869723139d1p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:6828 0 OK 0x1.388p13 0x0.0p0 0x0.0p0 -0x1.e955555555553p6 0x1.68p5 0x0.0p0 F +REG epsg:6828 1 OK -0x1.221957a561d44p19 -0x1.037ac6a25e795p19 0x0.0p0 -0x1.02cf0daa980bp7 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6828 2 OK 0x1.2bdd57a561d44p19 -0x1.037ac6a25e795p19 0x0.0p0 -0x1.cd0c8f557a946p6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6828 3 OK -0x1.e51f6f5f880e1p18 0x1.1b2ca6bed1797p19 0x0.0p0 -0x1.02cf0daa23cfbp7 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6828 4 OK 0x1.f8a76f5f880e1p18 0x1.1b2ca6bed1797p19 0x0.0p0 -0x1.cd0c8f56630bp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6829 0 OK 0x1.0050cc49ba5e3p15 0x0.0p0 0x0.0p0 -0x1.e955555555553p6 0x1.68p5 0x0.0p0 F +REG epsg:6829 1 OK -0x1.dbe25959acb19p20 -0x1.a9a7ceea19f8p20 0x0.0p0 -0x1.02cf0daa980bp7 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6829 2 OK 0x1.ebe7661e48577p20 -0x1.a9a7ceea19f8p20 0x0.0p0 -0x1.cd0c8f557a946p6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6829 3 OK -0x1.8de70dbe068e9p20 0x1.d086642d99794p20 0x0.0p0 -0x1.02cf0daa23cfbp7 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6829 4 OK 0x1.9dec1a82a2347p20 0x1.d086642d99794p20 0x0.0p0 -0x1.cd0c8f56630bp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6830 0 OK 0x1.388p13 0x0.0p0 0x0.0p0 -0x1.e955555555553p6 0x1.68p5 0x0.0p0 F +REG epsg:6830 1 OK -0x1.221957a561d44p19 -0x1.037ac6a25e795p19 0x0.0p0 -0x1.02cf0daa980bp7 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6830 2 OK 0x1.2bdd57a561d44p19 -0x1.037ac6a25e795p19 0x0.0p0 -0x1.cd0c8f557a946p6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6830 3 OK -0x1.e51f6f5f880e1p18 0x1.1b2ca6bed1797p19 0x0.0p0 -0x1.02cf0daa23cfbp7 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6830 4 OK 0x1.f8a76f5f880e1p18 0x1.1b2ca6bed1797p19 0x0.0p0 -0x1.cd0c8f56630bp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6831 0 OK 0x1.0050cc49ba5e3p15 0x0.0p0 0x0.0p0 -0x1.e955555555553p6 0x1.68p5 0x0.0p0 F +REG epsg:6831 1 OK -0x1.dbe25959acb19p20 -0x1.a9a7ceea19f8p20 0x0.0p0 -0x1.02cf0daa980bp7 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6831 2 OK 0x1.ebe7661e48577p20 -0x1.a9a7ceea19f8p20 0x0.0p0 -0x1.cd0c8f557a946p6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6831 3 OK -0x1.8de70dbe068e9p20 0x1.d086642d99794p20 0x0.0p0 -0x1.02cf0daa23cfbp7 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6831 4 OK 0x1.9dec1a82a2347p20 0x1.d086642d99794p20 0x0.0p0 -0x1.cd0c8f56630bp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6832 0 OK 0x1.388p15 0x0.0p0 0x0.0p0 -0x1.d800000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:6832 1 OK -0x1.1379621f77267p19 -0x1.038016fc9249bp19 0x0.0p0 -0x1.f448c5ffdac0ep6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6832 2 OK 0x1.3a89621f7727p19 -0x1.038016fc9249ap19 0x0.0p0 -0x1.bbb73a00253f3p6 0x1.3ffffffee841dp5 0x0.0p0 F +REG epsg:6832 3 OK -0x1.c7dd91e2500edp18 0x1.1b327352166dp19 0x0.0p0 -0x1.f448c5fef24a4p6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6832 4 OK 0x1.0afec8f12807ep19 0x1.1b327352166d1p19 0x0.0p0 -0x1.bbb73a010db5cp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6833 0 OK 0x1.0050cc432ca57p17 0x0.0p0 0x0.0p0 -0x1.d800000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:6833 1 OK -0x1.c3e4af12b1dd7p20 -0x1.a9b08676ae202p20 0x0.0p0 -0x1.f448c5ffdac0ep6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6833 2 OK 0x1.01fc7111be83ep21 -0x1.a9b08676ae201p20 0x0.0p0 -0x1.bbb73a00253f3p6 0x1.3ffffffee841dp5 0x0.0p0 F +REG epsg:6833 3 OK -0x1.75e7caa31dee6p20 0x1.d08fe78148663p20 0x0.0p0 -0x1.f448c5fef24a4p6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6833 4 OK 0x1.b5fbfdb3e9189p20 0x1.d08fe78148665p20 0x0.0p0 -0x1.bbb73a010db5cp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6834 0 OK 0x1.388p15 0x0.0p0 0x0.0p0 -0x1.d800000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:6834 1 OK -0x1.1379621f77267p19 -0x1.038016fc9249bp19 0x0.0p0 -0x1.f448c5ffdac0ep6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6834 2 OK 0x1.3a89621f7727p19 -0x1.038016fc9249ap19 0x0.0p0 -0x1.bbb73a00253f3p6 0x1.3ffffffee841dp5 0x0.0p0 F +REG epsg:6834 3 OK -0x1.c7dd91e2500edp18 0x1.1b327352166dp19 0x0.0p0 -0x1.f448c5fef24a4p6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6834 4 OK 0x1.0afec8f12807ep19 0x1.1b327352166d1p19 0x0.0p0 -0x1.bbb73a010db5cp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6835 0 OK 0x1.0050cc432ca57p17 0x0.0p0 0x0.0p0 -0x1.d800000000001p6 0x1.68p5 0x0.0p0 F +REG epsg:6835 1 OK -0x1.c3e4af12b1dd7p20 -0x1.a9b08676ae202p20 0x0.0p0 -0x1.f448c5ffdac0ep6 0x1.3ffffffee841cp5 0x0.0p0 F +REG epsg:6835 2 OK 0x1.01fc7111be83ep21 -0x1.a9b08676ae201p20 0x0.0p0 -0x1.bbb73a00253f3p6 0x1.3ffffffee841dp5 0x0.0p0 F +REG epsg:6835 3 OK -0x1.75e7caa31dee6p20 0x1.d08fe78148663p20 0x0.0p0 -0x1.f448c5fef24a4p6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6835 4 OK 0x1.b5fbfdb3e9189p20 0x1.d08fe78148665p20 0x0.0p0 -0x1.bbb73a010db5cp6 0x1.8ffffffe7836ep5 0x0.0p0 F +REG epsg:6836 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.d4p6 0x1.5ap5 0x0.0p0 F +REG epsg:6836 1 OK -0x1.fd108a03f762p18 -0x1.0439b035c5444p19 0x0.0p0 -0x1.ef756291fdafep6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6836 2 OK 0x1.4ca84501fbb1p19 -0x1.0439b035c5444p19 0x0.0p0 -0x1.b88a9d6e02502p6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6836 3 OK -0x1.a3a2e26dcbd58p18 0x1.1a8775f1706f8p19 0x0.0p0 -0x1.ef7562914a662p6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6836 4 OK 0x1.1ff17136e5eacp19 0x1.1a8775f1706f8p19 0x0.0p0 -0x1.b88a9d6eb599fp6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6837 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x1.5ap5 0x0.0p0 F +REG epsg:6837 1 OK -0x1.a18a34bab0cb5p20 -0x1.aae0fc1a63da1p20 0x0.0p0 -0x1.ef756291fdafep6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6837 2 OK 0x1.10d94d6e238fp21 -0x1.aae0fc1a63da1p20 0x0.0p0 -0x1.b88a9d6e02502p6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6837 3 OK -0x1.58309a23a2937p20 0x1.cf7768c888bc3p20 0x0.0p0 -0x1.ef7562914a662p6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6837 4 OK 0x1.d859004538e63p20 0x1.cf7768c888bc3p20 0x0.0p0 -0x1.b88a9d6eb599fp6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6838 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.d4p6 0x1.5ap5 0x0.0p0 F +REG epsg:6838 1 OK -0x1.fd108a03f762p18 -0x1.0439b035c5444p19 0x0.0p0 -0x1.ef756291fdafep6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6838 2 OK 0x1.4ca84501fbb1p19 -0x1.0439b035c5444p19 0x0.0p0 -0x1.b88a9d6e02502p6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6838 3 OK -0x1.a3a2e26dcbd58p18 0x1.1a8775f1706f8p19 0x0.0p0 -0x1.ef7562914a662p6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6838 4 OK 0x1.1ff17136e5eacp19 0x1.1a8775f1706f8p19 0x0.0p0 -0x1.b88a9d6eb599fp6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6839 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x1.5ap5 0x0.0p0 F +REG epsg:6839 1 OK -0x1.a18a34bab0cb5p20 -0x1.aae0fc1a63da1p20 0x0.0p0 -0x1.ef756291fdafep6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6839 2 OK 0x1.10d94d6e238fp21 -0x1.aae0fc1a63da1p20 0x0.0p0 -0x1.b88a9d6e02502p6 0x1.31ffffff2b749p5 0x0.0p0 F +REG epsg:6839 3 OK -0x1.58309a23a2937p20 0x1.cf7768c888bc3p20 0x0.0p0 -0x1.ef7562914a662p6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6839 4 OK 0x1.d859004538e63p20 0x1.cf7768c888bc3p20 0x0.0p0 -0x1.b88a9d6eb599fp6 0x1.81fffffebef01p5 0x0.0p0 F +REG epsg:6840 0 OK 0x1.072baa8c61b22p17 0x1.687cc1c60c1cp18 0x0.0p0 -0x1.f033333333333p6 0x1.65ffffffffff3p5 0x0.0p0 F +REG epsg:6840 1 OK -0x1.c9cc32b6f303p18 -0x1.3d17e83206f2p17 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6840 2 OK 0x1.68a23e54cdac7p19 -0x1.3d7fd639e546p17 0x0.0p0 -0x1.d409d090da2cap6 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6840 3 OK -0x1.6bcb93142aad9p18 0x1.cf5eef0482828p19 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.8dffffffff984p5 0x0.0p0 F +REG epsg:6840 4 OK 0x1.39652fe315b52p19 0x1.cf3d0c6124598p19 0x0.0p0 -0x1.d409d090da2cap6 0x1.8dffffffff985p5 0x0.0p0 F +REG epsg:6841 0 OK 0x1.afb5d33c5ac52p18 0x1.27ace0c83dc58p20 0x0.0p0 -0x1.f033333333333p6 0x1.65ffffffffff3p5 0x0.0p0 F +REG epsg:6841 1 OK -0x1.777d7d960a6a5p20 -0x1.041549df7258p19 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6841 2 OK 0x1.27cb9ff9a35e6p21 -0x1.046a8867948ap19 0x0.0p0 -0x1.d409d090da2cap6 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6841 3 OK -0x1.2a637240911a2p20 0x1.7c0fb69b22878p21 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.8dffffffff984p5 0x0.0p0 F +REG epsg:6841 4 OK 0x1.010cc787891e4p21 0x1.7bf3eb94cd92p21 0x0.0p0 -0x1.d409d090da2cap6 0x1.8dffffffff985p5 0x0.0p0 F +REG epsg:6842 0 OK 0x1.072baa8c61b22p17 0x1.687cc1c60c1cp18 0x0.0p0 -0x1.f033333333333p6 0x1.65ffffffffff3p5 0x0.0p0 F +REG epsg:6842 1 OK -0x1.c9cc32b6f303p18 -0x1.3d17e83206f2p17 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6842 2 OK 0x1.68a23e54cdac7p19 -0x1.3d7fd639e546p17 0x0.0p0 -0x1.d409d090da2cap6 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6842 3 OK -0x1.6bcb93142aad9p18 0x1.cf5eef0482828p19 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.8dffffffff984p5 0x0.0p0 F +REG epsg:6842 4 OK 0x1.39652fe315b52p19 0x1.cf3d0c6124598p19 0x0.0p0 -0x1.d409d090da2cap6 0x1.8dffffffff985p5 0x0.0p0 F +REG epsg:6843 0 OK 0x1.afb5d33c5ac52p18 0x1.27ace0c83dc58p20 0x0.0p0 -0x1.f033333333333p6 0x1.65ffffffffff3p5 0x0.0p0 F +REG epsg:6843 1 OK -0x1.777d7d960a6a5p20 -0x1.041549df7258p19 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6843 2 OK 0x1.27cb9ff9a35e6p21 -0x1.046a8867948ap19 0x0.0p0 -0x1.d409d090da2cap6 0x1.3dfffffffffe7p5 0x0.0p0 F +REG epsg:6843 3 OK -0x1.2a637240911a2p20 0x1.7c0fb69b22878p21 0x0.0p0 -0x1.062e4aeac61cfp7 0x1.8dffffffff984p5 0x0.0p0 F +REG epsg:6843 4 OK 0x1.010cc787891e4p21 0x1.7bf3eb94cd92p21 0x0.0p0 -0x1.d409d090da2cap6 0x1.8dffffffff985p5 0x0.0p0 F +REG epsg:6844 0 OK 0x1.d4cp15 0x0.0p0 0x0.0p0 -0x1.dcaaaaaaaaaacp6 0x1.6ap5 0x0.0p0 F +REG epsg:6844 1 OK -0x1.09e3eb60f42efp19 -0x1.035e76ca24f1p19 0x0.0p0 -0x1.f9133de84addep6 0x1.41fffffedd1acp5 0x0.0p0 F +REG epsg:6844 2 OK 0x1.447beb60f42dcp19 -0x1.035e76ca24f11p19 0x0.0p0 -0x1.c042176d0a77cp6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:6844 3 OK -0x1.b3dede56e310dp18 0x1.1b44f80335ec2p19 0x0.0p0 -0x1.f9133de759af5p6 0x1.91fffffe6d0dcp5 0x0.0p0 F +REG epsg:6844 4 OK 0x1.14876f2b71876p19 0x1.1b44f80335ec1p19 0x0.0p0 -0x1.c042176dfba65p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:6845 0 OK 0x1.80793264c2f83p17 0x0.0p0 0x0.0p0 -0x1.dcaaaaaaaaaacp6 0x1.6ap5 0x0.0p0 F +REG epsg:6845 1 OK -0x1.b42bf90c920f8p20 -0x1.a9795d67d26fcp20 0x0.0p0 -0x1.f9133de84addep6 0x1.41fffffedd1acp5 0x0.0p0 F +REG epsg:6845 2 OK 0x1.0a2522d2e165dp21 -0x1.a9795d67d26fep20 0x0.0p0 -0x1.c042176d0a77cp6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:6845 3 OK -0x1.658161b41e82cp20 0x1.d0ae483b05234p20 0x0.0p0 -0x1.f9133de759af5p6 0x1.91fffffe6d0dcp5 0x0.0p0 F +REG epsg:6845 4 OK 0x1.c59fae4d4f3f1p20 0x1.d0ae483b05232p20 0x0.0p0 -0x1.c042176dfba65p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:6846 0 OK 0x1.d4cp15 0x0.0p0 0x0.0p0 -0x1.dcaaaaaaaaaacp6 0x1.6ap5 0x0.0p0 F +REG epsg:6846 1 OK -0x1.09e3eb60f42efp19 -0x1.035e76ca24f1p19 0x0.0p0 -0x1.f9133de84addep6 0x1.41fffffedd1acp5 0x0.0p0 F +REG epsg:6846 2 OK 0x1.447beb60f42dcp19 -0x1.035e76ca24f11p19 0x0.0p0 -0x1.c042176d0a77cp6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:6846 3 OK -0x1.b3dede56e310dp18 0x1.1b44f80335ec2p19 0x0.0p0 -0x1.f9133de759af5p6 0x1.91fffffe6d0dcp5 0x0.0p0 F +REG epsg:6846 4 OK 0x1.14876f2b71876p19 0x1.1b44f80335ec1p19 0x0.0p0 -0x1.c042176dfba65p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:6847 0 OK 0x1.80793264c2f83p17 0x0.0p0 0x0.0p0 -0x1.dcaaaaaaaaaacp6 0x1.6ap5 0x0.0p0 F +REG epsg:6847 1 OK -0x1.b42bf90c920f8p20 -0x1.a9795d67d26fcp20 0x0.0p0 -0x1.f9133de84addep6 0x1.41fffffedd1acp5 0x0.0p0 F +REG epsg:6847 2 OK 0x1.0a2522d2e165dp21 -0x1.a9795d67d26fep20 0x0.0p0 -0x1.c042176d0a77cp6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:6847 3 OK -0x1.658161b41e82cp20 0x1.d0ae483b05234p20 0x0.0p0 -0x1.f9133de759af5p6 0x1.91fffffe6d0dcp5 0x0.0p0 F +REG epsg:6847 4 OK 0x1.c59fae4d4f3f1p20 0x1.d0ae483b05232p20 0x0.0p0 -0x1.c042176dfba65p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:6848 0 OK 0x1.d4cp14 0x0.0p0 0x0.0p0 -0x1.d955555555552p6 0x1.68aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6848 1 OK -0x1.187062dc1f66ap19 -0x1.0379c9143eabcp19 0x0.0p0 -0x1.f5a8a93b6e5b5p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6848 2 OK 0x1.35bc62dc1f661p19 -0x1.0379c9143eabdp19 0x0.0p0 -0x1.bd02016f3c4f2p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6848 3 OK -0x1.d18365d9bafa2p18 0x1.1b3dec893754ap19 0x0.0p0 -0x1.f5a8a93a8305ap6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6848 4 OK 0x1.060db2ecdd7c8p19 0x1.1b3dec8937549p19 0x0.0p0 -0x1.bd02017027a4cp6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6849 0 OK 0x1.8079326809d49p16 0x0.0p0 0x0.0p0 -0x1.d955555555552p6 0x1.68aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6849 1 OK -0x1.cc09a98fdc8ep20 -0x1.a9a62efa3d25dp20 0x0.0p0 -0x1.f5a8a93b6e5b5p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6849 2 OK 0x1.fc18cfdcddc7bp20 -0x1.a9a62efa3d25ep20 0x0.0p0 -0x1.bd02016f3c4f2p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6849 3 OK -0x1.7dd191b0b39f6p20 0x1.d0a2b9c58b24ap20 0x0.0p0 -0x1.f5a8a93a8305ap6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6849 4 OK 0x1.ade0b7fdb4d92p20 0x1.d0a2b9c58b249p20 0x0.0p0 -0x1.bd02017027a4bp6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6850 0 OK 0x1.d4cp14 0x0.0p0 0x0.0p0 -0x1.d955555555552p6 0x1.68aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6850 1 OK -0x1.187062dc1f66ap19 -0x1.0379c9143eabcp19 0x0.0p0 -0x1.f5a8a93b6e5b5p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6850 2 OK 0x1.35bc62dc1f661p19 -0x1.0379c9143eabdp19 0x0.0p0 -0x1.bd02016f3c4f2p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6850 3 OK -0x1.d18365d9bafa2p18 0x1.1b3dec893754ap19 0x0.0p0 -0x1.f5a8a93a8305ap6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6850 4 OK 0x1.060db2ecdd7c8p19 0x1.1b3dec8937549p19 0x0.0p0 -0x1.bd02017027a4cp6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6851 0 OK 0x1.8079326809d49p16 0x0.0p0 0x0.0p0 -0x1.d955555555552p6 0x1.68aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6851 1 OK -0x1.cc09a98fdc8ep20 -0x1.a9a62efa3d25dp20 0x0.0p0 -0x1.f5a8a93b6e5b5p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6851 2 OK 0x1.fc18cfdcddc7bp20 -0x1.a9a62efa3d25ep20 0x0.0p0 -0x1.bd02016f3c4f2p6 0x1.40aaaaa98f40ep5 0x0.0p0 F +REG epsg:6851 3 OK -0x1.7dd191b0b39f6p20 0x1.d0a2b9c58b24ap20 0x0.0p0 -0x1.f5a8a93a8305ap6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6851 4 OK 0x1.ade0b7fdb4d92p20 0x1.d0a2b9c58b249p20 0x0.0p0 -0x1.bd02017027a4bp6 0x1.90aaaaa91f313p5 0x0.0p0 F +REG epsg:6852 0 OK 0x1.86ap16 0x1.86ap15 0x0.0p0 -0x1.ebp6 0x1.6bffffffffff4p5 0x0.0p0 F +REG epsg:6852 1 OK -0x1.ee46e0203d9d8p18 -0x1.d3fda9b6cff58p18 0x0.0p0 -0x1.03c466092f8ep7 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6852 2 OK 0x1.58cb70101ececp19 -0x1.d3fda9b6cff58p18 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6852 3 OK -0x1.8de5b8cf67b71p18 0x1.333c86bd7ec3bp19 0x0.0p0 -0x1.03c466092f8ep7 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6852 4 OK 0x1.289adc67b3db8p19 0x1.333c86bd7ec3bp19 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6853 0 OK 0x1.4064ff53f7ceep18 0x1.4064ff559b3dp17 0x0.0p0 -0x1.ebp6 0x1.6bffffffffff4p5 0x0.0p0 F +REG epsg:6853 1 OK -0x1.95692aba5d928p20 -0x1.7fd9ccb6548fbp20 0x0.0p0 -0x1.03c466092f8ep7 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6853 2 OK 0x1.1acdd5322cbcfp21 -0x1.7fd9ccb6548fbp20 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6853 3 OK -0x1.465c0010ec9ep20 0x1.f7ff2c51422dp20 0x0.0p0 -0x1.03c466092f8ep7 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6853 4 OK 0x1.e68e7fbae8858p20 0x1.f7ff2c51422dp20 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6854 0 OK 0x1.86ap16 0x1.86ap15 0x0.0p0 -0x1.ebp6 0x1.6bffffffffff4p5 0x0.0p0 F +REG epsg:6854 1 OK -0x1.ee46e0203d9d8p18 -0x1.d3fda9b6cff58p18 0x0.0p0 -0x1.03c466092f8ep7 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6854 2 OK 0x1.58cb70101ececp19 -0x1.d3fda9b6cff58p18 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6854 3 OK -0x1.8de5b8cf67b71p18 0x1.333c86bd7ec3bp19 0x0.0p0 -0x1.03c466092f8ep7 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6854 4 OK 0x1.289adc67b3db8p19 0x1.333c86bd7ec3bp19 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6855 0 OK 0x1.4064ff53f7ceep18 0x1.4064ff559b3dp17 0x0.0p0 -0x1.ebp6 0x1.6bffffffffff4p5 0x0.0p0 F +REG epsg:6855 1 OK -0x1.95692aba5d928p20 -0x1.7fd9ccb6548fbp20 0x0.0p0 -0x1.03c466092f8ep7 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6855 2 OK 0x1.1acdd5322cbcfp21 -0x1.7fd9ccb6548fbp20 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.43fffffffffecp5 0x0.0p0 F +REG epsg:6855 3 OK -0x1.465c0010ec9ep20 0x1.f7ff2c51422dp20 0x0.0p0 -0x1.03c466092f8ep7 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6855 4 OK 0x1.e68e7fbae8858p20 0x1.f7ff2c51422dp20 0x0.0p0 -0x1.ce7733eda0e4p6 0x1.93ffffffffa5p5 0x0.0p0 F +REG epsg:6856 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6856 1 OK -0x1.0e033bd376d5bp19 -0x1.03c13e64206c9p19 0x0.0p0 -0x1.0425a737bc18cp7 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6856 2 OK 0x1.3ed73bd376d5bp19 -0x1.03c13e64206c9p19 0x0.0p0 -0x1.d05f5c3b3278dp6 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6856 3 OK -0x1.bf257195e5ab2p18 0x1.1ae8a5058fd9fp19 0x0.0p0 -0x1.0425a73752c25p7 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6856 4 OK 0x1.1066b8caf2d59p19 0x1.1ae8a5058fd9fp19 0x0.0p0 -0x1.d05f5c3c0525cp6 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6857 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6857 1 OK -0x1.baef21a2953ecp20 -0x1.aa1b67b104239p20 0x0.0p0 -0x1.0425a737bc18cp7 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6857 2 OK 0x1.058430bbfe07p21 -0x1.aa1b67b104239p20 0x0.0p0 -0x1.d05f5c3b3278dp6 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6857 3 OK -0x1.6ec0faba3db79p20 0x1.d016d4eb8f408p20 0x0.0p0 -0x1.0425a73752c25p7 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6857 4 OK 0x1.beda3a8fa486dp20 0x1.d016d4eb8f408p20 0x0.0p0 -0x1.d05f5c3c0525cp6 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6858 0 OK 0x1.86ap15 0x0.0p0 0x0.0p0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6858 1 OK -0x1.0e033bd376d5bp19 -0x1.03c13e64206c9p19 0x0.0p0 -0x1.0425a737bc18cp7 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6858 2 OK 0x1.3ed73bd376d5bp19 -0x1.03c13e64206c9p19 0x0.0p0 -0x1.d05f5c3b3278dp6 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6858 3 OK -0x1.bf257195e5ab2p18 0x1.1ae8a5058fd9fp19 0x0.0p0 -0x1.0425a73752c25p7 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6858 4 OK 0x1.1066b8caf2d59p19 0x1.1ae8a5058fd9fp19 0x0.0p0 -0x1.d05f5c3c0525cp6 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6859 0 OK 0x1.4064ff559b3dp17 0x0.0p0 0x0.0p0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6859 1 OK -0x1.baef21a2953ecp20 -0x1.aa1b67b104239p20 0x0.0p0 -0x1.0425a737bc18cp7 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6859 2 OK 0x1.058430bbfe07p21 -0x1.aa1b67b104239p20 0x0.0p0 -0x1.d05f5c3b3278dp6 0x1.3aaaaaa9aeaacp5 0x0.0p0 F +REG epsg:6859 3 OK -0x1.6ec0faba3db79p20 0x1.d016d4eb8f408p20 0x0.0p0 -0x1.0425a73752c25p7 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6859 4 OK 0x1.beda3a8fa486dp20 0x1.d016d4eb8f408p20 0x0.0p0 -0x1.d05f5c3c0525cp6 0x1.8aaaaaa93f4fap5 0x0.0p0 F +REG epsg:6860 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.ea00000000001p6 0x1.60aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6860 1 OK -0x1.2644c581eec1fp19 -0x1.03e5c5591fca7p19 0x0.0p0 -0x1.02ebd3fdaac8ap7 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6860 2 OK 0x1.2644c581eec31p19 -0x1.03e5c5591fca6p19 0x0.0p0 -0x1.ce285804aa6ecp6 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6860 3 OK -0x1.f0744b718b581p18 0x1.1adafc5baaed5p19 0x0.0p0 -0x1.02ebd3fd4546ap7 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6860 4 OK 0x1.f0744b718b5a2p18 0x1.1adafc5baaed6p19 0x0.0p0 -0x1.ce2858057572bp6 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6861 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.ea00000000001p6 0x1.60aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6861 1 OK -0x1.e2b9618f43cc9p20 -0x1.aa57533019f21p20 0x0.0p0 -0x1.02ebd3fdaac8ap7 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6861 2 OK 0x1.e2b9618f43ce7p20 -0x1.aa57533019f1fp20 0x0.0p0 -0x1.ce285804aa6ecp6 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6861 3 OK -0x1.97325e21aa657p20 0x1.d0006cec60f57p20 0x0.0p0 -0x1.02ebd3fd4546ap7 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6861 4 OK 0x1.97325e21aa672p20 0x1.d0006cec60f5ap20 0x0.0p0 -0x1.ce2858057572bp6 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6862 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.ea00000000001p6 0x1.60aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6862 1 OK -0x1.2644c581eec1fp19 -0x1.03e5c5591fca7p19 0x0.0p0 -0x1.02ebd3fdaac8ap7 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6862 2 OK 0x1.2644c581eec31p19 -0x1.03e5c5591fca6p19 0x0.0p0 -0x1.ce285804aa6ecp6 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6862 3 OK -0x1.f0744b718b581p18 0x1.1adafc5baaed5p19 0x0.0p0 -0x1.02ebd3fd4546ap7 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6862 4 OK 0x1.f0744b718b5a2p18 0x1.1adafc5baaed6p19 0x0.0p0 -0x1.ce2858057572bp6 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6863 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.ea00000000001p6 0x1.60aaaaaaaaaacp5 0x0.0p0 F +REG epsg:6863 1 OK -0x1.e2b9618f43cc9p20 -0x1.aa57533019f21p20 0x0.0p0 -0x1.02ebd3fdaac8ap7 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6863 2 OK 0x1.e2b9618f43ce7p20 -0x1.aa57533019f1fp20 0x0.0p0 -0x1.ce285804aa6ecp6 0x1.38aaaaa9b85cep5 0x0.0p0 F +REG epsg:6863 3 OK -0x1.97325e21aa657p20 0x1.d0006cec60f57p20 0x0.0p0 -0x1.02ebd3fd4546ap7 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6863 4 OK 0x1.97325e21aa672p20 0x1.d0006cec60f5ap20 0x0.0p0 -0x1.ce2858057572bp6 0x1.88aaaaa9497d1p5 0x0.0p0 F +REG epsg:6867 0 OK 0x1.86ap18 0x1.96e208b941ca4p17 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:6867 1 OK -0x1.58224050f8eep15 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6867 2 OK 0x1.9c2224050f901p19 -0x1.7bf26ae4f90cep17 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6867 3 OK 0x1.0a4c279e8ba6p13 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6867 4 OK 0x1.8276cf6185d27p19 0x1.374becdbbe8b5p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6868 0 OK 0x1.4064ff53f7cedp20 0x1.4dbabd3e95b5ap19 0x0.0p0 -0x1.e200000000001p6 0x1.5cffffffffff2p5 0x0.0p0 F +REG epsg:6868 1 OK -0x1.1a43107856f38p17 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6868 2 OK 0x1.5209305b7d3fp21 -0x1.37a2e2c332679p19 0x0.0p0 -0x1.cd472fc462682p6 0x1.3efffffffffe5p5 0x0.0p0 F +REG epsg:6868 3 OK 0x1.b4d6f6677e14p14 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.f6b8d03b9d97ep6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6868 4 OK 0x1.3cfb516728d38p21 0x1.fea8394ae89d4p20 0x0.0p0 -0x1.cd472fc462682p6 0x1.7affffffff67bp5 0x0.0p0 F +REG epsg:6870 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4p4 0x0.0p0 0x0.0p0 T +REG epsg:6870 1 OK -0x1.af3135ef97c3p15 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e0000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6870 2 OK 0x1.019d89af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6870 3 OK -0x1.af3135ef97c3p15 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.e0000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6870 4 OK 0x1.019d89af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.8fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6871 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6871 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6871 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6871 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6871 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6875 0 OK 0x1.ab3fp22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:6875 1 OK 0x1.896920bbf8513p22 -0x1.0e970b6c3a092p19 0x0.0p0 0x1.c0000001d501ep2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6875 2 OK 0x1.cd14df4407aedp22 -0x1.0e970b6c3a092p19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6875 3 OK 0x1.896920bbf8513p22 0x1.0e970b6c3a092p19 0x0.0p0 0x1.c0000001d501ep2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6875 4 OK 0x1.cd14df4407aedp22 0x1.0e970b6c3a092p19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:6876 0 OK 0x1.6e36p21 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:6876 1 OK 0x1.2a703b2841a0fp21 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000001d501cp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6876 2 OK 0x1.b1fbc4d7be5f1p21 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6876 3 OK 0x1.2a703b2841a0fp21 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000001d501cp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6876 4 OK 0x1.b1fbc4d7be5f1p21 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:6879 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG epsg:6879 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:6879 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG epsg:6879 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:6879 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG epsg:6880 0 OK 0x1.907e0aaacd9ecp20 0x1.199c3402171a3p19 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG epsg:6880 1 OK 0x1.a0b616e027ecp18 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:6880 2 OK 0x1.5c6747cec8a14p21 -0x1.0b47fd2e5713bp19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG epsg:6880 3 OK 0x1.07608efa56844p19 0x1.ad3050594afd7p20 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:6880 4 OK 0x1.4ea5e6ec37fdbp21 0x1.ad3050594afd7p20 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG epsg:6881 0 OK 0x1.de09ec6905c2ep-10 -0x1.3db6daaad33a3p-9 -0x1.608b5ded5p6 0x0.0p0 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:6881 1 OK -0x1.3fe1d070fbeb5p2 -0x1.4030714355483p2 -0x1.3fbfc0074p6 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:6881 2 OK 0x1.401d914b13f5ap2 -0x1.402ffc356865ap2 -0x1.657ee88e2p5 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6881 3 OK -0x1.3fe1d070fbeb5p2 0x1.3fe15276dccbp2 -0x1.faa192c4cp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6881 4 OK 0x1.401d914b13f5ap2 0x1.3fe0dd85902b1p2 -0x1.6da102defp6 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6882 0 OK 0x1.1a93d389b4c0ap-13 -0x1.43a2374c9894dp-9 0x1.1b718fc6dp6 -0x1.2d6cb2018701fp-65 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG epsg:6882 1 OK -0x1.3ffb6fa65f127p2 -0x1.402eec0c5e0cdp2 0x1.7a7096817p6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:6882 2 OK 0x1.3fffd9ee6216cp2 -0x1.402ee366483dcp2 0x1.84dbbc592p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6882 3 OK -0x1.3ffb6fa65f127p2 0x1.3fde53ec9625cp2 0x1.782710cp5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6882 4 OK 0x1.3fffd9ee6216cp2 0x1.3fde4b48a7e5dp2 0x1.8cfd66b18p5 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG epsg:6883 0 OK 0x1.0306f78331afbp-10 -0x1.d1d93a8cf2968p-9 -0x1.ff94603d8p3 -0x1.2d6cb20187021p-63 0x0.0p0 -0x1.8p-29 T +REG epsg:6883 1 OK -0x1.3fecc90e4516dp2 -0x1.403972d419c1p2 0x1.e7c4ff5fp2 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:6883 2 OK 0x1.400d29b7db48cp2 -0x1.4039336701f7fp2 0x1.ab8cdf26p4 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:6883 3 OK -0x1.3fecc90e4516dp2 0x1.3fc57032863edp2 -0x1.e70f76d88p5 -0x1.3fffffffffffdp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:6883 4 OK 0x1.400d29b7db48cp2 0x1.3fc530dc2c18dp2 -0x1.4e413aeb8p5 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x0.0p0 F +REG epsg:6884 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:6884 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6884 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6884 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6884 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6885 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG epsg:6885 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6885 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG epsg:6885 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6885 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG epsg:6886 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:6886 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6886 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6886 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6886 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6887 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG epsg:6887 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6887 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG epsg:6887 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6887 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG epsg:6892 0 OK 0x1.a75e7f7531892p-10 0x1.3d61edb0617ccp-9 -0x1.11cea7008p6 0x1.2d6cb2018701ep-62 0x0.0p0 0x0.0p0 T +REG epsg:6892 1 OK -0x1.3fe4fa4012566p2 -0x1.3fe11583a001bp2 -0x1.a454f7932p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:6892 2 OK 0x1.4019e5b800baep2 -0x1.3fe0adf22cf35p2 -0x1.27747ddbbp6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:6892 3 OK -0x1.3fe4fa4012566p2 0x1.40301f288eeb9p2 -0x1.d34a394fap5 -0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:6892 4 OK 0x1.4019e5b800baep2 0x1.402fb77dc879ep2 -0x1.b3137ceacp4 0x1.3fffffffffffep2 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:6893 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6893 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6893 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6893 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6893 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6894 0 OK -0x1.9e74687637299p-10 -0x1.b6a1f7325181ep-10 -0x1.891e745cep5 -0x1.2d6cb2018701ep-62 0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG epsg:6894 1 OK -0x1.4019176cdd353p2 -0x1.4023430f59854p2 -0x1.f21d515fp3 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:6894 2 OK 0x1.3fe54935e01f8p2 -0x1.4023a887570d5p2 -0x1.7105a486p5 0x1.4p2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:6894 3 OK -0x1.4019176cdd353p2 0x1.3feca55c0434ap2 -0x1.7e88dc79ap5 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:6894 4 OK 0x1.3fe54935e01f8p2 0x1.3fed0ac2dff5ap2 -0x1.3983bf1c9p6 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:6915 0 OK 0x1.e857505a0097p18 0x1.0b9c7c7797fb1p8 0x1.f3789e5aap5 0x1.c800000000001p5 -0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:6915 1 OK -0x1.acf386b99077p15 -0x1.0ec13ce6e8686p19 0x1.18c8bae9cp5 0x1.ap5 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:6915 2 OK 0x1.019344717c84fp20 -0x1.0ec13ce74e115p19 0x1.6de983074p5 0x1.fp5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:6915 3 OK -0x1.aceb5d416422p15 0x1.0f042373acddfp19 0x1.471329a9dp6 0x1.ap5 0x1.3fffffffffffdp2 -0x1.0p-30 F +REG epsg:6915 4 OK 0x1.019303220f112p20 0x1.0f04237412b7dp19 0x1.71a3792c2p6 0x1.fp5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:6917 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6917 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6917 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6917 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6917 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6922 0 OK 0x1.86ap18 0x1.7b6b14d4499c4p17 0x0.0p0 -0x1.8900000000001p6 0x1.2dfffffffffdep5 0x0.0p0 F +REG epsg:6922 1 OK -0x1.0d64c41bf48p13 -0x1.689b488aebffdp17 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6922 2 OK 0x1.8ad593106fd2ap19 -0x1.689b488aebffdp17 0x0.0p0 -0x1.774b3f67f0581p6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6922 3 OK 0x1.c1466231e832p14 0x1.20fc1535c34e3p19 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6922 4 OK 0x1.7895ccee70bfp19 0x1.20fc1535c34e3p19 0x0.0p0 -0x1.774b3f67f0581p6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6923 0 OK 0x1.4064d5553261cp20 0x1.3733b8eca06e1p19 0x0.0p0 -0x1.8900000000001p6 0x1.2dfffffffffdep5 0x0.0p0 F +REG epsg:6923 1 OK -0x1.b9eaf3a7a9acp14 -0x1.27c5c3c44aa2dp19 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6923 2 OK 0x1.43d8ab3c81b5ap21 -0x1.27c5c3c44aa2dp19 0x0.0p0 -0x1.774b3f67f0581p6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6923 3 OK 0x1.707fc17de574p16 0x1.da0e2931793cap20 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6923 4 OK 0x1.34e0d7494336ap21 0x1.da0e2931793cap20 0x0.0p0 -0x1.774b3f67f0581p6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6924 0 OK 0x1.86ap18 0x1.7b6b14d4499c4p17 0x0.0p0 -0x1.8900000000001p6 0x1.2dfffffffffdep5 0x0.0p0 F +REG epsg:6924 1 OK -0x1.0d64c41bf48p13 -0x1.689b488aebffdp17 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6924 2 OK 0x1.8ad593106fd2ap19 -0x1.689b488aebffdp17 0x0.0p0 -0x1.774b3f67f0581p6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6924 3 OK 0x1.c1466231e832p14 0x1.20fc1535c34e3p19 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6924 4 OK 0x1.7895ccee70bfp19 0x1.20fc1535c34e3p19 0x0.0p0 -0x1.774b3f67f0581p6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6925 0 OK 0x1.4064d5553261cp20 0x1.3733b8eca06e1p19 0x0.0p0 -0x1.8900000000001p6 0x1.2dfffffffffdep5 0x0.0p0 F +REG epsg:6925 1 OK -0x1.b9eaf3a7a9acp14 -0x1.27c5c3c44aa2dp19 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6925 2 OK 0x1.43d8ab3c81b5ap21 -0x1.27c5c3c44aa2dp19 0x0.0p0 -0x1.774b3f67f0581p6 0x1.11fffffffffcep5 0x0.0p0 F +REG epsg:6925 3 OK 0x1.707fc17de574p16 0x1.da0e2931793cap20 0x0.0p0 -0x1.9ab4c0980fa7fp6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6925 4 OK 0x1.34e0d7494336ap21 0x1.da0e2931793cap20 0x0.0p0 -0x1.774b3f67f0581p6 0x1.49fffffffffeap5 0x0.0p0 F +REG epsg:6927 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6927 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6927 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6927 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6927 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:6931 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 0x0.0p0 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:6931 1 OK -0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.dffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:6931 2 OK 0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 0x1.dffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:6931 3 OK -0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:6931 4 OK 0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 0x1.dffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG epsg:6932 0 OK 0x0.0p0 0x1.b44c727f931e4p16 0x0.0p0 0x0.0p0 -0x1.63fffffff3e82p6 0x0.0p0 F +REG epsg:6932 1 OK -0x1.79d87f2a2c624p16 0x1.b44c727f931e6p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.63fffffff3e82p6 0x0.0p0 F +REG epsg:6932 2 OK 0x1.79d87f2a2c624p16 0x1.b44c727f931e6p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.63fffffff3e82p6 0x0.0p0 F +REG epsg:6932 3 OK -0x1.d826d2218e40ep18 0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.dffffffffffffp5 -0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:6932 4 OK 0x1.d826d2218e40ep18 0x1.1098cd0a6adb8p18 0x0.0p0 0x1.dffffffffffffp5 -0x1.53ffffffc61adp6 0x0.0p0 F +REG epsg:6933 0 OK 0x0.0p0 0x1.bea12a994d954p21 0x0.0p0 0x0.0p0 0x1.dffffffccdd0fp4 0x0.0p0 F +REG epsg:6933 1 OK -0x1.1000f98f704f1p19 0x1.79631c7d3d051p21 0x0.0p0 -0x1.7181116f43fe3p2 0x1.8ffffffb7cf92p4 0x0.0p0 F +REG epsg:6933 2 OK 0x1.1000f98f704f1p19 0x1.79631c7d3d051p21 0x0.0p0 0x1.7181116f43fe3p2 0x1.8ffffffb7cf92p4 0x0.0p0 F +REG epsg:6933 3 OK -0x1.1000f98f704f1p19 0x1.00444748a4807p22 0x0.0p0 -0x1.7181116f43fe3p2 0x1.17ffffff26aa7p5 0x0.0p0 F +REG epsg:6933 4 OK 0x1.1000f98f704f1p19 0x1.00444748a4807p22 0x0.0p0 0x1.7181116f43fe3p2 0x1.17ffffff26aa7p5 0x0.0p0 F +REG epsg:6934 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6934 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6934 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6934 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6934 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6956 0 OK -0x1.87fd75f485dbp7 0x1.e863d241dd163p18 -0x1.882f28fcp1 0x1.97ffffffffff6p6 0x1.1591fb1587362p-43 0x1.0p-27 T +REG epsg:6956 1 OK -0x1.0f28c02703991p19 -0x1.ac6486c52876p15 0x1.0f6d57cp2 0x1.840000001d5f6p6 -0x1.3fffffffeacffp2 0x1.cp-27 F +REG epsg:6956 2 OK 0x1.0ef7c3cd318d4p19 -0x1.ac644b3bee8bp15 -0x1.dc610fc48p4 0x1.abffffffe2bfp6 -0x1.3fffffffeae9ep2 -0x1.0p-29 F +REG epsg:6956 3 OK -0x1.0f288d6b2760ep19 0x1.01950b65ca7ap20 0x1.7aaf67c1p4 0x1.840000001d5edp6 0x1.3fffffffeadeap2 0x1.1p-26 F +REG epsg:6956 4 OK 0x1.0ef789c487d12p19 0x1.01950d3051b8cp20 -0x1.4b1809e38p3 0x1.abffffffe2bf9p6 0x1.3fffffffeaf98p2 0x1.0p-30 F +REG epsg:6957 0 OK -0x1.874d355fe9857p7 0x1.e863d47bc4665p18 -0x1.aa09672a8p3 0x1.a3ffffffffff9p6 0x1.17edb50a0135cp-43 0x1.4p-28 T +REG epsg:6957 1 OK -0x1.0f28d19719b0cp19 -0x1.ac664219abb2p15 -0x1.7d7c9455p2 0x1.900000001d5f8p6 -0x1.3fffffffeacfdp2 0x1.cp-27 F +REG epsg:6957 2 OK 0x1.0ef7eb4fc5775p19 -0x1.ac6605ed9c77p15 -0x1.3f5355f16p5 0x1.b7ffffffe2bf2p6 -0x1.3fffffffeae9bp2 -0x1.8p-29 F +REG epsg:6957 3 OK -0x1.0f289ee561742p19 0x1.01951a584841ep20 0x1.aeea6d98p3 0x1.900000001d5efp6 0x1.3fffffffeadefp2 0x1.0p-26 F +REG epsg:6957 4 OK 0x1.0ef7b13cc6837p19 0x1.01951c27e6c5dp20 -0x1.47d155ab4p4 0x1.b7ffffffe2bfcp6 0x1.3fffffffeaf96p2 0x1.0p-29 F +REG epsg:6958 0 OK -0x1.858a9285e0234p7 0x1.e863d6bb0580ep18 -0x1.78802b704p4 0x1.afffffffffffbp6 0x1.1a255a8d0219bp-43 0x1.cp-28 T +REG epsg:6958 1 OK -0x1.0f28d1cb728c3p19 -0x1.ac67fbbdc374p15 -0x1.02d5e3988p4 0x1.9c0000001d5fbp6 -0x1.3fffffffeacfep2 0x1.4p-27 F +REG epsg:6958 2 OK 0x1.0ef823e086f4dp19 -0x1.ac67bf185e33p15 -0x1.8fd5aaf22p5 0x1.c3ffffffe2bfp6 -0x1.3fffffffeae9cp2 -0x1.4p-28 F +REG epsg:6958 3 OK -0x1.0f289f2147711p19 0x1.019529413b1f8p20 0x1.9ff617e6p1 0x1.9c0000001d5f2p6 0x1.3fffffffeadefp2 0x1.0p-26 F +REG epsg:6958 4 OK 0x1.0ef7e9c5c998dp19 0x1.01952b14a5ceap20 -0x1.e8d5b4544p4 0x1.c3ffffffe2bfcp6 0x1.3fffffffeaf95p2 0x0.0p0 F +REG epsg:6959 0 OK -0x1.85ba94854382ap7 0x1.e863d68aeaec1p18 -0x1.6ae85dd6p4 0x1.aeffffffffffbp6 0x1.1a095966def99p-43 0x1.0p-28 T +REG epsg:6959 1 OK -0x1.0f28d26fac5p19 -0x1.ac67d7082da7p15 -0x1.ea6e50b7p3 0x1.9b0000001d5fbp6 -0x1.3fffffffeacfep2 0x1.cp-28 F +REG epsg:6959 2 OK 0x1.0ef81e83ec4fap19 -0x1.ac679a6b4cddp15 -0x1.8927a6baep5 0x1.c2ffffffe2befp6 -0x1.3fffffffeae9bp2 -0x1.8p-29 F +REG epsg:6959 3 OK -0x1.0f289fc4f9928p19 0x1.01952803c59e6p20 0x1.0675dfeep2 0x1.9b0000001d5f2p6 0x1.3fffffffeadf3p2 0x1.cp-27 F +REG epsg:6959 4 OK 0x1.0ef7e469bab12p19 0x1.019529d6ec019p20 -0x1.db79b22c4p4 0x1.c2ffffffe2bfbp6 0x1.3fffffffeaf97p2 -0x1.0p-29 F +REG epsg:6962 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p4 0x1.47fffffffffebp5 0x0.0p0 F +REG epsg:6962 1 OK -0x1.cd4001b4b35ep18 -0x1.a3bc94468e03bp18 0x0.0p0 0x1.d665f96765596p3 0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:6962 2 OK 0x1.cd4001b4b35ep18 -0x1.a3bc94468e03bp18 0x0.0p0 0x1.94cd034c4d535p4 0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:6962 3 OK -0x1.989b8780a7db4p18 0x1.be73c0d6ac177p18 0x0.0p0 0x1.d665f96765596p3 0x1.67ffffffffff3p5 0x0.0p0 F +REG epsg:6962 4 OK 0x1.989b8780a7db4p18 0x1.be73c0d6ac177p18 0x0.0p0 0x1.94cd034c4d535p4 0x1.67ffffffffff3p5 0x0.0p0 F +REG epsg:6978 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6978 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6978 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6978 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6978 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6980 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6980 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6980 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6980 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6980 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6981 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6981 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6981 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6981 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6981 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6983 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6983 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6983 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6983 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6983 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6984 0 OK 0x1.acc4cac083127p17 0x1.321b6c7ae147bp19 0x0.0p0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d13p4 0x0.0p0 F +REG epsg:6984 1 OK -0x1.6563a5d6948e8p18 0x1.50e782a624aa8p16 0x0.0p0 0x1.d5359f29c4a3p4 0x1.abc013839acb4p4 0x0.0p0 F +REG epsg:6984 2 OK 0x1.8914384b8bd02p19 0x1.50e782a624aa8p16 0x0.0p0 0x1.48aae3fa5b8ccp5 0x1.abc013839acb5p4 0x0.0p0 F +REG epsg:6984 3 OK -0x1.2aad4f23ae03ep18 0x1.24683438a5cp20 0x0.0p0 0x1.d5359f29f36fdp4 0x1.25e009c1a3699p5 0x0.0p0 F +REG epsg:6984 4 OK 0x1.6bb90cf2188afp19 0x1.24683438a5cp20 0x0.0p0 0x1.48aae3fa44265p5 0x1.25e009c1a3699p5 0x0.0p0 F +REG epsg:6985 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6985 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6985 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6985 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6985 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6987 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6987 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6987 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6987 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6987 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6988 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6988 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6988 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6988 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6988 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6990 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:6990 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6990 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:6990 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6990 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:6991 0 OK 0x1.acc4cac083127p17 0x1.321b6c7ae147bp19 0x0.0p0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d13p4 0x0.0p0 F +REG epsg:6991 1 OK -0x1.6563a5d6948e8p18 0x1.50e782a624aa8p16 0x0.0p0 0x1.d5359f29c4a3p4 0x1.abc013839acb4p4 0x0.0p0 F +REG epsg:6991 2 OK 0x1.8914384b8bd02p19 0x1.50e782a624aa8p16 0x0.0p0 0x1.48aae3fa5b8ccp5 0x1.abc013839acb5p4 0x0.0p0 F +REG epsg:6991 3 OK -0x1.2aad4f23ae03ep18 0x1.24683438a5cp20 0x0.0p0 0x1.d5359f29f36fdp4 0x1.25e009c1a3699p5 0x0.0p0 F +REG epsg:6991 4 OK 0x1.6bb90cf2188afp19 0x1.24683438a5cp20 0x0.0p0 0x1.48aae3fa44265p5 0x1.25e009c1a3699p5 0x0.0p0 F +REG epsg:6996 0 OK 0x1.77p15 0x1.77p14 0x0.0p0 -0x1.e9ccccccccccep6 0x1.2ep5 0x0.0p0 F +REG epsg:6996 1 OK -0x1.0a2cef22b4b61p19 -0x1.f4f512f264cf6p18 0x0.0p0 -0x1.018c1489f41c5p7 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:6996 2 OK 0x1.390cef22b4b8ap19 -0x1.f4f512f264cf2p18 0x0.0p0 -0x1.d0817085b160ep6 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:6996 3 OK -0x1.cacaf7b5acc6bp18 0x1.244de94b1245bp19 0x0.0p0 -0x1.018c1489d0005p7 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:6996 4 OK 0x1.14457bdad6659p19 0x1.244de94b1245ep19 0x0.0p0 -0x1.d0817085f998fp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:6997 0 OK 0x1.3394000000004p17 0x1.3394000000004p16 0x0.0p0 -0x1.e9ccccccccccep6 0x1.2ep5 0x0.0p0 F +REG epsg:6997 1 OK -0x1.b4a386260d596p20 -0x1.9ae3adac777c8p20 0x0.0p0 -0x1.018c1489f41c5p7 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:6997 2 OK 0x1.00c4431306aeep21 -0x1.9ae3adac777c5p20 0x0.0p0 -0x1.d0817085b160ep6 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:6997 3 OK -0x1.784e432c6cb34p20 0x1.df803bd17111ap20 0x0.0p0 -0x1.018c1489d0005p7 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:6997 4 OK 0x1.c533432c6cb7p20 0x1.df803bd17111fp20 0x0.0p0 -0x1.d0817085f998fp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7005 0 OK 0x1.e83e0d0ea9de1p18 -0x1.7224611226cecp8 0x1.4e8ef65c08p7 0x1.37fffffffffffp5 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG epsg:7005 1 OK -0x1.ada1b5f0a4afp15 -0x1.0f0fcdc71fc63p19 0x1.971200573p7 0x1.1p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:7005 2 OK 0x1.018c14301cd78p20 -0x1.0f0fcdc6dd717p19 0x1.893e7de8b8p7 0x1.6p5 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG epsg:7005 3 OK -0x1.adad00623f58p15 0x1.0eb345787d07p19 0x1.15f784731p7 0x1.1p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:7005 4 OK 0x1.018c6e805cf5ep20 0x1.0eb345783ade6p19 0x1.0823f8c91p7 0x1.6p5 0x1.3fffffffffffcp2 0x1.0p-29 F +REG epsg:7006 0 OK 0x1.e836ce93d57bcp18 -0x1.722476de05227p8 0x1.432ca93ab8p7 0x1.67fffffffffffp5 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG epsg:7006 1 OK -0x1.addca6fc3cb7p15 -0x1.0f0fddc79104cp19 0x1.90ce72465p7 0x1.4p5 -0x1.4p2 -0x1.0p-29 F +REG epsg:7006 2 OK 0x1.018a4c762831p20 -0x1.0f0fddc71e676p19 0x1.78e9bfdc28p7 0x1.8ffffffffffffp5 -0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:7006 3 OK -0x1.ade7f1964458p15 0x1.0eb35573863cdp19 0x1.0fb3f23368p7 0x1.4p5 0x1.4000000000001p2 -0x1.0p-30 F +REG epsg:7006 4 OK 0x1.018aa6c544a8cp20 0x1.0eb3557313ebbp19 0x1.ef9e5fa9cp6 0x1.8ffffffffffffp5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:7007 0 OK 0x1.e82fc0507c1e4p18 -0x1.72249825a6387p8 0x1.31caf62608p7 0x1.97fffffffffffp5 0x0.0p0 0x1.0p-29 T +REG epsg:7007 1 OK -0x1.ae169b87a0eep15 -0x1.0f0ff6362c29dp19 0x1.8475a925bp7 0x1.7p5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG epsg:7007 2 OK 0x1.018894f4119f8p20 -0x1.0f0ff6358a8a7p19 0x1.62c2c89d1p7 0x1.cp5 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:7007 3 OK -0x1.ae21e64a216ap15 0x1.0eb36dd9e033fp19 0x1.035b20d43p7 0x1.7p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG epsg:7007 4 OK 0x1.0188ef421acc8p20 0x1.0eb36dd93f001p19 0x1.c3505396p6 0x1.cp5 0x1.3fffffffffffdp2 -0x1.0p-30 F +REG epsg:7035 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7035 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7035 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7035 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7035 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7037 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7037 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7037 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7037 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7037 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7039 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7039 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7039 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7039 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7039 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7041 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7041 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7041 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7041 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7041 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7057 0 OK 0x1.5ef3c00000005p23 0x1.24f8000000005p23 0x0.0p0 -0x1.7dp6 0x1.599999999998ap5 0x0.0p0 F +REG epsg:7057 1 OK 0x1.22a3a9eba4d06p23 0x1.df8dd782bb1eap22 0x0.0p0 -0x1.986f9f336714ep6 0x1.319999999997ap5 0x0.0p0 F +REG epsg:7057 2 OK 0x1.9b43d6145b306p23 0x1.df8dd782bb1eap22 0x0.0p0 -0x1.619060cc98eb2p6 0x1.319999999997ap5 0x0.0p0 F +REG epsg:7057 3 OK 0x1.2bc1af2ca42d6p23 0x1.5ec8a1bcf94bp23 0x0.0p0 -0x1.986f9f336714ep6 0x1.819999999913ep5 0x0.0p0 F +REG epsg:7057 4 OK 0x1.9225d0d35bd35p23 0x1.5ec8a1bcf94bp23 0x0.0p0 -0x1.619060cc98eb2p6 0x1.819999999913ep5 0x0.0p0 F +REG epsg:7058 0 OK 0x1.7d78400000004p23 0x1.2b12800000003p23 0x0.0p0 -0x1.73p6 0x1.5955555555543p5 0x0.0p0 F +REG epsg:7058 1 OK 0x1.4129a7f9f2b7cp23 0x1.ebc1a9db3eb54p22 0x0.0p0 -0x1.8e6bc9b95d2c3p6 0x1.3155555555533p5 0x0.0p0 F +REG epsg:7058 2 OK 0x1.b9c6d8060d48ep23 0x1.ebc1a9db3eb54p22 0x0.0p0 -0x1.57943646a2d3dp6 0x1.3155555555533p5 0x0.0p0 F +REG epsg:7058 3 OK 0x1.4a44edb5d5b78p23 0x1.64e25812490dcp23 0x0.0p0 -0x1.8e6bc9b95d2c3p6 0x1.8155555554cecp5 0x0.0p0 F +REG epsg:7058 4 OK 0x1.b0ab924a2a492p23 0x1.64e25812490dcp23 0x0.0p0 -0x1.57943646a2d3dp6 0x1.8155555554cecp5 0x0.0p0 F +REG epsg:7059 0 OK 0x1.9bfcc00000004p23 0x1.fa97800000009p22 0x0.0p0 -0x1.6cccccccccccdp6 0x1.42p5 0x0.0p0 F +REG epsg:7059 1 OK 0x1.603f3a1f06457p23 0x1.8f6967cb82a6ep22 0x0.0p0 -0x1.87011c2845d0bp6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7059 2 OK 0x1.d7ba45e0f9bb1p23 0x1.8f6967cb82a6ep22 0x0.0p0 -0x1.52987d7153c8ep6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7059 3 OK 0x1.687ebfabd1565p23 0x1.37015f5fb8aafp23 0x0.0p0 -0x1.87011c27d5925p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7059 4 OK 0x1.cf7ac0542eaa3p23 0x1.37015f5fb8aafp23 0x0.0p0 -0x1.52987d71c4075p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7060 0 OK 0x1.ba81400000005p23 0x1.0673800000003p23 0x0.0p0 -0x1.7b55555555555p6 0x1.5444444444433p5 0x0.0p0 F +REG epsg:7060 1 OK 0x1.7e4c13e08b002p23 0x1.a268ee3bf8598p22 0x0.0p0 -0x1.9679821371366p6 0x1.2c44444444421p5 0x0.0p0 F +REG epsg:7060 2 OK 0x1.f6b66c1f75008p23 0x1.a268ee3bf8598p22 0x0.0p0 -0x1.6031289739744p6 0x1.2c44444444421p5 0x0.0p0 F +REG epsg:7060 3 OK 0x1.873418b03030ap23 0x1.4037076f423fap23 0x0.0p0 -0x1.9679821371366p6 0x1.7c44444443afcp5 0x0.0p0 F +REG epsg:7060 4 OK 0x1.edce674fcfdp23 0x1.4037076f423fap23 0x0.0p0 -0x1.6031289739744p6 0x1.7c44444443afcp5 0x0.0p0 F +REG epsg:7061 0 OK 0x1.d905c00000006p23 0x1.0f9b400000004p23 0x0.0p0 -0x1.71p6 0x1.5533333333323p5 0x0.0p0 F +REG epsg:7061 1 OK 0x1.9ccc206a0363bp23 0x1.b4bda5d1c4cfep22 0x0.0p0 -0x1.8c313162e52dap6 0x1.2d3333333331p5 0x0.0p0 F +REG epsg:7061 2 OK 0x1.0a9fafcafe4e8p24 0x1.b4bda5d1c4cfep22 0x0.0p0 -0x1.55cece9d1ad27p6 0x1.2d3333333331p5 0x0.0p0 F +REG epsg:7061 3 OK 0x1.a5bd7ab989dccp23 0x1.4960d906c6971p23 0x0.0p0 -0x1.8c313162e52dap6 0x1.7d33333332a14p5 0x0.0p0 F +REG epsg:7061 4 OK 0x1.062702a33b11fp24 0x1.4960d906c6971p23 0x0.0p0 -0x1.55cece9d1ad27p6 0x1.7d33333332a14p5 0x0.0p0 F +REG epsg:7062 0 OK 0x1.f78a400000006p23 0x1.92d5000000006p22 0x0.0p0 -0x1.7eeeeeeeeeeefp6 0x1.42p5 0x0.0p0 F +REG epsg:7062 1 OK 0x1.bbccaa760f3d4p23 0x1.27a6cbb307bd7p22 0x0.0p0 -0x1.99233e4a67f2ep6 0x1.19ffffff7bb9ap5 0x0.0p0 F +REG epsg:7062 2 OK 0x1.19a3eac4f861cp24 0x1.27a6cbb307bd7p22 0x0.0p0 -0x1.64ba9f9375eb1p6 0x1.19ffffff7bb9ap5 0x0.0p0 F +REG epsg:7062 3 OK 0x1.c40c322c5b2adp23 0x1.03202e8066febp23 0x0.0p0 -0x1.99233e49f7b47p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7062 4 OK 0x1.158426e9d26afp24 0x1.03202e8066febp23 0x0.0p0 -0x1.64ba9f93e6298p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7063 0 OK 0x1.0b07600000003p24 0x1.9f0a000000006p22 0x0.0p0 -0x1.7a88888888889p6 0x1.42p5 0x0.0p0 F +REG epsg:7063 1 OK 0x1.da5112f89cb0dp23 0x1.33dba18e4f5fap22 0x0.0p0 -0x1.94bcd7e4018c8p6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7063 2 OK 0x1.28e63683b1a7fp24 0x1.33dba18e4f5fap22 0x0.0p0 -0x1.6054392d0f84bp6 0x1.19ffffff7bb9cp5 0x0.0p0 F +REG epsg:7063 3 OK 0x1.e2909ded29e95p23 0x1.093ac5316c7c8p23 0x0.0p0 -0x1.94bcd7e3914e1p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7063 4 OK 0x1.24c671096b0bbp24 0x1.093ac5316c7c8p23 0x0.0p0 -0x1.6054392d7fc32p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7064 0 OK 0x1.1a49a00000003p24 0x1.ab3f000000008p22 0x0.0p0 -0x1.76ddddddddddep6 0x1.42p5 0x0.0p0 F +REG epsg:7064 1 OK 0x1.f8d5c1f381c9dp23 0x1.4010f5d7c01b6p22 0x0.0p0 -0x1.91122d3956e1cp6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7064 2 OK 0x1.38285f063f1b8p24 0x1.4010f5d7c01b6p22 0x0.0p0 -0x1.5ca98e8264dap6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7064 3 OK 0x1.008aa335c6363p24 0x1.0f5517cf6180fp23 0x0.0p0 -0x1.91122d38e6a36p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7064 4 OK 0x1.34089cca39ca3p24 0x1.0f5517cf6180fp23 0x0.0p0 -0x1.5ca98e82d5187p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7065 0 OK 0x1.298be00000004p24 0x1.b774000000008p22 0x0.0p0 -0x1.7344444444444p6 0x1.42p5 0x0.0p0 F +REG epsg:7065 1 OK 0x1.0bad2cb87a2b3p24 0x1.4c461ffc78793p22 0x0.0p0 -0x1.8d78939fbd482p6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7065 2 OK 0x1.476a934785d55p24 0x1.4c461ffc78793p22 0x0.0p0 -0x1.590ff4e8cb407p6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7065 3 OK 0x1.0fcced555ed7p24 0x1.156f811e5c033p23 0x0.0p0 -0x1.8d78939f4d09bp6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7065 4 OK 0x1.434ad2aaa1298p24 0x1.156f811e5c033p23 0x0.0p0 -0x1.590ff4e93b7edp6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7066 0 OK 0x1.38ce200000004p24 0x1.e848000000007p22 0x0.0p0 -0x1.6eaaaaaaaaaabp6 0x1.4eaaaaaaaaa98p5 0x0.0p0 F +REG epsg:7066 1 OK 0x1.1ac183aa1e44ep24 0x1.7dade8e19f138p22 0x0.0p0 -0x1.898256577a0e7p6 0x1.26aaaaaaaaa87p5 0x0.0p0 F +REG epsg:7066 2 OK 0x1.56dabc55e1bbap24 0x1.7dade8e19f138p22 0x0.0p0 -0x1.53d2fefddb46fp6 0x1.26aaaaaaaaa87p5 0x0.0p0 F +REG epsg:7066 3 OK 0x1.1f19c435d725bp24 0x1.2dd9b6ee8c9d7p23 0x0.0p0 -0x1.898256577a0e7p6 0x1.76aaaaaaaaaa4p5 0x0.0p0 F +REG epsg:7066 4 OK 0x1.52827bca28dadp24 0x1.2dd9b6ee8c9d7p23 0x0.0p0 -0x1.53d2fefddb46fp6 0x1.76aaaaaaaaaa4p5 0x0.0p0 F +REG epsg:7067 0 OK 0x1.4810600000004p24 0x1.cfde000000005p22 0x0.0p0 -0x1.6a22222222222p6 0x1.42p5 0x0.0p0 F +REG epsg:7067 1 OK 0x1.2a31acb87a2b3p24 0x1.64b01ffc7879p22 0x0.0p0 -0x1.8456717d9b25fp6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7067 2 OK 0x1.65ef134785d55p24 0x1.64b01ffc7879p22 0x0.0p0 -0x1.4fedd2c6a91e4p6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7067 3 OK 0x1.2e516d555ed7p24 0x1.21a4811e5c031p23 0x0.0p0 -0x1.8456717d2ae79p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7067 4 OK 0x1.61cf52aaa1298p24 0x1.21a4811e5c031p23 0x0.0p0 -0x1.4fedd2c7195cbp6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7068 0 OK 0x1.5752a00000004p24 0x1.7a6b000000004p22 0x0.0p0 -0x1.77p6 0x1.475555555553dp5 0x0.0p0 F +REG epsg:7068 1 OK 0x1.3957814bf32bfp24 0x1.0fac08dba0d8bp22 0x0.0p0 -0x1.917781dab3258p6 0x1.1f55555555528p5 0x0.0p0 F +REG epsg:7068 2 OK 0x1.754dbeb40cd48p24 0x1.0fac08dba0d8bp22 0x0.0p0 -0x1.5c887e254cda8p6 0x1.1f55555555528p5 0x0.0p0 F +REG epsg:7068 3 OK 0x1.3d8c5df67f1a1p24 0x1.edb4537ca3082p22 0x0.0p0 -0x1.917781dab3258p6 0x1.6f5555555554bp5 0x0.0p0 F +REG epsg:7068 4 OK 0x1.7118e20980e66p24 0x1.edb4537ca3082p22 0x0.0p0 -0x1.5c887e254cda8p6 0x1.6f5555555554bp5 0x0.0p0 F +REG epsg:7069 0 OK 0x1.6694e00000004p24 0x1.86a0000000005p22 0x0.0p0 -0x1.6faaaaaaaaaabp6 0x1.42p5 0x0.0p0 F +REG epsg:7069 1 OK 0x1.48b63a6c52526p24 0x1.1b7251274f913p22 0x0.0p0 -0x1.89defa0623ae9p6 0x1.19ffffff7bb9cp5 0x0.0p0 F +REG epsg:7069 2 OK 0x1.84738593adae2p24 0x1.1b7251274f913p22 0x0.0p0 -0x1.55765b4f31a6dp6 0x1.19ffffff7bb9cp5 0x0.0p0 F +REG epsg:7069 3 OK 0x1.4cd5f924e63d2p24 0x1.fa0acd4a55e0bp22 0x0.0p0 -0x1.89defa05b3703p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7069 4 OK 0x1.8053c6db19c36p24 0x1.fa0acd4a55e0bp22 0x0.0p0 -0x1.55765b4fa1e53p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7070 0 OK 0x1.75d7200000004p24 0x1.7a6b000000004p22 0x0.0p0 -0x1.6dp6 0x1.42p5 0x0.0p0 F +REG epsg:7070 1 OK 0x1.57f87e5690148p24 0x1.0f3d5f338d05bp22 0x0.0p0 -0x1.87344f5b7903dp6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7070 2 OK 0x1.93b5c1a96fecp24 0x1.0f3d5f338d05bp22 0x0.0p0 -0x1.52cbb0a486fc2p6 0x1.19ffffff7bb9bp5 0x0.0p0 F +REG epsg:7070 3 OK 0x1.5c183c84c3c82p24 0x1.edd5be29a78ccp22 0x0.0p0 -0x1.87344f5b08c56p6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7070 4 OK 0x1.8f96037b3c386p24 0x1.edd5be29a78ccp22 0x0.0p0 -0x1.52cbb0a4f73aap6 0x1.69ffffff1e162p5 0x0.0p0 F +REG epsg:7071 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7071 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7071 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7071 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7071 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7073 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7073 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7073 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7073 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7073 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7074 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 0x1.38p5 -0x1.9p4 0x0.0p0 F +REG epsg:7074 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7074 2 OK 0x1.f8272811f1555p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7074 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7074 4 OK 0x1.07218271ed492p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.642297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7075 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.68p5 -0x1.9p4 0x0.0p0 F +REG epsg:7075 1 OK -0x1.fbe5023e2a96p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7075 2 OK 0x1.f8272811f154bp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7075 3 OK -0x1.2fd8271ed48c8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7075 4 OK 0x1.07218271ed48cp20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7076 0 OK 0x1.e848000000021p18 0x1.b997b102aac2p22 0x0.0p0 0x1.98p5 -0x1.9p4 0x0.0p0 F +REG epsg:7076 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7076 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7076 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7076 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7077 0 OK 0x1.e847fffffffeap18 0x1.b997b102aac2p22 0x0.0p0 0x1.c800000000001p5 -0x1.9p4 0x0.0p0 F +REG epsg:7077 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7077 2 OK 0x1.f8272811f153dp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7077 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7077 4 OK 0x1.07218271ed484p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7078 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.f8p5 -0x1.9p4 0x0.0p0 F +REG epsg:7078 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7078 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7078 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.4p4 0x0.0p0 F +REG epsg:7078 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7079 0 OK 0x1.e847fffffffbep18 0x1.b997b102aac2p22 0x0.0p0 0x1.14p6 -0x1.9p4 0x0.0p0 F +REG epsg:7079 1 OK -0x1.fbe5023e2acap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7079 2 OK 0x1.f8272811f1531p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7079 3 OK -0x1.2fd8271ed49bp16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7079 4 OK 0x1.07218271ed47ep20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7080 0 OK 0x1.e847fffffffeap18 0x1.b997b102aac2p22 0x0.0p0 0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG epsg:7080 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7080 2 OK 0x1.f8272811f153dp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7080 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG epsg:7080 4 OK 0x1.07218271ed484p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7081 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.44p6 -0x1.9p4 0x0.0p0 F +REG epsg:7081 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7081 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7081 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7081 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7084 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7084 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7084 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7084 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7084 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7086 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7086 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7086 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7086 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7086 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7088 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7088 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7088 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7088 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7088 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7109 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.c2p6 0x1.84p5 0x0.0p0 F +REG epsg:7109 1 OK -0x1.c1ad0f3e5026p18 -0x1.01db6b5e5581ep19 0x0.0p0 -0x1.e02ee6d6e93fcp6 0x1.5bfffffe1e371p5 0x0.0p0 F +REG epsg:7109 2 OK 0x1.7352879f28128p19 -0x1.01db6b5e5581ep19 0x0.0p0 -0x1.a3d1192916c03p6 0x1.5bfffffe1e371p5 0x0.0p0 F +REG epsg:7109 3 OK -0x1.562c9e88a3a9p18 0x1.1c9c55cbef772p19 0x0.0p0 -0x1.e02ee6d56277p6 0x1.abfffffdc019bp5 0x0.0p0 F +REG epsg:7109 4 OK 0x1.3d924f4451d41p19 0x1.1c9c55cbef771p19 0x0.0p0 -0x1.a3d1192a9d89p6 0x1.abfffffdc019bp5 0x0.0p0 F +REG epsg:7110 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.c2p6 0x1.8000000000001p5 0x0.0p0 F +REG epsg:7110 1 OK -0x1.f1992c7a6b8eep18 -0x1.021e2a35374ffp19 0x0.0p0 -0x1.dfe3b84cb1ed7p6 0x1.57fffffe41ffp5 0x0.0p0 F +REG epsg:7110 2 OK 0x1.5a74963d35c6ep19 -0x1.021e2a35375p19 0x0.0p0 -0x1.a41c47b34e129p6 0x1.57fffffe41ffp5 0x0.0p0 F +REG epsg:7110 3 OK -0x1.87f7f18b1ce78p18 0x1.1c692adaab3b7p19 0x0.0p0 -0x1.dfe3b84b4786fp6 0x1.a7fffffdde59fp5 0x0.0p0 F +REG epsg:7110 4 OK 0x1.25a3f8c58e734p19 0x1.1c692adaab3b6p19 0x0.0p0 -0x1.a41c47b4b8792p6 0x1.a7fffffdde59fp5 0x0.0p0 F +REG epsg:7111 0 OK 0x1.24f8p17 0x1.86ap17 0x0.0p0 -0x1.bcp6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:7111 1 OK -0x1.c2cecfd0b1026p18 -0x1.3eb003b784092p18 0x0.0p0 -0x1.da2ee6d815b4ap6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7111 2 OK 0x1.73e367e858813p19 -0x1.3eb003b784092p18 0x0.0p0 -0x1.9dd11927ea4b6p6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7111 3 OK -0x1.57b78ee325fcfp18 0x1.7dbfbc30ab079p19 0x0.0p0 -0x1.da2ee6d815b4ap6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7111 4 OK 0x1.3e57c77192fe8p19 0x1.7dbfbc30ab079p19 0x0.0p0 -0x1.9dd11927ea4b6p6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7112 0 OK 0x1.86ap17 0x1.24f8p17 0x0.0p0 -0x1.b2p6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:7112 1 OK -0x1.91f6fd5a7dd46p18 -0x1.6f80b9b385a16p18 0x0.0p0 -0x1.d02ee6d815b4ap6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7112 2 OK 0x1.8c4b7ead3eea3p19 -0x1.6f80b9b385a16p18 0x0.0p0 -0x1.93d11927ea4b7p6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7112 3 OK -0x1.26e06bdb9685p18 0x1.6553eaccd2782p19 0x0.0p0 -0x1.d02ee6d815b4ap6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7112 4 OK 0x1.56c035edcb428p19 0x1.6553eaccd2782p19 0x0.0p0 -0x1.93d11927ea4b7p6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7113 0 OK 0x1.86ap17 0x1.86ap16 0x0.0p0 -0x1.a6p6 0x1.82aaaaaaaa27cp5 0x0.0p0 F +REG epsg:7113 1 OK -0x1.91a81649dacap18 -0x1.a080b567a7558p18 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7113 2 OK 0x1.8c240b24ed65p19 -0x1.a080b567a7558p18 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7113 3 OK -0x1.2731f50e8ae0cp18 0x1.4cd7c877a5cdfp19 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7113 4 OK 0x1.56e8fa8745706p19 0x1.4cd7c877a5cdfp19 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7114 0 OK 0x1.86ap16 0x1.86ap15 0x0.0p0 -0x1.a6p6 0x1.82aaaaaaaa27cp5 0x0.0p0 F +REG epsg:7114 1 OK -0x1.f34b80bd8663p18 -0x1.d150c2a5ff3ap18 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7114 2 OK 0x1.5b4dc05ec3318p19 -0x1.d150c2a5ff3ap18 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7114 3 OK -0x1.88d630cb9542dp18 0x1.346b9a237b3c1p19 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7114 4 OK 0x1.26131865caa16p19 0x1.346b9a237b3c1p19 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7115 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.afp6 0x1.66p5 0x0.0p0 F +REG epsg:7115 1 OK -0x1.8a4c709fc41f8p18 -0x1.039cf5ffc44a4p19 0x0.0p0 -0x1.cb2962a21e30ap6 0x1.3dfffffef2fe3p5 0x0.0p0 F +REG epsg:7115 2 OK 0x1.8876384fe2106p19 -0x1.039cf5ffc44a3p19 0x0.0p0 -0x1.92d69d5de1cf4p6 0x1.3dfffffef2fe3p5 0x0.0p0 F +REG epsg:7115 3 OK -0x1.2c0ad0f37b9d1p18 0x1.1b1b37c4dc244p19 0x0.0p0 -0x1.cb2962a13e238p6 0x1.8dfffffe83198p5 0x0.0p0 F +REG epsg:7115 4 OK 0x1.59556879bdcfp19 0x1.1b1b37c4dc244p19 0x0.0p0 -0x1.92d69d5ec1dc7p6 0x1.8dfffffe83198p5 0x0.0p0 F +REG epsg:7116 0 OK 0x1.86ap16 0x1.86ap16 0x0.0p0 -0x1.bdp6 0x1.71ffffffffff7p5 0x0.0p0 F +REG epsg:7116 1 OK -0x1.efa6f242ec3f2p18 -0x1.a292542c5e108p18 0x0.0p0 -0x1.d9ec0dd24eb34p6 0x1.49fffffffffe9p5 0x0.0p0 F +REG epsg:7116 2 OK 0x1.597b792176202p19 -0x1.a292542c5e108p18 0x0.0p0 -0x1.a013f22db14cbp6 0x1.49fffffffffe9p5 0x0.0p0 F +REG epsg:7116 3 OK -0x1.8cb0d27322c93p18 0x1.4c004923fe641p19 0x0.0p0 -0x1.d9ec0dd24eb34p6 0x1.99ffffffffb05p5 0x0.0p0 F +REG epsg:7116 4 OK 0x1.2800693991651p19 0x1.4c004923fe641p19 0x0.0p0 -0x1.a013f22db14cbp6 0x1.99ffffffffb05p5 0x0.0p0 F +REG epsg:7117 0 OK 0x1.86ap17 0x1.86ap15 0x0.0p0 -0x1.b1aaaaaaaaaadp6 0x1.6e4444444443ap5 0x0.0p0 F +REG epsg:7117 1 OK -0x1.8d2f14a36d62ep18 -0x1.d3cfd3acc0a82p18 0x0.0p0 -0x1.ce587fb072ed5p6 0x1.464444444443p5 0x0.0p0 F +REG epsg:7117 2 OK 0x1.89e78a51b6b0ep19 -0x1.d3cfd3acc0a9ap18 0x0.0p0 -0x1.94fcd5a4e2686p6 0x1.464444444442ep5 0x0.0p0 F +REG epsg:7117 3 OK -0x1.2bd452dd9f555p18 0x1.336416c4ccbbep19 0x0.0p0 -0x1.ce587fb072ed5p6 0x1.9644444443edbp5 0x0.0p0 F +REG epsg:7117 4 OK 0x1.593a296ecfaa2p19 0x1.336416c4ccbb8p19 0x0.0p0 -0x1.94fcd5a4e2686p6 0x1.9644444443edbp5 0x0.0p0 F +REG epsg:7118 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.b155555555553p6 0x1.5555555555555p5 0x0.0p0 F +REG epsg:7118 1 OK -0x1.e8b70753e2b42p18 -0x1.047e89ff13483p19 0x0.0p0 -0x1.cc88646f620b5p6 0x1.2d5555549375cp5 0x0.0p0 F +REG epsg:7118 2 OK 0x1.560383a9f15a1p19 -0x1.047e89ff13483p19 0x0.0p0 -0x1.9622463b489fp6 0x1.2d5555549375cp5 0x0.0p0 F +REG epsg:7118 3 OK -0x1.911619b79439ap18 0x1.1a5ac66f7245dp19 0x0.0p0 -0x1.cc88646ebddd8p6 0x1.7d555554292cap5 0x0.0p0 F +REG epsg:7118 4 OK 0x1.2a330cdbca1cdp19 0x1.1a5ac66f7245dp19 0x0.0p0 -0x1.9622463becccdp6 0x1.7d555554292cap5 0x0.0p0 F +REG epsg:7119 0 OK 0x1.e0977efec56d6p18 0x0.0p0 0x0.0p0 -0x1.c2p6 0x1.84p5 0x0.0p0 F +REG epsg:7119 1 OK -0x1.70d4290ef72f6p20 -0x1.a6fe72fc2cdb1p20 0x0.0p0 -0x1.e02ee6d6e93fcp6 0x1.5bfffffe1e371p5 0x0.0p0 F +REG epsg:7119 2 OK 0x1.308ff4472cf29p21 -0x1.a6fe72fc2cdb2p20 0x0.0p0 -0x1.a3d1192916c03p6 0x1.5bfffffe1e37p5 0x0.0p0 F +REG epsg:7119 3 OK -0x1.18a79eec2e3e6p20 0x1.d2e18c121138fp20 0x0.0p0 -0x1.e02ee6d56277p6 0x1.abfffffdc019bp5 0x0.0p0 F +REG epsg:7119 4 OK 0x1.0479af35c87a3p21 0x1.d2e18c121138ep20 0x0.0p0 -0x1.a3d1192a9d89p6 0x1.abfffffdc019bp5 0x0.0p0 F +REG epsg:7120 0 OK 0x1.4064ff53f7ceep18 0x0.0p0 0x0.0p0 -0x1.c2p6 0x1.8000000000001p5 0x0.0p0 F +REG epsg:7120 1 OK -0x1.9822970b0cff8p20 -0x1.a76bf093c4e5ep20 0x0.0p0 -0x1.dfe3b84cb1ed7p6 0x1.57fffffe41ffp5 0x0.0p0 F +REG epsg:7120 2 OK 0x1.1c2a8b5a8473p21 -0x1.a76bf093c4e5fp20 0x0.0p0 -0x1.a41c47b34e129p6 0x1.57fffffe41ffp5 0x0.0p0 F +REG epsg:7120 3 OK -0x1.417f1a71196b6p20 0x1.d28d9c4dd90f8p20 0x0.0p0 -0x1.dfe3b84b4786fp6 0x1.a7fffffdde59fp5 0x0.0p0 F +REG epsg:7120 4 OK 0x1.e1b19a1b1552p20 0x1.d28d9c4dd90f6p20 0x0.0p0 -0x1.a41c47b4b8792p6 0x1.a7fffffdde59fp5 0x0.0p0 F +REG epsg:7121 0 OK 0x1.e0977efec56d6p18 0x1.4064ff53f7cedp19 0x0.0p0 -0x1.bcp6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:7121 1 OK -0x1.71c1d16c2661p20 -0x1.056405bc7ed6cp20 0x0.0p0 -0x1.da2ee6d815b4ap6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7121 2 OK 0x1.3106c875c48bdp21 -0x1.056405bc7ed6cp20 0x0.0p0 -0x1.9dd11927ea4b6p6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7121 3 OK -0x1.19eb8db8c4d08p20 0x1.391d43579e63cp21 0x0.0p0 -0x1.da2ee6d815b4ap6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7121 4 OK 0x1.051ba69c13c39p21 0x1.391d43579e63cp21 0x0.0p0 -0x1.9dd11927ea4b6p6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7122 0 OK 0x1.4064ff53f7cedp19 0x1.e0977efec56d6p18 0x0.0p0 -0x1.b2p6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:7122 1 OK -0x1.49b20ef6944a2p20 -0x1.2d6df3059c55p20 0x0.0p0 -0x1.d02ee6d815b4ap6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7122 2 OK 0x1.450b8725460c7p21 -0x1.2d6df3059c55p20 0x0.0p0 -0x1.93d11927ea4b7p6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:7122 3 OK -0x1.e3b8b64eb4865p19 0x1.251575aac87fbp21 0x0.0p0 -0x1.d02ee6d815b4ap6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7122 4 OK 0x1.1920ad3da909p21 0x1.251575aac87fbp21 0x0.0p0 -0x1.93d11927ea4b7p6 0x1.abffffffffccp5 0x0.0p0 F +REG epsg:7123 0 OK 0x1.4064ff53f7cedp19 0x1.4064ff53f7ceep18 0x0.0p0 -0x1.a6p6 0x1.82aaaaaaaa27cp5 0x0.0p0 F +REG epsg:7123 1 OK -0x1.4971577d174cp20 -0x1.559ea6428ba2p20 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7123 2 OK 0x1.44eb2b68878d6p21 -0x1.559ea6428ba2p20 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7123 3 OK -0x1.e43e771e98b13p19 0x1.1100460568bcp21 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7123 4 OK 0x1.19421d71a213bp21 0x1.1100460568bcp21 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7124 0 OK 0x1.4064ff53f7ceep18 0x1.4064ff34d6a16p17 0x0.0p0 -0x1.a6p6 0x1.82aaaaaaaa27cp5 0x0.0p0 F +REG epsg:7124 1 OK -0x1.9986d4c3c5456p20 -0x1.7da809289a4a4p20 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7124 2 OK 0x1.1cdcaa36e0966p21 -0x1.7da809289a4a4p20 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.5aaaaaaaaaa9dp5 0x0.0p0 F +REG epsg:7124 3 OK -0x1.4235647eabd7ep20 0x1.f9f05837a7814p20 0x0.0p0 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaa74ep5 0x0.0p0 F +REG epsg:7124 4 OK 0x1.e267e428a7bf4p20 0x1.f9f05837a7814p20 0x0.0p0 -0x1.87ea6341d85f2p6 0x1.aaaaaaaaaa74fp5 0x0.0p0 F +REG epsg:7125 0 OK 0x1.4064ff53f7cedp19 0x0.0p0 0x0.0p0 -0x1.afp6 0x1.66p5 0x0.0p0 F +REG epsg:7125 1 OK -0x1.43685b0817852p20 -0x1.a9dfe2d3f15e3p20 0x0.0p0 -0x1.cb2962a21e30ap6 0x1.3dfffffef2fe3p5 0x0.0p0 F +REG epsg:7125 2 OK 0x1.41e6ad2e07aa7p21 -0x1.a9dfe2d3f15e2p20 0x0.0p0 -0x1.92d69d5de1cf4p6 0x1.3dfffffef2fe3p5 0x0.0p0 F +REG epsg:7125 3 OK -0x1.ec31febf2445bp19 0x1.d069cb05c9e16p20 0x0.0p0 -0x1.cb2962a13e238p6 0x1.8dfffffe83198p5 0x0.0p0 F +REG epsg:7125 4 OK 0x1.1b3eff59c4f93p21 0x1.d069cb05c9e17p20 0x0.0p0 -0x1.92d69d5ec1dc7p6 0x1.8dfffffe83198p5 0x0.0p0 F +REG epsg:7126 0 OK 0x1.4064ff53f7ceep18 0x1.4064ff53f7ceep18 0x0.0p0 -0x1.bdp6 0x1.71ffffffffff7p5 0x0.0p0 F +REG epsg:7126 1 OK -0x1.9689f05d3203ap20 -0x1.57510c994f336p20 0x0.0p0 -0x1.d9ec0dd24eb34p6 0x1.49fffffffffe9p5 0x0.0p0 F +REG epsg:7126 2 OK 0x1.1b5e380396f5fp21 -0x1.57510c994f336p20 0x0.0p0 -0x1.a013f22db14cbp6 0x1.49fffffffffe9p5 0x0.0p0 F +REG epsg:7126 3 OK -0x1.455ea334c83dp20 0x1.104f853abf81p21 0x0.0p0 -0x1.d9ec0dd24eb34p6 0x1.99ffffffffb05p5 0x0.0p0 F +REG epsg:7126 4 OK 0x1.e59122dec4254p20 0x1.104f853abf81p21 0x0.0p0 -0x1.a013f22db14cbp6 0x1.99ffffffffb05p5 0x0.0p0 F +REG epsg:7127 0 OK 0x1.4064ff53f7cedp19 0x1.4064ff559b3dp17 0x0.0p0 -0x1.b1aaaaaaaaaadp6 0x1.6e4444444443ap5 0x0.0p0 F +REG epsg:7127 1 OK -0x1.45c632300cd98p20 -0x1.7fb434560ee5cp20 0x0.0p0 -0x1.ce587fb072ed5p6 0x1.464444444443p5 0x0.0p0 F +REG epsg:7127 2 OK 0x1.431598c20253bp21 -0x1.7fb434560ee7p20 0x0.0p0 -0x1.94fcd5a4e2686p6 0x1.464444444442ep5 0x0.0p0 F +REG epsg:7127 3 OK -0x1.ebd89abf9096bp19 0x1.f840128996676p20 0x0.0p0 -0x1.ce587fb072ed5p6 0x1.9644444443edbp5 0x0.0p0 F +REG epsg:7127 4 OK 0x1.1b28a659e00cbp21 0x1.f84012899666cp20 0x0.0p0 -0x1.94fcd5a4e2686p6 0x1.9644444443edbp5 0x0.0p0 F +REG epsg:7128 0 OK 0x1.4064d554c9862p18 0x0.0p0 0x0.0p0 -0x1.b155555555553p6 0x1.5555555555555p5 0x0.0p0 F +REG epsg:7128 1 OK -0x1.90d91bb7a9012p20 -0x1.ab51b5c8efbdp20 0x0.0p0 -0x1.cc88646f620b5p6 0x1.2d5555549375cp5 0x0.0p0 F +REG epsg:7128 2 OK 0x1.1885c33106e22p21 -0x1.ab51b5c8efbdp20 0x0.0p0 -0x1.9622463b489fp6 0x1.2d5555549375cp5 0x0.0p0 F +REG epsg:7128 3 OK -0x1.48f96f03901a2p20 0x1.cf2dde7a04bc8p20 0x0.0p0 -0x1.cc88646ebddd8p6 0x1.7d555554292cap5 0x0.0p0 F +REG epsg:7128 4 OK 0x1.e92bd9adf4dd4p20 0x1.cf2dde7a04bc8p20 0x0.0p0 -0x1.9622463becccdp6 0x1.7d555554292cap5 0x0.0p0 F +REG epsg:7131 0 OK 0x1.77p15 0x1.77p14 0x0.0p0 -0x1.e9ccccccccccep6 0x1.2ep5 0x0.0p0 F +REG epsg:7131 1 OK -0x1.0a2cef22b4b61p19 -0x1.f4f512f264cf6p18 0x0.0p0 -0x1.018c1489f41c5p7 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:7131 2 OK 0x1.390cef22b4b8ap19 -0x1.f4f512f264cf2p18 0x0.0p0 -0x1.d0817085b160ep6 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:7131 3 OK -0x1.cacaf7b5acc6bp18 0x1.244de94b1245bp19 0x0.0p0 -0x1.018c1489d0005p7 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7131 4 OK 0x1.14457bdad6659p19 0x1.244de94b1245ep19 0x0.0p0 -0x1.d0817085f998fp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7132 0 OK 0x1.3394000000004p17 0x1.3394000000004p16 0x0.0p0 -0x1.e9ccccccccccep6 0x1.2ep5 0x0.0p0 F +REG epsg:7132 1 OK -0x1.b4a386260d596p20 -0x1.9ae3adac777c8p20 0x0.0p0 -0x1.018c1489f41c5p7 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:7132 2 OK 0x1.00c4431306aeep21 -0x1.9ae3adac777c5p20 0x0.0p0 -0x1.d0817085b160ep6 0x1.05ffffffa6f4bp5 0x0.0p0 F +REG epsg:7132 3 OK -0x1.784e432c6cb34p20 0x1.df803bd17111ap20 0x0.0p0 -0x1.018c1489d0005p7 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7132 4 OK 0x1.c533432c6cb7p20 0x1.df803bd17111fp20 0x0.0p0 -0x1.d0817085f998fp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7133 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7133 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7133 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7133 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7133 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7134 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7134 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7134 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7134 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7134 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7136 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7136 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7136 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7136 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7136 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7137 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7137 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7137 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7137 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7137 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7139 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7139 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7139 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7139 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7139 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7142 0 OK 0x1.4c61b461d878p17 0x1.ef6f91d52876dp16 -0x1.af0119d09p6 0x1.19b2574d476cdp5 0x1.fbbedc552449ep4 0x1.1d2e28p-8 F +REG epsg:7142 1 OK -0x1.958d1c0292b5dp18 -0x1.942bf63ea7ffcp18 -0x1.3ee56ed4bp6 0x1.d554adecdd1b3p4 0x1.abbedc5006f66p4 0x1.9a49bcp-8 F +REG epsg:7142 2 OK 0x1.710098c14370ep19 -0x1.9418d9fa8478cp18 -0x1.eb4784e02p6 0x1.48ba57a38ec86p5 0x1.abbedc5003113p4 0x1.ca7b28p-8 F +REG epsg:7142 3 OK -0x1.5ae9f1149363dp18 0x1.549f00aa3b05p19 -0x1.7730e1b3ep6 0x1.d554aded1c5f5p4 0x1.25df6e2d23736p5 0x1.3edafp-9 F +REG epsg:7142 4 OK 0x1.539c21210df22p19 0x1.54a8287f4afc9p19 -0x1.08d84e3a78p7 0x1.48ba57a475d93p5 0x1.25df6e2cf1619p5 0x1.9b5578p-9 F +REG epsg:7257 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.53ccccccccccdp6 0x1.4466666666666p5 0x0.0p0 F +REG epsg:7257 1 OK -0x1.5cbcef7dccf1ep18 -0x1.e752e30d2bdbep18 0x0.0p0 -0x1.6e1f11f98e5c1p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7257 2 OK 0x1.98be77bee6799p19 -0x1.e752e30d2bdbcp18 0x0.0p0 -0x1.397a87a00b3d9p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7257 3 OK -0x1.0b6dacb72f0edp18 0x1.2b1ec21fd5ab9p19 0x0.0p0 -0x1.6e1f11f91879cp6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7257 4 OK 0x1.7016d65b9788p19 0x1.2b1ec21fd5abap19 0x0.0p0 -0x1.397a87a0811fep6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7258 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.53ccccccccccdp6 0x1.4466666666666p5 0x0.0p0 F +REG epsg:7258 1 OK -0x1.1e09afbd50e5fp20 -0x1.8fb4ff74c6cd2p20 0x0.0p0 -0x1.6e1f11f98e5c1p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7258 2 OK 0x1.4f4157dea873ap21 -0x1.8fb4ff74c6cdp20 0x0.0p0 -0x1.397a87a00b3d9p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7258 3 OK -0x1.b6b1ac12789bep19 0x1.eaae827f875cep20 0x0.0p0 -0x1.6e1f11f91879cp6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7258 4 OK 0x1.2de8eb049e279p21 0x1.eaae827f875cfp20 0x0.0p0 -0x1.397a87a0811fep6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7259 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5433333333333p6 0x1.4733333333333p5 0x0.0p0 F +REG epsg:7259 1 OK -0x1.5d3de07ab4b1ap18 -0x1.e7111dd244c02p18 0x0.0p0 -0x1.6ea8ffec32f7ap6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7259 2 OK 0x1.98fef03d5a58dp19 -0x1.e7111dd244c02p18 0x0.0p0 -0x1.39bd667a336edp6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7259 3 OK -0x1.0aeb2619b6c0ap18 0x1.2b3de209037aep19 0x0.0p0 -0x1.6ea8ffebb63d7p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7259 4 OK 0x1.6fd5930cdb605p19 0x1.2b3de209037aep19 0x0.0p0 -0x1.39bd667ab029p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7260 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5433333333333p6 0x1.4733333333333p5 0x0.0p0 F +REG epsg:7260 1 OK -0x1.1e7371fc89a5cp20 -0x1.8f7f0d6b7360bp20 0x0.0p0 -0x1.6ea8ffec32f7ap6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7260 2 OK 0x1.4f7638fe44d3p21 -0x1.8f7f0d6b7360bp20 0x0.0p0 -0x1.39bd667a336edp6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7260 3 OK -0x1.b5db8e2e3c1c8p19 0x1.eae1913121fap20 0x0.0p0 -0x1.6ea8ffebb63d7p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7260 4 OK 0x1.2db3638b8f074p21 0x1.eae1913121fap20 0x0.0p0 -0x1.39bd667ab029p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7261 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5766666666666p6 0x1.38p5 0x0.0p0 F +REG epsg:7261 1 OK -0x1.5a8dd148ce6f6p18 -0x1.e86947def11fp18 0x0.0p0 -0x1.71229be616b07p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7261 2 OK 0x1.97a6e8a467371p19 -0x1.e86947def11fp18 0x0.0p0 -0x1.3daa30e6b61c6p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7261 3 OK -0x1.0d9c67d4a261bp18 0x1.2a960cd0b5dd5p19 0x0.0p0 -0x1.71229be5bbe76p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7261 4 OK 0x1.712e33ea51304p19 0x1.2a960cd0b5dd4p19 0x0.0p0 -0x1.3daa30e710e56p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7262 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5766666666666p6 0x1.38p5 0x0.0p0 F +REG epsg:7262 1 OK -0x1.1c3f17dec1a4p20 -0x1.909956bc5a24ep20 0x0.0p0 -0x1.71229be616b07p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7262 2 OK 0x1.4e5c0bef60d1ap21 -0x1.909956bc5a24fp20 0x0.0p0 -0x1.3daa30e6b61c6p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7262 3 OK -0x1.ba4639423fb54p19 0x1.e9ce40543d1bbp20 0x0.0p0 -0x1.71229be5bbe76p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7262 4 OK 0x1.2ece0e508fedp21 0x1.e9ce40543d1bap20 0x0.0p0 -0x1.3daa30e710e56p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7263 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5d33333333333p6 0x1.439999999999ap5 0x0.0p0 F +REG epsg:7263 1 OK -0x1.5c97755430eb8p18 -0x1.e764bc7e0d3aap18 0x0.0p0 -0x1.777b6eeb3504p6 0x1.1b9999991110ep5 0x0.0p0 F +REG epsg:7263 2 OK 0x1.98abbaaa18766p19 -0x1.e764bc7e0d3a8p18 0x0.0p0 -0x1.42eaf77b31625p6 0x1.1b9999991110ep5 0x0.0p0 F +REG epsg:7263 3 OK -0x1.0b91f4345ba2dp18 0x1.2b157c2dc5e81p19 0x0.0p0 -0x1.777b6eeac108dp6 0x1.6b999998b23c5p5 0x0.0p0 F +REG epsg:7263 4 OK 0x1.7028fa1a2dd2p19 0x1.2b157c2dc5e82p19 0x0.0p0 -0x1.42eaf77ba55d9p6 0x1.6b999998b23c4p5 0x0.0p0 F +REG epsg:7264 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5d33333333333p6 0x1.439999999999ap5 0x0.0p0 F +REG epsg:7264 1 OK -0x1.1deaf287070f1p20 -0x1.8fc3a35985ap20 0x0.0p0 -0x1.777b6eeb3504p6 0x1.1b9999991110ep5 0x0.0p0 F +REG epsg:7264 2 OK 0x1.4f31f94383882p21 -0x1.8fc3a359859ffp20 0x0.0p0 -0x1.42eaf77b31625p6 0x1.1b9999991110ep5 0x0.0p0 F +REG epsg:7264 3 OK -0x1.b6ed2f6c809p19 0x1.ea9f4c3d01c54p20 0x0.0p0 -0x1.777b6eeac108dp6 0x1.6b999998b23c5p5 0x0.0p0 F +REG epsg:7264 4 OK 0x1.2df7cbdb2024ap21 0x1.ea9f4c3d01c55p20 0x0.0p0 -0x1.42eaf77ba55d9p6 0x1.6b999998b23c4p5 0x0.0p0 F +REG epsg:7265 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.559999999999ap6 0x1.4066666666666p5 0x0.0p0 F +REG epsg:7265 1 OK -0x1.5c06e9da4d0ep18 -0x1.e7af52957f96ap18 0x0.0p0 -0x1.6fba2f83b4dbfp6 0x1.18666665e6409p5 0x0.0p0 F +REG epsg:7265 2 OK 0x1.986374ed2687p19 -0x1.e7af52957f96ap18 0x0.0p0 -0x1.3b7903af7e575p6 0x1.18666665e6409p5 0x0.0p0 F +REG epsg:7265 3 OK -0x1.0c25a861416b6p18 0x1.2af2aa18b7547p19 0x0.0p0 -0x1.6fba2f834843cp6 0x1.6866666589d25p5 0x0.0p0 F +REG epsg:7265 4 OK 0x1.7072d430a0b5bp19 0x1.2af2aa18b7547p19 0x0.0p0 -0x1.3b7903afeaef8p6 0x1.6866666589d25p5 0x0.0p0 F +REG epsg:7266 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.559999999999ap6 0x1.4066666666666p5 0x0.0p0 F +REG epsg:7266 1 OK -0x1.1d7463f7cc88fp20 -0x1.9000d07b946fep20 0x0.0p0 -0x1.6fba2f83b4dbfp6 0x1.18666665e6409p5 0x0.0p0 F +REG epsg:7266 2 OK 0x1.4ef6b1fbe644ap21 -0x1.9000d07b946fep20 0x0.0p0 -0x1.3b7903af7e575p6 0x1.18666665e6409p5 0x0.0p0 F +REG epsg:7266 3 OK -0x1.b7df7b258351p19 0x1.ea662d6de0cacp20 0x0.0p0 -0x1.6fba2f834843cp6 0x1.6866666589d25p5 0x0.0p0 F +REG epsg:7266 4 OK 0x1.2e345ec960d46p21 0x1.ea662d6de0cacp20 0x0.0p0 -0x1.3b7903afeaef8p6 0x1.6866666589d25p5 0x0.0p0 F +REG epsg:7267 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5ap6 0x1.3cccccccccccdp5 0x0.0p0 F +REG epsg:7267 1 OK -0x1.5b646f9597e7ap18 -0x1.e80051c2286a2p18 0x0.0p0 -0x1.73f4ebe67508cp6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7267 2 OK 0x1.981237cacbf3dp19 -0x1.e80051c2286a2p18 0x0.0p0 -0x1.400b14198af74p6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7267 3 OK -0x1.0cc8215dfe3fcp18 0x1.2acaf620a43fep19 0x0.0p0 -0x1.73f4ebe610576p6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7267 4 OK 0x1.70c410aeff1fep19 0x1.2acaf620a43fep19 0x0.0p0 -0x1.400b1419efa8ap6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7268 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5ap6 0x1.3cccccccccccdp5 0x0.0p0 F +REG epsg:7268 1 OK -0x1.1cef20009e241p20 -0x1.90433fa546cd8p20 0x0.0p0 -0x1.73f4ebe67508cp6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7268 2 OK 0x1.4eb410004f122p21 -0x1.90433fa546cd8p20 0x0.0p0 -0x1.400b14198af74p6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7268 3 OK -0x1.b8ea00f9de322p19 0x1.ea250c48f58bbp20 0x0.0p0 -0x1.73f4ebe610576p6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7268 4 OK 0x1.2e77003e778cap21 0x1.ea250c48f58bbp20 0x0.0p0 -0x1.400b1419efa8ap6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7269 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5933333333333p6 0x1.38p5 0x0.0p0 F +REG epsg:7269 1 OK -0x1.5a8e699146be6p18 -0x1.e869d11e0c786p18 0x0.0p0 -0x1.72ef68b2e37d4p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7269 2 OK 0x1.97a734c8a35f3p19 -0x1.e869d11e0c786p18 0x0.0p0 -0x1.3f76fdb382e92p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7269 3 OK -0x1.0d9cebf1ae1eep18 0x1.2a96567a592a7p19 0x0.0p0 -0x1.72ef68b288b44p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7269 4 OK 0x1.712e75f8d70f7p19 0x1.2a96567a592a7p19 0x0.0p0 -0x1.3f76fdb3ddb23p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7270 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5933333333333p6 0x1.38p5 0x0.0p0 F +REG epsg:7270 1 OK -0x1.1c3f94c624beep20 -0x1.9099c74e75a49p20 0x0.0p0 -0x1.72ef68b2e37d4p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7270 2 OK 0x1.4e5c4a63125f9p21 -0x1.9099c74e75a49p20 0x0.0p0 -0x1.3f76fdb382e92p6 0x1.0fffffff937eap5 0x0.0p0 F +REG epsg:7270 3 OK -0x1.ba4711fadb2dap19 0x1.e9ceb92a9f489p20 0x0.0p0 -0x1.72ef68b288b44p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7270 4 OK 0x1.2ece447eb6cb8p21 0x1.e9ceb92a9f489p20 0x0.0p0 -0x1.3f76fdb3ddb23p6 0x1.5fffffff3d9fcp5 0x0.0p0 F +REG epsg:7271 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5a9999999999ap6 0x1.4333333333333p5 0x0.0p0 F +REG epsg:7271 1 OK -0x1.5c84af35407bp18 -0x1.e76d9161d8862p18 0x0.0p0 -0x1.74dcd56c59af5p6 0x1.1b333332abbe6p5 0x0.0p0 F +REG epsg:7271 2 OK 0x1.98a2579aa03cep19 -0x1.e76d9161d8864p18 0x0.0p0 -0x1.40565dc6d984p6 0x1.1b333332abbe5p5 0x0.0p0 F +REG epsg:7271 3 OK -0x1.0ba3fc6f38e44p18 0x1.2b10d1c0f21acp19 0x0.0p0 -0x1.74dcd56be6a56p6 0x1.6b3333324d358p5 0x0.0p0 F +REG epsg:7271 4 OK 0x1.7031fe379c71ap19 0x1.2b10d1c0f21abp19 0x0.0p0 -0x1.40565dc74c8dep6 0x1.6b3333324d358p5 0x0.0p0 F +REG epsg:7272 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5a9999999999ap6 0x1.4333333333333p5 0x0.0p0 F +REG epsg:7272 1 OK -0x1.1ddb8c81cf9bbp20 -0x1.8fcae1c0180cap20 0x0.0p0 -0x1.74dcd56c59af5p6 0x1.1b333332abbe5p5 0x0.0p0 F +REG epsg:7272 2 OK 0x1.4f2a4640e7cd8p21 -0x1.8fcae1c0180ccp20 0x0.0p0 -0x1.40565dc6d984p6 0x1.1b333332abbe5p5 0x0.0p0 F +REG epsg:7272 3 OK -0x1.b70ac3f6e0a24p19 0x1.ea97a4e22a2abp20 0x0.0p0 -0x1.74dcd56be6a56p6 0x1.6b3333324d358p5 0x0.0p0 F +REG epsg:7272 4 OK 0x1.2dff30fdb8284p21 0x1.ea97a4e22a2a9p20 0x0.0p0 -0x1.40565dc74c8dep6 0x1.6b3333324d358p5 0x0.0p0 F +REG epsg:7273 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.599999999999ap6 0x1.4466666666666p5 0x0.0p0 F +REG epsg:7273 1 OK -0x1.5cbc0a35b77d6p18 -0x1.e752159c65da4p18 0x0.0p0 -0x1.73ebdec65b28dp6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7273 2 OK 0x1.98be051adbbebp19 -0x1.e752159c65da4p18 0x0.0p0 -0x1.3f47546cd80a7p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7273 3 OK -0x1.0b6ce767b7209p18 0x1.2b1e536bd99cdp19 0x0.0p0 -0x1.73ebdec5e5468p6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7273 4 OK 0x1.701673b3db904p19 0x1.2b1e536bd99cdp19 0x0.0p0 -0x1.3f47546d4deccp6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7274 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.599999999999ap6 0x1.4466666666666p5 0x0.0p0 F +REG epsg:7274 1 OK -0x1.1e08f3ae4c86fp20 -0x1.8fb456f3bed92p20 0x0.0p0 -0x1.73ebdec65b28dp6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7274 2 OK 0x1.4f40f9d72643ap21 -0x1.8fb456f3bed92p20 0x0.0p0 -0x1.3f47546cd80a7p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7274 3 OK -0x1.b6b068669dcbp19 0x1.eaadcce6254bfp20 0x0.0p0 -0x1.73ebdec5e5468p6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7274 4 OK 0x1.2de89a19a772ep21 0x1.eaadcce6254bfp20 0x0.0p0 -0x1.3f47546d4deccp6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7275 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5666666666666p6 0x1.3133333333333p5 0x0.0p0 F +REG epsg:7275 1 OK -0x1.5964fdde566f2p18 -0x1.e8fb5f81a9ea8p18 0x0.0p0 -0x1.6fd51cd1ec31cp6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7275 2 OK 0x1.97127eef2b379p19 -0x1.e8fb5f81a9ea8p18 0x0.0p0 -0x1.3cf7affae09bp6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7275 3 OK -0x1.0ec3e8cb1ab53p18 0x1.2a4ccd918d891p19 0x0.0p0 -0x1.6fd51cd19e51ep6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7275 4 OK 0x1.71c1f4658d5aap19 0x1.2a4ccd918d891p19 0x0.0p0 -0x1.3cf7affb2e7aep6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7276 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5666666666666p6 0x1.3133333333333p5 0x0.0p0 F +REG epsg:7276 1 OK -0x1.1b4ba25bbff62p20 -0x1.91112a3a82e34p20 0x0.0p0 -0x1.6fd51cd1ec31cp6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7276 2 OK 0x1.4de2512ddffb3p21 -0x1.91112a3a82e34p20 0x0.0p0 -0x1.3cf7affae09bp6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7276 3 OK -0x1.bc2af914009cep19 0x1.e9561878aff71p20 0x0.0p0 -0x1.6fd51cd19e51ep6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7276 4 OK 0x1.2f473e4500276p21 0x1.e9561878aff71p20 0x0.0p0 -0x1.3cf7affb2e7aep6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7277 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5c9999999999ap6 0x1.3933333333333p5 0x0.0p0 F +REG epsg:7277 1 OK -0x1.5ac279b190be4p18 -0x1.e84ea70969f12p18 0x0.0p0 -0x1.7663d41081a9ep6 0x1.11333332c415fp5 0x0.0p0 F +REG epsg:7277 2 OK 0x1.97c13cd8c85fcp19 -0x1.e84ea70969f1p18 0x0.0p0 -0x1.42cf5f22b1896p6 0x1.11333332c416p5 0x0.0p0 F +REG epsg:7277 3 OK -0x1.0d671d664a0aep18 0x1.2aa2e5467665fp19 0x0.0p0 -0x1.7663d41024774p6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7277 4 OK 0x1.71138eb32506p19 0x1.2aa2e5467666p19 0x0.0p0 -0x1.42cf5f230ebcp6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7278 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5c9999999999ap6 0x1.3933333333333p5 0x0.0p0 F +REG epsg:7278 1 OK -0x1.1c6a489d36c61p20 -0x1.90837f82f9825p20 0x0.0p0 -0x1.7663d41081a9ep6 0x1.11333332c415fp5 0x0.0p0 F +REG epsg:7278 2 OK 0x1.4e71a44e9b63bp21 -0x1.90837f82f9823p20 0x0.0p0 -0x1.42cf5f22b1896p6 0x1.11333332c416p5 0x0.0p0 F +REG epsg:7278 3 OK -0x1.b9eecdfccf6f8p19 0x1.e9e352c60a8b3p20 0x0.0p0 -0x1.7663d41024774p6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7278 4 OK 0x1.2eb8337f33dc8p21 0x1.e9e352c60a8b4p20 0x0.0p0 -0x1.42cf5f230ebcp6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7279 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5a66666666666p6 0x1.4133333333333p5 0x0.0p0 F +REG epsg:7279 1 OK -0x1.5c2a5624b300cp18 -0x1.e79c46d2de5cap18 0x0.0p0 -0x1.7490d2b4f9caep6 0x1.19333332b1016p5 0x0.0p0 F +REG epsg:7279 2 OK 0x1.98752b1259806p19 -0x1.e79c46d2de5cap18 0x0.0p0 -0x1.403bfa17d301ep6 0x1.19333332b1016p5 0x0.0p0 F +REG epsg:7279 3 OK -0x1.0c006b35a848dp18 0x1.2afb128314fdcp19 0x0.0p0 -0x1.7490d2b48b625p6 0x1.6933333253f7dp5 0x0.0p0 F +REG epsg:7279 4 OK 0x1.7060359ad4246p19 0x1.2afb128314fdcp19 0x0.0p0 -0x1.403bfa18416a7p6 0x1.6933333253f7dp5 0x0.0p0 F +REG epsg:7280 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5a66666666666p6 0x1.4133333333333p5 0x0.0p0 F +REG epsg:7280 1 OK -0x1.1d9171db01f7ap20 -0x1.8ff13157f15eep20 0x0.0p0 -0x1.7490d2b4f9caep6 0x1.19333332b1016p5 0x0.0p0 F +REG epsg:7280 2 OK 0x1.4f0538ed80fbfp21 -0x1.8ff13157f15eep20 0x0.0p0 -0x1.403bfa17d301ep6 0x1.19333332b1016p5 0x0.0p0 F +REG epsg:7280 3 OK -0x1.b7a264c66ba1ap19 0x1.ea73f84996cf2p20 0x0.0p0 -0x1.7490d2b48b625p6 0x1.6933333253f7ep5 0x0.0p0 F +REG epsg:7280 4 OK 0x1.2e2519319ae88p21 0x1.ea73f84996cf2p20 0x0.0p0 -0x1.403bfa18416a7p6 0x1.6933333253f7ep5 0x0.0p0 F +REG epsg:7281 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5ap6 0x1.30ccccccccccdp5 0x0.0p0 F +REG epsg:7281 1 OK -0x1.59546034927eep18 -0x1.e904687d8606ep18 0x0.0p0 -0x1.736a414e64947p6 0x1.08cccccc6eb23p5 0x0.0p0 F +REG epsg:7281 2 OK 0x1.970a301a493f7p19 -0x1.e904687d8606ep18 0x0.0p0 -0x1.4095beb19b6b9p6 0x1.08cccccc6eb23p5 0x0.0p0 F +REG epsg:7281 3 OK -0x1.0ed59eff3e5bep18 0x1.2a48d7241a777p19 0x0.0p0 -0x1.736a414e176d3p6 0x1.58cccccc1e9efp5 0x0.0p0 F +REG epsg:7281 4 OK 0x1.71cacf7f9f2dfp19 0x1.2a48d7241a777p19 0x0.0p0 -0x1.4095beb1e892dp6 0x1.58cccccc1e9efp5 0x0.0p0 F +REG epsg:7282 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5ap6 0x1.30ccccccccccdp5 0x0.0p0 F +REG epsg:7282 1 OK -0x1.1b3e0177eb923p20 -0x1.9118935b6f7a6p20 0x0.0p0 -0x1.736a414e64947p6 0x1.08cccccc6eb23p5 0x0.0p0 F +REG epsg:7282 2 OK 0x1.4ddb80bbf5c94p21 -0x1.9118935b6f7a6p20 0x0.0p0 -0x1.4095beb19b6b8p6 0x1.08cccccc6eb23p5 0x0.0p0 F +REG epsg:7282 3 OK -0x1.bc48070fb81cp19 0x1.e94f9863397f6p20 0x0.0p0 -0x1.736a414e176d3p6 0x1.58cccccc1e9efp5 0x0.0p0 F +REG epsg:7282 4 OK 0x1.2f4e81c3ee072p21 0x1.e94f9863397f6p20 0x0.0p0 -0x1.4095beb1e892dp6 0x1.58cccccc1e9efp5 0x0.0p0 F +REG epsg:7283 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5c66666666667p6 0x1.339999999999bp5 0x0.0p0 F +REG epsg:7283 1 OK -0x1.59cc47e77496cp18 -0x1.e8c7aba28fdd8p18 0x0.0p0 -0x1.75f017519044ep6 0x1.0b99999936244p5 0x0.0p0 F +REG epsg:7283 2 OK 0x1.974623f3ba4cp19 -0x1.e8c7aba28fdd6p18 0x0.0p0 -0x1.42dcb57b3c87ep6 0x1.0b99999936244p5 0x0.0p0 F +REG epsg:7283 3 OK -0x1.0e5bd57c03f7bp18 0x1.2a662c9a3df5ep19 0x0.0p0 -0x1.75f017513dfb1p6 0x1.5b999998e3cd6p5 0x0.0p0 F +REG epsg:7283 4 OK 0x1.718deabe01fc6p19 0x1.2a662c9a3df5fp19 0x0.0p0 -0x1.42dcb57b8ed1bp6 0x1.5b999998e3cd6p5 0x0.0p0 F +REG epsg:7284 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5c66666666667p6 0x1.339999999999bp5 0x0.0p0 F +REG epsg:7284 1 OK -0x1.1ba05a561bbc1p20 -0x1.90e6c20e74669p20 0x0.0p0 -0x1.75f017519044ep6 0x1.0b99999936244p5 0x0.0p0 F +REG epsg:7284 2 OK 0x1.4e0cad2b0ddeap21 -0x1.90e6c20e74668p20 0x0.0p0 -0x1.42dcb57b3c87ep6 0x1.0b99999936244p5 0x0.0p0 F +REG epsg:7284 3 OK -0x1.bb803ef339486p19 0x1.e97fb7088a8c8p20 0x0.0p0 -0x1.75f017513dfb1p6 0x1.5b999998e3cd6p5 0x0.0p0 F +REG epsg:7284 4 OK 0x1.2f1c8fbcce52bp21 0x1.e97fb7088a8c9p20 0x0.0p0 -0x1.42dcb57b8ed1bp6 0x1.5b999998e3cd6p5 0x0.0p0 F +REG epsg:7285 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.539999999999ap6 0x1.3533333333333p5 0x0.0p0 F +REG epsg:7285 1 OK -0x1.5a13882d055a8p18 -0x1.e8a6a5609047ep18 0x0.0p0 -0x1.6d358061d7e21p6 0x1.0d333332cc8b3p5 0x0.0p0 F +REG epsg:7285 2 OK 0x1.9769c41682ad4p19 -0x1.e8a6a5609047ep18 0x0.0p0 -0x1.39fdb2d15b514p6 0x1.0d333332cc8b3p5 0x0.0p0 F +REG epsg:7285 3 OK -0x1.0e17a08636818p18 0x1.2a781b35aa9b8p19 0x0.0p0 -0x1.6d35806182912p6 0x1.5d33333278ea6p5 0x0.0p0 F +REG epsg:7285 4 OK 0x1.716bd0431b40cp19 0x1.2a781b35aa9b8p19 0x0.0p0 -0x1.39fdb2d1b0a23p6 0x1.5d33333278ea6p5 0x0.0p0 F +REG epsg:7286 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.539999999999ap6 0x1.3533333333333p5 0x0.0p0 F +REG epsg:7286 1 OK -0x1.1bdacb28c43b5p20 -0x1.90cbabcdc3244p20 0x0.0p0 -0x1.6d358061d7e21p6 0x1.0d333332cc8b2p5 0x0.0p0 F +REG epsg:7286 2 OK 0x1.4e29e594621dcp21 -0x1.90cbabcdc3244p20 0x0.0p0 -0x1.39fdb2d15b514p6 0x1.0d333332cc8b2p5 0x0.0p0 F +REG epsg:7286 3 OK -0x1.bb105bb33481cp19 0x1.e99d218ab3b56p20 0x0.0p0 -0x1.6d35806182912p6 0x1.5d33333278ea6p5 0x0.0p0 F +REG epsg:7286 4 OK 0x1.2f0096eccd209p21 0x1.e99d218ab3b56p20 0x0.0p0 -0x1.39fdb2d1b0a23p6 0x1.5d33333278ea6p5 0x0.0p0 F +REG epsg:7287 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.569999999999ap6 0x1.38ccccccccccdp5 0x0.0p0 F +REG epsg:7287 1 OK -0x1.5ab295aa59d4ap18 -0x1.e8591026aed1ap18 0x0.0p0 -0x1.705f24c29682cp6 0x1.10cccccc5e9p5 0x0.0p0 F +REG epsg:7287 2 OK 0x1.97b94ad52ce9bp19 -0x1.e8591026aed1cp18 0x0.0p0 -0x1.3cd40e709cb08p6 0x1.10cccccc5e9p5 0x0.0p0 F +REG epsg:7287 3 OK -0x1.0d7a5dce021cap18 0x1.2a9f6cc29a5ffp19 0x0.0p0 -0x1.705f24c23a1f3p6 0x1.60cccccc080e1p5 0x0.0p0 F +REG epsg:7287 4 OK 0x1.711d2ee7010dcp19 0x1.2a9f6cc29a5fep19 0x0.0p0 -0x1.3cd40e70f9142p6 0x1.60cccccc080e1p5 0x0.0p0 F +REG epsg:7288 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.569999999999ap6 0x1.38ccccccccccdp5 0x0.0p0 F +REG epsg:7288 1 OK -0x1.1c5d3ffbc6ccfp20 -0x1.908c0975ea299p20 0x0.0p0 -0x1.705f24c29682cp6 0x1.10cccccc5e9p5 0x0.0p0 F +REG epsg:7288 2 OK 0x1.4e6b1ffde3662p21 -0x1.908c0975ea29ap20 0x0.0p0 -0x1.3cd40e709cb08p6 0x1.10cccccc5e9p5 0x0.0p0 F +REG epsg:7288 3 OK -0x1.ba0e62a02044p19 0x1.e9dda13d18c29p20 0x0.0p0 -0x1.705f24c23a1f3p6 0x1.60cccccc080e1p5 0x0.0p0 F +REG epsg:7288 4 OK 0x1.2ec018a80810bp21 0x1.e9dda13d18c28p20 0x0.0p0 -0x1.3cd40e70f9142p6 0x1.60cccccc080e1p5 0x0.0p0 F +REG epsg:7289 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.53ccccccccccdp6 0x1.4ap5 0x0.0p0 F +REG epsg:7289 1 OK -0x1.5dc15403098dep18 -0x1.e6cf88a5746cep18 0x0.0p0 -0x1.6e66c2e544a97p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7289 2 OK 0x1.9940aa0184c79p19 -0x1.e6cf88a5746ccp18 0x0.0p0 -0x1.3932d6b454f03p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7289 3 OK -0x1.0a68336aa770bp18 0x1.2b5dd074bf654p19 0x0.0p0 -0x1.6e66c2e4c0cb2p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7289 4 OK 0x1.6f9419b553b8ep19 0x1.2b5dd074bf655p19 0x0.0p0 -0x1.3932d6b4d8ce7p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7290 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.53ccccccccccdp6 0x1.4ap5 0x0.0p0 F +REG epsg:7290 1 OK -0x1.1edf4340ff76cp20 -0x1.8f4942cc66967p20 0x0.0p0 -0x1.6e66c2e544a97p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7290 2 OK 0x1.4fac21a07fbcp21 -0x1.8f4942cc66965p20 0x0.0p0 -0x1.3932d6b454f03p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7290 3 OK -0x1.b504bf02e75dcp19 0x1.eb15f2a5ea2eep20 0x0.0p0 -0x1.6e66c2e4c0cb2p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7290 4 OK 0x1.2d7dafc0b9d8p21 0x1.eb15f2a5ea2efp20 0x0.0p0 -0x1.3932d6b4d8ce7p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7291 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5bccccccccccdp6 0x1.319999999999ap5 0x0.0p0 F +REG epsg:7291 1 OK -0x1.5976134a8e3d4p18 -0x1.e8f2b9d2de0acp18 0x0.0p0 -0x1.753ffb2b62ddap6 0x1.0999999939ff2p5 0x0.0p0 F +REG epsg:7291 2 OK 0x1.971b09a5471dfp19 -0x1.e8f2b9d2de0acp18 0x0.0p0 -0x1.42599e6e36bcp6 0x1.0999999939ff2p5 0x0.0p0 F +REG epsg:7291 3 OK -0x1.0eb28f9a6ad0fp18 0x1.2a50fc3bcfb56p19 0x0.0p0 -0x1.753ffb2b14441p6 0x1.59999998e9464p5 0x0.0p0 F +REG epsg:7291 4 OK 0x1.71b947cd3568p19 0x1.2a50fc3bcfb55p19 0x0.0p0 -0x1.42599e6e85559p6 0x1.59999998e9463p5 0x0.0p0 F +REG epsg:7292 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5bccccccccccdp6 0x1.319999999999ap5 0x0.0p0 F +REG epsg:7292 1 OK -0x1.1b59a579e5d71p20 -0x1.910a128c27b8dp20 0x0.0p0 -0x1.753ffb2b62ddap6 0x1.0999999939ff2p5 0x0.0p0 F +REG epsg:7292 2 OK 0x1.4de952bcf2eb2p21 -0x1.910a128c27b8dp20 0x0.0p0 -0x1.42599e6e36bcp6 0x1.0999999939ff2p5 0x0.0p0 F +REG epsg:7292 3 OK -0x1.bc0e83acfd176p19 0x1.e95cf4ceea621p20 0x0.0p0 -0x1.753ffb2b14441p6 0x1.59999998e9464p5 0x0.0p0 F +REG epsg:7292 4 OK 0x1.2f4020eb3f458p21 0x1.e95cf4ceea61fp20 0x0.0p0 -0x1.42599e6e85559p6 0x1.59999998e9463p5 0x0.0p0 F +REG epsg:7293 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5766666666666p6 0x1.4533333333333p5 0x0.0p0 F +REG epsg:7293 1 OK -0x1.5ce19f4861f1cp18 -0x1.e7402a33aef62p18 0x0.0p0 -0x1.71c2c1fa8f1bfp6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7293 2 OK 0x1.98d0cfa430f84p19 -0x1.e7402a33aef64p18 0x0.0p0 -0x1.3d0a0ad23db0dp6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7293 3 OK -0x1.0b48824dbae42p18 0x1.2b279e187f83ap19 0x0.0p0 -0x1.71c2c1fa174cbp6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7293 4 OK 0x1.70044126dd719p19 0x1.2b279e187f839p19 0x0.0p0 -0x1.3d0a0ad2b5801p6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7294 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5766666666666p6 0x1.4533333333333p5 0x0.0p0 F +REG epsg:7294 1 OK -0x1.1e27c6f70c7edp20 -0x1.8fa5a4522d886p20 0x0.0p0 -0x1.71c2c1fa8f1bfp6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7294 2 OK 0x1.4f50637b863fp21 -0x1.8fa5a4522d887p20 0x0.0p0 -0x1.3d0a0ad23db0dp6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7294 3 OK -0x1.b674b478e576p19 0x1.eabd0aea88a4fp20 0x0.0p0 -0x1.71c2c1fa174cbp6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7294 4 OK 0x1.2dd9ad1e395d3p21 0x1.eabd0aea88a4ep20 0x0.0p0 -0x1.3d0a0ad2b5801p6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7295 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5433333333333p6 0x1.3ap5 0x0.0p0 F +REG epsg:7295 1 OK -0x1.5ae7fb7943f9cp18 -0x1.e83ee03c0429cp18 0x0.0p0 -0x1.6e06d542f7b6ap6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7295 2 OK 0x1.97d3fdbca1fd9p19 -0x1.e83ee03c0429ap18 0x0.0p0 -0x1.3a5f91236eafcp6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7295 3 OK -0x1.0d456ee0aadfp18 0x1.2aac958ac253bp19 0x0.0p0 -0x1.6e06d54298e25p6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7295 4 OK 0x1.7102b770557p19 0x1.2aac958ac253cp19 0x0.0p0 -0x1.3a5f9123cd841p6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7296 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5433333333333p6 0x1.3ap5 0x0.0p0 F +REG epsg:7296 1 OK -0x1.1c890c12fba5fp20 -0x1.90768eda2f936p20 0x0.0p0 -0x1.6e06d542f7b6ap6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7296 2 OK 0x1.4e8106097dd3ap21 -0x1.90768eda2f935p20 0x0.0p0 -0x1.3a5f91236eafcp6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7296 3 OK -0x1.b9b78d7574762p19 0x1.e9f33771cf348p20 0x0.0p0 -0x1.6e06d54298e25p6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7296 4 OK 0x1.2eaa635d5d1e1p21 0x1.e9f33771cf349p20 0x0.0p0 -0x1.3a5f9123cd841p6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7297 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5d33333333333p6 0x1.3f9999999999ap5 0x0.0p0 F +REG epsg:7297 1 OK -0x1.5be0c2818960ap18 -0x1.e7bfc202276bap18 0x0.0p0 -0x1.7749ff4f16f8dp6 0x1.179999991b77ap5 0x0.0p0 F +REG epsg:7297 2 OK 0x1.98506140c4b0fp19 -0x1.e7bfc202276b8p18 0x0.0p0 -0x1.431c67174f6d8p6 0x1.179999991b77bp5 0x0.0p0 F +REG epsg:7297 3 OK -0x1.0c4857294cbdep18 0x1.2ae8e7f576d5cp19 0x0.0p0 -0x1.7749ff4eac2b7p6 0x1.67999998bfa5bp5 0x0.0p0 F +REG epsg:7297 4 OK 0x1.70842b94a65f7p19 0x1.2ae8e7f576d5dp19 0x0.0p0 -0x1.431c6717ba3afp6 0x1.67999998bfa5bp5 0x0.0p0 F +REG epsg:7298 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5d33333333333p6 0x1.3f9999999999ap5 0x0.0p0 F +REG epsg:7298 1 OK -0x1.1d5518b572706p20 -0x1.900e4b72836d6p20 0x0.0p0 -0x1.7749ff4f16f8dp6 0x1.179999991b77bp5 0x0.0p0 F +REG epsg:7298 2 OK 0x1.4ee70c5ab938ep21 -0x1.900e4b72836d5p20 0x0.0p0 -0x1.431c67174f6d8p6 0x1.179999991b77bp5 0x0.0p0 F +REG epsg:7298 3 OK -0x1.b818600c2ceep19 0x1.ea562b7146e31p20 0x0.0p0 -0x1.7749ff4eac2b7p6 0x1.67999998bfa5bp5 0x0.0p0 F +REG epsg:7298 4 OK 0x1.2e4298030b3cp21 0x1.ea562b7146e32p20 0x0.0p0 -0x1.431c6717ba3afp6 0x1.67999998bfa5bp5 0x0.0p0 F +REG epsg:7299 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5933333333333p6 0x1.4733333333333p5 0x0.0p0 F +REG epsg:7299 1 OK -0x1.5d3de07ab4b1ap18 -0x1.e7111dd244c02p18 0x0.0p0 -0x1.73a8ffec32f7ap6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7299 2 OK 0x1.98fef03d5a58dp19 -0x1.e7111dd244c02p18 0x0.0p0 -0x1.3ebd667a336ecp6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7299 3 OK -0x1.0aeb2619b6c0ap18 0x1.2b3de209037aep19 0x0.0p0 -0x1.73a8ffebb63d7p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7299 4 OK 0x1.6fd5930cdb605p19 0x1.2b3de209037aep19 0x0.0p0 -0x1.3ebd667ab029p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7300 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5933333333333p6 0x1.4733333333333p5 0x0.0p0 F +REG epsg:7300 1 OK -0x1.1e7371fc89a5cp20 -0x1.8f7f0d6b7360bp20 0x0.0p0 -0x1.73a8ffec32f7ap6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7300 2 OK 0x1.4f7638fe44d3p21 -0x1.8f7f0d6b7360bp20 0x0.0p0 -0x1.3ebd667a336ecp6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7300 3 OK -0x1.b5db8e2e3c1c8p19 0x1.eae1913121fap20 0x0.0p0 -0x1.73a8ffebb63d7p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7300 4 OK 0x1.2db3638b8f074p21 0x1.eae1913121fap20 0x0.0p0 -0x1.3ebd667ab029p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7301 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5e9999999999ap6 0x1.3133333333333p5 0x0.0p0 F +REG epsg:7301 1 OK -0x1.5963cde8a0786p18 -0x1.e8fa4cb68181p18 0x0.0p0 -0x1.780850051f65p6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7301 2 OK 0x1.9711e6f4503c3p19 -0x1.e8fa4cb68181p18 0x0.0p0 -0x1.452ae32e13ce4p6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7301 3 OK -0x1.0ec2dff5bfa3ap18 0x1.2a4c3a647d815p19 0x0.0p0 -0x1.78085004d1852p6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7301 4 OK 0x1.71c16ffadfd1dp19 0x1.2a4c3a647d815p19 0x0.0p0 -0x1.452ae32e61ae2p6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7302 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5e9999999999ap6 0x1.3133333333333p5 0x0.0p0 F +REG epsg:7302 1 OK -0x1.1b4aa90c4bbap20 -0x1.911048d72fa95p20 0x0.0p0 -0x1.780850051f65p6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7302 2 OK 0x1.4de1d48625dd2p21 -0x1.911048d72fa95p20 0x0.0p0 -0x1.452ae32e13ce4p6 0x1.09333332d4597p5 0x0.0p0 F +REG epsg:7302 3 OK -0x1.bc2946a4171p19 0x1.e955270a9b1bep20 0x0.0p0 -0x1.78085004d1852p6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7302 4 OK 0x1.2f46d1a905c42p21 0x1.e955270a9b1bep20 0x0.0p0 -0x1.452ae32e61ae2p6 0x1.5933333283f35p5 0x0.0p0 F +REG epsg:7303 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.56ccccccccccdp6 0x1.42ccccccccccdp5 0x0.0p0 F +REG epsg:7303 1 OK -0x1.5c7393e9eebe8p18 -0x1.e777da90c1ac4p18 0x0.0p0 -0x1.710b0befec6f8p6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7303 2 OK 0x1.9899c9f4f75f4p19 -0x1.e777da90c1ac4p18 0x0.0p0 -0x1.3c8e8da9ad2a1p6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7303 3 OK -0x1.0bb7674245542p18 0x1.2b0cf3698395fp19 0x0.0p0 -0x1.710b0bef7a559p6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7303 4 OK 0x1.703bb3a122aa1p19 0x1.2b0cf3698395fp19 0x0.0p0 -0x1.3c8e8daa1f44p6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7304 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.56ccccccccccdp6 0x1.42ccccccccccdp5 0x0.0p0 F +REG epsg:7304 1 OK -0x1.1dcd8492ce8a7p20 -0x1.8fd351825b70ap20 0x0.0p0 -0x1.710b0befec6f8p6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7304 2 OK 0x1.4f23424967456p21 -0x1.8fd351825b70ap20 0x0.0p0 -0x1.3c8e8da9ad2a1p6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7304 3 OK -0x1.b72a9e3004b74p19 0x1.ea914c4f8a4f6p20 0x0.0p0 -0x1.710b0bef7a559p6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7304 4 OK 0x1.2e07278c012dfp21 0x1.ea914c4f8a4f6p20 0x0.0p0 -0x1.3c8e8daa1f44p6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7305 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.58p6 0x1.3f33333333333p5 0x0.0p0 F +REG epsg:7305 1 OK -0x1.5bd00802fd97ap18 -0x1.e7ca066c858cep18 0x0.0p0 -0x1.7211ebe77cbc7p6 0x1.17333332b6103p5 0x0.0p0 F +REG epsg:7305 2 OK 0x1.984804017ecc7p19 -0x1.e7ca066c858cep18 0x0.0p0 -0x1.3dee141883439p6 0x1.17333332b6102p5 0x0.0p0 F +REG epsg:7305 3 OK -0x1.0c5ba273c68c7p18 0x1.2ae52662f3c7fp19 0x0.0p0 -0x1.7211ebe712d28p6 0x1.673333325a8c9p5 0x0.0p0 F +REG epsg:7305 4 OK 0x1.708dd139e346cp19 0x1.2ae52662f3c7fp19 0x0.0p0 -0x1.3dee1418ed2d8p6 0x1.673333325a8c9p5 0x0.0p0 F +REG epsg:7306 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.58p6 0x1.3f33333333333p5 0x0.0p0 F +REG epsg:7306 1 OK -0x1.1d47602bd6eecp20 -0x1.9016b74bad53bp20 0x0.0p0 -0x1.7211ebe77cbc7p6 0x1.17333332b6103p5 0x0.0p0 F +REG epsg:7306 2 OK 0x1.4ee03015eb78p21 -0x1.9016b74bad53bp20 0x0.0p0 -0x1.3dee141883439p6 0x1.17333332b6102p5 0x0.0p0 F +REG epsg:7306 3 OK -0x1.b838068aeefbcp19 0x1.ea500210308b2p20 0x0.0p0 -0x1.7211ebe712d28p6 0x1.673333325a8c9p5 0x0.0p0 F +REG epsg:7306 4 OK 0x1.2e4a81a2bbbf8p21 0x1.ea500210308b4p20 0x0.0p0 -0x1.3dee1418ed2d8p6 0x1.673333325a8c9p5 0x0.0p0 F +REG epsg:7307 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5733333333333p6 0x1.3d33333333333p5 0x0.0p0 F +REG epsg:7307 1 OK -0x1.5b765b176d3cep18 -0x1.e7f75b2bf4796p18 0x0.0p0 -0x1.712cecb66ffaap6 0x1.15333332baecap5 0x0.0p0 F +REG epsg:7307 2 OK 0x1.981b2d8bb69dcp19 -0x1.e7f75b2bf4796p18 0x0.0p0 -0x1.3d3979aff66bcp6 0x1.15333332baecap5 0x0.0p0 F +REG epsg:7307 3 OK -0x1.0cb628b1ae69ep18 0x1.2acf56d1119afp19 0x0.0p0 -0x1.712cecb60a6dcp6 0x1.6533333260f49p5 0x0.0p0 F +REG epsg:7307 4 OK 0x1.70bb1458d7347p19 0x1.2acf56d1119aep19 0x0.0p0 -0x1.3d3979b05bf8ap6 0x1.6533333260f49p5 0x0.0p0 F +REG epsg:7308 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5733333333333p6 0x1.3d33333333333p5 0x0.0p0 F +REG epsg:7308 1 OK -0x1.1cfdd2b6c9c22p20 -0x1.903be59b4093p20 0x0.0p0 -0x1.712cecb66ffaap6 0x1.15333332baecap5 0x0.0p0 F +REG epsg:7308 2 OK 0x1.4ebb695b64e0ap21 -0x1.903be59b40931p20 0x0.0p0 -0x1.3d3979aff66bcp6 0x1.15333332baecap5 0x0.0p0 F +REG epsg:7308 3 OK -0x1.b8cc85f489bd4p19 0x1.ea2c3aaea3d07p20 0x0.0p0 -0x1.712cecb60a6dcp6 0x1.6533333260f49p5 0x0.0p0 F +REG epsg:7308 4 OK 0x1.2e6fa17d226fp21 0x1.ea2c3aaea3d06p20 0x0.0p0 -0x1.3d3979b05bf8ap6 0x1.6533333260f49p5 0x0.0p0 F +REG epsg:7309 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.589999999999ap6 0x1.2f9999999999ap5 0x0.0p0 F +REG epsg:7309 1 OK -0x1.59212dd623ea8p18 -0x1.e91e158f6a708p18 0x0.0p0 -0x1.71f68c80e68dap6 0x1.079999993db33p5 0x0.0p0 F +REG epsg:7309 2 OK 0x1.96f096eb11f5ep19 -0x1.e91e158f6a708p18 0x0.0p0 -0x1.3f3ca6b24ca5ap6 0x1.079999993db33p5 0x0.0p0 F +REG epsg:7309 3 OK -0x1.0f0950e0c747dp18 0x1.2a3c422ac8b8fp19 0x0.0p0 -0x1.71f68c809b89ep6 0x1.57999998ee99p5 0x0.0p0 F +REG epsg:7309 4 OK 0x1.71e4a87063a47p19 0x1.2a3c422ac8b9p19 0x0.0p0 -0x1.3f3ca6b297a96p6 0x1.57999998ee99p5 0x0.0p0 F +REG epsg:7310 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.589999999999ap6 0x1.2f9999999999ap5 0x0.0p0 F +REG epsg:7310 1 OK -0x1.1b140383f5ac3p20 -0x1.912da2a4d4b0cp20 0x0.0p0 -0x1.71f68c80e68dap6 0x1.079999993db33p5 0x0.0p0 F +REG epsg:7310 2 OK 0x1.4dc681c1fad6cp21 -0x1.912da2a4d4b0bp20 0x0.0p0 -0x1.3f3ca6b24ca5ap6 0x1.079999993db33p5 0x0.0p0 F +REG epsg:7310 3 OK -0x1.bc9cd423ee286p19 0x1.e93af4a5f86a9p20 0x0.0p0 -0x1.71f68c809b89ep6 0x1.57999998ee99p5 0x0.0p0 F +REG epsg:7310 4 OK 0x1.2f63b508fb8aap21 0x1.e93af4a5f86aap20 0x0.0p0 -0x1.3f3ca6b297a96p6 0x1.57999998ee99p5 0x0.0p0 F +REG epsg:7311 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.55ccccccccccdp6 0x1.3ep5 0x0.0p0 F +REG epsg:7311 1 OK -0x1.5b9b50289630cp18 -0x1.e7e651554a772p18 0x0.0p0 -0x1.6fd02ac70f36bp6 0x1.15ffffff85cd8p5 0x0.0p0 F +REG epsg:7311 2 OK 0x1.982da8144b186p19 -0x1.e7e651554a772p18 0x0.0p0 -0x1.3bc96ed28a62fp6 0x1.15ffffff85cd8p5 0x0.0p0 F +REG epsg:7311 3 OK -0x1.0c93092392c96p18 0x1.2ad89c9cd5c0bp19 0x0.0p0 -0x1.6fd02ac6a7eefp6 0x1.65ffffff2b36bp5 0x0.0p0 F +REG epsg:7311 4 OK 0x1.70a98491c964bp19 0x1.2ad89c9cd5c0bp19 0x0.0p0 -0x1.3bc96ed2f1aabp6 0x1.65ffffff2b36bp5 0x0.0p0 F +REG epsg:7312 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.55ccccccccccdp6 0x1.3ep5 0x0.0p0 F +REG epsg:7312 1 OK -0x1.1d1c22c291cd3p20 -0x1.902debfd79ee8p20 0x0.0p0 -0x1.6fd02ac70f36bp6 0x1.15ffffff85cd8p5 0x0.0p0 F +REG epsg:7312 2 OK 0x1.4eca916148e6cp21 -0x1.902debfd79ee8p20 0x0.0p0 -0x1.3bc96ed28a62fp6 0x1.15ffffff85cd8p5 0x0.0p0 F +REG epsg:7312 3 OK -0x1.b892e80ef11cep19 0x1.ea3b70b257643p20 0x0.0p0 -0x1.6fd02ac6a7eefp6 0x1.65ffffff2b36bp5 0x0.0p0 F +REG epsg:7312 4 OK 0x1.2e613a03bc476p21 0x1.ea3b70b257643p20 0x0.0p0 -0x1.3bc96ed2f1aabp6 0x1.65ffffff2b36bp5 0x0.0p0 F +REG epsg:7313 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.589999999999ap6 0x1.42ccccccccccdp5 0x0.0p0 F +REG epsg:7313 1 OK -0x1.5c732154501b2p18 -0x1.e77773d11a216p18 0x0.0p0 -0x1.72d7d8bcb93c6p6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7313 2 OK 0x1.989990aa280d9p19 -0x1.e77773d11a216p18 0x0.0p0 -0x1.3e5b5a7679f6fp6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7313 3 OK -0x1.0bb7048c0a9a6p18 0x1.2b0cbc1305ce3p19 0x0.0p0 -0x1.72d7d8bc47227p6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7313 4 OK 0x1.703b8246054d3p19 0x1.2b0cbc1305ce3p19 0x0.0p0 -0x1.3e5b5a76ec10ep6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7314 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.589999999999ap6 0x1.42ccccccccccdp5 0x0.0p0 F +REG epsg:7314 1 OK -0x1.1dcd269720a34p20 -0x1.8fd2fd3be16efp20 0x0.0p0 -0x1.72d7d8bcb93c6p6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7314 2 OK 0x1.4f23134b9051cp21 -0x1.8fd2fd3be16efp20 0x0.0p0 -0x1.3e5b5a7679f6fp6 0x1.1acccccc4669ap5 0x0.0p0 F +REG epsg:7314 3 OK -0x1.b729fc42501d6p19 0x1.ea90f188977f8p20 0x0.0p0 -0x1.72d7d8bc47227p6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7314 4 OK 0x1.2e06ff1094078p21 0x1.ea90f188977f8p20 0x0.0p0 -0x1.3e5b5a76ec10ep6 0x1.6acccccbe82cfp5 0x0.0p0 F +REG epsg:7315 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.56p6 0x1.4533333333333p5 0x0.0p0 F +REG epsg:7315 1 OK -0x1.5ce1c5817a2bep18 -0x1.e7404c6fed722p18 0x0.0p0 -0x1.705c5b9428b5ap6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7315 2 OK 0x1.98d0e2c0bd15fp19 -0x1.e7404c6fed722p18 0x0.0p0 -0x1.3ba3a46bd74a6p6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7315 3 OK -0x1.0b48a32de184dp18 0x1.2b27b08c6a075p19 0x0.0p0 -0x1.705c5b93b0e65p6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7315 4 OK 0x1.70045196f0c26p19 0x1.2b27b08c6a075p19 0x0.0p0 -0x1.3ba3a46c4f19bp6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7316 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.56p6 0x1.4533333333333p5 0x0.0p0 F +REG epsg:7316 1 OK -0x1.1e27e650dd6fp20 -0x1.8fa5c066af139p20 0x0.0p0 -0x1.705c5b9428b5ap6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7316 2 OK 0x1.4f5073286eb7ap21 -0x1.8fa5c066af139p20 0x0.0p0 -0x1.3ba3a46bd74a6p6 0x1.1d333332a645p5 0x0.0p0 F +REG epsg:7316 3 OK -0x1.b674ea66e3f9p19 0x1.eabd292fb973dp20 0x0.0p0 -0x1.705c5b93b0e65p6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7316 4 OK 0x1.2dd9ba99b8fe6p21 0x1.eabd292fb973dp20 0x0.0p0 -0x1.3ba3a46c4f19bp6 0x1.6d33333246445p5 0x0.0p0 F +REG epsg:7317 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.57ccccccccccdp6 0x1.359999999999ap5 0x0.0p0 F +REG epsg:7317 1 OK -0x1.5a23f4455b3ep18 -0x1.e89d0b672ed9ep18 0x0.0p0 -0x1.716d484f91aaap6 0x1.0d9999993220ep5 0x0.0p0 F +REG epsg:7317 2 OK 0x1.9771fa22ad9fap19 -0x1.e89d0b672ed9cp18 0x0.0p0 -0x1.3e2c514a07efp6 0x1.0d9999993220dp5 0x0.0p0 F +REG epsg:7317 3 OK -0x1.0e0540a9fba51p18 0x1.2a7be61301f2ap19 0x0.0p0 -0x1.716d484f3b952p6 0x1.5d999998de2dcp5 0x0.0p0 F +REG epsg:7317 4 OK 0x1.7162a054fdd32p19 0x1.2a7be61301f2bp19 0x0.0p0 -0x1.3e2c514a5e048p6 0x1.5d999998de2dcp5 0x0.0p0 F +REG epsg:7318 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.57ccccccccccdp6 0x1.359999999999ap5 0x0.0p0 F +REG epsg:7318 1 OK -0x1.1be843649ebb5p20 -0x1.90c3cbc0bcfd1p20 0x0.0p0 -0x1.716d484f91aaap6 0x1.0d9999993220ep5 0x0.0p0 F +REG epsg:7318 2 OK 0x1.4e30a1b24f5e5p21 -0x1.90c3cbc0bcfdp20 0x0.0p0 -0x1.3e2c514a07efp6 0x1.0d9999993220dp5 0x0.0p0 F +REG epsg:7318 3 OK -0x1.baf23768c34f6p19 0x1.e9a35a2a0f768p20 0x0.0p0 -0x1.716d484f3b952p6 0x1.5d999998de2dcp5 0x0.0p0 F +REG epsg:7318 4 OK 0x1.2ef90dda30d47p21 0x1.e9a35a2a0f76ap20 0x0.0p0 -0x1.3e2c514a5e048p6 0x1.5d999998de2dcp5 0x0.0p0 F +REG epsg:7319 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5c66666666667p6 0x1.459999999999bp5 0x0.0p0 F +REG epsg:7319 1 OK -0x1.5cf32f0c71f5p18 -0x1.e7360aba098f2p18 0x0.0p0 -0x1.76c7d20f2b878p6 0x1.1d9999990b8cap5 0x0.0p0 F +REG epsg:7319 2 OK 0x1.98d9978638fb2p19 -0x1.e7360aba098fp18 0x0.0p0 -0x1.4204fabda1454p6 0x1.1d9999990b8cap5 0x0.0p0 F +REG epsg:7319 3 OK -0x1.0b352d29cf4p18 0x1.2b2ba85c31b28p19 0x0.0p0 -0x1.76c7d20eb2bf7p6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7319 4 OK 0x1.6ffa9694e7a08p19 0x1.2b2ba85c31b28p19 0x0.0p0 -0x1.4204fabe1a0d5p6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7320 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5c66666666667p6 0x1.459999999999bp5 0x0.0p0 F +REG epsg:7320 1 OK -0x1.1e362e6dfe893p20 -0x1.8f9d56c57efdp20 0x0.0p0 -0x1.76c7d20f2b878p6 0x1.1d9999990b8cap5 0x0.0p0 F +REG epsg:7320 2 OK 0x1.4f579736ff454p21 -0x1.8f9d56c57efcfp20 0x0.0p0 -0x1.4204fabda1454p6 0x1.1d9999990b8c9p5 0x0.0p0 F +REG epsg:7320 3 OK -0x1.b654fdd1eb1fep19 0x1.eac3ab8a6fd19p20 0x0.0p0 -0x1.76c7d20eb2bf7p6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7320 4 OK 0x1.2dd1bf747ac88p21 0x1.eac3ab8a6fd1bp20 0x0.0p0 -0x1.4204fabe1a0d5p6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7321 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.54p6 0x1.4266666666666p5 0x0.0p0 F +REG epsg:7321 1 OK -0x1.5c61e66b42feap18 -0x1.e781965b95fe2p18 0x0.0p0 -0x1.6e3945a6cd75ep6 0x1.1a666665e112bp5 0x0.0p0 F +REG epsg:7321 2 OK 0x1.9890f335a17f5p19 -0x1.e781965b95fe2p18 0x0.0p0 -0x1.39c6ba59328a3p6 0x1.1a666665e112bp5 0x0.0p0 F +REG epsg:7321 3 OK -0x1.0bca473a358e4p18 0x1.2b08cc710c3c2p19 0x0.0p0 -0x1.6e3945a65c4a6p6 0x1.6a66666583227p5 0x0.0p0 F +REG epsg:7321 4 OK 0x1.7045239d1ac72p19 0x1.2b08cc710c3c2p19 0x0.0p0 -0x1.39c6ba59a3b5bp6 0x1.6a66666583227p5 0x0.0p0 F +REG epsg:7322 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.54p6 0x1.4266666666666p5 0x0.0p0 F +REG epsg:7322 1 OK -0x1.1dbf04b993b27p20 -0x1.8fdb4d4c4af92p20 0x0.0p0 -0x1.6e3945a6cd75ep6 0x1.1a666665e112bp5 0x0.0p0 F +REG epsg:7322 2 OK 0x1.4f1c025cc9d96p21 -0x1.8fdb4d4c4af92p20 0x0.0p0 -0x1.39c6ba59328a3p6 0x1.1a666665e112bp5 0x0.0p0 F +REG epsg:7322 3 OK -0x1.b74994a1165c8p19 0x1.ea8a7c9897977p20 0x0.0p0 -0x1.6e3945a65c4a6p6 0x1.6a66666583227p5 0x0.0p0 F +REG epsg:7322 4 OK 0x1.2e0ee52845974p21 0x1.ea8a7c9897977p20 0x0.0p0 -0x1.39c6ba59a3b5bp6 0x1.6a66666583227p5 0x0.0p0 F +REG epsg:7323 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5566666666666p6 0x1.3466666666666p5 0x0.0p0 F +REG epsg:7323 1 OK -0x1.59f0873fedeep18 -0x1.e8b7cac33483cp18 0x0.0p0 -0x1.6ef92c74b6e3dp6 0x1.0c666666015bp5 0x0.0p0 F +REG epsg:7323 2 OK 0x1.9758439ff6f7p19 -0x1.e8b7cac33483cp18 0x0.0p0 -0x1.3bd3a05815e8fp6 0x1.0c666666015bp5 0x0.0p0 F +REG epsg:7323 3 OK -0x1.0e3a5cd602ed7p18 0x1.2a6f749382061p19 0x0.0p0 -0x1.6ef92c746318ap6 0x1.5c666665ae5f1p5 0x0.0p0 F +REG epsg:7323 4 OK 0x1.717d2e6b0176cp19 0x1.2a6f749382061p19 0x0.0p0 -0x1.3bd3a05869b41p6 0x1.5c666665ae5f1p5 0x0.0p0 F +REG epsg:7324 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5566666666666p6 0x1.3466666666666p5 0x0.0p0 F +REG epsg:7324 1 OK -0x1.1bbe15553c45dp20 -0x1.90d9bc03a0fe8p20 0x0.0p0 -0x1.6ef92c74b6e3dp6 0x1.0c666666015bp5 0x0.0p0 F +REG epsg:7324 2 OK 0x1.4e1b8aaa9e23p21 -0x1.90d9bc03a0fe8p20 0x0.0p0 -0x1.3bd3a05815e8fp6 0x1.0c666666015bp5 0x0.0p0 F +REG epsg:7324 3 OK -0x1.bb4956cbde30cp19 0x1.e98ef09ec6412p20 0x0.0p0 -0x1.6ef92c746318ap6 0x1.5c666665ae5f1p5 0x0.0p0 F +REG epsg:7324 4 OK 0x1.2f0ed5b2f78c5p21 0x1.e98ef09ec6412p20 0x0.0p0 -0x1.3bd3a05869b42p6 0x1.5c666665ae5f1p5 0x0.0p0 F +REG epsg:7325 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5733333333333p6 0x1.3666666666666p5 0x0.0p0 F +REG epsg:7325 1 OK -0x1.5a47652b55c72p18 -0x1.e88c133ea87bep18 0x0.0p0 -0x1.70dce0f040d5bp6 0x1.0e666665fd46fp5 0x0.0p0 F +REG epsg:7325 2 OK 0x1.9783b295aae2fp19 -0x1.e88c133ea87bep18 0x0.0p0 -0x1.3d8985762590cp6 0x1.0e666665fd46fp5 0x0.0p0 F +REG epsg:7325 3 OK -0x1.0de29f3fa907bp18 0x1.2a84b7fd3a859p19 0x0.0p0 -0x1.70dce0efe9339p6 0x1.5e666665a8af9p5 0x0.0p0 F +REG epsg:7325 4 OK 0x1.71514f9fd4834p19 0x1.2a84b7fd3a858p19 0x0.0p0 -0x1.3d8985767d32dp6 0x1.5e666665a8af9p5 0x0.0p0 F +REG epsg:7326 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5733333333333p6 0x1.3666666666666p5 0x0.0p0 F +REG epsg:7326 1 OK -0x1.1c05550f5498cp20 -0x1.90b5e0a356e2ep20 0x0.0p0 -0x1.70dce0f040d5bp6 0x1.0e666665fd46fp5 0x0.0p0 F +REG epsg:7326 2 OK 0x1.4e3f2a87aa4cp21 -0x1.90b5e0a356e2fp20 0x0.0p0 -0x1.3d8985762590cp6 0x1.0e666665fd46fp5 0x0.0p0 F +REG epsg:7326 3 OK -0x1.bab9686f263dcp19 0x1.e9b1d215e836fp20 0x0.0p0 -0x1.70dce0efe9339p6 0x1.5e666665a8af9p5 0x0.0p0 F +REG epsg:7326 4 OK 0x1.2eeada1bc98f2p21 0x1.e9b1d215e836ep20 0x0.0p0 -0x1.3d8985767d32dp6 0x1.5e666665a8af9p5 0x0.0p0 F +REG epsg:7327 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.589999999999ap6 0x1.3a66666666666p5 0x0.0p0 F +REG epsg:7327 1 OK -0x1.5af8b06058176p18 -0x1.e8351681e592p18 0x0.0p0 -0x1.7271f3f887c5bp6 0x1.12666665f49dp5 0x0.0p0 F +REG epsg:7327 2 OK 0x1.97dc58302c0c4p19 -0x1.e8351681e591ep18 0x0.0p0 -0x1.3ec13f3aab6d8p6 0x1.12666665f49cfp5 0x0.0p0 F +REG epsg:7327 3 OK -0x1.0d32bf554b33ep18 0x1.2ab06d7265663p19 0x0.0p0 -0x1.7271f3f8281eap6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7327 4 OK 0x1.70f95faaa59a8p19 0x1.2ab06d7265664p19 0x0.0p0 -0x1.3ec13f3b0b149p6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7328 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.589999999999ap6 0x1.3a66666666666p5 0x0.0p0 F +REG epsg:7328 1 OK -0x1.1c96c0067d292p20 -0x1.906e87a2543e4p20 0x0.0p0 -0x1.7271f3f887c5bp6 0x1.12666665f49dp5 0x0.0p0 F +REG epsg:7328 2 OK 0x1.4e87e0033e953p21 -0x1.906e87a2543e3p20 0x0.0p0 -0x1.3ec13f3aab6d8p6 0x1.12666665f49cfp5 0x0.0p0 F +REG epsg:7328 3 OK -0x1.b998e673ead4ep19 0x1.e9f985755d2a4p20 0x0.0p0 -0x1.7271f3f8281eap6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7328 4 OK 0x1.2ea2b99cfab5cp21 0x1.e9f985755d2a5p20 0x0.0p0 -0x1.3ec13f3b0b149p6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7329 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5dccccccccccdp6 0x1.3333333333333p5 0x0.0p0 F +REG epsg:7329 1 OK -0x1.59ba7d321e4e6p18 -0x1.e8cfdaf2116cp18 0x0.0p0 -0x1.7751f779f0cdbp6 0x1.0b333332d0866p5 0x0.0p0 F +REG epsg:7329 2 OK 0x1.973d3e990f273p19 -0x1.e8cfdaf2116cp18 0x0.0p0 -0x1.4447a21fa8cbfp6 0x1.0b333332d0866p5 0x0.0p0 F +REG epsg:7329 3 OK -0x1.0e6cca3a82392p18 0x1.2a61af09d8f3dp19 0x0.0p0 -0x1.7751f7799f42ep6 0x1.5b3333327e824p5 0x0.0p0 F +REG epsg:7329 4 OK 0x1.7196651d411c9p19 0x1.2a61af09d8f3dp19 0x0.0p0 -0x1.4447a21ffa56cp6 0x1.5b3333327e824p5 0x0.0p0 F +REG epsg:7330 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5dccccccccccdp6 0x1.3333333333333p5 0x0.0p0 F +REG epsg:7330 1 OK -0x1.1b91c286d06e7p20 -0x1.90ed78a5ccb0ep20 0x0.0p0 -0x1.7751f779f0cdbp6 0x1.0b333332d0866p5 0x0.0p0 F +REG epsg:7330 2 OK 0x1.4e05614368376p21 -0x1.90ed78a5ccb0ep20 0x0.0p0 -0x1.4447a21fa8cbfp6 0x1.0b333332d0866p5 0x0.0p0 F +REG epsg:7330 3 OK -0x1.bb9c0f943ecb8p19 0x1.e9785944f436bp20 0x0.0p0 -0x1.7751f7799f42ep6 0x1.5b3333327e824p5 0x0.0p0 F +REG epsg:7330 4 OK 0x1.2f2383e50fb3p21 0x1.e9785944f436bp20 0x0.0p0 -0x1.4447a21ffa56cp6 0x1.5b3333327e824p5 0x0.0p0 F +REG epsg:7331 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.55ccccccccccdp6 0x1.4ap5 0x0.0p0 F +REG epsg:7331 1 OK -0x1.5dc17a4ac34ccp18 -0x1.e6cfaada4a9c8p18 0x0.0p0 -0x1.7066c2e544a98p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7331 2 OK 0x1.9940bd2561a66p19 -0x1.e6cfaada4a9c8p18 0x0.0p0 -0x1.3b32d6b454f02p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7331 3 OK -0x1.0a68543c147a5p18 0x1.2b5de2ec33851p19 0x0.0p0 -0x1.7066c2e4c0cb3p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7331 4 OK 0x1.6f942a1e0a3d2p19 0x1.2b5de2ec33851p19 0x0.0p0 -0x1.3b32d6b4d8ce7p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7332 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.55ccccccccccdp6 0x1.4ap5 0x0.0p0 F +REG epsg:7332 1 OK -0x1.1edf62a6d081fp20 -0x1.8f495edad4c57p20 0x0.0p0 -0x1.7066c2e544a98p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7332 2 OK 0x1.4fac315368412p21 -0x1.8f495edad4c57p20 0x0.0p0 -0x1.3b32d6b454f02p6 0x1.21ffffff65058p5 0x0.0p0 F +REG epsg:7332 3 OK -0x1.b504f4d8be2ep19 0x1.eb1610f0e8919p20 0x0.0p0 -0x1.7066c2e4c0cb3p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7332 4 OK 0x1.2d7dbd362f8bap21 0x1.eb1610f0e8919p20 0x0.0p0 -0x1.3b32d6b4d8ce7p6 0x1.71ffffff01a28p5 0x0.0p0 F +REG epsg:7333 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5d9999999999ap6 0x1.459999999999bp5 0x0.0p0 F +REG epsg:7333 1 OK -0x1.5cf308d224146p18 -0x1.e735e87e67718p18 0x0.0p0 -0x1.77fb05425ebacp6 0x1.1d9999990b8c9p5 0x0.0p0 F +REG epsg:7333 2 OK 0x1.98d98469120a3p19 -0x1.e735e87e67718p18 0x0.0p0 -0x1.43382df0d4788p6 0x1.1d9999990b8c9p5 0x0.0p0 F +REG epsg:7333 3 OK -0x1.0b350c4ae009bp18 0x1.2b2b95e7fc25dp19 0x0.0p0 -0x1.77fb0541e5f2cp6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7333 4 OK 0x1.6ffa86257004ep19 0x1.2b2b95e7fc25dp19 0x0.0p0 -0x1.43382df14d408p6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7334 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5d9999999999ap6 0x1.459999999999bp5 0x0.0p0 F +REG epsg:7334 1 OK -0x1.1e360f132f9ecp20 -0x1.8f9d3ab17db32p20 0x0.0p0 -0x1.77fb05425ebacp6 0x1.1d9999990b8c9p5 0x0.0p0 F +REG epsg:7334 2 OK 0x1.4f57878997cf8p21 -0x1.8f9d3ab17db32p20 0x0.0p0 -0x1.43382df0d4788p6 0x1.1d9999990b8c9p5 0x0.0p0 F +REG epsg:7334 3 OK -0x1.b654c7e5eb76ap19 0x1.eac38d44c3ecp20 0x0.0p0 -0x1.77fb0541e5f2cp6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7334 4 OK 0x1.2dd1b1f97addcp21 0x1.eac38d44c3ecp20 0x0.0p0 -0x1.43382df14d408p6 0x1.6d999998ab419p5 0x0.0p0 F +REG epsg:7335 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5bp6 0x1.4733333333333p5 0x0.0p0 F +REG epsg:7335 1 OK -0x1.5d3d477e10d54p18 -0x1.e71094ed8e21p18 0x0.0p0 -0x1.7575ccb8ffc47p6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7335 2 OK 0x1.98fea3bf086aap19 -0x1.e71094ed8e21p18 0x0.0p0 -0x1.408a3347003b9p6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7335 3 OK -0x1.0aeaa2b1841b9p18 0x1.2b3d983379972p19 0x0.0p0 -0x1.7575ccb8830a3p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7335 4 OK 0x1.6fd55158c20dcp19 0x1.2b3d983379972p19 0x0.0p0 -0x1.408a33477cf5cp6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7336 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5bp6 0x1.4733333333333p5 0x0.0p0 F +REG epsg:7336 1 OK -0x1.1e72f4815f9eep20 -0x1.8f7e9d237c18bp20 0x0.0p0 -0x1.7575ccb8ffc47p6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7336 2 OK 0x1.4f75fa40afcf9p21 -0x1.8f7e9d237c18bp20 0x0.0p0 -0x1.408a3347003b9p6 0x1.1f333332a0939p5 0x0.0p0 F +REG epsg:7336 3 OK -0x1.b5dab69e4b2aap19 0x1.eae11812bbd55p20 0x0.0p0 -0x1.7575ccb8830a3p6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7336 4 OK 0x1.2db32da792cacp21 0x1.eae11812bbd55p20 0x0.0p0 -0x1.408a33477cf5cp6 0x1.6f3333323f235p5 0x0.0p0 F +REG epsg:7337 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5ap6 0x1.379999999999ap5 0x0.0p0 F +REG epsg:7337 1 OK -0x1.5a7c82ca93702p18 -0x1.e8724de2d78e6p18 0x0.0p0 -0x1.73b78f2023927p6 0x1.0f9999992df35p5 0x0.0p0 F +REG epsg:7337 2 OK 0x1.979e416549b81p19 -0x1.e8724de2d78e6p18 0x0.0p0 -0x1.404870dfdc6d9p6 0x1.0f9999992df35p5 0x0.0p0 F +REG epsg:7337 3 OK -0x1.0dae49fa08adap18 0x1.2a91df67a69b2p19 0x0.0p0 -0x1.73b78f1fc994ep6 0x1.5f999998d8663p5 0x0.0p0 F +REG epsg:7337 4 OK 0x1.713724fd0456dp19 0x1.2a91df67a69b2p19 0x0.0p0 -0x1.404870e0366b2p6 0x1.5f999998d8663p5 0x0.0p0 F +REG epsg:7338 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5ap6 0x1.379999999999ap5 0x0.0p0 F +REG epsg:7338 1 OK -0x1.1c30e5f15abe8p20 -0x1.90a0bd6df378p20 0x0.0p0 -0x1.73b78f2023927p6 0x1.0f9999992df35p5 0x0.0p0 F +REG epsg:7338 2 OK 0x1.4e54f2f8ad5f6p21 -0x1.90a0bd6df378p20 0x0.0p0 -0x1.404870dfdc6d9p6 0x1.0f9999992df35p5 0x0.0p0 F +REG epsg:7338 3 OK -0x1.ba638f5370956p19 0x1.e9c7660ce9175p20 0x0.0p0 -0x1.73b78f1fc994ep6 0x1.5f999998d8663p5 0x0.0p0 F +REG epsg:7338 4 OK 0x1.2ed563d4dc258p21 0x1.e9c7660ce9175p20 0x0.0p0 -0x1.404870e0366b2p6 0x1.5f999998d8663p5 0x0.0p0 F +REG epsg:7339 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5bccccccccccdp6 0x1.3b9999999999ap5 0x0.0p0 F +REG epsg:7339 1 OK -0x1.5b2e146d9b574p18 -0x1.e81a710860484p18 0x0.0p0 -0x1.75b3623da64f9p6 0x1.1399999925139p5 0x0.0p0 F +REG epsg:7339 2 OK 0x1.97f70a36cdabp19 -0x1.e81a710860486p18 0x0.0p0 -0x1.41e6375bf34a1p6 0x1.139999992513ap5 0x0.0p0 F +REG epsg:7339 3 OK -0x1.0cfd3cddbcba1p18 0x1.2abd7eae521a2p19 0x0.0p0 -0x1.75b3623d4429p6 0x1.63999998cc5b8p5 0x0.0p0 F +REG epsg:7339 4 OK 0x1.70de9e6ede5c8p19 0x1.2abd7eae521a2p19 0x0.0p0 -0x1.41e6375c5570bp6 0x1.63999998cc5b8p5 0x0.0p0 F +REG epsg:7340 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5bccccccccccdp6 0x1.3b9999999999ap5 0x0.0p0 F +REG epsg:7340 1 OK -0x1.1cc28aace317bp20 -0x1.9058ac9a8cd6ep20 0x0.0p0 -0x1.75b3623da64f9p6 0x1.1399999925139p5 0x0.0p0 F +REG epsg:7340 2 OK 0x1.4e9dc556718b8p21 -0x1.9058ac9a8cd6fp20 0x0.0p0 -0x1.41e6375bf34a1p6 0x1.139999992513ap5 0x0.0p0 F +REG epsg:7340 3 OK -0x1.b9411f425ad18p19 0x1.ea0ef50943e8ep20 0x0.0p0 -0x1.75b3623d4429p6 0x1.63999998cc5b8p5 0x0.0p0 F +REG epsg:7340 4 OK 0x1.2e8cc7d096b4p21 0x1.ea0ef50943e8dp20 0x0.0p0 -0x1.41e6375c5570bp6 0x1.63999998cc5b8p5 0x0.0p0 F +REG epsg:7341 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5b9999999999ap6 0x1.3933333333333p5 0x0.0p0 F +REG epsg:7341 1 OK -0x1.5ac2c5dcbdbeap18 -0x1.e84eeba58322ep18 0x0.0p0 -0x1.7563d41081a9ep6 0x1.11333332c416p5 0x0.0p0 F +REG epsg:7341 2 OK 0x1.97c162ee5edebp19 -0x1.e84eeba58323p18 0x0.0p0 -0x1.41cf5f22b1896p6 0x1.11333332c415fp5 0x0.0p0 F +REG epsg:7341 3 OK -0x1.0d675f6ddc7a2p18 0x1.2aa30a1cfbe42p19 0x0.0p0 -0x1.7563d41024774p6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7341 4 OK 0x1.7113afb6ee3c8p19 0x1.2aa30a1cfbe42p19 0x0.0p0 -0x1.41cf5f230ebcp6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7342 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5b9999999999ap6 0x1.3933333333333p5 0x0.0p0 F +REG epsg:7342 1 OK -0x1.1c6a871699b5fp20 -0x1.9083b7c931ccep20 0x0.0p0 -0x1.7563d41081a9ep6 0x1.11333332c416p5 0x0.0p0 F +REG epsg:7342 2 OK 0x1.4e71c38b4cdaap21 -0x1.9083b7c931ccfp20 0x0.0p0 -0x1.41cf5f22b1895p6 0x1.11333332c415fp5 0x0.0p0 F +REG epsg:7342 3 OK -0x1.b9ef3a4db627cp19 0x1.e9e38f3406983p20 0x0.0p0 -0x1.7563d41024774p6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7342 4 OK 0x1.2eb84e936d89ap21 0x1.e9e38f3406982p20 0x0.0p0 -0x1.41cf5f230ebcp6 0x1.613333326d42bp5 0x0.0p0 F +REG epsg:7343 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5d66666666666p6 0x1.3cccccccccccdp5 0x0.0p0 F +REG epsg:7343 1 OK -0x1.5b6259d46823cp18 -0x1.e7fe71c6d009ap18 0x0.0p0 -0x1.775b524cdb6f2p6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7343 2 OK 0x1.98112cea34128p19 -0x1.e7fe71c6d009ap18 0x0.0p0 -0x1.43717a7ff15dap6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7343 3 OK -0x1.0cc653bc45d12p18 0x1.2ac9f41f0638dp19 0x0.0p0 -0x1.775b524c76bdbp6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7343 4 OK 0x1.70c329de22e92p19 0x1.2ac9f41f0638ep19 0x0.0p0 -0x1.43717a80560fp6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7344 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5d66666666666p6 0x1.3cccccccccccdp5 0x0.0p0 F +REG epsg:7344 1 OK -0x1.1ced6a3660b95p20 -0x1.9041b5f5e4fb7p20 0x0.0p0 -0x1.775b524cdb6f2p6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7344 2 OK 0x1.4eb3351b305d4p21 -0x1.9041b5f5e4fb7p20 0x0.0p0 -0x1.43717a7ff15dap6 0x1.14cccccc55795p5 0x0.0p0 F +REG epsg:7344 3 OK -0x1.b8e70bb52a6c6p19 0x1.ea23650c10ed8p20 0x0.0p0 -0x1.775b524c76bdbp6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7344 4 OK 0x1.2e7642ed4a9bap21 0x1.ea23650c10edap20 0x0.0p0 -0x1.43717a80560fp6 0x1.64cccccbfbd0ep5 0x0.0p0 F +REG epsg:7345 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5accccccccccdp6 0x1.2e66666666666p5 0x0.0p0 F +REG epsg:7345 1 OK -0x1.58ecd947da5ap18 -0x1.e9366c0db919p18 0x0.0p0 -0x1.741c8a8d3bfc8p6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7345 2 OK 0x1.96d66ca3ed2c6p19 -0x1.e9366c0db9192p18 0x0.0p0 -0x1.417d0f0c5d9d2p6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7345 3 OK -0x1.0f3ba06fab00fp18 0x1.2a2f110e4a29cp19 0x0.0p0 -0x1.741c8a8cf3131p6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7345 4 OK 0x1.71fdd037d57fep19 0x1.2a2f110e4a29cp19 0x0.0p0 -0x1.417d0f0ca686ap6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7346 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5accccccccccdp6 0x1.2e66666666666p5 0x0.0p0 F +REG epsg:7346 1 OK -0x1.1ae9178c7b25ep20 -0x1.914198f24bb69p20 0x0.0p0 -0x1.741c8a8d3bfc8p6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7346 2 OK 0x1.4db10bc63d928p21 -0x1.914198f24bb6bp20 0x0.0p0 -0x1.417d0f0c5d9d3p6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7346 3 OK -0x1.bcef5bfb72dd8p19 0x1.e92550c7559b4p20 0x0.0p0 -0x1.741c8a8cf3131p6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7346 4 OK 0x1.2f7856fedcb7p21 0x1.e92550c7559b3p20 0x0.0p0 -0x1.417d0f0ca686ap6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7347 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5d33333333333p6 0x1.2eccccccccccdp5 0x0.0p0 F +REG epsg:7347 1 OK -0x1.58fd2ea4d7838p18 -0x1.e92d56ec4ad4cp18 0x0.0p0 -0x1.7687553583ec2p6 0x1.06cccccc7257p5 0x0.0p0 F +REG epsg:7347 2 OK 0x1.96de97526bc26p19 -0x1.e92d56ec4ad4cp18 0x0.0p0 -0x1.43df1130e27a4p6 0x1.06cccccc7257p5 0x0.0p0 F +REG epsg:7347 3 OK -0x1.0f29ee8533c26p18 0x1.2a32eeda4a9e1p19 0x0.0p0 -0x1.768755353a505p6 0x1.56cccccc23e2cp5 0x0.0p0 F +REG epsg:7347 4 OK 0x1.71f4f74299e1cp19 0x1.2a32eeda4a9e2p19 0x0.0p0 -0x1.43df11312c162p6 0x1.56cccccc23e2cp5 0x0.0p0 F +REG epsg:7348 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5d33333333333p6 0x1.2eccccccccccdp5 0x0.0p0 F +REG epsg:7348 1 OK -0x1.1af67d23420cp20 -0x1.913a25dae026dp20 0x0.0p0 -0x1.7687553583ec2p6 0x1.06cccccc7257p5 0x0.0p0 F +REG epsg:7348 2 OK 0x1.4db7be91a106ap21 -0x1.913a25dae026dp20 0x0.0p0 -0x1.43df1130e27a4p6 0x1.06cccccc7257p5 0x0.0p0 F +REG epsg:7348 3 OK -0x1.bcd255085fae8p19 0x1.e92ba8753c533p20 0x0.0p0 -0x1.768755353a505p6 0x1.56cccccc23e2cp5 0x0.0p0 F +REG epsg:7348 4 OK 0x1.2f71154217ec4p21 0x1.e92ba8753c534p20 0x0.0p0 -0x1.43df11312c161p6 0x1.56cccccc23e2cp5 0x0.0p0 F +REG epsg:7349 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5fccccccccccdp6 0x1.2ep5 0x0.0p0 F +REG epsg:7349 1 OK -0x1.58dac207ce8bep18 -0x1.e93de12555d62p18 0x0.0p0 -0x1.79182913e838cp6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7349 2 OK 0x1.96cd6103e745fp19 -0x1.e93de12555d62p18 0x0.0p0 -0x1.46817085b160ep6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7349 3 OK -0x1.0f4bbe8b82a4cp18 0x1.2a2a579f8b481p19 0x0.0p0 -0x1.79182913a000bp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7349 4 OK 0x1.7205df45c1526p19 0x1.2a2a579f8b481p19 0x0.0p0 -0x1.46817085f998fp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7350 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5fccccccccccdp6 0x1.2ep5 0x0.0p0 F +REG epsg:7350 1 OK -0x1.1ada40f571772p20 -0x1.9147b6ccc18d4p20 0x0.0p0 -0x1.79182913e838cp6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7350 2 OK 0x1.4da9a07ab8bbbp21 -0x1.9147b6ccc18d4p20 0x0.0p0 -0x1.46817085b160ep6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7350 3 OK -0x1.bd09cc851182ep19 0x1.e91d90ce253a5p20 0x0.0p0 -0x1.79182913a000bp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7350 4 OK 0x1.2f7ef3214460ep21 0x1.e91d90ce253a5p20 0x0.0p0 -0x1.46817085f998fp6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7351 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5433333333333p6 0x1.3d9999999999ap5 0x0.0p0 F +REG epsg:7351 1 OK -0x1.5b897e072221cp18 -0x1.e7ef72a04c82ap18 0x0.0p0 -0x1.6e31bd66f93e7p6 0x1.15999999205ep5 0x0.0p0 F +REG epsg:7351 2 OK 0x1.9824bf0391118p19 -0x1.e7ef72a04c828p18 0x0.0p0 -0x1.3a34a8ff6d27fp6 0x1.15999999205e1p5 0x0.0p0 F +REG epsg:7351 3 OK -0x1.0ca530c4baebcp18 0x1.2ad44c15da1a8p19 0x0.0p0 -0x1.6e31bd6692d4cp6 0x1.65999998c6168p5 0x0.0p0 F +REG epsg:7351 4 OK 0x1.70b298625d766p19 0x1.2ad44c15da1a9p19 0x0.0p0 -0x1.3a34a8ffd391ap6 0x1.65999998c6168p5 0x0.0p0 F +REG epsg:7352 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5433333333333p6 0x1.3d9999999999ap5 0x0.0p0 F +REG epsg:7352 1 OK -0x1.1d0d84dcc8be3p20 -0x1.9035690eadb05p20 0x0.0p0 -0x1.6e31bd66f93e7p6 0x1.15999999205ep5 0x0.0p0 F +REG epsg:7352 2 OK 0x1.4ec3426e645fcp21 -0x1.9035690eadb04p20 0x0.0p0 -0x1.3a34a8ff6d27fp6 0x1.15999999205e1p5 0x0.0p0 F +REG epsg:7352 3 OK -0x1.b8b0b01b7752ap19 0x1.ea345ccfcb023p20 0x0.0p0 -0x1.6e31bd6692d4cp6 0x1.65999998c6168p5 0x0.0p0 F +REG epsg:7352 4 OK 0x1.2e68ac06ddd54p21 0x1.ea345ccfcb024p20 0x0.0p0 -0x1.3a34a8ffd391ap6 0x1.65999998c6168p5 0x0.0p0 F +REG epsg:7353 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5533333333333p6 0x1.3733333333333p5 0x0.0p0 F +REG epsg:7353 1 OK -0x1.5a6c6adc2cdd6p18 -0x1.e87c62741499ap18 0x0.0p0 -0x1.6ee61ee9c1e38p6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7353 2 OK 0x1.9796356e166ebp19 -0x1.e87c62741499ap18 0x0.0p0 -0x1.3b80477ca482ep6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7353 3 OK -0x1.0dc12dc85c96bp18 0x1.2a8e4663d2405p19 0x0.0p0 -0x1.6ee61ee968b04p6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7353 4 OK 0x1.714096e42e4b6p19 0x1.2a8e4663d2405p19 0x0.0p0 -0x1.3b80477cfdb62p6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7354 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5533333333333p6 0x1.3733333333333p5 0x0.0p0 F +REG epsg:7354 1 OK -0x1.1c23b2bda7ffdp20 -0x1.90a9020846dfp20 0x0.0p0 -0x1.6ee61ee9c1e38p6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7354 2 OK 0x1.4e4e595ed4p21 -0x1.90a9020846dfp20 0x0.0p0 -0x1.3b80477ca482ep6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7354 3 OK -0x1.ba828c100960ep19 0x1.e9c17f33bf9efp20 0x0.0p0 -0x1.6ee61ee968b04p6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7354 4 OK 0x1.2edd230402586p21 0x1.e9c17f33bf9efp20 0x0.0p0 -0x1.3b80477cfdb62p6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7355 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.579999999999bp6 0x1.3a66666666666p5 0x0.0p0 F +REG epsg:7355 1 OK -0x1.5af88a474589ep18 -0x1.e834f43595996p18 0x0.0p0 -0x1.7171f3f887c5bp6 0x1.12666665f49dp5 0x0.0p0 F +REG epsg:7355 2 OK 0x1.97dc4523a2c59p19 -0x1.e834f43595994p18 0x0.0p0 -0x1.3dc13f3aab6d9p6 0x1.12666665f49cfp5 0x0.0p0 F +REG epsg:7355 3 OK -0x1.0d329e54ffaf9p18 0x1.2ab05b064814ep19 0x0.0p0 -0x1.7171f3f8281eap6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7355 4 OK 0x1.70f94f2a7fd85p19 0x1.2ab05b064814ep19 0x0.0p0 -0x1.3dc13f3b0b14ap6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7356 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.579999999999bp6 0x1.3a66666666666p5 0x0.0p0 F +REG epsg:7356 1 OK -0x1.1c96a0c6f0061p20 -0x1.906e6b80a4c8ap20 0x0.0p0 -0x1.7171f3f887c5bp6 0x1.12666665f49dp5 0x0.0p0 F +REG epsg:7356 2 OK 0x1.4e87d0637803ap21 -0x1.906e6b80a4c88p20 0x0.0p0 -0x1.3dc13f3aab6d9p6 0x1.12666665f49cfp5 0x0.0p0 F +REG epsg:7356 3 OK -0x1.b998b05131834p19 0x1.e9f9673cf8977p20 0x0.0p0 -0x1.7171f3f8281eap6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7356 4 OK 0x1.2ea2ac144c616p21 0x1.e9f9673cf8978p20 0x0.0p0 -0x1.3dc13f3b0b14ap6 0x1.626666659cd6bp5 0x0.0p0 F +REG epsg:7357 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5c33333333334p6 0x1.2ep5 0x0.0p0 F +REG epsg:7357 1 OK -0x1.58dae7fd8a0f4p18 -0x1.e93e038328acap18 0x0.0p0 -0x1.757e8f7a4e9f2p6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7357 2 OK 0x1.96cd73fec5085p19 -0x1.e93e038328ac8p18 0x0.0p0 -0x1.42e7d6ec17c74p6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7357 3 OK -0x1.0f4bdfaf26482p18 0x1.2a2a6a02f4c87p19 0x0.0p0 -0x1.757e8f7a06671p6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7357 4 OK 0x1.7205efd79324ap19 0x1.2a2a6a02f4c88p19 0x0.0p0 -0x1.42e7d6ec5fff5p6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7358 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5c33333333334p6 0x1.2ep5 0x0.0p0 F +REG epsg:7358 1 OK -0x1.1ada601802253p20 -0x1.9147d2fccde56p20 0x0.0p0 -0x1.757e8f7a4e9f2p6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7358 2 OK 0x1.4da9b00c01134p21 -0x1.9147d2fccde55p20 0x0.0p0 -0x1.42e7d6ec17c74p6 0x1.05ffffffa6f4cp5 0x0.0p0 F +REG epsg:7358 3 OK -0x1.bd0a02e1c585p19 0x1.e91daef84341p20 0x0.0p0 -0x1.757e8f7a06671p6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7358 4 OK 0x1.2f7f00b87161dp21 0x1.e91daef843411p20 0x0.0p0 -0x1.42e7d6ec5fff6p6 0x1.55ffffff5926bp5 0x0.0p0 F +REG epsg:7359 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.54p6 0x1.4cp5 0x0.0p0 F +REG epsg:7359 1 OK -0x1.5e2041ea58c86p18 -0x1.e6a053a2f142ep18 0x0.0p0 -0x1.6eb42f681d81cp6 0x1.23ffffff5ec43p5 0x0.0p0 F +REG epsg:7359 2 OK 0x1.997020f52c64dp19 -0x1.e6a053a2f142cp18 0x0.0p0 -0x1.394bd097e27e4p6 0x1.23ffffff5ec43p5 0x0.0p0 F +REG epsg:7359 3 OK -0x1.0a09f16b43a0fp18 0x1.2b74de5a813c3p19 0x0.0p0 -0x1.6eb42f679458ap6 0x1.73fffffefa0ap5 0x0.0p0 F +REG epsg:7359 4 OK 0x1.6f64f8b5a1d1p19 0x1.2b74de5a813c4p19 0x0.0p0 -0x1.394bd0986ba76p6 0x1.73fffffefa0ap5 0x0.0p0 F +REG epsg:7360 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.54p6 0x1.4cp5 0x0.0p0 F +REG epsg:7360 1 OK -0x1.1f2d1fe0b176p20 -0x1.8f228a929b536p20 0x0.0p0 -0x1.6eb42f681d81cp6 0x1.23ffffff5ec43p5 0x0.0p0 F +REG epsg:7360 2 OK 0x1.4fd30ff058bbap21 -0x1.8f228a929b535p20 0x0.0p0 -0x1.394bd097e27e4p6 0x1.23ffffff5ec43p5 0x0.0p0 F +REG epsg:7360 3 OK -0x1.b46a1fc2d6838p19 0x1.eb3bc43817a0ap20 0x0.0p0 -0x1.6eb42f679458ap6 0x1.73fffffefa0ap5 0x0.0p0 F +REG epsg:7360 4 OK 0x1.2d5707f0b5a17p21 0x1.eb3bc43817a0bp20 0x0.0p0 -0x1.394bd0986ba76p6 0x1.73fffffefa0ap5 0x0.0p0 F +REG epsg:7361 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5ep6 0x1.3733333333333p5 0x0.0p0 F +REG epsg:7361 1 OK -0x1.5a694b9021154p18 -0x1.e87991d0b136cp18 0x0.0p0 -0x1.77b2ebb68eb05p6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7361 2 OK 0x1.9794a5c8108aap19 -0x1.e87991d0b136cp18 0x0.0p0 -0x1.444d1449714fcp6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7361 3 OK -0x1.0dbe77ff64e36p18 0x1.2a8cc3b51c461p19 0x0.0p0 -0x1.77b2ebb6357d1p6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7361 4 OK 0x1.713f3bffb271bp19 0x1.2a8cc3b51c461p19 0x0.0p0 -0x1.444d1449ca82fp6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7362 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5ep6 0x1.3733333333333p5 0x0.0p0 F +REG epsg:7362 1 OK -0x1.1c21232696de9p20 -0x1.90a6b2f576e66p20 0x0.0p0 -0x1.77b2ebb68eb05p6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7362 2 OK 0x1.4e4d11934b6f6p21 -0x1.90a6b2f576e66p20 0x0.0p0 -0x1.444d1449714fcp6 0x1.0f333332c8663p5 0x0.0p0 F +REG epsg:7362 3 OK -0x1.ba7e19f753792p19 0x1.e9bf04e1bc919p20 0x0.0p0 -0x1.77b2ebb6357d1p6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7362 4 OK 0x1.2edc067dd4de6p21 0x1.e9bf04e1bc919p20 0x0.0p0 -0x1.444d1449ca82fp6 0x1.5f333332732aep5 0x0.0p0 F +REG epsg:7363 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5b9999999999ap6 0x1.419999999999ap5 0x0.0p0 F +REG epsg:7363 1 OK -0x1.5c3ba386008ccp18 -0x1.e79253ab4a4eep18 0x0.0p0 -0x1.75c8f5d86dcf2p6 0x1.19999999165e9p5 0x0.0p0 F +REG epsg:7363 2 OK 0x1.987dd1c30045cp19 -0x1.e79253ab4a4fp18 0x0.0p0 -0x1.416a3d5ac5642p6 0x1.19999999165e8p5 0x0.0p0 F +REG epsg:7363 3 OK -0x1.0bed5f1f6ec45p18 0x1.2aff111dbc342p19 0x0.0p0 -0x1.75c8f5d7fe7c6p6 0x1.69999998b907ep5 0x0.0p0 F +REG epsg:7363 4 OK 0x1.7056af8fb761ap19 0x1.2aff111dbc341p19 0x0.0p0 -0x1.416a3d5b34b6ep6 0x1.69999998b907fp5 0x0.0p0 F +REG epsg:7364 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5b9999999999ap6 0x1.419999999999ap5 0x0.0p0 F +REG epsg:7364 1 OK -0x1.1d9fa2deb5adcp20 -0x1.8fe90825667efp20 0x0.0p0 -0x1.75c8f5d86dcf2p6 0x1.19999999165e9p5 0x0.0p0 F +REG epsg:7364 2 OK 0x1.4f0c516f5ad68p21 -0x1.8fe90825667fp20 0x0.0p0 -0x1.416a3d5ac5641p6 0x1.19999999165e8p5 0x0.0p0 F +REG epsg:7364 3 OK -0x1.b78325f6041aep19 0x1.ea7a85c8c72fep20 0x0.0p0 -0x1.75c8f5d7fe7c6p6 0x1.69999998b907ep5 0x0.0p0 F +REG epsg:7364 4 OK 0x1.2e1d497d81066p21 0x1.ea7a85c8c72fdp20 0x0.0p0 -0x1.416a3d5b34b6ep6 0x1.69999998b907fp5 0x0.0p0 F +REG epsg:7365 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5e33333333333p6 0x1.2e66666666666p5 0x0.0p0 F +REG epsg:7365 1 OK -0x1.58ec1b759a498p18 -0x1.e935c03b5b4b8p18 0x0.0p0 -0x1.7782f0f3a262ep6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7365 2 OK 0x1.96d60dbacd256p19 -0x1.e935c03b5b4b6p18 0x0.0p0 -0x1.44e37572c4038p6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7365 3 OK -0x1.0f3afac30cd0bp18 0x1.2a2eb51bd888dp19 0x0.0p0 -0x1.7782f0f359796p6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7365 4 OK 0x1.71fd7d618668fp19 0x1.2a2eb51bd888ep19 0x0.0p0 -0x1.44e375730cecfp6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7366 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5e33333333333p6 0x1.2e66666666666p5 0x0.0p0 F +REG epsg:7366 1 OK -0x1.1ae87bdb12711p20 -0x1.91410c044fbc3p20 0x0.0p0 -0x1.7782f0f3a262ep6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7366 2 OK 0x1.4db0bded89394p21 -0x1.91410c044fbc2p20 0x0.0p0 -0x1.44e37572c4038p6 0x1.066666660ca68p5 0x0.0p0 F +REG epsg:7366 3 OK -0x1.bcee4c351558p19 0x1.e924b9f27a917p20 0x0.0p0 -0x1.7782f0f359796p6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7366 4 OK 0x1.2f78130d4556ap21 0x1.e924b9f27a918p20 0x0.0p0 -0x1.44e375730cecfp6 0x1.56666665be857p5 0x0.0p0 F +REG epsg:7367 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.5dccccccccccdp6 0x1.3ap5 0x0.0p0 F +REG epsg:7367 1 OK -0x1.5ae54dcae5a8cp18 -0x1.e83c76d3f41f2p18 0x0.0p0 -0x1.77a06edc91504p6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7367 2 OK 0x1.97d2a6e572d46p19 -0x1.e83c76d3f41f2p18 0x0.0p0 -0x1.43f92abd08496p6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7367 3 OK -0x1.0d431cc661612p18 0x1.2aab49f5d3571p19 0x0.0p0 -0x1.77a06edc327bfp6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7367 4 OK 0x1.71018e6330b09p19 0x1.2aab49f5d3571p19 0x0.0p0 -0x1.43f92abd671dcp6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7368 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.5dccccccccccdp6 0x1.3ap5 0x0.0p0 F +REG epsg:7368 1 OK -0x1.1c86d9ac3b323p20 -0x1.90749473493ecp20 0x0.0p0 -0x1.77a06edc91504p6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7368 2 OK 0x1.4e7fecd61d994p21 -0x1.90749473493ecp20 0x0.0p0 -0x1.43f92abd08496p6 0x1.11ffffff8f1c7p5 0x0.0p0 F +REG epsg:7368 3 OK -0x1.b9b3bee2035fp19 0x1.e9f1178326505p20 0x0.0p0 -0x1.77a06edc327bfp6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7368 4 OK 0x1.2ea96fb880d7ep21 0x1.e9f1178326505p20 0x0.0p0 -0x1.43f92abd671dcp6 0x1.61ffffff37a71p5 0x0.0p0 F +REG epsg:7369 0 OK 0x1.d4cp17 0x1.194p15 0x0.0p0 -0x1.55p6 0x1.4466666666666p5 0x0.0p0 F +REG epsg:7369 1 OK -0x1.5cbcef7dccf1ep18 -0x1.e752e30d2bdbep18 0x0.0p0 -0x1.6f52452cc18f4p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7369 2 OK 0x1.98be77bee678fp19 -0x1.e752e30d2bdbep18 0x0.0p0 -0x1.3aadbad33e70dp6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7369 3 OK -0x1.0b6dacb72f0edp18 0x1.2b1ec21fd5ab9p19 0x0.0p0 -0x1.6f52452c4bacep6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7369 4 OK 0x1.7016d65b97876p19 0x1.2b1ec21fd5ab9p19 0x0.0p0 -0x1.3aadbad3b4532p6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7370 0 OK 0x1.8079000000004p19 0x1.cd5e000000005p16 0x0.0p0 -0x1.55p6 0x1.4466666666666p5 0x0.0p0 F +REG epsg:7370 1 OK -0x1.1e09afbd50e5fp20 -0x1.8fb4ff74c6cd2p20 0x0.0p0 -0x1.6f52452cc18f4p6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7370 2 OK 0x1.4f4157dea8732p21 -0x1.8fb4ff74c6cd2p20 0x0.0p0 -0x1.3aadbad33e70dp6 0x1.1c666665dbaf6p5 0x0.0p0 F +REG epsg:7370 3 OK -0x1.b6b1ac12789bep19 0x1.eaae827f875cep20 0x0.0p0 -0x1.6f52452c4bacep6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7370 4 OK 0x1.2de8eb049e272p21 0x1.eaae827f875cep20 0x0.0p0 -0x1.3aadbad3b4532p6 0x1.6c6666657c441p5 0x0.0p0 F +REG epsg:7371 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7371 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7371 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7371 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7371 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7373 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7373 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7373 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7373 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7373 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7374 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG epsg:7374 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.7p5 -0x1.4p2 0x0.0p0 F +REG epsg:7374 2 OK 0x1.018fa874f5806p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.cp5 -0x1.4p2 0x0.0p0 F +REG epsg:7374 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.7p5 0x1.4p2 0x0.0p0 F +REG epsg:7374 4 OK 0x1.018fa874f5806p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.cp5 0x1.4p2 0x0.0p0 F +REG epsg:7375 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:7375 1 OK -0x1.ad750e9eb006p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap5 -0x1.4p2 0x0.0p0 F +REG epsg:7375 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.fp5 -0x1.4p2 0x0.0p0 F +REG epsg:7375 3 OK -0x1.ad750e9eb006p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap5 0x1.4p2 0x0.0p0 F +REG epsg:7375 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.fp5 0x1.4p2 0x0.0p0 F +REG epsg:7376 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:7376 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG epsg:7376 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p6 -0x1.4p2 0x0.0p0 F +REG epsg:7376 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG epsg:7376 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p6 0x1.4p2 0x0.0p0 F +REG epsg:7400 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7400 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7400 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7400 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7400 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7401 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7401 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7401 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7401 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7401 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7402 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7402 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7402 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7402 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7402 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7403 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7403 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7403 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7403 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7403 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7404 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7404 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7404 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7404 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7404 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7405 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7405 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7405 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7405 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7405 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7406 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7406 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7406 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7406 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7406 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7407 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7407 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7407 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7407 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7407 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7408 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7408 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7408 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7408 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7408 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7409 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7409 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7409 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7409 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7409 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7410 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7410 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7410 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7410 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7410 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7411 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7411 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7411 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7411 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7411 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7412 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7412 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7412 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7412 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7412 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7413 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7413 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7413 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7413 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7413 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7414 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7414 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7414 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7414 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7414 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7415 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7415 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7415 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7415 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7415 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7416 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7416 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7416 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7416 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7416 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7417 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7417 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7417 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7417 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7417 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7418 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7418 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7418 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7418 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7418 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7419 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7419 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7419 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7419 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7419 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7420 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7420 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7420 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7420 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7420 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7421 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7421 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7421 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7421 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7421 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7422 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7422 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7422 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7422 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7422 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7423 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7423 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7423 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7423 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7423 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7528 0 OK 0x1.1f8958db8bac7p17 0x1.e4f765fd8adacp-9 0x0.0p0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 0x0.0p0 F +REG epsg:7528 1 OK -0x1.bb90ee49f1ac2p18 -0x1.0429624f1d21ap19 0x0.0p0 -0x1.8382e3e19da44p6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:7528 2 OK 0x1.6d8d2392beac5p19 -0x1.0429624f1d21ap19 0x0.0p0 -0x1.4c7d1c1e625bcp6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:7528 3 OK -0x1.61c6e5d91f22ap18 0x1.1a8dea97aaa1p19 0x0.0p0 -0x1.8382e3e0e7308p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:7528 4 OK 0x1.40a81f5a55679p19 0x1.1a8dea97aaa1p19 0x0.0p0 -0x1.4c7d1c1f18cf8p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:7529 0 OK 0x1.518af919ce076p17 0x1.bda5119ce075fp-10 0x0.0p0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 0x0.0p0 F +REG epsg:7529 1 OK -0x1.a65e92a28bb43p18 -0x1.032ae87cc517cp19 0x0.0p0 -0x1.8720d6bfb42fp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:7529 2 OK 0x1.7bf4c5de2cdd4p19 -0x1.032ae87cc517cp19 0x0.0p0 -0x1.4dd978e54620bp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:7529 3 OK -0x1.44ea76b66b261p18 0x1.1b72b52bc854p19 0x0.0p0 -0x1.8720d6beb241p6 0x1.95a61d93647a3p5 0x0.0p0 F +REG epsg:7529 4 OK 0x1.4b3ab7e81c963p19 0x1.1b72b52bc853fp19 0x0.0p0 -0x1.4dd978e6480ebp6 0x1.95a61d93647a2p5 0x0.0p0 F +REG epsg:7530 0 OK 0x1.6bdep16 0x1.7c1bda5119cep-9 0x0.0p0 -0x1.6f66666666666p6 0x1.6911111111111p5 0x0.0p0 F +REG epsg:7530 1 OK -0x1.f3375bd1c99d4p18 -0x1.036bcd8facc5bp19 0x0.0p0 -0x1.8bc0151c74651p6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:7530 2 OK 0x1.54932de8e4ceap19 -0x1.036bcd8facc5bp19 0x0.0p0 -0x1.530cb7b05867cp6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:7530 3 OK -0x1.93b2530bd313ep18 0x1.1b39b314e04bdp19 0x0.0p0 -0x1.8bc0151b87521p6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:7530 4 OK 0x1.24d0a985e989fp19 0x1.1b39b314e04bdp19 0x0.0p0 -0x1.530cb7b1457abp6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:7531 0 OK 0x1.be7c3a8f5c28fp17 0x1.2223bde9e1b09p17 0x0.0p0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe8cp5 0x0.0p0 F +REG epsg:7531 1 OK -0x1.72b2e8085ba4ep18 -0x1.72af861a69d2cp18 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:7531 2 OK 0x1.9897914bdbe6fp19 -0x1.72af861a69d2cp18 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:7531 3 OK -0x1.0e49870f3b82cp18 0x1.63d5a2ce074a2p19 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:7531 4 OK 0x1.6662e0cf4bd5dp19 0x1.63d5a2ce074a2p19 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:7532 0 OK 0x1.edcp14 0x1.1f8p12 0x0.0p0 -0x1.6p6 0x1.58p5 0x0.0p0 F +REG epsg:7532 1 OK -0x1.15f29bd9d0b7bp19 -0x1.020f0a32ba273p19 0x0.0p0 -0x1.7b58b7731de0cp6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:7532 2 OK 0x1.34ce9bd9d0b71p19 -0x1.020f0a32ba274p19 0x0.0p0 -0x1.44a7488ce21f4p6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:7532 3 OK -0x1.d34141456ebafp18 0x1.1ca91a704ce78p19 0x0.0p0 -0x1.7b58b7727134fp6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:7532 4 OK 0x1.087ca0a2b75cfp19 0x1.1ca91a704ce78p19 0x0.0p0 -0x1.44a7488d8ecb1p6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:7533 0 OK 0x1.564e2cd35a858p17 0x1.3a92a30553261p-8 0x0.0p0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 0x0.0p0 F +REG epsg:7533 1 OK -0x1.a05cc6787a2b8p18 -0x1.041d91745d219p19 0x0.0p0 -0x1.8ac09ae392e43p6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:7533 2 OK 0x1.7b5579a5ea592p19 -0x1.041d91745d218p19 0x0.0p0 -0x1.53a01b27cdd1dp6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:7533 3 OK -0x1.463615157bb12p18 0x1.1a98eec373a85p19 0x0.0p0 -0x1.8ac09ae2d947ap6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:7533 4 OK 0x1.4e4220f46b1bcp19 0x1.1a98eec373a86p19 0x0.0p0 -0x1.53a01b28876e6p6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:7534 0 OK 0x1.f4104154c985fp15 0x1.d06bcf0068db9p15 0x0.0p0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69769p5 0x0.0p0 F +REG epsg:7534 1 OK -0x1.090edc97e3bc9p19 -0x1.ca6c6f04a14b3p18 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:7534 2 OK 0x1.4790e4c27ced5p19 -0x1.ca6c6f04a14b3p18 0x0.0p0 -0x1.5517b0ead2635p6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:7534 3 OK -0x1.b060f031b40e6p18 0x1.380464775d676p19 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:7534 4 OK 0x1.16b280437337fp19 0x1.380464775d676p19 0x0.0p0 -0x1.5517b0ead2635p6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:7535 0 OK 0x1.de0971d495183p17 0x1.41205bc01a36ep-8 0x0.0p0 -0x1.62p6 0x1.55c16c16c16c2p5 0x0.0p0 F +REG epsg:7535 1 OK -0x1.5b4f4612b0516p18 -0x1.046b1f3f9c6e8p19 0x0.0p0 -0x1.7d38fa8e1bfe9p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:7535 2 OK 0x1.9cac5bf3a2b57p19 -0x1.046b1f3f9c6e7p19 0x0.0p0 -0x1.46c70571e4017p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:7535 3 OK -0x1.03897aaaba5f8p18 0x1.1a506e919f27dp19 0x0.0p0 -0x1.7d38fa8d767edp6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:7535 4 OK 0x1.70c9763fa7bc5p19 0x1.1a506e919f27dp19 0x0.0p0 -0x1.46c7057289813p6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:7536 0 OK 0x1.d51b70a3d70a4p15 0x1.5876de83e425bp15 0x0.0p0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9eap5 0x0.0p0 F +REG epsg:7536 1 OK -0x1.0a3a0d2289e2p19 -0x1.da3e78357b9dbp18 0x0.0p0 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:7536 2 OK 0x1.44dd7b3704c34p19 -0x1.da3e78357b9dbp18 0x0.0p0 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:7536 3 OK -0x1.b5d0c5c4079fap18 0x1.302832b5df70ap19 0x0.0p0 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:7536 4 OK 0x1.158bd0f67eb12p19 0x1.302832b5df70ap19 0x0.0p0 -0x1.50e788cded91ep6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:7537 0 OK 0x1.868699758e219p17 0x1.19ce075f6fd22p-7 0x0.0p0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 0x0.0p0 F +REG epsg:7537 1 OK -0x1.88717ff75a94cp18 -0x1.0411b4622cf29p19 0x0.0p0 -0x1.86737a6e0e03bp6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:7537 2 OK 0x1.877c0cb6745b2p19 -0x1.0411b4622cf29p19 0x0.0p0 -0x1.4f37303c9ca71p6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:7537 3 OK -0x1.2dea7ddac844cp18 0x1.1aa4cd4e45e8ep19 0x0.0p0 -0x1.86737a6d5115ap6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:7537 4 OK 0x1.5a388ba82b333p19 0x1.1aa4cd4e45e8ep19 0x0.0p0 -0x1.4f37303d59952p6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:7538 0 OK 0x1.4a662b46dc5d6p17 0x1.b3d19d07c84b6p16 0x0.0p0 -0x1.6593e93e93e95p6 0x1.5bb34ba7e5d35p5 0x0.0p0 F +REG epsg:7538 1 OK -0x1.a7778970d1d07p18 -0x1.99a221a7b0da6p18 0x0.0p0 -0x1.8121f60492aacp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:7538 2 OK 0x1.78eeda5bd7178p19 -0x1.99a221a7b0da6p18 0x0.0p0 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:7538 3 OK -0x1.4db8402cd1e5dp18 0x1.508610ba8dd47p19 0x0.0p0 -0x1.8121f60492aacp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:7538 4 OK 0x1.4c0f35b9d7222p19 0x1.508610ba8dd47p19 0x0.0p0 -0x1.4a05dc789527cp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:7539 0 OK 0x1.bc1aa09d49518p16 0x1.a38e3d7dbf488p15 0x0.0p0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6d93p5 0x0.0p0 F +REG epsg:7539 1 OK -0x1.dd3b84d0b1c42p18 -0x1.d25bbf5d0ef07p18 0x0.0p0 -0x1.87310ceda75f3p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:7539 2 OK 0x1.5da46a8fab367p19 -0x1.d25bbf5d0ef07p18 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:7539 3 OK -0x1.844eb7195412ap18 0x1.342b8716aebb6p19 0x0.0p0 -0x1.87310ceda75f3p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:7539 4 OK 0x1.312e03b3fc5dbp19 0x1.342b8716aebb6p19 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:7540 0 OK 0x1.e2cca5aee632p17 0x1.1e4ffeab367a1p17 0x0.0p0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce05p5 0x0.0p0 F +REG epsg:7540 1 OK -0x1.5aa8c4e2d2f42p18 -0x1.77c1225e98d3cp18 0x0.0p0 -0x1.811101c6c033dp6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:7540 2 OK 0x1.9ebab548dc931p19 -0x1.77c1225e98d3cp18 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:7540 3 OK -0x1.0223e2fac007ap18 0x1.617a67f5bd521p19 0x0.0p0 -0x1.811101c6c033dp6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:7540 4 OK 0x1.72784454d31cdp19 0x1.617a67f5bd521p19 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:7541 0 OK 0x1.012cee7bb2fecp18 0x1.f212d77318fc5p-8 0x0.0p0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 0x0.0p0 F +REG epsg:7541 1 OK -0x1.4747e03465b7cp18 -0x1.04e668b553a2cp19 0x0.0p0 -0x1.7dcadae28073ap6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:7541 2 OK 0x1.a4d0de95e5db3p19 -0x1.04e668b553a2cp19 0x0.0p0 -0x1.48685850b2bfbp6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:7541 3 OK -0x1.e68d8ed50f156p17 0x1.19dde21f4edfep19 0x0.0p0 -0x1.7dcadae1f7e31p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:7541 4 OK 0x1.7ad05230f6c4ap19 0x1.19dde21f4edffp19 0x0.0p0 -0x1.486858513b503p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:7542 0 OK 0x1.36288f0d844dp17 0x1.2d77318fc5048p-9 0x0.0p0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 0x0.0p0 F +REG epsg:7542 1 OK -0x1.b1e30d91558fep18 -0x1.03ba9ba4eecf2p19 0x0.0p0 -0x1.7914e13b2b4f2p6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:7542 2 OK 0x1.7405ce4f6cee7p19 -0x1.03ba9ba4eecf2p19 0x0.0p0 -0x1.4118a19d0233cp6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:7542 3 OK -0x1.54ca4582ad8c8p18 0x1.1aefbe82e6f2p19 0x0.0p0 -0x1.7914e13a568b9p6 0x1.8b333331c515fp5 0x0.0p0 F +REG epsg:7542 4 OK 0x1.45796a4818eccp19 0x1.1aefbe82e6f2p19 0x0.0p0 -0x1.4118a19dd6f74p6 0x1.8b333331c515fp5 0x0.0p0 F +REG epsg:7543 0 OK 0x1.cdf6a2f837b4ap15 0x1.0cb295e9e1b09p-8 0x0.0p0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 0x0.0p0 F +REG epsg:7543 1 OK -0x1.0ad82d20ef11fp19 -0x1.0315bcc7d2512p19 0x0.0p0 -0x1.8c65b3ecb0ac3p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:7543 2 OK 0x1.4497017ff6089p19 -0x1.0315bcc7d2512p19 0x0.0p0 -0x1.52efa168a4a93p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:7543 3 OK -0x1.b3a14bd6fba4cp18 0x1.1b83af78791c9p19 0x0.0p0 -0x1.8c65b3eba7ecep6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:7543 4 OK 0x1.138f7a4a84c8fp19 0x1.1b83af78791c9p19 0x0.0p0 -0x1.52efa169ad688p6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:7544 0 OK 0x1.94d0353f7ced9p15 0x1.89374bc6a7efap-9 0x0.0p0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 0x0.0p0 F +REG epsg:7544 1 OK -0x1.0d320e7b572fap19 -0x1.03bb2f8606243p19 0x0.0p0 -0x1.8b930e66913b5p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:7544 2 OK 0x1.3fcc152346cdfp19 -0x1.03bb2f8606242p19 0x0.0p0 -0x1.5394c41696973p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:7544 3 OK -0x1.bd43d911e2b6ap18 0x1.1af22abc91721p19 0x0.0p0 -0x1.8b930e65bc34ap6 0x1.8b444442d5ce7p5 0x0.0p0 F +REG epsg:7544 4 OK 0x1.113bf330e0f98p19 0x1.1af22abc91721p19 0x0.0p0 -0x1.5394c4176b9dep6 0x1.8b444442d5ce7p5 0x0.0p0 F +REG epsg:7545 0 OK 0x1.d51b70b0f27bbp16 0x1.6627ec84b5dccp16 0x0.0p0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6107p5 0x0.0p0 F +REG epsg:7545 1 OK -0x1.d9a3d91b0d10bp18 -0x1.abda7e6746275p18 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:7545 2 OK 0x1.6218c8b9c3274p19 -0x1.abda7e6746275p18 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:7545 3 OK -0x1.7b59f5351404cp18 0x1.475af140f04a2p19 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:7545 4 OK 0x1.32f3d6c6c6a15p19 0x1.475af140f04a2p19 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:7546 0 OK 0x1.04bf558adab9fp17 0x1.9ce075f6fd22p-8 0x0.0p0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 0x0.0p0 F +REG epsg:7546 1 OK -0x1.cc525347145bap18 -0x1.0349cb12fb857p19 0x0.0p0 -0x1.7d11f2ba24812p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:7546 2 OK 0x1.6888d468f78a4p19 -0x1.0349cb12fb857p19 0x0.0p0 -0x1.44102f67fda12p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:7546 3 OK -0x1.6bc648bcd513p18 0x1.1b58745a8beeep19 0x0.0p0 -0x1.7d11f2b92c85bp6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:7546 4 OK 0x1.3842cf23d7e6p19 0x1.1b58745a8beeep19 0x0.0p0 -0x1.44102f68f59c8p6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:7547 0 OK 0x1.0d61236944674p18 0x1.013a92a305532p-6 0x0.0p0 -0x1.6288888888889p6 0x1.600b60b60b60cp5 0x0.0p0 F +REG epsg:7547 1 OK -0x1.3efb6356514dp18 -0x1.03e83d624b652p19 0x0.0p0 -0x1.7e56d66506b26p6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:7547 2 OK 0x1.acded5146d0e5p19 -0x1.03e83d624b651p19 0x0.0p0 -0x1.46ba3aac0a5ecp6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:7547 3 OK -0x1.c650a0d35a36p17 0x1.1acd2691e1af8p19 0x0.0p0 -0x1.7e56d6643e02cp6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:7547 4 OK 0x1.7ef54b9e1af54p19 0x1.1acd2691e1af9p19 0x0.0p0 -0x1.46ba3aacd30e5p6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:7548 0 OK 0x1.d9463df6fd22p17 0x1.47ae147ae147bp-7 0x0.0p0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 0x0.0p0 F +REG epsg:7548 1 OK -0x1.5bbaaa27ac90cp18 -0x1.04ec4ba874304p19 0x0.0p0 -0x1.85de05ec3888cp6 0x1.2349f49eaaf96p5 0x0.0p0 F +REG epsg:7548 2 OK 0x1.9a80740f54d96p19 -0x1.04ec4ba874304p19 0x0.0p0 -0x1.5088607a2dddbp6 0x1.2349f49eaaf96p5 0x0.0p0 F +REG epsg:7548 3 OK -0x1.07e7e01ca62f7p18 0x1.19d859b1873d9p19 0x0.0p0 -0x1.85de05ebb1461p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:7548 4 OK 0x1.70970f09d1a8cp19 0x1.19d859b1873d9p19 0x0.0p0 -0x1.5088607ab5205p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:7549 0 OK 0x1.4c2f5ec22680ap17 0x1.660c96e2eb1c4p15 0x0.0p0 -0x1.675b05b05b05bp6 0x1.5519ba40451d2p5 0x0.0p0 F +REG epsg:7549 1 OK -0x1.a54e29a4d18dbp18 -0x1.da80613afa8ecp18 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:7549 2 OK 0x1.78bec4337c072p19 -0x1.da80613afa8ecp18 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:7549 3 OK -0x1.4e1e484280e66p18 0x1.301e2c4789f0cp19 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:7549 4 OK 0x1.4d26d38253b38p19 0x1.301e2c4789f0cp19 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:7550 0 OK 0x1.26ae26a161e4fp17 0x1.3542c78d4fdf4p16 0x0.0p0 -0x1.64f7777777778p6 0x1.5e74bc7a4dc96p5 0x0.0p0 F +REG epsg:7550 1 OK -0x1.b9ddd21edaaaap18 -0x1.b8fcaaa7ab3abp18 0x0.0p0 -0x1.80ae11048e154p6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:7550 2 OK 0x1.7045fc601e47dp19 -0x1.b8fcaaa7ab3abp18 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:7550 3 OK -0x1.5f078ed7c2bf4p18 0x1.40d57eb00d4b6p19 0x0.0p0 -0x1.80ae11048e154p6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:7550 4 OK 0x1.42dadabc92522p19 0x1.40d57eb00d4b6p19 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:7551 0 OK 0x1.b9b906ae7d567p16 0x1.26e978d4fdf3bp-8 0x0.0p0 -0x1.68a4fa4fa4fa6p6 0x1.544fa4fa4fa4ep5 0x0.0p0 F +REG epsg:7551 1 OK -0x1.dba0bd88923b8p18 -0x1.047e04a70600bp19 0x0.0p0 -0x1.83c9c54d1ce49p6 0x1.2c4fa4f991a41p5 0x0.0p0 F +REG epsg:7551 2 OK 0x1.5c3ea06fe874p19 -0x1.047e04a70600bp19 0x0.0p0 -0x1.4d802f522d102p6 0x1.2c4fa4f991a4p5 0x0.0p0 F +REG epsg:7551 3 OK -0x1.8468bfe06f36bp18 0x1.1a40605d8e6c7p19 0x0.0p0 -0x1.83c9c54c7bdf7p6 0x1.7c4fa4f927e63p5 0x0.0p0 F +REG epsg:7551 4 OK 0x1.30a2a19bd6f17p19 0x1.1a40605d8e6c7p19 0x0.0p0 -0x1.4d802f52ce154p6 0x1.7c4fa4f927e62p5 0x0.0p0 F +REG epsg:7552 0 OK 0x1.af9a38902de01p17 0x1.16872b020c49cp-7 0x0.0p0 -0x1.6905b05b05b07p6 0x1.6b77777777777p5 0x0.0p0 F +REG epsg:7552 1 OK -0x1.76e4650887c2cp18 -0x1.034b40e5d332dp19 0x0.0p0 -0x1.8585da1eb7d85p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:7552 2 OK 0x1.933f4ecc5ad1fp19 -0x1.034b40e5d332cp19 0x0.0p0 -0x1.4c85869753887p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:7552 3 OK -0x1.165cd94aa29p18 0x1.1b58cf307fffep19 0x0.0p0 -0x1.8585da1dc010dp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:7552 4 OK 0x1.62fb88ed68389p19 0x1.1b58cf307ffffp19 0x0.0p0 -0x1.4c8586984b4ffp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:7553 0 OK 0x1.a5ep14 0x1.86ap14 0x0.0p0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 0x0.0p0 F +REG epsg:7553 1 OK -0x1.192fa70f62082p19 -0x1.ef2d1e808fb9cp18 0x0.0p0 -0x1.874cc9e676b27p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:7553 2 OK 0x1.338da70f62082p19 -0x1.ef2d1e808fb9cp18 0x0.0p0 -0x1.4f7454a2226d4p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:7553 3 OK -0x1.d5c02c4aad0a5p18 0x1.2717bb4accd89p19 0x0.0p0 -0x1.874cc9e5a6805p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:7553 4 OK 0x1.053e162556852p19 0x1.2717bb4accd89p19 0x0.0p0 -0x1.4f7454a2f29f6p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:7554 0 OK 0x1.6b242fb7e91p17 0x1.d7dbf487fcb92p-11 0x0.0p0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:7554 1 OK -0x1.93fdcfcaef7c4p18 -0x1.049d3a0b1afe4p19 0x0.0p0 -0x1.7a952398afa0cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:7554 2 OK 0x1.7f90ffc16c462p19 -0x1.049d3a0b1afe4p19 0x0.0p0 -0x1.4492aee47831cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:7554 3 OK -0x1.3dc196eb6669ep18 0x1.1a2185126f49fp19 0x0.0p0 -0x1.7a9523981658dp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:7554 4 OK 0x1.5472e351a7bcfp19 0x1.1a2185126f49fp19 0x0.0p0 -0x1.4492aee51179bp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:7555 0 OK 0x1.37f1c2eb1c433p16 0x1.3a92a30553261p-10 0x0.0p0 -0x1.5e33333333333p6 0x1.5a22222222223p5 0x0.0p0 F +REG epsg:7555 1 OK -0x1.fd2f3a73445e1p18 -0x1.0432dcbdff0b9p19 0x0.0p0 -0x1.79aa82673328dp6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:7555 2 OK 0x1.4c940df4693fdp19 -0x1.0432dcbdff0b9p19 0x0.0p0 -0x1.42bbe3ff333d9p6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:7555 3 OK -0x1.a3b5f20fbc8acp18 0x1.1a837ec1105a7p19 0x0.0p0 -0x1.79aa82667f6c1p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:7555 4 OK 0x1.1fd769c2a5563p19 0x1.1a837ec1105a7p19 0x0.0p0 -0x1.42bbe3ffe6fa5p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:7556 0 OK 0x1.fd96a8e8a71dep16 0x1.b089a02752546p-9 0x0.0p0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 0x0.0p0 F +REG epsg:7556 1 OK -0x1.cc111922f58dap18 -0x1.04204e12c6dep19 0x0.0p0 -0x1.88d0fb8f2ed47p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:7556 2 OK 0x1.656e36cba48efp19 -0x1.04204e12c6ddfp19 0x0.0p0 -0x1.51b78cf959b41p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:7556 3 OK -0x1.7203074e2b3p18 0x1.1a9599fbaac57p19 0x0.0p0 -0x1.88d0fb8e760e8p6 0x1.839be023201c5p5 0x0.0p0 F +REG epsg:7556 4 OK 0x1.38672de13f5ffp19 0x1.1a9599fbaac58p19 0x0.0p0 -0x1.51b78cfa127ap6 0x1.839be023201c6p5 0x0.0p0 F +REG epsg:7557 0 OK 0x1.838c99374bc6ap17 0x1.9b3fc86c22681p16 0x0.0p0 -0x1.6422222222222p6 0x1.693be0a9d7fabp5 0x0.0p0 F +REG epsg:7557 1 OK -0x1.8d9f0460290e3p18 -0x1.9e58b263b048ap18 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:7557 2 OK 0x1.8895cecbba6a6p19 -0x1.9e58b263b048ap18 0x0.0p0 -0x1.47c5ca068267bp6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:7557 3 OK -0x1.2e651e043498ap18 0x1.4e1c176750b6dp19 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:7557 4 OK 0x1.58f8db9dc02fap19 0x1.4e1c176750b6dp19 0x0.0p0 -0x1.47c5ca068267bp6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:7558 0 OK 0x1.c5a10844d013bp16 0x1.7c1bda5119cep-8 0x0.0p0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 0x0.0p0 F +REG epsg:7558 1 OK -0x1.dc4e76dca4bb1p18 -0x1.038caff499374p19 0x0.0p0 -0x1.832420d024786p6 0x1.3ec16c15b0684p5 0x0.0p0 F +REG epsg:7558 2 OK 0x1.5f8f7d7f86631p19 -0x1.038caff499374p19 0x0.0p0 -0x1.4ab9bd0db9658p6 0x1.3ec16c15b0684p5 0x0.0p0 F +REG epsg:7558 3 OK -0x1.7dbf1888db8f5p18 0x1.1b1e1620786fep19 0x0.0p0 -0x1.832420cf4146cp6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:7558 4 OK 0x1.3047ce55a1cd2p19 0x1.1b1e1620786ffp19 0x0.0p0 -0x1.4ab9bd0e9c972p6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:7559 0 OK 0x1.23b4263886595p16 0x1.ae1288a71de6ap15 0x0.0p0 -0x1.67147ae147ae1p6 0x1.67350d60e1d95p5 0x0.0p0 F +REG epsg:7559 1 OK -0x1.030632e367b78p19 -0x1.cf9e290f75471p18 0x0.0p0 -0x1.8350c33b464acp6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:7559 2 OK 0x1.4bf33c71894dep19 -0x1.cf9e290f75471p18 0x0.0p0 -0x1.4ad8328749117p6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:7559 3 OK -0x1.a7a9e0ab10d89p18 0x1.357b474d8189dp19 0x0.0p0 -0x1.8350c33b464acp6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:7559 4 OK 0x1.1cc1f9e3aa02ap19 0x1.357b474d8189dp19 0x0.0p0 -0x1.4ad8328749117p6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:7560 0 OK 0x1.d22170902de01p17 0x1.a36e2eb1c432dp-9 0x0.0p0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 0x0.0p0 F +REG epsg:7560 1 OK -0x1.64608c21b9732p18 -0x1.039b19bb3e0cfp19 0x0.0p0 -0x1.7afa4c47993bap6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:7560 2 OK 0x1.9b40fe58f3a99p19 -0x1.039b19bb3e0cfp19 0x0.0p0 -0x1.42b60ebe171f6p6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:7560 3 OK -0x1.06532093fb738p18 0x1.1b0c7e0469502p19 0x0.0p0 -0x1.7afa4c46bb1ap6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:7560 4 OK 0x1.6c3a489214a9cp19 0x1.1b0c7e0469502p19 0x0.0p0 -0x1.42b60ebef540fp6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:7561 0 OK 0x1.9bf50318fc505p16 0x1.7c1bda5119cep-9 0x0.0p0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:7561 1 OK -0x1.e68061f799535p18 -0x1.0399339082507p19 0x0.0p0 -0x1.7dcfe5d3a9d01p6 0x1.3dbbbbbab0208p5 0x0.0p0 F +REG epsg:7561 2 OK 0x1.5a3d71c20bbdcp19 -0x1.0399339082507p19 0x0.0p0 -0x1.45856f81ab855p6 0x1.3dbbbbbab0208p5 0x0.0p0 F +REG epsg:7561 3 OK -0x1.885d94ec31b8fp18 0x1.1b0fdc1f700b8p19 0x0.0p0 -0x1.7dcfe5d2cadc4p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:7561 4 OK 0x1.2b2c0b3c57f09p19 0x1.1b0fdc1f700b8p19 0x0.0p0 -0x1.45856f828a791p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:7562 0 OK 0x1.8f749ac083127p17 0x1.dc43fc710cb29p16 0x0.0p0 -0x1.6a91111111112p6 0x1.600026c287bb7p5 0x0.0p0 F +REG epsg:7562 1 OK -0x1.85ca2c1c8b03ep18 -0x1.8f141ebf767cep18 0x0.0p0 -0x1.865eb68f209b9p6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:7562 2 OK 0x1.8a9f636e870bcp19 -0x1.8f141ebf767cep18 0x0.0p0 -0x1.4ec36b930186bp6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:7562 3 OK -0x1.2a55e9105d96p18 0x1.55c917514282dp19 0x0.0p0 -0x1.865eb68f209b9p6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:7562 4 OK 0x1.5ce541e87054cp19 0x1.55c917514282dp19 0x0.0p0 -0x1.4ec36b930186bp6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:7563 0 OK 0x1.65302f0d844dp17 0x1.b089a02752546p-9 0x0.0p0 -0x1.5fa2222222224p6 0x1.632d82d82d82dp5 0x0.0p0 F +REG epsg:7563 1 OK -0x1.9a5ed5e9b58aep18 -0x1.03bb3cb394d1cp19 0x0.0p0 -0x1.7b9feada051ccp6 0x1.3b2d82d72ef93p5 0x0.0p0 F +REG epsg:7563 2 OK 0x1.7fc7827b9cec8p19 -0x1.03bb3cb394d1bp19 0x0.0p0 -0x1.43a4596a3f27ap6 0x1.3b2d82d72ef92p5 0x0.0p0 F +REG epsg:7563 3 OK -0x1.3d4840ed1e587p18 0x1.1aefd5078d5cap19 0x0.0p0 -0x1.7b9fead9306fap6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:7563 4 OK 0x1.513c37fd51533p19 0x1.1aefd5078d5cbp19 0x0.0p0 -0x1.43a4596b13d4cp6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:7564 0 OK 0x1.11d823dd97f63p16 0x1.c1e811b71758ep15 0x0.0p0 -0x1.662d82d82d82dp6 0x1.6da240127344dp5 0x0.0p0 F +REG epsg:7564 1 OK -0x1.05ed37b183f43p19 -0x1.cc6e4589dcac8p18 0x0.0p0 -0x1.82d0f2681f152p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:7564 2 OK 0x1.4a6340a8e9f24p19 -0x1.cc6e4589dcac8p18 0x0.0p0 -0x1.498a13483bf08p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:7564 3 OK -0x1.aac6a5cabeafdp18 0x1.370a8d6e4d9d1p19 0x0.0p0 -0x1.82d0f2681f152p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:7564 4 OK 0x1.19d95bdcc555fp19 0x1.370a8d6e4d9d1p19 0x0.0p0 -0x1.498a13483bf08p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:7565 0 OK 0x1.476c2aee631f9p17 0x1.5011166cf41f2p16 0x0.0p0 -0x1.70e93e93e93e9p6 0x1.6516d538431b3p5 0x0.0p0 F +REG epsg:7565 1 OK -0x1.aad27924e0d92p18 -0x1.b194ef42f9db4p18 0x0.0p0 -0x1.8d04788047198p6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:7565 2 OK 0x1.791f5209a1fdp19 -0x1.b194ef42f9db4p18 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:7565 3 OK -0x1.4d4f332b7e4fap18 0x1.4480bafa7501ap19 0x0.0p0 -0x1.8d04788047198p6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:7565 4 OK 0x1.4a5daf0cf0b82p19 0x1.4480bafa7501ap19 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:7566 0 OK 0x1.14d224226809dp17 0x1.82a9930be0dedp-8 0x0.0p0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 0x0.0p0 F +REG epsg:7566 1 OK -0x1.c2fe719720de6p18 -0x1.039fc650f90b9p19 0x0.0p0 -0x1.8ea6db5813a72p6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:7566 2 OK 0x1.6be84adcc4741p19 -0x1.039fc650f90b9p19 0x0.0p0 -0x1.566a35b8fd6ap6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:7566 3 OK -0x1.650a46f6016p18 0x1.1b0af2e2be075p19 0x0.0p0 -0x1.8ea6db5736856p6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:7566 4 OK 0x1.3cee358c34b4fp19 0x1.1b0af2e2be075p19 0x0.0p0 -0x1.566a35b9da8bcp6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:7567 0 OK 0x1.b88839c0ebeep15 0x1.86cc5ff2e48e9p15 0x0.0p0 -0x1.66p6 0x1.6355a7cef00d3p5 0x0.0p0 F +REG epsg:7567 1 OK -0x1.0b8eb5d7600a9p19 -0x1.d4f07d46fa58fp18 0x0.0p0 -0x1.82002f8de16p6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:7567 2 OK 0x1.429fbd0f7d88fp19 -0x1.d4f07d46fa58fp18 0x0.0p0 -0x1.49ffd0721eap6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:7567 3 OK -0x1.ba5120de4adf2p18 0x1.32d5f860daa36p19 0x0.0p0 -0x1.82002f8de16p6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:7567 4 OK 0x1.143997a742edcp19 0x1.32d5f860daa36p19 0x0.0p0 -0x1.49ffd0721eap6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:7568 0 OK 0x1.bd4b6d6388659p17 0x1.652bd3c361134p-7 0x0.0p0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 0x0.0p0 F +REG epsg:7568 1 OK -0x1.6e99181568eep18 -0x1.03acc198edac6p19 0x0.0p0 -0x1.8605e05127959p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:7568 2 OK 0x1.95f242bc78a92p19 -0x1.03acc198edac7p19 0x0.0p0 -0x1.4de35e42c1a92p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:7568 3 OK -0x1.10fd18c5193f6p18 0x1.1b0237a3e9416p19 0x0.0p0 -0x1.8605e0504ddf4p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:7568 4 OK 0x1.6724431450d2p19 0x1.1b0237a3e9416p19 0x0.0p0 -0x1.4de35e439b5f6p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:7569 0 OK 0x1.8b49cd6a161e5p17 0x1.0637b6703afb8p17 0x0.0p0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5853p5 0x0.0p0 F +REG epsg:7569 1 OK -0x1.86ce3575b312ap18 -0x1.83987aff1de7cp18 0x0.0p0 -0x1.8536a29c21962p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:7569 2 OK 0x1.890c016fe4987p19 -0x1.83987aff1de7cp18 0x0.0p0 -0x1.4e3b24805031p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:7569 3 OK -0x1.2d7f899379c82p18 0x1.5b8c7c4faf86dp19 0x0.0p0 -0x1.8536a29c21962p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:7569 4 OK 0x1.5c64ab7ec7f33p19 0x1.5b8c7c4faf86dp19 0x0.0p0 -0x1.4e3b24805031p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:7570 0 OK 0x1.1dc02573eab36p17 0x1.bda5119ce075fp-8 0x0.0p0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 0x0.0p0 F +REG epsg:7570 1 OK -0x1.ba4841a4ee0efp18 -0x1.04b889bc83dc5p19 0x0.0p0 -0x1.7f2d96ac7178ep6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:7570 2 OK 0x1.6c04338c6c612p19 -0x1.04b889bc83dc5p19 0x0.0p0 -0x1.4966529222706p6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:7570 3 OK -0x1.64de52cff310bp18 0x1.1a08fcf12540dp19 0x0.0p0 -0x1.7f2d96abde7c9p6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:7570 4 OK 0x1.414f3c21eee2p19 0x1.1a08fcf12540dp19 0x0.0p0 -0x1.49665292b56ccp6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:7571 0 OK 0x1.e9590cf765fd9p17 0x1.7f62b6ae7d567p-6 0x0.0p0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 0x0.0p0 F +REG epsg:7571 1 OK -0x1.578a36f9ccec8p18 -0x1.03f0393788d8ep19 0x0.0p0 -0x1.880842b7d2355p6 0x1.375b05af6ee02p5 0x0.0p0 F +REG epsg:7571 2 OK 0x1.a071a1f899746p19 -0x1.03f0393788d8fp19 0x0.0p0 -0x1.508045d0b6534p6 0x1.375b05af6ee01p5 0x0.0p0 F +REG epsg:7571 3 OK -0x1.f7fcac29c8b7fp17 0x1.1ac39889f4be7p19 0x0.0p0 -0x1.880842b70c12bp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:7571 4 OK 0x1.72abb186252c4p19 0x1.1ac39889f4be6p19 0x0.0p0 -0x1.508045d17c75dp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:7572 0 OK 0x1.6a8bc92a30553p17 0x1.4e3bcd35a8588p-8 0x0.0p0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 0x0.0p0 F +REG epsg:7572 1 OK -0x1.9536b2b54e22ep18 -0x1.046194bba6a3p19 0x0.0p0 -0x1.82ddd6c83504ap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:7572 2 OK 0x1.7fe13defbf3c1p19 -0x1.046194bba6a3p19 0x0.0p0 -0x1.4c555c6afe2eap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:7572 3 OK -0x1.3d21adec777d8p18 0x1.1a5a6af07077fp19 0x0.0p0 -0x1.82ddd6c78cfe2p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:7572 4 OK 0x1.53d6bb8b53e96p19 0x1.1a5a6af07077fp19 0x0.0p0 -0x1.4c555c6ba6352p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:7573 0 OK 0x1.a7449de69ad43p17 0x1.d79e29c0ebeep16 0x0.0p0 -0x1.6c77777777777p6 0x1.6f33672c63c8ap5 0x0.0p0 F +REG epsg:7573 1 OK -0x1.7d00ec2c752e2p18 -0x1.8e948d3b9d15ap18 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.4733672c63c7dp5 0x0.0p0 F +REG epsg:7573 2 OK 0x1.9222c50988009p19 -0x1.8e948d3b9d15ap18 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c7fp5 0x0.0p0 F +REG epsg:7573 3 OK -0x1.1b427357767fep18 0x1.55f2f09254a3p19 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:7573 4 OK 0x1.6143889f08a98p19 0x1.55f2f09254a3p19 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:7574 0 OK 0x1.004854d1b7176p18 0x1.3a92a30553261p-7 0x0.0p0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:7574 1 OK -0x1.4c1b629b5911cp18 -0x1.03e2a46c7e3cbp19 0x0.0p0 -0x1.7e3e10038ea3cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7574 2 OK 0x1.a656061f63a04p19 -0x1.03e2a46c7e3cbp19 0x0.0p0 -0x1.469a1d7f4989cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7574 3 OK -0x1.e05ff2704c828p17 0x1.1acd8b7367d15p19 0x0.0p0 -0x1.7e3e1002c50aap6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7574 4 OK 0x1.7860516dca38p19 0x1.1acd8b7367d15p19 0x0.0p0 -0x1.469a1d801322ep6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7575 0 OK 0x1.43415d77318fcp17 0x1.5182a9930be0ep-7 0x0.0p0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:7575 1 OK -0x1.aac3f1731db3p18 -0x1.03e30b35198a9p19 0x0.0p0 -0x1.8e5a81caab159p6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7575 2 OK 0x1.7702a77527a0bp19 -0x1.03e30b35198a9p19 0x0.0p0 -0x1.56b68f4665fbap6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7575 3 OK -0x1.4ed863b34f177p18 0x1.1acdfb58528d1p19 0x0.0p0 -0x1.8e5a81c9e17c7p6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7575 4 OK 0x1.490ce09540531p19 0x1.1acdfb58528dp19 0x0.0p0 -0x1.56b68f472f94cp6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7576 0 OK 0x1.6d85c985f06f7p17 0x1.a4e2c0902de01p16 0x0.0p0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc59483p5 0x0.0p0 F +REG epsg:7576 1 OK -0x1.98abeef7cd682p18 -0x1.9bea37c27575p18 0x0.0p0 -0x1.864e48bbb4894p6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:7576 2 OK 0x1.8318dc3edeebdp19 -0x1.9bea37c27575p18 0x0.0p0 -0x1.4d8f95222954ap6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:7576 3 OK -0x1.395dfa625fad8p18 0x1.4f529d3bd26dcp19 0x0.0p0 -0x1.864e48bbb4894p6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:7576 4 OK 0x1.5371e1f4280e7p19 0x1.4f529d3bd26dcp19 0x0.0p0 -0x1.4d8f95222954ap6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:7577 0 OK 0x1.f5d974f765fd9p17 0x1.0cb295e9e1b09p-8 0x0.0p0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 0x0.0p0 F +REG epsg:7577 1 OK -0x1.5016d1c3f67c4p18 -0x1.043e98ad31b16p19 0x0.0p0 -0x1.88e29dc63dbcdp6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:7577 2 OK 0x1.a2f8235dae3d7p19 -0x1.043e98ad31b15p19 0x0.0p0 -0x1.520c5128b1321p6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:7577 3 OK -0x1.ede3c0912c323p17 0x1.1a7a7294b7b18p19 0x0.0p0 -0x1.88e29dc58cd3cp6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:7577 4 OK 0x1.7665aa9ffe0bdp19 0x1.1a7a7294b7b19p19 0x0.0p0 -0x1.520c5129621b2p6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:7578 0 OK 0x1.b29438f9096bcp17 0x1.73581ed288ce7p15 0x0.0p0 -0x1.6b22222222223p6 0x1.5c99aadeb1d59p5 0x0.0p0 F +REG epsg:7578 1 OK -0x1.738e688136782p18 -0x1.d8148a20610fbp18 0x0.0p0 -0x1.86bd58a47e612p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:7578 2 OK 0x1.931150bd1ff29p19 -0x1.d8148a20610fbp18 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:7578 3 OK -0x1.19743ad9eb41p18 0x1.314ca5906a3c1p19 0x0.0p0 -0x1.86bd58a47e612p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:7578 4 OK 0x1.660439e97a56ep19 0x1.314ca5906a3c1p19 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:7579 0 OK 0x1.068888d1b7176p17 0x1.894237e90ff97p15 0x0.0p0 -0x1.65f49f49f49f6p6 0x1.709f6cb8f8fb5p5 0x0.0p0 F +REG epsg:7579 1 OK -0x1.cdae7e9edfae1p18 -0x1.d32c135c25565p18 0x0.0p0 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fa8p5 0x0.0p0 F +REG epsg:7579 2 OK 0x1.6a1b83b84b636p19 -0x1.d32c135c25565p18 0x0.0p0 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fa7p5 0x0.0p0 F +REG epsg:7579 3 OK -0x1.6b53714e2f20fp18 0x1.33a69f92aa947p19 0x0.0p0 -0x1.82c98af483fbdp6 0x1.989f6cb8f8a9ep5 0x0.0p0 F +REG epsg:7579 4 OK 0x1.38edfd0ff31cap19 0x1.33a69f92aa947p19 0x0.0p0 -0x1.491fb39f6542dp6 0x1.989f6cb8f8a9dp5 0x0.0p0 F +REG epsg:7580 0 OK 0x1.c6396ebb98c7ep17 0x1.b1f038ef34d6ap16 0x0.0p0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24cap5 0x0.0p0 F +REG epsg:7580 1 OK -0x1.685535a262b33p18 -0x1.9abf167379d08p18 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:7580 2 OK 0x1.9747522efdbe2p19 -0x1.9abf167379d08p18 0x0.0p0 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:7580 3 OK -0x1.110c5c08825aep18 0x1.4ffe43d1c4353p19 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:7580 4 OK 0x1.6ba2e5620d91ep19 0x1.4ffe43d1c4353p19 0x0.0p0 -0x1.46f74b6659832p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:7581 0 OK 0x1.c9336f212d773p17 0x1.6fe34d8adab9fp17 0x0.0p0 -0x1.6f22222222222p6 0x1.6fb094062376cp5 0x0.0p0 F +REG epsg:7581 1 OK -0x1.6c2280c2b00bp18 -0x1.4c7ace22a5464p18 0x0.0p0 -0x1.8be7808f8d268p6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:7581 2 OK 0x1.9aaaf7f1eec08p19 -0x1.4c7ace22a5464p18 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:7581 3 OK -0x1.0a2eaeb8b35aap18 0x1.76fd86ec520b2p19 0x0.0p0 -0x1.8be7808f8d268p6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:7581 4 OK 0x1.69b10eecf0686p19 0x1.76fd86ec520b2p19 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:7582 0 OK 0x1.d51b710624dd3p16 0x1.89374bc6a7efap-9 0x0.0p0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 0x0.0p0 F +REG epsg:7582 1 OK -0x1.d55c965a61ff3p18 -0x1.04578ec2d9142p19 0x0.0p0 -0x1.7b90d2587c97cp6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:7582 2 OK 0x1.5ff5276eba378p19 -0x1.04578ec2d9141p19 0x0.0p0 -0x1.44f205d506406p6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:7582 3 OK -0x1.7cf9634edfca9p18 0x1.1a63a98435cf3p19 0x0.0p0 -0x1.7b90d257d20b3p6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:7582 4 OK 0x1.33c38de8f91d2p19 0x1.1a63a98435cf4p19 0x0.0p0 -0x1.44f205d5b0ccep6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:7583 0 OK 0x1.97ca35810624ep17 0x1.bda5119ce075fp-9 0x0.0p0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 0x0.0p0 F +REG epsg:7583 1 OK -0x1.7e3515cdba357p18 -0x1.047aa07c5ab2ap19 0x0.0p0 -0x1.7c0e988dd845dp6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:7583 2 OK 0x1.8affa5a7602d2p19 -0x1.047aa07c5ab2ap19 0x0.0p0 -0x1.45be343ef487p6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:7583 3 OK -0x1.26e538ef1f0b2p18 0x1.1a42de674a427p19 0x0.0p0 -0x1.7c0e988d36808p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:7583 4 OK 0x1.5f57b7381298p19 0x1.1a42de674a427p19 0x0.0p0 -0x1.45be343f964c4p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:7584 0 OK 0x1.695afc467381dp17 0x1.cac083126e979p-8 0x0.0p0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 0x0.0p0 F +REG epsg:7584 1 OK -0x1.96bd1c01e5f5ap18 -0x1.04239a9e5afffp19 0x0.0p0 -0x1.7ecd63d5f17b8p6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:7584 2 OK 0x1.800c0c242cbbbp19 -0x1.04239a9e5afffp19 0x0.0p0 -0x1.47bb24b2970dp6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:7584 3 OK -0x1.3cc7e92063214p18 0x1.1a92c5f516b29p19 0x0.0p0 -0x1.7ecd63d5398f4p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:7584 4 OK 0x1.531172b36b519p19 0x1.1a92c5f516b29p19 0x0.0p0 -0x1.47bb24b34ef92p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:7585 0 OK 0x1.d51b70b0f27bbp16 0x1.601b8474538efp15 0x0.0p0 -0x1.64f7777777778p6 0x1.60e95b7ef36cp5 0x0.0p0 F +REG epsg:7585 1 OK -0x1.d86b56d8a0babp18 -0x1.da0885015e4acp18 0x0.0p0 -0x1.80d2d057ececp6 0x1.38e95b7ef36b3p5 0x0.0p0 F +REG epsg:7585 2 OK 0x1.617c87988cfbbp19 -0x1.da0885015e4c6p18 0x0.0p0 -0x1.491c1e970203p6 0x1.38e95b7ef36b1p5 0x0.0p0 F +REG epsg:7585 3 OK -0x1.7c99a2698b295p18 0x1.304d22046dd32p19 0x0.0p0 -0x1.80d2d057ececp6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:7585 4 OK 0x1.3393ad6102332p19 0x1.304d22046dd2cp19 0x0.0p0 -0x1.491c1e970203p6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:7586 0 OK 0x1.9731cf03afb7fp17 0x1.06dee083126e9p17 0x0.0p0 -0x1.68p6 0x1.62e698741787cp5 0x0.0p0 F +REG epsg:7586 1 OK -0x1.827f8f07cd6d6p18 -0x1.8266c5585f04p18 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:7586 2 OK 0x1.8cd8af05be922p19 -0x1.8266c5585f04p18 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:7586 3 OK -0x1.25e0446f01af2p18 0x1.5c1bbc4539243p19 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:7586 4 OK 0x1.5e8909b958b31p19 0x1.5c1bbc4539243p19 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:7587 0 OK 0x1.d7adffef9db2bp18 0x1.89374bc6a7efdp-7 0x0.0p0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 0x0.0p0 F +REG epsg:7587 1 OK -0x1.6bd10f658e2fap20 -0x1.aac6053778228p20 0x0.0p0 -0x1.8382e3e19da44p6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:7587 2 OK 0x1.2bd407aeae848p21 -0x1.aac6053778228p20 0x0.0p0 -0x1.4c7d1c1e625bcp6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:7587 3 OK -0x1.222bb96efda95p20 0x1.cf81c3112fc56p20 0x0.0p0 -0x1.8382e3e0e7308p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:7587 4 OK 0x1.07015cb366415p21 0x1.cf81c3112fc56p20 0x0.0p0 -0x1.4c7d1c1f18cf8p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:7588 0 OK 0x1.14db000831275p19 0x1.89374bc6a7efdp-8 0x0.0p0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 0x0.0p0 F +REG epsg:7588 1 OK -0x1.5a6e50eb4d24ep20 -0x1.a92492ea845d5p20 0x0.0p0 -0x1.8720d6bfb42fp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:7588 2 OK 0x1.37a4a879bf25ap21 -0x1.a92492ea845d6p20 0x0.0p0 -0x1.4dd978e54620bp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:7588 3 OK -0x1.0a7fab4c0722ap20 0x1.d0f9133ab9d04p20 0x0.0p0 -0x1.8720d6beb241p6 0x1.95a61d93647a2p5 0x0.0p0 F +REG epsg:7588 4 OK 0x1.0fad55aa1c248p21 0x1.d0f9133ab9d03p20 0x0.0p0 -0x1.4dd978e6480ebp6 0x1.95a61d93647a2p5 0x0.0p0 F +REG epsg:7589 0 OK 0x1.2a72680000003p18 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.6f66666666666p6 0x1.6911111111111p5 0x0.0p0 F +REG epsg:7589 1 OK -0x1.9976195678319p20 -0x1.a98f07473e919p20 0x0.0p0 -0x1.8bc0151c74651p6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:7589 2 OK 0x1.1757a6ab3c18dp21 -0x1.a98f07473e919p20 0x0.0p0 -0x1.530cb7b05867cp6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:7589 3 OK -0x1.4b1d8438caba8p20 0x1.d09b8ed7c12a4p20 0x0.0p0 -0x1.8bc0151b87521p6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:7589 4 OK 0x1.e056b838cabaap20 0x1.d09b8ed7c12a4p20 0x0.0p0 -0x1.530cb7b1457abp6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:7590 0 OK 0x1.6e36000831276p19 0x1.dbf32a2d0e564p18 0x0.0p0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe8cp5 0x0.0p0 F +REG epsg:7590 1 OK -0x1.300cdfb39418p20 -0x1.300a19775b35dp20 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:7590 2 OK 0x1.4f216fdde29fbp21 -0x1.300a19775b35dp20 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:7590 3 OK -0x1.bb6237428a686p19 0x1.23dbc2623869ep21 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:7590 4 OK 0x1.25f38dd4bb2dcp21 0x1.23dbc2623869ep21 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:7591 0 OK 0x1.94fa553f7cedcp16 0x1.d79ea9fbe76cep13 0x0.0p0 -0x1.6p6 0x1.58p5 0x0.0p0 F +REG epsg:7591 1 OK -0x1.c7f334c92063ep20 -0x1.a752e95fe2bc3p20 0x0.0p0 -0x1.7b58b7731de0cp6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:7591 2 OK 0x1.fa927f711000bp20 -0x1.a752e95fe2bc4p20 0x0.0p0 -0x1.44a7488ce21f4p6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:7591 3 OK -0x1.7f3f11c131c9cp20 0x1.d2f640ce1b82ep20 0x0.0p0 -0x1.7b58b7727134fp6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:7591 4 OK 0x1.b1de5c692166bp20 0x1.d2f640ce1b82dp20 0x0.0p0 -0x1.44a7488d8ecb1p6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:7592 0 OK 0x1.18c2fff7ced94p19 0x1.0624dd2f1a9ffp-6 0x0.0p0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 0x0.0p0 F +REG epsg:7592 1 OK -0x1.55810070937a7p20 -0x1.aab2a3304e668p20 0x0.0p0 -0x1.8ac09ae392e43p6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:7592 2 OK 0x1.37220034312a6p21 -0x1.aab2a3304e667p20 0x0.0p0 -0x1.53a01b27cdd1dp6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:7592 3 OK -0x1.0b8faa5be9e65p20 0x1.cf93d55436eddp20 0x0.0p0 -0x1.8ac09ae2d947ap6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:7592 4 OK 0x1.12295529dc603p21 0x1.cf93d55436edep20 0x0.0p0 -0x1.53a01b28876e6p6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:7593 0 OK 0x1.9a27ffdf3b64bp17 0x1.7cec0d4fdf3bbp17 0x0.0p0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69769p5 0x0.0p0 F +REG epsg:7593 1 OK -0x1.b2ce3efaa6b04p20 -0x1.7800b9920249ep20 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:7593 2 OK 0x1.0cac1f793ac4bp21 -0x1.7800b9920249ep20 0x0.0p0 -0x1.5517b0ead2635p6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:7593 3 OK -0x1.62a3fd52ca11ap20 0x1.ffd690bf5b55fp20 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:7593 4 OK 0x1.c92dfd4a98eacp20 0x1.ffd690bf5b55fp20 0x0.0p0 -0x1.5517b0ead2635p6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:7594 0 OK 0x1.8816fff7ced95p19 0x1.0624dd2f1a9ffp-6 0x0.0p0 -0x1.62p6 0x1.55c16c16c16c2p5 0x0.0p0 F +REG epsg:7594 1 OK -0x1.1cddc484fa9bp20 -0x1.ab31dbb03bce8p20 0x0.0p0 -0x1.7d38fa8e1bfe9p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:7594 2 OK 0x1.527a623e64baap21 -0x1.ab31dbb03bce7p20 0x0.0p0 -0x1.46c70571e4017p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:7594 3 OK -0x1.a9bfb5b6fe063p19 0x1.cf1ce6defecbfp20 0x0.0p0 -0x1.7d38fa8d767edp6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:7594 4 OK 0x1.2e7b6d69a6eeap21 0x1.cf1ce6defeccp20 0x0.0p0 -0x1.46c7057289813p6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:7595 0 OK 0x1.80c4000000004p17 0x1.1a8852f1a9fc1p17 0x0.0p0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9eap5 0x0.0p0 F +REG epsg:7595 1 OK -0x1.b4b90aa974a08p20 -0x1.84fa991bcedc9p20 0x0.0p0 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:7595 2 OK 0x1.0a750554ba505p21 -0x1.84fa991bcedc9p20 0x0.0p0 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:7595 3 OK -0x1.6719956780cd2p20 0x1.f2f1ba6f197e2p20 0x0.0p0 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:7595 4 OK 0x1.c74a956780cd2p20 0x1.f2f1ba6f197e2p20 0x0.0p0 -0x1.50e788cded91ep6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:7596 0 OK 0x1.404fffe76c8b9p19 0x1.cac083126e97ep-6 0x0.0p0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 0x0.0p0 F +REG epsg:7596 1 OK -0x1.41e2a3e34caf8p20 -0x1.aa9f2d225b5a3p20 0x0.0p0 -0x1.86737a6e0e03bp6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:7596 2 OK 0x1.411951e55c9d9p21 -0x1.aa9f2d225b5a3p20 0x0.0p0 -0x1.4f37303c9ca71p6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:7596 3 OK -0x1.ef449c4fd6287p19 0x1.cfa74dcbffc8ap20 0x0.0p0 -0x1.86737a6d5115ap6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:7596 4 OK 0x1.1bf92707abcfep21 0x1.cfa74dcbffc8ap20 0x0.0p0 -0x1.4f37303d59952p6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:7597 0 OK 0x1.0efefff7ced93p19 0x1.657653a5e3542p18 0x0.0p0 -0x1.6593e93e93e95p6 0x1.5bb34ba7e5d35p5 0x0.0p0 F +REG epsg:7597 1 OK -0x1.5b54c3e173ae6p20 -0x1.4ffc132beb264p20 0x0.0p0 -0x1.8121f60492aacp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:7597 2 OK 0x1.3529e1eca1444p21 -0x1.4ffc132beb264p20 0x0.0p0 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:7597 3 OK -0x1.11b83e744a938p20 0x1.1405006402e28p21 0x0.0p0 -0x1.8121f60492aacp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:7597 4 OK 0x1.105b9f360cb6cp21 0x1.1405006402e28p21 0x0.0p0 -0x1.4a05dc789527cp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:7598 0 OK 0x1.6c42000000006p18 0x1.581f7e560418cp17 0x0.0p0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6d93p5 0x0.0p0 F +REG epsg:7598 1 OK -0x1.876e190b36222p20 -0x1.7e82d34c0c3p20 0x0.0p0 -0x1.87310ceda75f3p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:7598 2 OK 0x1.1ec78c859b113p21 -0x1.7e82d34c0c3p20 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:7598 3 OK -0x1.3e7e375a85128p20 0x1.f986fa16d261cp20 0x0.0p0 -0x1.87310ceda75f3p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:7598 4 OK 0x1.f49f375a8512ap20 0x1.f986fa16d261cp20 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:7599 0 OK 0x1.8bff000000005p19 0x1.d5abf8b439588p18 0x0.0p0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce05p5 0x0.0p0 F +REG epsg:7599 1 OK -0x1.1c5532fb4a344p20 -0x1.3432690aa4433p20 0x0.0p0 -0x1.811101c6c033dp6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:7599 2 OK 0x1.542a197da51a4p21 -0x1.3432690aa4433p20 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:7599 3 OK -0x1.a7751bea6a457p19 0x1.21ecfc33fdcdp21 0x0.0p0 -0x1.811101c6c033dp6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:7599 4 OK 0x1.2fdcc6fa9a918p21 0x1.21ecfc33fdcdp21 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:7600 0 OK 0x1.a5dffff7ced97p19 0x1.999999999999ep-6 0x0.0p0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 0x0.0p0 F +REG epsg:7600 1 OK -0x1.0c703bad2bfe2p20 -0x1.abfc19a1809bfp20 0x0.0p0 -0x1.7dcadae280739p6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:7600 2 OK 0x1.59281dd27d6c5p21 -0x1.abfc19a1809bep20 0x0.0p0 -0x1.48685850b2bfap6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:7600 3 OK -0x1.8f13259f68db9p19 0x1.ce60fe90002a2p20 0x0.0p0 -0x1.7dcadae1f7e31p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:7600 4 OK 0x1.36b4c963c1a41p21 0x1.ce60fe90002a4p20 0x0.0p0 -0x1.486858513b503p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:7601 0 OK 0x1.fcca000000006p18 0x1.0624dd2f1aap-7 0x0.0p0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 0x0.0p0 F +REG epsg:7601 1 OK -0x1.63e0af20d3e08p20 -0x1.aa104d2e4c75dp20 0x0.0p0 -0x1.7914e13b2b4f2p6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:7601 2 OK 0x1.3122d79069f05p21 -0x1.aa104d2e4c75dp20 0x0.0p0 -0x1.4118a19d0233cp6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:7601 3 OK -0x1.1784d68f427f6p20 0x1.d0223d89dfbc3p20 0x0.0p0 -0x1.7914e13a568b9p6 0x1.8b333331c515fp5 0x0.0p0 F +REG epsg:7601 4 OK 0x1.0af4eb47a13fcp21 0x1.d0223d89dfbc3p20 0x0.0p0 -0x1.4118a19dd6f74p6 0x1.8b333331c516p5 0x0.0p0 F +REG epsg:7602 0 OK 0x1.7ae8000000004p17 0x1.a9fbe76c8b43dp-7 0x0.0p0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 0x0.0p0 F +REG epsg:7602 1 OK -0x1.b5bc6eb99ee68p20 -0x1.a901d85a47947p20 0x0.0p0 -0x1.8c65b3ecb0ac3p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:7602 2 OK 0x1.0a3b375ccf735p21 -0x1.a901d85a47947p20 0x0.0p0 -0x1.52efa168a4a93p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:7602 3 OK -0x1.654eb25023bd2p20 0x1.d114ecf529eabp20 0x0.0p0 -0x1.8c65b3eba7ecep6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:7602 4 OK 0x1.c408b25023bd4p20 0x1.d114ecf529eabp20 0x0.0p0 -0x1.52efa169ad688p6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:7603 0 OK 0x1.4c080020c49bep17 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 0x0.0p0 F +REG epsg:7603 1 OK -0x1.b997c4589dcfp20 -0x1.aa113fc4eaaf5p20 0x0.0p0 -0x1.8b930e66913b5p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:7603 2 OK 0x1.064ce230677b7p21 -0x1.aa113fc4eaaf4p20 0x0.0p0 -0x1.5394c41696973p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:7603 3 OK -0x1.6d35c86479f73p20 0x1.d02636f630547p20 0x0.0p0 -0x1.8b930e65bc34ap6 0x1.8b444442d5ce7p5 0x0.0p0 F +REG epsg:7603 4 OK 0x1.c037c86cab1efp20 0x1.d02636f630548p20 0x0.0p0 -0x1.5394c4176b9dep6 0x1.8b444442d5ce8p5 0x0.0p0 F +REG epsg:7604 0 OK 0x1.80c4000000006p18 0x1.25c333020c49fp18 0x0.0p0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6107p5 0x0.0p0 F +REG epsg:7604 1 OK -0x1.847bc6b6788bap20 -0x1.5eedd2e086daap20 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:7604 2 OK 0x1.226ee35b3c45fp21 -0x1.5eedd2e086daap20 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:7604 3 OK -0x1.3725ad7126e38p20 0x1.0c7fdf2886b9bp21 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:7604 4 OK 0x1.f787ad7126e3ap20 0x1.0c7fdf2886b9bp21 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:7605 0 OK 0x1.abbc004189377p18 0x1.5810624dd2f1fp-6 0x0.0p0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 0x0.0p0 F +REG epsg:7605 1 OK -0x1.798f41db0c261p20 -0x1.a9573d03a6b0ep20 0x0.0p0 -0x1.7d11f2ba24812p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:7605 2 OK 0x1.27b6a0fde8607p21 -0x1.a9573d03a6b0fp20 0x0.0p0 -0x1.44102f67fda12p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:7605 3 OK -0x1.2a5ef44dd0e2p20 0x1.d0ce024983fe3p20 0x0.0p0 -0x1.7d11f2b92c85bp6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:7605 4 OK 0x1.001e7a374abe8p21 0x1.d0ce024983fe3p20 0x0.0p0 -0x1.44102f68f59c8p6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:7606 0 OK 0x1.b9e50028f5c31p19 0x1.a9fbe76c8b43fp-5 0x0.0p0 -0x1.6288888888889p6 0x1.600b60b60b60cp5 0x0.0p0 F +REG epsg:7606 1 OK -0x1.05a1b5e88d824p20 -0x1.aa5b2819cb0cfp20 0x0.0p0 -0x1.7e56d66506b26p6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:7606 2 OK 0x1.5fc35b08c1a32p21 -0x1.aa5b2819cb0cdp20 0x0.0p0 -0x1.46ba3aac0a5ecp6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:7606 3 OK -0x1.74a2067ac81f5p19 0x1.cfe97e1aead99p20 0x0.0p0 -0x1.7e56d6643e02cp6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:7606 4 OK 0x1.3a1b01b32ce9cp21 0x1.cfe97e1aead9ap20 0x0.0p0 -0x1.46ba3aacd30e5p6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:7607 0 OK 0x1.842effef9db26p19 0x1.0e5604189374dp-5 0x0.0p0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 0x0.0p0 F +REG epsg:7607 1 OK -0x1.1d35d9c0d2fbdp20 -0x1.ac05c1a77f023p20 0x0.0p0 -0x1.85de05ec3888cp6 0x1.2349f49eaaf95p5 0x0.0p0 F +REG epsg:7607 2 OK 0x1.50b26cd838572p21 -0x1.ac05c1a77f023p20 0x0.0p0 -0x1.5088607a2dddbp6 0x1.2349f49eaaf95p5 0x0.0p0 F +REG epsg:7607 3 OK -0x1.b0ea587f90164p19 0x1.ce57eb07f3bc5p20 0x0.0p0 -0x1.85de05ebb1461p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:7607 4 OK 0x1.2e521617b2decp21 0x1.ce57eb07f3bc5p20 0x0.0p0 -0x1.5088607ab5205p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:7608 0 OK 0x1.1076000000003p19 0x1.25acc78d4fdf6p17 0x0.0p0 -0x1.675b05b05b05bp6 0x1.5519ba40451d2p5 0x0.0p0 F +REG epsg:7608 1 OK -0x1.598ee20eb366ep20 -0x1.8530a87d00a87p20 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:7608 2 OK 0x1.3502710759b39p21 -0x1.8530a87d00a87p20 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:7608 3 OK -0x1.120bee5e6f6f8p20 0x1.f2e1486e53668p20 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:7608 4 OK 0x1.1140f72f37b7ep21 0x1.f2e1486e53668p20 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:7609 0 OK 0x1.e366000000005p18 0x1.fb5110e56041ep17 0x0.0p0 -0x1.64f7777777778p6 0x1.5e74bc7a4dc96p5 0x0.0p0 F +REG epsg:7609 1 OK -0x1.6a6c2de44a5a8p20 -0x1.69b381869d48ap20 0x0.0p0 -0x1.80ae11048e154p6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:7609 2 OK 0x1.2e0f96f2252d5p21 -0x1.69b381869d48ap20 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:7609 3 OK -0x1.1fead6d112856p20 0x1.072693b1964c7p21 0x0.0p0 -0x1.80ae11048e154p6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:7609 4 OK 0x1.08ceeb688942cp21 0x1.072693b1964c7p21 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:7610 0 OK 0x1.6a4e000000003p18 0x1.eb851eb851ebep-7 0x0.0p0 -0x1.68a4fa4fa4fa6p6 0x1.544fa4fa4fa4ep5 0x0.0p0 F +REG epsg:7610 1 OK -0x1.861d2c8535ab6p20 -0x1.ab50db0a9ed0dp20 0x0.0p0 -0x1.83c9c54d1ce49p6 0x1.2c4fa4f991a41p5 0x0.0p0 F +REG epsg:7610 2 OK 0x1.1da216429ad64p21 -0x1.ab50db0a9ed0cp20 0x0.0p0 -0x1.4d802f522d102p6 0x1.2c4fa4f991a4p5 0x0.0p0 F +REG epsg:7610 3 OK -0x1.3e9391db0928fp20 0x1.cf02906e10d3ep20 0x0.0p0 -0x1.83c9c54c7bdf7p6 0x1.7c4fa4f927e63p5 0x0.0p0 F +REG epsg:7610 4 OK 0x1.f3ba91db0929fp20 0x1.cf02906e10d3fp20 0x0.0p0 -0x1.4d802f52ce154p6 0x1.7c4fa4f927e62p5 0x0.0p0 F +REG epsg:7611 0 OK 0x1.6201000000004p19 0x1.cac083126e97ep-6 0x0.0p0 -0x1.6905b05b05b07p6 0x1.6b77777777777p5 0x0.0p0 F +REG epsg:7611 1 OK -0x1.337d5b9ca1bd6p20 -0x1.a959a23e85036p20 0x0.0p0 -0x1.8585da1eb7d85p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:7611 2 OK 0x1.4abf2dce50df4p21 -0x1.a959a23e85034p20 0x0.0p0 -0x1.4c85869753887p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:7611 3 OK -0x1.c8a17be8b0834p19 0x1.d0ce974acbc9fp20 0x0.0p0 -0x1.8585da1dc010dp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:7611 4 OK 0x1.2328defa2c215p21 0x1.d0ce974acbcap20 0x0.0p0 -0x1.4c8586984b4ffp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:7612 0 OK 0x1.5a06800000004p16 0x1.4064d53f7cedbp16 0x0.0p0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 0x0.0p0 F +REG epsg:7612 1 OK -0x1.cd432ef46f36ep20 -0x1.9625ce9f9ccc5p20 0x0.0p0 -0x1.874cc9e676b27p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:7612 2 OK 0x1.f883fef46f36ep20 -0x1.9625ce9f9ccc5p20 0x0.0p0 -0x1.4f7454a2226d4p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:7612 3 OK -0x1.814b1d8073283p20 0x1.e41332459ad42p20 0x0.0p0 -0x1.874cc9e5a6805p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:7612 4 OK 0x1.ac8bed8073283p20 0x1.e41332459ad42p20 0x0.0p0 -0x1.4f7454a2f29f6p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:7613 0 OK 0x1.29da00189374ep19 0x1.89374bc6a7efep-9 0x0.0p0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:7613 1 OK -0x1.4b5b6e8a9fb1bp20 -0x1.ab840cf97d9dbp20 0x0.0p0 -0x1.7a952398afa0cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:7613 2 OK 0x1.3a9ab75199934p21 -0x1.ab840cf97d9dbp20 0x0.0p0 -0x1.4492aee47831cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:7613 3 OK -0x1.04a0549643cccp20 0x1.cecff24b5740dp20 0x0.0p0 -0x1.7a9523981658dp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:7613 4 OK 0x1.173d2a576ba0dp21 0x1.cecff24b5740dp20 0x0.0p0 -0x1.4492aee51179bp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:7614 0 OK 0x1.ffb800c49ba63p17 0x1.0624dd2f1aap-8 0x0.0p0 -0x1.5e33333333333p6 0x1.5a22222222223p5 0x0.0p0 F +REG epsg:7614 1 OK -0x1.a1a329e83aefap20 -0x1.aad5919325f99p20 0x0.0p0 -0x1.79aa82673328dp6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:7614 2 OK 0x1.10c8950cb0ec9p21 -0x1.aad5919325f99p20 0x0.0p0 -0x1.42bbe3ff333d9p6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:7614 3 OK -0x1.58400f55507dap20 0x1.cf70aab437728p20 0x0.0p0 -0x1.79aa82667f6c1p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:7614 4 OK 0x1.d82e0f8677672p20 0x1.cf70aab437728p20 0x0.0p0 -0x1.42bbe3ffe6fa5p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:7615 0 OK 0x1.a1f7ffbe76c91p18 0x1.6872b020c49bep-7 0x0.0p0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 0x0.0p0 F +REG epsg:7615 1 OK -0x1.7959c1e729ec9p20 -0x1.aab7207f28aacp20 0x0.0p0 -0x1.88d0fb8f2ed47p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:7615 2 OK 0x1.252ae0e332a91p21 -0x1.aab7207f28aabp20 0x0.0p0 -0x1.51b78cf959b41p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:7615 3 OK -0x1.2f7c9e0d0ed26p20 0x1.cf8e5e699a11dp20 0x0.0p0 -0x1.88d0fb8e760e8p6 0x1.839be023201c5p5 0x0.0p0 F +REG epsg:7615 4 OK 0x1.003c4ef6251bep21 0x1.cf8e5e699a11fp20 0x0.0p0 -0x1.51b78cfa127ap6 0x1.839be023201c5p5 0x0.0p0 F +REG epsg:7616 0 OK 0x1.3ddf000000004p19 0x1.514f5af1a9fbfp18 0x0.0p0 -0x1.6422222222222p6 0x1.693be0a9d7fabp5 0x0.0p0 F +REG epsg:7616 1 OK -0x1.4621d72b8c752p20 -0x1.53d9b5bb18902p20 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:7616 2 OK 0x1.42006b95c63abp21 -0x1.53d9b5bb18902p20 0x0.0p0 -0x1.47c5ca068267bp6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:7616 3 OK -0x1.f00dc48fd386cp19 0x1.120a22578a9dfp21 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:7616 4 OK 0x1.1af2f123f4e1dp21 0x1.120a22578a9dfp21 0x0.0p0 -0x1.47c5ca068267bp6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:7617 0 OK 0x1.7412000000003p18 0x1.374bc6a7ef9dep-6 0x0.0p0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 0x0.0p0 F +REG epsg:7617 1 OK -0x1.86aba9eb9dfe9p20 -0x1.a9c4f8f5f2bf1p20 0x0.0p0 -0x1.832420d024786p6 0x1.3ec16c15b0684p5 0x0.0p0 F +REG epsg:7617 2 OK 0x1.205a54f5ceffdp21 -0x1.a9c4f8f5f2bfp20 0x0.0p0 -0x1.4ab9bd0db9658p6 0x1.3ec16c15b0685p5 0x0.0p0 F +REG epsg:7617 3 OK -0x1.391c941285a1ep20 0x1.d06e42cdae293p20 0x0.0p0 -0x1.832420cf4146cp6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:7617 4 OK 0x1.f325941285a2ep20 0x1.d06e42cdae294p20 0x0.0p0 -0x1.4ab9bd0e9c972p6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:7618 0 OK 0x1.de84000000005p17 0x1.60bfbc28f5c2dp17 0x0.0p0 -0x1.67147ae147ae1p6 0x1.67350d60e1d95p5 0x0.0p0 F +REG epsg:7618 1 OK -0x1.a8e85af122ea4p20 -0x1.7c4360b717bb6p20 0x0.0p0 -0x1.8350c33b464acp6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:7618 2 OK 0x1.1044ad7891753p21 -0x1.7c4360b717bb6p20 0x0.0p0 -0x1.4ad8328749117p6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:7618 3 OK -0x1.5b7e0e15d8c7ap20 0x1.fbadbf8772c5cp20 0x0.0p0 -0x1.8350c33b464acp6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:7618 4 OK 0x1.d31f0e15d8c7cp20 0x1.fbadbf8772c5cp20 0x0.0p0 -0x1.4ad8328749117p6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:7619 0 OK 0x1.7e5300395810ap19 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 0x0.0p0 F +REG epsg:7619 1 OK -0x1.244db214c8c1ap20 -0x1.a9dc9dbcfc17ep20 0x0.0p0 -0x1.7afa4c47993bap6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:7619 2 OK 0x1.5150592710692p21 -0x1.a9dc9dbcfc17ep20 0x0.0p0 -0x1.42b60ebe171f6p6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:7619 3 OK -0x1.ae5263d610c4ep19 0x1.d051662df0cd4p20 0x0.0p0 -0x1.7afa4c46bb1ap6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:7619 4 OK 0x1.2abe191230398p21 0x1.d051662df0cd4p20 0x0.0p0 -0x1.42b60ebef540fp6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:7620 0 OK 0x1.51e400418937ap18 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:7620 1 OK -0x1.8f08572d9197ep20 -0x1.a9d98034c5d39p20 0x0.0p0 -0x1.7dcfe5d3a9dp6 0x1.3dbbbbbab0207p5 0x0.0p0 F +REG epsg:7620 2 OK 0x1.1bfd2ba72b19dp21 -0x1.a9d98034c5d39p20 0x0.0p0 -0x1.45856f81ab856p6 0x1.3dbbbbbab0207p5 0x0.0p0 F +REG epsg:7620 3 OK -0x1.41d24d9cb1ca4p20 0x1.d056ec68554afp20 0x0.0p0 -0x1.7dcfe5d2cadc4p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:7620 4 OK 0x1.eac44dbd76662p20 0x1.d056ec68554afp20 0x0.0p0 -0x1.45856f828a791p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:7621 0 OK 0x1.47a3000000004p19 0x1.86a311cac0838p18 0x0.0p0 -0x1.6a91111111112p6 0x1.600026c287bb7p5 0x0.0p0 F +REG epsg:7621 1 OK -0x1.3fb57337e86a6p20 -0x1.4753dcd78f242p20 0x0.0p0 -0x1.865eb68f209b9p6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:7621 2 OK 0x1.43ac399bf435cp21 -0x1.4753dcd78f242p20 0x0.0p0 -0x1.4ec36b930186bp6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:7621 3 OK -0x1.e965091740c2cp19 0x1.1855d7dfbc9dap21 0x0.0p0 -0x1.865eb68f209b9p6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:7621 4 OK 0x1.1e2ac245d0314p21 0x1.1855d7dfbc9dap21 0x0.0p0 -0x1.4ec36b930186bp6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:7622 0 OK 0x1.24f8003126e9bp19 0x1.6872b020c49bep-7 0x0.0p0 -0x1.5fa2222222224p6 0x1.632d82d82d82dp5 0x0.0p0 F +REG epsg:7622 1 OK -0x1.5096da0382c56p20 -0x1.aa115562e453ep20 0x0.0p0 -0x1.7b9feada051ccp6 0x1.3b2d82d72ef93p5 0x0.0p0 F +REG epsg:7622 2 OK 0x1.3ac76d1a54d8p21 -0x1.aa115562e453dp20 0x0.0p0 -0x1.43a4596a3f27ap6 0x1.3b2d82d72ef92p5 0x0.0p0 F +REG epsg:7622 3 OK -0x1.043ccf47bf4aap20 0x1.d022627926d6ep20 0x0.0p0 -0x1.7b9fead9306fap6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:7622 4 OK 0x1.149a67bc731a8p21 0x1.d022627926d6fp20 0x0.0p0 -0x1.43a4596b13d4cp6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:7623 0 OK 0x1.c138000000005p17 0x1.71045f3b645a6p17 0x0.0p0 -0x1.662d82d82d82dp6 0x1.6da240127344dp5 0x0.0p0 F +REG epsg:7623 1 OK -0x1.adab3731d9d1fp20 -0x1.79a62dd40e781p20 0x0.0p0 -0x1.82d0f2681f152p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:7623 2 OK 0x1.0efc9b98ece98p21 -0x1.79a62dd40e781p20 0x0.0p0 -0x1.498a13483bf08p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:7623 3 OK -0x1.5e0b9289cc454p20 0x1.fe3cb94b150cep20 0x0.0p0 -0x1.82d0f2681f152p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:7623 4 OK 0x1.ce599289cc462p20 0x1.fe3cb94b150cep20 0x0.0p0 -0x1.498a13483bf08p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:7624 0 OK 0x1.0c8e000000004p19 0x1.13a50e353f7d2p18 0x0.0p0 -0x1.70e93e93e93e9p6 0x1.6516d538431b3p5 0x0.0p0 F +REG epsg:7624 1 OK -0x1.5e15459c10981p20 -0x1.63a09c5818c62p20 0x0.0p0 -0x1.8d04788047198p6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:7624 2 OK 0x1.3551a2ce084cbp21 -0x1.63a09c5818c62p20 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:7624 3 OK -0x1.11621496ee39fp20 0x1.0a28f21c7fc1fp21 0x0.0p0 -0x1.8d04788047198p6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:7624 4 OK 0x1.0ef80a4b771d8p21 0x1.0a28f21c7fc1fp21 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:7625 0 OK 0x1.c619ffbe76c91p18 0x1.374bc6a7ef9dep-6 0x0.0p0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 0x0.0p0 F +REG epsg:7625 1 OK -0x1.71e8b265b44dep20 -0x1.a9e448a23cdf8p20 0x0.0p0 -0x1.8ea6db5813a72p6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:7625 2 OK 0x1.2a7ad92277d93p21 -0x1.a9e448a23cdf8p20 0x0.0p0 -0x1.566a35b8fd6ap6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:7625 3 OK -0x1.24d8e8d1a8129p20 0x1.d04ede005b495p20 0x0.0p0 -0x1.8ea6db5736856p6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:7625 4 OK 0x1.03f2f45871bb9p21 0x1.d04ede005b495p20 0x0.0p0 -0x1.566a35b9da8bcp6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:7626 0 OK 0x1.6954000000004p17 0x1.40893ae147ae4p17 0x0.0p0 -0x1.66p6 0x1.6355a7cef00d3p5 0x0.0p0 F +REG epsg:7626 1 OK -0x1.b6e7dd488ecep20 -0x1.80a0c5787fe0cp20 0x0.0p0 -0x1.82002f8de16p6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:7626 2 OK 0x1.089e6ea447679p21 -0x1.80a0c5787fe0cp20 0x0.0p0 -0x1.49ffd0721eap6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:7626 3 OK -0x1.6acac169d87bp20 0x1.f756ae2aad9ccp20 0x0.0p0 -0x1.82002f8de16p6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:7626 4 OK 0x1.c51fc169d87bcp20 0x1.f756ae2aad9ccp20 0x0.0p0 -0x1.49ffd0721eap6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:7627 0 OK 0x1.6d3bffd70a3dbp19 0x1.26e978d4fdf3ep-5 0x0.0p0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 0x0.0p0 F +REG epsg:7627 1 OK -0x1.2cafcf1efe228p20 -0x1.a9f994309b935p20 0x0.0p0 -0x1.8605e05127959p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:7627 2 OK 0x1.4cf5e77b042fap21 -0x1.a9f994309b936p20 0x0.0p0 -0x1.4de35e42c1a92p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:7627 3 OK -0x1.bfd0ad72ab0d3p19 0x1.d0408b46ed888p20 0x0.0p0 -0x1.8605e0504ddf4p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:7627 4 OK 0x1.26922b482fe1cp21 0x1.d0408b46ed887p20 0x0.0p0 -0x1.4de35e439b5f6p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:7628 0 OK 0x1.4438000000002p19 0x1.ae256b3333337p18 0x0.0p0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5853p5 0x0.0p0 F +REG epsg:7628 1 OK -0x1.408abbf4c3bc4p20 -0x1.3de8bee6cb8b9p20 0x0.0p0 -0x1.8536a29c21962p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:7628 2 OK 0x1.42615dfa61de3p21 -0x1.3de8bee6cb8b9p20 0x0.0p0 -0x1.4e3b24805031p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:7628 3 OK -0x1.ee9529420df82p19 0x1.1d0ff960e10c5p21 0x0.0p0 -0x1.8536a29c21962p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:7628 4 OK 0x1.1dc14a50837e2p21 0x1.1d0ff960e10c5p21 0x0.0p0 -0x1.4e3b24805031p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:7629 0 OK 0x1.d4c0000000005p18 0x1.6872b020c49bep-6 0x0.0p0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 0x0.0p0 F +REG epsg:7629 1 OK -0x1.6ac37a88ebe91p20 -0x1.abb0da452000cp20 0x0.0p0 -0x1.7f2d96ac7178ep6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:7629 2 OK 0x1.2a91bd4475f4ap21 -0x1.abb0da452000cp20 0x0.0p0 -0x1.4966529222706p6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:7629 3 OK -0x1.24b4dbb5a5829p20 0x1.cea7b442343e4p20 0x0.0p0 -0x1.7f2d96abde7c9p6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:7629 4 OK 0x1.078a6ddad2c16p21 0x1.cea7b442343e4p20 0x0.0p0 -0x1.49665292b56ccp6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:7630 0 OK 0x1.915e000831274p19 0x1.3b645a1cac087p-4 0x0.0p0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 0x0.0p0 F +REG epsg:7630 1 OK -0x1.19c637dc1e43dp20 -0x1.aa6840d7b5e6bp20 0x0.0p0 -0x1.880842b7d2355p6 0x1.375b05af6ee02p5 0x0.0p0 F +REG epsg:7630 2 OK 0x1.55921bf227b5p21 -0x1.aa6840d7b5e6cp20 0x0.0p0 -0x1.508045d0b6534p6 0x1.375b05af6ee01p5 0x0.0p0 F +REG epsg:7630 3 OK -0x1.9d5fd4aa8b666p19 0x1.cfd9d1974b6e1p20 0x0.0p0 -0x1.880842b70c12bp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:7630 4 OK 0x1.3006f52ebb6cdp21 0x1.cfd9d1974b6dfp20 0x0.0p0 -0x1.508045d17c75dp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:7631 0 OK 0x1.295d000831272p19 0x1.16872b020c49fp-6 0x0.0p0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 0x0.0p0 F +REG epsg:7631 1 OK -0x1.4c5c10572acd1p20 -0x1.ab2234f0987dep20 0x0.0p0 -0x1.82ddd6c83504ap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:7631 2 OK 0x1.3adc882fadfa2p21 -0x1.ab2234f0987dep20 0x0.0p0 -0x1.4c555c6afe2eap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:7631 3 OK -0x1.041d2bb90d17ep20 0x1.cf2d48639fc27p20 0x0.0p0 -0x1.82ddd6c78cfe2p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:7631 4 OK 0x1.16bd15e09f1f8p21 0x1.cf2d48639fc27p20 0x0.0p0 -0x1.4c555c6ba6352p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:7632 0 OK 0x1.5b2b000831274p19 0x1.82d32ab020c4cp18 0x0.0p0 -0x1.6c77777777777p6 0x1.6f33672c63c8ap5 0x0.0p0 F +REG epsg:7632 1 OK -0x1.388098bea5b31p20 -0x1.46eb3ae06f96cp20 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.4733672c63c7dp5 0x0.0p0 F +REG epsg:7632 2 OK 0x1.49d5cc636b6cap21 -0x1.46eb3ae06f96cp20 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c7fp5 0x0.0p0 F +REG epsg:7632 3 OK -0x1.d0a9e9c8003acp19 0x1.18782af95842cp21 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:7632 4 OK 0x1.21bffa7618a1ep21 0x1.18782af95842cp21 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:7633 0 OK 0x1.a469000831275p19 0x1.fbe76c8b4395ep-6 0x0.0p0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:7633 1 OK -0x1.10659bb62892ap20 -0x1.aa51f976fe00bp20 0x0.0p0 -0x1.7e3e10038ea3cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7633 2 OK 0x1.5a674ddf2cddp21 -0x1.aa51f976fe00bp20 0x0.0p0 -0x1.469a1d7f4989cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7633 3 OK -0x1.8a01e587c6dafp19 0x1.cfea23937eb12p20 0x0.0p0 -0x1.7e3e1002c50aap6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7633 4 OK 0x1.34b4f9660a4a6p21 0x1.cfea23937eb12p20 0x0.0p0 -0x1.469a1d801322ep6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7634 0 OK 0x1.0922ffe76c8b7p19 0x1.16872b020c49dp-5 0x0.0p0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:7634 1 OK -0x1.5e095aaf305c4p20 -0x1.aa52a20fbfdfbp20 0x0.0p0 -0x1.8e5a81caab159p6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:7634 2 OK 0x1.33962d4b4e735p21 -0x1.aa52a20fbfdfcp20 0x0.0p0 -0x1.56b68f4665fbap6 0x1.3849f49e5971p5 0x0.0p0 F +REG epsg:7634 3 OK -0x1.12a493e9eba54p20 0x1.cfeadb23f9a88p20 0x0.0p0 -0x1.8e5a81c9e17c7p6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7634 4 OK 0x1.0de3c9e8ac17fp21 0x1.cfeadb23f9a87p20 0x0.0p0 -0x1.56b68f472f94cp6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:7635 0 OK 0x1.2bce000000004p19 0x1.5936c8b439585p18 0x0.0p0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc59483p5 0x0.0p0 F +REG epsg:7635 1 OK -0x1.4f32242b459d3p20 -0x1.51db25bcc06cap20 0x0.0p0 -0x1.864e48bbb4894p6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:7635 2 OK 0x1.3d801215a2cecp21 -0x1.51db25bcc06cap20 0x0.0p0 -0x1.4d8f95222954ap6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:7635 3 OK -0x1.0106bc2567146p20 0x1.1308d3d7cc8dep21 0x0.0p0 -0x1.864e48bbb4894p6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:7635 4 OK 0x1.166a5e12b38a5p21 0x1.1308d3d7cc8dep21 0x0.0p0 -0x1.4d8f95222954ap6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:7636 0 OK 0x1.9b9f000000005p19 0x1.a9fbe76c8b43dp-7 0x0.0p0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 0x0.0p0 F +REG epsg:7636 1 OK -0x1.13a9c1b326438p20 -0x1.aae8d1497ac1ap20 0x0.0p0 -0x1.88e29dc63dbcdp6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:7636 2 OK 0x1.57a460d993226p21 -0x1.aae8d1497ac19p20 0x0.0p0 -0x1.520c5128b132p6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:7636 3 OK -0x1.9517a855d47dbp19 0x1.cf61d334e211fp20 0x0.0p0 -0x1.88e29dc58cd3cp6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:7636 4 OK 0x1.33156a15752p21 0x1.cf61d334e212p20 0x0.0p0 -0x1.520c5129621b2p6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:7637 0 OK 0x1.6472000000004p19 0x1.3094624dd2f1ep17 0x0.0p0 -0x1.6b22222222223p6 0x1.5c99aadeb1d59p5 0x0.0p0 F +REG epsg:7637 1 OK -0x1.30c0e93d8d6bbp20 -0x1.8334429088efbp20 0x0.0p0 -0x1.86bd58a47e612p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:7637 2 OK 0x1.4a99749ec6b67p21 -0x1.8334429088efbp20 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:7637 3 OK -0x1.cdb3adc6dc264p19 0x1.f4d177483417bp20 0x0.0p0 -0x1.86bd58a47e612p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:7637 4 OK 0x1.25a5eb71b70a2p21 0x1.f4d177483417bp20 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:7638 0 OK 0x1.aeaa000000007p18 0x1.428dd53f7ceddp17 0x0.0p0 -0x1.65f49f49f49f6p6 0x1.709f6cb8f8fb5p5 0x0.0p0 F +REG epsg:7638 1 OK -0x1.7aacd42019f03p20 -0x1.7f2db2a61752p20 0x0.0p0 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fa8p5 0x0.0p0 F +REG epsg:7638 2 OK 0x1.2900ea100cf8bp21 -0x1.7f2db2a61752p20 0x0.0p0 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fa7p5 0x0.0p0 F +REG epsg:7638 3 OK -0x1.2a00c2a4e7d96p20 0x1.f8acf557d772ep20 0x0.0p0 -0x1.82c98af483fbdp6 0x1.989f6cb8f8a9ep5 0x0.0p0 F +REG epsg:7638 4 OK 0x1.00aae15273ed3p21 0x1.f8acf557d772ep20 0x0.0p0 -0x1.491fb39f6542dp6 0x1.989f6cb8f8a9dp5 0x0.0p0 F +REG epsg:7639 0 OK 0x1.748f000000003p19 0x1.63eb7c5a1cac4p18 0x0.0p0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24cap5 0x0.0p0 F +REG epsg:7639 1 OK -0x1.278c4a1f90704p20 -0x1.50e5cc63433f5p20 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:7639 2 OK 0x1.4e0da50fc838ap21 -0x1.50e5cc63433f5p20 0x0.0p0 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:7639 3 OK -0x1.bfe9b6f85c453p19 0x1.13959deb60c24p21 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:7639 4 OK 0x1.2a41edbe1711cp21 0x1.13959deb60c24p21 0x0.0p0 -0x1.46f74b6659832p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:7640 0 OK 0x1.7700000000003p19 0x1.2dbea62d0e564p19 0x0.0p0 -0x1.6f22222222222p6 0x1.6fb094062376cp5 0x0.0p0 F +REG epsg:7640 1 OK -0x1.2aaa97cc69254p20 -0x1.10b3df5c16332p20 0x0.0p0 -0x1.8be7808f8d268p6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:7640 2 OK 0x1.50d54be634923p21 -0x1.10b3df5c16332p20 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:7640 3 OK -0x1.b4a66460f8c9bp19 0x1.3391f8bfb4224p21 0x0.0p0 -0x1.8be7808f8d268p6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:7640 4 OK 0x1.28a999183e321p21 0x1.3391f8bfb4224p21 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:7641 0 OK 0x1.80c4004189379p18 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 0x0.0p0 F +REG epsg:7641 1 OK -0x1.80f96f2a7d12fp20 -0x1.ab11c3adb4ec5p20 0x0.0p0 -0x1.7b90d2587c97cp6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:7641 2 OK 0x1.20adb7a5a0d7ep21 -0x1.ab11c3adb4ec4p20 0x0.0p0 -0x1.44f205d506406p6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:7641 3 OK -0x1.387a6aaf65517p20 0x1.cf3c728f643fap20 0x0.0p0 -0x1.7b90d257d20b3p6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:7641 4 OK 0x1.f8dc6ad029ee1p20 0x1.cf3c728f643fbp20 0x0.0p0 -0x1.44f205d5b0ccep6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:7642 0 OK 0x1.4e79000831274p19 0x1.6872b020c49bep-7 0x0.0p0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 0x0.0p0 F +REG epsg:7642 1 OK -0x1.397d5ab091e6bp20 -0x1.ab4b4ae48537dp20 0x0.0p0 -0x1.7c0e988dd845dp6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:7642 2 OK 0x1.43fb2d5c6187p21 -0x1.ab4b4ae48537dp20 0x0.0p0 -0x1.45be343ef486fp6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:7642 3 OK -0x1.e3c0571d5c17ap19 0x1.cf06a7126791ep20 0x0.0p0 -0x1.7c0e988d36808p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:7642 4 OK 0x1.202c95cb6f998p21 0x1.cf06a7126791ep20 0x0.0p0 -0x1.45be343f964c4p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:7643 0 OK 0x1.286300189375p19 0x1.78d4fdf3b645ep-6 0x0.0p0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 0x0.0p0 F +REG epsg:7643 1 OK -0x1.4d9c484d931c5p20 -0x1.aabc89e7aeaddp20 0x0.0p0 -0x1.7ecd63d5f17b8p6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:7643 2 OK 0x1.3affa4331348ap21 -0x1.aabc89e7aeaddp20 0x0.0p0 -0x1.47bb24b2970dp6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:7643 3 OK -0x1.03d38aad3fa4ap20 0x1.cf89bab4daa93p20 0x0.0p0 -0x1.7ecd63d5398f4p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:7643 4 OK 0x1.161b4562e98cdp21 0x1.cf89bab4daa93p20 0x0.0p0 -0x1.47bb24b34ef93p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:7644 0 OK 0x1.80c4000000006p18 0x1.20cd2ef9db23p17 0x0.0p0 -0x1.64f7777777778p6 0x1.60e95b7ef36cp5 0x0.0p0 F +REG epsg:7644 1 OK -0x1.837b7431606f2p20 -0x1.84ce5908903fap20 0x0.0p0 -0x1.80d2d057ececp6 0x1.38e95b7ef36b3p5 0x0.0p0 F +REG epsg:7644 2 OK 0x1.21eeba18b0373p21 -0x1.84ce59089040ep20 0x0.0p0 -0x1.491c1e970203p6 0x1.38e95b7ef36b1p5 0x0.0p0 F +REG epsg:7644 3 OK -0x1.382be0ffdd4dcp20 0x1.f32e51167dad9p20 0x0.0p0 -0x1.80d2d057ececp6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:7644 4 OK 0x1.f88de0ffdd4d4p20 0x1.f32e51167dacfp20 0x0.0p0 -0x1.491c1e970203p6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:7645 0 OK 0x1.4dfc000831274p19 0x1.af37a34395812p18 0x0.0p0 -0x1.68p6 0x1.62e698741787cp5 0x0.0p0 F +REG epsg:7645 1 OK -0x1.3d0254d615056p20 -0x1.3cee000e08844p20 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:7645 2 OK 0x1.457f2a6f2315dp21 -0x1.3cee000e08844p20 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:7645 3 OK -0x1.e21443e3a60ecp19 0x1.1d857804db046p21 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:7645 4 OK 0x1.1f8310fd0216ep21 0x1.1d857804db046p21 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:7656 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7656 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7656 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7656 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7656 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7658 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7658 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7658 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7658 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7658 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7660 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7660 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7660 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7660 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7660 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7662 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7662 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7662 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7662 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7662 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7664 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7664 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7664 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7664 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7664 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7677 0 OK 0x1.854a6p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7677 1 OK 0x1.8257df559e00ep22 -0x1.0e67bdac51b3ap19 -0x1.0d9efc31ec71ep19 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:7677 2 OK 0x1.8257df559e00ep22 0x1.0e67bdac51b3ap19 -0x1.0d9efc31ec71ep19 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:7677 3 OK 0x1.8257df559e00ep22 -0x1.0e67bdac51b3ap19 0x1.0d9efc31ec71ep19 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:7677 4 OK 0x1.8257df559e00ep22 0x1.0e67bdac51b3ap19 0x1.0d9efc31ec71ep19 0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:7679 0 OK 0x1.854a6p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7679 1 OK 0x1.8257df559e00ep22 -0x1.0e67bdac51b3ap19 -0x1.0d9efc31ec71ep19 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:7679 2 OK 0x1.8257df559e00ep22 0x1.0e67bdac51b3ap19 -0x1.0d9efc31ec71ep19 0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG epsg:7679 3 OK 0x1.8257df559e00ep22 -0x1.0e67bdac51b3ap19 0x1.0d9efc31ec71ep19 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:7679 4 OK 0x1.8257df559e00ep22 0x1.0e67bdac51b3ap19 0x1.0d9efc31ec71ep19 0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG epsg:7681 0 OK 0x1.854a62p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7681 1 OK 0x1.8257e15286cd9p22 -0x1.0e67bf1082723p19 -0x1.0d9efd03c080ep19 -0x1.4p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:7681 2 OK 0x1.8257e15286cd9p22 0x1.0e67bf1082723p19 -0x1.0d9efd03c080ep19 0x1.4p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:7681 3 OK 0x1.8257e15286cd9p22 -0x1.0e67bf1082723p19 0x1.0d9efd03c080ep19 -0x1.4p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:7681 4 OK 0x1.8257e15286cd9p22 0x1.0e67bf1082723p19 0x1.0d9efd03c080ep19 0x1.4p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:7683 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7683 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7683 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7683 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7683 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7684 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7684 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7684 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7684 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7684 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7686 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7686 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7686 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7686 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7686 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7692 0 OK 0x1.3d62p20 0x1.ccbcp13 0x0.0p0 0x1.1211111111111p6 0x0.0p0 0x0.0p0 T +REG epsg:7692 1 OK 0x1.6baceca106843p19 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.fc2222225cc26p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7692 2 OK 0x1.c4ed89af7cbe4p20 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.26111110f3c0fp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7692 3 OK 0x1.6baceca106843p19 0x1.16320b76c5da4p19 0x0.0p0 0x1.fc2222225cc26p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7692 4 OK 0x1.c4ed89af7cbe4p20 0x1.16320b76c5da4p19 0x0.0p0 0x1.26111110f3c0fp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7693 0 OK 0x1.18c3p21 0x1.ccbcp13 0x0.0p0 0x1.1e11111111111p6 0x0.0p0 0x0.0p0 T +REG epsg:7693 1 OK 0x1.a9fa765083422p20 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.0a1111112e613p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7693 2 OK 0x1.5c88c4d7be5efp21 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.32111110f3c0fp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7693 3 OK 0x1.a9fa765083422p20 0x1.16320b76c5da4p19 0x0.0p0 0x1.0a1111112e613p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7693 4 OK 0x1.5c88c4d7be5efp21 0x1.16320b76c5da4p19 0x0.0p0 0x1.32111110f3c0fp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7694 0 OK 0x1.92d5p21 0x1.ccbcp13 0x0.0p0 0x1.2a11111111111p6 0x0.0p0 0x0.0p0 T +REG epsg:7694 1 OK 0x1.4f0f3b2841a0ep21 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.161111112e613p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7694 2 OK 0x1.d69ac4d7be5efp21 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.3e111110f3c0fp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7694 3 OK 0x1.4f0f3b2841a0ep21 0x1.16320b76c5da4p19 0x0.0p0 0x1.161111112e613p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7694 4 OK 0x1.d69ac4d7be5efp21 0x1.16320b76c5da4p19 0x0.0p0 0x1.3e111110f3c0fp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7695 0 OK 0x1.06738p22 0x1.ccbcp13 0x0.0p0 0x1.3611111111111p6 0x0.0p0 0x0.0p0 T +REG epsg:7695 1 OK 0x1.c9213b2841a11p21 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.221111112e613p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7695 2 OK 0x1.2856626bdf2f9p22 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.4a111110f3c0fp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7695 3 OK 0x1.c9213b2841a11p21 0x1.16320b76c5da4p19 0x0.0p0 0x1.221111112e613p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7695 4 OK 0x1.2856626bdf2f9p22 0x1.16320b76c5da4p19 0x0.0p0 0x1.4a111110f3c0fp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7696 0 OK 0x1.437c8p22 0x1.ccbcp13 0x0.0p0 0x1.4211111111111p6 0x0.0p0 0x0.0p0 T +REG epsg:7696 1 OK 0x1.21999d9420d08p22 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.2e1111112e613p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7696 2 OK 0x1.655f626bdf2f8p22 -0x1.07cc2b76c5da4p19 0x0.0p0 0x1.56111110f3c0fp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7696 3 OK 0x1.21999d9420d08p22 0x1.16320b76c5da4p19 0x0.0p0 0x1.2e1111112e613p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7696 4 OK 0x1.655f626bdf2f8p22 0x1.16320b76c5da4p19 0x0.0p0 0x1.56111110f3c0fp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7755 0 OK 0x1.e848p21 0x1.e5eee45e90f1fp21 0x0.0p0 0x1.4p6 0x1.7d2a83ed77b89p4 0x0.0p0 F +REG epsg:7755 1 OK 0x1.096b2b3cbee4p21 0x1.29ea33efd00a8p21 0x0.0p0 0x1.fcd2d519bd2f9p5 0x1.1a5507daef75bp3 0x0.0p0 F +REG epsg:7755 2 OK 0x1.63926a61a08e2p22 0x1.29ea33efd00a8p21 0x0.0p0 0x1.8196957321685p6 0x1.1a5507daef75bp3 0x0.0p0 F +REG epsg:7755 3 OK 0x1.3823cce8019a4p21 0x1.5cc7dd44f0da5p22 0x0.0p0 0x1.fcd2d519bd2f9p5 0x1.369541f6bbe1ap5 0x0.0p0 F +REG epsg:7755 4 OK 0x1.4c36198bff32fp22 0x1.5cc7dd44f0da5p22 0x0.0p0 0x1.8196957321684p6 0x1.369541f6bbe1ap5 0x0.0p0 F +REG epsg:7756 0 OK 0x1.e848p19 0x1.e7fceb233b57ep19 0x0.0p0 0x1.4380000000001p6 0x1.03fffffffffp4 0x0.0p0 F +REG epsg:7756 1 OK 0x1.a3b13eba56a5p18 0x1.baab47a3890e2p18 0x0.0p0 0x1.2eaaf19126ed8p6 0x1.67ffffffffe36p3 0x0.0p0 F +REG epsg:7756 2 OK 0x1.7f5bb0516a566p20 0x1.baab47a3890e2p18 0x0.0p0 0x1.58550e6ed9128p6 0x1.67ffffffffe36p3 0x0.0p0 F +REG epsg:7756 3 OK 0x1.bf321129dc0bcp18 0x1.7cd720201b969p20 0x0.0p0 0x1.2eaaf19126ed8p6 0x1.53fffffffff0dp4 0x0.0p0 F +REG epsg:7756 4 OK 0x1.787b7bb588fccp20 0x1.7cd720201b969p20 0x0.0p0 0x1.58550e6ed9128p6 0x1.53fffffffff0dp4 0x0.0p0 F +REG epsg:7757 0 OK 0x1.e848p19 0x1.e83221780a06ep19 0x0.0p0 0x1.7ap6 0x1.bffffffffff51p4 0x0.0p0 F +REG epsg:7757 1 OK 0x1.79813c70b85e2p19 0x1.7d030a4ad05cep19 0x0.0p0 0x1.70f07f1cfee46p6 0x1.9ffffffffff3bp4 0x0.0p0 F +REG epsg:7757 2 OK 0x1.2b8761c7a3d15p20 0x1.7d030a4ad05cep19 0x0.0p0 0x1.830f80e3011bap6 0x1.9ffffffffff3bp4 0x0.0p0 F +REG epsg:7757 3 OK 0x1.7d85b2b6dc13ep19 0x1.2ab71316e8e28p20 0x0.0p0 0x1.70f07f1cfee46p6 0x1.dffffffffff67p4 0x0.0p0 F +REG epsg:7757 4 OK 0x1.298526a491f66p20 0x1.2ab71316e8e28p20 0x0.0p0 0x1.830f80e3011bap6 0x1.dffffffffff67p4 0x0.0p0 F +REG epsg:7758 0 OK 0x1.e848p19 0x1.e8245254d1dcp19 0x0.0p0 0x1.73p6 0x1.9ffffffffff33p4 0x0.0p0 F +REG epsg:7758 1 OK 0x1.54049226514dap19 0x1.5995340ec1c8ep19 0x0.0p0 0x1.6721dadf2cb98p6 0x1.7555555555483p4 0x0.0p0 F +REG epsg:7758 2 OK 0x1.3e45b6ecd758dp20 0x1.5995340ec1c8ep19 0x0.0p0 0x1.7ede2520d3468p6 0x1.7555555555483p4 0x0.0p0 F +REG epsg:7758 3 OK 0x1.5a9156d56c938p19 0x1.3d05e6da73d43p20 0x0.0p0 0x1.6721dadf2cb98p6 0x1.caaaaaaaaaa01p4 0x0.0p0 F +REG epsg:7758 4 OK 0x1.3aff549549b5ep20 0x1.3d05e6da73d43p20 0x0.0p0 0x1.7ede2520d3468p6 0x1.caaaaaaaaaa01p4 0x0.0p0 F +REG epsg:7759 0 OK 0x1.e848p19 0x1.e828d088cfc61p19 0x0.0p0 0x1.578p6 0x1.9dfffffffff3dp4 0x0.0p0 F +REG epsg:7759 1 OK 0x1.5d7ca9432fe0ap19 0x1.62675035c5ec2p19 0x0.0p0 0x1.4c62c2815abcdp6 0x1.75fffffffff1dp4 0x0.0p0 F +REG epsg:7759 2 OK 0x1.3989ab5e680fbp20 0x1.62675035c5ec2p19 0x0.0p0 0x1.629d3d7ea5433p6 0x1.75fffffffff1dp4 0x0.0p0 F +REG epsg:7759 3 OK 0x1.63363099f4881p19 0x1.386b6cbec719ap20 0x0.0p0 0x1.4c62c2815abcdp6 0x1.c5fffffffff55p4 0x0.0p0 F +REG epsg:7759 4 OK 0x1.36ace7b305bcp20 0x1.386b6cbec719ap20 0x0.0p0 0x1.629d3d7ea5433p6 0x1.c5fffffffff55p4 0x0.0p0 F +REG epsg:7760 0 OK 0x1.e848p19 0x1.e84698e148e35p19 0x0.0p0 0x1.34p6 0x1.c9fffffffff54p4 0x0.0p0 F +REG epsg:7760 1 OK 0x1.b15ebe495b797p19 0x1.b26c4c4b627f8p19 0x0.0p0 0x1.2f7169a8c59eap6 0x1.b9fffffffff49p4 0x0.0p0 F +REG epsg:7760 2 OK 0x1.0f98a0db52434p20 0x1.b26c4c4b627f8p19 0x0.0p0 0x1.388e96573a616p6 0x1.b9fffffffff49p4 0x0.0p0 F +REG epsg:7760 3 OK 0x1.b266af2ab750bp19 0x1.0f53cc126a164p20 0x0.0p0 0x1.2f7169a8c59eap6 0x1.d9fffffffff63p4 0x0.0p0 F +REG epsg:7760 4 OK 0x1.0f14a86aa457ap20 0x1.0f53cc126a164p20 0x0.0p0 0x1.388e96573a616p6 0x1.d9fffffffff63p4 0x0.0p0 F +REG epsg:7761 0 OK 0x1.e848p19 0x1.e81d8132fda6cp19 0x0.0p0 0x1.1d8p6 0x1.65fffffffff16p4 0x0.0p0 F +REG epsg:7761 1 OK 0x1.3841ecb9472d1p19 0x1.3ee838ae898dap19 0x0.0p0 0x1.0fcd52ccb0e41p6 0x1.3355555555455p4 0x0.0p0 F +REG epsg:7761 2 OK 0x1.4c2709a35c69ep20 0x1.3ee838ae898dap19 0x0.0p0 0x1.2b32ad334f1bfp6 0x1.3355555555455p4 0x0.0p0 F +REG epsg:7761 3 OK 0x1.400cd6d874552p19 0x1.4aa763aaefccp20 0x0.0p0 0x1.0fcd52ccb0e41p6 0x1.98aaaaaaaa9e1p4 0x0.0p0 F +REG epsg:7761 4 OK 0x1.48419493c5d5cp20 0x1.4aa763aaefccp20 0x0.0p0 0x1.2b32ad334f1bfp6 0x1.98aaaaaaaa9e1p4 0x0.0p0 F +REG epsg:7762 0 OK 0x1.e848p19 0x1.e828a8470c862p19 0x0.0p0 0x1.3p6 0x1.d3fffffffff5fp4 0x0.0p0 F +REG epsg:7762 1 OK 0x1.6682242181dbfp19 0x1.6b5e960739554p19 0x0.0p0 0x1.254d7f1d4f983p6 0x1.aeaaaaaaaa9eap4 0x0.0p0 F +REG epsg:7762 2 OK 0x1.3506edef3f12p20 0x1.6b5e960739554p19 0x0.0p0 0x1.3ab280e2b067dp6 0x1.aeaaaaaaaa9eap4 0x0.0p0 F +REG epsg:7762 3 OK 0x1.6c44d43a245d5p19 0x1.33f18223c9f25p20 0x0.0p0 0x1.254d7f1d4f983p6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:7762 4 OK 0x1.322595e2edd16p20 0x1.33f18223c9f25p20 0x0.0p0 0x1.3ab280e2b067dp6 0x1.f9555555554d4p4 0x0.0p0 F +REG epsg:7763 0 OK 0x1.e848p19 0x1.e82e9213435f2p19 0x0.0p0 0x1.358p6 0x1.fbfffffffff82p4 0x0.0p0 F +REG epsg:7763 1 OK 0x1.7927f9b77ac3ep19 0x1.7d1c27cb3db5ep19 0x0.0p0 0x1.2c179613c9c14p6 0x1.dbfffffffff68p4 0x0.0p0 F +REG epsg:7763 2 OK 0x1.2bb40324429e6p20 0x1.7d1c27cb3db5ep19 0x0.0p0 0x1.3ee869ec363edp6 0x1.dbfffffffff68p4 0x0.0p0 F +REG epsg:7763 3 OK 0x1.7dd595a8d8d8bp19 0x1.2ad1ac7fd03cap20 0x0.0p0 0x1.2c179613c9c14p6 0x1.0dfffffffffcap5 0x0.0p0 F +REG epsg:7763 4 OK 0x1.295d352b9394p20 0x1.2ad1ac7fd03cap20 0x0.0p0 0x1.3ee869ec363edp6 0x1.0dfffffffffcap5 0x0.0p0 F +REG epsg:7764 0 OK 0x1.e848p19 0x1.e7f8dec58daacp19 0x0.0p0 0x1.32p6 0x1.15fffffffffcfp5 0x0.0p0 F +REG epsg:7764 1 OK 0x1.2bbd757a5f27p19 0x1.373dea157e85ep19 0x0.0p0 0x1.21c5bdf63f5c3p6 0x1.f6aaaaaaaaa2ap4 0x0.0p0 F +REG epsg:7764 2 OK 0x1.52694542d06c8p20 0x1.373dea157e85ep19 0x0.0p0 0x1.423a4209c0a3dp6 0x1.f6aaaaaaaaa2ap4 0x0.0p0 F +REG epsg:7764 3 OK 0x1.3a5099fe9ebfep19 0x1.500f54166b8dfp20 0x0.0p0 0x1.21c5bdf63f5c3p6 0x1.30aaaaaaaaa8bp5 0x0.0p0 F +REG epsg:7764 4 OK 0x1.4b1fb300b0a01p20 0x1.500f54166b8dfp20 0x0.0p0 0x1.423a4209c0a3dp6 0x1.30aaaaaaaaa8bp5 0x0.0p0 F +REG epsg:7765 0 OK 0x1.e848p19 0x1.e832ddc5cafp19 0x0.0p0 0x1.568p6 0x1.79fffffffff24p4 0x0.0p0 F +REG epsg:7765 1 OK 0x1.70895e2fa5a2p19 0x1.74072d762b676p19 0x0.0p0 0x1.4d0a5f290c435p6 0x1.5755555555463p4 0x0.0p0 F +REG epsg:7765 2 OK 0x1.300350e82d2eap20 0x1.74072d762b676p19 0x0.0p0 0x1.5ff5a0d6f3bcbp6 0x1.5755555555463p4 0x0.0p0 F +REG epsg:7765 3 OK 0x1.7469bf7015fcep19 0x1.2f2cebe6814dap20 0x0.0p0 0x1.4d0a5f290c435p6 0x1.9caaaaaaaa9e1p4 0x0.0p0 F +REG epsg:7765 4 OK 0x1.2e132047f5013p20 0x1.2f2cebe6814dap20 0x0.0p0 0x1.5ff5a0d6f3bcbp6 0x1.9caaaaaaaa9e1p4 0x0.0p0 F +REG epsg:7766 0 OK 0x1.e848p19 0x1.e7feb11e8ce3cp19 0x0.0p0 0x1.398p6 0x1.7ffffffffff24p4 0x0.0p0 F +REG epsg:7766 1 OK 0x1.082ec6c1e743ep19 0x1.132a3753ad2dp19 0x0.0p0 0x1.27fc5eab6cd27p6 0x1.3ffffffffff06p4 0x0.0p0 F +REG epsg:7766 2 OK 0x1.64309c9f0c5e7p20 0x1.132a3753ad2dp19 0x0.0p0 0x1.4b03a154932d9p6 0x1.3ffffffffff06p4 0x0.0p0 F +REG epsg:7766 3 OK 0x1.15a259c213f58p19 0x1.61d9474f211d4p20 0x0.0p0 0x1.27fc5eab6cd27p6 0x1.bffffffffff5cp4 0x0.0p0 F +REG epsg:7766 4 OK 0x1.5d76d31ef6059p20 0x1.61d9474f211d4p20 0x0.0p0 0x1.4b03a154932d9p6 0x1.bffffffffff5cp4 0x0.0p0 F +REG epsg:7767 0 OK 0x1.e848p19 0x1.e800b0c5af93ep19 0x0.0p0 0x1.33p6 0x1.2dfffffffff01p4 0x0.0p0 F +REG epsg:7767 1 OK 0x1.da90619960d0fp18 0x1.f04ceff24f6aep18 0x0.0p0 0x1.1ffa216e0c358p6 0x1.cbffffffffe09p3 0x0.0p0 F +REG epsg:7767 2 OK 0x1.71a3e799a7cbcp20 0x1.f04ceff24f6aep18 0x0.0p0 0x1.4605de91f3ca8p6 0x1.cbffffffffe09p3 0x0.0p0 F +REG epsg:7767 3 OK 0x1.f4b2bbac3157p18 0x1.6f4535e807251p20 0x0.0p0 0x1.1ffa216e0c358p6 0x1.75fffffffff1dp4 0x0.0p0 F +REG epsg:7767 4 OK 0x1.6b1b5114f3aa4p20 0x1.6f4535e807251p20 0x0.0p0 0x1.4605de91f3ca8p6 0x1.75fffffffff1dp4 0x0.0p0 F +REG epsg:7768 0 OK 0x1.e848p19 0x1.e83f9115eb0edp19 0x0.0p0 0x1.78p6 0x1.8bfffffffff26p4 0x0.0p0 F +REG epsg:7768 1 OK 0x1.9eff6af8c1164p19 0x1.a087e18f00dd6p19 0x0.0p0 0x1.722090e4bb27ep6 0x1.76aaaaaaaa9c6p4 0x0.0p0 F +REG epsg:7768 2 OK 0x1.18c84a839f749p20 0x1.a087e18f00dd6p19 0x0.0p0 0x1.7ddf6f1b44d82p6 0x1.76aaaaaaaa9c6p4 0x0.0p0 F +REG epsg:7768 3 OK 0x1.a08b8b0dcb492p19 0x1.1860d8108b2b5p20 0x0.0p0 0x1.722090e4bb27ep6 0x1.a15555555549p4 0x0.0p0 F +REG epsg:7768 4 OK 0x1.18023a791a5b2p20 0x1.1860d8108b2b5p20 0x0.0p0 0x1.7ddf6f1b44d82p6 0x1.a15555555549p4 0x0.0p0 F +REG epsg:7769 0 OK 0x1.e848p19 0x1.e84492bbd86eep19 0x0.0p0 0x1.6d8p6 0x1.99fffffffff36p4 0x0.0p0 F +REG epsg:7769 1 OK 0x1.b170f345e0cfap19 0x1.b268288cdb0efp19 0x0.0p0 0x1.69104bf1b763bp6 0x1.89fffffffff21p4 0x0.0p0 F +REG epsg:7769 2 OK 0x1.0f8f865d0f97dp20 0x1.b268288cdb0efp19 0x0.0p0 0x1.71efb40e489c5p6 0x1.89fffffffff21p4 0x0.0p0 F +REG epsg:7769 3 OK 0x1.b258cfa82f762p19 0x1.0f4bb8fbfef6bp20 0x0.0p0 0x1.69104bf1b763bp6 0x1.a9fffffffff42p4 0x0.0p0 F +REG epsg:7769 4 OK 0x1.0f1b982be8449p20 0x1.0f4bb8fbfef6bp20 0x0.0p0 0x1.71efb40e489c5p6 0x1.a9fffffffff42p4 0x0.0p0 F +REG epsg:7770 0 OK 0x1.e848p19 0x1.e83ca60abf6f5p19 0x0.0p0 0x1.7980000000001p6 0x1.a1fffffffff38p4 0x0.0p0 F +REG epsg:7770 1 OK 0x1.95a9b0e89a085p19 0x1.97a0df52cb77ep19 0x0.0p0 0x1.72d1380df77fp6 0x1.89fffffffff21p4 0x0.0p0 F +REG epsg:7770 2 OK 0x1.1d73278bb2fb8p20 0x1.97a0df52cb77ep19 0x0.0p0 0x1.802ec7f20881p6 0x1.89fffffffff21p4 0x0.0p0 F +REG epsg:7770 3 OK 0x1.97bf24e6e7b7ap19 0x1.1cf473aa6a69ep20 0x0.0p0 0x1.72d1380df77fp6 0x1.b9fffffffff46p4 0x0.0p0 F +REG epsg:7770 4 OK 0x1.1c686d8c8c23ep20 0x1.1cf473aa6a69ep20 0x0.0p0 0x1.802ec7f20881p6 0x1.b9fffffffff46p4 0x0.0p0 F +REG epsg:7771 0 OK 0x1.e848p19 0x1.e7c44898dbca6p19 0x0.0p0 0x1.76p6 0x1.99fffffffff36p4 0x0.0p0 F +REG epsg:7771 1 OK 0x1.871b0c85d2a66p18 0x1.ad3e646a1b18ep18 0x0.0p0 0x1.5f14330b88d86p6 0x1.4755555555463p4 0x0.0p0 F +REG epsg:7771 2 OK 0x1.86813cde8b566p20 0x1.ad3e646a1b18ep18 0x0.0p0 0x1.8cebccf47727ap6 0x1.4755555555463p4 0x0.0p0 F +REG epsg:7771 3 OK 0x1.b77a66b630e9p18 0x1.82a0f78c5eceep20 0x0.0p0 0x1.5f14330b88d86p6 0x1.ecaaaaaaaaa1cp4 0x0.0p0 F +REG epsg:7771 4 OK 0x1.7a69665273c5cp20 0x1.82a0f78c5eceep20 0x0.0p0 0x1.8cebccf47727ap6 0x1.ecaaaaaaaaa1cp4 0x0.0p0 F +REG epsg:7772 0 OK 0x1.e848p19 0x1.e81dc9560862p19 0x0.0p0 0x1.518p6 0x1.43fffffffff02p4 0x0.0p0 F +REG epsg:7772 1 OK 0x1.2f3f477ae9f45p19 0x1.35ec101d20b3ap19 0x0.0p0 0x1.4349cb4492dc6p6 0x1.0eaaaaaaaa9a2p4 0x0.0p0 F +REG epsg:7772 2 OK 0x1.50a85c428b058p20 0x1.35ec101d20b3ap19 0x0.0p0 0x1.5fb634bb6d23ap6 0x1.0eaaaaaaaa9a2p4 0x0.0p0 F +REG epsg:7772 3 OK 0x1.36fbca5f51911p19 0x1.4f2260502bd1ap20 0x0.0p0 0x1.4349cb4492dc6p6 0x1.7955555555474p4 0x0.0p0 F +REG epsg:7772 4 OK 0x1.4cca1ad057372p20 0x1.4f2260502bd1ap20 0x0.0p0 0x1.5fb634bb6d23ap6 0x1.7955555555474p4 0x0.0p0 F +REG epsg:7773 0 OK 0x1.e848p19 0x1.e82f4dd08e808p19 0x0.0p0 0x1.2d8p6 0x1.effffffffff79p4 0x0.0p0 F +REG epsg:7773 1 OK 0x1.793a607010186p19 0x1.7d16f5fd88b57p19 0x0.0p0 0x1.242abc1c044f7p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG epsg:7773 2 OK 0x1.2baacfc7f7f38p20 0x1.7d16f5fd88b57p19 0x0.0p0 0x1.36d543e3fbb09p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG epsg:7773 3 OK 0x1.7dc519b04f102p19 0x1.2acc3460b9af4p20 0x0.0p0 0x1.242abc1c044f7p6 0x1.07fffffffffc5p5 0x0.0p0 F +REG epsg:7773 4 OK 0x1.29657327d877ap20 0x1.2acc3460b9af4p20 0x0.0p0 0x1.36d543e3fbb09p6 0x1.07fffffffffc5p5 0x0.0p0 F +REG epsg:7774 0 OK 0x1.e848p19 0x1.e7bcdee08577ap19 0x0.0p0 0x1.278p6 0x1.adfffffffff44p4 0x0.0p0 F +REG epsg:7774 1 OK 0x1.85b9206c8ae02p18 0x1.add81ceeea1f2p18 0x0.0p0 0x1.1054b9a2e2133p6 0x1.5b55555555474p4 0x0.0p0 F +REG epsg:7774 2 OK 0x1.86d9b7e4dd485p20 0x1.add81ceeea1f2p18 0x0.0p0 0x1.3eab465d1decdp6 0x1.5b55555555474p4 0x0.0p0 F +REG epsg:7774 3 OK 0x1.b8d688db123eep18 0x1.82cbfd4892488p20 0x0.0p0 0x1.1054b9a2e2133p6 0x1.0055555555518p5 0x0.0p0 F +REG epsg:7774 4 OK 0x1.7a125dc93b70ap20 0x1.82cbfd4892488p20 0x0.0p0 0x1.3eab465d1decdp6 0x1.0055555555518p5 0x0.0p0 F +REG epsg:7775 0 OK 0x1.e848p19 0x1.e7dd514a945f5p19 0x0.0p0 0x1.4380000000001p6 0x1.b1fffffffff44p4 0x0.0p0 F +REG epsg:7775 1 OK 0x1.d3f124b8e650dp18 0x1.f30deaadba70dp18 0x0.0p0 0x1.2f468d95d58b7p6 0x1.69fffffffff15p4 0x0.0p0 F +REG epsg:7775 2 OK 0x1.734bb6d1c66b8p20 0x1.f30deaadba70dp18 0x0.0p0 0x1.57b9726a2a749p6 0x1.69fffffffff15p4 0x0.0p0 F +REG epsg:7775 3 OK 0x1.fb22a08f01a1fp18 0x1.7019d89a88046p20 0x0.0p0 0x1.2f468d95d58b7p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG epsg:7775 4 OK 0x1.697f57dc3f973p20 0x1.7019d89a88046p20 0x0.0p0 0x1.57b9726a2a749p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG epsg:7776 0 OK 0x1.e848p19 0x1.e83043b92417p19 0x0.0p0 0x1.3d8p6 0x1.dffffffffff67p4 0x0.0p0 F +REG epsg:7776 1 OK 0x1.7952783693768p19 0x1.7d102dfd935e3p19 0x0.0p0 0x1.34432c5d37e67p6 0x1.bffffffffff51p4 0x0.0p0 F +REG epsg:7776 2 OK 0x1.2b9ec3e4b644cp20 0x1.7d102dfd935e3p19 0x0.0p0 0x1.46bcd3a2c8199p6 0x1.bffffffffff51p4 0x0.0p0 F +REG epsg:7776 3 OK 0x1.7daf8887b8681p19 0x1.2ac507bd58f21p20 0x0.0p0 0x1.34432c5d37e67p6 0x1.fffffffffff7dp4 0x0.0p0 F +REG epsg:7776 4 OK 0x1.29703bbc23ccp20 0x1.2ac507bd58f21p20 0x0.0p0 0x1.46bcd3a2c8199p6 0x1.fffffffffff7dp4 0x0.0p0 F +REG epsg:7777 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.75p6 0x1.48p3 0x0.0p0 F +REG epsg:7777 1 OK 0x1.a9d0293c8f304p18 0x1.b6d12686bd0bp18 0x0.0p0 0x1.60acf691e7e4ep6 0x1.4fffffffe7688p2 0x0.0p0 F +REG epsg:7777 2 OK 0x1.7dd3f5b0dc345p20 0x1.b6d12686bd0bp18 0x0.0p0 0x1.8953096e181b3p6 0x1.4fffffffe7688p2 0x0.0p0 F +REG epsg:7777 3 OK 0x1.baf201b7a891ap18 0x1.7cbca8fba1a99p20 0x0.0p0 0x1.60acf691d124ep6 0x1.e7ffffffe3cefp3 0x0.0p0 F +REG epsg:7777 4 OK 0x1.798b7f9215dbfp20 0x1.7cbca8fba1a9ap20 0x0.0p0 0x1.8953096e2edb3p6 0x1.e7ffffffe3cefp3 0x0.0p0 F +REG epsg:7778 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.49p6 0x1.5p4 0x0.0p0 F +REG epsg:7778 1 OK 0x1.a025c8ae5b4bcp18 0x1.bb6cc936a088ep18 0x0.0p0 0x1.3393bcd586cd9p6 0x1.ffffffffd6cbap3 0x0.0p0 F +REG epsg:7778 2 OK 0x1.803e8dd4692d1p20 0x1.bb6cc936a088ep18 0x0.0p0 0x1.5e6c432a79327p6 0x1.ffffffffd6cbap3 0x0.0p0 F +REG epsg:7778 3 OK 0x1.c48a8ea13b98ap18 0x1.7e008978e725bp20 0x0.0p0 0x1.3393bcd56aff4p6 0x1.9fffffffda167p4 0x0.0p0 F +REG epsg:7778 4 OK 0x1.77255c57b119ep20 0x1.7e008978e725bp20 0x0.0p0 0x1.5e6c432a9500cp6 0x1.9fffffffda167p4 0x0.0p0 F +REG epsg:7779 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.28p6 0x1.ec00000000001p3 0x0.0p0 F +REG epsg:7779 1 OK 0x1.a54856e9bd8f6p18 0x1.b8ea75e835bfap18 0x0.0p0 0x1.1341f5bf54cf8p6 0x1.4bffffffe743ap3 0x0.0p0 F +REG epsg:7779 2 OK 0x1.7ef5ea45909c2p20 0x1.b8ea75e835bfap18 0x0.0p0 0x1.3cbe0a40ab308p6 0x1.4bffffffe743ap3 0x0.0p0 F +REG epsg:7779 3 OK 0x1.bf58228bad722p18 0x1.7d55b583925eap20 0x0.0p0 0x1.1341f5bf37f8cp6 0x1.45ffffffeb254p4 0x0.0p0 F +REG epsg:7779 4 OK 0x1.7871f75d14a38p20 0x1.7d55b583925eap20 0x0.0p0 0x1.3cbe0a40c8074p6 0x1.45ffffffeb254p4 0x0.0p0 F +REG epsg:7780 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.3180000000001p6 0x1.e4p3 0x0.0p0 F +REG epsg:7780 1 OK 0x1.a59cd8574dd04p18 0x1.b8e9a7acc83d6p18 0x0.0p0 0x1.1cc845ddc1377p6 0x1.43ffffffe7e3dp3 0x0.0p0 F +REG epsg:7780 2 OK 0x1.7ee0c9ea2c8bap20 0x1.b8e9a7acc83d6p18 0x0.0p0 0x1.4637ba223ec8ap6 0x1.43ffffffe7e3dp3 0x0.0p0 F +REG epsg:7780 3 OK 0x1.bf3988e1fa496p18 0x1.7d477589d4309p20 0x0.0p0 0x1.1cc845dda48abp6 0x1.41ffffffeb9a5p4 0x0.0p0 F +REG epsg:7780 4 OK 0x1.78799dc7816d5p20 0x1.7d477589d4309p20 0x0.0p0 0x1.4637ba225b755p6 0x1.41ffffffeb9a5p4 0x0.0p0 F +REG epsg:7781 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.3p6 0x1.5p3 0x0.0p0 F +REG epsg:7781 1 OK 0x1.a99c9180aa784p18 0x1.b6eee43818e9p18 0x0.0p0 0x1.1ba8ce1729ab8p6 0x1.5fffffffe636ap2 0x0.0p0 F +REG epsg:7781 2 OK 0x1.7de0db9fd5619p20 0x1.b6eee43818e9p18 0x0.0p0 0x1.445731e8d6547p6 0x1.5fffffffe636ap2 0x0.0p0 F +REG epsg:7781 3 OK 0x1.bb2bbc6ca5e8ep18 0x1.7cc2fc4262a96p20 0x0.0p0 0x1.1ba8ce171281bp6 0x1.efffffffe353ap3 0x0.0p0 F +REG epsg:7781 4 OK 0x1.797d10e4d6857p20 0x1.7cc2fc4262a96p20 0x0.0p0 0x1.445731e8ed7e5p6 0x1.efffffffe353ap3 0x0.0p0 F +REG epsg:7782 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.248p6 0x1.4p3 0x0.0p0 F +REG epsg:7782 1 OK 0x1.aa05acce44bbap18 0x1.b6b5646477cfcp18 0x0.0p0 0x1.10310408215fp6 0x1.3fffffffe89a1p2 0x0.0p0 F +REG epsg:7782 2 OK 0x1.7dc694cc6ed12p20 0x1.b6b5646477cfcp18 0x0.0p0 0x1.38cefbf7dea12p6 0x1.3fffffffe89a1p2 0x0.0p0 F +REG epsg:7782 3 OK 0x1.baba4eff0533cp18 0x1.7cb5d9f6b7111p20 0x0.0p0 0x1.103104080b0b8p6 0x1.dfffffffe4479p3 0x0.0p0 F +REG epsg:7782 4 OK 0x1.79996c403eb31p20 0x1.7cb5d9f6b7111p20 0x0.0p0 0x1.38cefbf7f4f49p6 0x1.dfffffffe4479p3 0x0.0p0 F +REG epsg:7783 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.73p6 0x1.72p4 0x0.0p0 F +REG epsg:7783 1 OK 0x1.9dfd72ea6415ap18 0x1.bc4dd16a305fp18 0x0.0p0 0x1.5d40aa7ab8b53p6 0x1.21ffffffe6ee7p4 0x0.0p0 F +REG epsg:7783 2 OK 0x1.80c8a34566fa4p20 0x1.bc4dd16a305eep18 0x0.0p0 0x1.88bf5585474adp6 0x1.21ffffffe6ee7p4 0x0.0p0 F +REG epsg:7783 3 OK 0x1.c67e299a836p18 0x1.7e4bb986ba181p20 0x0.0p0 0x1.5d40aa7aa01f3p6 0x1.c1ffffffce89fp4 0x0.0p0 F +REG epsg:7783 4 OK 0x1.76a875995f27ap20 0x1.7e4bb986ba18p20 0x0.0p0 0x1.88bf55855fe0cp6 0x1.c1ffffffce89fp4 0x0.0p0 F +REG epsg:7784 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.62p6 0x1.bap4 0x0.0p0 F +REG epsg:7784 1 OK 0x1.995c04ca219ep18 0x1.be71113e42712p18 0x0.0p0 0x1.4b6d3a4c3b4acp6 0x1.69ffffffd7138p4 0x0.0p0 F +REG epsg:7784 2 OK 0x1.81f0fecd77982p20 0x1.be71113e42712p18 0x0.0p0 0x1.7892c5b3c4b53p6 0x1.69ffffffd7138p4 0x0.0p0 F +REG epsg:7784 3 OK 0x1.cb04f09bc6712p18 0x1.7ee71706237dap20 0x0.0p0 0x1.4b6d3a4c3041bp6 0x1.04ffffffd328ap5 0x0.0p0 F +REG epsg:7784 4 OK 0x1.7586c3d90e636p20 0x1.7ee71706237dap20 0x0.0p0 0x1.7892c5b3cfbe4p6 0x1.04ffffffd328ap5 0x0.0p0 F +REG epsg:7785 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.398p6 0x1.5cp3 0x0.0p0 F +REG epsg:7785 1 OK 0x1.a95b1d4460e56p18 0x1.b727584b144c6p18 0x0.0p0 0x1.25225e7b5817p6 0x1.77ffffffe46b3p2 0x0.0p0 F +REG epsg:7785 2 OK 0x1.7df138aee7c7p20 0x1.b727584b144c6p18 0x0.0p0 0x1.4ddda184a7e9p6 0x1.77ffffffe46b3p2 0x0.0p0 F +REG epsg:7785 3 OK 0x1.bb8e32302994cp18 0x1.7cc9804a1581ep20 0x0.0p0 0x1.25225e7b40535p6 0x1.fbffffffe2959p3 0x0.0p0 F +REG epsg:7785 4 OK 0x1.79647373f59b3p20 0x1.7cc9804a1581ep20 0x0.0p0 0x1.4ddda184bfaccp6 0x1.fbffffffe2958p3 0x0.0p0 F +REG epsg:7786 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.6fp6 0x1.7cp4 0x0.0p0 F +REG epsg:7786 1 OK 0x1.9d5e17c6e147ep18 0x1.bc97743cde976p18 0x0.0p0 0x1.59264698c5f16p6 0x1.2bffffffe5595p4 0x0.0p0 F +REG epsg:7786 2 OK 0x1.80f07a0e47aep20 0x1.bc97743cde976p18 0x0.0p0 0x1.84d9b9673a0eap6 0x1.2bffffffe5595p4 0x0.0p0 F +REG epsg:7786 3 OK 0x1.c71a203ef8204p18 0x1.7e60acf88e0b4p20 0x0.0p0 0x1.59264698aea89p6 0x1.cbffffffca604p4 0x0.0p0 F +REG epsg:7786 4 OK 0x1.768177f041f7fp20 0x1.7e60acf88e0b4p20 0x0.0p0 0x1.84d9b96751577p6 0x1.cbffffffca604p4 0x0.0p0 F +REG epsg:7787 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.5f8p6 0x1.86p4 0x0.0p0 F +REG epsg:7787 1 OK 0x1.9ccf149fc96f4p18 0x1.bcf2b3c2d5d2cp18 0x0.0p0 0x1.498af6520c8f6p6 0x1.35ffffffe39c1p4 0x0.0p0 F +REG epsg:7787 2 OK 0x1.81143ad80da43p20 0x1.bcf2b3c2d5d2cp18 0x0.0p0 0x1.757509adf370bp6 0x1.35ffffffe39c1p4 0x0.0p0 F +REG epsg:7787 3 OK 0x1.c7c828386cb5p18 0x1.7e716b35439cbp20 0x0.0p0 0x1.498af651f6c01p6 0x1.d5ffffffc5d03p4 0x0.0p0 F +REG epsg:7787 4 OK 0x1.7655f5f1e4d2cp20 0x1.7e716b35439cbp20 0x0.0p0 0x1.757509ae094p6 0x1.d5ffffffc5d03p4 0x0.0p0 F +REG epsg:7789 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7789 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7789 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7789 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7789 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7791 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG epsg:7791 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:7791 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG epsg:7791 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:7791 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG epsg:7792 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG epsg:7792 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG epsg:7792 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG epsg:7792 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG epsg:7792 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG epsg:7793 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:7793 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:7793 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:7793 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:7793 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:7794 0 OK 0x1.ab3fp22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:7794 1 OK 0x1.896920bbf8513p22 -0x1.0e970b6c3a092p19 0x0.0p0 0x1.c0000001d501ep2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:7794 2 OK 0x1.cd14df4407aedp22 -0x1.0e970b6c3a092p19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:7794 3 OK 0x1.896920bbf8513p22 0x1.0e970b6c3a092p19 0x0.0p0 0x1.c0000001d501ep2 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:7794 4 OK 0x1.cd14df4407aedp22 0x1.0e970b6c3a092p19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:7795 0 OK 0x1.6e36p21 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG epsg:7795 1 OK 0x1.2a703b2841a0fp21 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000001d501cp2 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7795 2 OK 0x1.b1fbc4d7be5f1p21 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7795 3 OK 0x1.2a703b2841a0fp21 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.c0000001d501cp2 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7795 4 OK 0x1.b1fbc4d7be5f1p21 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:7796 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7796 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7796 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7796 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7796 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7798 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7798 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7798 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7798 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7798 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7799 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:7799 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:7799 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:7799 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:7799 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:7800 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG epsg:7800 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 -0x1.4p2 0x0.0p0 F +REG epsg:7800 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 -0x1.4p2 0x0.0p0 F +REG epsg:7800 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 0x1.4p2 0x0.0p0 F +REG epsg:7800 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 0x1.4p2 0x0.0p0 F +REG epsg:7801 0 OK 0x1.e848p18 0x1.206ee84089078p22 0x0.0p0 0x1.98p4 0x1.5555555555546p5 0x0.0p0 F +REG epsg:7801 1 OK 0x1.54079256db256p18 0x1.177e44e37cc2fp22 0x0.0p0 0x1.7afcbcb101444p4 0x1.4aaaaaaaaaa95p5 0x0.0p0 F +REG epsg:7801 2 OK 0x1.3e4436d4926d5p19 0x1.177e44e37cc2fp22 0x0.0p0 0x1.b503434efebbcp4 0x1.4aaaaaaaaaa95p5 0x0.0p0 F +REG epsg:7801 3 OK 0x1.5a3bf8967484bp18 0x1.2991e71bc7b72p22 0x0.0p0 0x1.7afcbcb101444p4 0x1.5fffffffffff5p5 0x0.0p0 F +REG epsg:7801 4 OK 0x1.3b2a03b4c5bdap19 0x1.2991e71bc7b72p22 0x0.0p0 0x1.b503434efebbcp4 0x1.5fffffffffff5p5 0x0.0p0 F +REG epsg:7803 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:7803 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:7803 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:7803 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:7803 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:7804 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG epsg:7804 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG epsg:7804 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG epsg:7804 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG epsg:7804 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG epsg:7805 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG epsg:7805 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 -0x1.4p2 0x0.0p0 F +REG epsg:7805 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 -0x1.4p2 0x0.0p0 F +REG epsg:7805 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 0x1.4p2 0x0.0p0 F +REG epsg:7805 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 0x1.4p2 0x0.0p0 F +REG epsg:7815 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7815 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7815 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7815 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7815 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7825 0 OK 0x1.3d691be16f869p20 0x1.6b1294c6d9d57p6 -0x1.22e0e02e1p6 0x1.77fffffffbd21p4 0x1.5555554a9500ep-4 0x1.e75bp-14 T +REG epsg:7825 1 OK 0x1.6bb1665cf4c25p19 -0x1.0ef017bdb68ecp19 -0x1.7086b85a6p6 0x1.27fffa74d52e5p4 -0x1.3aaaaaaaa2517p2 0x1.f2cp-14 F +REG epsg:7825 2 OK 0x1.c4f9788d4a54dp20 -0x1.0ef023900d28p19 -0x1.0fe6a3cdcp6 0x1.c800058b26847p4 -0x1.3aaaaaaab399fp2 0x1.edffp-14 F +REG epsg:7825 3 OK 0x1.6bc3489268f74p19 0x1.0f0fc763c758cp19 -0x1.38197bf12p6 0x1.27fffa74cff71p4 0x1.4555555508c79p2 0x1.decp-14 F +REG epsg:7825 4 OK 0x1.c4f09fbe2baa2p20 0x1.0f0fa2d698f5cp19 -0x1.af014cb3cp5 0x1.c800058b234c6p4 0x1.45555554f866bp2 0x1.cffbp-14 F +REG epsg:7826 0 OK 0x1.18c67e04e120fp21 0x1.6a127e494004p6 -0x1.05f305cadp6 0x1.a7fffffffb70bp4 0x1.55555549505ffp-4 0x1.e43fp-14 T +REG epsg:7826 1 OK 0x1.a9fc9cabc5b58p20 -0x1.0ef009fe48601p19 -0x1.531f093aep6 0x1.57fffa74d4afep4 -0x1.3aaaaaaaa7a22p2 0x1.f1b2p-14 F +REG epsg:7826 2 OK 0x1.5c8ea6f89f8a6p21 -0x1.0ef018ab4caeap19 -0x1.e7c1e9e98p5 0x1.f800058b262a1p4 -0x1.3aaaaaaab88e8p2 0x1.ebebp-14 F +REG epsg:7826 3 OK 0x1.aa058f34137eap20 0x1.0f0fac7cd1c59p19 -0x1.1ab3f69e4p6 0x1.57fffa74cf8ddp4 0x1.4555555503bc5p2 0x1.da9ap-14 F +REG epsg:7826 4 OK 0x1.5c8a3b4949ebfp21 0x1.0f0f8515536c4p19 -0x1.76fa4a99cp5 0x1.f800058b2310ep4 0x1.45555554f3cfap2 0x1.cb16p-14 F +REG epsg:7827 0 OK 0x1.92d86b1767cd7p21 0x1.68f764813029ep6 -0x1.d2f4070d4p5 0x1.d7fffffffb1bfp4 0x1.555555481422p-4 0x1.e0e4p-14 T +REG epsg:7827 1 OK 0x1.4f104000f2826p21 -0x1.0eeffd7277859p19 -0x1.3609e4bfp6 0x1.87fffa74d43b4p4 -0x1.3aaaaaaaacdbbp2 0x1.f04bp-14 F +REG epsg:7827 2 OK 0x1.d6a08ebf9ad8fp21 -0x1.0ef00ee7530eep19 -0x1.b0e149926p5 0x1.140002c592ee5p5 -0x1.3aaaaaaabd5fp2 0x1.e99bp-14 F +REG epsg:7827 3 OK 0x1.4f14b9f72a1p21 0x1.0f0f910672d51p19 -0x1.fb41fdd52p5 0x1.87fffa74cf316p4 0x1.45555554fed07p2 0x1.d62ep-14 F +REG epsg:7827 4 OK 0x1.d69c23c3c330ep21 0x1.0f0f66d77738ep19 -0x1.401e01a12p5 0x1.140002c59172ap5 0x1.45555554ef61bp2 0x1.c60ap-14 F +REG epsg:7828 0 OK 0x1.06752a9aca2a6p22 0x1.67c20e18ba40ep6 -0x1.9b13a79fep5 0x1.03fffffffd6a9p5 0x1.55555546e1242p-4 0x1.dd4bp-14 T +REG epsg:7828 1 OK 0x1.c9222ea27b32cp21 -0x1.0eeff22311575p19 -0x1.195bb2eap6 0x1.b7fffa74d3d13p4 -0x1.3aaaaaaab1fa2p2 0x1.ee96p-14 F +REG epsg:7828 2 OK 0x1.285939d64b5ccp22 -0x1.0ef0064afa2c3p19 -0x1.7b51e7efep5 0x1.2c0002c592ce6p5 -0x1.3aaaaaaac2079p2 0x1.e71bp-14 F +REG epsg:7828 3 OK 0x1.c926a9458d4b6p21 0x1.0f0f7513ef984p19 -0x1.c1e9f6a48p5 0x1.b7fffa74cee25p4 0x1.45555554fa069p2 0x1.d188p-14 F +REG epsg:7828 4 OK 0x1.285704af81ab6p22 0x1.0f0f48323ca28p19 -0x1.0a92f017ap5 0x1.2c0002c59164ep5 0x1.45555554eb2p2 0x1.c0dfp-14 F +REG epsg:7829 0 OK 0x1.437e1e3760f65p22 0x1.6673542244759p6 -0x1.646c221d6p5 0x1.1bfffffffd4e2p5 0x1.55555545b83d7p-4 0x1.d98dp-14 T +REG epsg:7829 1 OK 0x1.219a0d2356bf9p22 -0x1.0eefe8180526bp19 -0x1.fa5126fc4p5 0x1.e7fffa74d372ap4 -0x1.3aaaaaaab6f9bp2 0x1.ec9cp-14 F +REG epsg:7829 2 OK 0x1.65622ae9497ccp22 -0x1.0eeffedc4c7a4p19 -0x1.473959b2cp5 0x1.440002c592b5ap5 -0x1.3aaaaaaac684dp2 0x1.e471p-14 F +REG epsg:7829 3 OK 0x1.219c4ac8755e9p22 0x1.0f0f58b8e432cp19 -0x1.8988142p5 0x1.e7fffa74cea1cp4 0x1.45555554f562p2 0x1.ccb4p-14 F +REG epsg:7829 4 OK 0x1.655ff616c7f2cp22 0x1.0f0f293b246d8p19 -0x1.acfd4f4ccp4 0x1.440002c5915f8p5 0x1.45555554e70c5p2 0x1.bbb1p-14 F +REG epsg:7830 0 OK 0x1.8087106a29d72p22 0x1.650c21802f9a7p6 -0x1.2f23cfcc6p5 0x1.33fffffffd395p5 0x1.555555449a3e1p-4 0x1.d5a6p-14 T +REG epsg:7830 1 OK 0x1.5ea3017de97a5p22 -0x1.0eefdf585eadcp19 -0x1.c3089fbep5 0x1.0bfffd3a69907p5 -0x1.3aaaaaaabbd62p2 0x1.ea5fp-14 F +REG epsg:7830 2 OK 0x1.a26b1aa3411dep22 -0x1.0eeff8a080c04p19 -0x1.14bc2c84cp5 0x1.5c0002c592a44p5 -0x1.3aaaaaaacad28p2 0x1.e1a6p-14 F +REG epsg:7830 3 OK 0x1.5ea53f738b542p22 0x1.0f0f3c093617ap19 -0x1.5243e5ffap5 0x1.0bfffd3a67387p5 0x1.45555554f0e5dp2 0x1.c7b1p-14 F +REG epsg:7830 4 OK 0x1.a268e621f29d6p22 0x1.0f0f0a07e8c65p19 -0x1.480b65ef8p4 0x1.5c0002c59162cp5 0x1.45555554e329cp2 0x1.b67ap-14 F +REG epsg:7831 0 OK 0x1.bd90013cd430ap22 0x1.638d723ffc329p6 -0x1.f6c026fb8p4 0x1.4bfffffffd2c6p5 0x1.5555554387ee4p-4 0x1.d1a8p-14 T +REG epsg:7831 1 OK 0x1.9babf4692208cp22 -0x1.0eefd7ea411e7p19 -0x1.8d049a5c6p5 0x1.23fffd3a696e7p5 -0x1.3aaaaaaac08c2p2 0x1.e7efp-14 F +REG epsg:7831 2 OK 0x1.df74090f9da1ep22 -0x1.0eeff39bf671ap19 -0x1.c7fb9ac1p4 0x1.740002c5929a2p5 -0x1.3aaaaaaaceeddp2 0x1.deccp-14 F +REG epsg:7831 3 OK 0x1.9bae32abfc47fp22 0x1.0f0f1f1906136p19 -0x1.1c443379ep5 0x1.23fffd3a67281p5 0x1.45555554ec945p2 0x1.c293p-14 F +REG epsg:7831 4 OK 0x1.df71d4dc34143p22 0x1.0f0eeaae6e02p19 -0x1.cd2df049p3 0x1.740002c5916ebp5 0x1.45555554df7a2p2 0x1.b149p-14 F +REG epsg:7842 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7842 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7842 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7842 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7842 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7844 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7844 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7844 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7844 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7844 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7845 0 OK 0x0.0p0 -0x1.f9e88fbbaa997p20 0x0.0p0 0x1.0cp7 -0x1.1fffffffffefbp4 0x0.0p0 F +REG epsg:7845 1 OK -0x1.646729d93909bp20 -0x1.d1295c9604974p21 0x0.0p0 0x1.d8e98a4ce308ap6 -0x1.07fffffffffc8p5 0x0.0p0 F +REG epsg:7845 2 OK 0x1.646729d93909bp20 -0x1.d1295c9604974p21 0x0.0p0 0x1.2b8b3ad98e7bcp7 -0x1.07fffffffffc8p5 0x0.0p0 F +REG epsg:7845 3 OK -0x1.cb07e36c5fb14p20 -0x1.d38459192da8dp18 0x0.0p0 0x1.d8e98a4ce308ap6 -0x1.7fffffffffdbp1 0x0.0p0 F +REG epsg:7845 4 OK 0x1.cb07e36c5fb14p20 -0x1.d38459192da8dp18 0x0.0p0 0x1.2b8b3ad98e7bcp7 -0x1.7fffffffffdbp1 0x0.0p0 F +REG epsg:7846 0 OK 0x1.e847fffffffeap18 0x1.b997b102aac2p22 0x0.0p0 0x1.74p6 -0x1.9p4 0x0.0p0 F +REG epsg:7846 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7846 2 OK 0x1.f8272811f153dp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7846 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG epsg:7846 4 OK 0x1.07218271ed484p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.8a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7847 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.8cp6 -0x1.9p4 0x0.0p0 F +REG epsg:7847 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7847 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7847 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7847 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.a2114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7848 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.a400000000001p6 -0x1.9p4 0x0.0p0 F +REG epsg:7848 1 OK -0x1.fbe5023e2acap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7848 2 OK 0x1.f8272811f1531p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7848 3 OK -0x1.2fd8271ed49bp16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7848 4 OK 0x1.07218271ed47ep20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ba114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7849 0 OK 0x1.e848000000042p18 0x1.b997b102aac2p22 0x0.0p0 0x1.bcp6 -0x1.9p4 0x0.0p0 F +REG epsg:7849 1 OK -0x1.fbe5023e2a4cp14 0x1.97014c7538ba8p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7849 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7849 3 OK -0x1.2fd8271ed4788p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7849 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.d2114b818572dp6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7850 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.d4p6 -0x1.9p4 0x0.0p0 F +REG epsg:7850 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7850 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7850 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7850 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ea114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7851 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.ec00000000001p6 -0x1.9p4 0x0.0p0 F +REG epsg:7851 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7851 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7851 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7851 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7852 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.02p7 -0x1.9p4 0x0.0p0 F +REG epsg:7852 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7852 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7852 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7852 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7853 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.0ep7 -0x1.9p4 0x0.0p0 F +REG epsg:7853 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7853 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7853 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7853 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7854 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.1ap7 -0x1.9p4 0x0.0p0 F +REG epsg:7854 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7854 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7854 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7854 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7855 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.26p7 -0x1.9p4 0x0.0p0 F +REG epsg:7855 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7855 2 OK 0x1.f8272811f156fp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7855 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7855 4 OK 0x1.07218271ed4ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7856 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.32p7 -0x1.9p4 0x0.0p0 F +REG epsg:7856 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7856 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7856 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7856 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7857 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.3ep7 -0x1.9p4 0x0.0p0 F +REG epsg:7857 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG epsg:7857 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7857 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7857 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7858 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.4ap7 -0x1.9p4 0x0.0p0 F +REG epsg:7858 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7858 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7858 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7858 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7859 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG epsg:7859 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7859 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7859 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7859 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7877 0 OK 0x1.247726f301fe2p18 0x1.e8691694a9633p20 -0x1.5282b483cp4 -0x1.6dddddddddddfp2 -0x1.feeeeeeeeeef5p3 0x0.0p0 F +REG epsg:7877 1 OK -0x1.d87ad00ce85bcp17 0x1.5f24ef7daacfap20 -0x1.962d69834p4 -0x1.5d5a7f8ca88c4p3 -0x1.4f77777761342p4 -0x1.0p-28 F +REG epsg:7877 2 OK 0x1.9a95da037d8a5p19 0x1.5f24ef838762cp20 -0x1.c285bc7f6p6 -0x1.0835e5135db35p-1 -0x1.4f7777776177dp4 0x1.8p-29 F +REG epsg:7877 3 OK -0x1.0759db21f7e1p18 0x1.3721789e64689p21 0x1.145ea06dep6 -0x1.5d5a7f8bbc818p3 -0x1.5eeeeeeed45e9p3 0x1.8p-27 F +REG epsg:7877 4 OK 0x1.a82413e30ec36p19 0x1.372178a04d7ap21 -0x1.6a17dada4p4 -0x1.0835e521f5523p-1 -0x1.5eeeeeeed4b1cp3 -0x1.cp-27 F +REG epsg:7878 0 OK 0x1.e7c2ed07e0295p18 0x1.b99f4fa410c32p22 -0x1.fefc7633p6 -0x1.8000000000002p1 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:7878 1 OK -0x1.023840e58c83p15 0x1.9708bc7161477p22 -0x1.051d9b2f1p7 -0x1.108a5c0c2b972p3 -0x1.e000000000003p4 0x1.0p-30 F +REG epsg:7878 2 OK 0x1.f7e6703c0cc78p19 0x1.9708bc733d6d4p22 -0x1.b67440f06p7 0x1.42297030ae5c8p1 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG epsg:7878 3 OK -0x1.31f3f222d3d8p16 0x1.dad26bde0b864p22 -0x1.1aa47b422p5 -0x1.108a5c0c2b973p3 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:7878 4 OK 0x1.0700b55962bf4p20 0x1.dad26bdfd168ep22 -0x1.0714ec6fp7 0x1.42297030ae5c9p1 -0x1.3fffffffffffep4 0x1.0p-29 F +REG epsg:7879 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7879 1 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7879 2 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 -0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7879 3 OK 0x1.8257e34e344bfp22 -0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7879 4 OK 0x1.8257e34e344bfp22 0x1.0e67c073d6813p19 0x1.0d9efeb88c283p19 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG epsg:7881 0 OK -0x1.7d002c795ea22p-21 -0x1.a18e35bf65e68p-21 0x1.3b645a4p-4 0x0.0p0 0x1.2f74bf1dcfcaep-73 -0x1.0p-30 T +REG epsg:7881 1 OK -0x1.400002b90141fp2 -0x1.400002f920cb8p2 0x1.73cad2p-4 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:7881 2 OK 0x1.3ffffcc50a7b7p2 -0x1.40000304c820cp2 0x1.3b9a3c8p-4 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG epsg:7881 3 OK -0x1.400002b90141fp2 0x1.3ffffc796381p2 0x1.3663d74p-4 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG epsg:7881 4 OK 0x1.3ffffcc50a7b7p2 0x1.3ffffc850ad6p2 0x1.fc66838p-5 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x0.0p0 F +REG epsg:7882 0 OK 0x1.2476eaa0c5e32p18 0x1.e868fd1ce8dcfp20 0x1.ad9a664p-4 -0x1.6dddddddddddcp2 -0x1.feeeeeeeeeef1p3 0x0.0p0 F +REG epsg:7882 1 OK -0x1.d8786024fc466p17 0x1.5f24f6a30d35ep20 0x1.d873a6p-4 -0x1.5d5a7f8ca81b1p3 -0x1.4f7777776174ap4 0x1.0p-30 F +REG epsg:7882 2 OK 0x1.9a9502a9fea92p19 0x1.5f24f6a30d6abp20 0x1.a743cd8p-4 -0x1.0835e5135c2c9p-1 -0x1.4f7777776174bp4 0x1.0p-30 F +REG epsg:7882 3 OK -0x1.075aa1fdfc2bdp18 0x1.37215c365d4c9p21 0x1.af34b64p-4 -0x1.5d5a7f8bbecafp3 -0x1.5eeeeeeed4b2cp3 0x1.0p-30 F +REG epsg:7882 4 OK 0x1.a8243b9fbc436p19 0x1.37215c365d5dcp21 0x1.7b7e49p-4 -0x1.0835e521f12e9p-1 -0x1.5eeeeeeed4b2bp3 0x0.0p0 F +REG epsg:7883 0 OK 0x1.e847fb35f42e3p18 0x1.b997b0d5da696p22 0x1.c1ab3p-4 -0x1.8000000000002p1 -0x1.9000000000003p4 0x1.0p-30 F +REG epsg:7883 1 OK -0x1.fbe5452f6888p14 0x1.97014c5278a9ep22 0x1.e7c189cp-4 -0x1.108a5c0c2b974p3 -0x1.dfffffffffffep4 -0x1.0p-30 F +REG epsg:7883 2 OK 0x1.f827255f69efcp19 0x1.97014c5278bbp22 0x1.b4b227cp-4 0x1.42297030ae5c8p1 -0x1.dfffffffffffep4 0x1.0p-30 F +REG epsg:7883 3 OK -0x1.2fd837d34c31p16 0x1.dacaa0469fa25p22 0x1.ca9d67p-4 -0x1.108a5c0c2b972p3 -0x1.4p4 0x0.0p0 F +REG epsg:7883 4 OK 0x1.072181182b04ap20 0x1.dacaa0469fb29p22 0x1.93361fp-4 0x1.42297030ae5c8p1 -0x1.4000000000001p4 0x0.0p0 F +REG epsg:7884 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7884 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7884 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7884 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7884 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7886 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7886 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7886 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7886 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7886 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7887 0 OK 0x1.e847ffffffff1p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.8000000000001p1 -0x1.9p4 0x0.0p0 F +REG epsg:7887 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.108a5c0c2b971p3 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7887 2 OK 0x1.f8272811f1544p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.42297030ae5cbp1 -0x1.dfffffffffffep4 0x0.0p0 F +REG epsg:7887 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.108a5c0c2b972p3 -0x1.4p4 0x0.0p0 F +REG epsg:7887 4 OK 0x1.07218271ed488p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.42297030ae5c6p1 -0x1.3ffffffffffffp4 0x0.0p0 F +REG epsg:7899 0 OK 0x1.312dp21 0x1.312dp21 0x0.0p0 0x1.22p7 -0x1.27fffffffffdbp5 0x0.0p0 F +REG epsg:7899 1 OK 0x1.16af6ae880181p21 0x1.15ba29568fd5dp21 0x0.0p0 0x1.1cfdd02668412p7 -0x1.37fffffffffe2p5 0x0.0p0 F +REG epsg:7899 2 OK 0x1.4baa95177fe7ap21 0x1.15ba29568fd6p21 0x0.0p0 0x1.27022fd997beep7 -0x1.37fffffffffdfp5 0x0.0p0 F +REG epsg:7899 3 OK 0x1.15428709f06f5p21 0x1.4be6490335d32p21 0x0.0p0 0x1.1cfdd02668412p7 -0x1.17fffffffffd3p5 0x0.0p0 F +REG epsg:7899 4 OK 0x1.4d1778f60f906p21 0x1.4be6490335d35p21 0x0.0p0 0x1.27022fd997beep7 -0x1.17fffffffffd3p5 0x0.0p0 F +REG epsg:7914 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7914 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7914 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7914 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7914 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7916 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7916 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7916 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7916 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7916 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7918 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7918 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7918 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7918 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7918 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7920 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7920 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7920 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7920 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7920 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7922 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7922 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7922 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7922 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7922 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7924 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7924 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7924 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7924 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7924 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7926 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7926 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7926 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7926 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7926 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7928 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7928 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7928 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7928 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7928 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7930 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:7930 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7930 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:7930 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7930 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:7954 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7954 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7954 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7954 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7954 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7955 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7955 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7955 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7955 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7955 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7956 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7956 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7956 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7956 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7956 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:7991 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG epsg:7991 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:7991 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:7991 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:7991 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG epsg:7992 0 OK 0x1.e838dbd9da5d3p18 0x1.b99911572d7a4p22 -0x1.ab3efb068p5 0x1.dfffffffffffep3 -0x1.9000000000003p4 -0x1.0p-30 F +REG epsg:7992 1 OK -0x1.fcece332d70ap14 0x1.9702998871d1cp22 -0x1.e45a9b18ap5 0x1.2f75a3f3d468fp3 -0x1.dfffffffffffcp4 0x0.0p0 F +REG epsg:7992 2 OK 0x1.f82042e00d60bp19 0x1.97029988a821p22 -0x1.1a882f778p6 0x1.48452e0615cb9p4 -0x1.dfffffffffffep4 -0x1.8p-29 F +REG epsg:7992 3 OK -0x1.30189832eafcp16 0x1.dacc134c673dep22 -0x1.32680885ep5 0x1.2f75a3f3d468dp3 -0x1.3fffffffffffdp4 0x0.0p0 F +REG epsg:7992 4 OK 0x1.071df764af192p20 0x1.dacc134c9aee5p22 -0x1.89fb53c28p5 0x1.48452e0615cbap4 -0x1.3ffffffffffffp4 0x1.8p-29 F +REG epsg:8013 0 OK 0x1.86ap15 0x1.f47dp21 0x0.0p0 0x1.d788888888886p6 0x0.0p0 0x0.0p0 T +REG epsg:8013 1 OK -0x1.ed5ac3158fdaep18 0x1.b0bd25991542dp21 0x0.0p0 0x1.c3888888a5d88p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8013 2 OK 0x1.2781618ac7ed7p19 0x1.b0bd25991542dp21 0x0.0p0 0x1.eb8888886b384p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8013 3 OK -0x1.ed5ac3158fdaep18 0x1.1c1e6d33755e9p22 0x0.0p0 0x1.c3888888a5d88p6 0x1.3fffffffeae0cp2 0x0.0p0 F +REG epsg:8013 4 OK 0x1.2781618ac7ed7p19 0x1.1c1e6d33755e9p22 0x0.0p0 0x1.eb8888886b384p6 0x1.3fffffffeae0cp2 0x0.0p0 F +REG epsg:8014 0 OK 0x1.d4cp15 0x1.4997p21 0x0.0p0 0x1.cdp6 0x0.0p0 0x0.0p0 T +REG epsg:8014 1 OK -0x1.e39674e9c16aep18 0x1.05d72f5db1e62p21 0x0.0p0 0x1.b90000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8014 2 OK 0x1.2c633a74e0b4ap19 0x1.05d72f5db1e62p21 0x0.0p0 0x1.e0ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8014 3 OK -0x1.e39674e9c16aep18 0x1.8d56d0a24e19ep21 0x0.0p0 0x1.b90000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8014 4 OK 0x1.2c633a74e0b4ap19 0x1.8d56d0a24e19ep21 0x0.0p0 0x1.e0ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8015 0 OK 0x1.86ap15 0x1.18c3p21 0x0.0p0 0x1.e955555555553p6 0x0.0p0 0x0.0p0 T +REG epsg:8015 1 OK -0x1.ed5a90a0d9bb8p18 0x1.aa0657ce3a8bap20 0x0.0p0 0x1.d555555572a54p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8015 2 OK 0x1.278148506cddcp19 0x1.aa0657ce3a8bap20 0x0.0p0 0x1.fd55555538051p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8015 3 OK -0x1.ed5a90a0d9bb8p18 0x1.5c82d418e2ba3p21 0x0.0p0 0x1.d555555572a54p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8015 4 OK 0x1.278148506cddcp19 0x1.5c82d418e2ba3p21 0x0.0p0 0x1.fd55555538051p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8016 0 OK 0x1.86ap15 0x1.e848p21 0x0.0p0 0x1.cdbbbbbbbbbb9p6 0x0.0p0 0x0.0p0 T +REG epsg:8016 1 OK -0x1.ed5995c524fb2p18 0x1.a4884b3fce1ecp21 0x0.0p0 0x1.b9bbbbbbd90bbp6 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:8016 2 OK 0x1.2780cae2927d9p19 0x1.a4884b3fce1ecp21 0x0.0p0 0x1.e1bbbbbb9e6b8p6 -0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:8016 3 OK -0x1.ed5995c524fb2p18 0x1.1603da6018f0ap22 0x0.0p0 0x1.b9bbbbbbd90bbp6 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:8016 4 OK 0x1.2780cae2927d9p19 0x1.1603da6018f0ap22 0x0.0p0 0x1.e1bbbbbb9e6b8p6 0x1.3fffffffeae0dp2 0x0.0p0 F +REG epsg:8017 0 OK 0x1.86ap15 0x1.74508p21 0x0.0p0 0x1.c6aaaaaaaaaadp6 0x0.0p0 0x0.0p0 T +REG epsg:8017 1 OK -0x1.ed59de418bfaep18 0x1.3090c2310e541p21 0x0.0p0 0x1.b2aaaaaac7fafp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8017 2 OK 0x1.2780ef20c5fcap19 0x1.3090c2310e541p21 0x0.0p0 0x1.daaaaaaa8d5acp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8017 3 OK -0x1.ed59de418bfaep18 0x1.b8103dcef1abfp21 0x0.0p0 0x1.b2aaaaaac7fafp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8017 4 OK 0x1.2780ef20c5fcap19 0x1.b8103dcef1abfp21 0x0.0p0 0x1.daaaaaaa8d5acp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8018 0 OK 0x1.86ap15 0x1.55ccp20 0x0.0p0 0x1.a680000000001p6 0x0.0p0 0x0.0p0 T +REG epsg:8018 1 OK -0x1.ed5da40651a08p18 0x1.9c97260c88303p19 0x0.0p0 0x1.928000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8018 2 OK 0x1.2782d20328cf8p19 0x1.9c97260c88303p19 0x0.0p0 0x1.ba7fffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8018 3 OK -0x1.ed5da40651a08p18 0x1.dd4c6cf9bbe7ep20 0x0.0p0 0x1.928000001d502p6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8018 4 OK 0x1.2782d20328cf8p19 0x1.dd4c6cf9bbe7ep20 0x0.0p0 0x1.ba7fffffe2afep6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8019 0 OK 0x1.86ap15 0x1.86ap20 0x0.0p0 0x1.838p6 0x0.0p0 0x0.0p0 T +REG epsg:8019 1 OK -0x1.ed594cedc7872p18 0x1.fe415167aedb9p19 0x0.0p0 0x1.6f8000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8019 2 OK 0x1.2780a676e3c2dp19 0x1.fe415167aedb9p19 0x0.0p0 0x1.977fffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8019 3 OK -0x1.ed594cedc7872p18 0x1.070faba614492p21 0x0.0p0 0x1.6f8000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8019 4 OK 0x1.2780a676e3c2dp19 0x1.070faba614492p21 0x0.0p0 0x1.977fffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8020 0 OK 0x1.388p15 0x1.f47dp21 0x0.0p0 0x1.cfbbbbbbbbbb9p6 0x0.0p0 0x0.0p0 T +REG epsg:8020 1 OK -0x1.f720c9db2fb5ap18 0x1.b0bce4c61d07p21 0x0.0p0 0x1.bbbbbbbbd90bbp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8020 2 OK 0x1.22a064ed97dc6p19 0x1.b0bce4c61d07p21 0x0.0p0 0x1.e3bbbbbb9e6b9p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8020 3 OK -0x1.f720c9db2fb5ap18 0x1.1c1e8d9cf17c8p22 0x0.0p0 0x1.bbbbbbbbd90bbp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8020 4 OK 0x1.22a064ed97dc6p19 0x1.1c1e8d9cf17c8p22 0x0.0p0 0x1.e3bbbbbb9e6b9p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8021 0 OK 0x1.86ap15 0x1.ee628p21 0x0.0p0 0x1.e788888888886p6 0x0.0p0 0x0.0p0 T +REG epsg:8021 1 OK -0x1.ed5aea2b7713ep18 0x1.aaa2a0b6c6f12p21 0x0.0p0 0x1.d3888888a5d88p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8021 2 OK 0x1.27817515bb89fp19 0x1.aaa2a0b6c6f12p21 0x0.0p0 0x1.fb8888886b385p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8021 3 OK -0x1.ed5aea2b7713ep18 0x1.19112fa49c877p22 0x0.0p0 0x1.d3888888a5d88p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8021 4 OK 0x1.27817515bb89fp19 0x1.19112fa49c877p22 0x0.0p0 0x1.fb8888886b385p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8022 0 OK 0x1.86ap15 0x1.4fb18p21 0x0.0p0 0x1.c844444444447p6 0x0.0p0 0x0.0p0 T +REG epsg:8022 1 OK -0x1.ed5a7a9928dcap18 0x1.0bf1aea7d50d7p21 0x0.0p0 0x1.b444444461949p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8022 2 OK 0x1.27813d4c946e5p19 0x1.0bf1aea7d50d7p21 0x0.0p0 0x1.dc44444426f45p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8022 3 OK -0x1.ed5a7a9928dcap18 0x1.937151582af29p21 0x0.0p0 0x1.b444444461949p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8022 4 OK 0x1.27813d4c946e5p19 0x1.937151582af29p21 0x0.0p0 0x1.dc44444426f45p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8023 0 OK 0x1.86ap15 0x1.a5248p21 0x0.0p0 0x1.ca55555555553p6 0x0.0p0 0x0.0p0 T +REG epsg:8023 1 OK -0x1.ed5b05e28f66p18 0x1.61649d403250ep21 0x0.0p0 0x1.b655555572a55p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8023 2 OK 0x1.278182f147b3p19 0x1.61649d403250ep21 0x0.0p0 0x1.de55555538051p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8023 3 OK -0x1.ed5b05e28f66p18 0x1.e8e462bfcdaf2p21 0x0.0p0 0x1.b655555572a55p6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8023 4 OK 0x1.278182f147b3p19 0x1.e8e462bfcdaf2p21 0x0.0p0 0x1.de55555538051p6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8024 0 OK 0x1.d4cp15 0x1.cfdep21 0x0.0p0 0x1.e6p6 0x0.0p0 0x0.0p0 T +REG epsg:8024 1 OK -0x1.e39d053ca17cep18 0x1.8c1d5d65e7fc8p21 0x0.0p0 0x1.d20000001d501p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8024 2 OK 0x1.2c66829e50be7p19 0x1.8c1d5d65e7fc8p21 0x0.0p0 0x1.f9ffffffe2afep6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8024 3 OK -0x1.e39d053ca17cep18 0x1.09cf514d0c01cp22 0x0.0p0 0x1.d20000001d501p6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8024 4 OK 0x1.2c66829e50be7p19 0x1.09cf514d0c01cp22 0x0.0p0 0x1.f9ffffffe2afep6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8025 0 OK 0x1.86ap15 0x1.bd8e8p21 0x0.0p0 0x1.cbeeeeeeeeeecp6 0x0.0p0 0x0.0p0 T +REG epsg:8025 1 OK -0x1.ed5a9650412ecp18 0x1.79ceab31406d2p21 0x0.0p0 0x1.b7eeeeef0c3efp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8025 2 OK 0x1.27814b282099p19 0x1.79ceab31406d2p21 0x0.0p0 0x1.dfeeeeeed19edp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8025 3 OK -0x1.ed5a9650412ecp18 0x1.00a72a675fc97p22 0x0.0p0 0x1.b7eeeeef0c3efp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8025 4 OK 0x1.27814b282099p19 0x1.00a72a675fc97p22 0x0.0p0 0x1.dfeeeeeed19edp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8026 0 OK 0x1.adbp15 0x1.c3a9p21 0x0.0p0 0x1.c942d82d82d84p6 0x0.0p0 0x0.0p0 T +REG epsg:8026 1 OK -0x1.e87a1831cee1ep18 0x1.7fe8faf9527a3p21 0x0.0p0 0x1.b542d82da0286p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8026 2 OK 0x1.29f30c18e770fp19 0x1.7fe8faf9527a3p21 0x0.0p0 0x1.dd42d82d65882p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG epsg:8026 3 OK -0x1.e87a1831cee1ep18 0x1.03b4828356c2ep22 0x0.0p0 0x1.b542d82da0286p6 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:8026 4 OK 0x1.29f30c18e770fp19 0x1.03b4828356c2ep22 0x0.0p0 0x1.dd42d82d65882p6 0x1.3fffffffeae0bp2 0x0.0p0 F +REG epsg:8027 0 OK 0x1.86ap15 0x1.37478p21 0x0.0p0 0x1.d3bbbbbbbbbbap6 0x0.0p0 0x0.0p0 T +REG epsg:8027 1 OK -0x1.ed59ffa80bc06p18 0x1.e70f7c0939b64p20 0x0.0p0 0x1.bfbbbbbbd90bbp6 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8027 2 OK 0x1.2780ffd405df7p19 0x1.e70f7c0939b64p20 0x0.0p0 0x1.e7bbbbbb9e6b8p6 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8027 3 OK -0x1.ed59ffa80bc06p18 0x1.7b0741fb6324ep21 0x0.0p0 0x1.bfbbbbbbd90bbp6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8027 4 OK 0x1.2780ffd405df7p19 0x1.7b0741fb6324ep21 0x0.0p0 0x1.e7bbbbbb9e6b8p6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8028 0 OK 0x1.86ap15 0x1.0059p21 0x0.0p0 0x1.018p7 0x0.0p0 0x0.0p0 T +REG epsg:8028 1 OK -0x1.ed5c71067f4bep18 0x1.7931dfbf6f814p20 0x0.0p0 0x1.ef0000001d502p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8028 2 OK 0x1.278238833fa5fp19 0x1.7931dfbf6f814p20 0x0.0p0 0x1.0b7ffffff157fp7 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8028 3 OK -0x1.ed5c71067f4bep18 0x1.44191020483f6p21 0x0.0p0 0x1.ef0000001d502p6 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8028 4 OK 0x1.278238833fa5fp19 0x1.44191020483f6p21 0x0.0p0 0x1.0b7ffffff157fp7 0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8029 0 OK 0x1.86ap15 0x1.c9c38p21 0x0.0p0 0x1.cd7777777777ap6 0x0.0p0 0x0.0p0 T +REG epsg:8029 1 OK -0x1.ed5a5e871a132p18 0x1.8603b229c77b5p21 0x0.0p0 0x1.b977777794c7cp6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8029 2 OK 0x1.27812f438d099p19 0x1.8603b229c77b5p21 0x0.0p0 0x1.e17777775a278p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8029 3 OK -0x1.ed5a5e871a132p18 0x1.06c1a6eb1c426p22 0x0.0p0 0x1.b977777794c7cp6 0x1.3fffffffeae13p2 0x0.0p0 F +REG epsg:8029 4 OK 0x1.27812f438d099p19 0x1.06c1a6eb1c426p22 0x0.0p0 0x1.e17777775a278p6 0x1.3fffffffeae13p2 0x0.0p0 F +REG epsg:8030 0 OK 0x1.86ap15 0x1.ee628p21 0x0.0p0 0x1.ccaaaaaaaaaaep6 0x0.0p0 0x0.0p0 T +REG epsg:8030 1 OK -0x1.ed5aea2b77156p18 0x1.aaa2a0b6c6f12p21 0x0.0p0 0x1.b8aaaaaac7fafp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8030 2 OK 0x1.27817515bb89fp19 0x1.aaa2a0b6c6f12p21 0x0.0p0 0x1.e0aaaaaa8d5acp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8030 3 OK -0x1.ed5aea2b77156p18 0x1.19112fa49c877p22 0x0.0p0 0x1.b8aaaaaac7fafp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8030 4 OK 0x1.27817515bb89fp19 0x1.19112fa49c877p22 0x0.0p0 0x1.e0aaaaaa8d5acp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG epsg:8031 0 OK 0x1.86ap15 0x1.dc13p21 0x0.0p0 0x1.cf44444444446p6 0x0.0p0 0x0.0p0 T +REG epsg:8031 1 OK -0x1.ed5a055773322p18 0x1.98533d4ec0027p21 0x0.0p0 0x1.bb44444461949p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8031 2 OK 0x1.278102abb99abp19 0x1.98533d4ec0027p21 0x0.0p0 0x1.e344444426f47p6 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG epsg:8031 3 OK -0x1.ed5a055773322p18 0x1.0fe961589ffedp22 0x0.0p0 0x1.bb44444461949p6 0x1.3fffffffeae13p2 0x0.0p0 F +REG epsg:8031 4 OK 0x1.278102abb99abp19 0x1.0fe961589ffedp22 0x0.0p0 0x1.e344444426f47p6 0x1.3fffffffeae13p2 0x0.0p0 F +REG epsg:8032 0 OK 0x1.86ap15 0x1.312dp21 0x0.0p0 0x1.da66666666667p6 0x0.0p0 0x0.0p0 T +REG epsg:8032 1 OK -0x1.ed5a56b5ebd64p18 0x1.dada6647ae4a7p20 0x0.0p0 0x1.c666666683b68p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8032 2 OK 0x1.27812b5af5ea6p19 0x1.dada6647ae4a7p20 0x0.0p0 0x1.ee66666649165p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8032 3 OK -0x1.ed5a56b5ebd64p18 0x1.74ecccdc28dacp21 0x0.0p0 0x1.c666666683b68p6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8032 4 OK 0x1.27812b5af5ea6p19 0x1.74ecccdc28dacp21 0x0.0p0 0x1.ee66666649165p6 0x1.3fffffffeae0ep2 0x0.0p0 F +REG epsg:8035 0 OK 0x1.907e0aaaaaaafp20 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG epsg:8035 1 OK -0x1.603e923b36ad8p17 -0x1.bc5e8f840b159p20 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8035 2 OK 0x1.a681f3ce5e152p21 -0x1.bc5e8f840b159p20 0x0.0p0 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8035 3 OK -0x1.603e923b36ad8p17 0x1.bc5e8f840b159p20 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8035 4 OK 0x1.a681f3ce5e152p21 0x1.bc5e8f840b159p20 0x0.0p0 -0x1.d000000000001p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8036 0 OK 0x1.907e0aaaaaac3p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:8036 1 OK -0x1.603e923b369a8p17 -0x1.bc5e8f840b159p20 0x0.0p0 -0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8036 2 OK 0x1.a681f3ce5e162p21 -0x1.bc5e8f840b159p20 0x0.0p0 -0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8036 3 OK -0x1.603e923b369a8p17 0x1.bc5e8f840b159p20 0x0.0p0 -0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8036 4 OK 0x1.a681f3ce5e162p21 0x1.bc5e8f840b159p20 0x0.0p0 -0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG epsg:8042 0 OK 0x1.1aaaaaaaaaaabp4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8042 1 OK 0x1.9555555555555p3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:8042 2 OK 0x1.6aaaaaaaaaaabp4 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:8042 3 OK 0x1.9555555555555p3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:8042 4 OK 0x1.6aaaaaaaaaaabp4 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:8043 0 OK 0x1.1aaaaaaaaaaabp4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8043 1 OK 0x1.9555555555555p3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:8043 2 OK 0x1.6aaaaaaaaaaabp4 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG epsg:8043 3 OK 0x1.9555555555555p3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:8043 4 OK 0x1.6aaaaaaaaaaabp4 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG epsg:8044 0 OK 0x1.3eba0c6914745p20 0x1.2ace709f3563ep17 0x0.0p0 0x1.fcf2a247c4842p4 0x1.804f7fce926b5p5 0x0.0p0 F +REG epsg:8044 1 OK 0x1.94438152c9526p19 -0x1.ed1243ff33ef6p18 0x0.0p0 0x1.853976ed93cffp4 0x1.584ecb3573151p5 0x0.0p0 F +REG epsg:8044 2 OK 0x1.ecdbb86307254p20 -0x1.d0abf6ef519b2p17 0x0.0p0 0x1.3a8583bc71b9p5 0x1.584f07c5fedb9p5 0x0.0p0 F +REG epsg:8044 3 OK 0x1.4c73e90bfbd16p19 0x1.27454c52cb242p19 0x0.0p0 0x1.8539455939403p4 0x1.a84ed73bf6b2ep5 0x0.0p0 F +REG epsg:8044 4 OK 0x1.935b5d4d4e43p20 0x1.a28e27bb24ad2p19 0x0.0p0 0x1.3a8966dfa45e9p5 0x1.a85aed6da9712p5 0x0.0p0 F +REG epsg:8045 0 OK 0x1.3da8e188b88cfp20 0x1.2a92c07e69696p17 0x0.0p0 0x1.105e26617b25bp5 0x1.81ac4aadb6c6ep5 0x0.0p0 F +REG epsg:8045 1 OK 0x1.9228dfa13e201p19 -0x1.ed4fd4c7ce4p18 0x0.0p0 0x1.a89d6ccfd025cp4 0x1.59ab90338fec3p5 0x0.0p0 F +REG epsg:8045 2 OK 0x1.ebeab8617e1fdp20 -0x1.cf5bfc2a9db17p17 0x0.0p0 0x1.4c9dc07a3cf3fp5 0x1.59ac05964d38dp5 0x0.0p0 F +REG epsg:8045 3 OK 0x1.4a55a3faabd78p19 0x1.271ed7b1632dcp19 0x0.0p0 0x1.a89d3a4abc27p4 0x1.a9ab9bf6fa685p5 0x0.0p0 F +REG epsg:8045 4 OK 0x1.921b8a643fdf9p20 0x1.a290ba0a973f9p19 0x0.0p0 0x1.4ca1805746744p5 0x1.a9b7f2abb757dp5 0x0.0p0 F +REG epsg:8058 0 OK 0x1.1bd04p23 0x1.12a88p22 0x0.0p0 0x1.26p7 -0x1.09fffffffffc9p5 0x0.0p0 F +REG epsg:8058 1 OK 0x1.0bcdf33eca366p23 0x1.dfbd6dc44bc32p21 0x0.0p0 0x1.1a0ad8cb2ee1cp7 -0x1.31fffffffffe2p5 0x0.0p0 F +REG epsg:8058 2 OK 0x1.2bd28cc135c9bp23 0x1.dfbd6dc44bc32p21 0x0.0p0 0x1.31f52734d11e4p7 -0x1.31fffffffffe2p5 0x0.0p0 F +REG epsg:8058 3 OK 0x1.09de26210c25dp23 0x1.33798802a3723p22 0x0.0p0 0x1.1a0ad8cb2ee1cp7 -0x1.c3fffffffff54p4 0x0.0p0 F +REG epsg:8058 4 OK 0x1.2dc259def3da4p23 0x1.33798802a3723p22 0x0.0p0 0x1.31f52734d11e4p7 -0x1.c3fffffffff54p4 0x0.0p0 F +REG epsg:8059 0 OK 0x1.e848p19 0x1.e848p20 0x0.0p0 0x1.0ep7 -0x1.fffffffffff7dp4 0x0.0p0 F +REG epsg:8059 1 OK 0x1.71e08ec5b5c48p17 0x1.06bb3ac46168dp20 0x0.0p0 0x1.f6442ba72d213p6 -0x1.3ffffffffffebp5 0x0.0p0 F +REG epsg:8059 2 OK 0x1.ba0bee274948p20 0x1.06bb3ac46168dp20 0x0.0p0 0x1.20ddea2c696f7p7 -0x1.3ffffffffffebp5 0x0.0p0 F +REG epsg:8059 3 OK 0x1.0dae95d7cae9p15 0x1.5b4ca92e8194ap21 0x0.0p0 0x1.f6442ba72d213p6 -0x1.7ffffffffff24p4 0x0.0p0 F +REG epsg:8059 4 OK 0x1.dfda8b5141a96p20 0x1.5b4ca92e8194ap21 0x0.0p0 0x1.20ddea2c696f7p7 -0x1.7ffffffffff24p4 0x0.0p0 F +REG epsg:8065 0 OK 0x1.387ffffffff56p17 0x1.869ffffffffd5p19 0x0.0p0 -0x1.bd9999999999ap6 0x1.01fffffffffc5p5 0x0.0p0 F +REG epsg:8065 1 OK -0x1.ae4ec1fb8028ep20 -0x1.d8c8e96f2f7c9p19 0x0.0p0 -0x1.d53f8ea1e99c1p6 0x1.b3fffffffff49p4 0x0.0p0 F +REG epsg:8065 2 OK 0x1.fdbff69595649p20 -0x1.dad40c18cc4d1p19 0x0.0p0 -0x1.a5f3a49149973p6 0x1.b3fffffffff49p4 0x0.0p0 F +REG epsg:8065 3 OK -0x1.7e64b27b2b8bap20 0x1.4678ed67615c5p21 0x0.0p0 -0x1.d53f8ea1e99c1p6 0x1.29fffffffffdap5 0x0.0p0 F +REG epsg:8065 4 OK 0x1.cb92df6a6e9ep20 0x1.45dde04b1a5edp21 0x0.0p0 -0x1.a5f3a49149973p6 0x1.29fffffffffdap5 0x0.0p0 F +REG epsg:8066 0 OK 0x1.b773fffffffffp20 0x1.e847fffffffffp19 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.f400000000001p4 0x0.0p0 F +REG epsg:8066 1 OK -0x1.d1a6806e52d3p16 -0x1.7a586be66fa1dp19 0x0.0p0 -0x1.d80f968bdab9fp6 0x1.a3ffffffbdbd8p4 0x0.0p0 F +REG epsg:8066 2 OK 0x1.c60134037297ap21 -0x1.7a586be66fa17p19 0x0.0p0 -0x1.a945bec97a9bbp6 0x1.a3ffffffbdbd8p4 0x0.0p0 F +REG epsg:8066 3 OK 0x1.2262cefcbe62p16 0x1.5e91ff8059d6bp21 0x0.0p0 -0x1.d80f968bd2566p6 0x1.21ffffffb74b6p5 0x0.0p0 F +REG epsg:8066 4 OK 0x1.ae60e9881a0dep21 0x1.5e91ff8059d6bp21 0x0.0p0 -0x1.a945bec982ff4p6 0x1.21ffffffb74b6p5 0x0.0p0 F +REG epsg:8067 0 OK 0x1.24f7fffffffffp19 0x0.0p0 0x0.0p0 -0x1.c4aaaaaaaaaadp6 0x1.f8p4 0x0.0p0 F +REG epsg:8067 1 OK -0x1.424a778968d76p20 -0x1.b12fdd6b5305bp20 0x0.0p0 -0x1.dc1f8b62b990bp6 0x1.a7ffffffbb54fp4 0x0.0p0 F +REG epsg:8067 2 OK 0x1.33a13bc4b46b1p21 -0x1.b12fdd6b5305bp20 0x0.0p0 -0x1.ad35c9f29bc4fp6 0x1.a7ffffffbb54fp4 0x0.0p0 F +REG epsg:8067 3 OK -0x1.1292a1a8a8572p20 0x1.c91ad581329bcp20 0x0.0p0 -0x1.dc1f8b62af7dbp6 0x1.23ffffffb4dbap5 0x0.0p0 F +REG epsg:8067 4 OK 0x1.1bc550d4542bp21 0x1.c91ad581329bap20 0x0.0p0 -0x1.ad35c9f2a5d7fp6 0x1.23ffffffb4dbap5 0x0.0p0 F +REG epsg:8068 0 OK 0x1.d4bffffffffffp14 -0x1.2ebbfffffffffp19 0x0.0p0 -0x1.bbp6 0x1.e7fffffffff7p4 0x0.0p0 F +REG epsg:8068 1 OK -0x1.cd6e1fbac7922p20 -0x1.23cdd2ae96b27p21 0x0.0p0 -0x1.d2363b48431d6p6 0x1.97fffffffff35p4 0x0.0p0 F +REG epsg:8068 2 OK 0x1.dc141fbac7935p20 -0x1.23cdd2ae96b27p21 0x0.0p0 -0x1.a3c9c4b7bce2ap6 0x1.97fffffffff35p4 0x0.0p0 F +REG epsg:8068 3 OK -0x1.9fc163df70a9ap20 0x1.3027e9e73de9cp20 0x0.0p0 -0x1.d2363b48431d6p6 0x1.1bfffffffffd3p5 0x0.0p0 F +REG epsg:8068 4 OK 0x1.ae6763df70aabp20 0x1.3027e9e73de9cp20 0x0.0p0 -0x1.a3c9c4b7bce2ap6 0x1.1bfffffffffd3p5 0x0.0p0 F +REG epsg:8082 0 OK 0x1.75d72p24 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG epsg:8082 1 OK 0x1.6d5e9ee9f6764p24 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8082 2 OK 0x1.7e4fa1160989cp24 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8082 3 OK 0x1.6d5e9ee9f6764p24 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8082 4 OK 0x1.7e4fa1160989cp24 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8083 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG epsg:8083 1 OK 0x1.7ca0dee9f6764p24 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8083 2 OK 0x1.8d91e1160989cp24 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa02p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8083 3 OK 0x1.7ca0dee9f6764p24 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8083 4 OK 0x1.8d91e1160989cp24 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa02p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG epsg:8084 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8084 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8084 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8084 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8084 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8086 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8086 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8086 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8086 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8086 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8088 0 OK 0x1.4997p21 0x1.24f8p18 0x0.0p0 -0x1.3p4 0x1.03fffffffffebp6 0x0.0p0 F +REG epsg:8088 1 OK 0x1.340470e6a5277p21 0x1.0d03f55d7296bp17 0x0.0p0 -0x1.68c9f1497133bp4 0x1.fbfffffffffbbp5 0x0.0p0 F +REG epsg:8088 2 OK 0x1.5f298f195ad89p21 0x1.0d03f55d7296bp17 0x0.0p0 -0x1.ee6c1d6d1d98cp3 0x1.fbfffffffffbbp5 0x0.0p0 F +REG epsg:8088 3 OK 0x1.364eff3ce6b6ep21 0x1.cca3f0cac7dd2p18 0x0.0p0 -0x1.68c9f1497133bp4 0x1.09ffffffffff2p6 0x0.0p0 F +REG epsg:8088 4 OK 0x1.5cdf00c319492p21 0x1.cca3f0cac7dd2p18 0x0.0p0 -0x1.ee6c1d6d1d98cp3 0x1.09ffffffffff2p6 0x0.0p0 F +REG epsg:8090 0 OK 0x1.04bf558adab9fp17 0x1.9ce075f6fd22p-8 0x0.0p0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 0x0.0p0 F +REG epsg:8090 1 OK -0x1.cc525347145bap18 -0x1.0349cb12fb857p19 0x0.0p0 -0x1.7d11f2ba24812p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:8090 2 OK 0x1.6888d468f78a4p19 -0x1.0349cb12fb857p19 0x0.0p0 -0x1.44102f67fda12p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:8090 3 OK -0x1.6bc648bcd513p18 0x1.1b58745a8beeep19 0x0.0p0 -0x1.7d11f2b92c85bp6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:8090 4 OK 0x1.3842cf23d7e6p19 0x1.1b58745a8beeep19 0x0.0p0 -0x1.44102f68f59c8p6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:8091 0 OK 0x1.abbc004189377p18 0x1.5810624dd2f1fp-6 0x0.0p0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 0x0.0p0 F +REG epsg:8091 1 OK -0x1.798f41db0c261p20 -0x1.a9573d03a6b0ep20 0x0.0p0 -0x1.7d11f2ba24812p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:8091 2 OK 0x1.27b6a0fde8607p21 -0x1.a9573d03a6b0fp20 0x0.0p0 -0x1.44102f67fda12p6 0x1.4382d82c573c6p5 0x0.0p0 F +REG epsg:8091 3 OK -0x1.2a5ef44dd0e2p20 0x1.d0ce024983fe3p20 0x0.0p0 -0x1.7d11f2b92c85bp6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:8091 4 OK 0x1.001e7a374abe8p21 0x1.d0ce024983fe3p20 0x0.0p0 -0x1.44102f68f59c8p6 0x1.9382d82be7476p5 0x0.0p0 F +REG epsg:8092 0 OK 0x1.d51b70b0f27bbp16 0x1.6627ec84b5dccp16 0x0.0p0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6107p5 0x0.0p0 F +REG epsg:8092 1 OK -0x1.d9a3d91b0d10bp18 -0x1.abda7e6746275p18 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:8092 2 OK 0x1.6218c8b9c3274p19 -0x1.abda7e6746275p18 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:8092 3 OK -0x1.7b59f5351404cp18 0x1.475af140f04a2p19 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:8092 4 OK 0x1.32f3d6c6c6a15p19 0x1.475af140f04a2p19 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:8093 0 OK 0x1.80c4000000006p18 0x1.25c333020c49fp18 0x0.0p0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6107p5 0x0.0p0 F +REG epsg:8093 1 OK -0x1.847bc6b6788bap20 -0x1.5eedd2e086daap20 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:8093 2 OK 0x1.226ee35b3c45fp21 -0x1.5eedd2e086daap20 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.3efa6e86f60f8p5 0x0.0p0 F +REG epsg:8093 3 OK -0x1.3725ad7126e38p20 0x1.0c7fdf2886b9bp21 0x0.0p0 -0x1.8960824bb7f0ap6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:8093 4 OK 0x1.f787ad7126e3ap20 0x1.0c7fdf2886b9bp21 0x0.0p0 -0x1.50ef22ae97b46p6 0x1.8efa6e86f5ab9p5 0x0.0p0 F +REG epsg:8095 0 OK 0x1.9731cf03afb7fp17 0x1.06dee083126e9p17 0x0.0p0 -0x1.68p6 0x1.62e698741787cp5 0x0.0p0 F +REG epsg:8095 1 OK -0x1.827f8f07cd6d6p18 -0x1.8266c5585f04p18 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:8095 2 OK 0x1.8cd8af05be922p19 -0x1.8266c5585f04p18 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:8095 3 OK -0x1.25e0446f01af2p18 0x1.5c1bbc4539243p19 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:8095 4 OK 0x1.5e8909b958b31p19 0x1.5c1bbc4539243p19 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:8096 0 OK 0x1.4dfc000831274p19 0x1.af37a34395812p18 0x0.0p0 -0x1.68p6 0x1.62e698741787cp5 0x0.0p0 F +REG epsg:8096 1 OK -0x1.3d0254d615056p20 -0x1.3cee000e08844p20 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:8096 2 OK 0x1.457f2a6f2315dp21 -0x1.3cee000e08844p20 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.3ae698741786ep5 0x0.0p0 F +REG epsg:8096 3 OK -0x1.e21443e3a60ecp19 0x1.1d857804db046p21 0x0.0p0 -0x1.83f98c2283b1bp6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:8096 4 OK 0x1.1f8310fd0216ep21 0x1.1d857804db046p21 0x0.0p0 -0x1.4c0673dd7c4e6p6 0x1.8ae698741719dp5 0x0.0p0 F +REG epsg:8097 0 OK 0x1.d51b70b0f27bbp16 0x1.601b8474538efp15 0x0.0p0 -0x1.64f7777777778p6 0x1.60e95b7ef36cp5 0x0.0p0 F +REG epsg:8097 1 OK -0x1.d86b56d8a0babp18 -0x1.da0885015e4acp18 0x0.0p0 -0x1.80d2d057ececp6 0x1.38e95b7ef36b3p5 0x0.0p0 F +REG epsg:8097 2 OK 0x1.617c87988cfbbp19 -0x1.da0885015e4c6p18 0x0.0p0 -0x1.491c1e970203p6 0x1.38e95b7ef36b1p5 0x0.0p0 F +REG epsg:8097 3 OK -0x1.7c99a2698b295p18 0x1.304d22046dd32p19 0x0.0p0 -0x1.80d2d057ececp6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:8097 4 OK 0x1.3393ad6102332p19 0x1.304d22046dd2cp19 0x0.0p0 -0x1.491c1e970203p6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:8098 0 OK 0x1.80c4000000006p18 0x1.20cd2ef9db23p17 0x0.0p0 -0x1.64f7777777778p6 0x1.60e95b7ef36cp5 0x0.0p0 F +REG epsg:8098 1 OK -0x1.837b7431606f2p20 -0x1.84ce5908903fap20 0x0.0p0 -0x1.80d2d057ececp6 0x1.38e95b7ef36b3p5 0x0.0p0 F +REG epsg:8098 2 OK 0x1.21eeba18b0373p21 -0x1.84ce59089040ep20 0x0.0p0 -0x1.491c1e970203p6 0x1.38e95b7ef36b1p5 0x0.0p0 F +REG epsg:8098 3 OK -0x1.382be0ffdd4dcp20 0x1.f32e51167dad9p20 0x0.0p0 -0x1.80d2d057ececp6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:8098 4 OK 0x1.f88de0ffdd4d4p20 0x1.f32e51167dacfp20 0x0.0p0 -0x1.491c1e970203p6 0x1.88e95b7ef2f99p5 0x0.0p0 F +REG epsg:8099 0 OK 0x1.695afc467381dp17 0x1.cac083126e979p-8 0x0.0p0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 0x0.0p0 F +REG epsg:8099 1 OK -0x1.96bd1c01e5f5ap18 -0x1.04239a9e5afffp19 0x0.0p0 -0x1.7ecd63d5f17b8p6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:8099 2 OK 0x1.800c0c242cbbbp19 -0x1.04239a9e5afffp19 0x0.0p0 -0x1.47bb24b2970dp6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:8099 3 OK -0x1.3cc7e92063214p18 0x1.1a92c5f516b29p19 0x0.0p0 -0x1.7ecd63d5398f4p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:8099 4 OK 0x1.531172b36b519p19 0x1.1a92c5f516b29p19 0x0.0p0 -0x1.47bb24b34ef92p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:8100 0 OK 0x1.286300189375p19 0x1.78d4fdf3b645ep-6 0x0.0p0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 0x0.0p0 F +REG epsg:8100 1 OK -0x1.4d9c484d931c5p20 -0x1.aabc89e7aeaddp20 0x0.0p0 -0x1.7ecd63d5f17b8p6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:8100 2 OK 0x1.3affa4331348ap21 -0x1.aabc89e7aeaddp20 0x0.0p0 -0x1.47bb24b2970dp6 0x1.335cba979c026p5 0x0.0p0 F +REG epsg:8100 3 OK -0x1.03d38aad3fa4ap20 0x1.cf89bab4daa93p20 0x0.0p0 -0x1.7ecd63d5398f4p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:8100 4 OK 0x1.161b4562e98cdp21 0x1.cf89bab4daa93p20 0x0.0p0 -0x1.47bb24b34ef93p6 0x1.835cba972eecbp5 0x0.0p0 F +REG epsg:8101 0 OK 0x1.97ca35810624ep17 0x1.bda5119ce075fp-9 0x0.0p0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 0x0.0p0 F +REG epsg:8101 1 OK -0x1.7e3515cdba357p18 -0x1.047aa07c5ab2ap19 0x0.0p0 -0x1.7c0e988dd845dp6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:8101 2 OK 0x1.8affa5a7602d2p19 -0x1.047aa07c5ab2ap19 0x0.0p0 -0x1.45be343ef487p6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:8101 3 OK -0x1.26e538ef1f0b2p18 0x1.1a42de674a427p19 0x0.0p0 -0x1.7c0e988d36808p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:8101 4 OK 0x1.5f57b7381298p19 0x1.1a42de674a427p19 0x0.0p0 -0x1.45be343f964c4p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:8102 0 OK 0x1.4e79000831274p19 0x1.6872b020c49bep-7 0x0.0p0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 0x0.0p0 F +REG epsg:8102 1 OK -0x1.397d5ab091e6bp20 -0x1.ab4b4ae48537dp20 0x0.0p0 -0x1.7c0e988dd845dp6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:8102 2 OK 0x1.43fb2d5c6187p21 -0x1.ab4b4ae48537dp20 0x0.0p0 -0x1.45be343ef486fp6 0x1.2c8e38e2cf4dp5 0x0.0p0 F +REG epsg:8102 3 OK -0x1.e3c0571d5c17ap19 0x1.cf06a7126791ep20 0x0.0p0 -0x1.7c0e988d36808p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:8102 4 OK 0x1.202c95cb6f998p21 0x1.cf06a7126791ep20 0x0.0p0 -0x1.45be343f964c4p6 0x1.7c8e38e2656d4p5 0x0.0p0 F +REG epsg:8103 0 OK 0x1.d51b710624dd3p16 0x1.89374bc6a7efap-9 0x0.0p0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 0x0.0p0 F +REG epsg:8103 1 OK -0x1.d55c965a61ff3p18 -0x1.04578ec2d9142p19 0x0.0p0 -0x1.7b90d2587c97cp6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:8103 2 OK 0x1.5ff5276eba378p19 -0x1.04578ec2d9141p19 0x0.0p0 -0x1.44f205d506406p6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:8103 3 OK -0x1.7cf9634edfca9p18 0x1.1a63a98435cf3p19 0x0.0p0 -0x1.7b90d257d20b3p6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:8103 4 OK 0x1.33c38de8f91d2p19 0x1.1a63a98435cf4p19 0x0.0p0 -0x1.44f205d5b0ccep6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:8104 0 OK 0x1.80c4004189379p18 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 0x0.0p0 F +REG epsg:8104 1 OK -0x1.80f96f2a7d12fp20 -0x1.ab11c3adb4ec5p20 0x0.0p0 -0x1.7b90d2587c97cp6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:8104 2 OK 0x1.20adb7a5a0d7ep21 -0x1.ab11c3adb4ec4p20 0x0.0p0 -0x1.44f205d506406p6 0x1.2f582d820e76bp5 0x0.0p0 F +REG epsg:8104 3 OK -0x1.387a6aaf65517p20 0x1.cf3c728f643fap20 0x0.0p0 -0x1.7b90d257d20b3p6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:8104 4 OK 0x1.f8dc6ad029ee1p20 0x1.cf3c728f643fbp20 0x0.0p0 -0x1.44f205d5b0ccep6 0x1.7f582d81a32a1p5 0x0.0p0 F +REG epsg:8105 0 OK 0x1.c9336f212d773p17 0x1.6fe34d8adab9fp17 0x0.0p0 -0x1.6f22222222222p6 0x1.6fb094062376cp5 0x0.0p0 F +REG epsg:8105 1 OK -0x1.6c2280c2b00bp18 -0x1.4c7ace22a5464p18 0x0.0p0 -0x1.8be7808f8d268p6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:8105 2 OK 0x1.9aaaf7f1eec08p19 -0x1.4c7ace22a5464p18 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:8105 3 OK -0x1.0a2eaeb8b35aap18 0x1.76fd86ec520b2p19 0x0.0p0 -0x1.8be7808f8d268p6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:8105 4 OK 0x1.69b10eecf0686p19 0x1.76fd86ec520b2p19 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:8106 0 OK 0x1.7700000000003p19 0x1.2dbea62d0e564p19 0x0.0p0 -0x1.6f22222222222p6 0x1.6fb094062376cp5 0x0.0p0 F +REG epsg:8106 1 OK -0x1.2aaa97cc69254p20 -0x1.10b3df5c16332p20 0x0.0p0 -0x1.8be7808f8d268p6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:8106 2 OK 0x1.50d54be634923p21 -0x1.10b3df5c16332p20 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.47b094062375fp5 0x0.0p0 F +REG epsg:8106 3 OK -0x1.b4a66460f8c9bp19 0x1.3391f8bfb4224p21 0x0.0p0 -0x1.8be7808f8d268p6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:8106 4 OK 0x1.28a999183e321p21 0x1.3391f8bfb4224p21 0x0.0p0 -0x1.525cc3b4b71dcp6 0x1.97b0940623236p5 0x0.0p0 F +REG epsg:8107 0 OK 0x1.c6396ebb98c7ep17 0x1.b1f038ef34d6ap16 0x0.0p0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24cap5 0x0.0p0 F +REG epsg:8107 1 OK -0x1.685535a262b33p18 -0x1.9abf167379d08p18 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:8107 2 OK 0x1.9747522efdbe2p19 -0x1.9abf167379d08p18 0x0.0p0 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:8107 3 OK -0x1.110c5c08825aep18 0x1.4ffe43d1c4353p19 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:8107 4 OK 0x1.6ba2e5620d91ep19 0x1.4ffe43d1c4353p19 0x0.0p0 -0x1.46f74b6659832p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:8108 0 OK 0x1.748f000000003p19 0x1.63eb7c5a1cac4p18 0x0.0p0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24cap5 0x0.0p0 F +REG epsg:8108 1 OK -0x1.278c4a1f90704p20 -0x1.50e5cc63433f5p20 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:8108 2 OK 0x1.4e0da50fc838ap21 -0x1.50e5cc63433f5p20 0x0.0p0 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24bap5 0x0.0p0 F +REG epsg:8108 3 OK -0x1.bfe9b6f85c453p19 0x1.13959deb60c24p21 0x0.0p0 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:8108 4 OK 0x1.2a41edbe1711cp21 0x1.13959deb60c24p21 0x0.0p0 -0x1.46f74b6659832p6 0x1.7d5b0ef1a1bc3p5 0x0.0p0 F +REG epsg:8109 0 OK 0x1.068888d1b7176p17 0x1.894237e90ff97p15 0x0.0p0 -0x1.65f49f49f49f6p6 0x1.709f6cb8f8fb5p5 0x0.0p0 F +REG epsg:8109 1 OK -0x1.cdae7e9edfae1p18 -0x1.d32c135c25565p18 0x0.0p0 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fa8p5 0x0.0p0 F +REG epsg:8109 2 OK 0x1.6a1b83b84b636p19 -0x1.d32c135c25565p18 0x0.0p0 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fa7p5 0x0.0p0 F +REG epsg:8109 3 OK -0x1.6b53714e2f20fp18 0x1.33a69f92aa947p19 0x0.0p0 -0x1.82c98af483fbdp6 0x1.989f6cb8f8a9ep5 0x0.0p0 F +REG epsg:8109 4 OK 0x1.38edfd0ff31cap19 0x1.33a69f92aa947p19 0x0.0p0 -0x1.491fb39f6542dp6 0x1.989f6cb8f8a9dp5 0x0.0p0 F +REG epsg:8110 0 OK 0x1.aeaa000000007p18 0x1.428dd53f7ceddp17 0x0.0p0 -0x1.65f49f49f49f6p6 0x1.709f6cb8f8fb5p5 0x0.0p0 F +REG epsg:8110 1 OK -0x1.7aacd42019f03p20 -0x1.7f2db2a61752p20 0x0.0p0 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fa8p5 0x0.0p0 F +REG epsg:8110 2 OK 0x1.2900ea100cf8bp21 -0x1.7f2db2a61752p20 0x0.0p0 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fa7p5 0x0.0p0 F +REG epsg:8110 3 OK -0x1.2a00c2a4e7d96p20 0x1.f8acf557d772ep20 0x0.0p0 -0x1.82c98af483fbdp6 0x1.989f6cb8f8a9ep5 0x0.0p0 F +REG epsg:8110 4 OK 0x1.00aae15273ed3p21 0x1.f8acf557d772ep20 0x0.0p0 -0x1.491fb39f6542dp6 0x1.989f6cb8f8a9dp5 0x0.0p0 F +REG epsg:8111 0 OK 0x1.b29438f9096bcp17 0x1.73581ed288ce7p15 0x0.0p0 -0x1.6b22222222223p6 0x1.5c99aadeb1d59p5 0x0.0p0 F +REG epsg:8111 1 OK -0x1.738e688136782p18 -0x1.d8148a20610fbp18 0x0.0p0 -0x1.86bd58a47e612p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:8111 2 OK 0x1.931150bd1ff29p19 -0x1.d8148a20610fbp18 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:8111 3 OK -0x1.19743ad9eb41p18 0x1.314ca5906a3c1p19 0x0.0p0 -0x1.86bd58a47e612p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:8111 4 OK 0x1.660439e97a56ep19 0x1.314ca5906a3c1p19 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:8112 0 OK 0x1.6472000000004p19 0x1.3094624dd2f1ep17 0x0.0p0 -0x1.6b22222222223p6 0x1.5c99aadeb1d59p5 0x0.0p0 F +REG epsg:8112 1 OK -0x1.30c0e93d8d6bbp20 -0x1.8334429088efbp20 0x0.0p0 -0x1.86bd58a47e612p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:8112 2 OK 0x1.4a99749ec6b67p21 -0x1.8334429088efbp20 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d47p5 0x0.0p0 F +REG epsg:8112 3 OK -0x1.cdb3adc6dc264p19 0x1.f4d177483417bp20 0x0.0p0 -0x1.86bd58a47e612p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:8112 4 OK 0x1.25a5eb71b70a2p21 0x1.f4d177483417bp20 0x0.0p0 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1586p5 0x0.0p0 F +REG epsg:8113 0 OK 0x1.f5d974f765fd9p17 0x1.0cb295e9e1b09p-8 0x0.0p0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 0x0.0p0 F +REG epsg:8113 1 OK -0x1.5016d1c3f67c4p18 -0x1.043e98ad31b16p19 0x0.0p0 -0x1.88e29dc63dbcdp6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:8113 2 OK 0x1.a2f8235dae3d7p19 -0x1.043e98ad31b15p19 0x0.0p0 -0x1.520c5128b1321p6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:8113 3 OK -0x1.ede3c0912c323p17 0x1.1a7a7294b7b18p19 0x0.0p0 -0x1.88e29dc58cd3cp6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:8113 4 OK 0x1.7665aa9ffe0bdp19 0x1.1a7a7294b7b19p19 0x0.0p0 -0x1.520c5129621b2p6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:8114 0 OK 0x1.9b9f000000005p19 0x1.a9fbe76c8b43dp-7 0x0.0p0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 0x0.0p0 F +REG epsg:8114 1 OK -0x1.13a9c1b326438p20 -0x1.aae8d1497ac1ap20 0x0.0p0 -0x1.88e29dc63dbcdp6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:8114 2 OK 0x1.57a460d993226p21 -0x1.aae8d1497ac19p20 0x0.0p0 -0x1.520c5128b132p6 0x1.3149f49e785dbp5 0x0.0p0 F +REG epsg:8114 3 OK -0x1.9517a855d47dbp19 0x1.cf61d334e211fp20 0x0.0p0 -0x1.88e29dc58cd3cp6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:8114 4 OK 0x1.33156a15752p21 0x1.cf61d334e212p20 0x0.0p0 -0x1.520c5129621b2p6 0x1.8149f49e0c291p5 0x0.0p0 F +REG epsg:8115 0 OK 0x1.6d85c985f06f7p17 0x1.a4e2c0902de01p16 0x0.0p0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc59483p5 0x0.0p0 F +REG epsg:8115 1 OK -0x1.98abeef7cd682p18 -0x1.9bea37c27575p18 0x0.0p0 -0x1.864e48bbb4894p6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:8115 2 OK 0x1.8318dc3edeebdp19 -0x1.9bea37c27575p18 0x0.0p0 -0x1.4d8f95222954ap6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:8115 3 OK -0x1.395dfa625fad8p18 0x1.4f529d3bd26dcp19 0x0.0p0 -0x1.864e48bbb4894p6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:8115 4 OK 0x1.5371e1f4280e7p19 0x1.4f529d3bd26dcp19 0x0.0p0 -0x1.4d8f95222954ap6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:8116 0 OK 0x1.2bce000000004p19 0x1.5936c8b439585p18 0x0.0p0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc59483p5 0x0.0p0 F +REG epsg:8116 1 OK -0x1.4f32242b459d3p20 -0x1.51db25bcc06cap20 0x0.0p0 -0x1.864e48bbb4894p6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:8116 2 OK 0x1.3d801215a2cecp21 -0x1.51db25bcc06cap20 0x0.0p0 -0x1.4d8f95222954ap6 0x1.416c2dfc59477p5 0x0.0p0 F +REG epsg:8116 3 OK -0x1.0106bc2567146p20 0x1.1308d3d7cc8dep21 0x0.0p0 -0x1.864e48bbb4894p6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:8116 4 OK 0x1.166a5e12b38a5p21 0x1.1308d3d7cc8dep21 0x0.0p0 -0x1.4d8f95222954ap6 0x1.916c2dfc58e8ap5 0x0.0p0 F +REG epsg:8117 0 OK 0x1.43415d77318fcp17 0x1.5182a9930be0ep-7 0x0.0p0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:8117 1 OK -0x1.aac3f1731db3p18 -0x1.03e30b35198a9p19 0x0.0p0 -0x1.8e5a81caab159p6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8117 2 OK 0x1.7702a77527a0bp19 -0x1.03e30b35198a9p19 0x0.0p0 -0x1.56b68f4665fbap6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8117 3 OK -0x1.4ed863b34f177p18 0x1.1acdfb58528d1p19 0x0.0p0 -0x1.8e5a81c9e17c7p6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8117 4 OK 0x1.490ce09540531p19 0x1.1acdfb58528dp19 0x0.0p0 -0x1.56b68f472f94cp6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8118 0 OK 0x1.0922ffe76c8b7p19 0x1.16872b020c49dp-5 0x0.0p0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:8118 1 OK -0x1.5e095aaf305c4p20 -0x1.aa52a20fbfdfbp20 0x0.0p0 -0x1.8e5a81caab159p6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8118 2 OK 0x1.33962d4b4e735p21 -0x1.aa52a20fbfdfcp20 0x0.0p0 -0x1.56b68f4665fbap6 0x1.3849f49e5971p5 0x0.0p0 F +REG epsg:8118 3 OK -0x1.12a493e9eba54p20 0x1.cfeadb23f9a88p20 0x0.0p0 -0x1.8e5a81c9e17c7p6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8118 4 OK 0x1.0de3c9e8ac17fp21 0x1.cfeadb23f9a87p20 0x0.0p0 -0x1.56b68f472f94cp6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8119 0 OK 0x1.004854d1b7176p18 0x1.3a92a30553261p-7 0x0.0p0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:8119 1 OK -0x1.4c1b629b5911cp18 -0x1.03e2a46c7e3cbp19 0x0.0p0 -0x1.7e3e10038ea3cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8119 2 OK 0x1.a656061f63a04p19 -0x1.03e2a46c7e3cbp19 0x0.0p0 -0x1.469a1d7f4989cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8119 3 OK -0x1.e05ff2704c828p17 0x1.1acd8b7367d15p19 0x0.0p0 -0x1.7e3e1002c50aap6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8119 4 OK 0x1.7860516dca38p19 0x1.1acd8b7367d15p19 0x0.0p0 -0x1.469a1d801322ep6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8120 0 OK 0x1.a469000831275p19 0x1.fbe76c8b4395ep-6 0x0.0p0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 0x0.0p0 F +REG epsg:8120 1 OK -0x1.10659bb62892ap20 -0x1.aa51f976fe00bp20 0x0.0p0 -0x1.7e3e10038ea3cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8120 2 OK 0x1.5a674ddf2cddp21 -0x1.aa51f976fe00bp20 0x0.0p0 -0x1.469a1d7f4989cp6 0x1.3849f49e59711p5 0x0.0p0 F +REG epsg:8120 3 OK -0x1.8a01e587c6dafp19 0x1.cfea23937eb12p20 0x0.0p0 -0x1.7e3e1002c50aap6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8120 4 OK 0x1.34b4f9660a4a6p21 0x1.cfea23937eb12p20 0x0.0p0 -0x1.469a1d801322ep6 0x1.8849f49deaabdp5 0x0.0p0 F +REG epsg:8121 0 OK 0x1.a7449de69ad43p17 0x1.d79e29c0ebeep16 0x0.0p0 -0x1.6c77777777777p6 0x1.6f33672c63c8ap5 0x0.0p0 F +REG epsg:8121 1 OK -0x1.7d00ec2c752e2p18 -0x1.8e948d3b9d15ap18 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.4733672c63c7dp5 0x0.0p0 F +REG epsg:8121 2 OK 0x1.9222c50988009p19 -0x1.8e948d3b9d15ap18 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c7fp5 0x0.0p0 F +REG epsg:8121 3 OK -0x1.1b427357767fep18 0x1.55f2f09254a3p19 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:8121 4 OK 0x1.6143889f08a98p19 0x1.55f2f09254a3p19 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:8122 0 OK 0x1.5b2b000831274p19 0x1.82d32ab020c4cp18 0x0.0p0 -0x1.6c77777777777p6 0x1.6f33672c63c8ap5 0x0.0p0 F +REG epsg:8122 1 OK -0x1.388098bea5b31p20 -0x1.46eb3ae06f96cp20 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.4733672c63c7dp5 0x0.0p0 F +REG epsg:8122 2 OK 0x1.49d5cc636b6cap21 -0x1.46eb3ae06f96cp20 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c7fp5 0x0.0p0 F +REG epsg:8122 3 OK -0x1.d0a9e9c8003acp19 0x1.18782af95842cp21 0x0.0p0 -0x1.8934b933d2a2cp6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:8122 4 OK 0x1.21bffa7618a1ep21 0x1.18782af95842cp21 0x0.0p0 -0x1.4fba35bb1c4c2p6 0x1.9733672c63746p5 0x0.0p0 F +REG epsg:8123 0 OK 0x1.6a8bc92a30553p17 0x1.4e3bcd35a8588p-8 0x0.0p0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 0x0.0p0 F +REG epsg:8123 1 OK -0x1.9536b2b54e22ep18 -0x1.046194bba6a3p19 0x0.0p0 -0x1.82ddd6c83504ap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:8123 2 OK 0x1.7fe13defbf3c1p19 -0x1.046194bba6a3p19 0x0.0p0 -0x1.4c555c6afe2eap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:8123 3 OK -0x1.3d21adec777d8p18 0x1.1a5a6af07077fp19 0x0.0p0 -0x1.82ddd6c78cfe2p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:8123 4 OK 0x1.53d6bb8b53e96p19 0x1.1a5a6af07077fp19 0x0.0p0 -0x1.4c555c6ba6352p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:8124 0 OK 0x1.295d000831272p19 0x1.16872b020c49fp-6 0x0.0p0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 0x0.0p0 F +REG epsg:8124 1 OK -0x1.4c5c10572acd1p20 -0x1.ab2234f0987dep20 0x0.0p0 -0x1.82ddd6c83504ap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:8124 2 OK 0x1.3adc882fadfa2p21 -0x1.ab2234f0987dep20 0x0.0p0 -0x1.4c555c6afe2eap6 0x1.2e8e38e2c79eep5 0x0.0p0 F +REG epsg:8124 3 OK -0x1.041d2bb90d17ep20 0x1.cf2d48639fc27p20 0x0.0p0 -0x1.82ddd6c78cfe2p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:8124 4 OK 0x1.16bd15e09f1f8p21 0x1.cf2d48639fc27p20 0x0.0p0 -0x1.4c555c6ba6352p6 0x1.7e8e38e25cb5bp5 0x0.0p0 F +REG epsg:8125 0 OK 0x1.e9590cf765fd9p17 0x1.7f62b6ae7d567p-6 0x0.0p0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 0x0.0p0 F +REG epsg:8125 1 OK -0x1.578a36f9ccec8p18 -0x1.03f0393788d8ep19 0x0.0p0 -0x1.880842b7d2355p6 0x1.375b05af6ee02p5 0x0.0p0 F +REG epsg:8125 2 OK 0x1.a071a1f899746p19 -0x1.03f0393788d8fp19 0x0.0p0 -0x1.508045d0b6534p6 0x1.375b05af6ee01p5 0x0.0p0 F +REG epsg:8125 3 OK -0x1.f7fcac29c8b7fp17 0x1.1ac39889f4be7p19 0x0.0p0 -0x1.880842b70c12bp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:8125 4 OK 0x1.72abb186252c4p19 0x1.1ac39889f4be6p19 0x0.0p0 -0x1.508045d17c75dp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:8126 0 OK 0x1.915e000831274p19 0x1.3b645a1cac087p-4 0x0.0p0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 0x0.0p0 F +REG epsg:8126 1 OK -0x1.19c637dc1e43dp20 -0x1.aa6840d7b5e6bp20 0x0.0p0 -0x1.880842b7d2355p6 0x1.375b05af6ee02p5 0x0.0p0 F +REG epsg:8126 2 OK 0x1.55921bf227b5p21 -0x1.aa6840d7b5e6cp20 0x0.0p0 -0x1.508045d0b6534p6 0x1.375b05af6ee01p5 0x0.0p0 F +REG epsg:8126 3 OK -0x1.9d5fd4aa8b666p19 0x1.cfd9d1974b6e1p20 0x0.0p0 -0x1.880842b70c12bp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:8126 4 OK 0x1.3006f52ebb6cdp21 0x1.cfd9d1974b6dfp20 0x0.0p0 -0x1.508045d17c75dp6 0x1.875b05af00608p5 0x0.0p0 F +REG epsg:8127 0 OK 0x1.1dc02573eab36p17 0x1.bda5119ce075fp-8 0x0.0p0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 0x0.0p0 F +REG epsg:8127 1 OK -0x1.ba4841a4ee0efp18 -0x1.04b889bc83dc5p19 0x0.0p0 -0x1.7f2d96ac7178ep6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:8127 2 OK 0x1.6c04338c6c612p19 -0x1.04b889bc83dc5p19 0x0.0p0 -0x1.4966529222706p6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:8127 3 OK -0x1.64de52cff310bp18 0x1.1a08fcf12540dp19 0x0.0p0 -0x1.7f2d96abde7c9p6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:8127 4 OK 0x1.414f3c21eee2p19 0x1.1a08fcf12540dp19 0x0.0p0 -0x1.49665292b56ccp6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:8128 0 OK 0x1.d4c0000000005p18 0x1.6872b020c49bep-6 0x0.0p0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 0x0.0p0 F +REG epsg:8128 1 OK -0x1.6ac37a88ebe91p20 -0x1.abb0da452000cp20 0x0.0p0 -0x1.7f2d96ac7178ep6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:8128 2 OK 0x1.2a91bd4475f4ap21 -0x1.abb0da452000cp20 0x0.0p0 -0x1.4966529222706p6 0x1.278e38e2e13f5p5 0x0.0p0 F +REG epsg:8128 3 OK -0x1.24b4dbb5a5829p20 0x1.cea7b442343e4p20 0x0.0p0 -0x1.7f2d96abde7c9p6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:8128 4 OK 0x1.078a6ddad2c16p21 0x1.cea7b442343e4p20 0x0.0p0 -0x1.49665292b56ccp6 0x1.778e38e27a415p5 0x0.0p0 F +REG epsg:8129 0 OK 0x1.8b49cd6a161e5p17 0x1.0637b6703afb8p17 0x0.0p0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5853p5 0x0.0p0 F +REG epsg:8129 1 OK -0x1.86ce3575b312ap18 -0x1.83987aff1de7cp18 0x0.0p0 -0x1.8536a29c21962p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:8129 2 OK 0x1.890c016fe4987p19 -0x1.83987aff1de7cp18 0x0.0p0 -0x1.4e3b24805031p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:8129 3 OK -0x1.2d7f899379c82p18 0x1.5b8c7c4faf86dp19 0x0.0p0 -0x1.8536a29c21962p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:8129 4 OK 0x1.5c64ab7ec7f33p19 0x1.5b8c7c4faf86dp19 0x0.0p0 -0x1.4e3b24805031p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:8130 0 OK 0x1.4438000000002p19 0x1.ae256b3333337p18 0x0.0p0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5853p5 0x0.0p0 F +REG epsg:8130 1 OK -0x1.408abbf4c3bc4p20 -0x1.3de8bee6cb8b9p20 0x0.0p0 -0x1.8536a29c21962p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:8130 2 OK 0x1.42615dfa61de3p21 -0x1.3de8bee6cb8b9p20 0x0.0p0 -0x1.4e3b24805031p6 0x1.329418ccd5844p5 0x0.0p0 F +REG epsg:8130 3 OK -0x1.ee9529420df82p19 0x1.1d0ff960e10c5p21 0x0.0p0 -0x1.8536a29c21962p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:8130 4 OK 0x1.1dc14a50837e2p21 0x1.1d0ff960e10c5p21 0x0.0p0 -0x1.4e3b24805031p6 0x1.829418ccd502fp5 0x0.0p0 F +REG epsg:8131 0 OK 0x1.bd4b6d6388659p17 0x1.652bd3c361134p-7 0x0.0p0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 0x0.0p0 F +REG epsg:8131 1 OK -0x1.6e99181568eep18 -0x1.03acc198edac6p19 0x0.0p0 -0x1.8605e05127959p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:8131 2 OK 0x1.95f242bc78a92p19 -0x1.03acc198edac7p19 0x0.0p0 -0x1.4de35e42c1a92p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:8131 3 OK -0x1.10fd18c5193f6p18 0x1.1b0237a3e9416p19 0x0.0p0 -0x1.8605e0504ddf4p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:8131 4 OK 0x1.6724431450d2p19 0x1.1b0237a3e9416p19 0x0.0p0 -0x1.4de35e439b5f6p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:8132 0 OK 0x1.6d3bffd70a3dbp19 0x1.26e978d4fdf3ep-5 0x0.0p0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 0x0.0p0 F +REG epsg:8132 1 OK -0x1.2cafcf1efe228p20 -0x1.a9f994309b935p20 0x0.0p0 -0x1.8605e05127959p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:8132 2 OK 0x1.4cf5e77b042fap21 -0x1.a9f994309b936p20 0x0.0p0 -0x1.4de35e42c1a92p6 0x1.3c71c71b6cd7ap5 0x0.0p0 F +REG epsg:8132 3 OK -0x1.bfd0ad72ab0d3p19 0x1.d0408b46ed888p20 0x0.0p0 -0x1.8605e0504ddf4p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:8132 4 OK 0x1.26922b482fe1cp21 0x1.d0408b46ed887p20 0x0.0p0 -0x1.4de35e439b5f6p6 0x1.8c71c71afd27fp5 0x0.0p0 F +REG epsg:8133 0 OK 0x1.b88839c0ebeep15 0x1.86cc5ff2e48e9p15 0x0.0p0 -0x1.66p6 0x1.6355a7cef00d3p5 0x0.0p0 F +REG epsg:8133 1 OK -0x1.0b8eb5d7600a9p19 -0x1.d4f07d46fa58fp18 0x0.0p0 -0x1.82002f8de16p6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:8133 2 OK 0x1.429fbd0f7d88fp19 -0x1.d4f07d46fa58fp18 0x0.0p0 -0x1.49ffd0721eap6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:8133 3 OK -0x1.ba5120de4adf2p18 0x1.32d5f860daa36p19 0x0.0p0 -0x1.82002f8de16p6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:8133 4 OK 0x1.143997a742edcp19 0x1.32d5f860daa36p19 0x0.0p0 -0x1.49ffd0721eap6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:8134 0 OK 0x1.6954000000004p17 0x1.40893ae147ae4p17 0x0.0p0 -0x1.66p6 0x1.6355a7cef00d3p5 0x0.0p0 F +REG epsg:8134 1 OK -0x1.b6e7dd488ecep20 -0x1.80a0c5787fe0cp20 0x0.0p0 -0x1.82002f8de16p6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:8134 2 OK 0x1.089e6ea447679p21 -0x1.80a0c5787fe0cp20 0x0.0p0 -0x1.49ffd0721eap6 0x1.3b55a7cef00c1p5 0x0.0p0 F +REG epsg:8134 3 OK -0x1.6acac169d87bp20 0x1.f756ae2aad9ccp20 0x0.0p0 -0x1.82002f8de16p6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:8134 4 OK 0x1.c51fc169d87bcp20 0x1.f756ae2aad9ccp20 0x0.0p0 -0x1.49ffd0721eap6 0x1.8b55a7ceefa03p5 0x0.0p0 F +REG epsg:8135 0 OK 0x1.14d224226809dp17 0x1.82a9930be0dedp-8 0x0.0p0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 0x0.0p0 F +REG epsg:8135 1 OK -0x1.c2fe719720de6p18 -0x1.039fc650f90b9p19 0x0.0p0 -0x1.8ea6db5813a72p6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:8135 2 OK 0x1.6be84adcc4741p19 -0x1.039fc650f90b9p19 0x0.0p0 -0x1.566a35b8fd6ap6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:8135 3 OK -0x1.650a46f6016p18 0x1.1b0af2e2be075p19 0x0.0p0 -0x1.8ea6db5736856p6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:8135 4 OK 0x1.3cee358c34b4fp19 0x1.1b0af2e2be075p19 0x0.0p0 -0x1.566a35b9da8bcp6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:8136 0 OK 0x1.c619ffbe76c91p18 0x1.374bc6a7ef9dep-6 0x0.0p0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 0x0.0p0 F +REG epsg:8136 1 OK -0x1.71e8b265b44dep20 -0x1.a9e448a23cdf8p20 0x0.0p0 -0x1.8ea6db5813a72p6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:8136 2 OK 0x1.2a7ad92277d93p21 -0x1.a9e448a23cdf8p20 0x0.0p0 -0x1.566a35b8fd6ap6 0x1.3d49f49e40ab1p5 0x0.0p0 F +REG epsg:8136 3 OK -0x1.24d8e8d1a8129p20 0x1.d04ede005b495p20 0x0.0p0 -0x1.8ea6db5736856p6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:8136 4 OK 0x1.03f2f45871bb9p21 0x1.d04ede005b495p20 0x0.0p0 -0x1.566a35b9da8bcp6 0x1.8d49f49dd0dc2p5 0x0.0p0 F +REG epsg:8137 0 OK 0x1.476c2aee631f9p17 0x1.5011166cf41f2p16 0x0.0p0 -0x1.70e93e93e93e9p6 0x1.6516d538431b3p5 0x0.0p0 F +REG epsg:8137 1 OK -0x1.aad27924e0d92p18 -0x1.b194ef42f9db4p18 0x0.0p0 -0x1.8d04788047198p6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:8137 2 OK 0x1.791f5209a1fdp19 -0x1.b194ef42f9db4p18 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:8137 3 OK -0x1.4d4f332b7e4fap18 0x1.4480bafa7501ap19 0x0.0p0 -0x1.8d04788047198p6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:8137 4 OK 0x1.4a5daf0cf0b82p19 0x1.4480bafa7501ap19 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:8138 0 OK 0x1.0c8e000000004p19 0x1.13a50e353f7d2p18 0x0.0p0 -0x1.70e93e93e93e9p6 0x1.6516d538431b3p5 0x0.0p0 F +REG epsg:8138 1 OK -0x1.5e15459c10981p20 -0x1.63a09c5818c62p20 0x0.0p0 -0x1.8d04788047198p6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:8138 2 OK 0x1.3551a2ce084cbp21 -0x1.63a09c5818c62p20 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.3d16d538431a5p5 0x0.0p0 F +REG epsg:8138 3 OK -0x1.11621496ee39fp20 0x1.0a28f21c7fc1fp21 0x0.0p0 -0x1.8d04788047198p6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:8138 4 OK 0x1.0ef80a4b771d8p21 0x1.0a28f21c7fc1fp21 0x0.0p0 -0x1.54ce04a78b63ap6 0x1.8d16d53842b25p5 0x0.0p0 F +REG epsg:8139 0 OK 0x1.11d823dd97f63p16 0x1.c1e811b71758ep15 0x0.0p0 -0x1.662d82d82d82dp6 0x1.6da240127344dp5 0x0.0p0 F +REG epsg:8139 1 OK -0x1.05ed37b183f43p19 -0x1.cc6e4589dcac8p18 0x0.0p0 -0x1.82d0f2681f152p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:8139 2 OK 0x1.4a6340a8e9f24p19 -0x1.cc6e4589dcac8p18 0x0.0p0 -0x1.498a13483bf08p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:8139 3 OK -0x1.aac6a5cabeafdp18 0x1.370a8d6e4d9d1p19 0x0.0p0 -0x1.82d0f2681f152p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:8139 4 OK 0x1.19d95bdcc555fp19 0x1.370a8d6e4d9d1p19 0x0.0p0 -0x1.498a13483bf08p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:8140 0 OK 0x1.c138000000005p17 0x1.71045f3b645a6p17 0x0.0p0 -0x1.662d82d82d82dp6 0x1.6da240127344dp5 0x0.0p0 F +REG epsg:8140 1 OK -0x1.adab3731d9d1fp20 -0x1.79a62dd40e781p20 0x0.0p0 -0x1.82d0f2681f152p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:8140 2 OK 0x1.0efc9b98ece98p21 -0x1.79a62dd40e781p20 0x0.0p0 -0x1.498a13483bf08p6 0x1.45a240127343ep5 0x0.0p0 F +REG epsg:8140 3 OK -0x1.5e0b9289cc454p20 0x1.fe3cb94b150cep20 0x0.0p0 -0x1.82d0f2681f152p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:8140 4 OK 0x1.ce599289cc462p20 0x1.fe3cb94b150cep20 0x0.0p0 -0x1.498a13483bf08p6 0x1.95a2401272edbp5 0x0.0p0 F +REG epsg:8141 0 OK 0x1.65302f0d844dp17 0x1.b089a02752546p-9 0x0.0p0 -0x1.5fa2222222224p6 0x1.632d82d82d82dp5 0x0.0p0 F +REG epsg:8141 1 OK -0x1.9a5ed5e9b58aep18 -0x1.03bb3cb394d1cp19 0x0.0p0 -0x1.7b9feada051ccp6 0x1.3b2d82d72ef93p5 0x0.0p0 F +REG epsg:8141 2 OK 0x1.7fc7827b9cec8p19 -0x1.03bb3cb394d1bp19 0x0.0p0 -0x1.43a4596a3f27ap6 0x1.3b2d82d72ef92p5 0x0.0p0 F +REG epsg:8141 3 OK -0x1.3d4840ed1e587p18 0x1.1aefd5078d5cap19 0x0.0p0 -0x1.7b9fead9306fap6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:8141 4 OK 0x1.513c37fd51533p19 0x1.1aefd5078d5cbp19 0x0.0p0 -0x1.43a4596b13d4cp6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:8142 0 OK 0x1.24f8003126e9bp19 0x1.6872b020c49bep-7 0x0.0p0 -0x1.5fa2222222224p6 0x1.632d82d82d82dp5 0x0.0p0 F +REG epsg:8142 1 OK -0x1.5096da0382c56p20 -0x1.aa115562e453ep20 0x0.0p0 -0x1.7b9feada051ccp6 0x1.3b2d82d72ef93p5 0x0.0p0 F +REG epsg:8142 2 OK 0x1.3ac76d1a54d8p21 -0x1.aa115562e453dp20 0x0.0p0 -0x1.43a4596a3f27ap6 0x1.3b2d82d72ef92p5 0x0.0p0 F +REG epsg:8142 3 OK -0x1.043ccf47bf4aap20 0x1.d022627926d6ep20 0x0.0p0 -0x1.7b9fead9306fap6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:8142 4 OK 0x1.149a67bc731a8p21 0x1.d022627926d6fp20 0x0.0p0 -0x1.43a4596b13d4cp6 0x1.8b2d82d6bf834p5 0x0.0p0 F +REG epsg:8143 0 OK 0x1.8f749ac083127p17 0x1.dc43fc710cb29p16 0x0.0p0 -0x1.6a91111111112p6 0x1.600026c287bb7p5 0x0.0p0 F +REG epsg:8143 1 OK -0x1.85ca2c1c8b03ep18 -0x1.8f141ebf767cep18 0x0.0p0 -0x1.865eb68f209b9p6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:8143 2 OK 0x1.8a9f636e870bcp19 -0x1.8f141ebf767cep18 0x0.0p0 -0x1.4ec36b930186bp6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:8143 3 OK -0x1.2a55e9105d96p18 0x1.55c917514282dp19 0x0.0p0 -0x1.865eb68f209b9p6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:8143 4 OK 0x1.5ce541e87054cp19 0x1.55c917514282dp19 0x0.0p0 -0x1.4ec36b930186bp6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:8144 0 OK 0x1.47a3000000004p19 0x1.86a311cac0838p18 0x0.0p0 -0x1.6a91111111112p6 0x1.600026c287bb7p5 0x0.0p0 F +REG epsg:8144 1 OK -0x1.3fb57337e86a6p20 -0x1.4753dcd78f242p20 0x0.0p0 -0x1.865eb68f209b9p6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:8144 2 OK 0x1.43ac399bf435cp21 -0x1.4753dcd78f242p20 0x0.0p0 -0x1.4ec36b930186bp6 0x1.380026c287ba8p5 0x0.0p0 F +REG epsg:8144 3 OK -0x1.e965091740c2cp19 0x1.1855d7dfbc9dap21 0x0.0p0 -0x1.865eb68f209b9p6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:8144 4 OK 0x1.1e2ac245d0314p21 0x1.1855d7dfbc9dap21 0x0.0p0 -0x1.4ec36b930186bp6 0x1.880026c28746cp5 0x0.0p0 F +REG epsg:8145 0 OK 0x1.9bf50318fc505p16 0x1.7c1bda5119cep-9 0x0.0p0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:8145 1 OK -0x1.e68061f799535p18 -0x1.0399339082507p19 0x0.0p0 -0x1.7dcfe5d3a9d01p6 0x1.3dbbbbbab0208p5 0x0.0p0 F +REG epsg:8145 2 OK 0x1.5a3d71c20bbdcp19 -0x1.0399339082507p19 0x0.0p0 -0x1.45856f81ab855p6 0x1.3dbbbbbab0208p5 0x0.0p0 F +REG epsg:8145 3 OK -0x1.885d94ec31b8fp18 0x1.1b0fdc1f700b8p19 0x0.0p0 -0x1.7dcfe5d2cadc4p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:8145 4 OK 0x1.2b2c0b3c57f09p19 0x1.1b0fdc1f700b8p19 0x0.0p0 -0x1.45856f828a791p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:8146 0 OK 0x1.51e400418937ap18 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:8146 1 OK -0x1.8f08572d9197ep20 -0x1.a9d98034c5d39p20 0x0.0p0 -0x1.7dcfe5d3a9dp6 0x1.3dbbbbbab0207p5 0x0.0p0 F +REG epsg:8146 2 OK 0x1.1bfd2ba72b19dp21 -0x1.a9d98034c5d39p20 0x0.0p0 -0x1.45856f81ab856p6 0x1.3dbbbbbab0207p5 0x0.0p0 F +REG epsg:8146 3 OK -0x1.41d24d9cb1ca4p20 0x1.d056ec68554afp20 0x0.0p0 -0x1.7dcfe5d2cadc4p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:8146 4 OK 0x1.eac44dbd76662p20 0x1.d056ec68554afp20 0x0.0p0 -0x1.45856f828a791p6 0x1.8dbbbbba40438p5 0x0.0p0 F +REG epsg:8147 0 OK 0x1.d22170902de01p17 0x1.a36e2eb1c432dp-9 0x0.0p0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 0x0.0p0 F +REG epsg:8147 1 OK -0x1.64608c21b9732p18 -0x1.039b19bb3e0cfp19 0x0.0p0 -0x1.7afa4c47993bap6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:8147 2 OK 0x1.9b40fe58f3a99p19 -0x1.039b19bb3e0cfp19 0x0.0p0 -0x1.42b60ebe171f6p6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:8147 3 OK -0x1.06532093fb738p18 0x1.1b0c7e0469502p19 0x0.0p0 -0x1.7afa4c46bb1ap6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:8147 4 OK 0x1.6c3a489214a9cp19 0x1.1b0c7e0469502p19 0x0.0p0 -0x1.42b60ebef540fp6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:8148 0 OK 0x1.7e5300395810ap19 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 0x0.0p0 F +REG epsg:8148 1 OK -0x1.244db214c8c1ap20 -0x1.a9dc9dbcfc17ep20 0x0.0p0 -0x1.7afa4c47993bap6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:8148 2 OK 0x1.5150592710692p21 -0x1.a9dc9dbcfc17ep20 0x0.0p0 -0x1.42b60ebe171f6p6 0x1.3d8888877df91p5 0x0.0p0 F +REG epsg:8148 3 OK -0x1.ae5263d610c4ep19 0x1.d051662df0cd4p20 0x0.0p0 -0x1.7afa4c46bb1ap6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:8148 4 OK 0x1.2abe191230398p21 0x1.d051662df0cd4p20 0x0.0p0 -0x1.42b60ebef540fp6 0x1.8d8888870e223p5 0x0.0p0 F +REG epsg:8149 0 OK 0x1.23b4263886595p16 0x1.ae1288a71de6ap15 0x0.0p0 -0x1.67147ae147ae1p6 0x1.67350d60e1d95p5 0x0.0p0 F +REG epsg:8149 1 OK -0x1.030632e367b78p19 -0x1.cf9e290f75471p18 0x0.0p0 -0x1.8350c33b464acp6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:8149 2 OK 0x1.4bf33c71894dep19 -0x1.cf9e290f75471p18 0x0.0p0 -0x1.4ad8328749117p6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:8149 3 OK -0x1.a7a9e0ab10d89p18 0x1.357b474d8189dp19 0x0.0p0 -0x1.8350c33b464acp6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:8149 4 OK 0x1.1cc1f9e3aa02ap19 0x1.357b474d8189dp19 0x0.0p0 -0x1.4ad8328749117p6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:8150 0 OK 0x1.de84000000005p17 0x1.60bfbc28f5c2dp17 0x0.0p0 -0x1.67147ae147ae1p6 0x1.67350d60e1d95p5 0x0.0p0 F +REG epsg:8150 1 OK -0x1.a8e85af122ea4p20 -0x1.7c4360b717bb6p20 0x0.0p0 -0x1.8350c33b464acp6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:8150 2 OK 0x1.1044ad7891753p21 -0x1.7c4360b717bb6p20 0x0.0p0 -0x1.4ad8328749117p6 0x1.3f350d60e1d85p5 0x0.0p0 F +REG epsg:8150 3 OK -0x1.5b7e0e15d8c7ap20 0x1.fbadbf8772c5cp20 0x0.0p0 -0x1.8350c33b464acp6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:8150 4 OK 0x1.d31f0e15d8c7cp20 0x1.fbadbf8772c5cp20 0x0.0p0 -0x1.4ad8328749117p6 0x1.8f350d60e1751p5 0x0.0p0 F +REG epsg:8151 0 OK 0x1.c5a10844d013bp16 0x1.7c1bda5119cep-8 0x0.0p0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 0x0.0p0 F +REG epsg:8151 1 OK -0x1.dc4e76dca4bb1p18 -0x1.038caff499374p19 0x0.0p0 -0x1.832420d024786p6 0x1.3ec16c15b0684p5 0x0.0p0 F +REG epsg:8151 2 OK 0x1.5f8f7d7f86631p19 -0x1.038caff499374p19 0x0.0p0 -0x1.4ab9bd0db9658p6 0x1.3ec16c15b0684p5 0x0.0p0 F +REG epsg:8151 3 OK -0x1.7dbf1888db8f5p18 0x1.1b1e1620786fep19 0x0.0p0 -0x1.832420cf4146cp6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:8151 4 OK 0x1.3047ce55a1cd2p19 0x1.1b1e1620786ffp19 0x0.0p0 -0x1.4ab9bd0e9c972p6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:8152 0 OK 0x1.7412000000003p18 0x1.374bc6a7ef9dep-6 0x0.0p0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 0x0.0p0 F +REG epsg:8152 1 OK -0x1.86aba9eb9dfe9p20 -0x1.a9c4f8f5f2bf1p20 0x0.0p0 -0x1.832420d024786p6 0x1.3ec16c15b0684p5 0x0.0p0 F +REG epsg:8152 2 OK 0x1.205a54f5ceffdp21 -0x1.a9c4f8f5f2bfp20 0x0.0p0 -0x1.4ab9bd0db9658p6 0x1.3ec16c15b0685p5 0x0.0p0 F +REG epsg:8152 3 OK -0x1.391c941285a1ep20 0x1.d06e42cdae293p20 0x0.0p0 -0x1.832420cf4146cp6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:8152 4 OK 0x1.f325941285a2ep20 0x1.d06e42cdae294p20 0x0.0p0 -0x1.4ab9bd0e9c972p6 0x1.8ec16c1540712p5 0x0.0p0 F +REG epsg:8153 0 OK 0x1.838c99374bc6ap17 0x1.9b3fc86c22681p16 0x0.0p0 -0x1.6422222222222p6 0x1.693be0a9d7fabp5 0x0.0p0 F +REG epsg:8153 1 OK -0x1.8d9f0460290e3p18 -0x1.9e58b263b048ap18 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:8153 2 OK 0x1.8895cecbba6a6p19 -0x1.9e58b263b048ap18 0x0.0p0 -0x1.47c5ca068267bp6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:8153 3 OK -0x1.2e651e043498ap18 0x1.4e1c176750b6dp19 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:8153 4 OK 0x1.58f8db9dc02fap19 0x1.4e1c176750b6dp19 0x0.0p0 -0x1.47c5ca068267bp6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:8154 0 OK 0x1.3ddf000000004p19 0x1.514f5af1a9fbfp18 0x0.0p0 -0x1.6422222222222p6 0x1.693be0a9d7fabp5 0x0.0p0 F +REG epsg:8154 1 OK -0x1.4621d72b8c752p20 -0x1.53d9b5bb18902p20 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:8154 2 OK 0x1.42006b95c63abp21 -0x1.53d9b5bb18902p20 0x0.0p0 -0x1.47c5ca068267bp6 0x1.413be0a9d7f9fp5 0x0.0p0 F +REG epsg:8154 3 OK -0x1.f00dc48fd386cp19 0x1.120a22578a9dfp21 0x0.0p0 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:8154 4 OK 0x1.1af2f123f4e1dp21 0x1.120a22578a9dfp21 0x0.0p0 -0x1.47c5ca068267bp6 0x1.913be0a9d79abp5 0x0.0p0 F +REG epsg:8155 0 OK 0x1.fd96a8e8a71dep16 0x1.b089a02752546p-9 0x0.0p0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 0x0.0p0 F +REG epsg:8155 1 OK -0x1.cc111922f58dap18 -0x1.04204e12c6dep19 0x0.0p0 -0x1.88d0fb8f2ed47p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:8155 2 OK 0x1.656e36cba48efp19 -0x1.04204e12c6ddfp19 0x0.0p0 -0x1.51b78cf959b41p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:8155 3 OK -0x1.7203074e2b3p18 0x1.1a9599fbaac57p19 0x0.0p0 -0x1.88d0fb8e760e8p6 0x1.839be023201c5p5 0x0.0p0 F +REG epsg:8155 4 OK 0x1.38672de13f5ffp19 0x1.1a9599fbaac58p19 0x0.0p0 -0x1.51b78cfa127ap6 0x1.839be023201c6p5 0x0.0p0 F +REG epsg:8156 0 OK 0x1.a1f7ffbe76c91p18 0x1.6872b020c49bep-7 0x0.0p0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 0x0.0p0 F +REG epsg:8156 1 OK -0x1.7959c1e729ec9p20 -0x1.aab7207f28aacp20 0x0.0p0 -0x1.88d0fb8f2ed47p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:8156 2 OK 0x1.252ae0e332a91p21 -0x1.aab7207f28aabp20 0x0.0p0 -0x1.51b78cf959b41p6 0x1.339be0238d4b4p5 0x0.0p0 F +REG epsg:8156 3 OK -0x1.2f7c9e0d0ed26p20 0x1.cf8e5e699a11dp20 0x0.0p0 -0x1.88d0fb8e760e8p6 0x1.839be023201c5p5 0x0.0p0 F +REG epsg:8156 4 OK 0x1.003c4ef6251bep21 0x1.cf8e5e699a11fp20 0x0.0p0 -0x1.51b78cfa127ap6 0x1.839be023201c5p5 0x0.0p0 F +REG epsg:8157 0 OK 0x1.37f1c2eb1c433p16 0x1.3a92a30553261p-10 0x0.0p0 -0x1.5e33333333333p6 0x1.5a22222222223p5 0x0.0p0 F +REG epsg:8157 1 OK -0x1.fd2f3a73445e1p18 -0x1.0432dcbdff0b9p19 0x0.0p0 -0x1.79aa82673328dp6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:8157 2 OK 0x1.4c940df4693fdp19 -0x1.0432dcbdff0b9p19 0x0.0p0 -0x1.42bbe3ff333d9p6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:8157 3 OK -0x1.a3b5f20fbc8acp18 0x1.1a837ec1105a7p19 0x0.0p0 -0x1.79aa82667f6c1p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:8157 4 OK 0x1.1fd769c2a5563p19 0x1.1a837ec1105a7p19 0x0.0p0 -0x1.42bbe3ffe6fa5p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:8158 0 OK 0x1.ffb800c49ba63p17 0x1.0624dd2f1aap-8 0x0.0p0 -0x1.5e33333333333p6 0x1.5a22222222223p5 0x0.0p0 F +REG epsg:8158 1 OK -0x1.a1a329e83aefap20 -0x1.aad5919325f99p20 0x0.0p0 -0x1.79aa82673328dp6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:8158 2 OK 0x1.10c8950cb0ec9p21 -0x1.aad5919325f99p20 0x0.0p0 -0x1.42bbe3ff333d9p6 0x1.322222214d07cp5 0x0.0p0 F +REG epsg:8158 3 OK -0x1.58400f55507dap20 0x1.cf70aab437728p20 0x0.0p0 -0x1.79aa82667f6c1p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:8158 4 OK 0x1.d82e0f8677672p20 0x1.cf70aab437728p20 0x0.0p0 -0x1.42bbe3ffe6fa5p6 0x1.82222220e074ap5 0x0.0p0 F +REG epsg:8159 0 OK 0x1.6b242fb7e91p17 0x1.d7dbf487fcb92p-11 0x0.0p0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:8159 1 OK -0x1.93fdcfcaef7c4p18 -0x1.049d3a0b1afe4p19 0x0.0p0 -0x1.7a952398afa0cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:8159 2 OK 0x1.7f90ffc16c462p19 -0x1.049d3a0b1afe4p19 0x0.0p0 -0x1.4492aee47831cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:8159 3 OK -0x1.3dc196eb6669ep18 0x1.1a2185126f49fp19 0x0.0p0 -0x1.7a9523981658dp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:8159 4 OK 0x1.5472e351a7bcfp19 0x1.1a2185126f49fp19 0x0.0p0 -0x1.4492aee51179bp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:8160 0 OK 0x1.29da00189374ep19 0x1.89374bc6a7efep-9 0x0.0p0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 0x0.0p0 F +REG epsg:8160 1 OK -0x1.4b5b6e8a9fb1bp20 -0x1.ab840cf97d9dbp20 0x0.0p0 -0x1.7a952398afa0cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:8160 2 OK 0x1.3a9ab75199934p21 -0x1.ab840cf97d9dbp20 0x0.0p0 -0x1.4492aee47831cp6 0x1.29bbbbbb0727ep5 0x0.0p0 F +REG epsg:8160 3 OK -0x1.04a0549643cccp20 0x1.cecff24b5740dp20 0x0.0p0 -0x1.7a9523981658dp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:8160 4 OK 0x1.173d2a576ba0dp21 0x1.cecff24b5740dp20 0x0.0p0 -0x1.4492aee51179bp6 0x1.79bbbbba9edc6p5 0x0.0p0 F +REG epsg:8161 0 OK 0x1.a5ep14 0x1.86ap14 0x0.0p0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 0x0.0p0 F +REG epsg:8161 1 OK -0x1.192fa70f62082p19 -0x1.ef2d1e808fb9cp18 0x0.0p0 -0x1.874cc9e676b27p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:8161 2 OK 0x1.338da70f62082p19 -0x1.ef2d1e808fb9cp18 0x0.0p0 -0x1.4f7454a2226d4p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:8161 3 OK -0x1.d5c02c4aad0a5p18 0x1.2717bb4accd89p19 0x0.0p0 -0x1.874cc9e5a6805p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:8161 4 OK 0x1.053e162556852p19 0x1.2717bb4accd89p19 0x0.0p0 -0x1.4f7454a2f29f6p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:8162 0 OK 0x1.5a06800000004p16 0x1.4064d53f7cedbp16 0x0.0p0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 0x0.0p0 F +REG epsg:8162 1 OK -0x1.cd432ef46f36ep20 -0x1.9625ce9f9ccc5p20 0x0.0p0 -0x1.874cc9e676b27p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:8162 2 OK 0x1.f883fef46f36ep20 -0x1.9625ce9f9ccc5p20 0x0.0p0 -0x1.4f7454a2226d4p6 0x1.3a06d4904d02ep5 0x0.0p0 F +REG epsg:8162 3 OK -0x1.814b1d8073283p20 0x1.e41332459ad42p20 0x0.0p0 -0x1.874cc9e5a6805p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:8162 4 OK 0x1.ac8bed8073283p20 0x1.e41332459ad42p20 0x0.0p0 -0x1.4f7454a2f29f6p6 0x1.8a06d48fddcc2p5 0x0.0p0 F +REG epsg:8163 0 OK 0x1.af9a38902de01p17 0x1.16872b020c49cp-7 0x0.0p0 -0x1.6905b05b05b07p6 0x1.6b77777777777p5 0x0.0p0 F +REG epsg:8163 1 OK -0x1.76e4650887c2cp18 -0x1.034b40e5d332dp19 0x0.0p0 -0x1.8585da1eb7d85p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:8163 2 OK 0x1.933f4ecc5ad1fp19 -0x1.034b40e5d332cp19 0x0.0p0 -0x1.4c85869753887p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:8163 3 OK -0x1.165cd94aa29p18 0x1.1b58cf307fffep19 0x0.0p0 -0x1.8585da1dc010dp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:8163 4 OK 0x1.62fb88ed68389p19 0x1.1b58cf307ffffp19 0x0.0p0 -0x1.4c8586984b4ffp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:8164 0 OK 0x1.6201000000004p19 0x1.cac083126e97ep-6 0x0.0p0 -0x1.6905b05b05b07p6 0x1.6b77777777777p5 0x0.0p0 F +REG epsg:8164 1 OK -0x1.337d5b9ca1bd6p20 -0x1.a959a23e85036p20 0x0.0p0 -0x1.8585da1eb7d85p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:8164 2 OK 0x1.4abf2dce50df4p21 -0x1.a959a23e85034p20 0x0.0p0 -0x1.4c85869753887p6 0x1.437777764c1e2p5 0x0.0p0 F +REG epsg:8164 3 OK -0x1.c8a17be8b0834p19 0x1.d0ce974acbc9fp20 0x0.0p0 -0x1.8585da1dc010dp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:8164 4 OK 0x1.2328defa2c215p21 0x1.d0ce974acbcap20 0x0.0p0 -0x1.4c8586984b4ffp6 0x1.93777775dc283p5 0x0.0p0 F +REG epsg:8165 0 OK 0x1.b9b906ae7d567p16 0x1.26e978d4fdf3bp-8 0x0.0p0 -0x1.68a4fa4fa4fa6p6 0x1.544fa4fa4fa4ep5 0x0.0p0 F +REG epsg:8165 1 OK -0x1.dba0bd88923b8p18 -0x1.047e04a70600bp19 0x0.0p0 -0x1.83c9c54d1ce49p6 0x1.2c4fa4f991a41p5 0x0.0p0 F +REG epsg:8165 2 OK 0x1.5c3ea06fe874p19 -0x1.047e04a70600bp19 0x0.0p0 -0x1.4d802f522d102p6 0x1.2c4fa4f991a4p5 0x0.0p0 F +REG epsg:8165 3 OK -0x1.8468bfe06f36bp18 0x1.1a40605d8e6c7p19 0x0.0p0 -0x1.83c9c54c7bdf7p6 0x1.7c4fa4f927e63p5 0x0.0p0 F +REG epsg:8165 4 OK 0x1.30a2a19bd6f17p19 0x1.1a40605d8e6c7p19 0x0.0p0 -0x1.4d802f52ce154p6 0x1.7c4fa4f927e62p5 0x0.0p0 F +REG epsg:8166 0 OK 0x1.6a4e000000003p18 0x1.eb851eb851ebep-7 0x0.0p0 -0x1.68a4fa4fa4fa6p6 0x1.544fa4fa4fa4ep5 0x0.0p0 F +REG epsg:8166 1 OK -0x1.861d2c8535ab6p20 -0x1.ab50db0a9ed0dp20 0x0.0p0 -0x1.83c9c54d1ce49p6 0x1.2c4fa4f991a41p5 0x0.0p0 F +REG epsg:8166 2 OK 0x1.1da216429ad64p21 -0x1.ab50db0a9ed0cp20 0x0.0p0 -0x1.4d802f522d102p6 0x1.2c4fa4f991a4p5 0x0.0p0 F +REG epsg:8166 3 OK -0x1.3e9391db0928fp20 0x1.cf02906e10d3ep20 0x0.0p0 -0x1.83c9c54c7bdf7p6 0x1.7c4fa4f927e63p5 0x0.0p0 F +REG epsg:8166 4 OK 0x1.f3ba91db0929fp20 0x1.cf02906e10d3fp20 0x0.0p0 -0x1.4d802f52ce154p6 0x1.7c4fa4f927e62p5 0x0.0p0 F +REG epsg:8167 0 OK 0x1.26ae26a161e4fp17 0x1.3542c78d4fdf4p16 0x0.0p0 -0x1.64f7777777778p6 0x1.5e74bc7a4dc96p5 0x0.0p0 F +REG epsg:8167 1 OK -0x1.b9ddd21edaaaap18 -0x1.b8fcaaa7ab3abp18 0x0.0p0 -0x1.80ae11048e154p6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:8167 2 OK 0x1.7045fc601e47dp19 -0x1.b8fcaaa7ab3abp18 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:8167 3 OK -0x1.5f078ed7c2bf4p18 0x1.40d57eb00d4b6p19 0x0.0p0 -0x1.80ae11048e154p6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:8167 4 OK 0x1.42dadabc92522p19 0x1.40d57eb00d4b6p19 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:8168 0 OK 0x1.e366000000005p18 0x1.fb5110e56041ep17 0x0.0p0 -0x1.64f7777777778p6 0x1.5e74bc7a4dc96p5 0x0.0p0 F +REG epsg:8168 1 OK -0x1.6a6c2de44a5a8p20 -0x1.69b381869d48ap20 0x0.0p0 -0x1.80ae11048e154p6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:8168 2 OK 0x1.2e0f96f2252d5p21 -0x1.69b381869d48ap20 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dc85p5 0x0.0p0 F +REG epsg:8168 3 OK -0x1.1fead6d112856p20 0x1.072693b1964c7p21 0x0.0p0 -0x1.80ae11048e154p6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:8168 4 OK 0x1.08ceeb688942cp21 0x1.072693b1964c7p21 0x0.0p0 -0x1.4940ddea60d9cp6 0x1.8674bc7a4d50fp5 0x0.0p0 F +REG epsg:8169 0 OK 0x1.4c2f5ec22680ap17 0x1.660c96e2eb1c4p15 0x0.0p0 -0x1.675b05b05b05bp6 0x1.5519ba40451d2p5 0x0.0p0 F +REG epsg:8169 1 OK -0x1.a54e29a4d18dbp18 -0x1.da80613afa8ecp18 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:8169 2 OK 0x1.78bec4337c072p19 -0x1.da80613afa8ecp18 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:8169 3 OK -0x1.4e1e484280e66p18 0x1.301e2c4789f0cp19 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:8169 4 OK 0x1.4d26d38253b38p19 0x1.301e2c4789f0cp19 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:8170 0 OK 0x1.1076000000003p19 0x1.25acc78d4fdf6p17 0x0.0p0 -0x1.675b05b05b05bp6 0x1.5519ba40451d2p5 0x0.0p0 F +REG epsg:8170 1 OK -0x1.598ee20eb366ep20 -0x1.8530a87d00a87p20 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:8170 2 OK 0x1.3502710759b39p21 -0x1.8530a87d00a87p20 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.2d19ba40451bep5 0x0.0p0 F +REG epsg:8170 3 OK -0x1.120bee5e6f6f8p20 0x1.f2e1486e53668p20 0x0.0p0 -0x1.828ad2d6b1989p6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:8170 4 OK 0x1.1140f72f37b7ep21 0x1.f2e1486e53668p20 0x0.0p0 -0x1.4c2b388a0472ep6 0x1.7d19ba40448bap5 0x0.0p0 F +REG epsg:8171 0 OK 0x1.d9463df6fd22p17 0x1.47ae147ae147bp-7 0x0.0p0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 0x0.0p0 F +REG epsg:8171 1 OK -0x1.5bbaaa27ac90cp18 -0x1.04ec4ba874304p19 0x0.0p0 -0x1.85de05ec3888cp6 0x1.2349f49eaaf96p5 0x0.0p0 F +REG epsg:8171 2 OK 0x1.9a80740f54d96p19 -0x1.04ec4ba874304p19 0x0.0p0 -0x1.5088607a2dddbp6 0x1.2349f49eaaf96p5 0x0.0p0 F +REG epsg:8171 3 OK -0x1.07e7e01ca62f7p18 0x1.19d859b1873d9p19 0x0.0p0 -0x1.85de05ebb1461p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:8171 4 OK 0x1.70970f09d1a8cp19 0x1.19d859b1873d9p19 0x0.0p0 -0x1.5088607ab5205p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:8172 0 OK 0x1.842effef9db26p19 0x1.0e5604189374dp-5 0x0.0p0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 0x0.0p0 F +REG epsg:8172 1 OK -0x1.1d35d9c0d2fbdp20 -0x1.ac05c1a77f023p20 0x0.0p0 -0x1.85de05ec3888cp6 0x1.2349f49eaaf95p5 0x0.0p0 F +REG epsg:8172 2 OK 0x1.50b26cd838572p21 -0x1.ac05c1a77f023p20 0x0.0p0 -0x1.5088607a2dddbp6 0x1.2349f49eaaf95p5 0x0.0p0 F +REG epsg:8172 3 OK -0x1.b0ea587f90164p19 0x1.ce57eb07f3bc5p20 0x0.0p0 -0x1.85de05ebb1461p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:8172 4 OK 0x1.2e521617b2decp21 0x1.ce57eb07f3bc5p20 0x0.0p0 -0x1.5088607ab5205p6 0x1.7349f49e46b7cp5 0x0.0p0 F +REG epsg:8173 0 OK 0x1.0d61236944674p18 0x1.013a92a305532p-6 0x0.0p0 -0x1.6288888888889p6 0x1.600b60b60b60cp5 0x0.0p0 F +REG epsg:8173 1 OK -0x1.3efb6356514dp18 -0x1.03e83d624b652p19 0x0.0p0 -0x1.7e56d66506b26p6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:8173 2 OK 0x1.acded5146d0e5p19 -0x1.03e83d624b651p19 0x0.0p0 -0x1.46ba3aac0a5ecp6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:8173 3 OK -0x1.c650a0d35a36p17 0x1.1acd2691e1af8p19 0x0.0p0 -0x1.7e56d6643e02cp6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:8173 4 OK 0x1.7ef54b9e1af54p19 0x1.1acd2691e1af9p19 0x0.0p0 -0x1.46ba3aacd30e5p6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:8177 0 OK 0x1.b9e50028f5c31p19 0x1.a9fbe76c8b43fp-5 0x0.0p0 -0x1.6288888888889p6 0x1.600b60b60b60cp5 0x0.0p0 F +REG epsg:8177 1 OK -0x1.05a1b5e88d824p20 -0x1.aa5b2819cb0cfp20 0x0.0p0 -0x1.7e56d66506b26p6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:8177 2 OK 0x1.5fc35b08c1a32p21 -0x1.aa5b2819cb0cdp20 0x0.0p0 -0x1.46ba3aac0a5ecp6 0x1.380b60b51c03dp5 0x0.0p0 F +REG epsg:8177 3 OK -0x1.74a2067ac81f5p19 0x1.cfe97e1aead99p20 0x0.0p0 -0x1.7e56d6643e02cp6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:8177 4 OK 0x1.3a1b01b32ce9cp21 0x1.cfe97e1aead9ap20 0x0.0p0 -0x1.46ba3aacd30e5p6 0x1.880b60b4ad504p5 0x0.0p0 F +REG epsg:8179 0 OK 0x1.94d0353f7ced9p15 0x1.89374bc6a7efap-9 0x0.0p0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 0x0.0p0 F +REG epsg:8179 1 OK -0x1.0d320e7b572fap19 -0x1.03bb2f8606243p19 0x0.0p0 -0x1.8b930e66913b5p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:8179 2 OK 0x1.3fcc152346cdfp19 -0x1.03bb2f8606242p19 0x0.0p0 -0x1.5394c41696973p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:8179 3 OK -0x1.bd43d911e2b6ap18 0x1.1af22abc91721p19 0x0.0p0 -0x1.8b930e65bc34ap6 0x1.8b444442d5ce7p5 0x0.0p0 F +REG epsg:8179 4 OK 0x1.113bf330e0f98p19 0x1.1af22abc91721p19 0x0.0p0 -0x1.5394c4176b9dep6 0x1.8b444442d5ce7p5 0x0.0p0 F +REG epsg:8180 0 OK 0x1.4c080020c49bep17 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 0x0.0p0 F +REG epsg:8180 1 OK -0x1.b997c4589dcfp20 -0x1.aa113fc4eaaf5p20 0x0.0p0 -0x1.8b930e66913b5p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:8180 2 OK 0x1.064ce230677b7p21 -0x1.aa113fc4eaaf4p20 0x0.0p0 -0x1.5394c41696973p6 0x1.3b4444434548ep5 0x0.0p0 F +REG epsg:8180 3 OK -0x1.6d35c86479f73p20 0x1.d02636f630547p20 0x0.0p0 -0x1.8b930e65bc34ap6 0x1.8b444442d5ce7p5 0x0.0p0 F +REG epsg:8180 4 OK 0x1.c037c86cab1efp20 0x1.d02636f630548p20 0x0.0p0 -0x1.5394c4176b9dep6 0x1.8b444442d5ce8p5 0x0.0p0 F +REG epsg:8181 0 OK 0x1.cdf6a2f837b4ap15 0x1.0cb295e9e1b09p-8 0x0.0p0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 0x0.0p0 F +REG epsg:8181 1 OK -0x1.0ad82d20ef11fp19 -0x1.0315bcc7d2512p19 0x0.0p0 -0x1.8c65b3ecb0ac3p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:8181 2 OK 0x1.4497017ff6089p19 -0x1.0315bcc7d2512p19 0x0.0p0 -0x1.52efa168a4a93p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:8181 3 OK -0x1.b3a14bd6fba4cp18 0x1.1b83af78791c9p19 0x0.0p0 -0x1.8c65b3eba7ecep6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:8181 4 OK 0x1.138f7a4a84c8fp19 0x1.1b83af78791c9p19 0x0.0p0 -0x1.52efa169ad688p6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:8182 0 OK 0x1.7ae8000000004p17 0x1.a9fbe76c8b43dp-7 0x0.0p0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 0x0.0p0 F +REG epsg:8182 1 OK -0x1.b5bc6eb99ee68p20 -0x1.a901d85a47947p20 0x0.0p0 -0x1.8c65b3ecb0ac3p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:8182 2 OK 0x1.0a3b375ccf735p21 -0x1.a901d85a47947p20 0x0.0p0 -0x1.52efa168a4a93p6 0x1.4711110fcff18p5 0x0.0p0 F +REG epsg:8182 3 OK -0x1.654eb25023bd2p20 0x1.d114ecf529eabp20 0x0.0p0 -0x1.8c65b3eba7ecep6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:8182 4 OK 0x1.c408b25023bd4p20 0x1.d114ecf529eabp20 0x0.0p0 -0x1.52efa169ad688p6 0x1.9711110f60927p5 0x0.0p0 F +REG epsg:8184 0 OK 0x1.36288f0d844dp17 0x1.2d77318fc5048p-9 0x0.0p0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 0x0.0p0 F +REG epsg:8184 1 OK -0x1.b1e30d91558fep18 -0x1.03ba9ba4eecf2p19 0x0.0p0 -0x1.7914e13b2b4f2p6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:8184 2 OK 0x1.7405ce4f6cee7p19 -0x1.03ba9ba4eecf2p19 0x0.0p0 -0x1.4118a19d0233cp6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:8184 3 OK -0x1.54ca4582ad8c8p18 0x1.1aefbe82e6f2p19 0x0.0p0 -0x1.7914e13a568b9p6 0x1.8b333331c515fp5 0x0.0p0 F +REG epsg:8184 4 OK 0x1.45796a4818eccp19 0x1.1aefbe82e6f2p19 0x0.0p0 -0x1.4118a19dd6f74p6 0x1.8b333331c515fp5 0x0.0p0 F +REG epsg:8185 0 OK 0x1.fcca000000006p18 0x1.0624dd2f1aap-7 0x0.0p0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 0x0.0p0 F +REG epsg:8185 1 OK -0x1.63e0af20d3e08p20 -0x1.aa104d2e4c75dp20 0x0.0p0 -0x1.7914e13b2b4f2p6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:8185 2 OK 0x1.3122d79069f05p21 -0x1.aa104d2e4c75dp20 0x0.0p0 -0x1.4118a19d0233cp6 0x1.3b333332348d2p5 0x0.0p0 F +REG epsg:8185 3 OK -0x1.1784d68f427f6p20 0x1.d0223d89dfbc3p20 0x0.0p0 -0x1.7914e13a568b9p6 0x1.8b333331c515fp5 0x0.0p0 F +REG epsg:8185 4 OK 0x1.0af4eb47a13fcp21 0x1.d0223d89dfbc3p20 0x0.0p0 -0x1.4118a19dd6f74p6 0x1.8b333331c516p5 0x0.0p0 F +REG epsg:8187 0 OK 0x1.012cee7bb2fecp18 0x1.f212d77318fc5p-8 0x0.0p0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 0x0.0p0 F +REG epsg:8187 1 OK -0x1.4747e03465b7cp18 -0x1.04e668b553a2cp19 0x0.0p0 -0x1.7dcadae28073ap6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:8187 2 OK 0x1.a4d0de95e5db3p19 -0x1.04e668b553a2cp19 0x0.0p0 -0x1.48685850b2bfbp6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:8187 3 OK -0x1.e68d8ed50f156p17 0x1.19dde21f4edfep19 0x0.0p0 -0x1.7dcadae1f7e31p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:8187 4 OK 0x1.7ad05230f6c4ap19 0x1.19dde21f4edffp19 0x0.0p0 -0x1.486858513b503p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:8189 0 OK 0x1.a5dffff7ced97p19 0x1.999999999999ep-6 0x0.0p0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 0x0.0p0 F +REG epsg:8189 1 OK -0x1.0c703bad2bfe2p20 -0x1.abfc19a1809bfp20 0x0.0p0 -0x1.7dcadae280739p6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:8189 2 OK 0x1.59281dd27d6c5p21 -0x1.abfc19a1809bep20 0x0.0p0 -0x1.48685850b2bfap6 0x1.23c71c712695cp5 0x0.0p0 F +REG epsg:8189 3 OK -0x1.8f13259f68db9p19 0x1.ce60fe90002a2p20 0x0.0p0 -0x1.7dcadae1f7e31p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:8189 4 OK 0x1.36b4c963c1a41p21 0x1.ce60fe90002a4p20 0x0.0p0 -0x1.486858513b503p6 0x1.73c71c70c2012p5 0x0.0p0 F +REG epsg:8191 0 OK 0x1.e2cca5aee632p17 0x1.1e4ffeab367a1p17 0x0.0p0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce05p5 0x0.0p0 F +REG epsg:8191 1 OK -0x1.5aa8c4e2d2f42p18 -0x1.77c1225e98d3cp18 0x0.0p0 -0x1.811101c6c033dp6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:8191 2 OK 0x1.9ebab548dc931p19 -0x1.77c1225e98d3cp18 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:8191 3 OK -0x1.0223e2fac007ap18 0x1.617a67f5bd521p19 0x0.0p0 -0x1.811101c6c033dp6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:8191 4 OK 0x1.72784454d31cdp19 0x1.617a67f5bd521p19 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:8193 0 OK 0x1.8bff000000005p19 0x1.d5abf8b439588p18 0x0.0p0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce05p5 0x0.0p0 F +REG epsg:8193 1 OK -0x1.1c5532fb4a344p20 -0x1.3432690aa4433p20 0x0.0p0 -0x1.811101c6c033dp6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:8193 2 OK 0x1.542a197da51a4p21 -0x1.3432690aa4433p20 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.308e5e6c9cdf4p5 0x0.0p0 F +REG epsg:8193 3 OK -0x1.a7751bea6a457p19 0x1.21ecfc33fdcdp21 0x0.0p0 -0x1.811101c6c033dp6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:8193 4 OK 0x1.2fdcc6fa9a918p21 0x1.21ecfc33fdcdp21 0x0.0p0 -0x1.4a4fb444a0825p6 0x1.808e5e6c9c58bp5 0x0.0p0 F +REG epsg:8196 0 OK 0x1.bc1aa09d49518p16 0x1.a38e3d7dbf488p15 0x0.0p0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6d93p5 0x0.0p0 F +REG epsg:8196 1 OK -0x1.dd3b84d0b1c42p18 -0x1.d25bbf5d0ef07p18 0x0.0p0 -0x1.87310ceda75f3p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:8196 2 OK 0x1.5da46a8fab367p19 -0x1.d25bbf5d0ef07p18 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:8196 3 OK -0x1.844eb7195412ap18 0x1.342b8716aebb6p19 0x0.0p0 -0x1.87310ceda75f3p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:8196 4 OK 0x1.312e03b3fc5dbp19 0x1.342b8716aebb6p19 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:8197 0 OK 0x1.6c42000000006p18 0x1.581f7e560418cp17 0x0.0p0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6d93p5 0x0.0p0 F +REG epsg:8197 1 OK -0x1.876e190b36222p20 -0x1.7e82d34c0c3p20 0x0.0p0 -0x1.87310ceda75f3p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:8197 2 OK 0x1.1ec78c859b113p21 -0x1.7e82d34c0c3p20 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6d82p5 0x0.0p0 F +REG epsg:8197 3 OK -0x1.3e7e375a85128p20 0x1.f986fa16d261cp20 0x0.0p0 -0x1.87310ceda75f3p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:8197 4 OK 0x1.f49f375a8512ap20 0x1.f986fa16d261cp20 0x0.0p0 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6545p5 0x0.0p0 F +REG epsg:8198 0 OK 0x1.4a662b46dc5d6p17 0x1.b3d19d07c84b6p16 0x0.0p0 -0x1.6593e93e93e95p6 0x1.5bb34ba7e5d35p5 0x0.0p0 F +REG epsg:8198 1 OK -0x1.a7778970d1d07p18 -0x1.99a221a7b0da6p18 0x0.0p0 -0x1.8121f60492aacp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:8198 2 OK 0x1.78eeda5bd7178p19 -0x1.99a221a7b0da6p18 0x0.0p0 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:8198 3 OK -0x1.4db8402cd1e5dp18 0x1.508610ba8dd47p19 0x0.0p0 -0x1.8121f60492aacp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:8198 4 OK 0x1.4c0f35b9d7222p19 0x1.508610ba8dd47p19 0x0.0p0 -0x1.4a05dc789527cp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:8200 0 OK 0x1.0efefff7ced93p19 0x1.657653a5e3542p18 0x0.0p0 -0x1.6593e93e93e95p6 0x1.5bb34ba7e5d35p5 0x0.0p0 F +REG epsg:8200 1 OK -0x1.5b54c3e173ae6p20 -0x1.4ffc132beb264p20 0x0.0p0 -0x1.8121f60492aacp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:8200 2 OK 0x1.3529e1eca1444p21 -0x1.4ffc132beb264p20 0x0.0p0 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d25p5 0x0.0p0 F +REG epsg:8200 3 OK -0x1.11b83e744a938p20 0x1.1405006402e28p21 0x0.0p0 -0x1.8121f60492aacp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:8200 4 OK 0x1.105b9f360cb6cp21 0x1.1405006402e28p21 0x0.0p0 -0x1.4a05dc789527cp6 0x1.83b34ba7e553ep5 0x0.0p0 F +REG epsg:8201 0 OK 0x1.868699758e219p17 0x1.19ce075f6fd22p-7 0x0.0p0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 0x0.0p0 F +REG epsg:8201 1 OK -0x1.88717ff75a94cp18 -0x1.0411b4622cf29p19 0x0.0p0 -0x1.86737a6e0e03bp6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:8201 2 OK 0x1.877c0cb6745b2p19 -0x1.0411b4622cf29p19 0x0.0p0 -0x1.4f37303c9ca71p6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:8201 3 OK -0x1.2dea7ddac844cp18 0x1.1aa4cd4e45e8ep19 0x0.0p0 -0x1.86737a6d5115ap6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:8201 4 OK 0x1.5a388ba82b333p19 0x1.1aa4cd4e45e8ep19 0x0.0p0 -0x1.4f37303d59952p6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:8202 0 OK 0x1.404fffe76c8b9p19 0x1.cac083126e97ep-6 0x0.0p0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 0x0.0p0 F +REG epsg:8202 1 OK -0x1.41e2a3e34caf8p20 -0x1.aa9f2d225b5a3p20 0x0.0p0 -0x1.86737a6e0e03bp6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:8202 2 OK 0x1.411951e55c9d9p21 -0x1.aa9f2d225b5a3p20 0x0.0p0 -0x1.4f37303c9ca71p6 0x1.34cccccbec382p5 0x0.0p0 F +REG epsg:8202 3 OK -0x1.ef449c4fd6287p19 0x1.cfa74dcbffc8ap20 0x0.0p0 -0x1.86737a6d5115ap6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:8202 4 OK 0x1.1bf92707abcfep21 0x1.cfa74dcbffc8ap20 0x0.0p0 -0x1.4f37303d59952p6 0x1.84cccccb7e94cp5 0x0.0p0 F +REG epsg:8203 0 OK 0x1.d51b70a3d70a4p15 0x1.5876de83e425bp15 0x0.0p0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9eap5 0x0.0p0 F +REG epsg:8203 1 OK -0x1.0a3a0d2289e2p19 -0x1.da3e78357b9dbp18 0x0.0p0 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:8203 2 OK 0x1.44dd7b3704c34p19 -0x1.da3e78357b9dbp18 0x0.0p0 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:8203 3 OK -0x1.b5d0c5c4079fap18 0x1.302832b5df70ap19 0x0.0p0 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:8203 4 OK 0x1.158bd0f67eb12p19 0x1.302832b5df70ap19 0x0.0p0 -0x1.50e788cded91ep6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:8204 0 OK 0x1.80c4000000004p17 0x1.1a8852f1a9fc1p17 0x0.0p0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9eap5 0x0.0p0 F +REG epsg:8204 1 OK -0x1.b4b90aa974a08p20 -0x1.84fa991bcedc9p20 0x0.0p0 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:8204 2 OK 0x1.0a750554ba505p21 -0x1.84fa991bcedc9p20 0x0.0p0 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9dbp5 0x0.0p0 F +REG epsg:8204 3 OK -0x1.6719956780cd2p20 0x1.f2f1ba6f197e2p20 0x0.0p0 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:8204 4 OK 0x1.c74a956780cd2p20 0x1.f2f1ba6f197e2p20 0x0.0p0 -0x1.50e788cded91ep6 0x1.8fd2a6a33d3bap5 0x0.0p0 F +REG epsg:8205 0 OK 0x1.de0971d495183p17 0x1.41205bc01a36ep-8 0x0.0p0 -0x1.62p6 0x1.55c16c16c16c2p5 0x0.0p0 F +REG epsg:8205 1 OK -0x1.5b4f4612b0516p18 -0x1.046b1f3f9c6e8p19 0x0.0p0 -0x1.7d38fa8e1bfe9p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:8205 2 OK 0x1.9cac5bf3a2b57p19 -0x1.046b1f3f9c6e7p19 0x0.0p0 -0x1.46c70571e4017p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:8205 3 OK -0x1.03897aaaba5f8p18 0x1.1a506e919f27dp19 0x0.0p0 -0x1.7d38fa8d767edp6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:8205 4 OK 0x1.70c9763fa7bc5p19 0x1.1a506e919f27dp19 0x0.0p0 -0x1.46c7057289813p6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:8206 0 OK 0x1.8816fff7ced95p19 0x1.0624dd2f1a9ffp-6 0x0.0p0 -0x1.62p6 0x1.55c16c16c16c2p5 0x0.0p0 F +REG epsg:8206 1 OK -0x1.1cddc484fa9bp20 -0x1.ab31dbb03bce8p20 0x0.0p0 -0x1.7d38fa8e1bfe9p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:8206 2 OK 0x1.527a623e64baap21 -0x1.ab31dbb03bce7p20 0x0.0p0 -0x1.46c70571e4017p6 0x1.2dc16c15fdedap5 0x0.0p0 F +REG epsg:8206 3 OK -0x1.a9bfb5b6fe063p19 0x1.cf1ce6defecbfp20 0x0.0p0 -0x1.7d38fa8d767edp6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:8206 4 OK 0x1.2e7b6d69a6eeap21 0x1.cf1ce6defeccp20 0x0.0p0 -0x1.46c7057289813p6 0x1.7dc16c15936c9p5 0x0.0p0 F +REG epsg:8207 0 OK 0x1.f4104154c985fp15 0x1.d06bcf0068db9p15 0x0.0p0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69769p5 0x0.0p0 F +REG epsg:8207 1 OK -0x1.090edc97e3bc9p19 -0x1.ca6c6f04a14b3p18 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:8207 2 OK 0x1.4790e4c27ced5p19 -0x1.ca6c6f04a14b3p18 0x0.0p0 -0x1.5517b0ead2635p6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:8207 3 OK -0x1.b060f031b40e6p18 0x1.380464775d676p19 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:8207 4 OK 0x1.16b280437337fp19 0x1.380464775d676p19 0x0.0p0 -0x1.5517b0ead2635p6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:8208 0 OK 0x1.9a27ffdf3b64bp17 0x1.7cec0d4fdf3bbp17 0x0.0p0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69769p5 0x0.0p0 F +REG epsg:8208 1 OK -0x1.b2ce3efaa6b04p20 -0x1.7800b9920249ep20 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:8208 2 OK 0x1.0cac1f793ac4bp21 -0x1.7800b9920249ep20 0x0.0p0 -0x1.5517b0ead2635p6 0x1.4730916b6975dp5 0x0.0p0 F +REG epsg:8208 3 OK -0x1.62a3fd52ca11ap20 0x1.ffd690bf5b55fp20 0x0.0p0 -0x1.8e91d67a70bdbp6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:8208 4 OK 0x1.c92dfd4a98eacp20 0x1.ffd690bf5b55fp20 0x0.0p0 -0x1.5517b0ead2635p6 0x1.9730916b69224p5 0x0.0p0 F +REG epsg:8209 0 OK 0x1.564e2cd35a858p17 0x1.3a92a30553261p-8 0x0.0p0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 0x0.0p0 F +REG epsg:8209 1 OK -0x1.a05cc6787a2b8p18 -0x1.041d91745d219p19 0x0.0p0 -0x1.8ac09ae392e43p6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:8209 2 OK 0x1.7b5579a5ea592p19 -0x1.041d91745d218p19 0x0.0p0 -0x1.53a01b27cdd1dp6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:8209 3 OK -0x1.463615157bb12p18 0x1.1a98eec373a85p19 0x0.0p0 -0x1.8ac09ae2d947ap6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:8209 4 OK 0x1.4e4220f46b1bcp19 0x1.1a98eec373a86p19 0x0.0p0 -0x1.53a01b28876e6p6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:8210 0 OK 0x1.18c2fff7ced94p19 0x1.0624dd2f1a9ffp-6 0x0.0p0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 0x0.0p0 F +REG epsg:8210 1 OK -0x1.55810070937a7p20 -0x1.aab2a3304e668p20 0x0.0p0 -0x1.8ac09ae392e43p6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:8210 2 OK 0x1.37220034312a6p21 -0x1.aab2a3304e667p20 0x0.0p0 -0x1.53a01b27cdd1dp6 0x1.33d9e26a170e2p5 0x0.0p0 F +REG epsg:8210 3 OK -0x1.0b8faa5be9e65p20 0x1.cf93d55436eddp20 0x0.0p0 -0x1.8ac09ae2d947ap6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:8210 4 OK 0x1.12295529dc603p21 0x1.cf93d55436edep20 0x0.0p0 -0x1.53a01b28876e6p6 0x1.83d9e269a9c6dp5 0x0.0p0 F +REG epsg:8212 0 OK 0x1.edcp14 0x1.1f8p12 0x0.0p0 -0x1.6p6 0x1.58p5 0x0.0p0 F +REG epsg:8212 1 OK -0x1.15f29bd9d0b7bp19 -0x1.020f0a32ba273p19 0x0.0p0 -0x1.7b58b7731de0cp6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:8212 2 OK 0x1.34ce9bd9d0b71p19 -0x1.020f0a32ba274p19 0x0.0p0 -0x1.44a7488ce21f4p6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:8212 3 OK -0x1.d34141456ebafp18 0x1.1ca91a704ce78p19 0x0.0p0 -0x1.7b58b7727134fp6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8212 4 OK 0x1.087ca0a2b75cfp19 0x1.1ca91a704ce78p19 0x0.0p0 -0x1.44a7488d8ecb1p6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8213 0 OK 0x1.94fa553f7cedcp16 0x1.d79ea9fbe76cep13 0x0.0p0 -0x1.6p6 0x1.58p5 0x0.0p0 F +REG epsg:8213 1 OK -0x1.c7f334c92063ep20 -0x1.a752e95fe2bc3p20 0x0.0p0 -0x1.7b58b7731de0cp6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:8213 2 OK 0x1.fa927f711000bp20 -0x1.a752e95fe2bc4p20 0x0.0p0 -0x1.44a7488ce21f4p6 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:8213 3 OK -0x1.7f3f11c131c9cp20 0x1.d2f640ce1b82ep20 0x0.0p0 -0x1.7b58b7727134fp6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8213 4 OK 0x1.b1de5c692166bp20 0x1.d2f640ce1b82dp20 0x0.0p0 -0x1.44a7488d8ecb1p6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8214 0 OK 0x1.be7c3a8f5c28fp17 0x1.2223bde9e1b09p17 0x0.0p0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe8cp5 0x0.0p0 F +REG epsg:8214 1 OK -0x1.72b2e8085ba4ep18 -0x1.72af861a69d2cp18 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:8214 2 OK 0x1.9897914bdbe6fp19 -0x1.72af861a69d2cp18 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:8214 3 OK -0x1.0e49870f3b82cp18 0x1.63d5a2ce074a2p19 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:8214 4 OK 0x1.6662e0cf4bd5dp19 0x1.63d5a2ce074a2p19 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:8216 0 OK 0x1.6e36000831276p19 0x1.dbf32a2d0e564p18 0x0.0p0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe8cp5 0x0.0p0 F +REG epsg:8216 1 OK -0x1.300cdfb39418p20 -0x1.300a19775b35dp20 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:8216 2 OK 0x1.4f216fdde29fbp21 -0x1.300a19775b35dp20 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe81p5 0x0.0p0 F +REG epsg:8216 3 OK -0x1.bb6237428a686p19 0x1.23dbc2623869ep21 0x0.0p0 -0x1.89c1c8ea11967p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:8216 4 OK 0x1.25f38dd4bb2dcp21 0x1.23dbc2623869ep21 0x0.0p0 -0x1.4f771aa4274d3p6 0x1.9d5b709bbf9f9p5 0x0.0p0 F +REG epsg:8218 0 OK 0x1.6bdep16 0x1.7c1bda5119cep-9 0x0.0p0 -0x1.6f66666666666p6 0x1.6911111111111p5 0x0.0p0 F +REG epsg:8218 1 OK -0x1.f3375bd1c99d4p18 -0x1.036bcd8facc5bp19 0x0.0p0 -0x1.8bc0151c74651p6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:8218 2 OK 0x1.54932de8e4ceap19 -0x1.036bcd8facc5bp19 0x0.0p0 -0x1.530cb7b05867cp6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:8218 3 OK -0x1.93b2530bd313ep18 0x1.1b39b314e04bdp19 0x0.0p0 -0x1.8bc0151b87521p6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:8218 4 OK 0x1.24d0a985e989fp19 0x1.1b39b314e04bdp19 0x0.0p0 -0x1.530cb7b1457abp6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:8220 0 OK 0x1.2a72680000003p18 0x1.47ae147ae147ep-7 0x0.0p0 -0x1.6f66666666666p6 0x1.6911111111111p5 0x0.0p0 F +REG epsg:8220 1 OK -0x1.9976195678319p20 -0x1.a98f07473e919p20 0x0.0p0 -0x1.8bc0151c74651p6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:8220 2 OK 0x1.1757a6ab3c18dp21 -0x1.a98f07473e919p20 0x0.0p0 -0x1.530cb7b05867cp6 0x1.4111110ff36dap5 0x0.0p0 F +REG epsg:8220 3 OK -0x1.4b1d8438caba8p20 0x1.d09b8ed7c12a4p20 0x0.0p0 -0x1.8bc0151b87521p6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:8220 4 OK 0x1.e056b838cabaap20 0x1.d09b8ed7c12a4p20 0x0.0p0 -0x1.530cb7b1457abp6 0x1.9111110f835d1p5 0x0.0p0 F +REG epsg:8222 0 OK 0x1.518af919ce076p17 0x1.bda5119ce075fp-10 0x0.0p0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 0x0.0p0 F +REG epsg:8222 1 OK -0x1.a65e92a28bb43p18 -0x1.032ae87cc517cp19 0x0.0p0 -0x1.8720d6bfb42fp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:8222 2 OK 0x1.7bf4c5de2cdd4p19 -0x1.032ae87cc517cp19 0x0.0p0 -0x1.4dd978e54620bp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:8222 3 OK -0x1.44ea76b66b261p18 0x1.1b72b52bc854p19 0x0.0p0 -0x1.8720d6beb241p6 0x1.95a61d93647a3p5 0x0.0p0 F +REG epsg:8222 4 OK 0x1.4b3ab7e81c963p19 0x1.1b72b52bc853fp19 0x0.0p0 -0x1.4dd978e6480ebp6 0x1.95a61d93647a2p5 0x0.0p0 F +REG epsg:8224 0 OK 0x1.14db000831275p19 0x1.89374bc6a7efdp-8 0x0.0p0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 0x0.0p0 F +REG epsg:8224 1 OK -0x1.5a6e50eb4d24ep20 -0x1.a92492ea845d5p20 0x0.0p0 -0x1.8720d6bfb42fp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:8224 2 OK 0x1.37a4a879bf25ap21 -0x1.a92492ea845d6p20 0x0.0p0 -0x1.4dd978e54620bp6 0x1.45a61d93d4255p5 0x0.0p0 F +REG epsg:8224 3 OK -0x1.0a7fab4c0722ap20 0x1.d0f9133ab9d04p20 0x0.0p0 -0x1.8720d6beb241p6 0x1.95a61d93647a2p5 0x0.0p0 F +REG epsg:8224 4 OK 0x1.0fad55aa1c248p21 0x1.d0f9133ab9d03p20 0x0.0p0 -0x1.4dd978e6480ebp6 0x1.95a61d93647a2p5 0x0.0p0 F +REG epsg:8225 0 OK 0x1.1f8958db8bac7p17 0x1.e4f765fd8adacp-9 0x0.0p0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 0x0.0p0 F +REG epsg:8225 1 OK -0x1.bb90ee49f1ac2p18 -0x1.0429624f1d21ap19 0x0.0p0 -0x1.8382e3e19da44p6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:8225 2 OK 0x1.6d8d2392beac5p19 -0x1.0429624f1d21ap19 0x0.0p0 -0x1.4c7d1c1e625bcp6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:8225 3 OK -0x1.61c6e5d91f22ap18 0x1.1a8dea97aaa1p19 0x0.0p0 -0x1.8382e3e0e7308p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:8225 4 OK 0x1.40a81f5a55679p19 0x1.1a8dea97aaa1p19 0x0.0p0 -0x1.4c7d1c1f18cf8p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:8226 0 OK 0x1.d7adffef9db2bp18 0x1.89374bc6a7efdp-7 0x0.0p0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 0x0.0p0 F +REG epsg:8226 1 OK -0x1.6bd10f658e2fap20 -0x1.aac6053778228p20 0x0.0p0 -0x1.8382e3e19da44p6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:8226 2 OK 0x1.2bd407aeae848p21 -0x1.aac6053778228p20 0x0.0p0 -0x1.4c7d1c1e625bcp6 0x1.32eeeeee1672cp5 0x0.0p0 F +REG epsg:8226 3 OK -0x1.222bb96efda95p20 0x1.cf81c3112fc56p20 0x0.0p0 -0x1.8382e3e0e7308p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:8226 4 OK 0x1.07015cb366415p21 0x1.cf81c3112fc56p20 0x0.0p0 -0x1.4c7d1c1f18cf8p6 0x1.82eeeeeda989bp5 0x0.0p0 F +REG epsg:8227 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8227 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8227 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8227 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8227 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8230 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8230 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8230 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8230 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8230 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8232 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8232 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8232 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8232 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8232 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8233 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8233 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8233 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8233 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8233 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8237 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8237 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8237 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8237 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8237 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8238 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8238 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8238 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8238 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8238 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8240 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8240 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8240 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8240 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8240 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8242 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8242 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8242 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8242 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8242 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8246 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8246 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8246 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8246 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8246 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8247 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8247 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8247 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8247 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8247 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8249 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8249 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8249 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8249 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8249 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8250 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8250 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8250 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8250 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8250 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8252 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8252 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8252 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8252 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8252 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8253 0 OK 0x1.854a64p22 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8253 1 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8253 2 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 -0x1.0d9efeb8661c1p19 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8253 3 OK 0x1.8257e34e3480dp22 -0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8253 4 OK 0x1.8257e34e3480dp22 0x1.0e67c073d6a64p19 0x1.0d9efeb8661c1p19 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8255 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:8255 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8255 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:8255 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8255 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:8311 0 OK 0x1.5f9p16 0x0.0p0 0x0.0p0 -0x1.d6aaaaaaaaaaep6 0x1.5cp5 0x0.0p0 F +REG epsg:8311 1 OK -0x1.f3b6a3cb25382p18 -0x1.0422669c1e6d5p19 0x0.0p0 -0x1.f23d1741a7b23p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8311 2 OK 0x1.51bf51e5929cbp19 -0x1.0422669c1e6d5p19 0x0.0p0 -0x1.bb183e13ada37p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8311 3 OK -0x1.997e8a0d27a45p18 0x1.1aa20f6ff2bb7p19 0x0.0p0 -0x1.f23d1740ed914p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8311 4 OK 0x1.24a3450693d2bp19 0x1.1aa20f6ff2bb8p19 0x0.0p0 -0x1.bb183e1467c47p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8312 0 OK 0x1.205ae5cc63f14p18 0x0.0p0 0x0.0p0 -0x1.d6aaaaaaaaaaep6 0x1.5cp5 0x0.0p0 F +REG epsg:8312 1 OK -0x1.99deb4b4de3c2p20 -0x1.aabac8934006p20 0x0.0p0 -0x1.f23d1741a7b23p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8312 2 OK 0x1.150613cd881aep21 -0x1.aabac8934005ep20 0x0.0p0 -0x1.bb183e13ada37p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8312 3 OK -0x1.4fdf0dc969f7p20 0x1.cfa30b36a2571p20 0x0.0p0 -0x1.f23d1740ed914p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8312 4 OK 0x1.e00c80af9bf07p20 0x1.cfa30b36a2573p20 0x0.0p0 -0x1.bb183e1467c47p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8313 0 OK 0x1.388p14 0x0.0p0 0x0.0p0 -0x1.dcp6 0x1.5cp5 0x0.0p0 F +REG epsg:8313 1 OK -0x1.1c0f560cc8c75p19 -0x1.0427ba45b2868p19 0x0.0p0 -0x1.f7926c96fd075p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8313 2 OK 0x1.2f97560cc8c75p19 -0x1.0427ba45b2868p19 0x0.0p0 -0x1.c06d936902f8ap6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8313 3 OK -0x1.dde4b96a71d18p18 0x1.1aa7d90a80cfdp19 0x0.0p0 -0x1.f7926c9642e66p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8313 4 OK 0x1.027a5cb538e8cp19 0x1.1aa7d90a80cfdp19 0x0.0p0 -0x1.c06d9369bd19ap6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8314 0 OK 0x1.0050cc432ca57p16 0x0.0p0 0x0.0p0 -0x1.dcp6 0x1.5cp5 0x0.0p0 F +REG epsg:8314 1 OK -0x1.d1fa3fe3403acp20 -0x1.aac3858de1aa4p20 0x0.0p0 -0x1.f7926c96fd075p6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8314 2 OK 0x1.f204596ba5cf6p20 -0x1.aac3858de1aa4p20 0x0.0p0 -0x1.c06d936902f8ap6 0x1.33ffffff22ecbp5 0x0.0p0 F +REG epsg:8314 3 OK -0x1.87f9150e67b58p20 0x1.cfac89aa6d2c9p20 0x0.0p0 -0x1.f7926c9642e66p6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8314 4 OK 0x1.a8032e96cd4a2p20 0x1.cfac89aa6d2c9p20 0x0.0p0 -0x1.c06d9369bd19ap6 0x1.83fffffeb596ap5 0x0.0p0 F +REG epsg:8315 0 OK 0x1.d4cp14 0x1.388p14 0x0.0p0 -0x1.edaaaaaaaaaaep6 0x1.6caaaaaaaaaa3p5 0x0.0p0 F +REG epsg:8315 1 OK -0x1.1966822d7d11cp19 -0x1.f13c245a9575p18 0x0.0p0 -0x1.051f264782b5bp7 0x1.44aaaaaaaaa93p5 0x0.0p0 F +REG epsg:8315 2 OK 0x1.36b2822d7d12fp19 -0x1.f13c245a95738p18 0x0.0p0 -0x1.d11708c64fea4p6 0x1.44aaaaaaaaa95p5 0x0.0p0 F +REG epsg:8315 3 OK -0x1.d222bd469018ep18 0x1.24a2121df57a4p19 0x0.0p0 -0x1.051f264782b5bp7 0x1.94aaaaaaaa511p5 0x0.0p0 F +REG epsg:8315 4 OK 0x1.065d5ea3480d6p19 0x1.24a2121df57aap19 0x0.0p0 -0x1.d11708c64fea4p6 0x1.94aaaaaaaa512p5 0x0.0p0 F +REG epsg:8316 0 OK 0x1.8079326809d49p16 0x1.0050cc432ca57p16 0x0.0p0 -0x1.edaaaaaaaaaaep6 0x1.6caaaaaaaaaa3p5 0x0.0p0 F +REG epsg:8316 1 OK -0x1.cd9d6805e1b79p20 -0x1.97d648d2069ebp20 0x0.0p0 -0x1.051f264782b5bp7 0x1.44aaaaaaaaa93p5 0x0.0p0 F +REG epsg:8316 2 OK 0x1.fdac8e52e2f41p20 -0x1.97d648d2069d8p20 0x0.0p0 -0x1.d11708c64fea4p6 0x1.44aaaaaaaaa95p5 0x0.0p0 F +REG epsg:8316 3 OK -0x1.7e5443395654dp20 0x1.e00a8939e1067p20 0x0.0p0 -0x1.051f264782b5bp7 0x1.94aaaaaaaa511p5 0x0.0p0 F +REG epsg:8316 4 OK 0x1.ae6369865791p20 0x1.e00a8939e1071p20 0x0.0p0 -0x1.d11708c64fea4p6 0x1.94aaaaaaaa512p5 0x0.0p0 F +REG epsg:8317 0 OK 0x1.388p14 0x0.0p0 0x0.0p0 -0x1.de88888888885p6 0x1.62p5 0x0.0p0 F +REG epsg:8317 1 OK -0x1.1ca059454129ap19 -0x1.03d18d481a6f4p19 0x0.0p0 -0x1.fa745b65ae44p6 0x1.39ffffff0746p5 0x0.0p0 F +REG epsg:8317 2 OK 0x1.3028594541291p19 -0x1.03d18d481a6f5p19 0x0.0p0 -0x1.c29cb5ab62cccp6 0x1.39ffffff0746p5 0x0.0p0 F +REG epsg:8317 3 OK -0x1.dca2534fa85adp18 0x1.1ae88aea71fcap19 0x0.0p0 -0x1.fa745b64de2c3p6 0x1.89fffffe9810bp5 0x0.0p0 F +REG epsg:8317 4 OK 0x1.01d929a7d42cfp19 0x1.1ae88aea71fc9p19 0x0.0p0 -0x1.c29cb5ac32e48p6 0x1.89fffffe9810bp5 0x0.0p0 F +REG epsg:8318 0 OK 0x1.0050cc432ca57p16 0x0.0p0 0x0.0p0 -0x1.de88888888885p6 0x1.62p5 0x0.0p0 F +REG epsg:8318 1 OK -0x1.d2e8218f2c025p20 -0x1.aa362843e2ccp20 0x0.0p0 -0x1.fa745b65ae44p6 0x1.39ffffff0746p5 0x0.0p0 F +REG epsg:8318 2 OK 0x1.f2f23b179196p20 -0x1.aa362843e2cc1p20 0x0.0p0 -0x1.c29cb5ab62cccp6 0x1.39ffffff0746p5 0x0.0p0 F +REG epsg:8318 3 OK -0x1.86f0a5c2ae4f2p20 0x1.d016aa1871134p20 0x0.0p0 -0x1.fa745b64de2c3p6 0x1.89fffffe9810bp5 0x0.0p0 F +REG epsg:8318 4 OK 0x1.a6fabf4b13e2fp20 0x1.d016aa1871133p20 0x0.0p0 -0x1.c29cb5ac32e48p6 0x1.89fffffe9810bp5 0x0.0p0 F +REG epsg:8319 0 OK 0x1.388p16 0x0.0p0 0x0.0p0 -0x1.d9aaaaaaaaaaep6 0x1.4ep5 0x0.0p0 F +REG epsg:8319 1 OK -0x1.fad571ae5e65cp18 -0x1.04d5f01f91d97p19 0x0.0p0 -0x1.f47968dd7b01bp6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8319 2 OK 0x1.4b8ab8d72f341p19 -0x1.04d5f01f91d96p19 0x0.0p0 -0x1.bedbec77da53fp6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8319 3 OK -0x1.a5fd590abde29p18 0x1.1a02701a820b9p19 0x0.0p0 -0x1.f47968dcec62fp6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8319 4 OK 0x1.211eac855ef25p19 0x1.1a02701a820bbp19 0x0.0p0 -0x1.bedbec7868f2bp6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8320 0 OK 0x1.0050cc432ca57p18 0x0.0p0 0x0.0p0 -0x1.d9aaaaaaaaaaep6 0x1.4ep5 0x0.0p0 F +REG epsg:8320 1 OK -0x1.9fb5c9c1c0c08p20 -0x1.abe14cc23bda5p20 0x0.0p0 -0x1.f47968dd7b01bp6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8320 2 OK 0x1.0fef17f1ab8a9p21 -0x1.abe14cc23bda2p20 0x0.0p0 -0x1.bedbec77da53fp6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8320 3 OK -0x1.5a1ebfa054f39p20 0x1.ce9d322f8406ep20 0x0.0p0 -0x1.f47968dcec62fp6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8320 4 OK 0x1.da4725c1eb48p20 0x1.ce9d322f8407p20 0x0.0p0 -0x1.bedbec7868f2bp6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8321 0 OK 0x1.388p15 0x1.117p16 0x0.0p0 -0x1.d500000000001p6 0x1.69ffffffffff4p5 0x0.0p0 F +REG epsg:8321 1 OK -0x1.144095a55a2a7p19 -0x1.c0b9d982c20aap18 0x0.0p0 -0x1.f168933deea43p6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8321 2 OK 0x1.3b5095a55a2bp19 -0x1.c0b9d982c20aap18 0x0.0p0 -0x1.b8976cc2115bdp6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8321 3 OK -0x1.c8f4e576f89c7p18 0x1.3ced57b16b978p19 0x0.0p0 -0x1.f168933deea43p6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8321 4 OK 0x1.0b8a72bb7c4ebp19 0x1.3ced57b16b978p19 0x0.0p0 -0x1.b8976cc2115bdp6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8322 0 OK 0x1.0050cc432ca57p17 0x1.c08d6577318fbp17 0x0.0p0 -0x1.d500000000001p6 0x1.69ffffffffff4p5 0x0.0p0 F +REG epsg:8322 1 OK -0x1.c52b75256c252p20 -0x1.700cad5d460fep20 0x0.0p0 -0x1.f168933deea43p6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8322 2 OK 0x1.029fd41b1ba7bp21 -0x1.700cad5d460fep20 0x0.0p0 -0x1.b8976cc2115bdp6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8322 3 OK -0x1.76cce5de39506p20 0x1.03f26073b8de2p21 0x0.0p0 -0x1.f168933deea43p6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8322 4 OK 0x1.b6e118ef047a9p20 0x1.03f26073b8de2p21 0x0.0p0 -0x1.b8976cc2115bdp6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8323 0 OK 0x1.d4cp15 -0x1.d4cp15 0x0.0p0 -0x1.e9p6 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:8323 1 OK -0x1.07ec0cf4777d2p19 -0x1.212d21f5820d9p19 0x0.0p0 -0x1.01f4d1dd9cddbp7 0x1.27fffffffffd9p5 0x0.0p0 F +REG epsg:8323 2 OK 0x1.42840cf4777d2p19 -0x1.212d21f5820d9p19 0x0.0p0 -0x1.ce165c44c644ap6 0x1.27fffffffffd9p5 0x0.0p0 F +REG epsg:8323 3 OK -0x1.ba96fd60543p18 0x1.f86b1d668c2aep18 0x0.0p0 -0x1.01f4d1dd9cddbp7 0x1.77ffffffffff8p5 0x0.0p0 F +REG epsg:8323 4 OK 0x1.17e37eb02a18p19 0x1.f86b1d668c2aep18 0x0.0p0 -0x1.ce165c44c644ap6 0x1.77ffffffffff8p5 0x0.0p0 F +REG epsg:8324 0 OK 0x1.80793264c2f83p17 -0x1.80793264c2f83p17 0x0.0p0 -0x1.e9p6 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:8324 1 OK -0x1.b0f16a95bc1a3p20 -0x1.da5eddab980bp20 0x0.0p0 -0x1.01f4d1dd9cddbp7 0x1.27fffffffffd9p5 0x0.0p0 F +REG epsg:8324 2 OK 0x1.0887db97766c2p21 -0x1.da5eddab980bp20 0x0.0p0 -0x1.ce165c44c644ap6 0x1.27fffffffffd9p5 0x0.0p0 F +REG epsg:8324 3 OK -0x1.6b043e04182fdp20 0x1.9dbaa0d97d33p20 0x0.0p0 -0x1.01f4d1dd9cddbp7 0x1.77ffffffffff8p5 0x0.0p0 F +REG epsg:8324 4 OK 0x1.cb228a9d48eddp20 0x1.9dbaa0d97d33p20 0x0.0p0 -0x1.ce165c44c644ap6 0x1.77ffffffffff8p5 0x0.0p0 F +REG epsg:8325 0 OK 0x1.d4cp14 0x1.1b34p18 0x0.0p0 -0x1.e1p6 0x1.77ffffffffff8p5 0x0.0p0 F +REG epsg:8325 1 OK -0x1.1a62466c361a9p19 -0x1.cfafcef602d0cp17 0x0.0p0 -0x1.fe535974468ddp6 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:8325 2 OK 0x1.37ae466c361a9p19 -0x1.cfafcef602d0cp17 0x0.0p0 -0x1.c3aca68bb9724p6 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:8325 3 OK -0x1.cf43a0813fcfp18 0x1.a8d1d5f0daec7p19 0x0.0p0 -0x1.fe535974468ddp6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:8325 4 OK 0x1.04edd0409fe78p19 0x1.a8d1d5f0daec7p19 0x0.0p0 -0x1.c3aca68bb9724p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:8326 0 OK 0x1.8079326809d49p16 0x1.d092723a29c77p19 0x0.0p0 -0x1.e1p6 0x1.77ffffffffff8p5 0x0.0p0 F +REG epsg:8326 1 OK -0x1.cf3a68c57761dp20 -0x1.7c520c2f88927p19 0x0.0p0 -0x1.fe535974468ddp6 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:8326 2 OK 0x1.ff498f12789c7p20 -0x1.7c520c2f88927p19 0x0.0p0 -0x1.c3aca68bb9724p6 0x1.4ffffffffffedp5 0x0.0p0 F +REG epsg:8326 3 OK -0x1.7bf950ead0f34p20 0x1.5c70fb113caap21 0x0.0p0 -0x1.fe535974468ddp6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:8326 4 OK 0x1.ac087737d22dep20 0x1.5c70fb113caap21 0x0.0p0 -0x1.c3aca68bb9724p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG epsg:8327 0 OK 0x1.86ap16 0x1.117p17 0x0.0p0 -0x1.e200000000001p6 0x1.715555555554bp5 0x0.0p0 F +REG epsg:8327 1 OK -0x1.ef6668a1a529cp18 -0x1.7b7daede5caa6p18 0x0.0p0 -0x1.fee0d4657d382p6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8327 2 OK 0x1.595b3450d296p19 -0x1.7b7daede5caa6p18 0x0.0p0 -0x1.c51f2b9a82c7ep6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8327 3 OK -0x1.8cbec63ed5fe5p18 0x1.5f724ee0140ep19 0x0.0p0 -0x1.fee0d4657d382p6 0x1.9955555555049p5 0x0.0p0 F +REG epsg:8327 4 OK 0x1.2807631f6b002p19 0x1.5f724ee0140ep19 0x0.0p0 -0x1.c51f2b9a82c7ep6 0x1.9955555555048p5 0x0.0p0 F +REG epsg:8328 0 OK 0x1.4064ff53f7ceep18 0x1.c08d65758e219p18 0x0.0p0 -0x1.e200000000001p6 0x1.715555555554bp5 0x0.0p0 F +REG epsg:8328 1 OK -0x1.96550128892e2p20 -0x1.374323962399dp20 0x0.0p0 -0x1.fee0d4657d382p6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8328 2 OK 0x1.1b43c069428bbp21 -0x1.374323962399dp20 0x0.0p0 -0x1.c51f2b9a82c7ep6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8328 3 OK -0x1.456a14d421c7p20 0x1.20428b46e7d7bp21 0x0.0p0 -0x1.fee0d4657d382p6 0x1.9955555555049p5 0x0.0p0 F +REG epsg:8328 4 OK 0x1.e59c947e1dbp20 0x1.20428b46e7d7bp21 0x0.0p0 -0x1.c51f2b9a82c7ep6 0x1.9955555555048p5 0x0.0p0 F +REG epsg:8329 0 OK 0x1.388p15 -0x1.388p16 0x0.0p0 -0x1.e200000000001p6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:8329 1 OK -0x1.12d6ae8e35d36p19 -0x1.2a58fac573df5p19 0x0.0p0 -0x1.fd926c9711abbp6 0x1.33fffffffffe3p5 0x0.0p0 F +REG epsg:8329 2 OK 0x1.39e6ae8e35d4p19 -0x1.2a58fac573df5p19 0x0.0p0 -0x1.c66d9368ee546p6 0x1.33fffffffffe3p5 0x0.0p0 F +REG epsg:8329 3 OK -0x1.cbcf5225fa118p18 0x1.e6028ff2044ecp18 0x0.0p0 -0x1.fd926c9711abbp6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:8329 4 OK 0x1.0cf7a912fd094p19 0x1.e6028ff2044ecp18 0x0.0p0 -0x1.c66d9368ee546p6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:8330 0 OK 0x1.0050cc432ca57p17 -0x1.0050cc432ca57p18 0x0.0p0 -0x1.e200000000001p6 0x1.5bffffffffffp5 0x0.0p0 F +REG epsg:8330 1 OK -0x1.c2d9c902d1cabp20 -0x1.e96a5221a21ap20 0x0.0p0 -0x1.fd926c9711abbp6 0x1.33fffffffffe3p5 0x0.0p0 F +REG epsg:8330 2 OK 0x1.0176fe09ce7a8p21 -0x1.e96a5221a21ap20 0x0.0p0 -0x1.c66d9368ee546p6 0x1.33fffffffffe3p5 0x0.0p0 F +REG epsg:8330 3 OK -0x1.7923ffd9f19b4p20 0x1.8ea158804b2f7p20 0x0.0p0 -0x1.fd926c9711abbp6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:8330 4 OK 0x1.b93832eabcc57p20 0x1.8ea158804b2f7p20 0x0.0p0 -0x1.c66d9368ee546p6 0x1.83ffffffff808p5 0x0.0p0 F +REG epsg:8331 0 OK 0x1.117p16 0x0.0p0 0x0.0p0 -0x1.d655555555554p6 0x1.4ep5 0x0.0p0 F +REG epsg:8331 1 OK -0x1.024bf9329ba91p19 -0x1.04d54536ea2cp19 0x0.0p0 -0x1.f124138825ac1p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8331 2 OK 0x1.46a7f9329baa4p19 -0x1.04d54536ea2bfp19 0x0.0p0 -0x1.bb86972284fe5p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8331 3 OK -0x1.afc011595e099p18 0x1.1a01b75226246p19 0x0.0p0 -0x1.f1241387970d5p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8331 4 OK 0x1.1c3c08acaf05ep19 0x1.1a01b75226248p19 0x0.0p0 -0x1.bb869723139d1p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8332 0 OK 0x1.c08d6577318fbp17 0x0.0p0 0x0.0p0 -0x1.d655555555554p6 0x1.4ep5 0x0.0p0 F +REG epsg:8332 1 OK -0x1.a7b715c3b305ap20 -0x1.abe03465817bep20 0x0.0p0 -0x1.f124138825ac1p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8332 2 OK 0x1.0bed3790bfb5cp21 -0x1.abe03465817bcp20 0x0.0p0 -0x1.bb86972284fe5p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8332 3 OK -0x1.6220393b531d1p20 0x1.ce9c0310806abp20 0x0.0p0 -0x1.f1241387970d5p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8332 4 OK 0x1.d24392991f82cp20 0x1.ce9c0310806aep20 0x0.0p0 -0x1.bb869723139d1p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8333 0 OK 0x1.86ap15 0x1.fbdp16 0x0.0p0 -0x1.dcp6 0x1.715555555554bp5 0x0.0p0 F +REG epsg:8333 1 OK -0x1.101f1a25bd63cp19 -0x1.8544fca067198p18 0x0.0p0 -0x1.f8e0d4657d381p6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8333 2 OK 0x1.40f31a25bd645p19 -0x1.8544fca067198p18 0x0.0p0 -0x1.bf1f2b9a82c7ep6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8333 3 OK -0x1.bd95f045d6ce2p18 0x1.5a921eaf6e5f3p19 0x0.0p0 -0x1.f8e0d4657d381p6 0x1.9955555555049p5 0x0.0p0 F +REG epsg:8333 4 OK 0x1.0f9ef822eb678p19 0x1.5a921eaf6e5f3p19 0x0.0p0 -0x1.bf1f2b9a82c7ep6 0x1.9955555555049p5 0x0.0p0 F +REG epsg:8334 0 OK 0x1.4064ff559b3dp17 0x1.a0834bedfa43fp18 0x0.0p0 -0x1.dcp6 0x1.715555555554bp5 0x0.0p0 F +REG epsg:8334 1 OK -0x1.be64be0aa432ap20 -0x1.3f485fab0257ep20 0x0.0p0 -0x1.f8e0d4657d381p6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8334 2 OK 0x1.073efef005816p21 -0x1.3f485fab0257ep20 0x0.0p0 -0x1.bf1f2b9a82c7ep6 0x1.495555555553fp5 0x0.0p0 F +REG epsg:8334 3 OK -0x1.6d794d22e8497p20 0x1.1c42c481e108cp21 0x0.0p0 -0x1.f8e0d4657d381p6 0x1.9955555555049p5 0x0.0p0 F +REG epsg:8334 4 OK 0x1.bd928cf84f198p20 0x1.1c42c481e108cp21 0x0.0p0 -0x1.bf1f2b9a82c7ep6 0x1.9955555555049p5 0x0.0p0 F +REG epsg:8335 0 OK 0x1.d4cp15 0x0.0p0 0x0.0p0 -0x1.d800000000001p6 0x1.5fffffffffff1p5 0x0.0p0 F +REG epsg:8335 1 OK -0x1.097fc62090bfcp19 -0x1.031af627ea689p19 0x0.0p0 -0x1.f3cda338d6218p6 0x1.37fffffffffe2p5 0x0.0p0 F +REG epsg:8335 2 OK 0x1.4417c62090c18p19 -0x1.031af627ea689p19 0x0.0p0 -0x1.bc325cc729de7p6 0x1.37fffffffffe2p5 0x0.0p0 F +REG epsg:8335 3 OK -0x1.b788620cd03d7p18 0x1.1a49bb6540c91p19 0x0.0p0 -0x1.f3cda338d6218p6 0x1.87ffffffff8a8p5 0x0.0p0 F +REG epsg:8335 4 OK 0x1.165c310668204p19 0x1.1a49bb6540c91p19 0x0.0p0 -0x1.bc325cc729de7p6 0x1.87ffffffff8a8p5 0x0.0p0 F +REG epsg:8336 0 OK 0x1.80793264c2f83p17 0x0.0p0 0x0.0p0 -0x1.d800000000001p6 0x1.5fffffffffff1p5 0x0.0p0 F +REG epsg:8336 1 OK -0x1.b387b130b8859p20 -0x1.a90aa1e8c9186p20 0x0.0p0 -0x1.f3cda338d6218p6 0x1.37fffffffffe2p5 0x0.0p0 F +REG epsg:8336 2 OK 0x1.09d2fee4f4a34p21 -0x1.a90aa1e8c9186p20 0x0.0p0 -0x1.bc325cc729de7p6 0x1.37fffffffffe2p5 0x0.0p0 F +REG epsg:8336 3 OK -0x1.688257240bb5dp20 0x1.cf1225f812411p20 0x0.0p0 -0x1.f3cda338d6218p6 0x1.87ffffffff8a8p5 0x0.0p0 F +REG epsg:8336 4 OK 0x1.c8a0a3bd3c764p20 0x1.cf1225f812411p20 0x0.0p0 -0x1.bc325cc729de7p6 0x1.87ffffffff8a8p5 0x0.0p0 F +REG epsg:8337 0 OK 0x1.117p16 0x0.0p0 0x0.0p0 -0x1.e155555555553p6 0x1.4ep5 0x0.0p0 F +REG epsg:8337 1 OK -0x1.024e97f2a00cbp19 -0x1.04d79b65350b3p19 0x0.0p0 -0x1.fc24138825ac1p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8337 2 OK 0x1.46aa97f2a00b8p19 -0x1.04d79b65350b5p19 0x0.0p0 -0x1.c686972284fe6p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8337 3 OK -0x1.afc48c462d838p18 0x1.1a043e0f67cddp19 0x0.0p0 -0x1.fc241387970d6p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8337 4 OK 0x1.1c3e462316c0bp19 0x1.1a043e0f67cdbp19 0x0.0p0 -0x1.c6869723139d2p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8338 0 OK 0x1.c08d6577318fbp17 0x0.0p0 0x0.0p0 -0x1.e155555555553p6 0x1.4ep5 0x0.0p0 F +REG epsg:8338 1 OK -0x1.a7bb621384781p20 -0x1.abe409aa0dc67p20 0x0.0p0 -0x1.fc24138825ac1p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8338 2 OK 0x1.0bef5db8a86dp21 -0x1.abe409aa0dc6ap20 0x0.0p0 -0x1.c686972284fe6p6 0x1.25ffffff58431p5 0x0.0p0 F +REG epsg:8338 3 OK -0x1.6223e5f37aefap20 0x1.cea027fd0d0dbp20 0x0.0p0 -0x1.fc241387970d6p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8338 4 OK 0x1.d2473f514751dp20 0x1.cea027fd0d0d8p20 0x0.0p0 -0x1.c6869723139d2p6 0x1.75fffffef23dbp5 0x0.0p0 F +REG epsg:8339 0 OK 0x1.388p13 0x1.d4cp15 0x0.0p0 -0x1.ea55555555554p6 0x1.53fffffffffeep5 0x0.0p0 F +REG epsg:8339 1 OK -0x1.20be88cda4e7ep19 -0x1.ccd4a4215bafcp18 0x0.0p0 -0x1.02bae6c432872p7 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8339 2 OK 0x1.2a8288cda4e7ep19 -0x1.ccd4a4215bafcp18 0x0.0p0 -0x1.cf34dd22459c3p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8339 3 OK -0x1.eab65522bf59cp18 0x1.3704646678b41p19 0x0.0p0 -0x1.02bae6c432872p7 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8339 4 OK 0x1.fe3e5522bf59cp18 0x1.3704646678b41p19 0x0.0p0 -0x1.cf34dd22459c3p6 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8340 0 OK 0x1.0050cc49ba5e3p15 0x1.80793264c2f83p17 0x0.0p0 -0x1.ea55555555554p6 0x1.53fffffffffeep5 0x0.0p0 F +REG epsg:8340 1 OK -0x1.d9a970343f02cp20 -0x1.79fa563e4db53p20 0x0.0p0 -0x1.02bae6c432872p7 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8340 2 OK 0x1.e9ae7cf8daa8ap20 -0x1.79fa563e4db53p20 0x0.0p0 -0x1.cf34dd22459c3p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8340 3 OK -0x1.927cb0a9bbf95p20 0x1.fe32e12bc9e1bp20 0x0.0p0 -0x1.02bae6c432872p7 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8340 4 OK 0x1.a281bd6e579f3p20 0x1.fe32e12bc9e1bp20 0x0.0p0 -0x1.cf34dd22459c3p6 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8341 0 OK 0x1.d4cp14 0x1.5f9p16 0x0.0p0 -0x1.dcp6 0x1.69ffffffffff4p5 0x0.0p0 F +REG epsg:8341 1 OK -0x1.1926bfb37cca6p19 -0x1.ad39212d19244p18 0x0.0p0 -0x1.f868933deea43p6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8341 2 OK 0x1.3672bfb37cca6p19 -0x1.ad39212d19244p18 0x0.0p0 -0x1.bf976cc2115bdp6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8341 3 OK -0x1.d2bfe1342bd3cp18 0x1.46b552c38e4cbp19 0x0.0p0 -0x1.f868933deea43p6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8341 4 OK 0x1.06abf09a15e9ep19 0x1.46b552c38e4cbp19 0x0.0p0 -0x1.bf976cc2115bdp6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8342 0 OK 0x1.8079326809d49p16 0x1.205ae5cc63f14p18 0x0.0p0 -0x1.dcp6 0x1.69ffffffffff4p5 0x0.0p0 F +REG epsg:8342 1 OK -0x1.cd34d04e8bed3p20 -0x1.600d9931e4746p20 0x0.0p0 -0x1.f868933deea43p6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8342 2 OK 0x1.fd43f69b8d27dp20 -0x1.600d9931e4746p20 0x0.0p0 -0x1.bf976cc2115bdp6 0x1.41fffffffffe7p5 0x0.0p0 F +REG epsg:8342 3 OK -0x1.7ed5269266304p20 0x1.0bf82aaff36f2p21 0x0.0p0 -0x1.f868933deea43p6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8342 4 OK 0x1.aee44cdf676aep20 0x1.0bf82aaff36f2p21 0x0.0p0 -0x1.bf976cc2115bdp6 0x1.91ffffffffa0dp5 0x0.0p0 F +REG epsg:8343 0 OK 0x1.d4cp15 0x0.0p0 0x0.0p0 -0x1.d6p6 0x1.6ap5 0x0.0p0 F +REG epsg:8343 1 OK -0x1.09ef410e66dfp19 -0x1.03686c603bd9bp19 0x0.0p0 -0x1.f268933da033p6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:8343 2 OK 0x1.4487410e66dfp19 -0x1.03686c603bd9bp19 0x0.0p0 -0x1.b9976cc25fccfp6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:8343 3 OK -0x1.b3f1dae71fb7p18 0x1.1b4fd889f1669p19 0x0.0p0 -0x1.f268933caf046p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:8343 4 OK 0x1.1490ed738fdb8p19 0x1.1b4fd889f1669p19 0x0.0p0 -0x1.b9976cc350fb8p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:8344 0 OK 0x1.80793264c2f83p17 0x0.0p0 0x0.0p0 -0x1.d6p6 0x1.6ap5 0x0.0p0 F +REG epsg:8344 1 OK -0x1.b43e9104d08c8p20 -0x1.a989b3cc39dd5p20 0x0.0p0 -0x1.f268933da033p6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:8344 2 OK 0x1.0a2e6ecf00a54p21 -0x1.a989b3cc39dd5p20 0x0.0p0 -0x1.b9976cc25fccfp6 0x1.41fffffedd1abp5 0x0.0p0 F +REG epsg:8344 3 OK -0x1.6590f462dd5bbp20 0x1.d0c02005e55cfp20 0x0.0p0 -0x1.f268933caf046p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:8344 4 OK 0x1.c5af40fc0e19bp20 0x1.d0c02005e55cfp20 0x0.0p0 -0x1.b9976cc350fb8p6 0x1.91fffffe6d0dbp5 0x0.0p0 F +REG epsg:8345 0 OK 0x1.388p15 0x1.d4cp15 0x0.0p0 -0x1.dffffffffffffp6 0x1.53fffffffffeep5 0x0.0p0 F +REG epsg:8345 1 OK -0x1.121faca0bcc1ep19 -0x1.cce1458a389acp18 0x0.0p0 -0x1.fb2078330fb92p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8345 2 OK 0x1.392faca0bcc02p19 -0x1.cce1458a389acp18 0x0.0p0 -0x1.c4df87ccf047p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8345 3 OK -0x1.cd76809a819b1p18 0x1.370b3e1aebde9p19 0x0.0p0 -0x1.fb2078330fb92p6 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8345 4 OK 0x1.0dcb404d40ccp19 0x1.370b3e1aebde9p19 0x0.0p0 -0x1.c4df87ccf047p6 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8346 0 OK 0x1.0050cc432ca57p17 0x1.80793264c2f83p17 0x0.0p0 -0x1.dffffffffffffp6 0x1.53fffffffffeep5 0x0.0p0 F +REG epsg:8346 1 OK -0x1.c1ad9374877e6p20 -0x1.7a04b2517521ep20 0x0.0p0 -0x1.fb2078330fb92p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8346 2 OK 0x1.00e0e342a9526p21 -0x1.7a04b2517521ep20 0x0.0p0 -0x1.c4df87ccf047p6 0x1.2bfffffffffdep5 0x0.0p0 F +REG epsg:8346 3 OK -0x1.7a7f18da1c3d7p20 0x1.fe3e1dfbc7fa6p20 0x0.0p0 -0x1.fb2078330fb92p6 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8346 4 OK 0x1.ba934beae7645p20 0x1.fe3e1dfbc7fa6p20 0x0.0p0 -0x1.c4df87ccf047p6 0x1.7bffffffff6abp5 0x0.0p0 F +REG epsg:8347 0 OK 0x1.388p14 0x0.0p0 0x0.0p0 -0x1.e8p6 0x1.58p5 0x0.0p0 F +REG epsg:8347 1 OK -0x1.1babdacf20a04p19 -0x1.045b912caf27fp19 0x0.0p0 -0x1.01ac5bb98ef05p7 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:8347 2 OK 0x1.2f33dacf209f1p19 -0x1.045b912caf281p19 0x0.0p0 -0x1.cca7488ce21f6p6 0x1.2fffffff33a9ep5 0x0.0p0 F +REG epsg:8347 3 OK -0x1.deaf23f494a6bp18 0x1.1a78c78d2613ep19 0x0.0p0 -0x1.01ac5bb9389a8p7 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8347 4 OK 0x1.02df91fa4a526p19 0x1.1a78c78d2613cp19 0x0.0p0 -0x1.cca7488d8ecb1p6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8348 0 OK 0x1.0050cc432ca57p16 0x0.0p0 0x0.0p0 -0x1.e8p6 0x1.58p5 0x0.0p0 F +REG epsg:8348 1 OK -0x1.d1570eeaf54aap20 -0x1.ab188f683580bp20 0x0.0p0 -0x1.01ac5bb98ef05p7 0x1.2fffffff33a9fp5 0x0.0p0 F +REG epsg:8348 2 OK 0x1.f16128735add5p20 -0x1.ab188f683580ep20 0x0.0p0 -0x1.cca7488ce21f6p6 0x1.2fffffff33a9ep5 0x0.0p0 F +REG epsg:8348 3 OK -0x1.889f1b23a738p20 0x1.cf5f53714936cp20 0x0.0p0 -0x1.01ac5bb9389a8p7 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8348 4 OK 0x1.a8a934ac0ccafp20 0x1.cf5f537149369p20 0x0.0p0 -0x1.cca7488d8ecb1p6 0x1.7ffffffec80cfp5 0x0.0p0 F +REG epsg:8349 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8349 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8349 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8349 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8349 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8350 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8350 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8350 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8350 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:8350 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG epsg:9054 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG epsg:9054 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:9054 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG epsg:9054 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG epsg:9054 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:102001 0 OK 0x0.0p0 0x1.941a025851e5bp20 0x0.0p0 -0x1.8000000000001p6 0x1.b8p5 0x0.0p0 F +REG esri:102001 1 OK -0x1.11e9ef0d6389ep21 0x1.b0035036cfe8fp18 0x0.0p0 -0x1.e89b57c07a845p6 0x1.4p5 0x0.0p0 F +REG esri:102001 2 OK 0x1.11e9ef0d638ap21 0x1.b0035036cfe9cp18 0x0.0p0 -0x1.1764a83f857bbp6 0x1.3fffffffffffdp5 0x0.0p0 F +REG esri:102001 3 OK -0x1.db650649e953ep19 0x1.affc97a4122a9p21 0x0.0p0 -0x1.e89b57c07a845p6 0x1.17ffffffffffep6 0x0.0p0 F +REG esri:102001 4 OK 0x1.db650649e9541p19 0x1.affc97a4122abp21 0x0.0p0 -0x1.1764a83f857bbp6 0x1.17ffffffffffep6 0x0.0p0 F +REG esri:102002 0 OK 0x0.0p0 0x1.9b512c0bd825p20 0x0.0p0 -0x1.8000000000001p6 0x1.b7ffffffffd9fp5 0x0.0p0 F +REG esri:102002 1 OK -0x1.145d9dd8c33f4p21 0x1.bd2964de88a54p18 0x0.0p0 -0x1.e89b57c07a845p6 0x1.3ffffffffffe5p5 0x0.0p0 F +REG esri:102002 2 OK 0x1.145d9dd8c33f6p21 0x1.bd2964de88a6p18 0x0.0p0 -0x1.1764a83f857bbp6 0x1.3ffffffffffe6p5 0x0.0p0 F +REG esri:102002 3 OK -0x1.dae2e2ab3ff93p19 0x1.af3fefb2c2971p21 0x0.0p0 -0x1.e89b57c07a845p6 0x1.17ffffffffffcp6 0x0.0p0 F +REG esri:102002 4 OK 0x1.dae2e2ab3ff98p19 0x1.af3fefb2c2971p21 0x0.0p0 -0x1.1764a83f857bbp6 0x1.17ffffffffffcp6 0x0.0p0 F +REG esri:102003 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x1.2bffffffffffcp5 0x0.0p0 F +REG esri:102003 1 OK -0x1.e1b753873bb95p20 -0x1.6574f69c5d602p20 0x0.0p0 -0x1.cba0db351d0e3p6 0x1.67fffffffffffp4 0x0.0p0 F +REG esri:102003 2 OK 0x1.e1b753873bb9ap20 -0x1.6574f69c5d602p20 0x0.0p0 -0x1.345f24cae2f1dp6 0x1.67fffffffffffp4 0x0.0p0 F +REG esri:102003 3 OK -0x1.415758217a109p20 0x1.b5f9e4304069dp20 0x0.0p0 -0x1.cba0db351d0e3p6 0x1.a400000000003p5 0x0.0p0 F +REG esri:102003 4 OK 0x1.415758217a10cp20 0x1.b5f9e4304069dp20 0x0.0p0 -0x1.345f24cae2f1dp6 0x1.a400000000003p5 0x0.0p0 F +REG esri:102004 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x1.37fffffffffe2p5 0x0.0p0 F +REG esri:102004 1 OK -0x1.7a428b26cd24cp20 -0x1.2543b225d68dap20 0x0.0p0 -0x1.bdc3b3987fa9bp6 0x1.affffffffff46p4 0x0.0p0 F +REG esri:102004 2 OK 0x1.7a428b26cd251p20 -0x1.2543b225d68dap20 0x0.0p0 -0x1.423c4c6780565p6 0x1.affffffffff46p4 0x0.0p0 F +REG esri:102004 3 OK -0x1.0c0d3c8012e1fp20 0x1.5d144a2d0140ep20 0x0.0p0 -0x1.bdc3b3987fa9bp6 0x1.97ffffffffacdp5 0x0.0p0 F +REG esri:102004 4 OK 0x1.0c0d3c8012e22p20 0x1.5d144a2d0140ep20 0x0.0p0 -0x1.423c4c6780565p6 0x1.97ffffffffacdp5 0x0.0p0 F +REG esri:102005 0 OK 0x0.0p0 0x1.31bf8457c1093p21 0x0.0p0 0x0.0p0 0x1.6800000000001p4 0x0.0p0 F +REG esri:102005 1 OK -0x1.b940a3a875359p20 0x1.97aa05ca56b6ep19 0x0.0p0 -0x1.03c62d41d850cp4 0x1.dffffffffffffp2 0x0.0p0 F +REG esri:102005 2 OK 0x1.b940a3a875359p20 0x1.97aa05ca56b6ep19 0x0.0p0 0x1.03c62d41d850cp4 0x1.dffffffffffffp2 0x0.0p0 F +REG esri:102005 3 OK -0x1.b940a3a875359p20 0x1.fd94873cec64ap21 0x0.0p0 -0x1.03c62d41d850cp4 0x1.2cp5 0x0.0p0 F +REG esri:102005 4 OK 0x1.b940a3a875359p20 0x1.fd94873cec64ap21 0x0.0p0 0x1.03c62d41d850cp4 0x1.2cp5 0x0.0p0 F +REG esri:102006 0 OK 0x0.0p0 0x1.96adf1aec1aa1p19 0x0.0p0 -0x1.34p7 0x1.cbffffffffffep5 0x0.0p0 F +REG esri:102006 1 OK -0x1.18171f0f3270bp21 -0x1.4125960900542p18 0x0.0p0 0x1.642a4c850f0f2p7 0x1.54p5 0x0.0p0 F +REG esri:102006 2 OK 0x1.18171f0f32714p21 -0x1.412596090051dp18 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.54p5 0x0.0p0 F +REG esri:102006 3 OK -0x1.cbba8109d854ep19 0x1.49526b059ff17p21 0x0.0p0 0x1.642a4c850f0f2p7 0x1.22p6 0x0.0p0 F +REG esri:102006 4 OK 0x1.cbba8109d855bp19 0x1.49526b059ff18p21 0x0.0p0 -0x1.f854990a1e1e2p6 0x1.22p6 0x0.0p0 F +REG esri:102007 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.3ap7 0x1.9fffffffffffcp3 0x0.0p0 F +REG esri:102007 1 OK -0x1.198b96aae0bp20 -0x1.080b20ea3dad4p20 0x0.0p0 -0x1.4e86ad51f6762p7 0x1.7ffffffffffebp1 0x0.0p0 F +REG esri:102007 2 OK 0x1.198b96aae0bp20 -0x1.080b20ea3dad4p20 0x0.0p0 -0x1.257952ae0989ep7 0x1.7ffffffffffebp1 0x0.0p0 F +REG esri:102007 3 OK -0x1.03e43e9fc8903p20 0x1.131365071047ep20 0x0.0p0 -0x1.4e86ad51f6762p7 0x1.7000000000008p4 0x0.0p0 F +REG esri:102007 4 OK 0x1.03e43e9fc8903p20 0x1.131365071047ep20 0x0.0p0 -0x1.257952ae0989ep7 0x1.7000000000008p4 0x0.0p0 F +REG esri:102008 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x1.3fffffffffffdp5 0x0.0p0 F +REG esri:102008 1 OK -0x1.d4ad82d8a07e5p20 -0x1.78587ce6ec79p20 0x0.0p0 -0x1.ce530e53aa877p6 0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:102008 2 OK 0x1.d4ad82d8a07e5p20 -0x1.78587ce6ec79p20 0x0.0p0 -0x1.31acf1ac5578ap6 0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:102008 3 OK -0x1.2548baef5aa24p20 0x1.ccaef5a54cd63p20 0x0.0p0 -0x1.ce530e53aa877p6 0x1.b8p5 0x0.0p0 F +REG esri:102008 4 OK 0x1.2548baef5aa24p20 0x1.ccaef5a54cd63p20 0x0.0p0 -0x1.31acf1ac5578ap6 0x1.b8p5 0x0.0p0 F +REG esri:102009 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x1.3ffffffffffe5p5 0x0.0p0 F +REG esri:102009 1 OK -0x1.d260f4eb6561ep20 -0x1.4e05b565c500fp20 0x0.0p0 -0x1.ce530e53aa877p6 0x1.8ffffffffff33p4 0x0.0p0 F +REG esri:102009 2 OK 0x1.d260f4eb6561ep20 -0x1.4e05b565c500fp20 0x0.0p0 -0x1.31acf1ac5578ap6 0x1.8ffffffffff33p4 0x0.0p0 F +REG esri:102009 3 OK -0x1.264e2e153c832p20 0x1.a361452dc1d8p20 0x0.0p0 -0x1.ce530e53aa877p6 0x1.b7ffffffffd9ep5 0x0.0p0 F +REG esri:102009 4 OK 0x1.264e2e153c832p20 0x1.a361452dc1d8p20 0x0.0p0 -0x1.31acf1ac5578ap6 0x1.b7ffffffffd9ep5 0x0.0p0 F +REG esri:102010 0 OK 0x0.0p0 0x1.97aa05ca56b6ep21 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102010 1 OK -0x1.d6bae23a6f76dp20 0x1.97aa05ca56b6ep20 0x0.0p0 -0x1.1520cd1372feap4 0x1.dffffffffffffp3 0x0.0p0 F +REG esri:102010 2 OK 0x1.d6bae23a6f76dp20 0x1.97aa05ca56b6ep20 0x0.0p0 0x1.1520cd1372feap4 0x1.dffffffffffffp3 0x0.0p0 F +REG esri:102010 3 OK -0x1.d6bae23a6f76dp20 0x1.31bf8457c1093p22 0x0.0p0 -0x1.1520cd1372feap4 0x1.6800000000001p5 0x0.0p0 F +REG esri:102010 4 OK 0x1.d6bae23a6f76dp20 0x1.31bf8457c1093p22 0x0.0p0 0x1.1520cd1372feap4 0x1.6800000000001p5 0x0.0p0 F +REG esri:102011 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:102011 1 OK -0x1.0ebdedd7f6815p19 -0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:102011 2 OK 0x1.0ebdedd7f6815p19 -0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:102011 3 OK -0x1.0ebdedd7f6815p19 0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:102011 4 OK 0x1.0ebdedd7f6815p19 0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:102012 0 OK 0x0.0p0 0x1.d212ab41c29f4p21 0x0.0p0 0x1.a400000000001p6 0x1.effffffffff79p4 0x0.0p0 F +REG esri:102012 1 OK -0x1.efeec632f8c9bp20 0x1.1b2527284bac4p21 0x0.0p0 0x1.5e0082d22053ap6 0x1.ffffffffffdfbp3 0x0.0p0 F +REG esri:102012 2 OK 0x1.efeec632f8c8fp20 0x1.1b2527284bac1p21 0x0.0p0 0x1.e9ff7d2ddfac6p6 0x1.ffffffffffdf4p3 0x0.0p0 F +REG esri:102012 3 OK -0x1.3b737e61124c2p20 0x1.54c47a992d672p22 0x0.0p0 0x1.5e0082d22053ap6 0x1.6fffffffffff7p5 0x0.0p0 F +REG esri:102012 4 OK 0x1.3b737e61124bap20 0x1.54c47a992d671p22 0x0.0p0 0x1.e9ff7d2ddfac6p6 0x1.6fffffffffff6p5 0x0.0p0 F +REG esri:102013 0 OK 0x0.0p0 0x1.aae8eed13ea8ap20 0x0.0p0 0x1.4p3 0x1.7000000000004p5 0x0.0p0 F +REG esri:102013 1 OK -0x1.023f0f5f0143fp21 0x1.9aacd3c0635afp18 0x0.0p0 -0x1.72fcb5249100cp3 0x1.efffffffffff1p4 0x0.0p0 F +REG esri:102013 2 OK 0x1.023f0f5f0143fp21 0x1.9aacd3c0635afp18 0x0.0p0 0x1.f97e5a9248806p4 0x1.efffffffffff1p4 0x0.0p0 F +REG esri:102013 3 OK -0x1.182ec4cd48e22p20 0x1.b84881499f115p21 0x0.0p0 -0x1.72fcb52491009p3 0x1.e7ffffffffffep5 0x0.0p0 F +REG esri:102013 4 OK 0x1.182ec4cd48e22p20 0x1.b84881499f115p21 0x0.0p0 0x1.f97e5a9248804p4 0x1.e7ffffffffffep5 0x0.0p0 F +REG esri:102014 0 OK 0x0.0p0 0x1.ba37e639a34b1p20 0x0.0p0 0x1.4p3 0x1.6fffffffffff6p5 0x0.0p0 F +REG esri:102014 1 OK -0x1.04ee64b0a3222p21 0x1.ae2ce4c6222d7p18 0x0.0p0 -0x1.72fcb52491009p3 0x1.effffffffff76p4 0x0.0p0 F +REG esri:102014 2 OK 0x1.04ee64b0a3222p21 0x1.ae2ce4c6222d7p18 0x0.0p0 0x1.f97e5a9248804p4 0x1.effffffffff76p4 0x0.0p0 F +REG esri:102014 3 OK -0x1.18266fb630833p20 0x1.bbe61fdf91dcap21 0x0.0p0 -0x1.72fcb5249100ep3 0x1.e7fffffffff6dp5 0x0.0p0 F +REG esri:102014 4 OK 0x1.18266fb630833p20 0x1.bbe61fdf91dcap21 0x0.0p0 0x1.f97e5a9248807p4 0x1.e7fffffffff6dp5 0x0.0p0 F +REG esri:102015 0 OK 0x0.0p0 0x1.b59c927fde9e4p19 0x0.0p0 -0x1.dffffffffffffp5 -0x1.77fffffffff18p4 0x0.0p0 F +REG esri:102015 1 OK -0x1.54fa4ce0582c5p20 -0x1.7c8b15442aa93p19 0x0.0p0 -0x1.316d2ce448965p6 -0x1.33fffffffffe3p5 0x0.0p0 F +REG esri:102015 2 OK 0x1.54fa4ce0582c1p20 -0x1.7c8b15442aa93p19 0x0.0p0 -0x1.5d25a6376ed36p5 -0x1.33fffffffffe3p5 0x0.0p0 F +REG esri:102015 3 OK -0x1.af07b00376e1p20 0x1.23736b85bb16dp21 0x0.0p0 -0x1.316d2ce448965p6 -0x1.0fffffffffe8p3 0x0.0p0 F +REG esri:102015 4 OK 0x1.af07b00376e0ap20 0x1.23736b85bb16dp21 0x0.0p0 -0x1.5d25a6376ed36p5 -0x1.0fffffffffe8p3 0x0.0p0 F +REG esri:102016 0 OK 0x0.0p0 -0x1.b44ddd6afe25p16 0x0.0p0 0x0.0p0 0x1.64p6 0x0.0p0 T +REG esri:102016 1 OK -0x1.d84d2e81761e5p18 -0x1.10aef2d62d655p18 0x0.0p0 -0x1.dffffffffffffp5 0x1.54p6 0x0.0p0 T +REG esri:102016 2 OK 0x1.d84d2e81761e5p18 -0x1.10aef2d62d655p18 0x0.0p0 0x1.dffffffffffffp5 0x1.54p6 0x0.0p0 T +REG esri:102016 3 OK -0x1.79d9b9765b8d4p16 -0x1.b44ddd6afe252p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG esri:102016 4 OK 0x1.79d9b9765b8d4p16 -0x1.b44ddd6afe252p15 0x0.0p0 0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG esri:102017 0 OK 0x0.0p0 -0x1.b44c727f91c2ep16 0x0.0p0 0x0.0p0 0x1.63fffffff3eb5p6 0x0.0p0 F +REG esri:102017 1 OK -0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.dffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG esri:102017 2 OK 0x1.d826d2218e40ep18 -0x1.1098cd0a6adb8p18 0x0.0p0 0x1.dffffffffffffp5 0x1.53ffffffc61adp6 0x0.0p0 F +REG esri:102017 3 OK -0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 -0x1.dffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG esri:102017 4 OK 0x1.79d87f2a2b356p16 -0x1.b44c727f91c3p15 0x0.0p0 0x1.dffffffffffffp5 0x1.63fffffff3eb5p6 0x0.0p0 F +REG esri:102018 0 OK 0x0.0p0 -0x1.b5c79dd0c89ffp15 0x0.0p0 0x0.0p0 0x1.64p6 0x0.0p0 T +REG esri:102018 1 OK -0x1.da301097b8caap17 -0x1.11c5bdc5bcaep17 0x0.0p0 -0x1.dffffffffffffp5 0x1.54p6 0x0.0p0 T +REG esri:102018 2 OK 0x1.da301097b8caap17 -0x1.11c5bdc5bcaep17 0x0.0p0 0x1.dffffffffffffp5 0x1.54p6 0x0.0p0 T +REG esri:102018 3 OK -0x1.7b20dded659dep15 -0x1.b5c79dd0c8ap14 0x0.0p0 -0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG esri:102018 4 OK 0x1.7b20dded659dep15 -0x1.b5c79dd0c8ap14 0x0.0p0 0x1.dffffffffffffp5 0x1.64p6 0x0.0p0 T +REG esri:102019 0 OK 0x0.0p0 0x1.b44ddd6afe25p16 0x0.0p0 0x0.0p0 -0x1.64p6 0x0.0p0 T +REG esri:102019 1 OK -0x1.79d9b9765b8d4p16 0x1.b44ddd6afe252p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG esri:102019 2 OK 0x1.79d9b9765b8d4p16 0x1.b44ddd6afe252p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG esri:102019 3 OK -0x1.d84d2e81761e5p18 0x1.10aef2d62d655p18 0x0.0p0 -0x1.dffffffffffffp5 -0x1.54p6 0x0.0p0 T +REG esri:102019 4 OK 0x1.d84d2e81761e5p18 0x1.10aef2d62d655p18 0x0.0p0 0x1.dffffffffffffp5 -0x1.54p6 0x0.0p0 T +REG esri:102020 0 OK 0x0.0p0 0x1.b44c727f931e4p16 0x0.0p0 0x0.0p0 -0x1.63fffffff3e82p6 0x0.0p0 F +REG esri:102020 1 OK -0x1.79d87f2a2c624p16 0x1.b44c727f931e6p15 0x0.0p0 -0x1.dffffffffffffp5 -0x1.63fffffff3e82p6 0x0.0p0 F +REG esri:102020 2 OK 0x1.79d87f2a2c624p16 0x1.b44c727f931e6p15 0x0.0p0 0x1.dffffffffffffp5 -0x1.63fffffff3e82p6 0x0.0p0 F +REG esri:102020 3 OK -0x1.d826d2218e40ep18 0x1.1098cd0a6adb8p18 0x0.0p0 -0x1.dffffffffffffp5 -0x1.53ffffffc61adp6 0x0.0p0 F +REG esri:102020 4 OK 0x1.d826d2218e40ep18 0x1.1098cd0a6adb8p18 0x0.0p0 0x1.dffffffffffffp5 -0x1.53ffffffc61adp6 0x0.0p0 F +REG esri:102021 0 OK 0x0.0p0 0x1.b5c79dd0c89ffp15 0x0.0p0 0x0.0p0 -0x1.64p6 0x0.0p0 T +REG esri:102021 1 OK -0x1.7b20dded659dep15 0x1.b5c79dd0c8ap14 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG esri:102021 2 OK 0x1.7b20dded659dep15 0x1.b5c79dd0c8ap14 0x0.0p0 0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 T +REG esri:102021 3 OK -0x1.da301097b8caap17 0x1.11c5bdc5bcaep17 0x0.0p0 -0x1.dffffffffffffp5 -0x1.54p6 0x0.0p0 T +REG esri:102021 4 OK 0x1.da301097b8caap17 0x1.11c5bdc5bcaep17 0x0.0p0 0x1.dffffffffffffp5 -0x1.54p6 0x0.0p0 T +REG esri:102022 0 OK 0x0.0p0 -0x1.5bf860eb199e4p17 0x0.0p0 0x1.9p4 -0x1.800000000032cp0 0x0.0p0 F +REG esri:102022 1 OK -0x1.78b82d3d3b681p20 -0x1.db0372ceb2b7bp20 0x0.0p0 0x1.3fd5e0ae3df4bp3 -0x1.080000000000ap4 0x0.0p0 F +REG esri:102022 2 OK 0x1.78b82d3d3b68p20 -0x1.db0372ceb2b7bp20 0x0.0p0 0x1.400a87d47082dp5 -0x1.080000000000ap4 0x0.0p0 F +REG esri:102022 3 OK -0x1.7e36c9ef4953ap20 0x1.815f76e81c388p20 0x0.0p0 0x1.3fd5e0ae3df4bp3 0x1.affffffffffa2p3 0x0.0p0 F +REG esri:102022 4 OK 0x1.7e36c9ef49539p20 0x1.815f76e81c388p20 0x0.0p0 0x1.400a87d47082dp5 0x1.affffffffffa2p3 0x0.0p0 F +REG esri:102023 0 OK 0x0.0p0 -0x1.46219e3b78925p17 0x0.0p0 0x0.0p0 -0x1.8000000000001p0 0x0.0p0 F +REG esri:102023 1 OK -0x1.97cdcc1121383p20 -0x1.c06e3991c5c93p20 0x0.0p0 -0x1.e02a1f51c20b5p3 -0x1.08p4 0x0.0p0 F +REG esri:102023 2 OK 0x1.97cdcc1121383p20 -0x1.c06e3991c5c93p20 0x0.0p0 0x1.e02a1f51c20b5p3 -0x1.08p4 0x0.0p0 F +REG esri:102023 3 OK -0x1.97cdcc1121383p20 0x1.6ee5d202e7a49p20 0x0.0p0 -0x1.e02a1f51c20b5p3 0x1.affffffffffffp3 0x0.0p0 F +REG esri:102023 4 OK 0x1.97cdcc1121383p20 0x1.6ee5d202e7a49p20 0x0.0p0 0x1.e02a1f51c20b5p3 0x1.affffffffffffp3 0x0.0p0 F +REG esri:102024 0 OK 0x0.0p0 -0x1.2d946f9b0f03fp17 0x0.0p0 0x1.9p4 -0x1.7fffffffea255p0 0x0.0p0 F +REG esri:102024 1 OK -0x1.78c8f9fc22f83p20 -0x1.a4643c93d587ap20 0x0.0p0 0x1.3fd5e0ae3df4bp3 -0x1.07fffffffff0ep4 0x0.0p0 F +REG esri:102024 2 OK 0x1.78c8f9fc22f81p20 -0x1.a4643c93d587ap20 0x0.0p0 0x1.400a87d47082dp5 -0x1.07fffffffff0ep4 0x0.0p0 F +REG esri:102024 3 OK -0x1.7e259564b05eap20 0x1.5654154c7cae8p20 0x0.0p0 0x1.3fd5e0ae3df4bp3 0x1.afffffffffe61p3 0x0.0p0 F +REG esri:102024 4 OK 0x1.7e259564b05e8p20 0x1.5654154c7cae8p20 0x0.0p0 0x1.400a87d47082dp5 0x1.afffffffffe61p3 0x0.0p0 F +REG esri:102025 0 OK 0x0.0p0 0x1.267f5c39af2d5p20 0x0.0p0 0x1.7cp6 0x1.4000000000003p5 0x0.0p0 F +REG esri:102025 1 OK -0x1.c7cd68d0b05ffp20 -0x1.8888a38eb05a7p18 0x0.0p0 0x1.2dacf1ac5578ap6 0x1.8fffffffffffep4 0x0.0p0 F +REG esri:102025 2 OK 0x1.c7cd68d0b05fbp20 -0x1.8888a38eb05bfp18 0x0.0p0 0x1.ca530e53aa876p6 0x1.8fffffffffffep4 0x0.0p0 F +REG esri:102025 3 OK -0x1.18852341e9982p20 0x1.80e231fb155f1p21 0x0.0p0 0x1.2dacf1ac5578ap6 0x1.b800000000001p5 0x0.0p0 F +REG esri:102025 4 OK 0x1.18852341e997fp20 0x1.80e231fb155efp21 0x0.0p0 0x1.ca530e53aa876p6 0x1.b7ffffffffffdp5 0x0.0p0 F +REG esri:102026 0 OK 0x0.0p0 0x1.b9a2db9b33462p21 0x0.0p0 0x0.0p0 0x1.04p5 0x0.0p0 F +REG esri:102026 1 OK -0x1.e35ce83d6948dp20 0x1.db9bb16c0fd55p20 0x0.0p0 -0x1.1c90bc2dd53a2p4 0x1.18p4 0x0.0p0 F +REG esri:102026 2 OK 0x1.e35ce83d6948dp20 0x1.db9bb16c0fd55p20 0x0.0p0 0x1.1c90bc2dd53a2p4 0x1.18p4 0x0.0p0 F +REG esri:102026 3 OK -0x1.e35ce83d6948dp20 0x1.42bbef402f50dp22 0x0.0p0 -0x1.1c90bc2dd53a2p4 0x1.7cp5 0x0.0p0 F +REG esri:102026 4 OK 0x1.e35ce83d6948dp20 0x1.42bbef402f50dp22 0x0.0p0 0x1.1c90bc2dd53a2p4 0x1.7cp5 0x0.0p0 F +REG esri:102027 0 OK 0x0.0p0 0x1.ee244c8019ddfp19 0x0.0p0 0x1.7cp6 0x1.3ffffffffffe6p5 0x0.0p0 F +REG esri:102027 1 OK -0x1.c2a5f749e290dp20 -0x1.2a40f2490a76p18 0x0.0p0 0x1.2dacf1ac5578ap6 0x1.8ffffffffff2cp4 0x0.0p0 F +REG esri:102027 2 OK 0x1.c2a5f749e2907p20 -0x1.2a40f2490a76p18 0x0.0p0 0x1.ca530e53aa876p6 0x1.8ffffffffff2cp4 0x0.0p0 F +REG esri:102027 3 OK -0x1.1a96344bc7ef6p20 0x1.457b06cee9bap21 0x0.0p0 0x1.2dacf1ac5578ap6 0x1.b7ffffffffd9dp5 0x0.0p0 F +REG esri:102027 4 OK 0x1.1a96344bc7ef3p20 0x1.457b06cee9bap21 0x0.0p0 0x1.ca530e53aa876p6 0x1.b7ffffffffd9dp5 0x0.0p0 F +REG esri:102028 0 OK 0x0.0p0 0x1.1e6961e0026b1p18 0x0.0p0 0x1.f400000000001p6 -0x1.900000000001dp3 0x0.0p0 F +REG esri:102028 1 OK -0x1.6906a7320fd11p20 -0x1.6be30b183c014p20 0x0.0p0 0x1.b68b1110a362ap6 -0x1.b8p4 0x0.0p0 F +REG esri:102028 2 OK 0x1.6906a7320fd0cp20 -0x1.6be30b183c014p20 0x0.0p0 0x1.18ba7777ae4ebp7 -0x1.b8p4 0x0.0p0 F +REG esri:102028 3 OK -0x1.97889c700ed27p20 0x1.e486cf552d7bap20 0x0.0p0 0x1.b68b1110a362ap6 0x1.40000000000f1p1 0x0.0p0 F +REG esri:102028 4 OK 0x1.97889c700ed1fp20 0x1.e486cf552d7bap20 0x0.0p0 0x1.18ba7777ae4ebp7 0x1.4000000000062p1 0x0.0p0 F +REG esri:102029 0 OK 0x0.0p0 -0x1.53b85a289d986p20 0x0.0p0 0x0.0p0 -0x1.8ffffffffffffp3 0x0.0p0 F +REG esri:102029 1 OK -0x1.a18fe1c050d6p20 -0x1.75b12ff97a27ap21 0x0.0p0 -0x1.eba7777ae4eb4p3 -0x1.b7fffffffffffp4 0x0.0p0 F +REG esri:102029 2 OK 0x1.a18fe1c050d6p20 -0x1.75b12ff97a27ap21 0x0.0p0 0x1.eba7777ae4eb4p3 -0x1.b7fffffffffffp4 0x0.0p0 F +REG esri:102029 3 OK -0x1.a18fe1c050d6p20 0x1.0fc6ae86e479fp18 0x0.0p0 -0x1.eba7777ae4eb4p3 0x1.4p1 0x0.0p0 F +REG esri:102029 4 OK 0x1.a18fe1c050d6p20 0x1.0fc6ae86e479fp18 0x0.0p0 0x1.eba7777ae4eb4p3 0x1.4p1 0x0.0p0 F +REG esri:102030 0 OK 0x0.0p0 0x1.fd82e67ecc931p17 0x0.0p0 0x1.f400000000001p6 -0x1.8fffffffffe2ep3 0x0.0p0 F +REG esri:102030 1 OK -0x1.695b275aa8ef1p20 -0x1.4d90f5e7e7794p20 0x0.0p0 0x1.b68b1110a362ap6 -0x1.b7fffffffff4bp4 0x0.0p0 F +REG esri:102030 2 OK 0x1.695b275aa8eebp20 -0x1.4d90f5e7e7794p20 0x0.0p0 0x1.18ba7777ae4ebp7 -0x1.b7fffffffff4bp4 0x0.0p0 F +REG esri:102030 3 OK -0x1.971f95e9dc37dp20 0x1.b6157a44138c5p20 0x0.0p0 0x1.b68b1110a362ap6 0x1.3fffffffedac8p1 0x0.0p0 F +REG esri:102030 4 OK 0x1.971f95e9dc377p20 0x1.b6157a44138c5p20 0x0.0p0 0x1.18ba7777ae4ebp7 0x1.3fffffffedac8p1 0x0.0p0 F +REG esri:102031 0 OK 0x0.0p0 0x1.a545002637847p21 0x0.0p0 0x0.0p0 0x1.fp4 0x0.0p0 F +REG esri:102031 1 OK -0x1.db9d0327c3545p20 0x1.b2dbdf1f310cdp20 0x0.0p0 -0x1.17fdf4b77eb17p4 0x1.0p4 0x0.0p0 F +REG esri:102031 2 OK 0x1.db9d0327c3545p20 0x1.b2dbdf1f310cdp20 0x0.0p0 0x1.17fdf4b77eb17p4 0x1.0p4 0x0.0p0 F +REG esri:102031 3 OK -0x1.db9d0327c3545p20 0x1.388e085e6b414p22 0x0.0p0 -0x1.17fdf4b77eb17p4 0x1.7p5 0x0.0p0 F +REG esri:102031 4 OK 0x1.db9d0327c3545p20 0x1.388e085e6b414p22 0x0.0p0 0x1.17fdf4b77eb17p4 0x1.7p5 0x0.0p0 F +REG esri:102032 0 OK 0x0.0p0 -0x1.1d5dade48e089p21 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 F +REG esri:102032 1 OK -0x1.b4ab42dbb486p20 -0x1.e932e0f585c58p21 0x0.0p0 -0x1.011325fe22d72p4 -0x1.2p5 0x0.0p0 F +REG esri:102032 2 OK 0x1.b4ab42dbb486p20 -0x1.e932e0f585c58p21 0x0.0p0 0x1.011325fe22d72p4 -0x1.2p5 0x0.0p0 F +REG esri:102032 3 OK -0x1.b4ab42dbb486p20 -0x1.4621eb4e592e6p19 0x0.0p0 -0x1.011325fe22d72p4 -0x1.8000000000001p2 0x0.0p0 F +REG esri:102032 4 OK 0x1.b4ab42dbb486p20 -0x1.4621eb4e592e6p19 0x0.0p0 0x1.011325fe22d72p4 -0x1.8000000000001p2 0x0.0p0 F +REG esri:102033 0 OK 0x0.0p0 0x1.e3c251a45508ap19 0x0.0p0 -0x1.dffffffffffffp5 -0x1.77ffffffffff7p4 0x0.0p0 F +REG esri:102033 1 OK -0x1.548cadf161bf5p20 -0x1.912adc6d58aaep19 0x0.0p0 -0x1.316d2ce448965p6 -0x1.33ffffffffffbp5 0x0.0p0 F +REG esri:102033 2 OK 0x1.548cadf161bf1p20 -0x1.912adc6d58aaep19 0x0.0p0 -0x1.5d25a6376ed36p5 -0x1.33ffffffffffbp5 0x0.0p0 F +REG esri:102033 3 OK -0x1.afb808c8eff2cp20 0x1.400474839e049p21 0x0.0p0 -0x1.316d2ce448965p6 -0x1.0fffffffffffdp3 0x0.0p0 F +REG esri:102033 4 OK 0x1.afb808c8eff26p20 0x1.400474839e049p21 0x0.0p0 -0x1.5d25a6376ed36p5 -0x1.0fffffffffffdp3 0x0.0p0 F +REG esri:102065 0 OK 0x0.0p0 -0x1.1af8828d6cb87p20 0x0.0p0 0x1.8d55555555554p4 0x1.8c00000000005p5 0x0.0p0 F +REG esri:102065 1 OK -0x1.2b0fb7ab3c62ep19 -0x1.9b3fa6f3f5069p20 0x0.0p0 0x1.1226dd0312abcp4 0x1.63fffffffffffp5 0x0.0p0 F +REG esri:102065 2 OK 0x1.2b0fb7ab3c631p19 -0x1.9b3fa6f3f5067p20 0x0.0p0 0x1.0441e6d3cbff7p5 0x1.63fffffffffffp5 0x0.0p0 F +REG esri:102065 3 OK -0x1.e95a9811448aep18 -0x1.19a5d29aeb08cp19 0x0.0p0 0x1.1226dd0312abap4 0x1.b40000000000cp5 0x0.0p0 F +REG esri:102065 4 OK 0x1.e95a9811448b4p18 -0x1.19a5d29aeb089p19 0x0.0p0 0x1.0441e6d3cbff8p5 0x1.b40000000000cp5 0x0.0p0 F +REG esri:102066 0 OK 0x1.359d93bb77216p20 -0x1.ed99e44973855p19 0x0.0p0 0x1.8d55555555555p4 0x1.8c00000000005p5 0x0.0p0 F +REG esri:102066 1 OK 0x1.82d469cf6c12fp19 -0x1.9630c24d661d4p20 0x0.0p0 0x1.1226dd0312abcp4 0x1.6400000000003p5 0x0.0p0 F +REG esri:102066 2 OK 0x1.e5ded4f4fc23ep20 -0x1.5129506788896p20 0x0.0p0 0x1.0441e6d3cbff8p5 0x1.6400000000003p5 0x0.0p0 F +REG esri:102066 3 OK 0x1.3c38b97633f22p19 -0x1.117d375ddc02p19 0x0.0p0 0x1.1226dd0312ab8p4 0x1.b400000000001p5 0x0.0p0 F +REG esri:102066 4 OK 0x1.8a8d1578b1d97p20 -0x1.3f4f2aeaf3539p18 0x0.0p0 0x1.0441e6d3cbff8p5 0x1.b400000000001p5 0x0.0p0 F +REG esri:102067 0 OK 0x0.0p0 -0x1.1af8828d6cb87p20 0x0.0p0 0x1.8d55555555554p4 0x1.8c00000000005p5 0x0.0p0 F +REG esri:102067 1 OK -0x1.2b0fb7ab3c62ep19 -0x1.9b3fa6f3f5069p20 0x0.0p0 0x1.1226dd0312abcp4 0x1.63fffffffffffp5 0x0.0p0 F +REG esri:102067 2 OK 0x1.2b0fb7ab3c631p19 -0x1.9b3fa6f3f5067p20 0x0.0p0 0x1.0441e6d3cbff7p5 0x1.63fffffffffffp5 0x0.0p0 F +REG esri:102067 3 OK -0x1.e95a9811448aep18 -0x1.19a5d29aeb08cp19 0x0.0p0 0x1.1226dd0312abap4 0x1.b40000000000cp5 0x0.0p0 F +REG esri:102067 4 OK 0x1.e95a9811448b4p18 -0x1.19a5d29aeb089p19 0x0.0p0 0x1.0441e6d3cbff8p5 0x1.b40000000000cp5 0x0.0p0 F +REG esri:102091 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:102091 1 OK 0x1.cd6df1abec2eap19 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.00000001d80d5p2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102091 2 OK 0x1.f5b5072a09e8cp20 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.bfffffff13f96p3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102091 3 OK 0x1.cd6df1abec2eap19 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.00000001d80d5p2 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102091 4 OK 0x1.f5b5072a09e8cp20 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.bfffffff13f96p3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102092 0 OK 0x1.339ep21 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:102092 1 OK 0x1.dfbcf8d5f6176p20 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.40000000ec06bp3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102092 2 OK 0x1.775d839504f46p21 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.3fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102092 3 OK 0x1.dfbcf8d5f6176p20 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.40000000ec06bp3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102092 4 OK 0x1.775d839504f46p21 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.3fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:102101 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.839999999999ap2 0x1.d000000000001p5 0x0.0p0 F +REG esri:102101 1 OK -0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 -0x1.b087f68b0220ap1 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102101 2 OK 0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.efbb973c5a21bp3 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102101 3 OK -0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 -0x1.b087f57edee9dp1 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102101 4 OK 0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.efbb96f951541p3 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102102 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0c77777777777p3 0x1.d000000000001p5 0x0.0p0 F +REG esri:102102 1 OK -0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 -0x1.0bba97c0aeec3p0 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102102 2 OK 0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.1d3320f382663p4 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102102 3 OK -0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 -0x1.0bba95a8687e9p0 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102102 4 OK 0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.1d3320d1fdff6p4 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102103 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.5722222222224p3 0x1.d000000000001p5 0x0.0p0 F +REG esri:102103 1 OK -0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.499abd94a66a4p0 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102103 2 OK 0x1.34e2f65ac17aap19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.42887648d7bb9p4 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102103 3 OK -0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.499abfacecd7dp0 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102103 4 OK 0x1.d19da1f15df01p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.428876275354cp4 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102104 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.a722222222224p3 0x1.d000000000001p5 0x0.0p0 F +REG esri:102104 1 OK -0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.e4cd5eca53353p1 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102104 2 OK 0x1.34e2f65ac17aap19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.6a887648d7bb9p4 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102104 3 OK -0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.e4cd5fd6766bfp1 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102104 4 OK 0x1.d19da1f15df01p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.6a8876275354cp4 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102105 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0e3bbbbbbbbbbp4 0x1.d000000000001p5 0x0.0p0 F +REG esri:102105 1 OK -0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.dd115a0fd444dp2 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102105 2 OK 0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.a53320f382663p4 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102105 3 OK -0x1.d19da1f15df03p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.dd115a95e5e03p2 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102105 4 OK 0x1.d19da1f15df04p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.a53320d1fdff5p4 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102106 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4e3bbbbbbbbbbp4 0x1.d000000000001p5 0x0.0p0 F +REG esri:102106 1 OK -0x1.34e2f65ac17aap19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.6e88ad07ea228p3 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102106 2 OK 0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.e53320f382662p4 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102106 3 OK -0x1.d19da1f15df01p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.6e88ad4af2f02p3 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102106 4 OK 0x1.d19da1f15df04p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.e53320d1fdff6p4 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102107 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.8e3bbbbbbbbbbp4 0x1.d000000000001p5 0x0.0p0 F +REG esri:102107 1 OK -0x1.34e2f65ac17abp19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.ee88ad07ea227p3 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102107 2 OK 0x1.34e2f65ac17aap19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.12999079c1331p5 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102107 3 OK -0x1.d19da1f15df04p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.ee88ad4af2f02p3 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102107 4 OK 0x1.d19da1f15df01p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.12999068feffap5 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102108 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.d0e6666666666p4 0x1.d000000000001p5 0x0.0p0 F +REG esri:102108 1 OK -0x1.34e2f65ac17aap19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.39ef012e9fbbfp4 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102108 2 OK 0x1.34e2f65ac17a8p19 -0x1.f6c6d59c32a9p18 0x0.0p0 0x1.33eee5cf16886p5 0x1.a7fffff82441p5 0x0.0p0 F +REG esri:102108 3 OK -0x1.d19da1f15df01p18 0x1.2120fb8166e63p19 0x0.0p0 0x1.39ef01502422dp4 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102108 4 OK 0x1.d19da1f15defep18 0x1.2120fb8166e63p19 0x0.0p0 0x1.33eee5be5454fp5 0x1.f7fffffa5c07ap5 0x0.0p0 F +REG esri:102110 0 OK 0x1.55ccp19 0x1.92d5p22 0x0.0p0 0x1.8000000000001p1 0x1.73ffffffffff7p5 0x0.0p0 F +REG esri:102110 1 OK 0x1.6a0cf44086p16 0x1.729e7bddea80fp22 0x0.0p0 -0x1.10e06f120d01ep2 0x1.4bfffffffffecp5 0x0.0p0 F +REG esri:102110 2 OK 0x1.3f2b30bbf7ap20 0x1.729e7bddea80fp22 0x0.0p0 0x1.487037890680fp3 0x1.4bfffffffffecp5 0x0.0p0 F +REG esri:102110 3 OK 0x1.7c86bcd6a7b5p17 0x1.b6337589211cap22 0x0.0p0 -0x1.10e06f120d01ep2 0x1.9bffffffffb3fp5 0x0.0p0 F +REG esri:102110 4 OK 0x1.263b28652b096p20 0x1.b6337589211cap22 0x0.0p0 0x1.487037890680fp3 0x1.9bffffffffb3fp5 0x0.0p0 F +REG esri:102114 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:102114 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.48p7 -0x1.4p2 0x0.0p0 F +REG esri:102114 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.34p7 -0x1.4p2 0x0.0p0 F +REG esri:102114 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.48p7 0x1.4p2 0x0.0p0 F +REG esri:102114 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.34p7 0x1.4p2 0x0.0p0 F +REG esri:102115 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:102115 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3cp7 -0x1.4p2 0x0.0p0 F +REG esri:102115 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.28p7 -0x1.4p2 0x0.0p0 F +REG esri:102115 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3cp7 0x1.4p2 0x0.0p0 F +REG esri:102115 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.28p7 0x1.4p2 0x0.0p0 F +REG esri:102120 0 OK 0x1.fdf92654fdf3ep22 -0x1.9a231cd6522c4p23 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c51p5 0x0.0p0 F +REG esri:102120 1 OK 0x1.65181c10dc662p22 -0x1.b3bee24f8ff6bp23 0x0.0p0 -0x1.747029aea2078p6 0x1.42792c5f92c45p5 0x0.0p0 F +REG esri:102120 2 OK 0x1.223a8be5c8eb6p23 -0x1.e2790d1a05fb1p23 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c45p5 0x0.0p0 F +REG esri:102120 3 OK 0x1.cd642400834bcp22 -0x1.5112381fddafap23 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f92626p5 0x0.0p0 F +REG esri:102120 4 OK 0x1.443b2206510a1p23 -0x1.78298a25b8973p23 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f92626p5 0x0.0p0 F +REG esri:102121 0 OK 0x1.fdf92654fdf3cp22 -0x1.9a233141a6847p23 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c56p5 0x0.0p0 F +REG esri:102121 1 OK 0x1.6518b812cb74ep22 -0x1.b3bf4cfd762bdp23 0x0.0p0 -0x1.747029aea2077p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG esri:102121 2 OK 0x1.223a1839fc8d5p23 -0x1.e279261202974p23 0x0.0p0 -0x1.3b8fd6515df89p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG esri:102121 3 OK 0x1.cd64f0945fad9p22 -0x1.511273307a49p23 0x0.0p0 -0x1.747029aea2077p6 0x1.92792c5f9267cp5 0x0.0p0 F +REG esri:102121 4 OK 0x1.443abe5fc95fep23 -0x1.7829707096d2ap23 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f9267fp5 0x0.0p0 F +REG esri:102122 0 OK 0x1.36e15bf7ced93p21 -0x1.f40a4c1fa19b8p21 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c51p5 0x0.0p0 F +REG esri:102122 1 OK 0x1.b35ebe6813726p20 -0x1.09a18e0e4be9cp22 0x0.0p0 -0x1.747029aea2078p6 0x1.42792c5f92c45p5 0x0.0p0 F +REG esri:102122 2 OK 0x1.61d8f81293826p21 -0x1.261db4e2ccd15p22 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c45p5 0x0.0p0 F +REG esri:102122 3 OK 0x1.1943be4b6df7ep21 -0x1.9af53ee668716p21 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f92626p5 0x0.0p0 F +REG esri:102122 4 OK 0x1.8b4d9f3df2017p21 -0x1.ca9e31f4a2582p21 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.92792c5f92626p5 0x0.0p0 F +REG esri:102123 0 OK 0x1.36e15bf7ced91p21 -0x1.f40a6504cdda8p21 0x0.0p0 -0x1.58p6 0x1.6a792c5f92c56p5 0x0.0p0 F +REG esri:102123 1 OK 0x1.b35f7c9c80941p20 -0x1.09a1cf1671c51p22 0x0.0p0 -0x1.747029aea2077p6 0x1.42792c5f92c47p5 0x0.0p0 F +REG esri:102123 2 OK 0x1.61d86b0bccac4p21 -0x1.261dc41b5cecep22 0x0.0p0 -0x1.3b8fd6515df88p6 0x1.42792c5f92c49p5 0x0.0p0 F +REG esri:102123 3 OK 0x1.19443b01613a9p21 -0x1.9af586e97ea1ap21 0x0.0p0 -0x1.747029aea2078p6 0x1.92792c5f9267cp5 0x0.0p0 F +REG esri:102123 4 OK 0x1.8b4d25bf71ed2p21 -0x1.ca9e129ce6ef6p21 0x0.0p0 -0x1.3b8fd6515df89p6 0x1.92792c5f9267fp5 0x0.0p0 F +REG esri:102132 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:102132 1 OK -0x1.ad04b3f5f50cp15 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.0000000000002p2 -0x1.4p2 0x0.0p0 F +REG esri:102132 2 OK 0x1.018c259fafa86p20 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG esri:102132 3 OK -0x1.ad04b3f5f50cp15 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.0000000000002p2 0x1.4p2 0x0.0p0 F +REG esri:102132 4 OK 0x1.018c259fafa86p20 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG esri:102133 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:102133 1 OK -0x1.ad04b3f5f4fep15 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.4p3 -0x1.4p2 0x0.0p0 F +REG esri:102133 2 OK 0x1.018c259fafa8ep20 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.3ffffffffffffp4 -0x1.4p2 0x0.0p0 F +REG esri:102133 3 OK -0x1.ad04b3f5f4fep15 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.4p3 0x1.4p2 0x0.0p0 F +REG esri:102133 4 OK 0x1.018c259fafa8ep20 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.3ffffffffffffp4 0x1.4p2 0x0.0p0 F +REG esri:102134 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:102134 1 OK -0x1.ad04b3f5f504p15 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG esri:102134 2 OK 0x1.018c259fafa8bp20 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG esri:102134 3 OK -0x1.ad04b3f5f504p15 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG esri:102134 4 OK 0x1.018c259fafa8bp20 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG esri:102135 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:102135 1 OK -0x1.ad04b3f5f50dp15 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.6000000000001p4 -0x1.4p2 0x0.0p0 F +REG esri:102135 2 OK 0x1.018c259fafa86p20 -0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.0p5 -0x1.4p2 0x0.0p0 F +REG esri:102135 3 OK -0x1.ad04b3f5f50dp15 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.6000000000001p4 0x1.4p2 0x0.0p0 F +REG esri:102135 4 OK 0x1.018c259fafa86p20 0x1.0eddbb0ac99b5p19 0x0.0p0 0x1.0p5 0x1.4p2 0x0.0p0 F +REG esri:102140 0 OK 0x1.988ac1999999ap19 0x1.8fefb9999999ap19 0x0.0p0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 0x0.0p0 F +REG esri:102140 1 OK 0x1.fe8f21bbc0cep17 0x1.0b39fda89df5cp18 0x0.0p0 0x1.b3187ac82220cp6 0x1.14fe7f85932a9p4 0x0.0p0 F +REG esri:102140 2 OK 0x1.58b8dd62217fep20 0x1.0b39fda89df5cp18 0x0.0p0 0x1.de5533c0daea6p6 0x1.14fe7f85932a9p4 0x0.0p0 F +REG esri:102140 3 OK 0x1.2632f5509f736p18 0x1.5205e792673cfp20 0x0.0p0 0x1.b3187ac807e8ap6 0x1.b4fe7f857db3ep4 0x0.0p0 F +REG esri:102140 4 OK 0x1.4efe044571bccp20 0x1.5205e792673cfp20 0x0.0p0 0x1.de5533c0f5228p6 0x1.b4fe7f857db3ep4 0x0.0p0 F +REG esri:102141 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:102141 1 OK -0x1.ada0e5629f5ep15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.a8p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:102141 2 OK 0x1.0191072b14fd4p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.d000000000001p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102141 3 OK -0x1.ada0e5629f5ep15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.a8p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:102141 4 OK 0x1.0191072b14fd4p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.d000000000001p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:102142 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:102142 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102142 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.e8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102142 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp6 0x1.4000000000001p2 0x0.0p0 F +REG esri:102142 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.e8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:102151 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:102151 1 OK -0x1.acf431d4af4bp15 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.d800000000001p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102151 2 OK 0x1.018ba18ea57bcp20 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.0p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102151 3 OK -0x1.acf431d4af4bp15 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.d800000000001p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:102151 4 OK 0x1.018ba18ea57bcp20 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.0p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102152 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:102152 1 OK -0x1.acf431d4af4bp15 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.fp6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102152 2 OK 0x1.018ba18ea57c9p20 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG esri:102152 3 OK -0x1.acf431d4af4bp15 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.fp6 0x1.4000000000001p2 0x0.0p0 F +REG esri:102152 4 OK 0x1.018ba18ea57c9p20 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.0cp7 0x1.4p2 0x0.0p0 F +REG esri:102153 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:102153 1 OK -0x1.acf431d4af62p15 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.04p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102153 2 OK 0x1.018ba18ea57b1p20 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.18p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102153 3 OK -0x1.acf431d4af62p15 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.04p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102153 4 OK 0x1.018ba18ea57b1p20 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.18p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102154 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:102154 1 OK -0x1.acf431d4af4bp15 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.1p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102154 2 OK 0x1.018ba18ea57bcp20 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.24p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102154 3 OK -0x1.acf431d4af4bp15 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.1p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102154 4 OK 0x1.018ba18ea57bcp20 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.24p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102155 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:102155 1 OK -0x1.acf431d4af4bp15 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.1cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102155 2 OK 0x1.018ba18ea57c9p20 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.3p7 -0x1.4p2 0x0.0p0 F +REG esri:102155 3 OK -0x1.acf431d4af4bp15 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.1cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102155 4 OK 0x1.018ba18ea57c9p20 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.3p7 0x1.4p2 0x0.0p0 F +REG esri:102156 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:102156 1 OK -0x1.acf431d4af62p15 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.28p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102156 2 OK 0x1.018ba18ea57b1p20 -0x1.0edcb2feb40bdp19 0x0.0p0 0x1.3cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102156 3 OK -0x1.acf431d4af62p15 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.28p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102156 4 OK 0x1.018ba18ea57b1p20 0x1.0edcb2feb40bdp19 0x0.0p0 0x1.3cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:102160 0 OK 0x1.86fa4c8b43958p17 0x1.24e240a3d70a4p18 0x0.0p0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x0.0p0 F +REG esri:102160 1 OK -0x1.82605f379efa4p18 -0x1.cc717c1a4aefp17 0x0.0p0 -0x1.d41333b31790cp3 0x1.15555554dc2ddp5 0x0.0p0 F +REG esri:102160 2 OK 0x1.84ad55e17147fp19 -0x1.cc717c1a4aeecp17 0x0.0p0 -0x1.a2ef9509fe3dp0 0x1.15555554dc2dep5 0x0.0p0 F +REG esri:102160 3 OK -0x1.33945999c97e5p18 0x1.abad8a2bfab97p19 0x0.0p0 -0x1.d41333afe72a3p3 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102160 4 OK 0x1.5d475312868ap19 0x1.abad8a2bfab97p19 0x0.0p0 -0x1.a2ef952381717p0 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102161 0 OK 0x1.69322d0e56042p7 -0x1.5bf5c28f5c28fp6 0x0.0p0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x0.0p0 F +REG esri:102161 1 OK -0x1.22d82f9bcf7d2p19 -0x1.05985f0692bbcp19 0x0.0p0 -0x1.d41333b31790cp3 0x1.15555554dc2ddp5 0x0.0p0 F +REG esri:102161 2 OK 0x1.230555e17147fp19 -0x1.05985f0692bbbp19 0x0.0p0 -0x1.a2ef9509fe3dp0 0x1.15555554dc2dep5 0x0.0p0 F +REG esri:102161 3 OK -0x1.f6e45999c97e5p18 0x1.19318a2bfab97p19 0x0.0p0 -0x1.d41333afe72a3p3 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102161 4 OK 0x1.f73ea6250d13fp18 0x1.19318a2bfab97p19 0x0.0p0 -0x1.a2ef95238171ep0 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102162 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:102162 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102162 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102162 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:102162 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:102163 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:102163 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:102163 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:102163 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:102163 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:102164 0 OK 0x1.86ap17 0x1.24f8p18 0x0.0p0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x0.0p0 F +REG esri:102164 1 OK -0x1.828d857d40c5p18 -0x1.cc45fd61f9038p17 0x0.0p0 -0x1.d41333b31790cp3 0x1.15555554dc2ddp5 0x0.0p0 F +REG esri:102164 2 OK 0x1.8496c2bea0629p19 -0x1.cc45fd61f9034p17 0x0.0p0 -0x1.a2ef9509fe3dp0 0x1.15555554dc2dep5 0x0.0p0 F +REG esri:102164 3 OK -0x1.33c17fdf6b491p18 0x1.abb869da0f345p19 0x0.0p0 -0x1.d41333afe72a3p3 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102164 4 OK 0x1.5d30bfefb5a4ap19 0x1.abb869da0f345p19 0x0.0p0 -0x1.a2ef952381717p0 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102165 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x0.0p0 F +REG esri:102165 1 OK -0x1.22eec2bea0628p19 -0x1.058d7f587e40ep19 0x0.0p0 -0x1.d41333b31790cp3 0x1.15555554dc2ddp5 0x0.0p0 F +REG esri:102165 2 OK 0x1.22eec2bea0629p19 -0x1.058d7f587e40dp19 0x0.0p0 -0x1.a2ef9509fe3dp0 0x1.15555554dc2dep5 0x0.0p0 F +REG esri:102165 3 OK -0x1.f7117fdf6b491p18 0x1.193c69da0f345p19 0x0.0p0 -0x1.d41333afe72a3p3 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102165 4 OK 0x1.f7117fdf6b493p18 0x1.193c69da0f345p19 0x0.0p0 -0x1.a2ef95238171ep0 0x1.6555555481bdep5 0x0.0p0 F +REG esri:102166 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:102166 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102166 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.c000000000001p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102166 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:102166 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.c000000000001p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:102167 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:102167 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102167 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102167 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:102167 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:102168 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:102168 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102168 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102168 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:102168 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:102169 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:102169 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102169 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:102169 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:102169 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:102191 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 -0x1.599999999999ap2 0x1.0a66666666628p5 0x0.0p0 F +REG esri:102191 1 OK -0x1.598246333881p16 -0x1.d0aee0b7a52fp17 0x0.0p0 -0x1.6c3b4ece0123bp3 0x1.c4ccccccccc0ep4 0x0.0p0 F +REG esri:102191 2 OK 0x1.09bc246333881p20 -0x1.d0aee0b7a52fp17 0x0.0p0 0x1.2a1b534678a15p-1 0x1.c4ccccccccc0ep4 0x0.0p0 F +REG esri:102191 3 OK -0x1.8455188d8e26p14 0x1.a8f4be0f773ffp19 0x0.0p0 -0x1.6c3b4ece0123bp3 0x1.3266666666643p5 0x0.0p0 F +REG esri:102191 4 OK 0x1.f46aa8c46c713p19 0x1.a8f4be0f773ffp19 0x0.0p0 0x1.2a1b534678a0ep-1 0x1.3266666666643p5 0x0.0p0 F +REG esri:102192 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 -0x1.599999999999ap2 0x1.db3333333328ap4 0x0.0p0 F +REG esri:102192 1 OK -0x1.48f906e5abe3p16 -0x1.d4a19d7addc84p17 0x0.0p0 -0x1.64ff6ec44c13ap3 0x1.8b33333333248p4 0x0.0p0 F +REG esri:102192 2 OK 0x1.08b3906e5abe4p20 -0x1.d4a19d7addc84p17 0x0.0p0 0x1.6cbaa5564f42fp-2 0x1.8b33333333248p4 0x0.0p0 F +REG esri:102192 3 OK -0x1.c5684068d74ep14 0x1.a7dfc314b92edp19 0x0.0p0 -0x1.64ff6ec44c13bp3 0x1.1599999999965p5 0x0.0p0 F +REG esri:102192 4 OK 0x1.f673420346ba8p19 0x1.a7dfc314b92edp19 0x0.0p0 0x1.6cbaa5564f42fp-2 0x1.1599999999965p5 0x0.0p0 F +REG esri:102193 0 OK 0x1.24f8p20 0x1.86ap18 0x0.0p0 -0x1.599999999999ap2 0x1.a1999999998c4p4 0x0.0p0 F +REG esri:102193 1 OK 0x1.2e9a96f2a1e0fp19 -0x1.14f0dc167ded4p17 0x0.0p0 -0x1.5ef7df1d0876ap3 0x1.519999999988cp4 0x0.0p0 F +REG esri:102193 2 OK 0x1.b2a2b486af0f8p20 -0x1.14f0dc167ded4p17 0x0.0p0 0x1.579160dbb73d4p-3 0x1.519999999988cp4 0x0.0p0 F +REG esri:102193 3 OK 0x1.45be260d3de67p19 0x1.d7ad9c652d4b5p19 0x0.0p0 -0x1.5ef7df1d0876ap3 0x1.f199999999907p4 0x0.0p0 F +REG esri:102193 4 OK 0x1.a710ecf9610ccp20 0x1.d7ad9c652d4b5p19 0x0.0p0 0x1.579160dbb73b7p-3 0x1.f199999999907p4 0x0.0p0 F +REG esri:102229 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG esri:102229 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG esri:102229 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG esri:102229 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:102229 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:102230 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102230 1 OK 0x1.02d2636ccfacp14 -0x1.08705bf248c83p19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102230 2 OK 0x1.20ecb6724cc15p20 -0x1.08705bf248c83p19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102230 3 OK 0x1.1be3d1f1f0738p16 0x1.162dfbdf9f577p19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102230 4 OK 0x1.1339c2e0e0f8cp20 0x1.162dfbdf9f577p19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102241 0 OK 0x1.e848p20 0x1.3364f31e8451dp19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG esri:102241 1 OK 0x1.a694a7721357fp20 0x1.6e55b9fe27267p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG esri:102241 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe27267p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG esri:102241 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:102241 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:102242 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe3p5 0x0.0p0 F +REG esri:102242 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:102242 2 OK 0x1.12833bad34ff3p21 0x1.768689905862fp18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:102242 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6b6p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555541p5 0x0.0p0 F +REG esri:102242 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555541p5 0x0.0p0 F +REG esri:102243 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG esri:102243 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b17ap18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:102243 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b17ap18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:102243 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62b8p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:102243 4 OK 0x1.0dc2328fe0467p21 0x1.92a6fed4b62b8p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:102244 0 OK 0x1.e848p20 0x1.28103e26de4b3p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG esri:102244 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:102244 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:102244 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa89p5 0x0.0p0 F +REG esri:102244 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa89p5 0x0.0p0 F +REG esri:102245 0 OK 0x1.e848p20 0x1.29667c04d66f6p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG esri:102245 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9c2p18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:102245 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9c2p18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:102245 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG esri:102245 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG esri:102246 0 OK 0x1.e848p20 0x1.229ee66609adcp19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG esri:102246 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38fp18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:102246 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38fp18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:102246 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab76p19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeec2p5 0x0.0p0 F +REG esri:102246 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab76p19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeec3p5 0x0.0p0 F +REG esri:102248 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:102248 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102248 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102248 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102248 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102249 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:102249 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102249 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102249 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:102249 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102250 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:102250 1 OK -0x1.6a877f4243c8ap18 -0x1.082c76001887ap19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102250 2 OK 0x1.859fbfa121e45p19 -0x1.082c76001887ap19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102250 3 OK -0x1.317ec6596674cp18 0x1.167858dd463e1p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:102250 4 OK 0x1.691b632cb33a6p19 0x1.167858dd463e1p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:102251 0 OK 0x1.86ap18 0x1.9bb240973ac0fp16 0x0.0p0 -0x1.7p6 0x1.1a44444444415p5 0x0.0p0 F +REG esri:102251 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b067p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:102251 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b067p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:102251 3 OK 0x1.797b25aa020dbp17 0x1.3735788b9582bp18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.297777777774fp5 0x0.0p0 F +REG esri:102251 4 OK 0x1.284136957f7c9p19 0x1.3735788b9582bp18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.297777777774fp5 0x0.0p0 F +REG esri:102252 0 OK 0x1.86ap18 0x1.f85a78d71c201p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG esri:102252 1 OK 0x1.390d3a7ad5115p17 0x1.17c0dd5828e2p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:102252 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e2p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:102252 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803b5p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:102252 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803b5p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:102253 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777776p5 0x0.0p0 F +REG esri:102253 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9daep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:102253 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9daep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:102253 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede0455cp19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fap5 0x0.0p0 F +REG esri:102253 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede0455cp19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fap5 0x0.0p0 F +REG esri:102254 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG esri:102254 1 OK 0x1.535f87ff5fdb5p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:102254 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:102254 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa93p5 0x0.0p0 F +REG esri:102254 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa93p5 0x0.0p0 F +REG esri:102255 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666643p5 0x0.0p0 F +REG esri:102255 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444417p5 0x0.0p0 F +REG esri:102255 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444417p5 0x0.0p0 F +REG esri:102255 3 OK 0x1.60a2ad403161p19 0x1.25939b74cbbfbp19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886ep5 0x0.0p0 F +REG esri:102255 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbfbp19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886ep5 0x0.0p0 F +REG esri:102256 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7ab86p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG esri:102256 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG esri:102256 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG esri:102256 3 OK 0x1.75e64473bf832p17 0x1.3dd463fdd742ep18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111103p5 0x0.0p0 F +REG esri:102256 4 OK 0x1.985d2bcd7fae5p18 0x1.3dd463fdd742ep18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111103p5 0x0.0p0 F +REG esri:102257 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:102257 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG esri:102257 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG esri:102257 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG esri:102257 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG esri:102258 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:102258 1 OK -0x1.7072116736b76p18 -0x1.09d6c3209715p19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102258 2 OK 0x1.7b8908b39b5bbp19 -0x1.09d6c3209715p19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102258 3 OK -0x1.458d684123152p18 0x1.149ddbf62682p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102258 4 OK 0x1.6616b420918a9p19 0x1.149ddbf62682p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102259 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:102259 1 OK -0x1.7072116736b76p18 -0x1.09d6c3209715p19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102259 2 OK 0x1.7b8908b39b5bbp19 -0x1.09d6c3209715p19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102259 3 OK -0x1.458d684123152p18 0x1.149ddbf62682p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102259 4 OK 0x1.6616b420918a9p19 0x1.149ddbf62682p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102260 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff66p4 0x0.0p0 F +REG esri:102260 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002a7fp16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff52p4 0x0.0p0 F +REG esri:102260 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002a7fp16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff52p4 0x0.0p0 F +REG esri:102260 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd72p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff79p4 0x0.0p0 F +REG esri:102260 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd72p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG esri:102261 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG esri:102261 1 OK -0x1.189e83eccec08p16 -0x1.0b14632746d6dp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:102261 2 OK 0x1.05ade83eccecp20 -0x1.0b14632746d6dp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:102261 3 OK -0x1.2e8f11e986cp15 0x1.1337c8ec86fa9p19 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:102261 4 OK 0x1.fb30f11e986cp19 0x1.1337c8ec86fa9p19 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:102262 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG esri:102262 1 OK -0x1.1e4835059d3dp16 -0x1.0ac0813239aeap19 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG esri:102262 2 OK 0x1.0608835059d48p20 -0x1.0ac0813239ae9p19 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG esri:102262 3 OK -0x1.2379e2bbfdbp15 0x1.13976e1548783p19 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG esri:102262 4 OK 0x1.fa7f9e2bbfdc6p19 0x1.13976e1548783p19 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532544p4 0x0.0p0 F +REG esri:102263 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG esri:102263 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:102263 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:102263 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:102263 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:102264 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG esri:102264 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:102264 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:102264 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:102264 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:102265 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG esri:102265 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG esri:102265 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG esri:102265 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:102265 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:102266 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102266 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102266 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:102266 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102266 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102267 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102267 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:102267 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102267 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102267 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102268 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:102268 1 OK -0x1.85615c582200ap18 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102268 2 OK 0x1.8600ae2c11005p19 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102268 3 OK -0x1.30ce37160a17bp18 0x1.19e947c764e3p19 0x0.0p0 -0x1.db70850622b0dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102268 4 OK 0x1.5bb71b8b050bep19 0x1.19e947c764e3p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102269 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:102269 1 OK -0x1.81a5716087fc8p16 -0x1.04cdcc59bf3a8p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102269 2 OK 0x1.0c3e571608802p20 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102269 3 OK -0x1.7ac6e2c142d6p13 0x1.19e947c764e2fp19 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102269 4 OK 0x1.ee331b8b050bep19 0x1.19e947c764e3p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102270 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:102270 1 OK 0x1.89217848c97p17 -0x1.04ccdd0c9cfa3p19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102270 2 OK 0x1.557bd0f6e6d2p20 -0x1.04ccdd0c9cfa3p19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102270 3 OK 0x1.192393cc6bd99p18 0x1.19e8451c47f27p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102270 4 OK 0x1.40571b0ce509ap20 0x1.19e8451c47f27p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102271 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG esri:102271 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102271 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102271 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102271 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102272 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG esri:102272 1 OK 0x1.a750342e1d888p16 -0x1.06875cb5bcde8p19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102272 2 OK 0x1.3b56fcbd1e27cp20 -0x1.06875cb5bcde7p19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102272 3 OK 0x1.6115131169322p17 0x1.1836afa2e263ep19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102272 4 OK 0x1.29a95d9dd2dap20 0x1.1836afa2e263fp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102273 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:102273 1 OK -0x1.e13701e8dd37p18 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102273 2 OK 0x1.524380f46e9c3p19 -0x1.1865798c9fcaep18 0x0.0p0 -0x1.3d750c4376f4cp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102273 3 OK -0x1.98528b65a1b18p18 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.6fe049119990cp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102273 4 OK 0x1.2dd145b2d0d96p19 0x1.928ffdeaa1706p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102274 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:102274 1 OK 0x1.2c08fe1722c9p18 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102274 2 OK 0x1.6c71c07a374dcp20 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.431fb6ee219f7p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102274 3 OK 0x1.74ed749a5e4e8p18 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.758af3bc443b6p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102274 4 OK 0x1.5a38a2d9686c6p20 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.431fb6ee666f4p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102277 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG esri:102277 1 OK 0x1.cb1f1458ef104p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:102277 2 OK 0x1.13d83ae9c43b5p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:102277 3 OK 0x1.d81683a3ea362p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:102277 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:102278 0 OK 0x1.86ap18 0x1.ed96d4760822ep18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeecbp5 0x0.0p0 F +REG esri:102278 1 OK 0x1.651ae3466f2fp17 0x1.225e5e1328bb1p18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8cp5 0x0.0p0 F +REG esri:102278 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bb1p18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8cp5 0x0.0p0 F +REG esri:102278 3 OK 0x1.7a4c44694222fp17 0x1.5f149a7304c86p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:102278 4 OK 0x1.280ceee5af77ep19 0x1.5f149a7304c86p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:102279 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG esri:102279 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:102279 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:102279 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:102279 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:102280 0 OK 0x1.e848p18 0x1.1f7d5ace3fca6p19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG esri:102280 1 OK 0x1.36785c3381cddp18 0x1.93766c01072acp18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:102280 2 OK 0x1.4d0bd1e63f188p19 0x1.93766c01072acp18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:102280 3 OK 0x1.3dd669cff7b67p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:102280 4 OK 0x1.495ccb1804243p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:102281 0 OK 0x1.e848p19 0x1.d532d46be5604p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG esri:102281 1 OK 0x1.6fab4a4b43fbep19 -0x1.ca039024f0eap16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:102281 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0eap16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:102281 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:102281 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:102282 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG esri:102282 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665bp4 0x0.0p0 F +REG esri:102282 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665bp4 0x0.0p0 F +REG esri:102282 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ep4 0x0.0p0 F +REG esri:102282 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ep4 0x0.0p0 F +REG esri:102283 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG esri:102283 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG esri:102283 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG esri:102283 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG esri:102283 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG esri:102284 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG esri:102284 1 OK 0x1.247082db3c7a6p18 -0x1.045b7b17a66f7p19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:102284 2 OK 0x1.6e57df4930e1bp20 -0x1.045b7b17a66f6p19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:102284 3 OK 0x1.7c8ef03325487p18 0x1.1a56a160fe205p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:102284 4 OK 0x1.585043f336ae2p20 0x1.1a56a160fe206p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:102285 0 OK 0x1.86ap18 0x1.82a27f95ad6ep16 0x0.0p0 -0x1.34p6 0x1.3477777777759p5 0x0.0p0 F +REG esri:102285 1 OK 0x1.7f67f8df8368ap17 -0x1.78c31960d2174p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.2633333333309p5 0x0.0p0 F +REG esri:102285 2 OK 0x1.26c601c81f25ep19 -0x1.78c31960d2174p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.2633333333309p5 0x0.0p0 F +REG esri:102285 3 OK 0x1.92b98c3d8bc67p17 0x1.24621bba84ddbp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba5p5 0x0.0p0 F +REG esri:102285 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84ddbp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba5p5 0x0.0p0 F +REG esri:102286 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba7p5 0x0.0p0 F +REG esri:102286 1 OK 0x1.cecbec86f19p12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442bp5 0x0.0p0 F +REG esri:102286 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442bp5 0x0.0p0 F +REG esri:102286 3 OK 0x1.0e7a6fa3e724p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333323p5 0x0.0p0 F +REG esri:102286 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333323p5 0x0.0p0 F +REG esri:102287 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG esri:102287 1 OK 0x1.79c09677f485cp18 -0x1.4595d1a492dccp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG esri:102287 2 OK 0x1.2b67b4c405bd2p19 -0x1.4595d1a492dccp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG esri:102287 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa806fp17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG esri:102287 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa806fp17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG esri:102288 0 OK 0x1.e848p22 0x1.f347dc7be974fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776dp5 0x0.0p0 F +REG esri:102288 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d111111111p5 0x0.0p0 F +REG esri:102288 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d111111111p5 0x0.0p0 F +REG esri:102288 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdec1p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:102288 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdec1p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:102289 0 OK 0x1.6e36p22 0x1.02a15db6d12dap17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111106p5 0x0.0p0 F +REG esri:102289 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffff1p5 0x0.0p0 F +REG esri:102289 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffff1p5 0x0.0p0 F +REG esri:102289 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca793dp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221bp5 0x0.0p0 F +REG esri:102289 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca793dp18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221bp5 0x0.0p0 F +REG esri:102290 0 OK 0x1.e848p21 0x1.d60dc1a5c0743p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa9ap5 0x0.0p0 F +REG esri:102290 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ebd9p16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553ep5 0x0.0p0 F +REG esri:102290 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ebd9p16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553ep5 0x0.0p0 F +REG esri:102290 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff2p5 0x0.0p0 F +REG esri:102290 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff2p5 0x0.0p0 F +REG esri:102291 0 OK 0x1.86ap19 0x1.aaec4d4682a57p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4ap5 0x0.0p0 F +REG esri:102291 1 OK 0x1.0dc2f831dec44p19 -0x1.a76ffae3de168p13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102291 2 OK 0x1.ff7d07ce213bcp19 -0x1.a76ffae3de168p13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102291 3 OK 0x1.173c0bb149d56p19 0x1.c1b439bafee66p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:102291 4 OK 0x1.f603f44eb62aap19 0x1.c1b439bafee66p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:102292 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG esri:102292 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d359578p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccc1p5 0x0.0p0 F +REG esri:102292 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d359578p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccc1p5 0x0.0p0 F +REG esri:102292 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG esri:102292 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG esri:102293 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd1p5 0x0.0p0 F +REG esri:102293 1 OK 0x1.096f7aabf58f8p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220fp5 0x0.0p0 F +REG esri:102293 2 OK 0x1.01e842aa05388p20 -0x1.1ea0672962198p14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220fp5 0x0.0p0 F +REG esri:102293 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:102293 4 OK 0x1.fabb186431293p19 0x1.cee59de0df996p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:102294 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:102294 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102294 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102294 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102294 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102295 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:102295 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102295 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102295 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102295 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102296 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:102296 1 OK -0x1.4c8d5159e6612p18 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102296 2 OK 0x1.9a6aa8acf3309p19 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102296 3 OK -0x1.07f878711cfeep18 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102296 4 OK 0x1.78203c388e7f7p19 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102297 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:102297 1 OK -0x1.61a5456799848p16 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102297 2 OK 0x1.0a3e545679984p20 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102297 3 OK -0x1.3d478711cfeep14 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102297 4 OK 0x1.f2323c388e7f7p19 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102298 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG esri:102298 1 OK 0x1.f9e9964c5ab78p17 -0x1.06af7fefd93fep19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:102298 2 OK 0x1.5fcccd3674a91p20 -0x1.06af7fefd93fep19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:102298 3 OK 0x1.426294a802c2cp18 0x1.180d898fab5e6p19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:102298 4 OK 0x1.4e715ad5ff4f5p20 0x1.180d898fab5e6p19 0x0.0p0 -0x1.6139e6ce2bc87p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:102300 0 OK 0x1.24f8p19 0x1.01baad6a0855fp18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG esri:102300 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f6dp17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffeep5 0x0.0p0 F +REG esri:102300 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f3cp17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffefp5 0x0.0p0 F +REG esri:102300 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d57p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:102300 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d57p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:102304 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555542p5 0x0.0p0 F +REG esri:102304 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe2p5 0x0.0p0 F +REG esri:102304 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe2p5 0x0.0p0 F +REG esri:102304 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955d6p19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102304 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955d6p19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102307 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG esri:102307 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102307 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102307 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102307 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102308 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG esri:102308 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102308 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102308 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102308 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102309 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG esri:102309 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102309 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102309 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102309 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102310 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG esri:102310 1 OK -0x1.24fcf60120a32p18 -0x1.047d14be2735ep19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102310 2 OK 0x1.b7767b009050fp19 -0x1.047d14be2735ep19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102310 3 OK -0x1.9bca25cf6767ep17 0x1.1a37851a0519dp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102310 4 OK 0x1.8bea8973d9d98p19 0x1.1a37851a0519cp19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102311 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:102311 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102311 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102311 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102311 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102312 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:102312 1 OK -0x1.99bdfd44b9be8p18 -0x1.082ad67698d12p19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102312 2 OK 0x1.6e00fea25cdf4p19 -0x1.082ad67698d12p19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102312 3 OK -0x1.60b59e1259a96p18 0x1.1676a2d6e2f6p19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102312 4 OK 0x1.517ccf092cd4bp19 0x1.1676a2d6e2f6p19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102313 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:102313 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102313 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102313 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102313 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102314 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:102314 1 OK 0x1.df55aecd85d18p17 -0x1.082b60f9c3635p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102314 2 OK 0x1.595b4a264f45dp20 -0x1.082b60f9c3635p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102314 3 OK 0x1.28b35480a212ep18 0x1.167734d9040ep19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102314 4 OK 0x1.4b192adfd77b4p20 0x1.167734d9040ep19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102315 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:102315 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102315 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102315 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102315 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102316 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:102316 1 OK -0x1.5221e2bc96ac2p18 -0x1.0569844cc1183p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102316 2 OK 0x1.9d34f15e4b561p19 -0x1.0569844cc1183p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102316 3 OK -0x1.0266fbc8fcfd3p18 0x1.19530c7dbe957p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102316 4 OK 0x1.75577de47e7eap19 0x1.19530c7dbe957p19 0x0.0p0 -0x1.1839a5e4684a9p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102317 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:102317 1 OK -0x1.e0f3c5792d584p17 -0x1.0569844cc1183p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102317 2 OK 0x1.ce08f15e4b561p19 -0x1.0569844cc1183p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102317 3 OK -0x1.417df791f9fa6p17 0x1.19530c7dbe957p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102317 4 OK 0x1.a62b7de47e7eap19 0x1.19530c7dbe957p19 0x0.0p0 -0x1.2039a5e4684a9p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102318 0 OK 0x1.24f8p18 0x1.77ef5142920d6p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG esri:102318 1 OK 0x1.6cf442c2356e8p17 -0x1.e4f92712c1b2fp15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccb1p5 0x0.0p0 F +REG esri:102318 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1b2fp15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccb1p5 0x0.0p0 F +REG esri:102318 3 OK 0x1.7379e78330bbep17 0x1.38817194728cep17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:102318 4 OK 0x1.90330c3e67a21p18 0x1.38817194728cep17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:102320 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61fp5 0x0.0p0 F +REG esri:102320 1 OK 0x1.86e3d47c2716fp18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:102320 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:102320 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:102320 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:102321 0 OK 0x1.24f8p19 0x1.8a66ee530abbep16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG esri:102321 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd8709p16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:102321 2 OK 0x1.8b2e86753449cp19 -0x1.7cb5565dd8709p16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG esri:102321 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:102321 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:102322 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.457777777776p5 0x0.0p0 F +REG esri:102322 1 OK 0x1.65d7a1966c1d4p18 -0x1.ab1680cb28019p16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333314p5 0x0.0p0 F +REG esri:102322 2 OK 0x1.97042f34c9f0cp19 -0x1.ab1680cb28019p16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333314p5 0x0.0p0 F +REG esri:102322 3 OK 0x1.7366a7cc5f286p18 0x1.4e1acf1eae128p18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbacp5 0x0.0p0 F +REG esri:102322 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae128p18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbacp5 0x0.0p0 F +REG esri:102323 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222204p5 0x0.0p0 F +REG esri:102323 1 OK 0x1.664049e589d4dp18 -0x1.abc8d2424f402p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:102323 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f402p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:102323 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG esri:102323 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG esri:102324 0 OK 0x1.24f8p19 0x1.7ed816e9b43d9p16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG esri:102324 1 OK 0x1.8562e4192a9e5p18 -0x1.7613f4e13785bp16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebcp5 0x0.0p0 F +REG esri:102324 2 OK 0x1.873e8df36ab0ep19 -0x1.7613f4e13785bp16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebcp5 0x0.0p0 F +REG esri:102324 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5dcfp18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:102324 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5dcfp18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:102325 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG esri:102325 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d6p5 0x0.0p0 F +REG esri:102325 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d6p5 0x0.0p0 F +REG esri:102325 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:102325 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:102326 0 OK 0x1.312dp21 0x1.fa69b2b1379eep16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102326 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53fffffffffecp5 0x0.0p0 F +REG esri:102326 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53fffffffffecp5 0x0.0p0 F +REG esri:102326 3 OK 0x1.12b762c28734bp21 0x1.80dba90e7858ap18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:102326 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e7858ap18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:102327 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:102327 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG esri:102327 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe9p5 0x0.0p0 F +REG esri:102327 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f699f6p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554ap5 0x0.0p0 F +REG esri:102327 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f699f6p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554ap5 0x0.0p0 F +REG esri:102330 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG esri:102330 1 OK -0x1.e634a50072a6ep18 -0x1.0508ca3eafec3p19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:102330 2 OK 0x1.54c2528039541p19 -0x1.0508ca3eafec2p19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:102330 3 OK -0x1.9359a8941557cp18 0x1.19b7b8fc808b3p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:102330 4 OK 0x1.2b54d44a0aac6p19 0x1.19b7b8fc808b4p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:102334 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG esri:102334 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda998e3p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444437p5 0x0.0p0 F +REG esri:102334 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda998e3p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444437p5 0x0.0p0 F +REG esri:102334 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e2ap18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:102334 4 OK 0x1.8670ba72bc015p19 0x1.3052f091f3e2ap18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:102335 0 OK 0x1.24f8p19 0x1.c069e4aef599p16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeee2p5 0x0.0p0 F +REG esri:102335 1 OK 0x1.614d92de92fdp18 -0x1.b0959713a6fb8p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666654p5 0x0.0p0 F +REG esri:102335 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6fb8p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666654p5 0x0.0p0 F +REG esri:102335 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7dp18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102335 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7dp18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102336 0 OK 0x1.24f8p19 0x1.c374b0c96a842p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG esri:102336 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:102336 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:102336 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dcdecp18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa85p5 0x0.0p0 F +REG esri:102336 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dcdecp18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa85p5 0x0.0p0 F +REG esri:102337 0 OK 0x1.86ap17 0x1.11b5203b20bedp20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG esri:102337 1 OK -0x1.851df507c37f4p15 0x1.aec6d0b583p19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444408p5 0x0.0p0 F +REG esri:102337 2 OK 0x1.b743bea0f86eap18 0x1.aec6d0b583p19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG esri:102337 3 OK -0x1.1ef65dbb0a818p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:102337 4 OK 0x1.aa7ecbb7614fp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:102338 0 OK 0x1.24f8p19 0x1.03b519dcaa4e5p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG esri:102338 1 OK 0x1.493a06e43dfd9p18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:102338 2 OK 0x1.a552fc8de1014p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:102338 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:102338 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:102339 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG esri:102339 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a7dp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:102339 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a7dp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:102339 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:102339 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:102340 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4fp4 0x0.0p0 F +REG esri:102340 1 OK 0x1.39170370f7304p18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034aep6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:102340 2 OK 0x1.ad647e4784673p19 0x1.d81c71ab6b3acp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbaf4p4 0x0.0p0 F +REG esri:102340 3 OK 0x1.45cd37c6ce44dp18 0x1.0d334102db233p22 0x0.0p0 -0x1.97361161034aep6 0x1.f82222222219fp4 0x0.0p0 F +REG esri:102340 4 OK 0x1.a709641c98dcfp19 0x1.0d334102db231p22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f82222222219bp4 0x0.0p0 F +REG esri:102341 0 OK 0x1.24f8p18 0x1.388061690fcp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff47p4 0x0.0p0 F +REG esri:102341 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:102341 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:102341 3 OK 0x1.ee847b1cd7674p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:102341 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:102342 0 OK 0x1.e848p18 0x1.07cbea1e0cb08p20 0x0.0p0 -0x1.bep6 0x1.4877777777761p5 0x0.0p0 F +REG esri:102342 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b563p19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc8p5 0x0.0p0 F +REG esri:102342 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b563p19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc8p5 0x0.0p0 F +REG esri:102342 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec51p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111111p5 0x0.0p0 F +REG esri:102342 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec51p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111111p5 0x0.0p0 F +REG esri:102343 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed5p5 0x0.0p0 F +REG esri:102343 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8c05p20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666646p5 0x0.0p0 F +REG esri:102343 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8c05p20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666646p5 0x0.0p0 F +REG esri:102343 3 OK 0x1.e92fa135fb9fdp17 0x1.23c16caecd92ap21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777765p5 0x0.0p0 F +REG esri:102343 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd92ap21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777765p5 0x0.0p0 F +REG esri:102344 0 OK 0x1.e848p18 0x1.799d15987076cp21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG esri:102344 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:102344 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:102344 3 OK 0x1.35388abd60d68p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG esri:102344 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG esri:102345 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG esri:102345 1 OK -0x1.86b20b2fea528p16 -0x1.047ce186e66bfp19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102345 2 OK 0x1.0c8f20b2fea58p20 -0x1.047ce186e66bep19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102345 3 OK -0x1.52961a47ed8ap13 0x1.1a374d9d1c5b1p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102345 4 OK 0x1.ed9258691fb6bp19 0x1.1a374d9d1c5b2p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG esri:102346 0 OK 0x1.ab3fp21 0x1.fd0ea68704fdp20 0x0.0p0 -0x1.3ap6 0x1.3377777777757p5 0x0.0p0 F +REG esri:102346 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d181p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:102346 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d181p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:102346 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbaaep21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba3p5 0x0.0p0 F +REG esri:102346 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbaaep21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba3p5 0x0.0p0 F +REG esri:102347 0 OK 0x1.ab3fp21 0x1.0a444f96cdd3fp20 0x0.0p0 -0x1.3ap6 0x1.293333333331p5 0x0.0p0 F +REG esri:102347 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c94p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f8p5 0x0.0p0 F +REG esri:102347 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c94p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f8p5 0x0.0p0 F +REG esri:102347 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6497p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444426p5 0x0.0p0 F +REG esri:102347 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6497p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444426p5 0x0.0p0 F +REG esri:102348 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:102348 1 OK 0x1.253a8c1cc9a6bp18 -0x1.6b59a87c1a3e2p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.711111111110ap5 0x0.0p0 F +REG esri:102348 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a3e2p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:102348 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab1ap18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc627p5 0x0.0p0 F +REG esri:102348 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab1ap18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc627p5 0x0.0p0 F +REG esri:102349 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG esri:102349 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fc01p16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102349 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fc01p16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102349 3 OK 0x1.16844fa8b2f1ep18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:102349 4 OK 0x1.5d05d82ba6871p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:102350 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG esri:102350 1 OK 0x1.86afa96cb71f8p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffddp5 0x0.0p0 F +REG esri:102350 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffddp5 0x0.0p0 F +REG esri:102350 3 OK 0x1.903faf5fb33ffp18 0x1.1ef98e17c981ep18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:102350 4 OK 0x1.81d02850266p19 0x1.1ef98e17c981ep18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:102351 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888866p5 0x0.0p0 F +REG esri:102351 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774dp5 0x0.0p0 F +REG esri:102351 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774dp5 0x0.0p0 F +REG esri:102351 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997dp5 0x0.0p0 F +REG esri:102351 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997dp5 0x0.0p0 F +REG esri:102352 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb4p5 0x0.0p0 F +REG esri:102352 1 OK 0x1.96b30a2e34c92p18 -0x1.50f810ac28e39p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:102352 2 OK 0x1.7e967ae8e59b7p19 -0x1.50f810ac28e39p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:102352 3 OK 0x1.a0c3f35264cb6p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:102352 4 OK 0x1.798e0656cd9a5p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:102353 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.655555555554bp5 0x0.0p0 F +REG esri:102353 1 OK 0x1.8f44d7ce9dfa7p18 -0x1.5efab964159d1p16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:102353 2 OK 0x1.824d9418b102cp19 -0x1.5efab964159d1p16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:102353 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8p18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:102353 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8p18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:102354 0 OK 0x1.24f8p19 0x1.c0697505b695ep16 0x0.0p0 -0x1.68p6 0x1.5844444444435p5 0x0.0p0 F +REG esri:102354 1 OK 0x1.615ed51025e24p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:102354 2 OK 0x1.99409577ed0e5p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:102354 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd154p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:102354 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd154p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:102355 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG esri:102355 1 OK -0x1.83ac3a84b7a72p18 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102355 2 OK 0x1.85261d425bd2fp19 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102355 3 OK -0x1.3283d0f5cd3e4p18 0x1.197f618b4ead7p19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102355 4 OK 0x1.5c91e87ae69eap19 0x1.197f618b4ead6p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102356 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG esri:102356 1 OK -0x1.80b875096f4bcp17 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102356 2 OK 0x1.e6ce1d425bd39p19 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102356 3 OK -0x1.bccf43d734f4cp16 0x1.4a53618b4ead6p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102356 4 OK 0x1.be39e87ae69f2p19 0x1.4a53618b4ead7p19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102357 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG esri:102357 1 OK 0x1.79e2bda42c7p11 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102357 2 OK 0x1.243b0ea12de9cp20 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102357 3 OK 0x1.5070bc28cb07p16 0x1.197f618b4ead7p19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102357 4 OK 0x1.0ff0f43d734f9p20 0x1.197f618b4ead7p19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102358 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG esri:102358 1 OK 0x1.8c878af690b1cp17 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102358 2 OK 0x1.550f0ea12de98p20 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102358 3 OK 0x1.176c2f0a32c1cp18 0x1.4a53618b4ead7p19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102358 4 OK 0x1.40c4f43d734f5p20 0x1.4a53618b4ead6p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102361 0 OK 0x1.86ap17 0x1.c77a1afd7f403p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222123p4 0x0.0p0 F +REG esri:102361 1 OK 0x1.57c9805760d23p16 0x1.dfdaf73c82a2fp16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.1222222222118p4 0x0.0p0 F +REG esri:102361 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82a2fp16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.1222222222118p4 0x0.0p0 F +REG esri:102361 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222115p4 0x0.0p0 F +REG esri:102361 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222115p4 0x0.0p0 F +REG esri:102491 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.599999999999ap1 0x1.1ffffffffffd2p5 0x0.0p0 F +REG esri:102491 1 OK -0x1.66c781505586p16 -0x1.cd71a2eb09c3p17 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.effffffffff64p4 0x0.0p0 F +REG esri:102491 2 OK 0x1.0a90781505586p20 -0x1.cd71a2eb09c3p17 0x0.0p0 0x1.1c2bbe8e45838p3 0x1.effffffffff64p4 0x0.0p0 F +REG esri:102491 3 OK -0x1.4faafbbc9a18p14 0x1.a9cf509be5e8p19 0x0.0p0 -0x1.bd7bc705e2da9p1 0x1.47fffffffffe7p5 0x0.0p0 F +REG esri:102491 4 OK 0x1.f2c557dde4d0cp19 0x1.a9cf509be5e8p19 0x0.0p0 0x1.1c2bbe8e45837p3 0x1.47fffffffffe7p5 0x0.0p0 F +REG esri:102492 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.599999999999ap1 0x1.0a66666666628p5 0x0.0p0 F +REG esri:102492 1 OK -0x1.598246333881p16 -0x1.d0aee0b7a52fp17 0x0.0p0 -0x1.a4206e6b37c1fp1 0x1.c4ccccccccc0ep4 0x0.0p0 F +REG esri:102492 2 OK 0x1.09bc246333881p20 -0x1.d0aee0b7a52fp17 0x0.0p0 0x1.15d4e8679abd5p3 0x1.c4ccccccccc0ep4 0x0.0p0 F +REG esri:102492 3 OK -0x1.8455188d8e28p14 0x1.a8f4be0f773ffp19 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.3266666666643p5 0x0.0p0 F +REG esri:102492 4 OK 0x1.f46aa8c46c713p19 0x1.a8f4be0f773ffp19 0x0.0p0 0x1.15d4e8679abd4p3 0x1.3266666666643p5 0x0.0p0 F +REG esri:102581 0 OK 0x1.24f8p19 0x1.24f8p20 0x0.0p0 0x1.2b2a53490b9bp1 0x1.8bffffffff8acp5 0x0.0p0 F +REG esri:102581 1 OK -0x1.a39117ed29d4p13 0x1.4989e88ce22d7p19 0x0.0p0 -0x1.5724b7a484d84p2 0x1.63ffffffffff2p5 0x0.0p0 F +REG esri:102581 2 OK 0x1.283f222fda53ap20 0x1.4989e88ce22d7p19 0x0.0p0 0x1.41278576c839ap3 0x1.63ffffffffff2p5 0x0.0p0 F +REG esri:102581 3 OK 0x1.8731b067b568cp16 0x1.b331ce56f0792p20 0x0.0p0 -0x1.5724b7a484d82p2 0x1.b3ffffffffd1fp5 0x0.0p0 F +REG esri:102581 4 OK 0x1.0c84e4f984a96p20 0x1.b331ce56f0792p20 0x0.0p0 0x1.41278576c8399p3 0x1.b3ffffffffd1fp5 0x0.0p0 F +REG esri:102582 0 OK 0x1.24f8p19 0x1.0c8ep21 0x0.0p0 0x1.2b2a53490b9bp1 0x1.766666666665cp5 0x0.0p0 F +REG esri:102582 1 OK -0x1.0537b9a2ab88p13 0x1.983938af394e9p20 0x0.0p0 -0x1.3de1330a236dbp2 0x1.4e6666666665p5 0x0.0p0 F +REG esri:102582 2 OK 0x1.27026f7345571p20 0x1.983938af394e9p20 0x0.0p0 0x1.3485c32997846p3 0x1.4e6666666665p5 0x0.0p0 F +REG esri:102582 3 OK 0x1.72c4bb23498a4p16 0x1.5361d235017f4p21 0x0.0p0 -0x1.3de1330a236dbp2 0x1.9e66666666183p5 0x0.0p0 F +REG esri:102582 4 OK 0x1.0dcbb44dcb676p20 0x1.5361d235017f4p21 0x0.0p0 0x1.3485c32997847p3 0x1.9e66666666183p5 0x0.0p0 F +REG esri:102583 0 OK 0x1.24f8p19 0x1.86ap21 0x0.0p0 0x1.2b2a53490b9bp1 0x1.60ccccccccccp5 0x0.0p0 F +REG esri:102583 1 OK -0x1.d500de09b1bp11 0x1.45e12fc3c1f1dp21 0x0.0p0 -0x1.28057a97a5247p2 0x1.38cccccccccafp5 0x0.0p0 F +REG esri:102583 2 OK 0x1.25e2806f04d8ep20 0x1.45e12fc3c1f1dp21 0x0.0p0 0x1.2997e6f0585fdp3 0x1.38cccccccccafp5 0x0.0p0 F +REG esri:102583 3 OK 0x1.60607f849bae4p16 0x1.cd2f86a97a52bp21 0x0.0p0 -0x1.28057a97a5247p2 0x1.88cccccccc4f7p5 0x0.0p0 F +REG esri:102583 4 OK 0x1.0ef1f807b6452p20 0x1.cd2f86a97a52bp21 0x0.0p0 0x1.2997e6f0585fdp3 0x1.88cccccccc4f7p5 0x0.0p0 F +REG esri:102584 0 OK 0x1.d4b74bc6a7efap7 0x1.fef82af3b645ap21 0x0.0p0 0x1.2b2a53490b9bp1 0x1.5151eb851eb7p5 0x0.0p0 F +REG esri:102584 1 OK -0x1.2535fe17be5b8p19 0x1.be060be8aaa25p21 0x0.0p0 -0x1.1a241b8bc91dcp2 0x1.2951eb851eb5dp5 0x0.0p0 F +REG esri:102584 2 OK 0x1.2570950137306p19 0x1.be060be8aaa25p21 0x0.0p0 0x1.22a7376a6a5c5p3 0x1.2951eb851eb5dp5 0x0.0p0 F +REG esri:102584 3 OK -0x1.f4ae46499841bp18 0x1.22ad43ef10169p22 0x0.0p0 -0x1.1a241b8bc91dcp2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG esri:102584 4 OK 0x1.f523741c89eb8p18 0x1.22ad43ef10169p22 0x0.0p0 0x1.22a7376a6a5c5p3 0x1.7951eb851eb7cp5 0x0.0p0 F +REG esri:102591 0 OK 0x1.e869cp18 0x1.250e8p18 0x0.0p0 0x1.599999999999ap1 0x1.1ffffffffffd1p5 0x0.0p0 F +REG esri:102591 1 OK -0x1.66407fe123a28p16 -0x1.cd44a294ca65p17 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.effffffffff6bp4 0x0.0p0 F +REG esri:102591 2 OK 0x1.0a98e7fe123a2p20 -0x1.cd44a294ca65p17 0x0.0p0 0x1.1c2bbe8e45837p3 0x1.effffffffff6bp4 0x0.0p0 F +REG esri:102591 3 OK -0x1.4d8ef664aba3p14 0x1.a9da907fd20fcp19 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:102591 4 OK 0x1.f2d637b3255d2p19 0x1.a9da907fd20fcp19 0x0.0p0 0x1.1c2bbe8e45839p3 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:102592 0 OK 0x1.e869cp18 0x1.250e8p18 0x0.0p0 0x1.599999999999ap1 0x1.0a66666666629p5 0x0.0p0 F +REG esri:102592 1 OK -0x1.58fb44cb4075p16 -0x1.d081e0684d444p17 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.c4ccccccccc0ap4 0x0.0p0 F +REG esri:102592 2 OK 0x1.09c4944cb4074p20 -0x1.d081e0684d444p17 0x0.0p0 0x1.15d4e8679abd4p3 0x1.c4ccccccccc0ap4 0x0.0p0 F +REG esri:102592 3 OK -0x1.82391341af7p14 0x1.a8fffdf58e4d9p19 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.3266666666644p5 0x0.0p0 F +REG esri:102592 4 OK 0x1.f47b889a0d7b7p19 0x1.a8fffdf58e4d9p19 0x0.0p0 0x1.15d4e8679abd5p3 0x1.3266666666644p5 0x0.0p0 F +REG esri:102629 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG esri:102629 1 OK -0x1.33993e1cee21cp20 -0x1.b195e21361d3p20 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG esri:102629 2 OK 0x1.39ff09b921bbp21 -0x1.b195e21361d32p20 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG esri:102629 3 OK -0x1.05bd774f6a2f5p20 0x1.c8948336434fbp20 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:102629 4 OK 0x1.231126525fc1dp21 0x1.c8948336434fap20 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:102630 0 OK 0x1.e097400000003p20 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102630 1 OK 0x1.a8935d56a7e2p15 -0x1.b1ca3c608a613p20 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102630 2 OK 0x1.d9f4f28aa560ap21 -0x1.b1ca3c608a613p20 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102630 3 OK 0x1.d1b2a065bc0b8p17 0x1.c8549b269ee15p20 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102630 4 OK 0x1.c37c15f9a43f8p21 0x1.c8549b269ee15p20 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102631 0 OK 0x1.f49d8d5555555p23 -0x1.b6aec2979c78bp23 0x0.0p0 -0x1.0b55555555557p7 0x1.c7ffffffffe78p5 0x0.0p0 F +REG esri:102631 1 OK 0x1.a30b76ed12f21p23 -0x1.ba225e03421d2p23 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.9fffffffffbaap5 0x0.0p0 F +REG esri:102631 2 OK 0x1.04069363e79f3p24 -0x1.02e1e99246734p24 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG esri:102631 3 OK 0x1.f19b815240de7p23 -0x1.6a97c834b838bp23 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.effffffffff93p5 0x0.0p0 F +REG esri:102631 4 OK 0x1.1f5479cffc819p24 -0x1.a430966b119f4p23 0x0.0p0 -0x1.f1f1f1e8bff36p6 0x1.effffffffff94p5 0x0.0p0 F +REG esri:102632 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG esri:102632 1 OK -0x1.870b0f8431e84p18 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.2d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102632 2 OK 0x1.c15f6c9b30e72p21 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.0afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102632 3 OK 0x1.331fe132959cp15 0x1.d6d95e548863cp20 0x0.0p0 -0x1.2d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102632 4 OK 0x1.8bb18b25e053dp21 0x1.d6d95e548863ap20 0x0.0p0 -0x1.0afcaafe0778p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102633 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG esri:102633 1 OK -0x1.870b0f8431e84p18 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.35035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102633 2 OK 0x1.c15f6c9b30e7ep21 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.12fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102633 3 OK 0x1.331fe132959cp15 0x1.d6d95e548863cp20 0x0.0p0 -0x1.35035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102633 4 OK 0x1.8bb18b25e0547p21 0x1.d6d95e548863cp20 0x0.0p0 -0x1.12fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102634 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG esri:102634 1 OK -0x1.870b0f8431e1cp18 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.3d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102634 2 OK 0x1.c15f6c9b30e7ep21 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.1afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102634 3 OK 0x1.331fe13295c4p15 0x1.d6d95e548863ap20 0x0.0p0 -0x1.3d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102634 4 OK 0x1.8bb18b25e0547p21 0x1.d6d95e548863cp20 0x0.0p0 -0x1.1afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102635 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG esri:102635 1 OK -0x1.870b0f8431e1cp18 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.45035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102635 2 OK 0x1.c15f6c9b30e7ep21 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.22fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102635 3 OK 0x1.331fe13295c4p15 0x1.d6d95e548863ap20 0x0.0p0 -0x1.45035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102635 4 OK 0x1.8bb18b25e0547p21 0x1.d6d95e548863cp20 0x0.0p0 -0x1.22fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102636 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG esri:102636 1 OK -0x1.870b0f8431e84p18 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.4d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102636 2 OK 0x1.c15f6c9b30e72p21 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.2afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102636 3 OK 0x1.331fe132959cp15 0x1.d6d95e548863cp20 0x0.0p0 -0x1.4d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102636 4 OK 0x1.8bb18b25e053dp21 0x1.d6d95e548863ap20 0x0.0p0 -0x1.2afcaafe0778p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102637 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG esri:102637 1 OK -0x1.870b0f8431e84p18 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.55035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102637 2 OK 0x1.c15f6c9b30e72p21 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.32fcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102637 3 OK 0x1.331fe132959cp15 0x1.d6d95e548863cp20 0x0.0p0 -0x1.55035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102637 4 OK 0x1.8bb18b25e053dp21 0x1.d6d95e548863ap20 0x0.0p0 -0x1.32fcaafe0778p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102638 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG esri:102638 1 OK -0x1.870b0f8431e1cp18 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.5d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102638 2 OK 0x1.c15f6c9b30e7ep21 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.3afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102638 3 OK 0x1.331fe13295c4p15 0x1.d6d95e548863ap20 0x0.0p0 -0x1.5d035501f888p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102638 4 OK 0x1.8bb18b25e0547p21 0x1.d6d95e548863cp20 0x0.0p0 -0x1.3afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102639 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG esri:102639 1 OK -0x1.870b0f8431e1cp18 -0x1.a185f9ec9af13p20 0x0.0p0 -0x1.65035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:102639 2 OK 0x1.c15f6c9b30e7ep21 -0x1.a185f9ec9af0fp20 0x0.0p0 -0x1.42fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:102639 3 OK 0x1.331fe13295c4p15 0x1.d6d95e548863ap20 0x0.0p0 -0x1.65035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102639 4 OK 0x1.8bb18b25e0547p21 0x1.d6d95e548863cp20 0x0.0p0 -0x1.42fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:102640 0 OK 0x1.907e0aaaaaaabp21 0x1.f90a548ac9e09p18 0x0.0p0 -0x1.6p7 0x1.a355555555154p5 0x0.0p0 F +REG esri:102640 1 OK 0x1.09dba15d7367dp21 -0x1.d67fc8dc81d51p18 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG esri:102640 2 OK 0x1.0b9039fbf0f6cp22 -0x1.d67fc8dc81d51p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG esri:102640 3 OK 0x1.1a2b0c803db6fp21 0x1.8287708e4b5edp20 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG esri:102640 4 OK 0x1.0368846a8bcf4p22 0x1.8287708e4b5edp20 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG esri:102641 0 OK 0x1.907e0aaaaaaabp22 0x1.f84139e8fe64cp20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG esri:102641 1 OK 0x1.5a9aac8a4ff8fp22 0x1.2c788db9e5fa9p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG esri:102641 2 OK 0x1.c66168cb055bfp22 0x1.2c788db9e5fa9p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG esri:102641 3 OK 0x1.5e3cf19904366p22 0x1.65af469f319f6p21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:102641 4 OK 0x1.c2bf23bc511e9p22 0x1.65af469f319f6p21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:102642 0 OK 0x1.907e0aaaaaaabp22 0x1.f0d0c4b5bcdbp20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe3p5 0x0.0p0 F +REG esri:102642 1 OK 0x1.5eab6b70592bp22 0x1.3330601597db2p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:102642 2 OK 0x1.c250a9e4fc29ep22 0x1.3330601597db2p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:102642 3 OK 0x1.619d4b796b702p22 0x1.5a314358129d3p21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555541p5 0x0.0p0 F +REG esri:102642 4 OK 0x1.bf5ec9dbe9e4cp22 0x1.5a314358129d3p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555541p5 0x0.0p0 F +REG esri:102643 0 OK 0x1.907e0aaaaaaabp22 0x1.e66c4c08b284bp20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG esri:102643 1 OK 0x1.643b41908a121p22 0x1.3cd93a71d9cf1p20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:102643 2 OK 0x1.bcc0d3c4cb43dp22 0x1.3cd93a71d9cf1p20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:102643 3 OK 0x1.6677dd7be06aep22 0x1.4a4240448c3e8p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:102643 4 OK 0x1.ba8437d974ebp22 0x1.4a4240448c3e8p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:102644 0 OK 0x1.907e0aaaaaaabp22 0x1.e5aadbb7037b5p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG esri:102644 1 OK 0x1.64ab3a8e67278p22 0x1.3d782895902b8p20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:102644 2 OK 0x1.bc50dac6ee2dep22 0x1.3d782895902b8p20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:102644 3 OK 0x1.66c728b117016p22 0x1.490fd34b29242p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa89p5 0x0.0p0 F +REG esri:102644 4 OK 0x1.ba34eca43e54p22 0x1.490fd34b29242p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa89p5 0x0.0p0 F +REG esri:102645 0 OK 0x1.907e0aaaaaaabp22 0x1.e7dc46f67141dp20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG esri:102645 1 OK 0x1.639369c011b22p22 0x1.3b3cfa8044958p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:102645 2 OK 0x1.bd68ab9543a3cp22 0x1.3b3cfa8044958p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:102645 3 OK 0x1.65a65a5c8e313p22 0x1.4c56c6329a152p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG esri:102645 4 OK 0x1.bb55baf8c724bp22 0x1.4c56c6329a152p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG esri:102646 0 OK 0x1.907e0aaaaaaabp22 0x1.dcbd320e6cadap20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG esri:102646 1 OK 0x1.697149cfd1216p22 0x1.45c4474b132d2p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:102646 2 OK 0x1.b78acb858433cp22 0x1.45c4474b132d2p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:102646 3 OK 0x1.6af09de1926d8p22 0x1.3b5e6d5a95c1bp21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeec2p5 0x0.0p0 F +REG esri:102646 4 OK 0x1.b60b7773c2e7ap22 0x1.3b5e6d5a95c1bp21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeec3p5 0x0.0p0 F +REG esri:102648 0 OK 0x1.55cbd33333334p19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:102648 1 OK -0x1.295586c8b67afp20 -0x1.b157317808224p20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102648 2 OK 0x1.3f90acfdf4d7ap21 -0x1.b157317808223p20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102648 3 OK -0x1.f51c934280788p19 0x1.c8cabbc02c8b1p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102648 4 OK 0x1.282d0e6a39b84p21 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102649 0 OK 0x1.55cbd33333334p19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:102649 1 OK -0x1.295586c8b67d2p20 -0x1.b157317808223p20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102649 2 OK 0x1.3f90acfdf4d7ap21 -0x1.b157317808223p20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102649 3 OK -0x1.f51c9342807c8p19 0x1.c8cabbc02c8b4p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:102649 4 OK 0x1.282d0e6a39b84p21 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102650 0 OK 0x1.55cbd33333334p19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:102650 1 OK -0x1.29597b8682ccp20 -0x1.b15adabe3cb82p20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102650 2 OK 0x1.3f92a75cdaffap21 -0x1.b15adabe3cb82p20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102650 3 OK -0x1.f523b26381c7p19 0x1.c8ce97bf7652p20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102650 4 OK 0x1.282ed6327a0b6p21 0x1.c8ce97bf7652p20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102651 0 OK 0x1.4064d55555554p20 0x1.51ad3e78a059bp18 0x0.0p0 -0x1.7p6 0x1.1a44444444415p5 0x0.0p0 F +REG esri:102651 1 OK 0x1.25a5b302528bp19 -0x1.4989df995e539p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:102651 2 OK 0x1.edf6d1298165p20 -0x1.4989df995e539p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:102651 3 OK 0x1.359cf3f585a15p19 0x1.fe8320bb29a21p19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.297777777774fp5 0x0.0p0 F +REG esri:102651 4 OK 0x1.e5fb30afe7d9ep20 0x1.fe8320bb29a21p19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.297777777774fp5 0x0.0p0 F +REG esri:102652 0 OK 0x1.4064d55555554p20 0x1.9dacc412feb1ep20 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG esri:102652 1 OK 0x1.00c480df4eddap19 0x1.cae97f93b643bp19 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:102652 2 OK 0x1.0033b51d819dep21 0x1.cae97f93b643bp19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:102652 3 OK 0x1.132c6924885cbp19 0x1.2d45655229a82p21 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:102652 4 OK 0x1.f7337618667c2p20 0x1.2d45655229a82p21 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:102653 0 OK 0x1.6e360000a5b8p21 0x1.349e033e49192p20 0x0.0p0 -0x1.a6p6 0x1.407777777776p5 0x0.0p0 F +REG esri:102653 1 OK 0x1.2c1b34ea6545bp21 0x1.6a24980a960a4p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:102653 2 OK 0x1.b050cb16e62a5p21 0x1.6a24980a960a4p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:102653 3 OK 0x1.2edc82fc70acap21 0x1.b6f34d77ef014p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fap5 0x0.0p0 F +REG esri:102653 4 OK 0x1.ad8f7d04dac36p21 0x1.b6f34d77ef014p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fap5 0x0.0p0 F +REG esri:102654 0 OK 0x1.6e360000a5b8p21 0x1.4959ca39abf1ap20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG esri:102654 1 OK 0x1.165b50c5e30cap21 0x1.4295425f895f4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:102654 2 OK 0x1.c610af3b68636p21 0x1.4295425f895f4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:102654 3 OK 0x1.1af84f5fdb6e4p21 0x1.f611413a7a01bp20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa93p5 0x0.0p0 F +REG esri:102654 4 OK 0x1.c173b0a17001cp21 0x1.f611413a7a01bp20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa93p5 0x0.0p0 F +REG esri:102655 0 OK 0x1.6e360000a5b8p21 0x1.42aa603773b74p20 0x0.0p0 -0x1.a6p6 0x1.2c66666666643p5 0x0.0p0 F +REG esri:102655 1 OK 0x1.1d7ce353bb71cp21 0x1.4f0ebe975545bp19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444417p5 0x0.0p0 F +REG esri:102655 2 OK 0x1.beef1cad8ffe4p21 0x1.4f0ebe975545bp19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444417p5 0x0.0p0 F +REG esri:102655 3 OK 0x1.213c0acb88131p21 0x1.e19682bf0f836p20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886ep5 0x0.0p0 F +REG esri:102655 4 OK 0x1.bb2ff535c35cfp21 0x1.e19682bf0f836p20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886ep5 0x0.0p0 F +REG esri:102656 0 OK 0x1.e847fffff79cap19 0x1.500fa66b45e21p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG esri:102656 1 OK 0x1.2cd1751970186p19 0x1.336c49b7f1d1ap18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG esri:102656 2 OK 0x1.51df45733f907p20 0x1.336c49b7f1d1ap18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG esri:102656 3 OK 0x1.32acebaa3e852p19 0x1.04afc04ea7ddbp20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111103p5 0x0.0p0 F +REG esri:102656 4 OK 0x1.4ef18a2ad85a1p20 0x1.04afc04ea7ddbp20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111103p5 0x0.0p0 F +REG esri:102657 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:102657 1 OK -0x1.3b2843541abd7p20 -0x1.adf90da921e8p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG esri:102657 2 OK 0x1.3dc68c54b809ep21 -0x1.adf90da921e7fp20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG esri:102657 3 OK -0x1.fc8e1e7eb5868p19 0x1.cc6842bfb4f9bp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG esri:102657 4 OK 0x1.1f55f24a580ccp21 0x1.cc6842bfb4f9cp20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG esri:102658 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:102658 1 OK -0x1.2e33bf0559a03p20 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102658 2 OK 0x1.374c4a2d577acp21 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102658 3 OK -0x1.0b0551156d0abp20 0x1.c5c43c229dadp20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102658 4 OK 0x1.25b51335613p21 0x1.c5c43c229dadp20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102659 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:102659 1 OK -0x1.2e33bf0559a03p20 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102659 2 OK 0x1.374c4a2d577acp21 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:102659 3 OK -0x1.0b0551156d0abp20 0x1.c5c43c229dadp20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102659 4 OK 0x1.25b51335613p21 0x1.c5c43c229dadp20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:102660 0 OK 0x1.e097400000003p20 0x1.36c124f6ea72p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff66p4 0x0.0p0 F +REG esri:102660 1 OK 0x1.41af8ade6516ep20 -0x1.312f13394fd4fp18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff52p4 0x0.0p0 F +REG esri:102660 2 OK 0x1.3fbf7a90cd743p21 -0x1.312f13394fd4fp18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff52p4 0x0.0p0 F +REG esri:102660 3 OK 0x1.472fd7933cbd6p20 0x1.d4e8d5e1dda85p19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff79p4 0x0.0p0 F +REG esri:102660 4 OK 0x1.3cff543661a0fp21 0x1.d4e8d5e1dda85p19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG esri:102661 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG esri:102661 1 OK -0x1.cc55190d51058p17 -0x1.b61f3425718ap20 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:102661 2 OK 0x1.ad435c3b7fbb4p21 -0x1.b61f3425718ap20 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:102661 3 OK -0x1.f05296733d91p16 0x1.c378d7ffbc917p20 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:102661 4 OK 0x1.a0009f5e44976p21 0x1.c378d7ffbc917p20 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:102662 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG esri:102662 1 OK -0x1.d59f3248e3bfp17 -0x1.b59599e8af0cbp20 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG esri:102662 2 OK 0x1.add7fdcf38e8p21 -0x1.b59599e8af0c9p20 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG esri:102662 3 OK -0x1.de246c5d8e8bp16 0x1.c415bddcb9f94p20 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG esri:102662 4 OK 0x1.9f6f2e0d97206p21 0x1.c415bddcb9f95p20 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532545p4 0x0.0p0 F +REG esri:102663 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG esri:102663 1 OK -0x1.daf24a1489dp17 -0x1.b54aa78e6ceb9p20 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:102663 2 OK 0x1.ae2d2f4bf347ep21 -0x1.b54aa78e6ceb9p20 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:102663 3 OK -0x1.d40be5c22c78p16 0x1.c470db440df08p20 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:102663 4 OK 0x1.9f1e69d8bc0eap21 0x1.c470db440df08p20 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:102664 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG esri:102664 1 OK -0x1.df2e880487f8p17 -0x1.b50c0601be42p20 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:102664 2 OK 0x1.ae70f32af32a6p21 -0x1.b50c0601be42p20 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:102664 3 OK -0x1.cbc21da97cddp16 0x1.c4b84dddec2d6p20 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:102664 4 OK 0x1.9edc1b97f691cp21 0x1.c4b84dddec2d6p20 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:102665 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG esri:102665 1 OK -0x1.de27f314743p17 -0x1.b51cda820a271p20 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94cadp4 0x0.0p0 F +REG esri:102665 2 OK 0x1.ae6089dbf1edep21 -0x1.b51cda820a271p20 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94cadp4 0x0.0p0 F +REG esri:102665 3 OK -0x1.cde803c9e033p16 0x1.c4a78b030e68ap20 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:102665 4 OK 0x1.9eed4ac8f9ac8p21 0x1.c4a78b030e68ap20 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:102666 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102666 1 OK -0x1.331c47ace0d7fp20 -0x1.b1c692296f915p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102666 2 OK 0x1.39c08e811b173p21 -0x1.b1c692296f915p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:102666 3 OK -0x1.062aefbfd3822p20 0x1.c850c02f2b574p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102666 4 OK 0x1.2347e28a946c4p21 0x1.c850c02f2b575p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102667 0 OK 0x1.18583aaaaaaabp21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:102667 1 OK 0x1.75870bf72746cp18 -0x1.b1c692296f915p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:102667 2 OK 0x1.00ffc9eb3836p22 -0x1.b1c692296f915p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:102667 3 OK 0x1.14a635d5ae4f2p19 0x1.c850c02f2b575p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102667 4 OK 0x1.eb86e7dfe9c12p21 0x1.c850c02f2b574p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:102668 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:102668 1 OK -0x1.3f5f7b94dfbaap20 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102668 2 OK 0x1.3fe228751a88p21 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102668 3 OK -0x1.f40210c39ed98p19 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.db70850622b0dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102668 4 OK 0x1.1d32eedb92611p21 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102669 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:102669 1 OK -0x1.3c4f6e537ee54p18 -0x1.abd3ba6b8ade3p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102669 2 OK 0x1.b807f8751a882p21 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102669 3 OK -0x1.36ad0c39ed76p15 0x1.ce73b0bbe3aedp20 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102669 4 OK 0x1.9558bedb92612p21 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102670 0 OK 0x1.4064d55555555p21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:102670 1 OK 0x1.4272f8e5f0bd8p19 -0x1.abd231ddc1ef6p20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102670 2 OK 0x1.18167638973dap22 -0x1.abd231ddc1ef6p20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:102670 3 OK 0x1.cd2f5fff71582p19 0x1.ce720868f3e3ep20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102670 4 OK 0x1.06bee955672a5p22 0x1.ce720868f3e3ep20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:102671 0 OK 0x1.e097400000001p19 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG esri:102671 1 OK -0x1.d337aa27ec9dfp19 -0x1.aeabd35d8d296p20 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102671 2 OK 0x1.65198a89fb27p21 -0x1.aeabd35d8d298p20 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102671 3 OK -0x1.5f3708e5701fbp19 0x1.cbaec69ae12bep20 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102671 4 OK 0x1.481962395c078p21 0x1.cbaec69ae12bdp20 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102672 0 OK 0x1.18583aaaaaaabp21 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG esri:102672 1 OK 0x1.5b3480fc39654p18 -0x1.aea813b5a54a8p20 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102672 2 OK 0x1.02a4f29ae714ap22 -0x1.aea813b5a54a7p20 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:102672 3 OK 0x1.2199df4433596p19 0x1.cbaac64da6c9bp20 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102672 4 OK 0x1.e849fd84487f8p21 0x1.cbaac64da6c9cp20 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:102673 0 OK 0x1.4064d55555556p18 0x1.907e0aaaaaaabp19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:102673 1 OK -0x1.8ab24a7913bc6p20 -0x1.cbf787124f165p19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102673 2 OK 0x1.15725a91df341p21 -0x1.cbf787124f163p19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102673 3 OK -0x1.4ee8d2de2f8e4p20 0x1.4a2f622190e4cp21 0x0.0p0 -0x1.6fe049119990cp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102673 4 OK 0x1.ef1b3d88da3ap20 0x1.4a2f622190e4dp21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102674 0 OK 0x1.6871700000002p21 0x1.907e0aaaaaaabp19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:102674 1 OK 0x1.ec2ec0632ddd2p19 -0x1.cbf787124f165p19 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102674 2 OK 0x1.2aeb97f39a448p22 -0x1.cbf787124f165p19 0x0.0p0 -0x1.431fb6ee219f7p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:102674 3 OK 0x1.31e0d7cc7b1cap20 0x1.4a2f622190e4cp21 0x0.0p0 -0x1.758af3bc443b6p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102674 4 OK 0x1.1bf93a0ce139p22 0x1.4a2f622190e4cp21 0x0.0p0 -0x1.431fb6ee666f4p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:102675 0 OK 0x1.2c5e880000001p22 0x1.b7c99ac677fc7p21 0x0.0p0 -0x1.76p6 0x1.53111111111p5 0x0.0p0 F +REG esri:102675 1 OK 0x1.03d2bd0e96848p22 0x1.6a5697a984cfbp21 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG esri:102675 2 OK 0x1.54ea52f1697bap22 0x1.6a5697a984cfbp21 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG esri:102675 3 OK 0x1.060bf4adabb8ap22 0x1.03bd8a32c39dap22 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG esri:102675 4 OK 0x1.52b11b5254478p22 0x1.03bd8a32c39dap22 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG esri:102676 0 OK 0x1.907e0aaaaaaaep20 0x1.3d3f567def795p18 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG esri:102676 1 OK 0x1.d9f3bc9cd31f5p19 -0x1.346e38124673dp18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc1p5 0x0.0p0 F +REG esri:102676 2 OK 0x1.1a011b8375e29p21 -0x1.346e38124673dp18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc1p5 0x0.0p0 F +REG esri:102676 3 OK 0x1.eb292b952e831p19 0x1.e0253b431c93p19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG esri:102676 4 OK 0x1.15b3bfc55f09ap21 0x1.e0253b431c93p19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG esri:102677 0 OK 0x1.4064d55555554p20 0x1.01dcb007f3f7ep18 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG esri:102677 1 OK 0x1.7893406c24ef4p19 -0x1.f8ddd2d376819p17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:102677 2 OK 0x1.c4800a749831ep20 -0x1.f8ddd2d376819p17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:102677 3 OK 0x1.8335e132fa49cp19 0x1.8575d7a7c173cp19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:102677 4 OK 0x1.bf2eba112d84bp20 0x1.8575d7a7c173cp19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:102678 0 OK 0x1.4064d55555554p20 0x1.94d890b735ed2p20 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeecbp5 0x0.0p0 F +REG esri:102678 1 OK 0x1.24e68899810f4p19 0x1.dc5355d7891bap19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8cp5 0x0.0p0 F +REG esri:102678 2 OK 0x1.ee56665dea23ep20 0x1.dc5355d7891bap19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8cp5 0x0.0p0 F +REG esri:102678 3 OK 0x1.3648799ad0532p19 0x1.1ff589fcbd419p21 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:102678 4 OK 0x1.e5a56ddd4281ep20 0x1.1ff589fcbd419p21 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:102679 0 OK 0x1.907e0aaaaaaaep20 0x1.04cae2b6b9b8fp18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG esri:102679 1 OK 0x1.0aeb10e85ba0ap20 -0x1.feccc02444d9p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:102679 2 OK 0x1.0b0882367cda9p21 -0x1.feccc02444d9p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:102679 3 OK 0x1.10349104c3796p20 0x1.89d6f5d769755p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:102679 4 OK 0x1.0863c22848ee3p21 0x1.89d6f5d769755p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:102680 0 OK 0x1.907e0aaaaaaaep20 0x1.d79a53c92948cp20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG esri:102680 1 OK 0x1.fd4ce850a72c9p19 0x1.4aec624adeadep20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:102680 2 OK 0x1.112ad09680df4p21 0x1.4aec624adeadep20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:102680 3 OK 0x1.04b16907377f2p20 0x1.33abac36d6416p21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:102680 4 OK 0x1.0e2556270eeadp21 0x1.33abac36d6416p21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:102681 0 OK 0x1.907e0aaaaaaabp21 0x1.80d72f309a96fp18 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG esri:102681 1 OK 0x1.2d90b4fd69d75p21 -0x1.77aab588f74e8p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:102681 2 OK 0x1.f36b6057eb7d8p21 -0x1.77aab588f74e8p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:102681 3 OK 0x1.3214ef0c947a8p21 0x1.22e5faacdef8fp20 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:102681 4 OK 0x1.eee72648c0da6p21 0x1.22e5faacdef8fp20 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:102682 0 OK 0x1.907e0aaaaaaabp21 0x1.86a7c427d74f4p18 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG esri:102682 1 OK 0x1.2c2fc6b2732e4p21 -0x1.7ded25dcc0e2fp18 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665bp4 0x0.0p0 F +REG esri:102682 2 OK 0x1.f4cc4ea2e2272p21 -0x1.7ded25dcc0e2fp18 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665bp4 0x0.0p0 F +REG esri:102682 3 OK 0x1.3080083a4331ep21 0x1.27283341722f7p20 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ep4 0x0.0p0 F +REG esri:102682 4 OK 0x1.f07c0d1b12238p21 0x1.27283341722f7p20 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ep4 0x0.0p0 F +REG esri:102683 0 OK 0x1.e097400000001p19 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG esri:102683 1 OK -0x1.e3860df712137p19 -0x1.aa83ba2790affp20 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG esri:102683 2 OK 0x1.692d237dc484ep21 -0x1.aa83ba2790affp20 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG esri:102683 3 OK -0x1.4eb20da18b725p19 0x1.cfa05dbdeeb9cp20 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG esri:102683 4 OK 0x1.43f8236862dcap21 0x1.cfa05dbdeeb9cp20 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG esri:102684 0 OK 0x1.6871700000002p21 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG esri:102684 1 OK 0x1.dfb8fde98f0dp19 -0x1.ab183333ea845p20 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:102684 2 OK 0x1.2c7a5042ce1ecp22 -0x1.ab183333ea844p20 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:102684 3 OK 0x1.38231b1807b35p20 0x1.cf2711e6e523dp20 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:102684 4 OK 0x1.1a68a939fe138p22 0x1.cf2711e6e523ep20 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:102685 0 OK 0x1.4064d55555554p20 0x1.3d1efd3b91135p18 0x0.0p0 -0x1.34p6 0x1.3477777777759p5 0x0.0p0 F +REG esri:102685 1 OK 0x1.3a7910c48ddc9p19 -0x1.3505fec9eb771p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.2633333333309p5 0x0.0p0 F +REG esri:102685 2 OK 0x1.e38d224863bc4p20 -0x1.3505fec9eb771p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.2633333333309p5 0x0.0p0 F +REG esri:102685 3 OK 0x1.4a5177c5e4d4ap19 0x1.dfa15d7c87655p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba5p5 0x0.0p0 F +REG esri:102685 4 OK 0x1.dba0eec7b8403p20 0x1.dfa15d7c87655p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba5p5 0x0.0p0 F +REG esri:102686 0 OK 0x1.4064d55555556p19 0x1.51cf01db587d7p21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba7p5 0x0.0p0 F +REG esri:102686 1 OK 0x1.7b96f0ab0e22p14 0x1.07f21b07f43d4p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442bp5 0x0.0p0 F +REG esri:102686 2 OK 0x1.3a767992a91cep20 0x1.07f21b07f43d4p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442bp5 0x0.0p0 F +REG esri:102686 3 OK 0x1.bbb2723ad7a6p15 0x1.9dabbc7f5b328p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333323p5 0x0.0p0 F +REG esri:102686 4 OK 0x1.328741c37e983p20 0x1.9dabbc7f5b328p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333323p5 0x0.0p0 F +REG esri:102687 0 OK 0x1.907e0aaaaaaaep20 0x1.57f5cca07ddfp16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG esri:102687 1 OK 0x1.35d5e8a46a36bp20 -0x1.0b0c374f92457p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG esri:102687 2 OK 0x1.eb262cb0eb1f1p20 -0x1.0b0c374f92457p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG esri:102687 3 OK 0x1.3890cdb222f32p20 0x1.bc8e2eb9499bap18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG esri:102687 4 OK 0x1.e86b47a33262ap20 0x1.bc8e2eb9499bap18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG esri:102688 0 OK 0x1.907e0aaaaaaabp24 0x1.9983a2715defdp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776dp5 0x0.0p0 F +REG esri:102688 1 OK 0x1.831fa2108ae1cp24 -0x1.87cb22dd32da7p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d111111111p5 0x0.0p0 F +REG esri:102688 2 OK 0x1.9ddc7344ca739p24 -0x1.87cb22dd32da7p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d111111111p5 0x0.0p0 F +REG esri:102688 3 OK 0x1.8430f70b6518ep24 0x1.374ebe08f69dap20 0x0.0p0 -0x1.693a5d9ac6986p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:102688 4 OK 0x1.9ccb1e49f03c8p24 0x1.374ebe08f69dap20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:102689 0 OK 0x1.2c5e880000001p24 0x1.a842f29563b9fp18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111106p5 0x0.0p0 F +REG esri:102689 1 OK 0x1.1e8615d7592dfp24 -0x1.96291f8fb2f05p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffff1p5 0x0.0p0 F +REG esri:102689 2 OK 0x1.3a36fa28a6d22p24 -0x1.96291f8fb2f05p18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffff1p5 0x0.0p0 F +REG esri:102689 3 OK 0x1.1f9dc5cb116aep24 0x1.4276a03454542p20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221bp5 0x0.0p0 F +REG esri:102689 4 OK 0x1.391f4a34ee953p24 0x1.4276a03454542p20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221bp5 0x0.0p0 F +REG esri:102690 0 OK 0x1.907e0aaaaaaabp23 0x1.818abff38639dp18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa9ap5 0x0.0p0 F +REG esri:102690 1 OK 0x1.77789667dd9fp23 -0x1.73a611d52b002p18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553ep5 0x0.0p0 F +REG esri:102690 2 OK 0x1.a9837eed77b64p23 -0x1.73a611d52b002p18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553ep5 0x0.0p0 F +REG esri:102690 3 OK 0x1.7927cdcd197b5p23 0x1.247afb67c155p20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff2p5 0x0.0p0 F +REG esri:102690 4 OK 0x1.a7d447883bd9fp23 0x1.247afb67c155p20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff2p5 0x0.0p0 F +REG esri:102691 0 OK 0x1.4064d55555555p21 0x1.5e2a74edb9fbep19 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4ap5 0x0.0p0 F +REG esri:102691 1 OK 0x1.ba857c0cb018cp20 -0x1.5b4e91246466p15 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102691 2 OK 0x1.a386eca4529e4p21 -0x1.5b4e91246466p15 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102691 3 OK 0x1.ca0f9eb35c36p20 0x1.70d9d960ae9e2p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:102691 4 OK 0x1.9bc1db50fc8fap21 0x1.70d9d960ae9e2p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:102692 0 OK 0x1.4064d55555555p21 0x1.56b35d2f5200bp19 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG esri:102692 1 OK 0x1.c2eee7a744759p20 -0x1.e8ab43627cb1p14 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccc1p5 0x0.0p0 F +REG esri:102692 2 OK 0x1.9f5236d7086fep21 -0x1.e8ab43627cb1p14 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccc1p5 0x0.0p0 F +REG esri:102692 3 OK 0x1.d089ec96a4c8p20 0x1.65310f83da02p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG esri:102692 4 OK 0x1.9884b45f5846ap21 0x1.65310f83da02p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG esri:102693 0 OK 0x1.4064d55555555p21 0x1.657a38f2afe3p19 0x0.0p0 -0x1.78p6 0x1.60dddddddddd1p5 0x0.0p0 F +REG esri:102693 1 OK 0x1.b36cbd2decbddp20 -0x1.d62fdfd768038p15 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220fp5 0x0.0p0 F +REG esri:102693 2 OK 0x1.a7134c13b44c3p21 -0x1.d62fdfd767db8p15 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220fp5 0x0.0p0 F +REG esri:102693 3 OK 0x1.c25367e19ddd9p20 0x1.7bac03776e024p20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:102693 4 OK 0x1.9f9ff6b9dbbc4p21 0x1.7bac03776e02ep20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:102694 0 OK 0x1.e097400000001p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:102694 1 OK -0x1.c528da114b511p19 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102694 2 OK 0x1.6195d68452d45p21 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102694 3 OK -0x1.6d13c32e22509p19 0x1.c81a512182c13p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102694 4 OK 0x1.4b9090cb88943p21 0x1.c81a512182c13p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102695 0 OK 0x1.18583aaaaaaabp21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:102695 1 OK 0x1.7741a132beb34p18 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102695 2 OK 0x1.00e420977ebf8p22 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:102695 3 OK 0x1.13b5e77c885a2p19 0x1.c81a512182c13p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102695 4 OK 0x1.ebc2fb76333eep21 0x1.c81a512182c13p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:102696 0 OK 0x1.907e0aaaaaaabp19 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:102696 1 OK -0x1.10c30e82f69cep20 -0x1.af1459db611e1p20 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102696 2 OK 0x1.50a08c96d0a3cp21 -0x1.af1459db611e1p20 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102696 3 OK -0x1.b10591857fe29p19 0x1.cb39ace085a64p20 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102696 4 OK 0x1.348069b6b54ep21 0x1.cb39ace085a64p20 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102697 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:102697 1 OK -0x1.221024b6851d4p18 -0x1.af1459db611e1p20 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102697 2 OK 0x1.b4c00f417b4e8p21 -0x1.af1459db611e1p20 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:102697 3 OK -0x1.043c36d6a9bcp16 0x1.cb39ace085a64p20 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102697 4 OK 0x1.989fec615ff8cp21 0x1.cb39ace085a64p20 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:102698 0 OK 0x1.546b22aaaaaabp21 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG esri:102698 1 OK 0x1.9ef41f988be64p19 -0x1.aee9eb5cf8c0ep20 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:102698 2 OK 0x1.208c9eb7992dep22 -0x1.aee9eb5cf8c0ep20 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:102698 3 OK 0x1.086c45210ea34p20 0x1.cb674607f1c1ap20 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:102698 4 OK 0x1.125011626701ep22 0x1.cb674607f1c1ap20 0x0.0p0 -0x1.6139e6ce2bc87p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:102700 0 OK 0x1.e097400000003p20 0x1.a6c885a515915p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG esri:102700 1 OK 0x1.3ca7d3436edcp16 -0x1.7eb5f7059ddffp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffeep5 0x0.0p0 F +REG esri:102700 2 OK 0x1.d6b20165e489cp21 -0x1.7eb5f7059ddd7p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffefp5 0x0.0p0 F +REG esri:102700 3 OK 0x1.79b7687eed298p18 0x1.45d900a7db585p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:102700 4 OK 0x1.b16052f0225b6p21 0x1.45d900a7db585p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:102704 0 OK 0x1.907e0aaaaaaaep20 0x1.199c3402171ap19 0x0.0p0 -0x1.9p6 0x1.4b55555555542p5 0x0.0p0 F +REG esri:102704 1 OK 0x1.a0b616df9c1d4p18 -0x1.0b47fd2e57139p19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe2p5 0x0.0p0 F +REG esri:102704 2 OK 0x1.5c6747ceb7274p21 -0x1.0b47fd2e57139p19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe2p5 0x0.0p0 F +REG esri:102704 3 OK 0x1.07608efa109cep19 0x1.ad3050594afe7p20 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102704 4 OK 0x1.4ea5e6ec2683ap21 0x1.ad3050594afe7p20 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102707 0 OK 0x1.4064d55555556p19 0x1.907e0aaaaaaabp24 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG esri:102707 1 OK -0x1.37aeca05be48p20 0x1.758464046aeep24 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102707 2 OK 0x1.3c09cfad89cf4p21 0x1.758464046aeep24 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102707 3 OK -0x1.01a6b768df889p20 0x1.ad2872c48f1b8p24 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102707 4 OK 0x1.2105c65f1a6f7p21 0x1.ad2872c48f1b8p24 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102708 0 OK 0x1.907e0aaaaaaaep20 0x1.2c5e880000001p24 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG esri:102708 1 OK -0x1.1d8ca816f91f4p18 0x1.1164e159c0436p24 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102708 2 OK 0x1.b42f9fad89cecp21 0x1.1164e159c0436p24 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:102708 3 OK -0x1.15b1768df886p16 0x1.4908f019e470ep24 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102708 4 OK 0x1.992b965f1a6f1p21 0x1.4908f019e470ep24 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102709 0 OK 0x1.4064d55555555p21 0x1.907e0aaaaaaabp23 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG esri:102709 1 OK 0x1.51d0ebf4836fep19 0x1.5a8abd5e2b316p23 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083ep4 0x0.0p0 F +REG esri:102709 2 OK 0x1.162ab7d6c4e75p22 0x1.5a8abd5e2b316p23 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083ep4 0x0.0p0 F +REG esri:102709 3 OK 0x1.bde1112e40eecp19 0x1.c9d2dade738c6p23 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102709 4 OK 0x1.08a8b32f8d378p22 0x1.c9d2dade738c6p23 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:102710 0 OK 0x1.e097400000001p19 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG esri:102710 1 OK -0x1.e09f63561dc07p19 -0x1.ab4f517e54969p20 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102710 2 OK 0x1.687378d5876fap21 -0x1.ab4f517e5496ap20 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102710 3 OK -0x1.51c0d7dd94c2fp19 0x1.cef4092b3783bp20 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102710 4 OK 0x1.44bbd5f765305p21 0x1.cef4092b3783ap20 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102711 0 OK 0x1.e097400000001p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:102711 1 OK -0x1.64165d1827b3ap20 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102711 2 OK 0x1.2a30fe8c13d9dp21 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102711 3 OK -0x1.255c90ab4fb68p20 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102711 4 OK 0x1.0ad41855a7db4p21 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102712 0 OK 0x1.0853300000001p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:102712 1 OK -0x1.5012ec9613714p20 -0x1.b1583116d0a83p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102712 2 OK 0x1.2c330e4b09b8bp21 -0x1.b1583116d0a83p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102712 3 OK -0x1.214b93d69fd5ap20 0x1.c8cbc93457fp20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102712 4 OK 0x1.14cf61eb4feaep21 0x1.c8cbc93457fp20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102713 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:102713 1 OK -0x1.0ef596de95ab4p18 -0x1.b157317808223p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102713 2 OK 0x1.b25cbd867d604p21 -0x1.b157317808223p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102713 3 OK -0x1.4f628902f2cp16 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102713 4 OK 0x1.9af91ef2c240ep21 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102714 0 OK 0x1.4c689d5555555p21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:102714 1 OK 0x1.892781227dcfep19 -0x1.b159144e9f583p20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102714 2 OK 0x1.1b43ad31059b5p22 -0x1.b159144e9f583p20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:102714 3 OK 0x1.e6b663af993a4p19 0x1.c8ccb8b80cbb5p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102714 4 OK 0x1.0f91d0df622ep22 0x1.c8ccb8b80cbb5p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:102715 0 OK 0x1.e097400000001p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:102715 1 OK -0x1.64165d1827b3ap20 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102715 2 OK 0x1.2a30fe8c13d9dp21 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:102715 3 OK -0x1.255c90ab4fb68p20 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102715 4 OK 0x1.0ad41855a7db4p21 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:102716 0 OK 0x1.907e0aaaaaaabp19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:102716 1 OK -0x1.1556c7ad8fd98p20 -0x1.acd32be826247p20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102716 2 OK 0x1.52ea692c1d421p21 -0x1.acd32be826247p20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102716 3 OK -0x1.a7e32d08515abp19 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102716 4 OK 0x1.3237d09769acp21 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102717 0 OK 0x1.18583aaaaaaadp20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:102717 1 OK -0x1.8a7b24b07508p19 -0x1.acd32be826247p20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102717 2 OK 0x1.7af703d6c7ecdp21 -0x1.acd32be826247p20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:102717 3 OK -0x1.07b0c25da6afcp19 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102717 4 OK 0x1.5a446b421456cp21 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:102718 0 OK 0x1.e097400000001p19 0x1.34584a46de4cdp17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG esri:102718 1 OK 0x1.2b56a357b7e0ep19 -0x1.8dc7734d329b7p17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccb1p5 0x0.0p0 F +REG esri:102718 2 OK 0x1.4aebee54240fap20 -0x1.8dc7734d329b7p17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccb1p5 0x0.0p0 F +REG esri:102718 3 OK 0x1.30b017f7ec661p19 0x1.0051d9cc95a2ap19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:102718 4 OK 0x1.483f340409cdp20 0x1.0051d9cc95a2ap19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:102719 0 OK 0x1.e848000ab7c61p20 0x1.ad7545588e6ebp18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7cp5 0x0.0p0 F +REG esri:102719 1 OK 0x1.0a3d4a403a89ap20 -0x1.a06a7c3fa75bcp18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555518p5 0x0.0p0 F +REG esri:102719 2 OK 0x1.63295aea9a80bp21 -0x1.a06a7c3fa75bcp18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555518p5 0x0.0p0 F +REG esri:102719 3 OK 0x1.16ff5d4a6af99p20 0x1.4547a9e7a345dp20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdcp5 0x0.0p0 F +REG esri:102719 4 OK 0x1.5cc851658248cp21 0x1.4547a9e7a345dp20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdcp5 0x0.0p0 F +REG esri:102720 0 OK 0x1.e097400000003p20 0x1.34b83adf13a48p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61fp5 0x0.0p0 F +REG esri:102720 1 OK 0x1.409c77d41fd96p20 -0x1.2a05a5a952817p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:102720 2 OK 0x1.40490415f013fp21 -0x1.2a05a5a952817p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:102720 3 OK 0x1.4af87597fe1d4p20 0x1.d42e0c92d84e1p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:102720 4 OK 0x1.3b1b053400f2p21 0x1.d42e0c92d84e1p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:102721 0 OK 0x1.e097400000003p20 0x1.437deb0c89d15p18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG esri:102721 1 OK 0x1.38eb3ef400bc8p20 -0x1.384299e0eb648p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:102721 2 OK 0x1.4421a085ffa26p21 -0x1.384299e0eb648p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG esri:102721 3 OK 0x1.43cd4e2815adbp20 0x1.ea98c1353746dp19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:102721 4 OK 0x1.3eb098ebf529cp21 0x1.ea98c1353746dp19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:102722 0 OK 0x1.e097400000003p20 0x1.69b6e7707a9ffp18 0x0.0p0 -0x1.4ap6 0x1.457777777776p5 0x0.0p0 F +REG esri:102722 1 OK 0x1.258157aea187cp20 -0x1.5e4d1210719d1p18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333314p5 0x0.0p0 F +REG esri:102722 2 OK 0x1.4dd69428af3bdp21 -0x1.5e4d1210719d1p18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333314p5 0x0.0p0 F +REG esri:102722 3 OK 0x1.30a04e375c57ep20 0x1.12091514d80e4p20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbacp5 0x0.0p0 F +REG esri:102722 4 OK 0x1.484718e451d3dp21 0x1.12091514d80e4p20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbacp5 0x0.0p0 F +REG esri:102723 0 OK 0x1.e097400000003p20 0x1.699b9c3b7e559p18 0x0.0p0 -0x1.4ap6 0x1.3822222222204p5 0x0.0p0 F +REG esri:102723 1 OK 0x1.25d72ef511be9p20 -0x1.5edf5422de1f4p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:102723 2 OK 0x1.4daba88577206p21 -0x1.5edf5422de1f4p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:102723 3 OK 0x1.30523c7b25077p20 0x1.11ce460665cc8p20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG esri:102723 4 OK 0x1.486e21c26d7cp21 0x1.11ce460665cc8p20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG esri:102724 0 OK 0x1.e097400000003p20 0x1.3a030d3f27169p18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG esri:102724 1 OK 0x1.3f60bce6c66c6p20 -0x1.32d2652c235a7p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebcp5 0x0.0p0 F +REG esri:102724 2 OK 0x1.40e6e18c9ccap21 -0x1.32d2652c235a7p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebcp5 0x0.0p0 F +REG esri:102724 3 OK 0x1.466e4a61d6407p20 0x1.da8d3177bcce1p19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:102724 4 OK 0x1.3d601acf14ep21 0x1.da8d3177bcce1p19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:102725 0 OK 0x1.e097400000003p20 0x1.519f1c006077dp18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG esri:102725 1 OK 0x1.332c99d21eeep20 -0x1.49c9fd9e63856p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d6p5 0x0.0p0 F +REG esri:102725 2 OK 0x1.4700f316f0893p21 -0x1.49c9fd9e63856p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d6p5 0x0.0p0 F +REG esri:102725 3 OK 0x1.3addbc4eed52ep20 0x1.fe4a15bf17bf8p19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:102725 4 OK 0x1.432861d88956cp21 0x1.fe4a15bf17bf8p19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:102726 0 OK 0x1.f49d8d5555556p22 0x1.9f5d3378b70f9p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102726 1 OK 0x1.be6b9e7030d15p22 -0x1.8dd65ceccf52fp18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53fffffffffecp5 0x0.0p0 F +REG esri:102726 2 OK 0x1.1567be1d3cecbp23 -0x1.8dd65ceccf52fp18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53fffffffffecp5 0x0.0p0 F +REG esri:102726 3 OK 0x1.c2a6373be83f6p22 0x1.3ba9ed61ae8c9p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:102726 4 OK 0x1.134a71b76135bp23 0x1.3ba9ed61ae8c9p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:102727 0 OK 0x1.2c5e880000001p22 0x1.9f37e670f9cedp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:102727 1 OK 0x1.eca45272e8522p21 -0x1.8eec15d4aba8ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG esri:102727 2 OK 0x1.626ae6c68bd71p22 -0x1.8eec15d4aba8ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe9p5 0x0.0p0 F +REG esri:102727 3 OK 0x1.f48794ba26ca1p21 0x1.3b4aa6d971086p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554ap5 0x0.0p0 F +REG esri:102727 4 OK 0x1.5e7945a2ec9b2p22 0x1.3b4aa6d971086p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554ap5 0x0.0p0 F +REG esri:102728 0 OK 0x1.e097400000003p20 0x1.3d4353fa5fbfap18 0x0.0p0 -0x1.37p6 0x1.487777777776p5 0x0.0p0 F +REG esri:102728 1 OK 0x1.3d0a98c7262b2p20 -0x1.3463408d0b9b6p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333315p5 0x0.0p0 F +REG esri:102728 2 OK 0x1.4211f39c6ceaap21 -0x1.3463408d0b9b6p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333315p5 0x0.0p0 F +REG esri:102728 3 OK 0x1.45b47e1aeae0ep20 0x1.e030c687b6f36p19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbadp5 0x0.0p0 F +REG esri:102728 4 OK 0x1.3dbd00f28a8fcp21 0x1.e030c687b6f36p19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbadp5 0x0.0p0 F +REG esri:102729 0 OK 0x1.e097400000003p20 0x1.228706283a7dap18 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG esri:102729 1 OK 0x1.4b41287d3887p20 -0x1.1b56c665c812bp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222205p5 0x0.0p0 F +REG esri:102729 2 OK 0x1.3af6abc163bcbp21 -0x1.1b56c665c812bp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222205p5 0x0.0p0 F +REG esri:102729 3 OK 0x1.5248e02a502bap20 0x1.b74b291d3d9e2p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG esri:102729 4 OK 0x1.3772cfead7ea6p21 0x1.b74b291d3d9e2p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG esri:102730 0 OK 0x1.4064d55555556p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG esri:102730 1 OK -0x1.8eca38306bb12p20 -0x1.ac347fd1b68f5p20 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:102730 2 OK 0x1.177e516d8b2e7p21 -0x1.ac347fd1b68f4p20 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:102730 3 OK -0x1.4ad4cabfdbf58p20 0x1.ce22651ba610dp20 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:102730 4 OK 0x1.eb07356a86a12p20 0x1.ce22651ba610ep20 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:102733 0 OK 0x1.e847c00000003p20 0x1.0a7b0697bcc55p19 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa73p5 0x0.0p0 F +REG esri:102733 1 OK 0x1.a6b7c30644e7cp19 -0x1.0103efca09a7p19 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554bfp4 0x0.0p0 F +REG esri:102733 2 OK 0x1.7e99cf3e6ec64p21 -0x1.0103efca09a7p19 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554bfp4 0x0.0p0 F +REG esri:102733 3 OK 0x1.cbc25ec8bfeccp19 0x1.9456a5d840bd6p20 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG esri:102733 4 OK 0x1.7557284dd005p21 0x1.9456a5d840bd6p20 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG esri:102734 0 OK 0x1.e097400000003p20 0x1.495377ea606a2p18 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG esri:102734 1 OK 0x1.361934b47e737p20 -0x1.3e68cdb307de2p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444437p5 0x0.0p0 F +REG esri:102734 2 OK 0x1.458aa5a5c0c6p21 -0x1.3e68cdb307de2p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444437p5 0x0.0p0 F +REG esri:102734 3 OK 0x1.40b260ebae5d3p20 0x1.f337d7a6095a9p19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:102734 4 OK 0x1.403e0f8a28d13p21 0x1.f337d7a6095a9p19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:102735 0 OK 0x1.e097400000003p20 0x1.6fcae86be05ffp18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeee2p5 0x0.0p0 F +REG esri:102735 1 OK 0x1.21c83698cc14fp20 -0x1.62cf2cd232ef1p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666654p5 0x0.0p0 F +REG esri:102735 2 OK 0x1.4fb324b399f5cp21 -0x1.62cf2cd232ef1p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666654p5 0x0.0p0 F +REG esri:102735 3 OK 0x1.2e5f0748dbcb6p20 0x1.16f406e89be66p20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102735 4 OK 0x1.4967bc5b921a8p21 0x1.16f406e89be66p20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:102736 0 OK 0x1.e097400000003p20 0x1.7249af14fd647p18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG esri:102736 1 OK 0x1.21cff166c8ddp20 -0x1.686fc945bcc3ap18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:102736 2 OK 0x1.4faf474c9b924p21 -0x1.686fc945bcc3ap18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:102736 3 OK 0x1.2b7ae3b3fa78p20 0x1.181e65e2f758ap20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa85p5 0x0.0p0 F +REG esri:102736 4 OK 0x1.4ad9ce2602c4ap21 0x1.181e65e2f758ap20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa85p5 0x0.0p0 F +REG esri:102737 0 OK 0x1.4064d55555556p19 0x1.c0fe8fdbdfd98p21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG esri:102737 1 OK -0x1.3f2832a1167b4p17 0x1.61539a702f20ap21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444408p5 0x0.0p0 F +REG esri:102737 2 OK 0x1.6849dba97823cp20 0x1.61539a702f20ap21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG esri:102737 3 OK -0x1.d6bce3c8b1208p16 0x1.11a73480b5fb4p22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:102737 4 OK 0x1.5dd0a391e0667p20 0x1.11a73480b5fb4p22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:102738 0 OK 0x1.e097400000003p20 0x1.aa07448ec8708p22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG esri:102738 1 OK 0x1.0e08d221ed16p20 0x1.77a266cd78e04p22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:102738 2 OK 0x1.5992d6ef09753p21 0x1.77a266cd78e04p22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:102738 3 OK 0x1.18ae070a39688p20 0x1.ddc50c434d9a2p22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:102738 4 OK 0x1.54403c7ae34bfp21 0x1.ddc50c434d9a2p22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:102739 0 OK 0x1.18583aaaaaaabp21 0x1.38abba7c13554p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG esri:102739 1 OK 0x1.66573f1e1aecdp20 0x1.205b8ceeb4adfp23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:102739 2 OK 0x1.7d84d5c647df8p21 0x1.205b8ceeb4adfp23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:102739 3 OK 0x1.6f78cd5ba1388p20 0x1.518fea6f3bd32p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:102739 4 OK 0x1.78f40ea784b9bp21 0x1.518fea6f3bd32p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:102740 0 OK 0x1.e097400000003p20 0x1.9e15d9962a89ep23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4fp4 0x0.0p0 F +REG esri:102740 1 OK 0x1.00cc87766a51ep20 0x1.833abe4ca70b6p23 0x0.0p0 -0x1.97361161034aep6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:102740 2 OK 0x1.6030fc44cad6ap21 0x1.833abe4ca70b4p23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbaf4p4 0x0.0p0 F +REG esri:102740 3 OK 0x1.0b39a79d764ddp20 0x1.b999bb2dc06fdp23 0x0.0p0 -0x1.97361161034aep6 0x1.f82222222219fp4 0x0.0p0 F +REG esri:102740 4 OK 0x1.5afa6c3144d8cp21 0x1.b999bb2dc06fap23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f82222222219bp4 0x0.0p0 F +REG esri:102741 0 OK 0x1.e097400000001p19 0x1.0050fa9040993p24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff47p4 0x0.0p0 F +REG esri:102741 1 OK 0x1.5a737b344955cp17 0x1.e8d4dcffbba95p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:102741 2 OK 0x1.b548d09976d68p20 0x1.e8d4dcffbba95p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:102741 3 OK 0x1.959b7d15aec18p17 0x1.0c736d9d6d493p24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:102741 4 OK 0x1.ade3d05d4a29p20 0x1.0c736d9d6d493p24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:102742 0 OK 0x1.907e0aaaaaaaep20 0x1.b0bc7a658f7bap21 0x0.0p0 -0x1.bep6 0x1.4877777777761p5 0x0.0p0 F +REG esri:102742 1 OK 0x1.0c2d55f27c2ccp20 0x1.70fa64a0239afp21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc8p5 0x0.0p0 F +REG esri:102742 2 OK 0x1.0a675fb16c948p21 0x1.70fa64a0239afp21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc8p5 0x0.0p0 F +REG esri:102742 3 OK 0x1.11e2b89aca271p20 0x1.f1f0137179245p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111111p5 0x0.0p0 F +REG esri:102742 4 OK 0x1.078cae5d45976p21 0x1.f1f0137179245p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111111p5 0x0.0p0 F +REG esri:102743 0 OK 0x1.907e0aaaaaaaep20 0x1.aa3e4bb763ac4p22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed5p5 0x0.0p0 F +REG esri:102743 1 OK 0x1.7593893b9ffc9p19 0x1.77a131b61f0fbp22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666646p5 0x0.0p0 F +REG esri:102743 2 OK 0x1.3319285bc2ab4p21 0x1.77a131b61f0fbp22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666646p5 0x0.0p0 F +REG esri:102743 3 OK 0x1.913c06bbb0c93p19 0x1.de99c6df2d2cp22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777765p5 0x0.0p0 F +REG esri:102743 4 OK 0x1.2c2f08fbbe782p21 0x1.de99c6df2d2cp22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777765p5 0x0.0p0 F +REG esri:102744 0 OK 0x1.907e0aaaaaaaep20 0x1.35b8c9df6e973p23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG esri:102744 1 OK 0x1.edaaf48d2fabcp19 0x1.233bb9f5ea37dp23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:102744 2 OK 0x1.15134d875ebf7p21 0x1.233bb9f5ea37dp23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:102744 3 OK 0x1.fb4045b96ebfdp19 0x1.48a3ab51d35a4p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG esri:102744 4 OK 0x1.11adf93c4efa7p21 0x1.48a3ab51d35a4p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG esri:102745 0 OK 0x1.907e0aaaaaaaep20 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG esri:102745 1 OK -0x1.4073a20775e5cp18 -0x1.ab4efd7a698f9p20 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102745 2 OK 0x1.b88c7eeb99682p21 -0x1.ab4efd7a698f8p20 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:102745 3 OK -0x1.15b61a247d36p15 0x1.cef3ae253f431p20 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102745 4 OK 0x1.94d4e3133ca02p21 0x1.cef3ae253f432p20 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:102746 0 OK 0x1.5e6e495555554p23 0x1.a1887170c5517p22 0x0.0p0 -0x1.3ap6 0x1.3377777777757p5 0x0.0p0 F +REG esri:102746 1 OK 0x1.4cf51970160fp23 0x1.7fd2a21f6db0ap22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:102746 2 OK 0x1.6fe7793a949b8p23 0x1.7fd2a21f6db0ap22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:102746 3 OK 0x1.4daf24ae47e08p23 0x1.c3fa9abbf1888p22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba3p5 0x0.0p0 F +REG esri:102746 4 OK 0x1.6f2d6dfc62cap23 0x1.c3fa9abbf1888p22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba3p5 0x0.0p0 F +REG esri:102747 0 OK 0x1.5e6e495555554p23 0x1.b4c9df255ad12p21 0x0.0p0 -0x1.3ap6 0x1.293333333331p5 0x0.0p0 F +REG esri:102747 1 OK 0x1.4bcff5cb1bbc4p23 0x1.6d000dc85f69p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f8p5 0x0.0p0 F +REG esri:102747 2 OK 0x1.710c9cdf8eee4p23 0x1.6d000dc85f69p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f8p5 0x0.0p0 F +REG esri:102747 3 OK 0x1.4c99ab858d8eap23 0x1.fe2bf53071a3ep21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444426p5 0x0.0p0 F +REG esri:102747 4 OK 0x1.7042e7251d1bep23 0x1.fe2bf53071a3ep21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444426p5 0x0.0p0 F +REG esri:102748 0 OK 0x1.907e0aaaaaaaep20 0x1.34b943da25dcp18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:102748 1 OK 0x1.e1046a52a31d1p19 -0x1.2a05dbbd41af4p18 0x0.0p0 -0x1.edab194698fc4p6 0x1.711111111110ap5 0x0.0p0 F +REG esri:102748 2 OK 0x1.183cf01601e48p21 -0x1.2a05dbbd41af4p18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:102748 3 OK 0x1.f5bf336323b34p19 0x1.d42f38a973c86p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc627p5 0x0.0p0 F +REG esri:102748 4 OK 0x1.130e3dd1e1beep21 0x1.d42f38a973c86p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc627p5 0x0.0p0 F +REG esri:102749 0 OK 0x1.907e0aaaaaaaep20 0x1.641db43fe1661p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG esri:102749 1 OK 0x1.aeba938b6eaap19 -0x1.5696ad3494d5p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102749 2 OK 0x1.24cf65c7cf006p21 -0x1.5696ad3494d5p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaa9fp5 0x0.0p0 F +REG esri:102749 3 OK 0x1.c8e23801db4e2p19 0x1.0e4ce207389b5p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:102749 4 OK 0x1.1e457caa33d76p21 0x1.0e4ce207389b5p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:102750 0 OK 0x1.e097400000003p20 0x1.373abe8baa891p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG esri:102750 1 OK 0x1.4071ade5988bep20 -0x1.2f340d393d6edp18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffddp5 0x0.0p0 F +REG esri:102750 2 OK 0x1.405e690d33ba4p21 -0x1.2f340d393d6edp18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffddp5 0x0.0p0 F +REG esri:102750 3 OK 0x1.4849917f14ad2p20 0x1.d6c21ef5506c4p19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:102750 4 OK 0x1.3c72774075a9ap21 0x1.d6c21ef5506c4p19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:102751 0 OK 0x1.e097400000003p20 0x1.4edb0661224aap18 0x0.0p0 -0x1.44p6 0x1.2f88888888866p5 0x0.0p0 F +REG esri:102751 1 OK 0x1.342a71c0862acp20 -0x1.460752e85b788p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774dp5 0x0.0p0 F +REG esri:102751 2 OK 0x1.4682071fbceadp21 -0x1.460752e85b788p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774dp5 0x0.0p0 F +REG esri:102751 3 OK 0x1.3ccb5e7f95feap20 0x1.fa986b97cb6a3p19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997dp5 0x0.0p0 F +REG esri:102751 4 OK 0x1.423190c03500ep21 0x1.fa986b97cb6a3p19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997dp5 0x0.0p0 F +REG esri:102752 0 OK 0x1.e097400000003p20 0x1.1ce0d17f7cab5p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb4p5 0x0.0p0 F +REG esri:102752 1 OK 0x1.4d9405f33b67p20 -0x1.1462814d34f37p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:102752 2 OK 0x1.39cd3d06624cbp21 -0x1.1462814d34f37p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:102752 3 OK 0x1.55d5a07b34e9cp20 0x1.af67f5201dfecp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:102752 4 OK 0x1.35ac6fc2658b5p21 0x1.af67f5201dfecp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:102753 0 OK 0x1.e097400000003p20 0x1.28adfc81f178p18 0x0.0p0 -0x1.68p6 0x1.655555555554bp5 0x0.0p0 F +REG esri:102753 1 OK 0x1.477bd35a7b7eep20 -0x1.1fe0500f2820bp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:102753 2 OK 0x1.3cd95652c240cp21 -0x1.1fe0500f2820bp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:102753 3 OK 0x1.500ba7b16b422p20 0x1.c143a7a70eb73p19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:102753 4 OK 0x1.38916c274a5f2p21 0x1.c143a7a70eb73p19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:102754 0 OK 0x1.e097400000003p20 0x1.6fca8cd604f55p18 0x0.0p0 -0x1.68p6 0x1.5844444444435p5 0x0.0p0 F +REG esri:102754 1 OK 0x1.21d65e6fa50bep20 -0x1.62f2a3777f0e4p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:102754 2 OK 0x1.4fac10c82d79cp21 -0x1.62f2a3777f0e4p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:102754 3 OK 0x1.2e4ecb4ca001bp20 0x1.16ea191559a78p20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:102754 4 OK 0x1.496fda59affeep21 0x1.16ea191559a78p20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:102755 0 OK 0x1.4064d55555556p19 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG esri:102755 1 OK -0x1.3df8f17d9a42bp20 -0x1.ac87f1346f616p20 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102755 2 OK 0x1.3f2ee36977cb8p21 -0x1.ac87f1346f617p20 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102755 3 OK -0x1.f6cfe9e0046aep19 0x1.cdc5f8a730513p20 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102755 4 OK 0x1.1de66522abc5p21 0x1.cdc5f8a730512p20 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102756 0 OK 0x1.4064d55555554p20 0x1.4064d55555556p18 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG esri:102756 1 OK -0x1.3b8d0da5df2e2p19 -0x1.5c6ebbdf1a0c2p20 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76613p5 0x0.0p0 F +REG esri:102756 2 OK 0x1.8f4818becd215p21 -0x1.5c6ebbdf1a0cp20 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102756 3 OK -0x1.6cd629155e284p18 0x1.0eef96fe42d34p21 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102756 4 OK 0x1.6dff9a78011abp21 0x1.0eef96fe42d34p21 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102757 0 OK 0x1.e097400000003p20 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG esri:102757 1 OK 0x1.35f1ebdd8968p13 -0x1.ac87f1346f616p20 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102757 2 OK 0x1.df614e142276cp21 -0x1.ac87f1346f616p20 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102757 3 OK 0x1.13f381954c804p18 0x1.cdc5f8a730513p20 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102757 4 OK 0x1.be18cfcd56702p21 0x1.cdc5f8a730513p20 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102758 0 OK 0x1.4064d55555555p21 0x1.4064d55555556p18 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG esri:102758 1 OK 0x1.453c9d04cb7a8p19 -0x1.5c6ebbdf1a0cp20 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:102758 2 OK 0x1.17bd41b4bbe5cp22 -0x1.5c6ebbdf1a0c2p20 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76613p5 0x0.0p0 F +REG esri:102758 3 OK 0x1.ca5e961ffb95p19 0x1.0eef96fe42d34p21 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102758 4 OK 0x1.0719029155e28p22 0x1.0eef96fe42d34p21 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:102761 0 OK 0x1.4064d55555556p19 0x1.759604c03d8bbp19 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222123p4 0x0.0p0 F +REG esri:102761 1 OK 0x1.19fa205c25f94p18 0x1.8994d2ffa8604p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.1222222222118p4 0x0.0p0 F +REG esri:102761 2 OK 0x1.f3cc9a7c97ae2p19 0x1.8994d2ffa8604p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.1222222222118p4 0x0.0p0 F +REG esri:102761 3 OK 0x1.1e0d7f40cebe8p18 0x1.13b5b11396424p20 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222115p4 0x0.0p0 F +REG esri:102761 4 OK 0x1.f1c2eb0a434b8p19 0x1.13b5b11396424p20 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222115p4 0x0.0p0 F +REG esri:102766 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.4064d55555555p17 0x1.4064d55555555p17 0x0.0p0 NaN NaN NaN F +REG esri:102766 1 OK -0x1.9d603c7f856b5p20 -0x1.92c7848690ef7p20 0x0.0p0 -0x1.2bb4c17c95964p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG esri:102766 2 OK 0x1.ed7971d4dac32p20 -0x1.92c7848690ef7p20 0x0.0p0 -0x1.1749f704af494p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG esri:102766 3 OK -0x1.8ab680757449bp20 0x1.ec0e71ea87da3p20 0x0.0p0 -0x1.2b4995e75e3c2p7 0x1.434355006168ap2 0x0.0p0 F +REG esri:102766 4 OK 0x1.dacfb5cac9a17p20 0x1.ec0e71ea87da3p20 0x0.0p0 -0x1.17b52299e6a36p7 0x1.434355006168ap2 0x0.0p0 F +REG esri:103300 0 OK 0x1.24f8019b90eaap17 0x1.1e25777e8c1f9p21 0x0.0p0 0x1.1784e6cbc3292p2 0x1.17aaaabdae4bap6 0x0.0p0 F +REG esri:103300 1 OK -0x1.313b9b9c0e0e2p21 0x1.5c6214a9087e6p20 0x0.0p0 -0x1.3a8542c83e86dp5 0x1.b755557b5c702p5 0x0.0p0 F +REG esri:103300 2 OK 0x1.55da9bcf802b7p21 0x1.5c6214a9087e4p20 0x0.0p0 0x1.80667c7b2f511p5 0x1.b755557b5c702p5 0x0.0p0 F +REG esri:103300 3 OK -0x1.a71d02f4b29c9p18 0x1.143af149a99dbp22 0x0.0p0 -0x1.3a8542c83e86cp5 0x1.53aaaabdae4bep6 0x0.0p0 F +REG esri:103300 4 OK 0x1.660a824821c38p19 0x1.143af149a99dbp22 0x0.0p0 0x1.80667c7b2f50fp5 0x1.53aaaabdae4bep6 0x0.0p0 F +REG esri:104000 0 OK -0x1.9p6 0x1.68p5 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG esri:104000 1 OK -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 F +REG esri:104000 2 OK -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 F +REG esri:104000 3 OK -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG esri:104000 4 OK -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG esri:104101 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104101 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104101 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104101 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104101 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104102 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104102 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104102 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104102 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104102 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104103 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104103 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104103 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104103 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104103 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104104 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104104 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104104 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104104 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104104 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104105 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104105 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104105 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104105 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104105 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104106 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104106 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104106 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104106 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104106 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104107 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104107 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104107 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104107 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104107 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104108 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104108 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104108 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104108 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104108 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104261 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104261 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104261 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104261 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104261 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104304 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104304 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104304 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104304 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104304 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104305 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:104305 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104305 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:104305 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:104305 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:2000 0 OK 0x1.86ap18 0x0.0p0 0x0.0p0 -0x1.fp5 0x0.0p0 0x0.0p0 T +REG esri:2000 1 OK -0x1.2e96895585988p17 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 -0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:2000 2 OK 0x1.d245a25561656p19 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 -0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:2000 3 OK -0x1.2e96895585988p17 0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:2000 4 OK 0x1.d245a25561656p19 0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:20002 0 OK 0x1.312dp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:20002 1 OK 0x1.dacddff11bc28p20 -0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e75p2 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20002 2 OK 0x1.74f31007721ecp21 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20002 3 OK 0x1.dacddff11bc28p20 0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e75p2 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20002 4 OK 0x1.74f31007721ecp21 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20003 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:20003 1 OK 0x1.6778eff88de14p21 -0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73ap3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20003 2 OK 0x1.ef051007721ecp21 -0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20003 3 OK 0x1.6778eff88de14p21 0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73ap3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20003 4 OK 0x1.ef051007721ecp21 0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20004 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:20004 1 OK 0x1.e18aeff88de14p21 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20004 2 OK 0x1.348b8803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20004 3 OK 0x1.e18aeff88de14p21 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20004 4 OK 0x1.348b8803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20005 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:20005 1 OK 0x1.2dce77fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20005 2 OK 0x1.71948803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20005 3 OK 0x1.2dce77fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20005 4 OK 0x1.71948803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20006 0 OK 0x1.8cba8p22 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:20006 1 OK 0x1.6ad777fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20006 2 OK 0x1.ae9d8803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20006 3 OK 0x1.6ad777fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20006 4 OK 0x1.ae9d8803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20007 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:20007 1 OK 0x1.a7e077fc46f0bp22 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20007 2 OK 0x1.eba68803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20007 3 OK 0x1.a7e077fc46f0bp22 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20007 4 OK 0x1.eba68803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20008 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:20008 1 OK 0x1.e4e977fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20008 2 OK 0x1.1457c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20008 3 OK 0x1.e4e977fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20008 4 OK 0x1.1457c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20009 0 OK 0x1.21eacp23 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:20009 1 OK 0x1.10f93bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20009 2 OK 0x1.32dc4401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20009 3 OK 0x1.10f93bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20009 4 OK 0x1.32dc4401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2001 0 OK 0x1.86da04fafd2efp18 -0x1.1bdbb68ca4aafp6 -0x1.6ad67c1cp2 -0x1.fp5 0x1.2f74bf1dcfcafp-62 -0x1.0p-29 T +REG esri:2001 1 OK -0x1.2e1d5f741b0a4p17 -0x1.0ee55e4facda7p19 -0x1.1cd942ae4p4 -0x1.0bffffffe2072p6 -0x1.3fffffffea5b9p2 -0x1.2p-27 F +REG esri:2001 2 OK 0x1.d2615d35611b1p19 -0x1.0ee55e512dd42p19 0x1.68427be84p4 -0x1.c80000003c3e2p5 -0x1.3fffffffea3bep2 0x1.0p-27 F +REG esri:2001 3 OK -0x1.2e1de9ef2c74cp17 0x1.0ed3a0bb2c432p19 -0x1.e2e2ad62cp4 -0x1.0bffffffe206cp6 0x1.3fffffffea5dp2 -0x1.2p-27 F +REG esri:2001 4 OK 0x1.d2617fdb8697ep19 0x1.0ed3a0bcad0bap19 0x1.4472c79ap3 -0x1.c80000003c3eep5 0x1.3fffffffea3d3p2 0x1.2p-27 F +REG esri:20010 0 OK 0x1.406f4p23 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:20010 1 OK 0x1.2f7dbbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20010 2 OK 0x1.5160c401dc87bp23 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20010 3 OK 0x1.2f7dbbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20010 4 OK 0x1.5160c401dc87bp23 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20011 0 OK 0x1.5ef3cp23 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:20011 1 OK 0x1.4e023bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20011 2 OK 0x1.6fe54401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20011 3 OK 0x1.4e023bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20011 4 OK 0x1.6fe54401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20012 0 OK 0x1.7d784p23 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:20012 1 OK 0x1.6c86bbfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20012 2 OK 0x1.8e69c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20012 3 OK 0x1.6c86bbfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20012 4 OK 0x1.8e69c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20013 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:20013 1 OK 0x1.8b0b3bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20013 2 OK 0x1.acee4401dc87bp23 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20013 3 OK 0x1.8b0b3bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20013 4 OK 0x1.acee4401dc87bp23 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20014 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:20014 1 OK 0x1.a98fbbfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20014 2 OK 0x1.cb72c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20014 3 OK 0x1.a98fbbfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20014 4 OK 0x1.cb72c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20015 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:20015 1 OK 0x1.c8143bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20015 2 OK 0x1.e9f74401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20015 3 OK 0x1.c8143bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20015 4 OK 0x1.e9f74401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20016 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:20016 1 OK 0x1.e698bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20016 2 OK 0x1.043de200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20016 3 OK 0x1.e698bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20016 4 OK 0x1.043de200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20017 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:20017 1 OK 0x1.028e9dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20017 2 OK 0x1.13802200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20017 3 OK 0x1.028e9dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20017 4 OK 0x1.13802200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20018 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:20018 1 OK 0x1.11d0ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20018 2 OK 0x1.22c26200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20018 3 OK 0x1.11d0ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20018 4 OK 0x1.22c26200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20019 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:20019 1 OK 0x1.21131dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20019 2 OK 0x1.3204a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20019 3 OK 0x1.21131dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20019 4 OK 0x1.3204a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2002 0 OK 0x1.85afb1d7d0ebcp18 -0x1.0bdc0c13cad12p9 0x1.30ce06fbcp7 -0x1.fp5 0x0.0p0 0x1.0p-30 T +REG esri:2002 1 OK -0x1.30696762c774p17 -0x1.0f1dba144de34p19 0x1.1b411b9178p8 -0x1.0bffffffe1a6ep6 -0x1.3fffffffea063p2 0x1.0p-25 F +REG esri:2002 2 OK 0x1.d1ca0a8ef0e6ep19 -0x1.0f1dba0e0bcaep19 0x1.d10b081acp6 -0x1.c80000003b75fp5 -0x1.3fffffffea89dp2 -0x1.fp-26 F +REG esri:2002 3 OK -0x1.306d7efa4e26cp17 0x1.0e97cd323ee33p19 0x1.7ba2f556e8p7 -0x1.0bffffffe1a3bp6 0x1.3fffffffea104p2 0x1.0p-25 F +REG esri:2002 4 OK 0x1.d1cb0f8e189f5p19 0x1.0e97cd2c02d0cp19 0x1.6d27fb88p4 -0x1.c80000003b7c1p5 0x1.3fffffffea939p2 -0x1.ep-26 F +REG esri:20020 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:20020 1 OK 0x1.30555dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20020 2 OK 0x1.4146e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20020 3 OK 0x1.30555dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20020 4 OK 0x1.4146e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20021 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:20021 1 OK 0x1.3f979dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20021 2 OK 0x1.50892200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20021 3 OK 0x1.3f979dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20021 4 OK 0x1.50892200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20022 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:20022 1 OK 0x1.4ed9ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20022 2 OK 0x1.5fcb6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20022 3 OK 0x1.4ed9ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20022 4 OK 0x1.5fcb6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20023 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:20023 1 OK 0x1.5e1c1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20023 2 OK 0x1.6f0da200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20023 3 OK 0x1.5e1c1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20023 4 OK 0x1.6f0da200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20024 0 OK 0x1.75d72p24 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:20024 1 OK 0x1.6d5e5dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20024 2 OK 0x1.7e4fe200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20024 3 OK 0x1.6d5e5dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20024 4 OK 0x1.7e4fe200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20025 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:20025 1 OK 0x1.7ca09dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20025 2 OK 0x1.8d922200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20025 3 OK 0x1.7ca09dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20025 4 OK 0x1.8d922200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20026 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:20026 1 OK 0x1.8be2ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20026 2 OK 0x1.9cd46200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20026 3 OK 0x1.8be2ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20026 4 OK 0x1.9cd46200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20027 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:20027 1 OK 0x1.9b251dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20027 2 OK 0x1.ac16a200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20027 3 OK 0x1.9b251dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20027 4 OK 0x1.ac16a200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20028 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:20028 1 OK 0x1.aa675dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20028 2 OK 0x1.bb58e200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20028 3 OK 0x1.aa675dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20028 4 OK 0x1.bb58e200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20029 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:20029 1 OK 0x1.b9a99dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20029 2 OK 0x1.ca9b2200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20029 3 OK 0x1.b9a99dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20029 4 OK 0x1.ca9b2200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2003 0 OK 0x1.86770bd2e5fb4p18 -0x1.73cfbde821603p6 0x1.55ef138cep5 -0x1.fp5 0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG esri:2003 1 OK -0x1.2ee123d42033p17 -0x1.0ee795ebf04dp19 0x1.0a3089b1dp6 -0x1.0bffffffe1e7p6 -0x1.3fffffffea408p2 0x1.cp-28 F +REG esri:2003 2 OK 0x1.d22f5486ae29bp19 -0x1.0ee795eae0478p19 0x1.30b335eeep5 -0x1.c80000003bfc4p5 -0x1.3fffffffea56ep2 -0x1.8p-29 F +REG esri:2003 3 OK -0x1.2ee1d957f315cp17 0x1.0ed05922f08c1p19 0x1.92ae451dep5 -0x1.0bffffffe1e67p6 0x1.3fffffffea425p2 0x1.4p-28 F +REG esri:2003 4 OK 0x1.d22f81e0d040cp19 0x1.0ed05921e0b42p19 0x1.5e0082f48p4 -0x1.c80000003bfd5p5 0x1.3fffffffea58ap2 -0x1.8p-28 F +REG esri:20030 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:20030 1 OK 0x1.c8ebddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20030 2 OK 0x1.d9dd6200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20030 3 OK 0x1.c8ebddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20030 4 OK 0x1.d9dd6200ee43dp24 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20031 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:20031 1 OK 0x1.d82e1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20031 2 OK 0x1.e91fa200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20031 3 OK 0x1.d82e1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20031 4 OK 0x1.e91fa200ee43dp24 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20032 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:20032 1 OK 0x1.e7705dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20032 2 OK 0x1.f861e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20032 3 OK 0x1.e7705dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20032 4 OK 0x1.f861e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2004 0 OK 0x1.864f7f9fdbf9ep18 -0x1.6ccf76e505c4fp8 0x1.eca7b760bp6 -0x1.fp5 -0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG esri:2004 1 OK -0x1.2f2bb5f85aebp17 -0x1.0f08af285bb2dp19 0x1.6f9d91d9b8p7 -0x1.0bffffffe1db2p6 -0x1.3fffffffea33cp2 0x1.0p-27 F +REG esri:2004 2 OK 0x1.d21a6cb0cc1c6p19 -0x1.0f08af2643a24p19 0x1.ff761cf55p6 -0x1.c80000003bdfcp5 -0x1.3fffffffea5fcp2 -0x1.6p-27 F +REG esri:2004 3 OK -0x1.2f2e7e8ae04c4p17 0x1.0ead7c11afc8ap19 0x1.e0b80edb5p6 -0x1.0bffffffe1d9p6 0x1.3fffffffea3a8p2 0x1.cp-28 F +REG esri:2004 4 OK 0x1.d21b1ea0cb0c3p19 0x1.0ead7c0f9917ep19 0x1.00f274d49p6 -0x1.c80000003be41p5 0x1.3fffffffea669p2 -0x1.ap-27 F +REG esri:2005 0 OK 0x1.86888c046ef7ep18 -0x1.d7c2b8d895fa9p7 0x1.69b6c9bf4p5 -0x1.fp5 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG esri:2005 1 OK -0x1.2ebd7c3a44f08p17 -0x1.0ef96c7c82403p19 0x1.2d89cbf6dp6 -0x1.0bffffffe1ed3p6 -0x1.3fffffffea443p2 0x1.8p-28 F +REG esri:2005 2 OK 0x1.d237eaf0a23adp19 -0x1.0ef96c7be662cp19 0x1.d8b10a318p5 -0x1.c80000003c06ep5 -0x1.3fffffffea50ep2 -0x1.0p-29 F +REG esri:2005 3 OK -0x1.2ebf48c9aee08p17 0x1.0ebe74a67b36bp19 0x1.11f2f6804p5 -0x1.0bffffffe1ebdp6 0x1.3fffffffea487p2 0x1.0p-29 F +REG esri:2005 4 OK 0x1.d2385e0a9275dp19 0x1.0ebe74a5df9b9p19 0x1.1f20628e4p4 -0x1.c80000003c09bp5 0x1.3fffffffea557p2 -0x1.0p-29 F +REG esri:2006 0 OK 0x1.86b1db8a1c81fp18 -0x1.27d943e4641c2p8 0x1.1b52cfb32p6 -0x1.fp5 0x0.0p0 0x1.0p-30 T +REG esri:2006 1 OK -0x1.2e6985a86fb34p17 -0x1.0f00a371467acp19 0x1.6ebac03c3p6 -0x1.0bffffffe1fb1p6 -0x1.3fffffffea4f2p2 -0x1.8p-29 F +REG esri:2006 2 OK 0x1.d24c3d0d76ce4p19 -0x1.0f00a371bd3ep19 0x1.a05e40fccp6 -0x1.c80000003c217p5 -0x1.3fffffffea452p2 0x1.8p-29 F +REG esri:2006 3 OK -0x1.2e6bc721b3424p17 0x1.0eb6adc20b2b9p19 0x1.40a7e0ed4p5 -0x1.0bffffffe1f95p6 0x1.3fffffffea547p2 -0x1.0p-28 F +REG esri:2006 4 OK 0x1.d24ccd753fb47p19 0x1.0eb6adc281afbp19 0x1.a3ef176c6p5 -0x1.c80000003c24fp5 0x1.3fffffffea4abp2 0x1.8p-29 F +REG esri:20062 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:20062 1 OK -0x1.af4401dc87afp15 -0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e76p2 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20062 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20062 3 OK -0x1.af4401dc87afp15 0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e76p2 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20062 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20063 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:20063 1 OK -0x1.af4401dc87aep15 -0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73cp3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20063 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20063 3 OK -0x1.af4401dc87aep15 0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73cp3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20063 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20064 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:20064 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20064 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20064 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20064 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20065 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:20065 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20065 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20065 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20065 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20066 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:20066 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20066 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20066 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20066 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20067 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:20067 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20067 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20067 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20067 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20068 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:20068 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20068 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20068 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20068 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20069 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:20069 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20069 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20069 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20069 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2007 0 OK 0x1.86ap18 0x0.0p0 0x0.0p0 -0x1.fp5 0x0.0p0 0x0.0p0 T +REG esri:2007 1 OK -0x1.2e96895585988p17 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 -0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:2007 2 OK 0x1.d245a25561656p19 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 -0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:2007 3 OK -0x1.2e96895585988p17 0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:2007 4 OK 0x1.d245a25561656p19 0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:20070 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:20070 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20070 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20070 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20070 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20071 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:20071 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20071 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20071 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20071 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20072 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:20072 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20072 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20072 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20072 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20073 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:20073 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20073 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20073 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20073 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20074 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:20074 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20074 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20074 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20074 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20075 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:20075 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20075 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20075 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20075 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20076 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:20076 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20076 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20076 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20076 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20077 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:20077 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20077 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20077 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20077 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20078 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:20078 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20078 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20078 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20078 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20079 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:20079 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20079 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20079 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20079 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2008 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG esri:2008 1 OK -0x1.e8f3aaf36b4bp17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e3ffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2008 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.940000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2008 3 OK -0x1.e8f3aaf36b4bp17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e3ffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2008 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.940000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:20080 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:20080 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20080 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20080 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20080 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20081 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:20081 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20081 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20081 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20081 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20082 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:20082 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20082 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20082 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20082 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20083 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:20083 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20083 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20083 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20083 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20084 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:20084 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20084 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20084 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20084 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20085 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:20085 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20085 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20085 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20085 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20086 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:20086 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20086 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20086 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20086 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20087 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:20087 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20087 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20087 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20087 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20088 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:20088 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20088 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20088 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20088 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:20089 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:20089 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20089 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20089 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20089 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2009 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG esri:2009 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2009 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2009 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2009 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:20090 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:20090 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20090 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20090 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20090 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20091 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:20091 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20091 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20091 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20091 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20092 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:20092 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20092 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20092 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:20092 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2010 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2010 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2010 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2010 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2010 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2011 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG esri:2011 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2011 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2011 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2011 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2012 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG esri:2012 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2012 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2012 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2012 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2013 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG esri:2013 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2dffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2013 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.060000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2013 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2dffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2013 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.060000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:20137 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:20137 1 OK -0x1.ad892fd89975p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20137 2 OK 0x1.0190497ec4cc2p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20137 3 OK -0x1.ad892fd89975p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20137 4 OK 0x1.0190497ec4cc2p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20138 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:20138 1 OK -0x1.ad892fd8998p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20138 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20138 3 OK -0x1.ad892fd8998p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20138 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2014 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG esri:2014 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2014 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2014 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2014 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2015 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG esri:2015 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2015 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2015 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2015 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2016 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG esri:2016 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2016 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2016 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2016 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2017 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG esri:2017 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2017 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2017 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.39ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2017 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.120000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2018 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG esri:2018 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2018 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2018 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.45ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2018 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.1e0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2019 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG esri:2019 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2019 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2019 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.51ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2019 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.2a0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2020 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.4ap6 0x0.0p0 0x0.0p0 T +REG esri:2020 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.5dffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2020 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.360000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2020 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.5dffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2020 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.360000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2021 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2021 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.57ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2021 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.300000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2021 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.57ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2021 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.300000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2022 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2022 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.63ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2022 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.3c0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2022 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.63ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2022 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.3c0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2023 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2023 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2023 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.480000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2023 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2023 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.480000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2024 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2024 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.7bffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2024 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.540000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2024 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.7bffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2024 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.540000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:20248 0 OK 0x1.e847fffffffd4p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.a400000000001p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20248 1 OK -0x1.fbecbbb4badcp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20248 2 OK 0x1.f82765dda5d38p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20248 3 OK -0x1.2fda3def324b8p16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG esri:20248 4 OK 0x1.0721a3def322fp20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20249 0 OK 0x1.e848000000042p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.bcp6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20249 1 OK -0x1.fbecbbb4ba5cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20249 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20249 3 OK -0x1.2fda3def32288p16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20249 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.4p4 0x0.0p0 F +REG esri:2025 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2025 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.87ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2025 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.600000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2025 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.87ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2025 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.600000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:20250 0 OK 0x1.e848p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.d4p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20250 1 OK -0x1.fbecbbb4ba9cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20250 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20250 3 OK -0x1.2fda3def323ap16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20250 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20251 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.ec00000000001p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20251 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20251 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20251 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20251 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20252 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.02p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20252 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20252 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20252 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20252 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20253 0 OK 0x1.e848p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.0ep7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20253 1 OK -0x1.fbecbbb4ba9cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20253 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20253 3 OK -0x1.2fda3def323ap16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20253 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20254 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.1ap7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20254 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20254 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20254 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20254 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20255 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.26p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20255 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20255 2 OK 0x1.f82765dda5d79p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20255 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20255 4 OK 0x1.0721a3def3251p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.4p4 0x0.0p0 F +REG esri:20256 0 OK 0x1.e848p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.32p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20256 1 OK -0x1.fbecbbb4ba9cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20256 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20256 3 OK -0x1.2fda3def323ap16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20256 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20257 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.3ep7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20257 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20257 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20257 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20257 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20258 0 OK 0x1.e847fffffffd4p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.4ap7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20258 1 OK -0x1.fbecbbb4bac6p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20258 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20258 3 OK -0x1.2fda3def32458p16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:20258 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2026 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2026 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.93ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2026 2 OK 0x1.a3e4eabcdad32p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6c0000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2026 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.93ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2026 4 OK 0x1.a3e4eabcdad32p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.6c0000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2027 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2027 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2027 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.6p6 -0x1.4p2 0x0.0p0 F +REG esri:2027 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2027 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.6p6 0x1.4p2 0x0.0p0 F +REG esri:2028 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2028 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.7p6 -0x1.4p2 0x0.0p0 F +REG esri:2028 2 OK 0x1.01900c6b20dc2p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.48p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2028 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.7p6 0x1.4p2 0x0.0p0 F +REG esri:2028 4 OK 0x1.01900c6b20dc2p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.48p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2029 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2029 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2029 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG esri:2029 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2029 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG esri:2030 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2030 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:2030 2 OK 0x1.01900c6b20dc2p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2030 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:2030 4 OK 0x1.01900c6b20dc2p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2031 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2031 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2031 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG esri:2031 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2031 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG esri:2032 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2032 1 OK -0x1.ad818d641b76p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:2032 2 OK 0x1.01900c6b20dc2p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2032 3 OK -0x1.ad818d641b76p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:2032 4 OK 0x1.01900c6b20dc2p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2033 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2033 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.28p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2033 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:2033 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.28p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2033 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:2034 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2034 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2034 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:2034 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2034 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:20348 0 OK 0x1.e847fffffffd4p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.a400000000001p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20348 1 OK -0x1.fbecbbb4badcp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20348 2 OK 0x1.f82765dda5d38p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20348 3 OK -0x1.2fda3def324b8p16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG esri:20348 4 OK 0x1.0721a3def322fp20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20349 0 OK 0x1.e848000000042p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.bcp6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20349 1 OK -0x1.fbecbbb4ba5cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20349 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20349 3 OK -0x1.2fda3def32288p16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20349 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.4p4 0x0.0p0 F +REG esri:2035 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2035 1 OK -0x1.ad818d641b6cp15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG esri:2035 2 OK 0x1.01900c6b20dc4p20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2035 3 OK -0x1.ad818d641b6cp15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG esri:2035 4 OK 0x1.01900c6b20dc4p20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:20350 0 OK 0x1.e848p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.d4p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20350 1 OK -0x1.fbecbbb4ba9cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20350 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20350 3 OK -0x1.2fda3def323ap16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20350 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20351 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.ec00000000001p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20351 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20351 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20351 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20351 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20352 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.02p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20352 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20352 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20352 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20352 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20353 0 OK 0x1.e848p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.0ep7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20353 1 OK -0x1.fbecbbb4ba9cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20353 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20353 3 OK -0x1.2fda3def323ap16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20353 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20354 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.1ap7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20354 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20354 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20354 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20354 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20355 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.26p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20355 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20355 2 OK 0x1.f82765dda5d79p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20355 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20355 4 OK 0x1.0721a3def3251p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.4p4 0x0.0p0 F +REG esri:20356 0 OK 0x1.e848p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.32p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20356 1 OK -0x1.fbecbbb4ba9cp14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20356 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20356 3 OK -0x1.2fda3def323ap16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20356 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20357 0 OK 0x1.e84800000002cp18 0x1.b9978ac40795ap22 0x0.0p0 0x1.3ep7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20357 1 OK -0x1.fbecbbb4ba7p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20357 2 OK 0x1.f82765dda5d63p19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20357 3 OK -0x1.2fda3def322fp16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20357 4 OK 0x1.0721a3def3246p20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.4p4 0x0.0p0 F +REG esri:20358 0 OK 0x1.e847fffffffd4p18 0x1.b9978ac40795ap22 0x0.0p0 0x1.4ap7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20358 1 OK -0x1.fbecbbb4bac6p14 0x1.97011e48ba0d8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20358 2 OK 0x1.f82765dda5d4ep19 0x1.97011e48ba0d8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:20358 3 OK -0x1.2fda3def32458p16 0x1.daca81cecb5e3p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:20358 4 OK 0x1.0721a3def323ap20 0x1.daca81cecb5e3p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2036 0 OK 0x1.312dp21 0x1.c9c38p22 0x0.0p0 -0x1.0ap6 0x1.73ffffffffffap5 0x0.0p0 T +REG esri:2036 1 OK 0x1.ce24f990ab45dp20 0x1.a9788be1b72edp22 0x0.0p0 -0x1.270e06f120d03p6 0x1.4bffffffffffp5 0x0.0p0 T +REG esri:2036 2 OK 0x1.7b478337aa5cfp21 0x1.a9788be1b72edp22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4bffffffffffp5 0x0.0p0 T +REG esri:2036 3 OK 0x1.e71082afdbc56p20 0x1.ed3306998dc17p22 0x0.0p0 -0x1.270e06f120d03p6 0x1.9bffffffffb3fp5 0x0.0p0 T +REG esri:2036 4 OK 0x1.6ed1bea8121d3p21 0x1.ed3306998dc17p22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9bffffffffb3fp5 0x0.0p0 T +REG esri:2037 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2037 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG esri:2037 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:2037 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG esri:2037 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:2038 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2038 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG esri:2038 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:2038 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG esri:2038 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:2039 0 OK 0x1.acc4cac083127p17 0x1.321b6c7ae147bp19 0x0.0p0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d13p4 0x0.0p0 F +REG esri:2039 1 OK -0x1.6563b114644e4p18 0x1.50e75920689fp16 0x0.0p0 0x1.d5359f29c4a3p4 0x1.abc013839acb4p4 0x0.0p0 F +REG esri:2039 2 OK 0x1.89143dea73b01p19 0x1.50e75920689fp16 0x0.0p0 0x1.48aae3fa5b8ccp5 0x1.abc013839acb5p4 0x0.0p0 F +REG esri:2039 3 OK -0x1.2aad5939fc19ap18 0x1.246836f608252p20 0x0.0p0 0x1.d5359f29f36fdp4 0x1.25e009c1a3699p5 0x0.0p0 F +REG esri:2039 4 OK 0x1.6bb911fd3f95cp19 0x1.246836f608252p20 0x0.0p0 0x1.48aae3fa44265p5 0x1.25e009c1a3699p5 0x0.0p0 F +REG esri:2040 0 OK 0x1.e83c6887eb3b3p18 -0x1.d2cfe32bb26b8p8 0x1.ef3236a3p3 -0x1.8000000000001p1 -0x1.2f74bf1dcfcaep-59 0x1.0p-30 T +REG esri:2040 1 OK -0x1.adc7b9bd064fp15 -0x1.0f1d8d8e42345p19 0x1.ef12cb2eap5 -0x1.0000000000002p3 -0x1.4000000000002p2 -0x1.0p-30 F +REG esri:2040 2 OK 0x1.018c720a95c57p20 -0x1.0f1d8d8df5206p19 0x1.aea324ba4p5 0x1.0000000000001p1 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2040 3 OK -0x1.add5f74b94fcp15 0x1.0ea8da953254fp19 -0x1.386c8252cp4 -0x1.0p3 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:2040 4 OK 0x1.018ce3f230f9cp20 0x1.0ea8da94e581cp19 -0x1.b94c3bc44p4 0x1.0000000000001p1 0x1.3fffffffffffep2 -0x1.8p-29 F +REG esri:2041 0 OK 0x1.e83c67ba2e06p18 -0x1.d29a274e6875bp8 0x1.e786b3aap3 -0x1.8000000000001p1 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG esri:2041 1 OK -0x1.adc7cba32e71p15 -0x1.0f1d87833987p19 0x1.ed0864f7ap5 -0x1.ffffffffffffdp2 -0x1.4p2 -0x1.0p-29 F +REG esri:2041 2 OK 0x1.018c7232e7aa6p20 -0x1.0f1d8782ec6ddp19 0x1.ac9446d54p5 0x1.0000000000001p1 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG esri:2041 3 OK -0x1.add6078e325cp15 0x1.0ea8e1f9041f2p19 -0x1.3beb5efccp4 -0x1.ffffffffffffep2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:2041 4 OK 0x1.018ce40d66c17p20 0x1.0ea8e1f8b746cp19 -0x1.bcd407c5p4 0x1.0000000000001p1 0x1.4000000000003p2 -0x1.8p-29 F +REG esri:2042 0 OK 0x1.e83fce153448bp18 -0x1.d2cfcf21949c5p8 0x1.39fd6822p4 -0x1.2000000000002p3 0x1.c72f1eacb7b03p-60 0x1.0p-30 T +REG esri:2042 1 OK -0x1.adabd4d11cf5p15 -0x1.0f1d81e360369p19 0x1.0349be634p6 -0x1.c000000000003p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:2042 2 OK 0x1.018d45abfce2p20 -0x1.0f1d81e329b78p19 0x1.d90586cdep5 -0x1.0000000000002p2 -0x1.4p2 -0x1.8p-29 F +REG esri:2042 3 OK -0x1.adba12471ce8p15 0x1.0ea8ceef48ccp19 -0x1.096af78d4p4 -0x1.c000000000003p3 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2042 4 OK 0x1.018db7943f59cp20 0x1.0ea8ceef127abp19 -0x1.648730388p4 -0x1.ffffffffffffep1 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:2043 0 OK 0x1.e83fcbae4e8dap18 -0x1.d29a13435a6b7p8 0x1.36326832cp4 -0x1.2p3 0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG esri:2043 1 OK -0x1.adabf362b876p15 -0x1.0f1d7bd673ebcp19 0x1.02496f0bap6 -0x1.c000000000001p3 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:2043 2 OK 0x1.018d456d15308p20 -0x1.0f1d7bd63d5cdp19 0x1.d6f78e00ep5 -0x1.ffffffffffffdp1 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:2043 3 OK -0x1.adba2f353aep15 0x1.0ea8d65137341p19 -0x1.0cd6451bcp4 -0x1.c000000000001p3 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:2043 4 OK 0x1.018db7483b1fcp20 0x1.0ea8d65100d3p19 -0x1.680d3210cp4 -0x1.0000000000002p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:20437 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:20437 1 OK -0x1.ada0e5629f7p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.1p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20437 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20437 3 OK -0x1.ada0e5629f7p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.1p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20437 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20438 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:20438 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20438 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.9p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20438 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20438 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.9p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20439 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:20439 1 OK -0x1.ada0e5629f69p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.7p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20439 2 OK 0x1.0191072b14fc8p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20439 3 OK -0x1.ada0e5629f69p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.7p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20439 4 OK 0x1.0191072b14fc8p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2044 0 OK 0x1.1a49730d22447p24 0x1.f31ee11f0532cp5 -0x1.f9c06fc6p2 0x1.a400000000002p6 0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG esri:2044 1 OK 0x1.11d0b941fe1b9p24 -0x1.0ef764730be01p19 -0x1.46fb44b28p3 0x1.900000001d51cp6 -0x1.3fffffffeae06p2 0x0.0p0 F +REG esri:2044 2 OK 0x1.22c22cd7ab153p24 -0x1.0ef76472c2952p19 -0x1.205f7739p4 0x1.b7ffffffe2b59p6 -0x1.3fffffffeae67p2 -0x1.8p-29 F +REG esri:2044 3 OK 0x1.11d0ba35958b1p24 0x1.0f06fd48bdef3p19 0x1.5059c1bp-1 0x1.900000001d518p6 0x1.3fffffffeadf5p2 0x0.0p0 F +REG esri:2044 4 OK 0x1.22c22be41db19p24 0x1.0f06fd48749bep19 -0x1.c97be316p2 0x1.b7ffffffe2b5fp6 0x1.3fffffffeae54p2 -0x1.0p-29 F +REG esri:2045 0 OK 0x1.298ba8d5a044p24 0x1.f31efc35cc79ep5 -0x1.a4c4fa85p3 0x1.bcp6 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG esri:2045 1 OK 0x1.2112ee95cda8ep24 -0x1.0ef773313b91p19 -0x1.d136da92p3 0x1.a80000001d528p6 -0x1.3fffffffeadfep2 -0x1.0p-30 F +REG esri:2045 2 OK 0x1.32046314b4436p24 -0x1.0ef77330e19f8p19 -0x1.81dffe328p4 0x1.cfffffffe2b66p6 -0x1.3fffffffeae7p2 -0x1.8p-29 F +REG esri:2045 3 OK 0x1.2112ef8966642p24 0x1.0f070c07c4a23p19 -0x1.d4d7a8dcp1 0x1.a80000001d524p6 0x1.3fffffffeadecp2 -0x1.0p-29 F +REG esri:2045 4 OK 0x1.3204622127dc9p24 0x1.0f070c076aa6ap19 -0x1.a7bee98e8p3 0x1.cfffffffe2b6dp6 0x1.3fffffffeae6p2 -0x1.8p-29 F +REG esri:20499 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:20499 1 OK -0x1.ada0e5629f69p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.7p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20499 2 OK 0x1.0191072b14fc8p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20499 3 OK -0x1.ada0e5629f69p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.7p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20499 4 OK 0x1.0191072b14fc8p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:20538 0 OK 0x1.e85d346033eb6p18 -0x1.67da969d989bp5 0x1.2d515952cp5 0x1.67fffffffffffp5 -0x1.2f74bf1dcfcaep-64 0x1.0p-30 T +REG esri:20538 1 OK -0x1.acc43e3a9d49p15 -0x1.0ee8903737bc8p19 0x1.08bda9464p5 0x1.3ffffffffffffp5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:20538 2 OK 0x1.0194bc334614p20 -0x1.0ee89037c242dp19 0x1.7e9d4a224p5 0x1.8ffffffffffffp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:20538 3 OK -0x1.acc59d63b20ap15 0x1.0edd517a81a8ep19 0x1.93faf3c64p4 0x1.4p5 0x1.4000000000001p2 -0x1.8p-29 F +REG esri:20538 4 OK 0x1.0194c72d697f6p20 0x1.0edd517b0c23ep19 0x1.3fdd244f6p5 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG esri:20539 0 OK 0x1.e859488ff6e44p18 -0x1.67da7891ffc5p5 0x1.6de38a22cp5 0x1.98p5 0x0.0p0 -0x1.0p-30 T +REG esri:20539 1 OK -0x1.ace2364c66f7p15 -0x1.0ee8798a71391p19 0x1.53b850d74p5 0x1.7000000000001p5 -0x1.4000000000002p2 -0x1.0p-30 F +REG esri:20539 2 OK 0x1.0193b608825c5p20 -0x1.0ee8798ae2265p19 0x1.b3cbe096ap5 0x1.c000000000001p5 -0x1.4000000000002p2 -0x1.0p-30 F +REG esri:20539 3 OK -0x1.ace39577ab74p15 0x1.0edd3acea99c5p19 0x1.14f827896p5 0x1.7000000000001p5 0x1.4000000000003p2 -0x1.8p-29 F +REG esri:20539 4 OK 0x1.0193c1028ed1p20 0x1.0edd3acf1a807p19 0x1.750bbf148p5 0x1.c000000000001p5 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:2056 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2056 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2056 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2056 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2056 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2057 0 OK 0x1.4177b76b8a1f3p19 0x1.73bb1665fc041p21 0x1.8b029e0c4p4 0x1.a4d40c57b582p5 0x1.b84d1f6f014c1p4 -0x1.0p-30 F +REG esri:2057 1 OK 0x1.44efe143ba058p16 0x1.30c37d3aa99c1p21 0x1.b66fbe0c8p3 0x1.77b9ae635ab67p5 0x1.684d1f6f01486p4 -0x1.0p-30 F +REG esri:2057 2 OK 0x1.2fcfb976297p20 0x1.322cbfb7f612ep21 0x1.7967937c8p3 0x1.d1ee6a4c104d9p5 0x1.684d1f6f01485p4 -0x1.0p-30 F +REG esri:2057 3 OK 0x1.df3e4f5004fe8p16 0x1.b8734ca8926dfp21 0x1.14aa07736p5 0x1.77b9ae635ab66p5 0x1.04268fb780a7cp5 0x1.0p-29 F +REG esri:2057 4 OK 0x1.20bd9cafa3a5p20 0x1.b9bcdf8c2a3b2p21 0x1.06bc8f8aap5 0x1.d1ee6a4c104d8p5 0x1.04268fb780a8p5 0x1.0p-30 F +REG esri:2058 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2058 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2058 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.9p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2058 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2058 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.9p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2059 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2059 1 OK -0x1.ada0e5629f69p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.7p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2059 2 OK 0x1.0191072b14fc8p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2059 3 OK -0x1.ada0e5629f69p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.7p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2059 4 OK 0x1.0191072b14fc8p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2060 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2060 1 OK -0x1.ada0e5629f89p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.ap5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2060 2 OK 0x1.0191072b14fb4p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.fp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2060 3 OK -0x1.ada0e5629f89p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.ap5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2060 4 OK 0x1.0191072b14fb4p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.fp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2061 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2061 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.d000000000001p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2061 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.1p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2061 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.d000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2061 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.1p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:2062 0 OK 0x1.be8570e10f5a8p19 0x1.28254ffb8975dp19 0x0.0p0 -0x1.d80e61aab6517p1 0x1.3ffffffffffe4p5 0x0.0p0 F +REG esri:2062 1 OK 0x1.4c3b4688814a8p18 0x1.8036ba376b14p15 0x0.0p0 -0x1.46e113f47452ap3 0x1.17fffffffffdp5 0x0.0p0 F +REG esri:2062 2 OK 0x1.763ae30dab50fp20 0x1.80f7fe430598p16 0x0.0p0 0x1.6b678c7c64a7dp1 0x1.17fffffffffdp5 0x0.0p0 F +REG esri:2062 3 OK 0x1.6ec3e2f145878p18 0x1.1af847539cf48p20 0x0.0p0 -0x1.46e113f47452ap3 0x1.67ffffffffff2p5 0x0.0p0 F +REG esri:2062 4 OK 0x1.573ae2cc97deap20 0x1.25620a4ef2b52p20 0x0.0p0 0x1.6b678c7c64a7dp1 0x1.67ffffffffff2p5 0x0.0p0 F +REG esri:2063 0 OK 0x1.e80af7fdb29dcp18 0x1.1fe2c69a4cd48p3 -0x1.6f1e4656cp4 -0x1.dffffffffffffp3 0x0.0p0 -0x1.0p-30 T +REG esri:2063 1 OK -0x1.af612db0adbp15 -0x1.0ee280312a10dp19 -0x1.1d350d9p-1 -0x1.3ffffffffffffp4 -0x1.3fffffffffffcp2 -0x1.0p-30 F +REG esri:2063 2 OK 0x1.018085391d142p20 -0x1.0ee2802f953adp19 -0x1.57b8926ep5 -0x1.4p3 -0x1.4p2 -0x1.8p-29 F +REG esri:2063 3 OK -0x1.af60e768302ep15 0x1.0ee4bff1c7cccp19 0x1.030c02ap0 -0x1.3fffffffffffep4 0x1.4p2 0x1.0p-30 F +REG esri:2063 4 OK 0x1.01808307571b5p20 0x1.0ee4bff032f01p19 -0x1.4b2b58a14p5 -0x1.3ffffffffffffp3 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:2064 0 OK 0x1.e808f8aeb120dp18 0x1.1fe31416cf39p3 -0x1.87b174de6p5 -0x1.2000000000002p3 0x0.0p0 0x0.0p0 T +REG esri:2064 1 OK -0x1.af75ac4c35a7p15 -0x1.0ee2c94890baep19 -0x1.9aea7842cp4 -0x1.c000000000001p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:2064 2 OK 0x1.01802984db7eap20 -0x1.0ee2c946eedc5p19 -0x1.15e9a2972p6 -0x1.0p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:2064 3 OK -0x1.af7566033dbcp15 0x1.0ee50909c8371p19 -0x1.81d009268p4 -0x1.cp3 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:2064 4 OK 0x1.0180275315d1ep20 0x1.0ee509082651dp19 -0x1.0fa303f84p6 -0x1.0000000000002p2 0x1.4000000000001p2 -0x1.8p-29 F +REG esri:2065 0 OK 0x1.359d93bb77214p20 -0x1.ed99e44973858p19 0x0.0p0 0x1.8d55555555556p4 0x1.8c00000000005p5 0x0.0p0 F +REG esri:2065 1 OK 0x1.82d469cf6c12fp19 -0x1.9630c24d661d4p20 0x0.0p0 0x1.1226dd0312abdp4 0x1.6400000000003p5 0x0.0p0 F +REG esri:2065 2 OK 0x1.e5ded4f4fc23bp20 -0x1.512950678889bp20 0x0.0p0 0x1.0441e6d3cbff7p5 0x1.6400000000003p5 0x0.0p0 F +REG esri:2065 3 OK 0x1.3c38b97633f22p19 -0x1.117d375ddc02p19 0x0.0p0 0x1.1226dd0312ab9p4 0x1.b400000000001p5 0x0.0p0 F +REG esri:2065 4 OK 0x1.8a8d1578b1d94p20 -0x1.3f4f2aeaf357p18 0x0.0p0 0x1.0441e6d3cbff5p5 0x1.b3ffffffffffdp5 0x0.0p0 F +REG esri:2066 0 OK 0x1.6e35fffffffffp17 0x1.5f8ffffffffffp17 0x0.0p0 -0x1.e57cf23a74585p5 0x1.6811d8e0ef223p3 0x0.0p0 F +REG esri:2066 1 OK -0x1.3f735e11a6fafp21 -0x1.37e961a193f3p21 0x0.0p0 -0x1.0722d1e07a8d5p6 0x1.9023b0bb31827p2 0x0.0p0 F +REG esri:2066 2 OK 0x1.6d3a1e11a6fb7p21 -0x1.37e961a193f3p21 0x0.0p0 -0x1.bcb440b3f395fp5 0x1.9023b0bb31827p2 0x0.0p0 F +REG esri:2066 3 OK -0x1.33c85dce4a73cp21 0x1.69c3caf72367bp21 0x0.0p0 -0x1.0722d28bb5699p6 0x1.0408ec0c63915p4 0x0.0p0 F +REG esri:2066 4 OK 0x1.618f1dce4a744p21 0x1.69c3caf72367dp21 0x0.0p0 -0x1.bcb43f5d7ddd6p5 0x1.0408ec0c63915p4 0x0.0p0 F +REG esri:2067 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2067 1 OK -0x1.ada0e5629f81p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.1p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2067 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2067 3 OK -0x1.ada0e5629f81p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.1p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:2067 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.d000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2068 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:2068 1 OK -0x1.5ad5c0c6a158ep18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.00000001d80d6p2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2068 2 OK 0x1.70bae06350ac8p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.bfffffff13f96p3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2068 3 OK -0x1.5ad5c0c6a158ep18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.00000001d80d6p2 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2068 4 OK 0x1.70bae06350ac8p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.bfffffff13f96p3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2069 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.6p3 0x0.0p0 0x0.0p0 T +REG esri:2069 1 OK -0x1.5ad5c0c6a158ep18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.80000001d80d5p2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2069 2 OK 0x1.70bae06350ac8p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.ffffffff13f96p3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2069 3 OK -0x1.5ad5c0c6a158ep18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.80000001d80d5p2 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2069 4 OK 0x1.70bae06350ac8p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.ffffffff13f96p3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2070 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.ap3 0x0.0p0 0x0.0p0 T +REG esri:2070 1 OK -0x1.5ad5c0c6a159p18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.00000000ec06bp3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2070 2 OK 0x1.70bae06350ac7p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.1fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2070 3 OK -0x1.5ad5c0c6a159p18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.00000000ec06bp3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2070 4 OK 0x1.70bae06350ac7p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.1fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2071 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2071 1 OK -0x1.5ad5c0c6a158ep18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.40000000ec06ap3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2071 2 OK 0x1.70bae06350ac8p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.3fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2071 3 OK -0x1.5ad5c0c6a158ep18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.40000000ec06ap3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2071 4 OK 0x1.70bae06350ac8p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.3fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2072 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.1p4 0x0.0p0 0x0.0p0 T +REG esri:2072 1 OK -0x1.5ad5c0c6a159p18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.80000000ec06bp3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2072 2 OK 0x1.70bae06350ac4p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.5fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2072 3 OK -0x1.5ad5c0c6a159p18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.80000000ec06bp3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2072 4 OK 0x1.70bae06350ac4p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.5fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2073 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.3p4 0x0.0p0 0x0.0p0 T +REG esri:2073 1 OK -0x1.5ad5c0c6a159p18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.c0000000ec06bp3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2073 2 OK 0x1.70bae06350ac8p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.7fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2073 3 OK -0x1.5ad5c0c6a159p18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.c0000000ec06bp3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2073 4 OK 0x1.70bae06350ac8p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.7fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2074 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2074 1 OK -0x1.5ad5c0c6a159p18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.0000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2074 2 OK 0x1.70bae06350ac8p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.9fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2074 3 OK -0x1.5ad5c0c6a159p18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.0000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2074 4 OK 0x1.70bae06350ac8p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.9fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2075 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.7p4 0x0.0p0 0x0.0p0 T +REG esri:2075 1 OK -0x1.5ad5c0c6a159p18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.2000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2075 2 OK 0x1.70bae06350ac8p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.bfffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2075 3 OK -0x1.5ad5c0c6a159p18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.2000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2075 4 OK 0x1.70bae06350ac8p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.bfffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2076 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.9p4 0x0.0p0 0x0.0p0 T +REG esri:2076 1 OK -0x1.5ad5c0c6a159p18 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.4000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2076 2 OK 0x1.70bae06350ac4p19 -0x1.0ef8f05e07d95p19 0x0.0p0 0x1.dfffffff89fcap4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2076 3 OK -0x1.5ad5c0c6a159p18 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.4000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2076 4 OK 0x1.70bae06350ac4p19 0x1.0ef8f05e07d95p19 0x0.0p0 0x1.dfffffff89fcap4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2077 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:2077 1 OK -0x1.ada0e5629f7bp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0000000000001p2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2077 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2077 3 OK -0x1.ada0e5629f7bp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0000000000001p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:2077 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:2078 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2078 1 OK -0x1.ada0e5629f6bp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2078 2 OK 0x1.0191072b14fc6p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2078 3 OK -0x1.ada0e5629f6bp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p3 0x1.4000000000001p2 0x0.0p0 F +REG esri:2078 4 OK 0x1.0191072b14fc6p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2079 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2079 1 OK -0x1.ada0e5629f73p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2079 2 OK 0x1.0191072b14fc2p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.ap4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2079 3 OK -0x1.ada0e5629f73p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2079 4 OK 0x1.0191072b14fc2p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.ap4 0x1.4000000000001p2 0x0.0p0 F +REG esri:20790 0 OK 0x1.e09541e5cee8p19 0x1.4c1be1c29baccp18 0x0.0p0 -0x1.04389355c939fp3 0x1.3d555550ca204p5 0x0.0p0 F +REG esri:20790 1 OK 0x1.af56d0d255386p18 -0x1.ebb59affbf6dcp17 0x0.0p0 -0x1.d41333b1fe132p3 0x1.1555555554c7dp5 0x0.0p0 F +REG esri:20790 2 OK 0x1.900e5f6954c18p20 -0x1.14ab3567d578p17 0x0.0p0 -0x1.a2f0530f6064ap0 0x1.1555557ecc467p5 0x0.0p0 F +REG esri:20790 3 OK 0x1.8f8066a7fca4p18 0x1.a353d570431cdp19 0x0.0p0 -0x1.d41333b1ff3dp3 0x1.65555555545b1p5 0x0.0p0 F +REG esri:20790 4 OK 0x1.5f6917dacf074p20 0x1.dc6dcfd17df3cp19 0x0.0p0 -0x1.a2f111b2905e6p0 0x1.6555557311a34p5 0x0.0p0 F +REG esri:20791 0 OK 0x1.7eed41e5cee8p19 0x1.391f0e14dd661p15 0x0.0p0 -0x1.04389355c939fp3 0x1.3d555550ca204p5 0x0.0p0 F +REG esri:20791 1 OK 0x1.d80da1a4aa70bp17 -0x1.0d6966bfefdb7p19 0x0.0p0 -0x1.d41333b1fe132p3 0x1.1555555554c7dp5 0x0.0p0 F +REG esri:20791 2 OK 0x1.5f3a5f6954c18p20 -0x1.af4d9ab3eabcp18 0x0.0p0 -0x1.a2f0530f6064ap0 0x1.1555557ecc467p5 0x0.0p0 F +REG esri:20791 3 OK 0x1.9860cd4ff948p17 0x1.10d7d570431cdp19 0x0.0p0 -0x1.d41333b1ff3dp3 0x1.65555555545b1p5 0x0.0p0 F +REG esri:20791 4 OK 0x1.2e9517dacf074p20 0x1.49f1cfd17df3cp19 0x0.0p0 -0x1.a2f111b2905e6p0 0x1.6555557311a34p5 0x0.0p0 F +REG esri:2080 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2080 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2080 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2080 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2080 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2081 0 OK 0x1.312dp21 0x1.b453d9c057babp16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG esri:2081 1 OK 0x1.255df71535f4ap21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bcp6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:2081 2 OK 0x1.3cfc08eaca0b6p21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:2081 3 OK 0x1.ec308cfc9a632p20 0x1.1136208e33694p18 0x0.0p0 0x1.bcp6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:2081 4 OK 0x1.6c41b981b2ce7p21 0x1.1136208e33694p18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:2082 0 OK 0x1.312dp21 0x1.b453d9c057babp16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG esri:2082 1 OK 0x1.255df71535f4ap21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bcp6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:2082 2 OK 0x1.3cfc08eaca0b6p21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:2082 3 OK 0x1.ec308cfc9a632p20 0x1.1136208e33694p18 0x0.0p0 0x1.bcp6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:2082 4 OK 0x1.6c41b981b2ce7p21 0x1.1136208e33694p18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:20822 0 OK 0x1.e84800000000bp18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:20822 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20822 2 OK 0x1.f82a0370c6681p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20822 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:20822 4 OK 0x1.0722fde056e36p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:20823 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:20823 1 OK -0x1.fc406e18ccf8p14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20823 2 OK 0x1.f82a0370c667cp19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20823 3 OK -0x1.2fefde056e328p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:20823 4 OK 0x1.0722fde056e32p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:20824 0 OK 0x1.e847ffffffff5p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:20824 1 OK -0x1.fc406e18cd0cp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20824 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20824 3 OK -0x1.2fefde056e38p16 0x1.daca2fdc3ae77p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20824 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2083 0 OK 0x1.312a2a37884cep21 0x1.b4fc0f75ce6a3p16 -0x1.de9526812p5 -0x1.14000000005f6p6 -0x1.6400000000b1cp6 0x1.bd8p-19 F +REG esri:2083 1 OK 0x1.255b42e60f264p21 0x1.b5b1e51f4edb4p15 -0x1.e0414f54cp5 0x1.4d4356079ced5p6 -0x1.67fe352753a1ep6 0x1.6329e12p1 F +REG esri:2083 2 OK 0x1.3cf910a9d04d7p21 0x1.b5b1849da42b6p15 -0x1.f5130d37p5 0x1.4d435628fdec4p6 -0x1.67fe3527478b4p6 0x1.60e0306p-3 F +REG esri:2083 3 EXC:java.lang.IllegalStateException 0x1.ec2c3f7c30fe2p20 0x1.115e8d46669fcp18 -0x1.8e99fa656p5 NaN NaN NaN F +REG esri:2083 4 EXC:java.lang.IllegalStateException 0x1.6c3e36c5e78e2p21 0x1.115e503342f6fp18 -0x1.f6923ee06p5 NaN NaN NaN F +REG esri:2084 0 OK 0x1.e8336200f57e5p18 0x1.b995ca9a90a0fp22 -0x1.277975902p5 -0x1.1400000000021p6 -0x1.8ffffffffd91dp4 0x1.136p-19 F +REG esri:2084 1 OK -0x1.fd3b3cac89b8p14 0x1.96ff5b80c8e56p22 -0x1.76dc8cd08p4 -0x1.2a114b81858c4p6 -0x1.dffffffffde4fp4 0x1.8ap-20 F +REG esri:2084 2 OK 0x1.f81d146d38d5p19 0x1.96ff56b2f6d82p22 -0x1.2e238fa18p5 -0x1.fbdd68fcf4f04p5 -0x1.dffffffffde4bp4 0x1.858p-20 F +REG esri:2084 3 OK -0x1.302e0cdb9ca28p16 0x1.dac8c8e8fffedp22 -0x1.2c6806e2ep5 -0x1.2a114b8185884p6 -0x1.3ffffffffd51fp4 0x1.7acp-19 F +REG esri:2084 4 OK 0x1.071ca4a620614p20 0x1.dac8c42724e77p22 -0x1.a8e138a34p5 -0x1.fbdd68fcf4f7p5 -0x1.3ffffffffd51cp4 0x1.788p-19 F +REG esri:2085 0 OK 0x1.e848p18 0x1.11ba010624dd3p18 0x0.0p0 -0x1.44p6 0x1.65999999998a2p4 0x0.0p0 F +REG esri:2085 1 OK -0x1.2b3735c29451p16 -0x1.0153d4e9de713p18 0x0.0p0 -0x1.599fdd28e3eaap6 0x1.159999999987fp4 0x0.0p0 F +REG esri:2085 2 OK 0x1.06d7735c29451p20 -0x1.0153d4e9de713p18 0x0.0p0 -0x1.2e6022d71c156p6 0x1.159999999987fp4 0x0.0p0 F +REG esri:2085 3 OK -0x1.1fbbe7194309p15 0x1.9c51c7a10eaap19 0x0.0p0 -0x1.599fdd28e3eaap6 0x1.b5999999998d2p4 0x0.0p0 F +REG esri:2085 4 OK 0x1.fa43be7194309p19 0x1.9c51c7a10eaap19 0x0.0p0 -0x1.2e6022d71c156p6 0x1.b5999999998d2p4 0x0.0p0 F +REG esri:2086 0 OK 0x1.e848p18 0x1.bf83783126e98p17 0x0.0p0 -0x1.3355555555555p6 0x1.4b7777777767p4 0x0.0p0 F +REG esri:2086 1 OK -0x1.24f0679f94638p16 -0x1.340b277f9c38cp18 0x0.0p0 -0x1.48b745942595bp6 0x1.f6eeeeeeeeccdp3 0x0.0p0 F +REG esri:2086 2 OK 0x1.06730679f9464p20 -0x1.340b277f9c38cp18 0x0.0p0 -0x1.1df365168514fp6 0x1.f6eeeeeeeeccdp3 0x0.0p0 F +REG esri:2086 3 OK -0x1.2c1f70ac8d9bp15 0x1.82ea47fed178fp19 0x0.0p0 -0x1.48b745942595bp6 0x1.9b7777777769dp4 0x0.0p0 F +REG esri:2086 4 OK 0x1.fb09f70ac8d9bp19 0x1.82ea47fed178fp19 0x0.0p0 -0x1.1df365168514fp6 0x1.9b7777777769dp4 0x0.0p0 F +REG esri:2087 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG esri:2087 1 OK -0x1.ada0e5413d17p15 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.c0000001d80d5p2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2087 2 OK 0x1.0191072a09e8cp20 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.0fffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2087 3 OK -0x1.ada0e5413d17p15 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.c0000001d80d5p2 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2087 4 OK 0x1.0191072a09e8cp20 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.0fffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2088 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.6p3 0x0.0p0 0x0.0p0 T +REG esri:2088 1 OK -0x1.ad89322c386bp15 -0x1.0edd0485a853dp19 0x0.0p0 0x1.80000001e0cf2p2 -0x1.3fffffffea4bbp2 0x0.0p0 F +REG esri:2088 2 OK 0x1.0190499161c36p20 -0x1.0edd0485a853dp19 0x0.0p0 0x1.ffffffff0f986p3 -0x1.3fffffffea4bbp2 0x0.0p0 F +REG esri:2088 3 OK -0x1.ad89322c386bp15 0x1.0edd0485a853dp19 0x0.0p0 0x1.80000001e0cf2p2 0x1.3fffffffea4bbp2 0x0.0p0 F +REG esri:2088 4 OK 0x1.0190499161c36p20 0x1.0edd0485a853dp19 0x0.0p0 0x1.ffffffff0f986p3 0x1.3fffffffea4bbp2 0x0.0p0 F +REG esri:2089 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2089 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2089 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2089 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2089 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2090 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2090 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2090 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2090 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2090 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2091 0 OK 0x1.036697ae3ec5dp23 -0x1.0bff87e78fd81p6 0x1.5a922326ep5 0x1.67ffffffffffep5 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG esri:2091 1 OK 0x1.e4ea5dee74e1ep22 -0x1.0f0700d55d3fbp19 0x1.6179b1508p5 0x1.400000003a93ep5 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG esri:2091 2 OK 0x1.145800665e824p23 -0x1.0f0700d5a4d6fp19 0x1.9e606a5ecp5 0x1.8fffffffc55ep5 -0x1.3fffffffeadfbp2 -0x1.0p-30 F +REG esri:2091 3 OK 0x1.e4ea59d84942fp22 0x1.0ef641009a776p19 0x1.040bf0c86p5 0x1.400000003a94ap5 0x1.3fffffffeae6dp2 0x0.0p0 F +REG esri:2091 4 OK 0x1.14580271895d3p23 0x1.0ef64100e205ep19 0x1.40f2b131ap5 0x1.8fffffffc55d6p5 0x1.3fffffffeae0cp2 -0x1.0p-30 F +REG esri:2092 0 OK 0x1.21eaf790da586p23 -0x1.0bff7d7fab492p6 0x1.789968ef8p5 0x1.9800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2092 1 OK 0x1.10f98f807b7a2p23 -0x1.0f06f648baaf1p19 0x1.8a6dc6d4cp5 0x1.700000003a966p5 -0x1.3fffffffeae45p2 -0x1.0p-30 F +REG esri:2092 2 OK 0x1.32dc5fa1ecd8fp23 -0x1.0f06f648e80e8p19 0x1.b10614d1cp5 0x1.bfffffffc560cp5 -0x1.3fffffffeae0ap2 -0x1.0p-29 F +REG esri:2092 3 OK 0x1.10f98d75620cbp23 0x1.0ef636749d13ap19 0x1.2d000b3f2p5 0x1.700000003a972p5 0x1.3fffffffeae5ap2 -0x1.0p-30 F +REG esri:2092 4 OK 0x1.32dc61ad139cap23 0x1.0ef63674ca6dap19 0x1.53985de58p5 0x1.bfffffffc5602p5 0x1.3fffffffeae1ep2 0x1.0p-30 F +REG esri:2093 0 OK 0x1.e83c53eacafd4p18 0x1.f31ee54003a87p5 -0x1.167751458p3 0x1.a800000000001p6 0x0.0p0 -0x1.0p-30 T +REG esri:2093 1 OK -0x1.af911a844506p15 -0x1.0ef766b24e45ep19 -0x1.5b8af6c2p3 0x1.940000001d51fp6 -0x1.3fffffffeae05p2 0x1.0p-29 F +REG esri:2093 2 OK 0x1.019ab2bf7205dp20 -0x1.0ef766b20224dp19 -0x1.2f7cf616cp4 0x1.bbffffffe2b5cp6 -0x1.3fffffffeae67p2 0x1.0p-30 F +REG esri:2093 3 OK -0x1.af8f3354f681p15 0x1.0f06ff88211a8p19 0x1.d7b172p-7 0x1.940000001d519p6 0x1.3fffffffeadf3p2 0x1.0p-28 F +REG esri:2093 4 OK 0x1.019aa3869e884p20 0x1.0f06ff87d4f0ep19 -0x1.02f8ebe1p3 0x1.bbffffffe2b61p6 0x1.3fffffffeae56p2 -0x1.0p-30 F +REG esri:20934 0 OK 0x1.e848000000011p18 0x1.b99b3ea50af08p22 0x0.0p0 0x1.5p4 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20934 1 OK -0x1.fc27c343d866p14 0x1.9705574db17a4p22 0x0.0p0 0x1.ef75a3f3d468ep3 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20934 2 OK 0x1.f8293e1a1ec4p19 0x1.9705574db17a4p22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20934 3 OK -0x1.2fe61430e6bb8p16 0x1.dacd963728cc8p22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20934 4 OK 0x1.072261430e6c3p20 0x1.dacd963728cc8p22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.4p4 0x0.0p0 F +REG esri:20935 0 OK 0x1.e848p18 0x1.b99b3ea50af08p22 0x0.0p0 0x1.bp4 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20935 1 OK -0x1.fc27c343d87p14 0x1.9705574db17a4p22 0x0.0p0 0x1.57bad1f9ea347p4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20935 2 OK 0x1.f8293e1a1ec3bp19 0x1.9705574db17a4p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20935 3 OK -0x1.2fe61430e6bep16 0x1.dacd963728cc8p22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20935 4 OK 0x1.072261430e6cp20 0x1.dacd963728cc8p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:20936 0 OK 0x1.e847ffffffff5p18 0x1.b99b3ea50af08p22 0x0.0p0 0x1.08p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:20936 1 OK -0x1.fc27c343d88p14 0x1.9705574db17a4p22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20936 2 OK 0x1.f8293e1a1ec35p19 0x1.9705574db17a4p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:20936 3 OK -0x1.2fe61430e6c3p16 0x1.dacd963728cc8p22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4p4 0x0.0p0 F +REG esri:20936 4 OK 0x1.072261430e6bep20 0x1.dacd963728cc8p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2094 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.a800000000001p6 -0x1.2f74bf1dbb5b8p-69 0x1.a0a2p-14 T +REG esri:2094 1 OK -0x1.ada7001d0dd2p15 -0x1.0ee398b6f0d04p19 0x1.259d2fefp2 0x1.940000001d521p6 -0x1.3fffffffd56f4p2 0x1.9d79p-14 F +REG esri:2094 2 OK 0x1.018e12dfa0327p20 -0x1.0ee38c6f7c186p19 0x1.259d2feep2 0x1.bbffffffe2b21p6 -0x1.3fffffffd5728p2 0x1.9d79p-14 F +REG esri:2094 3 OK -0x1.ada70ef1a843p15 0x1.0ee31f2acf877p19 0x1.106af05p2 0x1.940000001d521p6 0x1.3fffffffd56f4p2 0x1.9d79p-14 F +REG esri:2094 4 OK 0x1.018e1356423ddp20 0x1.0ee312e36043ap19 0x1.106af04fp2 0x1.bbffffffe2b21p6 0x1.3fffffffd5729p2 0x1.9d7ap-14 F +REG esri:2095 0 OK 0x1.e8161e724c4b9p18 -0x1.afd415a1a7825p4 -0x1.2691221e4p4 -0x1.dfffffffffffep3 -0x1.2f74bf1dcfcaep-64 0x1.0p-30 T +REG esri:2095 1 OK -0x1.af06ee02907dp15 -0x1.0ee6ee51829e9p19 0x1.947e28ep-3 -0x1.3ffffffffffffp4 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:2095 2 OK 0x1.0183467fde222p20 -0x1.0ee6ee503bb95p19 -0x1.13b23242ep5 -0x1.3fffffffffffep3 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:2095 3 OK -0x1.af07c0d0e864p15 0x1.0ee02f0f9fb75p19 -0x1.20910f78p2 -0x1.3ffffffffffffp4 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:2095 4 OK 0x1.01834d151c19ep20 0x1.0ee02f0e58e2p19 -0x1.3958dfda2p5 -0x1.4p3 0x1.4000000000002p2 -0x1.0p-30 F +REG esri:2096 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.02p7 0x1.3p5 0x0.0p0 F +REG esri:2096 1 OK -0x1.802ca939eee84p18 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.ea9ea071cbf1bp6 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG esri:2096 2 OK 0x1.8366549cf7756p19 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.0eb0afc71a073p7 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG esri:2096 3 OK -0x1.35f5174ae52e6p18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.ea9ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG esri:2096 4 OK 0x1.5e4a8ba572986p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0eb0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG esri:2097 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.fc00000000001p6 0x1.3p5 0x0.0p0 F +REG esri:2097 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.e29ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG esri:2097 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.0ab0afc71a073p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG esri:2097 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.e29ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG esri:2097 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.0ab0afc6f4378p7 0x1.57ffffff547abp5 0x0.0p0 F +REG esri:2098 0 OK 0x1.86ap17 0x1.e848p18 0x0.0p0 0x1.f400000000001p6 0x1.3p5 0x0.0p0 F +REG esri:2098 1 OK -0x1.802ca939eeeacp18 -0x1.1f1eb538ff19p15 0x0.0p0 0x1.da9ea071cbf1bp6 0x1.07ffffffa3ae3p5 0x0.0p0 F +REG esri:2098 2 OK 0x1.8366549cf7742p19 -0x1.1f1eb538ff1ap15 0x0.0p0 0x1.06b0afc71a072p7 0x1.07ffffffa3ae2p5 0x0.0p0 F +REG esri:2098 3 OK -0x1.35f5174ae530cp18 0x1.06635d0c1efe4p20 0x0.0p0 0x1.da9ea07217911p6 0x1.57ffffff547abp5 0x0.0p0 F +REG esri:2098 4 OK 0x1.5e4a8ba572973p19 0x1.06635d0c1efe4p20 0x0.0p0 0x1.06b0afc6f4377p7 0x1.57ffffff547abp5 0x0.0p0 F +REG esri:2099 0 OK 0x1.86ap16 0x1.86ap16 0x0.0p0 0x1.9617530eca864p5 0x1.961e26af37c04p4 0x0.0p0 F +REG esri:2099 1 OK -0x1.d26ed72fc8f28p18 -0x1.b19079e4ae824p18 0x0.0p0 0x1.69d132ba71df2p5 0x1.461e261bb5b06p4 0x0.0p0 F +REG esri:2099 2 OK 0x1.4adf6b97e479ap19 -0x1.b19079e4ae824p18 0x0.0p0 0x1.c25d7363232d6p5 0x1.461e261bb5b06p4 0x0.0p0 F +REG esri:2099 3 OK -0x1.a5983ee492b7cp18 0x1.45be7815de14ap19 0x0.0p0 0x1.69d1301aaf10dp5 0x1.e61e26dde78d8p4 0x0.0p0 F +REG esri:2099 4 OK 0x1.34741f72495c4p19 0x1.45be7815de14ap19 0x0.0p0 0x1.c25d7602e5fbcp5 0x1.e61e26dde78d8p4 0x0.0p0 F +REG esri:2100 0 OK 0x1.e8229c7935824p18 -0x1.ed07e68cfe8bfp7 0x1.305aa68bfp7 0x1.8000000000001p4 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG esri:2100 1 OK -0x1.ae82003e2793p15 -0x1.0f008036081e2p19 0x1.73029c9bap7 0x1.30000000756a6p4 -0x1.3fffffffead5ap2 0x1.8p-28 F +REG esri:2100 2 OK 0x1.01855e2356e76p20 -0x1.0f00803513292p19 0x1.3f0cb56388p7 0x1.cfffffff8af61p4 -0x1.3fffffffeae9bp2 -0x1.4p-27 F +REG esri:2100 3 OK -0x1.ae898587ad27p15 0x1.0ec2dfbcb3c25p19 0x1.1d08f7c3cp7 0x1.30000000757p4 0x1.3fffffffeada1p2 0x1.cp-28 F +REG esri:2100 4 OK 0x1.01859a4561064p20 0x1.0ec2dfbbbf39ep19 0x1.d225f2e23p6 0x1.cfffffff8af05p4 0x1.3fffffffeaeep2 -0x1.4p-27 F +REG esri:2101 0 OK 0x0.0p0 -0x1.9b99f1a9fbe77p15 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG esri:2101 1 OK -0x1.1408e750d1f92p19 -0x1.25ea29a148f24p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2101 2 OK 0x1.1408e750d1f9ep19 -0x1.25ea29a148f24p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2101 3 OK -0x1.0b927d4cc048cp19 0x1.ed9b5d2d72cadp18 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2101 4 OK 0x1.0b927d4cc0498p19 0x1.ed9b5d2d72cadp18 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2102 0 OK 0x1.86ap17 0x1.1fb9839581062p17 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG esri:2102 1 OK -0x1.64c1cea1a3f24p18 -0x1.8884534291e49p18 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2102 2 OK 0x1.75b0e750d1f9ep19 -0x1.8884534291e49p18 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2102 3 OK -0x1.53d4fa9980918p18 0x1.5875ae96b9656p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2102 4 OK 0x1.6d3a7d4cc0498p19 0x1.5875ae96b9656p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2103 0 OK 0x1.e848p18 0x1.b4d4c1cac0831p18 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG esri:2103 1 OK -0x1.fe4e750d1f92p15 -0x1.8e314d0a47924p16 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2103 2 OK 0x1.041673a868fcfp20 -0x1.8e314d0a47924p16 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2103 3 OK -0x1.76e7d4cc048cp15 0x1.eaf1ae96b9656p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2103 4 OK 0x1.ffb67d4cc0498p19 0x1.eaf1ae96b9656p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG esri:21035 0 OK 0x1.e848p18 0x1.b99b3ea581215p22 0x0.0p0 0x1.bp4 -0x1.9p4 0x0.0p0 F +REG esri:21035 1 OK -0x1.fc27c346fb76p14 0x1.9705574e3956cp22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:21035 2 OK 0x1.f8293e1a37dbdp19 0x1.9705574e3956cp22 0x0.0p0 0x1.042297030ae5dp5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:21035 3 OK -0x1.2fe614314dfap16 0x1.dacd96378aa1fp22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.4p4 0x0.0p0 F +REG esri:21035 4 OK 0x1.0722614314dfcp20 0x1.dacd96378aa1fp22 0x0.0p0 0x1.042297030ae5dp5 -0x1.4p4 0x0.0p0 F +REG esri:21036 0 OK 0x1.e847ffffffff5p18 0x1.b99b3ea581215p22 0x0.0p0 0x1.08p5 -0x1.9p4 0x0.0p0 F +REG esri:21036 1 OK -0x1.fc27c346fb84p14 0x1.9705574e3956cp22 0x0.0p0 0x1.b7bad1f9ea348p4 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:21036 2 OK 0x1.f8293e1a37db8p19 0x1.9705574e3956cp22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:21036 3 OK -0x1.2fe614314dffp16 0x1.dacd96378aa1fp22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4p4 0x0.0p0 F +REG esri:21036 4 OK 0x1.0722614314df9p20 0x1.dacd96378aa1fp22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4p4 0x0.0p0 F +REG esri:21037 0 OK 0x1.e84800000000bp18 0x1.b99b3ea581215p22 0x0.0p0 0x1.38p5 -0x1.9p4 0x0.0p0 F +REG esri:21037 1 OK -0x1.fc27c346fb7p14 0x1.9705574e3956cp22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:21037 2 OK 0x1.f8293e1a37dc9p19 0x1.9705574e3956bp22 0x0.0p0 0x1.642297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:21037 3 OK -0x1.2fe614314df9p16 0x1.dacd96378aa1fp22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.4p4 0x0.0p0 F +REG esri:21037 4 OK 0x1.0722614314e02p20 0x1.dacd96378aa1fp22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2104 0 OK -0x1.0a5p14 -0x1.698fe147ae148p14 0x0.0p0 -0x1.1e6c271115ba2p6 0x1.45555555553ap3 0x0.0p0 F +REG esri:2104 1 OK -0x1.1c5b6750d1f92p19 -0x1.177d0990e6a47p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2104 2 OK 0x1.0bb66750d1f9ep19 -0x1.177d0990e6a47p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaa89ep2 0x0.0p0 F +REG esri:2104 3 OK -0x1.13e4fd4cc048cp19 0x1.053acea71bb34p19 0x0.0p0 -0x1.32bdd3ae09d7ap6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2104 4 OK 0x1.033ffd4cc0498p19 0x1.053acea71bb34p19 0x0.0p0 -0x1.0a1a7a74219c8p6 0x1.e555555555347p3 0x0.0p0 F +REG esri:2105 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5d8740da740dcp7 -0x1.2709abcdf0123p5 0x0.0p0 F +REG esri:2105 1 OK -0x1.d08668074683cp16 0x1.b96a6c64d446cp17 0x0.0p0 0x1.5106d779d9002p7 -0x1.4f09abcd5a428p5 0x0.0p0 F +REG esri:2105 2 OK 0x1.c0b0cd00e8d08p19 0x1.b96a6c64d446cp17 0x0.0p0 -0x1.65f855c4f0e4ap7 -0x1.4f09abcd5a428p5 0x0.0p0 F +REG esri:2105 3 OK -0x1.76c9697d13684p17 0x1.4689a71d5c278p20 0x0.0p0 0x1.5106d779ba9ecp7 -0x1.fe13579b44dc4p4 0x0.0p0 F +REG esri:2105 4 OK 0x1.e4525a5f44da1p19 0x1.4689a71d5c278p20 0x0.0p0 -0x1.65f855c4d2834p7 -0x1.fe13579b44dc4p4 0x0.0p0 F +REG esri:2106 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.60eea61d950c8p7 -0x1.2e16c16c16c17p5 0x0.0p0 F +REG esri:2106 1 OK -0x1.cc191f4c6d87cp16 0x1.b8269d7118b08p17 0x0.0p0 0x1.54487b7d35482p7 -0x1.5616c16b6fadbp5 0x0.0p0 F +REG esri:2106 2 OK 0x1.c02323e98db1p19 0x1.b8269d7118b08p17 0x0.0p0 -0x1.626b2f420b2f1p7 -0x1.5616c16b6fadbp5 0x0.0p0 F +REG esri:2106 3 OK -0x1.79393c5260064p17 0x1.466891405150fp20 0x0.0p0 0x1.54487b7d11187p7 -0x1.0616c16bbd8e3p5 0x0.0p0 F +REG esri:2106 4 OK 0x1.e4ee4f1498019p19 0x1.466891405150fp20 0x0.0p0 -0x1.626b2f41e6ff7p7 -0x1.0616c16bbd8e3p5 0x0.0p0 F +REG esri:2107 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.63c56789abce1p7 -0x1.34fedcba98765p5 0x0.0p0 F +REG esri:2107 1 OK -0x1.c7733486bc9e8p16 0x1.b700b1160576p17 0x0.0p0 0x1.56f89f482d573p7 -0x1.5cfedcb9dec1cp5 0x0.0p0 F +REG esri:2107 2 OK 0x1.bf8e6690d793dp19 0x1.b700b1160576p17 0x0.0p0 -0x1.5f6dd034d5bb1p7 -0x1.5cfedcb9dec1cp5 0x0.0p0 F +REG esri:2107 3 OK -0x1.7b8c9d132bab4p17 0x1.4643cb75af311p20 0x0.0p0 0x1.56f89f4802e0bp7 -0x1.0cfedcba32385p5 0x0.0p0 F +REG esri:2107 4 OK 0x1.e5832744caeadp19 0x1.4643cb75af311p20 0x0.0p0 -0x1.5f6dd034ab449p7 -0x1.0cfedcba32385p5 0x0.0p0 F +REG esri:2108 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.6158e38e38e38p7 -0x1.3d34e81b4e81bp5 0x0.0p0 F +REG esri:2108 1 OK -0x1.c1c4e44a56004p16 0x1.b59cb7ecffaacp17 0x0.0p0 0x1.545bfc8a4b737p7 -0x1.6534e81a7c3dcp5 0x0.0p0 F +REG esri:2108 2 OK 0x1.bed89c894acp19 0x1.b59cb7ecffaacp17 0x0.0p0 -0x1.61aa356dd9ac7p7 -0x1.6534e81a7c3dcp5 0x0.0p0 F +REG esri:2108 3 OK -0x1.7e6295d90b918p17 0x1.461698af3cdf8p20 0x0.0p0 0x1.545bfc8a18ab3p7 -0x1.1534e81ad6371p5 0x0.0p0 F +REG esri:2108 4 OK 0x1.e638a57642e46p19 0x1.461698af3cdf8p20 0x0.0p0 -0x1.61aa356da6e43p7 -0x1.1534e81ad6371p5 0x0.0p0 F +REG esri:2109 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5c749f49f49f5p7 -0x1.39159e26af37dp5 0x0.0p0 F +REG esri:2109 1 OK -0x1.c4a48bff7a28cp16 0x1.b65055aaad014p17 0x0.0p0 0x1.4f902f719a9c4p7 -0x1.61159e25e99fdp5 0x0.0p0 F +REG esri:2109 2 OK 0x1.bf34917fef452p19 0x1.b65055aaad014p17 0x0.0p0 -0x1.66a6f0ddb15dap7 -0x1.61159e25e99fdp5 0x0.0p0 F +REG esri:2109 3 OK -0x1.7cf397b3bc8acp17 0x1.462d7ec70000cp20 0x0.0p0 0x1.4f902f716c20fp7 -0x1.11159e26405b8p5 0x0.0p0 F +REG esri:2109 4 OK 0x1.e5dce5ecef22bp19 0x1.462d7ec70000cp20 0x0.0p0 -0x1.66a6f0dd82e24p7 -0x1.11159e26405b8p5 0x0.0p0 F +REG esri:21095 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:21095 1 OK -0x1.ad892fd8998p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21095 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21095 3 OK -0x1.ad892fd8998p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21095 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21096 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:21096 1 OK -0x1.ad892fd89985p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21096 2 OK 0x1.0190497ec4cbcp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21096 3 OK -0x1.ad892fd89985p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21096 4 OK 0x1.0190497ec4cbcp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21097 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:21097 1 OK -0x1.ad892fd89975p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21097 2 OK 0x1.0190497ec4cc2p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21097 3 OK -0x1.ad892fd89975p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:21097 4 OK 0x1.0190497ec4cc2p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2110 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5f47ae147ae14p7 -0x1.3c1907f6e5d4cp5 0x0.0p0 F +REG esri:2110 1 OK -0x1.c28be7e6a5f3p16 0x1.b5cd37d212ecp17 0x0.0p0 0x1.52516bbfa023bp7 -0x1.641907f6170b3p5 0x0.0p0 F +REG esri:2110 2 OK 0x1.bef17cfcd4be6p19 0x1.b5cd37d212ecp17 0x0.0p0 -0x1.63c20f96aa612p7 -0x1.641907f6170b3p5 0x0.0p0 F +REG esri:2110 3 OK -0x1.7dff5a17557ccp17 0x1.461ccc62cca3p20 0x0.0p0 0x1.52516bbf6e8a2p7 -0x1.141907f670274p5 0x0.0p0 F +REG esri:2110 4 OK 0x1.e61fd685d55f3p19 0x1.461ccc62cca3p20 0x0.0p0 -0x1.63c20f9678c79p7 -0x1.141907f670274p5 0x0.0p0 F +REG esri:21100 0 OK -0x1.e565823a0c9b8p22 0x1.b774000000006p19 0x0.0p0 0x1.b19d8d672c76bp7 0x0.0p0 0x0.0p0 F +REG esri:21100 1 OK -0x1.03a19fb25810ap23 0x1.53f875a6d736ap18 0x0.0p0 0x1.a79d8d672c76bp7 -0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:21100 2 OK -0x1.c387c50f6915cp22 0x1.53f875a6d736ap18 0x0.0p0 0x1.bb9d8d672c76bp7 -0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:21100 3 OK -0x1.03a19fb25810ap23 0x1.6275e2964a32bp20 0x0.0p0 0x1.a79d8d672c76bp7 0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:21100 4 OK -0x1.c387c50f6915cp22 0x1.6275e2964a32bp20 0x0.0p0 0x1.bb9d8d672c76bp7 0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:2111 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5ef9e26af37bep7 -0x1.41ef8091a2b3cp5 0x0.0p0 F +REG esri:2111 1 OK -0x1.be6ab400c2db8p16 0x1.b4cc5b6396e3p17 0x0.0p0 0x1.51e020eb97faap7 -0x1.69ef8090c1016p5 0x0.0p0 F +REG esri:2111 2 OK 0x1.be6d5680185a6p19 0x1.b4cc5b6396e34p17 0x0.0p0 -0x1.63ec5c15b102fp7 -0x1.69ef8090c1016p5 0x0.0p0 F +REG esri:2111 3 OK -0x1.800e1766e30b8p17 0x1.45fbca5561faap20 0x0.0p0 0x1.51e020eb5fee7p7 -0x1.19ef80911e98ap5 0x0.0p0 F +REG esri:2111 4 OK 0x1.e6a385d9b8c1ap19 0x1.45fbca5561faap20 0x0.0p0 -0x1.63ec5c1578f6bp7 -0x1.19ef80911e98ap5 0x0.0p0 F +REG esri:2112 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5f4b60b60b60bp7 -0x1.4766f8091a2b3p5 0x0.0p0 F +REG esri:2112 1 OK -0x1.ba76dd74d65e8p16 0x1.b3d851e575388p17 0x0.0p0 0x1.520f2ec97abap7 -0x1.6f66f80825601p5 0x0.0p0 F +REG esri:2112 2 OK 0x1.bdeedbae9acacp19 0x1.b3d851e57539p17 0x0.0p0 -0x1.63786d5d63f8ap7 -0x1.6f66f80825602p5 0x0.0p0 F +REG esri:2112 3 OK -0x1.820547eb07db4p17 0x1.45dc0dea75e43p20 0x0.0p0 0x1.520f2ec93c1c3p7 -0x1.1f66f80886f51p5 0x0.0p0 F +REG esri:2112 4 OK 0x1.e72151fac1f59p19 0x1.45dc0dea75e44p20 0x0.0p0 -0x1.63786d5d255adp7 -0x1.1f66f80886f5p5 0x0.0p0 F +REG esri:2113 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5d8d82d82d82ep7 -0x1.4a68acf13579ap5 0x0.0p0 F +REG esri:2113 1 OK -0x1.b840fced2768p16 0x1.b3509c9d4339cp17 0x0.0p0 0x1.503ddcfe601bbp7 -0x1.7268acf03592cp5 0x0.0p0 F +REG esri:2113 2 OK 0x1.bda81f9da4edp19 0x1.b3509c9d4339cp17 0x0.0p0 -0x1.6522d74e0515fp7 -0x1.7268acf03592cp5 0x0.0p0 F +REG esri:2113 3 OK -0x1.831e493cd663cp17 0x1.45ca3e54b18c8p20 0x0.0p0 0x1.503ddcfe1da3cp7 -0x1.2268acf0993cep5 0x0.0p0 F +REG esri:2113 4 OK 0x1.e767924f3598fp19 0x1.45ca3e54b18c8p20 0x0.0p0 -0x1.6522d74dc29dfp7 -0x1.2268acf0993cep5 0x0.0p0 F +REG esri:2114 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5958091a2b3c3p7 -0x1.45b7c048d159fp5 0x0.0p0 F +REG esri:2114 1 OK -0x1.bbb0f46649274p16 0x1.b423e22ec12d4p17 0x0.0p0 0x1.4c2694269a09ap7 -0x1.6db7c047e2975p5 0x0.0p0 F +REG esri:2114 2 OK 0x1.be161e8cc924ep19 0x1.b423e22ec12d4p17 0x0.0p0 0x1.66897e0dbc6ecp7 -0x1.6db7c047e2975p5 0x0.0p0 F +REG esri:2114 3 OK -0x1.81692ede16dfp17 0x1.45e5ebc1deadp20 0x0.0p0 0x1.4c2694265d80ep7 -0x1.1db7c04842f8p5 0x0.0p0 F +REG esri:2114 4 OK 0x1.e6fa4bb785b7cp19 0x1.45e5ebc1deadp20 0x0.0p0 0x1.66897e0df8f79p7 -0x1.1db7c04842f8p5 0x0.0p0 F +REG esri:21148 0 OK 0x1.e847fffffffd4p18 0x1.b99be97710ff4p22 0x0.0p0 0x1.a400000000001p6 -0x1.8fffffffffffdp4 0x0.0p0 F +REG esri:21148 1 OK -0x1.fae88f4d9b94p14 0x1.97066d9483386p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:21148 2 OK 0x1.f81f447a6cd97p19 0x1.97066d9483387p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:21148 3 OK -0x1.2f9470daab5b8p16 0x1.dacdff6eeb515p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:21148 4 OK 0x1.071d470daab3ep20 0x1.dacdff6eeb515p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:21149 0 OK 0x1.e848000000042p18 0x1.b99be97710ff4p22 0x0.0p0 0x1.bcp6 -0x1.8fffffffffffdp4 0x0.0p0 F +REG esri:21149 1 OK -0x1.fae88f4d9b16p14 0x1.97066d9483387p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:21149 2 OK 0x1.f81f447a6cdc1p19 0x1.97066d9483386p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:21149 3 OK -0x1.2f9470daab398p16 0x1.dacdff6eeb515p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:21149 4 OK 0x1.071d470daab56p20 0x1.dacdff6eeb515p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2115 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5a992c5f92c62p7 -0x1.4a320fedcba98p5 0x0.0p0 F +REG esri:2115 1 OK -0x1.b8695cf0a01b4p16 0x1.b35a46b06626cp17 0x0.0p0 0x1.4d4aeafcf39f1p7 -0x1.72320feccc902p5 0x0.0p0 F +REG esri:2115 2 OK 0x1.bdad2b9e14026p19 0x1.b35a46b066274p17 0x0.0p0 0x1.67e76dc231ed1p7 -0x1.72320feccc902p5 0x0.0p0 F +REG esri:2115 3 OK -0x1.830a3f0757f58p17 0x1.45cb840954833p20 0x0.0p0 0x1.4d4aeafcb16e9p7 -0x1.22320fed30153p5 0x0.0p0 F +REG esri:2115 4 OK 0x1.e7628fc1d5fc3p19 0x1.45cb840954834p20 0x0.0p0 0x1.67e76dc2741d9p7 -0x1.22320fed30152p5 0x0.0p0 F +REG esri:21150 0 OK 0x1.e848p18 0x1.b99be97710ff4p22 0x0.0p0 0x1.d4p6 -0x1.8fffffffffffdp4 0x0.0p0 F +REG esri:21150 1 OK -0x1.fae88f4d9b58p14 0x1.97066d9483387p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:21150 2 OK 0x1.f81f447a6cdacp19 0x1.97066d9483387p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:21150 3 OK -0x1.2f9470daab4ap16 0x1.dacdff6eeb515p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:21150 4 OK 0x1.071d470daab4ap20 0x1.dacdff6eeb515p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2116 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5837c048d159fp7 -0x1.4a5159e26af37p5 0x0.0p0 F +REG esri:2116 1 OK -0x1.b8523c58af24cp16 0x1.b354bd6bb6b08p17 0x0.0p0 0x1.4ae8b2bba02f7p7 -0x1.725159e16b647p5 0x0.0p0 F +REG esri:2116 2 OK 0x1.bdaa478b15e4ap19 0x1.b354bd6bb6b08p17 0x0.0p0 0x1.6586cdd602847p7 -0x1.725159e16b647p5 0x0.0p0 F +REG esri:2116 3 OK -0x1.8315b9b89cc38p17 0x1.45cac979bbaffp20 0x0.0p0 0x1.4ae8b2bb5dd61p7 -0x1.225159e1cefeap5 0x0.0p0 F +REG esri:2116 4 OK 0x1.e7656e6e2730ep19 0x1.45cac979bbaffp20 0x0.0p0 0x1.6586cdd644dddp7 -0x1.225159e1cefeap5 0x0.0p0 F +REG esri:2117 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.572987654321p7 -0x1.4e7c048d159e2p5 0x0.0p0 F +REG esri:2117 1 OK -0x1.b536f37004dp16 0x1.b296edbb028d8p17 0x0.0p0 0x1.49beea632f817p7 -0x1.767c048c05f06p5 0x0.0p0 F +REG esri:2117 2 OK 0x1.bd46de6e009bp19 0x1.b296edbb028d8p17 0x0.0p0 0x1.6494246756c0ap7 -0x1.767c048c05f05p5 0x0.0p0 F +REG esri:2117 3 OK -0x1.84a02ae32172p17 0x1.45b1ae66bd0fcp20 0x0.0p0 0x1.49beea62e7858p7 -0x1.267c048c6c441p5 0x0.0p0 F +REG esri:2117 4 OK 0x1.e7c80ab8c85dcp19 0x1.45b1ae66bd0fbp20 0x0.0p0 0x1.649424679ebc8p7 -0x1.267c048c6c441p5 0x0.0p0 F +REG esri:2118 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.57197530eca85p7 -0x1.52ab3c4d5e6f8p5 0x0.0p0 F +REG esri:2118 1 OK -0x1.b20a8c87159b4p16 0x1.b1d629d8e631cp17 0x0.0p0 0x1.49926c79be04ap7 -0x1.7aab3c4c3da8ap5 0x0.0p0 F +REG esri:2118 2 OK 0x1.bce15190e2b36p19 0x1.b1d629d8e631cp17 0x0.0p0 0x1.64a07de81b4bfp7 -0x1.7aab3c4c3da8ap5 0x0.0p0 F +REG esri:2118 3 OK -0x1.86327fc7da3a8p17 0x1.4597f146a1cc4p20 0x0.0p0 0x1.49926c796ffdfp7 -0x1.2aab3c4ca67dbp5 0x0.0p0 F +REG esri:2118 4 OK 0x1.e82c9ff1f68eap19 0x1.4597f146a1cc4p20 0x0.0p0 0x1.64a07de86952bp7 -0x1.2aab3c4ca67dbp5 0x0.0p0 F +REG esri:2119 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5a051eb851eb8p7 -0x1.5582d82d82d82p5 0x0.0p0 F +REG esri:2119 1 OK -0x1.afdaa4a120524p16 0x1.b151f9d37e4f8p17 0x0.0p0 0x1.4c6a586071179p7 -0x1.7d82d82c55e98p5 0x0.0p0 F +REG esri:2119 2 OK 0x1.bc9b5494240a4p19 0x1.b151f9d37e4f8p17 0x0.0p0 0x1.679fe51032bf7p7 -0x1.7d82d82c55e98p5 0x0.0p0 F +REG esri:2119 3 OK -0x1.87476e6a2c364p17 0x1.45862605b4c28p20 0x0.0p0 0x1.4c6a58601eb9bp7 -0x1.2d82d82cc04a5p5 0x0.0p0 F +REG esri:2119 4 OK 0x1.e871db9a8b0d9p19 0x1.45862605b4c28p20 0x0.0p0 0x1.679fe510851d6p7 -0x1.2d82d82cc04a5p5 0x0.0p0 F +REG esri:2120 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5b9a98765431fp7 -0x1.4c5b05b05b05ap5 0x0.0p0 F +REG esri:2120 1 OK -0x1.b6cef654a91a4p16 0x1.b2f82c15113d8p17 0x0.0p0 0x1.4e3e279084c37p7 -0x1.745b05af53b09p5 0x0.0p0 F +REG esri:2120 2 OK 0x1.bd79deca95234p19 0x1.b2f82c15113d8p17 0x0.0p0 -0x1.6708f6a3dc5fap7 -0x1.745b05af53b09p5 0x0.0p0 F +REG esri:2120 3 OK -0x1.83d5e0523e5f4p17 0x1.45be9297c784p20 0x0.0p0 0x1.4e3e27903fb44p7 -0x1.245b05afb8a68p5 0x0.0p0 F +REG esri:2120 4 OK 0x1.e79578148f97dp19 0x1.45be9297c784p20 0x0.0p0 -0x1.6708f6a397506p7 -0x1.245b05afb8a68p5 0x0.0p0 F +REG esri:2121 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.55f59e26af37bp7 -0x1.5716c16c16c17p5 0x0.0p0 F +REG esri:2121 1 OK -0x1.aea0ee8b23c3p16 0x1.b10826472239p17 0x0.0p0 0x1.484fba946c20dp7 -0x1.7f16c16ae2e16p5 0x0.0p0 F +REG esri:2121 2 OK 0x1.bc741dd164796p19 0x1.b10826472239p17 0x0.0p0 0x1.639b81b8f24ebp7 -0x1.7f16c16ae2e16p5 0x0.0p0 F +REG esri:2121 3 OK -0x1.87e277cd8d33cp17 0x1.457c28b76d532p20 0x0.0p0 0x1.484fba941743ap7 -0x1.2f16c16b4e0e1p5 0x0.0p0 F +REG esri:2121 4 OK 0x1.e8989df3634e3p19 0x1.457c28b76d531p20 0x0.0p0 0x1.639b81b9472bdp7 -0x1.2f16c16b4e0e2p5 0x0.0p0 F +REG esri:2122 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.54858bf258bf1p7 -0x1.58e147ae147aep5 0x0.0p0 F +REG esri:2122 1 OK -0x1.ad3a40d454fb8p16 0x1.b0b3f3209c0f8p17 0x0.0p0 0x1.46d2e76a86351p7 -0x1.80e147acd88cbp5 0x0.0p0 F +REG esri:2122 2 OK 0x1.bc47481a8a9e8p19 0x1.b0b3f3209c1p17 0x0.0p0 0x1.6238307a2b491p7 -0x1.80e147acd88cbp5 0x0.0p0 F +REG esri:2122 3 OK -0x1.88939dbfd86a4p17 0x1.4570b868c03dap20 0x0.0p0 0x1.46d2e76a2e6dep7 -0x1.30e147ad44924p5 0x0.0p0 F +REG esri:2122 4 OK 0x1.e8c4e76ff6195p19 0x1.4570b868c03dap20 0x0.0p0 0x1.6238307a83104p7 -0x1.30e147ad44924p5 0x0.0p0 F +REG esri:2123 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.513654320fedcp7 -0x1.5fd27d27d27d4p5 0x0.0p0 F +REG esri:2123 1 OK -0x1.a7b1a65607a1cp16 0x1.af69938970af4p17 0x0.0p0 0x1.4350d79ee0b33p7 -0x1.87d27d267587ep5 0x0.0p0 F +REG esri:2123 2 OK 0x1.bb9634cac0f44p19 0x1.af69938970af4p17 0x0.0p0 0x1.5f1bd0c53f285p7 -0x1.87d27d267587ep5 0x0.0p0 F +REG esri:2123 3 OK -0x1.8b4e1a2f50348p17 0x1.45435c9508be8p20 0x0.0p0 0x1.4350d79e7cc53p7 -0x1.37d27d26e42b3p5 0x0.0p0 F +REG esri:2123 4 OK 0x1.e973868bd40d2p19 0x1.45435c9508be8p20 0x0.0p0 0x1.5f1bd0c5a3165p7 -0x1.37d27d26e42b3p5 0x0.0p0 F +REG esri:2124 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5974320fedcbdp7 -0x1.5cb97530eca87p5 0x0.0p0 F +REG esri:2124 1 OK -0x1.aa2f09d3fec48p16 0x1.affdcbc6623acp17 0x0.0p0 0x1.4ba5ad89739fdp7 -0x1.84b9752f9eccdp5 0x0.0p0 F +REG esri:2124 2 OK 0x1.bbe5e13a7fd7ap19 0x1.affdcbc6623b4p17 0x0.0p0 0x1.6742b69667f7dp7 -0x1.84b9752f9eccdp5 0x0.0p0 F +REG esri:2124 3 OK -0x1.8a140dd1f1428p17 0x1.4557ce6aae484p20 0x0.0p0 0x1.4ba5ad89154adp7 -0x1.34b975300c69p5 0x0.0p0 F +REG esri:2124 4 OK 0x1.e92503747c4f7p19 0x1.4557ce6aae486p20 0x0.0p0 0x1.6742b696c64ccp7 -0x1.34b975300c69p5 0x0.0p0 F +REG esri:2125 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.56b89abcdf01p7 -0x1.5dfd27d27d27dp5 0x0.0p0 F +REG esri:2125 1 OK -0x1.a92be932fe9dcp16 0x1.afc174105bd4p17 0x0.0p0 0x1.48e0c44dedea9p7 -0x1.85fd27d12934bp5 0x0.0p0 F +REG esri:2125 2 OK 0x1.bbc57d265fd4cp19 0x1.afc174105bd38p17 0x0.0p0 0x1.6490712bd0177p7 -0x1.85fd27d12934bp5 0x0.0p0 F +REG esri:2125 3 OK -0x1.8a93c631c6c5p17 0x1.454f80712452ap20 0x0.0p0 0x1.48e0c44d8d55cp7 -0x1.35fd27d19743cp5 0x0.0p0 F +REG esri:2125 4 OK 0x1.e944f18c71b27p19 0x1.454f80712452ap20 0x0.0p0 0x1.6490712c30ac4p7 -0x1.35fd27d19743cp5 0x0.0p0 F +REG esri:2126 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.561d4c3b2a19p7 -0x1.63372ea61d952p5 0x0.0p0 F +REG esri:2126 1 OK -0x1.a4ed693ab2148p16 0x1.aec5b3d16bb0cp17 0x0.0p0 0x1.481e1dd7c3931p7 -0x1.8b372ea4af634p5 0x0.0p0 F +REG esri:2126 2 OK 0x1.bb3dad2756429p19 0x1.aec5b3d16bb0cp17 0x0.0p0 0x1.641c7a9e909efp7 -0x1.8b372ea4af634p5 0x0.0p0 F +REG esri:2126 3 OK -0x1.8caa9e68e55ap17 0x1.452c93483500cp20 0x0.0p0 0x1.481e1dd759298p7 -0x1.3b372ea51edb2p5 0x0.0p0 F +REG esri:2126 4 OK 0x1.e9caa79a39568p19 0x1.452c93483500cp20 0x0.0p0 0x1.641c7a9efb088p7 -0x1.3b372ea51edb2p5 0x0.0p0 F +REG esri:2127 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.52ef5c28f5c29p7 -0x1.65e147ae147aep5 0x0.0p0 F +REG esri:2127 1 OK -0x1.a2b9bfc523048p16 0x1.ae43e5bddd5f4p17 0x0.0p0 0x1.44db9a3db3aadp7 -0x1.8de147ac98394p5 0x0.0p0 F +REG esri:2127 2 OK 0x1.baf737f8a4609p19 0x1.ae43e5bddd5f4p17 0x0.0p0 0x1.61031e1437da5p7 -0x1.8de147ac98394p5 0x0.0p0 F +REG esri:2127 3 OK -0x1.8dbfa8daa13ecp17 0x1.451a636ebb6edp20 0x0.0p0 0x1.44db9a3d43e3ap7 -0x1.3de147ad081abp5 0x0.0p0 F +REG esri:2127 4 OK 0x1.ea0fea36a84fbp19 0x1.451a636ebb6edp20 0x0.0p0 0x1.61031e14a7a18p7 -0x1.3de147ad081abp5 0x0.0p0 F +REG esri:2128 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.50cc16c16c16cp7 -0x1.690fedcba9877p5 0x0.0p0 F +REG esri:2128 1 OK -0x1.a00f9b6d2f96p16 0x1.ada7895296ap17 0x0.0p0 0x1.429f48738bff1p7 -0x1.910fedca1bd9cp5 0x0.0p0 F +REG esri:2128 2 OK 0x1.baa1f36da5f2cp19 0x1.ada7895296ap17 0x0.0p0 0x1.5ef8e50f4c2e8p7 -0x1.910fedca1bd9cp5 0x0.0p0 F +REG esri:2128 3 OK -0x1.8f0e8aa040d7p17 0x1.4504511bc0b08p20 0x0.0p0 0x1.429f487315781p7 -0x1.410fedca8bea5p5 0x0.0p0 F +REG esri:2128 4 OK 0x1.ea63a2a81035cp19 0x1.4504511bc0b08p20 0x0.0p0 0x1.5ef8e50fc2b57p7 -0x1.410fedca8bea5p5 0x0.0p0 F +REG esri:2129 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.4f7a2b3c4d5e7p7 -0x1.6c82468acf135p5 0x0.0p0 F +REG esri:2129 1 OK -0x1.9d217db12150cp16 0x1.acfc832a1a76cp17 0x0.0p0 0x1.4131a313f80c4p7 -0x1.948246892dbadp5 0x0.0p0 F +REG esri:2129 2 OK 0x1.ba442fb6242b2p19 0x1.acfc832a1a764p17 0x0.0p0 0x1.5dc2b364a2b0bp7 -0x1.948246892dbadp5 0x0.0p0 F +REG esri:2129 3 OK -0x1.907e4c8b0e8b4p17 0x1.44ebf7b538f4p20 0x0.0p0 0x1.4131a31379c27p7 -0x1.448246899d933p5 0x0.0p0 F +REG esri:2129 4 OK 0x1.eabf9322c3a3fp19 0x1.44ebf7b538f3fp20 0x0.0p0 0x1.5dc2b36520fa7p7 -0x1.448246899d934p5 0x0.0p0 F +REG esri:21291 0 OK 0x1.86ap18 0x0.0p0 0x0.0p0 -0x1.fp5 0x0.0p0 0x0.0p0 T +REG esri:21291 1 OK -0x1.2e96895585988p17 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 -0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:21291 2 OK 0x1.d245a25561656p19 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 -0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:21291 3 OK -0x1.2e96895585988p17 0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:21291 4 OK 0x1.d245a25561656p19 0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 0x1.3fffffffea4bep2 0x0.0p0 F +REG esri:21292 0 OK 0x1.d4cp14 0x1.24f8p16 0x0.0p0 -0x1.dc7a4fa4fa4fap5 0x1.a5a4fa4fa4fa6p3 0x0.0p0 F +REG esri:21292 1 OK -0x1.060541f9a659ep19 -0x1.cf479375e92cp18 0x0.0p0 -0x1.02c7984b4054bp6 0x1.05a4fa4f911edp3 0x0.0p0 F +REG esri:21292 2 OK 0x1.235141f9a65a4p19 -0x1.cf479375e92cp18 0x0.0p0 -0x1.b3656eb373f5dp5 0x1.05a4fa4f911edp3 0x0.0p0 F +REG esri:21292 3 OK -0x1.f5db7d5cce2d4p18 0x1.36799aa009715p19 0x0.0p0 -0x1.02c7984b5be0ep6 0x1.22d27d27c0acdp4 0x0.0p0 F +REG esri:21292 4 OK 0x1.1839beae6717p19 0x1.36799aa009715p19 0x0.0p0 -0x1.b3656eb33cdd7p5 0x1.22d27d27c0accp4 0x0.0p0 F +REG esri:2130 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5541b4e81b4e7p7 -0x1.6e87654320feep5 0x0.0p0 F +REG esri:2130 1 OK -0x1.9b6445685dcdp16 0x1.ac9774f54b958p17 0x0.0p0 0x1.46e8a1663a63dp7 -0x1.9687654173b9ep5 0x0.0p0 F +REG esri:2130 2 OK 0x1.ba0c88ad0bb9ap19 0x1.ac9774f54b958p17 0x0.0p0 0x1.639ac869fc391p7 -0x1.9687654173b9ep5 0x0.0p0 F +REG esri:2130 3 OK -0x1.915854c503478p17 0x1.44dd7a0a8974ap20 0x0.0p0 0x1.46e8a165b751dp7 -0x1.46876541e3385p5 0x0.0p0 F +REG esri:2130 4 OK 0x1.eaf6153140d1ep19 0x1.44dd7a0a8974ap20 0x0.0p0 0x1.639ac86a7f4bp7 -0x1.46876541e3385p5 0x0.0p0 F +REG esri:2131 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.5490a3d70a3d7p7 -0x1.6ee41fdb97532p5 0x0.0p0 F +REG esri:2131 1 OK -0x1.9affc7e49e89p16 0x1.ac90e1f1e906cp17 0x0.0p0 0x1.463492ddbfcd7p7 -0x1.96e41fd9e7e29p5 0x0.0p0 F +REG esri:2131 2 OK 0x1.b9fff8fc93d12p19 0x1.ac90e1f1e906cp17 0x0.0p0 0x1.62ecb4d054ad7p7 -0x1.96e41fd9e7e29p5 0x0.0p0 F +REG esri:2131 3 OK -0x1.917383f0a29dcp17 0x1.44d988bfc9e06p20 0x0.0p0 0x1.463492dd3bdb2p7 -0x1.46e41fda574c4p5 0x0.0p0 F +REG esri:2131 4 OK 0x1.eafce0fc28a77p19 0x1.44d988bfc9e06p20 0x0.0p0 0x1.62ecb4d0d89fdp7 -0x1.46e41fda574c4p5 0x0.0p0 F +REG esri:2132 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 0x1.50af8091a2b3dp7 -0x1.74ccccccccccdp5 0x0.0p0 F +REG esri:2132 1 OK -0x1.95e2ca474dddp16 0x1.ab59bfb5ee1c4p17 0x0.0p0 0x1.4221a1625de5ap7 -0x1.9ccccccaf890ep5 0x0.0p0 F +REG esri:2132 2 OK 0x1.b95c5948e9bbap19 0x1.ab59bfb5ee1c4p17 0x0.0p0 0x1.5f3d5fc0e7821p7 -0x1.9ccccccaf890ep5 0x0.0p0 F +REG esri:2132 3 OK -0x1.9409619b5d26cp17 0x1.44af692d88dc6p20 0x0.0p0 0x1.4221a161cac53p7 -0x1.4ccccccb65c78p5 0x0.0p0 F +REG esri:2132 4 OK 0x1.eba25866d749bp19 0x1.44af692d88dc6p20 0x0.0p0 0x1.5f3d5fc17aa28p7 -0x1.4ccccccb65c78p5 0x0.0p0 F +REG esri:2133 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.4ap7 -0x1.9p4 0x0.0p0 F +REG esri:2133 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2133 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2133 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2133 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2134 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG esri:2134 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2134 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2134 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2134 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2135 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.62p7 -0x1.9p4 0x0.0p0 F +REG esri:2135 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2135 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2135 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2135 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2136 0 OK 0x1.b7684e4e0da7fp19 -0x1.fd9451ae0520cp9 0x1.5834140bp3 -0x1.0p0 0x1.2aaaaaaaaaaaap2 0x0.0p0 F +REG esri:2136 1 OK -0x1.c81f20992675dp19 -0x1.bb1a88c10a0ccp20 0x1.412205256p5 -0x1.81107a2be1365p2 -0x1.555555553cc5fp-2 0x0.0p0 T +REG esri:2136 2 OK 0x1.4dbbef44e7d6ap21 -0x1.bb1a88c104bc2p20 0x1.193aa1e66p5 0x1.01107a2be18ap2 -0x1.555555553cca5p-2 0x0.0p0 T +REG esri:2136 3 OK -0x1.bb729fb89d0abp19 0x1.bdce426aec912p20 -0x1.c204ffd48p3 -0x1.81107a2c98eaap2 0x1.3555555542434p3 -0x1.8p-29 F +REG esri:2136 4 OK 0x1.4a90cf0a14531p21 0x1.bdce426a5d34bp20 -0x1.2fafaf024p4 0x1.01107a2c9921fp2 0x1.3555555542466p3 -0x1.8p-29 F +REG esri:2137 0 OK 0x1.e840df538e11ap18 -0x1.41de8d51ff90ap8 0x1.244a9404cp5 -0x1.0p0 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:2137 1 OK -0x1.ada2c16733c1p15 -0x1.0f0b316d4a575p19 0x1.0b33c0475p6 -0x1.7ffffffe257d3p2 -0x1.3fffffffea97dp2 -0x1.0p-30 F +REG esri:2137 2 OK 0x1.018d85b00b1cdp20 -0x1.0f0b316d1b61bp19 0x1.eec882b6ap5 0x1.fffffffc4b8ecp1 -0x1.3fffffffea9bdp2 -0x1.8p-28 F +REG esri:2137 3 OK -0x1.adac92c0244bp15 0x1.0ebaba77715d1p19 0x1.557a0c67p3 -0x1.7ffffffe255f4p2 0x1.3fffffffea9ddp2 -0x1.0p-30 F +REG esri:2137 4 OK 0x1.018dd438c46ap20 0x1.0ebaba7742828p19 0x1.6dfb7207p2 0x1.fffffffc4b53p1 0x1.3fffffffeaa1ap2 -0x1.4p-28 F +REG esri:2138 0 OK 0x0.0p0 0x1.b11f4b13029bdp19 0x0.0p0 -0x1.12p6 0x1.9fffffffffb6bp5 0x0.0p0 F +REG esri:2138 1 OK -0x1.0b3ba5eb1ae96p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.27fffffffffd6p5 0x0.0p0 F +REG esri:2138 2 OK 0x1.0b3ba5eb1ae97p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.611672e32a5cdp5 0x1.27fffffffffd6p5 0x0.0p0 F +REG esri:2138 3 OK -0x1.053679725c65fp20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff5p6 0x0.0p0 F +REG esri:2138 4 OK 0x1.053679725c66p20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.611672e32a5cdp5 0x1.0bffffffffff5p6 0x0.0p0 F +REG esri:2139 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG esri:2139 1 OK -0x1.e8f08b04c4de4p17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2139 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2139 3 OK -0x1.e8f08b04c4de4p17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2139 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2140 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG esri:2140 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2140 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2140 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2140 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2141 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2141 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2141 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2141 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2141 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:21413 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:21413 1 OK 0x1.8b0b3bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21413 2 OK 0x1.acee4401dc87bp23 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21413 3 OK 0x1.8b0b3bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21413 4 OK 0x1.acee4401dc87bp23 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21414 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:21414 1 OK 0x1.a98fbbfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21414 2 OK 0x1.cb72c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21414 3 OK 0x1.a98fbbfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21414 4 OK 0x1.cb72c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21415 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:21415 1 OK 0x1.c8143bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21415 2 OK 0x1.e9f74401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21415 3 OK 0x1.c8143bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21415 4 OK 0x1.e9f74401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21416 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:21416 1 OK 0x1.e698bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21416 2 OK 0x1.043de200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21416 3 OK 0x1.e698bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21416 4 OK 0x1.043de200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21417 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:21417 1 OK 0x1.028e9dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21417 2 OK 0x1.13802200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21417 3 OK 0x1.028e9dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21417 4 OK 0x1.13802200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21418 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:21418 1 OK 0x1.11d0ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21418 2 OK 0x1.22c26200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21418 3 OK 0x1.11d0ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21418 4 OK 0x1.22c26200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21419 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:21419 1 OK 0x1.21131dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21419 2 OK 0x1.3204a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21419 3 OK 0x1.21131dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21419 4 OK 0x1.3204a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2142 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG esri:2142 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2142 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2142 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2142 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:21420 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:21420 1 OK 0x1.30555dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21420 2 OK 0x1.4146e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21420 3 OK 0x1.30555dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21420 4 OK 0x1.4146e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21421 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:21421 1 OK 0x1.3f979dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21421 2 OK 0x1.50892200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21421 3 OK 0x1.3f979dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21421 4 OK 0x1.50892200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21422 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:21422 1 OK 0x1.4ed9ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21422 2 OK 0x1.5fcb6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21422 3 OK 0x1.4ed9ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21422 4 OK 0x1.5fcb6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21423 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:21423 1 OK 0x1.5e1c1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21423 2 OK 0x1.6f0da200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21423 3 OK 0x1.5e1c1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21423 4 OK 0x1.6f0da200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2143 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG esri:2143 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2143 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2143 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2143 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2144 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG esri:2144 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2144 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2144 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2144 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2145 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG esri:2145 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2145 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2145 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2145 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:21453 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:21453 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21453 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21453 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21453 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21454 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:21454 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21454 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21454 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21454 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21455 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:21455 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21455 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21455 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21455 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21456 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:21456 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21456 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21456 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21456 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21457 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:21457 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21457 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21457 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21457 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21458 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:21458 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21458 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21458 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21458 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21459 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:21459 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21459 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21459 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21459 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2146 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG esri:2146 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2146 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2146 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2146 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:21460 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:21460 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21460 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21460 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21460 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21461 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:21461 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21461 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21461 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21461 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21462 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:21462 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21462 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21462 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21462 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21463 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:21463 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21463 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21463 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21463 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2147 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG esri:2147 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2147 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2147 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2147 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:21473 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:21473 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21473 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21473 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21473 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21474 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:21474 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21474 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21474 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21474 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21475 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:21475 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21475 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21475 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21475 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21476 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:21476 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21476 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21476 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21476 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21477 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:21477 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21477 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21477 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21477 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21478 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:21478 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21478 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21478 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21478 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21479 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:21479 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21479 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21479 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21479 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2148 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2148 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG esri:2148 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG esri:2148 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG esri:2148 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG esri:21480 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:21480 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21480 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21480 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21480 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21481 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:21481 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21481 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21481 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21481 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21482 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:21482 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21482 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21482 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21482 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:21483 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:21483 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21483 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21483 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:21483 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2149 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2149 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:2149 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG esri:2149 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:2149 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG esri:2150 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2150 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG esri:2150 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG esri:2150 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG esri:2150 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG esri:21500 0 OK -0x1.cf93f523539e8p14 0x1.1ec7e4d152f2fp21 0x0.0p0 0x1.178ce703afb7fp2 0x1.17aaaaaaaaaa8p6 0x0.0p0 F +REG esri:21500 1 OK -0x1.4d30035af5dbbp21 0x1.841555a966164p20 0x0.0p0 -0x1.3a844271f488dp5 0x1.b7555555552dbp5 0x0.0p0 F +REG esri:21500 2 OK 0x1.38c7a82bc001ep21 0x1.37fed6572b10ap20 0x0.0p0 0x1.80677c32e076cp5 0x1.b7555555552dbp5 0x0.0p0 F +REG esri:21500 3 OK -0x1.d853dd2899d54p18 0x1.16690060969cfp22 0x0.0p0 -0x1.3a844271f488bp5 0x1.53aaaaaaaaaaap6 0x0.0p0 F +REG esri:21500 4 OK 0x1.4c72db8fd25c8p19 0x1.12396169a8da8p22 0x0.0p0 0x1.80677c32e076fp5 0x1.53aaaaaaaaaabp6 0x0.0p0 F +REG esri:2151 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2151 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG esri:2151 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG esri:2151 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG esri:2151 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG esri:2152 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2152 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG esri:2152 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG esri:2152 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG esri:2152 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG esri:2153 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2153 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG esri:2153 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG esri:2153 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG esri:2153 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG esri:2154 0 OK 0x1.55ccp19 0x1.92d5p22 0x0.0p0 0x1.8000000000001p1 0x1.73ffffffffff7p5 0x0.0p0 F +REG esri:2154 1 OK 0x1.6a0cf44086008p16 0x1.729e7bddea80fp22 0x0.0p0 -0x1.10e06f120d01fp2 0x1.4bfffffffffecp5 0x0.0p0 F +REG esri:2154 2 OK 0x1.3f2b30bbf7ap20 0x1.729e7bddea80fp22 0x0.0p0 0x1.487037890681p3 0x1.4bfffffffffecp5 0x0.0p0 F +REG esri:2154 3 OK 0x1.7c86bcd6a7b4ep17 0x1.b6337589211cap22 0x0.0p0 -0x1.10e06f120d01fp2 0x1.9bffffffffb4p5 0x0.0p0 F +REG esri:2154 4 OK 0x1.263b28652b096p20 0x1.b6337589211cap22 0x0.0p0 0x1.487037890680fp3 0x1.9bffffffffb4p5 0x0.0p0 F +REG esri:2155 0 OK 0x1.e896ef9e5849dp18 -0x1.ca9b9a70befd9p10 -0x1.3e6f98da9p6 0x1.54p7 -0x1.c888888888667p3 -0x1.0p-29 F +REG esri:2155 1 OK -0x1.39e43faf5081fp20 -0x1.c111d0254233bp20 -0x1.272110cdp5 0x1.49ae8908a9a94p7 -0x1.344444444432bp4 0x1.0p-29 F +REG esri:2155 2 OK 0x1.1717dc9f698dep21 -0x1.c111835451014p20 -0x1.48d8bf8f4p4 0x1.5e5176f75656dp7 -0x1.3444444444333p4 0x0.0p0 F +REG esri:2155 3 OK -0x1.4d94abab14a08p20 0x1.b616693c98a0fp20 -0x1.0d44fe2fp7 0x1.49ae8908a9a94p7 -0x1.28888888886c5p3 0x1.0p-30 F +REG esri:2155 4 OK 0x1.20f0109d2918ap21 0x1.b6161c02be017p20 -0x1.d6360054fp6 0x1.5e5176f75656dp7 -0x1.28888888886dcp3 -0x1.0p-30 F +REG esri:2156 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.56p7 -0x1.9p4 0x0.0p0 F +REG esri:2156 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2156 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2156 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2156 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2157 0 OK 0x1.24f8p19 0x1.6e36p19 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG esri:2157 1 OK -0x1.454499d35e9cp14 0x1.bd79609950d2ap17 0x0.0p0 -0x1.067e6c224688ap4 0x1.83fffffbf6bf5p5 0x0.0p0 F +REG esri:2157 2 OK 0x1.2a0d12674d7a7p20 0x1.bd79609950d2ap17 0x0.0p0 0x1.9f9b0891a2273p-2 0x1.83fffffbf6bf5p5 0x0.0p0 F +REG esri:2157 3 OK 0x1.b0b75b8629ca8p16 0x1.467cba23ee39p20 0x0.0p0 -0x1.067e6c148101dp4 0x1.d3fffffc3a92fp5 0x0.0p0 F +REG esri:2157 4 OK 0x1.09ec8a479d636p20 0x1.467cba23ee39p20 0x0.0p0 0x1.9f9b052040732p-2 0x1.d3fffffc3a92fp5 0x0.0p0 F +REG esri:2158 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:2158 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG esri:2158 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG esri:2158 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG esri:2158 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG esri:2159 0 OK 0x1.e847fffffffffp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p3 0x1.aaaaaaaaaaaabp2 0x0.0p0 F +REG esri:2159 1 OK -0x1.47323ffac7633p20 -0x1.ba48610fd4fb2p20 0x0.0p0 -0x1.108b6bcfeaad5p4 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG esri:2159 2 OK 0x1.1dab1ffd63b1ap21 -0x1.ba48610fd4fb2p20 0x0.0p0 -0x1.bdd250c0554abp2 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG esri:2159 3 OK -0x1.3e1d53111cea5p20 0x1.bedd9e4a4c215p20 0x0.0p0 -0x1.108b6bd02abe3p4 0x1.755555553efd7p3 0x0.0p0 F +REG esri:2159 4 OK 0x1.1920a9888e753p21 0x1.bedd9e4a4c215p20 0x0.0p0 -0x1.bdd250bf55075p2 0x1.755555553efd7p3 0x0.0p0 F +REG esri:2160 0 OK 0x1.86a0000000002p19 0x1.24f8000000001p19 0x0.0p0 -0x1.8000000000001p3 0x1.aaaaaaaaaaaabp2 0x0.0p0 F +REG esri:2160 1 OK -0x1.fbe87ff58ec64p19 -0x1.27cc610fd4fb2p20 0x0.0p0 -0x1.108b6bcfeaad5p4 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG esri:2160 2 OK 0x1.424a1ffd63b1ap21 -0x1.27cc610fd4fb2p20 0x0.0p0 -0x1.bdd250c0554acp2 0x1.aaaaaaaa8bab7p0 0x0.0p0 F +REG esri:2160 3 OK -0x1.e9bea62239d48p19 0x1.28accf252610bp21 0x0.0p0 -0x1.108b6bd02abe3p4 0x1.755555553efd8p3 0x0.0p0 F +REG esri:2160 4 OK 0x1.3dbfa9888e754p21 0x1.28accf252610bp21 0x0.0p0 -0x1.bdd250bf55075p2 0x1.755555553efd8p3 0x0.0p0 F +REG esri:2161 0 OK 0x1.e84cb9e9a32bfp18 -0x1.93d70e74db30ap6 -0x1.a1b7fbd9p4 -0x1.dfffffffffffep3 0x0.0p0 0x0.0p0 T +REG esri:2161 1 OK -0x1.ad51fa14bd07p15 -0x1.0ef0478bfcdbbp19 -0x1.0f40b929cp4 -0x1.4p4 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2161 2 OK 0x1.0190ecc933de8p20 -0x1.0ef0478c1c38p19 -0x1.b56a86f48p3 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2161 3 OK -0x1.ad550e71959ep15 0x1.0ed70a527a574p19 -0x1.147bcd4d8p5 -0x1.4p4 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:2161 4 OK 0x1.0191056c8817ep20 0x1.0ed70a5299adfp19 -0x1.f46c1b598p4 -0x1.3ffffffffffffp3 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2162 0 OK 0x1.e84a73f11c46bp18 -0x1.93d7082a9b42bp6 -0x1.89a1482a4p4 -0x1.2p3 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG esri:2162 1 OK -0x1.ad63e70fffcdp15 -0x1.0ef04351036a6p19 -0x1.d56b91fp3 -0x1.c000000000001p3 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:2162 2 OK 0x1.01905932fe868p20 -0x1.0ef0435113b11p19 -0x1.9ee104878p3 -0x1.0000000000001p2 -0x1.3fffffffffffdp2 -0x1.0p-29 F +REG esri:2162 3 OK -0x1.ad66fb6ffe1ap15 0x1.0ed70617e4bd7p19 -0x1.023651e08p5 -0x1.c000000000003p3 0x1.4p2 -0x1.0p-29 F +REG esri:2162 4 OK 0x1.019071d637479p20 0x1.0ed70617f5014p19 -0x1.e92758154p4 -0x1.ffffffffffffdp1 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG esri:2163 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG esri:2163 1 OK -0x1.25efa53e11a82p19 -0x1.02d3143da8abep19 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:2163 2 OK 0x1.25efa53e11a82p19 -0x1.02d3143da8abep19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:2163 3 OK -0x1.ed3389a61b7abp18 0x1.1a650a24bbb2fp19 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG esri:2163 4 OK 0x1.ed3389a61b7abp18 0x1.1a650a24bbb2fp19 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG esri:2164 0 OK 0x1.e83d873bc12cep18 -0x1.d2cfdbba70f0ep8 0x1.10414d14p4 -0x1.4p2 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG esri:2164 1 OK -0x1.adbe7f77ce0cp15 -0x1.0f1d8938e3385p19 0x1.f83207b4ap5 -0x1.3fffffff0f8f3p3 -0x1.3fffffffea456p2 -0x1.0p-30 F +REG esri:2164 2 OK 0x1.018cb7930b28ep20 -0x1.0f1d89389d9bdp19 0x1.bdfc1c128p5 -0x1.e073285a72cc1p-30 -0x1.3fffffffea4bp2 -0x1.0p-29 F +REG esri:2164 3 OK -0x1.adccbcfe2dbap15 0x1.0ea8d641abf39p19 -0x1.262df9e98p4 -0x1.3fffffff0f794p3 0x1.3fffffffea4dep2 0x0.0p0 F +REG esri:2164 4 OK 0x1.018d297adcd1ep20 0x1.0ea8d6416691ap19 -0x1.9a9a33398p4 -0x1.e09f14ddde752p-30 0x1.3fffffffea53ap2 -0x1.0p-28 F +REG esri:2165 0 OK 0x1.e83d85e52812p18 -0x1.d29a1fdd4969p8 0x1.0c6df063cp4 -0x1.3ffffffffffffp2 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:2165 1 OK -0x1.adbe959e3438p15 -0x1.0f1d832d6ef4dp19 0x1.f62a4df2cp5 -0x1.3fffffff0f8f4p3 -0x1.3fffffffea456p2 0x1.0p-30 F +REG esri:2165 2 OK 0x1.018cb798f0bb6p20 -0x1.0f1d832d294f8p19 0x1.bbecf1dc8p5 -0x1.e073308e67022p-30 -0x1.3fffffffea4bp2 -0x1.8p-29 F +REG esri:2165 3 OK -0x1.adccd1810d97p15 0x1.0ea8dda5121efp19 -0x1.29a77da74p4 -0x1.3fffffff0f793p3 0x1.3fffffffea4e1p2 -0x1.0p-30 F +REG esri:2165 4 OK 0x1.018d2973a623dp20 0x1.0ea8dda4ccb43p19 -0x1.9e2297e04p4 -0x1.e09f2b654813p-30 0x1.3fffffffea539p2 -0x1.8p-29 F +REG esri:2166 0 OK 0x1.ab430a190c9d1p21 0x1.5913ed0a9d9acp6 -0x1.dde889771p6 0x1.1fffffffff1a9p3 -0x1.e00b9ddf5b21bp-39 0x1.8f88p-17 T +REG esri:2166 1 OK 0x1.677cf1a79c40bp21 -0x1.0ef58efdc0579p19 -0x1.150d0be838p7 0x1.00000001d58dcp2 -0x1.3fffffffea3d9p2 0x1.9048p-17 F +REG esri:2166 2 OK 0x1.ef09236def97bp21 -0x1.0ef58da152addp19 -0x1.d31c79e9cp6 0x1.bfffffff13dap3 -0x1.3fffffffec4ebp2 0x1.8d08p-17 F +REG esri:2166 3 OK 0x1.677cfc476b96cp21 0x1.0f0b1cb6bb148p19 -0x1.e898c9fp6 0x1.00000001d36cdp2 0x1.3fffffffea796p2 0x1.90d8p-17 F +REG esri:2166 4 OK 0x1.ef0917210a347p21 0x1.0f0b2201373d3p19 -0x1.919b1b039p6 0x1.bfffffff12d5p3 0x1.3fffffffe861bp2 0x1.83dp-17 F +REG esri:2167 0 OK 0x1.12aa854bd113ep22 0x1.593ec2addd59cp6 -0x1.c3aa69102p6 0x1.7ffffffffe82p3 -0x1.92008a2ac7ed9p-38 0x1.8c28p-17 T +REG esri:2167 1 OK 0x1.e18ef6fced6bp21 -0x1.0ef57c5657b24p19 -0x1.080a3e9d9p7 0x1.c0000001d454ep2 -0x1.3fffffffeadefp2 0x1.9128p-17 F +REG esri:2167 2 OK 0x1.348d8fd30d9f2p22 -0x1.0ef578bb6d226p19 -0x1.b90bec395p6 0x1.0fffffff89a4p4 -0x1.3fffffffecf63p2 0x1.886p-17 F +REG esri:2167 3 OK 0x1.e18f010c6daeep21 0x1.0f0b0a7e3364p19 -0x1.ce9331c59p6 0x1.c0000001d234ap2 0x1.3fffffffe9da1p2 0x1.8ec8p-17 F +REG esri:2167 4 OK 0x1.348d896473678p22 0x1.0f0b12072b6f9p19 -0x1.778a7a4ccp6 0x1.0fffffff89232p4 0x1.3fffffffe7ce6p2 0x1.7c38p-17 F +REG esri:2168 0 OK 0x1.4fb3842b6a9ffp22 0x1.597f2dee6f1d7p6 -0x1.a9722d98p6 0x1.dffffffffdedap3 -0x1.197095cd03ce5p-37 0x1.8708p-17 T +REG esri:2168 1 OK 0x1.2dd07cc8a939bp22 -0x1.0ef569047361ap19 -0x1.f5f63668p6 0x1.40000000e98f6p3 -0x1.3fffffffeb827p2 0x1.908p-17 F +REG esri:2168 2 OK 0x1.71968c8fb48fap22 -0x1.0ef5632ef428cp19 -0x1.9f1fc410ep6 0x1.3fffffff895e3p4 -0x1.3fffffffed9eap2 0x1.822p-17 F +REG esri:2168 3 OK 0x1.2dd08188c0511p22 0x1.0f0af8f8729ebp19 -0x1.b474e6e8dp6 0x1.40000000e8805p3 0x1.3fffffffe93ddp2 0x1.8b08p-17 F +REG esri:2168 4 OK 0x1.719685d9702f8p22 0x1.0f0b02bbfd332p19 -0x1.5d9e38c4ap6 0x1.3fffffff88df3p4 0x1.3fffffffe73fap2 0x1.7308p-17 F +REG esri:2169 0 OK 0x1.3816ee13e6d73p16 0x1.862955e2dc30cp16 -0x1.7f3405534p5 0x1.8aaaaab4cd51ap2 0x1.8eaaaaaa01371p5 0x1.087dap-9 F +REG esri:2169 1 OK -0x1.044cd9de7e8f8p19 -0x1.a0adab96b7b12p18 -0x1.5f45d10f8p5 -0x1.95c9ed1ec6d53p0 0x1.66aaaaa7b1f11p5 0x1.03d768p-9 F +REG esri:2169 2 OK 0x1.52518b8f864f5p19 -0x1.a0afbe9acc5fap18 -0x1.93aec387cp5 0x1.bd63e85698d41p3 0x1.66aaaaa7cdcd3p5 0x1.21b4e8p-9 F +REG esri:2169 3 OK -0x1.97ec0f9a0a311p18 0x1.4de8a92915862p19 -0x1.8c9119a64p5 -0x1.95c9ec933046ap0 0x1.b6aaaaa76507p5 0x1.d5921p-10 F +REG esri:2169 4 OK 0x1.19fce8bd1df07p19 0x1.4de7947267019p19 -0x1.b71c6bf8ap5 0x1.bd63e849e050dp3 0x1.b6aaaaa75ec0bp5 0x1.0a05d8p-9 F +REG esri:2170 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2170 1 OK -0x1.ae414562ae59p15 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.40000000e96ep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2170 2 OK 0x1.01960a2b1572ep20 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2170 3 OK -0x1.ae414562ae59p15 0x1.0ef1827dc6854p19 0x0.0p0 0x1.40000000e96ep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2170 4 OK 0x1.01960a2b1572ep20 0x1.0ef1827dc6854p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2171 0 OK 0x1.1b070f0ec95ddp22 0x1.58aade0a2add7p22 -0x1.f975b7ec4p4 0x1.515555555069ep4 0x1.94ffffffefa08p5 0x1.9f81p-14 T +REG esri:2171 1 OK 0x1.eaff23bb6a164p21 0x1.38a52d164f129p22 -0x1.8683ca53cp5 0x1.a6750a37c34dfp3 0x1.6cfffffff2383p5 0x1.c55ep-14 T +REG esri:2171 2 OK 0x1.408e8268ed264p22 0x1.38a528197880bp22 -0x1.443caf818p4 0x1.cf70258ec1867p4 0x1.6cfffffff1e14p5 0x1.be86p-14 T +REG esri:2171 3 OK 0x1.f969dee155ddep21 0x1.7c51826a344e3p22 -0x1.47c4aa71p5 0x1.a6750a37c13b9p3 0x1.bcffffffee37ep5 0x1.7a21p-14 T +REG esri:2171 4 OK 0x1.3959397bc9c4bp22 0x1.7c5174f4043dbp22 -0x1.1ebc0ac64p4 0x1.cf70258ebd2d5p4 0x1.bcffffffee317p5 0x1.7269p-14 T +REG esri:2172 0 OK 0x1.18f3d0bf612bfp22 0x1.625f2eedbb0bfp22 -0x1.dcada9828p4 0x1.580b60b60599cp4 0x1.a803fb72d9496p5 0x1.8cc3p-14 T +REG esri:2172 1 OK 0x1.e63743ccb6169p21 0x1.42881e25cee72p22 -0x1.766d6ae56p5 0x1.a636e8f72ebc6p3 0x1.8003fb72daf8cp5 0x1.b53bp-14 T +REG esri:2172 2 OK 0x1.3ecbf50df2577p22 0x1.42881841e735ep22 -0x1.20cbb8d2cp4 0x1.dcfb4cf07685p4 0x1.8003fb72daae7p5 0x1.ad67p-14 T +REG esri:2172 3 OK 0x1.f5ec5635837d6p21 0x1.8629291dd6f75p22 -0x1.3b170fe6p5 0x1.a636e8f72c6e4p3 0x1.d003fb72d809cp5 0x1.65d9p-14 T +REG esri:2172 4 OK 0x1.36f1820eed927p22 0x1.86291b2beabf2p22 -0x1.09d2a95ep4 0x1.dcfb4cf0717cap4 0x1.d003fb72d817dp5 0x1.5d77p-14 T +REG esri:2173 0 OK 0x1.ab622c263299dp21 0x1.6e26ee383bc8bp22 -0x1.23fe8fd14p5 0x1.102222221e3ap4 0x1.acaaaaaa996e9p5 0x1.89f4p-14 T +REG esri:2173 1 OK 0x1.5f87bd54b89bep21 0x1.4e5c3d9bbb129p22 -0x1.b28d898b6p5 0x1.12bfbb2c3754dp3 0x1.84aaaaaa9b115p5 0x1.b18ap-14 T +REG esri:2173 2 OK 0x1.f73c85a927697p21 0x1.4e5c379ebe80dp22 -0x1.93f94e5f4p4 0x1.96e466ae229bp4 0x1.84aaaaaa9ae2p5 0x1.ac48p-14 T +REG esri:2173 3 OK 0x1.6f93251a952f3p21 0x1.91f9f33673a63p22 -0x1.6a818423p5 0x1.12bfbb2c373d8p3 0x1.d4aaaaaa98321p5 0x1.613cp-14 T +REG esri:2173 4 OK 0x1.e7314ad224c5ap21 0x1.91f9e52c9b744p22 -0x1.667d24cp4 0x1.96e466ae1e743p4 0x1.d4aaaaaa983e6p5 0x1.5baap-14 T +REG esri:2174 0 OK 0x1.c40aa8d81c85ap21 0x1.577279834094ap22 -0x1.31b416a3ap5 0x1.0ac16c16be092p4 0x1.9d5dddddcd344p5 0x1.9937p-14 T +REG esri:2174 1 OK 0x1.78b6a0751c65fp21 0x1.37808a011234cp22 -0x1.c16919c16p5 0x1.13855653050abp3 0x1.755dddddcf9ccp5 0x1.bed7p-14 T +REG esri:2174 2 OK 0x1.07af4e8590bfp22 0x1.378084bdbc091p22 -0x1.b4a99c32p4 0x1.8bc02d03fb285p4 0x1.755dddddcf66bp5 0x1.ba2cp-14 T +REG esri:2174 3 OK 0x1.87ae762ab7e69p21 0x1.7b285f2a5e088p22 -0x1.76fd9efb8p5 0x1.1385565304f29p3 0x1.c55dddddcbd31p5 0x1.71bcp-14 T +REG esri:2174 4 OK 0x1.003378e1de7c5p22 0x1.7b2851818bd09p22 -0x1.7be66bf8p4 0x1.8bc02d03f782bp4 0x1.c55dddddcbd39p5 0x1.6c96p-14 T +REG esri:2175 0 OK 0x1.cf21b33195becp17 -0x1.1edc4692d6018p22 -0x1.5a673e9d2p6 0x1.2f5555555787fp4 0x1.c0d5d8180a6f1p-32 0x1.c2bp-14 T +REG esri:2175 1 OK -0x1.369cd90e86828p18 -0x1.40bc2917cfb61p22 -0x1.a97ef19e3p6 0x1.beaaaaab97a4p3 -0x1.3fffffff682f3p2 0x1.9cb8p-14 F +REG esri:2175 2 OK 0x1.82df83fabd353p19 -0x1.40bc1fd6e4a65p22 -0x1.41a8e1adap6 0x1.7f555554e3c2ep4 -0x1.3fffffff6b718p2 0x1.a2f6p-14 F +REG esri:2175 3 OK -0x1.369d09c51623ap18 -0x1.f9f8d778df227p21 -0x1.744a7b738p6 0x1.beaaaaab96ad6p3 0x1.4000000047f02p2 0x1.df11p-14 F +REG esri:2175 4 OK 0x1.82df21236a2adp19 -0x1.f9f8cb54de3abp21 -0x1.0c722ff6cp6 0x1.7f555554e272ep4 0x1.4000000044045p2 0x1.e331p-14 F +REG esri:2176 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2176 1 OK 0x1.2dcf4893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.40000000ea80dp3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2176 2 OK 0x1.7193b76c0b97p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2176 3 OK 0x1.2dcf4893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.40000000ea80dp3 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2176 4 OK 0x1.7193b76c0b97p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2177 0 OK 0x1.8cba8p22 0x0.0p0 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG esri:2177 1 OK 0x1.6ad84893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.a0000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2177 2 OK 0x1.ae9cb76c0b97p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.6fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2177 3 OK 0x1.6ad84893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.a0000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2177 4 OK 0x1.ae9cb76c0b97p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.6fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2178 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2178 1 OK 0x1.a7e14893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.0000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2178 2 OK 0x1.eba5b76c0b97p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.9fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2178 3 OK 0x1.a7e14893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.0000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2178 4 OK 0x1.eba5b76c0b97p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.9fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:21780 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21780 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21780 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21780 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21780 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21781 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21781 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21781 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21781 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:21781 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2179 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:2179 1 OK 0x1.e4ea4893f469p22 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2179 2 OK 0x1.14575bb605cb8p23 -0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.cfffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2179 3 OK 0x1.e4ea4893f469p22 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2179 4 OK 0x1.14575bb605cb8p23 0x1.0ef9c3f11c8acp19 0x0.0p0 0x1.cfffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2180 0 OK 0x1.e848p18 -0x1.437c8p22 0x0.0p0 0x1.3p4 0x0.0p0 0x0.0p0 T +REG esri:2180 1 OK -0x1.ac27f0e7f9bbp15 -0x1.6556516e3b3ep22 0x0.0p0 0x1.c0000000ea80fp3 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG esri:2180 2 OK 0x1.01853f873fcdep20 -0x1.6556516e3b3ep22 0x0.0p0 0x1.7fffffff8abf9p4 -0x1.3fffffffeae0ep2 0x0.0p0 F +REG esri:2180 3 OK -0x1.ac27f0e7f9bbp15 -0x1.21a2ae91c4c2p22 0x0.0p0 0x1.c0000000ea80fp3 0x1.3fffffffeae0ep2 0x0.0p0 F +REG esri:2180 4 OK 0x1.01853f873fcdep20 -0x1.21a2ae91c4c2p22 0x0.0p0 0x1.7fffffff8abf9p4 0x1.3fffffffeae0ep2 0x0.0p0 F +REG esri:21817 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:21817 1 OK -0x1.ada0e5629f81p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.58p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:21817 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:21817 3 OK -0x1.ada0e5629f81p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.58p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:21817 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:21818 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:21818 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:21818 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.18p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:21818 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:21818 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.18p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:2188 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2188 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2188 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.c000000000001p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2188 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2188 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.c000000000001p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2189 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2189 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2189 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2189 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2189 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:21891 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.3452dbd194238p6 0x1.2656ca290d0fdp2 0x0.0p0 F +REG esri:21891 1 OK 0x1.ae8b300b1d072p18 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.486365b0dff33p6 -0x1.9a935d6f11ebbp-2 0x0.0p0 T +REG esri:21891 2 OK 0x1.7ca533fd38bdep20 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.204251f24853dp6 -0x1.9a935d6f11ebcp-2 0x0.0p0 T +REG esri:21891 3 OK 0x1.b629edfdca09cp18 0x1.7c2060546af66p20 0x0.0p0 -0x1.486365b0eb38bp6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21891 4 OK 0x1.7abd84808d7d3p20 0x1.7c2060546af66p20 0x0.0p0 -0x1.204251f23d0e5p6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21892 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.2852dbd194238p6 0x1.2656ca290d0fdp2 0x0.0p0 F +REG esri:21892 1 OK 0x1.ae8b300b1d08ap18 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.3c6365b0dff33p6 -0x1.9a935d6f11ebcp-2 0x0.0p0 T +REG esri:21892 2 OK 0x1.7ca533fd38bdep20 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.144251f24853ep6 -0x1.9a935d6f11ebcp-2 0x0.0p0 T +REG esri:21892 3 OK 0x1.b629edfdca0b4p18 0x1.7c2060546af66p20 0x0.0p0 -0x1.3c6365b0eb38bp6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21892 4 OK 0x1.7abd84808d7d3p20 0x1.7c2060546af66p20 0x0.0p0 -0x1.144251f23d0e6p6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21893 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.1c52dbd194238p6 0x1.2656ca290d0fdp2 0x0.0p0 F +REG esri:21893 1 OK 0x1.ae8b300b1d08ap18 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.306365b0dff33p6 -0x1.9a935d6f11ebcp-2 0x0.0p0 T +REG esri:21893 2 OK 0x1.7ca533fd38bdep20 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.084251f24853dp6 -0x1.9a935d6f11ebcp-2 0x0.0p0 T +REG esri:21893 3 OK 0x1.b629edfdca0b4p18 0x1.7c2060546af66p20 0x0.0p0 -0x1.306365b0eb38bp6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21893 4 OK 0x1.7abd84808d7d3p20 0x1.7c2060546af66p20 0x0.0p0 -0x1.084251f23d0e6p6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21894 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.1052dbd194238p6 0x1.2656ca290d0fdp2 0x0.0p0 F +REG esri:21894 1 OK 0x1.ae8b300b1d072p18 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.246365b0dff33p6 -0x1.9a935d6f11ebbp-2 0x0.0p0 T +REG esri:21894 2 OK 0x1.7ca533fd38bdep20 0x1.b476ffa7fc376p18 0x0.0p0 -0x1.f884a3e490a7ap5 -0x1.9a935d6f11ebcp-2 0x0.0p0 T +REG esri:21894 3 OK 0x1.b629edfdca09cp18 0x1.7c2060546af66p20 0x0.0p0 -0x1.246365b0eb38bp6 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:21894 4 OK 0x1.7abd84808d7d3p20 0x1.7c2060546af66p20 0x0.0p0 -0x1.f884a3e47a1cap5 0x1.332b651473ad1p3 0x0.0p0 F +REG esri:2190 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2190 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2190 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2190 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2190 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2191 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2191 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2191 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2191 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2191 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:2192 0 OK 0x1.24f8p19 0x1.0c8ep21 0x0.0p0 0x1.2b2a53490b9bp1 0x1.766666666665ep5 0x0.0p0 F +REG esri:2192 1 OK -0x1.054ac56ee114p13 0x1.9837b4301404cp20 0x0.0p0 -0x1.3de1330a236dbp2 0x1.4e6666666665p5 0x0.0p0 F +REG esri:2192 2 OK 0x1.2702958addc22p20 0x1.9837b4301404cp20 0x0.0p0 0x1.3485c32997845p3 0x1.4e6666666665p5 0x0.0p0 F +REG esri:2192 3 OK 0x1.72c654a0b10cp16 0x1.536265a049758p21 0x0.0p0 -0x1.3de1330a236dbp2 0x1.9e666666661cep5 0x0.0p0 F +REG esri:2192 4 OK 0x1.0dcb9ab5f4ef4p20 0x1.536265a049758p21 0x0.0p0 0x1.3485c32997846p3 0x1.9e666666661cep5 0x0.0p0 F +REG esri:2193 0 OK 0x1.86ap20 0x1.312dp23 0x0.0p0 0x1.5ap7 0x0.0p0 0x0.0p0 T +REG esri:2193 1 OK 0x1.fe44af182796bp19 0x1.203eca48c0a19p23 0x0.0p0 0x1.500000000ea81p7 -0x1.3fffffffeae14p2 0x0.0p0 F +REG esri:2193 2 OK 0x1.070ed439f61a5p21 0x1.203eca48c0a19p23 0x0.0p0 0x1.63fffffff157fp7 -0x1.3fffffffeae14p2 0x0.0p0 F +REG esri:2193 3 OK 0x1.fe44af182796bp19 0x1.421b35b73f5e7p23 0x0.0p0 0x1.500000000ea81p7 0x1.3fffffffeae14p2 0x0.0p0 F +REG esri:2193 4 OK 0x1.070ed439f61a5p21 0x1.421b35b73f5e7p23 0x0.0p0 0x1.63fffffff157fp7 0x1.3fffffffeae14p2 0x0.0p0 F +REG esri:2194 0 OK 0x1.e8b7b1afe82fbp18 -0x1.c2524d1c69d8bp10 -0x1.3f22eb378p5 -0x1.54p7 -0x1.c888888888669p3 0x0.0p0 F +REG esri:2194 1 OK -0x1.39db5c686e6c7p20 -0x1.c10f16179abc2p20 -0x1.c0b719d8p0 -0x1.5e5176f75656dp7 -0x1.344444444433bp4 0x1.0p-30 F +REG esri:2194 2 OK 0x1.171b9bdd7977ep21 -0x1.c10ea966a8ca9p20 0x1.55da05e38p4 -0x1.49ae8908a9a94p7 -0x1.344444444432ep4 0x1.0p-30 F +REG esri:2194 3 OK -0x1.4d8bc12b8e583p20 0x1.b617d7f6e6a2cp20 -0x1.879645dbfp6 -0x1.5e5176f75656dp7 -0x1.28888888886ecp3 0x1.0p-29 F +REG esri:2194 4 OK 0x1.20f3cb6a5fff2p21 0x1.b6176ab07ca0ap20 -0x1.26e732939p6 -0x1.49ae8908a9a94p7 -0x1.28888888886d6p3 -0x1.8p-29 F +REG esri:2195 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.56p7 -0x1.9p4 0x0.0p0 F +REG esri:2195 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2195 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2195 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2195 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2196 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 0x1.3p3 0x0.0p0 0x0.0p0 T +REG esri:2196 1 OK -0x1.5ad736202ab3cp18 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.20000001d501dp2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2196 2 OK 0x1.70bb9b101559ep19 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.cfffffff157f3p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2196 3 OK -0x1.5ad736202ab3cp18 0x1.0efba3766bdbdp19 0x0.0p0 0x1.20000001d501dp2 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2196 4 OK 0x1.70bb9b101559ep19 0x1.0efba3766bdbdp19 0x0.0p0 0x1.cfffffff157f3p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2197 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG esri:2197 1 OK -0x1.aef9b101559ep15 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.c0000001d501ep2 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2197 2 OK 0x1.019bcd880aacfp20 -0x1.0efba3766bdbdp19 0x0.0p0 0x1.0fffffff8abf9p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2197 3 OK -0x1.aef9b101559ep15 0x1.0efba3766bdbdp19 0x0.0p0 0x1.c0000001d501ep2 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2197 4 OK 0x1.019bcd880aacfp20 0x1.0efba3766bdbdp19 0x0.0p0 0x1.0fffffff8abf9p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2198 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2198 1 OK 0x1.50b9d9420d07cp18 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.40000000ea80ep3 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2198 2 OK 0x1.634589af7cbe2p20 -0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffff8abf9p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2198 3 OK 0x1.50b9d9420d07cp18 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.40000000ea80ep3 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2198 4 OK 0x1.634589af7cbe2p20 0x1.0eff1b76c5da4p19 0x0.0p0 0x1.3fffffff8abf9p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2199 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2199 1 OK 0x1.e18aeff88de14p21 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2199 2 OK 0x1.348b8803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2199 3 OK 0x1.e18aeff88de14p21 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2199 4 OK 0x1.348b8803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2200 0 OK 0x1.24f8p18 0x1.86ap19 0x0.0p0 -0x1.0ap6 0x1.73ffffffffffap5 0x0.0p0 T +REG esri:2200 1 OK -0x1.2bdc0d975f51ap18 0x1.0890c8c69b4d2p18 0x0.0p0 -0x1.270e06f120d03p6 0x1.4bffffffffffp5 0x0.0p0 T +REG esri:2200 2 OK 0x1.bae606cbafa84p19 0x1.0890c8c69b4d2p18 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4bffffffffffp5 0x0.0p0 T +REG esri:2200 3 OK -0x1.905bd65978414p17 0x1.510e177b0b752p20 0x0.0p0 -0x1.270e06f120d03p6 0x1.9bffffffffb3fp5 0x0.0p0 T +REG esri:2200 4 OK 0x1.890ef5965e0fep19 0x1.510e177b0b752p20 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9bffffffffb3fp5 0x0.0p0 T +REG esri:2201 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2201 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:2201 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG esri:2201 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:2201 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG esri:2202 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2202 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG esri:2202 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:2202 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG esri:2202 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:2203 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2203 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG esri:2203 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:2203 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG esri:2203 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:22032 0 OK 0x1.e848p18 0x1.b99b3ea581215p22 0x0.0p0 0x1.2p3 -0x1.9p4 0x0.0p0 F +REG esri:22032 1 OK -0x1.fc27c346fb7ap14 0x1.9705574e3956cp22 0x0.0p0 0x1.bdd68fcf51a3ap1 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:22032 2 OK 0x1.f8293e1a37dbdp19 0x1.9705574e3956cp22 0x0.0p0 0x1.d08a5c0c2b971p3 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:22032 3 OK -0x1.2fe614314dfb8p16 0x1.dacd96378aa1fp22 0x0.0p0 0x1.bdd68fcf51a3ap1 -0x1.4p4 0x0.0p0 F +REG esri:22032 4 OK 0x1.0722614314dfcp20 0x1.dacd96378aa1fp22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.4p4 0x0.0p0 F +REG esri:22033 0 OK 0x1.e84800000001cp18 0x1.b99b3ea581215p22 0x0.0p0 0x1.dffffffffffffp3 -0x1.9p4 0x0.0p0 F +REG esri:22033 1 OK -0x1.fc27c346fb5cp14 0x1.9705574e3956cp22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.dfffffffffffcp4 0x0.0p0 F +REG esri:22033 2 OK 0x1.f8293e1a37dccp19 0x1.9705574e3956bp22 0x0.0p0 0x1.48452e0615cbap4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22033 3 OK -0x1.2fe614314df38p16 0x1.dacd96378aa1fp22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.4p4 0x0.0p0 F +REG esri:22033 4 OK 0x1.0722614314e04p20 0x1.dacd96378aa1fp22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2204 0 OK 0x1.e848p20 0x1.98ae6165757c6p18 0x0.0p0 -0x1.58p6 0x1.1c55555555525p5 0x0.0p0 F +REG esri:2204 1 OK 0x1.48a9b01bb51p20 -0x1.9cce8b3075512p17 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.0e5555555551bp5 0x0.0p0 F +REG esri:2204 2 OK 0x1.43f327f225788p21 -0x1.9cce8b3075512p17 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.0e5555555551bp5 0x0.0p0 F +REG esri:2204 3 OK 0x1.4f7f8bea72afp20 0x1.0365632baf944p20 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.2a5555555552dp5 0x0.0p0 F +REG esri:2204 4 OK 0x1.40883a0ac6a9p21 0x1.0365632baf944p20 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.2a5555555552dp5 0x0.0p0 F +REG esri:2205 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG esri:2205 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2205 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2205 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2205 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2206 0 OK 0x1.21eacp23 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2206 1 OK 0x1.10f922eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.6000000076036p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2206 2 OK 0x1.32dc5d1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.ffffffff89fc9p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2206 3 OK 0x1.10f922eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.6000000076036p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2206 4 OK 0x1.32dc5d1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.ffffffff89fc9p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2207 0 OK 0x1.406f4p23 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2207 1 OK 0x1.2f7da2eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.9000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2207 2 OK 0x1.5160dd1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.17ffffffc4fe4p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2207 3 OK 0x1.2f7da2eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.9000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2207 4 OK 0x1.5160dd1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.17ffffffc4fe4p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2208 0 OK 0x1.5ef3cp23 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2208 1 OK 0x1.4e0222eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.c000000076036p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2208 2 OK 0x1.6fe55d1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.2fffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2208 3 OK 0x1.4e0222eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.c000000076036p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2208 4 OK 0x1.6fe55d1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.2fffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2209 0 OK 0x1.7d784p23 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:2209 1 OK 0x1.6c86a2eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.f000000076037p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2209 2 OK 0x1.8e69dd1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.47ffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2209 3 OK 0x1.6c86a2eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.f000000076037p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2209 4 OK 0x1.8e69dd1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.47ffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:22091 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.7p3 0x0.0p0 0x0.0p0 T +REG esri:22091 1 OK -0x1.ad892fb69453p15 0x1.203f2fb843d77p23 0x0.0p0 0x1.a0000001e0cfp2 -0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22091 2 OK 0x1.0190497db4a2ap20 0x1.203f2fb843d77p23 0x0.0p0 0x1.07ffffff87cc4p4 -0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22091 3 OK -0x1.ad892fb69453p15 0x1.421ad047bc289p23 0x0.0p0 0x1.a0000001e0cfp2 0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22091 4 OK 0x1.0190497db4a2ap20 0x1.421ad047bc289p23 0x0.0p0 0x1.07ffffff87cc4p4 0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22092 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG esri:22092 1 OK -0x1.ad892fb69453p15 0x1.203f2fb843d77p23 0x0.0p0 0x1.c0000001e0cfp2 -0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22092 2 OK 0x1.0190497db4a2ap20 0x1.203f2fb843d77p23 0x0.0p0 0x1.0fffffff87cc4p4 -0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22092 3 OK -0x1.ad892fb69453p15 0x1.421ad047bc289p23 0x0.0p0 0x1.c0000001e0cfp2 0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:22092 4 OK 0x1.0190497db4a2ap20 0x1.421ad047bc289p23 0x0.0p0 0x1.0fffffff87cc4p4 0x1.3fffffffea4c1p2 0x0.0p0 F +REG esri:2210 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2210 1 OK 0x1.8b0b22eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.100000003b01bp5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2210 2 OK 0x1.acee5d1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.5fffffffc4fe4p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2210 3 OK 0x1.8b0b22eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.100000003b01bp5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2210 4 OK 0x1.acee5d1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.5fffffffc4fe4p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2211 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG esri:2211 1 OK 0x1.a98fa2eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.280000003b01cp5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2211 2 OK 0x1.cb72dd1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.77ffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2211 3 OK 0x1.a98fa2eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.280000003b01cp5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2211 4 OK 0x1.cb72dd1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.77ffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2212 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2212 1 OK 0x1.c81422eecf06p23 -0x1.0effe063c668dp19 0x0.0p0 0x1.400000003b01bp5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2212 2 OK 0x1.e9f75d1130fap23 -0x1.0effe063c668dp19 0x0.0p0 0x1.8fffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2212 3 OK 0x1.c81422eecf06p23 0x1.0effe063c668dp19 0x0.0p0 0x1.400000003b01bp5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2212 4 OK 0x1.e9f75d1130fap23 0x1.0effe063c668dp19 0x0.0p0 0x1.8fffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2213 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2213 1 OK -0x1.ad750e7d8698p15 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.9000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2213 2 OK 0x1.018fa873ec34ep20 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.17ffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2213 3 OK -0x1.ad750e7d8698p15 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.9000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2213 4 OK 0x1.018fa873ec34ep20 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.17ffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2214 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 0x1.5p3 0x0.0p0 0x0.0p0 T +REG esri:2214 1 OK 0x1.b2e72b94cbc9ap18 0x1.b31affab5664ep18 0x0.0p0 0x1.60000001d80d5p2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2214 2 OK 0x1.7b8e351acd0d8p20 0x1.b31affab5664ep18 0x0.0p0 0x1.efffffff13f94p3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2214 3 OK 0x1.b2e72b94cbc9ap18 0x1.7b8140152a66cp20 0x0.0p0 0x1.60000001d80d5p2 0x1.3fffffffeaba8p2 0x0.0p0 F +REG esri:2214 4 OK 0x1.7b8e351acd0d8p20 0x1.7b8140152a66cp20 0x0.0p0 0x1.efffffff13f94p3 0x1.3fffffffeaba8p2 0x0.0p0 F +REG esri:2215 0 OK 0x1.e86ab2395e591p18 0x1.4b1188199bcafp5 -0x1.26cabee58p4 0x1.2p3 0x1.2f74bf1dcfcacp-64 0x1.8p-29 T +REG esri:2215 1 OK -0x1.ac630c5cc067p15 -0x1.0ede672000276p19 -0x1.013a98a98p5 0x1.0000000000002p2 -0x1.4p2 -0x1.8p-29 F +REG esri:2215 2 OK 0x1.0198719d3b462p20 -0x1.0ede6720e64cp19 -0x1.016dfd1fp3 0x1.c000000000001p3 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:2215 3 OK -0x1.ac61c94844d6p15 0x1.0ee8bf958dde9p19 -0x1.8efb9443p4 0x1.0p2 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2215 4 OK 0x1.019867834e0adp20 0x1.0ee8bf9674142p19 -0x1.a7afc988p-1 0x1.c000000000001p3 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:2216 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2216 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2216 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.7p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2216 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2216 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.7p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2217 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2217 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.9p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2217 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2217 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.9p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2217 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2219 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2219 1 OK -0x1.ad74b58702bfp15 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.28p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2219 2 OK 0x1.018fa5ac38159p20 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:2219 3 OK -0x1.ad74b58702bfp15 0x1.0ee355cc581aep19 0x0.0p0 -0x1.28p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2219 4 OK 0x1.018fa5ac38159p20 0x1.0ee355cc581aep19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:22191 0 OK 0x1.6e36p20 0x1.b453d9c057babp16 0x0.0p0 -0x1.2p6 -0x1.64p6 0x0.0p0 F +REG esri:22191 1 OK 0x1.5697ee2a6be93p20 0x1.b45c51c687de4p15 0x0.0p0 0x1.bp6 -0x1.68329508d1476p6 0x0.0p0 F +REG esri:22191 2 OK 0x1.85d411d59416dp20 0x1.b45c51c687de8p15 0x0.0p0 0x1.bp6 -0x1.68329508d1467p6 0x0.0p0 F +REG esri:22191 3 OK 0x1.f01919f934c62p19 0x1.1136208e33692p18 0x0.0p0 0x1.bp6 -0x1.68d3a0c998259p6 0x0.0p0 F +REG esri:22191 4 OK 0x1.e45f7303659cep20 0x1.1136208e33694p18 0x0.0p0 0x1.bp6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:22192 0 OK 0x1.312dp21 0x1.b453d9c057babp16 0x0.0p0 -0x1.14p6 -0x1.64p6 0x0.0p0 F +REG esri:22192 1 OK 0x1.255df71535f4ap21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bcp6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22192 2 OK 0x1.3cfc08eaca0b6p21 0x1.b45c51c687de8p15 0x0.0p0 0x1.bc00000000001p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22192 3 OK 0x1.ec308cfc9a632p20 0x1.1136208e33694p18 0x0.0p0 0x1.bcp6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:22192 4 OK 0x1.6c41b981b2ce7p21 0x1.1136208e33694p18 0x0.0p0 0x1.bc00000000001p6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:22193 0 OK 0x1.ab3fp21 0x1.b453d9c057babp16 0x0.0p0 -0x1.08p6 -0x1.64p6 0x0.0p0 F +REG esri:22193 1 OK 0x1.9f6ff71535f4ap21 0x1.b45c51c687de8p15 0x0.0p0 0x1.c8p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22193 2 OK 0x1.b70e08eaca0b6p21 0x1.b45c51c687de4p15 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68329508d1474p6 0x0.0p0 F +REG esri:22193 3 OK 0x1.702a467e4d319p21 0x1.1136208e33694p18 0x0.0p0 0x1.c8p6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:22193 4 OK 0x1.e653b981b2ce7p21 0x1.1136208e33692p18 0x0.0p0 0x1.c7fffffffffffp6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:22194 0 OK 0x1.12a88p22 0x1.b453d9c057babp16 0x0.0p0 -0x1.f8p5 -0x1.64p6 0x0.0p0 F +REG esri:22194 1 OK 0x1.0cc0fb8a9afa5p22 0x1.b45c51c687de4p15 0x0.0p0 0x1.d4p6 -0x1.68329508d1474p6 0x0.0p0 F +REG esri:22194 2 OK 0x1.189004756505bp22 0x1.b45c51c687de8p15 0x0.0p0 0x1.d4p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22194 3 OK 0x1.ea3c467e4d319p21 0x1.1136208e33692p18 0x0.0p0 0x1.d4p6 -0x1.68d3a0c998257p6 0x0.0p0 F +REG esri:22194 4 OK 0x1.3032dcc0d9674p22 0x1.1136208e33694p18 0x0.0p0 0x1.d4p6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:22195 0 OK 0x1.4fb18p22 0x1.b453d9c057babp16 0x0.0p0 -0x1.dffffffffffffp5 -0x1.64p6 0x0.0p0 F +REG esri:22195 1 OK 0x1.49c9fb8a9afa5p22 0x1.b45c51c687de8p15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22195 2 OK 0x1.559904756505bp22 0x1.b45c51c687de8p15 0x0.0p0 0x1.e000000000001p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22195 3 OK 0x1.3227233f2698cp22 0x1.1136208e33694p18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:22195 4 OK 0x1.6d3bdcc0d9674p22 0x1.1136208e33694p18 0x0.0p0 0x1.e000000000001p6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:22196 0 OK 0x1.8cba8p22 0x1.b453d9c057babp16 0x0.0p0 -0x1.c800000000001p5 -0x1.64p6 0x0.0p0 F +REG esri:22196 1 OK 0x1.86d2fb8a9afa5p22 0x1.b45c51c687de8p15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22196 2 OK 0x1.92a204756505bp22 0x1.b45c51c687de4p15 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68329508d1474p6 0x0.0p0 F +REG esri:22196 3 OK 0x1.6f30233f2698cp22 0x1.1136208e33694p18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:22196 4 OK 0x1.aa44dcc0d9674p22 0x1.1136208e33692p18 0x0.0p0 0x1.ebfffffffffffp6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:22197 0 OK 0x1.c9c38p22 0x1.b453d9c057babp16 0x0.0p0 -0x1.bp5 -0x1.64p6 0x0.0p0 F +REG esri:22197 1 OK 0x1.c3dbfb8a9afa5p22 0x1.b45c51c687de4p15 0x0.0p0 0x1.f8p6 -0x1.68329508d1474p6 0x0.0p0 F +REG esri:22197 2 OK 0x1.cfab04756505bp22 0x1.b45c51c687de8p15 0x0.0p0 0x1.f8p6 -0x1.68329508d1466p6 0x0.0p0 F +REG esri:22197 3 OK 0x1.ac39233f2698cp22 0x1.1136208e33692p18 0x0.0p0 0x1.f8p6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:22197 4 OK 0x1.e74ddcc0d9674p22 0x1.1136208e33694p18 0x0.0p0 0x1.f8p6 -0x1.68d3a0c99825ap6 0x0.0p0 F +REG esri:2220 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2220 1 OK -0x1.ad74b58702bfp15 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2220 2 OK 0x1.018fa5ac38159p20 -0x1.0ee355cc581aep19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:2220 3 OK -0x1.ad74b58702bfp15 0x1.0ee355cc581aep19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2220 4 OK 0x1.018fa5ac38159p20 0x1.0ee355cc581aep19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:2222 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:2222 1 OK -0x1.2955adc19bf4ap20 -0x1.b1576a448ef9fp20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2222 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2222 3 OK -0x1.f51cd4f10d22bp19 0x1.c8caf79f992b3p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2222 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2223 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:2223 1 OK -0x1.2955adc19bf6cp20 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2223 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2223 3 OK -0x1.f51cd4f10d26dp19 0x1.c8caf79f992b5p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:2223 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:22234 0 OK 0x1.e848000000011p18 0x1.b99b3ea50af08p22 0x0.0p0 0x1.5p4 -0x1.9000000000001p4 0x0.0p0 F +REG esri:22234 1 OK -0x1.fc27c343d866p14 0x1.9705574db17a4p22 0x0.0p0 0x1.ef75a3f3d468ep3 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22234 2 OK 0x1.f8293e1a1ec4p19 0x1.9705574db17a4p22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22234 3 OK -0x1.2fe61430e6bb8p16 0x1.dacd963728cc8p22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.4000000000001p4 0x0.0p0 F +REG esri:22234 4 OK 0x1.072261430e6c3p20 0x1.dacd963728cc8p22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.4p4 0x0.0p0 F +REG esri:22235 0 OK 0x1.e848p18 0x1.b99b3ea50af08p22 0x0.0p0 0x1.bp4 -0x1.9000000000001p4 0x0.0p0 F +REG esri:22235 1 OK -0x1.fc27c343d87p14 0x1.9705574db17a4p22 0x0.0p0 0x1.57bad1f9ea347p4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22235 2 OK 0x1.f8293e1a1ec3bp19 0x1.9705574db17a4p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22235 3 OK -0x1.2fe61430e6bep16 0x1.dacd963728cc8p22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.4000000000001p4 0x0.0p0 F +REG esri:22235 4 OK 0x1.072261430e6cp20 0x1.dacd963728cc8p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:22236 0 OK 0x1.e847ffffffff5p18 0x1.b99b3ea50af08p22 0x0.0p0 0x1.08p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:22236 1 OK -0x1.fc27c343d88p14 0x1.9705574db17a4p22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22236 2 OK 0x1.f8293e1a1ec35p19 0x1.9705574db17a4p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:22236 3 OK -0x1.2fe61430e6c3p16 0x1.dacd963728cc8p22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4p4 0x0.0p0 F +REG esri:22236 4 OK 0x1.072261430e6bep20 0x1.dacd963728cc8p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2224 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:2224 1 OK -0x1.2959a27fed03ap20 -0x1.b15b138b3e699p20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2224 2 OK 0x1.3f92d13ff681cp21 -0x1.b15b138b3e699p20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2224 3 OK -0x1.f523f412fd677p19 0x1.c8ced39f6471dp20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2224 4 OK 0x1.282efd04bf59dp21 0x1.c8ced39f6471dp20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2225 0 OK 0x1.907e0aab020c5p22 0x1.f84139ea5bec2p20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG esri:2225 1 OK 0x1.5a9aac8aa75aap22 0x1.2c788dbb4382p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG esri:2225 2 OK 0x1.c66168cb5cbd9p22 0x1.2c788dbb4382p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG esri:2225 3 OK 0x1.5e3cf1995b98p22 0x1.65af469fe0628p21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:2225 4 OK 0x1.c2bf23bca8803p22 0x1.65af469fe0628p21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:2226 0 OK 0x1.907e0aab020c5p22 0x1.f0d0c4b71a613p20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG esri:2226 1 OK 0x1.5eab6b70b08cap22 0x1.33306016f5615p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:2226 2 OK 0x1.c250a9e5538b8p22 0x1.33306016f5602p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG esri:2226 3 OK 0x1.619d4b79c2d1cp22 0x1.5a314358c160ep21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG esri:2226 4 OK 0x1.bf5ec9dc41466p22 0x1.5a314358c1604p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG esri:2227 0 OK 0x1.907e0aab020c5p22 0x1.e66c4c0a100aep20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG esri:2227 1 OK 0x1.643b4190e173bp22 0x1.3cd93a7337568p20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:2227 2 OK 0x1.bcc0d3c522a57p22 0x1.3cd93a7337568p20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:2227 3 OK 0x1.6677dd7c37cc8p22 0x1.4a4240453b024p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:2227 4 OK 0x1.ba8437d9cc4cap22 0x1.4a4240453b024p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:2228 0 OK 0x1.907e0aab020c5p22 0x1.e5aadbb861004p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG esri:2228 1 OK 0x1.64ab3a8ebe892p22 0x1.3d782896edb1cp20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:2228 2 OK 0x1.bc50dac7458f8p22 0x1.3d782896edb1cp20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:2228 3 OK 0x1.66c728b16e63p22 0x1.490fd34bd7e74p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:2228 4 OK 0x1.ba34eca495b5ap22 0x1.490fd34bd7e74p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:2229 0 OK 0x1.907e0aab020c5p22 0x1.e7dc46f7cec94p20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG esri:2229 1 OK 0x1.639369c06913cp22 0x1.3b3cfa81a21cfp20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:2229 2 OK 0x1.bd68ab959b056p22 0x1.3b3cfa81a21cfp20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:2229 3 OK 0x1.65a65a5ce592dp22 0x1.4c56c63348d84p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG esri:2229 4 OK 0x1.bb55baf91e865p22 0x1.4c56c63348d84p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG esri:2230 0 OK 0x1.907e0aab020c5p22 0x1.dcbd320fca315p20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG esri:2230 1 OK 0x1.697149d02883p22 0x1.45c4474c70b21p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:2230 2 OK 0x1.b78acb85db956p22 0x1.45c4474c70b21p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:2230 3 OK 0x1.6af09de1e9cf2p22 0x1.3b5e6d5b44838p21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG esri:2230 4 OK 0x1.b60b77741a494p22 0x1.3b5e6d5b44838p21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG esri:2231 0 OK 0x1.6e36p21 0x1.349e033e4d4adp20 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG esri:2231 1 OK 0x1.2c1b34e9bf8dcp21 0x1.6a24980a9e702p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:2231 2 OK 0x1.b050cb1640724p21 0x1.6a24980a9e702p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:2231 3 OK 0x1.2edc82fbcaf4ap21 0x1.b6f34d77f3342p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:2231 4 OK 0x1.ad8f7d04350b6p21 0x1.b6f34d77f3342p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:2232 0 OK 0x1.6e36p21 0x1.4959ca39b0235p20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG esri:2232 1 OK 0x1.165b50c53d54ap21 0x1.4295425f91c2ap19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:2232 2 OK 0x1.c610af3ac2ab6p21 0x1.4295425f91c2ap19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:2232 3 OK 0x1.1af84f5f35b64p21 0x1.f611413a7e336p20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:2232 4 OK 0x1.c173b0a0ca49cp21 0x1.f611413a7e336p20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:2233 0 OK 0x1.6e36p21 0x1.42aa603777e8fp20 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG esri:2233 1 OK 0x1.1d7ce35315b9cp21 0x1.4f0ebe975da91p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:2233 2 OK 0x1.beef1cacea464p21 0x1.4f0ebe975da91p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:2233 3 OK 0x1.213c0acae25bp21 0x1.e19682bf13b29p20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:2233 4 OK 0x1.bb2ff5351da5p21 0x1.e19682bf13b29p20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:22332 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:22332 1 OK -0x1.ad89324e3d9ap15 -0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:22332 2 OK 0x1.0190499271ecep20 -0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:22332 3 OK -0x1.ad89324e3d9ap15 0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:22332 4 OK 0x1.0190499271ecep20 0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2234 0 OK 0x1.e848p19 0x1.500fa66b4a164p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG esri:2234 1 OK 0x1.2cd17519787bcp19 0x1.336c49b7fa35p18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG esri:2234 2 OK 0x1.51df457343c22p20 0x1.336c49b7fa35p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG esri:2234 3 OK 0x1.32acebaa46e87p19 0x1.04afc04ea9f54p20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2234 4 OK 0x1.4ef18a2adc8bcp20 0x1.04afc04ea9f54p20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2235 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:2235 1 OK -0x1.3b284352bd37p20 -0x1.adf90da921e8p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG esri:2235 2 OK 0x1.3dc68c5566cd2p21 -0x1.adf90da921e7fp20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG esri:2235 3 OK -0x1.fc8e1e7bfa799p19 0x1.cc6842bfb4f9bp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG esri:2235 4 OK 0x1.1f55f24b06dp21 0x1.cc6842bfb4f9cp20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG esri:2236 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:2236 1 OK -0x1.2e33bf03fc19cp20 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2236 2 OK 0x1.374c4a2e063ep21 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2236 3 OK -0x1.0b0551140f844p20 0x1.c5c43c229dadp20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2236 4 OK 0x1.25b513360ff34p21 0x1.c5c43c229dadp20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2237 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:2237 1 OK -0x1.2e33bf03fc19cp20 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2237 2 OK 0x1.374c4a2e063ep21 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2237 3 OK -0x1.0b0551140f844p20 0x1.c5c43c229dadp20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2237 4 OK 0x1.25b513360ff34p21 0x1.c5c43c229dadp20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2238 0 OK 0x1.e097400000001p20 0x1.36c124f6ea72p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG esri:2238 1 OK 0x1.41af8ade6516cp20 -0x1.312f13394fd9fp18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:2238 2 OK 0x1.3fbf7a90cd742p21 -0x1.312f13394fd9fp18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:2238 3 OK 0x1.472fd7933cbd5p20 0x1.d4e8d5e1dda5dp19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:2238 4 OK 0x1.3cff543661a0ep21 0x1.d4e8d5e1dda5dp19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:2239 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2239 1 OK -0x1.331c47ab83518p20 -0x1.b1c692296f915p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2239 2 OK 0x1.39c08e81c9da7p21 -0x1.b1c692296f915p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:2239 3 OK -0x1.062aefbe75fbap20 0x1.c850c02f2b574p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2239 4 OK 0x1.2347e28b432f8p21 0x1.c850c02f2b575p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:22391 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.3cccccccccccdp3 0x1.1ffffffffffd2p5 0x0.0p0 F +REG esri:22391 1 OK -0x1.66c781502ed08p16 -0x1.cd71a2eb56f78p17 0x0.0p0 0x1.dc1dd293b6beep1 0x1.effffffffff68p4 0x0.0p0 F +REG esri:22391 2 OK 0x1.0a90781502ecep20 -0x1.cd71a2eb56f78p17 0x0.0p0 0x1.0149127a55f4fp4 0x1.effffffffff68p4 0x0.0p0 F +REG esri:22391 3 OK -0x1.4faafbbbba67p14 0x1.a9cf509bf47efp19 0x0.0p0 0x1.dc1dd293b6beep1 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:22391 4 OK 0x1.f2c557ddddd3p19 0x1.a9cf509bf47efp19 0x0.0p0 0x1.0149127a55f4fp4 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:22392 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.3cccccccccccdp3 0x1.0a66666666628p5 0x0.0p0 F +REG esri:22392 1 OK -0x1.5982463318118p16 -0x1.d0aee0b7fb184p17 0x0.0p0 0x1.f5792b2e61d7dp1 0x1.c4ccccccccc11p4 0x0.0p0 F +REG esri:22392 2 OK 0x1.09bc246331811p20 -0x1.d0aee0b7fb184p17 0x0.0p0 0x1.fc3b4ece0123bp3 0x1.c4ccccccccc11p4 0x0.0p0 F +REG esri:22392 3 OK -0x1.8455188cc5bep14 0x1.a8f4be0f88419p19 0x0.0p0 0x1.f5792b2e61d7bp1 0x1.3266666666645p5 0x0.0p0 F +REG esri:22392 4 OK 0x1.f46aa8c4662dep19 0x1.a8f4be0f88419p19 0x0.0p0 0x1.fc3b4ece0123bp3 0x1.3266666666645p5 0x0.0p0 F +REG esri:2240 0 OK 0x1.18583aa9fbe77p21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2240 1 OK 0x1.75870bf1b12ccp18 -0x1.b1c692296f915p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:2240 2 OK 0x1.00ffc9eae0d46p22 -0x1.b1c692296f915p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2240 3 OK 0x1.14a635d2f3422p19 0x1.c850c02f2b575p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2240 4 OK 0x1.eb86e7df3afdep21 0x1.c850c02f2b574p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2241 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2241 1 OK -0x1.3f5f7b9382342p20 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2241 2 OK 0x1.3fe22875c94b4p21 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2241 3 OK -0x1.f40210c0e3cc9p19 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.db70850622b0dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2241 4 OK 0x1.1d32eedc41245p21 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2242 0 OK 0x1.907e0aac08311p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2242 1 OK -0x1.3c4f6e4e08cc8p18 -0x1.abd3ba6b8ade3p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2242 2 OK 0x1.b807f875c94b3p21 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2242 3 OK -0x1.36ad0c0e3cbp15 0x1.ce73b0bbe3aedp20 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2242 4 OK 0x1.9558bedc41244p21 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2243 0 OK 0x1.4064d55604189p21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2243 1 OK 0x1.4272f8e8abca8p19 -0x1.abd231ddc1ef6p20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2243 2 OK 0x1.18167638ee9f4p22 -0x1.abd231ddc1ef6p20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2243 3 OK 0x1.cd2f60022c652p19 0x1.ce720868f3e3ep20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2243 4 OK 0x1.06bee955be8bfp22 0x1.ce720868f3e3ep20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2244 0 OK 0x1.4064d54fdf3b6p18 0x1.8f79a00000002p19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:2244 1 OK -0x1.8ab24a7a7142ep20 -0x1.ccfbf1bcf9c0ep19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2244 2 OK 0x1.15725a913070dp21 -0x1.ccfbf1bcf9c0cp19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2244 3 OK -0x1.4ee8d2df8d14cp20 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.6fe049119990cp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2244 4 OK 0x1.ef1b3d877cb38p20 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2245 0 OK 0x1.6871700000001p21 0x1.8f79a00000002p19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:2245 1 OK 0x1.ec2ec0632ddcep19 -0x1.ccfbf1bcf9c0ep19 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2245 2 OK 0x1.2aeb97f39a447p22 -0x1.ccfbf1bcf9c0ep19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2245 3 OK 0x1.31e0d7cc7b1c8p20 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.758af3bc443b6p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2245 4 OK 0x1.1bf93a0ce138fp22 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.431fb6ee666f4p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2246 0 OK 0x1.907e0aac08311p20 0x1.04cae2b6b9b8fp18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG esri:2246 1 OK 0x1.0aeb10e9b926ep20 -0x1.feccc02444d9p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2246 2 OK 0x1.0b0882372b9dap21 -0x1.feccc02444d9p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2246 3 OK 0x1.1034910620ffap20 0x1.89d6f5d769755p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2246 4 OK 0x1.0863c228f7b14p21 0x1.89d6f5d769755p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2247 0 OK 0x1.907e0aac08311p20 0x1.d79a53ca86cdap20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG esri:2247 1 OK 0x1.fd4ce85362391p19 0x1.4aec624c3c355p20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:2247 2 OK 0x1.112ad0972fa25p21 0x1.4aec624c3c355p20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:2247 3 OK 0x1.04b1690895056p20 0x1.33abac3785048p21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:2247 4 OK 0x1.0e255627bdadep21 0x1.33abac3785048p21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:2248 0 OK 0x1.4064d553f7ceep20 0x1.3d1efd3b91184p18 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG esri:2248 1 OK 0x1.3a7910c1d2dp19 -0x1.3505fec9eb6d1p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG esri:2248 2 OK 0x1.e38d22470635cp20 -0x1.3505fec9eb6d1p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG esri:2248 3 OK 0x1.4a5177c329c7dp19 0x1.dfa15d7c876a5p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:2248 4 OK 0x1.dba0eec65ab9ep20 0x1.dfa15d7c876a5p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:2249 0 OK 0x1.4064d55810625p19 0x1.51cf01db587d7p21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG esri:2249 1 OK 0x1.7b96f1026fbep14 0x1.07f21b07f43d4p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG esri:2249 2 OK 0x1.3a76799406a36p20 0x1.07f21b07f43d4p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG esri:2249 3 OK 0x1.bbb272668874p15 0x1.9dabbc7f5b328p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:2249 4 OK 0x1.328741c4dc1ebp20 0x1.9dabbc7f5b328p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:2250 0 OK 0x1.907e0aac08311p20 0x1.57f5cca07ddfp16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG esri:2250 1 OK 0x1.35d5e8a5c7bcfp20 -0x1.0b0c374f92407p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:2250 2 OK 0x1.eb262cb248a53p20 -0x1.0b0c374f92407p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:2250 3 OK 0x1.3890cdb380795p20 0x1.bc8e2eb949a0ap18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:2250 4 OK 0x1.e86b47a48fe8dp20 0x1.bc8e2eb949a0ap18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:2251 0 OK 0x1.907e3f28f5c29p24 0x1.9983d81e6921fp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG esri:2251 1 OK 0x1.831fd4ce40c4cp24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:2251 2 OK 0x1.9ddca983aac05p24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:2251 3 OK 0x1.843129ecee803p24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:2251 4 OK 0x1.9ccb5464fd04ep24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:2252 0 OK 0x1.2c5eaf5eb851fp24 0x1.a8432a3145b09p18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG esri:2252 1 OK 0x1.1e863b657d643p24 -0x1.962954cc373abp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:2252 2 OK 0x1.3a372357f33fap24 -0x1.962954cc373abp18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:2252 3 OK 0x1.1f9deb7dde65ap24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG esri:2252 4 OK 0x1.391f733f923e3p24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG esri:22523 0 OK 0x1.e84e020c35603p18 0x1.b997de37f647ep22 0x1.3edd9cd7p2 -0x1.68p5 -0x1.9000000000002p4 0x1.0p-30 F +REG esri:22523 1 OK -0x1.fb84c7355728p14 0x1.97017b7389a4bp22 -0x1.67efb588p1 -0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:22523 2 OK 0x1.f82a284d2cef9p19 0x1.97017b73740ffp22 0x1.30f1bb9cp0 -0x1.3bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:22523 3 OK -0x1.2fbf513f58038p16 0x1.dacacbf5e2346p22 0x1.5bec039ep2 -0x1.942297030ae5cp5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG esri:22523 4 OK 0x1.0722f61ecfefep20 0x1.dacacbf5cdac9p22 0x1.38f5c1fcp3 -0x1.3bdd68fcf51a3p5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:22524 0 OK 0x1.e846fe3d9cfa4p18 0x1.b997dffda85c8p22 0x1.7bb2b394p2 -0x1.3800000000001p5 -0x1.9000000000003p4 0x0.0p0 F +REG esri:22524 1 OK -0x1.fbf4b7128282p14 0x1.97017d900351cp22 0x1.b7634a3p-2 -0x1.642297030ae5dp5 -0x1.dfffffffffffep4 -0x1.0p-29 F +REG esri:22524 2 OK 0x1.f826a3f4f7bcp19 0x1.97017d9006efap22 -0x1.ef34b08p-3 -0x1.0bdd68fcf51a3p5 -0x1.e000000000003p4 -0x1.0p-30 F +REG esri:22524 3 OK -0x1.2fdb49c8f0fb8p16 0x1.dacacd6809a1ep22 0x1.1e7f942cp3 -0x1.642297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:22524 4 OK 0x1.072133ba91d84p20 0x1.dacacd680d12bp22 0x1.07342579p3 -0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x1.0p-30 F +REG esri:2253 0 OK 0x1.907e3f28f5c28p23 0x1.818af27c31519p18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG esri:2253 1 OK 0x1.7778c79e94e8bp23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG esri:2253 2 OK 0x1.a983b6b3569c4p23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG esri:2253 3 OK 0x1.7927ff3c5604fp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:2253 4 OK 0x1.a7d47f15957ffp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:2254 0 OK 0x1.e097400000004p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:2254 1 OK -0x1.c528da114b50ep19 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2254 2 OK 0x1.6195d68452d46p21 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2254 3 OK -0x1.6d13c32e22506p19 0x1.c81a512182c13p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2254 4 OK 0x1.4b9090cb88944p21 0x1.c81a512182c13p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2255 0 OK 0x1.18583aa9fbe77p21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:2255 1 OK 0x1.7741a12d48994p18 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2255 2 OK 0x1.00e42097275dep22 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2255 3 OK 0x1.13b5e779cd4d2p19 0x1.c81a512182c13p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2255 4 OK 0x1.ebc2fb75847bap21 0x1.c81a512182c13p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2256 0 OK 0x1.e0977efdf3b63p20 0x1.a6c8bd0f5d9f5p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG esri:2256 1 OK 0x1.3ca7fcc422cbp16 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:2256 2 OK 0x1.d6b23f17d2a06p21 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:2256 3 OK 0x1.79b79a00e21fp18 0x1.45d92b5d83149p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:2256 4 OK 0x1.b1608bbdd772cp21 0x1.45d92b5d83149p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:2257 0 OK 0x1.0853300000001p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:2257 1 OK -0x1.5012ec9613714p20 -0x1.b1583116d0a83p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2257 2 OK 0x1.2c330e4b09b8bp21 -0x1.b1583116d0a83p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2257 3 OK -0x1.214b93d69fd5ap20 0x1.c8cbc93457fp20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2257 4 OK 0x1.14cf61eb4feaep21 0x1.c8cbc93457fp20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2258 0 OK 0x1.907e0aac08311p20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:2258 1 OK -0x1.0ef596d91f928p18 -0x1.b157317808223p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2258 2 OK 0x1.b25cbd872c236p21 -0x1.b157317808223p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2258 3 OK -0x1.4f6288ed1a5dp16 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2258 4 OK 0x1.9af91ef37104p21 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2259 0 OK 0x1.4c689d5604189p21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:2259 1 OK 0x1.8927812538dcep19 -0x1.b159144e9f583p20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2259 2 OK 0x1.1b43ad315cfcfp22 -0x1.b159144e9f583p20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2259 3 OK 0x1.e6b663b254474p19 0x1.c8ccb8b80cbb5p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2259 4 OK 0x1.0f91d0dfb98fap22 0x1.c8ccb8b80cbb5p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2260 0 OK 0x1.e097400000001p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:2260 1 OK -0x1.64165d1827b3ap20 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2260 2 OK 0x1.2a30fe8c13d9dp21 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2260 3 OK -0x1.255c90ab4fb68p20 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2260 4 OK 0x1.0ad41855a7db4p21 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2261 0 OK 0x1.907e0aa7ef9dcp19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:2261 1 OK -0x1.1556c7aeed5ffp20 -0x1.acd32be826247p20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2261 2 OK 0x1.52ea692b6e7eep21 -0x1.acd32be826247p20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2261 3 OK -0x1.a7e32d0b0c67ap19 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2261 4 OK 0x1.3237d096bae8cp21 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2262 0 OK 0x1.18583aac08311p20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:2262 1 OK -0x1.8a7b24adb9fb8p19 -0x1.acd32be826247p20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2262 2 OK 0x1.7af703d776affp21 -0x1.acd32be826247p20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2262 3 OK -0x1.07b0c25aeba34p19 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2262 4 OK 0x1.5a446b42c319ep21 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2263 0 OK 0x1.e097400000004p19 0x1.34584a46de42dp17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG esri:2263 1 OK 0x1.2b56a357b7e11p19 -0x1.8dc7734d32af6p17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:2263 2 OK 0x1.4aebee54240fcp20 -0x1.8dc7734d32af6p17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:2263 3 OK 0x1.30b017f7ec664p19 0x1.0051d9cc95a02p19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:2263 4 OK 0x1.483f340409cd2p20 0x1.0051d9cc95a02p19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:2264 0 OK 0x1.e848p20 0x1.ad7545588e64cp18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG esri:2264 1 OK 0x1.0a3d4a3582c3bp20 -0x1.a06a7c3fa75bcp18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG esri:2264 2 OK 0x1.63295ae53e9dap21 -0x1.a06a7c3fa75bcp18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG esri:2264 3 OK 0x1.16ff5d3fb3338p20 0x1.4547a9e7a3449p20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG esri:2264 4 OK 0x1.5cc851602665cp21 0x1.4547a9e7a3449p20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG esri:2265 0 OK 0x1.e0977efdf3b63p20 0x1.34b8635602885p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:2265 1 OK 0x1.409ca1da0a5ddp20 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:2265 2 OK 0x1.40492e10ee87bp21 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:2265 3 OK 0x1.4af8a0f982deep20 0x1.d42e49f062e38p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2265 4 OK 0x1.3b1b2e8132473p21 0x1.d42e49f062e38p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2266 0 OK 0x1.e0977efdf3b63p20 0x1.437e15732559cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG esri:2266 1 OK 0x1.38eb67f7cefd8p20 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:2266 2 OK 0x1.4421cb020c37ep21 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG esri:2266 3 OK 0x1.43cd789910c28p20 0x1.ea990182f140ap19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:2266 4 OK 0x1.3eb0c2b16b556p21 0x1.ea990182f140ap19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:2267 0 OK 0x1.e097400000001p20 0x1.3a030d3f271b9p18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG esri:2267 1 OK 0x1.3f60bce6c66c4p20 -0x1.32d2652c23557p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:2267 2 OK 0x1.40e6e18c9cc9fp21 -0x1.32d2652c23557p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:2267 3 OK 0x1.466e4a61d6404p20 0x1.da8d3177bcd09p19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:2267 4 OK 0x1.3d601acf14dffp21 0x1.da8d3177bcd09p19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:2268 0 OK 0x1.e097400000001p20 0x1.519f1c006077dp18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG esri:2268 1 OK 0x1.332c99d21eedep20 -0x1.49c9fd9e63856p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:2268 2 OK 0x1.4700f316f0892p21 -0x1.49c9fd9e63856p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:2268 3 OK 0x1.3addbc4eed52bp20 0x1.fe4a15bf17bf8p19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:2268 4 OK 0x1.432861d88956cp21 0x1.fe4a15bf17bf8p19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:2269 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG esri:2269 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:2269 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:2269 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:2269 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:2270 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:2270 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:2270 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:2270 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG esri:2270 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG esri:22700 0 OK 0x1.24f8p18 0x1.24f8p18 0x0.0p0 0x1.2accccccccccdp5 0x1.15333333333p5 0x0.0p0 F +REG esri:22700 1 OK -0x1.1b528b5dd2ab2p18 -0x1.cf18940efe354p17 0x0.0p0 0x1.f45a283b2e20bp4 0x1.da666666665bep4 0x0.0p0 F +REG esri:22700 2 OK 0x1.b2a145aee9553p19 -0x1.cf18940efe354p17 0x0.0p0 0x1.5b6c857c02894p5 0x1.da666666665bep4 0x0.0p0 F +REG esri:22700 3 OK -0x1.b3ee60b909d1ep17 0x1.a960b7b52d251p19 0x0.0p0 0x1.f45a283b2e20bp4 0x1.3d33333333316p5 0x0.0p0 F +REG esri:22700 4 OK 0x1.91f3982e42743p19 0x1.a960b7b52d251p19 0x0.0p0 0x1.5b6c857c02894p5 0x1.3d33333333316p5 0x0.0p0 F +REG esri:2271 0 OK 0x1.e097400000001p20 0x1.3d4353fa5fbaap18 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG esri:2271 1 OK 0x1.3d0a98c7262b1p20 -0x1.3463408d0b9b6p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG esri:2271 2 OK 0x1.4211f39c6cea8p21 -0x1.3463408d0b9b6p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG esri:2271 3 OK 0x1.45b47e1aeae0ap20 0x1.e030c687b6f0fp19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG esri:2271 4 OK 0x1.3dbd00f28a8fcp21 0x1.e030c687b6f0fp19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG esri:2272 0 OK 0x1.e097400000001p20 0x1.228706283a7dap18 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG esri:2272 1 OK 0x1.4b41287d3886ep20 -0x1.1b56c665c812bp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG esri:2272 2 OK 0x1.3af6abc163bcap21 -0x1.1b56c665c812bp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG esri:2272 3 OK 0x1.5248e02a502b8p20 0x1.b74b291d3d9e2p19 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG esri:2272 4 OK 0x1.3772cfead7ea5p21 0x1.b74b291d3d9e2p19 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG esri:2273 0 OK 0x1.e847fffffffffp20 0x1.0a7b29855bfffp19 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG esri:2273 1 OK 0x1.a6b7fa6e5a964p19 -0x1.0104117a0f575p19 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG esri:2273 2 OK 0x1.7e9a0164695a6p21 -0x1.0104117a0f575p19 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG esri:2273 3 OK 0x1.cbc29b0bbdc86p19 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG esri:2273 4 OK 0x1.7557593d108dep21 0x1.9456dad7a0ae1p20 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG esri:2274 0 OK 0x1.e097400000001p20 0x1.7249af14fd5f7p18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG esri:2274 1 OK 0x1.21cff166c8dcep20 -0x1.686fc945bcc3ap18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:2274 2 OK 0x1.4faf474c9b922p21 -0x1.686fc945bcc3ap18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:2274 3 OK 0x1.2b7ae3b3fa77ep20 0x1.181e65e2f759ep20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:2274 4 OK 0x1.4ad9ce2602c4ap21 0x1.181e65e2f759ep20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:2275 0 OK 0x1.4064d55810625p19 0x1.c0fe8fdb3116fp21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG esri:2275 1 OK -0x1.3f2832962a474p17 0x1.61539a6f805e1p21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG esri:2275 2 OK 0x1.6849dbaad5aa2p20 0x1.61539a6f805e1p21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG esri:2275 3 OK -0x1.d6bce3b2d8b88p16 0x1.11a734805e99ap22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:2275 4 OK 0x1.5dd0a3933decep20 0x1.11a734805e99ap22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:2276 0 OK 0x1.e097400000001p20 0x1.aa07448f1fd1dp22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG esri:2276 1 OK 0x1.0e08d221ed15ep20 0x1.77a266cdd041ep22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:2276 2 OK 0x1.5992d6ef09752p21 0x1.77a266cdd041ep22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:2276 3 OK 0x1.18ae070a39686p20 0x1.ddc50c43a4fbcp22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:2276 4 OK 0x1.54403c7ae34bep21 0x1.ddc50c43a4fbcp22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:2277 0 OK 0x1.18583aa9fbe77p21 0x1.38abba7c13554p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG esri:2277 1 OK 0x1.66573f1cbd665p20 0x1.205b8ceeb4ae2p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:2277 2 OK 0x1.7d84d5c5991c4p21 0x1.205b8ceeb4ae2p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:2277 3 OK 0x1.6f78cd5a43b2p20 0x1.518fea6f3bd32p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:2277 4 OK 0x1.78f40ea6d5f67p21 0x1.518fea6f3bd32p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:22770 0 OK 0x1.24f8p18 0x1.24f8p18 0x0.0p0 0x1.2accccccccccdp5 0x1.15333333333p5 0x0.0p0 F +REG esri:22770 1 OK -0x1.1b528b5dd2ab2p18 -0x1.cf18940efe354p17 0x0.0p0 0x1.f45a283b2e20bp4 0x1.da666666665bep4 0x0.0p0 F +REG esri:22770 2 OK 0x1.b2a145aee9553p19 -0x1.cf18940efe354p17 0x0.0p0 0x1.5b6c857c02894p5 0x1.da666666665bep4 0x0.0p0 F +REG esri:22770 3 OK -0x1.b3ee60b909d1ep17 0x1.a960b7b52d251p19 0x0.0p0 0x1.f45a283b2e20bp4 0x1.3d33333333316p5 0x0.0p0 F +REG esri:22770 4 OK 0x1.91f3982e42743p19 0x1.a960b7b52d251p19 0x0.0p0 0x1.5b6c857c02894p5 0x1.3d33333333316p5 0x0.0p0 F +REG esri:2278 0 OK 0x1.e097400000001p20 0x1.9e15d995fed92p23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG esri:2278 1 OK 0x1.00cc87766a53p20 0x1.833abe4c7b5aap23 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:2278 2 OK 0x1.6030fc44cad6p21 0x1.833abe4c7b5aap23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:2278 3 OK 0x1.0b39a79d764ecp20 0x1.b999bb2d94be9p23 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG esri:2278 4 OK 0x1.5afa6c3144d82p21 0x1.b999bb2d94be9p23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG esri:22780 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.3933333333333p5 0x1.1199999999962p5 0x0.0p0 T +REG esri:22780 1 OK -0x1.1f7550d83b8ecp19 -0x1.06c2454ebc4c2p19 0x0.0p0 0x1.08d64d61eda3fp5 0x1.d333333333285p4 0x0.0p0 T +REG esri:22780 2 OK 0x1.1f7550d83b8ecp19 -0x1.06c2454ebc4c2p19 0x0.0p0 0x1.6990190478c28p5 0x1.d333333333285p4 0x0.0p0 T +REG esri:22780 3 OK -0x1.fed5e85e2d5ecp18 0x1.1708fb5f0654dp19 0x0.0p0 0x1.08d64d61eda3fp5 0x1.399999999997ap5 0x0.0p0 T +REG esri:22780 4 OK 0x1.fed5e85e2d5ecp18 0x1.1708fb5f0654dp19 0x0.0p0 0x1.6990190478c28p5 0x1.399999999997ap5 0x0.0p0 T +REG esri:2279 0 OK 0x1.e097400000004p19 0x1.0050fa9056718p24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG esri:2279 1 OK 0x1.5a737b3449568p17 0x1.e8d4dcffe75a3p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:2279 2 OK 0x1.b548d09976d69p20 0x1.e8d4dcffe75a3p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:2279 3 OK 0x1.959b7d15aec2p17 0x1.0c736d9d8321ap24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:2279 4 OK 0x1.ade3d05d4a292p20 0x1.0c736d9d8321ap24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:2280 0 OK 0x1.907e3f2b020c4p20 0x1.b0bcb31dc80ddp21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG esri:2280 1 OK 0x1.0c2d791b0ddfdp20 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:2280 2 OK 0x1.0a67829d7b1c6p21 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:2280 3 OK 0x1.11e2dc82e7e8p20 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:2280 4 OK 0x1.078cd0e98e184p21 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:2281 0 OK 0x1.907e3f2b020c4p20 0x1.aa3e8395be8cep22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG esri:2281 1 OK 0x1.7593ba36d54f5p19 0x1.77a162f228e24p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG esri:2281 2 OK 0x1.3319509d4cb7fp21 0x1.77a162f228e24p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG esri:2281 3 OK 0x1.913c3b56f469ap19 0x1.de9a059a5b245p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:2281 4 OK 0x1.2c2f305544f16p21 0x1.de9a059a5b245p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:2282 0 OK 0x1.907e3f2b020c4p20 0x1.35b8f277f903cp23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG esri:2282 1 OK 0x1.edab35460106dp19 0x1.233be022151cdp23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:2282 2 OK 0x1.151371d981ca1p21 0x1.233be022151cdp23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:2282 3 OK 0x1.fb40883a07bdp19 0x1.48a3d66522362p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG esri:2282 4 OK 0x1.11ae1d1c801c8p21 0x1.48a3d66522362p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG esri:2283 0 OK 0x1.5e6e495581062p23 0x1.a18871711cb36p22 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG esri:2283 1 OK 0x1.4cf5197041bfep23 0x1.7fd2a21fc5129p22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:2283 2 OK 0x1.6fe7793ac04c6p23 0x1.7fd2a21fc5129p22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:2283 3 OK 0x1.4daf24ae73916p23 0x1.c3fa9abc48ea7p22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:2283 4 OK 0x1.6f2d6dfc8e7aep23 0x1.c3fa9abc48ea7p22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:22832 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:22832 1 OK -0x1.ad89324e3d9ap15 -0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:22832 2 OK 0x1.0190499271ecep20 -0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:22832 3 OK -0x1.ad89324e3d9ap15 0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:22832 4 OK 0x1.0190499271ecep20 0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2284 0 OK 0x1.5e6e495581062p23 0x1.b4c9df24ac0d5p21 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG esri:2284 1 OK 0x1.4bcff5cb476d2p23 0x1.6d000dc7b0a53p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:2284 2 OK 0x1.710c9cdfba9f2p23 0x1.6d000dc7b0a53p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:2284 3 OK 0x1.4c99ab85b93f8p23 0x1.fe2bf52fc2ep21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG esri:2284 4 OK 0x1.7042e72548cccp23 0x1.fe2bf52fc2ep21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG esri:2285 0 OK 0x1.907e0aac08311p20 0x1.34b943da25dcp18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:2285 1 OK 0x1.e1046a555e299p19 -0x1.2a05dbbd41b1cp18 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:2285 2 OK 0x1.183cf016b0a79p21 -0x1.2a05dbbd41b1cp18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:2285 3 OK 0x1.f5bf3365debfap19 0x1.d42f38a973c72p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2285 4 OK 0x1.130e3dd29082p21 0x1.d42f38a973c72p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2286 0 OK 0x1.907e0aac08311p20 0x1.641db43fe1661p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG esri:2286 1 OK 0x1.aeba938e29b67p19 -0x1.5696ad3494dp18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:2286 2 OK 0x1.24cf65c87dc37p21 -0x1.5696ad3494dp18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:2286 3 OK 0x1.c8e23804965a7p19 0x1.0e4ce207389b5p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:2286 4 OK 0x1.1e457caae29a7p21 0x1.0e4ce207389b5p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:2287 0 OK 0x1.e097400000001p20 0x1.1ce0d17f7cab5p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG esri:2287 1 OK 0x1.4d9405f33b66ep20 -0x1.1462814d34f0fp18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:2287 2 OK 0x1.39cd3d06624cap21 -0x1.1462814d34f0fp18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:2287 3 OK 0x1.55d5a07b34e9bp20 0x1.af67f5201dfecp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:2287 4 OK 0x1.35ac6fc2658b4p21 0x1.af67f5201dfecp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:2288 0 OK 0x1.e097400000001p20 0x1.28adfc81f178p18 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG esri:2288 1 OK 0x1.477bd35a7b7eep20 -0x1.1fe0500f281bbp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:2288 2 OK 0x1.3cd95652c240ap21 -0x1.1fe0500f281bbp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:2288 3 OK 0x1.500ba7b16b42p20 0x1.c143a7a70eb87p19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:2288 4 OK 0x1.38916c274a5f1p21 0x1.c143a7a70eb87p19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:2289 0 OK 0x1.e097400000001p20 0x1.6fca8cd604f06p18 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG esri:2289 1 OK 0x1.21d65e6fa50bep20 -0x1.62f2a3777f0e4p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:2289 2 OK 0x1.4fac10c82d79bp21 -0x1.62f2a3777f0e4p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:2289 3 OK 0x1.2e4ecb4ca0019p20 0x1.16ea191559a8cp20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:2289 4 OK 0x1.496fda59affedp21 0x1.16ea191559a8cp20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:2290 0 OK 0x1.55ccp19 0x1.86ap18 0x0.0p0 -0x1.f8p5 0x1.79ffffffff65p5 0x0.0p0 T +REG esri:2290 1 OK 0x1.65cdec6cd022p16 -0x1.f5616e5cea628p16 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2290 2 OK 0x1.3f6f213932fdcp20 -0x1.f5616e5cea628p16 0x0.0p0 -0x1.bd129258af177p5 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2290 3 OK 0x1.7f9773f61ed08p17 0x1.df1a2d8e72d79p19 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a1ffffffffbe1p5 0x0.0p0 T +REG esri:2290 4 OK 0x1.25d911813c25dp20 0x1.df1a2d8e72d79p19 0x0.0p0 -0x1.bd129258af178p5 0x1.a1ffffffffbe1p5 0x0.0p0 T +REG esri:2291 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 -0x1.f8p5 0x1.79ffffffff65p5 0x0.0p0 T +REG esri:2291 1 OK -0x1.970909c997efp17 0x1.0947a468c5676p18 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2291 2 OK 0x1.ec62427265fb7p19 0x1.0947a468c5676p18 0x0.0p0 -0x1.bd129258af178p5 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2291 3 OK -0x1.94b11813c25fp16 0x1.513516c7396bcp20 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a1ffffffffbddp5 0x0.0p0 T +REG esri:2291 4 OK 0x1.b9362302784bap19 0x1.513516c7396bcp20 0x0.0p0 -0x1.bd129258af178p5 0x1.a1ffffffffbddp5 0x0.0p0 T +REG esri:2292 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 -0x1.f8p5 0x1.79ffffffff65p5 0x0.0p0 T +REG esri:2292 1 OK -0x1.97092222a012cp17 0x1.094799c23e3f8p18 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2292 2 OK 0x1.ec624888a8046p19 0x1.094799c23e3f8p18 0x0.0p0 -0x1.bd129258af178p5 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2292 3 OK -0x1.94b14045c7f18p16 0x1.513519b2f7486p20 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a1ffffffffbddp5 0x0.0p0 T +REG esri:2292 4 OK 0x1.b9362808b8fep19 0x1.513519b2f7486p20 0x0.0p0 -0x1.bd129258af178p5 0x1.a1ffffffffbddp5 0x0.0p0 T +REG esri:2294 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2294 1 OK 0x1.e18cf8b42dc8ap21 -0x1.0ef825cdefab2p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2294 2 OK 0x1.348a83a5e91bcp22 -0x1.0ef825cdefab3p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2294 3 OK 0x1.e18cf8b42dc8ap21 0x1.0ef825cdefab2p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2294 4 OK 0x1.348a83a5e91bcp22 0x1.0ef825cdefab3p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2295 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG esri:2295 1 OK 0x1.2dcf7c5a16e43p22 -0x1.0ef825cdefab3p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2295 2 OK 0x1.719383a5e91bbp22 -0x1.0ef825cdefab2p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2295 3 OK 0x1.2dcf7c5a16e43p22 0x1.0ef825cdefab3p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2295 4 OK 0x1.719383a5e91bbp22 0x1.0ef825cdefab2p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:22991 0 OK 0x1.24f8p18 0x1.0c8ep20 0x0.0p0 0x1.18p5 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:22991 1 OK -0x1.14d60d550bf14p18 0x1.10a663f72141fp19 0x0.0p0 0x1.d39fbba3caa48p4 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22991 2 OK 0x1.af6306aa85f8ap19 0x1.10a663f72141fp19 0x0.0p0 0x1.4630222e1aadcp5 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22991 3 OK -0x1.bc1251b2bde28p17 0x1.97a7bf9478762p20 0x0.0p0 0x1.d39fbba3cd5aep4 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22991 4 OK 0x1.93fc946caf78ap19 0x1.97a7bf9478762p20 0x0.0p0 0x1.4630222e19528p5 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22992 0 OK 0x1.2c4bp19 0x1.8b82p19 0x0.0p0 0x1.fp4 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:22992 1 OK 0x1.ec7f2aaf40f2p14 0x1.0618c7ee4283ep18 0x0.0p0 0x1.939fbba3caa48p4 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22992 2 OK 0x1.2499035542fc5p20 0x1.0618c7ee4283ep18 0x0.0p0 0x1.2630222e1aadcp5 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22992 3 OK 0x1.56535c9a843cp16 0x1.50dabf9478762p20 0x0.0p0 0x1.939fbba3cd5aep4 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22992 4 OK 0x1.16e5ca3657bc5p20 0x1.50dabf9478762p20 0x0.0p0 0x1.2630222e19529p5 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22993 0 OK 0x1.55ccp19 0x1.86ap17 0x0.0p0 0x1.bp4 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:22993 1 OK 0x1.c727caabd03bp16 -0x1.4d9b3811bd7c2p18 0x0.0p0 0x1.539fbba3caa48p4 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22993 2 OK 0x1.3959835542fc5p20 -0x1.4d9b3811bd7c2p18 0x0.0p0 0x1.0630222e1aadcp5 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22993 3 OK 0x1.512dae4d421d8p17 0x1.77db7f28f0ec3p19 0x0.0p0 0x1.539fbba3cd5afp4 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22993 4 OK 0x1.2ba64a3657bc5p20 0x1.77db7f28f0ec3p19 0x0.0p0 0x1.0630222e19529p5 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22994 0 OK 0x1.55ccp19 0x1.24f8p20 0x0.0p0 0x1.bp4 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:22994 1 OK 0x1.c727caabd03bp16 0x1.417a63f72141fp19 0x0.0p0 0x1.539fbba3caa48p4 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22994 2 OK 0x1.3959835542fc5p20 0x1.417a63f72141fp19 0x0.0p0 0x1.0630222e1aadcp5 0x1.8fffffffc8574p4 0x0.0p0 F +REG esri:22994 3 OK 0x1.512dae4d421d8p17 0x1.b011bf9478762p20 0x0.0p0 0x1.539fbba3cd5afp4 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:22994 4 OK 0x1.2ba64a3657bc5p20 0x1.b011bf9478762p20 0x0.0p0 0x1.0630222e19529p5 0x1.17ffffffc2684p5 0x0.0p0 F +REG esri:23028 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:23028 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23028 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23028 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:23028 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:23029 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:23029 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23029 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23029 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:23029 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:23030 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:23030 1 OK -0x1.ada0e5629f84p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23030 2 OK 0x1.0191072b14fbap20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0000000000001p1 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23030 3 OK -0x1.ada0e5629f84p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ffffffffffffep2 0x1.4000000000001p2 0x0.0p0 F +REG esri:23030 4 OK 0x1.0191072b14fbap20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0000000000001p1 0x1.4000000000001p2 0x0.0p0 F +REG esri:23031 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:23031 1 OK -0x1.ada0e5629f73p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ffffffffffffep0 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23031 2 OK 0x1.0191072b14fc2p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.ffffffffffffep2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23031 3 OK -0x1.ada0e5629f73p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ffffffffffffep0 0x1.4000000000001p2 0x0.0p0 F +REG esri:23031 4 OK 0x1.0191072b14fc2p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.ffffffffffffep2 0x1.4000000000001p2 0x0.0p0 F +REG esri:23032 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:23032 1 OK -0x1.ada0e5629f7bp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0000000000001p2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23032 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23032 3 OK -0x1.ada0e5629f7bp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0000000000001p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:23032 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:23033 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:23033 1 OK -0x1.ada0e5629f6bp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23033 2 OK 0x1.0191072b14fc6p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23033 3 OK -0x1.ada0e5629f6bp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p3 0x1.4000000000001p2 0x0.0p0 F +REG esri:23033 4 OK 0x1.0191072b14fc6p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:23034 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:23034 1 OK -0x1.ada0e5629f73p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23034 2 OK 0x1.0191072b14fc2p20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.ap4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23034 3 OK -0x1.ada0e5629f73p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:23034 4 OK 0x1.0191072b14fc2p20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.ap4 0x1.4000000000001p2 0x0.0p0 F +REG esri:23035 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:23035 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23035 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23035 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:23035 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:23036 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:23036 1 OK -0x1.ada0e5629f81p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.c000000000001p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23036 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.3p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23036 3 OK -0x1.ada0e5629f81p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.c000000000001p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:23036 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.3p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:23037 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:23037 1 OK -0x1.ada0e5629f7p15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.1p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23037 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23037 3 OK -0x1.ada0e5629f7p15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.1p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:23037 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.6p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:23038 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:23038 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23038 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 0x1.9p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:23038 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 0x1.4p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:23038 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 0x1.9p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2308 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.b4p6 0x0.0p0 0x0.0p0 T +REG esri:2308 1 OK -0x1.acf431b3aef8p15 0x1.203f34d016105p23 0x0.0p0 0x1.a00000001d2ddp6 -0x1.3fffffffeafbcp2 0x0.0p0 F +REG esri:2308 2 OK 0x1.018ba18d9d782p20 0x1.203f34d016105p23 0x0.0p0 0x1.c7ffffffe2d24p6 -0x1.3fffffffeafbcp2 0x0.0p0 F +REG esri:2308 3 OK -0x1.acf431b3aef8p15 0x1.421acb2fe9efbp23 0x0.0p0 0x1.a00000001d2ddp6 0x1.3fffffffeafbcp2 0x0.0p0 F +REG esri:2308 4 OK 0x1.018ba18d9d782p20 0x1.421acb2fe9efbp23 0x0.0p0 0x1.c7ffffffe2d24p6 0x1.3fffffffeafbcp2 0x0.0p0 F +REG esri:2309 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.d000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2309 1 OK -0x1.ad750e7d838ap15 0x1.203eca48be405p23 0x0.0p0 0x1.bc0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2309 2 OK 0x1.018fa873ec1bfp20 0x1.203eca48be405p23 0x0.0p0 0x1.e3ffffffe2affp6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2309 3 OK -0x1.ad750e7d838ap15 0x1.421b35b741bfbp23 0x0.0p0 0x1.bc0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2309 4 OK 0x1.018fa873ec1bfp20 0x1.421b35b741bfbp23 0x0.0p0 0x1.e3ffffffe2affp6 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:23090 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:23090 1 OK -0x1.ada0e5413d16p15 -0x1.0ee4204ccc2abp19 0x0.0p0 -0x1.3ffffffe27f2bp2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23090 2 OK 0x1.0191072a09e8bp20 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.3ffffffe27f2bp2 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23090 3 OK -0x1.ada0e5413d16p15 0x1.0ee4204ccc2abp19 0x0.0p0 -0x1.3ffffffe27f2bp2 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23090 4 OK 0x1.0191072a09e8bp20 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.3ffffffe27f2bp2 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23095 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4p2 0x0.0p0 0x0.0p0 T +REG esri:23095 1 OK -0x1.ada0e5413d16p15 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.d80d4dc8277f9p-30 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23095 2 OK 0x1.0191072a09e8bp20 -0x1.0ee4204ccc2abp19 0x0.0p0 0x1.3fffffff13f95p3 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23095 3 OK -0x1.ada0e5413d16p15 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.d80d4dc8277f9p-30 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23095 4 OK 0x1.0191072a09e8bp20 0x1.0ee4204ccc2abp19 0x0.0p0 0x1.3fffffff13f95p3 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2310 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2310 1 OK -0x1.ad750e7d837ep15 0x1.203eca48be405p23 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2310 2 OK 0x1.018fa873ec1bfp20 0x1.203eca48be405p23 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2310 3 OK -0x1.ad750e7d837ep15 0x1.421b35b741bfbp23 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2310 4 OK 0x1.018fa873ec1bfp20 0x1.421b35b741bfbp23 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:2311 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG esri:2311 1 OK -0x1.ad750e7d8384p15 -0x1.0ee35b741bfafp19 0x0.0p0 0x1.000000075406dp0 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2311 2 OK 0x1.018fa873ec1c2p20 -0x1.0ee35b741bfafp19 0x0.0p0 0x1.5fffffff157f3p3 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2311 3 OK -0x1.ad750e7d8384p15 0x1.0ee35b741bfafp19 0x0.0p0 0x1.000000075406dp0 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2311 4 OK 0x1.018fa873ec1c2p20 0x1.0ee35b741bfafp19 0x0.0p0 0x1.5fffffff157f3p3 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2312 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2312 1 OK -0x1.ad892fd8997p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2312 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2312 3 OK -0x1.ad892fd8997p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2312 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2313 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2313 1 OK -0x1.ad892fd8997p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2313 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2313 3 OK -0x1.ad892fd8997p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2313 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.4000000000001p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2314 0 OK 0x1.14e27809b135bp18 0x1.a04f0ed6383ddp17 0x1.4f8c38b5p5 -0x1.eaaaaaaaaaaadp5 0x1.4e22222222223p3 0x1.0p-29 F +REG esri:2314 1 OK -0x1.7e1392f8ed155p20 -0x1.84fccc09e71dep20 0x1.5565400c3p6 -0x1.09ab8c8a7bb3ep6 0x1.5c44435f04bd9p2 -0x1.0f6p-19 F +REG esri:2314 2 OK 0x1.0442785e5ea8cp21 -0x1.84fccc09d1a09p20 0x1.1b4a2b6aep6 -0x1.c1fe3c40709f7p5 0x1.5c44435f6c1e8p2 -0x1.fd8p-21 F +REG esri:2314 3 OK -0x1.6fd0a231f52c9p20 0x1.f4496921fad8ep20 0x1.ab961bdep3 -0x1.09ab8d29e1fc5p6 0x1.ee222159ae6cbp3 -0x1.58cp-18 F +REG esri:2314 4 OK 0x1.fa41fdbc162ep20 0x1.f449692218ee4p20 -0x1.6831e6ep-1 -0x1.c1fe3b021f0fbp5 0x1.ee22215a1526ep3 0x1.4b8p-19 F +REG esri:2315 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:2315 1 OK -0x1.fc406e18cd02p14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:2315 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:2315 3 OK -0x1.2fefde056e358p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2315 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2316 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:2316 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:2316 2 OK 0x1.f82a0370c6681p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:2316 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2316 4 OK 0x1.0722fde056e36p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2317 0 OK 0x1.e848p19 0x1.e848p19 0x0.0p0 -0x1.08p6 0x1.7fffffffffdcdp2 0x0.0p0 F +REG esri:2317 1 OK 0x1.3e037abe574e4p18 0x1.4bf796fd07844p18 0x0.0p0 -0x1.2021d7c64dfb1p6 0x0.0p0 0x0.0p0 T +REG esri:2317 2 OK 0x1.98c721506a2c7p20 0x1.4bf796fd07844p18 0x0.0p0 -0x1.dfbc50736409ep5 0x0.0p0 0x0.0p0 T +REG esri:2317 3 OK 0x1.4c4a77690426p18 0x1.971e7c7cf739bp20 0x0.0p0 -0x1.2021d7c64dfb1p6 0x1.7fffffffffdfp3 0x0.0p0 F +REG esri:2317 4 OK 0x1.95356225bef68p20 0x1.971e7c7cf739bp20 0x0.0p0 -0x1.dfbc50736409ep5 0x1.7fffffffffdfp3 0x0.0p0 F +REG esri:2318 0 OK 0x0.0p0 -0x1.32dc19c8cb88cp13 0x0.0p0 0x1.8000000000001p5 0x1.8ffffffffff28p4 0x0.0p0 F +REG esri:2318 1 OK -0x1.c491e6a339fecp20 -0x1.7ca0e65520e31p20 0x0.0p0 0x1.f73075edbe9d5p4 0x1.3fffffffffe4cp3 0x0.0p0 F +REG esri:2318 2 OK 0x1.c491e6a339fe9p20 -0x1.7ca0e65520e31p20 0x0.0p0 0x1.0233e2849058bp6 0x1.3fffffffffe4cp3 0x0.0p0 F +REG esri:2318 3 OK -0x1.613f50bb3484ep20 0x1.aa3068fcb7d92p20 0x0.0p0 0x1.f73075edbe9d5p4 0x1.3ffffffffffe8p5 0x0.0p0 F +REG esri:2318 4 OK 0x1.613f50bb3484cp20 0x1.aa3068fcb7d92p20 0x0.0p0 0x1.0233e2849058bp6 0x1.3ffffffffffe8p5 0x0.0p0 F +REG esri:2319 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2319 1 OK -0x1.af5d1130fa03p15 -0x1.0effe063c668dp19 0x0.0p0 0x1.6000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2319 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.ffffffff89fcbp4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2319 3 OK -0x1.af5d1130fa03p15 0x1.0effe063c668dp19 0x0.0p0 0x1.6000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2319 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.ffffffff89fcbp4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2320 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2320 1 OK -0x1.af5d1130fap15 -0x1.0effe063c668dp19 0x0.0p0 0x1.9000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2320 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.17ffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2320 3 OK -0x1.af5d1130fap15 0x1.0effe063c668dp19 0x0.0p0 0x1.9000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2320 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.17ffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2321 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2321 1 OK -0x1.af5d1130fa03p15 -0x1.0effe063c668dp19 0x0.0p0 0x1.c000000076036p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2321 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.2fffffffc4fe6p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2321 3 OK -0x1.af5d1130fa03p15 0x1.0effe063c668dp19 0x0.0p0 0x1.c000000076036p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2321 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.2fffffffc4fe6p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2322 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:2322 1 OK -0x1.af5d1130fa03p15 -0x1.0effe063c668dp19 0x0.0p0 0x1.f000000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2322 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.47ffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2322 3 OK -0x1.af5d1130fa03p15 0x1.0effe063c668dp19 0x0.0p0 0x1.f000000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2322 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.47ffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2323 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2323 1 OK -0x1.af5d1130f9fdp15 -0x1.0effe063c668dp19 0x0.0p0 0x1.100000003b01bp5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2323 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.5fffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2323 3 OK -0x1.af5d1130f9fdp15 0x1.0effe063c668dp19 0x0.0p0 0x1.100000003b01bp5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2323 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.5fffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23239 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:23239 1 OK -0x1.ad892fd8996ep15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23239 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23239 3 OK -0x1.ad892fd8996ep15 0x1.0edd047bd8483p19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23239 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2324 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG esri:2324 1 OK -0x1.af5d1130fa03p15 -0x1.0effe063c668dp19 0x0.0p0 0x1.280000003b01bp5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2324 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.77ffffffc4fe6p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2324 3 OK -0x1.af5d1130fa03p15 0x1.0effe063c668dp19 0x0.0p0 0x1.280000003b01bp5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2324 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.77ffffffc4fe6p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:23240 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:23240 1 OK -0x1.ad892fd8998bp15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23240 2 OK 0x1.0190497ec4cb7p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23240 3 OK -0x1.ad892fd8998bp15 0x1.0edd047bd8483p19 0x0.0p0 0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23240 4 OK 0x1.0190497ec4cb7p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2325 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2325 1 OK -0x1.af5d1130fa03p15 -0x1.0effe063c668dp19 0x0.0p0 0x1.400000003b01ap5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2325 2 OK 0x1.019ee88987d02p20 -0x1.0effe063c668dp19 0x0.0p0 0x1.8fffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2325 3 OK -0x1.af5d1130fa03p15 0x1.0effe063c668dp19 0x0.0p0 0x1.400000003b01ap5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2325 4 OK 0x1.019ee88987d02p20 0x1.0effe063c668dp19 0x0.0p0 0x1.8fffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG esri:2326 0 OK 0x1.986b271bc1efcp19 0x1.9004ea3069de9p19 0x1.5be658eap1 0x1.c8b6d744b106fp6 0x1.64fe7f856ac0dp4 0x1.00c78p-13 F +REG esri:2326 1 OK 0x1.fe1ec6b28479cp17 0x1.0b64c66eb18dp18 0x1.935bf3bp3 0x1.b3187ac84842cp6 0x1.14fe7f8529d4dp4 0x1.9af1p-14 F +REG esri:2326 2 OK 0x1.58a8165c53a3cp20 0x1.0b6805e7453b6p18 -0x1.139cf4ebcp5 0x1.de5533c113cadp6 0x1.14fe7f8526aaap4 0x1.adf38p-13 F +REG esri:2326 3 OK 0x1.25f7f88f4cfd8p18 0x1.520f7718351e5p20 0x1.1f78702d6p5 0x1.b3187ac83190fp6 0x1.b4fe7f8571c74p4 0x1.116ap-14 F +REG esri:2326 4 OK 0x1.4eec59483cc4ap20 0x1.52103c9ab1834p20 -0x1.f65685ddp2 0x1.de5533c133a6cp6 0x1.b4fe7f8562d76p4 0x1.5e378p-13 F +REG esri:2327 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2327 1 OK 0x1.8b0b4e445a9c8p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2327 2 OK 0x1.acee31bba5637p23 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2327 3 OK 0x1.8b0b4e445a9c8p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2327 4 OK 0x1.acee31bba5637p23 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2328 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2328 1 OK 0x1.a98fce445a9c9p23 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2328 2 OK 0x1.cb72b1bba5638p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2328 3 OK 0x1.a98fce445a9c9p23 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2328 4 OK 0x1.cb72b1bba5638p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2329 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2329 1 OK 0x1.c8144e445a9c9p23 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2329 2 OK 0x1.e9f731bba5638p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2329 3 OK 0x1.c8144e445a9c9p23 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2329 4 OK 0x1.e9f731bba5638p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2330 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2330 1 OK 0x1.e698ce445a9c8p23 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2330 2 OK 0x1.043dd8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2330 3 OK 0x1.e698ce445a9c8p23 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2330 4 OK 0x1.043dd8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2331 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2331 1 OK 0x1.028ea7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2331 2 OK 0x1.138018ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2331 3 OK 0x1.028ea7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2331 4 OK 0x1.138018ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2332 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2332 1 OK 0x1.11d0e7222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2332 2 OK 0x1.22c258ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2332 3 OK 0x1.11d0e7222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2332 4 OK 0x1.22c258ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2333 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2333 1 OK 0x1.211327222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2333 2 OK 0x1.320498ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2333 3 OK 0x1.211327222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2333 4 OK 0x1.320498ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2334 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2334 1 OK 0x1.305567222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2334 2 OK 0x1.4146d8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2334 3 OK 0x1.305567222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2334 4 OK 0x1.4146d8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2335 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2335 1 OK 0x1.3f97a7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2335 2 OK 0x1.508918ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2335 3 OK 0x1.3f97a7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2335 4 OK 0x1.508918ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2336 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2336 1 OK 0x1.4ed9e7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2336 2 OK 0x1.5fcb58ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2336 3 OK 0x1.4ed9e7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2336 4 OK 0x1.5fcb58ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2337 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2337 1 OK 0x1.5e1c27222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2337 2 OK 0x1.6f0d98ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2337 3 OK 0x1.5e1c27222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2337 4 OK 0x1.6f0d98ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2338 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2338 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2338 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2338 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2338 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2339 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2339 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2339 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2339 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2339 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2340 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2340 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2340 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2340 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2340 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2341 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2341 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2341 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2341 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2341 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2342 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2342 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2342 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2342 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2342 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2343 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2343 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2343 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2343 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2343 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:23433 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:23433 1 OK -0x1.ad89324e3d8ap15 -0x1.0edd0485be135p19 0x0.0p0 0x1.4000000000001p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23433 2 OK 0x1.0190499271ed5p20 -0x1.0edd0485be135p19 0x0.0p0 0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23433 3 OK -0x1.ad89324e3d8ap15 0x1.0edd0485be135p19 0x0.0p0 0x1.4000000000001p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:23433 4 OK 0x1.0190499271ed5p20 0x1.0edd0485be135p19 0x0.0p0 0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2344 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2344 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2344 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2344 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2344 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2345 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2345 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2345 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2345 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2345 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2346 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2346 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2346 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2346 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2346 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2347 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2347 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2347 2 OK 0x1.019d8ddd2b1c6p20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2347 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2347 4 OK 0x1.019d8ddd2b1c6p20 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2348 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2348 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2348 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2348 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2348 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2349 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2349 1 OK 0x1.7ca0a7222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2349 2 OK 0x1.8d9218ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2349 3 OK 0x1.7ca0a7222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2349 4 OK 0x1.8d9218ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2350 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2350 1 OK 0x1.8be2e7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2350 2 OK 0x1.9cd458ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2350 3 OK 0x1.8be2e7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2350 4 OK 0x1.9cd458ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2351 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2351 1 OK 0x1.9b2527222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2351 2 OK 0x1.ac1698ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2351 3 OK 0x1.9b2527222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2351 4 OK 0x1.ac1698ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2352 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2352 1 OK 0x1.aa6767222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2352 2 OK 0x1.bb58d8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2352 3 OK 0x1.aa6767222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2352 4 OK 0x1.bb58d8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2353 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2353 1 OK 0x1.b9a9a7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2353 2 OK 0x1.ca9b18ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2353 3 OK 0x1.b9a9a7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2353 4 OK 0x1.ca9b18ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2354 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2354 1 OK 0x1.c8ebe7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2354 2 OK 0x1.d9dd58ddd2b1cp24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2354 3 OK 0x1.c8ebe7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2354 4 OK 0x1.d9dd58ddd2b1cp24 0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2355 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2355 1 OK 0x1.d82e27222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2355 2 OK 0x1.e91f98ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2355 3 OK 0x1.d82e27222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2355 4 OK 0x1.e91f98ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2356 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2356 1 OK 0x1.e77067222d4e4p24 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2356 2 OK 0x1.f861d8ddd2b1cp24 -0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2356 3 OK 0x1.e77067222d4e4p24 0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2356 4 OK 0x1.f861d8ddd2b1cp24 0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2357 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2357 1 OK 0x1.f6b2a7222d4e4p24 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2357 2 OK 0x1.03d20c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2357 3 OK 0x1.f6b2a7222d4e4p24 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2357 4 OK 0x1.03d20c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2358 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2358 1 OK 0x1.02fa739116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2358 2 OK 0x1.0b732c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2358 3 OK 0x1.02fa739116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2358 4 OK 0x1.0b732c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2359 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2359 1 OK 0x1.0a9b939116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2359 2 OK 0x1.13144c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2359 3 OK 0x1.0a9b939116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2359 4 OK 0x1.13144c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2360 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2360 1 OK 0x1.123cb39116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2360 2 OK 0x1.1ab56c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2360 3 OK 0x1.123cb39116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2360 4 OK 0x1.1ab56c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2361 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2361 1 OK 0x1.19ddd39116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2361 2 OK 0x1.22568c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2361 3 OK 0x1.19ddd39116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2361 4 OK 0x1.22568c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2362 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2362 1 OK 0x1.217ef39116a72p25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2362 2 OK 0x1.29f7ac6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2362 3 OK 0x1.217ef39116a72p25 0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2362 4 OK 0x1.29f7ac6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2363 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2363 1 OK 0x1.2920139116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2363 2 OK 0x1.3198cc6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2363 3 OK 0x1.2920139116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2363 4 OK 0x1.3198cc6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2364 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2364 1 OK 0x1.30c1339116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2364 2 OK 0x1.3939ec6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2364 3 OK 0x1.30c1339116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2364 4 OK 0x1.3939ec6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2365 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2365 1 OK 0x1.3862539116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2365 2 OK 0x1.40db0c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2365 3 OK 0x1.3862539116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2365 4 OK 0x1.40db0c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2366 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2366 1 OK 0x1.4003739116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2366 2 OK 0x1.487c2c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2366 3 OK 0x1.4003739116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2366 4 OK 0x1.487c2c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2367 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2367 1 OK 0x1.47a4939116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2367 2 OK 0x1.501d4c6ee958ep25 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2367 3 OK 0x1.47a4939116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2367 4 OK 0x1.501d4c6ee958ep25 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff157fp7 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2368 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2368 1 OK 0x1.4f45b39116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2368 2 OK 0x1.57be6c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2368 3 OK 0x1.4f45b39116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2368 4 OK 0x1.57be6c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2369 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2369 1 OK 0x1.56e6d39116a72p25 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2369 2 OK 0x1.5f5f8c6ee958ep25 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2369 3 OK 0x1.56e6d39116a72p25 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2369 4 OK 0x1.5f5f8c6ee958ep25 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2370 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2370 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2370 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2370 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.180000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2370 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.3fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:23700 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:23700 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:23700 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:23700 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:23700 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG esri:2371 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2371 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2371 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2371 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.240000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2371 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.4bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2372 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2372 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2372 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2372 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2372 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.57ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2373 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2373 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2373 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2373 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.3c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2373 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.63ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2374 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2374 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2374 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2374 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2374 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.6fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2375 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2375 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2375 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2375 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2375 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.7bffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2376 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2376 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2376 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2376 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.600000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2376 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2377 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2377 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2377 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2377 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.6c0000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2377 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.93ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2378 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2378 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2378 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2378 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.780000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2378 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.9fffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2379 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2379 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2379 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2379 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.840000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2379 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.abffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2380 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2380 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2380 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2380 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.900000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2380 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.b7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2381 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2381 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2381 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2381 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.9c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2381 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.c3ffffffe2afep6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2382 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2382 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2382 2 OK 0x1.019d8ddd2b1cp20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2382 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.a80000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2382 4 OK 0x1.019d8ddd2b1cp20 0x1.0eff23baacee1p19 0x0.0p0 0x1.cfffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2383 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2383 1 OK -0x1.af31bba56381p15 -0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2383 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2383 3 OK -0x1.af31bba56381p15 0x1.0eff23baacee1p19 0x0.0p0 0x1.b40000001d502p6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2383 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.dbffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2384 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2384 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2384 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2384 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.c00000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2384 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.e7ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:23846 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:23846 1 OK -0x1.ad790f988ee1p15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.6p6 -0x1.4p2 0x0.0p0 F +REG esri:23846 2 OK 0x1.018fc87cc475fp20 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.88p6 -0x1.4p2 0x0.0p0 F +REG esri:23846 3 OK -0x1.ad790f988ee1p15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.6p6 0x1.4p2 0x0.0p0 F +REG esri:23846 4 OK 0x1.018fc87cc475fp20 0x1.0ee39768aa48cp19 0x0.0p0 0x1.88p6 0x1.4p2 0x0.0p0 F +REG esri:23847 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:23847 1 OK -0x1.ad790f988ecap15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.78p6 -0x1.4p2 0x0.0p0 F +REG esri:23847 2 OK 0x1.018fc87cc476ap20 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.ap6 -0x1.4p2 0x0.0p0 F +REG esri:23847 3 OK -0x1.ad790f988ecap15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.78p6 0x1.4p2 0x0.0p0 F +REG esri:23847 4 OK 0x1.018fc87cc476ap20 0x1.0ee39768aa48cp19 0x0.0p0 0x1.ap6 0x1.4p2 0x0.0p0 F +REG esri:23848 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:23848 1 OK -0x1.ad790f988eeep15 -0x1.0ee39768aa48dp19 0x0.0p0 0x1.9p6 -0x1.4p2 0x0.0p0 F +REG esri:23848 2 OK 0x1.018fc87cc4758p20 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG esri:23848 3 OK -0x1.ad790f988eeep15 0x1.0ee39768aa48dp19 0x0.0p0 0x1.9p6 0x1.4p2 0x0.0p0 F +REG esri:23848 4 OK 0x1.018fc87cc4758p20 0x1.0ee39768aa48cp19 0x0.0p0 0x1.b8p6 0x1.4p2 0x0.0p0 F +REG esri:23849 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:23849 1 OK -0x1.ad790f988ebp15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG esri:23849 2 OK 0x1.018fc87cc477dp20 -0x1.0ee39768aa48dp19 0x0.0p0 0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG esri:23849 3 OK -0x1.ad790f988ebp15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.a8p6 0x1.4p2 0x0.0p0 F +REG esri:23849 4 OK 0x1.018fc87cc477dp20 0x1.0ee39768aa48dp19 0x0.0p0 0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG esri:2385 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2385 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2385 2 OK 0x1.019d8ddd2b1c6p20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2bp6 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2385 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.cc0000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2385 4 OK 0x1.019d8ddd2b1c6p20 0x1.0eff23baacee1p19 0x0.0p0 0x1.f3ffffffe2bp6 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:23850 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:23850 1 OK -0x1.ad790f988ecap15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.cp6 -0x1.4p2 0x0.0p0 F +REG esri:23850 2 OK 0x1.018fc87cc4765p20 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG esri:23850 3 OK -0x1.ad790f988ecap15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.cp6 0x1.4p2 0x0.0p0 F +REG esri:23850 4 OK 0x1.018fc87cc4765p20 0x1.0ee39768aa48cp19 0x0.0p0 0x1.e8p6 0x1.4p2 0x0.0p0 F +REG esri:23851 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:23851 1 OK -0x1.ad790f988ebp15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG esri:23851 2 OK 0x1.018fc87cc477p20 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.0p7 -0x1.4p2 0x0.0p0 F +REG esri:23851 3 OK -0x1.ad790f988ebp15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG esri:23851 4 OK 0x1.018fc87cc477p20 0x1.0ee39768aa48cp19 0x0.0p0 0x1.0p7 0x1.4p2 0x0.0p0 F +REG esri:23852 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:23852 1 OK -0x1.ad790f988ebp15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.fp6 -0x1.4p2 0x0.0p0 F +REG esri:23852 2 OK 0x1.018fc87cc477dp20 -0x1.0ee39768aa48dp19 0x0.0p0 0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG esri:23852 3 OK -0x1.ad790f988ebp15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.fp6 0x1.4p2 0x0.0p0 F +REG esri:23852 4 OK 0x1.018fc87cc477dp20 0x1.0ee39768aa48dp19 0x0.0p0 0x1.0cp7 0x1.4p2 0x0.0p0 F +REG esri:23853 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:23853 1 OK -0x1.ad790f988ecap15 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.04p7 -0x1.4p2 0x0.0p0 F +REG esri:23853 2 OK 0x1.018fc87cc4765p20 -0x1.0ee39768aa48cp19 0x0.0p0 0x1.18p7 -0x1.4p2 0x0.0p0 F +REG esri:23853 3 OK -0x1.ad790f988ecap15 0x1.0ee39768aa48cp19 0x0.0p0 0x1.04p7 0x1.4p2 0x0.0p0 F +REG esri:23853 4 OK 0x1.018fc87cc4765p20 0x1.0ee39768aa48cp19 0x0.0p0 0x1.18p7 0x1.4p2 0x0.0p0 F +REG esri:2386 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2386 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2386 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2386 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.d80000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2386 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.ffffffffe2affp6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2387 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2387 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2387 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2387 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.e40000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2387 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.05fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2388 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2388 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2388 2 OK 0x1.019d8ddd2b1c6p20 -0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 -0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:2388 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.f00000001d501p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2388 4 OK 0x1.019d8ddd2b1c6p20 0x1.0eff23baacee1p19 0x0.0p0 0x1.0bfffffff158p7 0x1.3fffffffeae12p2 0x0.0p0 F +REG esri:23886 0 OK 0x1.e847fffffffeap18 0x1.b9978b7230128p22 0x0.0p0 0x1.74p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23886 1 OK -0x1.fbecc053fa1ep14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23886 2 OK 0x1.f82766029fcfbp19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.8a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23886 3 OK -0x1.2fda3e8750138p16 0x1.daca825ef5034p22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23886 4 OK 0x1.0721a3e875008p20 0x1.daca825ef5034p22 0x0.0p0 0x1.8a114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23887 0 OK 0x1.e848p18 0x1.b9978b7230128p22 0x0.0p0 0x1.8cp6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23887 1 OK -0x1.fbecc053fa0ap14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23887 2 OK 0x1.f82766029fd05p19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23887 3 OK -0x1.2fda3e87500d8p16 0x1.daca825ef5034p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23887 4 OK 0x1.0721a3e87500ep20 0x1.daca825ef5034p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23888 0 OK 0x1.e847fffffffd4p18 0x1.b9978b7230128p22 0x0.0p0 0x1.a400000000001p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23888 1 OK -0x1.fbecc053fa4ap14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23888 2 OK 0x1.f82766029fcfp19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:23888 3 OK -0x1.2fda3e87501f8p16 0x1.daca825ef5034p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.3fffffffffffdp4 0x0.0p0 F +REG esri:23888 4 OK 0x1.0721a3e875002p20 0x1.daca825ef5034p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23889 0 OK 0x1.e848000000042p18 0x1.b9978b7230128p22 0x0.0p0 0x1.bcp6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23889 1 OK -0x1.fbecc053f9cap14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:23889 2 OK 0x1.f82766029fd1bp19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23889 3 OK -0x1.2fda3e874ffcp16 0x1.daca825ef5034p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23889 4 OK 0x1.0721a3e875019p20 0x1.daca825ef5034p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2389 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2389 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2389 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2389 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.fc0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2389 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.11fffffff158p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:23890 0 OK 0x1.e848p18 0x1.b9978b7230128p22 0x0.0p0 0x1.d4p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23890 1 OK -0x1.fbecc053fa0ap14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23890 2 OK 0x1.f82766029fd05p19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23890 3 OK -0x1.2fda3e87500d8p16 0x1.daca825ef5034p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23890 4 OK 0x1.0721a3e87500ep20 0x1.daca825ef5034p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23891 0 OK 0x1.e84800000002cp18 0x1.b9978b7230128p22 0x0.0p0 0x1.ec00000000001p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23891 1 OK -0x1.fbecc053f9ep14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:23891 2 OK 0x1.f82766029fd1bp19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23891 3 OK -0x1.2fda3e875002p16 0x1.daca825ef5034p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23891 4 OK 0x1.0721a3e875019p20 0x1.daca825ef5034p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23892 0 OK 0x1.e84800000002cp18 0x1.b9978b7230128p22 0x0.0p0 0x1.02p7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23892 1 OK -0x1.fbecc053f9ep14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:23892 2 OK 0x1.f82766029fd1bp19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23892 3 OK -0x1.2fda3e875002p16 0x1.daca825ef5034p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23892 4 OK 0x1.0721a3e875019p20 0x1.daca825ef5034p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23893 0 OK 0x1.e848p18 0x1.b9978b7230128p22 0x0.0p0 0x1.0ep7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23893 1 OK -0x1.fbecc053fa0ap14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23893 2 OK 0x1.f82766029fd05p19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23893 3 OK -0x1.2fda3e87500d8p16 0x1.daca825ef5034p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23893 4 OK 0x1.0721a3e87500ep20 0x1.daca825ef5034p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23894 0 OK 0x1.e84800000002cp18 0x1.b9978b7230128p22 0x0.0p0 0x1.1ap7 -0x1.9000000000001p4 0x0.0p0 F +REG esri:23894 1 OK -0x1.fbecc053f9ep14 0x1.97011f10ebe7cp22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:23894 2 OK 0x1.f82766029fd1bp19 0x1.97011f10ebe7cp22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:23894 3 OK -0x1.2fda3e875002p16 0x1.daca825ef5034p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:23894 4 OK 0x1.0721a3e875019p20 0x1.daca825ef5034p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2390 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2390 1 OK -0x1.af31bba56375p15 -0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2390 2 OK 0x1.019d8ddd2b1bap20 -0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2390 3 OK -0x1.af31bba56375p15 0x1.0eff23baaceep19 0x0.0p0 0x1.040000000ea81p7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2390 4 OK 0x1.019d8ddd2b1bap20 0x1.0eff23baaceep19 0x0.0p0 0x1.17fffffff157fp7 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2391 0 OK 0x1.6e3c3059f61a3p20 0x1.40adb39bbdb54p6 -0x1.12136e99ap7 0x1.50000001c72bdp4 0x1.7d370653bae5p-28 0x1.a7c64p-12 T +REG esri:2391 1 OK 0x1.cd5e7b123c332p19 -0x1.0ef527b420af4p19 -0x1.32db69f9a8p7 0x1.00000001d0b5bp4 -0x1.3ffffffbc497p2 0x1.a2988p-13 F +REG esri:2391 2 OK 0x1.f5c7d2db28197p20 -0x1.0ef7d512e13c6p19 -0x1.1bb8766368p7 0x1.a0000001c4d0cp4 -0x1.3ffffffbe214fp2 0x1.e20f4p-12 F +REG esri:2391 3 OK 0x1.cd6155d47d03p19 0x1.0f0bcfd4bf9fap19 -0x1.095dedf878p7 0x1.00000001c12c8p4 0x1.40000007c95bep2 0x1.b55ccp-12 F +REG esri:2391 4 OK 0x1.f5c906312fdd6p20 0x1.0f094228e7ac5p19 -0x1.e48f1bb7cp6 0x1.a0000001a9d3p4 0x1.400000073d3b7p2 0x1.5cc72p-11 F +REG esri:2392 0 OK 0x1.312fe4127356p21 0x1.27ab2b3895306p6 -0x1.0b724bd6p7 0x1.800000020667dp4 0x1.763af023bbff5p-28 0x1.fe71p-12 T +REG esri:2392 1 OK 0x1.dad2dd0462dcfp20 -0x1.0ef5ec99f82f1p19 -0x1.2b23bd3bcp7 0x1.30000002199acp4 -0x1.3ffffffbcb7a8p2 0x1.15048p-12 F +REG esri:2392 2 OK 0x1.74f5b48f1b18ap21 -0x1.0ef88db3ed298p19 -0x1.1643eb7a98p7 0x1.d0000001fbe2fp4 -0x1.3ffffffbeee0bp2 0x1.25e72p-11 F +REG esri:2392 3 OK 0x1.dad4443912edcp20 0x1.0f0af84d64634p19 -0x1.01aa199928p7 0x1.3000000206901p4 0x1.40000007a702cp2 0x1.f6064p-12 F +REG esri:2392 4 OK 0x1.74f64b268776ep21 0x1.0f0876e6349e9p19 -0x1.d9ad40216p6 0x1.d0000001dd995p4 0x1.4000000705a0bp2 0x1.8f1ep-11 F +REG esri:2393 0 OK 0x1.ab41aea6e9ae9p21 0x1.0f27be4ed377p6 -0x1.0581ff17f8p7 0x1.b00000023ff5dp4 0x1.6e38497371818p-28 0x1.2fee6p-11 T +REG esri:2393 1 OK 0x1.677b3ceb4e61dp21 -0x1.0ef6af6607f6bp19 -0x1.2414455fcp7 0x1.600000025dfabp4 -0x1.3ffffffbd400bp2 0x1.65384p-12 F +REG esri:2393 2 OK 0x1.ef077ed6f6fd3p21 -0x1.0ef9426e05b86p19 -0x1.11863b07ap7 0x1.00000001161c9p5 -0x1.3ffffffbfdba8p2 0x1.5f58ap-11 F +REG esri:2393 3 OK 0x1.677becfb9d63dp21 0x1.0f0a24d0cd3cdp19 -0x1.f53cd6d0bp6 0x1.60000002477bap4 0x1.400000077dfa4p2 0x1.2146cp-11 F +REG esri:2393 4 OK 0x1.ef0811e6ed49p21 0x1.0f07b17b70cdp19 -0x1.d038eabdep6 0x1.00000001055c4p5 0x1.40000006c84c5p2 0x1.c5bc2p-11 F +REG esri:2394 0 OK 0x1.12a9bc07ecba2p22 0x1.ee693fc48c59fp5 -0x1.0046b31f2p7 0x1.e000000273342p4 0x1.6534b12843dfp-28 0x1.657bap-11 T +REG esri:2394 1 OK 0x1.e18d0a22b139dp21 -0x1.0ef76f8fa301cp19 -0x1.1db1f6a078p7 0x1.900000029d196p4 -0x1.3ffffffbde45dp2 0x1.c1098p-12 F +REG esri:2394 2 OK 0x1.348ca4356c66p22 -0x1.0ef9f2c25d59cp19 -0x1.0d82b8aa8p7 0x1.180000012aa7cp5 -0x1.3ffffffc0ec94p2 0x1.9cbcap-11 F +REG esri:2394 3 OK 0x1.e18db637a2179p21 0x1.0f0955f35cbe8p19 -0x1.e87fa9f12p6 0x1.900000028335fp4 0x1.400000074e81dp2 0x1.4d0bap-11 F +REG esri:2394 4 OK 0x1.348cebc0fa355p22 0x1.0f06f2731f7a8p19 -0x1.c838bddb7p6 0x1.180000011857ep5 0x1.40000006859a7p2 0x1.0002ep-10 F +REG esri:23946 0 OK 0x1.e888ead35682cp18 -0x1.2ae0c6d9c167dp8 0x1.9137966d2p5 0x1.7400000000001p6 0x1.2f74bf1dcfcaep-60 -0x1.0p-30 T +REG esri:23946 1 OK -0x1.ab60397a836p15 -0x1.0f082dd8af63ap19 0x1.d36039326p5 0x1.5ffffffffffffp6 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:23946 2 OK 0x1.019f7760cc77dp20 -0x1.0f082dda54ae1p19 0x1.9e25de26fp6 0x1.8800000000001p6 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:23946 3 OK -0x1.ab6956936cdep15 0x1.0ebd7649fb032p19 0x1.93236ff6p2 0x1.5ffffffffffffp6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:23946 4 OK 0x1.019fc05af7069p20 0x1.0ebd764b9f6b1p19 0x1.9b50b3b38p5 0x1.8800000000001p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:23947 0 OK 0x1.e89dbbaaf4e13p18 -0x1.2ae0652a48db9p8 0x1.47000f5e9p6 0x1.8c00000000001p6 0x0.0p0 0x1.8p-29 T +REG esri:23947 1 OK -0x1.aab435aeaffbp15 -0x1.0f07d50ab306bp19 0x1.4a2fbcfdfp6 0x1.7800000000001p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG esri:23947 2 OK 0x1.01a47fbc3a83ep20 -0x1.0f07d50cdfc07p19 0x1.1c416cf2cp7 0x1.a000000000001p6 -0x1.3fffffffffffep2 -0x1.0p-29 F +REG esri:23947 3 OK -0x1.aabd52657fa3p15 0x1.0ebd1d943964ep19 0x1.e6c82dafp4 0x1.7800000000001p6 0x1.3fffffffffffdp2 -0x1.0p-30 F +REG esri:23947 4 OK 0x1.01a4c8b8e7823p20 0x1.0ebd1d9664f37p19 0x1.6805a8d2bp6 0x1.a000000000001p6 0x1.3fffffffffffep2 -0x1.0p-29 F +REG esri:23948 0 OK 0x1.e8b19bf582dfcp18 -0x1.2adfe91844771p8 0x1.e788064f7p6 0x1.a400000000001p6 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:23948 1 OK -0x1.aa0e3b10fffcp15 -0x1.0f0764405225cp19 0x1.cddefa111p6 0x1.9000000000001p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG esri:23948 2 OK 0x1.01a9401a06896p20 -0x1.0f076443007c6p19 0x1.79b9607eep7 0x1.b800000000001p6 -0x1.4p2 -0x1.8p-29 F +REG esri:23948 3 OK -0x1.aa1757675638p15 0x1.0ebcace89e95fp19 0x1.fac31efe4p5 0x1.9000000000001p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:23948 4 OK 0x1.01a9891902808p20 0x1.0ebcaceb4b7bdp19 0x1.117afa5a8p7 0x1.b800000000001p6 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2395 0 OK 0x1.036697ae3ec5dp23 -0x1.0bff87e78fd81p6 0x1.5a922326ep5 0x1.67ffffffffffep5 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG esri:2395 1 OK 0x1.e4ea5dee74e1ep22 -0x1.0f0700d55d3fbp19 0x1.6179b1508p5 0x1.400000003a93ep5 -0x1.3fffffffeae59p2 -0x1.0p-30 F +REG esri:2395 2 OK 0x1.145800665e824p23 -0x1.0f0700d5a4d6fp19 0x1.9e606a5ecp5 0x1.8fffffffc55ep5 -0x1.3fffffffeadfbp2 -0x1.0p-30 F +REG esri:2395 3 OK 0x1.e4ea59d84942fp22 0x1.0ef641009a776p19 0x1.040bf0c86p5 0x1.400000003a94ap5 0x1.3fffffffeae6dp2 0x0.0p0 F +REG esri:2395 4 OK 0x1.14580271895d3p23 0x1.0ef64100e205ep19 0x1.40f2b131ap5 0x1.8fffffffc55d6p5 0x1.3fffffffeae0cp2 -0x1.0p-30 F +REG esri:2396 0 OK 0x1.21eaf790da586p23 -0x1.0bff7d7fab492p6 0x1.789968ef8p5 0x1.9800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2396 1 OK 0x1.10f98f807b7a2p23 -0x1.0f06f648baaf1p19 0x1.8a6dc6d4cp5 0x1.700000003a966p5 -0x1.3fffffffeae45p2 -0x1.0p-30 F +REG esri:2396 2 OK 0x1.32dc5fa1ecd8fp23 -0x1.0f06f648e80e8p19 0x1.b10614d1cp5 0x1.bfffffffc560cp5 -0x1.3fffffffeae0ap2 -0x1.0p-29 F +REG esri:2396 3 OK 0x1.10f98d75620cbp23 0x1.0ef636749d13ap19 0x1.2d000b3f2p5 0x1.700000003a972p5 0x1.3fffffffeae5ap2 -0x1.0p-30 F +REG esri:2396 4 OK 0x1.32dc61ad139cap23 0x1.0ef63674ca6dap19 0x1.53985de58p5 0x1.bfffffffc5602p5 0x1.3fffffffeae1ep2 0x1.0p-30 F +REG esri:2397 0 OK 0x1.ab430a190c9d1p21 0x1.5913ed0a9d9acp6 -0x1.dde889771p6 0x1.1fffffffff1a9p3 -0x1.e00b9ddf5b21bp-39 0x1.8f88p-17 T +REG esri:2397 1 OK 0x1.677cf1a79c40bp21 -0x1.0ef58efdc0579p19 -0x1.150d0be838p7 0x1.00000001d58dcp2 -0x1.3fffffffea3d9p2 0x1.9048p-17 F +REG esri:2397 2 OK 0x1.ef09236def97bp21 -0x1.0ef58da152addp19 -0x1.d31c79e9cp6 0x1.bfffffff13dap3 -0x1.3fffffffec4ebp2 0x1.8d08p-17 F +REG esri:2397 3 OK 0x1.677cfc476b96cp21 0x1.0f0b1cb6bb148p19 -0x1.e898c9fp6 0x1.00000001d36cdp2 0x1.3fffffffea796p2 0x1.90d8p-17 F +REG esri:2397 4 OK 0x1.ef0917210a347p21 0x1.0f0b2201373d3p19 -0x1.919b1b039p6 0x1.bfffffff12d5p3 0x1.3fffffffe861bp2 0x1.83dp-17 F +REG esri:2398 0 OK 0x1.12aa854bd113ep22 0x1.593ec2addd59cp6 -0x1.c3aa69102p6 0x1.7ffffffffe82p3 -0x1.92008a2ac7ed9p-38 0x1.8c28p-17 T +REG esri:2398 1 OK 0x1.e18ef6fced6bp21 -0x1.0ef57c5657b24p19 -0x1.080a3e9d9p7 0x1.c0000001d454ep2 -0x1.3fffffffeadefp2 0x1.9128p-17 F +REG esri:2398 2 OK 0x1.348d8fd30d9f2p22 -0x1.0ef578bb6d226p19 -0x1.b90bec395p6 0x1.0fffffff89a4p4 -0x1.3fffffffecf63p2 0x1.886p-17 F +REG esri:2398 3 OK 0x1.e18f010c6daeep21 0x1.0f0b0a7e3364p19 -0x1.ce9331c59p6 0x1.c0000001d234ap2 0x1.3fffffffe9da1p2 0x1.8ec8p-17 F +REG esri:2398 4 OK 0x1.348d896473678p22 0x1.0f0b12072b6f9p19 -0x1.778a7a4ccp6 0x1.0fffffff89232p4 0x1.3fffffffe7ce6p2 0x1.7c38p-17 F +REG esri:2399 0 OK 0x1.4fb3842b6a9ffp22 0x1.597f2dee6f1d7p6 -0x1.a9722d98p6 0x1.dffffffffdedap3 -0x1.197095cd03ce5p-37 0x1.8708p-17 T +REG esri:2399 1 OK 0x1.2dd07cc8a939bp22 -0x1.0ef569047361ap19 -0x1.f5f63668p6 0x1.40000000e98f6p3 -0x1.3fffffffeb827p2 0x1.908p-17 F +REG esri:2399 2 OK 0x1.71968c8fb48fap22 -0x1.0ef5632ef428cp19 -0x1.9f1fc410ep6 0x1.3fffffff895e3p4 -0x1.3fffffffed9eap2 0x1.822p-17 F +REG esri:2399 3 OK 0x1.2dd08188c0511p22 0x1.0f0af8f8729ebp19 -0x1.b474e6e8dp6 0x1.40000000e8805p3 0x1.3fffffffe93ddp2 0x1.8b08p-17 F +REG esri:2399 4 OK 0x1.719685d9702f8p22 0x1.0f0b02bbfd332p19 -0x1.5d9e38c4ap6 0x1.3fffffff88df3p4 0x1.3fffffffe73fap2 0x1.7308p-17 F +REG esri:2400 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.f9dd695bb473bp3 0x0.0p0 0x0.0p0 T +REG esri:2400 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2400 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2400 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2400 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:2401 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2401 1 OK 0x1.7ca09dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2401 2 OK 0x1.8d922200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2401 3 OK 0x1.7ca09dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2401 4 OK 0x1.8d922200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2402 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2402 1 OK 0x1.8be2ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2402 2 OK 0x1.9cd46200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2402 3 OK 0x1.8be2ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2402 4 OK 0x1.9cd46200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2403 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2403 1 OK 0x1.9b251dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2403 2 OK 0x1.ac16a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2403 3 OK 0x1.9b251dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2403 4 OK 0x1.ac16a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2404 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2404 1 OK 0x1.aa675dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2404 2 OK 0x1.bb58e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2404 3 OK 0x1.aa675dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2404 4 OK 0x1.bb58e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24047 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:24047 1 OK -0x1.acdef72748bcp15 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.78p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:24047 2 OK 0x1.018af7b93a464p20 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.ap6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24047 3 OK -0x1.acdef72748bcp15 0x1.0eddea79e9b99p19 0x0.0p0 0x1.78p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:24047 4 OK 0x1.018af7b93a464p20 0x1.0eddea79e9b99p19 0x0.0p0 0x1.ap6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24048 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:24048 1 OK -0x1.acdef72748ep15 -0x1.0eddea79e9b9ap19 0x0.0p0 0x1.9p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:24048 2 OK 0x1.018af7b93a452p20 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.b8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24048 3 OK -0x1.acdef72748ep15 0x1.0eddea79e9b9ap19 0x0.0p0 0x1.9p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:24048 4 OK 0x1.018af7b93a452p20 0x1.0eddea79e9b99p19 0x0.0p0 0x1.b8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:2405 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2405 1 OK 0x1.b9a99dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2405 2 OK 0x1.ca9b2200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2405 3 OK 0x1.b9a99dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2405 4 OK 0x1.ca9b2200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2406 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2406 1 OK 0x1.c8ebddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2406 2 OK 0x1.d9dd6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2406 3 OK 0x1.c8ebddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2406 4 OK 0x1.d9dd6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2407 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2407 1 OK 0x1.d82e1dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2407 2 OK 0x1.e91fa200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2407 3 OK 0x1.d82e1dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2407 4 OK 0x1.e91fa200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2408 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2408 1 OK 0x1.e7705dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2408 2 OK 0x1.f861e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2408 3 OK 0x1.e7705dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2408 4 OK 0x1.f861e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2409 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2409 1 OK 0x1.f6b29dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2409 2 OK 0x1.03d211007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2409 3 OK 0x1.f6b29dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2409 4 OK 0x1.03d211007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2410 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2410 1 OK 0x1.02fa6eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2410 2 OK 0x1.0b7331007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2410 3 OK 0x1.02fa6eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2410 4 OK 0x1.0b7331007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24100 0 OK 0x1.0c8e000000001p19 0x1.86a0000000001p18 0x0.0p0 -0x1.34p6 0x1.1fffffffffee1p4 0x0.0p0 F +REG esri:24100 1 OK -0x1.4439b6bf0f614p20 -0x1.5387a5034920dp20 0x0.0p0 -0x1.49077c9109a7dp6 0x1.9fffffffffde3p3 0x0.0p0 F +REG esri:24100 2 OK 0x1.2863db5f87b14p21 -0x1.5387a5034920dp20 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.9fffffffffde3p3 0x0.0p0 F +REG esri:24100 3 OK -0x1.2b0f962975ed6p20 0x1.11dd18481374p21 0x0.0p0 -0x1.49077c9109a7dp6 0x1.6ffffffffffp4 0x0.0p0 F +REG esri:24100 4 OK 0x1.1bcecb14baf74p21 0x1.11dd18481374p21 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.6ffffffffffp4 0x0.0p0 F +REG esri:2411 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2411 1 OK 0x1.0a9b8eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2411 2 OK 0x1.131451007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2411 3 OK 0x1.0a9b8eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2411 4 OK 0x1.131451007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2412 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2412 1 OK 0x1.123caeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2412 2 OK 0x1.1ab571007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2412 3 OK 0x1.123caeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2412 4 OK 0x1.1ab571007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2413 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2413 1 OK 0x1.19ddceff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2413 2 OK 0x1.225691007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2413 3 OK 0x1.19ddceff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2413 4 OK 0x1.225691007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2414 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2414 1 OK 0x1.217eeeff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2414 2 OK 0x1.29f7b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2414 3 OK 0x1.217eeeff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2414 4 OK 0x1.29f7b1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2415 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2415 1 OK 0x1.29200eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2415 2 OK 0x1.3198d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2415 3 OK 0x1.29200eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2415 4 OK 0x1.3198d1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2416 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2416 1 OK 0x1.30c12eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2416 2 OK 0x1.3939f1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2416 3 OK 0x1.30c12eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2416 4 OK 0x1.3939f1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2417 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2417 1 OK 0x1.38624eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2417 2 OK 0x1.40db11007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2417 3 OK 0x1.38624eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2417 4 OK 0x1.40db11007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2418 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2418 1 OK 0x1.40036eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2418 2 OK 0x1.487c31007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2418 3 OK 0x1.40036eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2418 4 OK 0x1.487c31007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2419 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2419 1 OK 0x1.47a48eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2419 2 OK 0x1.501d51007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2419 3 OK 0x1.47a48eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2419 4 OK 0x1.501d51007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2420 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2420 1 OK 0x1.4f45aeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2420 2 OK 0x1.57be71007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2420 3 OK 0x1.4f45aeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2420 4 OK 0x1.57be71007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24200 0 OK 0x1.e848p17 0x1.24f8p17 0x0.0p0 -0x1.34p6 0x1.1fffffffffee9p4 0x0.0p0 F +REG esri:24200 1 OK -0x1.3adb567f85f68p18 -0x1.828aa235771cp18 0x0.0p0 -0x1.49077c9109a7dp6 0x1.9fffffffffdeap3 0x0.0p0 F +REG esri:24200 2 OK 0x1.9191ab3fc2fcp19 -0x1.828aa235771cp18 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.9fffffffffdeap3 0x0.0p0 F +REG esri:24200 3 OK -0x1.1c2cfbd88078ep18 0x1.5b9be406eacbbp19 0x0.0p0 -0x1.49077c9109a7dp6 0x1.6ffffffffff07p4 0x0.0p0 F +REG esri:24200 4 OK 0x1.823a7dec403d2p19 0x1.5b9be406eacbbp19 0x0.0p0 -0x1.1ef8836ef6583p6 0x1.6ffffffffff07p4 0x0.0p0 F +REG esri:2421 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2421 1 OK 0x1.56e6ceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2421 2 OK 0x1.5f5f91007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2421 3 OK 0x1.56e6ceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2421 4 OK 0x1.5f5f91007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2422 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2422 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2422 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2422 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2422 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2423 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2423 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2423 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2423 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2423 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2424 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2424 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2424 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2424 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2424 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2425 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2425 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2425 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2425 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2425 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2426 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2426 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2426 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2426 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2426 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2427 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2427 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2427 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2427 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2427 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2428 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2428 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2428 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2428 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2428 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2429 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2429 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2429 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2429 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2429 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2430 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2430 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2430 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2430 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2430 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:24305 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:24305 1 OK -0x1.acdef72748ep15 -0x1.0eddea79e9b9ap19 0x0.0p0 0x1.48p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:24305 2 OK 0x1.018af7b93a452p20 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.7p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24305 3 OK -0x1.acdef72748ep15 0x1.0eddea79e9b9ap19 0x0.0p0 0x1.48p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:24305 4 OK 0x1.018af7b93a452p20 0x1.0eddea79e9b99p19 0x0.0p0 0x1.7p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24306 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:24306 1 OK -0x1.acdef72748d4p15 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.6p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24306 2 OK 0x1.018af7b93a458p20 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.88p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24306 3 OK -0x1.acdef72748d4p15 0x1.0eddea79e9b99p19 0x0.0p0 0x1.6p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24306 4 OK 0x1.018af7b93a458p20 0x1.0eddea79e9b99p19 0x0.0p0 0x1.88p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:2431 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2431 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2431 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2431 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2431 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24311 0 OK 0x1.e839a3a951e61p18 -0x1.cdced50b9dfc8p7 0x1.8e767c907p6 0x1.f8p5 0x0.0p0 0x1.0p-30 T +REG esri:24311 1 OK -0x1.add2ec441047p15 -0x1.0eff239dbdee8p19 0x1.01e20ddcd8p7 0x1.d000000000003p5 -0x1.3fffffffffffdp2 -0x1.0p-30 F +REG esri:24311 2 OK 0x1.018b692cbaac2p20 -0x1.0eff239d60ab5p19 0x1.dbd87ca75p6 0x1.1000000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24311 3 OK -0x1.add9f7ba75bep15 0x1.0ec56a40b2cb2p19 0x1.62b16a43dp6 0x1.d000000000001p5 0x1.3fffffffffffcp2 0x1.8p-29 F +REG esri:24311 4 OK 0x1.018ba185751dbp20 0x1.0ec56a4055aebp19 0x1.3ac5ba907p6 0x1.1000000000001p6 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:24312 0 OK 0x1.e84cf27030f13p18 -0x1.cdcede7a1b97ep7 0x1.8690a6e7bp6 0x1.14p6 0x1.2f74bf1dcfcadp-62 0x1.0p-29 T +REG esri:24312 1 OK -0x1.ad38ccf2a126p15 -0x1.0eff2929df1c2p19 0x1.e11795964p6 0x1.0p6 -0x1.4p2 0x1.0p-29 F +REG esri:24312 2 OK 0x1.01903fa32461ep20 -0x1.0eff2929ff3c9p19 0x1.eed813737p6 0x1.28p6 -0x1.4000000000003p2 -0x1.0p-30 F +REG esri:24312 3 OK -0x1.ad3fd8298802p15 0x1.0ec56fcba8a3fp19 0x1.4004d5aebp6 0x1.0p6 0x1.3fffffffffffcp2 0x1.0p-29 F +REG esri:24312 4 OK 0x1.019077fde1a7cp20 0x1.0ec56fcbc8b6fp19 0x1.4dc559465p6 0x1.28p6 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:24313 0 OK 0x1.e8603355bda93p18 -0x1.cdcec1461fc62p7 0x1.9f04db7ep6 0x1.2bfffffffffffp6 0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG esri:24313 1 OK -0x1.ac9db541b7e6p15 -0x1.0eff17fbb9522p19 0x1.de9971b93p6 0x1.18p6 -0x1.4p2 0x1.0p-30 F +REG esri:24313 2 OK 0x1.01950765e096ep20 -0x1.0eff17fc567fep19 0x1.10efbb726p7 0x1.4p6 -0x1.3ffffffffffffp2 -0x1.8p-29 F +REG esri:24313 3 OK -0x1.aca4c0378bb2p15 0x1.0ec55ea122166p19 0x1.3d86b0c7cp6 0x1.18p6 0x1.4000000000002p2 -0x1.0p-30 F +REG esri:24313 4 OK 0x1.01953fc2912d6p20 0x1.0ec55ea1bf02bp19 0x1.80ccd1f93p6 0x1.4p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:2432 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2432 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2432 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2432 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2432 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2433 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2433 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2433 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2433 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2433 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2434 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2434 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2434 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2434 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2434 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:24342 0 OK 0x1.e84ae921913f7p18 -0x1.00e53741bda72p8 0x1.6829f3d8cp5 0x1.14p6 -0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG esri:24342 1 OK -0x1.ad51d430ce0ap15 -0x1.0f02fcb21130ep19 0x1.1c2ada3a6p6 0x1.0p6 -0x1.4000000000002p2 -0x1.0p-30 F +REG esri:24342 2 OK 0x1.019003344e9bap20 -0x1.0f02fcb224131p19 0x1.244231f75p6 0x1.28p6 -0x1.3ffffffffffffp2 0x1.0p-30 F +REG esri:24342 3 OK -0x1.ad59aa71d5f1p15 0x1.0ec2c3f045ba4p19 0x1.a3da4c028p4 0x1.0p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:24342 4 OK 0x1.019041e70265fp20 0x1.0ec2c3f05893dp19 0x1.c437b9f6p4 0x1.28p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24343 0 OK 0x1.e85f9acd1faa2p18 -0x1.00e5287a8ba8bp8 0x1.94a7b3e2cp5 0x1.2bfffffffffffp6 0x1.c72f1eacb7b06p-60 -0x1.0p-29 T +REG esri:24343 1 OK -0x1.acab4ecbe771p15 -0x1.0f02ed10d6403p19 0x1.157b1c9dap6 0x1.18p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:24343 2 OK 0x1.019527ed24d9bp20 -0x1.0f02ed116f69dp19 0x1.57191c96cp6 0x1.4p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG esri:24343 3 OK -0x1.acb324bf5cb9p15 0x1.0ec2b452b5414p19 0x1.891b492bp4 0x1.18p6 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:24343 4 OK 0x1.019566a22faf3p20 0x1.0ec2b4534e242p19 0x1.47c9e159p5 0x1.4p6 0x1.4000000000003p2 -0x1.8p-29 F +REG esri:24344 0 OK 0x1.e8740a3da3cb2p18 -0x1.00e502c70eb34p8 0x1.031456bd7p6 0x1.44p6 0x0.0p0 0x1.0p-30 T +REG esri:24344 1 OK -0x1.ac055be666f9p15 -0x1.0f02c53184fc6p19 0x1.3165e4d13p6 0x1.3p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24344 2 OK 0x1.019a301c49babp20 -0x1.0f02c532a2d36p19 0x1.abd270eaap6 0x1.58p6 -0x1.4p2 -0x1.8p-29 F +REG esri:24344 3 OK -0x1.ac0d318b274p15 0x1.0ec28c7cbdf7ep19 0x1.f8c69db9p4 0x1.3p6 0x1.4p2 -0x1.0p-29 F +REG esri:24344 4 OK 0x1.019a6ed39345ep20 0x1.0ec28c7ddb4acp19 0x1.f13cd8886p5 0x1.58p6 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:24345 0 OK 0x1.e887fe1cd315ep18 -0x1.00e4c69119197p8 0x1.5db7340f4p6 0x1.5cp6 0x0.0p0 -0x1.0p-30 T +REG esri:24345 1 OK -0x1.ab61cd1f2136p15 -0x1.0f02858407cf9p19 0x1.6f9cde3a2p6 0x1.48p6 -0x1.4000000000002p2 -0x1.0p-29 F +REG esri:24345 2 OK 0x1.019f0da36c36ep20 -0x1.0f028585a7568p19 0x1.10c03b9a1p7 0x1.7000000000001p6 -0x1.3fffffffffffdp2 -0x1.8p-29 F +REG esri:24345 3 OK -0x1.ab69a274e70ep15 0x1.0ec24cde30092p19 0x1.78d17b58ep5 0x1.48p6 0x1.4000000000003p2 -0x1.0p-30 F +REG esri:24345 4 OK 0x1.019f4c5cd5d4ap20 0x1.0ec24cdfcedp19 0x1.6e4ca916ap6 0x1.7000000000001p6 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG esri:24346 0 OK 0x1.e89b3e6f7826ep18 -0x1.00e47481aad88p8 0x1.d93e23838p6 0x1.7400000000001p6 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG esri:24346 1 OK -0x1.aac26d5d26c6p15 -0x1.0f022ebb19cdp19 0x1.cf7178dp6 0x1.6p6 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:24346 2 OK 0x1.01a3b2dc080e4p20 -0x1.0f022ebd36a9dp19 0x1.5b6c808bep7 0x1.8800000000001p6 -0x1.4000000000004p2 -0x1.0p-28 F +REG esri:24346 3 OK -0x1.aaca42648a9p15 0x1.0ec1f6299c9cep19 0x1.1c3d84ab4p6 0x1.6p6 0x1.3ffffffffffffp2 -0x1.8p-29 F +REG esri:24346 4 OK 0x1.01a3f1976d244p20 0x1.0ec1f62bb87fap19 0x1.01d2bc1828p7 0x1.8800000000001p6 0x1.4p2 0x0.0p0 F +REG esri:24347 0 OK 0x1.e8ad9532ab3dbp18 -0x1.00e40d7f1639fp8 0x1.3a27476e98p7 0x1.8c00000000001p6 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG esri:24347 1 OK -0x1.aa28fbc6e204p15 -0x1.0f01c1ca4ff2ep19 0x1.27eb69b768p7 0x1.7800000000001p6 -0x1.4p2 -0x1.8p-29 F +REG esri:24347 2 OK 0x1.01a812bdbb25cp20 -0x1.0f01c1cce4781p19 0x1.b51c847e2p7 0x1.a000000000001p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:24347 3 OK -0x1.aa30d0815824p15 0x1.0ec189525f91p19 0x1.9ca31acabp6 0x1.7800000000001p6 0x1.4000000000001p2 -0x1.8p-29 F +REG esri:24347 4 OK 0x1.01a8517af1892p20 0x1.0ec18954f2e51p19 0x1.5b82e99a58p7 0x1.a000000000001p6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:2435 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2435 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2435 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2435 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2435 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2436 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2436 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2436 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2436 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2436 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2437 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2437 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2437 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2437 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2437 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:24370 0 OK 0x1.1f895ffffffffp21 0x1.3c298p21 0x0.0p0 0x1.1p6 0x1.3bfffffffffe6p5 0x0.0p0 F +REG esri:24370 1 OK 0x1.9fff140bea9c2p20 0x1.e9f46d2c4a9bp20 0x0.0p0 0x1.ec294c4167daep5 0x1.13fffffffffd1p5 0x0.0p0 F +REG esri:24370 2 OK 0x1.6f1335fa0ab1ap21 0x1.e9f46d2c4a9bp20 0x0.0p0 0x1.29eb59df4c129p6 0x1.13fffffffffd1p5 0x0.0p0 F +REG esri:24370 3 OK 0x1.b54b5eb8754dp20 0x1.88c12890db0b4p21 0x0.0p0 0x1.ec294c4167daep5 0x1.63ffffffffff4p5 0x0.0p0 F +REG esri:24370 4 OK 0x1.646d10a3c5593p21 0x1.88c12890db0b4p21 0x0.0p0 0x1.29eb59df4c129p6 0x1.63ffffffffff4p5 0x0.0p0 F +REG esri:24371 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.1p6 0x1.03fffffffffc7p5 0x0.0p0 F +REG esri:24371 1 OK 0x1.1fdcaf083ce34p21 0x1.9215227a23462p18 0x0.0p0 0x1.f0928b4db1cb9p5 0x1.b7fffffffff52p4 0x0.0p0 F +REG esri:24371 2 OK 0x1.bc8f50f7c31c7p21 0x1.9215227a23462p18 0x0.0p0 0x1.27b6ba59271a3p6 0x1.b7fffffffff52p4 0x0.0p0 F +REG esri:24371 3 OK 0x1.28168404b7a0ap21 0x1.8c23900bb2328p20 0x0.0p0 0x1.f0928b4db1cb9p5 0x1.2bfffffffffep5 0x0.0p0 F +REG esri:24371 4 OK 0x1.b4557bfb485f2p21 0x1.8c23900bb2328p20 0x0.0p0 0x1.27b6ba59271a3p6 0x1.2bfffffffffep5 0x0.0p0 F +REG esri:24372 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.28p6 0x1.9ffffffffff42p4 0x0.0p0 F +REG esri:24372 1 OK 0x1.20d60015ecc68p21 0x1.8e5d404f44fdp18 0x0.0p0 0x1.11bf7a6273dbcp6 0x1.4ffffffffff18p4 0x0.0p0 F +REG esri:24372 2 OK 0x1.bb95ffea13396p21 0x1.8e5d404f44fdp18 0x0.0p0 0x1.3e40859d8c244p6 0x1.4ffffffffff18p4 0x0.0p0 F +REG esri:24372 3 OK 0x1.2720fef78d17p21 0x1.8b1d7a8882486p20 0x0.0p0 0x1.11bf7a6273dbcp6 0x1.effffffffff7dp4 0x0.0p0 F +REG esri:24372 4 OK 0x1.b54b010872e8ep21 0x1.8b1d7a8882486p20 0x0.0p0 0x1.3e40859d8c244p6 0x1.effffffffff7dp4 0x0.0p0 F +REG esri:24373 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.4p6 0x1.2ffffffffff1p4 0x0.0p0 F +REG esri:24373 1 OK 0x1.21c5ab2ceab17p21 0x1.8ad6110a31142p18 0x0.0p0 0x1.2ad8fb6bb699ap6 0x1.bfffffffffe2bp3 0x0.0p0 F +REG esri:24373 2 OK 0x1.baa654d3154eap21 0x1.8ad6110a31142p18 0x0.0p0 0x1.5527049449666p6 0x1.bfffffffffe2bp3 0x0.0p0 F +REG esri:24373 3 OK 0x1.2636315f9e048p21 0x1.8a1d5b62d47fap20 0x0.0p0 0x1.2ad8fb6bb699ap6 0x1.7ffffffffff36p4 0x0.0p0 F +REG esri:24373 4 OK 0x1.b635cea061fb9p21 0x1.8a1d5b62d47fap20 0x0.0p0 0x1.5527049449666p6 0x1.7ffffffffff36p4 0x0.0p0 F +REG esri:24374 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.4p6 0x1.7fffffffffe46p3 0x0.0p0 F +REG esri:24374 1 OK 0x1.22a16b854d024p21 0x1.879171a69ceaap18 0x0.0p0 0x1.2b8d9dbc49a16p6 0x1.bfffffffffd95p2 0x0.0p0 F +REG esri:24374 2 OK 0x1.b9ca947ab2fdap21 0x1.879171a69ceaap18 0x0.0p0 0x1.54726243b65eap6 0x1.bfffffffffd95p2 0x0.0p0 F +REG esri:24374 3 OK 0x1.255ea29e0e63cp21 0x1.89323e42ceda8p20 0x0.0p0 0x1.2b8d9dbc49a16p6 0x1.0ffffffffff01p4 0x0.0p0 F +REG esri:24374 4 OK 0x1.b70d5d61f19c2p21 0x1.89323e42ceda8p20 0x0.0p0 0x1.54726243b65eap6 0x1.0ffffffffff01p4 0x0.0p0 F +REG esri:24375 0 OK 0x1.4edc8d851eb85p21 0x1.be7b675c28f5cp19 0x0.0p0 0x1.68p6 0x1.9ffffffffff42p4 0x0.0p0 F +REG esri:24375 1 OK 0x1.081c36600c468p21 0x1.6c432b6ec9ab2p18 0x0.0p0 0x1.51bf7a6273dbcp6 0x1.4ffffffffff18p4 0x0.0p0 F +REG esri:24375 2 OK 0x1.959ce4aa312a2p21 0x1.6c432b6ec9ab2p18 0x0.0p0 0x1.7e40859d8c244p6 0x1.4ffffffffff18p4 0x0.0p0 F +REG esri:24375 3 OK 0x1.0ddd4c9351c51p21 0x1.694a99cd55a85p20 0x0.0p0 0x1.51bf7a6273dbcp6 0x1.effffffffff7dp4 0x0.0p0 F +REG esri:24375 4 OK 0x1.8fdbce76ebab9p21 0x1.694a99cd55a85p20 0x0.0p0 0x1.7e40859d8c244p6 0x1.effffffffff7dp4 0x0.0p0 F +REG esri:24376 0 OK 0x1.4edd1a6c5ad93p21 0x1.be804d6e2939ep19 0x1.202a6286ep5 0x1.1p6 0x1.03fffffffffcap5 0x0.0p0 F +REG esri:24376 1 OK 0x1.07364dcd9ebc4p21 0x1.6fa6fd74b75aep18 0x1.2fd099f22p5 0x1.f0928b4db1cb9p5 0x1.b7fffffffff57p4 0x0.0p0 F +REG esri:24376 2 OK 0x1.9683e6fc65ff4p21 0x1.6fa7043debf6ap18 0x1.39f27c5f8p5 0x1.27b6ba59271a3p6 0x1.b7fffffffff53p4 0x1.0p-30 F +REG esri:24376 3 OK 0x1.0ebc0d70324dp21 0x1.6a404ba16a552p20 0x1.600132be6p5 0x1.f0928b4db1cb9p5 0x1.2bfffffffffep5 -0x1.0p-30 F +REG esri:24376 4 OK 0x1.8efe2775d8de6p21 0x1.6a4049f6ee11ap20 0x1.69113554p5 0x1.27b6ba59271a3p6 0x1.2bfffffffffdfp5 -0x1.0p-30 F +REG esri:24377 0 OK 0x1.4edf82cc7f853p21 0x1.be780b771305ep19 0x1.3f98b991ap5 0x1.28p6 0x1.9ffffffffff44p4 0x1.0p-30 F +REG esri:24377 1 OK 0x1.081cc54f74bccp21 0x1.6c30f34478392p18 0x1.41b09c1aap5 0x1.11bf7a6273dbdp6 0x1.4ffffffffff0ep4 0x0.0p0 F +REG esri:24377 2 OK 0x1.95a23fbe9c572p21 0x1.6c3145b2fc7fcp18 0x1.bb6a576acp5 0x1.3e40859d8c244p6 0x1.4ffffffffff13p4 0x0.0p0 F +REG esri:24377 3 OK 0x1.0dddfd1252398p21 0x1.694c334c03ea2p20 0x1.1ad030f42p5 0x1.11bf7a6273dbbp6 0x1.effffffffff72p4 -0x1.0p-30 F +REG esri:24377 4 OK 0x1.8fe10900cfd74p21 0x1.694c1efa64324p20 0x1.8a937bf7ep5 0x1.3e40859d8c243p6 0x1.effffffffff74p4 0x1.0p-29 F +REG esri:24378 0 OK 0x1.4edcca7dd2331p21 0x1.be812fc9f2c2p19 -0x1.5e0902368p4 0x1.1000000000001p6 0x1.03fffffffffc3p5 0x1.8p-29 F +REG esri:24378 1 OK 0x1.0735d333e288ap21 0x1.6fa78db3235dcp18 -0x1.33e47b56cp4 0x1.f0928b4db1cb9p5 0x1.b7fffffffff53p4 0x1.0p-29 F +REG esri:24378 2 OK 0x1.9683c1cc6a759p21 0x1.6fa78b8c5ae08p18 -0x1.3a5143268p4 0x1.27b6ba59271a3p6 0x1.b7fffffffff53p4 0x1.0p-30 F +REG esri:24378 3 OK 0x1.0ebb973d3153bp21 0x1.6a410e7948f1ep20 -0x1.8188afb9p3 0x1.f0928b4db1cb9p5 0x1.2bfffffffffdfp5 0x0.0p0 F +REG esri:24378 4 OK 0x1.8efdfdba38fa8p21 0x1.6a410f0081a14p20 -0x1.8d06eb7p3 0x1.27b6ba59271a3p6 0x1.2bfffffffffdep5 0x1.0p-30 F +REG esri:24379 0 OK 0x1.4edf60d7def8p21 0x1.be781c6986bfp19 -0x1.2fc2dc164p4 0x1.28p6 0x1.9ffffffffff3dp4 -0x1.0p-29 F +REG esri:24379 1 OK 0x1.081c786d24c18p21 0x1.6c2fd5d54dfecp18 -0x1.20484dp4 0x1.11bf7a6273dbcp6 0x1.4ffffffffff1ap4 -0x1.0p-30 F +REG esri:24379 2 OK 0x1.95a248bd2d70bp21 0x1.6c3024fb79c4cp18 -0x1.b43d9eccp1 0x1.3e40859d8c245p6 0x1.4ffffffffff15p4 0x1.0p-29 F +REG esri:24379 3 OK 0x1.0dddb3a7aee9ap21 0x1.694c8f22f779ep20 -0x1.6c6f0bf24p4 0x1.11bf7a6273dbcp6 0x1.effffffffff7dp4 0x1.0p-29 F +REG esri:24379 4 OK 0x1.8fe10e7d4eb2p21 0x1.694c7ba07697ep20 -0x1.2ba03bbc8p3 0x1.3e40859d8c244p6 0x1.effffffffff72p4 0x1.0p-30 F +REG esri:2438 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2438 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2438 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2438 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2438 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24380 0 OK 0x1.4ee611201acdep21 0x1.be7538a075306p19 0x1.c7aab2e8p4 0x1.6800000000001p6 0x1.9ffffffffff4bp4 -0x1.0p-30 F +REG esri:24380 1 OK 0x1.08234a9e545adp21 0x1.6c2aa790fd63ap18 0x1.74f217498p3 0x1.51bf7a6273dbcp6 0x1.4ffffffffff1fp4 0x0.0p0 F +REG esri:24380 2 OK 0x1.95a8d5ba41429p21 0x1.6c2bc8e439dc6p18 0x1.043ac6aaep6 0x1.7e40859d8c244p6 0x1.4ffffffffff13p4 0x0.0p0 F +REG esri:24380 3 OK 0x1.0de484571d39cp21 0x1.694af3b74a078p20 0x1.1ddc3a61p2 0x1.51bf7a6273dbcp6 0x1.effffffffff76p4 -0x1.0p-29 F +REG esri:24380 4 OK 0x1.8fe79f95be443p21 0x1.694aac67b0dc4p20 0x1.abfd498cap5 0x1.7e40859d8c245p6 0x1.effffffffff7bp4 -0x1.0p-29 F +REG esri:24381 0 OK 0x1.4ee1f0203a061p21 0x1.be6eefc929d72p19 0x1.013be6dcp0 0x1.4000000000001p6 0x1.2ffffffffff06p4 0x0.0p0 F +REG esri:24381 1 OK 0x1.08fa4de21d6f5p21 0x1.68e4ae7c9eef6p18 0x1.3e737d88p-1 0x1.2ad8fb6bb699ap6 0x1.bfffffffffe26p3 -0x1.8p-29 F +REG esri:24381 2 OK 0x1.94c9919b17868p21 0x1.68e54ddadf78ep18 0x1.dba385efcp4 0x1.5527049449666p6 0x1.bfffffffffe0cp3 0x0.0p0 F +REG esri:24381 3 OK 0x1.0d09a10fcd1dfp21 0x1.685d6560cea64p20 -0x1.09e70f3bp4 0x1.2ad8fb6bb699ap6 0x1.7ffffffffff32p4 0x0.0p0 F +REG esri:24381 4 OK 0x1.90ba3fd259194p21 0x1.685d3df17f9cep20 0x1.5919b7758p3 0x1.5527049449666p6 0x1.7ffffffffff2ep4 -0x1.0p-30 F +REG esri:24382 0 OK 0x1.6e35fffffffffp21 0x1.e847fffffffffp19 0x0.0p0 0x1.68p6 0x1.9ffffffffff42p4 0x0.0p0 F +REG esri:24382 1 OK 0x1.20d60015ecc68p21 0x1.8e5d404f44fdp18 0x0.0p0 0x1.51bf7a6273dbcp6 0x1.4ffffffffff18p4 0x0.0p0 F +REG esri:24382 2 OK 0x1.bb95ffea13396p21 0x1.8e5d404f44fdp18 0x0.0p0 0x1.7e40859d8c244p6 0x1.4ffffffffff18p4 0x0.0p0 F +REG esri:24382 3 OK 0x1.2720fef78d17p21 0x1.8b1d7a8882486p20 0x0.0p0 0x1.51bf7a6273dbcp6 0x1.effffffffff7dp4 0x0.0p0 F +REG esri:24382 4 OK 0x1.b54b010872e8ep21 0x1.8b1d7a8882486p20 0x0.0p0 0x1.7e40859d8c244p6 0x1.effffffffff7dp4 0x0.0p0 F +REG esri:24383 0 OK 0x1.4ee1f01f5ec47p21 0x1.be6745d19c9dep19 0x1.16b37eabp4 0x1.4p6 0x1.7fffffffffe3cp3 0x1.0p-30 F +REG esri:24383 1 OK 0x1.09c356e18e4cbp21 0x1.65d93860dd666p18 0x1.63a2f01fp4 0x1.2b8d9dbc49a16p6 0x1.bfffffffffd55p2 0x0.0p0 F +REG esri:24383 2 OK 0x1.940088ddc26b3p21 0x1.65d9d7853c95p18 0x1.98138dfaap5 0x1.54726243b65eap6 0x1.bfffffffffd71p2 0x1.0p-30 F +REG esri:24383 3 OK 0x1.0c44944dd67ecp21 0x1.67823f5e5fae4p20 -0x1.7f5b607cp2 0x1.2b8d9dbc49a16p6 0x1.0ffffffffffp4 0x1.0p-30 F +REG esri:24383 4 OK 0x1.917f4c4de1894p21 0x1.678217d95ef2ap20 0x1.5bdd67644p4 0x1.54726243b65eap6 0x1.0fffffffffeffp4 0x1.0p-30 F +REG esri:2439 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2439 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2439 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2439 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2439 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2440 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2440 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2440 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2440 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2440 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2441 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2441 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2441 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2441 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2441 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2442 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2442 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2442 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2442 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2442 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2443 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.03p7 0x1.08p5 0x0.0p0 F +REG esri:2443 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.ee27199592545p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG esri:2443 2 OK 0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.0eec733536d5ep7 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG esri:2443 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.ee271995a79bdp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG esri:2443 4 OK 0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.0eec73352c322p7 0x1.2fffffffa48f8p5 0x0.0p0 F +REG esri:2444 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.08p5 0x0.0p0 F +REG esri:2444 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.f427199592544p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG esri:2444 2 OK 0x1.1e99185b35cf5p19 -0x1.079d1e65d514p19 0x0.0p0 0x1.11ec733536d5ep7 0x1.bfffffffaa7b5p4 0x0.0p0 F +REG esri:2444 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.f4271995a79bcp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG esri:2444 4 OK 0x1.ff8aa2fffc27ap18 0x1.170e640889041p19 0x0.0p0 0x1.11ec73352c323p7 0x1.2fffffffa48f9p5 0x0.0p0 F +REG esri:2445 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0855555555557p7 0x1.2p5 0x0.0p0 F +REG esri:2445 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.f7f1ffa584661p6 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2445 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.14b1aad7e877dp7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2445 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.f7f1ffa5b6a87p6 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2445 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.14b1aad7cf56ap7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2446 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0bp7 0x1.08p5 0x0.0p0 F +REG esri:2446 1 OK -0x1.1e99185b35cep19 -0x1.079d1e65d5141p19 0x0.0p0 0x1.fe27199592544p6 0x1.bfffffffaa7b4p4 0x0.0p0 F +REG esri:2446 2 OK 0x1.1e99185b35cf5p19 -0x1.079d1e65d514p19 0x0.0p0 0x1.16ec733536d5ep7 0x1.bfffffffaa7b5p4 0x0.0p0 F +REG esri:2446 3 OK -0x1.ff8aa2fffc254p18 0x1.170e64088903fp19 0x0.0p0 0x1.fe271995a79bcp6 0x1.2fffffffa48f8p5 0x0.0p0 F +REG esri:2446 4 OK 0x1.ff8aa2fffc27ap18 0x1.170e640889041p19 0x0.0p0 0x1.16ec73352c323p7 0x1.2fffffffa48f9p5 0x0.0p0 F +REG esri:2447 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0caaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG esri:2447 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.004e552817883p7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2447 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1907002d3dccfp7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2447 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.004e552830a96p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2447 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1907002d24abcp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2448 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.2p5 0x0.0p0 F +REG esri:2448 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.03a3aa7d6cddap7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2448 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1c5c558293227p7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2448 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.03a3aa7d85fedp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2448 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1c5c55827a014p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2449 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1255555555557p7 0x1.2p5 0x0.0p0 F +REG esri:2449 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.05f8ffd2c2331p7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2449 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.1eb1aad7e877dp7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2449 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.05f8ffd2db544p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2449 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.1eb1aad7cf56ap7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2450 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.15p7 0x1.2p5 0x0.0p0 F +REG esri:2450 1 OK -0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.08a3aa7d6cdd9p7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2450 2 OK 0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.215c558293226p7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2450 3 OK -0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.08a3aa7d85fecp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2450 4 OK 0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.215c55827a013p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:24500 0 OK 0x1.d7c44e0d2af73p14 0x1.d4d59c572386fp14 0x1.04113a3dp2 0x1.9f69796a1f706p6 0x1.49a3364223021p0 0x0.0p0 T +REG esri:24500 1 OK -0x1.0088b8c2b1f13p19 -0x1.0013d6b3a8848p19 -0x1.096d51058p3 0x1.8b682e4d6a382p6 -0x1.db2e63bae8b37p1 0x1.c8p-22 F +REG esri:24500 2 OK 0x1.1e04cec5b0ea5p19 -0x1.0013d6b395412p19 0x1.94d92a11cp4 0x1.b36ac486de475p6 -0x1.db2e63b9b02b1p1 -0x1.668p-21 F +REG esri:24500 3 OK -0x1.fef27734840aep18 0x1.1deabb3f66639p19 -0x1.d2cdda1ep2 0x1.8b682e397c9b2p6 0x1.9268cca5e1697p2 0x1.31p-20 F +REG esri:24500 4 OK 0x1.1cf551fbe696dp19 0x1.1deabb3f480dfp19 0x1.a2c02eac8p4 0x1.b36ac49adda94p6 0x1.9268cca4e3121p2 -0x1.056p-19 F +REG esri:2451 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.17aaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG esri:2451 1 OK -0x1.207157de5625ep19 -0x1.06b9fa9fc39abp19 0x0.0p0 0x1.0b4e552817883p7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2451 2 OK 0x1.207157de56273p19 -0x1.06b9fa9fc39aap19 0x0.0p0 0x1.2407002d3dcdp7 0x1.efffffff78b22p4 0x0.0p0 F +REG esri:2451 3 OK -0x1.fbe240e55ede6p18 0x1.17fcf74546db4p19 0x0.0p0 0x1.0b4e552830a96p7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2451 4 OK 0x1.fbe240e55ee0bp18 0x1.17fcf74546db6p19 0x0.0p0 0x1.2407002d24abdp7 0x1.47ffffff79cc5p5 0x0.0p0 F +REG esri:2452 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.19aaaaaaaaaa9p7 0x1.4p5 0x0.0p0 F +REG esri:2452 1 OK -0x1.23201c494f8a1p19 -0x1.0566f93f3781cp19 0x0.0p0 0x1.0c9cd2f1fe4c3p7 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2452 2 OK 0x1.23201c494f8a1p19 -0x1.0566f93f3781cp19 0x0.0p0 0x1.26b882635708fp7 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2452 3 OK -0x1.f6861830d491cp18 0x1.19504fd8b077cp19 0x0.0p0 0x1.0c9cd2f234253p7 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2452 4 OK 0x1.f6861830d491cp18 0x1.19504fd8b077cp19 0x0.0p0 0x1.26b88263212ffp7 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2453 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.188p7 0x1.6p5 0x0.0p0 F +REG esri:2453 1 OK -0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.0a992e63a60fbp7 0x1.37ffffff10d89p5 0x0.0p0 F +REG esri:2453 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2666d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG esri:2453 3 OK -0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.0a992e640a525p7 0x1.87fffffea2284p5 0x0.0p0 F +REG esri:2453 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2666d19bf5adbp7 0x1.87fffffea2284p5 0x0.0p0 F +REG esri:2454 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1c8p7 0x1.6p5 0x0.0p0 F +REG esri:2454 1 OK -0x1.262087c7cec8cp19 -0x1.03ddb3f855d8p19 0x0.0p0 0x1.0e992e63a60fap7 0x1.37ffffff10d88p5 0x0.0p0 F +REG esri:2454 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2a66d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG esri:2454 3 OK -0x1.f0767dc282fcap18 0x1.1ac080d27bb82p19 0x0.0p0 0x1.0e992e640a524p7 0x1.87fffffea2285p5 0x0.0p0 F +REG esri:2454 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2a66d19bf5adcp7 0x1.87fffffea2284p5 0x0.0p0 F +REG esri:24547 0 OK 0x1.e8668d987be3p18 -0x1.3fdf5a3040091p2 -0x1.29c5b2a58p3 0x1.8c00000000001p6 0x1.c72f1eacb7b06p-66 -0x1.0p-30 T +REG esri:24547 1 OK -0x1.ac81f5830c8dp15 -0x1.0ee418d91ef5dp19 -0x1.cf4edac38p3 0x1.7800000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24547 2 OK 0x1.01975690b3c11p20 -0x1.0ee418d9e4cc5p19 0x1.b04f539ep2 0x1.ap6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24547 3 OK -0x1.ac821c898be7p15 0x1.0ee2d8fc7f70bp19 -0x1.eb33328cp3 0x1.7800000000001p6 0x1.4000000000003p2 -0x1.8p-29 F +REG esri:24547 4 OK 0x1.019757c90ac46p20 0x1.0ee2d8fd45453p19 0x1.7886b04ep2 0x1.ap6 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:24548 0 OK 0x1.e87c62ecd72b8p18 -0x1.3fdf20a180d4bp2 0x1.02e5dd72p3 0x1.a400000000001p6 0x1.2f74bf1dcfcaep-67 0x1.0p-30 T +REG esri:24548 1 OK -0x1.abd044b3eb31p15 -0x1.0ee3e7fb6dc07p19 -0x1.3347c44dp2 0x1.9000000000001p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24548 2 OK 0x1.019cb3c5dab4p20 -0x1.0ee3e7fcc114cp19 0x1.f9af2c8c4p4 0x1.b8p6 -0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:24548 3 OK -0x1.abd06bb8c504p15 0x1.0ee2a81f07567p19 -0x1.6b106e48p2 0x1.9000000000001p6 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24548 4 OK 0x1.019cb4fe3d93fp20 0x1.0ee2a8205aa7dp19 0x1.ebbd074e4p4 0x1.b8p6 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:2455 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.208p7 0x1.6p5 0x0.0p0 F +REG esri:2455 1 OK -0x1.262087c7cec8cp19 -0x1.03ddb3f855d8p19 0x0.0p0 0x1.12992e63a60fap7 0x1.37ffffff10d88p5 0x0.0p0 F +REG esri:2455 2 OK 0x1.262087c7cec79p19 -0x1.03ddb3f855d82p19 0x0.0p0 0x1.2e66d19c59f05p7 0x1.37ffffff10d89p5 0x0.0p0 F +REG esri:2455 3 OK -0x1.f0767dc282fcap18 0x1.1ac080d27bb82p19 0x0.0p0 0x1.12992e640a524p7 0x1.87fffffea2285p5 0x0.0p0 F +REG esri:2455 4 OK 0x1.f0767dc282faap18 0x1.1ac080d27bb81p19 0x0.0p0 0x1.2e66d19bf5adcp7 0x1.87fffffea2284p5 0x0.0p0 F +REG esri:2456 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1cp7 0x1.ap4 0x0.0p0 F +REG esri:2456 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.10dfbd31358f9p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2456 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.272042ceca708p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2456 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.10dfbd312d01cp7 0x1.efffffffb7d74p4 0x0.0p0 F +REG esri:2456 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.272042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG esri:2457 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fe00000000001p6 0x1.ap4 0x0.0p0 F +REG esri:2457 1 OK -0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.e7bf7a626b1f1p6 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2457 2 OK 0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.0a2042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2457 3 OK -0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.e7bf7a625a037p6 0x1.efffffffb7d76p4 0x0.0p0 F +REG esri:2457 4 OK 0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.0a2042ced2fe5p7 0x1.efffffffb7d74p4 0x0.0p0 F +REG esri:24571 0 OK 0x1.388f246aa6a39p15 0x1.580320f28de81p12 -0x1.cf922dp-3 0x1.9900000000001p6 0x1.ffffffffffd0ep1 0x1.0p-30 F +REG esri:24571 1 OK 0x1.34d40496e404p10 0x1.06046b9d1ec92p8 -0x1.90388f99p3 0x1.84f37f5af8063p6 -0x1.ffffffffe3b1cp-1 0x1.0p-30 T +REG esri:24571 2 OK 0x1.64d6eb81c91edp15 -0x1.02aea1d5558abp15 0x1.12a3dff9p4 0x1.ad0c80a507fap6 -0x1.ffffffffe3ac1p-1 0x1.0p-29 T +REG esri:24571 3 OK 0x1.0f2c4bf7dc239p15 0x1.582c610c7339cp15 -0x1.e129f353p2 0x1.84f37f5af8063p6 0x1.1fffffffffe83p3 0x0.0p0 F +REG esri:24571 4 OK 0x1.33152cf7829fep16 0x1.5a75ade47a767p13 0x1.5cafa1b3cp4 0x1.ad0c80a507f9fp6 0x1.1fffffffffe86p3 0x1.0p-30 F +REG esri:2458 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fp6 0x1.ap4 0x0.0p0 F +REG esri:2458 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.d9bf7a626b1f2p6 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2458 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.032042ceca708p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2458 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.d9bf7a625a038p6 0x1.efffffffb7d74p4 0x0.0p0 F +REG esri:2458 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.032042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG esri:2459 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.ap4 0x0.0p0 F +REG esri:2459 1 OK -0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.f5bf7a626b1f2p6 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2459 2 OK 0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.112042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2459 3 OK -0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.f5bf7a625a036p6 0x1.efffffffb7d74p4 0x0.0p0 F +REG esri:2459 4 OK 0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.112042ced2fe5p7 0x1.efffffffb7d76p4 0x0.0p0 F +REG esri:2460 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.4p4 0x0.0p0 F +REG esri:2460 1 OK -0x1.17bfa80c570dcp19 -0x1.0aceb1bfe8ccep19 0x0.0p0 0x1.055bb474834a2p7 0x1.dfffffffda459p3 0x0.0p0 F +REG esri:2460 2 OK 0x1.17bfa80c570c5p19 -0x1.0aceb1bfe8ccfp19 0x0.0p0 0x1.1aa44b8b7cb5ep7 0x1.dfffffffda459p3 0x0.0p0 F +REG esri:2460 3 OK -0x1.067ecfe186601p19 0x1.137d4b9ce03dfp19 0x0.0p0 0x1.055bb47474ecdp7 0x1.8fffffffde571p4 0x0.0p0 F +REG esri:2460 4 OK 0x1.067ecfe1865ebp19 0x1.137d4b9ce03dfp19 0x0.0p0 0x1.1aa44b8b8b133p7 0x1.8fffffffde571p4 0x0.0p0 F +REG esri:24600 0 OK 0x1.6e36p20 0x1.1cb78p20 0x0.0p0 0x1.68p5 0x1.03fffffffffbcp5 0x0.0p0 F +REG esri:24600 1 OK 0x1.bdce4a1e7dc43p19 0x1.32c56834522afp19 0x0.0p0 0x1.38928b4db1cbap5 0x1.b7fffffffff39p4 0x0.0p0 F +REG esri:24600 2 OK 0x1.fd84daf0c11dep20 0x1.32c56834522afp19 0x0.0p0 0x1.976d74b24e346p5 0x1.b7fffffffff39p4 0x0.0p0 F +REG esri:24600 3 OK 0x1.dbe4fc3d9fe4bp19 0x1.a7b68ee8f803cp20 0x0.0p0 0x1.38928b4db1cbap5 0x1.2bfffffffffd9p5 0x0.0p0 F +REG esri:24600 4 OK 0x1.ee7981e1300dap20 0x1.a7b68ee8f803cp20 0x0.0p0 0x1.976d74b24e346p5 0x1.2bfffffffffd9p5 0x0.0p0 F +REG esri:2461 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.34p7 0x1.ap4 0x0.0p0 F +REG esri:2461 1 OK -0x1.1ab866a2add9fp19 -0x1.096eddfcb89bep19 0x0.0p0 0x1.28dfbd31358f9p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2461 2 OK 0x1.1ab866a2add89p19 -0x1.096eddfcb89bfp19 0x0.0p0 0x1.3f2042ceca707p7 0x1.4fffffffde304p4 0x0.0p0 F +REG esri:2461 3 OK -0x1.039613150ed26p19 0x1.150d5fe0fc4ecp19 0x0.0p0 0x1.28dfbd312d01cp7 0x1.efffffffb7d76p4 0x0.0p0 F +REG esri:2461 4 OK 0x1.039613150ed11p19 0x1.150d5fe0fc4ebp19 0x0.0p0 0x1.3f2042ced2fe5p7 0x1.efffffffb7d74p4 0x0.0p0 F +REG esri:2462 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2462 1 OK 0x1.e18aeff88de14p21 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2462 2 OK 0x1.348b8803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2462 3 OK 0x1.e18aeff88de14p21 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2462 4 OK 0x1.348b8803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2463 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2463 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2463 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2463 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2463 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2464 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2464 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2464 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2464 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2464 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2465 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2465 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2465 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2465 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2465 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2466 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2466 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2466 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2466 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2466 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2467 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2467 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2467 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2467 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2467 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2468 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2468 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2468 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2468 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2468 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2469 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2469 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2469 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2469 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2469 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2470 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2470 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2470 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2470 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2470 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2471 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2471 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2471 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2471 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2471 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:24718 0 OK 0x1.e882ddaf1ec87p18 0x1.65c2cfcf2e3d5p8 -0x1.2577f27dcp6 -0x1.2bfffffffffffp6 -0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG esri:24718 1 OK -0x1.abb055dac23bp15 -0x1.0eb77110320f1p19 -0x1.f6ad3aa7cp6 -0x1.4p6 -0x1.3fffffffffffep2 -0x1.0p-29 F +REG esri:24718 2 OK 0x1.019ef1c13a74bp20 -0x1.0eb77111b2e55p19 -0x1.5310bf09p6 -0x1.18p6 -0x1.4000000000003p2 -0x1.8p-29 F +REG esri:24718 3 OK -0x1.aba56d9c172cp15 0x1.0f10e1042ddcdp19 -0x1.fa4343374p5 -0x1.4p6 0x1.4000000000002p2 -0x1.4p-28 F +REG esri:24718 4 OK 0x1.019e9a6c66ba4p20 0x1.0f10e105afab8p19 -0x1.66163e418p4 -0x1.18p6 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:24719 0 OK 0x1.e87de74e47165p18 0x1.65c27849d4ce8p8 -0x1.8dbfb8d7ap5 -0x1.14p6 0x1.2f74bf1dcfcadp-60 0x1.0p-29 T +REG esri:24719 1 OK -0x1.abd3ee60e7a1p15 -0x1.0eb72eac03b3ap19 -0x1.91e7880e1p6 -0x1.28p6 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:24719 2 OK 0x1.019d935016cdap20 -0x1.0eb72ead6442fp19 -0x1.f82bd7312p5 -0x1.0p6 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:24719 3 OK -0x1.abc90610c0e3p15 0x1.0f109e8a4a57bp19 -0x1.30b86011ep5 -0x1.28p6 0x1.4p2 0x1.0p-29 F +REG esri:24719 4 OK 0x1.019d3bfc4e72p20 0x1.0f109e8babcacp19 -0x1.457a205p-1 -0x1.0p6 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:2472 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2472 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2472 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2472 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2472 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24720 0 OK 0x1.e87859c0efd2ap18 0x1.65c228edc61d3p8 -0x1.c4675ae0cp4 -0x1.f8p5 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG esri:24720 1 OK -0x1.abfca2526022p15 -0x1.0eb6f278bc4bcp19 -0x1.3510ab902p6 -0x1.1p6 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24720 2 OK 0x1.019c122373357p20 -0x1.0eb6f279f8abbp19 -0x1.5d5c3402cp5 -0x1.d000000000001p5 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:24720 3 OK -0x1.abf1b9ecf851p15 0x1.0f10624353fc6p19 -0x1.dc2c7b9b8p3 -0x1.1p6 0x1.4p2 0x1.0p-30 F +REG esri:24720 4 OK 0x1.019bbad0c87fdp20 0x1.0f1062449128ap19 0x1.2b72ad8f8p4 -0x1.d000000000001p5 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:24721 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:24721 1 OK -0x1.ada0e5629f69p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.fp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24721 2 OK 0x1.0191072b14fc4p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ap5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24721 3 OK -0x1.ada0e5629f69p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.fp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:24721 4 OK 0x1.0191072b14fc4p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ap5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2473 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2473 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2473 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2473 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2473 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2474 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2474 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2474 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2474 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2474 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2475 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2475 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2475 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2475 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2475 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2476 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2476 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2476 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2476 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2476 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2477 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2477 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2477 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2477 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2477 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2478 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2478 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2478 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2478 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2478 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2479 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2479 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2479 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2479 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2479 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2480 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2480 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2480 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2480 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2480 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2481 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2481 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2481 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2481 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2481 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:24818 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:24818 1 OK -0x1.ada0e5629f77p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24818 2 OK 0x1.0191072b14fcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.18p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24818 3 OK -0x1.ada0e5629f77p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24818 4 OK 0x1.0191072b14fcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.18p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24819 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:24819 1 OK -0x1.ada0e5629f81p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.28p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24819 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24819 3 OK -0x1.ada0e5629f81p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.28p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24819 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:2482 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2482 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2482 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2482 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2482 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24820 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:24820 1 OK -0x1.ada0e5629f81p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.1p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24820 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24820 3 OK -0x1.ada0e5629f81p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.1p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:24820 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.d000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:24821 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:24821 1 OK -0x1.ada0e5629f69p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.fp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24821 2 OK 0x1.0191072b14fc4p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ap5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:24821 3 OK -0x1.ada0e5629f69p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.fp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:24821 4 OK 0x1.0191072b14fc4p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.ap5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2483 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:2483 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2483 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2483 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2483 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2484 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:2484 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2484 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2484 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2484 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2485 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:2485 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2485 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2485 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2485 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2486 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:2486 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2486 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2486 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2486 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2487 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:2487 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2487 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2487 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2487 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:24877 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:24877 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24877 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24877 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24877 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24878 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:24878 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24878 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24878 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24878 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24879 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:24879 1 OK -0x1.fc406e18cd02p14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24879 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24879 3 OK -0x1.2fefde056e358p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24879 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2488 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2488 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2488 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2488 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2488 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24880 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:24880 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24880 2 OK 0x1.f82a0370c6681p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24880 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24880 4 OK 0x1.0722fde056e36p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24882 0 OK 0x1.e84800000000bp18 0x1.b9971c11d9aacp22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:24882 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24882 2 OK 0x1.f82a0370c6681p19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.e000000000001p4 0x0.0p0 F +REG esri:24882 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:24882 4 OK 0x1.0722fde056e36p20 0x1.daca2fdc3ae78p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2489 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2489 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2489 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2489 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2489 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:24891 0 OK 0x1.b198p17 0x1.5c592be353f7dp20 0x0.0p0 -0x1.42p6 -0x1.8000000000001p2 0x0.0p0 F +REG esri:24891 1 OK -0x1.4058da6efa134p18 0x1.a87817bf821b8p19 0x0.0p0 -0x1.561c33cfd874bp6 -0x1.5fffffffeadc3p3 0x0.0p0 F +REG esri:24891 2 OK 0x1.78f86d377d09ap19 0x1.a87817bf821b8p19 0x0.0p0 -0x1.2de3cc30278b6p6 -0x1.5fffffffeadc3p3 0x0.0p0 F +REG esri:24891 3 OK -0x1.4a4d58fac56cep18 0x1.e334c9f08f81bp20 0x0.0p0 -0x1.561c33cfc9fb1p6 -0x1.ffffffffdb37bp-1 0x0.0p0 T +REG esri:24891 4 OK 0x1.7df2ac7d62b67p19 0x1.e334c9f08f81bp20 0x0.0p0 -0x1.2de3cc303605p6 -0x1.ffffffffdb37bp-1 0x0.0p0 T +REG esri:24892 0 OK 0x1.5f9p19 0x1.fbcd6516872bp19 0x0.0p0 -0x1.3p6 -0x1.3p3 0x0.0p0 F +REG esri:24892 1 OK 0x1.525bc32474cc4p17 0x1.d5e207f7f9468p18 0x0.0p0 -0x1.444731b0c91cbp6 -0x1.cfffffffe5023p3 0x0.0p0 F +REG esri:24892 2 OK 0x1.3544879b7166ep20 0x1.d5e207f7f9468p18 0x0.0p0 -0x1.1bb8ce4f36e35p6 -0x1.cfffffffe5023p3 0x0.0p0 F +REG esri:24892 3 OK 0x1.32ab784c96ed4p17 0x1.845564bbd2b76p20 0x0.0p0 -0x1.444731b0b3877p6 -0x1.1fffffffead64p2 0x0.0p0 F +REG esri:24892 4 OK 0x1.393a90f66d22cp20 0x1.845564bbd2b76p20 0x0.0p0 -0x1.1bb8ce4f4c789p6 -0x1.1fffffffead64p2 0x0.0p0 F +REG esri:24893 0 OK 0x1.433ep20 0x1.fbda91db22d0ep19 0x0.0p0 -0x1.1ap6 -0x1.3p3 0x0.0p0 F +REG esri:24893 1 OK 0x1.7b75432c2786dp19 0x1.d5e06bd34ad86p18 0x0.0p0 -0x1.2e4731b0c91cbp6 -0x1.cfffffffe5023p3 0x0.0p0 F +REG esri:24893 2 OK 0x1.c8c15e69ec3dp20 0x1.d5e06bd34ad86p18 0x0.0p0 -0x1.05b8ce4f36e35p6 -0x1.cfffffffe5023p3 0x0.0p0 F +REG esri:24893 3 OK 0x1.7388c88e018a2p19 0x1.8462de54db8f1p20 0x0.0p0 -0x1.2e4731b0b3877p6 -0x1.1fffffffead64p2 0x0.0p0 F +REG esri:24893 4 OK 0x1.ccb79bb8ff3b5p20 0x1.8462de54db8f1p20 0x0.0p0 -0x1.05b8ce4f4c789p6 -0x1.1fffffffead64p2 0x0.0p0 F +REG esri:2490 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2490 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2490 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2490 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2490 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2491 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2491 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2491 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2491 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2491 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2492 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:2492 1 OK -0x1.af4401dc87afp15 -0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e76p2 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2492 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2492 3 OK -0x1.af4401dc87afp15 0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e76p2 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2492 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2493 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2493 1 OK -0x1.af4401dc87aep15 -0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73cp3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2493 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2493 3 OK -0x1.af4401dc87aep15 0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73cp3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2493 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2494 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2494 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2494 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2494 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2494 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2495 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2495 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2495 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2495 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2495 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2496 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2496 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2496 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2496 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2496 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2497 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2497 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2497 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2497 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2497 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2498 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2498 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2498 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2498 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2498 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2499 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2499 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2499 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2499 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2499 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2500 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2500 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2500 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2500 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2500 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:25000 0 OK 0x1.0bdd328d4364p18 -0x1.3cd6eeb52b06p8 -0x1.2c8d09cf8p3 -0x1.0p0 0x1.2aaaaaaaaaaa9p2 0x1.0p-29 F +REG esri:25000 1 OK -0x1.160d2fe859d5ep18 -0x1.0e1ea235f2b15p19 0x1.65103ab6p4 -0x1.81107a2bda1d6p2 -0x1.555555553c621p-2 0x1.8p-29 T +REG esri:25000 2 OK 0x1.96e3ca77e71e8p19 -0x1.0e1ea235efa0ap19 0x1.1a47441d4p4 0x1.01107a2bda6cap2 -0x1.555555553c66dp-2 -0x1.0p-29 T +REG esri:25000 3 OK -0x1.0e535b4d692bp18 0x1.0fc2c28029374p19 -0x1.07f405468p5 -0x1.81107a2c94253p2 0x1.3555555541fc2p3 -0x1.0p-30 F +REG esri:25000 4 OK 0x1.9306e027496fep19 0x1.0fc2c27fd6a37p19 -0x1.2cd0d0296p5 0x1.01107a2c94594p2 0x1.3555555541ff7p3 -0x1.0p-30 F +REG esri:2501 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2501 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2501 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2501 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2501 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2502 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2502 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2502 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2502 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2502 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2503 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2503 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2503 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2503 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2503 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2504 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2504 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2504 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2504 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2504 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2505 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2505 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2505 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2505 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2505 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2506 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2506 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2506 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2506 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2506 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2507 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2507 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2507 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2507 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2507 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2508 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2508 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2508 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2508 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2508 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2509 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2509 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2509 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2509 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2509 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2510 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2510 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2510 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2510 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2510 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2511 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2511 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2511 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2511 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2511 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2512 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2512 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2512 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2512 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2512 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2513 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2513 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2513 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2513 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2513 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2514 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:2514 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2514 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2514 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2514 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2515 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:2515 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2515 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2515 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2515 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2516 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:2516 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2516 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2516 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2516 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2517 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:2517 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2517 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2517 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2517 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2518 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:2518 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2518 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2518 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2518 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2519 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2519 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2519 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2519 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2519 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2520 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2520 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2520 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2520 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2520 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2521 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2521 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2521 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2521 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2521 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2522 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2522 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2522 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2522 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2522 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2523 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2523 1 OK 0x1.a7e077fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2523 2 OK 0x1.eba68803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2523 3 OK 0x1.a7e077fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2523 4 OK 0x1.eba68803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:25231 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:25231 1 OK -0x1.ad89324e3d93p15 -0x1.0edd0485be135p19 0x0.0p0 -0x1.0000000000001p1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:25231 2 OK 0x1.0190499271ed2p20 -0x1.0edd0485be135p19 0x0.0p0 0x1.0p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:25231 3 OK -0x1.ad89324e3d93p15 0x1.0edd0485be135p19 0x0.0p0 -0x1.0000000000001p1 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:25231 4 OK 0x1.0190499271ed2p20 0x1.0edd0485be135p19 0x0.0p0 0x1.0p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2524 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:2524 1 OK 0x1.e4e977fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2524 2 OK 0x1.1457c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2524 3 OK 0x1.e4e977fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2524 4 OK 0x1.1457c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2525 0 OK 0x1.21eacp23 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2525 1 OK 0x1.10f93bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2525 2 OK 0x1.32dc4401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2525 3 OK 0x1.10f93bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2525 4 OK 0x1.32dc4401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2526 0 OK 0x1.406f4p23 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2526 1 OK 0x1.2f7dbbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.900000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2526 2 OK 0x1.5160c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2526 3 OK 0x1.2f7dbbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.900000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2526 4 OK 0x1.5160c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2527 0 OK 0x1.5ef3cp23 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2527 1 OK 0x1.4e023bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2527 2 OK 0x1.6fe54401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2527 3 OK 0x1.4e023bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2527 4 OK 0x1.6fe54401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2528 0 OK 0x1.7d784p23 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:2528 1 OK 0x1.6c86bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2528 2 OK 0x1.8e69c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2528 3 OK 0x1.6c86bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2528 4 OK 0x1.8e69c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2529 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2529 1 OK 0x1.8b0b3bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9cep5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2529 2 OK 0x1.acee4401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2529 3 OK 0x1.8b0b3bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9cep5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2529 4 OK 0x1.acee4401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2530 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG esri:2530 1 OK 0x1.a98fbbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2530 2 OK 0x1.cb72c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2530 3 OK 0x1.a98fbbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2530 4 OK 0x1.cb72c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2531 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2531 1 OK 0x1.c8143bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2531 2 OK 0x1.e9f74401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2531 3 OK 0x1.c8143bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2531 4 OK 0x1.e9f74401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2532 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.8000000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2532 1 OK 0x1.e698bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2532 2 OK 0x1.043de200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc563p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2532 3 OK 0x1.e698bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2532 4 OK 0x1.043de200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc563p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2533 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2533 1 OK 0x1.028e9dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cdp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2533 2 OK 0x1.13802200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5634p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2533 3 OK 0x1.028e9dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cdp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2533 4 OK 0x1.13802200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5634p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2534 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.bp5 0x0.0p0 0x0.0p0 T +REG esri:2534 1 OK 0x1.11d0ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9ccp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2534 2 OK 0x1.22c26200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5634p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2534 3 OK 0x1.11d0ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9ccp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2534 4 OK 0x1.22c26200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5634p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2535 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2535 1 OK 0x1.21131dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9cdp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2535 2 OK 0x1.3204a200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc563p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2535 3 OK 0x1.21131dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9cdp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2535 4 OK 0x1.3204a200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc563p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2536 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.dffffffffffffp5 0x0.0p0 0x0.0p0 T +REG esri:2536 1 OK 0x1.30555dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2536 2 OK 0x1.4146e200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2536 3 OK 0x1.30555dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2536 4 OK 0x1.4146e200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2537 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2537 1 OK 0x1.3f979dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9d1p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2537 2 OK 0x1.50892200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2537 3 OK 0x1.3f979dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9d1p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2537 4 OK 0x1.50892200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2538 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.08p6 0x0.0p0 0x0.0p0 T +REG esri:2538 1 OK 0x1.4ed9ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9ccp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2538 2 OK 0x1.5fcb6200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2538 3 OK 0x1.4ed9ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9ccp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2538 4 OK 0x1.5fcb6200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2539 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2539 1 OK 0x1.5e1c1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2539 2 OK 0x1.6f0da200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2539 3 OK 0x1.5e1c1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2539 4 OK 0x1.6f0da200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:25391 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:25391 1 OK -0x1.af0630e4e537p15 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.c00000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25391 2 OK 0x1.019c31872729cp20 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.e7ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25391 3 OK -0x1.af0630e4e537p15 0x1.0ef73ec9642cp19 0x0.0p0 0x1.c00000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25391 4 OK 0x1.019c31872729cp20 0x1.0ef73ec9642cp19 0x0.0p0 0x1.e7ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25392 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dcp6 0x0.0p0 0x0.0p0 T +REG esri:25392 1 OK -0x1.af0630e4e537p15 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.c80000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25392 2 OK 0x1.019c31872729cp20 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.efffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25392 3 OK -0x1.af0630e4e537p15 0x1.0ef73ec9642cp19 0x0.0p0 0x1.c80000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25392 4 OK 0x1.019c31872729cp20 0x1.0ef73ec9642cp19 0x0.0p0 0x1.efffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25393 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.e4p6 0x0.0p0 0x0.0p0 T +REG esri:25393 1 OK -0x1.af0630e4e537p15 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.d00000001dd08p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25393 2 OK 0x1.019c31872729cp20 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.f7ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25393 3 OK -0x1.af0630e4e537p15 0x1.0ef73ec9642cp19 0x0.0p0 0x1.d00000001dd08p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25393 4 OK 0x1.019c31872729cp20 0x1.0ef73ec9642cp19 0x0.0p0 0x1.f7ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25394 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:25394 1 OK -0x1.af0630e4e537p15 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.d80000001dd08p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25394 2 OK 0x1.019c31872729cp20 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.ffffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25394 3 OK -0x1.af0630e4e537p15 0x1.0ef73ec9642cp19 0x0.0p0 0x1.d80000001dd08p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25394 4 OK 0x1.019c31872729cp20 0x1.0ef73ec9642cp19 0x0.0p0 0x1.ffffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25395 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:25395 1 OK -0x1.af0630e4e54fp15 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.e00000001dd06p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25395 2 OK 0x1.019c31872729cp20 -0x1.0ef73ec9642cp19 0x0.0p0 0x1.03fffffff117dp7 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25395 3 OK -0x1.af0630e4e54fp15 0x1.0ef73ec9642cp19 0x0.0p0 0x1.e00000001dd06p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:25395 4 OK 0x1.019c31872729cp20 0x1.0ef73ec9642cp19 0x0.0p0 0x1.03fffffff117dp7 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:2540 0 OK 0x1.75d72p24 0x0.0p0 0x0.0p0 0x1.2p6 0x0.0p0 0x0.0p0 T +REG esri:2540 1 OK 0x1.6d5e5dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2540 2 OK 0x1.7e4fe200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2540 3 OK 0x1.6d5e5dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2540 4 OK 0x1.7e4fe200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2541 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2541 1 OK 0x1.7ca09dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2541 2 OK 0x1.8d922200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2541 3 OK 0x1.7ca09dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2541 4 OK 0x1.8d922200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2542 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2542 1 OK 0x1.8be2ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2542 2 OK 0x1.9cd46200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2542 3 OK 0x1.8be2ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2542 4 OK 0x1.9cd46200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2543 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2543 1 OK 0x1.9b251dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2543 2 OK 0x1.ac16a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2543 3 OK 0x1.9b251dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2543 4 OK 0x1.ac16a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2544 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2544 1 OK 0x1.aa675dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2544 2 OK 0x1.bb58e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2544 3 OK 0x1.aa675dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2544 4 OK 0x1.bb58e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2545 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2545 1 OK 0x1.b9a99dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2545 2 OK 0x1.ca9b2200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2545 3 OK 0x1.b9a99dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2545 4 OK 0x1.ca9b2200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2546 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2546 1 OK 0x1.c8ebddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2546 2 OK 0x1.d9dd6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2546 3 OK 0x1.c8ebddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2546 4 OK 0x1.d9dd6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2547 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2547 1 OK 0x1.d82e1dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2547 2 OK 0x1.e91fa200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2547 3 OK 0x1.d82e1dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2547 4 OK 0x1.e91fa200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2548 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2548 1 OK 0x1.e7705dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2548 2 OK 0x1.f861e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2548 3 OK 0x1.e7705dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2548 4 OK 0x1.f861e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2549 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2549 1 OK 0x1.f6b29dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2549 2 OK 0x1.03d211007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2549 3 OK 0x1.f6b29dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2549 4 OK 0x1.03d211007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2550 0 OK 0x1.e83ba9a2783dp18 0x1.b996d108210eep22 0x1.af8fcb44cp4 0x1.d400000000002p6 -0x1.8fffffffffffdp4 0x1.0p-29 F +REG esri:2550 1 OK -0x1.fc971bd05004p14 0x1.9700764672f6ep22 0x1.04458acfbp6 0x1.bdeeb47e7a8d3p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG esri:2550 2 OK 0x1.f820627720752p19 0x1.970076469f0bp22 0x1.c6c4dd56ap5 0x1.ea114b818573p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG esri:2550 3 OK -0x1.300977b82d338p16 0x1.dac9b74a24b4p22 0x1.190a781a8p3 0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 -0x1.0p-29 F +REG esri:2550 4 OK 0x1.071e6c41761b6p20 0x1.dac9b74a4e942p22 -0x1.1c0f9aep-3 0x1.ea114b818573p6 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG esri:2551 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2551 1 OK 0x1.02fa6eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2551 2 OK 0x1.0b7331007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2551 3 OK 0x1.02fa6eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2551 4 OK 0x1.0b7331007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2552 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2552 1 OK 0x1.0a9b8eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2552 2 OK 0x1.131451007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2552 3 OK 0x1.0a9b8eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2552 4 OK 0x1.131451007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2553 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2553 1 OK 0x1.123caeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2553 2 OK 0x1.1ab571007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2553 3 OK 0x1.123caeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2553 4 OK 0x1.1ab571007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2554 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2554 1 OK 0x1.19ddceff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2554 2 OK 0x1.225691007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2554 3 OK 0x1.19ddceff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2554 4 OK 0x1.225691007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2555 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2555 1 OK 0x1.217eeeff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2555 2 OK 0x1.29f7b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2555 3 OK 0x1.217eeeff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2555 4 OK 0x1.29f7b1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2556 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2556 1 OK 0x1.29200eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2556 2 OK 0x1.3198d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2556 3 OK 0x1.29200eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2556 4 OK 0x1.3198d1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2557 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2557 1 OK 0x1.30c12eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2557 2 OK 0x1.3939f1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2557 3 OK 0x1.30c12eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2557 4 OK 0x1.3939f1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2558 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2558 1 OK 0x1.38624eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2558 2 OK 0x1.40db11007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2558 3 OK 0x1.38624eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2558 4 OK 0x1.40db11007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2559 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2559 1 OK 0x1.40036eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2559 2 OK 0x1.487c31007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2559 3 OK 0x1.40036eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2559 4 OK 0x1.487c31007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2560 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2560 1 OK 0x1.47a48eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2560 2 OK 0x1.501d51007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2560 3 OK 0x1.47a48eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2560 4 OK 0x1.501d51007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2561 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2561 1 OK 0x1.4f45aeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2561 2 OK 0x1.57be71007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2561 3 OK 0x1.4f45aeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2561 4 OK 0x1.57be71007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2562 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2562 1 OK 0x1.56e6ceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2562 2 OK 0x1.5f5f91007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2562 3 OK 0x1.56e6ceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2562 4 OK 0x1.5f5f91007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2563 0 OK 0x1.62c45p25 0x0.0p0 0x0.0p0 0x1.14p7 0x0.0p0 0x0.0p0 T +REG esri:2563 1 OK 0x1.5e87eeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2563 2 OK 0x1.6700b1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2563 3 OK 0x1.5e87eeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2563 4 OK 0x1.6700b1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2564 0 OK 0x1.6a657p25 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:2564 1 OK 0x1.66290eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2564 2 OK 0x1.6ea1d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2564 3 OK 0x1.66290eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2564 4 OK 0x1.6ea1d1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2565 0 OK 0x1.72069p25 0x0.0p0 0x0.0p0 0x1.2p7 0x0.0p0 0x0.0p0 T +REG esri:2565 1 OK 0x1.6dca2eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2565 2 OK 0x1.7642f1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2565 3 OK 0x1.6dca2eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2565 4 OK 0x1.7642f1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2566 0 OK 0x1.79a7bp25 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:2566 1 OK 0x1.756b4eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2566 2 OK 0x1.7de411007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2566 3 OK 0x1.756b4eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2566 4 OK 0x1.7de411007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2567 0 OK 0x1.8148dp25 0x0.0p0 0x0.0p0 0x1.2cp7 0x0.0p0 0x0.0p0 T +REG esri:2567 1 OK 0x1.7d0c6eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2567 2 OK 0x1.858531007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2567 3 OK 0x1.7d0c6eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2567 4 OK 0x1.858531007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2568 0 OK 0x1.88e9fp25 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:2568 1 OK 0x1.84ad8eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2568 2 OK 0x1.8d2651007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2568 3 OK 0x1.84ad8eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2568 4 OK 0x1.8d2651007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2569 0 OK 0x1.908b1p25 0x0.0p0 0x0.0p0 0x1.38p7 0x0.0p0 0x0.0p0 T +REG esri:2569 1 OK 0x1.8c4eaeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2569 2 OK 0x1.94c771007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2569 3 OK 0x1.8c4eaeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2569 4 OK 0x1.94c771007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2570 0 OK 0x1.982c3p25 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:2570 1 OK 0x1.93efceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2570 2 OK 0x1.9c6891007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2570 3 OK 0x1.93efceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2570 4 OK 0x1.9c6891007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:25700 0 OK -0x1.e5598a7ea823cp22 0x1.b761d61964078p19 0x1.2255a470ecp9 -0x1.1e627298d3895p7 0x1.6e89afc097c9ep-39 0x1.0p-30 F +REG esri:25700 1 OK -0x1.039bbfa0a42a1p23 0x1.53d2182f24a24p18 0x1.07af4be636p9 -0x1.28627298d3893p7 -0x1.3fffffffffe23p2 -0x1.8p-29 F +REG esri:25700 2 OK -0x1.c37b95e437314p22 0x1.53d503f2519c4p18 0x1.4a64d631b4p9 -0x1.14627298d3894p7 -0x1.3fffffffffe2cp2 -0x1.0p-29 F +REG esri:25700 3 OK -0x1.039bbfa0a42a1p23 0x1.626d501f5f85p20 0x1.f5f6241704p8 -0x1.28627298d3893p7 0x1.3fffffffffe14p2 -0x1.0p-30 F +REG esri:25700 4 OK -0x1.c37b95e437314p22 0x1.626c9547a4c89p20 0x1.3db0addf16p9 -0x1.14627298d3894p7 0x1.3fffffffffe2bp2 -0x1.0p-28 F +REG esri:2571 0 OK 0x1.9fcd5p25 0x0.0p0 0x0.0p0 0x1.44p7 0x0.0p0 0x0.0p0 T +REG esri:2571 1 OK 0x1.9b90eeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2571 2 OK 0x1.a409b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2571 3 OK 0x1.9b90eeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2571 4 OK 0x1.a409b1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2572 0 OK 0x1.a76e7p25 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:2572 1 OK 0x1.a3320eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2572 2 OK 0x1.abaad1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2572 3 OK 0x1.a3320eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2572 4 OK 0x1.abaad1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2573 0 OK 0x1.af0f9p25 0x0.0p0 0x0.0p0 0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2573 1 OK 0x1.aad32eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2573 2 OK 0x1.b34bf1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2573 3 OK 0x1.aad32eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2573 4 OK 0x1.b34bf1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2574 0 OK 0x1.b6b0bp25 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2574 1 OK 0x1.b2744eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2574 2 OK 0x1.baed11007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2574 3 OK 0x1.b2744eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2574 4 OK 0x1.baed11007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2575 0 OK 0x1.be51dp25 0x0.0p0 0x0.0p0 0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2575 1 OK 0x1.ba156eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2575 2 OK 0x1.c28e31007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2575 3 OK 0x1.ba156eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2575 4 OK 0x1.c28e31007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2576 0 OK 0x1.c5f2fp25 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2576 1 OK 0x1.c1b68eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2576 2 OK 0x1.ca2f51007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2576 3 OK 0x1.c1b68eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2576 4 OK 0x1.ca2f51007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2577 0 OK 0x1.c9c38p25 0x0.0p0 0x0.0p0 0x1.68p7 0x0.0p0 0x0.0p0 F +REG esri:2577 1 OK 0x1.c5871eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2577 2 OK 0x1.cdffe1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2577 3 OK 0x1.c5871eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2577 4 OK 0x1.cdffe1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2578 0 OK 0x1.d5353p25 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2578 1 OK 0x1.d0f8ceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2578 2 OK 0x1.d97191007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2578 3 OK 0x1.d0f8ceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2578 4 OK 0x1.d97191007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2579 0 OK 0x1.dcd65p25 0x0.0p0 0x0.0p0 -0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2579 1 OK 0x1.d899eeff88de1p25 -0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2579 2 OK 0x1.e112b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2579 3 OK 0x1.d899eeff88de1p25 0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2579 4 OK 0x1.e112b1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2580 0 OK 0x1.e4777p25 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2580 1 OK 0x1.e03b0eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2580 2 OK 0x1.e8b3d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2580 3 OK 0x1.e03b0eff88de1p25 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2580 4 OK 0x1.e8b3d1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2581 0 OK 0x1.ec189p25 0x0.0p0 0x0.0p0 -0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2581 1 OK 0x1.e7dc2eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2581 2 OK 0x1.f054f1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2581 3 OK 0x1.e7dc2eff88de1p25 0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2581 4 OK 0x1.f054f1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2582 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2582 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2582 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2582 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2582 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:25828 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:25828 1 OK -0x1.ad750e9eb00ap15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 -0x1.4p2 0x0.0p0 F +REG esri:25828 2 OK 0x1.018fa874f57f4p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG esri:25828 3 OK -0x1.ad750e9eb00ap15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p4 0x1.4p2 0x0.0p0 F +REG esri:25828 4 OK 0x1.018fa874f57f4p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG esri:25829 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:25829 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG esri:25829 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 -0x1.4p2 0x0.0p0 F +REG esri:25829 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG esri:25829 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0000000000003p2 0x1.4p2 0x0.0p0 F +REG esri:2583 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:2583 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2583 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2583 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2583 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:25830 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:25830 1 OK -0x1.ad750e9eb001p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG esri:25830 2 OK 0x1.018fa874f57f8p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.4p2 0x0.0p0 F +REG esri:25830 3 OK -0x1.ad750e9eb001p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG esri:25830 4 OK 0x1.018fa874f57f8p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffbp0 0x1.4p2 0x0.0p0 F +REG esri:25831 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:25831 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep0 -0x1.4p2 0x0.0p0 F +REG esri:25831 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep2 -0x1.4p2 0x0.0p0 F +REG esri:25831 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ffffffffffffep0 0x1.4p2 0x0.0p0 F +REG esri:25831 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep2 0x1.4p2 0x0.0p0 F +REG esri:25832 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:25832 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:25832 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 -0x1.4p2 0x0.0p0 F +REG esri:25832 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:25832 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.bffffffffffffp3 0x1.4p2 0x0.0p0 F +REG esri:25833 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:25833 1 OK -0x1.ad750e9eafe9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4p2 0x0.0p0 F +REG esri:25833 2 OK 0x1.018fa874f5805p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 -0x1.4p2 0x0.0p0 F +REG esri:25833 3 OK -0x1.ad750e9eafe9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4000000000001p3 0x1.4p2 0x0.0p0 F +REG esri:25833 4 OK 0x1.018fa874f5805p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p4 0x1.4p2 0x0.0p0 F +REG esri:25834 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:25834 1 OK -0x1.ad750e9eaff1p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 -0x1.4p2 0x0.0p0 F +REG esri:25834 2 OK 0x1.018fa874f5801p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 -0x1.4p2 0x0.0p0 F +REG esri:25834 3 OK -0x1.ad750e9eaff1p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.0p4 0x1.4p2 0x0.0p0 F +REG esri:25834 4 OK 0x1.018fa874f5801p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ap4 0x1.4p2 0x0.0p0 F +REG esri:25835 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:25835 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 -0x1.4p2 0x0.0p0 F +REG esri:25835 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 -0x1.4p2 0x0.0p0 F +REG esri:25835 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p4 0x1.4p2 0x0.0p0 F +REG esri:25835 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.ffffffffffffep4 0x1.4p2 0x0.0p0 F +REG esri:25836 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:25836 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 -0x1.4p2 0x0.0p0 F +REG esri:25836 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 -0x1.4p2 0x0.0p0 F +REG esri:25836 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.c000000000001p4 0x1.4p2 0x0.0p0 F +REG esri:25836 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.3p5 0x1.4p2 0x0.0p0 F +REG esri:25837 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:25837 1 OK -0x1.ad750e9eafecp15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 -0x1.4p2 0x0.0p0 F +REG esri:25837 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 -0x1.4p2 0x0.0p0 F +REG esri:25837 3 OK -0x1.ad750e9eafecp15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.1p5 0x1.4p2 0x0.0p0 F +REG esri:25837 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.6p5 0x1.4p2 0x0.0p0 F +REG esri:25838 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:25838 1 OK -0x1.ad750e9eaff9p15 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 -0x1.4p2 0x0.0p0 F +REG esri:25838 2 OK 0x1.018fa874f57fcp20 -0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 -0x1.4p2 0x0.0p0 F +REG esri:25838 3 OK -0x1.ad750e9eaff9p15 0x1.0ee35b740b12bp19 0x0.0p0 0x1.4p5 0x1.4p2 0x0.0p0 F +REG esri:25838 4 OK 0x1.018fa874f57fcp20 0x1.0ee35b740b12bp19 0x0.0p0 0x1.8ffffffffffffp5 0x1.4p2 0x0.0p0 F +REG esri:2584 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2584 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2584 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2584 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2584 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2585 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2585 1 OK -0x1.af4401dc87adp15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2585 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2585 3 OK -0x1.af4401dc87adp15 0x1.0f00593292131p19 0x0.0p0 0x1.900000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2585 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2586 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2586 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2586 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2586 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2586 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2587 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:2587 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2587 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2587 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2587 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2588 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2588 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2588 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2588 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2588 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:25884 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:25884 1 OK -0x1.ad750e7d869bp15 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:25884 2 OK 0x1.018fa873ec34ep20 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:25884 3 OK -0x1.ad750e7d869bp15 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:25884 4 OK 0x1.018fa873ec34ep20 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2589 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG esri:2589 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2589 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2589 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2589 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2590 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2590 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2590 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2590 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2590 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2591 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2591 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2591 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc5632p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2591 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2591 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc5632p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2592 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2592 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2592 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2592 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2592 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2593 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp5 0x0.0p0 0x0.0p0 T +REG esri:2593 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2593 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5633p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2593 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2593 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5633p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:25932 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:25932 1 OK -0x1.fc406e18ccf6p14 0x1.9700891db3eb6p22 0x0.0p0 0x1.bdd68fcf51a38p1 -0x1.e000000000001p4 0x0.0p0 F +REG esri:25932 2 OK 0x1.f82a0370c667cp19 0x1.9700891db3eb6p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.e000000000001p4 0x0.0p0 F +REG esri:25932 3 OK -0x1.2fefde056e328p16 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.bdd68fcf51a32p1 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:25932 4 OK 0x1.0722fde056e32p20 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2594 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2594 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2594 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2594 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2594 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2595 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp5 0x0.0p0 0x0.0p0 T +REG esri:2595 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9cep5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2595 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2595 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9cep5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2595 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2596 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2596 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2596 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2596 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2596 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2597 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p6 0x0.0p0 0x0.0p0 T +REG esri:2597 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2597 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2597 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2597 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2598 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2598 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2598 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2598 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2598 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2599 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p6 0x0.0p0 0x0.0p0 T +REG esri:2599 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2599 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2599 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2599 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2600 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:2600 1 OK -0x1.ae5322368f2fp15 -0x1.0ef13b755de07p19 0x0.0p0 0x1.3000000075407p4 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG esri:2600 2 OK 0x1.01969911b4798p20 -0x1.0ef13b755de07p19 0x0.0p0 0x1.cfffffff8abfbp4 -0x1.3fffffffeae0fp2 0x0.0p0 F +REG esri:2600 3 OK -0x1.ae5322368f2fp15 0x1.0ef13b755de07p19 0x0.0p0 0x1.3000000075407p4 0x1.3fffffffeae0fp2 0x0.0p0 F +REG esri:2600 4 OK 0x1.01969911b4798p20 0x1.0ef13b755de07p19 0x0.0p0 0x1.cfffffff8abfbp4 0x1.3fffffffeae0fp2 0x0.0p0 F +REG esri:2601 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2601 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2601 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2601 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2601 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2602 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2602 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2602 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2602 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2602 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2603 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2603 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2603 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2603 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2603 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2604 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2604 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2604 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2604 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2604 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2605 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2605 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2605 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2605 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2605 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2606 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2606 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2606 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2606 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2606 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2607 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2607 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2607 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2607 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2607 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2608 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2608 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2608 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2608 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2608 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2609 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2609 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2609 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2609 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2609 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2610 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2610 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2610 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2610 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2610 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2611 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2611 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2611 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2611 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2611 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2612 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2612 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2612 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2612 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2612 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2613 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2613 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2613 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2613 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2613 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2614 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2614 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2614 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2614 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2614 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2615 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2615 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2615 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2615 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2615 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2616 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2616 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2616 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2616 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2616 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2617 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2617 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2617 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2617 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2617 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2618 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2618 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2618 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2618 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2618 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2619 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2619 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2619 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2619 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2619 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26191 0 OK 0x1.e822f23d3826fp18 0x1.2540963aca163p18 -0x1.79a036748p5 -0x1.599999999999ap2 0x1.0a6666666662ap5 -0x1.0p-29 F +REG esri:26191 1 OK -0x1.5a095eb30bc38p16 -0x1.d02d113448a8cp17 -0x1.cc1a98664p5 -0x1.6c3b4ece0123dp3 0x1.c4ccccccccc0fp4 0x0.0p0 F +REG esri:26191 2 OK 0x1.09b21191b144ap20 -0x1.d02e34784bddp17 -0x1.52e549f47p6 0x1.2a1b534678a0ep-1 0x1.c4ccccccccc09p4 0x0.0p0 F +REG esri:26191 3 OK -0x1.866552744e4ep14 0x1.a91bdd10b6cd4p19 -0x1.12920c198p3 -0x1.6c3b4ece0123cp3 0x1.3266666666644p5 0x1.0p-30 F +REG esri:26191 4 OK 0x1.f456182f9f6dfp19 0x1.a91c2497ffc9fp19 -0x1.06aa78a5ap5 0x1.2a1b534678a0cp-1 0x1.3266666666641p5 0x1.8p-29 F +REG esri:26192 0 OK 0x1.e822f24f3edf1p18 0x1.253af855852d1p18 -0x1.03176ecc4p6 -0x1.5999999999999p2 0x1.db33333333283p4 0x0.0p0 F +REG esri:26192 1 OK -0x1.49837313739dp16 -0x1.d42e27c2a4158p17 -0x1.23c4bd50ep6 -0x1.64ff6ec44c139p3 0x1.8b3333333324bp4 0x0.0p0 F +REG esri:26192 2 OK 0x1.08a9b28f79dc4p20 -0x1.d42f4ad709c4cp17 -0x1.8fd9397bdp6 0x1.6cbaa5564f3fdp-2 0x1.8b33333333248p4 -0x1.0p-30 F +REG esri:26192 3 OK -0x1.c784c21b404p14 0x1.a804f210a9481p19 -0x1.bb78ba094p4 -0x1.64ff6ec44c13ap3 0x1.1599999999964p5 0x1.0p-29 F +REG esri:26192 4 OK 0x1.f65f1462532a9p19 0x1.a80539b817641p19 -0x1.a15824298p5 0x1.6cbaa5564f406p-2 0x1.1599999999964p5 0x1.0p-30 F +REG esri:26193 0 OK 0x1.24eebc9bc256ep20 0x1.86dc35181b1fcp18 -0x1.43237c865p6 -0x1.599999999999ap2 0x1.a1999999998c1p4 -0x1.0p-30 F +REG esri:26193 1 OK 0x1.2e88ea6850be3p19 -0x1.148dc77bdbb64p17 -0x1.59b8cd4b7p6 -0x1.5ef7df1d0876bp3 0x1.519999999988cp4 0x0.0p0 F +REG esri:26193 2 OK 0x1.b29905ee7fd42p20 -0x1.148eea5ef0bfcp17 -0x1.c516cd1bep6 0x1.579160dbb741ap-3 0x1.5199999999891p4 -0x1.0p-30 F +REG esri:26193 3 OK 0x1.45ace4c361b48p19 0x1.d7d0392d175f9p19 -0x1.6dc80371p5 -0x1.5ef7df1d08769p3 0x1.f19999999990ap4 -0x1.0p-29 F +REG esri:26193 4 OK 0x1.a70705234106ap20 0x1.d7d080f0f0749p19 -0x1.196e5e869p6 0x1.579160dbb73f6p-3 0x1.f1999999998fep4 -0x1.0p-29 F +REG esri:2620 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2620 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2620 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2620 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2620 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2621 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2621 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2621 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2621 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2621 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2622 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p7 0x0.0p0 0x0.0p0 T +REG esri:2622 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2622 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2622 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2622 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2623 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:2623 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2623 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2623 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2623 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26237 0 OK 0x1.e85dd6d61b8b2p18 -0x1.dfcf12cbd288fp5 -0x1.74012fb78p3 0x1.37fffffffffffp5 0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG esri:26237 1 OK -0x1.acc72c5528eap15 -0x1.0eeaff98eca34p19 -0x1.18e96e858p3 0x1.1p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:26237 2 OK 0x1.019524deab8d1p20 -0x1.0eeaff997adb4p19 0x1.9983b61ap2 0x1.6p5 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:26237 3 OK -0x1.acc900aba464p15 0x1.0edc014141f1p19 -0x1.33cfb60acp4 0x1.1p5 0x1.4p2 -0x1.0p-29 F +REG esri:26237 4 OK 0x1.019533828be97p20 0x1.0edc0141d019bp19 -0x1.03e7dbecp2 0x1.6p5 0x1.4000000000002p2 -0x1.0p-29 F +REG esri:2624 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p7 0x0.0p0 0x0.0p0 T +REG esri:2624 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2624 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2624 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2624 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2625 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:2625 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2625 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2625 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2625 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2626 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp7 0x0.0p0 0x0.0p0 T +REG esri:2626 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2626 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2626 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2626 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2627 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:2627 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2627 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2627 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2627 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2628 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p7 0x0.0p0 0x0.0p0 T +REG esri:2628 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2628 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2628 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2628 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2629 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:2629 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2629 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2629 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2629 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2630 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p7 0x0.0p0 0x0.0p0 T +REG esri:2630 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2630 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2630 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2630 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2631 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:2631 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2631 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2631 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2631 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2632 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2632 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2632 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2632 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2632 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2633 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2633 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2633 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2633 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2633 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26331 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:26331 1 OK -0x1.ad892fd89976p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffbp0 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26331 2 OK 0x1.0190497ec4cc4p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.0000000000001p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26331 3 OK -0x1.ad892fd89976p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffbp0 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26331 4 OK 0x1.0190497ec4cc4p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.0000000000001p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26332 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:26332 1 OK -0x1.ad892fd8997fp15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.0p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26332 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26332 3 OK -0x1.ad892fd8997fp15 0x1.0edd047bd8483p19 0x0.0p0 0x1.0p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26332 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2634 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2634 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2634 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2634 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2634 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2635 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2635 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2635 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2635 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2635 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2636 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p7 0x0.0p0 0x0.0p0 F +REG esri:2636 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2636 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2636 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2636 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2637 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2637 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2637 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2637 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2637 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2638 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2638 1 OK -0x1.af4401dc87c2p15 -0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2638 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2638 3 OK -0x1.af4401dc87c2p15 0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2638 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2639 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2639 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2639 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2639 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2639 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26391 0 OK 0x1.c2a92147ae148p17 0x0.0p0 0x0.0p0 0x1.2p2 0x1.0p2 0x0.0p0 F +REG esri:26391 1 OK -0x1.400a5eb3fe256p18 -0x1.0e1397dceedf4p19 0x0.0p0 -0x1.064052732728p-1 -0x1.ffffffffdb3adp-1 0x0.0p0 T +REG esri:26391 2 OK 0x1.8159bffdd61dp19 -0x1.0e1397dceedf4p19 0x0.0p0 0x1.3064052732728p3 -0x1.ffffffffdb3adp-1 0x0.0p0 T +REG esri:26391 3 OK -0x1.396b3a6a816cp18 0x1.0fbf7fc12436fp19 0x0.0p0 -0x1.064052782ae9ep-1 0x1.1fffffffedc7ap3 0x0.0p0 F +REG esri:26391 4 OK 0x1.7e0a2dd917c06p19 0x1.0fbf7fc12436fp19 0x0.0p0 0x1.3064052782aebp3 0x1.1fffffffedc7ap3 0x0.0p0 F +REG esri:26392 0 OK 0x1.476b3f5c28f5cp19 0x0.0p0 0x0.0p0 0x1.1p3 0x1.0p2 0x0.0p0 F +REG esri:26392 1 OK 0x1.b5de3d81f2efp16 -0x1.0e1397dceedf4p19 0x0.0p0 0x1.be6feb633636p1 -0x1.ffffffffdb3adp-1 0x0.0p0 T +REG esri:26392 2 OK 0x1.2c0d5b8409c6cp20 -0x1.0e1397dceedf4p19 0x0.0p0 0x1.b064052732728p3 -0x1.ffffffffdb3adp-1 0x0.0p0 T +REG esri:26392 3 OK 0x1.d05acea7e5d48p16 0x1.0fbf7fc12436fp19 0x0.0p0 0x1.be6feb61f5459p1 0x1.1fffffffedc7ap3 0x0.0p0 F +REG esri:26392 4 OK 0x1.2a659271aa987p20 0x1.0fbf7fc12436fp19 0x0.0p0 0x1.b064052782aeap3 0x1.1fffffffedc7ap3 0x0.0p0 F +REG esri:26393 0 OK 0x1.0f161b3333333p20 0x0.0p0 0x0.0p0 0x1.9p3 0x1.0p2 0x0.0p0 F +REG esri:26393 1 OK 0x1.0d7cbeba7bce9p19 -0x1.0e1397dceedf4p19 0x0.0p0 0x1.df37f5b19b1b1p2 -0x1.ffffffffdb3adp-1 0x0.0p0 T +REG esri:26393 2 OK 0x1.976dd709287f2p20 -0x1.0e1397dceedf4p19 0x0.0p0 0x1.1832029399395p4 -0x1.ffffffffdb3adp-1 0x0.0p0 T +REG esri:26393 3 OK 0x1.10cc50df3a2b4p19 0x1.0fbf7fc12436fp19 0x0.0p0 0x1.df37f5b0faa2cp2 0x1.1fffffffedc7ap3 0x0.0p0 F +REG esri:26393 4 OK 0x1.95c60df6c950cp20 0x1.0fbf7fc12436fp19 0x0.0p0 0x1.18320293c1575p4 0x1.1fffffffedc7ap3 0x0.0p0 F +REG esri:2640 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2640 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2640 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2640 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2640 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2641 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2641 1 OK 0x1.a7e077fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2641 2 OK 0x1.eba68803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2641 3 OK 0x1.a7e077fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2641 4 OK 0x1.eba68803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2642 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:2642 1 OK 0x1.e4e977fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2642 2 OK 0x1.1457c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2642 3 OK 0x1.e4e977fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2642 4 OK 0x1.1457c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2643 0 OK 0x1.21eacp23 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2643 1 OK 0x1.10f93bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2643 2 OK 0x1.32dc4401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2643 3 OK 0x1.10f93bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2643 4 OK 0x1.32dc4401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26432 0 OK 0x1.e83f203504af4p18 0x1.b99909569d09ap22 -0x1.83910053ep5 0x1.2p3 -0x1.9000000000001p4 0x1.8p-29 F +REG esri:26432 1 OK -0x1.fc86e74098c8p14 0x1.9702934f338dp22 -0x1.cc40094eep5 0x1.bdd68fcf51a3ap1 -0x1.e000000000003p4 0x0.0p0 F +REG esri:26432 2 OK 0x1.f8235763af852p19 0x1.9702934f53628p22 -0x1.fb8dcce64p5 0x1.d08a5c0c2b973p3 -0x1.e000000000001p4 0x1.0p-30 F +REG esri:26432 3 OK -0x1.2fff17e4d347p16 0x1.dacc09963f798p22 -0x1.1e8630054p5 0x1.bdd68fcf51a39p1 -0x1.4p4 0x1.0p-29 F +REG esri:26432 4 OK 0x1.071f81921aedap20 0x1.dacc09965dc5bp22 -0x1.51da08252p5 0x1.d08a5c0c2b973p3 -0x1.4p4 0x1.0p-30 F +REG esri:2644 0 OK 0x1.406f4p23 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2644 1 OK 0x1.2f7dbbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.900000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2644 2 OK 0x1.5160c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2644 3 OK 0x1.2f7dbbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.900000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2644 4 OK 0x1.5160c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2645 0 OK 0x1.5ef3cp23 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2645 1 OK 0x1.4e023bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2645 2 OK 0x1.6fe54401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2645 3 OK 0x1.4e023bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2645 4 OK 0x1.6fe54401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2646 0 OK 0x1.7d784p23 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:2646 1 OK 0x1.6c86bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2646 2 OK 0x1.8e69c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2646 3 OK 0x1.6c86bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2646 4 OK 0x1.8e69c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2647 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2647 1 OK 0x1.8b0b3bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9cep5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2647 2 OK 0x1.acee4401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2647 3 OK 0x1.8b0b3bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9cep5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2647 4 OK 0x1.acee4401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2648 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG esri:2648 1 OK 0x1.a98fbbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2648 2 OK 0x1.cb72c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2648 3 OK 0x1.a98fbbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2648 4 OK 0x1.cb72c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2649 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2649 1 OK 0x1.c8143bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2649 2 OK 0x1.e9f74401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2649 3 OK 0x1.c8143bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2649 4 OK 0x1.e9f74401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2650 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.8000000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2650 1 OK 0x1.e698bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2650 2 OK 0x1.043de200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc563p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2650 3 OK 0x1.e698bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2650 4 OK 0x1.043de200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc563p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2651 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2651 1 OK 0x1.028e9dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cdp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2651 2 OK 0x1.13802200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5634p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2651 3 OK 0x1.028e9dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cdp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2651 4 OK 0x1.13802200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5634p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2652 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.bp5 0x0.0p0 0x0.0p0 T +REG esri:2652 1 OK 0x1.11d0ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9ccp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2652 2 OK 0x1.22c26200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5634p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2652 3 OK 0x1.11d0ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9ccp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2652 4 OK 0x1.22c26200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5634p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2653 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2653 1 OK 0x1.21131dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9cdp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2653 2 OK 0x1.3204a200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc563p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2653 3 OK 0x1.21131dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9cdp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2653 4 OK 0x1.3204a200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc563p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2654 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.dffffffffffffp5 0x0.0p0 0x0.0p0 T +REG esri:2654 1 OK 0x1.30555dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2654 2 OK 0x1.4146e200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2654 3 OK 0x1.30555dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2654 4 OK 0x1.4146e200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2655 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2655 1 OK 0x1.3f979dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9d1p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2655 2 OK 0x1.50892200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2655 3 OK 0x1.3f979dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9d1p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2655 4 OK 0x1.50892200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2656 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.08p6 0x0.0p0 0x0.0p0 T +REG esri:2656 1 OK 0x1.4ed9ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9ccp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2656 2 OK 0x1.5fcb6200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2656 3 OK 0x1.4ed9ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9ccp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2656 4 OK 0x1.5fcb6200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2657 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2657 1 OK 0x1.5e1c1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2657 2 OK 0x1.6f0da200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2657 3 OK 0x1.5e1c1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2657 4 OK 0x1.6f0da200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2658 0 OK 0x1.75d72p24 0x0.0p0 0x0.0p0 0x1.2p6 0x0.0p0 0x0.0p0 T +REG esri:2658 1 OK 0x1.6d5e5dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2658 2 OK 0x1.7e4fe200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2658 3 OK 0x1.6d5e5dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2658 4 OK 0x1.7e4fe200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2659 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2659 1 OK 0x1.7ca09dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2659 2 OK 0x1.8d922200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2659 3 OK 0x1.7ca09dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2659 4 OK 0x1.8d922200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26591 0 OK 0x1.931d0ddaef27p16 0x0.0p0 0x0.0p0 0x1.573cc2e85e29p4 0x0.0p0 0x0.0p0 T +REG esri:26591 1 OK -0x1.c63327141c6ecp18 -0x1.1ae75476dc4a7p19 0x0.0p0 0x1.073cd0ea90f86p4 -0x1.3ffffe05971d9p2 0x0.0p0 F +REG esri:26591 2 OK 0x1.47e4942506468p19 -0x1.10294d4919477p19 0x0.0p0 0x1.a73cc1e656e2p4 -0x1.3ffffffeb8a6bp2 0x0.0p0 F +REG esri:26591 3 OK -0x1.c63327141c6ecp18 0x1.1ae75476dc4a7p19 0x0.0p0 0x1.073cd0ea90f86p4 0x1.3ffffe05971d9p2 0x0.0p0 F +REG esri:26591 4 OK 0x1.47e4942506468p19 0x1.10294d4919477p19 0x0.0p0 0x1.a73cc1e656e2p4 0x1.3ffffffeb8a6bp2 0x0.0p0 F +REG esri:26592 0 OK 0x1.1237d0ddaef28p20 0x0.0p0 0x0.0p0 0x1.b73cc2e85e29p4 0x0.0p0 0x0.0p0 T +REG esri:26592 1 OK 0x1.0ef26c75f1c9p19 -0x1.1ae75476dc4a7p19 0x0.0p0 0x1.673cd0ea90f88p4 -0x1.3ffffe05971dap2 0x0.0p0 F +REG esri:26592 2 OK 0x1.9cf84a1283234p20 -0x1.10294d4919477p19 0x0.0p0 0x1.039e60f32b71p5 -0x1.3ffffffeb8a6bp2 0x0.0p0 F +REG esri:26592 3 OK 0x1.0ef26c75f1c9p19 0x1.1ae75476dc4a7p19 0x0.0p0 0x1.673cd0ea90f88p4 0x1.3ffffe05971dap2 0x0.0p0 F +REG esri:26592 4 OK 0x1.9cf84a1283234p20 0x1.10294d4919477p19 0x0.0p0 0x1.039e60f32b71p5 0x1.3ffffffeb8a6bp2 0x0.0p0 F +REG esri:2660 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2660 1 OK 0x1.8be2ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2660 2 OK 0x1.9cd46200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2660 3 OK 0x1.8be2ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2660 4 OK 0x1.9cd46200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2661 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2661 1 OK 0x1.9b251dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2661 2 OK 0x1.ac16a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2661 3 OK 0x1.9b251dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2661 4 OK 0x1.ac16a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2662 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2662 1 OK 0x1.aa675dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2662 2 OK 0x1.bb58e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2662 3 OK 0x1.aa675dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2662 4 OK 0x1.bb58e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2663 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2663 1 OK 0x1.b9a99dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2663 2 OK 0x1.ca9b2200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2663 3 OK 0x1.b9a99dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2663 4 OK 0x1.ca9b2200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26632 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:26632 1 OK -0x1.ad89324e3d9ap15 -0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26632 2 OK 0x1.0190499271ecep20 -0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26632 3 OK -0x1.ad89324e3d9ap15 0x1.0edd0485be135p19 0x0.0p0 0x1.0000000000001p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:26632 4 OK 0x1.0190499271ecep20 0x1.0edd0485be135p19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2664 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2664 1 OK 0x1.c8ebddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2664 2 OK 0x1.d9dd6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2664 3 OK 0x1.c8ebddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2664 4 OK 0x1.d9dd6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2665 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2665 1 OK 0x1.d82e1dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2665 2 OK 0x1.e91fa200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2665 3 OK 0x1.d82e1dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2665 4 OK 0x1.e91fa200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2666 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2666 1 OK 0x1.e7705dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2666 2 OK 0x1.f861e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2666 3 OK 0x1.e7705dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2666 4 OK 0x1.f861e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2667 0 OK 0x1.ff2b6p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2667 1 OK 0x1.f6b29dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2667 2 OK 0x1.03d211007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2667 3 OK 0x1.f6b29dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2667 4 OK 0x1.03d211007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2668 0 OK 0x1.0736dp25 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2668 1 OK 0x1.02fa6eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2668 2 OK 0x1.0b7331007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2668 3 OK 0x1.02fa6eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2668 4 OK 0x1.0b7331007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2669 0 OK 0x1.0ed7fp25 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2669 1 OK 0x1.0a9b8eff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2669 2 OK 0x1.131451007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2669 3 OK 0x1.0a9b8eff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2669 4 OK 0x1.131451007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b1bp6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26692 0 OK 0x1.e848p18 0x1.b99b3e9dcd866p22 0x0.0p0 0x1.2p3 -0x1.9p4 0x0.0p0 F +REG esri:26692 1 OK -0x1.fc27c86c46fp14 0x1.97055744046d3p22 0x0.0p0 0x1.bdd68fcf51a3bp1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26692 2 OK 0x1.f8293e4362379p19 0x1.97055744046d3p22 0x0.0p0 0x1.d08a5c0c2b971p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26692 3 OK -0x1.2fe615866d1e8p16 0x1.dacd9631c3a99p22 0x0.0p0 0x1.bdd68fcf51a3bp1 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:26692 4 OK 0x1.0722615866d1ep20 0x1.dacd9631c3a99p22 0x0.0p0 0x1.d08a5c0c2b971p3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2670 0 OK 0x1.16791p25 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2670 1 OK 0x1.123caeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2670 2 OK 0x1.1ab571007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2670 3 OK 0x1.123caeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2670 4 OK 0x1.1ab571007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26703 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.4ap7 0x1.68p5 0x0.0p0 F +REG esri:26703 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.582463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26703 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26703 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.582463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26703 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26704 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.3ep7 0x1.68p5 0x0.0p0 F +REG esri:26704 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.4c2463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26704 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26704 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.4c2463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26704 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26705 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.32p7 0x1.68p5 0x0.0p0 F +REG esri:26705 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.402463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26705 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26705 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.402463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26705 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26706 0 OK 0x1.e848000000022p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.26p7 0x1.68p5 0x0.0p0 F +REG esri:26706 1 OK -0x1.95bacc669d1d8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.342463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26706 2 OK 0x1.0d7facc669d3p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26706 3 OK -0x1.99a5174d6b98p12 0x1.5380b21056044p22 0x0.0p0 -0x1.342463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26706 4 OK 0x1.eb7b4a2e9ad94p19 0x1.5380b21056045p22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.9p5 0x0.0p0 F +REG esri:26707 0 OK 0x1.e847fffffffdep18 0x1.301f34d63e508p22 0x0.0p0 -0x1.1ap7 0x1.68p5 0x0.0p0 F +REG esri:26707 1 OK -0x1.95bacc669d3p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.282463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26707 2 OK 0x1.0d7facc669d1ep20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26707 3 OK -0x1.99a5174d6c9cp12 0x1.5380b21056045p22 0x0.0p0 -0x1.282463000f856p7 0x1.9p5 0x0.0p0 F +REG esri:26707 4 OK 0x1.eb7b4a2e9ad73p19 0x1.5380b21056044p22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26708 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.0ep7 0x1.68p5 0x0.0p0 F +REG esri:26708 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.1c2463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26708 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26708 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.1c2463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26708 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26709 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.02p7 0x1.68p5 0x0.0p0 F +REG esri:26709 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.102463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26709 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26709 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.102463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26709 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:2671 0 OK 0x1.1e1a3p25 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2671 1 OK 0x1.19ddceff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2671 2 OK 0x1.225691007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2671 3 OK 0x1.19ddceff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2671 4 OK 0x1.225691007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26710 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.ec00000000001p6 0x1.68p5 0x0.0p0 F +REG esri:26710 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.042463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26710 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26710 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.042463000f856p7 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26710 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26711 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.d4p6 0x1.68p5 0x0.0p0 F +REG esri:26711 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26711 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26711 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26711 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26712 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.bcp6 0x1.68p5 0x0.0p0 F +REG esri:26712 1 OK -0x1.95bacc669d218p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26712 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26712 3 OK -0x1.99a5174d6bd8p12 0x1.5380b21056044p22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26712 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26713 0 OK 0x1.e847fffffffefp18 0x1.301f34d63e508p22 0x0.0p0 -0x1.a400000000001p6 0x1.68p5 0x0.0p0 F +REG esri:26713 1 OK -0x1.95bacc669d2b8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26713 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26713 3 OK -0x1.99a5174d6c4cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26713 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26714 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.8cp6 0x1.68p5 0x0.0p0 F +REG esri:26714 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26714 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26714 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26714 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26715 0 OK 0x1.e847fffffffefp18 0x1.301f34d63e508p22 0x0.0p0 -0x1.74p6 0x1.68p5 0x0.0p0 F +REG esri:26715 1 OK -0x1.95bacc669d2b8p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26715 2 OK 0x1.0d7facc669d22p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26715 3 OK -0x1.99a5174d6c4cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26715 4 OK 0x1.eb7b4a2e9ad7bp19 0x1.5380b21056044p22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26716 0 OK 0x1.e848000000011p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.5cp6 0x1.68p5 0x0.0p0 F +REG esri:26716 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26716 2 OK 0x1.0d7facc669d2cp20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26716 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26716 4 OK 0x1.eb7b4a2e9ad8ap19 0x1.5380b21056044p22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26717 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.44p6 0x1.68p5 0x0.0p0 F +REG esri:26717 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26717 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26717 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26717 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26718 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.2cp6 0x1.68p5 0x0.0p0 F +REG esri:26718 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26718 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26718 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26718 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26719 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.14p6 0x1.68p5 0x0.0p0 F +REG esri:26719 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26719 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.4000000000001p5 0x0.0p0 F +REG esri:26719 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26719 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:2672 0 OK 0x1.25bb5p25 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2672 1 OK 0x1.217eeeff88de1p25 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2672 2 OK 0x1.29f7b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2672 3 OK 0x1.217eeeff88de1p25 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2672 4 OK 0x1.29f7b1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26720 0 OK 0x1.e848p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.f8p5 0x1.68p5 0x0.0p0 F +REG esri:26720 1 OK -0x1.95bacc669d26p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26720 2 OK 0x1.0d7facc669d26p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.4000000000001p5 0x0.0p0 F +REG esri:26720 3 OK -0x1.99a5174d6c0cp12 0x1.5380b21056044p22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26720 4 OK 0x1.eb7b4a2e9ad82p19 0x1.5380b21056044p22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26721 0 OK 0x1.e848000000011p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.c800000000001p5 0x1.68p5 0x0.0p0 F +REG esri:26721 1 OK -0x1.95bacc669d218p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.4000000000001p5 0x0.0p0 F +REG esri:26721 2 OK 0x1.0d7facc669d2ep20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.8f6e73ffc1ea8p5 0x1.4000000000001p5 0x0.0p0 F +REG esri:26721 3 OK -0x1.99a5174d6bd8p12 0x1.5380b21056044p22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26721 4 OK 0x1.eb7b4a2e9ad8ep19 0x1.5380b21056044p22 0x0.0p0 -0x1.8f6e73ffc1ea8p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26722 0 OK 0x1.e848000000009p18 0x1.301f34d63e508p22 0x0.0p0 -0x1.98p5 0x1.68p5 0x0.0p0 F +REG esri:26722 1 OK -0x1.95bacc669d218p16 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.d0918c003e157p5 0x1.4000000000001p5 0x0.0p0 F +REG esri:26722 2 OK 0x1.0d7facc669d29p20 0x1.0fb3b7ab0073ap22 0x0.0p0 -0x1.5f6e73ffc1ea8p5 0x1.4000000000001p5 0x0.0p0 F +REG esri:26722 3 OK -0x1.99a5174d6bd8p12 0x1.5380b21056044p22 0x0.0p0 -0x1.d0918c003e157p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26722 4 OK 0x1.eb7b4a2e9ad86p19 0x1.5380b21056044p22 0x0.0p0 -0x1.5f6e73ffc1ea9p5 0x1.8fffffffffffdp5 0x0.0p0 F +REG esri:26729 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG esri:26729 1 OK -0x1.59bbcc451cc42p20 -0x1.b1915fd7944p20 0x0.0p0 -0x1.6e8b909db4109p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG esri:26729 2 OK 0x1.26efe6228e618p21 -0x1.b1915fd7944p20 0x0.0p0 -0x1.401f1a0cf69a2p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG esri:26729 3 OK -0x1.2be06b84012c6p20 0x1.c89117549006cp20 0x0.0p0 -0x1.6e8b909db0aa7p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG esri:26729 4 OK 0x1.100235c20095ap21 0x1.c89117549006ap20 0x0.0p0 -0x1.401f1a0cfa004p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG esri:2673 0 OK 0x1.2d5c7p25 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2673 1 OK 0x1.29200eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2673 2 OK 0x1.3198d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2673 3 OK 0x1.29200eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2673 4 OK 0x1.3198d1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26730 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26730 1 OK -0x1.5942c05bfcc43p20 -0x1.b1c5a35f8d571p20 0x0.0p0 -0x1.751811170dd69p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG esri:26730 2 OK 0x1.26b3602dfe622p21 -0x1.b1c5a35f8d571p20 0x0.0p0 -0x1.46e7eee8f2297p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG esri:26730 3 OK -0x1.2c516db2774adp20 0x1.c85114fd40ddep20 0x0.0p0 -0x1.751811170d69ep6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG esri:26730 4 OK 0x1.103ab6d93ba56p21 0x1.c85114fd40ddep20 0x0.0p0 -0x1.46e7eee8f2963p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG esri:26731 0 OK 0x1.f49d8d570a3d9p23 -0x1.b6ae42e64c0dep23 0x0.0p0 -0x1.0b55555555556p7 0x1.c7ffffffffe6p5 0x0.0p0 F +REG esri:26731 1 OK 0x1.a30af5578e132p23 -0x1.ba21a035a0639p23 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.9fffffffffb6cp5 0x0.0p0 F +REG esri:26731 2 OK 0x1.0406c30e38c42p24 -0x1.02e1df3958d2ap24 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffb6ap5 0x0.0p0 F +REG esri:26731 3 OK 0x1.f19b4c0cb8107p23 -0x1.6a96bdf03cea8p23 0x0.0p0 -0x1.1db1b1b64ab13p7 0x1.effffffffff8fp5 0x0.0p0 F +REG esri:26731 4 OK 0x1.1f54c40739ff2p24 -0x1.a43023343d531p23 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.effffffffff8fp5 0x0.0p0 F +REG esri:26732 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG esri:26732 1 OK -0x1.7832e8e4606d3p20 -0x1.a1864512abb79p20 0x0.0p0 -0x1.2d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26732 2 OK 0x1.362b74723035cp21 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.0afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26732 3 OK -0x1.0cd6e1619c978p20 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.2d035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26732 4 OK 0x1.007d70b0ce4b2p21 0x1.d6db33a7497fp20 0x0.0p0 -0x1.0afcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26733 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG esri:26733 1 OK -0x1.7832e8e4606d3p20 -0x1.a1864512abb79p20 0x0.0p0 -0x1.35035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26733 2 OK 0x1.362b74723036ap21 -0x1.a1864512abb79p20 0x0.0p0 -0x1.12fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26733 3 OK -0x1.0cd6e1619c978p20 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.35035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26733 4 OK 0x1.007d70b0ce4bcp21 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.12fcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26734 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG esri:26734 1 OK -0x1.7832e8e4606b9p20 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.3d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26734 2 OK 0x1.362b74723036ap21 -0x1.a1864512abb79p20 0x0.0p0 -0x1.1afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26734 3 OK -0x1.0cd6e1619c964p20 0x1.d6db33a7497fp20 0x0.0p0 -0x1.3d035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26734 4 OK 0x1.007d70b0ce4bcp21 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.1afcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26735 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG esri:26735 1 OK -0x1.7832e8e4606b9p20 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.45035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26735 2 OK 0x1.362b74723036ap21 -0x1.a1864512abb79p20 0x0.0p0 -0x1.22fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26735 3 OK -0x1.0cd6e1619c964p20 0x1.d6db33a7497fp20 0x0.0p0 -0x1.45035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26735 4 OK 0x1.007d70b0ce4bcp21 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.22fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26736 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG esri:26736 1 OK -0x1.7832e8e4606d3p20 -0x1.a1864512abb79p20 0x0.0p0 -0x1.4d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26736 2 OK 0x1.362b74723035cp21 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.2afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26736 3 OK -0x1.0cd6e1619c978p20 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.4d035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26736 4 OK 0x1.007d70b0ce4b2p21 0x1.d6db33a7497fp20 0x0.0p0 -0x1.2afcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26737 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG esri:26737 1 OK -0x1.475ee8e4606d3p20 -0x1.a1864512abb79p20 0x0.0p0 -0x1.55035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26737 2 OK 0x1.4e9574723035cp21 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.32fcaafc23cp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26737 3 OK -0x1.b805c2c3392fp19 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.55035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26737 4 OK 0x1.18e770b0ce4b2p21 0x1.d6db33a7497fp20 0x0.0p0 -0x1.32fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26738 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG esri:26738 1 OK -0x1.7832e8e4606b9p20 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.5d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26738 2 OK 0x1.362b74723036ap21 -0x1.a1864512abb79p20 0x0.0p0 -0x1.3afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26738 3 OK -0x1.0cd6e1619c964p20 0x1.d6db33a7497fp20 0x0.0p0 -0x1.5d035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26738 4 OK 0x1.007d70b0ce4bcp21 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.3afcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26739 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG esri:26739 1 OK -0x1.5fc8e8e4606b9p20 -0x1.a1864512abb7bp20 0x0.0p0 -0x1.65035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26739 2 OK 0x1.426074723036ap21 -0x1.a1864512abb79p20 0x0.0p0 -0x1.42fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG esri:26739 3 OK -0x1.e8d9c2c3392c8p19 0x1.d6db33a7497fp20 0x0.0p0 -0x1.65035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:26739 4 OK 0x1.0cb270b0ce4bcp21 0x1.d6db33a7497f3p20 0x0.0p0 -0x1.42fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG esri:2674 0 OK 0x1.34fd9p25 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2674 1 OK 0x1.30c12eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2674 2 OK 0x1.3939f1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2674 3 OK 0x1.30c12eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2674 4 OK 0x1.3939f1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26740 0 OK 0x1.6e36p21 0x1.f90afa959da16p18 0x0.0p0 -0x1.6p7 0x1.a355555555119p5 0x0.0p0 F +REG esri:26740 1 OK 0x1.cf24f0bf28852p20 -0x1.d67fca3ce8435p18 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa39fp5 0x0.0p0 F +REG esri:26740 2 OK 0x1.f4d987a06bbd7p21 -0x1.d67fca3ce8435p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa39fp5 0x0.0p0 F +REG esri:26740 3 OK 0x1.efc3d4937bb68p20 0x1.8288418ff6911p20 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffd9ep5 0x0.0p0 F +REG esri:26740 4 OK 0x1.e48a15b64224cp21 0x1.8288418ff6911p20 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffd9ep5 0x0.0p0 F +REG esri:26741 0 OK 0x1.e848p20 0x1.9f0ad61e5cd65p18 0x0.0p0 -0x1.e8p6 0x1.43fffffffffe6p5 0x0.0p0 F +REG esri:26741 1 OK 0x1.10b92589ab31ep20 -0x1.9013b67605a7bp18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555535p5 0x0.0p0 F +REG esri:26741 2 OK 0x1.5feb6d3b2a662p21 -0x1.9013b67605a7bp18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555535p5 0x0.0p0 F +REG esri:26741 3 OK 0x1.1f4229cc316f6p20 0x1.3adf49e54c7cap20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa95p5 0x0.0p0 F +REG esri:26741 4 OK 0x1.58a6eb19e7476p21 0x1.3adf49e54c7cap20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa95p5 0x0.0p0 F +REG esri:26742 0 OK 0x1.e848p20 0x1.8148d1b3b0af8p18 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe3p5 0x0.0p0 F +REG esri:26742 1 OK 0x1.20fc48ca36fd4p20 -0x1.75344c364ea71p18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa7cp5 0x0.0p0 F +REG esri:26742 2 OK 0x1.57c9db9ae4806p21 -0x1.75344c364ea71p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7cp5 0x0.0p0 F +REG esri:26742 3 OK 0x1.2cc3b9656eb2cp20 0x1.23e317654b499p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.475555555554p5 0x0.0p0 F +REG esri:26742 4 OK 0x1.51e6234d48a5ap21 0x1.23e317654b499p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.475555555554p5 0x0.0p0 F +REG esri:26743 0 OK 0x1.e848p20 0x1.57b6f48b115c6p18 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb96p5 0x0.0p0 F +REG esri:26743 1 OK 0x1.373bcbd6bf008p20 -0x1.4e90f89df5f4bp18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444415p5 0x0.0p0 F +REG esri:26743 2 OK 0x1.4caa1a14a080cp21 -0x1.4e90f89df5f4bp18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444413p5 0x0.0p0 F +REG esri:26743 3 OK 0x1.402e2e49b0444p20 0x1.04050bb8fef61p20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333316p5 0x0.0p0 F +REG esri:26743 4 OK 0x1.4830e8db27dedp21 0x1.04050bb8fef61p20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333316p5 0x0.0p0 F +REG esri:26744 0 OK 0x1.e848p20 0x1.54b1071b2d44fp18 0x0.0p0 -0x1.dcp6 0x1.225555555552ap5 0x0.0p0 F +REG esri:26744 1 OK 0x1.38fbbaa856bdap20 -0x1.4c1516565ba64p18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffccp5 0x0.0p0 F +REG esri:26744 2 OK 0x1.4bca22abd4a13p21 -0x1.4c1516565ba64p18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffccp5 0x0.0p0 F +REG esri:26744 3 OK 0x1.416b6581f541dp20 0x1.01a00f7795b48p20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa87p5 0x0.0p0 F +REG esri:26744 4 OK 0x1.47924d3f055f2p21 0x1.01a00f7795b48p20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa87p5 0x0.0p0 F +REG esri:26745 0 OK 0x1.e848p20 0x1.5d7658f313c2cp18 0x0.0p0 -0x1.d800000000001p6 0x1.13ddddddddda9p5 0x0.0p0 F +REG esri:26745 1 OK 0x1.349c7e060dbap20 -0x1.5501734957a4ep18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221dfp5 0x0.0p0 F +REG esri:26745 2 OK 0x1.4df9c0fcf9241p21 -0x1.5501734957a4ep18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221dfp5 0x0.0p0 F +REG esri:26745 3 OK 0x1.3ce83131d0cfap20 0x1.082db193d95e3p20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.239999999996fp5 0x0.0p0 F +REG esri:26745 4 OK 0x1.49d3e76717993p21 0x1.082db193d95e3p20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.239999999996fp5 0x0.0p0 F +REG esri:26746 0 OK 0x1.e848p20 0x1.30fa27dd889dp18 0x0.0p0 -0x1.d1p6 0x1.08333333332f5p5 0x0.0p0 F +REG esri:26746 1 OK 0x1.4c1426a9bfb56p20 -0x1.2ae470c83118fp18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee52p4 0x0.0p0 F +REG esri:26746 2 OK 0x1.423decab2024cp21 -0x1.2ae470c83118fp18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee59p4 0x0.0p0 F +REG esri:26746 3 OK 0x1.52116ae0eef4ep20 0x1.cc7a21fd48d02p19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebdp5 0x0.0p0 F +REG esri:26746 4 OK 0x1.3f3f4a8f8885p21 0x1.cc7a21fd48d02p19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeebdp5 0x0.0p0 F +REG esri:26747 0 OK 0x1.ff1224a3d70a3p21 0x1.9a1dd56f0ae97p18 0x0.0p0 -0x1.d955555555552p6 0x1.11222222221ecp5 0x0.0p0 F +REG esri:26747 1 OK 0x1.d1ea7f244cec2p21 0x1.c71080a10d3p15 0x0.0p0 -0x1.de2a91549c3cfp6 0x1.09222222221e5p5 0x0.0p0 F +REG esri:26747 2 OK 0x1.161ce511b093ap22 0x1.c71080a10d3p15 0x0.0p0 -0x1.d48019560e6d8p6 0x1.09222222221e5p5 0x0.0p0 F +REG esri:26747 3 OK 0x1.d2f7b14a8a9bbp21 0x1.7fd133b09ecb4p19 0x0.0p0 -0x1.de2a91549c3cfp6 0x1.19222222221f1p5 0x0.0p0 F +REG esri:26747 4 OK 0x1.15964bfe91bbdp22 0x1.7fd133b09ecb4p19 0x0.0p0 -0x1.d48019560e6d8p6 0x1.19222222221f1p5 0x0.0p0 F +REG esri:26748 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:26748 1 OK -0x1.5a2b9c2bc88a6p20 -0x1.b152c65f46cf6p20 0x0.0p0 -0x1.cfffd464bd7dfp6 0x1.9fffffffbf24cp4 0x0.0p0 F +REG esri:26748 2 OK 0x1.2727ce15e445cp21 -0x1.b152c65f46cf5p20 0x0.0p0 -0x1.a15580f097d7bp6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:26748 3 OK -0x1.2b64c487b07c4p20 0x1.c8c76a71ba584p20 0x0.0p0 -0x1.cfffd464b6efp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:26748 4 OK 0x1.0fc46243d83eap21 0x1.c8c76a71ba584p20 0x0.0p0 -0x1.a15580f09e669p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:26749 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:26749 1 OK -0x1.5a2b9c2bc88c9p20 -0x1.b152c65f46cf5p20 0x0.0p0 -0x1.d6ffd464bd7ep6 0x1.9fffffffbf24cp4 0x0.0p0 F +REG esri:26749 2 OK 0x1.2727ce15e445cp21 -0x1.b152c65f46cf5p20 0x0.0p0 -0x1.a85580f097d7bp6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:26749 3 OK -0x1.2b64c487b07e4p20 0x1.c8c76a71ba585p20 0x0.0p0 -0x1.d6ffd464b6ef1p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:26749 4 OK 0x1.0fc46243d83eap21 0x1.c8c76a71ba584p20 0x0.0p0 -0x1.a85580f09e669p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:2675 0 OK 0x1.3c9ebp25 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2675 1 OK 0x1.38624eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2675 2 OK 0x1.40db11007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2675 3 OK 0x1.38624eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2675 4 OK 0x1.40db11007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b1ap6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26750 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:26750 1 OK -0x1.5a2f90ee46f89p20 -0x1.b1566f9becf11p20 0x0.0p0 -0x1.de5529ba12d32p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:26750 2 OK 0x1.2729c877237c4p21 -0x1.b1566f9becf11p20 0x0.0p0 -0x1.afaad645ed2cep6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:26750 3 OK -0x1.2b68541dbed0dp20 0x1.c8cb4669d7272p20 0x0.0p0 -0x1.de5529ba0c443p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:26750 4 OK 0x1.0fc62a0edf686p21 0x1.c8cb4669d7272p20 0x0.0p0 -0x1.afaad645f3bbcp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:26751 0 OK 0x1.e848p20 0x1.51aadd8a552ddp18 0x0.0p0 -0x1.7p6 0x1.1a44444444415p5 0x0.0p0 F +REG esri:26751 1 OK 0x1.3ab5089e9d126p20 -0x1.49874bff3493ep18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110d6p5 0x0.0p0 F +REG esri:26751 2 OK 0x1.4aed7bb0b176dp21 -0x1.49874bff3493ep18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110d6p5 0x0.0p0 F +REG esri:26751 3 OK 0x1.42b09b297b3bp20 0x1.fe7fcfc77ca64p19 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.297777777774dp5 0x0.0p0 F +REG esri:26751 4 OK 0x1.46efb26b42628p21 0x1.fe7fcfc77ca64p19 0x0.0p0 -0x1.66b0943b2adecp6 0x1.297777777774dp5 0x0.0p0 F +REG esri:26752 0 OK 0x1.e848p20 0x1.751cd28cb66c4p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb83p5 0x0.0p0 F +REG esri:26752 1 OK 0x1.2844620ab4c7fp20 -0x1.6bbd325f3bf66p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd4fp4 0x0.0p0 F +REG esri:26752 2 OK 0x1.5425cefaa59cp21 -0x1.6bbd325f3bf66p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd4fp4 0x0.0p0 F +REG esri:26752 3 OK 0x1.317844655986p20 0x1.1a23ed476f36cp20 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888885ep5 0x0.0p0 F +REG esri:26752 4 OK 0x1.4f8bddcd533dp21 0x1.1a23ed476f36cp20 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888885ep5 0x0.0p0 F +REG esri:26753 0 OK 0x1.e848p20 0x1.01e6d748c0a93p18 0x0.0p0 -0x1.a6p6 0x1.407777777775dp5 0x0.0p0 F +REG esri:26753 1 OK 0x1.64118e10826a8p20 -0x1.f88af256c2c36p17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddcp5 0x0.0p0 F +REG esri:26753 2 OK 0x1.363f38f7becacp21 -0x1.f88af256c2c36p17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddcp5 0x0.0p0 F +REG esri:26753 3 OK 0x1.699423d79f16ep20 0x1.859cf2a084871p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fap5 0x0.0p0 F +REG esri:26753 4 OK 0x1.337dee1430749p21 0x1.859cf2a084871p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fap5 0x0.0p0 F +REG esri:26754 0 OK 0x1.e848p20 0x1.54d5548443da7p18 0x0.0p0 -0x1.a6p6 0x1.3655555555536p5 0x0.0p0 F +REG esri:26754 1 OK 0x1.38918a3d8a958p20 -0x1.4b636eba5a8b9p18 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdap5 0x0.0p0 F +REG esri:26754 2 OK 0x1.4bff3ae13ab54p21 -0x1.4b636eba5a8b9p18 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdap5 0x0.0p0 F +REG esri:26754 3 OK 0x1.41cb7b523fa48p20 0x1.01ec048e0627ap20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa92p5 0x0.0p0 F +REG esri:26754 4 OK 0x1.47624256e02dcp21 0x1.01ec048e0627ap20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa92p5 0x0.0p0 F +REG esri:26755 0 OK 0x1.e848p20 0x1.3a17a25a7c1cap18 0x0.0p0 -0x1.a6p6 0x1.2c6666666664p5 0x0.0p0 F +REG esri:26755 1 OK 0x1.46d4cd2855badp20 -0x1.327075f9463abp18 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444415p5 0x0.0p0 F +REG esri:26755 2 OK 0x1.44dd996bd522ap21 -0x1.327075f9463abp18 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444415p5 0x0.0p0 F +REG esri:26755 3 OK 0x1.4e531117350ccp20 0x1.dae2717bef392p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:26755 4 OK 0x1.411e77746579ap21 0x1.dae2717bef392p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:26756 0 OK 0x1.24f8p19 0x1.6fad2114ebc5ap17 0x0.0p0 -0x1.23p6 0x1.4acccccccccb8p5 0x0.0p0 F +REG esri:26756 1 OK 0x1.a600bfeb4828p17 -0x1.69b5d1658f871p17 0x0.0p0 -0x1.28818d3773553p6 0x1.428888888887p5 0x0.0p0 F +REG esri:26756 2 OK 0x1.e06fd0052df6p19 -0x1.69b5d1658f871p17 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.428888888887p5 0x0.0p0 F +REG esri:26756 3 OK 0x1.bd6e82f4b8d62p17 0x1.153a7ae9d467p19 0x0.0p0 -0x1.28818d3773553p6 0x1.53111111111p5 0x0.0p0 F +REG esri:26756 4 OK 0x1.da945f42d1ca8p19 0x1.153a7ae9d467p19 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.53111111111p5 0x0.0p0 F +REG esri:26757 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:26757 1 OK -0x1.614b5b374c4e4p20 -0x1.adf5fd2ece00ep20 0x0.0p0 -0x1.470c0a38e06acp6 0x1.07ffffffa238ep5 0x0.0p0 F +REG esri:26757 2 OK 0x1.2ab7ad9ba627ap21 -0x1.adf5fd2ece00dp20 0x0.0p0 -0x1.14494b1c74eaap6 0x1.07ffffffa238ep5 0x0.0p0 F +REG esri:26757 3 OK -0x1.246a795ad40c5p20 0x1.cc667775e2dcdp20 0x0.0p0 -0x1.470c0a3894519p6 0x1.57ffffff51f56p5 0x0.0p0 F +REG esri:26757 4 OK 0x1.0c473cad6a06ap21 0x1.cc667775e2dcep20 0x0.0p0 -0x1.14494b1cc103dp6 0x1.57ffffff51f56p5 0x0.0p0 F +REG esri:26758 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:26758 1 OK -0x1.5455f1a2cde3p20 -0x1.b410a3f2263bcp20 0x0.0p0 -0x1.59f3301236c33p6 0x1.355555553897bp4 0x0.0p0 F +REG esri:26758 2 OK 0x1.243cf8d166f18p21 -0x1.b410a3f2263bcp20 0x0.0p0 -0x1.2e0ccfedc93cdp6 0x1.355555553897bp4 0x0.0p0 F +REG esri:26758 3 OK -0x1.3127e835aff41p20 0x1.c5bf9d80223edp20 0x0.0p0 -0x1.59f330124d234p6 0x1.d55555551ab68p4 0x0.0p0 F +REG esri:26758 4 OK 0x1.12a5f41ad7fap21 0x1.c5bf9d80223edp20 0x0.0p0 -0x1.2e0ccfedb2dccp6 0x1.d55555551ab68p4 0x0.0p0 F +REG esri:26759 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:26759 1 OK -0x1.5455f1a2cde3p20 -0x1.b410a3f2263bcp20 0x0.0p0 -0x1.5df3301236c33p6 0x1.355555553897bp4 0x0.0p0 F +REG esri:26759 2 OK 0x1.243cf8d166f18p21 -0x1.b410a3f2263bcp20 0x0.0p0 -0x1.320ccfedc93cdp6 0x1.355555553897bp4 0x0.0p0 F +REG esri:26759 3 OK -0x1.3127e835aff41p20 0x1.c5bf9d80223edp20 0x0.0p0 -0x1.5df330124d234p6 0x1.d55555551ab68p4 0x0.0p0 F +REG esri:26759 4 OK 0x1.12a5f41ad7fap21 0x1.c5bf9d80223edp20 0x0.0p0 -0x1.320ccfedb2dccp6 0x1.d55555551ab68p4 0x0.0p0 F +REG esri:2676 0 OK 0x1.443fdp25 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2676 1 OK 0x1.40036eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2676 2 OK 0x1.487c31007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2676 3 OK 0x1.40036eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2676 4 OK 0x1.487c31007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26760 0 OK 0x1.e848p20 0x1.36be34905be6fp18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff5fp4 0x0.0p0 F +REG esri:26760 1 OK 0x1.495f83d321e8p20 -0x1.312bfdcccfd3ep18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff48p4 0x0.0p0 F +REG esri:26760 2 OK 0x1.43983e166f0b7p21 -0x1.312bfdcccfd3ep18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff48p4 0x0.0p0 F +REG esri:26760 3 OK 0x1.4edfc37b6cfcdp20 0x1.d4e49e3559dbfp19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff79p4 0x0.0p0 F +REG esri:26760 4 OK 0x1.40d81e4249811p21 0x1.d4e49e3559dbfp19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG esri:26761 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG esri:26761 1 OK -0x1.4ff83707f969fp20 -0x1.b618f19830d7bp20 0x0.0p0 -0x1.4190cfacb3439p7 0x1.baaaaaaa87f97p3 0x0.0p0 F +REG esri:26761 2 OK 0x1.220e1b83fcb5p21 -0x1.b618f19830d7bp20 0x0.0p0 -0x1.2c6f30534cbc7p7 0x1.baaaaaaa87f97p3 0x0.0p0 F +REG esri:26761 3 OK -0x1.35731591943acp20 0x1.c3734ea28ceb1p20 0x0.0p0 -0x1.4190cfacc234dp7 0x1.7d5555553769ep4 0x0.0p0 F +REG esri:26761 4 OK 0x1.14cb8ac8ca1d6p21 0x1.c3734ea28ceb1p20 0x0.0p0 -0x1.2c6f30533dcb3p7 0x1.7d5555553769ep4 0x0.0p0 F +REG esri:26762 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG esri:26762 1 OK -0x1.5121896d6d1c2p20 -0x1.b58f85fd88743p20 0x0.0p0 -0x1.43ff74a32e46fp7 0x1.eaaaaaaa83204p3 0x0.0p0 F +REG esri:26762 2 OK 0x1.22a2c4b6b68f4p21 -0x1.b58f85fd88742p20 0x0.0p0 -0x1.2eab36077c63fp7 0x1.eaaaaaaa83204p3 0x0.0p0 F +REG esri:26762 3 OK -0x1.345046677a678p20 0x1.c4107059614aep20 0x0.0p0 -0x1.43ff74a33cc3bp7 0x1.9555555531d45p4 0x0.0p0 F +REG esri:26762 4 OK 0x1.143a2333bd34ep21 0x1.c4107059614afp20 0x0.0p0 -0x1.2eab36076de73p7 0x1.9555555531d44p4 0x0.0p0 F +REG esri:26763 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG esri:26763 1 OK -0x1.51cbf57e04c68p20 -0x1.b544af0ca7becp20 0x0.0p0 -0x1.46b9354850b7fp7 0x1.02aaaaaa95631p4 0x0.0p0 F +REG esri:26763 2 OK 0x1.22f7fabf02634p21 -0x1.b544af0ca7becp20 0x0.0p0 -0x1.3146cab7af481p7 0x1.02aaaaaa95631p4 0x0.0p0 F +REG esri:26763 3 OK -0x1.33aec9285a468p20 0x1.c46bb05e74385p20 0x0.0p0 -0x1.46b935485ec8p7 0x1.a2aaaaaa83702p4 0x0.0p0 F +REG esri:26763 4 OK 0x1.13e964942d234p21 0x1.c46bb05e74385p20 0x0.0p0 -0x1.3146cab7a138p7 0x1.a2aaaaaa83702p4 0x0.0p0 F +REG esri:26764 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG esri:26764 1 OK -0x1.525384cf7ea7fp20 -0x1.b506243aa85fp20 0x0.0p0 -0x1.49c5d1c731158p7 0x1.0d5555553ebc5p4 0x0.0p0 F +REG esri:26764 2 OK 0x1.233bc267bf54p21 -0x1.b506243aa85fp20 0x0.0p0 -0x1.343a2e38ceea8p7 0x1.0d5555553ebc5p4 0x0.0p0 F +REG esri:26764 3 OK -0x1.332a35bd68f68p20 0x1.c4b33f61fc159p20 0x0.0p0 -0x1.49c5d1c73eb69p7 0x1.ad5555552ac15p4 0x0.0p0 F +REG esri:26764 4 OK 0x1.13a71adeb47b4p21 0x1.c4b33f61fc159p20 0x0.0p0 -0x1.343a2e38c1497p7 0x1.ad5555552ac15p4 0x0.0p0 F +REG esri:26765 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG esri:26765 1 OK -0x1.5232b04718efdp20 -0x1.b516f2f828dd1p20 0x0.0p0 -0x1.4b17f4409c2dfp7 0x1.0aaaaaaa9468dp4 0x0.0p0 F +REG esri:26765 2 OK 0x1.232b58238c77ep21 -0x1.b516f2f828dd1p20 0x0.0p0 -0x1.3592b66a0e7cfp7 0x1.0aaaaaaa9468dp4 0x0.0p0 F +REG esri:26765 3 OK -0x1.334c91d7b4ffdp20 0x1.c4a2755ac607ep20 0x0.0p0 -0x1.4b17f440a9ecdp7 0x1.aaaaaaaa80f58p4 0x0.0p0 F +REG esri:26765 4 OK 0x1.13b848ebda7fep21 0x1.c4a2755ac607ep20 0x0.0p0 -0x1.3592b66a00be1p7 0x1.aaaaaaaa80f58p4 0x0.0p0 F +REG esri:26766 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26766 1 OK -0x1.593ecd99af288p20 -0x1.b1c1f9326430ep20 0x0.0p0 -0x1.5fc2bbc1b8814p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG esri:26766 2 OK 0x1.26b166ccd794dp21 -0x1.b1c1f9326430dp20 0x0.0p0 -0x1.319299939cd42p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG esri:26766 3 OK -0x1.2c4ddc2440fb2p20 0x1.c84d3a0d6c8d7p20 0x0.0p0 -0x1.5fc2bbc1b8149p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG esri:26766 4 OK 0x1.1038ee12207e2p21 0x1.c84d3a0d6c8d8p20 0x0.0p0 -0x1.319299939d40dp6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG esri:26767 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26767 1 OK -0x1.593ecd99af29ap20 -0x1.b1c1f9326430dp20 0x0.0p0 -0x1.67c2bbc1b8815p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG esri:26767 2 OK 0x1.26b166ccd7944p21 -0x1.b1c1f9326430ep20 0x0.0p0 -0x1.399299939cd42p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG esri:26767 3 OK -0x1.2c4ddc2440fc3p20 0x1.c84d3a0d6c8d8p20 0x0.0p0 -0x1.67c2bbc1b8149p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG esri:26767 4 OK 0x1.1038ee12207d9p21 0x1.c84d3a0d6c8d7p20 0x0.0p0 -0x1.399299939d40dp6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG esri:26768 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:26768 1 OK -0x1.6582dfae4e996p20 -0x1.abd16c8807accp20 0x0.0p0 -0x1.db708506b142p6 0x1.25555554adcd3p5 0x0.0p0 F +REG esri:26768 2 OK 0x1.2cd36fd7274cbp21 -0x1.abd16c8807accp20 0x0.0p0 -0x1.a5e4d04ea413cp6 0x1.25555554adcd3p5 0x0.0p0 F +REG esri:26768 3 OK -0x1.2024aab105942p20 0x1.ce72bb12d86c4p20 0x0.0p0 -0x1.db70850623abap6 0x1.75555554471d5p5 0x0.0p0 F +REG esri:26768 4 OK 0x1.0a24555882ca1p21 0x1.ce72bb12d86c4p20 0x0.0p0 -0x1.a5e4d04f31aap6 0x1.75555554471d5p5 0x0.0p0 F +REG esri:26769 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:26769 1 OK -0x1.6582dfae4e986p20 -0x1.abd16c8807acep20 0x0.0p0 -0x1.e2c5da5c06973p6 0x1.25555554adcd3p5 0x0.0p0 F +REG esri:26769 2 OK 0x1.2cd36fd7274cbp21 -0x1.abd16c8807accp20 0x0.0p0 -0x1.ad3a25a3f968fp6 0x1.25555554adcd3p5 0x0.0p0 F +REG esri:26769 3 OK -0x1.2024aab105934p20 0x1.ce72bb12d86c3p20 0x0.0p0 -0x1.e2c5da5b7900cp6 0x1.75555554471d5p5 0x0.0p0 F +REG esri:26769 4 OK 0x1.0a24555882ca1p21 0x1.ce72bb12d86c4p20 0x0.0p0 -0x1.ad3a25a486ff3p6 0x1.75555554471d5p5 0x0.0p0 F +REG esri:2677 0 OK 0x1.4be0fp25 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2677 1 OK 0x1.47a48eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2677 2 OK 0x1.501d51007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2677 3 OK 0x1.47a48eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e6p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2677 4 OK 0x1.501d51007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26770 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:26770 1 OK -0x1.658127a3bbd87p20 -0x1.abcfe3fc5bff2p20 0x0.0p0 -0x1.e9c5da5c06972p6 0x1.25555554adcd3p5 0x0.0p0 F +REG esri:26770 2 OK 0x1.2cd293d1ddec4p21 -0x1.abcfe3fc5bff2p20 0x0.0p0 -0x1.b43a25a3f968fp6 0x1.25555554adcd3p5 0x0.0p0 F +REG esri:26770 3 OK -0x1.2023324c89bfp20 0x1.ce7112c0ca095p20 0x0.0p0 -0x1.e9c5da5b7900cp6 0x1.75555554471d5p5 0x0.0p0 F +REG esri:26770 4 OK 0x1.0a23992644df8p21 0x1.ce7112c0ca095p20 0x0.0p0 -0x1.b43a25a486ff4p6 0x1.75555554471d5p5 0x0.0p0 F +REG esri:26771 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG esri:26771 1 OK -0x1.5fd807e9ee9eap20 -0x1.aea87df00f40ep20 0x0.0p0 -0x1.7a44648b879a6p6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG esri:26771 2 OK 0x1.29fe03f4f74edp21 -0x1.aea87df00f41p20 0x0.0p0 -0x1.4866461f23105p6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG esri:26771 3 OK -0x1.25d80eff720e9p20 0x1.cbacaed185263p20 0x0.0p0 -0x1.7a44648b4d3d2p6 0x1.4d555554c1c21p5 0x0.0p0 F +REG esri:26771 4 OK 0x1.0cfe077fb906dp21 0x1.cbacaed185263p20 0x0.0p0 -0x1.4866461f5d6d8p6 0x1.4d555554c1c21p5 0x0.0p0 F +REG esri:26772 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG esri:26772 1 OK -0x1.5fd3e7e68339bp20 -0x1.aea4be4f950efp20 0x0.0p0 -0x1.8199b9e0dcefbp6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG esri:26772 2 OK 0x1.29fbf3f3419d6p21 -0x1.aea4be4f950eep20 0x0.0p0 -0x1.4fbb9b747865bp6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG esri:26772 3 OK -0x1.25d470397621ep20 0x1.cba8ae88f4a5ep20 0x0.0p0 -0x1.8199b9e0a2928p6 0x1.4d555554c1c21p5 0x0.0p0 F +REG esri:26772 4 OK 0x1.0cfc381cbb116p21 0x1.cba8ae88f4a5ep20 0x0.0p0 -0x1.4fbb9b74b2c2ep6 0x1.4d555554c1c21p5 0x0.0p0 F +REG esri:26773 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:26773 1 OK -0x1.60bc2307a7fabp20 -0x1.ae379e6b7d9c9p20 0x0.0p0 -0x1.6fe04911dfa77p6 0x1.03ffffffa954bp5 0x0.0p0 F +REG esri:26773 2 OK 0x1.2a701183d3fdep21 -0x1.ae379e6b7d9c8p20 0x0.0p0 -0x1.3d750c4375adfp6 0x1.03ffffffa954ap5 0x0.0p0 F +REG esri:26773 3 OK -0x1.24f2ffcf5e8fp20 0x1.cc1dd6defe308p20 0x0.0p0 -0x1.6fe049119a84cp6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG esri:26773 4 OK 0x1.0c8b7fe7af48p21 0x1.cc1dd6defe309p20 0x0.0p0 -0x1.3d750c43bad0ap6 0x1.53ffffff5c59p5 0x0.0p0 F +REG esri:26774 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:26774 1 OK -0x1.60bc2307a7fabp20 -0x1.ae379e6b7d9c9p20 0x0.0p0 -0x1.758af3bc8a52p6 0x1.03ffffffa954bp5 0x0.0p0 F +REG esri:26774 2 OK 0x1.2a701183d3fd6p21 -0x1.ae379e6b7d9c9p20 0x0.0p0 -0x1.431fb6ee2058ap6 0x1.03ffffffa954bp5 0x0.0p0 F +REG esri:26774 3 OK -0x1.24f2ffcf5e8fp20 0x1.cc1dd6defe308p20 0x0.0p0 -0x1.758af3bc452f5p6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG esri:26774 4 OK 0x1.0c8b7fe7af478p21 0x1.cc1dd6defe308p20 0x0.0p0 -0x1.431fb6ee657b5p6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG esri:26775 0 OK 0x1.e848p20 0x1.3a5b60e00d335p18 0x0.0p0 -0x1.76p6 0x1.53111111111p5 0x0.0p0 F +REG esri:26775 1 OK 0x1.4617b90fd6aeap20 -0x1.313a445dff91ap18 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed6p5 0x0.0p0 F +REG esri:26775 2 OK 0x1.453c237814a8bp21 -0x1.313a445dff91ap18 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed6p5 0x0.0p0 F +REG esri:26775 3 OK 0x1.4efc8fe7095f7p20 0x1.dbf2b454b7bc6p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333327p5 0x0.0p0 F +REG esri:26775 4 OK 0x1.40c9b80c7b504p21 0x1.dbf2b454b7bc6p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333327p5 0x0.0p0 F +REG esri:26776 0 OK 0x1.e848p20 0x1.3d3df78f17a19p18 0x0.0p0 -0x1.76p6 0x1.4722222222209p5 0x0.0p0 F +REG esri:26776 1 OK 0x1.44c2c089fe7c9p20 -0x1.346ca62803d8dp18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddbfp5 0x0.0p0 F +REG esri:26776 2 OK 0x1.45e69fbb00c14p21 -0x1.346ca62803d8dp18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddbfp5 0x0.0p0 F +REG esri:26776 3 OK 0x1.4d5d6efeaf34cp20 0x1.e0236a698db55p19 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666652p5 0x0.0p0 F +REG esri:26776 4 OK 0x1.41994880a8652p21 0x1.e0236a698db55p19 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666652p5 0x0.0p0 F +REG esri:26777 0 OK 0x1.e848p20 0x1.01db5a08c1ff5p18 0x0.0p0 -0x1.88p6 0x1.387777777775ap5 0x0.0p0 F +REG esri:26777 1 OK 0x1.642bf4c50dab3p20 -0x1.f8dae63281a1ep17 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbbp5 0x0.0p0 F +REG esri:26777 2 OK 0x1.3632059d7929ep21 -0x1.f8dae63281a1ep17 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbbp5 0x0.0p0 F +REG esri:26777 3 OK 0x1.697d3e5933dcep20 0x1.8573fe5c6816cp19 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f7p5 0x0.0p0 F +REG esri:26777 4 OK 0x1.338960d366112p21 0x1.8573fe5c6816cp19 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f7p5 0x0.0p0 F +REG esri:26778 0 OK 0x1.e848p20 0x1.51ccec4897d68p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeecap5 0x0.0p0 F +REG esri:26778 1 OK 0x1.3a5562add16aap20 -0x1.48ea72bd968d2p18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb88p5 0x0.0p0 F +REG esri:26778 2 OK 0x1.4b1d4ea9174b2p21 -0x1.48ea72bd968d2p18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb88p5 0x0.0p0 F +REG esri:26778 3 OK 0x1.43064e7e00032p20 0x1.ff09be4f390a1p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222206p5 0x0.0p0 F +REG esri:26778 4 OK 0x1.46c4d8c0fffefp21 0x1.ff09be4f390a1p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222206p5 0x0.0p0 F +REG esri:26779 0 OK 0x1.e848p20 0x1.04c96de11ecfap18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbdp5 0x0.0p0 F +REG esri:26779 1 OK 0x1.62b43264b9cap20 -0x1.fec9958f34825p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221f9p5 0x0.0p0 F +REG esri:26779 2 OK 0x1.36ede6cda31bp21 -0x1.fec9958f34825p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221f9p5 0x0.0p0 F +REG esri:26779 3 OK 0x1.67fdab3052dc5p20 0x1.89d4eec3dac72p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999997ep5 0x0.0p0 F +REG esri:26779 4 OK 0x1.34492a67d691ep21 0x1.89d4eec3dac72p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999997ep5 0x0.0p0 F +REG esri:2678 0 OK 0x1.53821p25 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2678 1 OK 0x1.4f45aeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2678 2 OK 0x1.57be71007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2678 3 OK 0x1.4f45aeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2678 4 OK 0x1.57be71007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26780 0 OK 0x1.e848p20 0x1.1c6f660c1ac1dp18 0x0.0p0 -0x1.57p6 0x1.29111111110ebp5 0x0.0p0 F +REG esri:26780 1 OK 0x1.566f8985a2c8ap20 -0x1.1644bd7817a9dp18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c44444444415p5 0x0.0p0 F +REG esri:26780 2 OK 0x1.3d103b3d2e9b3p21 -0x1.1644bd7817a9dp18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c44444444415p5 0x0.0p0 F +REG esri:26780 3 OK 0x1.5c7a75357d8f8p20 0x1.adb02ce725403p19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbdp5 0x0.0p0 F +REG esri:26780 4 OK 0x1.3a0ac5654137cp21 0x1.adb02ce725403p19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbdp5 0x0.0p0 F +REG esri:26781 0 OK 0x1.e848p20 0x1.63387839c1e63p18 0x0.0p0 -0x1.72p6 0x1.faaaaaaaaaa1ep4 0x0.0p0 F +REG esri:26781 1 OK 0x1.31f5603f1f5bcp20 -0x1.5b64548ad4f4ep18 0x0.0p0 -0x1.7b66402708f87p6 0x1.daaaaaaaaaa08p4 0x0.0p0 F +REG esri:26781 2 OK 0x1.4f4d4fe070519p21 -0x1.5b64548ad4f4ep18 0x0.0p0 -0x1.6899bfd8f7079p6 0x1.daaaaaaaaaa08p4 0x0.0p0 F +REG esri:26781 3 OK 0x1.39a96b57f9fbep20 0x1.0c5ba7a58dd75p20 0x0.0p0 -0x1.7b66402708f87p6 0x1.0d55555555518p5 0x0.0p0 F +REG esri:26781 4 OK 0x1.4b734a5403018p21 0x1.0c5ba7a58dd75p20 0x0.0p0 -0x1.6899bfd8f7079p6 0x1.0d55555555518p5 0x0.0p0 F +REG esri:26782 0 OK 0x1.e848p20 0x1.690a633037d0bp18 0x0.0p0 -0x1.6d55555555555p6 0x1.daeeeeeeeee47p4 0x0.0p0 F +REG esri:26782 1 OK 0x1.2f297a9824947p20 -0x1.61921e205c011p18 0x0.0p0 -0x1.76b1f683c31b1p6 0x1.ba666666665a4p4 0x0.0p0 F +REG esri:26782 2 OK 0x1.50b342b3edb5cp21 -0x1.61921e205c011p18 0x0.0p0 -0x1.63f8b426e78f9p6 0x1.ba666666665a4p4 0x0.0p0 F +REG esri:26782 3 OK 0x1.36897f546ccefp20 0x1.10a3d676f15f4p20 0x0.0p0 -0x1.76b1f683c31b1p6 0x1.fb777777776eap4 0x0.0p0 F +REG esri:26782 4 OK 0x1.4d034055c9988p21 0x1.10a3d676f15f4p20 0x0.0p0 -0x1.63f8b426e78f9p6 0x1.fb777777776eap4 0x0.0p0 F +REG esri:26783 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5eaaaaaaaaaacp5 0x0.0p0 F +REG esri:26783 1 OK -0x1.68372dfd9f5fep20 -0x1.aa650e476e851p20 0x0.0p0 -0x1.2db9bac64d549p6 0x1.36aaaaa9beeb5p5 0x0.0p0 F +REG esri:26783 2 OK 0x1.2e2d96fecfaffp21 -0x1.aa650e476e851p20 0x0.0p0 -0x1.ec8c8a736556ep5 0x1.36aaaaa9beeb5p5 0x0.0p0 F +REG esri:26783 3 OK -0x1.1d5dd00608d03p20 0x1.cfba0b5b637ddp20 0x0.0p0 -0x1.2db9bac5889c8p6 0x1.86aaaaa94f70ap5 0x0.0p0 F +REG esri:26783 4 OK 0x1.08c0e80304682p21 0x1.cfba0b5b637ddp20 0x0.0p0 -0x1.ec8c8a74eec7p5 0x1.86aaaaa94f70ap5 0x0.0p0 F +REG esri:26784 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG esri:26784 1 OK -0x1.66f773d09904cp20 -0x1.ab16244da006ap20 0x0.0p0 -0x1.33f07961a4db4p6 0x1.2eaaaaa9e1404p5 0x0.0p0 F +REG esri:26784 2 OK 0x1.2d8db9e84c82ep21 -0x1.ab16244da0069p20 0x0.0p0 -0x1.fac9b7e760f43p5 0x1.2eaaaaa9e1404p5 0x0.0p0 F +REG esri:26784 3 OK -0x1.1eb10dec9923cp20 0x1.cf2660ce54bb8p20 0x0.0p0 -0x1.33f07960fb83dp6 0x1.7eaaaaa97521p5 0x0.0p0 F +REG esri:26784 4 OK 0x1.096a86f64c925p21 0x1.cf2660ce54bb9p20 0x0.0p0 -0x1.fac9b7e8b3a3p5 0x1.7eaaaaa97521p5 0x0.0p0 F +REG esri:26785 0 OK 0x1.86a0000000002p19 0x1.1f79bc1a87b06p18 0x0.0p0 -0x1.34p6 0x1.3522222222203p5 0x0.0p0 F +REG esri:26785 1 OK 0x1.7dd5c3fcb533p17 -0x1.18d0d3f90ecfdp18 0x0.0p0 -0x1.3c477eb6c7662p6 0x1.283333333330dp5 0x0.0p0 F +REG esri:26785 2 OK 0x1.56e54780695acp20 -0x1.18d0d3f90ecfdp18 0x0.0p0 -0x1.2bb881493899ep6 0x1.283333333330dp5 0x0.0p0 F +REG esri:26785 3 OK 0x1.b1fb73fee205cp17 0x1.b279ef89d26bdp19 0x0.0p0 -0x1.3c477eb6c7662p6 0x1.42111111110f5p5 0x0.0p0 F +REG esri:26785 4 OK 0x1.5060918023c06p20 0x1.b279ef89d26bdp19 0x0.0p0 -0x1.2bb881493899ep6 0x1.42111111110f5p5 0x0.0p0 F +REG esri:26786 0 OK 0x1.24f8p19 0x1.2b82a89279426p18 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba6p5 0x0.0p0 F +REG esri:26786 1 OK -0x1.f2465062511cp14 -0x1.2362130d718ebp18 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.4144444444429p5 0x0.0p0 F +REG esri:26786 2 OK 0x1.2cc1194189447p20 -0x1.2362130d718ebp18 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.4144444444429p5 0x0.0p0 F +REG esri:26786 3 OK 0x1.30b978f9108p9 0x1.c5335007a71ap19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333325p5 0x0.0p0 F +REG esri:26786 4 OK 0x1.24d1e8d0e0ddfp20 0x1.c5335007a71ap19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333325p5 0x0.0p0 F +REG esri:26787 0 OK 0x1.86ap17 0x1.57f46d9b83858p16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed8p5 0x0.0p0 F +REG esri:26787 1 OK -0x1.4ea5f7be44d94p17 -0x1.0b0b0df40216p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG esri:26787 2 OK 0x1.16f97def91365p19 -0x1.0b0b0df40216p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed6p5 0x0.0p0 F +REG esri:26787 3 OK -0x1.38cee5449abaep17 0x1.bc8c8cca2b22dp18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG esri:26787 4 OK 0x1.1183b95126aecp19 0x1.bc8c8cca2b22dp18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG esri:26788 0 OK 0x1.e848000000002p20 0x1.9982de69daefbp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776cp5 0x0.0p0 F +REG esri:26788 1 OK 0x1.125fe5a5ccd7p20 -0x1.87ca005f78662p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d111111110ffp5 0x0.0p0 F +REG esri:26788 2 OK 0x1.5f180d2d19943p21 -0x1.87ca005f78662p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d111111110ffp5 0x0.0p0 F +REG esri:26788 3 OK 0x1.23752e68162dcp20 0x1.374e60c4f7b3fp20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd515p5 0x0.0p0 F +REG esri:26788 4 OK 0x1.568d68cbf4e8ep21 0x1.374e60c4f7b3fp20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd515p5 0x0.0p0 F +REG esri:26789 0 OK 0x1.e848000000002p20 0x1.a841d8c5c72eap18 0x0.0p0 -0x1.5155555555555p6 0x1.6411111111106p5 0x0.0p0 F +REG esri:26789 1 OK 0x1.0abf4ccde6845p20 -0x1.9627a33b6b58ap18 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.50fffffffffedp5 0x0.0p0 F +REG esri:26789 2 OK 0x1.62e859990cbep21 -0x1.9627a33b6b58ap18 0x0.0p0 -0x1.43f7235fee391p6 0x1.50fffffffffedp5 0x0.0p0 F +REG esri:26789 3 OK 0x1.1c3a41c3095e9p20 0x1.427605f0243d5p20 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.7722222222219p5 0x0.0p0 F +REG esri:26789 4 OK 0x1.5a2adf1e7b50ep21 0x1.427605f0243d5p20 0x0.0p0 -0x1.43f7235fee391p6 0x1.7722222222219p5 0x0.0p0 F +REG esri:2679 0 OK 0x1.5b233p25 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2679 1 OK 0x1.56e6ceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2679 2 OK 0x1.5f5f91007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2679 3 OK 0x1.56e6ceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2679 4 OK 0x1.5f5f91007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26790 0 OK 0x1.e848000000002p20 0x1.818963ac00db5p18 0x0.0p0 -0x1.5155555555555p6 0x1.54aaaaaaaaa97p5 0x0.0p0 F +REG esri:26790 1 OK 0x1.201b023fdd6b6p20 -0x1.73a4678556d41p18 0x0.0p0 -0x1.5d1a9f6347bf8p6 0x1.435555555553cp5 0x0.0p0 F +REG esri:26790 2 OK 0x1.583a7ee0114a7p21 -0x1.73a4678556d41p18 0x0.0p0 -0x1.45900b4762eb2p6 0x1.435555555553cp5 0x0.0p0 F +REG esri:26790 3 OK 0x1.2d94b22cf8f08p20 0x1.247a247970dfdp20 0x0.0p0 -0x1.5d1a9f6347bf8p6 0x1.65ffffffffffp5 0x0.0p0 F +REG esri:26790 4 OK 0x1.517da6e98387ep21 0x1.247a247970dfdp20 0x0.0p0 -0x1.45900b4762eb2p6 0x1.65ffffffffffp5 0x0.0p0 F +REG esri:26791 0 OK 0x1.e848p20 0x1.7befb045a410ap18 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887ec4p5 0x0.0p0 F +REG esri:26791 1 OK 0x1.22024e946370ap20 -0x1.6bcdef382033ap18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:26791 2 OK 0x1.5746d8b5ce47bp21 -0x1.6bcdef382033ap18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:26791 3 OK 0x1.318c6e2fd8f3fp20 0x1.20c087a00bbb5p20 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d999999992afp5 0x0.0p0 F +REG esri:26791 4 OK 0x1.4f81c8e81386p21 0x1.20c087a00bbb5p20 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d999999992afp5 0x0.0p0 F +REG esri:26792 0 OK 0x1.e848p20 0x1.6d013d8ac984ep18 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG esri:26792 1 OK 0x1.2a6bd672506f6p20 -0x1.5eee96e606b48p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fccccccccccp5 0x0.0p0 F +REG esri:26792 2 OK 0x1.531214c6d7c85p21 -0x1.5eee96e606b48p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fccccccccccp5 0x0.0p0 F +REG esri:26792 3 OK 0x1.3806d6080da2p20 0x1.1517874ad65d2p20 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999096p5 0x0.0p0 F +REG esri:26792 4 OK 0x1.4c4494fbf92fp21 0x1.1517874ad65d2p20 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999096p5 0x0.0p0 F +REG esri:26793 0 OK 0x1.e848p20 0x1.8a8e84618f13ep18 0x0.0p0 -0x1.78p6 0x1.60ddddddddddp5 0x0.0p0 F +REG esri:26793 1 OK 0x1.1ae9a10cc4e2ap20 -0x1.7b2964a8c553bp18 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220dp5 0x0.0p0 F +REG esri:26793 2 OK 0x1.5ad32f799d8f2p21 -0x1.7b2964a8c553bp18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220dp5 0x0.0p0 F +REG esri:26793 3 OK 0x1.29d0423ae53bp20 0x1.2b922d320555fp20 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999991p5 0x0.0p0 F +REG esri:26793 4 OK 0x1.535fdee28d62ep21 0x1.2b922d320555fp20 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999991p5 0x0.0p0 F +REG esri:26794 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.daaaaaaaaaaadp4 0x0.0p0 F +REG esri:26794 1 OK -0x1.58f814ec7cc78p20 -0x1.b1ed1cd51b728p20 0x0.0p0 -0x1.7a59b545bae7bp6 0x1.8aaaaaaa74adp4 0x0.0p0 F +REG esri:26794 2 OK 0x1.268e0a763e644p21 -0x1.b1ed1cd51b726p20 0x0.0p0 -0x1.4c50f564efc2fp6 0x1.8aaaaaaa74adp4 0x0.0p0 F +REG esri:26794 3 OK -0x1.2ca0f5646070fp20 0x1.c82bee98dd299p20 0x0.0p0 -0x1.7a59b545bc5d4p6 0x1.1555555519b31p5 0x0.0p0 F +REG esri:26794 4 OK 0x1.10627ab23039p21 0x1.c82bee98dd29ap20 0x0.0p0 -0x1.4c50f564ee4d6p6 0x1.1555555519b31p5 0x0.0p0 F +REG esri:26795 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.e8p4 0x0.0p0 F +REG esri:26795 1 OK -0x1.59b985bea748ap20 -0x1.b18f43f2e06fcp20 0x0.0p0 -0x1.808b909db4109p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG esri:26795 2 OK 0x1.26eec2df53a3cp21 -0x1.b18f43f2e06fcp20 0x0.0p0 -0x1.521f1a0cf69a2p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG esri:26795 3 OK -0x1.2bde5e17d0e48p20 0x1.c88edecc46b84p20 0x0.0p0 -0x1.808b909db0aa7p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG esri:26795 4 OK 0x1.10012f0be871cp21 0x1.c88edecc46b82p20 0x0.0p0 -0x1.521f1a0cfa004p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG esri:26796 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:26796 1 OK -0x1.5ef296905e6cdp20 -0x1.af10d9f789166p20 0x0.0p0 -0x1.82ab5906e69dcp6 0x1.ed555554cfd06p4 0x0.0p0 F +REG esri:26796 2 OK 0x1.298b4b482f366p21 -0x1.af10d9f789166p20 0x0.0p0 -0x1.5154a6f919625p6 0x1.ed555554cfd06p4 0x0.0p0 F +REG esri:26796 3 OK -0x1.26b2ab80b2098p20 0x1.cb3765bb101f2p20 0x0.0p0 -0x1.82ab5906b6119p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG esri:26796 4 OK 0x1.0d6b55c05904cp21 0x1.cb3765bb101f2p20 0x0.0p0 -0x1.5154a6f949ee8p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG esri:26797 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:26797 1 OK -0x1.5ef296905e6cdp20 -0x1.af10d9f789166p20 0x0.0p0 -0x1.8aab5906e69dbp6 0x1.ed555554cfd06p4 0x0.0p0 F +REG esri:26797 2 OK 0x1.298b4b482f366p21 -0x1.af10d9f789166p20 0x0.0p0 -0x1.5954a6f919624p6 0x1.ed555554cfd06p4 0x0.0p0 F +REG esri:26797 3 OK -0x1.26b2ab80b2098p20 0x1.cb3765bb101f2p20 0x0.0p0 -0x1.8aab5906b6118p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG esri:26797 4 OK 0x1.0d6b55c05904cp21 0x1.cb3765bb101f2p20 0x0.0p0 -0x1.5954a6f949ee8p6 0x1.46aaaaaa25ba6p5 0x0.0p0 F +REG esri:26798 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG esri:26798 1 OK -0x1.5f4cbea887e4dp20 -0x1.aee67c6800ad6p20 0x0.0p0 -0x1.92c619320982fp6 0x1.f2aaaaaa1e07cp4 0x0.0p0 F +REG esri:26798 2 OK 0x1.29b85f5443f26p21 -0x1.aee67c6800ad6p20 0x0.0p0 -0x1.6139e6cdf67d1p6 0x1.f2aaaaaa1e07cp4 0x0.0p0 F +REG esri:26798 3 OK -0x1.265ae2ddf2c0fp20 0x1.cb6511ca3142p20 0x0.0p0 -0x1.92c61931d5255p6 0x1.49555554cab49p5 0x0.0p0 F +REG esri:26798 4 OK 0x1.0d3f716ef9608p21 0x1.cb6511ca3142p20 0x0.0p0 -0x1.6139e6ce2adabp6 0x1.49555554cab49p5 0x0.0p0 F +REG esri:2680 0 OK 0x1.62c45p25 0x0.0p0 0x0.0p0 0x1.14p7 0x0.0p0 0x0.0p0 T +REG esri:2680 1 OK 0x1.5e87eeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2680 2 OK 0x1.6700b1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2680 3 OK 0x1.5e87eeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2680 4 OK 0x1.6700b1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26801 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 0x0.0p0 F +REG esri:26801 1 OK -0x1.65533eecb5516p20 -0x1.abef867771c0dp20 0x0.0p0 -0x1.695eda12c9f02p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG esri:26801 2 OK 0x1.2cbb9f765aa93p21 -0x1.abef867771c0cp20 0x0.0p0 -0x1.33f67b428b653p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG esri:26801 3 OK -0x1.205c7c810e26dp20 0x1.ce5dd09da9d7dp20 0x0.0p0 -0x1.695eda123ffe3p6 0x1.73fffffef7047p5 0x0.0p0 F +REG esri:26801 4 OK 0x1.0a403e408713ep21 0x1.ce5dd09da9d7ep20 0x0.0p0 -0x1.33f67b4315573p6 0x1.73fffffef7047p5 0x0.0p0 F +REG esri:26802 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.57p6 0x1.4cp5 0x0.0p0 F +REG esri:26802 1 OK -0x1.654f12a9c8392p20 -0x1.abebcce031152p20 0x0.0p0 -0x1.71b42f681f458p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG esri:26802 2 OK 0x1.2cb98954e41cp21 -0x1.abebcce031154p20 0x0.0p0 -0x1.3c4bd097e0ba9p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG esri:26802 3 OK -0x1.2058e9eb215b1p20 0x1.ce59ca4d145dp20 0x0.0p0 -0x1.71b42f6795538p6 0x1.73fffffef7047p5 0x0.0p0 F +REG esri:26802 4 OK 0x1.0a3e74f590ad2p21 0x1.ce59ca4d145cfp20 0x0.0p0 -0x1.3c4bd0986aac8p6 0x1.73fffffef7047p5 0x0.0p0 F +REG esri:26803 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.63p6 0x1.4cp5 0x0.0p0 F +REG esri:26803 1 OK -0x1.654f12a9c8392p20 -0x1.abebcce031152p20 0x0.0p0 -0x1.7db42f681f458p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG esri:26803 2 OK 0x1.2cb98954e41c9p21 -0x1.abebcce031152p20 0x0.0p0 -0x1.484bd097e0ba8p6 0x1.23ffffff5cd37p5 0x0.0p0 F +REG esri:26803 3 OK -0x1.2058e9eb215b1p20 0x1.ce59ca4d145dp20 0x0.0p0 -0x1.7db42f6795539p6 0x1.73fffffef7047p5 0x0.0p0 F +REG esri:26803 4 OK 0x1.0a3e74f590ad8p21 0x1.ce59ca4d145dp20 0x0.0p0 -0x1.484bd0986aac7p6 0x1.73fffffef7047p5 0x0.0p0 F +REG esri:2681 0 OK 0x1.6a657p25 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:2681 1 OK 0x1.66290eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2681 2 OK 0x1.6ea1d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2681 3 OK 0x1.66290eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2681 4 OK 0x1.6ea1d1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26811 0 OK 0x1.e848p20 0x1.9986df9d60d75p18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG esri:26811 1 OK 0x1.125dce232f068p20 -0x1.87cdd5350c7fbp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111101p5 0x0.0p0 F +REG esri:26811 2 OK 0x1.5f1918ee687c5p21 -0x1.87cdd5350c7fbp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111101p5 0x0.0p0 F +REG esri:26811 3 OK 0x1.237341a9e14b8p20 0x1.37516c1de4a2fp20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd515p5 0x0.0p0 F +REG esri:26811 4 OK 0x1.568e5f2b0f59dp21 0x1.37516c1de4a2fp20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd515p5 0x0.0p0 F +REG esri:26812 0 OK 0x1.e848p20 0x1.a845fee3dc055p18 0x0.0p0 -0x1.5155555555555p6 0x1.6411111111106p5 0x0.0p0 F +REG esri:26812 1 OK 0x1.0abd2233014p20 -0x1.962b9c07dcdep18 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.50fffffffffedp5 0x0.0p0 F +REG esri:26812 2 OK 0x1.62e96ee67f6p21 -0x1.962b9c07dcdep18 0x0.0p0 -0x1.43f7235fee391p6 0x1.50fffffffffedp5 0x0.0p0 F +REG esri:26812 3 OK 0x1.1c3842eb15ec3p20 0x1.42792d3619a6fp20 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.7722222222219p5 0x0.0p0 F +REG esri:26812 4 OK 0x1.5a2bde8a7509ep21 0x1.42792d3619a6fp20 0x0.0p0 -0x1.43f7235fee391p6 0x1.7722222222219p5 0x0.0p0 F +REG esri:26813 0 OK 0x1.e848p20 0x1.818d28da7bcbdp18 0x0.0p0 -0x1.5155555555555p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG esri:26813 1 OK 0x1.20190d1d3fd88p20 -0x1.73a809eafcd9ap18 0x0.0p0 -0x1.5d1a9f6347bf8p6 0x1.435555555553cp5 0x0.0p0 F +REG esri:26813 2 OK 0x1.583b79716013cp21 -0x1.73a809eafcd9ap18 0x0.0p0 -0x1.45900b4762eb2p6 0x1.435555555553cp5 0x0.0p0 F +REG esri:26813 3 OK 0x1.2d92dec69057ap20 0x1.247d00af03a2p20 0x0.0p0 -0x1.5d1a9f6347bf8p6 0x1.65fffffffffefp5 0x0.0p0 F +REG esri:26813 4 OK 0x1.517e909cb7d43p21 0x1.247d00af03a2p20 0x0.0p0 -0x1.45900b4762eb2p6 0x1.65fffffffffefp5 0x0.0p0 F +REG esri:2682 0 OK 0x1.72069p25 0x0.0p0 0x0.0p0 0x1.2p7 0x0.0p0 0x0.0p0 T +REG esri:2682 1 OK 0x1.6dca2eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2682 2 OK 0x1.7642f1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2682 3 OK 0x1.6dca2eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2682 4 OK 0x1.7642f1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2683 0 OK 0x1.79a7bp25 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:2683 1 OK 0x1.756b4eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2683 2 OK 0x1.7de411007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2683 3 OK 0x1.756b4eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2683 4 OK 0x1.7de411007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2684 0 OK 0x1.8148dp25 0x0.0p0 0x0.0p0 0x1.2cp7 0x0.0p0 0x0.0p0 T +REG esri:2684 1 OK 0x1.7d0c6eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2684 2 OK 0x1.858531007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2684 3 OK 0x1.7d0c6eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2684 4 OK 0x1.858531007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2685 0 OK 0x1.88e9fp25 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:2685 1 OK 0x1.84ad8eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2685 2 OK 0x1.8d2651007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2685 3 OK 0x1.84ad8eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2685 4 OK 0x1.8d2651007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2686 0 OK 0x1.908b1p25 0x0.0p0 0x0.0p0 0x1.38p7 0x0.0p0 0x0.0p0 T +REG esri:2686 1 OK 0x1.8c4eaeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2686 2 OK 0x1.94c771007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2686 3 OK 0x1.8c4eaeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2686 4 OK 0x1.94c771007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2687 0 OK 0x1.982c3p25 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:2687 1 OK 0x1.93efceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2687 2 OK 0x1.9c6891007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2687 3 OK 0x1.93efceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2687 4 OK 0x1.9c6891007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2688 0 OK 0x1.9fcd5p25 0x0.0p0 0x0.0p0 0x1.44p7 0x0.0p0 0x0.0p0 T +REG esri:2688 1 OK 0x1.9b90eeff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2688 2 OK 0x1.a409b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2688 3 OK 0x1.9b90eeff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2688 4 OK 0x1.a409b1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2689 0 OK 0x1.a76e7p25 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:2689 1 OK 0x1.a3320eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2689 2 OK 0x1.abaad1007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2689 3 OK 0x1.a3320eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2689 4 OK 0x1.abaad1007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2690 0 OK 0x1.af0f9p25 0x0.0p0 0x0.0p0 0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2690 1 OK 0x1.aad32eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2690 2 OK 0x1.b34bf1007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2690 3 OK 0x1.aad32eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2690 4 OK 0x1.b34bf1007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26903 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.4ap7 0x1.68p5 0x0.0p0 F +REG esri:26903 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.582463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26903 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26903 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.582463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26903 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.3bdb9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26904 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.3ep7 0x1.68p5 0x0.0p0 F +REG esri:26904 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.4c2463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26904 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26904 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.4c2463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26904 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.2fdb9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26905 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.32p7 0x1.68p5 0x0.0p0 F +REG esri:26905 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.402463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26905 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26905 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.402463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26905 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.23db9cfff07aap7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26906 0 OK 0x1.e848000000022p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.26p7 0x1.68p5 0x0.0p0 F +REG esri:26906 1 OK -0x1.95aae58cba618p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.342463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26906 2 OK 0x1.0d7eae58cba74p20 0x1.0fb6fd44cdb3bp22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26906 3 OK -0x1.989b4f65ea08p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.342463000f856p7 0x1.9p5 0x0.0p0 F +REG esri:26906 4 OK 0x1.eb79369ecbd62p19 0x1.53841a99fc572p22 0x0.0p0 -0x1.17db9cfff07aap7 0x1.9000000000001p5 0x0.0p0 F +REG esri:26907 0 OK 0x1.e847fffffffdep18 0x1.30229999b59c6p22 0x0.0p0 -0x1.1ap7 0x1.68p5 0x0.0p0 F +REG esri:26907 1 OK -0x1.95aae58cba748p16 0x1.0fb6fd44cdb3bp22 0x0.0p0 -0x1.282463000f856p7 0x1.4000000000001p5 0x0.0p0 F +REG esri:26907 2 OK 0x1.0d7eae58cba62p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26907 3 OK -0x1.989b4f65eb0cp12 0x1.53841a99fc572p22 0x0.0p0 -0x1.282463000f856p7 0x1.9000000000001p5 0x0.0p0 F +REG esri:26907 4 OK 0x1.eb79369ecbd41p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.0bdb9cfff07aap7 0x1.9p5 0x0.0p0 F +REG esri:26908 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.0ep7 0x1.68p5 0x0.0p0 F +REG esri:26908 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.1c2463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26908 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26908 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.1c2463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26908 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.ffb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26909 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.02p7 0x1.68p5 0x0.0p0 F +REG esri:26909 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.102463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26909 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26909 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.102463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26909 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.e7b739ffe0f53p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:2691 0 OK 0x1.b6b0bp25 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2691 1 OK 0x1.b2744eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2691 2 OK 0x1.baed11007721fp25 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2691 3 OK 0x1.b2744eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2691 4 OK 0x1.baed11007721fp25 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26910 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.ec00000000001p6 0x1.68p5 0x0.0p0 F +REG esri:26910 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.042463000f856p7 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26910 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26910 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.042463000f856p7 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26910 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.cfb739ffe0f55p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26911 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.d4p6 0x1.68p5 0x0.0p0 F +REG esri:26911 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26911 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26911 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.f048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26911 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.b7b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26912 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.bcp6 0x1.68p5 0x0.0p0 F +REG esri:26912 1 OK -0x1.95aae58cba67p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26912 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26912 3 OK -0x1.989b4f65ea5p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.d848c6001f0abp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26912 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.9fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26913 0 OK 0x1.e847fffffffefp18 0x1.30229999b59c6p22 0x0.0p0 -0x1.a400000000001p6 0x1.68p5 0x0.0p0 F +REG esri:26913 1 OK -0x1.95aae58cba7p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26913 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26913 3 OK -0x1.989b4f65eaccp12 0x1.53841a99fc571p22 0x0.0p0 -0x1.c048c6001f0adp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26913 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.87b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26914 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.8cp6 0x1.68p5 0x0.0p0 F +REG esri:26914 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26914 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26914 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.a848c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26914 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.6fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26915 0 OK 0x1.e847fffffffefp18 0x1.30229999b59c6p22 0x0.0p0 -0x1.74p6 0x1.68p5 0x0.0p0 F +REG esri:26915 1 OK -0x1.95aae58cba7p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26915 2 OK 0x1.0d7eae58cba67p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26915 3 OK -0x1.989b4f65eaccp12 0x1.53841a99fc571p22 0x0.0p0 -0x1.9048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26915 4 OK 0x1.eb79369ecbd4ap19 0x1.53841a99fc571p22 0x0.0p0 -0x1.57b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26916 0 OK 0x1.e848000000011p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.5cp6 0x1.68p5 0x0.0p0 F +REG esri:26916 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26916 2 OK 0x1.0d7eae58cba7p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26916 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.7848c6001f0adp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26916 4 OK 0x1.eb79369ecbd5ap19 0x1.53841a99fc571p22 0x0.0p0 -0x1.3fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26917 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.44p6 0x1.68p5 0x0.0p0 F +REG esri:26917 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26917 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26917 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.6048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26917 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.27b739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26918 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.2cp6 0x1.68p5 0x0.0p0 F +REG esri:26918 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26918 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26918 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.4848c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26918 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.0fb739ffe0f54p6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26919 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.14p6 0x1.68p5 0x0.0p0 F +REG esri:26919 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26919 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26919 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.3048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26919 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.ef6e73ffc1ea7p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:2692 0 OK 0x1.be51dp25 0x0.0p0 0x0.0p0 0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2692 1 OK 0x1.ba156eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2692 2 OK 0x1.c28e31007721fp25 -0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2692 3 OK 0x1.ba156eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2692 4 OK 0x1.c28e31007721fp25 0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26920 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.f8p5 0x1.68p5 0x0.0p0 F +REG esri:26920 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26920 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26920 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.1848c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26920 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.bf6e73ffc1ea8p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26921 0 OK 0x1.e848000000011p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.c800000000001p5 0x1.68p5 0x0.0p0 F +REG esri:26921 1 OK -0x1.95aae58cba67p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26921 2 OK 0x1.0d7eae58cba72p20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.8f6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26921 3 OK -0x1.989b4f65ea5p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.0048c6001f0acp6 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26921 4 OK 0x1.eb79369ecbd5cp19 0x1.53841a99fc571p22 0x0.0p0 -0x1.8f6e73ffc1ea9p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26922 0 OK 0x1.e848000000009p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.98p5 0x1.68p5 0x0.0p0 F +REG esri:26922 1 OK -0x1.95aae58cba67p16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.d0918c003e157p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26922 2 OK 0x1.0d7eae58cba6ep20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.5f6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26922 3 OK -0x1.989b4f65ea5p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.d0918c003e157p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26922 4 OK 0x1.eb79369ecbd54p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.5f6e73ffc1ea9p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26923 0 OK 0x1.e848p18 0x1.30229999b59c6p22 0x0.0p0 -0x1.68p5 0x1.68p5 0x0.0p0 F +REG esri:26923 1 OK -0x1.95aae58cba6bp16 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.a0918c003e158p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26923 2 OK 0x1.0d7eae58cba6bp20 0x1.0fb6fd44cdb3ap22 0x0.0p0 -0x1.2f6e73ffc1ea8p5 0x1.3ffffffffffffp5 0x0.0p0 F +REG esri:26923 3 OK -0x1.989b4f65ea84p12 0x1.53841a99fc571p22 0x0.0p0 -0x1.a0918c003e158p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26923 4 OK 0x1.eb79369ecbd5p19 0x1.53841a99fc571p22 0x0.0p0 -0x1.2f6e73ffc1ea8p5 0x1.8ffffffffffffp5 0x0.0p0 F +REG esri:26929 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG esri:26929 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG esri:26929 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG esri:26929 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:26929 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:2693 0 OK 0x1.c5f2fp25 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2693 1 OK 0x1.c1b68eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2693 2 OK 0x1.ca2f51007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2693 3 OK 0x1.c1b68eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2693 4 OK 0x1.ca2f51007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26930 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26930 1 OK 0x1.02d2636ccfacp14 -0x1.08705bf248c83p19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:26930 2 OK 0x1.20ecb6724cc15p20 -0x1.08705bf248c83p19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:26930 3 OK 0x1.1be3d1f1f0738p16 0x1.162dfbdf9f577p19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:26930 4 OK 0x1.1339c2e0e0f8cp20 0x1.162dfbdf9f577p19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:26931 0 OK 0x1.312dp22 -0x1.0b6be64563176p22 0x0.0p0 -0x1.0b55555555557p7 0x1.c7ffffffffe76p5 0x0.0p0 F +REG esri:26931 1 OK 0x1.fee6820a18a8p21 -0x1.0d868c27012b4p22 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.9fffffffffba9p5 0x0.0p0 F +REG esri:26931 2 OK 0x1.3d0621a79d2a9p22 -0x1.3ba150ca7cc49p22 0x0.0p0 -0x1.f1f1f1e8bff34p6 0x1.9fffffffffba9p5 0x0.0p0 F +REG esri:26931 3 OK 0x1.2f579415b2787p22 -0x1.ba12fb3f03a8ep21 0x0.0p0 -0x1.1db1b1b64ab14p7 0x1.effffffffff93p5 0x0.0p0 F +REG esri:26931 4 OK 0x1.5e503c14c49c2p22 -0x1.0025f12fab495p22 0x0.0p0 -0x1.f1f1f1e8bff36p6 0x1.effffffffff93p5 0x0.0p0 F +REG esri:26932 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG esri:26932 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.2d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26932 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.0afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26932 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.2d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26932 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.0afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26933 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG esri:26933 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.35035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26933 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.12fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26933 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.35035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26933 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.12fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26934 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG esri:26934 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.3d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26934 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.1afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26934 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.3d035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26934 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.1afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26935 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG esri:26935 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.45035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26935 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.22fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26935 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.45035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26935 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.22fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26936 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG esri:26936 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.4d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26936 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.2afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26936 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.4d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26936 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.2afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26937 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG esri:26937 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.55035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26937 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.32fcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26937 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.55035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26937 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.32fcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26938 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG esri:26938 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.5d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26938 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.3afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26938 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.5d035501f888p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26938 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.3afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:26939 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG esri:26939 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.65035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG esri:26939 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.42fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG esri:26939 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.65035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG esri:26939 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.42fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG esri:2694 0 OK 0x1.c9c38p25 0x0.0p0 0x0.0p0 0x1.68p7 0x0.0p0 0x0.0p0 F +REG esri:2694 1 OK 0x1.c5871eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2694 2 OK 0x1.cdffe1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2694 3 OK 0x1.c5871eff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2694 4 OK 0x1.cdffe1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26940 0 OK 0x1.e848p19 0x1.33df8afe9429fp17 0x0.0p0 -0x1.6p7 0x1.a355555555154p5 0x0.0p0 F +REG esri:26940 1 OK 0x1.4422779e37856p19 -0x1.1ed11dc93382bp17 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG esri:26940 2 OK 0x1.4636c430e43d5p20 -0x1.1ed11dc93382bp17 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa4p5 0x0.0p0 F +REG esri:26940 3 OK 0x1.580525cdf719ep19 0x1.d741d626e2c06p18 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG esri:26940 4 OK 0x1.3c456d1904731p20 0x1.d741d626e2c06p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG esri:26941 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG esri:26941 1 OK 0x1.a694a7721358p20 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG esri:26941 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG esri:26941 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:26941 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:26942 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG esri:26942 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:26942 2 OK 0x1.12833bad34ff3p21 0x1.7686899058616p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG esri:26942 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6c2p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG esri:26942 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG esri:26943 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG esri:26943 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:26943 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:26943 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:26943 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:26944 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG esri:26944 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:26944 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:26944 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:26944 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:26945 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG esri:26945 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:26945 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:26945 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG esri:26945 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG esri:26946 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG esri:26946 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:26946 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:26946 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG esri:26946 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG esri:26948 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:26948 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:26948 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:26948 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:26948 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:26949 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:26949 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:26949 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:26949 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:26949 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2695 0 OK 0x1.d5353p25 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2695 1 OK 0x1.d0f8ceff88de1p25 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2695 2 OK 0x1.d97191007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2695 3 OK 0x1.d0f8ceff88de1p25 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2695 4 OK 0x1.d97191007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26950 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:26950 1 OK -0x1.6a877f4243c8ap18 -0x1.082c76001887ap19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:26950 2 OK 0x1.859fbfa121e45p19 -0x1.082c76001887ap19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:26950 3 OK -0x1.317ec6596674cp18 0x1.167858dd463e1p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:26950 4 OK 0x1.691b632cb33a6p19 0x1.167858dd463e1p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:26951 0 OK 0x1.86ap18 0x1.9bb240973abadp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG esri:26951 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b129p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:26951 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b129p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:26951 3 OK 0x1.797b25aa020dcp17 0x1.3735788b95813p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG esri:26951 4 OK 0x1.284136957f7c9p19 0x1.3735788b95813p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG esri:26952 0 OK 0x1.86ap18 0x1.f85a78d71c1e8p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG esri:26952 1 OK 0x1.390d3a7ad5114p17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:26952 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:26952 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:26952 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:26953 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG esri:26953 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:26953 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:26953 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:26953 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:26954 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG esri:26954 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:26954 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:26954 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:26954 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:26955 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG esri:26955 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:26955 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:26955 3 OK 0x1.60a2ad403160fp19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:26955 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:26956 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abb7p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG esri:26956 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG esri:26956 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG esri:26956 3 OK 0x1.75e64473bf831p17 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG esri:26956 4 OK 0x1.985d2bcd7fae6p18 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG esri:26957 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:26957 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG esri:26957 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG esri:26957 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG esri:26957 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG esri:26958 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:26958 1 OK -0x1.7072116736b76p18 -0x1.09d6c3209715p19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:26958 2 OK 0x1.7b8908b39b5bbp19 -0x1.09d6c3209715p19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:26958 3 OK -0x1.458d684123152p18 0x1.149ddbf62682p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:26958 4 OK 0x1.6616b420918a9p19 0x1.149ddbf62682p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:26959 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:26959 1 OK -0x1.7072116736b76p18 -0x1.09d6c3209715p19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:26959 2 OK 0x1.7b8908b39b5bbp19 -0x1.09d6c3209715p19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:26959 3 OK -0x1.458d684123152p18 0x1.149ddbf62682p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:26959 4 OK 0x1.6616b420918a9p19 0x1.149ddbf62682p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2696 0 OK 0x1.dcd65p25 0x0.0p0 0x0.0p0 -0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2696 1 OK 0x1.d899eeff88de1p25 -0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2696 2 OK 0x1.e112b1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2696 3 OK 0x1.d899eeff88de1p25 0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2696 4 OK 0x1.e112b1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26960 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG esri:26960 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002aep16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:26960 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002aep16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:26960 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:26960 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:26961 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG esri:26961 1 OK -0x1.189e83eccec08p16 -0x1.0b14632746d6dp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:26961 2 OK 0x1.05ade83eccecp20 -0x1.0b14632746d6dp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:26961 3 OK -0x1.2e8f11e986cp15 0x1.1337c8ec86fa9p19 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:26961 4 OK 0x1.fb30f11e986cp19 0x1.1337c8ec86fa9p19 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:26962 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG esri:26962 1 OK -0x1.1e4835059d3dp16 -0x1.0ac0813239aeap19 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG esri:26962 2 OK 0x1.0608835059d48p20 -0x1.0ac0813239ae9p19 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG esri:26962 3 OK -0x1.2379e2bbfdbp15 0x1.13976e1548783p19 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG esri:26962 4 OK 0x1.fa7f9e2bbfdc6p19 0x1.13976e1548783p19 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532544p4 0x0.0p0 F +REG esri:26963 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG esri:26963 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:26963 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:26963 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:26963 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:26964 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG esri:26964 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:26964 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:26964 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:26964 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:26965 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG esri:26965 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG esri:26965 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG esri:26965 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:26965 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:26966 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26966 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:26966 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:26966 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:26966 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:26967 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:26967 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:26967 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:26967 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:26967 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:26968 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:26968 1 OK -0x1.85615c582200ap18 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:26968 2 OK 0x1.8600ae2c11005p19 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:26968 3 OK -0x1.30ce37160a17bp18 0x1.19e947c764e3p19 0x0.0p0 -0x1.db70850622b0dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:26968 4 OK 0x1.5bb71b8b050bep19 0x1.19e947c764e3p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:26969 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:26969 1 OK -0x1.81a5716087fc8p16 -0x1.04cdcc59bf3a8p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:26969 2 OK 0x1.0c3e571608802p20 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:26969 3 OK -0x1.7ac6e2c142d6p13 0x1.19e947c764e2fp19 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a324p5 0x0.0p0 F +REG esri:26969 4 OK 0x1.ee331b8b050bep19 0x1.19e947c764e3p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2697 0 OK 0x1.e4777p25 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2697 1 OK 0x1.e03b0eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2697 2 OK 0x1.e8b3d1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea73p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2697 3 OK 0x1.e03b0eff88de1p25 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2697 4 OK 0x1.e8b3d1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea73p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26970 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:26970 1 OK 0x1.89217848c97p17 -0x1.04ccdd0c9cfa3p19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:26970 2 OK 0x1.557bd0f6e6d2p20 -0x1.04ccdd0c9cfa3p19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:26970 3 OK 0x1.192393cc6bd99p18 0x1.19e8451c47f27p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:26970 4 OK 0x1.40571b0ce509ap20 0x1.19e8451c47f27p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:26971 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG esri:26971 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:26971 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:26971 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:26971 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:26972 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG esri:26972 1 OK 0x1.a750342e1d888p16 -0x1.06875cb5bcde8p19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:26972 2 OK 0x1.3b56fcbd1e27cp20 -0x1.06875cb5bcde7p19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:26972 3 OK 0x1.6115131169322p17 0x1.1836afa2e263ep19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:26972 4 OK 0x1.29a95d9dd2dap20 0x1.1836afa2e263fp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:26973 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:26973 1 OK -0x1.e13701e8dd37p18 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:26973 2 OK 0x1.524380f46e9c3p19 -0x1.1865798c9fcaep18 0x0.0p0 -0x1.3d750c4376f4cp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:26973 3 OK -0x1.98528b65a1b18p18 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.6fe049119990cp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:26973 4 OK 0x1.2dd145b2d0d96p19 0x1.928ffdeaa1706p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:26974 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:26974 1 OK 0x1.2c08fe1722c9p18 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:26974 2 OK 0x1.6c71c07a374dcp20 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.431fb6ee219f7p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:26974 3 OK 0x1.74ed749a5e4e8p18 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.758af3bc443b6p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:26974 4 OK 0x1.5a38a2d9686c6p20 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.431fb6ee666f4p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:26975 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG esri:26975 1 OK 0x1.3cc6ee6e8294ep20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG esri:26975 2 OK 0x1.9fa511917d6b2p20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG esri:26975 3 OK 0x1.3f7cec2641663p20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG esri:26975 4 OK 0x1.9cef13d9be99dp20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG esri:26976 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG esri:26976 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG esri:26976 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG esri:26976 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG esri:26976 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG esri:26977 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG esri:26977 1 OK 0x1.cb1f1458ef103p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:26977 2 OK 0x1.13d83ae9c43b6p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:26977 3 OK 0x1.d81683a3ea361p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:26977 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:26978 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG esri:26978 1 OK 0x1.651ae3466f2f2p17 0x1.225e5e1328bcap18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG esri:26978 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bcap18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG esri:26978 3 OK 0x1.7a4c446942232p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:26978 4 OK 0x1.280ceee5af77dp19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:26979 0 OK 0x1.e848p18 0x1.94a7f22e85bdp14 0x0.0p0 -0x1.51p6 0x1.2ddddddddddbcp5 0x0.0p0 F +REG esri:26979 1 OK 0x1.79f715e225e0ep18 -0x1.49679bd8ed604p16 0x0.0p0 -0x1.560ec7d05efd7p6 0x1.25dddddddddb9p5 0x0.0p0 F +REG esri:26979 2 OK 0x1.2b4c750eed0f9p19 -0x1.49679bd8ed604p16 0x0.0p0 -0x1.4bf1382fa1029p6 0x1.25dddddddddb9p5 0x0.0p0 F +REG esri:26979 3 OK 0x1.7ce88d303879cp18 0x1.0cd7f0f322e7dp17 0x0.0p0 -0x1.560ec7d05efd7p6 0x1.35dddddddddbfp5 0x0.0p0 F +REG esri:26979 4 OK 0x1.29d3b967e3c32p19 0x1.0cd7f0f322e7dp17 0x0.0p0 -0x1.4bf1382fa1029p6 0x1.35dddddddddbfp5 0x0.0p0 F +REG esri:2698 0 OK 0x1.ec189p25 0x0.0p0 0x0.0p0 -0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2698 1 OK 0x1.e7dc2eff88de1p25 -0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158dp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2698 2 OK 0x1.f054f1007721fp25 -0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2698 3 OK 0x1.e7dc2eff88de1p25 0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158dp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2698 4 OK 0x1.f054f1007721fp25 0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:26980 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG esri:26980 1 OK 0x1.36785c3381cdep18 0x1.93766c01072c4p18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:26980 2 OK 0x1.4d0bd1e63f187p19 0x1.93766c01072c4p18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:26980 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:26980 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:26981 0 OK 0x1.e848p19 0x1.d532d46be5665p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG esri:26981 1 OK 0x1.6fab4a4b43fbfp19 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:26981 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:26981 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:26981 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:26982 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG esri:26982 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG esri:26982 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG esri:26982 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG esri:26982 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG esri:26983 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG esri:26983 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG esri:26983 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG esri:26983 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG esri:26983 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG esri:26984 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG esri:26984 1 OK 0x1.247082db3c7a6p18 -0x1.045b7b17a66f7p19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:26984 2 OK 0x1.6e57df4930e1bp20 -0x1.045b7b17a66f6p19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:26984 3 OK 0x1.7c8ef03325487p18 0x1.1a56a160fe205p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:26984 4 OK 0x1.585043f336ae2p20 0x1.1a56a160fe206p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:26985 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG esri:26985 1 OK 0x1.7f67f8df8368dp17 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG esri:26985 2 OK 0x1.26c601c81f25dp19 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG esri:26985 3 OK 0x1.92b98c3d8bc66p17 0x1.24621bba84e0bp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:26985 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84e0bp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:26986 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG esri:26986 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG esri:26986 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG esri:26986 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:26986 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:26987 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG esri:26987 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:26987 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:26987 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:26987 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:26988 0 OK 0x1.e848p22 0x1.f347dc7be971fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG esri:26988 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:26988 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:26988 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:26988 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:26989 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG esri:26989 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:26989 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:26989 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG esri:26989 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG esri:2699 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:2699 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2699 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2699 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2699 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:26990 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG esri:26990 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG esri:26990 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG esri:26990 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:26990 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:26991 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG esri:26991 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:26991 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:26991 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:26991 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:26992 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG esri:26992 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG esri:26992 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG esri:26992 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG esri:26992 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG esri:26993 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG esri:26993 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG esri:26993 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG esri:26993 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:26993 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:26994 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:26994 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:26994 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:26994 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:26994 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:26995 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:26995 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:26995 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:26995 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:26995 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:26996 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:26996 1 OK -0x1.4c8d5159e6612p18 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:26996 2 OK 0x1.9a6aa8acf3309p19 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:26996 3 OK -0x1.07f878711cfeep18 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:26996 4 OK 0x1.78203c388e7f7p19 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:26997 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:26997 1 OK -0x1.61a5456799848p16 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:26997 2 OK 0x1.0a3e545679984p20 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:26997 3 OK -0x1.3d478711cfeep14 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:26997 4 OK 0x1.f2323c388e7f7p19 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:26998 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG esri:26998 1 OK 0x1.f9e9964c5ab78p17 -0x1.06af7fefd93fep19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:26998 2 OK 0x1.5fcccd3674a91p20 -0x1.06af7fefd93fep19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:26998 3 OK 0x1.426294a802c2cp18 0x1.180d898fab5e6p19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:26998 4 OK 0x1.4e715ad5ff4f5p20 0x1.180d898fab5e6p19 0x0.0p0 -0x1.6139e6ce2bc87p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:2700 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:2700 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2700 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2700 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.300000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2700 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffff8ac64p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2701 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:2701 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2701 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2701 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2701 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2702 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 0x0.0p0 T +REG esri:2702 1 OK -0x1.af4401dc87adp15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2702 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2702 3 OK -0x1.af4401dc87adp15 0x1.0f00593292131p19 0x0.0p0 0x1.900000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2702 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.17ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2703 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:2703 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2703 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2703 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2703 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27038 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:27038 1 OK -0x1.ad892fd8998p15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27038 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27038 3 OK -0x1.ad892fd8998p15 0x1.0edd047bd8483p19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27038 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27039 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:27039 1 OK -0x1.ad892fd8996ep15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27039 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27039 3 OK -0x1.ad892fd8996ep15 0x1.0edd047bd8483p19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27039 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2704 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:2704 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2704 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2704 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.f00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2704 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.47ffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27040 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:27040 1 OK -0x1.ad892fd8998bp15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27040 2 OK 0x1.0190497ec4cb7p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27040 3 OK -0x1.ad892fd8998bp15 0x1.0edd047bd8483p19 0x0.0p0 0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:27040 4 OK 0x1.0190497ec4cb7p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:2705 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:2705 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2705 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2705 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2705 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2706 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p5 0x0.0p0 0x0.0p0 T +REG esri:2706 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2706 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2706 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.280000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2706 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.77ffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2707 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:2707 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2707 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2707 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2707 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2708 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2708 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2708 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc5632p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2708 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.580000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2708 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.a7ffffffc5632p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2709 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:2709 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2709 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2709 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2709 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2710 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp5 0x0.0p0 0x0.0p0 T +REG esri:2710 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2710 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5633p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2710 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.880000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2710 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.d7ffffffc5633p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2711 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2711 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2711 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2711 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2711 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2712 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp5 0x0.0p0 0x0.0p0 T +REG esri:2712 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9cep5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2712 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2712 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.b80000003a9cep5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2712 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.03ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27120 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:27120 1 OK -0x1.ada0e5629f81p15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.1p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:27120 2 OK 0x1.0191072b14fbcp20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:27120 3 OK -0x1.ada0e5629f81p15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.1p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:27120 4 OK 0x1.0191072b14fbcp20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.d000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:2713 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2713 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2713 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2713 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2713 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2714 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p6 0x0.0p0 0x0.0p0 T +REG esri:2714 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2714 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2714 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.e80000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2714 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.1bffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2715 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2715 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2715 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2715 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2715 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2716 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p6 0x0.0p0 0x0.0p0 T +REG esri:2716 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2716 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2716 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.0c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2716 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.33ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2717 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2717 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2717 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2717 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2717 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2718 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p6 0x0.0p0 0x0.0p0 T +REG esri:2718 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2718 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2718 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.240000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2718 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.4bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2719 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2719 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2719 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2719 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2719 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2720 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:2720 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2720 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2720 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.3c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2720 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.63ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27200 0 OK 0x1.32658p21 0x1.6f9fb8p22 0x0.0p0 0x1.5ap7 -0x1.48p5 0x0.0p0 F +REG esri:27200 1 OK 0x1.e797a2fae2c76p20 0x1.4c758605e40ebp22 0x0.0p0 0x1.4cbff77c13ebp7 -0x1.700000000e7a9p5 0x0.0p0 F +REG esri:27200 2 OK 0x1.7120954f3f1a7p21 0x1.4c6b28edafd88p22 0x0.0p0 0x1.67400883ec15p7 -0x1.700000000e7a9p5 0x0.0p0 F +REG esri:27200 3 OK 0x1.d27e337135fb6p20 0x1.905a5096bfa22p22 0x0.0p0 0x1.4cbff77c13ebp7 -0x1.1fffffffeaeb5p5 0x0.0p0 F +REG esri:27200 4 OK 0x1.7b5c43a0732eap21 0x1.9028f70757773p22 0x0.0p0 0x1.67400883ec15p7 -0x1.1fffffffeaeb5p5 0x0.0p0 F +REG esri:27205 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5d87577d1e091p7 -0x1.2709f6ce87884p5 0x0.0p0 F +REG esri:27205 1 OK -0x1.ab9ef6b7b5766p17 0x1.ec24573b9e188p16 0x0.0p0 0x1.5106ec939b87cp7 -0x1.4f09f6cdf10eep5 0x0.0p0 F +REG esri:27205 2 OK 0x1.8fdfbdaded5ebp19 0x1.ec24573b9e188p16 0x0.0p0 -0x1.65f83d995f759p7 -0x1.4f09f6cdf10eep5 0x0.0p0 F +REG esri:27205 3 OK -0x1.1d132a8ce1b9p18 0x1.2e20729fc9d86p20 0x0.0p0 0x1.5106ec937d195p7 -0x1.fe13ed9c7309p4 0x0.0p0 F +REG esri:27205 4 OK 0x1.b381954670ddcp19 0x1.2e20729fc9d86p20 0x0.0p0 -0x1.65f83d9941072p7 -0x1.fe13ed9c7309p4 0x0.0p0 F +REG esri:27206 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.60eeb167ec786p7 -0x1.2e170a2357947p5 0x0.0p0 F +REG esri:27206 1 OK -0x1.a9685a4924e96p17 0x1.e99c55fe7f318p16 0x0.0p0 0x1.54488539a2381p7 -0x1.56170a22afc4p5 0x0.0p0 F +REG esri:27206 2 OK 0x1.8f521692493a6p19 0x1.e99c55fe7f318p16 0x0.0p0 -0x1.626b2269c9476p7 -0x1.56170a22afc4p5 0x0.0p0 F +REG esri:27206 3 OK -0x1.1e4b1ecd0b562p18 0x1.2dff61bf3a7b2p20 0x0.0p0 0x1.544885397df72p7 -0x1.06170a22fdf4ap5 0x0.0p0 F +REG esri:27206 4 OK 0x1.b41d8f6685ab1p19 0x1.2dff61bf3a7b2p20 0x0.0p0 -0x1.626b2269a5067p7 -0x1.06170a22fdf4ap5 0x0.0p0 F +REG esri:27207 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.63c5721e4269ep7 -0x1.34ff642b82351p5 0x0.0p0 F +REG esri:27207 1 OK -0x1.a715560c12f7p17 0x1.e75005eff1d4p16 0x0.0p0 0x1.56f8a6d724ab2p7 -0x1.5cff642ac7ae2p5 0x0.0p0 F +REG esri:27207 2 OK 0x1.8ebd558304beep19 0x1.e75005eff1d38p16 0x0.0p0 -0x1.5f6dc29a9fd75p7 -0x1.5cff642ac7ae2p5 0x0.0p0 F +REG esri:27207 3 OK -0x1.1f74e4e5b223ep18 0x1.2dda9f7df5cabp20 0x0.0p0 0x1.56f8a6d6fa1eap7 -0x1.0cff642b1b7b5p5 0x0.0p0 F +REG esri:27207 4 OK 0x1.b4b27272d9133p19 0x1.2dda9f7df5caap20 0x0.0p0 -0x1.5f6dc29a754adp7 -0x1.0cff642b1b7b5p5 0x0.0p0 F +REG esri:27208 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.6158eca77583fp7 -0x1.3d351a6c7af3fp5 0x0.0p0 F +REG esri:27208 1 OK -0x1.a43e52945b5e6p17 0x1.e487baad80efp16 0x0.0p0 0x1.545c047509a8cp7 -0x1.65351a6ba7c2fp5 0x0.0p0 F +REG esri:27208 2 OK 0x1.8e0794a516d7ap19 0x1.e487baad80efp16 0x0.0p0 -0x1.61aa2b261ea0ep7 -0x1.65351a6ba7c2fp5 0x0.0p0 F +REG esri:27208 3 OK -0x1.20dfe0153f62p18 0x1.2dad745a4429p20 0x0.0p0 0x1.545c0474d6c52p7 -0x1.15351a6c0219cp5 0x0.0p0 F +REG esri:27208 4 OK 0x1.b567f00a9fb1p19 0x1.2dad745a4429p20 0x0.0p0 -0x1.61aa2b25ebbd4p7 -0x1.15351a6c0219cp5 0x0.0p0 F +REG esri:27209 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5c74bdf4c2b52p7 -0x1.39160873542c1p5 0x0.0p0 F +REG esri:27209 1 OK -0x1.a5ae0f46ff6e8p17 0x1.e5ef1e460b0ep16 0x0.0p0 0x1.4f904bad9737dp7 -0x1.611608728db4bp5 0x0.0p0 F +REG esri:27209 2 OK 0x1.8e6383d1bfdbap19 0x1.e5ef1e460b0ep16 0x0.0p0 -0x1.66a6cfc411cd9p7 -0x1.611608728db4bp5 0x0.0p0 F +REG esri:27209 3 OK -0x1.202863f6b5afp18 0x1.2dc4564e2a39ep20 0x0.0p0 0x1.4f904bad68a3cp7 -0x1.11160872e4ca7p5 0x0.0p0 F +REG esri:27209 4 OK 0x1.b50c31fb5ad78p19 0x1.2dc4564e2a39ep20 0x0.0p0 -0x1.66a6cfc3e3398p7 -0x1.11160872e4ca7p5 0x0.0p0 F +REG esri:2721 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:2721 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2721 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2721 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2721 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27210 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5f47b2e77832p7 -0x1.3c198a134391dp5 0x0.0p0 F +REG esri:27210 1 OK -0x1.a4a1b7769233ap17 0x1.e4e8af22aa228p16 0x0.0p0 0x1.52516d89d182dp7 -0x1.64198a1273de5p5 0x0.0p0 F +REG esri:27210 2 OK 0x1.8e206ddda48ep19 0x1.e4e8af22aa218p16 0x0.0p0 -0x1.63c207bae11ecp7 -0x1.64198a1273de4p5 0x0.0p0 F +REG esri:27210 3 OK -0x1.20ae4e5028b04p18 0x1.2db3a5865c5d6p20 0x0.0p0 0x1.52516d899fce5p7 -0x1.14198a12cd56ep5 0x0.0p0 F +REG esri:27210 4 OK 0x1.b54f272814596p19 0x1.2db3a5865c5d5p20 0x0.0p0 -0x1.63c207baaf6a4p7 -0x1.14198a12cd56fp5 0x0.0p0 F +REG esri:27211 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5ef9e83135d33p7 -0x1.41ef81fb471bcp5 0x0.0p0 F +REG esri:27211 1 OK -0x1.a29150280a626p17 0x1.e2e6ce8bbd418p16 0x0.0p0 0x1.51e026a91ab9ep7 -0x1.69ef81fa646bbp5 0x0.0p0 F +REG esri:27211 2 OK 0x1.8d9c540a02968p19 0x1.e2e6ce8bbd43p16 0x0.0p0 -0x1.63ec5646af139p7 -0x1.69ef81fa646bbp5 0x0.0p0 F +REG esri:27211 3 OK -0x1.21b59ff2a27ecp18 0x1.2d92aa7a38dfdp20 0x0.0p0 0x1.51e026a8e28f1p7 -0x1.19ef81fac2645p5 0x0.0p0 F +REG esri:27211 4 OK 0x1.b5d2cff9513cep19 0x1.2d92aa7a38dfep20 0x0.0p0 -0x1.63ec564676e8dp7 -0x1.19ef81fac2645p5 0x0.0p0 F +REG esri:27212 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5f4b716a5ed1fp7 -0x1.47677da7fb445p5 0x0.0p0 F +REG esri:27212 1 OK -0x1.a09739ab117bp17 0x1.e0fe3e7416638p16 0x0.0p0 0x1.520f3c257489fp7 -0x1.6f677da705641p5 0x0.0p0 F +REG esri:27212 2 OK 0x1.8d1dce6ac45dcp19 0x1.e0fe3e741664p16 0x0.0p0 -0x1.63785950b6e61p7 -0x1.6f677da705641p5 0x0.0p0 F +REG esri:27212 3 OK -0x1.22b1592d3e8eap18 0x1.2d72eef9b68a2p20 0x0.0p0 0x1.520f3c2535c8dp7 -0x1.1f677da7675f7p5 0x0.0p0 F +REG esri:27212 4 OK 0x1.b650ac969f461p19 0x1.2d72eef9b68a2p20 0x0.0p0 -0x1.637859507825p7 -0x1.1f677da7675f7p5 0x0.0p0 F +REG esri:27213 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5d8da18b5f147p7 -0x1.4a691a45555cbp5 0x0.0p0 F +REG esri:27213 1 OK -0x1.9f7c548711bacp17 0x1.dfeeb0c481ba8p16 0x0.0p0 0x1.503df8e77cb7bp7 -0x1.72691a4454547p5 0x0.0p0 F +REG esri:27213 2 OK 0x1.8cd71521c46ebp19 0x1.dfeeb0c481ba8p16 0x0.0p0 -0x1.6522b5d0be8edp7 -0x1.72691a4454547p5 0x0.0p0 F +REG esri:27213 3 OK -0x1.233ddaa052ff4p18 0x1.2d6122175151cp20 0x0.0p0 0x1.503df8e73a1a3p7 -0x1.22691a44b8671p5 0x0.0p0 F +REG esri:27213 4 OK 0x1.b696ed50297fap19 0x1.2d6122175151cp20 0x0.0p0 -0x1.6522b5d07bf15p7 -0x1.22691a44b8671p5 0x0.0p0 F +REG esri:27214 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5958167a95c85p7 -0x1.45b7d398810c4p5 0x0.0p0 F +REG esri:27214 1 OK -0x1.a1346d6678b22p17 0x1.e1959f7ce9c48p16 0x0.0p0 0x1.4c26a10c8f949p7 -0x1.6db7d397913cfp5 0x0.0p0 F +REG esri:27214 2 OK 0x1.8d451b599e2dap19 0x1.e1959f7ce9c38p16 0x0.0p0 0x1.66898be89bfc2p7 -0x1.6db7d397913cfp5 0x0.0p0 F +REG esri:27214 3 OK -0x1.22633519ace7ep18 0x1.2d7cce39d1143p20 0x0.0p0 0x1.4c26a10c52ea5p7 -0x1.1db7d397f2024p5 0x0.0p0 F +REG esri:27214 4 OK 0x1.b6299a8cd6753p19 0x1.2d7cce39d1142p20 0x0.0p0 0x1.66898be8d8a65p7 -0x1.1db7d397f2025p5 0x0.0p0 F +REG esri:27215 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5a99400d66021p7 -0x1.4a324480d9deep5 0x0.0p0 F +REG esri:27215 1 OK -0x1.9f909958ac636p17 0x1.e0021c1c5589p16 0x0.0p0 0x1.4d4afd53d94bap7 -0x1.7232447fd9a5ep5 0x0.0p0 F +REG esri:27215 2 OK 0x1.8cdc26562b18ep19 0x1.e0021c1c5589p16 0x0.0p0 0x1.67e782c6f2b89p7 -0x1.7232447fd9a5ep5 0x0.0p0 F +REG esri:27215 3 OK -0x1.2333cabdc005ep18 0x1.2d6268f725e92p20 0x0.0p0 0x1.4d4afd5396f62p7 -0x1.223244803d932p5 0x0.0p0 F +REG esri:27215 4 OK 0x1.b691e55ee002fp19 0x1.2d6268f725e92p20 0x0.0p0 0x1.67e782c7350ep7 -0x1.223244803d932p5 0x0.0p0 F +REG esri:27216 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5837d28b22f61p7 -0x1.4a51bd22944fdp5 0x0.0p0 F +REG esri:27216 1 OK -0x1.9f84f7e55a236p17 0x1.dff6f74617418p16 0x0.0p0 0x1.4ae8c2760f741p7 -0x1.7251bd2193ap5 0x0.0p0 F +REG esri:27216 2 OK 0x1.8cd93df95688ep19 0x1.dff6f74617418p16 0x0.0p0 0x1.6586e2a03678p7 -0x1.7251bd2193ap5 0x0.0p0 F +REG esri:27216 3 OK -0x1.233990dc43238p18 0x1.2d61ad67cdcaep20 0x0.0p0 0x1.4ae8c275ccf55p7 -0x1.2251bd21f7a29p5 0x0.0p0 F +REG esri:27216 4 OK 0x1.b694c86e2191cp19 0x1.2d61ad67cdcaep20 0x0.0p0 0x1.6586e2a078f6dp7 -0x1.2251bd21f7a29p5 0x0.0p0 F +REG esri:27217 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.57299aeb022a3p7 -0x1.4e7c8635dfcdbp5 0x0.0p0 F +REG esri:27217 1 OK -0x1.9df74b1357808p17 0x1.de7b106c67f48p16 0x0.0p0 0x1.49befa83ee092p7 -0x1.767c8634ceec4p5 0x0.0p0 F +REG esri:27217 2 OK 0x1.8c75d2c4d5e02p19 0x1.de7b106c67f48p16 0x0.0p0 0x1.64943b52164b5p7 -0x1.767c8634ceec4p5 0x0.0p0 F +REG esri:27217 3 OK -0x1.23fed65bcc476p18 0x1.2d48949639877p20 0x0.0p0 0x1.49befa83a5e45p7 -0x1.267c863535abbp5 0x0.0p0 F +REG esri:27217 4 OK 0x1.b6f76b2de623bp19 0x1.2d48949639877p20 0x0.0p0 0x1.64943b525e701p7 -0x1.267c863535abbp5 0x0.0p0 F +REG esri:27218 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.57197b9fe348p7 -0x1.52ab67e7cf57ep5 0x0.0p0 F +REG esri:27218 1 OK -0x1.9c613b4650d7p17 0x1.dcf96abc8933p16 0x0.0p0 0x1.499271bc97aadp7 -0x1.7aab67e6ad4b5p5 0x0.0p0 F +REG esri:27218 2 OK 0x1.8c104ed19434cp19 0x1.dcf96abc8934p16 0x0.0p0 0x1.64a085832ee51p7 -0x1.7aab67e6ad4b5p5 0x0.0p0 F +REG esri:27218 3 OK -0x1.24c7f7f7a70c6p18 0x1.2d2edc8770d59p20 0x0.0p0 0x1.499271bc49783p7 -0x1.2aab67e7168edp5 0x0.0p0 F +REG esri:27218 4 OK 0x1.b75bfbfbd384fp19 0x1.2d2edc8770d5ap20 0x0.0p0 0x1.64a085837d17bp7 -0x1.2aab67e7168ecp5 0x0.0p0 F +REG esri:27219 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5a0530341bc04p7 -0x1.55834f8e24623p5 0x0.0p0 F +REG esri:27219 1 OK -0x1.9b492c2a1cd1ep17 0x1.dbf0c5b94f258p16 0x0.0p0 0x1.4c6a66978a834p7 -0x1.7d834f8cf61e9p5 0x0.0p0 F +REG esri:27219 2 OK 0x1.8bca4b0a87348p19 0x1.dbf0c5b94f258p16 0x0.0p0 0x1.679ff9d0acfd5p7 -0x1.7d834f8cf61e9p5 0x0.0p0 F +REG esri:27219 3 OK -0x1.255282b826c04p18 0x1.2d1d1176e9fdcp20 0x0.0p0 0x1.4c6a669737f6ap7 -0x1.2d834f8d60efbp5 0x0.0p0 F +REG esri:27219 4 OK 0x1.b7a1415c13602p19 0x1.2d1d1176e9fdcp20 0x0.0p0 0x1.679ff9d0ff89ep7 -0x1.2d834f8d60efbp5 0x0.0p0 F +REG esri:2722 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:2722 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2722 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2722 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.540000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2722 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.7bffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27220 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5b9aa97538619p7 -0x1.4c5b1bd35387ep5 0x0.0p0 F +REG esri:27220 1 OK -0x1.9ec373251007ep17 0x1.df3dd27181bf8p16 0x0.0p0 0x1.4e3e37fd08a82p7 -0x1.745b1bd24b0a5p5 0x0.0p0 F +REG esri:27220 2 OK 0x1.8ca8dcc94400ep19 0x1.df3dd27181cp16 0x0.0p0 -0x1.6708e51297e52p7 -0x1.745b1bd24b0a5p5 0x0.0p0 F +REG esri:27220 3 OK -0x1.23999970132bap18 0x1.2d5579cae7b84p20 0x0.0p0 0x1.4e3e37fcc3725p7 -0x1.245b1bd2b06a2p5 0x0.0p0 F +REG esri:27220 4 OK 0x1.b6c4ccb809949p19 0x1.2d5579cae7b84p20 0x0.0p0 -0x1.6708e51252af5p7 -0x1.245b1bd2b06a2p5 0x0.0p0 F +REG esri:27221 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.55f5c1b54195dp7 -0x1.5717302d957c6p5 0x0.0p0 F +REG esri:27221 1 OK -0x1.9aac5575c45eep17 0x1.db5d0ab6fa78p16 0x0.0p0 0x1.484fdb12dbfc4p7 -0x1.7f17302c603f9p5 0x0.0p0 F +REG esri:27221 2 OK 0x1.8ba3155d7116bp19 0x1.db5d0ab6fa788p16 0x0.0p0 0x1.639ba857a72f6p7 -0x1.7f17302c603f9p5 0x0.0p0 F +REG esri:27221 3 OK -0x1.25a00898c07bp18 0x1.2d13157fa864dp20 0x0.0p0 0x1.484fdb1286ef3p7 -0x1.2f17302ccbdd9p5 0x0.0p0 F +REG esri:27221 4 OK 0x1.b7c8044c603c5p19 0x1.2d13157fa864ep20 0x0.0p0 0x1.639ba857fc3c7p7 -0x1.2f17302ccbdd8p5 0x0.0p0 F +REG esri:27222 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5485981221b24p7 -0x1.58e18adc972d5p5 0x0.0p0 F +REG esri:27222 1 OK -0x1.99f910d1ecc4cp17 0x1.dab49a4606ae8p16 0x0.0p0 0x1.46d2f1a92ed1p7 -0x1.80e18adb59dap5 0x0.0p0 F +REG esri:27222 2 OK 0x1.8b7644347b302p19 0x1.dab49a4606afp16 0x0.0p0 0x1.62383e7b14936p7 -0x1.80e18adb59dap5 0x0.0p0 F +REG esri:27222 3 OK -0x1.25f8965a66ecp18 0x1.2d07a7902513ap20 0x0.0p0 0x1.46d2f1a8d6d8ap7 -0x1.30e18adbc6519p5 0x0.0p0 F +REG esri:27222 4 OK 0x1.b7f44b2d3374dp19 0x1.2d07a7902513bp20 0x0.0p0 0x1.62383e7b6c8bcp7 -0x1.30e18adbc6518p5 0x0.0p0 F +REG esri:27223 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.513668a0d349dp7 -0x1.5fd28a522db26p5 0x0.0p0 F +REG esri:27223 1 OK -0x1.9734ddf6dfa02p17 0x1.d81f8a0b533a8p16 0x0.0p0 0x1.4350ebab0adcbp7 -0x1.87d28a50cf332p5 0x0.0p0 F +REG esri:27223 2 OK 0x1.8ac5377db7e7p19 0x1.d81f8a0b533b8p16 0x0.0p0 0x1.5f1be5969bb6dp7 -0x1.87d28a50cf332p5 0x0.0p0 F +REG esri:27223 3 OK -0x1.2755d63eebb8ap18 0x1.2cda5223c42b7p20 0x0.0p0 0x1.4350ebaaa6b7bp7 -0x1.37d28a513e4b7p5 0x0.0p0 F +REG esri:27223 4 OK 0x1.b8a2eb1f75db1p19 0x1.2cda5223c42b8p20 0x0.0p0 0x1.5f1be596ffdbdp7 -0x1.37d28a513e4b7p5 0x0.0p0 F +REG esri:27224 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.597452b7a48e2p7 -0x1.5cb9a03281a42p5 0x0.0p0 F +REG esri:27224 1 OK -0x1.98738188f3e2ap17 0x1.d9481c7933128p16 0x0.0p0 0x1.4ba5ccf57721bp7 -0x1.84b9a031324f2p5 0x0.0p0 F +REG esri:27224 2 OK 0x1.8b14e0623cf8ap19 0x1.d9481c7933128p16 0x0.0p0 0x1.6742d879d1fa9p7 -0x1.84b9a031324f2p5 0x0.0p0 F +REG esri:27224 3 OK -0x1.26b8d07d8c43p18 0x1.2ceec0f53441ep20 0x0.0p0 0x1.4ba5ccf518986p7 -0x1.34b9a031a05f5p5 0x0.0p0 F +REG esri:27224 4 OK 0x1.b854683ec6218p19 0x1.2ceec0f53441ep20 0x0.0p0 0x1.6742d87a3083ep7 -0x1.34b9a031a05f5p5 0x0.0p0 F +REG esri:27225 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.56b8b406148d8p7 -0x1.5dfd5c7be9fccp5 0x0.0p0 F +REG esri:27225 1 OK -0x1.97f1ee36a6558p17 0x1.d8cf570304118p16 0x0.0p0 0x1.48e0dc11645efp7 -0x1.85fd5c7a94893p5 0x0.0p0 F +REG esri:27225 2 OK 0x1.8af47b8da9966p19 0x1.d8cf570304108p16 0x0.0p0 0x1.64908bfac4bc1p7 -0x1.85fd5c7a94893p5 0x0.0p0 F +REG esri:27225 3 OK -0x1.26f8b0d5c3b3ep18 0x1.2ce673a643a95p20 0x0.0p0 0x1.48e0dc1103949p7 -0x1.35fd5c7b030ccp5 0x0.0p0 F +REG esri:27225 4 OK 0x1.b874586ae1db2p19 0x1.2ce673a643a94p20 0x0.0p0 0x1.64908bfb25867p7 -0x1.35fd5c7b030ccp5 0x0.0p0 F +REG esri:27226 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.561d4ffb31abcp7 -0x1.6337bf4f060f7p5 0x0.0p0 F +REG esri:27226 1 OK -0x1.95d28bca7470cp17 0x1.d6d767544bc7p16 0x0.0p0 0x1.481e1d444d59fp7 -0x1.8b37bf4d963dp5 0x0.0p0 F +REG esri:27226 2 OK 0x1.8a6ca2f29d1b3p19 0x1.d6d767544bc8p16 0x0.0p0 0x1.641c82b215fd8p7 -0x1.8b37bf4d963dp5 0x0.0p0 F +REG esri:27226 3 OK -0x1.280438ef3e91ep18 0x1.2cc387d416427p20 0x0.0p0 0x1.481e1d43e2b56p7 -0x1.3b37bf4e062b4p5 0x0.0p0 F +REG esri:27226 4 OK 0x1.b8fa1c779f47dp19 0x1.2cc387d416428p20 0x0.0p0 0x1.641c82b280a21p7 -0x1.3b37bf4e062b4p5 0x0.0p0 F +REG esri:27227 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.52ef7d9822e8ap7 -0x1.65e1d42cb3ecep5 0x0.0p0 F +REG esri:27227 1 OK -0x1.94b8b9f220c06p17 0x1.d5d3a594e7cap16 0x0.0p0 0x1.44dbb76672601p7 -0x1.8de1d42b35fa9p5 0x0.0p0 F +REG esri:27227 2 OK 0x1.8a262e7c882f2p19 0x1.d5d3a594e7cbp16 0x0.0p0 0x1.610343c9d3712p7 -0x1.8de1d42b35fa9p5 0x0.0p0 F +REG esri:27227 3 OK -0x1.288ec25aa472p18 0x1.2cb159fa1fe3cp20 0x0.0p0 0x1.44dbb766025b6p7 -0x1.3de1d42ba652cp5 0x0.0p0 F +REG esri:27227 4 OK 0x1.b93f612d5237ep19 0x1.2cb159fa1fe3cp20 0x0.0p0 0x1.610343ca4375cp7 -0x1.3de1d42ba652dp5 0x0.0p0 F +REG esri:27228 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.50cc1ab2d9f45p7 -0x1.69102f3ac7c3dp5 0x0.0p0 F +REG esri:27228 1 OK -0x1.9363c8b99177p17 0x1.d49adae6c0538p16 0x0.0p0 0x1.429f4a5c897b7p7 -0x1.91102f393852ap5 0x0.0p0 F +REG esri:27228 2 OK 0x1.89d0f22e645ccp19 0x1.d49adae6c0548p16 0x0.0p0 0x1.5ef8eb092a6d2p7 -0x1.91102f393852bp5 0x0.0p0 F +REG esri:27228 3 OK -0x1.293629c66c67p18 0x1.2c9b4bf47dba2p20 0x0.0p0 0x1.429f4a5c12b49p7 -0x1.41102f39a8da9p5 0x0.0p0 F +REG esri:27228 4 OK 0x1.b99314e336326p19 0x1.2c9b4bf47dba2p20 0x0.0p0 0x1.5ef8eb09a134p7 -0x1.41102f39a8da9p5 0x0.0p0 F +REG esri:27229 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.4f7a4c1747a3ep7 -0x1.6c8282dd4ddcbp5 0x0.0p0 F +REG esri:27229 1 OK -0x1.91ecbdd3a616p17 0x1.d3449e29616d8p16 0x0.0p0 0x1.4131c2042c5c1p7 -0x1.948282dbaaa9fp5 0x0.0p0 F +REG esri:27229 2 OK 0x1.89732f74e9858p19 0x1.d3449e29616d8p16 0x0.0p0 0x1.5dc2d62a62ebbp7 -0x1.948282dbaaa9fp5 0x0.0p0 F +REG esri:27229 3 OK -0x1.29ee1010ef72cp18 0x1.2c82f52b9a5afp20 0x0.0p0 0x1.4131c203adcf3p7 -0x1.448282dc1af98p5 0x0.0p0 F +REG esri:27229 4 OK 0x1.b9ef080877b96p19 0x1.2c82f52b9a5afp20 0x0.0p0 0x1.5dc2d62ae1789p7 -0x1.448282dc1af98p5 0x0.0p0 F +REG esri:2723 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:2723 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2723 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2723 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2723 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27230 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5541d739c683cp7 -0x1.6e879216bea04p5 0x0.0p0 F +REG esri:27230 1 OK -0x1.910e29641629ep17 0x1.d27a6a4a427dp16 0x0.0p0 0x1.46e8c2464cafp7 -0x1.968792150f73ap5 0x0.0p0 F +REG esri:27230 2 OK 0x1.893b8a5905898p19 0x1.d27a6a4a427d8p16 0x0.0p0 0x1.639aec2d40587p7 -0x1.968792150f73ap5 0x0.0p0 F +REG esri:27230 3 OK -0x1.2a5b14ab6d3dap18 0x1.2c747963a4dc6p20 0x0.0p0 0x1.46e8c245c9582p7 -0x1.468792157f69p5 0x0.0p0 F +REG esri:27230 4 OK 0x1.ba258a55b69dbp19 0x1.2c747963a4dc7p20 0x0.0p0 0x1.639aec2dc3af4p7 -0x1.468792157f69p5 0x0.0p0 F +REG esri:27231 0 OK 0x1.24f8p18 0x1.55ccp19 0x0.0p0 0x1.5490af851cdb1p7 -0x1.6ee4611df8506p5 0x0.0p0 F +REG esri:27231 1 OK -0x1.90dbe1d86e45cp17 0x1.d26d372922fap16 0x0.0p0 0x1.46349c70774efp7 -0x1.96e4611c46f53p5 0x0.0p0 F +REG esri:27231 2 OK 0x1.892ef8761b917p19 0x1.d26d372922fap16 0x0.0p0 0x1.62ecc299c2674p7 -0x1.96e4611c46f53p5 0x0.0p0 F +REG esri:27231 3 OK -0x1.2a68b130be1dap18 0x1.2c7087c553bc2p20 0x0.0p0 0x1.46349c6ff3172p7 -0x1.46e4611cb6d5ap5 0x0.0p0 F +REG esri:27231 4 OK 0x1.ba2c58985f0edp19 0x1.2c7087c553bc2p20 0x0.0p0 0x1.62ecc29a469f1p7 -0x1.46e4611cb6d5ap5 0x0.0p0 F +REG esri:27232 0 OK 0x1.24f8aa3d70a3dp18 0x1.55cbf28f5c28fp19 0x0.0p0 0x1.50af8ceb356dap7 -0x1.74ccd1d6c8103p5 0x0.0p0 F +REG esri:27232 1 OK -0x1.8e4c2c1b972e2p17 0x1.cffe489e5cc1p16 0x0.0p0 0x1.4221ad90a019dp7 -0x1.9cccd1d4f1bffp5 0x0.0p0 F +REG esri:27232 2 OK 0x1.888bb544566f6p19 0x1.cffe489e5cc1p16 0x0.0p0 0x1.5f3d6c45cac17p7 -0x1.9cccd1d4f1bffp5 0x0.0p0 F +REG esri:27232 3 OK -0x1.2bb2f3ef76dd5p18 0x1.2c466778808d5p20 0x0.0p0 0x1.4221ad900caebp7 -0x1.4cccd1d55f6b8p5 0x0.0p0 F +REG esri:27232 4 OK 0x1.bad224352c128p19 0x1.2c466778808d5p20 0x0.0p0 0x1.5f3d6c465e2c9p7 -0x1.4cccd1d55f6b8p5 0x0.0p0 F +REG esri:2724 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2724 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2724 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2724 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.6c0000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2724 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.93ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2725 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:2725 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2725 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2725 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2725 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27258 0 OK 0x1.e847fffffffd4p18 0x1.b9971c11d9aacp22 0x0.0p0 0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:27258 1 OK -0x1.fc406e18cd18p14 0x1.9700891db3eb6p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.e000000000001p4 0x0.0p0 F +REG esri:27258 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.e000000000001p4 0x0.0p0 F +REG esri:27258 3 OK -0x1.2fefde056e3b8p16 0x1.daca2fdc3ae77p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:27258 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:27259 0 OK 0x1.e848p18 0x1.b9971c11d9aacp22 0x0.0p0 0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:27259 1 OK -0x1.fc406e18ccfp14 0x1.9700891db3eb6p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.e000000000001p4 0x0.0p0 F +REG esri:27259 2 OK 0x1.f82a0370c6678p19 0x1.9700891db3eb6p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.e000000000001p4 0x0.0p0 F +REG esri:27259 3 OK -0x1.2fefde056e3p16 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:27259 4 OK 0x1.0722fde056e3p20 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3fffffffffffep4 0x0.0p0 F +REG esri:2726 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p6 0x0.0p0 0x0.0p0 T +REG esri:2726 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2726 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2726 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.840000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2726 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.abffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27260 0 OK 0x1.e84800000002cp18 0x1.b9971c11d9aacp22 0x0.0p0 0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:27260 1 OK -0x1.fc406e18ccc4p14 0x1.9700891db3eb6p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.e000000000001p4 0x0.0p0 F +REG esri:27260 2 OK 0x1.f82a0370c668cp19 0x1.9700891db3eb6p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.e000000000001p4 0x0.0p0 F +REG esri:27260 3 OK -0x1.2fefde056e248p16 0x1.daca2fdc3ae78p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:27260 4 OK 0x1.0722fde056e3cp20 0x1.daca2fdc3ae77p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2727 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2727 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2727 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2727 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2727 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2728 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp6 0x0.0p0 0x0.0p0 T +REG esri:2728 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2728 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2728 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.9c0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2728 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.c3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2729 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2729 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2729 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2729 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2729 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27291 0 OK 0x1.24f8p18 0x1.869ffffffffffp18 0x0.0p0 0x1.5fp7 -0x1.38p5 0x0.0p0 F +REG esri:27291 1 OK -0x1.0235874b8c67ap18 -0x1.c0037bd5fcb72p17 0x0.0p0 0x1.5221e54055102p7 -0x1.5fffffff3cc54p5 0x0.0p0 F +REG esri:27291 2 OK 0x1.a612c3a5c633dp19 -0x1.c0037bd5fcb72p17 0x0.0p0 -0x1.6421e54055102p7 -0x1.5fffffff3cc54p5 0x0.0p0 F +REG esri:27291 3 OK -0x1.565af64dce6d8p18 0x1.e19a5d71cae86p19 0x0.0p0 0x1.5221e54027941p7 -0x1.0fffffff92fcep5 0x0.0p0 F +REG esri:27291 4 OK 0x1.d0257b26e736cp19 0x1.e19a5d71cae86p19 0x0.0p0 -0x1.6421e54027941p7 -0x1.0fffffff92fcep5 0x0.0p0 F +REG esri:27292 0 OK 0x1.e847fffffffffp18 0x1.e847fffffffffp18 0x0.0p0 0x1.57p7 -0x1.6p5 0x0.0p0 F +REG esri:27292 1 OK -0x1.b5e7b5e0b61d8p15 -0x1.047d8eb29a1f6p17 0x0.0p0 0x1.49192e640a23dp7 -0x1.87fffffea09d7p5 0x0.0p0 F +REG esri:27292 2 OK 0x1.01d33daf05b17p20 -0x1.047d8eb29a1fap17 0x0.0p0 0x1.64e6d19bf5dc3p7 -0x1.87fffffea09d7p5 0x0.0p0 F +REG esri:27292 3 OK -0x1.36457b8ddc21ep17 0x1.082f72e989a5cp20 0x0.0p0 0x1.49192e63a5aa4p7 -0x1.37ffffff0fc2fp5 0x0.0p0 F +REG esri:27292 4 OK 0x1.1aecaf71bb84ep20 0x1.082f72e989a5bp20 0x0.0p0 0x1.64e6d19c5a55dp7 -0x1.37ffffff0fc2fp5 0x0.0p0 F +REG esri:2730 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2730 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2730 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2730 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.b40000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2730 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.dbffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2731 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2731 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2731 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2731 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2731 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2732 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp6 0x0.0p0 0x0.0p0 T +REG esri:2732 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2732 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2732 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.cc0000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2732 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.f3ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2733 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2733 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2733 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2733 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2733 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2734 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p6 0x0.0p0 0x0.0p0 T +REG esri:2734 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2734 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2734 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.e40000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2734 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.05fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2735 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:2735 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2735 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2735 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2735 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2736 0 OK 0x1.e847ffffffff5p18 0x1.b99a2859dc1dbp22 0x0.0p0 0x1.08p5 -0x1.8fffffffffffdp4 0x0.0p0 F +REG esri:2736 1 OK -0x1.fc10227cc654p14 0x1.97041b833de63p22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:2736 2 OK 0x1.f8288113e631fp19 0x1.97041b833de63p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2736 3 OK -0x1.2fe101188e6b8p16 0x1.daccae09f063fp22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2736 4 OK 0x1.0722101188e66p20 0x1.daccae09f063fp22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2737 0 OK 0x1.e84800000000bp18 0x1.b99a2859dc1dbp22 0x0.0p0 0x1.38p5 -0x1.8fffffffffffdp4 0x0.0p0 F +REG esri:2737 1 OK -0x1.fc10227cc63ep14 0x1.97041b833de63p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2737 2 OK 0x1.f8288113e633p19 0x1.97041b833de62p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.e000000000003p4 0x0.0p0 F +REG esri:2737 3 OK -0x1.2fe101188e668p16 0x1.daccae09f063fp22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2737 4 OK 0x1.0722101188e6fp20 0x1.daccae09f063ep22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:2738 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p7 0x0.0p0 0x0.0p0 T +REG esri:2738 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2738 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2738 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.fc0000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2738 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.11fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2739 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:2739 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2739 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2739 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2739 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27391 0 OK -0x1.34a900470343ap19 0x1.88d2d8f9ee9a6p15 0x1.cdcc6332p1 0x1.83999eaca807ep2 0x1.cfffffefb18p5 0x1.fd12a6p-7 F +REG esri:27391 1 OK -0x1.48549a9603dc9p20 -0x1.63d941a103bbdp18 0x1.4848ff2d4p4 -0x1.b07bce9a01c5ap1 0x1.a800084071925p5 0x1.0a977dp-6 F +REG esri:27391 2 OK -0x1.507916c03042ap16 -0x1.0f7dc37541233p19 0x1.f39a8a0ap2 0x1.efbb97e18b3bdp3 0x1.a7fffffebc0bp5 0x1.027a63p-6 F +REG esri:27391 3 OK -0x1.ec71bb00e9329p19 0x1.5e4c9a2803133p19 0x1.a7412585p2 -0x1.b0778df8cdacp1 0x1.f800084a6eb55p5 0x1.fba0a6p-7 F +REG esri:27391 4 OK -0x1.fb651a1fd8ac7p15 0x1.104681b87169cp19 -0x1.7fc905fep1 0x1.efbb97db54fb7p3 0x1.f7fffffbb5c99p5 0x1.ea48d8p-7 F +REG esri:27392 0 OK -0x1.34a7d41641a4dp19 0x1.88bfd59c2b3d9p15 0x1.2bcbd726p1 0x1.0c777a004037bp3 0x1.cfffffefaa679p5 0x1.fcc7dcp-7 F +REG esri:27392 1 OK -0x1.4854039fda0eap20 -0x1.63dbafe7d4becp18 0x1.1f1e83a1p4 -0x1.0ba24864cf5b5p0 0x1.a80008404eb23p5 0x1.09e24ap-6 F +REG esri:27392 2 OK -0x1.506f871f4ca9p16 -0x1.0f7eefc3121f1p19 0x1.e3065ca7p2 0x1.1d332145e7ed1p4 0x1.a7fffffea51d6p5 0x1.024a3p-6 F +REG esri:27392 3 OK -0x1.ec709463677e1p19 0x1.5e4b68a88b9d7p19 0x1.2adb9b22p2 -0x1.0b99c78f2cb53p0 0x1.f800084a42b63p5 0x1.fa4916p-7 F +REG esri:27392 4 OK -0x1.fb52887dcf609p15 0x1.1045563e3daa8p19 -0x1.9924d53ap1 0x1.1d33214255bb1p4 0x1.f7fffffbac493p5 0x1.e94dc2p-7 F +REG esri:27393 0 OK -0x1.34a6b1b655f9ep19 0x1.88ac3520f1bb9p15 0x1.54a0114cp0 0x1.572224aa2606fp3 0x1.cfffffefa0e36p5 0x1.fc629cp-7 F +REG esri:27393 1 OK -0x1.485370e313732p20 -0x1.63de32dfe5cd9p18 0x1.f4bcea398p3 0x1.49b30c6c3f10ap0 0x1.a800084028926p5 0x1.0925aap-6 F +REG esri:27393 2 OK -0x1.506645d2ac9afp16 -0x1.0f80247350ca5p19 0x1.e53663e9p2 0x1.4288769b02781p4 0x1.a7fffffe8b73fp5 0x1.020ec9p-6 F +REG esri:27393 3 OK -0x1.ec6f7807def6p19 0x1.5e4a2c3fb780bp19 0x1.779214f2p1 0x1.49bb8cd770a06p0 0x1.f800084a15c3dp5 0x1.f8cabep-7 F +REG esri:27393 4 OK -0x1.fb40a681231a5p15 0x1.104420fc0f368p19 -0x1.962f41bcp1 0x1.42887696fab82p4 0x1.f7fffffba1d6fp5 0x1.e82adp-7 F +REG esri:27394 0 OK -0x1.34a5860926d64p19 0x1.889688e0b255p15 0x1.0fa26f88p-1 0x1.a72224a949e01p3 0x1.cfffffef941ebp5 0x1.fbd74p-7 F +REG esri:27394 1 OK -0x1.4852d8a1d8fc4p20 -0x1.63e0f9852652bp18 0x1.afed05808p3 0x1.e4d985f05f0cp1 0x1.a800083ffc30cp5 0x1.0853c4p-6 F +REG esri:27394 2 OK -0x1.505cb6abad938p16 -0x1.0f8177e91191cp19 0x1.fc6065cep2 0x1.6a88769ab9eb7p4 0x1.a7fffffe6d2a8p5 0x1.01c0dfp-6 F +REG esri:27394 3 OK -0x1.ec6e5347bdce5p19 0x1.5e48cdba09679p19 0x1.4f181f6cp0 0x1.e4ddc5ee5699p1 0x1.f8000849e4a31p5 0x1.f706cap-7 F +REG esri:27394 4 OK -0x1.fb2e490cfc773p15 0x1.1042cb5d75231p19 -0x1.7398a50ep1 0x1.6a887696361fcp4 0x1.f7fffffb95c82p5 0x1.e6c51ap-7 F +REG esri:27395 0 OK -0x1.34a3e5144657fp19 0x1.8875a0a660cf2p15 -0x1.bd8fc98p-4 0x1.0e3bbcfea3439p4 0x1.cfffffef7ce64p5 0x1.facd38p-7 F +REG esri:27395 1 OK -0x1.485203348c22ap20 -0x1.63e531b746468p18 0x1.5ddcaacbp3 0x1.dd176d70d4777p2 0x1.a800083fb4b8dp5 0x1.071172p-6 F +REG esri:27395 2 OK -0x1.504f6603b0dccp16 -0x1.0f8378c7109fap19 0x1.229ac294p3 0x1.a5332144e66c3p4 0x1.a7fffffe3c1f3p5 0x1.012f42p-6 F +REG esri:27395 3 OK -0x1.ec6cbd59d8c91p19 0x1.5e46b7759678cp19 -0x1.42908128p-1 0x1.dd198d486dc56p2 0x1.f80008499b02cp5 0x1.f421d4p-7 F +REG esri:27395 4 OK -0x1.fb14e8aed8bf2p15 0x1.1040c4710bc0cp19 -0x1.063a55dp1 0x1.a533213fb0bc9p4 0x1.f7fffffb82ed3p5 0x1.e45e38p-7 F +REG esri:27396 0 OK -0x1.34a23e9d4bc0ap19 0x1.88505a1e6a414p15 -0x1.453efp-4 0x1.4e3bbcfdd51bbp4 0x1.cfffffef5e1cap5 0x1.f94f62p-7 F +REG esri:27396 1 OK -0x1.485128b1110cbp20 -0x1.63e9fada99a07p18 0x1.1e43061fp3 0x1.6e8bb69df770fp3 0x1.a800083f5ea48p5 0x1.059d54p-6 F +REG esri:27396 2 OK -0x1.5041e2e6c5ed3p16 -0x1.0f85ba61c2637p19 0x1.6483e3f9p3 0x1.e53321443f6bcp4 0x1.a7fffffe016dcp5 0x1.005db5p-6 F +REG esri:27396 3 OK -0x1.ec6b240bf3a5cp19 0x1.5e445795b7168p19 -0x1.11296bf4p1 0x1.6e8cc67552fa8p3 0x1.f800084949107p5 0x1.f0903ep-7 F +REG esri:27396 4 OK -0x1.fafb72d798662p15 0x1.103e7857009ebp19 -0x1.ff1e736p-2 0x1.e533213e4deccp4 0x1.f7fffffb6d94fp5 0x1.e13daap-7 F +REG esri:27397 0 OK -0x1.34a0bbf3f356p19 0x1.8829d1093e563p15 0x1.6a946258p-1 0x1.8e3bbcfcf0745p4 0x1.cfffffef3a8ep5 0x1.f76696p-7 F +REG esri:27397 1 OK -0x1.48505e265deedp20 -0x1.63eeeef56e98fp18 0x1.f405d939p2 0x1.ee8bb68479404p3 0x1.a800083f00f03p5 0x1.041127p-6 F +REG esri:27397 2 OK -0x1.50357ed8d984ep16 -0x1.0f880c260808bp19 0x1.c16ee4fbp3 0x1.129990a1bbb1bp5 0x1.a7fffffdc2bd1p5 0x1.fe9922p-7 F +REG esri:27397 3 OK -0x1.ec69afa9bf66ep19 0x1.5e41e0775e053p19 -0x1.7f25b178p1 0x1.ee8cc64892483p3 0x1.f8000848f62c1p5 0x1.ec900cp-7 F +REG esri:27397 4 OK -0x1.fae46daa4d218p15 0x1.103c1810e883p19 0x1.afed41f8p0 0x1.1299909e68bf7p5 0x1.f7fffffb587c8p5 0x1.dd8c46p-7 F +REG esri:27398 0 OK -0x1.349f514816107p19 0x1.880089c0dc6d2p15 0x1.2a516354p1 0x1.d0e667a691c2ap4 0x1.cfffffef11a3dp5 0x1.f4e912p-7 F +REG esri:27398 1 OK -0x1.484f9d373ab08p20 -0x1.63f43eed6c9c8p18 0x1.e30b74c3p2 0x1.39f085e02db2ap4 0x1.a800083e98634p5 0x1.02561p-6 F +REG esri:27398 2 OK -0x1.5029d884c1d3dp16 -0x1.0f8a84b8e7ec8p19 0x1.1f39d67b4p4 0x1.33eee5f6966c7p5 0x1.a7fffffd7ee1fp5 0x1.fbbfbp-7 F +REG esri:27398 3 OK -0x1.ec6854fa496acp19 0x1.5e3f39a6837a7p19 -0x1.99607d42p1 0x1.39f10db8dffd5p4 0x1.f80008489fd22p5 0x1.e7ed1ep-7 F +REG esri:27398 4 OK -0x1.facf2a1b5d2d8p15 0x1.10398c317f83p19 0x1.2857789ap2 0x1.33eee5f2e9ef6p5 0x1.f7fffffb4409ep5 0x1.d90e76p-7 F +REG esri:2740 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p7 0x0.0p0 0x0.0p0 T +REG esri:2740 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2740 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2740 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.0a0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2740 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.1dfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2741 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:2741 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2741 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2741 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2741 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2742 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p7 0x0.0p0 0x0.0p0 T +REG esri:2742 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2742 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2742 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.160000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2742 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.29fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27429 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:27429 1 OK -0x1.ada0e5629f7dp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:27429 2 OK 0x1.0191072b14fbep20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:27429 3 OK -0x1.ada0e5629f7dp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:27429 4 OK 0x1.0191072b14fbep20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.0p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:2743 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:2743 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2743 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2743 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2743 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2744 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp7 0x0.0p0 0x0.0p0 T +REG esri:2744 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2744 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2744 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.220000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2744 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.35fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2745 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:2745 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2745 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2745 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2745 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2746 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p7 0x0.0p0 0x0.0p0 T +REG esri:2746 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2746 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2746 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.2e0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2746 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.41fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2747 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:2747 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2747 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2747 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2747 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2748 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p7 0x0.0p0 0x0.0p0 T +REG esri:2748 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2748 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2748 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.3a0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2748 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.4dfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2749 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:2749 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2749 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2749 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2749 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:27492 0 OK 0x1.69322d0e56042p7 -0x1.5bf5c28f5c28fp6 0x0.0p0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 0x0.0p0 F +REG esri:27492 1 OK -0x1.22d82f9bcf7d2p19 -0x1.05985f0692bbcp19 0x0.0p0 -0x1.d41333b31790cp3 0x1.15555554dc2ddp5 0x0.0p0 F +REG esri:27492 2 OK 0x1.230555e17147fp19 -0x1.05985f0692bbbp19 0x0.0p0 -0x1.a2ef9509fe3dp0 0x1.15555554dc2dep5 0x0.0p0 F +REG esri:27492 3 OK -0x1.f6e45999c97e5p18 0x1.19318a2bfab97p19 0x0.0p0 -0x1.d41333afe72a3p3 0x1.6555555481bdep5 0x0.0p0 F +REG esri:27492 4 OK 0x1.f73ea6250d13fp18 0x1.19318a2bfab97p19 0x0.0p0 -0x1.a2ef95238171ep0 0x1.6555555481bdep5 0x0.0p0 F +REG esri:2750 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2750 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2750 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2750 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2750 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.59fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27500 0 OK 0x1.431bd118b673p18 0x1.2787da8a3d14bp18 0x0.0p0 0x1.ef2ec341b3a9bp2 0x1.8bffffffffa5p5 0x0.0p0 F +REG esri:27500 1 OK -0x1.231d96260ddf2p18 -0x1.8c5547ee35fa4p17 0x0.0p0 0x1.3a70fc5481ccbp-5 0x1.63ffffffffff8p5 0x0.0p0 F +REG esri:27500 2 OK 0x1.c4c587eba2144p19 -0x1.d6983ad35f0a8p17 0x0.0p0 0x1.edf452455f27cp3 0x1.63ffffffffff9p5 0x0.0p0 F +REG esri:27500 3 OK -0x1.25980be9224ecp17 0x1.b777ace2a23ecp19 0x0.0p0 0x1.3a70fc5481ccbp-5 0x1.b3ffffffffdc5p5 0x0.0p0 F +REG esri:27500 4 OK 0x1.9e23d88e475bap19 0x1.a856fd0a063fcp19 0x0.0p0 0x1.edf452455f27cp3 0x1.b3ffffffffdc5p5 0x0.0p0 F +REG esri:2751 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2751 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2751 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2751 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2751 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2752 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2752 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2752 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2752 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.520000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2752 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2753 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2753 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2753 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2753 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2753 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2754 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p7 0x0.0p0 0x0.0p0 F +REG esri:2754 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2754 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2754 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.5e0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2754 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.5e0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2755 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:2755 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2755 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2755 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2755 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2756 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5cp7 0x0.0p0 0x0.0p0 T +REG esri:2756 1 OK -0x1.af4401dc87c2p15 -0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2756 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2756 3 OK -0x1.af4401dc87c2p15 0x1.0f00593292131p19 0x0.0p0 -0x1.65fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2756 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.520000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27561 0 OK 0x1.a4b203cff1714p18 0x1.8bc3e17848929p17 -0x1.58f119804p5 0x1.2b2a535034201p1 0x1.8bffffffff8afp5 0x1.0p-30 F +REG esri:27561 1 OK -0x1.83e4d9ad586f4p17 -0x1.2819159f69964p18 -0x1.8e359d6bap5 -0x1.5724b7a0f095cp2 0x1.63ffffffffffp5 -0x1.0p-29 F +REG esri:27561 2 OK 0x1.f5c3c9ad8f3e4p19 -0x1.4d40d9afc3e2ep18 -0x1.3d089f1b8p5 0x1.41278578925bp3 0x1.63ffffffffffp5 0x0.0p0 F +REG esri:27561 3 OK -0x1.8c55fbf2b12ap15 0x1.86d2f4d695539p19 -0x1.7ba049d66p5 -0x1.5724b7a0f095fp2 0x1.b3ffffffffd23p5 0x1.0p-29 F +REG esri:27561 4 OK 0x1.cf1c3332994d6p19 0x1.77af72eb3682cp19 -0x1.39894fc5ep5 0x1.41278578925bp3 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG esri:27562 0 OK 0x1.9bc9a2a93d5e2p18 0x1.8bd0440a91c5ep17 -0x1.5b9be1b26p5 0x1.2b2a5350341fep1 0x1.766666666665dp5 0x1.8p-29 F +REG esri:27562 1 OK -0x1.8ab74db4f05f8p17 -0x1.2bc1e13487261p18 -0x1.8cdd014dep5 -0x1.3de133068f2b4p2 0x1.4e6666666664fp5 -0x1.0p-30 F +REG esri:27562 2 OK 0x1.ef235db4295afp19 -0x1.4f1535ebaafbep18 -0x1.3c587f3a6p5 0x1.3485c32b61a57p3 0x1.4e6666666664ep5 0x1.0p-30 F +REG esri:27562 3 OK -0x1.017bce1951b18p16 0x1.8578986f2e914p19 -0x1.7e8252b4ep5 -0x1.3de133068f2b5p2 0x1.9e66666666184p5 -0x1.0p-29 F +REG esri:27562 4 OK 0x1.ccd1e3d55c2d2p19 0x1.76ce629cea014p19 -0x1.3bb76a8e2p5 0x1.3485c32b61a58p3 0x1.9e66666666181p5 -0x1.0p-30 F +REG esri:27563 0 OK 0x1.9344f2dfefb1p18 0x1.8bcfb5ad926c3p17 -0x1.5cf0e5074p5 0x1.2b2a5350341ffp1 0x1.60cccccccccbfp5 -0x1.0p-29 F +REG esri:27563 1 OK -0x1.918e5a1f47aa8p17 -0x1.2f212cd8e88b3p18 -0x1.88a9b9f6p5 -0x1.28057a9410e24p2 0x1.38cccccccccacp5 -0x1.0p-29 F +REG esri:27563 2 OK 0x1.e8f4b98e626dap19 -0x1.50992c5831298p18 -0x1.38be2e1e4p5 0x1.2997e6f222811p3 0x1.38cccccccccbp5 0x1.0p-29 F +REG esri:27563 3 OK -0x1.3951c10015e68p16 0x1.8426664a67479p19 -0x1.81adb103ep5 -0x1.28057a9410e22p2 0x1.88cccccccc4f6p5 0x1.0p-30 F +REG esri:27563 4 OK 0x1.ca74f4da54e44p19 0x1.7604f56a3b17ap19 -0x1.3e40638aap5 0x1.2997e6f222811p3 0x1.88cccccccc4f6p5 0x0.0p0 F +REG esri:27564 0 OK -0x1.789d171d3218cp17 0x1.702a1dbdd7493p17 -0x1.5c9587e98p5 0x1.2b2a5350341ffp1 0x1.5151eb851eb74p5 -0x1.0p-30 F +REG esri:27564 1 OK -0x1.8a790636cc792p19 -0x1.3f3f15d728bddp18 -0x1.8368c6fe4p5 -0x1.1a241b8834db8p2 0x1.2951eb851eb5fp5 -0x1.0p-30 F +REG esri:27564 2 OK 0x1.7fe154f2bc8b8p18 -0x1.5f5e60ef6a6edp18 -0x1.33e2cb4d6p5 0x1.22a7376c347dcp3 0x1.2951eb851eb5ep5 -0x1.8p-29 F +REG esri:27564 3 OK -0x1.50cbbfafd44fdp19 0x1.7c558d87967e4p19 -0x1.83a473dbcp5 -0x1.1a241b8834db7p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG esri:27564 4 OK 0x1.47cfcc26355d7p18 0x1.6e9eaf4b9fa76p19 -0x1.3fcbd22dep5 0x1.22a7376c347dcp3 0x1.7951eb851eb7fp5 0x0.0p0 F +REG esri:2757 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:2757 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2757 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2757 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2757 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27571 0 OK 0x1.a4b203cff1714p18 0x1.259c7c2f09125p20 -0x1.58f119804p5 0x1.2b2a535034201p1 0x1.8bffffffff8afp5 0x1.0p-30 F +REG esri:27571 1 OK -0x1.83e4d9ad586f4p17 0x1.543b75304b34ep19 -0x1.8e359d6bap5 -0x1.5724b7a0f095cp2 0x1.63ffffffffffp5 -0x1.0p-29 F +REG esri:27571 2 OK 0x1.f5c3c9ad8f3e4p19 0x1.41a793281e0e9p19 -0x1.3d089f1b8p5 0x1.41278578925bp3 0x1.63ffffffffffp5 0x0.0p0 F +REG esri:27571 3 OK -0x1.8c55fbf2b12ap15 0x1.b78d7a6b4aa9cp20 -0x1.7ba049d66p5 -0x1.5724b7a0f095fp2 0x1.b3ffffffffd23p5 0x1.0p-29 F +REG esri:27571 4 OK 0x1.cf1c3332994d6p19 0x1.affbb9759b416p20 -0x1.39894fc5ep5 0x1.41278578925bp3 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG esri:27572 0 OK 0x1.9bc9a2a93d5e2p18 0x1.0ce10440a91c6p21 -0x1.5b9be1b26p5 0x1.2b2a5350341fep1 0x1.766666666665dp5 0x1.8p-29 F +REG esri:27572 1 OK -0x1.8ab74db4f05f8p17 0x1.9d5787b2de368p20 -0x1.8cdd014dep5 -0x1.3de133068f2b4p2 0x1.4e6666666664fp5 -0x1.0p-30 F +REG esri:27572 2 OK 0x1.ef235db4295afp19 0x1.9482b2851541p20 -0x1.3c587f3a6p5 0x1.3485c32b61a57p3 0x1.4e6666666664ep5 0x1.0p-30 F +REG esri:27572 3 OK -0x1.017bce1951b18p16 0x1.5582261bcba45p21 -0x1.7e8252b4ep5 -0x1.3de133068f2b5p2 0x1.9e66666666184p5 -0x1.0p-29 F +REG esri:27572 4 OK 0x1.ccd1e3d55c2d2p19 0x1.51d798a73a805p21 -0x1.3bb76a8e2p5 0x1.3485c32b61a58p3 0x1.9e66666666181p5 -0x1.0p-30 F +REG esri:27573 0 OK 0x1.9344f2dfefb1p18 0x1.86f2fb5ad926cp21 -0x1.5cf0e5074p5 0x1.2b2a5350341ffp1 0x1.60cccccccccbfp5 -0x1.0p-29 F +REG esri:27573 1 OK -0x1.918e5a1f47aa8p17 0x1.4851da64e2eeap21 -0x1.88a9b9f6p5 -0x1.28057a9410e24p2 0x1.38cccccccccacp5 -0x1.0p-29 F +REG esri:27573 2 OK 0x1.e8f4b98e626dap19 0x1.4422da74f9dadp21 -0x1.38be2e1e4p5 0x1.2997e6f222811p3 0x1.38cccccccccbp5 0x1.0p-29 F +REG esri:27573 3 OK -0x1.3951c10015e68p16 0x1.cf3f999299d1ep21 -0x1.81adb103ep5 -0x1.28057a9410e22p2 0x1.88cccccccc4f6p5 0x1.0p-30 F +REG esri:27573 4 OK 0x1.ca74f4da54e44p19 0x1.cbb73d5a8ec5ep21 -0x1.3e40638aap5 0x1.2997e6f222811p3 0x1.88cccccccc4f6p5 0x0.0p0 F +REG esri:27574 0 OK -0x1.789d171d3218cp17 0x1.ff4aa1dbdd749p21 -0x1.5c9587e98p5 0x1.2b2a5350341ffp1 0x1.5151eb851eb74p5 -0x1.0p-30 F +REG esri:27574 1 OK -0x1.8a790636cc792p19 0x1.c0601d451ae84p21 -0x1.8368c6fe4p5 -0x1.1a241b8834db8p2 0x1.2951eb851eb5fp5 -0x1.0p-30 F +REG esri:27574 2 OK 0x1.7fe154f2bc8b8p18 0x1.bc5c33e212b22p21 -0x1.33e2cb4d6p5 0x1.22a7376c347dcp3 0x1.2951eb851eb5ep5 -0x1.8p-29 F +REG esri:27574 3 OK -0x1.50cbbfafd44fdp19 0x1.23aeb1b0f2cfcp22 -0x1.83a473dbcp5 -0x1.1a241b8834db7p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG esri:27574 4 OK 0x1.47cfcc26355d7p18 0x1.21f7d5e973f4fp22 -0x1.3fcbd22dep5 0x1.22a7376c347dcp3 0x1.7951eb851eb7fp5 0x0.0p0 F +REG esri:2758 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.5p7 0x0.0p0 0x0.0p0 T +REG esri:2758 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2758 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2758 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.59fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2758 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.460000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:27581 0 OK 0x1.a4b203cff1714p18 0x1.259c7c2f09125p20 -0x1.58f119804p5 0x1.2b2a535034201p1 0x1.8bffffffff8afp5 0x1.0p-30 F +REG esri:27581 1 OK -0x1.83e4d9ad586f4p17 0x1.543b75304b34ep19 -0x1.8e359d6bap5 -0x1.5724b7a0f095cp2 0x1.63ffffffffffp5 -0x1.0p-29 F +REG esri:27581 2 OK 0x1.f5c3c9ad8f3e4p19 0x1.41a793281e0e9p19 -0x1.3d089f1b8p5 0x1.41278578925bp3 0x1.63ffffffffffp5 0x0.0p0 F +REG esri:27581 3 OK -0x1.8c55fbf2b12ap15 0x1.b78d7a6b4aa9cp20 -0x1.7ba049d66p5 -0x1.5724b7a0f095fp2 0x1.b3ffffffffd23p5 0x1.0p-29 F +REG esri:27581 4 OK 0x1.cf1c3332994d6p19 0x1.affbb9759b416p20 -0x1.39894fc5ep5 0x1.41278578925bp3 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG esri:27582 0 OK 0x1.9bc9a2a93d5e2p18 0x1.0ce10440a91c6p21 -0x1.5b9be1b26p5 0x1.2b2a5350341fep1 0x1.766666666665dp5 0x1.8p-29 F +REG esri:27582 1 OK -0x1.8ab74db4f05f8p17 0x1.9d5787b2de368p20 -0x1.8cdd014dep5 -0x1.3de133068f2b4p2 0x1.4e6666666664fp5 -0x1.0p-30 F +REG esri:27582 2 OK 0x1.ef235db4295afp19 0x1.9482b2851541p20 -0x1.3c587f3a6p5 0x1.3485c32b61a57p3 0x1.4e6666666664ep5 0x1.0p-30 F +REG esri:27582 3 OK -0x1.017bce1951b18p16 0x1.5582261bcba45p21 -0x1.7e8252b4ep5 -0x1.3de133068f2b5p2 0x1.9e66666666184p5 -0x1.0p-29 F +REG esri:27582 4 OK 0x1.ccd1e3d55c2d2p19 0x1.51d798a73a805p21 -0x1.3bb76a8e2p5 0x1.3485c32b61a58p3 0x1.9e66666666181p5 -0x1.0p-30 F +REG esri:27583 0 OK 0x1.9344f2dfefb1p18 0x1.86f2fb5ad926cp21 -0x1.5cf0e5074p5 0x1.2b2a5350341ffp1 0x1.60cccccccccbfp5 -0x1.0p-29 F +REG esri:27583 1 OK -0x1.918e5a1f47aa8p17 0x1.4851da64e2eeap21 -0x1.88a9b9f6p5 -0x1.28057a9410e24p2 0x1.38cccccccccacp5 -0x1.0p-29 F +REG esri:27583 2 OK 0x1.e8f4b98e626dap19 0x1.4422da74f9dadp21 -0x1.38be2e1e4p5 0x1.2997e6f222811p3 0x1.38cccccccccbp5 0x1.0p-29 F +REG esri:27583 3 OK -0x1.3951c10015e68p16 0x1.cf3f999299d1ep21 -0x1.81adb103ep5 -0x1.28057a9410e22p2 0x1.88cccccccc4f6p5 0x1.0p-30 F +REG esri:27583 4 OK 0x1.ca74f4da54e44p19 0x1.cbb73d5a8ec5ep21 -0x1.3e40638aap5 0x1.2997e6f222811p3 0x1.88cccccccc4f6p5 0x0.0p0 F +REG esri:27584 0 OK -0x1.789d171d3218cp17 0x1.ff4aa1dbdd749p21 -0x1.5c9587e98p5 0x1.2b2a5350341ffp1 0x1.5151eb851eb74p5 -0x1.0p-30 F +REG esri:27584 1 OK -0x1.8a790636cc792p19 0x1.c0601d451ae84p21 -0x1.8368c6fe4p5 -0x1.1a241b8834db8p2 0x1.2951eb851eb5fp5 -0x1.0p-30 F +REG esri:27584 2 OK 0x1.7fe154f2bc8b8p18 0x1.bc5c33e212b22p21 -0x1.33e2cb4d6p5 0x1.22a7376c347dcp3 0x1.2951eb851eb5ep5 -0x1.8p-29 F +REG esri:27584 3 OK -0x1.50cbbfafd44fdp19 0x1.23aeb1b0f2cfcp22 -0x1.83a473dbcp5 -0x1.1a241b8834db7p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG esri:27584 4 OK 0x1.47cfcc26355d7p18 0x1.21f7d5e973f4fp22 -0x1.3fcbd22dep5 0x1.22a7376c347dcp3 0x1.7951eb851eb7fp5 0x0.0p0 F +REG esri:2759 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG esri:2759 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG esri:2759 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG esri:2759 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:2759 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG esri:27591 0 OK 0x1.a4b203cff1714p18 0x1.8bc3e17848929p17 -0x1.58f119804p5 0x1.2b2a535034201p1 0x1.8bffffffff8afp5 0x1.0p-30 F +REG esri:27591 1 OK -0x1.83e4d9ad586f4p17 -0x1.2819159f69964p18 -0x1.8e359d6bap5 -0x1.5724b7a0f095cp2 0x1.63ffffffffffp5 -0x1.0p-29 F +REG esri:27591 2 OK 0x1.f5c3c9ad8f3e4p19 -0x1.4d40d9afc3e2ep18 -0x1.3d089f1b8p5 0x1.41278578925bp3 0x1.63ffffffffffp5 0x0.0p0 F +REG esri:27591 3 OK -0x1.8c55fbf2b12ap15 0x1.86d2f4d695539p19 -0x1.7ba049d66p5 -0x1.5724b7a0f095fp2 0x1.b3ffffffffd23p5 0x1.0p-29 F +REG esri:27591 4 OK 0x1.cf1c3332994d6p19 0x1.77af72eb3682cp19 -0x1.39894fc5ep5 0x1.41278578925bp3 0x1.b3ffffffffd24p5 -0x1.0p-30 F +REG esri:27592 0 OK 0x1.9bc9a2a93d5e2p18 0x1.8bd0440a91c5ep17 -0x1.5b9be1b26p5 0x1.2b2a5350341fep1 0x1.766666666665dp5 0x1.8p-29 F +REG esri:27592 1 OK -0x1.8ab74db4f05f8p17 -0x1.2bc1e13487261p18 -0x1.8cdd014dep5 -0x1.3de133068f2b4p2 0x1.4e6666666664fp5 -0x1.0p-30 F +REG esri:27592 2 OK 0x1.ef235db4295afp19 -0x1.4f1535ebaafbep18 -0x1.3c587f3a6p5 0x1.3485c32b61a57p3 0x1.4e6666666664ep5 0x1.0p-30 F +REG esri:27592 3 OK -0x1.017bce1951b18p16 0x1.8578986f2e914p19 -0x1.7e8252b4ep5 -0x1.3de133068f2b5p2 0x1.9e66666666184p5 -0x1.0p-29 F +REG esri:27592 4 OK 0x1.ccd1e3d55c2d2p19 0x1.76ce629cea014p19 -0x1.3bb76a8e2p5 0x1.3485c32b61a58p3 0x1.9e66666666181p5 -0x1.0p-30 F +REG esri:27593 0 OK 0x1.9344f2dfefb1p18 0x1.8bcfb5ad926c3p17 -0x1.5cf0e5074p5 0x1.2b2a5350341ffp1 0x1.60cccccccccbfp5 -0x1.0p-29 F +REG esri:27593 1 OK -0x1.918e5a1f47aa8p17 -0x1.2f212cd8e88b3p18 -0x1.88a9b9f6p5 -0x1.28057a9410e24p2 0x1.38cccccccccacp5 -0x1.0p-29 F +REG esri:27593 2 OK 0x1.e8f4b98e626dap19 -0x1.50992c5831298p18 -0x1.38be2e1e4p5 0x1.2997e6f222811p3 0x1.38cccccccccbp5 0x1.0p-29 F +REG esri:27593 3 OK -0x1.3951c10015e68p16 0x1.8426664a67479p19 -0x1.81adb103ep5 -0x1.28057a9410e22p2 0x1.88cccccccc4f6p5 0x1.0p-30 F +REG esri:27593 4 OK 0x1.ca74f4da54e44p19 0x1.7604f56a3b17ap19 -0x1.3e40638aap5 0x1.2997e6f222811p3 0x1.88cccccccc4f6p5 0x0.0p0 F +REG esri:27594 0 OK -0x1.789d171d3218cp17 0x1.702a1dbdd7493p17 -0x1.5c9587e98p5 0x1.2b2a5350341ffp1 0x1.5151eb851eb74p5 -0x1.0p-30 F +REG esri:27594 1 OK -0x1.8a790636cc792p19 -0x1.3f3f15d728bddp18 -0x1.8368c6fe4p5 -0x1.1a241b8834db8p2 0x1.2951eb851eb5fp5 -0x1.0p-30 F +REG esri:27594 2 OK 0x1.7fe154f2bc8b8p18 -0x1.5f5e60ef6a6edp18 -0x1.33e2cb4d6p5 0x1.22a7376c347dcp3 0x1.2951eb851eb5ep5 -0x1.8p-29 F +REG esri:27594 3 OK -0x1.50cbbfafd44fdp19 0x1.7c558d87967e4p19 -0x1.83a473dbcp5 -0x1.1a241b8834db7p2 0x1.7951eb851eb7cp5 0x0.0p0 F +REG esri:27594 4 OK 0x1.47cfcc26355d7p18 0x1.6e9eaf4b9fa76p19 -0x1.3fcbd22dep5 0x1.22a7376c347dcp3 0x1.7951eb851eb7fp5 0x0.0p0 F +REG esri:2760 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2760 1 OK 0x1.02d2636ccfacp14 -0x1.08705bf248c83p19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2760 2 OK 0x1.20ecb6724cc15p20 -0x1.08705bf248c83p19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2760 3 OK 0x1.1be3d1f1f0738p16 0x1.162dfbdf9f577p19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2760 4 OK 0x1.1339c2e0e0f8cp20 0x1.162dfbdf9f577p19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2761 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:2761 1 OK -0x1.6a82ac85a5f96p18 -0x1.082a3aa308eccp19 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2761 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2761 3 OK -0x1.317a6ef7b4dbep18 0x1.1675fe947dbaep19 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2761 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2762 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:2762 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2762 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2762 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:2762 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2763 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:2763 1 OK -0x1.6a877f4243c8ap18 -0x1.082c76001887ap19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2763 2 OK 0x1.859fbfa121e45p19 -0x1.082c76001887ap19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2763 3 OK -0x1.317ec6596674cp18 0x1.167858dd463e1p19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:2763 4 OK 0x1.691b632cb33a6p19 0x1.167858dd463e1p19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:2764 0 OK 0x1.86ap18 0x1.9bb240973abadp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG esri:2764 1 OK 0x1.6603f51a6f6e8p17 -0x1.91c633a91b129p16 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:2764 2 OK 0x1.2d1f02b964246p19 -0x1.91c633a91b129p16 0x0.0p0 -0x1.66b0943b2adecp6 0x1.0b111111110dcp5 0x0.0p0 F +REG esri:2764 3 OK 0x1.797b25aa020dcp17 0x1.3735788b95813p18 0x0.0p0 -0x1.794f6bc4d5214p6 0x1.2977777777751p5 0x0.0p0 F +REG esri:2764 4 OK 0x1.284136957f7c9p19 0x1.3735788b95813p18 0x0.0p0 -0x1.66b0943b2adecp6 0x1.2977777777751p5 0x0.0p0 F +REG esri:2765 0 OK 0x1.86ap18 0x1.f85a78d71c1e8p18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG esri:2765 1 OK 0x1.390d3a7ad5114p17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255dp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:2765 2 OK 0x1.385cb1614abbbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG esri:2765 3 OK 0x1.4f7dff4ffa972p17 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.7a1942726255dp6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:2765 4 OK 0x1.32c0802c015a4p19 0x1.6f4f7879803a9p19 0x0.0p0 -0x1.65e6bd8d9daa3p6 0x1.1e8888888886p5 0x0.0p0 F +REG esri:2766 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG esri:2766 1 OK 0x1.a694a7721358p20 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG esri:2766 2 OK 0x1.14fdac46f653cp21 0x1.6e55b9fe2728p18 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.3155555555539p5 0x0.0p0 F +REG esri:2766 3 OK 0x1.ab02d75b6d7fdp20 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:2766 4 OK 0x1.12c69452493fdp21 0x1.b4170bc79dd73p19 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:2767 0 OK 0x1.e848p20 0x1.2edbfd68bd838p19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG esri:2767 1 OK 0x1.ab8988a59601p20 0x1.768689905862fp18 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:2767 2 OK 0x1.12833bad34ff3p21 0x1.7686899058616p18 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG esri:2767 3 OK 0x1.af20a901cbc02p20 0x1.a61423074e6c2p19 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG esri:2767 4 OK 0x1.10b7ab7f1a1fap21 0x1.a61423074e6b6p19 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG esri:2768 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG esri:2768 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:2768 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:2768 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:2768 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:2769 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG esri:2769 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf5233ap18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:2769 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf5233ap18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:2769 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f1332p19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:2769 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f1332p19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:2770 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG esri:2770 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:2770 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:2770 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG esri:2770 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG esri:27700 0 OK 0x1.86ap18 -0x1.86ap16 0x0.0p0 -0x1.0p1 0x1.88p5 0x0.0p0 F +REG esri:27700 1 OK -0x1.9c2bd843e3638p17 -0x1.32429f7292ab5p19 0x0.0p0 -0x1.33e16800bfb7cp3 0x1.5ffffffdf9a23p5 0x0.0p0 F +REG esri:27700 2 OK 0x1.edaaf610f8d8ep19 -0x1.32429f7292ab5p19 0x0.0p0 0x1.67c2d0017f6f9p2 0x1.5ffffffdf9a23p5 0x0.0p0 F +REG esri:27700 3 OK -0x1.82f81bba18734p16 0x1.d79e664e86868p18 0x0.0p0 -0x1.33e167f3971e8p3 0x1.affffffda2b1bp5 0x0.0p0 F +REG esri:27700 4 OK 0x1.b6ff0377430e6p19 0x1.d79e664e86868p18 0x0.0p0 0x1.67c2cfe72e3dp2 0x1.affffffda2b1bp5 0x0.0p0 F +REG esri:2771 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG esri:2771 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:2771 2 OK 0x1.0bf208743ea4dp21 0x1.8d2cf232d38d8p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:2771 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG esri:2771 4 OK 0x1.0b085b0663b27p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG esri:2772 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG esri:2772 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:2772 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:2772 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:2772 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:2773 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac0567p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG esri:2773 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0658p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:2773 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0658p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:2773 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503a4p19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:2773 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503a4p19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:2774 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6af2p18 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG esri:2774 1 OK 0x1.5c11460e4dce8p19 0x1.9880c713ab64dp17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:2774 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab64dp17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:2774 3 OK 0x1.60a2ad403160fp19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:2774 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:2775 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abb7p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG esri:2775 1 OK 0x1.6ec21e46adbbp17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG esri:2775 2 OK 0x1.9bef3ee408926p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG esri:2775 3 OK 0x1.75e64473bf831p17 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2775 4 OK 0x1.985d2bcd7fae6p18 0x1.3dd463fdd7416p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2776 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:2776 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG esri:2776 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG esri:2776 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG esri:2776 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG esri:2777 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:2777 1 OK -0x1.7072116736b76p18 -0x1.09d6c3209715p19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2777 2 OK 0x1.7b8908b39b5bbp19 -0x1.09d6c3209715p19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2777 3 OK -0x1.458d684123152p18 0x1.149ddbf62682p19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2777 4 OK 0x1.6616b420918a9p19 0x1.149ddbf62682p19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2778 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:2778 1 OK -0x1.7072116736b76p18 -0x1.09d6c3209715p19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2778 2 OK 0x1.7b8908b39b5bbp19 -0x1.09d6c3209715p19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2778 3 OK -0x1.458d684123152p18 0x1.149ddbf62682p19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2778 4 OK 0x1.6616b420918a9p19 0x1.149ddbf62682p19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2779 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG esri:2779 1 OK 0x1.8833338ce6aaep18 -0x1.7414b87002aep16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:2779 2 OK 0x1.85d666398ca9ep19 -0x1.7414b87002aep16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:2779 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:2779 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:2780 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2780 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2780 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:2780 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2780 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2781 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2781 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:2781 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2781 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2781 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2782 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG esri:2782 1 OK -0x1.189e83eccec08p16 -0x1.0b14632746d6dp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:2782 2 OK 0x1.05ade83eccecp20 -0x1.0b14632746d6dp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897bp3 0x0.0p0 F +REG esri:2782 3 OK -0x1.2e8f11e986cp15 0x1.1337c8ec86fa9p19 0x0.0p0 -0x1.4190cfacc217p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:2782 4 OK 0x1.fb30f11e986cp19 0x1.1337c8ec86fa9p19 0x0.0p0 -0x1.2c6f30533de9p7 0x1.7d55555537da4p4 0x0.0p0 F +REG esri:2783 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG esri:2783 1 OK -0x1.1e4835059d3dp16 -0x1.0ac0813239aeap19 0x0.0p0 -0x1.43ff74a32e618p7 0x1.eaaaaaaa83d1cp3 0x0.0p0 F +REG esri:2783 2 OK 0x1.0608835059d48p20 -0x1.0ac0813239ae9p19 0x0.0p0 -0x1.2eab36077c496p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG esri:2783 3 OK -0x1.2379e2bbfdbp15 0x1.13976e1548783p19 0x0.0p0 -0x1.43ff74a33c9c7p7 0x1.9555555532545p4 0x0.0p0 F +REG esri:2783 4 OK 0x1.fa7f9e2bbfdc6p19 0x1.13976e1548783p19 0x0.0p0 -0x1.2eab36076e0e7p7 0x1.9555555532544p4 0x0.0p0 F +REG esri:2784 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG esri:2784 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:2784 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG esri:2784 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:2784 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa8p4 0x0.0p0 F +REG esri:2785 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG esri:2785 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:2785 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b9p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fap4 0x0.0p0 F +REG esri:2785 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:2785 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b551p4 0x0.0p0 F +REG esri:2786 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG esri:2786 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3eep7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG esri:2786 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6cp7 0x1.0aaaaaaa94caep4 0x0.0p0 F +REG esri:2786 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd4p7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:2786 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00edap7 0x1.aaaaaaaa8186cp4 0x0.0p0 F +REG esri:2787 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2787 1 OK -0x1.85615c582200ap18 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2787 2 OK 0x1.8600ae2c11005p19 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2787 3 OK -0x1.30ce37160a17bp18 0x1.19e947c764e3p19 0x0.0p0 -0x1.db70850622b0dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2787 4 OK 0x1.5bb71b8b050bep19 0x1.19e947c764e3p19 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2788 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2788 1 OK -0x1.81a5716087fc8p16 -0x1.04cdcc59bf3a8p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2788 2 OK 0x1.0c3e571608802p20 -0x1.04cdcc59bf3a7p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2788 3 OK -0x1.7ac6e2c142d6p13 0x1.19e947c764e2fp19 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2788 4 OK 0x1.ee331b8b050bep19 0x1.19e947c764e3p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2789 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2789 1 OK 0x1.89217848c97p17 -0x1.04ccdd0c9cfa3p19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2789 2 OK 0x1.557bd0f6e6d2p20 -0x1.04ccdd0c9cfa3p19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2789 3 OK 0x1.192393cc6bd99p18 0x1.19e8451c47f27p19 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2789 4 OK 0x1.40571b0ce509ap20 0x1.19e8451c47f27p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2790 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555554p5 0x0.0p0 F +REG esri:2790 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:2790 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:2790 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:2790 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:2791 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 0x0.0p0 F +REG esri:2791 1 OK 0x1.a750342e1d888p16 -0x1.06875cb5bcde8p19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:2791 2 OK 0x1.3b56fcbd1e27cp20 -0x1.06875cb5bcde7p19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147dap4 0x0.0p0 F +REG esri:2791 3 OK 0x1.6115131169322p17 0x1.1836afa2e263ep19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:2791 4 OK 0x1.29a95d9dd2dap20 0x1.1836afa2e263fp19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c372p5 0x0.0p0 F +REG esri:2792 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:2792 1 OK -0x1.e13701e8dd37p18 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2792 2 OK 0x1.524380f46e9c3p19 -0x1.1865798c9fcaep18 0x0.0p0 -0x1.3d750c4376f4cp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2792 3 OK -0x1.98528b65a1b18p18 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.6fe049119990cp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2792 4 OK 0x1.2dd145b2d0d96p19 0x1.928ffdeaa1706p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2793 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:2793 1 OK 0x1.2c08fe1722c9p18 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2793 2 OK 0x1.6c71c07a374dcp20 -0x1.1865798c9fcbp18 0x0.0p0 -0x1.431fb6ee219f7p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2793 3 OK 0x1.74ed749a5e4e8p18 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.758af3bc443b6p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2793 4 OK 0x1.5a38a2d9686c6p20 0x1.928ffdeaa1705p19 0x0.0p0 -0x1.431fb6ee666f4p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2794 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2794 1 OK 0x1.3cc6ee6e8294ep20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG esri:2794 2 OK 0x1.9fa511917d6b2p20 0x1.b9c38087ee75p19 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG esri:2794 3 OK 0x1.3f7cec2641663p20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.7f9125dd29e13p6 0x1.6133333333328p5 0x0.0p0 F +REG esri:2794 4 OK 0x1.9cef13d9be99dp20 0x1.3cad15fe09bd8p20 0x0.0p0 -0x1.6c6eda22d61edp6 0x1.6133333333328p5 0x0.0p0 F +REG esri:2795 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG esri:2795 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG esri:2795 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG esri:2795 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG esri:2795 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG esri:2796 0 OK 0x1.86ap18 0x1.3a62d4681c81cp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG esri:2796 1 OK 0x1.cb1f1458ef103p17 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8f7828773d56p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:2796 2 OK 0x1.13d83ae9c43b6p19 -0x1.33c4695f07cd7p16 0x0.0p0 -0x1.8087d788c2aap6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG esri:2796 3 OK 0x1.d81683a3ea361p17 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8f7828773d56p6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:2796 4 OK 0x1.109a5f170571ep19 0x1.dad4bab81c4cdp17 0x0.0p0 -0x1.8087d788c2aap6 0x1.44111111110f8p5 0x0.0p0 F +REG esri:2797 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeeccp5 0x0.0p0 F +REG esri:2797 1 OK 0x1.651ae3466f2f2p17 0x1.225e5e1328bcap18 0x0.0p0 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG esri:2797 2 OK 0x1.2d59472e6434ep19 0x1.225e5e1328bcap18 0x0.0p0 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbb8ep5 0x0.0p0 F +REG esri:2797 3 OK 0x1.7a4c446942232p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e8p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:2797 4 OK 0x1.280ceee5af77dp19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc18p6 0x1.3c22222222208p5 0x0.0p0 F +REG esri:2798 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG esri:2798 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320693p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2798 2 OK 0x1.45914c80130d5p19 -0x1.376259f320693p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2798 3 OK 0x1.4bdf97e71dca2p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2798 4 OK 0x1.4258340c711afp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2799 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG esri:2799 1 OK 0x1.36785c3381cdep18 0x1.93766c01072c4p18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:2799 2 OK 0x1.4d0bd1e63f187p19 0x1.93766c01072c4p18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:2799 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ep19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:2799 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ep19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:2800 0 OK 0x1.e848p19 0x1.d532d46be5665p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d4p4 0x0.0p0 F +REG esri:2800 1 OK 0x1.6fab4a4b43fbfp19 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:2800 2 OK 0x1.30725ada5e01bp20 -0x1.ca039024f0e3fp16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG esri:2800 3 OK 0x1.752cf6f908c6cp19 0x1.62a9faf049228p18 0x0.0p0 -0x1.7c2c70110dbebp6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:2800 4 OK 0x1.2db184837b9c5p20 0x1.62a9faf049228p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffc8p5 0x0.0p0 F +REG esri:2801 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG esri:2801 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG esri:2801 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG esri:2801 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG esri:2801 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG esri:2802 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555554p5 0x0.0p0 F +REG esri:2802 1 OK -0x1.26c1b0fd9cde4p18 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.3555555472628p5 0x0.0p0 F +REG esri:2802 2 OK 0x1.b858d87ece6f2p19 -0x1.0400f8baf07cfp19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.3555555472628p5 0x0.0p0 F +REG esri:2802 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dep5 0x0.0p0 F +REG esri:2802 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dep5 0x0.0p0 F +REG esri:2803 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 0x0.0p0 F +REG esri:2803 1 OK 0x1.247082db3c7a6p18 -0x1.045b7b17a66f7p19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:2803 2 OK 0x1.6e57df4930e1bp20 -0x1.045b7b17a66f6p19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a14p5 0x0.0p0 F +REG esri:2803 3 OK 0x1.7c8ef03325487p18 0x1.1a56a160fe205p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:2803 4 OK 0x1.585043f336ae2p20 0x1.1a56a160fe206p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG esri:2804 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG esri:2804 1 OK 0x1.7f67f8df8368dp17 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG esri:2804 2 OK 0x1.26c601c81f25dp19 -0x1.78c31960d20b1p16 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG esri:2804 3 OK 0x1.92b98c3d8bc66p17 0x1.24621bba84e0bp18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:2804 4 OK 0x1.21f19cf09d0e6p19 0x1.24621bba84e0bp18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:2805 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG esri:2805 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG esri:2805 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG esri:2805 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:2805 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:2806 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG esri:2806 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:2806 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:2806 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:2806 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:2807 0 OK 0x1.e848p22 0x1.f347dc7be971fp16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG esri:2807 1 OK 0x1.d7fb641e4ffb5p22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:2807 2 OK 0x1.f8949be1b004ap22 -0x1.ddacf38f9aa8dp16 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:2807 3 OK 0x1.d948a3589afd5p22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:2807 4 OK 0x1.f7475ca76502ap22 0x1.7b8c062ffdea9p18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:2808 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG esri:2808 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:2808 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:2808 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG esri:2808 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG esri:2809 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG esri:2809 1 OK 0x1.c9c6746671c0cp21 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG esri:2809 2 OK 0x1.0364c5ccc71f9p22 -0x1.c51d717d9ec3ap16 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG esri:2809 3 OK 0x1.cbd431dbd256cp21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:2809 4 OK 0x1.025de71216d49p22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:2810 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG esri:2810 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:2810 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:2810 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:2810 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG esri:2811 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG esri:2811 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG esri:2811 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG esri:2811 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG esri:2811 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG esri:2812 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG esri:2812 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG esri:2812 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG esri:2812 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:2812 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG esri:2813 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:2813 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2813 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2813 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2813 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2814 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:2814 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2814 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2814 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2814 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2815 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:2815 1 OK -0x1.4c8d5159e6612p18 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:2815 2 OK 0x1.9a6aa8acf3309p19 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:2815 3 OK -0x1.07f878711cfeep18 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:2815 4 OK 0x1.78203c388e7f7p19 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:2816 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 0x0.0p0 F +REG esri:2816 1 OK -0x1.61a5456799848p16 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:2816 2 OK 0x1.0a3e545679984p20 -0x1.06c95db9f2c41p19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f9p4 0x0.0p0 F +REG esri:2816 3 OK -0x1.3d478711cfeep14 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:2816 4 OK 0x1.f2323c388e7f7p19 0x1.17f1bd97a1209p19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27404p5 0x0.0p0 F +REG esri:2817 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555554p5 0x0.0p0 F +REG esri:2817 1 OK 0x1.f9e9964c5ab78p17 -0x1.06af7fefd93fep19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:2817 2 OK 0x1.5fcccd3674a91p20 -0x1.06af7fefd93fep19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbbp4 0x0.0p0 F +REG esri:2817 3 OK 0x1.426294a802c2cp18 0x1.180d898fab5e6p19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:2817 4 OK 0x1.4e715ad5ff4f5p20 0x1.180d898fab5e6p19 0x0.0p0 -0x1.6139e6ce2bc87p6 0x1.49555554cc4adp5 0x0.0p0 F +REG esri:2818 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG esri:2818 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:2818 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:2818 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:2818 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:2819 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG esri:2819 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG esri:2819 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG esri:2819 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG esri:2819 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG esri:28191 0 OK 0x1.4c85c70a3d70ap17 0x1.ef93e8b439581p16 0x0.0p0 0x1.19b2574a51d44p5 0x1.fbbedc7007b82p4 0x0.0p0 F +REG esri:28191 1 OK -0x1.94b9d65ba7581p18 -0x1.9410d62b4de28p18 0x0.0p0 0x1.d5549fa38b66bp4 0x1.abbedc170a7eep4 0x0.0p0 F +REG esri:28191 2 OK 0x1.709fceb2f264p19 -0x1.9410d62b4de28p18 0x0.0p0 0x1.48ba5ec2ddf53p5 0x1.abbedc170a7eep4 0x0.0p0 F +REG esri:28191 3 OK -0x1.5a3dd21dcd731p18 0x1.54a4cee699709p19 0x0.0p0 0x1.d5549a5372bbcp4 0x1.25df6eb76f8c3p5 0x0.0p0 F +REG esri:28191 4 OK 0x1.5361cc940571ap19 0x1.54a4cee699709p19 0x0.0p0 0x1.48ba616aea4abp5 0x1.25df6eb76f8c3p5 0x0.0p0 F +REG esri:28192 0 OK 0x1.4c85c70a3d70ap17 0x1.131d3e8b43958p20 0x0.0p0 0x1.19b2574a51d44p5 0x1.fbbedc7007b82p4 0x0.0p0 F +REG esri:28192 1 OK -0x1.95877b4274891p18 0x1.1e3f9dec1ec54p19 0x0.0p0 0x1.d554adec818e6p4 0x1.abbedc6fbf405p4 0x0.0p0 F +REG esri:28192 2 OK 0x1.7106a12658fc8p19 0x1.1e3f9dec1ec53p19 0x0.0p0 0x1.48ba579e62e16p5 0x1.abbedc6fbf405p4 0x0.0p0 F +REG esri:28192 3 OK -0x1.5ad1f9c6001e7p18 0x1.9e766a5733378p20 0x0.0p0 0x1.d554adecaf77ep4 0x1.25df6e37b505ep5 0x0.0p0 F +REG esri:28192 4 OK 0x1.53abe0681ec74p19 0x1.9e766a5733377p20 0x0.0p0 0x1.48ba579e4bec9p5 0x1.25df6e37b505dp5 0x0.0p0 F +REG esri:28193 0 OK 0x1.4c85c70a3d70ap17 0x1.131d3e8b43958p20 0x0.0p0 0x1.19b2574a51d44p5 0x1.fbbedc7007b82p4 0x0.0p0 F +REG esri:28193 1 OK -0x1.94b9d65ba7581p18 0x1.1e3f94ea590ecp19 0x0.0p0 0x1.d5549fa38b66bp4 0x1.abbedc170a7eep4 0x0.0p0 F +REG esri:28193 2 OK 0x1.709fceb2f264p19 0x1.1e3f94ea590ecp19 0x0.0p0 0x1.48ba5ec2ddf53p5 0x1.abbedc170a7eep4 0x0.0p0 F +REG esri:28193 3 OK -0x1.5a3dd21dcd731p18 0x1.9e7667734cb84p20 0x0.0p0 0x1.d5549a5372bbcp4 0x1.25df6eb76f8c3p5 0x0.0p0 F +REG esri:28193 4 OK 0x1.5361cc940571ap19 0x1.9e7667734cb84p20 0x0.0p0 0x1.48ba616aea4abp5 0x1.25df6eb76f8c3p5 0x0.0p0 F +REG esri:2820 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG esri:2820 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:2820 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:2820 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:2820 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:2821 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG esri:2821 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:2821 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:2821 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:2821 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:2822 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG esri:2822 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:2822 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:2822 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:2822 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:2823 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG esri:2823 1 OK -0x1.24fcf60120a32p18 -0x1.047d14be2735ep19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:2823 2 OK 0x1.b7767b009050fp19 -0x1.047d14be2735ep19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:2823 3 OK -0x1.9bca25cf6767ep17 0x1.1a37851a0519dp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:2823 4 OK 0x1.8bea8973d9d98p19 0x1.1a37851a0519cp19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:28232 0 OK 0x1.e848p18 0x1.b99b3e9dcd866p22 0x0.0p0 0x1.2p3 -0x1.9p4 0x0.0p0 F +REG esri:28232 1 OK -0x1.fc27c86c46fp14 0x1.97055744046d3p22 0x0.0p0 0x1.bdd68fcf51a3bp1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28232 2 OK 0x1.f8293e4362379p19 0x1.97055744046d3p22 0x0.0p0 0x1.d08a5c0c2b971p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28232 3 OK -0x1.2fe615866d1e8p16 0x1.dacd9631c3a99p22 0x0.0p0 0x1.bdd68fcf51a3bp1 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28232 4 OK 0x1.0722615866d1ep20 0x1.dacd9631c3a99p22 0x0.0p0 0x1.d08a5c0c2b971p3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2824 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:2824 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2824 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2824 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2824 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2825 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:2825 1 OK -0x1.99bdfd44b9be8p18 -0x1.082ad67698d12p19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2825 2 OK 0x1.6e00fea25cdf4p19 -0x1.082ad67698d12p19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2825 3 OK -0x1.60b59e1259a96p18 0x1.1676a2d6e2f6p19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2825 4 OK 0x1.517ccf092cd4bp19 0x1.1676a2d6e2f6p19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2826 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:2826 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2826 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2826 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2826 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2827 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:2827 1 OK 0x1.df55aecd85d18p17 -0x1.082b60f9c3635p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2827 2 OK 0x1.595b4a264f45dp20 -0x1.082b60f9c3635p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2827 3 OK 0x1.28b35480a212ep18 0x1.167734d9040ep19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2827 4 OK 0x1.4b192adfd77b4p20 0x1.167734d9040ep19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2828 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:2828 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2828 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2828 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2828 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2829 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:2829 1 OK -0x1.5221e2bc96ac2p18 -0x1.0569844cc1183p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2829 2 OK 0x1.9d34f15e4b561p19 -0x1.0569844cc1183p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2829 3 OK -0x1.0266fbc8fcfd3p18 0x1.19530c7dbe957p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2829 4 OK 0x1.75577de47e7eap19 0x1.19530c7dbe957p19 0x0.0p0 -0x1.1839a5e4684a9p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2830 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:2830 1 OK -0x1.e0f3c5792d584p17 -0x1.0569844cc1183p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2830 2 OK 0x1.ce08f15e4b561p19 -0x1.0569844cc1183p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2830 3 OK -0x1.417df791f9fa6p17 0x1.19530c7dbe957p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2830 4 OK 0x1.a62b7de47e7eap19 0x1.19530c7dbe957p19 0x0.0p0 -0x1.2039a5e4684a9p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2831 0 OK 0x1.24f8p18 0x1.77ef514292013p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG esri:2831 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:2831 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:2831 3 OK 0x1.7379e78330bbep17 0x1.388171947289dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:2831 4 OK 0x1.90330c3e67a21p18 0x1.388171947289dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:2832 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:2832 1 OK 0x1.86e3d47c2716ep18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:2832 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:2832 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2832 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2833 0 OK 0x1.24f8p19 0x1.8a66ee530ab8dp16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG esri:2833 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:2833 2 OK 0x1.8b2e86753449dp19 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG esri:2833 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:2833 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:2834 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG esri:2834 1 OK 0x1.65d7a1966c1d2p18 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG esri:2834 2 OK 0x1.97042f34c9f0dp19 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG esri:2834 3 OK 0x1.7366a7cc5f285p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG esri:2834 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG esri:28348 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.a400000000001p6 -0x1.9p4 0x0.0p0 F +REG esri:28348 1 OK -0x1.fbe5023e2acap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28348 2 OK 0x1.f8272811f1531p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28348 3 OK -0x1.2fd8271ed49bp16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28348 4 OK 0x1.07218271ed47ep20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ba114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28349 0 OK 0x1.e848000000042p18 0x1.b997b102aac2p22 0x0.0p0 0x1.bcp6 -0x1.9p4 0x0.0p0 F +REG esri:28349 1 OK -0x1.fbe5023e2a4cp14 0x1.97014c7538ba8p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28349 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28349 3 OK -0x1.2fd8271ed4788p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28349 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.d2114b818572dp6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2835 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG esri:2835 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:2835 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:2835 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG esri:2835 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG esri:28350 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.d4p6 -0x1.9p4 0x0.0p0 F +REG esri:28350 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28350 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28350 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28350 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.ea114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28351 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.ec00000000001p6 -0x1.9p4 0x0.0p0 F +REG esri:28351 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28351 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28351 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28351 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28352 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.02p7 -0x1.9p4 0x0.0p0 F +REG esri:28352 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28352 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28352 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28352 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28353 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.0ep7 -0x1.9p4 0x0.0p0 F +REG esri:28353 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28353 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28353 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28353 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28354 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.1ap7 -0x1.9p4 0x0.0p0 F +REG esri:28354 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28354 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28354 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28354 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28355 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.26p7 -0x1.9p4 0x0.0p0 F +REG esri:28355 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28355 2 OK 0x1.f8272811f156fp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28355 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28355 4 OK 0x1.07218271ed4ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28356 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 0x1.32p7 -0x1.9p4 0x0.0p0 F +REG esri:28356 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28356 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28356 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28356 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28357 0 OK 0x1.e84800000002cp18 0x1.b997b102aac2p22 0x0.0p0 0x1.3ep7 -0x1.9p4 0x0.0p0 F +REG esri:28357 1 OK -0x1.fbe5023e2a62p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:28357 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28357 3 OK -0x1.2fd8271ed47e8p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28357 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28358 0 OK 0x1.e847fffffffd4p18 0x1.b997b102aac2p22 0x0.0p0 0x1.4ap7 -0x1.9p4 0x0.0p0 F +REG esri:28358 1 OK -0x1.fbe5023e2ab8p14 0x1.97014c7538ba8p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28358 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:28358 3 OK -0x1.2fd8271ed495p16 0x1.dacaa07d1bddap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:28358 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:2836 0 OK 0x1.24f8p19 0x1.7ed816e9b443ap16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG esri:2836 1 OK 0x1.8562e4192a9e6p18 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:2836 2 OK 0x1.873e8df36ab0dp19 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:2836 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5de8p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:2836 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5de8p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:2837 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG esri:2837 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:2837 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:2837 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:2837 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:2838 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG esri:2838 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:2838 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:2838 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:2838 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:2839 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:2839 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:2839 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:2839 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG esri:2839 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG esri:2840 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG esri:2840 1 OK -0x1.e634a50072a6ep18 -0x1.0508ca3eafec3p19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:2840 2 OK 0x1.54c2528039541p19 -0x1.0508ca3eafec2p19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:2840 3 OK -0x1.9359a8941557cp18 0x1.19b7b8fc808b3p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:2840 4 OK 0x1.2b54d44a0aac6p19 0x1.19b7b8fc808b4p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:28402 0 OK 0x1.312dp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:28402 1 OK 0x1.dacddff11bc28p20 -0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e75p2 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28402 2 OK 0x1.74f31007721ecp21 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28402 3 OK 0x1.dacddff11bc28p20 0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e75p2 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28402 4 OK 0x1.74f31007721ecp21 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28403 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:28403 1 OK 0x1.6778eff88de14p21 -0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73ap3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28403 2 OK 0x1.ef051007721ecp21 -0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28403 3 OK 0x1.6778eff88de14p21 0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73ap3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28403 4 OK 0x1.ef051007721ecp21 0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28404 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:28404 1 OK 0x1.e18aeff88de14p21 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28404 2 OK 0x1.348b8803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28404 3 OK 0x1.e18aeff88de14p21 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28404 4 OK 0x1.348b8803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28405 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:28405 1 OK 0x1.2dce77fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28405 2 OK 0x1.71948803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28405 3 OK 0x1.2dce77fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28405 4 OK 0x1.71948803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28406 0 OK 0x1.8cba8p22 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:28406 1 OK 0x1.6ad777fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28406 2 OK 0x1.ae9d8803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28406 3 OK 0x1.6ad777fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28406 4 OK 0x1.ae9d8803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28407 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:28407 1 OK 0x1.a7e077fc46f0bp22 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28407 2 OK 0x1.eba68803b90f6p22 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28407 3 OK 0x1.a7e077fc46f0bp22 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28407 4 OK 0x1.eba68803b90f6p22 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28408 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:28408 1 OK 0x1.e4e977fc46f0ap22 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28408 2 OK 0x1.1457c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28408 3 OK 0x1.e4e977fc46f0ap22 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28408 4 OK 0x1.1457c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28409 0 OK 0x1.21eacp23 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:28409 1 OK 0x1.10f93bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28409 2 OK 0x1.32dc4401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28409 3 OK 0x1.10f93bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28409 4 OK 0x1.32dc4401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2841 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG esri:2841 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda99882p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG esri:2841 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda99882p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG esri:2841 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e36p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:2841 4 OK 0x1.8670ba72bc014p19 0x1.3052f091f3e36p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:28410 0 OK 0x1.406f4p23 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:28410 1 OK 0x1.2f7dbbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28410 2 OK 0x1.5160c401dc87bp23 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28410 3 OK 0x1.2f7dbbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28410 4 OK 0x1.5160c401dc87bp23 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28411 0 OK 0x1.5ef3cp23 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:28411 1 OK 0x1.4e023bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28411 2 OK 0x1.6fe54401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28411 3 OK 0x1.4e023bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28411 4 OK 0x1.6fe54401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28412 0 OK 0x1.7d784p23 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:28412 1 OK 0x1.6c86bbfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28412 2 OK 0x1.8e69c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28412 3 OK 0x1.6c86bbfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28412 4 OK 0x1.8e69c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28413 0 OK 0x1.9bfccp23 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:28413 1 OK 0x1.8b0b3bfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28413 2 OK 0x1.acee4401dc87bp23 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28413 3 OK 0x1.8b0b3bfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28413 4 OK 0x1.acee4401dc87bp23 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28414 0 OK 0x1.ba814p23 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:28414 1 OK 0x1.a98fbbfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28414 2 OK 0x1.cb72c401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28414 3 OK 0x1.a98fbbfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28414 4 OK 0x1.cb72c401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28415 0 OK 0x1.d905cp23 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:28415 1 OK 0x1.c8143bfe23785p23 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28415 2 OK 0x1.e9f74401dc87bp23 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28415 3 OK 0x1.c8143bfe23785p23 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28415 4 OK 0x1.e9f74401dc87bp23 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b18p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28416 0 OK 0x1.f78a4p23 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:28416 1 OK 0x1.e698bbfe23785p23 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28416 2 OK 0x1.043de200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28416 3 OK 0x1.e698bbfe23785p23 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e8p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28416 4 OK 0x1.043de200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28417 0 OK 0x1.0b076p24 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:28417 1 OK 0x1.028e9dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28417 2 OK 0x1.13802200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28417 3 OK 0x1.028e9dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28417 4 OK 0x1.13802200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b1ap6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28418 0 OK 0x1.1a49ap24 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:28418 1 OK 0x1.11d0ddff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28418 2 OK 0x1.22c26200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28418 3 OK 0x1.11d0ddff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28418 4 OK 0x1.22c26200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28419 0 OK 0x1.298bep24 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:28419 1 OK 0x1.21131dff11bc2p24 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28419 2 OK 0x1.3204a200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28419 3 OK 0x1.21131dff11bc2p24 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e6p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28419 4 OK 0x1.3204a200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b1bp6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2842 0 OK 0x1.24f8p19 0x1.c069e4aef592fp16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG esri:2842 1 OK 0x1.614d92de92fd1p18 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG esri:2842 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG esri:2842 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:2842 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:28420 0 OK 0x1.38ce2p24 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:28420 1 OK 0x1.30555dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28420 2 OK 0x1.4146e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28420 3 OK 0x1.30555dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28420 4 OK 0x1.4146e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28421 0 OK 0x1.48106p24 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:28421 1 OK 0x1.3f979dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28421 2 OK 0x1.50892200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28421 3 OK 0x1.3f979dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28421 4 OK 0x1.50892200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28422 0 OK 0x1.5752ap24 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:28422 1 OK 0x1.4ed9ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28422 2 OK 0x1.5fcb6200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28422 3 OK 0x1.4ed9ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28422 4 OK 0x1.5fcb6200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28423 0 OK 0x1.6694ep24 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:28423 1 OK 0x1.5e1c1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28423 2 OK 0x1.6f0da200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28423 3 OK 0x1.5e1c1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28423 4 OK 0x1.6f0da200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28424 0 OK 0x1.75d72p24 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:28424 1 OK 0x1.6d5e5dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28424 2 OK 0x1.7e4fe200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28424 3 OK 0x1.6d5e5dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28424 4 OK 0x1.7e4fe200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28425 0 OK 0x1.85196p24 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:28425 1 OK 0x1.7ca09dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28425 2 OK 0x1.8d922200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28425 3 OK 0x1.7ca09dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28425 4 OK 0x1.8d922200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28426 0 OK 0x1.945bap24 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:28426 1 OK 0x1.8be2ddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28426 2 OK 0x1.9cd46200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28426 3 OK 0x1.8be2ddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28426 4 OK 0x1.9cd46200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28427 0 OK 0x1.a39dep24 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:28427 1 OK 0x1.9b251dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28427 2 OK 0x1.ac16a200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28427 3 OK 0x1.9b251dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28427 4 OK 0x1.ac16a200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28428 0 OK 0x1.b2e02p24 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:28428 1 OK 0x1.aa675dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28428 2 OK 0x1.bb58e200ee43ep24 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28428 3 OK 0x1.aa675dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28428 4 OK 0x1.bb58e200ee43ep24 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28429 0 OK 0x1.c2226p24 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:28429 1 OK 0x1.b9a99dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28429 2 OK 0x1.ca9b2200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28429 3 OK 0x1.b9a99dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28429 4 OK 0x1.ca9b2200ee43dp24 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2843 0 OK 0x1.24f8p19 0x1.c374b0c96a7e1p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG esri:2843 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:2843 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:2843 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dce04p18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:2843 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dce04p18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:28430 0 OK 0x1.d164ap24 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:28430 1 OK 0x1.c8ebddff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28430 2 OK 0x1.d9dd6200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28430 3 OK 0x1.c8ebddff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28430 4 OK 0x1.d9dd6200ee43dp24 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28431 0 OK 0x1.e0a6ep24 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:28431 1 OK 0x1.d82e1dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28431 2 OK 0x1.e91fa200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28431 3 OK 0x1.d82e1dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28431 4 OK 0x1.e91fa200ee43dp24 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28432 0 OK 0x1.efe92p24 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:28432 1 OK 0x1.e7705dff11bc3p24 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28432 2 OK 0x1.f861e200ee43dp24 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28432 3 OK 0x1.e7705dff11bc3p24 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28432 4 OK 0x1.f861e200ee43dp24 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2844 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG esri:2844 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG esri:2844 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG esri:2844 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:2844 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:2845 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG esri:2845 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:2845 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:2845 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:2845 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:2846 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG esri:2846 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:2846 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:2846 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:2846 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:28462 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:28462 1 OK -0x1.af4401dc87afp15 -0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e76p2 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28462 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28462 3 OK -0x1.af4401dc87afp15 0x1.0f00593292131p19 0x0.0p0 0x1.00000001d4e76p2 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28462 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffff158c5p3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28463 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:28463 1 OK -0x1.af4401dc87aep15 -0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73cp3 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28463 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28463 3 OK -0x1.af4401dc87aep15 0x1.0f00593292131p19 0x0.0p0 0x1.40000000ea73cp3 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28463 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.3fffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28464 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:28464 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28464 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28464 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.000000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28464 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffff8ac63p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28465 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:28465 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28465 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28465 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.600000007539dp4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28465 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.ffffffff8ac62p4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28466 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:28466 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28466 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28466 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.c00000007539ep4 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28466 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.2fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28467 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:28467 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28467 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28467 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000003a9dp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28467 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.5fffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28468 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:28468 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28468 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28468 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.400000003a9cfp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28468 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.8fffffffc5631p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28469 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:28469 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28469 2 OK 0x1.019e200ee43d8p20 -0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28469 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.700000003a9cep5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28469 4 OK 0x1.019e200ee43d8p20 0x1.0f00593292131p19 0x0.0p0 0x1.bfffffffc5632p5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2847 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG esri:2847 1 OK 0x1.39170370f731bp18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:2847 2 OK 0x1.ad647e4784668p19 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:2847 3 OK 0x1.45cd37c6ce462p18 0x1.0d334102db22ep22 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG esri:2847 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db22ep22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG esri:28470 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:28470 1 OK -0x1.af4401dc87bp15 -0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28470 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28470 3 OK -0x1.af4401dc87bp15 0x1.0f00593292131p19 0x0.0p0 0x1.a00000003a9dp5 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28470 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.efffffffc5631p5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28471 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:28471 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28471 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28471 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d00000003a9cfp5 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28471 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.0fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28472 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:28472 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28472 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28472 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.000000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28472 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.27ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28473 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:28473 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28473 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28473 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.180000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28473 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3fffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28474 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:28474 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28474 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28474 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.300000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28474 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.57ffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28475 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:28475 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28475 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28475 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.480000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28475 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.6fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28476 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:28476 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28476 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28476 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.600000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28476 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.87ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28477 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:28477 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28477 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28477 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.780000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28477 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.9fffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28478 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:28478 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28478 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28478 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.900000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28478 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.b7ffffffe2b19p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28479 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:28479 1 OK -0x1.af4401dc87b6p15 -0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28479 2 OK 0x1.019e200ee43dbp20 -0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28479 3 OK -0x1.af4401dc87b6p15 0x1.0f00593292131p19 0x0.0p0 0x1.a80000001d4e7p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28479 4 OK 0x1.019e200ee43dbp20 0x1.0f00593292131p19 0x0.0p0 0x1.cfffffffe2b19p6 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:2848 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG esri:2848 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:2848 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:2848 3 OK 0x1.ee847b1cd767p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:2848 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:28480 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:28480 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28480 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28480 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.c00000001d4e7p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28480 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.e7ffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28481 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:28481 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28481 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28481 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.d80000001d4e9p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28481 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.ffffffffe2b18p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28482 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:28482 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28482 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28482 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.f00000001d4e8p6 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28482 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.0bfffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28483 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:28483 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28483 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28483 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.040000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28483 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.17fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28484 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:28484 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28484 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28484 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.100000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28484 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.23fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28485 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:28485 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28485 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28485 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.1c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28485 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.2ffffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28486 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:28486 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28486 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28486 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.280000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28486 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.3bfffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28487 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:28487 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28487 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28487 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.340000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28487 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.47fffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28488 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:28488 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28488 2 OK 0x1.019e200ee43e1p20 -0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 -0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28488 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.400000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28488 4 OK 0x1.019e200ee43e1p20 0x1.0f00593292131p19 0x0.0p0 0x1.53fffffff158cp7 0x1.3fffffffeae26p2 0x0.0p0 F +REG esri:28489 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:28489 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28489 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28489 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28489 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2849 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG esri:2849 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:2849 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:2849 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:2849 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:28490 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:28490 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28490 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28490 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28490 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28491 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:28491 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28491 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28491 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 0x1.640000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28491 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.580000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28492 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:28492 1 OK -0x1.af4401dc87aap15 -0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28492 2 OK 0x1.019e200ee43d5p20 -0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 -0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28492 3 OK -0x1.af4401dc87aap15 0x1.0f0059329213p19 0x0.0p0 -0x1.5ffffffff158cp7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:28492 4 OK 0x1.019e200ee43d5p20 0x1.0f0059329213p19 0x0.0p0 -0x1.4c0000000ea74p7 0x1.3fffffffeae24p2 0x0.0p0 F +REG esri:2850 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG esri:2850 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG esri:2850 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG esri:2850 3 OK 0x1.e92fa135fb9ffp17 0x1.23c16caecd927p21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:2850 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd927p21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:2851 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG esri:2851 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:2851 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:2851 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG esri:2851 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG esri:2852 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG esri:2852 1 OK -0x1.86b20b2fea528p16 -0x1.047ce186e66bfp19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:2852 2 OK 0x1.0c8f20b2fea58p20 -0x1.047ce186e66bep19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:2852 3 OK -0x1.52961a47ed8ap13 0x1.1a374d9d1c5b1p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:2852 4 OK 0x1.ed9258691fb6bp19 0x1.1a374d9d1c5b2p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG esri:2853 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG esri:2853 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:2853 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:2853 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:2853 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:2854 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG esri:2854 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:2854 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:2854 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6491p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG esri:2854 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6491p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG esri:2855 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:2855 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:2855 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:2855 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2855 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2856 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG esri:2856 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fbap16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:2856 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fbap16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:2856 3 OK 0x1.16844fa8b2f1cp18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:2856 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:2857 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG esri:2857 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG esri:2857 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG esri:2857 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:2857 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:2858 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG esri:2858 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG esri:2858 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG esri:2858 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG esri:2858 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG esri:2859 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG esri:2859 1 OK 0x1.96b30a2e34c9p18 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:2859 2 OK 0x1.7e967ae8e59b8p19 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:2859 3 OK 0x1.a0c3f35264cb7p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:2859 4 OK 0x1.798e0656cd9a4p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:2860 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG esri:2860 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:2860 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:2860 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:2860 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:28600 0 OK 0x1.86ap17 0x1.24f8p18 0x0.0p0 0x1.99bbbbbbbbbbcp5 0x1.8733333333333p4 0x0.0p0 F +REG esri:28600 1 OK -0x1.709d3d503b6ep18 -0x1.dd60edb1f6bb8p17 0x0.0p0 0x1.6dcaf9f8ceafep5 0x1.373333331668ap4 0x0.0p0 F +REG esri:28600 2 OK 0x1.7b9e9ea81db7p19 -0x1.dd60edb1f6bb8p17 0x0.0p0 0x1.c5ac7d7ea8c7ap5 0x1.373333331668ap4 0x0.0p0 F +REG esri:28600 3 OK -0x1.457c1632a72dp18 0x1.a726adb55379fp19 0x0.0p0 0x1.6dcaf9f8a318bp5 0x1.d7333332f825fp4 0x0.0p0 F +REG esri:28600 4 OK 0x1.660e0b1953968p19 0x1.a726adb55379fp19 0x0.0p0 0x1.c5ac7d7ed45edp5 0x1.d7333332f825fp4 0x0.0p0 F +REG esri:2861 0 OK 0x1.24f8p19 0x1.c0697505b68fdp16 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG esri:2861 1 OK 0x1.615ed51025e25p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:2861 2 OK 0x1.99409577ed0e4p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:2861 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:2861 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:2862 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG esri:2862 1 OK -0x1.83ac3a84b7a72p18 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2862 2 OK 0x1.85261d425bd2fp19 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2862 3 OK -0x1.3283d0f5cd3e4p18 0x1.197f618b4ead7p19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2862 4 OK 0x1.5c91e87ae69eap19 0x1.197f618b4ead6p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2863 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG esri:2863 1 OK -0x1.80b875096f4bcp17 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2863 2 OK 0x1.e6ce1d425bd39p19 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2863 3 OK -0x1.bccf43d734f4cp16 0x1.4a53618b4ead6p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2863 4 OK 0x1.be39e87ae69f2p19 0x1.4a53618b4ead7p19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2864 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG esri:2864 1 OK 0x1.79e2bda42c7p11 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2864 2 OK 0x1.243b0ea12de9cp20 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2864 3 OK 0x1.5070bc28cb07p16 0x1.197f618b4ead7p19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2864 4 OK 0x1.0ff0f43d734f9p20 0x1.197f618b4ead7p19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2865 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG esri:2865 1 OK 0x1.8c878af690b1cp17 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2865 2 OK 0x1.550f0ea12de98p20 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:2865 3 OK 0x1.176c2f0a32c1cp18 0x1.4a53618b4ead7p19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2865 4 OK 0x1.40c4f43d734f5p20 0x1.4a53618b4ead6p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:2866 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG esri:2866 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG esri:2866 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG esri:2866 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:2866 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:2867 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:2867 1 OK -0x1.2955adc19bf4ap20 -0x1.b1576a448ef9fp20 0x0.0p0 -0x1.cfffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2867 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a15580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2867 3 OK -0x1.f51cd4f10d22bp19 0x1.c8caf79f992b3p20 0x0.0p0 -0x1.cfffd464b6278p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2867 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a15580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2868 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 0x0.0p0 F +REG esri:2868 1 OK -0x1.2955adc19bf6cp20 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.d6ffd464bce81p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2868 2 OK 0x1.3f90d6e0cdfadp21 -0x1.b1576a448ef9dp20 0x0.0p0 -0x1.a85580f0986d9p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2868 3 OK -0x1.f51cd4f10d26dp19 0x1.c8caf79f992b5p20 0x0.0p0 -0x1.d6ffd464b6279p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG esri:2868 4 OK 0x1.282d353c43493p21 0x1.c8caf79f992b4p20 0x0.0p0 -0x1.a85580f09f2e3p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2869 0 OK 0x1.55cbfffffffffp19 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG esri:2869 1 OK -0x1.2959a27fed03ap20 -0x1.b15b138b3e699p20 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2869 2 OK 0x1.3f92d13ff681cp21 -0x1.b15b138b3e699p20 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2869 3 OK -0x1.f523f412fd677p19 0x1.c8ced39f6471dp20 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2869 4 OK 0x1.282efd04bf59dp21 0x1.c8ced39f6471dp20 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2870 0 OK 0x1.907e0aab020c5p22 0x1.f84139ea5bec2p20 0x0.0p0 -0x1.e8p6 0x1.43fffffffffeap5 0x0.0p0 F +REG esri:2870 1 OK 0x1.5a9aac8aa75aap22 0x1.2c788dbb4382p20 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.3155555555539p5 0x0.0p0 F +REG esri:2870 2 OK 0x1.c66168cb5cbd9p22 0x1.2c788dbb4382p20 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.315555555553ap5 0x0.0p0 F +REG esri:2870 3 OK 0x1.5e3cf1995b98p22 0x1.65af469fe0628p21 0x0.0p0 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:2870 4 OK 0x1.c2bf23bca8803p22 0x1.65af469fe0628p21 0x0.0p0 -0x1.dbb9d19c8b5c7p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:2871 0 OK 0x1.907e0aab020c5p22 0x1.f0d0c4b71a613p20 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG esri:2871 1 OK 0x1.5eab6b70b08cap22 0x1.33306016f5615p20 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaa81p5 0x0.0p0 F +REG esri:2871 2 OK 0x1.c250a9e5538b8p22 0x1.33306016f5602p20 0x0.0p0 -0x1.dce3225d3846fp6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG esri:2871 3 OK 0x1.619d4b79c2d1cp22 0x1.5a314358c160ep21 0x0.0p0 -0x1.f31cdda2c7b92p6 0x1.4755555555545p5 0x0.0p0 F +REG esri:2871 4 OK 0x1.bf5ec9dc41466p22 0x1.5a314358c1604p21 0x0.0p0 -0x1.dce3225d3846fp6 0x1.4755555555543p5 0x0.0p0 F +REG esri:2872 0 OK 0x1.907e0aab020c5p22 0x1.e66c4c0a100aep20 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG esri:2872 1 OK 0x1.643b4190e173bp22 0x1.3cd93a7337568p20 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:2872 2 OK 0x1.bcc0d3c522a57p22 0x1.3cd93a7337568p20 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG esri:2872 3 OK 0x1.6677dd7c37cc8p22 0x1.4a4240453b024p21 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:2872 4 OK 0x1.ba8437d9cc4cap22 0x1.4a4240453b024p21 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG esri:2873 0 OK 0x1.907e0aab020c5p22 0x1.e5aadbb861004p20 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG esri:2873 1 OK 0x1.64ab3a8ebe892p22 0x1.3d782896edb1cp20 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:2873 2 OK 0x1.bc50dac7458f8p22 0x1.3d782896edb1cp20 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffdp5 0x0.0p0 F +REG esri:2873 3 OK 0x1.66c728b16e63p22 0x1.490fd34bd7e74p21 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:2873 4 OK 0x1.ba34eca495b5ap22 0x1.490fd34bd7e74p21 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG esri:2874 0 OK 0x1.907e0aab020c5p22 0x1.e7dc46f7cec94p20 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG esri:2874 1 OK 0x1.639369c06913cp22 0x1.3b3cfa81a21cfp20 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:2874 2 OK 0x1.bd68ab959b056p22 0x1.3b3cfa81a21cfp20 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG esri:2874 3 OK 0x1.65a65a5ce592dp22 0x1.4c56c63348d84p21 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG esri:2874 4 OK 0x1.bb55baf91e865p22 0x1.4c56c63348d84p21 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG esri:2875 0 OK 0x1.907e0aab020c5p22 0x1.dcbd320fca315p20 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG esri:2875 1 OK 0x1.697149d02883p22 0x1.45c4474c70b21p20 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:2875 2 OK 0x1.b78acb85db956p22 0x1.45c4474c70b21p20 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG esri:2875 3 OK 0x1.6af09de1e9cf2p22 0x1.3b5e6d5b44838p21 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG esri:2875 4 OK 0x1.b60b77741a494p22 0x1.3b5e6d5b44838p21 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG esri:2876 0 OK 0x1.6e36p21 0x1.349e033e4d4adp20 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG esri:2876 1 OK 0x1.2c1b34e9bf8dcp21 0x1.6a24980a9e702p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:2876 2 OK 0x1.b050cb1640724p21 0x1.6a24980a9e702p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG esri:2876 3 OK 0x1.2edc82fbcaf4ap21 0x1.b6f34d77f3342p20 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:2876 4 OK 0x1.ad8f7d04350b6p21 0x1.b6f34d77f3342p20 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG esri:2877 0 OK 0x1.6e36p21 0x1.4959ca39b0235p20 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG esri:2877 1 OK 0x1.165b50c53d54ap21 0x1.4295425f91c2ap19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:2877 2 OK 0x1.c610af3ac2ab6p21 0x1.4295425f91c2ap19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG esri:2877 3 OK 0x1.1af84f5f35b64p21 0x1.f611413a7e336p20 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:2877 4 OK 0x1.c173b0a0ca49cp21 0x1.f611413a7e336p20 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG esri:2878 0 OK 0x1.6e36p21 0x1.42aa603777e8fp20 0x0.0p0 -0x1.a6p6 0x1.2c66666666644p5 0x0.0p0 F +REG esri:2878 1 OK 0x1.1d7ce35315b9cp21 0x1.4f0ebe975da91p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:2878 2 OK 0x1.beef1cacea464p21 0x1.4f0ebe975da91p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444418p5 0x0.0p0 F +REG esri:2878 3 OK 0x1.213c0acae25bp21 0x1.e19682bf13b29p20 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:2878 4 OK 0x1.bb2ff5351da5p21 0x1.e19682bf13b29p20 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG esri:2879 0 OK 0x1.e848p19 0x1.500fa66b4a164p19 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG esri:2879 1 OK 0x1.2cd17519787bcp19 0x1.336c49b7fa35p18 0x0.0p0 -0x1.28818d3773553p6 0x1.4288888888873p5 0x0.0p0 F +REG esri:2879 2 OK 0x1.51df457343c22p20 0x1.336c49b7fa35p18 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.4288888888873p5 0x0.0p0 F +REG esri:2879 3 OK 0x1.32acebaa46e87p19 0x1.04afc04ea9f54p20 0x0.0p0 -0x1.28818d3773553p6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2879 4 OK 0x1.4ef18a2adc8bcp20 0x1.04afc04ea9f54p20 0x0.0p0 -0x1.1d7e72c88caadp6 0x1.5311111111101p5 0x0.0p0 F +REG esri:2880 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG esri:2880 1 OK -0x1.3b284352bd37p20 -0x1.adf90da921e8p20 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG esri:2880 2 OK 0x1.3dc68c5566cd2p21 -0x1.adf90da921e7fp20 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG esri:2880 3 OK -0x1.fc8e1e7bfa799p19 0x1.cc6842bfb4f9bp20 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG esri:2880 4 OK 0x1.1f55f24b06dp21 0x1.cc6842bfb4f9cp20 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG esri:2881 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:2881 1 OK -0x1.2e33bf03fc19cp20 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2881 2 OK 0x1.374c4a2e063ep21 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2881 3 OK -0x1.0b0551140f844p20 0x1.c5c43c229dadp20 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2881 4 OK 0x1.25b513360ff34p21 0x1.c5c43c229dadp20 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2882 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555554p4 0x0.0p0 F +REG esri:2882 1 OK -0x1.2e33bf03fc19cp20 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2882 2 OK 0x1.374c4a2e063ep21 -0x1.b4162a8b1d626p20 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539106p4 0x0.0p0 F +REG esri:2882 3 OK -0x1.0b0551140f844p20 0x1.c5c43c229dadp20 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2882 4 OK 0x1.25b513360ff34p21 0x1.c5c43c229dadp20 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG esri:2883 0 OK 0x1.e097400000001p20 0x1.36c124f6ea72p18 0x0.0p0 -0x1.52p6 0x1.ddfffffffff69p4 0x0.0p0 F +REG esri:2883 1 OK 0x1.41af8ade6516cp20 -0x1.312f13394fd9fp18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:2883 2 OK 0x1.3fbf7a90cd742p21 -0x1.312f13394fd9fp18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff59p4 0x0.0p0 F +REG esri:2883 3 OK 0x1.472fd7933cbd5p20 0x1.d4e8d5e1dda5dp19 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:2883 4 OK 0x1.3cff543661a0ep21 0x1.d4e8d5e1dda5dp19 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff76p4 0x0.0p0 F +REG esri:2884 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2884 1 OK -0x1.331c47ab83518p20 -0x1.b1c692296f915p20 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2884 2 OK 0x1.39c08e81c9da7p21 -0x1.b1c692296f915p20 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:2884 3 OK -0x1.062aefbe75fbap20 0x1.c850c02f2b574p20 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2884 4 OK 0x1.2347e28b432f8p21 0x1.c850c02f2b575p20 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2885 0 OK 0x1.18583aa9fbe77p21 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:2885 1 OK 0x1.75870bf1b12ccp18 -0x1.b1c692296f915p20 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG esri:2885 2 OK 0x1.00ffc9eae0d46p22 -0x1.b1c692296f915p20 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG esri:2885 3 OK 0x1.14a635d2f3422p19 0x1.c850c02f2b575p20 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2885 4 OK 0x1.eb86e7df3afdep21 0x1.c850c02f2b574p20 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG esri:2886 0 OK 0x1.4064d55810625p19 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaaep6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2886 1 OK -0x1.3f5f7b9382342p20 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.db708506af78ep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2886 2 OK 0x1.3fe22875c94b4p21 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.a5e4d04ea5dcdp6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2886 3 OK -0x1.f40210c0e3cc9p19 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.db70850622b0dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2886 4 OK 0x1.1d32eedc41245p21 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.a5e4d04f32a4dp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2887 0 OK 0x1.907e0aac08311p20 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2887 1 OK -0x1.3c4f6e4e08cc8p18 -0x1.abd3ba6b8ade3p20 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2887 2 OK 0x1.b807f875c94b3p21 -0x1.abd3ba6b8ade1p20 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2887 3 OK -0x1.36ad0c0e3cbp15 0x1.ce73b0bbe3aedp20 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2887 4 OK 0x1.9558bedc41244p21 0x1.ce73b0bbe3aeep20 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2888 0 OK 0x1.4064d55604189p21 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555554p5 0x0.0p0 F +REG esri:2888 1 OK 0x1.4272f8e8abca8p19 -0x1.abd231ddc1ef6p20 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2888 2 OK 0x1.18167638ee9f4p22 -0x1.abd231ddc1ef6p20 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcabp5 0x0.0p0 F +REG esri:2888 3 OK 0x1.cd2f60022c652p19 0x1.ce720868f3e3ep20 0x0.0p0 -0x1.e9c5da5b7805fp6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2888 4 OK 0x1.06bee955be8bfp22 0x1.ce720868f3e3ep20 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a324p5 0x0.0p0 F +REG esri:2889 0 OK 0x1.4064d54fdf3b6p18 0x1.8f79a00000002p19 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG esri:2889 1 OK -0x1.8ab24a7a7142ep20 -0x1.ccfbf1bcf9c0ep19 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2889 2 OK 0x1.15725a913070dp21 -0x1.ccfbf1bcf9c0cp19 0x0.0p0 -0x1.3d750c4376f4dp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2889 3 OK -0x1.4ee8d2df8d14cp20 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.6fe049119990cp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2889 4 OK 0x1.ef1b3d877cb38p20 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2890 0 OK 0x1.6871700000001p21 0x1.8f79a00000002p19 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG esri:2890 1 OK 0x1.ec2ec0632ddcep19 -0x1.ccfbf1bcf9c0ep19 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2890 2 OK 0x1.2aeb97f39a447p22 -0x1.ccfbf1bcf9c0ep19 0x0.0p0 -0x1.431fb6ee219f8p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG esri:2890 3 OK 0x1.31e0d7cc7b1c8p20 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.758af3bc443b6p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2890 4 OK 0x1.1bf93a0ce138fp22 0x1.49ee4776e63a2p21 0x0.0p0 -0x1.431fb6ee666f4p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG esri:2891 0 OK 0x1.907e0aac08311p20 0x1.04cae2b6b9b8fp18 0x0.0p0 -0x1.51p6 0x1.31dddddddddbep5 0x0.0p0 F +REG esri:2891 1 OK 0x1.0aeb10e9b926ep20 -0x1.feccc02444d9p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2891 2 OK 0x1.0b0882372b9dap21 -0x1.feccc02444d9p17 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG esri:2891 3 OK 0x1.1034910620ffap20 0x1.89d6f5d769755p19 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2891 4 OK 0x1.0863c228f7b14p21 0x1.89d6f5d769755p19 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999998p5 0x0.0p0 F +REG esri:2892 0 OK 0x1.907e0aac08311p20 0x1.d79a53ca86cdap20 0x0.0p0 -0x1.57p6 0x1.29111111110eep5 0x0.0p0 F +REG esri:2892 1 OK 0x1.fd4ce85362391p19 0x1.4aec624c3c355p20 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:2892 2 OK 0x1.112ad0972fa25p21 0x1.4aec624c3c355p20 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c4444444441cp5 0x0.0p0 F +REG esri:2892 3 OK 0x1.04b1690895056p20 0x1.33abac3785048p21 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:2892 4 OK 0x1.0e255627bdadep21 0x1.33abac3785048p21 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG esri:2893 0 OK 0x1.4064d553f7ceep20 0x1.3d1efd3b91184p18 0x0.0p0 -0x1.34p6 0x1.3477777777758p5 0x0.0p0 F +REG esri:2893 1 OK 0x1.3a7910c1d2dp19 -0x1.3505fec9eb6d1p18 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.263333333330ap5 0x0.0p0 F +REG esri:2893 2 OK 0x1.e38d22470635cp20 -0x1.3505fec9eb6d1p18 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.263333333330ap5 0x0.0p0 F +REG esri:2893 3 OK 0x1.4a5177c329c7dp19 0x1.dfa15d7c876a5p19 0x0.0p0 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:2893 4 OK 0x1.dba0eec65ab9ep20 0x1.dfa15d7c876a5p19 0x0.0p0 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG esri:2894 0 OK 0x1.4064d55810625p19 0x1.51cf01db587d7p21 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG esri:2894 1 OK 0x1.7b96f1026fbep14 0x1.07f21b07f43d4p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG esri:2894 2 OK 0x1.3a76799406a36p20 0x1.07f21b07f43d4p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG esri:2894 3 OK 0x1.bbb272668874p15 0x1.9dabbc7f5b328p21 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:2894 4 OK 0x1.328741c4dc1ebp20 0x1.9dabbc7f5b328p21 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG esri:2895 0 OK 0x1.907e0aac08311p20 0x1.57f5cca07ddfp16 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG esri:2895 1 OK 0x1.35d5e8a5c7bcfp20 -0x1.0b0c374f92407p18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:2895 2 OK 0x1.eb262cb248a53p20 -0x1.0b0c374f92407p18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG esri:2895 3 OK 0x1.3890cdb380795p20 0x1.bc8e2eb949a0ap18 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:2895 4 OK 0x1.e86b47a48fe8dp20 0x1.bc8e2eb949a0ap18 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeddp5 0x0.0p0 F +REG esri:2896 0 OK 0x1.907e3f28f5c29p24 0x1.9983d81e6921fp18 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG esri:2896 1 OK 0x1.831fd4ce40c4cp24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:2896 2 OK 0x1.9ddca983aac05p24 -0x1.87cb5637a220fp18 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.5d11111111102p5 0x0.0p0 F +REG esri:2896 3 OK 0x1.843129ecee803p24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.693a5d9ac6987p6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:2896 4 OK 0x1.9ccb5464fd04ep24 0x1.374ee6d6bbc56p20 0x0.0p0 -0x1.4ec5a2653967ap6 0x1.81dddddddd58ep5 0x0.0p0 F +REG esri:2897 0 OK 0x1.2c5eaf5eb851fp24 0x1.a8432a3145b09p18 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG esri:2897 1 OK 0x1.1e863b657d643p24 -0x1.962954cc373abp18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:2897 2 OK 0x1.3a372357f33fap24 -0x1.962954cc373abp18 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG esri:2897 3 OK 0x1.1f9deb7dde65ap24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG esri:2897 4 OK 0x1.391f733f923e3p24 0x1.4276ca786d39cp20 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG esri:2898 0 OK 0x1.907e3f28f5c28p23 0x1.818af27c31519p18 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa98p5 0x0.0p0 F +REG esri:2898 1 OK 0x1.7778c79e94e8bp23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553dp5 0x0.0p0 F +REG esri:2898 2 OK 0x1.a983b6b3569c4p23 -0x1.73a6428ba782ep18 0x0.0p0 -0x1.45b22d69850d4p6 0x1.435555555553dp5 0x0.0p0 F +REG esri:2898 3 OK 0x1.7927ff3c5604fp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:2898 4 OK 0x1.a7d47f15957ffp23 0x1.247b21bdc9d9bp20 0x0.0p0 -0x1.45b22d69850d4p6 0x1.65ffffffffff1p5 0x0.0p0 F +REG esri:2899 0 OK 0x1.e097400000004p19 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:2899 1 OK -0x1.c528da114b50ep19 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2899 2 OK 0x1.6195d68452d46p21 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2899 3 OK -0x1.6d13c32e22506p19 0x1.c81a512182c13p20 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2899 4 OK 0x1.4b9090cb88944p21 0x1.c81a512182c13p20 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:28991 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.58cf13579be04p2 0x1.a13fd11af807dp5 0x0.0p0 T +REG esri:28991 1 OK -0x1.2dd2b940dff49p19 -0x1.fe849c35e57b1p18 0x0.0p0 -0x1.618eba230a3f4p1 0x1.793fd11af7af3p5 0x0.0p0 T +REG esri:28991 2 OK 0x1.2dd2b940dff48p19 -0x1.fe849c35e57b1p18 0x0.0p0 0x1.b132c1e05e7p3 0x1.793fd11af7af3p5 0x0.0p0 T +REG esri:28991 3 OK -0x1.e1ca24f6cae1fp18 0x1.1de7b83eb7c7cp19 0x0.0p0 -0x1.618eba230a3e6p1 0x1.c93fd11af8333p5 0x0.0p0 T +REG esri:28991 4 OK 0x1.e1ca24f6cae1ep18 0x1.1de7b83eb7c7cp19 0x0.0p0 0x1.b132c1e05e6fep3 0x1.c93fd11af8333p5 0x0.0p0 T +REG esri:28992 0 OK 0x1.2ebcp17 0x1.c426p18 0x0.0p0 0x1.58cf13579be04p2 0x1.a13fd11af807dp5 0x0.0p0 T +REG esri:28992 1 OK -0x1.c4477281bfe92p18 -0x1.d2f4e1af2bd88p15 0x0.0p0 -0x1.618eba230a3f4p1 0x1.793fd11af7af3p5 0x0.0p0 T +REG esri:28992 2 OK 0x1.7981b940dff48p19 -0x1.d2f4e1af2bd88p15 0x0.0p0 0x1.b132c1e05e7p3 0x1.793fd11af7af3p5 0x0.0p0 T +REG esri:28992 3 OK -0x1.4a6c24f6cae1fp18 0x1.fffab83eb7c7cp19 0x0.0p0 -0x1.618eba230a3e6p1 0x1.c93fd11af8333p5 0x0.0p0 T +REG esri:28992 4 OK 0x1.3c94127b6570fp19 0x1.fffab83eb7c7cp19 0x0.0p0 0x1.b132c1e05e6fep3 0x1.c93fd11af8333p5 0x0.0p0 T +REG esri:2900 0 OK 0x1.18583aa9fbe77p21 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG esri:2900 1 OK 0x1.7741a12d48994p18 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2900 2 OK 0x1.00e42097275dep22 -0x1.b202d186cc32ep20 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG esri:2900 3 OK 0x1.13b5e779cd4d2p19 0x1.c81a512182c13p20 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2900 4 OK 0x1.ebc2fb75847bap21 0x1.c81a512182c13p20 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG esri:2901 0 OK 0x1.e0977efdf3b63p20 0x1.a6c8bd0f5d9f5p19 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG esri:2901 1 OK 0x1.3ca7fcc422cbp16 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:2901 2 OK 0x1.d6b23f17d2a06p21 -0x1.7eb6292f49305p19 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:2901 3 OK 0x1.79b79a00e21fp18 0x1.45d92b5d83149p21 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:2901 4 OK 0x1.b1608bbdd772cp21 0x1.45d92b5d83149p21 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:2902 0 OK 0x1.0853300000001p19 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:2902 1 OK -0x1.5012ec9613714p20 -0x1.b1583116d0a83p20 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2902 2 OK 0x1.2c330e4b09b8bp21 -0x1.b1583116d0a83p20 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2902 3 OK -0x1.214b93d69fd5ap20 0x1.c8cbc93457fp20 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2902 4 OK 0x1.14cf61eb4feaep21 0x1.c8cbc93457fp20 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2903 0 OK 0x1.907e0aac08311p20 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:2903 1 OK -0x1.0ef596d91f928p18 -0x1.b157317808223p20 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2903 2 OK 0x1.b25cbd872c236p21 -0x1.b157317808223p20 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2903 3 OK -0x1.4f6288ed1a5dp16 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2903 4 OK 0x1.9af91ef37104p21 0x1.c8cabbc02c8b2p20 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2904 0 OK 0x1.4c689d5604189p21 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:2904 1 OK 0x1.8927812538dcep19 -0x1.b159144e9f583p20 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2904 2 OK 0x1.1b43ad315cfcfp22 -0x1.b159144e9f583p20 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:2904 3 OK 0x1.e6b663b254474p19 0x1.c8ccb8b80cbb5p20 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2904 4 OK 0x1.0f91d0dfb98fap22 0x1.c8ccb8b80cbb5p20 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:2905 0 OK 0x1.e097400000001p18 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:2905 1 OK -0x1.64165d1827b3ap20 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2905 2 OK 0x1.2a30fe8c13d9dp21 -0x1.ad793f4f7bbc5p20 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:2905 3 OK -0x1.255c90ab4fb68p20 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2905 4 OK 0x1.0ad41855a7db4p21 0x1.ccd1e8b14ec87p20 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:2906 0 OK 0x1.907e0aa7ef9dcp19 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:2906 1 OK -0x1.1556c7aeed5ffp20 -0x1.acd32be826247p20 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2906 2 OK 0x1.52ea692b6e7eep21 -0x1.acd32be826247p20 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2906 3 OK -0x1.a7e32d0b0c67ap19 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2906 4 OK 0x1.3237d096bae8cp21 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2907 0 OK 0x1.18583aac08311p20 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:2907 1 OK -0x1.8a7b24adb9fb8p19 -0x1.acd32be826247p20 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2907 2 OK 0x1.7af703d776affp21 -0x1.acd32be826247p20 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:2907 3 OK -0x1.07b0c25aeba34p19 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2907 4 OK 0x1.5a446b42c319ep21 0x1.cd7d3f7a38512p20 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:2908 0 OK 0x1.e097400000004p19 0x1.34584a46de42dp17 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG esri:2908 1 OK 0x1.2b56a357b7e11p19 -0x1.8dc7734d32af6p17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:2908 2 OK 0x1.4aebee54240fcp20 -0x1.8dc7734d32af6p17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:2908 3 OK 0x1.30b017f7ec664p19 0x1.0051d9cc95a02p19 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:2908 4 OK 0x1.483f340409cd2p20 0x1.0051d9cc95a02p19 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:2909 0 OK 0x1.e0977efdf3b63p20 0x1.34b8635602885p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:2909 1 OK 0x1.409ca1da0a5ddp20 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:2909 2 OK 0x1.40492e10ee87bp21 -0x1.2a05ccb94d9e9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:2909 3 OK 0x1.4af8a0f982deep20 0x1.d42e49f062e38p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2909 4 OK 0x1.3b1b2e8132473p21 0x1.d42e49f062e38p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2910 0 OK 0x1.e0977efdf3b63p20 0x1.437e15732559cp18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG esri:2910 1 OK 0x1.38eb67f7cefd8p20 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:2910 2 OK 0x1.4421cb020c37ep21 -0x1.3842c2cea71fp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG esri:2910 3 OK 0x1.43cd789910c28p20 0x1.ea990182f140ap19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:2910 4 OK 0x1.3eb0c2b16b556p21 0x1.ea990182f140ap19 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:29100 0 OK 0x1.312dp22 0x1.312dp23 0x0.0p0 -0x1.bp5 0x0.0p0 0x0.0p0 T +REG esri:29100 1 OK 0x1.0f554fa7bba44p22 0x1.202017d689489p23 0x0.0p0 -0x1.d800000000001p5 -0x1.400000000001dp2 0x0.0p0 F +REG esri:29100 2 OK 0x1.5304b058445bbp22 0x1.202017d689489p23 0x0.0p0 -0x1.88p5 -0x1.400000000001dp2 0x0.0p0 F +REG esri:29100 3 OK 0x1.0f554fa7bba44p22 0x1.4239e82976b77p23 0x0.0p0 -0x1.d800000000001p5 0x1.400000000001dp2 0x0.0p0 F +REG esri:29100 4 OK 0x1.5304b058445bbp22 0x1.4239e82976b77p23 0x0.0p0 -0x1.88p5 0x1.400000000001dp2 0x0.0p0 F +REG esri:2911 0 OK 0x1.e097400000001p20 0x1.3a030d3f271b9p18 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG esri:2911 1 OK 0x1.3f60bce6c66c4p20 -0x1.32d2652c23557p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:2911 2 OK 0x1.40e6e18c9cc9fp21 -0x1.32d2652c23557p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:2911 3 OK 0x1.466e4a61d6404p20 0x1.da8d3177bcd09p19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:2911 4 OK 0x1.3d601acf14dffp21 0x1.da8d3177bcd09p19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:29118 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:29118 1 OK -0x1.ad790f972c8ep15 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:29118 2 OK 0x1.018fc87cb964ep20 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG esri:29118 3 OK -0x1.ad790f972c8ep15 0x1.0ee39779b3609p19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:29118 4 OK 0x1.018fc87cb964ep20 0x1.0ee39779b3609p19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG esri:29119 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:29119 1 OK -0x1.ad790f972c9bp15 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG esri:29119 2 OK 0x1.018fc87cb9647p20 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:29119 3 OK -0x1.ad790f972c9bp15 0x1.0ee39779b3609p19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG esri:29119 4 OK 0x1.018fc87cb9647p20 0x1.0ee39779b3609p19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:2912 0 OK 0x1.e097400000001p20 0x1.519f1c006077dp18 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG esri:2912 1 OK 0x1.332c99d21eedep20 -0x1.49c9fd9e63856p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:2912 2 OK 0x1.4700f316f0892p21 -0x1.49c9fd9e63856p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:2912 3 OK 0x1.3addbc4eed52bp20 0x1.fe4a15bf17bf8p19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:2912 4 OK 0x1.432861d88956cp21 0x1.fe4a15bf17bf8p19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:29120 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:29120 1 OK -0x1.ad790f972c9bp15 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG esri:29120 2 OK 0x1.018fc87cb9647p20 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:29120 3 OK -0x1.ad790f972c9bp15 0x1.0ee39779b3609p19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG esri:29120 4 OK 0x1.018fc87cb9647p20 0x1.0ee39779b3609p19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:29121 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:29121 1 OK -0x1.ad790f972c81p15 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29121 2 OK 0x1.018fc87cb965p20 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG esri:29121 3 OK -0x1.ad790f972c81p15 0x1.0ee39779b3609p19 0x0.0p0 -0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29121 4 OK 0x1.018fc87cb965p20 0x1.0ee39779b3609p19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG esri:29122 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:29122 1 OK -0x1.ad790f972c8ep15 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG esri:29122 2 OK 0x1.018fc87cb964ep20 -0x1.0ee39779b3609p19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG esri:29122 3 OK -0x1.ad790f972c8ep15 0x1.0ee39779b3609p19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG esri:29122 4 OK 0x1.018fc87cb964ep20 0x1.0ee39779b3609p19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG esri:2913 0 OK 0x1.f49dcef3b645ap22 0x1.9f5d69ea0c575p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG esri:2913 1 OK 0x1.be6bd8f414e0ap22 -0x1.8dd691120b052p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:2913 2 OK 0x1.1567e279abd55p23 -0x1.8dd691120b052p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:2913 3 OK 0x1.c2a6724db24d8p22 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:2913 4 OK 0x1.134a95ccdd1eep23 0x1.3baa16c19f2d3p20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:2914 0 OK 0x1.2c5eaf5f3b645p22 0x1.9f381cdd6b7ebp18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:2914 1 OK 0x1.eca493063e29p21 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:2914 2 OK 0x1.626b153b57b42p22 -0x1.8eec4a1e4e302p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:2914 3 OK 0x1.f487d65627d97p21 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG esri:2914 4 OK 0x1.5e79739362dbfp22 0x1.3b4ad02ce4bf7p20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG esri:2915 0 OK 0x1.e097400000001p20 0x1.7249af14fd5f7p18 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG esri:2915 1 OK 0x1.21cff166c8dcep20 -0x1.686fc945bcc3ap18 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:2915 2 OK 0x1.4faf474c9b922p21 -0x1.686fc945bcc3ap18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:2915 3 OK 0x1.2b7ae3b3fa77ep20 0x1.181e65e2f759ep20 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:2915 4 OK 0x1.4ad9ce2602c4ap21 0x1.181e65e2f759ep20 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:2916 0 OK 0x1.4064d55810625p19 0x1.c0fe8fdb3116fp21 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG esri:2916 1 OK -0x1.3f2832962a474p17 0x1.61539a6f805e1p21 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG esri:2916 2 OK 0x1.6849dbaad5aa2p20 0x1.61539a6f805e1p21 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG esri:2916 3 OK -0x1.d6bce3b2d8b88p16 0x1.11a734805e99ap22 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:2916 4 OK 0x1.5dd0a3933decep20 0x1.11a734805e99ap22 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:2917 0 OK 0x1.e097400000001p20 0x1.aa07448f1fd1dp22 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG esri:2917 1 OK 0x1.0e08d221ed15ep20 0x1.77a266cdd041ep22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:2917 2 OK 0x1.5992d6ef09752p21 0x1.77a266cdd041ep22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:2917 3 OK 0x1.18ae070a39686p20 0x1.ddc50c43a4fbcp22 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:2917 4 OK 0x1.54403c7ae34bep21 0x1.ddc50c43a4fbcp22 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:29177 0 OK 0x1.e848p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.44p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29177 1 OK -0x1.fbecc011f0b4p14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29177 2 OK 0x1.f82766008f85ap19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29177 3 OK -0x1.2fda3e7ed2bbp16 0x1.daca8256e9536p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29177 4 OK 0x1.0721a3e7ed2bbp20 0x1.daca8256e9536p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29178 0 OK 0x1.e848p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.2cp6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29178 1 OK -0x1.fbecc011f0b4p14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29178 2 OK 0x1.f82766008f85ap19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29178 3 OK -0x1.2fda3e7ed2bbp16 0x1.daca8256e9536p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29178 4 OK 0x1.0721a3e7ed2bbp20 0x1.daca8256e9536p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29179 0 OK 0x1.e848p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.14p6 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29179 1 OK -0x1.fbecc011f0cap14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29179 2 OK 0x1.f82766008f85ap19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29179 3 OK -0x1.2fda3e7ed2c1p16 0x1.daca8256e9536p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29179 4 OK 0x1.0721a3e7ed2bbp20 0x1.daca8256e9536p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:2918 0 OK 0x1.18583aa9fbe77p21 0x1.38abba7c13554p23 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG esri:2918 1 OK 0x1.66573f1cbd665p20 0x1.205b8ceeb4ae2p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:2918 2 OK 0x1.7d84d5c5991c4p21 0x1.205b8ceeb4ae2p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:2918 3 OK 0x1.6f78cd5a43b2p20 0x1.518fea6f3bd32p23 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:2918 4 OK 0x1.78f40ea6d5f67p21 0x1.518fea6f3bd32p23 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:29180 0 OK 0x1.e848p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.f8p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29180 1 OK -0x1.fbecc011f0b4p14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29180 2 OK 0x1.f82766008f865p19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29180 3 OK -0x1.2fda3e7ed2bbp16 0x1.daca8256e9536p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29180 4 OK 0x1.0721a3e7ed2c1p20 0x1.daca8256e9536p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29181 0 OK 0x1.e848000000016p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.c800000000001p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29181 1 OK -0x1.fbecc011f09ep14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29181 2 OK 0x1.f82766008f86fp19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29181 3 OK -0x1.2fda3e7ed2b5p16 0x1.daca8256e9536p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:29181 4 OK 0x1.0721a3e7ed2c6p20 0x1.daca8256e9536p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29182 0 OK 0x1.e84800000000bp18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.98p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29182 1 OK -0x1.fbecc011f0b4p14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29182 2 OK 0x1.f82766008f865p19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29182 3 OK -0x1.2fda3e7ed2bbp16 0x1.daca8256e9536p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29182 4 OK 0x1.0721a3e7ed2c1p20 0x1.daca8256e9536p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29183 0 OK 0x1.e848p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.68p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29183 1 OK -0x1.fbecc011f0cp14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29183 2 OK 0x1.f82766008f86p19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29183 3 OK -0x1.2fda3e7ed2be8p16 0x1.daca8256e9536p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29183 4 OK 0x1.0721a3e7ed2bep20 0x1.daca8256e9536p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29184 0 OK 0x1.e847ffffffff5p18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.38p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29184 1 OK -0x1.fbecc011f0d4p14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29184 2 OK 0x1.f82766008f85ap19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29184 3 OK -0x1.2fda3e7ed2c4p16 0x1.daca8256e9536p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29184 4 OK 0x1.0721a3e7ed2bbp20 0x1.daca8256e9536p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29185 0 OK 0x1.e84800000000bp18 0x1.b9978b6877d54p22 0x0.0p0 -0x1.08p5 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29185 1 OK -0x1.fbecc011f0b4p14 0x1.97011f05bfacdp22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29185 2 OK 0x1.f82766008f865p19 0x1.97011f05bfacdp22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29185 3 OK -0x1.2fda3e7ed2bbp16 0x1.daca8256e9536p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29185 4 OK 0x1.0721a3e7ed2c1p20 0x1.daca8256e9536p22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.4000000000002p4 0x0.0p0 F +REG esri:2919 0 OK 0x1.e097400000001p20 0x1.9e15d995fed92p23 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG esri:2919 1 OK 0x1.00cc87766a53p20 0x1.833abe4c7b5aap23 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:2919 2 OK 0x1.6030fc44cad6p21 0x1.833abe4c7b5aap23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:2919 3 OK 0x1.0b39a79d764ecp20 0x1.b999bb2d94be9p23 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG esri:2919 4 OK 0x1.5afa6c3144d82p21 0x1.b999bb2d94be9p23 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG esri:2920 0 OK 0x1.e097400000004p19 0x1.0050fa9056718p24 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG esri:2920 1 OK 0x1.5a737b3449568p17 0x1.e8d4dcffe75a3p23 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:2920 2 OK 0x1.b548d09976d69p20 0x1.e8d4dcffe75a3p23 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:2920 3 OK 0x1.959b7d15aec2p17 0x1.0c736d9d8321ap24 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:2920 4 OK 0x1.ade3d05d4a292p20 0x1.0c736d9d8321ap24 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:2921 0 OK 0x1.907e3f2b020c4p20 0x1.b0bcb31dc80ddp21 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG esri:2921 1 OK 0x1.0c2d791b0ddfdp20 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:2921 2 OK 0x1.0a67829d7b1c6p21 0x1.70fa94fcfcc93p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:2921 3 OK 0x1.11e2dc82e7e8p20 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:2921 4 OK 0x1.078cd0e98e184p21 0x1.f1f054b57fea5p21 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:2922 0 OK 0x1.907e3f2b020c4p20 0x1.aa3e8395be8cep22 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG esri:2922 1 OK 0x1.7593ba36d54f5p19 0x1.77a162f228e24p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG esri:2922 2 OK 0x1.3319509d4cb7fp21 0x1.77a162f228e24p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG esri:2922 3 OK 0x1.913c3b56f469ap19 0x1.de9a059a5b245p22 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:2922 4 OK 0x1.2c2f305544f16p21 0x1.de9a059a5b245p22 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:29220 0 OK 0x1.e894a9c74c109p18 0x1.b9962fdc09811p22 -0x1.4a1f14d48p5 -0x1.f7ffffffffffep5 -0x1.9000000000003p4 -0x1.0p-30 F +REG esri:29220 1 OK -0x1.f72675075ffep14 0x1.96ffbcc2815fp22 -0x1.f587e1d72p5 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:29220 2 OK 0x1.f84dddc4df418p19 0x1.96ffbcc16e358p22 -0x1.7384bdcbp3 -0x1.cbdd68fcf51a2p5 -0x1.e000000000003p4 0x0.0p0 F +REG esri:29220 3 OK -0x1.2ea9b40b6dc2p16 0x1.dac92d52b0c1p22 -0x1.2cb533837p6 -0x1.12114b818572ep6 -0x1.4000000000001p4 0x0.0p0 F +REG esri:29220 4 OK 0x1.0734f06470864p20 0x1.dac92d51ab0a2p22 -0x1.3c00d099p4 -0x1.cbdd68fcf51a2p5 -0x1.4000000000003p4 -0x1.0p-30 F +REG esri:29221 0 OK 0x1.e88f8b4f1a822p18 0x1.b9966461ad2a9p22 -0x1.a31ba7e48p3 -0x1.c800000000001p5 -0x1.9000000000002p4 -0x1.0p-29 F +REG esri:29221 1 OK -0x1.f76f61b901f2p14 0x1.96fffb553c44cp22 -0x1.118e7962p5 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x1.0p-30 F +REG esri:29221 2 OK 0x1.f84b06ad8bda3p19 0x1.96fffb543b546p22 0x1.af3b48fb8p3 -0x1.9bdd68fcf51a3p5 -0x1.e000000000003p4 0x0.0p0 F +REG esri:29221 3 OK -0x1.2ebb887dfe8p16 0x1.dac9582df71fdp22 -0x1.620c55286p5 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:29221 4 OK 0x1.07337e6ae3e9cp20 0x1.dac9582d02c14p22 0x1.de0ff12bp2 -0x1.9bdd68fcf51a3p5 -0x1.3fffffffffffep4 0x1.0p-29 F +REG esri:2923 0 OK 0x1.907e3f2b020c4p20 0x1.35b8f277f903cp23 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG esri:2923 1 OK 0x1.edab35460106dp19 0x1.233be022151cdp23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:2923 2 OK 0x1.151371d981ca1p21 0x1.233be022151cdp23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:2923 3 OK 0x1.fb40883a07bdp19 0x1.48a3d66522362p23 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG esri:2923 4 OK 0x1.11ae1d1c801c8p21 0x1.48a3d66522362p23 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG esri:2924 0 OK 0x1.5e6e495581062p23 0x1.a18871711cb36p22 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG esri:2924 1 OK 0x1.4cf5197041bfep23 0x1.7fd2a21fc5129p22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:2924 2 OK 0x1.6fe7793ac04c6p23 0x1.7fd2a21fc5129p22 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:2924 3 OK 0x1.4daf24ae73916p23 0x1.c3fa9abc48ea7p22 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:2924 4 OK 0x1.6f2d6dfc8e7aep23 0x1.c3fa9abc48ea7p22 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:2925 0 OK 0x1.5e6e495581062p23 0x1.b4c9df24ac0d5p21 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG esri:2925 1 OK 0x1.4bcff5cb476d2p23 0x1.6d000dc7b0a53p21 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:2925 2 OK 0x1.710c9cdfba9f2p23 0x1.6d000dc7b0a53p21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:2925 3 OK 0x1.4c99ab85b93f8p23 0x1.fe2bf52fc2ep21 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG esri:2925 4 OK 0x1.7042e72548cccp23 0x1.fe2bf52fc2ep21 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG esri:2926 0 OK 0x1.907e0aac08311p20 0x1.34b943da25dcp18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:2926 1 OK 0x1.e1046a555e299p19 -0x1.2a05dbbd41b1cp18 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:2926 2 OK 0x1.183cf016b0a79p21 -0x1.2a05dbbd41b1cp18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:2926 3 OK 0x1.f5bf3365debfap19 0x1.d42f38a973c72p19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2926 4 OK 0x1.130e3dd29082p21 0x1.d42f38a973c72p19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:2927 0 OK 0x1.907e0aac08311p20 0x1.641db43fe1661p18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG esri:2927 1 OK 0x1.aeba938e29b67p19 -0x1.5696ad3494dp18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:2927 2 OK 0x1.24cf65c87dc37p21 -0x1.5696ad3494dp18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:2927 3 OK 0x1.c8e23804965a7p19 0x1.0e4ce207389b5p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:2927 4 OK 0x1.1e457caae29a7p21 0x1.0e4ce207389b5p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:2928 0 OK 0x1.e097400000001p20 0x1.1ce0d17f7cab5p18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG esri:2928 1 OK 0x1.4d9405f33b66ep20 -0x1.1462814d34f0fp18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:2928 2 OK 0x1.39cd3d06624cap21 -0x1.1462814d34f0fp18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:2928 3 OK 0x1.55d5a07b34e9bp20 0x1.af67f5201dfecp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:2928 4 OK 0x1.35ac6fc2658b4p21 0x1.af67f5201dfecp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:2929 0 OK 0x1.e097400000001p20 0x1.28adfc81f178p18 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG esri:2929 1 OK 0x1.477bd35a7b7eep20 -0x1.1fe0500f281bbp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:2929 2 OK 0x1.3cd95652c240ap21 -0x1.1fe0500f281bbp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:2929 3 OK 0x1.500ba7b16b42p20 0x1.c143a7a70eb87p19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:2929 4 OK 0x1.38916c274a5f1p21 0x1.c143a7a70eb87p19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:2930 0 OK 0x1.e097400000001p20 0x1.6fca8cd604f06p18 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG esri:2930 1 OK 0x1.21d65e6fa50bep20 -0x1.62f2a3777f0e4p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:2930 2 OK 0x1.4fac10c82d79bp21 -0x1.62f2a3777f0e4p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:2930 3 OK 0x1.2e4ecb4ca0019p20 0x1.16ea191559a8cp20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:2930 4 OK 0x1.496fda59affedp21 0x1.16ea191559a8cp20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:2931 0 OK 0x1.907e0aaaaaaadp20 0x0.0p0 0x0.0p0 0x1.ap3 0x0.0p0 0x0.0p0 T +REG esri:2931 1 OK -0x1.604f16dbd7e08p17 -0x1.bc54293b4108cp20 0x0.0p0 0x1.00000000f0679p3 -0x1.3fffffffea4bcp2 0x0.0p0 F +REG esri:2931 2 OK 0x1.a682fc186828cp21 -0x1.bc54293b4108cp20 0x0.0p0 0x1.1fffffff87cc4p4 -0x1.3fffffffea4bcp2 0x0.0p0 F +REG esri:2931 3 OK -0x1.604f16dbd7e08p17 0x1.bc54293b4108cp20 0x0.0p0 0x1.00000000f0679p3 0x1.3fffffffea4bcp2 0x0.0p0 F +REG esri:2931 4 OK 0x1.a682fc186828cp21 0x1.bc54293b4108cp20 0x0.0p0 0x1.1fffffff87cc4p4 0x1.3fffffffea4bcp2 0x0.0p0 F +REG esri:2932 0 OK 0x1.86c69e77952f6p17 0x1.24e54aa449c66p18 0x1.d5d9806a4p4 0x1.99bbbbbbedfd6p5 0x1.87333332e8d99p4 0x1.4987p-13 F +REG esri:2932 1 OK -0x1.70838f32a67b6p18 -0x1.dd7df4c04edep17 0x1.706197dep4 0x1.6dcaf9f8fa40bp5 0x1.37333332c22fbp4 0x1.43718p-13 F +REG esri:2932 2 OK 0x1.7ba4441aa8d8fp19 -0x1.dd8144ff8722cp17 0x1.4454d158ap5 0x1.c5ac7d7ed8435p5 0x1.37333332c697fp4 0x1.ae0dp-13 F +REG esri:2932 3 OK -0x1.4561375d864cap18 0x1.a71bbaa244136p19 0x1.dfbdc8f2p3 0x1.6dcaf9f8d64a7p5 0x1.d7333332b9755p4 0x1.d8a8p-14 F +REG esri:2932 4 OK 0x1.6614c658f6705p19 0x1.a71ae45d2e8c9p19 0x1.f2a15e854p4 0x1.c5ac7d7f0d3bap5 0x1.d7333332b6f2p4 0x1.581d8p-13 F +REG esri:2933 0 OK 0x1.e83ba9a2783dp18 0x1.b996d108210eep22 0x1.af8fcb44cp4 0x1.d400000000002p6 -0x1.8fffffffffffdp4 0x1.0p-29 F +REG esri:2933 1 OK -0x1.fc971bd05004p14 0x1.9700764672f6ep22 0x1.04458acfbp6 0x1.bdeeb47e7a8d3p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG esri:2933 2 OK 0x1.f820627720752p19 0x1.970076469f0bp22 0x1.c6c4dd56ap5 0x1.ea114b818573p6 -0x1.dfffffffffffep4 0x1.0p-30 F +REG esri:2933 3 OK -0x1.300977b82d338p16 0x1.dac9b74a24b4p22 0x1.190a781a8p3 0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 -0x1.0p-29 F +REG esri:2933 4 OK 0x1.071e6c41761b6p20 0x1.dac9b74a4e942p22 -0x1.1c0f9aep-3 0x1.ea114b818573p6 -0x1.3fffffffffffdp4 0x1.0p-30 F +REG esri:29333 0 OK 0x1.e84800000001cp18 0x1.b99b531b17c72p22 0x0.0p0 0x1.dffffffffffffp3 -0x1.9000000000001p4 0x0.0p0 F +REG esri:29333 1 OK -0x1.fb05845f84e6p14 0x1.9705b86793c42p22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29333 2 OK 0x1.f8202c22fc291p19 0x1.9705b86793c41p22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:29333 3 OK -0x1.2f9c4bb525398p16 0x1.dacd86a73a3aap22 0x0.0p0 0x1.2f75a3f3d468fp3 -0x1.4000000000002p4 0x0.0p0 F +REG esri:29333 4 OK 0x1.071dc4bb5254ap20 0x1.dacd86a73a3aap22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.4000000000001p4 0x0.0p0 F +REG esri:2934 0 OK -0x1.e565823a0c9b8p22 0x1.b774000000006p19 0x0.0p0 0x1.b19d8d672c76bp7 0x0.0p0 0x0.0p0 F +REG esri:2934 1 OK -0x1.03a19fb25810ap23 0x1.53f875a6d736ap18 0x0.0p0 0x1.a79d8d672c76bp7 -0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:2934 2 OK -0x1.c387c50f6915cp22 0x1.53f875a6d736ap18 0x0.0p0 0x1.bb9d8d672c76bp7 -0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:2934 3 OK -0x1.03a19fb25810ap23 0x1.6275e2964a32bp20 0x0.0p0 0x1.a79d8d672c76bp7 0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:2934 4 OK -0x1.c387c50f6915cp22 0x1.6275e2964a32bp20 0x0.0p0 0x1.bb9d8d672c76bp7 0x1.3fffffffffe21p2 0x0.0p0 F +REG esri:2935 0 OK 0x1.3d62p20 0x0.0p0 0x0.0p0 0x1.4c44444444444p5 0x1.ddddddddddde2p-4 0x0.0p0 T +REG esri:2935 1 OK 0x1.6b9f679cd7da5p19 -0x1.0efa1eb734634p19 0x0.0p0 0x1.24443ed54445p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2935 2 OK 0x1.c4f44c319413p20 -0x1.0efa1eb734634p19 0x0.0p0 0x1.744449b344438p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2935 3 OK 0x1.6bb817db6bbffp19 0x1.0f069495ad151p19 0x0.0p0 0x1.24443ed543b05p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2935 4 OK 0x1.c4e7f4124a204p20 0x1.0f069495ad151p19 0x0.0p0 0x1.744449b344d84p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2936 0 OK 0x1.18c3p21 0x0.0p0 0x0.0p0 0x1.6444444444444p5 0x1.ddddddddddde2p-4 0x0.0p0 T +REG esri:2936 1 OK 0x1.a9f3b3ce6bedp20 -0x1.0efa1eb734634p19 0x0.0p0 0x1.3c443ed54445p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2936 2 OK 0x1.5c8c2618ca097p21 -0x1.0efa1eb734634p19 0x0.0p0 0x1.8c4449b344438p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2936 3 OK 0x1.aa000bedb5dfcp20 0x1.0f069495ad151p19 0x0.0p0 0x1.3c443ed543b04p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2936 4 OK 0x1.5c85fa09251p21 0x1.0f069495ad151p19 0x0.0p0 0x1.8c4449b344d84p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2937 0 OK 0x1.92d5p21 0x0.0p0 0x0.0p0 0x1.7c44444444444p5 0x1.ddddddddddde2p-4 0x0.0p0 T +REG esri:2937 1 OK 0x1.4f0bd9e735f69p21 -0x1.0efa1eb734634p19 0x0.0p0 0x1.54443ed544451p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2937 2 OK 0x1.d69e2618ca097p21 -0x1.0efa1eb734634p19 0x0.0p0 0x1.a44449b344438p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2937 3 OK 0x1.4f1205f6dafp21 0x1.0f069495ad151p19 0x0.0p0 0x1.54443ed543b05p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2937 4 OK 0x1.d697fa09251p21 0x1.0f069495ad151p19 0x0.0p0 0x1.a44449b344d83p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2938 0 OK 0x1.06738p22 0x0.0p0 0x0.0p0 0x1.9444444444444p5 0x1.ddddddddddde2p-4 0x0.0p0 T +REG esri:2938 1 OK 0x1.c91dd9e735f69p21 -0x1.0efa1eb734634p19 0x0.0p0 0x1.6c443ed54445p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2938 2 OK 0x1.2858130c6504cp22 -0x1.0efa1eb734634p19 0x0.0p0 0x1.bc4449b344438p5 -0x1.3888888873debp2 0x0.0p0 F +REG esri:2938 3 OK 0x1.c92405f6dafp21 0x1.0f069495ad151p19 0x0.0p0 0x1.6c443ed543b05p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2938 4 OK 0x1.2854fd0492881p22 0x1.0f069495ad151p19 0x0.0p0 0x1.bc4449b344d84p5 0x1.4777777761e65p2 0x0.0p0 F +REG esri:2939 0 OK 0x1.18c3p21 0x0.0p0 0x0.0p0 0x1.9622222222223p5 0x1.111111111110fp-3 0x0.0p0 T +REG esri:2939 1 OK 0x1.a9f2d20f4cb39p20 -0x1.0ef93b0174248p19 0x0.0p0 0x1.6e221b093eebep5 -0x1.3777777762de7p2 0x0.0p0 F +REG esri:2939 2 OK 0x1.5c8c96f859a64p21 -0x1.0ef93b0174248p19 0x0.0p0 0x1.be22293b05588p5 -0x1.3777777762de7p2 0x0.0p0 F +REG esri:2939 3 OK 0x1.aa00eda12c816p20 0x1.0f0778925e0c2p19 0x0.0p0 0x1.6e221b093e41fp5 0x1.4888888872e7p2 0x0.0p0 F +REG esri:2939 4 OK 0x1.5c85892f69bf5p21 0x1.0f0778925e0c2p19 0x0.0p0 0x1.be22293b06027p5 0x1.4888888872e7p2 0x0.0p0 F +REG esri:2940 0 OK 0x1.92d5p21 0x0.0p0 0x0.0p0 0x1.ae22222222224p5 0x1.111111111110fp-3 0x0.0p0 T +REG esri:2940 1 OK 0x1.4f0b6907a659bp21 -0x1.0ef93b0174248p19 0x0.0p0 0x1.86221b093eebdp5 -0x1.3777777762de7p2 0x0.0p0 F +REG esri:2940 2 OK 0x1.d69e96f859a64p21 -0x1.0ef93b0174248p19 0x0.0p0 0x1.d622293b0558ap5 -0x1.3777777762de7p2 0x0.0p0 F +REG esri:2940 3 OK 0x1.4f1276d09640ap21 0x1.0f0778925e0c2p19 0x0.0p0 0x1.86221b093e41fp5 0x1.4888888872e7p2 0x0.0p0 F +REG esri:2940 4 OK 0x1.d697892f69bf5p21 0x1.0f0778925e0c2p19 0x0.0p0 0x1.d622293b06028p5 0x1.4888888872e7p2 0x0.0p0 F +REG esri:2941 0 OK 0x1.06738p22 0x0.0p0 0x0.0p0 0x1.c622222222223p5 0x1.111111111110fp-3 0x0.0p0 T +REG esri:2941 1 OK 0x1.c91d6907a659cp21 -0x1.0ef93b0174248p19 0x0.0p0 0x1.9e221b093eebep5 -0x1.3777777762de7p2 0x0.0p0 F +REG esri:2941 2 OK 0x1.28584b7c2cd32p22 -0x1.0ef93b0174248p19 0x0.0p0 0x1.ee22293b05589p5 -0x1.3777777762de7p2 0x0.0p0 F +REG esri:2941 3 OK 0x1.c92476d09640bp21 0x1.0f0778925e0c2p19 0x0.0p0 0x1.9e221b093e41fp5 0x1.4888888872e7p2 0x0.0p0 F +REG esri:2941 4 OK 0x1.2854c497b4dfbp22 0x1.0f0778925e0c2p19 0x0.0p0 0x1.ee22293b06028p5 0x1.4888888872e7p2 0x0.0p0 F +REG esri:2942 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2942 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2942 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2942 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2942 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:2943 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:2943 1 OK -0x1.ada0e5629f8bp15 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2943 2 OK 0x1.0191072b14fb6p20 -0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:2943 3 OK -0x1.ada0e5629f8bp15 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:2943 4 OK 0x1.0191072b14fb6p20 0x1.0ee4204ce17dp19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:2944 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG esri:2944 1 OK -0x1.e8f08b04c4de4p17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2944 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2944 3 OK -0x1.e8f08b04c4de4p17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2944 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2945 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG esri:2945 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2945 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2945 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2945 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2946 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2946 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2946 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2946 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2946 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2947 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG esri:2947 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2947 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2947 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2947 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2948 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG esri:2948 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2948 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2948 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2948 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2949 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG esri:2949 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2949 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2949 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2949 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2950 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG esri:2950 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2950 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2950 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2950 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2951 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG esri:2951 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2951 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2951 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2951 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2952 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG esri:2952 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2952 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2952 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2952 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:2953 0 OK 0x1.312dp21 0x1.c9c38p22 0x0.0p0 -0x1.0ap6 0x1.73ffffffffffap5 0x0.0p0 T +REG esri:2953 1 OK 0x1.ce24f990ab45dp20 0x1.a9788be1b72edp22 0x0.0p0 -0x1.270e06f120d03p6 0x1.4bffffffffffp5 0x0.0p0 T +REG esri:2953 2 OK 0x1.7b478337aa5cfp21 0x1.a9788be1b72edp22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.4bffffffffffp5 0x0.0p0 T +REG esri:2953 3 OK 0x1.e71082afdbc56p20 0x1.ed3306998dc17p22 0x0.0p0 -0x1.270e06f120d03p6 0x1.9bffffffffb3fp5 0x0.0p0 T +REG esri:2953 4 OK 0x1.6ed1bea8121d3p21 0x1.ed3306998dc17p22 0x0.0p0 -0x1.d9e3f21dbe5fcp5 0x1.9bffffffffb3fp5 0x0.0p0 T +REG esri:2954 0 OK 0x1.86ap18 0x1.86ap19 0x0.0p0 -0x1.f8p5 0x1.79ffffffff65p5 0x0.0p0 T +REG esri:2954 1 OK -0x1.97092222a012cp17 0x1.094799c23e3f8p18 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2954 2 OK 0x1.ec624888a8046p19 0x1.094799c23e3f8p18 0x0.0p0 -0x1.bd129258af178p5 0x1.51fffffffffedp5 0x0.0p0 T +REG esri:2954 3 OK -0x1.94b14045c7f18p16 0x1.513519b2f7486p20 0x0.0p0 -0x1.1976b6d3a8744p6 0x1.a1ffffffffbddp5 0x0.0p0 T +REG esri:2954 4 OK 0x1.b9362808b8fep19 0x1.513519b2f7486p20 0x0.0p0 -0x1.bd129258af178p5 0x1.a1ffffffffbddp5 0x0.0p0 T +REG esri:2955 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:2955 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 -0x1.4p2 0x0.0p0 F +REG esri:2955 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 -0x1.4p2 0x0.0p0 F +REG esri:2955 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.e8p6 0x1.4p2 0x0.0p0 F +REG esri:2955 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp6 0x1.4p2 0x0.0p0 F +REG esri:2956 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:2956 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG esri:2956 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG esri:2956 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG esri:2956 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.a8p6 0x1.4p2 0x0.0p0 F +REG esri:2957 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:2957 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG esri:2957 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 -0x1.4p2 0x0.0p0 F +REG esri:2957 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.b8p6 0x1.4p2 0x0.0p0 F +REG esri:2957 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.9p6 0x1.4p2 0x0.0p0 F +REG esri:2958 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:2958 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG esri:2958 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG esri:2958 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG esri:2958 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG esri:2959 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:2959 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:2959 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG esri:2959 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:2959 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG esri:2960 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:2960 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG esri:2960 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:2960 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG esri:2960 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:2961 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:2961 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG esri:2961 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:2961 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG esri:2961 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:2962 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:2962 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG esri:2962 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG esri:2962 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG esri:2962 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG esri:29635 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:29635 1 OK -0x1.ad89324e3d9bp15 -0x1.0edd0485be135p19 0x0.0p0 0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29635 2 OK 0x1.0190499271ecep20 -0x1.0edd0485be135p19 0x0.0p0 0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29635 3 OK -0x1.ad89324e3d9bp15 0x1.0edd0485be135p19 0x0.0p0 0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29635 4 OK 0x1.0190499271ecep20 0x1.0edd0485be135p19 0x0.0p0 0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29636 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:29636 1 OK -0x1.ad89324e3da1p15 -0x1.0edd0485be135p19 0x0.0p0 0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29636 2 OK 0x1.0190499271ecbp20 -0x1.0edd0485be135p19 0x0.0p0 0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29636 3 OK -0x1.ad89324e3da1p15 0x1.0edd0485be135p19 0x0.0p0 0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29636 4 OK 0x1.0190499271ecbp20 0x1.0edd0485be135p19 0x0.0p0 0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:29700 0 OK 0x1.4760afa23074fp17 0x1.293ad2f936af3p19 0x1.2369363b4p4 0x1.737f7201d00eep5 -0x1.2e6666666656p4 0x1.0p-29 F +REG esri:29700 1 OK -0x1.2284eed97457cp17 -0x1.96dff3d0f09c8p16 0x1.657349a2p1 0x1.4937e5cc680edp5 -0x1.7e66666666584p4 -0x1.0p-29 F +REG esri:29700 2 OK 0x1.a60954722e47fp19 0x1.fcc09d925243p17 0x1.f4267bbcp2 0x1.9dc6fe37380eep5 -0x1.7e66666666584p4 -0x1.0p-30 F +REG esri:29700 3 OK -0x1.0ffffbb49deaep19 0x1.c7698d283271p19 0x1.92092b21p4 0x1.4937e5cc680eep5 -0x1.bcccccccccac6p3 -0x1.0p-30 F +REG esri:29700 4 OK 0x1.fecdf14363f81p18 0x1.40df27bbca461p20 0x1.e75ac56dcp4 0x1.9dc6fe37380efp5 -0x1.bcccccccccac4p3 0x1.0p-30 F +REG esri:29738 0 OK 0x1.e8515d8bb0876p18 0x1.b99951915c5bcp22 0x1.83668bc8p1 0x1.68p5 -0x1.9000000000001p4 -0x1.0p-30 F +REG esri:29738 1 OK -0x1.fb5279d1c92p14 0x1.9702edeaf0763p22 -0x1.c3f400dp3 0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffcp4 0x1.0p-30 F +REG esri:29738 2 OK 0x1.f82bf1666accap19 0x1.9702edeaced42p22 -0x1.f88745c4p2 0x1.942297030ae5ep5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG esri:29738 3 OK -0x1.2fb157c5a5498p16 0x1.dacc402524dc4p22 0x1.46945c398p3 0x1.3bdd68fcf51a3p5 -0x1.3fffffffffffdp4 0x0.0p0 F +REG esri:29738 4 OK 0x1.0723c4493802p20 0x1.dacc402504dacp22 0x1.0fa08c864p4 0x1.942297030ae5dp5 -0x1.4000000000003p4 0x1.0p-29 F +REG esri:29739 0 OK 0x1.e8495a6af2efap18 0x1.b999555db548ap22 0x1.44141e62p2 0x1.98p5 -0x1.9000000000002p4 0x1.8p-29 F +REG esri:29739 1 OK -0x1.fbd2063db9dap14 0x1.9702f27154105p22 -0x1.308822dp3 0x1.6bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x1.0p-30 F +REG esri:29739 2 OK 0x1.f827ea9ea352ap19 0x1.9702f2714f344p22 -0x1.13add4b58p3 0x1.c42297030ae5ep5 -0x1.dfffffffffffcp4 -0x1.8p-29 F +REG esri:29739 3 OK -0x1.2fd1337806a08p16 0x1.dacc433e7c7dep22 0x1.e68a6f318p3 0x1.6bdd68fcf51a3p5 -0x1.4000000000001p4 0x1.8p-29 F +REG esri:29739 4 OK 0x1.0721c06dfd786p20 0x1.dacc433e77dep22 0x1.02ec83aecp4 0x1.c42297030ae5dp5 -0x1.3fffffffffffep4 -0x1.0p-29 F +REG esri:29849 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:29849 1 OK -0x1.ace2d4a63ff2p15 -0x1.0ede284d4766dp19 0x0.0p0 0x1.a8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:29849 2 OK 0x1.018b16a53201ep20 -0x1.0ede284d4766ep19 0x0.0p0 0x1.d000000000001p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:29849 3 OK -0x1.ace2d4a63ff2p15 0x1.0ede284d4766dp19 0x0.0p0 0x1.a8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:29849 4 OK 0x1.018b16a53201ep20 0x1.0ede284d4766ep19 0x0.0p0 0x1.d000000000001p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:29850 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:29850 1 OK -0x1.ace2d4a6400ap15 -0x1.0ede284d4766dp19 0x0.0p0 0x1.cp6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:29850 2 OK 0x1.018b16a532005p20 -0x1.0ede284d4766dp19 0x0.0p0 0x1.e8p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:29850 3 OK -0x1.ace2d4a6400ap15 0x1.0ede284d4766dp19 0x0.0p0 0x1.cp6 0x1.4000000000002p2 0x0.0p0 F +REG esri:29850 4 OK 0x1.018b16a532005p20 0x1.0ede284d4766dp19 0x0.0p0 0x1.e8p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:29871 0 OK 0x1.caa1e7bb2fec5p14 0x1.1ee4a1f9dfe29p15 0x0.0p0 0x1.ccp6 0x1.ffffffffffd24p1 0x0.0p0 F +REG esri:29871 1 OK 0x1.0f7ee41b34299p15 -0x1.e1e10d698761p10 0x0.0p0 0x1.b7f37f5af8062p6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG esri:29871 2 OK 0x1.09b8d17191c41p16 0x1.4d063354723a2p15 0x0.0p0 0x1.e00c80a507f9dp6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG esri:29871 3 OK -0x1.2143dc66039a2p13 0x1.e75c9aa577d29p14 0x0.0p0 0x1.b7f37f5af8062p6 0x1.1fffffffffe84p3 0x0.0p0 F +REG esri:29871 4 OK 0x1.71008e4bbcf3ap14 0x1.25c5b14ee3f1cp16 0x0.0p0 0x1.e00c80a507f9dp6 0x1.1fffffffffe84p3 0x0.0p0 F +REG esri:29872 0 OK 0x1.d8f6f70a3d70ap20 0x1.27dbc7138376dp21 0x0.0p0 0x1.ccp6 0x1.ffffffffffd24p1 0x0.0p0 F +REG esri:29872 1 OK 0x1.17fadb44a7cd6p21 -0x1.f0f0149a40f8p16 0x0.0p0 0x1.b7f37f5af8062p6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG esri:29872 2 OK 0x1.120698016b536p22 0x1.576e64f8ea612p21 0x0.0p0 0x1.e00c80a507f9dp6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG esri:29872 3 OK -0x1.2a4dfb26cbadp19 0x1.f6977f8e4cbb7p20 0x0.0p0 0x1.b7f37f5af8062p6 0x1.1fffffffffe84p3 0x0.0p0 F +REG esri:29872 4 OK 0x1.7c8892cf4ee03p20 0x1.2ef3dede455bep22 0x0.0p0 0x1.e00c80a507f9dp6 0x1.1fffffffffe84p3 0x0.0p0 F +REG esri:29873 0 OK 0x1.20519bd70a3d7p19 0x1.68b5c6b6ec1c2p19 0x0.0p0 0x1.ccp6 0x1.ffffffffffd24p1 0x0.0p0 F +REG esri:29873 1 OK 0x1.5559d54d6650ep19 -0x1.2eeecc1cf8bb8p15 0x0.0p0 0x1.b7f37f5af8062p6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG esri:29873 2 OK 0x1.4e17749983cbep20 0x1.a2b5eb8963abep19 0x0.0p0 0x1.e00c80a507f9dp6 -0x1.ffffffffe3b0ep-1 0x0.0p0 T +REG esri:29873 3 OK -0x1.6bb13e7a62d84p17 0x1.326121c9caaf9p19 0x0.0p0 0x1.b7f37f5af8062p6 0x1.1fffffffffe84p3 0x0.0p0 F +REG esri:29873 4 OK 0x1.cff2146bf504ap18 0x1.715bf403df0dp20 0x0.0p0 0x1.e00c80a507f9dp6 0x1.1fffffffffe84p3 0x0.0p0 F +REG esri:29900 0 OK 0x1.86ap17 0x1.e848p17 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG esri:29900 1 OK -0x1.9b01398033d7cp18 -0x1.0997722b584a5p18 0x0.0p0 -0x1.067e6c224278ap4 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29900 2 OK 0x1.90d09cc019ebep19 -0x1.0997722b584a5p18 0x0.0p0 0x1.9f9b08909e293p-2 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29900 3 OK -0x1.1a7c1cca9a846p18 0x1.98dbfc8192412p19 0x0.0p0 -0x1.067e6c14807a8p4 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29900 4 OK 0x1.508e0e654d423p19 0x1.98dbfc8192412p19 0x0.0p0 0x1.9f9b05201e9e9p-2 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29901 0 OK 0x1.86ap17 0x1.e848p17 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG esri:29901 1 OK -0x1.9b01397faac92p18 -0x1.0997722bb8337p18 0x0.0p0 -0x1.067e6c224278ap4 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29901 2 OK 0x1.90d09cbfd5649p19 -0x1.0997722bb8337p18 0x0.0p0 0x1.9f9b08909e276p-2 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29901 3 OK -0x1.1a7c1cca05bf8p18 0x1.98dbfc8196b22p19 0x0.0p0 -0x1.067e6c14807a8p4 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29901 4 OK 0x1.508e0e6502dfcp19 0x1.98dbfc8196b22p19 0x0.0p0 0x1.9f9b05201e9e9p-2 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29902 0 OK 0x1.86ap17 0x1.e848p17 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG esri:29902 1 OK -0x1.9b01398033d7cp18 -0x1.0997722b584a5p18 0x0.0p0 -0x1.067e6c224278ap4 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29902 2 OK 0x1.90d09cc019ebep19 -0x1.0997722b584a5p18 0x0.0p0 0x1.9f9b08909e293p-2 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29902 3 OK -0x1.1a7c1cca9a846p18 0x1.98dbfc8192412p19 0x0.0p0 -0x1.067e6c14807a8p4 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29902 4 OK 0x1.508e0e654d423p19 0x1.98dbfc8192412p19 0x0.0p0 0x1.9f9b05201e9e9p-2 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29903 0 OK 0x1.86ap17 0x1.e848p17 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG esri:29903 1 OK -0x1.9b01398033d7cp18 -0x1.0997722b584a5p18 0x0.0p0 -0x1.067e6c224278ap4 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29903 2 OK 0x1.90d09cc019ebep19 -0x1.0997722b584a5p18 0x0.0p0 0x1.9f9b08909e293p-2 0x1.83fffffbfac69p5 0x0.0p0 F +REG esri:29903 3 OK -0x1.1a7c1cca9a846p18 0x1.98dbfc8192412p19 0x0.0p0 -0x1.067e6c14807a8p4 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:29903 4 OK 0x1.508e0e654d423p19 0x1.98dbfc8192412p19 0x0.0p0 0x1.9f9b05201e9e9p-2 0x1.d3fffffc3e5bdp5 0x0.0p0 F +REG esri:30161 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.03p7 0x1.08p5 0x0.0p0 F +REG esri:30161 1 OK -0x1.1e906bc1be82bp19 -0x1.0796272cd24cdp19 0x0.0p0 0x1.ee271995928a3p6 0x1.bfffffffaaca9p4 0x0.0p0 F +REG esri:30161 2 OK 0x1.1e906bc1be82bp19 -0x1.0796272cd24cdp19 0x0.0p0 0x1.0eec733536bafp7 0x1.bfffffffaaca9p4 0x0.0p0 F +REG esri:30161 3 OK -0x1.ff7af25f8426cp18 0x1.1706c9ecf7efbp19 0x0.0p0 0x1.ee271995a7d6p6 0x1.2fffffffa4d97p5 0x0.0p0 F +REG esri:30161 4 OK 0x1.ff7af25f8426cp18 0x1.1706c9ecf7efbp19 0x0.0p0 0x1.0eec73352c151p7 0x1.2fffffffa4d97p5 0x0.0p0 F +REG esri:30162 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.08p5 0x0.0p0 F +REG esri:30162 1 OK -0x1.1e906bc1be82bp19 -0x1.0796272cd24cdp19 0x0.0p0 0x1.f4271995928a2p6 0x1.bfffffffaaca9p4 0x0.0p0 F +REG esri:30162 2 OK 0x1.1e906bc1be84p19 -0x1.0796272cd24ccp19 0x0.0p0 0x1.11ec733536bbp7 0x1.bfffffffaaca9p4 0x0.0p0 F +REG esri:30162 3 OK -0x1.ff7af25f8426cp18 0x1.1706c9ecf7efbp19 0x0.0p0 0x1.f4271995a7d5fp6 0x1.2fffffffa4d97p5 0x0.0p0 F +REG esri:30162 4 OK 0x1.ff7af25f84292p18 0x1.1706c9ecf7efcp19 0x0.0p0 0x1.11ec73352c151p7 0x1.2fffffffa4d97p5 0x0.0p0 F +REG esri:30163 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0855555555557p7 0x1.2p5 0x0.0p0 F +REG esri:30163 1 OK -0x1.2068947c520ecp19 -0x1.06b2f18710b55p19 0x0.0p0 0x1.f7f1ffa584b21p6 0x1.efffffff7928ep4 0x0.0p0 F +REG esri:30163 2 OK 0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.14b1aad7e851ep7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30163 3 OK -0x1.fbd29bd693261p18 0x1.17f53ac2192ebp19 0x0.0p0 0x1.f7f1ffa5b6e8p6 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30163 4 OK 0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.14b1aad7cf36ep7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30164 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0bp7 0x1.08p5 0x0.0p0 F +REG esri:30164 1 OK -0x1.1e906bc1be82bp19 -0x1.0796272cd24cdp19 0x0.0p0 0x1.fe271995928a1p6 0x1.bfffffffaaca9p4 0x0.0p0 F +REG esri:30164 2 OK 0x1.1e906bc1be84p19 -0x1.0796272cd24ccp19 0x0.0p0 0x1.16ec733536bbp7 0x1.bfffffffaaca9p4 0x0.0p0 F +REG esri:30164 3 OK -0x1.ff7af25f8426cp18 0x1.1706c9ecf7efbp19 0x0.0p0 0x1.fe271995a7d5fp6 0x1.2fffffffa4d97p5 0x0.0p0 F +REG esri:30164 4 OK 0x1.ff7af25f84292p18 0x1.1706c9ecf7efcp19 0x0.0p0 0x1.16ec73352c151p7 0x1.2fffffffa4d97p5 0x0.0p0 F +REG esri:30165 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.0caaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG esri:30165 1 OK -0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.004e552817ae3p7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30165 2 OK 0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.1907002d3da6fp7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30165 3 OK -0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.004e552830c93p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30165 4 OK 0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.1907002d248cp7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30166 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.2p5 0x0.0p0 F +REG esri:30166 1 OK -0x1.2068947c520ecp19 -0x1.06b2f18710b55p19 0x0.0p0 0x1.03a3aa7d6d039p7 0x1.efffffff7928ep4 0x0.0p0 F +REG esri:30166 2 OK 0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.1c5c558292fc7p7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30166 3 OK -0x1.fbd29bd693261p18 0x1.17f53ac2192ebp19 0x0.0p0 0x1.03a3aa7d861e9p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30166 4 OK 0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.1c5c558279e17p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30167 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1255555555557p7 0x1.2p5 0x0.0p0 F +REG esri:30167 1 OK -0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.05f8ffd2c2591p7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30167 2 OK 0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.1eb1aad7e851dp7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30167 3 OK -0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.05f8ffd2db741p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30167 4 OK 0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.1eb1aad7cf36ep7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30168 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.15p7 0x1.2p5 0x0.0p0 F +REG esri:30168 1 OK -0x1.2068947c520ecp19 -0x1.06b2f18710b55p19 0x0.0p0 0x1.08a3aa7d6d039p7 0x1.efffffff7928ep4 0x0.0p0 F +REG esri:30168 2 OK 0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.215c558292fc7p7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30168 3 OK -0x1.fbd29bd693261p18 0x1.17f53ac2192ebp19 0x0.0p0 0x1.08a3aa7d861e9p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30168 4 OK 0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.215c558279e17p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30169 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.17aaaaaaaaaa9p7 0x1.2p5 0x0.0p0 F +REG esri:30169 1 OK -0x1.2068947c520d7p19 -0x1.06b2f18710b57p19 0x0.0p0 0x1.0b4e552817ae3p7 0x1.efffffff7928fp4 0x0.0p0 F +REG esri:30169 2 OK 0x1.2068947c520ecp19 -0x1.06b2f18710b55p19 0x0.0p0 0x1.2407002d3da7p7 0x1.efffffff7928ep4 0x0.0p0 F +REG esri:30169 3 OK -0x1.fbd29bd69323dp18 0x1.17f53ac2192eap19 0x0.0p0 0x1.0b4e552830c92p7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30169 4 OK 0x1.fbd29bd693261p18 0x1.17f53ac2192ebp19 0x0.0p0 0x1.2407002d248cp7 0x1.47ffffff7a377p5 0x0.0p0 F +REG esri:30170 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.19aaaaaaaaaa9p7 0x1.4p5 0x0.0p0 F +REG esri:30170 1 OK -0x1.231737dba325ap19 -0x1.055fd7c138995p19 0x0.0p0 0x1.0c9cd2f1fe827p7 0x1.17ffffff8147bp5 0x0.0p0 F +REG esri:30170 2 OK 0x1.231737dba325ap19 -0x1.055fd7c138995p19 0x0.0p0 0x1.26b8826356d2cp7 0x1.17ffffff8147bp5 0x0.0p0 F +REG esri:30170 3 OK -0x1.f6768664dc904p18 0x1.194863abb4c71p19 0x0.0p0 0x1.0c9cd2f23446dp7 0x1.67ffffff256b2p5 0x0.0p0 F +REG esri:30170 4 OK 0x1.f6768664dc904p18 0x1.194863abb4c71p19 0x0.0p0 0x1.26b88263210e5p7 0x1.67ffffff256b2p5 0x0.0p0 F +REG esri:30171 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.188p7 0x1.6p5 0x0.0p0 F +REG esri:30171 1 OK -0x1.26177eebe88ddp19 -0x1.03d67a7a28e23p19 0x0.0p0 0x1.0a992e63a6576p7 0x1.37ffffff119cdp5 0x0.0p0 F +REG esri:30171 2 OK 0x1.26177eebe88ddp19 -0x1.03d67a7a28e23p19 0x0.0p0 0x1.2666d19c59a8ap7 0x1.37ffffff119cdp5 0x0.0p0 F +REG esri:30171 3 OK -0x1.f0670548abcf9p18 0x1.1ab8637112c19p19 0x0.0p0 0x1.0a992e640a731p7 0x1.87fffffea33f7p5 0x0.0p0 F +REG esri:30171 4 OK 0x1.f0670548abcf9p18 0x1.1ab8637112c19p19 0x0.0p0 0x1.2666d19bf58cfp7 0x1.87fffffea33f7p5 0x0.0p0 F +REG esri:30172 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1c8p7 0x1.6p5 0x0.0p0 F +REG esri:30172 1 OK -0x1.26177eebe88fp19 -0x1.03d67a7a28e21p19 0x0.0p0 0x1.0e992e63a6575p7 0x1.37ffffff119cdp5 0x0.0p0 F +REG esri:30172 2 OK 0x1.26177eebe88ddp19 -0x1.03d67a7a28e23p19 0x0.0p0 0x1.2a66d19c59a8ap7 0x1.37ffffff119cdp5 0x0.0p0 F +REG esri:30172 3 OK -0x1.f0670548abd18p18 0x1.1ab8637112c19p19 0x0.0p0 0x1.0e992e640a731p7 0x1.87fffffea33f7p5 0x0.0p0 F +REG esri:30172 4 OK 0x1.f0670548abcf9p18 0x1.1ab8637112c19p19 0x0.0p0 0x1.2a66d19bf58cfp7 0x1.87fffffea33f7p5 0x0.0p0 F +REG esri:30173 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.208p7 0x1.6p5 0x0.0p0 F +REG esri:30173 1 OK -0x1.26177eebe88fp19 -0x1.03d67a7a28e21p19 0x0.0p0 0x1.12992e63a6575p7 0x1.37ffffff119cdp5 0x0.0p0 F +REG esri:30173 2 OK 0x1.26177eebe88ddp19 -0x1.03d67a7a28e23p19 0x0.0p0 0x1.2e66d19c59a8bp7 0x1.37ffffff119cdp5 0x0.0p0 F +REG esri:30173 3 OK -0x1.f0670548abd18p18 0x1.1ab8637112c19p19 0x0.0p0 0x1.12992e640a731p7 0x1.87fffffea33f7p5 0x0.0p0 F +REG esri:30173 4 OK 0x1.f0670548abcf9p18 0x1.1ab8637112c19p19 0x0.0p0 0x1.2e66d19bf58cfp7 0x1.87fffffea33f7p5 0x0.0p0 F +REG esri:30174 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1cp7 0x1.ap4 0x0.0p0 F +REG esri:30174 1 OK -0x1.1aafe9212213p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.10dfbd3135951p7 0x1.4fffffffde55ap4 0x0.0p0 F +REG esri:30174 2 OK 0x1.1aafe92122146p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.272042ceca6bp7 0x1.4fffffffde559p4 0x0.0p0 F +REG esri:30174 3 OK -0x1.038e30337166dp19 0x1.15061026eac76p19 0x0.0p0 0x1.10dfbd312d158p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30174 4 OK 0x1.038e303371683p19 0x1.15061026eac76p19 0x0.0p0 0x1.272042ced2ea9p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30175 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fe00000000001p6 0x1.ap4 0x0.0p0 F +REG esri:30175 1 OK -0x1.1aafe92122146p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.e7bf7a626b2a1p6 0x1.4fffffffde559p4 0x0.0p0 F +REG esri:30175 2 OK 0x1.1aafe9212213p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.0a2042ceca6afp7 0x1.4fffffffde55ap4 0x0.0p0 F +REG esri:30175 3 OK -0x1.038e303371683p19 0x1.15061026eac76p19 0x0.0p0 0x1.e7bf7a625a2afp6 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30175 4 OK 0x1.038e30337166dp19 0x1.15061026eac76p19 0x0.0p0 0x1.0a2042ced2ea8p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30176 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.fp6 0x1.ap4 0x0.0p0 F +REG esri:30176 1 OK -0x1.1aafe9212213p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.d9bf7a626b2a2p6 0x1.4fffffffde55ap4 0x0.0p0 F +REG esri:30176 2 OK 0x1.1aafe92122146p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.032042ceca6bp7 0x1.4fffffffde559p4 0x0.0p0 F +REG esri:30176 3 OK -0x1.038e30337166dp19 0x1.15061026eac76p19 0x0.0p0 0x1.d9bf7a625a2bp6 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30176 4 OK 0x1.038e303371683p19 0x1.15061026eac76p19 0x0.0p0 0x1.032042ced2ea9p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30177 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.06p7 0x1.ap4 0x0.0p0 F +REG esri:30177 1 OK -0x1.1aafe9212213p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.f5bf7a626b2a1p6 0x1.4fffffffde55ap4 0x0.0p0 F +REG esri:30177 2 OK 0x1.1aafe92122146p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.112042ceca6bp7 0x1.4fffffffde559p4 0x0.0p0 F +REG esri:30177 3 OK -0x1.038e30337166dp19 0x1.15061026eac76p19 0x0.0p0 0x1.f5bf7a625a2bp6 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30177 4 OK 0x1.038e303371683p19 0x1.15061026eac76p19 0x0.0p0 0x1.112042ced2ea9p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30178 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.1p7 0x1.4p4 0x0.0p0 F +REG esri:30178 1 OK -0x1.17b74ca5c5b1p19 -0x1.0ac7f9ea0f3afp19 0x0.0p0 0x1.055bb47483427p7 0x1.dfffffffda741p3 0x0.0p0 F +REG esri:30178 2 OK 0x1.17b74ca5c5af8p19 -0x1.0ac7f9ea0f3afp19 0x0.0p0 0x1.1aa44b8b7cbd9p7 0x1.dfffffffda741p3 0x0.0p0 F +REG esri:30178 3 OK -0x1.0676e5498e593p19 0x1.13763358da14bp19 0x0.0p0 0x1.055bb47474f6cp7 0x1.8fffffffde786p4 0x0.0p0 F +REG esri:30178 4 OK 0x1.0676e5498e57dp19 0x1.13763358da14ap19 0x0.0p0 0x1.1aa44b8b8b094p7 0x1.8fffffffde787p4 0x0.0p0 F +REG esri:30179 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.34p7 0x1.ap4 0x0.0p0 F +REG esri:30179 1 OK -0x1.1aafe92122146p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.28dfbd3135951p7 0x1.4fffffffde559p4 0x0.0p0 F +REG esri:30179 2 OK 0x1.1aafe9212213p19 -0x1.09680c9c3a5e5p19 0x0.0p0 0x1.3f2042ceca6bp7 0x1.4fffffffde55ap4 0x0.0p0 F +REG esri:30179 3 OK -0x1.038e303371683p19 0x1.15061026eac76p19 0x0.0p0 0x1.28dfbd312d158p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30179 4 OK 0x1.038e30337166dp19 0x1.15061026eac76p19 0x0.0p0 0x1.3f2042ced2ea8p7 0x1.efffffffb815fp4 0x0.0p0 F +REG esri:30200 0 OK 0x1.a385ae1e33499p18 0x1.3b62ae262a9b8p18 0x1.4f8c38b5p5 -0x1.eaaaaaaaaaaadp5 0x1.4e22222222223p3 0x1.0p-29 F +REG esri:30200 1 OK -0x1.2173ad673f3eap21 -0x1.26afff6c59c13p21 0x1.5565400c3p6 -0x1.09ab8c8a7bb3ep6 0x1.5c44435f04bd9p2 -0x1.0f6p-19 F +REG esri:30200 2 OK 0x1.8a55327f78266p21 -0x1.26afff6c49798p21 0x1.1b4a2b6aep6 -0x1.c1fe3c40709f7p5 0x1.5c44435f6c1e8p2 -0x1.fd8p-21 F +REG esri:30200 3 OK -0x1.16a5d0355ca58p21 0x1.7b014fa560f1cp21 0x1.ab961bdep3 -0x1.09ab8d29e1fc5p6 0x1.ee222159ae6cbp3 -0x1.58cp-18 F +REG esri:30200 4 OK 0x1.7f87539e01499p21 0x1.7b014fa577bc2p21 -0x1.6831e6ep-1 -0x1.c1fe3b021f0fbp5 0x1.ee22215a1526ep3 0x1.4b8p-19 F +REG esri:30339 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:30339 1 OK -0x1.ad8003e0da35p15 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.7p5 -0x1.4p2 0x0.0p0 F +REG esri:30339 2 OK 0x1.0190001f06d2dp20 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.cp5 -0x1.4p2 0x0.0p0 F +REG esri:30339 3 OK -0x1.ad8003e0da35p15 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.7p5 0x1.4p2 0x0.0p0 F +REG esri:30339 4 OK 0x1.0190001f06d2dp20 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.cp5 0x1.4p2 0x0.0p0 F +REG esri:30340 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:30340 1 OK -0x1.ad8003e0da54p15 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.ap5 -0x1.4p2 0x0.0p0 F +REG esri:30340 2 OK 0x1.0190001f06d1ap20 -0x1.0ee41bce79ccdp19 0x0.0p0 0x1.fp5 -0x1.4p2 0x0.0p0 F +REG esri:30340 3 OK -0x1.ad8003e0da54p15 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.ap5 0x1.4p2 0x0.0p0 F +REG esri:30340 4 OK 0x1.0190001f06d1ap20 0x1.0ee41bce79ccdp19 0x0.0p0 0x1.fp5 0x1.4p2 0x0.0p0 F +REG esri:3036 0 OK 0x1.e847ffffffff5p18 0x1.b997b10295082p22 0x0.0p0 0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:3036 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.b7bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:3036 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:3036 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:3036 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:3037 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:3037 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:3037 2 OK 0x1.f8272811ecb88p19 0x1.97014c751fc1p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:3037 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:3037 4 OK 0x1.07218271ec198p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:30491 0 OK 0x1.e884ccad7b76dp18 0x1.2510ab46c5054p18 -0x1.c5d598dc4p5 0x1.5999999999999p1 0x1.1ffffffffffdp5 0x1.8p-29 F +REG esri:30491 1 OK -0x1.65c6de5e8757p16 -0x1.cd4fb16f35a94p17 -0x1.5c1459402p6 -0x1.bd7bc705e2daap1 0x1.effffffffff5fp4 0x0.0p0 F +REG esri:30491 2 OK 0x1.0a9ecfa9e4a46p20 -0x1.cd4dd31d5ac84p17 -0x1.50f442214p5 0x1.1c2bbe8e45838p3 0x1.effffffffff66p4 0x0.0p0 F +REG esri:30491 3 OK -0x1.4b9ace68965ap14 0x1.a9de6dbb8b437p19 -0x1.0d30d8b39p6 -0x1.bd7bc705e2dacp1 0x1.47fffffffffe7p5 0x1.0p-30 F +REG esri:30491 4 OK 0x1.f2e1ab90ae726p19 0x1.a9ddf894f0afbp19 -0x1.bc3ba0c08p4 0x1.1c2bbe8e45837p3 0x1.47fffffffffe4p5 0x1.8p-29 F +REG esri:30492 0 OK 0x1.e884ccb114659p18 0x1.250d09ea8814bp18 -0x1.e862c8756p5 0x1.599999999999ap1 0x1.0a66666666628p5 0x1.0p-29 F +REG esri:30492 1 OK -0x1.58836a97a1a68p16 -0x1.d09643da0577p17 -0x1.66fa1e097p6 -0x1.a4206e6b37c1ep1 0x1.c4ccccccccc0fp4 -0x1.0p-30 F +REG esri:30492 2 OK 0x1.09ca98dae5c91p20 -0x1.d09465c04536cp17 -0x1.68c35436ap5 0x1.15d4e8679abd4p3 0x1.c4ccccccccc15p4 -0x1.0p-29 F +REG esri:30492 3 OK -0x1.804b55e1a392p14 0x1.a9029df9e666bp19 -0x1.233cfc3cdp6 -0x1.a4206e6b37c1ep1 0x1.3266666666643p5 0x1.0p-30 F +REG esri:30492 4 OK 0x1.f4872ef8d740dp19 0x1.a90228a6f5c91p19 -0x1.081cdfc48p5 0x1.15d4e8679abd6p3 0x1.3266666666643p5 0x0.0p0 F +REG esri:30591 0 OK 0x1.e869cp18 0x1.250e8p18 0x0.0p0 0x1.599999999999ap1 0x1.1ffffffffffd1p5 0x0.0p0 F +REG esri:30591 1 OK -0x1.66407fe123a28p16 -0x1.cd44a294ca65p17 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.effffffffff6bp4 0x0.0p0 F +REG esri:30591 2 OK 0x1.0a98e7fe123a2p20 -0x1.cd44a294ca65p17 0x0.0p0 0x1.1c2bbe8e45837p3 0x1.effffffffff6bp4 0x0.0p0 F +REG esri:30591 3 OK -0x1.4d8ef664aba3p14 0x1.a9da907fd20fcp19 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:30591 4 OK 0x1.f2d637b3255d2p19 0x1.a9da907fd20fcp19 0x0.0p0 0x1.1c2bbe8e45839p3 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:30592 0 OK 0x1.e869cp18 0x1.250e8p18 0x0.0p0 0x1.599999999999ap1 0x1.0a66666666629p5 0x0.0p0 F +REG esri:30592 1 OK -0x1.58fb44cb4075p16 -0x1.d081e0684d444p17 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.c4ccccccccc0ap4 0x0.0p0 F +REG esri:30592 2 OK 0x1.09c4944cb4074p20 -0x1.d081e0684d444p17 0x0.0p0 0x1.15d4e8679abd4p3 0x1.c4ccccccccc0ap4 0x0.0p0 F +REG esri:30592 3 OK -0x1.82391341af7p14 0x1.a8fffdf58e4d9p19 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.3266666666644p5 0x0.0p0 F +REG esri:30592 4 OK 0x1.f47b889a0d7b7p19 0x1.a8fffdf58e4d9p19 0x0.0p0 0x1.15d4e8679abd5p3 0x1.3266666666644p5 0x0.0p0 F +REG esri:30729 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:30729 1 OK -0x1.ad892fd8998p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30729 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffep1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30729 3 OK -0x1.ad892fd8998p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30729 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffep1 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30730 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:30730 1 OK -0x1.ad892fd89987p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.0p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30730 2 OK 0x1.0190497ec4cbbp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.ffffffffffffbp0 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30730 3 OK -0x1.ad892fd89987p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.0p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30730 4 OK 0x1.0190497ec4cbbp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.ffffffffffffbp0 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30731 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:30731 1 OK -0x1.ad892fd89976p15 -0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffbp0 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30731 2 OK 0x1.0190497ec4cc4p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.0000000000001p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30731 3 OK -0x1.ad892fd89976p15 0x1.0edd047bd8483p19 0x0.0p0 -0x1.ffffffffffffbp0 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30731 4 OK 0x1.0190497ec4cc4p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.0000000000001p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30732 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:30732 1 OK -0x1.ad892fd8997fp15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.0p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30732 2 OK 0x1.0190497ec4ccp20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30732 3 OK -0x1.ad892fd8997fp15 0x1.0edd047bd8483p19 0x0.0p0 0x1.0p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30732 4 OK 0x1.0190497ec4ccp20 0x1.0edd047bd8483p19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:30791 0 OK 0x1.e869cp18 0x1.250e8p18 0x0.0p0 0x1.599999999999ap1 0x1.1ffffffffffd1p5 0x0.0p0 F +REG esri:30791 1 OK -0x1.66407fe123a28p16 -0x1.cd44a294ca65p17 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.effffffffff6bp4 0x0.0p0 F +REG esri:30791 2 OK 0x1.0a98e7fe123a2p20 -0x1.cd44a294ca65p17 0x0.0p0 0x1.1c2bbe8e45837p3 0x1.effffffffff6bp4 0x0.0p0 F +REG esri:30791 3 OK -0x1.4d8ef664aba3p14 0x1.a9da907fd20fcp19 0x0.0p0 -0x1.bd7bc705e2dacp1 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:30791 4 OK 0x1.f2d637b3255d2p19 0x1.a9da907fd20fcp19 0x0.0p0 0x1.1c2bbe8e45839p3 0x1.47fffffffffe8p5 0x0.0p0 F +REG esri:30792 0 OK 0x1.e869cp18 0x1.250e8p18 0x0.0p0 0x1.599999999999ap1 0x1.0a66666666629p5 0x0.0p0 F +REG esri:30792 1 OK -0x1.58fb44cb4075p16 -0x1.d081e0684d444p17 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.c4ccccccccc0ap4 0x0.0p0 F +REG esri:30792 2 OK 0x1.09c4944cb4074p20 -0x1.d081e0684d444p17 0x0.0p0 0x1.15d4e8679abd4p3 0x1.c4ccccccccc0ap4 0x0.0p0 F +REG esri:30792 3 OK -0x1.82391341af7p14 0x1.a8fffdf58e4d9p19 0x0.0p0 -0x1.a4206e6b37c21p1 0x1.3266666666644p5 0x0.0p0 F +REG esri:30792 4 OK 0x1.f47b889a0d7b7p19 0x1.a8fffdf58e4d9p19 0x0.0p0 0x1.15d4e8679abd5p3 0x1.3266666666644p5 0x0.0p0 F +REG esri:30800 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.f9dd695bb473bp3 0x0.0p0 0x0.0p0 T +REG esri:30800 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:30800 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:30800 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.59dd695c9de1ap3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:30800 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.4ceeb4ad6582ep4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31028 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:31028 1 OK -0x1.ad89324e3daap15 -0x1.0edd0485be135p19 0x0.0p0 -0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31028 2 OK 0x1.0190499271ec5p20 -0x1.0edd0485be135p19 0x0.0p0 -0x1.4000000000001p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31028 3 OK -0x1.ad89324e3daap15 0x1.0edd0485be135p19 0x0.0p0 -0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31028 4 OK 0x1.0190499271ec5p20 0x1.0edd0485be135p19 0x0.0p0 -0x1.4000000000001p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31121 0 OK 0x1.e86f3504a2929p18 0x1.65db6d8ac9b87p8 -0x1.81294267p2 -0x1.c800000000001p5 -0x1.2f74bf1dcfcaep-61 -0x1.0p-30 T +REG esri:31121 1 OK -0x1.ac41ec32bfb6p15 -0x1.0eb6b0c9c27cep19 -0x1.a014df5e6p5 -0x1.f000000000002p5 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:31121 2 OK 0x1.0199aa0b3136ap20 -0x1.0eb6b0cac3259p19 -0x1.8c46b54cp4 -0x1.a000000000001p5 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:31121 3 OK -0x1.ac3702de33f2p15 0x1.0f1026e59d58ap19 0x1.4c922537p3 -0x1.fp5 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:31121 4 OK 0x1.019952b3fac8ep20 0x1.0f1026e69ea7p19 0x1.2d1581598p5 -0x1.ap5 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:31154 0 OK 0x1.e86bf30d575dep18 0x1.65db5063bddb1p8 0x1.db5bb5ep0 -0x1.bp5 0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG esri:31154 1 OK -0x1.ac5a9e157b95p15 -0x1.0eb69aadfc1c8p19 -0x1.58815c52ap5 -0x1.d7ffffffc5168p5 -0x1.3fffffffeac8cp2 -0x1.cp-28 F +REG esri:31154 2 OK 0x1.0198ce9b5fc76p20 -0x1.0eb69aaee7684p19 -0x1.21575744p4 -0x1.880000003b182p5 -0x1.3fffffffeab59p2 0x1.4p-28 F +REG esri:31154 3 OK -0x1.ac4fb4b2e317p15 0x1.0f1010c29be92p19 0x1.356fbc4c4p4 -0x1.d7ffffffc51aap5 0x1.3fffffffeac27p2 -0x1.cp-28 F +REG esri:31154 4 OK 0x1.01987744c4586p20 0x1.0f1010c387ccep19 0x1.628d0ddaap5 -0x1.880000003b13fp5 0x1.3fffffffeaaf4p2 0x1.4p-28 F +REG esri:31170 0 OK 0x1.e86dca40e3067p18 0x1.65db606fbd692p8 -0x1.3d2bae64p1 -0x1.bd77777777778p5 0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:31170 1 OK -0x1.ac4ca4f7a8efp15 -0x1.0eb6a6d955a73p19 -0x1.8009380cap5 -0x1.e57777773c8fp5 -0x1.3fffffffeac95p2 -0x1.0p-28 F +REG esri:31170 2 OK 0x1.01994a6e0daf4p20 -0x1.0eb6a6da4cf99p19 -0x1.5bf0743fcp4 -0x1.95777777b290ep5 -0x1.3fffffffeab5p2 0x1.0p-28 F +REG esri:31170 3 OK -0x1.ac41bb9d0bbp15 0x1.0f101cf1f0585p19 0x1.ccc06fcp3 -0x1.e57777773c932p5 0x1.3fffffffeac2ep2 -0x1.4p-28 F +REG esri:31170 4 OK 0x1.0198f3171b05ap20 0x1.0f101cf2e84a9p19 0x1.45409245ep5 -0x1.95777777b28cap5 0x1.3fffffffeaaebp2 0x1.0p-29 F +REG esri:31171 0 OK 0x1.e86dcd282ab31p18 0x1.65f6df0171cap8 -0x1.3d2bae64p1 -0x1.bd77777777778p5 0x0.0p0 0x1.0p-30 T +REG esri:31171 1 OK -0x1.ad99abc72d5dp15 -0x1.0ecb736c25818p19 -0x1.8009380cap5 -0x1.e57777773c8fp5 -0x1.3fffffffeac93p2 -0x1.0p-28 F +REG esri:31171 2 OK 0x1.01a3b4183091ep20 -0x1.0ecb736d1ce6ep19 -0x1.5bf0743fcp4 -0x1.95777777b290ep5 -0x1.3fffffffeab4fp2 0x1.0p-28 F +REG esri:31171 3 OK -0x1.ad8ec195f291p15 0x1.0f24f06455e92p19 0x1.ccc06fcp3 -0x1.e57777773c932p5 0x1.3fffffffeac2fp2 -0x1.4p-28 F +REG esri:31171 4 OK 0x1.01a35cba880dap20 0x1.0f24f0654dee5p19 0x1.45409245ep5 -0x1.95777777b28cap5 0x1.3fffffffeaaeap2 0x1.0p-29 F +REG esri:31265 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:31265 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31265 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31265 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31265 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31266 0 OK 0x1.8cba8p22 0x0.0p0 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG esri:31266 1 OK 0x1.6ad89f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.a0000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31266 2 OK 0x1.ae9c6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.6fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31266 3 OK 0x1.6ad89f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.a0000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31266 4 OK 0x1.ae9c6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.6fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31267 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:31267 1 OK 0x1.a7e19f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0000000074b7p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31267 2 OK 0x1.eba56097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.9fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31267 3 OK 0x1.a7e19f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0000000074b7p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31267 4 OK 0x1.eba56097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.9fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31268 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:31268 1 OK 0x1.e4ea9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3000000074b7p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31268 2 OK 0x1.1457304bf258dp23 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.cfffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31268 3 OK 0x1.e4ea9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3000000074b7p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31268 4 OK 0x1.1457304bf258dp23 0x1.0ef87252d3b33p19 0x0.0p0 0x1.cfffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31275 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:31275 1 OK 0x1.2dd07d753aa35p22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.40000000e96ep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31275 2 OK 0x1.7192828ac55cbp22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31275 3 OK 0x1.2dd07d753aa35p22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.40000000e96ep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31275 4 OK 0x1.7192828ac55cbp22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31276 0 OK 0x1.8cba8p22 0x0.0p0 0x0.0p0 0x1.2p4 0x0.0p0 0x0.0p0 T +REG esri:31276 1 OK 0x1.6ad97d753aa35p22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.a0000000e96ep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31276 2 OK 0x1.ae9b828ac55cbp22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.6fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31276 3 OK 0x1.6ad97d753aa35p22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.a0000000e96ep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31276 4 OK 0x1.ae9b828ac55cbp22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.6fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31277 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:31277 1 OK 0x1.a7e27d753aa35p22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.0000000074b7p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31277 2 OK 0x1.eba4828ac55cbp22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.9fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31277 3 OK 0x1.a7e27d753aa35p22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.0000000074b7p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31277 4 OK 0x1.eba4828ac55cbp22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.9fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31278 0 OK 0x1.c9c38p22 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:31278 1 OK 0x1.a7e27d753aa35p22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.0000000074b7p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31278 2 OK 0x1.eba4828ac55cbp22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.9fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31278 3 OK 0x1.a7e27d753aa35p22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.0000000074b7p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31278 4 OK 0x1.eba4828ac55cbp22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.9fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31279 0 OK 0x1.03664p23 0x0.0p0 0x0.0p0 0x1.8000000000001p4 0x0.0p0 0x0.0p0 T +REG esri:31279 1 OK 0x1.e4eb7d753aa35p22 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.3000000074b71p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31279 2 OK 0x1.1456c14562ae6p23 -0x1.0ef1827dc6854p19 0x0.0p0 0x1.cfffffff8b493p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31279 3 OK 0x1.e4eb7d753aa35p22 0x1.0ef1827dc6854p19 0x0.0p0 0x1.3000000074b71p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31279 4 OK 0x1.1456c14562ae6p23 0x1.0ef1827dc6854p19 0x0.0p0 0x1.cfffffff8b493p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31281 0 OK 0x1.e7edfe9fbe732p20 0x0.0p0 0x0.0p0 0x1.4aaa87d3d7875p3 0x0.0p0 0x0.0p0 T +REG esri:31281 1 OK 0x1.59b630edbe02ap20 -0x1.14aeb9e51873bp19 0x0.0p0 0x1.555550fbd08a2p2 -0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31281 2 OK 0x1.3b10e163a5633p21 -0x1.2492935c95a01p19 0x0.0p0 0x1.eaa98b97ca77ep3 -0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31281 3 OK 0x1.59b630edbe02ap20 0x1.14aeb9e51873bp19 0x0.0p0 0x1.555550fbd08a2p2 0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31281 4 OK 0x1.3b10e163a5633p21 0x1.2492935c95a01p19 0x0.0p0 0x1.eaa98b97ca77ep3 0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31282 0 OK 0x1.e7edfe9fbe734p20 0x0.0p0 0x0.0p0 0x1.aaaa87d3d7876p3 0x0.0p0 0x0.0p0 T +REG esri:31282 1 OK 0x1.59b630edbe02bp20 -0x1.14aeb9e51873bp19 0x0.0p0 0x1.0aaaa87de845p3 -0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31282 2 OK 0x1.3b10e163a5634p21 -0x1.2492935c95a02p19 0x0.0p0 0x1.2554c5cbe53bfp4 -0x1.3ffffae859facp2 0x0.0p0 F +REG esri:31282 3 OK 0x1.59b630edbe02bp20 0x1.14aeb9e51873bp19 0x0.0p0 0x1.0aaaa87de845p3 0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31282 4 OK 0x1.3b10e163a5634p21 0x1.2492935c95a02p19 0x0.0p0 0x1.2554c5cbe53bfp4 0x1.3ffffae859facp2 0x0.0p0 F +REG esri:31283 0 OK 0x1.e7edfe9fbe732p20 0x0.0p0 0x0.0p0 0x1.055543e9ebc3ap4 0x0.0p0 0x0.0p0 T +REG esri:31283 1 OK 0x1.59b630edbe02ap20 -0x1.14aeb9e51873bp19 0x0.0p0 0x1.6aaaa87de844fp3 -0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31283 2 OK 0x1.3b10e163a5634p21 -0x1.2492935c95a01p19 0x0.0p0 0x1.5554c5cbe53bep4 -0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31283 3 OK 0x1.59b630edbe02ap20 0x1.14aeb9e51873bp19 0x0.0p0 0x1.6aaaa87de844fp3 0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31283 4 OK 0x1.3b10e163a5634p21 0x1.2492935c95a01p19 0x0.0p0 0x1.5554c5cbe53bep4 0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31284 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 0x0.0p0 T +REG esri:31284 1 OK -0x1.8ba2097e4b19ep18 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5555555728311p2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31284 2 OK 0x1.584d04bf258cfp19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.eaaaaaa9c13cbp3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31284 3 OK -0x1.8ba2097e4b19ep18 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5555555728311p2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31284 4 OK 0x1.584d04bf258cfp19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.eaaaaaa9c13cbp3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31285 0 OK 0x1.b774p18 0x0.0p0 0x0.0p0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 0x0.0p0 T +REG esri:31285 1 OK -0x1.9aa825f92c67p16 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0aaaaaab94188p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31285 2 OK 0x1.eac904bf258cep19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.25555554e09e5p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31285 3 OK -0x1.9aa825f92c67p16 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0aaaaaab94188p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31285 4 OK 0x1.eac904bf258cep19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.25555554e09e5p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31286 0 OK 0x1.6e36p19 0x0.0p0 0x0.0p0 0x1.0555555555554p4 0x0.0p0 0x0.0p0 T +REG esri:31286 1 OK 0x1.7c9bed0369cc4p17 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.6aaaaaab94187p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31286 2 OK 0x1.3ea2825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.55555554e09e5p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31286 3 OK 0x1.7c9bed0369cc4p17 0x1.0ef87252d3b33p19 0x0.0p0 0x1.6aaaaaab94187p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31286 4 OK 0x1.3ea2825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.55555554e09e5p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31287 0 OK 0x1.86ap18 0x1.86ap18 0x0.0p0 0x1.aaaaaaaaaaaa9p3 0x1.7bffffffff6cep5 0x0.0p0 F +REG esri:31287 1 OK 0x1.6d070a028b0ep15 0x1.2b636f2193508p16 0x0.0p0 0x1.1c9195d1a8502p3 0x1.63ffffffffff3p5 0x0.0p0 F +REG esri:31287 2 OK 0x1.6fcf8f5fd74f3p19 0x1.2b636f2193508p16 0x0.0p0 0x1.1c61dfc1d6829p4 0x1.63ffffffffff3p5 0x0.0p0 F +REG esri:31287 3 OK 0x1.4b58e70cc3668p16 0x1.6a9dd977ff85ep19 0x0.0p0 0x1.1c9195d1a8502p3 0x1.93ffffffffa65p5 0x0.0p0 F +REG esri:31287 4 OK 0x1.5d34e31e67934p19 0x1.6a9dd977ff85ep19 0x0.0p0 0x1.1c61dfc1d6829p4 0x1.93ffffffffa65p5 0x0.0p0 F +REG esri:31291 0 OK 0x1.e7edfe9fbe732p20 0x0.0p0 0x0.0p0 0x1.4aaa87d3d7875p3 0x0.0p0 0x0.0p0 T +REG esri:31291 1 OK 0x1.59b630edbe02ap20 -0x1.14aeb9e51873bp19 0x0.0p0 0x1.555550fbd08a2p2 -0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31291 2 OK 0x1.3b10e163a5633p21 -0x1.2492935c95a01p19 0x0.0p0 0x1.eaa98b97ca77ep3 -0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31291 3 OK 0x1.59b630edbe02ap20 0x1.14aeb9e51873bp19 0x0.0p0 0x1.555550fbd08a2p2 0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31291 4 OK 0x1.3b10e163a5633p21 0x1.2492935c95a01p19 0x0.0p0 0x1.eaa98b97ca77ep3 0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31292 0 OK 0x1.e7edfe9fbe734p20 0x0.0p0 0x0.0p0 0x1.aaaa87d3d7876p3 0x0.0p0 0x0.0p0 T +REG esri:31292 1 OK 0x1.59b630edbe02bp20 -0x1.14aeb9e51873bp19 0x0.0p0 0x1.0aaaa87de845p3 -0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31292 2 OK 0x1.3b10e163a5634p21 -0x1.2492935c95a02p19 0x0.0p0 0x1.2554c5cbe53bfp4 -0x1.3ffffae859facp2 0x0.0p0 F +REG esri:31292 3 OK 0x1.59b630edbe02bp20 0x1.14aeb9e51873bp19 0x0.0p0 0x1.0aaaa87de845p3 0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31292 4 OK 0x1.3b10e163a5634p21 0x1.2492935c95a02p19 0x0.0p0 0x1.2554c5cbe53bfp4 0x1.3ffffae859facp2 0x0.0p0 F +REG esri:31293 0 OK 0x1.e7edfe9fbe732p20 0x0.0p0 0x0.0p0 0x1.055543e9ebc3ap4 0x0.0p0 0x0.0p0 T +REG esri:31293 1 OK 0x1.59b630edbe02ap20 -0x1.14aeb9e51873bp19 0x0.0p0 0x1.6aaaa87de844fp3 -0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31293 2 OK 0x1.3b10e163a5634p21 -0x1.2492935c95a01p19 0x0.0p0 0x1.5554c5cbe53bep4 -0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31293 3 OK 0x1.59b630edbe02ap20 0x1.14aeb9e51873bp19 0x0.0p0 0x1.6aaaa87de844fp3 0x1.3fffffc818059p2 0x0.0p0 F +REG esri:31293 4 OK 0x1.3b10e163a5634p21 0x1.2492935c95a01p19 0x0.0p0 0x1.5554c5cbe53bep4 0x1.3ffffae859fabp2 0x0.0p0 F +REG esri:31294 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 0x0.0p0 T +REG esri:31294 1 OK -0x1.8ba2097e4b19ep18 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5555555728311p2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31294 2 OK 0x1.584d04bf258cfp19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.eaaaaaa9c13cbp3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31294 3 OK -0x1.8ba2097e4b19ep18 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5555555728311p2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31294 4 OK 0x1.584d04bf258cfp19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.eaaaaaa9c13cbp3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31295 0 OK 0x1.b774p18 0x0.0p0 0x0.0p0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 0x0.0p0 T +REG esri:31295 1 OK -0x1.9aa825f92c67p16 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0aaaaaab94188p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31295 2 OK 0x1.eac904bf258cep19 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.25555554e09e5p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31295 3 OK -0x1.9aa825f92c67p16 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0aaaaaab94188p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31295 4 OK 0x1.eac904bf258cep19 0x1.0ef87252d3b33p19 0x0.0p0 0x1.25555554e09e5p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31296 0 OK 0x1.6e36p19 0x0.0p0 0x0.0p0 0x1.0555555555554p4 0x0.0p0 0x0.0p0 T +REG esri:31296 1 OK 0x1.7c9bed0369cc4p17 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.6aaaaaab94187p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31296 2 OK 0x1.3ea2825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.55555554e09e5p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31296 3 OK 0x1.7c9bed0369cc4p17 0x1.0ef87252d3b33p19 0x0.0p0 0x1.6aaaaaab94187p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31296 4 OK 0x1.3ea2825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.55555554e09e5p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31297 0 OK 0x1.86ap18 0x1.86ap18 0x0.0p0 0x1.aaaaaaaaaaaa9p3 0x1.7bffffffff6cep5 0x0.0p0 F +REG esri:31297 1 OK 0x1.6d070a028b0ep15 0x1.2b636f2193508p16 0x0.0p0 0x1.1c9195d1a8502p3 0x1.63ffffffffff3p5 0x0.0p0 F +REG esri:31297 2 OK 0x1.6fcf8f5fd74f3p19 0x1.2b636f2193508p16 0x0.0p0 0x1.1c61dfc1d6829p4 0x1.63ffffffffff3p5 0x0.0p0 F +REG esri:31297 3 OK 0x1.4b58e70cc3668p16 0x1.6a9dd977ff85ep19 0x0.0p0 0x1.1c9195d1a8502p3 0x1.93ffffffffa65p5 0x0.0p0 F +REG esri:31297 4 OK 0x1.5d34e31e67934p19 0x1.6a9dd977ff85ep19 0x0.0p0 0x1.1c61dfc1d6829p4 0x1.93ffffffffa65p5 0x0.0p0 F +REG esri:31300 0 OK 0x1.24f8019b90eaap17 0x1.1e2576e331923p21 0x0.0p0 0x1.16d819b4659ep2 0x1.17aaaaaaaaaa8p6 0x0.0p0 F +REG esri:31300 1 OK -0x1.313b9b89bbe4ep21 0x1.5c62130f667aap20 0x0.0p0 -0x1.3a9adc1bddcbfp5 0x1.b7555555552dbp5 0x0.0p0 F +REG esri:31300 2 OK 0x1.55da9bbd2e025p21 0x1.5c62130f667aap20 0x0.0p0 0x1.8050e288f7337p5 0x1.b7555555552dap5 0x0.0p0 F +REG esri:31300 3 OK -0x1.a71d04b1124d5p18 0x1.143af10678bc7p22 0x0.0p0 -0x1.3a9adc1bddcbfp5 0x1.53aaaaaaaaaabp6 0x0.0p0 F +REG esri:31300 4 OK 0x1.660a8326519c2p19 0x1.143af10678bc7p22 0x0.0p0 0x1.8050e288f7339p5 0x1.53aaaaaaaaaaap6 0x0.0p0 F +REG esri:31370 0 OK 0x1.24f801a9fbe77p17 0x1.1e257777e81bbp21 0x0.0p0 0x1.1784e6cbc3292p2 0x1.17aaaabdae4bap6 0x0.0p0 F +REG esri:31370 1 OK -0x1.313b9b9c0e84bp21 0x1.5c62149827e8ep20 0x0.0p0 -0x1.3a8542c83e86dp5 0x1.b755557b5c702p5 0x0.0p0 F +REG esri:31370 2 OK 0x1.55da9bd14e019p21 0x1.5c62149827e8ap20 0x0.0p0 0x1.80667c7b2f511p5 0x1.b755557b5c701p5 0x0.0p0 F +REG esri:31370 3 OK -0x1.a71d02f988e1cp18 0x1.143af147ea04dp22 0x0.0p0 -0x1.3a8542c83e86cp5 0x1.53aaaabdae4bep6 0x0.0p0 F +REG esri:31370 4 OK 0x1.660a8251c2649p19 0x1.143af147ea04dp22 0x0.0p0 0x1.80667c7b2f51p5 0x1.53aaaabdae4bep6 0x0.0p0 F +REG esri:31461 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:31461 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 -0x1.fffffff8b4907p0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31461 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.fffffffe2d244p2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31461 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 -0x1.fffffff8b4907p0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31461 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.fffffffe2d244p2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31462 0 OK 0x1.312dp21 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG esri:31462 1 OK 0x1.dad27da06d398p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31462 2 OK 0x1.74f0c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31462 3 OK 0x1.dad27da06d398p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31462 4 OK 0x1.74f0c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31463 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:31463 1 OK 0x1.677b3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31463 2 OK 0x1.ef02c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31463 3 OK 0x1.677b3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31463 4 OK 0x1.ef02c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31464 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG esri:31464 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31464 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31464 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31464 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31465 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:31465 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31465 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31465 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31465 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31466 0 OK 0x1.312dp21 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG esri:31466 1 OK 0x1.dad27da06d398p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31466 2 OK 0x1.74f0c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31466 3 OK 0x1.dad27da06d398p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31466 4 OK 0x1.74f0c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31467 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:31467 1 OK 0x1.677b3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31467 2 OK 0x1.ef02c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31467 3 OK 0x1.677b3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31467 4 OK 0x1.ef02c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31468 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG esri:31468 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31468 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31468 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31468 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31469 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:31469 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31469 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31469 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31469 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:3148 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:3148 1 OK -0x1.acdef72748ep15 -0x1.0eddea79e9b9ap19 0x0.0p0 0x1.9p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:3148 2 OK 0x1.018af7b93a452p20 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.b8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:3148 3 OK -0x1.acdef72748ep15 0x1.0eddea79e9b9ap19 0x0.0p0 0x1.9p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:3148 4 OK 0x1.018af7b93a452p20 0x1.0eddea79e9b99p19 0x0.0p0 0x1.b8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:3149 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:3149 1 OK -0x1.acdef72748a4p15 -0x1.0eddea79e9b99p19 0x0.0p0 0x1.a8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:3149 2 OK 0x1.018af7b93a476p20 -0x1.0eddea79e9b9ap19 0x0.0p0 0x1.d000000000001p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:3149 3 OK -0x1.acdef72748a4p15 0x1.0eddea79e9b99p19 0x0.0p0 0x1.a8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:3149 4 OK 0x1.018af7b93a476p20 0x1.0eddea79e9b9ap19 0x0.0p0 0x1.d000000000001p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:31491 0 OK 0x1.6e36p20 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:31491 1 OK 0x1.cd5cfb40da731p19 -0x1.0ef87252d3b33p19 0x0.0p0 -0x1.fffffff8b4907p0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31491 2 OK 0x1.f5bd825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.fffffffe2d244p2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31491 3 OK 0x1.cd5cfb40da731p19 0x1.0ef87252d3b33p19 0x0.0p0 -0x1.fffffff8b4907p0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31491 4 OK 0x1.f5bd825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.fffffffe2d244p2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31492 0 OK 0x1.312dp21 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG esri:31492 1 OK 0x1.dad27da06d398p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31492 2 OK 0x1.74f0c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31492 3 OK 0x1.dad27da06d398p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6f6p0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31492 4 OK 0x1.74f0c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16922p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31493 0 OK 0x1.ab3fp21 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:31493 1 OK 0x1.677b3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31493 2 OK 0x1.ef02c12fc9634p21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31493 3 OK 0x1.677b3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbdp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31493 4 OK 0x1.ef02c12fc9634p21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31494 0 OK 0x1.12a88p22 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG esri:31494 1 OK 0x1.e18d3ed0369ccp21 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31494 2 OK 0x1.348a6097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31494 3 OK 0x1.e18d3ed0369ccp21 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31494 4 OK 0x1.348a6097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31495 0 OK 0x1.4fb18p22 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:31495 1 OK 0x1.2dcf9f681b4e6p22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31495 2 OK 0x1.71936097e4b1ap22 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31495 3 OK 0x1.2dcf9f681b4e6p22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.40000000e96dep3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31495 4 OK 0x1.71936097e4b1ap22 0x1.0ef87252d3b33p19 0x0.0p0 0x1.3fffffff8b49p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG esri:31528 0 OK 0x1.e80af7fdb29dcp18 0x1.1fe2c69a4cd48p3 -0x1.6f1e4656cp4 -0x1.dffffffffffffp3 0x0.0p0 -0x1.0p-30 T +REG esri:31528 1 OK -0x1.af612db0adbp15 -0x1.0ee280312a10dp19 -0x1.1d350d9p-1 -0x1.3ffffffffffffp4 -0x1.3fffffffffffcp2 -0x1.0p-30 F +REG esri:31528 2 OK 0x1.018085391d142p20 -0x1.0ee2802f953adp19 -0x1.57b8926ep5 -0x1.4p3 -0x1.4p2 -0x1.8p-29 F +REG esri:31528 3 OK -0x1.af60e768302ep15 0x1.0ee4bff1c7cccp19 0x1.030c02ap0 -0x1.3fffffffffffep4 0x1.4p2 0x1.0p-30 F +REG esri:31528 4 OK 0x1.01808307571b5p20 0x1.0ee4bff032f01p19 -0x1.4b2b58a14p5 -0x1.3ffffffffffffp3 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:31529 0 OK 0x1.e808f8aeb120dp18 0x1.1fe31416cf39p3 -0x1.87b174de6p5 -0x1.2000000000002p3 0x0.0p0 0x0.0p0 T +REG esri:31529 1 OK -0x1.af75ac4c35a7p15 -0x1.0ee2c94890baep19 -0x1.9aea7842cp4 -0x1.c000000000001p3 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:31529 2 OK 0x1.01802984db7eap20 -0x1.0ee2c946eedc5p19 -0x1.15e9a2972p6 -0x1.0p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:31529 3 OK -0x1.af7566033dbcp15 0x1.0ee50909c8371p19 -0x1.81d009268p4 -0x1.cp3 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:31529 4 OK 0x1.0180275315d1ep20 0x1.0ee509082651dp19 -0x1.0fa303f84p6 -0x1.0000000000002p2 0x1.4000000000001p2 -0x1.8p-29 F +REG esri:31600 0 OK 0x1.e869bb9a0ad63p18 0x1.e89d44061c1d4p18 -0x1.24bbd60ccp4 0x1.96478a4fd92c8p4 0x1.6f3333333332ap5 -0x1.0p-30 T +REG esri:31600 1 OK -0x1.9cfc127ec3fa8p16 -0x1.c7fd2fb5cf1ap14 -0x1.e97ffb74ap5 0x1.235290d1d994p4 0x1.473333333332p5 0x1.0p-30 T +REG esri:31600 2 OK 0x1.0e049b8358644p20 -0x1.c7f941ebefa2p14 -0x1.1d596a13cp5 0x1.049e41e6ec625p5 0x1.473333333331cp5 -0x1.0p-28 T +REG esri:31600 3 OK -0x1.6ab6a446e554p12 0x1.07bdfe99f69p20 0x1.239f0cfp-2 0x1.235290d1d9942p4 0x1.9733333332dc8p5 -0x1.0p-30 T +REG esri:31600 4 OK 0x1.eb3f2fe10b9fp19 0x1.07bdedd3b7a2dp20 0x1.593c15268p4 0x1.049e41e6ec625p5 0x1.9733333332dcbp5 -0x1.0p-29 T +REG esri:31700 0 OK 0x1.e848p18 0x1.e848p18 0x0.0p0 0x1.9p4 0x1.6fffffffffff4p5 0x0.0p0 T +REG esri:31700 1 OK -0x1.9e6a980cd3fep16 -0x1.cca802300ac6p14 0x0.0p0 0x1.1cd5e1cf3d2a8p4 0x1.47fffffffffeap5 0x0.0p0 T +REG esri:31700 2 OK 0x1.0e0aa980cd3fcp20 -0x1.cca802300ac6p14 0x0.0p0 0x1.01950f18616acp5 0x1.47fffffffffeap5 0x0.0p0 T +REG esri:31700 3 OK -0x1.6b20423721dcp12 0x1.07b13fd4d0e98p20 0x0.0p0 0x1.1cd5e1cf3d2a8p4 0x1.97ffffffffad1p5 0x0.0p0 T +REG esri:31700 4 OK 0x1.eb1e40846e43ap19 0x1.07b13fd4d0e98p20 0x0.0p0 0x1.01950f18616acp5 0x1.97ffffffffad1p5 0x0.0p0 T +REG esri:3176 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.a8p6 0x0.0p0 0x0.0p0 T +REG esri:3176 1 OK -0x1.acdef7069137p15 -0x1.0eddea79d4d9ep19 0x0.0p0 0x1.940000001cef4p6 -0x1.3fffffffeb2d9p2 0x0.0p0 F +REG esri:3176 2 OK 0x1.018af7b8348a2p20 -0x1.0eddea79d4d9ep19 0x0.0p0 0x1.bbffffffe310dp6 -0x1.3fffffffeb2d9p2 0x0.0p0 F +REG esri:3176 3 OK -0x1.acdef7069137p15 0x1.0eddea79d4d9ep19 0x0.0p0 0x1.940000001cef4p6 0x1.3fffffffeb2d9p2 0x0.0p0 F +REG esri:3176 4 OK 0x1.018af7b8348a2p20 0x1.0eddea79d4d9ep19 0x0.0p0 0x1.bbffffffe310dp6 0x1.3fffffffeb2d9p2 0x0.0p0 F +REG esri:31838 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:31838 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31838 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31838 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31838 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31839 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:31839 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31839 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31839 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31839 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:31900 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p5 0x0.0p0 0x0.0p0 T +REG esri:31900 1 OK -0x1.ad750e7d869bp15 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.580000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:31900 2 OK 0x1.018fa873ec34ap20 -0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.a7ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:31900 3 OK -0x1.ad750e7d869bp15 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.580000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:31900 4 OK 0x1.018fa873ec34ap20 0x1.0ee35b73f5e6cp19 0x0.0p0 0x1.a7ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:31986 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:31986 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 -0x1.4p2 0x0.0p0 F +REG esri:31986 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 -0x1.4p2 0x0.0p0 F +REG esri:31986 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.58p6 0x1.4p2 0x0.0p0 F +REG esri:31986 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.3p6 0x1.4p2 0x0.0p0 F +REG esri:31987 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:31987 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 -0x1.4p2 0x0.0p0 F +REG esri:31987 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 -0x1.4p2 0x0.0p0 F +REG esri:31987 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.4p6 0x1.4p2 0x0.0p0 F +REG esri:31987 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.18p6 0x1.4p2 0x0.0p0 F +REG esri:31988 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:31988 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 -0x1.4p2 0x0.0p0 F +REG esri:31988 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:31988 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.28p6 0x1.4p2 0x0.0p0 F +REG esri:31988 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:31989 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:31989 1 OK -0x1.ad750e9eafffp15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 -0x1.4p2 0x0.0p0 F +REG esri:31989 2 OK 0x1.018fa874f57fap20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:31989 3 OK -0x1.ad750e9eafffp15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.1p6 0x1.4p2 0x0.0p0 F +REG esri:31989 4 OK 0x1.018fa874f57fap20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:31990 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:31990 1 OK -0x1.ad750e9eafe7p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 -0x1.4p2 0x0.0p0 F +REG esri:31990 2 OK 0x1.018fa874f5803p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 -0x1.4p2 0x0.0p0 F +REG esri:31990 3 OK -0x1.ad750e9eafe7p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.fp5 0x1.4p2 0x0.0p0 F +REG esri:31990 4 OK 0x1.018fa874f5803p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.ap5 0x1.4p2 0x0.0p0 F +REG esri:31991 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:31991 1 OK -0x1.ad750e9eaff4p15 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 -0x1.4p2 0x0.0p0 F +REG esri:31991 2 OK 0x1.018fa874f58p20 -0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 -0x1.4p2 0x0.0p0 F +REG esri:31991 3 OK -0x1.ad750e9eaff4p15 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.cp5 0x1.4p2 0x0.0p0 F +REG esri:31991 4 OK 0x1.018fa874f58p20 0x1.0ee35b740b12bp19 0x0.0p0 -0x1.7p5 0x1.4p2 0x0.0p0 F +REG esri:31992 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.44p6 -0x1.9p4 0x0.0p0 F +REG esri:31992 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31992 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31992 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31992 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31993 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.2cp6 -0x1.9p4 0x0.0p0 F +REG esri:31993 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31993 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31993 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31993 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31994 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.14p6 -0x1.9p4 0x0.0p0 F +REG esri:31994 1 OK -0x1.fbe5023e2aap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31994 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31994 3 OK -0x1.2fd8271ed48f8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG esri:31994 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31995 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.f8p5 -0x1.9p4 0x0.0p0 F +REG esri:31995 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31995 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31995 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31995 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31996 0 OK 0x1.e848000000016p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.c800000000001p5 -0x1.9p4 0x0.0p0 F +REG esri:31996 1 OK -0x1.fbe5023e2a7ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:31996 2 OK 0x1.f8272811f155cp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31996 3 OK -0x1.2fd8271ed484p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31996 4 OK 0x1.07218271ed495p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31997 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 -0x1.98p5 -0x1.9p4 0x0.0p0 F +REG esri:31997 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31997 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31997 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31997 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31998 0 OK 0x1.e848p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.68p5 -0x1.9p4 0x0.0p0 F +REG esri:31998 1 OK -0x1.fbe5023e2a96p14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31998 2 OK 0x1.f8272811f154bp19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31998 3 OK -0x1.2fd8271ed48c8p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31998 4 OK 0x1.07218271ed48cp20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31999 0 OK 0x1.e847ffffffff5p18 0x1.b997b102aac2p22 0x0.0p0 -0x1.38p5 -0x1.9p4 0x0.0p0 F +REG esri:31999 1 OK -0x1.fbe5023e2aaap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31999 2 OK 0x1.f8272811f1545p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:31999 3 OK -0x1.2fd8271ed492p16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:31999 4 OK 0x1.07218271ed48ap20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:3200 0 OK 0x1.6e36p20 0x1.1cb78p20 0x0.0p0 0x1.68p5 0x1.03fffffffffbcp5 0x0.0p0 F +REG esri:3200 1 OK 0x1.bdce4a1e7dc43p19 0x1.32c56834522afp19 0x0.0p0 0x1.38928b4db1cbap5 0x1.b7fffffffff39p4 0x0.0p0 F +REG esri:3200 2 OK 0x1.fd84daf0c11dep20 0x1.32c56834522afp19 0x0.0p0 0x1.976d74b24e346p5 0x1.b7fffffffff39p4 0x0.0p0 F +REG esri:3200 3 OK 0x1.dbe4fc3d9fe4bp19 0x1.a7b68ee8f803cp20 0x0.0p0 0x1.38928b4db1cbap5 0x1.2bfffffffffd9p5 0x0.0p0 F +REG esri:3200 4 OK 0x1.ee7981e1300dap20 0x1.a7b68ee8f803cp20 0x0.0p0 0x1.976d74b24e346p5 0x1.2bfffffffffd9p5 0x0.0p0 F +REG esri:32000 0 OK 0x1.e84800000000bp18 0x1.b997b102aac2p22 0x0.0p0 -0x1.08p5 -0x1.9p4 0x0.0p0 F +REG esri:32000 1 OK -0x1.fbe5023e2a8ap14 0x1.97014c7538ba8p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:32000 2 OK 0x1.f8272811f155p19 0x1.97014c7538ba8p22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.dfffffffffffep4 0x0.0p0 F +REG esri:32000 3 OK -0x1.2fd8271ed48ap16 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32000 4 OK 0x1.07218271ed49p20 0x1.dacaa07d1bddap22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32001 0 OK 0x1.e848p20 0x1.31c66175b2201p18 0x0.0p0 -0x1.b600000000001p6 0x1.7edddddddd48bp5 0x0.0p0 F +REG esri:32001 1 OK 0x1.49dc28b07853p20 -0x1.27446f29eaa14p18 0x0.0p0 -0x1.c03be7769007bp6 0x1.7122222222219p5 0x0.0p0 F +REG esri:32001 2 OK 0x1.4359eba7c3d6ep21 -0x1.27446f29eaa14p18 0x0.0p0 -0x1.abc418896ff86p6 0x1.7122222222219p5 0x0.0p0 F +REG esri:32001 3 OK 0x1.540d36b23d7e8p20 0x1.cfa82df47c933p19 0x0.0p0 -0x1.c03be7769007bp6 0x1.8c9999999928cp5 0x0.0p0 F +REG esri:32001 4 OK 0x1.3e4164a6e1412p21 0x1.cfa82df47c933p19 0x0.0p0 -0x1.abc418896ff86p6 0x1.8c9999999928cp5 0x0.0p0 F +REG esri:32002 0 OK 0x1.e848p20 0x1.6d0f14451e294p18 0x0.0p0 -0x1.b600000000001p6 0x1.76dddddddddd5p5 0x0.0p0 F +REG esri:32002 1 OK 0x1.2a36bbaace49bp20 -0x1.5e8dc5ef8006ep18 0x0.0p0 -0x1.c1fde20665f2fp6 0x1.667777777776dp5 0x0.0p0 F +REG esri:32002 2 OK 0x1.532ca22a98dbap21 -0x1.5e8dc5ef8006ep18 0x0.0p0 -0x1.aa021df99a0d1p6 0x1.667777777776bp5 0x0.0p0 F +REG esri:32002 3 OK 0x1.38389edac30f2p20 0x1.1539ab4e07352p20 0x0.0p0 -0x1.c1fde20665f2fp6 0x1.8744444443c61p5 0x0.0p0 F +REG esri:32002 4 OK 0x1.4c2bb0929e78ep21 0x1.1539ab4e07352p20 0x0.0p0 -0x1.aa021df99a0d1p6 0x1.8744444443c61p5 0x0.0p0 F +REG esri:32003 0 OK 0x1.e848p20 0x1.ab46ad5a6d105p18 0x0.0p0 -0x1.b600000000001p6 0x1.699999999998fp5 0x0.0p0 F +REG esri:32003 1 OK 0x1.08ea87bcc82c3p20 -0x1.98729460d70bcp18 0x0.0p0 -0x1.c39fc45f44299p6 0x1.5666666666655p5 0x0.0p0 F +REG esri:32003 2 OK 0x1.63d2bc219bea6p21 -0x1.98729460d70bcp18 0x0.0p0 -0x1.a8603ba0bbd67p6 0x1.5666666666655p5 0x0.0p0 F +REG esri:32003 3 OK 0x1.1b12d76b2226ep20 0x1.44e20ffe1425bp20 0x0.0p0 -0x1.c39fc45f44299p6 0x1.7ccccccccc316p5 0x0.0p0 F +REG esri:32003 4 OK 0x1.5abe944a6eedp21 0x1.44e20ffe1425bp20 0x0.0p0 -0x1.a8603ba0bbd67p6 0x1.7ccccccccc316p5 0x0.0p0 F +REG esri:32005 0 OK 0x1.e848p20 0x1.07ede325ba70ap18 0x0.0p0 -0x1.9p6 0x1.5099999999986p5 0x0.0p0 F +REG esri:32005 1 OK 0x1.60bb8bf5de00ep20 -0x1.0195ec406b82cp18 0x0.0p0 -0x1.97fe570c30a39p6 0x1.44bbbbbbbbba6p5 0x0.0p0 F +REG esri:32005 2 OK 0x1.37ea3a0510ff9p21 -0x1.0195ec406b82cp18 0x0.0p0 -0x1.8801a8f3cf5c7p6 0x1.44bbbbbbbbba6p5 0x0.0p0 F +REG esri:32005 3 OK 0x1.66eea2345f047p20 0x1.8efbbc1e5c31fp19 0x0.0p0 -0x1.97fe570c30a39p6 0x1.5c77777777769p5 0x0.0p0 F +REG esri:32005 4 OK 0x1.34d0aee5d07dcp21 0x1.8efbbc1e5c31fp19 0x0.0p0 -0x1.8801a8f3cf5c7p6 0x1.5c77777777769p5 0x0.0p0 F +REG esri:32006 0 OK 0x1.e848p20 0x1.6ca91487a9cc9p18 0x0.0p0 -0x1.8ep6 0x1.458888888887p5 0x0.0p0 F +REG esri:32006 1 OK 0x1.2b9f96f40ff96p20 -0x1.611010b897922p18 0x0.0p0 -0x1.98d08e5c9d95fp6 0x1.35222222221fdp5 0x0.0p0 F +REG esri:32006 2 OK 0x1.52783485f803dp21 -0x1.611010b897922p18 0x0.0p0 -0x1.832f71a3626a1p6 0x1.35222222221fdp5 0x0.0p0 F +REG esri:32006 3 OK 0x1.36e9d0fe2830ap20 0x1.144b208e2f1fbp20 0x0.0p0 -0x1.98d08e5c9d95fp6 0x1.55eeeeeeeeedcp5 0x0.0p0 F +REG esri:32006 4 OK 0x1.4cd31780ebe83p21 0x1.144b208e2f1fbp20 0x0.0p0 -0x1.832f71a3626a1p6 0x1.55eeeeeeeeedcp5 0x0.0p0 F +REG esri:32007 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG esri:32007 1 OK -0x1.5dd1a2f05f05p20 -0x1.af96b40da635ap20 0x0.0p0 -0x1.e6acb8641fdf4p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG esri:32007 2 OK 0x1.28fad1782f83p21 -0x1.af96b40da6359p20 0x0.0p0 -0x1.b5fdf2468acb2p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG esri:32007 3 OK -0x1.27c9ee60ea9dp20 0x1.caa3fd77a6225p20 0x0.0p0 -0x1.e6acb863facd7p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG esri:32007 4 OK 0x1.0df6f730754fp21 0x1.caa3fd77a6226p20 0x0.0p0 -0x1.b5fdf246afddp6 0x1.3dffffff8c1dbp5 0x0.0p0 F +REG esri:32008 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG esri:32008 1 OK -0x1.5dd1a2f05f05p20 -0x1.af96b40da635ap20 0x0.0p0 -0x1.eb020db97534dp6 0x1.dbffffff8f108p4 0x0.0p0 F +REG esri:32008 2 OK 0x1.28fad1782f828p21 -0x1.af96b40da635ap20 0x0.0p0 -0x1.ba53479be020cp6 0x1.dbffffff8f108p4 0x0.0p0 F +REG esri:32008 3 OK -0x1.27c9ee60ea9dp20 0x1.caa3fd77a6225p20 0x0.0p0 -0x1.eb020db95023p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG esri:32008 4 OK 0x1.0df6f730754e8p21 0x1.caa3fd77a6225p20 0x0.0p0 -0x1.ba53479c0532ap6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG esri:32009 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG esri:32009 1 OK -0x1.5dd1a2f05f05p20 -0x1.af96b40da635ap20 0x0.0p0 -0x1.f2acb8641fdf3p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG esri:32009 2 OK 0x1.28fad1782f828p21 -0x1.af96b40da635ap20 0x0.0p0 -0x1.c1fdf2468acb2p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG esri:32009 3 OK -0x1.27c9ee60ea9dp20 0x1.caa3fd77a6225p20 0x0.0p0 -0x1.f2acb863facd6p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG esri:32009 4 OK 0x1.0df6f730754e8p21 0x1.caa3fd77a6225p20 0x0.0p0 -0x1.c1fdf246afddp6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG esri:32010 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG esri:32010 1 OK -0x1.668c5d2794af1p20 -0x1.ab4d308e00c78p20 0x0.0p0 -0x1.39cb22ddbd575p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG esri:32010 2 OK 0x1.2d582e93ca57p21 -0x1.ab4d308e00c79p20 0x0.0p0 -0x1.038a327797fe2p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG esri:32010 3 OK -0x1.1f1d50062ab0ap20 0x1.cef34477487f5p20 0x0.0p0 -0x1.39cb22dd1c5afp6 0x1.7bfffffed62fdp5 0x0.0p0 F +REG esri:32010 4 OK 0x1.09a0a8031557ep21 0x1.cef34477487f5p20 0x0.0p0 -0x1.038a327838fa8p6 0x1.7bfffffed62fep5 0x0.0p0 F +REG esri:32011 0 OK 0x1.e848p20 0x0.0p0 0x0.0p0 -0x1.2aaaaaaaaaaabp6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:32011 1 OK 0x1.7ffdfa0084c6p15 -0x1.ad7e99a761c5ap20 0x0.0p0 -0x1.44576bc148ab5p6 0x1.0eaaaaaa3fb07p5 0x0.0p0 F +REG esri:32011 2 OK 0x1.e2480817fdecep21 -0x1.ad7e99a761c5ap20 0x0.0p0 -0x1.10fde9940caa1p6 0x1.0eaaaaaa3fb07p5 0x0.0p0 F +REG esri:32011 3 OK 0x1.2aea890de596cp18 0x1.ccd926da4f788p20 0x0.0p0 -0x1.44576bc0f00d1p6 0x1.5eaaaaa9e9fc6p5 0x0.0p0 F +REG esri:32011 4 OK 0x1.c2eaaede434d2p21 0x1.ccd926da4f788p20 0x0.0p0 -0x1.10fde99465486p6 0x1.5eaaaaa9e9fc6p5 0x0.0p0 F +REG esri:32012 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:32012 1 OK -0x1.5a2cb060d3c08p20 -0x1.b153c5fb741e6p20 0x0.0p0 -0x1.b8aa7f0f68285p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:32012 2 OK 0x1.2728583069e04p21 -0x1.b153c5fb741e6p20 0x0.0p0 -0x1.8a002b9b42821p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:32012 3 OK -0x1.2b65bd24fa37p20 0x1.c8c877e3f0bf4p20 0x0.0p0 -0x1.b8aa7f0f61996p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:32012 4 OK 0x1.0fc4de927d1b8p21 0x1.c8c877e3f0bf4p20 0x0.0p0 -0x1.8a002b9b4910fp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:32013 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:32013 1 OK -0x1.5a2b9c2bc88b7p20 -0x1.b152c65f46cf5p20 0x0.0p0 -0x1.c05529ba12d33p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:32013 2 OK 0x1.2727ce15e445cp21 -0x1.b152c65f46cf5p20 0x0.0p0 -0x1.91aad645ed2cep6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:32013 3 OK -0x1.2b64c487b07d4p20 0x1.c8c76a71ba584p20 0x0.0p0 -0x1.c05529ba0c444p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:32013 4 OK 0x1.0fc46243d83eap21 0x1.c8c76a71ba584p20 0x0.0p0 -0x1.91aad645f3bbdp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:32014 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:32014 1 OK -0x1.5a2da5e54f7dep20 -0x1.b154a930f1b9ep20 0x0.0p0 -0x1.c6aa7f0f68285p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:32014 2 OK 0x1.2728d2f2a7befp21 -0x1.b154a930f1b9ep20 0x0.0p0 -0x1.98002b9b4282p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG esri:32014 3 OK -0x1.2b669a229114fp20 0x1.c8c96765e8372p20 0x0.0p0 -0x1.c6aa7f0f61997p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:32014 4 OK 0x1.0fc54d11488a8p21 0x1.c8c96765e8372p20 0x0.0p0 -0x1.98002b9b4910ep6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG esri:32015 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2955555555555p6 0x1.4p5 0x0.0p0 F +REG esri:32015 1 OK -0x1.638a2ee103bcfp20 -0x1.acd3b3dc970d4p20 0x0.0p0 -0x1.437104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG esri:32015 2 OK 0x1.2bd7177081de8p21 -0x1.acd3b3dc970d4p20 0x0.0p0 -0x1.0f39a5e3fb04bp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG esri:32015 3 OK -0x1.2224c9a58f195p20 0x1.cd7f5563d90afp20 0x0.0p0 -0x1.437104c6435aap6 0x1.67ffffff2235bp5 0x0.0p0 F +REG esri:32015 4 OK 0x1.0b2464d2c78cap21 0x1.cd7f5563d90afp20 0x0.0p0 -0x1.0f39a5e467501p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG esri:32016 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:32016 1 OK -0x1.6386a32148bbep20 -0x1.acd084d48cb1fp20 0x0.0p0 -0x1.4c7104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG esri:32016 2 OK 0x1.2bd55190a45dfp21 -0x1.acd084d48cb1fp20 0x0.0p0 -0x1.1839a5e3fb04bp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG esri:32016 3 OK -0x1.2221ba30a31d7p20 0x1.cd7be843d58a6p20 0x0.0p0 -0x1.4c7104c6435abp6 0x1.67ffffff2235bp5 0x0.0p0 F +REG esri:32016 4 OK 0x1.0b22dd18518ecp21 0x1.cd7be843d58a6p20 0x0.0p0 -0x1.1839a5e4675p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG esri:32017 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:32017 1 OK -0x1.6386a32148bbep20 -0x1.acd084d48cb1fp20 0x0.0p0 -0x1.547104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG esri:32017 2 OK 0x1.2bd55190a45dfp21 -0x1.acd084d48cb1fp20 0x0.0p0 -0x1.2039a5e3fb04cp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG esri:32017 3 OK -0x1.2221ba30a31d7p20 0x1.cd7be843d58a6p20 0x0.0p0 -0x1.547104c6435abp6 0x1.67ffffff2235bp5 0x0.0p0 F +REG esri:32017 4 OK 0x1.0b22dd18518ecp21 0x1.cd7be843d58a6p20 0x0.0p0 -0x1.2039a5e4675p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG esri:32018 0 OK 0x1.e848p19 0x1.7b8050864a58dp16 0x0.0p0 -0x1.28p6 0x1.4622222222209p5 0x0.0p0 F +REG esri:32018 1 OK 0x1.33046af3d5507p19 -0x1.022c021b05747p18 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.3e22222222204p5 0x0.0p0 F +REG esri:32018 2 OK 0x1.4ec5ca861557cp20 -0x1.022c021b05747p18 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.3e22222222204p5 0x0.0p0 F +REG esri:32018 3 OK 0x1.38614ece85de8p19 0x1.c55c1e2365fb3p18 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.4e2222222220dp5 0x0.0p0 F +REG esri:32018 4 OK 0x1.4c175898bd10cp20 0x1.c55c1e2365fb3p18 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.4e2222222220dp5 0x0.0p0 F +REG esri:32019 0 OK 0x1.e848p20 0x1.ad7227a0bfa7p18 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa77p5 0x0.0p0 F +REG esri:32019 1 OK 0x1.0a3c0fede336p20 -0x1.a0670d69a9745p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555514p5 0x0.0p0 F +REG esri:32019 2 OK 0x1.6329f8090e647p21 -0x1.a0670d69a9745p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555514p5 0x0.0p0 F +REG esri:32019 3 OK 0x1.16fe0c3651441p20 0x1.454587797616dp20 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffd6p5 0x0.0p0 F +REG esri:32019 4 OK 0x1.5cc8f9e4d75d8p21 0x1.454587797616dp20 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffd6p5 0x0.0p0 F +REG esri:32020 0 OK 0x1.e848p20 0x1.34b7f9384e351p18 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee59cp5 0x0.0p0 F +REG esri:32020 1 OK 0x1.484bfad484991p20 -0x1.2a052c42909b9p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:32020 2 OK 0x1.44220295bdb3ep21 -0x1.2a052c42909b9p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:32020 3 OK 0x1.52a7f6f6d4a82p20 0x1.d42de7fb53935p19 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG esri:32020 4 OK 0x1.3ef4048495ac6p21 0x1.d42de7fb53935p19 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG esri:32021 0 OK 0x1.e848p20 0x1.437d6fdbde189p18 0x0.0p0 -0x1.9200000000001p6 0x1.749999999998ep5 0x0.0p0 F +REG esri:32021 1 OK 0x1.409abc9ca85f3p20 -0x1.3841e3075a518p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111103p5 0x0.0p0 F +REG esri:32021 2 OK 0x1.47faa1b1abd0ep21 -0x1.3841e3075a518p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111103p5 0x0.0p0 F +REG esri:32021 3 OK 0x1.4b7cc84dac081p20 0x1.ea984bce2418fp19 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.832222222198fp5 0x0.0p0 F +REG esri:32021 4 OK 0x1.42899bd929fc6p21 0x1.ea984bce2418fp19 0x0.0p0 -0x1.876dc813d644fp6 0x1.832222222198fp5 0x0.0p0 F +REG esri:32022 0 OK 0x1.e848p20 0x1.69b54ae78c124p18 0x0.0p0 -0x1.4ap6 0x1.457777777775fp5 0x0.0p0 F +REG esri:32022 1 OK 0x1.2d30e0a020f1cp20 -0x1.5e4b33871e99ap18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333314p5 0x0.0p0 F +REG esri:32022 2 OK 0x1.51af8fafef86ap21 -0x1.5e4b33871e99ap18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333314p5 0x0.0p0 F +REG esri:32022 3 OK 0x1.384fcb322f7a8p20 0x1.1208079fc3a1cp20 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbaap5 0x0.0p0 F +REG esri:32022 4 OK 0x1.4c201a66e8425p21 0x1.1208079fc3a1cp20 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbaap5 0x0.0p0 F +REG esri:32023 0 OK 0x1.e848p20 0x1.6999b41e2e242p18 0x0.0p0 -0x1.4ap6 0x1.3822222222204p5 0x0.0p0 F +REG esri:32023 1 OK 0x1.2d86c557cef7ep20 -0x1.5edd2c7a9a14bp18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb6p5 0x0.0p0 F +REG esri:32023 2 OK 0x1.51849d5418839p21 -0x1.5edd2c7a9a14bp18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb6p5 0x0.0p0 F +REG esri:32023 3 OK 0x1.3801c56454e88p20 0x1.11ccff0b402c5p20 0x0.0p0 -0x1.5477d61b148dfp6 0x1.486666666665p5 0x0.0p0 F +REG esri:32023 4 OK 0x1.4c471d4dd58b4p21 0x1.11ccff0b402c5p20 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.486666666665p5 0x0.0p0 F +REG esri:32024 0 OK 0x1.e848p20 0x1.3a00eef358bbp18 0x0.0p0 -0x1.88p6 0x1.1f111111110e6p5 0x0.0p0 F +REG esri:32024 1 OK 0x1.47108e8c4d07cp20 -0x1.32d01a63c5c6dp18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeb9p5 0x0.0p0 F +REG esri:32024 2 OK 0x1.44bfb8b9d97c2p21 -0x1.32d01a63c5c6dp18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeb9p5 0x0.0p0 F +REG esri:32024 3 OK 0x1.4e1e103b1fdcap20 0x1.da8a3c49d8754p19 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d3333333330ep5 0x0.0p0 F +REG esri:32024 4 OK 0x1.4138f7e27011bp21 0x1.da8a3c49d8754p19 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d3333333330ep5 0x0.0p0 F +REG esri:32025 0 OK 0x1.e848p20 0x1.519c92eff77cdp18 0x0.0p0 -0x1.88p6 0x1.124444444440dp5 0x0.0p0 F +REG esri:32025 1 OK 0x1.3adc653ec35f6p20 -0x1.49c7432c38b87p18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:32025 2 OK 0x1.4ad9cd609e505p21 -0x1.49c7432c38b87p18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:32025 3 OK 0x1.428d7962d6a3p20 0x1.fe4687755792dp19 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:32025 4 OK 0x1.4701434e94ae8p21 0x1.fe4687755792dp19 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:32026 0 OK 0x1.e848p20 0x1.9f5c3198cfd77p18 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG esri:32026 1 OK 0x1.0f7eb8ce7c646p20 -0x1.8dd4fc12ae642p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53fffffffffebp5 0x0.0p0 F +REG esri:32026 2 OK 0x1.6088a398c1cddp21 -0x1.8dd4fc12ae642p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53fffffffffebp5 0x0.0p0 F +REG esri:32026 3 OK 0x1.206912c10d33p20 0x1.3ba962cda776ap20 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:32026 4 OK 0x1.5813769f79668p21 0x1.3ba962cda776ap20 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:32027 0 OK 0x1.e848p20 0x1.9f367a61259a7p18 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa98p5 0x0.0p0 F +REG esri:32027 1 OK 0x1.10150cba3e0acp20 -0x1.8eea4ec3aa20bp18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe6p5 0x0.0p0 F +REG esri:32027 2 OK 0x1.603d79a2e0faap21 -0x1.8eea4ec3aa20bp18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe6p5 0x0.0p0 F +REG esri:32027 3 OK 0x1.1fdb84a1f394p20 0x1.3b49cba08a93cp20 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554ap5 0x0.0p0 F +REG esri:32027 4 OK 0x1.585a3daf0636p21 0x1.3b49cba08a93cp20 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554ap5 0x0.0p0 F +REG esri:32028 0 OK 0x1.e848p20 0x1.3d41fbb4531b6p18 0x0.0p0 -0x1.37p6 0x1.487777777776p5 0x0.0p0 F +REG esri:32028 1 OK 0x1.44ba447fa2037p20 -0x1.3461b51339a02p18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333315p5 0x0.0p0 F +REG esri:32028 2 OK 0x1.45eaddc02efe4p21 -0x1.3461b51339a02p18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333315p5 0x0.0p0 F +REG esri:32028 3 OK 0x1.4d6420eab6418p20 0x1.e02effd268b47p19 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG esri:32028 4 OK 0x1.4195ef8aa4df4p21 0x1.e02effd268b47p19 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG esri:32029 0 OK 0x1.e848p20 0x1.04e0252d4edd3p18 0x0.0p0 -0x1.37p6 0x1.408888888886dp5 0x0.0p0 F +REG esri:32029 1 OK 0x1.6281c1bb4637p20 -0x1.fe35eb9b9f01p17 0x0.0p0 -0x1.3eaa770d743d9p6 0x1.34cccccccccafp5 0x0.0p0 F +REG esri:32029 2 OK 0x1.37071f225ce48p21 -0x1.fe35eb9b9f01p17 0x0.0p0 -0x1.2f5588f28bc27p6 0x1.34cccccccccafp5 0x0.0p0 F +REG esri:32029 3 OK 0x1.6828a0f0c1312p20 0x1.8a227bc7a82p19 0x0.0p0 -0x1.3eaa770d743d9p6 0x1.4c4444444442dp5 0x0.0p0 F +REG esri:32029 4 OK 0x1.3433af879f677p21 0x1.8a227bc7a82p19 0x0.0p0 -0x1.2f5588f28bc27p6 0x1.4c4444444442dp5 0x0.0p0 F +REG esri:32030 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG esri:32030 1 OK -0x1.64d45a8398168p20 -0x1.ac32128feb96p20 0x0.0p0 -0x1.3888a96f00826p6 0x1.20aaaaaa11e74p5 0x0.0p0 F +REG esri:32030 2 OK 0x1.2c7c2d41cc0bcp21 -0x1.ac32128feb95fp20 0x0.0p0 -0x1.03775690ff7dap6 0x1.20aaaaaa11e74p5 0x0.0p0 F +REG esri:32030 3 OK -0x1.20df2ef8a745fp20 0x1.ce214d3973e0ap20 0x0.0p0 -0x1.3888a96e7f594p6 0x1.70aaaaa9ae613p5 0x0.0p0 F +REG esri:32030 4 OK 0x1.0a81977c53a36p21 0x1.ce214d3973e0bp20 0x0.0p0 -0x1.0377569180a6cp6 0x1.70aaaaa9ae613p5 0x0.0p0 F +REG esri:32031 0 OK 0x1.e848p20 0x1.5d73a91231579p18 0x0.0p0 -0x1.44p6 0x1.0fddddddddda8p5 0x0.0p0 F +REG esri:32031 1 OK 0x1.34ac8b4ebf6fap20 -0x1.55249d20c7e83p18 0x0.0p0 -0x1.4d7caf89e58b5p6 0x1.00222222221ep5 0x0.0p0 F +REG esri:32031 2 OK 0x1.4df1ba58a047bp21 -0x1.55249d20c7e83p18 0x0.0p0 -0x1.3a8350761a74cp6 0x1.00222222221ep5 0x0.0p0 F +REG esri:32031 3 OK 0x1.3cd72707590a6p20 0x1.082162126643ep20 0x0.0p0 -0x1.4d7caf89e58b5p6 0x1.1f9999999996dp5 0x0.0p0 F +REG esri:32031 4 OK 0x1.49dc6c7c537a5p21 0x1.082162126643ep20 0x0.0p0 -0x1.3a8350761a74cp6 0x1.1f9999999996dp5 0x0.0p0 F +REG esri:32033 0 OK 0x1.e848p20 0x1.45ade0e067fe5p18 0x0.0p0 -0x1.44p6 0x1.05fffffffffbfp5 0x0.0p0 F +REG esri:32033 1 OK 0x1.414b6b6ed4f66p20 -0x1.3ed0e27e0ce0ap18 0x0.0p0 -0x1.4cb828dd9db44p6 0x1.eeaaaaaaaaa16p4 0x0.0p0 F +REG esri:32033 2 OK 0x1.47a24a4895844p21 -0x1.3ed0e27e0ce0ap18 0x0.0p0 -0x1.3b47d722624bdp6 0x1.eeaaaaaaaaa16p4 0x0.0p0 F +REG esri:32033 3 OK 0x1.480b37d497777p20 0x1.ebeb70cb6934p19 0x0.0p0 -0x1.4cb828dd9db44p6 0x1.14aaaaaaaaa72p5 0x0.0p0 F +REG esri:32033 4 OK 0x1.44426415b443cp21 0x1.ebeb70cb6934p19 0x0.0p0 -0x1.3b47d722624bdp6 0x1.14aaaaaaaaa72p5 0x0.0p0 F +REG esri:32034 0 OK 0x1.e848p20 0x1.4952ad64f219cp18 0x0.0p0 -0x1.9p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:32034 1 OK 0x1.3dc8ba731dcdep20 -0x1.3e67c794e5028p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444435p5 0x0.0p0 F +REG esri:32034 2 OK 0x1.4963a2c671189p21 -0x1.3e67c794e5028p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444435p5 0x0.0p0 F +REG esri:32034 3 OK 0x1.4861e0c6d7d8ep20 0x1.f336ecc04da19p19 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd3p5 0x0.0p0 F +REG esri:32034 4 OK 0x1.44170f9c94132p21 0x1.f336ecc04da19p19 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd3p5 0x0.0p0 F +REG esri:32035 0 OK 0x1.e848p20 0x1.6fc9c2293e014p18 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeeep5 0x0.0p0 F +REG esri:32035 1 OK 0x1.2977a400428ffp20 -0x1.62cdbe64374a8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666654p5 0x0.0p0 F +REG esri:32035 2 OK 0x1.538c2dffdeb8p21 -0x1.62cdbe64374a8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666654p5 0x0.0p0 F +REG esri:32035 3 OK 0x1.360e6b7392933p20 0x1.16f354a14fb9cp20 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776bp5 0x0.0p0 F +REG esri:32035 4 OK 0x1.4d40ca4636b66p21 0x1.16f354a14fb9cp20 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776bp5 0x0.0p0 F +REG esri:32036 0 OK 0x1.86ap16 0x1.37066165757c6p18 0x0.0p0 -0x1.58p6 0x1.1c55555555525p5 0x0.0p0 F +REG esri:32036 1 OK -0x1.0e689fc895ep19 -0x1.300f45983aa89p18 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.0e5555555551bp5 0x0.0p0 F +REG esri:32036 2 OK 0x1.70109fc895e21p19 -0x1.300f45983aa89p18 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.0e5555555551bp5 0x0.0p0 F +REG esri:32036 3 OK -0x1.00bce82b1aa1fp19 0x1.d5f6c6575f288p19 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.2a5555555552dp5 0x0.0p0 F +REG esri:32036 4 OK 0x1.6264e82b1aa3fp19 0x1.d5f6c6575f288p19 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.2a5555555552dp5 0x0.0p0 F +REG esri:32037 0 OK 0x1.e848p20 0x1.840161a27cdd2p18 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8ap5 0x0.0p0 F +REG esri:32037 1 OK 0x1.202f70dcd1031p20 -0x1.795077638b89ap18 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG esri:32037 2 OK 0x1.58304791977dfp21 -0x1.795077638b89ap18 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.0744444444409p5 0x0.0p0 F +REG esri:32037 3 OK 0x1.2aa8966fbf114p20 0x1.259ed12fa03cbp20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ap5 0x0.0p0 F +REG esri:32037 4 OK 0x1.52f3b4c82076ep21 0x1.259ed12fa03cbp20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ap5 0x0.0p0 F +REG esri:32038 0 OK 0x1.e848p20 0x1.989042082793p18 0x0.0p0 -0x1.86p6 0x1.068888888884bp5 0x0.0p0 F +REG esri:32038 1 OK 0x1.15b8783e29114p20 -0x1.8db69c3c0ca4dp18 0x0.0p0 -0x1.90f271ed65e92p6 0x1.e8444444443bp4 0x0.0p0 F +REG esri:32038 2 OK 0x1.5d6bc3e0eb776p21 -0x1.8db69c3c0ca4dp18 0x0.0p0 -0x1.7b0d8e129a16ep6 0x1.e8444444443bp4 0x0.0p0 F +REG esri:32038 3 OK 0x1.205d9776da94ap20 0x1.3519ae4a5ef61p20 0x0.0p0 -0x1.90f271ed65e92p6 0x1.18eeeeeeeeebdp5 0x0.0p0 F +REG esri:32038 4 OK 0x1.5819344492b5bp21 0x1.3519ae4a5ef61p20 0x0.0p0 -0x1.7b0d8e129a16ep6 0x1.18eeeeeeeeebdp5 0x0.0p0 F +REG esri:32039 0 OK 0x1.e848p20 0x1.89a2b883e6679p18 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665cep4 0x0.0p0 F +REG esri:32039 1 OK 0x1.1dedc9595f254p20 -0x1.805b8e5f2ebefp18 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee3bp4 0x0.0p0 F +REG esri:32039 2 OK 0x1.59511b53506dfp21 -0x1.805b8e5f2ebefp18 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee3bp4 0x0.0p0 F +REG esri:32039 3 OK 0x1.270f42da9782ep20 0x1.29888a4c99367p20 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb2p5 0x0.0p0 F +REG esri:32039 4 OK 0x1.54c05e92b43f2p21 0x1.29888a4c99367p20 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb2p5 0x0.0p0 F +REG esri:32040 0 OK 0x1.e848p20 0x1.b2f591a96fa69p18 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4p4 0x0.0p0 F +REG esri:32040 1 OK 0x1.087c3b4e962e6p20 -0x1.a864f986dfbe7p18 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbae9p4 0x0.0p0 F +REG esri:32040 2 OK 0x1.6409e258b4e84p21 -0x1.a864f986dfbe7p18 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbae9p4 0x0.0p0 F +REG esri:32040 3 OK 0x1.12e941cf6a54p20 0x1.48da7a4e9365ap20 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG esri:32040 4 OK 0x1.5ed35f184ad57p21 0x1.48da7a4e9365ap20 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG esri:32041 0 OK 0x1.e848p20 0x1.8088d36e9a7b5p18 0x0.0p0 -0x1.8ap6 0x1.abfffffffff35p4 0x0.0p0 F +REG esri:32041 1 OK 0x1.2349f0764e97bp20 -0x1.7911b19f57649p18 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555471p4 0x0.0p0 F +REG esri:32041 2 OK 0x1.56a307c4d8b4cp21 -0x1.7911b19f57649p18 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555471p4 0x0.0p0 F +REG esri:32041 3 OK 0x1.2aaedcb325477p20 0x1.2247753dae5a5p20 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG esri:32041 4 OK 0x1.52f091a66d5cdp21 0x1.2247753dae5a5p20 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG esri:32042 0 OK 0x1.e848p20 0x1.01f268b083f67p18 0x0.0p0 -0x1.bep6 0x1.4877777777761p5 0x0.0p0 F +REG esri:32042 1 OK 0x1.63f669ce934c8p20 -0x1.f837f2c1822cbp17 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc3p5 0x0.0p0 F +REG esri:32042 2 OK 0x1.364ccb18b659cp21 -0x1.f837f2c1822cbp17 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc3p5 0x0.0p0 F +REG esri:32042 3 OK 0x1.69abc6983c548p20 0x1.85c6ac18d7066p19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.5411111111101p5 0x0.0p0 F +REG esri:32042 4 OK 0x1.33721cb3e1d5cp21 0x1.85c6ac18d7066p19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.5411111111101p5 0x0.0p0 F +REG esri:32043 0 OK 0x1.e848p20 0x1.9c01f97d1a4c5p18 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed2p5 0x0.0p0 F +REG esri:32043 1 OK 0x1.129263cc17a76p20 -0x1.8dcb24ad93ea8p18 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG esri:32043 2 OK 0x1.5efece19f42bdp21 -0x1.8dcb24ad93ea8p18 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG esri:32043 3 OK 0x1.206691986703ep20 0x1.386d9269adeb1p20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777763p5 0x0.0p0 F +REG esri:32043 4 OK 0x1.5814b733cc7dap21 0x1.386d9269adeb1p20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777763p5 0x0.0p0 F +REG esri:32044 0 OK 0x1.e848p20 0x1.2b4673389e3c9p18 0x0.0p0 -0x1.bep6 0x1.2c111111110eap5 0x0.0p0 F +REG esri:32044 1 OK 0x1.4e9e81de76324p20 -0x1.2457ce869af52p18 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996dp5 0x0.0p0 F +REG esri:32044 2 OK 0x1.40f8bf10c4e66p21 -0x1.2457ce869af52p18 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996dp5 0x0.0p0 F +REG esri:32044 3 OK 0x1.55692072984fcp20 0x1.c44fbc738cfddp19 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886dp5 0x0.0p0 F +REG esri:32044 4 OK 0x1.3d936fc6b3d7ap21 0x1.c44fbc738cfddp19 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886dp5 0x0.0p0 F +REG esri:32045 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG esri:32045 1 OK -0x1.668bfea874b11p20 -0x1.ab4cdc8a80e51p20 0x0.0p0 -0x1.3d20783312acap6 0x1.2bffffff40e62p5 0x0.0p0 F +REG esri:32045 2 OK 0x1.2d57ff543a59p21 -0x1.ab4cdc8a80e5p20 0x0.0p0 -0x1.06df87cced536p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG esri:32045 3 OK -0x1.1f1cff928a806p20 0x1.cef2e97176eb7p20 0x0.0p0 -0x1.3d20783271b03p6 0x1.7bfffffed62fep5 0x0.0p0 F +REG esri:32045 4 OK 0x1.09a07fc94540ap21 0x1.cef2e97176eb7p20 0x0.0p0 -0x1.06df87cd8e4fdp6 0x1.7bfffffed62fdp5 0x0.0p0 F +REG esri:32046 0 OK 0x1.e848p20 0x1.10a4ecd25a05p18 0x0.0p0 -0x1.3ap6 0x1.3377777777755p5 0x0.0p0 F +REG esri:32046 1 OK 0x1.5c7da25e5268bp20 -0x1.0ab4e588a1831p18 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333307p5 0x0.0p0 F +REG esri:32046 2 OK 0x1.3a092ed0d6cbap21 -0x1.0ab4e588a1831p18 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333307p5 0x0.0p0 F +REG esri:32046 3 OK 0x1.624df469bca12p20 0x1.9be26d361e4d8p19 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba1p5 0x0.0p0 F +REG esri:32046 4 OK 0x1.372105cb21af7p21 0x1.9be26d361e4d8p19 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba1p5 0x0.0p0 F +REG esri:32047 0 OK 0x1.e848p20 0x1.225cdc64eb6fdp18 0x0.0p0 -0x1.3ap6 0x1.293333333330cp5 0x0.0p0 F +REG esri:32047 1 OK 0x1.53547f0e4223ep20 -0x1.1bedf86df136ep18 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:32047 2 OK 0x1.3e9dc078deee1p21 -0x1.1bedf86df136ep18 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:32047 3 OK 0x1.59a22350b1456p20 0x1.b6b52ff53514ep19 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444426p5 0x0.0p0 F +REG esri:32047 4 OK 0x1.3b76ee57a75d5p21 0x1.b6b52ff53514ep19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444426p5 0x0.0p0 F +REG esri:32048 0 OK 0x1.e848p20 0x1.34b90230d6a28p18 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee59ep5 0x0.0p0 F +REG esri:32048 1 OK 0x1.484aed7f6257ap20 -0x1.2a05624f4bd42p18 0x0.0p0 -0x1.edab194698fc4p6 0x1.711111111110ap5 0x0.0p0 F +REG esri:32048 2 OK 0x1.442289404ed51p21 -0x1.2a05624f4bd42p18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:32048 3 OK 0x1.52a85065c0dap20 0x1.d42f141208b5bp19 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG esri:32048 4 OK 0x1.3ef3d7cd1f93dp21 0x1.d42f141208b5bp19 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc5c5p5 0x0.0p0 F +REG esri:32049 0 OK 0x1.e848p20 0x1.641d1f836751cp18 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:32049 1 OK 0x1.2f25de9d87dbp20 -0x1.5695d085c1af3p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaa9cp5 0x0.0p0 F +REG esri:32049 2 OK 0x1.50b510b13c128p21 -0x1.5695d085c1af3p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaa9cp5 0x0.0p0 F +REG esri:32049 3 OK 0x1.3c39ac38cf712p20 0x1.0e4c9b39fa015p20 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa204p5 0x0.0p0 F +REG esri:32049 4 OK 0x1.4a2b29e398477p21 0x1.0e4c9b39fa015p20 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa204p5 0x0.0p0 F +REG esri:32050 0 OK 0x1.e848p20 0x1.37392b2c37c7p18 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe2p5 0x0.0p0 F +REG esri:32050 1 OK 0x1.48216a51a5d96p20 -0x1.2f324a6f01eb7p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdbp5 0x0.0p0 F +REG esri:32050 2 OK 0x1.44374ad72d135p21 -0x1.2f324a6f01eb7p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdbp5 0x0.0p0 F +REG esri:32050 3 OK 0x1.4ff9442fdbc76p20 0x1.d6bffc056774ap19 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe8p5 0x0.0p0 F +REG esri:32050 4 OK 0x1.404b5de8121c5p21 0x1.d6bffc056774ap19 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe8p5 0x0.0p0 F +REG esri:32051 0 OK 0x1.e848p20 0x1.4ed917413d69cp18 0x0.0p0 -0x1.44p6 0x1.2f88888888864p5 0x0.0p0 F +REG esri:32051 1 OK 0x1.3bda256241216p20 -0x1.46052eb0aaf5ap18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774bp5 0x0.0p0 F +REG esri:32051 2 OK 0x1.4a5aed4edf6f5p21 -0x1.46052eb0aaf5ap18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774bp5 0x0.0p0 F +REG esri:32051 3 OK 0x1.447b05e1733bp20 0x1.fa95c6e62b5b8p19 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997ep5 0x0.0p0 F +REG esri:32051 4 OK 0x1.460a7d0f46628p21 0x1.fa95c6e62b5b8p19 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997ep5 0x0.0p0 F +REG esri:32052 0 OK 0x1.e848p20 0x1.1ce050c60d57ap18 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG esri:32052 1 OK 0x1.5543adbca3ebcp20 -0x1.1461d2e8d6f5p18 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeedep5 0x0.0p0 F +REG esri:32052 2 OK 0x1.3da62921ae0a2p21 -0x1.1461d2e8d6f5p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeedep5 0x0.0p0 F +REG esri:32052 3 OK 0x1.5d8544f5ef838p20 0x1.af67680cef8ccp19 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887ec8p5 0x0.0p0 F +REG esri:32052 4 OK 0x1.39855d85083e4p21 0x1.af67680cef8ccp19 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887ec8p5 0x0.0p0 F +REG esri:32053 0 OK 0x1.e848p20 0x1.28ad4456c5bbdp18 0x0.0p0 -0x1.68p6 0x1.6555555555548p5 0x0.0p0 F +REG esri:32053 1 OK 0x1.4f2b787b6497cp20 -0x1.1fdf67a78d251p18 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:32053 2 OK 0x1.40b243c24db42p21 -0x1.1fdf67a78d251p18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:32053 3 OK 0x1.57bb47f6f3762p20 0x1.c142cb3a57208p19 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaap5 0x0.0p0 F +REG esri:32053 4 OK 0x1.3c6a5c048644fp21 0x1.c142cb3a57208p19 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaap5 0x0.0p0 F +REG esri:32054 0 OK 0x1.e848p20 0x1.6fc956dadbd06p18 0x0.0p0 -0x1.68p6 0x1.5844444444432p5 0x0.0p0 F +REG esri:32054 1 OK 0x1.2985ceb0b865p20 -0x1.62f125bb7b613p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba2p5 0x0.0p0 F +REG esri:32054 2 OK 0x1.538518a7a3cdp21 -0x1.62f125bb7b613p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba2p5 0x0.0p0 F +REG esri:32054 3 OK 0x1.35fe31de8c065p20 0x1.16e95aec36ad1p20 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc3p5 0x0.0p0 F +REG esri:32054 4 OK 0x1.4d48e710b9fc6p21 0x1.16e95aec36ad1p20 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc3p5 0x0.0p0 F +REG esri:32055 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.4555555555554p5 0x0.0p0 F +REG esri:32055 1 OK -0x1.644ef1ef0d9f5p20 -0x1.ac6c5d881aedep20 0x0.0p0 -0x1.bf08b5e8fc3e2p6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32055 2 OK 0x1.2c3978f786cf2p21 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.8a4c9f6c59178p6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32055 3 OK -0x1.21593f9b60178p20 0x1.cddd8b993a4d3p20 0x0.0p0 -0x1.bf08b5e8836e5p6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32055 4 OK 0x1.0abe9fcdb00b5p21 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.8a4c9f6cd1e76p6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32056 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ad55555555553p6 0x1.4555555555554p5 0x0.0p0 F +REG esri:32056 1 OK -0x1.644ef1ef0d9e5p20 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.c7b36093a6e88p6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32056 2 OK 0x1.2c3978f786cf2p21 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.92f74a1703c1fp6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32056 3 OK -0x1.21593f9b6016ap20 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.c7b360932e18ap6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32056 4 OK 0x1.0abe9fcdb00b5p21 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.92f74a177c91cp6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32057 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.4555555555554p5 0x0.0p0 F +REG esri:32057 1 OK -0x1.644ef1ef0d9e5p20 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.cd5e0b3e51935p6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32057 2 OK 0x1.2c3978f786cf2p21 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.98a1f4c1ae6ccp6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32057 3 OK -0x1.21593f9b6016ap20 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.cd5e0b3dd8c37p6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32057 4 OK 0x1.0abe9fcdb00b5p21 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.98a1f4c2273c9p6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32058 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.b855555555553p6 0x1.4555555555554p5 0x0.0p0 F +REG esri:32058 1 OK -0x1.644ef1ef0d9e5p20 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.d2b36093a6e87p6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32058 2 OK 0x1.2c3978f786cf2p21 -0x1.ac6c5d881aedfp20 0x0.0p0 -0x1.9df74a1703c1ep6 0x1.1d555554c6521p5 0x0.0p0 F +REG esri:32058 3 OK -0x1.21593f9b6016ap20 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.d2b360932e18ap6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32058 4 OK 0x1.0abe9fcdb00b5p21 0x1.cddd8b993a4d1p20 0x0.0p0 -0x1.9df74a177c91cp6 0x1.6d55555465318p5 0x0.0p0 F +REG esri:32059 0 OK 0x1.e848p18 0x1.a983adb0c675bp16 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222210dp4 0x0.0p0 F +REG esri:32059 1 OK 0x1.02ee548ba0042p17 -0x1.ee62d5986f4c8p17 0x0.0p0 -0x1.0df13f90a9095p6 0x1.12222222220ffp4 0x0.0p0 F +REG esri:32059 2 OK 0x1.a78c6add17ffp19 -0x1.ee62d5986f4c8p17 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.12222222220ffp4 0x0.0p0 F +REG esri:32059 3 OK 0x1.0b14f5f81937cp17 0x1.ce06e29ce3875p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:32059 4 OK 0x1.a582c281f9b21p19 0x1.ce06e29ce3875p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:32060 0 OK 0x1.e848p18 0x1.9811d6d8633afp17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222210dp4 0x0.0p0 F +REG esri:32060 1 OK 0x1.02ee548ba0042p17 -0x1.2b12d5986f4c6p17 0x0.0p0 -0x1.0df13f90a9095p6 0x1.12222222220ffp4 0x0.0p0 F +REG esri:32060 2 OK 0x1.a78c6add17ffp19 -0x1.2b12d5986f4c6p17 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.12222222220ffp4 0x0.0p0 F +REG esri:32060 3 OK 0x1.0b14f5f81937cp17 0x1.17d7714e71c3bp19 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:32060 4 OK 0x1.a582c281f9b21p19 0x1.17d7714e71c3bp19 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:32061 0 OK 0x1.e848p18 0x1.1d5c650e56042p18 0x0.0p0 -0x1.6955555555555p6 0x1.0d11111110ffbp4 0x0.0p0 F +REG esri:32061 1 OK -0x1.165b184a7d518p16 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.7a2222222202cp3 0x0.0p0 F +REG esri:32061 2 OK 0x1.0589b184a7d52p20 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.547098bde0a83p6 0x1.7a2222222202cp3 0x0.0p0 F +REG esri:32061 3 OK -0x1.4870ab69dd0fp15 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.5d1111111100cp4 0x0.0p0 F +REG esri:32061 4 OK 0x1.fccf0ab69dd0fp19 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.547098bde0a83p6 0x1.5d1111111100cp4 0x0.0p0 F +REG esri:32062 0 OK 0x1.e848p18 0x1.3e5a2b9581062p18 0x0.0p0 -0x1.6955555555555p6 0x1.dcccccccccaa6p3 0x0.0p0 F +REG esri:32062 1 OK -0x1.0f6665440c788p16 -0x1.afe63c9762358p17 0x0.0p0 -0x1.7e077a4bda7ebp6 0x1.3cccccccccb07p3 0x0.0p0 F +REG esri:32062 2 OK 0x1.051a665440c72p20 -0x1.afe63c9762358p17 0x0.0p0 -0x1.54a3305ed02cp6 0x1.3cccccccccb07p3 0x0.0p0 F +REG esri:32062 3 OK -0x1.55df0a3a2db3p15 0x1.b0c2dc55d354dp19 0x0.0p0 -0x1.7e077a4bda7ebp6 0x1.3e66666666552p4 0x0.0p0 F +REG esri:32062 4 OK 0x1.fda5f0a3a2da7p19 0x1.b0c2dc55d354dp19 0x0.0p0 -0x1.54a3305ed02cp6 0x1.3e66666666552p4 0x0.0p0 F +REG esri:32064 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:32064 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.9fffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32064 2 OK 0x1.a68297ce01593p21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.780000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32064 3 OK -0x1.6048d15af6e5p17 0x1.bc575b3915659p20 0x0.0p0 -0x1.9fffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32064 4 OK 0x1.a68297ce01593p21 0x1.bc575b3915659p20 0x0.0p0 -0x1.780000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32065 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32065 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.87ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32065 2 OK 0x1.a68297ce0159dp21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.600000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32065 3 OK -0x1.6048d15af6dbp17 0x1.bc575b3915659p20 0x0.0p0 -0x1.87ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32065 4 OK 0x1.a68297ce0159dp21 0x1.bc575b3915659p20 0x0.0p0 -0x1.600000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32066 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32066 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.6fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32066 2 OK 0x1.a68297ce01593p21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.480000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32066 3 OK -0x1.6048d15af6e5p17 0x1.bc575b3915659p20 0x0.0p0 -0x1.6fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32066 4 OK 0x1.a68297ce01593p21 0x1.bc575b3915659p20 0x0.0p0 -0x1.480000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32067 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32067 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.57ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32067 2 OK 0x1.a68297ce01593p21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.300000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32067 3 OK -0x1.6048d15af6e5p17 0x1.bc575b3915659p20 0x0.0p0 -0x1.57ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32067 4 OK 0x1.a68297ce01593p21 0x1.bc575b3915659p20 0x0.0p0 -0x1.300000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32074 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:32074 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.9fffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32074 2 OK 0x1.a68297ce01593p21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.780000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32074 3 OK -0x1.6048d15af6e5p17 0x1.bc575b3915659p20 0x0.0p0 -0x1.9fffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32074 4 OK 0x1.a68297ce01593p21 0x1.bc575b3915659p20 0x0.0p0 -0x1.780000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32075 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32075 1 OK -0x1.6048d15af6dbp17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.87ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32075 2 OK 0x1.a68297ce0159dp21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.600000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32075 3 OK -0x1.6048d15af6dbp17 0x1.bc575b3915659p20 0x0.0p0 -0x1.87ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32075 4 OK 0x1.a68297ce0159dp21 0x1.bc575b3915659p20 0x0.0p0 -0x1.600000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32076 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32076 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.6fffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32076 2 OK 0x1.a68297ce01593p21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.480000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32076 3 OK -0x1.6048d15af6e5p17 0x1.bc575b3915659p20 0x0.0p0 -0x1.6fffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32076 4 OK 0x1.a68297ce01593p21 0x1.bc575b3915659p20 0x0.0p0 -0x1.480000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32077 0 OK 0x1.907e0ab851eb8p20 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32077 1 OK -0x1.6048d15af6e5p17 -0x1.bc575b3915659p20 0x0.0p0 -0x1.57ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32077 2 OK 0x1.a68297ce01593p21 -0x1.bc575b3915659p20 0x0.0p0 -0x1.300000001dd07p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32077 3 OK -0x1.6048d15af6e5p17 0x1.bc575b3915659p20 0x0.0p0 -0x1.57ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32077 4 OK 0x1.a68297ce01593p21 0x1.bc575b3915659p20 0x0.0p0 -0x1.300000001dd07p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32081 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.a8p5 0x0.0p0 0x0.0p0 T +REG esri:32081 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cfffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32081 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.800000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32081 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.cfffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32081 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.800000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32082 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.cp5 0x0.0p0 0x0.0p0 T +REG esri:32082 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e7ffffffc45f2p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32082 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.980000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32082 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.e7ffffffc45f2p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32082 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.980000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32083 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG esri:32083 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32083 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32083 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.fbffffffc45f3p5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32083 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.ac0000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32084 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG esri:32084 1 OK -0x1.e8f3aaf36b498p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32084 2 OK 0x1.a3e4eabcdad2cp19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32084 3 OK -0x1.e8f3aaf36b498p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.09ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32084 4 OK 0x1.a3e4eabcdad2cp19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.c40000003ba0dp5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32085 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG esri:32085 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32085 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32085 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.15ffffffe22f9p6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32085 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.dc0000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32086 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG esri:32086 1 OK -0x1.e8f3aaf36b4c8p17 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32086 2 OK 0x1.a3e4eabcdad26p19 -0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 -0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32086 3 OK -0x1.e8f3aaf36b4c8p17 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.21ffffffe22fap6 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32086 4 OK 0x1.a3e4eabcdad26p19 0x1.0ef3c6d76fb35p19 0x0.0p0 -0x1.f40000003ba0ep5 0x1.3fffffffea7bap2 0x0.0p0 F +REG esri:32098 0 OK 0x0.0p0 0x1.b11f4b13029bdp19 0x0.0p0 -0x1.12p6 0x1.9fffffffffb6bp5 0x0.0p0 F +REG esri:32098 1 OK -0x1.0b3ba5eb1ae96p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.27fffffffffd6p5 0x0.0p0 F +REG esri:32098 2 OK 0x1.0b3ba5eb1ae97p21 -0x1.9394fcf002938p18 0x0.0p0 -0x1.611672e32a5cdp5 0x1.27fffffffffd6p5 0x0.0p0 F +REG esri:32098 3 OK -0x1.053679725c65fp20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff5p6 0x0.0p0 F +REG esri:32098 4 OK 0x1.053679725c66p20 0x1.4f36aff31453ap21 0x0.0p0 -0x1.611672e32a5cdp5 0x1.0bffffffffff5p6 0x0.0p0 F +REG esri:32100 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG esri:32100 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:32100 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG esri:32100 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:32100 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG esri:32104 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG esri:32104 1 OK 0x1.fc0e2fc8e76d4p16 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.a0e40642823c4p6 0x1.31fffffffffe3p5 0x0.0p0 F +REG esri:32104 2 OK 0x1.a8c63a06e3126p19 -0x1.45deb1b86685bp17 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.31fffffffffe3p5 0x0.0p0 F +REG esri:32104 3 OK 0x1.411c2fa692ca2p17 0x1.05a24be6955cap19 0x0.0p0 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG esri:32104 4 OK 0x1.9800f4165b4d8p19 0x1.05a24be6955cap19 0x0.0p0 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaa9ep5 0x0.0p0 F +REG esri:32107 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555554p6 0x1.16p5 0x0.0p0 F +REG esri:32107 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:32107 2 OK 0x1.81508ff5f9e2p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:32107 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:32107 4 OK 0x1.60608392f775bp19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:32108 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 0x0.0p0 F +REG esri:32108 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d4p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:32108 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1185p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:32108 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d9p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:32108 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617fp6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:32109 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555553p6 0x1.16p5 0x0.0p0 F +REG esri:32109 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:32109 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2bp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG esri:32109 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e8p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:32109 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c26p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG esri:32110 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG esri:32110 1 OK -0x1.24fcf60120a32p18 -0x1.047d14be2735ep19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:32110 2 OK 0x1.b7767b009050fp19 -0x1.047d14be2735ep19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:32110 3 OK -0x1.9bca25cf6767ep17 0x1.1a37851a0519dp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:32110 4 OK 0x1.8bea8973d9d98p19 0x1.1a37851a0519cp19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:32111 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:32111 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:32111 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:32111 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:32111 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:32112 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555553p6 0x1.fp4 0x0.0p0 F +REG esri:32112 1 OK -0x1.99bdfd44b9be8p18 -0x1.082ad67698d12p19 0x0.0p0 -0x1.b8aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:32112 2 OK 0x1.6e00fea25cdf4p19 -0x1.082ad67698d12p19 0x0.0p0 -0x1.8a002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:32112 3 OK -0x1.60b59e1259a96p18 0x1.1676a2d6e2f6p19 0x0.0p0 -0x1.b8aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:32112 4 OK 0x1.517ccf092cd4bp19 0x1.1676a2d6e2f6p19 0x0.0p0 -0x1.8a002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:32113 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG esri:32113 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:32113 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:32113 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:32113 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:32114 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555553p6 0x1.fp4 0x0.0p0 F +REG esri:32114 1 OK 0x1.df55aecd85d18p17 -0x1.082b60f9c3635p19 0x0.0p0 -0x1.c6aa7f0f67927p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:32114 2 OK 0x1.595b4a264f45dp20 -0x1.082b60f9c3635p19 0x0.0p0 -0x1.98002b9b4317fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG esri:32114 3 OK 0x1.28b35480a212ep18 0x1.167734d9040ep19 0x0.0p0 -0x1.c6aa7f0f60d1dp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:32114 4 OK 0x1.4b192adfd77b4p20 0x1.167734d9040ep19 0x0.0p0 -0x1.98002b9b49d89p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG esri:32115 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG esri:32115 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:32115 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcfp5 0x0.0p0 F +REG esri:32115 3 OK -0x1.65aacac7e3d1cp18 0x1.18ea99af207c4p19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:32115 4 OK 0x1.45516563f1e8ep19 0x1.18ea99af207c4p19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2edp5 0x0.0p0 F +REG esri:32116 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG esri:32116 1 OK -0x1.5221e2bc96ac2p18 -0x1.0569844cc1183p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:32116 2 OK 0x1.9d34f15e4b561p19 -0x1.0569844cc1183p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:32116 3 OK -0x1.0266fbc8fcfd3p18 0x1.19530c7dbe957p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:32116 4 OK 0x1.75577de47e7eap19 0x1.19530c7dbe957p19 0x0.0p0 -0x1.1839a5e4684a9p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:32117 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG esri:32117 1 OK -0x1.e0f3c5792d584p17 -0x1.0569844cc1183p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:32117 2 OK 0x1.ce08f15e4b561p19 -0x1.0569844cc1183p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG esri:32117 3 OK -0x1.417df791f9fa6p17 0x1.19530c7dbe957p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:32117 4 OK 0x1.a62b7de47e7eap19 0x1.19530c7dbe957p19 0x0.0p0 -0x1.2039a5e4684a9p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG esri:32118 0 OK 0x1.24f8p18 0x1.77ef514292013p15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb5p5 0x0.0p0 F +REG esri:32118 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:32118 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccafp5 0x0.0p0 F +REG esri:32118 3 OK 0x1.7379e78330bbep17 0x1.388171947289dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:32118 4 OK 0x1.90330c3e67a21p18 0x1.388171947289dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG esri:32119 0 OK 0x1.29a8270a3d70ap19 0x1.05cc553074f97p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG esri:32119 1 OK 0x1.449988c24f902p18 -0x1.fbb202943916cp16 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.0455555555519p5 0x0.0p0 F +REG esri:32119 2 OK 0x1.b10389b353188p19 -0x1.fbb202943916cp16 0x0.0p0 -0x1.303486cc0b757p6 0x1.0455555555519p5 0x0.0p0 F +REG esri:32119 3 OK 0x1.54278a411c66cp18 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.47cb7933f48a9p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG esri:32119 4 OK 0x1.a93c88f3ecad4p19 0x1.8c9503f2aeff6p18 0x0.0p0 -0x1.303486cc0b757p6 0x1.2afffffffffdbp5 0x0.0p0 F +REG esri:32120 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:32120 1 OK 0x1.86e3d47c2716ep18 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:32120 2 OK 0x1.867e15c1ec751p19 -0x1.6b59668d8b47cp16 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.7111111111109p5 0x0.0p0 F +REG esri:32120 3 OK 0x1.938524ed11a99p18 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.9c55c3f143a7p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:32120 4 OK 0x1.802d6d89772bcp19 0x1.1d672ca9e2fd7p18 0x0.0p0 -0x1.87aa3c0ebc59p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:32121 0 OK 0x1.24f8p19 0x1.8a66ee530ab8dp16 0x0.0p0 -0x1.9200000000001p6 0x1.749999999999p5 0x0.0p0 F +REG esri:32121 1 OK 0x1.7d82f315976d8p18 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111104p5 0x0.0p0 F +REG esri:32121 2 OK 0x1.8b2e86753449dp19 -0x1.7cb5565dd873ap16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111104p5 0x0.0p0 F +REG esri:32121 3 OK 0x1.8ac7b84e85b82p18 0x1.2b117f1405589p18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:32121 4 OK 0x1.848c23d8bd247p19 0x1.2b117f1405589p18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a04p5 0x0.0p0 F +REG esri:32122 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG esri:32122 1 OK 0x1.65d7a1966c1d2p18 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.54b9b443558bbp6 0x1.3533333333313p5 0x0.0p0 F +REG esri:32122 2 OK 0x1.97042f34c9f0dp19 -0x1.ab1680cb2807ap16 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.3533333333313p5 0x0.0p0 F +REG esri:32122 3 OK 0x1.7366a7cc5f285p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG esri:32122 4 OK 0x1.903cac19d06b4p19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG esri:32123 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG esri:32123 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:32123 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb8p5 0x0.0p0 F +REG esri:32123 3 OK 0x1.7307792426a48p18 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.4866666666651p5 0x0.0p0 F +REG esri:32123 4 OK 0x1.906c436decad2p19 0x1.4dd31bf5554b3p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.4866666666651p5 0x0.0p0 F +REG esri:32124 0 OK 0x1.24f8p19 0x1.7ed816e9b443ap16 0x0.0p0 -0x1.88p6 0x1.1f111111110e8p5 0x0.0p0 F +REG esri:32124 1 OK 0x1.8562e4192a9e6p18 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:32124 2 OK 0x1.873e8df36ab0dp19 -0x1.7613f4e1377f9p16 0x0.0p0 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeebdp5 0x0.0p0 F +REG esri:32124 3 OK 0x1.8dfc39a7988f6p18 0x1.2149859be5de8p18 0x0.0p0 -0x1.90b8d4acb5309p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:32124 4 OK 0x1.82f1e32c33b85p19 0x1.2149859be5de8p18 0x0.0p0 -0x1.7f472b534acf7p6 0x1.2d33333333313p5 0x0.0p0 F +REG esri:32125 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.1244444444412p5 0x0.0p0 F +REG esri:32125 1 OK 0x1.7681ef7e3252dp18 -0x1.92145fac5d818p16 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:32125 2 OK 0x1.8eaf0840e6d6ap19 -0x1.92145fac5d818p16 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.03111111110d2p5 0x0.0p0 F +REG esri:32125 3 OK 0x1.7fe2b5991fc8cp18 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.9132b355fc5d1p6 0x1.217777777774cp5 0x0.0p0 F +REG esri:32125 4 OK 0x1.89fea533701bap19 0x1.3712b28c4a09fp18 0x0.0p0 -0x1.7ecd4caa03a2fp6 0x1.217777777774cp5 0x0.0p0 F +REG esri:32126 0 OK 0x1.312dp21 0x1.fa69b2b13798dp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG esri:32126 1 OK 0x1.10236ef458cd2p21 -0x1.e50b558775108p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:32126 2 OK 0x1.5236910ba732ep21 -0x1.e50b558775108p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53ffffffffffp5 0x0.0p0 F +REG esri:32126 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78571p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:32126 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78571p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554fp5 0x0.0p0 F +REG esri:32127 0 OK 0x1.6e36p20 0x1.fa3c387dc6a45p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG esri:32127 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:32127 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe8p5 0x0.0p0 F +REG esri:32127 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554cp5 0x0.0p0 F +REG esri:32127 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f69a0ep18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554cp5 0x0.0p0 F +REG esri:32128 0 OK 0x1.24f8p19 0x1.82cecd83b5059p16 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG esri:32128 1 OK 0x1.8289a2cb236a6p18 -0x1.77fcaead221dp16 0x0.0p0 -0x1.4075cb858aac9p6 0x1.3a33333333317p5 0x0.0p0 F +REG esri:32128 2 OK 0x1.88ab2e9a6e4adp19 -0x1.77fcaead221dp16 0x0.0p0 -0x1.2d8a347a75537p6 0x1.3a33333333317p5 0x0.0p0 F +REG esri:32128 3 OK 0x1.8d19b32c1129cp18 0x1.24b9880b7720fp18 0x0.0p0 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG esri:32128 4 OK 0x1.83632669f76b2p19 0x1.24b9880b7720fp18 0x0.0p0 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG esri:32129 0 OK 0x1.24f8p19 0x1.623635ef1cb8ap16 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG esri:32129 1 OK 0x1.93ddc76008933p18 -0x1.59729314e624fp16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG esri:32129 2 OK 0x1.80011c4ffbb66p19 -0x1.59729314e624fp16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG esri:32129 3 OK 0x1.9c6fffae6b3c8p18 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG esri:32129 4 OK 0x1.7bb80028ca61cp19 0x1.0bcb3dcd4a2bbp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG esri:32130 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG esri:32130 1 OK -0x1.e634a50072a6ep18 -0x1.0508ca3eafec3p19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:32130 2 OK 0x1.54c2528039541p19 -0x1.0508ca3eafec2p19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG esri:32130 3 OK -0x1.9359a8941557cp18 0x1.19b7b8fc808b3p19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:32130 4 OK 0x1.2b54d44a0aac6p19 0x1.19b7b8fc808b4p19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1418p5 0x0.0p0 F +REG esri:32133 0 OK 0x1.29a8p19 0x1.44e4cd737cdd2p17 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa72p5 0x0.0p0 F +REG esri:32133 1 OK 0x1.01b075d8c695p18 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.e5555555554c3p4 0x0.0p0 F +REG esri:32133 2 OK 0x1.d277c5139cb58p19 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.e5555555554c3p4 0x0.0p0 F +REG esri:32133 3 OK 0x1.184511ebb6ddcp18 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG esri:32133 4 OK 0x1.c72d770a24912p19 0x1.ecf86f2a1e6c3p18 0x0.0p0 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaa83p5 0x0.0p0 F +REG esri:32134 0 OK 0x1.24f8p19 0x1.9183defeabc76p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG esri:32134 1 OK 0x1.7a12a2f6fa88cp18 -0x1.84349bda99882p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444436p5 0x0.0p0 F +REG esri:32134 2 OK 0x1.8ce6ae8482bb1p19 -0x1.84349bda99882p16 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.5744444444436p5 0x0.0p0 F +REG esri:32134 3 OK 0x1.86fe8b1a87fc6p18 0x1.3052f091f3e36p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:32134 4 OK 0x1.8670ba72bc014p19 0x1.3052f091f3e36p18 0x0.0p0 -0x1.8594248c0bd8bp6 0x1.74dddddddddd6p5 0x0.0p0 F +REG esri:32135 0 OK 0x1.24f8p19 0x1.c069e4aef592fp16 0x0.0p0 -0x1.9155555555553p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG esri:32135 1 OK 0x1.614d92de92fd1p18 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.9cb46504892e3p6 0x1.4a66666666655p5 0x0.0p0 F +REG esri:32135 2 OK 0x1.99493690b6818p19 -0x1.b0959713a6f57p16 0x0.0p0 -0x1.85f645a6217c3p6 0x1.4a66666666655p5 0x0.0p0 F +REG esri:32135 3 OK 0x1.70a6d67cda4b6p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:32135 4 OK 0x1.919c94c192da5p19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c3p6 0x1.6b7777777776cp5 0x0.0p0 F +REG esri:32136 0 OK 0x1.24f8p19 0x1.c374b0c96a7e1p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd4p5 0x0.0p0 F +REG esri:32136 1 OK 0x1.6156ff6ed09bdp18 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.62385d901218cp6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:32136 2 OK 0x1.9944804897b2cp19 -0x1.b771fc9c07c25p16 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.0a5555555552p5 0x0.0p0 F +REG esri:32136 3 OK 0x1.6d2075658a95ap18 0x1.55857df9dce04p18 0x0.0p0 -0x1.62385d901218cp6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:32136 4 OK 0x1.935fc54d3ab5cp19 0x1.55857df9dce04p18 0x0.0p0 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaa86p5 0x0.0p0 F +REG esri:32137 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG esri:32137 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG esri:32137 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG esri:32137 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:32137 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG esri:32138 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG esri:32138 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:32138 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG esri:32138 3 OK 0x1.56349b0477ab8p18 0x1.233fbea601239p21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:32138 4 OK 0x1.9ed5b27dc42a4p19 0x1.233fbea601239p21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG esri:32139 0 OK 0x1.55ccp19 0x1.7d35824812e38p21 0x0.0p0 -0x1.9155555555553p6 0x1.ec666666665d5p4 0x0.0p0 F +REG esri:32139 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:32139 2 OK 0x1.d12614f49afe2p19 0x1.5f90f9daa8a8p21 0x0.0p0 -0x1.870371c56fe09p6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG esri:32139 3 OK 0x1.c005ca30a44fp18 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:32139 4 OK 0x1.cb951ae7add92p19 0x1.9b8e7ec62b6acp21 0x0.0p0 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG esri:32140 0 OK 0x1.24f8p19 0x1.f8da973ad2645p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4bp4 0x0.0p0 F +REG esri:32140 1 OK 0x1.39170370f731bp18 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:32140 2 OK 0x1.ad647e4784668p19 0x1.d81c71ab6b3afp21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbafbp4 0x0.0p0 F +REG esri:32140 3 OK 0x1.45cd37c6ce462p18 0x1.0d334102db22ep22 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG esri:32140 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db22ep22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG esri:32141 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG esri:32141 1 OK 0x1.a664dec720c6p15 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:32141 2 OK 0x1.0a91b2138df45p19 0x1.29fe05d7e9968p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.8955555555486p4 0x0.0p0 F +REG esri:32141 3 OK 0x1.ee847b1cd767p15 0x1.474bc56e75c41p22 0x0.0p0 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:32141 4 OK 0x1.060fb84e328a4p19 0x1.474bc56e75c41p22 0x0.0p0 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG esri:32142 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG esri:32142 1 OK 0x1.46f65077d028ep18 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:32142 2 OK 0x1.44ccd7c417eb9p19 0x1.c1dbe7354b54bp19 0x0.0p0 -0x1.b64ee0804778ap6 0x1.3cdddddddddc4p5 0x0.0p0 F +REG esri:32142 3 OK 0x1.4dec09f87a234p18 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.c5b11f7fb8876p6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:32142 4 OK 0x1.4151fb03c2ee6p19 0x1.2f8b22069ec44p20 0x0.0p0 -0x1.b64ee0804778ap6 0x1.54111111110ffp5 0x0.0p0 F +REG esri:32143 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed4p5 0x0.0p0 F +REG esri:32143 1 OK 0x1.c777142a437a2p17 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.2966666666643p5 0x0.0p0 F +REG esri:32143 2 OK 0x1.766a3af56f20ep19 0x1.c9f7f661d8bffp20 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.2966666666643p5 0x0.0p0 F +REG esri:32143 3 OK 0x1.e92fa135fb9ffp17 0x1.23c16caecd927p21 0x0.0p0 -0x1.ca0202c3d20c6p6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:32143 4 OK 0x1.6dfc17b281177p19 0x1.23c16caecd927p21 0x0.0p0 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777764p5 0x0.0p0 F +REG esri:32144 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG esri:32144 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc794p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:32144 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc794p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996fp5 0x0.0p0 F +REG esri:32144 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG esri:32144 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG esri:32145 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG esri:32145 1 OK -0x1.86b20b2fea528p16 -0x1.047ce186e66bfp19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:32145 2 OK 0x1.0c8f20b2fea58p20 -0x1.047ce186e66bep19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG esri:32145 3 OK -0x1.52961a47ed8ap13 0x1.1a374d9d1c5b1p19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG esri:32145 4 OK 0x1.ed9258691fb6bp19 0x1.1a374d9d1c5b2p19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9963p5 0x0.0p0 F +REG esri:32146 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.3377777777759p5 0x0.0p0 F +REG esri:32146 1 OK 0x1.95f147861eaa6p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:32146 2 OK 0x1.c08cb879e155ap21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c357p6 0x1.2733333333309p5 0x0.0p0 F +REG esri:32146 3 OK 0x1.96d41ac64eeb7p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:32146 4 OK 0x1.bfa9e539b1149p21 0x1.1386e31afbab2p21 0x0.0p0 -0x1.322b92294c357p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG esri:32147 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG esri:32147 1 OK 0x1.948be2212e3c2p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988dfp6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:32147 2 OK 0x1.c1f21dded1c3ep21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.1c222222221f6p5 0x0.0p0 F +REG esri:32147 3 OK 0x1.9581cef94f686p21 0x1.370054f6b6491p20 0x0.0p0 -0x1.423262b0988dfp6 0x1.3644444444425p5 0x0.0p0 F +REG esri:32147 4 OK 0x1.c0fc3106b097ap21 0x1.370054f6b6491p20 0x0.0p0 -0x1.31cd9d4f67722p6 0x1.3644444444425p5 0x0.0p0 F +REG esri:32148 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555554p6 0x1.7eeeeeeeee61ep5 0x0.0p0 F +REG esri:32148 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc4p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:32148 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.7111111111108p5 0x0.0p0 F +REG esri:32148 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.edab194698fc4p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:32148 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab0ep18 0x0.0p0 -0x1.d8ff916411ae3p6 0x1.8ccccccccc626p5 0x0.0p0 F +REG esri:32149 0 OK 0x1.e848p18 0x1.b22d72e072965p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa3p5 0x0.0p0 F +REG esri:32149 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fbap16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:32149 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fbap16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaaap5 0x0.0p0 F +REG esri:32149 3 OK 0x1.16844fa8b2f1cp18 0x1.498d0225ce054p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:32149 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce054p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ep5 0x0.0p0 F +REG esri:32150 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG esri:32150 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG esri:32150 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG esri:32150 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:32150 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG esri:32151 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG esri:32151 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG esri:32151 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG esri:32151 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG esri:32151 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG esri:32152 0 OK 0x1.24f8p19 0x1.5b52fe40022e6p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG esri:32152 1 OK 0x1.96b30a2e34c9p18 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.71352657aea27p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:32152 2 OK 0x1.7e967ae8e59b8p19 -0x1.50f810ac28e08p16 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeee1p5 0x0.0p0 F +REG esri:32152 3 OK 0x1.a0c3f35264cb7p18 0x1.06fc552f580e4p18 0x0.0p0 -0x1.71352657aea27p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:32152 4 OK 0x1.798e0656cd9a4p19 0x1.06fc552f580e4p18 0x0.0p0 -0x1.5ecad9a8515d9p6 0x1.7c88888887f4fp5 0x0.0p0 F +REG esri:32153 0 OK 0x1.24f8p19 0x1.69b66897aa235p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG esri:32153 1 OK 0x1.8f44d7ce9dfa8p18 -0x1.5efab9641596fp16 0x0.0p0 -0x1.715fabce299d5p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:32153 2 OK 0x1.824d9418b102cp19 -0x1.5efab9641596fp16 0x0.0p0 -0x1.5ea05431d662bp6 0x1.57ffffffffff2p5 0x0.0p0 F +REG esri:32153 3 OK 0x1.99b52076836b4p18 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:32153 4 OK 0x1.7d156fc4be4a6p19 0x1.11df3ebb47b8cp18 0x0.0p0 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG esri:32154 0 OK 0x1.24f8p19 0x1.c0697505b68fdp16 0x0.0p0 -0x1.68p6 0x1.5844444444433p5 0x0.0p0 F +REG esri:32154 1 OK 0x1.615ed51025e25p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:32154 2 OK 0x1.99409577ed0e4p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba5p5 0x0.0p0 F +REG esri:32154 3 OK 0x1.70930b80144b8p18 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:32154 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd16dp18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG esri:32155 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 0x0.0p0 F +REG esri:32155 1 OK -0x1.83ac3a84b7a72p18 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.bef7e97fe4fb9p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32155 2 OK 0x1.85261d425bd2fp19 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.8a5d6bd5705a2p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32155 3 OK -0x1.3283d0f5cd3e4p18 0x1.197f618b4ead7p19 0x0.0p0 -0x1.bef7e97f700d8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32155 4 OK 0x1.5c91e87ae69eap19 0x1.197f618b4ead6p19 0x0.0p0 -0x1.8a5d6bd5e5482p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32156 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555553p6 0x1.44p5 0x0.0p0 F +REG esri:32156 1 OK -0x1.80b875096f4bcp17 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.c7a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32156 2 OK 0x1.e6ce1d425bd39p19 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.930816801b047p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32156 3 OK -0x1.bccf43d734f4cp16 0x1.4a53618b4ead6p19 0x0.0p0 -0x1.c7a2942a1ab7ep6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32156 4 OK 0x1.be39e87ae69f2p19 0x1.4a53618b4ead7p19 0x0.0p0 -0x1.930816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32157 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG esri:32157 1 OK 0x1.79e2bda42c7p11 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32157 2 OK 0x1.243b0ea12de9cp20 -0x1.053ba82bedce4p19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32157 3 OK 0x1.5070bc28cb07p16 0x1.197f618b4ead7p19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32157 4 OK 0x1.0ff0f43d734f9p20 0x1.197f618b4ead7p19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32158 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555553p6 0x1.44p5 0x0.0p0 F +REG esri:32158 1 OK 0x1.8c878af690b1cp17 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.d2a2942a8fa5ep6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32158 2 OK 0x1.550f0ea12de98p20 -0x1.a8cf5057db9c8p18 0x0.0p0 -0x1.9e0816801b048p6 0x1.1bffffff76614p5 0x0.0p0 F +REG esri:32158 3 OK 0x1.176c2f0a32c1cp18 0x1.4a53618b4ead7p19 0x0.0p0 -0x1.d2a2942a1ab7dp6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32158 4 OK 0x1.40c4f43d734f5p20 0x1.4a53618b4ead6p19 0x0.0p0 -0x1.9e0816808ff28p6 0x1.6bffffff17412p5 0x0.0p0 F +REG esri:32161 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211fp4 0x0.0p0 F +REG esri:32161 1 OK 0x1.57c9805760d25p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211fp4 0x0.0p0 F +REG esri:32161 2 OK 0x1.30ad9fea27cb7p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211fp4 0x0.0p0 F +REG esri:32161 3 OK 0x1.5cc194d70b475p16 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:32161 4 OK 0x1.2f6f9aca3d2e3p18 0x1.50255ee1d86c4p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222111p4 0x0.0p0 F +REG esri:32180 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.bcp5 0x0.0p0 0x0.0p0 T +REG esri:32180 1 OK -0x1.e8f08b04c4de4p17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32180 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32180 3 OK -0x1.e8f08b04c4de4p17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e3ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32180 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.940000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32181 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.a8p5 0x0.0p0 0x0.0p0 T +REG esri:32181 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32181 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.800000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32181 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.cfffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32181 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.800000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32182 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.cp5 0x0.0p0 0x0.0p0 T +REG esri:32182 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffc55fcp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32182 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.980000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32182 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.e7ffffffc55fcp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32182 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.980000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32183 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.d4p5 0x0.0p0 0x0.0p0 T +REG esri:32183 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32183 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32183 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.fbffffffc55fdp5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32183 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.ac0000003aa03p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32184 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p5 0x0.0p0 0x0.0p0 T +REG esri:32184 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32184 2 OK 0x1.a3e422c131379p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32184 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.09ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32184 4 OK 0x1.a3e422c131379p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.c40000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32185 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.02p6 0x0.0p0 0x0.0p0 T +REG esri:32185 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32185 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32185 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.15ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32185 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.dc0000003aa04p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32186 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.0ep6 0x0.0p0 0x0.0p0 T +REG esri:32186 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32186 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32186 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.21ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32186 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.f40000003aa05p5 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32187 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.1ap6 0x0.0p0 0x0.0p0 T +REG esri:32187 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32187 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32187 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32187 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.060000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32188 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.26p6 0x0.0p0 0x0.0p0 T +REG esri:32188 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32188 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32188 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.39ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32188 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.120000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32189 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.32p6 0x0.0p0 0x0.0p0 T +REG esri:32189 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32189 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32189 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.45ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32189 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.1e0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32190 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.3ep6 0x0.0p0 0x0.0p0 T +REG esri:32190 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32190 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32190 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.51ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32190 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.2a0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32191 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.4ap6 0x0.0p0 0x0.0p0 T +REG esri:32191 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.5dffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32191 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.360000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32191 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.5dffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32191 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.360000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32192 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32192 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.57ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32192 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.300000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32192 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.57ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32192 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.300000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32193 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5p6 0x0.0p0 0x0.0p0 T +REG esri:32193 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.63ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32193 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.3c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32193 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.63ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32193 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.3c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32194 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32194 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6fffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32194 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.480000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32194 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6fffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32194 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.480000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32195 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.68p6 0x0.0p0 0x0.0p0 T +REG esri:32195 1 OK -0x1.e8f08b04c4ep17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.7bffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32195 2 OK 0x1.a3e422c131373p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.540000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32195 3 OK -0x1.e8f08b04c4ep17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.7bffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32195 4 OK 0x1.a3e422c131373p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.540000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32196 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32196 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.87ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32196 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.600000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32196 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.87ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32196 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.600000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32197 0 OK 0x1.29a8p18 0x0.0p0 0x0.0p0 -0x1.8000000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32197 1 OK -0x1.e8f08b04c4dccp17 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.93ffffffe2afep6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32197 2 OK 0x1.a3e422c13138p19 -0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6c0000001d502p6 -0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32197 3 OK -0x1.e8f08b04c4dccp17 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.93ffffffe2afep6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32197 4 OK 0x1.a3e422c13138p19 0x1.0ef82b7611dd6p19 0x0.0p0 -0x1.6c0000001d502p6 0x1.3fffffffeae1p2 0x0.0p0 F +REG esri:32198 0 OK 0x0.0p0 0x1.b11f865aa09bep19 0x0.0p0 -0x1.12p6 0x1.9fffffffffbaap5 0x0.0p0 F +REG esri:32198 1 OK -0x1.0b3a102762b28p21 -0x1.939aa034d63p18 0x0.0p0 -0x1.7374c68e6ad1bp6 0x1.27fffffffffdbp5 0x0.0p0 F +REG esri:32198 2 OK 0x1.0b3a102762b29p21 -0x1.939aa034d63p18 0x0.0p0 -0x1.611672e32a5cbp5 0x1.27fffffffffdbp5 0x0.0p0 F +REG esri:32198 3 OK -0x1.0533a90ea204cp20 0x1.4f35822fcef41p21 0x0.0p0 -0x1.7374c68e6ad1ap6 0x1.0bffffffffff6p6 0x0.0p0 F +REG esri:32198 4 OK 0x1.0533a90ea204dp20 0x1.4f35822fcef41p21 0x0.0p0 -0x1.611672e32a5cbp5 0x1.0bffffffffff6p6 0x0.0p0 F +REG esri:32201 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:32201 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.64p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32201 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.58p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32201 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.64p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32201 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.58p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32202 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:32202 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32202 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32202 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32202 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32203 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:32203 1 OK -0x1.ad74b56e380dp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.54p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32203 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32203 3 OK -0x1.ad74b56e380dp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.54p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32203 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32204 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:32204 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.48p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32204 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.34p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32204 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.48p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32204 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.34p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32205 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:32205 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32205 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.28p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32205 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32205 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.28p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32206 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:32206 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32206 2 OK 0x1.018fa5ab71c06p20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32206 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32206 4 OK 0x1.018fa5ab71c06p20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32207 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:32207 1 OK -0x1.ad74b56e380dp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.24p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32207 2 OK 0x1.018fa5ab71beep20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32207 3 OK -0x1.ad74b56e380dp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.24p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32207 4 OK 0x1.018fa5ab71beep20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32208 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:32208 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.18p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32208 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.04p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32208 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.18p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32208 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.04p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32209 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:32209 1 OK -0x1.ad74b56e380dp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32209 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.fp6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32209 3 OK -0x1.ad74b56e380dp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32209 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.fp6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32210 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32210 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32210 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.d800000000001p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32210 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32210 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.d800000000001p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32211 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:32211 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.e8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32211 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32211 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.e8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32211 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32212 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:32212 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.d000000000001p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32212 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.a8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32212 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.d000000000001p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32212 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.a8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32213 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32213 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.b8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32213 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.9p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32213 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.b8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32213 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.9p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32214 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:32214 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ap6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32214 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.78p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32214 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ap6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32214 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.78p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32215 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32215 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.88p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32215 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32215 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.88p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32215 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32216 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32216 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.7p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32216 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.48p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32216 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.7p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32216 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.48p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32217 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32217 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.58p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32217 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32217 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.58p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32217 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32218 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:32218 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32218 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.18p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32218 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32218 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.18p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32219 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:32219 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.28p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32219 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32219 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.28p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32219 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32220 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:32220 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32220 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.d000000000001p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32220 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32220 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.d000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32221 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:32221 1 OK -0x1.ad74b56e37e8p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.fp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32221 2 OK 0x1.018fa5ab71c02p20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ap5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32221 3 OK -0x1.ad74b56e37e8p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.fp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32221 4 OK 0x1.018fa5ab71c02p20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ap5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32222 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:32222 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32222 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.7p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32222 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32222 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.7p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32223 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:32223 1 OK -0x1.ad74b56e37fap15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.9p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32223 2 OK 0x1.018fa5ab71bfdp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32223 3 OK -0x1.ad74b56e37fap15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.9p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32223 4 OK 0x1.018fa5ab71bfdp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32224 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 -0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:32224 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32224 2 OK 0x1.018fa5ab71bf7p20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32224 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32224 4 OK 0x1.018fa5ab71bf7p20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.1p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32225 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:32225 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32225 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32225 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.3p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32225 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32226 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:32226 1 OK -0x1.ad74b56e37fap15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32226 2 OK 0x1.018fa5ab71bfdp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32226 3 OK -0x1.ad74b56e37fap15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32226 4 OK 0x1.018fa5ab71bfdp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32227 0 OK 0x1.e847fffffffeep18 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:32227 1 OK -0x1.ad74b56e3802p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ap4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32227 2 OK 0x1.018fa5ab71bf8p20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32227 3 OK -0x1.ad74b56e3802p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ap4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32227 4 OK 0x1.018fa5ab71bf8p20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32228 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:32228 1 OK -0x1.ad74b56e380ap15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32228 2 OK 0x1.018fa5ab71bf4p20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4000000000001p3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32228 3 OK -0x1.ad74b56e380ap15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32228 4 OK 0x1.018fa5ab71bf4p20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.4000000000001p3 0x1.4000000000001p2 0x0.0p0 F +REG esri:32229 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:32229 1 OK -0x1.ad74b56e37fap15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32229 2 OK 0x1.018fa5ab71bfcp20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0000000000001p2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32229 3 OK -0x1.ad74b56e37fap15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:32229 4 OK 0x1.018fa5ab71bfcp20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0000000000001p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:32230 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:32230 1 OK -0x1.ad74b56e3801p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32230 2 OK 0x1.018fa5ab71bf8p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.ffffffffffffep0 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32230 3 OK -0x1.ad74b56e3801p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.ffffffffffffep2 0x1.4000000000001p2 0x0.0p0 F +REG esri:32230 4 OK 0x1.018fa5ab71bf8p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.ffffffffffffep0 0x1.4000000000001p2 0x0.0p0 F +REG esri:32231 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:32231 1 OK -0x1.ad74b56e37f1p15 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0000000000001p1 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32231 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.ffffffffffffep2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32231 3 OK -0x1.ad74b56e37f1p15 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.0000000000001p1 0x1.4000000000001p2 0x0.0p0 F +REG esri:32231 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.ffffffffffffep2 0x1.4000000000001p2 0x0.0p0 F +REG esri:32232 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:32232 1 OK -0x1.ad74b56e37f9p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p2 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32232 2 OK 0x1.018fa5ab71bfdp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32232 3 OK -0x1.ad74b56e37f9p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:32232 4 OK 0x1.018fa5ab71bfdp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp3 0x1.4000000000001p2 0x0.0p0 F +REG esri:32233 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:32233 1 OK -0x1.ad74b56e37e8p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.4000000000001p3 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32233 2 OK 0x1.018fa5ab71c05p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32233 3 OK -0x1.ad74b56e37e8p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.4000000000001p3 0x1.4000000000001p2 0x0.0p0 F +REG esri:32233 4 OK 0x1.018fa5ab71c05p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32234 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:32234 1 OK -0x1.ad74b56e37f1p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32234 2 OK 0x1.018fa5ab71c01p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.ap4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32234 3 OK -0x1.ad74b56e37f1p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32234 4 OK 0x1.018fa5ab71c01p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.ap4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32235 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:32235 1 OK -0x1.ad74b56e37fap15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32235 2 OK 0x1.018fa5ab71bfdp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32235 3 OK -0x1.ad74b56e37fap15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32235 4 OK 0x1.018fa5ab71bfdp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32236 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:32236 1 OK -0x1.ad74b56e37ffp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp4 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32236 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.3p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32236 3 OK -0x1.ad74b56e37ffp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp4 0x1.4000000000001p2 0x0.0p0 F +REG esri:32236 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.3p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32237 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:32237 1 OK -0x1.ad74b56e37eep15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.1p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32237 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32237 3 OK -0x1.ad74b56e37eep15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.1p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32237 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32238 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:32238 1 OK -0x1.ad74b56e37fap15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32238 2 OK 0x1.018fa5ab71bfdp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.9p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32238 3 OK -0x1.ad74b56e37fap15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32238 4 OK 0x1.018fa5ab71bfdp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.9p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32239 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:32239 1 OK -0x1.ad74b56e37e8p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.7p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32239 2 OK 0x1.018fa5ab71c06p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32239 3 OK -0x1.ad74b56e37e8p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.7p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32239 4 OK 0x1.018fa5ab71c06p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32240 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:32240 1 OK -0x1.ad74b56e3805p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.ap5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32240 2 OK 0x1.018fa5ab71bf4p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.fp5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32240 3 OK -0x1.ad74b56e3805p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.ap5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32240 4 OK 0x1.018fa5ab71bf4p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.fp5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32241 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:32241 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.d000000000001p5 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32241 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.1p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32241 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.d000000000001p5 0x1.4000000000001p2 0x0.0p0 F +REG esri:32241 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.1p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32242 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:32242 1 OK -0x1.ad74b56e3818p15 -0x1.0ee356fd9102cp19 0x0.0p0 0x1.0p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:32242 2 OK 0x1.018fa5ab71beep20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.28p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32242 3 OK -0x1.ad74b56e3818p15 0x1.0ee356fd9102cp19 0x0.0p0 0x1.0p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:32242 4 OK 0x1.018fa5ab71beep20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.28p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32243 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:32243 1 OK -0x1.ad74b56e380dp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.18p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32243 2 OK 0x1.018fa5ab71bf4p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32243 3 OK -0x1.ad74b56e380dp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.18p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32243 4 OK 0x1.018fa5ab71bf4p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32244 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32244 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.3p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32244 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.58p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32244 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.3p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32244 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.58p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32245 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32245 1 OK -0x1.ad74b56e3818p15 -0x1.0ee356fd9102cp19 0x0.0p0 0x1.48p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:32245 2 OK 0x1.018fa5ab71beep20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.7p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32245 3 OK -0x1.ad74b56e3818p15 0x1.0ee356fd9102cp19 0x0.0p0 0x1.48p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:32245 4 OK 0x1.018fa5ab71beep20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.7p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32246 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32246 1 OK -0x1.ad74b56e380dp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32246 2 OK 0x1.018fa5ab71bf4p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.88p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32246 3 OK -0x1.ad74b56e380dp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32246 4 OK 0x1.018fa5ab71bf4p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.88p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32247 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:32247 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.78p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32247 2 OK 0x1.018fa5ab71cp20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.ap6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32247 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.78p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32247 4 OK 0x1.018fa5ab71cp20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.ap6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32248 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32248 1 OK -0x1.ad74b56e3818p15 -0x1.0ee356fd9102cp19 0x0.0p0 0x1.9p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:32248 2 OK 0x1.018fa5ab71beep20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.b8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32248 3 OK -0x1.ad74b56e3818p15 0x1.0ee356fd9102cp19 0x0.0p0 0x1.9p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:32248 4 OK 0x1.018fa5ab71beep20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.b8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32249 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:32249 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.a8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32249 2 OK 0x1.018fa5ab71c12p20 -0x1.0ee356fd9102cp19 0x0.0p0 0x1.d000000000001p6 -0x1.4000000000002p2 0x0.0p0 F +REG esri:32249 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.a8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32249 4 OK 0x1.018fa5ab71c12p20 0x1.0ee356fd9102cp19 0x0.0p0 0x1.d000000000001p6 0x1.4000000000002p2 0x0.0p0 F +REG esri:32250 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:32250 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32250 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.e8p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32250 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.cp6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32250 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.e8p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32251 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32251 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.d800000000001p6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32251 2 OK 0x1.018fa5ab71c06p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32251 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.d800000000001p6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32251 4 OK 0x1.018fa5ab71c06p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.0p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32252 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:32252 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.fp6 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32252 2 OK 0x1.018fa5ab71c12p20 -0x1.0ee356fd9102cp19 0x0.0p0 0x1.0cp7 -0x1.4000000000002p2 0x0.0p0 F +REG esri:32252 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.fp6 0x1.4000000000001p2 0x0.0p0 F +REG esri:32252 4 OK 0x1.018fa5ab71c12p20 0x1.0ee356fd9102cp19 0x0.0p0 0x1.0cp7 0x1.4000000000002p2 0x0.0p0 F +REG esri:32253 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:32253 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.04p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32253 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.18p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32253 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.04p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32253 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.18p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32254 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:32254 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.1p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32254 2 OK 0x1.018fa5ab71c06p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.24p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32254 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.1p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32254 4 OK 0x1.018fa5ab71c06p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.24p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32255 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:32255 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.1cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32255 2 OK 0x1.018fa5ab71c12p20 -0x1.0ee356fd9102cp19 0x0.0p0 0x1.3p7 -0x1.4000000000002p2 0x0.0p0 F +REG esri:32255 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.1cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32255 4 OK 0x1.018fa5ab71c12p20 0x1.0ee356fd9102cp19 0x0.0p0 0x1.3p7 0x1.4000000000002p2 0x0.0p0 F +REG esri:32256 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:32256 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.28p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32256 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.3cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32256 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.28p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32256 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.3cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32257 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:32257 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.34p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32257 2 OK 0x1.018fa5ab71c06p20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.48p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32257 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.34p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32257 4 OK 0x1.018fa5ab71c06p20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.48p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32258 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:32258 1 OK -0x1.ad74b56e380dp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32258 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.54p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32258 3 OK -0x1.ad74b56e380dp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.4p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32258 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.54p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32259 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:32259 1 OK -0x1.ad74b56e37f4p15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.4cp7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32259 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32259 3 OK -0x1.ad74b56e37f4p15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.4cp7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32259 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 0x1.6p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32260 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:32260 1 OK -0x1.ad74b56e37dcp15 -0x1.0ee356fd9102bp19 0x0.0p0 0x1.58p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32260 2 OK 0x1.018fa5ab71bfap20 -0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6400000000001p7 -0x1.4000000000001p2 0x0.0p0 F +REG esri:32260 3 OK -0x1.ad74b56e37dcp15 0x1.0ee356fd9102bp19 0x0.0p0 0x1.58p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32260 4 OK 0x1.018fa5ab71bfap20 0x1.0ee356fd9102bp19 0x0.0p0 -0x1.6400000000001p7 0x1.4000000000001p2 0x0.0p0 F +REG esri:32301 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32301 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32301 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32301 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.4p4 0x0.0p0 F +REG esri:32301 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32302 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32302 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32302 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32302 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32302 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32303 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32303 1 OK -0x1.fbe452fa3caap14 0x1.97014fe9a311dp22 0x0.0p0 -0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32303 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32303 3 OK -0x1.2fd7f83067ae8p16 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.5508a5c0c2b98p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32303 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.3ef75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32304 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.3ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32304 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32304 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32304 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.4908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32304 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.32f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32305 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.32p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32305 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32305 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32305 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32305 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.26f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32306 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.26p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32306 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32306 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 -0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32306 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.3108a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32306 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.1af75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32307 0 OK 0x1.e847fffffffd4p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32307 1 OK -0x1.fbe452fa3caap14 0x1.97014fe9a311dp22 0x0.0p0 -0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32307 2 OK 0x1.f8272297d1e2bp19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32307 3 OK -0x1.2fd7f83067ae8p16 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32307 4 OK 0x1.07217f8306798p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.0ef75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:32308 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32308 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32308 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32308 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.1908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32308 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.02f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32309 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32309 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32309 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32309 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.0d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32309 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.edeeb47e7a8d1p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32310 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32310 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32310 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32310 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.0108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32310 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.d5eeb47e7a8d3p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32311 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32311 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32311 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32311 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.ea114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32311 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.bdeeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32312 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32312 1 OK -0x1.fbe452fa3c6ap14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32312 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32312 3 OK -0x1.2fd7f830679d8p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.d2114b818572dp6 -0x1.4p4 0x0.0p0 F +REG esri:32312 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.a5eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32313 0 OK 0x1.e847fffffffeap18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32313 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32313 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32313 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.ba114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32313 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.8deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32314 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32314 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32314 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32314 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.a2114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32314 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.75eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32315 0 OK 0x1.e847fffffffeap18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.74p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32315 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32315 2 OK 0x1.f8272297d1e35p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.5deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32315 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.8a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32315 4 OK 0x1.07217f830679ep20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.5deeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG esri:32316 0 OK 0x1.e848000000016p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.5cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32316 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.72114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32316 2 OK 0x1.f8272297d1e4ap19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.45eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32316 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.72114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32316 4 OK 0x1.07217f83067a8p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.45eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32317 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32317 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32317 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32317 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32317 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32318 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32318 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32318 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32318 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32318 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32319 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32319 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32319 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32319 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32319 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32320 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32320 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32320 2 OK 0x1.f8272297d1e4ap19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32320 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32320 4 OK 0x1.07217f83067a8p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32321 0 OK 0x1.e848000000016p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32321 1 OK -0x1.fbe452fa3c6ap14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32321 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32321 3 OK -0x1.2fd7f830679d8p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.4p4 0x0.0p0 F +REG esri:32321 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32322 0 OK 0x1.e84800000000bp18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32322 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32322 2 OK 0x1.f8272297d1e4ap19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32322 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32322 4 OK 0x1.07217f83067a8p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32323 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32323 1 OK -0x1.fbe452fa3c8ep14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32323 2 OK 0x1.f8272297d1e47p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32323 3 OK -0x1.2fd7f83067a6p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32323 4 OK 0x1.07217f83067a6p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32324 0 OK 0x1.e847ffffffff5p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32324 1 OK -0x1.fbe452fa3cap14 0x1.97014fe9a311dp22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32324 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32324 3 OK -0x1.2fd7f83067ab8p16 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32324 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32325 0 OK 0x1.e84800000000bp18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32325 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32325 2 OK 0x1.f8272297d1e4ap19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32325 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32325 4 OK 0x1.07217f83067a8p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32326 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32326 1 OK -0x1.fbe452fa3c8ep14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32326 2 OK 0x1.f8272297d1e44p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.57bad1f9ea347p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32326 3 OK -0x1.2fd7f83067a6p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32326 4 OK 0x1.07217f83067a4p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.57bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32327 0 OK 0x1.e847fffffffefp18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.5p4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32327 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.a8452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32327 2 OK 0x1.f8272297d1e3ep19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.ef75a3f3d468fp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32327 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.a8452e0615cb9p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32327 4 OK 0x1.07217f83067a1p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.ef75a3f3d468fp3 -0x1.4p4 0x0.0p0 F +REG esri:32328 0 OK 0x1.e847fffffffe4p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32328 1 OK -0x1.fbe452fa3ca8p14 0x1.97014fe9a311dp22 0x0.0p0 -0x1.48452e0615cbap4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32328 2 OK 0x1.f8272297d1e35p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.2f75a3f3d469p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32328 3 OK -0x1.2fd7f83067ac8p16 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.48452e0615cb9p4 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32328 4 OK 0x1.07217f830679ep20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.2f75a3f3d468cp3 -0x1.4p4 0x0.0p0 F +REG esri:32329 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32329 1 OK -0x1.fbe452fa3c8ep14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.d08a5c0c2b973p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32329 2 OK 0x1.f8272297d1e47p19 0x1.97014fe9a311ep22 0x0.0p0 -0x1.bdd68fcf51a31p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32329 3 OK -0x1.2fd7f83067a6p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.d08a5c0c2b973p3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32329 4 OK 0x1.07217f83067a6p20 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.bdd68fcf51a32p1 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32330 0 OK 0x1.e847ffffffff1p18 0x1.b997b3d93ae9dp22 0x0.0p0 -0x1.8000000000001p1 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32330 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.108a5c0c2b971p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32330 2 OK 0x1.f8272297d1e3ep19 0x1.97014fe9a311ep22 0x0.0p0 0x1.42297030ae5c6p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32330 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.108a5c0c2b972p3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32330 4 OK 0x1.07217f83067a1p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.42297030ae5c6p1 -0x1.4p4 0x0.0p0 F +REG esri:32331 0 OK 0x1.e84800000000fp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.8000000000001p1 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32331 1 OK -0x1.fbe452fa3c7cp14 0x1.97014fe9a311ep22 0x0.0p0 -0x1.42297030ae5c6p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32331 2 OK 0x1.f8272297d1e4ap19 0x1.97014fe9a311ep22 0x0.0p0 0x1.108a5c0c2b971p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32331 3 OK -0x1.2fd7f83067a1p16 0x1.dacaa2c0ca395p22 0x0.0p0 -0x1.42297030ae5c6p1 -0x1.4p4 0x0.0p0 F +REG esri:32331 4 OK 0x1.07217f83067a8p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.108a5c0c2b971p3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32332 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32332 1 OK -0x1.fbe452fa3c8ep14 0x1.97014fe9a311ep22 0x0.0p0 0x1.bdd68fcf51a31p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32332 2 OK 0x1.f8272297d1e47p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32332 3 OK -0x1.2fd7f83067a58p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.bdd68fcf51a34p1 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32332 4 OK 0x1.07217f83067a6p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32333 0 OK 0x1.e84800000001cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32333 1 OK -0x1.fbe452fa3c6ap14 0x1.97014fe9a311ep22 0x0.0p0 0x1.2f75a3f3d469p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32333 2 OK 0x1.f8272297d1e54p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.48452e0615cbap4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32333 3 OK -0x1.2fd7f830679d8p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.2f75a3f3d468dp3 -0x1.4p4 0x0.0p0 F +REG esri:32333 4 OK 0x1.07217f83067acp20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.48452e0615cb8p4 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32334 0 OK 0x1.e848000000011p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.5p4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32334 1 OK -0x1.fbe452fa3c7cp14 0x1.97014fe9a311ep22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32334 2 OK 0x1.f8272297d1e4ap19 0x1.97014fe9a311ep22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32334 3 OK -0x1.2fd7f83067a1p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.4p4 0x0.0p0 F +REG esri:32334 4 OK 0x1.07217f83067a8p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32335 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32335 1 OK -0x1.fbe452fa3c88p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.57bad1f9ea347p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32335 2 OK 0x1.f8272297d1e47p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.042297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32335 3 OK -0x1.2fd7f83067a48p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.57bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32335 4 OK 0x1.07217f83067a6p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32336 0 OK 0x1.e847ffffffff5p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32336 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32336 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32336 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32336 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32337 0 OK 0x1.e84800000000bp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32337 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32337 2 OK 0x1.f8272297d1e5p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32337 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32337 4 OK 0x1.07217f83067acp20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32338 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32338 1 OK -0x1.fbe452fa3c8ep14 0x1.97014fe9a311ep22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32338 2 OK 0x1.f8272297d1e47p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32338 3 OK -0x1.2fd7f83067a6p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32338 4 OK 0x1.07217f83067a6p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.942297030ae5dp5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32339 0 OK 0x1.e848000000021p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32339 1 OK -0x1.fbe452fa3c6ap14 0x1.97014fe9a311ep22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32339 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32339 3 OK -0x1.2fd7f830679d8p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.4p4 0x0.0p0 F +REG esri:32339 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32340 0 OK 0x1.e847fffffffeap18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32340 1 OK -0x1.fbe452fa3caap14 0x1.97014fe9a311dp22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32340 2 OK 0x1.f8272297d1e35p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32340 3 OK -0x1.2fd7f83067ae8p16 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32340 4 OK 0x1.07217f830679ep20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.4p4 0x0.0p0 F +REG esri:32341 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32341 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32341 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32341 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32341 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.12114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32342 0 OK 0x1.e847fffffffbep18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32342 1 OK -0x1.fbe452fa3ccp14 0x1.97014fe9a311dp22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32342 2 OK 0x1.f8272297d1e2bp19 0x1.97014fe9a311ep22 0x0.0p0 0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32342 3 OK -0x1.2fd7f83067b4p16 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32342 4 OK 0x1.07217f8306798p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.2a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG esri:32343 0 OK 0x1.e847fffffffeap18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32343 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32343 2 OK 0x1.f8272297d1e35p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32343 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32343 4 OK 0x1.07217f830679ep20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.42114b818572ep6 -0x1.4p4 0x0.0p0 F +REG esri:32344 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32344 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32344 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32344 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32344 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.5a114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32345 0 OK 0x1.e847fffffffbep18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.5cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32345 1 OK -0x1.fbe452fa3ccp14 0x1.97014fe9a311dp22 0x0.0p0 0x1.45eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32345 2 OK 0x1.f8272297d1e2bp19 0x1.97014fe9a311ep22 0x0.0p0 0x1.72114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32345 3 OK -0x1.2fd7f83067b4p16 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.45eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32345 4 OK 0x1.07217f8306798p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.72114b818572ep6 -0x1.4p4 0x0.0p0 F +REG esri:32346 0 OK 0x1.e847fffffffeap18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.74p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32346 1 OK -0x1.fbe452fa3c94p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32346 2 OK 0x1.f8272297d1e35p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32346 3 OK -0x1.2fd7f83067a88p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32346 4 OK 0x1.07217f830679ep20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.8a114b818572ep6 -0x1.4p4 0x0.0p0 F +REG esri:32347 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32347 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32347 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32347 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32347 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32348 0 OK 0x1.e847fffffffd4p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32348 1 OK -0x1.fbe452fa3ccp14 0x1.97014fe9a311dp22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32348 2 OK 0x1.f8272297d1e2bp19 0x1.97014fe9a311ep22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32348 3 OK -0x1.2fd7f83067b4p16 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32348 4 OK 0x1.07217f8306798p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.4p4 0x0.0p0 F +REG esri:32349 0 OK 0x1.e848000000042p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32349 1 OK -0x1.fbe452fa3c42p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32349 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32349 3 OK -0x1.2fd7f8306791p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.4p4 0x0.0p0 F +REG esri:32349 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32350 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32350 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32350 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32350 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32350 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32351 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32351 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32351 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32351 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.4p4 0x0.0p0 F +REG esri:32351 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32352 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32352 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32352 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32352 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.4p4 0x0.0p0 F +REG esri:32352 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32353 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32353 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32353 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32353 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32353 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32354 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32354 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32354 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32354 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:32354 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32355 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.26p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32355 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32355 2 OK 0x1.f8272297d1e6bp19 0x1.97014fe9a311dp22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32355 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:32355 4 OK 0x1.07217f83067bap20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32356 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.32p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32356 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32356 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32356 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32356 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32357 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.3ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32357 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32357 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32357 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:32357 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32358 0 OK 0x1.e847fffffffd4p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32358 1 OK -0x1.fbe452fa3caap14 0x1.97014fe9a311dp22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32358 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32358 3 OK -0x1.2fd7f83067ae8p16 0x1.dacaa2c0ca394p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32358 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32359 0 OK 0x1.e848p18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32359 1 OK -0x1.fbe452fa3c82p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32359 2 OK 0x1.f8272297d1e41p19 0x1.97014fe9a311ep22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32359 3 OK -0x1.2fd7f83067a3p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32359 4 OK 0x1.07217f83067a3p20 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.3ffffffffffffp4 0x0.0p0 F +REG esri:32360 0 OK 0x1.e84800000002cp18 0x1.b997b3d93ae9dp22 0x0.0p0 0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32360 1 OK -0x1.fbe452fa3c56p14 0x1.97014fe9a311ep22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32360 2 OK 0x1.f8272297d1e55p19 0x1.97014fe9a311dp22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32360 3 OK -0x1.2fd7f83067978p16 0x1.dacaa2c0ca395p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.4p4 0x0.0p0 F +REG esri:32360 4 OK 0x1.07217f83067aep20 0x1.dacaa2c0ca394p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32401 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.62p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32401 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2febp2 0x1.64p7 -0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32401 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.58p7 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32401 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04cp2 0x1.64p7 0x1.3fffffffea8fep2 0x1.9d76p-14 F +REG esri:32401 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.58p7 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG esri:32402 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.56p7 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG esri:32402 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.6p7 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32402 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.4cp7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32402 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.6p7 0x1.3fffffffea8ffp2 0x1.9d76p-14 F +REG esri:32402 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.4cp7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32403 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.4ap7 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG esri:32403 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.54p7 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32403 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.3ffffffffffffp7 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32403 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.54p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32403 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.3ffffffffffffp7 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG esri:32404 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.3ep7 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG esri:32404 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.48p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32404 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.34p7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32404 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.48p7 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32404 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.34p7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32405 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.32p7 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG esri:32405 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.3cp7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32405 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.28p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32405 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.3cp7 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32405 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.28p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32406 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.25fffffffffffp7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32406 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.3p7 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32406 2 OK 0x1.018e12e0a96aap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.1cp7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32406 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.3p7 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32406 4 OK 0x1.018e13574b762p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.1cp7 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG esri:32407 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.19fffffffffffp7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a2p-14 T +REG esri:32407 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.24p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32407 2 OK 0x1.018e12e0a9686p20 -0x1.0ee38c6f9142ap19 0x1.259d2fedp2 -0x1.1000000000001p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32407 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.24p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32407 4 OK 0x1.018e13574b73ep20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.1000000000001p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32408 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.0ep7 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG esri:32408 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.18p7 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32408 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.04p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32408 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.18p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32408 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.04p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32409 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.0200000000001p7 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG esri:32409 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.0cp7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32409 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.efffffffffffep6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32409 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.0cp7 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32409 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 -0x1.efffffffffffep6 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32410 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.ec00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32410 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.0p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32410 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 -0x1.d800000000003p6 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32410 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.0p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32410 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af05p2 -0x1.d800000000003p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32411 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.d4p6 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG esri:32411 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.e8p6 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32411 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.c000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32411 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.e8p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32411 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.c000000000001p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32412 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.bc00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32412 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.d000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32412 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.a800000000001p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32412 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.d000000000001p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32412 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.a800000000001p6 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32413 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.a400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32413 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.b800000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32413 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 -0x1.9000000000001p6 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32413 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.b800000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32413 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af05p2 -0x1.9000000000001p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32414 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.8c00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32414 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.a000000000001p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32414 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.7800000000001p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32414 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.a000000000001p6 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32414 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.7800000000001p6 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32415 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.7400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32415 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.8800000000001p6 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32415 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.6p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32415 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.8800000000001p6 0x1.3fffffffea8ffp2 0x1.9d76p-14 F +REG esri:32415 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.6p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32416 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.5cp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32416 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2febp2 -0x1.7000000000001p6 -0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32416 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.48p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32416 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04cp2 -0x1.7000000000001p6 0x1.3fffffffea8fep2 0x1.9d76p-14 F +REG esri:32416 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.48p6 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG esri:32417 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.44p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32417 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.58p6 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32417 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.3p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32417 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.58p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32417 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.3p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32418 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.2c00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32418 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.3ffffffffffffp6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32418 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.18p6 -0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:32418 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.3ffffffffffffp6 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:32418 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.18p6 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32419 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.1400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32419 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.28p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32419 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.0p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32419 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.28p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32419 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.0p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32420 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.f8p5 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG esri:32420 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.1000000000001p6 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32420 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.d000000000003p5 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32420 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.1000000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32420 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.d000000000003p5 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32421 0 OK 0x1.e841b5ba6825p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.c800000000001p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32421 1 OK -0x1.ada7003e3944p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.efffffffffffep5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32421 2 OK 0x1.018e12e0a96a4p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.a000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32421 3 OK -0x1.ada70f12d3bap15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.efffffffffffep5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32421 4 OK 0x1.018e13574b75cp20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.ap5 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG esri:32422 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.98p5 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG esri:32422 1 OK -0x1.ada7003e3955p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.cp5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32422 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.7000000000002p5 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32422 3 OK -0x1.ada70f12d3cbp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.cp5 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32422 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.7000000000002p5 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG esri:32423 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.67ffffffffffep5 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG esri:32423 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.9p5 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32423 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.4p5 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32423 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.9p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32423 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 -0x1.4p5 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32424 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.3800000000001p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32424 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.6p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32424 2 OK 0x1.018e12e0a9696p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.1p5 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32424 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 -0x1.6p5 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32424 4 OK 0x1.018e13574b74cp20 0x1.0ee312e3756ddp19 0x1.106af04ep2 -0x1.1p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32425 0 OK 0x1.e841b5ba6825p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.08p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32425 1 OK -0x1.ada7003e3955p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.2ffffffffffffp5 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32425 2 OK 0x1.018e12e0a96a2p20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 -0x1.c000000000002p4 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32425 3 OK -0x1.ada70f12d3cbp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.2ffffffffffffp5 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32425 4 OK 0x1.018e13574b75ap20 0x1.0ee312e3756dcp19 0x1.106af05p2 -0x1.cp4 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32426 0 OK 0x1.e841b5ba68237p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.bp4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32426 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.0p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32426 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.5ffffffffffffp4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32426 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.0p5 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32426 4 OK 0x1.018e13574b754p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.6p4 0x1.3fffffffea8fap2 0x1.9d7ap-14 F +REG esri:32427 0 OK 0x1.e841b5ba6821fp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 -0x1.5p4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32427 1 OK -0x1.ada7003e3963p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.9ffffffffffffp4 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32427 2 OK 0x1.018e12e0a969bp20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 -0x1.ffffffffffffep3 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32427 3 OK -0x1.ada70f12d3d7p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.9ffffffffffffp4 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32427 4 OK 0x1.018e13574b751p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 -0x1.0p4 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32428 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 -0x1.e000000000001p3 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG esri:32428 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.3fffffffffffep4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32428 2 OK 0x1.018e12e0a9697p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.3ffffffffffffp3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32428 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.3ffffffffffffp4 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32428 4 OK 0x1.018e13574b74ep20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.3ffffffffffffp3 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32429 0 OK 0x1.e841b5ba68234p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 -0x1.2000000000001p3 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG esri:32429 1 OK -0x1.ada7003e396p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 -0x1.c000000000001p3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32429 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.0000000000001p2 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32429 3 OK -0x1.ada70f12d3d4p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 -0x1.c000000000001p3 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32429 4 OK 0x1.018e13574b755p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.0000000000001p2 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32430 0 OK 0x1.e841b5ba68227p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 -0x1.8000000000001p1 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32430 1 OK -0x1.ada7003e3964p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 -0x1.0p3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32430 2 OK 0x1.018e12e0a969bp20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.0000000000005p1 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32430 3 OK -0x1.ada70f12d3d8p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 -0x1.ffffffffffffep2 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32430 4 OK 0x1.018e13574b751p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.ffffffffffffep0 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32431 0 OK 0x1.e841b5ba68247p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.8000000000001p1 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32431 1 OK -0x1.ada7003e3952p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 -0x1.ffffffffffff9p0 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32431 2 OK 0x1.018e12e0a96a1p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.ffffffffffffdp2 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32431 3 OK -0x1.ada70f12d3c9p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 -0x1.0000000000002p1 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32431 4 OK 0x1.018e13574b759p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.ffffffffffffdp2 0x1.3fffffffea8fbp2 0x1.9d77p-14 F +REG esri:32432 0 OK 0x1.e841b5ba68237p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.2000000000001p3 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32432 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.0000000000001p2 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32432 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.bffffffffffffp3 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32432 3 OK -0x1.ada70f12d3dp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.0p2 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32432 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.cp3 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32433 0 OK 0x1.e841b5ba6825p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.dfffffffffffep3 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32433 1 OK -0x1.ada7003e394bp15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.4000000000002p3 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32433 2 OK 0x1.018e12e0a96a4p20 -0x1.0ee38c6f91429p19 0x1.259d2ffp2 0x1.4000000000001p4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32433 3 OK -0x1.ada70f12d3cp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.4p3 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:32433 4 OK 0x1.018e13574b75cp20 0x1.0ee312e3756dbp19 0x1.106af051p2 0x1.4p4 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32434 0 OK 0x1.e841b5ba6824ap18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.5p4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32434 1 OK -0x1.ada7003e3952p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.0000000000001p4 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32434 2 OK 0x1.018e12e0a96a2p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.9ffffffffffffp4 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32434 3 OK -0x1.ada70f12d3c9p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.0p4 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32434 4 OK 0x1.018e13574b75ap20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.ap4 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32435 0 OK 0x1.e841b5ba68237p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.bp4 -0x1.2f74bf1dbb5b8p-68 0x1.a0a2p-14 T +REG esri:32435 1 OK -0x1.ada7003e395ap15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.6000000000001p4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32435 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.0p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32435 3 OK -0x1.ada70f12d3cep15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.6000000000001p4 0x1.3fffffffea8fdp2 0x1.9d7ap-14 F +REG esri:32435 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.ffffffffffffep4 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32436 0 OK 0x1.e841b5ba6821fp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.07fffffffffffp5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32436 1 OK -0x1.ada7003e3963p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 0x1.cp4 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32436 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.3000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32436 3 OK -0x1.ada70f12d3d7p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 0x1.cp4 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32436 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.3000000000001p5 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32437 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.37fffffffffffp5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32437 1 OK -0x1.ada7003e394ap15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.1p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32437 2 OK 0x1.018e12e0a96a1p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.5ffffffffffffp5 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32437 3 OK -0x1.ada70f12d3cp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.1p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32437 4 OK 0x1.018e13574b759p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.5ffffffffffffp5 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32438 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 0x1.67fffffffffffp5 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG esri:32438 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.4000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32438 2 OK 0x1.018e12e0a969cp20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.8ffffffffffffp5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32438 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.4000000000001p5 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32438 4 OK 0x1.018e13574b752p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.8ffffffffffffp5 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32439 0 OK 0x1.e841b5ba6825cp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.98p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32439 1 OK -0x1.ada7003e394ap15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.7p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32439 2 OK 0x1.018e12e0a96a8p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.c000000000001p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32439 3 OK -0x1.ada70f12d3cp15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.7000000000001p5 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32439 4 OK 0x1.018e13574b75fp20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.c000000000001p5 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32440 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.c800000000001p5 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG esri:32440 1 OK -0x1.ada7003e3963p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.a000000000001p5 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32440 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.efffffffffffep5 -0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:32440 3 OK -0x1.ada70f12d3d7p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.a000000000001p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32440 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.efffffffffffep5 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32441 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.f8p5 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32441 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.d000000000003p5 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32441 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.1p6 -0x1.3fffffffea8fdp2 0x1.9d7ap-14 F +REG esri:32441 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.d000000000003p5 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32441 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.1p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32442 0 OK 0x1.e841b5ba681e2p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.13fffffffffffp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32442 1 OK -0x1.ada7003e3974p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.0000000000001p6 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:32442 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.28p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32442 3 OK -0x1.ada70f12d3e9p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.0000000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32442 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.28p6 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32443 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 0x1.2cp6 -0x1.2f74bf1dbb5b8p-67 0x1.a0a2p-14 T +REG esri:32443 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.18p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32443 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.3ffffffffffffp6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32443 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.18p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32443 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.3ffffffffffffp6 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32444 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 0x1.44p6 -0x1.7b51eee52a323p-67 0x1.a0a5p-14 T +REG esri:32444 1 OK -0x1.ada7003e395bp15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.3p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32444 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.58p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32444 3 OK -0x1.ada70f12d3d2p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.3p6 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32444 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.58p6 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32445 0 OK 0x1.e841b5ba681fbp18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.5cp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32445 1 OK -0x1.ada7003e398p15 -0x1.0ee398b705fdcp19 0x1.259d2fefp2 0x1.47fffffffffffp6 -0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32445 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.7000000000001p6 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32445 3 OK -0x1.ada70f12d3f5p15 0x1.0ee31f2ae4b4fp19 0x1.106af05p2 0x1.47fffffffffffp6 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32445 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.7000000000001p6 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32446 0 OK 0x1.e841b5ba6822bp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.7400000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32446 1 OK -0x1.ada7003e3974p15 -0x1.0ee398b705fddp19 0x1.259d2febp2 0x1.6p6 -0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32446 2 OK 0x1.018e12e0a969ap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.8800000000001p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32446 3 OK -0x1.ada70f12d3e9p15 0x1.0ee31f2ae4b5p19 0x1.106af04cp2 0x1.6p6 0x1.3fffffffea8fep2 0x1.9d76p-14 F +REG esri:32446 4 OK 0x1.018e13574b75p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.8800000000001p6 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32447 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 0x1.8c00000000001p6 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG esri:32447 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.7800000000001p6 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32447 2 OK 0x1.018e12e0a96a4p20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.a000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32447 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.7800000000001p6 0x1.3fffffffea8ffp2 0x1.9d76p-14 F +REG esri:32447 4 OK 0x1.018e13574b75cp20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.a000000000001p6 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32448 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.a400000000001p6 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG esri:32448 1 OK -0x1.ada7003e3974p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.9000000000001p6 -0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32448 2 OK 0x1.018e12e0a9692p20 -0x1.0ee38c6f91429p19 0x1.259d2ffp2 0x1.b800000000001p6 -0x1.3fffffffea8fcp2 0x1.9d7bp-14 F +REG esri:32448 3 OK -0x1.ada70f12d3e9p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.9000000000001p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32448 4 OK 0x1.018e13574b74ap20 0x1.0ee312e3756dbp19 0x1.106af051p2 0x1.b800000000001p6 0x1.3fffffffea8fap2 0x1.9d7ap-14 F +REG esri:32449 0 OK 0x1.e841b5ba6828cp18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.bc00000000001p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32449 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.a800000000001p6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32449 2 OK 0x1.018e12e0a96b6p20 -0x1.0ee38c6f9142bp19 0x1.259d2feep2 0x1.d000000000001p6 -0x1.3fffffffea8fcp2 0x1.9d7bp-14 F +REG esri:32449 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4fp19 0x1.106af04fp2 0x1.a800000000001p6 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32449 4 OK 0x1.018e13574b76ep20 0x1.0ee312e3756ddp19 0x1.106af04fp2 0x1.d000000000001p6 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32450 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.d4p6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32450 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.c000000000001p6 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32450 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.e8p6 -0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32450 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.c000000000001p6 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32450 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.e8p6 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32451 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.ebfffffffffffp6 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32451 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.d800000000003p6 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32451 2 OK 0x1.018e12e0a96aap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.0p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32451 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.d800000000003p6 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32451 4 OK 0x1.018e13574b762p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.0p7 0x1.3fffffffea8f9p2 0x1.9d7ap-14 F +REG esri:32452 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.02p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32452 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.fp6 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32452 2 OK 0x1.018e12e0a96b6p20 -0x1.0ee38c6f9142bp19 0x1.259d2fefp2 0x1.0cp7 -0x1.3fffffffea8fdp2 0x1.9d7bp-14 F +REG esri:32452 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.f000000000002p6 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:32452 4 OK 0x1.018e13574b76ep20 0x1.0ee312e3756dcp19 0x1.106af05p2 0x1.0cp7 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32453 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9abp2 0x1.0ep7 -0x1.7b51eee52a324p-67 0x1.a0a4p-14 T +REG esri:32453 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.04p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32453 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.18p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32453 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b4fp19 0x1.106af04ep2 0x1.04p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32453 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.18p7 0x1.3fffffffea8fdp2 0x1.9d77p-14 F +REG esri:32454 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.1ap7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32454 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.1000000000001p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32454 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.23fffffffffffp7 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:32454 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.1p7 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32454 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.23fffffffffffp7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32455 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.26p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32455 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.1cp7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32455 2 OK 0x1.018e12e0a96b6p20 -0x1.0ee38c6f9142bp19 0x1.259d2fefp2 0x1.3p7 -0x1.3fffffffea8ffp2 0x1.9d79p-14 F +REG esri:32455 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.1cp7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32455 4 OK 0x1.018e13574b76ep20 0x1.0ee312e3756dcp19 0x1.106af05p2 0x1.3p7 0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32456 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.32p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32456 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.28p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32456 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.3cp7 -0x1.3fffffffea8fdp2 0x1.9d7ap-14 F +REG esri:32456 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.28p7 0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32456 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756ddp19 0x1.106af04ep2 0x1.3cp7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32457 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345729p0 0x1.1b1e9aadp2 0x1.3ep7 -0x1.2f74bf1dbb5b9p-67 0x1.a0a1p-14 T +REG esri:32457 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.34p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32457 2 OK 0x1.018e12e0a96aap20 -0x1.0ee38c6f9142bp19 0x1.259d2fedp2 0x1.48p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32457 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.34p7 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:32457 4 OK 0x1.018e13574b762p20 0x1.0ee312e3756dcp19 0x1.106af04ep2 0x1.48p7 0x1.3fffffffea8fap2 0x1.9d79p-14 F +REG esri:32458 0 OK 0x1.e841b5ba68213p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.4ap7 -0x1.2f74bf1dbb5b7p-68 0x1.a0a4p-14 T +REG esri:32458 1 OK -0x1.ada7003e3967p15 -0x1.0ee398b705fdcp19 0x1.259d2feep2 0x1.4p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32458 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2fefp2 0x1.54p7 -0x1.3fffffffea8fcp2 0x1.9d7bp-14 F +REG esri:32458 3 OK -0x1.ada70f12d3ddp15 0x1.0ee31f2ae4b5p19 0x1.106af04fp2 0x1.4p7 0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:32458 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af05p2 0x1.54p7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32459 0 OK 0x1.e841b5ba68243p18 -0x1.e6348d9345725p0 0x1.1b1e9aaep2 0x1.56p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32459 1 OK -0x1.ada7003e395p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.4cp7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32459 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 0x1.6p7 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:32459 3 OK -0x1.ada70f12d3c5p15 0x1.0ee31f2ae4b5p19 0x1.106af04ep2 0x1.4cp7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32459 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 0x1.6p7 0x1.3fffffffea8fcp2 0x1.9d78p-14 F +REG esri:32460 0 OK 0x1.e841b5ba68274p18 -0x1.e6348d9345724p0 0x1.1b1e9aafp2 0x1.62p7 -0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:32460 1 OK -0x1.ada7003e3937p15 -0x1.0ee398b705fddp19 0x1.259d2fedp2 0x1.58p7 -0x1.3fffffffea8fdp2 0x1.9d78p-14 F +REG esri:32460 2 OK 0x1.018e12e0a969ep20 -0x1.0ee38c6f9142ap19 0x1.259d2feep2 -0x1.6400000000001p7 -0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:32460 3 OK -0x1.ada70f12d3adp15 0x1.0ee31f2ae4b4ep19 0x1.106af04ep2 0x1.58p7 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:32460 4 OK 0x1.018e13574b756p20 0x1.0ee312e3756dcp19 0x1.106af04fp2 -0x1.6400000000001p7 0x1.3fffffffea8fbp2 0x1.9d79p-14 F +REG esri:32501 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.62p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32501 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.62f75a3f3d46ap7 -0x1.dfffffffe5505p4 0x1.38bep-14 F +REG esri:32501 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.56f75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32501 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.62f75a3f3d46ap7 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32501 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.56f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32502 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.56p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32502 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.6108a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32502 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.4af75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32502 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.6108a5c0c2b97p7 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32502 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.4af75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32503 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.49fffffffffffp7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32503 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.5508a5c0c2b98p7 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG esri:32503 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.3ef75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32503 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.5508a5c0c2b98p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32503 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.3ef75a3f3d469p7 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32504 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dbp22 0x1.4c12245ap2 -0x1.3ep7 -0x1.8fffffffe8626p4 0x1.566ap-14 F +REG esri:32504 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.4908a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32504 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.32f75a3f3d468p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32504 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.4908a5c0c2b97p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32504 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.32f75a3f3d469p7 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32505 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.32p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32505 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.3d08a5c0c2b96p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32505 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.26f75a3f3d468p7 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32505 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.3d08a5c0c2b97p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32505 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.26f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32506 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.2600000000001p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32506 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.3108a5c0c2b98p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32506 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.1af75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32506 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.3108a5c0c2b98p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32506 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.1af75a3f3d469p7 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32507 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.19fffffffffffp7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32507 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.2508a5c0c2b97p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32507 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.0ef75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32507 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.2508a5c0c2b97p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32507 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.0ef75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32508 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.0ep7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32508 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.1908a5c0c2b96p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32508 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.02f75a3f3d468p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32508 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.1908a5c0c2b96p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32508 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.02f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32509 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.0200000000001p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32509 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.0d08a5c0c2b97p7 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32509 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.edeeb47e7a8d1p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32509 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.0d08a5c0c2b97p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32509 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.edeeb47e7a8d1p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32510 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.ec00000000002p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32510 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.0108a5c0c2b97p7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32510 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.d5eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32510 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.0108a5c0c2b97p7 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32510 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.d5eeb47e7a8d3p6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32511 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.d4p6 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32511 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.ea114b818573p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32511 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.bdeeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32511 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.ea114b818573p6 -0x1.3fffffffec2ccp4 0x1.700bp-14 F +REG esri:32511 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699bacp22 0x1.431caffp2 -0x1.bdeeb47e7a8d3p6 -0x1.3fffffffec2cep4 0x1.700bp-14 F +REG esri:32512 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.bc00000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32512 1 OK -0x1.fc3b79ff103ap14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.d2114b818572dp6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32512 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.a5eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32512 3 OK -0x1.2fefa6e9eb888p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.d2114b818572dp6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32512 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.a5eeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32513 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.a400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32513 1 OK -0x1.fc3b79ff107ap14 0x1.970145d62e2ap22 0x1.5481365p2 -0x1.ba114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32513 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.8deeb47e7a8d3p6 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32513 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.ba114b818572fp6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32513 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.8deeb47e7a8d3p6 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32514 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245dp2 -0x1.8c00000000001p6 -0x1.8fffffffe8621p4 0x1.566fp-14 F +REG esri:32514 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.a2114b818572fp6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32514 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.75eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32514 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.a2114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32514 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.75eeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32515 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.7400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32515 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.8a114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32515 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.5deeb47e7a8d2p6 -0x1.dfffffffe5502p4 0x1.38bbp-14 F +REG esri:32515 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.8a114b818572fp6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32515 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.5deeb47e7a8d2p6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32516 0 OK 0x1.e8424bb999d03p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.5bfffffffffffp6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32516 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.72114b818572fp6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32516 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.45eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32516 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.72114b818572fp6 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32516 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.45eeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32517 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245ep2 -0x1.44p6 -0x1.8fffffffe8621p4 0x1.567p-14 F +REG esri:32517 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.5a114b818572ep6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32517 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.2deeb47e7a8d2p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32517 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.5a114b818572ep6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32517 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.2deeb47e7a8d1p6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32518 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.2c00000000001p6 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32518 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.42114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32518 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.15eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32518 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.42114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32518 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699badp22 0x1.431caff1p2 -0x1.15eeb47e7a8d1p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32519 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.1400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32519 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.2a114b818572ep6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32519 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.fbdd68fcf51a4p5 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32519 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.2a114b818572ep6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32519 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.fbdd68fcf51a4p5 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32520 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.f7ffffffffffep5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32520 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.12114b818572dp6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32520 2 OK 0x1.f82464d9d662fp19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.cbdd68fcf51a2p5 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32520 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.12114b818572ep6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32520 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.cbdd68fcf51a2p5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32521 0 OK 0x1.e8424bb999d03p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.c800000000001p5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32521 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.f42297030ae5ep5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32521 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.9bdd68fcf51a3p5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32521 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.f42297030ae5cp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32521 4 OK 0x1.072002d7f84c4p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.9bdd68fcf51a3p5 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32522 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.97fffffffffffp5 -0x1.8fffffffe8625p4 0x1.566bp-14 F +REG esri:32522 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.c42297030ae5cp5 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32522 2 OK 0x1.f82464d9d6629p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.6bdd68fcf51a4p5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32522 3 OK -0x1.2fefa6e9eb91p16 0x1.daca990096ff6p22 0x1.431caffp2 -0x1.c42297030ae5ep5 -0x1.3fffffffec2cdp4 0x1.7008p-14 F +REG esri:32522 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.6bdd68fcf51a3p5 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32523 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.68p5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32523 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.942297030ae5cp5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32523 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.3bdd68fcf51a3p5 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32523 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.942297030ae5cp5 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32523 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.3bdd68fcf51a3p5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32524 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.37ffffffffffep5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32524 1 OK -0x1.fc3b79ff108p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.642297030ae5dp5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32524 2 OK 0x1.f82464d9d661fp19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.0bdd68fcf51a3p5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32524 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.642297030ae5dp5 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32524 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.0bdd68fcf51a1p5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32525 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.0800000000001p5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32525 1 OK -0x1.fc3b79ff1058p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.342297030ae5dp5 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32525 2 OK 0x1.f82464d9d6629p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.b7bad1f9ea348p4 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32525 3 OK -0x1.2fefa6e9eb91p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.342297030ae5dp5 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32525 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.b7bad1f9ea348p4 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32526 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.bp4 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32526 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.042297030ae5cp5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32526 2 OK 0x1.f82464d9d6621p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.57bad1f9ea347p4 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32526 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.042297030ae5dp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32526 4 OK 0x1.072002d7f84bbp20 0x1.daca9f4699bacp22 0x1.431caffp2 -0x1.57bad1f9ea348p4 -0x1.3fffffffec2cep4 0x1.700bp-14 F +REG esri:32527 0 OK 0x1.e8424bb999cd1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.5p4 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32527 1 OK -0x1.fc3b79ff106ep14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.a8452e0615cb9p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32527 2 OK 0x1.f82464d9d661dp19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.ef75a3f3d468ep3 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32527 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.a8452e0615cb8p4 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32527 4 OK 0x1.072002d7f84bbp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.ef75a3f3d468ep3 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32528 0 OK 0x1.e8424bb999cc6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.dffffffffffffp3 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32528 1 OK -0x1.fc3b79ff107cp14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.48452e0615cb9p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32528 2 OK 0x1.f82464d9d6613p19 0x1.97014e483121cp22 0x1.5481364fp2 -0x1.2f75a3f3d468fp3 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32528 3 OK -0x1.2fefa6e9eb9b8p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.48452e0615cb8p4 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32528 4 OK 0x1.072002d7f84b6p20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.2f75a3f3d469p3 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32529 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 -0x1.2p3 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32529 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.d08a5c0c2b973p3 -0x1.dfffffffe5505p4 0x1.38bbp-14 F +REG esri:32529 2 OK 0x1.f82464d9d6622p19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.bdd68fcf51a3bp1 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32529 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 -0x1.d08a5c0c2b96ep3 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32529 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.bdd68fcf51a36p1 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32530 0 OK 0x1.e8424bb999cd2p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 -0x1.8000000000001p1 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32530 1 OK -0x1.fc3b79ff106ep14 0x1.970145d62e29fp22 0x1.5481364ep2 -0x1.108a5c0c2b972p3 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32530 2 OK 0x1.f82464d9d661dp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.42297030ae5cdp1 -0x1.dfffffffe5502p4 0x1.38bbp-14 F +REG esri:32530 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff2p2 -0x1.108a5c0c2b973p3 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32530 4 OK 0x1.072002d7f84bbp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.42297030ae5c8p1 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32531 0 OK 0x1.e8424bb999cf1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.8000000000002p1 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32531 1 OK -0x1.fc3b79ff1054p14 0x1.970145d62e29fp22 0x1.5481364fp2 -0x1.42297030ae5c8p1 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32531 2 OK 0x1.f82464d9d662bp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.108a5c0c2b973p3 -0x1.dfffffffe55p4 0x1.38bep-14 F +REG esri:32531 3 OK -0x1.2fefa6e9eb908p16 0x1.daca990096ff6p22 0x1.431caff1p2 -0x1.42297030ae5c8p1 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32531 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.108a5c0c2b972p3 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32532 0 OK 0x1.e8424bb999cdfp18 0x1.b997ad9dfe7dcp22 0x1.4c12245ep2 0x1.2p3 -0x1.8fffffffe8621p4 0x1.567p-14 F +REG esri:32532 1 OK -0x1.fc3b79ff106p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.bdd68fcf51a39p1 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32532 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.d08a5c0c2b971p3 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32532 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.bdd68fcf51a3cp1 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32532 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.d08a5c0c2b973p3 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32533 0 OK 0x1.e8424bb999cf7p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.dffffffffffffp3 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32533 1 OK -0x1.fc3b79ff103cp14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.2f75a3f3d469p3 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32533 2 OK 0x1.f82464d9d6632p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.48452e0615cbbp4 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32533 3 OK -0x1.2fefa6e9eb8b8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.2f75a3f3d468fp3 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG esri:32533 4 OK 0x1.072002d7f84c6p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.48452e0615cbap4 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32534 0 OK 0x1.e8424bb999cf7p18 0x1.b997ad9dfe7dbp22 0x1.4c12245ap2 0x1.5000000000001p4 -0x1.8fffffffe8626p4 0x1.566ap-14 F +REG esri:32534 1 OK -0x1.fc3b79ff1058p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.ef75a3f3d468ep3 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32534 2 OK 0x1.f82464d9d6629p19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.a8452e0615cbbp4 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32534 3 OK -0x1.2fefa6e9eb8f8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.ef75a3f3d468fp3 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32534 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.a8452e0615cb8p4 -0x1.3fffffffec2cbp4 0x1.700ap-14 F +REG esri:32535 0 OK 0x1.e8424bb999ce1p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.b000000000002p4 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32535 1 OK -0x1.fc3b79ff105cp14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.57bad1f9ea348p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32535 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.042297030ae5ep5 -0x1.dfffffffe55p4 0x1.38bep-14 F +REG esri:32535 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.57bad1f9ea348p4 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32535 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.042297030ae5ep5 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32536 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.07fffffffffffp5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32536 1 OK -0x1.fc3b79ff1072p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.b7bad1f9ea347p4 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32536 2 OK 0x1.f82464d9d661fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.342297030ae5dp5 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32536 3 OK -0x1.2fefa6e9eb958p16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.b7bad1f9ea348p4 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG esri:32536 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.342297030ae5dp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32537 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.3800000000001p5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32537 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.0bdd68fcf51a2p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32537 2 OK 0x1.f82464d9d662fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.642297030ae5dp5 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32537 3 OK -0x1.2fefa6e9eb91p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.0bdd68fcf51a3p5 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32537 4 OK 0x1.072002d7f84c2p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.642297030ae5cp5 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32538 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.67fffffffffffp5 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32538 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.3bdd68fcf51a3p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32538 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.942297030ae5ep5 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32538 3 OK -0x1.2fefa6e9eb97p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.3bdd68fcf51a2p5 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32538 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.942297030ae5dp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32539 0 OK 0x1.e8424bb999d03p18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 0x1.98p5 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32539 1 OK -0x1.fc3b79ff103ap14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.6bdd68fcf51a4p5 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32539 2 OK 0x1.f82464d9d662fp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.c42297030ae5cp5 -0x1.dfffffffe5502p4 0x1.38bbp-14 F +REG esri:32539 3 OK -0x1.2fefa6e9eb888p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.6bdd68fcf51a4p5 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32539 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.c42297030ae5fp5 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32540 0 OK 0x1.e8424bb999cb5p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.c7fffffffffffp5 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32540 1 OK -0x1.fc3b79ff108p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.9bdd68fcf51a4p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32540 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.f42297030ae5cp5 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32540 3 OK -0x1.2fefa6e9eb9dp16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.9bdd68fcf51a3p5 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG esri:32540 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.f42297030ae5cp5 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32541 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245dp2 0x1.f800000000002p5 -0x1.8fffffffe8622p4 0x1.566dp-14 F +REG esri:32541 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.cbdd68fcf51a2p5 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32541 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.12114b818572ep6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32541 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.cbdd68fcf51a4p5 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32541 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699bacp22 0x1.431caffp2 0x1.12114b818572dp6 -0x1.3fffffffec2dp4 0x1.7009p-14 F +REG esri:32542 0 OK 0x1.e8424bb999c94p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.13fffffffffffp6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32542 1 OK -0x1.fc3b79ff108cp14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.fbdd68fcf51a5p5 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32542 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.2a114b818572ep6 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32542 3 OK -0x1.2fefa6e9eba5p16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.fbdd68fcf51a4p5 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32542 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.2a114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32543 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.2bfffffffffffp6 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32543 1 OK -0x1.fc3b79ff1062p14 0x1.970145d62e2ap22 0x1.5481365p2 0x1.15eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38cp-14 F +REG esri:32543 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.42114b818572fp6 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32543 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.15eeb47e7a8d2p6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32543 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.42114b818572dp6 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32544 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 0x1.4400000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32544 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.2deeb47e7a8d2p6 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG esri:32544 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.5a114b818572ep6 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32544 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.2deeb47e7a8d3p6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32544 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.5a114b818572ep6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32545 0 OK 0x1.e8424bb999c94p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.5bfffffffffffp6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32545 1 OK -0x1.fc3b79ff108cp14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.45eeb47e7a8d3p6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32545 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.72114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32545 3 OK -0x1.2fefa6e9eb9fp16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.45eeb47e7a8d2p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32545 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.72114b818572fp6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32546 0 OK 0x1.e8424bb999cd6p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.7400000000001p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32546 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.5deeb47e7a8d2p6 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32546 2 OK 0x1.f82464d9d661ap19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.8a114b818572fp6 -0x1.dfffffffe55p4 0x1.38bep-14 F +REG esri:32546 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.5deeb47e7a8d2p6 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32546 4 OK 0x1.072002d7f84bap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.8a114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32547 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245cp2 0x1.8c00000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32547 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.75eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bep-14 F +REG esri:32547 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481365p2 0x1.a2114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32547 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.75eeb47e7a8d3p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32547 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.a2114b818572fp6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32548 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.a400000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32548 1 OK -0x1.fc3b79ff108cp14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.8deeb47e7a8d3p6 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG esri:32548 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.ba114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32548 3 OK -0x1.2fefa6e9eb9fp16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.8deeb47e7a8d3p6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32548 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.ba114b818572fp6 -0x1.3fffffffec2ccp4 0x1.7009p-14 F +REG esri:32549 0 OK 0x1.e8424bb999d2fp18 0x1.b997ad9dfe7dbp22 0x1.4c12245ap2 0x1.bc00000000001p6 -0x1.8fffffffe8626p4 0x1.566ap-14 F +REG esri:32549 1 OK -0x1.fc3b79ff101p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.a5eeb47e7a8d3p6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32549 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.d2114b818572fp6 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32549 3 OK -0x1.2fefa6e9eb7dp16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.a5eeb47e7a8d3p6 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32549 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.d2114b818572dp6 -0x1.3fffffffec2cbp4 0x1.700ap-14 F +REG esri:32550 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.d4p6 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32550 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.bdeeb47e7a8d3p6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32550 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.ea114b818573p6 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32550 3 OK -0x1.2fefa6e9eb938p16 0x1.daca990096ff6p22 0x1.431caffp2 0x1.bdeeb47e7a8d2p6 -0x1.3fffffffec2cdp4 0x1.7008p-14 F +REG esri:32550 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.ea114b818572cp6 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32551 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.ec00000000001p6 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32551 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e2ap22 0x1.5481364ep2 0x1.d5eeb47e7a8d3p6 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG esri:32551 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.0108a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32551 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.d5eeb47e7a8d3p6 -0x1.3fffffffec2ccp4 0x1.700cp-14 F +REG esri:32551 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.0108a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32552 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.0200000000001p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32552 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.edeeb47e7a8d1p6 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32552 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.0d08a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32552 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff6p22 0x1.431caff1p2 0x1.edeeb47e7a8d1p6 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32552 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.0d08a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32553 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.0ep7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32553 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.02f75a3f3d46ap7 -0x1.dfffffffe5505p4 0x1.38bcp-14 F +REG esri:32553 2 OK 0x1.f82464d9d660fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.1908a5c0c2b96p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32553 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.02f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32553 4 OK 0x1.072002d7f84b4p20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.1908a5c0c2b96p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32554 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.1a00000000001p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32554 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.0ef75a3f3d469p7 -0x1.dfffffffe5507p4 0x1.38bcp-14 F +REG esri:32554 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.2508a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32554 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.0ef75a3f3d469p7 -0x1.3fffffffec2cep4 0x1.7009p-14 F +REG esri:32554 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.2508a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700bp-14 F +REG esri:32555 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.26p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32555 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.1af75a3f3d469p7 -0x1.dfffffffe5507p4 0x1.38bcp-14 F +REG esri:32555 2 OK 0x1.f82464d9d664fp19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.3108a5c0c2b98p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32555 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.1af75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32555 4 OK 0x1.072002d7f84d6p20 0x1.daca9f4699badp22 0x1.431caff1p2 0x1.3108a5c0c2b98p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32556 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245dp2 0x1.32p7 -0x1.8fffffffe8622p4 0x1.566dp-14 F +REG esri:32556 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.26f75a3f3d469p7 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32556 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.3d08a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bfp-14 F +REG esri:32556 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.26f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32556 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699bacp22 0x1.431caffp2 0x1.3d08a5c0c2b97p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32557 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.3ep7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32557 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.32f75a3f3d469p7 -0x1.dfffffffe5505p4 0x1.38bep-14 F +REG esri:32557 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.4908a5c0c2b97p7 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32557 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.32f75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32557 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.4908a5c0c2b97p7 -0x1.3fffffffec2cap4 0x1.700cp-14 F +REG esri:32558 0 OK 0x1.e8424bb999ccp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.4ap7 -0x1.8fffffffe8623p4 0x1.566bp-14 F +REG esri:32558 1 OK -0x1.fc3b79ff1078p14 0x1.970145d62e29fp22 0x1.5481364fp2 0x1.3ef75a3f3d469p7 -0x1.dfffffffe5504p4 0x1.38bdp-14 F +REG esri:32558 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364fp2 0x1.5508a5c0c2b98p7 -0x1.dfffffffe55p4 0x1.38bfp-14 F +REG esri:32558 3 OK -0x1.2fefa6e9eb9ap16 0x1.daca990096ff6p22 0x1.431caff2p2 0x1.3ef75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700ap-14 F +REG esri:32558 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.5508a5c0c2b98p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32559 0 OK 0x1.e8424bb999cecp18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.56p7 -0x1.8fffffffe8623p4 0x1.566cp-14 F +REG esri:32559 1 OK -0x1.fc3b79ff105p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.4af75a3f3d469p7 -0x1.dfffffffe5504p4 0x1.38bcp-14 F +REG esri:32559 2 OK 0x1.f82464d9d6623p19 0x1.97014e483121cp22 0x1.5481364ep2 0x1.6108a5c0c2b97p7 -0x1.dfffffffe5502p4 0x1.38bcp-14 F +REG esri:32559 3 OK -0x1.2fefa6e9eb8e8p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.4af75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700cp-14 F +REG esri:32559 4 OK 0x1.072002d7f84bfp20 0x1.daca9f4699baep22 0x1.431caff2p2 0x1.6108a5c0c2b97p7 -0x1.3fffffffec2cbp4 0x1.700bp-14 F +REG esri:32560 0 OK 0x1.e8424bb999d19p18 0x1.b997ad9dfe7dcp22 0x1.4c12245bp2 0x1.62p7 -0x1.8fffffffe8624p4 0x1.566ap-14 F +REG esri:32560 1 OK -0x1.fc3b79ff1024p14 0x1.970145d62e29fp22 0x1.5481364ep2 0x1.56f75a3f3d469p7 -0x1.dfffffffe5505p4 0x1.38bdp-14 F +REG esri:32560 2 OK 0x1.f82464d9d6639p19 0x1.97014e483121cp22 0x1.5481364ep2 -0x1.62f75a3f3d469p7 -0x1.dfffffffe5502p4 0x1.38bdp-14 F +REG esri:32560 3 OK -0x1.2fefa6e9eb828p16 0x1.daca990096ff7p22 0x1.431caff2p2 0x1.56f75a3f3d469p7 -0x1.3fffffffec2cdp4 0x1.700bp-14 F +REG esri:32560 4 OK 0x1.072002d7f84cap20 0x1.daca9f4699baep22 0x1.431caff2p2 -0x1.62f75a3f3d469p7 -0x1.3fffffffec2cbp4 0x1.700ap-14 F +REG esri:32601 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:32601 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.64p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32601 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32601 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.64p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32601 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32602 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:32602 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32602 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32602 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32602 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32603 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:32603 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.54p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32603 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32603 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.54p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32603 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32604 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:32604 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32604 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.34p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32604 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32604 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.34p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32605 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:32605 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32605 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32605 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32605 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32606 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 -0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:32606 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32606 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32606 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32606 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32607 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 -0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:32607 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.24p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32607 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p7 -0x1.4p2 0x0.0p0 F +REG esri:32607 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.24p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32607 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p7 0x1.4p2 0x0.0p0 F +REG esri:32608 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:32608 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32608 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.04p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32608 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32608 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.04p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32609 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:32609 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32609 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32609 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32609 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32610 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32610 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32610 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d800000000001p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32610 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32610 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d800000000001p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32611 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:32611 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.e8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32611 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32611 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.e8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32611 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32612 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:32612 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32612 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.a8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32612 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32612 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.a8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32613 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32613 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.b8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32613 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32613 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.b8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32613 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32614 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:32614 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32614 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.78p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32614 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32614 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.78p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32615 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 -0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32615 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32615 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32615 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32615 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32616 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32616 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32616 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32616 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32616 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.48p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32617 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32617 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32617 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32617 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32617 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32618 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:32618 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32618 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32618 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32618 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32619 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:32619 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32619 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32619 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.28p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32619 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32620 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:32620 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32620 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32620 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32620 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.d000000000001p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32621 0 OK 0x1.e848000000018p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:32621 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32621 2 OK 0x1.018fa874f5678p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32621 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32621 4 OK 0x1.018fa874f5678p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32622 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:32622 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32622 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32622 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32622 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32623 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:32623 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32623 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32623 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32623 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32624 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 -0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:32624 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32624 2 OK 0x1.018fa874f566cp20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32624 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32624 4 OK 0x1.018fa874f566cp20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32625 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 -0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:32625 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32625 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32625 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32625 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32626 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:32626 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32626 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32626 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32626 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32627 0 OK 0x1.e847fffffffeep18 0x0.0p0 0x0.0p0 -0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:32627 1 OK -0x1.ad750e9eacedp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32627 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32627 3 OK -0x1.ad750e9eacedp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ap4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32627 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32628 0 OK 0x1.e847fffffffe2p18 0x0.0p0 0x0.0p0 -0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:32628 1 OK -0x1.ad750e9eacf2p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32628 2 OK 0x1.018fa874f566ap20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.3ffffffffffffp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32628 3 OK -0x1.ad750e9eacf2p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32628 4 OK 0x1.018fa874f566ap20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.3ffffffffffffp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32629 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:32629 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.bffffffffffffp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32629 2 OK 0x1.018fa874f567p20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000003p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32629 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.bffffffffffffp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32629 4 OK 0x1.018fa874f567p20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000003p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32630 0 OK 0x1.e847fffffffefp18 0x0.0p0 0x0.0p0 -0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:32630 1 OK -0x1.ad750e9eaceap15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32630 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000003p1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32630 3 OK -0x1.ad750e9eaceap15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.ffffffffffffep2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32630 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000003p1 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32631 0 OK 0x1.e848000000011p18 0x0.0p0 0x0.0p0 0x1.8000000000001p1 0x0.0p0 0x0.0p0 T +REG esri:32631 1 OK -0x1.ad750e9eacdbp15 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000001p1 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32631 2 OK 0x1.018fa874f5675p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ffffffffffffep2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32631 3 OK -0x1.ad750e9eacdbp15 0x1.0ee35b743126ep19 0x0.0p0 -0x1.0000000000001p1 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32631 4 OK 0x1.018fa874f5675p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ffffffffffffep2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32632 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG esri:32632 1 OK -0x1.ad750e9eace1p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000002p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32632 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32632 3 OK -0x1.ad750e9eace1p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.0000000000002p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32632 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32633 0 OK 0x1.e84800000001ep18 0x0.0p0 0x0.0p0 0x1.dffffffffffffp3 0x0.0p0 0x0.0p0 T +REG esri:32633 1 OK -0x1.ad750e9eacd3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p3 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32633 2 OK 0x1.018fa874f5679p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32633 3 OK -0x1.ad750e9eacd3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p3 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32633 4 OK 0x1.018fa874f5679p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32634 0 OK 0x1.e848000000012p18 0x0.0p0 0x0.0p0 0x1.5p4 0x0.0p0 0x0.0p0 T +REG esri:32634 1 OK -0x1.ad750e9eacdbp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32634 2 OK 0x1.018fa874f5676p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32634 3 OK -0x1.ad750e9eacdbp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32634 4 OK 0x1.018fa874f5676p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32635 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.bp4 0x0.0p0 0x0.0p0 T +REG esri:32635 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32635 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32635 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32635 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32636 0 OK 0x1.e847ffffffff4p18 0x0.0p0 0x0.0p0 0x1.08p5 0x0.0p0 0x0.0p0 T +REG esri:32636 1 OK -0x1.ad750e9eace9p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp4 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32636 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32636 3 OK -0x1.ad750e9eace9p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp4 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32636 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.3p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32637 0 OK 0x1.e84800000000cp18 0x0.0p0 0x0.0p0 0x1.38p5 0x0.0p0 0x0.0p0 T +REG esri:32637 1 OK -0x1.ad750e9eacd8p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32637 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32637 3 OK -0x1.ad750e9eacd8p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32637 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32638 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.68p5 0x0.0p0 0x0.0p0 T +REG esri:32638 1 OK -0x1.ad750e9eace3p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32638 2 OK 0x1.018fa874f5672p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32638 3 OK -0x1.ad750e9eace3p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32638 4 OK 0x1.018fa874f5672p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.9p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32639 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:32639 1 OK -0x1.ad750e9eacd2p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32639 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32639 3 OK -0x1.ad750e9eacd2p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32639 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32640 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:32640 1 OK -0x1.ad750e9eacfp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32640 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32640 3 OK -0x1.ad750e9eacfp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32640 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32641 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:32641 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.d000000000001p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32641 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32641 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.d000000000001p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32641 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32642 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.14p6 0x0.0p0 0x0.0p0 T +REG esri:32642 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.0p6 -0x1.4p2 0x0.0p0 F +REG esri:32642 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.28p6 -0x1.4p2 0x0.0p0 F +REG esri:32642 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.0p6 0x1.4p2 0x0.0p0 F +REG esri:32642 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.28p6 0x1.4p2 0x0.0p0 F +REG esri:32643 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.2cp6 0x0.0p0 0x0.0p0 T +REG esri:32643 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.18p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32643 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32643 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.18p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32643 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32644 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.44p6 0x0.0p0 0x0.0p0 T +REG esri:32644 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32644 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.58p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32644 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.3p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32644 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.58p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32645 0 OK 0x1.e847fffffffb7p18 0x0.0p0 0x0.0p0 0x1.5cp6 0x0.0p0 0x0.0p0 T +REG esri:32645 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.48p6 -0x1.4p2 0x0.0p0 F +REG esri:32645 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.7p6 -0x1.4p2 0x0.0p0 F +REG esri:32645 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.48p6 0x1.4p2 0x0.0p0 F +REG esri:32645 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.7p6 0x1.4p2 0x0.0p0 F +REG esri:32646 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.74p6 0x0.0p0 0x0.0p0 T +REG esri:32646 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32646 2 OK 0x1.018fa874f5669p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.88p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32646 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32646 4 OK 0x1.018fa874f5669p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.88p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32647 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8cp6 0x0.0p0 0x0.0p0 T +REG esri:32647 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.78p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32647 2 OK 0x1.018fa874f5674p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.ap6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32647 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.78p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32647 4 OK 0x1.018fa874f5674p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.ap6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32648 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.a400000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32648 1 OK -0x1.ad750e9ead01p15 -0x1.0ee35b743126fp19 0x0.0p0 0x1.9p6 -0x1.4p2 0x0.0p0 F +REG esri:32648 2 OK 0x1.018fa874f5662p20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.b8p6 -0x1.4p2 0x0.0p0 F +REG esri:32648 3 OK -0x1.ad750e9ead01p15 0x1.0ee35b743126fp19 0x0.0p0 0x1.9p6 0x1.4p2 0x0.0p0 F +REG esri:32648 4 OK 0x1.018fa874f5662p20 0x1.0ee35b743126ep19 0x0.0p0 0x1.b8p6 0x1.4p2 0x0.0p0 F +REG esri:32649 0 OK 0x1.e848000000049p18 0x0.0p0 0x0.0p0 0x1.bcp6 0x0.0p0 0x0.0p0 T +REG esri:32649 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.a8p6 -0x1.4p2 0x0.0p0 F +REG esri:32649 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.d000000000001p6 -0x1.4p2 0x0.0p0 F +REG esri:32649 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.a8p6 0x1.4p2 0x0.0p0 F +REG esri:32649 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.d000000000001p6 0x1.4p2 0x0.0p0 F +REG esri:32650 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.d4p6 0x0.0p0 0x0.0p0 T +REG esri:32650 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.cp6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32650 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.e8p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32650 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.cp6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32650 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.e8p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32651 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.ec00000000001p6 0x0.0p0 0x0.0p0 T +REG esri:32651 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.d800000000001p6 -0x1.4p2 0x0.0p0 F +REG esri:32651 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.0p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32651 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.d800000000001p6 0x1.4p2 0x0.0p0 F +REG esri:32651 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.0p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32652 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.02p7 0x0.0p0 0x0.0p0 T +REG esri:32652 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.fp6 -0x1.4p2 0x0.0p0 F +REG esri:32652 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.0cp7 -0x1.4p2 0x0.0p0 F +REG esri:32652 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.fp6 0x1.4p2 0x0.0p0 F +REG esri:32652 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.0cp7 0x1.4p2 0x0.0p0 F +REG esri:32653 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ep7 0x0.0p0 0x0.0p0 T +REG esri:32653 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.04p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32653 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.18p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32653 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.04p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32653 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.18p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32654 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.1ap7 0x0.0p0 0x0.0p0 T +REG esri:32654 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1p7 -0x1.4p2 0x0.0p0 F +REG esri:32654 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.24p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32654 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1p7 0x1.4p2 0x0.0p0 F +REG esri:32654 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.24p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32655 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.26p7 0x0.0p0 0x0.0p0 T +REG esri:32655 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.1cp7 -0x1.4p2 0x0.0p0 F +REG esri:32655 2 OK 0x1.018fa874f5686p20 -0x1.0ee35b743126fp19 0x0.0p0 0x1.3p7 -0x1.4p2 0x0.0p0 F +REG esri:32655 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.1cp7 0x1.4p2 0x0.0p0 F +REG esri:32655 4 OK 0x1.018fa874f5686p20 0x1.0ee35b743126fp19 0x0.0p0 0x1.3p7 0x1.4p2 0x0.0p0 F +REG esri:32656 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.32p7 0x0.0p0 0x0.0p0 T +REG esri:32656 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.28p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32656 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.3cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32656 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.28p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32656 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.3cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32657 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.3ep7 0x0.0p0 0x0.0p0 T +REG esri:32657 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.34p7 -0x1.4p2 0x0.0p0 F +REG esri:32657 2 OK 0x1.018fa874f567ap20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.48p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32657 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.34p7 0x1.4p2 0x0.0p0 F +REG esri:32657 4 OK 0x1.018fa874f567ap20 0x1.0ee35b743126ep19 0x0.0p0 0x1.48p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32658 0 OK 0x1.e847fffffffcfp18 0x0.0p0 0x0.0p0 0x1.4ap7 0x0.0p0 0x0.0p0 T +REG esri:32658 1 OK -0x1.ad750e9eacf4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32658 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.54p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32658 3 OK -0x1.ad750e9eacf4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32658 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.54p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32659 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.56p7 0x0.0p0 0x0.0p0 T +REG esri:32659 1 OK -0x1.ad750e9eacddp15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.4cp7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32659 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 0x1.6p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32659 3 OK -0x1.ad750e9eacddp15 0x1.0ee35b743126ep19 0x0.0p0 0x1.4cp7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32659 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 0x1.6p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32660 0 OK 0x1.e848000000031p18 0x0.0p0 0x0.0p0 0x1.62p7 0x0.0p0 0x0.0p0 T +REG esri:32660 1 OK -0x1.ad750e9eacc4p15 -0x1.0ee35b743126ep19 0x0.0p0 0x1.58p7 -0x1.4p2 0x0.0p0 F +REG esri:32660 2 OK 0x1.018fa874f566ep20 -0x1.0ee35b743126ep19 0x0.0p0 -0x1.6400000000001p7 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32660 3 OK -0x1.ad750e9eacc4p15 0x1.0ee35b743126ep19 0x0.0p0 0x1.58p7 0x1.4p2 0x0.0p0 F +REG esri:32660 4 OK 0x1.018fa874f566ep20 0x1.0ee35b743126ep19 0x0.0p0 -0x1.6400000000001p7 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:32661 0 OK 0x1.e848p20 0x1.cd2cd7ad975ebp20 0x0.0p0 0x0.0p0 0x1.64p6 0x0.0p0 T +REG esri:32661 1 OK 0x1.72d6fc9d0d4dep20 0x1.a479f4de72c24p20 0x0.0p0 -0x1.dfffffffffffep5 0x1.54p6 0x0.0p0 T +REG esri:32661 2 OK 0x1.2edc81b179591p21 0x1.a479f4de72c24p20 0x0.0p0 0x1.dfffffffffffep5 0x1.54p6 0x0.0p0 T +REG esri:32661 3 OK 0x1.d0ce8368c99abp20 0x1.daba6bd6cbaf5p20 0x0.0p0 -0x1.dfffffffffff6p5 0x1.64p6 0x0.0p0 T +REG esri:32661 4 OK 0x1.ffc17c9736655p20 0x1.daba6bd6cbaf5p20 0x0.0p0 0x1.dfffffffffff6p5 0x1.64p6 0x0.0p0 T +REG esri:32701 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32701 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32701 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32701 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.62f75a3f3d46ap7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32701 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.56f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32702 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32702 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32702 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32702 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.6108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32702 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.4af75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32703 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32703 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32703 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32703 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.5508a5c0c2b98p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32703 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3ef75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32704 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.3ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32704 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32704 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32704 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.4908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32704 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.32f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32705 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.32p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32705 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32705 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32705 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3d08a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32705 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.26f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32706 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 -0x1.26p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32706 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32706 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32706 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3108a5c0c2b98p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32706 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.1af75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32707 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 -0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32707 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32707 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32707 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32707 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32708 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32708 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32708 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32708 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.1908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32708 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.02f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32709 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32709 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32709 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32709 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0d08a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32709 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.edeeb47e7a8d1p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32710 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32710 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32710 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32710 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32710 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.d5eeb47e7a8d3p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32711 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32711 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32711 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32711 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.ea114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32711 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32712 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32712 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32712 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32712 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.d2114b818572dp6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32712 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.a5eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32713 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 -0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32713 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32713 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32713 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.ba114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32713 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.8deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32714 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32714 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32714 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32714 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.a2114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32714 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.75eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32715 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 -0x1.74p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32715 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32715 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.5deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32715 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.8a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32715 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.5deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32716 0 OK 0x1.e848000000016p18 0x1.b997b10295082p22 0x0.0p0 -0x1.5cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32716 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.72114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32716 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.45eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32716 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.72114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32716 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.45eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32717 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32717 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32717 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32717 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.5a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32717 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32718 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32718 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32718 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32718 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.42114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32718 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.15eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32719 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32719 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32719 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32719 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32719 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.fbdd68fcf51a4p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32720 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32720 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32720 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32720 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.12114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32720 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.cbdd68fcf51a2p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32721 0 OK 0x1.e848000000016p18 0x1.b997b10295082p22 0x0.0p0 -0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32721 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32721 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32721 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.f42297030ae5cp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32721 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32722 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 -0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32722 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32722 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32722 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.c42297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32722 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.6bdd68fcf51a4p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32723 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32723 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32723 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32723 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.942297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32723 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.3bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32724 0 OK 0x1.e847ffffffff5p18 0x1.b997b10295082p22 0x0.0p0 -0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32724 1 OK -0x1.fbe5023d971p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32724 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32724 3 OK -0x1.2fd8271ec1988p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32724 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.0bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32725 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 -0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32725 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32725 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.b7bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32725 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.342297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32725 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.b7bad1f9ea347p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32726 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32726 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32726 2 OK 0x1.f8272811ecb79p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.57bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32726 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.042297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32726 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.57bad1f9ea348p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32727 0 OK 0x1.e847fffffffefp18 0x1.b997b10295082p22 0x0.0p0 -0x1.5p4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32727 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.a8452e0615cb8p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32727 2 OK 0x1.f8272811ecb73p19 0x1.97014c751fc11p22 0x0.0p0 -0x1.ef75a3f3d468fp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32727 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.a8452e0615cb9p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32727 4 OK 0x1.07218271ec18fp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.ef75a3f3d468cp3 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32728 0 OK 0x1.e847fffffffe4p18 0x1.b997b10295082p22 0x0.0p0 -0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32728 1 OK -0x1.fbe5023d9714p14 0x1.97014c751fc1p22 0x0.0p0 -0x1.48452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32728 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.2f75a3f3d468ep3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32728 3 OK -0x1.2fd8271ec19a8p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.48452e0615cbap4 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32728 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.2f75a3f3d468ep3 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32729 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 -0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32729 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.d08a5c0c2b973p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32729 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 -0x1.bdd68fcf51a36p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32729 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.d08a5c0c2b973p3 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32729 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.bdd68fcf51a38p1 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32730 0 OK 0x1.e847ffffffff1p18 0x1.b997b10295082p22 0x0.0p0 -0x1.8000000000001p1 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32730 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.108a5c0c2b97p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32730 2 OK 0x1.f8272811ecb73p19 0x1.97014c751fc11p22 0x0.0p0 0x1.42297030ae5c4p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32730 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.108a5c0c2b972p3 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32730 4 OK 0x1.07218271ec18fp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.42297030ae5cfp1 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32731 0 OK 0x1.e84800000000fp18 0x1.b997b10295082p22 0x0.0p0 0x1.8000000000001p1 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32731 1 OK -0x1.fbe5023d96e6p14 0x1.97014c751fc11p22 0x0.0p0 -0x1.42297030ae5c4p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32731 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 0x1.108a5c0c2b97p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32731 3 OK -0x1.2fd8271ec18fp16 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.42297030ae5cfp1 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32731 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.108a5c0c2b972p3 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32732 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.2p3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32732 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.bdd68fcf51a36p1 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32732 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32732 3 OK -0x1.2fd8271ec192p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.bdd68fcf51a38p1 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32732 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d08a5c0c2b973p3 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32733 0 OK 0x1.e84800000001cp18 0x1.b997b10295082p22 0x0.0p0 0x1.dffffffffffffp3 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32733 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32733 2 OK 0x1.f8272811ecb8ap19 0x1.97014c751fc1p22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32733 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2f75a3f3d468ep3 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32733 4 OK 0x1.07218271ec19ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.48452e0615cb9p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32734 0 OK 0x1.e848000000011p18 0x1.b997b10295082p22 0x0.0p0 0x1.5p4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32734 1 OK -0x1.fbe5023d96e6p14 0x1.97014c751fc11p22 0x0.0p0 0x1.ef75a3f3d468fp3 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32734 2 OK 0x1.f8272811ecb8p19 0x1.97014c751fc11p22 0x0.0p0 0x1.a8452e0615cb8p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32734 3 OK -0x1.2fd8271ec18fp16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ef75a3f3d468cp3 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32734 4 OK 0x1.07218271ec195p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a8452e0615cb9p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32735 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.bp4 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32735 1 OK -0x1.fbe5023d96f2p14 0x1.97014c751fc11p22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32735 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.042297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32735 3 OK -0x1.2fd8271ec1908p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.57bad1f9ea348p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32735 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.042297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32736 0 OK 0x1.e847ffffffff5p18 0x1.b997b10295082p22 0x0.0p0 0x1.08p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32736 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.b7bad1f9ea348p4 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32736 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.342297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32736 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.b7bad1f9ea347p4 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32736 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.342297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32737 0 OK 0x1.e84800000000bp18 0x1.b997b10295082p22 0x0.0p0 0x1.38p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32737 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32737 2 OK 0x1.f8272811ecb88p19 0x1.97014c751fc1p22 0x0.0p0 0x1.642297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32737 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32737 4 OK 0x1.07218271ec198p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.642297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32738 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.68p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32738 1 OK -0x1.fbe5023d96f8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32738 2 OK 0x1.f8272811ecb7cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.942297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32738 3 OK -0x1.2fd8271ec1928p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3bdd68fcf51a3p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32738 4 OK 0x1.07218271ec192p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.942297030ae5dp5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32739 0 OK 0x1.e848000000021p18 0x1.b997b10295082p22 0x0.0p0 0x1.98p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32739 1 OK -0x1.fbe5023d96d8p14 0x1.97014c751fc11p22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32739 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32739 3 OK -0x1.2fd8271ec18ap16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.6bdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32739 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.c42297030ae5dp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32740 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 0x1.c800000000001p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32740 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32740 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32740 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.9bdd68fcf51a3p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32740 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.f42297030ae5cp5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32741 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.f8p5 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32741 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32741 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.12114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32741 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.cbdd68fcf51a2p5 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32741 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.12114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32742 0 OK 0x1.e847fffffffbep18 0x1.b997b10295082p22 0x0.0p0 0x1.14p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32742 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32742 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.2a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32742 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.fbdd68fcf51a4p5 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32742 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2a114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32743 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 0x1.2cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32743 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32743 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.42114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32743 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.15eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32743 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.42114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32744 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.44p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32744 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32744 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.5a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32744 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32744 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.5a114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32745 0 OK 0x1.e847fffffffbep18 0x1.b997b10295082p22 0x0.0p0 0x1.5cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32745 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.45eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32745 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.72114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32745 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.45eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32745 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.72114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32746 0 OK 0x1.e847fffffffeap18 0x1.b997b10295082p22 0x0.0p0 0x1.74p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32746 1 OK -0x1.fbe5023d97p14 0x1.97014c751fc11p22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32746 2 OK 0x1.f8272811ecb6cp19 0x1.97014c751fc11p22 0x0.0p0 0x1.8a114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32746 3 OK -0x1.2fd8271ec195p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.5deeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32746 4 OK 0x1.07218271ec18ap20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.8a114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32747 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.8cp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32747 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32747 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.a2114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32747 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.75eeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32747 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a2114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32748 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 0x1.a400000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32748 1 OK -0x1.fbe5023d972cp14 0x1.97014c751fc1p22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32748 2 OK 0x1.f8272811ecb62p19 0x1.97014c751fc11p22 0x0.0p0 0x1.ba114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32748 3 OK -0x1.2fd8271ec1a1p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.8deeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32748 4 OK 0x1.07218271ec184p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ba114b818572ep6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32749 0 OK 0x1.e848000000042p18 0x1.b997b10295082p22 0x0.0p0 0x1.bcp6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32749 1 OK -0x1.fbe5023d96bp14 0x1.97014c751fc11p22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32749 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.d2114b818572dp6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32749 3 OK -0x1.2fd8271ec17d8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.a5eeb47e7a8d2p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32749 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d2114b818572dp6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32750 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.d4p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32750 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32750 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.ea114b818572ep6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32750 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.bdeeb47e7a8d2p6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32750 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.ea114b818572ep6 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32751 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.ec00000000001p6 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32751 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32751 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32751 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.d5eeb47e7a8d3p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32751 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0108a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32752 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.02p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32752 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32752 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32752 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.edeeb47e7a8d1p6 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32752 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0d08a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32753 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.0ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32753 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32753 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32753 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.02f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32753 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.1908a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32754 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.1ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32754 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32754 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32754 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.0ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32754 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.2508a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32755 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.26p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32755 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32755 2 OK 0x1.f8272811ecba1p19 0x1.97014c751fc1p22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32755 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.1af75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32755 4 OK 0x1.07218271ec1a7p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3108a5c0c2b98p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32756 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.32p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32756 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32756 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32756 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.26f75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32756 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3d08a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32757 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.3ep7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32757 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32757 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32757 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.32f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32757 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.4908a5c0c2b97p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32758 0 OK 0x1.e847fffffffd4p18 0x1.b997b10295082p22 0x0.0p0 0x1.4ap7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32758 1 OK -0x1.fbe5023d9718p14 0x1.97014c751fc1p22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32758 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32758 3 OK -0x1.2fd8271ec19cp16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.3ef75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32758 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.5508a5c0c2b98p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32759 0 OK 0x1.e848p18 0x1.b997b10295082p22 0x0.0p0 0x1.56p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32759 1 OK -0x1.fbe5023d96eep14 0x1.97014c751fc11p22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32759 2 OK 0x1.f8272811ecb77p19 0x1.97014c751fc11p22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32759 3 OK -0x1.2fd8271ec18f8p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.4af75a3f3d469p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32759 4 OK 0x1.07218271ec19p20 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.6108a5c0c2b97p7 -0x1.4000000000003p4 0x0.0p0 F +REG esri:32760 0 OK 0x1.e84800000002cp18 0x1.b997b10295082p22 0x0.0p0 0x1.62p7 -0x1.8ffffffffffffp4 0x0.0p0 F +REG esri:32760 1 OK -0x1.fbe5023d96c4p14 0x1.97014c751fc11p22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32760 2 OK 0x1.f8272811ecb8cp19 0x1.97014c751fc1p22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.dffffffffffffp4 0x0.0p0 F +REG esri:32760 3 OK -0x1.2fd8271ec184p16 0x1.dacaa07d09e1ap22 0x0.0p0 0x1.56f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32760 4 OK 0x1.07218271ec19cp20 0x1.dacaa07d09e1ap22 0x0.0p0 -0x1.62f75a3f3d469p7 -0x1.4000000000002p4 0x0.0p0 F +REG esri:32761 0 OK 0x1.e848p20 0x1.01b194293450ap21 0x0.0p0 0x0.0p0 -0x1.64p6 0x0.0p0 T +REG esri:32761 1 OK 0x1.d0ce8368c99abp20 0x1.f5d594293450bp20 0x0.0p0 -0x1.dfffffffffff6p5 -0x1.64p6 0x0.0p0 T +REG esri:32761 2 OK 0x1.ffc17c9736655p20 0x1.f5d594293450bp20 0x0.0p0 0x1.dfffffffffff6p5 -0x1.64p6 0x0.0p0 T +REG esri:32761 3 OK 0x1.72d6fc9d0d4dep20 0x1.160b0590c69eep21 0x0.0p0 -0x1.dfffffffffffep5 -0x1.54p6 0x0.0p0 T +REG esri:32761 4 OK 0x1.2edc81b179591p21 0x1.160b0590c69eep21 0x0.0p0 0x1.dfffffffffffep5 -0x1.54p6 0x0.0p0 T +REG esri:32766 0 OK 0x1.e848p18 0x1.312dp23 0x0.0p0 0x1.2p5 0x0.0p0 0x0.0p0 T +REG esri:32766 1 OK -0x1.ad750e7d8384p15 0x1.203eca48be405p23 0x0.0p0 0x1.f000000075406p4 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:32766 2 OK 0x1.018fa873ec1c2p20 0x1.203eca48be405p23 0x0.0p0 0x1.47ffffffc55fdp5 -0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:32766 3 OK -0x1.ad750e7d8384p15 0x1.421b35b741bfbp23 0x0.0p0 0x1.f000000075406p4 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:32766 4 OK 0x1.018fa873ec1c2p20 0x1.421b35b741bfbp23 0x0.0p0 0x1.47ffffffc55fdp5 0x1.3fffffffeae11p2 0x0.0p0 F +REG esri:3300 0 OK 0x1.e8484430f9dbap18 0x1.8b455dfce81d1p22 0x1.56ff8ep-2 0x1.800000000000fp4 0x1.d3674efdabe08p5 0x1.d8p-25 F +REG esri:3300 1 OK 0x1.184cb83a7c49ep18 0x1.7f432609724a4p22 0x1.46b8726p-2 0x1.4883ca5790831p4 0x1.c4e097a3ae648p5 0x1.dp-25 F +REG esri:3300 2 OK 0x1.5c21e7eb1241p19 0x1.7f43260504b8bp22 0x1.69be777p-2 0x1.b77c35a86f7f1p4 0x1.c4e097a3ae646p5 0x1.e8p-25 F +REG esri:3300 3 OK 0x1.2cb70614c31b4p18 0x1.97ebb5ce1f569p22 0x1.45649f8p-2 0x1.4883ca579082bp4 0x1.e1ee0657a9596p5 0x1.ep-25 F +REG esri:3300 4 OK 0x1.51ecc15169542p19 0x1.97ebb5c82614bp22 0x1.64f93c2p-2 0x1.b77c35a86f7ecp4 0x1.e1ee0657a9594p5 0x1.fp-25 F +REG esri:3301 0 OK 0x1.e848p18 0x1.8b455f21c74fp22 0x0.0p0 0x1.8000000000001p4 0x1.d3674efdabdfdp5 0x0.0p0 F +REG esri:3301 1 OK 0x1.184c73b0ad198p18 0x1.7f4327245fe5bp22 0x0.0p0 0x1.4883ca579082p4 0x1.c4e097a3ae63dp5 0x0.0p0 F +REG esri:3301 2 OK 0x1.5c21c627a9732p19 0x1.7f4327245fe5bp22 0x0.0p0 0x1.b77c35a86f7ep4 0x1.c4e097a3ae63dp5 0x0.0p0 F +REG esri:3301 3 OK 0x1.2cb6c13cd6657p18 0x1.97ebb6f825063p22 0x0.0p0 0x1.4883ca579082p4 0x1.e1ee0657a959p5 0x0.0p0 F +REG esri:3301 4 OK 0x1.51ec9f6194cd3p19 0x1.97ebb6f825063p22 0x0.0p0 0x1.b77c35a86f7ep4 0x1.e1ee0657a959p5 0x0.0p0 F +REG esri:3439 0 OK 0x1.e848000000024p18 0x0.0p0 0x0.0p0 0x1.98p5 0x0.0p0 0x0.0p0 T +REG esri:3439 1 OK -0x1.ad892fd8996ep15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.7p5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3439 2 OK 0x1.0190497ec4cc8p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.cp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3439 3 OK -0x1.ad892fd8996ep15 0x1.0edd047bd8483p19 0x0.0p0 0x1.7p5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3439 4 OK 0x1.0190497ec4cc8p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.cp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3440 0 OK 0x1.e847fffffffe8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p5 0x0.0p0 0x0.0p0 T +REG esri:3440 1 OK -0x1.ad892fd8998bp15 -0x1.0edd047bd8483p19 0x0.0p0 0x1.ap5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3440 2 OK 0x1.0190497ec4cb7p20 -0x1.0edd047bd8483p19 0x0.0p0 0x1.fp5 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3440 3 OK -0x1.ad892fd8998bp15 0x1.0edd047bd8483p19 0x0.0p0 0x1.ap5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3440 4 OK 0x1.0190497ec4cb7p20 0x1.0edd047bd8483p19 0x0.0p0 0x1.fp5 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3561 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555554p4 0x0.0p0 F +REG esri:3561 1 OK -0x1.4ff83707f969fp20 -0x1.b618f19830d7bp20 0x0.0p0 -0x1.4190cfacb3439p7 0x1.baaaaaaa87f97p3 0x0.0p0 F +REG esri:3561 2 OK 0x1.220e1b83fcb5p21 -0x1.b618f19830d7bp20 0x0.0p0 -0x1.2c6f30534cbc7p7 0x1.baaaaaaa87f97p3 0x0.0p0 F +REG esri:3561 3 OK -0x1.35731591943acp20 0x1.c3734ea28ceb1p20 0x0.0p0 -0x1.4190cfacc234dp7 0x1.7d5555553769ep4 0x0.0p0 F +REG esri:3561 4 OK 0x1.14cb8ac8ca1d6p21 0x1.c3734ea28ceb1p20 0x0.0p0 -0x1.2c6f30533dcb3p7 0x1.7d5555553769ep4 0x0.0p0 F +REG esri:3562 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555557p7 0x1.4555555555554p4 0x0.0p0 F +REG esri:3562 1 OK -0x1.5121896d6d1c2p20 -0x1.b58f85fd88743p20 0x0.0p0 -0x1.43ff74a32e46fp7 0x1.eaaaaaaa83204p3 0x0.0p0 F +REG esri:3562 2 OK 0x1.22a2c4b6b68f4p21 -0x1.b58f85fd88742p20 0x0.0p0 -0x1.2eab36077c63fp7 0x1.eaaaaaaa83204p3 0x0.0p0 F +REG esri:3562 3 OK -0x1.345046677a678p20 0x1.c4107059614aep20 0x0.0p0 -0x1.43ff74a33cc3bp7 0x1.9555555531d45p4 0x0.0p0 F +REG esri:3562 4 OK 0x1.143a2333bd34ep21 0x1.c4107059614afp20 0x0.0p0 -0x1.2eab36076de73p7 0x1.9555555531d44p4 0x0.0p0 F +REG esri:3563 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 0x0.0p0 F +REG esri:3563 1 OK -0x1.51cbf57e04c68p20 -0x1.b544af0ca7becp20 0x0.0p0 -0x1.46b9354850b7fp7 0x1.02aaaaaa95631p4 0x0.0p0 F +REG esri:3563 2 OK 0x1.22f7fabf02634p21 -0x1.b544af0ca7becp20 0x0.0p0 -0x1.3146cab7af481p7 0x1.02aaaaaa95631p4 0x0.0p0 F +REG esri:3563 3 OK -0x1.33aec9285a468p20 0x1.c46bb05e74385p20 0x0.0p0 -0x1.46b935485ec8p7 0x1.a2aaaaaa83702p4 0x0.0p0 F +REG esri:3563 4 OK 0x1.13e964942d234p21 0x1.c46bb05e74385p20 0x0.0p0 -0x1.3146cab7a138p7 0x1.a2aaaaaa83702p4 0x0.0p0 F +REG esri:3564 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555554p4 0x0.0p0 F +REG esri:3564 1 OK -0x1.525384cf7ea7fp20 -0x1.b506243aa85fp20 0x0.0p0 -0x1.49c5d1c731158p7 0x1.0d5555553ebc5p4 0x0.0p0 F +REG esri:3564 2 OK 0x1.233bc267bf54p21 -0x1.b506243aa85fp20 0x0.0p0 -0x1.343a2e38ceea8p7 0x1.0d5555553ebc5p4 0x0.0p0 F +REG esri:3564 3 OK -0x1.332a35bd68f68p20 0x1.c4b33f61fc159p20 0x0.0p0 -0x1.49c5d1c73eb69p7 0x1.ad5555552ac15p4 0x0.0p0 F +REG esri:3564 4 OK 0x1.13a71adeb47b4p21 0x1.c4b33f61fc159p20 0x0.0p0 -0x1.343a2e38c1497p7 0x1.ad5555552ac15p4 0x0.0p0 F +REG esri:3565 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG esri:3565 1 OK -0x1.5232b04718efdp20 -0x1.b516f2f828dd1p20 0x0.0p0 -0x1.4b17f4409c2dfp7 0x1.0aaaaaaa9468dp4 0x0.0p0 F +REG esri:3565 2 OK 0x1.232b58238c77ep21 -0x1.b516f2f828dd1p20 0x0.0p0 -0x1.3592b66a0e7cfp7 0x1.0aaaaaaa9468dp4 0x0.0p0 F +REG esri:3565 3 OK -0x1.334c91d7b4ffdp20 0x1.c4a2755ac607ep20 0x0.0p0 -0x1.4b17f440a9ecdp7 0x1.aaaaaaaa80f58p4 0x0.0p0 F +REG esri:3565 4 OK 0x1.13b848ebda7fep21 0x1.c4a2755ac607ep20 0x0.0p0 -0x1.3592b66a00be1p7 0x1.aaaaaaaa80f58p4 0x0.0p0 F +REG esri:37001 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37001 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37001 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37001 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37001 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37002 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37002 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37002 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37002 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37002 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37003 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37003 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37003 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37003 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37003 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37004 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37004 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37004 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37004 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37004 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37005 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37005 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37005 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37005 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37005 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37006 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37006 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37006 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37006 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37006 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37007 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37007 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37007 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37007 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37007 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37008 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37008 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37008 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37008 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37008 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37201 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37201 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37201 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37201 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37201 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37202 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37202 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37202 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37202 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37202 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37203 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37203 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37203 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37203 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37203 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37204 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37204 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37204 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37204 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37204 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37205 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37205 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37205 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37205 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37205 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37206 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37206 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37206 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37206 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37206 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37207 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37207 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37207 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37207 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37207 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37208 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37208 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37208 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37208 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37208 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37211 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37211 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37211 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37211 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37211 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37212 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37212 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37212 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37212 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37212 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37213 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37213 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37213 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37213 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37213 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37214 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37214 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37214 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37214 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37214 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37215 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37215 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37215 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37215 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37215 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37216 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37216 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37216 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37216 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37216 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37217 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37217 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37217 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37217 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37217 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37218 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37218 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37218 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37218 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37218 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37219 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37219 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37219 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37219 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37219 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37220 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37220 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37220 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37220 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37220 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37221 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37221 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37221 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37221 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37221 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37222 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37222 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37222 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37222 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37222 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37223 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37223 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37223 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37223 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37223 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37224 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37224 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37224 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37224 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37224 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37226 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37226 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37226 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37226 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37226 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37227 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37227 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37227 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37227 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37227 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37228 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37228 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37228 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37228 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37228 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37229 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37229 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37229 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37229 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37229 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37230 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37230 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37230 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37230 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37230 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37231 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37231 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37231 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37231 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37231 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37232 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37232 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37232 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37232 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37232 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37233 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37233 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37233 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37233 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37233 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37234 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37234 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37234 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37234 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37234 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37235 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37235 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37235 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37235 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37235 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37237 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37237 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37237 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37237 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37237 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37238 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37238 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37238 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37238 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37238 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37239 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37239 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37239 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37239 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37239 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37240 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37240 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37240 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37240 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37240 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37241 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37241 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37241 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37241 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37241 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37242 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37242 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37242 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37242 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37242 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37243 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37243 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37243 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37243 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37243 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37245 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37245 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37245 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37245 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37245 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37246 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37246 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37246 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37246 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37246 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37247 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37247 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37247 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37247 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37247 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37249 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37249 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37249 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37249 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37249 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37250 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37250 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37250 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37250 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37250 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37251 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37251 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37251 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37251 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37251 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37252 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37252 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37252 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37252 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37252 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37253 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37253 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37253 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37253 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37253 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37254 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37254 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37254 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37254 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37254 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37255 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37255 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37255 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37255 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37255 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37257 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37257 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37257 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37257 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37257 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37259 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37259 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37259 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37259 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37259 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37260 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:37260 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37260 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:37260 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:37260 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:3920 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.f8p5 0x0.0p0 0x0.0p0 T +REG esri:3920 1 OK -0x1.ad818d641b83p15 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.1p6 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3920 2 OK 0x1.01900c6b20dbbp20 -0x1.0edef72bca6f1p19 0x0.0p0 -0x1.d000000000001p5 -0x1.4p2 0x0.0p0 F +REG esri:3920 3 OK -0x1.ad818d641b83p15 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.1p6 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:3920 4 OK 0x1.01900c6b20dbbp20 0x1.0edef72bca6f1p19 0x0.0p0 -0x1.d000000000001p5 0x1.4p2 0x0.0p0 F +REG esri:3991 0 OK 0x1.e848p18 0x1.a983adb0c64ddp16 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222210dp4 0x0.0p0 F +REG esri:3991 1 OK 0x1.02ee548ba0042p17 -0x1.ee62d5986f607p17 0x0.0p0 -0x1.0df13f90a9095p6 0x1.12222222220fbp4 0x0.0p0 F +REG esri:3991 2 OK 0x1.a78c6add17ffp19 -0x1.ee62d5986f607p17 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.12222222220fbp4 0x0.0p0 F +REG esri:3991 3 OK 0x1.0b14f5f819376p17 0x1.ce06e29ce37d5p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.322222222210ep4 0x0.0p0 F +REG esri:3991 4 OK 0x1.a582c281f9b22p19 0x1.ce06e29ce37d5p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.322222222210ep4 0x0.0p0 F +REG esri:3992 0 OK 0x1.e848p18 0x1.9811d6d86326ep17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222210dp4 0x0.0p0 F +REG esri:3992 1 OK 0x1.02ee548ba0042p17 -0x1.2b12d5986f607p17 0x0.0p0 -0x1.0df13f90a9095p6 0x1.12222222220fbp4 0x0.0p0 F +REG esri:3992 2 OK 0x1.a78c6add17ffp19 -0x1.2b12d5986f607p17 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.12222222220fbp4 0x0.0p0 F +REG esri:3992 3 OK 0x1.0b14f5f819376p17 0x1.17d7714e71beap19 0x0.0p0 -0x1.0df13f90a9095p6 0x1.322222222210ep4 0x0.0p0 F +REG esri:3992 4 OK 0x1.a582c281f9b22p19 0x1.17d7714e71beap19 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.322222222210ep4 0x0.0p0 F +REG esri:4001 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4001 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4001 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4001 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4001 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4002 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4002 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4002 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4002 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4002 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4003 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4003 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4003 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4003 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4003 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4004 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4004 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4004 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4004 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4004 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4005 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4005 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4005 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4005 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4005 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4006 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4006 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4006 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4006 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4006 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4007 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4007 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4007 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4007 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4007 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4008 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4008 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4008 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4008 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4008 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4009 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4009 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4009 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4009 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4009 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4010 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4010 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4010 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4010 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4010 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4011 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4011 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4011 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4011 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4011 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4012 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4012 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4012 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4012 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4012 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4013 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4013 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4013 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4013 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4013 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4014 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4014 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4014 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4014 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4014 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4015 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4015 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4015 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4015 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4015 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4016 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4016 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4016 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4016 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4016 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4018 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4018 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4018 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4018 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4018 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4019 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4019 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4019 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4019 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4019 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4020 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4020 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4020 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4020 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4020 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4021 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4021 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4021 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4021 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4021 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4022 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4022 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4022 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4022 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4022 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4023 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4023 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4023 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4023 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4023 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4024 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4024 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4024 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4024 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4024 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4025 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4025 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4025 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4025 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4025 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4027 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4027 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4027 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4027 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4027 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4028 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4028 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4028 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4028 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4028 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4029 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4029 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4029 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4029 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4029 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4030 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4030 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4030 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4030 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4030 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4031 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4031 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4031 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4031 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4031 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4032 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4032 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4032 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4032 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4032 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4033 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4033 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4033 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4033 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4033 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4034 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4034 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4034 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4034 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4034 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4035 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4035 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4035 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4035 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4035 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4036 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4036 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4036 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4036 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4036 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4041 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4041 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4041 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4041 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4041 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4042 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4042 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4042 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4042 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4042 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4043 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4043 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4043 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4043 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4043 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4044 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4044 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4044 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4044 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4044 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4045 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4045 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4045 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4045 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4045 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4047 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4047 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4047 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4047 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4047 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4120 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4120 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4120 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4120 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4120 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4121 0 OK -0x1.603b5ae1ee4e1p-11 -0x1.2453f7c9b116fp-9 0x1.8fc01f4028p7 0x0.0p0 0x1.2f74bf1dcfcaep-62 0x0.0p0 T +REG esri:4121 1 OK -0x1.40086ef74eee8p2 -0x1.4021be6bdfa7p2 0x1.c4b0256a78p7 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4121 2 OK 0x1.3ff26b65f6d1cp2 -0x1.4021e9884bd96p2 0x1.aab6f4c3dp7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4121 3 OK -0x1.40086ef74eee8p2 0x1.3fd8f20de4617p2 0x1.6eb6a4e3ap7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4121 4 OK 0x1.3ff26b65f6d1cp2 0x1.3fd91d209cc9bp2 0x1.54bd68b098p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG esri:4122 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4122 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4122 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4122 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4122 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4123 0 OK 0x1.46503b72d66f3p-10 0x1.2a930203526b9p-10 -0x1.521277a43p7 -0x1.49f3dfba26e18p-30 0x1.9025c774b0a5ap-28 0x1.69948p-13 T +REG esri:4123 1 OK -0x1.3fec0ab724d6p2 -0x1.3fed1324b0599p2 -0x1.7949f6f428p7 -0x1.40000003706fp2 -0x1.3ffffffbd1df3p2 0x1.fd88p-14 F +REG esri:4123 2 OK 0x1.40119b7c2ba87p2 -0x1.3ff01a2bdeb39p2 -0x1.546a65bfap7 0x1.40000000d7e2ep2 -0x1.3ffffffbcd3edp2 0x1.37ffp-14 F +REG esri:4123 3 OK -0x1.3fe8d580c0bf3p2 0x1.40158495d7aap2 -0x1.4fb0da8dfp7 -0x1.4000000349ae6p2 0x1.4000000807c92p2 0x1.67178p-12 F +REG esri:4123 4 OK 0x1.4014d862fd4b9p2 0x1.40120347ab05fp2 -0x1.2ade7e8aa8p7 0x1.40000000ce79ep2 0x1.4000000820725p2 0x1.37e1cp-12 F +REG esri:4124 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4124 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4124 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4124 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4124 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4125 0 OK -0x1.93a5d93684ad9p-8 -0x1.af27cebbffdffp-12 0x1.1e2a5e7facp10 0x1.2d6cb2018702p-60 0x0.0p0 -0x1.0p-29 T +REG esri:4125 1 OK -0x1.405fb25fff7f6p2 -0x1.3fff06e5c9603p2 0x1.2d24e086aep10 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4125 2 OK 0x1.3f95e0bd3f73ap2 -0x1.400091f249b39p2 0x1.0f6111371dp10 0x1.4p2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4125 3 OK -0x1.405fb25fff7f6p2 0x1.3ff19b1170a5ap2 0x1.2b29aa0562p10 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4125 4 OK 0x1.3f95e0bd3f73ap2 0x1.3ff3260d8b162p2 0x1.0d65d8453dp10 0x1.3ffffffffffffp2 0x1.4000000000002p2 -0x1.0p-29 F +REG esri:4126 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4126 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4126 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4126 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4126 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4127 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4127 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4127 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4127 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4127 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4128 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4128 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4128 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4128 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4128 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4129 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4129 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4129 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4129 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4129 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4130 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4130 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4130 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4130 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4130 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4131 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4131 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4131 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4131 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4131 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4132 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4132 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4132 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4132 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4132 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4133 0 OK 0x1.c8a1813a687fdp-18 0x1.aa982dade342bp-20 0x1.18ef9fp-5 0x1.0a60938e855efp-47 0x1.8715205d8465dp-43 0x1.0p-27 T +REG esri:4133 1 OK -0x1.3fffe57da803dp2 -0x1.3ffff7d350ce3p2 -0x1.d172a9p-6 -0x1.4000000000024p2 -0x1.3ffffffffff62p2 0x1.4p-28 F +REG esri:4133 2 OK 0x1.40001ae08600ep2 -0x1.3ffffb413ff5ep2 0x1.0caa878p-4 0x1.4000000000036p2 -0x1.3ffffffffff65p2 0x1.4p-28 F +REG esri:4133 3 OK -0x1.3fffe1cb3ec93p2 0x1.400008d891c66p2 0x1.fd48fp-9 -0x1.4000000000022p2 0x1.40000000000e6p2 0x1.8p-27 F +REG esri:4133 4 OK 0x1.40001e90393d6p2 0x1.400004cb0649ap2 0x1.90793c4p-4 0x1.4000000000031p2 0x1.40000000000e4p2 0x1.8p-27 F +REG esri:4134 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4134 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4134 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4134 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4134 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4135 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4135 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4135 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4135 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4135 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4136 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4136 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4136 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4136 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4136 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4137 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4137 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4137 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4137 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4137 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4138 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4138 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4138 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4138 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4138 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4139 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4139 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4139 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4139 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4139 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4140 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4140 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4140 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4140 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4140 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4141 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4141 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4141 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4141 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4141 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4142 0 OK -0x1.f339859fa5f9ap-12 -0x1.14cf6116cc35ap-8 0x1.9beaf9d68p3 0x0.0p0 -0x1.c72f1eacb7b03p-60 0x1.0p-30 T +REG esri:4142 1 OK -0x1.400630d09b203p2 -0x1.404c3a62470c4p2 0x1.df01aap5 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4142 2 OK 0x1.3ff6971e45aecp2 -0x1.404c58f44bf26p2 0x1.9561b320ep5 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4142 3 OK -0x1.400630d09b203p2 0x1.3fc25c517b64ap2 -0x1.588edfbf4p4 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG esri:4142 4 OK 0x1.3ff6971e45aecp2 0x1.3fc27ad67a783p2 -0x1.ebcf497fcp4 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4143 0 OK -0x1.f33986dacdc7p-12 -0x1.14af842443189p-8 0x1.943cc4e6p3 0x1.2d6cb2018701ep-63 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG esri:4143 1 OK -0x1.4006319b249eep2 -0x1.404c333d5a489p2 0x1.dcf45cdbep5 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4143 2 OK 0x1.3ff697e8c567ap2 -0x1.404c51cf5ea8cp2 0x1.935465caep5 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4143 3 OK -0x1.4006319b249eep2 0x1.3fc2650b31c9ep2 -0x1.5c138a46p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4143 4 OK 0x1.3ff697e8c567ap2 0x1.3fc2839031d74p2 -0x1.ef53f45bcp4 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4144 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4144 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4144 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4144 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4144 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4145 0 OK -0x1.91865895a07ffp-8 -0x1.11d16ce1beb9dp-9 0x1.14661a38eep9 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4145 1 OK -0x1.4068059584ad1p2 -0x1.402041a3089fep2 0x1.3c73edd0a6p9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4145 2 OK 0x1.3f9f43bc3e078p2 -0x1.4021cacb3bd26p2 0x1.013c830492p9 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4145 3 OK -0x1.4068059584ad1p2 0x1.3fdc1172cb74bp2 0x1.28520095d6p9 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4145 4 OK 0x1.3f9f43bc3e078p2 0x1.3fdd9a481d6ap2 0x1.da34fa402cp8 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4146 0 OK -0x1.b151613609a8p-8 -0x1.30a3538716c6cp-9 0x1.0f72c665eep9 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG esri:4146 1 OK -0x1.40701fcf3b8c7p2 -0x1.40242fea89a4bp2 0x1.3b067a2612p9 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4146 2 OK 0x1.3f97788cb1233p2 -0x1.4025d83998656p2 0x1.f63d75852cp8 0x1.3fffffffffffep2 -0x1.4p2 0x1.0p-29 F +REG esri:4146 3 OK -0x1.40701fcf3b8c7p2 0x1.3fd852f0a62e7p2 0x1.24a072c42cp9 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4146 4 OK 0x1.3f97788cb1233p2 0x1.3fd9fadc326c3p2 0x1.c9712b8864p8 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4147 0 OK 0x1.fe28e367cce94p-11 0x1.27d2374535bd8p-11 -0x1.69f480e8ep6 0x1.2d6cb2018701dp-62 0x1.2f74bf1dcfcadp-64 0x1.0p-29 T +REG esri:4147 1 OK -0x1.3fefd519f8779p2 -0x1.3ff69e670e28ep2 -0x1.a5f049ac2p6 -0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG esri:4147 2 OK 0x1.400fb77318d24p2 -0x1.3ff65ffe390f4p2 -0x1.5ab352c42p6 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4147 3 OK -0x1.3fefd519f8779p2 0x1.4009092d785abp2 -0x1.7a7002b51p6 -0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4147 4 OK 0x1.400fb77318d24p2 0x1.4008cac115201p2 -0x1.2f3314437p6 0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG esri:4148 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4148 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4148 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4148 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4148 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4149 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4149 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4149 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4149 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4149 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4150 0 OK -0x1.1baba8131e01cp-13 -0x1.e08736809a2e5p-9 0x1.05ef9a09cp6 0x0.0p0 0x1.c72f1eacb7b05p-60 0x0.0p0 T +REG esri:4150 1 OK -0x1.400ae6839397fp2 -0x1.4042c93701686p2 0x1.aaf7e8533p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4150 2 OK 0x1.400677dc926d7p2 -0x1.4042d1e6338fap2 0x1.a082728a1p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4150 3 OK -0x1.400ae6839397fp2 0x1.3fcb1ed161ab5p2 0x1.20a3206f4p5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 -0x1.0p-29 F +REG esri:4150 4 OK 0x1.400677dc926d7p2 0x1.3fcb277d5db2ap2 0x1.0bb82592cp5 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4151 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4151 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4151 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4151 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4151 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4152 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4152 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4152 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4152 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4152 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4153 0 OK 0x1.72e2c1c6dbc22p-10 0x1.780d21a0e709dp-10 -0x1.d576dafacp6 -0x1.2d6cb2018702p-62 0x0.0p0 -0x1.0p-29 T +REG esri:4153 1 OK -0x1.3fe7197c99846p2 -0x1.3fe9639d049d7p2 -0x1.22609db468p7 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4153 2 OK 0x1.401575880f14ap2 -0x1.3fe908e232968p2 -0x1.d75bc7ffep6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4153 3 OK -0x1.3fe7197c99846p2 0x1.40183692081ccp2 -0x1.d62815cbbp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4153 4 OK 0x1.401575880f14ap2 0x1.4017dbca11993p2 -0x1.68c2c1abfp6 0x1.3fffffffffffep2 0x1.4p2 0x1.0p-29 F +REG esri:4154 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4154 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4154 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4154 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4154 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4155 0 OK -0x1.5c8484977769cp-12 -0x1.2600637565001p-10 -0x1.d32dca1bcp4 0x1.2d6cb2018701fp-64 0x0.0p0 -0x1.0p-30 T +REG esri:4155 1 OK -0x1.400460718b9a7p2 -0x1.401a284bf8773p2 -0x1.a52fe162p3 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4155 2 OK 0x1.3ff97c5f7a8a2p2 -0x1.401a3da02fe93p2 -0x1.396443188p4 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4155 3 OK -0x1.400460718b9a7p2 0x1.3ff58cca38a0ep2 -0x1.163af41bep5 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4155 4 OK 0x1.3ff97c5f7a8a2p2 0x1.3ff5a21c06156p2 -0x1.49a128ce2p5 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4156 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4156 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4156 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4156 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4156 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4157 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4157 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4157 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4157 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4157 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4158 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4158 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4158 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4158 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4158 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4159 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4159 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4159 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4159 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4159 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4160 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4160 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4160 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4160 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4160 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4161 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4161 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4161 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4161 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4161 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4162 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4162 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4162 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4162 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4162 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4163 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4163 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4163 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4163 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4163 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4164 0 OK 0x1.44f832235f9b7p-10 -0x1.3dad2c9c2b4d4p-11 -0x1.fff86f1bp4 0x0.0p0 -0x1.2f74bf1dcfcaep-63 0x1.0p-30 T +REG esri:4164 1 OK -0x1.3feab6179f094p2 -0x1.4008ff46f3999p2 -0x1.35e7b9bp5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4164 2 OK 0x1.401354da71bd9p2 -0x1.4008afc0486cp2 -0x1.d8ccd4fe8p3 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4164 3 OK -0x1.3feab6179f094p2 0x1.3ff5382bcf15ap2 -0x1.9355ca5aep5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4164 4 OK 0x1.401354da71bd9p2 0x1.3ff4e8aa010ep2 -0x1.a7425d838p4 0x1.3ffffffffffffp2 0x1.3fffffffffffcp2 0x1.0p-28 F +REG esri:4165 0 OK -0x1.29e25a649e244p-9 -0x1.000a9968dfc76p-12 -0x1.37facd8e4p6 0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-65 0x0.0p0 T +REG esri:4165 1 OK -0x1.402301c5cf5b6p2 -0x1.4003d15c1c53fp2 -0x1.b262c996ep5 -0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4165 2 OK 0x1.3fd889aa499ebp2 -0x1.400463262837dp2 -0x1.88eb89796p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4165 3 OK -0x1.402301c5cf5b6p2 0x1.3ffbd8fc7a78ep2 -0x1.d8097ee7cp5 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4165 4 OK 0x1.3fd889aa499ebp2 0x1.3ffc6ac2ee6dap2 -0x1.9bbeecaffp6 0x1.4p2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4166 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4166 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4166 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4166 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4166 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4167 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4167 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4167 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4167 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4167 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4168 0 OK -0x1.2d6a49b0478fcp-12 -0x1.7db2ce6925b6fp-9 0x1.2010ec58cp5 -0x1.2d6cb2018701dp-64 -0x1.2f74bf1dcfcadp-61 0x1.0p-29 T +REG esri:4168 1 OK -0x1.400225aeba9c6p2 -0x1.40312071ff481p2 0x1.0a503c761p6 -0x1.3fffffffffffdp2 -0x1.4p2 0x0.0p0 F +REG esri:4168 2 OK 0x1.3ff8ba6bf945p2 -0x1.403132e535b32p2 0x1.e82cac2e6p5 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4168 3 OK -0x1.400225aeba9c6p2 0x1.3fd2129603817p2 0x1.4e5de9bc8p3 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4168 4 OK 0x1.3ff8ba6bf945p2 0x1.3fd22503ce3c5p2 0x1.391c9f13p2 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4169 0 OK -0x1.15deebc1405cp-10 -0x1.f8ff9a85bbf82p-9 0x1.6cec5e80ap5 -0x1.2d6cb2018701ep-63 -0x1.2f74bf1dcfcaep-60 0x1.0p-30 T +REG esri:4169 1 OK -0x1.400fe2be2f61ap2 -0x1.40435e364e6ffp2 0x1.77ac7afb4p6 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4169 2 OK 0x1.3fed271a4736ap2 -0x1.4043a243df9b9p2 0x1.25b6bbf12p6 0x1.4000000000001p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4169 3 OK -0x1.400fe2be2f61ap2 0x1.3fc59bda104fdp2 0x1.3a85e27c8p4 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4169 4 OK 0x1.3fed271a4736ap2 0x1.3fc5dfcd2f161p2 -0x1.aa42b048p-1 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4170 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4170 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4170 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4170 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4170 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4171 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4171 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4171 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4171 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4171 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4172 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4172 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4172 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4172 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4172 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4173 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4173 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4173 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4173 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4173 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4174 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4174 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4174 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4174 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4174 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4175 0 OK -0x1.2d6ba1757cecdp-15 -0x1.def004ea1bfd6p-11 -0x1.824e9df14p4 0x1.c4230b024a83p-67 0x1.2f74bf1dcfcafp-63 -0x1.0p-29 T +REG esri:4175 1 OK -0x1.3fff74a25a30dp2 -0x1.4016bc121531ap2 -0x1.a0807205p3 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4175 2 OK 0x1.3ffe4738ace6ap2 -0x1.4016be6059d3p2 -0x1.b6ba75548p3 0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:4175 3 OK -0x1.3fff74a25a30dp2 0x1.3ff8ead468a6cp2 -0x1.e9f70efa4p4 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4175 4 OK 0x1.3ffe4738ace6ap2 0x1.3ff8ed2276dd3p2 -0x1.f51412a7cp4 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4176 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4176 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4176 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4176 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4176 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4178 0 OK 0x1.2b1e1c0cdbd0dp-10 0x1.990c4ef725e15p-11 -0x1.16072eadfp7 0x1.d9d063f22ff54p-38 0x1.f028c71ed136dp-39 0x1.8f68p-17 T +REG esri:4178 1 OK -0x1.3feda19016932p2 -0x1.3ff3a3213a367p2 -0x1.3b70750e5p7 -0x1.3ffffffffb258p2 -0x1.3ffffffffd816p2 0x1.8348p-17 F +REG esri:4178 2 OK 0x1.4013010e991ddp2 -0x1.3ff3605a45b24p2 -0x1.10b8b6e588p7 0x1.4000000000ep2 -0x1.3fffffffff876p2 0x1.90f8p-17 F +REG esri:4178 3 OK -0x1.3fed991df2f87p2 0x1.400d1e9c73704p2 -0x1.1aafb7342p7 -0x1.3ffffffffd373p2 0x1.40000000017c7p2 0x1.8cc8p-17 F +REG esri:4178 4 OK 0x1.401300ada6d07p2 0x1.400cd3a27ed3cp2 -0x1.dff021706p6 0x1.3ffffffffec73p2 0x1.3fffffffff59fp2 0x1.908p-17 F +REG esri:4179 0 OK 0x1.1bc4c5c3db0bcp-10 0x1.62023425111ap-11 -0x1.101493e1e8p7 -0x1.c24dfe84eef62p-36 0x1.c3ad39d112cdcp-32 0x1.c1aap-14 T +REG esri:4179 1 OK -0x1.3fee8e2f9cd32p2 -0x1.3ff5a5f738f2fp2 -0x1.365e444e98p7 -0x1.400000000d439p2 -0x1.3fffffff7f9b2p2 0x1.a11fp-14 F +REG esri:4179 2 OK 0x1.40124eec134e3p2 -0x1.3ff5081ba6528p2 -0x1.0374db6bfp7 0x1.3ffffffffc89fp2 -0x1.3fffffff7cf56p2 0x1.9c26p-14 F +REG esri:4179 3 OK -0x1.3feed5abfaedep2 0x1.400b66bd9a141p2 -0x1.1bc62d9b48p7 -0x1.4000000008b2ap2 0x1.400000005a4e3p2 0x1.e1fap-14 F +REG esri:4179 4 OK 0x1.40120590eae8cp2 0x1.400b5ba552806p2 -0x1.d1b749c6fp6 0x1.3ffffffffdb51p2 0x1.400000005d616p2 0x1.deb2p-14 F +REG esri:4180 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4180 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4180 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4180 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4180 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4181 0 OK -0x1.c7fd90c601a42p-11 -0x1.e766325b9e82fp-12 -0x1.e5ee4c9f6p5 -0x1.bd2735083b2b7p-30 0x1.9abe36a10f117p-30 0x1.37053p-9 T +REG esri:4181 1 OK -0x1.400bb4453cef4p2 -0x1.4007982e086cbp2 -0x1.fd9567498p5 -0x1.40000001a7095p2 -0x1.3ffffffe7e47ep2 0x1.37643p-9 F +REG esri:4181 2 OK 0x1.3fef872551674p2 -0x1.40074c419cdaep2 -0x1.0850132b9p6 0x1.3ffffffc40f0dp2 -0x1.3ffffffc936cap2 0x1.2a92dp-9 F +REG esri:4181 3 OK -0x1.400bd334cc1fp2 0x1.3ff8187a3a874p2 -0x1.c7a25f532p5 -0x1.3fffffffa78a7p2 0x1.3fffffffabd75p2 0x1.3a2f8p-9 F +REG esri:4181 4 OK 0x1.3fef00affd297p2 0x1.3ff8743068c5ap2 -0x1.daa7c1d2cp5 0x1.3ffffffe34137p2 0x1.40000001b1b91p2 0x1.36b6ep-9 F +REG esri:4182 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4182 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4182 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4182 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4182 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4183 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4183 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4183 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4183 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4183 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4184 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4184 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4184 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4184 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4184 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4185 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4185 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4185 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4185 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4185 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4188 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4188 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4188 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4188 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4188 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4189 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4189 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4189 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4189 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4189 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4190 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4190 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4190 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4190 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4190 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4191 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4191 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4191 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4191 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4191 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4192 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4192 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4192 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4192 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4192 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4193 0 OK 0x1.65777d1555bdfp-10 0x1.88a291a2accb5p-12 -0x1.4a626c65cp5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4193 1 OK -0x1.3fe8bef55dc23p2 -0x1.40021c5ca4dc2p2 -0x1.bfd46078ap5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4193 2 OK 0x1.40156d9acb84dp2 -0x1.4001c4e17a034p2 -0x1.d9e8427f4p4 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4193 3 OK -0x1.3fe8bef55dc23p2 0x1.400e553ff6fdap2 -0x1.861783b5cp5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4193 4 OK 0x1.40156d9acb84dp2 0x1.400dfdc17da1dp2 -0x1.666ea8764p4 0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4194 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4194 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4194 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4194 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4194 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4195 0 OK -0x1.9d7d1071d0307p-9 0x1.e6069d7784426p-11 -0x1.6029f9d23cp8 -0x1.9acfbf0e976cep-45 0x0.0p0 0x1.a0ap-14 T +REG esri:4195 1 OK -0x1.4035096232db2p2 -0x1.3ff432796e851p2 -0x1.4b4daef7bcp8 -0x1.4000000000034p2 -0x1.3fffffffea8ffp2 0x1.9d77p-14 F +REG esri:4195 2 OK 0x1.3fcdaabec986p2 -0x1.3ff4ee4f77d58p2 -0x1.83e9edb0a8p8 0x1.3ffffffffffdp2 -0x1.3fffffffea9p2 0x1.9d74p-14 F +REG esri:4195 3 OK -0x1.4035096232db2p2 0x1.401274a9f4251p2 -0x1.396f8fe4dcp8 -0x1.4000000000035p2 0x1.3fffffffea8fep2 0x1.9d78p-14 F +REG esri:4195 4 OK 0x1.3fcdaabec986p2 0x1.40133091920e1p2 -0x1.720bc42744p8 0x1.3ffffffffffdp2 0x1.3fffffffea8fep2 0x1.9d74p-14 F +REG esri:4196 0 OK -0x1.045019453c7ep-8 0x1.09879fc3c0147p-15 -0x1.94519db45p7 -0x1.06bdd67b5640cp-44 0x1.2f74bf1dbb5b8p-68 0x1.a0a3p-14 T +REG esri:4196 1 OK -0x1.40407f33eb03p2 -0x1.4000c716d4354p2 -0x1.4bd193186p7 -0x1.400000000004p2 -0x1.3fffffffea8fap2 0x1.9d7bp-14 F +REG esri:4196 2 OK 0x1.3fbe57f361f11p2 -0x1.4001b7622d5fbp2 -0x1.dca3e951e8p7 0x1.3ffffffffffbdp2 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:4196 3 OK -0x1.40407f33eb03p2 0x1.4001cf9632f65p2 -0x1.4a99340b5p7 -0x1.400000000004p2 0x1.3fffffffea8fbp2 0x1.9d7cp-14 F +REG esri:4196 4 OK 0x1.3fbe57f361f11p2 0x1.4002bfe250b1p2 -0x1.db6b895afp7 0x1.3ffffffffffbep2 0x1.3fffffffea8fbp2 0x1.9d7ap-14 F +REG esri:4197 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4197 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4197 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4197 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4197 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4198 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4198 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4198 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4198 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4198 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4199 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4199 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4199 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4199 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4199 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4200 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4200 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4200 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4200 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4200 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4201 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4201 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4201 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4201 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4201 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4202 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4202 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4202 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4202 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4202 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4203 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4203 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4203 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4203 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4203 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4204 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4204 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4204 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4204 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4204 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4205 0 OK 0x1.7fd7c114bbfc5p-10 -0x1.aabb57249837p-12 -0x1.03fdb41c6p6 0x0.0p0 -0x1.2f74bf1dcfcaep-63 0x0.0p0 T +REG esri:4205 1 OK -0x1.3fe774eaa8dep2 -0x1.400633e7b0362p2 -0x1.2e4cec6a9p6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4205 2 OK 0x1.40176f9301cebp2 -0x1.4005d5f96cdffp2 -0x1.7a2a57508p5 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4205 3 OK -0x1.3fe774eaa8dep2 0x1.3ff8eb4af766cp2 -0x1.4dad27601p6 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4205 4 OK 0x1.40176f9301cebp2 0x1.3ff88d608fe05p2 -0x1.b8eabadc8p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4206 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4206 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4206 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4206 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4206 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4207 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4207 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4207 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4207 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4207 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4208 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4208 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4208 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4208 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4208 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4209 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4209 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4209 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4209 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4209 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4210 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4210 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4210 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4210 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4210 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4211 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4211 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4211 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4211 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4211 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4212 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4212 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4212 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4212 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4212 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4213 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4213 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4213 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4213 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4213 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4214 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4214 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4214 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4214 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4214 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4215 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4215 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4215 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4215 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4215 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4216 0 OK -0x1.f59567f8c8cabp-10 -0x1.5ee4ad4ce0b2ap-9 0x1.ce23f036p1 0x1.2d6cb2018702p-61 0x1.2f74bf1dcfcafp-61 -0x1.0p-29 T +REG esri:4216 1 OK -0x1.401e687b81ac4p2 -0x1.40309cfb42cb2p2 0x1.89336df6ep5 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4216 2 OK 0x1.3fdfb6369fa4p2 -0x1.403117cc00adbp2 0x1.853c8e35p3 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4216 3 OK -0x1.401e687b81ac4p2 0x1.3fd93b12f7343p2 -0x1.397eb9acp1 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4216 4 OK 0x1.3fdfb6369fa4p2 0x1.3fd9b5c2893d6p2 -0x1.3b7cd3f38p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4217 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4217 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4217 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4217 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4217 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4218 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4218 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4218 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4218 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4218 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4219 0 OK -0x1.86e2f0764e135p-8 0x1.c7259e7d71c5bp-12 0x1.18f84db4c8p10 0x1.2d6cb2018701fp-60 0x0.0p0 -0x1.0p-30 T +REG esri:4219 1 OK -0x1.405cc62befb04p2 -0x1.3ff1862562bcep2 0x1.257b234bd8p10 -0x1.4p2 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:4219 2 OK 0x1.3f9955f3741adp2 -0x1.3ff304a4e3bdfp2 0x1.08a8384213p10 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4219 3 OK -0x1.405cc62befb04p2 0x1.3fffb1295c929p2 0x1.2792931694p10 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4219 4 OK 0x1.3f9955f3741adp2 0x1.40012fb9a0f7p2 0x1.0abfaa8b4ep10 0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG esri:4220 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4220 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4220 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4220 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4220 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4221 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4221 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4221 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4221 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4221 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4222 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4222 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4222 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4222 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4222 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4223 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4223 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4223 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4223 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4223 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4224 0 OK -0x1.0da0c7fbb899cp-9 0x1.13025617e0758p-12 -0x1.d3fbb8f35p6 0x0.0p0 0x1.2f74bf1dcfcaep-65 0x0.0p0 T +REG esri:4224 1 OK -0x1.401ffa27a70dap2 -0x1.3ffc14c2b0a76p2 -0x1.8fde6d1bep6 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG esri:4224 2 OK 0x1.3fdc926543f81p2 -0x1.3ffc98b58d24ap2 -0x1.1776b19fc8p7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4224 3 OK -0x1.401ffa27a70dap2 0x1.4004a4496f222p2 -0x1.7ba60cafap6 -0x1.3fffffffffffep2 0x1.4p2 -0x1.0p-29 F +REG esri:4224 4 OK 0x1.3fdc926543f81p2 0x1.4005283fc9fc2p2 -0x1.0d5a7d4108p7 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4225 0 OK -0x1.9506b5e1c7491p-10 0x1.c72eae3f47388p-15 -0x1.67fb3ea2cp5 0x0.0p0 0x1.2f74bf1dcfcaep-67 0x0.0p0 T +REG esri:4225 1 OK -0x1.4016a9388a1fp2 -0x1.3ffe9d23663c2p2 -0x1.f75dcde54p4 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4225 2 OK 0x1.3fe408b5581c9p2 -0x1.3fff003e9a917p2 -0x1.ea9d8bbf8p5 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4225 3 OK -0x1.4016a9388a1fp2 0x1.4000628d84537p2 -0x1.e6a1f38a8p4 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4225 4 OK 0x1.3fe408b5581c9p2 0x1.4000c5a943a3p2 -0x1.e23f9bfc2p5 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4226 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4226 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4226 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4226 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4226 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4227 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4227 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4227 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4227 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4227 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4228 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4228 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4228 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4228 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4228 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4229 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4229 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4229 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4229 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4229 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4230 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4230 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4230 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4230 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4230 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4231 0 OK 0x1.9ce0585e7f3fep-11 0x1.117c96ae53759p-10 -0x1.4c066ed5f8p7 0x1.c3e832bbc83b7p-34 0x1.26f671eb003cp-32 0x1.b6fcp-16 T +REG esri:4231 1 OK -0x1.3ff1d306e69b9p2 -0x1.3ff0904b5ac39p2 -0x1.70852d70e8p7 -0x1.3fffffffea6acp2 -0x1.3fffffffb9832p2 0x1.445cp-16 F +REG esri:4231 2 OK 0x1.400c0740eea6dp2 -0x1.3fefef1238e8p2 -0x1.4de44a5dp7 0x1.4000000025cd4p2 -0x1.3fffffffbc671p2 0x1.8af4p-16 F +REG esri:4231 3 OK -0x1.3ff23c1340d9dp2 0x1.401236205f88cp2 -0x1.49ea8e35ep7 -0x1.3fffffffed1p2 0x1.400000004df2cp2 0x1.f468p-16 F +REG esri:4231 4 OK 0x1.400ba382d3af9p2 0x1.4012646cfc432p2 -0x1.27480f6b28p7 0x1.4000000020f01p2 0x1.400000004957dp2 0x1.191p-15 F +REG esri:4232 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4232 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4232 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4232 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4232 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4233 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4233 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4233 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4233 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4233 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4234 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4234 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4234 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4234 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4234 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4235 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4235 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4235 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4235 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4235 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4236 0 OK 0x1.432cc98f5eb42p-8 0x1.e13a4e9bb8789p-10 0x1.8206e16ed4p8 0x0.0p0 0x0.0p0 -0x1.0p-30 T +REG esri:4236 1 OK -0x1.3fa7019c69c83p2 -0x1.3fdcce5ff985bp2 0x1.3c86e0de58p8 -0x1.3fffffffffffdp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4236 2 OK 0x1.404896fc0ed7ap2 -0x1.3fdb923779a88p2 0x1.9bd9bb6b88p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4236 3 OK -0x1.3fa7019c69c83p2 0x1.4018ba05bbc65p2 0x1.5fe8eba0bp8 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x1.0p-28 F +REG esri:4236 4 OK 0x1.404896fc0ed7ap2 0x1.40177da29e874p2 0x1.bf3ba34b74p8 0x1.3fffffffffffdp2 0x1.4p2 0x0.0p0 F +REG esri:4237 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4237 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4237 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4237 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4237 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4238 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4238 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4238 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4238 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4238 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4239 0 OK -0x1.e4887050e9c76p-8 -0x1.626b37ac3232ep-9 0x1.41db8a32dp9 0x0.0p0 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:4239 1 OK -0x1.407bec49f74b6p2 -0x1.4029483e9e9cep2 0x1.72be9e3186p9 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4239 2 OK 0x1.3f89a9a9a5ba6p2 -0x1.402b22ba437eep2 0x1.2b494629eep9 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4239 3 OK -0x1.407bec49f74b6p2 0x1.3fd105b6b00b6p2 0x1.58af999f04p9 -0x1.4000000000001p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4239 4 OK 0x1.3f89a9a9a5ba6p2 0x1.3fd2dfb0e11bp2 0x1.113a1b11f2p9 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4240 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4240 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4240 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4240 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4240 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4241 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4241 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4241 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4241 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4241 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4242 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4242 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4242 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4242 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4242 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4243 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4243 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4243 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4243 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4243 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4244 0 OK -0x1.cf50c5ae57b1dp-8 -0x1.97bd3e8a90984p-11 0x1.deda21292cp9 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4244 1 OK -0x1.407293625fc0fp2 -0x1.4005d8b668012p2 0x1.01d99c687dp10 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4244 2 OK 0x1.3f8aec7fc630ap2 -0x1.40079e3389942p2 0x1.bf5ee05172p9 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4244 3 OK -0x1.407293625fc0fp2 0x1.3fec7643d7f7p2 0x1.fc348fa0d2p9 -0x1.3fffffffffffdp2 0x1.4p2 0x0.0p0 F +REG esri:4244 4 OK 0x1.3f8aec7fc630ap2 0x1.3fee3b9d5ff61p2 0x1.b7e02c8958p9 0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4245 0 OK -0x1.f4fff10b641aep-8 -0x1.7b4c27103e0bp-15 0x1.a5ff33fcaap9 0x1.2d6cb2018701fp-60 0x0.0p0 -0x1.0p-30 T +REG esri:4245 1 OK -0x1.407d1a896e0b3p2 -0x1.3ffaedb6000c4p2 0x1.ca6bd052ep9 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4245 2 OK 0x1.3f829c3219b17p2 -0x1.3ffcd806f29aep2 0x1.8088b0cb7cp9 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4245 3 OK -0x1.407d1a896e0b3p2 0x1.3ff973e3b5bc5p2 0x1.c9fc432668p9 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4245 4 OK 0x1.3f829c3219b17p2 0x1.3ffb5e326b526p2 0x1.801922f486p9 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4246 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4246 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4246 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4246 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4246 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4247 0 OK -0x1.047042b639adbp-10 0x1.a83d59c2276f5p-9 0x1.682d5593p4 0x1.2d6cb2018701fp-63 0x0.0p0 -0x1.0p-30 T +REG esri:4247 1 OK -0x1.400cc1667f83ap2 -0x1.3fc9e03b3b2e9p2 -0x1.dc23cf1p-2 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4247 2 OK 0x1.3fec3393b40bp2 -0x1.3fca1feac0561p2 -0x1.3ab7434ecp4 0x1.4p2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4247 3 OK -0x1.400cc1667f83ap2 0x1.403386257c94dp2 0x1.ef5c6424p5 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4247 4 OK 0x1.3fec3393b40bp2 0x1.4033c5e9d43f6p2 0x1.55b96d3ep5 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4248 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4248 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4248 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4248 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4248 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4249 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4249 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4249 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4249 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4249 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4250 0 OK -0x1.11291470ab2f6p-12 -0x1.af83e0fb89195p-9 0x1.1dd92f458p4 -0x1.2d6cb2018701ep-65 0x0.0p0 0x1.0p-30 T +REG esri:4250 1 OK -0x1.40029819d435bp2 -0x1.403cfcb2bb421p2 0x1.ae27b16p5 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4250 2 OK 0x1.3ffa0edf53a6bp2 -0x1.403d0d6c18d86p2 0x1.85dea6302p5 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4250 3 OK -0x1.40029819d435bp2 0x1.3fd186fd3ac01p2 -0x1.35f07c5b8p3 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4250 4 OK 0x1.3ffa0edf53a6bp2 0x1.3fd197b10a81ap2 -0x1.d71512e1p3 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4251 0 OK -0x1.78c68214a54e1p-12 -0x1.a14ac159d2b08p-11 -0x1.624ee715cp4 -0x1.2d6cb2018701ep-64 0x0.0p0 0x1.0p-30 T +REG esri:4251 1 OK -0x1.4004ba65e6594p2 -0x1.4014bfdbf3ae8p2 -0x1.213b10cap3 -0x1.4p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4251 2 OK 0x1.3ff8f4455eeb5p2 -0x1.4014d6ea7d8aep2 -0x1.ff7f2ffp3 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4251 3 OK -0x1.4004ba65e6594p2 0x1.3ffac51eb51fbp2 -0x1.8611b20bp4 -0x1.4p2 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:4251 4 OK 0x1.3ff8f4455eeb5p2 0x1.3ffadc2b64da1p2 -0x1.f533d3414p4 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4252 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4252 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4252 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4252 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4252 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4253 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4253 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4253 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4253 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4253 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4254 0 OK -0x1.b6a267b1f85b8p-10 -0x1.dfe816aaaafc8p-11 -0x1.0d5e39316p8 0x1.78bf3854f4e48p-37 0x1.0b24e2e8c70dcp-36 0x1.2e98p-17 T +REG esri:4254 1 OK -0x1.401bad6f6e85p2 -0x1.4011477db265ep2 -0x1.e6c5c15058p7 -0x1.3ffffffffbacfp2 -0x1.3ffffffff9d8fp2 0x1.19cp-17 F +REG esri:4254 2 OK 0x1.3fe4ce34c10f1p2 -0x1.4011c1dcb9224p2 -0x1.14ce00c9e8p8 0x1.40000000034aep2 -0x1.3ffffffffb933p2 0x1.2bep-17 F +REG esri:4254 3 OK -0x1.401b9fa1acebp2 0x1.3ff372453cc5cp2 -0x1.0444bc0b2p8 -0x1.3ffffffffd6ecp2 0x1.4000000003dabp2 0x1.3188p-17 F +REG esri:4254 4 OK 0x1.3fe4d6ff62d8bp2 0x1.3ff3d5b440662p2 -0x1.25aff91dcp8 0x1.400000000168ep2 0x1.4000000001f2bp2 0x1.3b2p-17 F +REG esri:4255 0 OK 0x1.0560c406436f6p-9 -0x1.0e425467fdf1ap-10 0x1.4805019b5p6 -0x1.2d6cb2018701fp-61 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG esri:4255 1 OK -0x1.3fdb0a7880142p2 -0x1.400f227f96d3fp2 0x1.1b50a8648p6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4255 2 OK 0x1.401c623e56ab3p2 -0x1.400ea28ffb958p2 0x1.b581a2967p6 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4255 3 OK -0x1.3fdb0a7880142p2 0x1.3fed7bbf11e89p2 0x1.97a94d64ap5 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4255 4 OK 0x1.401c623e56ab3p2 0x1.3fecfbdcc6a69p2 0x1.6605c0955p6 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4256 0 OK 0x1.0309d6183967bp-9 0x1.3db7b05347903p-10 -0x1.3247925b6p7 0x1.2d6cb2018701ep-62 0x0.0p0 0x1.0p-30 T +REG esri:4256 1 OK -0x1.3fe0261b4c05ap2 -0x1.3ff5f5243ce0fp2 -0x1.69ed7ad768p7 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4256 2 OK 0x1.4020e824b378ep2 -0x1.3ff5765f20647p2 -0x1.1d859ac9ap7 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4256 3 OK -0x1.3fe0261b4c05ap2 0x1.401d84a5440d2p2 -0x1.3b34e643ap7 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4256 4 OK 0x1.4020e824b378ep2 0x1.401d05d0a4777p2 -0x1.dd9a31597p6 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4257 0 OK -0x1.31f57f411b1e3p-8 -0x1.598572903e21cp-10 0x1.4beabe14d8p10 -0x1.2d6cb2018701ep-60 0x0.0p0 0x0.0p0 T +REG esri:4257 1 OK -0x1.4044eb5a1e69dp2 -0x1.400ba9175af58p2 0x1.5921956471p10 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4257 2 OK 0x1.3fabf1924f40ap2 -0x1.400cd49193ca9p2 0x1.4291e3b3a7p10 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4257 3 OK -0x1.4044eb5a1e69dp2 0x1.3fe0a36199622p2 0x1.52c7b0834bp10 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4257 4 OK 0x1.3fabf1924f40ap2 0x1.3fe1ceb3faaf8p2 0x1.3c37f8e4f6p10 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4258 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4258 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4258 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4258 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4258 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4259 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4259 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4259 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4259 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4259 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4260 0 OK 0x1.65777d1555bdfp-10 0x1.88a291778124dp-12 -0x1.49f1c88eap5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4260 1 OK -0x1.3fe8bef55dc23p2 -0x1.40021c39a357p2 -0x1.bf640f4eap5 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4260 2 OK 0x1.40156d9acb84dp2 -0x1.4001c4be78911p2 -0x1.d907a02a4p4 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4260 3 OK -0x1.3fe8bef55dc23p2 0x1.400e551cf4285p2 -0x1.85a73292p5 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4260 4 OK 0x1.40156d9acb84dp2 0x1.400dfd9e7adfap2 -0x1.658e062ep4 0x1.4p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4261 0 OK -0x1.57d0688c6f991p-10 -0x1.bdc093fa92df3p-12 -0x1.1e65748588p7 -0x1.2d6cb2018701ep-62 0x0.0p0 0x1.0p-30 T +REG esri:4261 1 OK -0x1.4015e30f94f2ap2 -0x1.401022b659aa2p2 -0x1.ee2c361abp6 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4261 2 OK 0x1.3feae94a3b374p2 -0x1.401076de44416p2 -0x1.29cab296c8p7 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4261 3 OK -0x1.4015e30f94f2ap2 0x1.4002428d1dd9ap2 -0x1.077934ffb8p7 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG esri:4261 4 OK 0x1.3feae94a3b374p2 0x1.400296b16c19ap2 -0x1.3a2dd0d558p7 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4262 0 OK -0x1.dce930dd922fep-9 -0x1.1c8345aa5b0a9p-11 0x1.936ebd3fep6 0x1.2d6cb2018701fp-61 0x0.0p0 -0x1.0p-30 T +REG esri:4262 1 OK -0x1.4043d7396189ap2 -0x1.400eea6c68d38p2 0x1.23363921b8p7 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4262 2 OK 0x1.3fcc9db9d931ap2 -0x1.400fd3e1a43c2p2 0x1.2d15f6438p6 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4262 3 OK -0x1.4043d7396189ap2 0x1.3ffd33ead027dp2 0x1.0e4afab158p7 -0x1.4p2 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4262 4 OK 0x1.3fcc9db9d931ap2 0x1.3ffe1d534225bp2 0x1.033f5af1ep6 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4263 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4263 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4263 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4263 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4263 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4264 0 OK 0x1.35b3948525e67p-15 0x1.c8fb10af91e8fp-11 0x1.f36354ccp0 0x1.2d6cb2018701dp-66 0x1.c72f1eacb7b02p-62 0x1.0p-29 T +REG esri:4264 1 OK -0x1.3ffc2361c62ep2 -0x1.3ff0de5160c4ap2 -0x1.0124c8f38p3 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4264 2 OK 0x1.3ffd59135cd1dp2 -0x1.3ff0dbf33c3cap2 -0x1.d49cdacp2 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4264 3 OK -0x1.3ffc2361c62ep2 0x1.400d51a17ae69p2 0x1.1874737a8p3 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4264 4 OK 0x1.3ffd59135cd1dp2 0x1.400d4f4321068p2 0x1.2f4acb15p3 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4265 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4265 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4265 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4265 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4265 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4266 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4266 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4266 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4266 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4266 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4267 0 OK -0x1.9p6 0x1.68p5 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG esri:4267 1 OK -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 F +REG esri:4267 2 OK -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 F +REG esri:4267 3 OK -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG esri:4267 4 OK -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG esri:4268 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4268 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4268 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4268 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4268 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4269 0 OK -0x1.9p6 0x1.68p5 0x0.0p0 -0x1.9p6 0x1.68p5 0x0.0p0 F +REG esri:4269 1 OK -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.4p5 0x0.0p0 F +REG esri:4269 2 OK -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.4p5 0x0.0p0 F +REG esri:4269 3 OK -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 -0x1.ac48c6001f0acp6 0x1.9p5 0x0.0p0 F +REG esri:4269 4 OK -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 -0x1.73b739ffe0f54p6 0x1.9p5 0x0.0p0 F +REG esri:4270 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4270 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4270 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4270 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4270 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4271 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4271 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4271 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4271 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4271 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4272 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4272 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4272 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4272 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4272 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4273 0 OK 0x1.0644f826f2b33p-10 -0x1.18517d6a8bd47p-8 0x1.4718f37084p8 -0x1.252ef87622b93p-31 0x1.2f9c00b93bf51p-24 0x1.ad3bccp-8 T +REG esri:4273 1 OK -0x1.3ff64c4f525e8p2 -0x1.4044704c307bbp2 0x1.7a20e3720cp8 -0x1.40000008fd956p2 -0x1.3fffffb7cccf2p2 0x1.5b9988p-8 F +REG esri:4273 2 OK 0x1.4010dd9c23ea1p2 -0x1.404af2c420164p2 0x1.6a00db3878p8 0x1.40000007c7a73p2 -0x1.3fffffb7bc1b7p2 0x1.5a29d8p-8 F +REG esri:4273 3 OK -0x1.3ff015b0b5262p2 0x1.3fbf1fb0d42f8p2 0x1.2771b4aaf8p8 -0x1.40000007c3fcbp2 0x1.4000004ca5953p2 0x1.0613ap-7 F +REG esri:4273 4 OK 0x1.401715fe66a73p2 0x1.3fb90868deaa8p2 0x1.174500f14p8 0x1.40000006b86c7p2 0x1.4000004cbf2bp2 0x1.0574d8p-7 F +REG esri:4274 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4274 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4274 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4274 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4274 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4275 0 OK 0x1.1a93ff16c42c8p-11 -0x1.7b5a09708feafp-9 0x1.be7787c1cp5 0x1.2d6cb2018701ep-64 0x0.0p0 0x1.0p-30 T +REG esri:4275 1 OK -0x1.3ff501a9bb20ep2 -0x1.40361a9a5c70ap2 0x1.3f71ec08cp6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4275 2 OK 0x1.4006aacc7aa4dp2 -0x1.4035f8013747dp2 0x1.691e8802bp6 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4275 3 OK -0x1.3ff501a9bb20ep2 0x1.3fd7a25b58e73p2 0x1.813b07478p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4275 4 OK 0x1.4006aacc7aa4dp2 0x1.3fd77fcc4dd32p2 0x1.13f6ebb04p5 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4276 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4276 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4276 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4276 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4276 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4277 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4277 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4277 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4277 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4277 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4278 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4278 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4278 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4278 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4278 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4279 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4279 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4279 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4279 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4279 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4280 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4280 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4280 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4280 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4280 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4281 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4281 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4281 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4281 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4281 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4282 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4282 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4282 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4282 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4282 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4283 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4283 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4283 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4283 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4283 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4284 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4284 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4284 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4284 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4284 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4285 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4285 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4285 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4285 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4285 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4286 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4286 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4286 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4286 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4286 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4287 0 OK -0x1.44fb538a9d45p-10 0x1.c018a68fa42acp-10 -0x1.9efee5648p8 0x0.0p0 0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG esri:4287 1 OK -0x1.40166c2cdf5ecp2 -0x1.3fe86674c15f5p2 -0x1.a18ca56d3p8 -0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4287 2 OK 0x1.3fedcd06a55a7p2 -0x1.3fe8b5f59e572p2 -0x1.b98375cce8p8 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4287 3 OK -0x1.40166c2cdf5ecp2 0x1.402031d766c0bp2 -0x1.809a51666p8 -0x1.3ffffffffffffp2 0x1.4p2 -0x1.0p-29 F +REG esri:4287 4 OK 0x1.3fedcd06a55a7p2 0x1.40208165fcbf1p2 -0x1.9891199b5p8 0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4288 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4288 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4288 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4288 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4288 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4289 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4289 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4289 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4289 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4289 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4291 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4291 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4291 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4291 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4291 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4292 0 OK -0x1.8b9906a056caep-13 -0x1.5560f486505b6p-11 0x1.a000744f6p6 -0x1.2d6cb2018701cp-64 -0x1.2f74bf1dcfcacp-63 0x1.8p-29 T +REG esri:4292 1 OK -0x1.3ffe850bfe789p2 -0x1.4008611e3750ap2 0x1.b86026307p6 -0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4292 2 OK 0x1.3ff856b204697p2 -0x1.40086d3813b6bp2 0x1.a9ca3ac16p6 0x1.4p2 -0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4292 3 OK -0x1.3ffe850bfe789p2 0x1.3ff3204232c19p2 0x1.862cdd176p6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4292 4 OK 0x1.3ff856b204697p2 0x1.3ff32c5b438dp2 0x1.7796efc39p6 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4293 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4293 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4293 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4293 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4293 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4294 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4294 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4294 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4294 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4294 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4295 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4295 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4295 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4295 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4295 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4296 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4296 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4296 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4296 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4296 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4297 0 OK 0x1.1cee96ed13852p-9 0x1.af79e1094443ap-11 -0x1.eff5426cp5 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4297 1 OK -0x1.3fd9f363c2122p2 -0x1.3ff2c0aba5092p2 -0x1.6eb909226p6 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4297 2 OK 0x1.40212e93dae78p2 -0x1.3ff23540134a9p2 -0x1.8d45b2a8ap5 0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4297 3 OK -0x1.3fd9f363c2122p2 0x1.400d9d83a7523p2 -0x1.2f45f5349p6 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4297 4 OK 0x1.40212e93dae78p2 0x1.400d120c7fe2bp2 -0x1.0e5fc1f54p5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4298 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4298 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4298 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4298 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4298 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4299 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4299 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4299 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4299 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4299 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4300 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4300 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4300 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4300 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4300 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4301 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4301 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4301 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4301 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4301 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4302 0 OK -0x1.4ef6d9777ad94p-9 -0x1.17cd60073ccabp-8 -0x1.7ba4c48b7p6 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4302 1 OK -0x1.40291327af3adp2 -0x1.404c06a1d3bc4p2 -0x1.b54d593dcp4 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4302 2 OK 0x1.3fd555fc73028p2 -0x1.404caab9a241fp2 -0x1.32ecee1e9p6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4302 3 OK -0x1.40291327af3adp2 0x1.3fc0ab28b5178p2 -0x1.b67cc0afp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4302 4 OK 0x1.3fd555fc73028p2 0x1.3fc14ef9db2eap2 -0x1.3e0b80599p7 0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4303 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4303 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4303 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4303 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4303 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4304 0 OK 0x1.22d30598a3133p-9 -0x1.0d1b4d9169a49p-9 -0x1.398779c9cp5 0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:4304 1 OK -0x1.3fdab532a9a72p2 -0x1.4029cf48e87ccp2 -0x1.36112b33p5 -0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4304 2 OK 0x1.4023697b5445p2 -0x1.402940df68ae1p2 0x1.0873aaa8p2 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4304 3 OK -0x1.3fdab532a9a72p2 0x1.3fe6cb49cb738p2 -0x1.3953094ddp6 -0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4304 4 OK 0x1.4023697b5445p2 0x1.3fe63cfdcc024p2 -0x1.1b85e59d2p5 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4305 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4305 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4305 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4305 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4305 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4306 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4306 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4306 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4306 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4306 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4307 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4307 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4307 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4307 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4307 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4308 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4308 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4308 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4308 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4308 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4309 0 OK -0x1.92acb47b88cf8p-10 -0x1.5edf5f6bf0de1p-12 -0x1.7ffd8ac88p6 0x0.0p0 0x1.2f74bf1dcfcaep-64 0x0.0p0 T +REG esri:4309 1 OK -0x1.40172bb2f6ab5p2 -0x1.40059e1f51277p2 -0x1.39a5d283dp6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4309 2 OK 0x1.3fe4d66fa91ebp2 -0x1.400600a98d9a1p2 -0x1.b06b8eb54p6 0x1.4p2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4309 3 OK -0x1.40172bb2f6ab5p2 0x1.3ffab20b3e16cp2 -0x1.537226029p6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4309 4 OK 0x1.3fe4d66fa91ebp2 0x1.3ffb149226783p2 -0x1.ca37ea207p6 0x1.4p2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4310 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4310 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4310 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4310 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4310 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4311 0 OK -0x1.1a92e5752b71ap-10 0x1.a85bd76eab109p-9 0x1.c05c1b61p3 -0x1.2d6cb2018701ep-63 0x1.2f74bf1dcfcaep-61 0x0.0p0 T +REG esri:4311 1 OK -0x1.400e3f92489a3p2 -0x1.3fc9f5b817c2fp2 -0x1.02f8cb228p3 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4311 2 OK 0x1.3feaed6fb857ep2 -0x1.3fca3ad1550f8p2 -0x1.cee0d4eap4 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4311 3 OK -0x1.400e3f92489a3p2 0x1.4033a3392953fp2 0x1.b27a531d2p5 -0x1.4p2 0x1.4000000000001p2 0x0.0p0 F +REG esri:4311 4 OK 0x1.3feaed6fb857ep2 0x1.4033e868ffd2ap2 0x1.0bc88708ep5 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4312 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4312 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4312 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4312 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4312 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4313 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4313 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4313 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4313 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4313 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4314 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4314 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4314 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4314 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4314 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4315 0 OK -0x1.30f4b002f83bbp-9 0x1.556ca240c24dfp-14 -0x1.64c76899dp6 0x0.0p0 0x1.2f74bf1dcfcadp-66 0x1.0p-29 T +REG esri:4315 1 OK -0x1.4025d27d02f04p2 -0x1.40070c178ba91p2 -0x1.0414caf13p6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4315 2 OK 0x1.3fd995cfe8921p2 -0x1.4007a15d13b57p2 -0x1.b7fadec7p6 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4315 3 OK -0x1.4025d27d02f04p2 0x1.4009b4494965cp2 -0x1.fb9c5938ap5 -0x1.3ffffffffffffp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4315 4 OK 0x1.3fd995cfe8921p2 0x1.400a49900b6eep2 -0x1.b1b43d869p6 0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4316 0 OK 0x1.d8de134fb6287p-11 0x1.6c26dc40f2e5fp-9 -0x1.623de41d28p8 0x0.0p0 0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG esri:4316 1 OK -0x1.3ff28d808f94ep2 -0x1.3fd67119df4f5p2 -0x1.8441f2f66p8 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4316 2 OK 0x1.40101b3047c36p2 -0x1.3fd63745f8acap2 -0x1.72d2af4014p8 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4316 3 OK -0x1.3ff28d808f94ep2 0x1.4031205edd9d3p2 -0x1.4eb559c5c4p8 -0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4316 4 OK 0x1.40101b3047c36p2 0x1.4030e67abcf45p2 -0x1.3d461fb7c8p8 0x1.3fffffffffffep2 0x1.4000000000001p2 -0x1.0p-30 F +REG esri:4317 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4317 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4317 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4317 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4317 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4318 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4318 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4318 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4318 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4318 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4319 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4319 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4319 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4319 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4319 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4322 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4322 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4322 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4322 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4322 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4324 0 OK -0x1.da307a7ab615ap-13 -0x1.20488116c1195p-16 0x1.1b1e9aaep2 0x0.0p0 -0x1.2f74bf1dbb5b8p-69 0x1.a0a3p-14 T +REG esri:4324 1 OK -0x1.4003b460f4f55p2 -0x1.40004662f8c4fp2 0x1.259d2fefp2 -0x1.3ffffffffffffp2 -0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:4324 2 OK 0x1.3ffc4b9f0b0a9p2 -0x1.40004662f8c5p2 0x1.259d2fedp2 0x1.4p2 -0x1.3fffffffea8fcp2 0x1.9d79p-14 F +REG esri:4324 3 OK -0x1.4003b460f4f55p2 0x1.3fffb6cdf0a82p2 0x1.106af05p2 -0x1.3fffffffffffep2 0x1.3fffffffea8fdp2 0x1.9d79p-14 F +REG esri:4324 4 OK 0x1.3ffc4b9f0b0a9p2 0x1.3fffb6cdf0a82p2 0x1.106af04ep2 0x1.4p2 0x1.3fffffffea8fep2 0x1.9d77p-14 F +REG esri:4326 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4326 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4326 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4326 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4326 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4404 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4404 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4404 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4404 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4404 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4600 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4600 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4600 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4600 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4600 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4601 0 OK 0x1.1a93027e514d4p-13 -0x1.50ab8609abf06p-11 0x1.1db5f90568p7 0x0.0p0 0x1.2f74bf1dcfcaep-63 -0x1.0p-30 T +REG esri:4601 1 OK -0x1.3ffa8256625f4p2 -0x1.40102dc813888p2 0x1.28e6b8bf4p7 -0x1.3fffffffffffep2 -0x1.4000000000001p2 -0x1.0p-30 F +REG esri:4601 2 OK 0x1.3ffeec9b27a7p2 -0x1.40102522dcf3fp2 0x1.2e1c48cb1p7 0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4601 3 OK -0x1.3ffa8256625f4p2 0x1.3ffb37fa51316p2 0x1.1025b5fb4p7 -0x1.3fffffffffffep2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4601 4 OK 0x1.3ffeec9b27a7p2 0x1.3ffb2f55aa0dbp2 0x1.155b46b1cp7 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4602 0 OK -0x1.9351a88dfcb91p-8 -0x1.3dc078b2273eap-8 -0x1.a28af2c008p9 0x1.2d6cb2018701ep-60 -0x1.2f74bf1dcfcaep-60 0x0.0p0 T +REG esri:4602 1 OK -0x1.406e2998e43c6p2 -0x1.4060a5f8308p2 -0x1.695cc5ae46p9 -0x1.3ffffffffffffp2 -0x1.4p2 -0x1.0p-29 F +REG esri:4602 2 OK 0x1.3fa482202e439p2 -0x1.40623148a7a4ep2 -0x1.a4d7d63912p9 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4602 3 OK -0x1.406e2998e43c6p2 0x1.3fc264252ff5dp2 -0x1.98167c5b5cp9 -0x1.4p2 0x1.3ffffffffffffp2 -0x1.0p-30 F +REG esri:4602 4 OK 0x1.3fa482202e439p2 0x1.3fc3eeb46523ap2 -0x1.d391c66864p9 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4603 0 OK -0x1.f73e5313cc8p-10 -0x1.b903582965654p-11 -0x1.70480eb72p7 -0x1.2d6cb2018701ep-61 0x0.0p0 0x1.0p-30 T +REG esri:4603 1 OK -0x1.4020610106e44p2 -0x1.4017606ab1301p2 -0x1.3492c58fcp7 -0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4603 2 OK 0x1.3fe1799fd1ee9p2 -0x1.4017db9bafc65p2 -0x1.7eca8e3778p7 0x1.3fffffffffffdp2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4603 3 OK -0x1.4020610106e44p2 0x1.3ffbeba25e48ap2 -0x1.54ffc334p7 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4603 4 OK 0x1.3fe1799fd1ee9p2 0x1.3ffc66c8e7b1ep2 -0x1.9f37984e48p7 0x1.3fffffffffffep2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4604 0 OK -0x1.a6b66159a0dbfp-9 -0x1.b0b8ad8686fd9p-9 -0x1.1e1fd7695cp8 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4604 1 OK -0x1.403713f5a69dfp2 -0x1.4040ad47f60fbp2 -0x1.b656ea295p7 -0x1.3ffffffffffffp2 -0x1.4p2 0x1.0p-29 F +REG esri:4604 2 OK 0x1.3fcd670edb821p2 -0x1.40417c57fb8bep2 -0x1.1982c20a9p8 0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4604 3 OK -0x1.403713f5a69dfp2 0x1.3fd4ead100208p2 -0x1.1acd438b14p8 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4604 4 OK 0x1.3fcd670edb821p2 0x1.3fd5b99c1178dp2 -0x1.5924b98aacp8 0x1.3fffffffffffep2 0x1.3fffffffffffcp2 0x1.0p-29 F +REG esri:4605 0 OK -0x1.aef18e56491cp-10 -0x1.17c79a58edc53p-9 -0x1.e48d4a445p6 -0x1.2d6cb2018701ep-61 -0x1.2f74bf1dcfcaep-62 0x1.0p-30 T +REG esri:4605 1 OK -0x1.401b0c924c857p2 -0x1.402bb57e157p2 -0x1.47dacf7acp6 -0x1.3fffffffffffep2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4605 2 OK 0x1.3fe52eba4e5e9p2 -0x1.402c1f02945e4p2 -0x1.c6f700a15p6 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4605 3 OK -0x1.401b0c924c857p2 0x1.3fe6092deaa6ep2 -0x1.ec6c2c0e7p6 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4605 4 OK 0x1.3fe52eba4e5e9p2 0x1.3fe6729bb0097p2 -0x1.35c449a72p7 0x1.3fffffffffffdp2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4606 0 OK -0x1.2d6ae4893b202p-10 -0x1.5ee6c0c0c8ecbp-9 0x1.26e7d53fcp5 -0x1.2d6cb2018701ep-62 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:4606 1 OK -0x1.4010eb6908aa7p2 -0x1.403297f91f387p2 0x1.2d29dd9fcp6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4606 2 OK 0x1.3feb3e4ace5a7p2 -0x1.4032e1c7b9ae1p2 0x1.a8842ea6ep5 0x1.3fffffffffffep2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4606 3 OK -0x1.4010eb6908aa7p2 0x1.3fdb3589662cdp2 0x1.7b0bab6b8p4 -0x1.3ffffffffffffp2 0x1.4p2 0x1.0p-29 F +REG esri:4606 4 OK 0x1.3feb3e4ace5a7p2 0x1.3fdb7f4411637p2 0x1.76bd4678p0 0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4607 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4607 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4607 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4607 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4607 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4608 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4608 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4608 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4608 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4608 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4609 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4609 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4609 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4609 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4609 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4610 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4610 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4610 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4610 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4610 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4611 0 OK 0x1.70493823e26f1p-9 0x1.b60a0cb726e8p-11 -0x1.45926c421p6 0x1.c22b498df6a9dp-33 0x1.d443a3760be62p-34 0x1.f5392p-11 T +REG esri:4611 1 OK -0x1.3fcff9a7cc3ecp2 -0x1.3ff2e62812496p2 -0x1.e02a69f15p6 -0x1.3ffffffed3d41p2 -0x1.3fffffff65cfep2 0x1.eb3b6p-11 F +REG esri:4611 2 OK 0x1.402bfdc9d64f8p2 -0x1.3ff25471f44b7p2 -0x1.1fcb9c957p6 0x1.3fffffffe94e9p2 -0x1.400000000a705p2 0x1.f5838p-11 F +REG esri:4611 3 OK -0x1.3fcfc46a01666p2 0x1.400e399731bbdp2 -0x1.6fb28658p6 -0x1.3fffffff7a08ep2 0x1.4000000045927p2 0x1.f385ep-11 F +REG esri:4611 4 OK 0x1.402be3d66efdap2 0x1.400d8c1ffd42fp2 -0x1.5ea8c7356p5 0x1.3fffffff42386p2 0x1.3fffffff9d878p2 0x1.f17a4p-11 F +REG esri:4612 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4612 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4612 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4612 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4612 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4613 0 OK -0x1.93a5d93684ad9p-8 -0x1.af27cebbffdffp-12 0x1.1e2a5e7facp10 0x1.2d6cb2018702p-60 0x0.0p0 -0x1.0p-29 T +REG esri:4613 1 OK -0x1.405fb25fff7f6p2 -0x1.3fff06e5c9603p2 0x1.2d24e086aep10 -0x1.3fffffffffffep2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4613 2 OK 0x1.3f95e0bd3f73ap2 -0x1.400091f249b39p2 0x1.0f6111371dp10 0x1.4p2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4613 3 OK -0x1.405fb25fff7f6p2 0x1.3ff19b1170a5ap2 0x1.2b29aa0562p10 -0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 -0x1.0p-29 F +REG esri:4613 4 OK 0x1.3f95e0bd3f73ap2 0x1.3ff3260d8b162p2 0x1.0d65d8453dp10 0x1.3ffffffffffffp2 0x1.4000000000002p2 -0x1.0p-29 F +REG esri:4614 0 OK 0x1.3d9eb603e2d73p-9 0x1.36ec89ed914cap-13 -0x1.35c9582b48p7 -0x1.2c975ff13a939p-32 -0x1.dbaf01423be74p-30 0x1.8369p-13 T +REG esri:4614 1 OK -0x1.3fd736a4a0033p2 -0x1.3ffe440cd577bp2 -0x1.6cdf5208a8p7 -0x1.400000006ae36p2 -0x1.40000001cfc41p2 0x1.d62e8p-13 F +REG esri:4614 2 OK 0x1.4025b2df8c71ep2 -0x1.3ffe831aceec2p2 -0x1.03686025c8p7 0x1.3fffffffe322bp2 -0x1.40000001de488p2 0x1.c1ffp-13 F +REG esri:4614 3 OK -0x1.3fd64ed9dc094p2 0x1.400408f09de49p2 -0x1.690476d288p7 -0x1.400000007e4dcp2 0x1.3ffffffe36a6cp2 0x1.4da08p-13 F +REG esri:4614 4 OK 0x1.4026a0d1c134cp2 0x1.40026bee609e2p2 -0x1.ff228ee78p6 0x1.3fffffffde08fp2 0x1.3ffffffe2cb2fp2 0x1.35cfp-13 F +REG esri:4615 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4615 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4615 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4615 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4615 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4616 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4616 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4616 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4616 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4616 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4617 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4617 1 OK -0x1.4p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4617 2 OK 0x1.4p2 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4617 3 OK -0x1.4p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4617 4 OK 0x1.4p2 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4801 0 OK -0x1.dc22222222222p2 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4801 1 OK -0x1.8e11111111111p3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4801 2 OK -0x1.3844444444443p1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4801 3 OK -0x1.8e11111111111p3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4801 4 OK -0x1.3844444444443p1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4802 0 OK 0x1.2852dbd194238p6 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4802 1 OK 0x1.1452dbd194239p6 -0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4802 2 OK 0x1.3c52dbd194238p6 -0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4802 3 OK 0x1.1452dbd194239p6 0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4802 4 OK 0x1.3c52dbd194238p6 0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4803 0 OK 0x1.2438932a2bac2p3 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4803 1 OK 0x1.0871265457585p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4803 2 OK 0x1.c438932a2bac2p3 -0x1.4p2 0x0.0p0 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4803 3 OK 0x1.0871265457585p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4803 4 OK 0x1.c438932a2bac2p3 0x1.4p2 0x0.0p0 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4804 0 OK -0x1.ab3fe2a455f24p6 -0x1.598572903e21cp-10 0x1.4beabe14d8p10 -0x1.408ed84e1fd3cp-46 0x0.0p0 0x0.0p0 T +REG esri:4804 1 OK -0x1.bf3f6983fad46p6 -0x1.400ba9175af58p2 0x1.5921956471p10 -0x1.4000000000001p2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4804 2 OK -0x1.97405bb533f9bp6 -0x1.400cd49193ca9p2 0x1.4291e3b3a7p10 0x1.4000000000003p2 -0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4804 3 OK -0x1.bf3f6983fad46p6 0x1.3fe0a36199622p2 0x1.52c7b0834bp10 -0x1.4000000000002p2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4804 4 OK -0x1.97405bb533f9bp6 0x1.3fe1ceb3faaf8p2 0x1.3c37f8e4f6p10 0x1.4000000000003p2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4805 0 OK 0x1.1aaaaaaaaaaabp4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4805 1 OK 0x1.9555555555555p3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4805 2 OK 0x1.6aaaaaaaaaaabp4 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4805 3 OK 0x1.9555555555555p3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4805 4 OK 0x1.6aaaaaaaaaaabp4 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4806 0 OK -0x1.8e7983c131d5bp3 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4806 1 OK -0x1.173cc1e098eadp4 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4806 2 OK -0x1.dcf3078263ab7p2 -0x1.4p2 0x0.0p0 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4806 3 OK -0x1.173cc1e098eadp4 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4806 4 OK -0x1.dcf3078263ab7p2 0x1.4p2 0x0.0p0 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4807 0 OK -0x1.2b18aa091a2ecp1 -0x1.7b5a09708feafp-9 0x1.be7787c1cp5 -0x1.fca76c6293d33p-54 0x0.0p0 0x1.0p-30 T +REG esri:4807 1 OK -0x1.d58a2b4e40ee7p2 -0x1.40361a9a5c70ap2 0x1.3f71ec08cp6 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4807 2 OK 0x1.54e3024fe9ae9p1 -0x1.4035f8013747dp2 0x1.691e8802bp6 0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x0.0p0 F +REG esri:4807 3 OK -0x1.d58a2b4e40ee7p2 0x1.3fd7a25b58e73p2 0x1.813b07478p4 -0x1.3fffffffffffep2 0x1.3fffffffffffep2 0x1.0p-29 F +REG esri:4807 4 OK 0x1.54e3024fe9ae9p1 0x1.3fd77fcc4dd32p2 0x1.13f6ebb04p5 0x1.3fffffffffffep2 0x1.3fffffffffffep2 -0x1.0p-30 F +REG esri:4808 0 OK -0x1.ab3b1ace58edcp6 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4808 1 OK -0x1.bf3b1ace58edcp6 -0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4808 2 OK -0x1.973b1ace58eddp6 -0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4808 3 OK -0x1.bf3b1ace58edcp6 0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4808 4 OK -0x1.973b1ace58eddp6 0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4809 0 OK -0x1.178ce703afb7fp2 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4809 1 OK -0x1.2bc67381d7dcp3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4809 2 OK 0x1.4398c7e282408p-1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4809 3 OK -0x1.2bc67381d7dcp3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4809 4 OK 0x1.4398c7e282408p-1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4810 0 OK -0x1.2ae317a350562p1 0x1.af79e1094443ap-11 -0x1.eff5426cp5 0x1.74122bb9e2a65p-55 0x0.0p0 0x0.0p0 T +REG esri:4810 1 OK -0x1.d56f1d0847dfbp2 -0x1.3ff2c0aba5092p2 -0x1.6eb909226p6 -0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4810 2 OK 0x1.551809deaa34p1 -0x1.3ff23540134a9p2 -0x1.8d45b2a8ap5 0x1.3ffffffffffffp2 -0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4810 3 OK -0x1.d56f1d0847dfbp2 0x1.400d9d83a7523p2 -0x1.2f45f5349p6 -0x1.4p2 0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4810 4 OK 0x1.551809deaa34p1 0x1.400d120c7fe2bp2 -0x1.0e5fc1f54p5 0x1.3ffffffffffffp2 0x1.3ffffffffffffp2 0x1.0p-29 F +REG esri:4811 0 OK -0x1.2ae19e87a5725p1 -0x1.0d1b4d9169a49p-9 -0x1.398779c9cp5 -0x1.4cc62004efac7p-51 -0x1.2f74bf1dcfcaep-61 0x1.0p-30 T +REG esri:4811 1 OK -0x1.d56fded72f74ap2 -0x1.4029cf48e87ccp2 -0x1.36112b33p5 -0x1.3ffffffffffffp2 -0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4811 2 OK 0x1.551c7fad9cefp1 -0x1.402940df68ae1p2 0x1.0873aaa8p2 0x1.4p2 -0x1.3fffffffffffep2 0x0.0p0 F +REG esri:4811 3 OK -0x1.d56fded72f74ap2 0x1.3fe6cb49cb738p2 -0x1.3953094ddp6 -0x1.3ffffffffffffp2 0x1.3fffffffffffdp2 0x1.0p-29 F +REG esri:4811 4 OK 0x1.551c7fad9cefp1 0x1.3fe63cfdcc024p2 -0x1.1b85e59d2p5 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4812 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4812 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4812 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4812 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4812 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4813 0 OK -0x1.ab3b1ace58edcp6 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4813 1 OK -0x1.bf3b1ace58edcp6 -0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4813 2 OK -0x1.973b1ace58eddp6 -0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4813 3 OK -0x1.bf3b1ace58edcp6 0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4813 4 OK -0x1.973b1ace58eddp6 0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4814 0 OK -0x1.20eeb4adda39dp4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4814 1 OK -0x1.70eeb4adda39dp4 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4814 2 OK -0x1.a1dd695bb4739p3 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4814 3 OK -0x1.70eeb4adda39dp4 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4814 4 OK -0x1.a1dd695bb4739p3 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4815 0 OK -0x1.7b761e4f765fep4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4815 1 OK -0x1.cb761e4f765ffp4 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4815 2 OK -0x1.2b761e4f765fep4 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4815 3 OK -0x1.cb761e4f765ffp4 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4815 4 OK -0x1.2b761e4f765fep4 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4816 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4816 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4816 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4816 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4816 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4817 0 OK -0x1.5719effa60ea9p3 -0x1.18517d6a8bd47p-8 0x1.4718f37084p8 -0x1.252f11d02f117p-31 0x1.2f9c00b93bf51p-24 0x1.ad3bccp-8 T +REG esri:4817 1 OK -0x1.f71d4849cb516p3 -0x1.4044704c307bbp2 0x1.7a20e3720cp8 -0x1.40000008fd957p2 -0x1.3fffffb7cccf2p2 0x1.5b9988p-8 F +REG esri:4817 2 OK -0x1.6e3366a8205a3p2 -0x1.404af2c420164p2 0x1.6a00db3878p8 0x1.40000007c7a73p2 -0x1.3fffffb7bc1b7p2 0x1.5a29d8p-8 F +REG esri:4817 3 OK -0x1.f71a2cfa7cb53p3 0x1.3fbf1fb0d42f8p2 0x1.2771b4aaf8p8 -0x1.40000007c3fcbp2 0x1.4000004ca5953p2 0x1.0613ap-7 F +REG esri:4817 4 OK -0x1.6e2d2e45dd9d1p2 0x1.3fb90868deaa8p2 0x1.174500f14p8 0x1.40000006b86c7p2 0x1.4000004cbf2bp2 0x1.0574d8p-7 F +REG esri:4818 0 OK 0x1.1aaaaaaaaaaabp4 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4818 1 OK 0x1.9555555555555p3 -0x1.4p2 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4818 2 OK 0x1.6aaaaaaaaaaabp4 -0x1.4p2 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:4818 3 OK 0x1.9555555555555p3 0x1.4p2 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4818 4 OK 0x1.6aaaaaaaaaaabp4 0x1.4p2 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:4819 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4819 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4819 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4819 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4819 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4820 0 OK -0x1.ab3b1ace58edcp6 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4820 1 OK -0x1.bf3b1ace58edcp6 -0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4820 2 OK -0x1.973b1ace58eddp6 -0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 -0x1.4p2 0x0.0p0 F +REG esri:4820 3 OK -0x1.bf3b1ace58edcp6 0x1.4p2 0x0.0p0 -0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4820 4 OK -0x1.973b1ace58eddp6 0x1.4p2 0x0.0p0 0x1.3fffffffffffap2 0x1.4p2 0x0.0p0 F +REG esri:4901 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4901 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4901 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4901 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4901 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4902 0 OK -0x1.2b2a53490b9bp1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4902 1 OK -0x1.d59529a485cd8p2 -0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4902 2 OK 0x1.54d5acb6f464fp1 -0x1.4p2 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4902 3 OK -0x1.d59529a485cd8p2 0x1.4p2 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:4902 4 OK 0x1.54d5acb6f464fp1 0x1.4p2 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4903 0 OK 0x1.d80e61aab6515p1 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4903 1 OK -0x1.4fe33caa935d6p0 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4903 2 OK 0x1.1603986aad946p3 -0x1.4p2 0x0.0p0 0x1.4000000000003p2 -0x1.4p2 0x0.0p0 F +REG esri:4903 3 OK -0x1.4fe33caa935d6p0 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4903 4 OK 0x1.1603986aad946p3 0x1.4p2 0x0.0p0 0x1.4000000000003p2 0x1.4p2 0x0.0p0 F +REG esri:4904 0 OK 0x1.2438932a2bac2p3 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:4904 1 OK 0x1.0871265457585p2 -0x1.4p2 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:4904 2 OK 0x1.c438932a2bac2p3 -0x1.4p2 0x0.0p0 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 F +REG esri:4904 3 OK 0x1.0871265457585p2 0x1.4p2 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:4904 4 OK 0x1.c438932a2bac2p3 0x1.4p2 0x0.0p0 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 F +REG esri:53001 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53001 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53001 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53001 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53001 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53002 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53002 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53002 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53002 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53002 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53003 0 OK 0x0.0p0 -0x1.e61198p-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53003 1 OK -0x1.0f78d4435c72cp19 -0x1.0fb159e9bf717p19 0x0.0p0 -0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG esri:53003 2 OK 0x1.0f78d4435c72cp19 -0x1.0fb159e9bf717p19 0x0.0p0 0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG esri:53003 3 OK -0x1.0f78d4435c72cp19 0x1.0fb159e9bf70fp19 0x0.0p0 -0x1.4p2 0x1.4000000000008p2 0x0.0p0 F +REG esri:53003 4 OK 0x1.0f78d4435c72cp19 0x1.0fb159e9bf70fp19 0x0.0p0 0x1.4p2 0x1.4000000000008p2 0x0.0p0 F +REG esri:53004 0 OK 0x0.0p0 -0x1.84daep-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53004 1 OK -0x1.0f78d4435c72cp19 -0x1.0fd1349fdc114p19 0x0.0p0 -0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG esri:53004 2 OK 0x1.0f78d4435c72cp19 -0x1.0fd1349fdc114p19 0x0.0p0 0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG esri:53004 3 OK -0x1.0f78d4435c72cp19 0x1.0fd1349fdc105p19 0x0.0p0 -0x1.4p2 0x1.3ffffffffffebp2 0x0.0p0 F +REG esri:53004 4 OK 0x1.0f78d4435c72cp19 0x1.0fd1349fdc105p19 0x0.0p0 0x1.4p2 0x1.3ffffffffffebp2 0x0.0p0 F +REG esri:53008 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53008 1 OK -0x1.0e705f6ba4ae9p19 -0x1.0f78d4435c72cp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:53008 2 OK 0x1.0e705f6ba4ae9p19 -0x1.0f78d4435c72cp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:53008 3 OK -0x1.0e705f6ba4ae9p19 0x1.0f78d4435c72cp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:53008 4 OK 0x1.0e705f6ba4ae9p19 0x1.0f78d4435c72cp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:53009 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53009 1 OK -0x1.e7ac467707d77p18 -0x1.2d62059b3f9ebp19 0x0.0p0 -0x1.4p2 -0x1.4000000000002p2 0x0.0p0 F +REG esri:53009 2 OK 0x1.e7ac467707d77p18 -0x1.2d62059b3f9ebp19 0x0.0p0 0x1.4p2 -0x1.4000000000002p2 0x0.0p0 F +REG esri:53009 3 OK -0x1.e7ac467707d77p18 0x1.2d62059b3f9ebp19 0x0.0p0 -0x1.4p2 0x1.4000000000002p2 0x0.0p0 F +REG esri:53009 4 OK 0x1.e7ac467707d77p18 0x1.2d62059b3f9ebp19 0x0.0p0 0x1.4p2 0x1.4000000000002p2 0x0.0p0 F +REG esri:53010 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53010 1 OK -0x1.dd62e35421d59p18 -0x1.33b6da01222bdp19 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:53010 2 OK 0x1.dd62e35421d59p18 -0x1.33b6da01222bdp19 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:53010 3 OK -0x1.dd62e35421d59p18 0x1.33b6da01222bdp19 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:53010 4 OK 0x1.dd62e35421d59p18 0x1.33b6da01222bdp19 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:53011 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53011 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53011 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53011 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53011 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53012 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53012 1 OK -0x1.c9cec7ed26196p18 -0x1.4138e959d5e9fp19 0x0.0p0 -0x1.4p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:53012 2 OK 0x1.c9cec7ed26196p18 -0x1.4138e959d5e9fp19 0x0.0p0 0x1.4p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:53012 3 OK -0x1.c9cec7ed26196p18 0x1.4138e959d5e9fp19 0x0.0p0 -0x1.4p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:53012 4 OK 0x1.c9cec7ed26196p18 0x1.4138e959d5e9fp19 0x0.0p0 0x1.4p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:53013 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53013 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53013 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53013 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53013 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53014 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53014 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53014 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53014 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53014 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53015 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53015 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53015 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53015 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53015 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53016 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53016 1 OK -0x1.7feb5bbb81e25p18 -0x1.cfb9db246b93fp18 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:53016 2 OK 0x1.7feb5bbb81e25p18 -0x1.cfb9db246b93fp18 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:53016 3 OK -0x1.7feb5bbb81e25p18 0x1.cfb9db246b93fp18 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:53016 4 OK 0x1.7feb5bbb81e25p18 0x1.cfb9db246b93fp18 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:53017 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53017 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53017 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53017 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53017 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53018 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53018 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53018 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53018 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53018 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53019 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53019 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53019 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53019 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53019 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53021 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53021 1 OK -0x1.0e6fb48b2621fp19 -0x1.10801c5a3d07bp19 0x0.0p0 -0x1.4p2 -0x1.400000000001ap2 0x0.0p0 F +REG esri:53021 2 OK 0x1.0e6fb48b2621fp19 -0x1.10801c5a3d07bp19 0x0.0p0 0x1.4p2 -0x1.400000000001ap2 0x0.0p0 F +REG esri:53021 3 OK -0x1.0e6fb48b2621fp19 0x1.10801c5a3d07bp19 0x0.0p0 -0x1.4p2 0x1.400000000001ap2 0x0.0p0 F +REG esri:53021 4 OK 0x1.0e6fb48b2621fp19 0x1.10801c5a3d07bp19 0x0.0p0 0x1.4p2 0x1.400000000001ap2 0x0.0p0 F +REG esri:53022 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53022 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53022 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53022 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53022 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53023 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53023 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53023 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53023 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53023 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53024 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53024 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53024 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53024 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53024 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53025 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53025 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53025 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53025 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53025 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53026 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53026 1 OK -0x1.0f202672846a2p19 -0x1.1029472dcfdcap19 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 T +REG esri:53026 2 OK 0x1.0f202672846a2p19 -0x1.1029472dcfdcap19 0x0.0p0 0x1.3ffffffffffffp2 -0x1.4p2 0x0.0p0 T +REG esri:53026 3 OK -0x1.0f202672846a2p19 0x1.1029472dcfdcap19 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 T +REG esri:53026 4 OK 0x1.0f202672846a2p19 0x1.1029472dcfdcap19 0x0.0p0 0x1.3ffffffffffffp2 0x1.4p2 0x0.0p0 T +REG esri:53027 0 OK 0x0.0p0 0x1.97353e650aac1p21 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:53027 1 OK -0x1.d63409ffaef2p20 0x1.97353e650aac1p20 0x0.0p0 -0x1.1520cd1372feap4 0x1.dffffffffffffp3 0x0.0p0 F +REG esri:53027 2 OK 0x1.d63409ffaef2p20 0x1.97353e650aac1p20 0x0.0p0 0x1.1520cd1372feap4 0x1.dffffffffffffp3 0x0.0p0 F +REG esri:53027 3 OK -0x1.d63409ffaef2p20 0x1.3167eecbc8011p22 0x0.0p0 -0x1.1520cd1372feap4 0x1.68p5 0x0.0p0 F +REG esri:53027 4 OK 0x1.d63409ffaef2p20 0x1.3167eecbc8011p22 0x0.0p0 0x1.1520cd1372feap4 0x1.68p5 0x0.0p0 F +REG esri:53028 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53028 1 OK -0x1.0e6fb40680f11p19 -0x1.1080f13edef1fp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:53028 2 OK 0x1.0e6fb40680f11p19 -0x1.1080f13edef1fp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:53028 3 OK -0x1.0e6fb40680f11p19 0x1.1080f13edef1fp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:53028 4 OK 0x1.0e6fb40680f11p19 0x1.1080f13edef1fp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:53029 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53029 1 OK -0x1.0f432945c723ep19 -0x1.0fb00697d93d1p19 0x0.0p0 -0x1.3fffffffffe85p2 -0x1.4000000022ad3p2 0x0.0p0 F +REG esri:53029 2 OK 0x1.0f432945c723ep19 -0x1.0fb00697d93d1p19 0x0.0p0 0x1.3fffffffffe85p2 -0x1.4000000022ad3p2 0x0.0p0 F +REG esri:53029 3 OK -0x1.0f432945c723ep19 0x1.0fb00697d93d1p19 0x0.0p0 -0x1.3fffffffffe85p2 0x1.4000000022ad3p2 0x0.0p0 F +REG esri:53029 4 OK 0x1.0f432945c723ep19 0x1.0fb00697d93d1p19 0x0.0p0 0x1.3fffffffffe85p2 0x1.4000000022ad3p2 0x0.0p0 F +REG esri:53030 0 OK 0x0.0p0 -0x1.8a62ebd88d293p-35 0x0.0p0 0x0.0p0 -0x1.e3def44f9e5ffp-51 0x0.0p0 T +REG esri:53030 1 OK -0x1.cc26c4dfbf591p18 -0x1.04d22644915adp19 0x0.0p0 -0x1.400000222cecp2 -0x1.400002a10047ap2 0x0.0p0 F +REG esri:53030 2 OK 0x1.cc26c4dfbf591p18 -0x1.04d22644915adp19 0x0.0p0 0x1.400000222cecp2 -0x1.400002a10047ap2 0x0.0p0 F +REG esri:53030 3 OK -0x1.cc26c4dfbf591p18 0x1.04d22644915adp19 0x0.0p0 -0x1.400000222cecp2 0x1.400002a10047ap2 0x0.0p0 F +REG esri:53030 4 OK 0x1.cc26c4dfbf591p18 0x1.04d22644915adp19 0x0.0p0 0x1.400000222cecp2 0x1.400002a10047ap2 0x0.0p0 F +REG esri:53031 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53031 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53031 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53031 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53031 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:53032 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:53032 1 OK -0x1.0ec824ed945d1p19 -0x1.0fd0ef99be658p19 0x0.0p0 -0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x0.0p0 T +REG esri:53032 2 OK 0x1.0ec824ed945d1p19 -0x1.0fd0ef99be658p19 0x0.0p0 0x1.3ffffffffffffp2 -0x1.4000000000001p2 0x0.0p0 T +REG esri:53032 3 OK -0x1.0ec824ed945d1p19 0x1.0fd0ef99be658p19 0x0.0p0 -0x1.3ffffffffffffp2 0x1.4000000000001p2 0x0.0p0 T +REG esri:53032 4 OK 0x1.0ec824ed945d1p19 0x1.0fd0ef99be658p19 0x0.0p0 0x1.3ffffffffffffp2 0x1.4000000000001p2 0x0.0p0 T +REG esri:54001 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54001 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54001 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54001 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54001 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54002 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54002 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54002 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54002 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54002 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54003 0 OK 0x0.0p0 -0x1.e69cfdp-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54003 1 OK -0x1.0fc6ae86e479fp19 -0x1.0fff4462e0b24p19 0x0.0p0 -0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG esri:54003 2 OK 0x1.0fc6ae86e479fp19 -0x1.0fff4462e0b24p19 0x0.0p0 0x1.4p2 -0x1.4000000000008p2 0x0.0p0 F +REG esri:54003 3 OK -0x1.0fc6ae86e479fp19 0x1.0fff4462e0b1cp19 0x0.0p0 -0x1.4p2 0x1.4000000000008p2 0x0.0p0 F +REG esri:54003 4 OK 0x1.0fc6ae86e479fp19 0x1.0fff4462e0b1cp19 0x0.0p0 0x1.4p2 0x1.4000000000008p2 0x0.0p0 F +REG esri:54004 0 OK 0x0.0p0 0x1.854a64p-31 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54004 1 OK -0x1.0fc6ae86e479fp19 -0x1.0e4dfb191d5f6p19 0x0.0p0 -0x1.4p2 -0x1.3fffffffffe13p2 0x0.0p0 F +REG esri:54004 2 OK 0x1.0fc6ae86e479fp19 -0x1.0e4dfb191d5f6p19 0x0.0p0 0x1.4p2 -0x1.3fffffffffe13p2 0x0.0p0 F +REG esri:54004 3 OK -0x1.0fc6ae86e479fp19 0x1.0e4dfb191d5ffp19 0x0.0p0 -0x1.4p2 0x1.3fffffffffe13p2 0x0.0p0 F +REG esri:54004 4 OK 0x1.0fc6ae86e479fp19 0x1.0e4dfb191d5ffp19 0x0.0p0 0x1.4p2 0x1.3fffffffffe13p2 0x0.0p0 F +REG esri:54008 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54008 1 OK -0x1.0ebdedd7f6815p19 -0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:54008 2 OK 0x1.0ebdedd7f6815p19 -0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 F +REG esri:54008 3 OK -0x1.0ebdedd7f6815p19 0x1.0fc6ae86e479fp19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:54008 4 OK 0x1.0ebdedd7f6815p19 0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 F +REG esri:54009 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54009 1 OK -0x1.e838213d6fccap18 -0x1.2db873cbc099ap19 0x0.0p0 -0x1.4p2 -0x1.4000000000002p2 0x0.0p0 F +REG esri:54009 2 OK 0x1.e838213d6fccap18 -0x1.2db873cbc099ap19 0x0.0p0 0x1.4p2 -0x1.4000000000002p2 0x0.0p0 F +REG esri:54009 3 OK -0x1.e838213d6fccap18 0x1.2db873cbc099ap19 0x0.0p0 -0x1.4p2 0x1.4000000000002p2 0x0.0p0 F +REG esri:54009 4 OK 0x1.e838213d6fccap18 0x1.2db873cbc099ap19 0x0.0p0 0x1.4p2 0x1.4000000000002p2 0x0.0p0 F +REG esri:54010 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54010 1 OK -0x1.ddebcae6faeb2p18 -0x1.340f1903baf31p19 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:54010 2 OK 0x1.ddebcae6faeb2p18 -0x1.340f1903baf31p19 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:54010 3 OK -0x1.ddebcae6faeb2p18 0x1.340f1903baf31p19 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:54010 4 OK 0x1.ddebcae6faeb2p18 0x1.340f1903baf31p19 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:54011 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54011 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54011 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54011 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54011 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54012 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54012 1 OK -0x1.ca5212216e528p18 -0x1.4195080fc9059p19 0x0.0p0 -0x1.4p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:54012 2 OK 0x1.ca5212216e528p18 -0x1.4195080fc9059p19 0x0.0p0 0x1.4p2 -0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:54012 3 OK -0x1.ca5212216e528p18 0x1.4195080fc9059p19 0x0.0p0 -0x1.4p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:54012 4 OK 0x1.ca5212216e528p18 0x1.4195080fc9059p19 0x0.0p0 0x1.4p2 0x1.3ffffffffffffp2 0x0.0p0 F +REG esri:54013 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54013 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54013 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54013 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54013 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54014 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54014 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54014 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54014 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54014 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54015 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54015 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54015 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54015 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54015 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54016 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54016 1 OK -0x1.80597561be51ep18 -0x1.d03ed7d6c3341p18 0x0.0p0 -0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:54016 2 OK 0x1.80597561be51ep18 -0x1.d03ed7d6c3341p18 0x0.0p0 0x1.4000000000001p2 -0x1.4p2 0x0.0p0 F +REG esri:54016 3 OK -0x1.80597561be51ep18 0x1.d03ed7d6c3341p18 0x0.0p0 -0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:54016 4 OK 0x1.80597561be51ep18 0x1.d03ed7d6c3341p18 0x0.0p0 0x1.4000000000001p2 0x1.4p2 0x0.0p0 F +REG esri:54017 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54017 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54017 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54017 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54017 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54018 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54018 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54018 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54018 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54018 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54019 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54019 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54019 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54019 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54019 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54021 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54021 1 OK -0x1.0ebd42c676eeep19 -0x1.10ce421ebb4cp19 0x0.0p0 -0x1.4p2 -0x1.400000000001ap2 0x0.0p0 F +REG esri:54021 2 OK 0x1.0ebd42c676eeep19 -0x1.10ce421ebb4cp19 0x0.0p0 0x1.4p2 -0x1.400000000001ap2 0x0.0p0 F +REG esri:54021 3 OK -0x1.0ebd42c676eeep19 0x1.10ce421ebb4cp19 0x0.0p0 -0x1.4p2 0x1.400000000001ap2 0x0.0p0 F +REG esri:54021 4 OK 0x1.0ebd42c676eeep19 0x1.10ce421ebb4cp19 0x0.0p0 0x1.4p2 0x1.400000000001ap2 0x0.0p0 F +REG esri:54022 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54022 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54022 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54022 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54022 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54023 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54023 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54023 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54023 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54023 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54024 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54024 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54024 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54024 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54024 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54025 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54025 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54025 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54025 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54025 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54026 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54026 1 OK -0x1.0f6fabc9129a2p19 -0x1.0ea6271e6deb4p19 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54026 2 OK 0x1.0f6fabc9129a2p19 -0x1.0ea6271e6deb4p19 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54026 3 OK -0x1.0f6fabc9129a2p19 0x1.0ea6271e6dea8p19 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54026 4 OK 0x1.0f6fabc9129a2p19 0x1.0ea6271e6dea8p19 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54027 0 OK 0x0.0p0 0x1.97aa05ca56b6ep21 0x0.0p0 0x0.0p0 0x1.dffffffffffffp4 0x0.0p0 F +REG esri:54027 1 OK -0x1.d6bae23a6f76dp20 0x1.97aa05ca56b6ep20 0x0.0p0 -0x1.1520cd1372feap4 0x1.dffffffffffffp3 0x0.0p0 F +REG esri:54027 2 OK 0x1.d6bae23a6f76dp20 0x1.97aa05ca56b6ep20 0x0.0p0 0x1.1520cd1372feap4 0x1.dffffffffffffp3 0x0.0p0 F +REG esri:54027 3 OK -0x1.d6bae23a6f76dp20 0x1.31bf8457c1093p22 0x0.0p0 -0x1.1520cd1372feap4 0x1.6800000000001p5 0x0.0p0 F +REG esri:54027 4 OK 0x1.d6bae23a6f76dp20 0x1.31bf8457c1093p22 0x0.0p0 0x1.1520cd1372feap4 0x1.6800000000001p5 0x0.0p0 F +REG esri:54028 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54028 1 OK -0x1.0ebf0671ae67p19 -0x1.0eff19ef4f18fp19 0x0.0p0 -0x1.400001396f094p2 -0x1.3fffff3fcf228p2 0x0.0p0 F +REG esri:54028 2 OK 0x1.0ebf0671ae67p19 -0x1.0eff19ef4f18fp19 0x0.0p0 0x1.400001396f094p2 -0x1.3fffff3fcf228p2 0x0.0p0 F +REG esri:54028 3 OK -0x1.0ebf0671ae67p19 0x1.0eff19ef4f18fp19 0x0.0p0 -0x1.400001396f094p2 0x1.3fffff3fcf228p2 0x0.0p0 F +REG esri:54028 4 OK 0x1.0ebf0671ae67p19 0x1.0eff19ef4f18fp19 0x0.0p0 0x1.400001396f094p2 0x1.3fffff3fcf228p2 0x0.0p0 F +REG esri:54029 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54029 1 OK -0x1.0f90f4253fb32p19 -0x1.0ffdf0afab22ap19 0x0.0p0 -0x1.3fffffffffe86p2 -0x1.4000000022ad3p2 0x0.0p0 F +REG esri:54029 2 OK 0x1.0f90f4253fb32p19 -0x1.0ffdf0afab22ap19 0x0.0p0 0x1.3fffffffffe86p2 -0x1.4000000022ad3p2 0x0.0p0 F +REG esri:54029 3 OK -0x1.0f90f4253fb32p19 0x1.0ffdf0afab22ap19 0x0.0p0 -0x1.3fffffffffe86p2 0x1.4000000022ad3p2 0x0.0p0 F +REG esri:54029 4 OK 0x1.0f90f4253fb32p19 0x1.0ffdf0afab22ap19 0x0.0p0 0x1.3fffffffffe86p2 0x1.4000000022ad3p2 0x0.0p0 F +REG esri:54030 0 OK 0x0.0p0 -0x1.8ad405f05bf07p-35 0x0.0p0 0x0.0p0 -0x1.e3def44f9e5ffp-51 0x0.0p0 T +REG esri:54030 1 OK -0x1.ccaabb247b116p18 -0x1.051cf2936d6bfp19 0x0.0p0 -0x1.400000222cecp2 -0x1.400002a10047ap2 0x0.0p0 F +REG esri:54030 2 OK 0x1.ccaabb247b116p18 -0x1.051cf2936d6bfp19 0x0.0p0 0x1.400000222cecp2 -0x1.400002a10047ap2 0x0.0p0 F +REG esri:54030 3 OK -0x1.ccaabb247b116p18 0x1.051cf2936d6bfp19 0x0.0p0 -0x1.400000222cecp2 0x1.400002a10047ap2 0x0.0p0 F +REG esri:54030 4 OK 0x1.ccaabb247b116p18 0x1.051cf2936d6bfp19 0x0.0p0 0x1.400000222cecp2 0x1.400002a10047ap2 0x0.0p0 F +REG esri:54031 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54031 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54031 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54031 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54031 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG esri:54032 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 0x0.0p0 T +REG esri:54032 1 OK -0x1.0f16f9abc5758p19 -0x1.0e4ee3d2feed5p19 0x0.0p0 -0x1.4p2 -0x1.4p2 0x0.0p0 T +REG esri:54032 2 OK 0x1.0f16f9abc5758p19 -0x1.0e4ee3d2feed5p19 0x0.0p0 0x1.4p2 -0x1.4p2 0x0.0p0 T +REG esri:54032 3 OK -0x1.0f16f9abc5758p19 0x1.0e4ee3d2feed5p19 0x0.0p0 -0x1.4p2 0x1.4p2 0x0.0p0 T +REG esri:54032 4 OK 0x1.0f16f9abc5758p19 0x1.0e4ee3d2feed5p19 0x0.0p0 0x1.4p2 0x1.4p2 0x0.0p0 T +REG esri:65061 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.4064d55555557p17 0x1.4064d55555557p17 0x0.0p0 NaN NaN NaN F +REG esri:65061 1 OK -0x1.9d617fd4fc7a3p20 -0x1.92c8c04d9d00bp20 0x0.0p0 -0x1.2bb4c17c95964p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG esri:65061 2 OK 0x1.ed7ab52a51d21p20 -0x1.92c8c04d9d00bp20 0x0.0p0 -0x1.1749f704af494p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG esri:65061 3 OK -0x1.8ab7b67bf4819p20 0x1.ec0fb43d24c22p20 0x0.0p0 -0x1.2b4995e75e3c2p7 0x1.434355006168ap2 0x0.0p0 F +REG esri:65061 4 OK 0x1.dad0ebd149d95p20 0x1.ec0fb43d24c22p20 0x0.0p0 -0x1.17b52299e6a36p7 0x1.434355006168ap2 0x0.0p0 F +REG esri:65161 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.86ap15 0x1.86ap15 0x0.0p0 NaN NaN NaN F +REG esri:65161 1 OK -0x1.f7fd2abe326eep18 -0x1.eb11d053f422ap18 0x0.0p0 -0x1.2bb4c17c95964p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG esri:65161 2 OK 0x1.2cd2955f1938fp19 -0x1.eb11d053f422ap18 0x0.0p0 -0x1.1749f704af494p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG esri:65161 3 OK -0x1.e13c24314e4p18 0x1.2bf54c66a7bcbp19 0x0.0p0 -0x1.2b4995e75e3c2p7 0x1.434355006168ap2 0x0.0p0 F +REG esri:65161 4 OK 0x1.21721218a7216p19 0x1.2bf54c66a7bcbp19 0x0.0p0 -0x1.17b52299e6a36p7 0x1.434355006168ap2 0x0.0p0 F +REG nad27:1001 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG nad27:1001 1 OK -0x1.a4ec877217084p18 -0x1.086b5287aae6fp19 0x0.0p0 -0x1.5fc2bbc1b8814p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG nad27:1001 2 OK 0x1.674a573ae5ef5p19 -0x1.086b5287aae6ep19 0x0.0p0 -0x1.319299939cd42p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG nad27:1001 3 OK -0x1.6e21ac9ddce98p18 0x1.16297c46ddd76p19 0x0.0p0 -0x1.5fc2bbc1b8149p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG nad27:1001 4 OK 0x1.4be4e9d0c8dfep19 0x1.16297c46ddd77p19 0x0.0p0 -0x1.319299939d40dp6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG nad27:1002 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG nad27:1002 1 OK -0x1.a4ec87721709ap18 -0x1.086b5287aae6ep19 0x0.0p0 -0x1.67c2bbc1b8815p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG nad27:1002 2 OK 0x1.674a573ae5eeap19 -0x1.086b5287aae6fp19 0x0.0p0 -0x1.399299939cd42p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG nad27:1002 3 OK -0x1.6e21ac9ddceacp18 0x1.16297c46ddd77p19 0x0.0p0 -0x1.67c2bbc1b8149p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG nad27:1002 4 OK 0x1.4be4e9d0c8df4p19 0x1.16297c46ddd76p19 0x0.0p0 -0x1.399299939d40dp6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG nad27:101 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG nad27:101 1 OK -0x1.a584ec4d3d46cp18 -0x1.084db243d2dcep19 0x0.0p0 -0x1.6e8b909db4109p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG nad27:101 2 OK 0x1.679689a8790d3p19 -0x1.084db243d2dcep19 0x0.0p0 -0x1.401f1a0cf69a2p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG nad27:101 3 OK -0x1.6d9c3ead8e13cp18 0x1.1652db0c5704ap19 0x0.0p0 -0x1.6e8b909db0aa7p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG nad27:101 4 OK 0x1.4ba232d8a173cp19 0x1.1652db0c5704ap19 0x0.0p0 -0x1.401f1a0cfa004p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG nad27:102 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG nad27:102 1 OK -0x1.a4f1643692786p18 -0x1.086d94386815dp19 0x0.0p0 -0x1.751811170dd69p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG nad27:102 2 OK 0x1.674cc59d23a6bp19 -0x1.086d94386815dp19 0x0.0p0 -0x1.46e7eee8f2297p6 0x1.8fffffffc7864p4 0x0.0p0 F +REG nad27:102 3 OK -0x1.6e2611ad2612ep18 0x1.162bdbfdeb3p19 0x0.0p0 -0x1.751811170d69ep6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG nad27:102 4 OK 0x1.4be71c586d73fp19 0x1.162bdbfdeb3p19 0x0.0p0 -0x1.46e7eee8f2963p6 0x1.17ffffffc1a91p5 0x0.0p0 F +REG nad27:1101 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaabp6 0x1.4d55555555555p5 0x0.0p0 F +REG nad27:1101 1 OK -0x1.b3e0f74bc7cd8p18 -0x1.04cc6b0d0bcap19 0x0.0p0 -0x1.db708506b141dp6 0x1.25555554adcd4p5 0x0.0p0 F +REG nad27:1101 2 OK 0x1.6ec48f27be514p19 -0x1.04cc6b0d0bcap19 0x0.0p0 -0x1.a5e4d04ea413ap6 0x1.25555554adcd4p5 0x0.0p0 F +REG nad27:1101 3 OK -0x1.5f4e1bd7a6a57p18 0x1.19e8b8d4c0148p19 0x0.0p0 -0x1.db70850623ab6p6 0x1.75555554471d6p5 0x0.0p0 F +REG nad27:1101 4 OK 0x1.447b216dadbd4p19 0x1.19e8b8d4c0148p19 0x0.0p0 -0x1.a5e4d04f31a9fp6 0x1.75555554471d6p5 0x0.0p0 F +REG nad27:1102 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555555p5 0x0.0p0 F +REG nad27:1102 1 OK -0x1.b3e0f74bc7cd8p18 -0x1.04cc6b0d0bcap19 0x0.0p0 -0x1.e2c5da5c06973p6 0x1.25555554adcd4p5 0x0.0p0 F +REG nad27:1102 2 OK 0x1.6ec48f27be51ep19 -0x1.04cc6b0d0bcap19 0x0.0p0 -0x1.ad3a25a3f968fp6 0x1.25555554adcd4p5 0x0.0p0 F +REG nad27:1102 3 OK -0x1.5f4e1bd7a6a57p18 0x1.19e8b8d4c0148p19 0x0.0p0 -0x1.e2c5da5b7900cp6 0x1.75555554471d6p5 0x0.0p0 F +REG nad27:1102 4 OK 0x1.447b216dadbdcp19 0x1.19e8b8d4c0149p19 0x0.0p0 -0x1.ad3a25a486ff3p6 0x1.75555554471d6p5 0x0.0p0 F +REG nad27:1103 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555555p5 0x0.0p0 F +REG nad27:1103 1 OK -0x1.b3dedd73b4eb2p18 -0x1.04cb7b27aaecep19 0x0.0p0 -0x1.e9c5da5c06972p6 0x1.25555554adcd4p5 0x0.0p0 F +REG nad27:1103 2 OK 0x1.6ec3823bb4e01p19 -0x1.04cb7b27aaecep19 0x0.0p0 -0x1.b43a25a3f968fp6 0x1.25555554adcd4p5 0x0.0p0 F +REG nad27:1103 3 OK -0x1.5f4c4fcb28eb5p18 0x1.19e7b5843671dp19 0x0.0p0 -0x1.e9c5da5b7900cp6 0x1.75555554471d6p5 0x0.0p0 F +REG nad27:1103 4 OK 0x1.447a3b676ee02p19 0x1.19e7b5843671dp19 0x0.0p0 -0x1.b43a25a486ff4p6 0x1.75555554471d6p5 0x0.0p0 F +REG nad27:1201 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555555p5 0x0.0p0 F +REG nad27:1201 1 OK -0x1.acf80a2b30d72p18 -0x1.06879d777c538p19 0x0.0p0 -0x1.7a44648b879a6p6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG nad27:1201 2 OK 0x1.6b50189772d57p19 -0x1.06879d777c538p19 0x0.0p0 -0x1.4866461f23105p6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG nad27:1201 3 OK -0x1.66415b0c223d4p18 0x1.1837d96f885f9p19 0x0.0p0 -0x1.7a44648b4d3d2p6 0x1.4d555554c1c22p5 0x0.0p0 F +REG nad27:1201 4 OK 0x1.47f4c107eb888p19 0x1.1837d96f885f9p19 0x0.0p0 -0x1.4866461f5d6d8p6 0x1.4d555554c1c22p5 0x0.0p0 F +REG nad27:1202 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555555p5 0x0.0p0 F +REG nad27:1202 1 OK -0x1.acf3095b6e19p18 -0x1.06855783687a7p19 0x0.0p0 -0x1.8199b9e0dcefbp6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG nad27:1202 2 OK 0x1.6b4d982f9177bp19 -0x1.06855783687a7p19 0x0.0p0 -0x1.4fbb9b747865bp6 0x1.faaaaaaa12988p4 0x0.0p0 F +REG nad27:1202 3 OK -0x1.663cf6fcd9c1fp18 0x1.18356c45a760ap19 0x0.0p0 -0x1.8199b9e0a2928p6 0x1.4d555554c1c22p5 0x0.0p0 F +REG nad27:1202 4 OK 0x1.47f28f00474cp19 0x1.18356c45a760ap19 0x0.0p0 -0x1.4fbb9b74b2c2ep6 0x1.4d555554c1c22p5 0x0.0p0 F +REG nad27:1301 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG nad27:1301 1 OK -0x1.ae0e18fd8703ap18 -0x1.0642c8fe95364p19 0x0.0p0 -0x1.6fe04911dfa77p6 0x1.03ffffffa954bp5 0x0.0p0 F +REG nad27:1301 2 OK 0x1.6bdb20009decfp19 -0x1.0642c8fe95363p19 0x0.0p0 -0x1.3d750c4375adfp6 0x1.03ffffffa954ap5 0x0.0p0 F +REG nad27:1301 3 OK -0x1.652a0af3e4479p18 0x1.187cce44b1146p19 0x0.0p0 -0x1.6fe049119a84cp6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG nad27:1301 4 OK 0x1.476918fbcc8eep19 0x1.187cce44b1147p19 0x0.0p0 -0x1.3d750c43bad0ap6 0x1.53ffffff5c59p5 0x0.0p0 F +REG nad27:1302 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG nad27:1302 1 OK -0x1.ae0e18fd8703ap18 -0x1.0642c8fe95364p19 0x0.0p0 -0x1.758af3bc8a52p6 0x1.03ffffffa954bp5 0x0.0p0 F +REG nad27:1302 2 OK 0x1.6bdb20009dec5p19 -0x1.0642c8fe95364p19 0x0.0p0 -0x1.431fb6ee2058ap6 0x1.03ffffffa954bp5 0x0.0p0 F +REG nad27:1302 3 OK -0x1.652a0af3e4479p18 0x1.187cce44b1146p19 0x0.0p0 -0x1.758af3bc452f5p6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG nad27:1302 4 OK 0x1.476918fbcc8e4p19 0x1.187cce44b1146p19 0x0.0p0 -0x1.431fb6ee657b5p6 0x1.53ffffff5c58fp5 0x0.0p0 F +REG nad27:1401 0 OK 0x1.29a82703b4d5p19 0x1.7f43c710c6234p16 0x0.0p0 -0x1.76p6 0x1.53111111110fep5 0x0.0p0 F +REG nad27:1401 1 OK 0x1.8d92ae84d7b56p18 -0x1.74225da0932f6p16 0x0.0p0 -0x1.7f9125dd29e12p6 0x1.44eeeeeeeeed7p5 0x0.0p0 F +REG nad27:1401 2 OK 0x1.8c86f6c4fdcf5p19 -0x1.74225da0932f6p16 0x0.0p0 -0x1.6c6eda22d61eep6 0x1.44eeeeeeeeed7p5 0x0.0p0 F +REG nad27:1401 3 OK 0x1.986a9c11aeb4fp18 0x1.2223760ed7223p18 0x0.0p0 -0x1.7f9125dd29e12p6 0x1.6133333333326p5 0x0.0p0 F +REG nad27:1401 4 OK 0x1.871afffe924f8p19 0x1.2223760ed7223p18 0x0.0p0 -0x1.6c6eda22d61eep6 0x1.6133333333326p5 0x0.0p0 F +REG nad27:1402 0 OK 0x1.29a82703b4d5p19 0x1.82c84441ff8cdp16 0x0.0p0 -0x1.76p6 0x1.4722222222209p5 0x0.0p0 F +REG nad27:1402 1 OK 0x1.8bf2f82397efep18 -0x1.78082398a144ap16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddbfp5 0x0.0p0 F +REG nad27:1402 2 OK 0x1.8d56d1f59db18p19 -0x1.78082398a144ap16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddbfp5 0x0.0p0 F +REG nad27:1402 3 OK 0x1.96707be1867a4p18 0x1.24b16323050a5p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666652p5 0x0.0p0 F +REG nad27:1402 4 OK 0x1.88181016a66c5p19 0x1.24b16323050a5p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666652p5 0x0.0p0 F +REG nad27:1501 0 OK 0x1.29a82703b4d5p19 0x1.3a6133717b0dfp16 0x0.0p0 -0x1.88p6 0x1.387777777775ap5 0x0.0p0 F +REG nad27:1501 1 OK 0x1.b23ed32956d23p18 -0x1.33c2a10197cf4p16 0x0.0p0 -0x1.8f7828773d561p6 0x1.2cdddddddddb9p5 0x0.0p0 F +REG nad27:1501 2 OK 0x1.7a30e472be405p19 -0x1.33c2a10197cf4p16 0x0.0p0 -0x1.8087d788c2a9fp6 0x1.2cdddddddddb9p5 0x0.0p0 F +REG nad27:1501 3 OK 0x1.b8ba82816f05p18 0x1.dad279ad75bfbp17 0x0.0p0 -0x1.8f7828773d561p6 0x1.44111111110f8p5 0x0.0p0 F +REG nad27:1501 4 OK 0x1.76f30cc6b226fp19 0x1.dad279ad75bfbp17 0x0.0p0 -0x1.8087d788c2a9fp6 0x1.44111111110f8p5 0x0.0p0 F +REG nad27:1502 0 OK 0x1.29a82703b4d5p19 0x1.9bd8e018006dbp16 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeec8p5 0x0.0p0 F +REG nad27:1502 1 OK 0x1.7f3c7891dad92p18 -0x1.9103d4862152ap16 0x0.0p0 -0x1.939837c9c43e7p6 0x1.1dbbbbbbbbb8cp5 0x0.0p0 F +REG nad27:1502 2 OK 0x1.93b211be7c3e1p19 -0x1.9103d4862152ap16 0x0.0p0 -0x1.8067c8363bc19p6 0x1.1dbbbbbbbbb8cp5 0x0.0p0 F +REG nad27:1502 3 OK 0x1.89d519aab88edp18 0x1.3787885d8d176p18 0x0.0p0 -0x1.939837c9c43e7p6 0x1.3c22222222206p5 0x0.0p0 F +REG nad27:1502 4 OK 0x1.8e65c1320d633p19 0x1.3787885d8d176p18 0x0.0p0 -0x1.8067c8363bc19p6 0x1.3c22222222206p5 0x0.0p0 F +REG nad27:1601 0 OK 0x1.29a82703b4d5p19 0x1.3df3b281b93cp16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbcp5 0x0.0p0 F +REG nad27:1601 1 OK 0x1.b074b2be4cd42p18 -0x1.37606bd1592a6p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221f8p5 0x0.0p0 F +REG nad27:1601 2 OK 0x1.7b15f4a8433ffp19 -0x1.37606bd1592a6p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221f8p5 0x0.0p0 F +REG nad27:1601 3 OK 0x1.b6e6daba3bcc6p18 0x1.e029208081674p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999997ep5 0x0.0p0 F +REG nad27:1601 4 OK 0x1.77dce0aa4bc3dp19 0x1.e029208081674p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999997ep5 0x0.0p0 F +REG nad27:1602 0 OK 0x1.29a82703b4d5p19 0x1.5ac8b6286095p16 0x0.0p0 -0x1.57p6 0x1.29111111110e9p5 0x0.0p0 F +REG nad27:1602 1 OK 0x1.a17f992ab316cp18 -0x1.534401db2dd25p16 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c44444444415p5 0x0.0p0 F +REG nad27:1602 2 OK 0x1.82908172101ep19 -0x1.534401db2dd25p16 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c44444444415p5 0x0.0p0 F +REG nad27:1602 3 OK 0x1.a8dd9b94c58f6p18 0x1.05f03db4a2e7ep18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG nad27:1602 4 OK 0x1.7ee1803d06e1bp19 0x1.05f03db4a2e7ep18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG nad27:1701 0 OK 0x1.29a82703b4d5p19 0x1.b115f72bf3fc8p16 0x0.0p0 -0x1.72p6 0x1.faaaaaaaaaa1bp4 0x0.0p0 F +REG nad27:1701 1 OK 0x1.75067d46e96ep18 -0x1.a78a838e04eb7p16 0x0.0p0 -0x1.7b66402708f88p6 0x1.daaaaaaaaaa05p4 0x0.0p0 F +REG nad27:1701 2 OK 0x1.98cd0f63f4f26p19 -0x1.a78a838e04eb7p16 0x0.0p0 -0x1.6899bfd8f7078p6 0x1.daaaaaaaaaa05p4 0x0.0p0 F +REG nad27:1701 3 OK 0x1.7e6acf364437fp18 0x1.472ec96776622p18 0x0.0p0 -0x1.7b66402708f88p6 0x1.0d5555555551cp5 0x0.0p0 F +REG nad27:1701 4 OK 0x1.941ae66c478d6p19 0x1.472ec96776622p18 0x0.0p0 -0x1.6899bfd8f7078p6 0x1.0d5555555551cp5 0x0.0p0 F +REG nad27:1702 0 OK 0x1.29a82703b4d5p19 0x1.b82e7a19e2aadp16 0x0.0p0 -0x1.6d55555555555p6 0x1.daeeeeeeeee4bp4 0x0.0p0 F +REG nad27:1702 1 OK 0x1.719daa7856ba9p18 -0x1.af130871d71acp16 0x0.0p0 -0x1.76b1f683c31b2p6 0x1.ba666666665a8p4 0x0.0p0 F +REG nad27:1702 2 OK 0x1.9a8178cb3e4ccp19 -0x1.af130871d71acp16 0x0.0p0 -0x1.63f8b426e78f8p6 0x1.ba666666665a8p4 0x0.0p0 F +REG nad27:1702 3 OK 0x1.7a9b8aeb734bp18 0x1.4c67416d93c6ap18 0x0.0p0 -0x1.76b1f683c31b2p6 0x1.fb777777776eap4 0x0.0p0 F +REG nad27:1702 4 OK 0x1.96028891b0048p19 0x1.4c67416d93c6ap18 0x0.0p0 -0x1.63f8b426e78f8p6 0x1.fb777777776eap4 0x0.0p0 F +REG nad27:1703 0 OK 0x1.29a82703b4d5p19 0x1.d4d34b840d407p16 0x0.0p0 -0x1.6d55555555555p6 0x1.abfffffffff31p4 0x0.0p0 F +REG nad27:1703 1 OK 0x1.6323da11b4058p18 -0x1.cbb93cf477d68p16 0x0.0p0 -0x1.7709e6ac1bc4ep6 0x1.8955555555471p4 0x0.0p0 F +REG nad27:1703 2 OK 0x1.a1be60fe8fa74p19 -0x1.cbb93cf477d68p16 0x0.0p0 -0x1.63a0c3fe8ee5cp6 0x1.8955555555471p4 0x0.0p0 F +REG nad27:1703 3 OK 0x1.6c27b53ae91aep18 0x1.61e8b5f475a14p18 0x0.0p0 -0x1.7709e6ac1bc4ep6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG nad27:1703 4 OK 0x1.9d3c7369f51c9p19 0x1.61e8b5f475a14p18 0x0.0p0 -0x1.63a0c3fe8ee5cp6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG nad27:1801 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5eaaaaaaaaaabp5 0x0.0p0 F +REG nad27:1801 1 OK -0x1.b72cf8cdb2e62p18 -0x1.03ee4637a3abbp19 0x0.0p0 -0x1.2db9bac64d549p6 0x1.36aaaaa9beeb5p5 0x0.0p0 F +REG nad27:1801 2 OK 0x1.706a8fe8b3dd9p19 -0x1.03ee4637a3abbp19 0x0.0p0 -0x1.ec8c8a736556ep5 0x1.36aaaaa9beeb5p5 0x0.0p0 F +REG nad27:1801 3 OK -0x1.5beb62ee315e9p18 0x1.1ab039e6f35e8p19 0x0.0p0 -0x1.2db9bac5889c8p6 0x1.86aaaaa94f709p5 0x0.0p0 F +REG nad27:1801 4 OK 0x1.42c9c4f8f319cp19 0x1.1ab039e6f35e8p19 0x0.0p0 -0x1.ec8c8a74eec72p5 0x1.86aaaaa94f709p5 0x0.0p0 F +REG nad27:1802 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaabp5 0x0.0p0 F +REG nad27:1802 1 OK -0x1.b5a71c0ea4252p18 -0x1.045a3434c21cdp19 0x0.0p0 -0x1.33f07961a4db4p6 0x1.2eaaaaa9e1402p5 0x0.0p0 F +REG nad27:1802 2 OK 0x1.6fa7a1892c7dap19 -0x1.045a3434c21ccp19 0x0.0p0 -0x1.fac9b7e760f43p5 0x1.2eaaaaa9e1402p5 0x0.0p0 F +REG nad27:1802 3 OK -0x1.5d88f2c6e8c49p18 0x1.1a562f40c6366p19 0x0.0p0 -0x1.33f07960fb83cp6 0x1.7eaaaaa97520fp5 0x0.0p0 F +REG nad27:1802 4 OK 0x1.43988ce54ecd4p19 0x1.1a562f40c6367p19 0x0.0p0 -0x1.fac9b7e8b3a32p5 0x1.7eaaaaa97520fp5 0x0.0p0 F +REG nad27:1900 0 OK 0x1.dc403e6c54882p17 0x1.5e7da930680cap16 0x0.0p0 -0x1.34p6 0x1.3522222222201p5 0x0.0p0 F +REG nad27:1900 1 OK 0x1.d188c0a69bfbcp15 -0x1.565f08cf6a947p16 0x0.0p0 -0x1.3c477eb6c7663p6 0x1.283333333330dp5 0x0.0p0 F +REG nad27:1900 2 OK 0x1.a20f26578109ep18 -0x1.565f08cf6a947p16 0x0.0p0 -0x1.2bb881493899dp6 0x1.283333333330dp5 0x0.0p0 F +REG nad27:1900 3 OK 0x1.088e5cb071d68p16 0x1.08db774c4752dp18 0x0.0p0 -0x1.3c477eb6c7663p6 0x1.42111111110f6p5 0x0.0p0 F +REG nad27:1900 4 OK 0x1.9a1ca7403813bp18 0x1.08db774c4752dp18 0x0.0p0 -0x1.2bb881493899dp6 0x1.42111111110f6p5 0x0.0p0 F +REG nad27:2001 0 OK 0x1.65302ed13f66p17 0x1.6d29ee3b110d6p16 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba7p5 0x0.0p0 F +REG nad27:2001 1 OK -0x1.2fbfb427e816p13 -0x1.63414705880b1p16 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.4144444444429p5 0x0.0p0 F +REG nad27:2001 2 OK 0x1.6eae2c727ea6bp18 -0x1.63414705880b1p16 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.4144444444429p5 0x0.0p0 F +REG nad27:2001 3 OK 0x1.738556d2accp7 0x1.144583b12c92bp18 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG nad27:2001 4 OK 0x1.6501be2665106p18 0x1.144583b12c92bp18 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG nad27:2002 0 OK 0x1.dc403e6c5488p15 0x1.a359bc305ee6ep14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeed9p5 0x0.0p0 F +REG nad27:2002 1 OK -0x1.9801089863062p15 -0x1.4594671a8a28dp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG nad27:2002 2 OK 0x1.5420615c43058p17 -0x1.4594671a8a28dp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed7p5 0x0.0p0 F +REG nad27:2002 3 OK -0x1.7d60627f3577p15 0x1.0eff6474bd635p17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG nad27:2002 4 OK 0x1.4d7837d5f7a1cp17 0x1.0eff6474bd635p17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG nad27:201 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaabp6 0x1.fp4 0x0.0p0 F +REG nad27:201 1 OK -0x1.a60d3ea1b6042p18 -0x1.0827891e720acp19 0x0.0p0 -0x1.cfffd464bd7ddp6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:201 2 OK 0x1.67dab2d2b56c9p19 -0x1.0827891e720acp19 0x0.0p0 -0x1.a15580f097d78p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:201 3 OK -0x1.6d057cd7a1a94p18 0x1.1673f8d780bf1p19 0x0.0p0 -0x1.cfffd464b6eeep6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:201 4 OK 0x1.4b56d1edab3f2p19 0x1.1673f8d780bf1p19 0x0.0p0 -0x1.a15580f09e667p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:202 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaabp6 0x1.fp4 0x0.0p0 F +REG nad27:202 1 OK -0x1.a60d3ea1b6058p18 -0x1.0827891e720acp19 0x0.0p0 -0x1.d6ffd464bd7dep6 0x1.9fffffffbf24cp4 0x0.0p0 F +REG nad27:202 2 OK 0x1.67dab2d2b56c9p19 -0x1.0827891e720acp19 0x0.0p0 -0x1.a85580f097d79p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:202 3 OK -0x1.6d057cd7a1aa8p18 0x1.1673f8d780bf2p19 0x0.0p0 -0x1.d6ffd464b6eefp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:202 4 OK 0x1.4b56d1edab3f2p19 0x1.1673f8d780bf1p19 0x0.0p0 -0x1.a85580f09e667p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:203 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG nad27:203 1 OK -0x1.a6121ddcf70d2p18 -0x1.0829ca3b16542p19 0x0.0p0 -0x1.de5529ba12d32p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:203 2 OK 0x1.67dd227055f11p19 -0x1.0829ca3b16542p19 0x0.0p0 -0x1.afaad645ed2cep6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:203 3 OK -0x1.6d09df7a0a408p18 0x1.167659314a2cbp19 0x0.0p0 -0x1.de5529ba0c443p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:203 4 OK 0x1.4b59033edf8acp19 0x1.167659314a2cbp19 0x0.0p0 -0x1.afaad645f3bbcp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:2101 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 0x0.0p0 F +REG nad27:2101 1 OK -0x1.b3a11b1750622p18 -0x1.04dc2ecd4cd6fp19 0x0.0p0 -0x1.695eda12c9f02p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG nad27:2101 2 OK 0x1.6ea4a10d829c2p19 -0x1.04dc2ecd4cd6fp19 0x0.0p0 -0x1.33f67b428b653p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG nad27:2101 3 OK -0x1.5f8d3490ddfa4p18 0x1.19d92db35dbdp19 0x0.0p0 -0x1.695eda123ffe3p6 0x1.73fffffef7047p5 0x0.0p0 F +REG nad27:2101 4 OK 0x1.449aadca49682p19 0x1.19d92db35dbd1p19 0x0.0p0 -0x1.33f67b4315573p6 0x1.73fffffef7047p5 0x0.0p0 F +REG nad27:2102 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.57p6 0x1.4cp5 0x0.0p0 F +REG nad27:2102 1 OK -0x1.b39c0dab18b0ap18 -0x1.04d9ed82ba7c8p19 0x0.0p0 -0x1.71b42f681f458p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG nad27:2102 2 OK 0x1.6ea21a5766c23p19 -0x1.04d9ed82ba7c8p19 0x0.0p0 -0x1.3c4bd097e0ba9p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG nad27:2102 3 OK -0x1.5f88e135b1d6dp18 0x1.19d6bdf631203p19 0x0.0p0 -0x1.71b42f6795538p6 0x1.73fffffef7047p5 0x0.0p0 F +REG nad27:2102 4 OK 0x1.4498841cb3556p19 0x1.19d6bdf631202p19 0x0.0p0 -0x1.3c4bd0986aac8p6 0x1.73fffffef7047p5 0x0.0p0 F +REG nad27:2103 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.63p6 0x1.4cp5 0x0.0p0 F +REG nad27:2103 1 OK -0x1.b39c0dab18b0ap18 -0x1.04d9ed82ba7c8p19 0x0.0p0 -0x1.7db42f681f458p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG nad27:2103 2 OK 0x1.6ea21a5766c2dp19 -0x1.04d9ed82ba7c8p19 0x0.0p0 -0x1.484bd097e0ba8p6 0x1.23ffffff5cd38p5 0x0.0p0 F +REG nad27:2103 3 OK -0x1.5f88e135b1d6dp18 0x1.19d6bdf631203p19 0x0.0p0 -0x1.7db42f6795539p6 0x1.73fffffef7047p5 0x0.0p0 F +REG nad27:2103 4 OK 0x1.4498841cb355ep19 0x1.19d6bdf631203p19 0x0.0p0 -0x1.484bd0986aac7p6 0x1.73fffffef7047p5 0x0.0p0 F +REG nad27:2111 0 OK 0x1.29a82703b4d5p19 0x1.f34bcf68eada3p16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776dp5 0x0.0p0 F +REG nad27:2111 1 OK 0x1.4e821a78ad288p18 -0x1.ddb03d39ff6fcp16 0x0.0p0 -0x1.693a5d9ac6985p6 0x1.5d11111111101p5 0x0.0p0 F +REG nad27:2111 2 OK 0x1.ac0f40cb13153p19 -0x1.ddb03d39ff75dp16 0x0.0p0 -0x1.4ec5a2653967cp6 0x1.5d111111110ffp5 0x0.0p0 F +REG nad27:2111 3 OK 0x1.635639d20711ep18 0x1.7b8f4aa872e3bp18 0x0.0p0 -0x1.693a5d9ac6985p6 0x1.81dddddddd514p5 0x0.0p0 F +REG nad27:2111 4 OK 0x1.a1a5311e66208p19 0x1.7b8f4aa872e2fp18 0x0.0p0 -0x1.4ec5a2653967cp6 0x1.81dddddddd514p5 0x0.0p0 F +REG nad27:2112 0 OK 0x1.29a82703b4d5p19 0x1.02a339637adeap17 0x0.0p0 -0x1.5155555555555p6 0x1.6411111111105p5 0x0.0p0 F +REG nad27:2112 1 OK 0x1.453566c14c5a6p18 -0x1.ef343184ae15ep16 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.50fffffffffecp5 0x0.0p0 F +REG nad27:2112 2 OK 0x1.b0b59aa6c37cdp19 -0x1.ef343184ae15ep16 0x0.0p0 -0x1.43f7235fee391p6 0x1.50fffffffffecp5 0x0.0p0 F +REG nad27:2112 3 OK 0x1.5a857cf5a5cbap18 0x1.892908c1eafedp18 0x0.0p0 -0x1.5eb3874abc71ap6 0x1.7722222222218p5 0x0.0p0 F +REG nad27:2112 4 OK 0x1.a60d8f8c96c43p19 0x1.892908c1eafedp18 0x0.0p0 -0x1.43f7235fee391p6 0x1.7722222222218p5 0x0.0p0 F +REG nad27:2113 0 OK 0x1.29a82703b4d5p19 0x1.d610b1c611e8ap16 0x0.0p0 -0x1.5155555555555p6 0x1.54aaaaaaaaa97p5 0x0.0p0 F +REG nad27:2113 1 OK 0x1.5f3fe65ffc79dp18 -0x1.c51fd812038b6p16 0x0.0p0 -0x1.5d1a9f6347bf9p6 0x1.435555555553bp5 0x0.0p0 F +REG nad27:2113 2 OK 0x1.a3b05ad76b6dbp19 -0x1.c51fd812038b6p16 0x0.0p0 -0x1.45900b4762eb1p6 0x1.435555555553bp5 0x0.0p0 F +REG nad27:2113 3 OK 0x1.6faded78e92dap18 0x1.649a396714784p18 0x0.0p0 -0x1.5d1a9f6347bf9p6 0x1.65ffffffffff5p5 0x0.0p0 F +REG nad27:2113 4 OK 0x1.9b79574af513cp19 0x1.649a396714784p18 0x0.0p0 -0x1.45900b4762eb1p6 0x1.65ffffffffff5p5 0x0.0p0 F +REG nad27:2201 0 OK 0x1.29a82703b4d5p19 0x1.cf382052d357ap16 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887ec4p5 0x0.0p0 F +REG nad27:2201 1 OK 0x1.619466d3bcaadp18 -0x1.bb8d1eb700559p16 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776bp5 0x0.0p0 F +REG nad27:2201 2 OK 0x1.a2861a9d8b54ap19 -0x1.bb8d1eb700559p16 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776bp5 0x0.0p0 F +REG nad27:2201 3 OK 0x1.74868a1c8e012p18 0x1.600c1714edbaap18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d999999992b1p5 0x0.0p0 F +REG nad27:2201 4 OK 0x1.990d08f922a97p19 0x1.600c1714edbaap18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d999999992b1p5 0x0.0p0 F +REG nad27:2202 0 OK 0x1.29a82703b4d5p19 0x1.bd03c9c3acab9p16 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG nad27:2202 1 OK 0x1.6bd5fdd88e488p18 -0x1.abdb6d64a8225p16 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG nad27:2202 2 OK 0x1.9d654f1b2285cp19 -0x1.abdb6d64a8225p16 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG nad27:2202 3 OK 0x1.7c6c78c1725a4p18 0x1.51d4c4f0cc21ap18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999096p5 0x0.0p0 F +REG nad27:2202 4 OK 0x1.951a11a6b07cep19 0x1.51d4c4f0cc21ap18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999096p5 0x0.0p0 F +REG nad27:2203 0 OK 0x1.29a82703b4d5p19 0x1.e10b645778f3p16 0x0.0p0 -0x1.78p6 0x1.60dddddddddd1p5 0x0.0p0 F +REG nad27:2203 1 OK 0x1.58ed80ec21442p18 -0x1.ce465d33fbd49p16 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220dp5 0x0.0p0 F +REG nad27:2203 2 OK 0x1.a6d98d9159088p19 -0x1.ce465d33fbd49p16 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220dp5 0x0.0p0 F +REG nad27:2203 3 OK 0x1.6b184f2ff10cap18 0x1.6d3cd9a9a4108p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG nad27:2203 4 OK 0x1.9dc4266f71243p19 0x1.6d3cd9a9a4108p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG nad27:2301 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.daaaaaaaaaaabp4 0x0.0p0 F +REG nad27:2301 1 OK -0x1.a4964e2e0bcfp18 -0x1.08859ebe6202dp19 0x0.0p0 -0x1.7a59b545bae7bp6 0x1.8aaaaaaa74adp4 0x0.0p0 F +REG nad27:2301 2 OK 0x1.671f3a98e052bp19 -0x1.08859ebe6202dp19 0x0.0p0 -0x1.4c50f564efc2fp6 0x1.8aaaaaaa74acfp4 0x0.0p0 F +REG nad27:2301 3 OK -0x1.6e86fd03f8798p18 0x1.1615305e39f6bp19 0x0.0p0 -0x1.7a59b545bc5d4p6 0x1.1555555519b31p5 0x0.0p0 F +REG nad27:2301 4 OK 0x1.4c179203d6a7ep19 0x1.1615305e39f6cp19 0x0.0p0 -0x1.4c50f564ee4d6p6 0x1.1555555519b31p5 0x0.0p0 F +REG nad27:2302 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.e8p4 0x0.0p0 F +REG nad27:2302 1 OK -0x1.a5822cae959bep18 -0x1.084c6c33be18p19 0x0.0p0 -0x1.808b909db4109p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG nad27:2302 2 OK 0x1.679529d92537cp19 -0x1.084c6c33be18p19 0x0.0p0 -0x1.521f1a0cf69a2p6 0x1.97ffffffc3843p4 0x0.0p0 F +REG nad27:2302 3 OK -0x1.6d99c407fedeep18 0x1.165183b06d5c2p19 0x0.0p0 -0x1.808b909db0aa7p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG nad27:2302 4 OK 0x1.4ba0f585d9d95p19 0x1.165183b06d5c2p19 0x0.0p0 -0x1.521f1a0cfa004p6 0x1.1bffffffbd616p5 0x0.0p0 F +REG nad27:2401 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaabp5 0x0.0p0 F +REG nad27:2401 1 OK -0x1.abe05a0c358acp18 -0x1.06c74154e24ffp19 0x0.0p0 -0x1.82ab5906e69dcp6 0x1.ed555554cfd04p4 0x0.0p0 F +REG nad27:2401 2 OK 0x1.6ac44087f52fep19 -0x1.06c74154e24ffp19 0x0.0p0 -0x1.5154a6f919625p6 0x1.ed555554cfd04p4 0x0.0p0 F +REG nad27:2401 3 OK -0x1.674bee35888f1p18 0x1.17f06038ab07bp19 0x0.0p0 -0x1.82ab5906b6119p6 0x1.46aaaaaa25ba5p5 0x0.0p0 F +REG nad27:2401 4 OK 0x1.487a0a9c9eb2p19 0x1.17f06038ab07bp19 0x0.0p0 -0x1.5154a6f949ee8p6 0x1.46aaaaaa25ba5p5 0x0.0p0 F +REG nad27:2402 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaabp5 0x0.0p0 F +REG nad27:2402 1 OK -0x1.abe05a0c358acp18 -0x1.06c74154e24ffp19 0x0.0p0 -0x1.8aab5906e69dbp6 0x1.ed555554cfd04p4 0x0.0p0 F +REG nad27:2402 2 OK 0x1.6ac44087f52fep19 -0x1.06c74154e24ffp19 0x0.0p0 -0x1.5954a6f919624p6 0x1.ed555554cfd04p4 0x0.0p0 F +REG nad27:2402 3 OK -0x1.674bee35888f1p18 0x1.17f06038ab07bp19 0x0.0p0 -0x1.8aab5906b6118p6 0x1.46aaaaaa25ba5p5 0x0.0p0 F +REG nad27:2402 4 OK 0x1.487a0a9c9eb2p19 0x1.17f06038ab07bp19 0x0.0p0 -0x1.5954a6f949ee8p6 0x1.46aaaaaa25ba5p5 0x0.0p0 F +REG nad27:2403 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555555p5 0x0.0p0 F +REG nad27:2403 1 OK -0x1.ac4e3f6e5253ep18 -0x1.06ad6b296b53cp19 0x0.0p0 -0x1.92c619320982fp6 0x1.f2aaaaaa1e07fp4 0x0.0p0 F +REG nad27:2403 2 OK 0x1.6afb333903947p19 -0x1.06ad6b296b53cp19 0x0.0p0 -0x1.6139e6cdf67d1p6 0x1.f2aaaaaa1e07fp4 0x0.0p0 F +REG nad27:2403 3 OK -0x1.66e0e249ba43bp18 0x1.180c34d68b71fp19 0x0.0p0 -0x1.92c61931d5255p6 0x1.49555554cab4bp5 0x0.0p0 F +REG nad27:2403 4 OK 0x1.484484a6b78c6p19 0x1.180c34d68b71fp19 0x0.0p0 -0x1.6139e6ce2adabp6 0x1.49555554cab4bp5 0x0.0p0 F +REG nad27:2501 0 OK 0x1.29a82703b4d5p19 0x1.74cd314ff7682p16 0x0.0p0 -0x1.b600000000001p6 0x1.7edddddddd48bp5 0x0.0p0 F +REG nad27:2501 1 OK 0x1.922a86451bc54p18 -0x1.67fd9a73ffb1fp16 0x0.0p0 -0x1.c03be7769007bp6 0x1.7122222222219p5 0x0.0p0 F +REG nad27:2501 2 OK 0x1.8a3b0ae4dbc7ep19 -0x1.67fd9a73ffb1fp16 0x0.0p0 -0x1.abc418896ff86p6 0x1.7122222222219p5 0x0.0p0 F +REG nad27:2501 3 OK 0x1.9e977d885b199p18 0x1.1aa555f363acbp18 0x0.0p0 -0x1.c03be7769007bp6 0x1.8c9999999928cp5 0x0.0p0 F +REG nad27:2501 4 OK 0x1.84048f433c1dbp19 0x1.1aa555f363acbp18 0x0.0p0 -0x1.abc418896ff86p6 0x1.8c9999999928cp5 0x0.0p0 F +REG nad27:2502 0 OK 0x1.29a82703b4d5p19 0x1.bd14a91119497p16 0x0.0p0 -0x1.b600000000001p6 0x1.76dddddddddd5p5 0x0.0p0 F +REG nad27:2502 1 OK 0x1.6b953f0eccd0ap18 -0x1.ab65638180f39p16 0x0.0p0 -0x1.c1fde20665f3p6 0x1.667777777776bp5 0x0.0p0 F +REG nad27:2502 2 OK 0x1.9d85ae8003423p19 -0x1.ab65638180f39p16 0x0.0p0 -0x1.aa021df99a0dp6 0x1.667777777776bp5 0x0.0p0 F +REG nad27:2502 3 OK 0x1.7ca92b466840ep18 0x1.51fe64c8fdcf6p18 0x0.0p0 -0x1.c1fde20665f3p6 0x1.8744444443c63p5 0x0.0p0 F +REG nad27:2502 4 OK 0x1.94fbb864358a1p19 0x1.51fe64c8fdcf6p18 0x0.0p0 -0x1.aa021df99a0dp6 0x1.8744444443c63p5 0x0.0p0 F +REG nad27:2503 0 OK 0x1.29a82703b4d5p19 0x1.0477d0382a094p17 0x0.0p0 -0x1.b600000000001p6 0x1.699999999998fp5 0x0.0p0 F +REG nad27:2503 1 OK 0x1.42fc84758aa59p18 -0x1.f1faf3b76ab63p16 0x0.0p0 -0x1.c39fc45f44299p6 0x1.5666666666655p5 0x0.0p0 F +REG nad27:2503 2 OK 0x1.b1d20bcca457cp19 -0x1.f1faf3b76ab63p16 0x0.0p0 -0x1.a8603ba0bbd67p6 0x1.5666666666655p5 0x0.0p0 F +REG nad27:2503 3 OK 0x1.591fbff51ff32p18 0x1.8c19249974928p18 0x0.0p0 -0x1.c39fc45f44299p6 0x1.7ccccccccc316p5 0x0.0p0 F +REG nad27:2503 4 OK 0x1.a6c06e0cd9b1p19 0x1.8c19249974928p18 0x0.0p0 -0x1.a8603ba0bbd67p6 0x1.7ccccccccc316p5 0x0.0p0 F +REG nad27:2601 0 OK 0x1.29a82703b4d5p19 0x1.41c87e9a541fep16 0x0.0p0 -0x1.9p6 0x1.5099999999986p5 0x0.0p0 F +REG nad27:2601 1 OK 0x1.ae0d6d73cf00fp18 -0x1.3a0c8d9aaf29dp16 0x0.0p0 -0x1.97fe570c30a3ap6 0x1.44bbbbbbbbba4p5 0x0.0p0 F +REG nad27:2601 2 OK 0x1.7c49974d82298p19 -0x1.3a0c8d9aaf29dp16 0x0.0p0 -0x1.8801a8f3cf5c6p6 0x1.44bbbbbbbbba4p5 0x0.0p0 F +REG nad27:2601 3 OK 0x1.b59c6862b437p18 0x1.e67103869dd09p17 0x0.0p0 -0x1.97fe570c30a3ap6 0x1.5c7777777776bp5 0x0.0p0 F +REG nad27:2601 4 OK 0x1.788219d60f8e8p19 0x1.e67103869dd09p17 0x0.0p0 -0x1.8801a8f3cf5c6p6 0x1.5c7777777776bp5 0x0.0p0 F +REG nad27:2602 0 OK 0x1.29a82703b4d5p19 0x1.bc984d91d421ep16 0x0.0p0 -0x1.8ep6 0x1.4588888888871p5 0x0.0p0 F +REG nad27:2602 1 OK 0x1.6d4d341bd765fp18 -0x1.ae74790b30ce6p16 0x0.0p0 -0x1.98d08e5c9d95ep6 0x1.3522222222201p5 0x0.0p0 F +REG nad27:2602 2 OK 0x1.9ca9b3f97df7p19 -0x1.ae74790b30ce6p16 0x0.0p0 -0x1.832f71a3626a2p6 0x1.3522222222201p5 0x0.0p0 F +REG nad27:2602 3 OK 0x1.7b10f99a441eep18 0x1.50db900e2c0d6p18 0x0.0p0 -0x1.98d08e5c9d95ep6 0x1.55eeeeeeeeedcp5 0x0.0p0 F +REG nad27:2602 4 OK 0x1.95c7d13a479a9p19 0x1.50db900e2c0d6p18 0x0.0p0 -0x1.832f71a3626a2p6 0x1.55eeeeeeeeedcp5 0x0.0p0 F +REG nad27:2701 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.ce55555555556p6 0x1.16p5 0x0.0p0 F +REG nad27:2701 1 OK -0x1.aa8003101f938p18 -0x1.0718d43d1ec53p19 0x0.0p0 -0x1.e6acb8641fdf6p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG nad27:2701 2 OK 0x1.6a141509ea344p19 -0x1.0718d43d1ec53p19 0x0.0p0 -0x1.b5fdf2468acb4p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG nad27:2701 3 OK -0x1.68a05cf559152p18 0x1.17967e0890738p19 0x0.0p0 -0x1.e6acb863facd8p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG nad27:2701 4 OK 0x1.492441fc86f51p19 0x1.17967e0890738p19 0x0.0p0 -0x1.b5fdf246afdd3p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG nad27:2702 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.d2aaaaaaaaaabp6 0x1.16p5 0x0.0p0 F +REG nad27:2702 1 OK -0x1.aa8003101f938p18 -0x1.0718d43d1ec53p19 0x0.0p0 -0x1.eb020db97534bp6 0x1.dbffffff8f108p4 0x0.0p0 F +REG nad27:2702 2 OK 0x1.6a141509ea344p19 -0x1.0718d43d1ec53p19 0x0.0p0 -0x1.ba53479be020ap6 0x1.dbffffff8f108p4 0x0.0p0 F +REG nad27:2702 3 OK -0x1.68a05cf559152p18 0x1.17967e0890738p19 0x0.0p0 -0x1.eb020db95022ep6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG nad27:2702 4 OK 0x1.492441fc86f51p19 0x1.17967e0890738p19 0x0.0p0 -0x1.ba53479c05328p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG nad27:2703 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.da55555555555p6 0x1.16p5 0x0.0p0 F +REG nad27:2703 1 OK -0x1.aa8003101f938p18 -0x1.0718d43d1ec53p19 0x0.0p0 -0x1.f2acb8641fdf5p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG nad27:2703 2 OK 0x1.6a141509ea344p19 -0x1.0718d43d1ec53p19 0x0.0p0 -0x1.c1fdf2468acb4p6 0x1.dbffffff8f108p4 0x0.0p0 F +REG nad27:2703 3 OK -0x1.68a05cf559152p18 0x1.17967e0890738p19 0x0.0p0 -0x1.f2acb863facd8p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG nad27:2703 4 OK 0x1.492441fc86f51p19 0x1.17967e0890738p19 0x0.0p0 -0x1.c1fdf246afdd2p6 0x1.3dffffff8c1dap5 0x0.0p0 F +REG nad27:2800 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG nad27:2800 1 OK -0x1.b5248c0c38dd4p18 -0x1.047bc2db5e188p19 0x0.0p0 -0x1.39cb22ddbd575p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG nad27:2800 2 OK 0x1.6f665987f6d88p19 -0x1.047bc2db5e189p19 0x0.0p0 -0x1.038a327797fe2p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG nad27:2800 3 OK -0x1.5e0cefdd26dd9p18 0x1.1a370706ab19fp19 0x0.0p0 -0x1.39cb22dd1c5afp6 0x1.7bfffffed62fdp5 0x0.0p0 F +REG nad27:2800 4 OK 0x1.43da8b706dd8cp19 0x1.1a370706ab19fp19 0x0.0p0 -0x1.038a327838fa8p6 0x1.7bfffffed62fep5 0x0.0p0 F +REG nad27:2900 0 OK 0x1.29a82703b4d5p19 0x0.0p0 0x0.0p0 -0x1.2aaaaaaaaaaabp6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG nad27:2900 1 OK 0x1.d42a0270dd3p13 -0x1.05d2051acda5cp19 0x0.0p0 -0x1.44576bc148ab5p6 0x1.0eaaaaaa3fb06p5 0x0.0p0 F +REG nad27:2900 2 OK 0x1.25ffd2fed31aap20 -0x1.05d2051acda5cp19 0x0.0p0 -0x1.10fde9940caa1p6 0x1.0eaaaaaa3fb06p5 0x0.0p0 F +REG nad27:2900 3 OK 0x1.6c707632e2b9p16 0x1.18ef03fb7dc19p19 0x0.0p0 -0x1.44576bc0f00d1p6 0x1.5eaaaaa9e9fc4p5 0x0.0p0 F +REG nad27:2900 4 OK 0x1.12e11fa086a97p20 0x1.18ef03fb7dc19p19 0x0.0p0 -0x1.10fde99465486p6 0x1.5eaaaaa9e9fc4p5 0x0.0p0 F +REG nad27:3001 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.a155555555556p6 0x1.fp4 0x0.0p0 F +REG nad27:3001 1 OK -0x1.a60e92c924d8p18 -0x1.0828268359077p19 0x0.0p0 -0x1.b8aa7f0f68288p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:3001 2 OK 0x1.67db5ce66cd68p19 -0x1.0828268359077p19 0x0.0p0 -0x1.8a002b9b42823p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:3001 3 OK -0x1.6d06af03ecbb2p18 0x1.16749ec171ddp19 0x0.0p0 -0x1.b8aa7f0f6199ap6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:3001 4 OK 0x1.4b576b03d0c81p19 0x1.16749ec171ddp19 0x0.0p0 -0x1.8a002b9b49111p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:3002 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG nad27:3002 1 OK -0x1.a60d3ea1b6042p18 -0x1.0827891e720acp19 0x0.0p0 -0x1.c05529ba12d33p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:3002 2 OK 0x1.67dab2d2b56c9p19 -0x1.0827891e720acp19 0x0.0p0 -0x1.91aad645ed2cep6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:3002 3 OK -0x1.6d057cd7a1a94p18 0x1.1673f8d780bf1p19 0x0.0p0 -0x1.c05529ba0c444p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:3002 4 OK 0x1.4b56d1edab3f2p19 0x1.1673f8d780bf1p19 0x0.0p0 -0x1.91aad645f3bbdp6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:3003 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.af55555555555p6 0x1.fp4 0x0.0p0 F +REG nad27:3003 1 OK -0x1.a60fae3f5688ap18 -0x1.0828a9acc42f7p19 0x0.0p0 -0x1.c6aa7f0f68288p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:3003 2 OK 0x1.67dbeaa185aedp19 -0x1.0828a9acc42f7p19 0x0.0p0 -0x1.98002b9b42823p6 0x1.9fffffffbf24dp4 0x0.0p0 F +REG nad27:3003 3 OK -0x1.6d07ae28d5f4ep18 0x1.167529046575ep19 0x0.0p0 -0x1.c6aa7f0f61999p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:3003 4 OK 0x1.4b57ea964564fp19 0x1.167529046575ep19 0x0.0p0 -0x1.98002b9b49112p6 0x1.1fffffffb8d25p5 0x0.0p0 F +REG nad27:301 0 OK 0x1.29a82703b4d5p19 0x1.9baf5a2e47c08p16 0x0.0p0 -0x1.7p6 0x1.1a44444444415p5 0x0.0p0 F +REG nad27:301 1 OK 0x1.7fb115e363bf7p18 -0x1.91c30f78d24cfp16 0x0.0p0 -0x1.794f6bc4d5215p6 0x1.0b111111110d3p5 0x0.0p0 F +REG nad27:301 2 OK 0x1.9377c315b7cafp19 -0x1.91c30f78d24cfp16 0x0.0p0 -0x1.66b0943b2adebp6 0x1.0b111111110d3p5 0x0.0p0 F +REG nad27:301 3 OK 0x1.896c9d2e9b921p18 0x1.37337305edfaap18 0x0.0p0 -0x1.794f6bc4d5215p6 0x1.2977777777751p5 0x0.0p0 F +REG nad27:301 4 OK 0x1.8e99ff701be1ap19 0x1.37337305edfaap18 0x0.0p0 -0x1.66b0943b2adebp6 0x1.2977777777751p5 0x0.0p0 F +REG nad27:302 0 OK 0x1.29a82703b4d5p19 0x1.c6e657c51c8cap16 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb83p5 0x0.0p0 F +REG nad27:302 1 OK 0x1.6935a81b19257p18 -0x1.bb78b69e601fep16 0x0.0p0 -0x1.7a1942726255cp6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG nad27:302 2 OK 0x1.9eb579f9dd174p19 -0x1.bb78b69e601fep16 0x0.0p0 -0x1.65e6bd8d9daa4p6 0x1.f9ddddddddd56p4 0x0.0p0 F +REG nad27:302 3 OK 0x1.746df4d7e66cp18 0x1.57fc76ed8f105p18 0x0.0p0 -0x1.7a1942726255cp6 0x1.1e8888888885ep5 0x0.0p0 F +REG nad27:302 4 OK 0x1.9919539b7674p19 0x1.57fc76ed8f105p18 0x0.0p0 -0x1.65e6bd8d9daa4p6 0x1.1e8888888885ep5 0x0.0p0 F +REG nad27:3101 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.2955555555555p6 0x1.4p5 0x0.0p0 F +REG nad27:3101 1 OK -0x1.b1798a8619cc4p18 -0x1.0569d1779b16bp19 0x0.0p0 -0x1.437104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG nad27:3101 2 OK 0x1.6d90d8c4e750ap19 -0x1.0569d1779b16bp19 0x0.0p0 -0x1.0f39a5e3fb04bp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG nad27:3101 3 OK -0x1.61be65d45ef35p18 0x1.19544bd1abef1p19 0x0.0p0 -0x1.437104c6435aap6 0x1.67ffffff2235bp5 0x0.0p0 F +REG nad27:3101 4 OK 0x1.45b3466c09e42p19 0x1.19544bd1abef1p19 0x0.0p0 -0x1.0f39a5e467501p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG nad27:3102 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG nad27:3102 1 OK -0x1.b175316eff76cp18 -0x1.0567ddc48452fp19 0x0.0p0 -0x1.4c7104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG nad27:3102 2 OK 0x1.6d8eac395a25ep19 -0x1.0567ddc48452fp19 0x0.0p0 -0x1.1839a5e3fb04bp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG nad27:3102 3 OK -0x1.61baa525c9e85p18 0x1.1952320cafec7p19 0x0.0p0 -0x1.4c7104c6435abp6 0x1.67ffffff2235bp5 0x0.0p0 F +REG nad27:3102 4 OK 0x1.45b16614bf5eap19 0x1.1952320cafec7p19 0x0.0p0 -0x1.1839a5e467501p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG nad27:3103 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG nad27:3103 1 OK -0x1.b175316eff76cp18 -0x1.0567ddc48452fp19 0x0.0p0 -0x1.547104c6afa5fp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG nad27:3103 2 OK 0x1.6d8eac395a25ep19 -0x1.0567ddc48452fp19 0x0.0p0 -0x1.2039a5e3fb04cp6 0x1.17ffffff7f517p5 0x0.0p0 F +REG nad27:3103 3 OK -0x1.61baa525c9e85p18 0x1.1952320cafec7p19 0x0.0p0 -0x1.547104c6435abp6 0x1.67ffffff2235bp5 0x0.0p0 F +REG nad27:3103 4 OK 0x1.45b16614bf5eap19 0x1.1952320cafec7p19 0x0.0p0 -0x1.2039a5e467501p6 0x1.67ffffff2235bp5 0x0.0p0 F +REG nad27:3104 0 OK 0x1.29a82703b4d5p19 0x1.d5784a93cc4e4p15 0x0.0p0 -0x1.28p6 0x1.462222222220ap5 0x0.0p0 F +REG nad27:3104 1 OK 0x1.e4d09fdf9d26cp18 -0x1.8766f4086855ap15 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.3e22222222206p5 0x0.0p0 F +REG nad27:3104 2 OK 0x1.60e7fe179b16ap19 -0x1.8766f4086855ap15 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.3e22222222206p5 0x0.0p0 F +REG nad27:3104 3 OK 0x1.e8158a3aa963ap18 0x1.4fe66b74943f7p17 0x0.0p0 -0x1.2d4809c4ef0d8p6 0x1.4e2222222220ep5 0x0.0p0 F +REG nad27:3104 4 OK 0x1.5f4588ea14f83p19 0x1.4fe66b74943f7p17 0x0.0p0 -0x1.22b7f63b10f28p6 0x1.4e2222222220ep5 0x0.0p0 F +REG nad27:3200 0 OK 0x1.29a82703b4d5p19 0x1.05ca6ee6406f1p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa79p5 0x0.0p0 F +REG nad27:3200 1 OK 0x1.449809898d2cfp18 -0x1.fbadd319a14dp16 0x0.0p0 -0x1.47cb7933f48aap6 0x1.0455555555511p5 0x0.0p0 F +REG nad27:3200 2 OK 0x1.b1044942a312ep19 -0x1.fbadd319a14dp16 0x0.0p0 -0x1.303486cc0b756p6 0x1.0455555555511p5 0x0.0p0 F +REG nad27:3200 3 OK 0x1.5425ef4992591p18 0x1.8c9269bd1dbd2p18 0x0.0p0 -0x1.47cb7933f48aap6 0x1.2afffffffffd8p5 0x0.0p0 F +REG nad27:3200 4 OK 0x1.a93d5662a07cep19 0x1.8c9269bd1dbd2p18 0x0.0p0 -0x1.303486cc0b756p6 0x1.2afffffffffd8p5 0x0.0p0 F +REG nad27:3301 0 OK 0x1.29a82703b4d5p19 0x1.7863f98dee172p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee59dp5 0x0.0p0 F +REG nad27:3301 1 OK 0x1.9042a00754375p18 -0x1.6b58d28a3f4e4p16 0x0.0p0 -0x1.9c55c3f143a71p6 0x1.7111111111108p5 0x0.0p0 F +REG nad27:3301 2 OK 0x1.8b2efe03bf8eep19 -0x1.6b58d28a3f4e4p16 0x0.0p0 -0x1.87aa3c0ebc58fp6 0x1.7111111111108p5 0x0.0p0 F +REG nad27:3301 3 OK 0x1.9ce3ee7b291cap18 0x1.1d67165b6f9e3p18 0x0.0p0 -0x1.9c55c3f143a71p6 0x1.8ccccccccc5c7p5 0x0.0p0 F +REG nad27:3301 4 OK 0x1.84de56c9d51c3p19 0x1.1d67165b6f9e3p18 0x0.0p0 -0x1.87aa3c0ebc58fp6 0x1.8ccccccccc5c7p5 0x0.0p0 F +REG nad27:3302 0 OK 0x1.29a82703b4d5p19 0x1.8a66582174bfdp16 0x0.0p0 -0x1.9200000000001p6 0x1.7499999999991p5 0x0.0p0 F +REG nad27:3302 1 OK 0x1.86e1b81d37a8ap18 -0x1.7cb4776f81f2dp16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111102p5 0x0.0p0 F +REG nad27:3302 2 OK 0x1.8fdf71f8cdd64p19 -0x1.7cb4776f81f2dp16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111102p5 0x0.0p0 F +REG nad27:3302 3 OK 0x1.9426790e00c1p18 0x1.2b113782691bdp18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221991p5 0x0.0p0 F +REG nad27:3302 4 OK 0x1.893d1180694ap19 0x1.2b113782691bdp18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221991p5 0x0.0p0 F +REG nad27:3401 0 OK 0x1.29a82703b4d5p19 0x1.b8fed84cd3a24p16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG nad27:3401 1 OK 0x1.6f36746021edap18 -0x1.ab14395c5db97p16 0x0.0p0 -0x1.54b9b443558bap6 0x1.3533333333313p5 0x0.0p0 F +REG nad27:3401 2 OK 0x1.9bb513d758b2ap19 -0x1.ab14395c5db97p16 0x0.0p0 -0x1.3f464bbcaa746p6 0x1.3533333333313p5 0x0.0p0 F +REG nad27:3401 3 OK 0x1.7cc56c0010464p18 0x1.4e198698c7831p18 0x0.0p0 -0x1.54b9b443558bap6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG nad27:3401 4 OK 0x1.94ed980761865p19 0x1.4e198698c7831p18 0x0.0p0 -0x1.3f464bbcaa746p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG nad27:3402 0 OK 0x1.29a82703b4d5p19 0x1.b8dd35555e6c9p16 0x0.0p0 -0x1.4ap6 0x1.3822222222202p5 0x0.0p0 F +REG nad27:3402 1 OK 0x1.6f9f2d12d18cfp18 -0x1.abc631ad57221p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb6p5 0x0.0p0 F +REG nad27:3402 2 OK 0x1.9b80b77e00e2fp19 -0x1.abc631ad57221p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb6p5 0x0.0p0 F +REG nad27:3402 3 OK 0x1.7c664be3ba8e5p18 0x1.4dd18d4d601f1p18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.486666666665p5 0x0.0p0 F +REG nad27:3402 4 OK 0x1.951d28158c624p19 0x1.4dd18d4d601f1p18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.486666666665p5 0x0.0p0 F +REG nad27:3501 0 OK 0x1.29a82703b4d5p19 0x1.7ed581be81182p16 0x0.0p0 -0x1.88p6 0x1.1f111111110e4p5 0x0.0p0 F +REG nad27:3501 1 OK 0x1.8ec20f86b4ec3p18 -0x1.761129790ed4p16 0x0.0p0 -0x1.90b8d4acb5308p6 0x1.10eeeeeeeeeb7p5 0x0.0p0 F +REG nad27:3501 2 OK 0x1.8bef46440f33ep19 -0x1.761129790ed4p16 0x0.0p0 -0x1.7f472b534acf8p6 0x1.10eeeeeeeeeb7p5 0x0.0p0 F +REG nad27:3501 3 OK 0x1.975b56b2dab5p18 0x1.2147b8081523dp18 0x0.0p0 -0x1.90b8d4acb5308p6 0x1.2d3333333330cp5 0x0.0p0 F +REG nad27:3501 4 OK 0x1.87a2a2adfc4f8p19 0x1.2147b8081523dp18 0x0.0p0 -0x1.7f472b534acf8p6 0x1.2d3333333330cp5 0x0.0p0 F +REG nad27:3502 0 OK 0x1.29a82703b4d5p19 0x1.9b9ded9a6450fp16 0x0.0p0 -0x1.88p6 0x1.124444444440dp5 0x0.0p0 F +REG nad27:3502 1 OK 0x1.7fe11355b07b2p18 -0x1.92110c2053b8p16 0x0.0p0 -0x1.9132b355fc5d3p6 0x1.03111111110d1p5 0x0.0p0 F +REG nad27:3502 2 OK 0x1.935fc45c916bdp19 -0x1.92110c2053b8p16 0x0.0p0 -0x1.7ecd4caa03a2ep6 0x1.03111111110d1p5 0x0.0p0 F +REG nad27:3502 3 OK 0x1.8941c7f2d07c9p18 0x1.371087a2a179p18 0x0.0p0 -0x1.9132b355fc5d3p6 0x1.217777777774fp5 0x0.0p0 F +REG nad27:3502 4 OK 0x1.8eaf6a0e016b2p19 0x1.371087a2a179p18 0x0.0p0 -0x1.7ecd4caa03a2ep6 0x1.217777777774fp5 0x0.0p0 F +REG nad27:3601 0 OK 0x1.29a82703b4d5p19 0x1.fa68784a779adp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9ep5 0x0.0p0 F +REG nad27:3601 1 OK 0x1.4b01e355175ddp18 -0x1.e509a754be7c6p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53fffffffffedp5 0x0.0p0 F +REG nad27:3601 2 OK 0x1.adcf5c5cddfb2p19 -0x1.e509a754be7c6p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53fffffffffedp5 0x0.0p0 F +REG nad27:3601 3 OK 0x1.5fa17683fb06p18 0x1.80db001a02b7cp18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554cp5 0x0.0p0 F +REG nad27:3601 4 OK 0x1.a37f92c56c27p19 0x1.80db001a02b7cp18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554cp5 0x0.0p0 F +REG nad27:3602 0 OK 0x1.29a82703b4d5p19 0x1.fa3a7ca05138p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG nad27:3602 1 OK 0x1.4bb92b05ca3e8p18 -0x1.e65bc43b591ep16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe7p5 0x0.0p0 F +REG nad27:3602 2 OK 0x1.ad73b884848acp19 -0x1.e65bc43b591ep16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe7p5 0x0.0p0 F +REG nad27:3602 3 OK 0x1.5ef4e0e8d323ap18 0x1.806674c8ac96bp18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554ap5 0x0.0p0 F +REG nad27:3602 4 OK 0x1.a3d5dd9300183p19 0x1.806674c8ac96bp18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554ap5 0x0.0p0 F +REG nad27:3701 0 OK 0x1.29a82703b4d5p19 0x1.82cd29c6758e6p16 0x0.0p0 -0x1.37p6 0x1.487777777776p5 0x0.0p0 F +REG nad27:3701 1 OK 0x1.8be89ffb640fap18 -0x1.77facc82dbf14p16 0x0.0p0 -0x1.4075cb858aac8p6 0x1.3a33333333317p5 0x0.0p0 F +REG nad27:3701 2 OK 0x1.8d5bfe09b7a1ap19 -0x1.77facc82dbf14p16 0x0.0p0 -0x1.2d8a347a75539p6 0x1.3a33333333317p5 0x0.0p0 F +REG nad27:3701 3 OK 0x1.9678a57fb2946p18 0x1.24b872daa62ap18 0x0.0p0 -0x1.4075cb858aac8p6 0x1.56bbbbbbbbbaap5 0x0.0p0 F +REG nad27:3701 4 OK 0x1.8813fb47905f4p19 0x1.24b872daa62ap18 0x0.0p0 -0x1.2d8a347a75539p6 0x1.56bbbbbbbbbaap5 0x0.0p0 F +REG nad27:3702 0 OK 0x1.29a82703b4d5p19 0x1.62348e9d7ca64p16 0x0.0p0 -0x1.37p6 0x1.4133333333319p5 0x0.0p0 F +REG nad27:3702 1 OK 0x1.9d3ce78a7f398p18 -0x1.5970b8770045dp16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222202p5 0x0.0p0 F +REG nad27:3702 2 OK 0x1.84b1da422a0d4p19 -0x1.5970b8770045dp16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222202p5 0x0.0p0 F +REG nad27:3702 3 OK 0x1.a5cf160c4464ap18 0x1.0bca1f805013cp18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e4444444443p5 0x0.0p0 F +REG nad27:3702 4 OK 0x1.8068c3014777bp19 0x1.0bca1f805013cp18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e4444444443p5 0x0.0p0 F +REG nad27:3800 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG nad27:3800 1 OK -0x1.b30c1919bf09cp18 -0x1.05074b3fc6d3fp19 0x0.0p0 -0x1.3888a96f00826p6 0x1.20aaaaaa11e73p5 0x0.0p0 F +REG nad27:3800 2 OK 0x1.6e5a200eb9fp19 -0x1.05074b3fc6d3ep19 0x0.0p0 -0x1.03775690ff7dap6 0x1.20aaaaaa11e73p5 0x0.0p0 F +REG nad27:3800 3 OK -0x1.60316e6061dcdp18 0x1.19b709c0d97bdp19 0x0.0p0 -0x1.3888a96e7f594p6 0x1.70aaaaa9ae611p5 0x0.0p0 F +REG nad27:3800 4 OK 0x1.44eccab20b597p19 0x1.19b709c0d97bep19 0x0.0p0 -0x1.0377569180a6cp6 0x1.70aaaaa9ae611p5 0x0.0p0 F +REG nad27:3901 0 OK 0x1.29a82703b4d5p19 0x1.aa0d6fa6dbf69p16 0x0.0p0 -0x1.44p6 0x1.0fddddddddda7p5 0x0.0p0 F +REG nad27:3901 1 OK 0x1.78560a4663d6ep18 -0x1.9fec22bb92417p16 0x0.0p0 -0x1.4d7caf89e58b5p6 0x1.00222222221dep5 0x0.0p0 F +REG nad27:3901 2 OK 0x1.972548e437bdfp19 -0x1.9fec22bb92417p16 0x0.0p0 -0x1.3a8350761a74cp6 0x1.00222222221dep5 0x0.0p0 F +REG nad27:3901 3 OK 0x1.824aea3401236p18 0x1.42074741ac797p18 0x0.0p0 -0x1.4d7caf89e58b5p6 0x1.1f9999999996fp5 0x0.0p0 F +REG nad27:3901 4 OK 0x1.922ad8ed6917bp19 0x1.42074741ac797p18 0x0.0p0 -0x1.3a8350761a74cp6 0x1.1f9999999996fp5 0x0.0p0 F +REG nad27:3902 0 OK 0x1.29a82703b4d5p19 0x1.8d11a2c8a3b8fp16 0x0.0p0 -0x1.44p6 0x1.05fffffffffc1p5 0x0.0p0 F +REG nad27:3902 1 OK 0x1.87b921a43139fp18 -0x1.84b381402481fp16 0x0.0p0 -0x1.4cb828dd9db44p6 0x1.eeaaaaaaaaa16p4 0x0.0p0 F +REG nad27:3902 2 OK 0x1.8f73bd35510c6p19 -0x1.84b381402481fp16 0x0.0p0 -0x1.3b47d722624bdp6 0x1.eeaaaaaaaaa16p4 0x0.0p0 F +REG nad27:3902 3 OK 0x1.8ff3aadf2b3dap18 0x1.2bdff5b0bbf01p18 0x0.0p0 -0x1.4cb828dd9db44p6 0x1.14aaaaaaaaa74p5 0x0.0p0 F +REG nad27:3902 4 OK 0x1.8b567897d40a8p19 0x1.2bdff5b0bbf01p18 0x0.0p0 -0x1.3b47d722624bdp6 0x1.14aaaaaaaaa74p5 0x0.0p0 F +REG nad27:4001 0 OK 0x1.29a82703b4d5p19 0x1.9182e81498666p16 0x0.0p0 -0x1.9p6 0x1.6611111111102p5 0x0.0p0 F +REG nad27:4001 1 OK 0x1.837171da506b6p18 -0x1.84335c478304ep16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444432p5 0x0.0p0 F +REG nad27:4001 2 OK 0x1.9197951a41745p19 -0x1.84335c478304ep16 0x0.0p0 -0x1.8594248c0bd8ap6 0x1.5744444444432p5 0x0.0p0 F +REG nad27:4001 3 OK 0x1.905d52cff79ddp18 0x1.305261605b077p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd3p5 0x0.0p0 F +REG nad27:4001 4 OK 0x1.8b21a49f6ddb2p19 0x1.305261605b077p18 0x0.0p0 -0x1.8594248c0bd8ap6 0x1.74dddddddddd3p5 0x0.0p0 F +REG nad27:4002 0 OK 0x1.29a82703b4d5p19 0x1.c0687debaa98cp16 0x0.0p0 -0x1.9155555555555p6 0x1.5aeeeeeeeeedfp5 0x0.0p0 F +REG nad27:4002 1 OK 0x1.6aac4414dd572p18 -0x1.b093d8532b4f8p16 0x0.0p0 -0x1.9cb46504892e6p6 0x1.4a6666666665p5 0x0.0p0 F +REG nad27:4002 2 OK 0x1.9dfa2bfcfafe7p19 -0x1.b093d8532b4f8p16 0x0.0p0 -0x1.85f645a6217c4p6 0x1.4a6666666665p5 0x0.0p0 F +REG nad27:4002 3 OK 0x1.7a057c70091e2p18 0x1.5418de4e32839p18 0x0.0p0 -0x1.9cb46504892e6p6 0x1.6b7777777776bp5 0x0.0p0 F +REG nad27:4002 4 OK 0x1.964d8fcf651afp19 0x1.5418de4e32839p18 0x0.0p0 -0x1.85f645a6217c4p6 0x1.6b7777777776bp5 0x0.0p0 F +REG nad27:401 0 OK 0x1.29a82703b4d5p19 0x1.fa054760e7d6bp16 0x0.0p0 -0x1.e8p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG nad27:401 1 OK 0x1.4c813c443aa2cp18 -0x1.e7c65d0f147bfp16 0x0.0p0 -0x1.f4462e6374a3cp6 0x1.3155555555533p5 0x0.0p0 F +REG nad27:401 2 OK 0x1.ad0fafe54c58ap19 -0x1.e7c65d0f147bfp16 0x0.0p0 -0x1.dbb9d19c8b5c3p6 0x1.3155555555533p5 0x0.0p0 F +REG nad27:401 3 OK 0x1.5e39e8712eac4p18 0x1.7fe49a5670a5dp18 0x0.0p0 -0x1.f4462e6374a3cp6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG nad27:401 4 OK 0x1.a43359ced253ep19 0x1.7fe49a5670a5dp18 0x0.0p0 -0x1.dbb9d19c8b5c3p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG nad27:402 0 OK 0x1.29a82703b4d5p19 0x1.d5bd5fa50b207p16 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe1p5 0x0.0p0 F +REG nad27:402 1 OK 0x1.6054f16c1abdp18 -0x1.c702f6c3dea62p16 0x0.0p0 -0x1.f31cdda2c7b91p6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG nad27:402 2 OK 0x1.a325d5515c4a5p19 -0x1.c702f6c3dea62p16 0x0.0p0 -0x1.dce3225d3847p6 0x1.24aaaaaaaaa7fp5 0x0.0p0 F +REG nad27:402 3 OK 0x1.6eb15fec17e94p18 0x1.63de934214e57p18 0x0.0p0 -0x1.f31cdda2c7b91p6 0x1.475555555553ep5 0x0.0p0 F +REG nad27:402 4 OK 0x1.9bf79e115db44p19 0x1.63de934214e57p18 0x0.0p0 -0x1.dce3225d3847p6 0x1.475555555553ep5 0x0.0p0 F +REG nad27:403 0 OK 0x1.29a82703b4d5p19 0x1.a30ec98597eep16 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb96p5 0x0.0p0 F +REG nad27:403 1 OK 0x1.7b74ecd104f5ep18 -0x1.97e76f3a70fd8p16 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444415p5 0x0.0p0 F +REG nad27:403 2 OK 0x1.9595d79ee7305p19 -0x1.97e76f3a70fd8p16 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444413p5 0x0.0p0 F +REG nad27:403 3 OK 0x1.865d5e154e4ap18 0x1.3d044421db3afp18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333316p5 0x0.0p0 F +REG nad27:403 4 OK 0x1.90219efcc2862p19 0x1.3d044421db3afp18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333316p5 0x0.0p0 F +REG nad27:404 0 OK 0x1.29a82703b4d5p19 0x1.9f5f36817ff44p16 0x0.0p0 -0x1.dcp6 0x1.225555555552ap5 0x0.0p0 F +REG nad27:404 1 OK 0x1.7d970bc21eb76p18 -0x1.94e029cc946fbp16 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffcbp5 0x0.0p0 F +REG nad27:404 2 OK 0x1.9484c8265a4e5p19 -0x1.94e029cc946fbp16 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffcbp5 0x0.0p0 F +REG nad27:404 3 OK 0x1.87e01e1fa5e9fp18 0x1.3a18e9b281563p18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG nad27:404 4 OK 0x1.8f603ef796b5p19 0x1.3a18e9b281563p18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa88p5 0x0.0p0 F +REG nad27:405 0 OK 0x1.29a82703b4d5p19 0x1.aa10b6509c389p16 0x0.0p0 -0x1.d800000000001p6 0x1.13ddddddddda9p5 0x0.0p0 F +REG nad27:405 1 OK 0x1.78427839d6dd2p18 -0x1.9fc143aa5fcd3p16 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221dfp5 0x0.0p0 F +REG nad27:405 2 OK 0x1.972f11ea7e3cbp19 -0x1.9fc143aa5fcd3p16 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221dfp5 0x0.0p0 F +REG nad27:405 3 OK 0x1.825fb09101b44p18 0x1.42164994760f9p18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.239999999996fp5 0x0.0p0 F +REG nad27:405 4 OK 0x1.922075bee8d12p19 0x1.42164994760f9p18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.239999999996fp5 0x0.0p0 F +REG nad27:406 0 OK 0x1.29a82703b4d5p19 0x1.73d433770b161p16 0x0.0p0 -0x1.d1p6 0x1.08333333332f5p5 0x0.0p0 F +REG nad27:406 1 OK 0x1.94df059673c73p18 -0x1.6c6907e93710bp16 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee59p4 0x0.0p0 F +REG nad27:406 2 OK 0x1.88e0cb3c2fc52p19 -0x1.6c6907e93710bp16 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee61p4 0x0.0p0 F +REG nad27:406 3 OK 0x1.9c2c625098f72p18 0x1.18b5178419665p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebdp5 0x0.0p0 F +REG nad27:406 4 OK 0x1.853a1cdf1d2d3p19 0x1.18b5178419665p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeebdp5 0x0.0p0 F +REG nad27:407 0 OK 0x1.378ca735a5189p20 0x1.35db957f85493p20 0x0.0p0 -0x1.d955555555556p6 0x1.11222222221ecp5 0x0.0p0 F +REG nad27:407 1 OK 0x1.1c05e0ea5e1a1p20 0x1.1af0f95b765f5p20 0x0.0p0 -0x1.de2a91549c3d1p6 0x1.09222222221e6p5 0x0.0p0 F +REG nad27:407 2 OK 0x1.53136d80ec17bp20 0x1.1af0f95b765f5p20 0x0.0p0 -0x1.d48019560e6dap6 0x1.09222222221e6p5 0x0.0p0 F +REG nad27:407 3 OK 0x1.1ca9fb10a286ep20 0x1.5119c529ad6e5p20 0x0.0p0 -0x1.de2a91549c3d1p6 0x1.19222222221f1p5 0x0.0p0 F +REG nad27:407 4 OK 0x1.526f535aa7aaep20 0x1.5119c529ad6e5p20 0x0.0p0 -0x1.d48019560e6dap6 0x1.19222222221f1p5 0x0.0p0 F +REG nad27:4100 0 OK 0x1.29a82703b4d5p19 0x1.f243dc823387ep16 0x0.0p0 -0x1.58p6 0x1.1c55555555525p5 0x0.0p0 F +REG nad27:4100 1 OK 0x1.90b4dfd0a1734p18 -0x1.f74b89c5e8222p15 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.0e5555555551ep5 0x0.0p0 F +REG nad27:4100 2 OK 0x1.8af5de1f18f1p19 -0x1.f74b89c5e8222p15 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.0e5555555551ep5 0x0.0p0 F +REG nad27:4100 3 OK 0x1.990a4e61a8e38p18 0x1.3c419c379a50ap18 0x0.0p0 -0x1.609a4e06b0d59p6 0x1.2a5555555553p5 0x0.0p0 F +REG nad27:4100 4 OK 0x1.86cb26d69538ep19 0x1.3c419c379a50ap18 0x0.0p0 -0x1.4f65b1f94f2a7p6 0x1.2a5555555553p5 0x0.0p0 F +REG nad27:4201 0 OK 0x1.29a82703b4d5p19 0x1.d90e9fbdd8e8cp16 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8ap5 0x0.0p0 F +REG nad27:4201 1 OK 0x1.5f5b3288f5fcp18 -0x1.cc05c540dc162p16 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444408p5 0x0.0p0 F +REG nad27:4201 2 OK 0x1.a3a2b4c2eeab6p19 -0x1.cc05c540dc162p16 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.0744444444408p5 0x0.0p0 F +REG nad27:4201 3 OK 0x1.6c200edeb938ep18 0x1.65fb9115964e3p18 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330cp5 0x0.0p0 F +REG nad27:4201 4 OK 0x1.9d4046980d0cfp19 0x1.65fb9115964e3p18 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330cp5 0x0.0p0 F +REG nad27:4202 0 OK 0x1.29a82703b4d5p19 0x1.f21f22cb52e81p16 0x0.0p0 -0x1.86p6 0x1.068888888884bp5 0x0.0p0 F +REG nad27:4202 1 OK 0x1.5298fd3d6a71fp18 -0x1.e4e49f0287f84p16 0x0.0p0 -0x1.90f271ed65e92p6 0x1.e8444444443bp4 0x0.0p0 F +REG nad27:4202 2 OK 0x1.aa03cf68b471p19 -0x1.e4e49f0287f84p16 0x0.0p0 -0x1.7b0d8e129a16ep6 0x1.e8444444443bp4 0x0.0p0 F +REG nad27:4202 3 OK 0x1.5f9376ed1c70cp18 0x1.78db198d11242p18 0x0.0p0 -0x1.90f271ed65e92p6 0x1.18eeeeeeeeebfp5 0x0.0p0 F +REG nad27:4202 4 OK 0x1.a3869290db71ap19 0x1.78db198d11242p18 0x0.0p0 -0x1.7b0d8e129a16ep6 0x1.18eeeeeeeeebfp5 0x0.0p0 F +REG nad27:4203 0 OK 0x1.29a82703b4d5p19 0x1.dfebe891ba317p16 0x0.0p0 -0x1.9155555555555p6 0x1.ec666666665d2p4 0x0.0p0 F +REG nad27:4203 1 OK 0x1.5c9aeb78bb44ap18 -0x1.d49c1a1af6bbap16 0x0.0p0 -0x1.9ba738e53ac9fp6 0x1.c8eeeeeeeee3bp4 0x0.0p0 F +REG nad27:4203 2 OK 0x1.a502d84b0c07bp19 -0x1.d49c1a1af6bbap16 0x0.0p0 -0x1.870371c56fe0cp6 0x1.c8eeeeeeeee3bp4 0x0.0p0 F +REG nad27:4203 3 OK 0x1.67bcc64aafbfep18 0x1.6ac0deb6fe0b4p18 0x0.0p0 -0x1.9ba738e53ac9fp6 0x1.07eeeeeeeeeb3p5 0x0.0p0 F +REG nad27:4203 4 OK 0x1.9f71eae211ca1p19 0x1.6ac0deb6fe0b4p18 0x0.0p0 -0x1.870371c56fe0cp6 0x1.07eeeeeeeeeb3p5 0x0.0p0 F +REG nad27:4204 0 OK 0x1.29a82703b4d5p19 0x1.0926d5407814ep17 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee44p4 0x0.0p0 F +REG nad27:4204 1 OK 0x1.42760a88c73ap18 -0x1.02b61bea70db1p17 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbae9p4 0x0.0p0 F +REG nad27:4204 2 OK 0x1.b21548c3060c5p19 -0x1.02b61bea70db1p17 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbae9p4 0x0.0p0 F +REG nad27:4204 3 OK 0x1.4f2c1f9911bacp18 0x1.90f05be54b595p18 0x0.0p0 -0x1.97361161034adp6 0x1.f822222222194p4 0x0.0p0 F +REG nad27:4204 4 OK 0x1.abba3e3ae0ccp19 0x1.90f05be54b595p18 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f822222222194p4 0x0.0p0 F +REG nad27:4205 0 OK 0x1.29a82703b4d5p19 0x1.d4d34b840d407p16 0x0.0p0 -0x1.8ap6 0x1.abfffffffff31p4 0x0.0p0 F +REG nad27:4205 1 OK 0x1.6323da11b4058p18 -0x1.cbb93cf477d68p16 0x0.0p0 -0x1.93b49156c66f9p6 0x1.8955555555471p4 0x0.0p0 F +REG nad27:4205 2 OK 0x1.a1be60fe8fa7fp19 -0x1.cbb93cf477d68p16 0x0.0p0 -0x1.804b6ea939907p6 0x1.8955555555471p4 0x0.0p0 F +REG nad27:4205 3 OK 0x1.6c27b53ae91aep18 0x1.61e8b5f475a14p18 0x0.0p0 -0x1.93b49156c66f9p6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG nad27:4205 4 OK 0x1.9d3c7369f51d4p19 0x1.61e8b5f475a14p18 0x0.0p0 -0x1.804b6ea939907p6 0x1.ceaaaaaaaa9f9p4 0x0.0p0 F +REG nad27:4301 0 OK 0x1.29a82703b4d5p19 0x1.3a7d4ff99b202p16 0x0.0p0 -0x1.bep6 0x1.4877777777761p5 0x0.0p0 F +REG nad27:4301 1 OK 0x1.b1fd8b99587bep18 -0x1.335f4b38e7c56p16 0x0.0p0 -0x1.c5b11f7fb8877p6 0x1.3cdddddddddc2p5 0x0.0p0 F +REG nad27:4301 2 OK 0x1.7a51883abd6c1p19 -0x1.335f4b38e7c56p16 0x0.0p0 -0x1.b64ee08047789p6 0x1.3cdddddddddc2p5 0x0.0p0 F +REG nad27:4301 3 OK 0x1.b8f33df1fb642p18 0x1.db3746fe9e431p17 0x0.0p0 -0x1.c5b11f7fb8877p6 0x1.54111111110fep5 0x0.0p0 F +REG nad27:4301 4 OK 0x1.76d6af0e6bf7fp19 0x1.db3746fe9e431p17 0x0.0p0 -0x1.b64ee08047789p6 0x1.54111111110fep5 0x0.0p0 F +REG nad27:4302 0 OK 0x1.29a82703b4d5p19 0x1.f6522081a30ffp16 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed2p5 0x0.0p0 F +REG nad27:4302 1 OK 0x1.4ec236f551918p18 -0x1.e4fda7adb7ba1p16 0x0.0p0 -0x1.ca0202c3d20c7p6 0x1.296666666663fp5 0x0.0p0 F +REG nad27:4302 2 OK 0x1.abef328cc0e0ap19 -0x1.e4fda7adb7ba1p16 0x0.0p0 -0x1.b1fdfd3c2df39p6 0x1.296666666663fp5 0x0.0p0 F +REG nad27:4302 3 OK 0x1.5f9e68d02d7b5p18 0x1.7ce9ba3ea661fp18 0x0.0p0 -0x1.ca0202c3d20c7p6 0x1.4e77777777761p5 0x0.0p0 F +REG nad27:4302 4 OK 0x1.a381199f52ebcp19 0x1.7ce9ba3ea661fp18 0x0.0p0 -0x1.b1fdfd3c2df39p6 0x1.4e77777777761p5 0x0.0p0 F +REG nad27:4303 0 OK 0x1.29a82703b4d5p19 0x1.6ce0863c50d21p16 0x0.0p0 -0x1.bep6 0x1.2c111111110ebp5 0x0.0p0 F +REG nad27:4303 1 OK 0x1.97f7f012697b2p18 -0x1.646cdff76832bp16 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999996dp5 0x0.0p0 F +REG nad27:4303 2 OK 0x1.875455fe34ebdp19 -0x1.646cdff76832bp16 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999996dp5 0x0.0p0 F +REG nad27:4303 3 OK 0x1.a03faab6c2ac1p18 0x1.13bac894fd2f4p18 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG nad27:4303 4 OK 0x1.833078ac08536p19 0x1.13bac894fd2f4p18 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG nad27:4400 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG nad27:4400 1 OK -0x1.b524309c61cbp18 -0x1.047b9a35d04a6p19 0x0.0p0 -0x1.3d20783312acap6 0x1.2bffffff40e62p5 0x0.0p0 F +REG nad27:4400 2 OK 0x1.6f662bd00b50ap19 -0x1.047b9a35d04a6p19 0x0.0p0 -0x1.06df87cced536p6 0x1.2bffffff40e62p5 0x0.0p0 F +REG nad27:4400 3 OK -0x1.5e0ca20464672p18 0x1.1a36dafd0107ep19 0x0.0p0 -0x1.3d20783271b03p6 0x1.7bfffffed62fep5 0x0.0p0 F +REG nad27:4400 4 OK 0x1.43da64840c9eap19 0x1.1a36dafd0107ep19 0x0.0p0 -0x1.06df87cd8e4fdp6 0x1.7bfffffed62fdp5 0x0.0p0 F +REG nad27:4501 0 OK 0x1.29a82703b4d5p19 0x1.4c6894cd38ddp16 0x0.0p0 -0x1.3ap6 0x1.3377777777756p5 0x0.0p0 F +REG nad27:4501 1 OK 0x1.a8e17afcb7f8p18 -0x1.452b5bdd017e9p16 0x0.0p0 -0x1.41d46dd6b3ca8p6 0x1.273333333330ap5 0x0.0p0 F +REG nad27:4501 2 OK 0x1.7edf90890daep19 -0x1.452b5bdd017e9p16 0x0.0p0 -0x1.322b92294c358p6 0x1.273333333330ap5 0x0.0p0 F +REG nad27:4501 3 OK 0x1.aff80b5cd383ep18 0x1.f62ba9e3b23bp17 0x0.0p0 -0x1.41d46dd6b3ca8p6 0x1.3fbbbbbbbbba1p5 0x0.0p0 F +REG nad27:4501 4 OK 0x1.7b544858ffe81p19 0x1.f62ba9e3b23bp17 0x0.0p0 -0x1.322b92294c358p6 0x1.3fbbbbbbbbba1p5 0x0.0p0 F +REG nad27:4502 0 OK 0x1.29a82703b4d5p19 0x1.6202ce26e67f6p16 0x0.0p0 -0x1.3ap6 0x1.293333333330cp5 0x0.0p0 F +REG nad27:4502 1 OK 0x1.9db6485372c56p18 -0x1.5a2ae991f0eabp16 0x0.0p0 -0x1.423262b0988ep6 0x1.1c222222221f6p5 0x0.0p0 F +REG nad27:4502 2 OK 0x1.847529ddb047fp19 -0x1.5a2ae991f0eabp16 0x0.0p0 -0x1.31cd9d4f6772p6 0x1.1c222222221f6p5 0x0.0p0 F +REG nad27:4502 3 OK 0x1.a565a36a8229bp18 0x1.0b6fd149772efp18 0x0.0p0 -0x1.423262b0988ep6 0x1.3644444444427p5 0x0.0p0 F +REG nad27:4502 4 OK 0x1.809d7c522895cp19 0x1.0b6fd149772efp18 0x0.0p0 -0x1.31cd9d4f6772p6 0x1.3644444444427p5 0x0.0p0 F +REG nad27:4601 0 OK 0x1.29a82703b4d5p19 0x1.78653c9b84fd1p16 0x0.0p0 -0x1.e355555555556p6 0x1.7eeeeeeeee59dp5 0x0.0p0 F +REG nad27:4601 1 OK 0x1.904157a8607d8p18 -0x1.6b591470061c2p16 0x0.0p0 -0x1.edab194698fc6p6 0x1.7111111111108p5 0x0.0p0 F +REG nad27:4601 2 OK 0x1.8b2fa233396c4p19 -0x1.6b591470061c2p16 0x0.0p0 -0x1.d8ff916411ae4p6 0x1.7111111111108p5 0x0.0p0 F +REG nad27:4601 3 OK 0x1.9ce45b84b4c3dp18 0x1.1d67cd4aa6f65p18 0x0.0p0 -0x1.edab194698fc6p6 0x1.8ccccccccc5c8p5 0x0.0p0 F +REG nad27:4601 4 OK 0x1.84de20450f491p19 0x1.1d67cd4aa6f65p18 0x0.0p0 -0x1.d8ff916411ae4p6 0x1.8ccccccccc5c7p5 0x0.0p0 F +REG nad27:4602 0 OK 0x1.29a82703b4d5p19 0x1.b22cbd8983a2cp16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG nad27:4602 1 OK 0x1.719943f3e2d2ap18 -0x1.a1ae4421ceebbp16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaa9dp5 0x0.0p0 F +REG nad27:4602 2 OK 0x1.9a83ac0d7840bp19 -0x1.a1ae4421ceebbp16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaa9dp5 0x0.0p0 F +REG nad27:4602 3 OK 0x1.818aea4adaf88p18 0x1.498cabd37662ap18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa204p5 0x0.0p0 F +REG nad27:4602 4 OK 0x1.928ad8e1fc2dcp19 0x1.498cabd37662ap18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa204p5 0x0.0p0 F +REG nad27:4701 0 OK 0x1.29a82703b4d5p19 0x1.7b71b8b346eep16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe2p5 0x0.0p0 F +REG nad27:4701 1 OK 0x1.900ebaf9c0416p18 -0x1.71a868cb7c64p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdap5 0x0.0p0 F +REG nad27:4701 2 OK 0x1.8b48f08a89895p19 -0x1.71a868cb7c64p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdap5 0x0.0p0 F +REG nad27:4701 3 OK 0x1.999eb50f5e469p18 0x1.1ef840adeaecep18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe8p5 0x0.0p0 F +REG nad27:4701 4 OK 0x1.8680f37fba86cp19 0x1.1ef840adeaecep18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe8p5 0x0.0p0 F +REG nad27:4702 0 OK 0x1.29a82703b4d5p19 0x1.983f5cebdbd65p16 0x0.0p0 -0x1.44p6 0x1.2f88888888865p5 0x0.0p0 F +REG nad27:4702 1 OK 0x1.811672e4e70b1p18 -0x1.8d7c13bb1bc17p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774bp5 0x0.0p0 F +REG nad27:4702 2 OK 0x1.92c51494f6248p19 -0x1.8d7c13bb1bc17p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774bp5 0x0.0p0 F +REG nad27:4702 3 OK 0x1.8b9b845756f97p18 0x1.34d09b94f5b12p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997dp5 0x0.0p0 F +REG nad27:4702 4 OK 0x1.8d828bdbbe2d4p19 0x1.34d09b94f5b12p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997dp5 0x0.0p0 F +REG nad27:4801 0 OK 0x1.29a82703b4d5p19 0x1.5b52614f19abep16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG nad27:4801 1 OK 0x1.a0120292a13ccp18 -0x1.50f73c0da36f3p16 0x0.0p0 -0x1.71352657aea25p6 0x1.62eeeeeeeeedfp5 0x0.0p0 F +REG nad27:4801 2 OK 0x1.83474cbe190bap19 -0x1.50f73c0da36f3p16 0x0.0p0 -0x1.5ecad9a8515dbp6 0x1.62eeeeeeeeedfp5 0x0.0p0 F +REG nad27:4801 3 OK 0x1.aa22e7ae8b378p18 0x1.06fbff2f7c3a9p18 0x0.0p0 -0x1.71352657aea25p6 0x1.7c88888887ec6p5 0x0.0p0 F +REG nad27:4801 4 OK 0x1.7e3eda30240e4p19 0x1.06fbff2f7c3a9p18 0x0.0p0 -0x1.5ecad9a8515dbp6 0x1.7c88888887ec6p5 0x0.0p0 F +REG nad27:4802 0 OK 0x1.29a82703b4d5p19 0x1.69b5880db8132p16 0x0.0p0 -0x1.68p6 0x1.6555555555548p5 0x0.0p0 F +REG nad27:4802 1 OK 0x1.98a3ccf5604ddp18 -0x1.5ef99e0ae5b2p16 0x0.0p0 -0x1.715fabce299d6p6 0x1.57ffffffffff1p5 0x0.0p0 F +REG nad27:4802 2 OK 0x1.86fe678cb9832p19 -0x1.5ef99e0ae5b2p16 0x0.0p0 -0x1.5ea05431d662ap6 0x1.57ffffffffff1p5 0x0.0p0 F +REG nad27:4802 3 OK 0x1.a3140fb157a45p18 0x1.11deb85c43f0ep18 0x0.0p0 -0x1.715fabce299d6p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG nad27:4802 4 OK 0x1.81c6462ebdd7ep19 0x1.11deb85c43f0ep18 0x0.0p0 -0x1.5ea05431d662ap6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG nad27:4803 0 OK 0x1.29a82703b4d5p19 0x1.c067fb17b530bp16 0x0.0p0 -0x1.68p6 0x1.5844444444432p5 0x0.0p0 F +REG nad27:4803 1 OK 0x1.6abd89bffbedep18 -0x1.b0bf025f4771bp16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba2p5 0x0.0p0 F +REG nad27:4803 2 OK 0x1.9df189276bb28p19 -0x1.b0bf025f4771bp16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba2p5 0x0.0p0 F +REG nad27:4803 3 OK 0x1.79f1b4615342ep18 0x1.540cb4d1b3fep18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG nad27:4803 4 OK 0x1.965773d6c0081p19 0x1.540cb4d1b3fep18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccc1p5 0x0.0p0 F +REG nad27:4901 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaabp6 0x1.4555555555555p5 0x0.0p0 F +REG nad27:4901 1 OK -0x1.b2698280e059p18 -0x1.052adb9b5ad23p19 0x0.0p0 -0x1.bf08b5e8fc3ep6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4901 2 OK 0x1.6e08d4c24a97p19 -0x1.052adb9b5ad23p19 0x0.0p0 -0x1.8a4c9f6c59177p6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4901 3 OK -0x1.60c64eccacb49p18 0x1.198dc3b5effa5p19 0x0.0p0 -0x1.bf08b5e8836e2p6 0x1.6d55555465319p5 0x0.0p0 F +REG nad27:4901 4 OK 0x1.45373ae830c4cp19 0x1.198dc3b5effa5p19 0x0.0p0 -0x1.8a4c9f6cd1e74p6 0x1.6d55555465319p5 0x0.0p0 F +REG nad27:4902 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.ad55555555555p6 0x1.4555555555555p5 0x0.0p0 F +REG nad27:4902 1 OK -0x1.b2698280e05a4p18 -0x1.052adb9b5ad22p19 0x0.0p0 -0x1.c7b36093a6e8ap6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4902 2 OK 0x1.6e08d4c24a97p19 -0x1.052adb9b5ad23p19 0x0.0p0 -0x1.92f74a1703c2p6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4902 3 OK -0x1.60c64eccacb59p18 0x1.198dc3b5effa6p19 0x0.0p0 -0x1.c7b360932e18dp6 0x1.6d5555546531ap5 0x0.0p0 F +REG nad27:4902 4 OK 0x1.45373ae830c4cp19 0x1.198dc3b5effa5p19 0x0.0p0 -0x1.92f74a177c91ep6 0x1.6d55555465319p5 0x0.0p0 F +REG nad27:4903 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.4555555555555p5 0x0.0p0 F +REG nad27:4903 1 OK -0x1.b2698280e059p18 -0x1.052adb9b5ad23p19 0x0.0p0 -0x1.cd5e0b3e51935p6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4903 2 OK 0x1.6e08d4c24a97p19 -0x1.052adb9b5ad23p19 0x0.0p0 -0x1.98a1f4c1ae6ccp6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4903 3 OK -0x1.60c64eccacb49p18 0x1.198dc3b5effa5p19 0x0.0p0 -0x1.cd5e0b3dd8c37p6 0x1.6d55555465319p5 0x0.0p0 F +REG nad27:4903 4 OK 0x1.45373ae830c4cp19 0x1.198dc3b5effa5p19 0x0.0p0 -0x1.98a1f4c2273c9p6 0x1.6d55555465319p5 0x0.0p0 F +REG nad27:4904 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.b855555555555p6 0x1.4555555555555p5 0x0.0p0 F +REG nad27:4904 1 OK -0x1.b2698280e057ep18 -0x1.052adb9b5ad23p19 0x0.0p0 -0x1.d2b36093a6e89p6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4904 2 OK 0x1.6e08d4c24a97ap19 -0x1.052adb9b5ad22p19 0x0.0p0 -0x1.9df74a1703c2p6 0x1.1d555554c6522p5 0x0.0p0 F +REG nad27:4904 3 OK -0x1.60c64eccacb38p18 0x1.198dc3b5effa4p19 0x0.0p0 -0x1.d2b360932e18bp6 0x1.6d55555465319p5 0x0.0p0 F +REG nad27:4904 4 OK 0x1.45373ae830c54p19 0x1.198dc3b5effa6p19 0x0.0p0 -0x1.9df74a177c91ep6 0x1.6d5555546531ap5 0x0.0p0 F +REG nad27:5001 0 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad27:5001 1 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad27:5001 2 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad27:5001 3 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad27:5001 4 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad27:5002 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG nad27:5002 1 OK -0x1.caa99e82d526p18 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.2d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5002 2 OK 0x1.7a28e2c344fc8p19 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.0afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5002 3 OK -0x1.47c5060a6b092p18 0x1.1f08d82813506p19 0x0.0p0 -0x1.2d035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5002 4 OK 0x1.38b696870fee5p19 0x1.1f08d82813505p19 0x0.0p0 -0x1.0afcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5003 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG nad27:5003 1 OK -0x1.caa99e82d526p18 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.35035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5003 2 OK 0x1.7a28e2c344fd8p19 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.12fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5003 3 OK -0x1.47c5060a6b092p18 0x1.1f08d82813506p19 0x0.0p0 -0x1.35035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5003 4 OK 0x1.38b696870fef1p19 0x1.1f08d82813506p19 0x0.0p0 -0x1.12fcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5004 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG nad27:5004 1 OK -0x1.caa99e82d524p18 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.3d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5004 2 OK 0x1.7a28e2c344fd8p19 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.1afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5004 3 OK -0x1.47c5060a6b07ap18 0x1.1f08d82813505p19 0x0.0p0 -0x1.3d035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5004 4 OK 0x1.38b696870fef1p19 0x1.1f08d82813506p19 0x0.0p0 -0x1.1afcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5005 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG nad27:5005 1 OK -0x1.caa99e82d524p18 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.45035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5005 2 OK 0x1.7a28e2c344fd8p19 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.22fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5005 3 OK -0x1.47c5060a6b07ap18 0x1.1f08d82813505p19 0x0.0p0 -0x1.45035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5005 4 OK 0x1.38b696870fef1p19 0x1.1f08d82813506p19 0x0.0p0 -0x1.22fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5006 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG nad27:5006 1 OK -0x1.caa99e82d526p18 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.4d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5006 2 OK 0x1.7a28e2c344fc8p19 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.2afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5006 3 OK -0x1.47c5060a6b092p18 0x1.1f08d82813506p19 0x0.0p0 -0x1.4d035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5006 4 OK 0x1.38b696870fee5p19 0x1.1f08d82813505p19 0x0.0p0 -0x1.2afcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5007 0 OK 0x1.a0b8369ec9f6fp17 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG nad27:5007 1 OK -0x1.8f2196b54a95p18 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.55035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5007 2 OK 0x1.97ece6aa0a45p19 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.32fcaafc23cp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5007 3 OK -0x1.0c3cfe3ce0782p18 0x1.1f08d82813506p19 0x0.0p0 -0x1.55035501f8b63p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5007 4 OK 0x1.567a9a6dd536dp19 0x1.1f08d82813505p19 0x0.0p0 -0x1.32fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5008 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG nad27:5008 1 OK -0x1.caa99e82d524p18 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.5d035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5008 2 OK 0x1.7a28e2c344fd8p19 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.3afcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5008 3 OK -0x1.47c5060a6b07ap18 0x1.1f08d82813505p19 0x0.0p0 -0x1.5d035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5008 4 OK 0x1.38b696870fef1p19 0x1.1f08d82813506p19 0x0.0p0 -0x1.3afcaafe0749dp7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5009 0 OK 0x1.65302ed13f66p17 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG nad27:5009 1 OK -0x1.ace59a9c0fdb8p18 -0x1.fd0c0033e4ee3p18 0x0.0p0 -0x1.65035503dc401p7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5009 2 OK 0x1.890ae4b6a7a1cp19 -0x1.fd0c0033e4eep18 0x0.0p0 -0x1.42fcaafc23bffp7 0x1.87fffffb983e7p5 0x0.0p0 F +REG nad27:5009 3 OK -0x1.2a010223a5bf2p18 0x1.1f08d82813505p19 0x0.0p0 -0x1.65035501f8b62p7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:5009 4 OK 0x1.4798987a72935p19 0x1.1f08d82813506p19 0x0.0p0 -0x1.42fcaafe0749ep7 0x1.d7fffffbfdd27p5 0x0.0p0 F +REG nad27:501 0 OK 0x1.29a82703b4d5p19 0x1.3a6f356c247c8p16 0x0.0p0 -0x1.a6p6 0x1.407777777775ep5 0x0.0p0 F +REG nad27:501 1 OK 0x1.b21ea2ee7ab86p18 -0x1.3391e3c6592edp16 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddbfp5 0x0.0p0 F +REG nad27:501 2 OK 0x1.7a40fc902c4ddp19 -0x1.3391e3c6592edp16 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddbfp5 0x0.0p0 F +REG nad27:501 3 OK 0x1.b8d66cda68e1p18 0x1.db04681ecd6a7p17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fap5 0x0.0p0 F +REG nad27:501 4 OK 0x1.76e5179a35398p19 0x1.db04681ecd6a7p17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fap5 0x0.0p0 F +REG nad27:5010 0 OK 0x1.be7c3a858f3f8p19 0x1.33dff036cadc7p17 0x0.0p0 -0x1.6p7 0x1.a355555555119p5 0x0.0p0 F +REG nad27:5010 1 OK 0x1.1a55550d34fcap19 -0x1.1ed11ea00654dp17 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa39fp5 0x0.0p0 F +REG nad27:5010 2 OK 0x1.31518ffef4c13p20 -0x1.1ed11ea00654dp17 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa39fp5 0x0.0p0 F +REG nad27:5010 3 OK 0x1.2e380b80b9b24p19 0x1.d742d4f920a5ap18 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffd9ep5 0x0.0p0 F +REG nad27:5010 4 OK 0x1.276034c532666p20 0x1.d742d4f920a5ap18 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffd9ep5 0x0.0p0 F +REG nad27:502 0 OK 0x1.29a82703b4d5p19 0x1.9f8b790dfa72ap16 0x0.0p0 -0x1.a6p6 0x1.3655555555536p5 0x0.0p0 F +REG nad27:502 1 OK 0x1.7d15947358a84p18 -0x1.940790f2cf04bp16 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffd9p5 0x0.0p0 F +REG nad27:502 2 OK 0x1.94c583cdbd55ep19 -0x1.940790f2cf04bp16 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffd9p5 0x0.0p0 F +REG nad27:502 3 OK 0x1.885543d6866cap18 0x1.3a75853210be4p18 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa92p5 0x0.0p0 F +REG nad27:502 4 OK 0x1.8f25ac1c2673bp19 0x1.3a75853210be4p18 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa92p5 0x0.0p0 F +REG nad27:503 0 OK 0x1.29a82703b4d5p19 0x1.7ef12f054e306p16 0x0.0p0 -0x1.a6p6 0x1.2c66666666642p5 0x0.0p0 F +REG nad27:503 1 OK 0x1.8e7934e9108b6p18 -0x1.759c8e035fc8ep16 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e44444444417p5 0x0.0p0 F +REG nad27:503 2 OK 0x1.8c13b392e1645p19 -0x1.759c8e035fc8ep16 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e44444444417p5 0x0.0p0 F +REG nad27:503 3 OK 0x1.979bf5e2aed43p18 0x1.217d7d8e54927p18 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886ap5 0x0.0p0 F +REG nad27:503 4 OK 0x1.87825316123fep19 0x1.217d7d8e54927p18 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886ap5 0x0.0p0 F +REG nad27:5101 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555555p4 0x0.0p0 F +REG nad27:5101 1 OK -0x1.999d60b4709aep18 -0x1.0b108c66cf668p19 0x0.0p0 -0x1.4190cfacb3439p7 0x1.baaaaaaa87f99p3 0x0.0p0 F +REG nad27:5101 2 OK 0x1.61a2c3dc12b7fp19 -0x1.0b108c66cf668p19 0x0.0p0 -0x1.2c6f30534cbc7p7 0x1.baaaaaaa87f99p3 0x0.0p0 F +REG nad27:5101 3 OK -0x1.79480e486f734p18 0x1.133462e28d602p19 0x0.0p0 -0x1.4190cfacc234dp7 0x1.7d555555376ap4 0x0.0p0 F +REG nad27:5101 4 OK 0x1.51781aa612242p19 0x1.133462e28d602p19 0x0.0p0 -0x1.2c6f30533dcb3p7 0x1.7d555555376ap4 0x0.0p0 F +REG nad27:5102 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.3955555555555p7 0x1.4555555555555p4 0x0.0p0 F +REG nad27:5102 1 OK -0x1.9b07df880e8c2p18 -0x1.0abcc6e112026p19 0x0.0p0 -0x1.43ff74a32e46dp7 0x1.eaaaaaaa83206p3 0x0.0p0 F +REG nad27:5102 2 OK 0x1.62580345e1af1p19 -0x1.0abcc6e112027p19 0x0.0p0 -0x1.2eab36077c63dp7 0x1.eaaaaaaa83208p3 0x0.0p0 F +REG nad27:5102 3 OK -0x1.77e5802615bfcp18 0x1.13942c856d7b4p19 0x0.0p0 -0x1.43ff74a33cc39p7 0x1.9555555531d45p4 0x0.0p0 F +REG nad27:5102 4 OK 0x1.50c6d394e549p19 0x1.13942c856d7b4p19 0x0.0p0 -0x1.2eab36076de71p7 0x1.9555555531d46p4 0x0.0p0 F +REG nad27:5103 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaabp4 0x0.0p0 F +REG nad27:5103 1 OK -0x1.9bd7b334879c2p18 -0x1.0a8f2d64810c2p19 0x0.0p0 -0x1.46b9354850b7fp7 0x1.02aaaaaa9563p4 0x0.0p0 F +REG nad27:5103 2 OK 0x1.62bfed1c1e389p19 -0x1.0a8f2d64810c2p19 0x0.0p0 -0x1.3146cab7af481p7 0x1.02aaaaaa9563p4 0x0.0p0 F +REG nad27:5103 3 OK -0x1.7720a84367a06p18 0x1.13cbd2d68c29dp19 0x0.0p0 -0x1.46b935485ec8p7 0x1.a2aaaaaa83701p4 0x0.0p0 F +REG nad27:5103 4 OK 0x1.506467a38e3abp19 0x1.13cbd2d68c29dp19 0x0.0p0 -0x1.3146cab7a138p7 0x1.a2aaaaaa83701p4 0x0.0p0 F +REG nad27:5104 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555555p4 0x0.0p0 F +REG nad27:5104 1 OK -0x1.9c7cf993505b4p18 -0x1.0a690d2d50fc4p19 0x0.0p0 -0x1.49c5d1c731158p7 0x1.0d5555553ebc7p4 0x0.0p0 F +REG nad27:5104 2 OK 0x1.6312904b82982p19 -0x1.0a690d2d50fc4p19 0x0.0p0 -0x1.343a2e38ceea8p7 0x1.0d5555553ebc7p4 0x0.0p0 F +REG nad27:5104 3 OK -0x1.767f053e0fbd2p18 0x1.13f7722197867p19 0x0.0p0 -0x1.49c5d1c73eb69p7 0x1.ad5555552ac16p4 0x0.0p0 F +REG nad27:5104 4 OK 0x1.50139620e2491p19 0x1.13f7722197867p19 0x0.0p0 -0x1.343a2e38c1497p7 0x1.ad5555552ac16p4 0x0.0p0 F +REG nad27:5105 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.4055555555555p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG nad27:5105 1 OK -0x1.9c54f2bfa18e6p18 -0x1.0a734c21f9919p19 0x0.0p0 -0x1.4b17f4409c2ddp7 0x1.0aaaaaaa9468bp4 0x0.0p0 F +REG nad27:5105 2 OK 0x1.62fe8ce1ab31bp19 -0x1.0a734c21f9919p19 0x0.0p0 -0x1.3592b66a0e7cdp7 0x1.0aaaaaaa9468bp4 0x0.0p0 F +REG nad27:5105 3 OK -0x1.76a8e978e9adep18 0x1.13ed360c4a299p19 0x0.0p0 -0x1.4b17f440a9ecbp7 0x1.aaaaaaaa80f57p4 0x0.0p0 F +REG nad27:5105 4 OK 0x1.5028883e4f417p19 0x1.13ed360c4a299p19 0x0.0p0 -0x1.3592b66a00bdfp7 0x1.aaaaaaaa80f57p4 0x0.0p0 F +REG nad27:5201 0 OK 0x1.29a82703b4d5p17 0x1.0364e24e80343p15 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222210ap4 0x0.0p0 F +REG nad27:5201 1 OK 0x1.3bb0749a5d86ep15 -0x1.2d60dbae665bap16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.1222222222109p4 0x0.0p0 F +REG nad27:5201 2 OK 0x1.0232187069242p18 -0x1.2d60dbae665bap16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.1222222222109p4 0x0.0p0 F +REG nad27:5201 3 OK 0x1.45a07b0541cacp15 0x1.19a6f3df69735p17 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222115p4 0x0.0p0 F +REG nad27:5201 4 OK 0x1.00f417a30c9bap18 0x1.19a6f3df69735p17 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222115p4 0x0.0p0 F +REG nad27:5202 0 OK 0x1.29a82703b4d5p17 0x1.f1850184aa783p15 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222210ap4 0x0.0p0 F +REG nad27:5202 1 OK 0x1.3bb0749a5d86ep15 -0x1.6ca19826a2734p15 0x0.0p0 -0x1.0df13f90a9095p6 0x1.1222222222109p4 0x0.0p0 F +REG nad27:5202 2 OK 0x1.0232187069242p18 -0x1.6ca19826a2734p15 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.1222222222109p4 0x0.0p0 F +REG nad27:5202 3 OK 0x1.45a07b0541cacp15 0x1.552efbacf4045p17 0x0.0p0 -0x1.0df13f90a9095p6 0x1.3222222222115p4 0x0.0p0 F +REG nad27:5202 4 OK 0x1.00f417a30c9bap18 0x1.552efbacf4045p17 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.3222222222115p4 0x0.0p0 F +REG nad27:5300 0 OK 0x1.29a82703b4d5p17 0x1.73c14fc8dc0abp16 0x0.0p0 -0x1.54p7 -0x1.c88888888866fp3 0x0.0p0 F +REG nad27:5300 1 OK -0x1.7ecae35826234p18 -0x1.c5fc223ad0165p18 0x0.0p0 -0x1.5e5176f75656dp7 -0x1.344444444432bp4 0x0.0p0 F +REG nad27:5300 2 OK 0x1.5439852ded7c2p19 -0x1.c5fc223ad0165p18 0x0.0p0 -0x1.49ae8908a9a94p7 -0x1.344444444432bp4 0x0.0p0 F +REG nad27:5300 3 OK -0x1.96cbbf10e2f0ep18 0x1.39c80534feac6p19 0x0.0p0 -0x1.5e5176f75656dp7 -0x1.28888888886ddp3 0x0.0p0 F +REG nad27:5300 4 OK 0x1.6039f30a4be2fp19 0x1.39c80534feac6p19 0x0.0p0 -0x1.49ae8908a9a94p7 -0x1.28888888886ddp3 0x0.0p0 F +REG nad27:5400 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.86ap15 0x1.86ap15 0x0.0p0 NaN NaN NaN F +REG nad27:5400 1 OK -0x1.f7feb4f3ceb56p18 -0x1.eb1351531df68p18 0x0.0p0 0x1.1749f704af493p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG nad27:5400 2 OK 0x1.2cd35a79e75c2p19 -0x1.eb1351531df68p18 0x0.0p0 0x1.2bb4c17c95962p7 -0x1.3c9933414a6ebp2 0x0.0p0 F +REG nad27:5400 3 OK -0x1.e13d9e2d23146p18 0x1.2bf610e3a9f2ap19 0x0.0p0 0x1.17b52299e6a35p7 0x1.434355006168cp2 0x0.0p0 F +REG nad27:5400 4 OK 0x1.2172cf16918bap19 0x1.2bf610e3a9f2ap19 0x0.0p0 0x1.2b4995e75e3cp7 0x1.434355006168cp2 0x0.0p0 F +REG nad27:600 0 OK 0x1.65302ed13f66p17 0x1.c045964a03d18p15 0x0.0p0 -0x1.23p6 0x1.4acccccccccb8p5 0x0.0p0 F +REG nad27:600 1 OK 0x1.0140e55b1567dp16 -0x1.b8ff7c45fba7p15 0x0.0p0 -0x1.28818d3773554p6 0x1.428888888887p5 0x0.0p0 F +REG nad27:600 2 OK 0x1.24dff57a7a0c1p18 -0x1.b8ff7c45fba7p15 0x0.0p0 -0x1.1d7e72c88caacp6 0x1.428888888887p5 0x0.0p0 F +REG nad27:600 3 OK 0x1.0f89238caa241p16 0x1.51ff61e6ebaecp17 0x0.0p0 -0x1.28818d3773554p6 0x1.53111111111p5 0x0.0p0 F +REG nad27:600 4 OK 0x1.214de5ee14ddp18 0x1.51ff61e6ebaecp17 0x0.0p0 -0x1.1d7e72c88caacp6 0x1.53111111111p5 0x0.0p0 F +REG nad27:700 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG nad27:700 1 OK -0x1.aebcc2b3a6b44p18 -0x1.061accab533fcp19 0x0.0p0 -0x1.470c0a38e06acp6 0x1.07ffffffa238ep5 0x0.0p0 F +REG nad27:700 2 OK 0x1.6c3274dbadc54p19 -0x1.061accab533fcp19 0x0.0p0 -0x1.14494b1c74eaap6 0x1.07ffffffa238ep5 0x0.0p0 F +REG nad27:700 3 OK -0x1.6483a2538ed9fp18 0x1.18a91a7607db6p19 0x0.0p0 -0x1.470c0a3894519p6 0x1.57ffffff51f56p5 0x0.0p0 F +REG nad27:700 4 OK 0x1.4715e4aba1d8p19 0x1.18a91a7607db7p19 0x0.0p0 -0x1.14494b1cc103dp6 0x1.57ffffff51f56p5 0x0.0p0 F +REG nad27:901 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555555p4 0x0.0p0 F +REG nad27:901 1 OK -0x1.9ef0304f4d2b2p18 -0x1.09d367dc86ffp19 0x0.0p0 -0x1.59f3301236c33p6 0x1.355555553897dp4 0x0.0p0 F +REG nad27:901 2 OK 0x1.644c2ba981001p19 -0x1.09d367dc86ffp19 0x0.0p0 -0x1.2e0ccfedc93cdp6 0x1.355555553897dp4 0x0.0p0 F +REG nad27:901 3 OK -0x1.740c01354adc6p18 0x1.149b0e39a3b6fp19 0x0.0p0 -0x1.59f330124d234p6 0x1.d55555551ab68p4 0x0.0p0 F +REG nad27:901 4 OK 0x1.4eda141c7fd8bp19 0x1.149b0e39a3b6fp19 0x0.0p0 -0x1.2e0ccfedb2dccp6 0x1.d55555551ab68p4 0x0.0p0 F +REG nad27:902 0 OK 0x1.29a82703b4d5p17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555555p4 0x0.0p0 F +REG nad27:902 1 OK -0x1.9ef0304f4d2b2p18 -0x1.09d367dc86ffp19 0x0.0p0 -0x1.5df3301236c33p6 0x1.355555553897dp4 0x0.0p0 F +REG nad27:902 2 OK 0x1.644c2ba981001p19 -0x1.09d367dc86ffp19 0x0.0p0 -0x1.320ccfedc93cdp6 0x1.355555553897dp4 0x0.0p0 F +REG nad27:902 3 OK -0x1.740c01354adc6p18 0x1.149b0e39a3b6fp19 0x0.0p0 -0x1.5df330124d234p6 0x1.d55555551ab68p4 0x0.0p0 F +REG nad27:902 4 OK 0x1.4eda141c7fd8bp19 0x1.149b0e39a3b6fp19 0x0.0p0 -0x1.320ccfedb2dccp6 0x1.d55555551ab68p4 0x0.0p0 F +REG nad27:903 0 OK 0x1.29a82703b4d5p19 0x1.7adbcde7569f6p16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff5fp4 0x0.0p0 F +REG nad27:903 1 OK 0x1.91928ee788995p18 -0x1.7410f5f8576b2p16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff44p4 0x0.0p0 F +REG nad27:903 2 OK 0x1.8a870693a55cbp19 -0x1.7410f5f8576b2p16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff48p4 0x0.0p0 F +REG nad27:903 3 OK 0x1.98477f98a072cp18 0x1.1dd677fb96d31p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff79p4 0x0.0p0 F +REG nad27:903 4 OK 0x1.872c8e3b197p19 0x1.1dd677fb96d31p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff79p4 0x0.0p0 F +REG nad83:1001 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48aaaaaaaaaacp6 0x1.dffffffffffffp4 0x0.0p0 F +REG nad83:1001 1 OK -0x1.766e097ce0738p18 -0x1.086e20025eee8p19 0x0.0p0 -0x1.5fc2bbc1b8033p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG nad83:1001 2 OK 0x1.7e8704be703a7p19 -0x1.086e20025eee8p19 0x0.0p0 -0x1.319299939d523p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG nad83:1001 3 OK -0x1.3fa2b1bafe19ap18 0x1.162ba237aca8ep19 0x0.0p0 -0x1.5fc2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG nad83:1001 4 OK 0x1.632158dd7f0d7p19 0x1.162ba237aca8fp19 0x0.0p0 -0x1.319299939dfefp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG nad83:1002 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.50aaaaaaaaaabp6 0x1.dffffffffffffp4 0x0.0p0 F +REG nad83:1002 1 OK 0x1.c767da0c7e2c8p16 -0x1.086e20025eee8p19 0x0.0p0 -0x1.67c2bbc1b8034p6 0x1.8fffffffc8548p4 0x0.0p0 F +REG nad83:1002 2 OK 0x1.3955825f381cep20 -0x1.086e20025eee8p19 0x0.0p0 -0x1.399299939d523p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG nad83:1002 3 OK 0x1.514a9c8a03ca4p17 0x1.162ba237aca8fp19 0x0.0p0 -0x1.67c2bbc1b7567p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG nad83:1002 4 OK 0x1.2ba2ac6ebf866p20 0x1.162ba237aca8ep19 0x0.0p0 -0x1.399299939dffp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG nad83:101 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.5755555555555p6 0x1.e8p4 0x0.0p0 F +REG nad83:101 1 OK -0x1.7706644eb5386p18 -0x1.085071e31c3a2p19 0x0.0p0 -0x1.6e8b909db386bp6 0x1.97ffffffc45e5p4 0x0.0p0 F +REG nad83:101 2 OK 0x1.7ed332275a9b8p19 -0x1.085071e31c3a3p19 0x0.0p0 -0x1.401f1a0cf724p6 0x1.97ffffffc45e6p4 0x0.0p0 F +REG nad83:101 3 OK -0x1.3f1d3a4415002p18 0x1.1654f0fc99a7ap19 0x0.0p0 -0x1.6e8b909dafe78p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG nad83:101 4 OK 0x1.62de9d220a7f7p19 0x1.1654f0fc99a79p19 0x0.0p0 -0x1.401f1a0cfac33p6 0x1.1bffffffbe2a2p5 0x0.0p0 F +REG nad83:102 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.5ep6 0x1.dffffffffffffp4 0x0.0p0 F +REG nad83:102 1 OK 0x1.02d19c440826p14 -0x1.087061b93ba1p19 0x0.0p0 -0x1.751811170d588p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG nad83:102 2 OK 0x1.20ecb98eefdf6p20 -0x1.087061b93ba1p19 0x0.0p0 -0x1.46e7eee8f2a78p6 0x1.8fffffffc8549p4 0x0.0p0 F +REG nad83:102 3 OK 0x1.1be3a4f1984c8p16 0x1.162e01f36b7d7p19 0x0.0p0 -0x1.751811170cabbp6 0x1.17ffffffc265bp5 0x0.0p0 F +REG nad83:102 4 OK 0x1.1339c5b0e67b4p20 0x1.162e01f36b7d7p19 0x0.0p0 -0x1.46e7eee8f3545p6 0x1.17ffffffc265bp5 0x0.0p0 F +REG nad83:1101 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.c0aaaaaaaaaabp6 0x1.4d55555555555p5 0x0.0p0 F +REG nad83:1101 1 OK -0x1.85616a765b6fcp18 -0x1.04cdd2a5e1d06p19 0x0.0p0 -0x1.db708506af78bp6 0x1.25555554afcacp5 0x0.0p0 F +REG nad83:1101 2 OK 0x1.8600b53b2db7ep19 -0x1.04cdd2a5e1d06p19 0x0.0p0 -0x1.a5e4d04ea5dcbp6 0x1.25555554afcacp5 0x0.0p0 F +REG nad83:1101 3 OK -0x1.30ce432978fb3p18 0x1.19e94e9600987p19 0x0.0p0 -0x1.db70850622b0ap6 0x1.755555544a325p5 0x0.0p0 F +REG nad83:1101 4 OK 0x1.5bb72194bc7dap19 0x1.19e94e9600987p19 0x0.0p0 -0x1.a5e4d04f32a4bp6 0x1.755555544a325p5 0x0.0p0 F +REG nad83:1102 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.c800000000001p6 0x1.4d55555555555p5 0x0.0p0 F +REG nad83:1102 1 OK -0x1.81a5a9d96dbfp16 -0x1.04cdd2a5e1d06p19 0x0.0p0 -0x1.e2c5da5c04cep6 0x1.25555554afcacp5 0x0.0p0 F +REG nad83:1102 2 OK 0x1.0c3e5a9d96dc4p20 -0x1.04cdd2a5e1d05p19 0x0.0p0 -0x1.ad3a25a3fb32p6 0x1.25555554afcacp5 0x0.0p0 F +REG nad83:1102 3 OK -0x1.7ac8652f1f66p13 0x1.19e94e9600987p19 0x0.0p0 -0x1.e2c5da5b7806p6 0x1.755555544a325p5 0x0.0p0 F +REG nad83:1102 4 OK 0x1.ee332194bc7e2p19 0x1.19e94e9600988p19 0x0.0p0 -0x1.ad3a25a487fap6 0x1.755555544a325p5 0x0.0p0 F +REG nad83:1103 0 OK 0x1.86ap19 0x0.0p0 0x0.0p0 -0x1.cfp6 0x1.4d55555555555p5 0x0.0p0 F +REG nad83:1103 1 OK 0x1.89215ebcc306p17 -0x1.04cce2bf362c9p19 0x0.0p0 -0x1.e9c5da5c04cep6 0x1.25555554afcacp5 0x0.0p0 F +REG nad83:1103 2 OK 0x1.557bd428679f4p20 -0x1.04cce2bf362c9p19 0x0.0p0 -0x1.b43a25a3fb32p6 0x1.25555554afcacp5 0x0.0p0 F +REG nad83:1103 3 OK 0x1.192388df690abp18 0x1.19e84b44ed352p19 0x0.0p0 -0x1.e9c5da5b78061p6 0x1.755555544a325p5 0x0.0p0 F +REG nad83:1103 4 OK 0x1.40571dc825bd5p20 0x1.19e84b44ed352p19 0x0.0p0 -0x1.b43a25a487fap6 0x1.755555544a325p5 0x0.0p0 F +REG nad83:1201 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6155555555555p6 0x1.2555555555555p5 0x0.0p0 F +REG nad83:1201 1 OK -0x1.1cd0fa6bf57cp18 -0x1.0689a5b7a18b9p19 0x0.0p0 -0x1.7a44648b866c2p6 0x1.faaaaaaa147ddp4 0x0.0p0 F +REG nad83:1201 2 OK 0x1.b3607d35fabd6p19 -0x1.0689a5b7a18bap19 0x0.0p0 -0x1.4866461f243e8p6 0x1.faaaaaaa147dcp4 0x0.0p0 F +REG nad83:1201 3 OK -0x1.ac33c0b8040d6p17 0x1.1839200d43c1p19 0x0.0p0 -0x1.7a44648b4c4cdp6 0x1.4d555554c3721p5 0x0.0p0 F +REG nad83:1201 4 OK 0x1.9004f02e0102cp19 0x1.1839200d43c0fp19 0x0.0p0 -0x1.4866461f5e5dep6 0x1.4d555554c3721p5 0x0.0p0 F +REG nad83:1202 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.68aaaaaaaaaabp6 0x1.2555555555555p5 0x0.0p0 F +REG nad83:1202 1 OK 0x1.a750197362b18p16 -0x1.06875fbf0c736p19 0x0.0p0 -0x1.8199b9e0dbc18p6 0x1.faaaaaaa147dcp4 0x0.0p0 F +REG nad83:1202 2 OK 0x1.3b56fe68c9d54p20 -0x1.06875fbf0c735p19 0x0.0p0 -0x1.4fbb9b747993ep6 0x1.faaaaaaa147ddp4 0x0.0p0 F +REG nad83:1202 3 OK 0x1.61150756c9a02p17 0x1.1836b2e08ebe4p19 0x0.0p0 -0x1.8199b9e0a1a23p6 0x1.4d555554c3721p5 0x0.0p0 F +REG nad83:1202 4 OK 0x1.29a95f1526cc4p20 0x1.1836b2e08ebe5p19 0x0.0p0 -0x1.4fbb9b74b3b33p6 0x1.4d555554c3721p5 0x0.0p0 F +REG nad83:1301 0 OK 0x1.86ap16 0x1.e848p17 0x0.0p0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 0x0.0p0 F +REG nad83:1301 1 OK -0x1.e136f54379af6p18 -0x1.18656e171a932p18 0x0.0p0 -0x1.6fe04911de609p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG nad83:1301 2 OK 0x1.52437aa1bcd85p19 -0x1.18656e171a93p18 0x0.0p0 -0x1.3d750c4376f4cp6 0x1.03ffffffaa663p5 0x0.0p0 F +REG nad83:1301 3 OK -0x1.98528057e67adp18 0x1.928ff7c9f3f98p19 0x0.0p0 -0x1.6fe049119990bp6 0x1.53ffffff5e375p5 0x0.0p0 F +REG nad83:1301 4 OK 0x1.2dd1402bf33ep19 0x1.928ff7c9f3f99p19 0x0.0p0 -0x1.3d750c43bbc4ap6 0x1.53ffffff5e375p5 0x0.0p0 F +REG nad83:1302 0 OK 0x1.b774p19 0x1.e848p17 0x0.0p0 -0x1.5c55555555555p6 0x1.2cp5 0x0.0p0 F +REG nad83:1302 1 OK 0x1.2c090abc8650ap18 -0x1.18656e171a932p18 0x0.0p0 -0x1.758af3bc890b3p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG nad83:1302 2 OK 0x1.6c71bd50de6bep20 -0x1.18656e171a932p18 0x0.0p0 -0x1.431fb6ee219f7p6 0x1.03ffffffaa663p5 0x0.0p0 F +REG nad83:1302 3 OK 0x1.74ed7fa819853p18 0x1.928ff7c9f3f98p19 0x0.0p0 -0x1.758af3bc443b5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG nad83:1302 4 OK 0x1.5a38a015f99ebp20 0x1.928ff7c9f3f98p19 0x0.0p0 -0x1.431fb6ee666f5p6 0x1.53ffffff5e375p5 0x0.0p0 F +REG nad83:1401 0 OK 0x1.6e36p20 0x1.0c1852630233cp20 0x0.0p0 -0x1.76p6 0x1.53111111111p5 0x0.0p0 F +REG nad83:1401 1 OK 0x1.3cc6ee6e82952p20 0x1.b9c38087ee744p19 0x0.0p0 -0x1.7f9125dd29e12p6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG nad83:1401 2 OK 0x1.9fa511917d6aep20 0x1.b9c38087ee744p19 0x0.0p0 -0x1.6c6eda22d61eep6 0x1.44eeeeeeeeed8p5 0x0.0p0 F +REG nad83:1401 3 OK 0x1.3f7cec2641667p20 0x1.3cad15fe09bd2p20 0x0.0p0 -0x1.7f9125dd29e12p6 0x1.6133333333326p5 0x0.0p0 F +REG nad83:1401 4 OK 0x1.9cef13d9be999p20 0x1.3cad15fe09bd2p20 0x0.0p0 -0x1.6c6eda22d61eep6 0x1.6133333333326p5 0x0.0p0 F +REG nad83:1402 0 OK 0x1.e848p18 0x1.82c9f01dbc1fap16 0x0.0p0 -0x1.76p6 0x1.472222222220ap5 0x0.0p0 F +REG nad83:1402 1 OK 0x1.20ebf9836dc72p18 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.38dddddddddc2p5 0x0.0p0 F +REG nad83:1402 2 OK 0x1.57d2033e491bdp19 -0x1.780a0d9caf9afp16 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.38dddddddddc2p5 0x0.0p0 F +REG nad83:1402 3 OK 0x1.2b698843885bbp18 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.7f6faf2a3211dp6 0x1.5566666666654p5 0x0.0p0 F +REG nad83:1402 4 OK 0x1.52933bde3bd19p19 0x1.24b27e8283bb3p18 0x0.0p0 -0x1.6c9050d5cdee3p6 0x1.5566666666654p5 0x0.0p0 F +REG nad83:1501 0 OK 0x1.86ap18 0x1.3a62d4681c87dp16 0x0.0p0 -0x1.88p6 0x1.387777777775cp5 0x0.0p0 F +REG nad83:1501 1 OK 0x1.cb1f1458ef0ddp17 -0x1.33c4695f07c75p16 0x0.0p0 -0x1.8f7828773d561p6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG nad83:1501 2 OK 0x1.13d83ae9c43bfp19 -0x1.33c4695f07c75p16 0x0.0p0 -0x1.8087d788c2a9fp6 0x1.2cdddddddddbdp5 0x0.0p0 F +REG nad83:1501 3 OK 0x1.d81683a3ea33dp17 0x1.dad4bab81c52fp17 0x0.0p0 -0x1.8f7828773d561p6 0x1.44111111110f9p5 0x0.0p0 F +REG nad83:1501 4 OK 0x1.109a5f1705728p19 0x1.dad4bab81c52fp17 0x0.0p0 -0x1.8087d788c2a9fp6 0x1.44111111110f9p5 0x0.0p0 F +REG nad83:1502 0 OK 0x1.86ap18 0x1.ed96d47608246p18 0x0.0p0 -0x1.8ap6 0x1.2ceeeeeeeeecbp5 0x0.0p0 F +REG nad83:1502 1 OK 0x1.651ae3466f31bp17 0x1.225e5e1328be2p18 0x0.0p0 -0x1.939837c9c43e7p6 0x1.1dbbbbbbbbb8fp5 0x0.0p0 F +REG nad83:1502 2 OK 0x1.2d59472e64343p19 0x1.225e5e1328be2p18 0x0.0p0 -0x1.8067c8363bc19p6 0x1.1dbbbbbbbbb8fp5 0x0.0p0 F +REG nad83:1502 3 OK 0x1.7a4c446942255p17 0x1.5f149a7304c92p19 0x0.0p0 -0x1.939837c9c43e7p6 0x1.3c22222222208p5 0x0.0p0 F +REG nad83:1502 4 OK 0x1.280ceee5af774p19 0x1.5f149a7304c92p19 0x0.0p0 -0x1.8067c8363bc19p6 0x1.3c22222222208p5 0x0.0p0 F +REG nad83:1601 0 OK 0x1.e848p18 0x1.3df579113cf25p16 0x0.0p0 -0x1.51p6 0x1.31dddddddddbdp5 0x0.0p0 F +REG nad83:1601 1 OK 0x1.456d66ffd9e56p18 -0x1.376259f320632p16 0x0.0p0 -0x1.5877fed64af86p6 0x1.26222222221fbp5 0x0.0p0 F +REG nad83:1601 2 OK 0x1.45914c80130d5p19 -0x1.376259f320632p16 0x0.0p0 -0x1.49880129b507ap6 0x1.26222222221fbp5 0x0.0p0 F +REG nad83:1601 3 OK 0x1.4bdf97e71dca1p18 0x1.e02b995c766e5p17 0x0.0p0 -0x1.5877fed64af86p6 0x1.3d9999999997fp5 0x0.0p0 F +REG nad83:1601 4 OK 0x1.4258340c711bp19 0x1.e02b995c766e5p17 0x0.0p0 -0x1.49880129b507ap6 0x1.3d9999999997fp5 0x0.0p0 F +REG nad83:1602 0 OK 0x1.e848p18 0x1.1f7d5ace3fc9ap19 0x0.0p0 -0x1.57p6 0x1.29111111110ecp5 0x0.0p0 F +REG nad83:1602 1 OK 0x1.36785c3381cddp18 0x1.93766c01072acp18 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.1c44444444419p5 0x0.0p0 F +REG nad83:1602 2 OK 0x1.4d0bd1e63f188p19 0x1.93766c01072acp18 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.1c44444444419p5 0x0.0p0 F +REG nad83:1602 3 OK 0x1.3dd669cff7b68p18 0x1.771cdca0c08ecp19 0x0.0p0 -0x1.5f071bc4256ebp6 0x1.35dddddddddbep5 0x0.0p0 F +REG nad83:1602 4 OK 0x1.495ccb1804242p19 0x1.771cdca0c08ecp19 0x0.0p0 -0x1.4ef8e43bda915p6 0x1.35dddddddddbep5 0x0.0p0 F +REG nad83:1701 0 OK 0x1.e848p19 0x1.d532d46be5604p16 0x0.0p0 -0x1.72p6 0x1.f9555555554d1p4 0x0.0p0 F +REG nad83:1701 1 OK 0x1.6fab4a4b43fb3p19 -0x1.ca039024f0eap16 0x0.0p0 -0x1.7c2c70110dbecp6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG nad83:1701 2 OK 0x1.30725ada5e021p20 -0x1.ca039024f0eap16 0x0.0p0 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaa1p4 0x0.0p0 F +REG nad83:1701 3 OK 0x1.752cf6f908c62p19 0x1.62a9faf049271p18 0x0.0p0 -0x1.7c2c70110dbecp6 0x1.0dfffffffffcbp5 0x0.0p0 F +REG nad83:1701 4 OK 0x1.2db184837b9cap20 0x1.62a9faf049271p18 0x0.0p0 -0x1.67d38feef2415p6 0x1.0dfffffffffcbp5 0x0.0p0 F +REG nad83:1702 0 OK 0x1.e848p19 0x1.dc49b66329bfbp16 0x0.0p0 -0x1.6d55555555555p6 0x1.d9999999998fdp4 0x0.0p0 F +REG nad83:1702 1 OK 0x1.6dfcfeff26892p19 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.777443444cdb4p6 0x1.b6666666665acp4 0x0.0p0 F +REG nad83:1702 2 OK 0x1.314980806cbb7p20 -0x1.d1a542a4f9791p16 0x0.0p0 -0x1.633667665dcf6p6 0x1.b6666666665acp4 0x0.0p0 F +REG nad83:1702 3 OK 0x1.733f4ec2f8418p19 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.777443444cdb4p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG nad83:1702 4 OK 0x1.2ea8589e83df4p20 0x1.67db2e2b822d3p18 0x0.0p0 -0x1.633667665dcf6p6 0x1.fcccccccccc4ap4 0x0.0p0 F +REG nad83:1703 0 OK 0x1.e848p19 0x1.f8eb3a7b179ffp16 0x0.0p0 -0x1.6d55555555555p6 0x1.aaaaaaaaaa9eep4 0x0.0p0 F +REG nad83:1703 1 OK 0x1.66c66cddf8956p19 -0x1.ee62e8730c3c5p16 0x0.0p0 -0x1.77c7107b1a9e2p6 0x1.855555555548p4 0x0.0p0 F +REG nad83:1703 2 OK 0x1.34e4c99103b55p20 -0x1.ee62e8730c3c5p16 0x0.0p0 -0x1.62e39a2f900c8p6 0x1.855555555548p4 0x0.0p0 F +REG nad83:1703 3 OK 0x1.6bffd1251689cp19 0x1.7d54bff3741ccp18 0x0.0p0 -0x1.77c7107b1a9e2p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG nad83:1703 4 OK 0x1.3248176d74bb2p20 0x1.7d54bff3741ccp18 0x0.0p0 -0x1.62e39a2f900c8p6 0x1.cffffffffff5cp4 0x0.0p0 F +REG nad83:1801 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.12p6 0x1.5d55555555555p5 0x0.0p0 F +REG nad83:1801 1 OK -0x1.26c1b0fd9cdep18 -0x1.0400f8baf07c9p19 0x0.0p0 -0x1.2da5fe0c06969p6 0x1.355555547262ap5 0x0.0p0 F +REG nad83:1801 2 OK 0x1.b858d87ece6fp19 -0x1.0400f8baf07c9p19 0x0.0p0 -0x1.ecb403e7f2d2fp5 0x1.355555547262ap5 0x0.0p0 F +REG nad83:1801 3 OK -0x1.980fc4abb9f1cp17 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.2da5fe0b47c52p6 0x1.85555554048dfp5 0x0.0p0 F +REG nad83:1801 4 OK 0x1.8afbf12aee7c7p19 0x1.1aa0929e4f12ap19 0x0.0p0 -0x1.ecb403e97075cp5 0x1.85555554048dfp5 0x0.0p0 F +REG nad83:1802 0 OK 0x1.b774p19 0x0.0p0 0x0.0p0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaabp5 0x0.0p0 F +REG nad83:1802 1 OK 0x1.24708fab1ab1ep18 -0x1.045b756794099p19 0x0.0p0 -0x1.33f07961a2ec2p6 0x1.2eaaaaa9e3a13p5 0x0.0p0 F +REG nad83:1802 2 OK 0x1.6e57dc153953dp20 -0x1.045b756794099p19 0x0.0p0 -0x1.fac9b7e764d27p5 0x1.2eaaaaa9e3a13p5 0x0.0p0 F +REG nad83:1802 3 OK 0x1.7c8efb163377fp18 0x1.1a569b35fd638p19 0x0.0p0 -0x1.33f07960fa8b3p6 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG nad83:1802 4 OK 0x1.5850413a73224p20 0x1.1a569b35fd639p19 0x0.0p0 -0x1.fac9b7e8b5945p5 0x1.7eaaaaa978a9ep5 0x0.0p0 F +REG nad83:1900 0 OK 0x1.86ap18 0x1.82a27f95ad742p16 0x0.0p0 -0x1.34p6 0x1.347777777775ap5 0x0.0p0 F +REG nad83:1900 1 OK 0x1.7f67f8df836dap17 -0x1.78c31960d2112p16 0x0.0p0 -0x1.3d1f495fce8bp6 0x1.263333333330ap5 0x0.0p0 F +REG nad83:1900 2 OK 0x1.26c601c81f253p19 -0x1.78c31960d2112p16 0x0.0p0 -0x1.2ae0b6a03175p6 0x1.263333333330ap5 0x0.0p0 F +REG nad83:1900 3 OK 0x1.92b98c3d8bcbp17 0x1.24621bba84df3p18 0x0.0p0 -0x1.3d1f495fce8bp6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG nad83:1900 4 OK 0x1.21f19cf09d0ddp19 0x1.24621bba84df3p18 0x0.0p0 -0x1.2ae0b6a03175p6 0x1.42bbbbbbbbba6p5 0x0.0p0 F +REG nad83:2001 0 OK 0x1.86ap17 0x1.9bdb6aa0a83acp19 0x0.0p0 -0x1.1ep6 0x1.4ebbbbbbbbba8p5 0x0.0p0 F +REG nad83:2001 1 OK 0x1.cecbec86f18ep12 0x1.41cda3331e33ep19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.414444444442dp5 0x0.0p0 F +REG nad83:2001 2 OK 0x1.7f64d04de439cp18 0x1.41cda3331e33ep19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.414444444442dp5 0x0.0p0 F +REG nad83:2001 3 OK 0x1.0e7a6fa3e7238p14 0x1.f859377ca58c4p19 0x0.0p0 -0x1.2709c381e3f4bp6 0x1.5c33333333324p5 0x0.0p0 F +REG nad83:2001 4 OK 0x1.75b85905c18dcp18 0x1.f859377ca58c4p19 0x0.0p0 -0x1.14f63c7e1c0b5p6 0x1.5c33333333324p5 0x0.0p0 F +REG nad83:2002 0 OK 0x1.e848p18 0x1.a35b682717ffcp14 0x0.0p0 -0x1.1ap6 0x1.49eeeeeeeeedap5 0x0.0p0 F +REG nad83:2002 1 OK 0x1.79c09677f485ep18 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeed8p5 0x0.0p0 F +REG nad83:2002 2 OK 0x1.2b67b4c405bd1p19 -0x1.4595d1a492d6bp16 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeed8p5 0x0.0p0 F +REG nad83:2002 3 OK 0x1.7d14ae939bd12p18 0x1.0f00633aa80ap17 0x0.0p0 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG nad83:2002 4 OK 0x1.29bda8b632177p19 0x1.0f00633aa80ap17 0x0.0p0 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeedbp5 0x0.0p0 F +REG nad83:201 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.b8aaaaaaaaaabp6 0x1.fp4 0x0.0p0 F +REG nad83:201 1 OK -0x1.6a82ac85a5facp18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.cfffd464bce7ep6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:201 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a15580f0986d7p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:201 3 OK -0x1.317a6ef7b4ddp18 0x1.1675fe947dbafp19 0x0.0p0 -0x1.cfffd464b6276p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:201 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a15580f09f2e1p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:202 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.bfaaaaaaaaaabp6 0x1.fp4 0x0.0p0 F +REG nad83:202 1 OK -0x1.6a82ac85a5fc2p18 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.d6ffd464bce7fp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:202 2 OK 0x1.859d5642d2fd6p19 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.a85580f0986d7p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:202 3 OK -0x1.317a6ef7b4de4p18 0x1.1675fe947dbbp19 0x0.0p0 -0x1.d6ffd464b6277p6 0x1.1fffffffb9a81p5 0x0.0p0 F +REG nad83:202 4 OK 0x1.6919377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.a85580f09f2e1p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:203 0 OK 0x1.a0b8p17 0x0.0p0 0x0.0p0 -0x1.c7p6 0x1.fp4 0x0.0p0 F +REG nad83:203 1 OK -0x1.6a878bbb1e97p18 -0x1.082c7bc58fa31p19 0x0.0p0 -0x1.de5529ba123d3p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:203 2 OK 0x1.859fc5dd8f4b8p19 -0x1.082c7bc58fa31p19 0x0.0p0 -0x1.afaad645edc2cp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:203 3 OK -0x1.317ed19346a22p18 0x1.16785ef2b249cp19 0x0.0p0 -0x1.de5529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:203 4 OK 0x1.691b68c9a3511p19 0x1.16785ef2b249cp19 0x0.0p0 -0x1.afaad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:2111 0 OK 0x1.e848p22 0x1.f347dc7be978p16 0x0.0p0 -0x1.5cp6 0x1.6f7777777776ep5 0x0.0p0 F +REG nad83:2111 1 OK 0x1.d7fb641e4ffb8p22 -0x1.ddacf38f9a9cbp16 0x0.0p0 -0x1.693a5d9ac6984p6 0x1.5d11111111105p5 0x0.0p0 F +REG nad83:2111 2 OK 0x1.f8949be1b0047p22 -0x1.ddacf38f9a9cbp16 0x0.0p0 -0x1.4ec5a2653967cp6 0x1.5d11111111105p5 0x0.0p0 F +REG nad83:2111 3 OK 0x1.d948a3589afd7p22 0x1.7b8c062ffdeb5p18 0x0.0p0 -0x1.693a5d9ac6985p6 0x1.81dddddddd58dp5 0x0.0p0 F +REG nad83:2111 4 OK 0x1.f7475ca765028p22 0x1.7b8c062ffdeb5p18 0x0.0p0 -0x1.4ec5a2653967cp6 0x1.81dddddddd58dp5 0x0.0p0 F +REG nad83:2112 0 OK 0x1.6e36p22 0x1.02a15db6d130bp17 0x0.0p0 -0x1.5177777777777p6 0x1.6411111111107p5 0x0.0p0 F +REG nad83:2112 1 OK 0x1.5d549a5613e79p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.50ffffffffffp5 0x0.0p0 F +REG nad83:2112 2 OK 0x1.7f1765a9ec186p22 -0x1.ef31298928b63p16 0x0.0p0 -0x1.44194582105b2p6 0x1.50ffffffffffp5 0x0.0p0 F +REG nad83:2112 3 OK 0x1.5ea9992c1edbdp22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.5ed5a96cde93cp6 0x1.772222222221ap5 0x0.0p0 F +REG nad83:2112 4 OK 0x1.7dc266d3e1242p22 0x1.8925ec9ca7931p18 0x0.0p0 -0x1.44194582105b2p6 0x1.772222222221ap5 0x0.0p0 F +REG nad83:2113 0 OK 0x1.e848p21 0x1.d60dc1a5c06e2p16 0x0.0p0 -0x1.5177777777777p6 0x1.54aaaaaaaaa99p5 0x0.0p0 F +REG nad83:2113 1 OK 0x1.c9c6746671c0ap21 -0x1.c51d717d9ec9bp16 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.435555555553cp5 0x0.0p0 F +REG nad83:2113 2 OK 0x1.0364c5ccc71fap22 -0x1.c51d717d9ec9bp16 0x0.0p0 -0x1.45b22d69850d3p6 0x1.435555555553cp5 0x0.0p0 F +REG nad83:2113 3 OK 0x1.cbd431dbd256ap21 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.5d3cc18569e1bp6 0x1.65ffffffffff5p5 0x0.0p0 F +REG nad83:2113 4 OK 0x1.025de71216d4ap22 0x1.6497c2bccaadbp18 0x0.0p0 -0x1.45b22d69850d3p6 0x1.65ffffffffff5p5 0x0.0p0 F +REG nad83:2201 0 OK 0x1.86ap19 0x1.aaec4d4682a7p17 0x0.0p0 -0x1.7466666666666p6 0x1.7c88888887f4bp5 0x0.0p0 F +REG nad83:2201 1 OK 0x1.0dc2f831dec45p19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.6b7777777776cp5 0x0.0p0 F +REG nad83:2201 2 OK 0x1.ff7d07ce213bbp19 -0x1.a76ffae3ddfep13 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.6b7777777776cp5 0x0.0p0 F +REG nad83:2201 3 OK 0x1.173c0bb149d57p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.810c081b7cfa8p6 0x1.8d9999999931p5 0x0.0p0 F +REG nad83:2201 4 OK 0x1.f603f44eb62a9p19 0x1.c1b439bafee72p18 0x0.0p0 -0x1.67c0c4b14fd24p6 0x1.8d9999999931p5 0x0.0p0 F +REG nad83:2202 0 OK 0x1.86ap19 0x1.a1d24afca2a94p17 0x0.0p0 -0x1.79p6 0x1.7033333333328p5 0x0.0p0 F +REG nad83:2202 1 OK 0x1.12e3b2799a8ccp19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.84cf488d08b84p6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG nad83:2202 2 OK 0x1.fa5c4d8665734p19 -0x1.29e4a9d3597p13 0x0.0p0 -0x1.6d30b772f747dp6 0x1.5fcccccccccbfp5 0x0.0p0 F +REG nad83:2202 3 OK 0x1.1b2ef330fb4e9p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.84cf488d08b84p6 0x1.8099999999113p5 0x0.0p0 F +REG nad83:2202 4 OK 0x1.f2110ccf04b17p19 0x1.b37d29ffe2536p18 0x0.0p0 -0x1.6d30b772f747dp6 0x1.8099999999113p5 0x0.0p0 F +REG nad83:2203 0 OK 0x1.86ap19 0x1.b3d65cf849782p17 0x0.0p0 -0x1.78p6 0x1.60dddddddddd2p5 0x0.0p0 F +REG nad83:2203 1 OK 0x1.096f7aabf58f9p19 -0x1.1ea067296231cp14 0x0.0p0 -0x1.84594387ce089p6 0x1.4f2222222220ep5 0x0.0p0 F +REG nad83:2203 2 OK 0x1.01e842aa05388p20 -0x1.1ea067296231cp14 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.4f2222222220ep5 0x0.0p0 F +REG nad83:2203 3 OK 0x1.1284e79bced76p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.84594387ce089p6 0x1.7299999999992p5 0x0.0p0 F +REG nad83:2203 4 OK 0x1.fabb186431292p19 0x1.cee59de0df989p18 0x0.0p0 -0x1.6ba6bc7831f77p6 0x1.7299999999992p5 0x0.0p0 F +REG nad83:2301 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.6355555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG nad83:2301 1 OK -0x1.143f2333f6832p18 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.7a4ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG nad83:2301 2 OK 0x1.af179199fb419p19 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.4c5aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG nad83:2301 3 OK -0x1.bd1a5ec7f3374p17 0x1.160a736457c56p19 0x0.0p0 -0x1.7a4ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG nad83:2301 4 OK 0x1.943e97b1fccddp19 0x1.160a736457c56p19 0x0.0p0 -0x1.4c5aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG nad83:2302 0 OK 0x1.55ccp19 0x0.0p0 0x0.0p0 -0x1.6955555555555p6 0x1.d800000000001p4 0x0.0p0 F +REG nad83:2302 1 OK 0x1.c983733025f38p16 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.804ffc5755b4p6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG nad83:2302 2 OK 0x1.3933c8ccfda0cp20 -0x1.0892da1c767f6p19 0x0.0p0 -0x1.525aae5354f6ap6 0x1.87ffffffcbf6p4 0x0.0p0 F +REG nad83:2302 3 OK 0x1.5025a1380cc8cp17 0x1.160a736457c56p19 0x0.0p0 -0x1.804ffc5757ccap6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG nad83:2302 4 OK 0x1.2bc74bd8fe66ep20 0x1.160a736457c56p19 0x0.0p0 -0x1.525aae5352de1p6 0x1.13ffffffc65e7p5 0x0.0p0 F +REG nad83:2401 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.6ap6 0x1.1eaaaaaaaaaabp5 0x0.0p0 F +REG nad83:2401 1 OK -0x1.4c8d5df3370dep18 -0x1.06c96377a7e7ep19 0x0.0p0 -0x1.82ab5906e587ap6 0x1.ed555554d17f7p4 0x0.0p0 F +REG nad83:2401 2 OK 0x1.9a6aaef99b86fp19 -0x1.06c96377a7e7ep19 0x0.0p0 -0x1.5154a6f91a786p6 0x1.ed555554d17f7p4 0x0.0p0 F +REG nad83:2401 3 OK -0x1.07f8838ade15dp18 0x1.17f1c3b54bdap19 0x0.0p0 -0x1.82ab5906b5259p6 0x1.46aaaaaa27403p5 0x0.0p0 F +REG nad83:2401 4 OK 0x1.782041c56f0aep19 0x1.17f1c3b54bdap19 0x0.0p0 -0x1.5154a6f94ada8p6 0x1.46aaaaaa27403p5 0x0.0p0 F +REG nad83:2402 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.72p6 0x1.1eaaaaaaaaaabp5 0x0.0p0 F +REG nad83:2402 1 OK -0x1.61a577ccdc378p16 -0x1.06c96377a7e7ep19 0x0.0p0 -0x1.8aab5906e587ap6 0x1.ed555554d17f7p4 0x0.0p0 F +REG nad83:2402 2 OK 0x1.0a3e577ccdc38p20 -0x1.06c96377a7e7ep19 0x0.0p0 -0x1.5954a6f91a786p6 0x1.ed555554d17f7p4 0x0.0p0 F +REG nad83:2402 3 OK -0x1.3d4838ade15dp14 0x1.17f1c3b54bdap19 0x0.0p0 -0x1.8aab5906b5259p6 0x1.46aaaaaa27403p5 0x0.0p0 F +REG nad83:2402 4 OK 0x1.f23241c56f0aep19 0x1.17f1c3b54bdap19 0x0.0p0 -0x1.5954a6f94ada7p6 0x1.46aaaaaa27403p5 0x0.0p0 F +REG nad83:2403 0 OK 0x1.9f0ap19 0x0.0p0 0x0.0p0 -0x1.7ap6 0x1.2155555555555p5 0x0.0p0 F +REG nad83:2403 1 OK 0x1.f9e988f2ccdbp17 -0x1.06af82f99fac4p19 0x0.0p0 -0x1.92c6193208634p6 0x1.f2aaaaaa1fcbdp4 0x0.0p0 F +REG nad83:2403 2 OK 0x1.5fcccee1a664ap20 -0x1.06af82f99fac4p19 0x0.0p0 -0x1.6139e6cdf79ccp6 0x1.f2aaaaaa1fcbdp4 0x0.0p0 F +REG nad83:2403 3 OK 0x1.42628ec8cd85dp18 0x1.180d8cccdde2ep19 0x0.0p0 -0x1.92c61931d4379p6 0x1.49555554cc4aep5 0x0.0p0 F +REG nad83:2403 4 OK 0x1.4e715c4dcc9e9p20 0x1.180d8cccdde2ep19 0x0.0p0 -0x1.6139e6ce2bc87p6 0x1.49555554cc4aep5 0x0.0p0 F +REG nad83:2500 0 OK 0x1.24f8p19 0x1.01baad6a08547p18 0x0.0p0 -0x1.b600000000001p6 0x1.74ffffffffff7p5 0x0.0p0 F +REG nad83:2500 1 OK 0x1.821136a1ef2p14 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.4efffffffffedp5 0x0.0p0 F +REG nad83:2500 2 OK 0x1.1eefbb257843dp20 -0x1.d29a18d133f54p17 0x0.0p0 -0x1.9a559330ab076p6 0x1.4efffffffffedp5 0x0.0p0 F +REG nad83:2500 3 OK 0x1.cc8347068f1ap16 0x1.8d46368264d4bp19 0x0.0p0 -0x1.d1aa6ccf54f8ap6 0x1.9affffffffb22p5 0x0.0p0 F +REG nad83:2500 4 OK 0x1.082fcb8f970eap20 0x1.8d46368264d4bp19 0x0.0p0 -0x1.9a559330ab076p6 0x1.9affffffffb22p5 0x0.0p0 F +REG nad83:2600 0 OK 0x1.e848p18 0x1.5756fd68b38aap17 0x0.0p0 -0x1.9p6 0x1.4b55555555543p5 0x0.0p0 F +REG nad83:2600 1 OK 0x1.fc0e2fc8e768p16 -0x1.45deb1b86688cp17 0x0.0p0 -0x1.a0e40642823c5p6 0x1.31fffffffffe1p5 0x0.0p0 F +REG nad83:2600 2 OK 0x1.a8c63a06e313p19 -0x1.45deb1b86688cp17 0x0.0p0 -0x1.7f1bf9bd7dc3bp6 0x1.31fffffffffe1p5 0x0.0p0 F +REG nad83:2600 3 OK 0x1.411c2fa692c82p17 0x1.05a24be6955d6p19 0x0.0p0 -0x1.a0e40642823c5p6 0x1.64aaaaaaaaa9fp5 0x0.0p0 F +REG nad83:2600 4 OK 0x1.9800f4165b4ep19 0x1.05a24be6955d6p19 0x0.0p0 -0x1.7f1bf9bd7dc3bp6 0x1.64aaaaaaaaa9fp5 0x0.0p0 F +REG nad83:2701 0 OK 0x1.86ap17 0x1.e848p22 0x0.0p0 -0x1.ce55555555556p6 0x1.16p5 0x0.0p0 F +REG nad83:2701 1 OK -0x1.7c011febf3c2ap18 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.e6acb8641ee7dp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG nad83:2701 2 OK 0x1.81508ff5f9e15p19 0x1.c7649d0de77b4p22 0x0.0p0 -0x1.b5fdf2468bc2ep6 0x1.dbffffff9083cp4 0x0.0p0 F +REG nad83:2701 3 OK -0x1.3a210725eeea4p18 0x1.059d806b5685fp23 0x0.0p0 -0x1.e6acb863f9e82p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG nad83:2701 4 OK 0x1.60608392f7752p19 0x1.059d806b5685fp23 0x0.0p0 -0x1.b5fdf246b0c28p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG nad83:2702 0 OK 0x1.e848p18 0x1.6e36p22 0x0.0p0 -0x1.d2aaaaaaaaaabp6 0x1.16p5 0x0.0p0 F +REG nad83:2702 1 OK -0x1.5c247fafcf0a8p16 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.eb020db9743d3p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG nad83:2702 2 OK 0x1.09e647fafcf0ap20 0x1.4d529d0de77b4p22 0x0.0p0 -0x1.ba53479be1183p6 0x1.dbffffff9083cp4 0x0.0p0 F +REG nad83:2702 3 OK -0x1.5290725eeea4p14 0x1.912900d6ad0bep22 0x0.0p0 -0x1.eb020db94f3d7p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG nad83:2702 4 OK 0x1.f2dc8392f7752p19 0x1.912900d6ad0bep22 0x0.0p0 -0x1.ba53479c0617ep6 0x1.3dffffff8d729p5 0x0.0p0 F +REG nad83:2703 0 OK 0x1.86ap19 0x1.e848p21 0x0.0p0 -0x1.da55555555555p6 0x1.16p5 0x0.0p0 F +REG nad83:2703 1 OK 0x1.9bddc028187acp17 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.f2acb8641ee7dp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG nad83:2703 2 OK 0x1.532447fafcf0ap20 0x1.a6813a1bcef68p21 0x0.0p0 -0x1.c1fdf2468bc2dp6 0x1.dbffffff9083cp4 0x0.0p0 F +REG nad83:2703 3 OK 0x1.0fcef8da1115cp18 0x1.171700d6ad0bep22 0x0.0p0 -0x1.f2acb863f9e81p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG nad83:2703 4 OK 0x1.42ac41c97bba9p20 0x1.171700d6ad0bep22 0x0.0p0 -0x1.c1fdf246b0c28p6 0x1.3dffffff8d729p5 0x0.0p0 F +REG nad83:2800 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 0x0.0p0 F +REG nad83:2800 1 OK -0x1.24fce9341c68ap18 -0x1.047d0f0d58e68p19 0x0.0p0 -0x1.39cb22ddbb732p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG nad83:2800 2 OK 0x1.b776749a0e33bp19 -0x1.047d0f0d58e69p19 0x0.0p0 -0x1.038a327799e25p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG nad83:2800 3 OK -0x1.9bca10038674cp17 0x1.1a377eefb259fp19 0x0.0p0 -0x1.39cb22dd1b618p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG nad83:2800 4 OK 0x1.8bea8400e19cap19 0x1.1a377eefb259ep19 0x0.0p0 -0x1.038a327839f3fp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG nad83:2900 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG nad83:2900 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcep5 0x0.0p0 F +REG nad83:2900 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcep5 0x0.0p0 F +REG nad83:2900 3 OK -0x1.65aacac7e3d1fp18 0x1.18ea99af207bfp19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2ebp5 0x0.0p0 F +REG nad83:2900 4 OK 0x1.45516563f1e9p19 0x1.18ea99af207bfp19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2ebp5 0x0.0p0 F +REG nad83:3001 0 OK 0x1.4244p17 0x0.0p0 0x0.0p0 -0x1.a155555555556p6 0x1.fp4 0x0.0p0 F +REG nad83:3001 1 OK -0x1.99be00ab810e2p18 -0x1.082ad8098ac15p19 0x0.0p0 -0x1.b8aa7f0f67929p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:3001 2 OK 0x1.6e010055c0871p19 -0x1.082ad8098ac15p19 0x0.0p0 -0x1.8a002b9b43182p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:3001 3 OK -0x1.60b5a122227p18 0x1.1676a47fa3564p19 0x0.0p0 -0x1.b8aa7f0f60d2p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:3001 4 OK 0x1.517cd0911138p19 0x1.1676a47fa3564p19 0x0.0p0 -0x1.8a002b9b49d8bp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:3002 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.a9p6 0x1.fp4 0x0.0p0 F +REG nad83:3002 1 OK -0x1.4a5ab21697ebp16 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.c05529ba123d4p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:3002 2 OK 0x1.08c9ab21697ebp20 -0x1.082a3aa308ecbp19 0x0.0p0 -0x1.91aad645edc2dp6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:3002 3 OK -0x1.98e6ef7b4ddp14 0x1.1675fe947dbafp19 0x0.0p0 -0x1.c05529ba0b7cbp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:3002 4 OK 0x1.f50f377bda6e8p19 0x1.1675fe947dbafp19 0x0.0p0 -0x1.91aad645f4836p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:3003 0 OK 0x1.9546p19 0x0.0p0 0x0.0p0 -0x1.af55555555555p6 0x1.fp4 0x0.0p0 F +REG nad83:3003 1 OK 0x1.df55c7bf3b6e4p17 -0x1.082b5b344c47ep19 0x0.0p0 -0x1.c6aa7f0f67929p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:3003 2 OK 0x1.595b470818924p20 -0x1.082b5b344c47ep19 0x0.0p0 -0x1.98002b9b43182p6 0x1.9fffffffc00bep4 0x0.0p0 F +REG nad83:3003 3 OK 0x1.28b35fba82406p18 0x1.16772ec398025p19 0x0.0p0 -0x1.c6aa7f0f60d2p6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:3003 4 OK 0x1.4b1928115f6fep20 0x1.16772ec398025p19 0x0.0p0 -0x1.98002b9b49d8bp6 0x1.1fffffffb9a8p5 0x0.0p0 F +REG nad83:301 0 OK 0x1.86ap18 0x1.9bb240973ac0fp16 0x0.0p0 -0x1.7p6 0x1.1a44444444418p5 0x0.0p0 F +REG nad83:301 1 OK 0x1.6603f51a6f6bcp17 -0x1.91c633a91b18ap16 0x0.0p0 -0x1.794f6bc4d5215p6 0x1.0b111111110d8p5 0x0.0p0 F +REG nad83:301 2 OK 0x1.2d1f02b96425cp19 -0x1.91c633a91b18ap16 0x0.0p0 -0x1.66b0943b2adebp6 0x1.0b111111110d8p5 0x0.0p0 F +REG nad83:301 3 OK 0x1.797b25aa020b6p17 0x1.3735788b9585cp18 0x0.0p0 -0x1.794f6bc4d5215p6 0x1.2977777777754p5 0x0.0p0 F +REG nad83:301 4 OK 0x1.284136957f7dcp19 0x1.3735788b9585cp18 0x0.0p0 -0x1.66b0943b2adebp6 0x1.2977777777754p5 0x0.0p0 F +REG nad83:302 0 OK 0x1.86ap18 0x1.f85a78d71c1dp18 0x0.0p0 -0x1.7p6 0x1.0dbbbbbbbbb86p5 0x0.0p0 F +REG nad83:302 1 OK 0x1.390d3a7ad513ep17 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.7a1942726255cp6 0x1.f9ddddddddd5ap4 0x0.0p0 F +REG nad83:302 2 OK 0x1.385cb1614abbp19 0x1.17c0dd5828e08p18 0x0.0p0 -0x1.65e6bd8d9daa4p6 0x1.f9ddddddddd5ap4 0x0.0p0 F +REG nad83:302 3 OK 0x1.4f7dff4ffa999p17 0x1.6f4f78798039cp19 0x0.0p0 -0x1.7a1942726255cp6 0x1.1e8888888886p5 0x0.0p0 F +REG nad83:302 4 OK 0x1.32c0802c0159ap19 0x1.6f4f78798039cp19 0x0.0p0 -0x1.65e6bd8d9daa4p6 0x1.1e8888888886p5 0x0.0p0 F +REG nad83:3101 0 OK 0x1.24f8p17 0x0.0p0 0x0.0p0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 0x0.0p0 F +REG nad83:3101 1 OK -0x1.b2247fce616eap18 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.43acc1169c914p6 0x1.0eaaaaaa40fcep5 0x0.0p0 F +REG nad83:3101 2 OK 0x1.6b8e3fe730b75p19 -0x1.05cec1bde170ap19 0x0.0p0 -0x1.10533ee9636ebp6 0x1.0eaaaaaa40fcep5 0x0.0p0 F +REG nad83:3101 3 OK -0x1.65aacac7e3d1fp18 0x1.18ea99af207bfp19 0x0.0p0 -0x1.43acc116446ap6 0x1.5eaaaaa9ec2ebp5 0x0.0p0 F +REG nad83:3101 4 OK 0x1.45516563f1e9p19 0x1.18ea99af207bfp19 0x0.0p0 -0x1.10533ee9bb95fp6 0x1.5eaaaaa9ec2ebp5 0x0.0p0 F +REG nad83:3102 0 OK 0x1.e848p17 0x0.0p0 0x0.0p0 -0x1.3255555555555p6 0x1.4p5 0x0.0p0 F +REG nad83:3102 1 OK -0x1.5221cfa7d36a2p18 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.4c7104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG nad83:3102 2 OK 0x1.9d34e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.1839a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG nad83:3102 3 OK -0x1.0266eb5117679p18 0x1.19530345ad8e5p19 0x0.0p0 -0x1.4c7104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG nad83:3102 4 OK 0x1.755775a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.1839a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG nad83:3103 0 OK 0x1.55ccp18 0x0.0p0 0x0.0p0 -0x1.3a55555555555p6 0x1.4p5 0x0.0p0 F +REG nad83:3103 1 OK -0x1.e0f39f4fa6d44p17 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.547104c6ae123p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG nad83:3103 2 OK 0x1.ce08e7d3e9b51p19 -0x1.05697bbbbbea7p19 0x0.0p0 -0x1.2039a5e3fc988p6 0x1.17ffffff80dd2p5 0x0.0p0 F +REG nad83:3103 3 OK -0x1.417dd6a22ecf2p17 0x1.19530345ad8e5p19 0x0.0p0 -0x1.547104c642601p6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG nad83:3103 4 OK 0x1.a62b75a88bb3cp19 0x1.19530345ad8e5p19 0x0.0p0 -0x1.2039a5e4684aap6 0x1.67ffffff24bcdp5 0x0.0p0 F +REG nad83:3104 0 OK 0x1.24f8p18 0x1.77ef514291e8ep15 0x0.0p0 -0x1.28p6 0x1.44cccccccccb4p5 0x0.0p0 F +REG nad83:3104 1 OK 0x1.6cf442c2356e7p17 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.3ccccccccccb1p5 0x0.0p0 F +REG nad83:3104 2 OK 0x1.9375de9ee548cp18 -0x1.e4f92712c1cb5p15 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.3ccccccccccb1p5 0x0.0p0 F +REG nad83:3104 3 OK 0x1.7379e78330bbfp17 0x1.388171947286dp17 0x0.0p0 -0x1.2d44a959c4a13p6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG nad83:3104 4 OK 0x1.90330c3e67a2p18 0x1.388171947286dp17 0x0.0p0 -0x1.22bb56a63b5edp6 0x1.4ccccccccccb8p5 0x0.0p0 F +REG nad83:3200 0 OK 0x1.29a8270a3d70ap19 0x1.05cc553074fc7p17 0x0.0p0 -0x1.3cp6 0x1.17aaaaaaaaa7bp5 0x0.0p0 F +REG nad83:3200 1 OK 0x1.449988c24f8ecp18 -0x1.fbb202943910bp16 0x0.0p0 -0x1.47cb7933f48aap6 0x1.0455555555519p5 0x0.0p0 F +REG nad83:3200 2 OK 0x1.b10389b353194p19 -0x1.fbb202943916cp16 0x0.0p0 -0x1.303486cc0b756p6 0x1.0455555555518p5 0x0.0p0 F +REG nad83:3200 3 OK 0x1.54278a411c65ap18 0x1.8c9503f2af03fp18 0x0.0p0 -0x1.47cb7933f48aap6 0x1.2afffffffffdep5 0x0.0p0 F +REG nad83:3200 4 OK 0x1.a93c88f3ecaddp19 0x1.8c9503f2af026p18 0x0.0p0 -0x1.303486cc0b756p6 0x1.2afffffffffdcp5 0x0.0p0 F +REG nad83:3301 0 OK 0x1.24f8p19 0x1.78644998c9558p16 0x0.0p0 -0x1.9200000000001p6 0x1.7eeeeeeeee61fp5 0x0.0p0 F +REG nad83:3301 1 OK 0x1.86e3d47c2716p18 -0x1.6b59668d8b4acp16 0x0.0p0 -0x1.9c55c3f143a71p6 0x1.7111111111108p5 0x0.0p0 F +REG nad83:3301 2 OK 0x1.867e15c1ec759p19 -0x1.6b59668d8b4acp16 0x0.0p0 -0x1.87aa3c0ebc58fp6 0x1.7111111111108p5 0x0.0p0 F +REG nad83:3301 3 OK 0x1.938524ed11a8ap18 0x1.1d672ca9e2fefp18 0x0.0p0 -0x1.9c55c3f143a71p6 0x1.8ccccccccc628p5 0x0.0p0 F +REG nad83:3301 4 OK 0x1.802d6d89772c3p19 0x1.1d672ca9e2fefp18 0x0.0p0 -0x1.87aa3c0ebc58fp6 0x1.8ccccccccc628p5 0x0.0p0 F +REG nad83:3302 0 OK 0x1.24f8p19 0x1.8a66ee530abefp16 0x0.0p0 -0x1.9200000000001p6 0x1.7499999999992p5 0x0.0p0 F +REG nad83:3302 1 OK 0x1.7d82f315976d9p18 -0x1.7cb5565dd86a8p16 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.6611111111105p5 0x0.0p0 F +REG nad83:3302 2 OK 0x1.8b2e86753449cp19 -0x1.7cb5565dd86a8p16 0x0.0p0 -0x1.876dc813d644fp6 0x1.6611111111105p5 0x0.0p0 F +REG nad83:3302 3 OK 0x1.8ac7b84e85b84p18 0x1.2b117f14055aep18 0x0.0p0 -0x1.9c9237ec29bb1p6 0x1.8322222221a07p5 0x0.0p0 F +REG nad83:3302 4 OK 0x1.848c23d8bd246p19 0x1.2b117f14055aep18 0x0.0p0 -0x1.876dc813d644fp6 0x1.8322222221a07p5 0x0.0p0 F +REG nad83:3401 0 OK 0x1.24f8p19 0x1.b900cf437e6bbp16 0x0.0p0 -0x1.4ap6 0x1.4577777777761p5 0x0.0p0 F +REG nad83:3401 1 OK 0x1.65d7a1966c1e6p18 -0x1.ab1680cb28019p16 0x0.0p0 -0x1.54b9b443558bap6 0x1.3533333333315p5 0x0.0p0 F +REG nad83:3401 2 OK 0x1.97042f34c9f03p19 -0x1.ab1680cb28019p16 0x0.0p0 -0x1.3f464bbcaa746p6 0x1.3533333333315p5 0x0.0p0 F +REG nad83:3401 3 OK 0x1.7366a7cc5f298p18 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.54b9b443558bap6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG nad83:3401 4 OK 0x1.903cac19d06acp19 0x1.4e1acf1eae10fp18 0x0.0p0 -0x1.3f464bbcaa746p6 0x1.55bbbbbbbbbabp5 0x0.0p0 F +REG nad83:3402 0 OK 0x1.24f8p19 0x1.b8df8871a13eap16 0x0.0p0 -0x1.4ap6 0x1.3822222222205p5 0x0.0p0 F +REG nad83:3402 1 OK 0x1.664049e589d4cp18 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.5477d61b148dfp6 0x1.27dddddddddb6p5 0x0.0p0 F +REG nad83:3402 2 OK 0x1.96cfdb0d3b15p19 -0x1.abc8d2424f464p16 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.27dddddddddb6p5 0x0.0p0 F +REG nad83:3402 3 OK 0x1.7307792426a48p18 0x1.4dd31bf55549bp18 0x0.0p0 -0x1.5477d61b148dfp6 0x1.486666666664fp5 0x0.0p0 F +REG nad83:3402 4 OK 0x1.906c436decad3p19 0x1.4dd31bf55549bp18 0x0.0p0 -0x1.3f8829e4eb721p6 0x1.486666666664fp5 0x0.0p0 F +REG nad83:3501 0 OK 0x1.24f8p19 0x1.7ed816e9b4378p16 0x0.0p0 -0x1.88p6 0x1.1f111111110e6p5 0x0.0p0 F +REG nad83:3501 1 OK 0x1.8562e4192a9fap18 -0x1.7613f4e13785bp16 0x0.0p0 -0x1.90b8d4acb5308p6 0x1.10eeeeeeeeebcp5 0x0.0p0 F +REG nad83:3501 2 OK 0x1.873e8df36ab03p19 -0x1.7613f4e13785bp16 0x0.0p0 -0x1.7f472b534acf8p6 0x1.10eeeeeeeeebcp5 0x0.0p0 F +REG nad83:3501 3 OK 0x1.8dfc39a798908p18 0x1.2149859be5d9fp18 0x0.0p0 -0x1.90b8d4acb5308p6 0x1.2d3333333330ep5 0x0.0p0 F +REG nad83:3501 4 OK 0x1.82f1e32c33b7cp19 0x1.2149859be5d9fp18 0x0.0p0 -0x1.7f472b534acf8p6 0x1.2d3333333330ep5 0x0.0p0 F +REG nad83:3502 0 OK 0x1.24f8p19 0x1.9ba104f191a3ap16 0x0.0p0 -0x1.88p6 0x1.124444444441p5 0x0.0p0 F +REG nad83:3502 1 OK 0x1.7681ef7e32504p18 -0x1.92145fac5d879p16 0x0.0p0 -0x1.9132b355fc5d3p6 0x1.03111111110d1p5 0x0.0p0 F +REG nad83:3502 2 OK 0x1.8eaf0840e6d74p19 -0x1.92145fac5d879p16 0x0.0p0 -0x1.7ecd4caa03a2ep6 0x1.03111111110d1p5 0x0.0p0 F +REG nad83:3502 3 OK 0x1.7fe2b5991fc66p18 0x1.3712b28c4a0e8p18 0x0.0p0 -0x1.9132b355fc5d3p6 0x1.217777777774fp5 0x0.0p0 F +REG nad83:3502 4 OK 0x1.89fea533701c4p19 0x1.3712b28c4a0e8p18 0x0.0p0 -0x1.7ecd4caa03a2ep6 0x1.217777777774fp5 0x0.0p0 F +REG nad83:3601 0 OK 0x1.312dp21 0x1.fa69b2b13792bp16 0x0.0p0 -0x1.e200000000001p6 0x1.66aaaaaaaaa9dp5 0x0.0p0 F +REG nad83:3601 1 OK 0x1.10236ef458cd1p21 -0x1.e50b558775169p16 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.53fffffffffeep5 0x0.0p0 F +REG nad83:3601 2 OK 0x1.5236910ba732fp21 -0x1.e50b558775169p16 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.53fffffffffeep5 0x0.0p0 F +REG nad83:3601 3 OK 0x1.12b762c28734bp21 0x1.80dba90e78559p18 0x0.0p0 -0x1.ef293dbbe3641p6 0x1.795555555554dp5 0x0.0p0 F +REG nad83:3601 4 OK 0x1.4fa29d3d78cb5p21 0x1.80dba90e78559p18 0x0.0p0 -0x1.d4d6c2441c9c1p6 0x1.795555555554dp5 0x0.0p0 F +REG nad83:3602 0 OK 0x1.6e36p20 0x1.fa3c387dc6aa6p16 0x0.0p0 -0x1.e200000000001p6 0x1.56aaaaaaaaa9bp5 0x0.0p0 F +REG nad83:3602 1 OK 0x1.2c50a9e7c3449p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.eeba2d4454415p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG nad83:3602 2 OK 0x1.b01b56183cbb7p20 -0x1.e65def0cc82f3p16 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.43fffffffffe9p5 0x0.0p0 F +REG nad83:3602 3 OK 0x1.311f9b3bb4076p20 0x1.8067800f699f6p18 0x0.0p0 -0x1.eeba2d4454415p6 0x1.695555555554ap5 0x0.0p0 F +REG nad83:3602 4 OK 0x1.ab4c64c44bf8ap20 0x1.8067800f699f6p18 0x0.0p0 -0x1.d545d2bbabbedp6 0x1.695555555554ap5 0x0.0p0 F +REG nad83:3701 0 OK 0x1.24f8p19 0x1.82cecd83b4ff7p16 0x0.0p0 -0x1.37p6 0x1.487777777775fp5 0x0.0p0 F +REG nad83:3701 1 OK 0x1.8289a2cb236bap18 -0x1.77fcaead221dp16 0x0.0p0 -0x1.4075cb858aac8p6 0x1.3a33333333319p5 0x0.0p0 F +REG nad83:3701 2 OK 0x1.88ab2e9a6e49ap19 -0x1.77fcaead221dp16 0x0.0p0 -0x1.2d8a347a75539p6 0x1.3a33333333319p5 0x0.0p0 F +REG nad83:3701 3 OK 0x1.8d19b32c112aep18 0x1.24b9880b771f7p18 0x0.0p0 -0x1.4075cb858aac8p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG nad83:3701 4 OK 0x1.83632669f76ap19 0x1.24b9880b771f7p18 0x0.0p0 -0x1.2d8a347a75539p6 0x1.56bbbbbbbbbacp5 0x0.0p0 F +REG nad83:3702 0 OK 0x1.24f8p19 0x1.623635ef1cbebp16 0x0.0p0 -0x1.37p6 0x1.413333333331bp5 0x0.0p0 F +REG nad83:3702 1 OK 0x1.93ddc76008933p18 -0x1.59729314e61eep16 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.3422222222204p5 0x0.0p0 F +REG nad83:3702 2 OK 0x1.80011c4ffbb66p19 -0x1.59729314e61eep16 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.3422222222204p5 0x0.0p0 F +REG nad83:3702 3 OK 0x1.9c6fffae6b3c8p18 0x1.0bcb3dcd4a2d4p18 0x0.0p0 -0x1.3f8c26cb1f465p6 0x1.4e44444444432p5 0x0.0p0 F +REG nad83:3702 4 OK 0x1.7bb80028ca61cp19 0x1.0bcb3dcd4a2d4p18 0x0.0p0 -0x1.2e73d934e0b9bp6 0x1.4e44444444432p5 0x0.0p0 F +REG nad83:3800 0 OK 0x1.86ap16 0x0.0p0 0x0.0p0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 0x0.0p0 F +REG nad83:3800 1 OK -0x1.e6349b6f89f4ep18 -0x1.0508c5f7d2c1cp19 0x0.0p0 -0x1.3888a96efecc2p6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG nad83:3800 2 OK 0x1.54c24db7c4fb1p19 -0x1.0508c5f7d2c1cp19 0x0.0p0 -0x1.037756910133ep6 0x1.20aaaaaa13b97p5 0x0.0p0 F +REG nad83:3800 3 OK -0x1.9359a05eb2815p18 0x1.19b7b45ee2afbp19 0x0.0p0 -0x1.3888a96e7e5e2p6 0x1.70aaaaa9b1416p5 0x0.0p0 F +REG nad83:3800 4 OK 0x1.2b54d02f59412p19 0x1.19b7b45ee2afbp19 0x0.0p0 -0x1.0377569181a1ep6 0x1.70aaaaa9b1416p5 0x0.0p0 F +REG nad83:3900 0 OK 0x1.29a8p19 0x1.44e4cd737cdd2p17 0x0.0p0 -0x1.44p6 0x1.0aaaaaaaaaa7p5 0x0.0p0 F +REG nad83:3900 1 OK 0x1.01b075d8c6967p18 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.525ce4d3b432dp6 0x1.e5555555554c3p4 0x0.0p0 F +REG nad83:3900 2 OK 0x1.d277c5139cb4cp19 -0x1.395a9101c4e14p17 0x0.0p0 -0x1.35a31b2c4bcd3p6 0x1.e5555555554c3p4 0x0.0p0 F +REG nad83:3900 3 OK 0x1.184511ebb6df1p18 0x1.ecf86f2a1e6dbp18 0x0.0p0 -0x1.525ce4d3b432dp6 0x1.22aaaaaaaaa85p5 0x0.0p0 F +REG nad83:3900 4 OK 0x1.c72d770a24908p19 0x1.ecf86f2a1e6dbp18 0x0.0p0 -0x1.35a31b2c4bcd3p6 0x1.22aaaaaaaaa85p5 0x0.0p0 F +REG nad83:4001 0 OK 0x1.24f8p19 0x1.9183defeabcd8p16 0x0.0p0 -0x1.9p6 0x1.6611111111105p5 0x0.0p0 F +REG nad83:4001 1 OK 0x1.7a12a2f6fa879p18 -0x1.84349bda998e3p16 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.5744444444435p5 0x0.0p0 F +REG nad83:4001 2 OK 0x1.8ce6ae8482bc4p19 -0x1.84349bda998e3p16 0x0.0p0 -0x1.8594248c0bd8ap6 0x1.5744444444435p5 0x0.0p0 F +REG nad83:4001 3 OK 0x1.86fe8b1a87fb4p18 0x1.3052f091f3e42p18 0x0.0p0 -0x1.9a6bdb73f4276p6 0x1.74dddddddddd4p5 0x0.0p0 F +REG nad83:4001 4 OK 0x1.8670ba72bc026p19 0x1.3052f091f3e42p18 0x0.0p0 -0x1.8594248c0bd8ap6 0x1.74dddddddddd4p5 0x0.0p0 F +REG nad83:4002 0 OK 0x1.24f8p19 0x1.c069e4aef599p16 0x0.0p0 -0x1.9155555555555p6 0x1.5aeeeeeeeeeep5 0x0.0p0 F +REG nad83:4002 1 OK 0x1.614d92de92fbfp18 -0x1.b0959713a701ap16 0x0.0p0 -0x1.9cb46504892e6p6 0x1.4a66666666652p5 0x0.0p0 F +REG nad83:4002 2 OK 0x1.99493690b682p19 -0x1.b0959713a701ap16 0x0.0p0 -0x1.85f645a6217c4p6 0x1.4a66666666652p5 0x0.0p0 F +REG nad83:4002 3 OK 0x1.70a6d67cda4a4p18 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.9cb46504892e6p6 0x1.6b7777777776bp5 0x0.0p0 F +REG nad83:4002 4 OK 0x1.919c94c192daep19 0x1.5419b7a9bd7b8p18 0x0.0p0 -0x1.85f645a6217c4p6 0x1.6b7777777776bp5 0x0.0p0 F +REG nad83:401 0 OK 0x1.e848p20 0x1.3364f31e84529p19 0x0.0p0 -0x1.e8p6 0x1.43fffffffffe9p5 0x0.0p0 F +REG nad83:401 1 OK 0x1.a694a77213576p20 0x1.6e55b9fe27267p18 0x0.0p0 -0x1.f4462e6374a3cp6 0x1.3155555555538p5 0x0.0p0 F +REG nad83:401 2 OK 0x1.14fdac46f6545p21 0x1.6e55b9fe27267p18 0x0.0p0 -0x1.dbb9d19c8b5c3p6 0x1.3155555555538p5 0x0.0p0 F +REG nad83:401 3 OK 0x1.ab02d75b6d7f4p20 0x1.b4170bc79dd8bp19 0x0.0p0 -0x1.f4462e6374a3cp6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG nad83:401 4 OK 0x1.12c6945249406p21 0x1.b4170bc79dd8bp19 0x0.0p0 -0x1.dbb9d19c8b5c3p6 0x1.56aaaaaaaaa99p5 0x0.0p0 F +REG nad83:402 0 OK 0x1.e848p20 0x1.2edbfd68bd82cp19 0x0.0p0 -0x1.e8p6 0x1.35fffffffffe2p5 0x0.0p0 F +REG nad83:402 1 OK 0x1.ab8988a59601ap20 0x1.7686899058647p18 0x0.0p0 -0x1.f31cdda2c7b91p6 0x1.24aaaaaaaaa83p5 0x0.0p0 F +REG nad83:402 2 OK 0x1.12833bad34feep21 0x1.768689905862fp18 0x0.0p0 -0x1.dce3225d3847p6 0x1.24aaaaaaaaa8p5 0x0.0p0 F +REG nad83:402 3 OK 0x1.af20a901cbc0cp20 0x1.a61423074e6b6p19 0x0.0p0 -0x1.f31cdda2c7b91p6 0x1.4755555555544p5 0x0.0p0 F +REG nad83:402 4 OK 0x1.10b7ab7f1a1f6p21 0x1.a61423074e6aap19 0x0.0p0 -0x1.dce3225d3847p6 0x1.475555555554p5 0x0.0p0 F +REG nad83:403 0 OK 0x1.e848p20 0x1.288629cc78876p19 0x0.0p0 -0x1.e200000000001p6 0x1.2bbbbbbbbbb97p5 0x0.0p0 F +REG nad83:403 1 OK 0x1.b2517a86ff569p20 0x1.824d721b5b193p18 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.1c44444444419p5 0x0.0p0 F +REG nad83:403 2 OK 0x1.0f1f42bc80551p21 0x1.824d721b5b193p18 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.1c44444444419p5 0x0.0p0 F +REG nad83:403 3 OK 0x1.b50b9ae03f73cp20 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.ebbe49440fcc8p6 0x1.3b33333333315p5 0x0.0p0 F +REG nad83:403 4 OK 0x1.0dc2328fe0466p21 0x1.92a6fed4b62c4p19 0x0.0p0 -0x1.d841b6bbf0337p6 0x1.3b33333333315p5 0x0.0p0 F +REG nad83:404 0 OK 0x1.e848p20 0x1.28103e26de4a6p19 0x0.0p0 -0x1.dcp6 0x1.225555555552dp5 0x0.0p0 F +REG nad83:404 1 OK 0x1.b2d9fef47e8bep20 0x1.830f36bf52322p18 0x0.0p0 -0x1.e58306e0bb626p6 0x1.12fffffffffcep5 0x0.0p0 F +REG nad83:404 2 OK 0x1.0edb0085c0ba1p21 0x1.830f36bf52322p18 0x0.0p0 -0x1.d27cf91f449dap6 0x1.12fffffffffcep5 0x0.0p0 F +REG nad83:404 3 OK 0x1.b56c47b83ddc5p20 0x1.91316686f133ep19 0x0.0p0 -0x1.e58306e0bb626p6 0x1.31aaaaaaaaa8ap5 0x0.0p0 F +REG nad83:404 4 OK 0x1.0d91dc23e111ep21 0x1.91316686f133ep19 0x0.0p0 -0x1.d27cf91f449dap6 0x1.31aaaaaaaaa8ap5 0x0.0p0 F +REG nad83:405 0 OK 0x1.e848p20 0x1.29667c04d6702p19 0x0.0p0 -0x1.d800000000001p6 0x1.13dddddddddabp5 0x0.0p0 F +REG nad83:405 1 OK 0x1.b184d81035d3ap20 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.04222222221e5p5 0x0.0p0 F +REG nad83:405 2 OK 0x1.0f8593f7e5168p21 0x1.8056d46d4e9dap18 0x0.0p0 -0x1.ce74d980461cfp6 0x1.04222222221e5p5 0x0.0p0 F +REG nad83:405 3 OK 0x1.b40c2acdd40cep20 0x1.95303fbcafa2p19 0x0.0p0 -0x1.e18b267fb9e31p6 0x1.2399999999972p5 0x0.0p0 F +REG nad83:405 4 OK 0x1.0e41ea9915f9ep21 0x1.95303fbcafa2p19 0x0.0p0 -0x1.ce74d980461cfp6 0x1.2399999999972p5 0x0.0p0 F +REG nad83:406 0 OK 0x1.e848p20 0x1.229ee66609ac4p19 0x0.0p0 -0x1.d1p6 0x1.08333333332fap5 0x0.0p0 F +REG nad83:406 1 OK 0x1.b8abef1782b6p20 0x1.8d2cf232d3908p18 0x0.0p0 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeee64p4 0x0.0p0 F +REG nad83:406 2 OK 0x1.0bf208743ea4bp21 0x1.8d2cf232d3908p18 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeee64p4 0x0.0p0 F +REG nad83:406 3 OK 0x1.ba7f49f3389adp20 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeebfp5 0x0.0p0 F +REG nad83:406 4 OK 0x1.0b085b0663b25p21 0x1.807f9c472ab5dp19 0x0.0p0 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeecp5 0x0.0p0 F +REG nad83:4100 0 OK 0x1.24f8p19 0x1.c374b0c96a842p16 0x0.0p0 -0x1.58p6 0x1.1afffffffffd2p5 0x0.0p0 F +REG nad83:4100 1 OK 0x1.6156ff6ed09a8p18 -0x1.b771fc9c07bc3p16 0x0.0p0 -0x1.62385d901218dp6 0x1.0a5555555552p5 0x0.0p0 F +REG nad83:4100 2 OK 0x1.9944804897b36p19 -0x1.b771fc9c07bc3p16 0x0.0p0 -0x1.4dc7a26fede73p6 0x1.0a5555555552p5 0x0.0p0 F +REG nad83:4100 3 OK 0x1.6d2075658a948p18 0x1.55857df9dce35p18 0x0.0p0 -0x1.62385d901218dp6 0x1.2baaaaaaaaa89p5 0x0.0p0 F +REG nad83:4100 4 OK 0x1.935fc54d3ab66p19 0x1.55857df9dce35p18 0x0.0p0 -0x1.4dc7a26fede73p6 0x1.2baaaaaaaaa89p5 0x0.0p0 F +REG nad83:4201 0 OK 0x1.86ap17 0x1.11b5203b20bf3p20 0x0.0p0 -0x1.96p6 0x1.18bbbbbbbbb8cp5 0x0.0p0 F +REG nad83:4201 1 OK -0x1.851df507c37ecp15 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.a0ac641220f45p6 0x1.0744444444409p5 0x0.0p0 F +REG nad83:4201 2 OK 0x1.b743bea0f86e9p18 0x1.aec6d0b58300cp19 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.074444444440bp5 0x0.0p0 F +REG nad83:4201 3 OK -0x1.1ef65dbb0a81p15 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.a0ac641220f45p6 0x1.2a3333333330ep5 0x0.0p0 F +REG nad83:4201 4 OK 0x1.aa7ecbb7614efp18 0x1.4da37a13fbd92p20 0x0.0p0 -0x1.8b539beddf0bbp6 0x1.2a3333333330ep5 0x0.0p0 F +REG nad83:4202 0 OK 0x1.24f8p19 0x1.03b519dcaa4e2p21 0x0.0p0 -0x1.8ap6 0x1.068888888884ep5 0x0.0p0 F +REG nad83:4202 1 OK 0x1.493a06e43dfdbp18 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.94f271ed65e92p6 0x1.e8444444443bap4 0x0.0p0 F +REG nad83:4202 2 OK 0x1.a552fc8de1012p19 0x1.c9f96f3a1b13ep20 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.e8444444443bap4 0x0.0p0 F +REG nad83:4202 3 OK 0x1.56349b0477abap18 0x1.233fbea60123cp21 0x0.0p0 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG nad83:4202 4 OK 0x1.9ed5b27dc42a3p19 0x1.233fbea60123cp21 0x0.0p0 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeec1p5 0x0.0p0 F +REG nad83:4203 0 OK 0x1.55ccp19 0x1.7d35824812e3bp21 0x0.0p0 -0x1.9155555555555p6 0x1.ec666666665d5p4 0x0.0p0 F +REG nad83:4203 1 OK 0x1.b4e3d616ca051p18 0x1.5f90f9daa8a83p21 0x0.0p0 -0x1.9ba738e53ac9fp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG nad83:4203 2 OK 0x1.d12614f49afd8p19 0x1.5f90f9daa8a83p21 0x0.0p0 -0x1.870371c56fe0cp6 0x1.c8eeeeeeeee46p4 0x0.0p0 F +REG nad83:4203 3 OK 0x1.c005ca30a44eep18 0x1.9b8e7ec62b6b3p21 0x0.0p0 -0x1.9ba738e53ac9fp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG nad83:4203 4 OK 0x1.cb951ae7add89p19 0x1.9b8e7ec62b6b3p21 0x0.0p0 -0x1.870371c56fe0cp6 0x1.07eeeeeeeeeb7p5 0x0.0p0 F +REG nad83:4204 0 OK 0x1.24f8p19 0x1.f8da973ad2648p21 0x0.0p0 -0x1.8cp6 0x1.d0eeeeeeeee4fp4 0x0.0p0 F +REG nad83:4204 1 OK 0x1.39170370f7319p18 0x1.d81c71ab6b3b2p21 0x0.0p0 -0x1.97361161034adp6 0x1.a9bbbbbbbbaffp4 0x0.0p0 F +REG nad83:4204 2 OK 0x1.ad647e4784669p19 0x1.d81c71ab6b3b2p21 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbaffp4 0x0.0p0 F +REG nad83:4204 3 OK 0x1.45cd37c6ce463p18 0x1.0d334102db233p22 0x0.0p0 -0x1.97361161034adp6 0x1.f82222222219fp4 0x0.0p0 F +REG nad83:4204 4 OK 0x1.a709641c98dc4p19 0x1.0d334102db233p22 0x0.0p0 -0x1.80c9ee9efcb53p6 0x1.f82222222219fp4 0x0.0p0 F +REG nad83:4205 0 OK 0x1.24f8p18 0x1.388061690fbffp22 0x0.0p0 -0x1.8ap6 0x1.abfffffffff43p4 0x0.0p0 F +REG nad83:4205 1 OK 0x1.a664dec720bbp15 0x1.29fe05d7e9965p22 0x0.0p0 -0x1.93b49156c66f9p6 0x1.8955555555486p4 0x0.0p0 F +REG nad83:4205 2 OK 0x1.0a91b2138df5p19 0x1.29fe05d7e9965p22 0x0.0p0 -0x1.804b6ea939907p6 0x1.8955555555486p4 0x0.0p0 F +REG nad83:4205 3 OK 0x1.ee847b1cd75b8p15 0x1.474bc56e75c3fp22 0x0.0p0 -0x1.93b49156c66f9p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG nad83:4205 4 OK 0x1.060fb84e328bp19 0x1.474bc56e75c3fp22 0x0.0p0 -0x1.804b6ea939907p6 0x1.ceaaaaaaaaa03p4 0x0.0p0 F +REG nad83:4301 0 OK 0x1.e848p18 0x1.07cbea1e0cb02p20 0x0.0p0 -0x1.bep6 0x1.4877777777762p5 0x0.0p0 F +REG nad83:4301 1 OK 0x1.46f65077d027bp18 0x1.c1dbe7354b557p19 0x0.0p0 -0x1.c5b11f7fb8877p6 0x1.3cdddddddddc6p5 0x0.0p0 F +REG nad83:4301 2 OK 0x1.44ccd7c417ec2p19 0x1.c1dbe7354b557p19 0x0.0p0 -0x1.b64ee08047789p6 0x1.3cdddddddddc6p5 0x0.0p0 F +REG nad83:4301 3 OK 0x1.4dec09f87a223p18 0x1.2f8b22069ec51p20 0x0.0p0 -0x1.c5b11f7fb8877p6 0x1.5411111111103p5 0x0.0p0 F +REG nad83:4301 4 OK 0x1.4151fb03c2eeep19 0x1.2f8b22069ec51p20 0x0.0p0 -0x1.b64ee08047789p6 0x1.5411111111103p5 0x0.0p0 F +REG nad83:4302 0 OK 0x1.e848p18 0x1.03d6a5693a184p21 0x0.0p0 -0x1.bep6 0x1.3beeeeeeeeed3p5 0x0.0p0 F +REG nad83:4302 1 OK 0x1.c777142a43774p17 0x1.c9f7f661d8bf9p20 0x0.0p0 -0x1.ca0202c3d20c7p6 0x1.296666666663fp5 0x0.0p0 F +REG nad83:4302 2 OK 0x1.766a3af56f21ap19 0x1.c9f7f661d8bf9p20 0x0.0p0 -0x1.b1fdfd3c2df39p6 0x1.296666666663fp5 0x0.0p0 F +REG nad83:4302 3 OK 0x1.e92fa135fb9dap17 0x1.23c16caecd92ap21 0x0.0p0 -0x1.ca0202c3d20c7p6 0x1.4e77777777764p5 0x0.0p0 F +REG nad83:4302 4 OK 0x1.6dfc17b28118p19 0x1.23c16caecd92ap21 0x0.0p0 -0x1.b1fdfd3c2df39p6 0x1.4e77777777764p5 0x0.0p0 F +REG nad83:4303 0 OK 0x1.e848p18 0x1.799d159870769p21 0x0.0p0 -0x1.bep6 0x1.2c111111110eep5 0x0.0p0 F +REG nad83:4303 1 OK 0x1.2cf0c3e5720bcp18 0x1.631285ffcc797p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.1e9999999997p5 0x0.0p0 F +REG nad83:4303 2 OK 0x1.51cf9e0d46f98p19 0x1.631285ffcc797p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.1e9999999997p5 0x0.0p0 F +REG nad83:4303 3 OK 0x1.35388abd60d69p18 0x1.90ad8948207p21 0x0.0p0 -0x1.c67cf5fa2459ep6 0x1.398888888886ep5 0x0.0p0 F +REG nad83:4303 4 OK 0x1.4dabbaa14f942p19 0x1.90ad8948207p21 0x0.0p0 -0x1.b5830a05dba63p6 0x1.398888888886ep5 0x0.0p0 F +REG nad83:4400 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.22p6 0x1.54p5 0x0.0p0 F +REG nad83:4400 1 OK -0x1.86b2371366888p16 -0x1.047ce66797424p19 0x0.0p0 -0x1.3d20783310c86p6 0x1.2bffffff4328ep5 0x0.0p0 F +REG nad83:4400 2 OK 0x1.0c8f23713668ep20 -0x1.047ce66797423p19 0x0.0p0 -0x1.06df87ccef37ap6 0x1.2bffffff4328ep5 0x0.0p0 F +REG nad83:4400 3 OK -0x1.52974533fa9p13 0x1.1a3752e5f591dp19 0x0.0p0 -0x1.3d20783270b6cp6 0x1.7bfffffed9962p5 0x0.0p0 F +REG nad83:4400 4 OK 0x1.ed925d14cfeacp19 0x1.1a3752e5f591ep19 0x0.0p0 -0x1.06df87cd8f494p6 0x1.7bfffffed9962p5 0x0.0p0 F +REG nad83:4501 0 OK 0x1.ab3fp21 0x1.fd0ea68704fd6p20 0x0.0p0 -0x1.3ap6 0x1.337777777775bp5 0x0.0p0 F +REG nad83:4501 1 OK 0x1.95f147861eaa9p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.41d46dd6b3ca8p6 0x1.273333333330ap5 0x0.0p0 F +REG nad83:4501 2 OK 0x1.c08cb879e1557p21 0x1.d3f52a515d187p20 0x0.0p0 -0x1.322b92294c358p6 0x1.273333333330ap5 0x0.0p0 F +REG nad83:4501 3 OK 0x1.96d41ac64eeb9p21 0x1.1386e31afbaaep21 0x0.0p0 -0x1.41d46dd6b3ca8p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG nad83:4501 4 OK 0x1.bfa9e539b1147p21 0x1.1386e31afbaaep21 0x0.0p0 -0x1.322b92294c358p6 0x1.3fbbbbbbbbba4p5 0x0.0p0 F +REG nad83:4502 0 OK 0x1.ab3fp21 0x1.0a444f96cdd39p20 0x0.0p0 -0x1.3ap6 0x1.293333333330fp5 0x0.0p0 F +REG nad83:4502 1 OK 0x1.948be2212e3cp21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.423262b0988ep6 0x1.1c222222221f5p5 0x0.0p0 F +REG nad83:4502 2 OK 0x1.c1f21dded1c43p21 0x1.bd02576b8c934p19 0x0.0p0 -0x1.31cd9d4f6772p6 0x1.1c222222221f5p5 0x0.0p0 F +REG nad83:4502 3 OK 0x1.9581cef94f684p21 0x1.370054f6b6497p20 0x0.0p0 -0x1.423262b0988ep6 0x1.3644444444426p5 0x0.0p0 F +REG nad83:4502 4 OK 0x1.c0fc3106b097fp21 0x1.370054f6b6497p20 0x0.0p0 -0x1.31cd9d4f6772p6 0x1.3644444444426p5 0x0.0p0 F +REG nad83:4601 0 OK 0x1.e848p18 0x1.78658ca9787b1p16 0x0.0p0 -0x1.e355555555556p6 0x1.7eeeeeeeee61fp5 0x0.0p0 F +REG nad83:4601 1 OK 0x1.253a8c1cc9a6cp18 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.edab194698fc6p6 0x1.711111111110ap5 0x0.0p0 F +REG nad83:4601 2 OK 0x1.55aab9f19b2dbp19 -0x1.6b59a87c1a413p16 0x0.0p0 -0x1.d8ff916411ae4p6 0x1.711111111110ap5 0x0.0p0 F +REG nad83:4601 3 OK 0x1.31dd91f699804p18 0x1.1d67e3990ab26p18 0x0.0p0 -0x1.edab194698fc6p6 0x1.8ccccccccc628p5 0x0.0p0 F +REG nad83:4601 4 OK 0x1.4f593704b340ep19 0x1.1d67e3990ab26p18 0x0.0p0 -0x1.d8ff916411ae4p6 0x1.8ccccccccc628p5 0x0.0p0 F +REG nad83:4602 0 OK 0x1.e848p18 0x1.b22d72e072903p16 0x0.0p0 -0x1.e200000000001p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG nad83:4602 1 OK 0x1.0692a3ae46b62p18 -0x1.a1af51306fc01p16 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaa9ep5 0x0.0p0 F +REG nad83:4602 2 OK 0x1.64feae28dca4fp19 -0x1.a1af51306fc01p16 0x0.0p0 -0x1.d669de65b05cdp6 0x1.62aaaaaaaaa9ep5 0x0.0p0 F +REG nad83:4602 3 OK 0x1.16844fa8b2f1bp18 0x1.498d0225ce03p18 0x0.0p0 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaa27ap5 0x0.0p0 F +REG nad83:4602 4 OK 0x1.5d05d82ba6872p19 0x1.498d0225ce03p18 0x0.0p0 -0x1.d669de65b05cdp6 0x1.82aaaaaaaa27ap5 0x0.0p0 F +REG nad83:4701 0 OK 0x1.24f8p19 0x1.7b73a47e53336p16 0x0.0p0 -0x1.3ep6 0x1.3afffffffffe3p5 0x0.0p0 F +REG nad83:4701 1 OK 0x1.86afa96cb71f7p18 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.470e3592d233ap6 0x1.2cfffffffffdep5 0x0.0p0 F +REG nad83:4701 2 OK 0x1.86982b49a4704p19 -0x1.71aa8e662b4c2p16 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.2cfffffffffdep5 0x0.0p0 F +REG nad83:4701 3 OK 0x1.903faf5fb33fep18 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.470e3592d233ap6 0x1.48fffffffffe9p5 0x0.0p0 F +REG nad83:4701 4 OK 0x1.81d0285026601p19 0x1.1ef98e17c9806p18 0x0.0p0 -0x1.34f1ca6d2dcc6p6 0x1.48fffffffffe9p5 0x0.0p0 F +REG nad83:4702 0 OK 0x1.24f8p19 0x1.9841b89413b33p16 0x0.0p0 -0x1.44p6 0x1.2f88888888867p5 0x0.0p0 F +REG nad83:4702 1 OK 0x1.77b76c0f76e78p18 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.4d8d66692e927p6 0x1.207777777774ep5 0x0.0p0 F +REG nad83:4702 2 OK 0x1.8e1449f8448c4p19 -0x1.8d7eb01e7a0e1p16 0x0.0p0 -0x1.3a729996d16d9p6 0x1.207777777774ep5 0x0.0p0 F +REG nad83:4702 3 OK 0x1.823c8c7128466p18 0x1.34d23818638d8p18 0x0.0p0 -0x1.4d8d66692e927p6 0x1.3e9999999997fp5 0x0.0p0 F +REG nad83:4702 4 OK 0x1.88d1b9c76bdcdp19 0x1.34d23818638d8p18 0x0.0p0 -0x1.3a729996d16d9p6 0x1.3e9999999997fp5 0x0.0p0 F +REG nad83:4801 0 OK 0x1.24f8p19 0x1.5b52fe4002285p16 0x0.0p0 -0x1.68p6 0x1.6fbbbbbbbbbb3p5 0x0.0p0 F +REG nad83:4801 1 OK 0x1.96b30a2e34cb4p18 -0x1.50f810ac28dd8p16 0x0.0p0 -0x1.71352657aea25p6 0x1.62eeeeeeeeee4p5 0x0.0p0 F +REG nad83:4801 2 OK 0x1.7e967ae8e59a6p19 -0x1.50f810ac28dd8p16 0x0.0p0 -0x1.5ecad9a8515dbp6 0x1.62eeeeeeeeee4p5 0x0.0p0 F +REG nad83:4801 3 OK 0x1.a0c3f35264cd6p18 0x1.06fc552f580b4p18 0x0.0p0 -0x1.71352657aea25p6 0x1.7c88888887f4cp5 0x0.0p0 F +REG nad83:4801 4 OK 0x1.798e0656cd995p19 0x1.06fc552f580b4p18 0x0.0p0 -0x1.5ecad9a8515dbp6 0x1.7c88888887f4cp5 0x0.0p0 F +REG nad83:4802 0 OK 0x1.24f8p19 0x1.69b66897aa296p16 0x0.0p0 -0x1.68p6 0x1.6555555555549p5 0x0.0p0 F +REG nad83:4802 1 OK 0x1.8f44d7ce9df96p18 -0x1.5efab9641590ep16 0x0.0p0 -0x1.715fabce299d6p6 0x1.57ffffffffff2p5 0x0.0p0 F +REG nad83:4802 2 OK 0x1.824d9418b1035p19 -0x1.5efab9641590ep16 0x0.0p0 -0x1.5ea05431d662ap6 0x1.57ffffffffff2p5 0x0.0p0 F +REG nad83:4802 3 OK 0x1.99b52076836a4p18 0x1.11df3ebb47ba5p18 0x0.0p0 -0x1.715fabce299d6p6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG nad83:4802 4 OK 0x1.7d156fc4be4aep19 0x1.11df3ebb47ba5p18 0x0.0p0 -0x1.5ea05431d662ap6 0x1.72aaaaaaaaaa1p5 0x0.0p0 F +REG nad83:4803 0 OK 0x1.24f8p19 0x1.c0697505b695ep16 0x0.0p0 -0x1.68p6 0x1.5844444444435p5 0x0.0p0 F +REG nad83:4803 1 OK 0x1.615ed51025e24p18 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbba6p5 0x0.0p0 F +REG nad83:4803 2 OK 0x1.99409577ed0e5p19 -0x1.b0c0d3c8a2b59p16 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.47bbbbbbbbba6p5 0x0.0p0 F +REG nad83:4803 3 OK 0x1.70930b80144b6p18 0x1.540d9ca9dd154p18 0x0.0p0 -0x1.734f3361a7c79p6 0x1.68cccccccccbfp5 0x0.0p0 F +REG nad83:4803 4 OK 0x1.91a67a3ff5d9cp19 0x1.540d9ca9dd154p18 0x0.0p0 -0x1.5cb0cc9e58388p6 0x1.68cccccccccbfp5 0x0.0p0 F +REG nad83:4901 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.a4aaaaaaaaaabp6 0x1.44p5 0x0.0p0 F +REG nad83:4901 1 OK -0x1.83ac2769fab28p18 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.bef7e97fe4fb7p6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4901 2 OK 0x1.852613b4fd58ap19 -0x1.053b9f9c695ap19 0x0.0p0 -0x1.8a5d6bd5705ap6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4901 3 OK -0x1.3283c083e845cp18 0x1.197f5851c9bdap19 0x0.0p0 -0x1.bef7e97f700d6p6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4901 4 OK 0x1.5c91e041f4226p19 0x1.197f5851c9bd9p19 0x0.0p0 -0x1.8a5d6bd5e5481p6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4902 0 OK 0x1.86ap18 0x1.86ap16 0x0.0p0 -0x1.ad55555555555p6 0x1.44p5 0x0.0p0 F +REG nad83:4902 1 OK -0x1.80b84ed3f565p17 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.c7a2942a8fa61p6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4902 2 OK 0x1.e6ce13b4fd58ap19 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.930816801b04ap6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4902 3 OK -0x1.bccf020fa117p16 0x1.4a535851c9bdap19 0x0.0p0 -0x1.c7a2942a1ab8p6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4902 4 OK 0x1.be39e041f4226p19 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.930816808ff2ap6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4903 0 OK 0x1.24f8p19 0x0.0p0 0x0.0p0 -0x1.b3p6 0x1.44p5 0x0.0p0 F +REG nad83:4903 1 OK 0x1.79ec4b02a6cp11 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.cd4d3ed53a50dp6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4903 2 OK 0x1.243b09da7eacap20 -0x1.053b9f9c6959fp19 0x0.0p0 -0x1.98b2c12ac5af5p6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4903 3 OK 0x1.5070fdf05ee9p16 0x1.197f5851c9bdap19 0x0.0p0 -0x1.cd4d3ed4c562bp6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4903 4 OK 0x1.0ff0f020fa117p20 0x1.197f5851c9bdap19 0x0.0p0 -0x1.98b2c12b3a9d5p6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4904 0 OK 0x1.86ap19 0x1.86ap16 0x0.0p0 -0x1.b855555555555p6 0x1.44p5 0x0.0p0 F +REG nad83:4904 1 OK 0x1.8c87b12c0a9d8p17 -0x1.a8cf3f38d2b4p18 0x0.0p0 -0x1.d2a2942a8fa61p6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4904 2 OK 0x1.550f09da7eacap20 -0x1.a8cf3f38d2b3ep18 0x0.0p0 -0x1.9e0816801b04ap6 0x1.1bffffff76614p5 0x0.0p0 F +REG nad83:4904 3 OK 0x1.176c3f7c17bb4p18 0x1.4a535851c9bd9p19 0x0.0p0 -0x1.d2a2942a1ab7fp6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:4904 4 OK 0x1.40c4f020fa117p20 0x1.4a535851c9bdap19 0x0.0p0 -0x1.9e0816808ff2ap6 0x1.6bffffff17412p5 0x0.0p0 F +REG nad83:5001 0 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad83:5001 1 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad83:5001 2 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad83:5001 3 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad83:5001 4 EXC:java.lang.NumberFormatException NaN NaN NaN NaN NaN NaN - +REG nad83:5002 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.1cp7 0x1.bp5 0x0.0p0 F +REG nad83:5002 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.2d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5002 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.0afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5002 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.2d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5002 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.0afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5003 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.24p7 0x1.bp5 0x0.0p0 F +REG nad83:5003 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.35035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5003 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.12fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5003 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.35035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5003 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.12fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5004 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.2cp7 0x1.bp5 0x0.0p0 F +REG nad83:5004 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.3d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5004 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.1afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5004 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.3d035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5004 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.1afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5005 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.34p7 0x1.bp5 0x0.0p0 F +REG nad83:5005 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.45035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5005 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.22fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5005 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.45035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5005 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.22fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5006 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.bp5 0x0.0p0 F +REG nad83:5006 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.4d035503daa53p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5006 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.2afcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5006 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.4d035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5006 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.2afcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5007 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.44p7 0x1.bp5 0x0.0p0 F +REG nad83:5007 1 OK -0x1.dcc2c5bbe5b78p16 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.55035503daa54p7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5007 2 OK 0x1.11f02c5bbe5bp20 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.32fcaafc255adp7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5007 3 OK 0x1.76726d0290ccp13 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.55035501f8881p7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5007 4 OK 0x1.e26e364bf5bc1p19 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.32fcaafe0778p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5008 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4cp7 0x1.bp5 0x0.0p0 F +REG nad83:5008 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.5d035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5008 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.3afcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5008 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.5d035501f888p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5008 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.3afcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:5009 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.54p7 0x1.bp5 0x0.0p0 F +REG nad83:5009 1 OK -0x1.dcc2c5bbe5af8p16 -0x1.fd0ba494cc405p18 0x0.0p0 -0x1.65035503daa53p7 0x1.87fffffba5d4fp5 0x0.0p0 F +REG nad83:5009 2 OK 0x1.11f02c5bbe5b8p20 -0x1.fd0ba494cc401p18 0x0.0p0 -0x1.42fcaafc255adp7 0x1.87fffffba5d5p5 0x0.0p0 F +REG nad83:5009 3 OK 0x1.76726d0290fcp13 0x1.1f07ba0e77afbp19 0x0.0p0 -0x1.65035501f8881p7 0x1.d7fffffc0a47bp5 0x0.0p0 F +REG nad83:5009 4 OK 0x1.e26e364bf5bcdp19 0x1.1f07ba0e77afdp19 0x0.0p0 -0x1.42fcaafe0777fp7 0x1.d7fffffc0a47cp5 0x0.0p0 F +REG nad83:501 0 OK 0x1.be7c3a86594afp19 0x1.784452c373f9fp18 0x0.0p0 -0x1.a6p6 0x1.407777777775fp5 0x0.0p0 F +REG nad83:501 1 OK 0x1.6de3eaf16de1ap19 0x1.b9868b33b9dep17 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.34dddddddddc1p5 0x0.0p0 F +REG nad83:501 2 OK 0x1.078a450da25a2p20 0x1.b9868b33b9dep17 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.34dddddddddc1p5 0x0.0p0 F +REG nad83:501 3 OK 0x1.713fd3c86bb8cp19 0x1.0b95aede04568p19 0x0.0p0 -0x1.ad93ed5106ce2p6 0x1.4c111111110fbp5 0x0.0p0 F +REG nad83:501 4 OK 0x1.05dc50a2236e9p20 0x1.0b95aede04568p19 0x0.0p0 -0x1.9e6c12aef931ep6 0x1.4c111111110fbp5 0x0.0p0 F +REG nad83:5010 0 OK 0x1.e848p19 0x1.33df8afe9429fp17 0x0.0p0 -0x1.6p7 0x1.a355555555154p5 0x0.0p0 F +REG nad83:5010 1 OK 0x1.4422779e37857p19 -0x1.1ed11dc9337fap17 0x0.0p0 0x1.66b58674419dp7 0x1.8caaaaaaaa402p5 0x0.0p0 F +REG nad83:5010 2 OK 0x1.4636c430e43d4p20 -0x1.1ed11dc9337fap17 0x0.0p0 -0x1.56b58674419cfp7 0x1.8caaaaaaaa402p5 0x0.0p0 F +REG nad83:5010 3 OK 0x1.580525cdf719ep19 0x1.d741d626e2c06p18 0x0.0p0 0x1.66b58674419dp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG nad83:5010 4 OK 0x1.3c456d1904731p20 0x1.d741d626e2c06p18 0x0.0p0 -0x1.56b58674419cfp7 0x1.b9ffffffffdbep5 0x0.0p0 F +REG nad83:502 0 OK 0x1.be7c3a86594afp19 0x1.918b940ac058p18 0x0.0p0 -0x1.a6p6 0x1.3655555555539p5 0x0.0p0 F +REG nad83:502 1 OK 0x1.535f87ff5fdb6p19 0x1.894b45cda0689p17 0x0.0p0 -0x1.afd615170d5c9p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG nad83:502 2 OK 0x1.14cc7686a95d4p20 0x1.894b45cda0689p17 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.26fffffffffdcp5 0x0.0p0 F +REG nad83:502 3 OK 0x1.58ff6714b2d67p19 0x1.320f9726503bp19 0x0.0p0 -0x1.afd615170d5c9p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG nad83:502 4 OK 0x1.11fc86fbffdfcp20 0x1.320f9726503bp19 0x0.0p0 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaa94p5 0x0.0p0 F +REG nad83:503 0 OK 0x1.be7c3a86594afp19 0x1.8965049ee6adap18 0x0.0p0 -0x1.a6p6 0x1.2c66666666643p5 0x0.0p0 F +REG nad83:503 1 OK 0x1.5c11460e4dce9p19 0x1.9880c713ab67ep17 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.1e4444444441bp5 0x0.0p0 F +REG nad83:503 2 OK 0x1.1073977f3263bp20 0x1.9880c713ab67ep17 0x0.0p0 -0x1.9d16314badd4bp6 0x1.1e4444444441bp5 0x0.0p0 F +REG nad83:503 3 OK 0x1.60a2ad403161p19 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.aee9ceb4522b5p6 0x1.3a8888888886dp5 0x0.0p0 F +REG nad83:503 4 OK 0x1.0e2ae3e6409a7p20 0x1.25939b74cbbe3p19 0x0.0p0 -0x1.9d16314badd4bp6 0x1.3a8888888886dp5 0x0.0p0 F +REG nad83:5101 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.37p7 0x1.2d55555555555p4 0x0.0p0 F +REG nad83:5101 1 OK -0x1.189e53206474p16 -0x1.0b145d519c1dfp19 0x0.0p0 -0x1.4190cfacb367bp7 0x1.baaaaaaa8897dp3 0x0.0p0 F +REG nad83:5101 2 OK 0x1.05ade53206474p20 -0x1.0b145d519c1dfp19 0x0.0p0 -0x1.2c6f30534c985p7 0x1.baaaaaaa8897dp3 0x0.0p0 F +REG nad83:5101 3 OK -0x1.2e8eb5f7626bp15 0x1.1337c2e958ab5p19 0x0.0p0 -0x1.4190cfacc2171p7 0x1.7d55555537da6p4 0x0.0p0 F +REG nad83:5101 4 OK 0x1.fb30eb5f7626bp19 0x1.1337c2e958ab5p19 0x0.0p0 -0x1.2c6f30533de8fp7 0x1.7d55555537da6p4 0x0.0p0 F +REG nad83:5102 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3955555555555p7 0x1.4555555555555p4 0x0.0p0 F +REG nad83:5102 1 OK -0x1.1e4804198774p16 -0x1.0ac07b5e6414cp19 0x0.0p0 -0x1.43ff74a32e616p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG nad83:5102 2 OK 0x1.0608804198768p20 -0x1.0ac07b5e6414dp19 0x0.0p0 -0x1.2eab36077c495p7 0x1.eaaaaaaa83d1ep3 0x0.0p0 F +REG nad83:5102 3 OK -0x1.23798707d4a5p15 0x1.1397681003416p19 0x0.0p0 -0x1.43ff74a33c9c6p7 0x1.9555555532546p4 0x0.0p0 F +REG nad83:5102 4 OK 0x1.fa7f98707d48fp19 0x1.1397681003415p19 0x0.0p0 -0x1.2eab36076e0e5p7 0x1.9555555532547p4 0x0.0p0 F +REG nad83:5103 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3cp7 0x1.52aaaaaaaaaabp4 0x0.0p0 F +REG nad83:5103 1 OK -0x1.218726763fdbp16 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.46b9354850ccap7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG nad83:5103 2 OK 0x1.063c726763fdbp20 -0x1.0a92d12c1a153p19 0x0.0p0 -0x1.3146cab7af336p7 0x1.02aaaaaa95c18p4 0x0.0p0 F +REG nad83:5103 3 OK -0x1.1d525b0869aap15 0x1.13cef94712723p19 0x0.0p0 -0x1.46b935485e9b9p7 0x1.a2aaaaaa83fa7p4 0x0.0p0 F +REG nad83:5103 4 OK 0x1.fa1d25b0869aap19 0x1.13cef94712723p19 0x0.0p0 -0x1.3146cab7a1647p7 0x1.a2aaaaaa83fa7p4 0x0.0p0 F +REG nad83:5104 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.3fp7 0x1.5d55555555555p4 0x0.0p0 F +REG nad83:5104 1 OK -0x1.241c1afeecff8p16 -0x1.0a6ca319d63b6p19 0x0.0p0 -0x1.49c5d1c731254p7 0x1.0d5555553f1fcp4 0x0.0p0 F +REG nad83:5104 2 OK 0x1.0665c1afeedp20 -0x1.0a6ca319d63b6p19 0x0.0p0 -0x1.343a2e38cedacp7 0x1.0d5555553f1fcp4 0x0.0p0 F +REG nad83:5104 3 OK -0x1.1844ea38e48ap15 0x1.13fa874015355p19 0x0.0p0 -0x1.49c5d1c73e85fp7 0x1.ad5555552b552p4 0x0.0p0 F +REG nad83:5104 4 OK 0x1.f9cc4ea38e48ap19 0x1.13fa874015355p19 0x0.0p0 -0x1.343a2e38c17a1p7 0x1.ad5555552b552p4 0x0.0p0 F +REG nad83:5105 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 -0x1.4055555555555p7 0x1.5aaaaaaaaaaacp4 0x0.0p0 F +REG nad83:5105 1 OK -0x1.237c0907b8d18p16 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.4b17f4409c3ecp7 0x1.0aaaaaaa94cacp4 0x0.0p0 F +REG nad83:5105 2 OK 0x1.065bc0907b8d2p20 -0x1.0a76e591882c1p19 0x0.0p0 -0x1.3592b66a0e6bep7 0x1.0aaaaaaa94cacp4 0x0.0p0 F +REG nad83:5105 3 OK -0x1.1994224d281ep15 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.4b17f440a9bd2p7 0x1.aaaaaaaa8186bp4 0x0.0p0 F +REG nad83:5105 4 OK 0x1.f9e14224d281ep19 0x1.13f04f8a37fdbp19 0x0.0p0 -0x1.3592b66a00ed8p7 0x1.aaaaaaaa8186bp4 0x0.0p0 F +REG nad83:5200 0 OK 0x1.86ap17 0x1.c77a1afd7f464p17 0x0.0p0 -0x1.09bbbbbbbbbbcp6 0x1.222222222211cp4 0x0.0p0 F +REG nad83:5200 1 OK 0x1.57c9805760d26p16 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.0df13f90a9095p6 0x1.122222222211bp4 0x0.0p0 F +REG nad83:5200 2 OK 0x1.30ad9fea27cb6p18 0x1.dfdaf73c82af2p16 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.122222222211bp4 0x0.0p0 F +REG nad83:5200 3 OK 0x1.5cc194d70b471p16 0x1.50255ee1d86f5p18 0x0.0p0 -0x1.0df13f90a9095p6 0x1.322222222211cp4 0x0.0p0 F +REG nad83:5200 4 OK 0x1.2f6f9aca3d2e4p18 0x1.50255ee1d86f5p18 0x0.0p0 -0x1.058637e6ce6e3p6 0x1.322222222211cp4 0x0.0p0 F +REG nad83:600 0 OK 0x1.29a82703afb7fp18 0x1.99b9ff5f7abe8p17 0x0.0p0 -0x1.23p6 0x1.4acccccccccbap5 0x0.0p0 F +REG nad83:600 1 OK 0x1.6ec21e46adb8ap17 0x1.76cf953eae456p16 0x0.0p0 -0x1.28818d3773554p6 0x1.4288888888871p5 0x0.0p0 F +REG nad83:600 2 OK 0x1.9bef3ee408939p18 0x1.76cf953eae456p16 0x0.0p0 -0x1.1d7e72c88caacp6 0x1.4288888888871p5 0x0.0p0 F +REG nad83:600 3 OK 0x1.75e64473bf80cp17 0x1.3dd463fdd742ep18 0x0.0p0 -0x1.28818d3773554p6 0x1.5311111111101p5 0x0.0p0 F +REG nad83:600 4 OK 0x1.985d2bcd7faf8p18 0x1.3dd463fdd742ep18 0x0.0p0 -0x1.1d7e72c88caacp6 0x1.5311111111101p5 0x0.0p0 F +REG nad83:700 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.2daaaaaaaaaacp6 0x1.3p5 0x0.0p0 F +REG nad83:700 1 OK -0x1.803d92c93f3a4p18 -0x1.061caae34ca7bp19 0x0.0p0 -0x1.470c0a38df14fp6 0x1.07ffffffa35eep5 0x0.0p0 F +REG nad83:700 2 OK 0x1.836ec9649f9dcp19 -0x1.061caae34ca7ap19 0x0.0p0 -0x1.14494b1c76408p6 0x1.07ffffffa35efp5 0x0.0p0 F +REG nad83:700 3 OK -0x1.36040e2b0a10dp18 0x1.18aa32719d133p19 0x0.0p0 -0x1.470c0a38935bbp6 0x1.57ffffff53f1cp5 0x0.0p0 F +REG nad83:700 4 OK 0x1.5e5207158509p19 0x1.18aa32719d134p19 0x0.0p0 -0x1.14494b1cc1f9bp6 0x1.57ffffff53f1dp5 0x0.0p0 F +REG nad83:901 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.44p6 0x1.8555555555555p4 0x0.0p0 F +REG nad83:901 1 OK -0x1.707217ec6c228p18 -0x1.09d6c633b3b21p19 0x0.0p0 -0x1.59f3301236b9ap6 0x1.3555555539108p4 0x0.0p0 F +REG nad83:901 2 OK 0x1.7b890bf636114p19 -0x1.09d6c633b3b21p19 0x0.0p0 -0x1.2e0ccfedc9466p6 0x1.3555555539108p4 0x0.0p0 F +REG nad83:901 3 OK -0x1.458d6e47584dcp18 0x1.149ddf292c6bcp19 0x0.0p0 -0x1.59f330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG nad83:901 4 OK 0x1.6616b723ac26ep19 0x1.149ddf292c6bcp19 0x0.0p0 -0x1.2e0ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG nad83:902 0 OK 0x1.86ap17 0x0.0p0 0x0.0p0 -0x1.48p6 0x1.8555555555555p4 0x0.0p0 F +REG nad83:902 1 OK -0x1.707217ec6c228p18 -0x1.09d6c633b3b21p19 0x0.0p0 -0x1.5df3301236b9ap6 0x1.3555555539108p4 0x0.0p0 F +REG nad83:902 2 OK 0x1.7b890bf636114p19 -0x1.09d6c633b3b21p19 0x0.0p0 -0x1.320ccfedc9466p6 0x1.3555555539108p4 0x0.0p0 F +REG nad83:902 3 OK -0x1.458d6e47584dcp18 0x1.149ddf292c6bcp19 0x0.0p0 -0x1.5df330124ca38p6 0x1.d55555551b76bp4 0x0.0p0 F +REG nad83:902 4 OK 0x1.6616b723ac26ep19 0x1.149ddf292c6bcp19 0x0.0p0 -0x1.320ccfedb35c8p6 0x1.d55555551b76bp4 0x0.0p0 F +REG nad83:903 0 OK 0x1.24f8p19 0x1.7adf633b79c7cp16 0x0.0p0 -0x1.52p6 0x1.ddfffffffff66p4 0x0.0p0 F +REG nad83:903 1 OK 0x1.8833338ce6aadp18 -0x1.7414b87002b41p16 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.c1fffffffff52p4 0x0.0p0 F +REG nad83:903 2 OK 0x1.85d666398ca9fp19 -0x1.7414b87002b41p16 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.c1fffffffff52p4 0x0.0p0 F +REG nad83:903 3 OK 0x1.8ee83426ccc08p18 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.5a12a00d0fa6fp6 0x1.f9fffffffff72p4 0x0.0p0 F +REG nad83:903 4 OK 0x1.827be5ec999f2p19 0x1.1dd90a273dd59p18 0x0.0p0 -0x1.49ed5ff2f0592p6 0x1.f9fffffffff72p4 0x0.0p0 F +REG world:CH1903 0 OK 0x1.24f8p19 0x1.869ffffffffb7p17 0x0.0p0 0x1.dc22222222222p2 0x1.779e86cdcd1e7p5 0x0.0p0 F +REG world:CH1903 1 OK -0x1.0c82adeab9fcp13 -0x1.4008bbf128a6ap18 0x0.0p0 0x1.d5d9fb9bc000ep-4 0x1.4f9e86cdcd1e6p5 0x0.0p0 F +REG world:CH1903 2 OK 0x1.2711055bd574p20 -0x1.4008bbf128a6ap18 0x0.0p0 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 0x0.0p0 F +REG world:CH1903 3 OK 0x1.7404e5c13dbap16 0x1.7d0f5618982bp19 0x0.0p0 0x1.d5d9fb9bc008p-4 0x1.9f9e86cdcd1ebp5 0x0.0p0 F +REG world:CH1903 4 OK 0x1.0db7b1a3ec246p20 0x1.7d0f5618982bp19 0x0.0p0 0x1.d8766e2aeaa21p3 0x1.9f9e86cdcd1ebp5 0x0.0p0 F +REG world:bng 0 OK 0x1.86ap18 -0x1.86ap16 0x0.0p0 -0x1.0p1 0x1.88p5 0x0.0p0 F +REG world:bng 1 OK -0x1.9c2bed861d6a4p17 -0x1.3242a40883178p19 0x0.0p0 -0x1.33e16800bfb7dp3 0x1.5ffffffdf9a23p5 0x0.0p0 F +REG world:bng 2 OK 0x1.edaafb61875a9p19 -0x1.3242a40883178p19 0x0.0p0 0x1.67c2d0017f6fbp2 0x1.5ffffffdf9a23p5 0x0.0p0 F +REG world:bng 3 OK -0x1.82f83e740b284p16 0x1.d79e707286f26p18 0x0.0p0 -0x1.33e167f3971e8p3 0x1.affffffda2b1bp5 0x0.0p0 F +REG world:bng 4 OK 0x1.b6ff07ce8165p19 0x1.d79e707286f26p18 0x0.0p0 0x1.67c2cfe72e3cep2 0x1.affffffda2b1bp5 0x0.0p0 F +REG world:bwi 0 OK 0x1.86ap18 0x0.0p0 0x0.0p0 -0x1.fp5 0x0.0p0 0x0.0p0 T +REG world:bwi 1 OK -0x1.2e96895585988p17 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 -0x1.3fffffffea4bep2 0x0.0p0 F +REG world:bwi 2 OK 0x1.d245a25561656p19 -0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 -0x1.3fffffffea4bep2 0x0.0p0 F +REG world:bwi 3 OK -0x1.2e96895585988p17 0x1.0ed614a49f189p19 0x0.0p0 -0x1.0bffffffe1f31p6 0x1.3fffffffea4bep2 0x0.0p0 F +REG world:bwi 4 OK 0x1.d245a25561656p19 0x1.0ed614a49f189p19 0x0.0p0 -0x1.c80000003c19fp5 0x1.3fffffffea4bep2 0x0.0p0 F +REG world:ceylon 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:ceylon 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:ceylon 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:ceylon 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:ceylon 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:costa-n 0 OK 0x1.e848p18 0x1.a96e42d0e5604p17 0x0.0p0 -0x1.5155555555555p6 0x1.4eeeeeeeeecf6p3 0x0.0p0 F +REG world:costa-n 1 OK -0x1.000654e0e97bp16 -0x1.4379f6d33ed46p18 0x0.0p0 -0x1.65abf7bf7a7a2p6 0x1.5dddddddddbaep2 0x0.0p0 F +REG world:costa-n 2 OK 0x1.0424654e0e97bp20 -0x1.4379f6d33ed46p18 0x0.0p0 -0x1.3cfeb2eb30309p6 0x1.5dddddddddbaep2 0x0.0p0 F +REG world:costa-n 3 OK -0x1.7493f94a7cf8p15 0x1.7aec69b514ec3p19 0x0.0p0 -0x1.65abf7bf7a7a2p6 0x1.eeeeeeeeeece4p3 0x0.0p0 F +REG world:costa-n 4 OK 0x1.ff913f94a7cf8p19 0x1.7aec69b514ec3p19 0x0.0p0 -0x1.3cfeb2eb30309p6 0x1.eeeeeeeeeece4p3 0x0.0p0 F +REG world:costa-s 0 OK 0x1.e848p18 0x1.404cdbe76c8b4p18 0x0.0p0 -0x1.4eaaaaaaaaaabp6 0x1.1fffffffffe61p3 0x0.0p0 F +REG world:costa-s 1 OK -0x1.f60641d02f73p15 -0x1.b1004f0f83dcp17 0x0.0p0 -0x1.62ea7cf4d2aabp6 0x1.ffffffffffccep1 0x0.0p0 F +REG world:costa-s 2 OK 0x1.03d4320e817bap20 -0x1.b1004f0f83dcp17 0x0.0p0 -0x1.3a6ad86082aabp6 0x1.ffffffffffccep1 0x0.0p0 F +REG world:costa-s 3 OK -0x1.7e7527d66e3ap15 0x1.b0622478ff065p19 0x0.0p0 -0x1.62ea7cf4d2aabp6 0x1.bfffffffffdebp3 0x0.0p0 F +REG world:costa-s 4 OK 0x1.0017a93eb371dp20 0x1.b0622478ff065p19 0x0.0p0 -0x1.3a6ad86082aabp6 0x1.bfffffffffdebp3 0x0.0p0 F +REG world:cuba-n 0 OK 0x1.e848p18 0x1.11ba010624dd3p18 0x0.0p0 -0x1.44p6 0x1.65999999998a2p4 0x0.0p0 F +REG world:cuba-n 1 OK -0x1.2b3735c29451p16 -0x1.0153d4e9de713p18 0x0.0p0 -0x1.599fdd28e3eaap6 0x1.159999999987fp4 0x0.0p0 F +REG world:cuba-n 2 OK 0x1.06d7735c29451p20 -0x1.0153d4e9de713p18 0x0.0p0 -0x1.2e6022d71c156p6 0x1.159999999987fp4 0x0.0p0 F +REG world:cuba-n 3 OK -0x1.1fbbe7194309p15 0x1.9c51c7a10eaap19 0x0.0p0 -0x1.599fdd28e3eaap6 0x1.b5999999998d2p4 0x0.0p0 F +REG world:cuba-n 4 OK 0x1.fa43be7194309p19 0x1.9c51c7a10eaap19 0x0.0p0 -0x1.2e6022d71c156p6 0x1.b5999999998d2p4 0x0.0p0 F +REG world:cuba-s 0 OK 0x1.e848p18 0x1.bf83783126e98p17 0x0.0p0 -0x1.3355555555555p6 0x1.4b77777777669p4 0x0.0p0 F +REG world:cuba-s 1 OK -0x1.24f0679f94628p16 -0x1.340b277f9c35cp18 0x0.0p0 -0x1.48b745942595bp6 0x1.f6eeeeeeeeccdp3 0x0.0p0 F +REG world:cuba-s 2 OK 0x1.06730679f9462p20 -0x1.340b277f9c35cp18 0x0.0p0 -0x1.1df365168514fp6 0x1.f6eeeeeeeeccdp3 0x0.0p0 F +REG world:cuba-s 3 OK -0x1.2c1f70ac8d9bp15 0x1.82ea47fed178fp19 0x0.0p0 -0x1.48b745942595bp6 0x1.9b77777777699p4 0x0.0p0 F +REG world:cuba-s 4 OK 0x1.fb09f70ac8d9bp19 0x1.82ea47fed178fp19 0x0.0p0 -0x1.1df365168514fp6 0x1.9b77777777699p4 0x0.0p0 F +REG world:domin_rep 0 OK 0x1.e848p18 0x1.0e91ea0c49ba6p18 0x0.0p0 -0x1.1ep6 0x1.2d11111110ff5p4 0x0.0p0 F +REG world:domin_rep 1 OK -0x1.1db148713ae1p16 -0x1.060d54bfac6bp18 0x0.0p0 -0x1.33211605a4bbcp6 0x1.ba22222222011p3 0x0.0p0 F +REG world:domin_rep 2 OK 0x1.05ff148713ae1p20 -0x1.060d54bfac6bp18 0x0.0p0 -0x1.08dee9fa5b445p6 0x1.ba22222222011p3 0x0.0p0 F +REG world:domin_rep 3 OK -0x1.39faf6b32f51p15 0x1.99d4a16f60f29p19 0x0.0p0 -0x1.33211605a4bbcp6 0x1.7d11111111026p4 0x0.0p0 F +REG world:domin_rep 4 OK 0x1.fbe7af6b32f51p19 0x1.99d4a16f60f29p19 0x0.0p0 -0x1.08dee9fa5b445p6 0x1.7d11111111026p4 0x0.0p0 F +REG world:egypt-1 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 0x1.98p4 0x0.0p0 0x0.0p0 T +REG world:egypt-1 1 OK -0x1.f24da02dc4cacp17 -0x1.0ef5785b28918p19 0x0.0p0 0x1.4800000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-1 2 OK 0x1.a18b680b71326p19 -0x1.0ef5785b28918p19 0x0.0p0 0x1.e7ffffff89fcap4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-1 3 OK -0x1.f24da02dc4cacp17 0x1.0ef5785b28918p19 0x0.0p0 0x1.4800000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-1 4 OK 0x1.a18b680b71326p19 0x1.0ef5785b28918p19 0x0.0p0 0x1.e7ffffff89fcap4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-2 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 0x1.c800000000001p4 0x0.0p0 0x0.0p0 T +REG world:egypt-2 1 OK -0x1.f24da02dc4cacp17 -0x1.0ef5785b28918p19 0x0.0p0 0x1.7800000076036p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-2 2 OK 0x1.a18b680b7132bp19 -0x1.0ef5785b28918p19 0x0.0p0 0x1.0bffffffc4fe6p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-2 3 OK -0x1.f24da02dc4cacp17 0x1.0ef5785b28918p19 0x0.0p0 0x1.7800000076036p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-2 4 OK 0x1.a18b680b7132bp19 0x1.0ef5785b28918p19 0x0.0p0 0x1.0bffffffc4fe6p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-3 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 0x1.f8p4 0x0.0p0 0x0.0p0 T +REG world:egypt-3 1 OK -0x1.f24da02dc4cacp17 -0x1.0ef5785b28918p19 0x0.0p0 0x1.a800000076035p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-3 2 OK 0x1.a18b680b7132bp19 -0x1.0ef5785b28918p19 0x0.0p0 0x1.23ffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-3 3 OK -0x1.f24da02dc4cacp17 0x1.0ef5785b28918p19 0x0.0p0 0x1.a800000076035p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-3 4 OK 0x1.a18b680b7132bp19 0x1.0ef5785b28918p19 0x0.0p0 0x1.23ffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-4 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 0x1.14p5 0x0.0p0 0x0.0p0 T +REG world:egypt-4 1 OK -0x1.f24da02dc4c8cp17 -0x1.0ef5785b28918p19 0x0.0p0 0x1.d800000076036p4 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-4 2 OK 0x1.a18b680b7132bp19 -0x1.0ef5785b28918p19 0x0.0p0 0x1.3bffffffc4fe5p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-4 3 OK -0x1.f24da02dc4c8cp17 0x1.0ef5785b28918p19 0x0.0p0 0x1.d800000076036p4 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-4 4 OK 0x1.a18b680b7132bp19 0x1.0ef5785b28918p19 0x0.0p0 0x1.3bffffffc4fe5p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-5 0 OK 0x1.24f8p18 0x0.0p0 0x0.0p0 0x1.2cp5 0x0.0p0 0x0.0p0 T +REG world:egypt-5 1 OK -0x1.f24da02dc4cacp17 -0x1.0ef5785b28918p19 0x0.0p0 0x1.040000003b01bp5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-5 2 OK 0x1.a18b680b7132bp19 -0x1.0ef5785b28918p19 0x0.0p0 0x1.53ffffffc4fe6p5 -0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-5 3 OK -0x1.f24da02dc4cacp17 0x1.0ef5785b28918p19 0x0.0p0 0x1.040000003b01bp5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:egypt-5 4 OK 0x1.a18b680b7132bp19 0x1.0ef5785b28918p19 0x0.0p0 0x1.53ffffffc4fe6p5 0x1.3fffffffeaba9p2 0x0.0p0 F +REG world:el_sal 0 OK 0x1.e848p18 0x1.20e04bc6a7efap18 0x0.0p0 -0x1.64p6 0x1.b911111110effp3 0x0.0p0 F +REG world:el_sal 1 OK -0x1.0b96d8e051b2p16 -0x1.ebde319a8fe3cp17 0x0.0p0 -0x1.7897cf19bc277p6 0x1.1911111110f8ap3 0x0.0p0 F +REG world:el_sal 2 OK 0x1.04dd6d8e051acp20 -0x1.ebde319a8fe3cp17 0x0.0p0 -0x1.4f6830e643d89p6 0x1.1911111110f8ap3 0x0.0p0 F +REG world:el_sal 3 OK -0x1.5deea99a3599p15 0x1.a1c6c7ec742d7p19 0x0.0p0 -0x1.7897cf19bc277p6 0x1.2c8888888877ep4 0x0.0p0 F +REG world:el_sal 4 OK 0x1.fe26ea99a358ep19 0x1.a1c6c7ec742d7p19 0x0.0p0 -0x1.4f6830e643d89p6 0x1.2c8888888877ep4 0x0.0p0 F +REG world:gk2-d 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p2 0x0.0p0 0x0.0p0 T +REG world:gk2-d 1 OK -0x1.aeb04bf258cfp15 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6fap0 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk2-d 2 OK 0x1.0199825f92c67p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk2-d 3 OK -0x1.aeb04bf258cfp15 0x1.0ef87252d3b33p19 0x0.0p0 0x1.000000074b6fap0 0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk2-d 4 OK 0x1.0199825f92c67p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.5fffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk3-d 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.2p3 0x0.0p0 0x0.0p0 T +REG world:gk3-d 1 OK -0x1.aeb04bf258cfp15 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbep2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk3-d 2 OK 0x1.0199825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk3-d 3 OK -0x1.aeb04bf258cfp15 0x1.0ef87252d3b33p19 0x0.0p0 0x1.00000001d2dbep2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk3-d 4 OK 0x1.0199825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.bfffffff16921p3 0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk4-d 0 OK 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.8000000000001p3 0x0.0p0 0x0.0p0 T +REG world:gk4-d 1 OK -0x1.aeb04bf258cfp15 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbfp2 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk4-d 2 OK 0x1.0199825f92c68p20 -0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 -0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk4-d 3 OK -0x1.aeb04bf258cfp15 0x1.0ef87252d3b33p19 0x0.0p0 0x1.c0000001d2dbfp2 0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:gk4-d 4 OK 0x1.0199825f92c68p20 0x1.0ef87252d3b33p19 0x0.0p0 0x1.0fffffff8b491p4 0x1.3fffffffeafc3p2 0x0.0p0 F +REG world:guat-n 0 OK 0x1.e848p18 0x1.1d5c650e56042p18 0x0.0p0 -0x1.6955555555555p6 0x1.0d11111110ffbp4 0x0.0p0 F +REG world:guat-n 1 OK -0x1.165b184a7d51p16 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.7a2222222202cp3 0x0.0p0 F +REG world:guat-n 2 OK 0x1.0589b184a7d51p20 -0x1.f04531e60a8f8p17 0x0.0p0 -0x1.547098bde0a83p6 0x1.7a2222222202cp3 0x0.0p0 F +REG world:guat-n 3 OK -0x1.4870ab69dd0ep15 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.7e3a11ecca027p6 0x1.5d1111111100fp4 0x0.0p0 F +REG world:guat-n 4 OK 0x1.fccf0ab69dd0ep19 0x1.a0bc20b4075bep19 0x0.0p0 -0x1.547098bde0a83p6 0x1.5d1111111100fp4 0x0.0p0 F +REG world:guat-s 0 OK 0x1.e848p18 0x1.3e5a2b9581062p18 0x0.0p0 -0x1.6955555555555p6 0x1.dcccccccccaa6p3 0x0.0p0 F +REG world:guat-s 1 OK -0x1.0f6665440c788p16 -0x1.afe63c9762358p17 0x0.0p0 -0x1.7e077a4bda7ebp6 0x1.3cccccccccb07p3 0x0.0p0 F +REG world:guat-s 2 OK 0x1.051a665440c72p20 -0x1.afe63c9762358p17 0x0.0p0 -0x1.54a3305ed02cp6 0x1.3cccccccccb07p3 0x0.0p0 F +REG world:guat-s 3 OK -0x1.55df0a3a2db3p15 0x1.b0c2dc55d354dp19 0x0.0p0 -0x1.7e077a4bda7ebp6 0x1.3e66666666552p4 0x0.0p0 F +REG world:guat-s 4 OK 0x1.fda5f0a3a2da7p19 0x1.b0c2dc55d354dp19 0x0.0p0 -0x1.54a3305ed02cp6 0x1.3e66666666552p4 0x0.0p0 F +REG world:haiti 0 OK 0x1.e848p18 0x1.0e91ea0c49ba6p18 0x0.0p0 -0x1.1ep6 0x1.2d11111110ff5p4 0x0.0p0 F +REG world:haiti 1 OK -0x1.1db148713ae1p16 -0x1.060d54bfac6bp18 0x0.0p0 -0x1.33211605a4bbcp6 0x1.ba22222222011p3 0x0.0p0 F +REG world:haiti 2 OK 0x1.05ff148713ae1p20 -0x1.060d54bfac6bp18 0x0.0p0 -0x1.08dee9fa5b445p6 0x1.ba22222222011p3 0x0.0p0 F +REG world:haiti 3 OK -0x1.39faf6b32f51p15 0x1.99d4a16f60f29p19 0x0.0p0 -0x1.33211605a4bbcp6 0x1.7d11111111026p4 0x0.0p0 F +REG world:haiti 4 OK 0x1.fbe7af6b32f51p19 0x1.99d4a16f60f29p19 0x0.0p0 -0x1.08dee9fa5b445p6 0x1.7d11111111026p4 0x0.0p0 F +REG world:hond-n 0 OK 0x1.e848p18 0x1.21f55c189374cp18 0x0.0p0 -0x1.58aaaaaaaaaabp6 0x1.efffffffffdd3p3 0x0.0p0 F +REG world:hond-n 1 OK -0x1.119f1bc274be8p16 -0x1.e8368cff08654p17 0x0.0p0 -0x1.6d6be82433aecp6 0x1.4fffffffffe25p3 0x0.0p0 F +REG world:hond-n 2 OK 0x1.053df1bc274bep20 -0x1.e8368cff08654p17 0x0.0p0 -0x1.43e96d3121a6ap6 0x1.4fffffffffe25p3 0x0.0p0 F +REG world:hond-n 3 OK -0x1.51ce53899024p15 0x1.a2b7a4ca46d9fp19 0x0.0p0 -0x1.6d6be82433aecp6 0x1.47ffffffffeefp4 0x0.0p0 F +REG world:hond-n 4 OK 0x1.fd64e53899024p19 0x1.a2b7a4ca46d9fp19 0x0.0p0 -0x1.43e96d3121a6ap6 0x1.47ffffffffeefp4 0x0.0p0 F +REG world:hond-s 0 OK 0x1.e848p18 0x1.2145f9cac0831p18 0x0.0p0 -0x1.5caaaaaaaaaabp6 0x1.b911111110effp3 0x0.0p0 F +REG world:hond-s 1 OK -0x1.0b8df49b56018p16 -0x1.eb0e8d31685fep17 0x0.0p0 -0x1.714279c466d23p6 0x1.1911111110f8ap3 0x0.0p0 F +REG world:hond-s 2 OK 0x1.04dcdf49b5602p20 -0x1.eb0e8d31685fep17 0x0.0p0 -0x1.4812db90ee834p6 0x1.1911111110f8ap3 0x0.0p0 F +REG world:hond-s 3 OK -0x1.5ddd9ef1a608p15 0x1.a1f886c153646p19 0x0.0p0 -0x1.714279c466d23p6 0x1.2c8888888877ep4 0x0.0p0 F +REG world:hond-s 4 OK 0x1.fe25d9ef1a608p19 0x1.a1f886c153646p19 0x0.0p0 -0x1.4812db90ee834p6 0x1.2c8888888877ep4 0x0.0p0 F +REG world:india-I 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-I 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-I 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-I 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-I 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIA 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIA 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIA 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIA 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIA 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIB 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIB 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIB 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIB 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIB 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIA 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIA 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIA 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIA 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIA 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIB 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIB 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIB 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIB 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IIIB 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVA 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVA 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVA 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVA 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVA 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVB 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVB 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVB 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVB 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:india-IVB 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +REG world:irish 0 OK 0x1.86ap17 0x1.e848p17 0x0.0p0 -0x1.0p3 0x1.acp5 0x0.0p0 F +REG world:irish 1 OK -0x1.9b013981f11ecp18 -0x1.0997722ab5ff2p18 0x0.0p0 -0x1.067e6c224278ap4 0x1.83fffffbfac68p5 0x0.0p0 F +REG world:irish 2 OK 0x1.90d09cc0f88f6p19 -0x1.0997722ab5ff2p18 0x0.0p0 0x1.9f9b08909e293p-2 0x1.83fffffbfac68p5 0x0.0p0 F +REG world:irish 3 OK -0x1.1a7c1ccc6104fp18 0x1.98dbfc81b4cd8p19 0x0.0p0 -0x1.067e6c14807a7p4 0x1.d3fffffc3e5bcp5 0x0.0p0 F +REG world:irish 4 OK 0x1.508e0e6630828p19 0x1.98dbfc81b4cd8p19 0x0.0p0 0x1.9f9b05201e9e9p-2 0x1.d3fffffc3e5bcp5 0x0.0p0 F +REG world:levant 0 OK 0x1.e848p18 0x1.24f8p18 0x0.0p0 0x1.2accccccccccdp5 0x1.15333333333p5 0x0.0p0 F +REG world:levant 1 OK -0x1.6003c138603f8p16 -0x1.cf1c6f78f13bp17 0x0.0p0 0x1.f45a283b2e20bp4 0x1.da666666665bep4 0x0.0p0 F +REG world:levant 2 OK 0x1.0a243c138603dp20 -0x1.cf1c6f78f13bp17 0x0.0p0 0x1.5b6c857c02894p5 0x1.da666666665bep4 0x0.0p0 F +REG world:levant 3 OK -0x1.6a5646aec1bep14 0x1.a9615598f23fap19 0x0.0p0 0x1.f45a283b2e20bp4 0x1.3d33333333316p5 0x0.0p0 F +REG world:levant 4 OK 0x1.f39ab235760dap19 0x1.a9615598f23fap19 0x0.0p0 0x1.5b6c857c02894p5 0x1.3d33333333316p5 0x0.0p0 F +REG world:madagascar 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:madagascar 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:madagascar 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:madagascar 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:madagascar 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:malay 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:malay 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:malay 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:malay 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:malay 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +REG world:n-alger 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-alger 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-alger 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-alger 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-alger 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-maroc 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-maroc 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-maroc 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-maroc 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-maroc 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-tunis 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-tunis 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-tunis 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-tunis 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:n-tunis 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:neiez 0 OK 0x1.dc13p21 0x1.b774000000006p19 0x0.0p0 0x1.b8p6 0x0.0p0 0x0.0p0 T +REG world:neiez 1 OK 0x1.985785aab8f47p21 0x1.53f875a6d736ap18 0x0.0p0 0x1.a400000000001p6 -0x1.3fffffffffe21p2 0x0.0p0 F +REG world:neiez 2 OK 0x1.0fe73d2aa385cp22 0x1.53f875a6d736ap18 0x0.0p0 0x1.ccp6 -0x1.3fffffffffe21p2 0x0.0p0 F +REG world:neiez 3 OK 0x1.985785aab8f47p21 0x1.6275e2964a32bp20 0x0.0p0 0x1.a400000000001p6 0x1.3fffffffffe21p2 0x0.0p0 F +REG world:neiez 4 OK 0x1.0fe73d2aa385cp22 0x1.6275e2964a32bp20 0x0.0p0 0x1.ccp6 0x1.3fffffffffe21p2 0x0.0p0 F +REG world:new_zealand 0 EXC:org.locationtech.proj4j.InvalidValueException 0x1.cfa3cfdf02974p31 -0x1.b1efe8578d40cp32 0x0.0p0 NaN NaN NaN T +REG world:new_zealand 1 EXC:org.locationtech.proj4j.InvalidValueException 0x1.5db3432ce3926p32 -0x1.af4175fe79d8bp32 0x0.0p0 NaN NaN NaN F +REG world:new_zealand 2 EXC:org.locationtech.proj4j.InvalidValueException 0x1.c46848e7b2325p31 -0x1.4aed2d738be7p32 0x0.0p0 NaN NaN NaN F +REG world:new_zealand 3 EXC:org.locationtech.proj4j.InvalidValueException 0x1.db72ebd500ffp31 -0x1.11e6483f80353p33 0x0.0p0 NaN NaN NaN F +REG world:new_zealand 4 EXC:org.locationtech.proj4j.InvalidValueException 0x1.0c79793969ab1p31 -0x1.9d7f776a9c2dcp32 0x0.0p0 NaN NaN NaN F +REG world:nica-n 0 OK 0x1.e848p18 0x1.5f74f43958106p18 0x0.0p0 -0x1.56p6 0x1.bbbbbbbbbb9b7p3 0x0.0p0 F +REG world:nica-n 1 OK -0x1.0bbdd6652c84p16 -0x1.6e9167751280cp17 0x0.0p0 -0x1.6a99b23a23b5p6 0x1.1bbbbbbbbba17p3 0x0.0p0 F +REG world:nica-n 2 OK 0x1.04dfdd6652c84p20 -0x1.6e9167751280cp17 0x0.0p0 -0x1.41664dc5dc4bp6 0x1.1bbbbbbbbba17p3 0x0.0p0 F +REG world:nica-n 3 OK -0x1.5d15388d4d09p15 0x1.c111ad66483bep19 0x0.0p0 -0x1.6a99b23a23b5p6 0x1.2dddddddddccfp4 0x0.0p0 F +REG world:nica-n 4 OK 0x1.fe195388d4d09p19 0x1.c111ad66483bep19 0x0.0p0 -0x1.41664dc5dc4bp6 0x1.2dddddddddccfp4 0x0.0p0 F +REG world:nica-s 0 OK 0x1.e848p18 0x1.1a1b14ed91687p18 0x0.0p0 -0x1.56p6 0x1.755555555536cp3 0x0.0p0 F +REG world:nica-s 1 OK -0x1.04169b41a971p16 -0x1.fb2294c06917ap17 0x0.0p0 -0x1.6a6c01e3c7fd9p6 0x1.aaaaaaaaaa844p2 0x0.0p0 F +REG world:nica-s 2 OK 0x1.046569b41a971p20 -0x1.fb2294c06917ap17 0x0.0p0 -0x1.4193fe1c38027p6 0x1.aaaaaaaaaa844p2 0x0.0p0 F +REG world:nica-s 3 OK -0x1.6c483ca8417ep15 0x1.9de283114e69p19 0x0.0p0 -0x1.6a6c01e3c7fd9p6 0x1.0aaaaaaaaa998p4 0x0.0p0 F +REG world:nica-s 4 OK 0x1.ff0c83ca8417ep19 0x1.9de283114e69p19 0x0.0p0 -0x1.4193fe1c38027p6 0x1.0aaaaaaaaa998p4 0x0.0p0 F +REG world:nw-africa 0 OK 0x1.e848p19 0x1.e848p18 0x0.0p0 0x0.0p0 0x1.0ffffffffffc7p5 0x0.0p0 F +REG world:nw-africa 1 OK 0x1.9160bad7f9234p18 -0x1.22ade72a260dp15 0x0.0p0 -0x1.81fd5fd4d732p2 0x1.cffffffffff4ap4 0x0.0p0 F +REG world:nw-africa 2 OK 0x1.83efd14a01b73p20 -0x1.22ade72a260dp15 0x0.0p0 0x1.81fd5fd4d732p2 0x1.cffffffffff4ap4 0x0.0p0 F +REG world:nw-africa 3 OK 0x1.d11f34de1b919p18 0x1.0556bbada7ffp20 0x0.0p0 -0x1.81fd5fd4d732p2 0x1.37fffffffffdfp5 0x0.0p0 F +REG world:nw-africa 4 OK 0x1.740032c8791bap20 0x1.0556bbada7ffp20 0x0.0p0 0x1.81fd5fd4d7322p2 0x1.37fffffffffdfp5 0x0.0p0 F +REG world:palestine 0 OK 0x1.4c85c70a3d70ap17 0x1.ef93e8b439581p16 0x0.0p0 0x1.19b2574a51d44p5 -0x1.6eb984b267fe6p683 0x0.0p0 F +REG world:palestine 1 OK 0x1.43d8db2aa9affp17 0x1.17671230ab8ecp79 0x0.0p0 0x1.19b2574a51d44p5 0x1.68p6 0x0.0p0 F +REG world:palestine 2 OK 0x1.5532b2e9d1315p17 0x1.17671230ab8ecp79 0x0.0p0 0x1.19b2574a51d44p5 0x1.68p6 0x0.0p0 F +REG world:palestine 3 OK 0x1.46ab0b6d978b4p17 -0x1.1c799ce90b981p80 0x0.0p0 0x1.19b2574a51d44p5 -0x1.68p6 0x0.0p0 F +REG world:palestine 4 OK 0x1.526082a6e356p17 -0x1.1c799ce90b981p80 0x0.0p0 0x1.19b2574a51d44p5 -0x1.68p6 0x0.0p0 F +REG world:panama 0 OK 0x1.e848p18 0x1.1ff453645a1cbp18 0x0.0p0 -0x1.4p6 0x1.0d555555553c1p3 0x0.0p0 F +REG world:panama 1 OK -0x1.f1cf0a4b5d0cp15 -0x1.f21d4ecedd102p17 0x0.0p0 -0x1.5437be6a5625ep6 0x1.b5555555552dep1 0x0.0p0 F +REG world:panama 2 OK 0x1.03b278525ae8p20 -0x1.f21d4ecedd102p17 0x0.0p0 -0x1.2bc84195a9da2p6 0x1.b5555555552dep1 0x0.0p0 F +REG world:panama 3 OK -0x1.821e1e5ba756p15 0x1.a0104cc3df778p19 0x0.0p0 -0x1.5437be6a5625ep6 0x1.ad5555555533dp3 0x0.0p0 F +REG world:panama 4 OK 0x1.0034f0f2dd3a5p20 0x1.a0104cc3df778p19 0x0.0p0 -0x1.2bc84195a9da2p6 0x1.ad5555555533dp3 0x0.0p0 F +REG world:s-alger 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-alger 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-alger 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-alger 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-alger 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-maroc 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-maroc 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-maroc 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-maroc 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-maroc 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-tunis 0 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-tunis 1 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-tunis 2 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-tunis 3 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +REG world:s-tunis 4 EXC:org.locationtech.proj4j.ProjectionException NaN NaN NaN NaN NaN NaN - +SYN ellps/APL4.9 0 OK 0x0.0p0 0x1.5543fcbf6487dp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/APL4.9 1 OK -0x1.80597561be51dp19 0x1.27511aeed26bdp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/APL4.9 2 OK 0x1.80597561be51fp19 0x1.27511aeed26bdp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/APL4.9 3 OK -0x1.80597561be51dp19 0x1.87734f34747f5p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/APL4.9 4 OK 0x1.80597561be51fp19 0x1.87734f34747f5p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/CPM 0 OK 0x0.0p0 0x1.555602715034dp22 0x0.0p0 0x1.4p3 0x1.67ffffffff864p5 0x0.0p0 F +SYN ellps/CPM 1 OK -0x1.803475f1fab97p19 0x1.2762e7f44c549p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3fffffffffff3p5 0x0.0p0 F +SYN ellps/CPM 2 OK 0x1.803475f1fab99p19 0x1.2762e7f44c549p22 0x0.0p0 0x1.112318007c2bp4 0x1.3fffffffffff3p5 0x0.0p0 F +SYN ellps/CPM 3 OK -0x1.803475f1fab97p19 0x1.8784c2e88a175p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffc8p5 0x0.0p0 F +SYN ellps/CPM 4 OK 0x1.803475f1fab99p19 0x1.8784c2e88a175p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffc8p5 0x0.0p0 F +SYN ellps/GRS67 0 OK 0x0.0p0 0x1.55444c4017b0bp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/GRS67 1 OK -0x1.8059d036ce307p19 0x1.27515fae75974p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/GRS67 2 OK 0x1.8059d036ce30ap19 0x1.27515fae75974p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/GRS67 3 OK -0x1.8059d036ce307p19 0x1.8773aa78b7527p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/GRS67 4 OK 0x1.8059d036ce30ap19 0x1.8773aa78b7527p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/GRS80 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/GRS80 1 OK -0x1.80597561be51dp19 0x1.27511d977a10ep22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/GRS80 2 OK 0x1.80597561be51fp19 0x1.27511d977a10ep22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/GRS80 3 OK -0x1.80597561be51dp19 0x1.87735260425d5p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/GRS80 4 OK 0x1.80597561be51fp19 0x1.87735260425d5p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/GSK2011 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/GSK2011 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/GSK2011 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/GSK2011 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/GSK2011 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/IAU76 0 OK 0x0.0p0 0x1.55440a1a6effap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/IAU76 1 OK -0x1.8059813ac063cp19 0x1.2751269cf8edbp22 0x0.0p0 0x1.76e73ffc1ea8p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/IAU76 2 OK 0x1.8059813ac063ep19 0x1.2751269cf8edbp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/IAU76 3 OK -0x1.8059813ac063cp19 0x1.87735e5856b4dp22 0x0.0p0 0x1.76e73ffc1ea8p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/IAU76 4 OK 0x1.8059813ac063ep19 0x1.87735e5856b4dp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/MERIT 0 OK 0x0.0p0 0x1.5543ff9569752p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/MERIT 1 OK -0x1.80597561be51dp19 0x1.27511d828b8f7p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/MERIT 2 OK 0x1.80597561be51fp19 0x1.27511d828b8f7p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/MERIT 3 OK -0x1.80597561be51dp19 0x1.877352474b605p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/MERIT 4 OK 0x1.80597561be51fp19 0x1.877352474b605p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/NAD27 0 OK 0x0.0p0 0x1.553dd43e2d2c9p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/NAD27 1 OK -0x1.805b3044a404ap19 0x1.274b715a6e8d8p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe4p5 0x0.0p0 F +SYN ellps/NAD27 2 OK 0x1.805b3044a404cp19 0x1.274b715a6e8d8p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe4p5 0x0.0p0 F +SYN ellps/NAD27 3 OK -0x1.805b3044a404ap19 0x1.876cbb83053c1p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff945p5 0x0.0p0 F +SYN ellps/NAD27 4 OK 0x1.805b3044a404cp19 0x1.876cbb83053c1p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff945p5 0x0.0p0 F +SYN ellps/NAD83 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/NAD83 1 OK -0x1.80597561be51dp19 0x1.27511d977a10ep22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/NAD83 2 OK 0x1.80597561be51fp19 0x1.27511d977a10ep22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/NAD83 3 OK -0x1.80597561be51dp19 0x1.87735260425d5p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/NAD83 4 OK 0x1.80597561be51fp19 0x1.87735260425d5p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/NWL9D 0 EXC:org.locationtech.proj4j.ConvergenceFailureException 0x0.0p0 0x1.0645608825c0ep-6 0x0.0p0 NaN NaN NaN F +SYN ellps/NWL9D 1 EXC:org.locationtech.proj4j.ConvergenceFailureException -0x1.805994f9c3d6fp19 0x1.a89dce208bc2dp-7 0x0.0p0 NaN NaN NaN F +SYN ellps/NWL9D 2 EXC:org.locationtech.proj4j.ConvergenceFailureException 0x1.805994f9c3d71p19 0x1.a89dce208bc2dp-7 0x0.0p0 NaN NaN NaN F +SYN ellps/NWL9D 3 EXC:org.locationtech.proj4j.ConvergenceFailureException -0x1.805994f9c3d6fp19 0x1.474b755d3c098p-6 0x0.0p0 NaN NaN NaN F +SYN ellps/NWL9D 4 EXC:org.locationtech.proj4j.ConvergenceFailureException 0x1.805994f9c3d71p19 0x1.474b755d3c098p-6 0x0.0p0 NaN NaN NaN F +SYN ellps/PZ90 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/PZ90 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/PZ90 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/PZ90 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/PZ90 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/SEasia 0 OK 0x0.0p0 0x1.5544501eaa2ep22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/SEasia 1 OK -0x1.8059bc77cabd4p19 0x1.275163f50c99p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/SEasia 2 OK 0x1.8059bc77cabd7p19 0x1.275163f50c99p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/SEasia 3 OK -0x1.8059bc77cabd4p19 0x1.8773ad8e3b8fcp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/SEasia 4 OK 0x1.8059bc77cabd7p19 0x1.8773ad8e3b8fcp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/SGS85 0 OK 0x0.0p0 0x1.5543fc13bcf1ap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/SGS85 1 OK -0x1.8059716ebda13p19 0x1.27511a79bc701p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/SGS85 2 OK 0x1.8059716ebda15p19 0x1.27511a79bc701p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/SGS85 3 OK -0x1.8059716ebda13p19 0x1.87734e419ceedp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/SGS85 4 OK 0x1.8059716ebda15p19 0x1.87734e419ceedp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/WGS60 0 OK 0x0.0p0 0x1.5544732f62b67p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/WGS60 1 OK -0x1.8059e3f5d1a3ap19 0x1.2751824d1fa45p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/WGS60 2 OK 0x1.8059e3f5d1a3dp19 0x1.2751824d1fa45p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/WGS60 3 OK -0x1.8059e3f5d1a3ap19 0x1.8773d5c707019p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/WGS60 4 OK 0x1.8059e3f5d1a3dp19 0x1.8773d5c707019p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/WGS66 0 OK 0x0.0p0 0x1.554418ccc8681p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/WGS66 1 OK -0x1.805994f9c3d6fp19 0x1.275133354b30dp22 0x0.0p0 0x1.76e73ffc1ea8p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/WGS66 2 OK 0x1.805994f9c3d71p19 0x1.275133354b30dp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/WGS66 3 OK -0x1.805994f9c3d6fp19 0x1.87736f61e7cabp22 0x0.0p0 0x1.76e73ffc1ea8p1 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/WGS66 4 OK 0x1.805994f9c3d71p19 0x1.87736f61e7cabp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/WGS72 0 OK 0x0.0p0 0x1.5543f9c9346b5p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/WGS72 1 OK -0x1.80596d7bbcf09p19 0x1.2751188ba7ed5p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/WGS72 2 OK 0x1.80596d7bbcf0bp19 0x1.2751188ba7ed5p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/WGS72 3 OK -0x1.80596d7bbcf09p19 0x1.87734b8d2316ap22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/WGS72 4 OK 0x1.80596d7bbcf0bp19 0x1.87734b8d2316ap22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/WGS84 0 OK 0x0.0p0 0x1.5543ffac9942cp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/WGS84 1 OK -0x1.80597561be51dp19 0x1.27511d979d56bp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/WGS84 2 OK 0x1.80597561be51fp19 0x1.27511d979d56bp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/WGS84 3 OK -0x1.80597561be51dp19 0x1.877352606c6efp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/WGS84 4 OK 0x1.80597561be51fp19 0x1.877352606c6efp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/airy 0 OK 0x0.0p0 0x1.553dd34fcfdfbp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/airy 1 OK -0x1.80509c168dad2p19 0x1.274bd8b01d847p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/airy 2 OK 0x1.80509c168dad5p19 0x1.274bd8b01d847p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/airy 3 OK -0x1.80509c168dad2p19 0x1.876c22569eb2fp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9e8p5 0x0.0p0 F +SYN ellps/airy 4 OK 0x1.80509c168dad5p19 0x1.876c22569eb2fp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9e8p5 0x0.0p0 F +SYN ellps/andrae 0 EXC:org.locationtech.proj4j.ConvergenceFailureException 0x0.0p0 0x1.0966ae5449e13p-6 0x0.0p0 NaN NaN NaN F +SYN ellps/andrae 1 EXC:org.locationtech.proj4j.ConvergenceFailureException -0x1.80498786b0bd6p19 0x1.adaf20a09fee4p-7 0x0.0p0 NaN NaN NaN F +SYN ellps/andrae 2 EXC:org.locationtech.proj4j.ConvergenceFailureException 0x1.80498786b0bd9p19 0x1.adaf20a09fee4p-7 0x0.0p0 NaN NaN NaN F +SYN ellps/andrae 3 EXC:org.locationtech.proj4j.ConvergenceFailureException -0x1.80498786b0bd6p19 0x1.4b336f194f62ap-6 0x0.0p0 NaN NaN NaN F +SYN ellps/andrae 4 EXC:org.locationtech.proj4j.ConvergenceFailureException 0x1.80498786b0bd9p19 0x1.4b336f194f62ap-6 0x0.0p0 NaN NaN NaN F +SYN ellps/aust_SA 0 OK 0x0.0p0 0x1.55444d65e3acap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/aust_SA 1 OK -0x1.8059d036ce307p19 0x1.275160b96da25p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/aust_SA 2 OK 0x1.8059d036ce30ap19 0x1.275160b96da25p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/aust_SA 3 OK -0x1.8059d036ce307p19 0x1.8773abb71ff7fp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/aust_SA 4 OK 0x1.8059d036ce30ap19 0x1.8773abb71ff7fp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/australian 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/australian 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/australian 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/australian 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/australian 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/bess_nam 0 OK 0x0.0p0 0x1.553c7724814c1p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/bess_nam 1 OK -0x1.804f62007f815p19 0x1.274aa8650f38bp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/bess_nam 2 OK 0x1.804f62007f817p19 0x1.274aa8650f38bp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/bess_nam 3 OK -0x1.804f62007f815p19 0x1.876a975aa9de2p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9e3p5 0x0.0p0 F +SYN ellps/bess_nam 4 OK 0x1.804f62007f817p19 0x1.876a975aa9de2p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9e3p5 0x0.0p0 F +SYN ellps/bessel 0 OK 0x0.0p0 0x1.553b4715f1892p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/bessel 1 OK -0x1.804e0b907451p19 0x1.2749a146cce8bp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/bessel 2 OK 0x1.804e0b9074512p19 0x1.2749a146cce8bp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/bessel 3 OK -0x1.804e0b907451p19 0x1.87693a959f747p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9e3p5 0x0.0p0 F +SYN ellps/bessel 4 OK 0x1.804e0b9074512p19 0x1.87693a959f747p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9e3p5 0x0.0p0 F +SYN ellps/clrk66 0 OK 0x0.0p0 0x1.553fb403e2dccp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/clrk66 1 OK -0x1.805a8775549adp19 0x1.274d2bce7f029p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/clrk66 2 OK 0x1.805a8775549afp19 0x1.274d2bce7f029p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/clrk66 3 OK -0x1.805a8775549adp19 0x1.876eb9fe73b1dp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff971p5 0x0.0p0 F +SYN ellps/clrk66 4 OK 0x1.805a8775549afp19 0x1.876eb9fe73b1dp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff971p5 0x0.0p0 F +SYN ellps/clrk80 0 OK 0x0.0p0 0x1.553dd43e2d2c9p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/clrk80 1 OK -0x1.805b3044a404ap19 0x1.274b715a6e8d8p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe4p5 0x0.0p0 F +SYN ellps/clrk80 2 OK 0x1.805b3044a404cp19 0x1.274b715a6e8d8p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe4p5 0x0.0p0 F +SYN ellps/clrk80 3 OK -0x1.805b3044a404ap19 0x1.876cbb83053c1p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff945p5 0x0.0p0 F +SYN ellps/clrk80 4 OK 0x1.805b3044a404cp19 0x1.876cbb83053c1p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff945p5 0x0.0p0 F +SYN ellps/clrk80ign 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/clrk80ign 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/clrk80ign 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/clrk80ign 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/clrk80ign 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/danish 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/danish 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/danish 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/danish 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/danish 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN ellps/delmbr 0 OK 0x0.0p0 0x1.5540a6c43329ep22 0x0.0p0 0x1.4p3 0x1.67ffffffffff8p5 0x0.0p0 F +SYN ellps/delmbr 1 OK -0x1.803f18262321dp19 0x1.274f169ed462fp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffecp5 0x0.0p0 F +SYN ellps/delmbr 2 OK 0x1.803f18262322p19 0x1.274f169ed462fp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffecp5 0x0.0p0 F +SYN ellps/delmbr 3 OK -0x1.803f18262321dp19 0x1.876e366727113p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffb02p5 0x0.0p0 F +SYN ellps/delmbr 4 OK 0x1.803f18262322p19 0x1.876e366727113p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffb02p5 0x0.0p0 F +SYN ellps/engelis 0 OK 0x0.0p0 0x1.5543fc1722c82p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/engelis 1 OK -0x1.805971a14a76dp19 0x1.27511a7ae1003p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/engelis 2 OK 0x1.805971a14a76fp19 0x1.27511a7ae1003p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/engelis 3 OK -0x1.805971a14a76dp19 0x1.87734e4822c69p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/engelis 4 OK 0x1.805971a14a76fp19 0x1.87734e4822c69p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/evrst30 0 OK 0x0.0p0 0x1.553c33c1ab886p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/evrst30 1 OK -0x1.804c2e7537ffcp19 0x1.274a8ab12546cp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/evrst30 2 OK 0x1.804c2e7537ffep19 0x1.274a8ab12546cp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/evrst30 3 OK -0x1.804c2e7537ffcp19 0x1.876a204593ab2p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst30 4 OK 0x1.804c2e7537ffep19 0x1.876a204593ab2p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst48 0 OK 0x0.0p0 0x1.553c94f4882ddp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/evrst48 1 OK -0x1.804c9bec31031p19 0x1.274adecdc5dd1p22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/evrst48 2 OK 0x1.804c9bec31034p19 0x1.274adecdc5dd1p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/evrst48 3 OK -0x1.804c9bec31031p19 0x1.876a8fc384d8ep22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst48 4 OK 0x1.804c9bec31034p19 0x1.876a8fc384d8ep22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst56 0 OK 0x0.0p0 0x1.553c8b10f9d4ap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/evrst56 1 OK -0x1.804c90c929f24p19 0x1.274ad63f10f13p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/evrst56 2 OK 0x1.804c90c929f26p19 0x1.274ad63f10f13p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/evrst56 3 OK -0x1.804c90c929f24p19 0x1.876a846bb122bp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst56 4 OK 0x1.804c90c929f26p19 0x1.876a846bb122bp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst69 0 OK 0x0.0p0 0x1.553c77809fd98p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/evrst69 1 OK -0x1.804c7ac0c7a2p19 0x1.274ac5510a551p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/evrst69 2 OK 0x1.804c7ac0c7a22p19 0x1.274ac5510a551p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/evrst69 3 OK -0x1.804c7ac0c7a2p19 0x1.876a6dfad9e98p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrst69 4 OK 0x1.804c7ac0c7a22p19 0x1.876a6dfad9e98p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrstSS 0 OK 0x0.0p0 0x1.553c81a4d0e12p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/evrstSS 1 OK -0x1.804c862c99801p19 0x1.274ace17ae15fp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/evrstSS 2 OK 0x1.804c862c99803p19 0x1.274ace17ae15fp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe8p5 0x0.0p0 F +SYN ellps/evrstSS 3 OK -0x1.804c862c99801p19 0x1.876a799cd187fp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/evrstSS 4 OK 0x1.804c862c99803p19 0x1.876a799cd187fp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffa0ep5 0x0.0p0 F +SYN ellps/fschr60 0 OK 0x0.0p0 0x1.554476b10f67dp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/fschr60 1 OK -0x1.8059e7e8d2544p19 0x1.27518555eeed5p22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/fschr60 2 OK 0x1.8059e7e8d2547p19 0x1.27518555eeed5p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/fschr60 3 OK -0x1.8059e7e8d2544p19 0x1.8773d9ccb5a4bp22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/fschr60 4 OK 0x1.8059e7e8d2547p19 0x1.8773d9ccb5a4bp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/fschr60m 0 OK 0x0.0p0 0x1.5544501ea3c95p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/fschr60m 1 OK -0x1.8059bc77cabd4p19 0x1.275163f506c9ep22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/fschr60m 2 OK 0x1.8059bc77cabd7p19 0x1.275163f506c9ep22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/fschr60m 3 OK -0x1.8059bc77cabd4p19 0x1.8773ad8e34a2p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/fschr60m 4 OK 0x1.8059bc77cabd7p19 0x1.8773ad8e34a2p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/fschr68 0 OK 0x0.0p0 0x1.55443e964452cp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/fschr68 1 OK -0x1.8059a8b8c74a1p19 0x1.275154c8fa5cap22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/fschr68 2 OK 0x1.8059a8b8c74a4p19 0x1.275154c8fa5cap22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/fschr68 3 OK -0x1.8059a8b8c74a1p19 0x1.87739971cb723p22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/fschr68 4 OK 0x1.8059a8b8c74a4p19 0x1.87739971cb723p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/helmert 0 OK 0x0.0p0 0x1.5544ede9fef48p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/helmert 1 OK -0x1.805a6e2ee9c9fp19 0x1.2751ec8176a0dp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/helmert 2 OK 0x1.805a6e2ee9ca1p19 0x1.2751ec8176a0dp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/helmert 3 OK -0x1.805a6e2ee9c9fp19 0x1.8774628de7501p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/helmert 4 OK 0x1.805a6e2ee9ca1p19 0x1.8774628de7501p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/hough 0 OK 0x0.0p0 0x1.5543d28899c05p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/hough 1 OK -0x1.805b82a11a168p19 0x1.2750e05e035c2p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/hough 2 OK 0x1.805b82a11a16ap19 0x1.2750e05e035c2p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/hough 3 OK -0x1.805b82a11a168p19 0x1.87733ef7a4e66p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9aap5 0x0.0p0 F +SYN ellps/hough 4 OK 0x1.805b82a11a16ap19 0x1.87733ef7a4e66p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9aap5 0x0.0p0 F +SYN ellps/intl 0 OK 0x0.0p0 0x1.5545704bb24c9p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN ellps/intl 1 OK -0x1.805d54a36b81ap19 0x1.2752466b48652p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/intl 2 OK 0x1.805d54a36b81cp19 0x1.2752466b48652p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe5p5 0x0.0p0 F +SYN ellps/intl 3 OK -0x1.805d54a36b81ap19 0x1.877519936d357p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9aap5 0x0.0p0 F +SYN ellps/intl 4 OK 0x1.805d54a36b81cp19 0x1.877519936d357p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9aap5 0x0.0p0 F +SYN ellps/kaula 0 OK 0x0.0p0 0x1.554453ddad4f3p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/kaula 1 OK -0x1.8059dc0fd0426p19 0x1.2751662555ff6p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/kaula 2 OK 0x1.8059dc0fd0428p19 0x1.2751662555ff6p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/kaula 3 OK -0x1.8059dc0fd0426p19 0x1.8773b3640b3cap22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/kaula 4 OK 0x1.8059dc0fd0428p19 0x1.8773b3640b3cap22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cap5 0x0.0p0 F +SYN ellps/krass 0 OK 0x0.0p0 0x1.55458bb55a1fap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN ellps/krass 1 OK -0x1.805b1fe608d69p19 0x1.2752750de677cp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/krass 2 OK 0x1.805b1fe608d6bp19 0x1.2752750de677cp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/krass 3 OK -0x1.805b1fe608d69p19 0x1.8775178d99fe3p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/krass 4 OK 0x1.805b1fe608d6bp19 0x1.8775178d99fe3p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9ccp5 0x0.0p0 F +SYN ellps/lerch 0 OK 0x0.0p0 0x1.55440698c27c2p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/lerch 1 OK -0x1.80597d47bfb31p19 0x1.2751239429ce4p22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/lerch 2 OK 0x1.80597d47bfb34p19 0x1.2751239429ce4p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/lerch 3 OK -0x1.80597d47bfb31p19 0x1.87735a52a8435p22 0x0.0p0 0x1.76e73ffc1ea84p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/lerch 4 OK 0x1.80597d47bfb34p19 0x1.87735a52a8435p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/mod_airy 0 OK 0x0.0p0 0x1.553ac498f2b4cp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/mod_airy 1 OK -0x1.804d2a97acc13p19 0x1.2749335bd508bp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/mod_airy 2 OK 0x1.804d2a97acc15p19 0x1.2749335bd508bp22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe7p5 0x0.0p0 F +SYN ellps/mod_airy 3 OK -0x1.804d2a97acc13p19 0x1.8768a086193c4p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9e8p5 0x0.0p0 F +SYN ellps/mod_airy 4 OK 0x1.804d2a97acc15p19 0x1.8768a086193c4p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9e8p5 0x0.0p0 F +SYN ellps/mprts 0 OK 0x0.0p0 0x1.5540b5f0fac05p22 0x0.0p0 0x1.4p3 0x1.67fffffffff57p5 0x0.0p0 F +SYN ellps/mprts 1 OK -0x1.8181147664896p19 0x1.2742c80ac010dp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3fffffffffe8fp5 0x0.0p0 F +SYN ellps/mprts 2 OK 0x1.8181147664898p19 0x1.2742c80ac010dp22 0x0.0p0 0x1.112318007c2bp4 0x1.3fffffffffe8fp5 0x0.0p0 F +SYN ellps/mprts 3 OK -0x1.8181147664896p19 0x1.878056676c6cp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8ffffffffffcp5 0x0.0p0 F +SYN ellps/mprts 4 OK 0x1.8181147664898p19 0x1.878056676c6cp22 0x0.0p0 0x1.112318007c2bp4 0x1.8ffffffffffcp5 0x0.0p0 F +SYN ellps/new_intl 0 OK 0x0.0p0 0x1.55444479d02eap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN ellps/new_intl 1 OK -0x1.8059c6574c76ep19 0x1.275158ff28242p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/new_intl 2 OK 0x1.8059c6574c77p19 0x1.275158ff28242p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe6p5 0x0.0p0 F +SYN ellps/new_intl 3 OK -0x1.8059c6574c76ep19 0x1.8773a17db027ap22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/new_intl 4 OK 0x1.8059c6574c77p19 0x1.8773a17db027ap22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffff9cbp5 0x0.0p0 F +SYN ellps/plessis 0 OK 0x0.0p0 0x1.553dc476595aap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff7p5 0x0.0p0 F +SYN ellps/plessis 1 OK -0x1.80408f5364ae5p19 0x1.274c69494b963p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffebp5 0x0.0p0 F +SYN ellps/plessis 2 OK 0x1.80408f5364ae7p19 0x1.274c69494b963p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffebp5 0x0.0p0 F +SYN ellps/plessis 3 OK -0x1.80408f5364ae5p19 0x1.876b2b590717fp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffac7p5 0x0.0p0 F +SYN ellps/plessis 4 OK 0x1.80408f5364ae7p19 0x1.876b2b590717fp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffac7p5 0x0.0p0 F +SYN ellps/sphere 0 OK 0x0.0p0 0x1.56ba1b6a45c6p22 0x0.0p0 0x1.4p3 0x1.67fffffffffffp5 0x0.0p0 F +SYN ellps/sphere 1 OK -0x1.7feb7e5f6a993p19 0x1.28a9605725013p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.4000000000001p5 0x0.0p0 F +SYN ellps/sphere 2 OK 0x1.7feb7e5f6a995p19 0x1.28a9605725013p22 0x0.0p0 0x1.112318007c2bp4 0x1.4000000000001p5 0x0.0p0 F +SYN ellps/sphere 3 OK -0x1.7feb7e5f6a993p19 0x1.89027dd740411p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffffep5 0x0.0p0 F +SYN ellps/sphere 4 OK 0x1.7feb7e5f6a995p19 0x1.89027dd740411p22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffffep5 0x0.0p0 F +SYN ellps/walbeck 0 OK 0x0.0p0 0x1.553a0cafba182p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff6p5 0x0.0p0 F +SYN ellps/walbeck 1 OK -0x1.80465063660bcp19 0x1.2748cfbb57908p22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.3ffffffffffe9p5 0x0.0p0 F +SYN ellps/walbeck 2 OK 0x1.80465063660bfp19 0x1.2748cfbb57908p22 0x0.0p0 0x1.112318007c2bp4 0x1.3ffffffffffe9p5 0x0.0p0 F +SYN ellps/walbeck 3 OK -0x1.80465063660bcp19 0x1.876776a21e64dp22 0x0.0p0 0x1.76e73ffc1ea82p1 0x1.8fffffffffa3ep5 0x0.0p0 F +SYN ellps/walbeck 4 OK 0x1.80465063660bfp19 0x1.876776a21e64dp22 0x0.0p0 0x1.112318007c2bp4 0x1.8fffffffffa3ep5 0x0.0p0 F +SYN mod/aea/R 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/R 1 OK -0x1.edd664f795201p20 -0x1.5fbf6b2e7952dp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/R 2 OK 0x1.edd664f795201p20 -0x1.5fbf6b2e7952dp20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/R 3 OK -0x1.1d98ac27770e5p20 0x1.c5da73876aefp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/R 4 OK 0x1.1d98ac27770e5p20 0x1.c5da73876aefp20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/R_A 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/R_A 1 OK -0x1.edd698af9d13dp20 -0x1.5fbf900501e39p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/R_A 2 OK 0x1.edd698af9d13dp20 -0x1.5fbf900501e39p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/R_A 3 OK -0x1.1d98ca10728fdp20 0x1.c5daa30f741acp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/R_A 4 OK 0x1.1d98ca10728fdp20 0x1.c5daa30f741acp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/R_C 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_C 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_C 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_C 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_C 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_V 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_V 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_V 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_V 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_V 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_h 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_h 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_h 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_h 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_h 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/R_lat_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/a 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/a 1 OK -0x1.f015e9c9453a6p20 -0x1.6159588ec5408p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/a 2 OK 0x1.f015e9c9453a6p20 -0x1.6159588ec5408p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/a 3 OK -0x1.1ee581c16d70bp20 0x1.c7eb5f5df08acp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/a 4 OK 0x1.1ee581c16d70bp20 0x1.c7eb5f5df08acp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/alpha 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/alpha 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/alpha 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/alpha 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/alpha 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/axis_neu 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/axis_neu 1 OK -0x1.602455ccae63p20 -0x1.ee64139236084p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/axis_neu 2 OK -0x1.602455ccae63p20 0x1.ee64139236084p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/axis_neu 3 OK 0x1.c65ca9707a7fbp20 -0x1.1dea9c30e010bp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/axis_neu 4 OK 0x1.c65ca9707a7fbp20 0x1.1dea9c30e010bp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/axis_wsu 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/axis_wsu 1 OK 0x1.ee64139236084p20 0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/axis_wsu 2 OK -0x1.ee64139236084p20 0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/axis_wsu 3 OK 0x1.1dea9c30e010bp20 -0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/axis_wsu 4 OK -0x1.1dea9c30e010bp20 -0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/b 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffffbp5 0x0.0p0 F +SYN mod/aea/b 1 OK -0x1.ee64139236082p20 -0x1.602455ccae61ep20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/aea/b 2 OK 0x1.ee64139236082p20 -0x1.602455ccae61ep20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/aea/b 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a801p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.e000000000005p5 0x0.0p0 F +SYN mod/aea/b 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a801p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000005p5 0x0.0p0 F +SYN mod/aea/datum_NAD27 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000003p5 0x0.0p0 F +SYN mod/aea/datum_NAD27 1 OK -0x1.ee669f2435bcbp20 -0x1.6021810fbefbep20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffcp4 0x0.0p0 F +SYN mod/aea/datum_NAD27 2 OK 0x1.ee669f2435bcbp20 -0x1.6021810fbefbep20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffcp4 0x0.0p0 F +SYN mod/aea/datum_NAD27 3 OK -0x1.1ded7353203bap20 0x1.c65da19ff03aap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffap5 0x0.0p0 F +SYN mod/aea/datum_NAD27 4 OK 0x1.1ded7353203bap20 0x1.c65da19ff03aap20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffap5 0x0.0p0 F +SYN mod/aea/datum_NAD83 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/datum_NAD83 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/datum_NAD83 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/datum_NAD83 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/datum_NAD83 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/datum_WGS84 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/aea/datum_WGS84 1 OK -0x1.ee6413922d63bp20 -0x1.602455ccca96cp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000003p4 0x0.0p0 F +SYN mod/aea/datum_WGS84 2 OK 0x1.ee6413922d63bp20 -0x1.602455ccca96cp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000003p4 0x0.0p0 F +SYN mod/aea/datum_WGS84 3 OK -0x1.1dea9c30d0f13p20 0x1.c65ca9707caf4p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dfffffffffffcp5 0x0.0p0 F +SYN mod/aea/datum_WGS84 4 OK 0x1.1dea9c30d0f13p20 0x1.c65ca9707caf4p20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffcp5 0x0.0p0 F +SYN mod/aea/datum_nad83_lower 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/datum_nad83_lower 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/datum_nad83_lower 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/datum_nad83_lower 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/datum_nad83_lower 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/datum_potsdam 0 OK 0x1.5a344326baed3p6 0x1.07e0021c60a0cp6 -0x1.ca12dd8dap5 0x1.4000000003d2fp3 0x1.67ffffff752bbp5 0x1.16b9p-11 F +SYN mod/aea/datum_potsdam 1 OK -0x1.ee5e61b42f8fdp20 -0x1.6020f1841dd3fp20 -0x1.8303ac5cp4 -0x1.66d29002d63bbp3 0x1.dfffffff24685p4 0x1.845bep-11 F +SYN mod/aea/datum_potsdam 2 OK 0x1.ee6a7b02bb395p20 -0x1.601ed83dbbdafp20 -0x1.262e7c5p2 0x1.f36948016d1bp4 0x1.dfffffff25469p4 0x1.8553p-11 F +SYN mod/aea/datum_potsdam 3 OK -0x1.1de6c06ca00aap20 0x1.c65f89d3db952p20 -0x1.e06041fp-1 -0x1.66d29002aac91p3 0x1.dfffffff7d1a7p5 0x1.31f3p-12 F +SYN mod/aea/datum_potsdam 4 OK 0x1.1defe2bca33edp20 0x1.c66056169f2cdp20 0x1.4bc21bed8p3 0x1.f36948015bdfdp4 0x1.dfffffff7cc76p5 0x1.34154p-12 F +SYN mod/aea/e 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/e 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/e 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/e 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/e 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/ellps_clrk66 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000003p5 0x0.0p0 F +SYN mod/aea/ellps_clrk66 1 OK -0x1.ee669f2435bcbp20 -0x1.6021810fbefbep20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffcp4 0x0.0p0 F +SYN mod/aea/ellps_clrk66 2 OK 0x1.ee669f2435bcbp20 -0x1.6021810fbefbep20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffcp4 0x0.0p0 F +SYN mod/aea/ellps_clrk66 3 OK -0x1.1ded7353203bap20 0x1.c65da19ff03aap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffap5 0x0.0p0 F +SYN mod/aea/ellps_clrk66 4 OK 0x1.1ded7353203bap20 0x1.c65da19ff03aap20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffap5 0x0.0p0 F +SYN mod/aea/es 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/es 1 OK -0x1.ee64139236085p20 -0x1.602455ccae642p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffff5p4 0x0.0p0 F +SYN mod/aea/es 2 OK 0x1.ee64139236082p20 -0x1.602455ccae642p20 0x0.0p0 0x1.f36948017480dp4 0x1.dfffffffffff5p4 0x0.0p0 F +SYN mod/aea/es 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a804p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/aea/es 4 OK 0x1.1dea9c30e010ap20 0x1.c65ca9707a804p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/aea/f 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p6 0x0.0p0 F +SYN mod/aea/f 1 OK -0x1.adfae61b00faep13 -0x1.fb3936f5b781cp27 0x0.0p0 -0x1.66d29002e901ep3 0x1.68p6 0x0.0p0 F +SYN mod/aea/f 2 OK 0x1.adfae61b00facp13 -0x1.fb3936f5b781cp27 0x0.0p0 0x1.f36948017480dp4 0x1.68p6 0x0.0p0 F +SYN mod/aea/f 3 OK -0x1.1ea85f8a23114p12 0x1.3f8bb2f03f2c5p28 0x0.0p0 -0x1.66d29002e901ep3 0x1.68p6 0x0.0p0 F +SYN mod/aea/f 4 OK 0x1.1ea85f8a23112p12 0x1.3f8bb2f03f2c5p28 0x0.0p0 0x1.f36948017480dp4 0x1.68p6 0x0.0p0 F +SYN mod/aea/gamma 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/gamma 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/gamma 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/gamma 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/gamma 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/h 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/h 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/h 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/h 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/h 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/k 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/k 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/k 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/k 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/k 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/k_0 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/k_0 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/k_0 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/k_0 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/k_0 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/lat_ts 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/lat_ts 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/lat_ts 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/lat_ts 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/lat_ts 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/lonc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/lonc 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/lonc 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/lonc 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/lonc 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/nadgrids_conus 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/nadgrids_conus 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/nadgrids_conus 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/nadgrids_conus 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/nadgrids_conus 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/nadgrids_null 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/nadgrids_null 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/nadgrids_null 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/nadgrids_null 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/nadgrids_null 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/no_uoff 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/no_uoff 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/no_uoff 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/no_uoff 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/no_uoff 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/pm_numeric 0 OK -0x1.be8e7b596038cp16 0x1.ff34a9ac415b8p9 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/pm_numeric 1 OK -0x1.08428c6ae1ea3p21 -0x1.56fe55a96decap20 0x0.0p0 -0x1.66d29002e901dp3 0x1.e000000000003p4 0x0.0p0 F +SYN mod/aea/pm_numeric 2 OK 0x1.cc1a90b6c0ad4p20 -0x1.68adb1a0473cbp20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000003p4 0x0.0p0 F +SYN mod/aea/pm_numeric 3 OK -0x1.31a768af0e7bcp20 0x1.cba716c78c62ap20 0x0.0p0 -0x1.66d29002e901fp3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/pm_numeric 4 OK 0x1.0a16650fe259cp20 0x1.c16cd2ef38ee6p20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/pm_paris 0 OK -0x1.5be00c9a78f0fp17 0x1.364505bc09739p11 0x0.0p0 0x1.4000000000001p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/pm_paris 1 OK -0x1.11bf85ca0a6c1p21 -0x1.519f4d344620cp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000003p4 0x0.0p0 F +SYN mod/aea/pm_paris 2 OK 0x1.b8e6ce84cf0dp20 -0x1.6d2d14f558e5cp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000003p4 0x0.0p0 F +SYN mod/aea/pm_paris 3 OK -0x1.3ca0dc4009b19p20 0x1.cec24c83d287fp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/pm_paris 4 OK 0x1.fdf7055623643p19 0x1.bed2f3dc13e9dp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/rf 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p6 0x0.0p0 F +SYN mod/aea/rf 1 OK -0x1.ab795400628f4p13 -0x1.fe327a629441cp27 0x0.0p0 -0x1.66d29002e901ep3 0x1.68p6 0x0.0p0 F +SYN mod/aea/rf 2 OK 0x1.ab795400628f2p13 -0x1.fe327a629441cp27 0x0.0p0 0x1.f36948017480ep4 0x1.68p6 0x0.0p0 F +SYN mod/aea/rf 3 OK -0x1.1cfca3e032d35p12 0x1.416b4ad87d7ffp28 0x0.0p0 -0x1.66d29002e9021p3 0x1.68p6 0x0.0p0 F +SYN mod/aea/rf 4 OK 0x1.1cfca3e032d34p12 0x1.416b4ad87d7ffp28 0x0.0p0 0x1.f36948017480ep4 0x1.68p6 0x0.0p0 F +SYN mod/aea/south 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/south 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/south 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/south 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/south 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/to_meter 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/to_meter 1 OK -0x1.95811e29a5433p22 -0x1.20d49048ce31ap22 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/to_meter 2 OK 0x1.95811e29a5433p22 -0x1.20d49048ce31ap22 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/to_meter 3 OK -0x1.d505e60393d82p21 0x1.74ac160ffe57ep22 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/to_meter 4 OK 0x1.d505e60393d82p21 0x1.74ac160ffe57ep22 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/towgs84_3 0 OK -0x1.bc6de7097a366p0 -0x1.385061b8da176p0 -0x1.88172efcp1 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/towgs84_3 1 OK -0x1.ee643e3105e91p20 -0x1.602470d333efcp20 -0x1.019e8d02p1 -0x1.66d29002e901dp3 0x1.dfffffffffffep4 -0x1.8p-29 F +SYN mod/aea/towgs84_3 2 OK 0x1.ee6407b7af4c7p20 -0x1.6024742aac796p20 -0x1.91b172dp1 0x1.f36948017480ep4 0x1.dfffffffffffap4 -0x1.0p-30 F +SYN mod/aea/towgs84_3 3 OK -0x1.1deac18bf1548p20 0x1.c65ca2c7d6b23p20 -0x1.726e547ap1 -0x1.66d29002e901fp3 0x1.e000000000005p5 0x0.0p0 F +SYN mod/aea/towgs84_3 4 OK 0x1.1dea892af19fdp20 0x1.c65ca6ceee039p20 -0x1.c59caedcp1 0x1.f36948017480ep4 0x1.e000000000001p5 -0x1.0p-30 F +SYN mod/aea/towgs84_7 0 OK -0x1.baa29c0bf2f6fp4 0x1.0c02bc8e2854fp7 -0x1.798fb1de2p5 0x1.3fffffdf13108p3 0x1.67fffffec9f4ep5 0x1.6d47dp-9 F +SYN mod/aea/towgs84_7 1 OK -0x1.ee687b079bfdp20 -0x1.601800e431116p20 -0x1.70de8cb7cp5 -0x1.66d2901d2c127p3 0x1.dffffff86f8c4p4 0x1.c5717cp-8 F +SYN mod/aea/towgs84_7 2 OK 0x1.ee5ed301e43e4p20 -0x1.60216586909bcp20 -0x1.7c6485d96p5 0x1.f36947f9ecf8cp4 0x1.dffffff96794cp4 0x1.7d042p-10 F +SYN mod/aea/towgs84_7 3 OK -0x1.1de8e0ac516b9p20 0x1.c6677919a27b2p20 -0x1.7752a167ep5 -0x1.66d29039720bcp3 0x1.dfffffff6d0b7p5 0x1.3e755p-8 F +SYN mod/aea/towgs84_7 4 OK 0x1.1ded8b71d9a15p20 0x1.c661d329bf713p20 -0x1.7f094906p5 0x1.f36947f471b8cp4 0x1.e00000033900ap5 0x1.7b1cap-10 F +SYN mod/aea/towgs84_zero 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/towgs84_zero 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/towgs84_zero 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/towgs84_zero 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/towgs84_zero 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/units_km 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/units_km 1 OK -0x1.fa419d41c08b8p10 -0x1.6897e52bb49ebp10 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/units_km 2 OK 0x1.fa419d41c08b8p10 -0x1.6897e52bb49ebp10 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/units_km 3 OK -0x1.24c747e020d5bp10 0x1.d144430289bap10 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/units_km 4 OK 0x1.24c747e020d5bp10 0x1.d144430289bap10 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/units_us_ft 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/units_us_ft 1 OK -0x1.9580e9032d476p22 -0x1.20d46a6d4494cp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/units_us_ft 2 OK 0x1.9580e9032d476p22 -0x1.20d46a6d4494cp22 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/units_us_ft 3 OK -0x1.d505a889c699fp21 0x1.74abe537306c1p22 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/units_us_ft 4 OK 0x1.d505a889c699fp21 0x1.74abe537306c1p22 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/unknown_keyword 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/unknown_keyword 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/unknown_keyword 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/unknown_keyword 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/unknown_keyword 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vto_meter 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vto_meter 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vto_meter 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vto_meter 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vto_meter 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vunits_m 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vunits_m 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vunits_m 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vunits_m 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/vunits_m 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/aea/x_0_y_0 0 OK 0x1.e848p18 0x1.e848p19 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/x_0_y_0 1 OK -0x1.7452139236084p20 -0x1.b0015732b98cp18 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/x_0_y_0 2 OK 0x1.343b09c91b042p21 -0x1.b0015732b98cp18 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/x_0_y_0 3 OK -0x1.47b13861c0216p19 0x1.5d4054b83d3fep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/x_0_y_0 4 OK 0x1.97fc9c30e010bp20 0x1.5d4054b83d3fep21 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/zone 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/aea/zone 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/zone 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/aea/zone 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN mod/aea/zone 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN mod/lcc/R 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/R 1 OK -0x1.ed52bf7437a07p20 -0x1.4b3d07d729f7fp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/R 2 OK 0x1.ed52bf7437a04p20 -0x1.4b3d07d729f7fp20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/R 3 OK -0x1.1d4c89e022727p20 0x1.b3630f967abd8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/R 4 OK 0x1.1d4c89e022726p20 0x1.b3630f967abd8p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/R_A 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/R_A 1 OK -0x1.ed52f31e7611ap20 -0x1.4b3d2a87d4fdap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/R_A 2 OK 0x1.ed52f31e76117p20 -0x1.4b3d2a87d4fdap20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/R_A 3 OK -0x1.1d4ca7c124c3dp20 0x1.b3633d2f6c32bp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/R_A 4 OK 0x1.1d4ca7c124c3cp20 0x1.b3633d2f6c32bp20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/R_C 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_C 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_C 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_C 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_C 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_V 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_V 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_V 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_V 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_V 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_h 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_h 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_h 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_h 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_h 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/R_lat_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/a 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/a 1 OK -0x1.ef91aada1e733p20 -0x1.4cbf0e6861621p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/a 2 OK 0x1.ef91aada1e73p20 -0x1.4cbf0e6861621p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/a 3 OK -0x1.1e9906c019fc8p20 0x1.b55e761e779a9p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/a 4 OK 0x1.1e9906c019fc7p20 0x1.b55e761e779a9p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/alpha 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/alpha 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/alpha 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/alpha 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/alpha 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/axis_neu 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/axis_neu 1 OK -0x1.4b9c101f114d8p20 -0x1.ede04849e06aep20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/axis_neu 2 OK -0x1.4b9c101f114d8p20 0x1.ede04849e06abp20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/axis_neu 3 OK 0x1.b3dff9358d45ap20 -0x1.1d9e6411c7e74p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/axis_neu 4 OK 0x1.b3dff9358d45ap20 0x1.1d9e6411c7e73p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/axis_wsu 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/axis_wsu 1 OK 0x1.ede04849e06aep20 0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/axis_wsu 2 OK -0x1.ede04849e06abp20 0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/axis_wsu 3 OK 0x1.1d9e6411c7e74p20 -0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/axis_wsu 4 OK -0x1.1d9e6411c7e73p20 -0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/b 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/lcc/b 1 OK -0x1.ede04849e06afp20 -0x1.4b9c101f114dep20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/lcc/b 2 OK 0x1.ede04849e06aep20 -0x1.4b9c101f114dep20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/lcc/b 3 OK -0x1.1d9e6411c7e73p20 0x1.b3dff9358d454p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/b 4 OK 0x1.1d9e6411c7e72p20 0x1.b3dff9358d454p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/datum_NAD27 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/lcc/datum_NAD27 1 OK -0x1.ede2d442d51a1p20 -0x1.4b9983aeaa267p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff6p4 0x0.0p0 F +SYN mod/lcc/datum_NAD27 2 OK 0x1.ede2d442d519fp20 -0x1.4b9983aeaa267p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff6p4 0x0.0p0 F +SYN mod/lcc/datum_NAD27 3 OK -0x1.1da13b1230853p20 0x1.b3e11ba2dbfa1p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/lcc/datum_NAD27 4 OK 0x1.1da13b1230852p20 0x1.b3e11ba2dbfa1p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/lcc/datum_NAD83 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/datum_NAD83 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/datum_NAD83 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/datum_NAD83 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/datum_NAD83 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/datum_WGS84 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/lcc/datum_WGS84 1 OK -0x1.ede04849d7c0cp20 -0x1.4b9c101f2aff2p20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff64p4 0x0.0p0 F +SYN mod/lcc/datum_WGS84 2 OK 0x1.ede04849d7c0bp20 -0x1.4b9c101f2aff2p20 0x0.0p0 0x1.f36948017481p4 0x1.dffffffffff64p4 0x0.0p0 F +SYN mod/lcc/datum_WGS84 3 OK -0x1.1d9e6411b8c71p20 0x1.b3dff9358ddbdp20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/datum_WGS84 4 OK 0x1.1d9e6411b8c71p20 0x1.b3dff9358ddbdp20 0x0.0p0 0x1.f36948017481p4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/datum_nad83_lower 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/datum_nad83_lower 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/datum_nad83_lower 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/datum_nad83_lower 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/datum_nad83_lower 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/datum_potsdam 0 OK 0x1.59ea9200b09b5p6 0x1.ecb6dce398467p5 -0x1.ca12dd8dap5 0x1.4000000003d2fp3 0x1.67ffffff752aep5 0x1.16b9p-11 F +SYN mod/lcc/datum_potsdam 1 OK -0x1.eddaac88bf5ddp20 -0x1.4b9913cc1c1fcp20 -0x1.8303ac5cp4 -0x1.66d29002d63bap3 0x1.dfffffff245edp4 0x1.845bcp-11 F +SYN mod/lcc/datum_potsdam 2 OK 0x1.ede6bf2a0a0b3p20 -0x1.4b96d557f3b5ap20 -0x1.262e7c5p2 0x1.f36948016d1b2p4 0x1.dfffffff253dbp4 0x1.8553p-11 F +SYN mod/lcc/datum_potsdam 3 OK -0x1.1d9a5853a7348p20 0x1.b3e366e469ccfp20 -0x1.e06041fp-1 -0x1.66d29002aac9p3 0x1.dfffffff7d0f4p5 0x1.31f3p-12 F +SYN mod/lcc/datum_potsdam 4 OK 0x1.1da3780358a36p20 0x1.b3e44f3ab6ee5p20 0x1.4bc21bed8p3 0x1.f36948015bep4 0x1.dfffffff7cbbap5 0x1.3415cp-12 F +SYN mod/lcc/e 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/e 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/e 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/e 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/e 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/ellps_clrk66 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/lcc/ellps_clrk66 1 OK -0x1.ede2d442d51a1p20 -0x1.4b9983aeaa267p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff6p4 0x0.0p0 F +SYN mod/lcc/ellps_clrk66 2 OK 0x1.ede2d442d519fp20 -0x1.4b9983aeaa267p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff6p4 0x0.0p0 F +SYN mod/lcc/ellps_clrk66 3 OK -0x1.1da13b1230853p20 0x1.b3e11ba2dbfa1p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/lcc/ellps_clrk66 4 OK 0x1.1da13b1230852p20 0x1.b3e11ba2dbfa1p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/lcc/es 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/lcc/es 1 OK -0x1.ede04849e06b1p20 -0x1.4b9c101f114e1p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6p4 0x0.0p0 F +SYN mod/lcc/es 2 OK 0x1.ede04849e06afp20 -0x1.4b9c101f114e1p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff6p4 0x0.0p0 F +SYN mod/lcc/es 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d454p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/es 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d454p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/f 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/f 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/f 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/f 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/f 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/gamma 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/gamma 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/gamma 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/gamma 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/gamma 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/h 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/h 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/h 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/h 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/h 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/k 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/k 1 OK -0x1.edadb59f74174p20 -0x1.4b7a1b2c926c1p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/k 2 OK 0x1.edadb59f74171p20 -0x1.4b7a1b2c926c1p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/k 3 OK -0x1.1d8124bf08d8fp20 0x1.b3b35702a33b4p20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/k 4 OK 0x1.1d8124bf08d8ep20 0x1.b3b35702a33b4p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/k_0 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/k_0 1 OK -0x1.edadb59f74174p20 -0x1.4b7a1b2c926c1p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/k_0 2 OK 0x1.edadb59f74171p20 -0x1.4b7a1b2c926c1p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/k_0 3 OK -0x1.1d8124bf08d8fp20 0x1.b3b35702a33b4p20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/k_0 4 OK 0x1.1d8124bf08d8ep20 0x1.b3b35702a33b4p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/lat_ts 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/lat_ts 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/lat_ts 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/lat_ts 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/lat_ts 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/lonc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/lonc 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/lonc 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/lonc 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/lonc 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/nadgrids_conus 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/nadgrids_conus 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/nadgrids_conus 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/nadgrids_conus 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/nadgrids_conus 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/nadgrids_null 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/nadgrids_null 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/nadgrids_null 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/nadgrids_null 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/nadgrids_null 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/no_uoff 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/no_uoff 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/no_uoff 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/no_uoff 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/no_uoff 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/pm_numeric 0 OK -0x1.be2ed047ef2abp16 0x1.0b85581a6eb7ep10 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/pm_numeric 1 OK -0x1.07f1bd8d3ee38p21 -0x1.42098eb924d9fp20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/pm_numeric 2 OK 0x1.cbb0b39cff36bp20 -0x1.548b0201a9fc7p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/pm_numeric 3 OK -0x1.3149f1674473p20 0x1.b96926b5eec96p20 0x0.0p0 -0x1.66d29002e901dp3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/pm_numeric 4 OK 0x1.09d92bf015039p20 0x1.aeb562dd8a0e2p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/pm_paris 0 OK -0x1.5b94dcf4c038ap17 0x1.44bc4257a7695p11 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/pm_paris 1 OK -0x1.11657f4c82304p21 -0x1.3c6afe9239cb7p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/pm_paris 2 OK 0x1.b889d259fff82p20 -0x1.59400c948c3f3p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/pm_paris 3 OK -0x1.3c38bbbb1576fp20 0x1.bca91a1346667p20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/pm_paris 4 OK 0x1.fd8b7874f6227p19 0x1.abfc7c6af4686p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/rf 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/rf 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/rf 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/rf 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/rf 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN 0x0.0p0 NaN NaN NaN F +SYN mod/lcc/south 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/south 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/south 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/south 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/south 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/to_meter 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/to_meter 1 OK -0x1.951504dddaac4p22 -0x1.0ffd51161f536p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/to_meter 2 OK 0x1.951504dddaac2p22 -0x1.0ffd51161f536p22 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/to_meter 3 OK -0x1.d488ddf0d257p21 0x1.658249b758a8fp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/to_meter 4 OK 0x1.d488ddf0d256fp21 0x1.658249b758a8fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/towgs84_3 0 OK -0x1.bc0f4771aaae9p0 -0x1.239491c3edd67p0 -0x1.88172efcp1 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 F +SYN mod/lcc/towgs84_3 1 OK -0x1.ede0733b078dap20 -0x1.4b9c2aa1fe669p20 -0x1.019e8d02p1 -0x1.66d29002e901dp3 0x1.dffffffffff6ep4 -0x1.8p-29 F +SYN mod/lcc/towgs84_3 2 OK 0x1.ede03cccf9f19p20 -0x1.4b9c2ea0f5c91p20 -0x1.91b172dp1 0x1.f36948017480ep4 0x1.dffffffffff69p4 -0x1.0p-30 F +SYN mod/lcc/towgs84_3 3 OK -0x1.1d9e8980a3c7ep20 0x1.b3dff2fff043cp20 -0x1.726e547ap1 -0x1.66d29002e902p3 0x1.dffffffffff43p5 -0x1.0p-30 F +SYN mod/lcc/towgs84_3 4 OK 0x1.1d9e51144b3d2p20 0x1.b3dff65989b9cp20 -0x1.c59caedcp1 0x1.f36948017480ep4 0x1.dffffffffff43p5 -0x1.0p-30 F +SYN mod/lcc/towgs84_7 0 OK -0x1.ba446b420d02ap4 0x1.f46fad7132d9fp6 -0x1.798fb1de2p5 0x1.3fffffdf13109p3 0x1.67fffffec9f43p5 0x1.6d47dp-9 F +SYN mod/lcc/towgs84_7 1 OK -0x1.ede489bcb1b2bp20 -0x1.4b8fade933977p20 -0x1.70de8cb7cp5 -0x1.66d2901d2c123p3 0x1.dffffff86f82ap4 0x1.c57174p-8 F +SYN mod/lcc/towgs84_7 2 OK 0x1.eddafec8bc162p20 -0x1.4b99300f2afe7p20 -0x1.7c6485d96p5 0x1.f36947f9ecf88p4 0x1.dffffff9678aep4 0x1.7d044p-10 F +SYN mod/lcc/towgs84_7 3 OK -0x1.1d9c875280f6ep20 0x1.b3eac35d93eccp20 -0x1.7752a167ep5 -0x1.66d29039720bbp3 0x1.dfffffff6d003p5 0x1.3e755p-8 F +SYN mod/lcc/towgs84_7 4 OK 0x1.1da14362e4ab9p20 0x1.b3e52bde30638p20 -0x1.7f094906p5 0x1.f36947f471b8ep4 0x1.e000000338f4fp5 0x1.7b1cap-10 F +SYN mod/lcc/towgs84_zero 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/towgs84_zero 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/towgs84_zero 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/towgs84_zero 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/towgs84_zero 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/units_km 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/units_km 1 OK -0x1.f9baa83b4402ep10 -0x1.539178f4ce225p10 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/units_km 2 OK 0x1.f9baa83b4402bp10 -0x1.539178f4ce225p10 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/units_km 3 OK -0x1.24793b768f42cp10 0x1.be55fd2467b3dp10 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/units_km 4 OK 0x1.24793b768f42cp10 0x1.be55fd2467b3dp10 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/units_us_ft 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/units_us_ft 1 OK -0x1.9514cfc58de23p22 -0x1.0ffd2d6fab271p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/units_us_ft 2 OK 0x1.9514cfc58de2p22 -0x1.0ffd2d6fab271p22 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/units_us_ft 3 OK -0x1.d488a08768759p21 0x1.65821adb5646p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/units_us_ft 4 OK 0x1.d488a08768758p21 0x1.65821adb5646p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/unknown_keyword 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/unknown_keyword 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/unknown_keyword 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/unknown_keyword 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/unknown_keyword 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vto_meter 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vto_meter 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vto_meter 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vto_meter 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vto_meter 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vunits_m 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vunits_m 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vunits_m 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vunits_m 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/vunits_m 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/lcc/x_0_y_0 0 OK 0x1.e848p18 0x1.e848p19 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/x_0_y_0 1 OK -0x1.73ce4849e06aep20 -0x1.5de0407c4536p18 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/x_0_y_0 2 OK 0x1.33f92424f0356p21 -0x1.5de0407c4536p18 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/x_0_y_0 3 OK -0x1.4718c8238fce8p19 0x1.5401fc9ac6a2dp21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/x_0_y_0 4 OK 0x1.97b06411c7e73p20 0x1.5401fc9ac6a2dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/zone 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/lcc/zone 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/zone 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN mod/lcc/zone 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/lcc/zone 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/longlat/R 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/R 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/R 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/R 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/R 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/R_A 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/R_A 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/R_A 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/R_A 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/R_A 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/R_C 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_C 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_C 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_C 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_C 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_V 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_V 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_V 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_V 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_V 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_h 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_h 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_h 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_h 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_h 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/R_lat_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/a 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/a 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/a 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/a 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/a 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/alpha 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/alpha 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/alpha 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/alpha 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/alpha 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/axis_neu 0 OK 0x1.68p5 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/axis_neu 1 OK 0x1.dffffffffffffp4 -0x1.536948017480fp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/axis_neu 2 OK 0x1.dffffffffffffp4 0x1.536948017480ep4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/axis_neu 3 OK 0x1.dffffffffffffp5 -0x1.536948017480fp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/axis_neu 4 OK 0x1.dffffffffffffp5 0x1.536948017480ep4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/axis_wsu 0 OK -0x0.0p0 -0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/axis_wsu 1 OK 0x1.536948017480fp4 -0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/axis_wsu 2 OK -0x1.536948017480ep4 -0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/axis_wsu 3 OK 0x1.536948017480fp4 -0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/axis_wsu 4 OK -0x1.536948017480ep4 -0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/b 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/b 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/b 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/b 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/b 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_NAD27 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/datum_NAD27 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/datum_NAD27 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/datum_NAD27 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_NAD27 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_NAD83 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/datum_NAD83 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/datum_NAD83 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/datum_NAD83 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_NAD83 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_WGS84 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/datum_WGS84 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/datum_WGS84 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/datum_WGS84 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_WGS84 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/datum_nad83_lower 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/datum_nad83_lower 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/datum_nad83_lower 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/datum_nad83_lower 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/datum_nad83_lower 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/datum_potsdam 0 OK 0x1.29ba9b9255c6cp-10 0x1.68012cde95358p5 -0x1.ca12dd8dap5 0x1.4000000003d2fp3 0x1.67ffffff752bbp5 0x1.16b9p-11 F +SYN mod/longlat/datum_potsdam 1 OK -0x1.536e5f24bd505p4 0x1.dffb2abaa718cp4 -0x1.8303ac5cp4 -0x1.66d29002d63bap3 0x1.dfffffff24688p4 0x1.845bep-11 F +SYN mod/longlat/datum_potsdam 2 OK 0x1.5376af8211cdap4 0x1.dffa93ec77417p4 -0x1.262e7c5p2 0x1.f36948016d1bp4 0x1.dfffffff25472p4 0x1.8552ap-11 F +SYN mod/longlat/datum_potsdam 3 OK -0x1.5373f6c3239a1p4 0x1.e00441e908993p5 -0x1.e06041fp-1 -0x1.66d29002aac93p3 0x1.dfffffff7d1acp5 0x1.31f3p-12 F +SYN mod/longlat/datum_potsdam 4 OK 0x1.537e96267e6eap4 0x1.e003cfe9923fap5 0x1.4bc21bed8p3 0x1.f36948015bep4 0x1.dfffffff7cc75p5 0x1.34154p-12 F +SYN mod/longlat/e 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/e 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/e 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/e 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/e 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/ellps_clrk66 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/ellps_clrk66 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/ellps_clrk66 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/ellps_clrk66 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/ellps_clrk66 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/es 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/es 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/es 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/es 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/es 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/f 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/f 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/f 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/f 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/f 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/gamma 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/gamma 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/gamma 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/gamma 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/gamma 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/h 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/h 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/h 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/h 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/h 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/k 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/k 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/k 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/k 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/k 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/k_0 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/k_0 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/k_0 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/k_0 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/k_0 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/lat_ts 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/lat_ts 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/lat_ts 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/lat_ts 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/lat_ts 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/lonc 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/lonc 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/lonc 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/lonc 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/lonc 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/nadgrids_conus 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/nadgrids_conus 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/nadgrids_conus 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/nadgrids_conus 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/nadgrids_conus 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/nadgrids_null 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/nadgrids_null 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/nadgrids_null 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/nadgrids_null 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/nadgrids_null 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/no_uoff 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/no_uoff 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/no_uoff 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/no_uoff 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/no_uoff 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/pm_numeric 0 OK -0x1.8000000000002p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/pm_numeric 1 OK -0x1.6b6948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901fp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/pm_numeric 2 OK 0x1.3b6948017480dp4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/pm_numeric 3 OK -0x1.6b6948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901fp3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/pm_numeric 4 OK 0x1.3b6948017480dp4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/pm_paris 0 OK -0x1.2b2a53490b9b1p1 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/pm_paris 1 OK -0x1.78ce926a95f45p4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/pm_paris 2 OK 0x1.2e03fd98530d8p4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/pm_paris 3 OK -0x1.78ce926a95f45p4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/pm_paris 4 OK 0x1.2e03fd98530d8p4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/rf 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/rf 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/rf 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/rf 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/rf 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/south 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/south 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/south 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/south 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/south 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/to_meter 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/to_meter 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/to_meter 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/to_meter 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/to_meter 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/towgs84_3 0 OK -0x1.7e267939fb195p-16 0x1.67fffa6fbf215p5 -0x1.88172efcp1 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/longlat/towgs84_3 1 OK -0x1.53695f7077a0dp4 0x1.dfffea3998cbdp4 -0x1.019e8d02p1 -0x1.66d29002e901fp3 0x1.dfffffffffffep4 -0x1.8p-29 F +SYN mod/longlat/towgs84_3 2 OK 0x1.53693b0c70926p4 0x1.dffff05f3ff0fp4 -0x1.91b172dp1 0x1.f36948017480ep4 0x1.dfffffffffffep4 -0x1.0p-29 F +SYN mod/longlat/towgs84_3 3 OK -0x1.536970869dcd5p4 0x1.dffffb5aafeefp5 -0x1.726e547ap1 -0x1.66d29002e901fp3 0x1.dfffffffffffep5 -0x1.0p-30 F +SYN mod/longlat/towgs84_3 4 OK 0x1.53693199da9bep4 0x1.e00000a6a9db6p5 -0x1.c59caedcp1 0x1.f36948017480ep4 0x1.dfffffffffffep5 -0x1.0p-30 F +SYN mod/longlat/towgs84_7 0 OK -0x1.7c9d9a9cd392bp-12 0x1.6802631b77ed1p5 -0x1.798fb1de2p5 0x1.3fffffdf13108p3 0x1.67fffffec9f4cp5 0x1.6d47d8p-9 F +SYN mod/longlat/towgs84_7 1 OK -0x1.536e46188405bp4 0x1.e0066824c4a2cp4 -0x1.70de8cb7cp5 -0x1.66d2901d2c126p3 0x1.dffffff86f8bdp4 0x1.c5717cp-8 F +SYN mod/longlat/towgs84_7 2 OK 0x1.536653ad0f047p4 0x1.e00275869b995p4 -0x1.7c6485d96p5 0x1.f36947f9ecf88p4 0x1.dffffff967943p4 0x1.7d043p-10 F +SYN mod/longlat/towgs84_7 3 OK -0x1.536a7d31f88c4p4 0x1.e00334c17271cp5 -0x1.7752a167ep5 -0x1.66d29039720bbp3 0x1.dfffffff6d0bfp5 0x1.3e755p-8 F +SYN mod/longlat/towgs84_7 4 OK 0x1.536e22c6788b7p4 0x1.e001411198151p5 -0x1.7f094906p5 0x1.f36947f471b8ep4 0x1.e00000033900bp5 0x1.7b1c9p-10 F +SYN mod/longlat/towgs84_zero 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/towgs84_zero 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/towgs84_zero 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/towgs84_zero 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/towgs84_zero 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/units_km 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/units_km 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/units_km 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/units_km 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/units_km 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/units_us_ft 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/units_us_ft 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/units_us_ft 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/units_us_ft 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/units_us_ft 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/unknown_keyword 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/unknown_keyword 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/unknown_keyword 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/unknown_keyword 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/unknown_keyword 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vto_meter 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vto_meter 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vto_meter 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vto_meter 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vto_meter 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vunits_m 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vunits_m 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vunits_m 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vunits_m 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/vunits_m 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/longlat/x_0_y_0 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/x_0_y_0 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/x_0_y_0 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/x_0_y_0 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/x_0_y_0 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/zone 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/longlat/zone 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/zone 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/longlat/zone 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/longlat/zone 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/merc/R 0 OK 0x0.0p0 0x1.54e232fce8507p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/R 1 OK -0x1.1ff07be9dfdc4p21 0x1.a898979d1d406p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/R 2 OK 0x1.1ff07be9dfdc3p21 0x1.a898979d1d406p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/R 3 OK -0x1.1ff07be9dfdc4p21 0x1.fdd8e3baf9fcep22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/R 4 OK 0x1.1ff07be9dfdc3p21 0x1.fdd8e3baf9fcep22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/R_A 0 OK 0x0.0p0 0x1.54e256b02afc9p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/R_A 1 OK -0x1.1ff09a11ac9dbp21 0x1.a898c414bf893p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/R_A 2 OK 0x1.1ff09a11ac9dap21 0x1.a898c414bf893p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/R_A 3 OK -0x1.1ff09a11ac9dbp21 0x1.fdd919203ca7ep22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/R_A 4 OK 0x1.1ff09a11ac9dap21 0x1.fdd919203ca7ep22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/R_C 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_C 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_C 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_C 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_C 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_V 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_V 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_V 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_V 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_V 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_h 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_h 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_h 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_h 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_h 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/R_lat_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/a 0 OK 0x0.0p0 0x1.566f772098ca5p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/a 1 OK -0x1.21400c8940a03p21 0x1.aa876ac2ad3dcp21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/a 2 OK 0x1.21400c8940a02p21 0x1.aa876ac2ad3dcp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/a 3 OK -0x1.21400c8940a03p21 0x1.0015887871013p23 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/a 4 OK 0x1.21400c8940a02p21 0x1.0015887871013p23 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/alpha 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/alpha 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/alpha 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/alpha 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/alpha 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/axis_neu 0 OK 0x1.5543ffac72717p22 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/axis_neu 1 OK 0x1.a91268aeb3e0dp21 -0x1.204318094ebd6p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/axis_neu 2 OK 0x1.a91268aeb3e0dp21 0x1.204318094ebd5p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/axis_neu 3 OK 0x1.fe6b2a317a95fp22 -0x1.204318094ebd6p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/axis_neu 4 OK 0x1.fe6b2a317a95fp22 0x1.204318094ebd5p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/axis_wsu 0 OK -0x0.0p0 -0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/axis_wsu 1 OK 0x1.204318094ebd6p21 -0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/axis_wsu 2 OK -0x1.204318094ebd5p21 -0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/axis_wsu 3 OK 0x1.204318094ebd6p21 -0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/axis_wsu 4 OK -0x1.204318094ebd5p21 -0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/b 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/b 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e1p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/b 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e1p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/b 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/b 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/datum_NAD27 0 OK 0x0.0p0 0x1.553fb403e2dccp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/datum_NAD27 1 OK -0x1.2043e597ff742p21 0x1.a90c2ea0a32ep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff5cp4 0x0.0p0 F +SYN mod/merc/datum_NAD27 2 OK 0x1.2043e597ff741p21 0x1.a90c2ea0a32ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff5cp4 0x0.0p0 F +SYN mod/merc/datum_NAD27 3 OK -0x1.2043e597ff742p21 0x1.fe6627775242fp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/merc/datum_NAD27 4 OK 0x1.2043e597ff741p21 0x1.fe6627775242fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/merc/datum_NAD83 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/datum_NAD83 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/datum_NAD83 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/datum_NAD83 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/datum_NAD83 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/datum_WGS84 0 OK 0x0.0p0 0x1.5543ffac9942cp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/datum_WGS84 1 OK -0x1.204318094ebd6p21 0x1.a91268aeeab69p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/datum_WGS84 2 OK 0x1.204318094ebd5p21 0x1.a91268aeeab69p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/datum_WGS84 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a31aa2e3p22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/datum_WGS84 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a31aa2e3p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/datum_nad83_lower 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/datum_nad83_lower 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/datum_nad83_lower 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/datum_nad83_lower 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/datum_nad83_lower 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/datum_potsdam 0 OK 0x1.f9a9f517ecebbp6 0x1.553caf3529846p22 -0x1.ca12dd8dap5 0x1.4000000003d2fp3 0x1.67ffffff752afp5 0x1.16b9p-11 F +SYN mod/merc/datum_potsdam 1 OK -0x1.203edb4cd985fp21 0x1.a903111bd1542p21 -0x1.8303ac5cp4 -0x1.66d29002d63bbp3 0x1.dfffffff245fp4 0x1.845bep-11 F +SYN mod/merc/datum_potsdam 2 OK 0x1.2045eab612205p21 0x1.a9027df9e65adp21 -0x1.262e7c5p2 0x1.f36948016d1b2p4 0x1.dfffffff253dbp4 0x1.8553p-11 F +SYN mod/merc/datum_potsdam 3 OK -0x1.20439b088d811p21 0x1.fe64f58e91147p22 -0x1.e06041fp-1 -0x1.66d29002aac93p3 0x1.dfffffff7d0f4p5 0x1.31f3p-12 F +SYN mod/merc/datum_potsdam 4 OK 0x1.204ca057b9aeep21 0x1.fe6434416ec59p22 0x1.4bc21bed8p3 0x1.f36948015bep4 0x1.dfffffff7cbbap5 0x1.34158p-12 F +SYN mod/merc/e 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/e 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/e 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/e 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/e 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/ellps_clrk66 0 OK 0x0.0p0 0x1.553fb403e2dccp22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/ellps_clrk66 1 OK -0x1.2043e597ff742p21 0x1.a90c2ea0a32ep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff5cp4 0x0.0p0 F +SYN mod/merc/ellps_clrk66 2 OK 0x1.2043e597ff741p21 0x1.a90c2ea0a32ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff5cp4 0x0.0p0 F +SYN mod/merc/ellps_clrk66 3 OK -0x1.2043e597ff742p21 0x1.fe6627775242fp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/merc/ellps_clrk66 4 OK 0x1.2043e597ff741p21 0x1.fe6627775242fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff39p5 0x0.0p0 F +SYN mod/merc/es 0 OK 0x0.0p0 0x1.5543ffac72716p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/es 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0cp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff64p4 0x0.0p0 F +SYN mod/merc/es 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0cp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff64p4 0x0.0p0 F +SYN mod/merc/es 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95cp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/es 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95cp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/f 0 OK 0x0.0p0 NaN 0x0.0p0 0x1.4p3 NaN 0x0.0p0 F +SYN mod/merc/f 1 OK -0x1.204318094ebd6p21 NaN 0x0.0p0 -0x1.66d29002e902p3 NaN 0x0.0p0 F +SYN mod/merc/f 2 OK 0x1.204318094ebd5p21 NaN 0x0.0p0 0x1.f36948017480ep4 NaN 0x0.0p0 F +SYN mod/merc/f 3 OK -0x1.204318094ebd6p21 NaN 0x0.0p0 -0x1.66d29002e902p3 NaN 0x0.0p0 F +SYN mod/merc/f 4 OK 0x1.204318094ebd5p21 NaN 0x0.0p0 0x1.f36948017480ep4 NaN 0x0.0p0 F +SYN mod/merc/gamma 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/gamma 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/gamma 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/gamma 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/gamma 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/h 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/h 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/h 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/h 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/h 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/k 0 OK 0x0.0p0 0x1.55210d99a38cap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/k 1 OK -0x1.2025936b32c0cp21 0x1.a8e6e1ad676a8p21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/k 2 OK 0x1.2025936b32c0cp21 0x1.a8e6e1ad676a8p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/k 3 OK -0x1.2025936b32c0cp21 0x1.fe36e5e027491p22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/k 4 OK 0x1.2025936b32c0cp21 0x1.fe36e5e027491p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/k_0 0 OK 0x0.0p0 0x1.55210d99a38cap22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/k_0 1 OK -0x1.2025936b32c0cp21 0x1.a8e6e1ad676a8p21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/k_0 2 OK 0x1.2025936b32c0cp21 0x1.a8e6e1ad676a8p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/k_0 3 OK -0x1.2025936b32c0cp21 0x1.fe36e5e027491p22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/k_0 4 OK 0x1.2025936b32c0cp21 0x1.fe36e5e027491p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/lat_ts 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/lat_ts 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/lat_ts 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/lat_ts 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/lat_ts 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/lonc 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/lonc 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/lonc 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/lonc 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/lonc 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/nadgrids_conus 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/nadgrids_conus 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/nadgrids_conus 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/nadgrids_conus 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/nadgrids_conus 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/nadgrids_null 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/nadgrids_null 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/nadgrids_null 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/nadgrids_null 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/nadgrids_null 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/no_uoff 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/no_uoff 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/no_uoff 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/no_uoff 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/no_uoff 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/pm_numeric 0 OK -0x1.46219e3b78927p17 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/pm_numeric 1 OK -0x1.34a531ed06468p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e901dp3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/pm_numeric 2 OK 0x1.0be0fe2597342p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/pm_numeric 3 OK -0x1.34a531ed06468p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e901dp3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/pm_numeric 4 OK 0x1.0be0fe2597342p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/pm_paris 0 OK -0x1.fc299491d5ac2p17 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/pm_paris 1 OK -0x1.4005b1526c182p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/pm_paris 2 OK 0x1.00807ec031629p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/pm_paris 3 OK -0x1.4005b1526c182p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/pm_paris 4 OK 0x1.00807ec031629p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/rf 0 OK 0x0.0p0 NaN 0x0.0p0 0x1.4p3 NaN 0x0.0p0 F +SYN mod/merc/rf 1 OK -0x1.204318094ebd6p21 NaN 0x0.0p0 -0x1.66d29002e902p3 NaN 0x0.0p0 F +SYN mod/merc/rf 2 OK 0x1.204318094ebd5p21 NaN 0x0.0p0 0x1.f36948017480ep4 NaN 0x0.0p0 F +SYN mod/merc/rf 3 OK -0x1.204318094ebd6p21 NaN 0x0.0p0 -0x1.66d29002e902p3 NaN 0x0.0p0 F +SYN mod/merc/rf 4 OK 0x1.204318094ebd5p21 NaN 0x0.0p0 0x1.f36948017480ep4 NaN 0x0.0p0 F +SYN mod/merc/south 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/south 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/south 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/south 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/south 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/to_meter 0 OK 0x0.0p0 0x1.17e8d2b6c3ffap24 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/to_meter 1 OK -0x1.d8def1ad2b292p22 0x1.5ca5f1beffb76p23 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/to_meter 2 OK 0x1.d8def1ad2b291p22 0x1.5ca5f1beffb76p23 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/to_meter 3 OK -0x1.d8def1ad2b292p22 0x1.a2a68306fcbc2p24 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/to_meter 4 OK 0x1.d8def1ad2b291p22 0x1.a2a68306fcbc2p24 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/towgs84_3 0 OK -0x1.448f73b1529a8p1 0x1.5543f903886ebp22 -0x1.88172efcp1 0x1.3ffffffffffffp3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/towgs84_3 1 OK -0x1.20432bf045415p21 0x1.a912536f72ef1p21 -0x1.019e8d02p1 -0x1.66d29002e901dp3 0x1.dffffffffff69p4 -0x1.0p-28 F +SYN mod/merc/towgs84_3 2 OK 0x1.20430d082a57p21 0x1.a912596ef2f77p21 -0x1.91b172dp1 0x1.f36948017480ep4 0x1.dffffffffff69p4 -0x1.0p-30 F +SYN mod/merc/towgs84_3 3 OK -0x1.20433a733c9b8p21 0x1.fe6b2250b5b07p22 -0x1.726e547ap1 -0x1.66d29002e902p3 0x1.dffffffffff43p5 -0x1.0p-30 F +SYN mod/merc/towgs84_3 4 OK 0x1.204305020f499p21 0x1.fe6b2b4c18efep22 -0x1.c59caedcp1 0x1.f36948017480ep4 0x1.dffffffffff43p5 -0x1.0p-30 F +SYN mod/merc/towgs84_7 0 OK -0x1.4341c9a4386f4p5 0x1.5546db364eb4ep22 -0x1.798fb1de2p5 0x1.3fffffdf13109p3 0x1.67fffffec9f41p5 0x1.6d47dp-9 F +SYN mod/merc/towgs84_7 1 OK -0x1.20475584c7378p21 0x1.a918a91302bbdp21 -0x1.70de8cb7cp5 -0x1.66d2901d2c125p3 0x1.dffffff86f825p4 0x1.c5718p-8 F +SYN mod/merc/towgs84_7 2 OK 0x1.204095af71ac7p21 0x1.a914cef292df5p21 -0x1.7c6485d96p5 0x1.f36947f9ecf88p4 0x1.dffffff9678aep4 0x1.7d044p-10 F +SYN mod/merc/towgs84_7 3 OK -0x1.20441ea1906a3p21 0x1.fe709a04740cbp22 -0x1.7752a167ep5 -0x1.66d29039720bcp3 0x1.dfffffff6d001p5 0x1.3e755p-8 F +SYN mod/merc/towgs84_7 4 OK 0x1.204737855dde3p21 0x1.fe6d4aa60702ep22 -0x1.7f094906p5 0x1.f36947f471b8cp4 0x1.e000000338f4ep5 0x1.7b1cbp-10 F +SYN mod/merc/towgs84_zero 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/towgs84_zero 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/towgs84_zero 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/towgs84_zero 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/towgs84_zero 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/units_km 0 OK 0x0.0p0 0x1.5d74bc14f011dp12 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/units_km 1 OK -0x1.272e2d17ddf1p11 0x1.b3460cfc9f9e8p11 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/units_km 2 OK 0x1.272e2d17ddf0fp11 0x1.b3460cfc9f9e8p11 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/units_km 3 OK -0x1.272e2d17ddf1p11 0x1.055596a0804ccp13 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/units_km 4 OK 0x1.272e2d17ddf0fp11 0x1.055596a0804ccp13 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/units_us_ft 0 OK 0x0.0p0 0x1.17e8ae0690005p24 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN mod/merc/units_us_ft 1 OK -0x1.d8deb3b241461p22 0x1.5ca5c40c4e4fep23 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/units_us_ft 2 OK 0x1.d8deb3b24146p22 0x1.5ca5c40c4e4fep23 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/units_us_ft 3 OK -0x1.d8deb3b241461p22 0x1.a2a64c2768ddfp24 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/units_us_ft 4 OK 0x1.d8deb3b24146p22 0x1.a2a64c2768ddfp24 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/unknown_keyword 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/unknown_keyword 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/unknown_keyword 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/unknown_keyword 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/unknown_keyword 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vto_meter 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vto_meter 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vto_meter 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vto_meter 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vto_meter 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vunits_m 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vunits_m 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vunits_m 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vunits_m 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/vunits_m 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/merc/x_0_y_0 0 OK 0x1.e848p18 0x1.924cffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/x_0_y_0 1 OK -0x1.c67430129d7acp20 0x1.1192345759f06p22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff64p4 0x0.0p0 F +SYN mod/merc/x_0_y_0 2 OK 0x1.5d4c18094ebd5p21 0x1.1192345759f06p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff64p4 0x0.0p0 F +SYN mod/merc/x_0_y_0 3 OK -0x1.c67430129d7acp20 0x1.1dba1518bd4bp23 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/x_0_y_0 4 OK 0x1.5d4c18094ebd5p21 0x1.1dba1518bd4bp23 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/zone 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN mod/merc/zone 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/zone 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN mod/merc/zone 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/merc/zone 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN mod/tmerc/R 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/R 1 OK -0x1.f8d6fc5c86e12p20 -0x1.65df85bf740e1p20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/R 2 OK 0x1.f8d6fc5c86e12p20 -0x1.65df85bf740e1p20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/R 3 OK -0x1.1d41ca61de7dp20 0x1.c5930ea532fa6p20 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/R 4 OK 0x1.1d41ca61de7cfp20 0x1.c5930ea532fa6p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/R_A 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/R_A 1 OK -0x1.f8d7313b890ffp20 -0x1.65dfab3a36456p20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/R_A 2 OK 0x1.f8d7313b890ffp20 -0x1.65dfab3a36456p20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/R_A 3 OK -0x1.1d41e841c0a57p20 0x1.c5933e25c209bp20 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/R_A 4 OK 0x1.1d41e841c0a56p20 0x1.c5933e25c209bp20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/R_C 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_C 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_C 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_C 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_C 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_V 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_V 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_V 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_V 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_V 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_h 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_h 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_h 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_h 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_h 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/R_lat_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/a 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/a 1 OK -0x1.fb2353a3c3b02p20 -0x1.678096981a8a2p20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/a 2 OK 0x1.fb2353a3c3b02p20 -0x1.678096981a8a2p20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/a 3 OK -0x1.1e8e3abb3e0a4p20 0x1.c7a3a747d14d9p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/a 4 OK 0x1.1e8e3abb3e0a4p20 0x1.c7a3a747d14d9p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/alpha 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/alpha 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/alpha 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/alpha 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/alpha 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/axis_neu 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/axis_neu 1 OK -0x1.664632414c58dp20 -0x1.f967d30bc2f66p20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/axis_neu 2 OK -0x1.664632414c58dp20 0x1.f967d30bc2f66p20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/axis_neu 3 OK 0x1.c61530129e877p20 -0x1.1d93a17e1c90fp20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/axis_neu 4 OK 0x1.c61530129e877p20 0x1.1d93a17e1c90fp20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/axis_wsu 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/axis_wsu 1 OK 0x1.f967d30bc2f66p20 0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/axis_wsu 2 OK -0x1.f967d30bc2f66p20 0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/axis_wsu 3 OK 0x1.1d93a17e1c90fp20 -0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/axis_wsu 4 OK -0x1.1d93a17e1c90fp20 -0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/b 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/b 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c59p20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/b 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c59p20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/b 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e874p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/b 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e874p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/datum_NAD27 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/datum_NAD27 1 OK -0x1.f96a8e519be8bp20 -0x1.6643919b5f7b8p20 0x0.0p0 -0x1.66d13cbb51f6fp3 0x1.e00011825bc93p4 0x0.0p0 F +SYN mod/tmerc/datum_NAD27 2 OK 0x1.f96a8e519be8bp20 -0x1.6643919b5f7b8p20 0x0.0p0 0x1.f3689e5da8fb7p4 0x1.e00011825bc93p4 0x0.0p0 F +SYN mod/tmerc/datum_NAD27 3 OK -0x1.1d967a942a7fdp20 0x1.c6165230176cap20 0x0.0p0 -0x1.66cc591022fa2p3 0x1.e0000f5a76f86p5 0x0.0p0 F +SYN mod/tmerc/datum_NAD27 4 OK 0x1.1d967a942a7fcp20 0x1.c6165230176cap20 0x0.0p0 0x1.f3662c88117cfp4 0x1.e0000f5a76f88p5 0x0.0p0 F +SYN mod/tmerc/datum_NAD83 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/datum_NAD83 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/datum_NAD83 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/datum_NAD83 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/datum_NAD83 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/datum_WGS84 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/datum_WGS84 1 OK -0x1.f967d30bb92bp20 -0x1.66463241672c4p20 0x0.0p0 -0x1.66d13c3bbaf12p3 0x1.e00011924974fp4 0x0.0p0 F +SYN mod/tmerc/datum_WGS84 2 OK 0x1.f967d30bb92bp20 -0x1.66463241672c4p20 0x0.0p0 0x1.f3689e1ddd789p4 0x1.e00011924974fp4 0x0.0p0 F +SYN mod/tmerc/datum_WGS84 3 OK -0x1.1d93a17e0d614p20 0x1.c61530129f803p20 0x0.0p0 -0x1.66cc5912fa1efp3 0x1.e0000f65b0d97p5 0x0.0p0 F +SYN mod/tmerc/datum_WGS84 4 OK 0x1.1d93a17e0d613p20 0x1.c61530129f803p20 0x0.0p0 0x1.f3662c897d0f6p4 0x1.e0000f65b0d97p5 0x0.0p0 F +SYN mod/tmerc/datum_nad83_lower 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/datum_nad83_lower 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/datum_nad83_lower 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/datum_nad83_lower 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/datum_nad83_lower 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/datum_potsdam 0 OK 0x1.66272535f173fp6 0x1.fe24cc907913bp5 -0x1.ca12dd8dap5 0x1.4000000003d2fp3 0x1.67ffffff752bbp5 0x1.16b9p-11 F +SYN mod/tmerc/datum_potsdam 1 OK -0x1.f961d97048a94p20 -0x1.66437b3004135p20 -0x1.8303ac5cp4 -0x1.66d13bf7013ffp3 0x1.e00011976bf5dp4 0x1.459d4p-10 F +SYN mod/tmerc/datum_potsdam 2 OK 0x1.f96eb469fcdap20 -0x1.66420dc9fada5p20 -0x1.262e7c5p2 0x1.f3689dd2052e5p4 0x1.e000119c35392p4 0x1.6c93cp-10 F +SYN mod/tmerc/datum_potsdam 3 OK -0x1.1d8eac4d03e11p20 0x1.c618a2b299307p20 -0x1.e06041fp-1 -0x1.66cc5760c604p3 0x1.e0000f6af4042p5 0x1.75695p-10 F +SYN mod/tmerc/datum_potsdam 4 OK 0x1.1d97e1050fb0fp20 0x1.c61a1b5cb179cp20 0x1.4bc21bed8p3 0x1.f3662abf2333fp4 0x1.e0000f6faa62ap5 0x1.de434p-10 F +SYN mod/tmerc/e 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/e 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/e 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/e 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/e 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/ellps_clrk66 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/ellps_clrk66 1 OK -0x1.f96a8e519be8bp20 -0x1.6643919b5f7b8p20 0x0.0p0 -0x1.66d13cbb51f6fp3 0x1.e00011825bc93p4 0x0.0p0 F +SYN mod/tmerc/ellps_clrk66 2 OK 0x1.f96a8e519be8bp20 -0x1.6643919b5f7b8p20 0x0.0p0 0x1.f3689e5da8fb7p4 0x1.e00011825bc93p4 0x0.0p0 F +SYN mod/tmerc/ellps_clrk66 3 OK -0x1.1d967a942a7fdp20 0x1.c6165230176cap20 0x0.0p0 -0x1.66cc591022fa2p3 0x1.e0000f5a76f86p5 0x0.0p0 F +SYN mod/tmerc/ellps_clrk66 4 OK 0x1.1d967a942a7fcp20 0x1.c6165230176cap20 0x0.0p0 0x1.f3662c88117cfp4 0x1.e0000f5a76f88p5 0x0.0p0 F +SYN mod/tmerc/es 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/es 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/es 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/es 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e874p20 0x0.0p0 -0x1.66cc5912fa1e4p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/es 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e874p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/f 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 -0x1.85b83747def64p703 0x0.0p0 F +SYN mod/tmerc/f 1 OK -0x1.ad7a083114a9ap13 0x1.6b751af535adfp82 0x0.0p0 0x1.4p3 0x1.68p6 0x0.0p0 F +SYN mod/tmerc/f 2 OK 0x1.ad7a083114a9ap13 0x1.6b751af535adfp82 0x0.0p0 0x1.4p3 0x1.68p6 0x0.0p0 F +SYN mod/tmerc/f 3 OK -0x1.1af96e0d8a3d9p12 -0x1.942c57c904c0bp83 0x0.0p0 0x1.4p3 -0x1.68p6 0x0.0p0 F +SYN mod/tmerc/f 4 OK 0x1.1af96e0d8a3d9p12 -0x1.942c57c904c0bp83 0x0.0p0 0x1.4p3 -0x1.68p6 0x0.0p0 F +SYN mod/tmerc/gamma 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/gamma 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/gamma 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/gamma 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/gamma 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/h 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/h 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/h 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/h 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/h 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/k 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/k 1 OK -0x1.f93412246f6dcp20 -0x1.6621824fd01afp20 0x0.0p0 -0x1.66d13c3bbaf4ep3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/k 2 OK 0x1.f93412246f6dcp20 -0x1.6621824fd01afp20 0x0.0p0 0x1.f3689e1ddd7a8p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/k 3 OK -0x1.1d7663456f16ep20 0x1.c5e6b090c4c36p20 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/k 4 OK 0x1.1d7663456f16ep20 0x1.c5e6b090c4c36p20 0x0.0p0 0x1.f3662c897d0f4p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/k_0 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/k_0 1 OK -0x1.f93412246f6dcp20 -0x1.6621824fd01afp20 0x0.0p0 -0x1.66d13c3bbaf4ep3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/k_0 2 OK 0x1.f93412246f6dcp20 -0x1.6621824fd01afp20 0x0.0p0 0x1.f3689e1ddd7a8p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/k_0 3 OK -0x1.1d7663456f16ep20 0x1.c5e6b090c4c36p20 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/k_0 4 OK 0x1.1d7663456f16ep20 0x1.c5e6b090c4c36p20 0x0.0p0 0x1.f3662c897d0f4p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/lat_ts 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/lat_ts 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/lat_ts 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/lat_ts 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/lat_ts 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/lonc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/lonc 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/lonc 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/lonc 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/lonc 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/nadgrids_conus 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/nadgrids_conus 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/nadgrids_conus 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/nadgrids_conus 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/nadgrids_conus 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/nadgrids_null 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/nadgrids_null 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/nadgrids_null 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/nadgrids_null 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/nadgrids_null 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/no_uoff 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/no_uoff 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/no_uoff 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/no_uoff 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/no_uoff 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/pm_numeric 0 OK -0x1.cdfe4624c5179p16 0x1.11b58408bdbe4p10 0x0.0p0 0x1.3fffffffffe03p3 0x1.67fffffffff75p5 0x0.0p0 F +SYN mod/tmerc/pm_numeric 1 OK -0x1.0f0369313ee4dp21 -0x1.5ee28bc8f45d6p20 0x0.0p0 -0x1.66cfed4a25c82p3 0x1.e000271112b99p4 0x0.0p0 F +SYN mod/tmerc/pm_numeric 2 OK 0x1.d4f380dea56f3p20 -0x1.6d146dccc0b7ap20 0x0.0p0 0x1.f368f670fc146p4 0x1.e00007476f4ebp4 0x0.0p0 F +SYN mod/tmerc/pm_numeric 3 OK -0x1.3136ff81d0f7ap20 0x1.ccf1293b4018ap20 0x0.0p0 -0x1.66c6828aef304p3 0x1.e0002229de5e6p5 0x0.0p0 F +SYN mod/tmerc/pm_numeric 4 OK 0x1.09d408ff97b8cp20 0x1.bfb348cc8cb77p20 0x0.0p0 0x1.f367be7c6d9b3p4 0x1.e000065c68dcdp5 0x0.0p0 F +SYN mod/tmerc/pm_paris 0 OK -0x1.67ed991267c11p17 0x1.4c50c45ce435ap11 0x0.0p0 0x1.3ffffffffeccp3 0x1.67ffffffff859p5 0x0.0p0 F +SYN mod/tmerc/pm_paris 1 OK -0x1.19458862ff8p21 -0x1.5a7fee4620b0fp20 0x0.0p0 -0x1.66cec40dc88a7p3 0x1.e0003b5c35a2dp4 0x0.0p0 F +SYN mod/tmerc/pm_paris 2 OK 0x1.c0ac2c306590fp20 -0x1.70a1933730fcbp20 0x0.0p0 0x1.f3691326a375bp4 0x1.e000043d0c11dp4 0x0.0p0 F +SYN mod/tmerc/pm_paris 3 OK -0x1.3c1fdbfee982cp20 0x1.d0fa7db2bdb1cp20 0x0.0p0 -0x1.66c1644f28603p3 0x1.e00033cdf6e0cp5 0x0.0p0 F +SYN mod/tmerc/pm_paris 4 OK 0x1.fd85aff35171fp19 0x1.bc5840420a2ddp20 0x0.0p0 0x1.f36843bf5e65fp4 0x1.e00003ae6c3bbp5 0x0.0p0 F +SYN mod/tmerc/rf 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 -0x1.fa43f0dd25145p705 0x0.0p0 F +SYN mod/tmerc/rf 1 OK -0x1.aaf93652b805bp13 0x1.7cdbe0960933p82 0x0.0p0 0x1.4p3 0x1.68p6 0x0.0p0 F +SYN mod/tmerc/rf 2 OK 0x1.aaf93652b805bp13 0x1.7cdbe0960933p82 0x0.0p0 0x1.4p3 0x1.68p6 0x0.0p0 F +SYN mod/tmerc/rf 3 OK -0x1.1953316382c75p12 -0x1.a786242a06ab7p83 0x0.0p0 0x1.4p3 -0x1.68p6 0x0.0p0 F +SYN mod/tmerc/rf 4 OK 0x1.1953316382c75p12 -0x1.a786242a06ab7p83 0x0.0p0 0x1.4p3 -0x1.68p6 0x0.0p0 F +SYN mod/tmerc/south 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/south 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/south 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/south 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/south 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/to_meter 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/to_meter 1 OK -0x1.9e89e739045c9p22 -0x1.25dc2dec51c52p22 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/to_meter 2 OK 0x1.9e89e739045c9p22 -0x1.25dc2dec51c52p22 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/to_meter 3 OK -0x1.d477374726203p21 0x1.747176613ed5ep22 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/to_meter 4 OK 0x1.d477374726201p21 0x1.747176613ed5ep22 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/towgs84_3 0 OK -0x1.cbc4923e52facp0 -0x1.2de50c334aecep0 -0x1.88172efcp1 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/towgs84_3 1 OK -0x1.f967fe1d6012dp20 -0x1.664651697d2b6p20 -0x1.019e8d02p1 -0x1.66d13c3af56dfp3 0x1.e000119253f44p4 0x1.8f4p-18 F +SYN mod/tmerc/towgs84_3 2 OK 0x1.f967c4a0dd296p20 -0x1.6646516b02d7fp20 -0x1.91b172dp1 0x1.f3689e1e2f336p4 0x1.e000119240de2p4 -0x1.474p-19 F +SYN mod/tmerc/towgs84_3 3 OK -0x1.1d93c7dca48c4p20 0x1.c6152c06cf074p20 -0x1.726e547ap1 -0x1.66cc590bfa20bp3 0x1.e0000f65be81p5 0x1.efe8p-17 F +SYN mod/tmerc/towgs84_3 4 OK 0x1.1d938e63c6f4cp20 0x1.c6152c068eed7p20 -0x1.c59caedcp1 0x1.f3662c8b95e29p4 0x1.e0000f65a87e7p5 -0x1.0b4p-17 F +SYN mod/tmerc/towgs84_7 0 OK -0x1.c9e9822abc58ep4 0x1.0311c237275d8p7 -0x1.798fb1de2p5 0x1.3fffffdf13108p3 0x1.67fffffec9f4cp5 0x1.6d47d8p-9 F +SYN mod/tmerc/towgs84_7 1 OK -0x1.f96d3faa57653p20 -0x1.663983ddbbe0dp20 -0x1.70de8cb7cp5 -0x1.66d13c1af6d5dp3 0x1.e000118edc3c6p4 0x1.c5de3cp-8 F +SYN mod/tmerc/towgs84_7 2 OK 0x1.f9627de032262p20 -0x1.6642c4cc86c13p20 -0x1.7c6485d96p5 0x1.f3689e233ef77p4 0x1.e0001188cb163p4 0x1.7bf3ap-10 F +SYN mod/tmerc/towgs84_7 3 OK -0x1.1d9117135e4d4p20 0x1.c62006f1e5f13p20 -0x1.7752a167ep5 -0x1.66cc5915af23p3 0x1.e0000f672afbcp5 0x1.3fab98p-8 F +SYN mod/tmerc/towgs84_7 4 OK 0x1.1d963ba0b09a7p20 0x1.c61aa30922855p20 -0x1.7f094906p5 0x1.f3662c0e3fdf9p4 0x1.e0000f68905d2p5 0x1.772a6p-10 F +SYN mod/tmerc/towgs84_zero 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/towgs84_zero 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/towgs84_zero 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/towgs84_zero 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/towgs84_zero 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/units_km 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/units_km 1 OK -0x1.02c484a1ab803p11 -0x1.6edf6eda6ad9ep10 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/units_km 2 OK 0x1.02c484a1ab803p11 -0x1.6edf6eda6ad9ep10 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/units_km 3 OK -0x1.246e36c6c5301p10 0x1.d0fb1281a87a5p10 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/units_km 4 OK 0x1.246e36c6c53p10 0x1.d0fb1281a87a5p10 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/units_us_ft 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/units_us_ft 1 OK -0x1.9e89b0e3682d8p22 -0x1.25dc076802f0fp22 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/units_us_ft 2 OK 0x1.9e89b0e3682d8p22 -0x1.25dc076802f0fp22 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/units_us_ft 3 OK -0x1.d476f9e00c83ep21 0x1.7471459020005p22 0x0.0p0 -0x1.66cc5912fa1e8p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/units_us_ft 4 OK 0x1.d476f9e00c83dp21 0x1.7471459020005p22 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/unknown_keyword 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/unknown_keyword 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/unknown_keyword 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/unknown_keyword 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/unknown_keyword 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vto_meter 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vto_meter 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vto_meter 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vto_meter 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vto_meter 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vunits_m 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vunits_m 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vunits_m 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vunits_m 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/vunits_m 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/tmerc/x_0_y_0 0 OK 0x1.e848p18 0x1.e848p19 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/tmerc/x_0_y_0 1 OK -0x1.7f55d30bc2f66p20 -0x1.c888c90531634p18 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/x_0_y_0 2 OK 0x1.39bce985e17b3p21 -0x1.c888c90531634p18 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN mod/tmerc/x_0_y_0 3 OK -0x1.470342fc3921ep19 0x1.5d1c98094f43cp21 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/x_0_y_0 4 OK 0x1.97a5a17e1c90fp20 0x1.5d1c98094f43cp21 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN mod/tmerc/zone 0 OK 0x1.00c3a43e37eeap20 0x1.3197e3ddf9a5dp22 0x0.0p0 0x1.3ffffffadf33fp3 0x1.67fffffeb5fb7p5 0x0.0p0 F +SYN mod/tmerc/zone 1 OK -0x1.aca82831d768ap19 0x1.9fb19200edbb9p21 0x0.0p0 -0x1.66d28a0741f31p3 0x1.dffffffa2d502p4 0x0.0p0 F +SYN mod/tmerc/zone 2 OK 0x1.8fd914c4bec7ep21 0x1.c119d04dc3f8ap21 0x0.0p0 0x1.f35d39ec0518ep4 0x1.e001d832dc4fap4 0x0.0p0 F +SYN mod/tmerc/zone 3 OK -0x1.19e3a9b7af7f6p18 0x1.9b2e3aa3d9325p22 0x0.0p0 -0x1.66d26ba3dbb73p3 0x1.dffffff07c52ep5 0x0.0p0 F +SYN mod/tmerc/zone 4 OK 0x1.f20a27d8aa88cp20 0x1.aaa2a90b8ac9cp22 0x0.0p0 0x1.f33512f944b9fp4 0x1.e001968ca7a21p5 0x0.0p0 F +SYN mod/utm/R 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/R 1 OK -0x1.f8d6c66b9940ap20 -0x1.65df863b7e656p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/R 2 OK 0x1.f8d6c66b9940ap20 -0x1.65df863b7e656p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/R 3 OK -0x1.1d41d0ac88f4ep20 0x1.c5930f14729e7p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/R 4 OK 0x1.1d41d0ac88f4ep20 0x1.c5930f14729e7p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/R_A 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/R_A 1 OK -0x1.f8d6fb4a95c95p20 -0x1.65dfabb640a9bp20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/R_A 2 OK 0x1.f8d6fb4a95c95p20 -0x1.65dfabb640a9bp20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/R_A 3 OK -0x1.1d41ee8c6bc61p20 0x1.c5933e9501b96p20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/R_A 4 OK 0x1.1d41ee8c6bc6p20 0x1.c5933e9501b96p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/R_C 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_C 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_C 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_C 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_C 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_V 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_V 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_V 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_V 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_V 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_h 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_h 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_h 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_h 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_h 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_a 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_a 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_a 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_a 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_a 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_g 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_g 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_g 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_g 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/R_lat_g 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/a 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/a 1 OK -0x1.fb231d73f91e6p20 -0x1.67809714b57p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/a 2 OK 0x1.fb231d73f91e6p20 -0x1.67809714b57p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/a 3 OK -0x1.1e8e410d3d94ap20 0x1.c7a3a7b79297dp20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/a 4 OK 0x1.1e8e410d3d949p20 0x1.c7a3a7b79297dp20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/alpha 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/alpha 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/alpha 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/alpha 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/alpha 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/axis_neu 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/axis_neu 1 OK -0x1.664632bd7a467p20 -0x1.f9679d0b5b8d5p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/axis_neu 2 OK -0x1.664632bd7a467p20 0x1.f9679d0b5b8d5p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/axis_neu 3 OK 0x1.c6153081fe165p20 -0x1.1d93a7ca95229p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/axis_neu 4 OK 0x1.c6153081fe165p20 0x1.1d93a7ca95228p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/axis_wsu 0 OK -0x0.0p0 -0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/axis_wsu 1 OK 0x1.f9679d0b5b8d5p20 0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/axis_wsu 2 OK -0x1.f9679d0b5b8d5p20 0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/axis_wsu 3 OK 0x1.1d93a7ca95229p20 -0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/axis_wsu 4 OK -0x1.1d93a7ca95228p20 -0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/b 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/b 1 OK -0x1.f9679d0b5b8d4p20 -0x1.664632bd7a464p20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/b 2 OK 0x1.f9679d0b5b8d4p20 -0x1.664632bd7a464p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/b 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dfffffffffffep5 0x0.0p0 F +SYN mod/utm/b 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dfffffffffffep5 0x0.0p0 F +SYN mod/utm/datum_NAD27 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/datum_NAD27 1 OK -0x1.f96a580d04f8bp20 -0x1.6643921323d0ep20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dfffffffffffep4 0x0.0p0 F +SYN mod/utm/datum_NAD27 2 OK 0x1.f96a580d04f8bp20 -0x1.6643921323d0ep20 0x0.0p0 0x1.f36948017480dp4 0x1.dfffffffffffep4 0x0.0p0 F +SYN mod/utm/datum_NAD27 3 OK -0x1.1d9680e51e0ecp20 0x1.c616529f2795cp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/datum_NAD27 4 OK 0x1.1d9680e51e0ebp20 0x1.c616529f2795cp20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/datum_NAD83 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/datum_NAD83 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/datum_NAD83 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/datum_NAD83 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/datum_NAD83 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/datum_WGS84 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/datum_WGS84 1 OK -0x1.f9679d0b51c3dp20 -0x1.664632bd95196p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/datum_WGS84 2 OK 0x1.f9679d0b51c3dp20 -0x1.664632bd95196p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/datum_WGS84 3 OK -0x1.1d93a7ca85f29p20 0x1.c6153081ff0f5p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/datum_WGS84 4 OK 0x1.1d93a7ca85f29p20 0x1.c6153081ff0f5p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/datum_nad83_lower 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/datum_nad83_lower 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/datum_nad83_lower 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/datum_nad83_lower 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/datum_nad83_lower 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/datum_potsdam 0 OK 0x1.66272535f173ep6 0x1.fe24cc905555bp5 -0x1.ca12dd8dap5 0x1.4000000003d2fp3 0x1.67ffffff752bbp5 0x1.16b9p-11 F +SYN mod/utm/datum_potsdam 1 OK -0x1.f961a37ce8f81p20 -0x1.66437bad14c3bp20 -0x1.8303ac5cp4 -0x1.66d29002d63b9p3 0x1.dfffffff2468ap4 0x1.845bcp-11 F +SYN mod/utm/datum_potsdam 2 OK 0x1.f96e7e6bb43c8p20 -0x1.66420e4736af2p20 -0x1.262e7c5p2 0x1.f36948016d1aep4 0x1.dfffffff2546ep4 0x1.85532p-11 F +SYN mod/utm/datum_potsdam 3 OK -0x1.1d8eb29989d99p20 0x1.c618a3223ca84p20 -0x1.e06041fp-1 -0x1.66d29002aac98p3 0x1.dfffffff7d1acp5 0x1.31f3p-12 F +SYN mod/utm/datum_potsdam 4 OK 0x1.1d97e7534bc5dp20 0x1.c61a1bcc79093p20 0x1.4bc21bed8p3 0x1.f36948015bep4 0x1.dfffffff7cc73p5 0x1.3415cp-12 F +SYN mod/utm/e 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/e 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/e 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/e 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/e 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/ellps_clrk66 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/ellps_clrk66 1 OK -0x1.f96a580d04f8bp20 -0x1.6643921323d0ep20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dfffffffffffep4 0x0.0p0 F +SYN mod/utm/ellps_clrk66 2 OK 0x1.f96a580d04f8bp20 -0x1.6643921323d0ep20 0x0.0p0 0x1.f36948017480dp4 0x1.dfffffffffffep4 0x0.0p0 F +SYN mod/utm/ellps_clrk66 3 OK -0x1.1d9680e51e0ecp20 0x1.c616529f2795cp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/ellps_clrk66 4 OK 0x1.1d9680e51e0ebp20 0x1.c616529f2795cp20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/es 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/es 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a461p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/es 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a461p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/es 3 OK -0x1.1d93a7ca95228p20 0x1.c6153081fe168p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/es 4 OK 0x1.1d93a7ca95227p20 0x1.c6153081fe168p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/f 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/f 1 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/f 2 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/f 3 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/f 4 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/gamma 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/gamma 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/gamma 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/gamma 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/gamma 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/h 0 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/h 1 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/h 2 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/h 3 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/h 4 EXC:java.util.NoSuchElementException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/k 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/k 1 OK -0x1.f933dc298fa32p20 -0x1.662182cbf1513p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/k 2 OK 0x1.f933dc298fa32p20 -0x1.662182cbf1513p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/k 3 OK -0x1.1d766991428a7p20 0x1.c5e6b10018eaep20 0x0.0p0 -0x1.66d29002e9017p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/k 4 OK 0x1.1d766991428a7p20 0x1.c5e6b10018eaep20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/k_0 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/k_0 1 OK -0x1.f933dc298fa32p20 -0x1.662182cbf1513p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/k_0 2 OK 0x1.f933dc298fa32p20 -0x1.662182cbf1513p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/k_0 3 OK -0x1.1d766991428a7p20 0x1.c5e6b10018eaep20 0x0.0p0 -0x1.66d29002e9017p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/k_0 4 OK 0x1.1d766991428a7p20 0x1.c5e6b10018eaep20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/lat_ts 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/lat_ts 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/lat_ts 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/lat_ts 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/lat_ts 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/lonc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/lonc 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/lonc 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/lonc 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/lonc 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/nadgrids_conus 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/nadgrids_conus 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/nadgrids_conus 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/nadgrids_conus 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/nadgrids_conus 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/nadgrids_null 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/nadgrids_null 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/nadgrids_null 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/nadgrids_null 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/nadgrids_null 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/no_uoff 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/no_uoff 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/no_uoff 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/no_uoff 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/no_uoff 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/pm_numeric 0 OK -0x1.cdfe4624c3e69p16 0x1.11b58408bdb1ap10 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN mod/utm/pm_numeric 1 OK -0x1.0f0339ae17ce4p21 -0x1.5ee28d41648cdp20 0x0.0p0 -0x1.66d29002e901fp3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/utm/pm_numeric 2 OK 0x1.d4f3633e0c1dep20 -0x1.6d146ddfe0a8p20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x0.0p0 F +SYN mod/utm/pm_numeric 3 OK -0x1.31370ad0851adp20 0x1.ccf12a217141bp20 0x0.0p0 -0x1.66d29002e901dp3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/pm_numeric 4 OK 0x1.09d40c5eba928p20 0x1.bfb348fefdd35p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/pm_paris 0 OK -0x1.67ed991261dd8p17 0x1.4c50c45cdb325p11 0x0.0p0 0x1.4p3 0x1.6800000000002p5 0x0.0p0 F +SYN mod/utm/pm_paris 1 OK -0x1.194548256e40cp21 -0x1.5a7ff0bb14e5ep20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/pm_paris 2 OK 0x1.c0ac175b15cf7p20 -0x1.70a193316a355p20 0x0.0p0 0x1.f36948017481p4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/pm_paris 3 OK -0x1.3c1feb6df1671p20 0x1.d0fa7f03c3f0cp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/pm_paris 4 OK 0x1.fd85b49dbc7dap19 0x1.bc5840615592fp20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/rf 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/rf 1 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/rf 2 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/rf 3 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/rf 4 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN mod/utm/south 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/south 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/south 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/south 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/south 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/to_meter 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/to_meter 1 OK -0x1.9e89baee1a60cp22 -0x1.25dc2e522c2fbp22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/to_meter 2 OK 0x1.9e89baee1a60cp22 -0x1.25dc2e522c2fbp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/to_meter 3 OK -0x1.d477419c474a2p21 0x1.747176bc984ccp22 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/to_meter 4 OK 0x1.d477419c474ap21 0x1.747176bc984ccp22 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/towgs84_3 0 OK -0x1.cbc4923e52fa9p0 -0x1.2de50c34c4784p0 -0x1.88172efcp1 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/towgs84_3 1 OK -0x1.f967c81cd8f51p20 -0x1.664651e5a9d46p20 -0x1.019e8d02p1 -0x1.66d29002e901dp3 0x1.dfffffffffffep4 -0x1.8p-29 F +SYN mod/utm/towgs84_3 2 OK 0x1.f9678ea085fc6p20 -0x1.664651e72f13fp20 -0x1.91b172dp1 0x1.f36948017480ep4 0x1.dfffffffffffep4 -0x1.0p-29 F +SYN mod/utm/towgs84_3 3 OK -0x1.1d93ce2923d0ap20 0x1.c6152c762f171p20 -0x1.726e547ap1 -0x1.66d29002e9021p3 0x1.dfffffffffffep5 -0x1.0p-30 F +SYN mod/utm/towgs84_3 4 OK 0x1.1d9394b03bef2p20 0x1.c6152c75ee2fep20 -0x1.c59caedcp1 0x1.f36948017480ep4 0x1.e000000000001p5 -0x1.0p-29 F +SYN mod/utm/towgs84_7 0 OK -0x1.c9e9822abc58bp4 0x1.0311c237236dep7 -0x1.798fb1de2p5 0x1.3fffffdf13108p3 0x1.67fffffec9f4dp5 0x1.6d47dp-9 F +SYN mod/utm/towgs84_7 1 OK -0x1.f96d09a3b2d45p20 -0x1.6639845a99778p20 -0x1.70de8cb7cp5 -0x1.66d2901d2c126p3 0x1.dffffff86f8bdp4 0x1.c5717cp-8 F +SYN mod/utm/towgs84_7 2 OK 0x1.f96247e3c67cdp20 -0x1.6642c548d73d5p20 -0x1.7c6485d96p5 0x1.f36947f9ecf87p4 0x1.dffffff967943p4 0x1.7d043p-10 F +SYN mod/utm/towgs84_7 3 OK -0x1.1d911d5fd7866p20 0x1.c6200761530cp20 -0x1.7752a167ep5 -0x1.66d29039720bbp3 0x1.dfffffff6d0bfp5 0x1.3e755p-8 F +SYN mod/utm/towgs84_7 4 OK 0x1.1d9641eddb552p20 0x1.c61aa37896c4cp20 -0x1.7f094906p5 0x1.f36947f471b8ep4 0x1.e00000033900bp5 0x1.7b1c9p-10 F +SYN mod/utm/towgs84_zero 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/towgs84_zero 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/towgs84_zero 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/towgs84_zero 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/towgs84_zero 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/units_km 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/units_km 1 OK -0x1.02c468fb933ap11 -0x1.6edf6f5993bcep10 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/units_km 2 OK 0x1.02c468fb933ap11 -0x1.6edf6f5993bcep10 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/units_km 3 OK -0x1.246e3d39f0c73p10 0x1.d0fb12f3b4503p10 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/units_km 4 OK 0x1.246e3d39f0c72p10 0x1.d0fb12f3b4503p10 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/units_us_ft 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/units_us_ft 1 OK -0x1.9e89849883ffep22 -0x1.25dc07cddd4e2p22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/units_us_ft 2 OK 0x1.9e89849883ffep22 -0x1.25dc07cddd4e2p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/units_us_ft 3 OK -0x1.d47704352c532p21 0x1.747145eb796b3p22 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/units_us_ft 4 OK 0x1.d47704352c531p21 0x1.747145eb796b3p22 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/unknown_keyword 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/unknown_keyword 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/unknown_keyword 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/unknown_keyword 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/unknown_keyword 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vto_meter 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vto_meter 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vto_meter 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vto_meter 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vto_meter 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vunits_m 0 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vunits_m 1 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vunits_m 2 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vunits_m 3 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/vunits_m 4 EXC:org.locationtech.proj4j.UnsupportedParameterException NaN NaN NaN NaN NaN NaN - +SYN mod/utm/x_0_y_0 0 OK 0x1.e848p18 0x1.e848p19 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/x_0_y_0 1 OK -0x1.7f559d0b5b8d5p20 -0x1.c888caf5e919cp18 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/x_0_y_0 2 OK 0x1.39bcce85adc6ap21 -0x1.c888caf5e919cp18 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp4 0x0.0p0 F +SYN mod/utm/x_0_y_0 3 OK -0x1.47034f952a452p19 0x1.5d1c9840ff0b2p21 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/x_0_y_0 4 OK 0x1.97a5a7ca95228p20 0x1.5d1c9840ff0b2p21 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN mod/utm/zone 0 OK 0x1.00c3a43cd6cc7p20 0x1.3197e3ddf0a36p22 0x0.0p0 0x1.4000000000001p3 0x1.68p5 0x0.0p0 F +SYN mod/utm/zone 1 OK -0x1.aca823c6f50c4p19 0x1.9fb1920700c9cp21 0x0.0p0 -0x1.66d29002e901dp3 0x1.e000000000001p4 0x0.0p0 F +SYN mod/utm/zone 2 OK 0x1.8fd7ece1b18fbp21 0x1.c119c4781ee0ap21 0x0.0p0 0x1.f36948017481p4 0x1.e000000000001p4 0x0.0p0 F +SYN mod/utm/zone 3 OK -0x1.19e3aa94806c6p18 0x1.9b2e3aa411d31p22 0x0.0p0 -0x1.66d29002e901ap3 0x1.dfffffffffffep5 0x0.0p0 F +SYN mod/utm/zone 4 OK 0x1.f20a717dd08b8p20 0x1.aaa2ab339fd74p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/adams_hemi 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_hemi 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_hemi 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_hemi 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_hemi 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws1 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws1 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws1 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws1 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws1 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws2 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws2 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws2 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws2 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/adams_ws2 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/aea 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/aea 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN proj/aea 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN proj/aea 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN proj/aea 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN proj/aeqd 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 T +SYN proj/aeqd 1 OK -0x1.f506922f0967ep20 -0x1.59f01508a3b09p20 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp4 0x0.0p0 T +SYN proj/aeqd 2 OK 0x1.f506922f0967ep20 -0x1.59f01508a3b09p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp4 0x0.0p0 T +SYN proj/aeqd 3 OK -0x1.200416c1cbcf8p20 0x1.c0fd9f0a03bf6p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dfffffffffffep5 0x0.0p0 T +SYN proj/aeqd 4 OK 0x1.200416c1cbcf7p20 0x1.c0fd9f0a03bf6p20 0x0.0p0 0x1.f36948017480dp4 0x1.dfffffffffffep5 0x0.0p0 T +SYN proj/affine 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/affine 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/affine 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/affine 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/affine 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/airocean 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/airocean 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/airocean 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/airocean 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/airocean 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/airy 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN proj/airy 1 OK -0x1.a875b77ae08a7p20 -0x1.265fc9faca791p20 0x0.0p0 -0x1.678d43128777dp2 -0x1.5a9b9d9571ecap3 0x0.0p0 F +SYN proj/airy 2 OK 0x1.a875b77ae08a6p20 -0x1.265fc9faca791p20 0x0.0p0 0x1.99e350c4a1ddep4 -0x1.5a9b9d9571ecap3 0x0.0p0 F +SYN proj/airy 3 OK -0x1.e6ffba7ab6887p19 0x1.7c965327b458p20 0x0.0p0 0x1.0a5a2ce9507c1p0 0x1.c01e57d38ee99p3 0x0.0p0 F +SYN proj/airy 4 OK 0x1.e6ffba7ab6886p19 0x1.7c965327b458p20 0x0.0p0 0x1.2f5a5d316af83p4 0x1.c01e57d38ee99p3 0x0.0p0 F +SYN proj/aitoff 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/aitoff 1 OK -0x1.054f897e4c2fbp21 0x1.99d2acc26a1e1p21 0x0.0p0 -0x1.275aefd4bb28ep3 0x1.e28ab6f866dd2p4 0x0.0p0 F +SYN proj/aitoff 2 OK 0x1.054f897e4c2fap21 0x1.99d2acc26a1e1p21 0x0.0p0 0x1.d3ad77ea5d946p4 0x1.e28ab6f866dd2p4 0x0.0p0 F +SYN proj/aitoff 3 OK -0x1.5be02ca8cbf28p20 0x1.99307fc5b828ap22 0x0.0p0 -0x1.666923e505962p1 0x1.e1cbc3378ac51p5 0x0.0p0 F +SYN proj/aitoff 4 OK 0x1.5be02ca8cbf28p20 0x1.99307fc5b828ap22 0x0.0p0 0x1.6ccd247ca0b2cp4 0x1.e1cbc3378ac51p5 0x0.0p0 F +SYN proj/alsk 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/alsk 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/alsk 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/alsk 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/alsk 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/apian 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/apian 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/apian 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/apian 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/apian 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/august 0 OK 0x0.0p0 0x1.4c5ef13766b78p22 0x0.0p0 0x1.4p3 0x1.8758c0c7e6851p5 0x0.0p0 F +SYN proj/august 1 OK -0x1.17120acc5d01ep21 0x1.ad7441b67335ap21 0x0.0p0 -0x1.512d68b61aa66p3 0x1.f9a808eca40f4p4 0x0.0p0 F +SYN proj/august 2 OK 0x1.17120acc5d01cp21 0x1.ad7441b67335ap21 0x0.0p0 0x1.e896b45b0d53p4 0x1.f9a808eca40f4p4 0x0.0p0 F +SYN proj/august 3 OK -0x1.d33e3b6223d11p20 0x1.e52a77198e63ep22 0x0.0p0 -0x1.cc4d1def00eb5p2 0x1.1da076a6db856p6 0x0.0p0 F +SYN proj/august 4 OK 0x1.d33e3b6223d0fp20 0x1.e52a77198e63ep22 0x0.0p0 0x1.b313477bc03adp4 0x1.1da076a6db856p6 0x0.0p0 F +SYN proj/axisswap 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/axisswap 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/axisswap 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/axisswap 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/axisswap 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bacon 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bacon 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bacon 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bacon 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bacon 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bertin1953 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bertin1953 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bertin1953 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bertin1953 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bertin1953 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/bipc 0 OK 0x1.5cc39635dbf14p21 -0x1.198be733a5b1ap23 0x0.0p0 0x1.05fb00e7ffb92p4 -0x1.4ac7165e100ddp4 0x0.0p0 F +SYN proj/bipc 1 OK -0x1.019e9a91de4e7p21 -0x1.4f6864d59f4e5p22 0x0.0p0 -0x1.04e6eeaeddeedp7 -0x1.cd4bb72f51ddbp-1 0x0.0p0 F +SYN proj/bipc 2 OK 0x1.1693a8e49926cp22 -0x1.5cfc66261b784p23 0x0.0p0 0x1.105dbf87ec0acp5 -0x1.2c2cce79434e5p5 0x0.0p0 F +SYN proj/bipc 3 OK 0x1.731afde80b354p21 -0x1.7cdcc56b68a73p22 0x0.0p0 0x1.157ddbaab384ap4 0x1.b16f977823423p2 0x0.0p0 F +SYN proj/bipc 4 OK 0x1.3718189f2d693p22 -0x1.e7edc0d7944fbp22 0x0.0p0 0x1.24edd52ef624cp5 -0x1.20fec48b809aap3 0x0.0p0 F +SYN proj/boggs 0 OK 0x0.0p0 0x1.3b68d709ab575p22 0x0.0p0 0x1.4p3 0x1.73603061ddce2p5 0x0.0p0 F +SYN proj/boggs 1 OK -0x1.e76a27a74e564p20 0x1.a9a5a492793e4p21 0x0.0p0 -0x1.fbcd88a653732p2 0x1.f52c7c595ce66p4 0x0.0p0 F +SYN proj/boggs 2 OK 0x1.e76a27a74e563p20 0x1.a9a5a492793e4p21 0x0.0p0 0x1.bef3622994dccp4 0x1.f52c7c595ce66p4 0x0.0p0 F +SYN proj/boggs 3 OK -0x1.36b01155811c3p20 0x1.9d1f8a84f4596p22 0x0.0p0 -0x1.6e877588fbba3p0 0x1.e66d7e6f28b2ep5 0x0.0p0 F +SYN proj/boggs 4 OK 0x1.36b01155811c2p20 0x1.9d1f8a84f4596p22 0x0.0p0 0x1.56e877588fbbap4 0x1.e66d7e6f28b2ep5 0x0.0p0 F +SYN proj/bonne 0 OK 0x0.0p0 -0x1.3236f567ce3a7p22 0x0.0p0 -0x1.54p7 0x1.68p5 0x0.0p0 F +SYN proj/bonne 1 OK -0x1.ebecc0cd6d9c4p20 -0x1.84d7eba3cea15p22 0x0.0p0 -0x1.54p7 0x1.e000000000001p4 0x0.0p0 F +SYN proj/bonne 2 OK 0x1.ebecc0cd6d9c4p20 -0x1.84d7eba3cea15p22 0x0.0p0 -0x1.54p7 0x1.e000000000001p4 0x0.0p0 F +SYN proj/bonne 3 OK -0x1.1b0148b95d84bp20 -0x1.7f66384ea3176p21 0x0.0p0 -0x1.3a8d79f8941e5p7 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/bonne 4 OK 0x1.1b0148b95d84ap20 -0x1.7f66384ea3176p21 0x0.0p0 0x1.628d79f8941e4p7 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/calcofi 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/calcofi 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/calcofi 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/calcofi 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/calcofi 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cart 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cart 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cart 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cart 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cart 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cass 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/cass 1 OK -0x1.f0f63e0fd1096p20 -0x1.6656cf70ceafp20 0x0.0p0 -0x1.6721b2a8452a1p3 0x1.dff61528d8f2ap4 0x0.0p0 F +SYN proj/cass 2 OK 0x1.f0f63e0fd1096p20 -0x1.6656cf70ceafp20 0x0.0p0 0x1.f390d9542295p4 0x1.dff61528d8f2ap4 0x0.0p0 F +SYN proj/cass 3 OK -0x1.1c144b1e7a0dbp20 0x1.c619290123dfcp20 0x0.0p0 -0x1.672f915dce974p3 0x1.e0061c32866ep5 0x0.0p0 F +SYN proj/cass 4 OK 0x1.1c144b1e7a0dap20 0x1.c619290123df9p20 0x0.0p0 0x1.f397c8aee74b8p4 0x1.e0061c32866ep5 0x0.0p0 F +SYN proj/cc 0 OK 0x0.0p0 0x1.854a63fffffffp22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/cc 1 OK -0x1.204318094ebd6p21 0x1.c18398e939085p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/cc 2 OK 0x1.204318094ebd5p21 0x1.c18398e939085p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/cc 3 OK -0x1.204318094ebd6p21 0x1.5122b2aeeac62p23 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/cc 4 OK 0x1.204318094ebd5p21 0x1.5122b2aeeac62p23 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/ccon 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ccon 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ccon 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ccon 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ccon 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/cea 0 OK 0x0.0p0 0x1.120a0b8c222e6p22 0x0.0p0 0x1.4p3 0x1.6800000034e0ep5 0x0.0p0 F +SYN proj/cea 1 OK -0x1.204318094ebd6p21 0x1.831dda8600d79p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffccdd0cp4 0x0.0p0 F +SYN proj/cea 2 OK 0x1.204318094ebd5p21 0x1.831dda8600d79p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffccdd0cp4 0x0.0p0 F +SYN proj/cea 3 OK -0x1.204318094ebd6p21 0x1.50012e99f5063p22 0x0.0p0 -0x1.66d29002e902p3 0x1.dfffffffcea3bp5 0x0.0p0 F +SYN proj/cea 4 OK 0x1.204318094ebd5p21 0x1.50012e99f5063p22 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffcea3bp5 0x0.0p0 F +SYN proj/chamb 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/chamb 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/chamb 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/chamb 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/chamb 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/col_urban 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/col_urban 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/col_urban 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/col_urban 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/col_urban 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/collg 0 OK 0x0.0p0 0x1.3c9312fd8f718p22 0x0.0p0 0x1.4p3 -0x1.f021cd4c16fe5p4 0x0.0p0 F +SYN proj/collg 1 OK -0x1.cbffeea1f6f57p20 0x1.943141b92d02cp21 0x0.0p0 -0x1.adc3d00733decp0 -0x1.441d26d59dfdp5 0x0.0p0 F +SYN proj/collg 2 OK 0x1.cbffeea1f6f56p20 0x1.943141b92d02cp21 0x0.0p0 0x1.5adc3d00733dep4 -0x1.441d26d59dfdp5 0x0.0p0 F +SYN proj/collg 3 OK -0x1.dc3a0d8263201p19 0x1.b571354a0d70ap22 0x0.0p0 0x1.ab1c72ee31659p1 -0x1.4f8c20a821e51p4 0x0.0p0 F +SYN proj/collg 4 OK 0x1.dc3a0d8263201p19 0x1.b571354a0d70ap22 0x0.0p0 0x1.0a9c71a239d35p4 -0x1.4f8c20a821e51p4 0x0.0p0 F +SYN proj/comill 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/comill 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/comill 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/comill 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/comill 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/crast 0 OK 0x0.0p0 0x1.3551800576c2ep22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/crast 1 OK -0x1.ef6e1aa8eb5d2p20 0x1.9f0f11bdd37fdp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/crast 2 OK 0x1.ef6e1aa8eb5d1p20 0x1.9f0f11bdd37fdp21 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/crast 3 OK -0x1.2bc4fbeee0637p20 0x1.98c0d0e8679cep22 0x0.0p0 -0x1.66d29002e9019p3 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/crast 4 OK 0x1.2bc4fbeee0636p20 0x1.98c0d0e8679cep22 0x0.0p0 0x1.f36948017480bp4 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/defmodel 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/defmodel 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/defmodel 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/defmodel 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/defmodel 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/deformation 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/deformation 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/deformation 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/deformation 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/deformation 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/denoy 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/denoy 1 OK -0x1.058177b5a4386p21 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.27d084694ebd2p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/denoy 2 OK 0x1.058177b5a4385p21 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.d3e84234a75e7p4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/denoy 3 OK -0x1.65e22e7c747c2p20 0x1.97aa05ca56b6ep22 0x0.0p0 -0x1.958b93b561a3p1 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/denoy 4 OK 0x1.65e22e7c747c1p20 0x1.97aa05ca56b6ep22 0x0.0p0 0x1.72b17276ac345p4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck1 0 OK 0x0.0p0 0x1.19b0efbd6217bp22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/eck1 1 OK -0x1.baa28c2c6bb79p20 0x1.779694fc82ca3p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eck1 2 OK 0x1.baa28c2c6bb77p20 0x1.779694fc82ca3p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eck1 3 OK -0x1.621ba356bc92dp20 0x1.779694fc82ca3p22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck1 4 OK 0x1.621ba356bc92cp20 0x1.779694fc82ca3p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck2 0 OK 0x0.0p0 0x1.6290a564b888ap22 0x0.0p0 0x1.4p3 0x1.67ffffffffffdp5 0x0.0p0 F +SYN proj/eck2 1 OK -0x1.a3eb9e626f5cp20 0x1.d7f53c5b2c3cap21 0x0.0p0 -0x1.66d29002e902p3 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/eck2 2 OK 0x1.a3eb9e626f5bfp20 0x1.d7f53c5b2c3cap21 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/eck2 3 OK -0x1.3a7499d288dafp20 0x1.cbb42f032fb97p22 0x0.0p0 -0x1.66d29002e901ap3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck2 4 OK 0x1.3a7499d288dafp20 0x1.cbb42f032fb97p22 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck3 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eck3 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eck3 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eck3 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eck3 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eck4 0 OK 0x0.0p0 0x1.5317faf735787p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff9p5 0x0.0p0 F +SYN proj/eck4 1 OK -0x1.cc461f9266de7p20 0x1.d555024904b1bp21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffdcp4 0x0.0p0 F +SYN proj/eck4 2 OK 0x1.cc461f9266de6p20 0x1.d555024904b1bp21 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffdcp4 0x0.0p0 F +SYN proj/eck4 3 OK -0x1.7c522c4c39f3bp20 0x1.ab028543c3a35p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffcp5 0x0.0p0 F +SYN proj/eck4 4 OK 0x1.7c522c4c39f3ap20 0x1.ab028543c3a35p22 0x0.0p0 0x1.f36948017480dp4 0x1.dfffffffffffcp5 0x0.0p0 F +SYN proj/eck5 0 OK 0x0.0p0 0x1.0dad7a2f77552p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/eck5 1 OK -0x1.da72059ecfaaep20 0x1.6791f83f49c6cp21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eck5 2 OK 0x1.da72059ecfaacp20 0x1.6791f83f49c6cp21 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eck5 3 OK -0x1.7d61bc97c7bedp20 0x1.6791f83f49c6cp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck5 4 OK 0x1.7d61bc97c7bebp20 0x1.6791f83f49c6cp22 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck6 0 OK 0x0.0p0 0x1.521d9057323e3p22 0x0.0p0 0x1.4p3 0x1.67fffffffffffp5 0x0.0p0 F +SYN proj/eck6 1 OK -0x1.c609bea9078ap20 0x1.c9f5449231e8p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/eck6 2 OK 0x1.c609bea90789fp20 0x1.c9f5449231e8p21 0x0.0p0 0x1.f36948017480dp4 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/eck6 3 OK -0x1.4958b27e124d4p20 0x1.b469025679b17p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eck6 4 OK 0x1.4958b27e124d4p20 0x1.b469025679b17p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eqc 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/eqc 1 OK -0x1.204318094ebd6p21 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eqc 2 OK 0x1.204318094ebd5p21 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eqc 3 OK -0x1.204318094ebd6p21 0x1.97aa05ca56b6ep22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eqc 4 OK 0x1.204318094ebd5p21 0x1.97aa05ca56b6ep22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eqdc 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/eqdc 1 OK -0x1.204318094ebd6p21 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eqdc 2 OK 0x1.204318094ebd5p21 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/eqdc 3 OK -0x1.204318094ebd6p21 0x1.97aa05ca56b6ep22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eqdc 4 OK 0x1.204318094ebd5p21 0x1.97aa05ca56b6ep22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/eqearth 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eqearth 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eqearth 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eqearth 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/eqearth 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/etmerc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/etmerc 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/etmerc 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/etmerc 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/etmerc 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/euler 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/euler 1 OK -0x1.f498d8c40ac53p20 -0x1.56849f39560fdp20 0x0.0p0 -0x1.4fda4cf5fa053p7 0x1.e000000000001p4 0x0.0p0 F +SYN proj/euler 2 OK 0x1.f498d8c40ac53p20 -0x1.56849f39560fdp20 0x0.0p0 -0x1.5825b30a05faep7 0x1.e000000000001p4 0x0.0p0 F +SYN proj/euler 3 OK -0x1.23ec334c8544ap20 0x1.bda76e7da858cp20 0x0.0p0 -0x1.2c3e7874b8735p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/euler 4 OK 0x1.23ec334c8544ap20 0x1.bda76e7da858cp20 0x0.0p0 0x1.cc3e7874b8735p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/fahey 0 OK 0x0.0p0 0x1.2556559cc4e6bp22 0x0.0p0 0x1.4p3 0x1.8c38e8aee0467p4 0x0.0p0 F +SYN proj/fahey 1 OK -0x1.c6fde580b550cp20 0x1.7b830893a82e3p21 0x0.0p0 -0x1.345e2a0c6a60cp4 0x1.5d759554ceb1fp5 0x0.0p0 F +SYN proj/fahey 2 OK 0x1.c6fde580b550bp20 0x1.7b830893a82e3p21 0x0.0p0 0x1.3a2f150635306p5 0x1.5d759554ceb1fp5 0x0.0p0 F +SYN proj/fahey 3 OK -0x1.8199746dc640ap20 0x1.98de0062267dep22 0x0.0p0 -0x1.b9a62fee3f5ffp2 -0x1.7a13dc771d7ecp2 0x0.0p0 F +SYN proj/fahey 4 OK 0x1.8199746dc6409p20 0x1.98de0062267dep22 0x0.0p0 0x1.ae698bfb8fd7fp4 -0x1.7a13dc771d7ecp2 0x0.0p0 F +SYN proj/fouc 0 OK 0x0.0p0 0x1.427fb6c8dad5dp22 0x0.0p0 0x1.4p3 0x1.67fffffffffffp5 0x0.0p0 F +SYN proj/fouc 1 OK -0x1.d1d6bf1457ea9p20 0x1.a13d8a88a9ce1p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/fouc 2 OK 0x1.d1d6bf1457ea9p20 0x1.a13d8a88a9ce1p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/fouc 3 OK -0x1.b064a40df61c3p19 0x1.c18398e939085p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/fouc 4 OK 0x1.b064a40df61c2p19 0x1.c18398e939085p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/fouc_s 0 OK 0x0.0p0 0x1.13451fb236b57p22 0x0.0p0 0x1.4p3 0x1.67fffffffffffp5 0x0.0p0 F +SYN proj/fouc_s 1 OK -0x1.204318094ebd6p21 0x1.854a63fffffffp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/fouc_s 2 OK 0x1.204318094ebd6p21 0x1.854a63fffffffp21 0x0.0p0 0x1.f36948017481p4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/fouc_s 3 OK -0x1.204318094ebd6p21 0x1.5122b2aeeac63p22 0x0.0p0 -0x1.66d29002e902p3 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/fouc_s 4 OK 0x1.204318094ebd5p21 0x1.5122b2aeeac63p22 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/gall 0 OK 0x0.0p0 0x1.13451fb236b57p22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/gall 1 OK -0x1.97aa05ca56b6ep20 0x1.64230f69ca808p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/gall 2 OK 0x1.97aa05ca56b6cp20 0x1.64230f69ca808p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/gall 3 OK -0x1.97aa05ca56b6ep20 0x1.7faf2a8fd80e3p22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/gall 4 OK 0x1.97aa05ca56b6cp20 0x1.7faf2a8fd80e3p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/geoc 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geoc 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geoc 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geoc 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geoc 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geocent 0 OK 0x1.0f8afa1700dc5p22 0x1.7f0aed8dd4a43p19 0x1.11e2d1a2909e4p22 0x1.3ffffffffffffp3 0x1.68p5 -0x1.0p-30 F +SYN proj/geocent 1 OK 0x1.4afa110bca51bp22 -0x1.06753005b48abp20 0x1.83022de1e0d0ap21 -0x1.66d29002e901fp3 0x1.dfffffffffffep4 0x1.0p-30 F +SYN proj/geocent 2 OK 0x1.2093345605addp22 0x1.5db75ef4b8ca2p21 0x1.83022de1e0d0ap21 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x1.0p-30 F +SYN proj/geocent 3 OK 0x1.7ed24853fb5dep21 -0x1.2f91c7a70b6c5p19 0x1.4fb8f48909758p22 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x1.0p-30 F +SYN proj/geocent 4 OK 0x1.4dc71a288341p21 0x1.947f0acc9b704p20 0x1.4fb8f48909758p22 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x1.0p-29 F +SYN proj/geogoffset 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geogoffset 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geogoffset 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geogoffset 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geogoffset 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/geos 0 OK 0x0.0p0 0x1.0320a3c9fbe65p22 0x0.0p0 0x1.4p3 0x1.67fffffffffeap5 0x0.0p0 F +SYN proj/geos 1 OK -0x1.d7bf879eb4e1p20 0x1.74c074b5627d5p21 0x0.0p0 -0x1.66d29002e9052p3 0x1.e00000000001ep4 0x0.0p0 F +SYN proj/geos 2 OK 0x1.d7bf879eb4e0ep20 0x1.74c074b5627d5p21 0x0.0p0 0x1.f369480174827p4 0x1.e00000000001ep4 0x0.0p0 F +SYN proj/geos 3 OK -0x1.01ddc38717602p20 0x1.307d6c56f593ep22 0x0.0p0 -0x1.66d29002e909bp3 0x1.e000000000023p5 0x0.0p0 F +SYN proj/geos 4 OK 0x1.01ddc38717602p20 0x1.307d6c56f593ep22 0x0.0p0 0x1.f36948017484dp4 0x1.e000000000023p5 0x0.0p0 F +SYN proj/gins8 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gins8 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gins8 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gins8 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gins8 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gn_sinu 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gn_sinu 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gn_sinu 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gn_sinu 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gn_sinu 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gnom 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 T +SYN proj/gnom 1 OK -0x1.07ec065914dcbp21 -0x1.6e12e4f4a5f8fp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffep4 0x0.0p0 T +SYN proj/gnom 2 OK 0x1.07ec065914dcap21 -0x1.6e12e4f4a5f8fp20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x0.0p0 T +SYN proj/gnom 3 OK -0x1.2b13b8404e55dp20 0x1.d37451a8cd348p20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 T +SYN proj/gnom 4 OK 0x1.2b13b8404e55cp20 0x1.d37451a8cd348p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 T +SYN proj/goode 0 OK 0x0.0p0 0x1.31635d1c9d69fp22 0x0.0p0 0x1.4p3 0x1.6800000000002p5 0x0.0p0 F +SYN proj/goode 1 OK -0x1.f348da1ab9b8fp20 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/goode 2 OK 0x1.f348da1ab9b8fp20 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/goode 3 OK -0x1.4fe43dc227d34p20 0x1.8f2b65705cbf5p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/goode 4 OK 0x1.4fe43dc227d34p20 0x1.8f2b65705cbf5p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/gridshift 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gridshift 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gridshift 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gridshift 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gridshift 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs48 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs48 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs48 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs48 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs48 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs50 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs50 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs50 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs50 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gs50 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gstmerc 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gstmerc 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gstmerc 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gstmerc 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/gstmerc 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/guyou 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/guyou 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/guyou 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/guyou 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/guyou 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/hammer 0 OK 0x0.0p0 0x1.29f33adfc0f7ep22 0x0.0p0 0x1.4p3 0x1.5ed17e02d24d3p5 0x0.0p0 F +SYN proj/hammer 1 OK -0x1.020002e085d2fp21 0x1.94a17837c97e4p21 0x0.0p0 -0x1.1f8f1d918043p3 0x1.dc6da7d2ff0edp4 0x0.0p0 F +SYN proj/hammer 2 OK 0x1.020002e085d2ep21 0x1.94a17837c97e4p21 0x0.0p0 0x1.cfc78ec8c0218p4 0x1.dc6da7d2ff0edp4 0x0.0p0 F +SYN proj/hammer 3 OK -0x1.4be7ae30f1bdfp20 0x1.8667666902944p22 0x0.0p0 -0x1.1b3151586bc6bp1 0x1.cbad567ee5d54p5 0x0.0p0 F +SYN proj/hammer 4 OK 0x1.4be7ae30f1bdfp20 0x1.8667666902944p22 0x0.0p0 0x1.63662a2b0d78ep4 0x1.cbad567ee5d54p5 0x0.0p0 F +SYN proj/hatano 0 OK 0x0.0p0 0x1.5226c2bedb6a3p22 0x0.0p0 0x1.4p3 0x1.67ffffffffffep5 0x0.0p0 F +SYN proj/hatano 1 OK -0x1.cca1b6bda2e02p20 0x1.d3392dcd6b1dbp21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dfffffffffffcp4 0x0.0p0 F +SYN proj/hatano 2 OK 0x1.cca1b6bda2e02p20 0x1.d3392dcd6b1dbp21 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffcp4 0x0.0p0 F +SYN proj/hatano 3 OK -0x1.7f9e07a7e1ccp20 0x1.a9fe336e1e55p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/hatano 4 OK 0x1.7f9e07a7e1ccp20 0x1.a9fe336e1e55p22 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/healpix 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/healpix 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/healpix 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/healpix 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/healpix 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/helmert 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/helmert 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/helmert 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/helmert 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/helmert 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/hgridshift 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/hgridshift 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/hgridshift 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/hgridshift 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/hgridshift 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/horner 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/horner 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/horner 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/horner 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/horner 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/id 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/id 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/id 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/id 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/id 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh_o 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh_o 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh_o 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh_o 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/igh_o 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll_o 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll_o 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll_o 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll_o 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imoll_o 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imw_p 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imw_p 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imw_p 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imw_p 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/imw_p 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/isea 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/isea 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/isea 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/isea 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/isea 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/kav5 0 OK 0x0.0p0 0x1.40ff95da98115p22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/kav5 1 OK -0x1.e529357545e58p20 0x1.b9c311e2ea338p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/kav5 2 OK 0x1.e529357545e57p20 0x1.b9c311e2ea338p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/kav5 3 OK -0x1.6a7f7e5ad784p20 0x1.9928ccfea5f82p22 0x0.0p0 -0x1.66d29002e902p3 0x1.e000000000001p5 0x0.0p0 F +SYN proj/kav5 4 OK 0x1.6a7f7e5ad783fp20 0x1.9928ccfea5f82p22 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p5 0x0.0p0 F +SYN proj/kav7 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/kav7 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/kav7 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/kav7 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/kav7 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/krovak 0 OK 0x0.0p0 -0x1.957282e68f3a4p20 0x0.0p0 0x1.4p3 0x1.6800000000005p5 0x0.0p0 F +SYN proj/krovak 1 OK -0x1.01f19eb04cb9cp21 -0x1.77b193c87130cp21 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p4 0x0.0p0 F +SYN proj/krovak 2 OK 0x1.01f19eb04cb9cp21 -0x1.77b193c87130cp21 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p4 0x0.0p0 F +SYN proj/krovak 3 OK -0x1.1ea2061464ac5p20 -0x1.e937369135437p17 0x0.0p0 -0x1.21c97a2bab6d3p3 0x1.c2bdcea3c9917p5 0x0.0p0 F +SYN proj/krovak 4 OK 0x1.1ea2061464ac4p20 -0x1.e937369135453p17 0x0.0p0 0x1.d0e4bd15d5b69p4 0x1.c2bdcea3c9917p5 0x0.0p0 F +SYN proj/labrd 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/labrd 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/labrd 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/labrd 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/labrd 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/laea 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/laea 1 OK -0x1.f1bac7ad816a4p20 -0x1.580781da2dfc7p20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffccdd0cp4 0x0.0p0 F +SYN proj/laea 2 OK 0x1.f1bac7ad816a3p20 -0x1.580781da2dfc7p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffccdd0cp4 0x0.0p0 F +SYN proj/laea 3 OK -0x1.1eb7477425bc2p20 0x1.bea10ec3c798ep20 0x0.0p0 -0x1.66d29002e9023p3 0x1.dfffffffcea3ep5 0x0.0p0 F +SYN proj/laea 4 OK 0x1.1eb7477425bc1p20 0x1.bea10ec3c798ep20 0x0.0p0 0x1.f36948017481p4 0x1.dfffffffcea3ep5 0x0.0p0 F +SYN proj/lagrng 0 OK 0x0.0p0 0x1.6f9f7eeee53bdp20 0x0.0p0 0x1.4p3 0x1.b0da9f2788118p3 0x0.0p0 F +SYN proj/lagrng 1 OK -0x1.9e384d4c53a71p20 -0x1.292207b11e8e1p-30 0x0.0p0 -0x1.4f702551f1f1bp2 -0x1.5ddb2c01eed44p-47 0x0.0p0 F +SYN proj/lagrng 2 OK 0x1.9e384d4c53a71p20 -0x1.292207b11e8e1p-30 0x0.0p0 0x1.93dc09547c7c7p4 -0x1.5ddb2c01eed44p-47 0x0.0p0 F +SYN proj/lagrng 3 OK -0x1.80186847ac5d1p20 0x1.a75cb9584ccd7p21 0x0.0p0 -0x1.087f8ff70e202p2 0x1.f27bc76c030f1p4 0x0.0p0 F +SYN proj/lagrng 4 OK 0x1.80186847ac5d1p20 0x1.a75cb9584ccd7p21 0x0.0p0 0x1.821fe3fdc388p4 0x1.f27bc76c030f1p4 0x0.0p0 F +SYN proj/larr 0 OK 0x0.0p0 0x1.4af07abe57e81p22 0x0.0p0 0x1.4p3 0x1.85a943e2c479p5 0x0.0p0 F +SYN proj/larr 1 OK -0x1.1642955b344c5p21 0x1.a6d98ae94975fp21 0x0.0p0 -0x1.4f44de5e67a5ep3 0x1.f1e15220ae3a4p4 0x0.0p0 F +SYN proj/larr 2 OK 0x1.1642955b344c4p21 0x1.a6d98ae94975fp21 0x0.0p0 0x1.e7a26f2f33d2ep4 0x1.f1e15220ae3a4p4 0x0.0p0 F +SYN proj/larr 3 OK -0x1.ec181aee7a18cp20 0x1.d7a0ad266b565p22 0x0.0p0 -0x1.036948017480fp3 0x1.15a815a7e0943p6 0x0.0p0 F +SYN proj/larr 4 OK 0x1.ec181aee7a18bp20 0x1.d7a0ad266b565p22 0x0.0p0 0x1.c1b4a400ba406p4 0x1.15a815a7e0943p6 0x0.0p0 F +SYN proj/lask 0 OK 0x0.0p0 0x1.400c91cb4d479p22 0x0.0p0 0x1.4p3 0x1.78d6ab4431d6ap5 0x0.0p0 F +SYN proj/lask 1 OK -0x1.0e73c2dfb0c64p21 0x1.a6f0a53e5910fp21 0x0.0p0 -0x1.3ce1e20aa7981p3 0x1.f1fc85e5dde88p4 0x0.0p0 F +SYN proj/lask 2 OK 0x1.0e73c2dfb0c63p21 0x1.a6f0a53e5910fp21 0x0.0p0 0x1.de70f10553cbep4 0x1.f1fc85e5dde88p4 0x0.0p0 F +SYN proj/lask 3 OK -0x1.bfeabc8489d24p20 0x1.b08d51ed056eap22 0x0.0p0 -0x1.9eca5c46825aap2 0x1.fd4dd1b717034p5 0x0.0p0 F +SYN proj/lask 4 OK 0x1.bfeabc8489d22p20 0x1.b08d51ed056eap22 0x0.0p0 0x1.a7b29711a096ap4 0x1.fd4dd1b717034p5 0x0.0p0 F +SYN proj/latlon 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/latlon 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/latlon 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/latlon 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/latlon 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/latlong 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/latlong 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/latlong 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/latlong 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/latlong 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/lcc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN proj/lcc 1 OK -0x1.ede04849e06aep20 -0x1.4b9c101f114d8p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff6bp4 0x0.0p0 F +SYN proj/lcc 2 OK 0x1.ede04849e06abp20 -0x1.4b9c101f114d8p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff6bp4 0x0.0p0 F +SYN proj/lcc 3 OK -0x1.1d9e6411c7e74p20 0x1.b3dff9358d45ap20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 F +SYN proj/lcc 4 OK 0x1.1d9e6411c7e73p20 0x1.b3dff9358d45ap20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN proj/lcca 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lcca 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lcca 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lcca 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lcca 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/leac 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/leac 1 OK -0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.e000000000001p4 0x0.0p0 F +SYN proj/leac 2 OK 0x1.ee64139236084p20 -0x1.602455ccae63p20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p4 0x0.0p0 F +SYN proj/leac 3 OK -0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 -0x1.66d29002e901ap3 0x1.e000000000001p5 0x0.0p0 F +SYN proj/leac 4 OK 0x1.1dea9c30e010bp20 0x1.c65ca9707a7fbp20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p5 0x0.0p0 F +SYN proj/lee_os 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lee_os 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lee_os 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lee_os 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/lee_os 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/longlat 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/longlat 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/longlat 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/longlat 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/longlat 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/lonlat 0 OK 0x0.0p0 0x1.68p5 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/lonlat 1 OK -0x1.536948017480fp4 0x1.dffffffffffffp4 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/lonlat 2 OK 0x1.536948017480ep4 0x1.dffffffffffffp4 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/lonlat 3 OK -0x1.536948017480fp4 0x1.dffffffffffffp5 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/lonlat 4 OK 0x1.536948017480ep4 0x1.dffffffffffffp5 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/loxim 0 OK 0x0.0p0 0x1.0fc6ae86e479fp19 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/loxim 1 OK -0x1.b9a4a4a9776ep20 -0x1.0fc6ae86e479fp20 0x0.0p0 -0x1.35767bd6a33c6p6 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/loxim 2 OK 0x1.b9a4a4a9776dfp20 -0x1.0fc6ae86e479fp20 0x0.0p0 0x1.85767bd6a33c4p6 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/loxim 3 OK -0x1.6b39ef82bc25bp20 0x1.0fc6ae86e479ep21 0x0.0p0 0x1.990abc3e275dbp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/loxim 4 OK 0x1.6b39ef82bc25bp20 0x1.0fc6ae86e479ep21 0x0.0p0 -0x1.642af0f89d76ap2 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/lsat 0 OK 0x1.7bbb218d92a2bp25 -0x1.7cf36cdeb106ep22 0x0.0p0 0x1.1184530ff399p7 -0x1.c08bf6974ba54p5 0x0.0p0 F +SYN proj/lsat 1 OK 0x1.59d646333b497p25 -0x1.a3ad5090855f8p22 0x0.0p0 0x1.1184530ff399p7 -0x1.ee24f8a8eccedp5 0x0.0p0 F +SYN proj/lsat 2 OK 0x1.d0fedb74f4af1p22 -0x1.1aa1ecc0cb33bp23 0x0.0p0 0x1.9324c641c47a7p4 -0x1.4cc86434d68efp6 0x0.0p0 F +SYN proj/lsat 3 OK 0x1.73350dbd79d43p25 -0x1.95e86aeca63f4p21 0x0.0p0 0x1.1184530ff399p7 -0x1.ddee9e0361a01p4 0x0.0p0 F +SYN proj/lsat 4 OK 0x1.1fa6194398b2fp23 -0x1.cb0b9a83f86bbp21 0x0.0p0 0x1.4b7227d47e556p5 -0x1.0e3fc66194aabp5 0x0.0p0 F +SYN proj/mbt_fps 0 OK 0x0.0p0 0x1.3211112ea91aap22 0x0.0p0 0x1.4p3 0x1.534f763be4a9bp5 0x0.0p0 F +SYN proj/mbt_fps 1 OK -0x1.e79e8f687072bp20 0x1.a5004facce2f7p21 0x0.0p0 -0x1.66d29002e902p3 0x1.c43c2bb8b647fp4 0x0.0p0 F +SYN proj/mbt_fps 2 OK 0x1.e79e8f687072ap20 0x1.a5004facce2f7p21 0x0.0p0 0x1.f36948017480ep4 0x1.c43c2bb8b647fp4 0x0.0p0 F +SYN proj/mbt_fps 3 OK -0x1.8b84b1f210114p20 0x1.8668f48d2b6bfp22 0x0.0p0 -0x1.66d29002e901cp3 0x1.c4e409364927ap5 0x0.0p0 F +SYN proj/mbt_fps 4 OK 0x1.8b84b1f210113p20 0x1.8668f48d2b6bfp22 0x0.0p0 0x1.f36948017480dp4 0x1.c4e409364927ap5 0x0.0p0 F +SYN proj/mbt_s 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbt_s 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbt_s 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbt_s 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbt_s 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbtfpp 0 OK 0x0.0p0 0x1.56bd3438789e5p22 0x0.0p0 0x1.4p3 0x1.7f6d4343f6143p5 0x0.0p0 F +SYN proj/mbtfpp 1 OK -0x1.d560ecd319089p20 0x1.cbe78a8e67836p21 0x0.0p0 -0x1.66d29002e901cp3 0x1.fa92f9d0f6047p4 0x0.0p0 F +SYN proj/mbtfpp 2 OK 0x1.d560ecd319088p20 0x1.cbe78a8e67836p21 0x0.0p0 0x1.f36948017480dp4 0x1.fa92f9d0f6047p4 0x0.0p0 F +SYN proj/mbtfpp 3 OK -0x1.1c01ab6954aabp20 0x1.c4eadfb241a8fp22 0x0.0p0 -0x1.66d29002e9019p3 0x1.058bad0e8e37fp6 0x0.0p0 F +SYN proj/mbtfpp 4 OK 0x1.1c01ab6954aaap20 0x1.c4eadfb241a8fp22 0x0.0p0 0x1.f36948017480bp4 0x1.058bad0e8e37fp6 0x0.0p0 F +SYN proj/mbtfpq 0 OK 0x0.0p0 0x1.174acf458fafep22 0x0.0p0 0x1.4p3 0x1.3d5f202991678p5 0x0.0p0 F +SYN proj/mbtfpq 1 OK -0x1.f728ea43a54aap20 0x1.79c91dc2a8051p21 0x0.0p0 -0x1.66d29002e902p3 0x1.a64487c9cf67ap4 0x0.0p0 F +SYN proj/mbtfpq 2 OK 0x1.f728ea43a54a8p20 0x1.79c91dc2a8051p21 0x0.0p0 0x1.f36948017480ep4 0x1.a64487c9cf67ap4 0x0.0p0 F +SYN proj/mbtfpq 3 OK -0x1.842624d769223p20 0x1.6ce9b25cc75dap22 0x0.0p0 -0x1.66d29002e901ep3 0x1.a931682af0ec7p5 0x0.0p0 F +SYN proj/mbtfpq 4 OK 0x1.842624d769222p20 0x1.6ce9b25cc75dap22 0x0.0p0 0x1.f36948017480ep4 0x1.a931682af0ec7p5 0x0.0p0 F +SYN proj/mbtfps 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbtfps 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbtfps 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbtfps 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mbtfps 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/merc 0 OK 0x0.0p0 0x1.5543ffac72717p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff4p5 0x0.0p0 F +SYN proj/merc 1 OK -0x1.204318094ebd6p21 0x1.a91268aeb3e0dp21 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff67p4 0x0.0p0 F +SYN proj/merc 2 OK 0x1.204318094ebd5p21 0x1.a91268aeb3e0dp21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff67p4 0x0.0p0 F +SYN proj/merc 3 OK -0x1.204318094ebd6p21 0x1.fe6b2a317a95fp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffff43p5 0x0.0p0 F +SYN proj/merc 4 OK 0x1.204318094ebd5p21 0x1.fe6b2a317a95fp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 F +SYN proj/mil_os 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mil_os 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mil_os 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mil_os 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mil_os 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mill 0 OK 0x0.0p0 0x1.481c82dc37777p22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/mill 1 OK -0x1.204318094ebd6p21 0x1.a4230117f96e9p21 0x0.0p0 -0x1.66d29002e902p3 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/mill 2 OK 0x1.204318094ebd5p21 0x1.a4230117f96e9p21 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/mill 3 OK -0x1.204318094ebd6p21 0x1.d1ea822ca723cp22 0x0.0p0 -0x1.66d29002e902p3 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/mill 4 OK 0x1.204318094ebd5p21 0x1.d1ea822ca723cp22 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/misrsom 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/misrsom 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/misrsom 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/misrsom 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/misrsom 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mod_krovak 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mod_krovak 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mod_krovak 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mod_krovak 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/mod_krovak 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/moll 0 OK 0x0.0p0 0x1.45f153a56bda2p22 0x0.0p0 0x1.4p3 0x1.6800000000002p5 0x0.0p0 F +SYN proj/moll 1 OK -0x1.dad0cf539286ap20 0x1.bcce6c833c372p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/moll 2 OK 0x1.dad0cf5392869p20 0x1.bcce6c833c372p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/moll 3 OK -0x1.4fe43dc227d34p20 0x1.a3b95bf92b2f8p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/moll 4 OK 0x1.4fe43dc227d34p20 0x1.a3b95bf92b2f8p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/molobadekas 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molobadekas 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molobadekas 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molobadekas 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molobadekas 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molodensky 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molodensky 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molodensky 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molodensky 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/molodensky 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/murd1 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/murd1 1 OK -0x1.f7f24c2375e7ep20 -0x1.55517ea7e51b6p20 0x0.0p0 -0x1.4b08d2d5f120ap7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/murd1 2 OK 0x1.f7f24c2375e7ep20 -0x1.55517ea7e51b6p20 0x0.0p0 -0x1.5cf72d2a0edf7p7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/murd1 3 OK -0x1.24ec8a120aec5p20 0x1.be3a737c235b1p20 0x0.0p0 -0x1.288ce3e3d4af8p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/murd1 4 OK 0x1.24ec8a120aec5p20 0x1.be3a737c235b1p20 0x0.0p0 0x1.c88ce3e3d4af8p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/murd2 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/murd2 1 OK -0x1.ef9e4a1ebe1bfp20 -0x1.611ff7fc7c6bap20 0x0.0p0 -0x1.54p7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/murd2 2 OK 0x1.ef9e4a1ebe1bfp20 -0x1.611ff7fc7c6bap20 0x0.0p0 -0x1.54p7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/murd2 3 OK -0x1.1b447049b1d44p20 0x1.c5e29bdb23de7p20 0x0.0p0 -0x1.20005c9e4f842p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/murd2 4 OK 0x1.1b447049b1d44p20 0x1.c5e29bdb23de7p20 0x0.0p0 0x1.c0005c9e4f842p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/murd3 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/murd3 1 OK -0x1.f90ebbb100c16p20 -0x1.546029777d64cp20 0x0.0p0 -0x1.468ede68b75ebp7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/murd3 2 OK 0x1.f90ebbb100c16p20 -0x1.546029777d64cp20 0x0.0p0 -0x1.6171219748a16p7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/murd3 3 OK -0x1.2398595814e91p20 0x1.be8360bdc6862p20 0x0.0p0 -0x1.229f48c3b5dd3p5 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/murd3 4 OK 0x1.2398595814e91p20 0x1.be8360bdc6862p20 0x0.0p0 0x1.c29f48c3b5dd3p5 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/name 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/name 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/name 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/name 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/name 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth2 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth2 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth2 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth2 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/natearth2 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nell 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.822262bd963eep5 0x0.0p0 F +SYN proj/nell 1 OK -0x1.0cf3c28b55ccfp21 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.ec8a48827be59p4 0x0.0p0 F +SYN proj/nell 2 OK 0x1.0cf3c28b55ccfp21 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.f36948017480ep4 0x1.ec8a48827be59p4 0x0.0p0 F +SYN proj/nell 3 OK -0x1.b064a40df61cp20 0x1.97aa05ca56b6ep22 0x0.0p0 -0x1.66d29002e901ep3 0x1.243da80e296a8p6 0x0.0p0 F +SYN proj/nell 4 OK 0x1.b064a40df61bep20 0x1.97aa05ca56b6ep22 0x0.0p0 0x1.f36948017480dp4 0x1.243da80e296a8p6 0x0.0p0 F +SYN proj/nell_h 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nell_h 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nell_h 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nell_h 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nell_h 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nicol 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/nicol 1 OK -0x1.fffbbc6abd7d3p20 0x1.a32b60560760ap21 0x0.0p0 -0x1.1ad45ebd14d3ap3 0x1.ed8bfa08742dep4 0x0.0p0 F +SYN proj/nicol 2 OK 0x1.fffbbc6abd7d3p20 0x1.a32b60560760ap21 0x0.0p0 0x1.cd6a2f5e8a69dp4 0x1.ed8bfa08742dep4 0x0.0p0 F +SYN proj/nicol 3 OK -0x1.3f0dd606c286cp20 0x1.9ee1a92db5076p22 0x0.0p0 -0x1.bd55e2ae1d9dcp0 0x1.e87f7b997e719p5 0x0.0p0 F +SYN proj/nicol 4 OK 0x1.3f0dd606c286cp20 0x1.9ee1a92db5078p22 0x0.0p0 0x1.5bd55e2ae1d9dp4 0x1.e87f7b997e71bp5 0x0.0p0 F +SYN proj/noop 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/noop 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/noop 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/noop 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/noop 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/nsper 0 OK 0x0.0p0 0x1.a9d1f7a719f3fp21 0x0.0p0 0x1.4p3 0x1.f560acda7c97dp4 0x0.0p0 F +SYN proj/nsper 1 OK -0x1.99223466be82p20 0x1.46680a2b5bd7ap21 0x0.0p0 -0x1.4375dd0e4559dp2 0x1.8052eacf8ee4cp4 0x0.0p0 F +SYN proj/nsper 2 OK 0x1.99223466be82p20 0x1.46680a2b5bd7ap21 0x0.0p0 0x1.90dd774391568p4 0x1.8052eacf8ee4cp4 0x0.0p0 F +SYN proj/nsper 3 OK -0x1.6f54ebea23052p19 0x1.b795d96fc2bccp21 0x0.0p0 0x1.9efa5ebde1ebfp1 0x1.02caeac479db8p5 0x0.0p0 F +SYN proj/nsper 4 OK 0x1.6f54ebea23051p19 0x1.b795d96fc2bccp21 0x0.0p0 0x1.0c20b42843c28p4 0x1.02caeac479db8p5 0x0.0p0 F +SYN proj/nzmg 0 EXC:org.locationtech.proj4j.InvalidValueException -0x1.5cb30868dbb3ap46 0x1.cd28f617e7ff5p45 0x0.0p0 NaN NaN NaN F +SYN proj/nzmg 1 EXC:org.locationtech.proj4j.InvalidValueException 0x1.8dba1b4c133e4p31 -0x1.0047188556f8p33 0x0.0p0 NaN NaN NaN F +SYN proj/nzmg 2 EXC:org.locationtech.proj4j.InvalidValueException -0x1.2f7cc94f2860fp31 0x1.514bd1d7ee222p30 0x0.0p0 NaN NaN NaN F +SYN proj/nzmg 3 EXC:org.locationtech.proj4j.InvalidValueException -0x1.33efac2eb8e69p61 -0x1.1b5328da74e2ep61 0x0.0p0 NaN NaN NaN F +SYN proj/nzmg 4 EXC:org.locationtech.proj4j.InvalidValueException -0x1.86d7526760a53p61 -0x1.27eeff496b99p60 0x0.0p0 NaN NaN NaN F +SYN proj/ob_tran 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ob_tran 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ob_tran 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ob_tran 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ob_tran 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ocea 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ocea 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ocea 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ocea 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ocea 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/oea 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/oea 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/oea 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/oea 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/oea 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/omerc 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN E +SYN proj/omerc 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN E +SYN proj/omerc 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN E +SYN proj/omerc 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN E +SYN proj/omerc 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN E +SYN proj/ortel 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ortel 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ortel 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ortel 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ortel 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ortho 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 T +SYN proj/ortho 1 OK -0x1.e7f4a87c0f537p20 -0x1.526905dff4bd5p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffep4 0x0.0p0 T +SYN proj/ortho 2 OK 0x1.e7f4a87c0f537p20 -0x1.526905dff4bd5p20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep4 0x0.0p0 T +SYN proj/ortho 3 OK -0x1.19b8aa8c6b64p20 0x1.b853df0cff95dp20 0x0.0p0 -0x1.66d29002e902p3 0x1.dffffffffffffp5 0x0.0p0 T +SYN proj/ortho 4 OK 0x1.19b8aa8c6b63fp20 0x1.b853df0cff95dp20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 T +SYN proj/patterson 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/patterson 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/patterson 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/patterson 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/patterson 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pconic 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/pconic 1 OK -0x1.ed99c6a22a738p20 -0x1.520a1d5602e55p20 0x0.0p0 -0x1.4bdee326d3efcp7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/pconic 2 OK 0x1.ed99c6a22a738p20 -0x1.520a1d5602e55p20 0x0.0p0 -0x1.5c211cd92c105p7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/pconic 3 OK -0x1.1cfb015dd58c8p20 0x1.b88aaaa9fd1a8p20 0x0.0p0 -0x1.24339d1b31534p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/pconic 4 OK 0x1.1cfb015dd58c8p20 0x1.b88aaaa9fd1a8p20 0x0.0p0 0x1.c4339d1b31534p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/peirce_q 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/peirce_q 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/peirce_q 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/peirce_q 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/peirce_q 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pipeline 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pipeline 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pipeline 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pipeline 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pipeline 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/poly 0 EXC:org.locationtech.proj4j.InvalidValueException 0x0.0p0 0x0.0p0 0x0.0p0 NaN NaN NaN F +SYN proj/poly 1 OK -0x1.f07010ec232ap20 -0x1.699508d3d434p20 0x0.0p0 -0x1.1794702ae83p3 -0x1.94cd35bbf5503p3 0x0.0p0 F +SYN proj/poly 2 OK 0x1.f07010ec232ap20 -0x1.699508d3d434p20 0x0.0p0 0x1.cbca381574181p4 -0x1.94cd35bbf5503p3 0x0.0p0 F +SYN proj/poly 3 OK -0x1.1b591e6d3b031p20 0x1.c57bbf2a951b9p20 0x0.0p0 -0x1.bf3f9306dd05dp-1 0x1.0680b7d549df1p4 0x0.0p0 F +SYN proj/poly 4 OK 0x1.1b591e6d3b03p20 0x1.c57bbf2a951b9p20 0x0.0p0 0x1.4df9fc9836e83p4 0x1.0680b7d549df1p4 0x0.0p0 F +SYN proj/pop 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pop 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pop 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pop 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/pop 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/push 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/push 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/push 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/push 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/push 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp1 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp1 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp1 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp1 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp1 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp2 0 OK 0x0.0p0 0x1.d90bc7a6e3eap22 0x0.0p0 0x1.4p3 0x1.1942a1d9f2cd3p6 0x0.0p0 F +SYN proj/putp2 1 OK -0x1.8fddd45269c66p20 0x1.4e7e79be5753ap22 0x0.0p0 -0x1.66d29002e9021p3 0x1.8034510e04d9bp5 0x0.0p0 F +SYN proj/putp2 2 OK 0x1.8fddd45269c64p20 0x1.4e7e79be5753ap22 0x0.0p0 0x1.f36948017480ep4 0x1.8034510e04d9bp5 0x0.0p0 F +SYN proj/putp2 3 OK -0x1.111d2965b1fcdp-31 0x1.21ae2acbe454bp23 0x0.0p0 0x1.2c96b7fe8b7fp2 0x1.68p6 0x0.0p0 F +SYN proj/putp2 4 OK 0x1.111d2965b1fccp-31 0x1.21ae2acbe454bp23 0x0.0p0 0x1.e9b4a400ba407p3 0x1.68p6 0x0.0p0 F +SYN proj/putp3 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3p 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3p 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3p 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3p 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp3p 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp4p 0 OK 0x0.0p0 0x1.5156654f9132bp22 0x0.0p0 0x1.4p3 0x1.67fffffc7c769p5 0x0.0p0 F +SYN proj/putp4p 1 OK -0x1.c9568e5cb66eap20 0x1.cb8c727b9bd71p21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffbf14e1p4 0x0.0p0 F +SYN proj/putp4p 2 OK 0x1.c9568e5cb66e8p20 0x1.cb8c727b9bd71p21 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffbf14e1p4 0x0.0p0 F +SYN proj/putp4p 3 OK -0x1.527095bb10514p20 0x1.b12136ff0bc52p22 0x0.0p0 -0x1.66d29002e900ep3 0x1.dffffff9e9f5p5 0x0.0p0 F +SYN proj/putp4p 4 OK 0x1.527095bb10513p20 0x1.b12136ff0bc52p22 0x0.0p0 0x1.f369480174807p4 0x1.dffffff9e9f5p5 0x0.0p0 F +SYN proj/putp5 0 OK 0x0.0p0 0x1.35dd0d348054fp22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/putp5 1 OK -0x1.ede525d382d9bp20 0x1.9d26bc4600713p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/putp5 2 OK 0x1.ede525d382d99p20 0x1.9d26bc4600713p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/putp5 3 OK -0x1.140f3dc6c5facp20 0x1.9d26bc4600713p22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/putp5 4 OK 0x1.140f3dc6c5facp20 0x1.9d26bc4600713p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/putp5p 0 OK 0x0.0p0 0x1.35dd0d348054fp22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/putp5p 1 OK -0x1.0d8b7990ebc23p21 0x1.9d26bc4600713p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/putp5p 2 OK 0x1.0d8b7990ebc22p21 0x1.9d26bc4600713p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/putp5p 3 OK -0x1.ae2bff1b7914fp20 0x1.9d26bc4600713p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/putp5p 4 OK 0x1.ae2bff1b7914ep20 0x1.9d26bc4600713p22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/putp6 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6p 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6p 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6p 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6p 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/putp6p 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/qsc 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/qsc 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/qsc 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/qsc 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/qsc 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/qua_aut 0 OK 0x0.0p0 0x1.29f33adfc0f7ep22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/qua_aut 1 OK -0x1.0272df03ae792p21 0x1.9305f53ef7d16p21 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/qua_aut 2 OK 0x1.0272df03ae792p21 0x1.9305f53ef7d16p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/qua_aut 3 OK -0x1.4cdb3c11d126p20 0x1.854a63fffffffp22 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/qua_aut 4 OK 0x1.4cdb3c11d125fp20 0x1.854a63fffffffp22 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/rhealpix 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rhealpix 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rhealpix 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rhealpix 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rhealpix 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/robin 0 OK 0x0.0p0 0x1.254746962c541p22 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/robin 1 OK -0x1.d5b966bb2a8ecp20 0x1.87ab607c8b80bp21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/robin 2 OK 0x1.d5b966bb2a8ebp20 0x1.87ab607c8b80bp21 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/robin 3 OK -0x1.86c0774a6222cp20 0x1.82b897bf05b8dp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/robin 4 OK 0x1.86c0774a6222cp20 0x1.82b897bf05b8dp22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/rouss 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rouss 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rouss 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rouss 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rouss 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/rpoly 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/rpoly 1 OK -0x1.ef0b19b2d6fb3p20 0x1.ae93244e86e79p21 0x0.0p0 -0x1.06e23e1eca34p3 0x1.faf9d32886a3cp4 0x0.0p0 F +SYN proj/rpoly 2 OK 0x1.ef0b19b2d6fb1p20 0x1.ae93244e86e79p21 0x0.0p0 0x1.c3711f0f6519ep4 0x1.faf9d32886a3cp4 0x0.0p0 F +SYN proj/rpoly 3 OK -0x1.1909eec60bd4p20 0x1.a2ed97bd983fp22 0x0.0p0 -0x1.5d002b4597669p-2 0x1.ed433af1a35c2p5 0x0.0p0 F +SYN proj/rpoly 4 OK 0x1.1909eec60bd3fp20 0x1.a2ed97bd983fp22 0x0.0p0 0x1.457400ad165d9p4 0x1.ed433af1a35c2p5 0x0.0p0 F +SYN proj/s2 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/s2 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/s2 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/s2 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/s2 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/sch 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/sch 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/sch 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/sch 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/sch 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/set 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/set 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/set 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/set 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/set 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/sinu 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/sinu 1 OK -0x1.f348da1ab9b8fp20 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/sinu 2 OK 0x1.f348da1ab9b8fp20 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/sinu 3 OK -0x1.204318094ebd6p20 0x1.97aa05ca56b6ep22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/sinu 4 OK 0x1.204318094ebd6p20 0x1.97aa05ca56b6ep22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/som 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/som 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/som 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/som 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/som 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/somerc 0 OK 0x0.0p0 -0x1.23f75f1731b14p-29 0x0.0p0 0x1.4p3 0x1.67fffffffffffp5 0x0.0p0 F +SYN proj/somerc 1 OK -0x1.fd433abbb5e6fp20 -0x1.569cb903990f5p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.e000000000001p4 0x0.0p0 F +SYN proj/somerc 2 OK 0x1.fd433abbb5e6ep20 -0x1.569cb903990f5p20 0x0.0p0 0x1.f36948017480dp4 0x1.e000000000001p4 0x0.0p0 F +SYN proj/somerc 3 OK -0x1.2834352a298bap20 0x1.c49625dfd2d7bp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/somerc 4 OK 0x1.2834352a298b9p20 0x1.c49625dfd2d7bp20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/spilhaus 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/spilhaus 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/spilhaus 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/spilhaus 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/spilhaus 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/stere 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.67ffffffffff5p5 0x0.0p0 T +SYN proj/stere 1 OK -0x1.fb2435241f44ep20 -0x1.5e88dbe4fdb78p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffff6p4 0x0.0p0 T +SYN proj/stere 2 OK 0x1.fb2435241f44cp20 -0x1.5e88dbe4fdb78p20 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffffff67p4 0x0.0p0 T +SYN proj/stere 3 OK -0x1.2329a97f26af6p20 0x1.c58e62ae50c52p20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffff43p5 0x0.0p0 T +SYN proj/stere 4 OK 0x1.2329a97f26af6p20 0x1.c58e62ae50c52p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffff43p5 0x0.0p0 T +SYN proj/sterea 0 OK 0x0.0p0 -0x1.8549d41eecec5p-30 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/sterea 1 OK -0x1.fb84110645522p20 -0x1.5e69766dd169bp20 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffff6p4 0x0.0p0 F +SYN proj/sterea 2 OK 0x1.fb84110645522p20 -0x1.5e69766dd169bp20 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffff6p4 0x0.0p0 F +SYN proj/sterea 3 OK -0x1.22dba2586879fp20 0x1.c56e6c1046fdp20 0x0.0p0 -0x1.66d29002e902p3 0x1.e000000000001p5 0x0.0p0 F +SYN proj/sterea 4 OK 0x1.22dba2586879ep20 0x1.c56e6c1046fdp20 0x0.0p0 0x1.f36948017480ep4 0x1.e000000000001p5 0x0.0p0 F +SYN proj/tcc 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/tcc 1 OK -0x1.00eaf8037d669p21 0x1.afb9469ffda0fp21 0x0.0p0 -0x1.1d02b6c3498b7p3 0x1.fc5426654f37ap4 0x0.0p0 F +SYN proj/tcc 2 OK 0x1.00eaf8037d669p21 0x1.afb9469ffda0fp21 0x0.0p0 0x1.ce815b61a4c5cp4 0x1.fc5426654f37ap4 0x0.0p0 F +SYN proj/tcc 3 OK -0x1.1e72c7bf3293ep20 0x1.a347941006c06p22 0x0.0p0 -0x1.146947597879cp-1 0x1.edad2ed3940bap5 0x0.0p0 F +SYN proj/tcc 4 OK 0x1.1e72c7bf3293ep20 0x1.a347941006c06p22 0x0.0p0 0x1.48a34a3acbc3dp4 0x1.edad2ed3940bap5 0x0.0p0 F +SYN proj/tcea 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x0.0p0 0x0.0p0 F +SYN proj/tcea 1 OK -0x1.e7f4a87c0f537p20 -0x1.678b841f08e2cp20 0x0.0p0 -0x1.1737926510324p3 -0x1.91a9af35d7725p3 0x0.0p0 F +SYN proj/tcea 2 OK 0x1.e7f4a87c0f537p20 -0x1.678b841f08e2cp20 0x0.0p0 0x1.cb9bc93288193p4 -0x1.91a9af35d7725p3 0x0.0p0 F +SYN proj/tcea 3 OK -0x1.19b8aa8c6b64p20 0x1.c6203ee116dcep20 0x0.0p0 -0x1.be891fbfb9725p-1 0x1.06d0a17742277p4 0x0.0p0 F +SYN proj/tcea 4 OK 0x1.19b8aa8c6b63fp20 0x1.c6203ee116dcep20 0x0.0p0 0x1.4df448fdfdcb9p4 0x1.06d0a17742277p4 0x0.0p0 F +SYN proj/times 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/times 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/times 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/times 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/times 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tinshift 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tinshift 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tinshift 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tinshift 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tinshift 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tissot 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tissot 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tissot 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tissot 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tissot 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tmerc 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/tmerc 1 OK -0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 -0x1.66d13c3bbaf4dp3 0x1.e000119249746p4 0x0.0p0 F +SYN proj/tmerc 2 OK 0x1.f967d30bc2f66p20 -0x1.664632414c58dp20 0x0.0p0 0x1.f3689e1ddd7a6p4 0x1.e000119249746p4 0x0.0p0 F +SYN proj/tmerc 3 OK -0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 -0x1.66cc5912fa1e6p3 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN proj/tmerc 4 OK 0x1.1d93a17e1c90fp20 0x1.c61530129e877p20 0x0.0p0 0x1.f3662c897d0f2p4 0x1.e0000f65b0d9p5 0x0.0p0 F +SYN proj/tobmerc 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tobmerc 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tobmerc 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tobmerc 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tobmerc 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/topocentric 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/topocentric 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/topocentric 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/topocentric 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/topocentric 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpeqd 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpeqd 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpeqd 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpeqd 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpeqd 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpers 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpers 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpers 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpers 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/tpers 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/unitconvert 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/unitconvert 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/unitconvert 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/unitconvert 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/unitconvert 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ups 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ups 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ups 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ups 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/ups 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/urm5 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/urm5 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/urm5 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/urm5 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/urm5 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/urmfps 0 OK 0x0.0p0 0x1.92631c03a632p22 0x0.0p0 0x1.4p3 0x1.b5e287a9795ap5 0x0.0p0 F +SYN proj/urmfps 1 OK -0x1.b6104aa1b7debp20 0x1.0c4212ad1976ap22 0x0.0p0 -0x1.66d29002e902p3 0x1.1a1d785686a6p5 0x0.0p0 F +SYN proj/urmfps 2 OK 0x1.b6104aa1b7deap20 0x1.0c4212ad1976ap22 0x0.0p0 0x1.f36948017480ep4 0x1.1a1d785686a6p5 0x0.0p0 F +SYN proj/urmfps 3 OK -0x1.f9d512e4f31cep19 0x1.0c4212ad1976ap23 0x0.0p0 -0x1.66d29002e901ep3 0x1.68p6 0x0.0p0 F +SYN proj/urmfps 4 OK 0x1.f9d512e4f31ccp19 0x1.0c4212ad1976ap23 0x0.0p0 0x1.f36948017480ep4 0x1.68p6 0x0.0p0 F +SYN proj/utm 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/utm 1 OK -0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 -0x1.66d29002e901cp3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/utm 2 OK 0x1.f9679d0b5b8d5p20 -0x1.664632bd7a467p20 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/utm 3 OK -0x1.1d93a7ca95229p20 0x1.c6153081fe165p20 0x0.0p0 -0x1.66d29002e9019p3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/utm 4 OK 0x1.1d93a7ca95228p20 0x1.c6153081fe165p20 0x0.0p0 0x1.f36948017480bp4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/vandg 0 OK 0x0.0p0 0x1.47b328b712b28p22 0x0.0p0 0x1.4p3 0x1.6800000000005p5 0x0.0p0 F +SYN proj/vandg 1 OK -0x1.17d9fb82de532p21 0x1.a49cabc7e13e2p21 0x0.0p0 -0x1.66d29002e8ff8p3 0x1.e0000000002cdp4 0x0.0p0 F +SYN proj/vandg 2 OK 0x1.17d9fb82de552p21 0x1.a49cabc7e10aep21 0x0.0p0 0x1.f369480174826p4 0x1.dffffffffff59p4 0x0.0p0 F +SYN proj/vandg 3 OK -0x1.ecb69e2d04f43p20 0x1.d50f144fd2bd8p22 0x0.0p0 -0x1.66d29002e9047p3 0x1.e000000000001p5 0x0.0p0 F +SYN proj/vandg 4 OK 0x1.ecb69e2d04f4p20 0x1.d50f144fd2bd8p22 0x0.0p0 0x1.f369480174826p4 0x1.e000000000001p5 0x0.0p0 F +SYN proj/vandg2 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg2 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg2 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg2 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg2 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg3 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg3 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg3 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg3 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg3 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg4 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg4 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg4 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg4 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vandg4 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vertoffset 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vertoffset 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vertoffset 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vertoffset 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vertoffset 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vgridshift 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vgridshift 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vgridshift 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vgridshift 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vgridshift 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/vitk1 0 OK 0x0.0p0 0x0.0p0 0x0.0p0 0x1.4p3 0x1.68p5 0x0.0p0 F +SYN proj/vitk1 1 OK -0x1.febbfd72ac5ccp20 -0x1.52d38cf9bde92p20 0x0.0p0 -0x1.417619fd43b23p7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/vitk1 2 OK 0x1.febbfd72ac5ccp20 -0x1.52d38cf9bde92p20 0x0.0p0 -0x1.6689e602bc4dep7 0x1.dfffffffffffep4 0x0.0p0 F +SYN proj/vitk1 3 OK -0x1.26df63223016ap20 0x1.bf685c8d6c949p20 0x0.0p0 -0x1.211188237e357p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/vitk1 4 OK 0x1.26df63223016ap20 0x1.bf685c8d6c949p20 0x0.0p0 0x1.c11188237e358p5 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/wag1 0 OK 0x0.0p0 0x1.92631c03a632p22 0x0.0p0 0x1.4p3 0x1.b5e287a9795ap5 0x0.0p0 F +SYN proj/wag1 1 OK -0x1.b6104aa1b7debp20 0x1.0c4212ad1976ap22 0x0.0p0 -0x1.66d29002e902p3 0x1.1a1d785686a6p5 0x0.0p0 F +SYN proj/wag1 2 OK 0x1.b6104aa1b7deap20 0x1.0c4212ad1976ap22 0x0.0p0 0x1.f36948017480ep4 0x1.1a1d785686a6p5 0x0.0p0 F +SYN proj/wag1 3 OK -0x1.f9d512e4f31cep19 0x1.0c4212ad1976ap23 0x0.0p0 -0x1.66d29002e901ep3 0x1.68p6 0x0.0p0 F +SYN proj/wag1 4 OK 0x1.f9d512e4f31ccp19 0x1.0c4212ad1976ap23 0x0.0p0 0x1.f36948017480ep4 0x1.68p6 0x0.0p0 F +SYN proj/wag2 0 OK 0x0.0p0 0x1.a8262972d3262p22 0x0.0p0 0x1.4p3 0x1.e2e2598a30e25p5 0x0.0p0 F +SYN proj/wag2 1 OK -0x1.cdc0dbf50905dp20 0x1.1ac41ba1e2197p22 0x0.0p0 -0x1.66d29002e901ep3 0x1.38b70e4dbea9p5 0x0.0p0 F +SYN proj/wag2 2 OK 0x1.cdc0dbf50905cp20 0x1.1ac41ba1e2197p22 0x0.0p0 0x1.f36948017480ep4 0x1.38b70e4dbea9p5 0x0.0p0 F +SYN proj/wag2 3 OK -0x1.0a97eaabd023ep20 0x1.1ac41ba1e2197p23 0x0.0p0 -0x1.66d29002e901ep3 0x1.68019f20554b7p6 0x0.0p0 F +SYN proj/wag2 4 OK 0x1.0a97eaabd023dp20 0x1.1ac41ba1e2197p23 0x0.0p0 0x1.f36948017480dp4 0x1.68019f20554b7p6 0x0.0p0 F +SYN proj/wag3 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/wag3 1 OK -0x1.0ee0b486b62ecp21 0x1.97aa05ca56b6ep21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/wag3 2 OK 0x1.0ee0b486b62ebp21 0x1.97aa05ca56b6ep21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/wag3 3 OK -0x1.b9a4a4a9776ep20 0x1.97aa05ca56b6ep22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/wag3 4 OK 0x1.b9a4a4a9776ep20 0x1.97aa05ca56b6ep22 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp5 0x0.0p0 F +SYN proj/wag4 0 OK 0x0.0p0 0x1.50ff5943ae183p22 0x0.0p0 0x1.4p3 0x1.67ffffffffffdp5 0x0.0p0 F +SYN proj/wag4 1 OK -0x1.cc6656376a862p20 0x1.ce62233f1f728p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/wag4 2 OK 0x1.cc6656376a862p20 0x1.ce62233f1f728p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/wag4 3 OK -0x1.6113d5c9f90c9p20 0x1.ad6cd440d0dbep22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/wag4 4 OK 0x1.6113d5c9f90c9p20 0x1.ad6cd440d0dbep22 0x0.0p0 0x1.f36948017480ep4 0x1.dfffffffffffep5 0x0.0p0 F +SYN proj/wag5 0 OK 0x0.0p0 0x1.69dd68661d158p22 0x0.0p0 0x1.4p3 0x1.67ffffffffff3p5 0x0.0p0 F +SYN proj/wag5 1 OK -0x1.e3def050c481ep20 0x1.efd35d37a20e6p21 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/wag5 2 OK 0x1.e3def050c481cp20 0x1.efd35d37a20e6p21 0x0.0p0 0x1.f36948017480ep4 0x1.dffffffffffffp4 0x0.0p0 F +SYN proj/wag5 3 OK -0x1.6c34cbaf0cdcap20 0x1.ce439201bdc0fp22 0x0.0p0 -0x1.66d29002e9023p3 0x1.e000000000003p5 0x0.0p0 F +SYN proj/wag5 4 OK 0x1.6c34cbaf0cdc9p20 0x1.ce439201bdc0fp22 0x0.0p0 0x1.f36948017481p4 0x1.e000000000003p5 0x0.0p0 F +SYN proj/wag6 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wag6 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wag6 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wag6 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wag6 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wag7 0 OK 0x0.0p0 0x1.495561465c00bp22 0x0.0p0 0x1.4p3 0x1.83c5386418826p5 0x0.0p0 F +SYN proj/wag7 1 OK -0x1.d581a06cb2364p20 0x1.c30f7b9496acdp21 0x0.0p0 -0x1.d1a1858cd41ap2 0x1.098c5c3ca65bp5 0x0.0p0 F +SYN proj/wag7 2 OK 0x1.d581a06cb2362p20 0x1.c30f7b9496acdp21 0x0.0p0 0x1.b468616335067p4 0x1.098c5c3ca65bp5 0x0.0p0 F +SYN proj/wag7 3 OK -0x1.608f2b4af6085p20 0x1.a5fe02f0fdc0fp22 0x0.0p0 -0x1.7c781dcc35fcp1 0x1.f0ded60bba9c9p5 0x0.0p0 F +SYN proj/wag7 4 OK 0x1.608f2b4af6084p20 0x1.a5fe02f0fdc0fp22 0x0.0p0 0x1.6f8f03b986bf7p4 0x1.f0ded60bba9c9p5 0x0.0p0 F +SYN proj/webmerc 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/webmerc 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/webmerc 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/webmerc 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/webmerc 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/weren 0 OK 0x0.0p0 0x1.81f3da672a6fp22 0x0.0p0 0x1.4p3 0x1.67fffffc7c76ap5 0x0.0p0 F +SYN proj/weren 1 OK -0x1.059f9c29906bep21 0x1.06e354fa7b10fp22 0x0.0p0 -0x1.66d29002e901ep3 0x1.dffffffbf14e3p4 0x0.0p0 F +SYN proj/weren 2 OK 0x1.059f9c29906bdp21 0x1.06e354fa7b10fp22 0x0.0p0 0x1.f36948017480dp4 0x1.dffffffbf14e3p4 0x0.0p0 F +SYN proj/weren 3 OK -0x1.8336b5b2176f4p20 0x1.ef8cc13913a84p22 0x0.0p0 -0x1.66d29002e901p3 0x1.dffffff9e9f5p5 0x0.0p0 F +SYN proj/weren 4 OK 0x1.8336b5b2176f3p20 0x1.ef8cc13913a84p22 0x0.0p0 0x1.f369480174807p4 0x1.dffffff9e9f5p5 0x0.0p0 F +SYN proj/wink1 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink1 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink1 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink1 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink1 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink2 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink2 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink2 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink2 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wink2 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/wintri 0 OK 0x0.0p0 0x1.31bf8457c1093p22 0x0.0p0 0x1.4p3 0x1.6800000000001p5 0x0.0p0 F +SYN proj/wintri 1 OK -0x1.bcd2f3f51b535p20 0x1.98be5946606a7p21 0x0.0p0 -0x1.9781ce46e324cp2 0x1.e1455b7c336e8p4 0x0.0p0 F +SYN proj/wintri 2 OK 0x1.bcd2f3f51b535p20 0x1.98be5946606a7p21 0x0.0p0 0x1.a5e07391b8c93p4 0x1.e1455b7c336e8p4 0x0.0p0 F +SYN proj/wintri 3 OK -0x1.657380cb351cep20 0x1.986d42c8076fcp22 0x0.0p0 -0x1.93824ed6d2c2ep1 0x1.e0e5e19bc5628p5 0x0.0p0 F +SYN proj/wintri 4 OK 0x1.657380cb351cdp20 0x1.986d42c8076fcp22 0x0.0p0 0x1.727049dada586p4 0x1.e0e5e19bc5628p5 0x0.0p0 F +SYN proj/xyzgridshift 0 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/xyzgridshift 1 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/xyzgridshift 2 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/xyzgridshift 3 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - +SYN proj/xyzgridshift 4 EXC:org.locationtech.proj4j.InvalidValueException NaN NaN NaN NaN NaN NaN - diff --git a/golden/pairs.tsv b/golden/pairs.tsv new file mode 100644 index 0000000..d59a5a8 --- /dev/null +++ b/golden/pairs.tsv @@ -0,0 +1,201 @@ +key src tgt srctype tgttype +t00/epsg:3821>epsg:2012 epsg:3821 epsg:2012 0 0 +t00/epsg:4007>epsg:2025 epsg:4007 epsg:2025 0 0 +t00/epsg:4014>epsg:2081 epsg:4014 epsg:2081 0 0 +t00/epsg:4024>epsg:2163 epsg:4024 epsg:2163 0 0 +t00/epsg:4034>epsg:2328 epsg:4034 epsg:2328 0 0 +t00/epsg:4045>epsg:2341 epsg:4045 epsg:2341 0 0 +t00/epsg:4128>epsg:2353 epsg:4128 epsg:2353 0 0 +t00/epsg:4174>epsg:2366 epsg:4174 epsg:2366 0 0 +t01/epsg:3821>epsg:2048 epsg:3821 epsg:2048 0 1 +t01/epsg:4007>epsg:2108 epsg:4007 epsg:2108 0 1 +t01/epsg:4014>epsg:2121 epsg:4014 epsg:2121 0 1 +t01/epsg:4024>epsg:2134 epsg:4024 epsg:2134 0 1 +t01/epsg:4034>epsg:2150 epsg:4034 epsg:2150 0 1 +t01/epsg:4045>epsg:2193 epsg:4045 epsg:2193 0 1 +t01/epsg:4128>epsg:22174 epsg:4128 epsg:22174 0 1 +t01/epsg:4174>epsg:2224 epsg:4174 epsg:2224 0 1 +t02/epsg:3821>epsg:2006 epsg:3821 epsg:2006 0 2 +t02/epsg:4007>epsg:20355 epsg:4007 epsg:20355 0 2 +t02/epsg:4014>epsg:2044 epsg:4014 epsg:2044 0 2 +t02/epsg:4024>epsg:2064 epsg:4024 epsg:2064 0 2 +t02/epsg:4034>epsg:2079 epsg:4034 epsg:2079 0 2 +t02/epsg:4045>epsg:2092 epsg:4045 epsg:2092 0 2 +t02/epsg:4128>epsg:21100 epsg:4128 epsg:21100 0 2 +t02/epsg:4174>epsg:21418 epsg:4174 epsg:21418 0 2 +t03/epsg:3821>epsg:20009 epsg:3821 epsg:20009 0 3 +t03/epsg:4007>epsg:20022 epsg:4007 epsg:20022 0 3 +t03/epsg:4014>epsg:20066 epsg:4014 epsg:20066 0 3 +t03/epsg:4024>epsg:20079 epsg:4024 epsg:20079 0 3 +t03/epsg:4034>epsg:20092 epsg:4034 epsg:20092 0 3 +t03/epsg:4045>epsg:2094 epsg:4045 epsg:2094 0 3 +t03/epsg:4128>epsg:2392 epsg:4128 epsg:2392 0 3 +t03/epsg:4174>epsg:2468 epsg:4174 epsg:2468 0 3 +t04/epsg:3821>epsg:26703 epsg:3821 epsg:26703 0 4 +t04/epsg:4007>epsg:26716 epsg:4007 epsg:26716 0 4 +t04/epsg:4014>epsg:26735 epsg:4014 epsg:26735 0 4 +t04/epsg:4024>epsg:26748 epsg:4024 epsg:26748 0 4 +t04/epsg:4034>epsg:26766 epsg:4034 epsg:26766 0 4 +t04/epsg:4045>epsg:26779 epsg:4045 epsg:26779 0 4 +t04/epsg:4128>epsg:26795 epsg:4128 epsg:26795 0 4 +t04/epsg:4174>epsg:32007 epsg:4174 epsg:32007 0 4 +t10/epsg:3824>epsg:2012 epsg:3824 epsg:2012 1 0 +t10/epsg:4075>epsg:2025 epsg:4075 epsg:2025 1 0 +t10/epsg:4152>epsg:2081 epsg:4152 epsg:2081 1 0 +t10/epsg:4173>epsg:2163 epsg:4173 epsg:2163 1 0 +t10/epsg:4283>epsg:2328 epsg:4283 epsg:2328 1 0 +t10/epsg:4617>epsg:2341 epsg:4617 epsg:2341 1 0 +t10/epsg:4667>epsg:2353 epsg:4667 epsg:2353 1 0 +t10/epsg:4737>epsg:2366 epsg:4737 epsg:2366 1 0 +t11/epsg:3824>epsg:2048 epsg:3824 epsg:2048 1 1 +t11/epsg:4075>epsg:2108 epsg:4075 epsg:2108 1 1 +t11/epsg:4152>epsg:2121 epsg:4152 epsg:2121 1 1 +t11/epsg:4173>epsg:2134 epsg:4173 epsg:2134 1 1 +t11/epsg:4283>epsg:2150 epsg:4283 epsg:2150 1 1 +t11/epsg:4617>epsg:2193 epsg:4617 epsg:2193 1 1 +t11/epsg:4667>epsg:22174 epsg:4667 epsg:22174 1 1 +t11/epsg:4737>epsg:2224 epsg:4737 epsg:2224 1 1 +t12/epsg:3824>epsg:2006 epsg:3824 epsg:2006 1 2 +t12/epsg:4075>epsg:20355 epsg:4075 epsg:20355 1 2 +t12/epsg:4152>epsg:2044 epsg:4152 epsg:2044 1 2 +t12/epsg:4173>epsg:2064 epsg:4173 epsg:2064 1 2 +t12/epsg:4283>epsg:2079 epsg:4283 epsg:2079 1 2 +t12/epsg:4617>epsg:2092 epsg:4617 epsg:2092 1 2 +t12/epsg:4667>epsg:21100 epsg:4667 epsg:21100 1 2 +t12/epsg:4737>epsg:21418 epsg:4737 epsg:21418 1 2 +t13/epsg:3824>epsg:20009 epsg:3824 epsg:20009 1 3 +t13/epsg:4075>epsg:20022 epsg:4075 epsg:20022 1 3 +t13/epsg:4152>epsg:20066 epsg:4152 epsg:20066 1 3 +t13/epsg:4173>epsg:20079 epsg:4173 epsg:20079 1 3 +t13/epsg:4283>epsg:20092 epsg:4283 epsg:20092 1 3 +t13/epsg:4617>epsg:2094 epsg:4617 epsg:2094 1 3 +t13/epsg:4667>epsg:2392 epsg:4667 epsg:2392 1 3 +t13/epsg:4737>epsg:2468 epsg:4737 epsg:2468 1 3 +t14/epsg:3824>epsg:26703 epsg:3824 epsg:26703 1 4 +t14/epsg:4075>epsg:26716 epsg:4075 epsg:26716 1 4 +t14/epsg:4152>epsg:26735 epsg:4152 epsg:26735 1 4 +t14/epsg:4173>epsg:26748 epsg:4173 epsg:26748 1 4 +t14/epsg:4283>epsg:26766 epsg:4283 epsg:26766 1 4 +t14/epsg:4617>epsg:26779 epsg:4617 epsg:26779 1 4 +t14/epsg:4667>epsg:26795 epsg:4667 epsg:26795 1 4 +t14/epsg:4737>epsg:32007 epsg:4737 epsg:32007 1 4 +t20/epsg:3906>epsg:2012 epsg:3906 epsg:2012 2 0 +t20/epsg:4132>epsg:2025 epsg:4132 epsg:2025 2 0 +t20/epsg:4145>epsg:2081 epsg:4145 epsg:2081 2 0 +t20/epsg:4155>epsg:2163 epsg:4155 epsg:2163 2 0 +t20/epsg:4168>epsg:2328 epsg:4168 epsg:2328 2 0 +t20/epsg:4192>epsg:2341 epsg:4192 epsg:2341 2 0 +t20/epsg:4207>epsg:2353 epsg:4207 epsg:2353 2 0 +t20/epsg:4214>epsg:2366 epsg:4214 epsg:2366 2 0 +t21/epsg:3906>epsg:2048 epsg:3906 epsg:2048 2 1 +t21/epsg:4132>epsg:2108 epsg:4132 epsg:2108 2 1 +t21/epsg:4145>epsg:2121 epsg:4145 epsg:2121 2 1 +t21/epsg:4155>epsg:2134 epsg:4155 epsg:2134 2 1 +t21/epsg:4168>epsg:2150 epsg:4168 epsg:2150 2 1 +t21/epsg:4192>epsg:2193 epsg:4192 epsg:2193 2 1 +t21/epsg:4207>epsg:22174 epsg:4207 epsg:22174 2 1 +t21/epsg:4214>epsg:2224 epsg:4214 epsg:2224 2 1 +t22/epsg:3906>epsg:2006 epsg:3906 epsg:2006 2 2 +t22/epsg:4132>epsg:20355 epsg:4132 epsg:20355 2 2 +t22/epsg:4145>epsg:2044 epsg:4145 epsg:2044 2 2 +t22/epsg:4155>epsg:2064 epsg:4155 epsg:2064 2 2 +t22/epsg:4168>epsg:2079 epsg:4168 epsg:2079 2 2 +t22/epsg:4192>epsg:2092 epsg:4192 epsg:2092 2 2 +t22/epsg:4207>epsg:21100 epsg:4207 epsg:21100 2 2 +t22/epsg:4214>epsg:21418 epsg:4214 epsg:21418 2 2 +t23/epsg:3906>epsg:20009 epsg:3906 epsg:20009 2 3 +t23/epsg:4132>epsg:20022 epsg:4132 epsg:20022 2 3 +t23/epsg:4145>epsg:20066 epsg:4145 epsg:20066 2 3 +t23/epsg:4155>epsg:20079 epsg:4155 epsg:20079 2 3 +t23/epsg:4168>epsg:20092 epsg:4168 epsg:20092 2 3 +t23/epsg:4192>epsg:2094 epsg:4192 epsg:2094 2 3 +t23/epsg:4207>epsg:2392 epsg:4207 epsg:2392 2 3 +t23/epsg:4214>epsg:2468 epsg:4214 epsg:2468 2 3 +t24/epsg:3906>epsg:26703 epsg:3906 epsg:26703 2 4 +t24/epsg:4132>epsg:26716 epsg:4132 epsg:26716 2 4 +t24/epsg:4145>epsg:26735 epsg:4145 epsg:26735 2 4 +t24/epsg:4155>epsg:26748 epsg:4155 epsg:26748 2 4 +t24/epsg:4168>epsg:26766 epsg:4168 epsg:26766 2 4 +t24/epsg:4192>epsg:26779 epsg:4192 epsg:26779 2 4 +t24/epsg:4207>epsg:26795 epsg:4207 epsg:26795 2 4 +t24/epsg:4214>epsg:32007 epsg:4214 epsg:32007 2 4 +t30/epsg:3819>epsg:2012 epsg:3819 epsg:2012 3 0 +t30/epsg:4188>epsg:2025 epsg:4188 epsg:2025 3 0 +t30/epsg:4232>epsg:2081 epsg:4232 epsg:2081 3 0 +t30/epsg:4289>epsg:2163 epsg:4289 epsg:2163 3 0 +t30/epsg:4322>epsg:2328 epsg:4322 epsg:2328 3 0 +t30/epsg:4660>epsg:2341 epsg:4660 epsg:2341 3 0 +t30/epsg:4691>epsg:2353 epsg:4691 epsg:2353 3 0 +t30/epsg:4817>epsg:2366 epsg:4817 epsg:2366 3 0 +t31/epsg:3819>epsg:2048 epsg:3819 epsg:2048 3 1 +t31/epsg:4188>epsg:2108 epsg:4188 epsg:2108 3 1 +t31/epsg:4232>epsg:2121 epsg:4232 epsg:2121 3 1 +t31/epsg:4289>epsg:2134 epsg:4289 epsg:2134 3 1 +t31/epsg:4322>epsg:2150 epsg:4322 epsg:2150 3 1 +t31/epsg:4660>epsg:2193 epsg:4660 epsg:2193 3 1 +t31/epsg:4691>epsg:22174 epsg:4691 epsg:22174 3 1 +t31/epsg:4817>epsg:2224 epsg:4817 epsg:2224 3 1 +t32/epsg:3819>epsg:2006 epsg:3819 epsg:2006 3 2 +t32/epsg:4188>epsg:20355 epsg:4188 epsg:20355 3 2 +t32/epsg:4232>epsg:2044 epsg:4232 epsg:2044 3 2 +t32/epsg:4289>epsg:2064 epsg:4289 epsg:2064 3 2 +t32/epsg:4322>epsg:2079 epsg:4322 epsg:2079 3 2 +t32/epsg:4660>epsg:2092 epsg:4660 epsg:2092 3 2 +t32/epsg:4691>epsg:21100 epsg:4691 epsg:21100 3 2 +t32/epsg:4817>epsg:21418 epsg:4817 epsg:21418 3 2 +t33/epsg:3819>epsg:20009 epsg:3819 epsg:20009 3 3 +t33/epsg:4188>epsg:20022 epsg:4188 epsg:20022 3 3 +t33/epsg:4232>epsg:20066 epsg:4232 epsg:20066 3 3 +t33/epsg:4289>epsg:20079 epsg:4289 epsg:20079 3 3 +t33/epsg:4322>epsg:20092 epsg:4322 epsg:20092 3 3 +t33/epsg:4660>epsg:2094 epsg:4660 epsg:2094 3 3 +t33/epsg:4691>epsg:2392 epsg:4691 epsg:2392 3 3 +t33/epsg:4817>epsg:2468 epsg:4817 epsg:2468 3 3 +t34/epsg:3819>epsg:26703 epsg:3819 epsg:26703 3 4 +t34/epsg:4188>epsg:26716 epsg:4188 epsg:26716 3 4 +t34/epsg:4232>epsg:26735 epsg:4232 epsg:26735 3 4 +t34/epsg:4289>epsg:26748 epsg:4289 epsg:26748 3 4 +t34/epsg:4322>epsg:26766 epsg:4322 epsg:26766 3 4 +t34/epsg:4660>epsg:26779 epsg:4660 epsg:26779 3 4 +t34/epsg:4691>epsg:26795 epsg:4691 epsg:26795 3 4 +t34/epsg:4817>epsg:32007 epsg:4817 epsg:32007 3 4 +t40/epsg:4267>epsg:2012 epsg:4267 epsg:2012 4 0 +t40/epsg:4267>epsg:2163 epsg:4267 epsg:2163 4 0 +t40/epsg:4267>epsg:2353 epsg:4267 epsg:2353 4 0 +t40/esri:104000>epsg:2025 esri:104000 epsg:2025 4 0 +t40/esri:104000>epsg:2328 esri:104000 epsg:2328 4 0 +t40/esri:104000>epsg:2366 esri:104000 epsg:2366 4 0 +t40/esri:4267>epsg:2081 esri:4267 epsg:2081 4 0 +t40/esri:4267>epsg:2341 esri:4267 epsg:2341 4 0 +t41/epsg:4267>epsg:2048 epsg:4267 epsg:2048 4 1 +t41/epsg:4267>epsg:2134 epsg:4267 epsg:2134 4 1 +t41/epsg:4267>epsg:22174 epsg:4267 epsg:22174 4 1 +t41/esri:104000>epsg:2108 esri:104000 epsg:2108 4 1 +t41/esri:104000>epsg:2150 esri:104000 epsg:2150 4 1 +t41/esri:104000>epsg:2224 esri:104000 epsg:2224 4 1 +t41/esri:4267>epsg:2121 esri:4267 epsg:2121 4 1 +t41/esri:4267>epsg:2193 esri:4267 epsg:2193 4 1 +t42/epsg:4267>epsg:2006 epsg:4267 epsg:2006 4 2 +t42/epsg:4267>epsg:2064 epsg:4267 epsg:2064 4 2 +t42/epsg:4267>epsg:21100 epsg:4267 epsg:21100 4 2 +t42/esri:104000>epsg:20355 esri:104000 epsg:20355 4 2 +t42/esri:104000>epsg:2079 esri:104000 epsg:2079 4 2 +t42/esri:104000>epsg:21418 esri:104000 epsg:21418 4 2 +t42/esri:4267>epsg:2044 esri:4267 epsg:2044 4 2 +t42/esri:4267>epsg:2092 esri:4267 epsg:2092 4 2 +t43/epsg:4267>epsg:20009 epsg:4267 epsg:20009 4 3 +t43/epsg:4267>epsg:20079 epsg:4267 epsg:20079 4 3 +t43/epsg:4267>epsg:2392 epsg:4267 epsg:2392 4 3 +t43/esri:104000>epsg:20022 esri:104000 epsg:20022 4 3 +t43/esri:104000>epsg:20092 esri:104000 epsg:20092 4 3 +t43/esri:104000>epsg:2468 esri:104000 epsg:2468 4 3 +t43/esri:4267>epsg:20066 esri:4267 epsg:20066 4 3 +t43/esri:4267>epsg:2094 esri:4267 epsg:2094 4 3 +t44/epsg:4267>epsg:26703 epsg:4267 epsg:26703 4 4 +t44/epsg:4267>epsg:26748 epsg:4267 epsg:26748 4 4 +t44/epsg:4267>epsg:26795 epsg:4267 epsg:26795 4 4 +t44/esri:104000>epsg:26716 esri:104000 epsg:26716 4 4 +t44/esri:104000>epsg:26766 esri:104000 epsg:26766 4 4 +t44/esri:104000>epsg:32007 esri:104000 epsg:32007 4 4 +t44/esri:4267>epsg:26735 esri:4267 epsg:26735 4 4 +t44/esri:4267>epsg:26779 esri:4267 epsg:26779 4 4 diff --git a/golden/pom.xml b/golden/pom.xml new file mode 100644 index 0000000..d385aa0 --- /dev/null +++ b/golden/pom.xml @@ -0,0 +1,195 @@ + + + 4.0.0 + + + io.github.emilevictor.neoproj4j + neoproj4j-modules + 1.3.1-SNAPSHOT + + + neoproj4j-golden + jar + neoProj4J Golden Master Compatibility Suite + + Golden-master behavioural regression suite. + + Answers exactly one question: "did we change proj4j behaviour we did not mean to?" It has NO + opinion about correctness - that is the gie/GIGS conformance module's job, and where the two + disagree, gie always wins (see README.md, "Policy"). + + This module is NOT PUBLISHED (maven.deploy.skip / maven.install.skip). It exists to produce a + checked-in table of observed outputs for ~9,013 registry CRS plus a synthetic parameter matrix, + and to diff a fresh run against the table pinned from the released 1.4.3. + + + + + true + true + true + true + true + + UTF-8 + + + io.github.emilevictor.neoproj4j + neoproj4j + neoproj4j-epsg + ${project.version} + + + 2.2 + + + true + + + ${project.basedir} + 1.4.3 + + + + + ${golden.proj4j.groupId} + ${golden.proj4j.core.artifactId} + ${golden.proj4j.version} + + + + ${golden.proj4j.groupId} + ${golden.proj4j.epsg.artifactId} + ${golden.proj4j.version} + + + + junit + junit + test + + + org.yaml + snakeyaml + ${snakeyaml.version} + test + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + true + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + ${golden.skip} + ${golden.dir} + ${golden.baseline} + ${project.build.directory}/golden + + + -Duser.language=en -Duser.country=US -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Xmx2g + + + + + + + + + golden + + false + + + + + + golden-baseline + + org.locationtech.proj4j + proj4j + proj4j-epsg + 1.4.3 + + + + diff --git a/golden/probes.tsv b/golden/probes.tsv new file mode 100644 index 0000000..b3f05b9 --- /dev/null +++ b/golden/probes.tsv @@ -0,0 +1,48661 @@ +section key probe lon lat +PAIR t00/epsg:3821>epsg:2012 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:3821>epsg:2012 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:3821>epsg:2012 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:3821>epsg:2012 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:3821>epsg:2012 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4007>epsg:2025 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4007>epsg:2025 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4007>epsg:2025 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4007>epsg:2025 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4007>epsg:2025 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4014>epsg:2081 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4014>epsg:2081 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4014>epsg:2081 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4014>epsg:2081 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4014>epsg:2081 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4024>epsg:2163 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4024>epsg:2163 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4024>epsg:2163 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4024>epsg:2163 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4024>epsg:2163 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4034>epsg:2328 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4034>epsg:2328 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4034>epsg:2328 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4034>epsg:2328 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4034>epsg:2328 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4045>epsg:2341 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4045>epsg:2341 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4045>epsg:2341 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4045>epsg:2341 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4045>epsg:2341 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4128>epsg:2353 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4128>epsg:2353 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4128>epsg:2353 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4128>epsg:2353 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4128>epsg:2353 4 0x1.4p2 0x1.4p2 +PAIR t00/epsg:4174>epsg:2366 0 0x0.0p0 0x0.0p0 +PAIR t00/epsg:4174>epsg:2366 1 -0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4174>epsg:2366 2 0x1.4p2 -0x1.4p2 +PAIR t00/epsg:4174>epsg:2366 3 -0x1.4p2 0x1.4p2 +PAIR t00/epsg:4174>epsg:2366 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:3821>epsg:2048 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:3821>epsg:2048 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:3821>epsg:2048 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:3821>epsg:2048 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:3821>epsg:2048 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4007>epsg:2108 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4007>epsg:2108 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4007>epsg:2108 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4007>epsg:2108 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4007>epsg:2108 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4014>epsg:2121 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4014>epsg:2121 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4014>epsg:2121 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4014>epsg:2121 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4014>epsg:2121 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4024>epsg:2134 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4024>epsg:2134 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4024>epsg:2134 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4024>epsg:2134 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4024>epsg:2134 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4034>epsg:2150 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4034>epsg:2150 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4034>epsg:2150 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4034>epsg:2150 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4034>epsg:2150 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4045>epsg:2193 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4045>epsg:2193 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4045>epsg:2193 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4045>epsg:2193 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4045>epsg:2193 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4128>epsg:22174 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4128>epsg:22174 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4128>epsg:22174 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4128>epsg:22174 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4128>epsg:22174 4 0x1.4p2 0x1.4p2 +PAIR t01/epsg:4174>epsg:2224 0 0x0.0p0 0x0.0p0 +PAIR t01/epsg:4174>epsg:2224 1 -0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4174>epsg:2224 2 0x1.4p2 -0x1.4p2 +PAIR t01/epsg:4174>epsg:2224 3 -0x1.4p2 0x1.4p2 +PAIR t01/epsg:4174>epsg:2224 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:3821>epsg:2006 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:3821>epsg:2006 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:3821>epsg:2006 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:3821>epsg:2006 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:3821>epsg:2006 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4007>epsg:20355 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4007>epsg:20355 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4007>epsg:20355 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4007>epsg:20355 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4007>epsg:20355 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4014>epsg:2044 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4014>epsg:2044 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4014>epsg:2044 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4014>epsg:2044 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4014>epsg:2044 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4024>epsg:2064 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4024>epsg:2064 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4024>epsg:2064 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4024>epsg:2064 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4024>epsg:2064 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4034>epsg:2079 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4034>epsg:2079 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4034>epsg:2079 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4034>epsg:2079 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4034>epsg:2079 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4045>epsg:2092 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4045>epsg:2092 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4045>epsg:2092 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4045>epsg:2092 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4045>epsg:2092 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4128>epsg:21100 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4128>epsg:21100 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4128>epsg:21100 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4128>epsg:21100 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4128>epsg:21100 4 0x1.4p2 0x1.4p2 +PAIR t02/epsg:4174>epsg:21418 0 0x0.0p0 0x0.0p0 +PAIR t02/epsg:4174>epsg:21418 1 -0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4174>epsg:21418 2 0x1.4p2 -0x1.4p2 +PAIR t02/epsg:4174>epsg:21418 3 -0x1.4p2 0x1.4p2 +PAIR t02/epsg:4174>epsg:21418 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:3821>epsg:20009 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:3821>epsg:20009 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:3821>epsg:20009 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:3821>epsg:20009 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:3821>epsg:20009 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4007>epsg:20022 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4007>epsg:20022 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4007>epsg:20022 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4007>epsg:20022 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4007>epsg:20022 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4014>epsg:20066 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4014>epsg:20066 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4014>epsg:20066 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4014>epsg:20066 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4014>epsg:20066 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4024>epsg:20079 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4024>epsg:20079 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4024>epsg:20079 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4024>epsg:20079 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4024>epsg:20079 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4034>epsg:20092 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4034>epsg:20092 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4034>epsg:20092 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4034>epsg:20092 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4034>epsg:20092 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4045>epsg:2094 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4045>epsg:2094 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4045>epsg:2094 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4045>epsg:2094 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4045>epsg:2094 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4128>epsg:2392 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4128>epsg:2392 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4128>epsg:2392 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4128>epsg:2392 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4128>epsg:2392 4 0x1.4p2 0x1.4p2 +PAIR t03/epsg:4174>epsg:2468 0 0x0.0p0 0x0.0p0 +PAIR t03/epsg:4174>epsg:2468 1 -0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4174>epsg:2468 2 0x1.4p2 -0x1.4p2 +PAIR t03/epsg:4174>epsg:2468 3 -0x1.4p2 0x1.4p2 +PAIR t03/epsg:4174>epsg:2468 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:3821>epsg:26703 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:3821>epsg:26703 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:3821>epsg:26703 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:3821>epsg:26703 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:3821>epsg:26703 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4007>epsg:26716 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4007>epsg:26716 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4007>epsg:26716 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4007>epsg:26716 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4007>epsg:26716 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4014>epsg:26735 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4014>epsg:26735 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4014>epsg:26735 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4014>epsg:26735 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4014>epsg:26735 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4024>epsg:26748 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4024>epsg:26748 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4024>epsg:26748 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4024>epsg:26748 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4024>epsg:26748 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4034>epsg:26766 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4034>epsg:26766 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4034>epsg:26766 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4034>epsg:26766 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4034>epsg:26766 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4045>epsg:26779 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4045>epsg:26779 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4045>epsg:26779 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4045>epsg:26779 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4045>epsg:26779 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4128>epsg:26795 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4128>epsg:26795 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4128>epsg:26795 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4128>epsg:26795 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4128>epsg:26795 4 0x1.4p2 0x1.4p2 +PAIR t04/epsg:4174>epsg:32007 0 0x0.0p0 0x0.0p0 +PAIR t04/epsg:4174>epsg:32007 1 -0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4174>epsg:32007 2 0x1.4p2 -0x1.4p2 +PAIR t04/epsg:4174>epsg:32007 3 -0x1.4p2 0x1.4p2 +PAIR t04/epsg:4174>epsg:32007 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:3824>epsg:2012 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:3824>epsg:2012 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:3824>epsg:2012 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:3824>epsg:2012 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:3824>epsg:2012 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4075>epsg:2025 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4075>epsg:2025 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4075>epsg:2025 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4075>epsg:2025 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4075>epsg:2025 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4152>epsg:2081 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4152>epsg:2081 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4152>epsg:2081 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4152>epsg:2081 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4152>epsg:2081 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4173>epsg:2163 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4173>epsg:2163 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4173>epsg:2163 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4173>epsg:2163 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4173>epsg:2163 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4283>epsg:2328 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4283>epsg:2328 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4283>epsg:2328 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4283>epsg:2328 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4283>epsg:2328 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4617>epsg:2341 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4617>epsg:2341 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4617>epsg:2341 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4617>epsg:2341 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4617>epsg:2341 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4667>epsg:2353 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4667>epsg:2353 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4667>epsg:2353 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4667>epsg:2353 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4667>epsg:2353 4 0x1.4p2 0x1.4p2 +PAIR t10/epsg:4737>epsg:2366 0 0x0.0p0 0x0.0p0 +PAIR t10/epsg:4737>epsg:2366 1 -0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4737>epsg:2366 2 0x1.4p2 -0x1.4p2 +PAIR t10/epsg:4737>epsg:2366 3 -0x1.4p2 0x1.4p2 +PAIR t10/epsg:4737>epsg:2366 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:3824>epsg:2048 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:3824>epsg:2048 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:3824>epsg:2048 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:3824>epsg:2048 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:3824>epsg:2048 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4075>epsg:2108 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4075>epsg:2108 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4075>epsg:2108 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4075>epsg:2108 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4075>epsg:2108 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4152>epsg:2121 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4152>epsg:2121 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4152>epsg:2121 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4152>epsg:2121 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4152>epsg:2121 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4173>epsg:2134 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4173>epsg:2134 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4173>epsg:2134 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4173>epsg:2134 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4173>epsg:2134 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4283>epsg:2150 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4283>epsg:2150 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4283>epsg:2150 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4283>epsg:2150 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4283>epsg:2150 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4617>epsg:2193 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4617>epsg:2193 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4617>epsg:2193 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4617>epsg:2193 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4617>epsg:2193 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4667>epsg:22174 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4667>epsg:22174 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4667>epsg:22174 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4667>epsg:22174 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4667>epsg:22174 4 0x1.4p2 0x1.4p2 +PAIR t11/epsg:4737>epsg:2224 0 0x0.0p0 0x0.0p0 +PAIR t11/epsg:4737>epsg:2224 1 -0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4737>epsg:2224 2 0x1.4p2 -0x1.4p2 +PAIR t11/epsg:4737>epsg:2224 3 -0x1.4p2 0x1.4p2 +PAIR t11/epsg:4737>epsg:2224 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:3824>epsg:2006 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:3824>epsg:2006 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:3824>epsg:2006 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:3824>epsg:2006 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:3824>epsg:2006 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4075>epsg:20355 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4075>epsg:20355 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4075>epsg:20355 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4075>epsg:20355 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4075>epsg:20355 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4152>epsg:2044 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4152>epsg:2044 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4152>epsg:2044 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4152>epsg:2044 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4152>epsg:2044 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4173>epsg:2064 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4173>epsg:2064 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4173>epsg:2064 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4173>epsg:2064 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4173>epsg:2064 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4283>epsg:2079 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4283>epsg:2079 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4283>epsg:2079 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4283>epsg:2079 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4283>epsg:2079 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4617>epsg:2092 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4617>epsg:2092 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4617>epsg:2092 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4617>epsg:2092 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4617>epsg:2092 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4667>epsg:21100 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4667>epsg:21100 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4667>epsg:21100 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4667>epsg:21100 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4667>epsg:21100 4 0x1.4p2 0x1.4p2 +PAIR t12/epsg:4737>epsg:21418 0 0x0.0p0 0x0.0p0 +PAIR t12/epsg:4737>epsg:21418 1 -0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4737>epsg:21418 2 0x1.4p2 -0x1.4p2 +PAIR t12/epsg:4737>epsg:21418 3 -0x1.4p2 0x1.4p2 +PAIR t12/epsg:4737>epsg:21418 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:3824>epsg:20009 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:3824>epsg:20009 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:3824>epsg:20009 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:3824>epsg:20009 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:3824>epsg:20009 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4075>epsg:20022 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4075>epsg:20022 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4075>epsg:20022 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4075>epsg:20022 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4075>epsg:20022 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4152>epsg:20066 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4152>epsg:20066 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4152>epsg:20066 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4152>epsg:20066 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4152>epsg:20066 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4173>epsg:20079 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4173>epsg:20079 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4173>epsg:20079 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4173>epsg:20079 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4173>epsg:20079 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4283>epsg:20092 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4283>epsg:20092 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4283>epsg:20092 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4283>epsg:20092 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4283>epsg:20092 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4617>epsg:2094 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4617>epsg:2094 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4617>epsg:2094 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4617>epsg:2094 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4617>epsg:2094 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4667>epsg:2392 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4667>epsg:2392 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4667>epsg:2392 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4667>epsg:2392 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4667>epsg:2392 4 0x1.4p2 0x1.4p2 +PAIR t13/epsg:4737>epsg:2468 0 0x0.0p0 0x0.0p0 +PAIR t13/epsg:4737>epsg:2468 1 -0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4737>epsg:2468 2 0x1.4p2 -0x1.4p2 +PAIR t13/epsg:4737>epsg:2468 3 -0x1.4p2 0x1.4p2 +PAIR t13/epsg:4737>epsg:2468 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:3824>epsg:26703 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:3824>epsg:26703 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:3824>epsg:26703 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:3824>epsg:26703 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:3824>epsg:26703 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4075>epsg:26716 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4075>epsg:26716 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4075>epsg:26716 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4075>epsg:26716 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4075>epsg:26716 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4152>epsg:26735 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4152>epsg:26735 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4152>epsg:26735 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4152>epsg:26735 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4152>epsg:26735 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4173>epsg:26748 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4173>epsg:26748 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4173>epsg:26748 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4173>epsg:26748 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4173>epsg:26748 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4283>epsg:26766 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4283>epsg:26766 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4283>epsg:26766 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4283>epsg:26766 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4283>epsg:26766 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4617>epsg:26779 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4617>epsg:26779 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4617>epsg:26779 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4617>epsg:26779 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4617>epsg:26779 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4667>epsg:26795 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4667>epsg:26795 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4667>epsg:26795 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4667>epsg:26795 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4667>epsg:26795 4 0x1.4p2 0x1.4p2 +PAIR t14/epsg:4737>epsg:32007 0 0x0.0p0 0x0.0p0 +PAIR t14/epsg:4737>epsg:32007 1 -0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4737>epsg:32007 2 0x1.4p2 -0x1.4p2 +PAIR t14/epsg:4737>epsg:32007 3 -0x1.4p2 0x1.4p2 +PAIR t14/epsg:4737>epsg:32007 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:3906>epsg:2012 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:3906>epsg:2012 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:3906>epsg:2012 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:3906>epsg:2012 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:3906>epsg:2012 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4132>epsg:2025 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4132>epsg:2025 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4132>epsg:2025 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4132>epsg:2025 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4132>epsg:2025 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4145>epsg:2081 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4145>epsg:2081 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4145>epsg:2081 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4145>epsg:2081 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4145>epsg:2081 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4155>epsg:2163 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4155>epsg:2163 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4155>epsg:2163 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4155>epsg:2163 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4155>epsg:2163 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4168>epsg:2328 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4168>epsg:2328 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4168>epsg:2328 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4168>epsg:2328 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4168>epsg:2328 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4192>epsg:2341 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4192>epsg:2341 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4192>epsg:2341 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4192>epsg:2341 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4192>epsg:2341 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4207>epsg:2353 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4207>epsg:2353 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4207>epsg:2353 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4207>epsg:2353 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4207>epsg:2353 4 0x1.4p2 0x1.4p2 +PAIR t20/epsg:4214>epsg:2366 0 0x0.0p0 0x0.0p0 +PAIR t20/epsg:4214>epsg:2366 1 -0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4214>epsg:2366 2 0x1.4p2 -0x1.4p2 +PAIR t20/epsg:4214>epsg:2366 3 -0x1.4p2 0x1.4p2 +PAIR t20/epsg:4214>epsg:2366 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:3906>epsg:2048 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:3906>epsg:2048 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:3906>epsg:2048 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:3906>epsg:2048 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:3906>epsg:2048 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4132>epsg:2108 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4132>epsg:2108 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4132>epsg:2108 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4132>epsg:2108 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4132>epsg:2108 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4145>epsg:2121 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4145>epsg:2121 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4145>epsg:2121 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4145>epsg:2121 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4145>epsg:2121 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4155>epsg:2134 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4155>epsg:2134 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4155>epsg:2134 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4155>epsg:2134 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4155>epsg:2134 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4168>epsg:2150 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4168>epsg:2150 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4168>epsg:2150 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4168>epsg:2150 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4168>epsg:2150 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4192>epsg:2193 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4192>epsg:2193 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4192>epsg:2193 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4192>epsg:2193 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4192>epsg:2193 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4207>epsg:22174 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4207>epsg:22174 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4207>epsg:22174 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4207>epsg:22174 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4207>epsg:22174 4 0x1.4p2 0x1.4p2 +PAIR t21/epsg:4214>epsg:2224 0 0x0.0p0 0x0.0p0 +PAIR t21/epsg:4214>epsg:2224 1 -0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4214>epsg:2224 2 0x1.4p2 -0x1.4p2 +PAIR t21/epsg:4214>epsg:2224 3 -0x1.4p2 0x1.4p2 +PAIR t21/epsg:4214>epsg:2224 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:3906>epsg:2006 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:3906>epsg:2006 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:3906>epsg:2006 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:3906>epsg:2006 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:3906>epsg:2006 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4132>epsg:20355 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4132>epsg:20355 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4132>epsg:20355 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4132>epsg:20355 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4132>epsg:20355 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4145>epsg:2044 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4145>epsg:2044 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4145>epsg:2044 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4145>epsg:2044 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4145>epsg:2044 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4155>epsg:2064 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4155>epsg:2064 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4155>epsg:2064 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4155>epsg:2064 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4155>epsg:2064 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4168>epsg:2079 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4168>epsg:2079 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4168>epsg:2079 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4168>epsg:2079 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4168>epsg:2079 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4192>epsg:2092 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4192>epsg:2092 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4192>epsg:2092 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4192>epsg:2092 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4192>epsg:2092 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4207>epsg:21100 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4207>epsg:21100 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4207>epsg:21100 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4207>epsg:21100 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4207>epsg:21100 4 0x1.4p2 0x1.4p2 +PAIR t22/epsg:4214>epsg:21418 0 0x0.0p0 0x0.0p0 +PAIR t22/epsg:4214>epsg:21418 1 -0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4214>epsg:21418 2 0x1.4p2 -0x1.4p2 +PAIR t22/epsg:4214>epsg:21418 3 -0x1.4p2 0x1.4p2 +PAIR t22/epsg:4214>epsg:21418 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:3906>epsg:20009 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:3906>epsg:20009 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:3906>epsg:20009 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:3906>epsg:20009 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:3906>epsg:20009 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4132>epsg:20022 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4132>epsg:20022 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4132>epsg:20022 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4132>epsg:20022 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4132>epsg:20022 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4145>epsg:20066 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4145>epsg:20066 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4145>epsg:20066 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4145>epsg:20066 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4145>epsg:20066 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4155>epsg:20079 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4155>epsg:20079 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4155>epsg:20079 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4155>epsg:20079 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4155>epsg:20079 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4168>epsg:20092 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4168>epsg:20092 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4168>epsg:20092 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4168>epsg:20092 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4168>epsg:20092 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4192>epsg:2094 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4192>epsg:2094 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4192>epsg:2094 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4192>epsg:2094 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4192>epsg:2094 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4207>epsg:2392 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4207>epsg:2392 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4207>epsg:2392 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4207>epsg:2392 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4207>epsg:2392 4 0x1.4p2 0x1.4p2 +PAIR t23/epsg:4214>epsg:2468 0 0x0.0p0 0x0.0p0 +PAIR t23/epsg:4214>epsg:2468 1 -0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4214>epsg:2468 2 0x1.4p2 -0x1.4p2 +PAIR t23/epsg:4214>epsg:2468 3 -0x1.4p2 0x1.4p2 +PAIR t23/epsg:4214>epsg:2468 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:3906>epsg:26703 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:3906>epsg:26703 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:3906>epsg:26703 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:3906>epsg:26703 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:3906>epsg:26703 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4132>epsg:26716 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4132>epsg:26716 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4132>epsg:26716 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4132>epsg:26716 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4132>epsg:26716 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4145>epsg:26735 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4145>epsg:26735 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4145>epsg:26735 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4145>epsg:26735 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4145>epsg:26735 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4155>epsg:26748 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4155>epsg:26748 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4155>epsg:26748 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4155>epsg:26748 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4155>epsg:26748 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4168>epsg:26766 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4168>epsg:26766 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4168>epsg:26766 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4168>epsg:26766 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4168>epsg:26766 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4192>epsg:26779 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4192>epsg:26779 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4192>epsg:26779 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4192>epsg:26779 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4192>epsg:26779 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4207>epsg:26795 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4207>epsg:26795 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4207>epsg:26795 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4207>epsg:26795 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4207>epsg:26795 4 0x1.4p2 0x1.4p2 +PAIR t24/epsg:4214>epsg:32007 0 0x0.0p0 0x0.0p0 +PAIR t24/epsg:4214>epsg:32007 1 -0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4214>epsg:32007 2 0x1.4p2 -0x1.4p2 +PAIR t24/epsg:4214>epsg:32007 3 -0x1.4p2 0x1.4p2 +PAIR t24/epsg:4214>epsg:32007 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:3819>epsg:2012 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:3819>epsg:2012 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:3819>epsg:2012 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:3819>epsg:2012 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:3819>epsg:2012 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4188>epsg:2025 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4188>epsg:2025 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4188>epsg:2025 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4188>epsg:2025 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4188>epsg:2025 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4232>epsg:2081 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4232>epsg:2081 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4232>epsg:2081 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4232>epsg:2081 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4232>epsg:2081 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4289>epsg:2163 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4289>epsg:2163 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4289>epsg:2163 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4289>epsg:2163 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4289>epsg:2163 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4322>epsg:2328 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4322>epsg:2328 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4322>epsg:2328 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4322>epsg:2328 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4322>epsg:2328 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4660>epsg:2341 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4660>epsg:2341 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4660>epsg:2341 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4660>epsg:2341 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4660>epsg:2341 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4691>epsg:2353 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4691>epsg:2353 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4691>epsg:2353 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4691>epsg:2353 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4691>epsg:2353 4 0x1.4p2 0x1.4p2 +PAIR t30/epsg:4817>epsg:2366 0 0x0.0p0 0x0.0p0 +PAIR t30/epsg:4817>epsg:2366 1 -0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4817>epsg:2366 2 0x1.4p2 -0x1.4p2 +PAIR t30/epsg:4817>epsg:2366 3 -0x1.4p2 0x1.4p2 +PAIR t30/epsg:4817>epsg:2366 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:3819>epsg:2048 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:3819>epsg:2048 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:3819>epsg:2048 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:3819>epsg:2048 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:3819>epsg:2048 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4188>epsg:2108 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4188>epsg:2108 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4188>epsg:2108 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4188>epsg:2108 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4188>epsg:2108 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4232>epsg:2121 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4232>epsg:2121 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4232>epsg:2121 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4232>epsg:2121 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4232>epsg:2121 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4289>epsg:2134 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4289>epsg:2134 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4289>epsg:2134 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4289>epsg:2134 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4289>epsg:2134 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4322>epsg:2150 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4322>epsg:2150 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4322>epsg:2150 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4322>epsg:2150 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4322>epsg:2150 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4660>epsg:2193 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4660>epsg:2193 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4660>epsg:2193 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4660>epsg:2193 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4660>epsg:2193 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4691>epsg:22174 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4691>epsg:22174 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4691>epsg:22174 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4691>epsg:22174 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4691>epsg:22174 4 0x1.4p2 0x1.4p2 +PAIR t31/epsg:4817>epsg:2224 0 0x0.0p0 0x0.0p0 +PAIR t31/epsg:4817>epsg:2224 1 -0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4817>epsg:2224 2 0x1.4p2 -0x1.4p2 +PAIR t31/epsg:4817>epsg:2224 3 -0x1.4p2 0x1.4p2 +PAIR t31/epsg:4817>epsg:2224 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:3819>epsg:2006 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:3819>epsg:2006 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:3819>epsg:2006 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:3819>epsg:2006 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:3819>epsg:2006 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4188>epsg:20355 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4188>epsg:20355 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4188>epsg:20355 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4188>epsg:20355 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4188>epsg:20355 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4232>epsg:2044 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4232>epsg:2044 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4232>epsg:2044 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4232>epsg:2044 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4232>epsg:2044 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4289>epsg:2064 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4289>epsg:2064 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4289>epsg:2064 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4289>epsg:2064 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4289>epsg:2064 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4322>epsg:2079 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4322>epsg:2079 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4322>epsg:2079 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4322>epsg:2079 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4322>epsg:2079 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4660>epsg:2092 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4660>epsg:2092 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4660>epsg:2092 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4660>epsg:2092 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4660>epsg:2092 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4691>epsg:21100 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4691>epsg:21100 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4691>epsg:21100 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4691>epsg:21100 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4691>epsg:21100 4 0x1.4p2 0x1.4p2 +PAIR t32/epsg:4817>epsg:21418 0 0x0.0p0 0x0.0p0 +PAIR t32/epsg:4817>epsg:21418 1 -0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4817>epsg:21418 2 0x1.4p2 -0x1.4p2 +PAIR t32/epsg:4817>epsg:21418 3 -0x1.4p2 0x1.4p2 +PAIR t32/epsg:4817>epsg:21418 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:3819>epsg:20009 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:3819>epsg:20009 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:3819>epsg:20009 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:3819>epsg:20009 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:3819>epsg:20009 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4188>epsg:20022 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4188>epsg:20022 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4188>epsg:20022 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4188>epsg:20022 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4188>epsg:20022 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4232>epsg:20066 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4232>epsg:20066 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4232>epsg:20066 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4232>epsg:20066 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4232>epsg:20066 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4289>epsg:20079 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4289>epsg:20079 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4289>epsg:20079 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4289>epsg:20079 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4289>epsg:20079 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4322>epsg:20092 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4322>epsg:20092 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4322>epsg:20092 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4322>epsg:20092 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4322>epsg:20092 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4660>epsg:2094 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4660>epsg:2094 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4660>epsg:2094 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4660>epsg:2094 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4660>epsg:2094 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4691>epsg:2392 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4691>epsg:2392 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4691>epsg:2392 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4691>epsg:2392 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4691>epsg:2392 4 0x1.4p2 0x1.4p2 +PAIR t33/epsg:4817>epsg:2468 0 0x0.0p0 0x0.0p0 +PAIR t33/epsg:4817>epsg:2468 1 -0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4817>epsg:2468 2 0x1.4p2 -0x1.4p2 +PAIR t33/epsg:4817>epsg:2468 3 -0x1.4p2 0x1.4p2 +PAIR t33/epsg:4817>epsg:2468 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:3819>epsg:26703 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:3819>epsg:26703 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:3819>epsg:26703 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:3819>epsg:26703 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:3819>epsg:26703 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4188>epsg:26716 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4188>epsg:26716 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4188>epsg:26716 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4188>epsg:26716 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4188>epsg:26716 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4232>epsg:26735 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4232>epsg:26735 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4232>epsg:26735 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4232>epsg:26735 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4232>epsg:26735 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4289>epsg:26748 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4289>epsg:26748 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4289>epsg:26748 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4289>epsg:26748 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4289>epsg:26748 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4322>epsg:26766 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4322>epsg:26766 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4322>epsg:26766 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4322>epsg:26766 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4322>epsg:26766 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4660>epsg:26779 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4660>epsg:26779 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4660>epsg:26779 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4660>epsg:26779 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4660>epsg:26779 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4691>epsg:26795 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4691>epsg:26795 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4691>epsg:26795 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4691>epsg:26795 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4691>epsg:26795 4 0x1.4p2 0x1.4p2 +PAIR t34/epsg:4817>epsg:32007 0 0x0.0p0 0x0.0p0 +PAIR t34/epsg:4817>epsg:32007 1 -0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4817>epsg:32007 2 0x1.4p2 -0x1.4p2 +PAIR t34/epsg:4817>epsg:32007 3 -0x1.4p2 0x1.4p2 +PAIR t34/epsg:4817>epsg:32007 4 0x1.4p2 0x1.4p2 +PAIR t40/epsg:4267>epsg:2012 0 -0x1.9p6 0x1.68p5 +PAIR t40/epsg:4267>epsg:2012 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/epsg:4267>epsg:2012 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/epsg:4267>epsg:2012 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/epsg:4267>epsg:2012 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/epsg:4267>epsg:2163 0 -0x1.9p6 0x1.68p5 +PAIR t40/epsg:4267>epsg:2163 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/epsg:4267>epsg:2163 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/epsg:4267>epsg:2163 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/epsg:4267>epsg:2163 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/epsg:4267>epsg:2353 0 -0x1.9p6 0x1.68p5 +PAIR t40/epsg:4267>epsg:2353 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/epsg:4267>epsg:2353 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/epsg:4267>epsg:2353 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/epsg:4267>epsg:2353 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/esri:104000>epsg:2025 0 -0x1.9p6 0x1.68p5 +PAIR t40/esri:104000>epsg:2025 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/esri:104000>epsg:2025 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/esri:104000>epsg:2025 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/esri:104000>epsg:2025 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/esri:104000>epsg:2328 0 -0x1.9p6 0x1.68p5 +PAIR t40/esri:104000>epsg:2328 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/esri:104000>epsg:2328 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/esri:104000>epsg:2328 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/esri:104000>epsg:2328 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/esri:104000>epsg:2366 0 -0x1.9p6 0x1.68p5 +PAIR t40/esri:104000>epsg:2366 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/esri:104000>epsg:2366 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/esri:104000>epsg:2366 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/esri:104000>epsg:2366 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/esri:4267>epsg:2081 0 -0x1.9p6 0x1.68p5 +PAIR t40/esri:4267>epsg:2081 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/esri:4267>epsg:2081 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/esri:4267>epsg:2081 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/esri:4267>epsg:2081 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t40/esri:4267>epsg:2341 0 -0x1.9p6 0x1.68p5 +PAIR t40/esri:4267>epsg:2341 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t40/esri:4267>epsg:2341 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t40/esri:4267>epsg:2341 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t40/esri:4267>epsg:2341 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/epsg:4267>epsg:2048 0 -0x1.9p6 0x1.68p5 +PAIR t41/epsg:4267>epsg:2048 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/epsg:4267>epsg:2048 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/epsg:4267>epsg:2048 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/epsg:4267>epsg:2048 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/epsg:4267>epsg:2134 0 -0x1.9p6 0x1.68p5 +PAIR t41/epsg:4267>epsg:2134 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/epsg:4267>epsg:2134 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/epsg:4267>epsg:2134 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/epsg:4267>epsg:2134 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/epsg:4267>epsg:22174 0 -0x1.9p6 0x1.68p5 +PAIR t41/epsg:4267>epsg:22174 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/epsg:4267>epsg:22174 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/epsg:4267>epsg:22174 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/epsg:4267>epsg:22174 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/esri:104000>epsg:2108 0 -0x1.9p6 0x1.68p5 +PAIR t41/esri:104000>epsg:2108 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/esri:104000>epsg:2108 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/esri:104000>epsg:2108 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/esri:104000>epsg:2108 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/esri:104000>epsg:2150 0 -0x1.9p6 0x1.68p5 +PAIR t41/esri:104000>epsg:2150 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/esri:104000>epsg:2150 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/esri:104000>epsg:2150 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/esri:104000>epsg:2150 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/esri:104000>epsg:2224 0 -0x1.9p6 0x1.68p5 +PAIR t41/esri:104000>epsg:2224 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/esri:104000>epsg:2224 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/esri:104000>epsg:2224 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/esri:104000>epsg:2224 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/esri:4267>epsg:2121 0 -0x1.9p6 0x1.68p5 +PAIR t41/esri:4267>epsg:2121 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/esri:4267>epsg:2121 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/esri:4267>epsg:2121 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/esri:4267>epsg:2121 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t41/esri:4267>epsg:2193 0 -0x1.9p6 0x1.68p5 +PAIR t41/esri:4267>epsg:2193 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t41/esri:4267>epsg:2193 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t41/esri:4267>epsg:2193 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t41/esri:4267>epsg:2193 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/epsg:4267>epsg:2006 0 -0x1.9p6 0x1.68p5 +PAIR t42/epsg:4267>epsg:2006 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/epsg:4267>epsg:2006 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/epsg:4267>epsg:2006 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/epsg:4267>epsg:2006 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/epsg:4267>epsg:2064 0 -0x1.9p6 0x1.68p5 +PAIR t42/epsg:4267>epsg:2064 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/epsg:4267>epsg:2064 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/epsg:4267>epsg:2064 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/epsg:4267>epsg:2064 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/epsg:4267>epsg:21100 0 -0x1.9p6 0x1.68p5 +PAIR t42/epsg:4267>epsg:21100 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/epsg:4267>epsg:21100 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/epsg:4267>epsg:21100 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/epsg:4267>epsg:21100 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/esri:104000>epsg:20355 0 -0x1.9p6 0x1.68p5 +PAIR t42/esri:104000>epsg:20355 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/esri:104000>epsg:20355 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/esri:104000>epsg:20355 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/esri:104000>epsg:20355 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/esri:104000>epsg:2079 0 -0x1.9p6 0x1.68p5 +PAIR t42/esri:104000>epsg:2079 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/esri:104000>epsg:2079 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/esri:104000>epsg:2079 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/esri:104000>epsg:2079 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/esri:104000>epsg:21418 0 -0x1.9p6 0x1.68p5 +PAIR t42/esri:104000>epsg:21418 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/esri:104000>epsg:21418 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/esri:104000>epsg:21418 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/esri:104000>epsg:21418 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/esri:4267>epsg:2044 0 -0x1.9p6 0x1.68p5 +PAIR t42/esri:4267>epsg:2044 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/esri:4267>epsg:2044 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/esri:4267>epsg:2044 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/esri:4267>epsg:2044 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t42/esri:4267>epsg:2092 0 -0x1.9p6 0x1.68p5 +PAIR t42/esri:4267>epsg:2092 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t42/esri:4267>epsg:2092 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t42/esri:4267>epsg:2092 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t42/esri:4267>epsg:2092 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/epsg:4267>epsg:20009 0 -0x1.9p6 0x1.68p5 +PAIR t43/epsg:4267>epsg:20009 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/epsg:4267>epsg:20009 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/epsg:4267>epsg:20009 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/epsg:4267>epsg:20009 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/epsg:4267>epsg:20079 0 -0x1.9p6 0x1.68p5 +PAIR t43/epsg:4267>epsg:20079 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/epsg:4267>epsg:20079 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/epsg:4267>epsg:20079 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/epsg:4267>epsg:20079 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/epsg:4267>epsg:2392 0 -0x1.9p6 0x1.68p5 +PAIR t43/epsg:4267>epsg:2392 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/epsg:4267>epsg:2392 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/epsg:4267>epsg:2392 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/epsg:4267>epsg:2392 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/esri:104000>epsg:20022 0 -0x1.9p6 0x1.68p5 +PAIR t43/esri:104000>epsg:20022 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/esri:104000>epsg:20022 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/esri:104000>epsg:20022 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/esri:104000>epsg:20022 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/esri:104000>epsg:20092 0 -0x1.9p6 0x1.68p5 +PAIR t43/esri:104000>epsg:20092 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/esri:104000>epsg:20092 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/esri:104000>epsg:20092 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/esri:104000>epsg:20092 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/esri:104000>epsg:2468 0 -0x1.9p6 0x1.68p5 +PAIR t43/esri:104000>epsg:2468 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/esri:104000>epsg:2468 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/esri:104000>epsg:2468 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/esri:104000>epsg:2468 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/esri:4267>epsg:20066 0 -0x1.9p6 0x1.68p5 +PAIR t43/esri:4267>epsg:20066 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/esri:4267>epsg:20066 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/esri:4267>epsg:20066 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/esri:4267>epsg:20066 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t43/esri:4267>epsg:2094 0 -0x1.9p6 0x1.68p5 +PAIR t43/esri:4267>epsg:2094 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t43/esri:4267>epsg:2094 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t43/esri:4267>epsg:2094 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t43/esri:4267>epsg:2094 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/epsg:4267>epsg:26703 0 -0x1.9p6 0x1.68p5 +PAIR t44/epsg:4267>epsg:26703 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/epsg:4267>epsg:26703 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/epsg:4267>epsg:26703 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/epsg:4267>epsg:26703 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/epsg:4267>epsg:26748 0 -0x1.9p6 0x1.68p5 +PAIR t44/epsg:4267>epsg:26748 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/epsg:4267>epsg:26748 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/epsg:4267>epsg:26748 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/epsg:4267>epsg:26748 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/epsg:4267>epsg:26795 0 -0x1.9p6 0x1.68p5 +PAIR t44/epsg:4267>epsg:26795 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/epsg:4267>epsg:26795 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/epsg:4267>epsg:26795 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/epsg:4267>epsg:26795 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/esri:104000>epsg:26716 0 -0x1.9p6 0x1.68p5 +PAIR t44/esri:104000>epsg:26716 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/esri:104000>epsg:26716 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/esri:104000>epsg:26716 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/esri:104000>epsg:26716 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/esri:104000>epsg:26766 0 -0x1.9p6 0x1.68p5 +PAIR t44/esri:104000>epsg:26766 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/esri:104000>epsg:26766 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/esri:104000>epsg:26766 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/esri:104000>epsg:26766 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/esri:104000>epsg:32007 0 -0x1.9p6 0x1.68p5 +PAIR t44/esri:104000>epsg:32007 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/esri:104000>epsg:32007 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/esri:104000>epsg:32007 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/esri:104000>epsg:32007 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/esri:4267>epsg:26735 0 -0x1.9p6 0x1.68p5 +PAIR t44/esri:4267>epsg:26735 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/esri:4267>epsg:26735 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/esri:4267>epsg:26735 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/esri:4267>epsg:26735 4 -0x1.73b739ffe0f54p6 0x1.9p5 +PAIR t44/esri:4267>epsg:26779 0 -0x1.9p6 0x1.68p5 +PAIR t44/esri:4267>epsg:26779 1 -0x1.ac48c6001f0acp6 0x1.4p5 +PAIR t44/esri:4267>epsg:26779 2 -0x1.73b739ffe0f54p6 0x1.4p5 +PAIR t44/esri:4267>epsg:26779 3 -0x1.ac48c6001f0acp6 0x1.9p5 +PAIR t44/esri:4267>epsg:26779 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG epsg:2000 0 -0x1.fp5 0x0.0p0 +REG epsg:2000 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2000 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2000 3 -0x1.0cp6 0x1.4p2 +REG epsg:2000 4 -0x1.c8p5 0x1.4p2 +REG epsg:20004 0 0x1.5p4 0x0.0p0 +REG epsg:20004 1 0x1.0p4 -0x1.4p2 +REG epsg:20004 2 0x1.ap4 -0x1.4p2 +REG epsg:20004 3 0x1.0p4 0x1.4p2 +REG epsg:20004 4 0x1.ap4 0x1.4p2 +REG epsg:20005 0 0x1.bp4 0x0.0p0 +REG epsg:20005 1 0x1.6p4 -0x1.4p2 +REG epsg:20005 2 0x1.0p5 -0x1.4p2 +REG epsg:20005 3 0x1.6p4 0x1.4p2 +REG epsg:20005 4 0x1.0p5 0x1.4p2 +REG epsg:20006 0 0x1.08p5 0x0.0p0 +REG epsg:20006 1 0x1.cp4 -0x1.4p2 +REG epsg:20006 2 0x1.3p5 -0x1.4p2 +REG epsg:20006 3 0x1.cp4 0x1.4p2 +REG epsg:20006 4 0x1.3p5 0x1.4p2 +REG epsg:20007 0 0x1.38p5 0x0.0p0 +REG epsg:20007 1 0x1.1p5 -0x1.4p2 +REG epsg:20007 2 0x1.6p5 -0x1.4p2 +REG epsg:20007 3 0x1.1p5 0x1.4p2 +REG epsg:20007 4 0x1.6p5 0x1.4p2 +REG epsg:20008 0 0x1.68p5 0x0.0p0 +REG epsg:20008 1 0x1.4p5 -0x1.4p2 +REG epsg:20008 2 0x1.9p5 -0x1.4p2 +REG epsg:20008 3 0x1.4p5 0x1.4p2 +REG epsg:20008 4 0x1.9p5 0x1.4p2 +REG epsg:20009 0 0x1.98p5 0x0.0p0 +REG epsg:20009 1 0x1.7p5 -0x1.4p2 +REG epsg:20009 2 0x1.cp5 -0x1.4p2 +REG epsg:20009 3 0x1.7p5 0x1.4p2 +REG epsg:20009 4 0x1.cp5 0x1.4p2 +REG epsg:2001 0 -0x1.fp5 0x0.0p0 +REG epsg:2001 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2001 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2001 3 -0x1.0cp6 0x1.4p2 +REG epsg:2001 4 -0x1.c8p5 0x1.4p2 +REG epsg:20010 0 0x1.c8p5 0x0.0p0 +REG epsg:20010 1 0x1.ap5 -0x1.4p2 +REG epsg:20010 2 0x1.fp5 -0x1.4p2 +REG epsg:20010 3 0x1.ap5 0x1.4p2 +REG epsg:20010 4 0x1.fp5 0x1.4p2 +REG epsg:20011 0 0x1.f8p5 0x0.0p0 +REG epsg:20011 1 0x1.dp5 -0x1.4p2 +REG epsg:20011 2 0x1.1p6 -0x1.4p2 +REG epsg:20011 3 0x1.dp5 0x1.4p2 +REG epsg:20011 4 0x1.1p6 0x1.4p2 +REG epsg:20012 0 0x1.14p6 0x0.0p0 +REG epsg:20012 1 0x1.0p6 -0x1.4p2 +REG epsg:20012 2 0x1.28p6 -0x1.4p2 +REG epsg:20012 3 0x1.0p6 0x1.4p2 +REG epsg:20012 4 0x1.28p6 0x1.4p2 +REG epsg:20013 0 0x1.2cp6 0x0.0p0 +REG epsg:20013 1 0x1.18p6 -0x1.4p2 +REG epsg:20013 2 0x1.4p6 -0x1.4p2 +REG epsg:20013 3 0x1.18p6 0x1.4p2 +REG epsg:20013 4 0x1.4p6 0x1.4p2 +REG epsg:20014 0 0x1.44p6 0x0.0p0 +REG epsg:20014 1 0x1.3p6 -0x1.4p2 +REG epsg:20014 2 0x1.58p6 -0x1.4p2 +REG epsg:20014 3 0x1.3p6 0x1.4p2 +REG epsg:20014 4 0x1.58p6 0x1.4p2 +REG epsg:20015 0 0x1.5cp6 0x0.0p0 +REG epsg:20015 1 0x1.48p6 -0x1.4p2 +REG epsg:20015 2 0x1.7p6 -0x1.4p2 +REG epsg:20015 3 0x1.48p6 0x1.4p2 +REG epsg:20015 4 0x1.7p6 0x1.4p2 +REG epsg:20016 0 0x1.74p6 0x0.0p0 +REG epsg:20016 1 0x1.6p6 -0x1.4p2 +REG epsg:20016 2 0x1.88p6 -0x1.4p2 +REG epsg:20016 3 0x1.6p6 0x1.4p2 +REG epsg:20016 4 0x1.88p6 0x1.4p2 +REG epsg:20017 0 0x1.8cp6 0x0.0p0 +REG epsg:20017 1 0x1.78p6 -0x1.4p2 +REG epsg:20017 2 0x1.ap6 -0x1.4p2 +REG epsg:20017 3 0x1.78p6 0x1.4p2 +REG epsg:20017 4 0x1.ap6 0x1.4p2 +REG epsg:20018 0 0x1.a4p6 0x0.0p0 +REG epsg:20018 1 0x1.9p6 -0x1.4p2 +REG epsg:20018 2 0x1.b8p6 -0x1.4p2 +REG epsg:20018 3 0x1.9p6 0x1.4p2 +REG epsg:20018 4 0x1.b8p6 0x1.4p2 +REG epsg:20019 0 0x1.bcp6 0x0.0p0 +REG epsg:20019 1 0x1.a8p6 -0x1.4p2 +REG epsg:20019 2 0x1.dp6 -0x1.4p2 +REG epsg:20019 3 0x1.a8p6 0x1.4p2 +REG epsg:20019 4 0x1.dp6 0x1.4p2 +REG epsg:2002 0 -0x1.fp5 0x0.0p0 +REG epsg:2002 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2002 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2002 3 -0x1.0cp6 0x1.4p2 +REG epsg:2002 4 -0x1.c8p5 0x1.4p2 +REG epsg:20020 0 0x1.d4p6 0x0.0p0 +REG epsg:20020 1 0x1.cp6 -0x1.4p2 +REG epsg:20020 2 0x1.e8p6 -0x1.4p2 +REG epsg:20020 3 0x1.cp6 0x1.4p2 +REG epsg:20020 4 0x1.e8p6 0x1.4p2 +REG epsg:20021 0 0x1.ecp6 0x0.0p0 +REG epsg:20021 1 0x1.d8p6 -0x1.4p2 +REG epsg:20021 2 0x1.0p7 -0x1.4p2 +REG epsg:20021 3 0x1.d8p6 0x1.4p2 +REG epsg:20021 4 0x1.0p7 0x1.4p2 +REG epsg:20022 0 0x1.02p7 0x0.0p0 +REG epsg:20022 1 0x1.fp6 -0x1.4p2 +REG epsg:20022 2 0x1.0cp7 -0x1.4p2 +REG epsg:20022 3 0x1.fp6 0x1.4p2 +REG epsg:20022 4 0x1.0cp7 0x1.4p2 +REG epsg:20023 0 0x1.0ep7 0x0.0p0 +REG epsg:20023 1 0x1.04p7 -0x1.4p2 +REG epsg:20023 2 0x1.18p7 -0x1.4p2 +REG epsg:20023 3 0x1.04p7 0x1.4p2 +REG epsg:20023 4 0x1.18p7 0x1.4p2 +REG epsg:20024 0 0x1.1ap7 0x0.0p0 +REG epsg:20024 1 0x1.1p7 -0x1.4p2 +REG epsg:20024 2 0x1.24p7 -0x1.4p2 +REG epsg:20024 3 0x1.1p7 0x1.4p2 +REG epsg:20024 4 0x1.24p7 0x1.4p2 +REG epsg:20025 0 0x1.26p7 0x0.0p0 +REG epsg:20025 1 0x1.1cp7 -0x1.4p2 +REG epsg:20025 2 0x1.3p7 -0x1.4p2 +REG epsg:20025 3 0x1.1cp7 0x1.4p2 +REG epsg:20025 4 0x1.3p7 0x1.4p2 +REG epsg:20026 0 0x1.32p7 0x0.0p0 +REG epsg:20026 1 0x1.28p7 -0x1.4p2 +REG epsg:20026 2 0x1.3cp7 -0x1.4p2 +REG epsg:20026 3 0x1.28p7 0x1.4p2 +REG epsg:20026 4 0x1.3cp7 0x1.4p2 +REG epsg:20027 0 0x1.3ep7 0x0.0p0 +REG epsg:20027 1 0x1.34p7 -0x1.4p2 +REG epsg:20027 2 0x1.48p7 -0x1.4p2 +REG epsg:20027 3 0x1.34p7 0x1.4p2 +REG epsg:20027 4 0x1.48p7 0x1.4p2 +REG epsg:20028 0 0x1.4ap7 0x0.0p0 +REG epsg:20028 1 0x1.4p7 -0x1.4p2 +REG epsg:20028 2 0x1.54p7 -0x1.4p2 +REG epsg:20028 3 0x1.4p7 0x1.4p2 +REG epsg:20028 4 0x1.54p7 0x1.4p2 +REG epsg:20029 0 0x1.56p7 0x0.0p0 +REG epsg:20029 1 0x1.4cp7 -0x1.4p2 +REG epsg:20029 2 0x1.6p7 -0x1.4p2 +REG epsg:20029 3 0x1.4cp7 0x1.4p2 +REG epsg:20029 4 0x1.6p7 0x1.4p2 +REG epsg:2003 0 -0x1.fp5 0x0.0p0 +REG epsg:2003 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2003 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2003 3 -0x1.0cp6 0x1.4p2 +REG epsg:2003 4 -0x1.c8p5 0x1.4p2 +REG epsg:20030 0 0x1.62p7 0x0.0p0 +REG epsg:20030 1 0x1.58p7 -0x1.4p2 +REG epsg:20030 2 -0x1.64p7 -0x1.4p2 +REG epsg:20030 3 0x1.58p7 0x1.4p2 +REG epsg:20030 4 -0x1.64p7 0x1.4p2 +REG epsg:20031 0 -0x1.62p7 0x0.0p0 +REG epsg:20031 1 0x1.64p7 -0x1.4p2 +REG epsg:20031 2 -0x1.58p7 -0x1.4p2 +REG epsg:20031 3 0x1.64p7 0x1.4p2 +REG epsg:20031 4 -0x1.58p7 0x1.4p2 +REG epsg:20032 0 -0x1.56p7 0x0.0p0 +REG epsg:20032 1 -0x1.6p7 -0x1.4p2 +REG epsg:20032 2 -0x1.4cp7 -0x1.4p2 +REG epsg:20032 3 -0x1.6p7 0x1.4p2 +REG epsg:20032 4 -0x1.4cp7 0x1.4p2 +REG epsg:2004 0 -0x1.fp5 0x0.0p0 +REG epsg:2004 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2004 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2004 3 -0x1.0cp6 0x1.4p2 +REG epsg:2004 4 -0x1.c8p5 0x1.4p2 +REG epsg:2005 0 -0x1.fp5 0x0.0p0 +REG epsg:2005 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2005 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2005 3 -0x1.0cp6 0x1.4p2 +REG epsg:2005 4 -0x1.c8p5 0x1.4p2 +REG epsg:2006 0 -0x1.fp5 0x0.0p0 +REG epsg:2006 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2006 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2006 3 -0x1.0cp6 0x1.4p2 +REG epsg:2006 4 -0x1.c8p5 0x1.4p2 +REG epsg:20064 0 0x1.5p4 0x0.0p0 +REG epsg:20064 1 0x1.0p4 -0x1.4p2 +REG epsg:20064 2 0x1.ap4 -0x1.4p2 +REG epsg:20064 3 0x1.0p4 0x1.4p2 +REG epsg:20064 4 0x1.ap4 0x1.4p2 +REG epsg:20065 0 0x1.bp4 0x0.0p0 +REG epsg:20065 1 0x1.6p4 -0x1.4p2 +REG epsg:20065 2 0x1.0p5 -0x1.4p2 +REG epsg:20065 3 0x1.6p4 0x1.4p2 +REG epsg:20065 4 0x1.0p5 0x1.4p2 +REG epsg:20066 0 0x1.08p5 0x0.0p0 +REG epsg:20066 1 0x1.cp4 -0x1.4p2 +REG epsg:20066 2 0x1.3p5 -0x1.4p2 +REG epsg:20066 3 0x1.cp4 0x1.4p2 +REG epsg:20066 4 0x1.3p5 0x1.4p2 +REG epsg:20067 0 0x1.38p5 0x0.0p0 +REG epsg:20067 1 0x1.1p5 -0x1.4p2 +REG epsg:20067 2 0x1.6p5 -0x1.4p2 +REG epsg:20067 3 0x1.1p5 0x1.4p2 +REG epsg:20067 4 0x1.6p5 0x1.4p2 +REG epsg:20068 0 0x1.68p5 0x0.0p0 +REG epsg:20068 1 0x1.4p5 -0x1.4p2 +REG epsg:20068 2 0x1.9p5 -0x1.4p2 +REG epsg:20068 3 0x1.4p5 0x1.4p2 +REG epsg:20068 4 0x1.9p5 0x1.4p2 +REG epsg:20069 0 0x1.98p5 0x0.0p0 +REG epsg:20069 1 0x1.7p5 -0x1.4p2 +REG epsg:20069 2 0x1.cp5 -0x1.4p2 +REG epsg:20069 3 0x1.7p5 0x1.4p2 +REG epsg:20069 4 0x1.cp5 0x1.4p2 +REG epsg:2007 0 -0x1.fp5 0x0.0p0 +REG epsg:2007 1 -0x1.0cp6 -0x1.4p2 +REG epsg:2007 2 -0x1.c8p5 -0x1.4p2 +REG epsg:2007 3 -0x1.0cp6 0x1.4p2 +REG epsg:2007 4 -0x1.c8p5 0x1.4p2 +REG epsg:20070 0 0x1.c8p5 0x0.0p0 +REG epsg:20070 1 0x1.ap5 -0x1.4p2 +REG epsg:20070 2 0x1.fp5 -0x1.4p2 +REG epsg:20070 3 0x1.ap5 0x1.4p2 +REG epsg:20070 4 0x1.fp5 0x1.4p2 +REG epsg:20071 0 0x1.f8p5 0x0.0p0 +REG epsg:20071 1 0x1.dp5 -0x1.4p2 +REG epsg:20071 2 0x1.1p6 -0x1.4p2 +REG epsg:20071 3 0x1.dp5 0x1.4p2 +REG epsg:20071 4 0x1.1p6 0x1.4p2 +REG epsg:20072 0 0x1.14p6 0x0.0p0 +REG epsg:20072 1 0x1.0p6 -0x1.4p2 +REG epsg:20072 2 0x1.28p6 -0x1.4p2 +REG epsg:20072 3 0x1.0p6 0x1.4p2 +REG epsg:20072 4 0x1.28p6 0x1.4p2 +REG epsg:20073 0 0x1.2cp6 0x0.0p0 +REG epsg:20073 1 0x1.18p6 -0x1.4p2 +REG epsg:20073 2 0x1.4p6 -0x1.4p2 +REG epsg:20073 3 0x1.18p6 0x1.4p2 +REG epsg:20073 4 0x1.4p6 0x1.4p2 +REG epsg:20074 0 0x1.44p6 0x0.0p0 +REG epsg:20074 1 0x1.3p6 -0x1.4p2 +REG epsg:20074 2 0x1.58p6 -0x1.4p2 +REG epsg:20074 3 0x1.3p6 0x1.4p2 +REG epsg:20074 4 0x1.58p6 0x1.4p2 +REG epsg:20075 0 0x1.5cp6 0x0.0p0 +REG epsg:20075 1 0x1.48p6 -0x1.4p2 +REG epsg:20075 2 0x1.7p6 -0x1.4p2 +REG epsg:20075 3 0x1.48p6 0x1.4p2 +REG epsg:20075 4 0x1.7p6 0x1.4p2 +REG epsg:20076 0 0x1.74p6 0x0.0p0 +REG epsg:20076 1 0x1.6p6 -0x1.4p2 +REG epsg:20076 2 0x1.88p6 -0x1.4p2 +REG epsg:20076 3 0x1.6p6 0x1.4p2 +REG epsg:20076 4 0x1.88p6 0x1.4p2 +REG epsg:20077 0 0x1.8cp6 0x0.0p0 +REG epsg:20077 1 0x1.78p6 -0x1.4p2 +REG epsg:20077 2 0x1.ap6 -0x1.4p2 +REG epsg:20077 3 0x1.78p6 0x1.4p2 +REG epsg:20077 4 0x1.ap6 0x1.4p2 +REG epsg:20078 0 0x1.a4p6 0x0.0p0 +REG epsg:20078 1 0x1.9p6 -0x1.4p2 +REG epsg:20078 2 0x1.b8p6 -0x1.4p2 +REG epsg:20078 3 0x1.9p6 0x1.4p2 +REG epsg:20078 4 0x1.b8p6 0x1.4p2 +REG epsg:20079 0 0x1.bcp6 0x0.0p0 +REG epsg:20079 1 0x1.a8p6 -0x1.4p2 +REG epsg:20079 2 0x1.dp6 -0x1.4p2 +REG epsg:20079 3 0x1.a8p6 0x1.4p2 +REG epsg:20079 4 0x1.dp6 0x1.4p2 +REG epsg:2008 0 -0x1.bcp5 0x0.0p0 +REG epsg:2008 1 -0x1.e4p5 -0x1.4p2 +REG epsg:2008 2 -0x1.94p5 -0x1.4p2 +REG epsg:2008 3 -0x1.e4p5 0x1.4p2 +REG epsg:2008 4 -0x1.94p5 0x1.4p2 +REG epsg:20080 0 0x1.d4p6 0x0.0p0 +REG epsg:20080 1 0x1.cp6 -0x1.4p2 +REG epsg:20080 2 0x1.e8p6 -0x1.4p2 +REG epsg:20080 3 0x1.cp6 0x1.4p2 +REG epsg:20080 4 0x1.e8p6 0x1.4p2 +REG epsg:20081 0 0x1.ecp6 0x0.0p0 +REG epsg:20081 1 0x1.d8p6 -0x1.4p2 +REG epsg:20081 2 0x1.0p7 -0x1.4p2 +REG epsg:20081 3 0x1.d8p6 0x1.4p2 +REG epsg:20081 4 0x1.0p7 0x1.4p2 +REG epsg:20082 0 0x1.02p7 0x0.0p0 +REG epsg:20082 1 0x1.fp6 -0x1.4p2 +REG epsg:20082 2 0x1.0cp7 -0x1.4p2 +REG epsg:20082 3 0x1.fp6 0x1.4p2 +REG epsg:20082 4 0x1.0cp7 0x1.4p2 +REG epsg:20083 0 0x1.0ep7 0x0.0p0 +REG epsg:20083 1 0x1.04p7 -0x1.4p2 +REG epsg:20083 2 0x1.18p7 -0x1.4p2 +REG epsg:20083 3 0x1.04p7 0x1.4p2 +REG epsg:20083 4 0x1.18p7 0x1.4p2 +REG epsg:20084 0 0x1.1ap7 0x0.0p0 +REG epsg:20084 1 0x1.1p7 -0x1.4p2 +REG epsg:20084 2 0x1.24p7 -0x1.4p2 +REG epsg:20084 3 0x1.1p7 0x1.4p2 +REG epsg:20084 4 0x1.24p7 0x1.4p2 +REG epsg:20085 0 0x1.26p7 0x0.0p0 +REG epsg:20085 1 0x1.1cp7 -0x1.4p2 +REG epsg:20085 2 0x1.3p7 -0x1.4p2 +REG epsg:20085 3 0x1.1cp7 0x1.4p2 +REG epsg:20085 4 0x1.3p7 0x1.4p2 +REG epsg:20086 0 0x1.32p7 0x0.0p0 +REG epsg:20086 1 0x1.28p7 -0x1.4p2 +REG epsg:20086 2 0x1.3cp7 -0x1.4p2 +REG epsg:20086 3 0x1.28p7 0x1.4p2 +REG epsg:20086 4 0x1.3cp7 0x1.4p2 +REG epsg:20087 0 0x1.3ep7 0x0.0p0 +REG epsg:20087 1 0x1.34p7 -0x1.4p2 +REG epsg:20087 2 0x1.48p7 -0x1.4p2 +REG epsg:20087 3 0x1.34p7 0x1.4p2 +REG epsg:20087 4 0x1.48p7 0x1.4p2 +REG epsg:20088 0 0x1.4ap7 0x0.0p0 +REG epsg:20088 1 0x1.4p7 -0x1.4p2 +REG epsg:20088 2 0x1.54p7 -0x1.4p2 +REG epsg:20088 3 0x1.4p7 0x1.4p2 +REG epsg:20088 4 0x1.54p7 0x1.4p2 +REG epsg:20089 0 0x1.56p7 0x0.0p0 +REG epsg:20089 1 0x1.4cp7 -0x1.4p2 +REG epsg:20089 2 0x1.6p7 -0x1.4p2 +REG epsg:20089 3 0x1.4cp7 0x1.4p2 +REG epsg:20089 4 0x1.6p7 0x1.4p2 +REG epsg:2009 0 -0x1.d4p5 0x0.0p0 +REG epsg:2009 1 -0x1.fcp5 -0x1.4p2 +REG epsg:2009 2 -0x1.acp5 -0x1.4p2 +REG epsg:2009 3 -0x1.fcp5 0x1.4p2 +REG epsg:2009 4 -0x1.acp5 0x1.4p2 +REG epsg:20090 0 0x1.62p7 0x0.0p0 +REG epsg:20090 1 0x1.58p7 -0x1.4p2 +REG epsg:20090 2 -0x1.64p7 -0x1.4p2 +REG epsg:20090 3 0x1.58p7 0x1.4p2 +REG epsg:20090 4 -0x1.64p7 0x1.4p2 +REG epsg:20091 0 -0x1.62p7 0x0.0p0 +REG epsg:20091 1 0x1.64p7 -0x1.4p2 +REG epsg:20091 2 -0x1.58p7 -0x1.4p2 +REG epsg:20091 3 0x1.64p7 0x1.4p2 +REG epsg:20091 4 -0x1.58p7 0x1.4p2 +REG epsg:20092 0 -0x1.56p7 0x0.0p0 +REG epsg:20092 1 -0x1.6p7 -0x1.4p2 +REG epsg:20092 2 -0x1.4cp7 -0x1.4p2 +REG epsg:20092 3 -0x1.6p7 0x1.4p2 +REG epsg:20092 4 -0x1.4cp7 0x1.4p2 +REG epsg:2010 0 -0x1.ecp5 0x0.0p0 +REG epsg:2010 1 -0x1.0ap6 -0x1.4p2 +REG epsg:2010 2 -0x1.c4p5 -0x1.4p2 +REG epsg:2010 3 -0x1.0ap6 0x1.4p2 +REG epsg:2010 4 -0x1.c4p5 0x1.4p2 +REG epsg:2011 0 -0x1.02p6 0x0.0p0 +REG epsg:2011 1 -0x1.16p6 -0x1.4p2 +REG epsg:2011 2 -0x1.dcp5 -0x1.4p2 +REG epsg:2011 3 -0x1.16p6 0x1.4p2 +REG epsg:2011 4 -0x1.dcp5 0x1.4p2 +REG epsg:2012 0 -0x1.0ep6 0x0.0p0 +REG epsg:2012 1 -0x1.22p6 -0x1.4p2 +REG epsg:2012 2 -0x1.f4p5 -0x1.4p2 +REG epsg:2012 3 -0x1.22p6 0x1.4p2 +REG epsg:2012 4 -0x1.f4p5 0x1.4p2 +REG epsg:2013 0 -0x1.1ap6 0x0.0p0 +REG epsg:2013 1 -0x1.2ep6 -0x1.4p2 +REG epsg:2013 2 -0x1.06p6 -0x1.4p2 +REG epsg:2013 3 -0x1.2ep6 0x1.4p2 +REG epsg:2013 4 -0x1.06p6 0x1.4p2 +REG epsg:20135 0 0x1.bp4 0x0.0p0 +REG epsg:20135 1 0x1.6p4 -0x1.4p2 +REG epsg:20135 2 0x1.0p5 -0x1.4p2 +REG epsg:20135 3 0x1.6p4 0x1.4p2 +REG epsg:20135 4 0x1.0p5 0x1.4p2 +REG epsg:20136 0 0x1.08p5 0x0.0p0 +REG epsg:20136 1 0x1.cp4 -0x1.4p2 +REG epsg:20136 2 0x1.3p5 -0x1.4p2 +REG epsg:20136 3 0x1.cp4 0x1.4p2 +REG epsg:20136 4 0x1.3p5 0x1.4p2 +REG epsg:20137 0 0x1.38p5 0x0.0p0 +REG epsg:20137 1 0x1.1p5 -0x1.4p2 +REG epsg:20137 2 0x1.6p5 -0x1.4p2 +REG epsg:20137 3 0x1.1p5 0x1.4p2 +REG epsg:20137 4 0x1.6p5 0x1.4p2 +REG epsg:20138 0 0x1.68p5 0x0.0p0 +REG epsg:20138 1 0x1.4p5 -0x1.4p2 +REG epsg:20138 2 0x1.9p5 -0x1.4p2 +REG epsg:20138 3 0x1.4p5 0x1.4p2 +REG epsg:20138 4 0x1.9p5 0x1.4p2 +REG epsg:2014 0 -0x1.26p6 0x0.0p0 +REG epsg:2014 1 -0x1.3ap6 -0x1.4p2 +REG epsg:2014 2 -0x1.12p6 -0x1.4p2 +REG epsg:2014 3 -0x1.3ap6 0x1.4p2 +REG epsg:2014 4 -0x1.12p6 0x1.4p2 +REG epsg:2015 0 -0x1.32p6 0x0.0p0 +REG epsg:2015 1 -0x1.46p6 -0x1.4p2 +REG epsg:2015 2 -0x1.1ep6 -0x1.4p2 +REG epsg:2015 3 -0x1.46p6 0x1.4p2 +REG epsg:2015 4 -0x1.1ep6 0x1.4p2 +REG epsg:2016 0 -0x1.3ep6 0x0.0p0 +REG epsg:2016 1 -0x1.52p6 -0x1.4p2 +REG epsg:2016 2 -0x1.2ap6 -0x1.4p2 +REG epsg:2016 3 -0x1.52p6 0x1.4p2 +REG epsg:2016 4 -0x1.2ap6 0x1.4p2 +REG epsg:2017 0 -0x1.26p6 0x0.0p0 +REG epsg:2017 1 -0x1.3ap6 -0x1.4p2 +REG epsg:2017 2 -0x1.12p6 -0x1.4p2 +REG epsg:2017 3 -0x1.3ap6 0x1.4p2 +REG epsg:2017 4 -0x1.12p6 0x1.4p2 +REG epsg:2018 0 -0x1.32p6 0x0.0p0 +REG epsg:2018 1 -0x1.46p6 -0x1.4p2 +REG epsg:2018 2 -0x1.1ep6 -0x1.4p2 +REG epsg:2018 3 -0x1.46p6 0x1.4p2 +REG epsg:2018 4 -0x1.1ep6 0x1.4p2 +REG epsg:2019 0 -0x1.3ep6 0x0.0p0 +REG epsg:2019 1 -0x1.52p6 -0x1.4p2 +REG epsg:2019 2 -0x1.2ap6 -0x1.4p2 +REG epsg:2019 3 -0x1.52p6 0x1.4p2 +REG epsg:2019 4 -0x1.2ap6 0x1.4p2 +REG epsg:2020 0 -0x1.4ap6 0x0.0p0 +REG epsg:2020 1 -0x1.5ep6 -0x1.4p2 +REG epsg:2020 2 -0x1.36p6 -0x1.4p2 +REG epsg:2020 3 -0x1.5ep6 0x1.4p2 +REG epsg:2020 4 -0x1.36p6 0x1.4p2 +REG epsg:2021 0 -0x1.44p6 0x0.0p0 +REG epsg:2021 1 -0x1.58p6 -0x1.4p2 +REG epsg:2021 2 -0x1.3p6 -0x1.4p2 +REG epsg:2021 3 -0x1.58p6 0x1.4p2 +REG epsg:2021 4 -0x1.3p6 0x1.4p2 +REG epsg:2022 0 -0x1.5p6 0x0.0p0 +REG epsg:2022 1 -0x1.64p6 -0x1.4p2 +REG epsg:2022 2 -0x1.3cp6 -0x1.4p2 +REG epsg:2022 3 -0x1.64p6 0x1.4p2 +REG epsg:2022 4 -0x1.3cp6 0x1.4p2 +REG epsg:2023 0 -0x1.5cp6 0x0.0p0 +REG epsg:2023 1 -0x1.7p6 -0x1.4p2 +REG epsg:2023 2 -0x1.48p6 -0x1.4p2 +REG epsg:2023 3 -0x1.7p6 0x1.4p2 +REG epsg:2023 4 -0x1.48p6 0x1.4p2 +REG epsg:2024 0 -0x1.68p6 0x0.0p0 +REG epsg:2024 1 -0x1.7cp6 -0x1.4p2 +REG epsg:2024 2 -0x1.54p6 -0x1.4p2 +REG epsg:2024 3 -0x1.7cp6 0x1.4p2 +REG epsg:2024 4 -0x1.54p6 0x1.4p2 +REG epsg:20248 0 0x1.a4p6 -0x1.9p4 +REG epsg:20248 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:20248 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:20248 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:20248 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:20249 0 0x1.bcp6 -0x1.9p4 +REG epsg:20249 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:20249 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:20249 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:20249 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:2025 0 -0x1.74p6 0x0.0p0 +REG epsg:2025 1 -0x1.88p6 -0x1.4p2 +REG epsg:2025 2 -0x1.6p6 -0x1.4p2 +REG epsg:2025 3 -0x1.88p6 0x1.4p2 +REG epsg:2025 4 -0x1.6p6 0x1.4p2 +REG epsg:20250 0 0x1.d4p6 -0x1.9p4 +REG epsg:20250 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:20250 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:20250 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:20250 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:20251 0 0x1.ecp6 -0x1.9p4 +REG epsg:20251 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:20251 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:20251 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:20251 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:20252 0 0x1.02p7 -0x1.9p4 +REG epsg:20252 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:20252 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:20252 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:20252 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:20253 0 0x1.0ep7 -0x1.9p4 +REG epsg:20253 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:20253 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:20253 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:20253 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:20254 0 0x1.1ap7 -0x1.9p4 +REG epsg:20254 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:20254 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:20254 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:20254 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:20255 0 0x1.26p7 -0x1.9p4 +REG epsg:20255 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:20255 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:20255 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:20255 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:20256 0 0x1.32p7 -0x1.9p4 +REG epsg:20256 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:20256 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:20256 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:20256 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:20257 0 0x1.3ep7 -0x1.9p4 +REG epsg:20257 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:20257 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:20257 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:20257 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:20258 0 0x1.4ap7 -0x1.9p4 +REG epsg:20258 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:20258 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:20258 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:20258 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2026 0 -0x1.8p6 0x0.0p0 +REG epsg:2026 1 -0x1.94p6 -0x1.4p2 +REG epsg:2026 2 -0x1.6cp6 -0x1.4p2 +REG epsg:2026 3 -0x1.94p6 0x1.4p2 +REG epsg:2026 4 -0x1.6cp6 0x1.4p2 +REG epsg:2027 0 -0x1.74p6 0x0.0p0 +REG epsg:2027 1 -0x1.88p6 -0x1.4p2 +REG epsg:2027 2 -0x1.6p6 -0x1.4p2 +REG epsg:2027 3 -0x1.88p6 0x1.4p2 +REG epsg:2027 4 -0x1.6p6 0x1.4p2 +REG epsg:2028 0 -0x1.5cp6 0x0.0p0 +REG epsg:2028 1 -0x1.7p6 -0x1.4p2 +REG epsg:2028 2 -0x1.48p6 -0x1.4p2 +REG epsg:2028 3 -0x1.7p6 0x1.4p2 +REG epsg:2028 4 -0x1.48p6 0x1.4p2 +REG epsg:2029 0 -0x1.44p6 0x0.0p0 +REG epsg:2029 1 -0x1.58p6 -0x1.4p2 +REG epsg:2029 2 -0x1.3p6 -0x1.4p2 +REG epsg:2029 3 -0x1.58p6 0x1.4p2 +REG epsg:2029 4 -0x1.3p6 0x1.4p2 +REG epsg:2030 0 -0x1.2cp6 0x0.0p0 +REG epsg:2030 1 -0x1.4p6 -0x1.4p2 +REG epsg:2030 2 -0x1.18p6 -0x1.4p2 +REG epsg:2030 3 -0x1.4p6 0x1.4p2 +REG epsg:2030 4 -0x1.18p6 0x1.4p2 +REG epsg:2031 0 -0x1.44p6 0x0.0p0 +REG epsg:2031 1 -0x1.58p6 -0x1.4p2 +REG epsg:2031 2 -0x1.3p6 -0x1.4p2 +REG epsg:2031 3 -0x1.58p6 0x1.4p2 +REG epsg:2031 4 -0x1.3p6 0x1.4p2 +REG epsg:2032 0 -0x1.2cp6 0x0.0p0 +REG epsg:2032 1 -0x1.4p6 -0x1.4p2 +REG epsg:2032 2 -0x1.18p6 -0x1.4p2 +REG epsg:2032 3 -0x1.4p6 0x1.4p2 +REG epsg:2032 4 -0x1.18p6 0x1.4p2 +REG epsg:2033 0 -0x1.14p6 0x0.0p0 +REG epsg:2033 1 -0x1.28p6 -0x1.4p2 +REG epsg:2033 2 -0x1.0p6 -0x1.4p2 +REG epsg:2033 3 -0x1.28p6 0x1.4p2 +REG epsg:2033 4 -0x1.0p6 0x1.4p2 +REG epsg:2034 0 -0x1.f8p5 0x0.0p0 +REG epsg:2034 1 -0x1.1p6 -0x1.4p2 +REG epsg:2034 2 -0x1.dp5 -0x1.4p2 +REG epsg:2034 3 -0x1.1p6 0x1.4p2 +REG epsg:2034 4 -0x1.dp5 0x1.4p2 +REG epsg:20348 0 0x1.a4p6 -0x1.9p4 +REG epsg:20348 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:20348 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:20348 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:20348 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:20349 0 0x1.bcp6 -0x1.9p4 +REG epsg:20349 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:20349 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:20349 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:20349 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:2035 0 -0x1.c8p5 0x0.0p0 +REG epsg:2035 1 -0x1.fp5 -0x1.4p2 +REG epsg:2035 2 -0x1.ap5 -0x1.4p2 +REG epsg:2035 3 -0x1.fp5 0x1.4p2 +REG epsg:2035 4 -0x1.ap5 0x1.4p2 +REG epsg:20350 0 0x1.d4p6 -0x1.9p4 +REG epsg:20350 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:20350 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:20350 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:20350 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:20351 0 0x1.ecp6 -0x1.9p4 +REG epsg:20351 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:20351 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:20351 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:20351 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:20352 0 0x1.02p7 -0x1.9p4 +REG epsg:20352 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:20352 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:20352 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:20352 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:20353 0 0x1.0ep7 -0x1.9p4 +REG epsg:20353 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:20353 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:20353 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:20353 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:20354 0 0x1.1ap7 -0x1.9p4 +REG epsg:20354 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:20354 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:20354 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:20354 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:20355 0 0x1.26p7 -0x1.9p4 +REG epsg:20355 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:20355 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:20355 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:20355 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:20356 0 0x1.32p7 -0x1.9p4 +REG epsg:20356 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:20356 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:20356 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:20356 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:20357 0 0x1.3ep7 -0x1.9p4 +REG epsg:20357 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:20357 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:20357 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:20357 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:20358 0 0x1.4ap7 -0x1.9p4 +REG epsg:20358 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:20358 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:20358 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:20358 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2036 0 -0x1.0ap6 0x1.74p5 +REG epsg:2036 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG epsg:2036 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG epsg:2036 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG epsg:2036 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG epsg:2037 0 -0x1.14p6 0x0.0p0 +REG epsg:2037 1 -0x1.28p6 -0x1.4p2 +REG epsg:2037 2 -0x1.0p6 -0x1.4p2 +REG epsg:2037 3 -0x1.28p6 0x1.4p2 +REG epsg:2037 4 -0x1.0p6 0x1.4p2 +REG epsg:2038 0 -0x1.f8p5 0x0.0p0 +REG epsg:2038 1 -0x1.1p6 -0x1.4p2 +REG epsg:2038 2 -0x1.dp5 -0x1.4p2 +REG epsg:2038 3 -0x1.1p6 0x1.4p2 +REG epsg:2038 4 -0x1.dp5 0x1.4p2 +REG epsg:2039 0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d12p4 +REG epsg:2039 1 0x1.d5359f2a43a52p4 0x1.abc01383e1d12p4 +REG epsg:2039 2 0x1.48aae3fa1c0bbp5 0x1.abc01383e1d12p4 +REG epsg:2039 3 0x1.d5359f2a43a52p4 0x1.25e009c1f0e89p5 +REG epsg:2039 4 0x1.48aae3fa1c0bbp5 0x1.25e009c1f0e89p5 +REG epsg:2040 0 -0x1.8p1 0x0.0p0 +REG epsg:2040 1 -0x1.0p3 -0x1.4p2 +REG epsg:2040 2 0x1.0p1 -0x1.4p2 +REG epsg:2040 3 -0x1.0p3 0x1.4p2 +REG epsg:2040 4 0x1.0p1 0x1.4p2 +REG epsg:2041 0 -0x1.8p1 0x0.0p0 +REG epsg:2041 1 -0x1.0p3 -0x1.4p2 +REG epsg:2041 2 0x1.0p1 -0x1.4p2 +REG epsg:2041 3 -0x1.0p3 0x1.4p2 +REG epsg:2041 4 0x1.0p1 0x1.4p2 +REG epsg:2042 0 -0x1.2p3 0x0.0p0 +REG epsg:2042 1 -0x1.cp3 -0x1.4p2 +REG epsg:2042 2 -0x1.0p2 -0x1.4p2 +REG epsg:2042 3 -0x1.cp3 0x1.4p2 +REG epsg:2042 4 -0x1.0p2 0x1.4p2 +REG epsg:2043 0 -0x1.2p3 0x0.0p0 +REG epsg:2043 1 -0x1.cp3 -0x1.4p2 +REG epsg:2043 2 -0x1.0p2 -0x1.4p2 +REG epsg:2043 3 -0x1.cp3 0x1.4p2 +REG epsg:2043 4 -0x1.0p2 0x1.4p2 +REG epsg:20436 0 0x1.08p5 0x0.0p0 +REG epsg:20436 1 0x1.cp4 -0x1.4p2 +REG epsg:20436 2 0x1.3p5 -0x1.4p2 +REG epsg:20436 3 0x1.cp4 0x1.4p2 +REG epsg:20436 4 0x1.3p5 0x1.4p2 +REG epsg:20437 0 0x1.38p5 0x0.0p0 +REG epsg:20437 1 0x1.1p5 -0x1.4p2 +REG epsg:20437 2 0x1.6p5 -0x1.4p2 +REG epsg:20437 3 0x1.1p5 0x1.4p2 +REG epsg:20437 4 0x1.6p5 0x1.4p2 +REG epsg:20438 0 0x1.68p5 0x0.0p0 +REG epsg:20438 1 0x1.4p5 -0x1.4p2 +REG epsg:20438 2 0x1.9p5 -0x1.4p2 +REG epsg:20438 3 0x1.4p5 0x1.4p2 +REG epsg:20438 4 0x1.9p5 0x1.4p2 +REG epsg:20439 0 0x1.98p5 0x0.0p0 +REG epsg:20439 1 0x1.7p5 -0x1.4p2 +REG epsg:20439 2 0x1.cp5 -0x1.4p2 +REG epsg:20439 3 0x1.7p5 0x1.4p2 +REG epsg:20439 4 0x1.cp5 0x1.4p2 +REG epsg:2044 0 0x1.a4p6 0x0.0p0 +REG epsg:2044 1 0x1.9p6 -0x1.4p2 +REG epsg:2044 2 0x1.b8p6 -0x1.4p2 +REG epsg:2044 3 0x1.9p6 0x1.4p2 +REG epsg:2044 4 0x1.b8p6 0x1.4p2 +REG epsg:20440 0 0x1.c8p5 0x0.0p0 +REG epsg:20440 1 0x1.ap5 -0x1.4p2 +REG epsg:20440 2 0x1.fp5 -0x1.4p2 +REG epsg:20440 3 0x1.ap5 0x1.4p2 +REG epsg:20440 4 0x1.fp5 0x1.4p2 +REG epsg:2045 0 0x1.bcp6 0x0.0p0 +REG epsg:2045 1 0x1.a8p6 -0x1.4p2 +REG epsg:2045 2 0x1.dp6 -0x1.4p2 +REG epsg:2045 3 0x1.a8p6 0x1.4p2 +REG epsg:2045 4 0x1.dp6 0x1.4p2 +REG epsg:2046 0 0x1.ep3 0x0.0p0 +REG epsg:2046 1 0x1.4p3 -0x1.4p2 +REG epsg:2046 2 0x1.4p4 -0x1.4p2 +REG epsg:2046 3 0x1.4p3 0x1.4p2 +REG epsg:2046 4 0x1.4p4 0x1.4p2 +REG epsg:2047 0 0x1.1p4 0x0.0p0 +REG epsg:2047 1 0x1.8p3 -0x1.4p2 +REG epsg:2047 2 0x1.6p4 -0x1.4p2 +REG epsg:2047 3 0x1.8p3 0x1.4p2 +REG epsg:2047 4 0x1.6p4 0x1.4p2 +REG epsg:2048 0 0x1.3p4 0x0.0p0 +REG epsg:2048 1 0x1.cp3 -0x1.4p2 +REG epsg:2048 2 0x1.8p4 -0x1.4p2 +REG epsg:2048 3 0x1.cp3 0x1.4p2 +REG epsg:2048 4 0x1.8p4 0x1.4p2 +REG epsg:2049 0 0x1.5p4 0x0.0p0 +REG epsg:2049 1 0x1.0p4 -0x1.4p2 +REG epsg:2049 2 0x1.ap4 -0x1.4p2 +REG epsg:2049 3 0x1.0p4 0x1.4p2 +REG epsg:2049 4 0x1.ap4 0x1.4p2 +REG epsg:20499 0 0x1.98p5 0x0.0p0 +REG epsg:20499 1 0x1.7p5 -0x1.4p2 +REG epsg:20499 2 0x1.cp5 -0x1.4p2 +REG epsg:20499 3 0x1.7p5 0x1.4p2 +REG epsg:20499 4 0x1.cp5 0x1.4p2 +REG epsg:2050 0 0x1.7p4 0x0.0p0 +REG epsg:2050 1 0x1.2p4 -0x1.4p2 +REG epsg:2050 2 0x1.cp4 -0x1.4p2 +REG epsg:2050 3 0x1.2p4 0x1.4p2 +REG epsg:2050 4 0x1.cp4 0x1.4p2 +REG epsg:2051 0 0x1.9p4 0x0.0p0 +REG epsg:2051 1 0x1.4p4 -0x1.4p2 +REG epsg:2051 2 0x1.ep4 -0x1.4p2 +REG epsg:2051 3 0x1.4p4 0x1.4p2 +REG epsg:2051 4 0x1.ep4 0x1.4p2 +REG epsg:2052 0 0x1.bp4 0x0.0p0 +REG epsg:2052 1 0x1.6p4 -0x1.4p2 +REG epsg:2052 2 0x1.0p5 -0x1.4p2 +REG epsg:2052 3 0x1.6p4 0x1.4p2 +REG epsg:2052 4 0x1.0p5 0x1.4p2 +REG epsg:2053 0 0x1.dp4 0x0.0p0 +REG epsg:2053 1 0x1.8p4 -0x1.4p2 +REG epsg:2053 2 0x1.1p5 -0x1.4p2 +REG epsg:2053 3 0x1.8p4 0x1.4p2 +REG epsg:2053 4 0x1.1p5 0x1.4p2 +REG epsg:20538 0 0x1.68p5 0x0.0p0 +REG epsg:20538 1 0x1.4p5 -0x1.4p2 +REG epsg:20538 2 0x1.9p5 -0x1.4p2 +REG epsg:20538 3 0x1.4p5 0x1.4p2 +REG epsg:20538 4 0x1.9p5 0x1.4p2 +REG epsg:20539 0 0x1.98p5 0x0.0p0 +REG epsg:20539 1 0x1.7p5 -0x1.4p2 +REG epsg:20539 2 0x1.cp5 -0x1.4p2 +REG epsg:20539 3 0x1.7p5 0x1.4p2 +REG epsg:20539 4 0x1.cp5 0x1.4p2 +REG epsg:2054 0 0x1.fp4 0x0.0p0 +REG epsg:2054 1 0x1.ap4 -0x1.4p2 +REG epsg:2054 2 0x1.2p5 -0x1.4p2 +REG epsg:2054 3 0x1.ap4 0x1.4p2 +REG epsg:2054 4 0x1.2p5 0x1.4p2 +REG epsg:2055 0 0x1.08p5 0x0.0p0 +REG epsg:2055 1 0x1.cp4 -0x1.4p2 +REG epsg:2055 2 0x1.3p5 -0x1.4p2 +REG epsg:2055 3 0x1.cp4 0x1.4p2 +REG epsg:2055 4 0x1.3p5 0x1.4p2 +REG epsg:2056 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG epsg:2056 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG epsg:2056 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG epsg:2056 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG epsg:2056 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG epsg:2057 0 0x1.a4d40c57b581fp5 0x1.b84d1f6f01576p4 +REG epsg:2057 1 0x1.77b9ae635ab67p5 0x1.684d1f6f01576p4 +REG epsg:2057 2 0x1.d1ee6a4c104d7p5 0x1.684d1f6f01576p4 +REG epsg:2057 3 0x1.77b9ae635ab67p5 0x1.04268fb780abbp5 +REG epsg:2057 4 0x1.d1ee6a4c104d7p5 0x1.04268fb780abbp5 +REG epsg:2058 0 0x1.68p5 0x0.0p0 +REG epsg:2058 1 0x1.4p5 -0x1.4p2 +REG epsg:2058 2 0x1.9p5 -0x1.4p2 +REG epsg:2058 3 0x1.4p5 0x1.4p2 +REG epsg:2058 4 0x1.9p5 0x1.4p2 +REG epsg:2059 0 0x1.98p5 0x0.0p0 +REG epsg:2059 1 0x1.7p5 -0x1.4p2 +REG epsg:2059 2 0x1.cp5 -0x1.4p2 +REG epsg:2059 3 0x1.7p5 0x1.4p2 +REG epsg:2059 4 0x1.cp5 0x1.4p2 +REG epsg:2060 0 0x1.c8p5 0x0.0p0 +REG epsg:2060 1 0x1.ap5 -0x1.4p2 +REG epsg:2060 2 0x1.fp5 -0x1.4p2 +REG epsg:2060 3 0x1.ap5 0x1.4p2 +REG epsg:2060 4 0x1.fp5 0x1.4p2 +REG epsg:2061 0 0x1.f8p5 0x0.0p0 +REG epsg:2061 1 0x1.dp5 -0x1.4p2 +REG epsg:2061 2 0x1.1p6 -0x1.4p2 +REG epsg:2061 3 0x1.dp5 0x1.4p2 +REG epsg:2061 4 0x1.1p6 0x1.4p2 +REG epsg:2062 0 0x0.0p0 0x1.4p5 +REG epsg:2062 1 -0x1.a1baf7138d7cap2 0x1.18p5 +REG epsg:2062 2 0x1.a1baf7138d7cap2 0x1.18p5 +REG epsg:2062 3 -0x1.a1baf7138d7cap2 0x1.68p5 +REG epsg:2062 4 0x1.a1baf7138d7cap2 0x1.68p5 +REG epsg:2063 0 -0x1.ep3 0x0.0p0 +REG epsg:2063 1 -0x1.4p4 -0x1.4p2 +REG epsg:2063 2 -0x1.4p3 -0x1.4p2 +REG epsg:2063 3 -0x1.4p4 0x1.4p2 +REG epsg:2063 4 -0x1.4p3 0x1.4p2 +REG epsg:2064 0 -0x1.2p3 0x0.0p0 +REG epsg:2064 1 -0x1.cp3 -0x1.4p2 +REG epsg:2064 2 -0x1.0p2 -0x1.4p2 +REG epsg:2064 3 -0x1.cp3 0x1.4p2 +REG epsg:2064 4 -0x1.0p2 0x1.4p2 +REG epsg:2065 0 0x1.54p5 0x1.8cp5 +REG epsg:2065 1 0x1.1668c3d6deab4p5 0x1.64p5 +REG epsg:2065 2 0x1.91973c292154cp5 0x1.64p5 +REG epsg:2065 3 0x1.1668c3d6deab4p5 0x1.b4p5 +REG epsg:2065 4 0x1.91973c292154cp5 0x1.b4p5 +REG epsg:2066 0 -0x1.e57cf23a74584p5 0x1.6811d8e0ef223p3 +REG epsg:2066 1 -0x1.0722d1bef0772p6 0x1.9023b1c1de446p2 +REG epsg:2066 2 -0x1.bcb440f707c24p5 0x1.9023b1c1de446p2 +REG epsg:2066 3 -0x1.0722d1bef0772p6 0x1.0408ec7077912p4 +REG epsg:2066 4 -0x1.bcb440f707c24p5 0x1.0408ec7077912p4 +REG epsg:2067 0 -0x1.f8p5 0x0.0p0 +REG epsg:2067 1 -0x1.1p6 -0x1.4p2 +REG epsg:2067 2 -0x1.dp5 -0x1.4p2 +REG epsg:2067 3 -0x1.1p6 0x1.4p2 +REG epsg:2067 4 -0x1.dp5 0x1.4p2 +REG epsg:2068 0 0x1.2p3 0x0.0p0 +REG epsg:2068 1 0x1.0p2 -0x1.4p2 +REG epsg:2068 2 0x1.cp3 -0x1.4p2 +REG epsg:2068 3 0x1.0p2 0x1.4p2 +REG epsg:2068 4 0x1.cp3 0x1.4p2 +REG epsg:2069 0 0x1.6p3 0x0.0p0 +REG epsg:2069 1 0x1.8p2 -0x1.4p2 +REG epsg:2069 2 0x1.0p4 -0x1.4p2 +REG epsg:2069 3 0x1.8p2 0x1.4p2 +REG epsg:2069 4 0x1.0p4 0x1.4p2 +REG epsg:2070 0 0x1.ap3 0x0.0p0 +REG epsg:2070 1 0x1.0p3 -0x1.4p2 +REG epsg:2070 2 0x1.2p4 -0x1.4p2 +REG epsg:2070 3 0x1.0p3 0x1.4p2 +REG epsg:2070 4 0x1.2p4 0x1.4p2 +REG epsg:2071 0 0x1.ep3 0x0.0p0 +REG epsg:2071 1 0x1.4p3 -0x1.4p2 +REG epsg:2071 2 0x1.4p4 -0x1.4p2 +REG epsg:2071 3 0x1.4p3 0x1.4p2 +REG epsg:2071 4 0x1.4p4 0x1.4p2 +REG epsg:2072 0 0x1.1p4 0x0.0p0 +REG epsg:2072 1 0x1.8p3 -0x1.4p2 +REG epsg:2072 2 0x1.6p4 -0x1.4p2 +REG epsg:2072 3 0x1.8p3 0x1.4p2 +REG epsg:2072 4 0x1.6p4 0x1.4p2 +REG epsg:2073 0 0x1.3p4 0x0.0p0 +REG epsg:2073 1 0x1.cp3 -0x1.4p2 +REG epsg:2073 2 0x1.8p4 -0x1.4p2 +REG epsg:2073 3 0x1.cp3 0x1.4p2 +REG epsg:2073 4 0x1.8p4 0x1.4p2 +REG epsg:2074 0 0x1.5p4 0x0.0p0 +REG epsg:2074 1 0x1.0p4 -0x1.4p2 +REG epsg:2074 2 0x1.ap4 -0x1.4p2 +REG epsg:2074 3 0x1.0p4 0x1.4p2 +REG epsg:2074 4 0x1.ap4 0x1.4p2 +REG epsg:2075 0 0x1.7p4 0x0.0p0 +REG epsg:2075 1 0x1.2p4 -0x1.4p2 +REG epsg:2075 2 0x1.cp4 -0x1.4p2 +REG epsg:2075 3 0x1.2p4 0x1.4p2 +REG epsg:2075 4 0x1.cp4 0x1.4p2 +REG epsg:2076 0 0x1.9p4 0x0.0p0 +REG epsg:2076 1 0x1.4p4 -0x1.4p2 +REG epsg:2076 2 0x1.ep4 -0x1.4p2 +REG epsg:2076 3 0x1.4p4 0x1.4p2 +REG epsg:2076 4 0x1.ep4 0x1.4p2 +REG epsg:2077 0 0x1.2p3 0x0.0p0 +REG epsg:2077 1 0x1.0p2 -0x1.4p2 +REG epsg:2077 2 0x1.cp3 -0x1.4p2 +REG epsg:2077 3 0x1.0p2 0x1.4p2 +REG epsg:2077 4 0x1.cp3 0x1.4p2 +REG epsg:2078 0 0x1.ep3 0x0.0p0 +REG epsg:2078 1 0x1.4p3 -0x1.4p2 +REG epsg:2078 2 0x1.4p4 -0x1.4p2 +REG epsg:2078 3 0x1.4p3 0x1.4p2 +REG epsg:2078 4 0x1.4p4 0x1.4p2 +REG epsg:2079 0 0x1.5p4 0x0.0p0 +REG epsg:2079 1 0x1.0p4 -0x1.4p2 +REG epsg:2079 2 0x1.ap4 -0x1.4p2 +REG epsg:2079 3 0x1.0p4 0x1.4p2 +REG epsg:2079 4 0x1.ap4 0x1.4p2 +REG epsg:20790 0 0x1.0p0 0x1.3d55555555554p5 +REG epsg:20790 1 -0x1.5fb5410fabb4ap2 0x1.1555555555554p5 +REG epsg:20790 2 0x1.dfb5410fabb4ap2 0x1.1555555555554p5 +REG epsg:20790 3 -0x1.5fb5410fabb4ap2 0x1.6555555555554p5 +REG epsg:20790 4 0x1.dfb5410fabb4ap2 0x1.6555555555554p5 +REG epsg:20791 0 0x1.0p0 0x1.3d55555555554p5 +REG epsg:20791 1 -0x1.5fb5410fabb4ap2 0x1.1555555555554p5 +REG epsg:20791 2 0x1.dfb5410fabb4ap2 0x1.1555555555554p5 +REG epsg:20791 3 -0x1.5fb5410fabb4ap2 0x1.6555555555554p5 +REG epsg:20791 4 0x1.dfb5410fabb4ap2 0x1.6555555555554p5 +REG epsg:2080 0 0x1.bp4 0x0.0p0 +REG epsg:2080 1 0x1.6p4 -0x1.4p2 +REG epsg:2080 2 0x1.0p5 -0x1.4p2 +REG epsg:2080 3 0x1.6p4 0x1.4p2 +REG epsg:2080 4 0x1.0p5 0x1.4p2 +REG epsg:2081 0 -0x1.14p6 -0x1.64p6 +REG epsg:2081 1 -0x1.02p7 -0x1.64p6 +REG epsg:2081 2 -0x1.2p3 -0x1.64p6 +REG epsg:2081 3 -0x1.02p7 -0x1.54p6 +REG epsg:2081 4 -0x1.2p3 -0x1.54p6 +REG epsg:2082 0 -0x1.14p6 -0x1.64p6 +REG epsg:2082 1 -0x1.02p7 -0x1.64p6 +REG epsg:2082 2 -0x1.2p3 -0x1.64p6 +REG epsg:2082 3 -0x1.02p7 -0x1.54p6 +REG epsg:2082 4 -0x1.2p3 -0x1.54p6 +REG epsg:20822 0 -0x1.98p5 -0x1.9p4 +REG epsg:20822 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:20822 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:20822 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:20822 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:20823 0 -0x1.68p5 -0x1.9p4 +REG epsg:20823 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:20823 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:20823 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:20823 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:20824 0 -0x1.38p5 -0x1.9p4 +REG epsg:20824 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:20824 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:20824 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:20824 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2083 0 -0x1.14p6 -0x1.64p6 +REG epsg:2083 1 -0x1.02p7 -0x1.64p6 +REG epsg:2083 2 -0x1.2p3 -0x1.64p6 +REG epsg:2083 3 -0x1.02p7 -0x1.54p6 +REG epsg:2083 4 -0x1.2p3 -0x1.54p6 +REG epsg:2084 0 -0x1.14p6 -0x1.9p4 +REG epsg:2084 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:2084 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:2084 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:2084 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2085 0 -0x1.44p6 0x1.659999999999ap4 +REG epsg:2085 1 -0x1.599fdd28e3eaap6 0x1.159999999999ap4 +REG epsg:2085 2 -0x1.2e6022d71c156p6 0x1.159999999999ap4 +REG epsg:2085 3 -0x1.599fdd28e3eaap6 0x1.b59999999999ap4 +REG epsg:2085 4 -0x1.2e6022d71c156p6 0x1.b59999999999ap4 +REG epsg:2086 0 -0x1.3355555555555p6 0x1.4b77777777778p4 +REG epsg:2086 1 -0x1.48b745942595bp6 0x1.f6eeeeeeeeefp3 +REG epsg:2086 2 -0x1.1df365168514fp6 0x1.f6eeeeeeeeefp3 +REG epsg:2086 3 -0x1.48b745942595bp6 0x1.9b77777777778p4 +REG epsg:2086 4 -0x1.1df365168514fp6 0x1.9b77777777778p4 +REG epsg:2087 0 0x1.8p3 0x0.0p0 +REG epsg:2087 1 0x1.cp2 -0x1.4p2 +REG epsg:2087 2 0x1.1p4 -0x1.4p2 +REG epsg:2087 3 0x1.cp2 0x1.4p2 +REG epsg:2087 4 0x1.1p4 0x1.4p2 +REG epsg:2088 0 0x1.6p3 0x0.0p0 +REG epsg:2088 1 0x1.8p2 -0x1.4p2 +REG epsg:2088 2 0x1.0p4 -0x1.4p2 +REG epsg:2088 3 0x1.8p2 0x1.4p2 +REG epsg:2088 4 0x1.0p4 0x1.4p2 +REG epsg:2089 0 0x1.68p5 0x0.0p0 +REG epsg:2089 1 0x1.4p5 -0x1.4p2 +REG epsg:2089 2 0x1.9p5 -0x1.4p2 +REG epsg:2089 3 0x1.4p5 0x1.4p2 +REG epsg:2089 4 0x1.9p5 0x1.4p2 +REG epsg:2090 0 0x1.98p5 0x0.0p0 +REG epsg:2090 1 0x1.7p5 -0x1.4p2 +REG epsg:2090 2 0x1.cp5 -0x1.4p2 +REG epsg:2090 3 0x1.7p5 0x1.4p2 +REG epsg:2090 4 0x1.cp5 0x1.4p2 +REG epsg:2091 0 0x1.68p5 0x0.0p0 +REG epsg:2091 1 0x1.4p5 -0x1.4p2 +REG epsg:2091 2 0x1.9p5 -0x1.4p2 +REG epsg:2091 3 0x1.4p5 0x1.4p2 +REG epsg:2091 4 0x1.9p5 0x1.4p2 +REG epsg:2092 0 0x1.98p5 0x0.0p0 +REG epsg:2092 1 0x1.7p5 -0x1.4p2 +REG epsg:2092 2 0x1.cp5 -0x1.4p2 +REG epsg:2092 3 0x1.7p5 0x1.4p2 +REG epsg:2092 4 0x1.cp5 0x1.4p2 +REG epsg:2093 0 0x1.a8p6 0x0.0p0 +REG epsg:2093 1 0x1.94p6 -0x1.4p2 +REG epsg:2093 2 0x1.bcp6 -0x1.4p2 +REG epsg:2093 3 0x1.94p6 0x1.4p2 +REG epsg:2093 4 0x1.bcp6 0x1.4p2 +REG epsg:20934 0 0x1.5p4 -0x1.9p4 +REG epsg:20934 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:20934 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:20934 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:20934 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:20935 0 0x1.bp4 -0x1.9p4 +REG epsg:20935 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:20935 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:20935 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:20935 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:20936 0 0x1.08p5 -0x1.9p4 +REG epsg:20936 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:20936 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:20936 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:20936 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:2094 0 0x1.a8p6 0x0.0p0 +REG epsg:2094 1 0x1.94p6 -0x1.4p2 +REG epsg:2094 2 0x1.bcp6 -0x1.4p2 +REG epsg:2094 3 0x1.94p6 0x1.4p2 +REG epsg:2094 4 0x1.bcp6 0x1.4p2 +REG epsg:2095 0 -0x1.ep3 0x0.0p0 +REG epsg:2095 1 -0x1.4p4 -0x1.4p2 +REG epsg:2095 2 -0x1.4p3 -0x1.4p2 +REG epsg:2095 3 -0x1.4p4 0x1.4p2 +REG epsg:2095 4 -0x1.4p3 0x1.4p2 +REG epsg:2096 0 0x1.02p7 0x1.3p5 +REG epsg:2096 1 0x1.ea9ea071f4b32p6 0x1.08p5 +REG epsg:2096 2 0x1.0eb0afc705a67p7 0x1.08p5 +REG epsg:2096 3 0x1.ea9ea071f4b32p6 0x1.58p5 +REG epsg:2096 4 0x1.0eb0afc705a67p7 0x1.58p5 +REG epsg:2097 0 0x1.fcp6 0x1.3p5 +REG epsg:2097 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG epsg:2097 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG epsg:2097 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG epsg:2097 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG epsg:2098 0 0x1.f4p6 0x1.3p5 +REG epsg:2098 1 0x1.da9ea071f4b32p6 0x1.08p5 +REG epsg:2098 2 0x1.06b0afc705a67p7 0x1.08p5 +REG epsg:2098 3 0x1.da9ea071f4b32p6 0x1.58p5 +REG epsg:2098 4 0x1.06b0afc705a67p7 0x1.58p5 +REG epsg:2099 0 0x1.9617530eca864p5 0x1.961e26af37c04p4 +REG epsg:2099 1 0x1.69d13643d0049p5 0x1.461e26af37c04p4 +REG epsg:2099 2 0x1.c25d6fd9c507fp5 0x1.461e26af37c04p4 +REG epsg:2099 3 0x1.69d13643d0049p5 0x1.e61e26af37c04p4 +REG epsg:2099 4 0x1.c25d6fd9c507fp5 0x1.e61e26af37c04p4 +REG epsg:2100 0 0x1.8p4 0x0.0p0 +REG epsg:2100 1 0x1.3p4 -0x1.4p2 +REG epsg:2100 2 0x1.dp4 -0x1.4p2 +REG epsg:2100 3 0x1.3p4 0x1.4p2 +REG epsg:2100 4 0x1.dp4 0x1.4p2 +REG epsg:2101 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG epsg:2101 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG epsg:2101 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG epsg:2101 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG epsg:2101 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG epsg:2102 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG epsg:2102 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG epsg:2102 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG epsg:2102 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG epsg:2102 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG epsg:2103 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG epsg:2103 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG epsg:2103 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG epsg:2103 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG epsg:2103 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG epsg:21035 0 0x1.bp4 -0x1.9p4 +REG epsg:21035 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:21035 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:21035 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:21035 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:21036 0 0x1.08p5 -0x1.9p4 +REG epsg:21036 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:21036 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:21036 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:21036 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:21037 0 0x1.38p5 -0x1.9p4 +REG epsg:21037 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:21037 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:21037 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:21037 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:2104 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG epsg:2104 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG epsg:2104 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG epsg:2104 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG epsg:2104 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG epsg:2105 0 0x1.5d8740da740dcp7 -0x1.2709abcdf0123p5 +REG epsg:2105 1 0x1.5106d779cfe6ep7 -0x1.4f09abcdf0123p5 +REG epsg:2105 2 -0x1.65f855c4e7cb6p7 -0x1.4f09abcdf0123p5 +REG epsg:2105 3 0x1.5106d779cfe6ep7 -0x1.fe13579be0246p4 +REG epsg:2105 4 -0x1.65f855c4e7cb6p7 -0x1.fe13579be0246p4 +REG epsg:2106 0 0x1.60eea61d950c8p7 -0x1.2e16c16c16c17p5 +REG epsg:2106 1 0x1.54487b7d25e61p7 -0x1.5616c16c16c17p5 +REG epsg:2106 2 -0x1.626b2f41fbcd1p7 -0x1.5616c16c16c17p5 +REG epsg:2106 3 0x1.54487b7d25e61p7 -0x1.0616c16c16c17p5 +REG epsg:2106 4 -0x1.626b2f41fbcd1p7 -0x1.0616c16c16c17p5 +REG epsg:2107 0 0x1.63c56789abce1p7 -0x1.34fedcba98765p5 +REG epsg:2107 1 0x1.56f89f4816851p7 -0x1.5cfedcba98765p5 +REG epsg:2107 2 -0x1.5f6dd034bee8fp7 -0x1.5cfedcba98765p5 +REG epsg:2107 3 0x1.56f89f4816851p7 -0x1.0cfedcba98765p5 +REG epsg:2107 4 -0x1.5f6dd034bee8fp7 -0x1.0cfedcba98765p5 +REG epsg:2108 0 0x1.6158e38e38e38p7 -0x1.3d34e81b4e81bp5 +REG epsg:2108 1 0x1.545bfc8a29cdcp7 -0x1.6534e81b4e81bp5 +REG epsg:2108 2 -0x1.61aa356db806cp7 -0x1.6534e81b4e81bp5 +REG epsg:2108 3 0x1.545bfc8a29cdcp7 -0x1.1534e81b4e81bp5 +REG epsg:2108 4 -0x1.61aa356db806cp7 -0x1.1534e81b4e81bp5 +REG epsg:2109 0 0x1.5c749f49f49f5p7 -0x1.39159e26af37dp5 +REG epsg:2109 1 0x1.4f902f717eb17p7 -0x1.61159e26af37dp5 +REG epsg:2109 2 -0x1.66a6f0dd9572dp7 -0x1.61159e26af37dp5 +REG epsg:2109 3 0x1.4f902f717eb17p7 -0x1.11159e26af37dp5 +REG epsg:2109 4 -0x1.66a6f0dd9572dp7 -0x1.11159e26af37dp5 +REG epsg:21095 0 0x1.bp4 0x0.0p0 +REG epsg:21095 1 0x1.6p4 -0x1.4p2 +REG epsg:21095 2 0x1.0p5 -0x1.4p2 +REG epsg:21095 3 0x1.6p4 0x1.4p2 +REG epsg:21095 4 0x1.0p5 0x1.4p2 +REG epsg:21096 0 0x1.08p5 0x0.0p0 +REG epsg:21096 1 0x1.cp4 -0x1.4p2 +REG epsg:21096 2 0x1.3p5 -0x1.4p2 +REG epsg:21096 3 0x1.cp4 0x1.4p2 +REG epsg:21096 4 0x1.3p5 0x1.4p2 +REG epsg:21097 0 0x1.38p5 0x0.0p0 +REG epsg:21097 1 0x1.1p5 -0x1.4p2 +REG epsg:21097 2 0x1.6p5 -0x1.4p2 +REG epsg:21097 3 0x1.1p5 0x1.4p2 +REG epsg:21097 4 0x1.6p5 0x1.4p2 +REG epsg:2110 0 0x1.5f47ae147ae14p7 -0x1.3c1907f6e5d4cp5 +REG epsg:2110 1 0x1.52516bbf80187p7 -0x1.641907f6e5d4cp5 +REG epsg:2110 2 -0x1.63c20f968a55fp7 -0x1.641907f6e5d4cp5 +REG epsg:2110 3 0x1.52516bbf80187p7 -0x1.141907f6e5d4cp5 +REG epsg:2110 4 -0x1.63c20f968a55fp7 -0x1.141907f6e5d4cp5 +REG epsg:21100 0 0x1.b8p6 0x0.0p0 +REG epsg:21100 1 0x1.a4p6 -0x1.4p2 +REG epsg:21100 2 0x1.ccp6 -0x1.4p2 +REG epsg:21100 3 0x1.a4p6 0x1.4p2 +REG epsg:21100 4 0x1.ccp6 0x1.4p2 +REG epsg:2111 0 0x1.5ef9e26af37bep7 -0x1.41ef8091a2b3cp5 +REG epsg:2111 1 0x1.51e020eb6ef11p7 -0x1.69ef8091a2b3cp5 +REG epsg:2111 2 -0x1.63ec5c1587f95p7 -0x1.69ef8091a2b3cp5 +REG epsg:2111 3 0x1.51e020eb6ef11p7 -0x1.19ef8091a2b3cp5 +REG epsg:2111 4 -0x1.63ec5c1587f95p7 -0x1.19ef8091a2b3cp5 +REG epsg:2112 0 0x1.5f4b60b60b60bp7 -0x1.4766f8091a2b3p5 +REG epsg:2112 1 0x1.520f2ec947ea3p7 -0x1.6f66f8091a2b3p5 +REG epsg:2112 2 -0x1.63786d5d3128dp7 -0x1.6f66f8091a2b3p5 +REG epsg:2112 3 0x1.520f2ec947ea3p7 -0x1.1f66f8091a2b3p5 +REG epsg:2112 4 -0x1.63786d5d3128dp7 -0x1.1f66f8091a2b3p5 +REG epsg:2113 0 0x1.5d8d82d82d82ep7 -0x1.4a68acf13579ap5 +REG epsg:2113 1 0x1.503ddcfe274ap7 -0x1.7268acf13579ap5 +REG epsg:2113 2 -0x1.6522d74dcc444p7 -0x1.7268acf13579ap5 +REG epsg:2113 3 0x1.503ddcfe274ap7 -0x1.2268acf13579ap5 +REG epsg:2113 4 -0x1.6522d74dcc444p7 -0x1.2268acf13579ap5 +REG epsg:2114 0 0x1.5958091a2b3c3p7 -0x1.45b7c048d159fp5 +REG epsg:2114 1 0x1.4c2694266a63ap7 -0x1.6db7c048d159fp5 +REG epsg:2114 2 0x1.66897e0dec14cp7 -0x1.6db7c048d159fp5 +REG epsg:2114 3 0x1.4c2694266a63ap7 -0x1.1db7c048d159fp5 +REG epsg:2114 4 0x1.66897e0dec14cp7 -0x1.1db7c048d159fp5 +REG epsg:21148 0 0x1.a4p6 -0x1.9p4 +REG epsg:21148 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:21148 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:21148 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:21148 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:21149 0 0x1.bcp6 -0x1.9p4 +REG epsg:21149 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:21149 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:21149 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:21149 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:2115 0 0x1.5a992c5f92c61p7 -0x1.4a320fedcba98p5 +REG epsg:2115 1 0x1.4d4aeafcbb3e9p7 -0x1.72320fedcba98p5 +REG epsg:2115 2 0x1.67e76dc26a4d9p7 -0x1.72320fedcba98p5 +REG epsg:2115 3 0x1.4d4aeafcbb3e9p7 -0x1.22320fedcba98p5 +REG epsg:2115 4 0x1.67e76dc26a4d9p7 -0x1.22320fedcba98p5 +REG epsg:21150 0 0x1.d4p6 -0x1.9p4 +REG epsg:21150 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:21150 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:21150 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:21150 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:2116 0 0x1.5837c048d159fp7 -0x1.4a5159e26af37p5 +REG epsg:2116 1 0x1.4ae8b2bb678e3p7 -0x1.725159e26af37p5 +REG epsg:2116 2 0x1.6586cdd63b25bp7 -0x1.725159e26af37p5 +REG epsg:2116 3 0x1.4ae8b2bb678e3p7 -0x1.225159e26af37p5 +REG epsg:2116 4 0x1.6586cdd63b25bp7 -0x1.225159e26af37p5 +REG epsg:2117 0 0x1.572987654321p7 -0x1.4e7c048d159e2p5 +REG epsg:2117 1 0x1.49beea62edbe8p7 -0x1.767c048d159e2p5 +REG epsg:2117 2 0x1.6494246798838p7 -0x1.767c048d159e2p5 +REG epsg:2117 3 0x1.49beea62edbe8p7 -0x1.267c048d159e2p5 +REG epsg:2117 4 0x1.6494246798838p7 -0x1.267c048d159e2p5 +REG epsg:2118 0 0x1.57197530eca85p7 -0x1.52ab3c4d5e6f8p5 +REG epsg:2118 1 0x1.49926c7972044p7 -0x1.7aab3c4d5e6f8p5 +REG epsg:2118 2 0x1.64a07de8674c6p7 -0x1.7aab3c4d5e6f8p5 +REG epsg:2118 3 0x1.49926c7972044p7 -0x1.2aab3c4d5e6f8p5 +REG epsg:2118 4 0x1.64a07de8674c6p7 -0x1.2aab3c4d5e6f8p5 +REG epsg:2119 0 0x1.5a051eb851eb8p7 -0x1.5582d82d82d82p5 +REG epsg:2119 1 0x1.4c6a58601d754p7 -0x1.7d82d82d82d82p5 +REG epsg:2119 2 0x1.679fe5108661cp7 -0x1.7d82d82d82d82p5 +REG epsg:2119 3 0x1.4c6a58601d754p7 -0x1.2d82d82d82d82p5 +REG epsg:2119 4 0x1.679fe5108661cp7 -0x1.2d82d82d82d82p5 +REG epsg:2120 0 0x1.5b9a98765431fp7 -0x1.4c5b05b05b05ap5 +REG epsg:2120 1 0x1.4e3e279047cb1p7 -0x1.745b05b05b05ap5 +REG epsg:2120 2 -0x1.6708f6a39f673p7 -0x1.745b05b05b05ap5 +REG epsg:2120 3 0x1.4e3e279047cb1p7 -0x1.245b05b05b05ap5 +REG epsg:2120 4 -0x1.6708f6a39f673p7 -0x1.245b05b05b05ap5 +REG epsg:2121 0 0x1.55f59e26af37bp7 -0x1.5716c16c16c17p5 +REG epsg:2121 1 0x1.484fba9414005p7 -0x1.7f16c16c16c17p5 +REG epsg:2121 2 0x1.639b81b94a6f1p7 -0x1.7f16c16c16c17p5 +REG epsg:2121 3 0x1.484fba9414005p7 -0x1.2f16c16c16c17p5 +REG epsg:2121 4 0x1.639b81b94a6f1p7 -0x1.2f16c16c16c17p5 +REG epsg:2122 0 0x1.54858bf258bf1p7 -0x1.58e147ae147aep5 +REG epsg:2122 1 0x1.46d2e76a28bfp7 -0x1.80e147ae147aep5 +REG epsg:2122 2 0x1.6238307a88bf2p7 -0x1.80e147ae147aep5 +REG epsg:2122 3 0x1.46d2e76a28bfp7 -0x1.30e147ae147aep5 +REG epsg:2122 4 0x1.6238307a88bf2p7 -0x1.30e147ae147aep5 +REG epsg:2123 0 0x1.513654320fedcp7 -0x1.5fd27d27d27d3p5 +REG epsg:2123 1 0x1.4350d79e6bf7dp7 -0x1.87d27d27d27d3p5 +REG epsg:2123 2 0x1.5f1bd0c5b3e3bp7 -0x1.87d27d27d27d3p5 +REG epsg:2123 3 0x1.4350d79e6bf7dp7 -0x1.37d27d27d27d3p5 +REG epsg:2123 4 0x1.5f1bd0c5b3e3bp7 -0x1.37d27d27d27d3p5 +REG epsg:2124 0 0x1.5974320fedcbdp7 -0x1.5cb97530eca87p5 +REG epsg:2124 1 0x1.4ba5ad8909d04p7 -0x1.84b97530eca87p5 +REG epsg:2124 2 0x1.6742b696d1c76p7 -0x1.84b97530eca87p5 +REG epsg:2124 3 0x1.4ba5ad8909d04p7 -0x1.34b97530eca87p5 +REG epsg:2124 4 0x1.6742b696d1c76p7 -0x1.34b97530eca87p5 +REG epsg:2125 0 0x1.56b89abcdf01p7 -0x1.5dfd27d27d27dp5 +REG epsg:2125 1 0x1.48e0c44d7fc1ep7 -0x1.85fd27d27d27dp5 +REG epsg:2125 2 0x1.6490712c3e402p7 -0x1.85fd27d27d27dp5 +REG epsg:2125 3 0x1.48e0c44d7fc1ep7 -0x1.35fd27d27d27dp5 +REG epsg:2125 4 0x1.6490712c3e402p7 -0x1.35fd27d27d27dp5 +REG epsg:2126 0 0x1.561d4c3b2a19p7 -0x1.63372ea61d952p5 +REG epsg:2126 1 0x1.481e1dd741c88p7 -0x1.8b372ea61d952p5 +REG epsg:2126 2 0x1.641c7a9f12698p7 -0x1.8b372ea61d952p5 +REG epsg:2126 3 0x1.481e1dd741c88p7 -0x1.3b372ea61d952p5 +REG epsg:2126 4 0x1.641c7a9f12698p7 -0x1.3b372ea61d952p5 +REG epsg:2127 0 0x1.52ef5c28f5c29p7 -0x1.65e147ae147aep5 +REG epsg:2127 1 0x1.44db9a3d26beap7 -0x1.8de147ae147aep5 +REG epsg:2127 2 0x1.61031e14c4c68p7 -0x1.8de147ae147aep5 +REG epsg:2127 3 0x1.44db9a3d26beap7 -0x1.3de147ae147aep5 +REG epsg:2127 4 0x1.61031e14c4c68p7 -0x1.3de147ae147aep5 +REG epsg:2128 0 0x1.50cc16c16c16cp7 -0x1.690fedcba9877p5 +REG epsg:2128 1 0x1.429f4872f0ac6p7 -0x1.910fedcba9877p5 +REG epsg:2128 2 0x1.5ef8e50fe7812p7 -0x1.910fedcba9877p5 +REG epsg:2128 3 0x1.429f4872f0ac6p7 -0x1.410fedcba9877p5 +REG epsg:2128 4 0x1.5ef8e50fe7812p7 -0x1.410fedcba9877p5 +REG epsg:2129 0 0x1.4f7a2b3c4d5e7p7 -0x1.6c82468acf135p5 +REG epsg:2129 1 0x1.4131a3134ba3dp7 -0x1.9482468acf135p5 +REG epsg:2129 2 0x1.5dc2b3654f191p7 -0x1.9482468acf135p5 +REG epsg:2129 3 0x1.4131a3134ba3dp7 -0x1.4482468acf135p5 +REG epsg:2129 4 0x1.5dc2b3654f191p7 -0x1.4482468acf135p5 +REG epsg:21291 0 -0x1.fp5 0x0.0p0 +REG epsg:21291 1 -0x1.0cp6 -0x1.4p2 +REG epsg:21291 2 -0x1.c8p5 -0x1.4p2 +REG epsg:21291 3 -0x1.0cp6 0x1.4p2 +REG epsg:21291 4 -0x1.c8p5 0x1.4p2 +REG epsg:21292 0 -0x1.dc7a4fa4fa4fap5 0x1.a5a4fa4fa4fa6p3 +REG epsg:21292 1 -0x1.02c7984b5d8bp6 0x1.05a4fa4fa4fa6p3 +REG epsg:21292 2 -0x1.b3656eb339893p5 0x1.05a4fa4fa4fa6p3 +REG epsg:21292 3 -0x1.02c7984b5d8bp6 0x1.22d27d27d27d3p4 +REG epsg:21292 4 -0x1.b3656eb339893p5 0x1.22d27d27d27d3p4 +REG epsg:2130 0 0x1.5541b4e81b4e7p7 -0x1.6e87654320feep5 +REG epsg:2130 1 0x1.46e8a165832fap7 -0x1.9687654320feep5 +REG epsg:2130 2 0x1.639ac86ab36d4p7 -0x1.9687654320feep5 +REG epsg:2130 3 0x1.46e8a165832fap7 -0x1.4687654320feep5 +REG epsg:2130 4 0x1.639ac86ab36d4p7 -0x1.4687654320feep5 +REG epsg:2131 0 0x1.5490a3d70a3d7p7 -0x1.6ee41fdb97531p5 +REG epsg:2131 1 0x1.463492dd06991p7 -0x1.96e41fdb97531p5 +REG epsg:2131 2 0x1.62ecb4d10de1dp7 -0x1.96e41fdb97531p5 +REG epsg:2131 3 0x1.463492dd06991p7 -0x1.46e41fdb97531p5 +REG epsg:2131 4 0x1.62ecb4d10de1dp7 -0x1.46e41fdb97531p5 +REG epsg:2132 0 0x1.50af8091a2b3dp7 -0x1.74ccccccccccdp5 +REG epsg:2132 1 0x1.4221a16181064p7 -0x1.9cccccccccccdp5 +REG epsg:2132 2 0x1.5f3d5fc1c4616p7 -0x1.9cccccccccccdp5 +REG epsg:2132 3 0x1.4221a16181064p7 -0x1.4cccccccccccdp5 +REG epsg:2132 4 0x1.5f3d5fc1c4616p7 -0x1.4cccccccccccdp5 +REG epsg:2133 0 0x1.4ap7 -0x1.9p4 +REG epsg:2133 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2133 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2133 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2133 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2134 0 0x1.56p7 -0x1.9p4 +REG epsg:2134 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:2134 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:2134 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:2134 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:2135 0 0x1.62p7 -0x1.9p4 +REG epsg:2135 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:2135 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:2135 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:2135 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:2136 0 -0x1.0p0 0x1.2aaaaaaaaaaabp2 +REG epsg:2136 1 -0x1.81107a2df9b6ep2 -0x1.555555555555p-2 +REG epsg:2136 2 0x1.01107a2df9b6ep2 -0x1.555555555555p-2 +REG epsg:2136 3 -0x1.81107a2df9b6ep2 0x1.3555555555556p3 +REG epsg:2136 4 0x1.01107a2df9b6ep2 0x1.3555555555556p3 +REG epsg:2137 0 -0x1.0p0 0x0.0p0 +REG epsg:2137 1 -0x1.8p2 -0x1.4p2 +REG epsg:2137 2 0x1.0p2 -0x1.4p2 +REG epsg:2137 3 -0x1.8p2 0x1.4p2 +REG epsg:2137 4 0x1.0p2 0x1.4p2 +REG epsg:2138 0 -0x1.12p6 0x1.ap5 +REG epsg:2138 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG epsg:2138 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG epsg:2138 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG epsg:2138 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG epsg:2139 0 -0x1.bcp5 0x0.0p0 +REG epsg:2139 1 -0x1.e4p5 -0x1.4p2 +REG epsg:2139 2 -0x1.94p5 -0x1.4p2 +REG epsg:2139 3 -0x1.e4p5 0x1.4p2 +REG epsg:2139 4 -0x1.94p5 0x1.4p2 +REG epsg:2140 0 -0x1.d4p5 0x0.0p0 +REG epsg:2140 1 -0x1.fcp5 -0x1.4p2 +REG epsg:2140 2 -0x1.acp5 -0x1.4p2 +REG epsg:2140 3 -0x1.fcp5 0x1.4p2 +REG epsg:2140 4 -0x1.acp5 0x1.4p2 +REG epsg:2141 0 -0x1.ecp5 0x0.0p0 +REG epsg:2141 1 -0x1.0ap6 -0x1.4p2 +REG epsg:2141 2 -0x1.c4p5 -0x1.4p2 +REG epsg:2141 3 -0x1.0ap6 0x1.4p2 +REG epsg:2141 4 -0x1.c4p5 0x1.4p2 +REG epsg:21413 0 0x1.2cp6 0x0.0p0 +REG epsg:21413 1 0x1.18p6 -0x1.4p2 +REG epsg:21413 2 0x1.4p6 -0x1.4p2 +REG epsg:21413 3 0x1.18p6 0x1.4p2 +REG epsg:21413 4 0x1.4p6 0x1.4p2 +REG epsg:21414 0 0x1.44p6 0x0.0p0 +REG epsg:21414 1 0x1.3p6 -0x1.4p2 +REG epsg:21414 2 0x1.58p6 -0x1.4p2 +REG epsg:21414 3 0x1.3p6 0x1.4p2 +REG epsg:21414 4 0x1.58p6 0x1.4p2 +REG epsg:21415 0 0x1.5cp6 0x0.0p0 +REG epsg:21415 1 0x1.48p6 -0x1.4p2 +REG epsg:21415 2 0x1.7p6 -0x1.4p2 +REG epsg:21415 3 0x1.48p6 0x1.4p2 +REG epsg:21415 4 0x1.7p6 0x1.4p2 +REG epsg:21416 0 0x1.74p6 0x0.0p0 +REG epsg:21416 1 0x1.6p6 -0x1.4p2 +REG epsg:21416 2 0x1.88p6 -0x1.4p2 +REG epsg:21416 3 0x1.6p6 0x1.4p2 +REG epsg:21416 4 0x1.88p6 0x1.4p2 +REG epsg:21417 0 0x1.8cp6 0x0.0p0 +REG epsg:21417 1 0x1.78p6 -0x1.4p2 +REG epsg:21417 2 0x1.ap6 -0x1.4p2 +REG epsg:21417 3 0x1.78p6 0x1.4p2 +REG epsg:21417 4 0x1.ap6 0x1.4p2 +REG epsg:21418 0 0x1.a4p6 0x0.0p0 +REG epsg:21418 1 0x1.9p6 -0x1.4p2 +REG epsg:21418 2 0x1.b8p6 -0x1.4p2 +REG epsg:21418 3 0x1.9p6 0x1.4p2 +REG epsg:21418 4 0x1.b8p6 0x1.4p2 +REG epsg:21419 0 0x1.bcp6 0x0.0p0 +REG epsg:21419 1 0x1.a8p6 -0x1.4p2 +REG epsg:21419 2 0x1.dp6 -0x1.4p2 +REG epsg:21419 3 0x1.a8p6 0x1.4p2 +REG epsg:21419 4 0x1.dp6 0x1.4p2 +REG epsg:2142 0 -0x1.02p6 0x0.0p0 +REG epsg:2142 1 -0x1.16p6 -0x1.4p2 +REG epsg:2142 2 -0x1.dcp5 -0x1.4p2 +REG epsg:2142 3 -0x1.16p6 0x1.4p2 +REG epsg:2142 4 -0x1.dcp5 0x1.4p2 +REG epsg:21420 0 0x1.d4p6 0x0.0p0 +REG epsg:21420 1 0x1.cp6 -0x1.4p2 +REG epsg:21420 2 0x1.e8p6 -0x1.4p2 +REG epsg:21420 3 0x1.cp6 0x1.4p2 +REG epsg:21420 4 0x1.e8p6 0x1.4p2 +REG epsg:21421 0 0x1.ecp6 0x0.0p0 +REG epsg:21421 1 0x1.d8p6 -0x1.4p2 +REG epsg:21421 2 0x1.0p7 -0x1.4p2 +REG epsg:21421 3 0x1.d8p6 0x1.4p2 +REG epsg:21421 4 0x1.0p7 0x1.4p2 +REG epsg:21422 0 0x1.02p7 0x0.0p0 +REG epsg:21422 1 0x1.fp6 -0x1.4p2 +REG epsg:21422 2 0x1.0cp7 -0x1.4p2 +REG epsg:21422 3 0x1.fp6 0x1.4p2 +REG epsg:21422 4 0x1.0cp7 0x1.4p2 +REG epsg:21423 0 0x1.0ep7 0x0.0p0 +REG epsg:21423 1 0x1.04p7 -0x1.4p2 +REG epsg:21423 2 0x1.18p7 -0x1.4p2 +REG epsg:21423 3 0x1.04p7 0x1.4p2 +REG epsg:21423 4 0x1.18p7 0x1.4p2 +REG epsg:2143 0 -0x1.0ep6 0x0.0p0 +REG epsg:2143 1 -0x1.22p6 -0x1.4p2 +REG epsg:2143 2 -0x1.f4p5 -0x1.4p2 +REG epsg:2143 3 -0x1.22p6 0x1.4p2 +REG epsg:2143 4 -0x1.f4p5 0x1.4p2 +REG epsg:2144 0 -0x1.1ap6 0x0.0p0 +REG epsg:2144 1 -0x1.2ep6 -0x1.4p2 +REG epsg:2144 2 -0x1.06p6 -0x1.4p2 +REG epsg:2144 3 -0x1.2ep6 0x1.4p2 +REG epsg:2144 4 -0x1.06p6 0x1.4p2 +REG epsg:2145 0 -0x1.26p6 0x0.0p0 +REG epsg:2145 1 -0x1.3ap6 -0x1.4p2 +REG epsg:2145 2 -0x1.12p6 -0x1.4p2 +REG epsg:2145 3 -0x1.3ap6 0x1.4p2 +REG epsg:2145 4 -0x1.12p6 0x1.4p2 +REG epsg:21453 0 0x1.2cp6 0x0.0p0 +REG epsg:21453 1 0x1.18p6 -0x1.4p2 +REG epsg:21453 2 0x1.4p6 -0x1.4p2 +REG epsg:21453 3 0x1.18p6 0x1.4p2 +REG epsg:21453 4 0x1.4p6 0x1.4p2 +REG epsg:21454 0 0x1.44p6 0x0.0p0 +REG epsg:21454 1 0x1.3p6 -0x1.4p2 +REG epsg:21454 2 0x1.58p6 -0x1.4p2 +REG epsg:21454 3 0x1.3p6 0x1.4p2 +REG epsg:21454 4 0x1.58p6 0x1.4p2 +REG epsg:21455 0 0x1.5cp6 0x0.0p0 +REG epsg:21455 1 0x1.48p6 -0x1.4p2 +REG epsg:21455 2 0x1.7p6 -0x1.4p2 +REG epsg:21455 3 0x1.48p6 0x1.4p2 +REG epsg:21455 4 0x1.7p6 0x1.4p2 +REG epsg:21456 0 0x1.74p6 0x0.0p0 +REG epsg:21456 1 0x1.6p6 -0x1.4p2 +REG epsg:21456 2 0x1.88p6 -0x1.4p2 +REG epsg:21456 3 0x1.6p6 0x1.4p2 +REG epsg:21456 4 0x1.88p6 0x1.4p2 +REG epsg:21457 0 0x1.8cp6 0x0.0p0 +REG epsg:21457 1 0x1.78p6 -0x1.4p2 +REG epsg:21457 2 0x1.ap6 -0x1.4p2 +REG epsg:21457 3 0x1.78p6 0x1.4p2 +REG epsg:21457 4 0x1.ap6 0x1.4p2 +REG epsg:21458 0 0x1.a4p6 0x0.0p0 +REG epsg:21458 1 0x1.9p6 -0x1.4p2 +REG epsg:21458 2 0x1.b8p6 -0x1.4p2 +REG epsg:21458 3 0x1.9p6 0x1.4p2 +REG epsg:21458 4 0x1.b8p6 0x1.4p2 +REG epsg:21459 0 0x1.bcp6 0x0.0p0 +REG epsg:21459 1 0x1.a8p6 -0x1.4p2 +REG epsg:21459 2 0x1.dp6 -0x1.4p2 +REG epsg:21459 3 0x1.a8p6 0x1.4p2 +REG epsg:21459 4 0x1.dp6 0x1.4p2 +REG epsg:2146 0 -0x1.32p6 0x0.0p0 +REG epsg:2146 1 -0x1.46p6 -0x1.4p2 +REG epsg:2146 2 -0x1.1ep6 -0x1.4p2 +REG epsg:2146 3 -0x1.46p6 0x1.4p2 +REG epsg:2146 4 -0x1.1ep6 0x1.4p2 +REG epsg:21460 0 0x1.d4p6 0x0.0p0 +REG epsg:21460 1 0x1.cp6 -0x1.4p2 +REG epsg:21460 2 0x1.e8p6 -0x1.4p2 +REG epsg:21460 3 0x1.cp6 0x1.4p2 +REG epsg:21460 4 0x1.e8p6 0x1.4p2 +REG epsg:21461 0 0x1.ecp6 0x0.0p0 +REG epsg:21461 1 0x1.d8p6 -0x1.4p2 +REG epsg:21461 2 0x1.0p7 -0x1.4p2 +REG epsg:21461 3 0x1.d8p6 0x1.4p2 +REG epsg:21461 4 0x1.0p7 0x1.4p2 +REG epsg:21462 0 0x1.02p7 0x0.0p0 +REG epsg:21462 1 0x1.fp6 -0x1.4p2 +REG epsg:21462 2 0x1.0cp7 -0x1.4p2 +REG epsg:21462 3 0x1.fp6 0x1.4p2 +REG epsg:21462 4 0x1.0cp7 0x1.4p2 +REG epsg:21463 0 0x1.0ep7 0x0.0p0 +REG epsg:21463 1 0x1.04p7 -0x1.4p2 +REG epsg:21463 2 0x1.18p7 -0x1.4p2 +REG epsg:21463 3 0x1.04p7 0x1.4p2 +REG epsg:21463 4 0x1.18p7 0x1.4p2 +REG epsg:2147 0 -0x1.3ep6 0x0.0p0 +REG epsg:2147 1 -0x1.52p6 -0x1.4p2 +REG epsg:2147 2 -0x1.2ap6 -0x1.4p2 +REG epsg:2147 3 -0x1.52p6 0x1.4p2 +REG epsg:2147 4 -0x1.2ap6 0x1.4p2 +REG epsg:21473 0 0x1.2cp6 0x0.0p0 +REG epsg:21473 1 0x1.18p6 -0x1.4p2 +REG epsg:21473 2 0x1.4p6 -0x1.4p2 +REG epsg:21473 3 0x1.18p6 0x1.4p2 +REG epsg:21473 4 0x1.4p6 0x1.4p2 +REG epsg:21474 0 0x1.44p6 0x0.0p0 +REG epsg:21474 1 0x1.3p6 -0x1.4p2 +REG epsg:21474 2 0x1.58p6 -0x1.4p2 +REG epsg:21474 3 0x1.3p6 0x1.4p2 +REG epsg:21474 4 0x1.58p6 0x1.4p2 +REG epsg:21475 0 0x1.5cp6 0x0.0p0 +REG epsg:21475 1 0x1.48p6 -0x1.4p2 +REG epsg:21475 2 0x1.7p6 -0x1.4p2 +REG epsg:21475 3 0x1.48p6 0x1.4p2 +REG epsg:21475 4 0x1.7p6 0x1.4p2 +REG epsg:21476 0 0x1.74p6 0x0.0p0 +REG epsg:21476 1 0x1.6p6 -0x1.4p2 +REG epsg:21476 2 0x1.88p6 -0x1.4p2 +REG epsg:21476 3 0x1.6p6 0x1.4p2 +REG epsg:21476 4 0x1.88p6 0x1.4p2 +REG epsg:21477 0 0x1.8cp6 0x0.0p0 +REG epsg:21477 1 0x1.78p6 -0x1.4p2 +REG epsg:21477 2 0x1.ap6 -0x1.4p2 +REG epsg:21477 3 0x1.78p6 0x1.4p2 +REG epsg:21477 4 0x1.ap6 0x1.4p2 +REG epsg:21478 0 0x1.a4p6 0x0.0p0 +REG epsg:21478 1 0x1.9p6 -0x1.4p2 +REG epsg:21478 2 0x1.b8p6 -0x1.4p2 +REG epsg:21478 3 0x1.9p6 0x1.4p2 +REG epsg:21478 4 0x1.b8p6 0x1.4p2 +REG epsg:21479 0 0x1.bcp6 0x0.0p0 +REG epsg:21479 1 0x1.a8p6 -0x1.4p2 +REG epsg:21479 2 0x1.dp6 -0x1.4p2 +REG epsg:21479 3 0x1.a8p6 0x1.4p2 +REG epsg:21479 4 0x1.dp6 0x1.4p2 +REG epsg:2148 0 -0x1.c8p5 0x0.0p0 +REG epsg:2148 1 -0x1.fp5 -0x1.4p2 +REG epsg:2148 2 -0x1.ap5 -0x1.4p2 +REG epsg:2148 3 -0x1.fp5 0x1.4p2 +REG epsg:2148 4 -0x1.ap5 0x1.4p2 +REG epsg:21480 0 0x1.d4p6 0x0.0p0 +REG epsg:21480 1 0x1.cp6 -0x1.4p2 +REG epsg:21480 2 0x1.e8p6 -0x1.4p2 +REG epsg:21480 3 0x1.cp6 0x1.4p2 +REG epsg:21480 4 0x1.e8p6 0x1.4p2 +REG epsg:21481 0 0x1.ecp6 0x0.0p0 +REG epsg:21481 1 0x1.d8p6 -0x1.4p2 +REG epsg:21481 2 0x1.0p7 -0x1.4p2 +REG epsg:21481 3 0x1.d8p6 0x1.4p2 +REG epsg:21481 4 0x1.0p7 0x1.4p2 +REG epsg:21482 0 0x1.02p7 0x0.0p0 +REG epsg:21482 1 0x1.fp6 -0x1.4p2 +REG epsg:21482 2 0x1.0cp7 -0x1.4p2 +REG epsg:21482 3 0x1.fp6 0x1.4p2 +REG epsg:21482 4 0x1.0cp7 0x1.4p2 +REG epsg:21483 0 0x1.0ep7 0x0.0p0 +REG epsg:21483 1 0x1.04p7 -0x1.4p2 +REG epsg:21483 2 0x1.18p7 -0x1.4p2 +REG epsg:21483 3 0x1.04p7 0x1.4p2 +REG epsg:21483 4 0x1.18p7 0x1.4p2 +REG epsg:2149 0 -0x1.2cp6 0x0.0p0 +REG epsg:2149 1 -0x1.4p6 -0x1.4p2 +REG epsg:2149 2 -0x1.18p6 -0x1.4p2 +REG epsg:2149 3 -0x1.4p6 0x1.4p2 +REG epsg:2149 4 -0x1.18p6 0x1.4p2 +REG epsg:2150 0 -0x1.44p6 0x0.0p0 +REG epsg:2150 1 -0x1.58p6 -0x1.4p2 +REG epsg:2150 2 -0x1.3p6 -0x1.4p2 +REG epsg:2150 3 -0x1.58p6 0x1.4p2 +REG epsg:2150 4 -0x1.3p6 0x1.4p2 +REG epsg:21500 0 0x0.0p0 0x1.17aaaaaaaaaabp6 +REG epsg:21500 1 -0x1.5d75df526a7fbp5 0x1.b755555555556p5 +REG epsg:21500 2 0x1.5d75df526a7fbp5 0x1.b755555555556p5 +REG epsg:21500 3 -0x1.5d75df526a7fbp5 0x1.53aaaaaaaaaabp6 +REG epsg:21500 4 0x1.5d75df526a7fbp5 0x1.53aaaaaaaaaabp6 +REG epsg:2151 0 -0x1.a4p6 0x0.0p0 +REG epsg:2151 1 -0x1.b8p6 -0x1.4p2 +REG epsg:2151 2 -0x1.9p6 -0x1.4p2 +REG epsg:2151 3 -0x1.b8p6 0x1.4p2 +REG epsg:2151 4 -0x1.9p6 0x1.4p2 +REG epsg:2152 0 -0x1.bcp6 0x0.0p0 +REG epsg:2152 1 -0x1.dp6 -0x1.4p2 +REG epsg:2152 2 -0x1.a8p6 -0x1.4p2 +REG epsg:2152 3 -0x1.dp6 0x1.4p2 +REG epsg:2152 4 -0x1.a8p6 0x1.4p2 +REG epsg:2153 0 -0x1.d4p6 0x0.0p0 +REG epsg:2153 1 -0x1.e8p6 -0x1.4p2 +REG epsg:2153 2 -0x1.cp6 -0x1.4p2 +REG epsg:2153 3 -0x1.e8p6 0x1.4p2 +REG epsg:2153 4 -0x1.cp6 0x1.4p2 +REG epsg:2154 0 0x1.8p1 0x1.74p5 +REG epsg:2154 1 -0x1.10e06f120d02p2 0x1.4cp5 +REG epsg:2154 2 0x1.487037890681p3 0x1.4cp5 +REG epsg:2154 3 -0x1.10e06f120d02p2 0x1.9cp5 +REG epsg:2154 4 0x1.487037890681p3 0x1.9cp5 +REG epsg:2155 0 0x1.54p7 -0x1.c88888888888ap3 +REG epsg:2155 1 0x1.49ae8908a9a94p7 -0x1.3444444444445p4 +REG epsg:2155 2 0x1.5e5176f75656cp7 -0x1.3444444444445p4 +REG epsg:2155 3 0x1.49ae8908a9a94p7 -0x1.288888888888ap3 +REG epsg:2155 4 0x1.5e5176f75656cp7 -0x1.288888888888ap3 +REG epsg:2156 0 0x1.56p7 -0x1.9p4 +REG epsg:2156 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:2156 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:2156 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:2156 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:2157 0 -0x1.0p3 0x1.acp5 +REG epsg:2157 1 -0x1.067e6c3855169p4 0x1.84p5 +REG epsg:2157 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG epsg:2157 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG epsg:2157 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG epsg:2158 0 -0x1.2p3 0x0.0p0 +REG epsg:2158 1 -0x1.cp3 -0x1.4p2 +REG epsg:2158 2 -0x1.0p2 -0x1.4p2 +REG epsg:2158 3 -0x1.cp3 0x1.4p2 +REG epsg:2158 4 -0x1.0p2 0x1.4p2 +REG epsg:2159 0 -0x1.8p3 0x1.aaaaaaaaaaaabp2 +REG epsg:2159 1 -0x1.108b6bd0721f4p4 0x1.aaaaaaaaaaaacp0 +REG epsg:2159 2 -0x1.bdd250be37832p2 0x1.aaaaaaaaaaaacp0 +REG epsg:2159 3 -0x1.108b6bd0721f4p4 0x1.7555555555556p3 +REG epsg:2159 4 -0x1.bdd250be37832p2 0x1.7555555555556p3 +REG epsg:2160 0 -0x1.8p3 0x1.aaaaaaaaaaaabp2 +REG epsg:2160 1 -0x1.108b6bd0721f4p4 0x1.aaaaaaaaaaaacp0 +REG epsg:2160 2 -0x1.bdd250be37832p2 0x1.aaaaaaaaaaaacp0 +REG epsg:2160 3 -0x1.108b6bd0721f4p4 0x1.7555555555556p3 +REG epsg:2160 4 -0x1.bdd250be37832p2 0x1.7555555555556p3 +REG epsg:2161 0 -0x1.ep3 0x0.0p0 +REG epsg:2161 1 -0x1.4p4 -0x1.4p2 +REG epsg:2161 2 -0x1.4p3 -0x1.4p2 +REG epsg:2161 3 -0x1.4p4 0x1.4p2 +REG epsg:2161 4 -0x1.4p3 0x1.4p2 +REG epsg:2162 0 -0x1.2p3 0x0.0p0 +REG epsg:2162 1 -0x1.cp3 -0x1.4p2 +REG epsg:2162 2 -0x1.0p2 -0x1.4p2 +REG epsg:2162 3 -0x1.cp3 0x1.4p2 +REG epsg:2162 4 -0x1.0p2 0x1.4p2 +REG epsg:2163 0 -0x1.9p6 0x1.68p5 +REG epsg:2163 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG epsg:2163 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG epsg:2163 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG epsg:2163 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG epsg:2164 0 -0x1.4p2 0x0.0p0 +REG epsg:2164 1 -0x1.4p3 -0x1.4p2 +REG epsg:2164 2 0x0.0p0 -0x1.4p2 +REG epsg:2164 3 -0x1.4p3 0x1.4p2 +REG epsg:2164 4 0x0.0p0 0x1.4p2 +REG epsg:2165 0 -0x1.4p2 0x0.0p0 +REG epsg:2165 1 -0x1.4p3 -0x1.4p2 +REG epsg:2165 2 0x0.0p0 -0x1.4p2 +REG epsg:2165 3 -0x1.4p3 0x1.4p2 +REG epsg:2165 4 0x0.0p0 0x1.4p2 +REG epsg:2166 0 0x1.2p3 0x0.0p0 +REG epsg:2166 1 0x1.0p2 -0x1.4p2 +REG epsg:2166 2 0x1.cp3 -0x1.4p2 +REG epsg:2166 3 0x1.0p2 0x1.4p2 +REG epsg:2166 4 0x1.cp3 0x1.4p2 +REG epsg:2167 0 0x1.8p3 0x0.0p0 +REG epsg:2167 1 0x1.cp2 -0x1.4p2 +REG epsg:2167 2 0x1.1p4 -0x1.4p2 +REG epsg:2167 3 0x1.cp2 0x1.4p2 +REG epsg:2167 4 0x1.1p4 0x1.4p2 +REG epsg:2168 0 0x1.ep3 0x0.0p0 +REG epsg:2168 1 0x1.4p3 -0x1.4p2 +REG epsg:2168 2 0x1.4p4 -0x1.4p2 +REG epsg:2168 3 0x1.4p3 0x1.4p2 +REG epsg:2168 4 0x1.4p4 0x1.4p2 +REG epsg:2169 0 0x1.8aaaaaaaaaaabp2 0x1.8eaaaaaaaaaacp5 +REG epsg:2169 1 -0x1.95c9edbad79ap0 0x1.66aaaaaaaaaacp5 +REG epsg:2169 2 0x1.bd63e862059dfp3 0x1.66aaaaaaaaaacp5 +REG epsg:2169 3 -0x1.95c9edbad79ap0 0x1.b6aaaaaaaaaacp5 +REG epsg:2169 4 0x1.bd63e862059dfp3 0x1.b6aaaaaaaaaacp5 +REG epsg:2170 0 0x1.ep3 0x0.0p0 +REG epsg:2170 1 0x1.4p3 -0x1.4p2 +REG epsg:2170 2 0x1.4p4 -0x1.4p2 +REG epsg:2170 3 0x1.4p3 0x1.4p2 +REG epsg:2170 4 0x1.4p4 0x1.4p2 +REG epsg:2171 0 0x1.5155555555554p4 0x1.95p5 +REG epsg:2171 1 0x1.a6750a37c615ep3 0x1.6dp5 +REG epsg:2171 2 0x1.cf70258ec79f9p4 0x1.6dp5 +REG epsg:2171 3 0x1.a6750a37c615ep3 0x1.bdp5 +REG epsg:2171 4 0x1.cf70258ec79f9p4 0x1.bdp5 +REG epsg:2172 0 0x1.580b60b60b60cp4 0x1.a803fb72ea61ep5 +REG epsg:2172 1 0x1.a636e8f731edcp3 0x1.8003fb72ea61ep5 +REG epsg:2172 2 0x1.dcfb4cf07dcaap4 0x1.8003fb72ea61ep5 +REG epsg:2172 3 0x1.a636e8f731edcp3 0x1.d003fb72ea61ep5 +REG epsg:2172 4 0x1.dcfb4cf07dcaap4 0x1.d003fb72ea61ep5 +REG epsg:2173 0 0x1.1022222222221p4 0x1.acaaaaaaaaaacp5 +REG epsg:2173 1 0x1.12bfbb2c37748p3 0x1.84aaaaaaaaaacp5 +REG epsg:2173 2 0x1.96e466ae2889ep4 0x1.84aaaaaaaaaacp5 +REG epsg:2173 3 0x1.12bfbb2c37748p3 0x1.d4aaaaaaaaaacp5 +REG epsg:2173 4 0x1.96e466ae2889ep4 0x1.d4aaaaaaaaaacp5 +REG epsg:2174 0 0x1.0ac16c16c16c1p4 0x1.9d5ddddddddddp5 +REG epsg:2174 1 0x1.13855653052adp3 0x1.755ddddddddddp5 +REG epsg:2174 2 0x1.8bc02d040042cp4 0x1.755ddddddddddp5 +REG epsg:2174 3 0x1.13855653052adp3 0x1.c55ddddddddddp5 +REG epsg:2174 4 0x1.8bc02d040042cp4 0x1.c55ddddddddddp5 +REG epsg:2175 0 0x1.2f55555555554p4 0x0.0p0 +REG epsg:2175 1 0x1.beaaaaaaaaaa8p3 -0x1.4p2 +REG epsg:2175 2 0x1.7f55555555554p4 -0x1.4p2 +REG epsg:2175 3 0x1.beaaaaaaaaaa8p3 0x1.4p2 +REG epsg:2175 4 0x1.7f55555555554p4 0x1.4p2 +REG epsg:2176 0 0x1.ep3 0x0.0p0 +REG epsg:2176 1 0x1.4p3 -0x1.4p2 +REG epsg:2176 2 0x1.4p4 -0x1.4p2 +REG epsg:2176 3 0x1.4p3 0x1.4p2 +REG epsg:2176 4 0x1.4p4 0x1.4p2 +REG epsg:2177 0 0x1.2p4 0x0.0p0 +REG epsg:2177 1 0x1.ap3 -0x1.4p2 +REG epsg:2177 2 0x1.7p4 -0x1.4p2 +REG epsg:2177 3 0x1.ap3 0x1.4p2 +REG epsg:2177 4 0x1.7p4 0x1.4p2 +REG epsg:2178 0 0x1.5p4 0x0.0p0 +REG epsg:2178 1 0x1.0p4 -0x1.4p2 +REG epsg:2178 2 0x1.ap4 -0x1.4p2 +REG epsg:2178 3 0x1.0p4 0x1.4p2 +REG epsg:2178 4 0x1.ap4 0x1.4p2 +REG epsg:21780 0 0x0.0p0 0x1.779e86cdcd1e6p5 +REG epsg:21780 1 -0x1.d4caba33b3222p2 0x1.4f9e86cdcd1e6p5 +REG epsg:21780 2 0x1.d4caba33b3222p2 0x1.4f9e86cdcd1e6p5 +REG epsg:21780 3 -0x1.d4caba33b3222p2 0x1.9f9e86cdcd1e6p5 +REG epsg:21780 4 0x1.d4caba33b3222p2 0x1.9f9e86cdcd1e6p5 +REG epsg:21781 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG epsg:21781 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG epsg:21781 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG epsg:21781 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG epsg:21781 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG epsg:21782 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG epsg:21782 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG epsg:21782 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG epsg:21782 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG epsg:21782 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG epsg:2179 0 0x1.8p4 0x0.0p0 +REG epsg:2179 1 0x1.3p4 -0x1.4p2 +REG epsg:2179 2 0x1.dp4 -0x1.4p2 +REG epsg:2179 3 0x1.3p4 0x1.4p2 +REG epsg:2179 4 0x1.dp4 0x1.4p2 +REG epsg:2180 0 0x1.3p4 0x0.0p0 +REG epsg:2180 1 0x1.cp3 -0x1.4p2 +REG epsg:2180 2 0x1.8p4 -0x1.4p2 +REG epsg:2180 3 0x1.cp3 0x1.4p2 +REG epsg:2180 4 0x1.8p4 0x1.4p2 +REG epsg:21817 0 -0x1.44p6 0x0.0p0 +REG epsg:21817 1 -0x1.58p6 -0x1.4p2 +REG epsg:21817 2 -0x1.3p6 -0x1.4p2 +REG epsg:21817 3 -0x1.58p6 0x1.4p2 +REG epsg:21817 4 -0x1.3p6 0x1.4p2 +REG epsg:21818 0 -0x1.2cp6 0x0.0p0 +REG epsg:21818 1 -0x1.4p6 -0x1.4p2 +REG epsg:21818 2 -0x1.18p6 -0x1.4p2 +REG epsg:21818 3 -0x1.4p6 0x1.4p2 +REG epsg:21818 4 -0x1.18p6 0x1.4p2 +REG epsg:2188 0 -0x1.08p5 0x0.0p0 +REG epsg:2188 1 -0x1.3p5 -0x1.4p2 +REG epsg:2188 2 -0x1.cp4 -0x1.4p2 +REG epsg:2188 3 -0x1.3p5 0x1.4p2 +REG epsg:2188 4 -0x1.cp4 0x1.4p2 +REG epsg:2189 0 -0x1.bp4 0x0.0p0 +REG epsg:2189 1 -0x1.0p5 -0x1.4p2 +REG epsg:2189 2 -0x1.6p4 -0x1.4p2 +REG epsg:2189 3 -0x1.0p5 0x1.4p2 +REG epsg:2189 4 -0x1.6p4 0x1.4p2 +REG epsg:21891 0 -0x1.3452dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21891 1 -0x1.486365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21891 2 -0x1.204251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG epsg:21891 3 -0x1.486365b101477p6 0x1.332b65148687ep3 +REG epsg:21891 4 -0x1.204251f226ff9p6 0x1.332b65148687ep3 +REG epsg:21892 0 -0x1.2852dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21892 1 -0x1.3c6365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21892 2 -0x1.144251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG epsg:21892 3 -0x1.3c6365b101477p6 0x1.332b65148687ep3 +REG epsg:21892 4 -0x1.144251f226ff9p6 0x1.332b65148687ep3 +REG epsg:21893 0 -0x1.1c52dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21893 1 -0x1.306365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21893 2 -0x1.084251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG epsg:21893 3 -0x1.306365b101477p6 0x1.332b65148687ep3 +REG epsg:21893 4 -0x1.084251f226ff9p6 0x1.332b65148687ep3 +REG epsg:21894 0 -0x1.1052dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21894 1 -0x1.246365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21894 2 -0x1.f884a3e44dff2p5 -0x1.9a935d6f2f04p-2 +REG epsg:21894 3 -0x1.246365b101477p6 0x1.332b65148687ep3 +REG epsg:21894 4 -0x1.f884a3e44dff2p5 0x1.332b65148687ep3 +REG epsg:21896 0 -0x1.3452dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21896 1 -0x1.486365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21896 2 -0x1.204251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG epsg:21896 3 -0x1.486365b101477p6 0x1.332b65148687ep3 +REG epsg:21896 4 -0x1.204251f226ff9p6 0x1.332b65148687ep3 +REG epsg:21897 0 -0x1.2852dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21897 1 -0x1.3c6365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21897 2 -0x1.144251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG epsg:21897 3 -0x1.3c6365b101477p6 0x1.332b65148687ep3 +REG epsg:21897 4 -0x1.144251f226ff9p6 0x1.332b65148687ep3 +REG epsg:21898 0 -0x1.1c52dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21898 1 -0x1.306365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21898 2 -0x1.084251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG epsg:21898 3 -0x1.306365b101477p6 0x1.332b65148687ep3 +REG epsg:21898 4 -0x1.084251f226ff9p6 0x1.332b65148687ep3 +REG epsg:21899 0 -0x1.1052dbd194238p6 0x1.2656ca290d0fcp2 +REG epsg:21899 1 -0x1.246365b101477p6 -0x1.9a935d6f2f04p-2 +REG epsg:21899 2 -0x1.f884a3e44dff2p5 -0x1.9a935d6f2f04p-2 +REG epsg:21899 3 -0x1.246365b101477p6 0x1.332b65148687ep3 +REG epsg:21899 4 -0x1.f884a3e44dff2p5 0x1.332b65148687ep3 +REG epsg:2190 0 -0x1.bp4 0x0.0p0 +REG epsg:2190 1 -0x1.0p5 -0x1.4p2 +REG epsg:2190 2 -0x1.6p4 -0x1.4p2 +REG epsg:2190 3 -0x1.0p5 0x1.4p2 +REG epsg:2190 4 -0x1.6p4 0x1.4p2 +REG epsg:2191 0 -0x1.ep3 0x0.0p0 +REG epsg:2191 1 -0x1.4p4 -0x1.4p2 +REG epsg:2191 2 -0x1.4p3 -0x1.4p2 +REG epsg:2191 3 -0x1.4p4 0x1.4p2 +REG epsg:2191 4 -0x1.4p3 0x1.4p2 +REG epsg:2192 0 0x1.2b2a53490b9bp1 0x1.7666666666666p5 +REG epsg:2192 1 -0x1.3de1330a236dbp2 0x1.4e66666666666p5 +REG epsg:2192 2 0x1.3485c32997846p3 0x1.4e66666666666p5 +REG epsg:2192 3 -0x1.3de1330a236dbp2 0x1.9e66666666666p5 +REG epsg:2192 4 0x1.3485c32997846p3 0x1.9e66666666666p5 +REG epsg:2193 0 0x1.5ap7 0x0.0p0 +REG epsg:2193 1 0x1.5p7 -0x1.4p2 +REG epsg:2193 2 0x1.64p7 -0x1.4p2 +REG epsg:2193 3 0x1.5p7 0x1.4p2 +REG epsg:2193 4 0x1.64p7 0x1.4p2 +REG epsg:2194 0 -0x1.54p7 -0x1.c88888888888ap3 +REG epsg:2194 1 -0x1.5e5176f75656cp7 -0x1.3444444444445p4 +REG epsg:2194 2 -0x1.49ae8908a9a94p7 -0x1.3444444444445p4 +REG epsg:2194 3 -0x1.5e5176f75656cp7 -0x1.288888888888ap3 +REG epsg:2194 4 -0x1.49ae8908a9a94p7 -0x1.288888888888ap3 +REG epsg:2195 0 -0x1.56p7 -0x1.9p4 +REG epsg:2195 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:2195 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:2195 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:2195 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:2196 0 0x1.3p3 0x0.0p0 +REG epsg:2196 1 0x1.2p2 -0x1.4p2 +REG epsg:2196 2 0x1.dp3 -0x1.4p2 +REG epsg:2196 3 0x1.2p2 0x1.4p2 +REG epsg:2196 4 0x1.dp3 0x1.4p2 +REG epsg:2197 0 0x1.8p3 0x0.0p0 +REG epsg:2197 1 0x1.cp2 -0x1.4p2 +REG epsg:2197 2 0x1.1p4 -0x1.4p2 +REG epsg:2197 3 0x1.cp2 0x1.4p2 +REG epsg:2197 4 0x1.1p4 0x1.4p2 +REG epsg:2198 0 0x1.ep3 0x0.0p0 +REG epsg:2198 1 0x1.4p3 -0x1.4p2 +REG epsg:2198 2 0x1.4p4 -0x1.4p2 +REG epsg:2198 3 0x1.4p3 0x1.4p2 +REG epsg:2198 4 0x1.4p4 0x1.4p2 +REG epsg:2199 0 0x1.5p4 0x0.0p0 +REG epsg:2199 1 0x1.0p4 -0x1.4p2 +REG epsg:2199 2 0x1.ap4 -0x1.4p2 +REG epsg:2199 3 0x1.0p4 0x1.4p2 +REG epsg:2199 4 0x1.ap4 0x1.4p2 +REG epsg:2200 0 -0x1.0ap6 0x1.74p5 +REG epsg:2200 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG epsg:2200 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG epsg:2200 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG epsg:2200 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG epsg:2201 0 -0x1.2cp6 0x0.0p0 +REG epsg:2201 1 -0x1.4p6 -0x1.4p2 +REG epsg:2201 2 -0x1.18p6 -0x1.4p2 +REG epsg:2201 3 -0x1.4p6 0x1.4p2 +REG epsg:2201 4 -0x1.18p6 0x1.4p2 +REG epsg:2202 0 -0x1.14p6 0x0.0p0 +REG epsg:2202 1 -0x1.28p6 -0x1.4p2 +REG epsg:2202 2 -0x1.0p6 -0x1.4p2 +REG epsg:2202 3 -0x1.28p6 0x1.4p2 +REG epsg:2202 4 -0x1.0p6 0x1.4p2 +REG epsg:2203 0 -0x1.f8p5 0x0.0p0 +REG epsg:2203 1 -0x1.1p6 -0x1.4p2 +REG epsg:2203 2 -0x1.dp5 -0x1.4p2 +REG epsg:2203 3 -0x1.1p6 0x1.4p2 +REG epsg:2203 4 -0x1.dp5 0x1.4p2 +REG epsg:22032 0 0x1.2p3 -0x1.9p4 +REG epsg:22032 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:22032 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:22032 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:22032 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:22033 0 0x1.ep3 -0x1.9p4 +REG epsg:22033 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:22033 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:22033 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:22033 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:2204 0 -0x1.58p6 0x1.1c55555555554p5 +REG epsg:2204 1 -0x1.609a4e06b0d59p6 0x1.0e55555555554p5 +REG epsg:2204 2 -0x1.4f65b1f94f2a7p6 0x1.0e55555555554p5 +REG epsg:2204 3 -0x1.609a4e06b0d59p6 0x1.2a55555555554p5 +REG epsg:2204 4 -0x1.4f65b1f94f2a7p6 0x1.2a55555555554p5 +REG epsg:2205 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:2205 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:2205 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:2205 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:2205 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:2206 0 0x1.bp4 0x0.0p0 +REG epsg:2206 1 0x1.6p4 -0x1.4p2 +REG epsg:2206 2 0x1.0p5 -0x1.4p2 +REG epsg:2206 3 0x1.6p4 0x1.4p2 +REG epsg:2206 4 0x1.0p5 0x1.4p2 +REG epsg:2207 0 0x1.ep4 0x0.0p0 +REG epsg:2207 1 0x1.9p4 -0x1.4p2 +REG epsg:2207 2 0x1.18p5 -0x1.4p2 +REG epsg:2207 3 0x1.9p4 0x1.4p2 +REG epsg:2207 4 0x1.18p5 0x1.4p2 +REG epsg:2208 0 0x1.08p5 0x0.0p0 +REG epsg:2208 1 0x1.cp4 -0x1.4p2 +REG epsg:2208 2 0x1.3p5 -0x1.4p2 +REG epsg:2208 3 0x1.cp4 0x1.4p2 +REG epsg:2208 4 0x1.3p5 0x1.4p2 +REG epsg:2209 0 0x1.2p5 0x0.0p0 +REG epsg:2209 1 0x1.fp4 -0x1.4p2 +REG epsg:2209 2 0x1.48p5 -0x1.4p2 +REG epsg:2209 3 0x1.fp4 0x1.4p2 +REG epsg:2209 4 0x1.48p5 0x1.4p2 +REG epsg:22091 0 0x1.7p3 0x0.0p0 +REG epsg:22091 1 0x1.ap2 -0x1.4p2 +REG epsg:22091 2 0x1.08p4 -0x1.4p2 +REG epsg:22091 3 0x1.ap2 0x1.4p2 +REG epsg:22091 4 0x1.08p4 0x1.4p2 +REG epsg:22092 0 0x1.8p3 0x0.0p0 +REG epsg:22092 1 0x1.cp2 -0x1.4p2 +REG epsg:22092 2 0x1.1p4 -0x1.4p2 +REG epsg:22092 3 0x1.cp2 0x1.4p2 +REG epsg:22092 4 0x1.1p4 0x1.4p2 +REG epsg:2210 0 0x1.38p5 0x0.0p0 +REG epsg:2210 1 0x1.1p5 -0x1.4p2 +REG epsg:2210 2 0x1.6p5 -0x1.4p2 +REG epsg:2210 3 0x1.1p5 0x1.4p2 +REG epsg:2210 4 0x1.6p5 0x1.4p2 +REG epsg:2211 0 0x1.5p5 0x0.0p0 +REG epsg:2211 1 0x1.28p5 -0x1.4p2 +REG epsg:2211 2 0x1.78p5 -0x1.4p2 +REG epsg:2211 3 0x1.28p5 0x1.4p2 +REG epsg:2211 4 0x1.78p5 0x1.4p2 +REG epsg:2212 0 0x1.68p5 0x0.0p0 +REG epsg:2212 1 0x1.4p5 -0x1.4p2 +REG epsg:2212 2 0x1.9p5 -0x1.4p2 +REG epsg:2212 3 0x1.4p5 0x1.4p2 +REG epsg:2212 4 0x1.9p5 0x1.4p2 +REG epsg:2213 0 0x1.ep4 0x0.0p0 +REG epsg:2213 1 0x1.9p4 -0x1.4p2 +REG epsg:2213 2 0x1.18p5 -0x1.4p2 +REG epsg:2213 3 0x1.9p4 0x1.4p2 +REG epsg:2213 4 0x1.18p5 0x1.4p2 +REG epsg:2214 0 0x1.5p3 0x0.0p0 +REG epsg:2214 1 0x1.6p2 -0x1.4p2 +REG epsg:2214 2 0x1.fp3 -0x1.4p2 +REG epsg:2214 3 0x1.6p2 0x1.4p2 +REG epsg:2214 4 0x1.fp3 0x1.4p2 +REG epsg:2215 0 0x1.2p3 0x0.0p0 +REG epsg:2215 1 0x1.0p2 -0x1.4p2 +REG epsg:2215 2 0x1.cp3 -0x1.4p2 +REG epsg:2215 3 0x1.0p2 0x1.4p2 +REG epsg:2215 4 0x1.cp3 0x1.4p2 +REG epsg:2216 0 -0x1.98p5 0x0.0p0 +REG epsg:2216 1 -0x1.cp5 -0x1.4p2 +REG epsg:2216 2 -0x1.7p5 -0x1.4p2 +REG epsg:2216 3 -0x1.cp5 0x1.4p2 +REG epsg:2216 4 -0x1.7p5 0x1.4p2 +REG epsg:2217 0 -0x1.68p5 0x0.0p0 +REG epsg:2217 1 -0x1.9p5 -0x1.4p2 +REG epsg:2217 2 -0x1.4p5 -0x1.4p2 +REG epsg:2217 3 -0x1.9p5 0x1.4p2 +REG epsg:2217 4 -0x1.4p5 0x1.4p2 +REG epsg:22171 0 -0x1.2p6 -0x1.64p6 +REG epsg:22171 1 -0x1.08p7 -0x1.64p6 +REG epsg:22171 2 -0x1.8p3 -0x1.64p6 +REG epsg:22171 3 -0x1.08p7 -0x1.54p6 +REG epsg:22171 4 -0x1.8p3 -0x1.54p6 +REG epsg:22172 0 -0x1.14p6 -0x1.64p6 +REG epsg:22172 1 -0x1.02p7 -0x1.64p6 +REG epsg:22172 2 -0x1.2p3 -0x1.64p6 +REG epsg:22172 3 -0x1.02p7 -0x1.54p6 +REG epsg:22172 4 -0x1.2p3 -0x1.54p6 +REG epsg:22173 0 -0x1.08p6 -0x1.64p6 +REG epsg:22173 1 -0x1.f8p6 -0x1.64p6 +REG epsg:22173 2 -0x1.8p2 -0x1.64p6 +REG epsg:22173 3 -0x1.f8p6 -0x1.54p6 +REG epsg:22173 4 -0x1.8p2 -0x1.54p6 +REG epsg:22174 0 -0x1.f8p5 -0x1.64p6 +REG epsg:22174 1 -0x1.ecp6 -0x1.64p6 +REG epsg:22174 2 -0x1.8p1 -0x1.64p6 +REG epsg:22174 3 -0x1.ecp6 -0x1.54p6 +REG epsg:22174 4 -0x1.8p1 -0x1.54p6 +REG epsg:22175 0 -0x1.ep5 -0x1.64p6 +REG epsg:22175 1 -0x1.ep6 -0x1.64p6 +REG epsg:22175 2 0x0.0p0 -0x1.64p6 +REG epsg:22175 3 -0x1.ep6 -0x1.54p6 +REG epsg:22175 4 0x0.0p0 -0x1.54p6 +REG epsg:22176 0 -0x1.c8p5 -0x1.64p6 +REG epsg:22176 1 -0x1.d4p6 -0x1.64p6 +REG epsg:22176 2 0x1.8p1 -0x1.64p6 +REG epsg:22176 3 -0x1.d4p6 -0x1.54p6 +REG epsg:22176 4 0x1.8p1 -0x1.54p6 +REG epsg:22177 0 -0x1.bp5 -0x1.64p6 +REG epsg:22177 1 -0x1.c8p6 -0x1.64p6 +REG epsg:22177 2 0x1.8p2 -0x1.64p6 +REG epsg:22177 3 -0x1.c8p6 -0x1.54p6 +REG epsg:22177 4 0x1.8p2 -0x1.54p6 +REG epsg:22181 0 -0x1.2p6 -0x1.64p6 +REG epsg:22181 1 -0x1.08p7 -0x1.64p6 +REG epsg:22181 2 -0x1.8p3 -0x1.64p6 +REG epsg:22181 3 -0x1.08p7 -0x1.54p6 +REG epsg:22181 4 -0x1.8p3 -0x1.54p6 +REG epsg:22182 0 -0x1.14p6 -0x1.64p6 +REG epsg:22182 1 -0x1.02p7 -0x1.64p6 +REG epsg:22182 2 -0x1.2p3 -0x1.64p6 +REG epsg:22182 3 -0x1.02p7 -0x1.54p6 +REG epsg:22182 4 -0x1.2p3 -0x1.54p6 +REG epsg:22183 0 -0x1.08p6 -0x1.64p6 +REG epsg:22183 1 -0x1.f8p6 -0x1.64p6 +REG epsg:22183 2 -0x1.8p2 -0x1.64p6 +REG epsg:22183 3 -0x1.f8p6 -0x1.54p6 +REG epsg:22183 4 -0x1.8p2 -0x1.54p6 +REG epsg:22184 0 -0x1.f8p5 -0x1.64p6 +REG epsg:22184 1 -0x1.ecp6 -0x1.64p6 +REG epsg:22184 2 -0x1.8p1 -0x1.64p6 +REG epsg:22184 3 -0x1.ecp6 -0x1.54p6 +REG epsg:22184 4 -0x1.8p1 -0x1.54p6 +REG epsg:22185 0 -0x1.ep5 -0x1.64p6 +REG epsg:22185 1 -0x1.ep6 -0x1.64p6 +REG epsg:22185 2 0x0.0p0 -0x1.64p6 +REG epsg:22185 3 -0x1.ep6 -0x1.54p6 +REG epsg:22185 4 0x0.0p0 -0x1.54p6 +REG epsg:22186 0 -0x1.c8p5 -0x1.64p6 +REG epsg:22186 1 -0x1.d4p6 -0x1.64p6 +REG epsg:22186 2 0x1.8p1 -0x1.64p6 +REG epsg:22186 3 -0x1.d4p6 -0x1.54p6 +REG epsg:22186 4 0x1.8p1 -0x1.54p6 +REG epsg:22187 0 -0x1.bp5 -0x1.64p6 +REG epsg:22187 1 -0x1.c8p6 -0x1.64p6 +REG epsg:22187 2 0x1.8p2 -0x1.64p6 +REG epsg:22187 3 -0x1.c8p6 -0x1.54p6 +REG epsg:22187 4 0x1.8p2 -0x1.54p6 +REG epsg:2219 0 -0x1.14p6 0x0.0p0 +REG epsg:2219 1 -0x1.28p6 -0x1.4p2 +REG epsg:2219 2 -0x1.0p6 -0x1.4p2 +REG epsg:2219 3 -0x1.28p6 0x1.4p2 +REG epsg:2219 4 -0x1.0p6 0x1.4p2 +REG epsg:22191 0 -0x1.2p6 -0x1.64p6 +REG epsg:22191 1 -0x1.08p7 -0x1.64p6 +REG epsg:22191 2 -0x1.8p3 -0x1.64p6 +REG epsg:22191 3 -0x1.08p7 -0x1.54p6 +REG epsg:22191 4 -0x1.8p3 -0x1.54p6 +REG epsg:22192 0 -0x1.14p6 -0x1.64p6 +REG epsg:22192 1 -0x1.02p7 -0x1.64p6 +REG epsg:22192 2 -0x1.2p3 -0x1.64p6 +REG epsg:22192 3 -0x1.02p7 -0x1.54p6 +REG epsg:22192 4 -0x1.2p3 -0x1.54p6 +REG epsg:22193 0 -0x1.08p6 -0x1.64p6 +REG epsg:22193 1 -0x1.f8p6 -0x1.64p6 +REG epsg:22193 2 -0x1.8p2 -0x1.64p6 +REG epsg:22193 3 -0x1.f8p6 -0x1.54p6 +REG epsg:22193 4 -0x1.8p2 -0x1.54p6 +REG epsg:22194 0 -0x1.f8p5 -0x1.64p6 +REG epsg:22194 1 -0x1.ecp6 -0x1.64p6 +REG epsg:22194 2 -0x1.8p1 -0x1.64p6 +REG epsg:22194 3 -0x1.ecp6 -0x1.54p6 +REG epsg:22194 4 -0x1.8p1 -0x1.54p6 +REG epsg:22195 0 -0x1.ep5 -0x1.64p6 +REG epsg:22195 1 -0x1.ep6 -0x1.64p6 +REG epsg:22195 2 0x0.0p0 -0x1.64p6 +REG epsg:22195 3 -0x1.ep6 -0x1.54p6 +REG epsg:22195 4 0x0.0p0 -0x1.54p6 +REG epsg:22196 0 -0x1.c8p5 -0x1.64p6 +REG epsg:22196 1 -0x1.d4p6 -0x1.64p6 +REG epsg:22196 2 0x1.8p1 -0x1.64p6 +REG epsg:22196 3 -0x1.d4p6 -0x1.54p6 +REG epsg:22196 4 0x1.8p1 -0x1.54p6 +REG epsg:22197 0 -0x1.bp5 -0x1.64p6 +REG epsg:22197 1 -0x1.c8p6 -0x1.64p6 +REG epsg:22197 2 0x1.8p2 -0x1.64p6 +REG epsg:22197 3 -0x1.c8p6 -0x1.54p6 +REG epsg:22197 4 0x1.8p2 -0x1.54p6 +REG epsg:2220 0 -0x1.f8p5 0x0.0p0 +REG epsg:2220 1 -0x1.1p6 -0x1.4p2 +REG epsg:2220 2 -0x1.dp5 -0x1.4p2 +REG epsg:2220 3 -0x1.1p6 0x1.4p2 +REG epsg:2220 4 -0x1.dp5 0x1.4p2 +REG epsg:2222 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:2222 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:2222 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:2222 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:2222 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:2223 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:2223 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:2223 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:2223 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:2223 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:22234 0 0x1.5p4 -0x1.9p4 +REG epsg:22234 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:22234 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:22234 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:22234 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:22235 0 0x1.bp4 -0x1.9p4 +REG epsg:22235 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:22235 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:22235 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:22235 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:22236 0 0x1.08p5 -0x1.9p4 +REG epsg:22236 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:22236 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:22236 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:22236 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:2224 0 -0x1.c7p6 0x1.fp4 +REG epsg:2224 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:2224 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:2224 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:2224 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:2225 0 -0x1.e8p6 0x1.44p5 +REG epsg:2225 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:2225 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:2225 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:2225 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:2226 0 -0x1.e8p6 0x1.36p5 +REG epsg:2226 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:2226 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:2226 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:2226 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:2227 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:2227 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:2227 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:2227 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:2227 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:22275 0 0x1.ep3 0x0.0p0 +REG epsg:22275 1 0x1.4p3 -0x1.4p2 +REG epsg:22275 2 0x1.4p4 -0x1.4p2 +REG epsg:22275 3 0x1.4p3 0x1.4p2 +REG epsg:22275 4 0x1.4p4 0x1.4p2 +REG epsg:22277 0 0x1.1p4 0x0.0p0 +REG epsg:22277 1 0x1.8p3 -0x1.4p2 +REG epsg:22277 2 0x1.6p4 -0x1.4p2 +REG epsg:22277 3 0x1.8p3 0x1.4p2 +REG epsg:22277 4 0x1.6p4 0x1.4p2 +REG epsg:22279 0 0x1.3p4 0x0.0p0 +REG epsg:22279 1 0x1.cp3 -0x1.4p2 +REG epsg:22279 2 0x1.8p4 -0x1.4p2 +REG epsg:22279 3 0x1.cp3 0x1.4p2 +REG epsg:22279 4 0x1.8p4 0x1.4p2 +REG epsg:2228 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:2228 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:2228 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:2228 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:2228 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:22281 0 0x1.5p4 0x0.0p0 +REG epsg:22281 1 0x1.0p4 -0x1.4p2 +REG epsg:22281 2 0x1.ap4 -0x1.4p2 +REG epsg:22281 3 0x1.0p4 0x1.4p2 +REG epsg:22281 4 0x1.ap4 0x1.4p2 +REG epsg:22283 0 0x1.7p4 0x0.0p0 +REG epsg:22283 1 0x1.2p4 -0x1.4p2 +REG epsg:22283 2 0x1.cp4 -0x1.4p2 +REG epsg:22283 3 0x1.2p4 0x1.4p2 +REG epsg:22283 4 0x1.cp4 0x1.4p2 +REG epsg:22285 0 0x1.9p4 0x0.0p0 +REG epsg:22285 1 0x1.4p4 -0x1.4p2 +REG epsg:22285 2 0x1.ep4 -0x1.4p2 +REG epsg:22285 3 0x1.4p4 0x1.4p2 +REG epsg:22285 4 0x1.ep4 0x1.4p2 +REG epsg:22287 0 0x1.bp4 0x0.0p0 +REG epsg:22287 1 0x1.6p4 -0x1.4p2 +REG epsg:22287 2 0x1.0p5 -0x1.4p2 +REG epsg:22287 3 0x1.6p4 0x1.4p2 +REG epsg:22287 4 0x1.0p5 0x1.4p2 +REG epsg:22289 0 0x1.dp4 0x0.0p0 +REG epsg:22289 1 0x1.8p4 -0x1.4p2 +REG epsg:22289 2 0x1.1p5 -0x1.4p2 +REG epsg:22289 3 0x1.8p4 0x1.4p2 +REG epsg:22289 4 0x1.1p5 0x1.4p2 +REG epsg:2229 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:2229 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:2229 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:2229 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:2229 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:22291 0 0x1.fp4 0x0.0p0 +REG epsg:22291 1 0x1.ap4 -0x1.4p2 +REG epsg:22291 2 0x1.2p5 -0x1.4p2 +REG epsg:22291 3 0x1.ap4 0x1.4p2 +REG epsg:22291 4 0x1.2p5 0x1.4p2 +REG epsg:22293 0 0x1.08p5 0x0.0p0 +REG epsg:22293 1 0x1.cp4 -0x1.4p2 +REG epsg:22293 2 0x1.3p5 -0x1.4p2 +REG epsg:22293 3 0x1.cp4 0x1.4p2 +REG epsg:22293 4 0x1.3p5 0x1.4p2 +REG epsg:2230 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:2230 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:2230 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:2230 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:2230 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:2231 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:2231 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:2231 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:2231 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:2231 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:2232 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:2232 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:2232 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:2232 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:2232 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:2233 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:2233 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:2233 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:2233 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:2233 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:22332 0 0x1.2p3 0x0.0p0 +REG epsg:22332 1 0x1.0p2 -0x1.4p2 +REG epsg:22332 2 0x1.cp3 -0x1.4p2 +REG epsg:22332 3 0x1.0p2 0x1.4p2 +REG epsg:22332 4 0x1.cp3 0x1.4p2 +REG epsg:2234 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:2234 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:2234 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:2234 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:2234 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:2235 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:2235 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:2235 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:2235 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:2235 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:2236 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:2236 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:2236 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:2236 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:2236 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2237 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:2237 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:2237 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:2237 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:2237 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2238 0 -0x1.52p6 0x1.dep4 +REG epsg:2238 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:2238 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:2238 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:2238 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:2239 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:2239 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:2239 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:2239 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:2239 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:22391 0 0x1.3cccccccccccdp3 0x1.2p5 +REG epsg:22391 1 0x1.dc1dd293b6beep1 0x1.fp4 +REG epsg:22391 2 0x1.0149127a55f4fp4 0x1.fp4 +REG epsg:22391 3 0x1.dc1dd293b6beep1 0x1.48p5 +REG epsg:22391 4 0x1.0149127a55f4fp4 0x1.48p5 +REG epsg:22392 0 0x1.3cccccccccccdp3 0x1.0a66666666666p5 +REG epsg:22392 1 0x1.f5792b2e61d7cp1 0x1.c4cccccccccccp4 +REG epsg:22392 2 0x1.fc3b4ece0123bp3 0x1.c4cccccccccccp4 +REG epsg:22392 3 0x1.f5792b2e61d7cp1 0x1.3266666666666p5 +REG epsg:22392 4 0x1.fc3b4ece0123bp3 0x1.3266666666666p5 +REG epsg:2240 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:2240 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:2240 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:2240 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:2240 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:2241 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:2241 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:2241 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:2241 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:2241 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:2242 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:2242 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:2242 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:2242 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:2242 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2243 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:2243 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:2243 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:2243 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:2243 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2244 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:2244 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:2244 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:2244 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:2244 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:2245 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:2245 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:2245 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:2245 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:2245 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:2246 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:2246 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:2246 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:2246 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:2246 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:2247 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:2247 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:2247 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:2247 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:2247 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:2248 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:2248 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:2248 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:2248 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:2248 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:2249 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:2249 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:2249 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:2249 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:2249 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:2250 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:2250 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:2250 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:2250 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:2250 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:2251 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:2251 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:2251 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:2251 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:2251 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:2252 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:2252 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:2252 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:2252 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:2252 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:22521 0 -0x1.c8p5 -0x1.9p4 +REG epsg:22521 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:22521 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:22521 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:22521 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:22522 0 -0x1.98p5 -0x1.9p4 +REG epsg:22522 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:22522 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:22522 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:22522 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:22523 0 -0x1.68p5 -0x1.9p4 +REG epsg:22523 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:22523 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:22523 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:22523 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:22524 0 -0x1.38p5 -0x1.9p4 +REG epsg:22524 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:22524 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:22524 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:22524 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:22525 0 -0x1.08p5 -0x1.9p4 +REG epsg:22525 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:22525 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:22525 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:22525 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:2253 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:2253 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:2253 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:2253 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:2253 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:2254 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:2254 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:2254 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:2254 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:2254 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:2255 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:2255 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:2255 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:2255 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:2255 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:2256 0 -0x1.b6p6 0x1.75p5 +REG epsg:2256 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:2256 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:2256 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:2256 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:2257 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:2257 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:2257 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:2257 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:2257 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:2258 0 -0x1.a9p6 0x1.fp4 +REG epsg:2258 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:2258 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:2258 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:2258 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:2259 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:2259 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:2259 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:2259 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:2259 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:2260 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:2260 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2260 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2260 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2260 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2261 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:2261 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:2261 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:2261 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:2261 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:2262 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:2262 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:2262 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:2262 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:2262 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:2263 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:2263 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:2263 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:2263 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:2263 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:2264 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:2264 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:2264 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:2264 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:2264 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:2265 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:2265 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:2265 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:2265 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:2265 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:2266 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:2266 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:2266 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:2266 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:2266 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:2267 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:2267 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:2267 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:2267 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:2267 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:2268 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:2268 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:2268 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:2268 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:2268 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:2269 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:2269 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:2269 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:2269 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:2269 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:2270 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:2270 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:2270 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:2270 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:2270 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:22700 0 0x1.2accccccccccdp5 0x1.1533333333333p5 +REG epsg:22700 1 0x1.f45a283b2e20bp4 0x1.da66666666666p4 +REG epsg:22700 2 0x1.5b6c857c02894p5 0x1.da66666666666p4 +REG epsg:22700 3 0x1.f45a283b2e20bp4 0x1.3d33333333333p5 +REG epsg:22700 4 0x1.5b6c857c02894p5 0x1.3d33333333333p5 +REG epsg:2271 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:2271 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:2271 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:2271 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:2271 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:2272 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:2272 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:2272 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:2272 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:2272 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:2273 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:2273 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:2273 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:2273 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:2273 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:2274 0 -0x1.58p6 0x1.1bp5 +REG epsg:2274 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:2274 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:2274 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:2274 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:2275 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:2275 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:2275 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:2275 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:2275 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:2276 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:2276 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:2276 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:2276 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:2276 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:2277 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:2277 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:2277 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:2277 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:2277 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:22770 0 0x1.2accccccccccdp5 0x1.1533333333333p5 +REG epsg:22770 1 0x1.f45a283b2e20bp4 0x1.da66666666666p4 +REG epsg:22770 2 0x1.5b6c857c02894p5 0x1.da66666666666p4 +REG epsg:22770 3 0x1.f45a283b2e20bp4 0x1.3d33333333333p5 +REG epsg:22770 4 0x1.5b6c857c02894p5 0x1.3d33333333333p5 +REG epsg:2278 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:2278 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:2278 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:2278 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:2278 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:22780 0 0x1.3933333333333p5 0x1.119999999999ap5 +REG epsg:22780 1 0x1.08d64d61eda3fp5 0x1.d333333333334p4 +REG epsg:22780 2 0x1.6990190478c27p5 0x1.d333333333334p4 +REG epsg:22780 3 0x1.08d64d61eda3fp5 0x1.399999999999ap5 +REG epsg:22780 4 0x1.6990190478c27p5 0x1.399999999999ap5 +REG epsg:2279 0 -0x1.8ap6 0x1.acp4 +REG epsg:2279 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:2279 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:2279 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:2279 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:2280 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:2280 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:2280 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:2280 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:2280 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:2281 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:2281 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:2281 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:2281 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:2281 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:2282 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:2282 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:2282 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:2282 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:2282 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:2283 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:2283 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:2283 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:2283 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:2283 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:22832 0 0x1.2p3 0x0.0p0 +REG epsg:22832 1 0x1.0p2 -0x1.4p2 +REG epsg:22832 2 0x1.cp3 -0x1.4p2 +REG epsg:22832 3 0x1.0p2 0x1.4p2 +REG epsg:22832 4 0x1.cp3 0x1.4p2 +REG epsg:2284 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:2284 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:2284 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:2284 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:2284 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:2285 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:2285 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:2285 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:2285 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:2285 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:2286 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:2286 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:2286 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:2286 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:2286 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:2287 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:2287 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:2287 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:2287 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:2287 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:2288 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:2288 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:2288 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:2288 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:2288 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:2289 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:2289 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:2289 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:2289 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:2289 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:2290 0 -0x1.f8p5 0x1.7ap5 +REG epsg:2290 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG epsg:2290 2 -0x1.bd129258af178p5 0x1.52p5 +REG epsg:2290 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG epsg:2290 4 -0x1.bd129258af178p5 0x1.a2p5 +REG epsg:2291 0 -0x1.f8p5 0x1.7ap5 +REG epsg:2291 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG epsg:2291 2 -0x1.bd129258af178p5 0x1.52p5 +REG epsg:2291 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG epsg:2291 4 -0x1.bd129258af178p5 0x1.a2p5 +REG epsg:2292 0 -0x1.f8p5 0x1.7ap5 +REG epsg:2292 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG epsg:2292 2 -0x1.bd129258af178p5 0x1.52p5 +REG epsg:2292 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG epsg:2292 4 -0x1.bd129258af178p5 0x1.a2p5 +REG epsg:2294 0 -0x1.ecp5 0x0.0p0 +REG epsg:2294 1 -0x1.0ap6 -0x1.4p2 +REG epsg:2294 2 -0x1.c4p5 -0x1.4p2 +REG epsg:2294 3 -0x1.0ap6 0x1.4p2 +REG epsg:2294 4 -0x1.c4p5 0x1.4p2 +REG epsg:2295 0 -0x1.02p6 0x0.0p0 +REG epsg:2295 1 -0x1.16p6 -0x1.4p2 +REG epsg:2295 2 -0x1.dcp5 -0x1.4p2 +REG epsg:2295 3 -0x1.16p6 0x1.4p2 +REG epsg:2295 4 -0x1.dcp5 0x1.4p2 +REG epsg:22991 0 0x1.18p5 0x1.ep4 +REG epsg:22991 1 0x1.d39fbba42f007p4 0x1.9p4 +REG epsg:22991 2 0x1.4630222de87fcp5 0x1.9p4 +REG epsg:22991 3 0x1.d39fbba42f007p4 0x1.18p5 +REG epsg:22991 4 0x1.4630222de87fcp5 0x1.18p5 +REG epsg:22992 0 0x1.fp4 0x1.ep4 +REG epsg:22992 1 0x1.939fbba42f007p4 0x1.9p4 +REG epsg:22992 2 0x1.2630222de87fcp5 0x1.9p4 +REG epsg:22992 3 0x1.939fbba42f007p4 0x1.18p5 +REG epsg:22992 4 0x1.2630222de87fcp5 0x1.18p5 +REG epsg:22993 0 0x1.bp4 0x1.ep4 +REG epsg:22993 1 0x1.539fbba42f007p4 0x1.9p4 +REG epsg:22993 2 0x1.0630222de87fcp5 0x1.9p4 +REG epsg:22993 3 0x1.539fbba42f007p4 0x1.18p5 +REG epsg:22993 4 0x1.0630222de87fcp5 0x1.18p5 +REG epsg:22994 0 0x1.bp4 0x1.ep4 +REG epsg:22994 1 0x1.539fbba42f007p4 0x1.9p4 +REG epsg:22994 2 0x1.0630222de87fcp5 0x1.9p4 +REG epsg:22994 3 0x1.539fbba42f007p4 0x1.18p5 +REG epsg:22994 4 0x1.0630222de87fcp5 0x1.18p5 +REG epsg:23028 0 -0x1.ep3 0x0.0p0 +REG epsg:23028 1 -0x1.4p4 -0x1.4p2 +REG epsg:23028 2 -0x1.4p3 -0x1.4p2 +REG epsg:23028 3 -0x1.4p4 0x1.4p2 +REG epsg:23028 4 -0x1.4p3 0x1.4p2 +REG epsg:23029 0 -0x1.2p3 0x0.0p0 +REG epsg:23029 1 -0x1.cp3 -0x1.4p2 +REG epsg:23029 2 -0x1.0p2 -0x1.4p2 +REG epsg:23029 3 -0x1.cp3 0x1.4p2 +REG epsg:23029 4 -0x1.0p2 0x1.4p2 +REG epsg:23030 0 -0x1.8p1 0x0.0p0 +REG epsg:23030 1 -0x1.0p3 -0x1.4p2 +REG epsg:23030 2 0x1.0p1 -0x1.4p2 +REG epsg:23030 3 -0x1.0p3 0x1.4p2 +REG epsg:23030 4 0x1.0p1 0x1.4p2 +REG epsg:23031 0 0x1.8p1 0x0.0p0 +REG epsg:23031 1 -0x1.0p1 -0x1.4p2 +REG epsg:23031 2 0x1.0p3 -0x1.4p2 +REG epsg:23031 3 -0x1.0p1 0x1.4p2 +REG epsg:23031 4 0x1.0p3 0x1.4p2 +REG epsg:23032 0 0x1.2p3 0x0.0p0 +REG epsg:23032 1 0x1.0p2 -0x1.4p2 +REG epsg:23032 2 0x1.cp3 -0x1.4p2 +REG epsg:23032 3 0x1.0p2 0x1.4p2 +REG epsg:23032 4 0x1.cp3 0x1.4p2 +REG epsg:23033 0 0x1.ep3 0x0.0p0 +REG epsg:23033 1 0x1.4p3 -0x1.4p2 +REG epsg:23033 2 0x1.4p4 -0x1.4p2 +REG epsg:23033 3 0x1.4p3 0x1.4p2 +REG epsg:23033 4 0x1.4p4 0x1.4p2 +REG epsg:23034 0 0x1.5p4 0x0.0p0 +REG epsg:23034 1 0x1.0p4 -0x1.4p2 +REG epsg:23034 2 0x1.ap4 -0x1.4p2 +REG epsg:23034 3 0x1.0p4 0x1.4p2 +REG epsg:23034 4 0x1.ap4 0x1.4p2 +REG epsg:23035 0 0x1.bp4 0x0.0p0 +REG epsg:23035 1 0x1.6p4 -0x1.4p2 +REG epsg:23035 2 0x1.0p5 -0x1.4p2 +REG epsg:23035 3 0x1.6p4 0x1.4p2 +REG epsg:23035 4 0x1.0p5 0x1.4p2 +REG epsg:23036 0 0x1.08p5 0x0.0p0 +REG epsg:23036 1 0x1.cp4 -0x1.4p2 +REG epsg:23036 2 0x1.3p5 -0x1.4p2 +REG epsg:23036 3 0x1.cp4 0x1.4p2 +REG epsg:23036 4 0x1.3p5 0x1.4p2 +REG epsg:23037 0 0x1.38p5 0x0.0p0 +REG epsg:23037 1 0x1.1p5 -0x1.4p2 +REG epsg:23037 2 0x1.6p5 -0x1.4p2 +REG epsg:23037 3 0x1.1p5 0x1.4p2 +REG epsg:23037 4 0x1.6p5 0x1.4p2 +REG epsg:23038 0 0x1.68p5 0x0.0p0 +REG epsg:23038 1 0x1.4p5 -0x1.4p2 +REG epsg:23038 2 0x1.9p5 -0x1.4p2 +REG epsg:23038 3 0x1.4p5 0x1.4p2 +REG epsg:23038 4 0x1.9p5 0x1.4p2 +REG epsg:2308 0 0x1.b4p6 0x0.0p0 +REG epsg:2308 1 0x1.ap6 -0x1.4p2 +REG epsg:2308 2 0x1.c8p6 -0x1.4p2 +REG epsg:2308 3 0x1.ap6 0x1.4p2 +REG epsg:2308 4 0x1.c8p6 0x1.4p2 +REG epsg:2309 0 0x1.dp6 0x0.0p0 +REG epsg:2309 1 0x1.bcp6 -0x1.4p2 +REG epsg:2309 2 0x1.e4p6 -0x1.4p2 +REG epsg:2309 3 0x1.bcp6 0x1.4p2 +REG epsg:2309 4 0x1.e4p6 0x1.4p2 +REG epsg:23090 0 0x0.0p0 0x0.0p0 +REG epsg:23090 1 -0x1.4p2 -0x1.4p2 +REG epsg:23090 2 0x1.4p2 -0x1.4p2 +REG epsg:23090 3 -0x1.4p2 0x1.4p2 +REG epsg:23090 4 0x1.4p2 0x1.4p2 +REG epsg:23095 0 0x1.4p2 0x0.0p0 +REG epsg:23095 1 0x0.0p0 -0x1.4p2 +REG epsg:23095 2 0x1.4p3 -0x1.4p2 +REG epsg:23095 3 0x0.0p0 0x1.4p2 +REG epsg:23095 4 0x1.4p3 0x1.4p2 +REG epsg:2310 0 0x1.08p7 0x0.0p0 +REG epsg:2310 1 0x1.fcp6 -0x1.4p2 +REG epsg:2310 2 0x1.12p7 -0x1.4p2 +REG epsg:2310 3 0x1.fcp6 0x1.4p2 +REG epsg:2310 4 0x1.12p7 0x1.4p2 +REG epsg:2311 0 0x1.8p2 0x0.0p0 +REG epsg:2311 1 0x1.0p0 -0x1.4p2 +REG epsg:2311 2 0x1.6p3 -0x1.4p2 +REG epsg:2311 3 0x1.0p0 0x1.4p2 +REG epsg:2311 4 0x1.6p3 0x1.4p2 +REG epsg:2312 0 0x1.ep3 0x0.0p0 +REG epsg:2312 1 0x1.4p3 -0x1.4p2 +REG epsg:2312 2 0x1.4p4 -0x1.4p2 +REG epsg:2312 3 0x1.4p3 0x1.4p2 +REG epsg:2312 4 0x1.4p4 0x1.4p2 +REG epsg:2313 0 0x1.ep3 0x0.0p0 +REG epsg:2313 1 0x1.4p3 -0x1.4p2 +REG epsg:2313 2 0x1.4p4 -0x1.4p2 +REG epsg:2313 3 0x1.4p3 0x1.4p2 +REG epsg:2313 4 0x1.4p4 0x1.4p2 +REG epsg:2314 0 -0x1.eaaaaaaaaaaacp5 0x1.4e22222222224p3 +REG epsg:2314 1 -0x1.09ab8c7155973p6 0x1.5c44444444448p2 +REG epsg:2314 2 -0x1.c1fe3c72aa271p5 0x1.5c44444444448p2 +REG epsg:2314 3 -0x1.09ab8c7155973p6 0x1.ee22222222224p3 +REG epsg:2314 4 -0x1.c1fe3c72aa271p5 0x1.ee22222222224p3 +REG epsg:2315 0 -0x1.14p6 -0x1.9p4 +REG epsg:2315 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:2315 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:2315 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:2315 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2316 0 -0x1.f8p5 -0x1.9p4 +REG epsg:2316 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:2316 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:2316 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:2316 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2317 0 -0x1.08p6 0x1.8p2 +REG epsg:2317 1 -0x1.2021d7c64dfb1p6 0x0.0p0 +REG epsg:2317 2 -0x1.dfbc50736409ep5 0x0.0p0 +REG epsg:2317 3 -0x1.2021d7c64dfb1p6 0x1.8p3 +REG epsg:2317 4 -0x1.dfbc50736409ep5 0x1.8p3 +REG epsg:2318 0 0x1.8p5 0x1.9p4 +REG epsg:2318 1 0x1.f73075edbe9d4p4 0x1.4p3 +REG epsg:2318 2 0x1.0233e2849058bp6 0x1.4p3 +REG epsg:2318 3 0x1.f73075edbe9d4p4 0x1.4p5 +REG epsg:2318 4 0x1.0233e2849058bp6 0x1.4p5 +REG epsg:2319 0 0x1.bp4 0x0.0p0 +REG epsg:2319 1 0x1.6p4 -0x1.4p2 +REG epsg:2319 2 0x1.0p5 -0x1.4p2 +REG epsg:2319 3 0x1.6p4 0x1.4p2 +REG epsg:2319 4 0x1.0p5 0x1.4p2 +REG epsg:2320 0 0x1.ep4 0x0.0p0 +REG epsg:2320 1 0x1.9p4 -0x1.4p2 +REG epsg:2320 2 0x1.18p5 -0x1.4p2 +REG epsg:2320 3 0x1.9p4 0x1.4p2 +REG epsg:2320 4 0x1.18p5 0x1.4p2 +REG epsg:2321 0 0x1.08p5 0x0.0p0 +REG epsg:2321 1 0x1.cp4 -0x1.4p2 +REG epsg:2321 2 0x1.3p5 -0x1.4p2 +REG epsg:2321 3 0x1.cp4 0x1.4p2 +REG epsg:2321 4 0x1.3p5 0x1.4p2 +REG epsg:2322 0 0x1.2p5 0x0.0p0 +REG epsg:2322 1 0x1.fp4 -0x1.4p2 +REG epsg:2322 2 0x1.48p5 -0x1.4p2 +REG epsg:2322 3 0x1.fp4 0x1.4p2 +REG epsg:2322 4 0x1.48p5 0x1.4p2 +REG epsg:2323 0 0x1.38p5 0x0.0p0 +REG epsg:2323 1 0x1.1p5 -0x1.4p2 +REG epsg:2323 2 0x1.6p5 -0x1.4p2 +REG epsg:2323 3 0x1.1p5 0x1.4p2 +REG epsg:2323 4 0x1.6p5 0x1.4p2 +REG epsg:23239 0 0x1.98p5 0x0.0p0 +REG epsg:23239 1 0x1.7p5 -0x1.4p2 +REG epsg:23239 2 0x1.cp5 -0x1.4p2 +REG epsg:23239 3 0x1.7p5 0x1.4p2 +REG epsg:23239 4 0x1.cp5 0x1.4p2 +REG epsg:2324 0 0x1.5p5 0x0.0p0 +REG epsg:2324 1 0x1.28p5 -0x1.4p2 +REG epsg:2324 2 0x1.78p5 -0x1.4p2 +REG epsg:2324 3 0x1.28p5 0x1.4p2 +REG epsg:2324 4 0x1.78p5 0x1.4p2 +REG epsg:23240 0 0x1.c8p5 0x0.0p0 +REG epsg:23240 1 0x1.ap5 -0x1.4p2 +REG epsg:23240 2 0x1.fp5 -0x1.4p2 +REG epsg:23240 3 0x1.ap5 0x1.4p2 +REG epsg:23240 4 0x1.fp5 0x1.4p2 +REG epsg:2325 0 0x1.68p5 0x0.0p0 +REG epsg:2325 1 0x1.4p5 -0x1.4p2 +REG epsg:2325 2 0x1.9p5 -0x1.4p2 +REG epsg:2325 3 0x1.4p5 0x1.4p2 +REG epsg:2325 4 0x1.9p5 0x1.4p2 +REG epsg:2326 0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 +REG epsg:2326 1 0x1.b3187ac81cd3bp6 0x1.14fe7f85aa87dp4 +REG epsg:2326 2 0x1.de5533c0e0377p6 0x1.14fe7f85aa87dp4 +REG epsg:2326 3 0x1.b3187ac81cd3bp6 0x1.b4fe7f85aa87dp4 +REG epsg:2326 4 0x1.de5533c0e0377p6 0x1.b4fe7f85aa87dp4 +REG epsg:2327 0 0x1.2cp6 0x0.0p0 +REG epsg:2327 1 0x1.18p6 -0x1.4p2 +REG epsg:2327 2 0x1.4p6 -0x1.4p2 +REG epsg:2327 3 0x1.18p6 0x1.4p2 +REG epsg:2327 4 0x1.4p6 0x1.4p2 +REG epsg:2328 0 0x1.44p6 0x0.0p0 +REG epsg:2328 1 0x1.3p6 -0x1.4p2 +REG epsg:2328 2 0x1.58p6 -0x1.4p2 +REG epsg:2328 3 0x1.3p6 0x1.4p2 +REG epsg:2328 4 0x1.58p6 0x1.4p2 +REG epsg:2329 0 0x1.5cp6 0x0.0p0 +REG epsg:2329 1 0x1.48p6 -0x1.4p2 +REG epsg:2329 2 0x1.7p6 -0x1.4p2 +REG epsg:2329 3 0x1.48p6 0x1.4p2 +REG epsg:2329 4 0x1.7p6 0x1.4p2 +REG epsg:2330 0 0x1.74p6 0x0.0p0 +REG epsg:2330 1 0x1.6p6 -0x1.4p2 +REG epsg:2330 2 0x1.88p6 -0x1.4p2 +REG epsg:2330 3 0x1.6p6 0x1.4p2 +REG epsg:2330 4 0x1.88p6 0x1.4p2 +REG epsg:2331 0 0x1.8cp6 0x0.0p0 +REG epsg:2331 1 0x1.78p6 -0x1.4p2 +REG epsg:2331 2 0x1.ap6 -0x1.4p2 +REG epsg:2331 3 0x1.78p6 0x1.4p2 +REG epsg:2331 4 0x1.ap6 0x1.4p2 +REG epsg:2332 0 0x1.a4p6 0x0.0p0 +REG epsg:2332 1 0x1.9p6 -0x1.4p2 +REG epsg:2332 2 0x1.b8p6 -0x1.4p2 +REG epsg:2332 3 0x1.9p6 0x1.4p2 +REG epsg:2332 4 0x1.b8p6 0x1.4p2 +REG epsg:2333 0 0x1.bcp6 0x0.0p0 +REG epsg:2333 1 0x1.a8p6 -0x1.4p2 +REG epsg:2333 2 0x1.dp6 -0x1.4p2 +REG epsg:2333 3 0x1.a8p6 0x1.4p2 +REG epsg:2333 4 0x1.dp6 0x1.4p2 +REG epsg:2334 0 0x1.d4p6 0x0.0p0 +REG epsg:2334 1 0x1.cp6 -0x1.4p2 +REG epsg:2334 2 0x1.e8p6 -0x1.4p2 +REG epsg:2334 3 0x1.cp6 0x1.4p2 +REG epsg:2334 4 0x1.e8p6 0x1.4p2 +REG epsg:2335 0 0x1.ecp6 0x0.0p0 +REG epsg:2335 1 0x1.d8p6 -0x1.4p2 +REG epsg:2335 2 0x1.0p7 -0x1.4p2 +REG epsg:2335 3 0x1.d8p6 0x1.4p2 +REG epsg:2335 4 0x1.0p7 0x1.4p2 +REG epsg:2336 0 0x1.02p7 0x0.0p0 +REG epsg:2336 1 0x1.fp6 -0x1.4p2 +REG epsg:2336 2 0x1.0cp7 -0x1.4p2 +REG epsg:2336 3 0x1.fp6 0x1.4p2 +REG epsg:2336 4 0x1.0cp7 0x1.4p2 +REG epsg:2337 0 0x1.0ep7 0x0.0p0 +REG epsg:2337 1 0x1.04p7 -0x1.4p2 +REG epsg:2337 2 0x1.18p7 -0x1.4p2 +REG epsg:2337 3 0x1.04p7 0x1.4p2 +REG epsg:2337 4 0x1.18p7 0x1.4p2 +REG epsg:2338 0 0x1.2cp6 0x0.0p0 +REG epsg:2338 1 0x1.18p6 -0x1.4p2 +REG epsg:2338 2 0x1.4p6 -0x1.4p2 +REG epsg:2338 3 0x1.18p6 0x1.4p2 +REG epsg:2338 4 0x1.4p6 0x1.4p2 +REG epsg:2339 0 0x1.44p6 0x0.0p0 +REG epsg:2339 1 0x1.3p6 -0x1.4p2 +REG epsg:2339 2 0x1.58p6 -0x1.4p2 +REG epsg:2339 3 0x1.3p6 0x1.4p2 +REG epsg:2339 4 0x1.58p6 0x1.4p2 +REG epsg:2340 0 0x1.5cp6 0x0.0p0 +REG epsg:2340 1 0x1.48p6 -0x1.4p2 +REG epsg:2340 2 0x1.7p6 -0x1.4p2 +REG epsg:2340 3 0x1.48p6 0x1.4p2 +REG epsg:2340 4 0x1.7p6 0x1.4p2 +REG epsg:2341 0 0x1.74p6 0x0.0p0 +REG epsg:2341 1 0x1.6p6 -0x1.4p2 +REG epsg:2341 2 0x1.88p6 -0x1.4p2 +REG epsg:2341 3 0x1.6p6 0x1.4p2 +REG epsg:2341 4 0x1.88p6 0x1.4p2 +REG epsg:2342 0 0x1.8cp6 0x0.0p0 +REG epsg:2342 1 0x1.78p6 -0x1.4p2 +REG epsg:2342 2 0x1.ap6 -0x1.4p2 +REG epsg:2342 3 0x1.78p6 0x1.4p2 +REG epsg:2342 4 0x1.ap6 0x1.4p2 +REG epsg:2343 0 0x1.a4p6 0x0.0p0 +REG epsg:2343 1 0x1.9p6 -0x1.4p2 +REG epsg:2343 2 0x1.b8p6 -0x1.4p2 +REG epsg:2343 3 0x1.9p6 0x1.4p2 +REG epsg:2343 4 0x1.b8p6 0x1.4p2 +REG epsg:23433 0 0x1.ep3 0x0.0p0 +REG epsg:23433 1 0x1.4p3 -0x1.4p2 +REG epsg:23433 2 0x1.4p4 -0x1.4p2 +REG epsg:23433 3 0x1.4p3 0x1.4p2 +REG epsg:23433 4 0x1.4p4 0x1.4p2 +REG epsg:2344 0 0x1.bcp6 0x0.0p0 +REG epsg:2344 1 0x1.a8p6 -0x1.4p2 +REG epsg:2344 2 0x1.dp6 -0x1.4p2 +REG epsg:2344 3 0x1.a8p6 0x1.4p2 +REG epsg:2344 4 0x1.dp6 0x1.4p2 +REG epsg:2345 0 0x1.d4p6 0x0.0p0 +REG epsg:2345 1 0x1.cp6 -0x1.4p2 +REG epsg:2345 2 0x1.e8p6 -0x1.4p2 +REG epsg:2345 3 0x1.cp6 0x1.4p2 +REG epsg:2345 4 0x1.e8p6 0x1.4p2 +REG epsg:2346 0 0x1.ecp6 0x0.0p0 +REG epsg:2346 1 0x1.d8p6 -0x1.4p2 +REG epsg:2346 2 0x1.0p7 -0x1.4p2 +REG epsg:2346 3 0x1.d8p6 0x1.4p2 +REG epsg:2346 4 0x1.0p7 0x1.4p2 +REG epsg:2347 0 0x1.02p7 0x0.0p0 +REG epsg:2347 1 0x1.fp6 -0x1.4p2 +REG epsg:2347 2 0x1.0cp7 -0x1.4p2 +REG epsg:2347 3 0x1.fp6 0x1.4p2 +REG epsg:2347 4 0x1.0cp7 0x1.4p2 +REG epsg:2348 0 0x1.0ep7 0x0.0p0 +REG epsg:2348 1 0x1.04p7 -0x1.4p2 +REG epsg:2348 2 0x1.18p7 -0x1.4p2 +REG epsg:2348 3 0x1.04p7 0x1.4p2 +REG epsg:2348 4 0x1.18p7 0x1.4p2 +REG epsg:2349 0 0x1.2cp6 0x0.0p0 +REG epsg:2349 1 0x1.18p6 -0x1.4p2 +REG epsg:2349 2 0x1.4p6 -0x1.4p2 +REG epsg:2349 3 0x1.18p6 0x1.4p2 +REG epsg:2349 4 0x1.4p6 0x1.4p2 +REG epsg:2350 0 0x1.38p6 0x0.0p0 +REG epsg:2350 1 0x1.24p6 -0x1.4p2 +REG epsg:2350 2 0x1.4cp6 -0x1.4p2 +REG epsg:2350 3 0x1.24p6 0x1.4p2 +REG epsg:2350 4 0x1.4cp6 0x1.4p2 +REG epsg:2351 0 0x1.44p6 0x0.0p0 +REG epsg:2351 1 0x1.3p6 -0x1.4p2 +REG epsg:2351 2 0x1.58p6 -0x1.4p2 +REG epsg:2351 3 0x1.3p6 0x1.4p2 +REG epsg:2351 4 0x1.58p6 0x1.4p2 +REG epsg:2352 0 0x1.5p6 0x0.0p0 +REG epsg:2352 1 0x1.3cp6 -0x1.4p2 +REG epsg:2352 2 0x1.64p6 -0x1.4p2 +REG epsg:2352 3 0x1.3cp6 0x1.4p2 +REG epsg:2352 4 0x1.64p6 0x1.4p2 +REG epsg:2353 0 0x1.5cp6 0x0.0p0 +REG epsg:2353 1 0x1.48p6 -0x1.4p2 +REG epsg:2353 2 0x1.7p6 -0x1.4p2 +REG epsg:2353 3 0x1.48p6 0x1.4p2 +REG epsg:2353 4 0x1.7p6 0x1.4p2 +REG epsg:2354 0 0x1.68p6 0x0.0p0 +REG epsg:2354 1 0x1.54p6 -0x1.4p2 +REG epsg:2354 2 0x1.7cp6 -0x1.4p2 +REG epsg:2354 3 0x1.54p6 0x1.4p2 +REG epsg:2354 4 0x1.7cp6 0x1.4p2 +REG epsg:2355 0 0x1.74p6 0x0.0p0 +REG epsg:2355 1 0x1.6p6 -0x1.4p2 +REG epsg:2355 2 0x1.88p6 -0x1.4p2 +REG epsg:2355 3 0x1.6p6 0x1.4p2 +REG epsg:2355 4 0x1.88p6 0x1.4p2 +REG epsg:2356 0 0x1.8p6 0x0.0p0 +REG epsg:2356 1 0x1.6cp6 -0x1.4p2 +REG epsg:2356 2 0x1.94p6 -0x1.4p2 +REG epsg:2356 3 0x1.6cp6 0x1.4p2 +REG epsg:2356 4 0x1.94p6 0x1.4p2 +REG epsg:2357 0 0x1.8cp6 0x0.0p0 +REG epsg:2357 1 0x1.78p6 -0x1.4p2 +REG epsg:2357 2 0x1.ap6 -0x1.4p2 +REG epsg:2357 3 0x1.78p6 0x1.4p2 +REG epsg:2357 4 0x1.ap6 0x1.4p2 +REG epsg:2358 0 0x1.98p6 0x0.0p0 +REG epsg:2358 1 0x1.84p6 -0x1.4p2 +REG epsg:2358 2 0x1.acp6 -0x1.4p2 +REG epsg:2358 3 0x1.84p6 0x1.4p2 +REG epsg:2358 4 0x1.acp6 0x1.4p2 +REG epsg:2359 0 0x1.a4p6 0x0.0p0 +REG epsg:2359 1 0x1.9p6 -0x1.4p2 +REG epsg:2359 2 0x1.b8p6 -0x1.4p2 +REG epsg:2359 3 0x1.9p6 0x1.4p2 +REG epsg:2359 4 0x1.b8p6 0x1.4p2 +REG epsg:2360 0 0x1.bp6 0x0.0p0 +REG epsg:2360 1 0x1.9cp6 -0x1.4p2 +REG epsg:2360 2 0x1.c4p6 -0x1.4p2 +REG epsg:2360 3 0x1.9cp6 0x1.4p2 +REG epsg:2360 4 0x1.c4p6 0x1.4p2 +REG epsg:2361 0 0x1.bcp6 0x0.0p0 +REG epsg:2361 1 0x1.a8p6 -0x1.4p2 +REG epsg:2361 2 0x1.dp6 -0x1.4p2 +REG epsg:2361 3 0x1.a8p6 0x1.4p2 +REG epsg:2361 4 0x1.dp6 0x1.4p2 +REG epsg:2362 0 0x1.c8p6 0x0.0p0 +REG epsg:2362 1 0x1.b4p6 -0x1.4p2 +REG epsg:2362 2 0x1.dcp6 -0x1.4p2 +REG epsg:2362 3 0x1.b4p6 0x1.4p2 +REG epsg:2362 4 0x1.dcp6 0x1.4p2 +REG epsg:2363 0 0x1.d4p6 0x0.0p0 +REG epsg:2363 1 0x1.cp6 -0x1.4p2 +REG epsg:2363 2 0x1.e8p6 -0x1.4p2 +REG epsg:2363 3 0x1.cp6 0x1.4p2 +REG epsg:2363 4 0x1.e8p6 0x1.4p2 +REG epsg:2364 0 0x1.ep6 0x0.0p0 +REG epsg:2364 1 0x1.ccp6 -0x1.4p2 +REG epsg:2364 2 0x1.f4p6 -0x1.4p2 +REG epsg:2364 3 0x1.ccp6 0x1.4p2 +REG epsg:2364 4 0x1.f4p6 0x1.4p2 +REG epsg:2365 0 0x1.ecp6 0x0.0p0 +REG epsg:2365 1 0x1.d8p6 -0x1.4p2 +REG epsg:2365 2 0x1.0p7 -0x1.4p2 +REG epsg:2365 3 0x1.d8p6 0x1.4p2 +REG epsg:2365 4 0x1.0p7 0x1.4p2 +REG epsg:2366 0 0x1.f8p6 0x0.0p0 +REG epsg:2366 1 0x1.e4p6 -0x1.4p2 +REG epsg:2366 2 0x1.06p7 -0x1.4p2 +REG epsg:2366 3 0x1.e4p6 0x1.4p2 +REG epsg:2366 4 0x1.06p7 0x1.4p2 +REG epsg:2367 0 0x1.02p7 0x0.0p0 +REG epsg:2367 1 0x1.fp6 -0x1.4p2 +REG epsg:2367 2 0x1.0cp7 -0x1.4p2 +REG epsg:2367 3 0x1.fp6 0x1.4p2 +REG epsg:2367 4 0x1.0cp7 0x1.4p2 +REG epsg:2368 0 0x1.08p7 0x0.0p0 +REG epsg:2368 1 0x1.fcp6 -0x1.4p2 +REG epsg:2368 2 0x1.12p7 -0x1.4p2 +REG epsg:2368 3 0x1.fcp6 0x1.4p2 +REG epsg:2368 4 0x1.12p7 0x1.4p2 +REG epsg:2369 0 0x1.0ep7 0x0.0p0 +REG epsg:2369 1 0x1.04p7 -0x1.4p2 +REG epsg:2369 2 0x1.18p7 -0x1.4p2 +REG epsg:2369 3 0x1.04p7 0x1.4p2 +REG epsg:2369 4 0x1.18p7 0x1.4p2 +REG epsg:2370 0 0x1.2cp6 0x0.0p0 +REG epsg:2370 1 0x1.18p6 -0x1.4p2 +REG epsg:2370 2 0x1.4p6 -0x1.4p2 +REG epsg:2370 3 0x1.18p6 0x1.4p2 +REG epsg:2370 4 0x1.4p6 0x1.4p2 +REG epsg:23700 0 0x1.30c6f3335106cp4 0x1.7927b7e555898p5 +REG epsg:23700 1 0x1.765029a744904p3 0x1.5127b7e555898p5 +REG epsg:23700 2 0x1.a665d192ffc56p4 0x1.5127b7e555898p5 +REG epsg:23700 3 0x1.765029a744904p3 0x1.a127b7e555898p5 +REG epsg:23700 4 0x1.a665d192ffc56p4 0x1.a127b7e555898p5 +REG epsg:2371 0 0x1.38p6 0x0.0p0 +REG epsg:2371 1 0x1.24p6 -0x1.4p2 +REG epsg:2371 2 0x1.4cp6 -0x1.4p2 +REG epsg:2371 3 0x1.24p6 0x1.4p2 +REG epsg:2371 4 0x1.4cp6 0x1.4p2 +REG epsg:2372 0 0x1.44p6 0x0.0p0 +REG epsg:2372 1 0x1.3p6 -0x1.4p2 +REG epsg:2372 2 0x1.58p6 -0x1.4p2 +REG epsg:2372 3 0x1.3p6 0x1.4p2 +REG epsg:2372 4 0x1.58p6 0x1.4p2 +REG epsg:2373 0 0x1.5p6 0x0.0p0 +REG epsg:2373 1 0x1.3cp6 -0x1.4p2 +REG epsg:2373 2 0x1.64p6 -0x1.4p2 +REG epsg:2373 3 0x1.3cp6 0x1.4p2 +REG epsg:2373 4 0x1.64p6 0x1.4p2 +REG epsg:2374 0 0x1.5cp6 0x0.0p0 +REG epsg:2374 1 0x1.48p6 -0x1.4p2 +REG epsg:2374 2 0x1.7p6 -0x1.4p2 +REG epsg:2374 3 0x1.48p6 0x1.4p2 +REG epsg:2374 4 0x1.7p6 0x1.4p2 +REG epsg:2375 0 0x1.68p6 0x0.0p0 +REG epsg:2375 1 0x1.54p6 -0x1.4p2 +REG epsg:2375 2 0x1.7cp6 -0x1.4p2 +REG epsg:2375 3 0x1.54p6 0x1.4p2 +REG epsg:2375 4 0x1.7cp6 0x1.4p2 +REG epsg:2376 0 0x1.74p6 0x0.0p0 +REG epsg:2376 1 0x1.6p6 -0x1.4p2 +REG epsg:2376 2 0x1.88p6 -0x1.4p2 +REG epsg:2376 3 0x1.6p6 0x1.4p2 +REG epsg:2376 4 0x1.88p6 0x1.4p2 +REG epsg:2377 0 0x1.8p6 0x0.0p0 +REG epsg:2377 1 0x1.6cp6 -0x1.4p2 +REG epsg:2377 2 0x1.94p6 -0x1.4p2 +REG epsg:2377 3 0x1.6cp6 0x1.4p2 +REG epsg:2377 4 0x1.94p6 0x1.4p2 +REG epsg:2378 0 0x1.8cp6 0x0.0p0 +REG epsg:2378 1 0x1.78p6 -0x1.4p2 +REG epsg:2378 2 0x1.ap6 -0x1.4p2 +REG epsg:2378 3 0x1.78p6 0x1.4p2 +REG epsg:2378 4 0x1.ap6 0x1.4p2 +REG epsg:2379 0 0x1.98p6 0x0.0p0 +REG epsg:2379 1 0x1.84p6 -0x1.4p2 +REG epsg:2379 2 0x1.acp6 -0x1.4p2 +REG epsg:2379 3 0x1.84p6 0x1.4p2 +REG epsg:2379 4 0x1.acp6 0x1.4p2 +REG epsg:2380 0 0x1.a4p6 0x0.0p0 +REG epsg:2380 1 0x1.9p6 -0x1.4p2 +REG epsg:2380 2 0x1.b8p6 -0x1.4p2 +REG epsg:2380 3 0x1.9p6 0x1.4p2 +REG epsg:2380 4 0x1.b8p6 0x1.4p2 +REG epsg:2381 0 0x1.bp6 0x0.0p0 +REG epsg:2381 1 0x1.9cp6 -0x1.4p2 +REG epsg:2381 2 0x1.c4p6 -0x1.4p2 +REG epsg:2381 3 0x1.9cp6 0x1.4p2 +REG epsg:2381 4 0x1.c4p6 0x1.4p2 +REG epsg:2382 0 0x1.bcp6 0x0.0p0 +REG epsg:2382 1 0x1.a8p6 -0x1.4p2 +REG epsg:2382 2 0x1.dp6 -0x1.4p2 +REG epsg:2382 3 0x1.a8p6 0x1.4p2 +REG epsg:2382 4 0x1.dp6 0x1.4p2 +REG epsg:2383 0 0x1.c8p6 0x0.0p0 +REG epsg:2383 1 0x1.b4p6 -0x1.4p2 +REG epsg:2383 2 0x1.dcp6 -0x1.4p2 +REG epsg:2383 3 0x1.b4p6 0x1.4p2 +REG epsg:2383 4 0x1.dcp6 0x1.4p2 +REG epsg:23830 0 0x1.7ap6 0x0.0p0 +REG epsg:23830 1 0x1.66p6 -0x1.4p2 +REG epsg:23830 2 0x1.8ep6 -0x1.4p2 +REG epsg:23830 3 0x1.66p6 0x1.4p2 +REG epsg:23830 4 0x1.8ep6 0x1.4p2 +REG epsg:23831 0 0x1.86p6 0x0.0p0 +REG epsg:23831 1 0x1.72p6 -0x1.4p2 +REG epsg:23831 2 0x1.9ap6 -0x1.4p2 +REG epsg:23831 3 0x1.72p6 0x1.4p2 +REG epsg:23831 4 0x1.9ap6 0x1.4p2 +REG epsg:23832 0 0x1.92p6 0x0.0p0 +REG epsg:23832 1 0x1.7ep6 -0x1.4p2 +REG epsg:23832 2 0x1.a6p6 -0x1.4p2 +REG epsg:23832 3 0x1.7ep6 0x1.4p2 +REG epsg:23832 4 0x1.a6p6 0x1.4p2 +REG epsg:23833 0 0x1.9ep6 0x0.0p0 +REG epsg:23833 1 0x1.8ap6 -0x1.4p2 +REG epsg:23833 2 0x1.b2p6 -0x1.4p2 +REG epsg:23833 3 0x1.8ap6 0x1.4p2 +REG epsg:23833 4 0x1.b2p6 0x1.4p2 +REG epsg:23834 0 0x1.aap6 0x0.0p0 +REG epsg:23834 1 0x1.96p6 -0x1.4p2 +REG epsg:23834 2 0x1.bep6 -0x1.4p2 +REG epsg:23834 3 0x1.96p6 0x1.4p2 +REG epsg:23834 4 0x1.bep6 0x1.4p2 +REG epsg:23835 0 0x1.b6p6 0x0.0p0 +REG epsg:23835 1 0x1.a2p6 -0x1.4p2 +REG epsg:23835 2 0x1.cap6 -0x1.4p2 +REG epsg:23835 3 0x1.a2p6 0x1.4p2 +REG epsg:23835 4 0x1.cap6 0x1.4p2 +REG epsg:23836 0 0x1.c2p6 0x0.0p0 +REG epsg:23836 1 0x1.aep6 -0x1.4p2 +REG epsg:23836 2 0x1.d6p6 -0x1.4p2 +REG epsg:23836 3 0x1.aep6 0x1.4p2 +REG epsg:23836 4 0x1.d6p6 0x1.4p2 +REG epsg:23837 0 0x1.cep6 0x0.0p0 +REG epsg:23837 1 0x1.bap6 -0x1.4p2 +REG epsg:23837 2 0x1.e2p6 -0x1.4p2 +REG epsg:23837 3 0x1.bap6 0x1.4p2 +REG epsg:23837 4 0x1.e2p6 0x1.4p2 +REG epsg:23838 0 0x1.dap6 0x0.0p0 +REG epsg:23838 1 0x1.c6p6 -0x1.4p2 +REG epsg:23838 2 0x1.eep6 -0x1.4p2 +REG epsg:23838 3 0x1.c6p6 0x1.4p2 +REG epsg:23838 4 0x1.eep6 0x1.4p2 +REG epsg:23839 0 0x1.e6p6 0x0.0p0 +REG epsg:23839 1 0x1.d2p6 -0x1.4p2 +REG epsg:23839 2 0x1.fap6 -0x1.4p2 +REG epsg:23839 3 0x1.d2p6 0x1.4p2 +REG epsg:23839 4 0x1.fap6 0x1.4p2 +REG epsg:2384 0 0x1.d4p6 0x0.0p0 +REG epsg:2384 1 0x1.cp6 -0x1.4p2 +REG epsg:2384 2 0x1.e8p6 -0x1.4p2 +REG epsg:2384 3 0x1.cp6 0x1.4p2 +REG epsg:2384 4 0x1.e8p6 0x1.4p2 +REG epsg:23840 0 0x1.f2p6 0x0.0p0 +REG epsg:23840 1 0x1.dep6 -0x1.4p2 +REG epsg:23840 2 0x1.03p7 -0x1.4p2 +REG epsg:23840 3 0x1.dep6 0x1.4p2 +REG epsg:23840 4 0x1.03p7 0x1.4p2 +REG epsg:23841 0 0x1.fep6 0x0.0p0 +REG epsg:23841 1 0x1.eap6 -0x1.4p2 +REG epsg:23841 2 0x1.09p7 -0x1.4p2 +REG epsg:23841 3 0x1.eap6 0x1.4p2 +REG epsg:23841 4 0x1.09p7 0x1.4p2 +REG epsg:23842 0 0x1.05p7 0x0.0p0 +REG epsg:23842 1 0x1.f6p6 -0x1.4p2 +REG epsg:23842 2 0x1.0fp7 -0x1.4p2 +REG epsg:23842 3 0x1.f6p6 0x1.4p2 +REG epsg:23842 4 0x1.0fp7 0x1.4p2 +REG epsg:23843 0 0x1.0bp7 0x0.0p0 +REG epsg:23843 1 0x1.01p7 -0x1.4p2 +REG epsg:23843 2 0x1.15p7 -0x1.4p2 +REG epsg:23843 3 0x1.01p7 0x1.4p2 +REG epsg:23843 4 0x1.15p7 0x1.4p2 +REG epsg:23844 0 0x1.11p7 0x0.0p0 +REG epsg:23844 1 0x1.07p7 -0x1.4p2 +REG epsg:23844 2 0x1.1bp7 -0x1.4p2 +REG epsg:23844 3 0x1.07p7 0x1.4p2 +REG epsg:23844 4 0x1.1bp7 0x1.4p2 +REG epsg:23845 0 0x1.17p7 0x0.0p0 +REG epsg:23845 1 0x1.0dp7 -0x1.4p2 +REG epsg:23845 2 0x1.21p7 -0x1.4p2 +REG epsg:23845 3 0x1.0dp7 0x1.4p2 +REG epsg:23845 4 0x1.21p7 0x1.4p2 +REG epsg:23846 0 0x1.74p6 0x0.0p0 +REG epsg:23846 1 0x1.6p6 -0x1.4p2 +REG epsg:23846 2 0x1.88p6 -0x1.4p2 +REG epsg:23846 3 0x1.6p6 0x1.4p2 +REG epsg:23846 4 0x1.88p6 0x1.4p2 +REG epsg:23847 0 0x1.8cp6 0x0.0p0 +REG epsg:23847 1 0x1.78p6 -0x1.4p2 +REG epsg:23847 2 0x1.ap6 -0x1.4p2 +REG epsg:23847 3 0x1.78p6 0x1.4p2 +REG epsg:23847 4 0x1.ap6 0x1.4p2 +REG epsg:23848 0 0x1.a4p6 0x0.0p0 +REG epsg:23848 1 0x1.9p6 -0x1.4p2 +REG epsg:23848 2 0x1.b8p6 -0x1.4p2 +REG epsg:23848 3 0x1.9p6 0x1.4p2 +REG epsg:23848 4 0x1.b8p6 0x1.4p2 +REG epsg:23849 0 0x1.bcp6 0x0.0p0 +REG epsg:23849 1 0x1.a8p6 -0x1.4p2 +REG epsg:23849 2 0x1.dp6 -0x1.4p2 +REG epsg:23849 3 0x1.a8p6 0x1.4p2 +REG epsg:23849 4 0x1.dp6 0x1.4p2 +REG epsg:2385 0 0x1.ep6 0x0.0p0 +REG epsg:2385 1 0x1.ccp6 -0x1.4p2 +REG epsg:2385 2 0x1.f4p6 -0x1.4p2 +REG epsg:2385 3 0x1.ccp6 0x1.4p2 +REG epsg:2385 4 0x1.f4p6 0x1.4p2 +REG epsg:23850 0 0x1.d4p6 0x0.0p0 +REG epsg:23850 1 0x1.cp6 -0x1.4p2 +REG epsg:23850 2 0x1.e8p6 -0x1.4p2 +REG epsg:23850 3 0x1.cp6 0x1.4p2 +REG epsg:23850 4 0x1.e8p6 0x1.4p2 +REG epsg:23851 0 0x1.ecp6 0x0.0p0 +REG epsg:23851 1 0x1.d8p6 -0x1.4p2 +REG epsg:23851 2 0x1.0p7 -0x1.4p2 +REG epsg:23851 3 0x1.d8p6 0x1.4p2 +REG epsg:23851 4 0x1.0p7 0x1.4p2 +REG epsg:23852 0 0x1.02p7 0x0.0p0 +REG epsg:23852 1 0x1.fp6 -0x1.4p2 +REG epsg:23852 2 0x1.0cp7 -0x1.4p2 +REG epsg:23852 3 0x1.fp6 0x1.4p2 +REG epsg:23852 4 0x1.0cp7 0x1.4p2 +REG epsg:23853 0 0x1.0ep7 0x0.0p0 +REG epsg:23853 1 0x1.04p7 -0x1.4p2 +REG epsg:23853 2 0x1.18p7 -0x1.4p2 +REG epsg:23853 3 0x1.04p7 0x1.4p2 +REG epsg:23853 4 0x1.18p7 0x1.4p2 +REG epsg:2386 0 0x1.ecp6 0x0.0p0 +REG epsg:2386 1 0x1.d8p6 -0x1.4p2 +REG epsg:2386 2 0x1.0p7 -0x1.4p2 +REG epsg:2386 3 0x1.d8p6 0x1.4p2 +REG epsg:2386 4 0x1.0p7 0x1.4p2 +REG epsg:23866 0 0x1.74p6 0x0.0p0 +REG epsg:23866 1 0x1.6p6 -0x1.4p2 +REG epsg:23866 2 0x1.88p6 -0x1.4p2 +REG epsg:23866 3 0x1.6p6 0x1.4p2 +REG epsg:23866 4 0x1.88p6 0x1.4p2 +REG epsg:23867 0 0x1.8cp6 0x0.0p0 +REG epsg:23867 1 0x1.78p6 -0x1.4p2 +REG epsg:23867 2 0x1.ap6 -0x1.4p2 +REG epsg:23867 3 0x1.78p6 0x1.4p2 +REG epsg:23867 4 0x1.ap6 0x1.4p2 +REG epsg:23868 0 0x1.a4p6 0x0.0p0 +REG epsg:23868 1 0x1.9p6 -0x1.4p2 +REG epsg:23868 2 0x1.b8p6 -0x1.4p2 +REG epsg:23868 3 0x1.9p6 0x1.4p2 +REG epsg:23868 4 0x1.b8p6 0x1.4p2 +REG epsg:23869 0 0x1.bcp6 0x0.0p0 +REG epsg:23869 1 0x1.a8p6 -0x1.4p2 +REG epsg:23869 2 0x1.dp6 -0x1.4p2 +REG epsg:23869 3 0x1.a8p6 0x1.4p2 +REG epsg:23869 4 0x1.dp6 0x1.4p2 +REG epsg:2387 0 0x1.f8p6 0x0.0p0 +REG epsg:2387 1 0x1.e4p6 -0x1.4p2 +REG epsg:2387 2 0x1.06p7 -0x1.4p2 +REG epsg:2387 3 0x1.e4p6 0x1.4p2 +REG epsg:2387 4 0x1.06p7 0x1.4p2 +REG epsg:23870 0 0x1.d4p6 0x0.0p0 +REG epsg:23870 1 0x1.cp6 -0x1.4p2 +REG epsg:23870 2 0x1.e8p6 -0x1.4p2 +REG epsg:23870 3 0x1.cp6 0x1.4p2 +REG epsg:23870 4 0x1.e8p6 0x1.4p2 +REG epsg:23871 0 0x1.ecp6 0x0.0p0 +REG epsg:23871 1 0x1.d8p6 -0x1.4p2 +REG epsg:23871 2 0x1.0p7 -0x1.4p2 +REG epsg:23871 3 0x1.d8p6 0x1.4p2 +REG epsg:23871 4 0x1.0p7 0x1.4p2 +REG epsg:23872 0 0x1.02p7 0x0.0p0 +REG epsg:23872 1 0x1.fp6 -0x1.4p2 +REG epsg:23872 2 0x1.0cp7 -0x1.4p2 +REG epsg:23872 3 0x1.fp6 0x1.4p2 +REG epsg:23872 4 0x1.0cp7 0x1.4p2 +REG epsg:23877 0 0x1.8cp6 -0x1.9p4 +REG epsg:23877 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:23877 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:23877 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:23877 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:23878 0 0x1.a4p6 -0x1.9p4 +REG epsg:23878 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:23878 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:23878 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:23878 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:23879 0 0x1.bcp6 -0x1.9p4 +REG epsg:23879 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:23879 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:23879 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:23879 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:2388 0 0x1.02p7 0x0.0p0 +REG epsg:2388 1 0x1.fp6 -0x1.4p2 +REG epsg:2388 2 0x1.0cp7 -0x1.4p2 +REG epsg:2388 3 0x1.fp6 0x1.4p2 +REG epsg:2388 4 0x1.0cp7 0x1.4p2 +REG epsg:23880 0 0x1.d4p6 -0x1.9p4 +REG epsg:23880 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:23880 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:23880 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:23880 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:23881 0 0x1.ecp6 -0x1.9p4 +REG epsg:23881 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:23881 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:23881 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:23881 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:23882 0 0x1.02p7 -0x1.9p4 +REG epsg:23882 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:23882 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:23882 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:23882 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:23883 0 0x1.0ep7 -0x1.9p4 +REG epsg:23883 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:23883 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:23883 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:23883 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:23884 0 0x1.1ap7 -0x1.9p4 +REG epsg:23884 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:23884 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:23884 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:23884 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:23886 0 0x1.74p6 -0x1.9p4 +REG epsg:23886 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:23886 2 0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:23886 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:23886 4 0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:23887 0 0x1.8cp6 -0x1.9p4 +REG epsg:23887 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:23887 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:23887 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:23887 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:23888 0 0x1.a4p6 -0x1.9p4 +REG epsg:23888 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:23888 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:23888 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:23888 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:23889 0 0x1.bcp6 -0x1.9p4 +REG epsg:23889 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:23889 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:23889 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:23889 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:2389 0 0x1.08p7 0x0.0p0 +REG epsg:2389 1 0x1.fcp6 -0x1.4p2 +REG epsg:2389 2 0x1.12p7 -0x1.4p2 +REG epsg:2389 3 0x1.fcp6 0x1.4p2 +REG epsg:2389 4 0x1.12p7 0x1.4p2 +REG epsg:23890 0 0x1.d4p6 -0x1.9p4 +REG epsg:23890 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:23890 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:23890 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:23890 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:23891 0 0x1.ecp6 -0x1.9p4 +REG epsg:23891 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:23891 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:23891 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:23891 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:23892 0 0x1.02p7 -0x1.9p4 +REG epsg:23892 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:23892 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:23892 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:23892 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:23893 0 0x1.0ep7 -0x1.9p4 +REG epsg:23893 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:23893 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:23893 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:23893 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:23894 0 0x1.1ap7 -0x1.9p4 +REG epsg:23894 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:23894 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:23894 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:23894 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:2390 0 0x1.0ep7 0x0.0p0 +REG epsg:2390 1 0x1.04p7 -0x1.4p2 +REG epsg:2390 2 0x1.18p7 -0x1.4p2 +REG epsg:2390 3 0x1.04p7 0x1.4p2 +REG epsg:2390 4 0x1.18p7 0x1.4p2 +REG epsg:2391 0 0x1.5p4 0x0.0p0 +REG epsg:2391 1 0x1.0p4 -0x1.4p2 +REG epsg:2391 2 0x1.ap4 -0x1.4p2 +REG epsg:2391 3 0x1.0p4 0x1.4p2 +REG epsg:2391 4 0x1.ap4 0x1.4p2 +REG epsg:2392 0 0x1.8p4 0x0.0p0 +REG epsg:2392 1 0x1.3p4 -0x1.4p2 +REG epsg:2392 2 0x1.dp4 -0x1.4p2 +REG epsg:2392 3 0x1.3p4 0x1.4p2 +REG epsg:2392 4 0x1.dp4 0x1.4p2 +REG epsg:2393 0 0x1.bp4 0x0.0p0 +REG epsg:2393 1 0x1.6p4 -0x1.4p2 +REG epsg:2393 2 0x1.0p5 -0x1.4p2 +REG epsg:2393 3 0x1.6p4 0x1.4p2 +REG epsg:2393 4 0x1.0p5 0x1.4p2 +REG epsg:2394 0 0x1.ep4 0x0.0p0 +REG epsg:2394 1 0x1.9p4 -0x1.4p2 +REG epsg:2394 2 0x1.18p5 -0x1.4p2 +REG epsg:2394 3 0x1.9p4 0x1.4p2 +REG epsg:2394 4 0x1.18p5 0x1.4p2 +REG epsg:23946 0 0x1.74p6 0x0.0p0 +REG epsg:23946 1 0x1.6p6 -0x1.4p2 +REG epsg:23946 2 0x1.88p6 -0x1.4p2 +REG epsg:23946 3 0x1.6p6 0x1.4p2 +REG epsg:23946 4 0x1.88p6 0x1.4p2 +REG epsg:23947 0 0x1.8cp6 0x0.0p0 +REG epsg:23947 1 0x1.78p6 -0x1.4p2 +REG epsg:23947 2 0x1.ap6 -0x1.4p2 +REG epsg:23947 3 0x1.78p6 0x1.4p2 +REG epsg:23947 4 0x1.ap6 0x1.4p2 +REG epsg:23948 0 0x1.a4p6 0x0.0p0 +REG epsg:23948 1 0x1.9p6 -0x1.4p2 +REG epsg:23948 2 0x1.b8p6 -0x1.4p2 +REG epsg:23948 3 0x1.9p6 0x1.4p2 +REG epsg:23948 4 0x1.b8p6 0x1.4p2 +REG epsg:2395 0 0x1.68p5 0x0.0p0 +REG epsg:2395 1 0x1.4p5 -0x1.4p2 +REG epsg:2395 2 0x1.9p5 -0x1.4p2 +REG epsg:2395 3 0x1.4p5 0x1.4p2 +REG epsg:2395 4 0x1.9p5 0x1.4p2 +REG epsg:2396 0 0x1.98p5 0x0.0p0 +REG epsg:2396 1 0x1.7p5 -0x1.4p2 +REG epsg:2396 2 0x1.cp5 -0x1.4p2 +REG epsg:2396 3 0x1.7p5 0x1.4p2 +REG epsg:2396 4 0x1.cp5 0x1.4p2 +REG epsg:2397 0 0x1.2p3 0x0.0p0 +REG epsg:2397 1 0x1.0p2 -0x1.4p2 +REG epsg:2397 2 0x1.cp3 -0x1.4p2 +REG epsg:2397 3 0x1.0p2 0x1.4p2 +REG epsg:2397 4 0x1.cp3 0x1.4p2 +REG epsg:2398 0 0x1.8p3 0x0.0p0 +REG epsg:2398 1 0x1.cp2 -0x1.4p2 +REG epsg:2398 2 0x1.1p4 -0x1.4p2 +REG epsg:2398 3 0x1.cp2 0x1.4p2 +REG epsg:2398 4 0x1.1p4 0x1.4p2 +REG epsg:2399 0 0x1.ep3 0x0.0p0 +REG epsg:2399 1 0x1.4p3 -0x1.4p2 +REG epsg:2399 2 0x1.4p4 -0x1.4p2 +REG epsg:2399 3 0x1.4p3 0x1.4p2 +REG epsg:2399 4 0x1.4p4 0x1.4p2 +REG epsg:2400 0 0x1.f9dd695bb473bp3 0x0.0p0 +REG epsg:2400 1 0x1.59dd695bb473bp3 -0x1.4p2 +REG epsg:2400 2 0x1.4ceeb4adda39ep4 -0x1.4p2 +REG epsg:2400 3 0x1.59dd695bb473bp3 0x1.4p2 +REG epsg:2400 4 0x1.4ceeb4adda39ep4 0x1.4p2 +REG epsg:2401 0 0x1.2cp6 0x0.0p0 +REG epsg:2401 1 0x1.18p6 -0x1.4p2 +REG epsg:2401 2 0x1.4p6 -0x1.4p2 +REG epsg:2401 3 0x1.18p6 0x1.4p2 +REG epsg:2401 4 0x1.4p6 0x1.4p2 +REG epsg:2402 0 0x1.38p6 0x0.0p0 +REG epsg:2402 1 0x1.24p6 -0x1.4p2 +REG epsg:2402 2 0x1.4cp6 -0x1.4p2 +REG epsg:2402 3 0x1.24p6 0x1.4p2 +REG epsg:2402 4 0x1.4cp6 0x1.4p2 +REG epsg:2403 0 0x1.44p6 0x0.0p0 +REG epsg:2403 1 0x1.3p6 -0x1.4p2 +REG epsg:2403 2 0x1.58p6 -0x1.4p2 +REG epsg:2403 3 0x1.3p6 0x1.4p2 +REG epsg:2403 4 0x1.58p6 0x1.4p2 +REG epsg:2404 0 0x1.5p6 0x0.0p0 +REG epsg:2404 1 0x1.3cp6 -0x1.4p2 +REG epsg:2404 2 0x1.64p6 -0x1.4p2 +REG epsg:2404 3 0x1.3cp6 0x1.4p2 +REG epsg:2404 4 0x1.64p6 0x1.4p2 +REG epsg:24047 0 0x1.8cp6 0x0.0p0 +REG epsg:24047 1 0x1.78p6 -0x1.4p2 +REG epsg:24047 2 0x1.ap6 -0x1.4p2 +REG epsg:24047 3 0x1.78p6 0x1.4p2 +REG epsg:24047 4 0x1.ap6 0x1.4p2 +REG epsg:24048 0 0x1.a4p6 0x0.0p0 +REG epsg:24048 1 0x1.9p6 -0x1.4p2 +REG epsg:24048 2 0x1.b8p6 -0x1.4p2 +REG epsg:24048 3 0x1.9p6 0x1.4p2 +REG epsg:24048 4 0x1.b8p6 0x1.4p2 +REG epsg:2405 0 0x1.5cp6 0x0.0p0 +REG epsg:2405 1 0x1.48p6 -0x1.4p2 +REG epsg:2405 2 0x1.7p6 -0x1.4p2 +REG epsg:2405 3 0x1.48p6 0x1.4p2 +REG epsg:2405 4 0x1.7p6 0x1.4p2 +REG epsg:2406 0 0x1.68p6 0x0.0p0 +REG epsg:2406 1 0x1.54p6 -0x1.4p2 +REG epsg:2406 2 0x1.7cp6 -0x1.4p2 +REG epsg:2406 3 0x1.54p6 0x1.4p2 +REG epsg:2406 4 0x1.7cp6 0x1.4p2 +REG epsg:2407 0 0x1.74p6 0x0.0p0 +REG epsg:2407 1 0x1.6p6 -0x1.4p2 +REG epsg:2407 2 0x1.88p6 -0x1.4p2 +REG epsg:2407 3 0x1.6p6 0x1.4p2 +REG epsg:2407 4 0x1.88p6 0x1.4p2 +REG epsg:2408 0 0x1.8p6 0x0.0p0 +REG epsg:2408 1 0x1.6cp6 -0x1.4p2 +REG epsg:2408 2 0x1.94p6 -0x1.4p2 +REG epsg:2408 3 0x1.6cp6 0x1.4p2 +REG epsg:2408 4 0x1.94p6 0x1.4p2 +REG epsg:2409 0 0x1.8cp6 0x0.0p0 +REG epsg:2409 1 0x1.78p6 -0x1.4p2 +REG epsg:2409 2 0x1.ap6 -0x1.4p2 +REG epsg:2409 3 0x1.78p6 0x1.4p2 +REG epsg:2409 4 0x1.ap6 0x1.4p2 +REG epsg:2410 0 0x1.98p6 0x0.0p0 +REG epsg:2410 1 0x1.84p6 -0x1.4p2 +REG epsg:2410 2 0x1.acp6 -0x1.4p2 +REG epsg:2410 3 0x1.84p6 0x1.4p2 +REG epsg:2410 4 0x1.acp6 0x1.4p2 +REG epsg:24100 0 -0x1.34p6 0x1.2p4 +REG epsg:24100 1 -0x1.49077c9109a7dp6 0x1.ap3 +REG epsg:24100 2 -0x1.1ef8836ef6583p6 0x1.ap3 +REG epsg:24100 3 -0x1.49077c9109a7dp6 0x1.7p4 +REG epsg:24100 4 -0x1.1ef8836ef6583p6 0x1.7p4 +REG epsg:2411 0 0x1.a4p6 0x0.0p0 +REG epsg:2411 1 0x1.9p6 -0x1.4p2 +REG epsg:2411 2 0x1.b8p6 -0x1.4p2 +REG epsg:2411 3 0x1.9p6 0x1.4p2 +REG epsg:2411 4 0x1.b8p6 0x1.4p2 +REG epsg:2412 0 0x1.bp6 0x0.0p0 +REG epsg:2412 1 0x1.9cp6 -0x1.4p2 +REG epsg:2412 2 0x1.c4p6 -0x1.4p2 +REG epsg:2412 3 0x1.9cp6 0x1.4p2 +REG epsg:2412 4 0x1.c4p6 0x1.4p2 +REG epsg:2413 0 0x1.bcp6 0x0.0p0 +REG epsg:2413 1 0x1.a8p6 -0x1.4p2 +REG epsg:2413 2 0x1.dp6 -0x1.4p2 +REG epsg:2413 3 0x1.a8p6 0x1.4p2 +REG epsg:2413 4 0x1.dp6 0x1.4p2 +REG epsg:2414 0 0x1.c8p6 0x0.0p0 +REG epsg:2414 1 0x1.b4p6 -0x1.4p2 +REG epsg:2414 2 0x1.dcp6 -0x1.4p2 +REG epsg:2414 3 0x1.b4p6 0x1.4p2 +REG epsg:2414 4 0x1.dcp6 0x1.4p2 +REG epsg:2415 0 0x1.d4p6 0x0.0p0 +REG epsg:2415 1 0x1.cp6 -0x1.4p2 +REG epsg:2415 2 0x1.e8p6 -0x1.4p2 +REG epsg:2415 3 0x1.cp6 0x1.4p2 +REG epsg:2415 4 0x1.e8p6 0x1.4p2 +REG epsg:2416 0 0x1.ep6 0x0.0p0 +REG epsg:2416 1 0x1.ccp6 -0x1.4p2 +REG epsg:2416 2 0x1.f4p6 -0x1.4p2 +REG epsg:2416 3 0x1.ccp6 0x1.4p2 +REG epsg:2416 4 0x1.f4p6 0x1.4p2 +REG epsg:2417 0 0x1.ecp6 0x0.0p0 +REG epsg:2417 1 0x1.d8p6 -0x1.4p2 +REG epsg:2417 2 0x1.0p7 -0x1.4p2 +REG epsg:2417 3 0x1.d8p6 0x1.4p2 +REG epsg:2417 4 0x1.0p7 0x1.4p2 +REG epsg:2418 0 0x1.f8p6 0x0.0p0 +REG epsg:2418 1 0x1.e4p6 -0x1.4p2 +REG epsg:2418 2 0x1.06p7 -0x1.4p2 +REG epsg:2418 3 0x1.e4p6 0x1.4p2 +REG epsg:2418 4 0x1.06p7 0x1.4p2 +REG epsg:2419 0 0x1.02p7 0x0.0p0 +REG epsg:2419 1 0x1.fp6 -0x1.4p2 +REG epsg:2419 2 0x1.0cp7 -0x1.4p2 +REG epsg:2419 3 0x1.fp6 0x1.4p2 +REG epsg:2419 4 0x1.0cp7 0x1.4p2 +REG epsg:2420 0 0x1.08p7 0x0.0p0 +REG epsg:2420 1 0x1.fcp6 -0x1.4p2 +REG epsg:2420 2 0x1.12p7 -0x1.4p2 +REG epsg:2420 3 0x1.fcp6 0x1.4p2 +REG epsg:2420 4 0x1.12p7 0x1.4p2 +REG epsg:24200 0 -0x1.34p6 0x1.2p4 +REG epsg:24200 1 -0x1.49077c9109a7dp6 0x1.ap3 +REG epsg:24200 2 -0x1.1ef8836ef6583p6 0x1.ap3 +REG epsg:24200 3 -0x1.49077c9109a7dp6 0x1.7p4 +REG epsg:24200 4 -0x1.1ef8836ef6583p6 0x1.7p4 +REG epsg:2421 0 0x1.0ep7 0x0.0p0 +REG epsg:2421 1 0x1.04p7 -0x1.4p2 +REG epsg:2421 2 0x1.18p7 -0x1.4p2 +REG epsg:2421 3 0x1.04p7 0x1.4p2 +REG epsg:2421 4 0x1.18p7 0x1.4p2 +REG epsg:2422 0 0x1.2cp6 0x0.0p0 +REG epsg:2422 1 0x1.18p6 -0x1.4p2 +REG epsg:2422 2 0x1.4p6 -0x1.4p2 +REG epsg:2422 3 0x1.18p6 0x1.4p2 +REG epsg:2422 4 0x1.4p6 0x1.4p2 +REG epsg:2423 0 0x1.38p6 0x0.0p0 +REG epsg:2423 1 0x1.24p6 -0x1.4p2 +REG epsg:2423 2 0x1.4cp6 -0x1.4p2 +REG epsg:2423 3 0x1.24p6 0x1.4p2 +REG epsg:2423 4 0x1.4cp6 0x1.4p2 +REG epsg:2424 0 0x1.44p6 0x0.0p0 +REG epsg:2424 1 0x1.3p6 -0x1.4p2 +REG epsg:2424 2 0x1.58p6 -0x1.4p2 +REG epsg:2424 3 0x1.3p6 0x1.4p2 +REG epsg:2424 4 0x1.58p6 0x1.4p2 +REG epsg:2425 0 0x1.5p6 0x0.0p0 +REG epsg:2425 1 0x1.3cp6 -0x1.4p2 +REG epsg:2425 2 0x1.64p6 -0x1.4p2 +REG epsg:2425 3 0x1.3cp6 0x1.4p2 +REG epsg:2425 4 0x1.64p6 0x1.4p2 +REG epsg:2426 0 0x1.5cp6 0x0.0p0 +REG epsg:2426 1 0x1.48p6 -0x1.4p2 +REG epsg:2426 2 0x1.7p6 -0x1.4p2 +REG epsg:2426 3 0x1.48p6 0x1.4p2 +REG epsg:2426 4 0x1.7p6 0x1.4p2 +REG epsg:2427 0 0x1.68p6 0x0.0p0 +REG epsg:2427 1 0x1.54p6 -0x1.4p2 +REG epsg:2427 2 0x1.7cp6 -0x1.4p2 +REG epsg:2427 3 0x1.54p6 0x1.4p2 +REG epsg:2427 4 0x1.7cp6 0x1.4p2 +REG epsg:2428 0 0x1.74p6 0x0.0p0 +REG epsg:2428 1 0x1.6p6 -0x1.4p2 +REG epsg:2428 2 0x1.88p6 -0x1.4p2 +REG epsg:2428 3 0x1.6p6 0x1.4p2 +REG epsg:2428 4 0x1.88p6 0x1.4p2 +REG epsg:2429 0 0x1.8p6 0x0.0p0 +REG epsg:2429 1 0x1.6cp6 -0x1.4p2 +REG epsg:2429 2 0x1.94p6 -0x1.4p2 +REG epsg:2429 3 0x1.6cp6 0x1.4p2 +REG epsg:2429 4 0x1.94p6 0x1.4p2 +REG epsg:2430 0 0x1.8cp6 0x0.0p0 +REG epsg:2430 1 0x1.78p6 -0x1.4p2 +REG epsg:2430 2 0x1.ap6 -0x1.4p2 +REG epsg:2430 3 0x1.78p6 0x1.4p2 +REG epsg:2430 4 0x1.ap6 0x1.4p2 +REG epsg:24305 0 0x1.5cp6 0x0.0p0 +REG epsg:24305 1 0x1.48p6 -0x1.4p2 +REG epsg:24305 2 0x1.7p6 -0x1.4p2 +REG epsg:24305 3 0x1.48p6 0x1.4p2 +REG epsg:24305 4 0x1.7p6 0x1.4p2 +REG epsg:24306 0 0x1.74p6 0x0.0p0 +REG epsg:24306 1 0x1.6p6 -0x1.4p2 +REG epsg:24306 2 0x1.88p6 -0x1.4p2 +REG epsg:24306 3 0x1.6p6 0x1.4p2 +REG epsg:24306 4 0x1.88p6 0x1.4p2 +REG epsg:2431 0 0x1.98p6 0x0.0p0 +REG epsg:2431 1 0x1.84p6 -0x1.4p2 +REG epsg:2431 2 0x1.acp6 -0x1.4p2 +REG epsg:2431 3 0x1.84p6 0x1.4p2 +REG epsg:2431 4 0x1.acp6 0x1.4p2 +REG epsg:24311 0 0x1.f8p5 0x0.0p0 +REG epsg:24311 1 0x1.dp5 -0x1.4p2 +REG epsg:24311 2 0x1.1p6 -0x1.4p2 +REG epsg:24311 3 0x1.dp5 0x1.4p2 +REG epsg:24311 4 0x1.1p6 0x1.4p2 +REG epsg:24312 0 0x1.14p6 0x0.0p0 +REG epsg:24312 1 0x1.0p6 -0x1.4p2 +REG epsg:24312 2 0x1.28p6 -0x1.4p2 +REG epsg:24312 3 0x1.0p6 0x1.4p2 +REG epsg:24312 4 0x1.28p6 0x1.4p2 +REG epsg:24313 0 0x1.2cp6 0x0.0p0 +REG epsg:24313 1 0x1.18p6 -0x1.4p2 +REG epsg:24313 2 0x1.4p6 -0x1.4p2 +REG epsg:24313 3 0x1.18p6 0x1.4p2 +REG epsg:24313 4 0x1.4p6 0x1.4p2 +REG epsg:2432 0 0x1.a4p6 0x0.0p0 +REG epsg:2432 1 0x1.9p6 -0x1.4p2 +REG epsg:2432 2 0x1.b8p6 -0x1.4p2 +REG epsg:2432 3 0x1.9p6 0x1.4p2 +REG epsg:2432 4 0x1.b8p6 0x1.4p2 +REG epsg:2433 0 0x1.bp6 0x0.0p0 +REG epsg:2433 1 0x1.9cp6 -0x1.4p2 +REG epsg:2433 2 0x1.c4p6 -0x1.4p2 +REG epsg:2433 3 0x1.9cp6 0x1.4p2 +REG epsg:2433 4 0x1.c4p6 0x1.4p2 +REG epsg:2434 0 0x1.bcp6 0x0.0p0 +REG epsg:2434 1 0x1.a8p6 -0x1.4p2 +REG epsg:2434 2 0x1.dp6 -0x1.4p2 +REG epsg:2434 3 0x1.a8p6 0x1.4p2 +REG epsg:2434 4 0x1.dp6 0x1.4p2 +REG epsg:24342 0 0x1.14p6 0x0.0p0 +REG epsg:24342 1 0x1.0p6 -0x1.4p2 +REG epsg:24342 2 0x1.28p6 -0x1.4p2 +REG epsg:24342 3 0x1.0p6 0x1.4p2 +REG epsg:24342 4 0x1.28p6 0x1.4p2 +REG epsg:24343 0 0x1.2cp6 0x0.0p0 +REG epsg:24343 1 0x1.18p6 -0x1.4p2 +REG epsg:24343 2 0x1.4p6 -0x1.4p2 +REG epsg:24343 3 0x1.18p6 0x1.4p2 +REG epsg:24343 4 0x1.4p6 0x1.4p2 +REG epsg:24344 0 0x1.44p6 0x0.0p0 +REG epsg:24344 1 0x1.3p6 -0x1.4p2 +REG epsg:24344 2 0x1.58p6 -0x1.4p2 +REG epsg:24344 3 0x1.3p6 0x1.4p2 +REG epsg:24344 4 0x1.58p6 0x1.4p2 +REG epsg:24345 0 0x1.5cp6 0x0.0p0 +REG epsg:24345 1 0x1.48p6 -0x1.4p2 +REG epsg:24345 2 0x1.7p6 -0x1.4p2 +REG epsg:24345 3 0x1.48p6 0x1.4p2 +REG epsg:24345 4 0x1.7p6 0x1.4p2 +REG epsg:24346 0 0x1.74p6 0x0.0p0 +REG epsg:24346 1 0x1.6p6 -0x1.4p2 +REG epsg:24346 2 0x1.88p6 -0x1.4p2 +REG epsg:24346 3 0x1.6p6 0x1.4p2 +REG epsg:24346 4 0x1.88p6 0x1.4p2 +REG epsg:24347 0 0x1.8cp6 0x0.0p0 +REG epsg:24347 1 0x1.78p6 -0x1.4p2 +REG epsg:24347 2 0x1.ap6 -0x1.4p2 +REG epsg:24347 3 0x1.78p6 0x1.4p2 +REG epsg:24347 4 0x1.ap6 0x1.4p2 +REG epsg:2435 0 0x1.c8p6 0x0.0p0 +REG epsg:2435 1 0x1.b4p6 -0x1.4p2 +REG epsg:2435 2 0x1.dcp6 -0x1.4p2 +REG epsg:2435 3 0x1.b4p6 0x1.4p2 +REG epsg:2435 4 0x1.dcp6 0x1.4p2 +REG epsg:2436 0 0x1.d4p6 0x0.0p0 +REG epsg:2436 1 0x1.cp6 -0x1.4p2 +REG epsg:2436 2 0x1.e8p6 -0x1.4p2 +REG epsg:2436 3 0x1.cp6 0x1.4p2 +REG epsg:2436 4 0x1.e8p6 0x1.4p2 +REG epsg:2437 0 0x1.ep6 0x0.0p0 +REG epsg:2437 1 0x1.ccp6 -0x1.4p2 +REG epsg:2437 2 0x1.f4p6 -0x1.4p2 +REG epsg:2437 3 0x1.ccp6 0x1.4p2 +REG epsg:2437 4 0x1.f4p6 0x1.4p2 +REG epsg:24370 0 0x1.1p6 0x1.3cp5 +REG epsg:24370 1 0x1.ec294c4167dafp5 0x1.14p5 +REG epsg:24370 2 0x1.29eb59df4c129p6 0x1.14p5 +REG epsg:24370 3 0x1.ec294c4167dafp5 0x1.64p5 +REG epsg:24370 4 0x1.29eb59df4c129p6 0x1.64p5 +REG epsg:24371 0 0x1.1p6 0x1.04p5 +REG epsg:24371 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG epsg:24371 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG epsg:24371 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG epsg:24371 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG epsg:24372 0 0x1.28p6 0x1.ap4 +REG epsg:24372 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG epsg:24372 2 0x1.3e40859d8c244p6 0x1.5p4 +REG epsg:24372 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG epsg:24372 4 0x1.3e40859d8c244p6 0x1.fp4 +REG epsg:24373 0 0x1.4p6 0x1.3p4 +REG epsg:24373 1 0x1.2ad8fb6bb699ap6 0x1.cp3 +REG epsg:24373 2 0x1.5527049449666p6 0x1.cp3 +REG epsg:24373 3 0x1.2ad8fb6bb699ap6 0x1.8p4 +REG epsg:24373 4 0x1.5527049449666p6 0x1.8p4 +REG epsg:24374 0 0x1.4p6 0x1.8p3 +REG epsg:24374 1 0x1.2b8d9dbc49a16p6 0x1.cp2 +REG epsg:24374 2 0x1.54726243b65eap6 0x1.cp2 +REG epsg:24374 3 0x1.2b8d9dbc49a16p6 0x1.1p4 +REG epsg:24374 4 0x1.54726243b65eap6 0x1.1p4 +REG epsg:24375 0 0x1.68p6 0x1.ap4 +REG epsg:24375 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG epsg:24375 2 0x1.7e40859d8c244p6 0x1.5p4 +REG epsg:24375 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG epsg:24375 4 0x1.7e40859d8c244p6 0x1.fp4 +REG epsg:24376 0 0x1.1p6 0x1.04p5 +REG epsg:24376 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG epsg:24376 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG epsg:24376 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG epsg:24376 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG epsg:24377 0 0x1.28p6 0x1.ap4 +REG epsg:24377 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG epsg:24377 2 0x1.3e40859d8c244p6 0x1.5p4 +REG epsg:24377 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG epsg:24377 4 0x1.3e40859d8c244p6 0x1.fp4 +REG epsg:24378 0 0x1.1p6 0x1.04p5 +REG epsg:24378 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG epsg:24378 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG epsg:24378 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG epsg:24378 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG epsg:24379 0 0x1.28p6 0x1.ap4 +REG epsg:24379 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG epsg:24379 2 0x1.3e40859d8c244p6 0x1.5p4 +REG epsg:24379 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG epsg:24379 4 0x1.3e40859d8c244p6 0x1.fp4 +REG epsg:2438 0 0x1.ecp6 0x0.0p0 +REG epsg:2438 1 0x1.d8p6 -0x1.4p2 +REG epsg:2438 2 0x1.0p7 -0x1.4p2 +REG epsg:2438 3 0x1.d8p6 0x1.4p2 +REG epsg:2438 4 0x1.0p7 0x1.4p2 +REG epsg:24380 0 0x1.68p6 0x1.ap4 +REG epsg:24380 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG epsg:24380 2 0x1.7e40859d8c244p6 0x1.5p4 +REG epsg:24380 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG epsg:24380 4 0x1.7e40859d8c244p6 0x1.fp4 +REG epsg:24381 0 0x1.4p6 0x1.3p4 +REG epsg:24381 1 0x1.2ad8fb6bb699ap6 0x1.cp3 +REG epsg:24381 2 0x1.5527049449666p6 0x1.cp3 +REG epsg:24381 3 0x1.2ad8fb6bb699ap6 0x1.8p4 +REG epsg:24381 4 0x1.5527049449666p6 0x1.8p4 +REG epsg:24382 0 0x1.68p6 0x1.ap4 +REG epsg:24382 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG epsg:24382 2 0x1.7e40859d8c244p6 0x1.5p4 +REG epsg:24382 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG epsg:24382 4 0x1.7e40859d8c244p6 0x1.fp4 +REG epsg:24383 0 0x1.4p6 0x1.8p3 +REG epsg:24383 1 0x1.2b8d9dbc49a16p6 0x1.cp2 +REG epsg:24383 2 0x1.54726243b65eap6 0x1.cp2 +REG epsg:24383 3 0x1.2b8d9dbc49a16p6 0x1.1p4 +REG epsg:24383 4 0x1.54726243b65eap6 0x1.1p4 +REG epsg:2439 0 0x1.f8p6 0x0.0p0 +REG epsg:2439 1 0x1.e4p6 -0x1.4p2 +REG epsg:2439 2 0x1.06p7 -0x1.4p2 +REG epsg:2439 3 0x1.e4p6 0x1.4p2 +REG epsg:2439 4 0x1.06p7 0x1.4p2 +REG epsg:2440 0 0x1.02p7 0x0.0p0 +REG epsg:2440 1 0x1.fp6 -0x1.4p2 +REG epsg:2440 2 0x1.0cp7 -0x1.4p2 +REG epsg:2440 3 0x1.fp6 0x1.4p2 +REG epsg:2440 4 0x1.0cp7 0x1.4p2 +REG epsg:2441 0 0x1.08p7 0x0.0p0 +REG epsg:2441 1 0x1.fcp6 -0x1.4p2 +REG epsg:2441 2 0x1.12p7 -0x1.4p2 +REG epsg:2441 3 0x1.fcp6 0x1.4p2 +REG epsg:2441 4 0x1.12p7 0x1.4p2 +REG epsg:2442 0 0x1.0ep7 0x0.0p0 +REG epsg:2442 1 0x1.04p7 -0x1.4p2 +REG epsg:2442 2 0x1.18p7 -0x1.4p2 +REG epsg:2442 3 0x1.04p7 0x1.4p2 +REG epsg:2442 4 0x1.18p7 0x1.4p2 +REG epsg:2443 0 0x1.03p7 0x1.08p5 +REG epsg:2443 1 0x1.ee271995b65ffp6 0x1.cp4 +REG epsg:2443 2 0x1.0eec733524d01p7 0x1.cp4 +REG epsg:2443 3 0x1.ee271995b65ffp6 0x1.3p5 +REG epsg:2443 4 0x1.0eec733524d01p7 0x1.3p5 +REG epsg:2444 0 0x1.06p7 0x1.08p5 +REG epsg:2444 1 0x1.f4271995b65ffp6 0x1.cp4 +REG epsg:2444 2 0x1.11ec733524d01p7 0x1.cp4 +REG epsg:2444 3 0x1.f4271995b65ffp6 0x1.3p5 +REG epsg:2444 4 0x1.11ec733524d01p7 0x1.3p5 +REG epsg:2445 0 0x1.0855555555557p7 0x1.2p5 +REG epsg:2445 1 0x1.f7f1ffa5aec74p6 0x1.fp4 +REG epsg:2445 2 0x1.14b1aad7d3474p7 0x1.fp4 +REG epsg:2445 3 0x1.f7f1ffa5aec74p6 0x1.48p5 +REG epsg:2445 4 0x1.14b1aad7d3474p7 0x1.48p5 +REG epsg:2446 0 0x1.0bp7 0x1.08p5 +REG epsg:2446 1 0x1.fe271995b65ffp6 0x1.cp4 +REG epsg:2446 2 0x1.16ec733524d01p7 0x1.cp4 +REG epsg:2446 3 0x1.fe271995b65ffp6 0x1.3p5 +REG epsg:2446 4 0x1.16ec733524d01p7 0x1.3p5 +REG epsg:2447 0 0x1.0caaaaaaaaaa9p7 0x1.2p5 +REG epsg:2447 1 0x1.004e55282cb8cp7 0x1.fp4 +REG epsg:2447 2 0x1.1907002d289c6p7 0x1.fp4 +REG epsg:2447 3 0x1.004e55282cb8cp7 0x1.48p5 +REG epsg:2447 4 0x1.1907002d289c6p7 0x1.48p5 +REG epsg:2448 0 0x1.1p7 0x1.2p5 +REG epsg:2448 1 0x1.03a3aa7d820e3p7 0x1.fp4 +REG epsg:2448 2 0x1.1c5c55827df1dp7 0x1.fp4 +REG epsg:2448 3 0x1.03a3aa7d820e3p7 0x1.48p5 +REG epsg:2448 4 0x1.1c5c55827df1dp7 0x1.48p5 +REG epsg:2449 0 0x1.1255555555557p7 0x1.2p5 +REG epsg:2449 1 0x1.05f8ffd2d763ap7 0x1.fp4 +REG epsg:2449 2 0x1.1eb1aad7d3474p7 0x1.fp4 +REG epsg:2449 3 0x1.05f8ffd2d763ap7 0x1.48p5 +REG epsg:2449 4 0x1.1eb1aad7d3474p7 0x1.48p5 +REG epsg:2450 0 0x1.15p7 0x1.2p5 +REG epsg:2450 1 0x1.08a3aa7d820e3p7 0x1.fp4 +REG epsg:2450 2 0x1.215c55827df1dp7 0x1.fp4 +REG epsg:2450 3 0x1.08a3aa7d820e3p7 0x1.48p5 +REG epsg:2450 4 0x1.215c55827df1dp7 0x1.48p5 +REG epsg:24500 0 0x1.9f69796a1f705p6 0x1.49a336422301fp0 +REG epsg:24500 1 0x1.8b682e5845117p6 -0x1.db2e64deee7fp1 +REG epsg:24500 2 0x1.b36ac47bf9cf3p6 -0x1.db2e64deee7fp1 +REG epsg:24500 3 0x1.8b682e5845117p6 0x1.9268cd9088c08p2 +REG epsg:24500 4 0x1.b36ac47bf9cf3p6 0x1.9268cd9088c08p2 +REG epsg:2451 0 0x1.17aaaaaaaaaa9p7 0x1.2p5 +REG epsg:2451 1 0x1.0b4e55282cb8cp7 0x1.fp4 +REG epsg:2451 2 0x1.2407002d289c6p7 0x1.fp4 +REG epsg:2451 3 0x1.0b4e55282cb8cp7 0x1.48p5 +REG epsg:2451 4 0x1.2407002d289c6p7 0x1.48p5 +REG epsg:2452 0 0x1.19aaaaaaaaaa9p7 0x1.4p5 +REG epsg:2452 1 0x1.0c9cd2f20e3ebp7 0x1.18p5 +REG epsg:2452 2 0x1.26b8826347167p7 0x1.18p5 +REG epsg:2452 3 0x1.0c9cd2f20e3ebp7 0x1.68p5 +REG epsg:2452 4 0x1.26b8826347167p7 0x1.68p5 +REG epsg:2453 0 0x1.188p7 0x1.6p5 +REG epsg:2453 1 0x1.0a992e6394ef4p7 0x1.38p5 +REG epsg:2453 2 0x1.2666d19c6b10cp7 0x1.38p5 +REG epsg:2453 3 0x1.0a992e6394ef4p7 0x1.88p5 +REG epsg:2453 4 0x1.2666d19c6b10cp7 0x1.88p5 +REG epsg:2454 0 0x1.1c8p7 0x1.6p5 +REG epsg:2454 1 0x1.0e992e6394ef4p7 0x1.38p5 +REG epsg:2454 2 0x1.2a66d19c6b10cp7 0x1.38p5 +REG epsg:2454 3 0x1.0e992e6394ef4p7 0x1.88p5 +REG epsg:2454 4 0x1.2a66d19c6b10cp7 0x1.88p5 +REG epsg:24547 0 0x1.8cp6 0x0.0p0 +REG epsg:24547 1 0x1.78p6 -0x1.4p2 +REG epsg:24547 2 0x1.ap6 -0x1.4p2 +REG epsg:24547 3 0x1.78p6 0x1.4p2 +REG epsg:24547 4 0x1.ap6 0x1.4p2 +REG epsg:24548 0 0x1.a4p6 0x0.0p0 +REG epsg:24548 1 0x1.9p6 -0x1.4p2 +REG epsg:24548 2 0x1.b8p6 -0x1.4p2 +REG epsg:24548 3 0x1.9p6 0x1.4p2 +REG epsg:24548 4 0x1.b8p6 0x1.4p2 +REG epsg:2455 0 0x1.208p7 0x1.6p5 +REG epsg:2455 1 0x1.12992e6394ef4p7 0x1.38p5 +REG epsg:2455 2 0x1.2e66d19c6b10cp7 0x1.38p5 +REG epsg:2455 3 0x1.12992e6394ef4p7 0x1.88p5 +REG epsg:2455 4 0x1.2e66d19c6b10cp7 0x1.88p5 +REG epsg:2456 0 0x1.1cp7 0x1.ap4 +REG epsg:2456 1 0x1.10dfbd3139edep7 0x1.5p4 +REG epsg:2456 2 0x1.272042cec6122p7 0x1.5p4 +REG epsg:2456 3 0x1.10dfbd3139edep7 0x1.fp4 +REG epsg:2456 4 0x1.272042cec6122p7 0x1.fp4 +REG epsg:2457 0 0x1.fep6 0x1.ap4 +REG epsg:2457 1 0x1.e7bf7a6273dbcp6 0x1.5p4 +REG epsg:2457 2 0x1.0a2042cec6122p7 0x1.5p4 +REG epsg:2457 3 0x1.e7bf7a6273dbcp6 0x1.fp4 +REG epsg:2457 4 0x1.0a2042cec6122p7 0x1.fp4 +REG epsg:24571 0 0x1.99p6 0x1.0p2 +REG epsg:24571 1 0x1.84f37f5af8062p6 -0x1.0p0 +REG epsg:24571 2 0x1.ad0c80a507f9ep6 -0x1.0p0 +REG epsg:24571 3 0x1.84f37f5af8062p6 0x1.2p3 +REG epsg:24571 4 0x1.ad0c80a507f9ep6 0x1.2p3 +REG epsg:2458 0 0x1.fp6 0x1.ap4 +REG epsg:2458 1 0x1.d9bf7a6273dbcp6 0x1.5p4 +REG epsg:2458 2 0x1.032042cec6122p7 0x1.5p4 +REG epsg:2458 3 0x1.d9bf7a6273dbcp6 0x1.fp4 +REG epsg:2458 4 0x1.032042cec6122p7 0x1.fp4 +REG epsg:2459 0 0x1.06p7 0x1.ap4 +REG epsg:2459 1 0x1.f5bf7a6273dbcp6 0x1.5p4 +REG epsg:2459 2 0x1.112042cec6122p7 0x1.5p4 +REG epsg:2459 3 0x1.f5bf7a6273dbcp6 0x1.fp4 +REG epsg:2459 4 0x1.112042cec6122p7 0x1.fp4 +REG epsg:2460 0 0x1.1p7 0x1.4p4 +REG epsg:2460 1 0x1.055bb4747cdbcp7 0x1.ep3 +REG epsg:2460 2 0x1.1aa44b8b83244p7 0x1.ep3 +REG epsg:2460 3 0x1.055bb4747cdbcp7 0x1.9p4 +REG epsg:2460 4 0x1.1aa44b8b83244p7 0x1.9p4 +REG epsg:24600 0 0x1.68p5 0x1.04p5 +REG epsg:24600 1 0x1.38928b4db1cbap5 0x1.b8p4 +REG epsg:24600 2 0x1.976d74b24e346p5 0x1.b8p4 +REG epsg:24600 3 0x1.38928b4db1cbap5 0x1.2cp5 +REG epsg:24600 4 0x1.976d74b24e346p5 0x1.2cp5 +REG epsg:2461 0 0x1.34p7 0x1.ap4 +REG epsg:2461 1 0x1.28dfbd3139edep7 0x1.5p4 +REG epsg:2461 2 0x1.3f2042cec6122p7 0x1.5p4 +REG epsg:2461 3 0x1.28dfbd3139edep7 0x1.fp4 +REG epsg:2461 4 0x1.3f2042cec6122p7 0x1.fp4 +REG epsg:2462 0 0x1.5p4 0x0.0p0 +REG epsg:2462 1 0x1.0p4 -0x1.4p2 +REG epsg:2462 2 0x1.ap4 -0x1.4p2 +REG epsg:2462 3 0x1.0p4 0x1.4p2 +REG epsg:2462 4 0x1.ap4 0x1.4p2 +REG epsg:2463 0 0x1.5p4 0x0.0p0 +REG epsg:2463 1 0x1.0p4 -0x1.4p2 +REG epsg:2463 2 0x1.ap4 -0x1.4p2 +REG epsg:2463 3 0x1.0p4 0x1.4p2 +REG epsg:2463 4 0x1.ap4 0x1.4p2 +REG epsg:2464 0 0x1.bp4 0x0.0p0 +REG epsg:2464 1 0x1.6p4 -0x1.4p2 +REG epsg:2464 2 0x1.0p5 -0x1.4p2 +REG epsg:2464 3 0x1.6p4 0x1.4p2 +REG epsg:2464 4 0x1.0p5 0x1.4p2 +REG epsg:2465 0 0x1.08p5 0x0.0p0 +REG epsg:2465 1 0x1.cp4 -0x1.4p2 +REG epsg:2465 2 0x1.3p5 -0x1.4p2 +REG epsg:2465 3 0x1.cp4 0x1.4p2 +REG epsg:2465 4 0x1.3p5 0x1.4p2 +REG epsg:2466 0 0x1.38p5 0x0.0p0 +REG epsg:2466 1 0x1.1p5 -0x1.4p2 +REG epsg:2466 2 0x1.6p5 -0x1.4p2 +REG epsg:2466 3 0x1.1p5 0x1.4p2 +REG epsg:2466 4 0x1.6p5 0x1.4p2 +REG epsg:2467 0 0x1.68p5 0x0.0p0 +REG epsg:2467 1 0x1.4p5 -0x1.4p2 +REG epsg:2467 2 0x1.9p5 -0x1.4p2 +REG epsg:2467 3 0x1.4p5 0x1.4p2 +REG epsg:2467 4 0x1.9p5 0x1.4p2 +REG epsg:2468 0 0x1.98p5 0x0.0p0 +REG epsg:2468 1 0x1.7p5 -0x1.4p2 +REG epsg:2468 2 0x1.cp5 -0x1.4p2 +REG epsg:2468 3 0x1.7p5 0x1.4p2 +REG epsg:2468 4 0x1.cp5 0x1.4p2 +REG epsg:2469 0 0x1.c8p5 0x0.0p0 +REG epsg:2469 1 0x1.ap5 -0x1.4p2 +REG epsg:2469 2 0x1.fp5 -0x1.4p2 +REG epsg:2469 3 0x1.ap5 0x1.4p2 +REG epsg:2469 4 0x1.fp5 0x1.4p2 +REG epsg:2470 0 0x1.f8p5 0x0.0p0 +REG epsg:2470 1 0x1.dp5 -0x1.4p2 +REG epsg:2470 2 0x1.1p6 -0x1.4p2 +REG epsg:2470 3 0x1.dp5 0x1.4p2 +REG epsg:2470 4 0x1.1p6 0x1.4p2 +REG epsg:2471 0 0x1.14p6 0x0.0p0 +REG epsg:2471 1 0x1.0p6 -0x1.4p2 +REG epsg:2471 2 0x1.28p6 -0x1.4p2 +REG epsg:2471 3 0x1.0p6 0x1.4p2 +REG epsg:2471 4 0x1.28p6 0x1.4p2 +REG epsg:24718 0 -0x1.2cp6 0x0.0p0 +REG epsg:24718 1 -0x1.4p6 -0x1.4p2 +REG epsg:24718 2 -0x1.18p6 -0x1.4p2 +REG epsg:24718 3 -0x1.4p6 0x1.4p2 +REG epsg:24718 4 -0x1.18p6 0x1.4p2 +REG epsg:24719 0 -0x1.14p6 0x0.0p0 +REG epsg:24719 1 -0x1.28p6 -0x1.4p2 +REG epsg:24719 2 -0x1.0p6 -0x1.4p2 +REG epsg:24719 3 -0x1.28p6 0x1.4p2 +REG epsg:24719 4 -0x1.0p6 0x1.4p2 +REG epsg:2472 0 0x1.2cp6 0x0.0p0 +REG epsg:2472 1 0x1.18p6 -0x1.4p2 +REG epsg:2472 2 0x1.4p6 -0x1.4p2 +REG epsg:2472 3 0x1.18p6 0x1.4p2 +REG epsg:2472 4 0x1.4p6 0x1.4p2 +REG epsg:24720 0 -0x1.f8p5 0x0.0p0 +REG epsg:24720 1 -0x1.1p6 -0x1.4p2 +REG epsg:24720 2 -0x1.dp5 -0x1.4p2 +REG epsg:24720 3 -0x1.1p6 0x1.4p2 +REG epsg:24720 4 -0x1.dp5 0x1.4p2 +REG epsg:2473 0 0x1.44p6 0x0.0p0 +REG epsg:2473 1 0x1.3p6 -0x1.4p2 +REG epsg:2473 2 0x1.58p6 -0x1.4p2 +REG epsg:2473 3 0x1.3p6 0x1.4p2 +REG epsg:2473 4 0x1.58p6 0x1.4p2 +REG epsg:2474 0 0x1.5cp6 0x0.0p0 +REG epsg:2474 1 0x1.48p6 -0x1.4p2 +REG epsg:2474 2 0x1.7p6 -0x1.4p2 +REG epsg:2474 3 0x1.48p6 0x1.4p2 +REG epsg:2474 4 0x1.7p6 0x1.4p2 +REG epsg:2475 0 0x1.74p6 0x0.0p0 +REG epsg:2475 1 0x1.6p6 -0x1.4p2 +REG epsg:2475 2 0x1.88p6 -0x1.4p2 +REG epsg:2475 3 0x1.6p6 0x1.4p2 +REG epsg:2475 4 0x1.88p6 0x1.4p2 +REG epsg:2476 0 0x1.8cp6 0x0.0p0 +REG epsg:2476 1 0x1.78p6 -0x1.4p2 +REG epsg:2476 2 0x1.ap6 -0x1.4p2 +REG epsg:2476 3 0x1.78p6 0x1.4p2 +REG epsg:2476 4 0x1.ap6 0x1.4p2 +REG epsg:2477 0 0x1.a4p6 0x0.0p0 +REG epsg:2477 1 0x1.9p6 -0x1.4p2 +REG epsg:2477 2 0x1.b8p6 -0x1.4p2 +REG epsg:2477 3 0x1.9p6 0x1.4p2 +REG epsg:2477 4 0x1.b8p6 0x1.4p2 +REG epsg:2478 0 0x1.bcp6 0x0.0p0 +REG epsg:2478 1 0x1.a8p6 -0x1.4p2 +REG epsg:2478 2 0x1.dp6 -0x1.4p2 +REG epsg:2478 3 0x1.a8p6 0x1.4p2 +REG epsg:2478 4 0x1.dp6 0x1.4p2 +REG epsg:2479 0 0x1.d4p6 0x0.0p0 +REG epsg:2479 1 0x1.cp6 -0x1.4p2 +REG epsg:2479 2 0x1.e8p6 -0x1.4p2 +REG epsg:2479 3 0x1.cp6 0x1.4p2 +REG epsg:2479 4 0x1.e8p6 0x1.4p2 +REG epsg:2480 0 0x1.ecp6 0x0.0p0 +REG epsg:2480 1 0x1.d8p6 -0x1.4p2 +REG epsg:2480 2 0x1.0p7 -0x1.4p2 +REG epsg:2480 3 0x1.d8p6 0x1.4p2 +REG epsg:2480 4 0x1.0p7 0x1.4p2 +REG epsg:2481 0 0x1.02p7 0x0.0p0 +REG epsg:2481 1 0x1.fp6 -0x1.4p2 +REG epsg:2481 2 0x1.0cp7 -0x1.4p2 +REG epsg:2481 3 0x1.fp6 0x1.4p2 +REG epsg:2481 4 0x1.0cp7 0x1.4p2 +REG epsg:24817 0 -0x1.44p6 0x0.0p0 +REG epsg:24817 1 -0x1.58p6 -0x1.4p2 +REG epsg:24817 2 -0x1.3p6 -0x1.4p2 +REG epsg:24817 3 -0x1.58p6 0x1.4p2 +REG epsg:24817 4 -0x1.3p6 0x1.4p2 +REG epsg:24818 0 -0x1.2cp6 0x0.0p0 +REG epsg:24818 1 -0x1.4p6 -0x1.4p2 +REG epsg:24818 2 -0x1.18p6 -0x1.4p2 +REG epsg:24818 3 -0x1.4p6 0x1.4p2 +REG epsg:24818 4 -0x1.18p6 0x1.4p2 +REG epsg:24819 0 -0x1.14p6 0x0.0p0 +REG epsg:24819 1 -0x1.28p6 -0x1.4p2 +REG epsg:24819 2 -0x1.0p6 -0x1.4p2 +REG epsg:24819 3 -0x1.28p6 0x1.4p2 +REG epsg:24819 4 -0x1.0p6 0x1.4p2 +REG epsg:2482 0 0x1.0ep7 0x0.0p0 +REG epsg:2482 1 0x1.04p7 -0x1.4p2 +REG epsg:2482 2 0x1.18p7 -0x1.4p2 +REG epsg:2482 3 0x1.04p7 0x1.4p2 +REG epsg:2482 4 0x1.18p7 0x1.4p2 +REG epsg:24820 0 -0x1.f8p5 0x0.0p0 +REG epsg:24820 1 -0x1.1p6 -0x1.4p2 +REG epsg:24820 2 -0x1.dp5 -0x1.4p2 +REG epsg:24820 3 -0x1.1p6 0x1.4p2 +REG epsg:24820 4 -0x1.dp5 0x1.4p2 +REG epsg:24821 0 -0x1.c8p5 0x0.0p0 +REG epsg:24821 1 -0x1.fp5 -0x1.4p2 +REG epsg:24821 2 -0x1.ap5 -0x1.4p2 +REG epsg:24821 3 -0x1.fp5 0x1.4p2 +REG epsg:24821 4 -0x1.ap5 0x1.4p2 +REG epsg:2483 0 0x1.1ap7 0x0.0p0 +REG epsg:2483 1 0x1.1p7 -0x1.4p2 +REG epsg:2483 2 0x1.24p7 -0x1.4p2 +REG epsg:2483 3 0x1.1p7 0x1.4p2 +REG epsg:2483 4 0x1.24p7 0x1.4p2 +REG epsg:2484 0 0x1.26p7 0x0.0p0 +REG epsg:2484 1 0x1.1cp7 -0x1.4p2 +REG epsg:2484 2 0x1.3p7 -0x1.4p2 +REG epsg:2484 3 0x1.1cp7 0x1.4p2 +REG epsg:2484 4 0x1.3p7 0x1.4p2 +REG epsg:2485 0 0x1.32p7 0x0.0p0 +REG epsg:2485 1 0x1.28p7 -0x1.4p2 +REG epsg:2485 2 0x1.3cp7 -0x1.4p2 +REG epsg:2485 3 0x1.28p7 0x1.4p2 +REG epsg:2485 4 0x1.3cp7 0x1.4p2 +REG epsg:2486 0 0x1.3ep7 0x0.0p0 +REG epsg:2486 1 0x1.34p7 -0x1.4p2 +REG epsg:2486 2 0x1.48p7 -0x1.4p2 +REG epsg:2486 3 0x1.34p7 0x1.4p2 +REG epsg:2486 4 0x1.48p7 0x1.4p2 +REG epsg:2487 0 0x1.4ap7 0x0.0p0 +REG epsg:2487 1 0x1.4p7 -0x1.4p2 +REG epsg:2487 2 0x1.54p7 -0x1.4p2 +REG epsg:2487 3 0x1.4p7 0x1.4p2 +REG epsg:2487 4 0x1.54p7 0x1.4p2 +REG epsg:24877 0 -0x1.44p6 -0x1.9p4 +REG epsg:24877 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:24877 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:24877 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:24877 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:24878 0 -0x1.2cp6 -0x1.9p4 +REG epsg:24878 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:24878 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:24878 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:24878 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:24879 0 -0x1.14p6 -0x1.9p4 +REG epsg:24879 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:24879 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:24879 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:24879 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2488 0 0x1.56p7 0x0.0p0 +REG epsg:2488 1 0x1.4cp7 -0x1.4p2 +REG epsg:2488 2 0x1.6p7 -0x1.4p2 +REG epsg:2488 3 0x1.4cp7 0x1.4p2 +REG epsg:2488 4 0x1.6p7 0x1.4p2 +REG epsg:24880 0 -0x1.f8p5 -0x1.9p4 +REG epsg:24880 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:24880 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:24880 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:24880 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:24881 0 -0x1.c8p5 -0x1.9p4 +REG epsg:24881 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:24881 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:24881 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:24881 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:24882 0 -0x1.98p5 -0x1.9p4 +REG epsg:24882 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:24882 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:24882 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:24882 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2489 0 0x1.62p7 0x0.0p0 +REG epsg:2489 1 0x1.58p7 -0x1.4p2 +REG epsg:2489 2 -0x1.64p7 -0x1.4p2 +REG epsg:2489 3 0x1.58p7 0x1.4p2 +REG epsg:2489 4 -0x1.64p7 0x1.4p2 +REG epsg:24891 0 -0x1.42p6 -0x1.8p2 +REG epsg:24891 1 -0x1.561c33cfeba69p6 -0x1.6p3 +REG epsg:24891 2 -0x1.2de3cc3014597p6 -0x1.6p3 +REG epsg:24891 3 -0x1.561c33cfeba69p6 -0x1.0p0 +REG epsg:24891 4 -0x1.2de3cc3014597p6 -0x1.0p0 +REG epsg:24892 0 -0x1.3p6 -0x1.3p3 +REG epsg:24892 1 -0x1.444731b0d4376p6 -0x1.dp3 +REG epsg:24892 2 -0x1.1bb8ce4f2bc8ap6 -0x1.dp3 +REG epsg:24892 3 -0x1.444731b0d4376p6 -0x1.2p2 +REG epsg:24892 4 -0x1.1bb8ce4f2bc8ap6 -0x1.2p2 +REG epsg:24893 0 -0x1.1ap6 -0x1.3p3 +REG epsg:24893 1 -0x1.2e4731b0d4376p6 -0x1.dp3 +REG epsg:24893 2 -0x1.05b8ce4f2bc8ap6 -0x1.dp3 +REG epsg:24893 3 -0x1.2e4731b0d4376p6 -0x1.2p2 +REG epsg:24893 4 -0x1.05b8ce4f2bc8ap6 -0x1.2p2 +REG epsg:2490 0 -0x1.62p7 0x0.0p0 +REG epsg:2490 1 0x1.64p7 -0x1.4p2 +REG epsg:2490 2 -0x1.58p7 -0x1.4p2 +REG epsg:2490 3 0x1.64p7 0x1.4p2 +REG epsg:2490 4 -0x1.58p7 0x1.4p2 +REG epsg:2491 0 -0x1.56p7 0x0.0p0 +REG epsg:2491 1 -0x1.6p7 -0x1.4p2 +REG epsg:2491 2 -0x1.4cp7 -0x1.4p2 +REG epsg:2491 3 -0x1.6p7 0x1.4p2 +REG epsg:2491 4 -0x1.4cp7 0x1.4p2 +REG epsg:2492 0 0x1.2p3 0x0.0p0 +REG epsg:2492 1 0x1.0p2 -0x1.4p2 +REG epsg:2492 2 0x1.cp3 -0x1.4p2 +REG epsg:2492 3 0x1.0p2 0x1.4p2 +REG epsg:2492 4 0x1.cp3 0x1.4p2 +REG epsg:2493 0 0x1.ep3 0x0.0p0 +REG epsg:2493 1 0x1.4p3 -0x1.4p2 +REG epsg:2493 2 0x1.4p4 -0x1.4p2 +REG epsg:2493 3 0x1.4p3 0x1.4p2 +REG epsg:2493 4 0x1.4p4 0x1.4p2 +REG epsg:2494 0 0x1.5p4 0x0.0p0 +REG epsg:2494 1 0x1.0p4 -0x1.4p2 +REG epsg:2494 2 0x1.ap4 -0x1.4p2 +REG epsg:2494 3 0x1.0p4 0x1.4p2 +REG epsg:2494 4 0x1.ap4 0x1.4p2 +REG epsg:2495 0 0x1.bp4 0x0.0p0 +REG epsg:2495 1 0x1.6p4 -0x1.4p2 +REG epsg:2495 2 0x1.0p5 -0x1.4p2 +REG epsg:2495 3 0x1.6p4 0x1.4p2 +REG epsg:2495 4 0x1.0p5 0x1.4p2 +REG epsg:2496 0 0x1.08p5 0x0.0p0 +REG epsg:2496 1 0x1.cp4 -0x1.4p2 +REG epsg:2496 2 0x1.3p5 -0x1.4p2 +REG epsg:2496 3 0x1.cp4 0x1.4p2 +REG epsg:2496 4 0x1.3p5 0x1.4p2 +REG epsg:2497 0 0x1.38p5 0x0.0p0 +REG epsg:2497 1 0x1.1p5 -0x1.4p2 +REG epsg:2497 2 0x1.6p5 -0x1.4p2 +REG epsg:2497 3 0x1.1p5 0x1.4p2 +REG epsg:2497 4 0x1.6p5 0x1.4p2 +REG epsg:2498 0 0x1.68p5 0x0.0p0 +REG epsg:2498 1 0x1.4p5 -0x1.4p2 +REG epsg:2498 2 0x1.9p5 -0x1.4p2 +REG epsg:2498 3 0x1.4p5 0x1.4p2 +REG epsg:2498 4 0x1.9p5 0x1.4p2 +REG epsg:2499 0 0x1.98p5 0x0.0p0 +REG epsg:2499 1 0x1.7p5 -0x1.4p2 +REG epsg:2499 2 0x1.cp5 -0x1.4p2 +REG epsg:2499 3 0x1.7p5 0x1.4p2 +REG epsg:2499 4 0x1.cp5 0x1.4p2 +REG epsg:2500 0 0x1.c8p5 0x0.0p0 +REG epsg:2500 1 0x1.ap5 -0x1.4p2 +REG epsg:2500 2 0x1.fp5 -0x1.4p2 +REG epsg:2500 3 0x1.ap5 0x1.4p2 +REG epsg:2500 4 0x1.fp5 0x1.4p2 +REG epsg:25000 0 -0x1.0p0 0x1.2aaaaaaaaaaabp2 +REG epsg:25000 1 -0x1.81107a2df9b6ep2 -0x1.555555555555p-2 +REG epsg:25000 2 0x1.01107a2df9b6ep2 -0x1.555555555555p-2 +REG epsg:25000 3 -0x1.81107a2df9b6ep2 0x1.3555555555556p3 +REG epsg:25000 4 0x1.01107a2df9b6ep2 0x1.3555555555556p3 +REG epsg:2501 0 0x1.f8p5 0x0.0p0 +REG epsg:2501 1 0x1.dp5 -0x1.4p2 +REG epsg:2501 2 0x1.1p6 -0x1.4p2 +REG epsg:2501 3 0x1.dp5 0x1.4p2 +REG epsg:2501 4 0x1.1p6 0x1.4p2 +REG epsg:2502 0 0x1.14p6 0x0.0p0 +REG epsg:2502 1 0x1.0p6 -0x1.4p2 +REG epsg:2502 2 0x1.28p6 -0x1.4p2 +REG epsg:2502 3 0x1.0p6 0x1.4p2 +REG epsg:2502 4 0x1.28p6 0x1.4p2 +REG epsg:2503 0 0x1.2cp6 0x0.0p0 +REG epsg:2503 1 0x1.18p6 -0x1.4p2 +REG epsg:2503 2 0x1.4p6 -0x1.4p2 +REG epsg:2503 3 0x1.18p6 0x1.4p2 +REG epsg:2503 4 0x1.4p6 0x1.4p2 +REG epsg:2504 0 0x1.44p6 0x0.0p0 +REG epsg:2504 1 0x1.3p6 -0x1.4p2 +REG epsg:2504 2 0x1.58p6 -0x1.4p2 +REG epsg:2504 3 0x1.3p6 0x1.4p2 +REG epsg:2504 4 0x1.58p6 0x1.4p2 +REG epsg:2505 0 0x1.5cp6 0x0.0p0 +REG epsg:2505 1 0x1.48p6 -0x1.4p2 +REG epsg:2505 2 0x1.7p6 -0x1.4p2 +REG epsg:2505 3 0x1.48p6 0x1.4p2 +REG epsg:2505 4 0x1.7p6 0x1.4p2 +REG epsg:2506 0 0x1.74p6 0x0.0p0 +REG epsg:2506 1 0x1.6p6 -0x1.4p2 +REG epsg:2506 2 0x1.88p6 -0x1.4p2 +REG epsg:2506 3 0x1.6p6 0x1.4p2 +REG epsg:2506 4 0x1.88p6 0x1.4p2 +REG epsg:2507 0 0x1.8cp6 0x0.0p0 +REG epsg:2507 1 0x1.78p6 -0x1.4p2 +REG epsg:2507 2 0x1.ap6 -0x1.4p2 +REG epsg:2507 3 0x1.78p6 0x1.4p2 +REG epsg:2507 4 0x1.ap6 0x1.4p2 +REG epsg:2508 0 0x1.a4p6 0x0.0p0 +REG epsg:2508 1 0x1.9p6 -0x1.4p2 +REG epsg:2508 2 0x1.b8p6 -0x1.4p2 +REG epsg:2508 3 0x1.9p6 0x1.4p2 +REG epsg:2508 4 0x1.b8p6 0x1.4p2 +REG epsg:2509 0 0x1.bcp6 0x0.0p0 +REG epsg:2509 1 0x1.a8p6 -0x1.4p2 +REG epsg:2509 2 0x1.dp6 -0x1.4p2 +REG epsg:2509 3 0x1.a8p6 0x1.4p2 +REG epsg:2509 4 0x1.dp6 0x1.4p2 +REG epsg:2510 0 0x1.d4p6 0x0.0p0 +REG epsg:2510 1 0x1.cp6 -0x1.4p2 +REG epsg:2510 2 0x1.e8p6 -0x1.4p2 +REG epsg:2510 3 0x1.cp6 0x1.4p2 +REG epsg:2510 4 0x1.e8p6 0x1.4p2 +REG epsg:2511 0 0x1.ecp6 0x0.0p0 +REG epsg:2511 1 0x1.d8p6 -0x1.4p2 +REG epsg:2511 2 0x1.0p7 -0x1.4p2 +REG epsg:2511 3 0x1.d8p6 0x1.4p2 +REG epsg:2511 4 0x1.0p7 0x1.4p2 +REG epsg:2512 0 0x1.02p7 0x0.0p0 +REG epsg:2512 1 0x1.fp6 -0x1.4p2 +REG epsg:2512 2 0x1.0cp7 -0x1.4p2 +REG epsg:2512 3 0x1.fp6 0x1.4p2 +REG epsg:2512 4 0x1.0cp7 0x1.4p2 +REG epsg:2513 0 0x1.0ep7 0x0.0p0 +REG epsg:2513 1 0x1.04p7 -0x1.4p2 +REG epsg:2513 2 0x1.18p7 -0x1.4p2 +REG epsg:2513 3 0x1.04p7 0x1.4p2 +REG epsg:2513 4 0x1.18p7 0x1.4p2 +REG epsg:2514 0 0x1.1ap7 0x0.0p0 +REG epsg:2514 1 0x1.1p7 -0x1.4p2 +REG epsg:2514 2 0x1.24p7 -0x1.4p2 +REG epsg:2514 3 0x1.1p7 0x1.4p2 +REG epsg:2514 4 0x1.24p7 0x1.4p2 +REG epsg:2515 0 0x1.26p7 0x0.0p0 +REG epsg:2515 1 0x1.1cp7 -0x1.4p2 +REG epsg:2515 2 0x1.3p7 -0x1.4p2 +REG epsg:2515 3 0x1.1cp7 0x1.4p2 +REG epsg:2515 4 0x1.3p7 0x1.4p2 +REG epsg:2516 0 0x1.32p7 0x0.0p0 +REG epsg:2516 1 0x1.28p7 -0x1.4p2 +REG epsg:2516 2 0x1.3cp7 -0x1.4p2 +REG epsg:2516 3 0x1.28p7 0x1.4p2 +REG epsg:2516 4 0x1.3cp7 0x1.4p2 +REG epsg:2517 0 0x1.3ep7 0x0.0p0 +REG epsg:2517 1 0x1.34p7 -0x1.4p2 +REG epsg:2517 2 0x1.48p7 -0x1.4p2 +REG epsg:2517 3 0x1.34p7 0x1.4p2 +REG epsg:2517 4 0x1.48p7 0x1.4p2 +REG epsg:2518 0 0x1.4ap7 0x0.0p0 +REG epsg:2518 1 0x1.4p7 -0x1.4p2 +REG epsg:2518 2 0x1.54p7 -0x1.4p2 +REG epsg:2518 3 0x1.4p7 0x1.4p2 +REG epsg:2518 4 0x1.54p7 0x1.4p2 +REG epsg:2519 0 0x1.56p7 0x0.0p0 +REG epsg:2519 1 0x1.4cp7 -0x1.4p2 +REG epsg:2519 2 0x1.6p7 -0x1.4p2 +REG epsg:2519 3 0x1.4cp7 0x1.4p2 +REG epsg:2519 4 0x1.6p7 0x1.4p2 +REG epsg:2520 0 0x1.62p7 0x0.0p0 +REG epsg:2520 1 0x1.58p7 -0x1.4p2 +REG epsg:2520 2 -0x1.64p7 -0x1.4p2 +REG epsg:2520 3 0x1.58p7 0x1.4p2 +REG epsg:2520 4 -0x1.64p7 0x1.4p2 +REG epsg:2521 0 -0x1.62p7 0x0.0p0 +REG epsg:2521 1 0x1.64p7 -0x1.4p2 +REG epsg:2521 2 -0x1.58p7 -0x1.4p2 +REG epsg:2521 3 0x1.64p7 0x1.4p2 +REG epsg:2521 4 -0x1.58p7 0x1.4p2 +REG epsg:2522 0 -0x1.56p7 0x0.0p0 +REG epsg:2522 1 -0x1.6p7 -0x1.4p2 +REG epsg:2522 2 -0x1.4cp7 -0x1.4p2 +REG epsg:2522 3 -0x1.6p7 0x1.4p2 +REG epsg:2522 4 -0x1.4cp7 0x1.4p2 +REG epsg:2523 0 0x1.5p4 0x0.0p0 +REG epsg:2523 1 0x1.0p4 -0x1.4p2 +REG epsg:2523 2 0x1.ap4 -0x1.4p2 +REG epsg:2523 3 0x1.0p4 0x1.4p2 +REG epsg:2523 4 0x1.ap4 0x1.4p2 +REG epsg:25231 0 0x1.8p1 0x0.0p0 +REG epsg:25231 1 -0x1.0p1 -0x1.4p2 +REG epsg:25231 2 0x1.0p3 -0x1.4p2 +REG epsg:25231 3 -0x1.0p1 0x1.4p2 +REG epsg:25231 4 0x1.0p3 0x1.4p2 +REG epsg:2524 0 0x1.8p4 0x0.0p0 +REG epsg:2524 1 0x1.3p4 -0x1.4p2 +REG epsg:2524 2 0x1.dp4 -0x1.4p2 +REG epsg:2524 3 0x1.3p4 0x1.4p2 +REG epsg:2524 4 0x1.dp4 0x1.4p2 +REG epsg:2525 0 0x1.bp4 0x0.0p0 +REG epsg:2525 1 0x1.6p4 -0x1.4p2 +REG epsg:2525 2 0x1.0p5 -0x1.4p2 +REG epsg:2525 3 0x1.6p4 0x1.4p2 +REG epsg:2525 4 0x1.0p5 0x1.4p2 +REG epsg:2526 0 0x1.ep4 0x0.0p0 +REG epsg:2526 1 0x1.9p4 -0x1.4p2 +REG epsg:2526 2 0x1.18p5 -0x1.4p2 +REG epsg:2526 3 0x1.9p4 0x1.4p2 +REG epsg:2526 4 0x1.18p5 0x1.4p2 +REG epsg:2527 0 0x1.08p5 0x0.0p0 +REG epsg:2527 1 0x1.cp4 -0x1.4p2 +REG epsg:2527 2 0x1.3p5 -0x1.4p2 +REG epsg:2527 3 0x1.cp4 0x1.4p2 +REG epsg:2527 4 0x1.3p5 0x1.4p2 +REG epsg:2528 0 0x1.2p5 0x0.0p0 +REG epsg:2528 1 0x1.fp4 -0x1.4p2 +REG epsg:2528 2 0x1.48p5 -0x1.4p2 +REG epsg:2528 3 0x1.fp4 0x1.4p2 +REG epsg:2528 4 0x1.48p5 0x1.4p2 +REG epsg:2529 0 0x1.38p5 0x0.0p0 +REG epsg:2529 1 0x1.1p5 -0x1.4p2 +REG epsg:2529 2 0x1.6p5 -0x1.4p2 +REG epsg:2529 3 0x1.1p5 0x1.4p2 +REG epsg:2529 4 0x1.6p5 0x1.4p2 +REG epsg:2530 0 0x1.5p5 0x0.0p0 +REG epsg:2530 1 0x1.28p5 -0x1.4p2 +REG epsg:2530 2 0x1.78p5 -0x1.4p2 +REG epsg:2530 3 0x1.28p5 0x1.4p2 +REG epsg:2530 4 0x1.78p5 0x1.4p2 +REG epsg:2531 0 0x1.68p5 0x0.0p0 +REG epsg:2531 1 0x1.4p5 -0x1.4p2 +REG epsg:2531 2 0x1.9p5 -0x1.4p2 +REG epsg:2531 3 0x1.4p5 0x1.4p2 +REG epsg:2531 4 0x1.9p5 0x1.4p2 +REG epsg:2532 0 0x1.8p5 0x0.0p0 +REG epsg:2532 1 0x1.58p5 -0x1.4p2 +REG epsg:2532 2 0x1.a8p5 -0x1.4p2 +REG epsg:2532 3 0x1.58p5 0x1.4p2 +REG epsg:2532 4 0x1.a8p5 0x1.4p2 +REG epsg:2533 0 0x1.98p5 0x0.0p0 +REG epsg:2533 1 0x1.7p5 -0x1.4p2 +REG epsg:2533 2 0x1.cp5 -0x1.4p2 +REG epsg:2533 3 0x1.7p5 0x1.4p2 +REG epsg:2533 4 0x1.cp5 0x1.4p2 +REG epsg:2534 0 0x1.bp5 0x0.0p0 +REG epsg:2534 1 0x1.88p5 -0x1.4p2 +REG epsg:2534 2 0x1.d8p5 -0x1.4p2 +REG epsg:2534 3 0x1.88p5 0x1.4p2 +REG epsg:2534 4 0x1.d8p5 0x1.4p2 +REG epsg:2535 0 0x1.c8p5 0x0.0p0 +REG epsg:2535 1 0x1.ap5 -0x1.4p2 +REG epsg:2535 2 0x1.fp5 -0x1.4p2 +REG epsg:2535 3 0x1.ap5 0x1.4p2 +REG epsg:2535 4 0x1.fp5 0x1.4p2 +REG epsg:2536 0 0x1.ep5 0x0.0p0 +REG epsg:2536 1 0x1.b8p5 -0x1.4p2 +REG epsg:2536 2 0x1.04p6 -0x1.4p2 +REG epsg:2536 3 0x1.b8p5 0x1.4p2 +REG epsg:2536 4 0x1.04p6 0x1.4p2 +REG epsg:2537 0 0x1.f8p5 0x0.0p0 +REG epsg:2537 1 0x1.dp5 -0x1.4p2 +REG epsg:2537 2 0x1.1p6 -0x1.4p2 +REG epsg:2537 3 0x1.dp5 0x1.4p2 +REG epsg:2537 4 0x1.1p6 0x1.4p2 +REG epsg:2538 0 0x1.08p6 0x0.0p0 +REG epsg:2538 1 0x1.e8p5 -0x1.4p2 +REG epsg:2538 2 0x1.1cp6 -0x1.4p2 +REG epsg:2538 3 0x1.e8p5 0x1.4p2 +REG epsg:2538 4 0x1.1cp6 0x1.4p2 +REG epsg:2539 0 0x1.14p6 0x0.0p0 +REG epsg:2539 1 0x1.0p6 -0x1.4p2 +REG epsg:2539 2 0x1.28p6 -0x1.4p2 +REG epsg:2539 3 0x1.0p6 0x1.4p2 +REG epsg:2539 4 0x1.28p6 0x1.4p2 +REG epsg:25391 0 0x1.d4p6 0x0.0p0 +REG epsg:25391 1 0x1.cp6 -0x1.4p2 +REG epsg:25391 2 0x1.e8p6 -0x1.4p2 +REG epsg:25391 3 0x1.cp6 0x1.4p2 +REG epsg:25391 4 0x1.e8p6 0x1.4p2 +REG epsg:25392 0 0x1.dcp6 0x0.0p0 +REG epsg:25392 1 0x1.c8p6 -0x1.4p2 +REG epsg:25392 2 0x1.fp6 -0x1.4p2 +REG epsg:25392 3 0x1.c8p6 0x1.4p2 +REG epsg:25392 4 0x1.fp6 0x1.4p2 +REG epsg:25393 0 0x1.e4p6 0x0.0p0 +REG epsg:25393 1 0x1.dp6 -0x1.4p2 +REG epsg:25393 2 0x1.f8p6 -0x1.4p2 +REG epsg:25393 3 0x1.dp6 0x1.4p2 +REG epsg:25393 4 0x1.f8p6 0x1.4p2 +REG epsg:25394 0 0x1.ecp6 0x0.0p0 +REG epsg:25394 1 0x1.d8p6 -0x1.4p2 +REG epsg:25394 2 0x1.0p7 -0x1.4p2 +REG epsg:25394 3 0x1.d8p6 0x1.4p2 +REG epsg:25394 4 0x1.0p7 0x1.4p2 +REG epsg:25395 0 0x1.f4p6 0x0.0p0 +REG epsg:25395 1 0x1.ep6 -0x1.4p2 +REG epsg:25395 2 0x1.04p7 -0x1.4p2 +REG epsg:25395 3 0x1.ep6 0x1.4p2 +REG epsg:25395 4 0x1.04p7 0x1.4p2 +REG epsg:2540 0 0x1.2p6 0x0.0p0 +REG epsg:2540 1 0x1.0cp6 -0x1.4p2 +REG epsg:2540 2 0x1.34p6 -0x1.4p2 +REG epsg:2540 3 0x1.0cp6 0x1.4p2 +REG epsg:2540 4 0x1.34p6 0x1.4p2 +REG epsg:2541 0 0x1.2cp6 0x0.0p0 +REG epsg:2541 1 0x1.18p6 -0x1.4p2 +REG epsg:2541 2 0x1.4p6 -0x1.4p2 +REG epsg:2541 3 0x1.18p6 0x1.4p2 +REG epsg:2541 4 0x1.4p6 0x1.4p2 +REG epsg:2542 0 0x1.38p6 0x0.0p0 +REG epsg:2542 1 0x1.24p6 -0x1.4p2 +REG epsg:2542 2 0x1.4cp6 -0x1.4p2 +REG epsg:2542 3 0x1.24p6 0x1.4p2 +REG epsg:2542 4 0x1.4cp6 0x1.4p2 +REG epsg:2543 0 0x1.44p6 0x0.0p0 +REG epsg:2543 1 0x1.3p6 -0x1.4p2 +REG epsg:2543 2 0x1.58p6 -0x1.4p2 +REG epsg:2543 3 0x1.3p6 0x1.4p2 +REG epsg:2543 4 0x1.58p6 0x1.4p2 +REG epsg:2544 0 0x1.5p6 0x0.0p0 +REG epsg:2544 1 0x1.3cp6 -0x1.4p2 +REG epsg:2544 2 0x1.64p6 -0x1.4p2 +REG epsg:2544 3 0x1.3cp6 0x1.4p2 +REG epsg:2544 4 0x1.64p6 0x1.4p2 +REG epsg:2545 0 0x1.5cp6 0x0.0p0 +REG epsg:2545 1 0x1.48p6 -0x1.4p2 +REG epsg:2545 2 0x1.7p6 -0x1.4p2 +REG epsg:2545 3 0x1.48p6 0x1.4p2 +REG epsg:2545 4 0x1.7p6 0x1.4p2 +REG epsg:2546 0 0x1.68p6 0x0.0p0 +REG epsg:2546 1 0x1.54p6 -0x1.4p2 +REG epsg:2546 2 0x1.7cp6 -0x1.4p2 +REG epsg:2546 3 0x1.54p6 0x1.4p2 +REG epsg:2546 4 0x1.7cp6 0x1.4p2 +REG epsg:2547 0 0x1.74p6 0x0.0p0 +REG epsg:2547 1 0x1.6p6 -0x1.4p2 +REG epsg:2547 2 0x1.88p6 -0x1.4p2 +REG epsg:2547 3 0x1.6p6 0x1.4p2 +REG epsg:2547 4 0x1.88p6 0x1.4p2 +REG epsg:2548 0 0x1.8p6 0x0.0p0 +REG epsg:2548 1 0x1.6cp6 -0x1.4p2 +REG epsg:2548 2 0x1.94p6 -0x1.4p2 +REG epsg:2548 3 0x1.6cp6 0x1.4p2 +REG epsg:2548 4 0x1.94p6 0x1.4p2 +REG epsg:2549 0 0x1.8cp6 0x0.0p0 +REG epsg:2549 1 0x1.78p6 -0x1.4p2 +REG epsg:2549 2 0x1.ap6 -0x1.4p2 +REG epsg:2549 3 0x1.78p6 0x1.4p2 +REG epsg:2549 4 0x1.ap6 0x1.4p2 +REG epsg:2550 0 0x1.d4p6 -0x1.9p4 +REG epsg:2550 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:2550 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:2550 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:2550 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:2551 0 0x1.98p6 0x0.0p0 +REG epsg:2551 1 0x1.84p6 -0x1.4p2 +REG epsg:2551 2 0x1.acp6 -0x1.4p2 +REG epsg:2551 3 0x1.84p6 0x1.4p2 +REG epsg:2551 4 0x1.acp6 0x1.4p2 +REG epsg:2552 0 0x1.a4p6 0x0.0p0 +REG epsg:2552 1 0x1.9p6 -0x1.4p2 +REG epsg:2552 2 0x1.b8p6 -0x1.4p2 +REG epsg:2552 3 0x1.9p6 0x1.4p2 +REG epsg:2552 4 0x1.b8p6 0x1.4p2 +REG epsg:2553 0 0x1.bp6 0x0.0p0 +REG epsg:2553 1 0x1.9cp6 -0x1.4p2 +REG epsg:2553 2 0x1.c4p6 -0x1.4p2 +REG epsg:2553 3 0x1.9cp6 0x1.4p2 +REG epsg:2553 4 0x1.c4p6 0x1.4p2 +REG epsg:2554 0 0x1.bcp6 0x0.0p0 +REG epsg:2554 1 0x1.a8p6 -0x1.4p2 +REG epsg:2554 2 0x1.dp6 -0x1.4p2 +REG epsg:2554 3 0x1.a8p6 0x1.4p2 +REG epsg:2554 4 0x1.dp6 0x1.4p2 +REG epsg:2555 0 0x1.c8p6 0x0.0p0 +REG epsg:2555 1 0x1.b4p6 -0x1.4p2 +REG epsg:2555 2 0x1.dcp6 -0x1.4p2 +REG epsg:2555 3 0x1.b4p6 0x1.4p2 +REG epsg:2555 4 0x1.dcp6 0x1.4p2 +REG epsg:2556 0 0x1.d4p6 0x0.0p0 +REG epsg:2556 1 0x1.cp6 -0x1.4p2 +REG epsg:2556 2 0x1.e8p6 -0x1.4p2 +REG epsg:2556 3 0x1.cp6 0x1.4p2 +REG epsg:2556 4 0x1.e8p6 0x1.4p2 +REG epsg:2557 0 0x1.ep6 0x0.0p0 +REG epsg:2557 1 0x1.ccp6 -0x1.4p2 +REG epsg:2557 2 0x1.f4p6 -0x1.4p2 +REG epsg:2557 3 0x1.ccp6 0x1.4p2 +REG epsg:2557 4 0x1.f4p6 0x1.4p2 +REG epsg:2558 0 0x1.ecp6 0x0.0p0 +REG epsg:2558 1 0x1.d8p6 -0x1.4p2 +REG epsg:2558 2 0x1.0p7 -0x1.4p2 +REG epsg:2558 3 0x1.d8p6 0x1.4p2 +REG epsg:2558 4 0x1.0p7 0x1.4p2 +REG epsg:2559 0 0x1.f8p6 0x0.0p0 +REG epsg:2559 1 0x1.e4p6 -0x1.4p2 +REG epsg:2559 2 0x1.06p7 -0x1.4p2 +REG epsg:2559 3 0x1.e4p6 0x1.4p2 +REG epsg:2559 4 0x1.06p7 0x1.4p2 +REG epsg:2560 0 0x1.02p7 0x0.0p0 +REG epsg:2560 1 0x1.fp6 -0x1.4p2 +REG epsg:2560 2 0x1.0cp7 -0x1.4p2 +REG epsg:2560 3 0x1.fp6 0x1.4p2 +REG epsg:2560 4 0x1.0cp7 0x1.4p2 +REG epsg:2561 0 0x1.08p7 0x0.0p0 +REG epsg:2561 1 0x1.fcp6 -0x1.4p2 +REG epsg:2561 2 0x1.12p7 -0x1.4p2 +REG epsg:2561 3 0x1.fcp6 0x1.4p2 +REG epsg:2561 4 0x1.12p7 0x1.4p2 +REG epsg:2562 0 0x1.0ep7 0x0.0p0 +REG epsg:2562 1 0x1.04p7 -0x1.4p2 +REG epsg:2562 2 0x1.18p7 -0x1.4p2 +REG epsg:2562 3 0x1.04p7 0x1.4p2 +REG epsg:2562 4 0x1.18p7 0x1.4p2 +REG epsg:2563 0 0x1.14p7 0x0.0p0 +REG epsg:2563 1 0x1.0ap7 -0x1.4p2 +REG epsg:2563 2 0x1.1ep7 -0x1.4p2 +REG epsg:2563 3 0x1.0ap7 0x1.4p2 +REG epsg:2563 4 0x1.1ep7 0x1.4p2 +REG epsg:2564 0 0x1.1ap7 0x0.0p0 +REG epsg:2564 1 0x1.1p7 -0x1.4p2 +REG epsg:2564 2 0x1.24p7 -0x1.4p2 +REG epsg:2564 3 0x1.1p7 0x1.4p2 +REG epsg:2564 4 0x1.24p7 0x1.4p2 +REG epsg:2565 0 0x1.2p7 0x0.0p0 +REG epsg:2565 1 0x1.16p7 -0x1.4p2 +REG epsg:2565 2 0x1.2ap7 -0x1.4p2 +REG epsg:2565 3 0x1.16p7 0x1.4p2 +REG epsg:2565 4 0x1.2ap7 0x1.4p2 +REG epsg:2566 0 0x1.26p7 0x0.0p0 +REG epsg:2566 1 0x1.1cp7 -0x1.4p2 +REG epsg:2566 2 0x1.3p7 -0x1.4p2 +REG epsg:2566 3 0x1.1cp7 0x1.4p2 +REG epsg:2566 4 0x1.3p7 0x1.4p2 +REG epsg:2567 0 0x1.2cp7 0x0.0p0 +REG epsg:2567 1 0x1.22p7 -0x1.4p2 +REG epsg:2567 2 0x1.36p7 -0x1.4p2 +REG epsg:2567 3 0x1.22p7 0x1.4p2 +REG epsg:2567 4 0x1.36p7 0x1.4p2 +REG epsg:2568 0 0x1.32p7 0x0.0p0 +REG epsg:2568 1 0x1.28p7 -0x1.4p2 +REG epsg:2568 2 0x1.3cp7 -0x1.4p2 +REG epsg:2568 3 0x1.28p7 0x1.4p2 +REG epsg:2568 4 0x1.3cp7 0x1.4p2 +REG epsg:2569 0 0x1.38p7 0x0.0p0 +REG epsg:2569 1 0x1.2ep7 -0x1.4p2 +REG epsg:2569 2 0x1.42p7 -0x1.4p2 +REG epsg:2569 3 0x1.2ep7 0x1.4p2 +REG epsg:2569 4 0x1.42p7 0x1.4p2 +REG epsg:2570 0 0x1.3ep7 0x0.0p0 +REG epsg:2570 1 0x1.34p7 -0x1.4p2 +REG epsg:2570 2 0x1.48p7 -0x1.4p2 +REG epsg:2570 3 0x1.34p7 0x1.4p2 +REG epsg:2570 4 0x1.48p7 0x1.4p2 +REG epsg:25700 0 0x1.b8p6 0x0.0p0 +REG epsg:25700 1 0x1.a4p6 -0x1.4p2 +REG epsg:25700 2 0x1.ccp6 -0x1.4p2 +REG epsg:25700 3 0x1.a4p6 0x1.4p2 +REG epsg:25700 4 0x1.ccp6 0x1.4p2 +REG epsg:2571 0 0x1.44p7 0x0.0p0 +REG epsg:2571 1 0x1.3ap7 -0x1.4p2 +REG epsg:2571 2 0x1.4ep7 -0x1.4p2 +REG epsg:2571 3 0x1.3ap7 0x1.4p2 +REG epsg:2571 4 0x1.4ep7 0x1.4p2 +REG epsg:2572 0 0x1.4ap7 0x0.0p0 +REG epsg:2572 1 0x1.4p7 -0x1.4p2 +REG epsg:2572 2 0x1.54p7 -0x1.4p2 +REG epsg:2572 3 0x1.4p7 0x1.4p2 +REG epsg:2572 4 0x1.54p7 0x1.4p2 +REG epsg:2573 0 0x1.5p7 0x0.0p0 +REG epsg:2573 1 0x1.46p7 -0x1.4p2 +REG epsg:2573 2 0x1.5ap7 -0x1.4p2 +REG epsg:2573 3 0x1.46p7 0x1.4p2 +REG epsg:2573 4 0x1.5ap7 0x1.4p2 +REG epsg:2574 0 0x1.56p7 0x0.0p0 +REG epsg:2574 1 0x1.4cp7 -0x1.4p2 +REG epsg:2574 2 0x1.6p7 -0x1.4p2 +REG epsg:2574 3 0x1.4cp7 0x1.4p2 +REG epsg:2574 4 0x1.6p7 0x1.4p2 +REG epsg:2575 0 0x1.5cp7 0x0.0p0 +REG epsg:2575 1 0x1.52p7 -0x1.4p2 +REG epsg:2575 2 0x1.66p7 -0x1.4p2 +REG epsg:2575 3 0x1.52p7 0x1.4p2 +REG epsg:2575 4 0x1.66p7 0x1.4p2 +REG epsg:2576 0 0x1.62p7 0x0.0p0 +REG epsg:2576 1 0x1.58p7 -0x1.4p2 +REG epsg:2576 2 -0x1.64p7 -0x1.4p2 +REG epsg:2576 3 0x1.58p7 0x1.4p2 +REG epsg:2576 4 -0x1.64p7 0x1.4p2 +REG epsg:2577 0 -0x1.68p7 0x0.0p0 +REG epsg:2577 1 0x1.5ep7 -0x1.4p2 +REG epsg:2577 2 -0x1.5ep7 -0x1.4p2 +REG epsg:2577 3 0x1.5ep7 0x1.4p2 +REG epsg:2577 4 -0x1.5ep7 0x1.4p2 +REG epsg:2578 0 -0x1.62p7 0x0.0p0 +REG epsg:2578 1 0x1.64p7 -0x1.4p2 +REG epsg:2578 2 -0x1.58p7 -0x1.4p2 +REG epsg:2578 3 0x1.64p7 0x1.4p2 +REG epsg:2578 4 -0x1.58p7 0x1.4p2 +REG epsg:2579 0 -0x1.5cp7 0x0.0p0 +REG epsg:2579 1 -0x1.66p7 -0x1.4p2 +REG epsg:2579 2 -0x1.52p7 -0x1.4p2 +REG epsg:2579 3 -0x1.66p7 0x1.4p2 +REG epsg:2579 4 -0x1.52p7 0x1.4p2 +REG epsg:2580 0 -0x1.56p7 0x0.0p0 +REG epsg:2580 1 -0x1.6p7 -0x1.4p2 +REG epsg:2580 2 -0x1.4cp7 -0x1.4p2 +REG epsg:2580 3 -0x1.6p7 0x1.4p2 +REG epsg:2580 4 -0x1.4cp7 0x1.4p2 +REG epsg:2581 0 -0x1.5p7 0x0.0p0 +REG epsg:2581 1 -0x1.5ap7 -0x1.4p2 +REG epsg:2581 2 -0x1.46p7 -0x1.4p2 +REG epsg:2581 3 -0x1.5ap7 0x1.4p2 +REG epsg:2581 4 -0x1.46p7 0x1.4p2 +REG epsg:2582 0 0x1.5p4 0x0.0p0 +REG epsg:2582 1 0x1.0p4 -0x1.4p2 +REG epsg:2582 2 0x1.ap4 -0x1.4p2 +REG epsg:2582 3 0x1.0p4 0x1.4p2 +REG epsg:2582 4 0x1.ap4 0x1.4p2 +REG epsg:25828 0 -0x1.ep3 0x0.0p0 +REG epsg:25828 1 -0x1.4p4 -0x1.4p2 +REG epsg:25828 2 -0x1.4p3 -0x1.4p2 +REG epsg:25828 3 -0x1.4p4 0x1.4p2 +REG epsg:25828 4 -0x1.4p3 0x1.4p2 +REG epsg:25829 0 -0x1.2p3 0x0.0p0 +REG epsg:25829 1 -0x1.cp3 -0x1.4p2 +REG epsg:25829 2 -0x1.0p2 -0x1.4p2 +REG epsg:25829 3 -0x1.cp3 0x1.4p2 +REG epsg:25829 4 -0x1.0p2 0x1.4p2 +REG epsg:2583 0 0x1.8p4 0x0.0p0 +REG epsg:2583 1 0x1.3p4 -0x1.4p2 +REG epsg:2583 2 0x1.dp4 -0x1.4p2 +REG epsg:2583 3 0x1.3p4 0x1.4p2 +REG epsg:2583 4 0x1.dp4 0x1.4p2 +REG epsg:25830 0 -0x1.8p1 0x0.0p0 +REG epsg:25830 1 -0x1.0p3 -0x1.4p2 +REG epsg:25830 2 0x1.0p1 -0x1.4p2 +REG epsg:25830 3 -0x1.0p3 0x1.4p2 +REG epsg:25830 4 0x1.0p1 0x1.4p2 +REG epsg:25831 0 0x1.8p1 0x0.0p0 +REG epsg:25831 1 -0x1.0p1 -0x1.4p2 +REG epsg:25831 2 0x1.0p3 -0x1.4p2 +REG epsg:25831 3 -0x1.0p1 0x1.4p2 +REG epsg:25831 4 0x1.0p3 0x1.4p2 +REG epsg:25832 0 0x1.2p3 0x0.0p0 +REG epsg:25832 1 0x1.0p2 -0x1.4p2 +REG epsg:25832 2 0x1.cp3 -0x1.4p2 +REG epsg:25832 3 0x1.0p2 0x1.4p2 +REG epsg:25832 4 0x1.cp3 0x1.4p2 +REG epsg:25833 0 0x1.ep3 0x0.0p0 +REG epsg:25833 1 0x1.4p3 -0x1.4p2 +REG epsg:25833 2 0x1.4p4 -0x1.4p2 +REG epsg:25833 3 0x1.4p3 0x1.4p2 +REG epsg:25833 4 0x1.4p4 0x1.4p2 +REG epsg:25834 0 0x1.5p4 0x0.0p0 +REG epsg:25834 1 0x1.0p4 -0x1.4p2 +REG epsg:25834 2 0x1.ap4 -0x1.4p2 +REG epsg:25834 3 0x1.0p4 0x1.4p2 +REG epsg:25834 4 0x1.ap4 0x1.4p2 +REG epsg:25835 0 0x1.bp4 0x0.0p0 +REG epsg:25835 1 0x1.6p4 -0x1.4p2 +REG epsg:25835 2 0x1.0p5 -0x1.4p2 +REG epsg:25835 3 0x1.6p4 0x1.4p2 +REG epsg:25835 4 0x1.0p5 0x1.4p2 +REG epsg:25836 0 0x1.08p5 0x0.0p0 +REG epsg:25836 1 0x1.cp4 -0x1.4p2 +REG epsg:25836 2 0x1.3p5 -0x1.4p2 +REG epsg:25836 3 0x1.cp4 0x1.4p2 +REG epsg:25836 4 0x1.3p5 0x1.4p2 +REG epsg:25837 0 0x1.38p5 0x0.0p0 +REG epsg:25837 1 0x1.1p5 -0x1.4p2 +REG epsg:25837 2 0x1.6p5 -0x1.4p2 +REG epsg:25837 3 0x1.1p5 0x1.4p2 +REG epsg:25837 4 0x1.6p5 0x1.4p2 +REG epsg:25838 0 0x1.68p5 0x0.0p0 +REG epsg:25838 1 0x1.4p5 -0x1.4p2 +REG epsg:25838 2 0x1.9p5 -0x1.4p2 +REG epsg:25838 3 0x1.4p5 0x1.4p2 +REG epsg:25838 4 0x1.9p5 0x1.4p2 +REG epsg:2584 0 0x1.bp4 0x0.0p0 +REG epsg:2584 1 0x1.6p4 -0x1.4p2 +REG epsg:2584 2 0x1.0p5 -0x1.4p2 +REG epsg:2584 3 0x1.6p4 0x1.4p2 +REG epsg:2584 4 0x1.0p5 0x1.4p2 +REG epsg:2585 0 0x1.ep4 0x0.0p0 +REG epsg:2585 1 0x1.9p4 -0x1.4p2 +REG epsg:2585 2 0x1.18p5 -0x1.4p2 +REG epsg:2585 3 0x1.9p4 0x1.4p2 +REG epsg:2585 4 0x1.18p5 0x1.4p2 +REG epsg:2586 0 0x1.08p5 0x0.0p0 +REG epsg:2586 1 0x1.cp4 -0x1.4p2 +REG epsg:2586 2 0x1.3p5 -0x1.4p2 +REG epsg:2586 3 0x1.cp4 0x1.4p2 +REG epsg:2586 4 0x1.3p5 0x1.4p2 +REG epsg:2587 0 0x1.2p5 0x0.0p0 +REG epsg:2587 1 0x1.fp4 -0x1.4p2 +REG epsg:2587 2 0x1.48p5 -0x1.4p2 +REG epsg:2587 3 0x1.fp4 0x1.4p2 +REG epsg:2587 4 0x1.48p5 0x1.4p2 +REG epsg:2588 0 0x1.38p5 0x0.0p0 +REG epsg:2588 1 0x1.1p5 -0x1.4p2 +REG epsg:2588 2 0x1.6p5 -0x1.4p2 +REG epsg:2588 3 0x1.1p5 0x1.4p2 +REG epsg:2588 4 0x1.6p5 0x1.4p2 +REG epsg:25884 0 0x1.8p4 0x0.0p0 +REG epsg:25884 1 0x1.3p4 -0x1.4p2 +REG epsg:25884 2 0x1.dp4 -0x1.4p2 +REG epsg:25884 3 0x1.3p4 0x1.4p2 +REG epsg:25884 4 0x1.dp4 0x1.4p2 +REG epsg:2589 0 0x1.5p5 0x0.0p0 +REG epsg:2589 1 0x1.28p5 -0x1.4p2 +REG epsg:2589 2 0x1.78p5 -0x1.4p2 +REG epsg:2589 3 0x1.28p5 0x1.4p2 +REG epsg:2589 4 0x1.78p5 0x1.4p2 +REG epsg:2590 0 0x1.68p5 0x0.0p0 +REG epsg:2590 1 0x1.4p5 -0x1.4p2 +REG epsg:2590 2 0x1.9p5 -0x1.4p2 +REG epsg:2590 3 0x1.4p5 0x1.4p2 +REG epsg:2590 4 0x1.9p5 0x1.4p2 +REG epsg:2591 0 0x1.8p5 0x0.0p0 +REG epsg:2591 1 0x1.58p5 -0x1.4p2 +REG epsg:2591 2 0x1.a8p5 -0x1.4p2 +REG epsg:2591 3 0x1.58p5 0x1.4p2 +REG epsg:2591 4 0x1.a8p5 0x1.4p2 +REG epsg:2592 0 0x1.98p5 0x0.0p0 +REG epsg:2592 1 0x1.7p5 -0x1.4p2 +REG epsg:2592 2 0x1.cp5 -0x1.4p2 +REG epsg:2592 3 0x1.7p5 0x1.4p2 +REG epsg:2592 4 0x1.cp5 0x1.4p2 +REG epsg:2593 0 0x1.bp5 0x0.0p0 +REG epsg:2593 1 0x1.88p5 -0x1.4p2 +REG epsg:2593 2 0x1.d8p5 -0x1.4p2 +REG epsg:2593 3 0x1.88p5 0x1.4p2 +REG epsg:2593 4 0x1.d8p5 0x1.4p2 +REG epsg:25932 0 0x1.2p3 -0x1.9p4 +REG epsg:25932 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:25932 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:25932 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:25932 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:2594 0 0x1.c8p5 0x0.0p0 +REG epsg:2594 1 0x1.ap5 -0x1.4p2 +REG epsg:2594 2 0x1.fp5 -0x1.4p2 +REG epsg:2594 3 0x1.ap5 0x1.4p2 +REG epsg:2594 4 0x1.fp5 0x1.4p2 +REG epsg:2595 0 0x1.ep5 0x0.0p0 +REG epsg:2595 1 0x1.b8p5 -0x1.4p2 +REG epsg:2595 2 0x1.04p6 -0x1.4p2 +REG epsg:2595 3 0x1.b8p5 0x1.4p2 +REG epsg:2595 4 0x1.04p6 0x1.4p2 +REG epsg:2596 0 0x1.f8p5 0x0.0p0 +REG epsg:2596 1 0x1.dp5 -0x1.4p2 +REG epsg:2596 2 0x1.1p6 -0x1.4p2 +REG epsg:2596 3 0x1.dp5 0x1.4p2 +REG epsg:2596 4 0x1.1p6 0x1.4p2 +REG epsg:2597 0 0x1.08p6 0x0.0p0 +REG epsg:2597 1 0x1.e8p5 -0x1.4p2 +REG epsg:2597 2 0x1.1cp6 -0x1.4p2 +REG epsg:2597 3 0x1.e8p5 0x1.4p2 +REG epsg:2597 4 0x1.1cp6 0x1.4p2 +REG epsg:2598 0 0x1.14p6 0x0.0p0 +REG epsg:2598 1 0x1.0p6 -0x1.4p2 +REG epsg:2598 2 0x1.28p6 -0x1.4p2 +REG epsg:2598 3 0x1.0p6 0x1.4p2 +REG epsg:2598 4 0x1.28p6 0x1.4p2 +REG epsg:2599 0 0x1.2p6 0x0.0p0 +REG epsg:2599 1 0x1.0cp6 -0x1.4p2 +REG epsg:2599 2 0x1.34p6 -0x1.4p2 +REG epsg:2599 3 0x1.0cp6 0x1.4p2 +REG epsg:2599 4 0x1.34p6 0x1.4p2 +REG epsg:2600 0 0x1.8p4 0x0.0p0 +REG epsg:2600 1 0x1.3p4 -0x1.4p2 +REG epsg:2600 2 0x1.dp4 -0x1.4p2 +REG epsg:2600 3 0x1.3p4 0x1.4p2 +REG epsg:2600 4 0x1.dp4 0x1.4p2 +REG epsg:2601 0 0x1.2cp6 0x0.0p0 +REG epsg:2601 1 0x1.18p6 -0x1.4p2 +REG epsg:2601 2 0x1.4p6 -0x1.4p2 +REG epsg:2601 3 0x1.18p6 0x1.4p2 +REG epsg:2601 4 0x1.4p6 0x1.4p2 +REG epsg:2602 0 0x1.38p6 0x0.0p0 +REG epsg:2602 1 0x1.24p6 -0x1.4p2 +REG epsg:2602 2 0x1.4cp6 -0x1.4p2 +REG epsg:2602 3 0x1.24p6 0x1.4p2 +REG epsg:2602 4 0x1.4cp6 0x1.4p2 +REG epsg:2603 0 0x1.44p6 0x0.0p0 +REG epsg:2603 1 0x1.3p6 -0x1.4p2 +REG epsg:2603 2 0x1.58p6 -0x1.4p2 +REG epsg:2603 3 0x1.3p6 0x1.4p2 +REG epsg:2603 4 0x1.58p6 0x1.4p2 +REG epsg:2604 0 0x1.5p6 0x0.0p0 +REG epsg:2604 1 0x1.3cp6 -0x1.4p2 +REG epsg:2604 2 0x1.64p6 -0x1.4p2 +REG epsg:2604 3 0x1.3cp6 0x1.4p2 +REG epsg:2604 4 0x1.64p6 0x1.4p2 +REG epsg:2605 0 0x1.5cp6 0x0.0p0 +REG epsg:2605 1 0x1.48p6 -0x1.4p2 +REG epsg:2605 2 0x1.7p6 -0x1.4p2 +REG epsg:2605 3 0x1.48p6 0x1.4p2 +REG epsg:2605 4 0x1.7p6 0x1.4p2 +REG epsg:2606 0 0x1.68p6 0x0.0p0 +REG epsg:2606 1 0x1.54p6 -0x1.4p2 +REG epsg:2606 2 0x1.7cp6 -0x1.4p2 +REG epsg:2606 3 0x1.54p6 0x1.4p2 +REG epsg:2606 4 0x1.7cp6 0x1.4p2 +REG epsg:2607 0 0x1.74p6 0x0.0p0 +REG epsg:2607 1 0x1.6p6 -0x1.4p2 +REG epsg:2607 2 0x1.88p6 -0x1.4p2 +REG epsg:2607 3 0x1.6p6 0x1.4p2 +REG epsg:2607 4 0x1.88p6 0x1.4p2 +REG epsg:2608 0 0x1.8p6 0x0.0p0 +REG epsg:2608 1 0x1.6cp6 -0x1.4p2 +REG epsg:2608 2 0x1.94p6 -0x1.4p2 +REG epsg:2608 3 0x1.6cp6 0x1.4p2 +REG epsg:2608 4 0x1.94p6 0x1.4p2 +REG epsg:2609 0 0x1.8cp6 0x0.0p0 +REG epsg:2609 1 0x1.78p6 -0x1.4p2 +REG epsg:2609 2 0x1.ap6 -0x1.4p2 +REG epsg:2609 3 0x1.78p6 0x1.4p2 +REG epsg:2609 4 0x1.ap6 0x1.4p2 +REG epsg:2610 0 0x1.98p6 0x0.0p0 +REG epsg:2610 1 0x1.84p6 -0x1.4p2 +REG epsg:2610 2 0x1.acp6 -0x1.4p2 +REG epsg:2610 3 0x1.84p6 0x1.4p2 +REG epsg:2610 4 0x1.acp6 0x1.4p2 +REG epsg:2611 0 0x1.a4p6 0x0.0p0 +REG epsg:2611 1 0x1.9p6 -0x1.4p2 +REG epsg:2611 2 0x1.b8p6 -0x1.4p2 +REG epsg:2611 3 0x1.9p6 0x1.4p2 +REG epsg:2611 4 0x1.b8p6 0x1.4p2 +REG epsg:2612 0 0x1.bp6 0x0.0p0 +REG epsg:2612 1 0x1.9cp6 -0x1.4p2 +REG epsg:2612 2 0x1.c4p6 -0x1.4p2 +REG epsg:2612 3 0x1.9cp6 0x1.4p2 +REG epsg:2612 4 0x1.c4p6 0x1.4p2 +REG epsg:2613 0 0x1.bcp6 0x0.0p0 +REG epsg:2613 1 0x1.a8p6 -0x1.4p2 +REG epsg:2613 2 0x1.dp6 -0x1.4p2 +REG epsg:2613 3 0x1.a8p6 0x1.4p2 +REG epsg:2613 4 0x1.dp6 0x1.4p2 +REG epsg:2614 0 0x1.c8p6 0x0.0p0 +REG epsg:2614 1 0x1.b4p6 -0x1.4p2 +REG epsg:2614 2 0x1.dcp6 -0x1.4p2 +REG epsg:2614 3 0x1.b4p6 0x1.4p2 +REG epsg:2614 4 0x1.dcp6 0x1.4p2 +REG epsg:2615 0 0x1.d4p6 0x0.0p0 +REG epsg:2615 1 0x1.cp6 -0x1.4p2 +REG epsg:2615 2 0x1.e8p6 -0x1.4p2 +REG epsg:2615 3 0x1.cp6 0x1.4p2 +REG epsg:2615 4 0x1.e8p6 0x1.4p2 +REG epsg:2616 0 0x1.ep6 0x0.0p0 +REG epsg:2616 1 0x1.ccp6 -0x1.4p2 +REG epsg:2616 2 0x1.f4p6 -0x1.4p2 +REG epsg:2616 3 0x1.ccp6 0x1.4p2 +REG epsg:2616 4 0x1.f4p6 0x1.4p2 +REG epsg:2617 0 0x1.ecp6 0x0.0p0 +REG epsg:2617 1 0x1.d8p6 -0x1.4p2 +REG epsg:2617 2 0x1.0p7 -0x1.4p2 +REG epsg:2617 3 0x1.d8p6 0x1.4p2 +REG epsg:2617 4 0x1.0p7 0x1.4p2 +REG epsg:2618 0 0x1.f8p6 0x0.0p0 +REG epsg:2618 1 0x1.e4p6 -0x1.4p2 +REG epsg:2618 2 0x1.06p7 -0x1.4p2 +REG epsg:2618 3 0x1.e4p6 0x1.4p2 +REG epsg:2618 4 0x1.06p7 0x1.4p2 +REG epsg:2619 0 0x1.02p7 0x0.0p0 +REG epsg:2619 1 0x1.fp6 -0x1.4p2 +REG epsg:2619 2 0x1.0cp7 -0x1.4p2 +REG epsg:2619 3 0x1.fp6 0x1.4p2 +REG epsg:2619 4 0x1.0cp7 0x1.4p2 +REG epsg:26191 0 -0x1.599999999999ap2 0x1.0a66666666666p5 +REG epsg:26191 1 -0x1.6c3b4ece0123bp3 0x1.c4cccccccccccp4 +REG epsg:26191 2 0x1.2a1b534678a1p-1 0x1.c4cccccccccccp4 +REG epsg:26191 3 -0x1.6c3b4ece0123bp3 0x1.3266666666666p5 +REG epsg:26191 4 0x1.2a1b534678a1p-1 0x1.3266666666666p5 +REG epsg:26192 0 -0x1.599999999999ap2 0x1.db33333333333p4 +REG epsg:26192 1 -0x1.64ff6ec44c13ap3 0x1.8b33333333333p4 +REG epsg:26192 2 0x1.6cbaa5564f4p-2 0x1.8b33333333333p4 +REG epsg:26192 3 -0x1.64ff6ec44c13ap3 0x1.159999999999ap5 +REG epsg:26192 4 0x1.6cbaa5564f4p-2 0x1.159999999999ap5 +REG epsg:26193 0 -0x1.599999999999ap2 0x1.a19999999999ap4 +REG epsg:26193 1 -0x1.5ef7df1d0876ap3 0x1.519999999999ap4 +REG epsg:26193 2 0x1.579160dbb73ep-3 0x1.519999999999ap4 +REG epsg:26193 3 -0x1.5ef7df1d0876ap3 0x1.f19999999999ap4 +REG epsg:26193 4 0x1.579160dbb73ep-3 0x1.f19999999999ap4 +REG epsg:26194 0 -0x1.599999999999ap2 0x1.a19999999999ap4 +REG epsg:26194 1 -0x1.5ef7df1d0876ap3 0x1.519999999999ap4 +REG epsg:26194 2 0x1.579160dbb73ep-3 0x1.519999999999ap4 +REG epsg:26194 3 -0x1.5ef7df1d0876ap3 0x1.f19999999999ap4 +REG epsg:26194 4 0x1.579160dbb73ep-3 0x1.f19999999999ap4 +REG epsg:26195 0 -0x1.599999999999ap2 0x1.68p4 +REG epsg:26195 1 -0x1.59fb95a35d02ap3 0x1.18p4 +REG epsg:26195 2 0x1.87f0270da4p-7 0x1.18p4 +REG epsg:26195 3 -0x1.59fb95a35d02ap3 0x1.b8p4 +REG epsg:26195 4 0x1.87f0270da4p-7 0x1.b8p4 +REG epsg:2620 0 0x1.08p7 0x0.0p0 +REG epsg:2620 1 0x1.fcp6 -0x1.4p2 +REG epsg:2620 2 0x1.12p7 -0x1.4p2 +REG epsg:2620 3 0x1.fcp6 0x1.4p2 +REG epsg:2620 4 0x1.12p7 0x1.4p2 +REG epsg:2621 0 0x1.0ep7 0x0.0p0 +REG epsg:2621 1 0x1.04p7 -0x1.4p2 +REG epsg:2621 2 0x1.18p7 -0x1.4p2 +REG epsg:2621 3 0x1.04p7 0x1.4p2 +REG epsg:2621 4 0x1.18p7 0x1.4p2 +REG epsg:2622 0 0x1.14p7 0x0.0p0 +REG epsg:2622 1 0x1.0ap7 -0x1.4p2 +REG epsg:2622 2 0x1.1ep7 -0x1.4p2 +REG epsg:2622 3 0x1.0ap7 0x1.4p2 +REG epsg:2622 4 0x1.1ep7 0x1.4p2 +REG epsg:2623 0 0x1.1ap7 0x0.0p0 +REG epsg:2623 1 0x1.1p7 -0x1.4p2 +REG epsg:2623 2 0x1.24p7 -0x1.4p2 +REG epsg:2623 3 0x1.1p7 0x1.4p2 +REG epsg:2623 4 0x1.24p7 0x1.4p2 +REG epsg:26237 0 0x1.38p5 0x0.0p0 +REG epsg:26237 1 0x1.1p5 -0x1.4p2 +REG epsg:26237 2 0x1.6p5 -0x1.4p2 +REG epsg:26237 3 0x1.1p5 0x1.4p2 +REG epsg:26237 4 0x1.6p5 0x1.4p2 +REG epsg:2624 0 0x1.2p7 0x0.0p0 +REG epsg:2624 1 0x1.16p7 -0x1.4p2 +REG epsg:2624 2 0x1.2ap7 -0x1.4p2 +REG epsg:2624 3 0x1.16p7 0x1.4p2 +REG epsg:2624 4 0x1.2ap7 0x1.4p2 +REG epsg:2625 0 0x1.26p7 0x0.0p0 +REG epsg:2625 1 0x1.1cp7 -0x1.4p2 +REG epsg:2625 2 0x1.3p7 -0x1.4p2 +REG epsg:2625 3 0x1.1cp7 0x1.4p2 +REG epsg:2625 4 0x1.3p7 0x1.4p2 +REG epsg:2626 0 0x1.2cp7 0x0.0p0 +REG epsg:2626 1 0x1.22p7 -0x1.4p2 +REG epsg:2626 2 0x1.36p7 -0x1.4p2 +REG epsg:2626 3 0x1.22p7 0x1.4p2 +REG epsg:2626 4 0x1.36p7 0x1.4p2 +REG epsg:2627 0 0x1.32p7 0x0.0p0 +REG epsg:2627 1 0x1.28p7 -0x1.4p2 +REG epsg:2627 2 0x1.3cp7 -0x1.4p2 +REG epsg:2627 3 0x1.28p7 0x1.4p2 +REG epsg:2627 4 0x1.3cp7 0x1.4p2 +REG epsg:2628 0 0x1.38p7 0x0.0p0 +REG epsg:2628 1 0x1.2ep7 -0x1.4p2 +REG epsg:2628 2 0x1.42p7 -0x1.4p2 +REG epsg:2628 3 0x1.2ep7 0x1.4p2 +REG epsg:2628 4 0x1.42p7 0x1.4p2 +REG epsg:2629 0 0x1.3ep7 0x0.0p0 +REG epsg:2629 1 0x1.34p7 -0x1.4p2 +REG epsg:2629 2 0x1.48p7 -0x1.4p2 +REG epsg:2629 3 0x1.34p7 0x1.4p2 +REG epsg:2629 4 0x1.48p7 0x1.4p2 +REG epsg:2630 0 0x1.44p7 0x0.0p0 +REG epsg:2630 1 0x1.3ap7 -0x1.4p2 +REG epsg:2630 2 0x1.4ep7 -0x1.4p2 +REG epsg:2630 3 0x1.3ap7 0x1.4p2 +REG epsg:2630 4 0x1.4ep7 0x1.4p2 +REG epsg:2631 0 0x1.4ap7 0x0.0p0 +REG epsg:2631 1 0x1.4p7 -0x1.4p2 +REG epsg:2631 2 0x1.54p7 -0x1.4p2 +REG epsg:2631 3 0x1.4p7 0x1.4p2 +REG epsg:2631 4 0x1.54p7 0x1.4p2 +REG epsg:2632 0 0x1.5p7 0x0.0p0 +REG epsg:2632 1 0x1.46p7 -0x1.4p2 +REG epsg:2632 2 0x1.5ap7 -0x1.4p2 +REG epsg:2632 3 0x1.46p7 0x1.4p2 +REG epsg:2632 4 0x1.5ap7 0x1.4p2 +REG epsg:2633 0 0x1.56p7 0x0.0p0 +REG epsg:2633 1 0x1.4cp7 -0x1.4p2 +REG epsg:2633 2 0x1.6p7 -0x1.4p2 +REG epsg:2633 3 0x1.4cp7 0x1.4p2 +REG epsg:2633 4 0x1.6p7 0x1.4p2 +REG epsg:26331 0 0x1.8p1 0x0.0p0 +REG epsg:26331 1 -0x1.0p1 -0x1.4p2 +REG epsg:26331 2 0x1.0p3 -0x1.4p2 +REG epsg:26331 3 -0x1.0p1 0x1.4p2 +REG epsg:26331 4 0x1.0p3 0x1.4p2 +REG epsg:26332 0 0x1.2p3 0x0.0p0 +REG epsg:26332 1 0x1.0p2 -0x1.4p2 +REG epsg:26332 2 0x1.cp3 -0x1.4p2 +REG epsg:26332 3 0x1.0p2 0x1.4p2 +REG epsg:26332 4 0x1.cp3 0x1.4p2 +REG epsg:2634 0 0x1.5cp7 0x0.0p0 +REG epsg:2634 1 0x1.52p7 -0x1.4p2 +REG epsg:2634 2 0x1.66p7 -0x1.4p2 +REG epsg:2634 3 0x1.52p7 0x1.4p2 +REG epsg:2634 4 0x1.66p7 0x1.4p2 +REG epsg:2635 0 0x1.62p7 0x0.0p0 +REG epsg:2635 1 0x1.58p7 -0x1.4p2 +REG epsg:2635 2 -0x1.64p7 -0x1.4p2 +REG epsg:2635 3 0x1.58p7 0x1.4p2 +REG epsg:2635 4 -0x1.64p7 0x1.4p2 +REG epsg:2636 0 -0x1.68p7 0x0.0p0 +REG epsg:2636 1 0x1.5ep7 -0x1.4p2 +REG epsg:2636 2 -0x1.5ep7 -0x1.4p2 +REG epsg:2636 3 0x1.5ep7 0x1.4p2 +REG epsg:2636 4 -0x1.5ep7 0x1.4p2 +REG epsg:2637 0 -0x1.62p7 0x0.0p0 +REG epsg:2637 1 0x1.64p7 -0x1.4p2 +REG epsg:2637 2 -0x1.58p7 -0x1.4p2 +REG epsg:2637 3 0x1.64p7 0x1.4p2 +REG epsg:2637 4 -0x1.58p7 0x1.4p2 +REG epsg:2638 0 -0x1.5cp7 0x0.0p0 +REG epsg:2638 1 -0x1.66p7 -0x1.4p2 +REG epsg:2638 2 -0x1.52p7 -0x1.4p2 +REG epsg:2638 3 -0x1.66p7 0x1.4p2 +REG epsg:2638 4 -0x1.52p7 0x1.4p2 +REG epsg:2639 0 -0x1.56p7 0x0.0p0 +REG epsg:2639 1 -0x1.6p7 -0x1.4p2 +REG epsg:2639 2 -0x1.4cp7 -0x1.4p2 +REG epsg:2639 3 -0x1.6p7 0x1.4p2 +REG epsg:2639 4 -0x1.4cp7 0x1.4p2 +REG epsg:26391 0 0x1.2p2 0x1.0p2 +REG epsg:26391 1 -0x1.06405283fced8p-1 -0x1.0p0 +REG epsg:26391 2 0x1.306405283fceep3 -0x1.0p0 +REG epsg:26391 3 -0x1.06405283fced8p-1 0x1.2p3 +REG epsg:26391 4 0x1.306405283fceep3 0x1.2p3 +REG epsg:26392 0 0x1.1p3 0x1.0p2 +REG epsg:26392 1 0x1.be6feb5f00c4ap1 -0x1.0p0 +REG epsg:26392 2 0x1.b06405283fceep3 -0x1.0p0 +REG epsg:26392 3 0x1.be6feb5f00c4ap1 0x1.2p3 +REG epsg:26392 4 0x1.b06405283fceep3 0x1.2p3 +REG epsg:26393 0 0x1.9p3 0x1.0p2 +REG epsg:26393 1 0x1.df37f5af80625p2 -0x1.0p0 +REG epsg:26393 2 0x1.183202941fe77p4 -0x1.0p0 +REG epsg:26393 3 0x1.df37f5af80625p2 0x1.2p3 +REG epsg:26393 4 0x1.183202941fe77p4 0x1.2p3 +REG epsg:2640 0 -0x1.5p7 0x0.0p0 +REG epsg:2640 1 -0x1.5ap7 -0x1.4p2 +REG epsg:2640 2 -0x1.46p7 -0x1.4p2 +REG epsg:2640 3 -0x1.5ap7 0x1.4p2 +REG epsg:2640 4 -0x1.46p7 0x1.4p2 +REG epsg:2641 0 0x1.5p4 0x0.0p0 +REG epsg:2641 1 0x1.0p4 -0x1.4p2 +REG epsg:2641 2 0x1.ap4 -0x1.4p2 +REG epsg:2641 3 0x1.0p4 0x1.4p2 +REG epsg:2641 4 0x1.ap4 0x1.4p2 +REG epsg:2642 0 0x1.8p4 0x0.0p0 +REG epsg:2642 1 0x1.3p4 -0x1.4p2 +REG epsg:2642 2 0x1.dp4 -0x1.4p2 +REG epsg:2642 3 0x1.3p4 0x1.4p2 +REG epsg:2642 4 0x1.dp4 0x1.4p2 +REG epsg:2643 0 0x1.bp4 0x0.0p0 +REG epsg:2643 1 0x1.6p4 -0x1.4p2 +REG epsg:2643 2 0x1.0p5 -0x1.4p2 +REG epsg:2643 3 0x1.6p4 0x1.4p2 +REG epsg:2643 4 0x1.0p5 0x1.4p2 +REG epsg:26432 0 0x1.2p3 -0x1.9p4 +REG epsg:26432 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:26432 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:26432 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:26432 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:2644 0 0x1.ep4 0x0.0p0 +REG epsg:2644 1 0x1.9p4 -0x1.4p2 +REG epsg:2644 2 0x1.18p5 -0x1.4p2 +REG epsg:2644 3 0x1.9p4 0x1.4p2 +REG epsg:2644 4 0x1.18p5 0x1.4p2 +REG epsg:2645 0 0x1.08p5 0x0.0p0 +REG epsg:2645 1 0x1.cp4 -0x1.4p2 +REG epsg:2645 2 0x1.3p5 -0x1.4p2 +REG epsg:2645 3 0x1.cp4 0x1.4p2 +REG epsg:2645 4 0x1.3p5 0x1.4p2 +REG epsg:2646 0 0x1.2p5 0x0.0p0 +REG epsg:2646 1 0x1.fp4 -0x1.4p2 +REG epsg:2646 2 0x1.48p5 -0x1.4p2 +REG epsg:2646 3 0x1.fp4 0x1.4p2 +REG epsg:2646 4 0x1.48p5 0x1.4p2 +REG epsg:2647 0 0x1.38p5 0x0.0p0 +REG epsg:2647 1 0x1.1p5 -0x1.4p2 +REG epsg:2647 2 0x1.6p5 -0x1.4p2 +REG epsg:2647 3 0x1.1p5 0x1.4p2 +REG epsg:2647 4 0x1.6p5 0x1.4p2 +REG epsg:2648 0 0x1.5p5 0x0.0p0 +REG epsg:2648 1 0x1.28p5 -0x1.4p2 +REG epsg:2648 2 0x1.78p5 -0x1.4p2 +REG epsg:2648 3 0x1.28p5 0x1.4p2 +REG epsg:2648 4 0x1.78p5 0x1.4p2 +REG epsg:2649 0 0x1.68p5 0x0.0p0 +REG epsg:2649 1 0x1.4p5 -0x1.4p2 +REG epsg:2649 2 0x1.9p5 -0x1.4p2 +REG epsg:2649 3 0x1.4p5 0x1.4p2 +REG epsg:2649 4 0x1.9p5 0x1.4p2 +REG epsg:2650 0 0x1.8p5 0x0.0p0 +REG epsg:2650 1 0x1.58p5 -0x1.4p2 +REG epsg:2650 2 0x1.a8p5 -0x1.4p2 +REG epsg:2650 3 0x1.58p5 0x1.4p2 +REG epsg:2650 4 0x1.a8p5 0x1.4p2 +REG epsg:2651 0 0x1.98p5 0x0.0p0 +REG epsg:2651 1 0x1.7p5 -0x1.4p2 +REG epsg:2651 2 0x1.cp5 -0x1.4p2 +REG epsg:2651 3 0x1.7p5 0x1.4p2 +REG epsg:2651 4 0x1.cp5 0x1.4p2 +REG epsg:2652 0 0x1.bp5 0x0.0p0 +REG epsg:2652 1 0x1.88p5 -0x1.4p2 +REG epsg:2652 2 0x1.d8p5 -0x1.4p2 +REG epsg:2652 3 0x1.88p5 0x1.4p2 +REG epsg:2652 4 0x1.d8p5 0x1.4p2 +REG epsg:2653 0 0x1.c8p5 0x0.0p0 +REG epsg:2653 1 0x1.ap5 -0x1.4p2 +REG epsg:2653 2 0x1.fp5 -0x1.4p2 +REG epsg:2653 3 0x1.ap5 0x1.4p2 +REG epsg:2653 4 0x1.fp5 0x1.4p2 +REG epsg:2654 0 0x1.ep5 0x0.0p0 +REG epsg:2654 1 0x1.b8p5 -0x1.4p2 +REG epsg:2654 2 0x1.04p6 -0x1.4p2 +REG epsg:2654 3 0x1.b8p5 0x1.4p2 +REG epsg:2654 4 0x1.04p6 0x1.4p2 +REG epsg:2655 0 0x1.f8p5 0x0.0p0 +REG epsg:2655 1 0x1.dp5 -0x1.4p2 +REG epsg:2655 2 0x1.1p6 -0x1.4p2 +REG epsg:2655 3 0x1.dp5 0x1.4p2 +REG epsg:2655 4 0x1.1p6 0x1.4p2 +REG epsg:2656 0 0x1.08p6 0x0.0p0 +REG epsg:2656 1 0x1.e8p5 -0x1.4p2 +REG epsg:2656 2 0x1.1cp6 -0x1.4p2 +REG epsg:2656 3 0x1.e8p5 0x1.4p2 +REG epsg:2656 4 0x1.1cp6 0x1.4p2 +REG epsg:2657 0 0x1.14p6 0x0.0p0 +REG epsg:2657 1 0x1.0p6 -0x1.4p2 +REG epsg:2657 2 0x1.28p6 -0x1.4p2 +REG epsg:2657 3 0x1.0p6 0x1.4p2 +REG epsg:2657 4 0x1.28p6 0x1.4p2 +REG epsg:2658 0 0x1.2p6 0x0.0p0 +REG epsg:2658 1 0x1.0cp6 -0x1.4p2 +REG epsg:2658 2 0x1.34p6 -0x1.4p2 +REG epsg:2658 3 0x1.0cp6 0x1.4p2 +REG epsg:2658 4 0x1.34p6 0x1.4p2 +REG epsg:2659 0 0x1.2cp6 0x0.0p0 +REG epsg:2659 1 0x1.18p6 -0x1.4p2 +REG epsg:2659 2 0x1.4p6 -0x1.4p2 +REG epsg:2659 3 0x1.18p6 0x1.4p2 +REG epsg:2659 4 0x1.4p6 0x1.4p2 +REG epsg:26591 0 -0x1.b9e60f04c7564p1 0x0.0p0 +REG epsg:26591 1 -0x1.0e7983c131d59p3 -0x1.4p2 +REG epsg:26591 2 0x1.8c33e1f671538p0 -0x1.4p2 +REG epsg:26591 3 -0x1.0e7983c131d59p3 0x1.4p2 +REG epsg:26591 4 0x1.8c33e1f671538p0 0x1.4p2 +REG epsg:26592 0 0x1.4619f0fb38a86p1 0x0.0p0 +REG epsg:26592 1 -0x1.39e60f04c757ap1 -0x1.4p2 +REG epsg:26592 2 0x1.e30cf87d9c543p2 -0x1.4p2 +REG epsg:26592 3 -0x1.39e60f04c757ap1 0x1.4p2 +REG epsg:26592 4 0x1.e30cf87d9c543p2 0x1.4p2 +REG epsg:2660 0 0x1.38p6 0x0.0p0 +REG epsg:2660 1 0x1.24p6 -0x1.4p2 +REG epsg:2660 2 0x1.4cp6 -0x1.4p2 +REG epsg:2660 3 0x1.24p6 0x1.4p2 +REG epsg:2660 4 0x1.4cp6 0x1.4p2 +REG epsg:2661 0 0x1.44p6 0x0.0p0 +REG epsg:2661 1 0x1.3p6 -0x1.4p2 +REG epsg:2661 2 0x1.58p6 -0x1.4p2 +REG epsg:2661 3 0x1.3p6 0x1.4p2 +REG epsg:2661 4 0x1.58p6 0x1.4p2 +REG epsg:2662 0 0x1.5p6 0x0.0p0 +REG epsg:2662 1 0x1.3cp6 -0x1.4p2 +REG epsg:2662 2 0x1.64p6 -0x1.4p2 +REG epsg:2662 3 0x1.3cp6 0x1.4p2 +REG epsg:2662 4 0x1.64p6 0x1.4p2 +REG epsg:2663 0 0x1.5cp6 0x0.0p0 +REG epsg:2663 1 0x1.48p6 -0x1.4p2 +REG epsg:2663 2 0x1.7p6 -0x1.4p2 +REG epsg:2663 3 0x1.48p6 0x1.4p2 +REG epsg:2663 4 0x1.7p6 0x1.4p2 +REG epsg:26632 0 0x1.2p3 0x0.0p0 +REG epsg:26632 1 0x1.0p2 -0x1.4p2 +REG epsg:26632 2 0x1.cp3 -0x1.4p2 +REG epsg:26632 3 0x1.0p2 0x1.4p2 +REG epsg:26632 4 0x1.cp3 0x1.4p2 +REG epsg:2664 0 0x1.68p6 0x0.0p0 +REG epsg:2664 1 0x1.54p6 -0x1.4p2 +REG epsg:2664 2 0x1.7cp6 -0x1.4p2 +REG epsg:2664 3 0x1.54p6 0x1.4p2 +REG epsg:2664 4 0x1.7cp6 0x1.4p2 +REG epsg:2665 0 0x1.74p6 0x0.0p0 +REG epsg:2665 1 0x1.6p6 -0x1.4p2 +REG epsg:2665 2 0x1.88p6 -0x1.4p2 +REG epsg:2665 3 0x1.6p6 0x1.4p2 +REG epsg:2665 4 0x1.88p6 0x1.4p2 +REG epsg:2666 0 0x1.8p6 0x0.0p0 +REG epsg:2666 1 0x1.6cp6 -0x1.4p2 +REG epsg:2666 2 0x1.94p6 -0x1.4p2 +REG epsg:2666 3 0x1.6cp6 0x1.4p2 +REG epsg:2666 4 0x1.94p6 0x1.4p2 +REG epsg:2667 0 0x1.8cp6 0x0.0p0 +REG epsg:2667 1 0x1.78p6 -0x1.4p2 +REG epsg:2667 2 0x1.ap6 -0x1.4p2 +REG epsg:2667 3 0x1.78p6 0x1.4p2 +REG epsg:2667 4 0x1.ap6 0x1.4p2 +REG epsg:2668 0 0x1.98p6 0x0.0p0 +REG epsg:2668 1 0x1.84p6 -0x1.4p2 +REG epsg:2668 2 0x1.acp6 -0x1.4p2 +REG epsg:2668 3 0x1.84p6 0x1.4p2 +REG epsg:2668 4 0x1.acp6 0x1.4p2 +REG epsg:2669 0 0x1.a4p6 0x0.0p0 +REG epsg:2669 1 0x1.9p6 -0x1.4p2 +REG epsg:2669 2 0x1.b8p6 -0x1.4p2 +REG epsg:2669 3 0x1.9p6 0x1.4p2 +REG epsg:2669 4 0x1.b8p6 0x1.4p2 +REG epsg:26692 0 0x1.2p3 -0x1.9p4 +REG epsg:26692 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:26692 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:26692 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:26692 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:2670 0 0x1.bp6 0x0.0p0 +REG epsg:2670 1 0x1.9cp6 -0x1.4p2 +REG epsg:2670 2 0x1.c4p6 -0x1.4p2 +REG epsg:2670 3 0x1.9cp6 0x1.4p2 +REG epsg:2670 4 0x1.c4p6 0x1.4p2 +REG epsg:26701 0 -0x1.62p7 0x1.68p5 +REG epsg:26701 1 0x1.5fdb9cfff07aap7 0x1.4p5 +REG epsg:26701 2 -0x1.53db9cfff07aap7 0x1.4p5 +REG epsg:26701 3 0x1.5fdb9cfff07aap7 0x1.9p5 +REG epsg:26701 4 -0x1.53db9cfff07aap7 0x1.9p5 +REG epsg:26702 0 -0x1.56p7 0x1.68p5 +REG epsg:26702 1 -0x1.642463000f856p7 0x1.4p5 +REG epsg:26702 2 -0x1.47db9cfff07aap7 0x1.4p5 +REG epsg:26702 3 -0x1.642463000f856p7 0x1.9p5 +REG epsg:26702 4 -0x1.47db9cfff07aap7 0x1.9p5 +REG epsg:26703 0 -0x1.4ap7 0x1.68p5 +REG epsg:26703 1 -0x1.582463000f856p7 0x1.4p5 +REG epsg:26703 2 -0x1.3bdb9cfff07aap7 0x1.4p5 +REG epsg:26703 3 -0x1.582463000f856p7 0x1.9p5 +REG epsg:26703 4 -0x1.3bdb9cfff07aap7 0x1.9p5 +REG epsg:26704 0 -0x1.3ep7 0x1.68p5 +REG epsg:26704 1 -0x1.4c2463000f856p7 0x1.4p5 +REG epsg:26704 2 -0x1.2fdb9cfff07aap7 0x1.4p5 +REG epsg:26704 3 -0x1.4c2463000f856p7 0x1.9p5 +REG epsg:26704 4 -0x1.2fdb9cfff07aap7 0x1.9p5 +REG epsg:26705 0 -0x1.32p7 0x1.68p5 +REG epsg:26705 1 -0x1.402463000f856p7 0x1.4p5 +REG epsg:26705 2 -0x1.23db9cfff07aap7 0x1.4p5 +REG epsg:26705 3 -0x1.402463000f856p7 0x1.9p5 +REG epsg:26705 4 -0x1.23db9cfff07aap7 0x1.9p5 +REG epsg:26706 0 -0x1.26p7 0x1.68p5 +REG epsg:26706 1 -0x1.342463000f856p7 0x1.4p5 +REG epsg:26706 2 -0x1.17db9cfff07aap7 0x1.4p5 +REG epsg:26706 3 -0x1.342463000f856p7 0x1.9p5 +REG epsg:26706 4 -0x1.17db9cfff07aap7 0x1.9p5 +REG epsg:26707 0 -0x1.1ap7 0x1.68p5 +REG epsg:26707 1 -0x1.282463000f856p7 0x1.4p5 +REG epsg:26707 2 -0x1.0bdb9cfff07aap7 0x1.4p5 +REG epsg:26707 3 -0x1.282463000f856p7 0x1.9p5 +REG epsg:26707 4 -0x1.0bdb9cfff07aap7 0x1.9p5 +REG epsg:26708 0 -0x1.0ep7 0x1.68p5 +REG epsg:26708 1 -0x1.1c2463000f856p7 0x1.4p5 +REG epsg:26708 2 -0x1.ffb739ffe0f54p6 0x1.4p5 +REG epsg:26708 3 -0x1.1c2463000f856p7 0x1.9p5 +REG epsg:26708 4 -0x1.ffb739ffe0f54p6 0x1.9p5 +REG epsg:26709 0 -0x1.02p7 0x1.68p5 +REG epsg:26709 1 -0x1.102463000f856p7 0x1.4p5 +REG epsg:26709 2 -0x1.e7b739ffe0f54p6 0x1.4p5 +REG epsg:26709 3 -0x1.102463000f856p7 0x1.9p5 +REG epsg:26709 4 -0x1.e7b739ffe0f54p6 0x1.9p5 +REG epsg:2671 0 0x1.bcp6 0x0.0p0 +REG epsg:2671 1 0x1.a8p6 -0x1.4p2 +REG epsg:2671 2 0x1.dp6 -0x1.4p2 +REG epsg:2671 3 0x1.a8p6 0x1.4p2 +REG epsg:2671 4 0x1.dp6 0x1.4p2 +REG epsg:26710 0 -0x1.ecp6 0x1.68p5 +REG epsg:26710 1 -0x1.042463000f856p7 0x1.4p5 +REG epsg:26710 2 -0x1.cfb739ffe0f54p6 0x1.4p5 +REG epsg:26710 3 -0x1.042463000f856p7 0x1.9p5 +REG epsg:26710 4 -0x1.cfb739ffe0f54p6 0x1.9p5 +REG epsg:26711 0 -0x1.d4p6 0x1.68p5 +REG epsg:26711 1 -0x1.f048c6001f0acp6 0x1.4p5 +REG epsg:26711 2 -0x1.b7b739ffe0f54p6 0x1.4p5 +REG epsg:26711 3 -0x1.f048c6001f0acp6 0x1.9p5 +REG epsg:26711 4 -0x1.b7b739ffe0f54p6 0x1.9p5 +REG epsg:26712 0 -0x1.bcp6 0x1.68p5 +REG epsg:26712 1 -0x1.d848c6001f0acp6 0x1.4p5 +REG epsg:26712 2 -0x1.9fb739ffe0f54p6 0x1.4p5 +REG epsg:26712 3 -0x1.d848c6001f0acp6 0x1.9p5 +REG epsg:26712 4 -0x1.9fb739ffe0f54p6 0x1.9p5 +REG epsg:26713 0 -0x1.a4p6 0x1.68p5 +REG epsg:26713 1 -0x1.c048c6001f0acp6 0x1.4p5 +REG epsg:26713 2 -0x1.87b739ffe0f54p6 0x1.4p5 +REG epsg:26713 3 -0x1.c048c6001f0acp6 0x1.9p5 +REG epsg:26713 4 -0x1.87b739ffe0f54p6 0x1.9p5 +REG epsg:26714 0 -0x1.8cp6 0x1.68p5 +REG epsg:26714 1 -0x1.a848c6001f0acp6 0x1.4p5 +REG epsg:26714 2 -0x1.6fb739ffe0f54p6 0x1.4p5 +REG epsg:26714 3 -0x1.a848c6001f0acp6 0x1.9p5 +REG epsg:26714 4 -0x1.6fb739ffe0f54p6 0x1.9p5 +REG epsg:26715 0 -0x1.74p6 0x1.68p5 +REG epsg:26715 1 -0x1.9048c6001f0acp6 0x1.4p5 +REG epsg:26715 2 -0x1.57b739ffe0f54p6 0x1.4p5 +REG epsg:26715 3 -0x1.9048c6001f0acp6 0x1.9p5 +REG epsg:26715 4 -0x1.57b739ffe0f54p6 0x1.9p5 +REG epsg:26716 0 -0x1.5cp6 0x1.68p5 +REG epsg:26716 1 -0x1.7848c6001f0acp6 0x1.4p5 +REG epsg:26716 2 -0x1.3fb739ffe0f54p6 0x1.4p5 +REG epsg:26716 3 -0x1.7848c6001f0acp6 0x1.9p5 +REG epsg:26716 4 -0x1.3fb739ffe0f54p6 0x1.9p5 +REG epsg:26717 0 -0x1.44p6 0x1.68p5 +REG epsg:26717 1 -0x1.6048c6001f0acp6 0x1.4p5 +REG epsg:26717 2 -0x1.27b739ffe0f54p6 0x1.4p5 +REG epsg:26717 3 -0x1.6048c6001f0acp6 0x1.9p5 +REG epsg:26717 4 -0x1.27b739ffe0f54p6 0x1.9p5 +REG epsg:26718 0 -0x1.2cp6 0x1.68p5 +REG epsg:26718 1 -0x1.4848c6001f0acp6 0x1.4p5 +REG epsg:26718 2 -0x1.0fb739ffe0f54p6 0x1.4p5 +REG epsg:26718 3 -0x1.4848c6001f0acp6 0x1.9p5 +REG epsg:26718 4 -0x1.0fb739ffe0f54p6 0x1.9p5 +REG epsg:26719 0 -0x1.14p6 0x1.68p5 +REG epsg:26719 1 -0x1.3048c6001f0acp6 0x1.4p5 +REG epsg:26719 2 -0x1.ef6e73ffc1ea8p5 0x1.4p5 +REG epsg:26719 3 -0x1.3048c6001f0acp6 0x1.9p5 +REG epsg:26719 4 -0x1.ef6e73ffc1ea8p5 0x1.9p5 +REG epsg:2672 0 0x1.c8p6 0x0.0p0 +REG epsg:2672 1 0x1.b4p6 -0x1.4p2 +REG epsg:2672 2 0x1.dcp6 -0x1.4p2 +REG epsg:2672 3 0x1.b4p6 0x1.4p2 +REG epsg:2672 4 0x1.dcp6 0x1.4p2 +REG epsg:26720 0 -0x1.f8p5 0x1.68p5 +REG epsg:26720 1 -0x1.1848c6001f0acp6 0x1.4p5 +REG epsg:26720 2 -0x1.bf6e73ffc1ea8p5 0x1.4p5 +REG epsg:26720 3 -0x1.1848c6001f0acp6 0x1.9p5 +REG epsg:26720 4 -0x1.bf6e73ffc1ea8p5 0x1.9p5 +REG epsg:26721 0 -0x1.c8p5 0x1.68p5 +REG epsg:26721 1 -0x1.0048c6001f0acp6 0x1.4p5 +REG epsg:26721 2 -0x1.8f6e73ffc1ea8p5 0x1.4p5 +REG epsg:26721 3 -0x1.0048c6001f0acp6 0x1.9p5 +REG epsg:26721 4 -0x1.8f6e73ffc1ea8p5 0x1.9p5 +REG epsg:26722 0 -0x1.98p5 0x1.68p5 +REG epsg:26722 1 -0x1.d0918c003e158p5 0x1.4p5 +REG epsg:26722 2 -0x1.5f6e73ffc1ea8p5 0x1.4p5 +REG epsg:26722 3 -0x1.d0918c003e158p5 0x1.9p5 +REG epsg:26722 4 -0x1.5f6e73ffc1ea8p5 0x1.9p5 +REG epsg:26729 0 -0x1.5755555555555p6 0x1.e8p4 +REG epsg:26729 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG epsg:26729 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG epsg:26729 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG epsg:26729 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG epsg:2673 0 0x1.d4p6 0x0.0p0 +REG epsg:2673 1 0x1.cp6 -0x1.4p2 +REG epsg:2673 2 0x1.e8p6 -0x1.4p2 +REG epsg:2673 3 0x1.cp6 0x1.4p2 +REG epsg:2673 4 0x1.e8p6 0x1.4p2 +REG epsg:26730 0 -0x1.5ep6 0x1.ep4 +REG epsg:26730 1 -0x1.75181116f43fep6 0x1.9p4 +REG epsg:26730 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG epsg:26730 3 -0x1.75181116f43fep6 0x1.18p5 +REG epsg:26730 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG epsg:26731 0 -0x1.0b55555555557p7 0x1.c8p5 +REG epsg:26731 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG epsg:26731 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG epsg:26731 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG epsg:26731 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG epsg:26732 0 -0x1.1cp7 0x1.bp5 +REG epsg:26732 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG epsg:26732 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG epsg:26732 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG epsg:26732 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26733 0 -0x1.24p7 0x1.bp5 +REG epsg:26733 1 -0x1.350355070bc27p7 0x1.88p5 +REG epsg:26733 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG epsg:26733 3 -0x1.350355070bc27p7 0x1.d8p5 +REG epsg:26733 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG epsg:26734 0 -0x1.2cp7 0x1.bp5 +REG epsg:26734 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG epsg:26734 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG epsg:26734 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG epsg:26734 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26735 0 -0x1.34p7 0x1.bp5 +REG epsg:26735 1 -0x1.450355070bc27p7 0x1.88p5 +REG epsg:26735 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG epsg:26735 3 -0x1.450355070bc27p7 0x1.d8p5 +REG epsg:26735 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG epsg:26736 0 -0x1.3cp7 0x1.bp5 +REG epsg:26736 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG epsg:26736 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG epsg:26736 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG epsg:26736 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26737 0 -0x1.44p7 0x1.bp5 +REG epsg:26737 1 -0x1.550355070bc27p7 0x1.88p5 +REG epsg:26737 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG epsg:26737 3 -0x1.550355070bc27p7 0x1.d8p5 +REG epsg:26737 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG epsg:26738 0 -0x1.4cp7 0x1.bp5 +REG epsg:26738 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG epsg:26738 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG epsg:26738 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG epsg:26738 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26739 0 -0x1.54p7 0x1.bp5 +REG epsg:26739 1 -0x1.650355070bc27p7 0x1.88p5 +REG epsg:26739 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG epsg:26739 3 -0x1.650355070bc27p7 0x1.d8p5 +REG epsg:26739 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG epsg:2674 0 0x1.ep6 0x0.0p0 +REG epsg:2674 1 0x1.ccp6 -0x1.4p2 +REG epsg:2674 2 0x1.f4p6 -0x1.4p2 +REG epsg:2674 3 0x1.ccp6 0x1.4p2 +REG epsg:2674 4 0x1.f4p6 0x1.4p2 +REG epsg:26740 0 -0x1.6p7 0x1.a355555555556p5 +REG epsg:26740 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:26740 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:26740 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG epsg:26740 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG epsg:26741 0 -0x1.e8p6 0x1.44p5 +REG epsg:26741 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:26741 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:26741 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:26741 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:26742 0 -0x1.e8p6 0x1.36p5 +REG epsg:26742 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:26742 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:26742 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:26742 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:26743 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:26743 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:26743 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:26743 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:26743 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:26744 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:26744 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:26744 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:26744 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:26744 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:26745 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:26745 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:26745 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:26745 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:26745 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:26746 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:26746 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:26746 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:26746 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:26746 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:26747 0 -0x1.d955555555553p6 0x1.1122222222222p5 +REG epsg:26747 1 -0x1.de2a91549c3cfp6 0x1.0922222222222p5 +REG epsg:26747 2 -0x1.d48019560e6d7p6 0x1.0922222222222p5 +REG epsg:26747 3 -0x1.de2a91549c3cfp6 0x1.1922222222222p5 +REG epsg:26747 4 -0x1.d48019560e6d7p6 0x1.1922222222222p5 +REG epsg:26748 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:26748 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:26748 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:26748 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:26748 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:26749 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:26749 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:26749 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:26749 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:26749 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:2675 0 0x1.ecp6 0x0.0p0 +REG epsg:2675 1 0x1.d8p6 -0x1.4p2 +REG epsg:2675 2 0x1.0p7 -0x1.4p2 +REG epsg:2675 3 0x1.d8p6 0x1.4p2 +REG epsg:2675 4 0x1.0p7 0x1.4p2 +REG epsg:26750 0 -0x1.c7p6 0x1.fp4 +REG epsg:26750 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:26750 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:26750 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:26750 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:26751 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:26751 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:26751 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:26751 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:26751 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:26752 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:26752 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:26752 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:26752 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:26752 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:26753 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:26753 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:26753 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:26753 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:26753 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:26754 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:26754 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:26754 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:26754 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:26754 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:26755 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:26755 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:26755 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:26755 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:26755 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:26756 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:26756 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:26756 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:26756 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:26756 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:26757 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:26757 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:26757 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:26757 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:26757 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:26758 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:26758 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:26758 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:26758 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:26758 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:26759 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:26759 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:26759 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:26759 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:26759 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2676 0 0x1.f8p6 0x0.0p0 +REG epsg:2676 1 0x1.e4p6 -0x1.4p2 +REG epsg:2676 2 0x1.06p7 -0x1.4p2 +REG epsg:2676 3 0x1.e4p6 0x1.4p2 +REG epsg:2676 4 0x1.06p7 0x1.4p2 +REG epsg:26760 0 -0x1.52p6 0x1.dep4 +REG epsg:26760 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:26760 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:26760 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:26760 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:26766 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:26766 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:26766 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:26766 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:26766 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:26767 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:26767 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:26767 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:26767 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:26767 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:26768 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:26768 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:26768 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:26768 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:26768 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:26769 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:26769 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:26769 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:26769 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:26769 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2677 0 0x1.02p7 0x0.0p0 +REG epsg:2677 1 0x1.fp6 -0x1.4p2 +REG epsg:2677 2 0x1.0cp7 -0x1.4p2 +REG epsg:2677 3 0x1.fp6 0x1.4p2 +REG epsg:2677 4 0x1.0cp7 0x1.4p2 +REG epsg:26770 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:26770 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:26770 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:26770 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:26770 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:26771 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:26771 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:26771 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:26771 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:26771 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:26772 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:26772 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:26772 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:26772 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:26772 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:26773 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:26773 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:26773 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:26773 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:26773 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:26774 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:26774 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:26774 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:26774 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:26774 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:26775 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:26775 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:26775 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:26775 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:26775 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:26776 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:26776 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:26776 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:26776 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:26776 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:26777 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:26777 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:26777 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:26777 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:26777 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:26778 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:26778 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:26778 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:26778 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:26778 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:26779 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:26779 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:26779 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:26779 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:26779 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:2678 0 0x1.08p7 0x0.0p0 +REG epsg:2678 1 0x1.fcp6 -0x1.4p2 +REG epsg:2678 2 0x1.12p7 -0x1.4p2 +REG epsg:2678 3 0x1.fcp6 0x1.4p2 +REG epsg:2678 4 0x1.12p7 0x1.4p2 +REG epsg:26780 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:26780 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:26780 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:26780 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:26780 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:26781 0 -0x1.72p6 0x1.faaaaaaaaaaaap4 +REG epsg:26781 1 -0x1.7b66402708f87p6 0x1.daaaaaaaaaaaep4 +REG epsg:26781 2 -0x1.6899bfd8f7079p6 0x1.daaaaaaaaaaaep4 +REG epsg:26781 3 -0x1.7b66402708f87p6 0x1.0d55555555553p5 +REG epsg:26781 4 -0x1.6899bfd8f7079p6 0x1.0d55555555553p5 +REG epsg:26782 0 -0x1.6d55555555555p6 0x1.daeeeeeeeeefp4 +REG epsg:26782 1 -0x1.76b1f683c31b1p6 0x1.ba66666666669p4 +REG epsg:26782 2 -0x1.63f8b426e78f9p6 0x1.ba66666666669p4 +REG epsg:26782 3 -0x1.76b1f683c31b1p6 0x1.fb77777777777p4 +REG epsg:26782 4 -0x1.63f8b426e78f9p6 0x1.fb77777777777p4 +REG epsg:26783 0 -0x1.12p6 0x1.5eaaaaaaaaaacp5 +REG epsg:26783 1 -0x1.2db9bac668c18p6 0x1.36aaaaaaaaaacp5 +REG epsg:26783 2 -0x1.ec8c8a732e7dp5 0x1.36aaaaaaaaaacp5 +REG epsg:26783 3 -0x1.2db9bac668c18p6 0x1.86aaaaaaaaaacp5 +REG epsg:26783 4 -0x1.ec8c8a732e7dp5 0x1.86aaaaaaaaaacp5 +REG epsg:26784 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26784 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26784 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26784 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26784 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:26785 0 -0x1.34p6 0x1.3522222222223p5 +REG epsg:26785 1 -0x1.3c477eb6c7662p6 0x1.2833333333335p5 +REG epsg:26785 2 -0x1.2bb881493899ep6 0x1.2833333333335p5 +REG epsg:26785 3 -0x1.3c477eb6c7662p6 0x1.4211111111111p5 +REG epsg:26785 4 -0x1.2bb881493899ep6 0x1.4211111111111p5 +REG epsg:26786 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:26786 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:26786 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:26786 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:26786 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:26787 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:26787 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:26787 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:26787 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:26787 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:2679 0 0x1.0ep7 0x0.0p0 +REG epsg:2679 1 0x1.04p7 -0x1.4p2 +REG epsg:2679 2 0x1.18p7 -0x1.4p2 +REG epsg:2679 3 0x1.04p7 0x1.4p2 +REG epsg:2679 4 0x1.18p7 0x1.4p2 +REG epsg:26791 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26791 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26791 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26791 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26791 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:26792 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26792 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26792 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26792 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26792 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26793 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26793 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26793 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26793 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26793 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26794 0 -0x1.6355555555555p6 0x1.daaaaaaaaaaacp4 +REG epsg:26794 1 -0x1.7a59b545a2bp6 0x1.8aaaaaaaaaaacp4 +REG epsg:26794 2 -0x1.4c50f56507faap6 0x1.8aaaaaaaaaaacp4 +REG epsg:26794 3 -0x1.7a59b545a2bp6 0x1.1555555555556p5 +REG epsg:26794 4 -0x1.4c50f56507faap6 0x1.1555555555556p5 +REG epsg:26795 0 -0x1.6955555555555p6 0x1.e8p4 +REG epsg:26795 1 -0x1.808b909d9872bp6 0x1.98p4 +REG epsg:26795 2 -0x1.521f1a0d1237fp6 0x1.98p4 +REG epsg:26795 3 -0x1.808b909d9872bp6 0x1.1cp5 +REG epsg:26795 4 -0x1.521f1a0d1237fp6 0x1.1cp5 +REG epsg:26796 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG epsg:26796 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:26796 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:26796 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:26796 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:26797 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG epsg:26797 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:26797 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:26797 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:26797 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:26798 0 -0x1.7ap6 0x1.2155555555554p5 +REG epsg:26798 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG epsg:26798 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG epsg:26798 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG epsg:26798 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG epsg:26799 0 -0x1.d955555555553p6 0x1.1122222222222p5 +REG epsg:26799 1 -0x1.de2a91549c3cfp6 0x1.0922222222222p5 +REG epsg:26799 2 -0x1.d48019560e6d7p6 0x1.0922222222222p5 +REG epsg:26799 3 -0x1.de2a91549c3cfp6 0x1.1922222222222p5 +REG epsg:26799 4 -0x1.d48019560e6d7p6 0x1.1922222222222p5 +REG epsg:2680 0 0x1.14p7 0x0.0p0 +REG epsg:2680 1 0x1.0ap7 -0x1.4p2 +REG epsg:2680 2 0x1.1ep7 -0x1.4p2 +REG epsg:2680 3 0x1.0ap7 0x1.4p2 +REG epsg:2680 4 0x1.1ep7 0x1.4p2 +REG epsg:26801 0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 +REG epsg:26801 1 -0x1.695eda12b767bp6 0x1.24p5 +REG epsg:26801 2 -0x1.33f67b429dedbp6 0x1.24p5 +REG epsg:26801 3 -0x1.695eda12b767bp6 0x1.74p5 +REG epsg:26801 4 -0x1.33f67b429dedbp6 0x1.74p5 +REG epsg:26802 0 -0x1.57p6 0x1.4cp5 +REG epsg:26802 1 -0x1.71b42f680cbdp6 0x1.24p5 +REG epsg:26802 2 -0x1.3c4bd097f343p6 0x1.24p5 +REG epsg:26802 3 -0x1.71b42f680cbdp6 0x1.74p5 +REG epsg:26802 4 -0x1.3c4bd097f343p6 0x1.74p5 +REG epsg:26803 0 -0x1.63p6 0x1.4cp5 +REG epsg:26803 1 -0x1.7db42f680cbdp6 0x1.24p5 +REG epsg:26803 2 -0x1.484bd097f343p6 0x1.24p5 +REG epsg:26803 3 -0x1.7db42f680cbdp6 0x1.74p5 +REG epsg:26803 4 -0x1.484bd097f343p6 0x1.74p5 +REG epsg:2681 0 0x1.1ap7 0x0.0p0 +REG epsg:2681 1 0x1.1p7 -0x1.4p2 +REG epsg:2681 2 0x1.24p7 -0x1.4p2 +REG epsg:2681 3 0x1.1p7 0x1.4p2 +REG epsg:2681 4 0x1.24p7 0x1.4p2 +REG epsg:26811 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:26811 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:26811 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:26811 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:26811 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:26812 0 -0x1.5155555555555p6 0x1.6411111111112p5 +REG epsg:26812 1 -0x1.5eb3874abc71ap6 0x1.5100000000001p5 +REG epsg:26812 2 -0x1.43f7235fee39p6 0x1.5100000000001p5 +REG epsg:26812 3 -0x1.5eb3874abc71ap6 0x1.7722222222223p5 +REG epsg:26812 4 -0x1.43f7235fee39p6 0x1.7722222222223p5 +REG epsg:26813 0 -0x1.5155555555555p6 0x1.54aaaaaaaaaaap5 +REG epsg:26813 1 -0x1.5d1a9f6347bf8p6 0x1.4355555555556p5 +REG epsg:26813 2 -0x1.45900b4762eb2p6 0x1.4355555555556p5 +REG epsg:26813 3 -0x1.5d1a9f6347bf8p6 0x1.65ffffffffffep5 +REG epsg:26813 4 -0x1.45900b4762eb2p6 0x1.65ffffffffffep5 +REG epsg:26814 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26814 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26814 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26814 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26814 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26815 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26815 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26815 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26815 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26815 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:26819 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26819 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26819 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26819 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26819 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:2682 0 0x1.2p7 0x0.0p0 +REG epsg:2682 1 0x1.16p7 -0x1.4p2 +REG epsg:2682 2 0x1.2ap7 -0x1.4p2 +REG epsg:2682 3 0x1.16p7 0x1.4p2 +REG epsg:2682 4 0x1.2ap7 0x1.4p2 +REG epsg:26820 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26820 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26820 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26820 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26820 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26821 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26821 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26821 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26821 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26821 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26822 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:26822 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:26822 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:26822 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:26822 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:26823 0 -0x1.3ep6 0x1.3bp5 +REG epsg:26823 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:26823 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:26823 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:26823 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:26824 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:26824 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:26824 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:26824 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:26824 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:26825 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26825 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26825 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26825 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26825 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26826 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26826 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26826 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26826 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26826 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:2683 0 0x1.26p7 0x0.0p0 +REG epsg:2683 1 0x1.1cp7 -0x1.4p2 +REG epsg:2683 2 0x1.3p7 -0x1.4p2 +REG epsg:2683 3 0x1.1cp7 0x1.4p2 +REG epsg:2683 4 0x1.3p7 0x1.4p2 +REG epsg:26830 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26830 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26830 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26830 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26830 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:26831 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26831 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26831 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26831 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26831 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26832 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26832 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26832 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26832 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26832 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26833 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:26833 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:26833 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:26833 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:26833 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:26834 0 -0x1.3ep6 0x1.3bp5 +REG epsg:26834 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:26834 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:26834 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:26834 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:26835 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:26835 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:26835 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:26835 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:26835 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:26836 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26836 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26836 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26836 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26836 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26837 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26837 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26837 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26837 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26837 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:2684 0 0x1.2cp7 0x0.0p0 +REG epsg:2684 1 0x1.22p7 -0x1.4p2 +REG epsg:2684 2 0x1.36p7 -0x1.4p2 +REG epsg:2684 3 0x1.22p7 0x1.4p2 +REG epsg:2684 4 0x1.36p7 0x1.4p2 +REG epsg:26841 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26841 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26841 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26841 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26841 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:26842 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26842 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26842 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26842 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26842 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26843 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26843 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26843 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26843 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26843 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26844 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:26844 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:26844 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:26844 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:26844 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:26845 0 -0x1.3ep6 0x1.3bp5 +REG epsg:26845 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:26845 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:26845 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:26845 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:26846 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:26846 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:26846 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:26846 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:26846 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:26847 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26847 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26847 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26847 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26847 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26848 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26848 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26848 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26848 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26848 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:26849 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26849 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26849 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26849 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26849 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:2685 0 0x1.32p7 0x0.0p0 +REG epsg:2685 1 0x1.28p7 -0x1.4p2 +REG epsg:2685 2 0x1.3cp7 -0x1.4p2 +REG epsg:2685 3 0x1.28p7 0x1.4p2 +REG epsg:2685 4 0x1.3cp7 0x1.4p2 +REG epsg:26850 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26850 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26850 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26850 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26850 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26851 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26851 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26851 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26851 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26851 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26852 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:26852 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:26852 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:26852 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:26852 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:26853 0 -0x1.3ep6 0x1.3bp5 +REG epsg:26853 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:26853 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:26853 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:26853 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:26854 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:26854 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:26854 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:26854 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:26854 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:26855 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26855 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26855 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26855 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26855 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26856 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26856 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26856 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26856 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26856 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:26857 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26857 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26857 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26857 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26857 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:26858 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26858 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26858 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26858 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26858 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26859 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26859 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26859 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26859 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26859 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:2686 0 0x1.38p7 0x0.0p0 +REG epsg:2686 1 0x1.2ep7 -0x1.4p2 +REG epsg:2686 2 0x1.42p7 -0x1.4p2 +REG epsg:2686 3 0x1.2ep7 0x1.4p2 +REG epsg:2686 4 0x1.42p7 0x1.4p2 +REG epsg:26860 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:26860 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:26860 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:26860 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:26860 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:26861 0 -0x1.3ep6 0x1.3bp5 +REG epsg:26861 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:26861 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:26861 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:26861 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:26862 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:26862 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:26862 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:26862 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:26862 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:26863 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26863 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26863 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26863 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26863 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26864 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26864 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26864 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26864 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26864 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:26865 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26865 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26865 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26865 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26865 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:26866 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26866 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26866 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26866 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26866 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26867 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26867 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26867 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26867 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26867 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26868 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:26868 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:26868 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:26868 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:26868 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:26869 0 -0x1.3ep6 0x1.3bp5 +REG epsg:26869 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:26869 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:26869 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:26869 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:2687 0 0x1.3ep7 0x0.0p0 +REG epsg:2687 1 0x1.34p7 -0x1.4p2 +REG epsg:2687 2 0x1.48p7 -0x1.4p2 +REG epsg:2687 3 0x1.34p7 0x1.4p2 +REG epsg:2687 4 0x1.48p7 0x1.4p2 +REG epsg:26870 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:26870 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:26870 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:26870 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:26870 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:2688 0 0x1.44p7 0x0.0p0 +REG epsg:2688 1 0x1.3ap7 -0x1.4p2 +REG epsg:2688 2 0x1.4ep7 -0x1.4p2 +REG epsg:2688 3 0x1.3ap7 0x1.4p2 +REG epsg:2688 4 0x1.4ep7 0x1.4p2 +REG epsg:2689 0 0x1.4ap7 0x0.0p0 +REG epsg:2689 1 0x1.4p7 -0x1.4p2 +REG epsg:2689 2 0x1.54p7 -0x1.4p2 +REG epsg:2689 3 0x1.4p7 0x1.4p2 +REG epsg:2689 4 0x1.54p7 0x1.4p2 +REG epsg:26891 0 -0x1.4ap6 0x0.0p0 +REG epsg:26891 1 -0x1.5ep6 -0x1.4p2 +REG epsg:26891 2 -0x1.36p6 -0x1.4p2 +REG epsg:26891 3 -0x1.5ep6 0x1.4p2 +REG epsg:26891 4 -0x1.36p6 0x1.4p2 +REG epsg:26892 0 -0x1.44p6 0x0.0p0 +REG epsg:26892 1 -0x1.58p6 -0x1.4p2 +REG epsg:26892 2 -0x1.3p6 -0x1.4p2 +REG epsg:26892 3 -0x1.58p6 0x1.4p2 +REG epsg:26892 4 -0x1.3p6 0x1.4p2 +REG epsg:26893 0 -0x1.5p6 0x0.0p0 +REG epsg:26893 1 -0x1.64p6 -0x1.4p2 +REG epsg:26893 2 -0x1.3cp6 -0x1.4p2 +REG epsg:26893 3 -0x1.64p6 0x1.4p2 +REG epsg:26893 4 -0x1.3cp6 0x1.4p2 +REG epsg:26894 0 -0x1.5cp6 0x0.0p0 +REG epsg:26894 1 -0x1.7p6 -0x1.4p2 +REG epsg:26894 2 -0x1.48p6 -0x1.4p2 +REG epsg:26894 3 -0x1.7p6 0x1.4p2 +REG epsg:26894 4 -0x1.48p6 0x1.4p2 +REG epsg:26895 0 -0x1.68p6 0x0.0p0 +REG epsg:26895 1 -0x1.7cp6 -0x1.4p2 +REG epsg:26895 2 -0x1.54p6 -0x1.4p2 +REG epsg:26895 3 -0x1.7cp6 0x1.4p2 +REG epsg:26895 4 -0x1.54p6 0x1.4p2 +REG epsg:26896 0 -0x1.74p6 0x0.0p0 +REG epsg:26896 1 -0x1.88p6 -0x1.4p2 +REG epsg:26896 2 -0x1.6p6 -0x1.4p2 +REG epsg:26896 3 -0x1.88p6 0x1.4p2 +REG epsg:26896 4 -0x1.6p6 0x1.4p2 +REG epsg:26897 0 -0x1.8p6 0x0.0p0 +REG epsg:26897 1 -0x1.94p6 -0x1.4p2 +REG epsg:26897 2 -0x1.6cp6 -0x1.4p2 +REG epsg:26897 3 -0x1.94p6 0x1.4p2 +REG epsg:26897 4 -0x1.6cp6 0x1.4p2 +REG epsg:26898 0 -0x1.a8p5 0x0.0p0 +REG epsg:26898 1 -0x1.dp5 -0x1.4p2 +REG epsg:26898 2 -0x1.8p5 -0x1.4p2 +REG epsg:26898 3 -0x1.dp5 0x1.4p2 +REG epsg:26898 4 -0x1.8p5 0x1.4p2 +REG epsg:26899 0 -0x1.cp5 0x0.0p0 +REG epsg:26899 1 -0x1.e8p5 -0x1.4p2 +REG epsg:26899 2 -0x1.98p5 -0x1.4p2 +REG epsg:26899 3 -0x1.e8p5 0x1.4p2 +REG epsg:26899 4 -0x1.98p5 0x1.4p2 +REG epsg:2690 0 0x1.5p7 0x0.0p0 +REG epsg:2690 1 0x1.46p7 -0x1.4p2 +REG epsg:2690 2 0x1.5ap7 -0x1.4p2 +REG epsg:2690 3 0x1.46p7 0x1.4p2 +REG epsg:2690 4 0x1.5ap7 0x1.4p2 +REG epsg:26901 0 -0x1.62p7 0x1.68p5 +REG epsg:26901 1 0x1.5fdb9cfff07aap7 0x1.4p5 +REG epsg:26901 2 -0x1.53db9cfff07aap7 0x1.4p5 +REG epsg:26901 3 0x1.5fdb9cfff07aap7 0x1.9p5 +REG epsg:26901 4 -0x1.53db9cfff07aap7 0x1.9p5 +REG epsg:26902 0 -0x1.56p7 0x1.68p5 +REG epsg:26902 1 -0x1.642463000f856p7 0x1.4p5 +REG epsg:26902 2 -0x1.47db9cfff07aap7 0x1.4p5 +REG epsg:26902 3 -0x1.642463000f856p7 0x1.9p5 +REG epsg:26902 4 -0x1.47db9cfff07aap7 0x1.9p5 +REG epsg:26903 0 -0x1.4ap7 0x1.68p5 +REG epsg:26903 1 -0x1.582463000f856p7 0x1.4p5 +REG epsg:26903 2 -0x1.3bdb9cfff07aap7 0x1.4p5 +REG epsg:26903 3 -0x1.582463000f856p7 0x1.9p5 +REG epsg:26903 4 -0x1.3bdb9cfff07aap7 0x1.9p5 +REG epsg:26904 0 -0x1.3ep7 0x1.68p5 +REG epsg:26904 1 -0x1.4c2463000f856p7 0x1.4p5 +REG epsg:26904 2 -0x1.2fdb9cfff07aap7 0x1.4p5 +REG epsg:26904 3 -0x1.4c2463000f856p7 0x1.9p5 +REG epsg:26904 4 -0x1.2fdb9cfff07aap7 0x1.9p5 +REG epsg:26905 0 -0x1.32p7 0x1.68p5 +REG epsg:26905 1 -0x1.402463000f856p7 0x1.4p5 +REG epsg:26905 2 -0x1.23db9cfff07aap7 0x1.4p5 +REG epsg:26905 3 -0x1.402463000f856p7 0x1.9p5 +REG epsg:26905 4 -0x1.23db9cfff07aap7 0x1.9p5 +REG epsg:26906 0 -0x1.26p7 0x1.68p5 +REG epsg:26906 1 -0x1.342463000f856p7 0x1.4p5 +REG epsg:26906 2 -0x1.17db9cfff07aap7 0x1.4p5 +REG epsg:26906 3 -0x1.342463000f856p7 0x1.9p5 +REG epsg:26906 4 -0x1.17db9cfff07aap7 0x1.9p5 +REG epsg:26907 0 -0x1.1ap7 0x1.68p5 +REG epsg:26907 1 -0x1.282463000f856p7 0x1.4p5 +REG epsg:26907 2 -0x1.0bdb9cfff07aap7 0x1.4p5 +REG epsg:26907 3 -0x1.282463000f856p7 0x1.9p5 +REG epsg:26907 4 -0x1.0bdb9cfff07aap7 0x1.9p5 +REG epsg:26908 0 -0x1.0ep7 0x1.68p5 +REG epsg:26908 1 -0x1.1c2463000f856p7 0x1.4p5 +REG epsg:26908 2 -0x1.ffb739ffe0f54p6 0x1.4p5 +REG epsg:26908 3 -0x1.1c2463000f856p7 0x1.9p5 +REG epsg:26908 4 -0x1.ffb739ffe0f54p6 0x1.9p5 +REG epsg:26909 0 -0x1.02p7 0x1.68p5 +REG epsg:26909 1 -0x1.102463000f856p7 0x1.4p5 +REG epsg:26909 2 -0x1.e7b739ffe0f54p6 0x1.4p5 +REG epsg:26909 3 -0x1.102463000f856p7 0x1.9p5 +REG epsg:26909 4 -0x1.e7b739ffe0f54p6 0x1.9p5 +REG epsg:2691 0 0x1.56p7 0x0.0p0 +REG epsg:2691 1 0x1.4cp7 -0x1.4p2 +REG epsg:2691 2 0x1.6p7 -0x1.4p2 +REG epsg:2691 3 0x1.4cp7 0x1.4p2 +REG epsg:2691 4 0x1.6p7 0x1.4p2 +REG epsg:26910 0 -0x1.ecp6 0x1.68p5 +REG epsg:26910 1 -0x1.042463000f856p7 0x1.4p5 +REG epsg:26910 2 -0x1.cfb739ffe0f54p6 0x1.4p5 +REG epsg:26910 3 -0x1.042463000f856p7 0x1.9p5 +REG epsg:26910 4 -0x1.cfb739ffe0f54p6 0x1.9p5 +REG epsg:26911 0 -0x1.d4p6 0x1.68p5 +REG epsg:26911 1 -0x1.f048c6001f0acp6 0x1.4p5 +REG epsg:26911 2 -0x1.b7b739ffe0f54p6 0x1.4p5 +REG epsg:26911 3 -0x1.f048c6001f0acp6 0x1.9p5 +REG epsg:26911 4 -0x1.b7b739ffe0f54p6 0x1.9p5 +REG epsg:26912 0 -0x1.bcp6 0x1.68p5 +REG epsg:26912 1 -0x1.d848c6001f0acp6 0x1.4p5 +REG epsg:26912 2 -0x1.9fb739ffe0f54p6 0x1.4p5 +REG epsg:26912 3 -0x1.d848c6001f0acp6 0x1.9p5 +REG epsg:26912 4 -0x1.9fb739ffe0f54p6 0x1.9p5 +REG epsg:26913 0 -0x1.a4p6 0x1.68p5 +REG epsg:26913 1 -0x1.c048c6001f0acp6 0x1.4p5 +REG epsg:26913 2 -0x1.87b739ffe0f54p6 0x1.4p5 +REG epsg:26913 3 -0x1.c048c6001f0acp6 0x1.9p5 +REG epsg:26913 4 -0x1.87b739ffe0f54p6 0x1.9p5 +REG epsg:26914 0 -0x1.8cp6 0x1.68p5 +REG epsg:26914 1 -0x1.a848c6001f0acp6 0x1.4p5 +REG epsg:26914 2 -0x1.6fb739ffe0f54p6 0x1.4p5 +REG epsg:26914 3 -0x1.a848c6001f0acp6 0x1.9p5 +REG epsg:26914 4 -0x1.6fb739ffe0f54p6 0x1.9p5 +REG epsg:26915 0 -0x1.74p6 0x1.68p5 +REG epsg:26915 1 -0x1.9048c6001f0acp6 0x1.4p5 +REG epsg:26915 2 -0x1.57b739ffe0f54p6 0x1.4p5 +REG epsg:26915 3 -0x1.9048c6001f0acp6 0x1.9p5 +REG epsg:26915 4 -0x1.57b739ffe0f54p6 0x1.9p5 +REG epsg:26916 0 -0x1.5cp6 0x1.68p5 +REG epsg:26916 1 -0x1.7848c6001f0acp6 0x1.4p5 +REG epsg:26916 2 -0x1.3fb739ffe0f54p6 0x1.4p5 +REG epsg:26916 3 -0x1.7848c6001f0acp6 0x1.9p5 +REG epsg:26916 4 -0x1.3fb739ffe0f54p6 0x1.9p5 +REG epsg:26917 0 -0x1.44p6 0x1.68p5 +REG epsg:26917 1 -0x1.6048c6001f0acp6 0x1.4p5 +REG epsg:26917 2 -0x1.27b739ffe0f54p6 0x1.4p5 +REG epsg:26917 3 -0x1.6048c6001f0acp6 0x1.9p5 +REG epsg:26917 4 -0x1.27b739ffe0f54p6 0x1.9p5 +REG epsg:26918 0 -0x1.2cp6 0x1.68p5 +REG epsg:26918 1 -0x1.4848c6001f0acp6 0x1.4p5 +REG epsg:26918 2 -0x1.0fb739ffe0f54p6 0x1.4p5 +REG epsg:26918 3 -0x1.4848c6001f0acp6 0x1.9p5 +REG epsg:26918 4 -0x1.0fb739ffe0f54p6 0x1.9p5 +REG epsg:26919 0 -0x1.14p6 0x1.68p5 +REG epsg:26919 1 -0x1.3048c6001f0acp6 0x1.4p5 +REG epsg:26919 2 -0x1.ef6e73ffc1ea8p5 0x1.4p5 +REG epsg:26919 3 -0x1.3048c6001f0acp6 0x1.9p5 +REG epsg:26919 4 -0x1.ef6e73ffc1ea8p5 0x1.9p5 +REG epsg:2692 0 0x1.5cp7 0x0.0p0 +REG epsg:2692 1 0x1.52p7 -0x1.4p2 +REG epsg:2692 2 0x1.66p7 -0x1.4p2 +REG epsg:2692 3 0x1.52p7 0x1.4p2 +REG epsg:2692 4 0x1.66p7 0x1.4p2 +REG epsg:26920 0 -0x1.f8p5 0x1.68p5 +REG epsg:26920 1 -0x1.1848c6001f0acp6 0x1.4p5 +REG epsg:26920 2 -0x1.bf6e73ffc1ea8p5 0x1.4p5 +REG epsg:26920 3 -0x1.1848c6001f0acp6 0x1.9p5 +REG epsg:26920 4 -0x1.bf6e73ffc1ea8p5 0x1.9p5 +REG epsg:26921 0 -0x1.c8p5 0x1.68p5 +REG epsg:26921 1 -0x1.0048c6001f0acp6 0x1.4p5 +REG epsg:26921 2 -0x1.8f6e73ffc1ea8p5 0x1.4p5 +REG epsg:26921 3 -0x1.0048c6001f0acp6 0x1.9p5 +REG epsg:26921 4 -0x1.8f6e73ffc1ea8p5 0x1.9p5 +REG epsg:26922 0 -0x1.98p5 0x1.68p5 +REG epsg:26922 1 -0x1.d0918c003e158p5 0x1.4p5 +REG epsg:26922 2 -0x1.5f6e73ffc1ea8p5 0x1.4p5 +REG epsg:26922 3 -0x1.d0918c003e158p5 0x1.9p5 +REG epsg:26922 4 -0x1.5f6e73ffc1ea8p5 0x1.9p5 +REG epsg:26923 0 -0x1.68p5 0x1.68p5 +REG epsg:26923 1 -0x1.a0918c003e158p5 0x1.4p5 +REG epsg:26923 2 -0x1.2f6e73ffc1ea8p5 0x1.4p5 +REG epsg:26923 3 -0x1.a0918c003e158p5 0x1.9p5 +REG epsg:26923 4 -0x1.2f6e73ffc1ea8p5 0x1.9p5 +REG epsg:26929 0 -0x1.5755555555555p6 0x1.e8p4 +REG epsg:26929 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG epsg:26929 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG epsg:26929 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG epsg:26929 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG epsg:2693 0 0x1.62p7 0x0.0p0 +REG epsg:2693 1 0x1.58p7 -0x1.4p2 +REG epsg:2693 2 -0x1.64p7 -0x1.4p2 +REG epsg:2693 3 0x1.58p7 0x1.4p2 +REG epsg:2693 4 -0x1.64p7 0x1.4p2 +REG epsg:26930 0 -0x1.5ep6 0x1.ep4 +REG epsg:26930 1 -0x1.75181116f43fep6 0x1.9p4 +REG epsg:26930 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG epsg:26930 3 -0x1.75181116f43fep6 0x1.18p5 +REG epsg:26930 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG epsg:26931 0 -0x1.0b55555555557p7 0x1.c8p5 +REG epsg:26931 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG epsg:26931 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG epsg:26931 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG epsg:26931 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG epsg:26932 0 -0x1.1cp7 0x1.bp5 +REG epsg:26932 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG epsg:26932 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG epsg:26932 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG epsg:26932 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26933 0 -0x1.24p7 0x1.bp5 +REG epsg:26933 1 -0x1.350355070bc27p7 0x1.88p5 +REG epsg:26933 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG epsg:26933 3 -0x1.350355070bc27p7 0x1.d8p5 +REG epsg:26933 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG epsg:26934 0 -0x1.2cp7 0x1.bp5 +REG epsg:26934 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG epsg:26934 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG epsg:26934 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG epsg:26934 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26935 0 -0x1.34p7 0x1.bp5 +REG epsg:26935 1 -0x1.450355070bc27p7 0x1.88p5 +REG epsg:26935 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG epsg:26935 3 -0x1.450355070bc27p7 0x1.d8p5 +REG epsg:26935 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG epsg:26936 0 -0x1.3cp7 0x1.bp5 +REG epsg:26936 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG epsg:26936 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG epsg:26936 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG epsg:26936 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26937 0 -0x1.44p7 0x1.bp5 +REG epsg:26937 1 -0x1.550355070bc27p7 0x1.88p5 +REG epsg:26937 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG epsg:26937 3 -0x1.550355070bc27p7 0x1.d8p5 +REG epsg:26937 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG epsg:26938 0 -0x1.4cp7 0x1.bp5 +REG epsg:26938 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG epsg:26938 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG epsg:26938 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG epsg:26938 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG epsg:26939 0 -0x1.54p7 0x1.bp5 +REG epsg:26939 1 -0x1.650355070bc27p7 0x1.88p5 +REG epsg:26939 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG epsg:26939 3 -0x1.650355070bc27p7 0x1.d8p5 +REG epsg:26939 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG epsg:2694 0 -0x1.68p7 0x0.0p0 +REG epsg:2694 1 0x1.5ep7 -0x1.4p2 +REG epsg:2694 2 -0x1.5ep7 -0x1.4p2 +REG epsg:2694 3 0x1.5ep7 0x1.4p2 +REG epsg:2694 4 -0x1.5ep7 0x1.4p2 +REG epsg:26940 0 -0x1.6p7 0x1.a355555555556p5 +REG epsg:26940 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:26940 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:26940 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG epsg:26940 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG epsg:26941 0 -0x1.e8p6 0x1.44p5 +REG epsg:26941 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:26941 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:26941 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:26941 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:26942 0 -0x1.e8p6 0x1.36p5 +REG epsg:26942 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:26942 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:26942 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:26942 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:26943 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:26943 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:26943 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:26943 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:26943 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:26944 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:26944 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:26944 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:26944 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:26944 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:26945 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:26945 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:26945 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:26945 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:26945 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:26946 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:26946 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:26946 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:26946 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:26946 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:26948 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:26948 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:26948 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:26948 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:26948 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:26949 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:26949 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:26949 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:26949 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:26949 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:2695 0 -0x1.62p7 0x0.0p0 +REG epsg:2695 1 0x1.64p7 -0x1.4p2 +REG epsg:2695 2 -0x1.58p7 -0x1.4p2 +REG epsg:2695 3 0x1.64p7 0x1.4p2 +REG epsg:2695 4 -0x1.58p7 0x1.4p2 +REG epsg:26950 0 -0x1.c7p6 0x1.fp4 +REG epsg:26950 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:26950 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:26950 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:26950 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:26951 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:26951 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:26951 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:26951 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:26951 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:26952 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:26952 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:26952 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:26952 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:26952 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:26953 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:26953 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:26953 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:26953 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:26953 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:26954 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:26954 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:26954 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:26954 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:26954 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:26955 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:26955 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:26955 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:26955 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:26955 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:26956 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:26956 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:26956 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:26956 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:26956 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:26957 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:26957 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:26957 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:26957 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:26957 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:26958 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:26958 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:26958 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:26958 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:26958 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:26959 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:26959 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:26959 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:26959 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:26959 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2696 0 -0x1.5cp7 0x0.0p0 +REG epsg:2696 1 -0x1.66p7 -0x1.4p2 +REG epsg:2696 2 -0x1.52p7 -0x1.4p2 +REG epsg:2696 3 -0x1.66p7 0x1.4p2 +REG epsg:2696 4 -0x1.52p7 0x1.4p2 +REG epsg:26960 0 -0x1.52p6 0x1.dep4 +REG epsg:26960 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:26960 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:26960 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:26960 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:26961 0 -0x1.37p7 0x1.2d55555555554p4 +REG epsg:26961 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG epsg:26961 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG epsg:26961 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG epsg:26961 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG epsg:26962 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG epsg:26962 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG epsg:26962 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG epsg:26962 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG epsg:26962 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG epsg:26963 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:26963 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:26963 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:26963 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:26963 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:26964 0 -0x1.3fp7 0x1.5d55555555554p4 +REG epsg:26964 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG epsg:26964 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG epsg:26964 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG epsg:26964 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG epsg:26965 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG epsg:26965 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG epsg:26965 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG epsg:26965 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG epsg:26965 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG epsg:26966 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:26966 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:26966 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:26966 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:26966 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:26967 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:26967 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:26967 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:26967 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:26967 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:26968 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:26968 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:26968 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:26968 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:26968 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:26969 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:26969 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:26969 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:26969 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:26969 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2697 0 -0x1.56p7 0x0.0p0 +REG epsg:2697 1 -0x1.6p7 -0x1.4p2 +REG epsg:2697 2 -0x1.4cp7 -0x1.4p2 +REG epsg:2697 3 -0x1.6p7 0x1.4p2 +REG epsg:2697 4 -0x1.4cp7 0x1.4p2 +REG epsg:26970 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:26970 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:26970 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:26970 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:26970 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:26971 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:26971 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:26971 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:26971 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:26971 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:26972 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:26972 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:26972 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:26972 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:26972 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:26973 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:26973 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:26973 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:26973 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:26973 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:26974 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:26974 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:26974 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:26974 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:26974 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:26975 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:26975 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:26975 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:26975 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:26975 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:26976 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:26976 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:26976 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:26976 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:26976 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:26977 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:26977 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:26977 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:26977 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:26977 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:26978 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:26978 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:26978 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:26978 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:26978 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:26979 0 -0x1.51p6 0x1.2dddddddddddep5 +REG epsg:26979 1 -0x1.560ec7d05efd7p6 0x1.25ddddddddddep5 +REG epsg:26979 2 -0x1.4bf1382fa1029p6 0x1.25ddddddddddep5 +REG epsg:26979 3 -0x1.560ec7d05efd7p6 0x1.35ddddddddddep5 +REG epsg:26979 4 -0x1.4bf1382fa1029p6 0x1.35ddddddddddep5 +REG epsg:2698 0 -0x1.5p7 0x0.0p0 +REG epsg:2698 1 -0x1.5ap7 -0x1.4p2 +REG epsg:2698 2 -0x1.46p7 -0x1.4p2 +REG epsg:2698 3 -0x1.5ap7 0x1.4p2 +REG epsg:2698 4 -0x1.46p7 0x1.4p2 +REG epsg:26980 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:26980 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:26980 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:26980 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:26980 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:26981 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:26981 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:26981 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:26981 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:26981 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:26982 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:26982 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:26982 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:26982 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:26982 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:26983 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:26983 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:26983 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:26983 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:26983 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:26984 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:26984 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:26984 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:26984 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:26984 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:26985 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:26985 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:26985 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:26985 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:26985 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:26986 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:26986 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:26986 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:26986 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:26986 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:26987 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:26987 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:26987 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:26987 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:26987 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:26988 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:26988 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:26988 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:26988 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:26988 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:26989 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:26989 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:26989 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:26989 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:26989 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:2699 0 0x1.5p4 0x0.0p0 +REG epsg:2699 1 0x1.0p4 -0x1.4p2 +REG epsg:2699 2 0x1.ap4 -0x1.4p2 +REG epsg:2699 3 0x1.0p4 0x1.4p2 +REG epsg:2699 4 0x1.ap4 0x1.4p2 +REG epsg:26990 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:26990 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:26990 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:26990 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:26990 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:26991 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:26991 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:26991 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:26991 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:26991 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:26992 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:26992 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:26992 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:26992 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:26992 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:26993 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:26993 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:26993 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:26993 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:26993 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:26994 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:26994 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:26994 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:26994 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:26994 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:26995 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:26995 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:26995 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:26995 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:26995 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:26996 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG epsg:26996 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:26996 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:26996 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:26996 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:26997 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG epsg:26997 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:26997 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:26997 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:26997 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:26998 0 -0x1.7ap6 0x1.2155555555554p5 +REG epsg:26998 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG epsg:26998 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG epsg:26998 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG epsg:26998 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG epsg:2700 0 0x1.8p4 0x0.0p0 +REG epsg:2700 1 0x1.3p4 -0x1.4p2 +REG epsg:2700 2 0x1.dp4 -0x1.4p2 +REG epsg:2700 3 0x1.3p4 0x1.4p2 +REG epsg:2700 4 0x1.dp4 0x1.4p2 +REG epsg:2701 0 0x1.bp4 0x0.0p0 +REG epsg:2701 1 0x1.6p4 -0x1.4p2 +REG epsg:2701 2 0x1.0p5 -0x1.4p2 +REG epsg:2701 3 0x1.6p4 0x1.4p2 +REG epsg:2701 4 0x1.0p5 0x1.4p2 +REG epsg:2702 0 0x1.ep4 0x0.0p0 +REG epsg:2702 1 0x1.9p4 -0x1.4p2 +REG epsg:2702 2 0x1.18p5 -0x1.4p2 +REG epsg:2702 3 0x1.9p4 0x1.4p2 +REG epsg:2702 4 0x1.18p5 0x1.4p2 +REG epsg:2703 0 0x1.08p5 0x0.0p0 +REG epsg:2703 1 0x1.cp4 -0x1.4p2 +REG epsg:2703 2 0x1.3p5 -0x1.4p2 +REG epsg:2703 3 0x1.cp4 0x1.4p2 +REG epsg:2703 4 0x1.3p5 0x1.4p2 +REG epsg:27037 0 0x1.38p5 0x0.0p0 +REG epsg:27037 1 0x1.1p5 -0x1.4p2 +REG epsg:27037 2 0x1.6p5 -0x1.4p2 +REG epsg:27037 3 0x1.1p5 0x1.4p2 +REG epsg:27037 4 0x1.6p5 0x1.4p2 +REG epsg:27038 0 0x1.68p5 0x0.0p0 +REG epsg:27038 1 0x1.4p5 -0x1.4p2 +REG epsg:27038 2 0x1.9p5 -0x1.4p2 +REG epsg:27038 3 0x1.4p5 0x1.4p2 +REG epsg:27038 4 0x1.9p5 0x1.4p2 +REG epsg:27039 0 0x1.98p5 0x0.0p0 +REG epsg:27039 1 0x1.7p5 -0x1.4p2 +REG epsg:27039 2 0x1.cp5 -0x1.4p2 +REG epsg:27039 3 0x1.7p5 0x1.4p2 +REG epsg:27039 4 0x1.cp5 0x1.4p2 +REG epsg:2704 0 0x1.2p5 0x0.0p0 +REG epsg:2704 1 0x1.fp4 -0x1.4p2 +REG epsg:2704 2 0x1.48p5 -0x1.4p2 +REG epsg:2704 3 0x1.fp4 0x1.4p2 +REG epsg:2704 4 0x1.48p5 0x1.4p2 +REG epsg:27040 0 0x1.c8p5 0x0.0p0 +REG epsg:27040 1 0x1.ap5 -0x1.4p2 +REG epsg:27040 2 0x1.fp5 -0x1.4p2 +REG epsg:27040 3 0x1.ap5 0x1.4p2 +REG epsg:27040 4 0x1.fp5 0x1.4p2 +REG epsg:2705 0 0x1.38p5 0x0.0p0 +REG epsg:2705 1 0x1.1p5 -0x1.4p2 +REG epsg:2705 2 0x1.6p5 -0x1.4p2 +REG epsg:2705 3 0x1.1p5 0x1.4p2 +REG epsg:2705 4 0x1.6p5 0x1.4p2 +REG epsg:2706 0 0x1.5p5 0x0.0p0 +REG epsg:2706 1 0x1.28p5 -0x1.4p2 +REG epsg:2706 2 0x1.78p5 -0x1.4p2 +REG epsg:2706 3 0x1.28p5 0x1.4p2 +REG epsg:2706 4 0x1.78p5 0x1.4p2 +REG epsg:2707 0 0x1.68p5 0x0.0p0 +REG epsg:2707 1 0x1.4p5 -0x1.4p2 +REG epsg:2707 2 0x1.9p5 -0x1.4p2 +REG epsg:2707 3 0x1.4p5 0x1.4p2 +REG epsg:2707 4 0x1.9p5 0x1.4p2 +REG epsg:2708 0 0x1.8p5 0x0.0p0 +REG epsg:2708 1 0x1.58p5 -0x1.4p2 +REG epsg:2708 2 0x1.a8p5 -0x1.4p2 +REG epsg:2708 3 0x1.58p5 0x1.4p2 +REG epsg:2708 4 0x1.a8p5 0x1.4p2 +REG epsg:2709 0 0x1.98p5 0x0.0p0 +REG epsg:2709 1 0x1.7p5 -0x1.4p2 +REG epsg:2709 2 0x1.cp5 -0x1.4p2 +REG epsg:2709 3 0x1.7p5 0x1.4p2 +REG epsg:2709 4 0x1.cp5 0x1.4p2 +REG epsg:2710 0 0x1.bp5 0x0.0p0 +REG epsg:2710 1 0x1.88p5 -0x1.4p2 +REG epsg:2710 2 0x1.d8p5 -0x1.4p2 +REG epsg:2710 3 0x1.88p5 0x1.4p2 +REG epsg:2710 4 0x1.d8p5 0x1.4p2 +REG epsg:2711 0 0x1.c8p5 0x0.0p0 +REG epsg:2711 1 0x1.ap5 -0x1.4p2 +REG epsg:2711 2 0x1.fp5 -0x1.4p2 +REG epsg:2711 3 0x1.ap5 0x1.4p2 +REG epsg:2711 4 0x1.fp5 0x1.4p2 +REG epsg:2712 0 0x1.ep5 0x0.0p0 +REG epsg:2712 1 0x1.b8p5 -0x1.4p2 +REG epsg:2712 2 0x1.04p6 -0x1.4p2 +REG epsg:2712 3 0x1.b8p5 0x1.4p2 +REG epsg:2712 4 0x1.04p6 0x1.4p2 +REG epsg:27120 0 -0x1.f8p5 0x0.0p0 +REG epsg:27120 1 -0x1.1p6 -0x1.4p2 +REG epsg:27120 2 -0x1.dp5 -0x1.4p2 +REG epsg:27120 3 -0x1.1p6 0x1.4p2 +REG epsg:27120 4 -0x1.dp5 0x1.4p2 +REG epsg:2713 0 0x1.f8p5 0x0.0p0 +REG epsg:2713 1 0x1.dp5 -0x1.4p2 +REG epsg:2713 2 0x1.1p6 -0x1.4p2 +REG epsg:2713 3 0x1.dp5 0x1.4p2 +REG epsg:2713 4 0x1.1p6 0x1.4p2 +REG epsg:2714 0 0x1.08p6 0x0.0p0 +REG epsg:2714 1 0x1.e8p5 -0x1.4p2 +REG epsg:2714 2 0x1.1cp6 -0x1.4p2 +REG epsg:2714 3 0x1.e8p5 0x1.4p2 +REG epsg:2714 4 0x1.1cp6 0x1.4p2 +REG epsg:2715 0 0x1.14p6 0x0.0p0 +REG epsg:2715 1 0x1.0p6 -0x1.4p2 +REG epsg:2715 2 0x1.28p6 -0x1.4p2 +REG epsg:2715 3 0x1.0p6 0x1.4p2 +REG epsg:2715 4 0x1.28p6 0x1.4p2 +REG epsg:2716 0 0x1.2p6 0x0.0p0 +REG epsg:2716 1 0x1.0cp6 -0x1.4p2 +REG epsg:2716 2 0x1.34p6 -0x1.4p2 +REG epsg:2716 3 0x1.0cp6 0x1.4p2 +REG epsg:2716 4 0x1.34p6 0x1.4p2 +REG epsg:2717 0 0x1.2cp6 0x0.0p0 +REG epsg:2717 1 0x1.18p6 -0x1.4p2 +REG epsg:2717 2 0x1.4p6 -0x1.4p2 +REG epsg:2717 3 0x1.18p6 0x1.4p2 +REG epsg:2717 4 0x1.4p6 0x1.4p2 +REG epsg:2718 0 0x1.38p6 0x0.0p0 +REG epsg:2718 1 0x1.24p6 -0x1.4p2 +REG epsg:2718 2 0x1.4cp6 -0x1.4p2 +REG epsg:2718 3 0x1.24p6 0x1.4p2 +REG epsg:2718 4 0x1.4cp6 0x1.4p2 +REG epsg:2719 0 0x1.44p6 0x0.0p0 +REG epsg:2719 1 0x1.3p6 -0x1.4p2 +REG epsg:2719 2 0x1.58p6 -0x1.4p2 +REG epsg:2719 3 0x1.3p6 0x1.4p2 +REG epsg:2719 4 0x1.58p6 0x1.4p2 +REG epsg:2720 0 0x1.5p6 0x0.0p0 +REG epsg:2720 1 0x1.3cp6 -0x1.4p2 +REG epsg:2720 2 0x1.64p6 -0x1.4p2 +REG epsg:2720 3 0x1.3cp6 0x1.4p2 +REG epsg:2720 4 0x1.64p6 0x1.4p2 +REG epsg:27200 0 0x1.5ap7 -0x1.48p5 +REG epsg:27200 1 0x1.4cbff77c13ebp7 -0x1.7p5 +REG epsg:27200 2 0x1.67400883ec15p7 -0x1.7p5 +REG epsg:27200 3 0x1.4cbff77c13ebp7 -0x1.2p5 +REG epsg:27200 4 0x1.67400883ec15p7 -0x1.2p5 +REG epsg:27205 0 0x1.5d87577d1e091p7 -0x1.2709f6ce87884p5 +REG epsg:27205 1 0x1.5106ec93929c2p7 -0x1.4f09f6ce87884p5 +REG epsg:27205 2 -0x1.65f83d99568ap7 -0x1.4f09f6ce87884p5 +REG epsg:27205 3 0x1.5106ec93929c2p7 -0x1.fe13ed9d0f108p4 +REG epsg:27205 4 -0x1.65f83d99568ap7 -0x1.fe13ed9d0f108p4 +REG epsg:27206 0 0x1.60eeb167ec786p7 -0x1.2e170a2357947p5 +REG epsg:27206 1 0x1.5448853993046p7 -0x1.56170a2357947p5 +REG epsg:27206 2 -0x1.626b2269ba13ap7 -0x1.56170a2357947p5 +REG epsg:27206 3 0x1.5448853993046p7 -0x1.06170a2357947p5 +REG epsg:27206 4 -0x1.626b2269ba13ap7 -0x1.06170a2357947p5 +REG epsg:27207 0 0x1.63c5721e4269ep7 -0x1.34ff642b82351p5 +REG epsg:27207 1 0x1.56f8a6d70e078p7 -0x1.5cff642b82351p5 +REG epsg:27207 2 -0x1.5f6dc29a8933cp7 -0x1.5cff642b82351p5 +REG epsg:27207 3 0x1.56f8a6d70e078p7 -0x1.0cff642b82351p5 +REG epsg:27207 4 -0x1.5f6dc29a8933cp7 -0x1.0cff642b82351p5 +REG epsg:27208 0 0x1.6158eca77583fp7 -0x1.3d351a6c7af3fp5 +REG epsg:27208 1 0x1.545c0474e8326p7 -0x1.65351a6c7af3fp5 +REG epsg:27208 2 -0x1.61aa2b25fd2a8p7 -0x1.65351a6c7af3fp5 +REG epsg:27208 3 0x1.545c0474e8326p7 -0x1.15351a6c7af3fp5 +REG epsg:27208 4 -0x1.61aa2b25fd2a8p7 -0x1.15351a6c7af3fp5 +REG epsg:27209 0 0x1.5c74bdf4c2b52p7 -0x1.39160873542c1p5 +REG epsg:27209 1 0x1.4f904bad7b7bcp7 -0x1.61160873542c1p5 +REG epsg:27209 2 -0x1.66a6cfc3f6118p7 -0x1.61160873542c1p5 +REG epsg:27209 3 0x1.4f904bad7b7bcp7 -0x1.11160873542c1p5 +REG epsg:27209 4 -0x1.66a6cfc3f6118p7 -0x1.11160873542c1p5 +REG epsg:2721 0 0x1.5cp6 0x0.0p0 +REG epsg:2721 1 0x1.48p6 -0x1.4p2 +REG epsg:2721 2 0x1.7p6 -0x1.4p2 +REG epsg:2721 3 0x1.48p6 0x1.4p2 +REG epsg:2721 4 0x1.7p6 0x1.4p2 +REG epsg:27210 0 0x1.5f47b2e77832p7 -0x1.3c198a134391dp5 +REG epsg:27210 1 0x1.52516d89b1a66p7 -0x1.64198a134391dp5 +REG epsg:27210 2 -0x1.63c207bac1426p7 -0x1.64198a134391dp5 +REG epsg:27210 3 0x1.52516d89b1a66p7 -0x1.14198a134391dp5 +REG epsg:27210 4 -0x1.63c207bac1426p7 -0x1.14198a134391dp5 +REG epsg:27211 0 0x1.5ef9e83135d33p7 -0x1.41ef81fb471bcp5 +REG epsg:27211 1 0x1.51e026a8f1ep7 -0x1.69ef81fb471bcp5 +REG epsg:27211 2 -0x1.63ec56468639ap7 -0x1.69ef81fb471bcp5 +REG epsg:27211 3 0x1.51e026a8f1ep7 -0x1.19ef81fb471bcp5 +REG epsg:27211 4 -0x1.63ec56468639ap7 -0x1.19ef81fb471bcp5 +REG epsg:27212 0 0x1.5f4b716a5ed1fp7 -0x1.47677da7fb445p5 +REG epsg:27212 1 0x1.520f3c2541e8ep7 -0x1.6f677da7fb445p5 +REG epsg:27212 2 -0x1.637859508445p7 -0x1.6f677da7fb445p5 +REG epsg:27212 3 0x1.520f3c2541e8ep7 -0x1.1f677da7fb445p5 +REG epsg:27212 4 -0x1.637859508445p7 -0x1.1f677da7fb445p5 +REG epsg:27213 0 0x1.5d8da18b5f147p7 -0x1.4a691a45555cbp5 +REG epsg:27213 1 0x1.503df8e74414dp7 -0x1.72691a45555cbp5 +REG epsg:27213 2 -0x1.6522b5d085ebfp7 -0x1.72691a45555cbp5 +REG epsg:27213 3 0x1.503df8e74414dp7 -0x1.22691a45555cbp5 +REG epsg:27213 4 -0x1.6522b5d085ebfp7 -0x1.22691a45555cbp5 +REG epsg:27214 0 0x1.5958167a95c85p7 -0x1.45b7d398810c4p5 +REG epsg:27214 1 0x1.4c26a10c601e2p7 -0x1.6db7d398810c4p5 +REG epsg:27214 2 0x1.66898be8cb728p7 -0x1.6db7d398810c4p5 +REG epsg:27214 3 0x1.4c26a10c601e2p7 -0x1.1db7d398810c4p5 +REG epsg:27214 4 0x1.66898be8cb728p7 -0x1.1db7d398810c4p5 +REG epsg:27215 0 0x1.5a99400d66021p7 -0x1.4a324480d9deep5 +REG epsg:27215 1 0x1.4d4afd53a11a7p7 -0x1.72324480d9deep5 +REG epsg:27215 2 0x1.67e782c72ae9bp7 -0x1.72324480d9deep5 +REG epsg:27215 3 0x1.4d4afd53a11a7p7 -0x1.22324480d9deep5 +REG epsg:27215 4 0x1.67e782c72ae9bp7 -0x1.22324480d9deep5 +REG epsg:27216 0 0x1.5837d28b22f61p7 -0x1.4a51bd22944fdp5 +REG epsg:27216 1 0x1.4ae8c275d701cp7 -0x1.7251bd22944fdp5 +REG epsg:27216 2 0x1.6586e2a06eea6p7 -0x1.7251bd22944fdp5 +REG epsg:27216 3 0x1.4ae8c275d701cp7 -0x1.2251bd22944fdp5 +REG epsg:27216 4 0x1.6586e2a06eea6p7 -0x1.2251bd22944fdp5 +REG epsg:27217 0 0x1.57299aeb022a3p7 -0x1.4e7c8635dfcdbp5 +REG epsg:27217 1 0x1.49befa83ac74bp7 -0x1.767c8635dfcdbp5 +REG epsg:27217 2 0x1.64943b5257dfbp7 -0x1.767c8635dfcdbp5 +REG epsg:27217 3 0x1.49befa83ac74bp7 -0x1.267c8635dfcdbp5 +REG epsg:27217 4 0x1.64943b5257dfbp7 -0x1.267c8635dfcdbp5 +REG epsg:27218 0 0x1.57197b9fe347fp7 -0x1.52ab67e7cf57ep5 +REG epsg:27218 1 0x1.499271bc4bd97p7 -0x1.7aab67e7cf57ep5 +REG epsg:27218 2 0x1.64a085837ab67p7 -0x1.7aab67e7cf57ep5 +REG epsg:27218 3 0x1.499271bc4bd97p7 -0x1.2aab67e7cf57ep5 +REG epsg:27218 4 0x1.64a085837ab67p7 -0x1.2aab67e7cf57ep5 +REG epsg:27219 0 0x1.5a0530341bc04p7 -0x1.55834f8e24622p5 +REG epsg:27219 1 0x1.4c6a6697370eep7 -0x1.7d834f8e24622p5 +REG epsg:27219 2 0x1.679ff9d10071ap7 -0x1.7d834f8e24622p5 +REG epsg:27219 3 0x1.4c6a6697370eep7 -0x1.2d834f8e24622p5 +REG epsg:27219 4 0x1.679ff9d10071ap7 -0x1.2d834f8e24622p5 +REG epsg:2722 0 0x1.68p6 0x0.0p0 +REG epsg:2722 1 0x1.54p6 -0x1.4p2 +REG epsg:2722 2 0x1.7cp6 -0x1.4p2 +REG epsg:2722 3 0x1.54p6 0x1.4p2 +REG epsg:2722 4 0x1.7cp6 0x1.4p2 +REG epsg:27220 0 0x1.5b9aa97538618p7 -0x1.4c5b1bd35387ep5 +REG epsg:27220 1 0x1.4e3e37fccbdf4p7 -0x1.745b1bd35387ep5 +REG epsg:27220 2 -0x1.6708e5125b1c4p7 -0x1.745b1bd35387ep5 +REG epsg:27220 3 0x1.4e3e37fccbdf4p7 -0x1.245b1bd35387ep5 +REG epsg:27220 4 -0x1.6708e5125b1c4p7 -0x1.245b1bd35387ep5 +REG epsg:27221 0 0x1.55f5c1b54195dp7 -0x1.5717302d957c6p5 +REG epsg:27221 1 0x1.484fdb128409dp7 -0x1.7f17302d957c6p5 +REG epsg:27221 2 0x1.639ba857ff21dp7 -0x1.7f17302d957c6p5 +REG epsg:27221 3 0x1.484fdb128409dp7 -0x1.2f17302d957c6p5 +REG epsg:27221 4 0x1.639ba857ff21dp7 -0x1.2f17302d957c6p5 +REG epsg:27222 0 0x1.5485981221b23p7 -0x1.58e18adc972d5p5 +REG epsg:27222 1 0x1.46d2f1a8d1894p7 -0x1.80e18adc972d5p5 +REG epsg:27222 2 0x1.62383e7b71db2p7 -0x1.80e18adc972d5p5 +REG epsg:27222 3 0x1.46d2f1a8d1894p7 -0x1.30e18adc972d5p5 +REG epsg:27222 4 0x1.62383e7b71db2p7 -0x1.30e18adc972d5p5 +REG epsg:27223 0 0x1.513668a0d349cp7 -0x1.5fd28a522db26p5 +REG epsg:27223 1 0x1.4350ebaa964f9p7 -0x1.87d28a522db26p5 +REG epsg:27223 2 0x1.5f1be5971043fp7 -0x1.87d28a522db26p5 +REG epsg:27223 3 0x1.4350ebaa964f9p7 -0x1.37d28a522db26p5 +REG epsg:27223 4 0x1.5f1be5971043fp7 -0x1.37d28a522db26p5 +REG epsg:27224 0 0x1.597452b7a48e2p7 -0x1.5cb9a03281a42p5 +REG epsg:27224 1 0x1.4ba5ccf50d806p7 -0x1.84b9a03281a42p5 +REG epsg:27224 2 0x1.6742d87a3b9bep7 -0x1.84b9a03281a42p5 +REG epsg:27224 3 0x1.4ba5ccf50d806p7 -0x1.34b9a03281a42p5 +REG epsg:27224 4 0x1.6742d87a3b9bep7 -0x1.34b9a03281a42p5 +REG epsg:27225 0 0x1.56b8b406148d8p7 -0x1.5dfd5c7be9fccp5 +REG epsg:27225 1 0x1.48e0dc10f6644p7 -0x1.85fd5c7be9fccp5 +REG epsg:27225 2 0x1.64908bfb32b6cp7 -0x1.85fd5c7be9fccp5 +REG epsg:27225 3 0x1.48e0dc10f6644p7 -0x1.35fd5c7be9fccp5 +REG epsg:27225 4 0x1.64908bfb32b6cp7 -0x1.35fd5c7be9fccp5 +REG epsg:27226 0 0x1.561d4ffb31abbp7 -0x1.6337bf4f060f7p5 +REG epsg:27226 1 0x1.481e1d43cbbb2p7 -0x1.8b37bf4f060f7p5 +REG epsg:27226 2 0x1.641c82b2979c4p7 -0x1.8b37bf4f060f7p5 +REG epsg:27226 3 0x1.481e1d43cbbb2p7 -0x1.3b37bf4f060f7p5 +REG epsg:27226 4 0x1.641c82b2979c4p7 -0x1.3b37bf4f060f7p5 +REG epsg:27227 0 0x1.52ef7d9822e89p7 -0x1.65e1d42cb3ecep5 +REG epsg:27227 1 0x1.44dbb765e59f3p7 -0x1.8de1d42cb3ecep5 +REG epsg:27227 2 0x1.610343ca6031fp7 -0x1.8de1d42cb3ecep5 +REG epsg:27227 3 0x1.44dbb765e59f3p7 -0x1.3de1d42cb3ecep5 +REG epsg:27227 4 0x1.610343ca6031fp7 -0x1.3de1d42cb3ecep5 +REG epsg:27228 0 0x1.50cc1ab2d9f44p7 -0x1.69102f3ac7c3cp5 +REG epsg:27228 1 0x1.429f4a5bee54dp7 -0x1.91102f3ac7c3cp5 +REG epsg:27228 2 0x1.5ef8eb09c593bp7 -0x1.91102f3ac7c3cp5 +REG epsg:27228 3 0x1.429f4a5bee54dp7 -0x1.41102f3ac7c3cp5 +REG epsg:27228 4 0x1.5ef8eb09c593bp7 -0x1.41102f3ac7c3cp5 +REG epsg:27229 0 0x1.4f7a4c1747a3ep7 -0x1.6c8282dd4ddcbp5 +REG epsg:27229 1 0x1.4131c203801f3p7 -0x1.948282dd4ddcbp5 +REG epsg:27229 2 0x1.5dc2d62b0f289p7 -0x1.948282dd4ddcbp5 +REG epsg:27229 3 0x1.4131c203801f3p7 -0x1.448282dd4ddcbp5 +REG epsg:27229 4 0x1.5dc2d62b0f289p7 -0x1.448282dd4ddcbp5 +REG epsg:2723 0 0x1.74p6 0x0.0p0 +REG epsg:2723 1 0x1.6p6 -0x1.4p2 +REG epsg:2723 2 0x1.88p6 -0x1.4p2 +REG epsg:2723 3 0x1.6p6 0x1.4p2 +REG epsg:2723 4 0x1.88p6 0x1.4p2 +REG epsg:27230 0 0x1.5541d739c683bp7 -0x1.6e879216bea04p5 +REG epsg:27230 1 0x1.46e8c24595a63p7 -0x1.96879216bea04p5 +REG epsg:27230 2 0x1.639aec2df7613p7 -0x1.96879216bea04p5 +REG epsg:27230 3 0x1.46e8c24595a63p7 -0x1.46879216bea04p5 +REG epsg:27230 4 0x1.639aec2df7613p7 -0x1.46879216bea04p5 +REG epsg:27231 0 0x1.5490af851cdb1p7 -0x1.6ee4611df8506p5 +REG epsg:27231 1 0x1.46349c6fbe456p7 -0x1.96e4611df8506p5 +REG epsg:27231 2 0x1.62ecc29a7b70cp7 -0x1.96e4611df8506p5 +REG epsg:27231 3 0x1.46349c6fbe456p7 -0x1.46e4611df8506p5 +REG epsg:27231 4 0x1.62ecc29a7b70cp7 -0x1.46e4611df8506p5 +REG epsg:27232 0 0x1.50af8ceb356dap7 -0x1.74ccd1d6c8103p5 +REG epsg:27232 1 0x1.4221ad8fc3657p7 -0x1.9cccd1d6c8103p5 +REG epsg:27232 2 0x1.5f3d6c46a775dp7 -0x1.9cccd1d6c8103p5 +REG epsg:27232 3 0x1.4221ad8fc3657p7 -0x1.4cccd1d6c8103p5 +REG epsg:27232 4 0x1.5f3d6c46a775dp7 -0x1.4cccd1d6c8103p5 +REG epsg:2724 0 0x1.8p6 0x0.0p0 +REG epsg:2724 1 0x1.6cp6 -0x1.4p2 +REG epsg:2724 2 0x1.94p6 -0x1.4p2 +REG epsg:2724 3 0x1.6cp6 0x1.4p2 +REG epsg:2724 4 0x1.94p6 0x1.4p2 +REG epsg:2725 0 0x1.8cp6 0x0.0p0 +REG epsg:2725 1 0x1.78p6 -0x1.4p2 +REG epsg:2725 2 0x1.ap6 -0x1.4p2 +REG epsg:2725 3 0x1.78p6 0x1.4p2 +REG epsg:2725 4 0x1.ap6 0x1.4p2 +REG epsg:27258 0 0x1.4ap7 -0x1.9p4 +REG epsg:27258 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:27258 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:27258 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:27258 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:27259 0 0x1.56p7 -0x1.9p4 +REG epsg:27259 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:27259 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:27259 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:27259 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:2726 0 0x1.98p6 0x0.0p0 +REG epsg:2726 1 0x1.84p6 -0x1.4p2 +REG epsg:2726 2 0x1.acp6 -0x1.4p2 +REG epsg:2726 3 0x1.84p6 0x1.4p2 +REG epsg:2726 4 0x1.acp6 0x1.4p2 +REG epsg:27260 0 0x1.62p7 -0x1.9p4 +REG epsg:27260 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:27260 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:27260 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:27260 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:2727 0 0x1.a4p6 0x0.0p0 +REG epsg:2727 1 0x1.9p6 -0x1.4p2 +REG epsg:2727 2 0x1.b8p6 -0x1.4p2 +REG epsg:2727 3 0x1.9p6 0x1.4p2 +REG epsg:2727 4 0x1.b8p6 0x1.4p2 +REG epsg:2728 0 0x1.bp6 0x0.0p0 +REG epsg:2728 1 0x1.9cp6 -0x1.4p2 +REG epsg:2728 2 0x1.c4p6 -0x1.4p2 +REG epsg:2728 3 0x1.9cp6 0x1.4p2 +REG epsg:2728 4 0x1.c4p6 0x1.4p2 +REG epsg:2729 0 0x1.bcp6 0x0.0p0 +REG epsg:2729 1 0x1.a8p6 -0x1.4p2 +REG epsg:2729 2 0x1.dp6 -0x1.4p2 +REG epsg:2729 3 0x1.a8p6 0x1.4p2 +REG epsg:2729 4 0x1.dp6 0x1.4p2 +REG epsg:27291 0 0x1.5fp7 -0x1.38p5 +REG epsg:27291 1 0x1.5221e5403abcap7 -0x1.6p5 +REG epsg:27291 2 -0x1.6421e5403abcap7 -0x1.6p5 +REG epsg:27291 3 0x1.5221e5403abcap7 -0x1.1p5 +REG epsg:27291 4 -0x1.6421e5403abcap7 -0x1.1p5 +REG epsg:27292 0 0x1.57p7 -0x1.6p5 +REG epsg:27292 1 0x1.49192e6394ef4p7 -0x1.88p5 +REG epsg:27292 2 0x1.64e6d19c6b10cp7 -0x1.88p5 +REG epsg:27292 3 0x1.49192e6394ef4p7 -0x1.38p5 +REG epsg:27292 4 0x1.64e6d19c6b10cp7 -0x1.38p5 +REG epsg:2730 0 0x1.c8p6 0x0.0p0 +REG epsg:2730 1 0x1.b4p6 -0x1.4p2 +REG epsg:2730 2 0x1.dcp6 -0x1.4p2 +REG epsg:2730 3 0x1.b4p6 0x1.4p2 +REG epsg:2730 4 0x1.dcp6 0x1.4p2 +REG epsg:2731 0 0x1.d4p6 0x0.0p0 +REG epsg:2731 1 0x1.cp6 -0x1.4p2 +REG epsg:2731 2 0x1.e8p6 -0x1.4p2 +REG epsg:2731 3 0x1.cp6 0x1.4p2 +REG epsg:2731 4 0x1.e8p6 0x1.4p2 +REG epsg:2732 0 0x1.ep6 0x0.0p0 +REG epsg:2732 1 0x1.ccp6 -0x1.4p2 +REG epsg:2732 2 0x1.f4p6 -0x1.4p2 +REG epsg:2732 3 0x1.ccp6 0x1.4p2 +REG epsg:2732 4 0x1.f4p6 0x1.4p2 +REG epsg:2733 0 0x1.ecp6 0x0.0p0 +REG epsg:2733 1 0x1.d8p6 -0x1.4p2 +REG epsg:2733 2 0x1.0p7 -0x1.4p2 +REG epsg:2733 3 0x1.d8p6 0x1.4p2 +REG epsg:2733 4 0x1.0p7 0x1.4p2 +REG epsg:2734 0 0x1.f8p6 0x0.0p0 +REG epsg:2734 1 0x1.e4p6 -0x1.4p2 +REG epsg:2734 2 0x1.06p7 -0x1.4p2 +REG epsg:2734 3 0x1.e4p6 0x1.4p2 +REG epsg:2734 4 0x1.06p7 0x1.4p2 +REG epsg:2735 0 0x1.02p7 0x0.0p0 +REG epsg:2735 1 0x1.fp6 -0x1.4p2 +REG epsg:2735 2 0x1.0cp7 -0x1.4p2 +REG epsg:2735 3 0x1.fp6 0x1.4p2 +REG epsg:2735 4 0x1.0cp7 0x1.4p2 +REG epsg:2736 0 0x1.08p5 -0x1.9p4 +REG epsg:2736 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:2736 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:2736 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:2736 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:2737 0 0x1.38p5 -0x1.9p4 +REG epsg:2737 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:2737 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:2737 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2737 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:2738 0 0x1.08p7 0x0.0p0 +REG epsg:2738 1 0x1.fcp6 -0x1.4p2 +REG epsg:2738 2 0x1.12p7 -0x1.4p2 +REG epsg:2738 3 0x1.fcp6 0x1.4p2 +REG epsg:2738 4 0x1.12p7 0x1.4p2 +REG epsg:2739 0 0x1.0ep7 0x0.0p0 +REG epsg:2739 1 0x1.04p7 -0x1.4p2 +REG epsg:2739 2 0x1.18p7 -0x1.4p2 +REG epsg:2739 3 0x1.04p7 0x1.4p2 +REG epsg:2739 4 0x1.18p7 0x1.4p2 +REG epsg:27391 0 -0x1.2aaaaaaaaaaabp2 0x1.dp5 +REG epsg:27391 1 -0x1.c344206bb5f36p3 0x1.a8p5 +REG epsg:27391 2 0x1.3132eb8216917p2 0x1.a8p5 +REG epsg:27391 3 -0x1.c344206bb5f36p3 0x1.f8p5 +REG epsg:27391 4 0x1.3132eb8216917p2 0x1.f8p5 +REG epsg:27392 0 -0x1.2aaaaaaaaaaaap1 0x1.dp5 +REG epsg:27392 1 -0x1.789975c10b48cp3 0x1.a8p5 +REG epsg:27392 2 0x1.c68840d76be6dp2 0x1.a8p5 +REG epsg:27392 3 -0x1.789975c10b48cp3 0x1.f8p5 +REG epsg:27392 4 0x1.c68840d76be6dp2 0x1.f8p5 +REG epsg:27393 0 0x0.0p0 0x1.dp5 +REG epsg:27393 1 -0x1.2deecb16609e1p3 0x1.a8p5 +REG epsg:27393 2 0x1.2deecb16609e1p3 0x1.a8p5 +REG epsg:27393 3 -0x1.2deecb16609e1p3 0x1.f8p5 +REG epsg:27393 4 0x1.2deecb16609e1p3 0x1.f8p5 +REG epsg:27394 0 0x1.4p1 0x1.dp5 +REG epsg:27394 1 -0x1.bbdd962cc13c2p2 0x1.a8p5 +REG epsg:27394 2 0x1.7deecb16609e1p3 0x1.a8p5 +REG epsg:27394 3 -0x1.bbdd962cc13c2p2 0x1.f8p5 +REG epsg:27394 4 0x1.7deecb16609e1p3 0x1.f8p5 +REG epsg:27395 0 0x1.8aaaaaaaaaaabp2 0x1.dp5 +REG epsg:27395 1 -0x1.a265d7042d22ep1 0x1.a8p5 +REG epsg:27395 2 0x1.f344206bb5f36p3 0x1.a8p5 +REG epsg:27395 3 -0x1.a265d7042d22ep1 0x1.f8p5 +REG epsg:27395 4 0x1.f344206bb5f36p3 0x1.f8p5 +REG epsg:27396 0 0x1.4555555555557p3 0x1.dp5 +REG epsg:27396 1 0x1.7668a3ef4b76p-1 0x1.a8p5 +REG epsg:27396 2 0x1.39a21035daf9cp4 0x1.a8p5 +REG epsg:27396 3 0x1.7668a3ef4b76p-1 0x1.f8p5 +REG epsg:27396 4 0x1.39a21035daf9cp4 0x1.f8p5 +REG epsg:27397 0 0x1.c555555555557p3 0x1.dp5 +REG epsg:27397 1 0x1.2ecd147de96ecp2 0x1.a8p5 +REG epsg:27397 2 0x1.79a21035daf9cp4 0x1.a8p5 +REG epsg:27397 3 0x1.2ecd147de96ecp2 0x1.f8p5 +REG epsg:27397 4 0x1.79a21035daf9cp4 0x1.f8p5 +REG epsg:27398 0 0x1.2555555555554p4 0x1.dp5 +REG epsg:27398 1 0x1.1cbbdf944a0c7p3 0x1.a8p5 +REG epsg:27398 2 0x1.bc4cbae085a44p4 0x1.a8p5 +REG epsg:27398 3 0x1.1cbbdf944a0c7p3 0x1.f8p5 +REG epsg:27398 4 0x1.bc4cbae085a44p4 0x1.f8p5 +REG epsg:2740 0 0x1.14p7 0x0.0p0 +REG epsg:2740 1 0x1.0ap7 -0x1.4p2 +REG epsg:2740 2 0x1.1ep7 -0x1.4p2 +REG epsg:2740 3 0x1.0ap7 0x1.4p2 +REG epsg:2740 4 0x1.1ep7 0x1.4p2 +REG epsg:2741 0 0x1.1ap7 0x0.0p0 +REG epsg:2741 1 0x1.1p7 -0x1.4p2 +REG epsg:2741 2 0x1.24p7 -0x1.4p2 +REG epsg:2741 3 0x1.1p7 0x1.4p2 +REG epsg:2741 4 0x1.24p7 0x1.4p2 +REG epsg:2742 0 0x1.2p7 0x0.0p0 +REG epsg:2742 1 0x1.16p7 -0x1.4p2 +REG epsg:2742 2 0x1.2ap7 -0x1.4p2 +REG epsg:2742 3 0x1.16p7 0x1.4p2 +REG epsg:2742 4 0x1.2ap7 0x1.4p2 +REG epsg:27429 0 -0x1.2p3 0x0.0p0 +REG epsg:27429 1 -0x1.cp3 -0x1.4p2 +REG epsg:27429 2 -0x1.0p2 -0x1.4p2 +REG epsg:27429 3 -0x1.cp3 0x1.4p2 +REG epsg:27429 4 -0x1.0p2 0x1.4p2 +REG epsg:2743 0 0x1.26p7 0x0.0p0 +REG epsg:2743 1 0x1.1cp7 -0x1.4p2 +REG epsg:2743 2 0x1.3p7 -0x1.4p2 +REG epsg:2743 3 0x1.1cp7 0x1.4p2 +REG epsg:2743 4 0x1.3p7 0x1.4p2 +REG epsg:2744 0 0x1.2cp7 0x0.0p0 +REG epsg:2744 1 0x1.22p7 -0x1.4p2 +REG epsg:2744 2 0x1.36p7 -0x1.4p2 +REG epsg:2744 3 0x1.22p7 0x1.4p2 +REG epsg:2744 4 0x1.36p7 0x1.4p2 +REG epsg:2745 0 0x1.32p7 0x0.0p0 +REG epsg:2745 1 0x1.28p7 -0x1.4p2 +REG epsg:2745 2 0x1.3cp7 -0x1.4p2 +REG epsg:2745 3 0x1.28p7 0x1.4p2 +REG epsg:2745 4 0x1.3cp7 0x1.4p2 +REG epsg:2746 0 0x1.38p7 0x0.0p0 +REG epsg:2746 1 0x1.2ep7 -0x1.4p2 +REG epsg:2746 2 0x1.42p7 -0x1.4p2 +REG epsg:2746 3 0x1.2ep7 0x1.4p2 +REG epsg:2746 4 0x1.42p7 0x1.4p2 +REG epsg:2747 0 0x1.3ep7 0x0.0p0 +REG epsg:2747 1 0x1.34p7 -0x1.4p2 +REG epsg:2747 2 0x1.48p7 -0x1.4p2 +REG epsg:2747 3 0x1.34p7 0x1.4p2 +REG epsg:2747 4 0x1.48p7 0x1.4p2 +REG epsg:2748 0 0x1.44p7 0x0.0p0 +REG epsg:2748 1 0x1.3ap7 -0x1.4p2 +REG epsg:2748 2 0x1.4ep7 -0x1.4p2 +REG epsg:2748 3 0x1.3ap7 0x1.4p2 +REG epsg:2748 4 0x1.4ep7 0x1.4p2 +REG epsg:2749 0 0x1.4ap7 0x0.0p0 +REG epsg:2749 1 0x1.4p7 -0x1.4p2 +REG epsg:2749 2 0x1.54p7 -0x1.4p2 +REG epsg:2749 3 0x1.4p7 0x1.4p2 +REG epsg:2749 4 0x1.54p7 0x1.4p2 +REG epsg:27492 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG epsg:27492 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG epsg:27492 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG epsg:27492 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG epsg:27492 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG epsg:27493 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG epsg:27493 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG epsg:27493 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG epsg:27493 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG epsg:27493 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG epsg:2750 0 0x1.5p7 0x0.0p0 +REG epsg:2750 1 0x1.46p7 -0x1.4p2 +REG epsg:2750 2 0x1.5ap7 -0x1.4p2 +REG epsg:2750 3 0x1.46p7 0x1.4p2 +REG epsg:2750 4 0x1.5ap7 0x1.4p2 +REG epsg:27500 0 0x1.5999999999998p2 0x1.8c00000000001p5 +REG epsg:27500 1 -0x1.26408f5ee218cp1 0x1.6400000000001p5 +REG epsg:27500 2 0x1.a329bd71521fbp3 0x1.6400000000001p5 +REG epsg:27500 3 -0x1.26408f5ee218cp1 0x1.b400000000001p5 +REG epsg:27500 4 0x1.a329bd71521fbp3 0x1.b400000000001p5 +REG epsg:2751 0 0x1.56p7 0x0.0p0 +REG epsg:2751 1 0x1.4cp7 -0x1.4p2 +REG epsg:2751 2 0x1.6p7 -0x1.4p2 +REG epsg:2751 3 0x1.4cp7 0x1.4p2 +REG epsg:2751 4 0x1.6p7 0x1.4p2 +REG epsg:2752 0 0x1.5cp7 0x0.0p0 +REG epsg:2752 1 0x1.52p7 -0x1.4p2 +REG epsg:2752 2 0x1.66p7 -0x1.4p2 +REG epsg:2752 3 0x1.52p7 0x1.4p2 +REG epsg:2752 4 0x1.66p7 0x1.4p2 +REG epsg:2753 0 0x1.62p7 0x0.0p0 +REG epsg:2753 1 0x1.58p7 -0x1.4p2 +REG epsg:2753 2 -0x1.64p7 -0x1.4p2 +REG epsg:2753 3 0x1.58p7 0x1.4p2 +REG epsg:2753 4 -0x1.64p7 0x1.4p2 +REG epsg:2754 0 -0x1.68p7 0x0.0p0 +REG epsg:2754 1 0x1.5ep7 -0x1.4p2 +REG epsg:2754 2 -0x1.5ep7 -0x1.4p2 +REG epsg:2754 3 0x1.5ep7 0x1.4p2 +REG epsg:2754 4 -0x1.5ep7 0x1.4p2 +REG epsg:2755 0 -0x1.62p7 0x0.0p0 +REG epsg:2755 1 0x1.64p7 -0x1.4p2 +REG epsg:2755 2 -0x1.58p7 -0x1.4p2 +REG epsg:2755 3 0x1.64p7 0x1.4p2 +REG epsg:2755 4 -0x1.58p7 0x1.4p2 +REG epsg:2756 0 -0x1.5cp7 0x0.0p0 +REG epsg:2756 1 -0x1.66p7 -0x1.4p2 +REG epsg:2756 2 -0x1.52p7 -0x1.4p2 +REG epsg:2756 3 -0x1.66p7 0x1.4p2 +REG epsg:2756 4 -0x1.52p7 0x1.4p2 +REG epsg:27561 0 0x0.0p0 0x1.8c00000000001p5 +REG epsg:27561 1 -0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27561 2 0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27561 3 -0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27561 4 0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27562 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:27562 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27562 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27562 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27562 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27563 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:27563 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27563 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27563 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27563 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27564 0 0x0.0p0 0x1.5151eb851eb87p5 +REG epsg:27564 1 -0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27564 2 0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27564 3 -0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:27564 4 0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:2757 0 -0x1.56p7 0x0.0p0 +REG epsg:2757 1 -0x1.6p7 -0x1.4p2 +REG epsg:2757 2 -0x1.4cp7 -0x1.4p2 +REG epsg:2757 3 -0x1.6p7 0x1.4p2 +REG epsg:2757 4 -0x1.4cp7 0x1.4p2 +REG epsg:27571 0 0x0.0p0 0x1.8c00000000001p5 +REG epsg:27571 1 -0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27571 2 0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27571 3 -0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27571 4 0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27572 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:27572 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27572 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27572 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27572 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27573 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:27573 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27573 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27573 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27573 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27574 0 0x0.0p0 0x1.5151eb851eb87p5 +REG epsg:27574 1 -0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27574 2 0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27574 3 -0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:27574 4 0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:2758 0 -0x1.5p7 0x0.0p0 +REG epsg:2758 1 -0x1.5ap7 -0x1.4p2 +REG epsg:2758 2 -0x1.46p7 -0x1.4p2 +REG epsg:2758 3 -0x1.5ap7 0x1.4p2 +REG epsg:2758 4 -0x1.46p7 0x1.4p2 +REG epsg:27581 0 0x0.0p0 0x1.8c00000000001p5 +REG epsg:27581 1 -0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27581 2 0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27581 3 -0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27581 4 0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27582 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:27582 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27582 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27582 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27582 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27583 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:27583 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27583 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27583 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27583 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27584 0 0x0.0p0 0x1.5151eb851eb87p5 +REG epsg:27584 1 -0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27584 2 0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27584 3 -0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:27584 4 0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:2759 0 -0x1.5755555555555p6 0x1.e8p4 +REG epsg:2759 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG epsg:2759 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG epsg:2759 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG epsg:2759 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG epsg:27591 0 0x0.0p0 0x1.8c00000000001p5 +REG epsg:27591 1 -0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27591 2 0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:27591 3 -0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27591 4 0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:27592 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:27592 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27592 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:27592 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27592 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:27593 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:27593 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27593 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:27593 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27593 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:27594 0 0x0.0p0 0x1.5151eb851eb87p5 +REG epsg:27594 1 -0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27594 2 0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:27594 3 -0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:27594 4 0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:2760 0 -0x1.5ep6 0x1.ep4 +REG epsg:2760 1 -0x1.75181116f43fep6 0x1.9p4 +REG epsg:2760 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG epsg:2760 3 -0x1.75181116f43fep6 0x1.18p5 +REG epsg:2760 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG epsg:2761 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:2761 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:2761 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:2761 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:2761 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:2762 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:2762 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:2762 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:2762 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:2762 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:2763 0 -0x1.c7p6 0x1.fp4 +REG epsg:2763 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:2763 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:2763 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:2763 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:2764 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:2764 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:2764 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:2764 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:2764 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:2765 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:2765 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:2765 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:2765 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:2765 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:2766 0 -0x1.e8p6 0x1.44p5 +REG epsg:2766 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:2766 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:2766 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:2766 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:2767 0 -0x1.e8p6 0x1.36p5 +REG epsg:2767 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:2767 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:2767 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:2767 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:2768 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:2768 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:2768 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:2768 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:2768 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:2769 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:2769 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:2769 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:2769 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:2769 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:2770 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:2770 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:2770 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:2770 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:2770 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:27700 0 -0x1.0p1 0x1.88p5 +REG epsg:27700 1 -0x1.33e1680be4906p3 0x1.6p5 +REG epsg:27700 2 0x1.67c2d017c920cp2 0x1.6p5 +REG epsg:27700 3 -0x1.33e1680be4906p3 0x1.bp5 +REG epsg:27700 4 0x1.67c2d017c920cp2 0x1.bp5 +REG epsg:2771 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:2771 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:2771 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:2771 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:2771 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:2772 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:2772 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:2772 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:2772 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:2772 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:2773 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:2773 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:2773 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:2773 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:2773 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:2774 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:2774 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:2774 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:2774 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:2774 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:2775 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:2775 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:2775 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:2775 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:2775 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:2776 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:2776 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:2776 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:2776 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:2776 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:2777 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:2777 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:2777 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:2777 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:2777 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2778 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:2778 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:2778 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:2778 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:2778 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2779 0 -0x1.52p6 0x1.dep4 +REG epsg:2779 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:2779 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:2779 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:2779 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:2780 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:2780 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:2780 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:2780 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:2780 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:2781 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:2781 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:2781 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:2781 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:2781 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:2782 0 -0x1.37p7 0x1.2d55555555554p4 +REG epsg:2782 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG epsg:2782 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG epsg:2782 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG epsg:2782 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG epsg:2783 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG epsg:2783 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG epsg:2783 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG epsg:2783 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG epsg:2783 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG epsg:2784 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:2784 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:2784 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:2784 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:2784 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:2785 0 -0x1.3fp7 0x1.5d55555555554p4 +REG epsg:2785 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG epsg:2785 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG epsg:2785 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG epsg:2785 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG epsg:2786 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG epsg:2786 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG epsg:2786 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG epsg:2786 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG epsg:2786 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG epsg:2787 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:2787 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:2787 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:2787 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:2787 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:2788 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:2788 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:2788 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:2788 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:2788 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2789 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:2789 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:2789 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:2789 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:2789 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2790 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:2790 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:2790 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:2790 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:2790 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:2791 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:2791 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:2791 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:2791 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:2791 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:2792 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:2792 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:2792 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:2792 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:2792 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:2793 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:2793 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:2793 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:2793 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:2793 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:2794 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:2794 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:2794 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:2794 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:2794 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:2795 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:2795 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:2795 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:2795 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:2795 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:2796 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:2796 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:2796 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:2796 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:2796 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:2797 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:2797 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:2797 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:2797 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:2797 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:2798 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:2798 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:2798 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:2798 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:2798 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:2799 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:2799 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:2799 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:2799 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:2799 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:2800 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:2800 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:2800 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:2800 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:2800 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:2801 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:2801 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:2801 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:2801 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:2801 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:2802 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:2802 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:2802 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:2802 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:2802 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:2803 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:2803 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:2803 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:2803 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:2803 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:2804 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:2804 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:2804 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:2804 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:2804 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:2805 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:2805 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:2805 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:2805 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:2805 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:2806 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:2806 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:2806 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:2806 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:2806 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:2807 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:2807 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:2807 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:2807 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:2807 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:2808 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:2808 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:2808 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:2808 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:2808 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:2809 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:2809 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:2809 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:2809 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:2809 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:2810 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:2810 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:2810 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:2810 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:2810 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:2811 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:2811 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:2811 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:2811 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:2811 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:2812 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:2812 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:2812 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:2812 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:2812 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:2813 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:2813 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:2813 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:2813 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:2813 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:2814 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:2814 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:2814 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:2814 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:2814 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:2815 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG epsg:2815 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:2815 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:2815 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:2815 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:2816 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG epsg:2816 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:2816 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:2816 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:2816 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:2817 0 -0x1.7ap6 0x1.2155555555554p5 +REG epsg:2817 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG epsg:2817 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG epsg:2817 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG epsg:2817 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG epsg:2818 0 -0x1.b6p6 0x1.75p5 +REG epsg:2818 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:2818 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:2818 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:2818 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:2819 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:2819 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:2819 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:2819 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:2819 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:28191 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG epsg:28191 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG epsg:28191 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG epsg:28191 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG epsg:28191 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG epsg:28192 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG epsg:28192 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG epsg:28192 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG epsg:28192 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG epsg:28192 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG epsg:28193 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG epsg:28193 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG epsg:28193 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG epsg:28193 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG epsg:28193 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG epsg:2820 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:2820 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:2820 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:2820 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:2820 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:2821 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:2821 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:2821 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:2821 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:2821 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:2822 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:2822 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:2822 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:2822 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:2822 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:2823 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:2823 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:2823 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:2823 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:2823 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:28232 0 0x1.2p3 -0x1.9p4 +REG epsg:28232 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:28232 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:28232 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:28232 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:2824 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:2824 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2824 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2824 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2824 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2825 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:2825 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:2825 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:2825 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:2825 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:2826 0 -0x1.a9p6 0x1.fp4 +REG epsg:2826 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:2826 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:2826 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:2826 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:2827 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:2827 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:2827 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:2827 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:2827 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:2828 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:2828 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2828 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2828 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2828 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2829 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:2829 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:2829 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:2829 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:2829 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:2830 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:2830 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:2830 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:2830 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:2830 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:2831 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:2831 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:2831 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:2831 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:2831 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:2832 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:2832 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:2832 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:2832 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:2832 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:2833 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:2833 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:2833 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:2833 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:2833 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:2834 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:2834 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:2834 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:2834 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:2834 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:28348 0 0x1.a4p6 -0x1.9p4 +REG epsg:28348 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:28348 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:28348 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:28348 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:28349 0 0x1.bcp6 -0x1.9p4 +REG epsg:28349 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:28349 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:28349 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:28349 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:2835 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:2835 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:2835 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:2835 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:2835 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:28350 0 0x1.d4p6 -0x1.9p4 +REG epsg:28350 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:28350 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:28350 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:28350 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:28351 0 0x1.ecp6 -0x1.9p4 +REG epsg:28351 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:28351 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:28351 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:28351 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:28352 0 0x1.02p7 -0x1.9p4 +REG epsg:28352 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:28352 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:28352 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:28352 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:28353 0 0x1.0ep7 -0x1.9p4 +REG epsg:28353 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:28353 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:28353 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:28353 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:28354 0 0x1.1ap7 -0x1.9p4 +REG epsg:28354 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:28354 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:28354 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:28354 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:28355 0 0x1.26p7 -0x1.9p4 +REG epsg:28355 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:28355 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:28355 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:28355 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:28356 0 0x1.32p7 -0x1.9p4 +REG epsg:28356 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:28356 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:28356 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:28356 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:28357 0 0x1.3ep7 -0x1.9p4 +REG epsg:28357 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:28357 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:28357 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:28357 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:28358 0 0x1.4ap7 -0x1.9p4 +REG epsg:28358 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:28358 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:28358 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:28358 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2836 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:2836 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:2836 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:2836 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:2836 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:2837 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:2837 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:2837 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:2837 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:2837 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:2838 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:2838 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:2838 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:2838 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:2838 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:2839 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:2839 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:2839 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:2839 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:2839 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:2840 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:2840 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:2840 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:2840 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:2840 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:28402 0 0x1.2p3 0x0.0p0 +REG epsg:28402 1 0x1.0p2 -0x1.4p2 +REG epsg:28402 2 0x1.cp3 -0x1.4p2 +REG epsg:28402 3 0x1.0p2 0x1.4p2 +REG epsg:28402 4 0x1.cp3 0x1.4p2 +REG epsg:28403 0 0x1.ep3 0x0.0p0 +REG epsg:28403 1 0x1.4p3 -0x1.4p2 +REG epsg:28403 2 0x1.4p4 -0x1.4p2 +REG epsg:28403 3 0x1.4p3 0x1.4p2 +REG epsg:28403 4 0x1.4p4 0x1.4p2 +REG epsg:28404 0 0x1.5p4 0x0.0p0 +REG epsg:28404 1 0x1.0p4 -0x1.4p2 +REG epsg:28404 2 0x1.ap4 -0x1.4p2 +REG epsg:28404 3 0x1.0p4 0x1.4p2 +REG epsg:28404 4 0x1.ap4 0x1.4p2 +REG epsg:28405 0 0x1.bp4 0x0.0p0 +REG epsg:28405 1 0x1.6p4 -0x1.4p2 +REG epsg:28405 2 0x1.0p5 -0x1.4p2 +REG epsg:28405 3 0x1.6p4 0x1.4p2 +REG epsg:28405 4 0x1.0p5 0x1.4p2 +REG epsg:28406 0 0x1.08p5 0x0.0p0 +REG epsg:28406 1 0x1.cp4 -0x1.4p2 +REG epsg:28406 2 0x1.3p5 -0x1.4p2 +REG epsg:28406 3 0x1.cp4 0x1.4p2 +REG epsg:28406 4 0x1.3p5 0x1.4p2 +REG epsg:28407 0 0x1.38p5 0x0.0p0 +REG epsg:28407 1 0x1.1p5 -0x1.4p2 +REG epsg:28407 2 0x1.6p5 -0x1.4p2 +REG epsg:28407 3 0x1.1p5 0x1.4p2 +REG epsg:28407 4 0x1.6p5 0x1.4p2 +REG epsg:28408 0 0x1.68p5 0x0.0p0 +REG epsg:28408 1 0x1.4p5 -0x1.4p2 +REG epsg:28408 2 0x1.9p5 -0x1.4p2 +REG epsg:28408 3 0x1.4p5 0x1.4p2 +REG epsg:28408 4 0x1.9p5 0x1.4p2 +REG epsg:28409 0 0x1.98p5 0x0.0p0 +REG epsg:28409 1 0x1.7p5 -0x1.4p2 +REG epsg:28409 2 0x1.cp5 -0x1.4p2 +REG epsg:28409 3 0x1.7p5 0x1.4p2 +REG epsg:28409 4 0x1.cp5 0x1.4p2 +REG epsg:2841 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:2841 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:2841 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:2841 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:2841 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:28410 0 0x1.c8p5 0x0.0p0 +REG epsg:28410 1 0x1.ap5 -0x1.4p2 +REG epsg:28410 2 0x1.fp5 -0x1.4p2 +REG epsg:28410 3 0x1.ap5 0x1.4p2 +REG epsg:28410 4 0x1.fp5 0x1.4p2 +REG epsg:28411 0 0x1.f8p5 0x0.0p0 +REG epsg:28411 1 0x1.dp5 -0x1.4p2 +REG epsg:28411 2 0x1.1p6 -0x1.4p2 +REG epsg:28411 3 0x1.dp5 0x1.4p2 +REG epsg:28411 4 0x1.1p6 0x1.4p2 +REG epsg:28412 0 0x1.14p6 0x0.0p0 +REG epsg:28412 1 0x1.0p6 -0x1.4p2 +REG epsg:28412 2 0x1.28p6 -0x1.4p2 +REG epsg:28412 3 0x1.0p6 0x1.4p2 +REG epsg:28412 4 0x1.28p6 0x1.4p2 +REG epsg:28413 0 0x1.2cp6 0x0.0p0 +REG epsg:28413 1 0x1.18p6 -0x1.4p2 +REG epsg:28413 2 0x1.4p6 -0x1.4p2 +REG epsg:28413 3 0x1.18p6 0x1.4p2 +REG epsg:28413 4 0x1.4p6 0x1.4p2 +REG epsg:28414 0 0x1.44p6 0x0.0p0 +REG epsg:28414 1 0x1.3p6 -0x1.4p2 +REG epsg:28414 2 0x1.58p6 -0x1.4p2 +REG epsg:28414 3 0x1.3p6 0x1.4p2 +REG epsg:28414 4 0x1.58p6 0x1.4p2 +REG epsg:28415 0 0x1.5cp6 0x0.0p0 +REG epsg:28415 1 0x1.48p6 -0x1.4p2 +REG epsg:28415 2 0x1.7p6 -0x1.4p2 +REG epsg:28415 3 0x1.48p6 0x1.4p2 +REG epsg:28415 4 0x1.7p6 0x1.4p2 +REG epsg:28416 0 0x1.74p6 0x0.0p0 +REG epsg:28416 1 0x1.6p6 -0x1.4p2 +REG epsg:28416 2 0x1.88p6 -0x1.4p2 +REG epsg:28416 3 0x1.6p6 0x1.4p2 +REG epsg:28416 4 0x1.88p6 0x1.4p2 +REG epsg:28417 0 0x1.8cp6 0x0.0p0 +REG epsg:28417 1 0x1.78p6 -0x1.4p2 +REG epsg:28417 2 0x1.ap6 -0x1.4p2 +REG epsg:28417 3 0x1.78p6 0x1.4p2 +REG epsg:28417 4 0x1.ap6 0x1.4p2 +REG epsg:28418 0 0x1.a4p6 0x0.0p0 +REG epsg:28418 1 0x1.9p6 -0x1.4p2 +REG epsg:28418 2 0x1.b8p6 -0x1.4p2 +REG epsg:28418 3 0x1.9p6 0x1.4p2 +REG epsg:28418 4 0x1.b8p6 0x1.4p2 +REG epsg:28419 0 0x1.bcp6 0x0.0p0 +REG epsg:28419 1 0x1.a8p6 -0x1.4p2 +REG epsg:28419 2 0x1.dp6 -0x1.4p2 +REG epsg:28419 3 0x1.a8p6 0x1.4p2 +REG epsg:28419 4 0x1.dp6 0x1.4p2 +REG epsg:2842 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:2842 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:2842 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:2842 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:2842 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:28420 0 0x1.d4p6 0x0.0p0 +REG epsg:28420 1 0x1.cp6 -0x1.4p2 +REG epsg:28420 2 0x1.e8p6 -0x1.4p2 +REG epsg:28420 3 0x1.cp6 0x1.4p2 +REG epsg:28420 4 0x1.e8p6 0x1.4p2 +REG epsg:28421 0 0x1.ecp6 0x0.0p0 +REG epsg:28421 1 0x1.d8p6 -0x1.4p2 +REG epsg:28421 2 0x1.0p7 -0x1.4p2 +REG epsg:28421 3 0x1.d8p6 0x1.4p2 +REG epsg:28421 4 0x1.0p7 0x1.4p2 +REG epsg:28422 0 0x1.02p7 0x0.0p0 +REG epsg:28422 1 0x1.fp6 -0x1.4p2 +REG epsg:28422 2 0x1.0cp7 -0x1.4p2 +REG epsg:28422 3 0x1.fp6 0x1.4p2 +REG epsg:28422 4 0x1.0cp7 0x1.4p2 +REG epsg:28423 0 0x1.0ep7 0x0.0p0 +REG epsg:28423 1 0x1.04p7 -0x1.4p2 +REG epsg:28423 2 0x1.18p7 -0x1.4p2 +REG epsg:28423 3 0x1.04p7 0x1.4p2 +REG epsg:28423 4 0x1.18p7 0x1.4p2 +REG epsg:28424 0 0x1.1ap7 0x0.0p0 +REG epsg:28424 1 0x1.1p7 -0x1.4p2 +REG epsg:28424 2 0x1.24p7 -0x1.4p2 +REG epsg:28424 3 0x1.1p7 0x1.4p2 +REG epsg:28424 4 0x1.24p7 0x1.4p2 +REG epsg:28425 0 0x1.26p7 0x0.0p0 +REG epsg:28425 1 0x1.1cp7 -0x1.4p2 +REG epsg:28425 2 0x1.3p7 -0x1.4p2 +REG epsg:28425 3 0x1.1cp7 0x1.4p2 +REG epsg:28425 4 0x1.3p7 0x1.4p2 +REG epsg:28426 0 0x1.32p7 0x0.0p0 +REG epsg:28426 1 0x1.28p7 -0x1.4p2 +REG epsg:28426 2 0x1.3cp7 -0x1.4p2 +REG epsg:28426 3 0x1.28p7 0x1.4p2 +REG epsg:28426 4 0x1.3cp7 0x1.4p2 +REG epsg:28427 0 0x1.3ep7 0x0.0p0 +REG epsg:28427 1 0x1.34p7 -0x1.4p2 +REG epsg:28427 2 0x1.48p7 -0x1.4p2 +REG epsg:28427 3 0x1.34p7 0x1.4p2 +REG epsg:28427 4 0x1.48p7 0x1.4p2 +REG epsg:28428 0 0x1.4ap7 0x0.0p0 +REG epsg:28428 1 0x1.4p7 -0x1.4p2 +REG epsg:28428 2 0x1.54p7 -0x1.4p2 +REG epsg:28428 3 0x1.4p7 0x1.4p2 +REG epsg:28428 4 0x1.54p7 0x1.4p2 +REG epsg:28429 0 0x1.56p7 0x0.0p0 +REG epsg:28429 1 0x1.4cp7 -0x1.4p2 +REG epsg:28429 2 0x1.6p7 -0x1.4p2 +REG epsg:28429 3 0x1.4cp7 0x1.4p2 +REG epsg:28429 4 0x1.6p7 0x1.4p2 +REG epsg:2843 0 -0x1.58p6 0x1.1bp5 +REG epsg:2843 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:2843 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:2843 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:2843 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:28430 0 0x1.62p7 0x0.0p0 +REG epsg:28430 1 0x1.58p7 -0x1.4p2 +REG epsg:28430 2 -0x1.64p7 -0x1.4p2 +REG epsg:28430 3 0x1.58p7 0x1.4p2 +REG epsg:28430 4 -0x1.64p7 0x1.4p2 +REG epsg:28431 0 -0x1.62p7 0x0.0p0 +REG epsg:28431 1 0x1.64p7 -0x1.4p2 +REG epsg:28431 2 -0x1.58p7 -0x1.4p2 +REG epsg:28431 3 0x1.64p7 0x1.4p2 +REG epsg:28431 4 -0x1.58p7 0x1.4p2 +REG epsg:28432 0 -0x1.56p7 0x0.0p0 +REG epsg:28432 1 -0x1.6p7 -0x1.4p2 +REG epsg:28432 2 -0x1.4cp7 -0x1.4p2 +REG epsg:28432 3 -0x1.6p7 0x1.4p2 +REG epsg:28432 4 -0x1.4cp7 0x1.4p2 +REG epsg:2844 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:2844 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:2844 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:2844 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:2844 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:2845 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:2845 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:2845 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:2845 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:2845 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:2846 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:2846 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:2846 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:2846 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:2846 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:28462 0 0x1.2p3 0x0.0p0 +REG epsg:28462 1 0x1.0p2 -0x1.4p2 +REG epsg:28462 2 0x1.cp3 -0x1.4p2 +REG epsg:28462 3 0x1.0p2 0x1.4p2 +REG epsg:28462 4 0x1.cp3 0x1.4p2 +REG epsg:28463 0 0x1.ep3 0x0.0p0 +REG epsg:28463 1 0x1.4p3 -0x1.4p2 +REG epsg:28463 2 0x1.4p4 -0x1.4p2 +REG epsg:28463 3 0x1.4p3 0x1.4p2 +REG epsg:28463 4 0x1.4p4 0x1.4p2 +REG epsg:28464 0 0x1.5p4 0x0.0p0 +REG epsg:28464 1 0x1.0p4 -0x1.4p2 +REG epsg:28464 2 0x1.ap4 -0x1.4p2 +REG epsg:28464 3 0x1.0p4 0x1.4p2 +REG epsg:28464 4 0x1.ap4 0x1.4p2 +REG epsg:28465 0 0x1.bp4 0x0.0p0 +REG epsg:28465 1 0x1.6p4 -0x1.4p2 +REG epsg:28465 2 0x1.0p5 -0x1.4p2 +REG epsg:28465 3 0x1.6p4 0x1.4p2 +REG epsg:28465 4 0x1.0p5 0x1.4p2 +REG epsg:28466 0 0x1.08p5 0x0.0p0 +REG epsg:28466 1 0x1.cp4 -0x1.4p2 +REG epsg:28466 2 0x1.3p5 -0x1.4p2 +REG epsg:28466 3 0x1.cp4 0x1.4p2 +REG epsg:28466 4 0x1.3p5 0x1.4p2 +REG epsg:28467 0 0x1.38p5 0x0.0p0 +REG epsg:28467 1 0x1.1p5 -0x1.4p2 +REG epsg:28467 2 0x1.6p5 -0x1.4p2 +REG epsg:28467 3 0x1.1p5 0x1.4p2 +REG epsg:28467 4 0x1.6p5 0x1.4p2 +REG epsg:28468 0 0x1.68p5 0x0.0p0 +REG epsg:28468 1 0x1.4p5 -0x1.4p2 +REG epsg:28468 2 0x1.9p5 -0x1.4p2 +REG epsg:28468 3 0x1.4p5 0x1.4p2 +REG epsg:28468 4 0x1.9p5 0x1.4p2 +REG epsg:28469 0 0x1.98p5 0x0.0p0 +REG epsg:28469 1 0x1.7p5 -0x1.4p2 +REG epsg:28469 2 0x1.cp5 -0x1.4p2 +REG epsg:28469 3 0x1.7p5 0x1.4p2 +REG epsg:28469 4 0x1.cp5 0x1.4p2 +REG epsg:2847 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:2847 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:2847 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:2847 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:2847 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:28470 0 0x1.c8p5 0x0.0p0 +REG epsg:28470 1 0x1.ap5 -0x1.4p2 +REG epsg:28470 2 0x1.fp5 -0x1.4p2 +REG epsg:28470 3 0x1.ap5 0x1.4p2 +REG epsg:28470 4 0x1.fp5 0x1.4p2 +REG epsg:28471 0 0x1.f8p5 0x0.0p0 +REG epsg:28471 1 0x1.dp5 -0x1.4p2 +REG epsg:28471 2 0x1.1p6 -0x1.4p2 +REG epsg:28471 3 0x1.dp5 0x1.4p2 +REG epsg:28471 4 0x1.1p6 0x1.4p2 +REG epsg:28472 0 0x1.14p6 0x0.0p0 +REG epsg:28472 1 0x1.0p6 -0x1.4p2 +REG epsg:28472 2 0x1.28p6 -0x1.4p2 +REG epsg:28472 3 0x1.0p6 0x1.4p2 +REG epsg:28472 4 0x1.28p6 0x1.4p2 +REG epsg:28473 0 0x1.2cp6 0x0.0p0 +REG epsg:28473 1 0x1.18p6 -0x1.4p2 +REG epsg:28473 2 0x1.4p6 -0x1.4p2 +REG epsg:28473 3 0x1.18p6 0x1.4p2 +REG epsg:28473 4 0x1.4p6 0x1.4p2 +REG epsg:28474 0 0x1.44p6 0x0.0p0 +REG epsg:28474 1 0x1.3p6 -0x1.4p2 +REG epsg:28474 2 0x1.58p6 -0x1.4p2 +REG epsg:28474 3 0x1.3p6 0x1.4p2 +REG epsg:28474 4 0x1.58p6 0x1.4p2 +REG epsg:28475 0 0x1.5cp6 0x0.0p0 +REG epsg:28475 1 0x1.48p6 -0x1.4p2 +REG epsg:28475 2 0x1.7p6 -0x1.4p2 +REG epsg:28475 3 0x1.48p6 0x1.4p2 +REG epsg:28475 4 0x1.7p6 0x1.4p2 +REG epsg:28476 0 0x1.74p6 0x0.0p0 +REG epsg:28476 1 0x1.6p6 -0x1.4p2 +REG epsg:28476 2 0x1.88p6 -0x1.4p2 +REG epsg:28476 3 0x1.6p6 0x1.4p2 +REG epsg:28476 4 0x1.88p6 0x1.4p2 +REG epsg:28477 0 0x1.8cp6 0x0.0p0 +REG epsg:28477 1 0x1.78p6 -0x1.4p2 +REG epsg:28477 2 0x1.ap6 -0x1.4p2 +REG epsg:28477 3 0x1.78p6 0x1.4p2 +REG epsg:28477 4 0x1.ap6 0x1.4p2 +REG epsg:28478 0 0x1.a4p6 0x0.0p0 +REG epsg:28478 1 0x1.9p6 -0x1.4p2 +REG epsg:28478 2 0x1.b8p6 -0x1.4p2 +REG epsg:28478 3 0x1.9p6 0x1.4p2 +REG epsg:28478 4 0x1.b8p6 0x1.4p2 +REG epsg:28479 0 0x1.bcp6 0x0.0p0 +REG epsg:28479 1 0x1.a8p6 -0x1.4p2 +REG epsg:28479 2 0x1.dp6 -0x1.4p2 +REG epsg:28479 3 0x1.a8p6 0x1.4p2 +REG epsg:28479 4 0x1.dp6 0x1.4p2 +REG epsg:2848 0 -0x1.8ap6 0x1.acp4 +REG epsg:2848 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:2848 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:2848 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:2848 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:28480 0 0x1.d4p6 0x0.0p0 +REG epsg:28480 1 0x1.cp6 -0x1.4p2 +REG epsg:28480 2 0x1.e8p6 -0x1.4p2 +REG epsg:28480 3 0x1.cp6 0x1.4p2 +REG epsg:28480 4 0x1.e8p6 0x1.4p2 +REG epsg:28481 0 0x1.ecp6 0x0.0p0 +REG epsg:28481 1 0x1.d8p6 -0x1.4p2 +REG epsg:28481 2 0x1.0p7 -0x1.4p2 +REG epsg:28481 3 0x1.d8p6 0x1.4p2 +REG epsg:28481 4 0x1.0p7 0x1.4p2 +REG epsg:28482 0 0x1.02p7 0x0.0p0 +REG epsg:28482 1 0x1.fp6 -0x1.4p2 +REG epsg:28482 2 0x1.0cp7 -0x1.4p2 +REG epsg:28482 3 0x1.fp6 0x1.4p2 +REG epsg:28482 4 0x1.0cp7 0x1.4p2 +REG epsg:28483 0 0x1.0ep7 0x0.0p0 +REG epsg:28483 1 0x1.04p7 -0x1.4p2 +REG epsg:28483 2 0x1.18p7 -0x1.4p2 +REG epsg:28483 3 0x1.04p7 0x1.4p2 +REG epsg:28483 4 0x1.18p7 0x1.4p2 +REG epsg:28484 0 0x1.1ap7 0x0.0p0 +REG epsg:28484 1 0x1.1p7 -0x1.4p2 +REG epsg:28484 2 0x1.24p7 -0x1.4p2 +REG epsg:28484 3 0x1.1p7 0x1.4p2 +REG epsg:28484 4 0x1.24p7 0x1.4p2 +REG epsg:28485 0 0x1.26p7 0x0.0p0 +REG epsg:28485 1 0x1.1cp7 -0x1.4p2 +REG epsg:28485 2 0x1.3p7 -0x1.4p2 +REG epsg:28485 3 0x1.1cp7 0x1.4p2 +REG epsg:28485 4 0x1.3p7 0x1.4p2 +REG epsg:28486 0 0x1.32p7 0x0.0p0 +REG epsg:28486 1 0x1.28p7 -0x1.4p2 +REG epsg:28486 2 0x1.3cp7 -0x1.4p2 +REG epsg:28486 3 0x1.28p7 0x1.4p2 +REG epsg:28486 4 0x1.3cp7 0x1.4p2 +REG epsg:28487 0 0x1.3ep7 0x0.0p0 +REG epsg:28487 1 0x1.34p7 -0x1.4p2 +REG epsg:28487 2 0x1.48p7 -0x1.4p2 +REG epsg:28487 3 0x1.34p7 0x1.4p2 +REG epsg:28487 4 0x1.48p7 0x1.4p2 +REG epsg:28488 0 0x1.4ap7 0x0.0p0 +REG epsg:28488 1 0x1.4p7 -0x1.4p2 +REG epsg:28488 2 0x1.54p7 -0x1.4p2 +REG epsg:28488 3 0x1.4p7 0x1.4p2 +REG epsg:28488 4 0x1.54p7 0x1.4p2 +REG epsg:28489 0 0x1.56p7 0x0.0p0 +REG epsg:28489 1 0x1.4cp7 -0x1.4p2 +REG epsg:28489 2 0x1.6p7 -0x1.4p2 +REG epsg:28489 3 0x1.4cp7 0x1.4p2 +REG epsg:28489 4 0x1.6p7 0x1.4p2 +REG epsg:2849 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:2849 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:2849 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:2849 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:2849 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:28490 0 0x1.62p7 0x0.0p0 +REG epsg:28490 1 0x1.58p7 -0x1.4p2 +REG epsg:28490 2 -0x1.64p7 -0x1.4p2 +REG epsg:28490 3 0x1.58p7 0x1.4p2 +REG epsg:28490 4 -0x1.64p7 0x1.4p2 +REG epsg:28491 0 -0x1.62p7 0x0.0p0 +REG epsg:28491 1 0x1.64p7 -0x1.4p2 +REG epsg:28491 2 -0x1.58p7 -0x1.4p2 +REG epsg:28491 3 0x1.64p7 0x1.4p2 +REG epsg:28491 4 -0x1.58p7 0x1.4p2 +REG epsg:28492 0 -0x1.56p7 0x0.0p0 +REG epsg:28492 1 -0x1.6p7 -0x1.4p2 +REG epsg:28492 2 -0x1.4cp7 -0x1.4p2 +REG epsg:28492 3 -0x1.6p7 0x1.4p2 +REG epsg:28492 4 -0x1.4cp7 0x1.4p2 +REG epsg:2850 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:2850 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:2850 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:2850 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:2850 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:2851 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:2851 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:2851 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:2851 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:2851 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:2852 0 -0x1.22p6 0x1.54p5 +REG epsg:2852 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:2852 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:2852 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:2852 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:2853 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:2853 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:2853 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:2853 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:2853 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:2854 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:2854 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:2854 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:2854 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:2854 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:2855 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:2855 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:2855 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:2855 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:2855 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:2856 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:2856 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:2856 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:2856 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:2856 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:2857 0 -0x1.3ep6 0x1.3bp5 +REG epsg:2857 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:2857 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:2857 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:2857 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:2858 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:2858 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:2858 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:2858 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:2858 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:2859 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:2859 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:2859 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:2859 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:2859 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:2860 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:2860 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:2860 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:2860 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:2860 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:28600 0 0x1.99bbbbbbbbbbcp5 0x1.8733333333333p4 +REG epsg:28600 1 0x1.6dcaf9f8d3f58p5 0x1.3733333333333p4 +REG epsg:28600 2 0x1.c5ac7d7ea382p5 0x1.3733333333333p4 +REG epsg:28600 3 0x1.6dcaf9f8d3f58p5 0x1.d733333333333p4 +REG epsg:28600 4 0x1.c5ac7d7ea382p5 0x1.d733333333333p4 +REG epsg:2861 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:2861 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:2861 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:2861 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:2861 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:2862 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:2862 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:2862 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:2862 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:2862 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:2863 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:2863 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:2863 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:2863 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:2863 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:2864 0 -0x1.b3p6 0x1.44p5 +REG epsg:2864 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:2864 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:2864 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:2864 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:2865 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:2865 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:2865 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:2865 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:2865 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:2866 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:2866 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:2866 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:2866 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:2866 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:2867 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:2867 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:2867 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:2867 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:2867 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:2868 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:2868 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:2868 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:2868 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:2868 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:2869 0 -0x1.c7p6 0x1.fp4 +REG epsg:2869 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:2869 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:2869 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:2869 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:2870 0 -0x1.e8p6 0x1.44p5 +REG epsg:2870 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:2870 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:2870 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:2870 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:2871 0 -0x1.e8p6 0x1.36p5 +REG epsg:2871 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:2871 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:2871 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:2871 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:2872 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:2872 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:2872 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:2872 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:2872 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:2873 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:2873 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:2873 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:2873 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:2873 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:2874 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:2874 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:2874 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:2874 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:2874 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:2875 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:2875 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:2875 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:2875 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:2875 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:2876 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:2876 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:2876 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:2876 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:2876 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:2877 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:2877 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:2877 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:2877 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:2877 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:2878 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:2878 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:2878 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:2878 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:2878 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:2879 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:2879 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:2879 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:2879 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:2879 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:2880 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:2880 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:2880 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:2880 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:2880 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:2881 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:2881 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:2881 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:2881 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:2881 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2882 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:2882 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:2882 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:2882 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:2882 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:2883 0 -0x1.52p6 0x1.dep4 +REG epsg:2883 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:2883 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:2883 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:2883 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:2884 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:2884 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:2884 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:2884 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:2884 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:2885 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:2885 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:2885 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:2885 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:2885 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:2886 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:2886 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:2886 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:2886 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:2886 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:2887 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:2887 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:2887 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:2887 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:2887 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2888 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:2888 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:2888 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:2888 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:2888 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:2889 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:2889 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:2889 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:2889 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:2889 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:2890 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:2890 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:2890 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:2890 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:2890 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:2891 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:2891 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:2891 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:2891 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:2891 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:2892 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:2892 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:2892 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:2892 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:2892 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:2893 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:2893 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:2893 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:2893 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:2893 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:2894 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:2894 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:2894 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:2894 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:2894 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:2895 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:2895 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:2895 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:2895 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:2895 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:2896 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:2896 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:2896 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:2896 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:2896 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:2897 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:2897 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:2897 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:2897 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:2897 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:2898 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:2898 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:2898 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:2898 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:2898 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:2899 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:2899 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:2899 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:2899 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:2899 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:28991 0 0x1.58cf13579be04p2 0x1.a13fd11af84a5p5 +REG epsg:28991 1 -0x1.618eba230a3e8p1 0x1.793fd11af84a5p5 +REG epsg:28991 2 0x1.b132c1e05e6fep3 0x1.793fd11af84a5p5 +REG epsg:28991 3 -0x1.618eba230a3e8p1 0x1.c93fd11af84a5p5 +REG epsg:28991 4 0x1.b132c1e05e6fep3 0x1.c93fd11af84a5p5 +REG epsg:28992 0 0x1.58cf13579be04p2 0x1.a13fd11af84a5p5 +REG epsg:28992 1 -0x1.618eba230a3e8p1 0x1.793fd11af84a5p5 +REG epsg:28992 2 0x1.b132c1e05e6fep3 0x1.793fd11af84a5p5 +REG epsg:28992 3 -0x1.618eba230a3e8p1 0x1.c93fd11af84a5p5 +REG epsg:28992 4 0x1.b132c1e05e6fep3 0x1.c93fd11af84a5p5 +REG epsg:2900 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:2900 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:2900 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:2900 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:2900 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:2901 0 -0x1.b6p6 0x1.75p5 +REG epsg:2901 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:2901 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:2901 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:2901 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:2902 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:2902 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:2902 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:2902 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:2902 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:2903 0 -0x1.a9p6 0x1.fp4 +REG epsg:2903 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:2903 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:2903 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:2903 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:2904 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:2904 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:2904 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:2904 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:2904 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:2905 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:2905 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2905 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:2905 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2905 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:2906 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:2906 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:2906 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:2906 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:2906 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:2907 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:2907 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:2907 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:2907 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:2907 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:2908 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:2908 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:2908 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:2908 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:2908 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:2909 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:2909 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:2909 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:2909 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:2909 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:2910 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:2910 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:2910 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:2910 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:2910 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:29100 0 -0x1.bp5 0x0.0p0 +REG epsg:29100 1 -0x1.d8p5 -0x1.4p2 +REG epsg:29100 2 -0x1.88p5 -0x1.4p2 +REG epsg:29100 3 -0x1.d8p5 0x1.4p2 +REG epsg:29100 4 -0x1.88p5 0x1.4p2 +REG epsg:29101 0 -0x1.bp5 0x0.0p0 +REG epsg:29101 1 -0x1.d8p5 -0x1.4p2 +REG epsg:29101 2 -0x1.88p5 -0x1.4p2 +REG epsg:29101 3 -0x1.d8p5 0x1.4p2 +REG epsg:29101 4 -0x1.88p5 0x1.4p2 +REG epsg:2911 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:2911 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:2911 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:2911 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:2911 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:29118 0 -0x1.2cp6 0x0.0p0 +REG epsg:29118 1 -0x1.4p6 -0x1.4p2 +REG epsg:29118 2 -0x1.18p6 -0x1.4p2 +REG epsg:29118 3 -0x1.4p6 0x1.4p2 +REG epsg:29118 4 -0x1.18p6 0x1.4p2 +REG epsg:29119 0 -0x1.14p6 0x0.0p0 +REG epsg:29119 1 -0x1.28p6 -0x1.4p2 +REG epsg:29119 2 -0x1.0p6 -0x1.4p2 +REG epsg:29119 3 -0x1.28p6 0x1.4p2 +REG epsg:29119 4 -0x1.0p6 0x1.4p2 +REG epsg:2912 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:2912 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:2912 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:2912 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:2912 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:29120 0 -0x1.f8p5 0x0.0p0 +REG epsg:29120 1 -0x1.1p6 -0x1.4p2 +REG epsg:29120 2 -0x1.dp5 -0x1.4p2 +REG epsg:29120 3 -0x1.1p6 0x1.4p2 +REG epsg:29120 4 -0x1.dp5 0x1.4p2 +REG epsg:29121 0 -0x1.c8p5 0x0.0p0 +REG epsg:29121 1 -0x1.fp5 -0x1.4p2 +REG epsg:29121 2 -0x1.ap5 -0x1.4p2 +REG epsg:29121 3 -0x1.fp5 0x1.4p2 +REG epsg:29121 4 -0x1.ap5 0x1.4p2 +REG epsg:29122 0 -0x1.98p5 0x0.0p0 +REG epsg:29122 1 -0x1.cp5 -0x1.4p2 +REG epsg:29122 2 -0x1.7p5 -0x1.4p2 +REG epsg:29122 3 -0x1.cp5 0x1.4p2 +REG epsg:29122 4 -0x1.7p5 0x1.4p2 +REG epsg:2913 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:2913 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:2913 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:2913 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:2913 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:2914 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:2914 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:2914 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:2914 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:2914 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:2915 0 -0x1.58p6 0x1.1bp5 +REG epsg:2915 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:2915 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:2915 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:2915 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:2916 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:2916 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:2916 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:2916 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:2916 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:29168 0 -0x1.2cp6 0x0.0p0 +REG epsg:29168 1 -0x1.4p6 -0x1.4p2 +REG epsg:29168 2 -0x1.18p6 -0x1.4p2 +REG epsg:29168 3 -0x1.4p6 0x1.4p2 +REG epsg:29168 4 -0x1.18p6 0x1.4p2 +REG epsg:29169 0 -0x1.14p6 0x0.0p0 +REG epsg:29169 1 -0x1.28p6 -0x1.4p2 +REG epsg:29169 2 -0x1.0p6 -0x1.4p2 +REG epsg:29169 3 -0x1.28p6 0x1.4p2 +REG epsg:29169 4 -0x1.0p6 0x1.4p2 +REG epsg:2917 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:2917 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:2917 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:2917 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:2917 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:29170 0 -0x1.f8p5 0x0.0p0 +REG epsg:29170 1 -0x1.1p6 -0x1.4p2 +REG epsg:29170 2 -0x1.dp5 -0x1.4p2 +REG epsg:29170 3 -0x1.1p6 0x1.4p2 +REG epsg:29170 4 -0x1.dp5 0x1.4p2 +REG epsg:29171 0 -0x1.c8p5 0x0.0p0 +REG epsg:29171 1 -0x1.fp5 -0x1.4p2 +REG epsg:29171 2 -0x1.ap5 -0x1.4p2 +REG epsg:29171 3 -0x1.fp5 0x1.4p2 +REG epsg:29171 4 -0x1.ap5 0x1.4p2 +REG epsg:29172 0 -0x1.98p5 0x0.0p0 +REG epsg:29172 1 -0x1.cp5 -0x1.4p2 +REG epsg:29172 2 -0x1.7p5 -0x1.4p2 +REG epsg:29172 3 -0x1.cp5 0x1.4p2 +REG epsg:29172 4 -0x1.7p5 0x1.4p2 +REG epsg:29177 0 -0x1.44p6 -0x1.9p4 +REG epsg:29177 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:29177 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:29177 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:29177 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:29178 0 -0x1.2cp6 -0x1.9p4 +REG epsg:29178 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:29178 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:29178 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:29178 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:29179 0 -0x1.14p6 -0x1.9p4 +REG epsg:29179 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:29179 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:29179 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:29179 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2918 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:2918 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:2918 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:2918 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:2918 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:29180 0 -0x1.f8p5 -0x1.9p4 +REG epsg:29180 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:29180 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:29180 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:29180 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:29181 0 -0x1.c8p5 -0x1.9p4 +REG epsg:29181 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:29181 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29181 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:29181 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29182 0 -0x1.98p5 -0x1.9p4 +REG epsg:29182 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:29182 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29182 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:29182 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29183 0 -0x1.68p5 -0x1.9p4 +REG epsg:29183 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:29183 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29183 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:29183 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29184 0 -0x1.38p5 -0x1.9p4 +REG epsg:29184 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:29184 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29184 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:29184 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29185 0 -0x1.08p5 -0x1.9p4 +REG epsg:29185 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:29185 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:29185 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:29185 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:29187 0 -0x1.44p6 -0x1.9p4 +REG epsg:29187 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:29187 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:29187 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:29187 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:29188 0 -0x1.2cp6 -0x1.9p4 +REG epsg:29188 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:29188 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:29188 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:29188 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:29189 0 -0x1.14p6 -0x1.9p4 +REG epsg:29189 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:29189 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:29189 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:29189 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2919 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:2919 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:2919 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:2919 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:2919 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:29190 0 -0x1.f8p5 -0x1.9p4 +REG epsg:29190 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:29190 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:29190 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:29190 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:29191 0 -0x1.c8p5 -0x1.9p4 +REG epsg:29191 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:29191 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29191 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:29191 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29192 0 -0x1.98p5 -0x1.9p4 +REG epsg:29192 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:29192 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29192 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:29192 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29193 0 -0x1.68p5 -0x1.9p4 +REG epsg:29193 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:29193 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29193 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:29193 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29194 0 -0x1.38p5 -0x1.9p4 +REG epsg:29194 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:29194 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29194 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:29194 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29195 0 -0x1.08p5 -0x1.9p4 +REG epsg:29195 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:29195 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:29195 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:29195 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:2920 0 -0x1.8ap6 0x1.acp4 +REG epsg:2920 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:2920 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:2920 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:2920 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:2921 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:2921 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:2921 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:2921 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:2921 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:2922 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:2922 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:2922 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:2922 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:2922 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:29220 0 -0x1.f8p5 -0x1.9p4 +REG epsg:29220 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:29220 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:29220 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:29220 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:29221 0 -0x1.c8p5 -0x1.9p4 +REG epsg:29221 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:29221 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29221 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:29221 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2923 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:2923 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:2923 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:2923 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:2923 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:2924 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:2924 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:2924 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:2924 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:2924 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:2925 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:2925 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:2925 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:2925 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:2925 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:2926 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:2926 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:2926 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:2926 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:2926 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:2927 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:2927 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:2927 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:2927 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:2927 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:2928 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:2928 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:2928 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:2928 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:2928 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:2929 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:2929 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:2929 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:2929 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:2929 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:2930 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:2930 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:2930 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:2930 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:2930 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:2931 0 0x1.ap3 0x0.0p0 +REG epsg:2931 1 0x1.0p3 -0x1.4p2 +REG epsg:2931 2 0x1.2p4 -0x1.4p2 +REG epsg:2931 3 0x1.0p3 0x1.4p2 +REG epsg:2931 4 0x1.2p4 0x1.4p2 +REG epsg:2932 0 0x1.99bbbbbbbbbbcp5 0x1.8733333333333p4 +REG epsg:2932 1 0x1.6dcaf9f8d3f58p5 0x1.3733333333333p4 +REG epsg:2932 2 0x1.c5ac7d7ea382p5 0x1.3733333333333p4 +REG epsg:2932 3 0x1.6dcaf9f8d3f58p5 0x1.d733333333333p4 +REG epsg:2932 4 0x1.c5ac7d7ea382p5 0x1.d733333333333p4 +REG epsg:2933 0 0x1.d4p6 -0x1.9p4 +REG epsg:2933 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:2933 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:2933 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:2933 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:29333 0 0x1.ep3 -0x1.9p4 +REG epsg:29333 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:29333 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:29333 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:29333 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:2934 0 0x1.b8p6 0x0.0p0 +REG epsg:2934 1 0x1.a4p6 -0x1.4p2 +REG epsg:2934 2 0x1.ccp6 -0x1.4p2 +REG epsg:2934 3 0x1.a4p6 0x1.4p2 +REG epsg:2934 4 0x1.ccp6 0x1.4p2 +REG epsg:2935 0 0x1.4c44444444444p5 0x1.dddddddddddep-4 +REG epsg:2935 1 0x1.24443ed5095e5p5 -0x1.3888888888888p2 +REG epsg:2935 2 0x1.744449b37f2a3p5 -0x1.3888888888888p2 +REG epsg:2935 3 0x1.24443ed5095e5p5 0x1.4777777777778p2 +REG epsg:2935 4 0x1.744449b37f2a3p5 0x1.4777777777778p2 +REG epsg:2936 0 0x1.6444444444444p5 0x1.dddddddddddep-4 +REG epsg:2936 1 0x1.3c443ed5095e5p5 -0x1.3888888888888p2 +REG epsg:2936 2 0x1.8c4449b37f2a3p5 -0x1.3888888888888p2 +REG epsg:2936 3 0x1.3c443ed5095e5p5 0x1.4777777777778p2 +REG epsg:2936 4 0x1.8c4449b37f2a3p5 0x1.4777777777778p2 +REG epsg:2937 0 0x1.7c44444444444p5 0x1.dddddddddddep-4 +REG epsg:2937 1 0x1.54443ed5095e5p5 -0x1.3888888888888p2 +REG epsg:2937 2 0x1.a44449b37f2a3p5 -0x1.3888888888888p2 +REG epsg:2937 3 0x1.54443ed5095e5p5 0x1.4777777777778p2 +REG epsg:2937 4 0x1.a44449b37f2a3p5 0x1.4777777777778p2 +REG epsg:29371 0 0x1.6p3 -0x1.6p4 +REG epsg:29371 1 0x1.66de6f12c0005p2 -0x1.bp4 +REG epsg:29371 2 0x1.0648643b4ffffp4 -0x1.bp4 +REG epsg:29371 3 0x1.66de6f12c0005p2 -0x1.1p4 +REG epsg:29371 4 0x1.0648643b4ffffp4 -0x1.1p4 +REG epsg:29373 0 0x1.ap3 -0x1.6p4 +REG epsg:29373 1 0x1.e6de6f12c0005p2 -0x1.bp4 +REG epsg:29373 2 0x1.2648643b4ffffp4 -0x1.bp4 +REG epsg:29373 3 0x1.e6de6f12c0005p2 -0x1.1p4 +REG epsg:29373 4 0x1.2648643b4ffffp4 -0x1.1p4 +REG epsg:29375 0 0x1.ep3 -0x1.6p4 +REG epsg:29375 1 0x1.336f378960002p3 -0x1.bp4 +REG epsg:29375 2 0x1.4648643b4ffffp4 -0x1.bp4 +REG epsg:29375 3 0x1.336f378960002p3 -0x1.1p4 +REG epsg:29375 4 0x1.4648643b4ffffp4 -0x1.1p4 +REG epsg:29377 0 0x1.1p4 -0x1.6p4 +REG epsg:29377 1 0x1.736f378960002p3 -0x1.bp4 +REG epsg:29377 2 0x1.6648643b4ffffp4 -0x1.bp4 +REG epsg:29377 3 0x1.736f378960002p3 -0x1.1p4 +REG epsg:29377 4 0x1.6648643b4ffffp4 -0x1.1p4 +REG epsg:29379 0 0x1.3p4 -0x1.6p4 +REG epsg:29379 1 0x1.b36f378960002p3 -0x1.bp4 +REG epsg:29379 2 0x1.8648643b4ffffp4 -0x1.bp4 +REG epsg:29379 3 0x1.b36f378960002p3 -0x1.1p4 +REG epsg:29379 4 0x1.8648643b4ffffp4 -0x1.1p4 +REG epsg:2938 0 0x1.9444444444444p5 0x1.dddddddddddep-4 +REG epsg:2938 1 0x1.6c443ed5095e5p5 -0x1.3888888888888p2 +REG epsg:2938 2 0x1.bc4449b37f2a3p5 -0x1.3888888888888p2 +REG epsg:2938 3 0x1.6c443ed5095e5p5 0x1.4777777777778p2 +REG epsg:2938 4 0x1.bc4449b37f2a3p5 0x1.4777777777778p2 +REG epsg:29381 0 0x1.5p4 -0x1.6p4 +REG epsg:29381 1 0x1.f36f378960002p3 -0x1.bp4 +REG epsg:29381 2 0x1.a648643b4ffffp4 -0x1.bp4 +REG epsg:29381 3 0x1.f36f378960002p3 -0x1.1p4 +REG epsg:29381 4 0x1.a648643b4ffffp4 -0x1.1p4 +REG epsg:29383 0 0x1.7p4 -0x1.6p4 +REG epsg:29383 1 0x1.19b79bc4b0001p4 -0x1.bp4 +REG epsg:29383 2 0x1.c648643b4ffffp4 -0x1.bp4 +REG epsg:29383 3 0x1.19b79bc4b0001p4 -0x1.1p4 +REG epsg:29383 4 0x1.c648643b4ffffp4 -0x1.1p4 +REG epsg:29385 0 0x1.9p4 -0x1.6p4 +REG epsg:29385 1 0x1.39b79bc4b0001p4 -0x1.bp4 +REG epsg:29385 2 0x1.e648643b4ffffp4 -0x1.bp4 +REG epsg:29385 3 0x1.39b79bc4b0001p4 -0x1.1p4 +REG epsg:29385 4 0x1.e648643b4ffffp4 -0x1.1p4 +REG epsg:2939 0 0x1.9622222222223p5 0x1.111111111111p-3 +REG epsg:2939 1 0x1.6e221b0903facp5 -0x1.3777777777778p2 +REG epsg:2939 2 0x1.be22293b4049ap5 -0x1.3777777777778p2 +REG epsg:2939 3 0x1.6e221b0903facp5 0x1.4888888888888p2 +REG epsg:2939 4 0x1.be22293b4049ap5 0x1.4888888888888p2 +REG epsg:2940 0 0x1.ae22222222223p5 0x1.111111111111p-3 +REG epsg:2940 1 0x1.86221b0903facp5 -0x1.3777777777778p2 +REG epsg:2940 2 0x1.d622293b4049ap5 -0x1.3777777777778p2 +REG epsg:2940 3 0x1.86221b0903facp5 0x1.4888888888888p2 +REG epsg:2940 4 0x1.d622293b4049ap5 0x1.4888888888888p2 +REG epsg:2941 0 0x1.c622222222223p5 0x1.111111111111p-3 +REG epsg:2941 1 0x1.9e221b0903facp5 -0x1.3777777777778p2 +REG epsg:2941 2 0x1.ee22293b4049ap5 -0x1.3777777777778p2 +REG epsg:2941 3 0x1.9e221b0903facp5 0x1.4888888888888p2 +REG epsg:2941 4 0x1.ee22293b4049ap5 0x1.4888888888888p2 +REG epsg:2942 0 -0x1.ep3 0x0.0p0 +REG epsg:2942 1 -0x1.4p4 -0x1.4p2 +REG epsg:2942 2 -0x1.4p3 -0x1.4p2 +REG epsg:2942 3 -0x1.4p4 0x1.4p2 +REG epsg:2942 4 -0x1.4p3 0x1.4p2 +REG epsg:2943 0 -0x1.ep3 0x0.0p0 +REG epsg:2943 1 -0x1.4p4 -0x1.4p2 +REG epsg:2943 2 -0x1.4p3 -0x1.4p2 +REG epsg:2943 3 -0x1.4p4 0x1.4p2 +REG epsg:2943 4 -0x1.4p3 0x1.4p2 +REG epsg:2944 0 -0x1.bcp5 0x0.0p0 +REG epsg:2944 1 -0x1.e4p5 -0x1.4p2 +REG epsg:2944 2 -0x1.94p5 -0x1.4p2 +REG epsg:2944 3 -0x1.e4p5 0x1.4p2 +REG epsg:2944 4 -0x1.94p5 0x1.4p2 +REG epsg:2945 0 -0x1.d4p5 0x0.0p0 +REG epsg:2945 1 -0x1.fcp5 -0x1.4p2 +REG epsg:2945 2 -0x1.acp5 -0x1.4p2 +REG epsg:2945 3 -0x1.fcp5 0x1.4p2 +REG epsg:2945 4 -0x1.acp5 0x1.4p2 +REG epsg:2946 0 -0x1.ecp5 0x0.0p0 +REG epsg:2946 1 -0x1.0ap6 -0x1.4p2 +REG epsg:2946 2 -0x1.c4p5 -0x1.4p2 +REG epsg:2946 3 -0x1.0ap6 0x1.4p2 +REG epsg:2946 4 -0x1.c4p5 0x1.4p2 +REG epsg:2947 0 -0x1.02p6 0x0.0p0 +REG epsg:2947 1 -0x1.16p6 -0x1.4p2 +REG epsg:2947 2 -0x1.dcp5 -0x1.4p2 +REG epsg:2947 3 -0x1.16p6 0x1.4p2 +REG epsg:2947 4 -0x1.dcp5 0x1.4p2 +REG epsg:2948 0 -0x1.0ep6 0x0.0p0 +REG epsg:2948 1 -0x1.22p6 -0x1.4p2 +REG epsg:2948 2 -0x1.f4p5 -0x1.4p2 +REG epsg:2948 3 -0x1.22p6 0x1.4p2 +REG epsg:2948 4 -0x1.f4p5 0x1.4p2 +REG epsg:2949 0 -0x1.1ap6 0x0.0p0 +REG epsg:2949 1 -0x1.2ep6 -0x1.4p2 +REG epsg:2949 2 -0x1.06p6 -0x1.4p2 +REG epsg:2949 3 -0x1.2ep6 0x1.4p2 +REG epsg:2949 4 -0x1.06p6 0x1.4p2 +REG epsg:2950 0 -0x1.26p6 0x0.0p0 +REG epsg:2950 1 -0x1.3ap6 -0x1.4p2 +REG epsg:2950 2 -0x1.12p6 -0x1.4p2 +REG epsg:2950 3 -0x1.3ap6 0x1.4p2 +REG epsg:2950 4 -0x1.12p6 0x1.4p2 +REG epsg:2951 0 -0x1.32p6 0x0.0p0 +REG epsg:2951 1 -0x1.46p6 -0x1.4p2 +REG epsg:2951 2 -0x1.1ep6 -0x1.4p2 +REG epsg:2951 3 -0x1.46p6 0x1.4p2 +REG epsg:2951 4 -0x1.1ep6 0x1.4p2 +REG epsg:2952 0 -0x1.3ep6 0x0.0p0 +REG epsg:2952 1 -0x1.52p6 -0x1.4p2 +REG epsg:2952 2 -0x1.2ap6 -0x1.4p2 +REG epsg:2952 3 -0x1.52p6 0x1.4p2 +REG epsg:2952 4 -0x1.2ap6 0x1.4p2 +REG epsg:2953 0 -0x1.0ap6 0x1.74p5 +REG epsg:2953 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG epsg:2953 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG epsg:2953 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG epsg:2953 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG epsg:2954 0 -0x1.f8p5 0x1.7ap5 +REG epsg:2954 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG epsg:2954 2 -0x1.bd129258af178p5 0x1.52p5 +REG epsg:2954 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG epsg:2954 4 -0x1.bd129258af178p5 0x1.a2p5 +REG epsg:2955 0 -0x1.d4p6 0x0.0p0 +REG epsg:2955 1 -0x1.e8p6 -0x1.4p2 +REG epsg:2955 2 -0x1.cp6 -0x1.4p2 +REG epsg:2955 3 -0x1.e8p6 0x1.4p2 +REG epsg:2955 4 -0x1.cp6 0x1.4p2 +REG epsg:2956 0 -0x1.bcp6 0x0.0p0 +REG epsg:2956 1 -0x1.dp6 -0x1.4p2 +REG epsg:2956 2 -0x1.a8p6 -0x1.4p2 +REG epsg:2956 3 -0x1.dp6 0x1.4p2 +REG epsg:2956 4 -0x1.a8p6 0x1.4p2 +REG epsg:2957 0 -0x1.a4p6 0x0.0p0 +REG epsg:2957 1 -0x1.b8p6 -0x1.4p2 +REG epsg:2957 2 -0x1.9p6 -0x1.4p2 +REG epsg:2957 3 -0x1.b8p6 0x1.4p2 +REG epsg:2957 4 -0x1.9p6 0x1.4p2 +REG epsg:2958 0 -0x1.44p6 0x0.0p0 +REG epsg:2958 1 -0x1.58p6 -0x1.4p2 +REG epsg:2958 2 -0x1.3p6 -0x1.4p2 +REG epsg:2958 3 -0x1.58p6 0x1.4p2 +REG epsg:2958 4 -0x1.3p6 0x1.4p2 +REG epsg:2959 0 -0x1.2cp6 0x0.0p0 +REG epsg:2959 1 -0x1.4p6 -0x1.4p2 +REG epsg:2959 2 -0x1.18p6 -0x1.4p2 +REG epsg:2959 3 -0x1.4p6 0x1.4p2 +REG epsg:2959 4 -0x1.18p6 0x1.4p2 +REG epsg:2960 0 -0x1.14p6 0x0.0p0 +REG epsg:2960 1 -0x1.28p6 -0x1.4p2 +REG epsg:2960 2 -0x1.0p6 -0x1.4p2 +REG epsg:2960 3 -0x1.28p6 0x1.4p2 +REG epsg:2960 4 -0x1.0p6 0x1.4p2 +REG epsg:2961 0 -0x1.f8p5 0x0.0p0 +REG epsg:2961 1 -0x1.1p6 -0x1.4p2 +REG epsg:2961 2 -0x1.dp5 -0x1.4p2 +REG epsg:2961 3 -0x1.1p6 0x1.4p2 +REG epsg:2961 4 -0x1.dp5 0x1.4p2 +REG epsg:2962 0 -0x1.c8p5 0x0.0p0 +REG epsg:2962 1 -0x1.fp5 -0x1.4p2 +REG epsg:2962 2 -0x1.ap5 -0x1.4p2 +REG epsg:2962 3 -0x1.fp5 0x1.4p2 +REG epsg:2962 4 -0x1.ap5 0x1.4p2 +REG epsg:29635 0 0x1.bp4 0x0.0p0 +REG epsg:29635 1 0x1.6p4 -0x1.4p2 +REG epsg:29635 2 0x1.0p5 -0x1.4p2 +REG epsg:29635 3 0x1.6p4 0x1.4p2 +REG epsg:29635 4 0x1.0p5 0x1.4p2 +REG epsg:29636 0 0x1.08p5 0x0.0p0 +REG epsg:29636 1 0x1.cp4 -0x1.4p2 +REG epsg:29636 2 0x1.3p5 -0x1.4p2 +REG epsg:29636 3 0x1.cp4 0x1.4p2 +REG epsg:29636 4 0x1.3p5 0x1.4p2 +REG epsg:2964 0 -0x1.34p7 0x1.ccp5 +REG epsg:2964 1 0x1.642a4c850f0f1p7 0x1.54p5 +REG epsg:2964 2 -0x1.f854990a1e1e2p6 0x1.54p5 +REG epsg:2964 3 0x1.642a4c850f0f1p7 0x1.22p6 +REG epsg:2964 4 -0x1.f854990a1e1e2p6 0x1.22p6 +REG epsg:2965 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:2965 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:2965 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:2965 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:2965 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:2966 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:2966 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:2966 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:2966 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:2966 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:2967 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:2967 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:2967 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:2967 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:2967 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:2968 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:2968 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:2968 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:2968 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:2968 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:2969 0 -0x1.f8p5 0x0.0p0 +REG epsg:2969 1 -0x1.1p6 -0x1.4p2 +REG epsg:2969 2 -0x1.dp5 -0x1.4p2 +REG epsg:2969 3 -0x1.1p6 0x1.4p2 +REG epsg:2969 4 -0x1.dp5 0x1.4p2 +REG epsg:2970 0 -0x1.f8p5 0x0.0p0 +REG epsg:2970 1 -0x1.1p6 -0x1.4p2 +REG epsg:2970 2 -0x1.dp5 -0x1.4p2 +REG epsg:2970 3 -0x1.1p6 0x1.4p2 +REG epsg:2970 4 -0x1.dp5 0x1.4p2 +REG epsg:29700 0 0x1.60ccccccccccep5 -0x1.2e66666666666p4 +REG epsg:29700 1 0x1.3685409764ccep5 -0x1.7e66666666666p4 +REG epsg:29700 2 0x1.8b14590234ccep5 -0x1.7e66666666666p4 +REG epsg:29700 3 0x1.3685409764ccep5 -0x1.bccccccccccccp3 +REG epsg:29700 4 0x1.8b14590234ccep5 -0x1.bccccccccccccp3 +REG epsg:29702 0 0x1.60ccccccccccep5 -0x1.2e66666666666p4 +REG epsg:29702 1 0x1.3685409764ccep5 -0x1.7e66666666666p4 +REG epsg:29702 2 0x1.8b14590234ccep5 -0x1.7e66666666666p4 +REG epsg:29702 3 0x1.3685409764ccep5 -0x1.bccccccccccccp3 +REG epsg:29702 4 0x1.8b14590234ccep5 -0x1.bccccccccccccp3 +REG epsg:2971 0 -0x1.98p5 0x0.0p0 +REG epsg:2971 1 -0x1.cp5 -0x1.4p2 +REG epsg:2971 2 -0x1.7p5 -0x1.4p2 +REG epsg:2971 3 -0x1.cp5 0x1.4p2 +REG epsg:2971 4 -0x1.7p5 0x1.4p2 +REG epsg:2972 0 -0x1.98p5 0x0.0p0 +REG epsg:2972 1 -0x1.cp5 -0x1.4p2 +REG epsg:2972 2 -0x1.7p5 -0x1.4p2 +REG epsg:2972 3 -0x1.cp5 0x1.4p2 +REG epsg:2972 4 -0x1.7p5 0x1.4p2 +REG epsg:2973 0 -0x1.f8p5 0x0.0p0 +REG epsg:2973 1 -0x1.1p6 -0x1.4p2 +REG epsg:2973 2 -0x1.dp5 -0x1.4p2 +REG epsg:2973 3 -0x1.1p6 0x1.4p2 +REG epsg:2973 4 -0x1.dp5 0x1.4p2 +REG epsg:29738 0 0x1.68p5 -0x1.9p4 +REG epsg:29738 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29738 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:29738 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29738 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:29739 0 0x1.98p5 -0x1.9p4 +REG epsg:29739 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:29739 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:29739 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:29739 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:2975 0 0x1.c8p5 -0x1.9p4 +REG epsg:2975 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:2975 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:2975 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2975 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:2976 0 -0x1.26p7 -0x1.9p4 +REG epsg:2976 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:2976 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:2976 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:2976 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:2977 0 -0x1.32p7 -0x1.9p4 +REG epsg:2977 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:2977 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:2977 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:2977 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:2978 0 -0x1.1ap7 -0x1.9p4 +REG epsg:2978 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:2978 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:2978 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:2978 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:2979 0 0x1.14p6 -0x1.9p4 +REG epsg:2979 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:2979 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:2979 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:2979 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:2980 0 0x1.68p5 -0x1.9p4 +REG epsg:2980 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:2980 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:2980 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2980 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:2981 0 0x1.4ap7 -0x1.9p4 +REG epsg:2981 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2981 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2981 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2981 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2982 0 0x1.4ap7 -0x1.9p4 +REG epsg:2982 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2982 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2982 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2982 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2983 0 0x1.4ap7 -0x1.9p4 +REG epsg:2983 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2983 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2983 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2983 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2984 0 0x1.4cp7 -0x1.58p4 +REG epsg:2984 1 0x1.486ad95cf6aa6p7 -0x1.72aaaaaaaaaa8p4 +REG epsg:2984 2 0x1.4f9526a30955ap7 -0x1.72aaaaaaaaaa8p4 +REG epsg:2984 3 0x1.486ad95cf6aa6p7 -0x1.3d55555555558p4 +REG epsg:2984 4 0x1.4f9526a30955ap7 -0x1.3d55555555558p4 +REG epsg:29849 0 0x1.bcp6 0x0.0p0 +REG epsg:29849 1 0x1.a8p6 -0x1.4p2 +REG epsg:29849 2 0x1.dp6 -0x1.4p2 +REG epsg:29849 3 0x1.a8p6 0x1.4p2 +REG epsg:29849 4 0x1.dp6 0x1.4p2 +REG epsg:29850 0 0x1.d4p6 0x0.0p0 +REG epsg:29850 1 0x1.cp6 -0x1.4p2 +REG epsg:29850 2 0x1.e8p6 -0x1.4p2 +REG epsg:29850 3 0x1.cp6 0x1.4p2 +REG epsg:29850 4 0x1.e8p6 0x1.4p2 +REG epsg:2987 0 -0x1.c8p5 0x0.0p0 +REG epsg:2987 1 -0x1.fp5 -0x1.4p2 +REG epsg:2987 2 -0x1.ap5 -0x1.4p2 +REG epsg:2987 3 -0x1.fp5 0x1.4p2 +REG epsg:2987 4 -0x1.ap5 0x1.4p2 +REG epsg:29871 0 0x1.ccp6 0x1.0p2 +REG epsg:29871 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG epsg:29871 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG epsg:29871 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG epsg:29871 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG epsg:29872 0 0x1.ccp6 0x1.0p2 +REG epsg:29872 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG epsg:29872 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG epsg:29872 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG epsg:29872 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG epsg:29873 0 0x1.ccp6 0x1.0p2 +REG epsg:29873 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG epsg:29873 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG epsg:29873 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG epsg:29873 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG epsg:2988 0 -0x1.62p7 -0x1.9p4 +REG epsg:2988 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:2988 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:2988 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:2988 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:2989 0 -0x1.f8p5 0x0.0p0 +REG epsg:2989 1 -0x1.1p6 -0x1.4p2 +REG epsg:2989 2 -0x1.dp5 -0x1.4p2 +REG epsg:2989 3 -0x1.1p6 0x1.4p2 +REG epsg:2989 4 -0x1.dp5 0x1.4p2 +REG epsg:2990 0 0x1.bc44444444444p5 -0x1.51ddddddddddfp4 +REG epsg:2990 1 0x1.9163239d7d0c7p5 -0x1.a1ddddddddddfp4 +REG epsg:2990 2 0x1.e72564eb0b7c1p5 -0x1.a1ddddddddddfp4 +REG epsg:2990 3 0x1.9163239d7d0c7p5 -0x1.01ddddddddddfp4 +REG epsg:2990 4 0x1.e72564eb0b7c1p5 -0x1.01ddddddddddfp4 +REG epsg:29900 0 -0x1.0p3 0x1.acp5 +REG epsg:29900 1 -0x1.067e6c3855169p4 0x1.84p5 +REG epsg:29900 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG epsg:29900 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG epsg:29900 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG epsg:29901 0 -0x1.0p3 0x1.acp5 +REG epsg:29901 1 -0x1.067e6c3855169p4 0x1.84p5 +REG epsg:29901 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG epsg:29901 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG epsg:29901 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG epsg:29902 0 -0x1.0p3 0x1.acp5 +REG epsg:29902 1 -0x1.067e6c3855169p4 0x1.84p5 +REG epsg:29902 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG epsg:29902 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG epsg:29902 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG epsg:29903 0 -0x1.0p3 0x1.acp5 +REG epsg:29903 1 -0x1.067e6c3855169p4 0x1.84p5 +REG epsg:29903 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG epsg:29903 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG epsg:29903 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG epsg:2991 0 -0x1.e2p6 0x1.5dp5 +REG epsg:2991 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:2991 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:2991 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:2991 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:2992 0 -0x1.e2p6 0x1.5dp5 +REG epsg:2992 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:2992 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:2992 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:2992 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:2993 0 -0x1.e2p6 0x1.5dp5 +REG epsg:2993 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:2993 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:2993 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:2993 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:2994 0 -0x1.e2p6 0x1.5dp5 +REG epsg:2994 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:2994 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:2994 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:2994 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:2995 0 0x1.4ap7 -0x1.9p4 +REG epsg:2995 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2995 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2995 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2995 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2996 0 0x1.4ap7 -0x1.9p4 +REG epsg:2996 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2996 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2996 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2996 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2997 0 0x1.4ap7 -0x1.9p4 +REG epsg:2997 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2997 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2997 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2997 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2998 0 0x1.4ap7 -0x1.9p4 +REG epsg:2998 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:2998 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:2998 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:2998 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:2999 0 0x1.68p5 -0x1.9p4 +REG epsg:2999 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:2999 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:2999 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:2999 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:3000 0 0x1.b8p6 0x0.0p0 +REG epsg:3000 1 0x1.a4p6 -0x1.4p2 +REG epsg:3000 2 0x1.ccp6 -0x1.4p2 +REG epsg:3000 3 0x1.a4p6 0x1.4p2 +REG epsg:3000 4 0x1.ccp6 0x1.4p2 +REG epsg:3001 0 0x1.b8p6 0x0.0p0 +REG epsg:3001 1 0x1.a4p6 -0x1.4p2 +REG epsg:3001 2 0x1.ccp6 -0x1.4p2 +REG epsg:3001 3 0x1.a4p6 0x1.4p2 +REG epsg:3001 4 0x1.ccp6 0x1.4p2 +REG epsg:3002 0 0x1.b8p6 0x0.0p0 +REG epsg:3002 1 0x1.a4p6 -0x1.4p2 +REG epsg:3002 2 0x1.ccp6 -0x1.4p2 +REG epsg:3002 3 0x1.a4p6 0x1.4p2 +REG epsg:3002 4 0x1.ccp6 0x1.4p2 +REG epsg:3003 0 0x1.2p3 0x0.0p0 +REG epsg:3003 1 0x1.0p2 -0x1.4p2 +REG epsg:3003 2 0x1.cp3 -0x1.4p2 +REG epsg:3003 3 0x1.0p2 0x1.4p2 +REG epsg:3003 4 0x1.cp3 0x1.4p2 +REG epsg:3004 0 0x1.ep3 0x0.0p0 +REG epsg:3004 1 0x1.4p3 -0x1.4p2 +REG epsg:3004 2 0x1.4p4 -0x1.4p2 +REG epsg:3004 3 0x1.4p3 0x1.4p2 +REG epsg:3004 4 0x1.4p4 0x1.4p2 +REG epsg:3005 0 -0x1.f8p6 0x1.9ep5 +REG epsg:3005 1 -0x1.279cb3f010beap7 0x1.32p5 +REG epsg:3005 2 -0x1.a0c6981fde82cp6 0x1.32p5 +REG epsg:3005 3 -0x1.279cb3f010beap7 0x1.05p6 +REG epsg:3005 4 -0x1.a0c6981fde82cp6 0x1.05p6 +REG epsg:3006 0 0x1.ep3 0x0.0p0 +REG epsg:3006 1 0x1.4p3 -0x1.4p2 +REG epsg:3006 2 0x1.4p4 -0x1.4p2 +REG epsg:3006 3 0x1.4p3 0x1.4p2 +REG epsg:3006 4 0x1.4p4 0x1.4p2 +REG epsg:3007 0 0x1.8p3 0x0.0p0 +REG epsg:3007 1 0x1.cp2 -0x1.4p2 +REG epsg:3007 2 0x1.1p4 -0x1.4p2 +REG epsg:3007 3 0x1.cp2 0x1.4p2 +REG epsg:3007 4 0x1.1p4 0x1.4p2 +REG epsg:3008 0 0x1.bp3 0x0.0p0 +REG epsg:3008 1 0x1.1p3 -0x1.4p2 +REG epsg:3008 2 0x1.28p4 -0x1.4p2 +REG epsg:3008 3 0x1.1p3 0x1.4p2 +REG epsg:3008 4 0x1.28p4 0x1.4p2 +REG epsg:3009 0 0x1.ep3 0x0.0p0 +REG epsg:3009 1 0x1.4p3 -0x1.4p2 +REG epsg:3009 2 0x1.4p4 -0x1.4p2 +REG epsg:3009 3 0x1.4p3 0x1.4p2 +REG epsg:3009 4 0x1.4p4 0x1.4p2 +REG epsg:3010 0 0x1.08p4 0x0.0p0 +REG epsg:3010 1 0x1.7p3 -0x1.4p2 +REG epsg:3010 2 0x1.58p4 -0x1.4p2 +REG epsg:3010 3 0x1.7p3 0x1.4p2 +REG epsg:3010 4 0x1.58p4 0x1.4p2 +REG epsg:3011 0 0x1.2p4 0x0.0p0 +REG epsg:3011 1 0x1.ap3 -0x1.4p2 +REG epsg:3011 2 0x1.7p4 -0x1.4p2 +REG epsg:3011 3 0x1.ap3 0x1.4p2 +REG epsg:3011 4 0x1.7p4 0x1.4p2 +REG epsg:3012 0 0x1.c8p3 0x0.0p0 +REG epsg:3012 1 0x1.28p3 -0x1.4p2 +REG epsg:3012 2 0x1.34p4 -0x1.4p2 +REG epsg:3012 3 0x1.28p3 0x1.4p2 +REG epsg:3012 4 0x1.34p4 0x1.4p2 +REG epsg:3013 0 0x1.f8p3 0x0.0p0 +REG epsg:3013 1 0x1.58p3 -0x1.4p2 +REG epsg:3013 2 0x1.4cp4 -0x1.4p2 +REG epsg:3013 3 0x1.58p3 0x1.4p2 +REG epsg:3013 4 0x1.4cp4 0x1.4p2 +REG epsg:3014 0 0x1.14p4 0x0.0p0 +REG epsg:3014 1 0x1.88p3 -0x1.4p2 +REG epsg:3014 2 0x1.64p4 -0x1.4p2 +REG epsg:3014 3 0x1.88p3 0x1.4p2 +REG epsg:3014 4 0x1.64p4 0x1.4p2 +REG epsg:3015 0 0x1.2cp4 0x0.0p0 +REG epsg:3015 1 0x1.b8p3 -0x1.4p2 +REG epsg:3015 2 0x1.7cp4 -0x1.4p2 +REG epsg:3015 3 0x1.b8p3 0x1.4p2 +REG epsg:3015 4 0x1.7cp4 0x1.4p2 +REG epsg:3016 0 0x1.44p4 0x0.0p0 +REG epsg:3016 1 0x1.e8p3 -0x1.4p2 +REG epsg:3016 2 0x1.94p4 -0x1.4p2 +REG epsg:3016 3 0x1.e8p3 0x1.4p2 +REG epsg:3016 4 0x1.94p4 0x1.4p2 +REG epsg:30161 0 0x1.03p7 0x1.08p5 +REG epsg:30161 1 0x1.ee271995b65ffp6 0x1.cp4 +REG epsg:30161 2 0x1.0eec733524d01p7 0x1.cp4 +REG epsg:30161 3 0x1.ee271995b65ffp6 0x1.3p5 +REG epsg:30161 4 0x1.0eec733524d01p7 0x1.3p5 +REG epsg:30162 0 0x1.06p7 0x1.08p5 +REG epsg:30162 1 0x1.f4271995b65ffp6 0x1.cp4 +REG epsg:30162 2 0x1.11ec733524d01p7 0x1.cp4 +REG epsg:30162 3 0x1.f4271995b65ffp6 0x1.3p5 +REG epsg:30162 4 0x1.11ec733524d01p7 0x1.3p5 +REG epsg:30163 0 0x1.0855555555557p7 0x1.2p5 +REG epsg:30163 1 0x1.f7f1ffa5aec74p6 0x1.fp4 +REG epsg:30163 2 0x1.14b1aad7d3474p7 0x1.fp4 +REG epsg:30163 3 0x1.f7f1ffa5aec74p6 0x1.48p5 +REG epsg:30163 4 0x1.14b1aad7d3474p7 0x1.48p5 +REG epsg:30164 0 0x1.0bp7 0x1.08p5 +REG epsg:30164 1 0x1.fe271995b65ffp6 0x1.cp4 +REG epsg:30164 2 0x1.16ec733524d01p7 0x1.cp4 +REG epsg:30164 3 0x1.fe271995b65ffp6 0x1.3p5 +REG epsg:30164 4 0x1.16ec733524d01p7 0x1.3p5 +REG epsg:30165 0 0x1.0caaaaaaaaaa9p7 0x1.2p5 +REG epsg:30165 1 0x1.004e55282cb8cp7 0x1.fp4 +REG epsg:30165 2 0x1.1907002d289c6p7 0x1.fp4 +REG epsg:30165 3 0x1.004e55282cb8cp7 0x1.48p5 +REG epsg:30165 4 0x1.1907002d289c6p7 0x1.48p5 +REG epsg:30166 0 0x1.1p7 0x1.2p5 +REG epsg:30166 1 0x1.03a3aa7d820e3p7 0x1.fp4 +REG epsg:30166 2 0x1.1c5c55827df1dp7 0x1.fp4 +REG epsg:30166 3 0x1.03a3aa7d820e3p7 0x1.48p5 +REG epsg:30166 4 0x1.1c5c55827df1dp7 0x1.48p5 +REG epsg:30167 0 0x1.1255555555557p7 0x1.2p5 +REG epsg:30167 1 0x1.05f8ffd2d763ap7 0x1.fp4 +REG epsg:30167 2 0x1.1eb1aad7d3474p7 0x1.fp4 +REG epsg:30167 3 0x1.05f8ffd2d763ap7 0x1.48p5 +REG epsg:30167 4 0x1.1eb1aad7d3474p7 0x1.48p5 +REG epsg:30168 0 0x1.15p7 0x1.2p5 +REG epsg:30168 1 0x1.08a3aa7d820e3p7 0x1.fp4 +REG epsg:30168 2 0x1.215c55827df1dp7 0x1.fp4 +REG epsg:30168 3 0x1.08a3aa7d820e3p7 0x1.48p5 +REG epsg:30168 4 0x1.215c55827df1dp7 0x1.48p5 +REG epsg:30169 0 0x1.17aaaaaaaaaa9p7 0x1.2p5 +REG epsg:30169 1 0x1.0b4e55282cb8cp7 0x1.fp4 +REG epsg:30169 2 0x1.2407002d289c6p7 0x1.fp4 +REG epsg:30169 3 0x1.0b4e55282cb8cp7 0x1.48p5 +REG epsg:30169 4 0x1.2407002d289c6p7 0x1.48p5 +REG epsg:3017 0 0x1.5cp4 0x0.0p0 +REG epsg:3017 1 0x1.0cp4 -0x1.4p2 +REG epsg:3017 2 0x1.acp4 -0x1.4p2 +REG epsg:3017 3 0x1.0cp4 0x1.4p2 +REG epsg:3017 4 0x1.acp4 0x1.4p2 +REG epsg:30170 0 0x1.19aaaaaaaaaa9p7 0x1.4p5 +REG epsg:30170 1 0x1.0c9cd2f20e3ebp7 0x1.18p5 +REG epsg:30170 2 0x1.26b8826347167p7 0x1.18p5 +REG epsg:30170 3 0x1.0c9cd2f20e3ebp7 0x1.68p5 +REG epsg:30170 4 0x1.26b8826347167p7 0x1.68p5 +REG epsg:30171 0 0x1.188p7 0x1.6p5 +REG epsg:30171 1 0x1.0a992e6394ef4p7 0x1.38p5 +REG epsg:30171 2 0x1.2666d19c6b10cp7 0x1.38p5 +REG epsg:30171 3 0x1.0a992e6394ef4p7 0x1.88p5 +REG epsg:30171 4 0x1.2666d19c6b10cp7 0x1.88p5 +REG epsg:30172 0 0x1.1c8p7 0x1.6p5 +REG epsg:30172 1 0x1.0e992e6394ef4p7 0x1.38p5 +REG epsg:30172 2 0x1.2a66d19c6b10cp7 0x1.38p5 +REG epsg:30172 3 0x1.0e992e6394ef4p7 0x1.88p5 +REG epsg:30172 4 0x1.2a66d19c6b10cp7 0x1.88p5 +REG epsg:30173 0 0x1.208p7 0x1.6p5 +REG epsg:30173 1 0x1.12992e6394ef4p7 0x1.38p5 +REG epsg:30173 2 0x1.2e66d19c6b10cp7 0x1.38p5 +REG epsg:30173 3 0x1.12992e6394ef4p7 0x1.88p5 +REG epsg:30173 4 0x1.2e66d19c6b10cp7 0x1.88p5 +REG epsg:30174 0 0x1.1cp7 0x1.ap4 +REG epsg:30174 1 0x1.10dfbd3139edep7 0x1.5p4 +REG epsg:30174 2 0x1.272042cec6122p7 0x1.5p4 +REG epsg:30174 3 0x1.10dfbd3139edep7 0x1.fp4 +REG epsg:30174 4 0x1.272042cec6122p7 0x1.fp4 +REG epsg:30175 0 0x1.fep6 0x1.ap4 +REG epsg:30175 1 0x1.e7bf7a6273dbcp6 0x1.5p4 +REG epsg:30175 2 0x1.0a2042cec6122p7 0x1.5p4 +REG epsg:30175 3 0x1.e7bf7a6273dbcp6 0x1.fp4 +REG epsg:30175 4 0x1.0a2042cec6122p7 0x1.fp4 +REG epsg:30176 0 0x1.fp6 0x1.ap4 +REG epsg:30176 1 0x1.d9bf7a6273dbcp6 0x1.5p4 +REG epsg:30176 2 0x1.032042cec6122p7 0x1.5p4 +REG epsg:30176 3 0x1.d9bf7a6273dbcp6 0x1.fp4 +REG epsg:30176 4 0x1.032042cec6122p7 0x1.fp4 +REG epsg:30177 0 0x1.06p7 0x1.ap4 +REG epsg:30177 1 0x1.f5bf7a6273dbcp6 0x1.5p4 +REG epsg:30177 2 0x1.112042cec6122p7 0x1.5p4 +REG epsg:30177 3 0x1.f5bf7a6273dbcp6 0x1.fp4 +REG epsg:30177 4 0x1.112042cec6122p7 0x1.fp4 +REG epsg:30178 0 0x1.1p7 0x1.4p4 +REG epsg:30178 1 0x1.055bb4747cdbcp7 0x1.ep3 +REG epsg:30178 2 0x1.1aa44b8b83244p7 0x1.ep3 +REG epsg:30178 3 0x1.055bb4747cdbcp7 0x1.9p4 +REG epsg:30178 4 0x1.1aa44b8b83244p7 0x1.9p4 +REG epsg:30179 0 0x1.34p7 0x1.ap4 +REG epsg:30179 1 0x1.28dfbd3139edep7 0x1.5p4 +REG epsg:30179 2 0x1.3f2042cec6122p7 0x1.5p4 +REG epsg:30179 3 0x1.28dfbd3139edep7 0x1.fp4 +REG epsg:30179 4 0x1.3f2042cec6122p7 0x1.fp4 +REG epsg:3018 0 0x1.74p4 0x0.0p0 +REG epsg:3018 1 0x1.24p4 -0x1.4p2 +REG epsg:3018 2 0x1.c4p4 -0x1.4p2 +REG epsg:3018 3 0x1.24p4 0x1.4p2 +REG epsg:3018 4 0x1.c4p4 0x1.4p2 +REG epsg:3019 0 0x1.69dd695bb473bp3 0x0.0p0 +REG epsg:3019 1 0x1.93bad2b768e76p2 -0x1.4p2 +REG epsg:3019 2 0x1.04eeb4adda39ep4 -0x1.4p2 +REG epsg:3019 3 0x1.93bad2b768e76p2 0x1.4p2 +REG epsg:3019 4 0x1.04eeb4adda39ep4 0x1.4p2 +REG epsg:3020 0 0x1.b1dd695bb473bp3 0x0.0p0 +REG epsg:3020 1 0x1.11dd695bb473bp3 -0x1.4p2 +REG epsg:3020 2 0x1.28eeb4adda39ep4 -0x1.4p2 +REG epsg:3020 3 0x1.11dd695bb473bp3 0x1.4p2 +REG epsg:3020 4 0x1.28eeb4adda39ep4 0x1.4p2 +REG epsg:30200 0 -0x1.eaaaaaaaaaaacp5 0x1.4e22222222224p3 +REG epsg:30200 1 -0x1.09ab8c7155973p6 0x1.5c44444444448p2 +REG epsg:30200 2 -0x1.c1fe3c72aa271p5 0x1.5c44444444448p2 +REG epsg:30200 3 -0x1.09ab8c7155973p6 0x1.ee22222222224p3 +REG epsg:30200 4 -0x1.c1fe3c72aa271p5 0x1.ee22222222224p3 +REG epsg:3021 0 0x1.f9dd695bb473bp3 0x0.0p0 +REG epsg:3021 1 0x1.59dd695bb473bp3 -0x1.4p2 +REG epsg:3021 2 0x1.4ceeb4adda39ep4 -0x1.4p2 +REG epsg:3021 3 0x1.59dd695bb473bp3 0x1.4p2 +REG epsg:3021 4 0x1.4ceeb4adda39ep4 0x1.4p2 +REG epsg:3022 0 0x1.20eeb4adda39dp4 0x0.0p0 +REG epsg:3022 1 0x1.a1dd695bb473ap3 -0x1.4p2 +REG epsg:3022 2 0x1.70eeb4adda39dp4 -0x1.4p2 +REG epsg:3022 3 0x1.a1dd695bb473ap3 0x1.4p2 +REG epsg:3022 4 0x1.70eeb4adda39dp4 0x1.4p2 +REG epsg:3023 0 0x1.44eeb4adda39dp4 0x0.0p0 +REG epsg:3023 1 0x1.e9dd695bb473ap3 -0x1.4p2 +REG epsg:3023 2 0x1.94eeb4adda39dp4 -0x1.4p2 +REG epsg:3023 3 0x1.e9dd695bb473ap3 0x1.4p2 +REG epsg:3023 4 0x1.94eeb4adda39dp4 0x1.4p2 +REG epsg:3024 0 0x1.68eeb4adda39dp4 0x0.0p0 +REG epsg:3024 1 0x1.18eeb4adda39dp4 -0x1.4p2 +REG epsg:3024 2 0x1.b8eeb4adda39dp4 -0x1.4p2 +REG epsg:3024 3 0x1.18eeb4adda39dp4 0x1.4p2 +REG epsg:3024 4 0x1.b8eeb4adda39dp4 0x1.4p2 +REG epsg:3025 0 0x1.69dd695bb473bp3 0x0.0p0 +REG epsg:3025 1 0x1.93bad2b768e76p2 -0x1.4p2 +REG epsg:3025 2 0x1.04eeb4adda39ep4 -0x1.4p2 +REG epsg:3025 3 0x1.93bad2b768e76p2 0x1.4p2 +REG epsg:3025 4 0x1.04eeb4adda39ep4 0x1.4p2 +REG epsg:3026 0 0x1.b1dd695bb473bp3 0x0.0p0 +REG epsg:3026 1 0x1.11dd695bb473bp3 -0x1.4p2 +REG epsg:3026 2 0x1.28eeb4adda39ep4 -0x1.4p2 +REG epsg:3026 3 0x1.11dd695bb473bp3 0x1.4p2 +REG epsg:3026 4 0x1.28eeb4adda39ep4 0x1.4p2 +REG epsg:3027 0 0x1.f9dd695bb473bp3 0x0.0p0 +REG epsg:3027 1 0x1.59dd695bb473bp3 -0x1.4p2 +REG epsg:3027 2 0x1.4ceeb4adda39ep4 -0x1.4p2 +REG epsg:3027 3 0x1.59dd695bb473bp3 0x1.4p2 +REG epsg:3027 4 0x1.4ceeb4adda39ep4 0x1.4p2 +REG epsg:3028 0 0x1.20eeb4adda39dp4 0x0.0p0 +REG epsg:3028 1 0x1.a1dd695bb473ap3 -0x1.4p2 +REG epsg:3028 2 0x1.70eeb4adda39dp4 -0x1.4p2 +REG epsg:3028 3 0x1.a1dd695bb473ap3 0x1.4p2 +REG epsg:3028 4 0x1.70eeb4adda39dp4 0x1.4p2 +REG epsg:3029 0 0x1.44eeb4adda39dp4 0x0.0p0 +REG epsg:3029 1 0x1.e9dd695bb473ap3 -0x1.4p2 +REG epsg:3029 2 0x1.94eeb4adda39dp4 -0x1.4p2 +REG epsg:3029 3 0x1.e9dd695bb473ap3 0x1.4p2 +REG epsg:3029 4 0x1.94eeb4adda39dp4 0x1.4p2 +REG epsg:3030 0 0x1.68eeb4adda39dp4 0x0.0p0 +REG epsg:3030 1 0x1.18eeb4adda39dp4 -0x1.4p2 +REG epsg:3030 2 0x1.b8eeb4adda39dp4 -0x1.4p2 +REG epsg:3030 3 0x1.18eeb4adda39dp4 0x1.4p2 +REG epsg:3030 4 0x1.b8eeb4adda39dp4 0x1.4p2 +REG epsg:3031 0 0x0.0p0 -0x1.42p6 +REG epsg:3031 1 -0x1.ep5 -0x1.64p6 +REG epsg:3031 2 0x1.ep5 -0x1.64p6 +REG epsg:3031 3 -0x1.ep5 -0x1.06p6 +REG epsg:3031 4 0x1.ep5 -0x1.06p6 +REG epsg:3032 0 0x1.18p6 -0x1.42p6 +REG epsg:3032 1 0x1.4p3 -0x1.64p6 +REG epsg:3032 2 0x1.04p7 -0x1.64p6 +REG epsg:3032 3 0x1.4p3 -0x1.06p6 +REG epsg:3032 4 0x1.04p7 -0x1.06p6 +REG epsg:3033 0 0x1.18p6 -0x1.f2p5 +REG epsg:3033 1 0x1.2e46ad17b5936p5 -0x1.35p6 +REG epsg:3033 2 0x1.98dca97425365p6 -0x1.35p6 +REG epsg:3033 3 0x1.2e46ad17b5936p5 -0x1.7ap5 +REG epsg:3033 4 0x1.98dca97425365p6 -0x1.7ap5 +REG epsg:30339 0 0x1.98p5 0x0.0p0 +REG epsg:30339 1 0x1.7p5 -0x1.4p2 +REG epsg:30339 2 0x1.cp5 -0x1.4p2 +REG epsg:30339 3 0x1.7p5 0x1.4p2 +REG epsg:30339 4 0x1.cp5 0x1.4p2 +REG epsg:3034 0 0x1.4p3 0x1.9p5 +REG epsg:3034 1 -0x1.aabf5806333fep3 0x1.18p5 +REG epsg:3034 2 0x1.0aafd6018cdp5 0x1.18p5 +REG epsg:3034 3 -0x1.aabf5806333fep3 0x1.04p6 +REG epsg:3034 4 0x1.0aafd6018cdp5 0x1.04p6 +REG epsg:30340 0 0x1.c8p5 0x0.0p0 +REG epsg:30340 1 0x1.ap5 -0x1.4p2 +REG epsg:30340 2 0x1.fp5 -0x1.4p2 +REG epsg:30340 3 0x1.ap5 0x1.4p2 +REG epsg:30340 4 0x1.fp5 0x1.4p2 +REG epsg:3035 0 0x1.4p3 0x1.ap5 +REG epsg:3035 1 0x1.e0ef7421c3ddp0 0x1.78p5 +REG epsg:3035 2 0x1.21f108bde3c23p4 0x1.78p5 +REG epsg:3035 3 0x1.e0ef7421c3ddp0 0x1.c8p5 +REG epsg:3035 4 0x1.21f108bde3c23p4 0x1.c8p5 +REG epsg:3036 0 0x1.08p5 -0x1.9p4 +REG epsg:3036 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:3036 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:3036 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:3036 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:3037 0 0x1.38p5 -0x1.9p4 +REG epsg:3037 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:3037 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:3037 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:3037 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:3038 0 -0x1.bp4 0x0.0p0 +REG epsg:3038 1 -0x1.0p5 -0x1.4p2 +REG epsg:3038 2 -0x1.6p4 -0x1.4p2 +REG epsg:3038 3 -0x1.0p5 0x1.4p2 +REG epsg:3038 4 -0x1.6p4 0x1.4p2 +REG epsg:3039 0 -0x1.5p4 0x0.0p0 +REG epsg:3039 1 -0x1.ap4 -0x1.4p2 +REG epsg:3039 2 -0x1.0p4 -0x1.4p2 +REG epsg:3039 3 -0x1.ap4 0x1.4p2 +REG epsg:3039 4 -0x1.0p4 0x1.4p2 +REG epsg:3040 0 -0x1.ep3 0x0.0p0 +REG epsg:3040 1 -0x1.4p4 -0x1.4p2 +REG epsg:3040 2 -0x1.4p3 -0x1.4p2 +REG epsg:3040 3 -0x1.4p4 0x1.4p2 +REG epsg:3040 4 -0x1.4p3 0x1.4p2 +REG epsg:3041 0 -0x1.2p3 0x0.0p0 +REG epsg:3041 1 -0x1.cp3 -0x1.4p2 +REG epsg:3041 2 -0x1.0p2 -0x1.4p2 +REG epsg:3041 3 -0x1.cp3 0x1.4p2 +REG epsg:3041 4 -0x1.0p2 0x1.4p2 +REG epsg:3042 0 -0x1.8p1 0x0.0p0 +REG epsg:3042 1 -0x1.0p3 -0x1.4p2 +REG epsg:3042 2 0x1.0p1 -0x1.4p2 +REG epsg:3042 3 -0x1.0p3 0x1.4p2 +REG epsg:3042 4 0x1.0p1 0x1.4p2 +REG epsg:3043 0 0x1.8p1 0x0.0p0 +REG epsg:3043 1 -0x1.0p1 -0x1.4p2 +REG epsg:3043 2 0x1.0p3 -0x1.4p2 +REG epsg:3043 3 -0x1.0p1 0x1.4p2 +REG epsg:3043 4 0x1.0p3 0x1.4p2 +REG epsg:3044 0 0x1.2p3 0x0.0p0 +REG epsg:3044 1 0x1.0p2 -0x1.4p2 +REG epsg:3044 2 0x1.cp3 -0x1.4p2 +REG epsg:3044 3 0x1.0p2 0x1.4p2 +REG epsg:3044 4 0x1.cp3 0x1.4p2 +REG epsg:3045 0 0x1.ep3 0x0.0p0 +REG epsg:3045 1 0x1.4p3 -0x1.4p2 +REG epsg:3045 2 0x1.4p4 -0x1.4p2 +REG epsg:3045 3 0x1.4p3 0x1.4p2 +REG epsg:3045 4 0x1.4p4 0x1.4p2 +REG epsg:3046 0 0x1.5p4 0x0.0p0 +REG epsg:3046 1 0x1.0p4 -0x1.4p2 +REG epsg:3046 2 0x1.ap4 -0x1.4p2 +REG epsg:3046 3 0x1.0p4 0x1.4p2 +REG epsg:3046 4 0x1.ap4 0x1.4p2 +REG epsg:3047 0 0x1.bp4 0x0.0p0 +REG epsg:3047 1 0x1.6p4 -0x1.4p2 +REG epsg:3047 2 0x1.0p5 -0x1.4p2 +REG epsg:3047 3 0x1.6p4 0x1.4p2 +REG epsg:3047 4 0x1.0p5 0x1.4p2 +REG epsg:3048 0 0x1.08p5 0x0.0p0 +REG epsg:3048 1 0x1.cp4 -0x1.4p2 +REG epsg:3048 2 0x1.3p5 -0x1.4p2 +REG epsg:3048 3 0x1.cp4 0x1.4p2 +REG epsg:3048 4 0x1.3p5 0x1.4p2 +REG epsg:3049 0 0x1.38p5 0x0.0p0 +REG epsg:3049 1 0x1.1p5 -0x1.4p2 +REG epsg:3049 2 0x1.6p5 -0x1.4p2 +REG epsg:3049 3 0x1.1p5 0x1.4p2 +REG epsg:3049 4 0x1.6p5 0x1.4p2 +REG epsg:30491 0 0x1.599999999999ap1 0x1.2p5 +REG epsg:30491 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG epsg:30491 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG epsg:30491 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG epsg:30491 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG epsg:30492 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG epsg:30492 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG epsg:30492 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG epsg:30492 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG epsg:30492 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG epsg:30493 0 0x1.599999999999ap1 0x1.2p5 +REG epsg:30493 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG epsg:30493 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG epsg:30493 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG epsg:30493 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG epsg:30494 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG epsg:30494 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG epsg:30494 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG epsg:30494 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG epsg:30494 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG epsg:3050 0 0x1.68p5 0x0.0p0 +REG epsg:3050 1 0x1.4p5 -0x1.4p2 +REG epsg:3050 2 0x1.9p5 -0x1.4p2 +REG epsg:3050 3 0x1.4p5 0x1.4p2 +REG epsg:3050 4 0x1.9p5 0x1.4p2 +REG epsg:3051 0 0x1.98p5 0x0.0p0 +REG epsg:3051 1 0x1.7p5 -0x1.4p2 +REG epsg:3051 2 0x1.cp5 -0x1.4p2 +REG epsg:3051 3 0x1.7p5 0x1.4p2 +REG epsg:3051 4 0x1.cp5 0x1.4p2 +REG epsg:3054 0 -0x1.bp4 0x0.0p0 +REG epsg:3054 1 -0x1.0p5 -0x1.4p2 +REG epsg:3054 2 -0x1.6p4 -0x1.4p2 +REG epsg:3054 3 -0x1.0p5 0x1.4p2 +REG epsg:3054 4 -0x1.6p4 0x1.4p2 +REG epsg:3055 0 -0x1.5p4 0x0.0p0 +REG epsg:3055 1 -0x1.ap4 -0x1.4p2 +REG epsg:3055 2 -0x1.0p4 -0x1.4p2 +REG epsg:3055 3 -0x1.ap4 0x1.4p2 +REG epsg:3055 4 -0x1.0p4 0x1.4p2 +REG epsg:3056 0 -0x1.ep3 0x0.0p0 +REG epsg:3056 1 -0x1.4p4 -0x1.4p2 +REG epsg:3056 2 -0x1.4p3 -0x1.4p2 +REG epsg:3056 3 -0x1.4p4 0x1.4p2 +REG epsg:3056 4 -0x1.4p3 0x1.4p2 +REG epsg:3057 0 -0x1.3p4 0x1.04p6 +REG epsg:3057 1 -0x1.68c9f1497133ap4 0x1.fcp5 +REG epsg:3057 2 -0x1.ee6c1d6d1d98cp3 0x1.fcp5 +REG epsg:3057 3 -0x1.68c9f1497133ap4 0x1.0ap6 +REG epsg:3057 4 -0x1.ee6c1d6d1d98cp3 0x1.0ap6 +REG epsg:3058 0 -0x1.1p3 0x0.0p0 +REG epsg:3058 1 -0x1.bp3 -0x1.4p2 +REG epsg:3058 2 -0x1.cp1 -0x1.4p2 +REG epsg:3058 3 -0x1.bp3 0x1.4p2 +REG epsg:3058 4 -0x1.cp1 0x1.4p2 +REG epsg:3059 0 0x1.8p4 0x0.0p0 +REG epsg:3059 1 0x1.3p4 -0x1.4p2 +REG epsg:3059 2 0x1.dp4 -0x1.4p2 +REG epsg:3059 3 0x1.3p4 0x1.4p2 +REG epsg:3059 4 0x1.dp4 0x1.4p2 +REG epsg:3060 0 0x1.4ap7 -0x1.9p4 +REG epsg:3060 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:3060 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:3060 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:3060 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:3061 0 -0x1.ep3 0x0.0p0 +REG epsg:3061 1 -0x1.4p4 -0x1.4p2 +REG epsg:3061 2 -0x1.4p3 -0x1.4p2 +REG epsg:3061 3 -0x1.4p4 0x1.4p2 +REG epsg:3061 4 -0x1.4p3 0x1.4p2 +REG epsg:3062 0 -0x1.bp4 0x0.0p0 +REG epsg:3062 1 -0x1.0p5 -0x1.4p2 +REG epsg:3062 2 -0x1.6p4 -0x1.4p2 +REG epsg:3062 3 -0x1.0p5 0x1.4p2 +REG epsg:3062 4 -0x1.6p4 0x1.4p2 +REG epsg:3063 0 -0x1.bp4 0x0.0p0 +REG epsg:3063 1 -0x1.0p5 -0x1.4p2 +REG epsg:3063 2 -0x1.6p4 -0x1.4p2 +REG epsg:3063 3 -0x1.0p5 0x1.4p2 +REG epsg:3063 4 -0x1.6p4 0x1.4p2 +REG epsg:3064 0 0x1.2p3 0x0.0p0 +REG epsg:3064 1 0x1.0p2 -0x1.4p2 +REG epsg:3064 2 0x1.cp3 -0x1.4p2 +REG epsg:3064 3 0x1.0p2 0x1.4p2 +REG epsg:3064 4 0x1.cp3 0x1.4p2 +REG epsg:3065 0 0x1.ep3 0x0.0p0 +REG epsg:3065 1 0x1.4p3 -0x1.4p2 +REG epsg:3065 2 0x1.4p4 -0x1.4p2 +REG epsg:3065 3 0x1.4p3 0x1.4p2 +REG epsg:3065 4 0x1.4p4 0x1.4p2 +REG epsg:3066 0 0x1.28p5 0x0.0p0 +REG epsg:3066 1 0x1.0p5 -0x1.4p2 +REG epsg:3066 2 0x1.5p5 -0x1.4p2 +REG epsg:3066 3 0x1.0p5 0x1.4p2 +REG epsg:3066 4 0x1.5p5 0x1.4p2 +REG epsg:3067 0 0x1.bp4 0x0.0p0 +REG epsg:3067 1 0x1.6p4 -0x1.4p2 +REG epsg:3067 2 0x1.0p5 -0x1.4p2 +REG epsg:3067 3 0x1.6p4 0x1.4p2 +REG epsg:3067 4 0x1.0p5 0x1.4p2 +REG epsg:3068 0 0x1.b4120d6c8877ep3 0x1.a3596444aca88p5 +REG epsg:3068 1 0x1.5b7432c9e9a08p2 0x1.7b596444aca88p5 +REG epsg:3068 2 0x1.5d3500ba0e0fcp4 0x1.7b596444aca88p5 +REG epsg:3068 3 0x1.5b7432c9e9a08p2 0x1.cb596444aca88p5 +REG epsg:3068 4 0x1.5d3500ba0e0fcp4 0x1.cb596444aca88p5 +REG epsg:3069 0 -0x1.68p6 0x0.0p0 +REG epsg:3069 1 -0x1.7cp6 -0x1.4p2 +REG epsg:3069 2 -0x1.54p6 -0x1.4p2 +REG epsg:3069 3 -0x1.7cp6 0x1.4p2 +REG epsg:3069 4 -0x1.54p6 0x1.4p2 +REG epsg:3070 0 -0x1.68p6 0x0.0p0 +REG epsg:3070 1 -0x1.7cp6 -0x1.4p2 +REG epsg:3070 2 -0x1.54p6 -0x1.4p2 +REG epsg:3070 3 -0x1.7cp6 0x1.4p2 +REG epsg:3070 4 -0x1.54p6 0x1.4p2 +REG epsg:3071 0 -0x1.68p6 0x0.0p0 +REG epsg:3071 1 -0x1.7cp6 -0x1.4p2 +REG epsg:3071 2 -0x1.54p6 -0x1.4p2 +REG epsg:3071 3 -0x1.7cp6 0x1.4p2 +REG epsg:3071 4 -0x1.54p6 0x1.4p2 +REG epsg:3072 0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3072 1 -0x1.2b39bac668c18p6 0x1.36aaaaaaaaaacp5 +REG epsg:3072 2 -0x1.e78c8a732e7dp5 0x1.36aaaaaaaaaacp5 +REG epsg:3072 3 -0x1.2b39bac668c18p6 0x1.86aaaaaaaaaacp5 +REG epsg:3072 4 -0x1.e78c8a732e7dp5 0x1.86aaaaaaaaaacp5 +REG epsg:30729 0 -0x1.2p3 0x0.0p0 +REG epsg:30729 1 -0x1.cp3 -0x1.4p2 +REG epsg:30729 2 -0x1.0p2 -0x1.4p2 +REG epsg:30729 3 -0x1.cp3 0x1.4p2 +REG epsg:30729 4 -0x1.0p2 0x1.4p2 +REG epsg:3073 0 -0x1.148p6 0x1.58p5 +REG epsg:3073 1 -0x1.2fd8b77326d2dp6 0x1.3p5 +REG epsg:3073 2 -0x1.f24e9119b25a5p5 0x1.3p5 +REG epsg:3073 3 -0x1.2fd8b77326d2dp6 0x1.8p5 +REG epsg:3073 4 -0x1.f24e9119b25a5p5 0x1.8p5 +REG epsg:30730 0 -0x1.8p1 0x0.0p0 +REG epsg:30730 1 -0x1.0p3 -0x1.4p2 +REG epsg:30730 2 0x1.0p1 -0x1.4p2 +REG epsg:30730 3 -0x1.0p3 0x1.4p2 +REG epsg:30730 4 0x1.0p1 0x1.4p2 +REG epsg:30731 0 0x1.8p1 0x0.0p0 +REG epsg:30731 1 -0x1.0p1 -0x1.4p2 +REG epsg:30731 2 0x1.0p3 -0x1.4p2 +REG epsg:30731 3 -0x1.0p1 0x1.4p2 +REG epsg:30731 4 0x1.0p3 0x1.4p2 +REG epsg:30732 0 0x1.2p3 0x0.0p0 +REG epsg:30732 1 0x1.0p2 -0x1.4p2 +REG epsg:30732 2 0x1.cp3 -0x1.4p2 +REG epsg:30732 3 0x1.0p2 0x1.4p2 +REG epsg:30732 4 0x1.cp3 0x1.4p2 +REG epsg:3074 0 -0x1.198p6 0x1.56aaaaaaaaaacp5 +REG epsg:3074 1 -0x1.34c5ceb6fdb05p6 0x1.2eaaaaaaaaaacp5 +REG epsg:3074 2 -0x1.fc746292049f5p5 0x1.2eaaaaaaaaaacp5 +REG epsg:3074 3 -0x1.34c5ceb6fdb05p6 0x1.7eaaaaaaaaaacp5 +REG epsg:3074 4 -0x1.fc746292049f5p5 0x1.7eaaaaaaaaaacp5 +REG epsg:3075 0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3075 1 -0x1.2b39bac668c18p6 0x1.36aaaaaaaaaacp5 +REG epsg:3075 2 -0x1.e78c8a732e7dp5 0x1.36aaaaaaaaaacp5 +REG epsg:3075 3 -0x1.2b39bac668c18p6 0x1.86aaaaaaaaaacp5 +REG epsg:3075 4 -0x1.e78c8a732e7dp5 0x1.86aaaaaaaaaacp5 +REG epsg:3076 0 -0x1.148p6 0x1.58p5 +REG epsg:3076 1 -0x1.2fd8b77326d2dp6 0x1.3p5 +REG epsg:3076 2 -0x1.f24e9119b25a5p5 0x1.3p5 +REG epsg:3076 3 -0x1.2fd8b77326d2dp6 0x1.8p5 +REG epsg:3076 4 -0x1.f24e9119b25a5p5 0x1.8p5 +REG epsg:3077 0 -0x1.198p6 0x1.56aaaaaaaaaacp5 +REG epsg:3077 1 -0x1.34c5ceb6fdb05p6 0x1.2eaaaaaaaaaacp5 +REG epsg:3077 2 -0x1.fc746292049f5p5 0x1.2eaaaaaaaaaacp5 +REG epsg:3077 3 -0x1.34c5ceb6fdb05p6 0x1.7eaaaaaaaaaacp5 +REG epsg:3077 4 -0x1.fc746292049f5p5 0x1.7eaaaaaaaaaacp5 +REG epsg:3078 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG epsg:3078 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG epsg:3078 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG epsg:3078 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG epsg:3078 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG epsg:3079 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG epsg:3079 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG epsg:3079 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG epsg:3079 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG epsg:3079 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG epsg:30791 0 0x1.599999999999ap1 0x1.2p5 +REG epsg:30791 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG epsg:30791 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG epsg:30791 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG epsg:30791 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG epsg:30792 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG epsg:30792 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG epsg:30792 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG epsg:30792 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG epsg:30792 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG epsg:3080 0 -0x1.9p6 0x1.f2aaaaaaaaaaap4 +REG epsg:3080 1 -0x1.b30f7855f93e3p6 0x1.7aaaaaaaaaaaep4 +REG epsg:3080 2 -0x1.6cf087aa06c1dp6 0x1.7aaaaaaaaaaaep4 +REG epsg:3080 3 -0x1.b30f7855f93e3p6 0x1.3555555555553p5 +REG epsg:3080 4 -0x1.6cf087aa06c1dp6 0x1.3555555555553p5 +REG epsg:30800 0 0x1.f9dd695bb473bp3 0x0.0p0 +REG epsg:30800 1 0x1.59dd695bb473bp3 -0x1.4p2 +REG epsg:30800 2 0x1.4ceeb4adda39ep4 -0x1.4p2 +REG epsg:30800 3 0x1.59dd695bb473bp3 0x1.4p2 +REG epsg:30800 4 0x1.4ceeb4adda39ep4 0x1.4p2 +REG epsg:3081 0 -0x1.9p6 0x1.f2aaaaaaaaaaap4 +REG epsg:3081 1 -0x1.b30f7855f93e3p6 0x1.7aaaaaaaaaaaep4 +REG epsg:3081 2 -0x1.6cf087aa06c1dp6 0x1.7aaaaaaaaaaaep4 +REG epsg:3081 3 -0x1.b30f7855f93e3p6 0x1.3555555555553p5 +REG epsg:3081 4 -0x1.6cf087aa06c1dp6 0x1.3555555555553p5 +REG epsg:3082 0 -0x1.9p6 0x1.a8p4 +REG epsg:3082 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:3082 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:3082 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:3082 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:3083 0 -0x1.9p6 0x1.a8p4 +REG epsg:3083 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:3083 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:3083 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:3083 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:3084 0 -0x1.9p6 0x1.a8p4 +REG epsg:3084 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:3084 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:3084 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:3084 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:3085 0 -0x1.9p6 0x1.a8p4 +REG epsg:3085 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:3085 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:3085 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:3085 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:3086 0 -0x1.5p6 0x1.bcp4 +REG epsg:3086 1 -0x1.71e6165af8d1bp6 0x1.44p4 +REG epsg:3086 2 -0x1.2e19e9a5072e5p6 0x1.44p4 +REG epsg:3086 3 -0x1.71e6165af8d1bp6 0x1.1ap5 +REG epsg:3086 4 -0x1.2e19e9a5072e5p6 0x1.1ap5 +REG epsg:3087 0 -0x1.5p6 0x1.bcp4 +REG epsg:3087 1 -0x1.71e6165af8d1bp6 0x1.44p4 +REG epsg:3087 2 -0x1.2e19e9a5072e5p6 0x1.44p4 +REG epsg:3087 3 -0x1.71e6165af8d1bp6 0x1.1ap5 +REG epsg:3087 4 -0x1.2e19e9a5072e5p6 0x1.1ap5 +REG epsg:3088 0 -0x1.57p6 0x1.2cp5 +REG epsg:3088 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:3088 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:3088 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3088 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3089 0 -0x1.57p6 0x1.2cp5 +REG epsg:3089 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:3089 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:3089 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3089 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3090 0 -0x1.57p6 0x1.2cp5 +REG epsg:3090 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:3090 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:3090 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3090 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3091 0 -0x1.57p6 0x1.2cp5 +REG epsg:3091 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:3091 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:3091 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3091 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3092 0 0x1.ecp6 0x0.0p0 +REG epsg:3092 1 0x1.d8p6 -0x1.4p2 +REG epsg:3092 2 0x1.0p7 -0x1.4p2 +REG epsg:3092 3 0x1.d8p6 0x1.4p2 +REG epsg:3092 4 0x1.0p7 0x1.4p2 +REG epsg:3093 0 0x1.02p7 0x0.0p0 +REG epsg:3093 1 0x1.fp6 -0x1.4p2 +REG epsg:3093 2 0x1.0cp7 -0x1.4p2 +REG epsg:3093 3 0x1.fp6 0x1.4p2 +REG epsg:3093 4 0x1.0cp7 0x1.4p2 +REG epsg:3094 0 0x1.0ep7 0x0.0p0 +REG epsg:3094 1 0x1.04p7 -0x1.4p2 +REG epsg:3094 2 0x1.18p7 -0x1.4p2 +REG epsg:3094 3 0x1.04p7 0x1.4p2 +REG epsg:3094 4 0x1.18p7 0x1.4p2 +REG epsg:3095 0 0x1.1ap7 0x0.0p0 +REG epsg:3095 1 0x1.1p7 -0x1.4p2 +REG epsg:3095 2 0x1.24p7 -0x1.4p2 +REG epsg:3095 3 0x1.1p7 0x1.4p2 +REG epsg:3095 4 0x1.24p7 0x1.4p2 +REG epsg:3096 0 0x1.26p7 0x0.0p0 +REG epsg:3096 1 0x1.1cp7 -0x1.4p2 +REG epsg:3096 2 0x1.3p7 -0x1.4p2 +REG epsg:3096 3 0x1.1cp7 0x1.4p2 +REG epsg:3096 4 0x1.3p7 0x1.4p2 +REG epsg:3097 0 0x1.ecp6 0x0.0p0 +REG epsg:3097 1 0x1.d8p6 -0x1.4p2 +REG epsg:3097 2 0x1.0p7 -0x1.4p2 +REG epsg:3097 3 0x1.d8p6 0x1.4p2 +REG epsg:3097 4 0x1.0p7 0x1.4p2 +REG epsg:3098 0 0x1.02p7 0x0.0p0 +REG epsg:3098 1 0x1.fp6 -0x1.4p2 +REG epsg:3098 2 0x1.0cp7 -0x1.4p2 +REG epsg:3098 3 0x1.fp6 0x1.4p2 +REG epsg:3098 4 0x1.0cp7 0x1.4p2 +REG epsg:3099 0 0x1.0ep7 0x0.0p0 +REG epsg:3099 1 0x1.04p7 -0x1.4p2 +REG epsg:3099 2 0x1.18p7 -0x1.4p2 +REG epsg:3099 3 0x1.04p7 0x1.4p2 +REG epsg:3099 4 0x1.18p7 0x1.4p2 +REG epsg:3100 0 0x1.1ap7 0x0.0p0 +REG epsg:3100 1 0x1.1p7 -0x1.4p2 +REG epsg:3100 2 0x1.24p7 -0x1.4p2 +REG epsg:3100 3 0x1.1p7 0x1.4p2 +REG epsg:3100 4 0x1.24p7 0x1.4p2 +REG epsg:3101 0 0x1.26p7 0x0.0p0 +REG epsg:3101 1 0x1.1cp7 -0x1.4p2 +REG epsg:3101 2 0x1.3p7 -0x1.4p2 +REG epsg:3101 3 0x1.1cp7 0x1.4p2 +REG epsg:3101 4 0x1.3p7 0x1.4p2 +REG epsg:3102 0 -0x1.54p7 -0x1.c88888888888ap3 +REG epsg:3102 1 -0x1.5e5176f75656cp7 -0x1.3444444444445p4 +REG epsg:3102 2 -0x1.49ae8908a9a94p7 -0x1.3444444444445p4 +REG epsg:3102 3 -0x1.5e5176f75656cp7 -0x1.288888888888ap3 +REG epsg:3102 4 -0x1.49ae8908a9a94p7 -0x1.288888888888ap3 +REG epsg:31028 0 -0x1.ep3 0x0.0p0 +REG epsg:31028 1 -0x1.4p4 -0x1.4p2 +REG epsg:31028 2 -0x1.4p3 -0x1.4p2 +REG epsg:31028 3 -0x1.4p4 0x1.4p2 +REG epsg:31028 4 -0x1.4p3 0x1.4p2 +REG epsg:3103 0 -0x1.ep3 0x0.0p0 +REG epsg:3103 1 -0x1.4p4 -0x1.4p2 +REG epsg:3103 2 -0x1.4p3 -0x1.4p2 +REG epsg:3103 3 -0x1.4p4 0x1.4p2 +REG epsg:3103 4 -0x1.4p3 0x1.4p2 +REG epsg:3104 0 -0x1.2p3 0x0.0p0 +REG epsg:3104 1 -0x1.cp3 -0x1.4p2 +REG epsg:3104 2 -0x1.0p2 -0x1.4p2 +REG epsg:3104 3 -0x1.cp3 0x1.4p2 +REG epsg:3104 4 -0x1.0p2 0x1.4p2 +REG epsg:3105 0 -0x1.8p1 0x0.0p0 +REG epsg:3105 1 -0x1.0p3 -0x1.4p2 +REG epsg:3105 2 0x1.0p1 -0x1.4p2 +REG epsg:3105 3 -0x1.0p3 0x1.4p2 +REG epsg:3105 4 0x1.0p1 0x1.4p2 +REG epsg:3106 0 0x1.68p6 0x0.0p0 +REG epsg:3106 1 0x1.54p6 -0x1.4p2 +REG epsg:3106 2 0x1.7cp6 -0x1.4p2 +REG epsg:3106 3 0x1.54p6 0x1.4p2 +REG epsg:3106 4 0x1.7cp6 0x1.4p2 +REG epsg:3107 0 0x1.0ep7 -0x1.0p5 +REG epsg:3107 1 0x1.f6442ba72d213p6 -0x1.4p5 +REG epsg:3107 2 0x1.20ddea2c696f7p7 -0x1.4p5 +REG epsg:3107 3 0x1.f6442ba72d213p6 -0x1.8p4 +REG epsg:3107 4 0x1.20ddea2c696f7p7 -0x1.8p4 +REG epsg:3108 0 -0x1.3555555555556p1 0x1.8cp5 +REG epsg:3108 1 -0x1.43b245f9daa84p3 0x1.64p5 +REG epsg:3108 2 0x1.520f369e5ffb2p2 0x1.64p5 +REG epsg:3108 3 -0x1.43b245f9daa84p3 0x1.b4p5 +REG epsg:3108 4 0x1.520f369e5ffb2p2 0x1.b4p5 +REG epsg:3109 0 -0x1.1147ae147ae14p1 0x1.89ccccccccccdp5 +REG epsg:3109 1 -0x1.394f2228df91bp3 0x1.61ccccccccccdp5 +REG epsg:3109 2 0x1.6156963d44422p2 0x1.61ccccccccccdp5 +REG epsg:3109 3 -0x1.394f2228df91bp3 0x1.b1ccccccccccdp5 +REG epsg:3109 4 0x1.6156963d44422p2 0x1.b1ccccccccccdp5 +REG epsg:3110 0 0x1.22p7 -0x1.28p5 +REG epsg:3110 1 0x1.1cfdd02668412p7 -0x1.38p5 +REG epsg:3110 2 0x1.27022fd997beep7 -0x1.38p5 +REG epsg:3110 3 0x1.1cfdd02668412p7 -0x1.18p5 +REG epsg:3110 4 0x1.27022fd997beep7 -0x1.18p5 +REG epsg:3111 0 0x1.22p7 -0x1.28p5 +REG epsg:3111 1 0x1.1cfdd02668412p7 -0x1.38p5 +REG epsg:3111 2 0x1.27022fd997beep7 -0x1.38p5 +REG epsg:3111 3 0x1.1cfdd02668412p7 -0x1.18p5 +REG epsg:3111 4 0x1.27022fd997beep7 -0x1.18p5 +REG epsg:3112 0 0x1.0cp7 -0x1.2p4 +REG epsg:3112 1 0x1.d8e98a4ce3089p6 -0x1.08p5 +REG epsg:3112 2 0x1.2b8b3ad98e7bcp7 -0x1.08p5 +REG epsg:3112 3 0x1.d8e98a4ce3089p6 -0x1.8p1 +REG epsg:3112 4 0x1.2b8b3ad98e7bcp7 -0x1.8p1 +REG epsg:31121 0 -0x1.c8p5 0x0.0p0 +REG epsg:31121 1 -0x1.fp5 -0x1.4p2 +REG epsg:31121 2 -0x1.ap5 -0x1.4p2 +REG epsg:31121 3 -0x1.fp5 0x1.4p2 +REG epsg:31121 4 -0x1.ap5 0x1.4p2 +REG epsg:3113 0 0x1.32p7 -0x1.cp4 +REG epsg:3113 1 0x1.26ac9ee43e9d8p7 -0x1.08p5 +REG epsg:3113 2 0x1.3d53611bc1628p7 -0x1.08p5 +REG epsg:3113 3 0x1.26ac9ee43e9d8p7 -0x1.7p4 +REG epsg:3113 4 0x1.3d53611bc1628p7 -0x1.7p4 +REG epsg:3114 0 -0x1.404f5e3c3d0ecp6 0x1.262825cadc795p2 +REG epsg:3114 1 -0x1.545fe2daa4c31p6 -0x1.9d7da352386bp-2 +REG epsg:3114 2 -0x1.2c3ed99dd55a7p6 -0x1.9d7da352386bp-2 +REG epsg:3114 3 -0x1.545fe2daa4c31p6 0x1.331412e56e3cap3 +REG epsg:3114 4 -0x1.2c3ed99dd55a7p6 0x1.331412e56e3cap3 +REG epsg:3115 0 -0x1.344f5e3c3d0ecp6 0x1.262825cadc795p2 +REG epsg:3115 1 -0x1.485fe2daa4c31p6 -0x1.9d7da352386bp-2 +REG epsg:3115 2 -0x1.203ed99dd55a7p6 -0x1.9d7da352386bp-2 +REG epsg:3115 3 -0x1.485fe2daa4c31p6 0x1.331412e56e3cap3 +REG epsg:3115 4 -0x1.203ed99dd55a7p6 0x1.331412e56e3cap3 +REG epsg:31154 0 -0x1.bp5 0x0.0p0 +REG epsg:31154 1 -0x1.d8p5 -0x1.4p2 +REG epsg:31154 2 -0x1.88p5 -0x1.4p2 +REG epsg:31154 3 -0x1.d8p5 0x1.4p2 +REG epsg:31154 4 -0x1.88p5 0x1.4p2 +REG epsg:3116 0 -0x1.284f5e3c3d0ecp6 0x1.262825cadc795p2 +REG epsg:3116 1 -0x1.3c5fe2daa4c31p6 -0x1.9d7da352386bp-2 +REG epsg:3116 2 -0x1.143ed99dd55a7p6 -0x1.9d7da352386bp-2 +REG epsg:3116 3 -0x1.3c5fe2daa4c31p6 0x1.331412e56e3cap3 +REG epsg:3116 4 -0x1.143ed99dd55a7p6 0x1.331412e56e3cap3 +REG epsg:3117 0 -0x1.1c4f5e3c3d0ecp6 0x1.262825cadc795p2 +REG epsg:3117 1 -0x1.305fe2daa4c31p6 -0x1.9d7da352386bp-2 +REG epsg:3117 2 -0x1.083ed99dd55a7p6 -0x1.9d7da352386bp-2 +REG epsg:3117 3 -0x1.305fe2daa4c31p6 0x1.331412e56e3cap3 +REG epsg:3117 4 -0x1.083ed99dd55a7p6 0x1.331412e56e3cap3 +REG epsg:31170 0 -0x1.bd77777777777p5 0x0.0p0 +REG epsg:31170 1 -0x1.e577777777777p5 -0x1.4p2 +REG epsg:31170 2 -0x1.9577777777777p5 -0x1.4p2 +REG epsg:31170 3 -0x1.e577777777777p5 0x1.4p2 +REG epsg:31170 4 -0x1.9577777777777p5 0x1.4p2 +REG epsg:31171 0 -0x1.bd77777777777p5 0x0.0p0 +REG epsg:31171 1 -0x1.e577777777777p5 -0x1.4p2 +REG epsg:31171 2 -0x1.9577777777777p5 -0x1.4p2 +REG epsg:31171 3 -0x1.e577777777777p5 0x1.4p2 +REG epsg:31171 4 -0x1.9577777777777p5 0x1.4p2 +REG epsg:3118 0 -0x1.104f5e3c3d0ecp6 0x1.262825cadc795p2 +REG epsg:3118 1 -0x1.245fe2daa4c31p6 -0x1.9d7da352386bp-2 +REG epsg:3118 2 -0x1.f87db33baab4fp5 -0x1.9d7da352386bp-2 +REG epsg:3118 3 -0x1.245fe2daa4c31p6 0x1.331412e56e3cap3 +REG epsg:3118 4 -0x1.f87db33baab4fp5 0x1.331412e56e3cap3 +REG epsg:3119 0 0x1.5p3 0x0.0p0 +REG epsg:3119 1 0x1.6p2 -0x1.4p2 +REG epsg:3119 2 0x1.fp3 -0x1.4p2 +REG epsg:3119 3 0x1.6p2 0x1.4p2 +REG epsg:3119 4 0x1.fp3 0x1.4p2 +REG epsg:3120 0 0x1.5155555555554p4 0x1.95p5 +REG epsg:3120 1 0x1.a6750a37c615ep3 0x1.6dp5 +REG epsg:3120 2 0x1.cf70258ec79f9p4 0x1.6dp5 +REG epsg:3120 3 0x1.a6750a37c615ep3 0x1.bdp5 +REG epsg:3120 4 0x1.cf70258ec79f9p4 0x1.bdp5 +REG epsg:3121 0 0x1.d4p6 0x0.0p0 +REG epsg:3121 1 0x1.cp6 -0x1.4p2 +REG epsg:3121 2 0x1.e8p6 -0x1.4p2 +REG epsg:3121 3 0x1.cp6 0x1.4p2 +REG epsg:3121 4 0x1.e8p6 0x1.4p2 +REG epsg:3122 0 0x1.dcp6 0x0.0p0 +REG epsg:3122 1 0x1.c8p6 -0x1.4p2 +REG epsg:3122 2 0x1.fp6 -0x1.4p2 +REG epsg:3122 3 0x1.c8p6 0x1.4p2 +REG epsg:3122 4 0x1.fp6 0x1.4p2 +REG epsg:3123 0 0x1.e4p6 0x0.0p0 +REG epsg:3123 1 0x1.dp6 -0x1.4p2 +REG epsg:3123 2 0x1.f8p6 -0x1.4p2 +REG epsg:3123 3 0x1.dp6 0x1.4p2 +REG epsg:3123 4 0x1.f8p6 0x1.4p2 +REG epsg:3124 0 0x1.ecp6 0x0.0p0 +REG epsg:3124 1 0x1.d8p6 -0x1.4p2 +REG epsg:3124 2 0x1.0p7 -0x1.4p2 +REG epsg:3124 3 0x1.d8p6 0x1.4p2 +REG epsg:3124 4 0x1.0p7 0x1.4p2 +REG epsg:3125 0 0x1.f4p6 0x0.0p0 +REG epsg:3125 1 0x1.ep6 -0x1.4p2 +REG epsg:3125 2 0x1.04p7 -0x1.4p2 +REG epsg:3125 3 0x1.ep6 0x1.4p2 +REG epsg:3125 4 0x1.04p7 0x1.4p2 +REG epsg:31251 0 0x1.cp4 0x0.0p0 +REG epsg:31251 1 0x1.7p4 -0x1.4p2 +REG epsg:31251 2 0x1.08p5 -0x1.4p2 +REG epsg:31251 3 0x1.7p4 0x1.4p2 +REG epsg:31251 4 0x1.08p5 0x1.4p2 +REG epsg:31252 0 0x1.fp4 0x0.0p0 +REG epsg:31252 1 0x1.ap4 -0x1.4p2 +REG epsg:31252 2 0x1.2p5 -0x1.4p2 +REG epsg:31252 3 0x1.ap4 0x1.4p2 +REG epsg:31252 4 0x1.2p5 0x1.4p2 +REG epsg:31253 0 0x1.1p5 0x0.0p0 +REG epsg:31253 1 0x1.dp4 -0x1.4p2 +REG epsg:31253 2 0x1.38p5 -0x1.4p2 +REG epsg:31253 3 0x1.dp4 0x1.4p2 +REG epsg:31253 4 0x1.38p5 0x1.4p2 +REG epsg:31254 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31254 1 0x1.5555555555552p2 -0x1.4p2 +REG epsg:31254 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31254 3 0x1.5555555555552p2 0x1.4p2 +REG epsg:31254 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31255 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31255 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31255 2 0x1.2555555555554p4 -0x1.4p2 +REG epsg:31255 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31255 4 0x1.2555555555554p4 0x1.4p2 +REG epsg:31256 0 0x1.0555555555554p4 0x0.0p0 +REG epsg:31256 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG epsg:31256 2 0x1.5555555555554p4 -0x1.4p2 +REG epsg:31256 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG epsg:31256 4 0x1.5555555555554p4 0x1.4p2 +REG epsg:31257 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31257 1 0x1.5555555555552p2 -0x1.4p2 +REG epsg:31257 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31257 3 0x1.5555555555552p2 0x1.4p2 +REG epsg:31257 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31258 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31258 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31258 2 0x1.2555555555554p4 -0x1.4p2 +REG epsg:31258 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31258 4 0x1.2555555555554p4 0x1.4p2 +REG epsg:31259 0 0x1.0555555555554p4 0x0.0p0 +REG epsg:31259 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG epsg:31259 2 0x1.5555555555554p4 -0x1.4p2 +REG epsg:31259 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG epsg:31259 4 0x1.5555555555554p4 0x1.4p2 +REG epsg:3126 0 0x1.3p4 0x0.0p0 +REG epsg:3126 1 0x1.cp3 -0x1.4p2 +REG epsg:3126 2 0x1.8p4 -0x1.4p2 +REG epsg:3126 3 0x1.cp3 0x1.4p2 +REG epsg:3126 4 0x1.8p4 0x1.4p2 +REG epsg:31265 0 0x1.ep3 0x0.0p0 +REG epsg:31265 1 0x1.4p3 -0x1.4p2 +REG epsg:31265 2 0x1.4p4 -0x1.4p2 +REG epsg:31265 3 0x1.4p3 0x1.4p2 +REG epsg:31265 4 0x1.4p4 0x1.4p2 +REG epsg:31266 0 0x1.2p4 0x0.0p0 +REG epsg:31266 1 0x1.ap3 -0x1.4p2 +REG epsg:31266 2 0x1.7p4 -0x1.4p2 +REG epsg:31266 3 0x1.ap3 0x1.4p2 +REG epsg:31266 4 0x1.7p4 0x1.4p2 +REG epsg:31267 0 0x1.5p4 0x0.0p0 +REG epsg:31267 1 0x1.0p4 -0x1.4p2 +REG epsg:31267 2 0x1.ap4 -0x1.4p2 +REG epsg:31267 3 0x1.0p4 0x1.4p2 +REG epsg:31267 4 0x1.ap4 0x1.4p2 +REG epsg:31268 0 0x1.8p4 0x0.0p0 +REG epsg:31268 1 0x1.3p4 -0x1.4p2 +REG epsg:31268 2 0x1.dp4 -0x1.4p2 +REG epsg:31268 3 0x1.3p4 0x1.4p2 +REG epsg:31268 4 0x1.dp4 0x1.4p2 +REG epsg:3127 0 0x1.4p4 0x0.0p0 +REG epsg:3127 1 0x1.ep3 -0x1.4p2 +REG epsg:3127 2 0x1.9p4 -0x1.4p2 +REG epsg:3127 3 0x1.ep3 0x1.4p2 +REG epsg:3127 4 0x1.9p4 0x1.4p2 +REG epsg:31275 0 0x1.ep3 0x0.0p0 +REG epsg:31275 1 0x1.4p3 -0x1.4p2 +REG epsg:31275 2 0x1.4p4 -0x1.4p2 +REG epsg:31275 3 0x1.4p3 0x1.4p2 +REG epsg:31275 4 0x1.4p4 0x1.4p2 +REG epsg:31276 0 0x1.2p4 0x0.0p0 +REG epsg:31276 1 0x1.ap3 -0x1.4p2 +REG epsg:31276 2 0x1.7p4 -0x1.4p2 +REG epsg:31276 3 0x1.ap3 0x1.4p2 +REG epsg:31276 4 0x1.7p4 0x1.4p2 +REG epsg:31277 0 0x1.5p4 0x0.0p0 +REG epsg:31277 1 0x1.0p4 -0x1.4p2 +REG epsg:31277 2 0x1.ap4 -0x1.4p2 +REG epsg:31277 3 0x1.0p4 0x1.4p2 +REG epsg:31277 4 0x1.ap4 0x1.4p2 +REG epsg:31278 0 0x1.5p4 0x0.0p0 +REG epsg:31278 1 0x1.0p4 -0x1.4p2 +REG epsg:31278 2 0x1.ap4 -0x1.4p2 +REG epsg:31278 3 0x1.0p4 0x1.4p2 +REG epsg:31278 4 0x1.ap4 0x1.4p2 +REG epsg:31279 0 0x1.8p4 0x0.0p0 +REG epsg:31279 1 0x1.3p4 -0x1.4p2 +REG epsg:31279 2 0x1.dp4 -0x1.4p2 +REG epsg:31279 3 0x1.3p4 0x1.4p2 +REG epsg:31279 4 0x1.dp4 0x1.4p2 +REG epsg:3128 0 0x1.5p4 0x0.0p0 +REG epsg:3128 1 0x1.0p4 -0x1.4p2 +REG epsg:3128 2 0x1.ap4 -0x1.4p2 +REG epsg:3128 3 0x1.0p4 0x1.4p2 +REG epsg:3128 4 0x1.ap4 0x1.4p2 +REG epsg:31281 0 0x1.cp4 0x0.0p0 +REG epsg:31281 1 0x1.7p4 -0x1.4p2 +REG epsg:31281 2 0x1.08p5 -0x1.4p2 +REG epsg:31281 3 0x1.7p4 0x1.4p2 +REG epsg:31281 4 0x1.08p5 0x1.4p2 +REG epsg:31282 0 0x1.fp4 0x0.0p0 +REG epsg:31282 1 0x1.ap4 -0x1.4p2 +REG epsg:31282 2 0x1.2p5 -0x1.4p2 +REG epsg:31282 3 0x1.ap4 0x1.4p2 +REG epsg:31282 4 0x1.2p5 0x1.4p2 +REG epsg:31283 0 0x1.1p5 0x0.0p0 +REG epsg:31283 1 0x1.dp4 -0x1.4p2 +REG epsg:31283 2 0x1.38p5 -0x1.4p2 +REG epsg:31283 3 0x1.dp4 0x1.4p2 +REG epsg:31283 4 0x1.38p5 0x1.4p2 +REG epsg:31284 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31284 1 0x1.5555555555552p2 -0x1.4p2 +REG epsg:31284 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31284 3 0x1.5555555555552p2 0x1.4p2 +REG epsg:31284 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31285 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31285 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31285 2 0x1.2555555555554p4 -0x1.4p2 +REG epsg:31285 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31285 4 0x1.2555555555554p4 0x1.4p2 +REG epsg:31286 0 0x1.0555555555554p4 0x0.0p0 +REG epsg:31286 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG epsg:31286 2 0x1.5555555555554p4 -0x1.4p2 +REG epsg:31286 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG epsg:31286 4 0x1.5555555555554p4 0x1.4p2 +REG epsg:31287 0 0x1.aaaaaaaaaaaa9p3 0x1.7cp5 +REG epsg:31287 1 0x1.1c9195d1a8502p3 0x1.64p5 +REG epsg:31287 2 0x1.1c61dfc1d6828p4 0x1.64p5 +REG epsg:31287 3 0x1.1c9195d1a8502p3 0x1.94p5 +REG epsg:31287 4 0x1.1c61dfc1d6828p4 0x1.94p5 +REG epsg:31288 0 0x1.cp4 0x0.0p0 +REG epsg:31288 1 0x1.7p4 -0x1.4p2 +REG epsg:31288 2 0x1.08p5 -0x1.4p2 +REG epsg:31288 3 0x1.7p4 0x1.4p2 +REG epsg:31288 4 0x1.08p5 0x1.4p2 +REG epsg:31289 0 0x1.fp4 0x0.0p0 +REG epsg:31289 1 0x1.ap4 -0x1.4p2 +REG epsg:31289 2 0x1.2p5 -0x1.4p2 +REG epsg:31289 3 0x1.ap4 0x1.4p2 +REG epsg:31289 4 0x1.2p5 0x1.4p2 +REG epsg:3129 0 0x1.6p4 0x0.0p0 +REG epsg:3129 1 0x1.1p4 -0x1.4p2 +REG epsg:3129 2 0x1.bp4 -0x1.4p2 +REG epsg:3129 3 0x1.1p4 0x1.4p2 +REG epsg:3129 4 0x1.bp4 0x1.4p2 +REG epsg:31290 0 0x1.1p5 0x0.0p0 +REG epsg:31290 1 0x1.dp4 -0x1.4p2 +REG epsg:31290 2 0x1.38p5 -0x1.4p2 +REG epsg:31290 3 0x1.dp4 0x1.4p2 +REG epsg:31290 4 0x1.38p5 0x1.4p2 +REG epsg:31291 0 0x1.cp4 0x0.0p0 +REG epsg:31291 1 0x1.7p4 -0x1.4p2 +REG epsg:31291 2 0x1.08p5 -0x1.4p2 +REG epsg:31291 3 0x1.7p4 0x1.4p2 +REG epsg:31291 4 0x1.08p5 0x1.4p2 +REG epsg:31292 0 0x1.fp4 0x0.0p0 +REG epsg:31292 1 0x1.ap4 -0x1.4p2 +REG epsg:31292 2 0x1.2p5 -0x1.4p2 +REG epsg:31292 3 0x1.ap4 0x1.4p2 +REG epsg:31292 4 0x1.2p5 0x1.4p2 +REG epsg:31293 0 0x1.1p5 0x0.0p0 +REG epsg:31293 1 0x1.dp4 -0x1.4p2 +REG epsg:31293 2 0x1.38p5 -0x1.4p2 +REG epsg:31293 3 0x1.dp4 0x1.4p2 +REG epsg:31293 4 0x1.38p5 0x1.4p2 +REG epsg:31294 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31294 1 0x1.5555555555552p2 -0x1.4p2 +REG epsg:31294 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31294 3 0x1.5555555555552p2 0x1.4p2 +REG epsg:31294 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31295 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG epsg:31295 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG epsg:31295 2 0x1.2555555555554p4 -0x1.4p2 +REG epsg:31295 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG epsg:31295 4 0x1.2555555555554p4 0x1.4p2 +REG epsg:31296 0 0x1.0555555555554p4 0x0.0p0 +REG epsg:31296 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG epsg:31296 2 0x1.5555555555554p4 -0x1.4p2 +REG epsg:31296 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG epsg:31296 4 0x1.5555555555554p4 0x1.4p2 +REG epsg:31297 0 0x1.aaaaaaaaaaaa9p3 0x1.7cp5 +REG epsg:31297 1 0x1.1c9195d1a8502p3 0x1.64p5 +REG epsg:31297 2 0x1.1c61dfc1d6828p4 0x1.64p5 +REG epsg:31297 3 0x1.1c9195d1a8502p3 0x1.94p5 +REG epsg:31297 4 0x1.1c61dfc1d6828p4 0x1.94p5 +REG epsg:3130 0 0x1.7p4 0x0.0p0 +REG epsg:3130 1 0x1.2p4 -0x1.4p2 +REG epsg:3130 2 0x1.cp4 -0x1.4p2 +REG epsg:3130 3 0x1.2p4 0x1.4p2 +REG epsg:3130 4 0x1.cp4 0x1.4p2 +REG epsg:31300 0 0x1.16d819b4659ep2 0x1.17aaaaaaaaaabp6 +REG epsg:31300 1 -0x1.3a9adc1bddcbfp5 0x1.b755555555556p5 +REG epsg:31300 2 0x1.8050e288f7337p5 0x1.b755555555556p5 +REG epsg:31300 3 -0x1.3a9adc1bddcbfp5 0x1.53aaaaaaaaaabp6 +REG epsg:31300 4 0x1.8050e288f7337p5 0x1.53aaaaaaaaaabp6 +REG epsg:3131 0 0x1.8p4 0x0.0p0 +REG epsg:3131 1 0x1.3p4 -0x1.4p2 +REG epsg:3131 2 0x1.dp4 -0x1.4p2 +REG epsg:3131 3 0x1.3p4 0x1.4p2 +REG epsg:3131 4 0x1.dp4 0x1.4p2 +REG epsg:3132 0 0x1.9p4 0x0.0p0 +REG epsg:3132 1 0x1.4p4 -0x1.4p2 +REG epsg:3132 2 0x1.ep4 -0x1.4p2 +REG epsg:3132 3 0x1.4p4 0x1.4p2 +REG epsg:3132 4 0x1.ep4 0x1.4p2 +REG epsg:3133 0 0x1.ap4 0x0.0p0 +REG epsg:3133 1 0x1.5p4 -0x1.4p2 +REG epsg:3133 2 0x1.fp4 -0x1.4p2 +REG epsg:3133 3 0x1.5p4 0x1.4p2 +REG epsg:3133 4 0x1.fp4 0x1.4p2 +REG epsg:3134 0 0x1.bp4 0x0.0p0 +REG epsg:3134 1 0x1.6p4 -0x1.4p2 +REG epsg:3134 2 0x1.0p5 -0x1.4p2 +REG epsg:3134 3 0x1.6p4 0x1.4p2 +REG epsg:3134 4 0x1.0p5 0x1.4p2 +REG epsg:3135 0 0x1.cp4 0x0.0p0 +REG epsg:3135 1 0x1.7p4 -0x1.4p2 +REG epsg:3135 2 0x1.08p5 -0x1.4p2 +REG epsg:3135 3 0x1.7p4 0x1.4p2 +REG epsg:3135 4 0x1.08p5 0x1.4p2 +REG epsg:3136 0 0x1.dp4 0x0.0p0 +REG epsg:3136 1 0x1.8p4 -0x1.4p2 +REG epsg:3136 2 0x1.1p5 -0x1.4p2 +REG epsg:3136 3 0x1.8p4 0x1.4p2 +REG epsg:3136 4 0x1.1p5 0x1.4p2 +REG epsg:3137 0 0x1.ep4 0x0.0p0 +REG epsg:3137 1 0x1.9p4 -0x1.4p2 +REG epsg:3137 2 0x1.18p5 -0x1.4p2 +REG epsg:3137 3 0x1.9p4 0x1.4p2 +REG epsg:3137 4 0x1.18p5 0x1.4p2 +REG epsg:31370 0 0x1.1784e6cbc3292p2 0x1.17aaaabdae4bep6 +REG epsg:31370 1 -0x1.3a8542c83e86dp5 0x1.b755557b5c97cp5 +REG epsg:31370 2 0x1.80667c7b2f511p5 0x1.b755557b5c97cp5 +REG epsg:31370 3 -0x1.3a8542c83e86dp5 0x1.53aaaabdae4bep6 +REG epsg:31370 4 0x1.80667c7b2f511p5 0x1.53aaaabdae4bep6 +REG epsg:3138 0 0x1.fp4 0x0.0p0 +REG epsg:3138 1 0x1.ap4 -0x1.4p2 +REG epsg:3138 2 0x1.2p5 -0x1.4p2 +REG epsg:3138 3 0x1.ap4 0x1.4p2 +REG epsg:3138 4 0x1.2p5 0x1.4p2 +REG epsg:3140 0 0x1.64p7 -0x1.2p4 +REG epsg:3140 1 0x1.597c41b77b2c1p7 -0x1.7p4 +REG epsg:3140 2 -0x1.617c41b77b2c1p7 -0x1.7p4 +REG epsg:3140 3 0x1.597c41b77b2c1p7 -0x1.ap3 +REG epsg:3140 4 -0x1.617c41b77b2c1p7 -0x1.ap3 +REG epsg:3141 0 0x1.62p7 -0x1.9p4 +REG epsg:3141 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:3141 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:3141 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:3141 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:3142 0 -0x1.62p7 -0x1.9p4 +REG epsg:3142 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:3142 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:3142 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:3142 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:3143 0 0x1.658p7 -0x1.1p4 +REG epsg:3143 1 0x1.5b0b077351e8bp7 -0x1.6p4 +REG epsg:3143 2 -0x1.600b077351e8bp7 -0x1.6p4 +REG epsg:3143 3 0x1.5b0b077351e8bp7 -0x1.8p3 +REG epsg:3143 4 -0x1.600b077351e8bp7 -0x1.8p3 +REG epsg:3146 0 0x1.2p4 0x0.0p0 +REG epsg:3146 1 0x1.ap3 -0x1.4p2 +REG epsg:3146 2 0x1.7p4 -0x1.4p2 +REG epsg:3146 3 0x1.ap3 0x1.4p2 +REG epsg:3146 4 0x1.7p4 0x1.4p2 +REG epsg:31461 0 0x1.8p1 0x0.0p0 +REG epsg:31461 1 -0x1.0p1 -0x1.4p2 +REG epsg:31461 2 0x1.0p3 -0x1.4p2 +REG epsg:31461 3 -0x1.0p1 0x1.4p2 +REG epsg:31461 4 0x1.0p3 0x1.4p2 +REG epsg:31462 0 0x1.8p2 0x0.0p0 +REG epsg:31462 1 0x1.0p0 -0x1.4p2 +REG epsg:31462 2 0x1.6p3 -0x1.4p2 +REG epsg:31462 3 0x1.0p0 0x1.4p2 +REG epsg:31462 4 0x1.6p3 0x1.4p2 +REG epsg:31463 0 0x1.2p3 0x0.0p0 +REG epsg:31463 1 0x1.0p2 -0x1.4p2 +REG epsg:31463 2 0x1.cp3 -0x1.4p2 +REG epsg:31463 3 0x1.0p2 0x1.4p2 +REG epsg:31463 4 0x1.cp3 0x1.4p2 +REG epsg:31464 0 0x1.8p3 0x0.0p0 +REG epsg:31464 1 0x1.cp2 -0x1.4p2 +REG epsg:31464 2 0x1.1p4 -0x1.4p2 +REG epsg:31464 3 0x1.cp2 0x1.4p2 +REG epsg:31464 4 0x1.1p4 0x1.4p2 +REG epsg:31465 0 0x1.ep3 0x0.0p0 +REG epsg:31465 1 0x1.4p3 -0x1.4p2 +REG epsg:31465 2 0x1.4p4 -0x1.4p2 +REG epsg:31465 3 0x1.4p3 0x1.4p2 +REG epsg:31465 4 0x1.4p4 0x1.4p2 +REG epsg:31466 0 0x1.8p2 0x0.0p0 +REG epsg:31466 1 0x1.0p0 -0x1.4p2 +REG epsg:31466 2 0x1.6p3 -0x1.4p2 +REG epsg:31466 3 0x1.0p0 0x1.4p2 +REG epsg:31466 4 0x1.6p3 0x1.4p2 +REG epsg:31467 0 0x1.2p3 0x0.0p0 +REG epsg:31467 1 0x1.0p2 -0x1.4p2 +REG epsg:31467 2 0x1.cp3 -0x1.4p2 +REG epsg:31467 3 0x1.0p2 0x1.4p2 +REG epsg:31467 4 0x1.cp3 0x1.4p2 +REG epsg:31468 0 0x1.8p3 0x0.0p0 +REG epsg:31468 1 0x1.cp2 -0x1.4p2 +REG epsg:31468 2 0x1.1p4 -0x1.4p2 +REG epsg:31468 3 0x1.cp2 0x1.4p2 +REG epsg:31468 4 0x1.1p4 0x1.4p2 +REG epsg:31469 0 0x1.ep3 0x0.0p0 +REG epsg:31469 1 0x1.4p3 -0x1.4p2 +REG epsg:31469 2 0x1.4p4 -0x1.4p2 +REG epsg:31469 3 0x1.4p3 0x1.4p2 +REG epsg:31469 4 0x1.4p4 0x1.4p2 +REG epsg:3147 0 0x1.2p4 0x0.0p0 +REG epsg:3147 1 0x1.ap3 -0x1.4p2 +REG epsg:3147 2 0x1.7p4 -0x1.4p2 +REG epsg:3147 3 0x1.ap3 0x1.4p2 +REG epsg:3147 4 0x1.7p4 0x1.4p2 +REG epsg:3148 0 0x1.a4p6 0x0.0p0 +REG epsg:3148 1 0x1.9p6 -0x1.4p2 +REG epsg:3148 2 0x1.b8p6 -0x1.4p2 +REG epsg:3148 3 0x1.9p6 0x1.4p2 +REG epsg:3148 4 0x1.b8p6 0x1.4p2 +REG epsg:3149 0 0x1.bcp6 0x0.0p0 +REG epsg:3149 1 0x1.a8p6 -0x1.4p2 +REG epsg:3149 2 0x1.dp6 -0x1.4p2 +REG epsg:3149 3 0x1.a8p6 0x1.4p2 +REG epsg:3149 4 0x1.dp6 0x1.4p2 +REG epsg:3150 0 0x1.2p4 0x0.0p0 +REG epsg:3150 1 0x1.ap3 -0x1.4p2 +REG epsg:3150 2 0x1.7p4 -0x1.4p2 +REG epsg:3150 3 0x1.ap3 0x1.4p2 +REG epsg:3150 4 0x1.7p4 0x1.4p2 +REG epsg:3151 0 0x1.2p4 0x0.0p0 +REG epsg:3151 1 0x1.ap3 -0x1.4p2 +REG epsg:3151 2 0x1.7p4 -0x1.4p2 +REG epsg:3151 3 0x1.ap3 0x1.4p2 +REG epsg:3151 4 0x1.7p4 0x1.4p2 +REG epsg:3152 0 0x1.20ecb5350092dp4 0x0.0p0 +REG epsg:3152 1 0x1.a1d96a6a0125ap3 -0x1.4p2 +REG epsg:3152 2 0x1.70ecb5350092dp4 -0x1.4p2 +REG epsg:3152 3 0x1.a1d96a6a0125ap3 0x1.4p2 +REG epsg:3152 4 0x1.70ecb5350092dp4 0x1.4p2 +REG epsg:31528 0 -0x1.ep3 0x0.0p0 +REG epsg:31528 1 -0x1.4p4 -0x1.4p2 +REG epsg:31528 2 -0x1.4p3 -0x1.4p2 +REG epsg:31528 3 -0x1.4p4 0x1.4p2 +REG epsg:31528 4 -0x1.4p3 0x1.4p2 +REG epsg:31529 0 -0x1.2p3 0x0.0p0 +REG epsg:31529 1 -0x1.cp3 -0x1.4p2 +REG epsg:31529 2 -0x1.0p2 -0x1.4p2 +REG epsg:31529 3 -0x1.cp3 0x1.4p2 +REG epsg:31529 4 -0x1.0p2 0x1.4p2 +REG epsg:3153 0 -0x1.f8p6 0x1.9ep5 +REG epsg:3153 1 -0x1.279cb3f010beap7 0x1.32p5 +REG epsg:3153 2 -0x1.a0c6981fde82cp6 0x1.32p5 +REG epsg:3153 3 -0x1.279cb3f010beap7 0x1.05p6 +REG epsg:3153 4 -0x1.a0c6981fde82cp6 0x1.05p6 +REG epsg:3154 0 -0x1.1ap7 0x0.0p0 +REG epsg:3154 1 -0x1.24p7 -0x1.4p2 +REG epsg:3154 2 -0x1.1p7 -0x1.4p2 +REG epsg:3154 3 -0x1.24p7 0x1.4p2 +REG epsg:3154 4 -0x1.1p7 0x1.4p2 +REG epsg:3155 0 -0x1.0ep7 0x0.0p0 +REG epsg:3155 1 -0x1.18p7 -0x1.4p2 +REG epsg:3155 2 -0x1.04p7 -0x1.4p2 +REG epsg:3155 3 -0x1.18p7 0x1.4p2 +REG epsg:3155 4 -0x1.04p7 0x1.4p2 +REG epsg:3156 0 -0x1.02p7 0x0.0p0 +REG epsg:3156 1 -0x1.0cp7 -0x1.4p2 +REG epsg:3156 2 -0x1.fp6 -0x1.4p2 +REG epsg:3156 3 -0x1.0cp7 0x1.4p2 +REG epsg:3156 4 -0x1.fp6 0x1.4p2 +REG epsg:3157 0 -0x1.ecp6 0x0.0p0 +REG epsg:3157 1 -0x1.0p7 -0x1.4p2 +REG epsg:3157 2 -0x1.d8p6 -0x1.4p2 +REG epsg:3157 3 -0x1.0p7 0x1.4p2 +REG epsg:3157 4 -0x1.d8p6 0x1.4p2 +REG epsg:3158 0 -0x1.8cp6 0x0.0p0 +REG epsg:3158 1 -0x1.ap6 -0x1.4p2 +REG epsg:3158 2 -0x1.78p6 -0x1.4p2 +REG epsg:3158 3 -0x1.ap6 0x1.4p2 +REG epsg:3158 4 -0x1.78p6 0x1.4p2 +REG epsg:3159 0 -0x1.74p6 0x0.0p0 +REG epsg:3159 1 -0x1.88p6 -0x1.4p2 +REG epsg:3159 2 -0x1.6p6 -0x1.4p2 +REG epsg:3159 3 -0x1.88p6 0x1.4p2 +REG epsg:3159 4 -0x1.6p6 0x1.4p2 +REG epsg:3160 0 -0x1.5cp6 0x0.0p0 +REG epsg:3160 1 -0x1.7p6 -0x1.4p2 +REG epsg:3160 2 -0x1.48p6 -0x1.4p2 +REG epsg:3160 3 -0x1.7p6 0x1.4p2 +REG epsg:3160 4 -0x1.48p6 0x1.4p2 +REG epsg:31600 0 0x1.96478a4fd92c7p4 0x1.6f33333333333p5 +REG epsg:31600 1 0x1.235290d1d9941p4 0x1.4733333333333p5 +REG epsg:31600 2 0x1.049e41e6ec626p5 0x1.4733333333333p5 +REG epsg:31600 3 0x1.235290d1d9941p4 0x1.9733333333333p5 +REG epsg:31600 4 0x1.049e41e6ec626p5 0x1.9733333333333p5 +REG epsg:3161 0 -0x1.54p6 0x1.acp4 +REG epsg:3161 1 -0x1.9730da8022b5bp6 0x1.78p3 +REG epsg:3161 2 -0x1.10cf257fdd4a5p6 0x1.78p3 +REG epsg:3161 3 -0x1.9730da8022b5bp6 0x1.4ep5 +REG epsg:3161 4 -0x1.10cf257fdd4a5p6 0x1.4ep5 +REG epsg:3162 0 -0x1.54p6 0x1.acp4 +REG epsg:3162 1 -0x1.9730da8022b5bp6 0x1.78p3 +REG epsg:3162 2 -0x1.10cf257fdd4a5p6 0x1.78p3 +REG epsg:3162 3 -0x1.9730da8022b5bp6 0x1.4ep5 +REG epsg:3162 4 -0x1.10cf257fdd4a5p6 0x1.4ep5 +REG epsg:3163 0 0x1.4cp7 -0x1.58p4 +REG epsg:3163 1 0x1.486ad95cf6aa6p7 -0x1.72aaaaaaaaaa8p4 +REG epsg:3163 2 0x1.4f9526a30955ap7 -0x1.72aaaaaaaaaa8p4 +REG epsg:3163 3 0x1.486ad95cf6aa6p7 -0x1.3d55555555558p4 +REG epsg:3163 4 0x1.4f9526a30955ap7 -0x1.3d55555555558p4 +REG epsg:3164 0 0x1.4ap7 -0x1.9p4 +REG epsg:3164 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:3164 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:3164 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:3164 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:3165 0 0x1.4ce285a0be511p7 -0x1.6450a84be4042p4 +REG epsg:3165 1 0x1.4ab940fef1e6p7 -0x1.7450a84be4042p4 +REG epsg:3165 2 0x1.4f0bca428abc2p7 -0x1.7450a84be4042p4 +REG epsg:3165 3 0x1.4ab940fef1e6p7 -0x1.5450a84be4042p4 +REG epsg:3165 4 0x1.4f0bca428abc2p7 -0x1.5450a84be4042p4 +REG epsg:3166 0 0x1.4ce28f5c28f5cp7 -0x1.6450c83fb72eap4 +REG epsg:3166 1 0x1.4ab94ab276e68p7 -0x1.7450c83fb72eap4 +REG epsg:3166 2 0x1.4f0bd405db05p7 -0x1.7450c83fb72eap4 +REG epsg:3166 3 0x1.4ab94ab276e68p7 -0x1.5450c83fb72eap4 +REG epsg:3166 4 0x1.4f0bd405db05p7 -0x1.5450c83fb72eap4 +REG epsg:3167 0 0x1.99p6 0x1.0p2 +REG epsg:3167 1 0x1.84f37f5af8062p6 -0x1.0p0 +REG epsg:3167 2 0x1.ad0c80a507f9ep6 -0x1.0p0 +REG epsg:3167 3 0x1.84f37f5af8062p6 0x1.2p3 +REG epsg:3167 4 0x1.ad0c80a507f9ep6 0x1.2p3 +REG epsg:3168 0 0x1.99p6 0x1.0p2 +REG epsg:3168 1 0x1.84f37f5af8062p6 -0x1.0p0 +REG epsg:3168 2 0x1.ad0c80a507f9ep6 -0x1.0p0 +REG epsg:3168 3 0x1.84f37f5af8062p6 0x1.2p3 +REG epsg:3168 4 0x1.ad0c80a507f9ep6 0x1.2p3 +REG epsg:3169 0 0x1.3ep7 -0x1.9p4 +REG epsg:3169 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:3169 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:3169 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:3169 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:3170 0 0x1.4ap7 -0x1.9p4 +REG epsg:3170 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:3170 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:3170 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:3170 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:31700 0 0x1.9p4 0x1.7p5 +REG epsg:31700 1 0x1.1cd5e1cf3d2a8p4 0x1.48p5 +REG epsg:31700 2 0x1.01950f18616acp5 0x1.48p5 +REG epsg:31700 3 0x1.1cd5e1cf3d2a8p4 0x1.98p5 +REG epsg:31700 4 0x1.01950f18616acp5 0x1.98p5 +REG epsg:3171 0 0x1.56p7 -0x1.9p4 +REG epsg:3171 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:3171 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:3171 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:3171 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:3172 0 0x1.56p7 -0x1.9p4 +REG epsg:3172 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:3172 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:3172 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:3172 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:3174 0 -0x1.51d2e5de15ca7p6 0x1.6c8d43d03968ep5 +REG epsg:3174 1 -0x1.7934c824f364bp6 0x1.35699e0e73605p5 +REG epsg:3174 2 -0x1.2a71039738303p6 0x1.35699e0e73605p5 +REG epsg:3174 3 -0x1.7934c824f364bp6 0x1.a3b0e991ff717p5 +REG epsg:3174 4 -0x1.2a71039738303p6 0x1.a3b0e991ff717p5 +REG epsg:3175 0 -0x1.4cfe9813879c4p6 0x1.6c8d43d03968ep5 +REG epsg:3175 1 -0x1.74607a5a65368p6 0x1.35699e0e73605p5 +REG epsg:3175 2 -0x1.259cb5ccaa02p6 0x1.35699e0e73605p5 +REG epsg:3175 3 -0x1.74607a5a65368p6 0x1.a3b0e991ff717p5 +REG epsg:3175 4 -0x1.259cb5ccaa02p6 0x1.a3b0e991ff717p5 +REG epsg:3176 0 0x1.a8p6 0x0.0p0 +REG epsg:3176 1 0x1.94p6 -0x1.4p2 +REG epsg:3176 2 0x1.bcp6 -0x1.4p2 +REG epsg:3176 3 0x1.94p6 0x1.4p2 +REG epsg:3176 4 0x1.bcp6 0x1.4p2 +REG epsg:3177 0 0x1.1p4 0x0.0p0 +REG epsg:3177 1 0x1.8p3 -0x1.4p2 +REG epsg:3177 2 0x1.6p4 -0x1.4p2 +REG epsg:3177 3 0x1.8p3 0x1.4p2 +REG epsg:3177 4 0x1.6p4 0x1.4p2 +REG epsg:3178 0 -0x1.2cp6 0x0.0p0 +REG epsg:3178 1 -0x1.4p6 -0x1.4p2 +REG epsg:3178 2 -0x1.18p6 -0x1.4p2 +REG epsg:3178 3 -0x1.4p6 0x1.4p2 +REG epsg:3178 4 -0x1.18p6 0x1.4p2 +REG epsg:3179 0 -0x1.14p6 0x0.0p0 +REG epsg:3179 1 -0x1.28p6 -0x1.4p2 +REG epsg:3179 2 -0x1.0p6 -0x1.4p2 +REG epsg:3179 3 -0x1.28p6 0x1.4p2 +REG epsg:3179 4 -0x1.0p6 0x1.4p2 +REG epsg:3180 0 -0x1.f8p5 0x0.0p0 +REG epsg:3180 1 -0x1.1p6 -0x1.4p2 +REG epsg:3180 2 -0x1.dp5 -0x1.4p2 +REG epsg:3180 3 -0x1.1p6 0x1.4p2 +REG epsg:3180 4 -0x1.dp5 0x1.4p2 +REG epsg:3181 0 -0x1.c8p5 0x0.0p0 +REG epsg:3181 1 -0x1.fp5 -0x1.4p2 +REG epsg:3181 2 -0x1.ap5 -0x1.4p2 +REG epsg:3181 3 -0x1.fp5 0x1.4p2 +REG epsg:3181 4 -0x1.ap5 0x1.4p2 +REG epsg:3182 0 -0x1.98p5 0x0.0p0 +REG epsg:3182 1 -0x1.cp5 -0x1.4p2 +REG epsg:3182 2 -0x1.7p5 -0x1.4p2 +REG epsg:3182 3 -0x1.cp5 0x1.4p2 +REG epsg:3182 4 -0x1.7p5 0x1.4p2 +REG epsg:3183 0 -0x1.68p5 0x0.0p0 +REG epsg:3183 1 -0x1.9p5 -0x1.4p2 +REG epsg:3183 2 -0x1.4p5 -0x1.4p2 +REG epsg:3183 3 -0x1.9p5 0x1.4p2 +REG epsg:3183 4 -0x1.4p5 0x1.4p2 +REG epsg:31838 0 0x1.68p5 0x0.0p0 +REG epsg:31838 1 0x1.4p5 -0x1.4p2 +REG epsg:31838 2 0x1.9p5 -0x1.4p2 +REG epsg:31838 3 0x1.4p5 0x1.4p2 +REG epsg:31838 4 0x1.9p5 0x1.4p2 +REG epsg:31839 0 0x1.98p5 0x0.0p0 +REG epsg:31839 1 0x1.7p5 -0x1.4p2 +REG epsg:31839 2 0x1.cp5 -0x1.4p2 +REG epsg:31839 3 0x1.7p5 0x1.4p2 +REG epsg:31839 4 0x1.cp5 0x1.4p2 +REG epsg:3184 0 -0x1.38p5 0x0.0p0 +REG epsg:3184 1 -0x1.6p5 -0x1.4p2 +REG epsg:3184 2 -0x1.1p5 -0x1.4p2 +REG epsg:3184 3 -0x1.6p5 0x1.4p2 +REG epsg:3184 4 -0x1.1p5 0x1.4p2 +REG epsg:3185 0 -0x1.08p5 0x0.0p0 +REG epsg:3185 1 -0x1.3p5 -0x1.4p2 +REG epsg:3185 2 -0x1.cp4 -0x1.4p2 +REG epsg:3185 3 -0x1.3p5 0x1.4p2 +REG epsg:3185 4 -0x1.cp4 0x1.4p2 +REG epsg:3186 0 -0x1.bp4 0x0.0p0 +REG epsg:3186 1 -0x1.0p5 -0x1.4p2 +REG epsg:3186 2 -0x1.6p4 -0x1.4p2 +REG epsg:3186 3 -0x1.0p5 0x1.4p2 +REG epsg:3186 4 -0x1.6p4 0x1.4p2 +REG epsg:3187 0 -0x1.5p4 0x0.0p0 +REG epsg:3187 1 -0x1.ap4 -0x1.4p2 +REG epsg:3187 2 -0x1.0p4 -0x1.4p2 +REG epsg:3187 3 -0x1.ap4 0x1.4p2 +REG epsg:3187 4 -0x1.0p4 0x1.4p2 +REG epsg:3188 0 -0x1.ep3 0x0.0p0 +REG epsg:3188 1 -0x1.4p4 -0x1.4p2 +REG epsg:3188 2 -0x1.4p3 -0x1.4p2 +REG epsg:3188 3 -0x1.4p4 0x1.4p2 +REG epsg:3188 4 -0x1.4p3 0x1.4p2 +REG epsg:3189 0 -0x1.2p3 0x0.0p0 +REG epsg:3189 1 -0x1.cp3 -0x1.4p2 +REG epsg:3189 2 -0x1.0p2 -0x1.4p2 +REG epsg:3189 3 -0x1.cp3 0x1.4p2 +REG epsg:3189 4 -0x1.0p2 0x1.4p2 +REG epsg:3190 0 0x1.2p3 0x0.0p0 +REG epsg:3190 1 0x1.0p2 -0x1.4p2 +REG epsg:3190 2 0x1.cp3 -0x1.4p2 +REG epsg:3190 3 0x1.0p2 0x1.4p2 +REG epsg:3190 4 0x1.cp3 0x1.4p2 +REG epsg:31900 0 0x1.8p5 0x0.0p0 +REG epsg:31900 1 0x1.58p5 -0x1.4p2 +REG epsg:31900 2 0x1.a8p5 -0x1.4p2 +REG epsg:31900 3 0x1.58p5 0x1.4p2 +REG epsg:31900 4 0x1.a8p5 0x1.4p2 +REG epsg:31901 0 0x1.8p5 0x0.0p0 +REG epsg:31901 1 0x1.58p5 -0x1.4p2 +REG epsg:31901 2 0x1.a8p5 -0x1.4p2 +REG epsg:31901 3 0x1.58p5 0x1.4p2 +REG epsg:31901 4 0x1.a8p5 0x1.4p2 +REG epsg:3191 0 0x1.6p3 0x0.0p0 +REG epsg:3191 1 0x1.8p2 -0x1.4p2 +REG epsg:3191 2 0x1.0p4 -0x1.4p2 +REG epsg:3191 3 0x1.8p2 0x1.4p2 +REG epsg:3191 4 0x1.0p4 0x1.4p2 +REG epsg:3192 0 0x1.ap3 0x0.0p0 +REG epsg:3192 1 0x1.0p3 -0x1.4p2 +REG epsg:3192 2 0x1.2p4 -0x1.4p2 +REG epsg:3192 3 0x1.0p3 0x1.4p2 +REG epsg:3192 4 0x1.2p4 0x1.4p2 +REG epsg:3193 0 0x1.ep3 0x0.0p0 +REG epsg:3193 1 0x1.4p3 -0x1.4p2 +REG epsg:3193 2 0x1.4p4 -0x1.4p2 +REG epsg:3193 3 0x1.4p3 0x1.4p2 +REG epsg:3193 4 0x1.4p4 0x1.4p2 +REG epsg:3194 0 0x1.1p4 0x0.0p0 +REG epsg:3194 1 0x1.8p3 -0x1.4p2 +REG epsg:3194 2 0x1.6p4 -0x1.4p2 +REG epsg:3194 3 0x1.8p3 0x1.4p2 +REG epsg:3194 4 0x1.6p4 0x1.4p2 +REG epsg:3195 0 0x1.3p4 0x0.0p0 +REG epsg:3195 1 0x1.cp3 -0x1.4p2 +REG epsg:3195 2 0x1.8p4 -0x1.4p2 +REG epsg:3195 3 0x1.cp3 0x1.4p2 +REG epsg:3195 4 0x1.8p4 0x1.4p2 +REG epsg:3196 0 0x1.5p4 0x0.0p0 +REG epsg:3196 1 0x1.0p4 -0x1.4p2 +REG epsg:3196 2 0x1.ap4 -0x1.4p2 +REG epsg:3196 3 0x1.0p4 0x1.4p2 +REG epsg:3196 4 0x1.ap4 0x1.4p2 +REG epsg:31965 0 -0x1.d4p6 0x0.0p0 +REG epsg:31965 1 -0x1.e8p6 -0x1.4p2 +REG epsg:31965 2 -0x1.cp6 -0x1.4p2 +REG epsg:31965 3 -0x1.e8p6 0x1.4p2 +REG epsg:31965 4 -0x1.cp6 0x1.4p2 +REG epsg:31966 0 -0x1.bcp6 0x0.0p0 +REG epsg:31966 1 -0x1.dp6 -0x1.4p2 +REG epsg:31966 2 -0x1.a8p6 -0x1.4p2 +REG epsg:31966 3 -0x1.dp6 0x1.4p2 +REG epsg:31966 4 -0x1.a8p6 0x1.4p2 +REG epsg:31967 0 -0x1.a4p6 0x0.0p0 +REG epsg:31967 1 -0x1.b8p6 -0x1.4p2 +REG epsg:31967 2 -0x1.9p6 -0x1.4p2 +REG epsg:31967 3 -0x1.b8p6 0x1.4p2 +REG epsg:31967 4 -0x1.9p6 0x1.4p2 +REG epsg:31968 0 -0x1.8cp6 0x0.0p0 +REG epsg:31968 1 -0x1.ap6 -0x1.4p2 +REG epsg:31968 2 -0x1.78p6 -0x1.4p2 +REG epsg:31968 3 -0x1.ap6 0x1.4p2 +REG epsg:31968 4 -0x1.78p6 0x1.4p2 +REG epsg:31969 0 -0x1.74p6 0x0.0p0 +REG epsg:31969 1 -0x1.88p6 -0x1.4p2 +REG epsg:31969 2 -0x1.6p6 -0x1.4p2 +REG epsg:31969 3 -0x1.88p6 0x1.4p2 +REG epsg:31969 4 -0x1.6p6 0x1.4p2 +REG epsg:3197 0 0x1.7p4 0x0.0p0 +REG epsg:3197 1 0x1.2p4 -0x1.4p2 +REG epsg:3197 2 0x1.cp4 -0x1.4p2 +REG epsg:3197 3 0x1.2p4 0x1.4p2 +REG epsg:3197 4 0x1.cp4 0x1.4p2 +REG epsg:31970 0 -0x1.5cp6 0x0.0p0 +REG epsg:31970 1 -0x1.7p6 -0x1.4p2 +REG epsg:31970 2 -0x1.48p6 -0x1.4p2 +REG epsg:31970 3 -0x1.7p6 0x1.4p2 +REG epsg:31970 4 -0x1.48p6 0x1.4p2 +REG epsg:31971 0 -0x1.44p6 0x0.0p0 +REG epsg:31971 1 -0x1.58p6 -0x1.4p2 +REG epsg:31971 2 -0x1.3p6 -0x1.4p2 +REG epsg:31971 3 -0x1.58p6 0x1.4p2 +REG epsg:31971 4 -0x1.3p6 0x1.4p2 +REG epsg:31972 0 -0x1.2cp6 0x0.0p0 +REG epsg:31972 1 -0x1.4p6 -0x1.4p2 +REG epsg:31972 2 -0x1.18p6 -0x1.4p2 +REG epsg:31972 3 -0x1.4p6 0x1.4p2 +REG epsg:31972 4 -0x1.18p6 0x1.4p2 +REG epsg:31973 0 -0x1.14p6 0x0.0p0 +REG epsg:31973 1 -0x1.28p6 -0x1.4p2 +REG epsg:31973 2 -0x1.0p6 -0x1.4p2 +REG epsg:31973 3 -0x1.28p6 0x1.4p2 +REG epsg:31973 4 -0x1.0p6 0x1.4p2 +REG epsg:31974 0 -0x1.f8p5 0x0.0p0 +REG epsg:31974 1 -0x1.1p6 -0x1.4p2 +REG epsg:31974 2 -0x1.dp5 -0x1.4p2 +REG epsg:31974 3 -0x1.1p6 0x1.4p2 +REG epsg:31974 4 -0x1.dp5 0x1.4p2 +REG epsg:31975 0 -0x1.c8p5 0x0.0p0 +REG epsg:31975 1 -0x1.fp5 -0x1.4p2 +REG epsg:31975 2 -0x1.ap5 -0x1.4p2 +REG epsg:31975 3 -0x1.fp5 0x1.4p2 +REG epsg:31975 4 -0x1.ap5 0x1.4p2 +REG epsg:31976 0 -0x1.98p5 0x0.0p0 +REG epsg:31976 1 -0x1.cp5 -0x1.4p2 +REG epsg:31976 2 -0x1.7p5 -0x1.4p2 +REG epsg:31976 3 -0x1.cp5 0x1.4p2 +REG epsg:31976 4 -0x1.7p5 0x1.4p2 +REG epsg:31977 0 -0x1.44p6 -0x1.9p4 +REG epsg:31977 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:31977 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:31977 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:31977 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:31978 0 -0x1.2cp6 -0x1.9p4 +REG epsg:31978 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:31978 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:31978 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:31978 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:31979 0 -0x1.14p6 -0x1.9p4 +REG epsg:31979 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:31979 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:31979 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:31979 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:3198 0 0x1.9p4 0x0.0p0 +REG epsg:3198 1 0x1.4p4 -0x1.4p2 +REG epsg:3198 2 0x1.ep4 -0x1.4p2 +REG epsg:3198 3 0x1.4p4 0x1.4p2 +REG epsg:3198 4 0x1.ep4 0x1.4p2 +REG epsg:31980 0 -0x1.f8p5 -0x1.9p4 +REG epsg:31980 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:31980 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:31980 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:31980 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:31981 0 -0x1.c8p5 -0x1.9p4 +REG epsg:31981 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:31981 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31981 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:31981 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31982 0 -0x1.98p5 -0x1.9p4 +REG epsg:31982 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:31982 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31982 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:31982 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31983 0 -0x1.68p5 -0x1.9p4 +REG epsg:31983 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:31983 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31983 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:31983 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31984 0 -0x1.38p5 -0x1.9p4 +REG epsg:31984 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:31984 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31984 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:31984 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31985 0 -0x1.08p5 -0x1.9p4 +REG epsg:31985 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:31985 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:31985 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:31985 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:31986 0 -0x1.44p6 0x0.0p0 +REG epsg:31986 1 -0x1.58p6 -0x1.4p2 +REG epsg:31986 2 -0x1.3p6 -0x1.4p2 +REG epsg:31986 3 -0x1.58p6 0x1.4p2 +REG epsg:31986 4 -0x1.3p6 0x1.4p2 +REG epsg:31987 0 -0x1.2cp6 0x0.0p0 +REG epsg:31987 1 -0x1.4p6 -0x1.4p2 +REG epsg:31987 2 -0x1.18p6 -0x1.4p2 +REG epsg:31987 3 -0x1.4p6 0x1.4p2 +REG epsg:31987 4 -0x1.18p6 0x1.4p2 +REG epsg:31988 0 -0x1.14p6 0x0.0p0 +REG epsg:31988 1 -0x1.28p6 -0x1.4p2 +REG epsg:31988 2 -0x1.0p6 -0x1.4p2 +REG epsg:31988 3 -0x1.28p6 0x1.4p2 +REG epsg:31988 4 -0x1.0p6 0x1.4p2 +REG epsg:31989 0 -0x1.f8p5 0x0.0p0 +REG epsg:31989 1 -0x1.1p6 -0x1.4p2 +REG epsg:31989 2 -0x1.dp5 -0x1.4p2 +REG epsg:31989 3 -0x1.1p6 0x1.4p2 +REG epsg:31989 4 -0x1.dp5 0x1.4p2 +REG epsg:3199 0 0x1.2p3 0x0.0p0 +REG epsg:3199 1 0x1.0p2 -0x1.4p2 +REG epsg:3199 2 0x1.cp3 -0x1.4p2 +REG epsg:3199 3 0x1.0p2 0x1.4p2 +REG epsg:3199 4 0x1.cp3 0x1.4p2 +REG epsg:31990 0 -0x1.c8p5 0x0.0p0 +REG epsg:31990 1 -0x1.fp5 -0x1.4p2 +REG epsg:31990 2 -0x1.ap5 -0x1.4p2 +REG epsg:31990 3 -0x1.fp5 0x1.4p2 +REG epsg:31990 4 -0x1.ap5 0x1.4p2 +REG epsg:31991 0 -0x1.98p5 0x0.0p0 +REG epsg:31991 1 -0x1.cp5 -0x1.4p2 +REG epsg:31991 2 -0x1.7p5 -0x1.4p2 +REG epsg:31991 3 -0x1.cp5 0x1.4p2 +REG epsg:31991 4 -0x1.7p5 0x1.4p2 +REG epsg:31992 0 -0x1.44p6 -0x1.9p4 +REG epsg:31992 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:31992 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:31992 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:31992 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:31993 0 -0x1.2cp6 -0x1.9p4 +REG epsg:31993 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:31993 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:31993 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:31993 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:31994 0 -0x1.14p6 -0x1.9p4 +REG epsg:31994 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:31994 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:31994 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:31994 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:31995 0 -0x1.f8p5 -0x1.9p4 +REG epsg:31995 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:31995 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:31995 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:31995 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:31996 0 -0x1.c8p5 -0x1.9p4 +REG epsg:31996 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:31996 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31996 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:31996 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31997 0 -0x1.98p5 -0x1.9p4 +REG epsg:31997 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:31997 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31997 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:31997 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31998 0 -0x1.68p5 -0x1.9p4 +REG epsg:31998 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:31998 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31998 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:31998 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:31999 0 -0x1.38p5 -0x1.9p4 +REG epsg:31999 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:31999 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:31999 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:31999 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:3200 0 0x1.68p5 0x1.04p5 +REG epsg:3200 1 0x1.38928b4db1cbap5 0x1.b8p4 +REG epsg:3200 2 0x1.976d74b24e346p5 0x1.b8p4 +REG epsg:3200 3 0x1.38928b4db1cbap5 0x1.2cp5 +REG epsg:3200 4 0x1.976d74b24e346p5 0x1.2cp5 +REG epsg:32000 0 -0x1.08p5 -0x1.9p4 +REG epsg:32000 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32000 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32000 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32000 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32001 0 -0x1.b6p6 0x1.7eddddddddddep5 +REG epsg:32001 1 -0x1.c03be7769007bp6 0x1.7122222222222p5 +REG epsg:32001 2 -0x1.abc418896ff85p6 0x1.7122222222222p5 +REG epsg:32001 3 -0x1.c03be7769007bp6 0x1.8c9999999999ap5 +REG epsg:32001 4 -0x1.abc418896ff85p6 0x1.8c9999999999ap5 +REG epsg:32002 0 -0x1.b6p6 0x1.76ddddddddddep5 +REG epsg:32002 1 -0x1.c1fde20665f2fp6 0x1.6677777777779p5 +REG epsg:32002 2 -0x1.aa021df99a0d1p6 0x1.6677777777779p5 +REG epsg:32002 3 -0x1.c1fde20665f2fp6 0x1.8744444444443p5 +REG epsg:32002 4 -0x1.aa021df99a0d1p6 0x1.8744444444443p5 +REG epsg:32003 0 -0x1.b6p6 0x1.699999999999ap5 +REG epsg:32003 1 -0x1.c39fc45f44299p6 0x1.5666666666667p5 +REG epsg:32003 2 -0x1.a8603ba0bbd67p6 0x1.5666666666667p5 +REG epsg:32003 3 -0x1.c39fc45f44299p6 0x1.7cccccccccccdp5 +REG epsg:32003 4 -0x1.a8603ba0bbd67p6 0x1.7cccccccccccdp5 +REG epsg:32005 0 -0x1.9p6 0x1.509999999999ap5 +REG epsg:32005 1 -0x1.97fe570c30a39p6 0x1.44bbbbbbbbbbdp5 +REG epsg:32005 2 -0x1.8801a8f3cf5c7p6 0x1.44bbbbbbbbbbdp5 +REG epsg:32005 3 -0x1.97fe570c30a39p6 0x1.5c77777777777p5 +REG epsg:32005 4 -0x1.8801a8f3cf5c7p6 0x1.5c77777777777p5 +REG epsg:32006 0 -0x1.8ep6 0x1.4588888888888p5 +REG epsg:32006 1 -0x1.98d08e5c9d95fp6 0x1.352222222222p5 +REG epsg:32006 2 -0x1.832f71a3626a1p6 0x1.352222222222p5 +REG epsg:32006 3 -0x1.98d08e5c9d95fp6 0x1.55eeeeeeeeefp5 +REG epsg:32006 4 -0x1.832f71a3626a1p6 0x1.55eeeeeeeeefp5 +REG epsg:32007 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:32007 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:32007 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:32007 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:32007 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:32008 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:32008 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:32008 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:32008 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:32008 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:32009 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:32009 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:32009 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:32009 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:32009 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:3201 0 0x1.ep3 0x0.0p0 +REG epsg:3201 1 0x1.4p3 -0x1.4p2 +REG epsg:3201 2 0x1.4p4 -0x1.4p2 +REG epsg:3201 3 0x1.4p3 0x1.4p2 +REG epsg:3201 4 0x1.4p4 0x1.4p2 +REG epsg:32010 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:32010 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:32010 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:32010 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:32010 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:32011 0 -0x1.2aaaaaaaaaaabp6 0x1.36aaaaaaaaaacp5 +REG epsg:32011 1 -0x1.44576bc120c12p6 0x1.0eaaaaaaaaaacp5 +REG epsg:32011 2 -0x1.10fde99434944p6 0x1.0eaaaaaaaaaacp5 +REG epsg:32011 3 -0x1.44576bc120c12p6 0x1.5eaaaaaaaaaacp5 +REG epsg:32011 4 -0x1.10fde99434944p6 0x1.5eaaaaaaaaaacp5 +REG epsg:32012 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:32012 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:32012 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:32012 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:32012 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:32013 0 -0x1.a9p6 0x1.fp4 +REG epsg:32013 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:32013 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:32013 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:32013 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:32014 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:32014 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:32014 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:32014 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:32014 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:32015 0 -0x1.2955555555555p6 0x1.4p5 +REG epsg:32015 1 -0x1.437104c68e2d2p6 0x1.18p5 +REG epsg:32015 2 -0x1.0f39a5e41c7d8p6 0x1.18p5 +REG epsg:32015 3 -0x1.437104c68e2d2p6 0x1.68p5 +REG epsg:32015 4 -0x1.0f39a5e41c7d8p6 0x1.68p5 +REG epsg:32016 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:32016 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:32016 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:32016 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:32016 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:32017 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:32017 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:32017 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:32017 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:32017 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:32018 0 -0x1.28p6 0x1.4622222222222p5 +REG epsg:32018 1 -0x1.2d4809c4ef0d8p6 0x1.3e22222222222p5 +REG epsg:32018 2 -0x1.22b7f63b10f28p6 0x1.3e22222222222p5 +REG epsg:32018 3 -0x1.2d4809c4ef0d8p6 0x1.4e22222222222p5 +REG epsg:32018 4 -0x1.22b7f63b10f28p6 0x1.4e22222222222p5 +REG epsg:32019 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:32019 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:32019 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:32019 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:32019 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3202 0 0x1.5p4 0x0.0p0 +REG epsg:3202 1 0x1.0p4 -0x1.4p2 +REG epsg:3202 2 0x1.ap4 -0x1.4p2 +REG epsg:3202 3 0x1.0p4 0x1.4p2 +REG epsg:3202 4 0x1.ap4 0x1.4p2 +REG epsg:32020 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:32020 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:32020 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:32020 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:32020 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:32021 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:32021 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:32021 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:32021 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:32021 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:32022 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:32022 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:32022 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:32022 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:32022 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:32023 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:32023 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:32023 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:32023 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:32023 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:32024 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:32024 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:32024 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:32024 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:32024 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:32025 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:32025 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:32025 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:32025 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:32025 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:32026 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:32026 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:32026 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:32026 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:32026 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:32027 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:32027 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:32027 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:32027 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:32027 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:32028 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:32028 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:32028 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:32028 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:32028 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:32029 0 -0x1.37p6 0x1.4088888888889p5 +REG epsg:32029 1 -0x1.3eaa770d743d9p6 0x1.34ccccccccccfp5 +REG epsg:32029 2 -0x1.2f5588f28bc27p6 0x1.34ccccccccccfp5 +REG epsg:32029 3 -0x1.3eaa770d743d9p6 0x1.4c44444444443p5 +REG epsg:32029 4 -0x1.2f5588f28bc27p6 0x1.4c44444444443p5 +REG epsg:3203 0 0x1.bp4 0x0.0p0 +REG epsg:3203 1 0x1.6p4 -0x1.4p2 +REG epsg:3203 2 0x1.0p5 -0x1.4p2 +REG epsg:3203 3 0x1.6p4 0x1.4p2 +REG epsg:3203 4 0x1.0p5 0x1.4p2 +REG epsg:32030 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:32030 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:32030 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:32030 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:32030 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:32031 0 -0x1.44p6 0x1.0fddddddddddep5 +REG epsg:32031 1 -0x1.4d7caf89e58b4p6 0x1.0022222222222p5 +REG epsg:32031 2 -0x1.3a8350761a74cp6 0x1.0022222222222p5 +REG epsg:32031 3 -0x1.4d7caf89e58b4p6 0x1.1f9999999999ap5 +REG epsg:32031 4 -0x1.3a8350761a74cp6 0x1.1f9999999999ap5 +REG epsg:32033 0 -0x1.44p6 0x1.05fffffffffffp5 +REG epsg:32033 1 -0x1.4cb828dd9db44p6 0x1.eeaaaaaaaaaaap4 +REG epsg:32033 2 -0x1.3b47d722624bcp6 0x1.eeaaaaaaaaaaap4 +REG epsg:32033 3 -0x1.4cb828dd9db44p6 0x1.14aaaaaaaaaa9p5 +REG epsg:32033 4 -0x1.3b47d722624bcp6 0x1.14aaaaaaaaaa9p5 +REG epsg:32034 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:32034 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:32034 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:32034 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:32034 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:32035 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:32035 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:32035 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:32035 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:32035 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:32036 0 -0x1.58p6 0x1.1c55555555554p5 +REG epsg:32036 1 -0x1.609a4e06b0d59p6 0x1.0e55555555554p5 +REG epsg:32036 2 -0x1.4f65b1f94f2a7p6 0x1.0e55555555554p5 +REG epsg:32036 3 -0x1.609a4e06b0d59p6 0x1.2a55555555554p5 +REG epsg:32036 4 -0x1.4f65b1f94f2a7p6 0x1.2a55555555554p5 +REG epsg:32037 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:32037 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:32037 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:32037 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:32037 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:32038 0 -0x1.86p6 0x1.0688888888889p5 +REG epsg:32038 1 -0x1.90f271ed65e92p6 0x1.e844444444446p4 +REG epsg:32038 2 -0x1.7b0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:32038 3 -0x1.90f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:32038 4 -0x1.7b0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:32039 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:32039 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:32039 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:32039 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:32039 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:3204 0 -0x1.08p6 -0x1.2d55555555555p6 +REG epsg:3204 1 -0x1.f4f8aa2fccddap6 -0x1.64p6 +REG epsg:3204 2 -0x1.b0755d0332258p2 -0x1.64p6 +REG epsg:3204 3 -0x1.f4f8aa2fccddap6 -0x1.e2aaaaaaaaaaap5 +REG epsg:3204 4 -0x1.b0755d0332258p2 -0x1.e2aaaaaaaaaaap5 +REG epsg:32040 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:32040 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:32040 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:32040 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:32040 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:32041 0 -0x1.8ap6 0x1.acp4 +REG epsg:32041 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:32041 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:32041 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:32041 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:32042 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:32042 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:32042 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:32042 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:32042 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:32043 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:32043 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:32043 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:32043 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:32043 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:32044 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:32044 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:32044 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:32044 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:32044 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:32045 0 -0x1.22p6 0x1.54p5 +REG epsg:32045 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:32045 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:32045 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:32045 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:32046 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:32046 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:32046 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:32046 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:32046 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:32047 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:32047 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:32047 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:32047 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:32047 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:32048 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:32048 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:32048 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:32048 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:32048 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:32049 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:32049 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:32049 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:32049 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:32049 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:3205 0 -0x1.bp5 -0x1.2d55555555555p6 +REG epsg:3205 1 -0x1.c4f8aa2fccddap6 -0x1.64p6 +REG epsg:3205 2 0x1.4f8aa2fccdda8p2 -0x1.64p6 +REG epsg:3205 3 -0x1.c4f8aa2fccddap6 -0x1.e2aaaaaaaaaaap5 +REG epsg:3205 4 0x1.4f8aa2fccdda8p2 -0x1.e2aaaaaaaaaaap5 +REG epsg:32050 0 -0x1.3ep6 0x1.3bp5 +REG epsg:32050 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:32050 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:32050 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:32050 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:32051 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:32051 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:32051 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:32051 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:32051 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:32052 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:32052 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:32052 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:32052 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:32052 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:32053 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:32053 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:32053 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:32053 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:32053 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:32054 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:32054 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:32054 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:32054 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:32054 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:32055 0 -0x1.a4aaaaaaaaaadp6 0x1.4555555555554p5 +REG epsg:32055 1 -0x1.bf08b5e8e0578p6 0x1.1d55555555554p5 +REG epsg:32055 2 -0x1.8a4c9f6c74fe2p6 0x1.1d55555555554p5 +REG epsg:32055 3 -0x1.bf08b5e8e0578p6 0x1.6d55555555554p5 +REG epsg:32055 4 -0x1.8a4c9f6c74fe2p6 0x1.6d55555555554p5 +REG epsg:32056 0 -0x1.ad55555555553p6 0x1.4555555555554p5 +REG epsg:32056 1 -0x1.c7b360938b01ep6 0x1.1d55555555554p5 +REG epsg:32056 2 -0x1.92f74a171fa88p6 0x1.1d55555555554p5 +REG epsg:32056 3 -0x1.c7b360938b01ep6 0x1.6d55555555554p5 +REG epsg:32056 4 -0x1.92f74a171fa88p6 0x1.6d55555555554p5 +REG epsg:32057 0 -0x1.b3p6 0x1.4555555555554p5 +REG epsg:32057 1 -0x1.cd5e0b3e35acbp6 0x1.1d55555555554p5 +REG epsg:32057 2 -0x1.98a1f4c1ca535p6 0x1.1d55555555554p5 +REG epsg:32057 3 -0x1.cd5e0b3e35acbp6 0x1.6d55555555554p5 +REG epsg:32057 4 -0x1.98a1f4c1ca535p6 0x1.6d55555555554p5 +REG epsg:32058 0 -0x1.b855555555553p6 0x1.4555555555554p5 +REG epsg:32058 1 -0x1.d2b360938b01ep6 0x1.1d55555555554p5 +REG epsg:32058 2 -0x1.9df74a171fa88p6 0x1.1d55555555554p5 +REG epsg:32058 3 -0x1.d2b360938b01ep6 0x1.6d55555555554p5 +REG epsg:32058 4 -0x1.9df74a171fa88p6 0x1.6d55555555554p5 +REG epsg:3206 0 -0x1.5p5 -0x1.2d55555555555p6 +REG epsg:3206 1 -0x1.94f8aa2fccddap6 -0x1.64p6 +REG epsg:3206 2 0x1.13e2a8bf3376ap4 -0x1.64p6 +REG epsg:3206 3 -0x1.94f8aa2fccddap6 -0x1.e2aaaaaaaaaaap5 +REG epsg:3206 4 0x1.13e2a8bf3376ap4 -0x1.e2aaaaaaaaaaap5 +REG epsg:32061 0 -0x1.6955555555555p6 0x1.0d11111111112p4 +REG epsg:32061 1 -0x1.7e3a11ecca027p6 0x1.7a22222222224p3 +REG epsg:32061 2 -0x1.547098bde0a83p6 0x1.7a22222222224p3 +REG epsg:32061 3 -0x1.7e3a11ecca027p6 0x1.5d11111111112p4 +REG epsg:32061 4 -0x1.547098bde0a83p6 0x1.5d11111111112p4 +REG epsg:32062 0 -0x1.6955555555555p6 0x1.dcccccccccccdp3 +REG epsg:32062 1 -0x1.7e077a4bda7ebp6 0x1.3cccccccccccdp3 +REG epsg:32062 2 -0x1.54a3305ed02bfp6 0x1.3cccccccccccdp3 +REG epsg:32062 3 -0x1.7e077a4bda7ebp6 0x1.3e66666666666p4 +REG epsg:32062 4 -0x1.54a3305ed02bfp6 0x1.3e66666666666p4 +REG epsg:32064 0 -0x1.8cp6 0x0.0p0 +REG epsg:32064 1 -0x1.ap6 -0x1.4p2 +REG epsg:32064 2 -0x1.78p6 -0x1.4p2 +REG epsg:32064 3 -0x1.ap6 0x1.4p2 +REG epsg:32064 4 -0x1.78p6 0x1.4p2 +REG epsg:32065 0 -0x1.74p6 0x0.0p0 +REG epsg:32065 1 -0x1.88p6 -0x1.4p2 +REG epsg:32065 2 -0x1.6p6 -0x1.4p2 +REG epsg:32065 3 -0x1.88p6 0x1.4p2 +REG epsg:32065 4 -0x1.6p6 0x1.4p2 +REG epsg:32066 0 -0x1.5cp6 0x0.0p0 +REG epsg:32066 1 -0x1.7p6 -0x1.4p2 +REG epsg:32066 2 -0x1.48p6 -0x1.4p2 +REG epsg:32066 3 -0x1.7p6 0x1.4p2 +REG epsg:32066 4 -0x1.48p6 0x1.4p2 +REG epsg:32067 0 -0x1.44p6 0x0.0p0 +REG epsg:32067 1 -0x1.58p6 -0x1.4p2 +REG epsg:32067 2 -0x1.3p6 -0x1.4p2 +REG epsg:32067 3 -0x1.58p6 0x1.4p2 +REG epsg:32067 4 -0x1.3p6 0x1.4p2 +REG epsg:3207 0 -0x1.5cp7 -0x1.3555555555556p6 +REG epsg:3207 1 0x1.f8p6 -0x1.64p6 +REG epsg:3207 2 -0x1.c8p6 -0x1.64p6 +REG epsg:3207 3 0x1.f8p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3207 4 -0x1.c8p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:32074 0 -0x1.8cp6 0x0.0p0 +REG epsg:32074 1 -0x1.ap6 -0x1.4p2 +REG epsg:32074 2 -0x1.78p6 -0x1.4p2 +REG epsg:32074 3 -0x1.ap6 0x1.4p2 +REG epsg:32074 4 -0x1.78p6 0x1.4p2 +REG epsg:32075 0 -0x1.74p6 0x0.0p0 +REG epsg:32075 1 -0x1.88p6 -0x1.4p2 +REG epsg:32075 2 -0x1.6p6 -0x1.4p2 +REG epsg:32075 3 -0x1.88p6 0x1.4p2 +REG epsg:32075 4 -0x1.6p6 0x1.4p2 +REG epsg:32076 0 -0x1.5cp6 0x0.0p0 +REG epsg:32076 1 -0x1.7p6 -0x1.4p2 +REG epsg:32076 2 -0x1.48p6 -0x1.4p2 +REG epsg:32076 3 -0x1.7p6 0x1.4p2 +REG epsg:32076 4 -0x1.48p6 0x1.4p2 +REG epsg:32077 0 -0x1.44p6 0x0.0p0 +REG epsg:32077 1 -0x1.58p6 -0x1.4p2 +REG epsg:32077 2 -0x1.3p6 -0x1.4p2 +REG epsg:32077 3 -0x1.58p6 0x1.4p2 +REG epsg:32077 4 -0x1.3p6 0x1.4p2 +REG epsg:3208 0 -0x1.08p6 -0x1.3555555555556p6 +REG epsg:3208 1 -0x1.f8p6 -0x1.64p6 +REG epsg:3208 2 -0x1.8p2 -0x1.64p6 +REG epsg:3208 3 -0x1.f8p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3208 4 -0x1.8p2 -0x1.f2aaaaaaaaaacp5 +REG epsg:32081 0 -0x1.a8p5 0x0.0p0 +REG epsg:32081 1 -0x1.dp5 -0x1.4p2 +REG epsg:32081 2 -0x1.8p5 -0x1.4p2 +REG epsg:32081 3 -0x1.dp5 0x1.4p2 +REG epsg:32081 4 -0x1.8p5 0x1.4p2 +REG epsg:32082 0 -0x1.cp5 0x0.0p0 +REG epsg:32082 1 -0x1.e8p5 -0x1.4p2 +REG epsg:32082 2 -0x1.98p5 -0x1.4p2 +REG epsg:32082 3 -0x1.e8p5 0x1.4p2 +REG epsg:32082 4 -0x1.98p5 0x1.4p2 +REG epsg:32083 0 -0x1.d4p5 0x0.0p0 +REG epsg:32083 1 -0x1.fcp5 -0x1.4p2 +REG epsg:32083 2 -0x1.acp5 -0x1.4p2 +REG epsg:32083 3 -0x1.fcp5 0x1.4p2 +REG epsg:32083 4 -0x1.acp5 0x1.4p2 +REG epsg:32084 0 -0x1.ecp5 0x0.0p0 +REG epsg:32084 1 -0x1.0ap6 -0x1.4p2 +REG epsg:32084 2 -0x1.c4p5 -0x1.4p2 +REG epsg:32084 3 -0x1.0ap6 0x1.4p2 +REG epsg:32084 4 -0x1.c4p5 0x1.4p2 +REG epsg:32085 0 -0x1.02p6 0x0.0p0 +REG epsg:32085 1 -0x1.16p6 -0x1.4p2 +REG epsg:32085 2 -0x1.dcp5 -0x1.4p2 +REG epsg:32085 3 -0x1.16p6 0x1.4p2 +REG epsg:32085 4 -0x1.dcp5 0x1.4p2 +REG epsg:32086 0 -0x1.0ep6 0x0.0p0 +REG epsg:32086 1 -0x1.22p6 -0x1.4p2 +REG epsg:32086 2 -0x1.f4p5 -0x1.4p2 +REG epsg:32086 3 -0x1.22p6 0x1.4p2 +REG epsg:32086 4 -0x1.f4p5 0x1.4p2 +REG epsg:3209 0 -0x1.bp5 -0x1.3555555555556p6 +REG epsg:3209 1 -0x1.c8p6 -0x1.64p6 +REG epsg:3209 2 0x1.8p2 -0x1.64p6 +REG epsg:3209 3 -0x1.c8p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3209 4 0x1.8p2 -0x1.f2aaaaaaaaaacp5 +REG epsg:32098 0 -0x1.12p6 0x1.ap5 +REG epsg:32098 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG epsg:32098 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG epsg:32098 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG epsg:32098 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG epsg:32099 0 -0x1.6d55555555555p6 0x1.acp4 +REG epsg:32099 1 -0x1.7709e6ac1bc4dp6 0x1.8955555555558p4 +REG epsg:32099 2 -0x1.63a0c3fe8ee5dp6 0x1.8955555555558p4 +REG epsg:32099 3 -0x1.7709e6ac1bc4dp6 0x1.ceaaaaaaaaaa8p4 +REG epsg:32099 4 -0x1.63a0c3fe8ee5dp6 0x1.ceaaaaaaaaaa8p4 +REG epsg:3210 0 0x1.5p5 -0x1.3555555555556p6 +REG epsg:3210 1 -0x1.2p4 -0x1.64p6 +REG epsg:3210 2 0x1.98p6 -0x1.64p6 +REG epsg:3210 3 -0x1.2p4 -0x1.f2aaaaaaaaaacp5 +REG epsg:3210 4 0x1.98p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:32100 0 -0x1.b6p6 0x1.75p5 +REG epsg:32100 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:32100 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:32100 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:32100 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:32104 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:32104 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:32104 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:32104 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:32104 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:32107 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:32107 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:32107 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:32107 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:32107 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:32108 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:32108 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:32108 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:32108 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:32108 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:32109 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:32109 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:32109 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:32109 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:32109 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:3211 0 0x1.bp5 -0x1.3555555555556p6 +REG epsg:3211 1 -0x1.8p2 -0x1.64p6 +REG epsg:3211 2 0x1.c8p6 -0x1.64p6 +REG epsg:3211 3 -0x1.8p2 -0x1.f2aaaaaaaaaacp5 +REG epsg:3211 4 0x1.c8p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:32110 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:32110 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:32110 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:32110 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:32110 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:32111 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:32111 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:32111 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:32111 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:32111 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:32112 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:32112 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:32112 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:32112 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:32112 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:32113 0 -0x1.a9p6 0x1.fp4 +REG epsg:32113 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:32113 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:32113 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:32113 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:32114 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:32114 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:32114 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:32114 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:32114 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:32115 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:32115 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:32115 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:32115 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:32115 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:32116 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:32116 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:32116 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:32116 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:32116 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:32117 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:32117 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:32117 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:32117 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:32117 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:32118 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:32118 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:32118 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:32118 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:32118 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:32119 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:32119 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:32119 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:32119 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:32119 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3212 0 0x1.08p6 -0x1.3555555555556p6 +REG epsg:3212 1 0x1.8p2 -0x1.64p6 +REG epsg:3212 2 0x1.f8p6 -0x1.64p6 +REG epsg:3212 3 0x1.8p2 -0x1.f2aaaaaaaaaacp5 +REG epsg:3212 4 0x1.f8p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:32120 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:32120 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:32120 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:32120 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:32120 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:32121 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:32121 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:32121 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:32121 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:32121 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:32122 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:32122 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:32122 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:32122 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:32122 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:32123 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:32123 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:32123 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:32123 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:32123 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:32124 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:32124 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:32124 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:32124 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:32124 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:32125 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:32125 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:32125 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:32125 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:32125 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:32126 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:32126 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:32126 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:32126 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:32126 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:32127 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:32127 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:32127 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:32127 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:32127 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:32128 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:32128 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:32128 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:32128 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:32128 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:32129 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:32129 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:32129 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:32129 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:32129 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:3213 0 0x1.38p6 -0x1.3555555555556p6 +REG epsg:3213 1 0x1.2p4 -0x1.64p6 +REG epsg:3213 2 0x1.14p7 -0x1.64p6 +REG epsg:3213 3 0x1.2p4 -0x1.f2aaaaaaaaaacp5 +REG epsg:3213 4 0x1.14p7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32130 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:32130 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:32130 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:32130 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:32130 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:32133 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:32133 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:32133 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:32133 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:32133 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:32134 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:32134 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:32134 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:32134 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:32134 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:32135 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:32135 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:32135 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:32135 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:32135 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:32136 0 -0x1.58p6 0x1.1bp5 +REG epsg:32136 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:32136 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:32136 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:32136 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:32137 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:32137 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:32137 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:32137 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:32137 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:32138 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:32138 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:32138 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:32138 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:32138 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:32139 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:32139 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:32139 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:32139 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:32139 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:3214 0 0x1.68p6 -0x1.3555555555556p6 +REG epsg:3214 1 0x1.ep4 -0x1.64p6 +REG epsg:3214 2 0x1.2cp7 -0x1.64p6 +REG epsg:3214 3 0x1.ep4 -0x1.f2aaaaaaaaaacp5 +REG epsg:3214 4 0x1.2cp7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32140 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:32140 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:32140 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:32140 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:32140 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:32141 0 -0x1.8ap6 0x1.acp4 +REG epsg:32141 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:32141 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:32141 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:32141 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:32142 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:32142 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:32142 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:32142 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:32142 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:32143 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:32143 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:32143 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:32143 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:32143 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:32144 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:32144 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:32144 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:32144 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:32144 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:32145 0 -0x1.22p6 0x1.54p5 +REG epsg:32145 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:32145 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:32145 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:32145 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:32146 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:32146 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:32146 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:32146 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:32146 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:32147 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:32147 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:32147 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:32147 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:32147 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:32148 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:32148 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:32148 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:32148 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:32148 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:32149 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:32149 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:32149 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:32149 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:32149 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:3215 0 0x1.98p6 -0x1.3555555555556p6 +REG epsg:3215 1 0x1.5p5 -0x1.64p6 +REG epsg:3215 2 0x1.44p7 -0x1.64p6 +REG epsg:3215 3 0x1.5p5 -0x1.f2aaaaaaaaaacp5 +REG epsg:3215 4 0x1.44p7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32150 0 -0x1.3ep6 0x1.3bp5 +REG epsg:32150 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:32150 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:32150 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:32150 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:32151 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:32151 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:32151 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:32151 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:32151 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:32152 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:32152 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:32152 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:32152 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:32152 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:32153 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:32153 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:32153 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:32153 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:32153 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:32154 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:32154 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:32154 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:32154 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:32154 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:32155 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:32155 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:32155 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:32155 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:32155 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:32156 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:32156 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:32156 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:32156 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:32156 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:32157 0 -0x1.b3p6 0x1.44p5 +REG epsg:32157 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:32157 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:32157 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:32157 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:32158 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:32158 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:32158 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:32158 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:32158 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:3216 0 0x1.c8p6 -0x1.3555555555556p6 +REG epsg:3216 1 0x1.bp5 -0x1.64p6 +REG epsg:3216 2 0x1.5cp7 -0x1.64p6 +REG epsg:3216 3 0x1.bp5 -0x1.f2aaaaaaaaaacp5 +REG epsg:3216 4 0x1.5cp7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32161 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:32161 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:32161 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:32161 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:32161 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:32164 0 -0x1.8cp6 0x0.0p0 +REG epsg:32164 1 -0x1.ap6 -0x1.4p2 +REG epsg:32164 2 -0x1.78p6 -0x1.4p2 +REG epsg:32164 3 -0x1.ap6 0x1.4p2 +REG epsg:32164 4 -0x1.78p6 0x1.4p2 +REG epsg:32165 0 -0x1.74p6 0x0.0p0 +REG epsg:32165 1 -0x1.88p6 -0x1.4p2 +REG epsg:32165 2 -0x1.6p6 -0x1.4p2 +REG epsg:32165 3 -0x1.88p6 0x1.4p2 +REG epsg:32165 4 -0x1.6p6 0x1.4p2 +REG epsg:32166 0 -0x1.5cp6 0x0.0p0 +REG epsg:32166 1 -0x1.7p6 -0x1.4p2 +REG epsg:32166 2 -0x1.48p6 -0x1.4p2 +REG epsg:32166 3 -0x1.7p6 0x1.4p2 +REG epsg:32166 4 -0x1.48p6 0x1.4p2 +REG epsg:32167 0 -0x1.44p6 0x0.0p0 +REG epsg:32167 1 -0x1.58p6 -0x1.4p2 +REG epsg:32167 2 -0x1.3p6 -0x1.4p2 +REG epsg:32167 3 -0x1.58p6 0x1.4p2 +REG epsg:32167 4 -0x1.3p6 0x1.4p2 +REG epsg:3217 0 0x1.f8p6 -0x1.3555555555556p6 +REG epsg:3217 1 0x1.08p6 -0x1.64p6 +REG epsg:3217 2 -0x1.5cp7 -0x1.64p6 +REG epsg:3217 3 0x1.08p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3217 4 -0x1.5cp7 -0x1.f2aaaaaaaaaacp5 +REG epsg:3218 0 0x1.14p7 -0x1.3555555555556p6 +REG epsg:3218 1 0x1.38p6 -0x1.64p6 +REG epsg:3218 2 -0x1.44p7 -0x1.64p6 +REG epsg:3218 3 0x1.38p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3218 4 -0x1.44p7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32180 0 -0x1.bcp5 0x0.0p0 +REG epsg:32180 1 -0x1.e4p5 -0x1.4p2 +REG epsg:32180 2 -0x1.94p5 -0x1.4p2 +REG epsg:32180 3 -0x1.e4p5 0x1.4p2 +REG epsg:32180 4 -0x1.94p5 0x1.4p2 +REG epsg:32181 0 -0x1.a8p5 0x0.0p0 +REG epsg:32181 1 -0x1.dp5 -0x1.4p2 +REG epsg:32181 2 -0x1.8p5 -0x1.4p2 +REG epsg:32181 3 -0x1.dp5 0x1.4p2 +REG epsg:32181 4 -0x1.8p5 0x1.4p2 +REG epsg:32182 0 -0x1.cp5 0x0.0p0 +REG epsg:32182 1 -0x1.e8p5 -0x1.4p2 +REG epsg:32182 2 -0x1.98p5 -0x1.4p2 +REG epsg:32182 3 -0x1.e8p5 0x1.4p2 +REG epsg:32182 4 -0x1.98p5 0x1.4p2 +REG epsg:32183 0 -0x1.d4p5 0x0.0p0 +REG epsg:32183 1 -0x1.fcp5 -0x1.4p2 +REG epsg:32183 2 -0x1.acp5 -0x1.4p2 +REG epsg:32183 3 -0x1.fcp5 0x1.4p2 +REG epsg:32183 4 -0x1.acp5 0x1.4p2 +REG epsg:32184 0 -0x1.ecp5 0x0.0p0 +REG epsg:32184 1 -0x1.0ap6 -0x1.4p2 +REG epsg:32184 2 -0x1.c4p5 -0x1.4p2 +REG epsg:32184 3 -0x1.0ap6 0x1.4p2 +REG epsg:32184 4 -0x1.c4p5 0x1.4p2 +REG epsg:32185 0 -0x1.02p6 0x0.0p0 +REG epsg:32185 1 -0x1.16p6 -0x1.4p2 +REG epsg:32185 2 -0x1.dcp5 -0x1.4p2 +REG epsg:32185 3 -0x1.16p6 0x1.4p2 +REG epsg:32185 4 -0x1.dcp5 0x1.4p2 +REG epsg:32186 0 -0x1.0ep6 0x0.0p0 +REG epsg:32186 1 -0x1.22p6 -0x1.4p2 +REG epsg:32186 2 -0x1.f4p5 -0x1.4p2 +REG epsg:32186 3 -0x1.22p6 0x1.4p2 +REG epsg:32186 4 -0x1.f4p5 0x1.4p2 +REG epsg:32187 0 -0x1.1ap6 0x0.0p0 +REG epsg:32187 1 -0x1.2ep6 -0x1.4p2 +REG epsg:32187 2 -0x1.06p6 -0x1.4p2 +REG epsg:32187 3 -0x1.2ep6 0x1.4p2 +REG epsg:32187 4 -0x1.06p6 0x1.4p2 +REG epsg:32188 0 -0x1.26p6 0x0.0p0 +REG epsg:32188 1 -0x1.3ap6 -0x1.4p2 +REG epsg:32188 2 -0x1.12p6 -0x1.4p2 +REG epsg:32188 3 -0x1.3ap6 0x1.4p2 +REG epsg:32188 4 -0x1.12p6 0x1.4p2 +REG epsg:32189 0 -0x1.32p6 0x0.0p0 +REG epsg:32189 1 -0x1.46p6 -0x1.4p2 +REG epsg:32189 2 -0x1.1ep6 -0x1.4p2 +REG epsg:32189 3 -0x1.46p6 0x1.4p2 +REG epsg:32189 4 -0x1.1ep6 0x1.4p2 +REG epsg:3219 0 0x1.2cp7 -0x1.3555555555556p6 +REG epsg:3219 1 0x1.68p6 -0x1.64p6 +REG epsg:3219 2 -0x1.2cp7 -0x1.64p6 +REG epsg:3219 3 0x1.68p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3219 4 -0x1.2cp7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32190 0 -0x1.3ep6 0x0.0p0 +REG epsg:32190 1 -0x1.52p6 -0x1.4p2 +REG epsg:32190 2 -0x1.2ap6 -0x1.4p2 +REG epsg:32190 3 -0x1.52p6 0x1.4p2 +REG epsg:32190 4 -0x1.2ap6 0x1.4p2 +REG epsg:32191 0 -0x1.4ap6 0x0.0p0 +REG epsg:32191 1 -0x1.5ep6 -0x1.4p2 +REG epsg:32191 2 -0x1.36p6 -0x1.4p2 +REG epsg:32191 3 -0x1.5ep6 0x1.4p2 +REG epsg:32191 4 -0x1.36p6 0x1.4p2 +REG epsg:32192 0 -0x1.44p6 0x0.0p0 +REG epsg:32192 1 -0x1.58p6 -0x1.4p2 +REG epsg:32192 2 -0x1.3p6 -0x1.4p2 +REG epsg:32192 3 -0x1.58p6 0x1.4p2 +REG epsg:32192 4 -0x1.3p6 0x1.4p2 +REG epsg:32193 0 -0x1.5p6 0x0.0p0 +REG epsg:32193 1 -0x1.64p6 -0x1.4p2 +REG epsg:32193 2 -0x1.3cp6 -0x1.4p2 +REG epsg:32193 3 -0x1.64p6 0x1.4p2 +REG epsg:32193 4 -0x1.3cp6 0x1.4p2 +REG epsg:32194 0 -0x1.5cp6 0x0.0p0 +REG epsg:32194 1 -0x1.7p6 -0x1.4p2 +REG epsg:32194 2 -0x1.48p6 -0x1.4p2 +REG epsg:32194 3 -0x1.7p6 0x1.4p2 +REG epsg:32194 4 -0x1.48p6 0x1.4p2 +REG epsg:32195 0 -0x1.68p6 0x0.0p0 +REG epsg:32195 1 -0x1.7cp6 -0x1.4p2 +REG epsg:32195 2 -0x1.54p6 -0x1.4p2 +REG epsg:32195 3 -0x1.7cp6 0x1.4p2 +REG epsg:32195 4 -0x1.54p6 0x1.4p2 +REG epsg:32196 0 -0x1.74p6 0x0.0p0 +REG epsg:32196 1 -0x1.88p6 -0x1.4p2 +REG epsg:32196 2 -0x1.6p6 -0x1.4p2 +REG epsg:32196 3 -0x1.88p6 0x1.4p2 +REG epsg:32196 4 -0x1.6p6 0x1.4p2 +REG epsg:32197 0 -0x1.8p6 0x0.0p0 +REG epsg:32197 1 -0x1.94p6 -0x1.4p2 +REG epsg:32197 2 -0x1.6cp6 -0x1.4p2 +REG epsg:32197 3 -0x1.94p6 0x1.4p2 +REG epsg:32197 4 -0x1.6cp6 0x1.4p2 +REG epsg:32198 0 -0x1.12p6 0x1.ap5 +REG epsg:32198 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG epsg:32198 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG epsg:32198 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG epsg:32198 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG epsg:32199 0 -0x1.6d55555555555p6 0x1.aaaaaaaaaaaaap4 +REG epsg:32199 1 -0x1.77c7107b1a9e2p6 0x1.8555555555556p4 +REG epsg:32199 2 -0x1.62e39a2f900c8p6 0x1.8555555555556p4 +REG epsg:32199 3 -0x1.77c7107b1a9e2p6 0x1.cfffffffffffep4 +REG epsg:32199 4 -0x1.62e39a2f900c8p6 0x1.cfffffffffffep4 +REG epsg:3220 0 0x1.44p7 -0x1.3555555555556p6 +REG epsg:3220 1 0x1.98p6 -0x1.64p6 +REG epsg:3220 2 -0x1.14p7 -0x1.64p6 +REG epsg:3220 3 0x1.98p6 -0x1.f2aaaaaaaaaacp5 +REG epsg:3220 4 -0x1.14p7 -0x1.f2aaaaaaaaaacp5 +REG epsg:32201 0 -0x1.62p7 0x0.0p0 +REG epsg:32201 1 0x1.64p7 -0x1.4p2 +REG epsg:32201 2 -0x1.58p7 -0x1.4p2 +REG epsg:32201 3 0x1.64p7 0x1.4p2 +REG epsg:32201 4 -0x1.58p7 0x1.4p2 +REG epsg:32202 0 -0x1.56p7 0x0.0p0 +REG epsg:32202 1 -0x1.6p7 -0x1.4p2 +REG epsg:32202 2 -0x1.4cp7 -0x1.4p2 +REG epsg:32202 3 -0x1.6p7 0x1.4p2 +REG epsg:32202 4 -0x1.4cp7 0x1.4p2 +REG epsg:32203 0 -0x1.4ap7 0x0.0p0 +REG epsg:32203 1 -0x1.54p7 -0x1.4p2 +REG epsg:32203 2 -0x1.4p7 -0x1.4p2 +REG epsg:32203 3 -0x1.54p7 0x1.4p2 +REG epsg:32203 4 -0x1.4p7 0x1.4p2 +REG epsg:32204 0 -0x1.3ep7 0x0.0p0 +REG epsg:32204 1 -0x1.48p7 -0x1.4p2 +REG epsg:32204 2 -0x1.34p7 -0x1.4p2 +REG epsg:32204 3 -0x1.48p7 0x1.4p2 +REG epsg:32204 4 -0x1.34p7 0x1.4p2 +REG epsg:32205 0 -0x1.32p7 0x0.0p0 +REG epsg:32205 1 -0x1.3cp7 -0x1.4p2 +REG epsg:32205 2 -0x1.28p7 -0x1.4p2 +REG epsg:32205 3 -0x1.3cp7 0x1.4p2 +REG epsg:32205 4 -0x1.28p7 0x1.4p2 +REG epsg:32206 0 -0x1.26p7 0x0.0p0 +REG epsg:32206 1 -0x1.3p7 -0x1.4p2 +REG epsg:32206 2 -0x1.1cp7 -0x1.4p2 +REG epsg:32206 3 -0x1.3p7 0x1.4p2 +REG epsg:32206 4 -0x1.1cp7 0x1.4p2 +REG epsg:32207 0 -0x1.1ap7 0x0.0p0 +REG epsg:32207 1 -0x1.24p7 -0x1.4p2 +REG epsg:32207 2 -0x1.1p7 -0x1.4p2 +REG epsg:32207 3 -0x1.24p7 0x1.4p2 +REG epsg:32207 4 -0x1.1p7 0x1.4p2 +REG epsg:32208 0 -0x1.0ep7 0x0.0p0 +REG epsg:32208 1 -0x1.18p7 -0x1.4p2 +REG epsg:32208 2 -0x1.04p7 -0x1.4p2 +REG epsg:32208 3 -0x1.18p7 0x1.4p2 +REG epsg:32208 4 -0x1.04p7 0x1.4p2 +REG epsg:32209 0 -0x1.02p7 0x0.0p0 +REG epsg:32209 1 -0x1.0cp7 -0x1.4p2 +REG epsg:32209 2 -0x1.fp6 -0x1.4p2 +REG epsg:32209 3 -0x1.0cp7 0x1.4p2 +REG epsg:32209 4 -0x1.fp6 0x1.4p2 +REG epsg:3221 0 -0x1.98p6 -0x1.3d55555555556p6 +REG epsg:3221 1 -0x1.44p7 -0x1.64p6 +REG epsg:3221 2 -0x1.5p5 -0x1.64p6 +REG epsg:3221 3 -0x1.44p7 -0x1.0155555555556p6 +REG epsg:3221 4 -0x1.5p5 -0x1.0155555555556p6 +REG epsg:32210 0 -0x1.ecp6 0x0.0p0 +REG epsg:32210 1 -0x1.0p7 -0x1.4p2 +REG epsg:32210 2 -0x1.d8p6 -0x1.4p2 +REG epsg:32210 3 -0x1.0p7 0x1.4p2 +REG epsg:32210 4 -0x1.d8p6 0x1.4p2 +REG epsg:32211 0 -0x1.d4p6 0x0.0p0 +REG epsg:32211 1 -0x1.e8p6 -0x1.4p2 +REG epsg:32211 2 -0x1.cp6 -0x1.4p2 +REG epsg:32211 3 -0x1.e8p6 0x1.4p2 +REG epsg:32211 4 -0x1.cp6 0x1.4p2 +REG epsg:32212 0 -0x1.bcp6 0x0.0p0 +REG epsg:32212 1 -0x1.dp6 -0x1.4p2 +REG epsg:32212 2 -0x1.a8p6 -0x1.4p2 +REG epsg:32212 3 -0x1.dp6 0x1.4p2 +REG epsg:32212 4 -0x1.a8p6 0x1.4p2 +REG epsg:32213 0 -0x1.a4p6 0x0.0p0 +REG epsg:32213 1 -0x1.b8p6 -0x1.4p2 +REG epsg:32213 2 -0x1.9p6 -0x1.4p2 +REG epsg:32213 3 -0x1.b8p6 0x1.4p2 +REG epsg:32213 4 -0x1.9p6 0x1.4p2 +REG epsg:32214 0 -0x1.8cp6 0x0.0p0 +REG epsg:32214 1 -0x1.ap6 -0x1.4p2 +REG epsg:32214 2 -0x1.78p6 -0x1.4p2 +REG epsg:32214 3 -0x1.ap6 0x1.4p2 +REG epsg:32214 4 -0x1.78p6 0x1.4p2 +REG epsg:32215 0 -0x1.74p6 0x0.0p0 +REG epsg:32215 1 -0x1.88p6 -0x1.4p2 +REG epsg:32215 2 -0x1.6p6 -0x1.4p2 +REG epsg:32215 3 -0x1.88p6 0x1.4p2 +REG epsg:32215 4 -0x1.6p6 0x1.4p2 +REG epsg:32216 0 -0x1.5cp6 0x0.0p0 +REG epsg:32216 1 -0x1.7p6 -0x1.4p2 +REG epsg:32216 2 -0x1.48p6 -0x1.4p2 +REG epsg:32216 3 -0x1.7p6 0x1.4p2 +REG epsg:32216 4 -0x1.48p6 0x1.4p2 +REG epsg:32217 0 -0x1.44p6 0x0.0p0 +REG epsg:32217 1 -0x1.58p6 -0x1.4p2 +REG epsg:32217 2 -0x1.3p6 -0x1.4p2 +REG epsg:32217 3 -0x1.58p6 0x1.4p2 +REG epsg:32217 4 -0x1.3p6 0x1.4p2 +REG epsg:32218 0 -0x1.2cp6 0x0.0p0 +REG epsg:32218 1 -0x1.4p6 -0x1.4p2 +REG epsg:32218 2 -0x1.18p6 -0x1.4p2 +REG epsg:32218 3 -0x1.4p6 0x1.4p2 +REG epsg:32218 4 -0x1.18p6 0x1.4p2 +REG epsg:32219 0 -0x1.14p6 0x0.0p0 +REG epsg:32219 1 -0x1.28p6 -0x1.4p2 +REG epsg:32219 2 -0x1.0p6 -0x1.4p2 +REG epsg:32219 3 -0x1.28p6 0x1.4p2 +REG epsg:32219 4 -0x1.0p6 0x1.4p2 +REG epsg:3222 0 -0x1.68p6 -0x1.3d55555555556p6 +REG epsg:3222 1 -0x1.2cp7 -0x1.64p6 +REG epsg:3222 2 -0x1.ep4 -0x1.64p6 +REG epsg:3222 3 -0x1.2cp7 -0x1.0155555555556p6 +REG epsg:3222 4 -0x1.ep4 -0x1.0155555555556p6 +REG epsg:32220 0 -0x1.f8p5 0x0.0p0 +REG epsg:32220 1 -0x1.1p6 -0x1.4p2 +REG epsg:32220 2 -0x1.dp5 -0x1.4p2 +REG epsg:32220 3 -0x1.1p6 0x1.4p2 +REG epsg:32220 4 -0x1.dp5 0x1.4p2 +REG epsg:32221 0 -0x1.c8p5 0x0.0p0 +REG epsg:32221 1 -0x1.fp5 -0x1.4p2 +REG epsg:32221 2 -0x1.ap5 -0x1.4p2 +REG epsg:32221 3 -0x1.fp5 0x1.4p2 +REG epsg:32221 4 -0x1.ap5 0x1.4p2 +REG epsg:32222 0 -0x1.98p5 0x0.0p0 +REG epsg:32222 1 -0x1.cp5 -0x1.4p2 +REG epsg:32222 2 -0x1.7p5 -0x1.4p2 +REG epsg:32222 3 -0x1.cp5 0x1.4p2 +REG epsg:32222 4 -0x1.7p5 0x1.4p2 +REG epsg:32223 0 -0x1.68p5 0x0.0p0 +REG epsg:32223 1 -0x1.9p5 -0x1.4p2 +REG epsg:32223 2 -0x1.4p5 -0x1.4p2 +REG epsg:32223 3 -0x1.9p5 0x1.4p2 +REG epsg:32223 4 -0x1.4p5 0x1.4p2 +REG epsg:32224 0 -0x1.38p5 0x0.0p0 +REG epsg:32224 1 -0x1.6p5 -0x1.4p2 +REG epsg:32224 2 -0x1.1p5 -0x1.4p2 +REG epsg:32224 3 -0x1.6p5 0x1.4p2 +REG epsg:32224 4 -0x1.1p5 0x1.4p2 +REG epsg:32225 0 -0x1.08p5 0x0.0p0 +REG epsg:32225 1 -0x1.3p5 -0x1.4p2 +REG epsg:32225 2 -0x1.cp4 -0x1.4p2 +REG epsg:32225 3 -0x1.3p5 0x1.4p2 +REG epsg:32225 4 -0x1.cp4 0x1.4p2 +REG epsg:32226 0 -0x1.bp4 0x0.0p0 +REG epsg:32226 1 -0x1.0p5 -0x1.4p2 +REG epsg:32226 2 -0x1.6p4 -0x1.4p2 +REG epsg:32226 3 -0x1.0p5 0x1.4p2 +REG epsg:32226 4 -0x1.6p4 0x1.4p2 +REG epsg:32227 0 -0x1.5p4 0x0.0p0 +REG epsg:32227 1 -0x1.ap4 -0x1.4p2 +REG epsg:32227 2 -0x1.0p4 -0x1.4p2 +REG epsg:32227 3 -0x1.ap4 0x1.4p2 +REG epsg:32227 4 -0x1.0p4 0x1.4p2 +REG epsg:32228 0 -0x1.ep3 0x0.0p0 +REG epsg:32228 1 -0x1.4p4 -0x1.4p2 +REG epsg:32228 2 -0x1.4p3 -0x1.4p2 +REG epsg:32228 3 -0x1.4p4 0x1.4p2 +REG epsg:32228 4 -0x1.4p3 0x1.4p2 +REG epsg:32229 0 -0x1.2p3 0x0.0p0 +REG epsg:32229 1 -0x1.cp3 -0x1.4p2 +REG epsg:32229 2 -0x1.0p2 -0x1.4p2 +REG epsg:32229 3 -0x1.cp3 0x1.4p2 +REG epsg:32229 4 -0x1.0p2 0x1.4p2 +REG epsg:3223 0 -0x1.38p6 -0x1.3d55555555556p6 +REG epsg:3223 1 -0x1.14p7 -0x1.64p6 +REG epsg:3223 2 -0x1.2p4 -0x1.64p6 +REG epsg:3223 3 -0x1.14p7 -0x1.0155555555556p6 +REG epsg:3223 4 -0x1.2p4 -0x1.0155555555556p6 +REG epsg:32230 0 -0x1.8p1 0x0.0p0 +REG epsg:32230 1 -0x1.0p3 -0x1.4p2 +REG epsg:32230 2 0x1.0p1 -0x1.4p2 +REG epsg:32230 3 -0x1.0p3 0x1.4p2 +REG epsg:32230 4 0x1.0p1 0x1.4p2 +REG epsg:32231 0 0x1.8p1 0x0.0p0 +REG epsg:32231 1 -0x1.0p1 -0x1.4p2 +REG epsg:32231 2 0x1.0p3 -0x1.4p2 +REG epsg:32231 3 -0x1.0p1 0x1.4p2 +REG epsg:32231 4 0x1.0p3 0x1.4p2 +REG epsg:32232 0 0x1.2p3 0x0.0p0 +REG epsg:32232 1 0x1.0p2 -0x1.4p2 +REG epsg:32232 2 0x1.cp3 -0x1.4p2 +REG epsg:32232 3 0x1.0p2 0x1.4p2 +REG epsg:32232 4 0x1.cp3 0x1.4p2 +REG epsg:32233 0 0x1.ep3 0x0.0p0 +REG epsg:32233 1 0x1.4p3 -0x1.4p2 +REG epsg:32233 2 0x1.4p4 -0x1.4p2 +REG epsg:32233 3 0x1.4p3 0x1.4p2 +REG epsg:32233 4 0x1.4p4 0x1.4p2 +REG epsg:32234 0 0x1.5p4 0x0.0p0 +REG epsg:32234 1 0x1.0p4 -0x1.4p2 +REG epsg:32234 2 0x1.ap4 -0x1.4p2 +REG epsg:32234 3 0x1.0p4 0x1.4p2 +REG epsg:32234 4 0x1.ap4 0x1.4p2 +REG epsg:32235 0 0x1.bp4 0x0.0p0 +REG epsg:32235 1 0x1.6p4 -0x1.4p2 +REG epsg:32235 2 0x1.0p5 -0x1.4p2 +REG epsg:32235 3 0x1.6p4 0x1.4p2 +REG epsg:32235 4 0x1.0p5 0x1.4p2 +REG epsg:32236 0 0x1.08p5 0x0.0p0 +REG epsg:32236 1 0x1.cp4 -0x1.4p2 +REG epsg:32236 2 0x1.3p5 -0x1.4p2 +REG epsg:32236 3 0x1.cp4 0x1.4p2 +REG epsg:32236 4 0x1.3p5 0x1.4p2 +REG epsg:32237 0 0x1.38p5 0x0.0p0 +REG epsg:32237 1 0x1.1p5 -0x1.4p2 +REG epsg:32237 2 0x1.6p5 -0x1.4p2 +REG epsg:32237 3 0x1.1p5 0x1.4p2 +REG epsg:32237 4 0x1.6p5 0x1.4p2 +REG epsg:32238 0 0x1.68p5 0x0.0p0 +REG epsg:32238 1 0x1.4p5 -0x1.4p2 +REG epsg:32238 2 0x1.9p5 -0x1.4p2 +REG epsg:32238 3 0x1.4p5 0x1.4p2 +REG epsg:32238 4 0x1.9p5 0x1.4p2 +REG epsg:32239 0 0x1.98p5 0x0.0p0 +REG epsg:32239 1 0x1.7p5 -0x1.4p2 +REG epsg:32239 2 0x1.cp5 -0x1.4p2 +REG epsg:32239 3 0x1.7p5 0x1.4p2 +REG epsg:32239 4 0x1.cp5 0x1.4p2 +REG epsg:3224 0 -0x1.08p6 -0x1.3d55555555556p6 +REG epsg:3224 1 -0x1.f8p6 -0x1.64p6 +REG epsg:3224 2 -0x1.8p2 -0x1.64p6 +REG epsg:3224 3 -0x1.f8p6 -0x1.0155555555556p6 +REG epsg:3224 4 -0x1.8p2 -0x1.0155555555556p6 +REG epsg:32240 0 0x1.c8p5 0x0.0p0 +REG epsg:32240 1 0x1.ap5 -0x1.4p2 +REG epsg:32240 2 0x1.fp5 -0x1.4p2 +REG epsg:32240 3 0x1.ap5 0x1.4p2 +REG epsg:32240 4 0x1.fp5 0x1.4p2 +REG epsg:32241 0 0x1.f8p5 0x0.0p0 +REG epsg:32241 1 0x1.dp5 -0x1.4p2 +REG epsg:32241 2 0x1.1p6 -0x1.4p2 +REG epsg:32241 3 0x1.dp5 0x1.4p2 +REG epsg:32241 4 0x1.1p6 0x1.4p2 +REG epsg:32242 0 0x1.14p6 0x0.0p0 +REG epsg:32242 1 0x1.0p6 -0x1.4p2 +REG epsg:32242 2 0x1.28p6 -0x1.4p2 +REG epsg:32242 3 0x1.0p6 0x1.4p2 +REG epsg:32242 4 0x1.28p6 0x1.4p2 +REG epsg:32243 0 0x1.2cp6 0x0.0p0 +REG epsg:32243 1 0x1.18p6 -0x1.4p2 +REG epsg:32243 2 0x1.4p6 -0x1.4p2 +REG epsg:32243 3 0x1.18p6 0x1.4p2 +REG epsg:32243 4 0x1.4p6 0x1.4p2 +REG epsg:32244 0 0x1.44p6 0x0.0p0 +REG epsg:32244 1 0x1.3p6 -0x1.4p2 +REG epsg:32244 2 0x1.58p6 -0x1.4p2 +REG epsg:32244 3 0x1.3p6 0x1.4p2 +REG epsg:32244 4 0x1.58p6 0x1.4p2 +REG epsg:32245 0 0x1.5cp6 0x0.0p0 +REG epsg:32245 1 0x1.48p6 -0x1.4p2 +REG epsg:32245 2 0x1.7p6 -0x1.4p2 +REG epsg:32245 3 0x1.48p6 0x1.4p2 +REG epsg:32245 4 0x1.7p6 0x1.4p2 +REG epsg:32246 0 0x1.74p6 0x0.0p0 +REG epsg:32246 1 0x1.6p6 -0x1.4p2 +REG epsg:32246 2 0x1.88p6 -0x1.4p2 +REG epsg:32246 3 0x1.6p6 0x1.4p2 +REG epsg:32246 4 0x1.88p6 0x1.4p2 +REG epsg:32247 0 0x1.8cp6 0x0.0p0 +REG epsg:32247 1 0x1.78p6 -0x1.4p2 +REG epsg:32247 2 0x1.ap6 -0x1.4p2 +REG epsg:32247 3 0x1.78p6 0x1.4p2 +REG epsg:32247 4 0x1.ap6 0x1.4p2 +REG epsg:32248 0 0x1.a4p6 0x0.0p0 +REG epsg:32248 1 0x1.9p6 -0x1.4p2 +REG epsg:32248 2 0x1.b8p6 -0x1.4p2 +REG epsg:32248 3 0x1.9p6 0x1.4p2 +REG epsg:32248 4 0x1.b8p6 0x1.4p2 +REG epsg:32249 0 0x1.bcp6 0x0.0p0 +REG epsg:32249 1 0x1.a8p6 -0x1.4p2 +REG epsg:32249 2 0x1.dp6 -0x1.4p2 +REG epsg:32249 3 0x1.a8p6 0x1.4p2 +REG epsg:32249 4 0x1.dp6 0x1.4p2 +REG epsg:3225 0 -0x1.2p4 -0x1.3d55555555556p6 +REG epsg:3225 1 -0x1.38p6 -0x1.64p6 +REG epsg:3225 2 0x1.5p5 -0x1.64p6 +REG epsg:3225 3 -0x1.38p6 -0x1.0155555555556p6 +REG epsg:3225 4 0x1.5p5 -0x1.0155555555556p6 +REG epsg:32250 0 0x1.d4p6 0x0.0p0 +REG epsg:32250 1 0x1.cp6 -0x1.4p2 +REG epsg:32250 2 0x1.e8p6 -0x1.4p2 +REG epsg:32250 3 0x1.cp6 0x1.4p2 +REG epsg:32250 4 0x1.e8p6 0x1.4p2 +REG epsg:32251 0 0x1.ecp6 0x0.0p0 +REG epsg:32251 1 0x1.d8p6 -0x1.4p2 +REG epsg:32251 2 0x1.0p7 -0x1.4p2 +REG epsg:32251 3 0x1.d8p6 0x1.4p2 +REG epsg:32251 4 0x1.0p7 0x1.4p2 +REG epsg:32252 0 0x1.02p7 0x0.0p0 +REG epsg:32252 1 0x1.fp6 -0x1.4p2 +REG epsg:32252 2 0x1.0cp7 -0x1.4p2 +REG epsg:32252 3 0x1.fp6 0x1.4p2 +REG epsg:32252 4 0x1.0cp7 0x1.4p2 +REG epsg:32253 0 0x1.0ep7 0x0.0p0 +REG epsg:32253 1 0x1.04p7 -0x1.4p2 +REG epsg:32253 2 0x1.18p7 -0x1.4p2 +REG epsg:32253 3 0x1.04p7 0x1.4p2 +REG epsg:32253 4 0x1.18p7 0x1.4p2 +REG epsg:32254 0 0x1.1ap7 0x0.0p0 +REG epsg:32254 1 0x1.1p7 -0x1.4p2 +REG epsg:32254 2 0x1.24p7 -0x1.4p2 +REG epsg:32254 3 0x1.1p7 0x1.4p2 +REG epsg:32254 4 0x1.24p7 0x1.4p2 +REG epsg:32255 0 0x1.26p7 0x0.0p0 +REG epsg:32255 1 0x1.1cp7 -0x1.4p2 +REG epsg:32255 2 0x1.3p7 -0x1.4p2 +REG epsg:32255 3 0x1.1cp7 0x1.4p2 +REG epsg:32255 4 0x1.3p7 0x1.4p2 +REG epsg:32256 0 0x1.32p7 0x0.0p0 +REG epsg:32256 1 0x1.28p7 -0x1.4p2 +REG epsg:32256 2 0x1.3cp7 -0x1.4p2 +REG epsg:32256 3 0x1.28p7 0x1.4p2 +REG epsg:32256 4 0x1.3cp7 0x1.4p2 +REG epsg:32257 0 0x1.3ep7 0x0.0p0 +REG epsg:32257 1 0x1.34p7 -0x1.4p2 +REG epsg:32257 2 0x1.48p7 -0x1.4p2 +REG epsg:32257 3 0x1.34p7 0x1.4p2 +REG epsg:32257 4 0x1.48p7 0x1.4p2 +REG epsg:32258 0 0x1.4ap7 0x0.0p0 +REG epsg:32258 1 0x1.4p7 -0x1.4p2 +REG epsg:32258 2 0x1.54p7 -0x1.4p2 +REG epsg:32258 3 0x1.4p7 0x1.4p2 +REG epsg:32258 4 0x1.54p7 0x1.4p2 +REG epsg:32259 0 0x1.56p7 0x0.0p0 +REG epsg:32259 1 0x1.4cp7 -0x1.4p2 +REG epsg:32259 2 0x1.6p7 -0x1.4p2 +REG epsg:32259 3 0x1.4cp7 0x1.4p2 +REG epsg:32259 4 0x1.6p7 0x1.4p2 +REG epsg:3226 0 -0x1.8p2 -0x1.3d55555555556p6 +REG epsg:3226 1 -0x1.08p6 -0x1.64p6 +REG epsg:3226 2 0x1.bp5 -0x1.64p6 +REG epsg:3226 3 -0x1.08p6 -0x1.0155555555556p6 +REG epsg:3226 4 0x1.bp5 -0x1.0155555555556p6 +REG epsg:32260 0 0x1.62p7 0x0.0p0 +REG epsg:32260 1 0x1.58p7 -0x1.4p2 +REG epsg:32260 2 -0x1.64p7 -0x1.4p2 +REG epsg:32260 3 0x1.58p7 0x1.4p2 +REG epsg:32260 4 -0x1.64p7 0x1.4p2 +REG epsg:3227 0 0x1.8p2 -0x1.3d55555555556p6 +REG epsg:3227 1 -0x1.bp5 -0x1.64p6 +REG epsg:3227 2 0x1.08p6 -0x1.64p6 +REG epsg:3227 3 -0x1.bp5 -0x1.0155555555556p6 +REG epsg:3227 4 0x1.08p6 -0x1.0155555555556p6 +REG epsg:3228 0 0x1.2p4 -0x1.3d55555555556p6 +REG epsg:3228 1 -0x1.5p5 -0x1.64p6 +REG epsg:3228 2 0x1.38p6 -0x1.64p6 +REG epsg:3228 3 -0x1.5p5 -0x1.0155555555556p6 +REG epsg:3228 4 0x1.38p6 -0x1.0155555555556p6 +REG epsg:3229 0 0x1.ep4 -0x1.3d55555555556p6 +REG epsg:3229 1 -0x1.ep4 -0x1.64p6 +REG epsg:3229 2 0x1.68p6 -0x1.64p6 +REG epsg:3229 3 -0x1.ep4 -0x1.0155555555556p6 +REG epsg:3229 4 0x1.68p6 -0x1.0155555555556p6 +REG epsg:3230 0 0x1.5p5 -0x1.3d55555555556p6 +REG epsg:3230 1 -0x1.2p4 -0x1.64p6 +REG epsg:3230 2 0x1.98p6 -0x1.64p6 +REG epsg:3230 3 -0x1.2p4 -0x1.0155555555556p6 +REG epsg:3230 4 0x1.98p6 -0x1.0155555555556p6 +REG epsg:32301 0 -0x1.62p7 -0x1.9p4 +REG epsg:32301 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:32301 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:32301 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:32301 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:32302 0 -0x1.56p7 -0x1.9p4 +REG epsg:32302 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:32302 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:32302 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:32302 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:32303 0 -0x1.4ap7 -0x1.9p4 +REG epsg:32303 1 -0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:32303 2 -0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:32303 3 -0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:32303 4 -0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:32304 0 -0x1.3ep7 -0x1.9p4 +REG epsg:32304 1 -0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:32304 2 -0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:32304 3 -0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:32304 4 -0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:32305 0 -0x1.32p7 -0x1.9p4 +REG epsg:32305 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32305 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:32305 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32305 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:32306 0 -0x1.26p7 -0x1.9p4 +REG epsg:32306 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:32306 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:32306 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:32306 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:32307 0 -0x1.1ap7 -0x1.9p4 +REG epsg:32307 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:32307 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:32307 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:32307 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:32308 0 -0x1.0ep7 -0x1.9p4 +REG epsg:32308 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:32308 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:32308 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:32308 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:32309 0 -0x1.02p7 -0x1.9p4 +REG epsg:32309 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32309 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32309 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32309 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:3231 0 0x1.bp5 -0x1.3d55555555556p6 +REG epsg:3231 1 -0x1.8p2 -0x1.64p6 +REG epsg:3231 2 0x1.c8p6 -0x1.64p6 +REG epsg:3231 3 -0x1.8p2 -0x1.0155555555556p6 +REG epsg:3231 4 0x1.c8p6 -0x1.0155555555556p6 +REG epsg:32310 0 -0x1.ecp6 -0x1.9p4 +REG epsg:32310 1 -0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:32310 2 -0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32310 3 -0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:32310 4 -0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32311 0 -0x1.d4p6 -0x1.9p4 +REG epsg:32311 1 -0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:32311 2 -0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32311 3 -0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:32311 4 -0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32312 0 -0x1.bcp6 -0x1.9p4 +REG epsg:32312 1 -0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:32312 2 -0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32312 3 -0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:32312 4 -0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32313 0 -0x1.a4p6 -0x1.9p4 +REG epsg:32313 1 -0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:32313 2 -0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32313 3 -0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:32313 4 -0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32314 0 -0x1.8cp6 -0x1.9p4 +REG epsg:32314 1 -0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:32314 2 -0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32314 3 -0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:32314 4 -0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32315 0 -0x1.74p6 -0x1.9p4 +REG epsg:32315 1 -0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:32315 2 -0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32315 3 -0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:32315 4 -0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32316 0 -0x1.5cp6 -0x1.9p4 +REG epsg:32316 1 -0x1.72114b818572ep6 -0x1.ep4 +REG epsg:32316 2 -0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32316 3 -0x1.72114b818572ep6 -0x1.4p4 +REG epsg:32316 4 -0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32317 0 -0x1.44p6 -0x1.9p4 +REG epsg:32317 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:32317 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32317 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:32317 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32318 0 -0x1.2cp6 -0x1.9p4 +REG epsg:32318 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:32318 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32318 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:32318 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32319 0 -0x1.14p6 -0x1.9p4 +REG epsg:32319 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:32319 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32319 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:32319 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:3232 0 0x1.08p6 -0x1.3d55555555556p6 +REG epsg:3232 1 0x1.8p2 -0x1.64p6 +REG epsg:3232 2 0x1.f8p6 -0x1.64p6 +REG epsg:3232 3 0x1.8p2 -0x1.0155555555556p6 +REG epsg:3232 4 0x1.f8p6 -0x1.0155555555556p6 +REG epsg:32320 0 -0x1.f8p5 -0x1.9p4 +REG epsg:32320 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:32320 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32320 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:32320 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32321 0 -0x1.c8p5 -0x1.9p4 +REG epsg:32321 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:32321 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32321 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:32321 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32322 0 -0x1.98p5 -0x1.9p4 +REG epsg:32322 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:32322 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32322 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:32322 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32323 0 -0x1.68p5 -0x1.9p4 +REG epsg:32323 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:32323 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32323 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:32323 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32324 0 -0x1.38p5 -0x1.9p4 +REG epsg:32324 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:32324 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32324 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:32324 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32325 0 -0x1.08p5 -0x1.9p4 +REG epsg:32325 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32325 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32325 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32325 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32326 0 -0x1.bp4 -0x1.9p4 +REG epsg:32326 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:32326 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:32326 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:32326 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:32327 0 -0x1.5p4 -0x1.9p4 +REG epsg:32327 1 -0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:32327 2 -0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:32327 3 -0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:32327 4 -0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:32328 0 -0x1.ep3 -0x1.9p4 +REG epsg:32328 1 -0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:32328 2 -0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:32328 3 -0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:32328 4 -0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:32329 0 -0x1.2p3 -0x1.9p4 +REG epsg:32329 1 -0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:32329 2 -0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:32329 3 -0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:32329 4 -0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:3233 0 0x1.38p6 -0x1.3d55555555556p6 +REG epsg:3233 1 0x1.2p4 -0x1.64p6 +REG epsg:3233 2 0x1.14p7 -0x1.64p6 +REG epsg:3233 3 0x1.2p4 -0x1.0155555555556p6 +REG epsg:3233 4 0x1.14p7 -0x1.0155555555556p6 +REG epsg:32330 0 -0x1.8p1 -0x1.9p4 +REG epsg:32330 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:32330 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:32330 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:32330 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:32331 0 0x1.8p1 -0x1.9p4 +REG epsg:32331 1 -0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:32331 2 0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:32331 3 -0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:32331 4 0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:32332 0 0x1.2p3 -0x1.9p4 +REG epsg:32332 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:32332 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:32332 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:32332 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:32333 0 0x1.ep3 -0x1.9p4 +REG epsg:32333 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:32333 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:32333 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:32333 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:32334 0 0x1.5p4 -0x1.9p4 +REG epsg:32334 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:32334 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:32334 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:32334 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:32335 0 0x1.bp4 -0x1.9p4 +REG epsg:32335 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:32335 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:32335 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:32335 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:32336 0 0x1.08p5 -0x1.9p4 +REG epsg:32336 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32336 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32336 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32336 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32337 0 0x1.38p5 -0x1.9p4 +REG epsg:32337 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32337 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:32337 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32337 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:32338 0 0x1.68p5 -0x1.9p4 +REG epsg:32338 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32338 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:32338 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32338 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:32339 0 0x1.98p5 -0x1.9p4 +REG epsg:32339 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32339 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:32339 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32339 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:3234 0 0x1.68p6 -0x1.3d55555555556p6 +REG epsg:3234 1 0x1.ep4 -0x1.64p6 +REG epsg:3234 2 0x1.2cp7 -0x1.64p6 +REG epsg:3234 3 0x1.ep4 -0x1.0155555555556p6 +REG epsg:3234 4 0x1.2cp7 -0x1.0155555555556p6 +REG epsg:32340 0 0x1.c8p5 -0x1.9p4 +REG epsg:32340 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32340 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:32340 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32340 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:32341 0 0x1.f8p5 -0x1.9p4 +REG epsg:32341 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32341 2 0x1.12114b818572ep6 -0x1.ep4 +REG epsg:32341 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32341 4 0x1.12114b818572ep6 -0x1.4p4 +REG epsg:32342 0 0x1.14p6 -0x1.9p4 +REG epsg:32342 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32342 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:32342 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32342 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:32343 0 0x1.2cp6 -0x1.9p4 +REG epsg:32343 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32343 2 0x1.42114b818572ep6 -0x1.ep4 +REG epsg:32343 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32343 4 0x1.42114b818572ep6 -0x1.4p4 +REG epsg:32344 0 0x1.44p6 -0x1.9p4 +REG epsg:32344 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32344 2 0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:32344 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32344 4 0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:32345 0 0x1.5cp6 -0x1.9p4 +REG epsg:32345 1 0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32345 2 0x1.72114b818572ep6 -0x1.ep4 +REG epsg:32345 3 0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32345 4 0x1.72114b818572ep6 -0x1.4p4 +REG epsg:32346 0 0x1.74p6 -0x1.9p4 +REG epsg:32346 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32346 2 0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:32346 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32346 4 0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:32347 0 0x1.8cp6 -0x1.9p4 +REG epsg:32347 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32347 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:32347 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32347 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:32348 0 0x1.a4p6 -0x1.9p4 +REG epsg:32348 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32348 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:32348 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32348 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:32349 0 0x1.bcp6 -0x1.9p4 +REG epsg:32349 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32349 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:32349 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32349 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:3235 0 0x1.98p6 -0x1.3d55555555556p6 +REG epsg:3235 1 0x1.5p5 -0x1.64p6 +REG epsg:3235 2 0x1.44p7 -0x1.64p6 +REG epsg:3235 3 0x1.5p5 -0x1.0155555555556p6 +REG epsg:3235 4 0x1.44p7 -0x1.0155555555556p6 +REG epsg:32350 0 0x1.d4p6 -0x1.9p4 +REG epsg:32350 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32350 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:32350 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32350 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:32351 0 0x1.ecp6 -0x1.9p4 +REG epsg:32351 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32351 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:32351 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32351 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:32352 0 0x1.02p7 -0x1.9p4 +REG epsg:32352 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32352 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32352 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32352 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32353 0 0x1.0ep7 -0x1.9p4 +REG epsg:32353 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:32353 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:32353 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:32353 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:32354 0 0x1.1ap7 -0x1.9p4 +REG epsg:32354 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:32354 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:32354 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:32354 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:32355 0 0x1.26p7 -0x1.9p4 +REG epsg:32355 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:32355 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:32355 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:32355 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:32356 0 0x1.32p7 -0x1.9p4 +REG epsg:32356 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:32356 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32356 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:32356 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32357 0 0x1.3ep7 -0x1.9p4 +REG epsg:32357 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:32357 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:32357 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:32357 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:32358 0 0x1.4ap7 -0x1.9p4 +REG epsg:32358 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:32358 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:32358 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:32358 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:32359 0 0x1.56p7 -0x1.9p4 +REG epsg:32359 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:32359 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:32359 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:32359 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:3236 0 0x1.c8p6 -0x1.3d55555555556p6 +REG epsg:3236 1 0x1.bp5 -0x1.64p6 +REG epsg:3236 2 0x1.5cp7 -0x1.64p6 +REG epsg:3236 3 0x1.bp5 -0x1.0155555555556p6 +REG epsg:3236 4 0x1.5cp7 -0x1.0155555555556p6 +REG epsg:32360 0 0x1.62p7 -0x1.9p4 +REG epsg:32360 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:32360 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:32360 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:32360 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:3237 0 0x1.f8p6 -0x1.3d55555555556p6 +REG epsg:3237 1 0x1.08p6 -0x1.64p6 +REG epsg:3237 2 -0x1.5cp7 -0x1.64p6 +REG epsg:3237 3 0x1.08p6 -0x1.0155555555556p6 +REG epsg:3237 4 -0x1.5cp7 -0x1.0155555555556p6 +REG epsg:3238 0 0x1.14p7 -0x1.3d55555555556p6 +REG epsg:3238 1 0x1.38p6 -0x1.64p6 +REG epsg:3238 2 -0x1.44p7 -0x1.64p6 +REG epsg:3238 3 0x1.38p6 -0x1.0155555555556p6 +REG epsg:3238 4 -0x1.44p7 -0x1.0155555555556p6 +REG epsg:3239 0 0x1.2cp7 -0x1.3d55555555556p6 +REG epsg:3239 1 0x1.68p6 -0x1.64p6 +REG epsg:3239 2 -0x1.2cp7 -0x1.64p6 +REG epsg:3239 3 0x1.68p6 -0x1.0155555555556p6 +REG epsg:3239 4 -0x1.2cp7 -0x1.0155555555556p6 +REG epsg:3240 0 0x1.44p7 -0x1.3d55555555556p6 +REG epsg:3240 1 0x1.98p6 -0x1.64p6 +REG epsg:3240 2 -0x1.14p7 -0x1.64p6 +REG epsg:3240 3 0x1.98p6 -0x1.0155555555556p6 +REG epsg:3240 4 -0x1.14p7 -0x1.0155555555556p6 +REG epsg:32401 0 -0x1.62p7 0x0.0p0 +REG epsg:32401 1 0x1.64p7 -0x1.4p2 +REG epsg:32401 2 -0x1.58p7 -0x1.4p2 +REG epsg:32401 3 0x1.64p7 0x1.4p2 +REG epsg:32401 4 -0x1.58p7 0x1.4p2 +REG epsg:32402 0 -0x1.56p7 0x0.0p0 +REG epsg:32402 1 -0x1.6p7 -0x1.4p2 +REG epsg:32402 2 -0x1.4cp7 -0x1.4p2 +REG epsg:32402 3 -0x1.6p7 0x1.4p2 +REG epsg:32402 4 -0x1.4cp7 0x1.4p2 +REG epsg:32403 0 -0x1.4ap7 0x0.0p0 +REG epsg:32403 1 -0x1.54p7 -0x1.4p2 +REG epsg:32403 2 -0x1.4p7 -0x1.4p2 +REG epsg:32403 3 -0x1.54p7 0x1.4p2 +REG epsg:32403 4 -0x1.4p7 0x1.4p2 +REG epsg:32404 0 -0x1.3ep7 0x0.0p0 +REG epsg:32404 1 -0x1.48p7 -0x1.4p2 +REG epsg:32404 2 -0x1.34p7 -0x1.4p2 +REG epsg:32404 3 -0x1.48p7 0x1.4p2 +REG epsg:32404 4 -0x1.34p7 0x1.4p2 +REG epsg:32405 0 -0x1.32p7 0x0.0p0 +REG epsg:32405 1 -0x1.3cp7 -0x1.4p2 +REG epsg:32405 2 -0x1.28p7 -0x1.4p2 +REG epsg:32405 3 -0x1.3cp7 0x1.4p2 +REG epsg:32405 4 -0x1.28p7 0x1.4p2 +REG epsg:32406 0 -0x1.26p7 0x0.0p0 +REG epsg:32406 1 -0x1.3p7 -0x1.4p2 +REG epsg:32406 2 -0x1.1cp7 -0x1.4p2 +REG epsg:32406 3 -0x1.3p7 0x1.4p2 +REG epsg:32406 4 -0x1.1cp7 0x1.4p2 +REG epsg:32407 0 -0x1.1ap7 0x0.0p0 +REG epsg:32407 1 -0x1.24p7 -0x1.4p2 +REG epsg:32407 2 -0x1.1p7 -0x1.4p2 +REG epsg:32407 3 -0x1.24p7 0x1.4p2 +REG epsg:32407 4 -0x1.1p7 0x1.4p2 +REG epsg:32408 0 -0x1.0ep7 0x0.0p0 +REG epsg:32408 1 -0x1.18p7 -0x1.4p2 +REG epsg:32408 2 -0x1.04p7 -0x1.4p2 +REG epsg:32408 3 -0x1.18p7 0x1.4p2 +REG epsg:32408 4 -0x1.04p7 0x1.4p2 +REG epsg:32409 0 -0x1.02p7 0x0.0p0 +REG epsg:32409 1 -0x1.0cp7 -0x1.4p2 +REG epsg:32409 2 -0x1.fp6 -0x1.4p2 +REG epsg:32409 3 -0x1.0cp7 0x1.4p2 +REG epsg:32409 4 -0x1.fp6 0x1.4p2 +REG epsg:3241 0 0x1.5cp7 -0x1.3d55555555556p6 +REG epsg:3241 1 0x1.c8p6 -0x1.64p6 +REG epsg:3241 2 -0x1.f8p6 -0x1.64p6 +REG epsg:3241 3 0x1.c8p6 -0x1.0155555555556p6 +REG epsg:3241 4 -0x1.f8p6 -0x1.0155555555556p6 +REG epsg:32410 0 -0x1.ecp6 0x0.0p0 +REG epsg:32410 1 -0x1.0p7 -0x1.4p2 +REG epsg:32410 2 -0x1.d8p6 -0x1.4p2 +REG epsg:32410 3 -0x1.0p7 0x1.4p2 +REG epsg:32410 4 -0x1.d8p6 0x1.4p2 +REG epsg:32411 0 -0x1.d4p6 0x0.0p0 +REG epsg:32411 1 -0x1.e8p6 -0x1.4p2 +REG epsg:32411 2 -0x1.cp6 -0x1.4p2 +REG epsg:32411 3 -0x1.e8p6 0x1.4p2 +REG epsg:32411 4 -0x1.cp6 0x1.4p2 +REG epsg:32412 0 -0x1.bcp6 0x0.0p0 +REG epsg:32412 1 -0x1.dp6 -0x1.4p2 +REG epsg:32412 2 -0x1.a8p6 -0x1.4p2 +REG epsg:32412 3 -0x1.dp6 0x1.4p2 +REG epsg:32412 4 -0x1.a8p6 0x1.4p2 +REG epsg:32413 0 -0x1.a4p6 0x0.0p0 +REG epsg:32413 1 -0x1.b8p6 -0x1.4p2 +REG epsg:32413 2 -0x1.9p6 -0x1.4p2 +REG epsg:32413 3 -0x1.b8p6 0x1.4p2 +REG epsg:32413 4 -0x1.9p6 0x1.4p2 +REG epsg:32414 0 -0x1.8cp6 0x0.0p0 +REG epsg:32414 1 -0x1.ap6 -0x1.4p2 +REG epsg:32414 2 -0x1.78p6 -0x1.4p2 +REG epsg:32414 3 -0x1.ap6 0x1.4p2 +REG epsg:32414 4 -0x1.78p6 0x1.4p2 +REG epsg:32415 0 -0x1.74p6 0x0.0p0 +REG epsg:32415 1 -0x1.88p6 -0x1.4p2 +REG epsg:32415 2 -0x1.6p6 -0x1.4p2 +REG epsg:32415 3 -0x1.88p6 0x1.4p2 +REG epsg:32415 4 -0x1.6p6 0x1.4p2 +REG epsg:32416 0 -0x1.5cp6 0x0.0p0 +REG epsg:32416 1 -0x1.7p6 -0x1.4p2 +REG epsg:32416 2 -0x1.48p6 -0x1.4p2 +REG epsg:32416 3 -0x1.7p6 0x1.4p2 +REG epsg:32416 4 -0x1.48p6 0x1.4p2 +REG epsg:32417 0 -0x1.44p6 0x0.0p0 +REG epsg:32417 1 -0x1.58p6 -0x1.4p2 +REG epsg:32417 2 -0x1.3p6 -0x1.4p2 +REG epsg:32417 3 -0x1.58p6 0x1.4p2 +REG epsg:32417 4 -0x1.3p6 0x1.4p2 +REG epsg:32418 0 -0x1.2cp6 0x0.0p0 +REG epsg:32418 1 -0x1.4p6 -0x1.4p2 +REG epsg:32418 2 -0x1.18p6 -0x1.4p2 +REG epsg:32418 3 -0x1.4p6 0x1.4p2 +REG epsg:32418 4 -0x1.18p6 0x1.4p2 +REG epsg:32419 0 -0x1.14p6 0x0.0p0 +REG epsg:32419 1 -0x1.28p6 -0x1.4p2 +REG epsg:32419 2 -0x1.0p6 -0x1.4p2 +REG epsg:32419 3 -0x1.28p6 0x1.4p2 +REG epsg:32419 4 -0x1.0p6 0x1.4p2 +REG epsg:3242 0 -0x1.32p7 -0x1.4555555555556p6 +REG epsg:3242 1 0x1.26p7 -0x1.64p6 +REG epsg:3242 2 -0x1.74p6 -0x1.64p6 +REG epsg:3242 3 0x1.26p7 -0x1.0955555555556p6 +REG epsg:3242 4 -0x1.74p6 -0x1.0955555555556p6 +REG epsg:32420 0 -0x1.f8p5 0x0.0p0 +REG epsg:32420 1 -0x1.1p6 -0x1.4p2 +REG epsg:32420 2 -0x1.dp5 -0x1.4p2 +REG epsg:32420 3 -0x1.1p6 0x1.4p2 +REG epsg:32420 4 -0x1.dp5 0x1.4p2 +REG epsg:32421 0 -0x1.c8p5 0x0.0p0 +REG epsg:32421 1 -0x1.fp5 -0x1.4p2 +REG epsg:32421 2 -0x1.ap5 -0x1.4p2 +REG epsg:32421 3 -0x1.fp5 0x1.4p2 +REG epsg:32421 4 -0x1.ap5 0x1.4p2 +REG epsg:32422 0 -0x1.98p5 0x0.0p0 +REG epsg:32422 1 -0x1.cp5 -0x1.4p2 +REG epsg:32422 2 -0x1.7p5 -0x1.4p2 +REG epsg:32422 3 -0x1.cp5 0x1.4p2 +REG epsg:32422 4 -0x1.7p5 0x1.4p2 +REG epsg:32423 0 -0x1.68p5 0x0.0p0 +REG epsg:32423 1 -0x1.9p5 -0x1.4p2 +REG epsg:32423 2 -0x1.4p5 -0x1.4p2 +REG epsg:32423 3 -0x1.9p5 0x1.4p2 +REG epsg:32423 4 -0x1.4p5 0x1.4p2 +REG epsg:32424 0 -0x1.38p5 0x0.0p0 +REG epsg:32424 1 -0x1.6p5 -0x1.4p2 +REG epsg:32424 2 -0x1.1p5 -0x1.4p2 +REG epsg:32424 3 -0x1.6p5 0x1.4p2 +REG epsg:32424 4 -0x1.1p5 0x1.4p2 +REG epsg:32425 0 -0x1.08p5 0x0.0p0 +REG epsg:32425 1 -0x1.3p5 -0x1.4p2 +REG epsg:32425 2 -0x1.cp4 -0x1.4p2 +REG epsg:32425 3 -0x1.3p5 0x1.4p2 +REG epsg:32425 4 -0x1.cp4 0x1.4p2 +REG epsg:32426 0 -0x1.bp4 0x0.0p0 +REG epsg:32426 1 -0x1.0p5 -0x1.4p2 +REG epsg:32426 2 -0x1.6p4 -0x1.4p2 +REG epsg:32426 3 -0x1.0p5 0x1.4p2 +REG epsg:32426 4 -0x1.6p4 0x1.4p2 +REG epsg:32427 0 -0x1.5p4 0x0.0p0 +REG epsg:32427 1 -0x1.ap4 -0x1.4p2 +REG epsg:32427 2 -0x1.0p4 -0x1.4p2 +REG epsg:32427 3 -0x1.ap4 0x1.4p2 +REG epsg:32427 4 -0x1.0p4 0x1.4p2 +REG epsg:32428 0 -0x1.ep3 0x0.0p0 +REG epsg:32428 1 -0x1.4p4 -0x1.4p2 +REG epsg:32428 2 -0x1.4p3 -0x1.4p2 +REG epsg:32428 3 -0x1.4p4 0x1.4p2 +REG epsg:32428 4 -0x1.4p3 0x1.4p2 +REG epsg:32429 0 -0x1.2p3 0x0.0p0 +REG epsg:32429 1 -0x1.cp3 -0x1.4p2 +REG epsg:32429 2 -0x1.0p2 -0x1.4p2 +REG epsg:32429 3 -0x1.cp3 0x1.4p2 +REG epsg:32429 4 -0x1.0p2 0x1.4p2 +REG epsg:3243 0 -0x1.0ep7 -0x1.4555555555556p6 +REG epsg:3243 1 0x1.4ap7 -0x1.64p6 +REG epsg:3243 2 -0x1.2cp6 -0x1.64p6 +REG epsg:3243 3 0x1.4ap7 -0x1.0955555555556p6 +REG epsg:3243 4 -0x1.2cp6 -0x1.0955555555556p6 +REG epsg:32430 0 -0x1.8p1 0x0.0p0 +REG epsg:32430 1 -0x1.0p3 -0x1.4p2 +REG epsg:32430 2 0x1.0p1 -0x1.4p2 +REG epsg:32430 3 -0x1.0p3 0x1.4p2 +REG epsg:32430 4 0x1.0p1 0x1.4p2 +REG epsg:32431 0 0x1.8p1 0x0.0p0 +REG epsg:32431 1 -0x1.0p1 -0x1.4p2 +REG epsg:32431 2 0x1.0p3 -0x1.4p2 +REG epsg:32431 3 -0x1.0p1 0x1.4p2 +REG epsg:32431 4 0x1.0p3 0x1.4p2 +REG epsg:32432 0 0x1.2p3 0x0.0p0 +REG epsg:32432 1 0x1.0p2 -0x1.4p2 +REG epsg:32432 2 0x1.cp3 -0x1.4p2 +REG epsg:32432 3 0x1.0p2 0x1.4p2 +REG epsg:32432 4 0x1.cp3 0x1.4p2 +REG epsg:32433 0 0x1.ep3 0x0.0p0 +REG epsg:32433 1 0x1.4p3 -0x1.4p2 +REG epsg:32433 2 0x1.4p4 -0x1.4p2 +REG epsg:32433 3 0x1.4p3 0x1.4p2 +REG epsg:32433 4 0x1.4p4 0x1.4p2 +REG epsg:32434 0 0x1.5p4 0x0.0p0 +REG epsg:32434 1 0x1.0p4 -0x1.4p2 +REG epsg:32434 2 0x1.ap4 -0x1.4p2 +REG epsg:32434 3 0x1.0p4 0x1.4p2 +REG epsg:32434 4 0x1.ap4 0x1.4p2 +REG epsg:32435 0 0x1.bp4 0x0.0p0 +REG epsg:32435 1 0x1.6p4 -0x1.4p2 +REG epsg:32435 2 0x1.0p5 -0x1.4p2 +REG epsg:32435 3 0x1.6p4 0x1.4p2 +REG epsg:32435 4 0x1.0p5 0x1.4p2 +REG epsg:32436 0 0x1.08p5 0x0.0p0 +REG epsg:32436 1 0x1.cp4 -0x1.4p2 +REG epsg:32436 2 0x1.3p5 -0x1.4p2 +REG epsg:32436 3 0x1.cp4 0x1.4p2 +REG epsg:32436 4 0x1.3p5 0x1.4p2 +REG epsg:32437 0 0x1.38p5 0x0.0p0 +REG epsg:32437 1 0x1.1p5 -0x1.4p2 +REG epsg:32437 2 0x1.6p5 -0x1.4p2 +REG epsg:32437 3 0x1.1p5 0x1.4p2 +REG epsg:32437 4 0x1.6p5 0x1.4p2 +REG epsg:32438 0 0x1.68p5 0x0.0p0 +REG epsg:32438 1 0x1.4p5 -0x1.4p2 +REG epsg:32438 2 0x1.9p5 -0x1.4p2 +REG epsg:32438 3 0x1.4p5 0x1.4p2 +REG epsg:32438 4 0x1.9p5 0x1.4p2 +REG epsg:32439 0 0x1.98p5 0x0.0p0 +REG epsg:32439 1 0x1.7p5 -0x1.4p2 +REG epsg:32439 2 0x1.cp5 -0x1.4p2 +REG epsg:32439 3 0x1.7p5 0x1.4p2 +REG epsg:32439 4 0x1.cp5 0x1.4p2 +REG epsg:3244 0 -0x1.d4p6 -0x1.4555555555556p6 +REG epsg:3244 1 -0x1.62p7 -0x1.64p6 +REG epsg:3244 2 -0x1.c8p5 -0x1.64p6 +REG epsg:3244 3 -0x1.62p7 -0x1.0955555555556p6 +REG epsg:3244 4 -0x1.c8p5 -0x1.0955555555556p6 +REG epsg:32440 0 0x1.c8p5 0x0.0p0 +REG epsg:32440 1 0x1.ap5 -0x1.4p2 +REG epsg:32440 2 0x1.fp5 -0x1.4p2 +REG epsg:32440 3 0x1.ap5 0x1.4p2 +REG epsg:32440 4 0x1.fp5 0x1.4p2 +REG epsg:32441 0 0x1.f8p5 0x0.0p0 +REG epsg:32441 1 0x1.dp5 -0x1.4p2 +REG epsg:32441 2 0x1.1p6 -0x1.4p2 +REG epsg:32441 3 0x1.dp5 0x1.4p2 +REG epsg:32441 4 0x1.1p6 0x1.4p2 +REG epsg:32442 0 0x1.14p6 0x0.0p0 +REG epsg:32442 1 0x1.0p6 -0x1.4p2 +REG epsg:32442 2 0x1.28p6 -0x1.4p2 +REG epsg:32442 3 0x1.0p6 0x1.4p2 +REG epsg:32442 4 0x1.28p6 0x1.4p2 +REG epsg:32443 0 0x1.2cp6 0x0.0p0 +REG epsg:32443 1 0x1.18p6 -0x1.4p2 +REG epsg:32443 2 0x1.4p6 -0x1.4p2 +REG epsg:32443 3 0x1.18p6 0x1.4p2 +REG epsg:32443 4 0x1.4p6 0x1.4p2 +REG epsg:32444 0 0x1.44p6 0x0.0p0 +REG epsg:32444 1 0x1.3p6 -0x1.4p2 +REG epsg:32444 2 0x1.58p6 -0x1.4p2 +REG epsg:32444 3 0x1.3p6 0x1.4p2 +REG epsg:32444 4 0x1.58p6 0x1.4p2 +REG epsg:32445 0 0x1.5cp6 0x0.0p0 +REG epsg:32445 1 0x1.48p6 -0x1.4p2 +REG epsg:32445 2 0x1.7p6 -0x1.4p2 +REG epsg:32445 3 0x1.48p6 0x1.4p2 +REG epsg:32445 4 0x1.7p6 0x1.4p2 +REG epsg:32446 0 0x1.74p6 0x0.0p0 +REG epsg:32446 1 0x1.6p6 -0x1.4p2 +REG epsg:32446 2 0x1.88p6 -0x1.4p2 +REG epsg:32446 3 0x1.6p6 0x1.4p2 +REG epsg:32446 4 0x1.88p6 0x1.4p2 +REG epsg:32447 0 0x1.8cp6 0x0.0p0 +REG epsg:32447 1 0x1.78p6 -0x1.4p2 +REG epsg:32447 2 0x1.ap6 -0x1.4p2 +REG epsg:32447 3 0x1.78p6 0x1.4p2 +REG epsg:32447 4 0x1.ap6 0x1.4p2 +REG epsg:32448 0 0x1.a4p6 0x0.0p0 +REG epsg:32448 1 0x1.9p6 -0x1.4p2 +REG epsg:32448 2 0x1.b8p6 -0x1.4p2 +REG epsg:32448 3 0x1.9p6 0x1.4p2 +REG epsg:32448 4 0x1.b8p6 0x1.4p2 +REG epsg:32449 0 0x1.bcp6 0x0.0p0 +REG epsg:32449 1 0x1.a8p6 -0x1.4p2 +REG epsg:32449 2 0x1.dp6 -0x1.4p2 +REG epsg:32449 3 0x1.a8p6 0x1.4p2 +REG epsg:32449 4 0x1.dp6 0x1.4p2 +REG epsg:3245 0 -0x1.8cp6 -0x1.4555555555556p6 +REG epsg:3245 1 -0x1.3ep7 -0x1.64p6 +REG epsg:3245 2 -0x1.38p5 -0x1.64p6 +REG epsg:3245 3 -0x1.3ep7 -0x1.0955555555556p6 +REG epsg:3245 4 -0x1.38p5 -0x1.0955555555556p6 +REG epsg:32450 0 0x1.d4p6 0x0.0p0 +REG epsg:32450 1 0x1.cp6 -0x1.4p2 +REG epsg:32450 2 0x1.e8p6 -0x1.4p2 +REG epsg:32450 3 0x1.cp6 0x1.4p2 +REG epsg:32450 4 0x1.e8p6 0x1.4p2 +REG epsg:32451 0 0x1.ecp6 0x0.0p0 +REG epsg:32451 1 0x1.d8p6 -0x1.4p2 +REG epsg:32451 2 0x1.0p7 -0x1.4p2 +REG epsg:32451 3 0x1.d8p6 0x1.4p2 +REG epsg:32451 4 0x1.0p7 0x1.4p2 +REG epsg:32452 0 0x1.02p7 0x0.0p0 +REG epsg:32452 1 0x1.fp6 -0x1.4p2 +REG epsg:32452 2 0x1.0cp7 -0x1.4p2 +REG epsg:32452 3 0x1.fp6 0x1.4p2 +REG epsg:32452 4 0x1.0cp7 0x1.4p2 +REG epsg:32453 0 0x1.0ep7 0x0.0p0 +REG epsg:32453 1 0x1.04p7 -0x1.4p2 +REG epsg:32453 2 0x1.18p7 -0x1.4p2 +REG epsg:32453 3 0x1.04p7 0x1.4p2 +REG epsg:32453 4 0x1.18p7 0x1.4p2 +REG epsg:32454 0 0x1.1ap7 0x0.0p0 +REG epsg:32454 1 0x1.1p7 -0x1.4p2 +REG epsg:32454 2 0x1.24p7 -0x1.4p2 +REG epsg:32454 3 0x1.1p7 0x1.4p2 +REG epsg:32454 4 0x1.24p7 0x1.4p2 +REG epsg:32455 0 0x1.26p7 0x0.0p0 +REG epsg:32455 1 0x1.1cp7 -0x1.4p2 +REG epsg:32455 2 0x1.3p7 -0x1.4p2 +REG epsg:32455 3 0x1.1cp7 0x1.4p2 +REG epsg:32455 4 0x1.3p7 0x1.4p2 +REG epsg:32456 0 0x1.32p7 0x0.0p0 +REG epsg:32456 1 0x1.28p7 -0x1.4p2 +REG epsg:32456 2 0x1.3cp7 -0x1.4p2 +REG epsg:32456 3 0x1.28p7 0x1.4p2 +REG epsg:32456 4 0x1.3cp7 0x1.4p2 +REG epsg:32457 0 0x1.3ep7 0x0.0p0 +REG epsg:32457 1 0x1.34p7 -0x1.4p2 +REG epsg:32457 2 0x1.48p7 -0x1.4p2 +REG epsg:32457 3 0x1.34p7 0x1.4p2 +REG epsg:32457 4 0x1.48p7 0x1.4p2 +REG epsg:32458 0 0x1.4ap7 0x0.0p0 +REG epsg:32458 1 0x1.4p7 -0x1.4p2 +REG epsg:32458 2 0x1.54p7 -0x1.4p2 +REG epsg:32458 3 0x1.4p7 0x1.4p2 +REG epsg:32458 4 0x1.54p7 0x1.4p2 +REG epsg:32459 0 0x1.56p7 0x0.0p0 +REG epsg:32459 1 0x1.4cp7 -0x1.4p2 +REG epsg:32459 2 0x1.6p7 -0x1.4p2 +REG epsg:32459 3 0x1.4cp7 0x1.4p2 +REG epsg:32459 4 0x1.6p7 0x1.4p2 +REG epsg:3246 0 -0x1.44p6 -0x1.4555555555556p6 +REG epsg:3246 1 -0x1.1ap7 -0x1.64p6 +REG epsg:3246 2 -0x1.5p4 -0x1.64p6 +REG epsg:3246 3 -0x1.1ap7 -0x1.0955555555556p6 +REG epsg:3246 4 -0x1.5p4 -0x1.0955555555556p6 +REG epsg:32460 0 0x1.62p7 0x0.0p0 +REG epsg:32460 1 0x1.58p7 -0x1.4p2 +REG epsg:32460 2 -0x1.64p7 -0x1.4p2 +REG epsg:32460 3 0x1.58p7 0x1.4p2 +REG epsg:32460 4 -0x1.64p7 0x1.4p2 +REG epsg:3247 0 -0x1.f8p5 -0x1.4555555555556p6 +REG epsg:3247 1 -0x1.ecp6 -0x1.64p6 +REG epsg:3247 2 -0x1.8p1 -0x1.64p6 +REG epsg:3247 3 -0x1.ecp6 -0x1.0955555555556p6 +REG epsg:3247 4 -0x1.8p1 -0x1.0955555555556p6 +REG epsg:3248 0 -0x1.bp4 -0x1.4555555555556p6 +REG epsg:3248 1 -0x1.5cp6 -0x1.64p6 +REG epsg:3248 2 0x1.08p5 -0x1.64p6 +REG epsg:3248 3 -0x1.5cp6 -0x1.0955555555556p6 +REG epsg:3248 4 0x1.08p5 -0x1.0955555555556p6 +REG epsg:3249 0 -0x1.2p3 -0x1.4555555555556p6 +REG epsg:3249 1 -0x1.14p6 -0x1.64p6 +REG epsg:3249 2 0x1.98p5 -0x1.64p6 +REG epsg:3249 3 -0x1.14p6 -0x1.0955555555556p6 +REG epsg:3249 4 0x1.98p5 -0x1.0955555555556p6 +REG epsg:3250 0 0x1.2p3 -0x1.4555555555556p6 +REG epsg:3250 1 -0x1.98p5 -0x1.64p6 +REG epsg:3250 2 0x1.14p6 -0x1.64p6 +REG epsg:3250 3 -0x1.98p5 -0x1.0955555555556p6 +REG epsg:3250 4 0x1.14p6 -0x1.0955555555556p6 +REG epsg:32501 0 -0x1.62p7 -0x1.9p4 +REG epsg:32501 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:32501 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:32501 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:32501 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:32502 0 -0x1.56p7 -0x1.9p4 +REG epsg:32502 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:32502 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:32502 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:32502 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:32503 0 -0x1.4ap7 -0x1.9p4 +REG epsg:32503 1 -0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:32503 2 -0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:32503 3 -0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:32503 4 -0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:32504 0 -0x1.3ep7 -0x1.9p4 +REG epsg:32504 1 -0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:32504 2 -0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:32504 3 -0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:32504 4 -0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:32505 0 -0x1.32p7 -0x1.9p4 +REG epsg:32505 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32505 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:32505 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32505 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:32506 0 -0x1.26p7 -0x1.9p4 +REG epsg:32506 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:32506 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:32506 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:32506 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:32507 0 -0x1.1ap7 -0x1.9p4 +REG epsg:32507 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:32507 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:32507 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:32507 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:32508 0 -0x1.0ep7 -0x1.9p4 +REG epsg:32508 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:32508 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:32508 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:32508 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:32509 0 -0x1.02p7 -0x1.9p4 +REG epsg:32509 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32509 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32509 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32509 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:3251 0 0x1.bp4 -0x1.4555555555556p6 +REG epsg:3251 1 -0x1.08p5 -0x1.64p6 +REG epsg:3251 2 0x1.5cp6 -0x1.64p6 +REG epsg:3251 3 -0x1.08p5 -0x1.0955555555556p6 +REG epsg:3251 4 0x1.5cp6 -0x1.0955555555556p6 +REG epsg:32510 0 -0x1.ecp6 -0x1.9p4 +REG epsg:32510 1 -0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:32510 2 -0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32510 3 -0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:32510 4 -0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32511 0 -0x1.d4p6 -0x1.9p4 +REG epsg:32511 1 -0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:32511 2 -0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32511 3 -0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:32511 4 -0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32512 0 -0x1.bcp6 -0x1.9p4 +REG epsg:32512 1 -0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:32512 2 -0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32512 3 -0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:32512 4 -0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32513 0 -0x1.a4p6 -0x1.9p4 +REG epsg:32513 1 -0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:32513 2 -0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32513 3 -0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:32513 4 -0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32514 0 -0x1.8cp6 -0x1.9p4 +REG epsg:32514 1 -0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:32514 2 -0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32514 3 -0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:32514 4 -0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32515 0 -0x1.74p6 -0x1.9p4 +REG epsg:32515 1 -0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:32515 2 -0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32515 3 -0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:32515 4 -0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32516 0 -0x1.5cp6 -0x1.9p4 +REG epsg:32516 1 -0x1.72114b818572ep6 -0x1.ep4 +REG epsg:32516 2 -0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32516 3 -0x1.72114b818572ep6 -0x1.4p4 +REG epsg:32516 4 -0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32517 0 -0x1.44p6 -0x1.9p4 +REG epsg:32517 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:32517 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32517 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:32517 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32518 0 -0x1.2cp6 -0x1.9p4 +REG epsg:32518 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:32518 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32518 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:32518 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32519 0 -0x1.14p6 -0x1.9p4 +REG epsg:32519 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:32519 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32519 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:32519 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:3252 0 0x1.68p5 -0x1.4555555555556p6 +REG epsg:3252 1 -0x1.ep3 -0x1.64p6 +REG epsg:3252 2 0x1.a4p6 -0x1.64p6 +REG epsg:3252 3 -0x1.ep3 -0x1.0955555555556p6 +REG epsg:3252 4 0x1.a4p6 -0x1.0955555555556p6 +REG epsg:32520 0 -0x1.f8p5 -0x1.9p4 +REG epsg:32520 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:32520 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32520 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:32520 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32521 0 -0x1.c8p5 -0x1.9p4 +REG epsg:32521 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:32521 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32521 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:32521 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32522 0 -0x1.98p5 -0x1.9p4 +REG epsg:32522 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:32522 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32522 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:32522 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32523 0 -0x1.68p5 -0x1.9p4 +REG epsg:32523 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:32523 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32523 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:32523 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32524 0 -0x1.38p5 -0x1.9p4 +REG epsg:32524 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:32524 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32524 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:32524 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32525 0 -0x1.08p5 -0x1.9p4 +REG epsg:32525 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32525 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32525 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32525 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32526 0 -0x1.bp4 -0x1.9p4 +REG epsg:32526 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:32526 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:32526 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:32526 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:32527 0 -0x1.5p4 -0x1.9p4 +REG epsg:32527 1 -0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:32527 2 -0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:32527 3 -0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:32527 4 -0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:32528 0 -0x1.ep3 -0x1.9p4 +REG epsg:32528 1 -0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:32528 2 -0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:32528 3 -0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:32528 4 -0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:32529 0 -0x1.2p3 -0x1.9p4 +REG epsg:32529 1 -0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:32529 2 -0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:32529 3 -0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:32529 4 -0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:3253 0 0x1.f8p5 -0x1.4555555555556p6 +REG epsg:3253 1 0x1.8p1 -0x1.64p6 +REG epsg:3253 2 0x1.ecp6 -0x1.64p6 +REG epsg:3253 3 0x1.8p1 -0x1.0955555555556p6 +REG epsg:3253 4 0x1.ecp6 -0x1.0955555555556p6 +REG epsg:32530 0 -0x1.8p1 -0x1.9p4 +REG epsg:32530 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:32530 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:32530 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:32530 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:32531 0 0x1.8p1 -0x1.9p4 +REG epsg:32531 1 -0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:32531 2 0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:32531 3 -0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:32531 4 0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:32532 0 0x1.2p3 -0x1.9p4 +REG epsg:32532 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:32532 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:32532 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:32532 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:32533 0 0x1.ep3 -0x1.9p4 +REG epsg:32533 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:32533 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:32533 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:32533 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:32534 0 0x1.5p4 -0x1.9p4 +REG epsg:32534 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:32534 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:32534 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:32534 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:32535 0 0x1.bp4 -0x1.9p4 +REG epsg:32535 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:32535 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:32535 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:32535 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:32536 0 0x1.08p5 -0x1.9p4 +REG epsg:32536 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32536 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32536 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32536 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32537 0 0x1.38p5 -0x1.9p4 +REG epsg:32537 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32537 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:32537 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32537 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:32538 0 0x1.68p5 -0x1.9p4 +REG epsg:32538 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32538 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:32538 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32538 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:32539 0 0x1.98p5 -0x1.9p4 +REG epsg:32539 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32539 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:32539 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32539 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:3254 0 0x1.44p6 -0x1.4555555555556p6 +REG epsg:3254 1 0x1.5p4 -0x1.64p6 +REG epsg:3254 2 0x1.1ap7 -0x1.64p6 +REG epsg:3254 3 0x1.5p4 -0x1.0955555555556p6 +REG epsg:3254 4 0x1.1ap7 -0x1.0955555555556p6 +REG epsg:32540 0 0x1.c8p5 -0x1.9p4 +REG epsg:32540 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32540 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:32540 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32540 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:32541 0 0x1.f8p5 -0x1.9p4 +REG epsg:32541 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32541 2 0x1.12114b818572ep6 -0x1.ep4 +REG epsg:32541 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32541 4 0x1.12114b818572ep6 -0x1.4p4 +REG epsg:32542 0 0x1.14p6 -0x1.9p4 +REG epsg:32542 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32542 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:32542 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32542 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:32543 0 0x1.2cp6 -0x1.9p4 +REG epsg:32543 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32543 2 0x1.42114b818572ep6 -0x1.ep4 +REG epsg:32543 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32543 4 0x1.42114b818572ep6 -0x1.4p4 +REG epsg:32544 0 0x1.44p6 -0x1.9p4 +REG epsg:32544 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32544 2 0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:32544 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32544 4 0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:32545 0 0x1.5cp6 -0x1.9p4 +REG epsg:32545 1 0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32545 2 0x1.72114b818572ep6 -0x1.ep4 +REG epsg:32545 3 0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32545 4 0x1.72114b818572ep6 -0x1.4p4 +REG epsg:32546 0 0x1.74p6 -0x1.9p4 +REG epsg:32546 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32546 2 0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:32546 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32546 4 0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:32547 0 0x1.8cp6 -0x1.9p4 +REG epsg:32547 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32547 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:32547 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32547 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:32548 0 0x1.a4p6 -0x1.9p4 +REG epsg:32548 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32548 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:32548 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32548 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:32549 0 0x1.bcp6 -0x1.9p4 +REG epsg:32549 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32549 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:32549 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32549 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:3255 0 0x1.8cp6 -0x1.4555555555556p6 +REG epsg:3255 1 0x1.38p5 -0x1.64p6 +REG epsg:3255 2 0x1.3ep7 -0x1.64p6 +REG epsg:3255 3 0x1.38p5 -0x1.0955555555556p6 +REG epsg:3255 4 0x1.3ep7 -0x1.0955555555556p6 +REG epsg:32550 0 0x1.d4p6 -0x1.9p4 +REG epsg:32550 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32550 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:32550 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32550 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:32551 0 0x1.ecp6 -0x1.9p4 +REG epsg:32551 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32551 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:32551 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32551 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:32552 0 0x1.02p7 -0x1.9p4 +REG epsg:32552 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32552 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32552 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32552 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32553 0 0x1.0ep7 -0x1.9p4 +REG epsg:32553 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:32553 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:32553 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:32553 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:32554 0 0x1.1ap7 -0x1.9p4 +REG epsg:32554 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:32554 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:32554 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:32554 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:32555 0 0x1.26p7 -0x1.9p4 +REG epsg:32555 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:32555 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:32555 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:32555 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:32556 0 0x1.32p7 -0x1.9p4 +REG epsg:32556 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:32556 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32556 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:32556 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32557 0 0x1.3ep7 -0x1.9p4 +REG epsg:32557 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:32557 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:32557 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:32557 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:32558 0 0x1.4ap7 -0x1.9p4 +REG epsg:32558 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:32558 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:32558 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:32558 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:32559 0 0x1.56p7 -0x1.9p4 +REG epsg:32559 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:32559 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:32559 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:32559 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:3256 0 0x1.d4p6 -0x1.4555555555556p6 +REG epsg:3256 1 0x1.c8p5 -0x1.64p6 +REG epsg:3256 2 0x1.62p7 -0x1.64p6 +REG epsg:3256 3 0x1.c8p5 -0x1.0955555555556p6 +REG epsg:3256 4 0x1.62p7 -0x1.0955555555556p6 +REG epsg:32560 0 0x1.62p7 -0x1.9p4 +REG epsg:32560 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:32560 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:32560 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:32560 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:3257 0 0x1.0ep7 -0x1.4555555555556p6 +REG epsg:3257 1 0x1.2cp6 -0x1.64p6 +REG epsg:3257 2 -0x1.4ap7 -0x1.64p6 +REG epsg:3257 3 0x1.2cp6 -0x1.0955555555556p6 +REG epsg:3257 4 -0x1.4ap7 -0x1.0955555555556p6 +REG epsg:3258 0 0x1.32p7 -0x1.4555555555556p6 +REG epsg:3258 1 0x1.74p6 -0x1.64p6 +REG epsg:3258 2 -0x1.26p7 -0x1.64p6 +REG epsg:3258 3 0x1.74p6 -0x1.0955555555556p6 +REG epsg:3258 4 -0x1.26p7 -0x1.0955555555556p6 +REG epsg:3259 0 0x1.56p7 -0x1.4555555555556p6 +REG epsg:3259 1 0x1.bcp6 -0x1.64p6 +REG epsg:3259 2 -0x1.02p7 -0x1.64p6 +REG epsg:3259 3 0x1.bcp6 -0x1.0955555555556p6 +REG epsg:3259 4 -0x1.02p7 -0x1.0955555555556p6 +REG epsg:3260 0 -0x1.5p7 -0x1.4d55555555556p6 +REG epsg:3260 1 0x1.08p7 -0x1.64p6 +REG epsg:3260 2 -0x1.bp6 -0x1.64p6 +REG epsg:3260 3 0x1.08p7 -0x1.1800000000001p6 +REG epsg:3260 4 -0x1.bp6 -0x1.1800000000001p6 +REG epsg:32601 0 -0x1.62p7 0x0.0p0 +REG epsg:32601 1 0x1.64p7 -0x1.4p2 +REG epsg:32601 2 -0x1.58p7 -0x1.4p2 +REG epsg:32601 3 0x1.64p7 0x1.4p2 +REG epsg:32601 4 -0x1.58p7 0x1.4p2 +REG epsg:32602 0 -0x1.56p7 0x0.0p0 +REG epsg:32602 1 -0x1.6p7 -0x1.4p2 +REG epsg:32602 2 -0x1.4cp7 -0x1.4p2 +REG epsg:32602 3 -0x1.6p7 0x1.4p2 +REG epsg:32602 4 -0x1.4cp7 0x1.4p2 +REG epsg:32603 0 -0x1.4ap7 0x0.0p0 +REG epsg:32603 1 -0x1.54p7 -0x1.4p2 +REG epsg:32603 2 -0x1.4p7 -0x1.4p2 +REG epsg:32603 3 -0x1.54p7 0x1.4p2 +REG epsg:32603 4 -0x1.4p7 0x1.4p2 +REG epsg:32604 0 -0x1.3ep7 0x0.0p0 +REG epsg:32604 1 -0x1.48p7 -0x1.4p2 +REG epsg:32604 2 -0x1.34p7 -0x1.4p2 +REG epsg:32604 3 -0x1.48p7 0x1.4p2 +REG epsg:32604 4 -0x1.34p7 0x1.4p2 +REG epsg:32605 0 -0x1.32p7 0x0.0p0 +REG epsg:32605 1 -0x1.3cp7 -0x1.4p2 +REG epsg:32605 2 -0x1.28p7 -0x1.4p2 +REG epsg:32605 3 -0x1.3cp7 0x1.4p2 +REG epsg:32605 4 -0x1.28p7 0x1.4p2 +REG epsg:32606 0 -0x1.26p7 0x0.0p0 +REG epsg:32606 1 -0x1.3p7 -0x1.4p2 +REG epsg:32606 2 -0x1.1cp7 -0x1.4p2 +REG epsg:32606 3 -0x1.3p7 0x1.4p2 +REG epsg:32606 4 -0x1.1cp7 0x1.4p2 +REG epsg:32607 0 -0x1.1ap7 0x0.0p0 +REG epsg:32607 1 -0x1.24p7 -0x1.4p2 +REG epsg:32607 2 -0x1.1p7 -0x1.4p2 +REG epsg:32607 3 -0x1.24p7 0x1.4p2 +REG epsg:32607 4 -0x1.1p7 0x1.4p2 +REG epsg:32608 0 -0x1.0ep7 0x0.0p0 +REG epsg:32608 1 -0x1.18p7 -0x1.4p2 +REG epsg:32608 2 -0x1.04p7 -0x1.4p2 +REG epsg:32608 3 -0x1.18p7 0x1.4p2 +REG epsg:32608 4 -0x1.04p7 0x1.4p2 +REG epsg:32609 0 -0x1.02p7 0x0.0p0 +REG epsg:32609 1 -0x1.0cp7 -0x1.4p2 +REG epsg:32609 2 -0x1.fp6 -0x1.4p2 +REG epsg:32609 3 -0x1.0cp7 0x1.4p2 +REG epsg:32609 4 -0x1.fp6 0x1.4p2 +REG epsg:3261 0 -0x1.2p7 -0x1.4d55555555556p6 +REG epsg:3261 1 0x1.38p7 -0x1.64p6 +REG epsg:3261 2 -0x1.5p6 -0x1.64p6 +REG epsg:3261 3 0x1.38p7 -0x1.1800000000001p6 +REG epsg:3261 4 -0x1.5p6 -0x1.1800000000001p6 +REG epsg:32610 0 -0x1.ecp6 0x0.0p0 +REG epsg:32610 1 -0x1.0p7 -0x1.4p2 +REG epsg:32610 2 -0x1.d8p6 -0x1.4p2 +REG epsg:32610 3 -0x1.0p7 0x1.4p2 +REG epsg:32610 4 -0x1.d8p6 0x1.4p2 +REG epsg:32611 0 -0x1.d4p6 0x0.0p0 +REG epsg:32611 1 -0x1.e8p6 -0x1.4p2 +REG epsg:32611 2 -0x1.cp6 -0x1.4p2 +REG epsg:32611 3 -0x1.e8p6 0x1.4p2 +REG epsg:32611 4 -0x1.cp6 0x1.4p2 +REG epsg:32612 0 -0x1.bcp6 0x0.0p0 +REG epsg:32612 1 -0x1.dp6 -0x1.4p2 +REG epsg:32612 2 -0x1.a8p6 -0x1.4p2 +REG epsg:32612 3 -0x1.dp6 0x1.4p2 +REG epsg:32612 4 -0x1.a8p6 0x1.4p2 +REG epsg:32613 0 -0x1.a4p6 0x0.0p0 +REG epsg:32613 1 -0x1.b8p6 -0x1.4p2 +REG epsg:32613 2 -0x1.9p6 -0x1.4p2 +REG epsg:32613 3 -0x1.b8p6 0x1.4p2 +REG epsg:32613 4 -0x1.9p6 0x1.4p2 +REG epsg:32614 0 -0x1.8cp6 0x0.0p0 +REG epsg:32614 1 -0x1.ap6 -0x1.4p2 +REG epsg:32614 2 -0x1.78p6 -0x1.4p2 +REG epsg:32614 3 -0x1.ap6 0x1.4p2 +REG epsg:32614 4 -0x1.78p6 0x1.4p2 +REG epsg:32615 0 -0x1.74p6 0x0.0p0 +REG epsg:32615 1 -0x1.88p6 -0x1.4p2 +REG epsg:32615 2 -0x1.6p6 -0x1.4p2 +REG epsg:32615 3 -0x1.88p6 0x1.4p2 +REG epsg:32615 4 -0x1.6p6 0x1.4p2 +REG epsg:32616 0 -0x1.5cp6 0x0.0p0 +REG epsg:32616 1 -0x1.7p6 -0x1.4p2 +REG epsg:32616 2 -0x1.48p6 -0x1.4p2 +REG epsg:32616 3 -0x1.7p6 0x1.4p2 +REG epsg:32616 4 -0x1.48p6 0x1.4p2 +REG epsg:32617 0 -0x1.44p6 0x0.0p0 +REG epsg:32617 1 -0x1.58p6 -0x1.4p2 +REG epsg:32617 2 -0x1.3p6 -0x1.4p2 +REG epsg:32617 3 -0x1.58p6 0x1.4p2 +REG epsg:32617 4 -0x1.3p6 0x1.4p2 +REG epsg:32618 0 -0x1.2cp6 0x0.0p0 +REG epsg:32618 1 -0x1.4p6 -0x1.4p2 +REG epsg:32618 2 -0x1.18p6 -0x1.4p2 +REG epsg:32618 3 -0x1.4p6 0x1.4p2 +REG epsg:32618 4 -0x1.18p6 0x1.4p2 +REG epsg:32619 0 -0x1.14p6 0x0.0p0 +REG epsg:32619 1 -0x1.28p6 -0x1.4p2 +REG epsg:32619 2 -0x1.0p6 -0x1.4p2 +REG epsg:32619 3 -0x1.28p6 0x1.4p2 +REG epsg:32619 4 -0x1.0p6 0x1.4p2 +REG epsg:3262 0 -0x1.ep6 -0x1.4d55555555556p6 +REG epsg:3262 1 -0x1.68p7 -0x1.64p6 +REG epsg:3262 2 -0x1.ep5 -0x1.64p6 +REG epsg:3262 3 -0x1.68p7 -0x1.1800000000001p6 +REG epsg:3262 4 -0x1.ep5 -0x1.1800000000001p6 +REG epsg:32620 0 -0x1.f8p5 0x0.0p0 +REG epsg:32620 1 -0x1.1p6 -0x1.4p2 +REG epsg:32620 2 -0x1.dp5 -0x1.4p2 +REG epsg:32620 3 -0x1.1p6 0x1.4p2 +REG epsg:32620 4 -0x1.dp5 0x1.4p2 +REG epsg:32621 0 -0x1.c8p5 0x0.0p0 +REG epsg:32621 1 -0x1.fp5 -0x1.4p2 +REG epsg:32621 2 -0x1.ap5 -0x1.4p2 +REG epsg:32621 3 -0x1.fp5 0x1.4p2 +REG epsg:32621 4 -0x1.ap5 0x1.4p2 +REG epsg:32622 0 -0x1.98p5 0x0.0p0 +REG epsg:32622 1 -0x1.cp5 -0x1.4p2 +REG epsg:32622 2 -0x1.7p5 -0x1.4p2 +REG epsg:32622 3 -0x1.cp5 0x1.4p2 +REG epsg:32622 4 -0x1.7p5 0x1.4p2 +REG epsg:32623 0 -0x1.68p5 0x0.0p0 +REG epsg:32623 1 -0x1.9p5 -0x1.4p2 +REG epsg:32623 2 -0x1.4p5 -0x1.4p2 +REG epsg:32623 3 -0x1.9p5 0x1.4p2 +REG epsg:32623 4 -0x1.4p5 0x1.4p2 +REG epsg:32624 0 -0x1.38p5 0x0.0p0 +REG epsg:32624 1 -0x1.6p5 -0x1.4p2 +REG epsg:32624 2 -0x1.1p5 -0x1.4p2 +REG epsg:32624 3 -0x1.6p5 0x1.4p2 +REG epsg:32624 4 -0x1.1p5 0x1.4p2 +REG epsg:32625 0 -0x1.08p5 0x0.0p0 +REG epsg:32625 1 -0x1.3p5 -0x1.4p2 +REG epsg:32625 2 -0x1.cp4 -0x1.4p2 +REG epsg:32625 3 -0x1.3p5 0x1.4p2 +REG epsg:32625 4 -0x1.cp4 0x1.4p2 +REG epsg:32626 0 -0x1.bp4 0x0.0p0 +REG epsg:32626 1 -0x1.0p5 -0x1.4p2 +REG epsg:32626 2 -0x1.6p4 -0x1.4p2 +REG epsg:32626 3 -0x1.0p5 0x1.4p2 +REG epsg:32626 4 -0x1.6p4 0x1.4p2 +REG epsg:32627 0 -0x1.5p4 0x0.0p0 +REG epsg:32627 1 -0x1.ap4 -0x1.4p2 +REG epsg:32627 2 -0x1.0p4 -0x1.4p2 +REG epsg:32627 3 -0x1.ap4 0x1.4p2 +REG epsg:32627 4 -0x1.0p4 0x1.4p2 +REG epsg:32628 0 -0x1.ep3 0x0.0p0 +REG epsg:32628 1 -0x1.4p4 -0x1.4p2 +REG epsg:32628 2 -0x1.4p3 -0x1.4p2 +REG epsg:32628 3 -0x1.4p4 0x1.4p2 +REG epsg:32628 4 -0x1.4p3 0x1.4p2 +REG epsg:32629 0 -0x1.2p3 0x0.0p0 +REG epsg:32629 1 -0x1.cp3 -0x1.4p2 +REG epsg:32629 2 -0x1.0p2 -0x1.4p2 +REG epsg:32629 3 -0x1.cp3 0x1.4p2 +REG epsg:32629 4 -0x1.0p2 0x1.4p2 +REG epsg:3263 0 -0x1.8p6 -0x1.4d55555555556p6 +REG epsg:3263 1 -0x1.38p7 -0x1.64p6 +REG epsg:3263 2 -0x1.2p5 -0x1.64p6 +REG epsg:3263 3 -0x1.38p7 -0x1.1800000000001p6 +REG epsg:3263 4 -0x1.2p5 -0x1.1800000000001p6 +REG epsg:32630 0 -0x1.8p1 0x0.0p0 +REG epsg:32630 1 -0x1.0p3 -0x1.4p2 +REG epsg:32630 2 0x1.0p1 -0x1.4p2 +REG epsg:32630 3 -0x1.0p3 0x1.4p2 +REG epsg:32630 4 0x1.0p1 0x1.4p2 +REG epsg:32631 0 0x1.8p1 0x0.0p0 +REG epsg:32631 1 -0x1.0p1 -0x1.4p2 +REG epsg:32631 2 0x1.0p3 -0x1.4p2 +REG epsg:32631 3 -0x1.0p1 0x1.4p2 +REG epsg:32631 4 0x1.0p3 0x1.4p2 +REG epsg:32632 0 0x1.2p3 0x0.0p0 +REG epsg:32632 1 0x1.0p2 -0x1.4p2 +REG epsg:32632 2 0x1.cp3 -0x1.4p2 +REG epsg:32632 3 0x1.0p2 0x1.4p2 +REG epsg:32632 4 0x1.cp3 0x1.4p2 +REG epsg:32633 0 0x1.ep3 0x0.0p0 +REG epsg:32633 1 0x1.4p3 -0x1.4p2 +REG epsg:32633 2 0x1.4p4 -0x1.4p2 +REG epsg:32633 3 0x1.4p3 0x1.4p2 +REG epsg:32633 4 0x1.4p4 0x1.4p2 +REG epsg:32634 0 0x1.5p4 0x0.0p0 +REG epsg:32634 1 0x1.0p4 -0x1.4p2 +REG epsg:32634 2 0x1.ap4 -0x1.4p2 +REG epsg:32634 3 0x1.0p4 0x1.4p2 +REG epsg:32634 4 0x1.ap4 0x1.4p2 +REG epsg:32635 0 0x1.bp4 0x0.0p0 +REG epsg:32635 1 0x1.6p4 -0x1.4p2 +REG epsg:32635 2 0x1.0p5 -0x1.4p2 +REG epsg:32635 3 0x1.6p4 0x1.4p2 +REG epsg:32635 4 0x1.0p5 0x1.4p2 +REG epsg:32636 0 0x1.08p5 0x0.0p0 +REG epsg:32636 1 0x1.cp4 -0x1.4p2 +REG epsg:32636 2 0x1.3p5 -0x1.4p2 +REG epsg:32636 3 0x1.cp4 0x1.4p2 +REG epsg:32636 4 0x1.3p5 0x1.4p2 +REG epsg:32637 0 0x1.38p5 0x0.0p0 +REG epsg:32637 1 0x1.1p5 -0x1.4p2 +REG epsg:32637 2 0x1.6p5 -0x1.4p2 +REG epsg:32637 3 0x1.1p5 0x1.4p2 +REG epsg:32637 4 0x1.6p5 0x1.4p2 +REG epsg:32638 0 0x1.68p5 0x0.0p0 +REG epsg:32638 1 0x1.4p5 -0x1.4p2 +REG epsg:32638 2 0x1.9p5 -0x1.4p2 +REG epsg:32638 3 0x1.4p5 0x1.4p2 +REG epsg:32638 4 0x1.9p5 0x1.4p2 +REG epsg:32639 0 0x1.98p5 0x0.0p0 +REG epsg:32639 1 0x1.7p5 -0x1.4p2 +REG epsg:32639 2 0x1.cp5 -0x1.4p2 +REG epsg:32639 3 0x1.7p5 0x1.4p2 +REG epsg:32639 4 0x1.cp5 0x1.4p2 +REG epsg:3264 0 -0x1.2p6 -0x1.4d55555555556p6 +REG epsg:3264 1 -0x1.08p7 -0x1.64p6 +REG epsg:3264 2 -0x1.8p3 -0x1.64p6 +REG epsg:3264 3 -0x1.08p7 -0x1.1800000000001p6 +REG epsg:3264 4 -0x1.8p3 -0x1.1800000000001p6 +REG epsg:32640 0 0x1.c8p5 0x0.0p0 +REG epsg:32640 1 0x1.ap5 -0x1.4p2 +REG epsg:32640 2 0x1.fp5 -0x1.4p2 +REG epsg:32640 3 0x1.ap5 0x1.4p2 +REG epsg:32640 4 0x1.fp5 0x1.4p2 +REG epsg:32641 0 0x1.f8p5 0x0.0p0 +REG epsg:32641 1 0x1.dp5 -0x1.4p2 +REG epsg:32641 2 0x1.1p6 -0x1.4p2 +REG epsg:32641 3 0x1.dp5 0x1.4p2 +REG epsg:32641 4 0x1.1p6 0x1.4p2 +REG epsg:32642 0 0x1.14p6 0x0.0p0 +REG epsg:32642 1 0x1.0p6 -0x1.4p2 +REG epsg:32642 2 0x1.28p6 -0x1.4p2 +REG epsg:32642 3 0x1.0p6 0x1.4p2 +REG epsg:32642 4 0x1.28p6 0x1.4p2 +REG epsg:32643 0 0x1.2cp6 0x0.0p0 +REG epsg:32643 1 0x1.18p6 -0x1.4p2 +REG epsg:32643 2 0x1.4p6 -0x1.4p2 +REG epsg:32643 3 0x1.18p6 0x1.4p2 +REG epsg:32643 4 0x1.4p6 0x1.4p2 +REG epsg:32644 0 0x1.44p6 0x0.0p0 +REG epsg:32644 1 0x1.3p6 -0x1.4p2 +REG epsg:32644 2 0x1.58p6 -0x1.4p2 +REG epsg:32644 3 0x1.3p6 0x1.4p2 +REG epsg:32644 4 0x1.58p6 0x1.4p2 +REG epsg:32645 0 0x1.5cp6 0x0.0p0 +REG epsg:32645 1 0x1.48p6 -0x1.4p2 +REG epsg:32645 2 0x1.7p6 -0x1.4p2 +REG epsg:32645 3 0x1.48p6 0x1.4p2 +REG epsg:32645 4 0x1.7p6 0x1.4p2 +REG epsg:32646 0 0x1.74p6 0x0.0p0 +REG epsg:32646 1 0x1.6p6 -0x1.4p2 +REG epsg:32646 2 0x1.88p6 -0x1.4p2 +REG epsg:32646 3 0x1.6p6 0x1.4p2 +REG epsg:32646 4 0x1.88p6 0x1.4p2 +REG epsg:32647 0 0x1.8cp6 0x0.0p0 +REG epsg:32647 1 0x1.78p6 -0x1.4p2 +REG epsg:32647 2 0x1.ap6 -0x1.4p2 +REG epsg:32647 3 0x1.78p6 0x1.4p2 +REG epsg:32647 4 0x1.ap6 0x1.4p2 +REG epsg:32648 0 0x1.a4p6 0x0.0p0 +REG epsg:32648 1 0x1.9p6 -0x1.4p2 +REG epsg:32648 2 0x1.b8p6 -0x1.4p2 +REG epsg:32648 3 0x1.9p6 0x1.4p2 +REG epsg:32648 4 0x1.b8p6 0x1.4p2 +REG epsg:32649 0 0x1.bcp6 0x0.0p0 +REG epsg:32649 1 0x1.a8p6 -0x1.4p2 +REG epsg:32649 2 0x1.dp6 -0x1.4p2 +REG epsg:32649 3 0x1.a8p6 0x1.4p2 +REG epsg:32649 4 0x1.dp6 0x1.4p2 +REG epsg:3265 0 -0x1.8p5 -0x1.4d55555555556p6 +REG epsg:3265 1 -0x1.bp6 -0x1.64p6 +REG epsg:3265 2 0x1.8p3 -0x1.64p6 +REG epsg:3265 3 -0x1.bp6 -0x1.1800000000001p6 +REG epsg:3265 4 0x1.8p3 -0x1.1800000000001p6 +REG epsg:32650 0 0x1.d4p6 0x0.0p0 +REG epsg:32650 1 0x1.cp6 -0x1.4p2 +REG epsg:32650 2 0x1.e8p6 -0x1.4p2 +REG epsg:32650 3 0x1.cp6 0x1.4p2 +REG epsg:32650 4 0x1.e8p6 0x1.4p2 +REG epsg:32651 0 0x1.ecp6 0x0.0p0 +REG epsg:32651 1 0x1.d8p6 -0x1.4p2 +REG epsg:32651 2 0x1.0p7 -0x1.4p2 +REG epsg:32651 3 0x1.d8p6 0x1.4p2 +REG epsg:32651 4 0x1.0p7 0x1.4p2 +REG epsg:32652 0 0x1.02p7 0x0.0p0 +REG epsg:32652 1 0x1.fp6 -0x1.4p2 +REG epsg:32652 2 0x1.0cp7 -0x1.4p2 +REG epsg:32652 3 0x1.fp6 0x1.4p2 +REG epsg:32652 4 0x1.0cp7 0x1.4p2 +REG epsg:32653 0 0x1.0ep7 0x0.0p0 +REG epsg:32653 1 0x1.04p7 -0x1.4p2 +REG epsg:32653 2 0x1.18p7 -0x1.4p2 +REG epsg:32653 3 0x1.04p7 0x1.4p2 +REG epsg:32653 4 0x1.18p7 0x1.4p2 +REG epsg:32654 0 0x1.1ap7 0x0.0p0 +REG epsg:32654 1 0x1.1p7 -0x1.4p2 +REG epsg:32654 2 0x1.24p7 -0x1.4p2 +REG epsg:32654 3 0x1.1p7 0x1.4p2 +REG epsg:32654 4 0x1.24p7 0x1.4p2 +REG epsg:32655 0 0x1.26p7 0x0.0p0 +REG epsg:32655 1 0x1.1cp7 -0x1.4p2 +REG epsg:32655 2 0x1.3p7 -0x1.4p2 +REG epsg:32655 3 0x1.1cp7 0x1.4p2 +REG epsg:32655 4 0x1.3p7 0x1.4p2 +REG epsg:32656 0 0x1.32p7 0x0.0p0 +REG epsg:32656 1 0x1.28p7 -0x1.4p2 +REG epsg:32656 2 0x1.3cp7 -0x1.4p2 +REG epsg:32656 3 0x1.28p7 0x1.4p2 +REG epsg:32656 4 0x1.3cp7 0x1.4p2 +REG epsg:32657 0 0x1.3ep7 0x0.0p0 +REG epsg:32657 1 0x1.34p7 -0x1.4p2 +REG epsg:32657 2 0x1.48p7 -0x1.4p2 +REG epsg:32657 3 0x1.34p7 0x1.4p2 +REG epsg:32657 4 0x1.48p7 0x1.4p2 +REG epsg:32658 0 0x1.4ap7 0x0.0p0 +REG epsg:32658 1 0x1.4p7 -0x1.4p2 +REG epsg:32658 2 0x1.54p7 -0x1.4p2 +REG epsg:32658 3 0x1.4p7 0x1.4p2 +REG epsg:32658 4 0x1.54p7 0x1.4p2 +REG epsg:32659 0 0x1.56p7 0x0.0p0 +REG epsg:32659 1 0x1.4cp7 -0x1.4p2 +REG epsg:32659 2 0x1.6p7 -0x1.4p2 +REG epsg:32659 3 0x1.4cp7 0x1.4p2 +REG epsg:32659 4 0x1.6p7 0x1.4p2 +REG epsg:3266 0 -0x1.8p4 -0x1.4d55555555556p6 +REG epsg:3266 1 -0x1.5p6 -0x1.64p6 +REG epsg:3266 2 0x1.2p5 -0x1.64p6 +REG epsg:3266 3 -0x1.5p6 -0x1.1800000000001p6 +REG epsg:3266 4 0x1.2p5 -0x1.1800000000001p6 +REG epsg:32660 0 0x1.62p7 0x0.0p0 +REG epsg:32660 1 0x1.58p7 -0x1.4p2 +REG epsg:32660 2 -0x1.64p7 -0x1.4p2 +REG epsg:32660 3 0x1.58p7 0x1.4p2 +REG epsg:32660 4 -0x1.64p7 0x1.4p2 +REG epsg:32661 0 0x0.0p0 0x1.64p6 +REG epsg:32661 1 -0x1.ep5 0x1.54p6 +REG epsg:32661 2 0x1.ep5 0x1.54p6 +REG epsg:32661 3 -0x1.ep5 0x1.64p6 +REG epsg:32661 4 0x1.ep5 0x1.64p6 +REG epsg:32662 0 0x0.0p0 0x0.0p0 +REG epsg:32662 1 -0x1.4p2 -0x1.4p2 +REG epsg:32662 2 0x1.4p2 -0x1.4p2 +REG epsg:32662 3 -0x1.4p2 0x1.4p2 +REG epsg:32662 4 0x1.4p2 0x1.4p2 +REG epsg:32663 0 0x0.0p0 0x0.0p0 +REG epsg:32663 1 -0x1.4p2 -0x1.4p2 +REG epsg:32663 2 0x1.4p2 -0x1.4p2 +REG epsg:32663 3 -0x1.4p2 0x1.4p2 +REG epsg:32663 4 0x1.4p2 0x1.4p2 +REG epsg:32664 0 -0x1.8cp6 0x0.0p0 +REG epsg:32664 1 -0x1.ap6 -0x1.4p2 +REG epsg:32664 2 -0x1.78p6 -0x1.4p2 +REG epsg:32664 3 -0x1.ap6 0x1.4p2 +REG epsg:32664 4 -0x1.78p6 0x1.4p2 +REG epsg:32665 0 -0x1.74p6 0x0.0p0 +REG epsg:32665 1 -0x1.88p6 -0x1.4p2 +REG epsg:32665 2 -0x1.6p6 -0x1.4p2 +REG epsg:32665 3 -0x1.88p6 0x1.4p2 +REG epsg:32665 4 -0x1.6p6 0x1.4p2 +REG epsg:32666 0 -0x1.5cp6 0x0.0p0 +REG epsg:32666 1 -0x1.7p6 -0x1.4p2 +REG epsg:32666 2 -0x1.48p6 -0x1.4p2 +REG epsg:32666 3 -0x1.7p6 0x1.4p2 +REG epsg:32666 4 -0x1.48p6 0x1.4p2 +REG epsg:32667 0 -0x1.44p6 0x0.0p0 +REG epsg:32667 1 -0x1.58p6 -0x1.4p2 +REG epsg:32667 2 -0x1.3p6 -0x1.4p2 +REG epsg:32667 3 -0x1.58p6 0x1.4p2 +REG epsg:32667 4 -0x1.3p6 0x1.4p2 +REG epsg:3267 0 0x0.0p0 -0x1.4d55555555556p6 +REG epsg:3267 1 -0x1.ep5 -0x1.64p6 +REG epsg:3267 2 0x1.ep5 -0x1.64p6 +REG epsg:3267 3 -0x1.ep5 -0x1.1800000000001p6 +REG epsg:3267 4 0x1.ep5 -0x1.1800000000001p6 +REG epsg:3268 0 0x1.8p4 -0x1.4d55555555556p6 +REG epsg:3268 1 -0x1.2p5 -0x1.64p6 +REG epsg:3268 2 0x1.5p6 -0x1.64p6 +REG epsg:3268 3 -0x1.2p5 -0x1.1800000000001p6 +REG epsg:3268 4 0x1.5p6 -0x1.1800000000001p6 +REG epsg:3269 0 0x1.8p5 -0x1.4d55555555556p6 +REG epsg:3269 1 -0x1.8p3 -0x1.64p6 +REG epsg:3269 2 0x1.bp6 -0x1.64p6 +REG epsg:3269 3 -0x1.8p3 -0x1.1800000000001p6 +REG epsg:3269 4 0x1.bp6 -0x1.1800000000001p6 +REG epsg:3270 0 0x1.2p6 -0x1.4d55555555556p6 +REG epsg:3270 1 0x1.8p3 -0x1.64p6 +REG epsg:3270 2 0x1.08p7 -0x1.64p6 +REG epsg:3270 3 0x1.8p3 -0x1.1800000000001p6 +REG epsg:3270 4 0x1.08p7 -0x1.1800000000001p6 +REG epsg:32701 0 -0x1.62p7 -0x1.9p4 +REG epsg:32701 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:32701 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:32701 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:32701 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:32702 0 -0x1.56p7 -0x1.9p4 +REG epsg:32702 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:32702 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:32702 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:32702 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:32703 0 -0x1.4ap7 -0x1.9p4 +REG epsg:32703 1 -0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:32703 2 -0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:32703 3 -0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:32703 4 -0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:32704 0 -0x1.3ep7 -0x1.9p4 +REG epsg:32704 1 -0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:32704 2 -0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:32704 3 -0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:32704 4 -0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:32705 0 -0x1.32p7 -0x1.9p4 +REG epsg:32705 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32705 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:32705 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32705 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:32706 0 -0x1.26p7 -0x1.9p4 +REG epsg:32706 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:32706 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:32706 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:32706 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:32707 0 -0x1.1ap7 -0x1.9p4 +REG epsg:32707 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:32707 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:32707 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:32707 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:32708 0 -0x1.0ep7 -0x1.9p4 +REG epsg:32708 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:32708 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:32708 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:32708 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:32709 0 -0x1.02p7 -0x1.9p4 +REG epsg:32709 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32709 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32709 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32709 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:3271 0 0x1.8p6 -0x1.4d55555555556p6 +REG epsg:3271 1 0x1.2p5 -0x1.64p6 +REG epsg:3271 2 0x1.38p7 -0x1.64p6 +REG epsg:3271 3 0x1.2p5 -0x1.1800000000001p6 +REG epsg:3271 4 0x1.38p7 -0x1.1800000000001p6 +REG epsg:32710 0 -0x1.ecp6 -0x1.9p4 +REG epsg:32710 1 -0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:32710 2 -0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32710 3 -0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:32710 4 -0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32711 0 -0x1.d4p6 -0x1.9p4 +REG epsg:32711 1 -0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:32711 2 -0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32711 3 -0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:32711 4 -0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32712 0 -0x1.bcp6 -0x1.9p4 +REG epsg:32712 1 -0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:32712 2 -0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32712 3 -0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:32712 4 -0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32713 0 -0x1.a4p6 -0x1.9p4 +REG epsg:32713 1 -0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:32713 2 -0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32713 3 -0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:32713 4 -0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32714 0 -0x1.8cp6 -0x1.9p4 +REG epsg:32714 1 -0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:32714 2 -0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32714 3 -0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:32714 4 -0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32715 0 -0x1.74p6 -0x1.9p4 +REG epsg:32715 1 -0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:32715 2 -0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32715 3 -0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:32715 4 -0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32716 0 -0x1.5cp6 -0x1.9p4 +REG epsg:32716 1 -0x1.72114b818572ep6 -0x1.ep4 +REG epsg:32716 2 -0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32716 3 -0x1.72114b818572ep6 -0x1.4p4 +REG epsg:32716 4 -0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32717 0 -0x1.44p6 -0x1.9p4 +REG epsg:32717 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:32717 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32717 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:32717 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32718 0 -0x1.2cp6 -0x1.9p4 +REG epsg:32718 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:32718 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32718 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:32718 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32719 0 -0x1.14p6 -0x1.9p4 +REG epsg:32719 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:32719 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32719 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:32719 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:3272 0 0x1.ep6 -0x1.4d55555555556p6 +REG epsg:3272 1 0x1.ep5 -0x1.64p6 +REG epsg:3272 2 -0x1.68p7 -0x1.64p6 +REG epsg:3272 3 0x1.ep5 -0x1.1800000000001p6 +REG epsg:3272 4 -0x1.68p7 -0x1.1800000000001p6 +REG epsg:32720 0 -0x1.f8p5 -0x1.9p4 +REG epsg:32720 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:32720 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32720 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:32720 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32721 0 -0x1.c8p5 -0x1.9p4 +REG epsg:32721 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:32721 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32721 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:32721 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32722 0 -0x1.98p5 -0x1.9p4 +REG epsg:32722 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:32722 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32722 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:32722 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32723 0 -0x1.68p5 -0x1.9p4 +REG epsg:32723 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:32723 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32723 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:32723 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32724 0 -0x1.38p5 -0x1.9p4 +REG epsg:32724 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:32724 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32724 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:32724 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32725 0 -0x1.08p5 -0x1.9p4 +REG epsg:32725 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32725 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32725 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32725 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32726 0 -0x1.bp4 -0x1.9p4 +REG epsg:32726 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:32726 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:32726 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:32726 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:32727 0 -0x1.5p4 -0x1.9p4 +REG epsg:32727 1 -0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:32727 2 -0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:32727 3 -0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:32727 4 -0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:32728 0 -0x1.ep3 -0x1.9p4 +REG epsg:32728 1 -0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:32728 2 -0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:32728 3 -0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:32728 4 -0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:32729 0 -0x1.2p3 -0x1.9p4 +REG epsg:32729 1 -0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:32729 2 -0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:32729 3 -0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:32729 4 -0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:3273 0 0x1.2p7 -0x1.4d55555555556p6 +REG epsg:3273 1 0x1.5p6 -0x1.64p6 +REG epsg:3273 2 -0x1.38p7 -0x1.64p6 +REG epsg:3273 3 0x1.5p6 -0x1.1800000000001p6 +REG epsg:3273 4 -0x1.38p7 -0x1.1800000000001p6 +REG epsg:32730 0 -0x1.8p1 -0x1.9p4 +REG epsg:32730 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:32730 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:32730 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:32730 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:32731 0 0x1.8p1 -0x1.9p4 +REG epsg:32731 1 -0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:32731 2 0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:32731 3 -0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:32731 4 0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:32732 0 0x1.2p3 -0x1.9p4 +REG epsg:32732 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:32732 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:32732 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:32732 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:32733 0 0x1.ep3 -0x1.9p4 +REG epsg:32733 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:32733 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:32733 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:32733 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:32734 0 0x1.5p4 -0x1.9p4 +REG epsg:32734 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:32734 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:32734 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:32734 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:32735 0 0x1.bp4 -0x1.9p4 +REG epsg:32735 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:32735 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:32735 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:32735 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:32736 0 0x1.08p5 -0x1.9p4 +REG epsg:32736 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:32736 2 0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:32736 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:32736 4 0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:32737 0 0x1.38p5 -0x1.9p4 +REG epsg:32737 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32737 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:32737 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32737 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:32738 0 0x1.68p5 -0x1.9p4 +REG epsg:32738 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32738 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:32738 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32738 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:32739 0 0x1.98p5 -0x1.9p4 +REG epsg:32739 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32739 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:32739 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32739 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:3274 0 0x1.5p7 -0x1.4d55555555556p6 +REG epsg:3274 1 0x1.bp6 -0x1.64p6 +REG epsg:3274 2 -0x1.08p7 -0x1.64p6 +REG epsg:3274 3 0x1.bp6 -0x1.1800000000001p6 +REG epsg:3274 4 -0x1.08p7 -0x1.1800000000001p6 +REG epsg:32740 0 0x1.c8p5 -0x1.9p4 +REG epsg:32740 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:32740 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:32740 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:32740 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:32741 0 0x1.f8p5 -0x1.9p4 +REG epsg:32741 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32741 2 0x1.12114b818572ep6 -0x1.ep4 +REG epsg:32741 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32741 4 0x1.12114b818572ep6 -0x1.4p4 +REG epsg:32742 0 0x1.14p6 -0x1.9p4 +REG epsg:32742 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:32742 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:32742 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:32742 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:32743 0 0x1.2cp6 -0x1.9p4 +REG epsg:32743 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32743 2 0x1.42114b818572ep6 -0x1.ep4 +REG epsg:32743 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32743 4 0x1.42114b818572ep6 -0x1.4p4 +REG epsg:32744 0 0x1.44p6 -0x1.9p4 +REG epsg:32744 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32744 2 0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:32744 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32744 4 0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:32745 0 0x1.5cp6 -0x1.9p4 +REG epsg:32745 1 0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32745 2 0x1.72114b818572ep6 -0x1.ep4 +REG epsg:32745 3 0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32745 4 0x1.72114b818572ep6 -0x1.4p4 +REG epsg:32746 0 0x1.74p6 -0x1.9p4 +REG epsg:32746 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32746 2 0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:32746 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32746 4 0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:32747 0 0x1.8cp6 -0x1.9p4 +REG epsg:32747 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32747 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:32747 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32747 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:32748 0 0x1.a4p6 -0x1.9p4 +REG epsg:32748 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:32748 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:32748 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:32748 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:32749 0 0x1.bcp6 -0x1.9p4 +REG epsg:32749 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32749 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:32749 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32749 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:3275 0 -0x1.4ap7 -0x1.547a2b3c4d5e7p6 +REG epsg:3275 1 0x1.0ep7 -0x1.64p6 +REG epsg:3275 2 -0x1.a4p6 -0x1.64p6 +REG epsg:3275 3 0x1.0ep7 -0x1.2d6e81b4e81b5p6 +REG epsg:3275 4 -0x1.a4p6 -0x1.2d6e81b4e81b5p6 +REG epsg:32750 0 0x1.d4p6 -0x1.9p4 +REG epsg:32750 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32750 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:32750 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32750 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:32751 0 0x1.ecp6 -0x1.9p4 +REG epsg:32751 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:32751 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:32751 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:32751 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:32752 0 0x1.02p7 -0x1.9p4 +REG epsg:32752 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:32752 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32752 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:32752 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32753 0 0x1.0ep7 -0x1.9p4 +REG epsg:32753 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:32753 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:32753 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:32753 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:32754 0 0x1.1ap7 -0x1.9p4 +REG epsg:32754 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:32754 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:32754 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:32754 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:32755 0 0x1.26p7 -0x1.9p4 +REG epsg:32755 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:32755 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:32755 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:32755 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:32756 0 0x1.32p7 -0x1.9p4 +REG epsg:32756 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:32756 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:32756 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:32756 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:32757 0 0x1.3ep7 -0x1.9p4 +REG epsg:32757 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:32757 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:32757 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:32757 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:32758 0 0x1.4ap7 -0x1.9p4 +REG epsg:32758 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:32758 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:32758 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:32758 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:32759 0 0x1.56p7 -0x1.9p4 +REG epsg:32759 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:32759 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:32759 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:32759 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:3276 0 -0x1.0ep7 -0x1.547a2b3c4d5e7p6 +REG epsg:3276 1 0x1.4ap7 -0x1.64p6 +REG epsg:3276 2 -0x1.2cp6 -0x1.64p6 +REG epsg:3276 3 0x1.4ap7 -0x1.2d6e81b4e81b5p6 +REG epsg:3276 4 -0x1.2cp6 -0x1.2d6e81b4e81b5p6 +REG epsg:32760 0 0x1.62p7 -0x1.9p4 +REG epsg:32760 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:32760 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:32760 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:32760 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:32761 0 0x0.0p0 -0x1.64p6 +REG epsg:32761 1 -0x1.ep5 -0x1.64p6 +REG epsg:32761 2 0x1.ep5 -0x1.64p6 +REG epsg:32761 3 -0x1.ep5 -0x1.54p6 +REG epsg:32761 4 0x1.ep5 -0x1.54p6 +REG epsg:32766 0 0x1.2p5 0x0.0p0 +REG epsg:32766 1 0x1.fp4 -0x1.4p2 +REG epsg:32766 2 0x1.48p5 -0x1.4p2 +REG epsg:32766 3 0x1.fp4 0x1.4p2 +REG epsg:32766 4 0x1.48p5 0x1.4p2 +REG epsg:3277 0 -0x1.a4p6 -0x1.547a2b3c4d5e7p6 +REG epsg:3277 1 -0x1.4ap7 -0x1.64p6 +REG epsg:3277 2 -0x1.68p5 -0x1.64p6 +REG epsg:3277 3 -0x1.4ap7 -0x1.2d6e81b4e81b5p6 +REG epsg:3277 4 -0x1.68p5 -0x1.2d6e81b4e81b5p6 +REG epsg:3278 0 -0x1.2cp6 -0x1.547a2b3c4d5e7p6 +REG epsg:3278 1 -0x1.0ep7 -0x1.64p6 +REG epsg:3278 2 -0x1.ep3 -0x1.64p6 +REG epsg:3278 3 -0x1.0ep7 -0x1.2d6e81b4e81b5p6 +REG epsg:3278 4 -0x1.ep3 -0x1.2d6e81b4e81b5p6 +REG epsg:3279 0 -0x1.68p5 -0x1.547a2b3c4d5e7p6 +REG epsg:3279 1 -0x1.a4p6 -0x1.64p6 +REG epsg:3279 2 0x1.ep3 -0x1.64p6 +REG epsg:3279 3 -0x1.a4p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3279 4 0x1.ep3 -0x1.2d6e81b4e81b5p6 +REG epsg:3280 0 -0x1.ep3 -0x1.547a2b3c4d5e7p6 +REG epsg:3280 1 -0x1.2cp6 -0x1.64p6 +REG epsg:3280 2 0x1.68p5 -0x1.64p6 +REG epsg:3280 3 -0x1.2cp6 -0x1.2d6e81b4e81b5p6 +REG epsg:3280 4 0x1.68p5 -0x1.2d6e81b4e81b5p6 +REG epsg:3281 0 0x1.ep3 -0x1.547a2b3c4d5e7p6 +REG epsg:3281 1 -0x1.68p5 -0x1.64p6 +REG epsg:3281 2 0x1.2cp6 -0x1.64p6 +REG epsg:3281 3 -0x1.68p5 -0x1.2d6e81b4e81b5p6 +REG epsg:3281 4 0x1.2cp6 -0x1.2d6e81b4e81b5p6 +REG epsg:3282 0 0x1.68p5 -0x1.547a2b3c4d5e7p6 +REG epsg:3282 1 -0x1.ep3 -0x1.64p6 +REG epsg:3282 2 0x1.a4p6 -0x1.64p6 +REG epsg:3282 3 -0x1.ep3 -0x1.2d6e81b4e81b5p6 +REG epsg:3282 4 0x1.a4p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3283 0 0x1.2cp6 -0x1.547a2b3c4d5e7p6 +REG epsg:3283 1 0x1.ep3 -0x1.64p6 +REG epsg:3283 2 0x1.0ep7 -0x1.64p6 +REG epsg:3283 3 0x1.ep3 -0x1.2d6e81b4e81b5p6 +REG epsg:3283 4 0x1.0ep7 -0x1.2d6e81b4e81b5p6 +REG epsg:3284 0 0x1.a4p6 -0x1.547a2b3c4d5e7p6 +REG epsg:3284 1 0x1.68p5 -0x1.64p6 +REG epsg:3284 2 0x1.4ap7 -0x1.64p6 +REG epsg:3284 3 0x1.68p5 -0x1.2d6e81b4e81b5p6 +REG epsg:3284 4 0x1.4ap7 -0x1.2d6e81b4e81b5p6 +REG epsg:3285 0 0x1.0ep7 -0x1.547a2b3c4d5e7p6 +REG epsg:3285 1 0x1.2cp6 -0x1.64p6 +REG epsg:3285 2 -0x1.4ap7 -0x1.64p6 +REG epsg:3285 3 0x1.2cp6 -0x1.2d6e81b4e81b5p6 +REG epsg:3285 4 -0x1.4ap7 -0x1.2d6e81b4e81b5p6 +REG epsg:3286 0 0x1.4ap7 -0x1.547a2b3c4d5e7p6 +REG epsg:3286 1 0x1.a4p6 -0x1.64p6 +REG epsg:3286 2 -0x1.0ep7 -0x1.64p6 +REG epsg:3286 3 0x1.a4p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3286 4 -0x1.0ep7 -0x1.2d6e81b4e81b5p6 +REG epsg:3287 0 -0x1.2cp7 -0x1.547a2b3c4d5e7p6 +REG epsg:3287 1 0x1.2cp7 -0x1.64p6 +REG epsg:3287 2 -0x1.68p6 -0x1.64p6 +REG epsg:3287 3 0x1.2cp7 -0x1.2d6e81b4e81b5p6 +REG epsg:3287 4 -0x1.68p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3288 0 -0x1.68p6 -0x1.547a2b3c4d5e7p6 +REG epsg:3288 1 -0x1.2cp7 -0x1.64p6 +REG epsg:3288 2 -0x1.ep4 -0x1.64p6 +REG epsg:3288 3 -0x1.2cp7 -0x1.2d6e81b4e81b5p6 +REG epsg:3288 4 -0x1.ep4 -0x1.2d6e81b4e81b5p6 +REG epsg:3289 0 -0x1.ep4 -0x1.547a2b3c4d5e7p6 +REG epsg:3289 1 -0x1.68p6 -0x1.64p6 +REG epsg:3289 2 0x1.ep4 -0x1.64p6 +REG epsg:3289 3 -0x1.68p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3289 4 0x1.ep4 -0x1.2d6e81b4e81b5p6 +REG epsg:3290 0 0x1.ep4 -0x1.547a2b3c4d5e7p6 +REG epsg:3290 1 -0x1.ep4 -0x1.64p6 +REG epsg:3290 2 0x1.68p6 -0x1.64p6 +REG epsg:3290 3 -0x1.ep4 -0x1.2d6e81b4e81b5p6 +REG epsg:3290 4 0x1.68p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3291 0 0x1.68p6 -0x1.547a2b3c4d5e7p6 +REG epsg:3291 1 0x1.ep4 -0x1.64p6 +REG epsg:3291 2 0x1.2cp7 -0x1.64p6 +REG epsg:3291 3 0x1.ep4 -0x1.2d6e81b4e81b5p6 +REG epsg:3291 4 0x1.2cp7 -0x1.2d6e81b4e81b5p6 +REG epsg:3292 0 0x1.2cp7 -0x1.547a2b3c4d5e7p6 +REG epsg:3292 1 0x1.68p6 -0x1.64p6 +REG epsg:3292 2 -0x1.2cp7 -0x1.64p6 +REG epsg:3292 3 0x1.68p6 -0x1.2d6e81b4e81b5p6 +REG epsg:3292 4 -0x1.2cp7 -0x1.2d6e81b4e81b5p6 +REG epsg:3293 0 0x0.0p0 -0x1.547a2b3c4d5e7p6 +REG epsg:3293 1 -0x1.ep5 -0x1.64p6 +REG epsg:3293 2 0x1.ep5 -0x1.64p6 +REG epsg:3293 3 -0x1.ep5 -0x1.2d6e81b4e81b5p6 +REG epsg:3293 4 0x1.ep5 -0x1.2d6e81b4e81b5p6 +REG epsg:3294 0 0x1.44p7 -0x1.38p6 +REG epsg:3294 1 0x1.2a591bfffa017p7 -0x1.42aaaaaaaaaaap6 +REG epsg:3294 2 0x1.5da6e40005fe9p7 -0x1.42aaaaaaaaaaap6 +REG epsg:3294 3 0x1.2a591bfffa017p7 -0x1.2d55555555556p6 +REG epsg:3294 4 0x1.5da6e40005fe9p7 -0x1.2d55555555556p6 +REG epsg:3296 0 -0x1.32p7 -0x1.9p4 +REG epsg:3296 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:3296 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:3296 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:3296 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:3297 0 -0x1.26p7 -0x1.9p4 +REG epsg:3297 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:3297 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:3297 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:3297 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:3298 0 -0x1.1ap7 -0x1.9p4 +REG epsg:3298 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:3298 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:3298 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:3298 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:3299 0 -0x1.0ep7 -0x1.9p4 +REG epsg:3299 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:3299 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:3299 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:3299 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:3300 0 0x1.8p4 0x1.d3674efdabf16p5 +REG epsg:3300 1 0x1.4883ca579082p4 0x1.c4e097a3ae7ebp5 +REG epsg:3300 2 0x1.b77c35a86f7ep4 0x1.c4e097a3ae7ebp5 +REG epsg:3300 3 0x1.4883ca579082p4 0x1.e1ee0657a9641p5 +REG epsg:3300 4 0x1.b77c35a86f7ep4 0x1.e1ee0657a9641p5 +REG epsg:3301 0 0x1.8p4 0x1.d3674efdabf16p5 +REG epsg:3301 1 0x1.4883ca579082p4 0x1.c4e097a3ae7ebp5 +REG epsg:3301 2 0x1.b77c35a86f7ep4 0x1.c4e097a3ae7ebp5 +REG epsg:3301 3 0x1.4883ca579082p4 0x1.e1ee0657a9641p5 +REG epsg:3301 4 0x1.b77c35a86f7ep4 0x1.e1ee0657a9641p5 +REG epsg:3302 0 -0x1.1ap7 -0x1.9p4 +REG epsg:3302 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:3302 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:3302 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:3302 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:3303 0 -0x1.1ap7 -0x1.9p4 +REG epsg:3303 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:3303 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:3303 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:3303 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:3304 0 -0x1.26p7 -0x1.9p4 +REG epsg:3304 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:3304 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:3304 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:3304 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:3305 0 -0x1.26p7 -0x1.9p4 +REG epsg:3305 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:3305 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:3305 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:3305 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:3306 0 -0x1.32p7 -0x1.9p4 +REG epsg:3306 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:3306 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:3306 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:3306 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:3307 0 0x1.98p5 0x0.0p0 +REG epsg:3307 1 0x1.7p5 -0x1.4p2 +REG epsg:3307 2 0x1.cp5 -0x1.4p2 +REG epsg:3307 3 0x1.7p5 0x1.4p2 +REG epsg:3307 4 0x1.cp5 0x1.4p2 +REG epsg:3308 0 0x1.26p7 -0x1.0ap5 +REG epsg:3308 1 0x1.1a0ad8cb2ee1cp7 -0x1.32p5 +REG epsg:3308 2 0x1.31f52734d11e4p7 -0x1.32p5 +REG epsg:3308 3 0x1.1a0ad8cb2ee1cp7 -0x1.c4p4 +REG epsg:3308 4 0x1.31f52734d11e4p7 -0x1.c4p4 +REG epsg:3309 0 -0x1.ep6 0x1.44p4 +REG epsg:3309 1 -0x1.0ff9f6a5b5901p7 0x1.5p2 +REG epsg:3309 2 -0x1.a00c12b494dfdp6 0x1.5p2 +REG epsg:3309 3 -0x1.0ff9f6a5b5901p7 0x1.1ap5 +REG epsg:3309 4 -0x1.a00c12b494dfdp6 0x1.1ap5 +REG epsg:3310 0 -0x1.ep6 0x1.44p4 +REG epsg:3310 1 -0x1.0ff9f6a5b5901p7 0x1.5p2 +REG epsg:3310 2 -0x1.a00c12b494dfdp6 0x1.5p2 +REG epsg:3310 3 -0x1.0ff9f6a5b5901p7 0x1.1ap5 +REG epsg:3310 4 -0x1.a00c12b494dfdp6 0x1.1ap5 +REG epsg:3311 0 -0x1.ep6 0x1.44p4 +REG epsg:3311 1 -0x1.0ff9f6a5b5901p7 0x1.5p2 +REG epsg:3311 2 -0x1.a00c12b494dfdp6 0x1.5p2 +REG epsg:3311 3 -0x1.0ff9f6a5b5901p7 0x1.1ap5 +REG epsg:3311 4 -0x1.a00c12b494dfdp6 0x1.1ap5 +REG epsg:3312 0 -0x1.c8p5 0x0.0p0 +REG epsg:3312 1 -0x1.fp5 -0x1.4p2 +REG epsg:3312 2 -0x1.ap5 -0x1.4p2 +REG epsg:3312 3 -0x1.fp5 0x1.4p2 +REG epsg:3312 4 -0x1.ap5 0x1.4p2 +REG epsg:3313 0 -0x1.c8p5 0x0.0p0 +REG epsg:3313 1 -0x1.fp5 -0x1.4p2 +REG epsg:3313 2 -0x1.ap5 -0x1.4p2 +REG epsg:3313 3 -0x1.fp5 0x1.4p2 +REG epsg:3313 4 -0x1.ap5 0x1.4p2 +REG epsg:3314 0 0x1.ap4 -0x1.7p2 +REG epsg:3314 1 0x1.ce2398df29273p3 -0x1.14p4 +REG epsg:3314 2 0x1.2c7719c835b63p5 -0x1.14p4 +REG epsg:3314 3 0x1.ce2398df29273p3 0x1.7p2 +REG epsg:3314 4 0x1.2c7719c835b63p5 0x1.7p2 +REG epsg:3315 0 0x1.ap4 -0x1.2p3 +REG epsg:3315 1 0x1.4f00b6d76p4 -0x1.cp3 +REG epsg:3315 2 0x1.f0ff4928ap4 -0x1.cp3 +REG epsg:3315 3 0x1.4f00b6d76p4 -0x1.0p2 +REG epsg:3315 4 0x1.f0ff4928ap4 -0x1.0p2 +REG epsg:3316 0 0x1.6p4 0x0.0p0 +REG epsg:3316 1 0x1.1p4 -0x1.4p2 +REG epsg:3316 2 0x1.bp4 -0x1.4p2 +REG epsg:3316 3 0x1.1p4 0x1.4p2 +REG epsg:3316 4 0x1.bp4 0x1.4p2 +REG epsg:3317 0 0x1.8p4 0x0.0p0 +REG epsg:3317 1 0x1.3p4 -0x1.4p2 +REG epsg:3317 2 0x1.dp4 -0x1.4p2 +REG epsg:3317 3 0x1.3p4 0x1.4p2 +REG epsg:3317 4 0x1.dp4 0x1.4p2 +REG epsg:3318 0 0x1.8p3 0x0.0p0 +REG epsg:3318 1 0x1.cp2 -0x1.4p2 +REG epsg:3318 2 0x1.1p4 -0x1.4p2 +REG epsg:3318 3 0x1.cp2 0x1.4p2 +REG epsg:3318 4 0x1.1p4 0x1.4p2 +REG epsg:3319 0 0x1.cp3 0x0.0p0 +REG epsg:3319 1 0x1.2p3 -0x1.4p2 +REG epsg:3319 2 0x1.3p4 -0x1.4p2 +REG epsg:3319 3 0x1.2p3 0x1.4p2 +REG epsg:3319 4 0x1.3p4 0x1.4p2 +REG epsg:3320 0 0x1.0p4 0x0.0p0 +REG epsg:3320 1 0x1.6p3 -0x1.4p2 +REG epsg:3320 2 0x1.5p4 -0x1.4p2 +REG epsg:3320 3 0x1.6p3 0x1.4p2 +REG epsg:3320 4 0x1.5p4 0x1.4p2 +REG epsg:3321 0 0x1.2p4 0x0.0p0 +REG epsg:3321 1 0x1.ap3 -0x1.4p2 +REG epsg:3321 2 0x1.7p4 -0x1.4p2 +REG epsg:3321 3 0x1.ap3 0x1.4p2 +REG epsg:3321 4 0x1.7p4 0x1.4p2 +REG epsg:3322 0 0x1.4p4 0x0.0p0 +REG epsg:3322 1 0x1.ep3 -0x1.4p2 +REG epsg:3322 2 0x1.9p4 -0x1.4p2 +REG epsg:3322 3 0x1.ep3 0x1.4p2 +REG epsg:3322 4 0x1.9p4 0x1.4p2 +REG epsg:3323 0 0x1.6p4 0x0.0p0 +REG epsg:3323 1 0x1.1p4 -0x1.4p2 +REG epsg:3323 2 0x1.bp4 -0x1.4p2 +REG epsg:3323 3 0x1.1p4 0x1.4p2 +REG epsg:3323 4 0x1.bp4 0x1.4p2 +REG epsg:3324 0 0x1.8p4 0x0.0p0 +REG epsg:3324 1 0x1.3p4 -0x1.4p2 +REG epsg:3324 2 0x1.dp4 -0x1.4p2 +REG epsg:3324 3 0x1.3p4 0x1.4p2 +REG epsg:3324 4 0x1.dp4 0x1.4p2 +REG epsg:3325 0 0x1.ap4 0x0.0p0 +REG epsg:3325 1 0x1.5p4 -0x1.4p2 +REG epsg:3325 2 0x1.fp4 -0x1.4p2 +REG epsg:3325 3 0x1.5p4 0x1.4p2 +REG epsg:3325 4 0x1.fp4 0x1.4p2 +REG epsg:3326 0 0x1.cp4 0x0.0p0 +REG epsg:3326 1 0x1.7p4 -0x1.4p2 +REG epsg:3326 2 0x1.08p5 -0x1.4p2 +REG epsg:3326 3 0x1.7p4 0x1.4p2 +REG epsg:3326 4 0x1.08p5 0x1.4p2 +REG epsg:3327 0 0x1.ep4 0x0.0p0 +REG epsg:3327 1 0x1.9p4 -0x1.4p2 +REG epsg:3327 2 0x1.18p5 -0x1.4p2 +REG epsg:3327 3 0x1.9p4 0x1.4p2 +REG epsg:3327 4 0x1.18p5 0x1.4p2 +REG epsg:3328 0 0x1.32aaaaaaaaaacp4 0x1.a155555555554p5 +REG epsg:3328 1 0x1.607a59f58c412p3 0x1.7955555555554p5 +REG epsg:3328 2 0x1.b518285a8f34fp4 0x1.7955555555554p5 +REG epsg:3328 3 0x1.607a59f58c412p3 0x1.c955555555554p5 +REG epsg:3328 4 0x1.b518285a8f34fp4 0x1.c955555555554p5 +REG epsg:3329 0 0x1.ep3 0x0.0p0 +REG epsg:3329 1 0x1.4p3 -0x1.4p2 +REG epsg:3329 2 0x1.4p4 -0x1.4p2 +REG epsg:3329 3 0x1.4p3 0x1.4p2 +REG epsg:3329 4 0x1.4p4 0x1.4p2 +REG epsg:3330 0 0x1.2p4 0x0.0p0 +REG epsg:3330 1 0x1.ap3 -0x1.4p2 +REG epsg:3330 2 0x1.7p4 -0x1.4p2 +REG epsg:3330 3 0x1.ap3 0x1.4p2 +REG epsg:3330 4 0x1.7p4 0x1.4p2 +REG epsg:3331 0 0x1.5p4 0x0.0p0 +REG epsg:3331 1 0x1.0p4 -0x1.4p2 +REG epsg:3331 2 0x1.ap4 -0x1.4p2 +REG epsg:3331 3 0x1.0p4 0x1.4p2 +REG epsg:3331 4 0x1.ap4 0x1.4p2 +REG epsg:3332 0 0x1.8p4 0x0.0p0 +REG epsg:3332 1 0x1.3p4 -0x1.4p2 +REG epsg:3332 2 0x1.dp4 -0x1.4p2 +REG epsg:3332 3 0x1.3p4 0x1.4p2 +REG epsg:3332 4 0x1.dp4 0x1.4p2 +REG epsg:3333 0 0x1.ep3 0x0.0p0 +REG epsg:3333 1 0x1.4p3 -0x1.4p2 +REG epsg:3333 2 0x1.4p4 -0x1.4p2 +REG epsg:3333 3 0x1.4p3 0x1.4p2 +REG epsg:3333 4 0x1.4p4 0x1.4p2 +REG epsg:3334 0 0x1.5p4 0x0.0p0 +REG epsg:3334 1 0x1.0p4 -0x1.4p2 +REG epsg:3334 2 0x1.ap4 -0x1.4p2 +REG epsg:3334 3 0x1.0p4 0x1.4p2 +REG epsg:3334 4 0x1.ap4 0x1.4p2 +REG epsg:3335 0 0x1.bp4 0x0.0p0 +REG epsg:3335 1 0x1.6p4 -0x1.4p2 +REG epsg:3335 2 0x1.0p5 -0x1.4p2 +REG epsg:3335 3 0x1.6p4 0x1.4p2 +REG epsg:3335 4 0x1.0p5 0x1.4p2 +REG epsg:3336 0 0x1.14p6 -0x1.9p4 +REG epsg:3336 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:3336 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:3336 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:3336 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:3337 0 0x1.cc2cb40abd997p5 -0x1.431f01234567ap4 +REG epsg:3337 1 0x1.a18df0792ae77p5 -0x1.931f01234567ap4 +REG epsg:3337 2 0x1.f6cb779c504b7p5 -0x1.931f01234567ap4 +REG epsg:3337 3 0x1.a18df0792ae77p5 -0x1.e63e02468acf4p3 +REG epsg:3337 4 0x1.f6cb779c504b7p5 -0x1.e63e02468acf4p3 +REG epsg:3338 0 -0x1.34p7 0x1.ccp5 +REG epsg:3338 1 0x1.642a4c850f0f1p7 0x1.54p5 +REG epsg:3338 2 -0x1.f854990a1e1e2p6 0x1.54p5 +REG epsg:3338 3 0x1.642a4c850f0f1p7 0x1.22p6 +REG epsg:3338 4 -0x1.f854990a1e1e2p6 0x1.22p6 +REG epsg:3339 0 0x1.8p3 0x0.0p0 +REG epsg:3339 1 0x1.cp2 -0x1.4p2 +REG epsg:3339 2 0x1.1p4 -0x1.4p2 +REG epsg:3339 3 0x1.cp2 0x1.4p2 +REG epsg:3339 4 0x1.1p4 0x1.4p2 +REG epsg:3340 0 0x1.cp3 0x0.0p0 +REG epsg:3340 1 0x1.2p3 -0x1.4p2 +REG epsg:3340 2 0x1.3p4 -0x1.4p2 +REG epsg:3340 3 0x1.2p3 0x1.4p2 +REG epsg:3340 4 0x1.3p4 0x1.4p2 +REG epsg:3341 0 0x1.0p4 0x0.0p0 +REG epsg:3341 1 0x1.6p3 -0x1.4p2 +REG epsg:3341 2 0x1.5p4 -0x1.4p2 +REG epsg:3341 3 0x1.6p3 0x1.4p2 +REG epsg:3341 4 0x1.5p4 0x1.4p2 +REG epsg:3342 0 0x1.ep3 -0x1.9p4 +REG epsg:3342 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:3342 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:3342 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:3342 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:3343 0 -0x1.ep3 0x0.0p0 +REG epsg:3343 1 -0x1.4p4 -0x1.4p2 +REG epsg:3343 2 -0x1.4p3 -0x1.4p2 +REG epsg:3343 3 -0x1.4p4 0x1.4p2 +REG epsg:3343 4 -0x1.4p3 0x1.4p2 +REG epsg:3344 0 -0x1.2p3 0x0.0p0 +REG epsg:3344 1 -0x1.cp3 -0x1.4p2 +REG epsg:3344 2 -0x1.0p2 -0x1.4p2 +REG epsg:3344 3 -0x1.cp3 0x1.4p2 +REG epsg:3344 4 -0x1.0p2 0x1.4p2 +REG epsg:3345 0 -0x1.8p1 0x0.0p0 +REG epsg:3345 1 -0x1.0p3 -0x1.4p2 +REG epsg:3345 2 0x1.0p1 -0x1.4p2 +REG epsg:3345 3 -0x1.0p3 0x1.4p2 +REG epsg:3345 4 0x1.0p1 0x1.4p2 +REG epsg:3346 0 0x1.8p4 0x0.0p0 +REG epsg:3346 1 0x1.3p4 -0x1.4p2 +REG epsg:3346 2 0x1.dp4 -0x1.4p2 +REG epsg:3346 3 0x1.3p4 0x1.4p2 +REG epsg:3346 4 0x1.dp4 0x1.4p2 +REG epsg:3347 0 -0x1.6f77777777777p6 0x1.f8p5 +REG epsg:3347 1 -0x1.f3a0c615d61b7p6 0x1.8p5 +REG epsg:3347 2 -0x1.d69c51b231a6ep5 0x1.8p5 +REG epsg:3347 3 -0x1.f3a0c615d61b7p6 0x1.38p6 +REG epsg:3347 4 -0x1.d69c51b231a6ep5 0x1.38p6 +REG epsg:3348 0 -0x1.6f77777777777p6 0x1.f8p5 +REG epsg:3348 1 -0x1.f3a0c615d61b7p6 0x1.8p5 +REG epsg:3348 2 -0x1.d69c51b231a6ep5 0x1.8p5 +REG epsg:3348 3 -0x1.f3a0c615d61b7p6 0x1.38p6 +REG epsg:3348 4 -0x1.d69c51b231a6ep5 0x1.38p6 +REG epsg:3349 0 -0x1.2cp7 0x0.0p0 +REG epsg:3349 1 -0x1.36p7 -0x1.4p2 +REG epsg:3349 2 -0x1.22p7 -0x1.4p2 +REG epsg:3349 3 -0x1.36p7 0x1.4p2 +REG epsg:3349 4 -0x1.22p7 0x1.4p2 +REG epsg:3350 0 0x1.5f33333333333p4 0x1.999999999999ap-4 +REG epsg:3350 1 0x1.0f332b36f1cb2p4 -0x1.399999999999ap2 +REG epsg:3350 2 0x1.af333b2f749b4p4 -0x1.399999999999ap2 +REG epsg:3350 3 0x1.0f332b36f1cb2p4 0x1.4666666666666p2 +REG epsg:3350 4 0x1.af333b2f749b4p4 0x1.4666666666666p2 +REG epsg:3351 0 0x1.8f33333333333p4 0x1.999999999999ap-4 +REG epsg:3351 1 0x1.3f332b36f1cb2p4 -0x1.399999999999ap2 +REG epsg:3351 2 0x1.df333b2f749b4p4 -0x1.399999999999ap2 +REG epsg:3351 3 0x1.3f332b36f1cb2p4 0x1.4666666666666p2 +REG epsg:3351 4 0x1.df333b2f749b4p4 0x1.4666666666666p2 +REG epsg:3352 0 0x1.bf33333333333p4 0x1.999999999999ap-4 +REG epsg:3352 1 0x1.6f332b36f1cb2p4 -0x1.399999999999ap2 +REG epsg:3352 2 0x1.07999d97ba4dap5 -0x1.399999999999ap2 +REG epsg:3352 3 0x1.6f332b36f1cb2p4 0x1.4666666666666p2 +REG epsg:3352 4 0x1.07999d97ba4dap5 0x1.4666666666666p2 +REG epsg:3353 0 0x1.2p3 -0x1.9p4 +REG epsg:3353 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:3353 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:3353 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:3353 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:3354 0 0x1.2p3 -0x1.9p4 +REG epsg:3354 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG epsg:3354 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG epsg:3354 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG epsg:3354 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG epsg:3355 0 0x1.fp4 0x1.ep4 +REG epsg:3355 1 0x1.939fbba42f007p4 0x1.9p4 +REG epsg:3355 2 0x1.2630222de87fcp5 0x1.9p4 +REG epsg:3355 3 0x1.939fbba42f007p4 0x1.18p5 +REG epsg:3355 4 0x1.2630222de87fcp5 0x1.18p5 +REG epsg:3356 0 -0x1.44p6 0x0.0p0 +REG epsg:3356 1 -0x1.58p6 -0x1.4p2 +REG epsg:3356 2 -0x1.3p6 -0x1.4p2 +REG epsg:3356 3 -0x1.58p6 0x1.4p2 +REG epsg:3356 4 -0x1.3p6 0x1.4p2 +REG epsg:3357 0 -0x1.44p6 0x0.0p0 +REG epsg:3357 1 -0x1.58p6 -0x1.4p2 +REG epsg:3357 2 -0x1.3p6 -0x1.4p2 +REG epsg:3357 3 -0x1.58p6 0x1.4p2 +REG epsg:3357 4 -0x1.3p6 0x1.4p2 +REG epsg:3358 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:3358 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:3358 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:3358 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:3358 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3359 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:3359 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:3359 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:3359 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:3359 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3360 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:3360 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:3360 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:3360 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:3360 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:3361 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:3361 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:3361 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:3361 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:3361 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:3362 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:3362 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:3362 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:3362 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3362 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3363 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:3363 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:3363 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:3363 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3363 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3364 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:3364 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:3364 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:3364 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:3364 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:3365 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:3365 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:3365 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:3365 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:3365 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:3366 0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 +REG epsg:3366 1 0x1.b3187ac81cd3bp6 0x1.14fe7f85aa87dp4 +REG epsg:3366 2 0x1.de5533c0e0377p6 0x1.14fe7f85aa87dp4 +REG epsg:3366 3 0x1.b3187ac81cd3bp6 0x1.b4fe7f85aa87dp4 +REG epsg:3366 4 0x1.de5533c0e0377p6 0x1.b4fe7f85aa87dp4 +REG epsg:3367 0 -0x1.ep3 0x0.0p0 +REG epsg:3367 1 -0x1.4p4 -0x1.4p2 +REG epsg:3367 2 -0x1.4p3 -0x1.4p2 +REG epsg:3367 3 -0x1.4p4 0x1.4p2 +REG epsg:3367 4 -0x1.4p3 0x1.4p2 +REG epsg:3368 0 -0x1.2p3 0x0.0p0 +REG epsg:3368 1 -0x1.cp3 -0x1.4p2 +REG epsg:3368 2 -0x1.0p2 -0x1.4p2 +REG epsg:3368 3 -0x1.cp3 0x1.4p2 +REG epsg:3368 4 -0x1.0p2 0x1.4p2 +REG epsg:3369 0 -0x1.8p1 0x0.0p0 +REG epsg:3369 1 -0x1.0p3 -0x1.4p2 +REG epsg:3369 2 0x1.0p1 -0x1.4p2 +REG epsg:3369 3 -0x1.0p3 0x1.4p2 +REG epsg:3369 4 0x1.0p1 0x1.4p2 +REG epsg:3370 0 0x1.56p7 0x1.68p5 +REG epsg:3370 1 0x1.47db9cfff07aap7 0x1.4p5 +REG epsg:3370 2 0x1.642463000f856p7 0x1.4p5 +REG epsg:3370 3 0x1.47db9cfff07aap7 0x1.9p5 +REG epsg:3370 4 0x1.642463000f856p7 0x1.9p5 +REG epsg:3371 0 0x1.62p7 0x1.68p5 +REG epsg:3371 1 0x1.53db9cfff07aap7 0x1.4p5 +REG epsg:3371 2 -0x1.5fdb9cfff07aap7 0x1.4p5 +REG epsg:3371 3 0x1.53db9cfff07aap7 0x1.9p5 +REG epsg:3371 4 -0x1.5fdb9cfff07aap7 0x1.9p5 +REG epsg:3372 0 0x1.56p7 0x1.68p5 +REG epsg:3372 1 0x1.47db9cfff07aap7 0x1.4p5 +REG epsg:3372 2 0x1.642463000f856p7 0x1.4p5 +REG epsg:3372 3 0x1.47db9cfff07aap7 0x1.9p5 +REG epsg:3372 4 0x1.642463000f856p7 0x1.9p5 +REG epsg:3373 0 0x1.62p7 0x1.68p5 +REG epsg:3373 1 0x1.53db9cfff07aap7 0x1.4p5 +REG epsg:3373 2 -0x1.5fdb9cfff07aap7 0x1.4p5 +REG epsg:3373 3 0x1.53db9cfff07aap7 0x1.9p5 +REG epsg:3373 4 -0x1.5fdb9cfff07aap7 0x1.9p5 +REG epsg:3374 0 -0x1.2p3 0x0.0p0 +REG epsg:3374 1 -0x1.cp3 -0x1.4p2 +REG epsg:3374 2 -0x1.0p2 -0x1.4p2 +REG epsg:3374 3 -0x1.cp3 0x1.4p2 +REG epsg:3374 4 -0x1.0p2 0x1.4p2 +REG epsg:3375 0 0x1.99p6 0x1.0p2 +REG epsg:3375 1 0x1.84f37f5af8062p6 -0x1.0p0 +REG epsg:3375 2 0x1.ad0c80a507f9ep6 -0x1.0p0 +REG epsg:3375 3 0x1.84f37f5af8062p6 0x1.2p3 +REG epsg:3375 4 0x1.ad0c80a507f9ep6 0x1.2p3 +REG epsg:3376 0 0x1.ccp6 0x1.0p2 +REG epsg:3376 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG epsg:3376 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG epsg:3376 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG epsg:3376 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG epsg:3377 0 0x1.9db634eaab7b6p6 0x1.0f9333ad7cbd6p1 +REG epsg:3377 1 0x1.89b2b1bec4b1ap6 -0x1.706ccc528342ap1 +REG epsg:3377 2 0x1.b1b9b81692452p6 -0x1.706ccc528342ap1 +REG epsg:3377 3 0x1.89b2b1bec4b1ap6 0x1.c7c999d6be5ebp2 +REG epsg:3377 4 0x1.b1b9b81692452p6 0x1.c7c999d6be5ebp2 +REG epsg:3378 0 0x1.97e64d81daa7fp6 0x1.57572ad6ccd11p1 +REG epsg:3378 1 0x1.83e0afd456199p6 -0x1.28a8d529332efp1 +REG epsg:3378 2 0x1.abebeb2f5f365p6 -0x1.28a8d529332efp1 +REG epsg:3378 3 0x1.83e0afd456199p6 0x1.ebab956b66688p2 +REG epsg:3378 4 0x1.abebeb2f5f365p6 0x1.ebab956b66688p2 +REG epsg:3379 0 0x1.9979235e62443p6 0x1.e27b4f13dad81p1 +REG epsg:3379 1 0x1.856e09c94fcc4p6 -0x1.3b0961d84a4fep0 +REG epsg:3379 2 0x1.ad843cf374bc2p6 -0x1.3b0961d84a4fep0 +REG epsg:3379 3 0x1.856e09c94fcc4p6 0x1.189ed3c4f6b6p3 +REG epsg:3379 4 0x1.ad843cf374bc2p6 0x1.189ed3c4f6b6p3 +REG epsg:3380 0 0x1.958e724e13121p6 0x1.d7a2947f7e656p1 +REG epsg:3380 1 0x1.8183d74457a83p6 -0x1.50bad70103354p0 +REG epsg:3380 2 0x1.a9990d57ce7bfp6 -0x1.50bad70103354p0 +REG epsg:3380 3 0x1.8183d74457a83p6 0x1.15e8a51fdf996p3 +REG epsg:3380 4 0x1.a9990d57ce7bfp6 0x1.15e8a51fdf996p3 +REG epsg:3381 0 0x1.9c47f6555c52ep6 0x1.3e7b74eb64679p2 +REG epsg:3381 1 0x1.8834972050414p6 -0x1.848b149b987p-6 +REG epsg:3381 2 0x1.b05b558a68648p6 -0x1.848b149b987p-6 +REG epsg:3381 3 0x1.8834972050414p6 0x1.3f3dba75b233cp3 +REG epsg:3381 4 0x1.b05b558a68648p6 0x1.3f3dba75b233cp3 +REG epsg:3382 0 0x1.9160a45ad5983p6 0x1.5afa24b609838p2 +REG epsg:3382 1 0x1.7d49a291b6babp6 0x1.afa24b609838p-2 +REG epsg:3382 2 0x1.a577a623f475bp6 0x1.afa24b609838p-2 +REG epsg:3382 3 0x1.7d49a291b6babp6 0x1.4d7d125b04c1cp3 +REG epsg:3382 4 0x1.a577a623f475bp6 0x1.4d7d125b04c1cp3 +REG epsg:3383 0 0x1.928ba4de595d9p6 0x1.7dbd329f5fc41p2 +REG epsg:3383 1 0x1.7e6fc63594668p6 0x1.ede994fafe208p-1 +REG epsg:3383 2 0x1.a6a783871e54ap6 0x1.ede994fafe208p-1 +REG epsg:3383 3 0x1.7e6fc63594668p6 0x1.5ede994fafe2p3 +REG epsg:3383 4 0x1.a6a783871e54ap6 0x1.5ede994fafe2p3 +REG epsg:3384 0 0x1.9342fafe20a33p6 0x1.36fae378696e7p2 +REG epsg:3384 1 0x1.7f30835e077a6p6 -0x1.20a390f2d232p-3 +REG epsg:3384 2 0x1.a755729e39ccp6 -0x1.20a390f2d232p-3 +REG epsg:3384 3 0x1.7f30835e077a6p6 0x1.3b7d71bc34b74p3 +REG epsg:3384 4 0x1.a755729e39ccp6 0x1.3b7d71bc34b74p3 +REG epsg:3385 0 0x1.992e53d50ab87p6 0x1.7e3e27c19e53dp2 +REG epsg:3385 1 0x1.8512623ec12e8p6 0x1.f1f13e0cf29e8p-1 +REG epsg:3385 2 0x1.ad4a456b54426p6 0x1.f1f13e0cf29e8p-1 +REG epsg:3385 3 0x1.8512623ec12e8p6 0x1.5f1f13e0cf29ep3 +REG epsg:3385 4 0x1.ad4a456b54426p6 0x1.5f1f13e0cf29ep3 +REG epsg:3386 0 0x1.2p4 0x0.0p0 +REG epsg:3386 1 0x1.ap3 -0x1.4p2 +REG epsg:3386 2 0x1.7p4 -0x1.4p2 +REG epsg:3386 3 0x1.ap3 0x1.4p2 +REG epsg:3386 4 0x1.7p4 0x1.4p2 +REG epsg:3387 0 0x1.08p5 0x0.0p0 +REG epsg:3387 1 0x1.cp4 -0x1.4p2 +REG epsg:3387 2 0x1.3p5 -0x1.4p2 +REG epsg:3387 3 0x1.cp4 0x1.4p2 +REG epsg:3387 4 0x1.3p5 0x1.4p2 +REG epsg:3388 0 0x1.98p5 0x1.5p5 +REG epsg:3388 1 0x1.622cb8898c894p5 0x1.28p5 +REG epsg:3388 2 0x1.cdd347767376cp5 0x1.28p5 +REG epsg:3388 3 0x1.622cb8898c894p5 0x1.78p5 +REG epsg:3388 4 0x1.cdd347767376cp5 0x1.78p5 +REG epsg:3389 0 -0x1.68p7 0x0.0p0 +REG epsg:3389 1 0x1.5ep7 -0x1.4p2 +REG epsg:3389 2 -0x1.5ep7 -0x1.4p2 +REG epsg:3389 3 0x1.5ep7 0x1.4p2 +REG epsg:3389 4 -0x1.5ep7 0x1.4p2 +REG epsg:3390 0 -0x1.68p7 0x0.0p0 +REG epsg:3390 1 0x1.5ep7 -0x1.4p2 +REG epsg:3390 2 -0x1.5ep7 -0x1.4p2 +REG epsg:3390 3 0x1.5ep7 0x1.4p2 +REG epsg:3390 4 -0x1.5ep7 0x1.4p2 +REG epsg:3391 0 0x1.38p5 0x0.0p0 +REG epsg:3391 1 0x1.1p5 -0x1.4p2 +REG epsg:3391 2 0x1.6p5 -0x1.4p2 +REG epsg:3391 3 0x1.1p5 0x1.4p2 +REG epsg:3391 4 0x1.6p5 0x1.4p2 +REG epsg:3392 0 0x1.68p5 0x0.0p0 +REG epsg:3392 1 0x1.4p5 -0x1.4p2 +REG epsg:3392 2 0x1.9p5 -0x1.4p2 +REG epsg:3392 3 0x1.4p5 0x1.4p2 +REG epsg:3392 4 0x1.9p5 0x1.4p2 +REG epsg:3393 0 0x1.98p5 0x0.0p0 +REG epsg:3393 1 0x1.7p5 -0x1.4p2 +REG epsg:3393 2 0x1.cp5 -0x1.4p2 +REG epsg:3393 3 0x1.7p5 0x1.4p2 +REG epsg:3393 4 0x1.cp5 0x1.4p2 +REG epsg:3394 0 0x1.68p5 0x1.04p5 +REG epsg:3394 1 0x1.38928b4db1cbap5 0x1.b8p4 +REG epsg:3394 2 0x1.976d74b24e346p5 0x1.b8p4 +REG epsg:3394 3 0x1.38928b4db1cbap5 0x1.2cp5 +REG epsg:3394 4 0x1.976d74b24e346p5 0x1.2cp5 +REG epsg:3395 0 0x0.0p0 0x0.0p0 +REG epsg:3395 1 -0x1.4p2 -0x1.4p2 +REG epsg:3395 2 0x1.4p2 -0x1.4p2 +REG epsg:3395 3 -0x1.4p2 0x1.4p2 +REG epsg:3395 4 0x1.4p2 0x1.4p2 +REG epsg:3396 0 0x1.2p3 0x0.0p0 +REG epsg:3396 1 0x1.0p2 -0x1.4p2 +REG epsg:3396 2 0x1.cp3 -0x1.4p2 +REG epsg:3396 3 0x1.0p2 0x1.4p2 +REG epsg:3396 4 0x1.cp3 0x1.4p2 +REG epsg:3397 0 0x1.8p3 0x0.0p0 +REG epsg:3397 1 0x1.cp2 -0x1.4p2 +REG epsg:3397 2 0x1.1p4 -0x1.4p2 +REG epsg:3397 3 0x1.cp2 0x1.4p2 +REG epsg:3397 4 0x1.1p4 0x1.4p2 +REG epsg:3398 0 0x1.8p3 0x0.0p0 +REG epsg:3398 1 0x1.cp2 -0x1.4p2 +REG epsg:3398 2 0x1.1p4 -0x1.4p2 +REG epsg:3398 3 0x1.cp2 0x1.4p2 +REG epsg:3398 4 0x1.1p4 0x1.4p2 +REG epsg:3399 0 0x1.ep3 0x0.0p0 +REG epsg:3399 1 0x1.4p3 -0x1.4p2 +REG epsg:3399 2 0x1.4p4 -0x1.4p2 +REG epsg:3399 3 0x1.4p3 0x1.4p2 +REG epsg:3399 4 0x1.4p4 0x1.4p2 +REG epsg:3400 0 -0x1.ccp6 0x0.0p0 +REG epsg:3400 1 -0x1.ep6 -0x1.4p2 +REG epsg:3400 2 -0x1.b8p6 -0x1.4p2 +REG epsg:3400 3 -0x1.ep6 0x1.4p2 +REG epsg:3400 4 -0x1.b8p6 0x1.4p2 +REG epsg:3401 0 -0x1.ccp6 0x0.0p0 +REG epsg:3401 1 -0x1.ep6 -0x1.4p2 +REG epsg:3401 2 -0x1.b8p6 -0x1.4p2 +REG epsg:3401 3 -0x1.ep6 0x1.4p2 +REG epsg:3401 4 -0x1.b8p6 0x1.4p2 +REG epsg:3402 0 -0x1.ccp6 0x0.0p0 +REG epsg:3402 1 -0x1.ep6 -0x1.4p2 +REG epsg:3402 2 -0x1.b8p6 -0x1.4p2 +REG epsg:3402 3 -0x1.ep6 0x1.4p2 +REG epsg:3402 4 -0x1.b8p6 0x1.4p2 +REG epsg:3403 0 -0x1.ccp6 0x0.0p0 +REG epsg:3403 1 -0x1.ep6 -0x1.4p2 +REG epsg:3403 2 -0x1.b8p6 -0x1.4p2 +REG epsg:3403 3 -0x1.ep6 0x1.4p2 +REG epsg:3403 4 -0x1.b8p6 0x1.4p2 +REG epsg:3404 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:3404 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:3404 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:3404 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:3404 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3405 0 0x1.a4p6 0x0.0p0 +REG epsg:3405 1 0x1.9p6 -0x1.4p2 +REG epsg:3405 2 0x1.b8p6 -0x1.4p2 +REG epsg:3405 3 0x1.9p6 0x1.4p2 +REG epsg:3405 4 0x1.b8p6 0x1.4p2 +REG epsg:3406 0 0x1.bcp6 0x0.0p0 +REG epsg:3406 1 0x1.a8p6 -0x1.4p2 +REG epsg:3406 2 0x1.dp6 -0x1.4p2 +REG epsg:3406 3 0x1.a8p6 0x1.4p2 +REG epsg:3406 4 0x1.dp6 0x1.4p2 +REG epsg:3407 0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 +REG epsg:3407 1 0x1.b3187ac81cd3bp6 0x1.14fe7f85aa87dp4 +REG epsg:3407 2 0x1.de5533c0e0377p6 0x1.14fe7f85aa87dp4 +REG epsg:3407 3 0x1.b3187ac81cd3bp6 0x1.b4fe7f85aa87dp4 +REG epsg:3407 4 0x1.de5533c0e0377p6 0x1.b4fe7f85aa87dp4 +REG epsg:3408 0 0x0.0p0 0x1.64p6 +REG epsg:3408 1 -0x1.ep5 0x1.54p6 +REG epsg:3408 2 0x1.ep5 0x1.54p6 +REG epsg:3408 3 -0x1.ep5 0x1.64p6 +REG epsg:3408 4 0x1.ep5 0x1.64p6 +REG epsg:3409 0 0x0.0p0 -0x1.64p6 +REG epsg:3409 1 -0x1.ep5 -0x1.64p6 +REG epsg:3409 2 0x1.ep5 -0x1.64p6 +REG epsg:3409 3 -0x1.ep5 -0x1.54p6 +REG epsg:3409 4 0x1.ep5 -0x1.54p6 +REG epsg:3410 0 0x0.0p0 0x1.ep4 +REG epsg:3410 1 -0x1.7181116f43fe3p2 0x1.9p4 +REG epsg:3410 2 0x1.7181116f43fe3p2 0x1.9p4 +REG epsg:3410 3 -0x1.7181116f43fe3p2 0x1.18p5 +REG epsg:3410 4 0x1.7181116f43fe3p2 0x1.18p5 +REG epsg:3411 0 -0x1.68p5 0x1.4p6 +REG epsg:3411 1 -0x1.a4p6 0x1.04p6 +REG epsg:3411 2 0x1.ep3 0x1.04p6 +REG epsg:3411 3 -0x1.a4p6 0x1.64p6 +REG epsg:3411 4 0x1.ep3 0x1.64p6 +REG epsg:3412 0 0x0.0p0 -0x1.4p6 +REG epsg:3412 1 -0x1.ep5 -0x1.64p6 +REG epsg:3412 2 0x1.ep5 -0x1.64p6 +REG epsg:3412 3 -0x1.ep5 -0x1.04p6 +REG epsg:3412 4 0x1.ep5 -0x1.04p6 +REG epsg:3413 0 -0x1.68p5 0x1.4p6 +REG epsg:3413 1 -0x1.a4p6 0x1.04p6 +REG epsg:3413 2 0x1.ep3 0x1.04p6 +REG epsg:3413 3 -0x1.a4p6 0x1.64p6 +REG epsg:3413 4 0x1.ep3 0x1.64p6 +REG epsg:3414 0 0x1.9f55555555553p6 0x1.5dddddddddddfp0 +REG epsg:3414 1 0x1.8b53e05f720abp6 -0x1.d11111111111p1 +REG epsg:3414 2 0x1.b356ca4b389fbp6 -0x1.d11111111111p1 +REG epsg:3414 3 0x1.8b53e05f720abp6 0x1.9777777777778p2 +REG epsg:3414 4 0x1.b356ca4b389fbp6 0x1.9777777777778p2 +REG epsg:3415 0 0x1.c8p6 0x1.5p4 +REG epsg:3415 1 0x1.ae4ae299c950ep6 0x1.ep3 +REG epsg:3415 2 0x1.e1b51d6636af2p6 0x1.ep3 +REG epsg:3415 3 0x1.ae4ae299c950ep6 0x1.bp4 +REG epsg:3415 4 0x1.e1b51d6636af2p6 0x1.bp4 +REG epsg:3416 0 0x1.aaaaaaaaaaaa9p3 0x1.7cp5 +REG epsg:3416 1 0x1.1c9195d1a8502p3 0x1.64p5 +REG epsg:3416 2 0x1.1c61dfc1d6828p4 0x1.64p5 +REG epsg:3416 3 0x1.1c9195d1a8502p3 0x1.94p5 +REG epsg:3416 4 0x1.1c61dfc1d6828p4 0x1.94p5 +REG epsg:3417 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:3417 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:3417 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:3417 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:3417 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:3418 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:3418 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:3418 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:3418 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:3418 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:3419 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:3419 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:3419 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:3419 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:3419 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:3420 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:3420 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3420 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3420 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:3420 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:3421 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:3421 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:3421 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:3421 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:3421 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:3422 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:3422 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:3422 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:3422 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:3422 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:3423 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:3423 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:3423 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:3423 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:3423 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:3424 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:3424 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3424 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3424 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3424 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3425 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:3425 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:3425 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:3425 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:3425 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:3426 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:3426 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:3426 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:3426 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:3426 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:3427 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:3427 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:3427 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:3427 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:3427 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:3428 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:3428 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3428 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3428 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:3428 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:3429 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:3429 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:3429 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:3429 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:3429 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:3430 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:3430 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:3430 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:3430 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:3430 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:3431 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:3431 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:3431 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:3431 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:3431 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:3432 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:3432 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3432 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3432 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3432 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3433 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:3433 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:3433 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:3433 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:3433 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:3434 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:3434 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:3434 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:3434 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:3434 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:3435 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:3435 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:3435 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:3435 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:3435 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:3436 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:3436 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3436 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3436 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:3436 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:3437 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:3437 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:3437 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:3437 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:3437 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:3438 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:3438 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:3438 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:3438 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:3438 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:3439 0 0x1.98p5 0x0.0p0 +REG epsg:3439 1 0x1.7p5 -0x1.4p2 +REG epsg:3439 2 0x1.cp5 -0x1.4p2 +REG epsg:3439 3 0x1.7p5 0x1.4p2 +REG epsg:3439 4 0x1.cp5 0x1.4p2 +REG epsg:3440 0 0x1.c8p5 0x0.0p0 +REG epsg:3440 1 0x1.ap5 -0x1.4p2 +REG epsg:3440 2 0x1.fp5 -0x1.4p2 +REG epsg:3440 3 0x1.ap5 0x1.4p2 +REG epsg:3440 4 0x1.fp5 0x1.4p2 +REG epsg:3441 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:3441 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:3441 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:3441 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:3441 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:3442 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:3442 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:3442 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:3442 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:3442 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:3443 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:3443 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:3443 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:3443 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:3443 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:3444 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:3444 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3444 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3444 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:3444 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:3445 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:3445 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:3445 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:3445 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:3445 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:3446 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:3446 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:3446 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:3446 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:3446 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:3447 0 0x1.16fd646817cfbp2 0x1.94p5 +REG epsg:3447 1 0x1.21ab3723f107cp1 0x1.8955555555558p5 +REG epsg:3447 2 0x1.9d252d3e371b8p2 0x1.8955555555558p5 +REG epsg:3447 3 0x1.21ab3723f107cp1 0x1.9eaaaaaaaaaa8p5 +REG epsg:3447 4 0x1.9d252d3e371b8p2 0x1.9eaaaaaaaaaa8p5 +REG epsg:3448 0 -0x1.34p6 0x1.2p4 +REG epsg:3448 1 -0x1.49077c9109a7dp6 0x1.ap3 +REG epsg:3448 2 -0x1.1ef8836ef6583p6 0x1.ap3 +REG epsg:3448 3 -0x1.49077c9109a7dp6 0x1.7p4 +REG epsg:3448 4 -0x1.1ef8836ef6583p6 0x1.7p4 +REG epsg:3449 0 -0x1.44p6 0x0.0p0 +REG epsg:3449 1 -0x1.58p6 -0x1.4p2 +REG epsg:3449 2 -0x1.3p6 -0x1.4p2 +REG epsg:3449 3 -0x1.58p6 0x1.4p2 +REG epsg:3449 4 -0x1.3p6 0x1.4p2 +REG epsg:3450 0 -0x1.2cp6 0x0.0p0 +REG epsg:3450 1 -0x1.4p6 -0x1.4p2 +REG epsg:3450 2 -0x1.18p6 -0x1.4p2 +REG epsg:3450 3 -0x1.4p6 0x1.4p2 +REG epsg:3450 4 -0x1.18p6 0x1.4p2 +REG epsg:3451 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:3451 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:3451 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:3451 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:3451 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:3452 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:3452 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:3452 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:3452 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:3452 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:3453 0 -0x1.6d55555555555p6 0x1.aaaaaaaaaaaaap4 +REG epsg:3453 1 -0x1.77c7107b1a9e2p6 0x1.8555555555556p4 +REG epsg:3453 2 -0x1.62e39a2f900c8p6 0x1.8555555555556p4 +REG epsg:3453 3 -0x1.77c7107b1a9e2p6 0x1.cfffffffffffep4 +REG epsg:3453 4 -0x1.62e39a2f900c8p6 0x1.cfffffffffffep4 +REG epsg:3454 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:3454 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:3454 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:3454 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:3454 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:3455 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:3455 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:3455 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:3455 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:3455 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:3456 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:3456 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:3456 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:3456 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:3456 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:3457 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:3457 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:3457 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:3457 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:3457 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:3458 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:3458 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:3458 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:3458 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:3458 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:3459 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:3459 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:3459 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:3459 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:3459 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:3460 0 0x1.658p7 -0x1.1p4 +REG epsg:3460 1 0x1.5b0b077351e8bp7 -0x1.6p4 +REG epsg:3460 2 -0x1.600b077351e8bp7 -0x1.6p4 +REG epsg:3460 3 0x1.5b0b077351e8bp7 -0x1.8p3 +REG epsg:3460 4 -0x1.600b077351e8bp7 -0x1.8p3 +REG epsg:3461 0 -0x1.ep3 0x0.0p0 +REG epsg:3461 1 -0x1.4p4 -0x1.4p2 +REG epsg:3461 2 -0x1.4p3 -0x1.4p2 +REG epsg:3461 3 -0x1.4p4 0x1.4p2 +REG epsg:3461 4 -0x1.4p3 0x1.4p2 +REG epsg:3462 0 -0x1.2p3 0x0.0p0 +REG epsg:3462 1 -0x1.cp3 -0x1.4p2 +REG epsg:3462 2 -0x1.0p2 -0x1.4p2 +REG epsg:3462 3 -0x1.cp3 0x1.4p2 +REG epsg:3462 4 -0x1.0p2 0x1.4p2 +REG epsg:3463 0 -0x1.148p6 0x1.5cp5 +REG epsg:3463 1 -0x1.30126c9711abap6 0x1.34p5 +REG epsg:3463 2 -0x1.f1db26d1dca8cp5 0x1.34p5 +REG epsg:3463 3 -0x1.30126c9711abap6 0x1.84p5 +REG epsg:3463 4 -0x1.f1db26d1dca8cp5 0x1.84p5 +REG epsg:3464 0 -0x1.148p6 0x1.5cp5 +REG epsg:3464 1 -0x1.30126c9711abap6 0x1.34p5 +REG epsg:3464 2 -0x1.f1db26d1dca8cp5 0x1.34p5 +REG epsg:3464 3 -0x1.30126c9711abap6 0x1.84p5 +REG epsg:3464 4 -0x1.f1db26d1dca8cp5 0x1.84p5 +REG epsg:3465 0 -0x1.5755555555555p6 0x1.e8p4 +REG epsg:3465 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG epsg:3465 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG epsg:3465 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG epsg:3465 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG epsg:3466 0 -0x1.5ep6 0x1.ep4 +REG epsg:3466 1 -0x1.75181116f43fep6 0x1.9p4 +REG epsg:3466 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG epsg:3466 3 -0x1.75181116f43fep6 0x1.18p5 +REG epsg:3466 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG epsg:3467 0 -0x1.34p7 0x1.ccp5 +REG epsg:3467 1 0x1.642a4c850f0f1p7 0x1.54p5 +REG epsg:3467 2 -0x1.f854990a1e1e2p6 0x1.54p5 +REG epsg:3467 3 0x1.642a4c850f0f1p7 0x1.22p6 +REG epsg:3467 4 -0x1.f854990a1e1e2p6 0x1.22p6 +REG epsg:3468 0 -0x1.0b55555555557p7 0x1.c8p5 +REG epsg:3468 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG epsg:3468 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG epsg:3468 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG epsg:3468 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG epsg:3469 0 -0x1.1cp7 0x1.bp5 +REG epsg:3469 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG epsg:3469 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG epsg:3469 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG epsg:3469 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG epsg:3470 0 -0x1.24p7 0x1.bp5 +REG epsg:3470 1 -0x1.350355070bc27p7 0x1.88p5 +REG epsg:3470 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG epsg:3470 3 -0x1.350355070bc27p7 0x1.d8p5 +REG epsg:3470 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG epsg:3471 0 -0x1.2cp7 0x1.bp5 +REG epsg:3471 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG epsg:3471 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG epsg:3471 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG epsg:3471 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG epsg:3472 0 -0x1.34p7 0x1.bp5 +REG epsg:3472 1 -0x1.450355070bc27p7 0x1.88p5 +REG epsg:3472 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG epsg:3472 3 -0x1.450355070bc27p7 0x1.d8p5 +REG epsg:3472 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG epsg:3473 0 -0x1.3cp7 0x1.bp5 +REG epsg:3473 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG epsg:3473 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG epsg:3473 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG epsg:3473 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG epsg:3474 0 -0x1.44p7 0x1.bp5 +REG epsg:3474 1 -0x1.550355070bc27p7 0x1.88p5 +REG epsg:3474 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG epsg:3474 3 -0x1.550355070bc27p7 0x1.d8p5 +REG epsg:3474 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG epsg:3475 0 -0x1.4cp7 0x1.bp5 +REG epsg:3475 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG epsg:3475 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG epsg:3475 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG epsg:3475 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG epsg:3476 0 -0x1.54p7 0x1.bp5 +REG epsg:3476 1 -0x1.650355070bc27p7 0x1.88p5 +REG epsg:3476 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG epsg:3476 3 -0x1.650355070bc27p7 0x1.d8p5 +REG epsg:3476 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG epsg:3477 0 -0x1.6p7 0x1.a355555555556p5 +REG epsg:3477 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:3477 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:3477 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG epsg:3477 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG epsg:3478 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:3478 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:3478 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:3478 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:3478 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:3479 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:3479 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:3479 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:3479 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:3479 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:3480 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:3480 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:3480 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:3480 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:3480 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:3481 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:3481 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:3481 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:3481 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:3481 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:3482 0 -0x1.c7p6 0x1.fp4 +REG epsg:3482 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:3482 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:3482 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:3482 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:3483 0 -0x1.c7p6 0x1.fp4 +REG epsg:3483 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:3483 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:3483 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:3483 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:3484 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:3484 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:3484 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:3484 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:3484 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:3485 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:3485 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:3485 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:3485 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:3485 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:3486 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:3486 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:3486 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:3486 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:3486 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:3487 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:3487 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:3487 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:3487 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:3487 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:3488 0 -0x1.ep6 0x1.44p4 +REG epsg:3488 1 -0x1.0ff9f6a5b5901p7 0x1.5p2 +REG epsg:3488 2 -0x1.a00c12b494dfdp6 0x1.5p2 +REG epsg:3488 3 -0x1.0ff9f6a5b5901p7 0x1.1ap5 +REG epsg:3488 4 -0x1.a00c12b494dfdp6 0x1.1ap5 +REG epsg:3489 0 -0x1.e8p6 0x1.44p5 +REG epsg:3489 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:3489 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:3489 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:3489 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:3490 0 -0x1.e8p6 0x1.44p5 +REG epsg:3490 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:3490 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:3490 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:3490 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:3491 0 -0x1.e8p6 0x1.36p5 +REG epsg:3491 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:3491 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:3491 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:3491 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:3492 0 -0x1.e8p6 0x1.36p5 +REG epsg:3492 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:3492 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:3492 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:3492 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:3493 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:3493 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:3493 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:3493 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:3493 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:3494 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:3494 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:3494 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:3494 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:3494 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:3495 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:3495 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:3495 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:3495 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:3495 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:3496 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:3496 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:3496 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:3496 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:3496 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:3497 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:3497 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:3497 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:3497 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:3497 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:3498 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:3498 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:3498 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:3498 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:3498 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:3499 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:3499 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:3499 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:3499 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:3499 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:3500 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:3500 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:3500 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:3500 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:3500 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:3501 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:3501 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:3501 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:3501 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:3501 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:3502 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:3502 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:3502 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:3502 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:3502 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:3503 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:3503 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:3503 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:3503 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:3503 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:3504 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:3504 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:3504 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:3504 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:3504 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:3505 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:3505 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:3505 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:3505 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:3505 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:3506 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:3506 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:3506 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:3506 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:3506 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:3507 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:3507 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:3507 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:3507 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:3507 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:3508 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:3508 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:3508 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:3508 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:3508 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:3509 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:3509 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:3509 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:3509 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:3509 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:3510 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:3510 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:3510 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:3510 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:3510 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:3511 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:3511 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:3511 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:3511 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:3511 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:3512 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:3512 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:3512 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:3512 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:3512 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:3513 0 -0x1.5p6 0x1.bcp4 +REG epsg:3513 1 -0x1.71e6165af8d1bp6 0x1.44p4 +REG epsg:3513 2 -0x1.2e19e9a5072e5p6 0x1.44p4 +REG epsg:3513 3 -0x1.71e6165af8d1bp6 0x1.1ap5 +REG epsg:3513 4 -0x1.2e19e9a5072e5p6 0x1.1ap5 +REG epsg:3514 0 -0x1.52p6 0x1.dep4 +REG epsg:3514 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:3514 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:3514 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:3514 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:3515 0 -0x1.52p6 0x1.dep4 +REG epsg:3515 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:3515 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:3515 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:3515 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:3516 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:3516 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:3516 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:3516 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:3516 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:3517 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:3517 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:3517 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:3517 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:3517 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:3518 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:3518 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:3518 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:3518 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:3518 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:3519 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:3519 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:3519 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:3519 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:3519 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:3520 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:3520 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:3520 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:3520 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:3520 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:3521 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:3521 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:3521 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:3521 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:3521 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:3522 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:3522 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:3522 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:3522 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:3522 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:3523 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:3523 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:3523 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:3523 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:3523 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:3524 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:3524 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:3524 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:3524 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:3524 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:3525 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:3525 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:3525 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:3525 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:3525 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:3526 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:3526 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:3526 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:3526 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:3526 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:3527 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:3527 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:3527 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:3527 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:3527 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:3528 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:3528 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:3528 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:3528 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:3528 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:3529 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:3529 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:3529 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:3529 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:3529 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:3530 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:3530 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3530 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3530 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:3530 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:3531 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:3531 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3531 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:3531 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:3531 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:3532 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:3532 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:3532 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:3532 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:3532 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:3533 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:3533 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:3533 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:3533 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:3533 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:3534 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:3534 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:3534 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:3534 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:3534 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:3535 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:3535 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:3535 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:3535 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:3535 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:3536 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:3536 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:3536 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:3536 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:3536 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:3537 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:3537 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:3537 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:3537 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:3537 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:3538 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:3538 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:3538 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:3538 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:3538 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:3539 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:3539 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:3539 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:3539 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:3539 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:3540 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:3540 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:3540 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:3540 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:3540 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:3541 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:3541 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:3541 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:3541 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:3541 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:3542 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:3542 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3542 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3542 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:3542 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:3543 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:3543 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3543 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:3543 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:3543 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:3544 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:3544 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:3544 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:3544 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:3544 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:3545 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:3545 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:3545 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:3545 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:3545 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:3546 0 -0x1.57p6 0x1.2cp5 +REG epsg:3546 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:3546 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:3546 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3546 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3547 0 -0x1.57p6 0x1.2cp5 +REG epsg:3547 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:3547 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:3547 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3547 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:3548 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:3548 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:3548 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:3548 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:3548 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:3549 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:3549 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:3549 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:3549 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:3549 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:3550 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:3550 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:3550 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:3550 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:3550 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:3551 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:3551 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:3551 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:3551 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:3551 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:3552 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:3552 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:3552 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:3552 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:3552 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:3553 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:3553 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:3553 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:3553 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:3553 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:3554 0 -0x1.148p6 0x1.5cp5 +REG epsg:3554 1 -0x1.30126c9711abap6 0x1.34p5 +REG epsg:3554 2 -0x1.f1db26d1dca8cp5 0x1.34p5 +REG epsg:3554 3 -0x1.30126c9711abap6 0x1.84p5 +REG epsg:3554 4 -0x1.f1db26d1dca8cp5 0x1.84p5 +REG epsg:3555 0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3555 1 -0x1.2b39bac668c18p6 0x1.36aaaaaaaaaacp5 +REG epsg:3555 2 -0x1.e78c8a732e7dp5 0x1.36aaaaaaaaaacp5 +REG epsg:3555 3 -0x1.2b39bac668c18p6 0x1.86aaaaaaaaaacp5 +REG epsg:3555 4 -0x1.e78c8a732e7dp5 0x1.86aaaaaaaaaacp5 +REG epsg:3556 0 -0x1.198p6 0x1.56aaaaaaaaaacp5 +REG epsg:3556 1 -0x1.34c5ceb6fdb05p6 0x1.2eaaaaaaaaaacp5 +REG epsg:3556 2 -0x1.fc746292049f5p5 0x1.2eaaaaaaaaaacp5 +REG epsg:3556 3 -0x1.34c5ceb6fdb05p6 0x1.7eaaaaaaaaaacp5 +REG epsg:3556 4 -0x1.fc746292049f5p5 0x1.7eaaaaaaaaaacp5 +REG epsg:3557 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:3557 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:3557 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:3557 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:3557 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:3558 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:3558 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:3558 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:3558 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:3558 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:3559 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:3559 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:3559 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:3559 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:3559 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:3560 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:3560 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:3560 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:3560 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:3560 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:3561 0 -0x1.37p7 0x1.2d55555555554p4 +REG epsg:3561 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG epsg:3561 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG epsg:3561 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG epsg:3561 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG epsg:3562 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG epsg:3562 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG epsg:3562 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG epsg:3562 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG epsg:3562 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG epsg:3563 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:3563 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:3563 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:3563 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:3563 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:3564 0 -0x1.3fp7 0x1.5d55555555554p4 +REG epsg:3564 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG epsg:3564 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG epsg:3564 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG epsg:3564 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG epsg:3565 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG epsg:3565 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG epsg:3565 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG epsg:3565 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG epsg:3565 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG epsg:3566 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:3566 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:3566 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:3566 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:3566 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:3567 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:3567 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:3567 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:3567 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:3567 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:3568 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:3568 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:3568 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:3568 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:3568 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:3569 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:3569 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:3569 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:3569 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:3569 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:3570 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:3570 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:3570 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:3570 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:3570 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:3571 0 -0x1.68p7 0x1.64p6 +REG epsg:3571 1 0x1.ep6 0x1.54p6 +REG epsg:3571 2 -0x1.ep6 0x1.54p6 +REG epsg:3571 3 0x1.ep6 0x1.64p6 +REG epsg:3571 4 -0x1.ep6 0x1.64p6 +REG epsg:3572 0 -0x1.2cp7 0x1.64p6 +REG epsg:3572 1 0x1.2cp7 0x1.54p6 +REG epsg:3572 2 -0x1.68p6 0x1.54p6 +REG epsg:3572 3 0x1.2cp7 0x1.64p6 +REG epsg:3572 4 -0x1.68p6 0x1.64p6 +REG epsg:3573 0 -0x1.9p6 0x1.64p6 +REG epsg:3573 1 -0x1.4p7 0x1.54p6 +REG epsg:3573 2 -0x1.4p5 0x1.54p6 +REG epsg:3573 3 -0x1.4p7 0x1.64p6 +REG epsg:3573 4 -0x1.4p5 0x1.64p6 +REG epsg:3574 0 -0x1.4p5 0x1.64p6 +REG epsg:3574 1 -0x1.9p6 0x1.54p6 +REG epsg:3574 2 0x1.4p4 0x1.54p6 +REG epsg:3574 3 -0x1.9p6 0x1.64p6 +REG epsg:3574 4 0x1.4p4 0x1.64p6 +REG epsg:3575 0 0x1.4p3 0x1.64p6 +REG epsg:3575 1 -0x1.9p5 0x1.54p6 +REG epsg:3575 2 0x1.18p6 0x1.54p6 +REG epsg:3575 3 -0x1.9p5 0x1.64p6 +REG epsg:3575 4 0x1.18p6 0x1.64p6 +REG epsg:3576 0 0x1.68p6 0x1.64p6 +REG epsg:3576 1 0x1.ep4 0x1.54p6 +REG epsg:3576 2 0x1.2cp7 0x1.54p6 +REG epsg:3576 3 0x1.ep4 0x1.64p6 +REG epsg:3576 4 0x1.2cp7 0x1.64p6 +REG epsg:3577 0 0x1.08p7 -0x1.2p4 +REG epsg:3577 1 0x1.d0e98a4ce3089p6 -0x1.08p5 +REG epsg:3577 2 0x1.278b3ad98e7bcp7 -0x1.08p5 +REG epsg:3577 3 0x1.d0e98a4ce3089p6 -0x1.8p1 +REG epsg:3577 4 0x1.278b3ad98e7bcp7 -0x1.8p1 +REG epsg:3578 0 -0x1.09p7 0x1.fcp5 +REG epsg:3578 1 -0x1.31574215d4f9p7 0x1.b4p5 +REG epsg:3578 2 -0x1.c1517bd4560dfp6 0x1.b4p5 +REG epsg:3578 3 -0x1.31574215d4f9p7 0x1.22p6 +REG epsg:3578 4 -0x1.c1517bd4560dfp6 0x1.22p6 +REG epsg:3579 0 -0x1.09p7 0x1.fcp5 +REG epsg:3579 1 -0x1.31574215d4f9p7 0x1.b4p5 +REG epsg:3579 2 -0x1.c1517bd4560dfp6 0x1.b4p5 +REG epsg:3579 3 -0x1.31574215d4f9p7 0x1.22p6 +REG epsg:3579 4 -0x1.c1517bd4560dfp6 0x1.22p6 +REG epsg:3580 0 -0x1.cp6 0x1.18p5 +REG epsg:3580 1 -0x1.049f8c80e38c9p7 0x1.4p4 +REG epsg:3580 2 -0x1.76c0e6fe38e6ep6 0x1.4p4 +REG epsg:3580 3 -0x1.049f8c80e38c9p7 0x1.9p5 +REG epsg:3580 4 -0x1.76c0e6fe38e6ep6 0x1.9p5 +REG epsg:3581 0 -0x1.cp6 0x1.18p5 +REG epsg:3581 1 -0x1.049f8c80e38c9p7 0x1.4p4 +REG epsg:3581 2 -0x1.76c0e6fe38e6ep6 0x1.4p4 +REG epsg:3581 3 -0x1.049f8c80e38c9p7 0x1.9p5 +REG epsg:3581 4 -0x1.76c0e6fe38e6ep6 0x1.9p5 +REG epsg:3582 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:3582 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:3582 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:3582 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:3582 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:3583 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:3583 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:3583 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:3583 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:3583 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:3584 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:3584 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:3584 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:3584 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:3584 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:3585 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:3585 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:3585 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:3585 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:3585 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:3586 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:3586 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:3586 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:3586 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:3586 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:3587 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:3587 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:3587 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:3587 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:3587 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:3588 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:3588 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:3588 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:3588 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:3588 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:3589 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:3589 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:3589 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:3589 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:3589 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:3590 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:3590 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:3590 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:3590 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:3590 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:3591 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG epsg:3591 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG epsg:3591 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG epsg:3591 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG epsg:3591 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG epsg:3592 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:3592 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:3592 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:3592 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:3592 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:3593 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:3593 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:3593 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:3593 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:3593 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:3594 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:3594 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:3594 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:3594 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:3594 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:3595 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:3595 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:3595 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:3595 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:3595 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:3596 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:3596 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:3596 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:3596 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:3596 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:3597 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:3597 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:3597 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:3597 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:3597 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:3598 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:3598 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:3598 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:3598 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:3598 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:3599 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:3599 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:3599 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:3599 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:3599 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:3600 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:3600 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:3600 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:3600 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:3600 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:3601 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG epsg:3601 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:3601 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:3601 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:3601 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:3602 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG epsg:3602 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:3602 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:3602 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:3602 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:3603 0 -0x1.7ap6 0x1.2155555555554p5 +REG epsg:3603 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG epsg:3603 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG epsg:3603 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG epsg:3603 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG epsg:3604 0 -0x1.b6p6 0x1.75p5 +REG epsg:3604 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:3604 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:3604 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:3604 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:3605 0 -0x1.b6p6 0x1.75p5 +REG epsg:3605 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:3605 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:3605 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:3605 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:3606 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:3606 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:3606 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:3606 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:3606 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:3607 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:3607 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:3607 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:3607 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:3607 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:3608 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:3608 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:3608 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:3608 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:3608 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:3609 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:3609 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:3609 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:3609 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:3609 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:3610 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:3610 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:3610 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:3610 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:3610 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:3611 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:3611 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:3611 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:3611 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:3611 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:3612 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:3612 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:3612 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:3612 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:3612 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:3613 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:3613 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:3613 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:3613 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:3613 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:3614 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:3614 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:3614 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:3614 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:3614 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:3615 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:3615 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3615 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3615 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3615 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3616 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:3616 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3616 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3616 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3616 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3617 0 -0x1.a9p6 0x1.fp4 +REG epsg:3617 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:3617 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:3617 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:3617 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:3618 0 -0x1.a9p6 0x1.fp4 +REG epsg:3618 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:3618 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:3618 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:3618 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:3619 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:3619 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:3619 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:3619 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:3619 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:3620 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:3620 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:3620 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:3620 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:3620 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:3621 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:3621 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:3621 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:3621 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:3621 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:3622 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:3622 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:3622 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:3622 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:3622 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:3623 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:3623 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:3623 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:3623 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:3623 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:3624 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:3624 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:3624 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:3624 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:3624 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:3625 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:3625 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3625 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3625 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3625 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3626 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:3626 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3626 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:3626 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3626 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:3627 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:3627 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:3627 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:3627 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:3627 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:3628 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:3628 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:3628 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:3628 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:3628 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:3629 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:3629 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:3629 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:3629 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:3629 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:3630 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:3630 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:3630 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:3630 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:3630 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:3631 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:3631 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:3631 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:3631 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:3631 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3632 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:3632 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:3632 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:3632 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:3632 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:3633 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:3633 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:3633 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:3633 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:3633 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:3634 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:3634 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:3634 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:3634 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:3634 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:3635 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:3635 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:3635 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:3635 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:3635 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:3636 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:3636 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:3636 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:3636 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:3636 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:3637 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:3637 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:3637 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:3637 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:3637 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:3638 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:3638 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:3638 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:3638 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:3638 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:3639 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:3639 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:3639 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:3639 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:3639 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:3640 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:3640 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:3640 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:3640 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:3640 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:3641 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:3641 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:3641 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:3641 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:3641 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:3642 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:3642 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:3642 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:3642 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:3642 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:3643 0 -0x1.e2p6 0x1.5dp5 +REG epsg:3643 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:3643 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:3643 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:3643 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:3644 0 -0x1.e2p6 0x1.5dp5 +REG epsg:3644 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:3644 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:3644 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:3644 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:3645 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:3645 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:3645 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:3645 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:3645 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:3646 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:3646 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:3646 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:3646 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:3646 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:3647 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:3647 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:3647 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:3647 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:3647 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:3648 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:3648 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:3648 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:3648 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:3648 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:3649 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:3649 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:3649 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:3649 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3649 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3650 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:3650 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:3650 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:3650 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3650 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:3651 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:3651 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:3651 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:3651 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:3651 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:3652 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:3652 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:3652 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:3652 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:3652 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:3653 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:3653 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:3653 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:3653 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:3653 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:3654 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:3654 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:3654 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:3654 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:3654 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:3655 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:3655 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:3655 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:3655 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:3655 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:3656 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:3656 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:3656 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:3656 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:3656 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:3657 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:3657 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:3657 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:3657 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:3657 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:3658 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:3658 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:3658 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:3658 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:3658 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:3659 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:3659 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:3659 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:3659 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:3659 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:3660 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:3660 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:3660 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:3660 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:3660 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:3661 0 -0x1.58p6 0x1.1bp5 +REG epsg:3661 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:3661 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:3661 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:3661 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:3662 0 -0x1.58p6 0x1.1bp5 +REG epsg:3662 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:3662 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:3662 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:3662 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:3663 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:3663 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:3663 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:3663 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:3663 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:3664 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:3664 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:3664 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:3664 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:3664 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:3665 0 -0x1.9p6 0x1.a8p4 +REG epsg:3665 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:3665 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:3665 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:3665 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:3666 0 -0x1.9p6 0x1.a8p4 +REG epsg:3666 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:3666 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:3666 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:3666 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:3667 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:3667 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:3667 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:3667 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:3667 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:3668 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:3668 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:3668 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:3668 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:3668 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:3669 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:3669 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:3669 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:3669 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:3669 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:3670 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:3670 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:3670 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:3670 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:3670 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:3671 0 -0x1.8ap6 0x1.acp4 +REG epsg:3671 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:3671 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:3671 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:3671 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:3672 0 -0x1.8ap6 0x1.acp4 +REG epsg:3672 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:3672 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:3672 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:3672 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:3673 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:3673 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:3673 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:3673 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:3673 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:3674 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:3674 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:3674 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:3674 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:3674 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:3675 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:3675 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:3675 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:3675 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:3675 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:3676 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:3676 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:3676 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:3676 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:3676 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:3677 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:3677 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:3677 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:3677 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:3677 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:3678 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:3678 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:3678 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:3678 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:3678 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:3679 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:3679 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:3679 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:3679 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:3679 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:3680 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:3680 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:3680 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:3680 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:3680 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:3681 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:3681 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:3681 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:3681 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:3681 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:3682 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:3682 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:3682 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:3682 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:3682 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:3683 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:3683 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:3683 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:3683 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:3683 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:3684 0 -0x1.22p6 0x1.54p5 +REG epsg:3684 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:3684 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:3684 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:3684 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:3685 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:3685 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:3685 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:3685 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:3685 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:3686 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:3686 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:3686 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:3686 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:3686 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:3687 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:3687 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:3687 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:3687 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:3687 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:3688 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:3688 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:3688 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:3688 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:3688 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:3689 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:3689 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:3689 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:3689 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:3689 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:3690 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:3690 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:3690 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:3690 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:3690 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:3691 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:3691 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:3691 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:3691 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:3691 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:3692 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:3692 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:3692 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:3692 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:3692 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:3693 0 -0x1.3ep6 0x1.3bp5 +REG epsg:3693 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:3693 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:3693 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:3693 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:3694 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:3694 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:3694 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:3694 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:3694 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:3695 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:3695 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:3695 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:3695 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:3695 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:3696 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:3696 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:3696 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:3696 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:3696 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:3697 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:3697 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:3697 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:3697 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:3697 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:3698 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:3698 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:3698 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:3698 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:3698 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:3699 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:3699 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:3699 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:3699 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:3699 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:3700 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:3700 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:3700 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:3700 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:3700 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:3701 0 -0x1.68p6 0x0.0p0 +REG epsg:3701 1 -0x1.7cp6 -0x1.4p2 +REG epsg:3701 2 -0x1.54p6 -0x1.4p2 +REG epsg:3701 3 -0x1.7cp6 0x1.4p2 +REG epsg:3701 4 -0x1.54p6 0x1.4p2 +REG epsg:3702 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:3702 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:3702 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:3702 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:3702 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:3703 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:3703 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:3703 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:3703 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:3703 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:3704 0 -0x1.b3p6 0x1.44p5 +REG epsg:3704 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:3704 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:3704 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:3704 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:3705 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:3705 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:3705 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:3705 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:3705 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:3706 0 0x1.56p7 0x0.0p0 +REG epsg:3706 1 0x1.4cp7 -0x1.4p2 +REG epsg:3706 2 0x1.6p7 -0x1.4p2 +REG epsg:3706 3 0x1.4cp7 0x1.4p2 +REG epsg:3706 4 0x1.6p7 0x1.4p2 +REG epsg:3707 0 0x1.62p7 0x0.0p0 +REG epsg:3707 1 0x1.58p7 -0x1.4p2 +REG epsg:3707 2 -0x1.64p7 -0x1.4p2 +REG epsg:3707 3 0x1.58p7 0x1.4p2 +REG epsg:3707 4 -0x1.64p7 0x1.4p2 +REG epsg:3708 0 -0x1.62p7 0x0.0p0 +REG epsg:3708 1 0x1.64p7 -0x1.4p2 +REG epsg:3708 2 -0x1.58p7 -0x1.4p2 +REG epsg:3708 3 0x1.64p7 0x1.4p2 +REG epsg:3708 4 -0x1.58p7 0x1.4p2 +REG epsg:3709 0 -0x1.56p7 0x0.0p0 +REG epsg:3709 1 -0x1.6p7 -0x1.4p2 +REG epsg:3709 2 -0x1.4cp7 -0x1.4p2 +REG epsg:3709 3 -0x1.6p7 0x1.4p2 +REG epsg:3709 4 -0x1.4cp7 0x1.4p2 +REG epsg:3710 0 -0x1.4ap7 0x0.0p0 +REG epsg:3710 1 -0x1.54p7 -0x1.4p2 +REG epsg:3710 2 -0x1.4p7 -0x1.4p2 +REG epsg:3710 3 -0x1.54p7 0x1.4p2 +REG epsg:3710 4 -0x1.4p7 0x1.4p2 +REG epsg:3711 0 -0x1.3ep7 0x0.0p0 +REG epsg:3711 1 -0x1.48p7 -0x1.4p2 +REG epsg:3711 2 -0x1.34p7 -0x1.4p2 +REG epsg:3711 3 -0x1.48p7 0x1.4p2 +REG epsg:3711 4 -0x1.34p7 0x1.4p2 +REG epsg:3712 0 -0x1.32p7 0x0.0p0 +REG epsg:3712 1 -0x1.3cp7 -0x1.4p2 +REG epsg:3712 2 -0x1.28p7 -0x1.4p2 +REG epsg:3712 3 -0x1.3cp7 0x1.4p2 +REG epsg:3712 4 -0x1.28p7 0x1.4p2 +REG epsg:3713 0 -0x1.26p7 0x0.0p0 +REG epsg:3713 1 -0x1.3p7 -0x1.4p2 +REG epsg:3713 2 -0x1.1cp7 -0x1.4p2 +REG epsg:3713 3 -0x1.3p7 0x1.4p2 +REG epsg:3713 4 -0x1.1cp7 0x1.4p2 +REG epsg:3714 0 -0x1.1ap7 0x0.0p0 +REG epsg:3714 1 -0x1.24p7 -0x1.4p2 +REG epsg:3714 2 -0x1.1p7 -0x1.4p2 +REG epsg:3714 3 -0x1.24p7 0x1.4p2 +REG epsg:3714 4 -0x1.1p7 0x1.4p2 +REG epsg:3715 0 -0x1.0ep7 0x0.0p0 +REG epsg:3715 1 -0x1.18p7 -0x1.4p2 +REG epsg:3715 2 -0x1.04p7 -0x1.4p2 +REG epsg:3715 3 -0x1.18p7 0x1.4p2 +REG epsg:3715 4 -0x1.04p7 0x1.4p2 +REG epsg:3716 0 -0x1.02p7 0x0.0p0 +REG epsg:3716 1 -0x1.0cp7 -0x1.4p2 +REG epsg:3716 2 -0x1.fp6 -0x1.4p2 +REG epsg:3716 3 -0x1.0cp7 0x1.4p2 +REG epsg:3716 4 -0x1.fp6 0x1.4p2 +REG epsg:3717 0 -0x1.ecp6 0x0.0p0 +REG epsg:3717 1 -0x1.0p7 -0x1.4p2 +REG epsg:3717 2 -0x1.d8p6 -0x1.4p2 +REG epsg:3717 3 -0x1.0p7 0x1.4p2 +REG epsg:3717 4 -0x1.d8p6 0x1.4p2 +REG epsg:3718 0 -0x1.d4p6 0x0.0p0 +REG epsg:3718 1 -0x1.e8p6 -0x1.4p2 +REG epsg:3718 2 -0x1.cp6 -0x1.4p2 +REG epsg:3718 3 -0x1.e8p6 0x1.4p2 +REG epsg:3718 4 -0x1.cp6 0x1.4p2 +REG epsg:3719 0 -0x1.bcp6 0x0.0p0 +REG epsg:3719 1 -0x1.dp6 -0x1.4p2 +REG epsg:3719 2 -0x1.a8p6 -0x1.4p2 +REG epsg:3719 3 -0x1.dp6 0x1.4p2 +REG epsg:3719 4 -0x1.a8p6 0x1.4p2 +REG epsg:3720 0 -0x1.a4p6 0x0.0p0 +REG epsg:3720 1 -0x1.b8p6 -0x1.4p2 +REG epsg:3720 2 -0x1.9p6 -0x1.4p2 +REG epsg:3720 3 -0x1.b8p6 0x1.4p2 +REG epsg:3720 4 -0x1.9p6 0x1.4p2 +REG epsg:3721 0 -0x1.8cp6 0x0.0p0 +REG epsg:3721 1 -0x1.ap6 -0x1.4p2 +REG epsg:3721 2 -0x1.78p6 -0x1.4p2 +REG epsg:3721 3 -0x1.ap6 0x1.4p2 +REG epsg:3721 4 -0x1.78p6 0x1.4p2 +REG epsg:3722 0 -0x1.74p6 0x0.0p0 +REG epsg:3722 1 -0x1.88p6 -0x1.4p2 +REG epsg:3722 2 -0x1.6p6 -0x1.4p2 +REG epsg:3722 3 -0x1.88p6 0x1.4p2 +REG epsg:3722 4 -0x1.6p6 0x1.4p2 +REG epsg:3723 0 -0x1.5cp6 0x0.0p0 +REG epsg:3723 1 -0x1.7p6 -0x1.4p2 +REG epsg:3723 2 -0x1.48p6 -0x1.4p2 +REG epsg:3723 3 -0x1.7p6 0x1.4p2 +REG epsg:3723 4 -0x1.48p6 0x1.4p2 +REG epsg:3724 0 -0x1.44p6 0x0.0p0 +REG epsg:3724 1 -0x1.58p6 -0x1.4p2 +REG epsg:3724 2 -0x1.3p6 -0x1.4p2 +REG epsg:3724 3 -0x1.58p6 0x1.4p2 +REG epsg:3724 4 -0x1.3p6 0x1.4p2 +REG epsg:3725 0 -0x1.2cp6 0x0.0p0 +REG epsg:3725 1 -0x1.4p6 -0x1.4p2 +REG epsg:3725 2 -0x1.18p6 -0x1.4p2 +REG epsg:3725 3 -0x1.4p6 0x1.4p2 +REG epsg:3725 4 -0x1.18p6 0x1.4p2 +REG epsg:3726 0 -0x1.14p6 0x0.0p0 +REG epsg:3726 1 -0x1.28p6 -0x1.4p2 +REG epsg:3726 2 -0x1.0p6 -0x1.4p2 +REG epsg:3726 3 -0x1.28p6 0x1.4p2 +REG epsg:3726 4 -0x1.0p6 0x1.4p2 +REG epsg:3727 0 0x1.bc44444444444p5 -0x1.51ddddddddddfp4 +REG epsg:3727 1 0x1.9163239d7d0c7p5 -0x1.a1ddddddddddfp4 +REG epsg:3727 2 0x1.e72564eb0b7c1p5 -0x1.a1ddddddddddfp4 +REG epsg:3727 3 0x1.9163239d7d0c7p5 -0x1.01ddddddddddfp4 +REG epsg:3727 4 0x1.e72564eb0b7c1p5 -0x1.01ddddddddddfp4 +REG epsg:3728 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:3728 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:3728 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:3728 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:3728 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:3729 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:3729 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:3729 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:3729 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:3729 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:3730 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:3730 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:3730 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:3730 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:3730 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:3731 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:3731 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:3731 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:3731 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:3731 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:3732 0 -0x1.b3p6 0x1.44p5 +REG epsg:3732 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:3732 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:3732 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:3732 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:3733 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:3733 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:3733 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:3733 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:3733 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:3734 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:3734 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:3734 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:3734 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:3734 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:3735 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:3735 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:3735 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:3735 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:3735 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:3736 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:3736 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:3736 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:3736 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:3736 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:3737 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:3737 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:3737 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:3737 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:3737 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:3738 0 -0x1.b3p6 0x1.44p5 +REG epsg:3738 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:3738 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:3738 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:3738 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:3739 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:3739 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:3739 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:3739 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:3739 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:3740 0 -0x1.ecp6 0x0.0p0 +REG epsg:3740 1 -0x1.0p7 -0x1.4p2 +REG epsg:3740 2 -0x1.d8p6 -0x1.4p2 +REG epsg:3740 3 -0x1.0p7 0x1.4p2 +REG epsg:3740 4 -0x1.d8p6 0x1.4p2 +REG epsg:3741 0 -0x1.d4p6 0x0.0p0 +REG epsg:3741 1 -0x1.e8p6 -0x1.4p2 +REG epsg:3741 2 -0x1.cp6 -0x1.4p2 +REG epsg:3741 3 -0x1.e8p6 0x1.4p2 +REG epsg:3741 4 -0x1.cp6 0x1.4p2 +REG epsg:3742 0 -0x1.bcp6 0x0.0p0 +REG epsg:3742 1 -0x1.dp6 -0x1.4p2 +REG epsg:3742 2 -0x1.a8p6 -0x1.4p2 +REG epsg:3742 3 -0x1.dp6 0x1.4p2 +REG epsg:3742 4 -0x1.a8p6 0x1.4p2 +REG epsg:3743 0 -0x1.a4p6 0x0.0p0 +REG epsg:3743 1 -0x1.b8p6 -0x1.4p2 +REG epsg:3743 2 -0x1.9p6 -0x1.4p2 +REG epsg:3743 3 -0x1.b8p6 0x1.4p2 +REG epsg:3743 4 -0x1.9p6 0x1.4p2 +REG epsg:3744 0 -0x1.8cp6 0x0.0p0 +REG epsg:3744 1 -0x1.ap6 -0x1.4p2 +REG epsg:3744 2 -0x1.78p6 -0x1.4p2 +REG epsg:3744 3 -0x1.ap6 0x1.4p2 +REG epsg:3744 4 -0x1.78p6 0x1.4p2 +REG epsg:3745 0 -0x1.74p6 0x0.0p0 +REG epsg:3745 1 -0x1.88p6 -0x1.4p2 +REG epsg:3745 2 -0x1.6p6 -0x1.4p2 +REG epsg:3745 3 -0x1.88p6 0x1.4p2 +REG epsg:3745 4 -0x1.6p6 0x1.4p2 +REG epsg:3746 0 -0x1.5cp6 0x0.0p0 +REG epsg:3746 1 -0x1.7p6 -0x1.4p2 +REG epsg:3746 2 -0x1.48p6 -0x1.4p2 +REG epsg:3746 3 -0x1.7p6 0x1.4p2 +REG epsg:3746 4 -0x1.48p6 0x1.4p2 +REG epsg:3747 0 -0x1.44p6 0x0.0p0 +REG epsg:3747 1 -0x1.58p6 -0x1.4p2 +REG epsg:3747 2 -0x1.3p6 -0x1.4p2 +REG epsg:3747 3 -0x1.58p6 0x1.4p2 +REG epsg:3747 4 -0x1.3p6 0x1.4p2 +REG epsg:3748 0 -0x1.2cp6 0x0.0p0 +REG epsg:3748 1 -0x1.4p6 -0x1.4p2 +REG epsg:3748 2 -0x1.18p6 -0x1.4p2 +REG epsg:3748 3 -0x1.4p6 0x1.4p2 +REG epsg:3748 4 -0x1.18p6 0x1.4p2 +REG epsg:3749 0 -0x1.14p6 0x0.0p0 +REG epsg:3749 1 -0x1.28p6 -0x1.4p2 +REG epsg:3749 2 -0x1.0p6 -0x1.4p2 +REG epsg:3749 3 -0x1.28p6 0x1.4p2 +REG epsg:3749 4 -0x1.0p6 0x1.4p2 +REG epsg:3750 0 -0x1.3ep7 0x0.0p0 +REG epsg:3750 1 -0x1.48p7 -0x1.4p2 +REG epsg:3750 2 -0x1.34p7 -0x1.4p2 +REG epsg:3750 3 -0x1.48p7 0x1.4p2 +REG epsg:3750 4 -0x1.34p7 0x1.4p2 +REG epsg:3751 0 -0x1.32p7 0x0.0p0 +REG epsg:3751 1 -0x1.3cp7 -0x1.4p2 +REG epsg:3751 2 -0x1.28p7 -0x1.4p2 +REG epsg:3751 3 -0x1.3cp7 0x1.4p2 +REG epsg:3751 4 -0x1.28p7 0x1.4p2 +REG epsg:3752 0 0x1.9p6 -0x1.48p5 +REG epsg:3752 1 0x1.757feef827d5fp6 -0x1.7p5 +REG epsg:3752 2 0x1.aa801107d82a1p6 -0x1.7p5 +REG epsg:3752 3 0x1.757feef827d5fp6 -0x1.2p5 +REG epsg:3752 4 0x1.aa801107d82a1p6 -0x1.2p5 +REG epsg:3753 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:3753 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:3753 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:3753 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:3753 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:3754 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:3754 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:3754 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:3754 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:3754 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:3755 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:3755 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:3755 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:3755 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:3755 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:3756 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:3756 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:3756 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:3756 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:3756 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:3757 0 -0x1.b3p6 0x1.44p5 +REG epsg:3757 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:3757 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:3757 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:3757 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:3758 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:3758 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:3758 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:3758 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:3758 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:3759 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:3759 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:3759 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:3759 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:3759 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:3760 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:3760 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:3760 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:3760 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:3760 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:3761 0 -0x1.98p5 0x0.0p0 +REG epsg:3761 1 -0x1.cp5 -0x1.4p2 +REG epsg:3761 2 -0x1.7p5 -0x1.4p2 +REG epsg:3761 3 -0x1.cp5 0x1.4p2 +REG epsg:3761 4 -0x1.7p5 0x1.4p2 +REG epsg:3762 0 -0x1.28p5 -0x1.b4p5 +REG epsg:3762 1 -0x1.35c6c29450f8fp5 -0x1.bcp5 +REG epsg:3762 2 -0x1.1a393d6baf071p5 -0x1.bcp5 +REG epsg:3762 3 -0x1.35c6c29450f8fp5 -0x1.acp5 +REG epsg:3762 4 -0x1.1a393d6baf071p5 -0x1.acp5 +REG epsg:3763 0 -0x1.04426c684fbc5p3 0x1.3d5897d33791ap5 +REG epsg:3763 1 -0x1.d41e46bea1f74p3 0x1.155897d33791ap5 +REG epsg:3763 2 -0x1.a334908fec0b4p0 0x1.155897d33791ap5 +REG epsg:3763 3 -0x1.d41e46bea1f74p3 0x1.655897d33791ap5 +REG epsg:3763 4 -0x1.a334908fec0b4p0 0x1.655897d33791ap5 +REG epsg:3764 0 -0x1.61p7 -0x1.6p5 +REG epsg:3764 1 0x1.61192e6394ef4p7 -0x1.88p5 +REG epsg:3764 2 -0x1.53192e6394ef4p7 -0x1.88p5 +REG epsg:3764 3 0x1.61192e6394ef4p7 -0x1.38p5 +REG epsg:3764 4 -0x1.53192e6394ef4p7 -0x1.38p5 +REG epsg:3765 0 0x1.08p4 0x0.0p0 +REG epsg:3765 1 0x1.7p3 -0x1.4p2 +REG epsg:3765 2 0x1.58p4 -0x1.4p2 +REG epsg:3765 3 0x1.7p3 0x1.4p2 +REG epsg:3765 4 0x1.58p4 0x1.4p2 +REG epsg:3766 0 0x1.08p4 0x1.6f55555555554p4 +REG epsg:3766 1 0x1.ad4c8bd3be18p-3 0x1.fd5555555555p2 +REG epsg:3766 2 0x1.0652b3742c41ep5 0x1.fd5555555555p2 +REG epsg:3766 3 0x1.ad4c8bd3be18p-3 0x1.2faaaaaaaaaaap5 +REG epsg:3766 4 0x1.0652b3742c41ep5 0x1.2faaaaaaaaaaap5 +REG epsg:3767 0 0x1.ep3 0x0.0p0 +REG epsg:3767 1 0x1.4p3 -0x1.4p2 +REG epsg:3767 2 0x1.4p4 -0x1.4p2 +REG epsg:3767 3 0x1.4p3 0x1.4p2 +REG epsg:3767 4 0x1.4p4 0x1.4p2 +REG epsg:3768 0 0x1.5p4 0x0.0p0 +REG epsg:3768 1 0x1.0p4 -0x1.4p2 +REG epsg:3768 2 0x1.ap4 -0x1.4p2 +REG epsg:3768 3 0x1.0p4 0x1.4p2 +REG epsg:3768 4 0x1.ap4 0x1.4p2 +REG epsg:3769 0 -0x1.f8p5 0x0.0p0 +REG epsg:3769 1 -0x1.1p6 -0x1.4p2 +REG epsg:3769 2 -0x1.dp5 -0x1.4p2 +REG epsg:3769 3 -0x1.1p6 0x1.4p2 +REG epsg:3769 4 -0x1.dp5 0x1.4p2 +REG epsg:3770 0 -0x1.03p6 0x1.0p5 +REG epsg:3770 1 -0x1.1a9564b783cb4p6 0x1.bp4 +REG epsg:3770 2 -0x1.d6d53690f8698p5 0x1.bp4 +REG epsg:3770 3 -0x1.1a9564b783cb4p6 0x1.28p5 +REG epsg:3770 4 -0x1.d6d53690f8698p5 0x1.28p5 +REG epsg:3771 0 -0x1.bcp6 0x0.0p0 +REG epsg:3771 1 -0x1.dp6 -0x1.4p2 +REG epsg:3771 2 -0x1.a8p6 -0x1.4p2 +REG epsg:3771 3 -0x1.dp6 0x1.4p2 +REG epsg:3771 4 -0x1.a8p6 0x1.4p2 +REG epsg:3772 0 -0x1.c8p6 0x0.0p0 +REG epsg:3772 1 -0x1.dcp6 -0x1.4p2 +REG epsg:3772 2 -0x1.b4p6 -0x1.4p2 +REG epsg:3772 3 -0x1.dcp6 0x1.4p2 +REG epsg:3772 4 -0x1.b4p6 0x1.4p2 +REG epsg:3773 0 -0x1.d4p6 0x0.0p0 +REG epsg:3773 1 -0x1.e8p6 -0x1.4p2 +REG epsg:3773 2 -0x1.cp6 -0x1.4p2 +REG epsg:3773 3 -0x1.e8p6 0x1.4p2 +REG epsg:3773 4 -0x1.cp6 0x1.4p2 +REG epsg:3774 0 -0x1.ep6 0x0.0p0 +REG epsg:3774 1 -0x1.f4p6 -0x1.4p2 +REG epsg:3774 2 -0x1.ccp6 -0x1.4p2 +REG epsg:3774 3 -0x1.f4p6 0x1.4p2 +REG epsg:3774 4 -0x1.ccp6 0x1.4p2 +REG epsg:3775 0 -0x1.bcp6 0x0.0p0 +REG epsg:3775 1 -0x1.dp6 -0x1.4p2 +REG epsg:3775 2 -0x1.a8p6 -0x1.4p2 +REG epsg:3775 3 -0x1.dp6 0x1.4p2 +REG epsg:3775 4 -0x1.a8p6 0x1.4p2 +REG epsg:3776 0 -0x1.c8p6 0x0.0p0 +REG epsg:3776 1 -0x1.dcp6 -0x1.4p2 +REG epsg:3776 2 -0x1.b4p6 -0x1.4p2 +REG epsg:3776 3 -0x1.dcp6 0x1.4p2 +REG epsg:3776 4 -0x1.b4p6 0x1.4p2 +REG epsg:3777 0 -0x1.d4p6 0x0.0p0 +REG epsg:3777 1 -0x1.e8p6 -0x1.4p2 +REG epsg:3777 2 -0x1.cp6 -0x1.4p2 +REG epsg:3777 3 -0x1.e8p6 0x1.4p2 +REG epsg:3777 4 -0x1.cp6 0x1.4p2 +REG epsg:3778 0 -0x1.ep6 0x0.0p0 +REG epsg:3778 1 -0x1.f4p6 -0x1.4p2 +REG epsg:3778 2 -0x1.ccp6 -0x1.4p2 +REG epsg:3778 3 -0x1.f4p6 0x1.4p2 +REG epsg:3778 4 -0x1.ccp6 0x1.4p2 +REG epsg:3779 0 -0x1.bcp6 0x0.0p0 +REG epsg:3779 1 -0x1.dp6 -0x1.4p2 +REG epsg:3779 2 -0x1.a8p6 -0x1.4p2 +REG epsg:3779 3 -0x1.dp6 0x1.4p2 +REG epsg:3779 4 -0x1.a8p6 0x1.4p2 +REG epsg:3780 0 -0x1.c8p6 0x0.0p0 +REG epsg:3780 1 -0x1.dcp6 -0x1.4p2 +REG epsg:3780 2 -0x1.b4p6 -0x1.4p2 +REG epsg:3780 3 -0x1.dcp6 0x1.4p2 +REG epsg:3780 4 -0x1.b4p6 0x1.4p2 +REG epsg:3781 0 -0x1.d4p6 0x0.0p0 +REG epsg:3781 1 -0x1.e8p6 -0x1.4p2 +REG epsg:3781 2 -0x1.cp6 -0x1.4p2 +REG epsg:3781 3 -0x1.e8p6 0x1.4p2 +REG epsg:3781 4 -0x1.cp6 0x1.4p2 +REG epsg:3782 0 -0x1.ep6 0x0.0p0 +REG epsg:3782 1 -0x1.f4p6 -0x1.4p2 +REG epsg:3782 2 -0x1.ccp6 -0x1.4p2 +REG epsg:3782 3 -0x1.f4p6 0x1.4p2 +REG epsg:3782 4 -0x1.ccp6 0x1.4p2 +REG epsg:3783 0 -0x1.0439d6d33f7ddp7 -0x1.9118ca9f6c712p4 +REG epsg:3783 1 -0x1.0f4410c2bb722p7 -0x1.e118ca9f6c712p4 +REG epsg:3783 2 -0x1.f25f39c78712fp6 -0x1.e118ca9f6c712p4 +REG epsg:3783 3 -0x1.0f4410c2bb722p7 -0x1.4118ca9f6c712p4 +REG epsg:3783 4 -0x1.f25f39c78712fp6 -0x1.4118ca9f6c712p4 +REG epsg:3784 0 -0x1.02p7 -0x1.9p4 +REG epsg:3784 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:3784 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:3784 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:3784 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:3785 0 0x0.0p0 0x0.0p0 +REG epsg:3785 1 -0x1.4p2 -0x1.4p2 +REG epsg:3785 2 0x1.4p2 -0x1.4p2 +REG epsg:3785 3 -0x1.4p2 0x1.4p2 +REG epsg:3785 4 0x1.4p2 0x1.4p2 +REG epsg:3786 0 0x0.0p0 0x0.0p0 +REG epsg:3786 1 -0x1.4p2 -0x1.4p2 +REG epsg:3786 2 0x1.4p2 -0x1.4p2 +REG epsg:3786 3 -0x1.4p2 0x1.4p2 +REG epsg:3786 4 0x1.4p2 0x1.4p2 +REG epsg:3787 0 0x1.ep3 0x0.0p0 +REG epsg:3787 1 0x1.4p3 -0x1.4p2 +REG epsg:3787 2 0x1.4p4 -0x1.4p2 +REG epsg:3787 3 0x1.4p3 0x1.4p2 +REG epsg:3787 4 0x1.4p4 0x1.4p2 +REG epsg:3788 0 0x1.4cp7 0x0.0p0 +REG epsg:3788 1 0x1.42p7 -0x1.4p2 +REG epsg:3788 2 0x1.56p7 -0x1.4p2 +REG epsg:3788 3 0x1.42p7 0x1.4p2 +REG epsg:3788 4 0x1.56p7 0x1.4p2 +REG epsg:3789 0 0x1.52p7 0x0.0p0 +REG epsg:3789 1 0x1.48p7 -0x1.4p2 +REG epsg:3789 2 0x1.5cp7 -0x1.4p2 +REG epsg:3789 3 0x1.48p7 0x1.4p2 +REG epsg:3789 4 0x1.5cp7 0x1.4p2 +REG epsg:3790 0 0x1.66p7 0x0.0p0 +REG epsg:3790 1 0x1.5cp7 -0x1.4p2 +REG epsg:3790 2 -0x1.6p7 -0x1.4p2 +REG epsg:3790 3 0x1.5cp7 0x1.4p2 +REG epsg:3790 4 -0x1.6p7 0x1.4p2 +REG epsg:3791 0 -0x1.64p7 0x0.0p0 +REG epsg:3791 1 0x1.62p7 -0x1.4p2 +REG epsg:3791 2 -0x1.5ap7 -0x1.4p2 +REG epsg:3791 3 0x1.62p7 0x1.4p2 +REG epsg:3791 4 -0x1.5ap7 0x1.4p2 +REG epsg:3793 0 -0x1.61p7 0x0.0p0 +REG epsg:3793 1 0x1.65p7 -0x1.4p2 +REG epsg:3793 2 -0x1.57p7 -0x1.4p2 +REG epsg:3793 3 0x1.65p7 0x1.4p2 +REG epsg:3793 4 -0x1.57p7 0x1.4p2 +REG epsg:3794 0 0x1.ep3 0x0.0p0 +REG epsg:3794 1 0x1.4p3 -0x1.4p2 +REG epsg:3794 2 0x1.4p4 -0x1.4p2 +REG epsg:3794 3 0x1.4p3 0x1.4p2 +REG epsg:3794 4 0x1.4p4 0x1.4p2 +REG epsg:3795 0 -0x1.44p6 0x1.659999999999ap4 +REG epsg:3795 1 -0x1.499f5319fdd18p6 0x1.50ccccccccccdp4 +REG epsg:3795 2 -0x1.3e60ace6022e8p6 0x1.50ccccccccccdp4 +REG epsg:3795 3 -0x1.499f5319fdd18p6 0x1.7a66666666667p4 +REG epsg:3795 4 -0x1.3e60ace6022e8p6 0x1.7a66666666667p4 +REG epsg:3796 0 -0x1.3355555555555p6 0x1.4b77777777777p4 +REG epsg:3796 1 -0x1.385295ec85ecep6 0x1.38ccccccccccbp4 +REG epsg:3796 2 -0x1.2e5814be24bdcp6 0x1.38ccccccccccbp4 +REG epsg:3796 3 -0x1.385295ec85ecep6 0x1.5e22222222223p4 +REG epsg:3796 4 -0x1.2e5814be24bdcp6 0x1.5e22222222223p4 +REG epsg:3797 0 -0x1.18p6 0x1.78p5 +REG epsg:3797 1 -0x1.3b30d1bebb10ap6 0x1.48p5 +REG epsg:3797 2 -0x1.e99e5c8289dedp5 0x1.48p5 +REG epsg:3797 3 -0x1.3b30d1bebb10ap6 0x1.a8p5 +REG epsg:3797 4 -0x1.e99e5c8289dedp5 0x1.a8p5 +REG epsg:3798 0 -0x1.18p6 0x1.78p5 +REG epsg:3798 1 -0x1.3b30d1bebb10ap6 0x1.48p5 +REG epsg:3798 2 -0x1.e99e5c8289dedp5 0x1.48p5 +REG epsg:3798 3 -0x1.3b30d1bebb10ap6 0x1.a8p5 +REG epsg:3798 4 -0x1.e99e5c8289dedp5 0x1.a8p5 +REG epsg:3799 0 -0x1.18p6 0x1.78p5 +REG epsg:3799 1 -0x1.3b30d1bebb10ap6 0x1.48p5 +REG epsg:3799 2 -0x1.e99e5c8289dedp5 0x1.48p5 +REG epsg:3799 3 -0x1.3b30d1bebb10ap6 0x1.a8p5 +REG epsg:3799 4 -0x1.e99e5c8289dedp5 0x1.a8p5 +REG epsg:3800 0 -0x1.ep6 0x0.0p0 +REG epsg:3800 1 -0x1.f4p6 -0x1.4p2 +REG epsg:3800 2 -0x1.ccp6 -0x1.4p2 +REG epsg:3800 3 -0x1.f4p6 0x1.4p2 +REG epsg:3800 4 -0x1.ccp6 0x1.4p2 +REG epsg:3801 0 -0x1.ep6 0x0.0p0 +REG epsg:3801 1 -0x1.f4p6 -0x1.4p2 +REG epsg:3801 2 -0x1.ccp6 -0x1.4p2 +REG epsg:3801 3 -0x1.f4p6 0x1.4p2 +REG epsg:3801 4 -0x1.ccp6 0x1.4p2 +REG epsg:3802 0 -0x1.ep6 0x0.0p0 +REG epsg:3802 1 -0x1.f4p6 -0x1.4p2 +REG epsg:3802 2 -0x1.ccp6 -0x1.4p2 +REG epsg:3802 3 -0x1.f4p6 0x1.4p2 +REG epsg:3802 4 -0x1.ccp6 0x1.4p2 +REG epsg:3812 0 0x1.16fd646817cfbp2 0x1.94p5 +REG epsg:3812 1 0x1.21ab3723f107cp1 0x1.8955555555558p5 +REG epsg:3812 2 0x1.9d252d3e371b8p2 0x1.8955555555558p5 +REG epsg:3812 3 0x1.21ab3723f107cp1 0x1.9eaaaaaaaaaa8p5 +REG epsg:3812 4 0x1.9d252d3e371b8p2 0x1.9eaaaaaaaaaa8p5 +REG epsg:3814 0 -0x1.67p6 0x1.04p5 +REG epsg:3814 1 -0x1.7eb6ba59271a3p6 0x1.b8p4 +REG epsg:3814 2 -0x1.4f4945a6d8e5dp6 0x1.b8p4 +REG epsg:3814 3 -0x1.7eb6ba59271a3p6 0x1.2cp5 +REG epsg:3814 4 -0x1.4f4945a6d8e5dp6 0x1.2cp5 +REG epsg:3815 0 -0x1.67p6 0x1.04p5 +REG epsg:3815 1 -0x1.7eb6ba59271a3p6 0x1.b8p4 +REG epsg:3815 2 -0x1.4f4945a6d8e5dp6 0x1.b8p4 +REG epsg:3815 3 -0x1.7eb6ba59271a3p6 0x1.2cp5 +REG epsg:3815 4 -0x1.4f4945a6d8e5dp6 0x1.2cp5 +REG epsg:3816 0 -0x1.67p6 0x1.04p5 +REG epsg:3816 1 -0x1.7eb6ba59271a3p6 0x1.b8p4 +REG epsg:3816 2 -0x1.4f4945a6d8e5dp6 0x1.b8p4 +REG epsg:3816 3 -0x1.7eb6ba59271a3p6 0x1.2cp5 +REG epsg:3816 4 -0x1.4f4945a6d8e5dp6 0x1.2cp5 +REG epsg:3819 0 0x0.0p0 0x0.0p0 +REG epsg:3819 1 -0x1.4p2 -0x1.4p2 +REG epsg:3819 2 0x1.4p2 -0x1.4p2 +REG epsg:3819 3 -0x1.4p2 0x1.4p2 +REG epsg:3819 4 0x1.4p2 0x1.4p2 +REG epsg:3821 0 0x0.0p0 0x0.0p0 +REG epsg:3821 1 -0x1.4p2 -0x1.4p2 +REG epsg:3821 2 0x1.4p2 -0x1.4p2 +REG epsg:3821 3 -0x1.4p2 0x1.4p2 +REG epsg:3821 4 0x1.4p2 0x1.4p2 +REG epsg:3822 0 0x0.0p0 0x0.0p0 +REG epsg:3822 1 -0x1.4p2 -0x1.4p2 +REG epsg:3822 2 0x1.4p2 -0x1.4p2 +REG epsg:3822 3 -0x1.4p2 0x1.4p2 +REG epsg:3822 4 0x1.4p2 0x1.4p2 +REG epsg:3824 0 0x0.0p0 0x0.0p0 +REG epsg:3824 1 -0x1.4p2 -0x1.4p2 +REG epsg:3824 2 0x1.4p2 -0x1.4p2 +REG epsg:3824 3 -0x1.4p2 0x1.4p2 +REG epsg:3824 4 0x1.4p2 0x1.4p2 +REG epsg:3825 0 0x1.dcp6 0x0.0p0 +REG epsg:3825 1 0x1.c8p6 -0x1.4p2 +REG epsg:3825 2 0x1.fp6 -0x1.4p2 +REG epsg:3825 3 0x1.c8p6 0x1.4p2 +REG epsg:3825 4 0x1.fp6 0x1.4p2 +REG epsg:3826 0 0x1.e4p6 0x0.0p0 +REG epsg:3826 1 0x1.dp6 -0x1.4p2 +REG epsg:3826 2 0x1.f8p6 -0x1.4p2 +REG epsg:3826 3 0x1.dp6 0x1.4p2 +REG epsg:3826 4 0x1.f8p6 0x1.4p2 +REG epsg:3827 0 0x1.dcp6 0x0.0p0 +REG epsg:3827 1 0x1.c8p6 -0x1.4p2 +REG epsg:3827 2 0x1.fp6 -0x1.4p2 +REG epsg:3827 3 0x1.c8p6 0x1.4p2 +REG epsg:3827 4 0x1.fp6 0x1.4p2 +REG epsg:3828 0 0x1.e4p6 0x0.0p0 +REG epsg:3828 1 0x1.dp6 -0x1.4p2 +REG epsg:3828 2 0x1.f8p6 -0x1.4p2 +REG epsg:3828 3 0x1.dp6 0x1.4p2 +REG epsg:3828 4 0x1.f8p6 0x1.4p2 +REG epsg:3829 0 0x1.ecp6 0x0.0p0 +REG epsg:3829 1 0x1.d8p6 -0x1.4p2 +REG epsg:3829 2 0x1.0p7 -0x1.4p2 +REG epsg:3829 3 0x1.d8p6 0x1.4p2 +REG epsg:3829 4 0x1.0p7 0x1.4p2 +REG epsg:3832 0 0x1.2cp7 0x0.0p0 +REG epsg:3832 1 0x1.22p7 -0x1.4p2 +REG epsg:3832 2 0x1.36p7 -0x1.4p2 +REG epsg:3832 3 0x1.22p7 0x1.4p2 +REG epsg:3832 4 0x1.36p7 0x1.4p2 +REG epsg:3833 0 0x1.2p3 0x0.0p0 +REG epsg:3833 1 0x1.0p2 -0x1.4p2 +REG epsg:3833 2 0x1.cp3 -0x1.4p2 +REG epsg:3833 3 0x1.0p2 0x1.4p2 +REG epsg:3833 4 0x1.cp3 0x1.4p2 +REG epsg:3834 0 0x1.2p3 0x0.0p0 +REG epsg:3834 1 0x1.0p2 -0x1.4p2 +REG epsg:3834 2 0x1.cp3 -0x1.4p2 +REG epsg:3834 3 0x1.0p2 0x1.4p2 +REG epsg:3834 4 0x1.cp3 0x1.4p2 +REG epsg:3835 0 0x1.ep3 0x0.0p0 +REG epsg:3835 1 0x1.4p3 -0x1.4p2 +REG epsg:3835 2 0x1.4p4 -0x1.4p2 +REG epsg:3835 3 0x1.4p3 0x1.4p2 +REG epsg:3835 4 0x1.4p4 0x1.4p2 +REG epsg:3836 0 0x1.5p4 0x0.0p0 +REG epsg:3836 1 0x1.0p4 -0x1.4p2 +REG epsg:3836 2 0x1.ap4 -0x1.4p2 +REG epsg:3836 3 0x1.0p4 0x1.4p2 +REG epsg:3836 4 0x1.ap4 0x1.4p2 +REG epsg:3837 0 0x1.2p3 0x0.0p0 +REG epsg:3837 1 0x1.0p2 -0x1.4p2 +REG epsg:3837 2 0x1.cp3 -0x1.4p2 +REG epsg:3837 3 0x1.0p2 0x1.4p2 +REG epsg:3837 4 0x1.cp3 0x1.4p2 +REG epsg:3838 0 0x1.8p3 0x0.0p0 +REG epsg:3838 1 0x1.cp2 -0x1.4p2 +REG epsg:3838 2 0x1.1p4 -0x1.4p2 +REG epsg:3838 3 0x1.cp2 0x1.4p2 +REG epsg:3838 4 0x1.1p4 0x1.4p2 +REG epsg:3839 0 0x1.bp4 0x0.0p0 +REG epsg:3839 1 0x1.6p4 -0x1.4p2 +REG epsg:3839 2 0x1.0p5 -0x1.4p2 +REG epsg:3839 3 0x1.6p4 0x1.4p2 +REG epsg:3839 4 0x1.0p5 0x1.4p2 +REG epsg:3840 0 0x1.ep4 0x0.0p0 +REG epsg:3840 1 0x1.9p4 -0x1.4p2 +REG epsg:3840 2 0x1.18p5 -0x1.4p2 +REG epsg:3840 3 0x1.9p4 0x1.4p2 +REG epsg:3840 4 0x1.18p5 0x1.4p2 +REG epsg:3841 0 0x1.2p4 0x0.0p0 +REG epsg:3841 1 0x1.ap3 -0x1.4p2 +REG epsg:3841 2 0x1.7p4 -0x1.4p2 +REG epsg:3841 3 0x1.ap3 0x1.4p2 +REG epsg:3841 4 0x1.7p4 0x1.4p2 +REG epsg:3842 0 0x1.2p4 0x0.0p0 +REG epsg:3842 1 0x1.ap3 -0x1.4p2 +REG epsg:3842 2 0x1.7p4 -0x1.4p2 +REG epsg:3842 3 0x1.ap3 0x1.4p2 +REG epsg:3842 4 0x1.7p4 0x1.4p2 +REG epsg:3843 0 0x1.2p4 0x0.0p0 +REG epsg:3843 1 0x1.ap3 -0x1.4p2 +REG epsg:3843 2 0x1.7p4 -0x1.4p2 +REG epsg:3843 3 0x1.ap3 0x1.4p2 +REG epsg:3843 4 0x1.7p4 0x1.4p2 +REG epsg:3844 0 0x1.9p4 0x1.7p5 +REG epsg:3844 1 0x1.1cd5e1cf3d2a8p4 0x1.48p5 +REG epsg:3844 2 0x1.01950f18616acp5 0x1.48p5 +REG epsg:3844 3 0x1.1cd5e1cf3d2a8p4 0x1.98p5 +REG epsg:3844 4 0x1.01950f18616acp5 0x1.98p5 +REG epsg:3845 0 0x1.69ccccccccccdp3 0x0.0p0 +REG epsg:3845 1 0x1.939999999999ap2 -0x1.4p2 +REG epsg:3845 2 0x1.04e6666666666p4 -0x1.4p2 +REG epsg:3845 3 0x1.939999999999ap2 0x1.4p2 +REG epsg:3845 4 0x1.04e6666666666p4 0x1.4p2 +REG epsg:3846 0 0x1.b1ccefc0a6066p3 0x0.0p0 +REG epsg:3846 1 0x1.11ccefc0a6066p3 -0x1.4p2 +REG epsg:3846 2 0x1.28e677e053033p4 -0x1.4p2 +REG epsg:3846 3 0x1.11ccefc0a6066p3 0x1.4p2 +REG epsg:3846 4 0x1.28e677e053033p4 0x1.4p2 +REG epsg:3847 0 0x1.f9cd1536a7826p3 0x0.0p0 +REG epsg:3847 1 0x1.59cd1536a7826p3 -0x1.4p2 +REG epsg:3847 2 0x1.4ce68a9b53c13p4 -0x1.4p2 +REG epsg:3847 3 0x1.59cd1536a7826p3 0x1.4p2 +REG epsg:3847 4 0x1.4ce68a9b53c13p4 0x1.4p2 +REG epsg:3848 0 0x1.20e69ad42c3cap4 0x0.0p0 +REG epsg:3848 1 0x1.a1cd35a858794p3 -0x1.4p2 +REG epsg:3848 2 0x1.70e69ad42c3cap4 -0x1.4p2 +REG epsg:3848 3 0x1.a1cd35a858794p3 0x1.4p2 +REG epsg:3848 4 0x1.70e69ad42c3cap4 0x1.4p2 +REG epsg:3849 0 0x1.44e6ac4e18d97p4 0x0.0p0 +REG epsg:3849 1 0x1.e9cd589c31b2ep3 -0x1.4p2 +REG epsg:3849 2 0x1.94e6ac4e18d97p4 -0x1.4p2 +REG epsg:3849 3 0x1.e9cd589c31b2ep3 0x1.4p2 +REG epsg:3849 4 0x1.94e6ac4e18d97p4 0x1.4p2 +REG epsg:3850 0 0x1.68e6bdc805761p4 0x0.0p0 +REG epsg:3850 1 0x1.18e6bdc805761p4 -0x1.4p2 +REG epsg:3850 2 0x1.b8e6bdc805761p4 -0x1.4p2 +REG epsg:3850 3 0x1.18e6bdc805761p4 0x1.4p2 +REG epsg:3850 4 0x1.b8e6bdc805761p4 0x1.4p2 +REG epsg:3851 0 0x1.5ap7 -0x1.48p5 +REG epsg:3851 1 0x1.477327474f15cp7 -0x1.8p5 +REG epsg:3851 2 -0x1.637327474f15cp7 -0x1.8p5 +REG epsg:3851 3 0x1.477327474f15cp7 -0x1.1p5 +REG epsg:3851 4 -0x1.637327474f15cp7 -0x1.1p5 +REG epsg:3852 0 0x1.3ap7 -0x1.4d55555555556p6 +REG epsg:3852 1 0x1.84p6 -0x1.64p6 +REG epsg:3852 2 -0x1.1ep7 -0x1.64p6 +REG epsg:3852 3 0x1.84p6 -0x1.1800000000001p6 +REG epsg:3852 4 -0x1.1ep7 -0x1.1800000000001p6 +REG epsg:3854 0 0x1.20ed0917d6b66p4 0x0.0p0 +REG epsg:3854 1 0x1.a1da122fad6ccp3 -0x1.4p2 +REG epsg:3854 2 0x1.70ed0917d6b66p4 -0x1.4p2 +REG epsg:3854 3 0x1.a1da122fad6ccp3 0x1.4p2 +REG epsg:3854 4 0x1.70ed0917d6b66p4 0x1.4p2 +REG epsg:3857 0 0x0.0p0 0x0.0p0 +REG epsg:3857 1 -0x1.4p2 -0x1.4p2 +REG epsg:3857 2 0x1.4p2 -0x1.4p2 +REG epsg:3857 3 -0x1.4p2 0x1.4p2 +REG epsg:3857 4 0x1.4p2 0x1.4p2 +REG epsg:3873 0 0x1.3p4 0x0.0p0 +REG epsg:3873 1 0x1.cp3 -0x1.4p2 +REG epsg:3873 2 0x1.8p4 -0x1.4p2 +REG epsg:3873 3 0x1.cp3 0x1.4p2 +REG epsg:3873 4 0x1.8p4 0x1.4p2 +REG epsg:3874 0 0x1.4p4 0x0.0p0 +REG epsg:3874 1 0x1.ep3 -0x1.4p2 +REG epsg:3874 2 0x1.9p4 -0x1.4p2 +REG epsg:3874 3 0x1.ep3 0x1.4p2 +REG epsg:3874 4 0x1.9p4 0x1.4p2 +REG epsg:3875 0 0x1.5p4 0x0.0p0 +REG epsg:3875 1 0x1.0p4 -0x1.4p2 +REG epsg:3875 2 0x1.ap4 -0x1.4p2 +REG epsg:3875 3 0x1.0p4 0x1.4p2 +REG epsg:3875 4 0x1.ap4 0x1.4p2 +REG epsg:3876 0 0x1.6p4 0x0.0p0 +REG epsg:3876 1 0x1.1p4 -0x1.4p2 +REG epsg:3876 2 0x1.bp4 -0x1.4p2 +REG epsg:3876 3 0x1.1p4 0x1.4p2 +REG epsg:3876 4 0x1.bp4 0x1.4p2 +REG epsg:3877 0 0x1.7p4 0x0.0p0 +REG epsg:3877 1 0x1.2p4 -0x1.4p2 +REG epsg:3877 2 0x1.cp4 -0x1.4p2 +REG epsg:3877 3 0x1.2p4 0x1.4p2 +REG epsg:3877 4 0x1.cp4 0x1.4p2 +REG epsg:3878 0 0x1.8p4 0x0.0p0 +REG epsg:3878 1 0x1.3p4 -0x1.4p2 +REG epsg:3878 2 0x1.dp4 -0x1.4p2 +REG epsg:3878 3 0x1.3p4 0x1.4p2 +REG epsg:3878 4 0x1.dp4 0x1.4p2 +REG epsg:3879 0 0x1.9p4 0x0.0p0 +REG epsg:3879 1 0x1.4p4 -0x1.4p2 +REG epsg:3879 2 0x1.ep4 -0x1.4p2 +REG epsg:3879 3 0x1.4p4 0x1.4p2 +REG epsg:3879 4 0x1.ep4 0x1.4p2 +REG epsg:3880 0 0x1.ap4 0x0.0p0 +REG epsg:3880 1 0x1.5p4 -0x1.4p2 +REG epsg:3880 2 0x1.fp4 -0x1.4p2 +REG epsg:3880 3 0x1.5p4 0x1.4p2 +REG epsg:3880 4 0x1.fp4 0x1.4p2 +REG epsg:3881 0 0x1.bp4 0x0.0p0 +REG epsg:3881 1 0x1.6p4 -0x1.4p2 +REG epsg:3881 2 0x1.0p5 -0x1.4p2 +REG epsg:3881 3 0x1.6p4 0x1.4p2 +REG epsg:3881 4 0x1.0p5 0x1.4p2 +REG epsg:3882 0 0x1.cp4 0x0.0p0 +REG epsg:3882 1 0x1.7p4 -0x1.4p2 +REG epsg:3882 2 0x1.08p5 -0x1.4p2 +REG epsg:3882 3 0x1.7p4 0x1.4p2 +REG epsg:3882 4 0x1.08p5 0x1.4p2 +REG epsg:3883 0 0x1.dp4 0x0.0p0 +REG epsg:3883 1 0x1.8p4 -0x1.4p2 +REG epsg:3883 2 0x1.1p5 -0x1.4p2 +REG epsg:3883 3 0x1.8p4 0x1.4p2 +REG epsg:3883 4 0x1.1p5 0x1.4p2 +REG epsg:3884 0 0x1.ep4 0x0.0p0 +REG epsg:3884 1 0x1.9p4 -0x1.4p2 +REG epsg:3884 2 0x1.18p5 -0x1.4p2 +REG epsg:3884 3 0x1.9p4 0x1.4p2 +REG epsg:3884 4 0x1.18p5 0x1.4p2 +REG epsg:3885 0 0x1.fp4 0x0.0p0 +REG epsg:3885 1 0x1.ap4 -0x1.4p2 +REG epsg:3885 2 0x1.2p5 -0x1.4p2 +REG epsg:3885 3 0x1.ap4 0x1.4p2 +REG epsg:3885 4 0x1.2p5 0x1.4p2 +REG epsg:3887 0 0x0.0p0 0x0.0p0 +REG epsg:3887 1 -0x1.4p2 -0x1.4p2 +REG epsg:3887 2 0x1.4p2 -0x1.4p2 +REG epsg:3887 3 -0x1.4p2 0x1.4p2 +REG epsg:3887 4 0x1.4p2 0x1.4p2 +REG epsg:3889 0 0x0.0p0 0x0.0p0 +REG epsg:3889 1 -0x1.4p2 -0x1.4p2 +REG epsg:3889 2 0x1.4p2 -0x1.4p2 +REG epsg:3889 3 -0x1.4p2 0x1.4p2 +REG epsg:3889 4 0x1.4p2 0x1.4p2 +REG epsg:3890 0 0x1.38p5 0x0.0p0 +REG epsg:3890 1 0x1.1p5 -0x1.4p2 +REG epsg:3890 2 0x1.6p5 -0x1.4p2 +REG epsg:3890 3 0x1.1p5 0x1.4p2 +REG epsg:3890 4 0x1.6p5 0x1.4p2 +REG epsg:3891 0 0x1.68p5 0x0.0p0 +REG epsg:3891 1 0x1.4p5 -0x1.4p2 +REG epsg:3891 2 0x1.9p5 -0x1.4p2 +REG epsg:3891 3 0x1.4p5 0x1.4p2 +REG epsg:3891 4 0x1.9p5 0x1.4p2 +REG epsg:3892 0 0x1.98p5 0x0.0p0 +REG epsg:3892 1 0x1.7p5 -0x1.4p2 +REG epsg:3892 2 0x1.cp5 -0x1.4p2 +REG epsg:3892 3 0x1.7p5 0x1.4p2 +REG epsg:3892 4 0x1.cp5 0x1.4p2 +REG epsg:3893 0 0x1.74p5 0x1.d06b98580964bp4 +REG epsg:3893 1 0x1.464113b4c1751p5 0x1.806b98580964bp4 +REG epsg:3893 2 0x1.a1beec4b3e8afp5 0x1.806b98580964bp4 +REG epsg:3893 3 0x1.464113b4c1751p5 0x1.1035cc2c04b26p5 +REG epsg:3893 4 0x1.a1beec4b3e8afp5 0x1.1035cc2c04b26p5 +REG epsg:3901 0 0x1.bp4 0x0.0p0 +REG epsg:3901 1 0x1.6p4 -0x1.4p2 +REG epsg:3901 2 0x1.0p5 -0x1.4p2 +REG epsg:3901 3 0x1.6p4 0x1.4p2 +REG epsg:3901 4 0x1.0p5 0x1.4p2 +REG epsg:3902 0 0x1.bp4 0x0.0p0 +REG epsg:3902 1 0x1.6p4 -0x1.4p2 +REG epsg:3902 2 0x1.0p5 -0x1.4p2 +REG epsg:3902 3 0x1.6p4 0x1.4p2 +REG epsg:3902 4 0x1.0p5 0x1.4p2 +REG epsg:3903 0 0x1.bp4 0x0.0p0 +REG epsg:3903 1 0x1.6p4 -0x1.4p2 +REG epsg:3903 2 0x1.0p5 -0x1.4p2 +REG epsg:3903 3 0x1.6p4 0x1.4p2 +REG epsg:3903 4 0x1.0p5 0x1.4p2 +REG epsg:3906 0 0x0.0p0 0x0.0p0 +REG epsg:3906 1 -0x1.4p2 -0x1.4p2 +REG epsg:3906 2 0x1.4p2 -0x1.4p2 +REG epsg:3906 3 -0x1.4p2 0x1.4p2 +REG epsg:3906 4 0x1.4p2 0x1.4p2 +REG epsg:3907 0 0x1.ep3 0x0.0p0 +REG epsg:3907 1 0x1.4p3 -0x1.4p2 +REG epsg:3907 2 0x1.4p4 -0x1.4p2 +REG epsg:3907 3 0x1.4p3 0x1.4p2 +REG epsg:3907 4 0x1.4p4 0x1.4p2 +REG epsg:3908 0 0x1.2p4 0x0.0p0 +REG epsg:3908 1 0x1.ap3 -0x1.4p2 +REG epsg:3908 2 0x1.7p4 -0x1.4p2 +REG epsg:3908 3 0x1.ap3 0x1.4p2 +REG epsg:3908 4 0x1.7p4 0x1.4p2 +REG epsg:3909 0 0x1.5p4 0x0.0p0 +REG epsg:3909 1 0x1.0p4 -0x1.4p2 +REG epsg:3909 2 0x1.ap4 -0x1.4p2 +REG epsg:3909 3 0x1.0p4 0x1.4p2 +REG epsg:3909 4 0x1.ap4 0x1.4p2 +REG epsg:3910 0 0x1.8p4 0x0.0p0 +REG epsg:3910 1 0x1.3p4 -0x1.4p2 +REG epsg:3910 2 0x1.dp4 -0x1.4p2 +REG epsg:3910 3 0x1.3p4 0x1.4p2 +REG epsg:3910 4 0x1.dp4 0x1.4p2 +REG epsg:3911 0 0x1.ep3 0x0.0p0 +REG epsg:3911 1 0x1.4p3 -0x1.4p2 +REG epsg:3911 2 0x1.4p4 -0x1.4p2 +REG epsg:3911 3 0x1.4p3 0x1.4p2 +REG epsg:3911 4 0x1.4p4 0x1.4p2 +REG epsg:3912 0 0x1.ep3 0x0.0p0 +REG epsg:3912 1 0x1.4p3 -0x1.4p2 +REG epsg:3912 2 0x1.4p4 -0x1.4p2 +REG epsg:3912 3 0x1.4p3 0x1.4p2 +REG epsg:3912 4 0x1.4p4 0x1.4p2 +REG epsg:3920 0 -0x1.f8p5 0x0.0p0 +REG epsg:3920 1 -0x1.1p6 -0x1.4p2 +REG epsg:3920 2 -0x1.dp5 -0x1.4p2 +REG epsg:3920 3 -0x1.1p6 0x1.4p2 +REG epsg:3920 4 -0x1.dp5 0x1.4p2 +REG epsg:3942 0 0x1.8p1 0x1.5p5 +REG epsg:3942 1 0x1.f68dd71dbd7e8p-1 0x1.44p5 +REG epsg:3942 2 0x1.412e451c48503p2 0x1.44p5 +REG epsg:3942 3 0x1.f68dd71dbd7e8p-1 0x1.5cp5 +REG epsg:3942 4 0x1.412e451c48503p2 0x1.5cp5 +REG epsg:3943 0 0x1.8p1 0x1.58p5 +REG epsg:3943 1 0x1.e5e47b86f9f98p-1 0x1.4cp5 +REG epsg:3943 2 0x1.4343708f20c0dp2 0x1.4cp5 +REG epsg:3943 3 0x1.e5e47b86f9f98p-1 0x1.64p5 +REG epsg:3943 4 0x1.4343708f20c0dp2 0x1.64p5 +REG epsg:3944 0 0x1.8p1 0x1.6p5 +REG epsg:3944 1 0x1.d45ab7797af74p-1 0x1.54p5 +REG epsg:3944 2 0x1.4574a910d0a12p2 0x1.54p5 +REG epsg:3944 3 0x1.d45ab7797af74p-1 0x1.6cp5 +REG epsg:3944 4 0x1.4574a910d0a12p2 0x1.6cp5 +REG epsg:3945 0 0x1.8p1 0x1.68p5 +REG epsg:3945 1 0x1.c1e24cc824c9cp-1 0x1.5cp5 +REG epsg:3945 2 0x1.47c3b666fb66cp2 0x1.5cp5 +REG epsg:3945 3 0x1.c1e24cc824c9cp-1 0x1.74p5 +REG epsg:3945 4 0x1.47c3b666fb66cp2 0x1.74p5 +REG epsg:3946 0 0x1.8p1 0x1.7p5 +REG epsg:3946 1 0x1.ae6baaf8b1984p-1 0x1.64p5 +REG epsg:3946 2 0x1.4a328aa0e9cdp2 0x1.64p5 +REG epsg:3946 3 0x1.ae6baaf8b1984p-1 0x1.7cp5 +REG epsg:3946 4 0x1.4a328aa0e9cdp2 0x1.7cp5 +REG epsg:3947 0 0x1.8p1 0x1.78p5 +REG epsg:3947 1 0x1.99e5c8289deccp-1 0x1.6cp5 +REG epsg:3947 2 0x1.4cc346faec426p2 0x1.6cp5 +REG epsg:3947 3 0x1.99e5c8289deccp-1 0x1.84p5 +REG epsg:3947 4 0x1.4cc346faec426p2 0x1.84p5 +REG epsg:3948 0 0x1.8p1 0x1.8p5 +REG epsg:3948 1 0x1.843df45913e94p-1 0x1.74p5 +REG epsg:3948 2 0x1.4f784174dd82ep2 0x1.74p5 +REG epsg:3948 3 0x1.843df45913e94p-1 0x1.8cp5 +REG epsg:3948 4 0x1.4f784174dd82ep2 0x1.8cp5 +REG epsg:3949 0 0x1.8p1 0x1.88p5 +REG epsg:3949 1 0x1.6d5fa62d507e4p-1 0x1.7cp5 +REG epsg:3949 2 0x1.52540b3a55f04p2 0x1.7cp5 +REG epsg:3949 3 0x1.6d5fa62d507e4p-1 0x1.94p5 +REG epsg:3949 4 0x1.52540b3a55f04p2 0x1.94p5 +REG epsg:3950 0 0x1.8p1 0x1.9p5 +REG epsg:3950 1 0x1.55343ff614668p-1 0x1.84p5 +REG epsg:3950 2 0x1.555978013d733p2 0x1.84p5 +REG epsg:3950 3 0x1.55343ff614668p-1 0x1.9cp5 +REG epsg:3950 4 0x1.555978013d733p2 0x1.9cp5 +REG epsg:3968 0 -0x1.3ep6 0x1.2ep5 +REG epsg:3968 1 -0x1.4fb4c0980fa7fp6 0x1.12p5 +REG epsg:3968 2 -0x1.2c4b3f67f0581p6 0x1.12p5 +REG epsg:3968 3 -0x1.4fb4c0980fa7fp6 0x1.4ap5 +REG epsg:3968 4 -0x1.2c4b3f67f0581p6 0x1.4ap5 +REG epsg:3969 0 -0x1.3ep6 0x1.2ep5 +REG epsg:3969 1 -0x1.4fb4c0980fa7fp6 0x1.12p5 +REG epsg:3969 2 -0x1.2c4b3f67f0581p6 0x1.12p5 +REG epsg:3969 3 -0x1.4fb4c0980fa7fp6 0x1.4ap5 +REG epsg:3969 4 -0x1.2c4b3f67f0581p6 0x1.4ap5 +REG epsg:3970 0 -0x1.3ep6 0x1.2ep5 +REG epsg:3970 1 -0x1.4fb4c0980fa7fp6 0x1.12p5 +REG epsg:3970 2 -0x1.2c4b3f67f0581p6 0x1.12p5 +REG epsg:3970 3 -0x1.4fb4c0980fa7fp6 0x1.4ap5 +REG epsg:3970 4 -0x1.2c4b3f67f0581p6 0x1.4ap5 +REG epsg:3973 0 0x0.0p0 0x1.64p6 +REG epsg:3973 1 -0x1.ep5 0x1.54p6 +REG epsg:3973 2 0x1.ep5 0x1.54p6 +REG epsg:3973 3 -0x1.ep5 0x1.64p6 +REG epsg:3973 4 0x1.ep5 0x1.64p6 +REG epsg:3974 0 0x0.0p0 -0x1.64p6 +REG epsg:3974 1 -0x1.ep5 -0x1.64p6 +REG epsg:3974 2 0x1.ep5 -0x1.64p6 +REG epsg:3974 3 -0x1.ep5 -0x1.54p6 +REG epsg:3974 4 0x1.ep5 -0x1.54p6 +REG epsg:3975 0 0x0.0p0 0x1.ep4 +REG epsg:3975 1 -0x1.7181116f43fe3p2 0x1.9p4 +REG epsg:3975 2 0x1.7181116f43fe3p2 0x1.9p4 +REG epsg:3975 3 -0x1.7181116f43fe3p2 0x1.18p5 +REG epsg:3975 4 0x1.7181116f43fe3p2 0x1.18p5 +REG epsg:3976 0 0x0.0p0 -0x1.4p6 +REG epsg:3976 1 -0x1.ep5 -0x1.64p6 +REG epsg:3976 2 0x1.ep5 -0x1.64p6 +REG epsg:3976 3 -0x1.ep5 -0x1.04p6 +REG epsg:3976 4 0x1.ep5 -0x1.04p6 +REG epsg:3978 0 -0x1.7cp6 0x1.f8p5 +REG epsg:3978 1 -0x1.0014a74f2f52p7 0x1.8p5 +REG epsg:3978 2 -0x1.efad62c342b8p5 0x1.8p5 +REG epsg:3978 3 -0x1.0014a74f2f52p7 0x1.38p6 +REG epsg:3978 4 -0x1.efad62c342b8p5 0x1.38p6 +REG epsg:3979 0 -0x1.7cp6 0x1.f8p5 +REG epsg:3979 1 -0x1.0014a74f2f52p7 0x1.8p5 +REG epsg:3979 2 -0x1.efad62c342b8p5 0x1.8p5 +REG epsg:3979 3 -0x1.0014a74f2f52p7 0x1.38p6 +REG epsg:3979 4 -0x1.efad62c342b8p5 0x1.38p6 +REG epsg:3985 0 0x1.ap4 -0x1.4p0 +REG epsg:3985 1 0x1.5fe2c03cc2059p3 -0x1.04p4 +REG epsg:3985 2 0x1.48074ff0cf7eap5 -0x1.04p4 +REG epsg:3985 3 0x1.5fe2c03cc2059p3 0x1.b8p3 +REG epsg:3985 4 0x1.48074ff0cf7eap5 0x1.b8p3 +REG epsg:3986 0 0x1.ep4 -0x1.2p3 +REG epsg:3986 1 0x1.8f00b6d76p4 -0x1.cp3 +REG epsg:3986 2 0x1.187fa4945p5 -0x1.cp3 +REG epsg:3986 3 0x1.8f00b6d76p4 -0x1.0p2 +REG epsg:3986 4 0x1.187fa4945p5 -0x1.0p2 +REG epsg:3987 0 0x1.cp4 -0x1.2p3 +REG epsg:3987 1 0x1.6f00b6d76p4 -0x1.cp3 +REG epsg:3987 2 0x1.087fa4945p5 -0x1.cp3 +REG epsg:3987 3 0x1.6f00b6d76p4 -0x1.0p2 +REG epsg:3987 4 0x1.087fa4945p5 -0x1.0p2 +REG epsg:3988 0 0x1.ap4 -0x1.2p3 +REG epsg:3988 1 0x1.4f00b6d76p4 -0x1.cp3 +REG epsg:3988 2 0x1.f0ff4928ap4 -0x1.cp3 +REG epsg:3988 3 0x1.4f00b6d76p4 -0x1.0p2 +REG epsg:3988 4 0x1.f0ff4928ap4 -0x1.0p2 +REG epsg:3989 0 0x1.8p4 -0x1.2p3 +REG epsg:3989 1 0x1.2f00b6d76p4 -0x1.cp3 +REG epsg:3989 2 0x1.d0ff4928ap4 -0x1.cp3 +REG epsg:3989 3 0x1.2f00b6d76p4 -0x1.0p2 +REG epsg:3989 4 0x1.d0ff4928ap4 -0x1.0p2 +REG epsg:3991 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:3991 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:3991 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:3991 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:3991 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:3992 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:3992 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:3992 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:3992 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:3992 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:3994 0 0x1.9p6 -0x1.48p5 +REG epsg:3994 1 0x1.757feef827d5fp6 -0x1.7p5 +REG epsg:3994 2 0x1.aa801107d82a1p6 -0x1.7p5 +REG epsg:3994 3 0x1.757feef827d5fp6 -0x1.2p5 +REG epsg:3994 4 0x1.aa801107d82a1p6 -0x1.2p5 +REG epsg:3995 0 0x0.0p0 0x1.42p6 +REG epsg:3995 1 -0x1.ep5 0x1.06p6 +REG epsg:3995 2 0x1.ep5 0x1.06p6 +REG epsg:3995 3 -0x1.ep5 0x1.64p6 +REG epsg:3995 4 0x1.ep5 0x1.64p6 +REG epsg:3996 0 0x0.0p0 0x1.4ap6 +REG epsg:3996 1 -0x1.ep5 0x1.0ep6 +REG epsg:3996 2 0x1.ep5 0x1.0ep6 +REG epsg:3996 3 -0x1.ep5 0x1.64p6 +REG epsg:3996 4 0x1.ep5 0x1.64p6 +REG epsg:3997 0 0x1.baaaaaaaaaaacp5 0x0.0p0 +REG epsg:3997 1 0x1.92aaaaaaaaaacp5 -0x1.4p2 +REG epsg:3997 2 0x1.e2aaaaaaaaaacp5 -0x1.4p2 +REG epsg:3997 3 0x1.92aaaaaaaaaacp5 0x1.4p2 +REG epsg:3997 4 0x1.e2aaaaaaaaaacp5 0x1.4p2 +REG epsg:4000 0 0x0.0p0 0x0.0p0 +REG epsg:4000 1 -0x1.4p2 -0x1.4p2 +REG epsg:4000 2 0x1.4p2 -0x1.4p2 +REG epsg:4000 3 -0x1.4p2 0x1.4p2 +REG epsg:4000 4 0x1.4p2 0x1.4p2 +REG epsg:4001 0 0x0.0p0 0x0.0p0 +REG epsg:4001 1 -0x1.4p2 -0x1.4p2 +REG epsg:4001 2 0x1.4p2 -0x1.4p2 +REG epsg:4001 3 -0x1.4p2 0x1.4p2 +REG epsg:4001 4 0x1.4p2 0x1.4p2 +REG epsg:4002 0 0x0.0p0 0x0.0p0 +REG epsg:4002 1 -0x1.4p2 -0x1.4p2 +REG epsg:4002 2 0x1.4p2 -0x1.4p2 +REG epsg:4002 3 -0x1.4p2 0x1.4p2 +REG epsg:4002 4 0x1.4p2 0x1.4p2 +REG epsg:4003 0 0x0.0p0 0x0.0p0 +REG epsg:4003 1 -0x1.4p2 -0x1.4p2 +REG epsg:4003 2 0x1.4p2 -0x1.4p2 +REG epsg:4003 3 -0x1.4p2 0x1.4p2 +REG epsg:4003 4 0x1.4p2 0x1.4p2 +REG epsg:4004 0 0x0.0p0 0x0.0p0 +REG epsg:4004 1 -0x1.4p2 -0x1.4p2 +REG epsg:4004 2 0x1.4p2 -0x1.4p2 +REG epsg:4004 3 -0x1.4p2 0x1.4p2 +REG epsg:4004 4 0x1.4p2 0x1.4p2 +REG epsg:4005 0 0x0.0p0 0x0.0p0 +REG epsg:4005 1 -0x1.4p2 -0x1.4p2 +REG epsg:4005 2 0x1.4p2 -0x1.4p2 +REG epsg:4005 3 -0x1.4p2 0x1.4p2 +REG epsg:4005 4 0x1.4p2 0x1.4p2 +REG epsg:4006 0 0x0.0p0 0x0.0p0 +REG epsg:4006 1 -0x1.4p2 -0x1.4p2 +REG epsg:4006 2 0x1.4p2 -0x1.4p2 +REG epsg:4006 3 -0x1.4p2 0x1.4p2 +REG epsg:4006 4 0x1.4p2 0x1.4p2 +REG epsg:4007 0 0x0.0p0 0x0.0p0 +REG epsg:4007 1 -0x1.4p2 -0x1.4p2 +REG epsg:4007 2 0x1.4p2 -0x1.4p2 +REG epsg:4007 3 -0x1.4p2 0x1.4p2 +REG epsg:4007 4 0x1.4p2 0x1.4p2 +REG epsg:4008 0 0x0.0p0 0x0.0p0 +REG epsg:4008 1 -0x1.4p2 -0x1.4p2 +REG epsg:4008 2 0x1.4p2 -0x1.4p2 +REG epsg:4008 3 -0x1.4p2 0x1.4p2 +REG epsg:4008 4 0x1.4p2 0x1.4p2 +REG epsg:4009 0 0x0.0p0 0x0.0p0 +REG epsg:4009 1 -0x1.4p2 -0x1.4p2 +REG epsg:4009 2 0x1.4p2 -0x1.4p2 +REG epsg:4009 3 -0x1.4p2 0x1.4p2 +REG epsg:4009 4 0x1.4p2 0x1.4p2 +REG epsg:4010 0 0x0.0p0 0x0.0p0 +REG epsg:4010 1 -0x1.4p2 -0x1.4p2 +REG epsg:4010 2 0x1.4p2 -0x1.4p2 +REG epsg:4010 3 -0x1.4p2 0x1.4p2 +REG epsg:4010 4 0x1.4p2 0x1.4p2 +REG epsg:4011 0 0x0.0p0 0x0.0p0 +REG epsg:4011 1 -0x1.4p2 -0x1.4p2 +REG epsg:4011 2 0x1.4p2 -0x1.4p2 +REG epsg:4011 3 -0x1.4p2 0x1.4p2 +REG epsg:4011 4 0x1.4p2 0x1.4p2 +REG epsg:4012 0 0x0.0p0 0x0.0p0 +REG epsg:4012 1 -0x1.4p2 -0x1.4p2 +REG epsg:4012 2 0x1.4p2 -0x1.4p2 +REG epsg:4012 3 -0x1.4p2 0x1.4p2 +REG epsg:4012 4 0x1.4p2 0x1.4p2 +REG epsg:4013 0 0x0.0p0 0x0.0p0 +REG epsg:4013 1 -0x1.4p2 -0x1.4p2 +REG epsg:4013 2 0x1.4p2 -0x1.4p2 +REG epsg:4013 3 -0x1.4p2 0x1.4p2 +REG epsg:4013 4 0x1.4p2 0x1.4p2 +REG epsg:4014 0 0x0.0p0 0x0.0p0 +REG epsg:4014 1 -0x1.4p2 -0x1.4p2 +REG epsg:4014 2 0x1.4p2 -0x1.4p2 +REG epsg:4014 3 -0x1.4p2 0x1.4p2 +REG epsg:4014 4 0x1.4p2 0x1.4p2 +REG epsg:4015 0 0x0.0p0 0x0.0p0 +REG epsg:4015 1 -0x1.4p2 -0x1.4p2 +REG epsg:4015 2 0x1.4p2 -0x1.4p2 +REG epsg:4015 3 -0x1.4p2 0x1.4p2 +REG epsg:4015 4 0x1.4p2 0x1.4p2 +REG epsg:4016 0 0x0.0p0 0x0.0p0 +REG epsg:4016 1 -0x1.4p2 -0x1.4p2 +REG epsg:4016 2 0x1.4p2 -0x1.4p2 +REG epsg:4016 3 -0x1.4p2 0x1.4p2 +REG epsg:4016 4 0x1.4p2 0x1.4p2 +REG epsg:4018 0 0x0.0p0 0x0.0p0 +REG epsg:4018 1 -0x1.4p2 -0x1.4p2 +REG epsg:4018 2 0x1.4p2 -0x1.4p2 +REG epsg:4018 3 -0x1.4p2 0x1.4p2 +REG epsg:4018 4 0x1.4p2 0x1.4p2 +REG epsg:4019 0 0x0.0p0 0x0.0p0 +REG epsg:4019 1 -0x1.4p2 -0x1.4p2 +REG epsg:4019 2 0x1.4p2 -0x1.4p2 +REG epsg:4019 3 -0x1.4p2 0x1.4p2 +REG epsg:4019 4 0x1.4p2 0x1.4p2 +REG epsg:4020 0 0x0.0p0 0x0.0p0 +REG epsg:4020 1 -0x1.4p2 -0x1.4p2 +REG epsg:4020 2 0x1.4p2 -0x1.4p2 +REG epsg:4020 3 -0x1.4p2 0x1.4p2 +REG epsg:4020 4 0x1.4p2 0x1.4p2 +REG epsg:4021 0 0x0.0p0 0x0.0p0 +REG epsg:4021 1 -0x1.4p2 -0x1.4p2 +REG epsg:4021 2 0x1.4p2 -0x1.4p2 +REG epsg:4021 3 -0x1.4p2 0x1.4p2 +REG epsg:4021 4 0x1.4p2 0x1.4p2 +REG epsg:4022 0 0x0.0p0 0x0.0p0 +REG epsg:4022 1 -0x1.4p2 -0x1.4p2 +REG epsg:4022 2 0x1.4p2 -0x1.4p2 +REG epsg:4022 3 -0x1.4p2 0x1.4p2 +REG epsg:4022 4 0x1.4p2 0x1.4p2 +REG epsg:4023 0 0x0.0p0 0x0.0p0 +REG epsg:4023 1 -0x1.4p2 -0x1.4p2 +REG epsg:4023 2 0x1.4p2 -0x1.4p2 +REG epsg:4023 3 -0x1.4p2 0x1.4p2 +REG epsg:4023 4 0x1.4p2 0x1.4p2 +REG epsg:4024 0 0x0.0p0 0x0.0p0 +REG epsg:4024 1 -0x1.4p2 -0x1.4p2 +REG epsg:4024 2 0x1.4p2 -0x1.4p2 +REG epsg:4024 3 -0x1.4p2 0x1.4p2 +REG epsg:4024 4 0x1.4p2 0x1.4p2 +REG epsg:4025 0 0x0.0p0 0x0.0p0 +REG epsg:4025 1 -0x1.4p2 -0x1.4p2 +REG epsg:4025 2 0x1.4p2 -0x1.4p2 +REG epsg:4025 3 -0x1.4p2 0x1.4p2 +REG epsg:4025 4 0x1.4p2 0x1.4p2 +REG epsg:4026 0 0x1.c666666666666p4 0x0.0p0 +REG epsg:4026 1 0x1.7666666666666p4 -0x1.4p2 +REG epsg:4026 2 0x1.0b33333333333p5 -0x1.4p2 +REG epsg:4026 3 0x1.7666666666666p4 0x1.4p2 +REG epsg:4026 4 0x1.0b33333333333p5 0x1.4p2 +REG epsg:4027 0 0x0.0p0 0x0.0p0 +REG epsg:4027 1 -0x1.4p2 -0x1.4p2 +REG epsg:4027 2 0x1.4p2 -0x1.4p2 +REG epsg:4027 3 -0x1.4p2 0x1.4p2 +REG epsg:4027 4 0x1.4p2 0x1.4p2 +REG epsg:4028 0 0x0.0p0 0x0.0p0 +REG epsg:4028 1 -0x1.4p2 -0x1.4p2 +REG epsg:4028 2 0x1.4p2 -0x1.4p2 +REG epsg:4028 3 -0x1.4p2 0x1.4p2 +REG epsg:4028 4 0x1.4p2 0x1.4p2 +REG epsg:4029 0 0x0.0p0 0x0.0p0 +REG epsg:4029 1 -0x1.4p2 -0x1.4p2 +REG epsg:4029 2 0x1.4p2 -0x1.4p2 +REG epsg:4029 3 -0x1.4p2 0x1.4p2 +REG epsg:4029 4 0x1.4p2 0x1.4p2 +REG epsg:4030 0 0x0.0p0 0x0.0p0 +REG epsg:4030 1 -0x1.4p2 -0x1.4p2 +REG epsg:4030 2 0x1.4p2 -0x1.4p2 +REG epsg:4030 3 -0x1.4p2 0x1.4p2 +REG epsg:4030 4 0x1.4p2 0x1.4p2 +REG epsg:4031 0 0x0.0p0 0x0.0p0 +REG epsg:4031 1 -0x1.4p2 -0x1.4p2 +REG epsg:4031 2 0x1.4p2 -0x1.4p2 +REG epsg:4031 3 -0x1.4p2 0x1.4p2 +REG epsg:4031 4 0x1.4p2 0x1.4p2 +REG epsg:4032 0 0x0.0p0 0x0.0p0 +REG epsg:4032 1 -0x1.4p2 -0x1.4p2 +REG epsg:4032 2 0x1.4p2 -0x1.4p2 +REG epsg:4032 3 -0x1.4p2 0x1.4p2 +REG epsg:4032 4 0x1.4p2 0x1.4p2 +REG epsg:4033 0 0x0.0p0 0x0.0p0 +REG epsg:4033 1 -0x1.4p2 -0x1.4p2 +REG epsg:4033 2 0x1.4p2 -0x1.4p2 +REG epsg:4033 3 -0x1.4p2 0x1.4p2 +REG epsg:4033 4 0x1.4p2 0x1.4p2 +REG epsg:4034 0 0x0.0p0 0x0.0p0 +REG epsg:4034 1 -0x1.4p2 -0x1.4p2 +REG epsg:4034 2 0x1.4p2 -0x1.4p2 +REG epsg:4034 3 -0x1.4p2 0x1.4p2 +REG epsg:4034 4 0x1.4p2 0x1.4p2 +REG epsg:4035 0 0x0.0p0 0x0.0p0 +REG epsg:4035 1 -0x1.4p2 -0x1.4p2 +REG epsg:4035 2 0x1.4p2 -0x1.4p2 +REG epsg:4035 3 -0x1.4p2 0x1.4p2 +REG epsg:4035 4 0x1.4p2 0x1.4p2 +REG epsg:4036 0 0x0.0p0 0x0.0p0 +REG epsg:4036 1 -0x1.4p2 -0x1.4p2 +REG epsg:4036 2 0x1.4p2 -0x1.4p2 +REG epsg:4036 3 -0x1.4p2 0x1.4p2 +REG epsg:4036 4 0x1.4p2 0x1.4p2 +REG epsg:4037 0 0x1.bp4 0x0.0p0 +REG epsg:4037 1 0x1.6p4 -0x1.4p2 +REG epsg:4037 2 0x1.0p5 -0x1.4p2 +REG epsg:4037 3 0x1.6p4 0x1.4p2 +REG epsg:4037 4 0x1.0p5 0x1.4p2 +REG epsg:4038 0 0x1.08p5 0x0.0p0 +REG epsg:4038 1 0x1.cp4 -0x1.4p2 +REG epsg:4038 2 0x1.3p5 -0x1.4p2 +REG epsg:4038 3 0x1.cp4 0x1.4p2 +REG epsg:4038 4 0x1.3p5 0x1.4p2 +REG epsg:4039 0 0x0.0p0 0x0.0p0 +REG epsg:4039 1 -0x1.4p2 -0x1.4p2 +REG epsg:4039 2 0x1.4p2 -0x1.4p2 +REG epsg:4039 3 -0x1.4p2 0x1.4p2 +REG epsg:4039 4 0x1.4p2 0x1.4p2 +REG epsg:4041 0 0x0.0p0 0x0.0p0 +REG epsg:4041 1 -0x1.4p2 -0x1.4p2 +REG epsg:4041 2 0x1.4p2 -0x1.4p2 +REG epsg:4041 3 -0x1.4p2 0x1.4p2 +REG epsg:4041 4 0x1.4p2 0x1.4p2 +REG epsg:4042 0 0x0.0p0 0x0.0p0 +REG epsg:4042 1 -0x1.4p2 -0x1.4p2 +REG epsg:4042 2 0x1.4p2 -0x1.4p2 +REG epsg:4042 3 -0x1.4p2 0x1.4p2 +REG epsg:4042 4 0x1.4p2 0x1.4p2 +REG epsg:4043 0 0x0.0p0 0x0.0p0 +REG epsg:4043 1 -0x1.4p2 -0x1.4p2 +REG epsg:4043 2 0x1.4p2 -0x1.4p2 +REG epsg:4043 3 -0x1.4p2 0x1.4p2 +REG epsg:4043 4 0x1.4p2 0x1.4p2 +REG epsg:4044 0 0x0.0p0 0x0.0p0 +REG epsg:4044 1 -0x1.4p2 -0x1.4p2 +REG epsg:4044 2 0x1.4p2 -0x1.4p2 +REG epsg:4044 3 -0x1.4p2 0x1.4p2 +REG epsg:4044 4 0x1.4p2 0x1.4p2 +REG epsg:4045 0 0x0.0p0 0x0.0p0 +REG epsg:4045 1 -0x1.4p2 -0x1.4p2 +REG epsg:4045 2 0x1.4p2 -0x1.4p2 +REG epsg:4045 3 -0x1.4p2 0x1.4p2 +REG epsg:4045 4 0x1.4p2 0x1.4p2 +REG epsg:4046 0 0x0.0p0 0x0.0p0 +REG epsg:4046 1 -0x1.4p2 -0x1.4p2 +REG epsg:4046 2 0x1.4p2 -0x1.4p2 +REG epsg:4046 3 -0x1.4p2 0x1.4p2 +REG epsg:4046 4 0x1.4p2 0x1.4p2 +REG epsg:4047 0 0x0.0p0 0x0.0p0 +REG epsg:4047 1 -0x1.4p2 -0x1.4p2 +REG epsg:4047 2 0x1.4p2 -0x1.4p2 +REG epsg:4047 3 -0x1.4p2 0x1.4p2 +REG epsg:4047 4 0x1.4p2 0x1.4p2 +REG epsg:4048 0 0x1.8p3 0x0.0p0 +REG epsg:4048 1 0x1.cp2 -0x1.4p2 +REG epsg:4048 2 0x1.1p4 -0x1.4p2 +REG epsg:4048 3 0x1.cp2 0x1.4p2 +REG epsg:4048 4 0x1.1p4 0x1.4p2 +REG epsg:4049 0 0x1.cp3 0x0.0p0 +REG epsg:4049 1 0x1.2p3 -0x1.4p2 +REG epsg:4049 2 0x1.3p4 -0x1.4p2 +REG epsg:4049 3 0x1.2p3 0x1.4p2 +REG epsg:4049 4 0x1.3p4 0x1.4p2 +REG epsg:4050 0 0x1.0p4 0x0.0p0 +REG epsg:4050 1 0x1.6p3 -0x1.4p2 +REG epsg:4050 2 0x1.5p4 -0x1.4p2 +REG epsg:4050 3 0x1.6p3 0x1.4p2 +REG epsg:4050 4 0x1.5p4 0x1.4p2 +REG epsg:4051 0 0x1.2p4 0x0.0p0 +REG epsg:4051 1 0x1.ap3 -0x1.4p2 +REG epsg:4051 2 0x1.7p4 -0x1.4p2 +REG epsg:4051 3 0x1.ap3 0x1.4p2 +REG epsg:4051 4 0x1.7p4 0x1.4p2 +REG epsg:4052 0 0x0.0p0 0x0.0p0 +REG epsg:4052 1 -0x1.4p2 -0x1.4p2 +REG epsg:4052 2 0x1.4p2 -0x1.4p2 +REG epsg:4052 3 -0x1.4p2 0x1.4p2 +REG epsg:4052 4 0x1.4p2 0x1.4p2 +REG epsg:4053 0 0x0.0p0 0x0.0p0 +REG epsg:4053 1 -0x1.4p2 -0x1.4p2 +REG epsg:4053 2 0x1.4p2 -0x1.4p2 +REG epsg:4053 3 -0x1.4p2 0x1.4p2 +REG epsg:4053 4 0x1.4p2 0x1.4p2 +REG epsg:4054 0 0x0.0p0 0x0.0p0 +REG epsg:4054 1 -0x1.4p2 -0x1.4p2 +REG epsg:4054 2 0x1.4p2 -0x1.4p2 +REG epsg:4054 3 -0x1.4p2 0x1.4p2 +REG epsg:4054 4 0x1.4p2 0x1.4p2 +REG epsg:4055 0 0x0.0p0 0x0.0p0 +REG epsg:4055 1 -0x1.4p2 -0x1.4p2 +REG epsg:4055 2 0x1.4p2 -0x1.4p2 +REG epsg:4055 3 -0x1.4p2 0x1.4p2 +REG epsg:4055 4 0x1.4p2 0x1.4p2 +REG epsg:4056 0 0x1.4p4 0x0.0p0 +REG epsg:4056 1 0x1.ep3 -0x1.4p2 +REG epsg:4056 2 0x1.9p4 -0x1.4p2 +REG epsg:4056 3 0x1.ep3 0x1.4p2 +REG epsg:4056 4 0x1.9p4 0x1.4p2 +REG epsg:4057 0 0x1.6p4 0x0.0p0 +REG epsg:4057 1 0x1.1p4 -0x1.4p2 +REG epsg:4057 2 0x1.bp4 -0x1.4p2 +REG epsg:4057 3 0x1.1p4 0x1.4p2 +REG epsg:4057 4 0x1.bp4 0x1.4p2 +REG epsg:4058 0 0x1.8p4 0x0.0p0 +REG epsg:4058 1 0x1.3p4 -0x1.4p2 +REG epsg:4058 2 0x1.dp4 -0x1.4p2 +REG epsg:4058 3 0x1.3p4 0x1.4p2 +REG epsg:4058 4 0x1.dp4 0x1.4p2 +REG epsg:4059 0 0x1.ap4 0x0.0p0 +REG epsg:4059 1 0x1.5p4 -0x1.4p2 +REG epsg:4059 2 0x1.fp4 -0x1.4p2 +REG epsg:4059 3 0x1.5p4 0x1.4p2 +REG epsg:4059 4 0x1.fp4 0x1.4p2 +REG epsg:4060 0 0x1.cp4 0x0.0p0 +REG epsg:4060 1 0x1.7p4 -0x1.4p2 +REG epsg:4060 2 0x1.08p5 -0x1.4p2 +REG epsg:4060 3 0x1.7p4 0x1.4p2 +REG epsg:4060 4 0x1.08p5 0x1.4p2 +REG epsg:4061 0 0x1.ep3 -0x1.9p4 +REG epsg:4061 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:4061 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:4061 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:4061 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:4062 0 0x1.5p4 -0x1.9p4 +REG epsg:4062 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG epsg:4062 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG epsg:4062 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG epsg:4062 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG epsg:4063 0 0x1.bp4 -0x1.9p4 +REG epsg:4063 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:4063 2 0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:4063 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:4063 4 0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:4071 0 -0x1.68p5 -0x1.9p4 +REG epsg:4071 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:4071 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:4071 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:4071 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:4073 0 0x0.0p0 0x0.0p0 +REG epsg:4073 1 -0x1.4p2 -0x1.4p2 +REG epsg:4073 2 0x1.4p2 -0x1.4p2 +REG epsg:4073 3 -0x1.4p2 0x1.4p2 +REG epsg:4073 4 0x1.4p2 0x1.4p2 +REG epsg:4075 0 0x0.0p0 0x0.0p0 +REG epsg:4075 1 -0x1.4p2 -0x1.4p2 +REG epsg:4075 2 0x1.4p2 -0x1.4p2 +REG epsg:4075 3 -0x1.4p2 0x1.4p2 +REG epsg:4075 4 0x1.4p2 0x1.4p2 +REG epsg:4079 0 0x0.0p0 0x0.0p0 +REG epsg:4079 1 -0x1.4p2 -0x1.4p2 +REG epsg:4079 2 0x1.4p2 -0x1.4p2 +REG epsg:4079 3 -0x1.4p2 0x1.4p2 +REG epsg:4079 4 0x1.4p2 0x1.4p2 +REG epsg:4081 0 0x0.0p0 0x0.0p0 +REG epsg:4081 1 -0x1.4p2 -0x1.4p2 +REG epsg:4081 2 0x1.4p2 -0x1.4p2 +REG epsg:4081 3 -0x1.4p2 0x1.4p2 +REG epsg:4081 4 0x1.4p2 0x1.4p2 +REG epsg:4082 0 -0x1.5p4 0x0.0p0 +REG epsg:4082 1 -0x1.ap4 -0x1.4p2 +REG epsg:4082 2 -0x1.0p4 -0x1.4p2 +REG epsg:4082 3 -0x1.ap4 0x1.4p2 +REG epsg:4082 4 -0x1.0p4 0x1.4p2 +REG epsg:4083 0 -0x1.ep3 0x0.0p0 +REG epsg:4083 1 -0x1.4p4 -0x1.4p2 +REG epsg:4083 2 -0x1.4p3 -0x1.4p2 +REG epsg:4083 3 -0x1.4p4 0x1.4p2 +REG epsg:4083 4 -0x1.4p3 0x1.4p2 +REG epsg:4087 0 0x0.0p0 0x0.0p0 +REG epsg:4087 1 -0x1.4p2 -0x1.4p2 +REG epsg:4087 2 0x1.4p2 -0x1.4p2 +REG epsg:4087 3 -0x1.4p2 0x1.4p2 +REG epsg:4087 4 0x1.4p2 0x1.4p2 +REG epsg:4088 0 0x0.0p0 0x0.0p0 +REG epsg:4088 1 -0x1.4p2 -0x1.4p2 +REG epsg:4088 2 0x1.4p2 -0x1.4p2 +REG epsg:4088 3 -0x1.4p2 0x1.4p2 +REG epsg:4088 4 0x1.4p2 0x1.4p2 +REG epsg:4093 0 0x1.2p3 0x0.0p0 +REG epsg:4093 1 0x1.0p2 -0x1.4p2 +REG epsg:4093 2 0x1.cp3 -0x1.4p2 +REG epsg:4093 3 0x1.0p2 0x1.4p2 +REG epsg:4093 4 0x1.cp3 0x1.4p2 +REG epsg:4094 0 0x1.4p3 0x0.0p0 +REG epsg:4094 1 0x1.4p2 -0x1.4p2 +REG epsg:4094 2 0x1.ep3 -0x1.4p2 +REG epsg:4094 3 0x1.4p2 0x1.4p2 +REG epsg:4094 4 0x1.ep3 0x1.4p2 +REG epsg:4095 0 0x1.78p3 0x0.0p0 +REG epsg:4095 1 0x1.bp2 -0x1.4p2 +REG epsg:4095 2 0x1.0cp4 -0x1.4p2 +REG epsg:4095 3 0x1.bp2 0x1.4p2 +REG epsg:4095 4 0x1.0cp4 0x1.4p2 +REG epsg:4096 0 0x1.ep3 0x0.0p0 +REG epsg:4096 1 0x1.4p3 -0x1.4p2 +REG epsg:4096 2 0x1.4p4 -0x1.4p2 +REG epsg:4096 3 0x1.4p3 0x1.4p2 +REG epsg:4096 4 0x1.4p4 0x1.4p2 +REG epsg:4097 0 0x1.2p3 0x0.0p0 +REG epsg:4097 1 0x1.0p2 -0x1.4p2 +REG epsg:4097 2 0x1.cp3 -0x1.4p2 +REG epsg:4097 3 0x1.0p2 0x1.4p2 +REG epsg:4097 4 0x1.cp3 0x1.4p2 +REG epsg:4098 0 0x1.4p3 0x0.0p0 +REG epsg:4098 1 0x1.4p2 -0x1.4p2 +REG epsg:4098 2 0x1.ep3 -0x1.4p2 +REG epsg:4098 3 0x1.4p2 0x1.4p2 +REG epsg:4098 4 0x1.ep3 0x1.4p2 +REG epsg:4099 0 0x1.78p3 0x0.0p0 +REG epsg:4099 1 0x1.bp2 -0x1.4p2 +REG epsg:4099 2 0x1.0cp4 -0x1.4p2 +REG epsg:4099 3 0x1.bp2 0x1.4p2 +REG epsg:4099 4 0x1.0cp4 0x1.4p2 +REG epsg:4100 0 0x1.ep3 0x0.0p0 +REG epsg:4100 1 0x1.4p3 -0x1.4p2 +REG epsg:4100 2 0x1.4p4 -0x1.4p2 +REG epsg:4100 3 0x1.4p3 0x1.4p2 +REG epsg:4100 4 0x1.4p4 0x1.4p2 +REG epsg:4120 0 0x0.0p0 0x0.0p0 +REG epsg:4120 1 -0x1.4p2 -0x1.4p2 +REG epsg:4120 2 0x1.4p2 -0x1.4p2 +REG epsg:4120 3 -0x1.4p2 0x1.4p2 +REG epsg:4120 4 0x1.4p2 0x1.4p2 +REG epsg:4121 0 0x0.0p0 0x0.0p0 +REG epsg:4121 1 -0x1.4p2 -0x1.4p2 +REG epsg:4121 2 0x1.4p2 -0x1.4p2 +REG epsg:4121 3 -0x1.4p2 0x1.4p2 +REG epsg:4121 4 0x1.4p2 0x1.4p2 +REG epsg:4122 0 0x0.0p0 0x0.0p0 +REG epsg:4122 1 -0x1.4p2 -0x1.4p2 +REG epsg:4122 2 0x1.4p2 -0x1.4p2 +REG epsg:4122 3 -0x1.4p2 0x1.4p2 +REG epsg:4122 4 0x1.4p2 0x1.4p2 +REG epsg:4123 0 0x0.0p0 0x0.0p0 +REG epsg:4123 1 -0x1.4p2 -0x1.4p2 +REG epsg:4123 2 0x1.4p2 -0x1.4p2 +REG epsg:4123 3 -0x1.4p2 0x1.4p2 +REG epsg:4123 4 0x1.4p2 0x1.4p2 +REG epsg:4124 0 0x0.0p0 0x0.0p0 +REG epsg:4124 1 -0x1.4p2 -0x1.4p2 +REG epsg:4124 2 0x1.4p2 -0x1.4p2 +REG epsg:4124 3 -0x1.4p2 0x1.4p2 +REG epsg:4124 4 0x1.4p2 0x1.4p2 +REG epsg:4125 0 0x0.0p0 0x0.0p0 +REG epsg:4125 1 -0x1.4p2 -0x1.4p2 +REG epsg:4125 2 0x1.4p2 -0x1.4p2 +REG epsg:4125 3 -0x1.4p2 0x1.4p2 +REG epsg:4125 4 0x1.4p2 0x1.4p2 +REG epsg:4126 0 0x0.0p0 0x0.0p0 +REG epsg:4126 1 -0x1.4p2 -0x1.4p2 +REG epsg:4126 2 0x1.4p2 -0x1.4p2 +REG epsg:4126 3 -0x1.4p2 0x1.4p2 +REG epsg:4126 4 0x1.4p2 0x1.4p2 +REG epsg:4127 0 0x0.0p0 0x0.0p0 +REG epsg:4127 1 -0x1.4p2 -0x1.4p2 +REG epsg:4127 2 0x1.4p2 -0x1.4p2 +REG epsg:4127 3 -0x1.4p2 0x1.4p2 +REG epsg:4127 4 0x1.4p2 0x1.4p2 +REG epsg:4128 0 0x0.0p0 0x0.0p0 +REG epsg:4128 1 -0x1.4p2 -0x1.4p2 +REG epsg:4128 2 0x1.4p2 -0x1.4p2 +REG epsg:4128 3 -0x1.4p2 0x1.4p2 +REG epsg:4128 4 0x1.4p2 0x1.4p2 +REG epsg:4129 0 0x0.0p0 0x0.0p0 +REG epsg:4129 1 -0x1.4p2 -0x1.4p2 +REG epsg:4129 2 0x1.4p2 -0x1.4p2 +REG epsg:4129 3 -0x1.4p2 0x1.4p2 +REG epsg:4129 4 0x1.4p2 0x1.4p2 +REG epsg:4130 0 0x0.0p0 0x0.0p0 +REG epsg:4130 1 -0x1.4p2 -0x1.4p2 +REG epsg:4130 2 0x1.4p2 -0x1.4p2 +REG epsg:4130 3 -0x1.4p2 0x1.4p2 +REG epsg:4130 4 0x1.4p2 0x1.4p2 +REG epsg:4131 0 0x0.0p0 0x0.0p0 +REG epsg:4131 1 -0x1.4p2 -0x1.4p2 +REG epsg:4131 2 0x1.4p2 -0x1.4p2 +REG epsg:4131 3 -0x1.4p2 0x1.4p2 +REG epsg:4131 4 0x1.4p2 0x1.4p2 +REG epsg:4132 0 0x0.0p0 0x0.0p0 +REG epsg:4132 1 -0x1.4p2 -0x1.4p2 +REG epsg:4132 2 0x1.4p2 -0x1.4p2 +REG epsg:4132 3 -0x1.4p2 0x1.4p2 +REG epsg:4132 4 0x1.4p2 0x1.4p2 +REG epsg:4133 0 0x0.0p0 0x0.0p0 +REG epsg:4133 1 -0x1.4p2 -0x1.4p2 +REG epsg:4133 2 0x1.4p2 -0x1.4p2 +REG epsg:4133 3 -0x1.4p2 0x1.4p2 +REG epsg:4133 4 0x1.4p2 0x1.4p2 +REG epsg:4134 0 0x0.0p0 0x0.0p0 +REG epsg:4134 1 -0x1.4p2 -0x1.4p2 +REG epsg:4134 2 0x1.4p2 -0x1.4p2 +REG epsg:4134 3 -0x1.4p2 0x1.4p2 +REG epsg:4134 4 0x1.4p2 0x1.4p2 +REG epsg:4135 0 0x0.0p0 0x0.0p0 +REG epsg:4135 1 -0x1.4p2 -0x1.4p2 +REG epsg:4135 2 0x1.4p2 -0x1.4p2 +REG epsg:4135 3 -0x1.4p2 0x1.4p2 +REG epsg:4135 4 0x1.4p2 0x1.4p2 +REG epsg:4136 0 0x0.0p0 0x0.0p0 +REG epsg:4136 1 -0x1.4p2 -0x1.4p2 +REG epsg:4136 2 0x1.4p2 -0x1.4p2 +REG epsg:4136 3 -0x1.4p2 0x1.4p2 +REG epsg:4136 4 0x1.4p2 0x1.4p2 +REG epsg:4137 0 0x0.0p0 0x0.0p0 +REG epsg:4137 1 -0x1.4p2 -0x1.4p2 +REG epsg:4137 2 0x1.4p2 -0x1.4p2 +REG epsg:4137 3 -0x1.4p2 0x1.4p2 +REG epsg:4137 4 0x1.4p2 0x1.4p2 +REG epsg:4138 0 0x0.0p0 0x0.0p0 +REG epsg:4138 1 -0x1.4p2 -0x1.4p2 +REG epsg:4138 2 0x1.4p2 -0x1.4p2 +REG epsg:4138 3 -0x1.4p2 0x1.4p2 +REG epsg:4138 4 0x1.4p2 0x1.4p2 +REG epsg:4139 0 0x0.0p0 0x0.0p0 +REG epsg:4139 1 -0x1.4p2 -0x1.4p2 +REG epsg:4139 2 0x1.4p2 -0x1.4p2 +REG epsg:4139 3 -0x1.4p2 0x1.4p2 +REG epsg:4139 4 0x1.4p2 0x1.4p2 +REG epsg:4140 0 0x0.0p0 0x0.0p0 +REG epsg:4140 1 -0x1.4p2 -0x1.4p2 +REG epsg:4140 2 0x1.4p2 -0x1.4p2 +REG epsg:4140 3 -0x1.4p2 0x1.4p2 +REG epsg:4140 4 0x1.4p2 0x1.4p2 +REG epsg:4141 0 0x0.0p0 0x0.0p0 +REG epsg:4141 1 -0x1.4p2 -0x1.4p2 +REG epsg:4141 2 0x1.4p2 -0x1.4p2 +REG epsg:4141 3 -0x1.4p2 0x1.4p2 +REG epsg:4141 4 0x1.4p2 0x1.4p2 +REG epsg:4142 0 0x0.0p0 0x0.0p0 +REG epsg:4142 1 -0x1.4p2 -0x1.4p2 +REG epsg:4142 2 0x1.4p2 -0x1.4p2 +REG epsg:4142 3 -0x1.4p2 0x1.4p2 +REG epsg:4142 4 0x1.4p2 0x1.4p2 +REG epsg:4143 0 0x0.0p0 0x0.0p0 +REG epsg:4143 1 -0x1.4p2 -0x1.4p2 +REG epsg:4143 2 0x1.4p2 -0x1.4p2 +REG epsg:4143 3 -0x1.4p2 0x1.4p2 +REG epsg:4143 4 0x1.4p2 0x1.4p2 +REG epsg:4144 0 0x0.0p0 0x0.0p0 +REG epsg:4144 1 -0x1.4p2 -0x1.4p2 +REG epsg:4144 2 0x1.4p2 -0x1.4p2 +REG epsg:4144 3 -0x1.4p2 0x1.4p2 +REG epsg:4144 4 0x1.4p2 0x1.4p2 +REG epsg:4145 0 0x0.0p0 0x0.0p0 +REG epsg:4145 1 -0x1.4p2 -0x1.4p2 +REG epsg:4145 2 0x1.4p2 -0x1.4p2 +REG epsg:4145 3 -0x1.4p2 0x1.4p2 +REG epsg:4145 4 0x1.4p2 0x1.4p2 +REG epsg:4146 0 0x0.0p0 0x0.0p0 +REG epsg:4146 1 -0x1.4p2 -0x1.4p2 +REG epsg:4146 2 0x1.4p2 -0x1.4p2 +REG epsg:4146 3 -0x1.4p2 0x1.4p2 +REG epsg:4146 4 0x1.4p2 0x1.4p2 +REG epsg:4147 0 0x0.0p0 0x0.0p0 +REG epsg:4147 1 -0x1.4p2 -0x1.4p2 +REG epsg:4147 2 0x1.4p2 -0x1.4p2 +REG epsg:4147 3 -0x1.4p2 0x1.4p2 +REG epsg:4147 4 0x1.4p2 0x1.4p2 +REG epsg:4148 0 0x0.0p0 0x0.0p0 +REG epsg:4148 1 -0x1.4p2 -0x1.4p2 +REG epsg:4148 2 0x1.4p2 -0x1.4p2 +REG epsg:4148 3 -0x1.4p2 0x1.4p2 +REG epsg:4148 4 0x1.4p2 0x1.4p2 +REG epsg:4149 0 0x0.0p0 0x0.0p0 +REG epsg:4149 1 -0x1.4p2 -0x1.4p2 +REG epsg:4149 2 0x1.4p2 -0x1.4p2 +REG epsg:4149 3 -0x1.4p2 0x1.4p2 +REG epsg:4149 4 0x1.4p2 0x1.4p2 +REG epsg:4150 0 0x0.0p0 0x0.0p0 +REG epsg:4150 1 -0x1.4p2 -0x1.4p2 +REG epsg:4150 2 0x1.4p2 -0x1.4p2 +REG epsg:4150 3 -0x1.4p2 0x1.4p2 +REG epsg:4150 4 0x1.4p2 0x1.4p2 +REG epsg:4151 0 0x0.0p0 0x0.0p0 +REG epsg:4151 1 -0x1.4p2 -0x1.4p2 +REG epsg:4151 2 0x1.4p2 -0x1.4p2 +REG epsg:4151 3 -0x1.4p2 0x1.4p2 +REG epsg:4151 4 0x1.4p2 0x1.4p2 +REG epsg:4152 0 0x0.0p0 0x0.0p0 +REG epsg:4152 1 -0x1.4p2 -0x1.4p2 +REG epsg:4152 2 0x1.4p2 -0x1.4p2 +REG epsg:4152 3 -0x1.4p2 0x1.4p2 +REG epsg:4152 4 0x1.4p2 0x1.4p2 +REG epsg:4153 0 0x0.0p0 0x0.0p0 +REG epsg:4153 1 -0x1.4p2 -0x1.4p2 +REG epsg:4153 2 0x1.4p2 -0x1.4p2 +REG epsg:4153 3 -0x1.4p2 0x1.4p2 +REG epsg:4153 4 0x1.4p2 0x1.4p2 +REG epsg:4154 0 0x0.0p0 0x0.0p0 +REG epsg:4154 1 -0x1.4p2 -0x1.4p2 +REG epsg:4154 2 0x1.4p2 -0x1.4p2 +REG epsg:4154 3 -0x1.4p2 0x1.4p2 +REG epsg:4154 4 0x1.4p2 0x1.4p2 +REG epsg:4155 0 0x0.0p0 0x0.0p0 +REG epsg:4155 1 -0x1.4p2 -0x1.4p2 +REG epsg:4155 2 0x1.4p2 -0x1.4p2 +REG epsg:4155 3 -0x1.4p2 0x1.4p2 +REG epsg:4155 4 0x1.4p2 0x1.4p2 +REG epsg:4156 0 0x0.0p0 0x0.0p0 +REG epsg:4156 1 -0x1.4p2 -0x1.4p2 +REG epsg:4156 2 0x1.4p2 -0x1.4p2 +REG epsg:4156 3 -0x1.4p2 0x1.4p2 +REG epsg:4156 4 0x1.4p2 0x1.4p2 +REG epsg:4157 0 0x0.0p0 0x0.0p0 +REG epsg:4157 1 -0x1.4p2 -0x1.4p2 +REG epsg:4157 2 0x1.4p2 -0x1.4p2 +REG epsg:4157 3 -0x1.4p2 0x1.4p2 +REG epsg:4157 4 0x1.4p2 0x1.4p2 +REG epsg:4158 0 0x0.0p0 0x0.0p0 +REG epsg:4158 1 -0x1.4p2 -0x1.4p2 +REG epsg:4158 2 0x1.4p2 -0x1.4p2 +REG epsg:4158 3 -0x1.4p2 0x1.4p2 +REG epsg:4158 4 0x1.4p2 0x1.4p2 +REG epsg:4159 0 0x0.0p0 0x0.0p0 +REG epsg:4159 1 -0x1.4p2 -0x1.4p2 +REG epsg:4159 2 0x1.4p2 -0x1.4p2 +REG epsg:4159 3 -0x1.4p2 0x1.4p2 +REG epsg:4159 4 0x1.4p2 0x1.4p2 +REG epsg:4160 0 0x0.0p0 0x0.0p0 +REG epsg:4160 1 -0x1.4p2 -0x1.4p2 +REG epsg:4160 2 0x1.4p2 -0x1.4p2 +REG epsg:4160 3 -0x1.4p2 0x1.4p2 +REG epsg:4160 4 0x1.4p2 0x1.4p2 +REG epsg:4161 0 0x0.0p0 0x0.0p0 +REG epsg:4161 1 -0x1.4p2 -0x1.4p2 +REG epsg:4161 2 0x1.4p2 -0x1.4p2 +REG epsg:4161 3 -0x1.4p2 0x1.4p2 +REG epsg:4161 4 0x1.4p2 0x1.4p2 +REG epsg:4162 0 0x0.0p0 0x0.0p0 +REG epsg:4162 1 -0x1.4p2 -0x1.4p2 +REG epsg:4162 2 0x1.4p2 -0x1.4p2 +REG epsg:4162 3 -0x1.4p2 0x1.4p2 +REG epsg:4162 4 0x1.4p2 0x1.4p2 +REG epsg:4163 0 0x0.0p0 0x0.0p0 +REG epsg:4163 1 -0x1.4p2 -0x1.4p2 +REG epsg:4163 2 0x1.4p2 -0x1.4p2 +REG epsg:4163 3 -0x1.4p2 0x1.4p2 +REG epsg:4163 4 0x1.4p2 0x1.4p2 +REG epsg:4164 0 0x0.0p0 0x0.0p0 +REG epsg:4164 1 -0x1.4p2 -0x1.4p2 +REG epsg:4164 2 0x1.4p2 -0x1.4p2 +REG epsg:4164 3 -0x1.4p2 0x1.4p2 +REG epsg:4164 4 0x1.4p2 0x1.4p2 +REG epsg:4165 0 0x0.0p0 0x0.0p0 +REG epsg:4165 1 -0x1.4p2 -0x1.4p2 +REG epsg:4165 2 0x1.4p2 -0x1.4p2 +REG epsg:4165 3 -0x1.4p2 0x1.4p2 +REG epsg:4165 4 0x1.4p2 0x1.4p2 +REG epsg:4166 0 0x0.0p0 0x0.0p0 +REG epsg:4166 1 -0x1.4p2 -0x1.4p2 +REG epsg:4166 2 0x1.4p2 -0x1.4p2 +REG epsg:4166 3 -0x1.4p2 0x1.4p2 +REG epsg:4166 4 0x1.4p2 0x1.4p2 +REG epsg:4167 0 0x0.0p0 0x0.0p0 +REG epsg:4167 1 -0x1.4p2 -0x1.4p2 +REG epsg:4167 2 0x1.4p2 -0x1.4p2 +REG epsg:4167 3 -0x1.4p2 0x1.4p2 +REG epsg:4167 4 0x1.4p2 0x1.4p2 +REG epsg:4168 0 0x0.0p0 0x0.0p0 +REG epsg:4168 1 -0x1.4p2 -0x1.4p2 +REG epsg:4168 2 0x1.4p2 -0x1.4p2 +REG epsg:4168 3 -0x1.4p2 0x1.4p2 +REG epsg:4168 4 0x1.4p2 0x1.4p2 +REG epsg:4169 0 0x0.0p0 0x0.0p0 +REG epsg:4169 1 -0x1.4p2 -0x1.4p2 +REG epsg:4169 2 0x1.4p2 -0x1.4p2 +REG epsg:4169 3 -0x1.4p2 0x1.4p2 +REG epsg:4169 4 0x1.4p2 0x1.4p2 +REG epsg:4170 0 0x0.0p0 0x0.0p0 +REG epsg:4170 1 -0x1.4p2 -0x1.4p2 +REG epsg:4170 2 0x1.4p2 -0x1.4p2 +REG epsg:4170 3 -0x1.4p2 0x1.4p2 +REG epsg:4170 4 0x1.4p2 0x1.4p2 +REG epsg:4171 0 0x0.0p0 0x0.0p0 +REG epsg:4171 1 -0x1.4p2 -0x1.4p2 +REG epsg:4171 2 0x1.4p2 -0x1.4p2 +REG epsg:4171 3 -0x1.4p2 0x1.4p2 +REG epsg:4171 4 0x1.4p2 0x1.4p2 +REG epsg:4172 0 0x0.0p0 0x0.0p0 +REG epsg:4172 1 -0x1.4p2 -0x1.4p2 +REG epsg:4172 2 0x1.4p2 -0x1.4p2 +REG epsg:4172 3 -0x1.4p2 0x1.4p2 +REG epsg:4172 4 0x1.4p2 0x1.4p2 +REG epsg:4173 0 0x0.0p0 0x0.0p0 +REG epsg:4173 1 -0x1.4p2 -0x1.4p2 +REG epsg:4173 2 0x1.4p2 -0x1.4p2 +REG epsg:4173 3 -0x1.4p2 0x1.4p2 +REG epsg:4173 4 0x1.4p2 0x1.4p2 +REG epsg:4174 0 0x0.0p0 0x0.0p0 +REG epsg:4174 1 -0x1.4p2 -0x1.4p2 +REG epsg:4174 2 0x1.4p2 -0x1.4p2 +REG epsg:4174 3 -0x1.4p2 0x1.4p2 +REG epsg:4174 4 0x1.4p2 0x1.4p2 +REG epsg:4175 0 0x0.0p0 0x0.0p0 +REG epsg:4175 1 -0x1.4p2 -0x1.4p2 +REG epsg:4175 2 0x1.4p2 -0x1.4p2 +REG epsg:4175 3 -0x1.4p2 0x1.4p2 +REG epsg:4175 4 0x1.4p2 0x1.4p2 +REG epsg:4176 0 0x0.0p0 0x0.0p0 +REG epsg:4176 1 -0x1.4p2 -0x1.4p2 +REG epsg:4176 2 0x1.4p2 -0x1.4p2 +REG epsg:4176 3 -0x1.4p2 0x1.4p2 +REG epsg:4176 4 0x1.4p2 0x1.4p2 +REG epsg:4178 0 0x0.0p0 0x0.0p0 +REG epsg:4178 1 -0x1.4p2 -0x1.4p2 +REG epsg:4178 2 0x1.4p2 -0x1.4p2 +REG epsg:4178 3 -0x1.4p2 0x1.4p2 +REG epsg:4178 4 0x1.4p2 0x1.4p2 +REG epsg:4179 0 0x0.0p0 0x0.0p0 +REG epsg:4179 1 -0x1.4p2 -0x1.4p2 +REG epsg:4179 2 0x1.4p2 -0x1.4p2 +REG epsg:4179 3 -0x1.4p2 0x1.4p2 +REG epsg:4179 4 0x1.4p2 0x1.4p2 +REG epsg:4180 0 0x0.0p0 0x0.0p0 +REG epsg:4180 1 -0x1.4p2 -0x1.4p2 +REG epsg:4180 2 0x1.4p2 -0x1.4p2 +REG epsg:4180 3 -0x1.4p2 0x1.4p2 +REG epsg:4180 4 0x1.4p2 0x1.4p2 +REG epsg:4181 0 0x0.0p0 0x0.0p0 +REG epsg:4181 1 -0x1.4p2 -0x1.4p2 +REG epsg:4181 2 0x1.4p2 -0x1.4p2 +REG epsg:4181 3 -0x1.4p2 0x1.4p2 +REG epsg:4181 4 0x1.4p2 0x1.4p2 +REG epsg:4182 0 0x0.0p0 0x0.0p0 +REG epsg:4182 1 -0x1.4p2 -0x1.4p2 +REG epsg:4182 2 0x1.4p2 -0x1.4p2 +REG epsg:4182 3 -0x1.4p2 0x1.4p2 +REG epsg:4182 4 0x1.4p2 0x1.4p2 +REG epsg:4183 0 0x0.0p0 0x0.0p0 +REG epsg:4183 1 -0x1.4p2 -0x1.4p2 +REG epsg:4183 2 0x1.4p2 -0x1.4p2 +REG epsg:4183 3 -0x1.4p2 0x1.4p2 +REG epsg:4183 4 0x1.4p2 0x1.4p2 +REG epsg:4184 0 0x0.0p0 0x0.0p0 +REG epsg:4184 1 -0x1.4p2 -0x1.4p2 +REG epsg:4184 2 0x1.4p2 -0x1.4p2 +REG epsg:4184 3 -0x1.4p2 0x1.4p2 +REG epsg:4184 4 0x1.4p2 0x1.4p2 +REG epsg:4185 0 0x0.0p0 0x0.0p0 +REG epsg:4185 1 -0x1.4p2 -0x1.4p2 +REG epsg:4185 2 0x1.4p2 -0x1.4p2 +REG epsg:4185 3 -0x1.4p2 0x1.4p2 +REG epsg:4185 4 0x1.4p2 0x1.4p2 +REG epsg:4188 0 0x0.0p0 0x0.0p0 +REG epsg:4188 1 -0x1.4p2 -0x1.4p2 +REG epsg:4188 2 0x1.4p2 -0x1.4p2 +REG epsg:4188 3 -0x1.4p2 0x1.4p2 +REG epsg:4188 4 0x1.4p2 0x1.4p2 +REG epsg:4189 0 0x0.0p0 0x0.0p0 +REG epsg:4189 1 -0x1.4p2 -0x1.4p2 +REG epsg:4189 2 0x1.4p2 -0x1.4p2 +REG epsg:4189 3 -0x1.4p2 0x1.4p2 +REG epsg:4189 4 0x1.4p2 0x1.4p2 +REG epsg:4190 0 0x0.0p0 0x0.0p0 +REG epsg:4190 1 -0x1.4p2 -0x1.4p2 +REG epsg:4190 2 0x1.4p2 -0x1.4p2 +REG epsg:4190 3 -0x1.4p2 0x1.4p2 +REG epsg:4190 4 0x1.4p2 0x1.4p2 +REG epsg:4191 0 0x0.0p0 0x0.0p0 +REG epsg:4191 1 -0x1.4p2 -0x1.4p2 +REG epsg:4191 2 0x1.4p2 -0x1.4p2 +REG epsg:4191 3 -0x1.4p2 0x1.4p2 +REG epsg:4191 4 0x1.4p2 0x1.4p2 +REG epsg:4192 0 0x0.0p0 0x0.0p0 +REG epsg:4192 1 -0x1.4p2 -0x1.4p2 +REG epsg:4192 2 0x1.4p2 -0x1.4p2 +REG epsg:4192 3 -0x1.4p2 0x1.4p2 +REG epsg:4192 4 0x1.4p2 0x1.4p2 +REG epsg:4193 0 0x0.0p0 0x0.0p0 +REG epsg:4193 1 -0x1.4p2 -0x1.4p2 +REG epsg:4193 2 0x1.4p2 -0x1.4p2 +REG epsg:4193 3 -0x1.4p2 0x1.4p2 +REG epsg:4193 4 0x1.4p2 0x1.4p2 +REG epsg:4194 0 0x0.0p0 0x0.0p0 +REG epsg:4194 1 -0x1.4p2 -0x1.4p2 +REG epsg:4194 2 0x1.4p2 -0x1.4p2 +REG epsg:4194 3 -0x1.4p2 0x1.4p2 +REG epsg:4194 4 0x1.4p2 0x1.4p2 +REG epsg:4195 0 0x0.0p0 0x0.0p0 +REG epsg:4195 1 -0x1.4p2 -0x1.4p2 +REG epsg:4195 2 0x1.4p2 -0x1.4p2 +REG epsg:4195 3 -0x1.4p2 0x1.4p2 +REG epsg:4195 4 0x1.4p2 0x1.4p2 +REG epsg:4196 0 0x0.0p0 0x0.0p0 +REG epsg:4196 1 -0x1.4p2 -0x1.4p2 +REG epsg:4196 2 0x1.4p2 -0x1.4p2 +REG epsg:4196 3 -0x1.4p2 0x1.4p2 +REG epsg:4196 4 0x1.4p2 0x1.4p2 +REG epsg:4197 0 0x0.0p0 0x0.0p0 +REG epsg:4197 1 -0x1.4p2 -0x1.4p2 +REG epsg:4197 2 0x1.4p2 -0x1.4p2 +REG epsg:4197 3 -0x1.4p2 0x1.4p2 +REG epsg:4197 4 0x1.4p2 0x1.4p2 +REG epsg:4198 0 0x0.0p0 0x0.0p0 +REG epsg:4198 1 -0x1.4p2 -0x1.4p2 +REG epsg:4198 2 0x1.4p2 -0x1.4p2 +REG epsg:4198 3 -0x1.4p2 0x1.4p2 +REG epsg:4198 4 0x1.4p2 0x1.4p2 +REG epsg:4199 0 0x0.0p0 0x0.0p0 +REG epsg:4199 1 -0x1.4p2 -0x1.4p2 +REG epsg:4199 2 0x1.4p2 -0x1.4p2 +REG epsg:4199 3 -0x1.4p2 0x1.4p2 +REG epsg:4199 4 0x1.4p2 0x1.4p2 +REG epsg:4200 0 0x0.0p0 0x0.0p0 +REG epsg:4200 1 -0x1.4p2 -0x1.4p2 +REG epsg:4200 2 0x1.4p2 -0x1.4p2 +REG epsg:4200 3 -0x1.4p2 0x1.4p2 +REG epsg:4200 4 0x1.4p2 0x1.4p2 +REG epsg:4201 0 0x0.0p0 0x0.0p0 +REG epsg:4201 1 -0x1.4p2 -0x1.4p2 +REG epsg:4201 2 0x1.4p2 -0x1.4p2 +REG epsg:4201 3 -0x1.4p2 0x1.4p2 +REG epsg:4201 4 0x1.4p2 0x1.4p2 +REG epsg:4202 0 0x0.0p0 0x0.0p0 +REG epsg:4202 1 -0x1.4p2 -0x1.4p2 +REG epsg:4202 2 0x1.4p2 -0x1.4p2 +REG epsg:4202 3 -0x1.4p2 0x1.4p2 +REG epsg:4202 4 0x1.4p2 0x1.4p2 +REG epsg:4203 0 0x0.0p0 0x0.0p0 +REG epsg:4203 1 -0x1.4p2 -0x1.4p2 +REG epsg:4203 2 0x1.4p2 -0x1.4p2 +REG epsg:4203 3 -0x1.4p2 0x1.4p2 +REG epsg:4203 4 0x1.4p2 0x1.4p2 +REG epsg:4204 0 0x0.0p0 0x0.0p0 +REG epsg:4204 1 -0x1.4p2 -0x1.4p2 +REG epsg:4204 2 0x1.4p2 -0x1.4p2 +REG epsg:4204 3 -0x1.4p2 0x1.4p2 +REG epsg:4204 4 0x1.4p2 0x1.4p2 +REG epsg:4205 0 0x0.0p0 0x0.0p0 +REG epsg:4205 1 -0x1.4p2 -0x1.4p2 +REG epsg:4205 2 0x1.4p2 -0x1.4p2 +REG epsg:4205 3 -0x1.4p2 0x1.4p2 +REG epsg:4205 4 0x1.4p2 0x1.4p2 +REG epsg:4206 0 0x0.0p0 0x0.0p0 +REG epsg:4206 1 -0x1.4p2 -0x1.4p2 +REG epsg:4206 2 0x1.4p2 -0x1.4p2 +REG epsg:4206 3 -0x1.4p2 0x1.4p2 +REG epsg:4206 4 0x1.4p2 0x1.4p2 +REG epsg:4207 0 0x0.0p0 0x0.0p0 +REG epsg:4207 1 -0x1.4p2 -0x1.4p2 +REG epsg:4207 2 0x1.4p2 -0x1.4p2 +REG epsg:4207 3 -0x1.4p2 0x1.4p2 +REG epsg:4207 4 0x1.4p2 0x1.4p2 +REG epsg:4208 0 0x0.0p0 0x0.0p0 +REG epsg:4208 1 -0x1.4p2 -0x1.4p2 +REG epsg:4208 2 0x1.4p2 -0x1.4p2 +REG epsg:4208 3 -0x1.4p2 0x1.4p2 +REG epsg:4208 4 0x1.4p2 0x1.4p2 +REG epsg:4209 0 0x0.0p0 0x0.0p0 +REG epsg:4209 1 -0x1.4p2 -0x1.4p2 +REG epsg:4209 2 0x1.4p2 -0x1.4p2 +REG epsg:4209 3 -0x1.4p2 0x1.4p2 +REG epsg:4209 4 0x1.4p2 0x1.4p2 +REG epsg:4210 0 0x0.0p0 0x0.0p0 +REG epsg:4210 1 -0x1.4p2 -0x1.4p2 +REG epsg:4210 2 0x1.4p2 -0x1.4p2 +REG epsg:4210 3 -0x1.4p2 0x1.4p2 +REG epsg:4210 4 0x1.4p2 0x1.4p2 +REG epsg:4211 0 0x0.0p0 0x0.0p0 +REG epsg:4211 1 -0x1.4p2 -0x1.4p2 +REG epsg:4211 2 0x1.4p2 -0x1.4p2 +REG epsg:4211 3 -0x1.4p2 0x1.4p2 +REG epsg:4211 4 0x1.4p2 0x1.4p2 +REG epsg:4212 0 0x0.0p0 0x0.0p0 +REG epsg:4212 1 -0x1.4p2 -0x1.4p2 +REG epsg:4212 2 0x1.4p2 -0x1.4p2 +REG epsg:4212 3 -0x1.4p2 0x1.4p2 +REG epsg:4212 4 0x1.4p2 0x1.4p2 +REG epsg:4213 0 0x0.0p0 0x0.0p0 +REG epsg:4213 1 -0x1.4p2 -0x1.4p2 +REG epsg:4213 2 0x1.4p2 -0x1.4p2 +REG epsg:4213 3 -0x1.4p2 0x1.4p2 +REG epsg:4213 4 0x1.4p2 0x1.4p2 +REG epsg:4214 0 0x0.0p0 0x0.0p0 +REG epsg:4214 1 -0x1.4p2 -0x1.4p2 +REG epsg:4214 2 0x1.4p2 -0x1.4p2 +REG epsg:4214 3 -0x1.4p2 0x1.4p2 +REG epsg:4214 4 0x1.4p2 0x1.4p2 +REG epsg:4215 0 0x0.0p0 0x0.0p0 +REG epsg:4215 1 -0x1.4p2 -0x1.4p2 +REG epsg:4215 2 0x1.4p2 -0x1.4p2 +REG epsg:4215 3 -0x1.4p2 0x1.4p2 +REG epsg:4215 4 0x1.4p2 0x1.4p2 +REG epsg:4216 0 0x0.0p0 0x0.0p0 +REG epsg:4216 1 -0x1.4p2 -0x1.4p2 +REG epsg:4216 2 0x1.4p2 -0x1.4p2 +REG epsg:4216 3 -0x1.4p2 0x1.4p2 +REG epsg:4216 4 0x1.4p2 0x1.4p2 +REG epsg:4217 0 0x1.56p7 0x0.0p0 +REG epsg:4217 1 0x1.4cp7 -0x1.4p2 +REG epsg:4217 2 0x1.6p7 -0x1.4p2 +REG epsg:4217 3 0x1.4cp7 0x1.4p2 +REG epsg:4217 4 0x1.6p7 0x1.4p2 +REG epsg:4218 0 0x0.0p0 0x0.0p0 +REG epsg:4218 1 -0x1.4p2 -0x1.4p2 +REG epsg:4218 2 0x1.4p2 -0x1.4p2 +REG epsg:4218 3 -0x1.4p2 0x1.4p2 +REG epsg:4218 4 0x1.4p2 0x1.4p2 +REG epsg:4219 0 0x0.0p0 0x0.0p0 +REG epsg:4219 1 -0x1.4p2 -0x1.4p2 +REG epsg:4219 2 0x1.4p2 -0x1.4p2 +REG epsg:4219 3 -0x1.4p2 0x1.4p2 +REG epsg:4219 4 0x1.4p2 0x1.4p2 +REG epsg:4220 0 0x0.0p0 0x0.0p0 +REG epsg:4220 1 -0x1.4p2 -0x1.4p2 +REG epsg:4220 2 0x1.4p2 -0x1.4p2 +REG epsg:4220 3 -0x1.4p2 0x1.4p2 +REG epsg:4220 4 0x1.4p2 0x1.4p2 +REG epsg:4221 0 0x0.0p0 0x0.0p0 +REG epsg:4221 1 -0x1.4p2 -0x1.4p2 +REG epsg:4221 2 0x1.4p2 -0x1.4p2 +REG epsg:4221 3 -0x1.4p2 0x1.4p2 +REG epsg:4221 4 0x1.4p2 0x1.4p2 +REG epsg:4222 0 0x0.0p0 0x0.0p0 +REG epsg:4222 1 -0x1.4p2 -0x1.4p2 +REG epsg:4222 2 0x1.4p2 -0x1.4p2 +REG epsg:4222 3 -0x1.4p2 0x1.4p2 +REG epsg:4222 4 0x1.4p2 0x1.4p2 +REG epsg:4223 0 0x0.0p0 0x0.0p0 +REG epsg:4223 1 -0x1.4p2 -0x1.4p2 +REG epsg:4223 2 0x1.4p2 -0x1.4p2 +REG epsg:4223 3 -0x1.4p2 0x1.4p2 +REG epsg:4223 4 0x1.4p2 0x1.4p2 +REG epsg:4224 0 0x0.0p0 0x0.0p0 +REG epsg:4224 1 -0x1.4p2 -0x1.4p2 +REG epsg:4224 2 0x1.4p2 -0x1.4p2 +REG epsg:4224 3 -0x1.4p2 0x1.4p2 +REG epsg:4224 4 0x1.4p2 0x1.4p2 +REG epsg:4225 0 0x0.0p0 0x0.0p0 +REG epsg:4225 1 -0x1.4p2 -0x1.4p2 +REG epsg:4225 2 0x1.4p2 -0x1.4p2 +REG epsg:4225 3 -0x1.4p2 0x1.4p2 +REG epsg:4225 4 0x1.4p2 0x1.4p2 +REG epsg:4226 0 0x0.0p0 0x0.0p0 +REG epsg:4226 1 -0x1.4p2 -0x1.4p2 +REG epsg:4226 2 0x1.4p2 -0x1.4p2 +REG epsg:4226 3 -0x1.4p2 0x1.4p2 +REG epsg:4226 4 0x1.4p2 0x1.4p2 +REG epsg:4227 0 0x0.0p0 0x0.0p0 +REG epsg:4227 1 -0x1.4p2 -0x1.4p2 +REG epsg:4227 2 0x1.4p2 -0x1.4p2 +REG epsg:4227 3 -0x1.4p2 0x1.4p2 +REG epsg:4227 4 0x1.4p2 0x1.4p2 +REG epsg:4228 0 0x0.0p0 0x0.0p0 +REG epsg:4228 1 -0x1.4p2 -0x1.4p2 +REG epsg:4228 2 0x1.4p2 -0x1.4p2 +REG epsg:4228 3 -0x1.4p2 0x1.4p2 +REG epsg:4228 4 0x1.4p2 0x1.4p2 +REG epsg:4229 0 0x0.0p0 0x0.0p0 +REG epsg:4229 1 -0x1.4p2 -0x1.4p2 +REG epsg:4229 2 0x1.4p2 -0x1.4p2 +REG epsg:4229 3 -0x1.4p2 0x1.4p2 +REG epsg:4229 4 0x1.4p2 0x1.4p2 +REG epsg:4230 0 0x0.0p0 0x0.0p0 +REG epsg:4230 1 -0x1.4p2 -0x1.4p2 +REG epsg:4230 2 0x1.4p2 -0x1.4p2 +REG epsg:4230 3 -0x1.4p2 0x1.4p2 +REG epsg:4230 4 0x1.4p2 0x1.4p2 +REG epsg:4231 0 0x0.0p0 0x0.0p0 +REG epsg:4231 1 -0x1.4p2 -0x1.4p2 +REG epsg:4231 2 0x1.4p2 -0x1.4p2 +REG epsg:4231 3 -0x1.4p2 0x1.4p2 +REG epsg:4231 4 0x1.4p2 0x1.4p2 +REG epsg:4232 0 0x0.0p0 0x0.0p0 +REG epsg:4232 1 -0x1.4p2 -0x1.4p2 +REG epsg:4232 2 0x1.4p2 -0x1.4p2 +REG epsg:4232 3 -0x1.4p2 0x1.4p2 +REG epsg:4232 4 0x1.4p2 0x1.4p2 +REG epsg:4233 0 0x0.0p0 0x0.0p0 +REG epsg:4233 1 -0x1.4p2 -0x1.4p2 +REG epsg:4233 2 0x1.4p2 -0x1.4p2 +REG epsg:4233 3 -0x1.4p2 0x1.4p2 +REG epsg:4233 4 0x1.4p2 0x1.4p2 +REG epsg:4234 0 0x0.0p0 0x0.0p0 +REG epsg:4234 1 -0x1.4p2 -0x1.4p2 +REG epsg:4234 2 0x1.4p2 -0x1.4p2 +REG epsg:4234 3 -0x1.4p2 0x1.4p2 +REG epsg:4234 4 0x1.4p2 0x1.4p2 +REG epsg:4235 0 0x0.0p0 0x0.0p0 +REG epsg:4235 1 -0x1.4p2 -0x1.4p2 +REG epsg:4235 2 0x1.4p2 -0x1.4p2 +REG epsg:4235 3 -0x1.4p2 0x1.4p2 +REG epsg:4235 4 0x1.4p2 0x1.4p2 +REG epsg:4236 0 0x0.0p0 0x0.0p0 +REG epsg:4236 1 -0x1.4p2 -0x1.4p2 +REG epsg:4236 2 0x1.4p2 -0x1.4p2 +REG epsg:4236 3 -0x1.4p2 0x1.4p2 +REG epsg:4236 4 0x1.4p2 0x1.4p2 +REG epsg:4237 0 0x0.0p0 0x0.0p0 +REG epsg:4237 1 -0x1.4p2 -0x1.4p2 +REG epsg:4237 2 0x1.4p2 -0x1.4p2 +REG epsg:4237 3 -0x1.4p2 0x1.4p2 +REG epsg:4237 4 0x1.4p2 0x1.4p2 +REG epsg:4238 0 0x0.0p0 0x0.0p0 +REG epsg:4238 1 -0x1.4p2 -0x1.4p2 +REG epsg:4238 2 0x1.4p2 -0x1.4p2 +REG epsg:4238 3 -0x1.4p2 0x1.4p2 +REG epsg:4238 4 0x1.4p2 0x1.4p2 +REG epsg:4239 0 0x0.0p0 0x0.0p0 +REG epsg:4239 1 -0x1.4p2 -0x1.4p2 +REG epsg:4239 2 0x1.4p2 -0x1.4p2 +REG epsg:4239 3 -0x1.4p2 0x1.4p2 +REG epsg:4239 4 0x1.4p2 0x1.4p2 +REG epsg:4240 0 0x0.0p0 0x0.0p0 +REG epsg:4240 1 -0x1.4p2 -0x1.4p2 +REG epsg:4240 2 0x1.4p2 -0x1.4p2 +REG epsg:4240 3 -0x1.4p2 0x1.4p2 +REG epsg:4240 4 0x1.4p2 0x1.4p2 +REG epsg:4241 0 0x0.0p0 0x0.0p0 +REG epsg:4241 1 -0x1.4p2 -0x1.4p2 +REG epsg:4241 2 0x1.4p2 -0x1.4p2 +REG epsg:4241 3 -0x1.4p2 0x1.4p2 +REG epsg:4241 4 0x1.4p2 0x1.4p2 +REG epsg:4242 0 0x0.0p0 0x0.0p0 +REG epsg:4242 1 -0x1.4p2 -0x1.4p2 +REG epsg:4242 2 0x1.4p2 -0x1.4p2 +REG epsg:4242 3 -0x1.4p2 0x1.4p2 +REG epsg:4242 4 0x1.4p2 0x1.4p2 +REG epsg:4243 0 0x0.0p0 0x0.0p0 +REG epsg:4243 1 -0x1.4p2 -0x1.4p2 +REG epsg:4243 2 0x1.4p2 -0x1.4p2 +REG epsg:4243 3 -0x1.4p2 0x1.4p2 +REG epsg:4243 4 0x1.4p2 0x1.4p2 +REG epsg:4244 0 0x0.0p0 0x0.0p0 +REG epsg:4244 1 -0x1.4p2 -0x1.4p2 +REG epsg:4244 2 0x1.4p2 -0x1.4p2 +REG epsg:4244 3 -0x1.4p2 0x1.4p2 +REG epsg:4244 4 0x1.4p2 0x1.4p2 +REG epsg:4245 0 0x0.0p0 0x0.0p0 +REG epsg:4245 1 -0x1.4p2 -0x1.4p2 +REG epsg:4245 2 0x1.4p2 -0x1.4p2 +REG epsg:4245 3 -0x1.4p2 0x1.4p2 +REG epsg:4245 4 0x1.4p2 0x1.4p2 +REG epsg:4246 0 0x0.0p0 0x0.0p0 +REG epsg:4246 1 -0x1.4p2 -0x1.4p2 +REG epsg:4246 2 0x1.4p2 -0x1.4p2 +REG epsg:4246 3 -0x1.4p2 0x1.4p2 +REG epsg:4246 4 0x1.4p2 0x1.4p2 +REG epsg:4247 0 0x0.0p0 0x0.0p0 +REG epsg:4247 1 -0x1.4p2 -0x1.4p2 +REG epsg:4247 2 0x1.4p2 -0x1.4p2 +REG epsg:4247 3 -0x1.4p2 0x1.4p2 +REG epsg:4247 4 0x1.4p2 0x1.4p2 +REG epsg:4248 0 0x0.0p0 0x0.0p0 +REG epsg:4248 1 -0x1.4p2 -0x1.4p2 +REG epsg:4248 2 0x1.4p2 -0x1.4p2 +REG epsg:4248 3 -0x1.4p2 0x1.4p2 +REG epsg:4248 4 0x1.4p2 0x1.4p2 +REG epsg:4249 0 0x0.0p0 0x0.0p0 +REG epsg:4249 1 -0x1.4p2 -0x1.4p2 +REG epsg:4249 2 0x1.4p2 -0x1.4p2 +REG epsg:4249 3 -0x1.4p2 0x1.4p2 +REG epsg:4249 4 0x1.4p2 0x1.4p2 +REG epsg:4250 0 0x0.0p0 0x0.0p0 +REG epsg:4250 1 -0x1.4p2 -0x1.4p2 +REG epsg:4250 2 0x1.4p2 -0x1.4p2 +REG epsg:4250 3 -0x1.4p2 0x1.4p2 +REG epsg:4250 4 0x1.4p2 0x1.4p2 +REG epsg:4251 0 0x0.0p0 0x0.0p0 +REG epsg:4251 1 -0x1.4p2 -0x1.4p2 +REG epsg:4251 2 0x1.4p2 -0x1.4p2 +REG epsg:4251 3 -0x1.4p2 0x1.4p2 +REG epsg:4251 4 0x1.4p2 0x1.4p2 +REG epsg:4252 0 0x0.0p0 0x0.0p0 +REG epsg:4252 1 -0x1.4p2 -0x1.4p2 +REG epsg:4252 2 0x1.4p2 -0x1.4p2 +REG epsg:4252 3 -0x1.4p2 0x1.4p2 +REG epsg:4252 4 0x1.4p2 0x1.4p2 +REG epsg:4253 0 0x0.0p0 0x0.0p0 +REG epsg:4253 1 -0x1.4p2 -0x1.4p2 +REG epsg:4253 2 0x1.4p2 -0x1.4p2 +REG epsg:4253 3 -0x1.4p2 0x1.4p2 +REG epsg:4253 4 0x1.4p2 0x1.4p2 +REG epsg:4254 0 0x0.0p0 0x0.0p0 +REG epsg:4254 1 -0x1.4p2 -0x1.4p2 +REG epsg:4254 2 0x1.4p2 -0x1.4p2 +REG epsg:4254 3 -0x1.4p2 0x1.4p2 +REG epsg:4254 4 0x1.4p2 0x1.4p2 +REG epsg:4255 0 0x0.0p0 0x0.0p0 +REG epsg:4255 1 -0x1.4p2 -0x1.4p2 +REG epsg:4255 2 0x1.4p2 -0x1.4p2 +REG epsg:4255 3 -0x1.4p2 0x1.4p2 +REG epsg:4255 4 0x1.4p2 0x1.4p2 +REG epsg:4256 0 0x0.0p0 0x0.0p0 +REG epsg:4256 1 -0x1.4p2 -0x1.4p2 +REG epsg:4256 2 0x1.4p2 -0x1.4p2 +REG epsg:4256 3 -0x1.4p2 0x1.4p2 +REG epsg:4256 4 0x1.4p2 0x1.4p2 +REG epsg:4257 0 0x0.0p0 0x0.0p0 +REG epsg:4257 1 -0x1.4p2 -0x1.4p2 +REG epsg:4257 2 0x1.4p2 -0x1.4p2 +REG epsg:4257 3 -0x1.4p2 0x1.4p2 +REG epsg:4257 4 0x1.4p2 0x1.4p2 +REG epsg:4258 0 0x0.0p0 0x0.0p0 +REG epsg:4258 1 -0x1.4p2 -0x1.4p2 +REG epsg:4258 2 0x1.4p2 -0x1.4p2 +REG epsg:4258 3 -0x1.4p2 0x1.4p2 +REG epsg:4258 4 0x1.4p2 0x1.4p2 +REG epsg:4259 0 0x0.0p0 0x0.0p0 +REG epsg:4259 1 -0x1.4p2 -0x1.4p2 +REG epsg:4259 2 0x1.4p2 -0x1.4p2 +REG epsg:4259 3 -0x1.4p2 0x1.4p2 +REG epsg:4259 4 0x1.4p2 0x1.4p2 +REG epsg:4260 0 0x0.0p0 0x0.0p0 +REG epsg:4260 1 -0x1.4p2 -0x1.4p2 +REG epsg:4260 2 0x1.4p2 -0x1.4p2 +REG epsg:4260 3 -0x1.4p2 0x1.4p2 +REG epsg:4260 4 0x1.4p2 0x1.4p2 +REG epsg:4261 0 0x0.0p0 0x0.0p0 +REG epsg:4261 1 -0x1.4p2 -0x1.4p2 +REG epsg:4261 2 0x1.4p2 -0x1.4p2 +REG epsg:4261 3 -0x1.4p2 0x1.4p2 +REG epsg:4261 4 0x1.4p2 0x1.4p2 +REG epsg:4262 0 0x0.0p0 0x0.0p0 +REG epsg:4262 1 -0x1.4p2 -0x1.4p2 +REG epsg:4262 2 0x1.4p2 -0x1.4p2 +REG epsg:4262 3 -0x1.4p2 0x1.4p2 +REG epsg:4262 4 0x1.4p2 0x1.4p2 +REG epsg:4263 0 0x0.0p0 0x0.0p0 +REG epsg:4263 1 -0x1.4p2 -0x1.4p2 +REG epsg:4263 2 0x1.4p2 -0x1.4p2 +REG epsg:4263 3 -0x1.4p2 0x1.4p2 +REG epsg:4263 4 0x1.4p2 0x1.4p2 +REG epsg:4264 0 0x0.0p0 0x0.0p0 +REG epsg:4264 1 -0x1.4p2 -0x1.4p2 +REG epsg:4264 2 0x1.4p2 -0x1.4p2 +REG epsg:4264 3 -0x1.4p2 0x1.4p2 +REG epsg:4264 4 0x1.4p2 0x1.4p2 +REG epsg:4265 0 0x0.0p0 0x0.0p0 +REG epsg:4265 1 -0x1.4p2 -0x1.4p2 +REG epsg:4265 2 0x1.4p2 -0x1.4p2 +REG epsg:4265 3 -0x1.4p2 0x1.4p2 +REG epsg:4265 4 0x1.4p2 0x1.4p2 +REG epsg:4266 0 0x0.0p0 0x0.0p0 +REG epsg:4266 1 -0x1.4p2 -0x1.4p2 +REG epsg:4266 2 0x1.4p2 -0x1.4p2 +REG epsg:4266 3 -0x1.4p2 0x1.4p2 +REG epsg:4266 4 0x1.4p2 0x1.4p2 +REG epsg:4267 0 -0x1.9p6 0x1.68p5 +REG epsg:4267 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG epsg:4267 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG epsg:4267 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG epsg:4267 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG epsg:4268 0 0x0.0p0 0x0.0p0 +REG epsg:4268 1 -0x1.4p2 -0x1.4p2 +REG epsg:4268 2 0x1.4p2 -0x1.4p2 +REG epsg:4268 3 -0x1.4p2 0x1.4p2 +REG epsg:4268 4 0x1.4p2 0x1.4p2 +REG epsg:4269 0 -0x1.9p6 0x1.68p5 +REG epsg:4269 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG epsg:4269 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG epsg:4269 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG epsg:4269 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG epsg:4270 0 0x0.0p0 0x0.0p0 +REG epsg:4270 1 -0x1.4p2 -0x1.4p2 +REG epsg:4270 2 0x1.4p2 -0x1.4p2 +REG epsg:4270 3 -0x1.4p2 0x1.4p2 +REG epsg:4270 4 0x1.4p2 0x1.4p2 +REG epsg:4271 0 0x0.0p0 0x0.0p0 +REG epsg:4271 1 -0x1.4p2 -0x1.4p2 +REG epsg:4271 2 0x1.4p2 -0x1.4p2 +REG epsg:4271 3 -0x1.4p2 0x1.4p2 +REG epsg:4271 4 0x1.4p2 0x1.4p2 +REG epsg:4272 0 0x0.0p0 0x0.0p0 +REG epsg:4272 1 -0x1.4p2 -0x1.4p2 +REG epsg:4272 2 0x1.4p2 -0x1.4p2 +REG epsg:4272 3 -0x1.4p2 0x1.4p2 +REG epsg:4272 4 0x1.4p2 0x1.4p2 +REG epsg:4273 0 0x0.0p0 0x0.0p0 +REG epsg:4273 1 -0x1.4p2 -0x1.4p2 +REG epsg:4273 2 0x1.4p2 -0x1.4p2 +REG epsg:4273 3 -0x1.4p2 0x1.4p2 +REG epsg:4273 4 0x1.4p2 0x1.4p2 +REG epsg:4274 0 0x0.0p0 0x0.0p0 +REG epsg:4274 1 -0x1.4p2 -0x1.4p2 +REG epsg:4274 2 0x1.4p2 -0x1.4p2 +REG epsg:4274 3 -0x1.4p2 0x1.4p2 +REG epsg:4274 4 0x1.4p2 0x1.4p2 +REG epsg:4275 0 0x0.0p0 0x0.0p0 +REG epsg:4275 1 -0x1.4p2 -0x1.4p2 +REG epsg:4275 2 0x1.4p2 -0x1.4p2 +REG epsg:4275 3 -0x1.4p2 0x1.4p2 +REG epsg:4275 4 0x1.4p2 0x1.4p2 +REG epsg:4276 0 0x0.0p0 0x0.0p0 +REG epsg:4276 1 -0x1.4p2 -0x1.4p2 +REG epsg:4276 2 0x1.4p2 -0x1.4p2 +REG epsg:4276 3 -0x1.4p2 0x1.4p2 +REG epsg:4276 4 0x1.4p2 0x1.4p2 +REG epsg:4277 0 0x0.0p0 0x0.0p0 +REG epsg:4277 1 -0x1.4p2 -0x1.4p2 +REG epsg:4277 2 0x1.4p2 -0x1.4p2 +REG epsg:4277 3 -0x1.4p2 0x1.4p2 +REG epsg:4277 4 0x1.4p2 0x1.4p2 +REG epsg:4278 0 0x0.0p0 0x0.0p0 +REG epsg:4278 1 -0x1.4p2 -0x1.4p2 +REG epsg:4278 2 0x1.4p2 -0x1.4p2 +REG epsg:4278 3 -0x1.4p2 0x1.4p2 +REG epsg:4278 4 0x1.4p2 0x1.4p2 +REG epsg:4279 0 0x0.0p0 0x0.0p0 +REG epsg:4279 1 -0x1.4p2 -0x1.4p2 +REG epsg:4279 2 0x1.4p2 -0x1.4p2 +REG epsg:4279 3 -0x1.4p2 0x1.4p2 +REG epsg:4279 4 0x1.4p2 0x1.4p2 +REG epsg:4280 0 0x0.0p0 0x0.0p0 +REG epsg:4280 1 -0x1.4p2 -0x1.4p2 +REG epsg:4280 2 0x1.4p2 -0x1.4p2 +REG epsg:4280 3 -0x1.4p2 0x1.4p2 +REG epsg:4280 4 0x1.4p2 0x1.4p2 +REG epsg:4281 0 0x0.0p0 0x0.0p0 +REG epsg:4281 1 -0x1.4p2 -0x1.4p2 +REG epsg:4281 2 0x1.4p2 -0x1.4p2 +REG epsg:4281 3 -0x1.4p2 0x1.4p2 +REG epsg:4281 4 0x1.4p2 0x1.4p2 +REG epsg:4282 0 0x0.0p0 0x0.0p0 +REG epsg:4282 1 -0x1.4p2 -0x1.4p2 +REG epsg:4282 2 0x1.4p2 -0x1.4p2 +REG epsg:4282 3 -0x1.4p2 0x1.4p2 +REG epsg:4282 4 0x1.4p2 0x1.4p2 +REG epsg:4283 0 0x0.0p0 0x0.0p0 +REG epsg:4283 1 -0x1.4p2 -0x1.4p2 +REG epsg:4283 2 0x1.4p2 -0x1.4p2 +REG epsg:4283 3 -0x1.4p2 0x1.4p2 +REG epsg:4283 4 0x1.4p2 0x1.4p2 +REG epsg:4284 0 0x0.0p0 0x0.0p0 +REG epsg:4284 1 -0x1.4p2 -0x1.4p2 +REG epsg:4284 2 0x1.4p2 -0x1.4p2 +REG epsg:4284 3 -0x1.4p2 0x1.4p2 +REG epsg:4284 4 0x1.4p2 0x1.4p2 +REG epsg:4285 0 0x0.0p0 0x0.0p0 +REG epsg:4285 1 -0x1.4p2 -0x1.4p2 +REG epsg:4285 2 0x1.4p2 -0x1.4p2 +REG epsg:4285 3 -0x1.4p2 0x1.4p2 +REG epsg:4285 4 0x1.4p2 0x1.4p2 +REG epsg:4286 0 0x0.0p0 0x0.0p0 +REG epsg:4286 1 -0x1.4p2 -0x1.4p2 +REG epsg:4286 2 0x1.4p2 -0x1.4p2 +REG epsg:4286 3 -0x1.4p2 0x1.4p2 +REG epsg:4286 4 0x1.4p2 0x1.4p2 +REG epsg:4287 0 0x0.0p0 0x0.0p0 +REG epsg:4287 1 -0x1.4p2 -0x1.4p2 +REG epsg:4287 2 0x1.4p2 -0x1.4p2 +REG epsg:4287 3 -0x1.4p2 0x1.4p2 +REG epsg:4287 4 0x1.4p2 0x1.4p2 +REG epsg:4288 0 0x0.0p0 0x0.0p0 +REG epsg:4288 1 -0x1.4p2 -0x1.4p2 +REG epsg:4288 2 0x1.4p2 -0x1.4p2 +REG epsg:4288 3 -0x1.4p2 0x1.4p2 +REG epsg:4288 4 0x1.4p2 0x1.4p2 +REG epsg:4289 0 0x0.0p0 0x0.0p0 +REG epsg:4289 1 -0x1.4p2 -0x1.4p2 +REG epsg:4289 2 0x1.4p2 -0x1.4p2 +REG epsg:4289 3 -0x1.4p2 0x1.4p2 +REG epsg:4289 4 0x1.4p2 0x1.4p2 +REG epsg:4291 0 0x0.0p0 0x0.0p0 +REG epsg:4291 1 -0x1.4p2 -0x1.4p2 +REG epsg:4291 2 0x1.4p2 -0x1.4p2 +REG epsg:4291 3 -0x1.4p2 0x1.4p2 +REG epsg:4291 4 0x1.4p2 0x1.4p2 +REG epsg:4292 0 0x0.0p0 0x0.0p0 +REG epsg:4292 1 -0x1.4p2 -0x1.4p2 +REG epsg:4292 2 0x1.4p2 -0x1.4p2 +REG epsg:4292 3 -0x1.4p2 0x1.4p2 +REG epsg:4292 4 0x1.4p2 0x1.4p2 +REG epsg:4293 0 0x0.0p0 0x0.0p0 +REG epsg:4293 1 -0x1.4p2 -0x1.4p2 +REG epsg:4293 2 0x1.4p2 -0x1.4p2 +REG epsg:4293 3 -0x1.4p2 0x1.4p2 +REG epsg:4293 4 0x1.4p2 0x1.4p2 +REG epsg:4294 0 0x0.0p0 0x0.0p0 +REG epsg:4294 1 -0x1.4p2 -0x1.4p2 +REG epsg:4294 2 0x1.4p2 -0x1.4p2 +REG epsg:4294 3 -0x1.4p2 0x1.4p2 +REG epsg:4294 4 0x1.4p2 0x1.4p2 +REG epsg:4295 0 0x0.0p0 0x0.0p0 +REG epsg:4295 1 -0x1.4p2 -0x1.4p2 +REG epsg:4295 2 0x1.4p2 -0x1.4p2 +REG epsg:4295 3 -0x1.4p2 0x1.4p2 +REG epsg:4295 4 0x1.4p2 0x1.4p2 +REG epsg:4296 0 0x0.0p0 0x0.0p0 +REG epsg:4296 1 -0x1.4p2 -0x1.4p2 +REG epsg:4296 2 0x1.4p2 -0x1.4p2 +REG epsg:4296 3 -0x1.4p2 0x1.4p2 +REG epsg:4296 4 0x1.4p2 0x1.4p2 +REG epsg:4297 0 0x0.0p0 0x0.0p0 +REG epsg:4297 1 -0x1.4p2 -0x1.4p2 +REG epsg:4297 2 0x1.4p2 -0x1.4p2 +REG epsg:4297 3 -0x1.4p2 0x1.4p2 +REG epsg:4297 4 0x1.4p2 0x1.4p2 +REG epsg:4298 0 0x0.0p0 0x0.0p0 +REG epsg:4298 1 -0x1.4p2 -0x1.4p2 +REG epsg:4298 2 0x1.4p2 -0x1.4p2 +REG epsg:4298 3 -0x1.4p2 0x1.4p2 +REG epsg:4298 4 0x1.4p2 0x1.4p2 +REG epsg:4299 0 0x0.0p0 0x0.0p0 +REG epsg:4299 1 -0x1.4p2 -0x1.4p2 +REG epsg:4299 2 0x1.4p2 -0x1.4p2 +REG epsg:4299 3 -0x1.4p2 0x1.4p2 +REG epsg:4299 4 0x1.4p2 0x1.4p2 +REG epsg:4300 0 0x0.0p0 0x0.0p0 +REG epsg:4300 1 -0x1.4p2 -0x1.4p2 +REG epsg:4300 2 0x1.4p2 -0x1.4p2 +REG epsg:4300 3 -0x1.4p2 0x1.4p2 +REG epsg:4300 4 0x1.4p2 0x1.4p2 +REG epsg:4301 0 0x0.0p0 0x0.0p0 +REG epsg:4301 1 -0x1.4p2 -0x1.4p2 +REG epsg:4301 2 0x1.4p2 -0x1.4p2 +REG epsg:4301 3 -0x1.4p2 0x1.4p2 +REG epsg:4301 4 0x1.4p2 0x1.4p2 +REG epsg:4302 0 0x0.0p0 0x0.0p0 +REG epsg:4302 1 -0x1.4p2 -0x1.4p2 +REG epsg:4302 2 0x1.4p2 -0x1.4p2 +REG epsg:4302 3 -0x1.4p2 0x1.4p2 +REG epsg:4302 4 0x1.4p2 0x1.4p2 +REG epsg:4303 0 0x0.0p0 0x0.0p0 +REG epsg:4303 1 -0x1.4p2 -0x1.4p2 +REG epsg:4303 2 0x1.4p2 -0x1.4p2 +REG epsg:4303 3 -0x1.4p2 0x1.4p2 +REG epsg:4303 4 0x1.4p2 0x1.4p2 +REG epsg:4304 0 0x0.0p0 0x0.0p0 +REG epsg:4304 1 -0x1.4p2 -0x1.4p2 +REG epsg:4304 2 0x1.4p2 -0x1.4p2 +REG epsg:4304 3 -0x1.4p2 0x1.4p2 +REG epsg:4304 4 0x1.4p2 0x1.4p2 +REG epsg:4306 0 0x0.0p0 0x0.0p0 +REG epsg:4306 1 -0x1.4p2 -0x1.4p2 +REG epsg:4306 2 0x1.4p2 -0x1.4p2 +REG epsg:4306 3 -0x1.4p2 0x1.4p2 +REG epsg:4306 4 0x1.4p2 0x1.4p2 +REG epsg:4307 0 0x0.0p0 0x0.0p0 +REG epsg:4307 1 -0x1.4p2 -0x1.4p2 +REG epsg:4307 2 0x1.4p2 -0x1.4p2 +REG epsg:4307 3 -0x1.4p2 0x1.4p2 +REG epsg:4307 4 0x1.4p2 0x1.4p2 +REG epsg:4308 0 0x0.0p0 0x0.0p0 +REG epsg:4308 1 -0x1.4p2 -0x1.4p2 +REG epsg:4308 2 0x1.4p2 -0x1.4p2 +REG epsg:4308 3 -0x1.4p2 0x1.4p2 +REG epsg:4308 4 0x1.4p2 0x1.4p2 +REG epsg:4309 0 0x0.0p0 0x0.0p0 +REG epsg:4309 1 -0x1.4p2 -0x1.4p2 +REG epsg:4309 2 0x1.4p2 -0x1.4p2 +REG epsg:4309 3 -0x1.4p2 0x1.4p2 +REG epsg:4309 4 0x1.4p2 0x1.4p2 +REG epsg:4310 0 0x0.0p0 0x0.0p0 +REG epsg:4310 1 -0x1.4p2 -0x1.4p2 +REG epsg:4310 2 0x1.4p2 -0x1.4p2 +REG epsg:4310 3 -0x1.4p2 0x1.4p2 +REG epsg:4310 4 0x1.4p2 0x1.4p2 +REG epsg:4311 0 0x0.0p0 0x0.0p0 +REG epsg:4311 1 -0x1.4p2 -0x1.4p2 +REG epsg:4311 2 0x1.4p2 -0x1.4p2 +REG epsg:4311 3 -0x1.4p2 0x1.4p2 +REG epsg:4311 4 0x1.4p2 0x1.4p2 +REG epsg:4312 0 0x0.0p0 0x0.0p0 +REG epsg:4312 1 -0x1.4p2 -0x1.4p2 +REG epsg:4312 2 0x1.4p2 -0x1.4p2 +REG epsg:4312 3 -0x1.4p2 0x1.4p2 +REG epsg:4312 4 0x1.4p2 0x1.4p2 +REG epsg:4313 0 0x0.0p0 0x0.0p0 +REG epsg:4313 1 -0x1.4p2 -0x1.4p2 +REG epsg:4313 2 0x1.4p2 -0x1.4p2 +REG epsg:4313 3 -0x1.4p2 0x1.4p2 +REG epsg:4313 4 0x1.4p2 0x1.4p2 +REG epsg:4314 0 0x0.0p0 0x0.0p0 +REG epsg:4314 1 -0x1.4p2 -0x1.4p2 +REG epsg:4314 2 0x1.4p2 -0x1.4p2 +REG epsg:4314 3 -0x1.4p2 0x1.4p2 +REG epsg:4314 4 0x1.4p2 0x1.4p2 +REG epsg:4315 0 0x0.0p0 0x0.0p0 +REG epsg:4315 1 -0x1.4p2 -0x1.4p2 +REG epsg:4315 2 0x1.4p2 -0x1.4p2 +REG epsg:4315 3 -0x1.4p2 0x1.4p2 +REG epsg:4315 4 0x1.4p2 0x1.4p2 +REG epsg:4316 0 0x0.0p0 0x0.0p0 +REG epsg:4316 1 -0x1.4p2 -0x1.4p2 +REG epsg:4316 2 0x1.4p2 -0x1.4p2 +REG epsg:4316 3 -0x1.4p2 0x1.4p2 +REG epsg:4316 4 0x1.4p2 0x1.4p2 +REG epsg:4317 0 0x0.0p0 0x0.0p0 +REG epsg:4317 1 -0x1.4p2 -0x1.4p2 +REG epsg:4317 2 0x1.4p2 -0x1.4p2 +REG epsg:4317 3 -0x1.4p2 0x1.4p2 +REG epsg:4317 4 0x1.4p2 0x1.4p2 +REG epsg:4318 0 0x0.0p0 0x0.0p0 +REG epsg:4318 1 -0x1.4p2 -0x1.4p2 +REG epsg:4318 2 0x1.4p2 -0x1.4p2 +REG epsg:4318 3 -0x1.4p2 0x1.4p2 +REG epsg:4318 4 0x1.4p2 0x1.4p2 +REG epsg:4319 0 0x0.0p0 0x0.0p0 +REG epsg:4319 1 -0x1.4p2 -0x1.4p2 +REG epsg:4319 2 0x1.4p2 -0x1.4p2 +REG epsg:4319 3 -0x1.4p2 0x1.4p2 +REG epsg:4319 4 0x1.4p2 0x1.4p2 +REG epsg:4322 0 0x0.0p0 0x0.0p0 +REG epsg:4322 1 -0x1.4p2 -0x1.4p2 +REG epsg:4322 2 0x1.4p2 -0x1.4p2 +REG epsg:4322 3 -0x1.4p2 0x1.4p2 +REG epsg:4322 4 0x1.4p2 0x1.4p2 +REG epsg:4324 0 0x0.0p0 0x0.0p0 +REG epsg:4324 1 -0x1.4p2 -0x1.4p2 +REG epsg:4324 2 0x1.4p2 -0x1.4p2 +REG epsg:4324 3 -0x1.4p2 0x1.4p2 +REG epsg:4324 4 0x1.4p2 0x1.4p2 +REG epsg:4326 0 0x0.0p0 0x0.0p0 +REG epsg:4326 1 -0x1.4p2 -0x1.4p2 +REG epsg:4326 2 0x1.4p2 -0x1.4p2 +REG epsg:4326 3 -0x1.4p2 0x1.4p2 +REG epsg:4326 4 0x1.4p2 0x1.4p2 +REG epsg:4328 0 0x0.0p0 0x0.0p0 +REG epsg:4328 1 -0x1.4p2 -0x1.4p2 +REG epsg:4328 2 0x1.4p2 -0x1.4p2 +REG epsg:4328 3 -0x1.4p2 0x1.4p2 +REG epsg:4328 4 0x1.4p2 0x1.4p2 +REG epsg:4330 0 0x0.0p0 0x0.0p0 +REG epsg:4330 1 -0x1.4p2 -0x1.4p2 +REG epsg:4330 2 0x1.4p2 -0x1.4p2 +REG epsg:4330 3 -0x1.4p2 0x1.4p2 +REG epsg:4330 4 0x1.4p2 0x1.4p2 +REG epsg:4331 0 0x0.0p0 0x0.0p0 +REG epsg:4331 1 -0x1.4p2 -0x1.4p2 +REG epsg:4331 2 0x1.4p2 -0x1.4p2 +REG epsg:4331 3 -0x1.4p2 0x1.4p2 +REG epsg:4331 4 0x1.4p2 0x1.4p2 +REG epsg:4332 0 0x0.0p0 0x0.0p0 +REG epsg:4332 1 -0x1.4p2 -0x1.4p2 +REG epsg:4332 2 0x1.4p2 -0x1.4p2 +REG epsg:4332 3 -0x1.4p2 0x1.4p2 +REG epsg:4332 4 0x1.4p2 0x1.4p2 +REG epsg:4333 0 0x0.0p0 0x0.0p0 +REG epsg:4333 1 -0x1.4p2 -0x1.4p2 +REG epsg:4333 2 0x1.4p2 -0x1.4p2 +REG epsg:4333 3 -0x1.4p2 0x1.4p2 +REG epsg:4333 4 0x1.4p2 0x1.4p2 +REG epsg:4334 0 0x0.0p0 0x0.0p0 +REG epsg:4334 1 -0x1.4p2 -0x1.4p2 +REG epsg:4334 2 0x1.4p2 -0x1.4p2 +REG epsg:4334 3 -0x1.4p2 0x1.4p2 +REG epsg:4334 4 0x1.4p2 0x1.4p2 +REG epsg:4335 0 0x0.0p0 0x0.0p0 +REG epsg:4335 1 -0x1.4p2 -0x1.4p2 +REG epsg:4335 2 0x1.4p2 -0x1.4p2 +REG epsg:4335 3 -0x1.4p2 0x1.4p2 +REG epsg:4335 4 0x1.4p2 0x1.4p2 +REG epsg:4336 0 0x0.0p0 0x0.0p0 +REG epsg:4336 1 -0x1.4p2 -0x1.4p2 +REG epsg:4336 2 0x1.4p2 -0x1.4p2 +REG epsg:4336 3 -0x1.4p2 0x1.4p2 +REG epsg:4336 4 0x1.4p2 0x1.4p2 +REG epsg:4337 0 0x0.0p0 0x0.0p0 +REG epsg:4337 1 -0x1.4p2 -0x1.4p2 +REG epsg:4337 2 0x1.4p2 -0x1.4p2 +REG epsg:4337 3 -0x1.4p2 0x1.4p2 +REG epsg:4337 4 0x1.4p2 0x1.4p2 +REG epsg:4338 0 0x0.0p0 0x0.0p0 +REG epsg:4338 1 -0x1.4p2 -0x1.4p2 +REG epsg:4338 2 0x1.4p2 -0x1.4p2 +REG epsg:4338 3 -0x1.4p2 0x1.4p2 +REG epsg:4338 4 0x1.4p2 0x1.4p2 +REG epsg:4340 0 0x0.0p0 0x0.0p0 +REG epsg:4340 1 -0x1.4p2 -0x1.4p2 +REG epsg:4340 2 0x1.4p2 -0x1.4p2 +REG epsg:4340 3 -0x1.4p2 0x1.4p2 +REG epsg:4340 4 0x1.4p2 0x1.4p2 +REG epsg:4342 0 0x0.0p0 0x0.0p0 +REG epsg:4342 1 -0x1.4p2 -0x1.4p2 +REG epsg:4342 2 0x1.4p2 -0x1.4p2 +REG epsg:4342 3 -0x1.4p2 0x1.4p2 +REG epsg:4342 4 0x1.4p2 0x1.4p2 +REG epsg:4344 0 0x0.0p0 0x0.0p0 +REG epsg:4344 1 -0x1.4p2 -0x1.4p2 +REG epsg:4344 2 0x1.4p2 -0x1.4p2 +REG epsg:4344 3 -0x1.4p2 0x1.4p2 +REG epsg:4344 4 0x1.4p2 0x1.4p2 +REG epsg:4346 0 0x0.0p0 0x0.0p0 +REG epsg:4346 1 -0x1.4p2 -0x1.4p2 +REG epsg:4346 2 0x1.4p2 -0x1.4p2 +REG epsg:4346 3 -0x1.4p2 0x1.4p2 +REG epsg:4346 4 0x1.4p2 0x1.4p2 +REG epsg:4348 0 0x0.0p0 0x0.0p0 +REG epsg:4348 1 -0x1.4p2 -0x1.4p2 +REG epsg:4348 2 0x1.4p2 -0x1.4p2 +REG epsg:4348 3 -0x1.4p2 0x1.4p2 +REG epsg:4348 4 0x1.4p2 0x1.4p2 +REG epsg:4350 0 0x0.0p0 0x0.0p0 +REG epsg:4350 1 -0x1.4p2 -0x1.4p2 +REG epsg:4350 2 0x1.4p2 -0x1.4p2 +REG epsg:4350 3 -0x1.4p2 0x1.4p2 +REG epsg:4350 4 0x1.4p2 0x1.4p2 +REG epsg:4352 0 0x0.0p0 0x0.0p0 +REG epsg:4352 1 -0x1.4p2 -0x1.4p2 +REG epsg:4352 2 0x1.4p2 -0x1.4p2 +REG epsg:4352 3 -0x1.4p2 0x1.4p2 +REG epsg:4352 4 0x1.4p2 0x1.4p2 +REG epsg:4354 0 0x0.0p0 0x0.0p0 +REG epsg:4354 1 -0x1.4p2 -0x1.4p2 +REG epsg:4354 2 0x1.4p2 -0x1.4p2 +REG epsg:4354 3 -0x1.4p2 0x1.4p2 +REG epsg:4354 4 0x1.4p2 0x1.4p2 +REG epsg:4356 0 0x0.0p0 0x0.0p0 +REG epsg:4356 1 -0x1.4p2 -0x1.4p2 +REG epsg:4356 2 0x1.4p2 -0x1.4p2 +REG epsg:4356 3 -0x1.4p2 0x1.4p2 +REG epsg:4356 4 0x1.4p2 0x1.4p2 +REG epsg:4358 0 0x0.0p0 0x0.0p0 +REG epsg:4358 1 -0x1.4p2 -0x1.4p2 +REG epsg:4358 2 0x1.4p2 -0x1.4p2 +REG epsg:4358 3 -0x1.4p2 0x1.4p2 +REG epsg:4358 4 0x1.4p2 0x1.4p2 +REG epsg:4360 0 0x0.0p0 0x0.0p0 +REG epsg:4360 1 -0x1.4p2 -0x1.4p2 +REG epsg:4360 2 0x1.4p2 -0x1.4p2 +REG epsg:4360 3 -0x1.4p2 0x1.4p2 +REG epsg:4360 4 0x1.4p2 0x1.4p2 +REG epsg:4362 0 0x0.0p0 0x0.0p0 +REG epsg:4362 1 -0x1.4p2 -0x1.4p2 +REG epsg:4362 2 0x1.4p2 -0x1.4p2 +REG epsg:4362 3 -0x1.4p2 0x1.4p2 +REG epsg:4362 4 0x1.4p2 0x1.4p2 +REG epsg:4364 0 0x0.0p0 0x0.0p0 +REG epsg:4364 1 -0x1.4p2 -0x1.4p2 +REG epsg:4364 2 0x1.4p2 -0x1.4p2 +REG epsg:4364 3 -0x1.4p2 0x1.4p2 +REG epsg:4364 4 0x1.4p2 0x1.4p2 +REG epsg:4366 0 0x0.0p0 0x0.0p0 +REG epsg:4366 1 -0x1.4p2 -0x1.4p2 +REG epsg:4366 2 0x1.4p2 -0x1.4p2 +REG epsg:4366 3 -0x1.4p2 0x1.4p2 +REG epsg:4366 4 0x1.4p2 0x1.4p2 +REG epsg:4368 0 0x0.0p0 0x0.0p0 +REG epsg:4368 1 -0x1.4p2 -0x1.4p2 +REG epsg:4368 2 0x1.4p2 -0x1.4p2 +REG epsg:4368 3 -0x1.4p2 0x1.4p2 +REG epsg:4368 4 0x1.4p2 0x1.4p2 +REG epsg:4370 0 0x0.0p0 0x0.0p0 +REG epsg:4370 1 -0x1.4p2 -0x1.4p2 +REG epsg:4370 2 0x1.4p2 -0x1.4p2 +REG epsg:4370 3 -0x1.4p2 0x1.4p2 +REG epsg:4370 4 0x1.4p2 0x1.4p2 +REG epsg:4372 0 0x0.0p0 0x0.0p0 +REG epsg:4372 1 -0x1.4p2 -0x1.4p2 +REG epsg:4372 2 0x1.4p2 -0x1.4p2 +REG epsg:4372 3 -0x1.4p2 0x1.4p2 +REG epsg:4372 4 0x1.4p2 0x1.4p2 +REG epsg:4374 0 0x0.0p0 0x0.0p0 +REG epsg:4374 1 -0x1.4p2 -0x1.4p2 +REG epsg:4374 2 0x1.4p2 -0x1.4p2 +REG epsg:4374 3 -0x1.4p2 0x1.4p2 +REG epsg:4374 4 0x1.4p2 0x1.4p2 +REG epsg:4376 0 0x0.0p0 0x0.0p0 +REG epsg:4376 1 -0x1.4p2 -0x1.4p2 +REG epsg:4376 2 0x1.4p2 -0x1.4p2 +REG epsg:4376 3 -0x1.4p2 0x1.4p2 +REG epsg:4376 4 0x1.4p2 0x1.4p2 +REG epsg:4378 0 0x0.0p0 0x0.0p0 +REG epsg:4378 1 -0x1.4p2 -0x1.4p2 +REG epsg:4378 2 0x1.4p2 -0x1.4p2 +REG epsg:4378 3 -0x1.4p2 0x1.4p2 +REG epsg:4378 4 0x1.4p2 0x1.4p2 +REG epsg:4380 0 0x0.0p0 0x0.0p0 +REG epsg:4380 1 -0x1.4p2 -0x1.4p2 +REG epsg:4380 2 0x1.4p2 -0x1.4p2 +REG epsg:4380 3 -0x1.4p2 0x1.4p2 +REG epsg:4380 4 0x1.4p2 0x1.4p2 +REG epsg:4382 0 0x0.0p0 0x0.0p0 +REG epsg:4382 1 -0x1.4p2 -0x1.4p2 +REG epsg:4382 2 0x1.4p2 -0x1.4p2 +REG epsg:4382 3 -0x1.4p2 0x1.4p2 +REG epsg:4382 4 0x1.4p2 0x1.4p2 +REG epsg:4384 0 0x0.0p0 0x0.0p0 +REG epsg:4384 1 -0x1.4p2 -0x1.4p2 +REG epsg:4384 2 0x1.4p2 -0x1.4p2 +REG epsg:4384 3 -0x1.4p2 0x1.4p2 +REG epsg:4384 4 0x1.4p2 0x1.4p2 +REG epsg:4385 0 0x0.0p0 0x0.0p0 +REG epsg:4385 1 -0x1.4p2 -0x1.4p2 +REG epsg:4385 2 0x1.4p2 -0x1.4p2 +REG epsg:4385 3 -0x1.4p2 0x1.4p2 +REG epsg:4385 4 0x1.4p2 0x1.4p2 +REG epsg:4387 0 0x0.0p0 0x0.0p0 +REG epsg:4387 1 -0x1.4p2 -0x1.4p2 +REG epsg:4387 2 0x1.4p2 -0x1.4p2 +REG epsg:4387 3 -0x1.4p2 0x1.4p2 +REG epsg:4387 4 0x1.4p2 0x1.4p2 +REG epsg:4389 0 0x0.0p0 0x0.0p0 +REG epsg:4389 1 -0x1.4p2 -0x1.4p2 +REG epsg:4389 2 0x1.4p2 -0x1.4p2 +REG epsg:4389 3 -0x1.4p2 0x1.4p2 +REG epsg:4389 4 0x1.4p2 0x1.4p2 +REG epsg:4390 0 0x1.9e4043b874df4p6 0x1.05735ee402bbp1 +REG epsg:4390 1 0x1.8a3d026069db3p6 -0x1.7a8ca11bfd45p1 +REG epsg:4390 2 0x1.b24385107fe35p6 -0x1.7a8ca11bfd45p1 +REG epsg:4390 3 0x1.8a3d026069db3p6 0x1.c2b9af72015d8p2 +REG epsg:4390 4 0x1.b24385107fe35p6 0x1.c2b9af72015d8p2 +REG epsg:4391 0 0x1.97c3c131d5acep6 0x1.5b2c19ab13865p1 +REG epsg:4391 1 0x1.83be0337c9eebp6 -0x1.24d3e654ec79bp1 +REG epsg:4391 2 0x1.abc97f2be16b1p6 -0x1.24d3e654ec79bp1 +REG epsg:4391 3 0x1.83be0337c9eebp6 0x1.ed960cd589c32p2 +REG epsg:4391 4 0x1.abc97f2be16b1p6 0x1.ed960cd589c32p2 +REG epsg:4392 0 0x1.99bea5632b30cp6 0x1.db0123456789ap1 +REG epsg:4392 1 0x1.85b3e359a0f0dp6 -0x1.49fdb97530eccp0 +REG epsg:4392 2 0x1.adc9676cb570bp6 -0x1.49fdb97530eccp0 +REG epsg:4392 3 0x1.85b3e359a0f0dp6 0x1.16c048d159e26p3 +REG epsg:4392 4 0x1.adc9676cb570bp6 0x1.16c048d159e26p3 +REG epsg:4393 0 0x1.9608713b4d0cbp6 0x1.d71586d973bc1p1 +REG epsg:4393 1 0x1.81fddc8b677c1p6 -0x1.51d4f24d1887ep0 +REG epsg:4393 2 0x1.aa1305eb329d5p6 -0x1.51d4f24d1887ep0 +REG epsg:4393 3 0x1.81fddc8b677c1p6 0x1.15c561b65cefp3 +REG epsg:4393 4 0x1.aa1305eb329d5p6 0x1.15c561b65cefp3 +REG epsg:4394 0 0x1.9b94b17e4b17cp6 0x1.3c8d95c6edd75p2 +REG epsg:4394 1 0x1.87818e5ef0db2p6 -0x1.b9351c891458p-5 +REG epsg:4394 2 0x1.afa7d49da5546p6 -0x1.b9351c891458p-5 +REG epsg:4394 3 0x1.87818e5ef0db2p6 0x1.3e46cae376ebap3 +REG epsg:4394 4 0x1.afa7d49da5546p6 0x1.3e46cae376ebap3 +REG epsg:4395 0 0x1.91622b99824c3p6 0x1.5af6fd21ff2e5p2 +REG epsg:4395 1 0x1.7d4b2a3be229ap6 0x1.af6fd21ff2e5p-2 +REG epsg:4395 2 0x1.a5792cf7226ecp6 0x1.af6fd21ff2e5p-2 +REG epsg:4395 3 0x1.7d4b2a3be229ap6 0x1.4d7b7e90ff972p3 +REG epsg:4395 4 0x1.a5792cf7226ecp6 0x1.4d7b7e90ff972p3 +REG epsg:4396 0 0x1.928ce58edcp6 0x1.7dc4f8dad142ap2 +REG epsg:4396 1 0x1.7e7105c228327p6 0x1.ee27c6d68a15p-1 +REG epsg:4396 2 0x1.a6a8c55b8fcd9p6 0x1.ee27c6d68a15p-1 +REG epsg:4396 3 0x1.7e7105c228327p6 0x1.5ee27c6d68a15p3 +REG epsg:4396 4 0x1.a6a8c55b8fcd9p6 0x1.5ee27c6d68a15p3 +REG epsg:4397 0 0x1.93445e7b272f8p6 0x1.3700174d3b7bap2 +REG epsg:4397 1 0x1.7f31e63c65122p6 -0x1.1ffd1658908cp-3 +REG epsg:4397 2 0x1.a756d6b9e94cep6 -0x1.1ffd1658908cp-3 +REG epsg:4397 3 0x1.7f31e63c65122p6 0x1.3b800ba69dbddp3 +REG epsg:4397 4 0x1.a756d6b9e94cep6 0x1.3b800ba69dbddp3 +REG epsg:4398 0 0x1.98b58bf258bf5p6 0x1.7936058d672c7p2 +REG epsg:4398 1 0x1.849a56490bea5p6 0x1.c9b02c6b39638p-1 +REG epsg:4398 2 0x1.acd0c19ba5945p6 0x1.c9b02c6b39638p-1 +REG epsg:4398 3 0x1.849a56490bea5p6 0x1.5c9b02c6b3964p3 +REG epsg:4398 4 0x1.acd0c19ba5945p6 0x1.5c9b02c6b3964p3 +REG epsg:4399 0 0x1.56p7 0x0.0p0 +REG epsg:4399 1 0x1.4cp7 -0x1.4p2 +REG epsg:4399 2 0x1.6p7 -0x1.4p2 +REG epsg:4399 3 0x1.4cp7 0x1.4p2 +REG epsg:4399 4 0x1.6p7 0x1.4p2 +REG epsg:4400 0 0x1.62p7 0x0.0p0 +REG epsg:4400 1 0x1.58p7 -0x1.4p2 +REG epsg:4400 2 -0x1.64p7 -0x1.4p2 +REG epsg:4400 3 0x1.58p7 0x1.4p2 +REG epsg:4400 4 -0x1.64p7 0x1.4p2 +REG epsg:4401 0 -0x1.62p7 0x0.0p0 +REG epsg:4401 1 0x1.64p7 -0x1.4p2 +REG epsg:4401 2 -0x1.58p7 -0x1.4p2 +REG epsg:4401 3 0x1.64p7 0x1.4p2 +REG epsg:4401 4 -0x1.58p7 0x1.4p2 +REG epsg:4402 0 -0x1.56p7 0x0.0p0 +REG epsg:4402 1 -0x1.6p7 -0x1.4p2 +REG epsg:4402 2 -0x1.4cp7 -0x1.4p2 +REG epsg:4402 3 -0x1.6p7 0x1.4p2 +REG epsg:4402 4 -0x1.4cp7 0x1.4p2 +REG epsg:4403 0 -0x1.4ap7 0x0.0p0 +REG epsg:4403 1 -0x1.54p7 -0x1.4p2 +REG epsg:4403 2 -0x1.4p7 -0x1.4p2 +REG epsg:4403 3 -0x1.54p7 0x1.4p2 +REG epsg:4403 4 -0x1.4p7 0x1.4p2 +REG epsg:4404 0 -0x1.3ep7 0x0.0p0 +REG epsg:4404 1 -0x1.48p7 -0x1.4p2 +REG epsg:4404 2 -0x1.34p7 -0x1.4p2 +REG epsg:4404 3 -0x1.48p7 0x1.4p2 +REG epsg:4404 4 -0x1.34p7 0x1.4p2 +REG epsg:4405 0 -0x1.32p7 0x0.0p0 +REG epsg:4405 1 -0x1.3cp7 -0x1.4p2 +REG epsg:4405 2 -0x1.28p7 -0x1.4p2 +REG epsg:4405 3 -0x1.3cp7 0x1.4p2 +REG epsg:4405 4 -0x1.28p7 0x1.4p2 +REG epsg:4406 0 -0x1.26p7 0x0.0p0 +REG epsg:4406 1 -0x1.3p7 -0x1.4p2 +REG epsg:4406 2 -0x1.1cp7 -0x1.4p2 +REG epsg:4406 3 -0x1.3p7 0x1.4p2 +REG epsg:4406 4 -0x1.1cp7 0x1.4p2 +REG epsg:4407 0 -0x1.1ap7 0x0.0p0 +REG epsg:4407 1 -0x1.24p7 -0x1.4p2 +REG epsg:4407 2 -0x1.1p7 -0x1.4p2 +REG epsg:4407 3 -0x1.24p7 0x1.4p2 +REG epsg:4407 4 -0x1.1p7 0x1.4p2 +REG epsg:4408 0 -0x1.0ep7 0x0.0p0 +REG epsg:4408 1 -0x1.18p7 -0x1.4p2 +REG epsg:4408 2 -0x1.04p7 -0x1.4p2 +REG epsg:4408 3 -0x1.18p7 0x1.4p2 +REG epsg:4408 4 -0x1.04p7 0x1.4p2 +REG epsg:4409 0 -0x1.02p7 0x0.0p0 +REG epsg:4409 1 -0x1.0cp7 -0x1.4p2 +REG epsg:4409 2 -0x1.fp6 -0x1.4p2 +REG epsg:4409 3 -0x1.0cp7 0x1.4p2 +REG epsg:4409 4 -0x1.fp6 0x1.4p2 +REG epsg:4410 0 -0x1.ecp6 0x0.0p0 +REG epsg:4410 1 -0x1.0p7 -0x1.4p2 +REG epsg:4410 2 -0x1.d8p6 -0x1.4p2 +REG epsg:4410 3 -0x1.0p7 0x1.4p2 +REG epsg:4410 4 -0x1.d8p6 0x1.4p2 +REG epsg:4411 0 -0x1.d4p6 0x0.0p0 +REG epsg:4411 1 -0x1.e8p6 -0x1.4p2 +REG epsg:4411 2 -0x1.cp6 -0x1.4p2 +REG epsg:4411 3 -0x1.e8p6 0x1.4p2 +REG epsg:4411 4 -0x1.cp6 0x1.4p2 +REG epsg:4412 0 -0x1.bcp6 0x0.0p0 +REG epsg:4412 1 -0x1.dp6 -0x1.4p2 +REG epsg:4412 2 -0x1.a8p6 -0x1.4p2 +REG epsg:4412 3 -0x1.dp6 0x1.4p2 +REG epsg:4412 4 -0x1.a8p6 0x1.4p2 +REG epsg:4413 0 -0x1.a4p6 0x0.0p0 +REG epsg:4413 1 -0x1.b8p6 -0x1.4p2 +REG epsg:4413 2 -0x1.9p6 -0x1.4p2 +REG epsg:4413 3 -0x1.b8p6 0x1.4p2 +REG epsg:4413 4 -0x1.9p6 0x1.4p2 +REG epsg:4414 0 0x1.218p7 0x1.bp3 +REG epsg:4414 1 0x1.173741d194fbfp7 0x1.1p3 +REG epsg:4414 2 0x1.2bc8be2e6b041p7 0x1.1p3 +REG epsg:4414 3 0x1.173741d194fbfp7 0x1.28p4 +REG epsg:4414 4 0x1.2bc8be2e6b041p7 0x1.28p4 +REG epsg:4415 0 0x1.ap4 -0x1.2p3 +REG epsg:4415 1 0x1.4f00b6d76p4 -0x1.cp3 +REG epsg:4415 2 0x1.f0ff4928ap4 -0x1.cp3 +REG epsg:4415 3 0x1.4f00b6d76p4 -0x1.0p2 +REG epsg:4415 4 0x1.f0ff4928ap4 -0x1.0p2 +REG epsg:4417 0 0x1.5p4 0x0.0p0 +REG epsg:4417 1 0x1.0p4 -0x1.4p2 +REG epsg:4417 2 0x1.ap4 -0x1.4p2 +REG epsg:4417 3 0x1.0p4 0x1.4p2 +REG epsg:4417 4 0x1.ap4 0x1.4p2 +REG epsg:4418 0 -0x1.2cp6 0x0.0p0 +REG epsg:4418 1 -0x1.4p6 -0x1.4p2 +REG epsg:4418 2 -0x1.18p6 -0x1.4p2 +REG epsg:4418 3 -0x1.4p6 0x1.4p2 +REG epsg:4418 4 -0x1.18p6 0x1.4p2 +REG epsg:4419 0 -0x1.14p6 0x0.0p0 +REG epsg:4419 1 -0x1.28p6 -0x1.4p2 +REG epsg:4419 2 -0x1.0p6 -0x1.4p2 +REG epsg:4419 3 -0x1.28p6 0x1.4p2 +REG epsg:4419 4 -0x1.0p6 0x1.4p2 +REG epsg:4420 0 0x1.62p7 0x0.0p0 +REG epsg:4420 1 0x1.58p7 -0x1.4p2 +REG epsg:4420 2 -0x1.64p7 -0x1.4p2 +REG epsg:4420 3 0x1.58p7 0x1.4p2 +REG epsg:4420 4 -0x1.64p7 0x1.4p2 +REG epsg:4421 0 -0x1.62p7 0x0.0p0 +REG epsg:4421 1 0x1.64p7 -0x1.4p2 +REG epsg:4421 2 -0x1.58p7 -0x1.4p2 +REG epsg:4421 3 0x1.64p7 0x1.4p2 +REG epsg:4421 4 -0x1.58p7 0x1.4p2 +REG epsg:4422 0 -0x1.56p7 0x0.0p0 +REG epsg:4422 1 -0x1.6p7 -0x1.4p2 +REG epsg:4422 2 -0x1.4cp7 -0x1.4p2 +REG epsg:4422 3 -0x1.6p7 0x1.4p2 +REG epsg:4422 4 -0x1.4cp7 0x1.4p2 +REG epsg:4423 0 -0x1.4ap7 0x0.0p0 +REG epsg:4423 1 -0x1.54p7 -0x1.4p2 +REG epsg:4423 2 -0x1.4p7 -0x1.4p2 +REG epsg:4423 3 -0x1.54p7 0x1.4p2 +REG epsg:4423 4 -0x1.4p7 0x1.4p2 +REG epsg:4424 0 -0x1.3ep7 0x0.0p0 +REG epsg:4424 1 -0x1.48p7 -0x1.4p2 +REG epsg:4424 2 -0x1.34p7 -0x1.4p2 +REG epsg:4424 3 -0x1.48p7 0x1.4p2 +REG epsg:4424 4 -0x1.34p7 0x1.4p2 +REG epsg:4425 0 -0x1.32p7 0x0.0p0 +REG epsg:4425 1 -0x1.3cp7 -0x1.4p2 +REG epsg:4425 2 -0x1.28p7 -0x1.4p2 +REG epsg:4425 3 -0x1.3cp7 0x1.4p2 +REG epsg:4425 4 -0x1.28p7 0x1.4p2 +REG epsg:4426 0 -0x1.26p7 0x0.0p0 +REG epsg:4426 1 -0x1.3p7 -0x1.4p2 +REG epsg:4426 2 -0x1.1cp7 -0x1.4p2 +REG epsg:4426 3 -0x1.3p7 0x1.4p2 +REG epsg:4426 4 -0x1.1cp7 0x1.4p2 +REG epsg:4427 0 -0x1.1ap7 0x0.0p0 +REG epsg:4427 1 -0x1.24p7 -0x1.4p2 +REG epsg:4427 2 -0x1.1p7 -0x1.4p2 +REG epsg:4427 3 -0x1.24p7 0x1.4p2 +REG epsg:4427 4 -0x1.1p7 0x1.4p2 +REG epsg:4428 0 -0x1.0ep7 0x0.0p0 +REG epsg:4428 1 -0x1.18p7 -0x1.4p2 +REG epsg:4428 2 -0x1.04p7 -0x1.4p2 +REG epsg:4428 3 -0x1.18p7 0x1.4p2 +REG epsg:4428 4 -0x1.04p7 0x1.4p2 +REG epsg:4429 0 -0x1.02p7 0x0.0p0 +REG epsg:4429 1 -0x1.0cp7 -0x1.4p2 +REG epsg:4429 2 -0x1.fp6 -0x1.4p2 +REG epsg:4429 3 -0x1.0cp7 0x1.4p2 +REG epsg:4429 4 -0x1.fp6 0x1.4p2 +REG epsg:4430 0 -0x1.ecp6 0x0.0p0 +REG epsg:4430 1 -0x1.0p7 -0x1.4p2 +REG epsg:4430 2 -0x1.d8p6 -0x1.4p2 +REG epsg:4430 3 -0x1.0p7 0x1.4p2 +REG epsg:4430 4 -0x1.d8p6 0x1.4p2 +REG epsg:4431 0 -0x1.d4p6 0x0.0p0 +REG epsg:4431 1 -0x1.e8p6 -0x1.4p2 +REG epsg:4431 2 -0x1.cp6 -0x1.4p2 +REG epsg:4431 3 -0x1.e8p6 0x1.4p2 +REG epsg:4431 4 -0x1.cp6 0x1.4p2 +REG epsg:4432 0 -0x1.bcp6 0x0.0p0 +REG epsg:4432 1 -0x1.dp6 -0x1.4p2 +REG epsg:4432 2 -0x1.a8p6 -0x1.4p2 +REG epsg:4432 3 -0x1.dp6 0x1.4p2 +REG epsg:4432 4 -0x1.a8p6 0x1.4p2 +REG epsg:4433 0 -0x1.a4p6 0x0.0p0 +REG epsg:4433 1 -0x1.b8p6 -0x1.4p2 +REG epsg:4433 2 -0x1.9p6 -0x1.4p2 +REG epsg:4433 3 -0x1.b8p6 0x1.4p2 +REG epsg:4433 4 -0x1.9p6 0x1.4p2 +REG epsg:4434 0 0x1.8p4 0x0.0p0 +REG epsg:4434 1 0x1.3p4 -0x1.4p2 +REG epsg:4434 2 0x1.dp4 -0x1.4p2 +REG epsg:4434 3 0x1.3p4 0x1.4p2 +REG epsg:4434 4 0x1.dp4 0x1.4p2 +REG epsg:4437 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:4437 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:4437 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:4437 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:4437 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:4438 0 -0x1.2cp6 0x0.0p0 +REG epsg:4438 1 -0x1.4p6 -0x1.4p2 +REG epsg:4438 2 -0x1.18p6 -0x1.4p2 +REG epsg:4438 3 -0x1.4p6 0x1.4p2 +REG epsg:4438 4 -0x1.18p6 0x1.4p2 +REG epsg:4439 0 -0x1.14p6 0x0.0p0 +REG epsg:4439 1 -0x1.28p6 -0x1.4p2 +REG epsg:4439 2 -0x1.0p6 -0x1.4p2 +REG epsg:4439 3 -0x1.28p6 0x1.4p2 +REG epsg:4439 4 -0x1.0p6 0x1.4p2 +REG epsg:4455 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:4455 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:4455 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:4455 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:4455 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:4456 0 -0x1.28p6 0x1.4622222222222p5 +REG epsg:4456 1 -0x1.2d4809c4ef0d8p6 0x1.3e22222222222p5 +REG epsg:4456 2 -0x1.22b7f63b10f28p6 0x1.3e22222222222p5 +REG epsg:4456 3 -0x1.2d4809c4ef0d8p6 0x1.4e22222222222p5 +REG epsg:4456 4 -0x1.22b7f63b10f28p6 0x1.4e22222222222p5 +REG epsg:4457 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:4457 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:4457 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:4457 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:4457 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:4462 0 0x1.08p7 -0x1.bp4 +REG epsg:4462 1 0x1.cca911a9530fdp6 -0x1.5p5 +REG epsg:4462 2 0x1.29ab772b56782p7 -0x1.5p5 +REG epsg:4462 3 0x1.cca911a9530fdp6 -0x1.8p3 +REG epsg:4462 4 0x1.29ab772b56782p7 -0x1.8p3 +REG epsg:4463 0 0x0.0p0 0x0.0p0 +REG epsg:4463 1 -0x1.4p2 -0x1.4p2 +REG epsg:4463 2 0x1.4p2 -0x1.4p2 +REG epsg:4463 3 -0x1.4p2 0x1.4p2 +REG epsg:4463 4 0x1.4p2 0x1.4p2 +REG epsg:4465 0 0x0.0p0 0x0.0p0 +REG epsg:4465 1 -0x1.4p2 -0x1.4p2 +REG epsg:4465 2 0x1.4p2 -0x1.4p2 +REG epsg:4465 3 -0x1.4p2 0x1.4p2 +REG epsg:4465 4 0x1.4p2 0x1.4p2 +REG epsg:4467 0 -0x1.c8p5 0x0.0p0 +REG epsg:4467 1 -0x1.fp5 -0x1.4p2 +REG epsg:4467 2 -0x1.ap5 -0x1.4p2 +REG epsg:4467 3 -0x1.fp5 0x1.4p2 +REG epsg:4467 4 -0x1.ap5 0x1.4p2 +REG epsg:4468 0 0x0.0p0 0x0.0p0 +REG epsg:4468 1 -0x1.4p2 -0x1.4p2 +REG epsg:4468 2 0x1.4p2 -0x1.4p2 +REG epsg:4468 3 -0x1.4p2 0x1.4p2 +REG epsg:4468 4 0x1.4p2 0x1.4p2 +REG epsg:4470 0 0x0.0p0 0x0.0p0 +REG epsg:4470 1 -0x1.4p2 -0x1.4p2 +REG epsg:4470 2 0x1.4p2 -0x1.4p2 +REG epsg:4470 3 -0x1.4p2 0x1.4p2 +REG epsg:4470 4 0x1.4p2 0x1.4p2 +REG epsg:4471 0 0x1.68p5 -0x1.9p4 +REG epsg:4471 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:4471 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:4471 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:4471 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:4473 0 0x0.0p0 0x0.0p0 +REG epsg:4473 1 -0x1.4p2 -0x1.4p2 +REG epsg:4473 2 0x1.4p2 -0x1.4p2 +REG epsg:4473 3 -0x1.4p2 0x1.4p2 +REG epsg:4473 4 0x1.4p2 0x1.4p2 +REG epsg:4474 0 0x1.68p5 -0x1.9p4 +REG epsg:4474 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:4474 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:4474 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:4474 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:4475 0 0x0.0p0 0x0.0p0 +REG epsg:4475 1 -0x1.4p2 -0x1.4p2 +REG epsg:4475 2 0x1.4p2 -0x1.4p2 +REG epsg:4475 3 -0x1.4p2 0x1.4p2 +REG epsg:4475 4 0x1.4p2 0x1.4p2 +REG epsg:4479 0 0x0.0p0 0x0.0p0 +REG epsg:4479 1 -0x1.4p2 -0x1.4p2 +REG epsg:4479 2 0x1.4p2 -0x1.4p2 +REG epsg:4479 3 -0x1.4p2 0x1.4p2 +REG epsg:4479 4 0x1.4p2 0x1.4p2 +REG epsg:4481 0 0x0.0p0 0x0.0p0 +REG epsg:4481 1 -0x1.4p2 -0x1.4p2 +REG epsg:4481 2 0x1.4p2 -0x1.4p2 +REG epsg:4481 3 -0x1.4p2 0x1.4p2 +REG epsg:4481 4 0x1.4p2 0x1.4p2 +REG epsg:4483 0 0x0.0p0 0x0.0p0 +REG epsg:4483 1 -0x1.4p2 -0x1.4p2 +REG epsg:4483 2 0x1.4p2 -0x1.4p2 +REG epsg:4483 3 -0x1.4p2 0x1.4p2 +REG epsg:4483 4 0x1.4p2 0x1.4p2 +REG epsg:4484 0 -0x1.d4p6 0x0.0p0 +REG epsg:4484 1 -0x1.e8p6 -0x1.4p2 +REG epsg:4484 2 -0x1.cp6 -0x1.4p2 +REG epsg:4484 3 -0x1.e8p6 0x1.4p2 +REG epsg:4484 4 -0x1.cp6 0x1.4p2 +REG epsg:4485 0 -0x1.bcp6 0x0.0p0 +REG epsg:4485 1 -0x1.dp6 -0x1.4p2 +REG epsg:4485 2 -0x1.a8p6 -0x1.4p2 +REG epsg:4485 3 -0x1.dp6 0x1.4p2 +REG epsg:4485 4 -0x1.a8p6 0x1.4p2 +REG epsg:4486 0 -0x1.a4p6 0x0.0p0 +REG epsg:4486 1 -0x1.b8p6 -0x1.4p2 +REG epsg:4486 2 -0x1.9p6 -0x1.4p2 +REG epsg:4486 3 -0x1.b8p6 0x1.4p2 +REG epsg:4486 4 -0x1.9p6 0x1.4p2 +REG epsg:4487 0 -0x1.8cp6 0x0.0p0 +REG epsg:4487 1 -0x1.ap6 -0x1.4p2 +REG epsg:4487 2 -0x1.78p6 -0x1.4p2 +REG epsg:4487 3 -0x1.ap6 0x1.4p2 +REG epsg:4487 4 -0x1.78p6 0x1.4p2 +REG epsg:4488 0 -0x1.74p6 0x0.0p0 +REG epsg:4488 1 -0x1.88p6 -0x1.4p2 +REG epsg:4488 2 -0x1.6p6 -0x1.4p2 +REG epsg:4488 3 -0x1.88p6 0x1.4p2 +REG epsg:4488 4 -0x1.6p6 0x1.4p2 +REG epsg:4489 0 -0x1.5cp6 0x0.0p0 +REG epsg:4489 1 -0x1.7p6 -0x1.4p2 +REG epsg:4489 2 -0x1.48p6 -0x1.4p2 +REG epsg:4489 3 -0x1.7p6 0x1.4p2 +REG epsg:4489 4 -0x1.48p6 0x1.4p2 +REG epsg:4490 0 0x0.0p0 0x0.0p0 +REG epsg:4490 1 -0x1.4p2 -0x1.4p2 +REG epsg:4490 2 0x1.4p2 -0x1.4p2 +REG epsg:4490 3 -0x1.4p2 0x1.4p2 +REG epsg:4490 4 0x1.4p2 0x1.4p2 +REG epsg:4491 0 0x1.2cp6 0x0.0p0 +REG epsg:4491 1 0x1.18p6 -0x1.4p2 +REG epsg:4491 2 0x1.4p6 -0x1.4p2 +REG epsg:4491 3 0x1.18p6 0x1.4p2 +REG epsg:4491 4 0x1.4p6 0x1.4p2 +REG epsg:4492 0 0x1.44p6 0x0.0p0 +REG epsg:4492 1 0x1.3p6 -0x1.4p2 +REG epsg:4492 2 0x1.58p6 -0x1.4p2 +REG epsg:4492 3 0x1.3p6 0x1.4p2 +REG epsg:4492 4 0x1.58p6 0x1.4p2 +REG epsg:4493 0 0x1.5cp6 0x0.0p0 +REG epsg:4493 1 0x1.48p6 -0x1.4p2 +REG epsg:4493 2 0x1.7p6 -0x1.4p2 +REG epsg:4493 3 0x1.48p6 0x1.4p2 +REG epsg:4493 4 0x1.7p6 0x1.4p2 +REG epsg:4494 0 0x1.74p6 0x0.0p0 +REG epsg:4494 1 0x1.6p6 -0x1.4p2 +REG epsg:4494 2 0x1.88p6 -0x1.4p2 +REG epsg:4494 3 0x1.6p6 0x1.4p2 +REG epsg:4494 4 0x1.88p6 0x1.4p2 +REG epsg:4495 0 0x1.8cp6 0x0.0p0 +REG epsg:4495 1 0x1.78p6 -0x1.4p2 +REG epsg:4495 2 0x1.ap6 -0x1.4p2 +REG epsg:4495 3 0x1.78p6 0x1.4p2 +REG epsg:4495 4 0x1.ap6 0x1.4p2 +REG epsg:4496 0 0x1.a4p6 0x0.0p0 +REG epsg:4496 1 0x1.9p6 -0x1.4p2 +REG epsg:4496 2 0x1.b8p6 -0x1.4p2 +REG epsg:4496 3 0x1.9p6 0x1.4p2 +REG epsg:4496 4 0x1.b8p6 0x1.4p2 +REG epsg:4497 0 0x1.bcp6 0x0.0p0 +REG epsg:4497 1 0x1.a8p6 -0x1.4p2 +REG epsg:4497 2 0x1.dp6 -0x1.4p2 +REG epsg:4497 3 0x1.a8p6 0x1.4p2 +REG epsg:4497 4 0x1.dp6 0x1.4p2 +REG epsg:4498 0 0x1.d4p6 0x0.0p0 +REG epsg:4498 1 0x1.cp6 -0x1.4p2 +REG epsg:4498 2 0x1.e8p6 -0x1.4p2 +REG epsg:4498 3 0x1.cp6 0x1.4p2 +REG epsg:4498 4 0x1.e8p6 0x1.4p2 +REG epsg:4499 0 0x1.ecp6 0x0.0p0 +REG epsg:4499 1 0x1.d8p6 -0x1.4p2 +REG epsg:4499 2 0x1.0p7 -0x1.4p2 +REG epsg:4499 3 0x1.d8p6 0x1.4p2 +REG epsg:4499 4 0x1.0p7 0x1.4p2 +REG epsg:4500 0 0x1.02p7 0x0.0p0 +REG epsg:4500 1 0x1.fp6 -0x1.4p2 +REG epsg:4500 2 0x1.0cp7 -0x1.4p2 +REG epsg:4500 3 0x1.fp6 0x1.4p2 +REG epsg:4500 4 0x1.0cp7 0x1.4p2 +REG epsg:4501 0 0x1.0ep7 0x0.0p0 +REG epsg:4501 1 0x1.04p7 -0x1.4p2 +REG epsg:4501 2 0x1.18p7 -0x1.4p2 +REG epsg:4501 3 0x1.04p7 0x1.4p2 +REG epsg:4501 4 0x1.18p7 0x1.4p2 +REG epsg:4502 0 0x1.2cp6 0x0.0p0 +REG epsg:4502 1 0x1.18p6 -0x1.4p2 +REG epsg:4502 2 0x1.4p6 -0x1.4p2 +REG epsg:4502 3 0x1.18p6 0x1.4p2 +REG epsg:4502 4 0x1.4p6 0x1.4p2 +REG epsg:4503 0 0x1.44p6 0x0.0p0 +REG epsg:4503 1 0x1.3p6 -0x1.4p2 +REG epsg:4503 2 0x1.58p6 -0x1.4p2 +REG epsg:4503 3 0x1.3p6 0x1.4p2 +REG epsg:4503 4 0x1.58p6 0x1.4p2 +REG epsg:4504 0 0x1.5cp6 0x0.0p0 +REG epsg:4504 1 0x1.48p6 -0x1.4p2 +REG epsg:4504 2 0x1.7p6 -0x1.4p2 +REG epsg:4504 3 0x1.48p6 0x1.4p2 +REG epsg:4504 4 0x1.7p6 0x1.4p2 +REG epsg:4505 0 0x1.74p6 0x0.0p0 +REG epsg:4505 1 0x1.6p6 -0x1.4p2 +REG epsg:4505 2 0x1.88p6 -0x1.4p2 +REG epsg:4505 3 0x1.6p6 0x1.4p2 +REG epsg:4505 4 0x1.88p6 0x1.4p2 +REG epsg:4506 0 0x1.8cp6 0x0.0p0 +REG epsg:4506 1 0x1.78p6 -0x1.4p2 +REG epsg:4506 2 0x1.ap6 -0x1.4p2 +REG epsg:4506 3 0x1.78p6 0x1.4p2 +REG epsg:4506 4 0x1.ap6 0x1.4p2 +REG epsg:4507 0 0x1.a4p6 0x0.0p0 +REG epsg:4507 1 0x1.9p6 -0x1.4p2 +REG epsg:4507 2 0x1.b8p6 -0x1.4p2 +REG epsg:4507 3 0x1.9p6 0x1.4p2 +REG epsg:4507 4 0x1.b8p6 0x1.4p2 +REG epsg:4508 0 0x1.bcp6 0x0.0p0 +REG epsg:4508 1 0x1.a8p6 -0x1.4p2 +REG epsg:4508 2 0x1.dp6 -0x1.4p2 +REG epsg:4508 3 0x1.a8p6 0x1.4p2 +REG epsg:4508 4 0x1.dp6 0x1.4p2 +REG epsg:4509 0 0x1.d4p6 0x0.0p0 +REG epsg:4509 1 0x1.cp6 -0x1.4p2 +REG epsg:4509 2 0x1.e8p6 -0x1.4p2 +REG epsg:4509 3 0x1.cp6 0x1.4p2 +REG epsg:4509 4 0x1.e8p6 0x1.4p2 +REG epsg:4510 0 0x1.ecp6 0x0.0p0 +REG epsg:4510 1 0x1.d8p6 -0x1.4p2 +REG epsg:4510 2 0x1.0p7 -0x1.4p2 +REG epsg:4510 3 0x1.d8p6 0x1.4p2 +REG epsg:4510 4 0x1.0p7 0x1.4p2 +REG epsg:4511 0 0x1.02p7 0x0.0p0 +REG epsg:4511 1 0x1.fp6 -0x1.4p2 +REG epsg:4511 2 0x1.0cp7 -0x1.4p2 +REG epsg:4511 3 0x1.fp6 0x1.4p2 +REG epsg:4511 4 0x1.0cp7 0x1.4p2 +REG epsg:4512 0 0x1.0ep7 0x0.0p0 +REG epsg:4512 1 0x1.04p7 -0x1.4p2 +REG epsg:4512 2 0x1.18p7 -0x1.4p2 +REG epsg:4512 3 0x1.04p7 0x1.4p2 +REG epsg:4512 4 0x1.18p7 0x1.4p2 +REG epsg:4513 0 0x1.2cp6 0x0.0p0 +REG epsg:4513 1 0x1.18p6 -0x1.4p2 +REG epsg:4513 2 0x1.4p6 -0x1.4p2 +REG epsg:4513 3 0x1.18p6 0x1.4p2 +REG epsg:4513 4 0x1.4p6 0x1.4p2 +REG epsg:4514 0 0x1.38p6 0x0.0p0 +REG epsg:4514 1 0x1.24p6 -0x1.4p2 +REG epsg:4514 2 0x1.4cp6 -0x1.4p2 +REG epsg:4514 3 0x1.24p6 0x1.4p2 +REG epsg:4514 4 0x1.4cp6 0x1.4p2 +REG epsg:4515 0 0x1.44p6 0x0.0p0 +REG epsg:4515 1 0x1.3p6 -0x1.4p2 +REG epsg:4515 2 0x1.58p6 -0x1.4p2 +REG epsg:4515 3 0x1.3p6 0x1.4p2 +REG epsg:4515 4 0x1.58p6 0x1.4p2 +REG epsg:4516 0 0x1.5p6 0x0.0p0 +REG epsg:4516 1 0x1.3cp6 -0x1.4p2 +REG epsg:4516 2 0x1.64p6 -0x1.4p2 +REG epsg:4516 3 0x1.3cp6 0x1.4p2 +REG epsg:4516 4 0x1.64p6 0x1.4p2 +REG epsg:4517 0 0x1.5cp6 0x0.0p0 +REG epsg:4517 1 0x1.48p6 -0x1.4p2 +REG epsg:4517 2 0x1.7p6 -0x1.4p2 +REG epsg:4517 3 0x1.48p6 0x1.4p2 +REG epsg:4517 4 0x1.7p6 0x1.4p2 +REG epsg:4518 0 0x1.68p6 0x0.0p0 +REG epsg:4518 1 0x1.54p6 -0x1.4p2 +REG epsg:4518 2 0x1.7cp6 -0x1.4p2 +REG epsg:4518 3 0x1.54p6 0x1.4p2 +REG epsg:4518 4 0x1.7cp6 0x1.4p2 +REG epsg:4519 0 0x1.74p6 0x0.0p0 +REG epsg:4519 1 0x1.6p6 -0x1.4p2 +REG epsg:4519 2 0x1.88p6 -0x1.4p2 +REG epsg:4519 3 0x1.6p6 0x1.4p2 +REG epsg:4519 4 0x1.88p6 0x1.4p2 +REG epsg:4520 0 0x1.8p6 0x0.0p0 +REG epsg:4520 1 0x1.6cp6 -0x1.4p2 +REG epsg:4520 2 0x1.94p6 -0x1.4p2 +REG epsg:4520 3 0x1.6cp6 0x1.4p2 +REG epsg:4520 4 0x1.94p6 0x1.4p2 +REG epsg:4521 0 0x1.8cp6 0x0.0p0 +REG epsg:4521 1 0x1.78p6 -0x1.4p2 +REG epsg:4521 2 0x1.ap6 -0x1.4p2 +REG epsg:4521 3 0x1.78p6 0x1.4p2 +REG epsg:4521 4 0x1.ap6 0x1.4p2 +REG epsg:4522 0 0x1.98p6 0x0.0p0 +REG epsg:4522 1 0x1.84p6 -0x1.4p2 +REG epsg:4522 2 0x1.acp6 -0x1.4p2 +REG epsg:4522 3 0x1.84p6 0x1.4p2 +REG epsg:4522 4 0x1.acp6 0x1.4p2 +REG epsg:4523 0 0x1.a4p6 0x0.0p0 +REG epsg:4523 1 0x1.9p6 -0x1.4p2 +REG epsg:4523 2 0x1.b8p6 -0x1.4p2 +REG epsg:4523 3 0x1.9p6 0x1.4p2 +REG epsg:4523 4 0x1.b8p6 0x1.4p2 +REG epsg:4524 0 0x1.bp6 0x0.0p0 +REG epsg:4524 1 0x1.9cp6 -0x1.4p2 +REG epsg:4524 2 0x1.c4p6 -0x1.4p2 +REG epsg:4524 3 0x1.9cp6 0x1.4p2 +REG epsg:4524 4 0x1.c4p6 0x1.4p2 +REG epsg:4525 0 0x1.bcp6 0x0.0p0 +REG epsg:4525 1 0x1.a8p6 -0x1.4p2 +REG epsg:4525 2 0x1.dp6 -0x1.4p2 +REG epsg:4525 3 0x1.a8p6 0x1.4p2 +REG epsg:4525 4 0x1.dp6 0x1.4p2 +REG epsg:4526 0 0x1.c8p6 0x0.0p0 +REG epsg:4526 1 0x1.b4p6 -0x1.4p2 +REG epsg:4526 2 0x1.dcp6 -0x1.4p2 +REG epsg:4526 3 0x1.b4p6 0x1.4p2 +REG epsg:4526 4 0x1.dcp6 0x1.4p2 +REG epsg:4527 0 0x1.d4p6 0x0.0p0 +REG epsg:4527 1 0x1.cp6 -0x1.4p2 +REG epsg:4527 2 0x1.e8p6 -0x1.4p2 +REG epsg:4527 3 0x1.cp6 0x1.4p2 +REG epsg:4527 4 0x1.e8p6 0x1.4p2 +REG epsg:4528 0 0x1.ep6 0x0.0p0 +REG epsg:4528 1 0x1.ccp6 -0x1.4p2 +REG epsg:4528 2 0x1.f4p6 -0x1.4p2 +REG epsg:4528 3 0x1.ccp6 0x1.4p2 +REG epsg:4528 4 0x1.f4p6 0x1.4p2 +REG epsg:4529 0 0x1.ecp6 0x0.0p0 +REG epsg:4529 1 0x1.d8p6 -0x1.4p2 +REG epsg:4529 2 0x1.0p7 -0x1.4p2 +REG epsg:4529 3 0x1.d8p6 0x1.4p2 +REG epsg:4529 4 0x1.0p7 0x1.4p2 +REG epsg:4530 0 0x1.f8p6 0x0.0p0 +REG epsg:4530 1 0x1.e4p6 -0x1.4p2 +REG epsg:4530 2 0x1.06p7 -0x1.4p2 +REG epsg:4530 3 0x1.e4p6 0x1.4p2 +REG epsg:4530 4 0x1.06p7 0x1.4p2 +REG epsg:4531 0 0x1.02p7 0x0.0p0 +REG epsg:4531 1 0x1.fp6 -0x1.4p2 +REG epsg:4531 2 0x1.0cp7 -0x1.4p2 +REG epsg:4531 3 0x1.fp6 0x1.4p2 +REG epsg:4531 4 0x1.0cp7 0x1.4p2 +REG epsg:4532 0 0x1.08p7 0x0.0p0 +REG epsg:4532 1 0x1.fcp6 -0x1.4p2 +REG epsg:4532 2 0x1.12p7 -0x1.4p2 +REG epsg:4532 3 0x1.fcp6 0x1.4p2 +REG epsg:4532 4 0x1.12p7 0x1.4p2 +REG epsg:4533 0 0x1.0ep7 0x0.0p0 +REG epsg:4533 1 0x1.04p7 -0x1.4p2 +REG epsg:4533 2 0x1.18p7 -0x1.4p2 +REG epsg:4533 3 0x1.04p7 0x1.4p2 +REG epsg:4533 4 0x1.18p7 0x1.4p2 +REG epsg:4534 0 0x1.2cp6 0x0.0p0 +REG epsg:4534 1 0x1.18p6 -0x1.4p2 +REG epsg:4534 2 0x1.4p6 -0x1.4p2 +REG epsg:4534 3 0x1.18p6 0x1.4p2 +REG epsg:4534 4 0x1.4p6 0x1.4p2 +REG epsg:4535 0 0x1.38p6 0x0.0p0 +REG epsg:4535 1 0x1.24p6 -0x1.4p2 +REG epsg:4535 2 0x1.4cp6 -0x1.4p2 +REG epsg:4535 3 0x1.24p6 0x1.4p2 +REG epsg:4535 4 0x1.4cp6 0x1.4p2 +REG epsg:4536 0 0x1.44p6 0x0.0p0 +REG epsg:4536 1 0x1.3p6 -0x1.4p2 +REG epsg:4536 2 0x1.58p6 -0x1.4p2 +REG epsg:4536 3 0x1.3p6 0x1.4p2 +REG epsg:4536 4 0x1.58p6 0x1.4p2 +REG epsg:4537 0 0x1.5p6 0x0.0p0 +REG epsg:4537 1 0x1.3cp6 -0x1.4p2 +REG epsg:4537 2 0x1.64p6 -0x1.4p2 +REG epsg:4537 3 0x1.3cp6 0x1.4p2 +REG epsg:4537 4 0x1.64p6 0x1.4p2 +REG epsg:4538 0 0x1.5cp6 0x0.0p0 +REG epsg:4538 1 0x1.48p6 -0x1.4p2 +REG epsg:4538 2 0x1.7p6 -0x1.4p2 +REG epsg:4538 3 0x1.48p6 0x1.4p2 +REG epsg:4538 4 0x1.7p6 0x1.4p2 +REG epsg:4539 0 0x1.68p6 0x0.0p0 +REG epsg:4539 1 0x1.54p6 -0x1.4p2 +REG epsg:4539 2 0x1.7cp6 -0x1.4p2 +REG epsg:4539 3 0x1.54p6 0x1.4p2 +REG epsg:4539 4 0x1.7cp6 0x1.4p2 +REG epsg:4540 0 0x1.74p6 0x0.0p0 +REG epsg:4540 1 0x1.6p6 -0x1.4p2 +REG epsg:4540 2 0x1.88p6 -0x1.4p2 +REG epsg:4540 3 0x1.6p6 0x1.4p2 +REG epsg:4540 4 0x1.88p6 0x1.4p2 +REG epsg:4541 0 0x1.8p6 0x0.0p0 +REG epsg:4541 1 0x1.6cp6 -0x1.4p2 +REG epsg:4541 2 0x1.94p6 -0x1.4p2 +REG epsg:4541 3 0x1.6cp6 0x1.4p2 +REG epsg:4541 4 0x1.94p6 0x1.4p2 +REG epsg:4542 0 0x1.8cp6 0x0.0p0 +REG epsg:4542 1 0x1.78p6 -0x1.4p2 +REG epsg:4542 2 0x1.ap6 -0x1.4p2 +REG epsg:4542 3 0x1.78p6 0x1.4p2 +REG epsg:4542 4 0x1.ap6 0x1.4p2 +REG epsg:4543 0 0x1.98p6 0x0.0p0 +REG epsg:4543 1 0x1.84p6 -0x1.4p2 +REG epsg:4543 2 0x1.acp6 -0x1.4p2 +REG epsg:4543 3 0x1.84p6 0x1.4p2 +REG epsg:4543 4 0x1.acp6 0x1.4p2 +REG epsg:4544 0 0x1.a4p6 0x0.0p0 +REG epsg:4544 1 0x1.9p6 -0x1.4p2 +REG epsg:4544 2 0x1.b8p6 -0x1.4p2 +REG epsg:4544 3 0x1.9p6 0x1.4p2 +REG epsg:4544 4 0x1.b8p6 0x1.4p2 +REG epsg:4545 0 0x1.bp6 0x0.0p0 +REG epsg:4545 1 0x1.9cp6 -0x1.4p2 +REG epsg:4545 2 0x1.c4p6 -0x1.4p2 +REG epsg:4545 3 0x1.9cp6 0x1.4p2 +REG epsg:4545 4 0x1.c4p6 0x1.4p2 +REG epsg:4546 0 0x1.bcp6 0x0.0p0 +REG epsg:4546 1 0x1.a8p6 -0x1.4p2 +REG epsg:4546 2 0x1.dp6 -0x1.4p2 +REG epsg:4546 3 0x1.a8p6 0x1.4p2 +REG epsg:4546 4 0x1.dp6 0x1.4p2 +REG epsg:4547 0 0x1.c8p6 0x0.0p0 +REG epsg:4547 1 0x1.b4p6 -0x1.4p2 +REG epsg:4547 2 0x1.dcp6 -0x1.4p2 +REG epsg:4547 3 0x1.b4p6 0x1.4p2 +REG epsg:4547 4 0x1.dcp6 0x1.4p2 +REG epsg:4548 0 0x1.d4p6 0x0.0p0 +REG epsg:4548 1 0x1.cp6 -0x1.4p2 +REG epsg:4548 2 0x1.e8p6 -0x1.4p2 +REG epsg:4548 3 0x1.cp6 0x1.4p2 +REG epsg:4548 4 0x1.e8p6 0x1.4p2 +REG epsg:4549 0 0x1.ep6 0x0.0p0 +REG epsg:4549 1 0x1.ccp6 -0x1.4p2 +REG epsg:4549 2 0x1.f4p6 -0x1.4p2 +REG epsg:4549 3 0x1.ccp6 0x1.4p2 +REG epsg:4549 4 0x1.f4p6 0x1.4p2 +REG epsg:4550 0 0x1.ecp6 0x0.0p0 +REG epsg:4550 1 0x1.d8p6 -0x1.4p2 +REG epsg:4550 2 0x1.0p7 -0x1.4p2 +REG epsg:4550 3 0x1.d8p6 0x1.4p2 +REG epsg:4550 4 0x1.0p7 0x1.4p2 +REG epsg:4551 0 0x1.f8p6 0x0.0p0 +REG epsg:4551 1 0x1.e4p6 -0x1.4p2 +REG epsg:4551 2 0x1.06p7 -0x1.4p2 +REG epsg:4551 3 0x1.e4p6 0x1.4p2 +REG epsg:4551 4 0x1.06p7 0x1.4p2 +REG epsg:4552 0 0x1.02p7 0x0.0p0 +REG epsg:4552 1 0x1.fp6 -0x1.4p2 +REG epsg:4552 2 0x1.0cp7 -0x1.4p2 +REG epsg:4552 3 0x1.fp6 0x1.4p2 +REG epsg:4552 4 0x1.0cp7 0x1.4p2 +REG epsg:4553 0 0x1.08p7 0x0.0p0 +REG epsg:4553 1 0x1.fcp6 -0x1.4p2 +REG epsg:4553 2 0x1.12p7 -0x1.4p2 +REG epsg:4553 3 0x1.fcp6 0x1.4p2 +REG epsg:4553 4 0x1.12p7 0x1.4p2 +REG epsg:4554 0 0x1.0ep7 0x0.0p0 +REG epsg:4554 1 0x1.04p7 -0x1.4p2 +REG epsg:4554 2 0x1.18p7 -0x1.4p2 +REG epsg:4554 3 0x1.04p7 0x1.4p2 +REG epsg:4554 4 0x1.18p7 0x1.4p2 +REG epsg:4555 0 0x0.0p0 0x0.0p0 +REG epsg:4555 1 -0x1.4p2 -0x1.4p2 +REG epsg:4555 2 0x1.4p2 -0x1.4p2 +REG epsg:4555 3 -0x1.4p2 0x1.4p2 +REG epsg:4555 4 0x1.4p2 0x1.4p2 +REG epsg:4556 0 0x0.0p0 0x0.0p0 +REG epsg:4556 1 -0x1.4p2 -0x1.4p2 +REG epsg:4556 2 0x1.4p2 -0x1.4p2 +REG epsg:4556 3 -0x1.4p2 0x1.4p2 +REG epsg:4556 4 0x1.4p2 0x1.4p2 +REG epsg:4558 0 0x0.0p0 0x0.0p0 +REG epsg:4558 1 -0x1.4p2 -0x1.4p2 +REG epsg:4558 2 0x1.4p2 -0x1.4p2 +REG epsg:4558 3 -0x1.4p2 0x1.4p2 +REG epsg:4558 4 0x1.4p2 0x1.4p2 +REG epsg:4559 0 -0x1.f8p5 0x0.0p0 +REG epsg:4559 1 -0x1.1p6 -0x1.4p2 +REG epsg:4559 2 -0x1.dp5 -0x1.4p2 +REG epsg:4559 3 -0x1.1p6 0x1.4p2 +REG epsg:4559 4 -0x1.dp5 0x1.4p2 +REG epsg:4568 0 0x1.2cp6 0x0.0p0 +REG epsg:4568 1 0x1.18p6 -0x1.4p2 +REG epsg:4568 2 0x1.4p6 -0x1.4p2 +REG epsg:4568 3 0x1.18p6 0x1.4p2 +REG epsg:4568 4 0x1.4p6 0x1.4p2 +REG epsg:4569 0 0x1.44p6 0x0.0p0 +REG epsg:4569 1 0x1.3p6 -0x1.4p2 +REG epsg:4569 2 0x1.58p6 -0x1.4p2 +REG epsg:4569 3 0x1.3p6 0x1.4p2 +REG epsg:4569 4 0x1.58p6 0x1.4p2 +REG epsg:4570 0 0x1.5cp6 0x0.0p0 +REG epsg:4570 1 0x1.48p6 -0x1.4p2 +REG epsg:4570 2 0x1.7p6 -0x1.4p2 +REG epsg:4570 3 0x1.48p6 0x1.4p2 +REG epsg:4570 4 0x1.7p6 0x1.4p2 +REG epsg:4571 0 0x1.74p6 0x0.0p0 +REG epsg:4571 1 0x1.6p6 -0x1.4p2 +REG epsg:4571 2 0x1.88p6 -0x1.4p2 +REG epsg:4571 3 0x1.6p6 0x1.4p2 +REG epsg:4571 4 0x1.88p6 0x1.4p2 +REG epsg:4572 0 0x1.8cp6 0x0.0p0 +REG epsg:4572 1 0x1.78p6 -0x1.4p2 +REG epsg:4572 2 0x1.ap6 -0x1.4p2 +REG epsg:4572 3 0x1.78p6 0x1.4p2 +REG epsg:4572 4 0x1.ap6 0x1.4p2 +REG epsg:4573 0 0x1.a4p6 0x0.0p0 +REG epsg:4573 1 0x1.9p6 -0x1.4p2 +REG epsg:4573 2 0x1.b8p6 -0x1.4p2 +REG epsg:4573 3 0x1.9p6 0x1.4p2 +REG epsg:4573 4 0x1.b8p6 0x1.4p2 +REG epsg:4574 0 0x1.bcp6 0x0.0p0 +REG epsg:4574 1 0x1.a8p6 -0x1.4p2 +REG epsg:4574 2 0x1.dp6 -0x1.4p2 +REG epsg:4574 3 0x1.a8p6 0x1.4p2 +REG epsg:4574 4 0x1.dp6 0x1.4p2 +REG epsg:4575 0 0x1.d4p6 0x0.0p0 +REG epsg:4575 1 0x1.cp6 -0x1.4p2 +REG epsg:4575 2 0x1.e8p6 -0x1.4p2 +REG epsg:4575 3 0x1.cp6 0x1.4p2 +REG epsg:4575 4 0x1.e8p6 0x1.4p2 +REG epsg:4576 0 0x1.ecp6 0x0.0p0 +REG epsg:4576 1 0x1.d8p6 -0x1.4p2 +REG epsg:4576 2 0x1.0p7 -0x1.4p2 +REG epsg:4576 3 0x1.d8p6 0x1.4p2 +REG epsg:4576 4 0x1.0p7 0x1.4p2 +REG epsg:4577 0 0x1.02p7 0x0.0p0 +REG epsg:4577 1 0x1.fp6 -0x1.4p2 +REG epsg:4577 2 0x1.0cp7 -0x1.4p2 +REG epsg:4577 3 0x1.fp6 0x1.4p2 +REG epsg:4577 4 0x1.0cp7 0x1.4p2 +REG epsg:4578 0 0x1.0ep7 0x0.0p0 +REG epsg:4578 1 0x1.04p7 -0x1.4p2 +REG epsg:4578 2 0x1.18p7 -0x1.4p2 +REG epsg:4578 3 0x1.04p7 0x1.4p2 +REG epsg:4578 4 0x1.18p7 0x1.4p2 +REG epsg:4579 0 0x1.2cp6 0x0.0p0 +REG epsg:4579 1 0x1.18p6 -0x1.4p2 +REG epsg:4579 2 0x1.4p6 -0x1.4p2 +REG epsg:4579 3 0x1.18p6 0x1.4p2 +REG epsg:4579 4 0x1.4p6 0x1.4p2 +REG epsg:4580 0 0x1.44p6 0x0.0p0 +REG epsg:4580 1 0x1.3p6 -0x1.4p2 +REG epsg:4580 2 0x1.58p6 -0x1.4p2 +REG epsg:4580 3 0x1.3p6 0x1.4p2 +REG epsg:4580 4 0x1.58p6 0x1.4p2 +REG epsg:4581 0 0x1.5cp6 0x0.0p0 +REG epsg:4581 1 0x1.48p6 -0x1.4p2 +REG epsg:4581 2 0x1.7p6 -0x1.4p2 +REG epsg:4581 3 0x1.48p6 0x1.4p2 +REG epsg:4581 4 0x1.7p6 0x1.4p2 +REG epsg:4582 0 0x1.74p6 0x0.0p0 +REG epsg:4582 1 0x1.6p6 -0x1.4p2 +REG epsg:4582 2 0x1.88p6 -0x1.4p2 +REG epsg:4582 3 0x1.6p6 0x1.4p2 +REG epsg:4582 4 0x1.88p6 0x1.4p2 +REG epsg:4583 0 0x1.8cp6 0x0.0p0 +REG epsg:4583 1 0x1.78p6 -0x1.4p2 +REG epsg:4583 2 0x1.ap6 -0x1.4p2 +REG epsg:4583 3 0x1.78p6 0x1.4p2 +REG epsg:4583 4 0x1.ap6 0x1.4p2 +REG epsg:4584 0 0x1.a4p6 0x0.0p0 +REG epsg:4584 1 0x1.9p6 -0x1.4p2 +REG epsg:4584 2 0x1.b8p6 -0x1.4p2 +REG epsg:4584 3 0x1.9p6 0x1.4p2 +REG epsg:4584 4 0x1.b8p6 0x1.4p2 +REG epsg:4585 0 0x1.bcp6 0x0.0p0 +REG epsg:4585 1 0x1.a8p6 -0x1.4p2 +REG epsg:4585 2 0x1.dp6 -0x1.4p2 +REG epsg:4585 3 0x1.a8p6 0x1.4p2 +REG epsg:4585 4 0x1.dp6 0x1.4p2 +REG epsg:4586 0 0x1.d4p6 0x0.0p0 +REG epsg:4586 1 0x1.cp6 -0x1.4p2 +REG epsg:4586 2 0x1.e8p6 -0x1.4p2 +REG epsg:4586 3 0x1.cp6 0x1.4p2 +REG epsg:4586 4 0x1.e8p6 0x1.4p2 +REG epsg:4587 0 0x1.ecp6 0x0.0p0 +REG epsg:4587 1 0x1.d8p6 -0x1.4p2 +REG epsg:4587 2 0x1.0p7 -0x1.4p2 +REG epsg:4587 3 0x1.d8p6 0x1.4p2 +REG epsg:4587 4 0x1.0p7 0x1.4p2 +REG epsg:4588 0 0x1.02p7 0x0.0p0 +REG epsg:4588 1 0x1.fp6 -0x1.4p2 +REG epsg:4588 2 0x1.0cp7 -0x1.4p2 +REG epsg:4588 3 0x1.fp6 0x1.4p2 +REG epsg:4588 4 0x1.0cp7 0x1.4p2 +REG epsg:4589 0 0x1.0ep7 0x0.0p0 +REG epsg:4589 1 0x1.04p7 -0x1.4p2 +REG epsg:4589 2 0x1.18p7 -0x1.4p2 +REG epsg:4589 3 0x1.04p7 0x1.4p2 +REG epsg:4589 4 0x1.18p7 0x1.4p2 +REG epsg:4600 0 0x0.0p0 0x0.0p0 +REG epsg:4600 1 -0x1.4p2 -0x1.4p2 +REG epsg:4600 2 0x1.4p2 -0x1.4p2 +REG epsg:4600 3 -0x1.4p2 0x1.4p2 +REG epsg:4600 4 0x1.4p2 0x1.4p2 +REG epsg:4601 0 0x0.0p0 0x0.0p0 +REG epsg:4601 1 -0x1.4p2 -0x1.4p2 +REG epsg:4601 2 0x1.4p2 -0x1.4p2 +REG epsg:4601 3 -0x1.4p2 0x1.4p2 +REG epsg:4601 4 0x1.4p2 0x1.4p2 +REG epsg:4602 0 0x0.0p0 0x0.0p0 +REG epsg:4602 1 -0x1.4p2 -0x1.4p2 +REG epsg:4602 2 0x1.4p2 -0x1.4p2 +REG epsg:4602 3 -0x1.4p2 0x1.4p2 +REG epsg:4602 4 0x1.4p2 0x1.4p2 +REG epsg:4603 0 0x0.0p0 0x0.0p0 +REG epsg:4603 1 -0x1.4p2 -0x1.4p2 +REG epsg:4603 2 0x1.4p2 -0x1.4p2 +REG epsg:4603 3 -0x1.4p2 0x1.4p2 +REG epsg:4603 4 0x1.4p2 0x1.4p2 +REG epsg:4604 0 0x0.0p0 0x0.0p0 +REG epsg:4604 1 -0x1.4p2 -0x1.4p2 +REG epsg:4604 2 0x1.4p2 -0x1.4p2 +REG epsg:4604 3 -0x1.4p2 0x1.4p2 +REG epsg:4604 4 0x1.4p2 0x1.4p2 +REG epsg:4605 0 0x0.0p0 0x0.0p0 +REG epsg:4605 1 -0x1.4p2 -0x1.4p2 +REG epsg:4605 2 0x1.4p2 -0x1.4p2 +REG epsg:4605 3 -0x1.4p2 0x1.4p2 +REG epsg:4605 4 0x1.4p2 0x1.4p2 +REG epsg:4606 0 0x0.0p0 0x0.0p0 +REG epsg:4606 1 -0x1.4p2 -0x1.4p2 +REG epsg:4606 2 0x1.4p2 -0x1.4p2 +REG epsg:4606 3 -0x1.4p2 0x1.4p2 +REG epsg:4606 4 0x1.4p2 0x1.4p2 +REG epsg:4607 0 0x0.0p0 0x0.0p0 +REG epsg:4607 1 -0x1.4p2 -0x1.4p2 +REG epsg:4607 2 0x1.4p2 -0x1.4p2 +REG epsg:4607 3 -0x1.4p2 0x1.4p2 +REG epsg:4607 4 0x1.4p2 0x1.4p2 +REG epsg:4608 0 0x0.0p0 0x0.0p0 +REG epsg:4608 1 -0x1.4p2 -0x1.4p2 +REG epsg:4608 2 0x1.4p2 -0x1.4p2 +REG epsg:4608 3 -0x1.4p2 0x1.4p2 +REG epsg:4608 4 0x1.4p2 0x1.4p2 +REG epsg:4609 0 0x0.0p0 0x0.0p0 +REG epsg:4609 1 -0x1.4p2 -0x1.4p2 +REG epsg:4609 2 0x1.4p2 -0x1.4p2 +REG epsg:4609 3 -0x1.4p2 0x1.4p2 +REG epsg:4609 4 0x1.4p2 0x1.4p2 +REG epsg:4610 0 0x0.0p0 0x0.0p0 +REG epsg:4610 1 -0x1.4p2 -0x1.4p2 +REG epsg:4610 2 0x1.4p2 -0x1.4p2 +REG epsg:4610 3 -0x1.4p2 0x1.4p2 +REG epsg:4610 4 0x1.4p2 0x1.4p2 +REG epsg:4611 0 0x0.0p0 0x0.0p0 +REG epsg:4611 1 -0x1.4p2 -0x1.4p2 +REG epsg:4611 2 0x1.4p2 -0x1.4p2 +REG epsg:4611 3 -0x1.4p2 0x1.4p2 +REG epsg:4611 4 0x1.4p2 0x1.4p2 +REG epsg:4612 0 0x0.0p0 0x0.0p0 +REG epsg:4612 1 -0x1.4p2 -0x1.4p2 +REG epsg:4612 2 0x1.4p2 -0x1.4p2 +REG epsg:4612 3 -0x1.4p2 0x1.4p2 +REG epsg:4612 4 0x1.4p2 0x1.4p2 +REG epsg:4613 0 0x0.0p0 0x0.0p0 +REG epsg:4613 1 -0x1.4p2 -0x1.4p2 +REG epsg:4613 2 0x1.4p2 -0x1.4p2 +REG epsg:4613 3 -0x1.4p2 0x1.4p2 +REG epsg:4613 4 0x1.4p2 0x1.4p2 +REG epsg:4614 0 0x0.0p0 0x0.0p0 +REG epsg:4614 1 -0x1.4p2 -0x1.4p2 +REG epsg:4614 2 0x1.4p2 -0x1.4p2 +REG epsg:4614 3 -0x1.4p2 0x1.4p2 +REG epsg:4614 4 0x1.4p2 0x1.4p2 +REG epsg:4615 0 0x0.0p0 0x0.0p0 +REG epsg:4615 1 -0x1.4p2 -0x1.4p2 +REG epsg:4615 2 0x1.4p2 -0x1.4p2 +REG epsg:4615 3 -0x1.4p2 0x1.4p2 +REG epsg:4615 4 0x1.4p2 0x1.4p2 +REG epsg:4616 0 0x0.0p0 0x0.0p0 +REG epsg:4616 1 -0x1.4p2 -0x1.4p2 +REG epsg:4616 2 0x1.4p2 -0x1.4p2 +REG epsg:4616 3 -0x1.4p2 0x1.4p2 +REG epsg:4616 4 0x1.4p2 0x1.4p2 +REG epsg:4617 0 0x0.0p0 0x0.0p0 +REG epsg:4617 1 -0x1.4p2 -0x1.4p2 +REG epsg:4617 2 0x1.4p2 -0x1.4p2 +REG epsg:4617 3 -0x1.4p2 0x1.4p2 +REG epsg:4617 4 0x1.4p2 0x1.4p2 +REG epsg:4618 0 0x0.0p0 0x0.0p0 +REG epsg:4618 1 -0x1.4p2 -0x1.4p2 +REG epsg:4618 2 0x1.4p2 -0x1.4p2 +REG epsg:4618 3 -0x1.4p2 0x1.4p2 +REG epsg:4618 4 0x1.4p2 0x1.4p2 +REG epsg:4619 0 0x0.0p0 0x0.0p0 +REG epsg:4619 1 -0x1.4p2 -0x1.4p2 +REG epsg:4619 2 0x1.4p2 -0x1.4p2 +REG epsg:4619 3 -0x1.4p2 0x1.4p2 +REG epsg:4619 4 0x1.4p2 0x1.4p2 +REG epsg:4620 0 0x0.0p0 0x0.0p0 +REG epsg:4620 1 -0x1.4p2 -0x1.4p2 +REG epsg:4620 2 0x1.4p2 -0x1.4p2 +REG epsg:4620 3 -0x1.4p2 0x1.4p2 +REG epsg:4620 4 0x1.4p2 0x1.4p2 +REG epsg:4621 0 0x0.0p0 0x0.0p0 +REG epsg:4621 1 -0x1.4p2 -0x1.4p2 +REG epsg:4621 2 0x1.4p2 -0x1.4p2 +REG epsg:4621 3 -0x1.4p2 0x1.4p2 +REG epsg:4621 4 0x1.4p2 0x1.4p2 +REG epsg:4622 0 0x0.0p0 0x0.0p0 +REG epsg:4622 1 -0x1.4p2 -0x1.4p2 +REG epsg:4622 2 0x1.4p2 -0x1.4p2 +REG epsg:4622 3 -0x1.4p2 0x1.4p2 +REG epsg:4622 4 0x1.4p2 0x1.4p2 +REG epsg:4623 0 0x0.0p0 0x0.0p0 +REG epsg:4623 1 -0x1.4p2 -0x1.4p2 +REG epsg:4623 2 0x1.4p2 -0x1.4p2 +REG epsg:4623 3 -0x1.4p2 0x1.4p2 +REG epsg:4623 4 0x1.4p2 0x1.4p2 +REG epsg:4624 0 0x0.0p0 0x0.0p0 +REG epsg:4624 1 -0x1.4p2 -0x1.4p2 +REG epsg:4624 2 0x1.4p2 -0x1.4p2 +REG epsg:4624 3 -0x1.4p2 0x1.4p2 +REG epsg:4624 4 0x1.4p2 0x1.4p2 +REG epsg:4625 0 0x0.0p0 0x0.0p0 +REG epsg:4625 1 -0x1.4p2 -0x1.4p2 +REG epsg:4625 2 0x1.4p2 -0x1.4p2 +REG epsg:4625 3 -0x1.4p2 0x1.4p2 +REG epsg:4625 4 0x1.4p2 0x1.4p2 +REG epsg:4626 0 0x0.0p0 0x0.0p0 +REG epsg:4626 1 -0x1.4p2 -0x1.4p2 +REG epsg:4626 2 0x1.4p2 -0x1.4p2 +REG epsg:4626 3 -0x1.4p2 0x1.4p2 +REG epsg:4626 4 0x1.4p2 0x1.4p2 +REG epsg:4627 0 0x0.0p0 0x0.0p0 +REG epsg:4627 1 -0x1.4p2 -0x1.4p2 +REG epsg:4627 2 0x1.4p2 -0x1.4p2 +REG epsg:4627 3 -0x1.4p2 0x1.4p2 +REG epsg:4627 4 0x1.4p2 0x1.4p2 +REG epsg:4628 0 0x0.0p0 0x0.0p0 +REG epsg:4628 1 -0x1.4p2 -0x1.4p2 +REG epsg:4628 2 0x1.4p2 -0x1.4p2 +REG epsg:4628 3 -0x1.4p2 0x1.4p2 +REG epsg:4628 4 0x1.4p2 0x1.4p2 +REG epsg:4629 0 0x0.0p0 0x0.0p0 +REG epsg:4629 1 -0x1.4p2 -0x1.4p2 +REG epsg:4629 2 0x1.4p2 -0x1.4p2 +REG epsg:4629 3 -0x1.4p2 0x1.4p2 +REG epsg:4629 4 0x1.4p2 0x1.4p2 +REG epsg:4630 0 0x0.0p0 0x0.0p0 +REG epsg:4630 1 -0x1.4p2 -0x1.4p2 +REG epsg:4630 2 0x1.4p2 -0x1.4p2 +REG epsg:4630 3 -0x1.4p2 0x1.4p2 +REG epsg:4630 4 0x1.4p2 0x1.4p2 +REG epsg:4631 0 0x0.0p0 0x0.0p0 +REG epsg:4631 1 -0x1.4p2 -0x1.4p2 +REG epsg:4631 2 0x1.4p2 -0x1.4p2 +REG epsg:4631 3 -0x1.4p2 0x1.4p2 +REG epsg:4631 4 0x1.4p2 0x1.4p2 +REG epsg:4632 0 0x0.0p0 0x0.0p0 +REG epsg:4632 1 -0x1.4p2 -0x1.4p2 +REG epsg:4632 2 0x1.4p2 -0x1.4p2 +REG epsg:4632 3 -0x1.4p2 0x1.4p2 +REG epsg:4632 4 0x1.4p2 0x1.4p2 +REG epsg:4633 0 0x0.0p0 0x0.0p0 +REG epsg:4633 1 -0x1.4p2 -0x1.4p2 +REG epsg:4633 2 0x1.4p2 -0x1.4p2 +REG epsg:4633 3 -0x1.4p2 0x1.4p2 +REG epsg:4633 4 0x1.4p2 0x1.4p2 +REG epsg:4634 0 0x0.0p0 0x0.0p0 +REG epsg:4634 1 -0x1.4p2 -0x1.4p2 +REG epsg:4634 2 0x1.4p2 -0x1.4p2 +REG epsg:4634 3 -0x1.4p2 0x1.4p2 +REG epsg:4634 4 0x1.4p2 0x1.4p2 +REG epsg:4635 0 0x0.0p0 0x0.0p0 +REG epsg:4635 1 -0x1.4p2 -0x1.4p2 +REG epsg:4635 2 0x1.4p2 -0x1.4p2 +REG epsg:4635 3 -0x1.4p2 0x1.4p2 +REG epsg:4635 4 0x1.4p2 0x1.4p2 +REG epsg:4636 0 0x0.0p0 0x0.0p0 +REG epsg:4636 1 -0x1.4p2 -0x1.4p2 +REG epsg:4636 2 0x1.4p2 -0x1.4p2 +REG epsg:4636 3 -0x1.4p2 0x1.4p2 +REG epsg:4636 4 0x1.4p2 0x1.4p2 +REG epsg:4637 0 0x0.0p0 0x0.0p0 +REG epsg:4637 1 -0x1.4p2 -0x1.4p2 +REG epsg:4637 2 0x1.4p2 -0x1.4p2 +REG epsg:4637 3 -0x1.4p2 0x1.4p2 +REG epsg:4637 4 0x1.4p2 0x1.4p2 +REG epsg:4638 0 0x0.0p0 0x0.0p0 +REG epsg:4638 1 -0x1.4p2 -0x1.4p2 +REG epsg:4638 2 0x1.4p2 -0x1.4p2 +REG epsg:4638 3 -0x1.4p2 0x1.4p2 +REG epsg:4638 4 0x1.4p2 0x1.4p2 +REG epsg:4639 0 0x0.0p0 0x0.0p0 +REG epsg:4639 1 -0x1.4p2 -0x1.4p2 +REG epsg:4639 2 0x1.4p2 -0x1.4p2 +REG epsg:4639 3 -0x1.4p2 0x1.4p2 +REG epsg:4639 4 0x1.4p2 0x1.4p2 +REG epsg:4640 0 0x0.0p0 0x0.0p0 +REG epsg:4640 1 -0x1.4p2 -0x1.4p2 +REG epsg:4640 2 0x1.4p2 -0x1.4p2 +REG epsg:4640 3 -0x1.4p2 0x1.4p2 +REG epsg:4640 4 0x1.4p2 0x1.4p2 +REG epsg:4641 0 0x0.0p0 0x0.0p0 +REG epsg:4641 1 -0x1.4p2 -0x1.4p2 +REG epsg:4641 2 0x1.4p2 -0x1.4p2 +REG epsg:4641 3 -0x1.4p2 0x1.4p2 +REG epsg:4641 4 0x1.4p2 0x1.4p2 +REG epsg:4642 0 0x0.0p0 0x0.0p0 +REG epsg:4642 1 -0x1.4p2 -0x1.4p2 +REG epsg:4642 2 0x1.4p2 -0x1.4p2 +REG epsg:4642 3 -0x1.4p2 0x1.4p2 +REG epsg:4642 4 0x1.4p2 0x1.4p2 +REG epsg:4643 0 0x0.0p0 0x0.0p0 +REG epsg:4643 1 -0x1.4p2 -0x1.4p2 +REG epsg:4643 2 0x1.4p2 -0x1.4p2 +REG epsg:4643 3 -0x1.4p2 0x1.4p2 +REG epsg:4643 4 0x1.4p2 0x1.4p2 +REG epsg:4644 0 0x0.0p0 0x0.0p0 +REG epsg:4644 1 -0x1.4p2 -0x1.4p2 +REG epsg:4644 2 0x1.4p2 -0x1.4p2 +REG epsg:4644 3 -0x1.4p2 0x1.4p2 +REG epsg:4644 4 0x1.4p2 0x1.4p2 +REG epsg:4645 0 0x0.0p0 0x0.0p0 +REG epsg:4645 1 -0x1.4p2 -0x1.4p2 +REG epsg:4645 2 0x1.4p2 -0x1.4p2 +REG epsg:4645 3 -0x1.4p2 0x1.4p2 +REG epsg:4645 4 0x1.4p2 0x1.4p2 +REG epsg:4646 0 0x0.0p0 0x0.0p0 +REG epsg:4646 1 -0x1.4p2 -0x1.4p2 +REG epsg:4646 2 0x1.4p2 -0x1.4p2 +REG epsg:4646 3 -0x1.4p2 0x1.4p2 +REG epsg:4646 4 0x1.4p2 0x1.4p2 +REG epsg:4647 0 0x1.2p3 0x0.0p0 +REG epsg:4647 1 0x1.0p2 -0x1.4p2 +REG epsg:4647 2 0x1.cp3 -0x1.4p2 +REG epsg:4647 3 0x1.0p2 0x1.4p2 +REG epsg:4647 4 0x1.cp3 0x1.4p2 +REG epsg:4652 0 0x1.2cp6 0x0.0p0 +REG epsg:4652 1 0x1.18p6 -0x1.4p2 +REG epsg:4652 2 0x1.4p6 -0x1.4p2 +REG epsg:4652 3 0x1.18p6 0x1.4p2 +REG epsg:4652 4 0x1.4p6 0x1.4p2 +REG epsg:4653 0 0x1.38p6 0x0.0p0 +REG epsg:4653 1 0x1.24p6 -0x1.4p2 +REG epsg:4653 2 0x1.4cp6 -0x1.4p2 +REG epsg:4653 3 0x1.24p6 0x1.4p2 +REG epsg:4653 4 0x1.4cp6 0x1.4p2 +REG epsg:4654 0 0x1.44p6 0x0.0p0 +REG epsg:4654 1 0x1.3p6 -0x1.4p2 +REG epsg:4654 2 0x1.58p6 -0x1.4p2 +REG epsg:4654 3 0x1.3p6 0x1.4p2 +REG epsg:4654 4 0x1.58p6 0x1.4p2 +REG epsg:4655 0 0x1.5p6 0x0.0p0 +REG epsg:4655 1 0x1.3cp6 -0x1.4p2 +REG epsg:4655 2 0x1.64p6 -0x1.4p2 +REG epsg:4655 3 0x1.3cp6 0x1.4p2 +REG epsg:4655 4 0x1.64p6 0x1.4p2 +REG epsg:4656 0 0x1.5cp6 0x0.0p0 +REG epsg:4656 1 0x1.48p6 -0x1.4p2 +REG epsg:4656 2 0x1.7p6 -0x1.4p2 +REG epsg:4656 3 0x1.48p6 0x1.4p2 +REG epsg:4656 4 0x1.7p6 0x1.4p2 +REG epsg:4657 0 0x0.0p0 0x0.0p0 +REG epsg:4657 1 -0x1.4p2 -0x1.4p2 +REG epsg:4657 2 0x1.4p2 -0x1.4p2 +REG epsg:4657 3 -0x1.4p2 0x1.4p2 +REG epsg:4657 4 0x1.4p2 0x1.4p2 +REG epsg:4658 0 0x0.0p0 0x0.0p0 +REG epsg:4658 1 -0x1.4p2 -0x1.4p2 +REG epsg:4658 2 0x1.4p2 -0x1.4p2 +REG epsg:4658 3 -0x1.4p2 0x1.4p2 +REG epsg:4658 4 0x1.4p2 0x1.4p2 +REG epsg:4659 0 0x0.0p0 0x0.0p0 +REG epsg:4659 1 -0x1.4p2 -0x1.4p2 +REG epsg:4659 2 0x1.4p2 -0x1.4p2 +REG epsg:4659 3 -0x1.4p2 0x1.4p2 +REG epsg:4659 4 0x1.4p2 0x1.4p2 +REG epsg:4660 0 0x0.0p0 0x0.0p0 +REG epsg:4660 1 -0x1.4p2 -0x1.4p2 +REG epsg:4660 2 0x1.4p2 -0x1.4p2 +REG epsg:4660 3 -0x1.4p2 0x1.4p2 +REG epsg:4660 4 0x1.4p2 0x1.4p2 +REG epsg:4661 0 0x0.0p0 0x0.0p0 +REG epsg:4661 1 -0x1.4p2 -0x1.4p2 +REG epsg:4661 2 0x1.4p2 -0x1.4p2 +REG epsg:4661 3 -0x1.4p2 0x1.4p2 +REG epsg:4661 4 0x1.4p2 0x1.4p2 +REG epsg:4662 0 0x0.0p0 0x0.0p0 +REG epsg:4662 1 -0x1.4p2 -0x1.4p2 +REG epsg:4662 2 0x1.4p2 -0x1.4p2 +REG epsg:4662 3 -0x1.4p2 0x1.4p2 +REG epsg:4662 4 0x1.4p2 0x1.4p2 +REG epsg:4663 0 0x0.0p0 0x0.0p0 +REG epsg:4663 1 -0x1.4p2 -0x1.4p2 +REG epsg:4663 2 0x1.4p2 -0x1.4p2 +REG epsg:4663 3 -0x1.4p2 0x1.4p2 +REG epsg:4663 4 0x1.4p2 0x1.4p2 +REG epsg:4664 0 0x0.0p0 0x0.0p0 +REG epsg:4664 1 -0x1.4p2 -0x1.4p2 +REG epsg:4664 2 0x1.4p2 -0x1.4p2 +REG epsg:4664 3 -0x1.4p2 0x1.4p2 +REG epsg:4664 4 0x1.4p2 0x1.4p2 +REG epsg:4665 0 0x0.0p0 0x0.0p0 +REG epsg:4665 1 -0x1.4p2 -0x1.4p2 +REG epsg:4665 2 0x1.4p2 -0x1.4p2 +REG epsg:4665 3 -0x1.4p2 0x1.4p2 +REG epsg:4665 4 0x1.4p2 0x1.4p2 +REG epsg:4666 0 0x0.0p0 0x0.0p0 +REG epsg:4666 1 -0x1.4p2 -0x1.4p2 +REG epsg:4666 2 0x1.4p2 -0x1.4p2 +REG epsg:4666 3 -0x1.4p2 0x1.4p2 +REG epsg:4666 4 0x1.4p2 0x1.4p2 +REG epsg:4667 0 0x0.0p0 0x0.0p0 +REG epsg:4667 1 -0x1.4p2 -0x1.4p2 +REG epsg:4667 2 0x1.4p2 -0x1.4p2 +REG epsg:4667 3 -0x1.4p2 0x1.4p2 +REG epsg:4667 4 0x1.4p2 0x1.4p2 +REG epsg:4668 0 0x0.0p0 0x0.0p0 +REG epsg:4668 1 -0x1.4p2 -0x1.4p2 +REG epsg:4668 2 0x1.4p2 -0x1.4p2 +REG epsg:4668 3 -0x1.4p2 0x1.4p2 +REG epsg:4668 4 0x1.4p2 0x1.4p2 +REG epsg:4669 0 0x0.0p0 0x0.0p0 +REG epsg:4669 1 -0x1.4p2 -0x1.4p2 +REG epsg:4669 2 0x1.4p2 -0x1.4p2 +REG epsg:4669 3 -0x1.4p2 0x1.4p2 +REG epsg:4669 4 0x1.4p2 0x1.4p2 +REG epsg:4670 0 0x0.0p0 0x0.0p0 +REG epsg:4670 1 -0x1.4p2 -0x1.4p2 +REG epsg:4670 2 0x1.4p2 -0x1.4p2 +REG epsg:4670 3 -0x1.4p2 0x1.4p2 +REG epsg:4670 4 0x1.4p2 0x1.4p2 +REG epsg:4671 0 0x0.0p0 0x0.0p0 +REG epsg:4671 1 -0x1.4p2 -0x1.4p2 +REG epsg:4671 2 0x1.4p2 -0x1.4p2 +REG epsg:4671 3 -0x1.4p2 0x1.4p2 +REG epsg:4671 4 0x1.4p2 0x1.4p2 +REG epsg:4672 0 0x0.0p0 0x0.0p0 +REG epsg:4672 1 -0x1.4p2 -0x1.4p2 +REG epsg:4672 2 0x1.4p2 -0x1.4p2 +REG epsg:4672 3 -0x1.4p2 0x1.4p2 +REG epsg:4672 4 0x1.4p2 0x1.4p2 +REG epsg:4673 0 0x0.0p0 0x0.0p0 +REG epsg:4673 1 -0x1.4p2 -0x1.4p2 +REG epsg:4673 2 0x1.4p2 -0x1.4p2 +REG epsg:4673 3 -0x1.4p2 0x1.4p2 +REG epsg:4673 4 0x1.4p2 0x1.4p2 +REG epsg:4674 0 0x0.0p0 0x0.0p0 +REG epsg:4674 1 -0x1.4p2 -0x1.4p2 +REG epsg:4674 2 0x1.4p2 -0x1.4p2 +REG epsg:4674 3 -0x1.4p2 0x1.4p2 +REG epsg:4674 4 0x1.4p2 0x1.4p2 +REG epsg:4675 0 0x0.0p0 0x0.0p0 +REG epsg:4675 1 -0x1.4p2 -0x1.4p2 +REG epsg:4675 2 0x1.4p2 -0x1.4p2 +REG epsg:4675 3 -0x1.4p2 0x1.4p2 +REG epsg:4675 4 0x1.4p2 0x1.4p2 +REG epsg:4676 0 0x0.0p0 0x0.0p0 +REG epsg:4676 1 -0x1.4p2 -0x1.4p2 +REG epsg:4676 2 0x1.4p2 -0x1.4p2 +REG epsg:4676 3 -0x1.4p2 0x1.4p2 +REG epsg:4676 4 0x1.4p2 0x1.4p2 +REG epsg:4677 0 0x0.0p0 0x0.0p0 +REG epsg:4677 1 -0x1.4p2 -0x1.4p2 +REG epsg:4677 2 0x1.4p2 -0x1.4p2 +REG epsg:4677 3 -0x1.4p2 0x1.4p2 +REG epsg:4677 4 0x1.4p2 0x1.4p2 +REG epsg:4678 0 0x0.0p0 0x0.0p0 +REG epsg:4678 1 -0x1.4p2 -0x1.4p2 +REG epsg:4678 2 0x1.4p2 -0x1.4p2 +REG epsg:4678 3 -0x1.4p2 0x1.4p2 +REG epsg:4678 4 0x1.4p2 0x1.4p2 +REG epsg:4679 0 0x0.0p0 0x0.0p0 +REG epsg:4679 1 -0x1.4p2 -0x1.4p2 +REG epsg:4679 2 0x1.4p2 -0x1.4p2 +REG epsg:4679 3 -0x1.4p2 0x1.4p2 +REG epsg:4679 4 0x1.4p2 0x1.4p2 +REG epsg:4680 0 0x0.0p0 0x0.0p0 +REG epsg:4680 1 -0x1.4p2 -0x1.4p2 +REG epsg:4680 2 0x1.4p2 -0x1.4p2 +REG epsg:4680 3 -0x1.4p2 0x1.4p2 +REG epsg:4680 4 0x1.4p2 0x1.4p2 +REG epsg:4681 0 0x0.0p0 0x0.0p0 +REG epsg:4681 1 -0x1.4p2 -0x1.4p2 +REG epsg:4681 2 0x1.4p2 -0x1.4p2 +REG epsg:4681 3 -0x1.4p2 0x1.4p2 +REG epsg:4681 4 0x1.4p2 0x1.4p2 +REG epsg:4682 0 0x0.0p0 0x0.0p0 +REG epsg:4682 1 -0x1.4p2 -0x1.4p2 +REG epsg:4682 2 0x1.4p2 -0x1.4p2 +REG epsg:4682 3 -0x1.4p2 0x1.4p2 +REG epsg:4682 4 0x1.4p2 0x1.4p2 +REG epsg:4683 0 0x0.0p0 0x0.0p0 +REG epsg:4683 1 -0x1.4p2 -0x1.4p2 +REG epsg:4683 2 0x1.4p2 -0x1.4p2 +REG epsg:4683 3 -0x1.4p2 0x1.4p2 +REG epsg:4683 4 0x1.4p2 0x1.4p2 +REG epsg:4684 0 0x0.0p0 0x0.0p0 +REG epsg:4684 1 -0x1.4p2 -0x1.4p2 +REG epsg:4684 2 0x1.4p2 -0x1.4p2 +REG epsg:4684 3 -0x1.4p2 0x1.4p2 +REG epsg:4684 4 0x1.4p2 0x1.4p2 +REG epsg:4685 0 0x0.0p0 0x0.0p0 +REG epsg:4685 1 -0x1.4p2 -0x1.4p2 +REG epsg:4685 2 0x1.4p2 -0x1.4p2 +REG epsg:4685 3 -0x1.4p2 0x1.4p2 +REG epsg:4685 4 0x1.4p2 0x1.4p2 +REG epsg:4686 0 0x0.0p0 0x0.0p0 +REG epsg:4686 1 -0x1.4p2 -0x1.4p2 +REG epsg:4686 2 0x1.4p2 -0x1.4p2 +REG epsg:4686 3 -0x1.4p2 0x1.4p2 +REG epsg:4686 4 0x1.4p2 0x1.4p2 +REG epsg:4687 0 0x0.0p0 0x0.0p0 +REG epsg:4687 1 -0x1.4p2 -0x1.4p2 +REG epsg:4687 2 0x1.4p2 -0x1.4p2 +REG epsg:4687 3 -0x1.4p2 0x1.4p2 +REG epsg:4687 4 0x1.4p2 0x1.4p2 +REG epsg:4688 0 0x0.0p0 0x0.0p0 +REG epsg:4688 1 -0x1.4p2 -0x1.4p2 +REG epsg:4688 2 0x1.4p2 -0x1.4p2 +REG epsg:4688 3 -0x1.4p2 0x1.4p2 +REG epsg:4688 4 0x1.4p2 0x1.4p2 +REG epsg:4689 0 0x0.0p0 0x0.0p0 +REG epsg:4689 1 -0x1.4p2 -0x1.4p2 +REG epsg:4689 2 0x1.4p2 -0x1.4p2 +REG epsg:4689 3 -0x1.4p2 0x1.4p2 +REG epsg:4689 4 0x1.4p2 0x1.4p2 +REG epsg:4690 0 0x0.0p0 0x0.0p0 +REG epsg:4690 1 -0x1.4p2 -0x1.4p2 +REG epsg:4690 2 0x1.4p2 -0x1.4p2 +REG epsg:4690 3 -0x1.4p2 0x1.4p2 +REG epsg:4690 4 0x1.4p2 0x1.4p2 +REG epsg:4691 0 0x0.0p0 0x0.0p0 +REG epsg:4691 1 -0x1.4p2 -0x1.4p2 +REG epsg:4691 2 0x1.4p2 -0x1.4p2 +REG epsg:4691 3 -0x1.4p2 0x1.4p2 +REG epsg:4691 4 0x1.4p2 0x1.4p2 +REG epsg:4692 0 0x0.0p0 0x0.0p0 +REG epsg:4692 1 -0x1.4p2 -0x1.4p2 +REG epsg:4692 2 0x1.4p2 -0x1.4p2 +REG epsg:4692 3 -0x1.4p2 0x1.4p2 +REG epsg:4692 4 0x1.4p2 0x1.4p2 +REG epsg:4693 0 0x0.0p0 0x0.0p0 +REG epsg:4693 1 -0x1.4p2 -0x1.4p2 +REG epsg:4693 2 0x1.4p2 -0x1.4p2 +REG epsg:4693 3 -0x1.4p2 0x1.4p2 +REG epsg:4693 4 0x1.4p2 0x1.4p2 +REG epsg:4694 0 0x0.0p0 0x0.0p0 +REG epsg:4694 1 -0x1.4p2 -0x1.4p2 +REG epsg:4694 2 0x1.4p2 -0x1.4p2 +REG epsg:4694 3 -0x1.4p2 0x1.4p2 +REG epsg:4694 4 0x1.4p2 0x1.4p2 +REG epsg:4695 0 0x0.0p0 0x0.0p0 +REG epsg:4695 1 -0x1.4p2 -0x1.4p2 +REG epsg:4695 2 0x1.4p2 -0x1.4p2 +REG epsg:4695 3 -0x1.4p2 0x1.4p2 +REG epsg:4695 4 0x1.4p2 0x1.4p2 +REG epsg:4696 0 0x0.0p0 0x0.0p0 +REG epsg:4696 1 -0x1.4p2 -0x1.4p2 +REG epsg:4696 2 0x1.4p2 -0x1.4p2 +REG epsg:4696 3 -0x1.4p2 0x1.4p2 +REG epsg:4696 4 0x1.4p2 0x1.4p2 +REG epsg:4697 0 0x0.0p0 0x0.0p0 +REG epsg:4697 1 -0x1.4p2 -0x1.4p2 +REG epsg:4697 2 0x1.4p2 -0x1.4p2 +REG epsg:4697 3 -0x1.4p2 0x1.4p2 +REG epsg:4697 4 0x1.4p2 0x1.4p2 +REG epsg:4698 0 0x0.0p0 0x0.0p0 +REG epsg:4698 1 -0x1.4p2 -0x1.4p2 +REG epsg:4698 2 0x1.4p2 -0x1.4p2 +REG epsg:4698 3 -0x1.4p2 0x1.4p2 +REG epsg:4698 4 0x1.4p2 0x1.4p2 +REG epsg:4699 0 0x0.0p0 0x0.0p0 +REG epsg:4699 1 -0x1.4p2 -0x1.4p2 +REG epsg:4699 2 0x1.4p2 -0x1.4p2 +REG epsg:4699 3 -0x1.4p2 0x1.4p2 +REG epsg:4699 4 0x1.4p2 0x1.4p2 +REG epsg:4700 0 0x0.0p0 0x0.0p0 +REG epsg:4700 1 -0x1.4p2 -0x1.4p2 +REG epsg:4700 2 0x1.4p2 -0x1.4p2 +REG epsg:4700 3 -0x1.4p2 0x1.4p2 +REG epsg:4700 4 0x1.4p2 0x1.4p2 +REG epsg:4701 0 0x0.0p0 0x0.0p0 +REG epsg:4701 1 -0x1.4p2 -0x1.4p2 +REG epsg:4701 2 0x1.4p2 -0x1.4p2 +REG epsg:4701 3 -0x1.4p2 0x1.4p2 +REG epsg:4701 4 0x1.4p2 0x1.4p2 +REG epsg:4702 0 0x0.0p0 0x0.0p0 +REG epsg:4702 1 -0x1.4p2 -0x1.4p2 +REG epsg:4702 2 0x1.4p2 -0x1.4p2 +REG epsg:4702 3 -0x1.4p2 0x1.4p2 +REG epsg:4702 4 0x1.4p2 0x1.4p2 +REG epsg:4703 0 0x0.0p0 0x0.0p0 +REG epsg:4703 1 -0x1.4p2 -0x1.4p2 +REG epsg:4703 2 0x1.4p2 -0x1.4p2 +REG epsg:4703 3 -0x1.4p2 0x1.4p2 +REG epsg:4703 4 0x1.4p2 0x1.4p2 +REG epsg:4704 0 0x0.0p0 0x0.0p0 +REG epsg:4704 1 -0x1.4p2 -0x1.4p2 +REG epsg:4704 2 0x1.4p2 -0x1.4p2 +REG epsg:4704 3 -0x1.4p2 0x1.4p2 +REG epsg:4704 4 0x1.4p2 0x1.4p2 +REG epsg:4705 0 0x0.0p0 0x0.0p0 +REG epsg:4705 1 -0x1.4p2 -0x1.4p2 +REG epsg:4705 2 0x1.4p2 -0x1.4p2 +REG epsg:4705 3 -0x1.4p2 0x1.4p2 +REG epsg:4705 4 0x1.4p2 0x1.4p2 +REG epsg:4706 0 0x0.0p0 0x0.0p0 +REG epsg:4706 1 -0x1.4p2 -0x1.4p2 +REG epsg:4706 2 0x1.4p2 -0x1.4p2 +REG epsg:4706 3 -0x1.4p2 0x1.4p2 +REG epsg:4706 4 0x1.4p2 0x1.4p2 +REG epsg:4707 0 0x0.0p0 0x0.0p0 +REG epsg:4707 1 -0x1.4p2 -0x1.4p2 +REG epsg:4707 2 0x1.4p2 -0x1.4p2 +REG epsg:4707 3 -0x1.4p2 0x1.4p2 +REG epsg:4707 4 0x1.4p2 0x1.4p2 +REG epsg:4708 0 0x0.0p0 0x0.0p0 +REG epsg:4708 1 -0x1.4p2 -0x1.4p2 +REG epsg:4708 2 0x1.4p2 -0x1.4p2 +REG epsg:4708 3 -0x1.4p2 0x1.4p2 +REG epsg:4708 4 0x1.4p2 0x1.4p2 +REG epsg:4709 0 0x0.0p0 0x0.0p0 +REG epsg:4709 1 -0x1.4p2 -0x1.4p2 +REG epsg:4709 2 0x1.4p2 -0x1.4p2 +REG epsg:4709 3 -0x1.4p2 0x1.4p2 +REG epsg:4709 4 0x1.4p2 0x1.4p2 +REG epsg:4710 0 0x0.0p0 0x0.0p0 +REG epsg:4710 1 -0x1.4p2 -0x1.4p2 +REG epsg:4710 2 0x1.4p2 -0x1.4p2 +REG epsg:4710 3 -0x1.4p2 0x1.4p2 +REG epsg:4710 4 0x1.4p2 0x1.4p2 +REG epsg:4711 0 0x0.0p0 0x0.0p0 +REG epsg:4711 1 -0x1.4p2 -0x1.4p2 +REG epsg:4711 2 0x1.4p2 -0x1.4p2 +REG epsg:4711 3 -0x1.4p2 0x1.4p2 +REG epsg:4711 4 0x1.4p2 0x1.4p2 +REG epsg:4712 0 0x0.0p0 0x0.0p0 +REG epsg:4712 1 -0x1.4p2 -0x1.4p2 +REG epsg:4712 2 0x1.4p2 -0x1.4p2 +REG epsg:4712 3 -0x1.4p2 0x1.4p2 +REG epsg:4712 4 0x1.4p2 0x1.4p2 +REG epsg:4713 0 0x0.0p0 0x0.0p0 +REG epsg:4713 1 -0x1.4p2 -0x1.4p2 +REG epsg:4713 2 0x1.4p2 -0x1.4p2 +REG epsg:4713 3 -0x1.4p2 0x1.4p2 +REG epsg:4713 4 0x1.4p2 0x1.4p2 +REG epsg:4714 0 0x0.0p0 0x0.0p0 +REG epsg:4714 1 -0x1.4p2 -0x1.4p2 +REG epsg:4714 2 0x1.4p2 -0x1.4p2 +REG epsg:4714 3 -0x1.4p2 0x1.4p2 +REG epsg:4714 4 0x1.4p2 0x1.4p2 +REG epsg:4715 0 0x0.0p0 0x0.0p0 +REG epsg:4715 1 -0x1.4p2 -0x1.4p2 +REG epsg:4715 2 0x1.4p2 -0x1.4p2 +REG epsg:4715 3 -0x1.4p2 0x1.4p2 +REG epsg:4715 4 0x1.4p2 0x1.4p2 +REG epsg:4716 0 0x0.0p0 0x0.0p0 +REG epsg:4716 1 -0x1.4p2 -0x1.4p2 +REG epsg:4716 2 0x1.4p2 -0x1.4p2 +REG epsg:4716 3 -0x1.4p2 0x1.4p2 +REG epsg:4716 4 0x1.4p2 0x1.4p2 +REG epsg:4717 0 0x0.0p0 0x0.0p0 +REG epsg:4717 1 -0x1.4p2 -0x1.4p2 +REG epsg:4717 2 0x1.4p2 -0x1.4p2 +REG epsg:4717 3 -0x1.4p2 0x1.4p2 +REG epsg:4717 4 0x1.4p2 0x1.4p2 +REG epsg:4718 0 0x0.0p0 0x0.0p0 +REG epsg:4718 1 -0x1.4p2 -0x1.4p2 +REG epsg:4718 2 0x1.4p2 -0x1.4p2 +REG epsg:4718 3 -0x1.4p2 0x1.4p2 +REG epsg:4718 4 0x1.4p2 0x1.4p2 +REG epsg:4719 0 0x0.0p0 0x0.0p0 +REG epsg:4719 1 -0x1.4p2 -0x1.4p2 +REG epsg:4719 2 0x1.4p2 -0x1.4p2 +REG epsg:4719 3 -0x1.4p2 0x1.4p2 +REG epsg:4719 4 0x1.4p2 0x1.4p2 +REG epsg:4720 0 0x0.0p0 0x0.0p0 +REG epsg:4720 1 -0x1.4p2 -0x1.4p2 +REG epsg:4720 2 0x1.4p2 -0x1.4p2 +REG epsg:4720 3 -0x1.4p2 0x1.4p2 +REG epsg:4720 4 0x1.4p2 0x1.4p2 +REG epsg:4721 0 0x0.0p0 0x0.0p0 +REG epsg:4721 1 -0x1.4p2 -0x1.4p2 +REG epsg:4721 2 0x1.4p2 -0x1.4p2 +REG epsg:4721 3 -0x1.4p2 0x1.4p2 +REG epsg:4721 4 0x1.4p2 0x1.4p2 +REG epsg:4722 0 0x0.0p0 0x0.0p0 +REG epsg:4722 1 -0x1.4p2 -0x1.4p2 +REG epsg:4722 2 0x1.4p2 -0x1.4p2 +REG epsg:4722 3 -0x1.4p2 0x1.4p2 +REG epsg:4722 4 0x1.4p2 0x1.4p2 +REG epsg:4723 0 0x0.0p0 0x0.0p0 +REG epsg:4723 1 -0x1.4p2 -0x1.4p2 +REG epsg:4723 2 0x1.4p2 -0x1.4p2 +REG epsg:4723 3 -0x1.4p2 0x1.4p2 +REG epsg:4723 4 0x1.4p2 0x1.4p2 +REG epsg:4724 0 0x0.0p0 0x0.0p0 +REG epsg:4724 1 -0x1.4p2 -0x1.4p2 +REG epsg:4724 2 0x1.4p2 -0x1.4p2 +REG epsg:4724 3 -0x1.4p2 0x1.4p2 +REG epsg:4724 4 0x1.4p2 0x1.4p2 +REG epsg:4725 0 0x0.0p0 0x0.0p0 +REG epsg:4725 1 -0x1.4p2 -0x1.4p2 +REG epsg:4725 2 0x1.4p2 -0x1.4p2 +REG epsg:4725 3 -0x1.4p2 0x1.4p2 +REG epsg:4725 4 0x1.4p2 0x1.4p2 +REG epsg:4726 0 0x0.0p0 0x0.0p0 +REG epsg:4726 1 -0x1.4p2 -0x1.4p2 +REG epsg:4726 2 0x1.4p2 -0x1.4p2 +REG epsg:4726 3 -0x1.4p2 0x1.4p2 +REG epsg:4726 4 0x1.4p2 0x1.4p2 +REG epsg:4727 0 0x0.0p0 0x0.0p0 +REG epsg:4727 1 -0x1.4p2 -0x1.4p2 +REG epsg:4727 2 0x1.4p2 -0x1.4p2 +REG epsg:4727 3 -0x1.4p2 0x1.4p2 +REG epsg:4727 4 0x1.4p2 0x1.4p2 +REG epsg:4728 0 0x0.0p0 0x0.0p0 +REG epsg:4728 1 -0x1.4p2 -0x1.4p2 +REG epsg:4728 2 0x1.4p2 -0x1.4p2 +REG epsg:4728 3 -0x1.4p2 0x1.4p2 +REG epsg:4728 4 0x1.4p2 0x1.4p2 +REG epsg:4729 0 0x0.0p0 0x0.0p0 +REG epsg:4729 1 -0x1.4p2 -0x1.4p2 +REG epsg:4729 2 0x1.4p2 -0x1.4p2 +REG epsg:4729 3 -0x1.4p2 0x1.4p2 +REG epsg:4729 4 0x1.4p2 0x1.4p2 +REG epsg:4730 0 0x0.0p0 0x0.0p0 +REG epsg:4730 1 -0x1.4p2 -0x1.4p2 +REG epsg:4730 2 0x1.4p2 -0x1.4p2 +REG epsg:4730 3 -0x1.4p2 0x1.4p2 +REG epsg:4730 4 0x1.4p2 0x1.4p2 +REG epsg:4731 0 0x0.0p0 0x0.0p0 +REG epsg:4731 1 -0x1.4p2 -0x1.4p2 +REG epsg:4731 2 0x1.4p2 -0x1.4p2 +REG epsg:4731 3 -0x1.4p2 0x1.4p2 +REG epsg:4731 4 0x1.4p2 0x1.4p2 +REG epsg:4732 0 0x0.0p0 0x0.0p0 +REG epsg:4732 1 -0x1.4p2 -0x1.4p2 +REG epsg:4732 2 0x1.4p2 -0x1.4p2 +REG epsg:4732 3 -0x1.4p2 0x1.4p2 +REG epsg:4732 4 0x1.4p2 0x1.4p2 +REG epsg:4733 0 0x0.0p0 0x0.0p0 +REG epsg:4733 1 -0x1.4p2 -0x1.4p2 +REG epsg:4733 2 0x1.4p2 -0x1.4p2 +REG epsg:4733 3 -0x1.4p2 0x1.4p2 +REG epsg:4733 4 0x1.4p2 0x1.4p2 +REG epsg:4734 0 0x0.0p0 0x0.0p0 +REG epsg:4734 1 -0x1.4p2 -0x1.4p2 +REG epsg:4734 2 0x1.4p2 -0x1.4p2 +REG epsg:4734 3 -0x1.4p2 0x1.4p2 +REG epsg:4734 4 0x1.4p2 0x1.4p2 +REG epsg:4735 0 0x0.0p0 0x0.0p0 +REG epsg:4735 1 -0x1.4p2 -0x1.4p2 +REG epsg:4735 2 0x1.4p2 -0x1.4p2 +REG epsg:4735 3 -0x1.4p2 0x1.4p2 +REG epsg:4735 4 0x1.4p2 0x1.4p2 +REG epsg:4736 0 0x0.0p0 0x0.0p0 +REG epsg:4736 1 -0x1.4p2 -0x1.4p2 +REG epsg:4736 2 0x1.4p2 -0x1.4p2 +REG epsg:4736 3 -0x1.4p2 0x1.4p2 +REG epsg:4736 4 0x1.4p2 0x1.4p2 +REG epsg:4737 0 0x0.0p0 0x0.0p0 +REG epsg:4737 1 -0x1.4p2 -0x1.4p2 +REG epsg:4737 2 0x1.4p2 -0x1.4p2 +REG epsg:4737 3 -0x1.4p2 0x1.4p2 +REG epsg:4737 4 0x1.4p2 0x1.4p2 +REG epsg:4738 0 0x0.0p0 0x0.0p0 +REG epsg:4738 1 -0x1.4p2 -0x1.4p2 +REG epsg:4738 2 0x1.4p2 -0x1.4p2 +REG epsg:4738 3 -0x1.4p2 0x1.4p2 +REG epsg:4738 4 0x1.4p2 0x1.4p2 +REG epsg:4739 0 0x0.0p0 0x0.0p0 +REG epsg:4739 1 -0x1.4p2 -0x1.4p2 +REG epsg:4739 2 0x1.4p2 -0x1.4p2 +REG epsg:4739 3 -0x1.4p2 0x1.4p2 +REG epsg:4739 4 0x1.4p2 0x1.4p2 +REG epsg:4740 0 0x0.0p0 0x0.0p0 +REG epsg:4740 1 -0x1.4p2 -0x1.4p2 +REG epsg:4740 2 0x1.4p2 -0x1.4p2 +REG epsg:4740 3 -0x1.4p2 0x1.4p2 +REG epsg:4740 4 0x1.4p2 0x1.4p2 +REG epsg:4741 0 0x0.0p0 0x0.0p0 +REG epsg:4741 1 -0x1.4p2 -0x1.4p2 +REG epsg:4741 2 0x1.4p2 -0x1.4p2 +REG epsg:4741 3 -0x1.4p2 0x1.4p2 +REG epsg:4741 4 0x1.4p2 0x1.4p2 +REG epsg:4742 0 0x0.0p0 0x0.0p0 +REG epsg:4742 1 -0x1.4p2 -0x1.4p2 +REG epsg:4742 2 0x1.4p2 -0x1.4p2 +REG epsg:4742 3 -0x1.4p2 0x1.4p2 +REG epsg:4742 4 0x1.4p2 0x1.4p2 +REG epsg:4743 0 0x0.0p0 0x0.0p0 +REG epsg:4743 1 -0x1.4p2 -0x1.4p2 +REG epsg:4743 2 0x1.4p2 -0x1.4p2 +REG epsg:4743 3 -0x1.4p2 0x1.4p2 +REG epsg:4743 4 0x1.4p2 0x1.4p2 +REG epsg:4744 0 0x0.0p0 0x0.0p0 +REG epsg:4744 1 -0x1.4p2 -0x1.4p2 +REG epsg:4744 2 0x1.4p2 -0x1.4p2 +REG epsg:4744 3 -0x1.4p2 0x1.4p2 +REG epsg:4744 4 0x1.4p2 0x1.4p2 +REG epsg:4745 0 0x0.0p0 0x0.0p0 +REG epsg:4745 1 -0x1.4p2 -0x1.4p2 +REG epsg:4745 2 0x1.4p2 -0x1.4p2 +REG epsg:4745 3 -0x1.4p2 0x1.4p2 +REG epsg:4745 4 0x1.4p2 0x1.4p2 +REG epsg:4746 0 0x0.0p0 0x0.0p0 +REG epsg:4746 1 -0x1.4p2 -0x1.4p2 +REG epsg:4746 2 0x1.4p2 -0x1.4p2 +REG epsg:4746 3 -0x1.4p2 0x1.4p2 +REG epsg:4746 4 0x1.4p2 0x1.4p2 +REG epsg:4747 0 0x0.0p0 0x0.0p0 +REG epsg:4747 1 -0x1.4p2 -0x1.4p2 +REG epsg:4747 2 0x1.4p2 -0x1.4p2 +REG epsg:4747 3 -0x1.4p2 0x1.4p2 +REG epsg:4747 4 0x1.4p2 0x1.4p2 +REG epsg:4748 0 0x0.0p0 0x0.0p0 +REG epsg:4748 1 -0x1.4p2 -0x1.4p2 +REG epsg:4748 2 0x1.4p2 -0x1.4p2 +REG epsg:4748 3 -0x1.4p2 0x1.4p2 +REG epsg:4748 4 0x1.4p2 0x1.4p2 +REG epsg:4749 0 0x0.0p0 0x0.0p0 +REG epsg:4749 1 -0x1.4p2 -0x1.4p2 +REG epsg:4749 2 0x1.4p2 -0x1.4p2 +REG epsg:4749 3 -0x1.4p2 0x1.4p2 +REG epsg:4749 4 0x1.4p2 0x1.4p2 +REG epsg:4750 0 0x0.0p0 0x0.0p0 +REG epsg:4750 1 -0x1.4p2 -0x1.4p2 +REG epsg:4750 2 0x1.4p2 -0x1.4p2 +REG epsg:4750 3 -0x1.4p2 0x1.4p2 +REG epsg:4750 4 0x1.4p2 0x1.4p2 +REG epsg:4751 0 0x0.0p0 0x0.0p0 +REG epsg:4751 1 -0x1.4p2 -0x1.4p2 +REG epsg:4751 2 0x1.4p2 -0x1.4p2 +REG epsg:4751 3 -0x1.4p2 0x1.4p2 +REG epsg:4751 4 0x1.4p2 0x1.4p2 +REG epsg:4752 0 0x0.0p0 0x0.0p0 +REG epsg:4752 1 -0x1.4p2 -0x1.4p2 +REG epsg:4752 2 0x1.4p2 -0x1.4p2 +REG epsg:4752 3 -0x1.4p2 0x1.4p2 +REG epsg:4752 4 0x1.4p2 0x1.4p2 +REG epsg:4753 0 0x0.0p0 0x0.0p0 +REG epsg:4753 1 -0x1.4p2 -0x1.4p2 +REG epsg:4753 2 0x1.4p2 -0x1.4p2 +REG epsg:4753 3 -0x1.4p2 0x1.4p2 +REG epsg:4753 4 0x1.4p2 0x1.4p2 +REG epsg:4754 0 0x0.0p0 0x0.0p0 +REG epsg:4754 1 -0x1.4p2 -0x1.4p2 +REG epsg:4754 2 0x1.4p2 -0x1.4p2 +REG epsg:4754 3 -0x1.4p2 0x1.4p2 +REG epsg:4754 4 0x1.4p2 0x1.4p2 +REG epsg:4755 0 0x0.0p0 0x0.0p0 +REG epsg:4755 1 -0x1.4p2 -0x1.4p2 +REG epsg:4755 2 0x1.4p2 -0x1.4p2 +REG epsg:4755 3 -0x1.4p2 0x1.4p2 +REG epsg:4755 4 0x1.4p2 0x1.4p2 +REG epsg:4756 0 0x0.0p0 0x0.0p0 +REG epsg:4756 1 -0x1.4p2 -0x1.4p2 +REG epsg:4756 2 0x1.4p2 -0x1.4p2 +REG epsg:4756 3 -0x1.4p2 0x1.4p2 +REG epsg:4756 4 0x1.4p2 0x1.4p2 +REG epsg:4757 0 0x0.0p0 0x0.0p0 +REG epsg:4757 1 -0x1.4p2 -0x1.4p2 +REG epsg:4757 2 0x1.4p2 -0x1.4p2 +REG epsg:4757 3 -0x1.4p2 0x1.4p2 +REG epsg:4757 4 0x1.4p2 0x1.4p2 +REG epsg:4758 0 0x0.0p0 0x0.0p0 +REG epsg:4758 1 -0x1.4p2 -0x1.4p2 +REG epsg:4758 2 0x1.4p2 -0x1.4p2 +REG epsg:4758 3 -0x1.4p2 0x1.4p2 +REG epsg:4758 4 0x1.4p2 0x1.4p2 +REG epsg:4759 0 0x0.0p0 0x0.0p0 +REG epsg:4759 1 -0x1.4p2 -0x1.4p2 +REG epsg:4759 2 0x1.4p2 -0x1.4p2 +REG epsg:4759 3 -0x1.4p2 0x1.4p2 +REG epsg:4759 4 0x1.4p2 0x1.4p2 +REG epsg:4760 0 0x0.0p0 0x0.0p0 +REG epsg:4760 1 -0x1.4p2 -0x1.4p2 +REG epsg:4760 2 0x1.4p2 -0x1.4p2 +REG epsg:4760 3 -0x1.4p2 0x1.4p2 +REG epsg:4760 4 0x1.4p2 0x1.4p2 +REG epsg:4761 0 0x0.0p0 0x0.0p0 +REG epsg:4761 1 -0x1.4p2 -0x1.4p2 +REG epsg:4761 2 0x1.4p2 -0x1.4p2 +REG epsg:4761 3 -0x1.4p2 0x1.4p2 +REG epsg:4761 4 0x1.4p2 0x1.4p2 +REG epsg:4762 0 0x0.0p0 0x0.0p0 +REG epsg:4762 1 -0x1.4p2 -0x1.4p2 +REG epsg:4762 2 0x1.4p2 -0x1.4p2 +REG epsg:4762 3 -0x1.4p2 0x1.4p2 +REG epsg:4762 4 0x1.4p2 0x1.4p2 +REG epsg:4763 0 0x0.0p0 0x0.0p0 +REG epsg:4763 1 -0x1.4p2 -0x1.4p2 +REG epsg:4763 2 0x1.4p2 -0x1.4p2 +REG epsg:4763 3 -0x1.4p2 0x1.4p2 +REG epsg:4763 4 0x1.4p2 0x1.4p2 +REG epsg:4764 0 0x0.0p0 0x0.0p0 +REG epsg:4764 1 -0x1.4p2 -0x1.4p2 +REG epsg:4764 2 0x1.4p2 -0x1.4p2 +REG epsg:4764 3 -0x1.4p2 0x1.4p2 +REG epsg:4764 4 0x1.4p2 0x1.4p2 +REG epsg:4765 0 0x0.0p0 0x0.0p0 +REG epsg:4765 1 -0x1.4p2 -0x1.4p2 +REG epsg:4765 2 0x1.4p2 -0x1.4p2 +REG epsg:4765 3 -0x1.4p2 0x1.4p2 +REG epsg:4765 4 0x1.4p2 0x1.4p2 +REG epsg:4766 0 0x1.68p6 0x0.0p0 +REG epsg:4766 1 0x1.54p6 -0x1.4p2 +REG epsg:4766 2 0x1.7cp6 -0x1.4p2 +REG epsg:4766 3 0x1.54p6 0x1.4p2 +REG epsg:4766 4 0x1.7cp6 0x1.4p2 +REG epsg:4767 0 0x1.74p6 0x0.0p0 +REG epsg:4767 1 0x1.6p6 -0x1.4p2 +REG epsg:4767 2 0x1.88p6 -0x1.4p2 +REG epsg:4767 3 0x1.6p6 0x1.4p2 +REG epsg:4767 4 0x1.88p6 0x1.4p2 +REG epsg:4768 0 0x1.8p6 0x0.0p0 +REG epsg:4768 1 0x1.6cp6 -0x1.4p2 +REG epsg:4768 2 0x1.94p6 -0x1.4p2 +REG epsg:4768 3 0x1.6cp6 0x1.4p2 +REG epsg:4768 4 0x1.94p6 0x1.4p2 +REG epsg:4769 0 0x1.8cp6 0x0.0p0 +REG epsg:4769 1 0x1.78p6 -0x1.4p2 +REG epsg:4769 2 0x1.ap6 -0x1.4p2 +REG epsg:4769 3 0x1.78p6 0x1.4p2 +REG epsg:4769 4 0x1.ap6 0x1.4p2 +REG epsg:4770 0 0x1.98p6 0x0.0p0 +REG epsg:4770 1 0x1.84p6 -0x1.4p2 +REG epsg:4770 2 0x1.acp6 -0x1.4p2 +REG epsg:4770 3 0x1.84p6 0x1.4p2 +REG epsg:4770 4 0x1.acp6 0x1.4p2 +REG epsg:4771 0 0x1.a4p6 0x0.0p0 +REG epsg:4771 1 0x1.9p6 -0x1.4p2 +REG epsg:4771 2 0x1.b8p6 -0x1.4p2 +REG epsg:4771 3 0x1.9p6 0x1.4p2 +REG epsg:4771 4 0x1.b8p6 0x1.4p2 +REG epsg:4772 0 0x1.bp6 0x0.0p0 +REG epsg:4772 1 0x1.9cp6 -0x1.4p2 +REG epsg:4772 2 0x1.c4p6 -0x1.4p2 +REG epsg:4772 3 0x1.9cp6 0x1.4p2 +REG epsg:4772 4 0x1.c4p6 0x1.4p2 +REG epsg:4773 0 0x1.bcp6 0x0.0p0 +REG epsg:4773 1 0x1.a8p6 -0x1.4p2 +REG epsg:4773 2 0x1.dp6 -0x1.4p2 +REG epsg:4773 3 0x1.a8p6 0x1.4p2 +REG epsg:4773 4 0x1.dp6 0x1.4p2 +REG epsg:4774 0 0x1.c8p6 0x0.0p0 +REG epsg:4774 1 0x1.b4p6 -0x1.4p2 +REG epsg:4774 2 0x1.dcp6 -0x1.4p2 +REG epsg:4774 3 0x1.b4p6 0x1.4p2 +REG epsg:4774 4 0x1.dcp6 0x1.4p2 +REG epsg:4775 0 0x1.d4p6 0x0.0p0 +REG epsg:4775 1 0x1.cp6 -0x1.4p2 +REG epsg:4775 2 0x1.e8p6 -0x1.4p2 +REG epsg:4775 3 0x1.cp6 0x1.4p2 +REG epsg:4775 4 0x1.e8p6 0x1.4p2 +REG epsg:4776 0 0x1.ep6 0x0.0p0 +REG epsg:4776 1 0x1.ccp6 -0x1.4p2 +REG epsg:4776 2 0x1.f4p6 -0x1.4p2 +REG epsg:4776 3 0x1.ccp6 0x1.4p2 +REG epsg:4776 4 0x1.f4p6 0x1.4p2 +REG epsg:4777 0 0x1.ecp6 0x0.0p0 +REG epsg:4777 1 0x1.d8p6 -0x1.4p2 +REG epsg:4777 2 0x1.0p7 -0x1.4p2 +REG epsg:4777 3 0x1.d8p6 0x1.4p2 +REG epsg:4777 4 0x1.0p7 0x1.4p2 +REG epsg:4778 0 0x1.f8p6 0x0.0p0 +REG epsg:4778 1 0x1.e4p6 -0x1.4p2 +REG epsg:4778 2 0x1.06p7 -0x1.4p2 +REG epsg:4778 3 0x1.e4p6 0x1.4p2 +REG epsg:4778 4 0x1.06p7 0x1.4p2 +REG epsg:4779 0 0x1.02p7 0x0.0p0 +REG epsg:4779 1 0x1.fp6 -0x1.4p2 +REG epsg:4779 2 0x1.0cp7 -0x1.4p2 +REG epsg:4779 3 0x1.fp6 0x1.4p2 +REG epsg:4779 4 0x1.0cp7 0x1.4p2 +REG epsg:4780 0 0x1.08p7 0x0.0p0 +REG epsg:4780 1 0x1.fcp6 -0x1.4p2 +REG epsg:4780 2 0x1.12p7 -0x1.4p2 +REG epsg:4780 3 0x1.fcp6 0x1.4p2 +REG epsg:4780 4 0x1.12p7 0x1.4p2 +REG epsg:4781 0 0x1.0ep7 0x0.0p0 +REG epsg:4781 1 0x1.04p7 -0x1.4p2 +REG epsg:4781 2 0x1.18p7 -0x1.4p2 +REG epsg:4781 3 0x1.04p7 0x1.4p2 +REG epsg:4781 4 0x1.18p7 0x1.4p2 +REG epsg:4782 0 0x1.2cp6 0x0.0p0 +REG epsg:4782 1 0x1.18p6 -0x1.4p2 +REG epsg:4782 2 0x1.4p6 -0x1.4p2 +REG epsg:4782 3 0x1.18p6 0x1.4p2 +REG epsg:4782 4 0x1.4p6 0x1.4p2 +REG epsg:4783 0 0x1.38p6 0x0.0p0 +REG epsg:4783 1 0x1.24p6 -0x1.4p2 +REG epsg:4783 2 0x1.4cp6 -0x1.4p2 +REG epsg:4783 3 0x1.24p6 0x1.4p2 +REG epsg:4783 4 0x1.4cp6 0x1.4p2 +REG epsg:4784 0 0x1.44p6 0x0.0p0 +REG epsg:4784 1 0x1.3p6 -0x1.4p2 +REG epsg:4784 2 0x1.58p6 -0x1.4p2 +REG epsg:4784 3 0x1.3p6 0x1.4p2 +REG epsg:4784 4 0x1.58p6 0x1.4p2 +REG epsg:4785 0 0x1.5p6 0x0.0p0 +REG epsg:4785 1 0x1.3cp6 -0x1.4p2 +REG epsg:4785 2 0x1.64p6 -0x1.4p2 +REG epsg:4785 3 0x1.3cp6 0x1.4p2 +REG epsg:4785 4 0x1.64p6 0x1.4p2 +REG epsg:4786 0 0x1.5cp6 0x0.0p0 +REG epsg:4786 1 0x1.48p6 -0x1.4p2 +REG epsg:4786 2 0x1.7p6 -0x1.4p2 +REG epsg:4786 3 0x1.48p6 0x1.4p2 +REG epsg:4786 4 0x1.7p6 0x1.4p2 +REG epsg:4787 0 0x1.68p6 0x0.0p0 +REG epsg:4787 1 0x1.54p6 -0x1.4p2 +REG epsg:4787 2 0x1.7cp6 -0x1.4p2 +REG epsg:4787 3 0x1.54p6 0x1.4p2 +REG epsg:4787 4 0x1.7cp6 0x1.4p2 +REG epsg:4788 0 0x1.74p6 0x0.0p0 +REG epsg:4788 1 0x1.6p6 -0x1.4p2 +REG epsg:4788 2 0x1.88p6 -0x1.4p2 +REG epsg:4788 3 0x1.6p6 0x1.4p2 +REG epsg:4788 4 0x1.88p6 0x1.4p2 +REG epsg:4789 0 0x1.8p6 0x0.0p0 +REG epsg:4789 1 0x1.6cp6 -0x1.4p2 +REG epsg:4789 2 0x1.94p6 -0x1.4p2 +REG epsg:4789 3 0x1.6cp6 0x1.4p2 +REG epsg:4789 4 0x1.94p6 0x1.4p2 +REG epsg:4790 0 0x1.8cp6 0x0.0p0 +REG epsg:4790 1 0x1.78p6 -0x1.4p2 +REG epsg:4790 2 0x1.ap6 -0x1.4p2 +REG epsg:4790 3 0x1.78p6 0x1.4p2 +REG epsg:4790 4 0x1.ap6 0x1.4p2 +REG epsg:4791 0 0x1.98p6 0x0.0p0 +REG epsg:4791 1 0x1.84p6 -0x1.4p2 +REG epsg:4791 2 0x1.acp6 -0x1.4p2 +REG epsg:4791 3 0x1.84p6 0x1.4p2 +REG epsg:4791 4 0x1.acp6 0x1.4p2 +REG epsg:4792 0 0x1.a4p6 0x0.0p0 +REG epsg:4792 1 0x1.9p6 -0x1.4p2 +REG epsg:4792 2 0x1.b8p6 -0x1.4p2 +REG epsg:4792 3 0x1.9p6 0x1.4p2 +REG epsg:4792 4 0x1.b8p6 0x1.4p2 +REG epsg:4793 0 0x1.bp6 0x0.0p0 +REG epsg:4793 1 0x1.9cp6 -0x1.4p2 +REG epsg:4793 2 0x1.c4p6 -0x1.4p2 +REG epsg:4793 3 0x1.9cp6 0x1.4p2 +REG epsg:4793 4 0x1.c4p6 0x1.4p2 +REG epsg:4794 0 0x1.bcp6 0x0.0p0 +REG epsg:4794 1 0x1.a8p6 -0x1.4p2 +REG epsg:4794 2 0x1.dp6 -0x1.4p2 +REG epsg:4794 3 0x1.a8p6 0x1.4p2 +REG epsg:4794 4 0x1.dp6 0x1.4p2 +REG epsg:4795 0 0x1.c8p6 0x0.0p0 +REG epsg:4795 1 0x1.b4p6 -0x1.4p2 +REG epsg:4795 2 0x1.dcp6 -0x1.4p2 +REG epsg:4795 3 0x1.b4p6 0x1.4p2 +REG epsg:4795 4 0x1.dcp6 0x1.4p2 +REG epsg:4796 0 0x1.d4p6 0x0.0p0 +REG epsg:4796 1 0x1.cp6 -0x1.4p2 +REG epsg:4796 2 0x1.e8p6 -0x1.4p2 +REG epsg:4796 3 0x1.cp6 0x1.4p2 +REG epsg:4796 4 0x1.e8p6 0x1.4p2 +REG epsg:4797 0 0x1.ep6 0x0.0p0 +REG epsg:4797 1 0x1.ccp6 -0x1.4p2 +REG epsg:4797 2 0x1.f4p6 -0x1.4p2 +REG epsg:4797 3 0x1.ccp6 0x1.4p2 +REG epsg:4797 4 0x1.f4p6 0x1.4p2 +REG epsg:4798 0 0x1.ecp6 0x0.0p0 +REG epsg:4798 1 0x1.d8p6 -0x1.4p2 +REG epsg:4798 2 0x1.0p7 -0x1.4p2 +REG epsg:4798 3 0x1.d8p6 0x1.4p2 +REG epsg:4798 4 0x1.0p7 0x1.4p2 +REG epsg:4799 0 0x1.f8p6 0x0.0p0 +REG epsg:4799 1 0x1.e4p6 -0x1.4p2 +REG epsg:4799 2 0x1.06p7 -0x1.4p2 +REG epsg:4799 3 0x1.e4p6 0x1.4p2 +REG epsg:4799 4 0x1.06p7 0x1.4p2 +REG epsg:4800 0 0x1.02p7 0x0.0p0 +REG epsg:4800 1 0x1.fp6 -0x1.4p2 +REG epsg:4800 2 0x1.0cp7 -0x1.4p2 +REG epsg:4800 3 0x1.fp6 0x1.4p2 +REG epsg:4800 4 0x1.0cp7 0x1.4p2 +REG epsg:4801 0 0x0.0p0 0x0.0p0 +REG epsg:4801 1 -0x1.4p2 -0x1.4p2 +REG epsg:4801 2 0x1.4p2 -0x1.4p2 +REG epsg:4801 3 -0x1.4p2 0x1.4p2 +REG epsg:4801 4 0x1.4p2 0x1.4p2 +REG epsg:4802 0 0x0.0p0 0x0.0p0 +REG epsg:4802 1 -0x1.4p2 -0x1.4p2 +REG epsg:4802 2 0x1.4p2 -0x1.4p2 +REG epsg:4802 3 -0x1.4p2 0x1.4p2 +REG epsg:4802 4 0x1.4p2 0x1.4p2 +REG epsg:4803 0 0x0.0p0 0x0.0p0 +REG epsg:4803 1 -0x1.4p2 -0x1.4p2 +REG epsg:4803 2 0x1.4p2 -0x1.4p2 +REG epsg:4803 3 -0x1.4p2 0x1.4p2 +REG epsg:4803 4 0x1.4p2 0x1.4p2 +REG epsg:4804 0 0x0.0p0 0x0.0p0 +REG epsg:4804 1 -0x1.4p2 -0x1.4p2 +REG epsg:4804 2 0x1.4p2 -0x1.4p2 +REG epsg:4804 3 -0x1.4p2 0x1.4p2 +REG epsg:4804 4 0x1.4p2 0x1.4p2 +REG epsg:4805 0 0x0.0p0 0x0.0p0 +REG epsg:4805 1 -0x1.4p2 -0x1.4p2 +REG epsg:4805 2 0x1.4p2 -0x1.4p2 +REG epsg:4805 3 -0x1.4p2 0x1.4p2 +REG epsg:4805 4 0x1.4p2 0x1.4p2 +REG epsg:4806 0 0x0.0p0 0x0.0p0 +REG epsg:4806 1 -0x1.4p2 -0x1.4p2 +REG epsg:4806 2 0x1.4p2 -0x1.4p2 +REG epsg:4806 3 -0x1.4p2 0x1.4p2 +REG epsg:4806 4 0x1.4p2 0x1.4p2 +REG epsg:4807 0 0x0.0p0 0x0.0p0 +REG epsg:4807 1 -0x1.4p2 -0x1.4p2 +REG epsg:4807 2 0x1.4p2 -0x1.4p2 +REG epsg:4807 3 -0x1.4p2 0x1.4p2 +REG epsg:4807 4 0x1.4p2 0x1.4p2 +REG epsg:4808 0 0x0.0p0 0x0.0p0 +REG epsg:4808 1 -0x1.4p2 -0x1.4p2 +REG epsg:4808 2 0x1.4p2 -0x1.4p2 +REG epsg:4808 3 -0x1.4p2 0x1.4p2 +REG epsg:4808 4 0x1.4p2 0x1.4p2 +REG epsg:4809 0 0x0.0p0 0x0.0p0 +REG epsg:4809 1 -0x1.4p2 -0x1.4p2 +REG epsg:4809 2 0x1.4p2 -0x1.4p2 +REG epsg:4809 3 -0x1.4p2 0x1.4p2 +REG epsg:4809 4 0x1.4p2 0x1.4p2 +REG epsg:4810 0 0x0.0p0 0x0.0p0 +REG epsg:4810 1 -0x1.4p2 -0x1.4p2 +REG epsg:4810 2 0x1.4p2 -0x1.4p2 +REG epsg:4810 3 -0x1.4p2 0x1.4p2 +REG epsg:4810 4 0x1.4p2 0x1.4p2 +REG epsg:4811 0 0x0.0p0 0x0.0p0 +REG epsg:4811 1 -0x1.4p2 -0x1.4p2 +REG epsg:4811 2 0x1.4p2 -0x1.4p2 +REG epsg:4811 3 -0x1.4p2 0x1.4p2 +REG epsg:4811 4 0x1.4p2 0x1.4p2 +REG epsg:4812 0 0x1.08p7 0x0.0p0 +REG epsg:4812 1 0x1.fcp6 -0x1.4p2 +REG epsg:4812 2 0x1.12p7 -0x1.4p2 +REG epsg:4812 3 0x1.fcp6 0x1.4p2 +REG epsg:4812 4 0x1.12p7 0x1.4p2 +REG epsg:4813 0 0x0.0p0 0x0.0p0 +REG epsg:4813 1 -0x1.4p2 -0x1.4p2 +REG epsg:4813 2 0x1.4p2 -0x1.4p2 +REG epsg:4813 3 -0x1.4p2 0x1.4p2 +REG epsg:4813 4 0x1.4p2 0x1.4p2 +REG epsg:4814 0 0x0.0p0 0x0.0p0 +REG epsg:4814 1 -0x1.4p2 -0x1.4p2 +REG epsg:4814 2 0x1.4p2 -0x1.4p2 +REG epsg:4814 3 -0x1.4p2 0x1.4p2 +REG epsg:4814 4 0x1.4p2 0x1.4p2 +REG epsg:4815 0 0x0.0p0 0x0.0p0 +REG epsg:4815 1 -0x1.4p2 -0x1.4p2 +REG epsg:4815 2 0x1.4p2 -0x1.4p2 +REG epsg:4815 3 -0x1.4p2 0x1.4p2 +REG epsg:4815 4 0x1.4p2 0x1.4p2 +REG epsg:4816 0 0x0.0p0 0x0.0p0 +REG epsg:4816 1 -0x1.4p2 -0x1.4p2 +REG epsg:4816 2 0x1.4p2 -0x1.4p2 +REG epsg:4816 3 -0x1.4p2 0x1.4p2 +REG epsg:4816 4 0x1.4p2 0x1.4p2 +REG epsg:4817 0 0x0.0p0 0x0.0p0 +REG epsg:4817 1 -0x1.4p2 -0x1.4p2 +REG epsg:4817 2 0x1.4p2 -0x1.4p2 +REG epsg:4817 3 -0x1.4p2 0x1.4p2 +REG epsg:4817 4 0x1.4p2 0x1.4p2 +REG epsg:4818 0 0x0.0p0 0x0.0p0 +REG epsg:4818 1 -0x1.4p2 -0x1.4p2 +REG epsg:4818 2 0x1.4p2 -0x1.4p2 +REG epsg:4818 3 -0x1.4p2 0x1.4p2 +REG epsg:4818 4 0x1.4p2 0x1.4p2 +REG epsg:4819 0 0x0.0p0 0x0.0p0 +REG epsg:4819 1 -0x1.4p2 -0x1.4p2 +REG epsg:4819 2 0x1.4p2 -0x1.4p2 +REG epsg:4819 3 -0x1.4p2 0x1.4p2 +REG epsg:4819 4 0x1.4p2 0x1.4p2 +REG epsg:4820 0 0x0.0p0 0x0.0p0 +REG epsg:4820 1 -0x1.4p2 -0x1.4p2 +REG epsg:4820 2 0x1.4p2 -0x1.4p2 +REG epsg:4820 3 -0x1.4p2 0x1.4p2 +REG epsg:4820 4 0x1.4p2 0x1.4p2 +REG epsg:4821 0 0x0.0p0 0x0.0p0 +REG epsg:4821 1 -0x1.4p2 -0x1.4p2 +REG epsg:4821 2 0x1.4p2 -0x1.4p2 +REG epsg:4821 3 -0x1.4p2 0x1.4p2 +REG epsg:4821 4 0x1.4p2 0x1.4p2 +REG epsg:4822 0 0x1.0ep7 0x0.0p0 +REG epsg:4822 1 0x1.04p7 -0x1.4p2 +REG epsg:4822 2 0x1.18p7 -0x1.4p2 +REG epsg:4822 3 0x1.04p7 0x1.4p2 +REG epsg:4822 4 0x1.18p7 0x1.4p2 +REG epsg:4823 0 0x0.0p0 0x0.0p0 +REG epsg:4823 1 -0x1.4p2 -0x1.4p2 +REG epsg:4823 2 0x1.4p2 -0x1.4p2 +REG epsg:4823 3 -0x1.4p2 0x1.4p2 +REG epsg:4823 4 0x1.4p2 0x1.4p2 +REG epsg:4824 0 0x0.0p0 0x0.0p0 +REG epsg:4824 1 -0x1.4p2 -0x1.4p2 +REG epsg:4824 2 0x1.4p2 -0x1.4p2 +REG epsg:4824 3 -0x1.4p2 0x1.4p2 +REG epsg:4824 4 0x1.4p2 0x1.4p2 +REG epsg:4826 0 -0x1.8p4 0x1.faaaaaaaaaaacp3 +REG epsg:4826 1 -0x1.9bb7e386767d9p4 0x1.c555555555554p3 +REG epsg:4826 2 -0x1.64481c7989827p4 0x1.c555555555554p3 +REG epsg:4826 3 -0x1.9bb7e386767d9p4 0x1.1800000000002p4 +REG epsg:4826 4 -0x1.64481c7989827p4 0x1.1800000000002p4 +REG epsg:4839 0 0x1.5p3 0x1.9955555555554p5 +REG epsg:4839 1 0x1.435bfb6f51ccp1 0x1.7155555555554p5 +REG epsg:4839 2 0x1.2794809215c68p4 0x1.7155555555554p5 +REG epsg:4839 3 0x1.435bfb6f51ccp1 0x1.c155555555554p5 +REG epsg:4839 4 0x1.2794809215c68p4 0x1.c155555555554p5 +REG epsg:4855 0 0x1.6p2 0x0.0p0 +REG epsg:4855 1 0x1.0p-1 -0x1.4p2 +REG epsg:4855 2 0x1.5p3 -0x1.4p2 +REG epsg:4855 3 0x1.0p-1 0x1.4p2 +REG epsg:4855 4 0x1.5p3 0x1.4p2 +REG epsg:4856 0 0x1.ap2 0x0.0p0 +REG epsg:4856 1 0x1.8p0 -0x1.4p2 +REG epsg:4856 2 0x1.7p3 -0x1.4p2 +REG epsg:4856 3 0x1.8p0 0x1.4p2 +REG epsg:4856 4 0x1.7p3 0x1.4p2 +REG epsg:4857 0 0x1.ep2 0x0.0p0 +REG epsg:4857 1 0x1.4p1 -0x1.4p2 +REG epsg:4857 2 0x1.9p3 -0x1.4p2 +REG epsg:4857 3 0x1.4p1 0x1.4p2 +REG epsg:4857 4 0x1.9p3 0x1.4p2 +REG epsg:4858 0 0x1.1p3 0x0.0p0 +REG epsg:4858 1 0x1.cp1 -0x1.4p2 +REG epsg:4858 2 0x1.bp3 -0x1.4p2 +REG epsg:4858 3 0x1.cp1 0x1.4p2 +REG epsg:4858 4 0x1.bp3 0x1.4p2 +REG epsg:4859 0 0x1.3p3 0x0.0p0 +REG epsg:4859 1 0x1.2p2 -0x1.4p2 +REG epsg:4859 2 0x1.dp3 -0x1.4p2 +REG epsg:4859 3 0x1.2p2 0x1.4p2 +REG epsg:4859 4 0x1.dp3 0x1.4p2 +REG epsg:4860 0 0x1.5p3 0x0.0p0 +REG epsg:4860 1 0x1.6p2 -0x1.4p2 +REG epsg:4860 2 0x1.fp3 -0x1.4p2 +REG epsg:4860 3 0x1.6p2 0x1.4p2 +REG epsg:4860 4 0x1.fp3 0x1.4p2 +REG epsg:4861 0 0x1.7p3 0x0.0p0 +REG epsg:4861 1 0x1.ap2 -0x1.4p2 +REG epsg:4861 2 0x1.08p4 -0x1.4p2 +REG epsg:4861 3 0x1.ap2 0x1.4p2 +REG epsg:4861 4 0x1.08p4 0x1.4p2 +REG epsg:4862 0 0x1.9p3 0x0.0p0 +REG epsg:4862 1 0x1.ep2 -0x1.4p2 +REG epsg:4862 2 0x1.18p4 -0x1.4p2 +REG epsg:4862 3 0x1.ep2 0x1.4p2 +REG epsg:4862 4 0x1.18p4 0x1.4p2 +REG epsg:4863 0 0x1.bp3 0x0.0p0 +REG epsg:4863 1 0x1.1p3 -0x1.4p2 +REG epsg:4863 2 0x1.28p4 -0x1.4p2 +REG epsg:4863 3 0x1.1p3 0x1.4p2 +REG epsg:4863 4 0x1.28p4 0x1.4p2 +REG epsg:4864 0 0x1.dp3 0x0.0p0 +REG epsg:4864 1 0x1.3p3 -0x1.4p2 +REG epsg:4864 2 0x1.38p4 -0x1.4p2 +REG epsg:4864 3 0x1.3p3 0x1.4p2 +REG epsg:4864 4 0x1.38p4 0x1.4p2 +REG epsg:4865 0 0x1.fp3 0x0.0p0 +REG epsg:4865 1 0x1.5p3 -0x1.4p2 +REG epsg:4865 2 0x1.48p4 -0x1.4p2 +REG epsg:4865 3 0x1.5p3 0x1.4p2 +REG epsg:4865 4 0x1.48p4 0x1.4p2 +REG epsg:4866 0 0x1.08p4 0x0.0p0 +REG epsg:4866 1 0x1.7p3 -0x1.4p2 +REG epsg:4866 2 0x1.58p4 -0x1.4p2 +REG epsg:4866 3 0x1.7p3 0x1.4p2 +REG epsg:4866 4 0x1.58p4 0x1.4p2 +REG epsg:4867 0 0x1.18p4 0x0.0p0 +REG epsg:4867 1 0x1.9p3 -0x1.4p2 +REG epsg:4867 2 0x1.68p4 -0x1.4p2 +REG epsg:4867 3 0x1.9p3 0x1.4p2 +REG epsg:4867 4 0x1.68p4 0x1.4p2 +REG epsg:4868 0 0x1.28p4 0x0.0p0 +REG epsg:4868 1 0x1.bp3 -0x1.4p2 +REG epsg:4868 2 0x1.78p4 -0x1.4p2 +REG epsg:4868 3 0x1.bp3 0x1.4p2 +REG epsg:4868 4 0x1.78p4 0x1.4p2 +REG epsg:4869 0 0x1.38p4 0x0.0p0 +REG epsg:4869 1 0x1.dp3 -0x1.4p2 +REG epsg:4869 2 0x1.88p4 -0x1.4p2 +REG epsg:4869 3 0x1.dp3 0x1.4p2 +REG epsg:4869 4 0x1.88p4 0x1.4p2 +REG epsg:4870 0 0x1.48p4 0x0.0p0 +REG epsg:4870 1 0x1.fp3 -0x1.4p2 +REG epsg:4870 2 0x1.98p4 -0x1.4p2 +REG epsg:4870 3 0x1.fp3 0x1.4p2 +REG epsg:4870 4 0x1.98p4 0x1.4p2 +REG epsg:4871 0 0x1.58p4 0x0.0p0 +REG epsg:4871 1 0x1.08p4 -0x1.4p2 +REG epsg:4871 2 0x1.a8p4 -0x1.4p2 +REG epsg:4871 3 0x1.08p4 0x1.4p2 +REG epsg:4871 4 0x1.a8p4 0x1.4p2 +REG epsg:4872 0 0x1.68p4 0x0.0p0 +REG epsg:4872 1 0x1.18p4 -0x1.4p2 +REG epsg:4872 2 0x1.b8p4 -0x1.4p2 +REG epsg:4872 3 0x1.18p4 0x1.4p2 +REG epsg:4872 4 0x1.b8p4 0x1.4p2 +REG epsg:4873 0 0x1.78p4 0x0.0p0 +REG epsg:4873 1 0x1.28p4 -0x1.4p2 +REG epsg:4873 2 0x1.c8p4 -0x1.4p2 +REG epsg:4873 3 0x1.28p4 0x1.4p2 +REG epsg:4873 4 0x1.c8p4 0x1.4p2 +REG epsg:4874 0 0x1.88p4 0x0.0p0 +REG epsg:4874 1 0x1.38p4 -0x1.4p2 +REG epsg:4874 2 0x1.d8p4 -0x1.4p2 +REG epsg:4874 3 0x1.38p4 0x1.4p2 +REG epsg:4874 4 0x1.d8p4 0x1.4p2 +REG epsg:4875 0 0x1.98p4 0x0.0p0 +REG epsg:4875 1 0x1.48p4 -0x1.4p2 +REG epsg:4875 2 0x1.e8p4 -0x1.4p2 +REG epsg:4875 3 0x1.48p4 0x1.4p2 +REG epsg:4875 4 0x1.e8p4 0x1.4p2 +REG epsg:4876 0 0x1.a8p4 0x0.0p0 +REG epsg:4876 1 0x1.58p4 -0x1.4p2 +REG epsg:4876 2 0x1.f8p4 -0x1.4p2 +REG epsg:4876 3 0x1.58p4 0x1.4p2 +REG epsg:4876 4 0x1.f8p4 0x1.4p2 +REG epsg:4877 0 0x1.b8p4 0x0.0p0 +REG epsg:4877 1 0x1.68p4 -0x1.4p2 +REG epsg:4877 2 0x1.04p5 -0x1.4p2 +REG epsg:4877 3 0x1.68p4 0x1.4p2 +REG epsg:4877 4 0x1.04p5 0x1.4p2 +REG epsg:4878 0 0x1.c8p4 0x0.0p0 +REG epsg:4878 1 0x1.78p4 -0x1.4p2 +REG epsg:4878 2 0x1.0cp5 -0x1.4p2 +REG epsg:4878 3 0x1.78p4 0x1.4p2 +REG epsg:4878 4 0x1.0cp5 0x1.4p2 +REG epsg:4879 0 0x1.d8p4 0x0.0p0 +REG epsg:4879 1 0x1.88p4 -0x1.4p2 +REG epsg:4879 2 0x1.14p5 -0x1.4p2 +REG epsg:4879 3 0x1.88p4 0x1.4p2 +REG epsg:4879 4 0x1.14p5 0x1.4p2 +REG epsg:4880 0 0x1.e8p4 0x0.0p0 +REG epsg:4880 1 0x1.98p4 -0x1.4p2 +REG epsg:4880 2 0x1.1cp5 -0x1.4p2 +REG epsg:4880 3 0x1.98p4 0x1.4p2 +REG epsg:4880 4 0x1.1cp5 0x1.4p2 +REG epsg:4882 0 0x0.0p0 0x0.0p0 +REG epsg:4882 1 -0x1.4p2 -0x1.4p2 +REG epsg:4882 2 0x1.4p2 -0x1.4p2 +REG epsg:4882 3 -0x1.4p2 0x1.4p2 +REG epsg:4882 4 0x1.4p2 0x1.4p2 +REG epsg:4884 0 0x0.0p0 0x0.0p0 +REG epsg:4884 1 -0x1.4p2 -0x1.4p2 +REG epsg:4884 2 0x1.4p2 -0x1.4p2 +REG epsg:4884 3 -0x1.4p2 0x1.4p2 +REG epsg:4884 4 0x1.4p2 0x1.4p2 +REG epsg:4886 0 0x0.0p0 0x0.0p0 +REG epsg:4886 1 -0x1.4p2 -0x1.4p2 +REG epsg:4886 2 0x1.4p2 -0x1.4p2 +REG epsg:4886 3 -0x1.4p2 0x1.4p2 +REG epsg:4886 4 0x1.4p2 0x1.4p2 +REG epsg:4888 0 0x0.0p0 0x0.0p0 +REG epsg:4888 1 -0x1.4p2 -0x1.4p2 +REG epsg:4888 2 0x1.4p2 -0x1.4p2 +REG epsg:4888 3 -0x1.4p2 0x1.4p2 +REG epsg:4888 4 0x1.4p2 0x1.4p2 +REG epsg:4890 0 0x0.0p0 0x0.0p0 +REG epsg:4890 1 -0x1.4p2 -0x1.4p2 +REG epsg:4890 2 0x1.4p2 -0x1.4p2 +REG epsg:4890 3 -0x1.4p2 0x1.4p2 +REG epsg:4890 4 0x1.4p2 0x1.4p2 +REG epsg:4892 0 0x0.0p0 0x0.0p0 +REG epsg:4892 1 -0x1.4p2 -0x1.4p2 +REG epsg:4892 2 0x1.4p2 -0x1.4p2 +REG epsg:4892 3 -0x1.4p2 0x1.4p2 +REG epsg:4892 4 0x1.4p2 0x1.4p2 +REG epsg:4894 0 0x0.0p0 0x0.0p0 +REG epsg:4894 1 -0x1.4p2 -0x1.4p2 +REG epsg:4894 2 0x1.4p2 -0x1.4p2 +REG epsg:4894 3 -0x1.4p2 0x1.4p2 +REG epsg:4894 4 0x1.4p2 0x1.4p2 +REG epsg:4896 0 0x0.0p0 0x0.0p0 +REG epsg:4896 1 -0x1.4p2 -0x1.4p2 +REG epsg:4896 2 0x1.4p2 -0x1.4p2 +REG epsg:4896 3 -0x1.4p2 0x1.4p2 +REG epsg:4896 4 0x1.4p2 0x1.4p2 +REG epsg:4897 0 0x0.0p0 0x0.0p0 +REG epsg:4897 1 -0x1.4p2 -0x1.4p2 +REG epsg:4897 2 0x1.4p2 -0x1.4p2 +REG epsg:4897 3 -0x1.4p2 0x1.4p2 +REG epsg:4897 4 0x1.4p2 0x1.4p2 +REG epsg:4899 0 0x0.0p0 0x0.0p0 +REG epsg:4899 1 -0x1.4p2 -0x1.4p2 +REG epsg:4899 2 0x1.4p2 -0x1.4p2 +REG epsg:4899 3 -0x1.4p2 0x1.4p2 +REG epsg:4899 4 0x1.4p2 0x1.4p2 +REG epsg:4901 0 0x0.0p0 0x0.0p0 +REG epsg:4901 1 -0x1.4p2 -0x1.4p2 +REG epsg:4901 2 0x1.4p2 -0x1.4p2 +REG epsg:4901 3 -0x1.4p2 0x1.4p2 +REG epsg:4901 4 0x1.4p2 0x1.4p2 +REG epsg:4902 0 0x0.0p0 0x0.0p0 +REG epsg:4902 1 -0x1.4p2 -0x1.4p2 +REG epsg:4902 2 0x1.4p2 -0x1.4p2 +REG epsg:4902 3 -0x1.4p2 0x1.4p2 +REG epsg:4902 4 0x1.4p2 0x1.4p2 +REG epsg:4903 0 0x0.0p0 0x0.0p0 +REG epsg:4903 1 -0x1.4p2 -0x1.4p2 +REG epsg:4903 2 0x1.4p2 -0x1.4p2 +REG epsg:4903 3 -0x1.4p2 0x1.4p2 +REG epsg:4903 4 0x1.4p2 0x1.4p2 +REG epsg:4904 0 0x0.0p0 0x0.0p0 +REG epsg:4904 1 -0x1.4p2 -0x1.4p2 +REG epsg:4904 2 0x1.4p2 -0x1.4p2 +REG epsg:4904 3 -0x1.4p2 0x1.4p2 +REG epsg:4904 4 0x1.4p2 0x1.4p2 +REG epsg:4906 0 0x0.0p0 0x0.0p0 +REG epsg:4906 1 -0x1.4p2 -0x1.4p2 +REG epsg:4906 2 0x1.4p2 -0x1.4p2 +REG epsg:4906 3 -0x1.4p2 0x1.4p2 +REG epsg:4906 4 0x1.4p2 0x1.4p2 +REG epsg:4908 0 0x0.0p0 0x0.0p0 +REG epsg:4908 1 -0x1.4p2 -0x1.4p2 +REG epsg:4908 2 0x1.4p2 -0x1.4p2 +REG epsg:4908 3 -0x1.4p2 0x1.4p2 +REG epsg:4908 4 0x1.4p2 0x1.4p2 +REG epsg:4910 0 0x0.0p0 0x0.0p0 +REG epsg:4910 1 -0x1.4p2 -0x1.4p2 +REG epsg:4910 2 0x1.4p2 -0x1.4p2 +REG epsg:4910 3 -0x1.4p2 0x1.4p2 +REG epsg:4910 4 0x1.4p2 0x1.4p2 +REG epsg:4911 0 0x0.0p0 0x0.0p0 +REG epsg:4911 1 -0x1.4p2 -0x1.4p2 +REG epsg:4911 2 0x1.4p2 -0x1.4p2 +REG epsg:4911 3 -0x1.4p2 0x1.4p2 +REG epsg:4911 4 0x1.4p2 0x1.4p2 +REG epsg:4912 0 0x0.0p0 0x0.0p0 +REG epsg:4912 1 -0x1.4p2 -0x1.4p2 +REG epsg:4912 2 0x1.4p2 -0x1.4p2 +REG epsg:4912 3 -0x1.4p2 0x1.4p2 +REG epsg:4912 4 0x1.4p2 0x1.4p2 +REG epsg:4913 0 0x0.0p0 0x0.0p0 +REG epsg:4913 1 -0x1.4p2 -0x1.4p2 +REG epsg:4913 2 0x1.4p2 -0x1.4p2 +REG epsg:4913 3 -0x1.4p2 0x1.4p2 +REG epsg:4913 4 0x1.4p2 0x1.4p2 +REG epsg:4914 0 0x0.0p0 0x0.0p0 +REG epsg:4914 1 -0x1.4p2 -0x1.4p2 +REG epsg:4914 2 0x1.4p2 -0x1.4p2 +REG epsg:4914 3 -0x1.4p2 0x1.4p2 +REG epsg:4914 4 0x1.4p2 0x1.4p2 +REG epsg:4915 0 0x0.0p0 0x0.0p0 +REG epsg:4915 1 -0x1.4p2 -0x1.4p2 +REG epsg:4915 2 0x1.4p2 -0x1.4p2 +REG epsg:4915 3 -0x1.4p2 0x1.4p2 +REG epsg:4915 4 0x1.4p2 0x1.4p2 +REG epsg:4916 0 0x0.0p0 0x0.0p0 +REG epsg:4916 1 -0x1.4p2 -0x1.4p2 +REG epsg:4916 2 0x1.4p2 -0x1.4p2 +REG epsg:4916 3 -0x1.4p2 0x1.4p2 +REG epsg:4916 4 0x1.4p2 0x1.4p2 +REG epsg:4917 0 0x0.0p0 0x0.0p0 +REG epsg:4917 1 -0x1.4p2 -0x1.4p2 +REG epsg:4917 2 0x1.4p2 -0x1.4p2 +REG epsg:4917 3 -0x1.4p2 0x1.4p2 +REG epsg:4917 4 0x1.4p2 0x1.4p2 +REG epsg:4918 0 0x0.0p0 0x0.0p0 +REG epsg:4918 1 -0x1.4p2 -0x1.4p2 +REG epsg:4918 2 0x1.4p2 -0x1.4p2 +REG epsg:4918 3 -0x1.4p2 0x1.4p2 +REG epsg:4918 4 0x1.4p2 0x1.4p2 +REG epsg:4919 0 0x0.0p0 0x0.0p0 +REG epsg:4919 1 -0x1.4p2 -0x1.4p2 +REG epsg:4919 2 0x1.4p2 -0x1.4p2 +REG epsg:4919 3 -0x1.4p2 0x1.4p2 +REG epsg:4919 4 0x1.4p2 0x1.4p2 +REG epsg:4920 0 0x0.0p0 0x0.0p0 +REG epsg:4920 1 -0x1.4p2 -0x1.4p2 +REG epsg:4920 2 0x1.4p2 -0x1.4p2 +REG epsg:4920 3 -0x1.4p2 0x1.4p2 +REG epsg:4920 4 0x1.4p2 0x1.4p2 +REG epsg:4922 0 0x0.0p0 0x0.0p0 +REG epsg:4922 1 -0x1.4p2 -0x1.4p2 +REG epsg:4922 2 0x1.4p2 -0x1.4p2 +REG epsg:4922 3 -0x1.4p2 0x1.4p2 +REG epsg:4922 4 0x1.4p2 0x1.4p2 +REG epsg:4924 0 0x0.0p0 0x0.0p0 +REG epsg:4924 1 -0x1.4p2 -0x1.4p2 +REG epsg:4924 2 0x1.4p2 -0x1.4p2 +REG epsg:4924 3 -0x1.4p2 0x1.4p2 +REG epsg:4924 4 0x1.4p2 0x1.4p2 +REG epsg:4926 0 0x0.0p0 0x0.0p0 +REG epsg:4926 1 -0x1.4p2 -0x1.4p2 +REG epsg:4926 2 0x1.4p2 -0x1.4p2 +REG epsg:4926 3 -0x1.4p2 0x1.4p2 +REG epsg:4926 4 0x1.4p2 0x1.4p2 +REG epsg:4928 0 0x0.0p0 0x0.0p0 +REG epsg:4928 1 -0x1.4p2 -0x1.4p2 +REG epsg:4928 2 0x1.4p2 -0x1.4p2 +REG epsg:4928 3 -0x1.4p2 0x1.4p2 +REG epsg:4928 4 0x1.4p2 0x1.4p2 +REG epsg:4930 0 0x0.0p0 0x0.0p0 +REG epsg:4930 1 -0x1.4p2 -0x1.4p2 +REG epsg:4930 2 0x1.4p2 -0x1.4p2 +REG epsg:4930 3 -0x1.4p2 0x1.4p2 +REG epsg:4930 4 0x1.4p2 0x1.4p2 +REG epsg:4932 0 0x0.0p0 0x0.0p0 +REG epsg:4932 1 -0x1.4p2 -0x1.4p2 +REG epsg:4932 2 0x1.4p2 -0x1.4p2 +REG epsg:4932 3 -0x1.4p2 0x1.4p2 +REG epsg:4932 4 0x1.4p2 0x1.4p2 +REG epsg:4934 0 0x0.0p0 0x0.0p0 +REG epsg:4934 1 -0x1.4p2 -0x1.4p2 +REG epsg:4934 2 0x1.4p2 -0x1.4p2 +REG epsg:4934 3 -0x1.4p2 0x1.4p2 +REG epsg:4934 4 0x1.4p2 0x1.4p2 +REG epsg:4936 0 0x0.0p0 0x0.0p0 +REG epsg:4936 1 -0x1.4p2 -0x1.4p2 +REG epsg:4936 2 0x1.4p2 -0x1.4p2 +REG epsg:4936 3 -0x1.4p2 0x1.4p2 +REG epsg:4936 4 0x1.4p2 0x1.4p2 +REG epsg:4938 0 0x0.0p0 0x0.0p0 +REG epsg:4938 1 -0x1.4p2 -0x1.4p2 +REG epsg:4938 2 0x1.4p2 -0x1.4p2 +REG epsg:4938 3 -0x1.4p2 0x1.4p2 +REG epsg:4938 4 0x1.4p2 0x1.4p2 +REG epsg:4940 0 0x0.0p0 0x0.0p0 +REG epsg:4940 1 -0x1.4p2 -0x1.4p2 +REG epsg:4940 2 0x1.4p2 -0x1.4p2 +REG epsg:4940 3 -0x1.4p2 0x1.4p2 +REG epsg:4940 4 0x1.4p2 0x1.4p2 +REG epsg:4942 0 0x0.0p0 0x0.0p0 +REG epsg:4942 1 -0x1.4p2 -0x1.4p2 +REG epsg:4942 2 0x1.4p2 -0x1.4p2 +REG epsg:4942 3 -0x1.4p2 0x1.4p2 +REG epsg:4942 4 0x1.4p2 0x1.4p2 +REG epsg:4944 0 0x0.0p0 0x0.0p0 +REG epsg:4944 1 -0x1.4p2 -0x1.4p2 +REG epsg:4944 2 0x1.4p2 -0x1.4p2 +REG epsg:4944 3 -0x1.4p2 0x1.4p2 +REG epsg:4944 4 0x1.4p2 0x1.4p2 +REG epsg:4946 0 0x0.0p0 0x0.0p0 +REG epsg:4946 1 -0x1.4p2 -0x1.4p2 +REG epsg:4946 2 0x1.4p2 -0x1.4p2 +REG epsg:4946 3 -0x1.4p2 0x1.4p2 +REG epsg:4946 4 0x1.4p2 0x1.4p2 +REG epsg:4948 0 0x0.0p0 0x0.0p0 +REG epsg:4948 1 -0x1.4p2 -0x1.4p2 +REG epsg:4948 2 0x1.4p2 -0x1.4p2 +REG epsg:4948 3 -0x1.4p2 0x1.4p2 +REG epsg:4948 4 0x1.4p2 0x1.4p2 +REG epsg:4950 0 0x0.0p0 0x0.0p0 +REG epsg:4950 1 -0x1.4p2 -0x1.4p2 +REG epsg:4950 2 0x1.4p2 -0x1.4p2 +REG epsg:4950 3 -0x1.4p2 0x1.4p2 +REG epsg:4950 4 0x1.4p2 0x1.4p2 +REG epsg:4952 0 0x0.0p0 0x0.0p0 +REG epsg:4952 1 -0x1.4p2 -0x1.4p2 +REG epsg:4952 2 0x1.4p2 -0x1.4p2 +REG epsg:4952 3 -0x1.4p2 0x1.4p2 +REG epsg:4952 4 0x1.4p2 0x1.4p2 +REG epsg:4954 0 0x0.0p0 0x0.0p0 +REG epsg:4954 1 -0x1.4p2 -0x1.4p2 +REG epsg:4954 2 0x1.4p2 -0x1.4p2 +REG epsg:4954 3 -0x1.4p2 0x1.4p2 +REG epsg:4954 4 0x1.4p2 0x1.4p2 +REG epsg:4956 0 0x0.0p0 0x0.0p0 +REG epsg:4956 1 -0x1.4p2 -0x1.4p2 +REG epsg:4956 2 0x1.4p2 -0x1.4p2 +REG epsg:4956 3 -0x1.4p2 0x1.4p2 +REG epsg:4956 4 0x1.4p2 0x1.4p2 +REG epsg:4958 0 0x0.0p0 0x0.0p0 +REG epsg:4958 1 -0x1.4p2 -0x1.4p2 +REG epsg:4958 2 0x1.4p2 -0x1.4p2 +REG epsg:4958 3 -0x1.4p2 0x1.4p2 +REG epsg:4958 4 0x1.4p2 0x1.4p2 +REG epsg:4960 0 0x0.0p0 0x0.0p0 +REG epsg:4960 1 -0x1.4p2 -0x1.4p2 +REG epsg:4960 2 0x1.4p2 -0x1.4p2 +REG epsg:4960 3 -0x1.4p2 0x1.4p2 +REG epsg:4960 4 0x1.4p2 0x1.4p2 +REG epsg:4962 0 0x0.0p0 0x0.0p0 +REG epsg:4962 1 -0x1.4p2 -0x1.4p2 +REG epsg:4962 2 0x1.4p2 -0x1.4p2 +REG epsg:4962 3 -0x1.4p2 0x1.4p2 +REG epsg:4962 4 0x1.4p2 0x1.4p2 +REG epsg:4964 0 0x0.0p0 0x0.0p0 +REG epsg:4964 1 -0x1.4p2 -0x1.4p2 +REG epsg:4964 2 0x1.4p2 -0x1.4p2 +REG epsg:4964 3 -0x1.4p2 0x1.4p2 +REG epsg:4964 4 0x1.4p2 0x1.4p2 +REG epsg:4966 0 0x0.0p0 0x0.0p0 +REG epsg:4966 1 -0x1.4p2 -0x1.4p2 +REG epsg:4966 2 0x1.4p2 -0x1.4p2 +REG epsg:4966 3 -0x1.4p2 0x1.4p2 +REG epsg:4966 4 0x1.4p2 0x1.4p2 +REG epsg:4968 0 0x0.0p0 0x0.0p0 +REG epsg:4968 1 -0x1.4p2 -0x1.4p2 +REG epsg:4968 2 0x1.4p2 -0x1.4p2 +REG epsg:4968 3 -0x1.4p2 0x1.4p2 +REG epsg:4968 4 0x1.4p2 0x1.4p2 +REG epsg:4970 0 0x0.0p0 0x0.0p0 +REG epsg:4970 1 -0x1.4p2 -0x1.4p2 +REG epsg:4970 2 0x1.4p2 -0x1.4p2 +REG epsg:4970 3 -0x1.4p2 0x1.4p2 +REG epsg:4970 4 0x1.4p2 0x1.4p2 +REG epsg:4972 0 0x0.0p0 0x0.0p0 +REG epsg:4972 1 -0x1.4p2 -0x1.4p2 +REG epsg:4972 2 0x1.4p2 -0x1.4p2 +REG epsg:4972 3 -0x1.4p2 0x1.4p2 +REG epsg:4972 4 0x1.4p2 0x1.4p2 +REG epsg:4974 0 0x0.0p0 0x0.0p0 +REG epsg:4974 1 -0x1.4p2 -0x1.4p2 +REG epsg:4974 2 0x1.4p2 -0x1.4p2 +REG epsg:4974 3 -0x1.4p2 0x1.4p2 +REG epsg:4974 4 0x1.4p2 0x1.4p2 +REG epsg:4976 0 0x0.0p0 0x0.0p0 +REG epsg:4976 1 -0x1.4p2 -0x1.4p2 +REG epsg:4976 2 0x1.4p2 -0x1.4p2 +REG epsg:4976 3 -0x1.4p2 0x1.4p2 +REG epsg:4976 4 0x1.4p2 0x1.4p2 +REG epsg:4978 0 0x0.0p0 0x0.0p0 +REG epsg:4978 1 -0x1.4p2 -0x1.4p2 +REG epsg:4978 2 0x1.4p2 -0x1.4p2 +REG epsg:4978 3 -0x1.4p2 0x1.4p2 +REG epsg:4978 4 0x1.4p2 0x1.4p2 +REG epsg:4980 0 0x0.0p0 0x0.0p0 +REG epsg:4980 1 -0x1.4p2 -0x1.4p2 +REG epsg:4980 2 0x1.4p2 -0x1.4p2 +REG epsg:4980 3 -0x1.4p2 0x1.4p2 +REG epsg:4980 4 0x1.4p2 0x1.4p2 +REG epsg:4982 0 0x0.0p0 0x0.0p0 +REG epsg:4982 1 -0x1.4p2 -0x1.4p2 +REG epsg:4982 2 0x1.4p2 -0x1.4p2 +REG epsg:4982 3 -0x1.4p2 0x1.4p2 +REG epsg:4982 4 0x1.4p2 0x1.4p2 +REG epsg:4984 0 0x0.0p0 0x0.0p0 +REG epsg:4984 1 -0x1.4p2 -0x1.4p2 +REG epsg:4984 2 0x1.4p2 -0x1.4p2 +REG epsg:4984 3 -0x1.4p2 0x1.4p2 +REG epsg:4984 4 0x1.4p2 0x1.4p2 +REG epsg:4986 0 0x0.0p0 0x0.0p0 +REG epsg:4986 1 -0x1.4p2 -0x1.4p2 +REG epsg:4986 2 0x1.4p2 -0x1.4p2 +REG epsg:4986 3 -0x1.4p2 0x1.4p2 +REG epsg:4986 4 0x1.4p2 0x1.4p2 +REG epsg:4988 0 0x0.0p0 0x0.0p0 +REG epsg:4988 1 -0x1.4p2 -0x1.4p2 +REG epsg:4988 2 0x1.4p2 -0x1.4p2 +REG epsg:4988 3 -0x1.4p2 0x1.4p2 +REG epsg:4988 4 0x1.4p2 0x1.4p2 +REG epsg:4990 0 0x0.0p0 0x0.0p0 +REG epsg:4990 1 -0x1.4p2 -0x1.4p2 +REG epsg:4990 2 0x1.4p2 -0x1.4p2 +REG epsg:4990 3 -0x1.4p2 0x1.4p2 +REG epsg:4990 4 0x1.4p2 0x1.4p2 +REG epsg:4992 0 0x0.0p0 0x0.0p0 +REG epsg:4992 1 -0x1.4p2 -0x1.4p2 +REG epsg:4992 2 0x1.4p2 -0x1.4p2 +REG epsg:4992 3 -0x1.4p2 0x1.4p2 +REG epsg:4992 4 0x1.4p2 0x1.4p2 +REG epsg:4994 0 0x0.0p0 0x0.0p0 +REG epsg:4994 1 -0x1.4p2 -0x1.4p2 +REG epsg:4994 2 0x1.4p2 -0x1.4p2 +REG epsg:4994 3 -0x1.4p2 0x1.4p2 +REG epsg:4994 4 0x1.4p2 0x1.4p2 +REG epsg:4996 0 0x0.0p0 0x0.0p0 +REG epsg:4996 1 -0x1.4p2 -0x1.4p2 +REG epsg:4996 2 0x1.4p2 -0x1.4p2 +REG epsg:4996 3 -0x1.4p2 0x1.4p2 +REG epsg:4996 4 0x1.4p2 0x1.4p2 +REG epsg:4998 0 0x0.0p0 0x0.0p0 +REG epsg:4998 1 -0x1.4p2 -0x1.4p2 +REG epsg:4998 2 0x1.4p2 -0x1.4p2 +REG epsg:4998 3 -0x1.4p2 0x1.4p2 +REG epsg:4998 4 0x1.4p2 0x1.4p2 +REG epsg:5011 0 0x0.0p0 0x0.0p0 +REG epsg:5011 1 -0x1.4p2 -0x1.4p2 +REG epsg:5011 2 0x1.4p2 -0x1.4p2 +REG epsg:5011 3 -0x1.4p2 0x1.4p2 +REG epsg:5011 4 0x1.4p2 0x1.4p2 +REG epsg:5013 0 0x0.0p0 0x0.0p0 +REG epsg:5013 1 -0x1.4p2 -0x1.4p2 +REG epsg:5013 2 0x1.4p2 -0x1.4p2 +REG epsg:5013 3 -0x1.4p2 0x1.4p2 +REG epsg:5013 4 0x1.4p2 0x1.4p2 +REG epsg:5014 0 -0x1.08p5 0x0.0p0 +REG epsg:5014 1 -0x1.3p5 -0x1.4p2 +REG epsg:5014 2 -0x1.cp4 -0x1.4p2 +REG epsg:5014 3 -0x1.3p5 0x1.4p2 +REG epsg:5014 4 -0x1.cp4 0x1.4p2 +REG epsg:5015 0 -0x1.bp4 0x0.0p0 +REG epsg:5015 1 -0x1.0p5 -0x1.4p2 +REG epsg:5015 2 -0x1.6p4 -0x1.4p2 +REG epsg:5015 3 -0x1.0p5 0x1.4p2 +REG epsg:5015 4 -0x1.6p4 0x1.4p2 +REG epsg:5016 0 -0x1.ep3 0x0.0p0 +REG epsg:5016 1 -0x1.4p4 -0x1.4p2 +REG epsg:5016 2 -0x1.4p3 -0x1.4p2 +REG epsg:5016 3 -0x1.4p4 0x1.4p2 +REG epsg:5016 4 -0x1.4p3 0x1.4p2 +REG epsg:5018 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG epsg:5018 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG epsg:5018 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG epsg:5018 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG epsg:5018 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG epsg:5041 0 0x0.0p0 0x1.64p6 +REG epsg:5041 1 -0x1.ep5 0x1.54p6 +REG epsg:5041 2 0x1.ep5 0x1.54p6 +REG epsg:5041 3 -0x1.ep5 0x1.64p6 +REG epsg:5041 4 0x1.ep5 0x1.64p6 +REG epsg:5042 0 0x0.0p0 -0x1.64p6 +REG epsg:5042 1 -0x1.ep5 -0x1.64p6 +REG epsg:5042 2 0x1.ep5 -0x1.64p6 +REG epsg:5042 3 -0x1.ep5 -0x1.54p6 +REG epsg:5042 4 0x1.ep5 -0x1.54p6 +REG epsg:5048 0 0x1.bp4 0x0.0p0 +REG epsg:5048 1 0x1.6p4 -0x1.4p2 +REG epsg:5048 2 0x1.0p5 -0x1.4p2 +REG epsg:5048 3 0x1.6p4 0x1.4p2 +REG epsg:5048 4 0x1.0p5 0x1.4p2 +REG epsg:5069 0 -0x1.8p6 0x1.12p5 +REG epsg:5069 1 -0x1.c8965fc9568dcp6 0x1.34p4 +REG epsg:5069 2 -0x1.3769a036a9724p6 0x1.34p4 +REG epsg:5069 3 -0x1.c8965fc9568dcp6 0x1.8ap5 +REG epsg:5069 4 -0x1.3769a036a9724p6 0x1.8ap5 +REG epsg:5070 0 -0x1.8p6 0x1.12p5 +REG epsg:5070 1 -0x1.c8965fc9568dcp6 0x1.34p4 +REG epsg:5070 2 -0x1.3769a036a9724p6 0x1.34p4 +REG epsg:5070 3 -0x1.c8965fc9568dcp6 0x1.8ap5 +REG epsg:5070 4 -0x1.3769a036a9724p6 0x1.8ap5 +REG epsg:5071 0 -0x1.8p6 0x1.12p5 +REG epsg:5071 1 -0x1.c8965fc9568dcp6 0x1.34p4 +REG epsg:5071 2 -0x1.3769a036a9724p6 0x1.34p4 +REG epsg:5071 3 -0x1.c8965fc9568dcp6 0x1.8ap5 +REG epsg:5071 4 -0x1.3769a036a9724p6 0x1.8ap5 +REG epsg:5072 0 -0x1.8p6 0x1.12p5 +REG epsg:5072 1 -0x1.c8965fc9568dcp6 0x1.34p4 +REG epsg:5072 2 -0x1.3769a036a9724p6 0x1.34p4 +REG epsg:5072 3 -0x1.c8965fc9568dcp6 0x1.8ap5 +REG epsg:5072 4 -0x1.3769a036a9724p6 0x1.8ap5 +REG epsg:5105 0 0x1.6p2 0x1.dp5 +REG epsg:5105 1 -0x1.f7bb2c5982784p1 0x1.a8p5 +REG epsg:5105 2 0x1.ddeecb16609e1p3 0x1.a8p5 +REG epsg:5105 3 -0x1.f7bb2c5982784p1 0x1.f8p5 +REG epsg:5105 4 0x1.ddeecb16609e1p3 0x1.f8p5 +REG epsg:5106 0 0x1.ap2 0x1.dp5 +REG epsg:5106 1 -0x1.77bb2c5982784p1 0x1.a8p5 +REG epsg:5106 2 0x1.fdeecb16609e1p3 0x1.a8p5 +REG epsg:5106 3 -0x1.77bb2c5982784p1 0x1.f8p5 +REG epsg:5106 4 0x1.fdeecb16609e1p3 0x1.f8p5 +REG epsg:5107 0 0x1.ep2 0x1.dp5 +REG epsg:5107 1 -0x1.ef7658b304f08p0 0x1.a8p5 +REG epsg:5107 2 0x1.0ef7658b304fp4 0x1.a8p5 +REG epsg:5107 3 -0x1.ef7658b304f08p0 0x1.f8p5 +REG epsg:5107 4 0x1.0ef7658b304fp4 0x1.f8p5 +REG epsg:5108 0 0x1.1p3 0x1.dp5 +REG epsg:5108 1 -0x1.deecb16609e1p-1 0x1.a8p5 +REG epsg:5108 2 0x1.1ef7658b304fp4 0x1.a8p5 +REG epsg:5108 3 -0x1.deecb16609e1p-1 0x1.f8p5 +REG epsg:5108 4 0x1.1ef7658b304fp4 0x1.f8p5 +REG epsg:5109 0 0x1.3p3 0x1.dp5 +REG epsg:5109 1 0x1.089a74cfb0f8p-4 0x1.a8p5 +REG epsg:5109 2 0x1.2ef7658b304fp4 0x1.a8p5 +REG epsg:5109 3 0x1.089a74cfb0f8p-4 0x1.f8p5 +REG epsg:5109 4 0x1.2ef7658b304fp4 0x1.f8p5 +REG epsg:5110 0 0x1.5p3 0x1.dp5 +REG epsg:5110 1 0x1.1089a74cfb0f8p0 0x1.a8p5 +REG epsg:5110 2 0x1.3ef7658b304fp4 0x1.a8p5 +REG epsg:5110 3 0x1.1089a74cfb0f8p0 0x1.f8p5 +REG epsg:5110 4 0x1.3ef7658b304fp4 0x1.f8p5 +REG epsg:5111 0 0x1.7p3 0x1.dp5 +REG epsg:5111 1 0x1.0844d3a67d87cp1 0x1.a8p5 +REG epsg:5111 2 0x1.4ef7658b304fp4 0x1.a8p5 +REG epsg:5111 3 0x1.0844d3a67d87cp1 0x1.f8p5 +REG epsg:5111 4 0x1.4ef7658b304fp4 0x1.f8p5 +REG epsg:5112 0 0x1.9p3 0x1.dp5 +REG epsg:5112 1 0x1.8844d3a67d87cp1 0x1.a8p5 +REG epsg:5112 2 0x1.5ef7658b304fp4 0x1.a8p5 +REG epsg:5112 3 0x1.8844d3a67d87cp1 0x1.f8p5 +REG epsg:5112 4 0x1.5ef7658b304fp4 0x1.f8p5 +REG epsg:5113 0 0x1.bp3 0x1.dp5 +REG epsg:5113 1 0x1.042269d33ec3ep2 0x1.a8p5 +REG epsg:5113 2 0x1.6ef7658b304fp4 0x1.a8p5 +REG epsg:5113 3 0x1.042269d33ec3ep2 0x1.f8p5 +REG epsg:5113 4 0x1.6ef7658b304fp4 0x1.f8p5 +REG epsg:5114 0 0x1.dp3 0x1.dp5 +REG epsg:5114 1 0x1.442269d33ec3ep2 0x1.a8p5 +REG epsg:5114 2 0x1.7ef7658b304fp4 0x1.a8p5 +REG epsg:5114 3 0x1.442269d33ec3ep2 0x1.f8p5 +REG epsg:5114 4 0x1.7ef7658b304fp4 0x1.f8p5 +REG epsg:5115 0 0x1.fp3 0x1.dp5 +REG epsg:5115 1 0x1.842269d33ec3ep2 0x1.a8p5 +REG epsg:5115 2 0x1.8ef7658b304fp4 0x1.a8p5 +REG epsg:5115 3 0x1.842269d33ec3ep2 0x1.f8p5 +REG epsg:5115 4 0x1.8ef7658b304fp4 0x1.f8p5 +REG epsg:5116 0 0x1.08p4 0x1.dp5 +REG epsg:5116 1 0x1.c42269d33ec3ep2 0x1.a8p5 +REG epsg:5116 2 0x1.9ef7658b304fp4 0x1.a8p5 +REG epsg:5116 3 0x1.c42269d33ec3ep2 0x1.f8p5 +REG epsg:5116 4 0x1.9ef7658b304fp4 0x1.f8p5 +REG epsg:5117 0 0x1.18p4 0x1.dp5 +REG epsg:5117 1 0x1.021134e99f61fp3 0x1.a8p5 +REG epsg:5117 2 0x1.aef7658b304fp4 0x1.a8p5 +REG epsg:5117 3 0x1.021134e99f61fp3 0x1.f8p5 +REG epsg:5117 4 0x1.aef7658b304fp4 0x1.f8p5 +REG epsg:5118 0 0x1.28p4 0x1.dp5 +REG epsg:5118 1 0x1.221134e99f61fp3 0x1.a8p5 +REG epsg:5118 2 0x1.bef7658b304fp4 0x1.a8p5 +REG epsg:5118 3 0x1.221134e99f61fp3 0x1.f8p5 +REG epsg:5118 4 0x1.bef7658b304fp4 0x1.f8p5 +REG epsg:5119 0 0x1.38p4 0x1.dp5 +REG epsg:5119 1 0x1.421134e99f61fp3 0x1.a8p5 +REG epsg:5119 2 0x1.cef7658b304fp4 0x1.a8p5 +REG epsg:5119 3 0x1.421134e99f61fp3 0x1.f8p5 +REG epsg:5119 4 0x1.cef7658b304fp4 0x1.f8p5 +REG epsg:5120 0 0x1.48p4 0x1.dp5 +REG epsg:5120 1 0x1.621134e99f61fp3 0x1.a8p5 +REG epsg:5120 2 0x1.def7658b304fp4 0x1.a8p5 +REG epsg:5120 3 0x1.621134e99f61fp3 0x1.f8p5 +REG epsg:5120 4 0x1.def7658b304fp4 0x1.f8p5 +REG epsg:5121 0 0x1.58p4 0x1.dp5 +REG epsg:5121 1 0x1.821134e99f61fp3 0x1.a8p5 +REG epsg:5121 2 0x1.eef7658b304fp4 0x1.a8p5 +REG epsg:5121 3 0x1.821134e99f61fp3 0x1.f8p5 +REG epsg:5121 4 0x1.eef7658b304fp4 0x1.f8p5 +REG epsg:5122 0 0x1.68p4 0x1.dp5 +REG epsg:5122 1 0x1.a21134e99f61fp3 0x1.a8p5 +REG epsg:5122 2 0x1.fef7658b304fp4 0x1.a8p5 +REG epsg:5122 3 0x1.a21134e99f61fp3 0x1.f8p5 +REG epsg:5122 4 0x1.fef7658b304fp4 0x1.f8p5 +REG epsg:5123 0 0x1.78p4 0x1.dp5 +REG epsg:5123 1 0x1.c21134e99f61fp3 0x1.a8p5 +REG epsg:5123 2 0x1.077bb2c598278p5 0x1.a8p5 +REG epsg:5123 3 0x1.c21134e99f61fp3 0x1.f8p5 +REG epsg:5123 4 0x1.077bb2c598278p5 0x1.f8p5 +REG epsg:5124 0 0x1.88p4 0x1.dp5 +REG epsg:5124 1 0x1.e21134e99f61fp3 0x1.a8p5 +REG epsg:5124 2 0x1.0f7bb2c598278p5 0x1.a8p5 +REG epsg:5124 3 0x1.e21134e99f61fp3 0x1.f8p5 +REG epsg:5124 4 0x1.0f7bb2c598278p5 0x1.f8p5 +REG epsg:5125 0 0x1.98p4 0x1.dp5 +REG epsg:5125 1 0x1.01089a74cfb1p4 0x1.a8p5 +REG epsg:5125 2 0x1.177bb2c598278p5 0x1.a8p5 +REG epsg:5125 3 0x1.01089a74cfb1p4 0x1.f8p5 +REG epsg:5125 4 0x1.177bb2c598278p5 0x1.f8p5 +REG epsg:5126 0 0x1.a8p4 0x1.dp5 +REG epsg:5126 1 0x1.11089a74cfb1p4 0x1.a8p5 +REG epsg:5126 2 0x1.1f7bb2c598278p5 0x1.a8p5 +REG epsg:5126 3 0x1.11089a74cfb1p4 0x1.f8p5 +REG epsg:5126 4 0x1.1f7bb2c598278p5 0x1.f8p5 +REG epsg:5127 0 0x1.b8p4 0x1.dp5 +REG epsg:5127 1 0x1.21089a74cfb1p4 0x1.a8p5 +REG epsg:5127 2 0x1.277bb2c598278p5 0x1.a8p5 +REG epsg:5127 3 0x1.21089a74cfb1p4 0x1.f8p5 +REG epsg:5127 4 0x1.277bb2c598278p5 0x1.f8p5 +REG epsg:5128 0 0x1.c8p4 0x1.dp5 +REG epsg:5128 1 0x1.31089a74cfb1p4 0x1.a8p5 +REG epsg:5128 2 0x1.2f7bb2c598278p5 0x1.a8p5 +REG epsg:5128 3 0x1.31089a74cfb1p4 0x1.f8p5 +REG epsg:5128 4 0x1.2f7bb2c598278p5 0x1.f8p5 +REG epsg:5129 0 0x1.d8p4 0x1.dp5 +REG epsg:5129 1 0x1.41089a74cfb1p4 0x1.a8p5 +REG epsg:5129 2 0x1.377bb2c598278p5 0x1.a8p5 +REG epsg:5129 3 0x1.41089a74cfb1p4 0x1.f8p5 +REG epsg:5129 4 0x1.377bb2c598278p5 0x1.f8p5 +REG epsg:5130 0 0x1.e8p4 0x1.dp5 +REG epsg:5130 1 0x1.51089a74cfb1p4 0x1.a8p5 +REG epsg:5130 2 0x1.3f7bb2c598278p5 0x1.a8p5 +REG epsg:5130 3 0x1.51089a74cfb1p4 0x1.f8p5 +REG epsg:5130 4 0x1.3f7bb2c598278p5 0x1.f8p5 +REG epsg:5132 0 0x0.0p0 0x0.0p0 +REG epsg:5132 1 -0x1.4p2 -0x1.4p2 +REG epsg:5132 2 0x1.4p2 -0x1.4p2 +REG epsg:5132 3 -0x1.4p2 0x1.4p2 +REG epsg:5132 4 0x1.4p2 0x1.4p2 +REG epsg:5167 0 0x1.06p7 0x1.3p5 +REG epsg:5167 1 0x1.f29ea071f4b32p6 0x1.08p5 +REG epsg:5167 2 0x1.12b0afc705a67p7 0x1.08p5 +REG epsg:5167 3 0x1.f29ea071f4b32p6 0x1.58p5 +REG epsg:5167 4 0x1.12b0afc705a67p7 0x1.58p5 +REG epsg:5168 0 0x1.fcp6 0x1.3p5 +REG epsg:5168 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG epsg:5168 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG epsg:5168 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG epsg:5168 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG epsg:5169 0 0x1.f4p6 0x1.3p5 +REG epsg:5169 1 0x1.da9ea071f4b32p6 0x1.08p5 +REG epsg:5169 2 0x1.06b0afc705a67p7 0x1.08p5 +REG epsg:5169 3 0x1.da9ea071f4b32p6 0x1.58p5 +REG epsg:5169 4 0x1.06b0afc705a67p7 0x1.58p5 +REG epsg:5170 0 0x1.fcp6 0x1.3p5 +REG epsg:5170 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG epsg:5170 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG epsg:5170 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG epsg:5170 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG epsg:5171 0 0x1.02p7 0x1.3p5 +REG epsg:5171 1 0x1.ea9ea071f4b32p6 0x1.08p5 +REG epsg:5171 2 0x1.0eb0afc705a67p7 0x1.08p5 +REG epsg:5171 3 0x1.ea9ea071f4b32p6 0x1.58p5 +REG epsg:5171 4 0x1.0eb0afc705a67p7 0x1.58p5 +REG epsg:5172 0 0x1.06p7 0x1.3p5 +REG epsg:5172 1 0x1.f29ea071f4b32p6 0x1.08p5 +REG epsg:5172 2 0x1.12b0afc705a67p7 0x1.08p5 +REG epsg:5172 3 0x1.f29ea071f4b32p6 0x1.58p5 +REG epsg:5172 4 0x1.12b0afc705a67p7 0x1.58p5 +REG epsg:5173 0 0x1.f402f5ab4220cp6 0x1.3p5 +REG epsg:5173 1 0x1.daa1961d36d3ep6 0x1.08p5 +REG epsg:5173 2 0x1.06b22a9ca6b6dp7 0x1.08p5 +REG epsg:5173 3 0x1.daa1961d36d3ep6 0x1.58p5 +REG epsg:5173 4 0x1.06b22a9ca6b6dp7 0x1.58p5 +REG epsg:5174 0 0x1.fc02f5ab4220cp6 0x1.3p5 +REG epsg:5174 1 0x1.e2a1961d36d3ep6 0x1.08p5 +REG epsg:5174 2 0x1.0ab22a9ca6b6dp7 0x1.08p5 +REG epsg:5174 3 0x1.e2a1961d36d3ep6 0x1.58p5 +REG epsg:5174 4 0x1.0ab22a9ca6b6dp7 0x1.58p5 +REG epsg:5175 0 0x1.fc02f5ab4220cp6 0x1.3p5 +REG epsg:5175 1 0x1.e2a1961d36d3ep6 0x1.08p5 +REG epsg:5175 2 0x1.0ab22a9ca6b6dp7 0x1.08p5 +REG epsg:5175 3 0x1.e2a1961d36d3ep6 0x1.58p5 +REG epsg:5175 4 0x1.0ab22a9ca6b6dp7 0x1.58p5 +REG epsg:5176 0 0x1.02017ad5a1106p7 0x1.3p5 +REG epsg:5176 1 0x1.eaa1961d36d3ep6 0x1.08p5 +REG epsg:5176 2 0x1.0eb22a9ca6b6dp7 0x1.08p5 +REG epsg:5176 3 0x1.eaa1961d36d3ep6 0x1.58p5 +REG epsg:5176 4 0x1.0eb22a9ca6b6dp7 0x1.58p5 +REG epsg:5177 0 0x1.06017ad5a1106p7 0x1.3p5 +REG epsg:5177 1 0x1.f2a1961d36d3ep6 0x1.08p5 +REG epsg:5177 2 0x1.12b22a9ca6b6dp7 0x1.08p5 +REG epsg:5177 3 0x1.f2a1961d36d3ep6 0x1.58p5 +REG epsg:5177 4 0x1.12b22a9ca6b6dp7 0x1.58p5 +REG epsg:5178 0 0x1.fep6 0x1.3p5 +REG epsg:5178 1 0x1.e49ea071f4b32p6 0x1.08p5 +REG epsg:5178 2 0x1.0bb0afc705a67p7 0x1.08p5 +REG epsg:5178 3 0x1.e49ea071f4b32p6 0x1.58p5 +REG epsg:5178 4 0x1.0bb0afc705a67p7 0x1.58p5 +REG epsg:5179 0 0x1.fep6 0x1.3p5 +REG epsg:5179 1 0x1.e49ea071f4b32p6 0x1.08p5 +REG epsg:5179 2 0x1.0bb0afc705a67p7 0x1.08p5 +REG epsg:5179 3 0x1.e49ea071f4b32p6 0x1.58p5 +REG epsg:5179 4 0x1.0bb0afc705a67p7 0x1.58p5 +REG epsg:5180 0 0x1.f4p6 0x1.3p5 +REG epsg:5180 1 0x1.da9ea071f4b32p6 0x1.08p5 +REG epsg:5180 2 0x1.06b0afc705a67p7 0x1.08p5 +REG epsg:5180 3 0x1.da9ea071f4b32p6 0x1.58p5 +REG epsg:5180 4 0x1.06b0afc705a67p7 0x1.58p5 +REG epsg:5181 0 0x1.fcp6 0x1.3p5 +REG epsg:5181 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG epsg:5181 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG epsg:5181 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG epsg:5181 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG epsg:5182 0 0x1.fcp6 0x1.3p5 +REG epsg:5182 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG epsg:5182 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG epsg:5182 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG epsg:5182 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG epsg:5183 0 0x1.02p7 0x1.3p5 +REG epsg:5183 1 0x1.ea9ea071f4b32p6 0x1.08p5 +REG epsg:5183 2 0x1.0eb0afc705a67p7 0x1.08p5 +REG epsg:5183 3 0x1.ea9ea071f4b32p6 0x1.58p5 +REG epsg:5183 4 0x1.0eb0afc705a67p7 0x1.58p5 +REG epsg:5184 0 0x1.06p7 0x1.3p5 +REG epsg:5184 1 0x1.f29ea071f4b32p6 0x1.08p5 +REG epsg:5184 2 0x1.12b0afc705a67p7 0x1.08p5 +REG epsg:5184 3 0x1.f29ea071f4b32p6 0x1.58p5 +REG epsg:5184 4 0x1.12b0afc705a67p7 0x1.58p5 +REG epsg:5185 0 0x1.f4p6 0x1.3p5 +REG epsg:5185 1 0x1.da9ea071f4b32p6 0x1.08p5 +REG epsg:5185 2 0x1.06b0afc705a67p7 0x1.08p5 +REG epsg:5185 3 0x1.da9ea071f4b32p6 0x1.58p5 +REG epsg:5185 4 0x1.06b0afc705a67p7 0x1.58p5 +REG epsg:5186 0 0x1.fcp6 0x1.3p5 +REG epsg:5186 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG epsg:5186 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG epsg:5186 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG epsg:5186 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG epsg:5187 0 0x1.02p7 0x1.3p5 +REG epsg:5187 1 0x1.ea9ea071f4b32p6 0x1.08p5 +REG epsg:5187 2 0x1.0eb0afc705a67p7 0x1.08p5 +REG epsg:5187 3 0x1.ea9ea071f4b32p6 0x1.58p5 +REG epsg:5187 4 0x1.0eb0afc705a67p7 0x1.58p5 +REG epsg:5188 0 0x1.06p7 0x1.3p5 +REG epsg:5188 1 0x1.f29ea071f4b32p6 0x1.08p5 +REG epsg:5188 2 0x1.12b0afc705a67p7 0x1.08p5 +REG epsg:5188 3 0x1.f29ea071f4b32p6 0x1.58p5 +REG epsg:5188 4 0x1.12b0afc705a67p7 0x1.58p5 +REG epsg:5221 0 0x1.54p5 0x1.8cp5 +REG epsg:5221 1 0x1.1668c3d6deab4p5 0x1.64p5 +REG epsg:5221 2 0x1.91973c292154cp5 0x1.64p5 +REG epsg:5221 3 0x1.1668c3d6deab4p5 0x1.b4p5 +REG epsg:5221 4 0x1.91973c292154cp5 0x1.b4p5 +REG epsg:5223 0 0x1.8p3 0x0.0p0 +REG epsg:5223 1 0x1.cp2 -0x1.4p2 +REG epsg:5223 2 0x1.1p4 -0x1.4p2 +REG epsg:5223 3 0x1.cp2 0x1.4p2 +REG epsg:5223 4 0x1.1p4 0x1.4p2 +REG epsg:5228 0 0x0.0p0 0x0.0p0 +REG epsg:5228 1 -0x1.4p2 -0x1.4p2 +REG epsg:5228 2 0x1.4p2 -0x1.4p2 +REG epsg:5228 3 -0x1.4p2 0x1.4p2 +REG epsg:5228 4 0x1.4p2 0x1.4p2 +REG epsg:5229 0 0x0.0p0 0x0.0p0 +REG epsg:5229 1 -0x1.4p2 -0x1.4p2 +REG epsg:5229 2 0x1.4p2 -0x1.4p2 +REG epsg:5229 3 -0x1.4p2 0x1.4p2 +REG epsg:5229 4 0x1.4p2 0x1.4p2 +REG epsg:5233 0 0x0.0p0 0x0.0p0 +REG epsg:5233 1 -0x1.4p2 -0x1.4p2 +REG epsg:5233 2 0x1.4p2 -0x1.4p2 +REG epsg:5233 3 -0x1.4p2 0x1.4p2 +REG epsg:5233 4 0x1.4p2 0x1.4p2 +REG epsg:5234 0 0x1.43163b7000ba7p6 0x1.c007de6e564ebp2 +REG epsg:5234 1 0x1.2eefc6ccc455fp6 0x1.000fbcdcac9d6p1 +REG epsg:5234 2 0x1.573cb0133d1efp6 0x1.000fbcdcac9d6p1 +REG epsg:5234 3 0x1.2eefc6ccc455fp6 0x1.8003ef372b276p3 +REG epsg:5234 4 0x1.573cb0133d1efp6 0x1.8003ef372b276p3 +REG epsg:5235 0 0x1.43163bf45b3f8p6 0x1.c007b9bb189f2p2 +REG epsg:5235 1 0x1.2eefc75775c7fp6 0x1.000f7376313e4p1 +REG epsg:5235 2 0x1.573cb09140b71p6 0x1.000f7376313e4p1 +REG epsg:5235 3 0x1.2eefc75775c7fp6 0x1.8003dcdd8c4f9p3 +REG epsg:5235 4 0x1.573cb09140b71p6 0x1.8003dcdd8c4f9p3 +REG epsg:5243 0 0x1.5p3 0x1.9955555555554p5 +REG epsg:5243 1 0x1.435bfb6f51ccp1 0x1.7155555555554p5 +REG epsg:5243 2 0x1.2794809215c68p4 0x1.7155555555554p5 +REG epsg:5243 3 0x1.435bfb6f51ccp1 0x1.c155555555554p5 +REG epsg:5243 4 0x1.2794809215c68p4 0x1.c155555555554p5 +REG epsg:5244 0 0x0.0p0 0x0.0p0 +REG epsg:5244 1 -0x1.4p2 -0x1.4p2 +REG epsg:5244 2 0x1.4p2 -0x1.4p2 +REG epsg:5244 3 -0x1.4p2 0x1.4p2 +REG epsg:5244 4 0x1.4p2 0x1.4p2 +REG epsg:5246 0 0x0.0p0 0x0.0p0 +REG epsg:5246 1 -0x1.4p2 -0x1.4p2 +REG epsg:5246 2 0x1.4p2 -0x1.4p2 +REG epsg:5246 3 -0x1.4p2 0x1.4p2 +REG epsg:5246 4 0x1.4p2 0x1.4p2 +REG epsg:5247 0 0x1.ccp6 0x1.0p2 +REG epsg:5247 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG epsg:5247 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG epsg:5247 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG epsg:5247 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG epsg:5250 0 0x0.0p0 0x0.0p0 +REG epsg:5250 1 -0x1.4p2 -0x1.4p2 +REG epsg:5250 2 0x1.4p2 -0x1.4p2 +REG epsg:5250 3 -0x1.4p2 0x1.4p2 +REG epsg:5250 4 0x1.4p2 0x1.4p2 +REG epsg:5252 0 0x0.0p0 0x0.0p0 +REG epsg:5252 1 -0x1.4p2 -0x1.4p2 +REG epsg:5252 2 0x1.4p2 -0x1.4p2 +REG epsg:5252 3 -0x1.4p2 0x1.4p2 +REG epsg:5252 4 0x1.4p2 0x1.4p2 +REG epsg:5253 0 0x1.bp4 0x0.0p0 +REG epsg:5253 1 0x1.6p4 -0x1.4p2 +REG epsg:5253 2 0x1.0p5 -0x1.4p2 +REG epsg:5253 3 0x1.6p4 0x1.4p2 +REG epsg:5253 4 0x1.0p5 0x1.4p2 +REG epsg:5254 0 0x1.ep4 0x0.0p0 +REG epsg:5254 1 0x1.9p4 -0x1.4p2 +REG epsg:5254 2 0x1.18p5 -0x1.4p2 +REG epsg:5254 3 0x1.9p4 0x1.4p2 +REG epsg:5254 4 0x1.18p5 0x1.4p2 +REG epsg:5255 0 0x1.08p5 0x0.0p0 +REG epsg:5255 1 0x1.cp4 -0x1.4p2 +REG epsg:5255 2 0x1.3p5 -0x1.4p2 +REG epsg:5255 3 0x1.cp4 0x1.4p2 +REG epsg:5255 4 0x1.3p5 0x1.4p2 +REG epsg:5256 0 0x1.2p5 0x0.0p0 +REG epsg:5256 1 0x1.fp4 -0x1.4p2 +REG epsg:5256 2 0x1.48p5 -0x1.4p2 +REG epsg:5256 3 0x1.fp4 0x1.4p2 +REG epsg:5256 4 0x1.48p5 0x1.4p2 +REG epsg:5257 0 0x1.38p5 0x0.0p0 +REG epsg:5257 1 0x1.1p5 -0x1.4p2 +REG epsg:5257 2 0x1.6p5 -0x1.4p2 +REG epsg:5257 3 0x1.1p5 0x1.4p2 +REG epsg:5257 4 0x1.6p5 0x1.4p2 +REG epsg:5258 0 0x1.5p5 0x0.0p0 +REG epsg:5258 1 0x1.28p5 -0x1.4p2 +REG epsg:5258 2 0x1.78p5 -0x1.4p2 +REG epsg:5258 3 0x1.28p5 0x1.4p2 +REG epsg:5258 4 0x1.78p5 0x1.4p2 +REG epsg:5259 0 0x1.68p5 0x0.0p0 +REG epsg:5259 1 0x1.4p5 -0x1.4p2 +REG epsg:5259 2 0x1.9p5 -0x1.4p2 +REG epsg:5259 3 0x1.4p5 0x1.4p2 +REG epsg:5259 4 0x1.9p5 0x1.4p2 +REG epsg:5262 0 0x0.0p0 0x0.0p0 +REG epsg:5262 1 -0x1.4p2 -0x1.4p2 +REG epsg:5262 2 0x1.4p2 -0x1.4p2 +REG epsg:5262 3 -0x1.4p2 0x1.4p2 +REG epsg:5262 4 0x1.4p2 0x1.4p2 +REG epsg:5264 0 0x0.0p0 0x0.0p0 +REG epsg:5264 1 -0x1.4p2 -0x1.4p2 +REG epsg:5264 2 0x1.4p2 -0x1.4p2 +REG epsg:5264 3 -0x1.4p2 0x1.4p2 +REG epsg:5264 4 0x1.4p2 0x1.4p2 +REG epsg:5266 0 0x1.68p6 0x0.0p0 +REG epsg:5266 1 0x1.54p6 -0x1.4p2 +REG epsg:5266 2 0x1.7cp6 -0x1.4p2 +REG epsg:5266 3 0x1.54p6 0x1.4p2 +REG epsg:5266 4 0x1.7cp6 0x1.4p2 +REG epsg:5269 0 0x1.bp4 0x0.0p0 +REG epsg:5269 1 0x1.6p4 -0x1.4p2 +REG epsg:5269 2 0x1.0p5 -0x1.4p2 +REG epsg:5269 3 0x1.6p4 0x1.4p2 +REG epsg:5269 4 0x1.0p5 0x1.4p2 +REG epsg:5270 0 0x1.ep4 0x0.0p0 +REG epsg:5270 1 0x1.9p4 -0x1.4p2 +REG epsg:5270 2 0x1.18p5 -0x1.4p2 +REG epsg:5270 3 0x1.9p4 0x1.4p2 +REG epsg:5270 4 0x1.18p5 0x1.4p2 +REG epsg:5271 0 0x1.08p5 0x0.0p0 +REG epsg:5271 1 0x1.cp4 -0x1.4p2 +REG epsg:5271 2 0x1.3p5 -0x1.4p2 +REG epsg:5271 3 0x1.cp4 0x1.4p2 +REG epsg:5271 4 0x1.3p5 0x1.4p2 +REG epsg:5272 0 0x1.2p5 0x0.0p0 +REG epsg:5272 1 0x1.fp4 -0x1.4p2 +REG epsg:5272 2 0x1.48p5 -0x1.4p2 +REG epsg:5272 3 0x1.fp4 0x1.4p2 +REG epsg:5272 4 0x1.48p5 0x1.4p2 +REG epsg:5273 0 0x1.38p5 0x0.0p0 +REG epsg:5273 1 0x1.1p5 -0x1.4p2 +REG epsg:5273 2 0x1.6p5 -0x1.4p2 +REG epsg:5273 3 0x1.1p5 0x1.4p2 +REG epsg:5273 4 0x1.6p5 0x1.4p2 +REG epsg:5274 0 0x1.5p5 0x0.0p0 +REG epsg:5274 1 0x1.28p5 -0x1.4p2 +REG epsg:5274 2 0x1.78p5 -0x1.4p2 +REG epsg:5274 3 0x1.28p5 0x1.4p2 +REG epsg:5274 4 0x1.78p5 0x1.4p2 +REG epsg:5275 0 0x1.68p5 0x0.0p0 +REG epsg:5275 1 0x1.4p5 -0x1.4p2 +REG epsg:5275 2 0x1.9p5 -0x1.4p2 +REG epsg:5275 3 0x1.4p5 0x1.4p2 +REG epsg:5275 4 0x1.9p5 0x1.4p2 +REG epsg:5292 0 0x1.6aeeeeeeeeeefp6 0x0.0p0 +REG epsg:5292 1 0x1.56eeeeeeeeeefp6 -0x1.4p2 +REG epsg:5292 2 0x1.7eeeeeeeeeeefp6 -0x1.4p2 +REG epsg:5292 3 0x1.56eeeeeeeeeefp6 0x1.4p2 +REG epsg:5292 4 0x1.7eeeeeeeeeeefp6 0x1.4p2 +REG epsg:5293 0 0x1.6633333333333p6 0x0.0p0 +REG epsg:5293 1 0x1.5233333333333p6 -0x1.4p2 +REG epsg:5293 2 0x1.7a33333333333p6 -0x1.4p2 +REG epsg:5293 3 0x1.5233333333333p6 0x1.4p2 +REG epsg:5293 4 0x1.7a33333333333p6 0x1.4p2 +REG epsg:5294 0 0x1.6766666666666p6 0x0.0p0 +REG epsg:5294 1 0x1.5366666666666p6 -0x1.4p2 +REG epsg:5294 2 0x1.7b66666666666p6 -0x1.4p2 +REG epsg:5294 3 0x1.5366666666666p6 0x1.4p2 +REG epsg:5294 4 0x1.7b66666666666p6 0x1.4p2 +REG epsg:5295 0 0x1.6822222222222p6 0x0.0p0 +REG epsg:5295 1 0x1.5422222222222p6 -0x1.4p2 +REG epsg:5295 2 0x1.7c22222222222p6 -0x1.4p2 +REG epsg:5295 3 0x1.5422222222222p6 0x1.4p2 +REG epsg:5295 4 0x1.7c22222222222p6 0x1.4p2 +REG epsg:5296 0 0x1.689999999999ap6 0x0.0p0 +REG epsg:5296 1 0x1.549999999999ap6 -0x1.4p2 +REG epsg:5296 2 0x1.7c9999999999ap6 -0x1.4p2 +REG epsg:5296 3 0x1.549999999999ap6 0x1.4p2 +REG epsg:5296 4 0x1.7c9999999999ap6 0x1.4p2 +REG epsg:5297 0 0x1.6c88888888889p6 0x0.0p0 +REG epsg:5297 1 0x1.5888888888889p6 -0x1.4p2 +REG epsg:5297 2 0x1.8088888888889p6 -0x1.4p2 +REG epsg:5297 3 0x1.5888888888889p6 0x1.4p2 +REG epsg:5297 4 0x1.8088888888889p6 0x1.4p2 +REG epsg:5298 0 0x1.6ceeeeeeeeeefp6 0x0.0p0 +REG epsg:5298 1 0x1.58eeeeeeeeeefp6 -0x1.4p2 +REG epsg:5298 2 0x1.80eeeeeeeeeefp6 -0x1.4p2 +REG epsg:5298 3 0x1.58eeeeeeeeeefp6 0x1.4p2 +REG epsg:5298 4 0x1.80eeeeeeeeeefp6 0x1.4p2 +REG epsg:5299 0 0x1.6566666666666p6 0x0.0p0 +REG epsg:5299 1 0x1.5166666666666p6 -0x1.4p2 +REG epsg:5299 2 0x1.7966666666666p6 -0x1.4p2 +REG epsg:5299 3 0x1.5166666666666p6 0x1.4p2 +REG epsg:5299 4 0x1.7966666666666p6 0x1.4p2 +REG epsg:5300 0 0x1.6d66666666666p6 0x0.0p0 +REG epsg:5300 1 0x1.5966666666666p6 -0x1.4p2 +REG epsg:5300 2 0x1.8166666666666p6 -0x1.4p2 +REG epsg:5300 3 0x1.5966666666666p6 0x1.4p2 +REG epsg:5300 4 0x1.8166666666666p6 0x1.4p2 +REG epsg:5301 0 0x1.6766666666666p6 0x0.0p0 +REG epsg:5301 1 0x1.5366666666666p6 -0x1.4p2 +REG epsg:5301 2 0x1.7b66666666666p6 -0x1.4p2 +REG epsg:5301 3 0x1.5366666666666p6 0x1.4p2 +REG epsg:5301 4 0x1.7b66666666666p6 0x1.4p2 +REG epsg:5302 0 0x1.6e44444444444p6 0x0.0p0 +REG epsg:5302 1 0x1.5a44444444444p6 -0x1.4p2 +REG epsg:5302 2 0x1.8244444444444p6 -0x1.4p2 +REG epsg:5302 3 0x1.5a44444444444p6 0x1.4p2 +REG epsg:5302 4 0x1.8244444444444p6 0x1.4p2 +REG epsg:5303 0 0x1.6444444444444p6 0x0.0p0 +REG epsg:5303 1 0x1.5044444444444p6 -0x1.4p2 +REG epsg:5303 2 0x1.7844444444444p6 -0x1.4p2 +REG epsg:5303 3 0x1.5044444444444p6 0x1.4p2 +REG epsg:5303 4 0x1.7844444444444p6 0x1.4p2 +REG epsg:5304 0 0x1.6911111111111p6 0x0.0p0 +REG epsg:5304 1 0x1.5511111111111p6 -0x1.4p2 +REG epsg:5304 2 0x1.7d11111111111p6 -0x1.4p2 +REG epsg:5304 3 0x1.5511111111111p6 0x1.4p2 +REG epsg:5304 4 0x1.7d11111111111p6 0x1.4p2 +REG epsg:5305 0 0x1.6633333333333p6 0x0.0p0 +REG epsg:5305 1 0x1.5233333333333p6 -0x1.4p2 +REG epsg:5305 2 0x1.7a33333333333p6 -0x1.4p2 +REG epsg:5305 3 0x1.5233333333333p6 0x1.4p2 +REG epsg:5305 4 0x1.7a33333333333p6 0x1.4p2 +REG epsg:5306 0 0x1.6fp6 0x0.0p0 +REG epsg:5306 1 0x1.5bp6 -0x1.4p2 +REG epsg:5306 2 0x1.83p6 -0x1.4p2 +REG epsg:5306 3 0x1.5bp6 0x1.4p2 +REG epsg:5306 4 0x1.83p6 0x1.4p2 +REG epsg:5307 0 0x1.6ap6 0x0.0p0 +REG epsg:5307 1 0x1.56p6 -0x1.4p2 +REG epsg:5307 2 0x1.7ep6 -0x1.4p2 +REG epsg:5307 3 0x1.56p6 0x1.4p2 +REG epsg:5307 4 0x1.7ep6 0x1.4p2 +REG epsg:5308 0 0x1.68aaaaaaaaaabp6 0x0.0p0 +REG epsg:5308 1 0x1.54aaaaaaaaaabp6 -0x1.4p2 +REG epsg:5308 2 0x1.7caaaaaaaaaabp6 -0x1.4p2 +REG epsg:5308 3 0x1.54aaaaaaaaaabp6 0x1.4p2 +REG epsg:5308 4 0x1.7caaaaaaaaaabp6 0x1.4p2 +REG epsg:5309 0 0x1.6877777777777p6 0x0.0p0 +REG epsg:5309 1 0x1.5477777777777p6 -0x1.4p2 +REG epsg:5309 2 0x1.7c77777777777p6 -0x1.4p2 +REG epsg:5309 3 0x1.5477777777777p6 0x1.4p2 +REG epsg:5309 4 0x1.7c77777777777p6 0x1.4p2 +REG epsg:5310 0 0x1.6e44444444444p6 0x0.0p0 +REG epsg:5310 1 0x1.5a44444444444p6 -0x1.4p2 +REG epsg:5310 2 0x1.8244444444444p6 -0x1.4p2 +REG epsg:5310 3 0x1.5a44444444444p6 0x1.4p2 +REG epsg:5310 4 0x1.8244444444444p6 0x1.4p2 +REG epsg:5311 0 0x1.6b77777777777p6 0x0.0p0 +REG epsg:5311 1 0x1.5777777777777p6 -0x1.4p2 +REG epsg:5311 2 0x1.7f77777777777p6 -0x1.4p2 +REG epsg:5311 3 0x1.5777777777777p6 0x1.4p2 +REG epsg:5311 4 0x1.7f77777777777p6 0x1.4p2 +REG epsg:5316 0 -0x1.cp2 0x0.0p0 +REG epsg:5316 1 -0x1.8p3 -0x1.4p2 +REG epsg:5316 2 -0x1.0p1 -0x1.4p2 +REG epsg:5316 3 -0x1.8p3 0x1.4p2 +REG epsg:5316 4 -0x1.0p1 0x1.4p2 +REG epsg:5318 0 -0x1.cp2 0x0.0p0 +REG epsg:5318 1 -0x1.8p3 -0x1.4p2 +REG epsg:5318 2 -0x1.0p1 -0x1.4p2 +REG epsg:5318 3 -0x1.8p3 0x1.4p2 +REG epsg:5318 4 -0x1.0p1 0x1.4p2 +REG epsg:5320 0 -0x1.5p6 0x1.b4p4 +REG epsg:5320 1 -0x1.937d81d3381cep6 0x1.88p3 +REG epsg:5320 2 -0x1.0c827e2cc7e32p6 0x1.88p3 +REG epsg:5320 3 -0x1.937d81d3381cep6 0x1.52p5 +REG epsg:5320 4 -0x1.0c827e2cc7e32p6 0x1.52p5 +REG epsg:5321 0 -0x1.5p6 0x1.b4p4 +REG epsg:5321 1 -0x1.937d81d3381cep6 0x1.88p3 +REG epsg:5321 2 -0x1.0c827e2cc7e32p6 0x1.88p3 +REG epsg:5321 3 -0x1.937d81d3381cep6 0x1.52p5 +REG epsg:5321 4 -0x1.0c827e2cc7e32p6 0x1.52p5 +REG epsg:5322 0 0x0.0p0 0x0.0p0 +REG epsg:5322 1 -0x1.4p2 -0x1.4p2 +REG epsg:5322 2 0x1.4p2 -0x1.4p2 +REG epsg:5322 3 -0x1.4p2 0x1.4p2 +REG epsg:5322 4 0x1.4p2 0x1.4p2 +REG epsg:5324 0 0x0.0p0 0x0.0p0 +REG epsg:5324 1 -0x1.4p2 -0x1.4p2 +REG epsg:5324 2 0x1.4p2 -0x1.4p2 +REG epsg:5324 3 -0x1.4p2 0x1.4p2 +REG epsg:5324 4 0x1.4p2 0x1.4p2 +REG epsg:5325 0 -0x1.3p4 0x1.04p6 +REG epsg:5325 1 -0x1.68c9f1497133ap4 0x1.fcp5 +REG epsg:5325 2 -0x1.ee6c1d6d1d98cp3 0x1.fcp5 +REG epsg:5325 3 -0x1.68c9f1497133ap4 0x1.0ap6 +REG epsg:5325 4 -0x1.ee6c1d6d1d98cp3 0x1.0ap6 +REG epsg:5329 0 0x1.989ca634e2481p1 0x0.0p0 +REG epsg:5329 1 -0x1.cec6b3963b6fep0 -0x1.4p2 +REG epsg:5329 2 0x1.0627298d3892p3 -0x1.4p2 +REG epsg:5329 3 -0x1.cec6b3963b6fep0 0x1.4p2 +REG epsg:5329 4 0x1.0627298d3892p3 0x1.4p2 +REG epsg:5330 0 0x1.989ca634e2481p1 0x0.0p0 +REG epsg:5330 1 -0x1.cec6b3963b6fep0 -0x1.4p2 +REG epsg:5330 2 0x1.0627298d3892p3 -0x1.4p2 +REG epsg:5330 3 -0x1.cec6b3963b6fep0 0x1.4p2 +REG epsg:5330 4 0x1.0627298d3892p3 0x1.4p2 +REG epsg:5331 0 0x1.989ca634e2481p1 0x0.0p0 +REG epsg:5331 1 -0x1.cec6b3963b6fep0 -0x1.4p2 +REG epsg:5331 2 0x1.0627298d3892p3 -0x1.4p2 +REG epsg:5331 3 -0x1.cec6b3963b6fep0 0x1.4p2 +REG epsg:5331 4 0x1.0627298d3892p3 0x1.4p2 +REG epsg:5332 0 0x0.0p0 0x0.0p0 +REG epsg:5332 1 -0x1.4p2 -0x1.4p2 +REG epsg:5332 2 0x1.4p2 -0x1.4p2 +REG epsg:5332 3 -0x1.4p2 0x1.4p2 +REG epsg:5332 4 0x1.4p2 0x1.4p2 +REG epsg:5337 0 -0x1.08p5 -0x1.9p4 +REG epsg:5337 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:5337 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:5337 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:5337 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:5340 0 0x0.0p0 0x0.0p0 +REG epsg:5340 1 -0x1.4p2 -0x1.4p2 +REG epsg:5340 2 0x1.4p2 -0x1.4p2 +REG epsg:5340 3 -0x1.4p2 0x1.4p2 +REG epsg:5340 4 0x1.4p2 0x1.4p2 +REG epsg:5341 0 0x0.0p0 0x0.0p0 +REG epsg:5341 1 -0x1.4p2 -0x1.4p2 +REG epsg:5341 2 0x1.4p2 -0x1.4p2 +REG epsg:5341 3 -0x1.4p2 0x1.4p2 +REG epsg:5341 4 0x1.4p2 0x1.4p2 +REG epsg:5343 0 -0x1.2p6 -0x1.64p6 +REG epsg:5343 1 -0x1.08p7 -0x1.64p6 +REG epsg:5343 2 -0x1.8p3 -0x1.64p6 +REG epsg:5343 3 -0x1.08p7 -0x1.54p6 +REG epsg:5343 4 -0x1.8p3 -0x1.54p6 +REG epsg:5344 0 -0x1.14p6 -0x1.64p6 +REG epsg:5344 1 -0x1.02p7 -0x1.64p6 +REG epsg:5344 2 -0x1.2p3 -0x1.64p6 +REG epsg:5344 3 -0x1.02p7 -0x1.54p6 +REG epsg:5344 4 -0x1.2p3 -0x1.54p6 +REG epsg:5345 0 -0x1.08p6 -0x1.64p6 +REG epsg:5345 1 -0x1.f8p6 -0x1.64p6 +REG epsg:5345 2 -0x1.8p2 -0x1.64p6 +REG epsg:5345 3 -0x1.f8p6 -0x1.54p6 +REG epsg:5345 4 -0x1.8p2 -0x1.54p6 +REG epsg:5346 0 -0x1.f8p5 -0x1.64p6 +REG epsg:5346 1 -0x1.ecp6 -0x1.64p6 +REG epsg:5346 2 -0x1.8p1 -0x1.64p6 +REG epsg:5346 3 -0x1.ecp6 -0x1.54p6 +REG epsg:5346 4 -0x1.8p1 -0x1.54p6 +REG epsg:5347 0 -0x1.ep5 -0x1.64p6 +REG epsg:5347 1 -0x1.ep6 -0x1.64p6 +REG epsg:5347 2 0x0.0p0 -0x1.64p6 +REG epsg:5347 3 -0x1.ep6 -0x1.54p6 +REG epsg:5347 4 0x0.0p0 -0x1.54p6 +REG epsg:5348 0 -0x1.c8p5 -0x1.64p6 +REG epsg:5348 1 -0x1.d4p6 -0x1.64p6 +REG epsg:5348 2 0x1.8p1 -0x1.64p6 +REG epsg:5348 3 -0x1.d4p6 -0x1.54p6 +REG epsg:5348 4 0x1.8p1 -0x1.54p6 +REG epsg:5349 0 -0x1.bp5 -0x1.64p6 +REG epsg:5349 1 -0x1.c8p6 -0x1.64p6 +REG epsg:5349 2 0x1.8p2 -0x1.64p6 +REG epsg:5349 3 -0x1.c8p6 -0x1.54p6 +REG epsg:5349 4 0x1.8p2 -0x1.54p6 +REG epsg:5352 0 0x0.0p0 0x0.0p0 +REG epsg:5352 1 -0x1.4p2 -0x1.4p2 +REG epsg:5352 2 0x1.4p2 -0x1.4p2 +REG epsg:5352 3 -0x1.4p2 0x1.4p2 +REG epsg:5352 4 0x1.4p2 0x1.4p2 +REG epsg:5354 0 0x0.0p0 0x0.0p0 +REG epsg:5354 1 -0x1.4p2 -0x1.4p2 +REG epsg:5354 2 0x1.4p2 -0x1.4p2 +REG epsg:5354 3 -0x1.4p2 0x1.4p2 +REG epsg:5354 4 0x1.4p2 0x1.4p2 +REG epsg:5355 0 -0x1.f8p5 -0x1.9p4 +REG epsg:5355 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:5355 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:5355 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:5355 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:5356 0 -0x1.14p6 -0x1.9p4 +REG epsg:5356 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:5356 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:5356 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:5356 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:5357 0 -0x1.c8p5 -0x1.9p4 +REG epsg:5357 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:5357 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5357 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:5357 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5358 0 0x0.0p0 0x0.0p0 +REG epsg:5358 1 -0x1.4p2 -0x1.4p2 +REG epsg:5358 2 0x1.4p2 -0x1.4p2 +REG epsg:5358 3 -0x1.4p2 0x1.4p2 +REG epsg:5358 4 0x1.4p2 0x1.4p2 +REG epsg:5360 0 0x0.0p0 0x0.0p0 +REG epsg:5360 1 -0x1.4p2 -0x1.4p2 +REG epsg:5360 2 0x1.4p2 -0x1.4p2 +REG epsg:5360 3 -0x1.4p2 0x1.4p2 +REG epsg:5360 4 0x1.4p2 0x1.4p2 +REG epsg:5361 0 -0x1.14p6 -0x1.9p4 +REG epsg:5361 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:5361 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:5361 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:5361 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:5362 0 -0x1.2cp6 -0x1.9p4 +REG epsg:5362 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:5362 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:5362 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:5362 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:5363 0 0x0.0p0 0x0.0p0 +REG epsg:5363 1 -0x1.4p2 -0x1.4p2 +REG epsg:5363 2 0x1.4p2 -0x1.4p2 +REG epsg:5363 3 -0x1.4p2 0x1.4p2 +REG epsg:5363 4 0x1.4p2 0x1.4p2 +REG epsg:5365 0 0x0.0p0 0x0.0p0 +REG epsg:5365 1 -0x1.4p2 -0x1.4p2 +REG epsg:5365 2 0x1.4p2 -0x1.4p2 +REG epsg:5365 3 -0x1.4p2 0x1.4p2 +REG epsg:5365 4 0x1.4p2 0x1.4p2 +REG epsg:5367 0 -0x1.5p6 0x0.0p0 +REG epsg:5367 1 -0x1.64p6 -0x1.4p2 +REG epsg:5367 2 -0x1.3cp6 -0x1.4p2 +REG epsg:5367 3 -0x1.64p6 0x1.4p2 +REG epsg:5367 4 -0x1.3cp6 0x1.4p2 +REG epsg:5368 0 0x0.0p0 0x0.0p0 +REG epsg:5368 1 -0x1.4p2 -0x1.4p2 +REG epsg:5368 2 0x1.4p2 -0x1.4p2 +REG epsg:5368 3 -0x1.4p2 0x1.4p2 +REG epsg:5368 4 0x1.4p2 0x1.4p2 +REG epsg:5369 0 0x0.0p0 0x0.0p0 +REG epsg:5369 1 -0x1.4p2 -0x1.4p2 +REG epsg:5369 2 0x1.4p2 -0x1.4p2 +REG epsg:5369 3 -0x1.4p2 0x1.4p2 +REG epsg:5369 4 0x1.4p2 0x1.4p2 +REG epsg:5371 0 0x0.0p0 0x0.0p0 +REG epsg:5371 1 -0x1.4p2 -0x1.4p2 +REG epsg:5371 2 0x1.4p2 -0x1.4p2 +REG epsg:5371 3 -0x1.4p2 0x1.4p2 +REG epsg:5371 4 0x1.4p2 0x1.4p2 +REG epsg:5373 0 0x0.0p0 0x0.0p0 +REG epsg:5373 1 -0x1.4p2 -0x1.4p2 +REG epsg:5373 2 0x1.4p2 -0x1.4p2 +REG epsg:5373 3 -0x1.4p2 0x1.4p2 +REG epsg:5373 4 0x1.4p2 0x1.4p2 +REG epsg:5379 0 0x0.0p0 0x0.0p0 +REG epsg:5379 1 -0x1.4p2 -0x1.4p2 +REG epsg:5379 2 0x1.4p2 -0x1.4p2 +REG epsg:5379 3 -0x1.4p2 0x1.4p2 +REG epsg:5379 4 0x1.4p2 0x1.4p2 +REG epsg:5381 0 0x0.0p0 0x0.0p0 +REG epsg:5381 1 -0x1.4p2 -0x1.4p2 +REG epsg:5381 2 0x1.4p2 -0x1.4p2 +REG epsg:5381 3 -0x1.4p2 0x1.4p2 +REG epsg:5381 4 0x1.4p2 0x1.4p2 +REG epsg:5382 0 -0x1.c8p5 -0x1.9p4 +REG epsg:5382 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:5382 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5382 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:5382 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5383 0 -0x1.98p5 -0x1.9p4 +REG epsg:5383 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:5383 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5383 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:5383 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5387 0 -0x1.2cp6 -0x1.9p4 +REG epsg:5387 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:5387 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:5387 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:5387 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:5388 0 -0x1.44p6 0x0.0p0 +REG epsg:5388 1 -0x1.58p6 -0x1.4p2 +REG epsg:5388 2 -0x1.3p6 -0x1.4p2 +REG epsg:5388 3 -0x1.58p6 0x1.4p2 +REG epsg:5388 4 -0x1.3p6 0x1.4p2 +REG epsg:5389 0 -0x1.14p6 -0x1.9p4 +REG epsg:5389 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:5389 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:5389 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:5389 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:5391 0 0x0.0p0 0x0.0p0 +REG epsg:5391 1 -0x1.4p2 -0x1.4p2 +REG epsg:5391 2 0x1.4p2 -0x1.4p2 +REG epsg:5391 3 -0x1.4p2 0x1.4p2 +REG epsg:5391 4 0x1.4p2 0x1.4p2 +REG epsg:5393 0 0x0.0p0 0x0.0p0 +REG epsg:5393 1 -0x1.4p2 -0x1.4p2 +REG epsg:5393 2 0x1.4p2 -0x1.4p2 +REG epsg:5393 3 -0x1.4p2 0x1.4p2 +REG epsg:5393 4 0x1.4p2 0x1.4p2 +REG epsg:5396 0 -0x1.bp4 -0x1.9p4 +REG epsg:5396 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG epsg:5396 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG epsg:5396 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG epsg:5396 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG epsg:5451 0 0x0.0p0 0x0.0p0 +REG epsg:5451 1 -0x1.4p2 -0x1.4p2 +REG epsg:5451 2 0x1.4p2 -0x1.4p2 +REG epsg:5451 3 -0x1.4p2 0x1.4p2 +REG epsg:5451 4 0x1.4p2 0x1.4p2 +REG epsg:5456 0 -0x1.5155555555555p6 0x1.4eeeeeeeeeef1p3 +REG epsg:5456 1 -0x1.65abf7bf7a7a1p6 0x1.5dddddddddde2p2 +REG epsg:5456 2 -0x1.3cfeb2eb30309p6 0x1.5dddddddddde2p2 +REG epsg:5456 3 -0x1.65abf7bf7a7a1p6 0x1.eeeeeeeeeeef1p3 +REG epsg:5456 4 -0x1.3cfeb2eb30309p6 0x1.eeeeeeeeeeef1p3 +REG epsg:5457 0 -0x1.4eaaaaaaaaaabp6 0x1.2p3 +REG epsg:5457 1 -0x1.62ea7cf4d2aabp6 0x1.0p2 +REG epsg:5457 2 -0x1.3a6ad86082aabp6 0x1.0p2 +REG epsg:5457 3 -0x1.62ea7cf4d2aabp6 0x1.cp3 +REG epsg:5457 4 -0x1.3a6ad86082aabp6 0x1.cp3 +REG epsg:5458 0 -0x1.6955555555555p6 0x1.0d11111111112p4 +REG epsg:5458 1 -0x1.7e3a11ecca027p6 0x1.7a22222222224p3 +REG epsg:5458 2 -0x1.547098bde0a83p6 0x1.7a22222222224p3 +REG epsg:5458 3 -0x1.7e3a11ecca027p6 0x1.5d11111111112p4 +REG epsg:5458 4 -0x1.547098bde0a83p6 0x1.5d11111111112p4 +REG epsg:5459 0 -0x1.6955555555555p6 0x1.dcccccccccccdp3 +REG epsg:5459 1 -0x1.7e077a4bda7ebp6 0x1.3cccccccccccdp3 +REG epsg:5459 2 -0x1.54a3305ed02bfp6 0x1.3cccccccccccdp3 +REG epsg:5459 3 -0x1.7e077a4bda7ebp6 0x1.3e66666666666p4 +REG epsg:5459 4 -0x1.54a3305ed02bfp6 0x1.3e66666666666p4 +REG epsg:5460 0 -0x1.64p6 0x1.b91111111110fp3 +REG epsg:5460 1 -0x1.7897cf19bc277p6 0x1.191111111110fp3 +REG epsg:5460 2 -0x1.4f6830e643d89p6 0x1.191111111110fp3 +REG epsg:5460 3 -0x1.7897cf19bc277p6 0x1.2c88888888888p4 +REG epsg:5460 4 -0x1.4f6830e643d89p6 0x1.2c88888888888p4 +REG epsg:5461 0 -0x1.56p6 0x1.bbbbbbbbbbbbep3 +REG epsg:5461 1 -0x1.6a99b23a23b5p6 0x1.1bbbbbbbbbbbep3 +REG epsg:5461 2 -0x1.41664dc5dc4bp6 0x1.1bbbbbbbbbbbep3 +REG epsg:5461 3 -0x1.6a99b23a23b5p6 0x1.2dddddddddddfp4 +REG epsg:5461 4 -0x1.41664dc5dc4bp6 0x1.2dddddddddddfp4 +REG epsg:5462 0 -0x1.56p6 0x1.7777777777776p3 +REG epsg:5462 1 -0x1.6a6d446c2c6c8p6 0x1.aeeeeeeeeeeecp2 +REG epsg:5462 2 -0x1.4192bb93d3938p6 0x1.aeeeeeeeeeeecp2 +REG epsg:5462 3 -0x1.6a6d446c2c6c8p6 0x1.0bbbbbbbbbbbbp4 +REG epsg:5462 4 -0x1.4192bb93d3938p6 0x1.0bbbbbbbbbbbbp4 +REG epsg:5463 0 -0x1.44p6 0x0.0p0 +REG epsg:5463 1 -0x1.58p6 -0x1.4p2 +REG epsg:5463 2 -0x1.3p6 -0x1.4p2 +REG epsg:5463 3 -0x1.58p6 0x1.4p2 +REG epsg:5463 4 -0x1.3p6 0x1.4p2 +REG epsg:5464 0 0x0.0p0 0x0.0p0 +REG epsg:5464 1 -0x1.4p2 -0x1.4p2 +REG epsg:5464 2 0x1.4p2 -0x1.4p2 +REG epsg:5464 3 -0x1.4p2 0x1.4p2 +REG epsg:5464 4 0x1.4p2 0x1.4p2 +REG epsg:5466 0 -0x1.628705a708edep6 0x1.10fad8d548846p4 +REG epsg:5466 1 -0x1.7772b79445786p6 0x1.81f5b1aa9108cp3 +REG epsg:5466 2 -0x1.4d9b53b9cc636p6 0x1.81f5b1aa9108cp3 +REG epsg:5466 3 -0x1.7772b79445786p6 0x1.60fad8d548846p4 +REG epsg:5466 4 -0x1.4d9b53b9cc636p6 0x1.60fad8d548846p4 +REG epsg:5467 0 0x0.0p0 0x0.0p0 +REG epsg:5467 1 -0x1.4p2 -0x1.4p2 +REG epsg:5467 2 0x1.4p2 -0x1.4p2 +REG epsg:5467 3 -0x1.4p2 0x1.4p2 +REG epsg:5467 4 0x1.4p2 0x1.4p2 +REG epsg:5469 0 -0x1.4p6 0x1.0d55555555555p3 +REG epsg:5469 1 -0x1.5437be6a5625ep6 0x1.b555555555554p1 +REG epsg:5469 2 -0x1.2bc84195a9da2p6 0x1.b555555555554p1 +REG epsg:5469 3 -0x1.5437be6a5625ep6 0x1.ad55555555555p3 +REG epsg:5469 4 -0x1.2bc84195a9da2p6 0x1.ad55555555555p3 +REG epsg:5472 0 -0x1.44p6 0x1.08p3 +REG epsg:5472 1 -0x1.583589f8d9a43p6 0x1.ap1 +REG epsg:5472 2 -0x1.2fca7607265bdp6 0x1.ap1 +REG epsg:5472 3 -0x1.583589f8d9a43p6 0x1.a8p3 +REG epsg:5472 4 -0x1.2fca7607265bdp6 0x1.a8p3 +REG epsg:5479 0 0x1.46p7 -0x1.38p6 +REG epsg:5479 1 0x1.2c591bfffa017p7 -0x1.42aaaaaaaaaaap6 +REG epsg:5479 2 0x1.5fa6e40005fe9p7 -0x1.42aaaaaaaaaaap6 +REG epsg:5479 3 0x1.2c591bfffa017p7 -0x1.2d55555555556p6 +REG epsg:5479 4 0x1.5fa6e40005fe9p7 -0x1.2d55555555556p6 +REG epsg:5480 0 0x1.4ap7 -0x1.2ap6 +REG epsg:5480 1 0x1.3d86d888b6a03p7 -0x1.30aaaaaaaaaaap6 +REG epsg:5480 2 0x1.56792777495fdp7 -0x1.30aaaaaaaaaaap6 +REG epsg:5480 3 0x1.3d86d888b6a03p7 -0x1.2355555555556p6 +REG epsg:5480 4 0x1.56792777495fdp7 -0x1.2355555555556p6 +REG epsg:5481 0 0x1.4cp7 -0x1.1ep6 +REG epsg:5481 1 0x1.417eae6c4e8eep7 -0x1.24aaaaaaaaaaap6 +REG epsg:5481 2 0x1.56815193b1712p7 -0x1.24aaaaaaaaaaap6 +REG epsg:5481 3 0x1.417eae6c4e8eep7 -0x1.1755555555556p6 +REG epsg:5481 4 0x1.56815193b1712p7 -0x1.1755555555556p6 +REG epsg:5482 0 -0x1.68p7 -0x1.64p6 +REG epsg:5482 1 0x1.ep6 -0x1.64p6 +REG epsg:5482 2 -0x1.ep6 -0x1.64p6 +REG epsg:5482 3 0x1.ep6 -0x1.54p6 +REG epsg:5482 4 -0x1.ep6 -0x1.54p6 +REG epsg:5487 0 0x0.0p0 0x0.0p0 +REG epsg:5487 1 -0x1.4p2 -0x1.4p2 +REG epsg:5487 2 0x1.4p2 -0x1.4p2 +REG epsg:5487 3 -0x1.4p2 0x1.4p2 +REG epsg:5487 4 0x1.4p2 0x1.4p2 +REG epsg:5489 0 0x0.0p0 0x0.0p0 +REG epsg:5489 1 -0x1.4p2 -0x1.4p2 +REG epsg:5489 2 0x1.4p2 -0x1.4p2 +REG epsg:5489 3 -0x1.4p2 0x1.4p2 +REG epsg:5489 4 0x1.4p2 0x1.4p2 +REG epsg:5490 0 -0x1.f8p5 0x0.0p0 +REG epsg:5490 1 -0x1.1p6 -0x1.4p2 +REG epsg:5490 2 -0x1.dp5 -0x1.4p2 +REG epsg:5490 3 -0x1.1p6 0x1.4p2 +REG epsg:5490 4 -0x1.dp5 0x1.4p2 +REG epsg:5498 0 -0x1.9p6 0x1.68p5 +REG epsg:5498 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG epsg:5498 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG epsg:5498 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG epsg:5498 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG epsg:5499 0 0x0.0p0 0x0.0p0 +REG epsg:5499 1 -0x1.4p2 -0x1.4p2 +REG epsg:5499 2 0x1.4p2 -0x1.4p2 +REG epsg:5499 3 -0x1.4p2 0x1.4p2 +REG epsg:5499 4 0x1.4p2 0x1.4p2 +REG epsg:5500 0 0x0.0p0 0x0.0p0 +REG epsg:5500 1 -0x1.4p2 -0x1.4p2 +REG epsg:5500 2 0x1.4p2 -0x1.4p2 +REG epsg:5500 3 -0x1.4p2 0x1.4p2 +REG epsg:5500 4 0x1.4p2 0x1.4p2 +REG epsg:5513 0 0x1.8d55555555554p4 0x1.8cp5 +REG epsg:5513 1 0x1.1226dd0312abdp4 0x1.64p5 +REG epsg:5513 2 0x1.0441e6d3cbff6p5 0x1.64p5 +REG epsg:5513 3 0x1.1226dd0312abdp4 0x1.b4p5 +REG epsg:5513 4 0x1.0441e6d3cbff6p5 0x1.b4p5 +REG epsg:5514 0 0x1.8d55555555554p4 0x1.8cp5 +REG epsg:5514 1 0x1.1226dd0312abdp4 0x1.64p5 +REG epsg:5514 2 0x1.0441e6d3cbff6p5 0x1.64p5 +REG epsg:5514 3 0x1.1226dd0312abdp4 0x1.b4p5 +REG epsg:5514 4 0x1.0441e6d3cbff6p5 0x1.b4p5 +REG epsg:5518 0 -0x1.61p7 -0x1.6p5 +REG epsg:5518 1 0x1.61192e6394ef4p7 -0x1.88p5 +REG epsg:5518 2 -0x1.53192e6394ef4p7 -0x1.88p5 +REG epsg:5518 3 0x1.61192e6394ef4p7 -0x1.38p5 +REG epsg:5518 4 -0x1.53192e6394ef4p7 -0x1.38p5 +REG epsg:5519 0 -0x1.61p7 -0x1.6p5 +REG epsg:5519 1 0x1.61192e6394ef4p7 -0x1.88p5 +REG epsg:5519 2 -0x1.53192e6394ef4p7 -0x1.88p5 +REG epsg:5519 3 0x1.61192e6394ef4p7 -0x1.38p5 +REG epsg:5519 4 -0x1.53192e6394ef4p7 -0x1.38p5 +REG epsg:5520 0 0x1.8p1 0x0.0p0 +REG epsg:5520 1 -0x1.0p1 -0x1.4p2 +REG epsg:5520 2 0x1.0p3 -0x1.4p2 +REG epsg:5520 3 -0x1.0p1 0x1.4p2 +REG epsg:5520 4 0x1.0p3 0x1.4p2 +REG epsg:5523 0 0x1.7p3 0x0.0p0 +REG epsg:5523 1 0x1.ap2 -0x1.4p2 +REG epsg:5523 2 0x1.08p4 -0x1.4p2 +REG epsg:5523 3 0x1.ap2 0x1.4p2 +REG epsg:5523 4 0x1.08p4 0x1.4p2 +REG epsg:5524 0 0x0.0p0 0x0.0p0 +REG epsg:5524 1 -0x1.4p2 -0x1.4p2 +REG epsg:5524 2 0x1.4p2 -0x1.4p2 +REG epsg:5524 3 -0x1.4p2 0x1.4p2 +REG epsg:5524 4 0x1.4p2 0x1.4p2 +REG epsg:5527 0 0x0.0p0 0x0.0p0 +REG epsg:5527 1 -0x1.4p2 -0x1.4p2 +REG epsg:5527 2 0x1.4p2 -0x1.4p2 +REG epsg:5527 3 -0x1.4p2 0x1.4p2 +REG epsg:5527 4 0x1.4p2 0x1.4p2 +REG epsg:5530 0 -0x1.bp5 0x0.0p0 +REG epsg:5530 1 -0x1.d8p5 -0x1.4p2 +REG epsg:5530 2 -0x1.88p5 -0x1.4p2 +REG epsg:5530 3 -0x1.d8p5 0x1.4p2 +REG epsg:5530 4 -0x1.88p5 0x1.4p2 +REG epsg:5531 0 -0x1.c8p5 -0x1.9p4 +REG epsg:5531 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:5531 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5531 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:5531 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5532 0 -0x1.98p5 -0x1.9p4 +REG epsg:5532 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:5532 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5532 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:5532 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5533 0 -0x1.68p5 -0x1.9p4 +REG epsg:5533 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:5533 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5533 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:5533 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5534 0 -0x1.38p5 -0x1.9p4 +REG epsg:5534 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:5534 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5534 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:5534 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5535 0 -0x1.08p5 -0x1.9p4 +REG epsg:5535 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG epsg:5535 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG epsg:5535 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG epsg:5535 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG epsg:5536 0 -0x1.c8p5 -0x1.9p4 +REG epsg:5536 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:5536 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5536 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:5536 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5537 0 -0x1.98p5 -0x1.9p4 +REG epsg:5537 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:5537 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5537 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:5537 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5538 0 -0x1.68p5 -0x1.9p4 +REG epsg:5538 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:5538 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5538 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:5538 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5539 0 -0x1.38p5 -0x1.9p4 +REG epsg:5539 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:5539 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5539 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:5539 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5544 0 0x0.0p0 0x0.0p0 +REG epsg:5544 1 -0x1.4p2 -0x1.4p2 +REG epsg:5544 2 0x1.4p2 -0x1.4p2 +REG epsg:5544 3 -0x1.4p2 0x1.4p2 +REG epsg:5544 4 0x1.4p2 0x1.4p2 +REG epsg:5546 0 0x0.0p0 0x0.0p0 +REG epsg:5546 1 -0x1.4p2 -0x1.4p2 +REG epsg:5546 2 0x1.4p2 -0x1.4p2 +REG epsg:5546 3 -0x1.4p2 0x1.4p2 +REG epsg:5546 4 0x1.4p2 0x1.4p2 +REG epsg:5550 0 0x1.1ap7 -0x1.9p4 +REG epsg:5550 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:5550 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:5550 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:5550 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:5551 0 0x1.26p7 -0x1.9p4 +REG epsg:5551 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:5551 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:5551 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:5551 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:5552 0 0x1.32p7 -0x1.9p4 +REG epsg:5552 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:5552 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:5552 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:5552 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:5554 0 0x1.8p1 0x0.0p0 +REG epsg:5554 1 -0x1.0p1 -0x1.4p2 +REG epsg:5554 2 0x1.0p3 -0x1.4p2 +REG epsg:5554 3 -0x1.0p1 0x1.4p2 +REG epsg:5554 4 0x1.0p3 0x1.4p2 +REG epsg:5555 0 0x1.2p3 0x0.0p0 +REG epsg:5555 1 0x1.0p2 -0x1.4p2 +REG epsg:5555 2 0x1.cp3 -0x1.4p2 +REG epsg:5555 3 0x1.0p2 0x1.4p2 +REG epsg:5555 4 0x1.cp3 0x1.4p2 +REG epsg:5556 0 0x1.ep3 0x0.0p0 +REG epsg:5556 1 0x1.4p3 -0x1.4p2 +REG epsg:5556 2 0x1.4p4 -0x1.4p2 +REG epsg:5556 3 0x1.4p3 0x1.4p2 +REG epsg:5556 4 0x1.4p4 0x1.4p2 +REG epsg:5558 0 0x0.0p0 0x0.0p0 +REG epsg:5558 1 -0x1.4p2 -0x1.4p2 +REG epsg:5558 2 0x1.4p2 -0x1.4p2 +REG epsg:5558 3 -0x1.4p2 0x1.4p2 +REG epsg:5558 4 0x1.4p2 0x1.4p2 +REG epsg:5559 0 -0x1.6955555555555p6 0x1.0d11111111112p4 +REG epsg:5559 1 -0x1.7e3a11ecca027p6 0x1.7a22222222224p3 +REG epsg:5559 2 -0x1.547098bde0a83p6 0x1.7a22222222224p3 +REG epsg:5559 3 -0x1.7e3a11ecca027p6 0x1.5d11111111112p4 +REG epsg:5559 4 -0x1.547098bde0a83p6 0x1.5d11111111112p4 +REG epsg:5561 0 0x0.0p0 0x0.0p0 +REG epsg:5561 1 -0x1.4p2 -0x1.4p2 +REG epsg:5561 2 0x1.4p2 -0x1.4p2 +REG epsg:5561 3 -0x1.4p2 0x1.4p2 +REG epsg:5561 4 0x1.4p2 0x1.4p2 +REG epsg:5562 0 0x1.5p4 0x0.0p0 +REG epsg:5562 1 0x1.0p4 -0x1.4p2 +REG epsg:5562 2 0x1.ap4 -0x1.4p2 +REG epsg:5562 3 0x1.0p4 0x1.4p2 +REG epsg:5562 4 0x1.ap4 0x1.4p2 +REG epsg:5563 0 0x1.bp4 0x0.0p0 +REG epsg:5563 1 0x1.6p4 -0x1.4p2 +REG epsg:5563 2 0x1.0p5 -0x1.4p2 +REG epsg:5563 3 0x1.6p4 0x1.4p2 +REG epsg:5563 4 0x1.0p5 0x1.4p2 +REG epsg:5564 0 0x1.08p5 0x0.0p0 +REG epsg:5564 1 0x1.cp4 -0x1.4p2 +REG epsg:5564 2 0x1.3p5 -0x1.4p2 +REG epsg:5564 3 0x1.cp4 0x1.4p2 +REG epsg:5564 4 0x1.3p5 0x1.4p2 +REG epsg:5565 0 0x1.38p5 0x0.0p0 +REG epsg:5565 1 0x1.1p5 -0x1.4p2 +REG epsg:5565 2 0x1.6p5 -0x1.4p2 +REG epsg:5565 3 0x1.1p5 0x1.4p2 +REG epsg:5565 4 0x1.6p5 0x1.4p2 +REG epsg:5566 0 0x1.5p4 0x0.0p0 +REG epsg:5566 1 0x1.0p4 -0x1.4p2 +REG epsg:5566 2 0x1.ap4 -0x1.4p2 +REG epsg:5566 3 0x1.0p4 0x1.4p2 +REG epsg:5566 4 0x1.ap4 0x1.4p2 +REG epsg:5567 0 0x1.bp4 0x0.0p0 +REG epsg:5567 1 0x1.6p4 -0x1.4p2 +REG epsg:5567 2 0x1.0p5 -0x1.4p2 +REG epsg:5567 3 0x1.6p4 0x1.4p2 +REG epsg:5567 4 0x1.0p5 0x1.4p2 +REG epsg:5568 0 0x1.08p5 0x0.0p0 +REG epsg:5568 1 0x1.cp4 -0x1.4p2 +REG epsg:5568 2 0x1.3p5 -0x1.4p2 +REG epsg:5568 3 0x1.cp4 0x1.4p2 +REG epsg:5568 4 0x1.3p5 0x1.4p2 +REG epsg:5569 0 0x1.38p5 0x0.0p0 +REG epsg:5569 1 0x1.1p5 -0x1.4p2 +REG epsg:5569 2 0x1.6p5 -0x1.4p2 +REG epsg:5569 3 0x1.1p5 0x1.4p2 +REG epsg:5569 4 0x1.6p5 0x1.4p2 +REG epsg:5570 0 0x1.5p4 0x0.0p0 +REG epsg:5570 1 0x1.0p4 -0x1.4p2 +REG epsg:5570 2 0x1.ap4 -0x1.4p2 +REG epsg:5570 3 0x1.0p4 0x1.4p2 +REG epsg:5570 4 0x1.ap4 0x1.4p2 +REG epsg:5571 0 0x1.8p4 0x0.0p0 +REG epsg:5571 1 0x1.3p4 -0x1.4p2 +REG epsg:5571 2 0x1.dp4 -0x1.4p2 +REG epsg:5571 3 0x1.3p4 0x1.4p2 +REG epsg:5571 4 0x1.dp4 0x1.4p2 +REG epsg:5572 0 0x1.bp4 0x0.0p0 +REG epsg:5572 1 0x1.6p4 -0x1.4p2 +REG epsg:5572 2 0x1.0p5 -0x1.4p2 +REG epsg:5572 3 0x1.6p4 0x1.4p2 +REG epsg:5572 4 0x1.0p5 0x1.4p2 +REG epsg:5573 0 0x1.ep4 0x0.0p0 +REG epsg:5573 1 0x1.9p4 -0x1.4p2 +REG epsg:5573 2 0x1.18p5 -0x1.4p2 +REG epsg:5573 3 0x1.9p4 0x1.4p2 +REG epsg:5573 4 0x1.18p5 0x1.4p2 +REG epsg:5574 0 0x1.08p5 0x0.0p0 +REG epsg:5574 1 0x1.cp4 -0x1.4p2 +REG epsg:5574 2 0x1.3p5 -0x1.4p2 +REG epsg:5574 3 0x1.cp4 0x1.4p2 +REG epsg:5574 4 0x1.3p5 0x1.4p2 +REG epsg:5575 0 0x1.2p5 0x0.0p0 +REG epsg:5575 1 0x1.fp4 -0x1.4p2 +REG epsg:5575 2 0x1.48p5 -0x1.4p2 +REG epsg:5575 3 0x1.fp4 0x1.4p2 +REG epsg:5575 4 0x1.48p5 0x1.4p2 +REG epsg:5576 0 0x1.38p5 0x0.0p0 +REG epsg:5576 1 0x1.1p5 -0x1.4p2 +REG epsg:5576 2 0x1.6p5 -0x1.4p2 +REG epsg:5576 3 0x1.1p5 0x1.4p2 +REG epsg:5576 4 0x1.6p5 0x1.4p2 +REG epsg:5577 0 0x1.5p4 0x0.0p0 +REG epsg:5577 1 0x1.0p4 -0x1.4p2 +REG epsg:5577 2 0x1.ap4 -0x1.4p2 +REG epsg:5577 3 0x1.0p4 0x1.4p2 +REG epsg:5577 4 0x1.ap4 0x1.4p2 +REG epsg:5578 0 0x1.8p4 0x0.0p0 +REG epsg:5578 1 0x1.3p4 -0x1.4p2 +REG epsg:5578 2 0x1.dp4 -0x1.4p2 +REG epsg:5578 3 0x1.3p4 0x1.4p2 +REG epsg:5578 4 0x1.dp4 0x1.4p2 +REG epsg:5579 0 0x1.bp4 0x0.0p0 +REG epsg:5579 1 0x1.6p4 -0x1.4p2 +REG epsg:5579 2 0x1.0p5 -0x1.4p2 +REG epsg:5579 3 0x1.6p4 0x1.4p2 +REG epsg:5579 4 0x1.0p5 0x1.4p2 +REG epsg:5580 0 0x1.ep4 0x0.0p0 +REG epsg:5580 1 0x1.9p4 -0x1.4p2 +REG epsg:5580 2 0x1.18p5 -0x1.4p2 +REG epsg:5580 3 0x1.9p4 0x1.4p2 +REG epsg:5580 4 0x1.18p5 0x1.4p2 +REG epsg:5581 0 0x1.08p5 0x0.0p0 +REG epsg:5581 1 0x1.cp4 -0x1.4p2 +REG epsg:5581 2 0x1.3p5 -0x1.4p2 +REG epsg:5581 3 0x1.cp4 0x1.4p2 +REG epsg:5581 4 0x1.3p5 0x1.4p2 +REG epsg:5582 0 0x1.2p5 0x0.0p0 +REG epsg:5582 1 0x1.fp4 -0x1.4p2 +REG epsg:5582 2 0x1.48p5 -0x1.4p2 +REG epsg:5582 3 0x1.fp4 0x1.4p2 +REG epsg:5582 4 0x1.48p5 0x1.4p2 +REG epsg:5583 0 0x1.38p5 0x0.0p0 +REG epsg:5583 1 0x1.1p5 -0x1.4p2 +REG epsg:5583 2 0x1.6p5 -0x1.4p2 +REG epsg:5583 3 0x1.1p5 0x1.4p2 +REG epsg:5583 4 0x1.6p5 0x1.4p2 +REG epsg:5588 0 -0x1.0ap6 0x1.74p5 +REG epsg:5588 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG epsg:5588 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG epsg:5588 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG epsg:5588 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG epsg:5589 0 -0x1.628705a708edep6 0x1.10fad8d548846p4 +REG epsg:5589 1 -0x1.7772b79445786p6 0x1.81f5b1aa9108cp3 +REG epsg:5589 2 -0x1.4d9b53b9cc636p6 0x1.81f5b1aa9108cp3 +REG epsg:5589 3 -0x1.7772b79445786p6 0x1.60fad8d548846p4 +REG epsg:5589 4 -0x1.4d9b53b9cc636p6 0x1.60fad8d548846p4 +REG epsg:5591 0 0x0.0p0 0x0.0p0 +REG epsg:5591 1 -0x1.4p2 -0x1.4p2 +REG epsg:5591 2 0x1.4p2 -0x1.4p2 +REG epsg:5591 3 -0x1.4p2 0x1.4p2 +REG epsg:5591 4 0x1.4p2 0x1.4p2 +REG epsg:5593 0 0x0.0p0 0x0.0p0 +REG epsg:5593 1 -0x1.4p2 -0x1.4p2 +REG epsg:5593 2 0x1.4p2 -0x1.4p2 +REG epsg:5593 3 -0x1.4p2 0x1.4p2 +REG epsg:5593 4 0x1.4p2 0x1.4p2 +REG epsg:5596 0 0x1.6aaaaaaaaaaa9p3 0x0.0p0 +REG epsg:5596 1 0x1.9555555555552p2 -0x1.4p2 +REG epsg:5596 2 0x1.0555555555554p4 -0x1.4p2 +REG epsg:5596 3 0x1.9555555555552p2 0x1.4p2 +REG epsg:5596 4 0x1.0555555555554p4 0x1.4p2 +REG epsg:5598 0 0x1.6aaaaaaaaaaa9p3 0x0.0p0 +REG epsg:5598 1 0x1.9555555555552p2 -0x1.4p2 +REG epsg:5598 2 0x1.0555555555554p4 -0x1.4p2 +REG epsg:5598 3 0x1.9555555555552p2 0x1.4p2 +REG epsg:5598 4 0x1.0555555555554p4 0x1.4p2 +REG epsg:5623 0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 +REG epsg:5623 1 -0x1.695eda12b767bp6 0x1.24p5 +REG epsg:5623 2 -0x1.33f67b429dedbp6 0x1.24p5 +REG epsg:5623 3 -0x1.695eda12b767bp6 0x1.74p5 +REG epsg:5623 4 -0x1.33f67b429dedbp6 0x1.74p5 +REG epsg:5624 0 -0x1.57p6 0x1.4cp5 +REG epsg:5624 1 -0x1.71b42f680cbdp6 0x1.24p5 +REG epsg:5624 2 -0x1.3c4bd097f343p6 0x1.24p5 +REG epsg:5624 3 -0x1.71b42f680cbdp6 0x1.74p5 +REG epsg:5624 4 -0x1.3c4bd097f343p6 0x1.74p5 +REG epsg:5625 0 -0x1.63p6 0x1.4cp5 +REG epsg:5625 1 -0x1.7db42f680cbdp6 0x1.24p5 +REG epsg:5625 2 -0x1.484bd097f343p6 0x1.24p5 +REG epsg:5625 3 -0x1.7db42f680cbdp6 0x1.74p5 +REG epsg:5625 4 -0x1.484bd097f343p6 0x1.74p5 +REG epsg:5627 0 0x1.8p2 0x0.0p0 +REG epsg:5627 1 0x1.0p0 -0x1.4p2 +REG epsg:5627 2 0x1.6p3 -0x1.4p2 +REG epsg:5627 3 0x1.0p0 0x1.4p2 +REG epsg:5627 4 0x1.6p3 0x1.4p2 +REG epsg:5628 0 0x0.0p0 0x0.0p0 +REG epsg:5628 1 -0x1.4p2 -0x1.4p2 +REG epsg:5628 2 0x1.4p2 -0x1.4p2 +REG epsg:5628 3 -0x1.4p2 0x1.4p2 +REG epsg:5628 4 0x1.4p2 0x1.4p2 +REG epsg:5629 0 0x1.68p5 -0x1.9p4 +REG epsg:5629 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5629 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:5629 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5629 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:5631 0 0x1.2p3 0x0.0p0 +REG epsg:5631 1 0x1.0p2 -0x1.4p2 +REG epsg:5631 2 0x1.cp3 -0x1.4p2 +REG epsg:5631 3 0x1.0p2 0x1.4p2 +REG epsg:5631 4 0x1.cp3 0x1.4p2 +REG epsg:5632 0 0x1.4p3 0x1.9p5 +REG epsg:5632 1 -0x1.aabf5806333fep3 0x1.18p5 +REG epsg:5632 2 0x1.0aafd6018cdp5 0x1.18p5 +REG epsg:5632 3 -0x1.aabf5806333fep3 0x1.04p6 +REG epsg:5632 4 0x1.0aafd6018cdp5 0x1.04p6 +REG epsg:5633 0 0x1.4p3 0x1.ap5 +REG epsg:5633 1 0x1.e0ef7421c3ddp0 0x1.78p5 +REG epsg:5633 2 0x1.21f108bde3c23p4 0x1.78p5 +REG epsg:5633 3 0x1.e0ef7421c3ddp0 0x1.c8p5 +REG epsg:5633 4 0x1.21f108bde3c23p4 0x1.c8p5 +REG epsg:5634 0 0x1.4p3 0x1.9p5 +REG epsg:5634 1 -0x1.aabf5806333fep3 0x1.18p5 +REG epsg:5634 2 0x1.0aafd6018cdp5 0x1.18p5 +REG epsg:5634 3 -0x1.aabf5806333fep3 0x1.04p6 +REG epsg:5634 4 0x1.0aafd6018cdp5 0x1.04p6 +REG epsg:5635 0 0x1.4p3 0x1.ap5 +REG epsg:5635 1 0x1.e0ef7421c3ddp0 0x1.78p5 +REG epsg:5635 2 0x1.21f108bde3c23p4 0x1.78p5 +REG epsg:5635 3 0x1.e0ef7421c3ddp0 0x1.c8p5 +REG epsg:5635 4 0x1.21f108bde3c23p4 0x1.c8p5 +REG epsg:5636 0 0x1.4p3 0x1.ap5 +REG epsg:5636 1 0x1.e0ef7421c3ddp0 0x1.78p5 +REG epsg:5636 2 0x1.21f108bde3c23p4 0x1.78p5 +REG epsg:5636 3 0x1.e0ef7421c3ddp0 0x1.c8p5 +REG epsg:5636 4 0x1.21f108bde3c23p4 0x1.c8p5 +REG epsg:5637 0 0x1.4p3 0x1.9p5 +REG epsg:5637 1 -0x1.aabf5806333fep3 0x1.18p5 +REG epsg:5637 2 0x1.0aafd6018cdp5 0x1.18p5 +REG epsg:5637 3 -0x1.aabf5806333fep3 0x1.04p6 +REG epsg:5637 4 0x1.0aafd6018cdp5 0x1.04p6 +REG epsg:5638 0 0x1.4p3 0x1.ap5 +REG epsg:5638 1 0x1.e0ef7421c3ddp0 0x1.78p5 +REG epsg:5638 2 0x1.21f108bde3c23p4 0x1.78p5 +REG epsg:5638 3 0x1.e0ef7421c3ddp0 0x1.c8p5 +REG epsg:5638 4 0x1.21f108bde3c23p4 0x1.c8p5 +REG epsg:5639 0 0x1.4p3 0x1.9p5 +REG epsg:5639 1 -0x1.aabf5806333fep3 0x1.18p5 +REG epsg:5639 2 0x1.0aafd6018cdp5 0x1.18p5 +REG epsg:5639 3 -0x1.aabf5806333fep3 0x1.04p6 +REG epsg:5639 4 0x1.0aafd6018cdp5 0x1.04p6 +REG epsg:5641 0 -0x1.58p5 -0x1.0p1 +REG epsg:5641 1 -0x1.80063de24127fp5 -0x1.cp2 +REG epsg:5641 2 -0x1.2ff9c21dbed81p5 -0x1.cp2 +REG epsg:5641 3 -0x1.80063de24127fp5 0x1.8p1 +REG epsg:5641 4 -0x1.2ff9c21dbed81p5 0x1.8p1 +REG epsg:5643 0 0x1.4p3 0x1.9955555555556p5 +REG epsg:5643 1 -0x1.99f83081fbcp-4 0x1.66aaaaaaaaaaap5 +REG epsg:5643 2 0x1.4199f83081fbcp4 0x1.66aaaaaaaaaaap5 +REG epsg:5643 3 -0x1.99f83081fbcp-4 0x1.cc00000000002p5 +REG epsg:5643 4 0x1.4199f83081fbcp4 0x1.cc00000000002p5 +REG epsg:5644 0 0x1.98p5 -0x1.9p4 +REG epsg:5644 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5644 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:5644 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5644 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:5646 0 -0x1.22p6 0x1.54p5 +REG epsg:5646 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:5646 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:5646 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:5646 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:5649 0 0x1.8p1 0x0.0p0 +REG epsg:5649 1 -0x1.0p1 -0x1.4p2 +REG epsg:5649 2 0x1.0p3 -0x1.4p2 +REG epsg:5649 3 -0x1.0p1 0x1.4p2 +REG epsg:5649 4 0x1.0p3 0x1.4p2 +REG epsg:5650 0 0x1.ep3 0x0.0p0 +REG epsg:5650 1 0x1.4p3 -0x1.4p2 +REG epsg:5650 2 0x1.4p4 -0x1.4p2 +REG epsg:5650 3 0x1.4p3 0x1.4p2 +REG epsg:5650 4 0x1.4p4 0x1.4p2 +REG epsg:5651 0 0x1.8p1 0x0.0p0 +REG epsg:5651 1 -0x1.0p1 -0x1.4p2 +REG epsg:5651 2 0x1.0p3 -0x1.4p2 +REG epsg:5651 3 -0x1.0p1 0x1.4p2 +REG epsg:5651 4 0x1.0p3 0x1.4p2 +REG epsg:5652 0 0x1.2p3 0x0.0p0 +REG epsg:5652 1 0x1.0p2 -0x1.4p2 +REG epsg:5652 2 0x1.cp3 -0x1.4p2 +REG epsg:5652 3 0x1.0p2 0x1.4p2 +REG epsg:5652 4 0x1.cp3 0x1.4p2 +REG epsg:5653 0 0x1.ep3 0x0.0p0 +REG epsg:5653 1 0x1.4p3 -0x1.4p2 +REG epsg:5653 2 0x1.4p4 -0x1.4p2 +REG epsg:5653 3 0x1.4p3 0x1.4p2 +REG epsg:5653 4 0x1.4p4 0x1.4p2 +REG epsg:5654 0 -0x1.22p6 0x1.54p5 +REG epsg:5654 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:5654 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:5654 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:5654 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:5655 0 -0x1.22p6 0x1.54p5 +REG epsg:5655 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:5655 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:5655 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:5655 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:5659 0 0x1.2p3 0x0.0p0 +REG epsg:5659 1 0x1.0p2 -0x1.4p2 +REG epsg:5659 2 0x1.cp3 -0x1.4p2 +REG epsg:5659 3 0x1.0p2 0x1.4p2 +REG epsg:5659 4 0x1.cp3 0x1.4p2 +REG epsg:5663 0 0x1.ep3 0x0.0p0 +REG epsg:5663 1 0x1.4p3 -0x1.4p2 +REG epsg:5663 2 0x1.4p4 -0x1.4p2 +REG epsg:5663 3 0x1.4p3 0x1.4p2 +REG epsg:5663 4 0x1.4p4 0x1.4p2 +REG epsg:5664 0 0x1.2p3 0x0.0p0 +REG epsg:5664 1 0x1.0p2 -0x1.4p2 +REG epsg:5664 2 0x1.cp3 -0x1.4p2 +REG epsg:5664 3 0x1.0p2 0x1.4p2 +REG epsg:5664 4 0x1.cp3 0x1.4p2 +REG epsg:5665 0 0x1.ep3 0x0.0p0 +REG epsg:5665 1 0x1.4p3 -0x1.4p2 +REG epsg:5665 2 0x1.4p4 -0x1.4p2 +REG epsg:5665 3 0x1.4p3 0x1.4p2 +REG epsg:5665 4 0x1.4p4 0x1.4p2 +REG epsg:5666 0 0x1.2p3 0x0.0p0 +REG epsg:5666 1 0x1.0p2 -0x1.4p2 +REG epsg:5666 2 0x1.cp3 -0x1.4p2 +REG epsg:5666 3 0x1.0p2 0x1.4p2 +REG epsg:5666 4 0x1.cp3 0x1.4p2 +REG epsg:5667 0 0x1.8p3 0x0.0p0 +REG epsg:5667 1 0x1.cp2 -0x1.4p2 +REG epsg:5667 2 0x1.1p4 -0x1.4p2 +REG epsg:5667 3 0x1.cp2 0x1.4p2 +REG epsg:5667 4 0x1.1p4 0x1.4p2 +REG epsg:5668 0 0x1.8p3 0x0.0p0 +REG epsg:5668 1 0x1.cp2 -0x1.4p2 +REG epsg:5668 2 0x1.1p4 -0x1.4p2 +REG epsg:5668 3 0x1.cp2 0x1.4p2 +REG epsg:5668 4 0x1.1p4 0x1.4p2 +REG epsg:5669 0 0x1.ep3 0x0.0p0 +REG epsg:5669 1 0x1.4p3 -0x1.4p2 +REG epsg:5669 2 0x1.4p4 -0x1.4p2 +REG epsg:5669 3 0x1.4p3 0x1.4p2 +REG epsg:5669 4 0x1.4p4 0x1.4p2 +REG epsg:5670 0 0x1.2p3 0x0.0p0 +REG epsg:5670 1 0x1.0p2 -0x1.4p2 +REG epsg:5670 2 0x1.cp3 -0x1.4p2 +REG epsg:5670 3 0x1.0p2 0x1.4p2 +REG epsg:5670 4 0x1.cp3 0x1.4p2 +REG epsg:5671 0 0x1.8p3 0x0.0p0 +REG epsg:5671 1 0x1.cp2 -0x1.4p2 +REG epsg:5671 2 0x1.1p4 -0x1.4p2 +REG epsg:5671 3 0x1.cp2 0x1.4p2 +REG epsg:5671 4 0x1.1p4 0x1.4p2 +REG epsg:5672 0 0x1.ep3 0x0.0p0 +REG epsg:5672 1 0x1.4p3 -0x1.4p2 +REG epsg:5672 2 0x1.4p4 -0x1.4p2 +REG epsg:5672 3 0x1.4p3 0x1.4p2 +REG epsg:5672 4 0x1.4p4 0x1.4p2 +REG epsg:5673 0 0x1.2p3 0x0.0p0 +REG epsg:5673 1 0x1.0p2 -0x1.4p2 +REG epsg:5673 2 0x1.cp3 -0x1.4p2 +REG epsg:5673 3 0x1.0p2 0x1.4p2 +REG epsg:5673 4 0x1.cp3 0x1.4p2 +REG epsg:5674 0 0x1.8p3 0x0.0p0 +REG epsg:5674 1 0x1.cp2 -0x1.4p2 +REG epsg:5674 2 0x1.1p4 -0x1.4p2 +REG epsg:5674 3 0x1.cp2 0x1.4p2 +REG epsg:5674 4 0x1.1p4 0x1.4p2 +REG epsg:5675 0 0x1.ep3 0x0.0p0 +REG epsg:5675 1 0x1.4p3 -0x1.4p2 +REG epsg:5675 2 0x1.4p4 -0x1.4p2 +REG epsg:5675 3 0x1.4p3 0x1.4p2 +REG epsg:5675 4 0x1.4p4 0x1.4p2 +REG epsg:5676 0 0x1.8p2 0x0.0p0 +REG epsg:5676 1 0x1.0p0 -0x1.4p2 +REG epsg:5676 2 0x1.6p3 -0x1.4p2 +REG epsg:5676 3 0x1.0p0 0x1.4p2 +REG epsg:5676 4 0x1.6p3 0x1.4p2 +REG epsg:5677 0 0x1.2p3 0x0.0p0 +REG epsg:5677 1 0x1.0p2 -0x1.4p2 +REG epsg:5677 2 0x1.cp3 -0x1.4p2 +REG epsg:5677 3 0x1.0p2 0x1.4p2 +REG epsg:5677 4 0x1.cp3 0x1.4p2 +REG epsg:5678 0 0x1.8p3 0x0.0p0 +REG epsg:5678 1 0x1.cp2 -0x1.4p2 +REG epsg:5678 2 0x1.1p4 -0x1.4p2 +REG epsg:5678 3 0x1.cp2 0x1.4p2 +REG epsg:5678 4 0x1.1p4 0x1.4p2 +REG epsg:5679 0 0x1.ep3 0x0.0p0 +REG epsg:5679 1 0x1.4p3 -0x1.4p2 +REG epsg:5679 2 0x1.4p4 -0x1.4p2 +REG epsg:5679 3 0x1.4p3 0x1.4p2 +REG epsg:5679 4 0x1.4p4 0x1.4p2 +REG epsg:5680 0 0x1.8p1 0x0.0p0 +REG epsg:5680 1 -0x1.0p1 -0x1.4p2 +REG epsg:5680 2 0x1.0p3 -0x1.4p2 +REG epsg:5680 3 -0x1.0p1 0x1.4p2 +REG epsg:5680 4 0x1.0p3 0x1.4p2 +REG epsg:5681 0 0x0.0p0 0x0.0p0 +REG epsg:5681 1 -0x1.4p2 -0x1.4p2 +REG epsg:5681 2 0x1.4p2 -0x1.4p2 +REG epsg:5681 3 -0x1.4p2 0x1.4p2 +REG epsg:5681 4 0x1.4p2 0x1.4p2 +REG epsg:5682 0 0x1.8p2 0x0.0p0 +REG epsg:5682 1 0x1.0p0 -0x1.4p2 +REG epsg:5682 2 0x1.6p3 -0x1.4p2 +REG epsg:5682 3 0x1.0p0 0x1.4p2 +REG epsg:5682 4 0x1.6p3 0x1.4p2 +REG epsg:5683 0 0x1.2p3 0x0.0p0 +REG epsg:5683 1 0x1.0p2 -0x1.4p2 +REG epsg:5683 2 0x1.cp3 -0x1.4p2 +REG epsg:5683 3 0x1.0p2 0x1.4p2 +REG epsg:5683 4 0x1.cp3 0x1.4p2 +REG epsg:5684 0 0x1.8p3 0x0.0p0 +REG epsg:5684 1 0x1.cp2 -0x1.4p2 +REG epsg:5684 2 0x1.1p4 -0x1.4p2 +REG epsg:5684 3 0x1.cp2 0x1.4p2 +REG epsg:5684 4 0x1.1p4 0x1.4p2 +REG epsg:5685 0 0x1.ep3 0x0.0p0 +REG epsg:5685 1 0x1.4p3 -0x1.4p2 +REG epsg:5685 2 0x1.4p4 -0x1.4p2 +REG epsg:5685 3 0x1.4p3 0x1.4p2 +REG epsg:5685 4 0x1.4p4 0x1.4p2 +REG epsg:5698 0 0x1.8p1 0x1.74p5 +REG epsg:5698 1 -0x1.10e06f120d02p2 0x1.4cp5 +REG epsg:5698 2 0x1.487037890681p3 0x1.4cp5 +REG epsg:5698 3 -0x1.10e06f120d02p2 0x1.9cp5 +REG epsg:5698 4 0x1.487037890681p3 0x1.9cp5 +REG epsg:5699 0 0x1.8p1 0x1.74p5 +REG epsg:5699 1 -0x1.10e06f120d02p2 0x1.4cp5 +REG epsg:5699 2 0x1.487037890681p3 0x1.4cp5 +REG epsg:5699 3 -0x1.10e06f120d02p2 0x1.9cp5 +REG epsg:5699 4 0x1.487037890681p3 0x1.9cp5 +REG epsg:5700 0 -0x1.62p7 -0x1.9p4 +REG epsg:5700 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG epsg:5700 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG epsg:5700 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG epsg:5700 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG epsg:5707 0 0x0.0p0 0x1.8c00000000001p5 +REG epsg:5707 1 -0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:5707 2 0x1.ecb9e1490aa5ep2 0x1.6400000000001p5 +REG epsg:5707 3 -0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:5707 4 0x1.ecb9e1490aa5ep2 0x1.b400000000001p5 +REG epsg:5708 0 0x0.0p0 0x1.5151eb851eb87p5 +REG epsg:5708 1 -0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:5708 2 0x1.afb945304eeb7p2 0x1.2951eb851eb87p5 +REG epsg:5708 3 -0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:5708 4 0x1.afb945304eeb7p2 0x1.7951eb851eb87p5 +REG epsg:5825 0 0x1.2a04c24ac283fp7 -0x1.1a8ab9514e778p5 +REG epsg:5825 1 0x1.1dc3585ba3a5p7 -0x1.428ab9514e778p5 +REG epsg:5825 2 0x1.36462c39e162ep7 -0x1.428ab9514e778p5 +REG epsg:5825 3 0x1.1dc3585ba3a5p7 -0x1.e51572a29cefp4 +REG epsg:5825 4 0x1.36462c39e162ep7 -0x1.e51572a29cefp4 +REG epsg:5828 0 0x0.0p0 0x0.0p0 +REG epsg:5828 1 -0x1.4p2 -0x1.4p2 +REG epsg:5828 2 0x1.4p2 -0x1.4p2 +REG epsg:5828 3 -0x1.4p2 0x1.4p2 +REG epsg:5828 4 0x1.4p2 0x1.4p2 +REG epsg:5832 0 0x1.8p2 0x0.0p0 +REG epsg:5832 1 0x1.0p0 -0x1.4p2 +REG epsg:5832 2 0x1.6p3 -0x1.4p2 +REG epsg:5832 3 0x1.0p0 0x1.4p2 +REG epsg:5832 4 0x1.6p3 0x1.4p2 +REG epsg:5833 0 0x1.2p3 0x0.0p0 +REG epsg:5833 1 0x1.0p2 -0x1.4p2 +REG epsg:5833 2 0x1.cp3 -0x1.4p2 +REG epsg:5833 3 0x1.0p2 0x1.4p2 +REG epsg:5833 4 0x1.cp3 0x1.4p2 +REG epsg:5834 0 0x1.8p3 0x0.0p0 +REG epsg:5834 1 0x1.cp2 -0x1.4p2 +REG epsg:5834 2 0x1.1p4 -0x1.4p2 +REG epsg:5834 3 0x1.cp2 0x1.4p2 +REG epsg:5834 4 0x1.1p4 0x1.4p2 +REG epsg:5835 0 0x1.ep3 0x0.0p0 +REG epsg:5835 1 0x1.4p3 -0x1.4p2 +REG epsg:5835 2 0x1.4p4 -0x1.4p2 +REG epsg:5835 3 0x1.4p3 0x1.4p2 +REG epsg:5835 4 0x1.4p4 0x1.4p2 +REG epsg:5836 0 0x1.38p5 0x0.0p0 +REG epsg:5836 1 0x1.1p5 -0x1.4p2 +REG epsg:5836 2 0x1.6p5 -0x1.4p2 +REG epsg:5836 3 0x1.1p5 0x1.4p2 +REG epsg:5836 4 0x1.6p5 0x1.4p2 +REG epsg:5837 0 0x1.c8p5 0x0.0p0 +REG epsg:5837 1 0x1.ap5 -0x1.4p2 +REG epsg:5837 2 0x1.fp5 -0x1.4p2 +REG epsg:5837 3 0x1.ap5 0x1.4p2 +REG epsg:5837 4 0x1.fp5 0x1.4p2 +REG epsg:5839 0 -0x1.44p6 -0x1.9p4 +REG epsg:5839 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:5839 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:5839 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:5839 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:5842 0 0x1.8p3 0x0.0p0 +REG epsg:5842 1 0x1.cp2 -0x1.4p2 +REG epsg:5842 2 0x1.1p4 -0x1.4p2 +REG epsg:5842 3 0x1.cp2 0x1.4p2 +REG epsg:5842 4 0x1.1p4 0x1.4p2 +REG epsg:5844 0 0x1.ep4 0x0.0p0 +REG epsg:5844 1 0x1.9p4 -0x1.4p2 +REG epsg:5844 2 0x1.18p5 -0x1.4p2 +REG epsg:5844 3 0x1.9p4 0x1.4p2 +REG epsg:5844 4 0x1.18p5 0x1.4p2 +REG epsg:5845 0 0x1.ep3 0x0.0p0 +REG epsg:5845 1 0x1.4p3 -0x1.4p2 +REG epsg:5845 2 0x1.4p4 -0x1.4p2 +REG epsg:5845 3 0x1.4p3 0x1.4p2 +REG epsg:5845 4 0x1.4p4 0x1.4p2 +REG epsg:5846 0 0x1.8p3 0x0.0p0 +REG epsg:5846 1 0x1.cp2 -0x1.4p2 +REG epsg:5846 2 0x1.1p4 -0x1.4p2 +REG epsg:5846 3 0x1.cp2 0x1.4p2 +REG epsg:5846 4 0x1.1p4 0x1.4p2 +REG epsg:5847 0 0x1.bp3 0x0.0p0 +REG epsg:5847 1 0x1.1p3 -0x1.4p2 +REG epsg:5847 2 0x1.28p4 -0x1.4p2 +REG epsg:5847 3 0x1.1p3 0x1.4p2 +REG epsg:5847 4 0x1.28p4 0x1.4p2 +REG epsg:5848 0 0x1.ep3 0x0.0p0 +REG epsg:5848 1 0x1.4p3 -0x1.4p2 +REG epsg:5848 2 0x1.4p4 -0x1.4p2 +REG epsg:5848 3 0x1.4p3 0x1.4p2 +REG epsg:5848 4 0x1.4p4 0x1.4p2 +REG epsg:5849 0 0x1.08p4 0x0.0p0 +REG epsg:5849 1 0x1.7p3 -0x1.4p2 +REG epsg:5849 2 0x1.58p4 -0x1.4p2 +REG epsg:5849 3 0x1.7p3 0x1.4p2 +REG epsg:5849 4 0x1.58p4 0x1.4p2 +REG epsg:5850 0 0x1.2p4 0x0.0p0 +REG epsg:5850 1 0x1.ap3 -0x1.4p2 +REG epsg:5850 2 0x1.7p4 -0x1.4p2 +REG epsg:5850 3 0x1.ap3 0x1.4p2 +REG epsg:5850 4 0x1.7p4 0x1.4p2 +REG epsg:5851 0 0x1.c8p3 0x0.0p0 +REG epsg:5851 1 0x1.28p3 -0x1.4p2 +REG epsg:5851 2 0x1.34p4 -0x1.4p2 +REG epsg:5851 3 0x1.28p3 0x1.4p2 +REG epsg:5851 4 0x1.34p4 0x1.4p2 +REG epsg:5852 0 0x1.f8p3 0x0.0p0 +REG epsg:5852 1 0x1.58p3 -0x1.4p2 +REG epsg:5852 2 0x1.4cp4 -0x1.4p2 +REG epsg:5852 3 0x1.58p3 0x1.4p2 +REG epsg:5852 4 0x1.4cp4 0x1.4p2 +REG epsg:5853 0 0x1.14p4 0x0.0p0 +REG epsg:5853 1 0x1.88p3 -0x1.4p2 +REG epsg:5853 2 0x1.64p4 -0x1.4p2 +REG epsg:5853 3 0x1.88p3 0x1.4p2 +REG epsg:5853 4 0x1.64p4 0x1.4p2 +REG epsg:5854 0 0x1.2cp4 0x0.0p0 +REG epsg:5854 1 0x1.b8p3 -0x1.4p2 +REG epsg:5854 2 0x1.7cp4 -0x1.4p2 +REG epsg:5854 3 0x1.b8p3 0x1.4p2 +REG epsg:5854 4 0x1.7cp4 0x1.4p2 +REG epsg:5855 0 0x1.44p4 0x0.0p0 +REG epsg:5855 1 0x1.e8p3 -0x1.4p2 +REG epsg:5855 2 0x1.94p4 -0x1.4p2 +REG epsg:5855 3 0x1.e8p3 0x1.4p2 +REG epsg:5855 4 0x1.94p4 0x1.4p2 +REG epsg:5856 0 0x1.5cp4 0x0.0p0 +REG epsg:5856 1 0x1.0cp4 -0x1.4p2 +REG epsg:5856 2 0x1.acp4 -0x1.4p2 +REG epsg:5856 3 0x1.0cp4 0x1.4p2 +REG epsg:5856 4 0x1.acp4 0x1.4p2 +REG epsg:5857 0 0x1.74p4 0x0.0p0 +REG epsg:5857 1 0x1.24p4 -0x1.4p2 +REG epsg:5857 2 0x1.c4p4 -0x1.4p2 +REG epsg:5857 3 0x1.24p4 0x1.4p2 +REG epsg:5857 4 0x1.c4p4 0x1.4p2 +REG epsg:5858 0 -0x1.98p5 -0x1.9p4 +REG epsg:5858 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:5858 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5858 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:5858 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5875 0 -0x1.2cp6 -0x1.9p4 +REG epsg:5875 1 -0x1.42114b818572ep6 -0x1.ep4 +REG epsg:5875 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:5875 3 -0x1.42114b818572ep6 -0x1.4p4 +REG epsg:5875 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:5876 0 -0x1.14p6 -0x1.9p4 +REG epsg:5876 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:5876 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:5876 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:5876 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:5877 0 -0x1.f8p5 -0x1.9p4 +REG epsg:5877 1 -0x1.12114b818572ep6 -0x1.ep4 +REG epsg:5877 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:5877 3 -0x1.12114b818572ep6 -0x1.4p4 +REG epsg:5877 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:5879 0 0x1.68p5 -0x1.9p4 +REG epsg:5879 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:5879 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:5879 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:5879 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:5880 0 -0x1.bp5 0x0.0p0 +REG epsg:5880 1 -0x1.d8p5 -0x1.4p2 +REG epsg:5880 2 -0x1.88p5 -0x1.4p2 +REG epsg:5880 3 -0x1.d8p5 0x1.4p2 +REG epsg:5880 4 -0x1.88p5 0x1.4p2 +REG epsg:5884 0 0x0.0p0 0x0.0p0 +REG epsg:5884 1 -0x1.4p2 -0x1.4p2 +REG epsg:5884 2 0x1.4p2 -0x1.4p2 +REG epsg:5884 3 -0x1.4p2 0x1.4p2 +REG epsg:5884 4 0x1.4p2 0x1.4p2 +REG epsg:5886 0 0x0.0p0 0x0.0p0 +REG epsg:5886 1 -0x1.4p2 -0x1.4p2 +REG epsg:5886 2 0x1.4p2 -0x1.4p2 +REG epsg:5886 3 -0x1.4p2 0x1.4p2 +REG epsg:5886 4 0x1.4p2 0x1.4p2 +REG epsg:5887 0 -0x1.62p7 0x0.0p0 +REG epsg:5887 1 0x1.64p7 -0x1.4p2 +REG epsg:5887 2 -0x1.58p7 -0x1.4p2 +REG epsg:5887 3 0x1.64p7 0x1.4p2 +REG epsg:5887 4 -0x1.58p7 0x1.4p2 +REG epsg:5890 0 0x1.68p6 0x1.4p6 +REG epsg:5890 1 0x1.ep4 0x1.04p6 +REG epsg:5890 2 0x1.2cp7 0x1.04p6 +REG epsg:5890 3 0x1.ep4 0x1.64p6 +REG epsg:5890 4 0x1.2cp7 0x1.64p6 +REG epsg:5921 0 -0x1.bcp6 0x1.44p6 +REG epsg:5921 1 -0x1.44477d0778d06p7 0x1.24p6 +REG epsg:5921 2 -0x1.dee20be21cbe6p5 0x1.24p6 +REG epsg:5921 3 -0x1.44477d0778d06p7 0x1.64p6 +REG epsg:5921 4 -0x1.dee20be21cbe6p5 0x1.64p6 +REG epsg:5922 0 -0x1.38p5 0x1.44p6 +REG epsg:5922 1 -0x1.688efa0ef1a0dp6 0x1.24p6 +REG epsg:5922 2 0x1.8477d0778d068p3 0x1.24p6 +REG epsg:5922 3 -0x1.688efa0ef1a0dp6 0x1.64p6 +REG epsg:5922 4 0x1.8477d0778d068p3 0x1.64p6 +REG epsg:5923 0 0x1.08p5 0x1.44p6 +REG epsg:5923 1 -0x1.223be83bc6834p4 0x1.24p6 +REG epsg:5923 2 0x1.508efa0ef1a0dp6 0x1.24p6 +REG epsg:5923 3 -0x1.223be83bc6834p4 0x1.64p6 +REG epsg:5923 4 0x1.508efa0ef1a0dp6 0x1.64p6 +REG epsg:5924 0 0x1.a4p6 0x1.44p6 +REG epsg:5924 1 0x1.aee20be21cbe6p5 0x1.24p6 +REG epsg:5924 2 0x1.38477d0778d06p7 0x1.24p6 +REG epsg:5924 3 0x1.aee20be21cbe6p5 0x1.64p6 +REG epsg:5924 4 0x1.38477d0778d06p7 0x1.64p6 +REG epsg:5925 0 0x1.62p7 0x1.44p6 +REG epsg:5925 1 0x1.f77105f10e5f3p6 0x1.24p6 +REG epsg:5925 2 -0x1.07b882f8872fap7 0x1.24p6 +REG epsg:5925 3 0x1.f77105f10e5f3p6 0x1.64p6 +REG epsg:5925 4 -0x1.07b882f8872fap7 0x1.64p6 +REG epsg:5926 0 -0x1.bcp6 0x1.24p6 +REG epsg:5926 1 -0x1.14b99049d9306p7 0x1.04p6 +REG epsg:5926 2 -0x1.4e8cdf6c4d9f5p6 0x1.04p6 +REG epsg:5926 3 -0x1.14b99049d9306p7 0x1.44p6 +REG epsg:5926 4 -0x1.4e8cdf6c4d9f5p6 0x1.44p6 +REG epsg:5927 0 -0x1.38p5 0x1.24p6 +REG epsg:5927 1 -0x1.09732093b260bp6 0x1.04p6 +REG epsg:5927 2 -0x1.7466fb626cfa6p3 0x1.04p6 +REG epsg:5927 3 -0x1.09732093b260bp6 0x1.44p6 +REG epsg:5927 4 -0x1.7466fb626cfa6p3 0x1.44p6 +REG epsg:5928 0 0x1.08p5 0x1.24p6 +REG epsg:5928 1 0x1.68cdf6c4d9f4cp2 0x1.04p6 +REG epsg:5928 2 0x1.e2e6412764c16p5 0x1.04p6 +REG epsg:5928 3 0x1.68cdf6c4d9f4cp2 0x1.44p6 +REG epsg:5928 4 0x1.e2e6412764c16p5 0x1.44p6 +REG epsg:5929 0 0x1.a4p6 0x1.24p6 +REG epsg:5929 1 0x1.368cdf6c4d9f5p6 0x1.04p6 +REG epsg:5929 2 0x1.08b99049d9306p7 0x1.04p6 +REG epsg:5929 3 0x1.368cdf6c4d9f5p6 0x1.44p6 +REG epsg:5929 4 0x1.08b99049d9306p7 0x1.44p6 +REG epsg:5930 0 0x1.62p7 0x1.24p6 +REG epsg:5930 1 0x1.2b466fb626cfap7 0x1.04p6 +REG epsg:5930 2 -0x1.37466fb626cfap7 0x1.04p6 +REG epsg:5930 3 0x1.2b466fb626cfap7 0x1.44p6 +REG epsg:5930 4 -0x1.37466fb626cfap7 0x1.44p6 +REG epsg:5931 0 -0x1.bcp6 0x1.04p6 +REG epsg:5931 1 -0x1.03dbf630f6227p7 0x1.c8p5 +REG epsg:5931 2 -0x1.7048139e13bb2p6 0x1.c8p5 +REG epsg:5931 3 -0x1.03dbf630f6227p7 0x1.24p6 +REG epsg:5931 4 -0x1.7048139e13bb2p6 0x1.24p6 +REG epsg:5932 0 -0x1.38p5 0x1.04p6 +REG epsg:5932 1 -0x1.cf6fd8c3d889cp5 0x1.c8p5 +REG epsg:5932 2 -0x1.41204e784eec9p4 0x1.c8p5 +REG epsg:5932 3 -0x1.cf6fd8c3d889cp5 0x1.24p6 +REG epsg:5932 4 -0x1.41204e784eec9p4 0x1.24p6 +REG epsg:5933 0 0x1.08p5 0x1.04p6 +REG epsg:5933 1 0x1.c2409cf09dd92p3 0x1.c8p5 +REG epsg:5933 2 0x1.9f6fd8c3d889cp5 0x1.c8p5 +REG epsg:5933 3 0x1.c2409cf09dd92p3 0x1.24p6 +REG epsg:5933 4 0x1.9f6fd8c3d889cp5 0x1.24p6 +REG epsg:5934 0 0x1.a4p6 0x1.04p6 +REG epsg:5934 1 0x1.5848139e13bb2p6 0x1.c8p5 +REG epsg:5934 2 0x1.efb7ec61ec44ep6 0x1.c8p5 +REG epsg:5934 3 0x1.5848139e13bb2p6 0x1.24p6 +REG epsg:5934 4 0x1.efb7ec61ec44ep6 0x1.24p6 +REG epsg:5935 0 0x1.62p7 0x1.04p6 +REG epsg:5935 1 0x1.3c2409cf09dd9p7 0x1.c8p5 +REG epsg:5935 2 -0x1.482409cf09dd9p7 0x1.c8p5 +REG epsg:5935 3 0x1.3c2409cf09dd9p7 0x1.24p6 +REG epsg:5935 4 -0x1.482409cf09dd9p7 0x1.24p6 +REG epsg:5936 0 -0x1.2cp7 0x1.64p6 +REG epsg:5936 1 0x1.2cp7 0x1.54p6 +REG epsg:5936 2 -0x1.68p6 0x1.54p6 +REG epsg:5936 3 0x1.2cp7 0x1.64p6 +REG epsg:5936 4 -0x1.68p6 0x1.64p6 +REG epsg:5937 0 -0x1.9p6 0x1.64p6 +REG epsg:5937 1 -0x1.4p7 0x1.54p6 +REG epsg:5937 2 -0x1.4p5 0x1.54p6 +REG epsg:5937 3 -0x1.4p7 0x1.64p6 +REG epsg:5937 4 -0x1.4p5 0x1.64p6 +REG epsg:5938 0 -0x1.08p5 0x1.64p6 +REG epsg:5938 1 -0x1.74p6 0x1.54p6 +REG epsg:5938 2 0x1.bp4 0x1.54p6 +REG epsg:5938 3 -0x1.74p6 0x1.64p6 +REG epsg:5938 4 0x1.bp4 0x1.64p6 +REG epsg:5939 0 0x1.2p4 0x1.64p6 +REG epsg:5939 1 -0x1.5p5 0x1.54p6 +REG epsg:5939 2 0x1.38p6 0x1.54p6 +REG epsg:5939 3 -0x1.5p5 0x1.64p6 +REG epsg:5939 4 0x1.38p6 0x1.64p6 +REG epsg:5940 0 0x1.a4p6 0x1.64p6 +REG epsg:5940 1 0x1.68p5 0x1.54p6 +REG epsg:5940 2 0x1.4ap7 0x1.54p6 +REG epsg:5940 3 0x1.68p5 0x1.64p6 +REG epsg:5940 4 0x1.4ap7 0x1.64p6 +REG epsg:5942 0 0x0.0p0 0x0.0p0 +REG epsg:5942 1 -0x1.4p2 -0x1.4p2 +REG epsg:5942 2 0x1.4p2 -0x1.4p2 +REG epsg:5942 3 -0x1.4p2 0x1.4p2 +REG epsg:5942 4 0x1.4p2 0x1.4p2 +REG epsg:5945 0 0x1.6p2 0x1.dp5 +REG epsg:5945 1 -0x1.f7bb2c5982784p1 0x1.a8p5 +REG epsg:5945 2 0x1.ddeecb16609e1p3 0x1.a8p5 +REG epsg:5945 3 -0x1.f7bb2c5982784p1 0x1.f8p5 +REG epsg:5945 4 0x1.ddeecb16609e1p3 0x1.f8p5 +REG epsg:5946 0 0x1.ap2 0x1.dp5 +REG epsg:5946 1 -0x1.77bb2c5982784p1 0x1.a8p5 +REG epsg:5946 2 0x1.fdeecb16609e1p3 0x1.a8p5 +REG epsg:5946 3 -0x1.77bb2c5982784p1 0x1.f8p5 +REG epsg:5946 4 0x1.fdeecb16609e1p3 0x1.f8p5 +REG epsg:5947 0 0x1.ep2 0x1.dp5 +REG epsg:5947 1 -0x1.ef7658b304f08p0 0x1.a8p5 +REG epsg:5947 2 0x1.0ef7658b304fp4 0x1.a8p5 +REG epsg:5947 3 -0x1.ef7658b304f08p0 0x1.f8p5 +REG epsg:5947 4 0x1.0ef7658b304fp4 0x1.f8p5 +REG epsg:5948 0 0x1.1p3 0x1.dp5 +REG epsg:5948 1 -0x1.deecb16609e1p-1 0x1.a8p5 +REG epsg:5948 2 0x1.1ef7658b304fp4 0x1.a8p5 +REG epsg:5948 3 -0x1.deecb16609e1p-1 0x1.f8p5 +REG epsg:5948 4 0x1.1ef7658b304fp4 0x1.f8p5 +REG epsg:5949 0 0x1.3p3 0x1.dp5 +REG epsg:5949 1 0x1.089a74cfb0f8p-4 0x1.a8p5 +REG epsg:5949 2 0x1.2ef7658b304fp4 0x1.a8p5 +REG epsg:5949 3 0x1.089a74cfb0f8p-4 0x1.f8p5 +REG epsg:5949 4 0x1.2ef7658b304fp4 0x1.f8p5 +REG epsg:5950 0 0x1.5p3 0x1.dp5 +REG epsg:5950 1 0x1.1089a74cfb0f8p0 0x1.a8p5 +REG epsg:5950 2 0x1.3ef7658b304fp4 0x1.a8p5 +REG epsg:5950 3 0x1.1089a74cfb0f8p0 0x1.f8p5 +REG epsg:5950 4 0x1.3ef7658b304fp4 0x1.f8p5 +REG epsg:5951 0 0x1.7p3 0x1.dp5 +REG epsg:5951 1 0x1.0844d3a67d87cp1 0x1.a8p5 +REG epsg:5951 2 0x1.4ef7658b304fp4 0x1.a8p5 +REG epsg:5951 3 0x1.0844d3a67d87cp1 0x1.f8p5 +REG epsg:5951 4 0x1.4ef7658b304fp4 0x1.f8p5 +REG epsg:5952 0 0x1.9p3 0x1.dp5 +REG epsg:5952 1 0x1.8844d3a67d87cp1 0x1.a8p5 +REG epsg:5952 2 0x1.5ef7658b304fp4 0x1.a8p5 +REG epsg:5952 3 0x1.8844d3a67d87cp1 0x1.f8p5 +REG epsg:5952 4 0x1.5ef7658b304fp4 0x1.f8p5 +REG epsg:5953 0 0x1.bp3 0x1.dp5 +REG epsg:5953 1 0x1.042269d33ec3ep2 0x1.a8p5 +REG epsg:5953 2 0x1.6ef7658b304fp4 0x1.a8p5 +REG epsg:5953 3 0x1.042269d33ec3ep2 0x1.f8p5 +REG epsg:5953 4 0x1.6ef7658b304fp4 0x1.f8p5 +REG epsg:5954 0 0x1.dp3 0x1.dp5 +REG epsg:5954 1 0x1.442269d33ec3ep2 0x1.a8p5 +REG epsg:5954 2 0x1.7ef7658b304fp4 0x1.a8p5 +REG epsg:5954 3 0x1.442269d33ec3ep2 0x1.f8p5 +REG epsg:5954 4 0x1.7ef7658b304fp4 0x1.f8p5 +REG epsg:5955 0 0x1.fp3 0x1.dp5 +REG epsg:5955 1 0x1.842269d33ec3ep2 0x1.a8p5 +REG epsg:5955 2 0x1.8ef7658b304fp4 0x1.a8p5 +REG epsg:5955 3 0x1.842269d33ec3ep2 0x1.f8p5 +REG epsg:5955 4 0x1.8ef7658b304fp4 0x1.f8p5 +REG epsg:5956 0 0x1.08p4 0x1.dp5 +REG epsg:5956 1 0x1.c42269d33ec3ep2 0x1.a8p5 +REG epsg:5956 2 0x1.9ef7658b304fp4 0x1.a8p5 +REG epsg:5956 3 0x1.c42269d33ec3ep2 0x1.f8p5 +REG epsg:5956 4 0x1.9ef7658b304fp4 0x1.f8p5 +REG epsg:5957 0 0x1.18p4 0x1.dp5 +REG epsg:5957 1 0x1.021134e99f61fp3 0x1.a8p5 +REG epsg:5957 2 0x1.aef7658b304fp4 0x1.a8p5 +REG epsg:5957 3 0x1.021134e99f61fp3 0x1.f8p5 +REG epsg:5957 4 0x1.aef7658b304fp4 0x1.f8p5 +REG epsg:5958 0 0x1.28p4 0x1.dp5 +REG epsg:5958 1 0x1.221134e99f61fp3 0x1.a8p5 +REG epsg:5958 2 0x1.bef7658b304fp4 0x1.a8p5 +REG epsg:5958 3 0x1.221134e99f61fp3 0x1.f8p5 +REG epsg:5958 4 0x1.bef7658b304fp4 0x1.f8p5 +REG epsg:5959 0 0x1.38p4 0x1.dp5 +REG epsg:5959 1 0x1.421134e99f61fp3 0x1.a8p5 +REG epsg:5959 2 0x1.cef7658b304fp4 0x1.a8p5 +REG epsg:5959 3 0x1.421134e99f61fp3 0x1.f8p5 +REG epsg:5959 4 0x1.cef7658b304fp4 0x1.f8p5 +REG epsg:5960 0 0x1.48p4 0x1.dp5 +REG epsg:5960 1 0x1.621134e99f61fp3 0x1.a8p5 +REG epsg:5960 2 0x1.def7658b304fp4 0x1.a8p5 +REG epsg:5960 3 0x1.621134e99f61fp3 0x1.f8p5 +REG epsg:5960 4 0x1.def7658b304fp4 0x1.f8p5 +REG epsg:5961 0 0x1.58p4 0x1.dp5 +REG epsg:5961 1 0x1.821134e99f61fp3 0x1.a8p5 +REG epsg:5961 2 0x1.eef7658b304fp4 0x1.a8p5 +REG epsg:5961 3 0x1.821134e99f61fp3 0x1.f8p5 +REG epsg:5961 4 0x1.eef7658b304fp4 0x1.f8p5 +REG epsg:5962 0 0x1.68p4 0x1.dp5 +REG epsg:5962 1 0x1.a21134e99f61fp3 0x1.a8p5 +REG epsg:5962 2 0x1.fef7658b304fp4 0x1.a8p5 +REG epsg:5962 3 0x1.a21134e99f61fp3 0x1.f8p5 +REG epsg:5962 4 0x1.fef7658b304fp4 0x1.f8p5 +REG epsg:5963 0 0x1.78p4 0x1.dp5 +REG epsg:5963 1 0x1.c21134e99f61fp3 0x1.a8p5 +REG epsg:5963 2 0x1.077bb2c598278p5 0x1.a8p5 +REG epsg:5963 3 0x1.c21134e99f61fp3 0x1.f8p5 +REG epsg:5963 4 0x1.077bb2c598278p5 0x1.f8p5 +REG epsg:5964 0 0x1.88p4 0x1.dp5 +REG epsg:5964 1 0x1.e21134e99f61fp3 0x1.a8p5 +REG epsg:5964 2 0x1.0f7bb2c598278p5 0x1.a8p5 +REG epsg:5964 3 0x1.e21134e99f61fp3 0x1.f8p5 +REG epsg:5964 4 0x1.0f7bb2c598278p5 0x1.f8p5 +REG epsg:5965 0 0x1.98p4 0x1.dp5 +REG epsg:5965 1 0x1.01089a74cfb1p4 0x1.a8p5 +REG epsg:5965 2 0x1.177bb2c598278p5 0x1.a8p5 +REG epsg:5965 3 0x1.01089a74cfb1p4 0x1.f8p5 +REG epsg:5965 4 0x1.177bb2c598278p5 0x1.f8p5 +REG epsg:5966 0 0x1.a8p4 0x1.dp5 +REG epsg:5966 1 0x1.11089a74cfb1p4 0x1.a8p5 +REG epsg:5966 2 0x1.1f7bb2c598278p5 0x1.a8p5 +REG epsg:5966 3 0x1.11089a74cfb1p4 0x1.f8p5 +REG epsg:5966 4 0x1.1f7bb2c598278p5 0x1.f8p5 +REG epsg:5967 0 0x1.b8p4 0x1.dp5 +REG epsg:5967 1 0x1.21089a74cfb1p4 0x1.a8p5 +REG epsg:5967 2 0x1.277bb2c598278p5 0x1.a8p5 +REG epsg:5967 3 0x1.21089a74cfb1p4 0x1.f8p5 +REG epsg:5967 4 0x1.277bb2c598278p5 0x1.f8p5 +REG epsg:5968 0 0x1.c8p4 0x1.dp5 +REG epsg:5968 1 0x1.31089a74cfb1p4 0x1.a8p5 +REG epsg:5968 2 0x1.2f7bb2c598278p5 0x1.a8p5 +REG epsg:5968 3 0x1.31089a74cfb1p4 0x1.f8p5 +REG epsg:5968 4 0x1.2f7bb2c598278p5 0x1.f8p5 +REG epsg:5969 0 0x1.d8p4 0x1.dp5 +REG epsg:5969 1 0x1.41089a74cfb1p4 0x1.a8p5 +REG epsg:5969 2 0x1.377bb2c598278p5 0x1.a8p5 +REG epsg:5969 3 0x1.41089a74cfb1p4 0x1.f8p5 +REG epsg:5969 4 0x1.377bb2c598278p5 0x1.f8p5 +REG epsg:5970 0 0x1.e8p4 0x1.dp5 +REG epsg:5970 1 0x1.51089a74cfb1p4 0x1.a8p5 +REG epsg:5970 2 0x1.3f7bb2c598278p5 0x1.a8p5 +REG epsg:5970 3 0x1.51089a74cfb1p4 0x1.f8p5 +REG epsg:5970 4 0x1.3f7bb2c598278p5 0x1.f8p5 +REG epsg:5971 0 0x1.8p1 0x0.0p0 +REG epsg:5971 1 -0x1.0p1 -0x1.4p2 +REG epsg:5971 2 0x1.0p3 -0x1.4p2 +REG epsg:5971 3 -0x1.0p1 0x1.4p2 +REG epsg:5971 4 0x1.0p3 0x1.4p2 +REG epsg:5972 0 0x1.2p3 0x0.0p0 +REG epsg:5972 1 0x1.0p2 -0x1.4p2 +REG epsg:5972 2 0x1.cp3 -0x1.4p2 +REG epsg:5972 3 0x1.0p2 0x1.4p2 +REG epsg:5972 4 0x1.cp3 0x1.4p2 +REG epsg:5973 0 0x1.ep3 0x0.0p0 +REG epsg:5973 1 0x1.4p3 -0x1.4p2 +REG epsg:5973 2 0x1.4p4 -0x1.4p2 +REG epsg:5973 3 0x1.4p3 0x1.4p2 +REG epsg:5973 4 0x1.4p4 0x1.4p2 +REG epsg:5974 0 0x1.5p4 0x0.0p0 +REG epsg:5974 1 0x1.0p4 -0x1.4p2 +REG epsg:5974 2 0x1.ap4 -0x1.4p2 +REG epsg:5974 3 0x1.0p4 0x1.4p2 +REG epsg:5974 4 0x1.ap4 0x1.4p2 +REG epsg:5975 0 0x1.bp4 0x0.0p0 +REG epsg:5975 1 0x1.6p4 -0x1.4p2 +REG epsg:5975 2 0x1.0p5 -0x1.4p2 +REG epsg:5975 3 0x1.6p4 0x1.4p2 +REG epsg:5975 4 0x1.0p5 0x1.4p2 +REG epsg:5976 0 0x1.08p5 0x0.0p0 +REG epsg:5976 1 0x1.cp4 -0x1.4p2 +REG epsg:5976 2 0x1.3p5 -0x1.4p2 +REG epsg:5976 3 0x1.cp4 0x1.4p2 +REG epsg:5976 4 0x1.3p5 0x1.4p2 +REG epsg:6050 0 -0x1.ep4 0x1.5555555555556p6 +REG epsg:6050 1 -0x1.1be2242c822c2p6 0x1.4800000000001p6 +REG epsg:6050 2 0x1.5f1121641161p3 0x1.4800000000001p6 +REG epsg:6050 3 -0x1.1be2242c822c2p6 0x1.62aaaaaaaaaabp6 +REG epsg:6050 4 0x1.5f1121641161p3 0x1.62aaaaaaaaaabp6 +REG epsg:6051 0 -0x1.ap5 0x1.48p6 +REG epsg:6051 1 -0x1.2fcdcfea67ff4p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6051 2 -0x1.c0c8c0566003p4 0x1.3aaaaaaaaaaaap6 +REG epsg:6051 3 -0x1.2fcdcfea67ff4p6 0x1.5555555555556p6 +REG epsg:6051 4 -0x1.c0c8c0566003p4 0x1.5555555555556p6 +REG epsg:6052 0 -0x1.8p3 0x1.48p6 +REG epsg:6052 1 -0x1.1f9b9fd4cffe8p5 0x1.3aaaaaaaaaaaap6 +REG epsg:6052 2 0x1.7e6e7f533ffap3 0x1.3aaaaaaaaaaaap6 +REG epsg:6052 3 -0x1.1f9b9fd4cffe8p5 0x1.5555555555556p6 +REG epsg:6052 4 0x1.7e6e7f533ffap3 0x1.5555555555556p6 +REG epsg:6053 0 -0x1.14p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6053 1 -0x1.57d92f57c0bddp6 0x1.2d55555555555p6 +REG epsg:6053 2 -0x1.a04da1507e846p5 0x1.2d55555555555p6 +REG epsg:6053 3 -0x1.57d92f57c0bddp6 0x1.47fffffffffffp6 +REG epsg:6053 4 -0x1.a04da1507e846p5 0x1.47fffffffffffp6 +REG epsg:6054 0 -0x1.38p5 0x1.3aaaaaaaaaaaap6 +REG epsg:6054 1 -0x1.bfb25eaf817bap5 0x1.2d55555555555p6 +REG epsg:6054 2 -0x1.609b42a0fd08dp4 0x1.2d55555555555p6 +REG epsg:6054 3 -0x1.bfb25eaf817bap5 0x1.47fffffffffffp6 +REG epsg:6054 4 -0x1.609b42a0fd08dp4 0x1.47fffffffffffp6 +REG epsg:6055 0 -0x1.4p3 0x1.3aaaaaaaaaaaap6 +REG epsg:6055 1 -0x1.af64bd5f02f73p4 0x1.2d55555555555p6 +REG epsg:6055 2 0x1.bd92f57c0bdccp2 0x1.2d55555555555p6 +REG epsg:6055 3 -0x1.af64bd5f02f73p4 0x1.47fffffffffffp6 +REG epsg:6055 4 0x1.bd92f57c0bdccp2 0x1.47fffffffffffp6 +REG epsg:6056 0 -0x1.0p6 0x1.2d55555555556p6 +REG epsg:6056 1 -0x1.34a9095ff4a3p6 0x1.2000000000001p6 +REG epsg:6056 2 -0x1.96aded4016bap5 0x1.2000000000001p6 +REG epsg:6056 3 -0x1.34a9095ff4a3p6 0x1.3aaaaaaaaaaabp6 +REG epsg:6056 4 -0x1.96aded4016bap5 0x1.3aaaaaaaaaaabp6 +REG epsg:6057 0 -0x1.38p5 0x1.2d55555555556p6 +REG epsg:6057 1 -0x1.a15212bfe946p5 0x1.2000000000001p6 +REG epsg:6057 2 -0x1.9d5bda802d74p4 0x1.2000000000001p6 +REG epsg:6057 3 -0x1.a15212bfe946p5 0x1.3aaaaaaaaaaabp6 +REG epsg:6057 4 -0x1.9d5bda802d74p4 0x1.3aaaaaaaaaaabp6 +REG epsg:6058 0 -0x1.cp3 0x1.2d55555555556p6 +REG epsg:6058 1 -0x1.b2a4257fd28cp4 0x1.2000000000001p6 +REG epsg:6058 2 -0x1.ab7b5005ae7fp-1 0x1.2000000000001p6 +REG epsg:6058 3 -0x1.b2a4257fd28cp4 0x1.3aaaaaaaaaaabp6 +REG epsg:6058 4 -0x1.ab7b5005ae7fp-1 0x1.3aaaaaaaaaaabp6 +REG epsg:6059 0 -0x1.fp5 0x1.2p6 +REG epsg:6059 1 -0x1.2325c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6059 2 -0x1.99b4714eb0259p5 0x1.12aaaaaaaaaaap6 +REG epsg:6059 3 -0x1.2325c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6059 4 -0x1.99b4714eb0259p5 0x1.2d55555555556p6 +REG epsg:6060 0 -0x1.5p5 0x1.2p6 +REG epsg:6060 1 -0x1.a64b8eb14fda7p5 0x1.12aaaaaaaaaaap6 +REG epsg:6060 2 -0x1.f368e29d604b2p4 0x1.12aaaaaaaaaaap6 +REG epsg:6060 3 -0x1.a64b8eb14fda7p5 0x1.2d55555555556p6 +REG epsg:6060 4 -0x1.f368e29d604b2p4 0x1.2d55555555556p6 +REG epsg:6061 0 -0x1.6p4 0x1.2p6 +REG epsg:6061 1 -0x1.064b8eb14fda7p5 0x1.12aaaaaaaaaaap6 +REG epsg:6061 2 -0x1.66d1c53ac0963p3 0x1.12aaaaaaaaaaap6 +REG epsg:6061 3 -0x1.064b8eb14fda7p5 0x1.2d55555555556p6 +REG epsg:6061 4 -0x1.66d1c53ac0963p3 0x1.2d55555555556p6 +REG epsg:6062 0 -0x1.cp5 0x1.12aaaaaaaaaaap6 +REG epsg:6062 1 -0x1.04a69eac31195p6 0x1.0555555555555p6 +REG epsg:6062 2 -0x1.76b2c2a79dcd6p5 0x1.0555555555555p6 +REG epsg:6062 3 -0x1.04a69eac31195p6 0x1.1ffffffffffffp6 +REG epsg:6062 4 -0x1.76b2c2a79dcd6p5 0x1.1ffffffffffffp6 +REG epsg:6063 0 -0x1.3p5 0x1.12aaaaaaaaaaap6 +REG epsg:6063 1 -0x1.794d3d586232ap5 0x1.0555555555555p6 +REG epsg:6063 2 -0x1.cd65854f3b9adp4 0x1.0555555555555p6 +REG epsg:6063 3 -0x1.794d3d586232ap5 0x1.1ffffffffffffp6 +REG epsg:6063 4 -0x1.cd65854f3b9adp4 0x1.1ffffffffffffp6 +REG epsg:6064 0 -0x1.4p4 0x1.12aaaaaaaaaaap6 +REG epsg:6064 1 -0x1.d29a7ab0c4653p4 0x1.0555555555555p6 +REG epsg:6064 2 -0x1.5acb0a9e7735ap3 0x1.0555555555555p6 +REG epsg:6064 3 -0x1.d29a7ab0c4653p4 0x1.1ffffffffffffp6 +REG epsg:6064 4 -0x1.5acb0a9e7735ap3 0x1.1ffffffffffffp6 +REG epsg:6065 0 -0x1.98p5 0x1.0555555555555p6 +REG epsg:6065 1 -0x1.d7e5a072a9581p5 0x1.efffffffffffep5 +REG epsg:6065 2 -0x1.581a5f8d56a7fp5 0x1.efffffffffffep5 +REG epsg:6065 3 -0x1.d7e5a072a9581p5 0x1.12aaaaaaaaaabp6 +REG epsg:6065 4 -0x1.581a5f8d56a7fp5 0x1.12aaaaaaaaaabp6 +REG epsg:6066 0 -0x1.1p5 0x1.0555555555555p6 +REG epsg:6066 1 -0x1.4fe5a072a9581p5 0x1.efffffffffffep5 +REG epsg:6066 2 -0x1.a034bf1aad4ffp4 0x1.efffffffffffep5 +REG epsg:6066 3 -0x1.4fe5a072a9581p5 0x1.12aaaaaaaaaabp6 +REG epsg:6066 4 -0x1.a034bf1aad4ffp4 0x1.12aaaaaaaaaabp6 +REG epsg:6067 0 -0x1.ap5 0x1.fp5 +REG epsg:6067 1 -0x1.d8cd2bfd749a2p5 0x1.d555555555558p5 +REG epsg:6067 2 -0x1.6732d4028b65ep5 0x1.d555555555558p5 +REG epsg:6067 3 -0x1.d8cd2bfd749a2p5 0x1.0555555555554p6 +REG epsg:6067 4 -0x1.6732d4028b65ep5 0x1.0555555555554p6 +REG epsg:6068 0 -0x1.28p5 0x1.fp5 +REG epsg:6068 1 -0x1.60cd2bfd749a2p5 0x1.d555555555558p5 +REG epsg:6068 2 -0x1.de65a80516cbcp4 0x1.d555555555558p5 +REG epsg:6068 3 -0x1.60cd2bfd749a2p5 0x1.0555555555554p6 +REG epsg:6068 4 -0x1.de65a80516cbcp4 0x1.0555555555554p6 +REG epsg:6069 0 0x1.0p4 0x1.48p6 +REG epsg:6069 1 -0x1.fcdcfea67ff4p2 0x1.3aaaaaaaaaaaap6 +REG epsg:6069 2 0x1.3f9b9fd4cffe8p5 0x1.3aaaaaaaaaaaap6 +REG epsg:6069 3 -0x1.fcdcfea67ff4p2 0x1.5555555555556p6 +REG epsg:6069 4 0x1.3f9b9fd4cffe8p5 0x1.5555555555556p6 +REG epsg:6070 0 0x1.5p4 0x1.3aaaaaaaaaaaap6 +REG epsg:6070 1 0x1.026d0a83f4234p2 0x1.2d55555555555p6 +REG epsg:6070 2 0x1.2fb25eaf817bap5 0x1.2d55555555555p6 +REG epsg:6070 3 0x1.026d0a83f4234p2 0x1.47fffffffffffp6 +REG epsg:6070 4 0x1.2fb25eaf817bap5 0x1.47fffffffffffp6 +REG epsg:6071 0 0x1.4p3 0x1.2d55555555556p6 +REG epsg:6071 1 -0x1.95212bfe94604p1 0x1.2000000000001p6 +REG epsg:6071 2 0x1.72a4257fd28cp4 0x1.2000000000001p6 +REG epsg:6071 3 -0x1.95212bfe94604p1 0x1.3aaaaaaaaaaabp6 +REG epsg:6071 4 0x1.72a4257fd28cp4 0x1.3aaaaaaaaaaabp6 +REG epsg:6072 0 0x1.1p5 0x1.2d55555555556p6 +REG epsg:6072 1 0x1.4d5bda802d74p4 0x1.2000000000001p6 +REG epsg:6072 2 0x1.795212bfe946p5 0x1.2000000000001p6 +REG epsg:6072 3 0x1.4d5bda802d74p4 0x1.3aaaaaaaaaaabp6 +REG epsg:6072 4 0x1.795212bfe946p5 0x1.3aaaaaaaaaaabp6 +REG epsg:6073 0 0x1.cp3 0x1.2p6 +REG epsg:6073 1 0x1.9b4714eb0258cp1 0x1.12aaaaaaaaaaap6 +REG epsg:6073 2 0x1.8c971d629fb4ep4 0x1.12aaaaaaaaaaap6 +REG epsg:6073 3 0x1.9b4714eb0258cp1 0x1.2d55555555556p6 +REG epsg:6073 4 0x1.8c971d629fb4ep4 0x1.2d55555555556p6 +REG epsg:6074 0 0x1.1p5 0x1.2p6 +REG epsg:6074 1 0x1.7368e29d604b2p4 0x1.12aaaaaaaaaaap6 +REG epsg:6074 2 0x1.664b8eb14fda7p5 0x1.12aaaaaaaaaaap6 +REG epsg:6074 3 0x1.7368e29d604b2p4 0x1.2d55555555556p6 +REG epsg:6074 4 0x1.664b8eb14fda7p5 0x1.2d55555555556p6 +REG epsg:6075 0 0x1.a8p5 0x1.48p6 +REG epsg:6075 1 0x1.d0c8c0566003p4 0x1.3aaaaaaaaaaaap6 +REG epsg:6075 2 0x1.33cdcfea67ff4p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6075 3 0x1.d0c8c0566003p4 0x1.5555555555556p6 +REG epsg:6075 4 0x1.33cdcfea67ff4p6 0x1.5555555555556p6 +REG epsg:6076 0 0x1.74p6 0x1.48p6 +REG epsg:6076 1 0x1.143230159800cp6 0x1.3aaaaaaaaaaaap6 +REG epsg:6076 2 0x1.d3cdcfea67ff4p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6076 3 0x1.143230159800cp6 0x1.5555555555556p6 +REG epsg:6076 4 0x1.d3cdcfea67ff4p6 0x1.5555555555556p6 +REG epsg:6077 0 0x1.ap5 0x1.3aaaaaaaaaaaap6 +REG epsg:6077 1 0x1.184da1507e846p5 0x1.2d55555555555p6 +REG epsg:6077 2 0x1.13d92f57c0bddp6 0x1.2d55555555555p6 +REG epsg:6077 3 0x1.184da1507e846p5 0x1.47fffffffffffp6 +REG epsg:6077 4 0x1.13d92f57c0bddp6 0x1.47fffffffffffp6 +REG epsg:6078 0 0x1.4cp6 0x1.3aaaaaaaaaaaap6 +REG epsg:6078 1 0x1.0826d0a83f423p6 0x1.2d55555555555p6 +REG epsg:6078 2 0x1.8fd92f57c0bddp6 0x1.2d55555555555p6 +REG epsg:6078 3 0x1.0826d0a83f423p6 0x1.47fffffffffffp6 +REG epsg:6078 4 0x1.8fd92f57c0bddp6 0x1.47fffffffffffp6 +REG epsg:6079 0 0x1.c8p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6079 1 0x1.8426d0a83f423p6 0x1.2d55555555555p6 +REG epsg:6079 2 0x1.05ec97abe05eep7 0x1.2d55555555555p6 +REG epsg:6079 3 0x1.8426d0a83f423p6 0x1.47fffffffffffp6 +REG epsg:6079 4 0x1.05ec97abe05eep7 0x1.47fffffffffffp6 +REG epsg:6080 0 0x1.22p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6080 1 0x1.001368541fa12p7 0x1.2d55555555555p6 +REG epsg:6080 2 0x1.43ec97abe05eep7 0x1.2d55555555555p6 +REG epsg:6080 3 0x1.001368541fa12p7 0x1.47fffffffffffp6 +REG epsg:6080 4 0x1.43ec97abe05eep7 0x1.47fffffffffffp6 +REG epsg:6081 0 0x1.dp5 0x1.2d55555555556p6 +REG epsg:6081 1 0x1.66aded4016bap5 0x1.2000000000001p6 +REG epsg:6081 2 0x1.1ca9095ff4a3p6 0x1.2000000000001p6 +REG epsg:6081 3 0x1.66aded4016bap5 0x1.3aaaaaaaaaaabp6 +REG epsg:6081 4 0x1.1ca9095ff4a3p6 0x1.3aaaaaaaaaaabp6 +REG epsg:6082 0 0x1.48p6 0x1.2d55555555556p6 +REG epsg:6082 1 0x1.1356f6a00b5dp6 0x1.2000000000001p6 +REG epsg:6082 2 0x1.7ca9095ff4a3p6 0x1.2000000000001p6 +REG epsg:6082 3 0x1.1356f6a00b5dp6 0x1.3aaaaaaaaaaabp6 +REG epsg:6082 4 0x1.7ca9095ff4a3p6 0x1.3aaaaaaaaaaabp6 +REG epsg:6083 0 0x1.a8p6 0x1.2d55555555556p6 +REG epsg:6083 1 0x1.7356f6a00b5dp6 0x1.2000000000001p6 +REG epsg:6083 2 0x1.dca9095ff4a3p6 0x1.2000000000001p6 +REG epsg:6083 3 0x1.7356f6a00b5dp6 0x1.3aaaaaaaaaaabp6 +REG epsg:6083 4 0x1.dca9095ff4a3p6 0x1.3aaaaaaaaaaabp6 +REG epsg:6084 0 0x1.04p7 0x1.2d55555555556p6 +REG epsg:6084 1 0x1.d356f6a00b5dp6 0x1.2000000000001p6 +REG epsg:6084 2 0x1.1e5484affa518p7 0x1.2000000000001p6 +REG epsg:6084 3 0x1.d356f6a00b5dp6 0x1.3aaaaaaaaaaabp6 +REG epsg:6084 4 0x1.1e5484affa518p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6085 0 0x1.34p7 0x1.2d55555555556p6 +REG epsg:6085 1 0x1.19ab7b5005ae8p7 0x1.2000000000001p6 +REG epsg:6085 2 0x1.4e5484affa518p7 0x1.2000000000001p6 +REG epsg:6085 3 0x1.19ab7b5005ae8p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6085 4 0x1.4e5484affa518p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6086 0 0x1.66p7 0x1.2d55555555556p6 +REG epsg:6086 1 0x1.4bab7b5005ae8p7 0x1.2000000000001p6 +REG epsg:6086 2 -0x1.4fab7b5005ae8p7 0x1.2000000000001p6 +REG epsg:6086 3 0x1.4bab7b5005ae8p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6086 4 -0x1.4fab7b5005ae8p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6087 0 0x1.bp5 0x1.2p6 +REG epsg:6087 1 0x1.59b4714eb0259p5 0x1.12aaaaaaaaaaap6 +REG epsg:6087 2 0x1.0325c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6087 3 0x1.59b4714eb0259p5 0x1.2d55555555556p6 +REG epsg:6087 4 0x1.0325c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6088 0 0x1.28p6 0x1.2p6 +REG epsg:6088 1 0x1.f9b4714eb0259p5 0x1.12aaaaaaaaaaap6 +REG epsg:6088 2 0x1.5325c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6088 3 0x1.f9b4714eb0259p5 0x1.2d55555555556p6 +REG epsg:6088 4 0x1.5325c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6089 0 0x1.7cp6 0x1.2p6 +REG epsg:6089 1 0x1.50da38a75812cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6089 2 0x1.a725c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6089 3 0x1.50da38a75812cp6 0x1.2d55555555556p6 +REG epsg:6089 4 0x1.a725c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6090 0 0x1.dp6 0x1.2p6 +REG epsg:6090 1 0x1.a4da38a75812cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6090 2 0x1.fb25c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6090 3 0x1.a4da38a75812cp6 0x1.2d55555555556p6 +REG epsg:6090 4 0x1.fb25c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6091 0 0x1.12p7 0x1.2p6 +REG epsg:6091 1 0x1.f8da38a75812cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6091 2 0x1.2792e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6091 3 0x1.f8da38a75812cp6 0x1.2d55555555556p6 +REG epsg:6091 4 0x1.2792e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6092 0 0x1.3cp7 0x1.2p6 +REG epsg:6092 1 0x1.266d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6092 2 0x1.5192e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6092 3 0x1.266d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6092 4 0x1.5192e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6093 0 0x1.66p7 0x1.2p6 +REG epsg:6093 1 0x1.506d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6093 2 -0x1.546d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6093 3 0x1.506d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6093 4 -0x1.546d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6094 0 -0x1.46p7 0x1.2p6 +REG epsg:6094 1 -0x1.5b92e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6094 2 -0x1.306d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6094 3 -0x1.5b92e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6094 4 -0x1.306d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6095 0 -0x1.26p7 0x1.2p6 +REG epsg:6095 1 -0x1.3b92e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6095 2 -0x1.106d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6095 3 -0x1.3b92e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6095 4 -0x1.106d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6096 0 -0x1.4ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6096 1 -0x1.5c534f56188cap7 0x1.0555555555555p6 +REG epsg:6096 2 -0x1.37acb0a9e7736p7 0x1.0555555555555p6 +REG epsg:6096 3 -0x1.5c534f56188cap7 0x1.1ffffffffffffp6 +REG epsg:6096 4 -0x1.37acb0a9e7736p7 0x1.1ffffffffffffp6 +REG epsg:6097 0 -0x1.26p7 0x1.12aaaaaaaaaaap6 +REG epsg:6097 1 -0x1.38534f56188cap7 0x1.0555555555555p6 +REG epsg:6097 2 -0x1.13acb0a9e7736p7 0x1.0555555555555p6 +REG epsg:6097 3 -0x1.38534f56188cap7 0x1.1ffffffffffffp6 +REG epsg:6097 4 -0x1.13acb0a9e7736p7 0x1.1ffffffffffffp6 +REG epsg:6098 0 -0x1.68p6 0x1.5555555555556p6 +REG epsg:6098 1 -0x1.05f1121641161p7 0x1.4800000000001p6 +REG epsg:6098 2 -0x1.883bb7a6fba7cp5 0x1.4800000000001p6 +REG epsg:6098 3 -0x1.05f1121641161p7 0x1.62aaaaaaaaaabp6 +REG epsg:6098 4 -0x1.883bb7a6fba7cp5 0x1.62aaaaaaaaaabp6 +REG epsg:6099 0 -0x1.ccp6 0x1.48p6 +REG epsg:6099 1 -0x1.15e6e7f533ffap7 0x1.3aaaaaaaaaaaap6 +REG epsg:6099 2 -0x1.6c3230159800cp6 0x1.3aaaaaaaaaaaap6 +REG epsg:6099 3 -0x1.15e6e7f533ffap7 0x1.5555555555556p6 +REG epsg:6099 4 -0x1.6c3230159800cp6 0x1.5555555555556p6 +REG epsg:6100 0 -0x1.2cp6 0x1.48p6 +REG epsg:6100 1 -0x1.8bcdcfea67ff4p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6100 2 -0x1.9864602b30018p5 0x1.3aaaaaaaaaaaap6 +REG epsg:6100 3 -0x1.8bcdcfea67ff4p6 0x1.5555555555556p6 +REG epsg:6100 4 -0x1.9864602b30018p5 0x1.5555555555556p6 +REG epsg:6101 0 -0x1.02p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6101 1 -0x1.23ec97abe05eep7 0x1.2d55555555555p6 +REG epsg:6101 2 -0x1.c026d0a83f423p6 0x1.2d55555555555p6 +REG epsg:6101 3 -0x1.23ec97abe05eep7 0x1.47fffffffffffp6 +REG epsg:6101 4 -0x1.c026d0a83f423p6 0x1.47fffffffffffp6 +REG epsg:6102 0 -0x1.8cp6 0x1.3aaaaaaaaaaaap6 +REG epsg:6102 1 -0x1.cfd92f57c0bddp6 0x1.2d55555555555p6 +REG epsg:6102 2 -0x1.4826d0a83f423p6 0x1.2d55555555555p6 +REG epsg:6102 3 -0x1.cfd92f57c0bddp6 0x1.47fffffffffffp6 +REG epsg:6102 4 -0x1.4826d0a83f423p6 0x1.47fffffffffffp6 +REG epsg:6103 0 -0x1.14p6 0x1.3aaaaaaaaaaaap6 +REG epsg:6103 1 -0x1.57d92f57c0bddp6 0x1.2d55555555555p6 +REG epsg:6103 2 -0x1.a04da1507e846p5 0x1.2d55555555555p6 +REG epsg:6103 3 -0x1.57d92f57c0bddp6 0x1.47fffffffffffp6 +REG epsg:6103 4 -0x1.a04da1507e846p5 0x1.47fffffffffffp6 +REG epsg:6104 0 -0x1.02p7 0x1.2d55555555556p6 +REG epsg:6104 1 -0x1.1c5484affa518p7 0x1.2000000000001p6 +REG epsg:6104 2 -0x1.cf56f6a00b5dp6 0x1.2000000000001p6 +REG epsg:6104 3 -0x1.1c5484affa518p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6104 4 -0x1.cf56f6a00b5dp6 0x1.3aaaaaaaaaaabp6 +REG epsg:6105 0 -0x1.ap6 0x1.2d55555555556p6 +REG epsg:6105 1 -0x1.d4a9095ff4a3p6 0x1.2000000000001p6 +REG epsg:6105 2 -0x1.6b56f6a00b5dp6 0x1.2000000000001p6 +REG epsg:6105 3 -0x1.d4a9095ff4a3p6 0x1.3aaaaaaaaaaabp6 +REG epsg:6105 4 -0x1.6b56f6a00b5dp6 0x1.3aaaaaaaaaaabp6 +REG epsg:6106 0 -0x1.3cp6 0x1.2d55555555556p6 +REG epsg:6106 1 -0x1.70a9095ff4a3p6 0x1.2000000000001p6 +REG epsg:6106 2 -0x1.0756f6a00b5dp6 0x1.2000000000001p6 +REG epsg:6106 3 -0x1.70a9095ff4a3p6 0x1.3aaaaaaaaaaabp6 +REG epsg:6106 4 -0x1.0756f6a00b5dp6 0x1.3aaaaaaaaaaabp6 +REG epsg:6107 0 -0x1.06p7 0x1.2p6 +REG epsg:6107 1 -0x1.1b92e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6107 2 -0x1.e0da38a75812cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6107 3 -0x1.1b92e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6107 4 -0x1.e0da38a75812cp6 0x1.2d55555555556p6 +REG epsg:6108 0 -0x1.bcp6 0x1.2p6 +REG epsg:6108 1 -0x1.e725c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6108 2 -0x1.90da38a75812cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6108 3 -0x1.e725c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6108 4 -0x1.90da38a75812cp6 0x1.2d55555555556p6 +REG epsg:6109 0 -0x1.6cp6 0x1.2p6 +REG epsg:6109 1 -0x1.9725c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6109 2 -0x1.40da38a75812cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6109 3 -0x1.9725c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6109 4 -0x1.40da38a75812cp6 0x1.2d55555555556p6 +REG epsg:6110 0 -0x1.1cp6 0x1.2p6 +REG epsg:6110 1 -0x1.4725c758a7ed4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6110 2 -0x1.e1b4714eb0259p5 0x1.12aaaaaaaaaaap6 +REG epsg:6110 3 -0x1.4725c758a7ed4p6 0x1.2d55555555556p6 +REG epsg:6110 4 -0x1.e1b4714eb0259p5 0x1.2d55555555556p6 +REG epsg:6111 0 -0x1.08p7 0x1.12aaaaaaaaaaap6 +REG epsg:6111 1 -0x1.1a534f56188cap7 0x1.0555555555555p6 +REG epsg:6111 2 -0x1.eb596153cee6bp6 0x1.0555555555555p6 +REG epsg:6111 3 -0x1.1a534f56188cap7 0x1.1ffffffffffffp6 +REG epsg:6111 4 -0x1.eb596153cee6bp6 0x1.1ffffffffffffp6 +REG epsg:6112 0 -0x1.c4p6 0x1.12aaaaaaaaaaap6 +REG epsg:6112 1 -0x1.e8a69eac31195p6 0x1.0555555555555p6 +REG epsg:6112 2 -0x1.9f596153cee6bp6 0x1.0555555555555p6 +REG epsg:6112 3 -0x1.e8a69eac31195p6 0x1.1ffffffffffffp6 +REG epsg:6112 4 -0x1.9f596153cee6bp6 0x1.1ffffffffffffp6 +REG epsg:6113 0 -0x1.78p6 0x1.12aaaaaaaaaaap6 +REG epsg:6113 1 -0x1.9ca69eac31195p6 0x1.0555555555555p6 +REG epsg:6113 2 -0x1.53596153cee6bp6 0x1.0555555555555p6 +REG epsg:6113 3 -0x1.9ca69eac31195p6 0x1.1ffffffffffffp6 +REG epsg:6113 4 -0x1.53596153cee6bp6 0x1.1ffffffffffffp6 +REG epsg:6114 0 -0x1.2cp6 0x1.12aaaaaaaaaaap6 +REG epsg:6114 1 -0x1.50a69eac31195p6 0x1.0555555555555p6 +REG epsg:6114 2 -0x1.07596153cee6bp6 0x1.0555555555555p6 +REG epsg:6114 3 -0x1.50a69eac31195p6 0x1.1ffffffffffffp6 +REG epsg:6114 4 -0x1.07596153cee6bp6 0x1.1ffffffffffffp6 +REG epsg:6115 0 0x1.ep4 0x1.5555555555556p6 +REG epsg:6115 1 -0x1.5f1121641161p3 0x1.4800000000001p6 +REG epsg:6115 2 0x1.1be2242c822c2p6 0x1.4800000000001p6 +REG epsg:6115 3 -0x1.5f1121641161p3 0x1.62aaaaaaaaaabp6 +REG epsg:6115 4 0x1.1be2242c822c2p6 0x1.62aaaaaaaaaabp6 +REG epsg:6116 0 0x1.68p6 0x1.5555555555556p6 +REG epsg:6116 1 0x1.883bb7a6fba7cp5 0x1.4800000000001p6 +REG epsg:6116 2 0x1.05f1121641161p7 0x1.4800000000001p6 +REG epsg:6116 3 0x1.883bb7a6fba7cp5 0x1.62aaaaaaaaaabp6 +REG epsg:6116 4 0x1.05f1121641161p7 0x1.62aaaaaaaaaabp6 +REG epsg:6117 0 0x1.2cp7 0x1.5555555555556p6 +REG epsg:6117 1 0x1.b41ddbd37dd3ep6 0x1.4800000000001p6 +REG epsg:6117 2 -0x1.520eede9bee9fp7 0x1.4800000000001p6 +REG epsg:6117 3 0x1.b41ddbd37dd3ep6 0x1.62aaaaaaaaaabp6 +REG epsg:6117 4 -0x1.520eede9bee9fp7 0x1.62aaaaaaaaaabp6 +REG epsg:6118 0 -0x1.2cp7 0x1.5555555555556p6 +REG epsg:6118 1 0x1.520eede9bee9fp7 0x1.4800000000001p6 +REG epsg:6118 2 -0x1.b41ddbd37dd3ep6 0x1.4800000000001p6 +REG epsg:6118 3 0x1.520eede9bee9fp7 0x1.62aaaaaaaaaabp6 +REG epsg:6118 4 -0x1.b41ddbd37dd3ep6 0x1.62aaaaaaaaaabp6 +REG epsg:6119 0 0x1.0ap7 0x1.48p6 +REG epsg:6119 1 0x1.b43230159800cp6 0x1.3aaaaaaaaaaaap6 +REG epsg:6119 2 0x1.39e6e7f533ffap7 0x1.3aaaaaaaaaaaap6 +REG epsg:6119 3 0x1.b43230159800cp6 0x1.5555555555556p6 +REG epsg:6119 4 0x1.39e6e7f533ffap7 0x1.5555555555556p6 +REG epsg:6120 0 0x1.4cp7 0x1.48p6 +REG epsg:6120 1 0x1.1c19180acc006p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6120 2 -0x1.5419180acc006p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6120 3 0x1.1c19180acc006p7 0x1.5555555555556p6 +REG epsg:6120 4 -0x1.5419180acc006p7 0x1.5555555555556p6 +REG epsg:6121 0 -0x1.34p7 0x1.48p6 +REG epsg:6121 1 -0x1.63e6e7f533ffap7 0x1.3aaaaaaaaaaaap6 +REG epsg:6121 2 -0x1.0419180acc006p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6121 3 -0x1.63e6e7f533ffap7 0x1.5555555555556p6 +REG epsg:6121 4 -0x1.0419180acc006p7 0x1.5555555555556p6 +REG epsg:6122 0 0x1.6p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6122 1 0x1.3e1368541fa12p7 0x1.2d55555555555p6 +REG epsg:6122 2 -0x1.4e1368541fa12p7 0x1.2d55555555555p6 +REG epsg:6122 3 0x1.3e1368541fa12p7 0x1.47fffffffffffp6 +REG epsg:6122 4 -0x1.4e1368541fa12p7 0x1.47fffffffffffp6 +REG epsg:6123 0 -0x1.32p7 0x1.3aaaaaaaaaaaap6 +REG epsg:6123 1 -0x1.53ec97abe05eep7 0x1.2d55555555555p6 +REG epsg:6123 2 -0x1.101368541fa12p7 0x1.2d55555555555p6 +REG epsg:6123 3 -0x1.53ec97abe05eep7 0x1.47fffffffffffp6 +REG epsg:6123 4 -0x1.101368541fa12p7 0x1.47fffffffffffp6 +REG epsg:6124 0 -0x1.36p7 0x1.2d55555555556p6 +REG epsg:6124 1 -0x1.505484affa518p7 0x1.2000000000001p6 +REG epsg:6124 2 -0x1.1bab7b5005ae8p7 0x1.2000000000001p6 +REG epsg:6124 3 -0x1.505484affa518p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6124 4 -0x1.1bab7b5005ae8p7 0x1.3aaaaaaaaaaabp6 +REG epsg:6125 0 -0x1.4p2 0x1.2p6 +REG epsg:6125 1 -0x1.f92e3ac53f69dp3 0x1.12aaaaaaaaaaap6 +REG epsg:6125 2 0x1.725c758a7ed3ap2 0x1.12aaaaaaaaaaap6 +REG epsg:6125 3 -0x1.f92e3ac53f69dp3 0x1.2d55555555556p6 +REG epsg:6125 4 0x1.725c758a7ed3ap2 0x1.2d55555555556p6 +REG epsg:6128 0 -0x1.44p6 0x0.0p0 +REG epsg:6128 1 -0x1.58p6 -0x1.4p2 +REG epsg:6128 2 -0x1.3p6 -0x1.4p2 +REG epsg:6128 3 -0x1.58p6 0x1.4p2 +REG epsg:6128 4 -0x1.3p6 0x1.4p2 +REG epsg:6129 0 -0x1.44p6 0x0.0p0 +REG epsg:6129 1 -0x1.58p6 -0x1.4p2 +REG epsg:6129 2 -0x1.3p6 -0x1.4p2 +REG epsg:6129 3 -0x1.58p6 0x1.4p2 +REG epsg:6129 4 -0x1.3p6 0x1.4p2 +REG epsg:6133 0 0x0.0p0 0x0.0p0 +REG epsg:6133 1 -0x1.4p2 -0x1.4p2 +REG epsg:6133 2 0x1.4p2 -0x1.4p2 +REG epsg:6133 3 -0x1.4p2 0x1.4p2 +REG epsg:6133 4 0x1.4p2 0x1.4p2 +REG epsg:6135 0 0x0.0p0 0x0.0p0 +REG epsg:6135 1 -0x1.4p2 -0x1.4p2 +REG epsg:6135 2 0x1.4p2 -0x1.4p2 +REG epsg:6135 3 -0x1.4p2 0x1.4p2 +REG epsg:6135 4 0x1.4p2 0x1.4p2 +REG epsg:6141 0 0x1.4244444444444p6 0x1.3844444444444p4 +REG epsg:6141 1 0x1.3e05d87bf2564p6 0x1.2844444444444p4 +REG epsg:6141 2 0x1.4682b00c96324p6 0x1.2844444444444p4 +REG epsg:6141 3 0x1.3e05d87bf2564p6 0x1.4844444444444p4 +REG epsg:6141 4 0x1.4682b00c96324p6 0x1.4844444444444p4 +REG epsg:6144 0 0x0.0p0 0x0.0p0 +REG epsg:6144 1 -0x1.4p2 -0x1.4p2 +REG epsg:6144 2 0x1.4p2 -0x1.4p2 +REG epsg:6144 3 -0x1.4p2 0x1.4p2 +REG epsg:6144 4 0x1.4p2 0x1.4p2 +REG epsg:6145 0 0x1.6p2 0x1.dp5 +REG epsg:6145 1 -0x1.f7bb2c5982784p1 0x1.a8p5 +REG epsg:6145 2 0x1.ddeecb16609e1p3 0x1.a8p5 +REG epsg:6145 3 -0x1.f7bb2c5982784p1 0x1.f8p5 +REG epsg:6145 4 0x1.ddeecb16609e1p3 0x1.f8p5 +REG epsg:6146 0 0x1.ap2 0x1.dp5 +REG epsg:6146 1 -0x1.77bb2c5982784p1 0x1.a8p5 +REG epsg:6146 2 0x1.fdeecb16609e1p3 0x1.a8p5 +REG epsg:6146 3 -0x1.77bb2c5982784p1 0x1.f8p5 +REG epsg:6146 4 0x1.fdeecb16609e1p3 0x1.f8p5 +REG epsg:6147 0 0x1.ep2 0x1.dp5 +REG epsg:6147 1 -0x1.ef7658b304f08p0 0x1.a8p5 +REG epsg:6147 2 0x1.0ef7658b304fp4 0x1.a8p5 +REG epsg:6147 3 -0x1.ef7658b304f08p0 0x1.f8p5 +REG epsg:6147 4 0x1.0ef7658b304fp4 0x1.f8p5 +REG epsg:6148 0 0x1.1p3 0x1.dp5 +REG epsg:6148 1 -0x1.deecb16609e1p-1 0x1.a8p5 +REG epsg:6148 2 0x1.1ef7658b304fp4 0x1.a8p5 +REG epsg:6148 3 -0x1.deecb16609e1p-1 0x1.f8p5 +REG epsg:6148 4 0x1.1ef7658b304fp4 0x1.f8p5 +REG epsg:6149 0 0x1.3p3 0x1.dp5 +REG epsg:6149 1 0x1.089a74cfb0f8p-4 0x1.a8p5 +REG epsg:6149 2 0x1.2ef7658b304fp4 0x1.a8p5 +REG epsg:6149 3 0x1.089a74cfb0f8p-4 0x1.f8p5 +REG epsg:6149 4 0x1.2ef7658b304fp4 0x1.f8p5 +REG epsg:6150 0 0x1.5p3 0x1.dp5 +REG epsg:6150 1 0x1.1089a74cfb0f8p0 0x1.a8p5 +REG epsg:6150 2 0x1.3ef7658b304fp4 0x1.a8p5 +REG epsg:6150 3 0x1.1089a74cfb0f8p0 0x1.f8p5 +REG epsg:6150 4 0x1.3ef7658b304fp4 0x1.f8p5 +REG epsg:6151 0 0x1.7p3 0x1.dp5 +REG epsg:6151 1 0x1.0844d3a67d87cp1 0x1.a8p5 +REG epsg:6151 2 0x1.4ef7658b304fp4 0x1.a8p5 +REG epsg:6151 3 0x1.0844d3a67d87cp1 0x1.f8p5 +REG epsg:6151 4 0x1.4ef7658b304fp4 0x1.f8p5 +REG epsg:6152 0 0x1.9p3 0x1.dp5 +REG epsg:6152 1 0x1.8844d3a67d87cp1 0x1.a8p5 +REG epsg:6152 2 0x1.5ef7658b304fp4 0x1.a8p5 +REG epsg:6152 3 0x1.8844d3a67d87cp1 0x1.f8p5 +REG epsg:6152 4 0x1.5ef7658b304fp4 0x1.f8p5 +REG epsg:6153 0 0x1.bp3 0x1.dp5 +REG epsg:6153 1 0x1.042269d33ec3ep2 0x1.a8p5 +REG epsg:6153 2 0x1.6ef7658b304fp4 0x1.a8p5 +REG epsg:6153 3 0x1.042269d33ec3ep2 0x1.f8p5 +REG epsg:6153 4 0x1.6ef7658b304fp4 0x1.f8p5 +REG epsg:6154 0 0x1.dp3 0x1.dp5 +REG epsg:6154 1 0x1.442269d33ec3ep2 0x1.a8p5 +REG epsg:6154 2 0x1.7ef7658b304fp4 0x1.a8p5 +REG epsg:6154 3 0x1.442269d33ec3ep2 0x1.f8p5 +REG epsg:6154 4 0x1.7ef7658b304fp4 0x1.f8p5 +REG epsg:6155 0 0x1.fp3 0x1.dp5 +REG epsg:6155 1 0x1.842269d33ec3ep2 0x1.a8p5 +REG epsg:6155 2 0x1.8ef7658b304fp4 0x1.a8p5 +REG epsg:6155 3 0x1.842269d33ec3ep2 0x1.f8p5 +REG epsg:6155 4 0x1.8ef7658b304fp4 0x1.f8p5 +REG epsg:6156 0 0x1.08p4 0x1.dp5 +REG epsg:6156 1 0x1.c42269d33ec3ep2 0x1.a8p5 +REG epsg:6156 2 0x1.9ef7658b304fp4 0x1.a8p5 +REG epsg:6156 3 0x1.c42269d33ec3ep2 0x1.f8p5 +REG epsg:6156 4 0x1.9ef7658b304fp4 0x1.f8p5 +REG epsg:6157 0 0x1.18p4 0x1.dp5 +REG epsg:6157 1 0x1.021134e99f61fp3 0x1.a8p5 +REG epsg:6157 2 0x1.aef7658b304fp4 0x1.a8p5 +REG epsg:6157 3 0x1.021134e99f61fp3 0x1.f8p5 +REG epsg:6157 4 0x1.aef7658b304fp4 0x1.f8p5 +REG epsg:6158 0 0x1.28p4 0x1.dp5 +REG epsg:6158 1 0x1.221134e99f61fp3 0x1.a8p5 +REG epsg:6158 2 0x1.bef7658b304fp4 0x1.a8p5 +REG epsg:6158 3 0x1.221134e99f61fp3 0x1.f8p5 +REG epsg:6158 4 0x1.bef7658b304fp4 0x1.f8p5 +REG epsg:6159 0 0x1.38p4 0x1.dp5 +REG epsg:6159 1 0x1.421134e99f61fp3 0x1.a8p5 +REG epsg:6159 2 0x1.cef7658b304fp4 0x1.a8p5 +REG epsg:6159 3 0x1.421134e99f61fp3 0x1.f8p5 +REG epsg:6159 4 0x1.cef7658b304fp4 0x1.f8p5 +REG epsg:6160 0 0x1.48p4 0x1.dp5 +REG epsg:6160 1 0x1.621134e99f61fp3 0x1.a8p5 +REG epsg:6160 2 0x1.def7658b304fp4 0x1.a8p5 +REG epsg:6160 3 0x1.621134e99f61fp3 0x1.f8p5 +REG epsg:6160 4 0x1.def7658b304fp4 0x1.f8p5 +REG epsg:6161 0 0x1.58p4 0x1.dp5 +REG epsg:6161 1 0x1.821134e99f61fp3 0x1.a8p5 +REG epsg:6161 2 0x1.eef7658b304fp4 0x1.a8p5 +REG epsg:6161 3 0x1.821134e99f61fp3 0x1.f8p5 +REG epsg:6161 4 0x1.eef7658b304fp4 0x1.f8p5 +REG epsg:6162 0 0x1.68p4 0x1.dp5 +REG epsg:6162 1 0x1.a21134e99f61fp3 0x1.a8p5 +REG epsg:6162 2 0x1.fef7658b304fp4 0x1.a8p5 +REG epsg:6162 3 0x1.a21134e99f61fp3 0x1.f8p5 +REG epsg:6162 4 0x1.fef7658b304fp4 0x1.f8p5 +REG epsg:6163 0 0x1.78p4 0x1.dp5 +REG epsg:6163 1 0x1.c21134e99f61fp3 0x1.a8p5 +REG epsg:6163 2 0x1.077bb2c598278p5 0x1.a8p5 +REG epsg:6163 3 0x1.c21134e99f61fp3 0x1.f8p5 +REG epsg:6163 4 0x1.077bb2c598278p5 0x1.f8p5 +REG epsg:6164 0 0x1.88p4 0x1.dp5 +REG epsg:6164 1 0x1.e21134e99f61fp3 0x1.a8p5 +REG epsg:6164 2 0x1.0f7bb2c598278p5 0x1.a8p5 +REG epsg:6164 3 0x1.e21134e99f61fp3 0x1.f8p5 +REG epsg:6164 4 0x1.0f7bb2c598278p5 0x1.f8p5 +REG epsg:6165 0 0x1.98p4 0x1.dp5 +REG epsg:6165 1 0x1.01089a74cfb1p4 0x1.a8p5 +REG epsg:6165 2 0x1.177bb2c598278p5 0x1.a8p5 +REG epsg:6165 3 0x1.01089a74cfb1p4 0x1.f8p5 +REG epsg:6165 4 0x1.177bb2c598278p5 0x1.f8p5 +REG epsg:6166 0 0x1.a8p4 0x1.dp5 +REG epsg:6166 1 0x1.11089a74cfb1p4 0x1.a8p5 +REG epsg:6166 2 0x1.1f7bb2c598278p5 0x1.a8p5 +REG epsg:6166 3 0x1.11089a74cfb1p4 0x1.f8p5 +REG epsg:6166 4 0x1.1f7bb2c598278p5 0x1.f8p5 +REG epsg:6167 0 0x1.b8p4 0x1.dp5 +REG epsg:6167 1 0x1.21089a74cfb1p4 0x1.a8p5 +REG epsg:6167 2 0x1.277bb2c598278p5 0x1.a8p5 +REG epsg:6167 3 0x1.21089a74cfb1p4 0x1.f8p5 +REG epsg:6167 4 0x1.277bb2c598278p5 0x1.f8p5 +REG epsg:6168 0 0x1.c8p4 0x1.dp5 +REG epsg:6168 1 0x1.31089a74cfb1p4 0x1.a8p5 +REG epsg:6168 2 0x1.2f7bb2c598278p5 0x1.a8p5 +REG epsg:6168 3 0x1.31089a74cfb1p4 0x1.f8p5 +REG epsg:6168 4 0x1.2f7bb2c598278p5 0x1.f8p5 +REG epsg:6169 0 0x1.d8p4 0x1.dp5 +REG epsg:6169 1 0x1.41089a74cfb1p4 0x1.a8p5 +REG epsg:6169 2 0x1.377bb2c598278p5 0x1.a8p5 +REG epsg:6169 3 0x1.41089a74cfb1p4 0x1.f8p5 +REG epsg:6169 4 0x1.377bb2c598278p5 0x1.f8p5 +REG epsg:6170 0 0x1.e8p4 0x1.dp5 +REG epsg:6170 1 0x1.51089a74cfb1p4 0x1.a8p5 +REG epsg:6170 2 0x1.3f7bb2c598278p5 0x1.a8p5 +REG epsg:6170 3 0x1.51089a74cfb1p4 0x1.f8p5 +REG epsg:6170 4 0x1.3f7bb2c598278p5 0x1.f8p5 +REG epsg:6171 0 0x1.8p1 0x0.0p0 +REG epsg:6171 1 -0x1.0p1 -0x1.4p2 +REG epsg:6171 2 0x1.0p3 -0x1.4p2 +REG epsg:6171 3 -0x1.0p1 0x1.4p2 +REG epsg:6171 4 0x1.0p3 0x1.4p2 +REG epsg:6172 0 0x1.2p3 0x0.0p0 +REG epsg:6172 1 0x1.0p2 -0x1.4p2 +REG epsg:6172 2 0x1.cp3 -0x1.4p2 +REG epsg:6172 3 0x1.0p2 0x1.4p2 +REG epsg:6172 4 0x1.cp3 0x1.4p2 +REG epsg:6173 0 0x1.ep3 0x0.0p0 +REG epsg:6173 1 0x1.4p3 -0x1.4p2 +REG epsg:6173 2 0x1.4p4 -0x1.4p2 +REG epsg:6173 3 0x1.4p3 0x1.4p2 +REG epsg:6173 4 0x1.4p4 0x1.4p2 +REG epsg:6174 0 0x1.5p4 0x0.0p0 +REG epsg:6174 1 0x1.0p4 -0x1.4p2 +REG epsg:6174 2 0x1.ap4 -0x1.4p2 +REG epsg:6174 3 0x1.0p4 0x1.4p2 +REG epsg:6174 4 0x1.ap4 0x1.4p2 +REG epsg:6175 0 0x1.bp4 0x0.0p0 +REG epsg:6175 1 0x1.6p4 -0x1.4p2 +REG epsg:6175 2 0x1.0p5 -0x1.4p2 +REG epsg:6175 3 0x1.6p4 0x1.4p2 +REG epsg:6175 4 0x1.0p5 0x1.4p2 +REG epsg:6176 0 0x1.08p5 0x0.0p0 +REG epsg:6176 1 0x1.cp4 -0x1.4p2 +REG epsg:6176 2 0x1.3p5 -0x1.4p2 +REG epsg:6176 3 0x1.cp4 0x1.4p2 +REG epsg:6176 4 0x1.3p5 0x1.4p2 +REG epsg:6190 0 0x1.1784e6cbc3292p2 0x1.17aaaabdae4bep6 +REG epsg:6190 1 -0x1.3a8542c83e86dp5 0x1.b755557b5c97cp5 +REG epsg:6190 2 0x1.80667c7b2f511p5 0x1.b755557b5c97cp5 +REG epsg:6190 3 -0x1.3a8542c83e86dp5 0x1.53aaaabdae4bep6 +REG epsg:6190 4 0x1.80667c7b2f511p5 0x1.53aaaabdae4bep6 +REG epsg:6204 0 0x1.5p4 0x0.0p0 +REG epsg:6204 1 0x1.0p4 -0x1.4p2 +REG epsg:6204 2 0x1.ap4 -0x1.4p2 +REG epsg:6204 3 0x1.0p4 0x1.4p2 +REG epsg:6204 4 0x1.ap4 0x1.4p2 +REG epsg:6207 0 0x0.0p0 0x0.0p0 +REG epsg:6207 1 -0x1.4p2 -0x1.4p2 +REG epsg:6207 2 0x1.4p2 -0x1.4p2 +REG epsg:6207 3 -0x1.4p2 0x1.4p2 +REG epsg:6207 4 0x1.4p2 0x1.4p2 +REG epsg:6210 0 -0x1.68p5 0x0.0p0 +REG epsg:6210 1 -0x1.9p5 -0x1.4p2 +REG epsg:6210 2 -0x1.4p5 -0x1.4p2 +REG epsg:6210 3 -0x1.9p5 0x1.4p2 +REG epsg:6210 4 -0x1.4p5 0x1.4p2 +REG epsg:6211 0 -0x1.38p5 0x0.0p0 +REG epsg:6211 1 -0x1.6p5 -0x1.4p2 +REG epsg:6211 2 -0x1.1p5 -0x1.4p2 +REG epsg:6211 3 -0x1.6p5 0x1.4p2 +REG epsg:6211 4 -0x1.1p5 0x1.4p2 +REG epsg:6307 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:6307 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:6307 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:6307 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:6307 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:6309 0 0x0.0p0 0x0.0p0 +REG epsg:6309 1 -0x1.4p2 -0x1.4p2 +REG epsg:6309 2 0x1.4p2 -0x1.4p2 +REG epsg:6309 3 -0x1.4p2 0x1.4p2 +REG epsg:6309 4 0x1.4p2 0x1.4p2 +REG epsg:6311 0 0x0.0p0 0x0.0p0 +REG epsg:6311 1 -0x1.4p2 -0x1.4p2 +REG epsg:6311 2 0x1.4p2 -0x1.4p2 +REG epsg:6311 3 -0x1.4p2 0x1.4p2 +REG epsg:6311 4 0x1.4p2 0x1.4p2 +REG epsg:6312 0 0x1.08p5 0x0.0p0 +REG epsg:6312 1 0x1.cp4 -0x1.4p2 +REG epsg:6312 2 0x1.3p5 -0x1.4p2 +REG epsg:6312 3 0x1.cp4 0x1.4p2 +REG epsg:6312 4 0x1.3p5 0x1.4p2 +REG epsg:6316 0 0x1.5p4 0x0.0p0 +REG epsg:6316 1 0x1.0p4 -0x1.4p2 +REG epsg:6316 2 0x1.ap4 -0x1.4p2 +REG epsg:6316 3 0x1.0p4 0x1.4p2 +REG epsg:6316 4 0x1.ap4 0x1.4p2 +REG epsg:6317 0 0x0.0p0 0x0.0p0 +REG epsg:6317 1 -0x1.4p2 -0x1.4p2 +REG epsg:6317 2 0x1.4p2 -0x1.4p2 +REG epsg:6317 3 -0x1.4p2 0x1.4p2 +REG epsg:6317 4 0x1.4p2 0x1.4p2 +REG epsg:6318 0 0x0.0p0 0x0.0p0 +REG epsg:6318 1 -0x1.4p2 -0x1.4p2 +REG epsg:6318 2 0x1.4p2 -0x1.4p2 +REG epsg:6318 3 -0x1.4p2 0x1.4p2 +REG epsg:6318 4 0x1.4p2 0x1.4p2 +REG epsg:6320 0 0x0.0p0 0x0.0p0 +REG epsg:6320 1 -0x1.4p2 -0x1.4p2 +REG epsg:6320 2 0x1.4p2 -0x1.4p2 +REG epsg:6320 3 -0x1.4p2 0x1.4p2 +REG epsg:6320 4 0x1.4p2 0x1.4p2 +REG epsg:6322 0 0x0.0p0 0x0.0p0 +REG epsg:6322 1 -0x1.4p2 -0x1.4p2 +REG epsg:6322 2 0x1.4p2 -0x1.4p2 +REG epsg:6322 3 -0x1.4p2 0x1.4p2 +REG epsg:6322 4 0x1.4p2 0x1.4p2 +REG epsg:6323 0 0x0.0p0 0x0.0p0 +REG epsg:6323 1 -0x1.4p2 -0x1.4p2 +REG epsg:6323 2 0x1.4p2 -0x1.4p2 +REG epsg:6323 3 -0x1.4p2 0x1.4p2 +REG epsg:6323 4 0x1.4p2 0x1.4p2 +REG epsg:6325 0 0x0.0p0 0x0.0p0 +REG epsg:6325 1 -0x1.4p2 -0x1.4p2 +REG epsg:6325 2 0x1.4p2 -0x1.4p2 +REG epsg:6325 3 -0x1.4p2 0x1.4p2 +REG epsg:6325 4 0x1.4p2 0x1.4p2 +REG epsg:6328 0 0x1.56p7 0x0.0p0 +REG epsg:6328 1 0x1.4cp7 -0x1.4p2 +REG epsg:6328 2 0x1.6p7 -0x1.4p2 +REG epsg:6328 3 0x1.4cp7 0x1.4p2 +REG epsg:6328 4 0x1.6p7 0x1.4p2 +REG epsg:6329 0 0x1.62p7 0x0.0p0 +REG epsg:6329 1 0x1.58p7 -0x1.4p2 +REG epsg:6329 2 -0x1.64p7 -0x1.4p2 +REG epsg:6329 3 0x1.58p7 0x1.4p2 +REG epsg:6329 4 -0x1.64p7 0x1.4p2 +REG epsg:6330 0 -0x1.62p7 0x0.0p0 +REG epsg:6330 1 0x1.64p7 -0x1.4p2 +REG epsg:6330 2 -0x1.58p7 -0x1.4p2 +REG epsg:6330 3 0x1.64p7 0x1.4p2 +REG epsg:6330 4 -0x1.58p7 0x1.4p2 +REG epsg:6331 0 -0x1.56p7 0x0.0p0 +REG epsg:6331 1 -0x1.6p7 -0x1.4p2 +REG epsg:6331 2 -0x1.4cp7 -0x1.4p2 +REG epsg:6331 3 -0x1.6p7 0x1.4p2 +REG epsg:6331 4 -0x1.4cp7 0x1.4p2 +REG epsg:6332 0 -0x1.4ap7 0x0.0p0 +REG epsg:6332 1 -0x1.54p7 -0x1.4p2 +REG epsg:6332 2 -0x1.4p7 -0x1.4p2 +REG epsg:6332 3 -0x1.54p7 0x1.4p2 +REG epsg:6332 4 -0x1.4p7 0x1.4p2 +REG epsg:6333 0 -0x1.3ep7 0x0.0p0 +REG epsg:6333 1 -0x1.48p7 -0x1.4p2 +REG epsg:6333 2 -0x1.34p7 -0x1.4p2 +REG epsg:6333 3 -0x1.48p7 0x1.4p2 +REG epsg:6333 4 -0x1.34p7 0x1.4p2 +REG epsg:6334 0 -0x1.32p7 0x0.0p0 +REG epsg:6334 1 -0x1.3cp7 -0x1.4p2 +REG epsg:6334 2 -0x1.28p7 -0x1.4p2 +REG epsg:6334 3 -0x1.3cp7 0x1.4p2 +REG epsg:6334 4 -0x1.28p7 0x1.4p2 +REG epsg:6335 0 -0x1.26p7 0x0.0p0 +REG epsg:6335 1 -0x1.3p7 -0x1.4p2 +REG epsg:6335 2 -0x1.1cp7 -0x1.4p2 +REG epsg:6335 3 -0x1.3p7 0x1.4p2 +REG epsg:6335 4 -0x1.1cp7 0x1.4p2 +REG epsg:6336 0 -0x1.1ap7 0x0.0p0 +REG epsg:6336 1 -0x1.24p7 -0x1.4p2 +REG epsg:6336 2 -0x1.1p7 -0x1.4p2 +REG epsg:6336 3 -0x1.24p7 0x1.4p2 +REG epsg:6336 4 -0x1.1p7 0x1.4p2 +REG epsg:6337 0 -0x1.0ep7 0x0.0p0 +REG epsg:6337 1 -0x1.18p7 -0x1.4p2 +REG epsg:6337 2 -0x1.04p7 -0x1.4p2 +REG epsg:6337 3 -0x1.18p7 0x1.4p2 +REG epsg:6337 4 -0x1.04p7 0x1.4p2 +REG epsg:6338 0 -0x1.02p7 0x0.0p0 +REG epsg:6338 1 -0x1.0cp7 -0x1.4p2 +REG epsg:6338 2 -0x1.fp6 -0x1.4p2 +REG epsg:6338 3 -0x1.0cp7 0x1.4p2 +REG epsg:6338 4 -0x1.fp6 0x1.4p2 +REG epsg:6339 0 -0x1.ecp6 0x0.0p0 +REG epsg:6339 1 -0x1.0p7 -0x1.4p2 +REG epsg:6339 2 -0x1.d8p6 -0x1.4p2 +REG epsg:6339 3 -0x1.0p7 0x1.4p2 +REG epsg:6339 4 -0x1.d8p6 0x1.4p2 +REG epsg:6340 0 -0x1.d4p6 0x0.0p0 +REG epsg:6340 1 -0x1.e8p6 -0x1.4p2 +REG epsg:6340 2 -0x1.cp6 -0x1.4p2 +REG epsg:6340 3 -0x1.e8p6 0x1.4p2 +REG epsg:6340 4 -0x1.cp6 0x1.4p2 +REG epsg:6341 0 -0x1.bcp6 0x0.0p0 +REG epsg:6341 1 -0x1.dp6 -0x1.4p2 +REG epsg:6341 2 -0x1.a8p6 -0x1.4p2 +REG epsg:6341 3 -0x1.dp6 0x1.4p2 +REG epsg:6341 4 -0x1.a8p6 0x1.4p2 +REG epsg:6342 0 -0x1.a4p6 0x0.0p0 +REG epsg:6342 1 -0x1.b8p6 -0x1.4p2 +REG epsg:6342 2 -0x1.9p6 -0x1.4p2 +REG epsg:6342 3 -0x1.b8p6 0x1.4p2 +REG epsg:6342 4 -0x1.9p6 0x1.4p2 +REG epsg:6343 0 -0x1.8cp6 0x0.0p0 +REG epsg:6343 1 -0x1.ap6 -0x1.4p2 +REG epsg:6343 2 -0x1.78p6 -0x1.4p2 +REG epsg:6343 3 -0x1.ap6 0x1.4p2 +REG epsg:6343 4 -0x1.78p6 0x1.4p2 +REG epsg:6344 0 -0x1.74p6 0x0.0p0 +REG epsg:6344 1 -0x1.88p6 -0x1.4p2 +REG epsg:6344 2 -0x1.6p6 -0x1.4p2 +REG epsg:6344 3 -0x1.88p6 0x1.4p2 +REG epsg:6344 4 -0x1.6p6 0x1.4p2 +REG epsg:6345 0 -0x1.5cp6 0x0.0p0 +REG epsg:6345 1 -0x1.7p6 -0x1.4p2 +REG epsg:6345 2 -0x1.48p6 -0x1.4p2 +REG epsg:6345 3 -0x1.7p6 0x1.4p2 +REG epsg:6345 4 -0x1.48p6 0x1.4p2 +REG epsg:6346 0 -0x1.44p6 0x0.0p0 +REG epsg:6346 1 -0x1.58p6 -0x1.4p2 +REG epsg:6346 2 -0x1.3p6 -0x1.4p2 +REG epsg:6346 3 -0x1.58p6 0x1.4p2 +REG epsg:6346 4 -0x1.3p6 0x1.4p2 +REG epsg:6347 0 -0x1.2cp6 0x0.0p0 +REG epsg:6347 1 -0x1.4p6 -0x1.4p2 +REG epsg:6347 2 -0x1.18p6 -0x1.4p2 +REG epsg:6347 3 -0x1.4p6 0x1.4p2 +REG epsg:6347 4 -0x1.18p6 0x1.4p2 +REG epsg:6348 0 -0x1.14p6 0x0.0p0 +REG epsg:6348 1 -0x1.28p6 -0x1.4p2 +REG epsg:6348 2 -0x1.0p6 -0x1.4p2 +REG epsg:6348 3 -0x1.28p6 0x1.4p2 +REG epsg:6348 4 -0x1.0p6 0x1.4p2 +REG epsg:6349 0 0x0.0p0 0x0.0p0 +REG epsg:6349 1 -0x1.4p2 -0x1.4p2 +REG epsg:6349 2 0x1.4p2 -0x1.4p2 +REG epsg:6349 3 -0x1.4p2 0x1.4p2 +REG epsg:6349 4 0x1.4p2 0x1.4p2 +REG epsg:6350 0 -0x1.8p6 0x1.12p5 +REG epsg:6350 1 -0x1.c8965fc9568dcp6 0x1.34p4 +REG epsg:6350 2 -0x1.3769a036a9724p6 0x1.34p4 +REG epsg:6350 3 -0x1.c8965fc9568dcp6 0x1.8ap5 +REG epsg:6350 4 -0x1.3769a036a9724p6 0x1.8ap5 +REG epsg:6351 0 -0x1.46p7 0x1.2p6 +REG epsg:6351 1 -0x1.5b92e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6351 2 -0x1.306d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6351 3 -0x1.5b92e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6351 4 -0x1.306d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6352 0 -0x1.26p7 0x1.2p6 +REG epsg:6352 1 -0x1.3b92e3ac53f6ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6352 2 -0x1.106d1c53ac096p7 0x1.12aaaaaaaaaaap6 +REG epsg:6352 3 -0x1.3b92e3ac53f6ap7 0x1.2d55555555556p6 +REG epsg:6352 4 -0x1.106d1c53ac096p7 0x1.2d55555555556p6 +REG epsg:6353 0 -0x1.4ap7 0x1.12aaaaaaaaaaap6 +REG epsg:6353 1 -0x1.5c534f56188cap7 0x1.0555555555555p6 +REG epsg:6353 2 -0x1.37acb0a9e7736p7 0x1.0555555555555p6 +REG epsg:6353 3 -0x1.5c534f56188cap7 0x1.1ffffffffffffp6 +REG epsg:6353 4 -0x1.37acb0a9e7736p7 0x1.1ffffffffffffp6 +REG epsg:6354 0 -0x1.26p7 0x1.12aaaaaaaaaaap6 +REG epsg:6354 1 -0x1.38534f56188cap7 0x1.0555555555555p6 +REG epsg:6354 2 -0x1.13acb0a9e7736p7 0x1.0555555555555p6 +REG epsg:6354 3 -0x1.38534f56188cap7 0x1.1ffffffffffffp6 +REG epsg:6354 4 -0x1.13acb0a9e7736p7 0x1.1ffffffffffffp6 +REG epsg:6355 0 -0x1.5755555555555p6 0x1.e8p4 +REG epsg:6355 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG epsg:6355 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG epsg:6355 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG epsg:6355 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG epsg:6356 0 -0x1.5ep6 0x1.ep4 +REG epsg:6356 1 -0x1.75181116f43fep6 0x1.9p4 +REG epsg:6356 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG epsg:6356 3 -0x1.75181116f43fep6 0x1.18p5 +REG epsg:6356 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG epsg:6362 0 -0x1.98p6 0x1.4cp4 +REG epsg:6362 1 -0x1.d8296ea5be4b9p6 0x1.7p2 +REG epsg:6362 2 -0x1.57d6915a41b47p6 0x1.7p2 +REG epsg:6362 3 -0x1.d8296ea5be4b9p6 0x1.1ep5 +REG epsg:6362 4 -0x1.57d6915a41b47p6 0x1.1ep5 +REG epsg:6363 0 0x0.0p0 0x0.0p0 +REG epsg:6363 1 -0x1.4p2 -0x1.4p2 +REG epsg:6363 2 0x1.4p2 -0x1.4p2 +REG epsg:6363 3 -0x1.4p2 0x1.4p2 +REG epsg:6363 4 0x1.4p2 0x1.4p2 +REG epsg:6365 0 0x0.0p0 0x0.0p0 +REG epsg:6365 1 -0x1.4p2 -0x1.4p2 +REG epsg:6365 2 0x1.4p2 -0x1.4p2 +REG epsg:6365 3 -0x1.4p2 0x1.4p2 +REG epsg:6365 4 0x1.4p2 0x1.4p2 +REG epsg:6366 0 -0x1.d4p6 0x0.0p0 +REG epsg:6366 1 -0x1.e8p6 -0x1.4p2 +REG epsg:6366 2 -0x1.cp6 -0x1.4p2 +REG epsg:6366 3 -0x1.e8p6 0x1.4p2 +REG epsg:6366 4 -0x1.cp6 0x1.4p2 +REG epsg:6367 0 -0x1.bcp6 0x0.0p0 +REG epsg:6367 1 -0x1.dp6 -0x1.4p2 +REG epsg:6367 2 -0x1.a8p6 -0x1.4p2 +REG epsg:6367 3 -0x1.dp6 0x1.4p2 +REG epsg:6367 4 -0x1.a8p6 0x1.4p2 +REG epsg:6368 0 -0x1.a4p6 0x0.0p0 +REG epsg:6368 1 -0x1.b8p6 -0x1.4p2 +REG epsg:6368 2 -0x1.9p6 -0x1.4p2 +REG epsg:6368 3 -0x1.b8p6 0x1.4p2 +REG epsg:6368 4 -0x1.9p6 0x1.4p2 +REG epsg:6369 0 -0x1.8cp6 0x0.0p0 +REG epsg:6369 1 -0x1.ap6 -0x1.4p2 +REG epsg:6369 2 -0x1.78p6 -0x1.4p2 +REG epsg:6369 3 -0x1.ap6 0x1.4p2 +REG epsg:6369 4 -0x1.78p6 0x1.4p2 +REG epsg:6370 0 -0x1.74p6 0x0.0p0 +REG epsg:6370 1 -0x1.88p6 -0x1.4p2 +REG epsg:6370 2 -0x1.6p6 -0x1.4p2 +REG epsg:6370 3 -0x1.88p6 0x1.4p2 +REG epsg:6370 4 -0x1.6p6 0x1.4p2 +REG epsg:6371 0 -0x1.5cp6 0x0.0p0 +REG epsg:6371 1 -0x1.7p6 -0x1.4p2 +REG epsg:6371 2 -0x1.48p6 -0x1.4p2 +REG epsg:6371 3 -0x1.7p6 0x1.4p2 +REG epsg:6371 4 -0x1.48p6 0x1.4p2 +REG epsg:6372 0 -0x1.98p6 0x1.4cp4 +REG epsg:6372 1 -0x1.d8296ea5be4b9p6 0x1.7p2 +REG epsg:6372 2 -0x1.57d6915a41b47p6 0x1.7p2 +REG epsg:6372 3 -0x1.d8296ea5be4b9p6 0x1.1ep5 +REG epsg:6372 4 -0x1.57d6915a41b47p6 0x1.1ep5 +REG epsg:6381 0 0x1.5p4 0x0.0p0 +REG epsg:6381 1 0x1.0p4 -0x1.4p2 +REG epsg:6381 2 0x1.ap4 -0x1.4p2 +REG epsg:6381 3 0x1.0p4 0x1.4p2 +REG epsg:6381 4 0x1.ap4 0x1.4p2 +REG epsg:6382 0 0x1.8p4 0x0.0p0 +REG epsg:6382 1 0x1.3p4 -0x1.4p2 +REG epsg:6382 2 0x1.dp4 -0x1.4p2 +REG epsg:6382 3 0x1.3p4 0x1.4p2 +REG epsg:6382 4 0x1.dp4 0x1.4p2 +REG epsg:6383 0 0x1.bp4 0x0.0p0 +REG epsg:6383 1 0x1.6p4 -0x1.4p2 +REG epsg:6383 2 0x1.0p5 -0x1.4p2 +REG epsg:6383 3 0x1.6p4 0x1.4p2 +REG epsg:6383 4 0x1.0p5 0x1.4p2 +REG epsg:6384 0 0x1.ep4 0x0.0p0 +REG epsg:6384 1 0x1.9p4 -0x1.4p2 +REG epsg:6384 2 0x1.18p5 -0x1.4p2 +REG epsg:6384 3 0x1.9p4 0x1.4p2 +REG epsg:6384 4 0x1.18p5 0x1.4p2 +REG epsg:6385 0 0x1.08p5 0x0.0p0 +REG epsg:6385 1 0x1.cp4 -0x1.4p2 +REG epsg:6385 2 0x1.3p5 -0x1.4p2 +REG epsg:6385 3 0x1.cp4 0x1.4p2 +REG epsg:6385 4 0x1.3p5 0x1.4p2 +REG epsg:6386 0 0x1.2p5 0x0.0p0 +REG epsg:6386 1 0x1.fp4 -0x1.4p2 +REG epsg:6386 2 0x1.48p5 -0x1.4p2 +REG epsg:6386 3 0x1.fp4 0x1.4p2 +REG epsg:6386 4 0x1.48p5 0x1.4p2 +REG epsg:6387 0 0x1.38p5 0x0.0p0 +REG epsg:6387 1 0x1.1p5 -0x1.4p2 +REG epsg:6387 2 0x1.6p5 -0x1.4p2 +REG epsg:6387 3 0x1.1p5 0x1.4p2 +REG epsg:6387 4 0x1.6p5 0x1.4p2 +REG epsg:6391 0 -0x1.4244444444444p6 0x1.3844444444444p4 +REG epsg:6391 1 -0x1.4682b00c96324p6 0x1.2844444444444p4 +REG epsg:6391 2 -0x1.3e05d87bf2564p6 0x1.2844444444444p4 +REG epsg:6391 3 -0x1.4682b00c96324p6 0x1.4844444444444p4 +REG epsg:6391 4 -0x1.3e05d87bf2564p6 0x1.4844444444444p4 +REG epsg:6393 0 -0x1.34p7 0x1.ccp5 +REG epsg:6393 1 0x1.642a4c850f0f1p7 0x1.54p5 +REG epsg:6393 2 -0x1.f854990a1e1e2p6 0x1.54p5 +REG epsg:6393 3 0x1.642a4c850f0f1p7 0x1.22p6 +REG epsg:6393 4 -0x1.f854990a1e1e2p6 0x1.22p6 +REG epsg:6394 0 -0x1.0b55555555557p7 0x1.c8p5 +REG epsg:6394 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG epsg:6394 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG epsg:6394 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG epsg:6394 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG epsg:6395 0 -0x1.1cp7 0x1.bp5 +REG epsg:6395 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG epsg:6395 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG epsg:6395 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG epsg:6395 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG epsg:6396 0 -0x1.24p7 0x1.bp5 +REG epsg:6396 1 -0x1.350355070bc27p7 0x1.88p5 +REG epsg:6396 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG epsg:6396 3 -0x1.350355070bc27p7 0x1.d8p5 +REG epsg:6396 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG epsg:6397 0 -0x1.2cp7 0x1.bp5 +REG epsg:6397 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG epsg:6397 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG epsg:6397 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG epsg:6397 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG epsg:6398 0 -0x1.34p7 0x1.bp5 +REG epsg:6398 1 -0x1.450355070bc27p7 0x1.88p5 +REG epsg:6398 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG epsg:6398 3 -0x1.450355070bc27p7 0x1.d8p5 +REG epsg:6398 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG epsg:6399 0 -0x1.3cp7 0x1.bp5 +REG epsg:6399 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG epsg:6399 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG epsg:6399 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG epsg:6399 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG epsg:6400 0 -0x1.44p7 0x1.bp5 +REG epsg:6400 1 -0x1.550355070bc27p7 0x1.88p5 +REG epsg:6400 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG epsg:6400 3 -0x1.550355070bc27p7 0x1.d8p5 +REG epsg:6400 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG epsg:6401 0 -0x1.4cp7 0x1.bp5 +REG epsg:6401 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG epsg:6401 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG epsg:6401 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG epsg:6401 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG epsg:6402 0 -0x1.54p7 0x1.bp5 +REG epsg:6402 1 -0x1.650355070bc27p7 0x1.88p5 +REG epsg:6402 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG epsg:6402 3 -0x1.650355070bc27p7 0x1.d8p5 +REG epsg:6402 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG epsg:6403 0 -0x1.6p7 0x1.a355555555556p5 +REG epsg:6403 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:6403 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG epsg:6403 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG epsg:6403 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG epsg:6404 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:6404 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:6404 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:6404 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:6404 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:6405 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG epsg:6405 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG epsg:6405 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG epsg:6405 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG epsg:6405 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG epsg:6406 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:6406 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:6406 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:6406 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:6406 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:6407 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG epsg:6407 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG epsg:6407 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG epsg:6407 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG epsg:6407 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG epsg:6408 0 -0x1.c7p6 0x1.fp4 +REG epsg:6408 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:6408 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:6408 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:6408 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:6409 0 -0x1.c7p6 0x1.fp4 +REG epsg:6409 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG epsg:6409 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG epsg:6409 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG epsg:6409 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG epsg:6410 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:6410 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:6410 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:6410 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:6410 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:6411 0 -0x1.7p6 0x1.1a44444444444p5 +REG epsg:6411 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG epsg:6411 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG epsg:6411 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG epsg:6411 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG epsg:6412 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:6412 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:6412 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:6412 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:6412 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:6413 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG epsg:6413 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG epsg:6413 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG epsg:6413 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG epsg:6413 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG epsg:6414 0 -0x1.ep6 0x1.44p4 +REG epsg:6414 1 -0x1.0ff9f6a5b5901p7 0x1.5p2 +REG epsg:6414 2 -0x1.a00c12b494dfdp6 0x1.5p2 +REG epsg:6414 3 -0x1.0ff9f6a5b5901p7 0x1.1ap5 +REG epsg:6414 4 -0x1.a00c12b494dfdp6 0x1.1ap5 +REG epsg:6415 0 -0x1.e8p6 0x1.44p5 +REG epsg:6415 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:6415 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:6415 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:6415 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:6416 0 -0x1.e8p6 0x1.44p5 +REG epsg:6416 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG epsg:6416 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG epsg:6416 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG epsg:6416 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG epsg:6417 0 -0x1.e8p6 0x1.36p5 +REG epsg:6417 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:6417 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:6417 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:6417 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:6418 0 -0x1.e8p6 0x1.36p5 +REG epsg:6418 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG epsg:6418 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG epsg:6418 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG epsg:6418 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG epsg:6419 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:6419 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:6419 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:6419 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:6419 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:6420 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG epsg:6420 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG epsg:6420 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG epsg:6420 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG epsg:6420 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG epsg:6421 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:6421 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:6421 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:6421 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:6421 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:6422 0 -0x1.dcp6 0x1.2255555555556p5 +REG epsg:6422 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG epsg:6422 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG epsg:6422 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG epsg:6422 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG epsg:6423 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:6423 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:6423 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:6423 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:6423 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:6424 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG epsg:6424 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG epsg:6424 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG epsg:6424 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG epsg:6424 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG epsg:6425 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:6425 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:6425 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:6425 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:6425 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:6426 0 -0x1.d1p6 0x1.0833333333332p5 +REG epsg:6426 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG epsg:6426 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG epsg:6426 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG epsg:6426 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG epsg:6427 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:6427 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:6427 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:6427 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:6427 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:6428 0 -0x1.a6p6 0x1.3655555555556p5 +REG epsg:6428 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG epsg:6428 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG epsg:6428 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG epsg:6428 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG epsg:6429 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:6429 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:6429 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:6429 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:6429 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:6430 0 -0x1.a6p6 0x1.4077777777778p5 +REG epsg:6430 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG epsg:6430 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG epsg:6430 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG epsg:6430 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG epsg:6431 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:6431 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:6431 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:6431 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:6431 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:6432 0 -0x1.a6p6 0x1.2c66666666666p5 +REG epsg:6432 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG epsg:6432 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG epsg:6432 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG epsg:6432 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG epsg:6433 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:6433 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:6433 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:6433 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:6433 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:6434 0 -0x1.23p6 0x1.4accccccccccep5 +REG epsg:6434 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG epsg:6434 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG epsg:6434 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG epsg:6434 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG epsg:6435 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:6435 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:6435 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:6435 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:6435 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:6436 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG epsg:6436 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG epsg:6436 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG epsg:6436 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG epsg:6436 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG epsg:6437 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:6437 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:6437 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:6437 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:6437 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:6438 0 -0x1.44p6 0x1.8555555555554p4 +REG epsg:6438 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG epsg:6438 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:6438 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG epsg:6438 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:6439 0 -0x1.5p6 0x1.bcp4 +REG epsg:6439 1 -0x1.71e6165af8d1bp6 0x1.44p4 +REG epsg:6439 2 -0x1.2e19e9a5072e5p6 0x1.44p4 +REG epsg:6439 3 -0x1.71e6165af8d1bp6 0x1.1ap5 +REG epsg:6439 4 -0x1.2e19e9a5072e5p6 0x1.1ap5 +REG epsg:6440 0 -0x1.52p6 0x1.dep4 +REG epsg:6440 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:6440 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:6440 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:6440 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:6441 0 -0x1.52p6 0x1.dep4 +REG epsg:6441 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG epsg:6441 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG epsg:6441 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG epsg:6441 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG epsg:6442 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:6442 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:6442 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:6442 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:6442 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:6443 0 -0x1.48p6 0x1.8555555555554p4 +REG epsg:6443 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG epsg:6443 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG epsg:6443 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG epsg:6443 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG epsg:6444 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:6444 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:6444 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:6444 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:6444 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:6445 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG epsg:6445 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG epsg:6445 2 -0x1.31929993b66adp6 0x1.9p4 +REG epsg:6445 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG epsg:6445 4 -0x1.31929993b66adp6 0x1.18p5 +REG epsg:6446 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:6446 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:6446 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:6446 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:6446 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:6447 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG epsg:6447 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG epsg:6447 2 -0x1.39929993b66adp6 0x1.9p4 +REG epsg:6447 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG epsg:6447 4 -0x1.39929993b66adp6 0x1.18p5 +REG epsg:6448 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:6448 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:6448 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:6448 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:6448 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:6449 0 -0x1.c8p6 0x1.4d55555555554p5 +REG epsg:6449 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:6449 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG epsg:6449 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:6449 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG epsg:6450 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:6450 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:6450 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:6450 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:6450 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:6451 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG epsg:6451 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG epsg:6451 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG epsg:6451 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG epsg:6451 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG epsg:6452 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:6452 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:6452 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:6452 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:6452 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:6453 0 -0x1.cfp6 0x1.4d55555555554p5 +REG epsg:6453 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG epsg:6453 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG epsg:6453 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG epsg:6453 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG epsg:6454 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:6454 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:6454 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:6454 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:6454 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:6455 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG epsg:6455 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG epsg:6455 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG epsg:6455 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG epsg:6455 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG epsg:6456 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:6456 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:6456 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:6456 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:6456 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:6457 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG epsg:6457 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG epsg:6457 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG epsg:6457 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG epsg:6457 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG epsg:6458 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:6458 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:6458 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:6458 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:6458 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:6459 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG epsg:6459 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG epsg:6459 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG epsg:6459 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG epsg:6459 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG epsg:6460 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:6460 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:6460 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:6460 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:6460 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:6461 0 -0x1.5c55555555555p6 0x1.2cp5 +REG epsg:6461 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG epsg:6461 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG epsg:6461 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG epsg:6461 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG epsg:6462 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:6462 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:6462 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:6462 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:6462 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:6463 0 -0x1.76p6 0x1.5311111111112p5 +REG epsg:6463 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG epsg:6463 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG epsg:6463 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG epsg:6463 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG epsg:6464 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:6464 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:6464 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:6464 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:6464 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:6465 0 -0x1.76p6 0x1.4722222222222p5 +REG epsg:6465 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG epsg:6465 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG epsg:6465 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG epsg:6465 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG epsg:6466 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:6466 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:6466 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:6466 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:6466 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:6467 0 -0x1.88p6 0x1.3877777777778p5 +REG epsg:6467 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG epsg:6467 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG epsg:6467 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG epsg:6467 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG epsg:6468 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:6468 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:6468 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:6468 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:6468 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:6469 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG epsg:6469 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:6469 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG epsg:6469 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG epsg:6469 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG epsg:6470 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:6470 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:6470 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:6470 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:6470 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:6471 0 -0x1.51p6 0x1.31ddddddddddep5 +REG epsg:6471 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG epsg:6471 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG epsg:6471 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG epsg:6471 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG epsg:6472 0 -0x1.57p6 0x1.2cp5 +REG epsg:6472 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:6472 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:6472 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:6472 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:6473 0 -0x1.57p6 0x1.2cp5 +REG epsg:6473 1 -0x1.62c3b05237b82p6 0x1.1955555555558p5 +REG epsg:6473 2 -0x1.4b3c4fadc847ep6 0x1.1955555555558p5 +REG epsg:6473 3 -0x1.62c3b05237b82p6 0x1.3eaaaaaaaaaa8p5 +REG epsg:6473 4 -0x1.4b3c4fadc847ep6 0x1.3eaaaaaaaaaa8p5 +REG epsg:6474 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:6474 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:6474 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:6474 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:6474 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:6475 0 -0x1.57p6 0x1.2911111111112p5 +REG epsg:6475 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG epsg:6475 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG epsg:6475 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG epsg:6475 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG epsg:6476 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:6476 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:6476 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:6476 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:6476 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:6477 0 -0x1.72p6 0x1.f955555555554p4 +REG epsg:6477 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG epsg:6477 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG epsg:6477 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG epsg:6477 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG epsg:6478 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:6478 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:6478 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:6478 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:6478 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:6479 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG epsg:6479 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG epsg:6479 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG epsg:6479 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG epsg:6479 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG epsg:6480 0 -0x1.148p6 0x1.5cp5 +REG epsg:6480 1 -0x1.30126c9711abap6 0x1.34p5 +REG epsg:6480 2 -0x1.f1db26d1dca8cp5 0x1.34p5 +REG epsg:6480 3 -0x1.30126c9711abap6 0x1.84p5 +REG epsg:6480 4 -0x1.f1db26d1dca8cp5 0x1.84p5 +REG epsg:6481 0 -0x1.0f8p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6481 1 -0x1.2b39bac668c18p6 0x1.36aaaaaaaaaacp5 +REG epsg:6481 2 -0x1.e78c8a732e7dp5 0x1.36aaaaaaaaaacp5 +REG epsg:6481 3 -0x1.2b39bac668c18p6 0x1.86aaaaaaaaaacp5 +REG epsg:6481 4 -0x1.e78c8a732e7dp5 0x1.86aaaaaaaaaacp5 +REG epsg:6482 0 -0x1.198p6 0x1.56aaaaaaaaaacp5 +REG epsg:6482 1 -0x1.34c5ceb6fdb05p6 0x1.2eaaaaaaaaaacp5 +REG epsg:6482 2 -0x1.fc746292049f5p5 0x1.2eaaaaaaaaaacp5 +REG epsg:6482 3 -0x1.34c5ceb6fdb05p6 0x1.7eaaaaaaaaaacp5 +REG epsg:6482 4 -0x1.fc746292049f5p5 0x1.7eaaaaaaaaaacp5 +REG epsg:6483 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:6483 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:6483 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:6483 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:6483 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:6484 0 -0x1.12p6 0x1.5d55555555554p5 +REG epsg:6484 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:6484 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG epsg:6484 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:6484 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG epsg:6485 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:6485 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:6485 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:6485 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:6485 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:6486 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG epsg:6486 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG epsg:6486 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG epsg:6486 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG epsg:6486 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG epsg:6487 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:6487 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:6487 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:6487 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:6487 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:6488 0 -0x1.34p6 0x1.3477777777777p5 +REG epsg:6488 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG epsg:6488 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG epsg:6488 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG epsg:6488 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG epsg:6489 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:6489 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:6489 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:6489 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:6489 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:6490 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG epsg:6490 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG epsg:6490 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG epsg:6490 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG epsg:6490 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG epsg:6491 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:6491 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:6491 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:6491 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:6491 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:6492 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG epsg:6492 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG epsg:6492 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG epsg:6492 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG epsg:6492 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG epsg:6493 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:6493 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:6493 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:6493 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:6493 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:6494 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG epsg:6494 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG epsg:6494 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG epsg:6494 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG epsg:6494 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG epsg:6495 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:6495 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:6495 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:6495 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:6495 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:6496 0 -0x1.5cp6 0x1.6f77777777778p5 +REG epsg:6496 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG epsg:6496 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG epsg:6496 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG epsg:6496 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG epsg:6497 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG epsg:6497 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG epsg:6497 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG epsg:6497 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG epsg:6497 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG epsg:6498 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:6498 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:6498 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:6498 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:6498 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:6499 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG epsg:6499 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG epsg:6499 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG epsg:6499 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG epsg:6499 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG epsg:6500 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:6500 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:6500 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:6500 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:6500 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:6501 0 -0x1.79p6 0x1.7033333333333p5 +REG epsg:6501 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG epsg:6501 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG epsg:6501 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG epsg:6501 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG epsg:6502 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:6502 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:6502 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:6502 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:6502 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:6503 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG epsg:6503 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG epsg:6503 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG epsg:6503 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG epsg:6503 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG epsg:6504 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:6504 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:6504 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:6504 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:6504 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:6505 0 -0x1.78p6 0x1.60ddddddddddep5 +REG epsg:6505 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG epsg:6505 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG epsg:6505 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG epsg:6505 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG epsg:6506 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:6506 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:6506 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:6506 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:6506 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:6507 0 -0x1.6355555555555p6 0x1.d8p4 +REG epsg:6507 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG epsg:6507 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG epsg:6507 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG epsg:6507 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG epsg:6508 0 -0x1.67p6 0x1.04p5 +REG epsg:6508 1 -0x1.7eb6ba59271a3p6 0x1.b8p4 +REG epsg:6508 2 -0x1.4f4945a6d8e5dp6 0x1.b8p4 +REG epsg:6508 3 -0x1.7eb6ba59271a3p6 0x1.2cp5 +REG epsg:6508 4 -0x1.4f4945a6d8e5dp6 0x1.2cp5 +REG epsg:6509 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:6509 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:6509 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:6509 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:6509 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:6510 0 -0x1.6955555555555p6 0x1.d8p4 +REG epsg:6510 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG epsg:6510 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG epsg:6510 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG epsg:6510 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG epsg:6511 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG epsg:6511 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:6511 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:6511 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:6511 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:6512 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG epsg:6512 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG epsg:6512 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG epsg:6512 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG epsg:6512 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG epsg:6513 0 -0x1.7ap6 0x1.2155555555554p5 +REG epsg:6513 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG epsg:6513 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG epsg:6513 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG epsg:6513 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG epsg:6514 0 -0x1.b6p6 0x1.75p5 +REG epsg:6514 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:6514 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:6514 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:6514 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:6515 0 -0x1.b6p6 0x1.75p5 +REG epsg:6515 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG epsg:6515 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG epsg:6515 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG epsg:6515 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG epsg:6516 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:6516 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:6516 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:6516 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:6516 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:6517 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:6517 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:6517 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:6517 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:6517 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:6518 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:6518 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:6518 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:6518 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:6518 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:6519 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG epsg:6519 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG epsg:6519 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG epsg:6519 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG epsg:6519 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG epsg:6520 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:6520 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:6520 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:6520 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:6520 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:6521 0 -0x1.ce55555555553p6 0x1.16p5 +REG epsg:6521 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG epsg:6521 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG epsg:6521 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG epsg:6521 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG epsg:6522 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:6522 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:6522 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:6522 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:6522 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:6523 0 -0x1.da55555555553p6 0x1.16p5 +REG epsg:6523 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG epsg:6523 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG epsg:6523 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG epsg:6523 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG epsg:6524 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:6524 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:6524 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:6524 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:6524 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:6525 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG epsg:6525 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG epsg:6525 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG epsg:6525 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG epsg:6525 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG epsg:6526 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:6526 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6526 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6526 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6526 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6527 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:6527 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6527 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6527 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6527 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6528 0 -0x1.a9p6 0x1.fp4 +REG epsg:6528 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:6528 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:6528 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:6528 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:6529 0 -0x1.a9p6 0x1.fp4 +REG epsg:6529 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG epsg:6529 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG epsg:6529 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG epsg:6529 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG epsg:6530 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:6530 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:6530 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:6530 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:6530 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:6531 0 -0x1.a155555555553p6 0x1.fp4 +REG epsg:6531 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG epsg:6531 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG epsg:6531 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG epsg:6531 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG epsg:6532 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:6532 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:6532 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:6532 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:6532 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:6533 0 -0x1.af55555555553p6 0x1.fp4 +REG epsg:6533 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG epsg:6533 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG epsg:6533 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG epsg:6533 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG epsg:6534 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:6534 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:6534 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:6534 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:6534 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:6535 0 -0x1.3255555555555p6 0x1.4p5 +REG epsg:6535 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG epsg:6535 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG epsg:6535 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG epsg:6535 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG epsg:6536 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:6536 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6536 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6536 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6536 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6537 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG epsg:6537 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6537 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG epsg:6537 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6537 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG epsg:6538 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:6538 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:6538 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:6538 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:6538 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:6539 0 -0x1.28p6 0x1.44cccccccccccp5 +REG epsg:6539 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG epsg:6539 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG epsg:6539 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG epsg:6539 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG epsg:6540 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:6540 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:6540 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:6540 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:6540 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:6541 0 -0x1.3a55555555555p6 0x1.4p5 +REG epsg:6541 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG epsg:6541 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG epsg:6541 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG epsg:6541 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG epsg:6542 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:6542 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:6542 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:6542 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:6542 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:6543 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG epsg:6543 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG epsg:6543 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG epsg:6543 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG epsg:6543 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG epsg:6544 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:6544 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:6544 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:6544 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:6544 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:6545 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG epsg:6545 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG epsg:6545 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG epsg:6545 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG epsg:6545 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG epsg:6546 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:6546 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:6546 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:6546 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:6546 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:6547 0 -0x1.92p6 0x1.7499999999998p5 +REG epsg:6547 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG epsg:6547 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG epsg:6547 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG epsg:6547 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG epsg:6548 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:6548 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:6548 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:6548 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:6548 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:6549 0 -0x1.4ap6 0x1.4577777777777p5 +REG epsg:6549 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG epsg:6549 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG epsg:6549 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG epsg:6549 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG epsg:6550 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:6550 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:6550 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:6550 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:6550 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:6551 0 -0x1.4ap6 0x1.3822222222222p5 +REG epsg:6551 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG epsg:6551 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG epsg:6551 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG epsg:6551 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG epsg:6552 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:6552 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:6552 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:6552 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:6552 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:6553 0 -0x1.88p6 0x1.1f11111111112p5 +REG epsg:6553 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG epsg:6553 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG epsg:6553 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG epsg:6553 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG epsg:6554 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:6554 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:6554 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:6554 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:6554 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:6555 0 -0x1.88p6 0x1.1244444444444p5 +REG epsg:6555 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG epsg:6555 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG epsg:6555 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG epsg:6555 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG epsg:6556 0 -0x1.e2p6 0x1.5dp5 +REG epsg:6556 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:6556 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:6556 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:6556 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:6557 0 -0x1.e2p6 0x1.5dp5 +REG epsg:6557 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:6557 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:6557 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:6557 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:6558 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:6558 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:6558 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:6558 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:6558 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:6559 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:6559 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:6559 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:6559 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:6559 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:6560 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:6560 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:6560 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:6560 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:6560 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:6561 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:6561 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:6561 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:6561 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:6561 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:6562 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:6562 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:6562 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:6562 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:6562 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:6563 0 -0x1.37p6 0x1.4877777777777p5 +REG epsg:6563 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG epsg:6563 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG epsg:6563 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG epsg:6563 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG epsg:6564 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:6564 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:6564 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:6564 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:6564 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:6565 0 -0x1.37p6 0x1.4133333333334p5 +REG epsg:6565 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG epsg:6565 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG epsg:6565 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG epsg:6565 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG epsg:6566 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG epsg:6566 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG epsg:6566 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG epsg:6566 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG epsg:6566 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG epsg:6567 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:6567 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:6567 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:6567 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:6567 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:6568 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG epsg:6568 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG epsg:6568 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG epsg:6568 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG epsg:6568 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG epsg:6569 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:6569 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:6569 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:6569 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:6569 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:6570 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG epsg:6570 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG epsg:6570 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG epsg:6570 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG epsg:6570 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG epsg:6571 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:6571 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:6571 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:6571 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:6571 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:6572 0 -0x1.9p6 0x1.6611111111112p5 +REG epsg:6572 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG epsg:6572 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG epsg:6572 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG epsg:6572 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG epsg:6573 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:6573 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:6573 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:6573 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:6573 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:6574 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG epsg:6574 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG epsg:6574 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG epsg:6574 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG epsg:6574 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG epsg:6575 0 -0x1.58p6 0x1.1bp5 +REG epsg:6575 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:6575 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:6575 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:6575 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:6576 0 -0x1.58p6 0x1.1bp5 +REG epsg:6576 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG epsg:6576 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG epsg:6576 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG epsg:6576 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG epsg:6577 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:6577 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:6577 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:6577 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:6577 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:6578 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG epsg:6578 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG epsg:6578 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG epsg:6578 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG epsg:6578 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG epsg:6579 0 -0x1.9p6 0x1.a8p4 +REG epsg:6579 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:6579 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:6579 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:6579 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:6580 0 -0x1.9p6 0x1.a8p4 +REG epsg:6580 1 -0x1.d30b4518d4132p6 0x1.7p3 +REG epsg:6580 2 -0x1.4cf4bae72becep6 0x1.7p3 +REG epsg:6580 3 -0x1.d30b4518d4132p6 0x1.4cp5 +REG epsg:6580 4 -0x1.4cf4bae72becep6 0x1.4cp5 +REG epsg:6581 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:6581 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:6581 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:6581 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:6581 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:6582 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:6582 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:6582 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:6582 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:6582 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:6583 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:6583 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:6583 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:6583 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:6583 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:6584 0 -0x1.8ap6 0x1.0688888888889p5 +REG epsg:6584 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG epsg:6584 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG epsg:6584 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG epsg:6584 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG epsg:6585 0 -0x1.8ap6 0x1.acp4 +REG epsg:6585 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:6585 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:6585 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:6585 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:6586 0 -0x1.8ap6 0x1.acp4 +REG epsg:6586 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG epsg:6586 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG epsg:6586 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:6586 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG epsg:6587 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:6587 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:6587 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:6587 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:6587 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:6588 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG epsg:6588 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG epsg:6588 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG epsg:6588 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG epsg:6588 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG epsg:6589 0 -0x1.22p6 0x1.54p5 +REG epsg:6589 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:6589 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:6589 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:6589 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:6590 0 -0x1.22p6 0x1.54p5 +REG epsg:6590 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG epsg:6590 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG epsg:6590 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG epsg:6590 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG epsg:6591 0 -0x1.3ep6 0x1.2ep5 +REG epsg:6591 1 -0x1.4fb4c0980fa7fp6 0x1.12p5 +REG epsg:6591 2 -0x1.2c4b3f67f0581p6 0x1.12p5 +REG epsg:6591 3 -0x1.4fb4c0980fa7fp6 0x1.4ap5 +REG epsg:6591 4 -0x1.2c4b3f67f0581p6 0x1.4ap5 +REG epsg:6592 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:6592 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:6592 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:6592 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:6592 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:6593 0 -0x1.3ap6 0x1.3377777777777p5 +REG epsg:6593 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG epsg:6593 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG epsg:6593 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:6593 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG epsg:6594 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:6594 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:6594 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:6594 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:6594 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:6595 0 -0x1.3ap6 0x1.2933333333334p5 +REG epsg:6595 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG epsg:6595 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG epsg:6595 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG epsg:6595 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG epsg:6596 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:6596 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:6596 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:6596 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:6596 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:6597 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG epsg:6597 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG epsg:6597 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG epsg:6597 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG epsg:6597 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG epsg:6598 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:6598 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:6598 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:6598 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:6598 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:6599 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG epsg:6599 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG epsg:6599 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG epsg:6599 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG epsg:6599 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG epsg:6600 0 -0x1.3ep6 0x1.3bp5 +REG epsg:6600 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:6600 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:6600 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:6600 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:6601 0 -0x1.3ep6 0x1.3bp5 +REG epsg:6601 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG epsg:6601 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG epsg:6601 3 -0x1.470e3592d233ap6 0x1.49p5 +REG epsg:6601 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG epsg:6602 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:6602 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:6602 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:6602 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:6602 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:6603 0 -0x1.44p6 0x1.2f88888888888p5 +REG epsg:6603 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG epsg:6603 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG epsg:6603 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG epsg:6603 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG epsg:6604 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:6604 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:6604 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:6604 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:6604 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:6605 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:6605 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:6605 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:6605 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:6605 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:6606 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:6606 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:6606 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:6606 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:6606 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:6607 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG epsg:6607 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG epsg:6607 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG epsg:6607 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG epsg:6607 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG epsg:6608 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:6608 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:6608 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:6608 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:6608 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:6609 0 -0x1.68p6 0x1.5844444444444p5 +REG epsg:6609 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG epsg:6609 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG epsg:6609 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG epsg:6609 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG epsg:6610 0 -0x1.68p6 0x0.0p0 +REG epsg:6610 1 -0x1.7cp6 -0x1.4p2 +REG epsg:6610 2 -0x1.54p6 -0x1.4p2 +REG epsg:6610 3 -0x1.7cp6 0x1.4p2 +REG epsg:6610 4 -0x1.54p6 0x1.4p2 +REG epsg:6611 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:6611 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:6611 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:6611 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:6611 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:6612 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG epsg:6612 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG epsg:6612 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG epsg:6612 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG epsg:6612 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG epsg:6613 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:6613 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:6613 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:6613 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:6613 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:6614 0 -0x1.ad55555555553p6 0x1.44p5 +REG epsg:6614 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG epsg:6614 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG epsg:6614 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG epsg:6614 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG epsg:6615 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:6615 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:6615 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:6615 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:6615 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:6616 0 -0x1.b855555555553p6 0x1.44p5 +REG epsg:6616 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG epsg:6616 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG epsg:6616 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG epsg:6616 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG epsg:6617 0 -0x1.b3p6 0x1.44p5 +REG epsg:6617 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:6617 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:6617 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:6617 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:6618 0 -0x1.b3p6 0x1.44p5 +REG epsg:6618 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG epsg:6618 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG epsg:6618 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG epsg:6618 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG epsg:6619 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:6619 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:6619 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:6619 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:6619 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:6620 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:6620 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:6620 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:6620 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:6620 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:6621 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:6621 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:6621 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:6621 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:6621 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:6622 0 -0x1.12p6 0x1.ap5 +REG epsg:6622 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG epsg:6622 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG epsg:6622 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG epsg:6622 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG epsg:6623 0 -0x1.12p6 0x1.ap5 +REG epsg:6623 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG epsg:6623 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG epsg:6623 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG epsg:6623 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG epsg:6624 0 -0x1.12p6 0x1.ap5 +REG epsg:6624 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG epsg:6624 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG epsg:6624 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG epsg:6624 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG epsg:6625 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG epsg:6625 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG epsg:6625 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG epsg:6625 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG epsg:6625 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG epsg:6626 0 -0x1.bep6 0x1.4877777777778p5 +REG epsg:6626 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG epsg:6626 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG epsg:6626 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG epsg:6626 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG epsg:6627 0 -0x1.bep6 0x1.2c1111111111p5 +REG epsg:6627 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG epsg:6627 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG epsg:6627 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG epsg:6627 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG epsg:6628 0 -0x1.37p7 0x1.2d55555555554p4 +REG epsg:6628 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG epsg:6628 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG epsg:6628 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG epsg:6628 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG epsg:6629 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG epsg:6629 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG epsg:6629 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG epsg:6629 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG epsg:6629 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG epsg:6630 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:6630 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:6630 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:6630 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:6630 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:6631 0 -0x1.3fp7 0x1.5d55555555554p4 +REG epsg:6631 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG epsg:6631 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG epsg:6631 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG epsg:6631 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG epsg:6632 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG epsg:6632 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG epsg:6632 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG epsg:6632 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG epsg:6632 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG epsg:6633 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG epsg:6633 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG epsg:6633 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG epsg:6633 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG epsg:6633 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG epsg:6634 0 -0x1.3ep7 0x0.0p0 +REG epsg:6634 1 -0x1.48p7 -0x1.4p2 +REG epsg:6634 2 -0x1.34p7 -0x1.4p2 +REG epsg:6634 3 -0x1.48p7 0x1.4p2 +REG epsg:6634 4 -0x1.34p7 0x1.4p2 +REG epsg:6635 0 -0x1.32p7 0x0.0p0 +REG epsg:6635 1 -0x1.3cp7 -0x1.4p2 +REG epsg:6635 2 -0x1.28p7 -0x1.4p2 +REG epsg:6635 3 -0x1.3cp7 0x1.4p2 +REG epsg:6635 4 -0x1.28p7 0x1.4p2 +REG epsg:6636 0 -0x1.56p7 -0x1.9p4 +REG epsg:6636 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:6636 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:6636 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:6636 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:6637 0 0x1.218p7 0x1.bp3 +REG epsg:6637 1 0x1.173741d194fbfp7 0x1.1p3 +REG epsg:6637 2 0x1.2bc8be2e6b041p7 0x1.1p3 +REG epsg:6637 3 0x1.173741d194fbfp7 0x1.28p4 +REG epsg:6637 4 0x1.2bc8be2e6b041p7 0x1.28p4 +REG epsg:6646 0 0x1.74p5 0x1.d06b98580964bp4 +REG epsg:6646 1 0x1.464113b4c1751p5 0x1.806b98580964bp4 +REG epsg:6646 2 0x1.a1beec4b3e8afp5 0x1.806b98580964bp4 +REG epsg:6646 3 0x1.464113b4c1751p5 0x1.1035cc2c04b26p5 +REG epsg:6646 4 0x1.a1beec4b3e8afp5 0x1.1035cc2c04b26p5 +REG epsg:6649 0 0x0.0p0 0x0.0p0 +REG epsg:6649 1 -0x1.4p2 -0x1.4p2 +REG epsg:6649 2 0x1.4p2 -0x1.4p2 +REG epsg:6649 3 -0x1.4p2 0x1.4p2 +REG epsg:6649 4 0x1.4p2 0x1.4p2 +REG epsg:6650 0 -0x1.1ap7 0x0.0p0 +REG epsg:6650 1 -0x1.24p7 -0x1.4p2 +REG epsg:6650 2 -0x1.1p7 -0x1.4p2 +REG epsg:6650 3 -0x1.24p7 0x1.4p2 +REG epsg:6650 4 -0x1.1p7 0x1.4p2 +REG epsg:6651 0 -0x1.0ep7 0x0.0p0 +REG epsg:6651 1 -0x1.18p7 -0x1.4p2 +REG epsg:6651 2 -0x1.04p7 -0x1.4p2 +REG epsg:6651 3 -0x1.18p7 0x1.4p2 +REG epsg:6651 4 -0x1.04p7 0x1.4p2 +REG epsg:6652 0 -0x1.02p7 0x0.0p0 +REG epsg:6652 1 -0x1.0cp7 -0x1.4p2 +REG epsg:6652 2 -0x1.fp6 -0x1.4p2 +REG epsg:6652 3 -0x1.0cp7 0x1.4p2 +REG epsg:6652 4 -0x1.fp6 0x1.4p2 +REG epsg:6653 0 -0x1.ecp6 0x0.0p0 +REG epsg:6653 1 -0x1.0p7 -0x1.4p2 +REG epsg:6653 2 -0x1.d8p6 -0x1.4p2 +REG epsg:6653 3 -0x1.0p7 0x1.4p2 +REG epsg:6653 4 -0x1.d8p6 0x1.4p2 +REG epsg:6654 0 -0x1.d4p6 0x0.0p0 +REG epsg:6654 1 -0x1.e8p6 -0x1.4p2 +REG epsg:6654 2 -0x1.cp6 -0x1.4p2 +REG epsg:6654 3 -0x1.e8p6 0x1.4p2 +REG epsg:6654 4 -0x1.cp6 0x1.4p2 +REG epsg:6655 0 -0x1.bcp6 0x0.0p0 +REG epsg:6655 1 -0x1.dp6 -0x1.4p2 +REG epsg:6655 2 -0x1.a8p6 -0x1.4p2 +REG epsg:6655 3 -0x1.dp6 0x1.4p2 +REG epsg:6655 4 -0x1.a8p6 0x1.4p2 +REG epsg:6656 0 -0x1.a4p6 0x0.0p0 +REG epsg:6656 1 -0x1.b8p6 -0x1.4p2 +REG epsg:6656 2 -0x1.9p6 -0x1.4p2 +REG epsg:6656 3 -0x1.b8p6 0x1.4p2 +REG epsg:6656 4 -0x1.9p6 0x1.4p2 +REG epsg:6657 0 -0x1.8cp6 0x0.0p0 +REG epsg:6657 1 -0x1.ap6 -0x1.4p2 +REG epsg:6657 2 -0x1.78p6 -0x1.4p2 +REG epsg:6657 3 -0x1.ap6 0x1.4p2 +REG epsg:6657 4 -0x1.78p6 0x1.4p2 +REG epsg:6658 0 -0x1.74p6 0x0.0p0 +REG epsg:6658 1 -0x1.88p6 -0x1.4p2 +REG epsg:6658 2 -0x1.6p6 -0x1.4p2 +REG epsg:6658 3 -0x1.88p6 0x1.4p2 +REG epsg:6658 4 -0x1.6p6 0x1.4p2 +REG epsg:6659 0 -0x1.5cp6 0x0.0p0 +REG epsg:6659 1 -0x1.7p6 -0x1.4p2 +REG epsg:6659 2 -0x1.48p6 -0x1.4p2 +REG epsg:6659 3 -0x1.7p6 0x1.4p2 +REG epsg:6659 4 -0x1.48p6 0x1.4p2 +REG epsg:6660 0 -0x1.44p6 0x0.0p0 +REG epsg:6660 1 -0x1.58p6 -0x1.4p2 +REG epsg:6660 2 -0x1.3p6 -0x1.4p2 +REG epsg:6660 3 -0x1.58p6 0x1.4p2 +REG epsg:6660 4 -0x1.3p6 0x1.4p2 +REG epsg:6661 0 -0x1.2cp6 0x0.0p0 +REG epsg:6661 1 -0x1.4p6 -0x1.4p2 +REG epsg:6661 2 -0x1.18p6 -0x1.4p2 +REG epsg:6661 3 -0x1.4p6 0x1.4p2 +REG epsg:6661 4 -0x1.18p6 0x1.4p2 +REG epsg:6662 0 -0x1.14p6 0x0.0p0 +REG epsg:6662 1 -0x1.28p6 -0x1.4p2 +REG epsg:6662 2 -0x1.0p6 -0x1.4p2 +REG epsg:6662 3 -0x1.28p6 0x1.4p2 +REG epsg:6662 4 -0x1.0p6 0x1.4p2 +REG epsg:6663 0 -0x1.f8p5 0x0.0p0 +REG epsg:6663 1 -0x1.1p6 -0x1.4p2 +REG epsg:6663 2 -0x1.dp5 -0x1.4p2 +REG epsg:6663 3 -0x1.1p6 0x1.4p2 +REG epsg:6663 4 -0x1.dp5 0x1.4p2 +REG epsg:6664 0 -0x1.c8p5 0x0.0p0 +REG epsg:6664 1 -0x1.fp5 -0x1.4p2 +REG epsg:6664 2 -0x1.ap5 -0x1.4p2 +REG epsg:6664 3 -0x1.fp5 0x1.4p2 +REG epsg:6664 4 -0x1.ap5 0x1.4p2 +REG epsg:6665 0 -0x1.98p5 0x0.0p0 +REG epsg:6665 1 -0x1.cp5 -0x1.4p2 +REG epsg:6665 2 -0x1.7p5 -0x1.4p2 +REG epsg:6665 3 -0x1.cp5 0x1.4p2 +REG epsg:6665 4 -0x1.7p5 0x1.4p2 +REG epsg:6666 0 0x0.0p0 0x0.0p0 +REG epsg:6666 1 -0x1.4p2 -0x1.4p2 +REG epsg:6666 2 0x1.4p2 -0x1.4p2 +REG epsg:6666 3 -0x1.4p2 0x1.4p2 +REG epsg:6666 4 0x1.4p2 0x1.4p2 +REG epsg:6668 0 0x0.0p0 0x0.0p0 +REG epsg:6668 1 -0x1.4p2 -0x1.4p2 +REG epsg:6668 2 0x1.4p2 -0x1.4p2 +REG epsg:6668 3 -0x1.4p2 0x1.4p2 +REG epsg:6668 4 0x1.4p2 0x1.4p2 +REG epsg:6669 0 0x1.03p7 0x1.08p5 +REG epsg:6669 1 0x1.ee271995b65ffp6 0x1.cp4 +REG epsg:6669 2 0x1.0eec733524d01p7 0x1.cp4 +REG epsg:6669 3 0x1.ee271995b65ffp6 0x1.3p5 +REG epsg:6669 4 0x1.0eec733524d01p7 0x1.3p5 +REG epsg:6670 0 0x1.06p7 0x1.08p5 +REG epsg:6670 1 0x1.f4271995b65ffp6 0x1.cp4 +REG epsg:6670 2 0x1.11ec733524d01p7 0x1.cp4 +REG epsg:6670 3 0x1.f4271995b65ffp6 0x1.3p5 +REG epsg:6670 4 0x1.11ec733524d01p7 0x1.3p5 +REG epsg:6671 0 0x1.0855555555557p7 0x1.2p5 +REG epsg:6671 1 0x1.f7f1ffa5aec74p6 0x1.fp4 +REG epsg:6671 2 0x1.14b1aad7d3474p7 0x1.fp4 +REG epsg:6671 3 0x1.f7f1ffa5aec74p6 0x1.48p5 +REG epsg:6671 4 0x1.14b1aad7d3474p7 0x1.48p5 +REG epsg:6672 0 0x1.0bp7 0x1.08p5 +REG epsg:6672 1 0x1.fe271995b65ffp6 0x1.cp4 +REG epsg:6672 2 0x1.16ec733524d01p7 0x1.cp4 +REG epsg:6672 3 0x1.fe271995b65ffp6 0x1.3p5 +REG epsg:6672 4 0x1.16ec733524d01p7 0x1.3p5 +REG epsg:6673 0 0x1.0caaaaaaaaaa9p7 0x1.2p5 +REG epsg:6673 1 0x1.004e55282cb8cp7 0x1.fp4 +REG epsg:6673 2 0x1.1907002d289c6p7 0x1.fp4 +REG epsg:6673 3 0x1.004e55282cb8cp7 0x1.48p5 +REG epsg:6673 4 0x1.1907002d289c6p7 0x1.48p5 +REG epsg:6674 0 0x1.1p7 0x1.2p5 +REG epsg:6674 1 0x1.03a3aa7d820e3p7 0x1.fp4 +REG epsg:6674 2 0x1.1c5c55827df1dp7 0x1.fp4 +REG epsg:6674 3 0x1.03a3aa7d820e3p7 0x1.48p5 +REG epsg:6674 4 0x1.1c5c55827df1dp7 0x1.48p5 +REG epsg:6675 0 0x1.1255555555557p7 0x1.2p5 +REG epsg:6675 1 0x1.05f8ffd2d763ap7 0x1.fp4 +REG epsg:6675 2 0x1.1eb1aad7d3474p7 0x1.fp4 +REG epsg:6675 3 0x1.05f8ffd2d763ap7 0x1.48p5 +REG epsg:6675 4 0x1.1eb1aad7d3474p7 0x1.48p5 +REG epsg:6676 0 0x1.15p7 0x1.2p5 +REG epsg:6676 1 0x1.08a3aa7d820e3p7 0x1.fp4 +REG epsg:6676 2 0x1.215c55827df1dp7 0x1.fp4 +REG epsg:6676 3 0x1.08a3aa7d820e3p7 0x1.48p5 +REG epsg:6676 4 0x1.215c55827df1dp7 0x1.48p5 +REG epsg:6677 0 0x1.17aaaaaaaaaa9p7 0x1.2p5 +REG epsg:6677 1 0x1.0b4e55282cb8cp7 0x1.fp4 +REG epsg:6677 2 0x1.2407002d289c6p7 0x1.fp4 +REG epsg:6677 3 0x1.0b4e55282cb8cp7 0x1.48p5 +REG epsg:6677 4 0x1.2407002d289c6p7 0x1.48p5 +REG epsg:6678 0 0x1.19aaaaaaaaaa9p7 0x1.4p5 +REG epsg:6678 1 0x1.0c9cd2f20e3ebp7 0x1.18p5 +REG epsg:6678 2 0x1.26b8826347167p7 0x1.18p5 +REG epsg:6678 3 0x1.0c9cd2f20e3ebp7 0x1.68p5 +REG epsg:6678 4 0x1.26b8826347167p7 0x1.68p5 +REG epsg:6679 0 0x1.188p7 0x1.6p5 +REG epsg:6679 1 0x1.0a992e6394ef4p7 0x1.38p5 +REG epsg:6679 2 0x1.2666d19c6b10cp7 0x1.38p5 +REG epsg:6679 3 0x1.0a992e6394ef4p7 0x1.88p5 +REG epsg:6679 4 0x1.2666d19c6b10cp7 0x1.88p5 +REG epsg:6680 0 0x1.1c8p7 0x1.6p5 +REG epsg:6680 1 0x1.0e992e6394ef4p7 0x1.38p5 +REG epsg:6680 2 0x1.2a66d19c6b10cp7 0x1.38p5 +REG epsg:6680 3 0x1.0e992e6394ef4p7 0x1.88p5 +REG epsg:6680 4 0x1.2a66d19c6b10cp7 0x1.88p5 +REG epsg:6681 0 0x1.208p7 0x1.6p5 +REG epsg:6681 1 0x1.12992e6394ef4p7 0x1.38p5 +REG epsg:6681 2 0x1.2e66d19c6b10cp7 0x1.38p5 +REG epsg:6681 3 0x1.12992e6394ef4p7 0x1.88p5 +REG epsg:6681 4 0x1.2e66d19c6b10cp7 0x1.88p5 +REG epsg:6682 0 0x1.1cp7 0x1.ap4 +REG epsg:6682 1 0x1.10dfbd3139edep7 0x1.5p4 +REG epsg:6682 2 0x1.272042cec6122p7 0x1.5p4 +REG epsg:6682 3 0x1.10dfbd3139edep7 0x1.fp4 +REG epsg:6682 4 0x1.272042cec6122p7 0x1.fp4 +REG epsg:6683 0 0x1.fep6 0x1.ap4 +REG epsg:6683 1 0x1.e7bf7a6273dbcp6 0x1.5p4 +REG epsg:6683 2 0x1.0a2042cec6122p7 0x1.5p4 +REG epsg:6683 3 0x1.e7bf7a6273dbcp6 0x1.fp4 +REG epsg:6683 4 0x1.0a2042cec6122p7 0x1.fp4 +REG epsg:6684 0 0x1.fp6 0x1.ap4 +REG epsg:6684 1 0x1.d9bf7a6273dbcp6 0x1.5p4 +REG epsg:6684 2 0x1.032042cec6122p7 0x1.5p4 +REG epsg:6684 3 0x1.d9bf7a6273dbcp6 0x1.fp4 +REG epsg:6684 4 0x1.032042cec6122p7 0x1.fp4 +REG epsg:6685 0 0x1.06p7 0x1.ap4 +REG epsg:6685 1 0x1.f5bf7a6273dbcp6 0x1.5p4 +REG epsg:6685 2 0x1.112042cec6122p7 0x1.5p4 +REG epsg:6685 3 0x1.f5bf7a6273dbcp6 0x1.fp4 +REG epsg:6685 4 0x1.112042cec6122p7 0x1.fp4 +REG epsg:6686 0 0x1.1p7 0x1.4p4 +REG epsg:6686 1 0x1.055bb4747cdbcp7 0x1.ep3 +REG epsg:6686 2 0x1.1aa44b8b83244p7 0x1.ep3 +REG epsg:6686 3 0x1.055bb4747cdbcp7 0x1.9p4 +REG epsg:6686 4 0x1.1aa44b8b83244p7 0x1.9p4 +REG epsg:6687 0 0x1.34p7 0x1.ap4 +REG epsg:6687 1 0x1.28dfbd3139edep7 0x1.5p4 +REG epsg:6687 2 0x1.3f2042cec6122p7 0x1.5p4 +REG epsg:6687 3 0x1.28dfbd3139edep7 0x1.fp4 +REG epsg:6687 4 0x1.3f2042cec6122p7 0x1.fp4 +REG epsg:6688 0 0x1.ecp6 0x0.0p0 +REG epsg:6688 1 0x1.d8p6 -0x1.4p2 +REG epsg:6688 2 0x1.0p7 -0x1.4p2 +REG epsg:6688 3 0x1.d8p6 0x1.4p2 +REG epsg:6688 4 0x1.0p7 0x1.4p2 +REG epsg:6689 0 0x1.02p7 0x0.0p0 +REG epsg:6689 1 0x1.fp6 -0x1.4p2 +REG epsg:6689 2 0x1.0cp7 -0x1.4p2 +REG epsg:6689 3 0x1.fp6 0x1.4p2 +REG epsg:6689 4 0x1.0cp7 0x1.4p2 +REG epsg:6690 0 0x1.0ep7 0x0.0p0 +REG epsg:6690 1 0x1.04p7 -0x1.4p2 +REG epsg:6690 2 0x1.18p7 -0x1.4p2 +REG epsg:6690 3 0x1.04p7 0x1.4p2 +REG epsg:6690 4 0x1.18p7 0x1.4p2 +REG epsg:6691 0 0x1.1ap7 0x0.0p0 +REG epsg:6691 1 0x1.1p7 -0x1.4p2 +REG epsg:6691 2 0x1.24p7 -0x1.4p2 +REG epsg:6691 3 0x1.1p7 0x1.4p2 +REG epsg:6691 4 0x1.24p7 0x1.4p2 +REG epsg:6692 0 0x1.26p7 0x0.0p0 +REG epsg:6692 1 0x1.1cp7 -0x1.4p2 +REG epsg:6692 2 0x1.3p7 -0x1.4p2 +REG epsg:6692 3 0x1.1cp7 0x1.4p2 +REG epsg:6692 4 0x1.3p7 0x1.4p2 +REG epsg:6696 0 0x0.0p0 0x0.0p0 +REG epsg:6696 1 -0x1.4p2 -0x1.4p2 +REG epsg:6696 2 0x1.4p2 -0x1.4p2 +REG epsg:6696 3 -0x1.4p2 0x1.4p2 +REG epsg:6696 4 0x1.4p2 0x1.4p2 +REG epsg:6697 0 0x0.0p0 0x0.0p0 +REG epsg:6697 1 -0x1.4p2 -0x1.4p2 +REG epsg:6697 2 0x1.4p2 -0x1.4p2 +REG epsg:6697 3 -0x1.4p2 0x1.4p2 +REG epsg:6697 4 0x1.4p2 0x1.4p2 +REG epsg:6700 0 0x0.0p0 0x0.0p0 +REG epsg:6700 1 -0x1.4p2 -0x1.4p2 +REG epsg:6700 2 0x1.4p2 -0x1.4p2 +REG epsg:6700 3 -0x1.4p2 0x1.4p2 +REG epsg:6700 4 0x1.4p2 0x1.4p2 +REG epsg:6703 0 -0x1.ep5 0x0.0p0 +REG epsg:6703 1 -0x1.04p6 -0x1.4p2 +REG epsg:6703 2 -0x1.b8p5 -0x1.4p2 +REG epsg:6703 3 -0x1.04p6 0x1.4p2 +REG epsg:6703 4 -0x1.b8p5 0x1.4p2 +REG epsg:6704 0 0x0.0p0 0x0.0p0 +REG epsg:6704 1 -0x1.4p2 -0x1.4p2 +REG epsg:6704 2 0x1.4p2 -0x1.4p2 +REG epsg:6704 3 -0x1.4p2 0x1.4p2 +REG epsg:6704 4 0x1.4p2 0x1.4p2 +REG epsg:6706 0 0x0.0p0 0x0.0p0 +REG epsg:6706 1 -0x1.4p2 -0x1.4p2 +REG epsg:6706 2 0x1.4p2 -0x1.4p2 +REG epsg:6706 3 -0x1.4p2 0x1.4p2 +REG epsg:6706 4 0x1.4p2 0x1.4p2 +REG epsg:6707 0 0x1.2p3 0x0.0p0 +REG epsg:6707 1 0x1.0p2 -0x1.4p2 +REG epsg:6707 2 0x1.cp3 -0x1.4p2 +REG epsg:6707 3 0x1.0p2 0x1.4p2 +REG epsg:6707 4 0x1.cp3 0x1.4p2 +REG epsg:6708 0 0x1.ep3 0x0.0p0 +REG epsg:6708 1 0x1.4p3 -0x1.4p2 +REG epsg:6708 2 0x1.4p4 -0x1.4p2 +REG epsg:6708 3 0x1.4p3 0x1.4p2 +REG epsg:6708 4 0x1.4p4 0x1.4p2 +REG epsg:6709 0 0x1.5p4 0x0.0p0 +REG epsg:6709 1 0x1.0p4 -0x1.4p2 +REG epsg:6709 2 0x1.ap4 -0x1.4p2 +REG epsg:6709 3 0x1.0p4 0x1.4p2 +REG epsg:6709 4 0x1.ap4 0x1.4p2 +REG epsg:6720 0 0x1.a68p6 0x0.0p0 +REG epsg:6720 1 0x1.928p6 -0x1.4p2 +REG epsg:6720 2 0x1.ba8p6 -0x1.4p2 +REG epsg:6720 3 0x1.928p6 0x1.4p2 +REG epsg:6720 4 0x1.ba8p6 0x1.4p2 +REG epsg:6721 0 0x1.a68p6 0x0.0p0 +REG epsg:6721 1 0x1.928p6 -0x1.4p2 +REG epsg:6721 2 0x1.ba8p6 -0x1.4p2 +REG epsg:6721 3 0x1.928p6 0x1.4p2 +REG epsg:6721 4 0x1.ba8p6 0x1.4p2 +REG epsg:6722 0 0x1.838p6 0x0.0p0 +REG epsg:6722 1 0x1.6f8p6 -0x1.4p2 +REG epsg:6722 2 0x1.978p6 -0x1.4p2 +REG epsg:6722 3 0x1.6f8p6 0x1.4p2 +REG epsg:6722 4 0x1.978p6 0x1.4p2 +REG epsg:6723 0 0x1.838p6 0x0.0p0 +REG epsg:6723 1 0x1.6f8p6 -0x1.4p2 +REG epsg:6723 2 0x1.978p6 -0x1.4p2 +REG epsg:6723 3 0x1.6f8p6 0x1.4p2 +REG epsg:6723 4 0x1.978p6 0x1.4p2 +REG epsg:6732 0 0x1.f8p5 -0x1.9p4 +REG epsg:6732 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:6732 2 0x1.12114b818572ep6 -0x1.ep4 +REG epsg:6732 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:6732 4 0x1.12114b818572ep6 -0x1.4p4 +REG epsg:6733 0 0x1.14p6 -0x1.9p4 +REG epsg:6733 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:6733 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:6733 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:6733 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:6734 0 0x1.2cp6 -0x1.9p4 +REG epsg:6734 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:6734 2 0x1.42114b818572ep6 -0x1.ep4 +REG epsg:6734 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:6734 4 0x1.42114b818572ep6 -0x1.4p4 +REG epsg:6735 0 0x1.44p6 -0x1.9p4 +REG epsg:6735 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:6735 2 0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:6735 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:6735 4 0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:6736 0 0x1.74p6 -0x1.9p4 +REG epsg:6736 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:6736 2 0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:6736 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:6736 4 0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:6737 0 0x1.8cp6 -0x1.9p4 +REG epsg:6737 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:6737 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:6737 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:6737 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:6738 0 0x1.56p7 -0x1.9p4 +REG epsg:6738 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:6738 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:6738 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:6738 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:6781 0 0x0.0p0 0x0.0p0 +REG epsg:6781 1 -0x1.4p2 -0x1.4p2 +REG epsg:6781 2 0x1.4p2 -0x1.4p2 +REG epsg:6781 3 -0x1.4p2 0x1.4p2 +REG epsg:6781 4 0x1.4p2 0x1.4p2 +REG epsg:6783 0 0x0.0p0 0x0.0p0 +REG epsg:6783 1 -0x1.4p2 -0x1.4p2 +REG epsg:6783 2 0x1.4p2 -0x1.4p2 +REG epsg:6783 3 -0x1.4p2 0x1.4p2 +REG epsg:6783 4 0x1.4p2 0x1.4p2 +REG epsg:6784 0 -0x1.d755555555553p6 0x1.64p5 +REG epsg:6784 1 -0x1.f35fbccd28e21p6 0x1.3cp5 +REG epsg:6784 2 -0x1.bb4aeddd81c85p6 0x1.3cp5 +REG epsg:6784 3 -0x1.f35fbccd28e21p6 0x1.8cp5 +REG epsg:6784 4 -0x1.bb4aeddd81c85p6 0x1.8cp5 +REG epsg:6785 0 -0x1.d755555555553p6 0x1.64p5 +REG epsg:6785 1 -0x1.f35fbccd28e21p6 0x1.3cp5 +REG epsg:6785 2 -0x1.bb4aeddd81c85p6 0x1.3cp5 +REG epsg:6785 3 -0x1.f35fbccd28e21p6 0x1.8cp5 +REG epsg:6785 4 -0x1.bb4aeddd81c85p6 0x1.8cp5 +REG epsg:6786 0 -0x1.d755555555553p6 0x1.64p5 +REG epsg:6786 1 -0x1.f35fbccd28e21p6 0x1.3cp5 +REG epsg:6786 2 -0x1.bb4aeddd81c85p6 0x1.3cp5 +REG epsg:6786 3 -0x1.f35fbccd28e21p6 0x1.8cp5 +REG epsg:6786 4 -0x1.bb4aeddd81c85p6 0x1.8cp5 +REG epsg:6787 0 -0x1.d755555555553p6 0x1.64p5 +REG epsg:6787 1 -0x1.f35fbccd28e21p6 0x1.3cp5 +REG epsg:6787 2 -0x1.bb4aeddd81c85p6 0x1.3cp5 +REG epsg:6787 3 -0x1.f35fbccd28e21p6 0x1.8cp5 +REG epsg:6787 4 -0x1.bb4aeddd81c85p6 0x1.8cp5 +REG epsg:6788 0 -0x1.e7p6 0x1.4ep5 +REG epsg:6788 1 -0x1.00e75f196181cp7 0x1.26p5 +REG epsg:6788 2 -0x1.cc3141cd3cfc8p6 0x1.26p5 +REG epsg:6788 3 -0x1.00e75f196181cp7 0x1.76p5 +REG epsg:6788 4 -0x1.cc3141cd3cfc8p6 0x1.76p5 +REG epsg:6789 0 -0x1.e7p6 0x1.4ep5 +REG epsg:6789 1 -0x1.00e75f196181cp7 0x1.26p5 +REG epsg:6789 2 -0x1.cc3141cd3cfc8p6 0x1.26p5 +REG epsg:6789 3 -0x1.00e75f196181cp7 0x1.76p5 +REG epsg:6789 4 -0x1.cc3141cd3cfc8p6 0x1.76p5 +REG epsg:6790 0 -0x1.e7p6 0x1.4ep5 +REG epsg:6790 1 -0x1.00e75f196181cp7 0x1.26p5 +REG epsg:6790 2 -0x1.cc3141cd3cfc8p6 0x1.26p5 +REG epsg:6790 3 -0x1.00e75f196181cp7 0x1.76p5 +REG epsg:6790 4 -0x1.cc3141cd3cfc8p6 0x1.76p5 +REG epsg:6791 0 -0x1.e7p6 0x1.4ep5 +REG epsg:6791 1 -0x1.00e75f196181cp7 0x1.26p5 +REG epsg:6791 2 -0x1.cc3141cd3cfc8p6 0x1.26p5 +REG epsg:6791 3 -0x1.00e75f196181cp7 0x1.76p5 +REG epsg:6791 4 -0x1.cc3141cd3cfc8p6 0x1.76p5 +REG epsg:6792 0 -0x1.e5p6 0x1.6555555555554p5 +REG epsg:6792 1 -0x1.008f81b53e6c1p7 0x1.3d55555555554p5 +REG epsg:6792 2 -0x1.c8e0fc958327dp6 0x1.3d55555555554p5 +REG epsg:6792 3 -0x1.008f81b53e6c1p7 0x1.8d55555555554p5 +REG epsg:6792 4 -0x1.c8e0fc958327dp6 0x1.8d55555555554p5 +REG epsg:6793 0 -0x1.e5p6 0x1.6555555555554p5 +REG epsg:6793 1 -0x1.008f81b53e6c1p7 0x1.3d55555555554p5 +REG epsg:6793 2 -0x1.c8e0fc958327dp6 0x1.3d55555555554p5 +REG epsg:6793 3 -0x1.008f81b53e6c1p7 0x1.8d55555555554p5 +REG epsg:6793 4 -0x1.c8e0fc958327dp6 0x1.8d55555555554p5 +REG epsg:6794 0 -0x1.e5p6 0x1.6555555555554p5 +REG epsg:6794 1 -0x1.008f81b53e6c1p7 0x1.3d55555555554p5 +REG epsg:6794 2 -0x1.c8e0fc958327dp6 0x1.3d55555555554p5 +REG epsg:6794 3 -0x1.008f81b53e6c1p7 0x1.8d55555555554p5 +REG epsg:6794 4 -0x1.c8e0fc958327dp6 0x1.8d55555555554p5 +REG epsg:6795 0 -0x1.e5p6 0x1.6555555555554p5 +REG epsg:6795 1 -0x1.008f81b53e6c1p7 0x1.3d55555555554p5 +REG epsg:6795 2 -0x1.c8e0fc958327dp6 0x1.3d55555555554p5 +REG epsg:6795 3 -0x1.008f81b53e6c1p7 0x1.8d55555555554p5 +REG epsg:6795 4 -0x1.c8e0fc958327dp6 0x1.8d55555555554p5 +REG epsg:6796 0 -0x1.dfp6 0x1.5d55555555554p5 +REG epsg:6796 1 -0x1.faa5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:6796 2 -0x1.c35a01f3e0753p6 0x1.3555555555554p5 +REG epsg:6796 3 -0x1.faa5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:6796 4 -0x1.c35a01f3e0753p6 0x1.8555555555554p5 +REG epsg:6797 0 -0x1.dfp6 0x1.5d55555555554p5 +REG epsg:6797 1 -0x1.faa5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:6797 2 -0x1.c35a01f3e0753p6 0x1.3555555555554p5 +REG epsg:6797 3 -0x1.faa5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:6797 4 -0x1.c35a01f3e0753p6 0x1.8555555555554p5 +REG epsg:6798 0 -0x1.dfp6 0x1.5d55555555554p5 +REG epsg:6798 1 -0x1.faa5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:6798 2 -0x1.c35a01f3e0753p6 0x1.3555555555554p5 +REG epsg:6798 3 -0x1.faa5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:6798 4 -0x1.c35a01f3e0753p6 0x1.8555555555554p5 +REG epsg:6799 0 -0x1.dfp6 0x1.5d55555555554p5 +REG epsg:6799 1 -0x1.faa5fe0c1f8adp6 0x1.3555555555554p5 +REG epsg:6799 2 -0x1.c35a01f3e0753p6 0x1.3555555555554p5 +REG epsg:6799 3 -0x1.faa5fe0c1f8adp6 0x1.8555555555554p5 +REG epsg:6799 4 -0x1.c35a01f3e0753p6 0x1.8555555555554p5 +REG epsg:6800 0 -0x1.ed55555555553p6 0x1.54p5 +REG epsg:6800 1 -0x1.043ae6c432872p7 0x1.2cp5 +REG epsg:6800 2 -0x1.d234dd22459c2p6 0x1.2cp5 +REG epsg:6800 3 -0x1.043ae6c432872p7 0x1.7cp5 +REG epsg:6800 4 -0x1.d234dd22459c2p6 0x1.7cp5 +REG epsg:6801 0 -0x1.ed55555555553p6 0x1.54p5 +REG epsg:6801 1 -0x1.043ae6c432872p7 0x1.2cp5 +REG epsg:6801 2 -0x1.d234dd22459c2p6 0x1.2cp5 +REG epsg:6801 3 -0x1.043ae6c432872p7 0x1.7cp5 +REG epsg:6801 4 -0x1.d234dd22459c2p6 0x1.7cp5 +REG epsg:6802 0 -0x1.ed55555555553p6 0x1.54p5 +REG epsg:6802 1 -0x1.043ae6c432872p7 0x1.2cp5 +REG epsg:6802 2 -0x1.d234dd22459c2p6 0x1.2cp5 +REG epsg:6802 3 -0x1.043ae6c432872p7 0x1.7cp5 +REG epsg:6802 4 -0x1.d234dd22459c2p6 0x1.7cp5 +REG epsg:6803 0 -0x1.ed55555555553p6 0x1.54p5 +REG epsg:6803 1 -0x1.043ae6c432872p7 0x1.2cp5 +REG epsg:6803 2 -0x1.d234dd22459c2p6 0x1.2cp5 +REG epsg:6803 3 -0x1.043ae6c432872p7 0x1.7cp5 +REG epsg:6803 4 -0x1.d234dd22459c2p6 0x1.7cp5 +REG epsg:6804 0 -0x1.e2p6 0x1.6d55555555554p5 +REG epsg:6804 1 -0x1.fe9e83ed448ap6 0x1.4555555555554p5 +REG epsg:6804 2 -0x1.c5617c12bb76p6 0x1.4555555555554p5 +REG epsg:6804 3 -0x1.fe9e83ed448ap6 0x1.9555555555554p5 +REG epsg:6804 4 -0x1.c5617c12bb76p6 0x1.9555555555554p5 +REG epsg:6805 0 -0x1.e2p6 0x1.6d55555555554p5 +REG epsg:6805 1 -0x1.fe9e83ed448ap6 0x1.4555555555554p5 +REG epsg:6805 2 -0x1.c5617c12bb76p6 0x1.4555555555554p5 +REG epsg:6805 3 -0x1.fe9e83ed448ap6 0x1.9555555555554p5 +REG epsg:6805 4 -0x1.c5617c12bb76p6 0x1.9555555555554p5 +REG epsg:6806 0 -0x1.e2p6 0x1.6d55555555554p5 +REG epsg:6806 1 -0x1.fe9e83ed448ap6 0x1.4555555555554p5 +REG epsg:6806 2 -0x1.c5617c12bb76p6 0x1.4555555555554p5 +REG epsg:6806 3 -0x1.fe9e83ed448ap6 0x1.9555555555554p5 +REG epsg:6806 4 -0x1.c5617c12bb76p6 0x1.9555555555554p5 +REG epsg:6807 0 -0x1.e2p6 0x1.6d55555555554p5 +REG epsg:6807 1 -0x1.fe9e83ed448ap6 0x1.4555555555554p5 +REG epsg:6807 2 -0x1.c5617c12bb76p6 0x1.4555555555554p5 +REG epsg:6807 3 -0x1.fe9e83ed448ap6 0x1.9555555555554p5 +REG epsg:6807 4 -0x1.c5617c12bb76p6 0x1.9555555555554p5 +REG epsg:6808 0 -0x1.ecp6 0x1.6f55555555554p5 +REG epsg:6808 1 -0x1.045fb9fe1f3e5p7 0x1.4755555555554p5 +REG epsg:6808 2 -0x1.cf408c03c1837p6 0x1.4755555555554p5 +REG epsg:6808 3 -0x1.045fb9fe1f3e5p7 0x1.9755555555554p5 +REG epsg:6808 4 -0x1.cf408c03c1837p6 0x1.9755555555554p5 +REG epsg:6809 0 -0x1.ecp6 0x1.6f55555555554p5 +REG epsg:6809 1 -0x1.045fb9fe1f3e5p7 0x1.4755555555554p5 +REG epsg:6809 2 -0x1.cf408c03c1837p6 0x1.4755555555554p5 +REG epsg:6809 3 -0x1.045fb9fe1f3e5p7 0x1.9755555555554p5 +REG epsg:6809 4 -0x1.cf408c03c1837p6 0x1.9755555555554p5 +REG epsg:6810 0 -0x1.ecp6 0x1.6f55555555554p5 +REG epsg:6810 1 -0x1.045fb9fe1f3e5p7 0x1.4755555555554p5 +REG epsg:6810 2 -0x1.cf408c03c1837p6 0x1.4755555555554p5 +REG epsg:6810 3 -0x1.045fb9fe1f3e5p7 0x1.9755555555554p5 +REG epsg:6810 4 -0x1.cf408c03c1837p6 0x1.9755555555554p5 +REG epsg:6811 0 -0x1.ecp6 0x1.6f55555555554p5 +REG epsg:6811 1 -0x1.045fb9fe1f3e5p7 0x1.4755555555554p5 +REG epsg:6811 2 -0x1.cf408c03c1837p6 0x1.4755555555554p5 +REG epsg:6811 3 -0x1.045fb9fe1f3e5p7 0x1.9755555555554p5 +REG epsg:6811 4 -0x1.cf408c03c1837p6 0x1.9755555555554p5 +REG epsg:6812 0 -0x1.ed55555555553p6 0x1.56aaaaaaaaaacp5 +REG epsg:6812 1 -0x1.044d92062982cp7 0x1.2eaaaaaaaaaacp5 +REG epsg:6812 2 -0x1.d20f869e57a4ep6 0x1.2eaaaaaaaaaacp5 +REG epsg:6812 3 -0x1.044d92062982cp7 0x1.7eaaaaaaaaaacp5 +REG epsg:6812 4 -0x1.d20f869e57a4ep6 0x1.7eaaaaaaaaaacp5 +REG epsg:6813 0 -0x1.ed55555555553p6 0x1.56aaaaaaaaaacp5 +REG epsg:6813 1 -0x1.044d92062982cp7 0x1.2eaaaaaaaaaacp5 +REG epsg:6813 2 -0x1.d20f869e57a4ep6 0x1.2eaaaaaaaaaacp5 +REG epsg:6813 3 -0x1.044d92062982cp7 0x1.7eaaaaaaaaaacp5 +REG epsg:6813 4 -0x1.d20f869e57a4ep6 0x1.7eaaaaaaaaaacp5 +REG epsg:6814 0 -0x1.ed55555555553p6 0x1.56aaaaaaaaaacp5 +REG epsg:6814 1 -0x1.044d92062982cp7 0x1.2eaaaaaaaaaacp5 +REG epsg:6814 2 -0x1.d20f869e57a4ep6 0x1.2eaaaaaaaaaacp5 +REG epsg:6814 3 -0x1.044d92062982cp7 0x1.7eaaaaaaaaaacp5 +REG epsg:6814 4 -0x1.d20f869e57a4ep6 0x1.7eaaaaaaaaaacp5 +REG epsg:6815 0 -0x1.ed55555555553p6 0x1.56aaaaaaaaaacp5 +REG epsg:6815 1 -0x1.044d92062982cp7 0x1.2eaaaaaaaaaacp5 +REG epsg:6815 2 -0x1.d20f869e57a4ep6 0x1.2eaaaaaaaaaacp5 +REG epsg:6815 3 -0x1.044d92062982cp7 0x1.7eaaaaaaaaaacp5 +REG epsg:6815 4 -0x1.d20f869e57a4ep6 0x1.7eaaaaaaaaaacp5 +REG epsg:6816 0 -0x1.e4p6 0x1.64p5 +REG epsg:6816 1 -0x1.000533bbe9c67p7 0x1.3cp5 +REG epsg:6816 2 -0x1.c7f598882c732p6 0x1.3cp5 +REG epsg:6816 3 -0x1.000533bbe9c67p7 0x1.8cp5 +REG epsg:6816 4 -0x1.c7f598882c732p6 0x1.8cp5 +REG epsg:6817 0 -0x1.e4p6 0x1.64p5 +REG epsg:6817 1 -0x1.000533bbe9c67p7 0x1.3cp5 +REG epsg:6817 2 -0x1.c7f598882c732p6 0x1.3cp5 +REG epsg:6817 3 -0x1.000533bbe9c67p7 0x1.8cp5 +REG epsg:6817 4 -0x1.c7f598882c732p6 0x1.8cp5 +REG epsg:6818 0 -0x1.e4p6 0x1.64p5 +REG epsg:6818 1 -0x1.000533bbe9c67p7 0x1.3cp5 +REG epsg:6818 2 -0x1.c7f598882c732p6 0x1.3cp5 +REG epsg:6818 3 -0x1.000533bbe9c67p7 0x1.8cp5 +REG epsg:6818 4 -0x1.c7f598882c732p6 0x1.8cp5 +REG epsg:6819 0 -0x1.e4p6 0x1.64p5 +REG epsg:6819 1 -0x1.000533bbe9c67p7 0x1.3cp5 +REG epsg:6819 2 -0x1.c7f598882c732p6 0x1.3cp5 +REG epsg:6819 3 -0x1.000533bbe9c67p7 0x1.8cp5 +REG epsg:6819 4 -0x1.c7f598882c732p6 0x1.8cp5 +REG epsg:6820 0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 +REG epsg:6820 1 -0x1.042d40d2117e7p7 0x1.36p5 +REG epsg:6820 2 -0x1.d0fad3b13258cp6 0x1.36p5 +REG epsg:6820 3 -0x1.042d40d2117e7p7 0x1.86p5 +REG epsg:6820 4 -0x1.d0fad3b13258cp6 0x1.86p5 +REG epsg:6821 0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 +REG epsg:6821 1 -0x1.042d40d2117e7p7 0x1.36p5 +REG epsg:6821 2 -0x1.d0fad3b13258cp6 0x1.36p5 +REG epsg:6821 3 -0x1.042d40d2117e7p7 0x1.86p5 +REG epsg:6821 4 -0x1.d0fad3b13258cp6 0x1.86p5 +REG epsg:6822 0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 +REG epsg:6822 1 -0x1.042d40d2117e7p7 0x1.36p5 +REG epsg:6822 2 -0x1.d0fad3b13258cp6 0x1.36p5 +REG epsg:6822 3 -0x1.042d40d2117e7p7 0x1.86p5 +REG epsg:6822 4 -0x1.d0fad3b13258cp6 0x1.86p5 +REG epsg:6823 0 -0x1.ecaaaaaaaaaadp6 0x1.5ep5 +REG epsg:6823 1 -0x1.042d40d2117e7p7 0x1.36p5 +REG epsg:6823 2 -0x1.d0fad3b13258cp6 0x1.36p5 +REG epsg:6823 3 -0x1.042d40d2117e7p7 0x1.86p5 +REG epsg:6823 4 -0x1.d0fad3b13258cp6 0x1.86p5 +REG epsg:6824 0 -0x1.ed55555555553p6 0x1.4ep5 +REG epsg:6824 1 -0x1.041209c40c2c5p7 0x1.26p5 +REG epsg:6824 2 -0x1.d28697229251bp6 0x1.26p5 +REG epsg:6824 3 -0x1.041209c40c2c5p7 0x1.76p5 +REG epsg:6824 4 -0x1.d28697229251bp6 0x1.76p5 +REG epsg:6825 0 -0x1.ed55555555553p6 0x1.4ep5 +REG epsg:6825 1 -0x1.041209c40c2c5p7 0x1.26p5 +REG epsg:6825 2 -0x1.d28697229251bp6 0x1.26p5 +REG epsg:6825 3 -0x1.041209c40c2c5p7 0x1.76p5 +REG epsg:6825 4 -0x1.d28697229251bp6 0x1.76p5 +REG epsg:6826 0 -0x1.ed55555555553p6 0x1.4ep5 +REG epsg:6826 1 -0x1.041209c40c2c5p7 0x1.26p5 +REG epsg:6826 2 -0x1.d28697229251bp6 0x1.26p5 +REG epsg:6826 3 -0x1.041209c40c2c5p7 0x1.76p5 +REG epsg:6826 4 -0x1.d28697229251bp6 0x1.76p5 +REG epsg:6827 0 -0x1.ed55555555553p6 0x1.4ep5 +REG epsg:6827 1 -0x1.041209c40c2c5p7 0x1.26p5 +REG epsg:6827 2 -0x1.d28697229251bp6 0x1.26p5 +REG epsg:6827 3 -0x1.041209c40c2c5p7 0x1.76p5 +REG epsg:6827 4 -0x1.d28697229251bp6 0x1.76p5 +REG epsg:6828 0 -0x1.e955555555553p6 0x1.68p5 +REG epsg:6828 1 -0x1.02cf0daaba2ffp7 0x1.4p5 +REG epsg:6828 2 -0x1.cd0c8f55364a7p6 0x1.4p5 +REG epsg:6828 3 -0x1.02cf0daaba2ffp7 0x1.9p5 +REG epsg:6828 4 -0x1.cd0c8f55364a7p6 0x1.9p5 +REG epsg:6829 0 -0x1.e955555555553p6 0x1.68p5 +REG epsg:6829 1 -0x1.02cf0daaba2ffp7 0x1.4p5 +REG epsg:6829 2 -0x1.cd0c8f55364a7p6 0x1.4p5 +REG epsg:6829 3 -0x1.02cf0daaba2ffp7 0x1.9p5 +REG epsg:6829 4 -0x1.cd0c8f55364a7p6 0x1.9p5 +REG epsg:6830 0 -0x1.e955555555553p6 0x1.68p5 +REG epsg:6830 1 -0x1.02cf0daaba2ffp7 0x1.4p5 +REG epsg:6830 2 -0x1.cd0c8f55364a7p6 0x1.4p5 +REG epsg:6830 3 -0x1.02cf0daaba2ffp7 0x1.9p5 +REG epsg:6830 4 -0x1.cd0c8f55364a7p6 0x1.9p5 +REG epsg:6831 0 -0x1.e955555555553p6 0x1.68p5 +REG epsg:6831 1 -0x1.02cf0daaba2ffp7 0x1.4p5 +REG epsg:6831 2 -0x1.cd0c8f55364a7p6 0x1.4p5 +REG epsg:6831 3 -0x1.02cf0daaba2ffp7 0x1.9p5 +REG epsg:6831 4 -0x1.cd0c8f55364a7p6 0x1.9p5 +REG epsg:6832 0 -0x1.d8p6 0x1.68p5 +REG epsg:6832 1 -0x1.f448c6001f0acp6 0x1.4p5 +REG epsg:6832 2 -0x1.bbb739ffe0f54p6 0x1.4p5 +REG epsg:6832 3 -0x1.f448c6001f0acp6 0x1.9p5 +REG epsg:6832 4 -0x1.bbb739ffe0f54p6 0x1.9p5 +REG epsg:6833 0 -0x1.d8p6 0x1.68p5 +REG epsg:6833 1 -0x1.f448c6001f0acp6 0x1.4p5 +REG epsg:6833 2 -0x1.bbb739ffe0f54p6 0x1.4p5 +REG epsg:6833 3 -0x1.f448c6001f0acp6 0x1.9p5 +REG epsg:6833 4 -0x1.bbb739ffe0f54p6 0x1.9p5 +REG epsg:6834 0 -0x1.d8p6 0x1.68p5 +REG epsg:6834 1 -0x1.f448c6001f0acp6 0x1.4p5 +REG epsg:6834 2 -0x1.bbb739ffe0f54p6 0x1.4p5 +REG epsg:6834 3 -0x1.f448c6001f0acp6 0x1.9p5 +REG epsg:6834 4 -0x1.bbb739ffe0f54p6 0x1.9p5 +REG epsg:6835 0 -0x1.d8p6 0x1.68p5 +REG epsg:6835 1 -0x1.f448c6001f0acp6 0x1.4p5 +REG epsg:6835 2 -0x1.bbb739ffe0f54p6 0x1.4p5 +REG epsg:6835 3 -0x1.f448c6001f0acp6 0x1.9p5 +REG epsg:6835 4 -0x1.bbb739ffe0f54p6 0x1.9p5 +REG epsg:6836 0 -0x1.d4p6 0x1.5ap5 +REG epsg:6836 1 -0x1.ef7562920c419p6 0x1.32p5 +REG epsg:6836 2 -0x1.b88a9d6df3be7p6 0x1.32p5 +REG epsg:6836 3 -0x1.ef7562920c419p6 0x1.82p5 +REG epsg:6836 4 -0x1.b88a9d6df3be7p6 0x1.82p5 +REG epsg:6837 0 -0x1.d4p6 0x1.5ap5 +REG epsg:6837 1 -0x1.ef7562920c419p6 0x1.32p5 +REG epsg:6837 2 -0x1.b88a9d6df3be7p6 0x1.32p5 +REG epsg:6837 3 -0x1.ef7562920c419p6 0x1.82p5 +REG epsg:6837 4 -0x1.b88a9d6df3be7p6 0x1.82p5 +REG epsg:6838 0 -0x1.d4p6 0x1.5ap5 +REG epsg:6838 1 -0x1.ef7562920c419p6 0x1.32p5 +REG epsg:6838 2 -0x1.b88a9d6df3be7p6 0x1.32p5 +REG epsg:6838 3 -0x1.ef7562920c419p6 0x1.82p5 +REG epsg:6838 4 -0x1.b88a9d6df3be7p6 0x1.82p5 +REG epsg:6839 0 -0x1.d4p6 0x1.5ap5 +REG epsg:6839 1 -0x1.ef7562920c419p6 0x1.32p5 +REG epsg:6839 2 -0x1.b88a9d6df3be7p6 0x1.32p5 +REG epsg:6839 3 -0x1.ef7562920c419p6 0x1.82p5 +REG epsg:6839 4 -0x1.b88a9d6df3be7p6 0x1.82p5 +REG epsg:6840 0 -0x1.f033333333333p6 0x1.66p5 +REG epsg:6840 1 -0x1.062e4aeac61cep7 0x1.3ep5 +REG epsg:6840 2 -0x1.d409d090da2cbp6 0x1.3ep5 +REG epsg:6840 3 -0x1.062e4aeac61cep7 0x1.8ep5 +REG epsg:6840 4 -0x1.d409d090da2cbp6 0x1.8ep5 +REG epsg:6841 0 -0x1.f033333333333p6 0x1.66p5 +REG epsg:6841 1 -0x1.062e4aeac61cep7 0x1.3ep5 +REG epsg:6841 2 -0x1.d409d090da2cbp6 0x1.3ep5 +REG epsg:6841 3 -0x1.062e4aeac61cep7 0x1.8ep5 +REG epsg:6841 4 -0x1.d409d090da2cbp6 0x1.8ep5 +REG epsg:6842 0 -0x1.f033333333333p6 0x1.66p5 +REG epsg:6842 1 -0x1.062e4aeac61cep7 0x1.3ep5 +REG epsg:6842 2 -0x1.d409d090da2cbp6 0x1.3ep5 +REG epsg:6842 3 -0x1.062e4aeac61cep7 0x1.8ep5 +REG epsg:6842 4 -0x1.d409d090da2cbp6 0x1.8ep5 +REG epsg:6843 0 -0x1.f033333333333p6 0x1.66p5 +REG epsg:6843 1 -0x1.062e4aeac61cep7 0x1.3ep5 +REG epsg:6843 2 -0x1.d409d090da2cbp6 0x1.3ep5 +REG epsg:6843 3 -0x1.062e4aeac61cep7 0x1.8ep5 +REG epsg:6843 4 -0x1.d409d090da2cbp6 0x1.8ep5 +REG epsg:6844 0 -0x1.dcaaaaaaaaaadp6 0x1.6ap5 +REG epsg:6844 1 -0x1.f9133de8994fp6 0x1.42p5 +REG epsg:6844 2 -0x1.c042176cbc06ap6 0x1.42p5 +REG epsg:6844 3 -0x1.f9133de8994fp6 0x1.92p5 +REG epsg:6844 4 -0x1.c042176cbc06ap6 0x1.92p5 +REG epsg:6845 0 -0x1.dcaaaaaaaaaadp6 0x1.6ap5 +REG epsg:6845 1 -0x1.f9133de8994fp6 0x1.42p5 +REG epsg:6845 2 -0x1.c042176cbc06ap6 0x1.42p5 +REG epsg:6845 3 -0x1.f9133de8994fp6 0x1.92p5 +REG epsg:6845 4 -0x1.c042176cbc06ap6 0x1.92p5 +REG epsg:6846 0 -0x1.dcaaaaaaaaaadp6 0x1.6ap5 +REG epsg:6846 1 -0x1.f9133de8994fp6 0x1.42p5 +REG epsg:6846 2 -0x1.c042176cbc06ap6 0x1.42p5 +REG epsg:6846 3 -0x1.f9133de8994fp6 0x1.92p5 +REG epsg:6846 4 -0x1.c042176cbc06ap6 0x1.92p5 +REG epsg:6847 0 -0x1.dcaaaaaaaaaadp6 0x1.6ap5 +REG epsg:6847 1 -0x1.f9133de8994fp6 0x1.42p5 +REG epsg:6847 2 -0x1.c042176cbc06ap6 0x1.42p5 +REG epsg:6847 3 -0x1.f9133de8994fp6 0x1.92p5 +REG epsg:6847 4 -0x1.c042176cbc06ap6 0x1.92p5 +REG epsg:6848 0 -0x1.d955555555553p6 0x1.68aaaaaaaaaacp5 +REG epsg:6848 1 -0x1.f5a8a93bb5f33p6 0x1.40aaaaaaaaaacp5 +REG epsg:6848 2 -0x1.bd02016ef4b73p6 0x1.40aaaaaaaaaacp5 +REG epsg:6848 3 -0x1.f5a8a93bb5f33p6 0x1.90aaaaaaaaaacp5 +REG epsg:6848 4 -0x1.bd02016ef4b73p6 0x1.90aaaaaaaaaacp5 +REG epsg:6849 0 -0x1.d955555555553p6 0x1.68aaaaaaaaaacp5 +REG epsg:6849 1 -0x1.f5a8a93bb5f33p6 0x1.40aaaaaaaaaacp5 +REG epsg:6849 2 -0x1.bd02016ef4b73p6 0x1.40aaaaaaaaaacp5 +REG epsg:6849 3 -0x1.f5a8a93bb5f33p6 0x1.90aaaaaaaaaacp5 +REG epsg:6849 4 -0x1.bd02016ef4b73p6 0x1.90aaaaaaaaaacp5 +REG epsg:6850 0 -0x1.d955555555553p6 0x1.68aaaaaaaaaacp5 +REG epsg:6850 1 -0x1.f5a8a93bb5f33p6 0x1.40aaaaaaaaaacp5 +REG epsg:6850 2 -0x1.bd02016ef4b73p6 0x1.40aaaaaaaaaacp5 +REG epsg:6850 3 -0x1.f5a8a93bb5f33p6 0x1.90aaaaaaaaaacp5 +REG epsg:6850 4 -0x1.bd02016ef4b73p6 0x1.90aaaaaaaaaacp5 +REG epsg:6851 0 -0x1.d955555555553p6 0x1.68aaaaaaaaaacp5 +REG epsg:6851 1 -0x1.f5a8a93bb5f33p6 0x1.40aaaaaaaaaacp5 +REG epsg:6851 2 -0x1.bd02016ef4b73p6 0x1.40aaaaaaaaaacp5 +REG epsg:6851 3 -0x1.f5a8a93bb5f33p6 0x1.90aaaaaaaaaacp5 +REG epsg:6851 4 -0x1.bd02016ef4b73p6 0x1.90aaaaaaaaaacp5 +REG epsg:6852 0 -0x1.ebp6 0x1.6cp5 +REG epsg:6852 1 -0x1.03c466092f8ep7 0x1.44p5 +REG epsg:6852 2 -0x1.ce7733eda0e41p6 0x1.44p5 +REG epsg:6852 3 -0x1.03c466092f8ep7 0x1.94p5 +REG epsg:6852 4 -0x1.ce7733eda0e41p6 0x1.94p5 +REG epsg:6853 0 -0x1.ebp6 0x1.6cp5 +REG epsg:6853 1 -0x1.03c466092f8ep7 0x1.44p5 +REG epsg:6853 2 -0x1.ce7733eda0e41p6 0x1.44p5 +REG epsg:6853 3 -0x1.03c466092f8ep7 0x1.94p5 +REG epsg:6853 4 -0x1.ce7733eda0e41p6 0x1.94p5 +REG epsg:6854 0 -0x1.ebp6 0x1.6cp5 +REG epsg:6854 1 -0x1.03c466092f8ep7 0x1.44p5 +REG epsg:6854 2 -0x1.ce7733eda0e41p6 0x1.44p5 +REG epsg:6854 3 -0x1.03c466092f8ep7 0x1.94p5 +REG epsg:6854 4 -0x1.ce7733eda0e41p6 0x1.94p5 +REG epsg:6855 0 -0x1.ebp6 0x1.6cp5 +REG epsg:6855 1 -0x1.03c466092f8ep7 0x1.44p5 +REG epsg:6855 2 -0x1.ce7733eda0e41p6 0x1.44p5 +REG epsg:6855 3 -0x1.03c466092f8ep7 0x1.94p5 +REG epsg:6855 4 -0x1.ce7733eda0e41p6 0x1.94p5 +REG epsg:6856 0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 +REG epsg:6856 1 -0x1.0425a737d25b1p7 0x1.3aaaaaaaaaaacp5 +REG epsg:6856 2 -0x1.d05f5c3b05f44p6 0x1.3aaaaaaaaaaacp5 +REG epsg:6856 3 -0x1.0425a737d25b1p7 0x1.8aaaaaaaaaaacp5 +REG epsg:6856 4 -0x1.d05f5c3b05f44p6 0x1.8aaaaaaaaaaacp5 +REG epsg:6857 0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 +REG epsg:6857 1 -0x1.0425a737d25b1p7 0x1.3aaaaaaaaaaacp5 +REG epsg:6857 2 -0x1.d05f5c3b05f44p6 0x1.3aaaaaaaaaaacp5 +REG epsg:6857 3 -0x1.0425a737d25b1p7 0x1.8aaaaaaaaaaacp5 +REG epsg:6857 4 -0x1.d05f5c3b05f44p6 0x1.8aaaaaaaaaaacp5 +REG epsg:6858 0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 +REG epsg:6858 1 -0x1.0425a737d25b1p7 0x1.3aaaaaaaaaaacp5 +REG epsg:6858 2 -0x1.d05f5c3b05f44p6 0x1.3aaaaaaaaaaacp5 +REG epsg:6858 3 -0x1.0425a737d25b1p7 0x1.8aaaaaaaaaaacp5 +REG epsg:6858 4 -0x1.d05f5c3b05f44p6 0x1.8aaaaaaaaaaacp5 +REG epsg:6859 0 -0x1.ec55555555553p6 0x1.62aaaaaaaaaacp5 +REG epsg:6859 1 -0x1.0425a737d25b1p7 0x1.3aaaaaaaaaaacp5 +REG epsg:6859 2 -0x1.d05f5c3b05f44p6 0x1.3aaaaaaaaaaacp5 +REG epsg:6859 3 -0x1.0425a737d25b1p7 0x1.8aaaaaaaaaaacp5 +REG epsg:6859 4 -0x1.d05f5c3b05f44p6 0x1.8aaaaaaaaaaacp5 +REG epsg:6860 0 -0x1.eap6 0x1.60aaaaaaaaaacp5 +REG epsg:6860 1 -0x1.02ebd3fdbd258p7 0x1.38aaaaaaaaaacp5 +REG epsg:6860 2 -0x1.ce28580485b5p6 0x1.38aaaaaaaaaacp5 +REG epsg:6860 3 -0x1.02ebd3fdbd258p7 0x1.88aaaaaaaaaacp5 +REG epsg:6860 4 -0x1.ce28580485b5p6 0x1.88aaaaaaaaaacp5 +REG epsg:6861 0 -0x1.eap6 0x1.60aaaaaaaaaacp5 +REG epsg:6861 1 -0x1.02ebd3fdbd258p7 0x1.38aaaaaaaaaacp5 +REG epsg:6861 2 -0x1.ce28580485b5p6 0x1.38aaaaaaaaaacp5 +REG epsg:6861 3 -0x1.02ebd3fdbd258p7 0x1.88aaaaaaaaaacp5 +REG epsg:6861 4 -0x1.ce28580485b5p6 0x1.88aaaaaaaaaacp5 +REG epsg:6862 0 -0x1.eap6 0x1.60aaaaaaaaaacp5 +REG epsg:6862 1 -0x1.02ebd3fdbd258p7 0x1.38aaaaaaaaaacp5 +REG epsg:6862 2 -0x1.ce28580485b5p6 0x1.38aaaaaaaaaacp5 +REG epsg:6862 3 -0x1.02ebd3fdbd258p7 0x1.88aaaaaaaaaacp5 +REG epsg:6862 4 -0x1.ce28580485b5p6 0x1.88aaaaaaaaaacp5 +REG epsg:6863 0 -0x1.eap6 0x1.60aaaaaaaaaacp5 +REG epsg:6863 1 -0x1.02ebd3fdbd258p7 0x1.38aaaaaaaaaacp5 +REG epsg:6863 2 -0x1.ce28580485b5p6 0x1.38aaaaaaaaaacp5 +REG epsg:6863 3 -0x1.02ebd3fdbd258p7 0x1.88aaaaaaaaaacp5 +REG epsg:6863 4 -0x1.ce28580485b5p6 0x1.88aaaaaaaaaacp5 +REG epsg:6867 0 -0x1.e2p6 0x1.5dp5 +REG epsg:6867 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:6867 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:6867 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:6867 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:6868 0 -0x1.e2p6 0x1.5dp5 +REG epsg:6868 1 -0x1.f6b8d03b9d97ep6 0x1.3fp5 +REG epsg:6868 2 -0x1.cd472fc462682p6 0x1.3fp5 +REG epsg:6868 3 -0x1.f6b8d03b9d97ep6 0x1.7bp5 +REG epsg:6868 4 -0x1.cd472fc462682p6 0x1.7bp5 +REG epsg:6870 0 0x1.4p4 0x0.0p0 +REG epsg:6870 1 0x1.ep3 -0x1.4p2 +REG epsg:6870 2 0x1.9p4 -0x1.4p2 +REG epsg:6870 3 0x1.ep3 0x1.4p2 +REG epsg:6870 4 0x1.9p4 0x1.4p2 +REG epsg:6871 0 0x0.0p0 0x0.0p0 +REG epsg:6871 1 -0x1.4p2 -0x1.4p2 +REG epsg:6871 2 0x1.4p2 -0x1.4p2 +REG epsg:6871 3 -0x1.4p2 0x1.4p2 +REG epsg:6871 4 0x1.4p2 0x1.4p2 +REG epsg:6875 0 0x1.8p3 0x0.0p0 +REG epsg:6875 1 0x1.cp2 -0x1.4p2 +REG epsg:6875 2 0x1.1p4 -0x1.4p2 +REG epsg:6875 3 0x1.cp2 0x1.4p2 +REG epsg:6875 4 0x1.1p4 0x1.4p2 +REG epsg:6876 0 0x1.8p3 0x0.0p0 +REG epsg:6876 1 0x1.cp2 -0x1.4p2 +REG epsg:6876 2 0x1.1p4 -0x1.4p2 +REG epsg:6876 3 0x1.cp2 0x1.4p2 +REG epsg:6876 4 0x1.1p4 0x1.4p2 +REG epsg:6879 0 -0x1.68p6 0x1.6555555555556p5 +REG epsg:6879 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG epsg:6879 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG epsg:6879 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG epsg:6879 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG epsg:6880 0 -0x1.9p6 0x1.4b55555555556p5 +REG epsg:6880 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG epsg:6880 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG epsg:6880 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG epsg:6880 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG epsg:6881 0 0x0.0p0 0x0.0p0 +REG epsg:6881 1 -0x1.4p2 -0x1.4p2 +REG epsg:6881 2 0x1.4p2 -0x1.4p2 +REG epsg:6881 3 -0x1.4p2 0x1.4p2 +REG epsg:6881 4 0x1.4p2 0x1.4p2 +REG epsg:6882 0 0x0.0p0 0x0.0p0 +REG epsg:6882 1 -0x1.4p2 -0x1.4p2 +REG epsg:6882 2 0x1.4p2 -0x1.4p2 +REG epsg:6882 3 -0x1.4p2 0x1.4p2 +REG epsg:6882 4 0x1.4p2 0x1.4p2 +REG epsg:6883 0 0x0.0p0 0x0.0p0 +REG epsg:6883 1 -0x1.4p2 -0x1.4p2 +REG epsg:6883 2 0x1.4p2 -0x1.4p2 +REG epsg:6883 3 -0x1.4p2 0x1.4p2 +REG epsg:6883 4 0x1.4p2 0x1.4p2 +REG epsg:6884 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:6884 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:6884 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:6884 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:6884 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:6885 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG epsg:6885 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG epsg:6885 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG epsg:6885 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG epsg:6885 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG epsg:6886 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:6886 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:6886 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:6886 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:6886 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:6887 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG epsg:6887 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG epsg:6887 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG epsg:6887 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG epsg:6887 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG epsg:6892 0 0x0.0p0 0x0.0p0 +REG epsg:6892 1 -0x1.4p2 -0x1.4p2 +REG epsg:6892 2 0x1.4p2 -0x1.4p2 +REG epsg:6892 3 -0x1.4p2 0x1.4p2 +REG epsg:6892 4 0x1.4p2 0x1.4p2 +REG epsg:6893 0 0x0.0p0 0x0.0p0 +REG epsg:6893 1 -0x1.4p2 -0x1.4p2 +REG epsg:6893 2 0x1.4p2 -0x1.4p2 +REG epsg:6893 3 -0x1.4p2 0x1.4p2 +REG epsg:6893 4 0x1.4p2 0x1.4p2 +REG epsg:6894 0 0x0.0p0 0x0.0p0 +REG epsg:6894 1 -0x1.4p2 -0x1.4p2 +REG epsg:6894 2 0x1.4p2 -0x1.4p2 +REG epsg:6894 3 -0x1.4p2 0x1.4p2 +REG epsg:6894 4 0x1.4p2 0x1.4p2 +REG epsg:6915 0 0x1.c8p5 0x0.0p0 +REG epsg:6915 1 0x1.ap5 -0x1.4p2 +REG epsg:6915 2 0x1.fp5 -0x1.4p2 +REG epsg:6915 3 0x1.ap5 0x1.4p2 +REG epsg:6915 4 0x1.fp5 0x1.4p2 +REG epsg:6917 0 0x0.0p0 0x0.0p0 +REG epsg:6917 1 -0x1.4p2 -0x1.4p2 +REG epsg:6917 2 0x1.4p2 -0x1.4p2 +REG epsg:6917 3 -0x1.4p2 0x1.4p2 +REG epsg:6917 4 0x1.4p2 0x1.4p2 +REG epsg:6922 0 -0x1.89p6 0x1.2ep5 +REG epsg:6922 1 -0x1.9ab4c0980fa7fp6 0x1.12p5 +REG epsg:6922 2 -0x1.774b3f67f0581p6 0x1.12p5 +REG epsg:6922 3 -0x1.9ab4c0980fa7fp6 0x1.4ap5 +REG epsg:6922 4 -0x1.774b3f67f0581p6 0x1.4ap5 +REG epsg:6923 0 -0x1.89p6 0x1.2ep5 +REG epsg:6923 1 -0x1.9ab4c0980fa7fp6 0x1.12p5 +REG epsg:6923 2 -0x1.774b3f67f0581p6 0x1.12p5 +REG epsg:6923 3 -0x1.9ab4c0980fa7fp6 0x1.4ap5 +REG epsg:6923 4 -0x1.774b3f67f0581p6 0x1.4ap5 +REG epsg:6924 0 -0x1.89p6 0x1.2ep5 +REG epsg:6924 1 -0x1.9ab4c0980fa7fp6 0x1.12p5 +REG epsg:6924 2 -0x1.774b3f67f0581p6 0x1.12p5 +REG epsg:6924 3 -0x1.9ab4c0980fa7fp6 0x1.4ap5 +REG epsg:6924 4 -0x1.774b3f67f0581p6 0x1.4ap5 +REG epsg:6925 0 -0x1.89p6 0x1.2ep5 +REG epsg:6925 1 -0x1.9ab4c0980fa7fp6 0x1.12p5 +REG epsg:6925 2 -0x1.774b3f67f0581p6 0x1.12p5 +REG epsg:6925 3 -0x1.9ab4c0980fa7fp6 0x1.4ap5 +REG epsg:6925 4 -0x1.774b3f67f0581p6 0x1.4ap5 +REG epsg:6927 0 0x1.9f55555555553p6 0x1.5dddddddddddfp0 +REG epsg:6927 1 0x1.8b53e05f720abp6 -0x1.d11111111111p1 +REG epsg:6927 2 0x1.b356ca4b389fbp6 -0x1.d11111111111p1 +REG epsg:6927 3 0x1.8b53e05f720abp6 0x1.9777777777778p2 +REG epsg:6927 4 0x1.b356ca4b389fbp6 0x1.9777777777778p2 +REG epsg:6931 0 0x0.0p0 0x1.64p6 +REG epsg:6931 1 -0x1.ep5 0x1.54p6 +REG epsg:6931 2 0x1.ep5 0x1.54p6 +REG epsg:6931 3 -0x1.ep5 0x1.64p6 +REG epsg:6931 4 0x1.ep5 0x1.64p6 +REG epsg:6932 0 0x0.0p0 -0x1.64p6 +REG epsg:6932 1 -0x1.ep5 -0x1.64p6 +REG epsg:6932 2 0x1.ep5 -0x1.64p6 +REG epsg:6932 3 -0x1.ep5 -0x1.54p6 +REG epsg:6932 4 0x1.ep5 -0x1.54p6 +REG epsg:6933 0 0x0.0p0 0x1.ep4 +REG epsg:6933 1 -0x1.7181116f43fe3p2 0x1.9p4 +REG epsg:6933 2 0x1.7181116f43fe3p2 0x1.9p4 +REG epsg:6933 3 -0x1.7181116f43fe3p2 0x1.18p5 +REG epsg:6933 4 0x1.7181116f43fe3p2 0x1.18p5 +REG epsg:6934 0 0x0.0p0 0x0.0p0 +REG epsg:6934 1 -0x1.4p2 -0x1.4p2 +REG epsg:6934 2 0x1.4p2 -0x1.4p2 +REG epsg:6934 3 -0x1.4p2 0x1.4p2 +REG epsg:6934 4 0x1.4p2 0x1.4p2 +REG epsg:6956 0 0x1.98p6 0x0.0p0 +REG epsg:6956 1 0x1.84p6 -0x1.4p2 +REG epsg:6956 2 0x1.acp6 -0x1.4p2 +REG epsg:6956 3 0x1.84p6 0x1.4p2 +REG epsg:6956 4 0x1.acp6 0x1.4p2 +REG epsg:6957 0 0x1.a4p6 0x0.0p0 +REG epsg:6957 1 0x1.9p6 -0x1.4p2 +REG epsg:6957 2 0x1.b8p6 -0x1.4p2 +REG epsg:6957 3 0x1.9p6 0x1.4p2 +REG epsg:6957 4 0x1.b8p6 0x1.4p2 +REG epsg:6958 0 0x1.bp6 0x0.0p0 +REG epsg:6958 1 0x1.9cp6 -0x1.4p2 +REG epsg:6958 2 0x1.c4p6 -0x1.4p2 +REG epsg:6958 3 0x1.9cp6 0x1.4p2 +REG epsg:6958 4 0x1.c4p6 0x1.4p2 +REG epsg:6959 0 0x1.afp6 0x0.0p0 +REG epsg:6959 1 0x1.9bp6 -0x1.4p2 +REG epsg:6959 2 0x1.c3p6 -0x1.4p2 +REG epsg:6959 3 0x1.9bp6 0x1.4p2 +REG epsg:6959 4 0x1.c3p6 0x1.4p2 +REG epsg:6962 0 0x1.4p4 0x1.48p5 +REG epsg:6962 1 0x1.d665f96765596p3 0x1.28p5 +REG epsg:6962 2 0x1.94cd034c4d535p4 0x1.28p5 +REG epsg:6962 3 0x1.d665f96765596p3 0x1.68p5 +REG epsg:6962 4 0x1.94cd034c4d535p4 0x1.68p5 +REG epsg:6978 0 0x0.0p0 0x0.0p0 +REG epsg:6978 1 -0x1.4p2 -0x1.4p2 +REG epsg:6978 2 0x1.4p2 -0x1.4p2 +REG epsg:6978 3 -0x1.4p2 0x1.4p2 +REG epsg:6978 4 0x1.4p2 0x1.4p2 +REG epsg:6980 0 0x0.0p0 0x0.0p0 +REG epsg:6980 1 -0x1.4p2 -0x1.4p2 +REG epsg:6980 2 0x1.4p2 -0x1.4p2 +REG epsg:6980 3 -0x1.4p2 0x1.4p2 +REG epsg:6980 4 0x1.4p2 0x1.4p2 +REG epsg:6981 0 0x0.0p0 0x0.0p0 +REG epsg:6981 1 -0x1.4p2 -0x1.4p2 +REG epsg:6981 2 0x1.4p2 -0x1.4p2 +REG epsg:6981 3 -0x1.4p2 0x1.4p2 +REG epsg:6981 4 0x1.4p2 0x1.4p2 +REG epsg:6983 0 0x0.0p0 0x0.0p0 +REG epsg:6983 1 -0x1.4p2 -0x1.4p2 +REG epsg:6983 2 0x1.4p2 -0x1.4p2 +REG epsg:6983 3 -0x1.4p2 0x1.4p2 +REG epsg:6983 4 0x1.4p2 0x1.4p2 +REG epsg:6984 0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d12p4 +REG epsg:6984 1 0x1.d5359f2a43a52p4 0x1.abc01383e1d12p4 +REG epsg:6984 2 0x1.48aae3fa1c0bbp5 0x1.abc01383e1d12p4 +REG epsg:6984 3 0x1.d5359f2a43a52p4 0x1.25e009c1f0e89p5 +REG epsg:6984 4 0x1.48aae3fa1c0bbp5 0x1.25e009c1f0e89p5 +REG epsg:6985 0 0x0.0p0 0x0.0p0 +REG epsg:6985 1 -0x1.4p2 -0x1.4p2 +REG epsg:6985 2 0x1.4p2 -0x1.4p2 +REG epsg:6985 3 -0x1.4p2 0x1.4p2 +REG epsg:6985 4 0x1.4p2 0x1.4p2 +REG epsg:6987 0 0x0.0p0 0x0.0p0 +REG epsg:6987 1 -0x1.4p2 -0x1.4p2 +REG epsg:6987 2 0x1.4p2 -0x1.4p2 +REG epsg:6987 3 -0x1.4p2 0x1.4p2 +REG epsg:6987 4 0x1.4p2 0x1.4p2 +REG epsg:6988 0 0x0.0p0 0x0.0p0 +REG epsg:6988 1 -0x1.4p2 -0x1.4p2 +REG epsg:6988 2 0x1.4p2 -0x1.4p2 +REG epsg:6988 3 -0x1.4p2 0x1.4p2 +REG epsg:6988 4 0x1.4p2 0x1.4p2 +REG epsg:6990 0 0x0.0p0 0x0.0p0 +REG epsg:6990 1 -0x1.4p2 -0x1.4p2 +REG epsg:6990 2 0x1.4p2 -0x1.4p2 +REG epsg:6990 3 -0x1.4p2 0x1.4p2 +REG epsg:6990 4 0x1.4p2 0x1.4p2 +REG epsg:6991 0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d12p4 +REG epsg:6991 1 0x1.d5359f2a43a52p4 0x1.abc01383e1d12p4 +REG epsg:6991 2 0x1.48aae3fa1c0bbp5 0x1.abc01383e1d12p4 +REG epsg:6991 3 0x1.d5359f2a43a52p4 0x1.25e009c1f0e89p5 +REG epsg:6991 4 0x1.48aae3fa1c0bbp5 0x1.25e009c1f0e89p5 +REG epsg:6996 0 -0x1.e9ccccccccccdp6 0x1.2ep5 +REG epsg:6996 1 -0x1.018c1489df4c1p7 0x1.06p5 +REG epsg:6996 2 -0x1.d0817085db017p6 0x1.06p5 +REG epsg:6996 3 -0x1.018c1489df4c1p7 0x1.56p5 +REG epsg:6996 4 -0x1.d0817085db017p6 0x1.56p5 +REG epsg:6997 0 -0x1.e9ccccccccccdp6 0x1.2ep5 +REG epsg:6997 1 -0x1.018c1489df4c1p7 0x1.06p5 +REG epsg:6997 2 -0x1.d0817085db017p6 0x1.06p5 +REG epsg:6997 3 -0x1.018c1489df4c1p7 0x1.56p5 +REG epsg:6997 4 -0x1.d0817085db017p6 0x1.56p5 +REG epsg:7005 0 0x1.38p5 0x0.0p0 +REG epsg:7005 1 0x1.1p5 -0x1.4p2 +REG epsg:7005 2 0x1.6p5 -0x1.4p2 +REG epsg:7005 3 0x1.1p5 0x1.4p2 +REG epsg:7005 4 0x1.6p5 0x1.4p2 +REG epsg:7006 0 0x1.68p5 0x0.0p0 +REG epsg:7006 1 0x1.4p5 -0x1.4p2 +REG epsg:7006 2 0x1.9p5 -0x1.4p2 +REG epsg:7006 3 0x1.4p5 0x1.4p2 +REG epsg:7006 4 0x1.9p5 0x1.4p2 +REG epsg:7007 0 0x1.98p5 0x0.0p0 +REG epsg:7007 1 0x1.7p5 -0x1.4p2 +REG epsg:7007 2 0x1.cp5 -0x1.4p2 +REG epsg:7007 3 0x1.7p5 0x1.4p2 +REG epsg:7007 4 0x1.cp5 0x1.4p2 +REG epsg:7035 0 0x0.0p0 0x0.0p0 +REG epsg:7035 1 -0x1.4p2 -0x1.4p2 +REG epsg:7035 2 0x1.4p2 -0x1.4p2 +REG epsg:7035 3 -0x1.4p2 0x1.4p2 +REG epsg:7035 4 0x1.4p2 0x1.4p2 +REG epsg:7037 0 0x0.0p0 0x0.0p0 +REG epsg:7037 1 -0x1.4p2 -0x1.4p2 +REG epsg:7037 2 0x1.4p2 -0x1.4p2 +REG epsg:7037 3 -0x1.4p2 0x1.4p2 +REG epsg:7037 4 0x1.4p2 0x1.4p2 +REG epsg:7039 0 0x0.0p0 0x0.0p0 +REG epsg:7039 1 -0x1.4p2 -0x1.4p2 +REG epsg:7039 2 0x1.4p2 -0x1.4p2 +REG epsg:7039 3 -0x1.4p2 0x1.4p2 +REG epsg:7039 4 0x1.4p2 0x1.4p2 +REG epsg:7041 0 0x0.0p0 0x0.0p0 +REG epsg:7041 1 -0x1.4p2 -0x1.4p2 +REG epsg:7041 2 0x1.4p2 -0x1.4p2 +REG epsg:7041 3 -0x1.4p2 0x1.4p2 +REG epsg:7041 4 0x1.4p2 0x1.4p2 +REG epsg:7057 0 -0x1.7dp6 0x1.599999999999ap5 +REG epsg:7057 1 -0x1.986f9f336714ep6 0x1.319999999999ap5 +REG epsg:7057 2 -0x1.619060cc98eb2p6 0x1.319999999999ap5 +REG epsg:7057 3 -0x1.986f9f336714ep6 0x1.819999999999ap5 +REG epsg:7057 4 -0x1.619060cc98eb2p6 0x1.819999999999ap5 +REG epsg:7058 0 -0x1.73p6 0x1.5955555555554p5 +REG epsg:7058 1 -0x1.8e6bc9b95d2c3p6 0x1.3155555555554p5 +REG epsg:7058 2 -0x1.57943646a2d3dp6 0x1.3155555555554p5 +REG epsg:7058 3 -0x1.8e6bc9b95d2c3p6 0x1.8155555555554p5 +REG epsg:7058 4 -0x1.57943646a2d3dp6 0x1.8155555555554p5 +REG epsg:7059 0 -0x1.6cccccccccccdp6 0x1.42p5 +REG epsg:7059 1 -0x1.87011c2827dc4p6 0x1.1ap5 +REG epsg:7059 2 -0x1.52987d7171bd6p6 0x1.1ap5 +REG epsg:7059 3 -0x1.87011c2827dc4p6 0x1.6ap5 +REG epsg:7059 4 -0x1.52987d7171bd6p6 0x1.6ap5 +REG epsg:7060 0 -0x1.7b55555555555p6 0x1.5444444444444p5 +REG epsg:7060 1 -0x1.9679821371366p6 0x1.2c44444444444p5 +REG epsg:7060 2 -0x1.6031289739744p6 0x1.2c44444444444p5 +REG epsg:7060 3 -0x1.9679821371366p6 0x1.7c44444444444p5 +REG epsg:7060 4 -0x1.6031289739744p6 0x1.7c44444444444p5 +REG epsg:7061 0 -0x1.71p6 0x1.5533333333333p5 +REG epsg:7061 1 -0x1.8c313162e52dap6 0x1.2d33333333333p5 +REG epsg:7061 2 -0x1.55cece9d1ad26p6 0x1.2d33333333333p5 +REG epsg:7061 3 -0x1.8c313162e52dap6 0x1.7d33333333333p5 +REG epsg:7061 4 -0x1.55cece9d1ad26p6 0x1.7d33333333333p5 +REG epsg:7062 0 -0x1.7eeeeeeeeeeefp6 0x1.42p5 +REG epsg:7062 1 -0x1.99233e4a49fe6p6 0x1.1ap5 +REG epsg:7062 2 -0x1.64ba9f9393df8p6 0x1.1ap5 +REG epsg:7062 3 -0x1.99233e4a49fe6p6 0x1.6ap5 +REG epsg:7062 4 -0x1.64ba9f9393df8p6 0x1.6ap5 +REG epsg:7063 0 -0x1.7a88888888889p6 0x1.42p5 +REG epsg:7063 1 -0x1.94bcd7e3e398p6 0x1.1ap5 +REG epsg:7063 2 -0x1.6054392d2d792p6 0x1.1ap5 +REG epsg:7063 3 -0x1.94bcd7e3e398p6 0x1.6ap5 +REG epsg:7063 4 -0x1.6054392d2d792p6 0x1.6ap5 +REG epsg:7064 0 -0x1.76ddddddddddep6 0x1.42p5 +REG epsg:7064 1 -0x1.91122d3938ed4p6 0x1.1ap5 +REG epsg:7064 2 -0x1.5ca98e8282ce8p6 0x1.1ap5 +REG epsg:7064 3 -0x1.91122d3938ed4p6 0x1.6ap5 +REG epsg:7064 4 -0x1.5ca98e8282ce8p6 0x1.6ap5 +REG epsg:7065 0 -0x1.7344444444444p6 0x1.42p5 +REG epsg:7065 1 -0x1.8d78939f9f53ap6 0x1.1ap5 +REG epsg:7065 2 -0x1.590ff4e8e934ep6 0x1.1ap5 +REG epsg:7065 3 -0x1.8d78939f9f53ap6 0x1.6ap5 +REG epsg:7065 4 -0x1.590ff4e8e934ep6 0x1.6ap5 +REG epsg:7066 0 -0x1.6eaaaaaaaaaabp6 0x1.4eaaaaaaaaaacp5 +REG epsg:7066 1 -0x1.898256577a0e7p6 0x1.26aaaaaaaaaacp5 +REG epsg:7066 2 -0x1.53d2fefddb46fp6 0x1.26aaaaaaaaaacp5 +REG epsg:7066 3 -0x1.898256577a0e7p6 0x1.76aaaaaaaaaacp5 +REG epsg:7066 4 -0x1.53d2fefddb46fp6 0x1.76aaaaaaaaaacp5 +REG epsg:7067 0 -0x1.6a22222222222p6 0x1.42p5 +REG epsg:7067 1 -0x1.8456717d7d318p6 0x1.1ap5 +REG epsg:7067 2 -0x1.4fedd2c6c712cp6 0x1.1ap5 +REG epsg:7067 3 -0x1.8456717d7d318p6 0x1.6ap5 +REG epsg:7067 4 -0x1.4fedd2c6c712cp6 0x1.6ap5 +REG epsg:7068 0 -0x1.77p6 0x1.4755555555554p5 +REG epsg:7068 1 -0x1.917781dab3258p6 0x1.1f55555555554p5 +REG epsg:7068 2 -0x1.5c887e254cda8p6 0x1.1f55555555554p5 +REG epsg:7068 3 -0x1.917781dab3258p6 0x1.6f55555555554p5 +REG epsg:7068 4 -0x1.5c887e254cda8p6 0x1.6f55555555554p5 +REG epsg:7069 0 -0x1.6faaaaaaaaaabp6 0x1.42p5 +REG epsg:7069 1 -0x1.89defa0605ba2p6 0x1.1ap5 +REG epsg:7069 2 -0x1.55765b4f4f9b4p6 0x1.1ap5 +REG epsg:7069 3 -0x1.89defa0605ba2p6 0x1.6ap5 +REG epsg:7069 4 -0x1.55765b4f4f9b4p6 0x1.6ap5 +REG epsg:7070 0 -0x1.6dp6 0x1.42p5 +REG epsg:7070 1 -0x1.87344f5b5b0f6p6 0x1.1ap5 +REG epsg:7070 2 -0x1.52cbb0a4a4f0ap6 0x1.1ap5 +REG epsg:7070 3 -0x1.87344f5b5b0f6p6 0x1.6ap5 +REG epsg:7070 4 -0x1.52cbb0a4a4f0ap6 0x1.6ap5 +REG epsg:7071 0 0x0.0p0 0x0.0p0 +REG epsg:7071 1 -0x1.4p2 -0x1.4p2 +REG epsg:7071 2 0x1.4p2 -0x1.4p2 +REG epsg:7071 3 -0x1.4p2 0x1.4p2 +REG epsg:7071 4 0x1.4p2 0x1.4p2 +REG epsg:7073 0 0x0.0p0 0x0.0p0 +REG epsg:7073 1 -0x1.4p2 -0x1.4p2 +REG epsg:7073 2 0x1.4p2 -0x1.4p2 +REG epsg:7073 3 -0x1.4p2 0x1.4p2 +REG epsg:7073 4 0x1.4p2 0x1.4p2 +REG epsg:7074 0 0x1.38p5 -0x1.9p4 +REG epsg:7074 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG epsg:7074 2 0x1.642297030ae5dp5 -0x1.ep4 +REG epsg:7074 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG epsg:7074 4 0x1.642297030ae5dp5 -0x1.4p4 +REG epsg:7075 0 0x1.68p5 -0x1.9p4 +REG epsg:7075 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG epsg:7075 2 0x1.942297030ae5dp5 -0x1.ep4 +REG epsg:7075 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG epsg:7075 4 0x1.942297030ae5dp5 -0x1.4p4 +REG epsg:7076 0 0x1.98p5 -0x1.9p4 +REG epsg:7076 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG epsg:7076 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG epsg:7076 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG epsg:7076 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG epsg:7077 0 0x1.c8p5 -0x1.9p4 +REG epsg:7077 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG epsg:7077 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG epsg:7077 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG epsg:7077 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG epsg:7078 0 0x1.f8p5 -0x1.9p4 +REG epsg:7078 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG epsg:7078 2 0x1.12114b818572ep6 -0x1.ep4 +REG epsg:7078 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG epsg:7078 4 0x1.12114b818572ep6 -0x1.4p4 +REG epsg:7079 0 0x1.14p6 -0x1.9p4 +REG epsg:7079 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG epsg:7079 2 0x1.2a114b818572ep6 -0x1.ep4 +REG epsg:7079 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG epsg:7079 4 0x1.2a114b818572ep6 -0x1.4p4 +REG epsg:7080 0 0x1.2cp6 -0x1.9p4 +REG epsg:7080 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG epsg:7080 2 0x1.42114b818572ep6 -0x1.ep4 +REG epsg:7080 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG epsg:7080 4 0x1.42114b818572ep6 -0x1.4p4 +REG epsg:7081 0 0x1.44p6 -0x1.9p4 +REG epsg:7081 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG epsg:7081 2 0x1.5a114b818572ep6 -0x1.ep4 +REG epsg:7081 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG epsg:7081 4 0x1.5a114b818572ep6 -0x1.4p4 +REG epsg:7084 0 0x0.0p0 0x0.0p0 +REG epsg:7084 1 -0x1.4p2 -0x1.4p2 +REG epsg:7084 2 0x1.4p2 -0x1.4p2 +REG epsg:7084 3 -0x1.4p2 0x1.4p2 +REG epsg:7084 4 0x1.4p2 0x1.4p2 +REG epsg:7086 0 0x0.0p0 0x0.0p0 +REG epsg:7086 1 -0x1.4p2 -0x1.4p2 +REG epsg:7086 2 0x1.4p2 -0x1.4p2 +REG epsg:7086 3 -0x1.4p2 0x1.4p2 +REG epsg:7086 4 0x1.4p2 0x1.4p2 +REG epsg:7088 0 0x0.0p0 0x0.0p0 +REG epsg:7088 1 -0x1.4p2 -0x1.4p2 +REG epsg:7088 2 0x1.4p2 -0x1.4p2 +REG epsg:7088 3 -0x1.4p2 0x1.4p2 +REG epsg:7088 4 0x1.4p2 0x1.4p2 +REG epsg:7109 0 -0x1.c2p6 0x1.84p5 +REG epsg:7109 1 -0x1.e02ee6d815b4ap6 0x1.5cp5 +REG epsg:7109 2 -0x1.a3d11927ea4b6p6 0x1.5cp5 +REG epsg:7109 3 -0x1.e02ee6d815b4ap6 0x1.acp5 +REG epsg:7109 4 -0x1.a3d11927ea4b6p6 0x1.acp5 +REG epsg:7110 0 -0x1.c2p6 0x1.8p5 +REG epsg:7110 1 -0x1.dfe3b84dae25fp6 0x1.58p5 +REG epsg:7110 2 -0x1.a41c47b251da1p6 0x1.58p5 +REG epsg:7110 3 -0x1.dfe3b84dae25fp6 0x1.a8p5 +REG epsg:7110 4 -0x1.a41c47b251da1p6 0x1.a8p5 +REG epsg:7111 0 -0x1.bcp6 0x1.84p5 +REG epsg:7111 1 -0x1.da2ee6d815b4ap6 0x1.5cp5 +REG epsg:7111 2 -0x1.9dd11927ea4b6p6 0x1.5cp5 +REG epsg:7111 3 -0x1.da2ee6d815b4ap6 0x1.acp5 +REG epsg:7111 4 -0x1.9dd11927ea4b6p6 0x1.acp5 +REG epsg:7112 0 -0x1.b2p6 0x1.84p5 +REG epsg:7112 1 -0x1.d02ee6d815b4ap6 0x1.5cp5 +REG epsg:7112 2 -0x1.93d11927ea4b6p6 0x1.5cp5 +REG epsg:7112 3 -0x1.d02ee6d815b4ap6 0x1.acp5 +REG epsg:7112 4 -0x1.93d11927ea4b6p6 0x1.acp5 +REG epsg:7113 0 -0x1.a6p6 0x1.82aaaaaaaaaacp5 +REG epsg:7113 1 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaaacp5 +REG epsg:7113 2 -0x1.87ea6341d85f1p6 0x1.5aaaaaaaaaaacp5 +REG epsg:7113 3 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaaaacp5 +REG epsg:7113 4 -0x1.87ea6341d85f1p6 0x1.aaaaaaaaaaaacp5 +REG epsg:7114 0 -0x1.a6p6 0x1.82aaaaaaaaaacp5 +REG epsg:7114 1 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaaacp5 +REG epsg:7114 2 -0x1.87ea6341d85f1p6 0x1.5aaaaaaaaaaacp5 +REG epsg:7114 3 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaaaacp5 +REG epsg:7114 4 -0x1.87ea6341d85f1p6 0x1.aaaaaaaaaaaacp5 +REG epsg:7115 0 -0x1.afp6 0x1.66p5 +REG epsg:7115 1 -0x1.cb2962a259068p6 0x1.3ep5 +REG epsg:7115 2 -0x1.92d69d5da6f98p6 0x1.3ep5 +REG epsg:7115 3 -0x1.cb2962a259068p6 0x1.8ep5 +REG epsg:7115 4 -0x1.92d69d5da6f98p6 0x1.8ep5 +REG epsg:7116 0 -0x1.bdp6 0x1.72p5 +REG epsg:7116 1 -0x1.d9ec0dd24eb35p6 0x1.4ap5 +REG epsg:7116 2 -0x1.a013f22db14cbp6 0x1.4ap5 +REG epsg:7116 3 -0x1.d9ec0dd24eb35p6 0x1.9ap5 +REG epsg:7116 4 -0x1.a013f22db14cbp6 0x1.9ap5 +REG epsg:7117 0 -0x1.b1aaaaaaaaaadp6 0x1.6e44444444444p5 +REG epsg:7117 1 -0x1.ce587fb072ed4p6 0x1.4644444444444p5 +REG epsg:7117 2 -0x1.94fcd5a4e2686p6 0x1.4644444444444p5 +REG epsg:7117 3 -0x1.ce587fb072ed4p6 0x1.9644444444444p5 +REG epsg:7117 4 -0x1.94fcd5a4e2686p6 0x1.9644444444444p5 +REG epsg:7118 0 -0x1.b155555555553p6 0x1.5555555555554p5 +REG epsg:7118 1 -0x1.cc88646f6425p6 0x1.2d55555555554p5 +REG epsg:7118 2 -0x1.9622463b46856p6 0x1.2d55555555554p5 +REG epsg:7118 3 -0x1.cc88646f6425p6 0x1.7d55555555554p5 +REG epsg:7118 4 -0x1.9622463b46856p6 0x1.7d55555555554p5 +REG epsg:7119 0 -0x1.c2p6 0x1.84p5 +REG epsg:7119 1 -0x1.e02ee6d815b4ap6 0x1.5cp5 +REG epsg:7119 2 -0x1.a3d11927ea4b6p6 0x1.5cp5 +REG epsg:7119 3 -0x1.e02ee6d815b4ap6 0x1.acp5 +REG epsg:7119 4 -0x1.a3d11927ea4b6p6 0x1.acp5 +REG epsg:7120 0 -0x1.c2p6 0x1.8p5 +REG epsg:7120 1 -0x1.dfe3b84dae25fp6 0x1.58p5 +REG epsg:7120 2 -0x1.a41c47b251da1p6 0x1.58p5 +REG epsg:7120 3 -0x1.dfe3b84dae25fp6 0x1.a8p5 +REG epsg:7120 4 -0x1.a41c47b251da1p6 0x1.a8p5 +REG epsg:7121 0 -0x1.bcp6 0x1.84p5 +REG epsg:7121 1 -0x1.da2ee6d815b4ap6 0x1.5cp5 +REG epsg:7121 2 -0x1.9dd11927ea4b6p6 0x1.5cp5 +REG epsg:7121 3 -0x1.da2ee6d815b4ap6 0x1.acp5 +REG epsg:7121 4 -0x1.9dd11927ea4b6p6 0x1.acp5 +REG epsg:7122 0 -0x1.b2p6 0x1.84p5 +REG epsg:7122 1 -0x1.d02ee6d815b4ap6 0x1.5cp5 +REG epsg:7122 2 -0x1.93d11927ea4b6p6 0x1.5cp5 +REG epsg:7122 3 -0x1.d02ee6d815b4ap6 0x1.acp5 +REG epsg:7122 4 -0x1.93d11927ea4b6p6 0x1.acp5 +REG epsg:7123 0 -0x1.a6p6 0x1.82aaaaaaaaaacp5 +REG epsg:7123 1 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaaacp5 +REG epsg:7123 2 -0x1.87ea6341d85f1p6 0x1.5aaaaaaaaaaacp5 +REG epsg:7123 3 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaaaacp5 +REG epsg:7123 4 -0x1.87ea6341d85f1p6 0x1.aaaaaaaaaaaacp5 +REG epsg:7124 0 -0x1.a6p6 0x1.82aaaaaaaaaacp5 +REG epsg:7124 1 -0x1.c4159cbe27a0fp6 0x1.5aaaaaaaaaaacp5 +REG epsg:7124 2 -0x1.87ea6341d85f1p6 0x1.5aaaaaaaaaaacp5 +REG epsg:7124 3 -0x1.c4159cbe27a0fp6 0x1.aaaaaaaaaaaacp5 +REG epsg:7124 4 -0x1.87ea6341d85f1p6 0x1.aaaaaaaaaaaacp5 +REG epsg:7125 0 -0x1.afp6 0x1.66p5 +REG epsg:7125 1 -0x1.cb2962a259068p6 0x1.3ep5 +REG epsg:7125 2 -0x1.92d69d5da6f98p6 0x1.3ep5 +REG epsg:7125 3 -0x1.cb2962a259068p6 0x1.8ep5 +REG epsg:7125 4 -0x1.92d69d5da6f98p6 0x1.8ep5 +REG epsg:7126 0 -0x1.bdp6 0x1.72p5 +REG epsg:7126 1 -0x1.d9ec0dd24eb35p6 0x1.4ap5 +REG epsg:7126 2 -0x1.a013f22db14cbp6 0x1.4ap5 +REG epsg:7126 3 -0x1.d9ec0dd24eb35p6 0x1.9ap5 +REG epsg:7126 4 -0x1.a013f22db14cbp6 0x1.9ap5 +REG epsg:7127 0 -0x1.b1aaaaaaaaaadp6 0x1.6e44444444444p5 +REG epsg:7127 1 -0x1.ce587fb072ed4p6 0x1.4644444444444p5 +REG epsg:7127 2 -0x1.94fcd5a4e2686p6 0x1.4644444444444p5 +REG epsg:7127 3 -0x1.ce587fb072ed4p6 0x1.9644444444444p5 +REG epsg:7127 4 -0x1.94fcd5a4e2686p6 0x1.9644444444444p5 +REG epsg:7128 0 -0x1.b155555555553p6 0x1.5555555555554p5 +REG epsg:7128 1 -0x1.cc88646f6425p6 0x1.2d55555555554p5 +REG epsg:7128 2 -0x1.9622463b46856p6 0x1.2d55555555554p5 +REG epsg:7128 3 -0x1.cc88646f6425p6 0x1.7d55555555554p5 +REG epsg:7128 4 -0x1.9622463b46856p6 0x1.7d55555555554p5 +REG epsg:7131 0 -0x1.e9ccccccccccdp6 0x1.2ep5 +REG epsg:7131 1 -0x1.018c1489df4c1p7 0x1.06p5 +REG epsg:7131 2 -0x1.d0817085db017p6 0x1.06p5 +REG epsg:7131 3 -0x1.018c1489df4c1p7 0x1.56p5 +REG epsg:7131 4 -0x1.d0817085db017p6 0x1.56p5 +REG epsg:7132 0 -0x1.e9ccccccccccdp6 0x1.2ep5 +REG epsg:7132 1 -0x1.018c1489df4c1p7 0x1.06p5 +REG epsg:7132 2 -0x1.d0817085db017p6 0x1.06p5 +REG epsg:7132 3 -0x1.018c1489df4c1p7 0x1.56p5 +REG epsg:7132 4 -0x1.d0817085db017p6 0x1.56p5 +REG epsg:7133 0 0x0.0p0 0x0.0p0 +REG epsg:7133 1 -0x1.4p2 -0x1.4p2 +REG epsg:7133 2 0x1.4p2 -0x1.4p2 +REG epsg:7133 3 -0x1.4p2 0x1.4p2 +REG epsg:7133 4 0x1.4p2 0x1.4p2 +REG epsg:7134 0 0x0.0p0 0x0.0p0 +REG epsg:7134 1 -0x1.4p2 -0x1.4p2 +REG epsg:7134 2 0x1.4p2 -0x1.4p2 +REG epsg:7134 3 -0x1.4p2 0x1.4p2 +REG epsg:7134 4 0x1.4p2 0x1.4p2 +REG epsg:7136 0 0x0.0p0 0x0.0p0 +REG epsg:7136 1 -0x1.4p2 -0x1.4p2 +REG epsg:7136 2 0x1.4p2 -0x1.4p2 +REG epsg:7136 3 -0x1.4p2 0x1.4p2 +REG epsg:7136 4 0x1.4p2 0x1.4p2 +REG epsg:7137 0 0x0.0p0 0x0.0p0 +REG epsg:7137 1 -0x1.4p2 -0x1.4p2 +REG epsg:7137 2 0x1.4p2 -0x1.4p2 +REG epsg:7137 3 -0x1.4p2 0x1.4p2 +REG epsg:7137 4 0x1.4p2 0x1.4p2 +REG epsg:7139 0 0x0.0p0 0x0.0p0 +REG epsg:7139 1 -0x1.4p2 -0x1.4p2 +REG epsg:7139 2 0x1.4p2 -0x1.4p2 +REG epsg:7139 3 -0x1.4p2 0x1.4p2 +REG epsg:7139 4 0x1.4p2 0x1.4p2 +REG epsg:7142 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG epsg:7142 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG epsg:7142 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG epsg:7142 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG epsg:7142 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG epsg:7257 0 -0x1.53ccccccccccdp6 0x1.4466666666666p5 +REG epsg:7257 1 -0x1.6e1f11f97303ep6 0x1.1c66666666666p5 +REG epsg:7257 2 -0x1.397a87a02695cp6 0x1.1c66666666666p5 +REG epsg:7257 3 -0x1.6e1f11f97303ep6 0x1.6c66666666666p5 +REG epsg:7257 4 -0x1.397a87a02695cp6 0x1.6c66666666666p5 +REG epsg:7258 0 -0x1.53ccccccccccdp6 0x1.4466666666666p5 +REG epsg:7258 1 -0x1.6e1f11f97303ep6 0x1.1c66666666666p5 +REG epsg:7258 2 -0x1.397a87a02695cp6 0x1.1c66666666666p5 +REG epsg:7258 3 -0x1.6e1f11f97303ep6 0x1.6c66666666666p5 +REG epsg:7258 4 -0x1.397a87a02695cp6 0x1.6c66666666666p5 +REG epsg:7259 0 -0x1.5433333333333p6 0x1.4733333333333p5 +REG epsg:7259 1 -0x1.6ea8ffec1b16cp6 0x1.1f33333333333p5 +REG epsg:7259 2 -0x1.39bd667a4b4fap6 0x1.1f33333333333p5 +REG epsg:7259 3 -0x1.6ea8ffec1b16cp6 0x1.6f33333333333p5 +REG epsg:7259 4 -0x1.39bd667a4b4fap6 0x1.6f33333333333p5 +REG epsg:7260 0 -0x1.5433333333333p6 0x1.4733333333333p5 +REG epsg:7260 1 -0x1.6ea8ffec1b16cp6 0x1.1f33333333333p5 +REG epsg:7260 2 -0x1.39bd667a4b4fap6 0x1.1f33333333333p5 +REG epsg:7260 3 -0x1.6ea8ffec1b16cp6 0x1.6f33333333333p5 +REG epsg:7260 4 -0x1.39bd667a4b4fap6 0x1.6f33333333333p5 +REG epsg:7261 0 -0x1.5766666666666p6 0x1.38p5 +REG epsg:7261 1 -0x1.71229be5f0ed1p6 0x1.1p5 +REG epsg:7261 2 -0x1.3daa30e6dbdfbp6 0x1.1p5 +REG epsg:7261 3 -0x1.71229be5f0ed1p6 0x1.6p5 +REG epsg:7261 4 -0x1.3daa30e6dbdfbp6 0x1.6p5 +REG epsg:7262 0 -0x1.5766666666666p6 0x1.38p5 +REG epsg:7262 1 -0x1.71229be5f0ed1p6 0x1.1p5 +REG epsg:7262 2 -0x1.3daa30e6dbdfbp6 0x1.1p5 +REG epsg:7262 3 -0x1.71229be5f0ed1p6 0x1.6p5 +REG epsg:7262 4 -0x1.3daa30e6dbdfbp6 0x1.6p5 +REG epsg:7263 0 -0x1.5d33333333333p6 0x1.439999999999ap5 +REG epsg:7263 1 -0x1.777b6eeb18c4p6 0x1.1b9999999999ap5 +REG epsg:7263 2 -0x1.42eaf77b4da26p6 0x1.1b9999999999ap5 +REG epsg:7263 3 -0x1.777b6eeb18c4p6 0x1.6b9999999999ap5 +REG epsg:7263 4 -0x1.42eaf77b4da26p6 0x1.6b9999999999ap5 +REG epsg:7264 0 -0x1.5d33333333333p6 0x1.439999999999ap5 +REG epsg:7264 1 -0x1.777b6eeb18c4p6 0x1.1b9999999999ap5 +REG epsg:7264 2 -0x1.42eaf77b4da26p6 0x1.1b9999999999ap5 +REG epsg:7264 3 -0x1.777b6eeb18c4p6 0x1.6b9999999999ap5 +REG epsg:7264 4 -0x1.42eaf77b4da26p6 0x1.6b9999999999ap5 +REG epsg:7265 0 -0x1.559999999999ap6 0x1.4066666666666p5 +REG epsg:7265 1 -0x1.6fba2f8395561p6 0x1.1866666666666p5 +REG epsg:7265 2 -0x1.3b7903af9ddd3p6 0x1.1866666666666p5 +REG epsg:7265 3 -0x1.6fba2f8395561p6 0x1.6866666666666p5 +REG epsg:7265 4 -0x1.3b7903af9ddd3p6 0x1.6866666666666p5 +REG epsg:7266 0 -0x1.559999999999ap6 0x1.4066666666666p5 +REG epsg:7266 1 -0x1.6fba2f8395561p6 0x1.1866666666666p5 +REG epsg:7266 2 -0x1.3b7903af9ddd3p6 0x1.1866666666666p5 +REG epsg:7266 3 -0x1.6fba2f8395561p6 0x1.6866666666666p5 +REG epsg:7266 4 -0x1.3b7903af9ddd3p6 0x1.6866666666666p5 +REG epsg:7267 0 -0x1.5ap6 0x1.3cccccccccccdp5 +REG epsg:7267 1 -0x1.73f4ebe65272dp6 0x1.14ccccccccccdp5 +REG epsg:7267 2 -0x1.400b1419ad8d3p6 0x1.14ccccccccccdp5 +REG epsg:7267 3 -0x1.73f4ebe65272dp6 0x1.64ccccccccccdp5 +REG epsg:7267 4 -0x1.400b1419ad8d3p6 0x1.64ccccccccccdp5 +REG epsg:7268 0 -0x1.5ap6 0x1.3cccccccccccdp5 +REG epsg:7268 1 -0x1.73f4ebe65272dp6 0x1.14ccccccccccdp5 +REG epsg:7268 2 -0x1.400b1419ad8d3p6 0x1.14ccccccccccdp5 +REG epsg:7268 3 -0x1.73f4ebe65272dp6 0x1.64ccccccccccdp5 +REG epsg:7268 4 -0x1.400b1419ad8d3p6 0x1.64ccccccccccdp5 +REG epsg:7269 0 -0x1.5933333333333p6 0x1.38p5 +REG epsg:7269 1 -0x1.72ef68b2bdb9ep6 0x1.1p5 +REG epsg:7269 2 -0x1.3f76fdb3a8ac8p6 0x1.1p5 +REG epsg:7269 3 -0x1.72ef68b2bdb9ep6 0x1.6p5 +REG epsg:7269 4 -0x1.3f76fdb3a8ac8p6 0x1.6p5 +REG epsg:7270 0 -0x1.5933333333333p6 0x1.38p5 +REG epsg:7270 1 -0x1.72ef68b2bdb9ep6 0x1.1p5 +REG epsg:7270 2 -0x1.3f76fdb3a8ac8p6 0x1.1p5 +REG epsg:7270 3 -0x1.72ef68b2bdb9ep6 0x1.6p5 +REG epsg:7270 4 -0x1.3f76fdb3a8ac8p6 0x1.6p5 +REG epsg:7271 0 -0x1.5a9999999999ap6 0x1.4333333333333p5 +REG epsg:7271 1 -0x1.74dcd56c3cfecp6 0x1.1b33333333333p5 +REG epsg:7271 2 -0x1.40565dc6f6348p6 0x1.1b33333333333p5 +REG epsg:7271 3 -0x1.74dcd56c3cfecp6 0x1.6b33333333333p5 +REG epsg:7271 4 -0x1.40565dc6f6348p6 0x1.6b33333333333p5 +REG epsg:7272 0 -0x1.5a9999999999ap6 0x1.4333333333333p5 +REG epsg:7272 1 -0x1.74dcd56c3cfecp6 0x1.1b33333333333p5 +REG epsg:7272 2 -0x1.40565dc6f6348p6 0x1.1b33333333333p5 +REG epsg:7272 3 -0x1.74dcd56c3cfecp6 0x1.6b33333333333p5 +REG epsg:7272 4 -0x1.40565dc6f6348p6 0x1.6b33333333333p5 +REG epsg:7273 0 -0x1.599999999999ap6 0x1.4466666666666p5 +REG epsg:7273 1 -0x1.73ebdec63fd0bp6 0x1.1c66666666666p5 +REG epsg:7273 2 -0x1.3f47546cf3629p6 0x1.1c66666666666p5 +REG epsg:7273 3 -0x1.73ebdec63fd0bp6 0x1.6c66666666666p5 +REG epsg:7273 4 -0x1.3f47546cf3629p6 0x1.6c66666666666p5 +REG epsg:7274 0 -0x1.599999999999ap6 0x1.4466666666666p5 +REG epsg:7274 1 -0x1.73ebdec63fd0bp6 0x1.1c66666666666p5 +REG epsg:7274 2 -0x1.3f47546cf3629p6 0x1.1c66666666666p5 +REG epsg:7274 3 -0x1.73ebdec63fd0bp6 0x1.6c66666666666p5 +REG epsg:7274 4 -0x1.3f47546cf3629p6 0x1.6c66666666666p5 +REG epsg:7275 0 -0x1.5666666666666p6 0x1.3133333333333p5 +REG epsg:7275 1 -0x1.6fd51cd1c3721p6 0x1.0933333333333p5 +REG epsg:7275 2 -0x1.3cf7affb095abp6 0x1.0933333333333p5 +REG epsg:7275 3 -0x1.6fd51cd1c3721p6 0x1.5933333333333p5 +REG epsg:7275 4 -0x1.3cf7affb095abp6 0x1.5933333333333p5 +REG epsg:7276 0 -0x1.5666666666666p6 0x1.3133333333333p5 +REG epsg:7276 1 -0x1.6fd51cd1c3721p6 0x1.0933333333333p5 +REG epsg:7276 2 -0x1.3cf7affb095abp6 0x1.0933333333333p5 +REG epsg:7276 3 -0x1.6fd51cd1c3721p6 0x1.5933333333333p5 +REG epsg:7276 4 -0x1.3cf7affb095abp6 0x1.5933333333333p5 +REG epsg:7277 0 -0x1.5c9999999999ap6 0x1.3933333333333p5 +REG epsg:7277 1 -0x1.7663d4105c9adp6 0x1.1133333333333p5 +REG epsg:7277 2 -0x1.42cf5f22d6987p6 0x1.1133333333333p5 +REG epsg:7277 3 -0x1.7663d4105c9adp6 0x1.6133333333333p5 +REG epsg:7277 4 -0x1.42cf5f22d6987p6 0x1.6133333333333p5 +REG epsg:7278 0 -0x1.5c9999999999ap6 0x1.3933333333333p5 +REG epsg:7278 1 -0x1.7663d4105c9adp6 0x1.1133333333333p5 +REG epsg:7278 2 -0x1.42cf5f22d6987p6 0x1.1133333333333p5 +REG epsg:7278 3 -0x1.7663d4105c9adp6 0x1.6133333333333p5 +REG epsg:7278 4 -0x1.42cf5f22d6987p6 0x1.6133333333333p5 +REG epsg:7279 0 -0x1.5a66666666666p6 0x1.4133333333333p5 +REG epsg:7279 1 -0x1.7490d2b4db097p6 0x1.1933333333333p5 +REG epsg:7279 2 -0x1.403bfa17f1c35p6 0x1.1933333333333p5 +REG epsg:7279 3 -0x1.7490d2b4db097p6 0x1.6933333333333p5 +REG epsg:7279 4 -0x1.403bfa17f1c35p6 0x1.6933333333333p5 +REG epsg:7280 0 -0x1.5a66666666666p6 0x1.4133333333333p5 +REG epsg:7280 1 -0x1.7490d2b4db097p6 0x1.1933333333333p5 +REG epsg:7280 2 -0x1.403bfa17f1c35p6 0x1.1933333333333p5 +REG epsg:7280 3 -0x1.7490d2b4db097p6 0x1.6933333333333p5 +REG epsg:7280 4 -0x1.403bfa17f1c35p6 0x1.6933333333333p5 +REG epsg:7281 0 -0x1.5ap6 0x1.30ccccccccccdp5 +REG epsg:7281 1 -0x1.736a414e3bb45p6 0x1.08ccccccccccdp5 +REG epsg:7281 2 -0x1.4095beb1c44bbp6 0x1.08ccccccccccdp5 +REG epsg:7281 3 -0x1.736a414e3bb45p6 0x1.58ccccccccccdp5 +REG epsg:7281 4 -0x1.4095beb1c44bbp6 0x1.58ccccccccccdp5 +REG epsg:7282 0 -0x1.5ap6 0x1.30ccccccccccdp5 +REG epsg:7282 1 -0x1.736a414e3bb45p6 0x1.08ccccccccccdp5 +REG epsg:7282 2 -0x1.4095beb1c44bbp6 0x1.08ccccccccccdp5 +REG epsg:7282 3 -0x1.736a414e3bb45p6 0x1.58ccccccccccdp5 +REG epsg:7282 4 -0x1.4095beb1c44bbp6 0x1.58ccccccccccdp5 +REG epsg:7283 0 -0x1.5c66666666666p6 0x1.339999999999ap5 +REG epsg:7283 1 -0x1.75f017516863dp6 0x1.0b9999999999ap5 +REG epsg:7283 2 -0x1.42dcb57b6468fp6 0x1.0b9999999999ap5 +REG epsg:7283 3 -0x1.75f017516863dp6 0x1.5b9999999999ap5 +REG epsg:7283 4 -0x1.42dcb57b6468fp6 0x1.5b9999999999ap5 +REG epsg:7284 0 -0x1.5c66666666666p6 0x1.339999999999ap5 +REG epsg:7284 1 -0x1.75f017516863dp6 0x1.0b9999999999ap5 +REG epsg:7284 2 -0x1.42dcb57b6468fp6 0x1.0b9999999999ap5 +REG epsg:7284 3 -0x1.75f017516863dp6 0x1.5b9999999999ap5 +REG epsg:7284 4 -0x1.42dcb57b6468fp6 0x1.5b9999999999ap5 +REG epsg:7285 0 -0x1.539999999999ap6 0x1.3533333333333p5 +REG epsg:7285 1 -0x1.6d358061b0b12p6 0x1.0d33333333333p5 +REG epsg:7285 2 -0x1.39fdb2d182822p6 0x1.0d33333333333p5 +REG epsg:7285 3 -0x1.6d358061b0b12p6 0x1.5d33333333333p5 +REG epsg:7285 4 -0x1.39fdb2d182822p6 0x1.5d33333333333p5 +REG epsg:7286 0 -0x1.539999999999ap6 0x1.3533333333333p5 +REG epsg:7286 1 -0x1.6d358061b0b12p6 0x1.0d33333333333p5 +REG epsg:7286 2 -0x1.39fdb2d182822p6 0x1.0d33333333333p5 +REG epsg:7286 3 -0x1.6d358061b0b12p6 0x1.5d33333333333p5 +REG epsg:7286 4 -0x1.39fdb2d182822p6 0x1.5d33333333333p5 +REG epsg:7287 0 -0x1.569999999999ap6 0x1.38ccccccccccdp5 +REG epsg:7287 1 -0x1.705f24c27135fp6 0x1.10ccccccccccdp5 +REG epsg:7287 2 -0x1.3cd40e70c1fd5p6 0x1.10ccccccccccdp5 +REG epsg:7287 3 -0x1.705f24c27135fp6 0x1.60ccccccccccdp5 +REG epsg:7287 4 -0x1.3cd40e70c1fd5p6 0x1.60ccccccccccdp5 +REG epsg:7288 0 -0x1.569999999999ap6 0x1.38ccccccccccdp5 +REG epsg:7288 1 -0x1.705f24c27135fp6 0x1.10ccccccccccdp5 +REG epsg:7288 2 -0x1.3cd40e70c1fd5p6 0x1.10ccccccccccdp5 +REG epsg:7288 3 -0x1.705f24c27135fp6 0x1.60ccccccccccdp5 +REG epsg:7288 4 -0x1.3cd40e70c1fd5p6 0x1.60ccccccccccdp5 +REG epsg:7289 0 -0x1.53ccccccccccdp6 0x1.4ap5 +REG epsg:7289 1 -0x1.6e66c2e530bdcp6 0x1.22p5 +REG epsg:7289 2 -0x1.3932d6b468dbep6 0x1.22p5 +REG epsg:7289 3 -0x1.6e66c2e530bdcp6 0x1.72p5 +REG epsg:7289 4 -0x1.3932d6b468dbep6 0x1.72p5 +REG epsg:7290 0 -0x1.53ccccccccccdp6 0x1.4ap5 +REG epsg:7290 1 -0x1.6e66c2e530bdcp6 0x1.22p5 +REG epsg:7290 2 -0x1.3932d6b468dbep6 0x1.22p5 +REG epsg:7290 3 -0x1.6e66c2e530bdcp6 0x1.72p5 +REG epsg:7290 4 -0x1.3932d6b468dbep6 0x1.72p5 +REG epsg:7291 0 -0x1.5bccccccccccdp6 0x1.319999999999ap5 +REG epsg:7291 1 -0x1.753ffb2b3a3fbp6 0x1.099999999999ap5 +REG epsg:7291 2 -0x1.42599e6e5f59fp6 0x1.099999999999ap5 +REG epsg:7291 3 -0x1.753ffb2b3a3fbp6 0x1.599999999999ap5 +REG epsg:7291 4 -0x1.42599e6e5f59fp6 0x1.599999999999ap5 +REG epsg:7292 0 -0x1.5bccccccccccdp6 0x1.319999999999ap5 +REG epsg:7292 1 -0x1.753ffb2b3a3fbp6 0x1.099999999999ap5 +REG epsg:7292 2 -0x1.42599e6e5f59fp6 0x1.099999999999ap5 +REG epsg:7292 3 -0x1.753ffb2b3a3fbp6 0x1.599999999999ap5 +REG epsg:7292 4 -0x1.42599e6e5f59fp6 0x1.599999999999ap5 +REG epsg:7293 0 -0x1.5766666666666p6 0x1.4533333333333p5 +REG epsg:7293 1 -0x1.71c2c1fa74b52p6 0x1.1d33333333333p5 +REG epsg:7293 2 -0x1.3d0a0ad25817ap6 0x1.1d33333333333p5 +REG epsg:7293 3 -0x1.71c2c1fa74b52p6 0x1.6d33333333333p5 +REG epsg:7293 4 -0x1.3d0a0ad25817ap6 0x1.6d33333333333p5 +REG epsg:7294 0 -0x1.5766666666666p6 0x1.4533333333333p5 +REG epsg:7294 1 -0x1.71c2c1fa74b52p6 0x1.1d33333333333p5 +REG epsg:7294 2 -0x1.3d0a0ad25817ap6 0x1.1d33333333333p5 +REG epsg:7294 3 -0x1.71c2c1fa74b52p6 0x1.6d33333333333p5 +REG epsg:7294 4 -0x1.3d0a0ad25817ap6 0x1.6d33333333333p5 +REG epsg:7295 0 -0x1.5433333333333p6 0x1.3ap5 +REG epsg:7295 1 -0x1.6e06d542d3281p6 0x1.12p5 +REG epsg:7295 2 -0x1.3a5f9123933e5p6 0x1.12p5 +REG epsg:7295 3 -0x1.6e06d542d3281p6 0x1.62p5 +REG epsg:7295 4 -0x1.3a5f9123933e5p6 0x1.62p5 +REG epsg:7296 0 -0x1.5433333333333p6 0x1.3ap5 +REG epsg:7296 1 -0x1.6e06d542d3281p6 0x1.12p5 +REG epsg:7296 2 -0x1.3a5f9123933e5p6 0x1.12p5 +REG epsg:7296 3 -0x1.6e06d542d3281p6 0x1.62p5 +REG epsg:7296 4 -0x1.3a5f9123933e5p6 0x1.62p5 +REG epsg:7297 0 -0x1.5d33333333333p6 0x1.3f9999999999ap5 +REG epsg:7297 1 -0x1.7749ff4ef6b6cp6 0x1.179999999999ap5 +REG epsg:7297 2 -0x1.431c67176fafap6 0x1.179999999999ap5 +REG epsg:7297 3 -0x1.7749ff4ef6b6cp6 0x1.679999999999ap5 +REG epsg:7297 4 -0x1.431c67176fafap6 0x1.679999999999ap5 +REG epsg:7298 0 -0x1.5d33333333333p6 0x1.3f9999999999ap5 +REG epsg:7298 1 -0x1.7749ff4ef6b6cp6 0x1.179999999999ap5 +REG epsg:7298 2 -0x1.431c67176fafap6 0x1.179999999999ap5 +REG epsg:7298 3 -0x1.7749ff4ef6b6cp6 0x1.679999999999ap5 +REG epsg:7298 4 -0x1.431c67176fafap6 0x1.679999999999ap5 +REG epsg:7299 0 -0x1.5933333333333p6 0x1.4733333333333p5 +REG epsg:7299 1 -0x1.73a8ffec1b16cp6 0x1.1f33333333333p5 +REG epsg:7299 2 -0x1.3ebd667a4b4fap6 0x1.1f33333333333p5 +REG epsg:7299 3 -0x1.73a8ffec1b16cp6 0x1.6f33333333333p5 +REG epsg:7299 4 -0x1.3ebd667a4b4fap6 0x1.6f33333333333p5 +REG epsg:7300 0 -0x1.5933333333333p6 0x1.4733333333333p5 +REG epsg:7300 1 -0x1.73a8ffec1b16cp6 0x1.1f33333333333p5 +REG epsg:7300 2 -0x1.3ebd667a4b4fap6 0x1.1f33333333333p5 +REG epsg:7300 3 -0x1.73a8ffec1b16cp6 0x1.6f33333333333p5 +REG epsg:7300 4 -0x1.3ebd667a4b4fap6 0x1.6f33333333333p5 +REG epsg:7301 0 -0x1.5e9999999999ap6 0x1.3133333333333p5 +REG epsg:7301 1 -0x1.78085004f6a55p6 0x1.0933333333333p5 +REG epsg:7301 2 -0x1.452ae32e3c8dfp6 0x1.0933333333333p5 +REG epsg:7301 3 -0x1.78085004f6a55p6 0x1.5933333333333p5 +REG epsg:7301 4 -0x1.452ae32e3c8dfp6 0x1.5933333333333p5 +REG epsg:7302 0 -0x1.5e9999999999ap6 0x1.3133333333333p5 +REG epsg:7302 1 -0x1.78085004f6a55p6 0x1.0933333333333p5 +REG epsg:7302 2 -0x1.452ae32e3c8dfp6 0x1.0933333333333p5 +REG epsg:7302 3 -0x1.78085004f6a55p6 0x1.5933333333333p5 +REG epsg:7302 4 -0x1.452ae32e3c8dfp6 0x1.5933333333333p5 +REG epsg:7303 0 -0x1.56ccccccccccdp6 0x1.42ccccccccccdp5 +REG epsg:7303 1 -0x1.710b0befcf50dp6 0x1.1accccccccccdp5 +REG epsg:7303 2 -0x1.3c8e8da9ca48dp6 0x1.1accccccccccdp5 +REG epsg:7303 3 -0x1.710b0befcf50dp6 0x1.6accccccccccdp5 +REG epsg:7303 4 -0x1.3c8e8da9ca48dp6 0x1.6accccccccccdp5 +REG epsg:7304 0 -0x1.56ccccccccccdp6 0x1.42ccccccccccdp5 +REG epsg:7304 1 -0x1.710b0befcf50dp6 0x1.1accccccccccdp5 +REG epsg:7304 2 -0x1.3c8e8da9ca48dp6 0x1.1accccccccccdp5 +REG epsg:7304 3 -0x1.710b0befcf50dp6 0x1.6accccccccccdp5 +REG epsg:7304 4 -0x1.3c8e8da9ca48dp6 0x1.6accccccccccdp5 +REG epsg:7305 0 -0x1.58p6 0x1.3f33333333333p5 +REG epsg:7305 1 -0x1.7211ebe75c1f6p6 0x1.1733333333333p5 +REG epsg:7305 2 -0x1.3dee1418a3e0ap6 0x1.1733333333333p5 +REG epsg:7305 3 -0x1.7211ebe75c1f6p6 0x1.6733333333333p5 +REG epsg:7305 4 -0x1.3dee1418a3e0ap6 0x1.6733333333333p5 +REG epsg:7306 0 -0x1.58p6 0x1.3f33333333333p5 +REG epsg:7306 1 -0x1.7211ebe75c1f6p6 0x1.1733333333333p5 +REG epsg:7306 2 -0x1.3dee1418a3e0ap6 0x1.1733333333333p5 +REG epsg:7306 3 -0x1.7211ebe75c1f6p6 0x1.6733333333333p5 +REG epsg:7306 4 -0x1.3dee1418a3e0ap6 0x1.6733333333333p5 +REG epsg:7307 0 -0x1.5733333333333p6 0x1.3d33333333333p5 +REG epsg:7307 1 -0x1.712cecb64db41p6 0x1.1533333333333p5 +REG epsg:7307 2 -0x1.3d3979b018b25p6 0x1.1533333333333p5 +REG epsg:7307 3 -0x1.712cecb64db41p6 0x1.6533333333333p5 +REG epsg:7307 4 -0x1.3d3979b018b25p6 0x1.6533333333333p5 +REG epsg:7308 0 -0x1.5733333333333p6 0x1.3d33333333333p5 +REG epsg:7308 1 -0x1.712cecb64db41p6 0x1.1533333333333p5 +REG epsg:7308 2 -0x1.3d3979b018b25p6 0x1.1533333333333p5 +REG epsg:7308 3 -0x1.712cecb64db41p6 0x1.6533333333333p5 +REG epsg:7308 4 -0x1.3d3979b018b25p6 0x1.6533333333333p5 +REG epsg:7309 0 -0x1.589999999999ap6 0x1.2f9999999999ap5 +REG epsg:7309 1 -0x1.71f68c80bd53ap6 0x1.079999999999ap5 +REG epsg:7309 2 -0x1.3f3ca6b275dfap6 0x1.079999999999ap5 +REG epsg:7309 3 -0x1.71f68c80bd53ap6 0x1.579999999999ap5 +REG epsg:7309 4 -0x1.3f3ca6b275dfap6 0x1.579999999999ap5 +REG epsg:7310 0 -0x1.589999999999ap6 0x1.2f9999999999ap5 +REG epsg:7310 1 -0x1.71f68c80bd53ap6 0x1.079999999999ap5 +REG epsg:7310 2 -0x1.3f3ca6b275dfap6 0x1.079999999999ap5 +REG epsg:7310 3 -0x1.71f68c80bd53ap6 0x1.579999999999ap5 +REG epsg:7310 4 -0x1.3f3ca6b275dfap6 0x1.579999999999ap5 +REG epsg:7311 0 -0x1.55ccccccccccdp6 0x1.3ep5 +REG epsg:7311 1 -0x1.6fd02ac6ed948p6 0x1.16p5 +REG epsg:7311 2 -0x1.3bc96ed2ac052p6 0x1.16p5 +REG epsg:7311 3 -0x1.6fd02ac6ed948p6 0x1.66p5 +REG epsg:7311 4 -0x1.3bc96ed2ac052p6 0x1.66p5 +REG epsg:7312 0 -0x1.55ccccccccccdp6 0x1.3ep5 +REG epsg:7312 1 -0x1.6fd02ac6ed948p6 0x1.16p5 +REG epsg:7312 2 -0x1.3bc96ed2ac052p6 0x1.16p5 +REG epsg:7312 3 -0x1.6fd02ac6ed948p6 0x1.66p5 +REG epsg:7312 4 -0x1.3bc96ed2ac052p6 0x1.66p5 +REG epsg:7313 0 -0x1.589999999999ap6 0x1.42ccccccccccdp5 +REG epsg:7313 1 -0x1.72d7d8bc9c1dap6 0x1.1accccccccccdp5 +REG epsg:7313 2 -0x1.3e5b5a769715ap6 0x1.1accccccccccdp5 +REG epsg:7313 3 -0x1.72d7d8bc9c1dap6 0x1.6accccccccccdp5 +REG epsg:7313 4 -0x1.3e5b5a769715ap6 0x1.6accccccccccdp5 +REG epsg:7314 0 -0x1.589999999999ap6 0x1.42ccccccccccdp5 +REG epsg:7314 1 -0x1.72d7d8bc9c1dap6 0x1.1accccccccccdp5 +REG epsg:7314 2 -0x1.3e5b5a769715ap6 0x1.1accccccccccdp5 +REG epsg:7314 3 -0x1.72d7d8bc9c1dap6 0x1.6accccccccccdp5 +REG epsg:7314 4 -0x1.3e5b5a769715ap6 0x1.6accccccccccdp5 +REG epsg:7315 0 -0x1.56p6 0x1.4533333333333p5 +REG epsg:7315 1 -0x1.705c5b940e4ecp6 0x1.1d33333333333p5 +REG epsg:7315 2 -0x1.3ba3a46bf1b14p6 0x1.1d33333333333p5 +REG epsg:7315 3 -0x1.705c5b940e4ecp6 0x1.6d33333333333p5 +REG epsg:7315 4 -0x1.3ba3a46bf1b14p6 0x1.6d33333333333p5 +REG epsg:7316 0 -0x1.56p6 0x1.4533333333333p5 +REG epsg:7316 1 -0x1.705c5b940e4ecp6 0x1.1d33333333333p5 +REG epsg:7316 2 -0x1.3ba3a46bf1b14p6 0x1.1d33333333333p5 +REG epsg:7316 3 -0x1.705c5b940e4ecp6 0x1.6d33333333333p5 +REG epsg:7316 4 -0x1.3ba3a46bf1b14p6 0x1.6d33333333333p5 +REG epsg:7317 0 -0x1.57ccccccccccdp6 0x1.359999999999ap5 +REG epsg:7317 1 -0x1.716d484f6aa96p6 0x1.0d9999999999ap5 +REG epsg:7317 2 -0x1.3e2c514a2ef04p6 0x1.0d9999999999ap5 +REG epsg:7317 3 -0x1.716d484f6aa96p6 0x1.5d9999999999ap5 +REG epsg:7317 4 -0x1.3e2c514a2ef04p6 0x1.5d9999999999ap5 +REG epsg:7318 0 -0x1.57ccccccccccdp6 0x1.359999999999ap5 +REG epsg:7318 1 -0x1.716d484f6aa96p6 0x1.0d9999999999ap5 +REG epsg:7318 2 -0x1.3e2c514a2ef04p6 0x1.0d9999999999ap5 +REG epsg:7318 3 -0x1.716d484f6aa96p6 0x1.5d9999999999ap5 +REG epsg:7318 4 -0x1.3e2c514a2ef04p6 0x1.5d9999999999ap5 +REG epsg:7319 0 -0x1.5c66666666666p6 0x1.459999999999ap5 +REG epsg:7319 1 -0x1.76c7d20f119cep6 0x1.1d9999999999ap5 +REG epsg:7319 2 -0x1.4204fabdbb2fep6 0x1.1d9999999999ap5 +REG epsg:7319 3 -0x1.76c7d20f119cep6 0x1.6d9999999999ap5 +REG epsg:7319 4 -0x1.4204fabdbb2fep6 0x1.6d9999999999ap5 +REG epsg:7320 0 -0x1.5c66666666666p6 0x1.459999999999ap5 +REG epsg:7320 1 -0x1.76c7d20f119cep6 0x1.1d9999999999ap5 +REG epsg:7320 2 -0x1.4204fabdbb2fep6 0x1.1d9999999999ap5 +REG epsg:7320 3 -0x1.76c7d20f119cep6 0x1.6d9999999999ap5 +REG epsg:7320 4 -0x1.4204fabdbb2fep6 0x1.6d9999999999ap5 +REG epsg:7321 0 -0x1.54p6 0x1.4266666666666p5 +REG epsg:7321 1 -0x1.6e3945a6afeb2p6 0x1.1a66666666666p5 +REG epsg:7321 2 -0x1.39c6ba595014ep6 0x1.1a66666666666p5 +REG epsg:7321 3 -0x1.6e3945a6afeb2p6 0x1.6a66666666666p5 +REG epsg:7321 4 -0x1.39c6ba595014ep6 0x1.6a66666666666p5 +REG epsg:7322 0 -0x1.54p6 0x1.4266666666666p5 +REG epsg:7322 1 -0x1.6e3945a6afeb2p6 0x1.1a66666666666p5 +REG epsg:7322 2 -0x1.39c6ba595014ep6 0x1.1a66666666666p5 +REG epsg:7322 3 -0x1.6e3945a6afeb2p6 0x1.6a66666666666p5 +REG epsg:7322 4 -0x1.39c6ba595014ep6 0x1.6a66666666666p5 +REG epsg:7323 0 -0x1.5566666666666p6 0x1.3466666666666p5 +REG epsg:7323 1 -0x1.6ef92c748f58p6 0x1.0c66666666666p5 +REG epsg:7323 2 -0x1.3bd3a0583d74cp6 0x1.0c66666666666p5 +REG epsg:7323 3 -0x1.6ef92c748f58p6 0x1.5c66666666666p5 +REG epsg:7323 4 -0x1.3bd3a0583d74cp6 0x1.5c66666666666p5 +REG epsg:7324 0 -0x1.5566666666666p6 0x1.3466666666666p5 +REG epsg:7324 1 -0x1.6ef92c748f58p6 0x1.0c66666666666p5 +REG epsg:7324 2 -0x1.3bd3a0583d74cp6 0x1.0c66666666666p5 +REG epsg:7324 3 -0x1.6ef92c748f58p6 0x1.5c66666666666p5 +REG epsg:7324 4 -0x1.3bd3a0583d74cp6 0x1.5c66666666666p5 +REG epsg:7325 0 -0x1.5733333333333p6 0x1.3666666666666p5 +REG epsg:7325 1 -0x1.70dce0f01a383p6 0x1.0e66666666666p5 +REG epsg:7325 2 -0x1.3d8985764c2e3p6 0x1.0e66666666666p5 +REG epsg:7325 3 -0x1.70dce0f01a383p6 0x1.5e66666666666p5 +REG epsg:7325 4 -0x1.3d8985764c2e3p6 0x1.5e66666666666p5 +REG epsg:7326 0 -0x1.5733333333333p6 0x1.3666666666666p5 +REG epsg:7326 1 -0x1.70dce0f01a383p6 0x1.0e66666666666p5 +REG epsg:7326 2 -0x1.3d8985764c2e3p6 0x1.0e66666666666p5 +REG epsg:7326 3 -0x1.70dce0f01a383p6 0x1.5e66666666666p5 +REG epsg:7326 4 -0x1.3d8985764c2e3p6 0x1.5e66666666666p5 +REG epsg:7327 0 -0x1.589999999999ap6 0x1.3a66666666666p5 +REG epsg:7327 1 -0x1.7271f3f86379fp6 0x1.1266666666666p5 +REG epsg:7327 2 -0x1.3ec13f3acfb95p6 0x1.1266666666666p5 +REG epsg:7327 3 -0x1.7271f3f86379fp6 0x1.6266666666666p5 +REG epsg:7327 4 -0x1.3ec13f3acfb95p6 0x1.6266666666666p5 +REG epsg:7328 0 -0x1.589999999999ap6 0x1.3a66666666666p5 +REG epsg:7328 1 -0x1.7271f3f86379fp6 0x1.1266666666666p5 +REG epsg:7328 2 -0x1.3ec13f3acfb95p6 0x1.1266666666666p5 +REG epsg:7328 3 -0x1.7271f3f86379fp6 0x1.6266666666666p5 +REG epsg:7328 4 -0x1.3ec13f3acfb95p6 0x1.6266666666666p5 +REG epsg:7329 0 -0x1.5dccccccccccdp6 0x1.3333333333333p5 +REG epsg:7329 1 -0x1.7751f779c8c42p6 0x1.0b33333333333p5 +REG epsg:7329 2 -0x1.4447a21fd0d58p6 0x1.0b33333333333p5 +REG epsg:7329 3 -0x1.7751f779c8c42p6 0x1.5b33333333333p5 +REG epsg:7329 4 -0x1.4447a21fd0d58p6 0x1.5b33333333333p5 +REG epsg:7330 0 -0x1.5dccccccccccdp6 0x1.3333333333333p5 +REG epsg:7330 1 -0x1.7751f779c8c42p6 0x1.0b33333333333p5 +REG epsg:7330 2 -0x1.4447a21fd0d58p6 0x1.0b33333333333p5 +REG epsg:7330 3 -0x1.7751f779c8c42p6 0x1.5b33333333333p5 +REG epsg:7330 4 -0x1.4447a21fd0d58p6 0x1.5b33333333333p5 +REG epsg:7331 0 -0x1.55ccccccccccdp6 0x1.4ap5 +REG epsg:7331 1 -0x1.7066c2e530bdcp6 0x1.22p5 +REG epsg:7331 2 -0x1.3b32d6b468dbep6 0x1.22p5 +REG epsg:7331 3 -0x1.7066c2e530bdcp6 0x1.72p5 +REG epsg:7331 4 -0x1.3b32d6b468dbep6 0x1.72p5 +REG epsg:7332 0 -0x1.55ccccccccccdp6 0x1.4ap5 +REG epsg:7332 1 -0x1.7066c2e530bdcp6 0x1.22p5 +REG epsg:7332 2 -0x1.3b32d6b468dbep6 0x1.22p5 +REG epsg:7332 3 -0x1.7066c2e530bdcp6 0x1.72p5 +REG epsg:7332 4 -0x1.3b32d6b468dbep6 0x1.72p5 +REG epsg:7333 0 -0x1.5d9999999999ap6 0x1.459999999999ap5 +REG epsg:7333 1 -0x1.77fb054244d02p6 0x1.1d9999999999ap5 +REG epsg:7333 2 -0x1.43382df0ee632p6 0x1.1d9999999999ap5 +REG epsg:7333 3 -0x1.77fb054244d02p6 0x1.6d9999999999ap5 +REG epsg:7333 4 -0x1.43382df0ee632p6 0x1.6d9999999999ap5 +REG epsg:7334 0 -0x1.5d9999999999ap6 0x1.459999999999ap5 +REG epsg:7334 1 -0x1.77fb054244d02p6 0x1.1d9999999999ap5 +REG epsg:7334 2 -0x1.43382df0ee632p6 0x1.1d9999999999ap5 +REG epsg:7334 3 -0x1.77fb054244d02p6 0x1.6d9999999999ap5 +REG epsg:7334 4 -0x1.43382df0ee632p6 0x1.6d9999999999ap5 +REG epsg:7335 0 -0x1.5bp6 0x1.4733333333333p5 +REG epsg:7335 1 -0x1.7575ccb8e7e39p6 0x1.1f33333333333p5 +REG epsg:7335 2 -0x1.408a3347181c7p6 0x1.1f33333333333p5 +REG epsg:7335 3 -0x1.7575ccb8e7e39p6 0x1.6f33333333333p5 +REG epsg:7335 4 -0x1.408a3347181c7p6 0x1.6f33333333333p5 +REG epsg:7336 0 -0x1.5bp6 0x1.4733333333333p5 +REG epsg:7336 1 -0x1.7575ccb8e7e39p6 0x1.1f33333333333p5 +REG epsg:7336 2 -0x1.408a3347181c7p6 0x1.1f33333333333p5 +REG epsg:7336 3 -0x1.7575ccb8e7e39p6 0x1.6f33333333333p5 +REG epsg:7336 4 -0x1.408a3347181c7p6 0x1.6f33333333333p5 +REG epsg:7337 0 -0x1.5ap6 0x1.379999999999ap5 +REG epsg:7337 1 -0x1.73b78f1ffd962p6 0x1.0f9999999999ap5 +REG epsg:7337 2 -0x1.404870e00269ep6 0x1.0f9999999999ap5 +REG epsg:7337 3 -0x1.73b78f1ffd962p6 0x1.5f9999999999ap5 +REG epsg:7337 4 -0x1.404870e00269ep6 0x1.5f9999999999ap5 +REG epsg:7338 0 -0x1.5ap6 0x1.379999999999ap5 +REG epsg:7338 1 -0x1.73b78f1ffd962p6 0x1.0f9999999999ap5 +REG epsg:7338 2 -0x1.404870e00269ep6 0x1.0f9999999999ap5 +REG epsg:7338 3 -0x1.73b78f1ffd962p6 0x1.5f9999999999ap5 +REG epsg:7338 4 -0x1.404870e00269ep6 0x1.5f9999999999ap5 +REG epsg:7339 0 -0x1.5bccccccccccdp6 0x1.3b9999999999ap5 +REG epsg:7339 1 -0x1.75b3623d82d6ap6 0x1.139999999999ap5 +REG epsg:7339 2 -0x1.41e6375c16c3p6 0x1.139999999999ap5 +REG epsg:7339 3 -0x1.75b3623d82d6ap6 0x1.639999999999ap5 +REG epsg:7339 4 -0x1.41e6375c16c3p6 0x1.639999999999ap5 +REG epsg:7340 0 -0x1.5bccccccccccdp6 0x1.3b9999999999ap5 +REG epsg:7340 1 -0x1.75b3623d82d6ap6 0x1.139999999999ap5 +REG epsg:7340 2 -0x1.41e6375c16c3p6 0x1.139999999999ap5 +REG epsg:7340 3 -0x1.75b3623d82d6ap6 0x1.639999999999ap5 +REG epsg:7340 4 -0x1.41e6375c16c3p6 0x1.639999999999ap5 +REG epsg:7341 0 -0x1.5b9999999999ap6 0x1.3933333333333p5 +REG epsg:7341 1 -0x1.7563d4105c9adp6 0x1.1133333333333p5 +REG epsg:7341 2 -0x1.41cf5f22d6987p6 0x1.1133333333333p5 +REG epsg:7341 3 -0x1.7563d4105c9adp6 0x1.6133333333333p5 +REG epsg:7341 4 -0x1.41cf5f22d6987p6 0x1.6133333333333p5 +REG epsg:7342 0 -0x1.5b9999999999ap6 0x1.3933333333333p5 +REG epsg:7342 1 -0x1.7563d4105c9adp6 0x1.1133333333333p5 +REG epsg:7342 2 -0x1.41cf5f22d6987p6 0x1.1133333333333p5 +REG epsg:7342 3 -0x1.7563d4105c9adp6 0x1.6133333333333p5 +REG epsg:7342 4 -0x1.41cf5f22d6987p6 0x1.6133333333333p5 +REG epsg:7343 0 -0x1.5d66666666666p6 0x1.3cccccccccccdp5 +REG epsg:7343 1 -0x1.775b524cb8d93p6 0x1.14ccccccccccdp5 +REG epsg:7343 2 -0x1.43717a8013f39p6 0x1.14ccccccccccdp5 +REG epsg:7343 3 -0x1.775b524cb8d93p6 0x1.64ccccccccccdp5 +REG epsg:7343 4 -0x1.43717a8013f39p6 0x1.64ccccccccccdp5 +REG epsg:7344 0 -0x1.5d66666666666p6 0x1.3cccccccccccdp5 +REG epsg:7344 1 -0x1.775b524cb8d93p6 0x1.14ccccccccccdp5 +REG epsg:7344 2 -0x1.43717a8013f39p6 0x1.14ccccccccccdp5 +REG epsg:7344 3 -0x1.775b524cb8d93p6 0x1.64ccccccccccdp5 +REG epsg:7344 4 -0x1.43717a8013f39p6 0x1.64ccccccccccdp5 +REG epsg:7345 0 -0x1.5accccccccccdp6 0x1.2e66666666666p5 +REG epsg:7345 1 -0x1.741c8a8d1273dp6 0x1.0666666666666p5 +REG epsg:7345 2 -0x1.417d0f0c8725dp6 0x1.0666666666666p5 +REG epsg:7345 3 -0x1.741c8a8d1273dp6 0x1.5666666666666p5 +REG epsg:7345 4 -0x1.417d0f0c8725dp6 0x1.5666666666666p5 +REG epsg:7346 0 -0x1.5accccccccccdp6 0x1.2e66666666666p5 +REG epsg:7346 1 -0x1.741c8a8d1273dp6 0x1.0666666666666p5 +REG epsg:7346 2 -0x1.417d0f0c8725dp6 0x1.0666666666666p5 +REG epsg:7346 3 -0x1.741c8a8d1273dp6 0x1.5666666666666p5 +REG epsg:7346 4 -0x1.417d0f0c8725dp6 0x1.5666666666666p5 +REG epsg:7347 0 -0x1.5d33333333333p6 0x1.2eccccccccccdp5 +REG epsg:7347 1 -0x1.768755355a7c7p6 0x1.06ccccccccccdp5 +REG epsg:7347 2 -0x1.43df11310be9fp6 0x1.06ccccccccccdp5 +REG epsg:7347 3 -0x1.768755355a7c7p6 0x1.56ccccccccccdp5 +REG epsg:7347 4 -0x1.43df11310be9fp6 0x1.56ccccccccccdp5 +REG epsg:7348 0 -0x1.5d33333333333p6 0x1.2eccccccccccdp5 +REG epsg:7348 1 -0x1.768755355a7c7p6 0x1.06ccccccccccdp5 +REG epsg:7348 2 -0x1.43df11310be9fp6 0x1.06ccccccccccdp5 +REG epsg:7348 3 -0x1.768755355a7c7p6 0x1.56ccccccccccdp5 +REG epsg:7348 4 -0x1.43df11310be9fp6 0x1.56ccccccccccdp5 +REG epsg:7349 0 -0x1.5fccccccccccdp6 0x1.2ep5 +REG epsg:7349 1 -0x1.79182913be983p6 0x1.06p5 +REG epsg:7349 2 -0x1.46817085db017p6 0x1.06p5 +REG epsg:7349 3 -0x1.79182913be983p6 0x1.56p5 +REG epsg:7349 4 -0x1.46817085db017p6 0x1.56p5 +REG epsg:7350 0 -0x1.5fccccccccccdp6 0x1.2ep5 +REG epsg:7350 1 -0x1.79182913be983p6 0x1.06p5 +REG epsg:7350 2 -0x1.46817085db017p6 0x1.06p5 +REG epsg:7350 3 -0x1.79182913be983p6 0x1.56p5 +REG epsg:7350 4 -0x1.46817085db017p6 0x1.56p5 +REG epsg:7351 0 -0x1.5433333333333p6 0x1.3d9999999999ap5 +REG epsg:7351 1 -0x1.6e31bd66d7492p6 0x1.159999999999ap5 +REG epsg:7351 2 -0x1.3a34a8ff8f1d4p6 0x1.159999999999ap5 +REG epsg:7351 3 -0x1.6e31bd66d7492p6 0x1.659999999999ap5 +REG epsg:7351 4 -0x1.3a34a8ff8f1d4p6 0x1.659999999999ap5 +REG epsg:7352 0 -0x1.5433333333333p6 0x1.3d9999999999ap5 +REG epsg:7352 1 -0x1.6e31bd66d7492p6 0x1.159999999999ap5 +REG epsg:7352 2 -0x1.3a34a8ff8f1d4p6 0x1.159999999999ap5 +REG epsg:7352 3 -0x1.6e31bd66d7492p6 0x1.659999999999ap5 +REG epsg:7352 4 -0x1.3a34a8ff8f1d4p6 0x1.659999999999ap5 +REG epsg:7353 0 -0x1.5533333333333p6 0x1.3733333333333p5 +REG epsg:7353 1 -0x1.6ee61ee99baffp6 0x1.0f33333333333p5 +REG epsg:7353 2 -0x1.3b80477ccab67p6 0x1.0f33333333333p5 +REG epsg:7353 3 -0x1.6ee61ee99baffp6 0x1.5f33333333333p5 +REG epsg:7353 4 -0x1.3b80477ccab67p6 0x1.5f33333333333p5 +REG epsg:7354 0 -0x1.5533333333333p6 0x1.3733333333333p5 +REG epsg:7354 1 -0x1.6ee61ee99baffp6 0x1.0f33333333333p5 +REG epsg:7354 2 -0x1.3b80477ccab67p6 0x1.0f33333333333p5 +REG epsg:7354 3 -0x1.6ee61ee99baffp6 0x1.5f33333333333p5 +REG epsg:7354 4 -0x1.3b80477ccab67p6 0x1.5f33333333333p5 +REG epsg:7355 0 -0x1.579999999999ap6 0x1.3a66666666666p5 +REG epsg:7355 1 -0x1.7171f3f86379fp6 0x1.1266666666666p5 +REG epsg:7355 2 -0x1.3dc13f3acfb95p6 0x1.1266666666666p5 +REG epsg:7355 3 -0x1.7171f3f86379fp6 0x1.6266666666666p5 +REG epsg:7355 4 -0x1.3dc13f3acfb95p6 0x1.6266666666666p5 +REG epsg:7356 0 -0x1.579999999999ap6 0x1.3a66666666666p5 +REG epsg:7356 1 -0x1.7171f3f86379fp6 0x1.1266666666666p5 +REG epsg:7356 2 -0x1.3dc13f3acfb95p6 0x1.1266666666666p5 +REG epsg:7356 3 -0x1.7171f3f86379fp6 0x1.6266666666666p5 +REG epsg:7356 4 -0x1.3dc13f3acfb95p6 0x1.6266666666666p5 +REG epsg:7357 0 -0x1.5c33333333333p6 0x1.2ep5 +REG epsg:7357 1 -0x1.757e8f7a24fe9p6 0x1.06p5 +REG epsg:7357 2 -0x1.42e7d6ec4167dp6 0x1.06p5 +REG epsg:7357 3 -0x1.757e8f7a24fe9p6 0x1.56p5 +REG epsg:7357 4 -0x1.42e7d6ec4167dp6 0x1.56p5 +REG epsg:7358 0 -0x1.5c33333333333p6 0x1.2ep5 +REG epsg:7358 1 -0x1.757e8f7a24fe9p6 0x1.06p5 +REG epsg:7358 2 -0x1.42e7d6ec4167dp6 0x1.06p5 +REG epsg:7358 3 -0x1.757e8f7a24fe9p6 0x1.56p5 +REG epsg:7358 4 -0x1.42e7d6ec4167dp6 0x1.56p5 +REG epsg:7359 0 -0x1.54p6 0x1.4cp5 +REG epsg:7359 1 -0x1.6eb42f680cbdp6 0x1.24p5 +REG epsg:7359 2 -0x1.394bd097f343p6 0x1.24p5 +REG epsg:7359 3 -0x1.6eb42f680cbdp6 0x1.74p5 +REG epsg:7359 4 -0x1.394bd097f343p6 0x1.74p5 +REG epsg:7360 0 -0x1.54p6 0x1.4cp5 +REG epsg:7360 1 -0x1.6eb42f680cbdp6 0x1.24p5 +REG epsg:7360 2 -0x1.394bd097f343p6 0x1.24p5 +REG epsg:7360 3 -0x1.6eb42f680cbdp6 0x1.74p5 +REG epsg:7360 4 -0x1.394bd097f343p6 0x1.74p5 +REG epsg:7361 0 -0x1.5ep6 0x1.3733333333333p5 +REG epsg:7361 1 -0x1.77b2ebb6687ccp6 0x1.0f33333333333p5 +REG epsg:7361 2 -0x1.444d144997834p6 0x1.0f33333333333p5 +REG epsg:7361 3 -0x1.77b2ebb6687ccp6 0x1.5f33333333333p5 +REG epsg:7361 4 -0x1.444d144997834p6 0x1.5f33333333333p5 +REG epsg:7362 0 -0x1.5ep6 0x1.3733333333333p5 +REG epsg:7362 1 -0x1.77b2ebb6687ccp6 0x1.0f33333333333p5 +REG epsg:7362 2 -0x1.444d144997834p6 0x1.0f33333333333p5 +REG epsg:7362 3 -0x1.77b2ebb6687ccp6 0x1.5f33333333333p5 +REG epsg:7362 4 -0x1.444d144997834p6 0x1.5f33333333333p5 +REG epsg:7363 0 -0x1.5b9999999999ap6 0x1.419999999999ap5 +REG epsg:7363 1 -0x1.75c8f5d84f732p6 0x1.199999999999ap5 +REG epsg:7363 2 -0x1.416a3d5ae3c02p6 0x1.199999999999ap5 +REG epsg:7363 3 -0x1.75c8f5d84f732p6 0x1.699999999999ap5 +REG epsg:7363 4 -0x1.416a3d5ae3c02p6 0x1.699999999999ap5 +REG epsg:7364 0 -0x1.5b9999999999ap6 0x1.419999999999ap5 +REG epsg:7364 1 -0x1.75c8f5d84f732p6 0x1.199999999999ap5 +REG epsg:7364 2 -0x1.416a3d5ae3c02p6 0x1.199999999999ap5 +REG epsg:7364 3 -0x1.75c8f5d84f732p6 0x1.699999999999ap5 +REG epsg:7364 4 -0x1.416a3d5ae3c02p6 0x1.699999999999ap5 +REG epsg:7365 0 -0x1.5e33333333333p6 0x1.2e66666666666p5 +REG epsg:7365 1 -0x1.7782f0f378da3p6 0x1.0666666666666p5 +REG epsg:7365 2 -0x1.44e37572ed8c3p6 0x1.0666666666666p5 +REG epsg:7365 3 -0x1.7782f0f378da3p6 0x1.5666666666666p5 +REG epsg:7365 4 -0x1.44e37572ed8c3p6 0x1.5666666666666p5 +REG epsg:7366 0 -0x1.5e33333333333p6 0x1.2e66666666666p5 +REG epsg:7366 1 -0x1.7782f0f378da3p6 0x1.0666666666666p5 +REG epsg:7366 2 -0x1.44e37572ed8c3p6 0x1.0666666666666p5 +REG epsg:7366 3 -0x1.7782f0f378da3p6 0x1.5666666666666p5 +REG epsg:7366 4 -0x1.44e37572ed8c3p6 0x1.5666666666666p5 +REG epsg:7367 0 -0x1.5dccccccccccdp6 0x1.3ap5 +REG epsg:7367 1 -0x1.77a06edc6cc1bp6 0x1.12p5 +REG epsg:7367 2 -0x1.43f92abd2cd7fp6 0x1.12p5 +REG epsg:7367 3 -0x1.77a06edc6cc1bp6 0x1.62p5 +REG epsg:7367 4 -0x1.43f92abd2cd7fp6 0x1.62p5 +REG epsg:7368 0 -0x1.5dccccccccccdp6 0x1.3ap5 +REG epsg:7368 1 -0x1.77a06edc6cc1bp6 0x1.12p5 +REG epsg:7368 2 -0x1.43f92abd2cd7fp6 0x1.12p5 +REG epsg:7368 3 -0x1.77a06edc6cc1bp6 0x1.62p5 +REG epsg:7368 4 -0x1.43f92abd2cd7fp6 0x1.62p5 +REG epsg:7369 0 -0x1.55p6 0x1.4466666666666p5 +REG epsg:7369 1 -0x1.6f52452ca6371p6 0x1.1c66666666666p5 +REG epsg:7369 2 -0x1.3aadbad359c8fp6 0x1.1c66666666666p5 +REG epsg:7369 3 -0x1.6f52452ca6371p6 0x1.6c66666666666p5 +REG epsg:7369 4 -0x1.3aadbad359c8fp6 0x1.6c66666666666p5 +REG epsg:7370 0 -0x1.55p6 0x1.4466666666666p5 +REG epsg:7370 1 -0x1.6f52452ca6371p6 0x1.1c66666666666p5 +REG epsg:7370 2 -0x1.3aadbad359c8fp6 0x1.1c66666666666p5 +REG epsg:7370 3 -0x1.6f52452ca6371p6 0x1.6c66666666666p5 +REG epsg:7370 4 -0x1.3aadbad359c8fp6 0x1.6c66666666666p5 +REG epsg:7371 0 0x0.0p0 0x0.0p0 +REG epsg:7371 1 -0x1.4p2 -0x1.4p2 +REG epsg:7371 2 0x1.4p2 -0x1.4p2 +REG epsg:7371 3 -0x1.4p2 0x1.4p2 +REG epsg:7371 4 0x1.4p2 0x1.4p2 +REG epsg:7373 0 0x0.0p0 0x0.0p0 +REG epsg:7373 1 -0x1.4p2 -0x1.4p2 +REG epsg:7373 2 0x1.4p2 -0x1.4p2 +REG epsg:7373 3 -0x1.4p2 0x1.4p2 +REG epsg:7373 4 0x1.4p2 0x1.4p2 +REG epsg:7374 0 0x1.98p5 0x0.0p0 +REG epsg:7374 1 0x1.7p5 -0x1.4p2 +REG epsg:7374 2 0x1.cp5 -0x1.4p2 +REG epsg:7374 3 0x1.7p5 0x1.4p2 +REG epsg:7374 4 0x1.cp5 0x1.4p2 +REG epsg:7375 0 0x1.c8p5 0x0.0p0 +REG epsg:7375 1 0x1.ap5 -0x1.4p2 +REG epsg:7375 2 0x1.fp5 -0x1.4p2 +REG epsg:7375 3 0x1.ap5 0x1.4p2 +REG epsg:7375 4 0x1.fp5 0x1.4p2 +REG epsg:7376 0 0x1.f8p5 0x0.0p0 +REG epsg:7376 1 0x1.dp5 -0x1.4p2 +REG epsg:7376 2 0x1.1p6 -0x1.4p2 +REG epsg:7376 3 0x1.dp5 0x1.4p2 +REG epsg:7376 4 0x1.1p6 0x1.4p2 +REG epsg:7400 0 0x0.0p0 0x0.0p0 +REG epsg:7400 1 -0x1.4p2 -0x1.4p2 +REG epsg:7400 2 0x1.4p2 -0x1.4p2 +REG epsg:7400 3 -0x1.4p2 0x1.4p2 +REG epsg:7400 4 0x1.4p2 0x1.4p2 +REG epsg:7401 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:7401 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7401 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7401 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7401 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7402 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:7402 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7402 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7402 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7402 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7403 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:7403 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:7403 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:7403 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:7403 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:7404 0 0x0.0p0 0x0.0p0 +REG epsg:7404 1 -0x1.4p2 -0x1.4p2 +REG epsg:7404 2 0x1.4p2 -0x1.4p2 +REG epsg:7404 3 -0x1.4p2 0x1.4p2 +REG epsg:7404 4 0x1.4p2 0x1.4p2 +REG epsg:7405 0 -0x1.0p1 0x1.88p5 +REG epsg:7405 1 -0x1.33e1680be4906p3 0x1.6p5 +REG epsg:7405 2 0x1.67c2d017c920cp2 0x1.6p5 +REG epsg:7405 3 -0x1.33e1680be4906p3 0x1.bp5 +REG epsg:7405 4 0x1.67c2d017c920cp2 0x1.bp5 +REG epsg:7406 0 -0x1.9p6 0x1.68p5 +REG epsg:7406 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG epsg:7406 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG epsg:7406 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG epsg:7406 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG epsg:7407 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG epsg:7407 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG epsg:7407 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG epsg:7407 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG epsg:7407 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG epsg:7408 0 0x0.0p0 0x0.0p0 +REG epsg:7408 1 -0x1.4p2 -0x1.4p2 +REG epsg:7408 2 0x1.4p2 -0x1.4p2 +REG epsg:7408 3 -0x1.4p2 0x1.4p2 +REG epsg:7408 4 0x1.4p2 0x1.4p2 +REG epsg:7409 0 0x0.0p0 0x0.0p0 +REG epsg:7409 1 -0x1.4p2 -0x1.4p2 +REG epsg:7409 2 0x1.4p2 -0x1.4p2 +REG epsg:7409 3 -0x1.4p2 0x1.4p2 +REG epsg:7409 4 0x1.4p2 0x1.4p2 +REG epsg:7410 0 0x0.0p0 0x0.0p0 +REG epsg:7410 1 -0x1.4p2 -0x1.4p2 +REG epsg:7410 2 0x1.4p2 -0x1.4p2 +REG epsg:7410 3 -0x1.4p2 0x1.4p2 +REG epsg:7410 4 0x1.4p2 0x1.4p2 +REG epsg:7411 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:7411 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7411 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7411 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7411 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7412 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:7412 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7412 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7412 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7412 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7413 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:7413 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:7413 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:7413 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:7413 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:7414 0 0x0.0p0 0x0.0p0 +REG epsg:7414 1 -0x1.4p2 -0x1.4p2 +REG epsg:7414 2 0x1.4p2 -0x1.4p2 +REG epsg:7414 3 -0x1.4p2 0x1.4p2 +REG epsg:7414 4 0x1.4p2 0x1.4p2 +REG epsg:7415 0 0x1.58cf13579be04p2 0x1.a13fd11af84a5p5 +REG epsg:7415 1 -0x1.618eba230a3e8p1 0x1.793fd11af84a5p5 +REG epsg:7415 2 0x1.b132c1e05e6fep3 0x1.793fd11af84a5p5 +REG epsg:7415 3 -0x1.618eba230a3e8p1 0x1.c93fd11af84a5p5 +REG epsg:7415 4 0x1.b132c1e05e6fep3 0x1.c93fd11af84a5p5 +REG epsg:7416 0 0x1.2p3 0x0.0p0 +REG epsg:7416 1 0x1.0p2 -0x1.4p2 +REG epsg:7416 2 0x1.cp3 -0x1.4p2 +REG epsg:7416 3 0x1.0p2 0x1.4p2 +REG epsg:7416 4 0x1.cp3 0x1.4p2 +REG epsg:7417 0 0x1.ep3 0x0.0p0 +REG epsg:7417 1 0x1.4p3 -0x1.4p2 +REG epsg:7417 2 0x1.4p4 -0x1.4p2 +REG epsg:7417 3 0x1.4p3 0x1.4p2 +REG epsg:7417 4 0x1.4p4 0x1.4p2 +REG epsg:7418 0 0x1.3p3 0x0.0p0 +REG epsg:7418 1 0x1.2p2 -0x1.4p2 +REG epsg:7418 2 0x1.dp3 -0x1.4p2 +REG epsg:7418 3 0x1.2p2 0x1.4p2 +REG epsg:7418 4 0x1.dp3 0x1.4p2 +REG epsg:7419 0 0x1.8p3 0x0.0p0 +REG epsg:7419 1 0x1.cp2 -0x1.4p2 +REG epsg:7419 2 0x1.1p4 -0x1.4p2 +REG epsg:7419 3 0x1.cp2 0x1.4p2 +REG epsg:7419 4 0x1.1p4 0x1.4p2 +REG epsg:7420 0 0x1.ep3 0x0.0p0 +REG epsg:7420 1 0x1.4p3 -0x1.4p2 +REG epsg:7420 2 0x1.4p4 -0x1.4p2 +REG epsg:7420 3 0x1.4p3 0x1.4p2 +REG epsg:7420 4 0x1.4p4 0x1.4p2 +REG epsg:7421 0 0x0.0p0 0x1.7666666666666p5 +REG epsg:7421 1 -0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7421 2 0x1.d3765caea93b3p2 0x1.4e66666666666p5 +REG epsg:7421 3 -0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7421 4 0x1.d3765caea93b3p2 0x1.9e66666666666p5 +REG epsg:7422 0 0x0.0p0 0x1.60ccccccccccep5 +REG epsg:7422 1 -0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:7422 2 0x1.bd9aa43c2af23p2 0x1.38ccccccccccep5 +REG epsg:7422 3 -0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:7422 4 0x1.bd9aa43c2af23p2 0x1.88ccccccccccep5 +REG epsg:7423 0 0x0.0p0 0x0.0p0 +REG epsg:7423 1 -0x1.4p2 -0x1.4p2 +REG epsg:7423 2 0x1.4p2 -0x1.4p2 +REG epsg:7423 3 -0x1.4p2 0x1.4p2 +REG epsg:7423 4 0x1.4p2 0x1.4p2 +REG epsg:7528 0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 +REG epsg:7528 1 -0x1.8382e3e1aefcap6 0x1.32eeeeeeeeeefp5 +REG epsg:7528 2 -0x1.4c7d1c1e51036p6 0x1.32eeeeeeeeeefp5 +REG epsg:7528 3 -0x1.8382e3e1aefcap6 0x1.82eeeeeeeeeefp5 +REG epsg:7528 4 -0x1.4c7d1c1e51036p6 0x1.82eeeeeeeeeefp5 +REG epsg:7529 0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 +REG epsg:7529 1 -0x1.8720d6c0171b2p6 0x1.45a61d950c84p5 +REG epsg:7529 2 -0x1.4dd978e4e3348p6 0x1.45a61d950c84p5 +REG epsg:7529 3 -0x1.8720d6c0171b2p6 0x1.95a61d950c84p5 +REG epsg:7529 4 -0x1.4dd978e4e3348p6 0x1.95a61d950c84p5 +REG epsg:7530 0 -0x1.6f66666666666p6 0x1.6911111111111p5 +REG epsg:7530 1 -0x1.8bc0151cbe023p6 0x1.4111111111111p5 +REG epsg:7530 2 -0x1.530cb7b00eca9p6 0x1.4111111111111p5 +REG epsg:7530 3 -0x1.8bc0151cbe023p6 0x1.9111111111111p5 +REG epsg:7530 4 -0x1.530cb7b00eca9p6 0x1.9111111111111p5 +REG epsg:7531 0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe94p5 +REG epsg:7531 1 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe94p5 +REG epsg:7531 2 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe94p5 +REG epsg:7531 3 -0x1.89c1c8ea11967p6 0x1.9d5b709bbfe94p5 +REG epsg:7531 4 -0x1.4f771aa4274d3p6 0x1.9d5b709bbfe94p5 +REG epsg:7532 0 -0x1.6p6 0x1.58p5 +REG epsg:7532 1 -0x1.7b58b77326d2dp6 0x1.3p5 +REG epsg:7532 2 -0x1.44a7488cd92d3p6 0x1.3p5 +REG epsg:7532 3 -0x1.7b58b77326d2dp6 0x1.8p5 +REG epsg:7532 4 -0x1.44a7488cd92d3p6 0x1.8p5 +REG epsg:7533 0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 +REG epsg:7533 1 -0x1.8ac09ae3a710ap6 0x1.33d9e26af37cp5 +REG epsg:7533 2 -0x1.53a01b27b9a56p6 0x1.33d9e26af37cp5 +REG epsg:7533 3 -0x1.8ac09ae3a710ap6 0x1.83d9e26af37cp5 +REG epsg:7533 4 -0x1.53a01b27b9a56p6 0x1.83d9e26af37cp5 +REG epsg:7534 0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69772p5 +REG epsg:7534 1 -0x1.8e91d67a70bdbp6 0x1.4730916b69772p5 +REG epsg:7534 2 -0x1.5517b0ead2635p6 0x1.4730916b69772p5 +REG epsg:7534 3 -0x1.8e91d67a70bdbp6 0x1.9730916b69772p5 +REG epsg:7534 4 -0x1.5517b0ead2635p6 0x1.9730916b69772p5 +REG epsg:7535 0 -0x1.62p6 0x1.55c16c16c16c2p5 +REG epsg:7535 1 -0x1.7d38fa8e1f219p6 0x1.2dc16c16c16c2p5 +REG epsg:7535 2 -0x1.46c70571e0de7p6 0x1.2dc16c16c16c2p5 +REG epsg:7535 3 -0x1.7d38fa8e1f219p6 0x1.7dc16c16c16c2p5 +REG epsg:7535 4 -0x1.46c70571e0de7p6 0x1.7dc16c16c16c2p5 +REG epsg:7536 0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9f4p5 +REG epsg:7536 1 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9f4p5 +REG epsg:7536 2 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9f4p5 +REG epsg:7536 3 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d9f4p5 +REG epsg:7536 4 -0x1.50e788cded91ep6 0x1.8fd2a6a33d9f4p5 +REG epsg:7537 0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 +REG epsg:7537 1 -0x1.86737a6e2537ap6 0x1.34ccccccccccdp5 +REG epsg:7537 2 -0x1.4f37303c85732p6 0x1.34ccccccccccdp5 +REG epsg:7537 3 -0x1.86737a6e2537ap6 0x1.84ccccccccccdp5 +REG epsg:7537 4 -0x1.4f37303c85732p6 0x1.84ccccccccccdp5 +REG epsg:7538 0 -0x1.6593e93e93e94p6 0x1.5bb34ba7e5d44p5 +REG epsg:7538 1 -0x1.8121f60492aacp6 0x1.33b34ba7e5d44p5 +REG epsg:7538 2 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d44p5 +REG epsg:7538 3 -0x1.8121f60492aacp6 0x1.83b34ba7e5d44p5 +REG epsg:7538 4 -0x1.4a05dc789527cp6 0x1.83b34ba7e5d44p5 +REG epsg:7539 0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6da2p5 +REG epsg:7539 1 -0x1.87310ceda75f3p6 0x1.3199b6c0c6da2p5 +REG epsg:7539 2 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6da2p5 +REG epsg:7539 3 -0x1.87310ceda75f3p6 0x1.8199b6c0c6da2p5 +REG epsg:7539 4 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6da2p5 +REG epsg:7540 0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce15p5 +REG epsg:7540 1 -0x1.811101c6c033dp6 0x1.308e5e6c9ce15p5 +REG epsg:7540 2 -0x1.4a4fb444a0825p6 0x1.308e5e6c9ce15p5 +REG epsg:7540 3 -0x1.811101c6c033dp6 0x1.808e5e6c9ce15p5 +REG epsg:7540 4 -0x1.4a4fb444a0825p6 0x1.808e5e6c9ce15p5 +REG epsg:7541 0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 +REG epsg:7541 1 -0x1.7dcadae26f519p6 0x1.23c71c71c71c7p5 +REG epsg:7541 2 -0x1.48685850c3e1bp6 0x1.23c71c71c71c7p5 +REG epsg:7541 3 -0x1.7dcadae26f519p6 0x1.73c71c71c71c7p5 +REG epsg:7541 4 -0x1.48685850c3e1bp6 0x1.73c71c71c71c7p5 +REG epsg:7542 0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 +REG epsg:7542 1 -0x1.7914e13b5a00cp6 0x1.3b33333333333p5 +REG epsg:7542 2 -0x1.4118a19cd3822p6 0x1.3b33333333333p5 +REG epsg:7542 3 -0x1.7914e13b5a00cp6 0x1.8b33333333333p5 +REG epsg:7542 4 -0x1.4118a19cd3822p6 0x1.8b33333333333p5 +REG epsg:7543 0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 +REG epsg:7543 1 -0x1.8c65b3ed1c49dp6 0x1.4711111111111p5 +REG epsg:7543 2 -0x1.52efa168390b9p6 0x1.4711111111111p5 +REG epsg:7543 3 -0x1.8c65b3ed1c49dp6 0x1.9711111111111p5 +REG epsg:7543 4 -0x1.52efa168390b9p6 0x1.9711111111111p5 +REG epsg:7544 0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 +REG epsg:7544 1 -0x1.8b930e66c0335p6 0x1.3b44444444444p5 +REG epsg:7544 2 -0x1.5394c416679f3p6 0x1.3b44444444444p5 +REG epsg:7544 3 -0x1.8b930e66c0335p6 0x1.8b44444444444p5 +REG epsg:7544 4 -0x1.5394c416679f3p6 0x1.8b44444444444p5 +REG epsg:7545 0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6111p5 +REG epsg:7545 1 -0x1.8960824bb7f0ap6 0x1.3efa6e86f6111p5 +REG epsg:7545 2 -0x1.50ef22ae97b46p6 0x1.3efa6e86f6111p5 +REG epsg:7545 3 -0x1.8960824bb7f0ap6 0x1.8efa6e86f6111p5 +REG epsg:7545 4 -0x1.50ef22ae97b46p6 0x1.8efa6e86f6111p5 +REG epsg:7546 0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 +REG epsg:7546 1 -0x1.7d11f2ba7b1c1p6 0x1.4382d82d82d82p5 +REG epsg:7546 2 -0x1.44102f67a7063p6 0x1.4382d82d82d82p5 +REG epsg:7546 3 -0x1.7d11f2ba7b1c1p6 0x1.9382d82d82d82p5 +REG epsg:7546 4 -0x1.44102f67a7063p6 0x1.9382d82d82d82p5 +REG epsg:7547 0 -0x1.6288888888889p6 0x1.600b60b60b60bp5 +REG epsg:7547 1 -0x1.7e56d665291cfp6 0x1.380b60b60b60bp5 +REG epsg:7547 2 -0x1.46ba3aabe7f43p6 0x1.380b60b60b60bp5 +REG epsg:7547 3 -0x1.7e56d665291cfp6 0x1.880b60b60b60bp5 +REG epsg:7547 4 -0x1.46ba3aabe7f43p6 0x1.880b60b60b60bp5 +REG epsg:7548 0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 +REG epsg:7548 1 -0x1.85de05ec269ccp6 0x1.2349f49f49f4ap5 +REG epsg:7548 2 -0x1.5088607a3fc9ap6 0x1.2349f49f49f4ap5 +REG epsg:7548 3 -0x1.85de05ec269ccp6 0x1.7349f49f49f4ap5 +REG epsg:7548 4 -0x1.5088607a3fc9ap6 0x1.7349f49f49f4ap5 +REG epsg:7549 0 -0x1.675b05b05b05bp6 0x1.5519ba40451e1p5 +REG epsg:7549 1 -0x1.828ad2d6b1988p6 0x1.2d19ba40451e1p5 +REG epsg:7549 2 -0x1.4c2b388a0472ep6 0x1.2d19ba40451e1p5 +REG epsg:7549 3 -0x1.828ad2d6b1988p6 0x1.7d19ba40451e1p5 +REG epsg:7549 4 -0x1.4c2b388a0472ep6 0x1.7d19ba40451e1p5 +REG epsg:7550 0 -0x1.64f7777777778p6 0x1.5e74bc7a4dca3p5 +REG epsg:7550 1 -0x1.80ae11048e154p6 0x1.3674bc7a4dca3p5 +REG epsg:7550 2 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dca3p5 +REG epsg:7550 3 -0x1.80ae11048e154p6 0x1.8674bc7a4dca3p5 +REG epsg:7550 4 -0x1.4940ddea60d9cp6 0x1.8674bc7a4dca3p5 +REG epsg:7551 0 -0x1.68a4fa4fa4fa5p6 0x1.544fa4fa4fa4ep5 +REG epsg:7551 1 -0x1.83c9c54d1c8e2p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:7551 2 -0x1.4d802f522d668p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:7551 3 -0x1.83c9c54d1c8e2p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:7551 4 -0x1.4d802f522d668p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:7552 0 -0x1.6905b05b05b06p6 0x1.6b77777777777p5 +REG epsg:7552 1 -0x1.8585da1f0e343p6 0x1.4377777777777p5 +REG epsg:7552 2 -0x1.4c858696fd2c9p6 0x1.4377777777777p5 +REG epsg:7552 3 -0x1.8585da1f0e343p6 0x1.9377777777777p5 +REG epsg:7552 4 -0x1.4c858696fd2c9p6 0x1.9377777777777p5 +REG epsg:7553 0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 +REG epsg:7553 1 -0x1.874cc9e6a0a8bp6 0x1.3a06d49145de5p5 +REG epsg:7553 2 -0x1.4f7454a1f8771p6 0x1.3a06d49145de5p5 +REG epsg:7553 3 -0x1.874cc9e6a0a8bp6 0x1.8a06d49145de5p5 +REG epsg:7553 4 -0x1.4f7454a1f8771p6 0x1.8a06d49145de5p5 +REG epsg:7554 0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 +REG epsg:7554 1 -0x1.7a952398a9928p6 0x1.29bbbbbbbbbbcp5 +REG epsg:7554 2 -0x1.4492aee47e4p6 0x1.29bbbbbbbbbbcp5 +REG epsg:7554 3 -0x1.7a952398a9928p6 0x1.79bbbbbbbbbbcp5 +REG epsg:7554 4 -0x1.4492aee47e4p6 0x1.79bbbbbbbbbbcp5 +REG epsg:7555 0 -0x1.5e33333333333p6 0x1.5a22222222223p5 +REG epsg:7555 1 -0x1.79aa8267421e7p6 0x1.3222222222223p5 +REG epsg:7555 2 -0x1.42bbe3ff2447fp6 0x1.3222222222223p5 +REG epsg:7555 3 -0x1.79aa8267421e7p6 0x1.8222222222223p5 +REG epsg:7555 4 -0x1.42bbe3ff2447fp6 0x1.8222222222223p5 +REG epsg:7556 0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 +REG epsg:7556 1 -0x1.88d0fb8f423f5p6 0x1.339be02468acfp5 +REG epsg:7556 2 -0x1.51b78cf946493p6 0x1.339be02468acfp5 +REG epsg:7556 3 -0x1.88d0fb8f423f5p6 0x1.839be02468acfp5 +REG epsg:7556 4 -0x1.51b78cf946493p6 0x1.839be02468acfp5 +REG epsg:7557 0 -0x1.6422222222222p6 0x1.693be0a9d7fb7p5 +REG epsg:7557 1 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7fb7p5 +REG epsg:7557 2 -0x1.47c5ca068267bp6 0x1.413be0a9d7fb7p5 +REG epsg:7557 3 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d7fb7p5 +REG epsg:7557 4 -0x1.47c5ca068267bp6 0x1.913be0a9d7fb7p5 +REG epsg:7558 0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 +REG epsg:7558 1 -0x1.832420d062cc2p6 0x1.3ec16c16c16c2p5 +REG epsg:7558 2 -0x1.4ab9bd0d7b11cp6 0x1.3ec16c16c16c2p5 +REG epsg:7558 3 -0x1.832420d062cc2p6 0x1.8ec16c16c16c2p5 +REG epsg:7558 4 -0x1.4ab9bd0d7b11cp6 0x1.8ec16c16c16c2p5 +REG epsg:7559 0 -0x1.67147ae147ae1p6 0x1.67350d60e1dap5 +REG epsg:7559 1 -0x1.8350c33b464acp6 0x1.3f350d60e1dap5 +REG epsg:7559 2 -0x1.4ad8328749116p6 0x1.3f350d60e1dap5 +REG epsg:7559 3 -0x1.8350c33b464acp6 0x1.8f350d60e1dap5 +REG epsg:7559 4 -0x1.4ad8328749116p6 0x1.8f350d60e1dap5 +REG epsg:7560 0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 +REG epsg:7560 1 -0x1.7afa4c47d1f55p6 0x1.3d88888888888p5 +REG epsg:7560 2 -0x1.42b60ebdde65bp6 0x1.3d88888888888p5 +REG epsg:7560 3 -0x1.7afa4c47d1f55p6 0x1.8d88888888888p5 +REG epsg:7560 4 -0x1.42b60ebdde65bp6 0x1.8d88888888888p5 +REG epsg:7561 0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 +REG epsg:7561 1 -0x1.7dcfe5d3e3702p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:7561 2 -0x1.45856f8171e54p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:7561 3 -0x1.7dcfe5d3e3702p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:7561 4 -0x1.45856f8171e54p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:7562 0 -0x1.6a91111111112p6 0x1.600026c287bc5p5 +REG epsg:7562 1 -0x1.865eb68f209b9p6 0x1.380026c287bc5p5 +REG epsg:7562 2 -0x1.4ec36b930186bp6 0x1.380026c287bc5p5 +REG epsg:7562 3 -0x1.865eb68f209b9p6 0x1.880026c287bc5p5 +REG epsg:7562 4 -0x1.4ec36b930186bp6 0x1.880026c287bc5p5 +REG epsg:7563 0 -0x1.5fa2222222223p6 0x1.632d82d82d82dp5 +REG epsg:7563 1 -0x1.7b9feada33b6fp6 0x1.3b2d82d82d82dp5 +REG epsg:7563 2 -0x1.43a4596a108d7p6 0x1.3b2d82d82d82dp5 +REG epsg:7563 3 -0x1.7b9feada33b6fp6 0x1.8b2d82d82d82dp5 +REG epsg:7563 4 -0x1.43a4596a108d7p6 0x1.8b2d82d82d82dp5 +REG epsg:7564 0 -0x1.662d82d82d82dp6 0x1.6da2401273456p5 +REG epsg:7564 1 -0x1.82d0f2681f152p6 0x1.45a2401273456p5 +REG epsg:7564 2 -0x1.498a13483bf08p6 0x1.45a2401273456p5 +REG epsg:7564 3 -0x1.82d0f2681f152p6 0x1.95a2401273456p5 +REG epsg:7564 4 -0x1.498a13483bf08p6 0x1.95a2401273456p5 +REG epsg:7565 0 -0x1.70e93e93e93e9p6 0x1.6516d538431cp5 +REG epsg:7565 1 -0x1.8d04788047198p6 0x1.3d16d538431cp5 +REG epsg:7565 2 -0x1.54ce04a78b63ap6 0x1.3d16d538431cp5 +REG epsg:7565 3 -0x1.8d04788047198p6 0x1.8d16d538431cp5 +REG epsg:7565 4 -0x1.54ce04a78b63ap6 0x1.8d16d538431cp5 +REG epsg:7566 0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 +REG epsg:7566 1 -0x1.8ea6db584b498p6 0x1.3d49f49f49f4ap5 +REG epsg:7566 2 -0x1.566a35b8c5c7ap6 0x1.3d49f49f49f4ap5 +REG epsg:7566 3 -0x1.8ea6db584b498p6 0x1.8d49f49f49f4ap5 +REG epsg:7566 4 -0x1.566a35b8c5c7ap6 0x1.8d49f49f49f4ap5 +REG epsg:7567 0 -0x1.66p6 0x1.6355a7cef00ddp5 +REG epsg:7567 1 -0x1.82002f8de16p6 0x1.3b55a7cef00ddp5 +REG epsg:7567 2 -0x1.49ffd0721eap6 0x1.3b55a7cef00ddp5 +REG epsg:7567 3 -0x1.82002f8de16p6 0x1.8b55a7cef00ddp5 +REG epsg:7567 4 -0x1.49ffd0721eap6 0x1.8b55a7cef00ddp5 +REG epsg:7568 0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 +REG epsg:7568 1 -0x1.8605e0515b85cp6 0x1.3c71c71c71c71p5 +REG epsg:7568 2 -0x1.4de35e428db8ep6 0x1.3c71c71c71c71p5 +REG epsg:7568 3 -0x1.8605e0515b85cp6 0x1.8c71c71c71c71p5 +REG epsg:7568 4 -0x1.4de35e428db8ep6 0x1.8c71c71c71c71p5 +REG epsg:7569 0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5863p5 +REG epsg:7569 1 -0x1.8536a29c21962p6 0x1.329418ccd5863p5 +REG epsg:7569 2 -0x1.4e3b24805031p6 0x1.329418ccd5863p5 +REG epsg:7569 3 -0x1.8536a29c21962p6 0x1.829418ccd5863p5 +REG epsg:7569 4 -0x1.4e3b24805031p6 0x1.829418ccd5863p5 +REG epsg:7570 0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 +REG epsg:7570 1 -0x1.7f2d96ac67099p6 0x1.278e38e38e38ep5 +REG epsg:7570 2 -0x1.496652922cdfbp6 0x1.278e38e38e38ep5 +REG epsg:7570 3 -0x1.7f2d96ac67099p6 0x1.778e38e38e38ep5 +REG epsg:7570 4 -0x1.496652922cdfbp6 0x1.778e38e38e38ep5 +REG epsg:7571 0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 +REG epsg:7571 1 -0x1.880842b7f221p6 0x1.375b05b05b05ap5 +REG epsg:7571 2 -0x1.508045d096678p6 0x1.375b05b05b05ap5 +REG epsg:7571 3 -0x1.880842b7f221p6 0x1.875b05b05b05ap5 +REG epsg:7571 4 -0x1.508045d096678p6 0x1.875b05b05b05ap5 +REG epsg:7572 0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 +REG epsg:7572 1 -0x1.82ddd6c83a2abp6 0x1.2e8e38e38e38fp5 +REG epsg:7572 2 -0x1.4c555c6af9089p6 0x1.2e8e38e38e38fp5 +REG epsg:7572 3 -0x1.82ddd6c83a2abp6 0x1.7e8e38e38e38fp5 +REG epsg:7572 4 -0x1.4c555c6af9089p6 0x1.7e8e38e38e38fp5 +REG epsg:7573 0 -0x1.6c77777777777p6 0x1.6f33672c63c93p5 +REG epsg:7573 1 -0x1.8934b933d2a2cp6 0x1.4733672c63c93p5 +REG epsg:7573 2 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c93p5 +REG epsg:7573 3 -0x1.8934b933d2a2cp6 0x1.9733672c63c93p5 +REG epsg:7573 4 -0x1.4fba35bb1c4c2p6 0x1.9733672c63c93p5 +REG epsg:7574 0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 +REG epsg:7574 1 -0x1.7e3e1003b1f4fp6 0x1.3849f49f49f4ap5 +REG epsg:7574 2 -0x1.469a1d7f26389p6 0x1.3849f49f49f4ap5 +REG epsg:7574 3 -0x1.7e3e1003b1f4fp6 0x1.8849f49f49f4ap5 +REG epsg:7574 4 -0x1.469a1d7f26389p6 0x1.8849f49f49f4ap5 +REG epsg:7575 0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 +REG epsg:7575 1 -0x1.8e5a81cace66cp6 0x1.3849f49f49f4ap5 +REG epsg:7575 2 -0x1.56b68f4642aa6p6 0x1.3849f49f49f4ap5 +REG epsg:7575 3 -0x1.8e5a81cace66cp6 0x1.8849f49f49f4ap5 +REG epsg:7575 4 -0x1.56b68f4642aa6p6 0x1.8849f49f49f4ap5 +REG epsg:7576 0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc5949p5 +REG epsg:7576 1 -0x1.864e48bbb4894p6 0x1.416c2dfc5949p5 +REG epsg:7576 2 -0x1.4d8f95222954ap6 0x1.416c2dfc5949p5 +REG epsg:7576 3 -0x1.864e48bbb4894p6 0x1.916c2dfc5949p5 +REG epsg:7576 4 -0x1.4d8f95222954ap6 0x1.916c2dfc5949p5 +REG epsg:7577 0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 +REG epsg:7577 1 -0x1.88e29dc64a41dp6 0x1.3149f49f49f4ap5 +REG epsg:7577 2 -0x1.520c5128a4ad1p6 0x1.3149f49f49f4ap5 +REG epsg:7577 3 -0x1.88e29dc64a41dp6 0x1.8149f49f49f4ap5 +REG epsg:7577 4 -0x1.520c5128a4ad1p6 0x1.8149f49f49f4ap5 +REG epsg:7578 0 -0x1.6b22222222222p6 0x1.5c99aadeb1d67p5 +REG epsg:7578 1 -0x1.86bd58a47e612p6 0x1.3499aadeb1d67p5 +REG epsg:7578 2 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d67p5 +REG epsg:7578 3 -0x1.86bd58a47e612p6 0x1.8499aadeb1d67p5 +REG epsg:7578 4 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1d67p5 +REG epsg:7579 0 -0x1.65f49f49f49f5p6 0x1.709f6cb8f8fbep5 +REG epsg:7579 1 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fbep5 +REG epsg:7579 2 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fbep5 +REG epsg:7579 3 -0x1.82c98af483fbdp6 0x1.989f6cb8f8fbep5 +REG epsg:7579 4 -0x1.491fb39f6542dp6 0x1.989f6cb8f8fbep5 +REG epsg:7580 0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24dcp5 +REG epsg:7580 1 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24dcp5 +REG epsg:7580 2 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24dcp5 +REG epsg:7580 3 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a24dcp5 +REG epsg:7580 4 -0x1.46f74b6659832p6 0x1.7d5b0ef1a24dcp5 +REG epsg:7581 0 -0x1.6f22222222222p6 0x1.6fb0940623775p5 +REG epsg:7581 1 -0x1.8be7808f8d268p6 0x1.47b0940623775p5 +REG epsg:7581 2 -0x1.525cc3b4b71dcp6 0x1.47b0940623775p5 +REG epsg:7581 3 -0x1.8be7808f8d268p6 0x1.97b0940623775p5 +REG epsg:7581 4 -0x1.525cc3b4b71dcp6 0x1.97b0940623775p5 +REG epsg:7582 0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 +REG epsg:7582 1 -0x1.7b90d25883c9ep6 0x1.2f582d82d82d7p5 +REG epsg:7582 2 -0x1.44f205d4ff0e4p6 0x1.2f582d82d82d7p5 +REG epsg:7582 3 -0x1.7b90d25883c9ep6 0x1.7f582d82d82d7p5 +REG epsg:7582 4 -0x1.44f205d4ff0e4p6 0x1.7f582d82d82d7p5 +REG epsg:7583 0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 +REG epsg:7583 1 -0x1.7c0e988dd8825p6 0x1.2c8e38e38e38fp5 +REG epsg:7583 2 -0x1.45be343ef44a7p6 0x1.2c8e38e38e38fp5 +REG epsg:7583 3 -0x1.7c0e988dd8825p6 0x1.7c8e38e38e38fp5 +REG epsg:7583 4 -0x1.45be343ef44a7p6 0x1.7c8e38e38e38fp5 +REG epsg:7584 0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 +REG epsg:7584 1 -0x1.7ecd63d604231p6 0x1.335cba9876543p5 +REG epsg:7584 2 -0x1.47bb24b284657p6 0x1.335cba9876543p5 +REG epsg:7584 3 -0x1.7ecd63d604231p6 0x1.835cba9876543p5 +REG epsg:7584 4 -0x1.47bb24b284657p6 0x1.835cba9876543p5 +REG epsg:7585 0 -0x1.64f7777777778p6 0x1.60e95b7ef36cdp5 +REG epsg:7585 1 -0x1.80d2d057ececp6 0x1.38e95b7ef36cdp5 +REG epsg:7585 2 -0x1.491c1e970203p6 0x1.38e95b7ef36cdp5 +REG epsg:7585 3 -0x1.80d2d057ececp6 0x1.88e95b7ef36cdp5 +REG epsg:7585 4 -0x1.491c1e970203p6 0x1.88e95b7ef36cdp5 +REG epsg:7586 0 -0x1.68p6 0x1.62e6987417888p5 +REG epsg:7586 1 -0x1.83f98c2283b1ap6 0x1.3ae6987417888p5 +REG epsg:7586 2 -0x1.4c0673dd7c4e6p6 0x1.3ae6987417888p5 +REG epsg:7586 3 -0x1.83f98c2283b1ap6 0x1.8ae6987417888p5 +REG epsg:7586 4 -0x1.4c0673dd7c4e6p6 0x1.8ae6987417888p5 +REG epsg:7587 0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 +REG epsg:7587 1 -0x1.8382e3e1aefcap6 0x1.32eeeeeeeeeefp5 +REG epsg:7587 2 -0x1.4c7d1c1e51036p6 0x1.32eeeeeeeeeefp5 +REG epsg:7587 3 -0x1.8382e3e1aefcap6 0x1.82eeeeeeeeeefp5 +REG epsg:7587 4 -0x1.4c7d1c1e51036p6 0x1.82eeeeeeeeeefp5 +REG epsg:7588 0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 +REG epsg:7588 1 -0x1.8720d6c0171b2p6 0x1.45a61d950c84p5 +REG epsg:7588 2 -0x1.4dd978e4e3348p6 0x1.45a61d950c84p5 +REG epsg:7588 3 -0x1.8720d6c0171b2p6 0x1.95a61d950c84p5 +REG epsg:7588 4 -0x1.4dd978e4e3348p6 0x1.95a61d950c84p5 +REG epsg:7589 0 -0x1.6f66666666666p6 0x1.6911111111111p5 +REG epsg:7589 1 -0x1.8bc0151cbe023p6 0x1.4111111111111p5 +REG epsg:7589 2 -0x1.530cb7b00eca9p6 0x1.4111111111111p5 +REG epsg:7589 3 -0x1.8bc0151cbe023p6 0x1.9111111111111p5 +REG epsg:7589 4 -0x1.530cb7b00eca9p6 0x1.9111111111111p5 +REG epsg:7590 0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe94p5 +REG epsg:7590 1 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe94p5 +REG epsg:7590 2 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe94p5 +REG epsg:7590 3 -0x1.89c1c8ea11967p6 0x1.9d5b709bbfe94p5 +REG epsg:7590 4 -0x1.4f771aa4274d3p6 0x1.9d5b709bbfe94p5 +REG epsg:7591 0 -0x1.6p6 0x1.58p5 +REG epsg:7591 1 -0x1.7b58b77326d2dp6 0x1.3p5 +REG epsg:7591 2 -0x1.44a7488cd92d3p6 0x1.3p5 +REG epsg:7591 3 -0x1.7b58b77326d2dp6 0x1.8p5 +REG epsg:7591 4 -0x1.44a7488cd92d3p6 0x1.8p5 +REG epsg:7592 0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 +REG epsg:7592 1 -0x1.8ac09ae3a710ap6 0x1.33d9e26af37cp5 +REG epsg:7592 2 -0x1.53a01b27b9a56p6 0x1.33d9e26af37cp5 +REG epsg:7592 3 -0x1.8ac09ae3a710ap6 0x1.83d9e26af37cp5 +REG epsg:7592 4 -0x1.53a01b27b9a56p6 0x1.83d9e26af37cp5 +REG epsg:7593 0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69772p5 +REG epsg:7593 1 -0x1.8e91d67a70bdbp6 0x1.4730916b69772p5 +REG epsg:7593 2 -0x1.5517b0ead2635p6 0x1.4730916b69772p5 +REG epsg:7593 3 -0x1.8e91d67a70bdbp6 0x1.9730916b69772p5 +REG epsg:7593 4 -0x1.5517b0ead2635p6 0x1.9730916b69772p5 +REG epsg:7594 0 -0x1.62p6 0x1.55c16c16c16c2p5 +REG epsg:7594 1 -0x1.7d38fa8e1f219p6 0x1.2dc16c16c16c2p5 +REG epsg:7594 2 -0x1.46c70571e0de7p6 0x1.2dc16c16c16c2p5 +REG epsg:7594 3 -0x1.7d38fa8e1f219p6 0x1.7dc16c16c16c2p5 +REG epsg:7594 4 -0x1.46c70571e0de7p6 0x1.7dc16c16c16c2p5 +REG epsg:7595 0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9f4p5 +REG epsg:7595 1 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9f4p5 +REG epsg:7595 2 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9f4p5 +REG epsg:7595 3 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d9f4p5 +REG epsg:7595 4 -0x1.50e788cded91ep6 0x1.8fd2a6a33d9f4p5 +REG epsg:7596 0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 +REG epsg:7596 1 -0x1.86737a6e2537ap6 0x1.34ccccccccccdp5 +REG epsg:7596 2 -0x1.4f37303c85732p6 0x1.34ccccccccccdp5 +REG epsg:7596 3 -0x1.86737a6e2537ap6 0x1.84ccccccccccdp5 +REG epsg:7596 4 -0x1.4f37303c85732p6 0x1.84ccccccccccdp5 +REG epsg:7597 0 -0x1.6593e93e93e94p6 0x1.5bb34ba7e5d44p5 +REG epsg:7597 1 -0x1.8121f60492aacp6 0x1.33b34ba7e5d44p5 +REG epsg:7597 2 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d44p5 +REG epsg:7597 3 -0x1.8121f60492aacp6 0x1.83b34ba7e5d44p5 +REG epsg:7597 4 -0x1.4a05dc789527cp6 0x1.83b34ba7e5d44p5 +REG epsg:7598 0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6da2p5 +REG epsg:7598 1 -0x1.87310ceda75f3p6 0x1.3199b6c0c6da2p5 +REG epsg:7598 2 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6da2p5 +REG epsg:7598 3 -0x1.87310ceda75f3p6 0x1.8199b6c0c6da2p5 +REG epsg:7598 4 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6da2p5 +REG epsg:7599 0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce15p5 +REG epsg:7599 1 -0x1.811101c6c033dp6 0x1.308e5e6c9ce15p5 +REG epsg:7599 2 -0x1.4a4fb444a0825p6 0x1.308e5e6c9ce15p5 +REG epsg:7599 3 -0x1.811101c6c033dp6 0x1.808e5e6c9ce15p5 +REG epsg:7599 4 -0x1.4a4fb444a0825p6 0x1.808e5e6c9ce15p5 +REG epsg:7600 0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 +REG epsg:7600 1 -0x1.7dcadae26f519p6 0x1.23c71c71c71c7p5 +REG epsg:7600 2 -0x1.48685850c3e1bp6 0x1.23c71c71c71c7p5 +REG epsg:7600 3 -0x1.7dcadae26f519p6 0x1.73c71c71c71c7p5 +REG epsg:7600 4 -0x1.48685850c3e1bp6 0x1.73c71c71c71c7p5 +REG epsg:7601 0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 +REG epsg:7601 1 -0x1.7914e13b5a00cp6 0x1.3b33333333333p5 +REG epsg:7601 2 -0x1.4118a19cd3822p6 0x1.3b33333333333p5 +REG epsg:7601 3 -0x1.7914e13b5a00cp6 0x1.8b33333333333p5 +REG epsg:7601 4 -0x1.4118a19cd3822p6 0x1.8b33333333333p5 +REG epsg:7602 0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 +REG epsg:7602 1 -0x1.8c65b3ed1c49dp6 0x1.4711111111111p5 +REG epsg:7602 2 -0x1.52efa168390b9p6 0x1.4711111111111p5 +REG epsg:7602 3 -0x1.8c65b3ed1c49dp6 0x1.9711111111111p5 +REG epsg:7602 4 -0x1.52efa168390b9p6 0x1.9711111111111p5 +REG epsg:7603 0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 +REG epsg:7603 1 -0x1.8b930e66c0335p6 0x1.3b44444444444p5 +REG epsg:7603 2 -0x1.5394c416679f3p6 0x1.3b44444444444p5 +REG epsg:7603 3 -0x1.8b930e66c0335p6 0x1.8b44444444444p5 +REG epsg:7603 4 -0x1.5394c416679f3p6 0x1.8b44444444444p5 +REG epsg:7604 0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6111p5 +REG epsg:7604 1 -0x1.8960824bb7f0ap6 0x1.3efa6e86f6111p5 +REG epsg:7604 2 -0x1.50ef22ae97b46p6 0x1.3efa6e86f6111p5 +REG epsg:7604 3 -0x1.8960824bb7f0ap6 0x1.8efa6e86f6111p5 +REG epsg:7604 4 -0x1.50ef22ae97b46p6 0x1.8efa6e86f6111p5 +REG epsg:7605 0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 +REG epsg:7605 1 -0x1.7d11f2ba7b1c1p6 0x1.4382d82d82d82p5 +REG epsg:7605 2 -0x1.44102f67a7063p6 0x1.4382d82d82d82p5 +REG epsg:7605 3 -0x1.7d11f2ba7b1c1p6 0x1.9382d82d82d82p5 +REG epsg:7605 4 -0x1.44102f67a7063p6 0x1.9382d82d82d82p5 +REG epsg:7606 0 -0x1.6288888888889p6 0x1.600b60b60b60bp5 +REG epsg:7606 1 -0x1.7e56d665291cfp6 0x1.380b60b60b60bp5 +REG epsg:7606 2 -0x1.46ba3aabe7f43p6 0x1.380b60b60b60bp5 +REG epsg:7606 3 -0x1.7e56d665291cfp6 0x1.880b60b60b60bp5 +REG epsg:7606 4 -0x1.46ba3aabe7f43p6 0x1.880b60b60b60bp5 +REG epsg:7607 0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 +REG epsg:7607 1 -0x1.85de05ec269ccp6 0x1.2349f49f49f4ap5 +REG epsg:7607 2 -0x1.5088607a3fc9ap6 0x1.2349f49f49f4ap5 +REG epsg:7607 3 -0x1.85de05ec269ccp6 0x1.7349f49f49f4ap5 +REG epsg:7607 4 -0x1.5088607a3fc9ap6 0x1.7349f49f49f4ap5 +REG epsg:7608 0 -0x1.675b05b05b05bp6 0x1.5519ba40451e1p5 +REG epsg:7608 1 -0x1.828ad2d6b1988p6 0x1.2d19ba40451e1p5 +REG epsg:7608 2 -0x1.4c2b388a0472ep6 0x1.2d19ba40451e1p5 +REG epsg:7608 3 -0x1.828ad2d6b1988p6 0x1.7d19ba40451e1p5 +REG epsg:7608 4 -0x1.4c2b388a0472ep6 0x1.7d19ba40451e1p5 +REG epsg:7609 0 -0x1.64f7777777778p6 0x1.5e74bc7a4dca3p5 +REG epsg:7609 1 -0x1.80ae11048e154p6 0x1.3674bc7a4dca3p5 +REG epsg:7609 2 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dca3p5 +REG epsg:7609 3 -0x1.80ae11048e154p6 0x1.8674bc7a4dca3p5 +REG epsg:7609 4 -0x1.4940ddea60d9cp6 0x1.8674bc7a4dca3p5 +REG epsg:7610 0 -0x1.68a4fa4fa4fa5p6 0x1.544fa4fa4fa4ep5 +REG epsg:7610 1 -0x1.83c9c54d1c8e2p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:7610 2 -0x1.4d802f522d668p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:7610 3 -0x1.83c9c54d1c8e2p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:7610 4 -0x1.4d802f522d668p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:7611 0 -0x1.6905b05b05b06p6 0x1.6b77777777777p5 +REG epsg:7611 1 -0x1.8585da1f0e343p6 0x1.4377777777777p5 +REG epsg:7611 2 -0x1.4c858696fd2c9p6 0x1.4377777777777p5 +REG epsg:7611 3 -0x1.8585da1f0e343p6 0x1.9377777777777p5 +REG epsg:7611 4 -0x1.4c858696fd2c9p6 0x1.9377777777777p5 +REG epsg:7612 0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 +REG epsg:7612 1 -0x1.874cc9e6a0a8bp6 0x1.3a06d49145de5p5 +REG epsg:7612 2 -0x1.4f7454a1f8771p6 0x1.3a06d49145de5p5 +REG epsg:7612 3 -0x1.874cc9e6a0a8bp6 0x1.8a06d49145de5p5 +REG epsg:7612 4 -0x1.4f7454a1f8771p6 0x1.8a06d49145de5p5 +REG epsg:7613 0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 +REG epsg:7613 1 -0x1.7a952398a9928p6 0x1.29bbbbbbbbbbcp5 +REG epsg:7613 2 -0x1.4492aee47e4p6 0x1.29bbbbbbbbbbcp5 +REG epsg:7613 3 -0x1.7a952398a9928p6 0x1.79bbbbbbbbbbcp5 +REG epsg:7613 4 -0x1.4492aee47e4p6 0x1.79bbbbbbbbbbcp5 +REG epsg:7614 0 -0x1.5e33333333333p6 0x1.5a22222222223p5 +REG epsg:7614 1 -0x1.79aa8267421e7p6 0x1.3222222222223p5 +REG epsg:7614 2 -0x1.42bbe3ff2447fp6 0x1.3222222222223p5 +REG epsg:7614 3 -0x1.79aa8267421e7p6 0x1.8222222222223p5 +REG epsg:7614 4 -0x1.42bbe3ff2447fp6 0x1.8222222222223p5 +REG epsg:7615 0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 +REG epsg:7615 1 -0x1.88d0fb8f423f5p6 0x1.339be02468acfp5 +REG epsg:7615 2 -0x1.51b78cf946493p6 0x1.339be02468acfp5 +REG epsg:7615 3 -0x1.88d0fb8f423f5p6 0x1.839be02468acfp5 +REG epsg:7615 4 -0x1.51b78cf946493p6 0x1.839be02468acfp5 +REG epsg:7616 0 -0x1.6422222222222p6 0x1.693be0a9d7fb7p5 +REG epsg:7616 1 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7fb7p5 +REG epsg:7616 2 -0x1.47c5ca068267bp6 0x1.413be0a9d7fb7p5 +REG epsg:7616 3 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d7fb7p5 +REG epsg:7616 4 -0x1.47c5ca068267bp6 0x1.913be0a9d7fb7p5 +REG epsg:7617 0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 +REG epsg:7617 1 -0x1.832420d062cc2p6 0x1.3ec16c16c16c2p5 +REG epsg:7617 2 -0x1.4ab9bd0d7b11cp6 0x1.3ec16c16c16c2p5 +REG epsg:7617 3 -0x1.832420d062cc2p6 0x1.8ec16c16c16c2p5 +REG epsg:7617 4 -0x1.4ab9bd0d7b11cp6 0x1.8ec16c16c16c2p5 +REG epsg:7618 0 -0x1.67147ae147ae1p6 0x1.67350d60e1dap5 +REG epsg:7618 1 -0x1.8350c33b464acp6 0x1.3f350d60e1dap5 +REG epsg:7618 2 -0x1.4ad8328749116p6 0x1.3f350d60e1dap5 +REG epsg:7618 3 -0x1.8350c33b464acp6 0x1.8f350d60e1dap5 +REG epsg:7618 4 -0x1.4ad8328749116p6 0x1.8f350d60e1dap5 +REG epsg:7619 0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 +REG epsg:7619 1 -0x1.7afa4c47d1f55p6 0x1.3d88888888888p5 +REG epsg:7619 2 -0x1.42b60ebdde65bp6 0x1.3d88888888888p5 +REG epsg:7619 3 -0x1.7afa4c47d1f55p6 0x1.8d88888888888p5 +REG epsg:7619 4 -0x1.42b60ebdde65bp6 0x1.8d88888888888p5 +REG epsg:7620 0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 +REG epsg:7620 1 -0x1.7dcfe5d3e3702p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:7620 2 -0x1.45856f8171e54p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:7620 3 -0x1.7dcfe5d3e3702p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:7620 4 -0x1.45856f8171e54p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:7621 0 -0x1.6a91111111112p6 0x1.600026c287bc5p5 +REG epsg:7621 1 -0x1.865eb68f209b9p6 0x1.380026c287bc5p5 +REG epsg:7621 2 -0x1.4ec36b930186bp6 0x1.380026c287bc5p5 +REG epsg:7621 3 -0x1.865eb68f209b9p6 0x1.880026c287bc5p5 +REG epsg:7621 4 -0x1.4ec36b930186bp6 0x1.880026c287bc5p5 +REG epsg:7622 0 -0x1.5fa2222222223p6 0x1.632d82d82d82dp5 +REG epsg:7622 1 -0x1.7b9feada33b6fp6 0x1.3b2d82d82d82dp5 +REG epsg:7622 2 -0x1.43a4596a108d7p6 0x1.3b2d82d82d82dp5 +REG epsg:7622 3 -0x1.7b9feada33b6fp6 0x1.8b2d82d82d82dp5 +REG epsg:7622 4 -0x1.43a4596a108d7p6 0x1.8b2d82d82d82dp5 +REG epsg:7623 0 -0x1.662d82d82d82dp6 0x1.6da2401273456p5 +REG epsg:7623 1 -0x1.82d0f2681f152p6 0x1.45a2401273456p5 +REG epsg:7623 2 -0x1.498a13483bf08p6 0x1.45a2401273456p5 +REG epsg:7623 3 -0x1.82d0f2681f152p6 0x1.95a2401273456p5 +REG epsg:7623 4 -0x1.498a13483bf08p6 0x1.95a2401273456p5 +REG epsg:7624 0 -0x1.70e93e93e93e9p6 0x1.6516d538431cp5 +REG epsg:7624 1 -0x1.8d04788047198p6 0x1.3d16d538431cp5 +REG epsg:7624 2 -0x1.54ce04a78b63ap6 0x1.3d16d538431cp5 +REG epsg:7624 3 -0x1.8d04788047198p6 0x1.8d16d538431cp5 +REG epsg:7624 4 -0x1.54ce04a78b63ap6 0x1.8d16d538431cp5 +REG epsg:7625 0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 +REG epsg:7625 1 -0x1.8ea6db584b498p6 0x1.3d49f49f49f4ap5 +REG epsg:7625 2 -0x1.566a35b8c5c7ap6 0x1.3d49f49f49f4ap5 +REG epsg:7625 3 -0x1.8ea6db584b498p6 0x1.8d49f49f49f4ap5 +REG epsg:7625 4 -0x1.566a35b8c5c7ap6 0x1.8d49f49f49f4ap5 +REG epsg:7626 0 -0x1.66p6 0x1.6355a7cef00ddp5 +REG epsg:7626 1 -0x1.82002f8de16p6 0x1.3b55a7cef00ddp5 +REG epsg:7626 2 -0x1.49ffd0721eap6 0x1.3b55a7cef00ddp5 +REG epsg:7626 3 -0x1.82002f8de16p6 0x1.8b55a7cef00ddp5 +REG epsg:7626 4 -0x1.49ffd0721eap6 0x1.8b55a7cef00ddp5 +REG epsg:7627 0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 +REG epsg:7627 1 -0x1.8605e0515b85cp6 0x1.3c71c71c71c71p5 +REG epsg:7627 2 -0x1.4de35e428db8ep6 0x1.3c71c71c71c71p5 +REG epsg:7627 3 -0x1.8605e0515b85cp6 0x1.8c71c71c71c71p5 +REG epsg:7627 4 -0x1.4de35e428db8ep6 0x1.8c71c71c71c71p5 +REG epsg:7628 0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5863p5 +REG epsg:7628 1 -0x1.8536a29c21962p6 0x1.329418ccd5863p5 +REG epsg:7628 2 -0x1.4e3b24805031p6 0x1.329418ccd5863p5 +REG epsg:7628 3 -0x1.8536a29c21962p6 0x1.829418ccd5863p5 +REG epsg:7628 4 -0x1.4e3b24805031p6 0x1.829418ccd5863p5 +REG epsg:7629 0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 +REG epsg:7629 1 -0x1.7f2d96ac67099p6 0x1.278e38e38e38ep5 +REG epsg:7629 2 -0x1.496652922cdfbp6 0x1.278e38e38e38ep5 +REG epsg:7629 3 -0x1.7f2d96ac67099p6 0x1.778e38e38e38ep5 +REG epsg:7629 4 -0x1.496652922cdfbp6 0x1.778e38e38e38ep5 +REG epsg:7630 0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 +REG epsg:7630 1 -0x1.880842b7f221p6 0x1.375b05b05b05ap5 +REG epsg:7630 2 -0x1.508045d096678p6 0x1.375b05b05b05ap5 +REG epsg:7630 3 -0x1.880842b7f221p6 0x1.875b05b05b05ap5 +REG epsg:7630 4 -0x1.508045d096678p6 0x1.875b05b05b05ap5 +REG epsg:7631 0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 +REG epsg:7631 1 -0x1.82ddd6c83a2abp6 0x1.2e8e38e38e38fp5 +REG epsg:7631 2 -0x1.4c555c6af9089p6 0x1.2e8e38e38e38fp5 +REG epsg:7631 3 -0x1.82ddd6c83a2abp6 0x1.7e8e38e38e38fp5 +REG epsg:7631 4 -0x1.4c555c6af9089p6 0x1.7e8e38e38e38fp5 +REG epsg:7632 0 -0x1.6c77777777777p6 0x1.6f33672c63c93p5 +REG epsg:7632 1 -0x1.8934b933d2a2cp6 0x1.4733672c63c93p5 +REG epsg:7632 2 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c93p5 +REG epsg:7632 3 -0x1.8934b933d2a2cp6 0x1.9733672c63c93p5 +REG epsg:7632 4 -0x1.4fba35bb1c4c2p6 0x1.9733672c63c93p5 +REG epsg:7633 0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 +REG epsg:7633 1 -0x1.7e3e1003b1f4fp6 0x1.3849f49f49f4ap5 +REG epsg:7633 2 -0x1.469a1d7f26389p6 0x1.3849f49f49f4ap5 +REG epsg:7633 3 -0x1.7e3e1003b1f4fp6 0x1.8849f49f49f4ap5 +REG epsg:7633 4 -0x1.469a1d7f26389p6 0x1.8849f49f49f4ap5 +REG epsg:7634 0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 +REG epsg:7634 1 -0x1.8e5a81cace66cp6 0x1.3849f49f49f4ap5 +REG epsg:7634 2 -0x1.56b68f4642aa6p6 0x1.3849f49f49f4ap5 +REG epsg:7634 3 -0x1.8e5a81cace66cp6 0x1.8849f49f49f4ap5 +REG epsg:7634 4 -0x1.56b68f4642aa6p6 0x1.8849f49f49f4ap5 +REG epsg:7635 0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc5949p5 +REG epsg:7635 1 -0x1.864e48bbb4894p6 0x1.416c2dfc5949p5 +REG epsg:7635 2 -0x1.4d8f95222954ap6 0x1.416c2dfc5949p5 +REG epsg:7635 3 -0x1.864e48bbb4894p6 0x1.916c2dfc5949p5 +REG epsg:7635 4 -0x1.4d8f95222954ap6 0x1.916c2dfc5949p5 +REG epsg:7636 0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 +REG epsg:7636 1 -0x1.88e29dc64a41dp6 0x1.3149f49f49f4ap5 +REG epsg:7636 2 -0x1.520c5128a4ad1p6 0x1.3149f49f49f4ap5 +REG epsg:7636 3 -0x1.88e29dc64a41dp6 0x1.8149f49f49f4ap5 +REG epsg:7636 4 -0x1.520c5128a4ad1p6 0x1.8149f49f49f4ap5 +REG epsg:7637 0 -0x1.6b22222222222p6 0x1.5c99aadeb1d67p5 +REG epsg:7637 1 -0x1.86bd58a47e612p6 0x1.3499aadeb1d67p5 +REG epsg:7637 2 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d67p5 +REG epsg:7637 3 -0x1.86bd58a47e612p6 0x1.8499aadeb1d67p5 +REG epsg:7637 4 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1d67p5 +REG epsg:7638 0 -0x1.65f49f49f49f5p6 0x1.709f6cb8f8fbep5 +REG epsg:7638 1 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fbep5 +REG epsg:7638 2 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fbep5 +REG epsg:7638 3 -0x1.82c98af483fbdp6 0x1.989f6cb8f8fbep5 +REG epsg:7638 4 -0x1.491fb39f6542dp6 0x1.989f6cb8f8fbep5 +REG epsg:7639 0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24dcp5 +REG epsg:7639 1 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24dcp5 +REG epsg:7639 2 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24dcp5 +REG epsg:7639 3 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a24dcp5 +REG epsg:7639 4 -0x1.46f74b6659832p6 0x1.7d5b0ef1a24dcp5 +REG epsg:7640 0 -0x1.6f22222222222p6 0x1.6fb0940623775p5 +REG epsg:7640 1 -0x1.8be7808f8d268p6 0x1.47b0940623775p5 +REG epsg:7640 2 -0x1.525cc3b4b71dcp6 0x1.47b0940623775p5 +REG epsg:7640 3 -0x1.8be7808f8d268p6 0x1.97b0940623775p5 +REG epsg:7640 4 -0x1.525cc3b4b71dcp6 0x1.97b0940623775p5 +REG epsg:7641 0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 +REG epsg:7641 1 -0x1.7b90d25883c9ep6 0x1.2f582d82d82d7p5 +REG epsg:7641 2 -0x1.44f205d4ff0e4p6 0x1.2f582d82d82d7p5 +REG epsg:7641 3 -0x1.7b90d25883c9ep6 0x1.7f582d82d82d7p5 +REG epsg:7641 4 -0x1.44f205d4ff0e4p6 0x1.7f582d82d82d7p5 +REG epsg:7642 0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 +REG epsg:7642 1 -0x1.7c0e988dd8825p6 0x1.2c8e38e38e38fp5 +REG epsg:7642 2 -0x1.45be343ef44a7p6 0x1.2c8e38e38e38fp5 +REG epsg:7642 3 -0x1.7c0e988dd8825p6 0x1.7c8e38e38e38fp5 +REG epsg:7642 4 -0x1.45be343ef44a7p6 0x1.7c8e38e38e38fp5 +REG epsg:7643 0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 +REG epsg:7643 1 -0x1.7ecd63d604231p6 0x1.335cba9876543p5 +REG epsg:7643 2 -0x1.47bb24b284657p6 0x1.335cba9876543p5 +REG epsg:7643 3 -0x1.7ecd63d604231p6 0x1.835cba9876543p5 +REG epsg:7643 4 -0x1.47bb24b284657p6 0x1.835cba9876543p5 +REG epsg:7644 0 -0x1.64f7777777778p6 0x1.60e95b7ef36cdp5 +REG epsg:7644 1 -0x1.80d2d057ececp6 0x1.38e95b7ef36cdp5 +REG epsg:7644 2 -0x1.491c1e970203p6 0x1.38e95b7ef36cdp5 +REG epsg:7644 3 -0x1.80d2d057ececp6 0x1.88e95b7ef36cdp5 +REG epsg:7644 4 -0x1.491c1e970203p6 0x1.88e95b7ef36cdp5 +REG epsg:7645 0 -0x1.68p6 0x1.62e6987417888p5 +REG epsg:7645 1 -0x1.83f98c2283b1ap6 0x1.3ae6987417888p5 +REG epsg:7645 2 -0x1.4c0673dd7c4e6p6 0x1.3ae6987417888p5 +REG epsg:7645 3 -0x1.83f98c2283b1ap6 0x1.8ae6987417888p5 +REG epsg:7645 4 -0x1.4c0673dd7c4e6p6 0x1.8ae6987417888p5 +REG epsg:7656 0 0x0.0p0 0x0.0p0 +REG epsg:7656 1 -0x1.4p2 -0x1.4p2 +REG epsg:7656 2 0x1.4p2 -0x1.4p2 +REG epsg:7656 3 -0x1.4p2 0x1.4p2 +REG epsg:7656 4 0x1.4p2 0x1.4p2 +REG epsg:7658 0 0x0.0p0 0x0.0p0 +REG epsg:7658 1 -0x1.4p2 -0x1.4p2 +REG epsg:7658 2 0x1.4p2 -0x1.4p2 +REG epsg:7658 3 -0x1.4p2 0x1.4p2 +REG epsg:7658 4 0x1.4p2 0x1.4p2 +REG epsg:7660 0 0x0.0p0 0x0.0p0 +REG epsg:7660 1 -0x1.4p2 -0x1.4p2 +REG epsg:7660 2 0x1.4p2 -0x1.4p2 +REG epsg:7660 3 -0x1.4p2 0x1.4p2 +REG epsg:7660 4 0x1.4p2 0x1.4p2 +REG epsg:7662 0 0x0.0p0 0x0.0p0 +REG epsg:7662 1 -0x1.4p2 -0x1.4p2 +REG epsg:7662 2 0x1.4p2 -0x1.4p2 +REG epsg:7662 3 -0x1.4p2 0x1.4p2 +REG epsg:7662 4 0x1.4p2 0x1.4p2 +REG epsg:7664 0 0x0.0p0 0x0.0p0 +REG epsg:7664 1 -0x1.4p2 -0x1.4p2 +REG epsg:7664 2 0x1.4p2 -0x1.4p2 +REG epsg:7664 3 -0x1.4p2 0x1.4p2 +REG epsg:7664 4 0x1.4p2 0x1.4p2 +REG epsg:7677 0 0x0.0p0 0x0.0p0 +REG epsg:7677 1 -0x1.4p2 -0x1.4p2 +REG epsg:7677 2 0x1.4p2 -0x1.4p2 +REG epsg:7677 3 -0x1.4p2 0x1.4p2 +REG epsg:7677 4 0x1.4p2 0x1.4p2 +REG epsg:7679 0 0x0.0p0 0x0.0p0 +REG epsg:7679 1 -0x1.4p2 -0x1.4p2 +REG epsg:7679 2 0x1.4p2 -0x1.4p2 +REG epsg:7679 3 -0x1.4p2 0x1.4p2 +REG epsg:7679 4 0x1.4p2 0x1.4p2 +REG epsg:7681 0 0x0.0p0 0x0.0p0 +REG epsg:7681 1 -0x1.4p2 -0x1.4p2 +REG epsg:7681 2 0x1.4p2 -0x1.4p2 +REG epsg:7681 3 -0x1.4p2 0x1.4p2 +REG epsg:7681 4 0x1.4p2 0x1.4p2 +REG epsg:7683 0 0x0.0p0 0x0.0p0 +REG epsg:7683 1 -0x1.4p2 -0x1.4p2 +REG epsg:7683 2 0x1.4p2 -0x1.4p2 +REG epsg:7683 3 -0x1.4p2 0x1.4p2 +REG epsg:7683 4 0x1.4p2 0x1.4p2 +REG epsg:7684 0 0x0.0p0 0x0.0p0 +REG epsg:7684 1 -0x1.4p2 -0x1.4p2 +REG epsg:7684 2 0x1.4p2 -0x1.4p2 +REG epsg:7684 3 -0x1.4p2 0x1.4p2 +REG epsg:7684 4 0x1.4p2 0x1.4p2 +REG epsg:7686 0 0x0.0p0 0x0.0p0 +REG epsg:7686 1 -0x1.4p2 -0x1.4p2 +REG epsg:7686 2 0x1.4p2 -0x1.4p2 +REG epsg:7686 3 -0x1.4p2 0x1.4p2 +REG epsg:7686 4 0x1.4p2 0x1.4p2 +REG epsg:7692 0 0x1.1211111111111p6 0x0.0p0 +REG epsg:7692 1 0x1.fc22222222222p5 -0x1.4p2 +REG epsg:7692 2 0x1.2611111111111p6 -0x1.4p2 +REG epsg:7692 3 0x1.fc22222222222p5 0x1.4p2 +REG epsg:7692 4 0x1.2611111111111p6 0x1.4p2 +REG epsg:7693 0 0x1.1e11111111111p6 0x0.0p0 +REG epsg:7693 1 0x1.0a11111111111p6 -0x1.4p2 +REG epsg:7693 2 0x1.3211111111111p6 -0x1.4p2 +REG epsg:7693 3 0x1.0a11111111111p6 0x1.4p2 +REG epsg:7693 4 0x1.3211111111111p6 0x1.4p2 +REG epsg:7694 0 0x1.2a11111111111p6 0x0.0p0 +REG epsg:7694 1 0x1.1611111111111p6 -0x1.4p2 +REG epsg:7694 2 0x1.3e11111111111p6 -0x1.4p2 +REG epsg:7694 3 0x1.1611111111111p6 0x1.4p2 +REG epsg:7694 4 0x1.3e11111111111p6 0x1.4p2 +REG epsg:7695 0 0x1.3611111111111p6 0x0.0p0 +REG epsg:7695 1 0x1.2211111111111p6 -0x1.4p2 +REG epsg:7695 2 0x1.4a11111111111p6 -0x1.4p2 +REG epsg:7695 3 0x1.2211111111111p6 0x1.4p2 +REG epsg:7695 4 0x1.4a11111111111p6 0x1.4p2 +REG epsg:7696 0 0x1.4211111111111p6 0x0.0p0 +REG epsg:7696 1 0x1.2e11111111111p6 -0x1.4p2 +REG epsg:7696 2 0x1.5611111111111p6 -0x1.4p2 +REG epsg:7696 3 0x1.2e11111111111p6 0x1.4p2 +REG epsg:7696 4 0x1.5611111111111p6 0x1.4p2 +REG epsg:7755 0 0x1.4p6 0x1.7d2a83ed77c6ap4 +REG epsg:7755 1 0x1.fcd2d519bd2f9p5 0x1.1a5507daef8d4p3 +REG epsg:7755 2 0x1.8196957321684p6 0x1.1a5507daef8d4p3 +REG epsg:7755 3 0x1.fcd2d519bd2f9p5 0x1.369541f6bbe35p5 +REG epsg:7755 4 0x1.8196957321684p6 0x1.369541f6bbe35p5 +REG epsg:7756 0 0x1.438p6 0x1.04p4 +REG epsg:7756 1 0x1.2eaaf19126ed8p6 0x1.68p3 +REG epsg:7756 2 0x1.58550e6ed9128p6 0x1.68p3 +REG epsg:7756 3 0x1.2eaaf19126ed8p6 0x1.54p4 +REG epsg:7756 4 0x1.58550e6ed9128p6 0x1.54p4 +REG epsg:7757 0 0x1.7ap6 0x1.cp4 +REG epsg:7757 1 0x1.70f07f1cfee46p6 0x1.ap4 +REG epsg:7757 2 0x1.830f80e3011bap6 0x1.ap4 +REG epsg:7757 3 0x1.70f07f1cfee46p6 0x1.ep4 +REG epsg:7757 4 0x1.830f80e3011bap6 0x1.ep4 +REG epsg:7758 0 0x1.73p6 0x1.ap4 +REG epsg:7758 1 0x1.6721dadf2cb98p6 0x1.7555555555558p4 +REG epsg:7758 2 0x1.7ede2520d3468p6 0x1.7555555555558p4 +REG epsg:7758 3 0x1.6721dadf2cb98p6 0x1.caaaaaaaaaaa8p4 +REG epsg:7758 4 0x1.7ede2520d3468p6 0x1.caaaaaaaaaaa8p4 +REG epsg:7759 0 0x1.578p6 0x1.9ep4 +REG epsg:7759 1 0x1.4c62c2815abcdp6 0x1.76p4 +REG epsg:7759 2 0x1.629d3d7ea5433p6 0x1.76p4 +REG epsg:7759 3 0x1.4c62c2815abcdp6 0x1.c6p4 +REG epsg:7759 4 0x1.629d3d7ea5433p6 0x1.c6p4 +REG epsg:7760 0 0x1.34p6 0x1.cap4 +REG epsg:7760 1 0x1.2f7169a8c59eap6 0x1.bap4 +REG epsg:7760 2 0x1.388e96573a616p6 0x1.bap4 +REG epsg:7760 3 0x1.2f7169a8c59eap6 0x1.dap4 +REG epsg:7760 4 0x1.388e96573a616p6 0x1.dap4 +REG epsg:7761 0 0x1.1d8p6 0x1.66p4 +REG epsg:7761 1 0x1.0fcd52ccb0e41p6 0x1.3355555555558p4 +REG epsg:7761 2 0x1.2b32ad334f1bfp6 0x1.3355555555558p4 +REG epsg:7761 3 0x1.0fcd52ccb0e41p6 0x1.98aaaaaaaaaa8p4 +REG epsg:7761 4 0x1.2b32ad334f1bfp6 0x1.98aaaaaaaaaa8p4 +REG epsg:7762 0 0x1.3p6 0x1.d4p4 +REG epsg:7762 1 0x1.254d7f1d4f983p6 0x1.aeaaaaaaaaaa8p4 +REG epsg:7762 2 0x1.3ab280e2b067dp6 0x1.aeaaaaaaaaaa8p4 +REG epsg:7762 3 0x1.254d7f1d4f983p6 0x1.f955555555558p4 +REG epsg:7762 4 0x1.3ab280e2b067dp6 0x1.f955555555558p4 +REG epsg:7763 0 0x1.358p6 0x1.fcp4 +REG epsg:7763 1 0x1.2c179613c9c13p6 0x1.dcp4 +REG epsg:7763 2 0x1.3ee869ec363edp6 0x1.dcp4 +REG epsg:7763 3 0x1.2c179613c9c13p6 0x1.0ep5 +REG epsg:7763 4 0x1.3ee869ec363edp6 0x1.0ep5 +REG epsg:7764 0 0x1.32p6 0x1.16p5 +REG epsg:7764 1 0x1.21c5bdf63f5c3p6 0x1.f6aaaaaaaaabp4 +REG epsg:7764 2 0x1.423a4209c0a3dp6 0x1.f6aaaaaaaaabp4 +REG epsg:7764 3 0x1.21c5bdf63f5c3p6 0x1.30aaaaaaaaaa8p5 +REG epsg:7764 4 0x1.423a4209c0a3dp6 0x1.30aaaaaaaaaa8p5 +REG epsg:7765 0 0x1.568p6 0x1.7ap4 +REG epsg:7765 1 0x1.4d0a5f290c435p6 0x1.5755555555558p4 +REG epsg:7765 2 0x1.5ff5a0d6f3bcbp6 0x1.5755555555558p4 +REG epsg:7765 3 0x1.4d0a5f290c435p6 0x1.9caaaaaaaaaa8p4 +REG epsg:7765 4 0x1.5ff5a0d6f3bcbp6 0x1.9caaaaaaaaaa8p4 +REG epsg:7766 0 0x1.398p6 0x1.8p4 +REG epsg:7766 1 0x1.27fc5eab6cd27p6 0x1.4p4 +REG epsg:7766 2 0x1.4b03a154932d9p6 0x1.4p4 +REG epsg:7766 3 0x1.27fc5eab6cd27p6 0x1.cp4 +REG epsg:7766 4 0x1.4b03a154932d9p6 0x1.cp4 +REG epsg:7767 0 0x1.33p6 0x1.2ep4 +REG epsg:7767 1 0x1.1ffa216e0c358p6 0x1.ccp3 +REG epsg:7767 2 0x1.4605de91f3ca8p6 0x1.ccp3 +REG epsg:7767 3 0x1.1ffa216e0c358p6 0x1.76p4 +REG epsg:7767 4 0x1.4605de91f3ca8p6 0x1.76p4 +REG epsg:7768 0 0x1.78p6 0x1.8cp4 +REG epsg:7768 1 0x1.722090e4bb27ep6 0x1.76aaaaaaaaaa8p4 +REG epsg:7768 2 0x1.7ddf6f1b44d82p6 0x1.76aaaaaaaaaa8p4 +REG epsg:7768 3 0x1.722090e4bb27ep6 0x1.a155555555558p4 +REG epsg:7768 4 0x1.7ddf6f1b44d82p6 0x1.a155555555558p4 +REG epsg:7769 0 0x1.6d8p6 0x1.9ap4 +REG epsg:7769 1 0x1.69104bf1b763bp6 0x1.8ap4 +REG epsg:7769 2 0x1.71efb40e489c5p6 0x1.8ap4 +REG epsg:7769 3 0x1.69104bf1b763bp6 0x1.aap4 +REG epsg:7769 4 0x1.71efb40e489c5p6 0x1.aap4 +REG epsg:7770 0 0x1.798p6 0x1.a2p4 +REG epsg:7770 1 0x1.72d1380df77fp6 0x1.8ap4 +REG epsg:7770 2 0x1.802ec7f20881p6 0x1.8ap4 +REG epsg:7770 3 0x1.72d1380df77fp6 0x1.bap4 +REG epsg:7770 4 0x1.802ec7f20881p6 0x1.bap4 +REG epsg:7771 0 0x1.76p6 0x1.9ap4 +REG epsg:7771 1 0x1.5f14330b88d86p6 0x1.4755555555558p4 +REG epsg:7771 2 0x1.8cebccf47727ap6 0x1.4755555555558p4 +REG epsg:7771 3 0x1.5f14330b88d86p6 0x1.ecaaaaaaaaaa8p4 +REG epsg:7771 4 0x1.8cebccf47727ap6 0x1.ecaaaaaaaaaa8p4 +REG epsg:7772 0 0x1.518p6 0x1.44p4 +REG epsg:7772 1 0x1.4349cb4492dc6p6 0x1.0eaaaaaaaaaa8p4 +REG epsg:7772 2 0x1.5fb634bb6d23ap6 0x1.0eaaaaaaaaaa8p4 +REG epsg:7772 3 0x1.4349cb4492dc6p6 0x1.7955555555558p4 +REG epsg:7772 4 0x1.5fb634bb6d23ap6 0x1.7955555555558p4 +REG epsg:7773 0 0x1.2d8p6 0x1.fp4 +REG epsg:7773 1 0x1.242abc1c044f7p6 0x1.dp4 +REG epsg:7773 2 0x1.36d543e3fbb09p6 0x1.dp4 +REG epsg:7773 3 0x1.242abc1c044f7p6 0x1.08p5 +REG epsg:7773 4 0x1.36d543e3fbb09p6 0x1.08p5 +REG epsg:7774 0 0x1.278p6 0x1.aep4 +REG epsg:7774 1 0x1.1054b9a2e2133p6 0x1.5b55555555558p4 +REG epsg:7774 2 0x1.3eab465d1decdp6 0x1.5b55555555558p4 +REG epsg:7774 3 0x1.1054b9a2e2133p6 0x1.0055555555554p5 +REG epsg:7774 4 0x1.3eab465d1decdp6 0x1.0055555555554p5 +REG epsg:7775 0 0x1.438p6 0x1.b2p4 +REG epsg:7775 1 0x1.2f468d95d58b7p6 0x1.6ap4 +REG epsg:7775 2 0x1.57b9726a2a749p6 0x1.6ap4 +REG epsg:7775 3 0x1.2f468d95d58b7p6 0x1.fap4 +REG epsg:7775 4 0x1.57b9726a2a749p6 0x1.fap4 +REG epsg:7776 0 0x1.3d8p6 0x1.ep4 +REG epsg:7776 1 0x1.34432c5d37e67p6 0x1.cp4 +REG epsg:7776 2 0x1.46bcd3a2c8199p6 0x1.cp4 +REG epsg:7776 3 0x1.34432c5d37e67p6 0x1.0p5 +REG epsg:7776 4 0x1.46bcd3a2c8199p6 0x1.0p5 +REG epsg:7777 0 0x1.75p6 0x1.48p3 +REG epsg:7777 1 0x1.60acf691c7fa2p6 0x1.5p2 +REG epsg:7777 2 0x1.8953096e3805ep6 0x1.5p2 +REG epsg:7777 3 0x1.60acf691c7fa2p6 0x1.e8p3 +REG epsg:7777 4 0x1.8953096e3805ep6 0x1.e8p3 +REG epsg:7778 0 0x1.49p6 0x1.5p4 +REG epsg:7778 1 0x1.3393bcd57d18cp6 0x1.0p4 +REG epsg:7778 2 0x1.5e6c432a82e74p6 0x1.0p4 +REG epsg:7778 3 0x1.3393bcd57d18cp6 0x1.ap4 +REG epsg:7778 4 0x1.5e6c432a82e74p6 0x1.ap4 +REG epsg:7779 0 0x1.28p6 0x1.ecp3 +REG epsg:7779 1 0x1.1341f5bf3c2f9p6 0x1.4cp3 +REG epsg:7779 2 0x1.3cbe0a40c3d07p6 0x1.4cp3 +REG epsg:7779 3 0x1.1341f5bf3c2f9p6 0x1.46p4 +REG epsg:7779 4 0x1.3cbe0a40c3d07p6 0x1.46p4 +REG epsg:7780 0 0x1.318p6 0x1.e4p3 +REG epsg:7780 1 0x1.1cc845dda8184p6 0x1.44p3 +REG epsg:7780 2 0x1.4637ba2257e7cp6 0x1.44p3 +REG epsg:7780 3 0x1.1cc845dda8184p6 0x1.42p4 +REG epsg:7780 4 0x1.4637ba2257e7cp6 0x1.42p4 +REG epsg:7781 0 0x1.3p6 0x1.5p3 +REG epsg:7781 1 0x1.1ba8ce1709f7fp6 0x1.6p2 +REG epsg:7781 2 0x1.445731e8f6081p6 0x1.6p2 +REG epsg:7781 3 0x1.1ba8ce1709f7fp6 0x1.fp3 +REG epsg:7781 4 0x1.445731e8f6081p6 0x1.fp3 +REG epsg:7782 0 0x1.248p6 0x1.4p3 +REG epsg:7782 1 0x1.103104080140cp6 0x1.4p2 +REG epsg:7782 2 0x1.38cefbf7febf4p6 0x1.4p2 +REG epsg:7782 3 0x1.103104080140cp6 0x1.ep3 +REG epsg:7782 4 0x1.38cefbf7febf4p6 0x1.ep3 +REG epsg:7783 0 0x1.73p6 0x1.72p4 +REG epsg:7783 1 0x1.5d40aa7ab65a3p6 0x1.22p4 +REG epsg:7783 2 0x1.88bf558549a5dp6 0x1.22p4 +REG epsg:7783 3 0x1.5d40aa7ab65a3p6 0x1.c2p4 +REG epsg:7783 4 0x1.88bf558549a5dp6 0x1.c2p4 +REG epsg:7784 0 0x1.62p6 0x1.bap4 +REG epsg:7784 1 0x1.4b6d3a4c4aab1p6 0x1.6ap4 +REG epsg:7784 2 0x1.7892c5b3b554fp6 0x1.6ap4 +REG epsg:7784 3 0x1.4b6d3a4c4aab1p6 0x1.05p5 +REG epsg:7784 4 0x1.7892c5b3b554fp6 0x1.05p5 +REG epsg:7785 0 0x1.398p6 0x1.5cp3 +REG epsg:7785 1 0x1.25225e7b38bcfp6 0x1.78p2 +REG epsg:7785 2 0x1.4ddda184c7431p6 0x1.78p2 +REG epsg:7785 3 0x1.25225e7b38bcfp6 0x1.fcp3 +REG epsg:7785 4 0x1.4ddda184c7431p6 0x1.fcp3 +REG epsg:7786 0 0x1.6fp6 0x1.7cp4 +REG epsg:7786 1 0x1.59264698c5e67p6 0x1.2cp4 +REG epsg:7786 2 0x1.84d9b9673a199p6 0x1.2cp4 +REG epsg:7786 3 0x1.59264698c5e67p6 0x1.ccp4 +REG epsg:7786 4 0x1.84d9b9673a199p6 0x1.ccp4 +REG epsg:7787 0 0x1.5f8p6 0x1.86p4 +REG epsg:7787 1 0x1.498af6520ee3ep6 0x1.36p4 +REG epsg:7787 2 0x1.757509adf11c2p6 0x1.36p4 +REG epsg:7787 3 0x1.498af6520ee3ep6 0x1.d6p4 +REG epsg:7787 4 0x1.757509adf11c2p6 0x1.d6p4 +REG epsg:7789 0 0x0.0p0 0x0.0p0 +REG epsg:7789 1 -0x1.4p2 -0x1.4p2 +REG epsg:7789 2 0x1.4p2 -0x1.4p2 +REG epsg:7789 3 -0x1.4p2 0x1.4p2 +REG epsg:7789 4 0x1.4p2 0x1.4p2 +REG epsg:7791 0 0x1.2p3 0x0.0p0 +REG epsg:7791 1 0x1.0p2 -0x1.4p2 +REG epsg:7791 2 0x1.cp3 -0x1.4p2 +REG epsg:7791 3 0x1.0p2 0x1.4p2 +REG epsg:7791 4 0x1.cp3 0x1.4p2 +REG epsg:7792 0 0x1.ep3 0x0.0p0 +REG epsg:7792 1 0x1.4p3 -0x1.4p2 +REG epsg:7792 2 0x1.4p4 -0x1.4p2 +REG epsg:7792 3 0x1.4p3 0x1.4p2 +REG epsg:7792 4 0x1.4p4 0x1.4p2 +REG epsg:7793 0 0x1.5p4 0x0.0p0 +REG epsg:7793 1 0x1.0p4 -0x1.4p2 +REG epsg:7793 2 0x1.ap4 -0x1.4p2 +REG epsg:7793 3 0x1.0p4 0x1.4p2 +REG epsg:7793 4 0x1.ap4 0x1.4p2 +REG epsg:7794 0 0x1.8p3 0x0.0p0 +REG epsg:7794 1 0x1.cp2 -0x1.4p2 +REG epsg:7794 2 0x1.1p4 -0x1.4p2 +REG epsg:7794 3 0x1.cp2 0x1.4p2 +REG epsg:7794 4 0x1.1p4 0x1.4p2 +REG epsg:7795 0 0x1.8p3 0x0.0p0 +REG epsg:7795 1 0x1.cp2 -0x1.4p2 +REG epsg:7795 2 0x1.1p4 -0x1.4p2 +REG epsg:7795 3 0x1.cp2 0x1.4p2 +REG epsg:7795 4 0x1.1p4 0x1.4p2 +REG epsg:7796 0 0x0.0p0 0x0.0p0 +REG epsg:7796 1 -0x1.4p2 -0x1.4p2 +REG epsg:7796 2 0x1.4p2 -0x1.4p2 +REG epsg:7796 3 -0x1.4p2 0x1.4p2 +REG epsg:7796 4 0x1.4p2 0x1.4p2 +REG epsg:7798 0 0x0.0p0 0x0.0p0 +REG epsg:7798 1 -0x1.4p2 -0x1.4p2 +REG epsg:7798 2 0x1.4p2 -0x1.4p2 +REG epsg:7798 3 -0x1.4p2 0x1.4p2 +REG epsg:7798 4 0x1.4p2 0x1.4p2 +REG epsg:7799 0 0x1.5p4 0x0.0p0 +REG epsg:7799 1 0x1.0p4 -0x1.4p2 +REG epsg:7799 2 0x1.ap4 -0x1.4p2 +REG epsg:7799 3 0x1.0p4 0x1.4p2 +REG epsg:7799 4 0x1.ap4 0x1.4p2 +REG epsg:7800 0 0x1.bp4 0x0.0p0 +REG epsg:7800 1 0x1.6p4 -0x1.4p2 +REG epsg:7800 2 0x1.0p5 -0x1.4p2 +REG epsg:7800 3 0x1.6p4 0x1.4p2 +REG epsg:7800 4 0x1.0p5 0x1.4p2 +REG epsg:7801 0 0x1.98p4 0x1.5555555555556p5 +REG epsg:7801 1 0x1.7afcbcb101444p4 0x1.4aaaaaaaaaaaap5 +REG epsg:7801 2 0x1.b503434efebbcp4 0x1.4aaaaaaaaaaaap5 +REG epsg:7801 3 0x1.7afcbcb101444p4 0x1.6000000000002p5 +REG epsg:7801 4 0x1.b503434efebbcp4 0x1.6000000000002p5 +REG epsg:7803 0 0x1.5p4 0x0.0p0 +REG epsg:7803 1 0x1.0p4 -0x1.4p2 +REG epsg:7803 2 0x1.ap4 -0x1.4p2 +REG epsg:7803 3 0x1.0p4 0x1.4p2 +REG epsg:7803 4 0x1.ap4 0x1.4p2 +REG epsg:7804 0 0x1.5p4 0x0.0p0 +REG epsg:7804 1 0x1.0p4 -0x1.4p2 +REG epsg:7804 2 0x1.ap4 -0x1.4p2 +REG epsg:7804 3 0x1.0p4 0x1.4p2 +REG epsg:7804 4 0x1.ap4 0x1.4p2 +REG epsg:7805 0 0x1.08p5 0x0.0p0 +REG epsg:7805 1 0x1.cp4 -0x1.4p2 +REG epsg:7805 2 0x1.3p5 -0x1.4p2 +REG epsg:7805 3 0x1.cp4 0x1.4p2 +REG epsg:7805 4 0x1.3p5 0x1.4p2 +REG epsg:7815 0 0x0.0p0 0x0.0p0 +REG epsg:7815 1 -0x1.4p2 -0x1.4p2 +REG epsg:7815 2 0x1.4p2 -0x1.4p2 +REG epsg:7815 3 -0x1.4p2 0x1.4p2 +REG epsg:7815 4 0x1.4p2 0x1.4p2 +REG epsg:7825 0 0x1.78p4 0x1.5555555555555p-4 +REG epsg:7825 1 0x1.27fffa7460f12p4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7825 2 0x1.c800058b9f0eep4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7825 3 0x1.27fffa7460f12p4 0x1.4555555555555p2 +REG epsg:7825 4 0x1.c800058b9f0eep4 0x1.4555555555555p2 +REG epsg:7826 0 0x1.a8p4 0x1.5555555555555p-4 +REG epsg:7826 1 0x1.57fffa7460f12p4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7826 2 0x1.f800058b9f0eep4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7826 3 0x1.57fffa7460f12p4 0x1.4555555555555p2 +REG epsg:7826 4 0x1.f800058b9f0eep4 0x1.4555555555555p2 +REG epsg:7827 0 0x1.d8p4 0x1.5555555555555p-4 +REG epsg:7827 1 0x1.87fffa7460f12p4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7827 2 0x1.140002c5cf877p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7827 3 0x1.87fffa7460f12p4 0x1.4555555555555p2 +REG epsg:7827 4 0x1.140002c5cf877p5 0x1.4555555555555p2 +REG epsg:7828 0 0x1.04p5 0x1.5555555555555p-4 +REG epsg:7828 1 0x1.b7fffa7460f12p4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7828 2 0x1.2c0002c5cf877p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7828 3 0x1.b7fffa7460f12p4 0x1.4555555555555p2 +REG epsg:7828 4 0x1.2c0002c5cf877p5 0x1.4555555555555p2 +REG epsg:7829 0 0x1.1cp5 0x1.5555555555555p-4 +REG epsg:7829 1 0x1.e7fffa7460f12p4 -0x1.3aaaaaaaaaaabp2 +REG epsg:7829 2 0x1.440002c5cf877p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7829 3 0x1.e7fffa7460f12p4 0x1.4555555555555p2 +REG epsg:7829 4 0x1.440002c5cf877p5 0x1.4555555555555p2 +REG epsg:7830 0 0x1.34p5 0x1.5555555555555p-4 +REG epsg:7830 1 0x1.0bfffd3a30789p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7830 2 0x1.5c0002c5cf877p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7830 3 0x1.0bfffd3a30789p5 0x1.4555555555555p2 +REG epsg:7830 4 0x1.5c0002c5cf877p5 0x1.4555555555555p2 +REG epsg:7831 0 0x1.4cp5 0x1.5555555555555p-4 +REG epsg:7831 1 0x1.23fffd3a30789p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7831 2 0x1.740002c5cf877p5 -0x1.3aaaaaaaaaaabp2 +REG epsg:7831 3 0x1.23fffd3a30789p5 0x1.4555555555555p2 +REG epsg:7831 4 0x1.740002c5cf877p5 0x1.4555555555555p2 +REG epsg:7842 0 0x0.0p0 0x0.0p0 +REG epsg:7842 1 -0x1.4p2 -0x1.4p2 +REG epsg:7842 2 0x1.4p2 -0x1.4p2 +REG epsg:7842 3 -0x1.4p2 0x1.4p2 +REG epsg:7842 4 0x1.4p2 0x1.4p2 +REG epsg:7844 0 0x0.0p0 0x0.0p0 +REG epsg:7844 1 -0x1.4p2 -0x1.4p2 +REG epsg:7844 2 0x1.4p2 -0x1.4p2 +REG epsg:7844 3 -0x1.4p2 0x1.4p2 +REG epsg:7844 4 0x1.4p2 0x1.4p2 +REG epsg:7845 0 0x1.0cp7 -0x1.2p4 +REG epsg:7845 1 0x1.d8e98a4ce3089p6 -0x1.08p5 +REG epsg:7845 2 0x1.2b8b3ad98e7bcp7 -0x1.08p5 +REG epsg:7845 3 0x1.d8e98a4ce3089p6 -0x1.8p1 +REG epsg:7845 4 0x1.2b8b3ad98e7bcp7 -0x1.8p1 +REG epsg:7846 0 0x1.74p6 -0x1.9p4 +REG epsg:7846 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG epsg:7846 2 0x1.8a114b818572ep6 -0x1.ep4 +REG epsg:7846 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG epsg:7846 4 0x1.8a114b818572ep6 -0x1.4p4 +REG epsg:7847 0 0x1.8cp6 -0x1.9p4 +REG epsg:7847 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG epsg:7847 2 0x1.a2114b818572ep6 -0x1.ep4 +REG epsg:7847 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG epsg:7847 4 0x1.a2114b818572ep6 -0x1.4p4 +REG epsg:7848 0 0x1.a4p6 -0x1.9p4 +REG epsg:7848 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG epsg:7848 2 0x1.ba114b818572ep6 -0x1.ep4 +REG epsg:7848 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG epsg:7848 4 0x1.ba114b818572ep6 -0x1.4p4 +REG epsg:7849 0 0x1.bcp6 -0x1.9p4 +REG epsg:7849 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:7849 2 0x1.d2114b818572ep6 -0x1.ep4 +REG epsg:7849 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:7849 4 0x1.d2114b818572ep6 -0x1.4p4 +REG epsg:7850 0 0x1.d4p6 -0x1.9p4 +REG epsg:7850 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG epsg:7850 2 0x1.ea114b818572ep6 -0x1.ep4 +REG epsg:7850 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG epsg:7850 4 0x1.ea114b818572ep6 -0x1.4p4 +REG epsg:7851 0 0x1.ecp6 -0x1.9p4 +REG epsg:7851 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG epsg:7851 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG epsg:7851 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG epsg:7851 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG epsg:7852 0 0x1.02p7 -0x1.9p4 +REG epsg:7852 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG epsg:7852 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG epsg:7852 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG epsg:7852 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG epsg:7853 0 0x1.0ep7 -0x1.9p4 +REG epsg:7853 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG epsg:7853 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG epsg:7853 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG epsg:7853 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG epsg:7854 0 0x1.1ap7 -0x1.9p4 +REG epsg:7854 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG epsg:7854 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG epsg:7854 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG epsg:7854 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG epsg:7855 0 0x1.26p7 -0x1.9p4 +REG epsg:7855 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG epsg:7855 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG epsg:7855 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG epsg:7855 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG epsg:7856 0 0x1.32p7 -0x1.9p4 +REG epsg:7856 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG epsg:7856 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG epsg:7856 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG epsg:7856 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG epsg:7857 0 0x1.3ep7 -0x1.9p4 +REG epsg:7857 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG epsg:7857 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG epsg:7857 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG epsg:7857 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG epsg:7858 0 0x1.4ap7 -0x1.9p4 +REG epsg:7858 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG epsg:7858 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG epsg:7858 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG epsg:7858 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG epsg:7859 0 0x1.56p7 -0x1.9p4 +REG epsg:7859 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG epsg:7859 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG epsg:7859 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG epsg:7859 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG epsg:7877 0 -0x1.6dddddddddddep2 -0x1.feeeeeeeeeef1p3 +REG epsg:7877 1 -0x1.5d5a7f8c79eacp3 -0x1.4f77777777778p4 +REG epsg:7877 2 -0x1.0835e5163f32p-1 -0x1.4f77777777778p4 +REG epsg:7877 3 -0x1.5d5a7f8c79eacp3 -0x1.5eeeeeeeeeef1p3 +REG epsg:7877 4 -0x1.0835e5163f32p-1 -0x1.5eeeeeeeeeef1p3 +REG epsg:7878 0 -0x1.8p1 -0x1.9p4 +REG epsg:7878 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:7878 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:7878 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:7878 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:7879 0 0x0.0p0 0x0.0p0 +REG epsg:7879 1 -0x1.4p2 -0x1.4p2 +REG epsg:7879 2 0x1.4p2 -0x1.4p2 +REG epsg:7879 3 -0x1.4p2 0x1.4p2 +REG epsg:7879 4 0x1.4p2 0x1.4p2 +REG epsg:7881 0 0x0.0p0 0x0.0p0 +REG epsg:7881 1 -0x1.4p2 -0x1.4p2 +REG epsg:7881 2 0x1.4p2 -0x1.4p2 +REG epsg:7881 3 -0x1.4p2 0x1.4p2 +REG epsg:7881 4 0x1.4p2 0x1.4p2 +REG epsg:7882 0 -0x1.6dddddddddddep2 -0x1.feeeeeeeeeef1p3 +REG epsg:7882 1 -0x1.5d5a7f8c79eacp3 -0x1.4f77777777778p4 +REG epsg:7882 2 -0x1.0835e5163f32p-1 -0x1.4f77777777778p4 +REG epsg:7882 3 -0x1.5d5a7f8c79eacp3 -0x1.5eeeeeeeeeef1p3 +REG epsg:7882 4 -0x1.0835e5163f32p-1 -0x1.5eeeeeeeeeef1p3 +REG epsg:7883 0 -0x1.8p1 -0x1.9p4 +REG epsg:7883 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:7883 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:7883 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:7883 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:7884 0 0x0.0p0 0x0.0p0 +REG epsg:7884 1 -0x1.4p2 -0x1.4p2 +REG epsg:7884 2 0x1.4p2 -0x1.4p2 +REG epsg:7884 3 -0x1.4p2 0x1.4p2 +REG epsg:7884 4 0x1.4p2 0x1.4p2 +REG epsg:7886 0 0x0.0p0 0x0.0p0 +REG epsg:7886 1 -0x1.4p2 -0x1.4p2 +REG epsg:7886 2 0x1.4p2 -0x1.4p2 +REG epsg:7886 3 -0x1.4p2 0x1.4p2 +REG epsg:7886 4 0x1.4p2 0x1.4p2 +REG epsg:7887 0 -0x1.8p1 -0x1.9p4 +REG epsg:7887 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:7887 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:7887 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:7887 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:7899 0 0x1.22p7 -0x1.28p5 +REG epsg:7899 1 0x1.1cfdd02668412p7 -0x1.38p5 +REG epsg:7899 2 0x1.27022fd997beep7 -0x1.38p5 +REG epsg:7899 3 0x1.1cfdd02668412p7 -0x1.18p5 +REG epsg:7899 4 0x1.27022fd997beep7 -0x1.18p5 +REG epsg:7914 0 0x0.0p0 0x0.0p0 +REG epsg:7914 1 -0x1.4p2 -0x1.4p2 +REG epsg:7914 2 0x1.4p2 -0x1.4p2 +REG epsg:7914 3 -0x1.4p2 0x1.4p2 +REG epsg:7914 4 0x1.4p2 0x1.4p2 +REG epsg:7916 0 0x0.0p0 0x0.0p0 +REG epsg:7916 1 -0x1.4p2 -0x1.4p2 +REG epsg:7916 2 0x1.4p2 -0x1.4p2 +REG epsg:7916 3 -0x1.4p2 0x1.4p2 +REG epsg:7916 4 0x1.4p2 0x1.4p2 +REG epsg:7918 0 0x0.0p0 0x0.0p0 +REG epsg:7918 1 -0x1.4p2 -0x1.4p2 +REG epsg:7918 2 0x1.4p2 -0x1.4p2 +REG epsg:7918 3 -0x1.4p2 0x1.4p2 +REG epsg:7918 4 0x1.4p2 0x1.4p2 +REG epsg:7920 0 0x0.0p0 0x0.0p0 +REG epsg:7920 1 -0x1.4p2 -0x1.4p2 +REG epsg:7920 2 0x1.4p2 -0x1.4p2 +REG epsg:7920 3 -0x1.4p2 0x1.4p2 +REG epsg:7920 4 0x1.4p2 0x1.4p2 +REG epsg:7922 0 0x0.0p0 0x0.0p0 +REG epsg:7922 1 -0x1.4p2 -0x1.4p2 +REG epsg:7922 2 0x1.4p2 -0x1.4p2 +REG epsg:7922 3 -0x1.4p2 0x1.4p2 +REG epsg:7922 4 0x1.4p2 0x1.4p2 +REG epsg:7924 0 0x0.0p0 0x0.0p0 +REG epsg:7924 1 -0x1.4p2 -0x1.4p2 +REG epsg:7924 2 0x1.4p2 -0x1.4p2 +REG epsg:7924 3 -0x1.4p2 0x1.4p2 +REG epsg:7924 4 0x1.4p2 0x1.4p2 +REG epsg:7926 0 0x0.0p0 0x0.0p0 +REG epsg:7926 1 -0x1.4p2 -0x1.4p2 +REG epsg:7926 2 0x1.4p2 -0x1.4p2 +REG epsg:7926 3 -0x1.4p2 0x1.4p2 +REG epsg:7926 4 0x1.4p2 0x1.4p2 +REG epsg:7928 0 0x0.0p0 0x0.0p0 +REG epsg:7928 1 -0x1.4p2 -0x1.4p2 +REG epsg:7928 2 0x1.4p2 -0x1.4p2 +REG epsg:7928 3 -0x1.4p2 0x1.4p2 +REG epsg:7928 4 0x1.4p2 0x1.4p2 +REG epsg:7930 0 0x0.0p0 0x0.0p0 +REG epsg:7930 1 -0x1.4p2 -0x1.4p2 +REG epsg:7930 2 0x1.4p2 -0x1.4p2 +REG epsg:7930 3 -0x1.4p2 0x1.4p2 +REG epsg:7930 4 0x1.4p2 0x1.4p2 +REG epsg:7954 0 -0x1.8p1 -0x1.9p4 +REG epsg:7954 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:7954 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:7954 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:7954 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:7955 0 -0x1.8p1 -0x1.9p4 +REG epsg:7955 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:7955 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:7955 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:7955 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:7956 0 -0x1.8p1 -0x1.9p4 +REG epsg:7956 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG epsg:7956 2 0x1.42297030ae5cap1 -0x1.ep4 +REG epsg:7956 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG epsg:7956 4 0x1.42297030ae5cap1 -0x1.4p4 +REG epsg:7991 0 -0x1.3ep6 0x0.0p0 +REG epsg:7991 1 -0x1.52p6 -0x1.4p2 +REG epsg:7991 2 -0x1.2ap6 -0x1.4p2 +REG epsg:7991 3 -0x1.52p6 0x1.4p2 +REG epsg:7991 4 -0x1.2ap6 0x1.4p2 +REG epsg:7992 0 0x1.ep3 -0x1.9p4 +REG epsg:7992 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG epsg:7992 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG epsg:7992 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG epsg:7992 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG epsg:8013 0 0x1.d788888888886p6 0x0.0p0 +REG epsg:8013 1 0x1.c388888888886p6 -0x1.4p2 +REG epsg:8013 2 0x1.eb88888888886p6 -0x1.4p2 +REG epsg:8013 3 0x1.c388888888886p6 0x1.4p2 +REG epsg:8013 4 0x1.eb88888888886p6 0x1.4p2 +REG epsg:8014 0 0x1.cdp6 0x0.0p0 +REG epsg:8014 1 0x1.b9p6 -0x1.4p2 +REG epsg:8014 2 0x1.e1p6 -0x1.4p2 +REG epsg:8014 3 0x1.b9p6 0x1.4p2 +REG epsg:8014 4 0x1.e1p6 0x1.4p2 +REG epsg:8015 0 0x1.e955555555553p6 0x0.0p0 +REG epsg:8015 1 0x1.d555555555553p6 -0x1.4p2 +REG epsg:8015 2 0x1.fd55555555553p6 -0x1.4p2 +REG epsg:8015 3 0x1.d555555555553p6 0x1.4p2 +REG epsg:8015 4 0x1.fd55555555553p6 0x1.4p2 +REG epsg:8016 0 0x1.cdbbbbbbbbbb9p6 0x0.0p0 +REG epsg:8016 1 0x1.b9bbbbbbbbbb9p6 -0x1.4p2 +REG epsg:8016 2 0x1.e1bbbbbbbbbb9p6 -0x1.4p2 +REG epsg:8016 3 0x1.b9bbbbbbbbbb9p6 0x1.4p2 +REG epsg:8016 4 0x1.e1bbbbbbbbbb9p6 0x1.4p2 +REG epsg:8017 0 0x1.c6aaaaaaaaaadp6 0x0.0p0 +REG epsg:8017 1 0x1.b2aaaaaaaaaadp6 -0x1.4p2 +REG epsg:8017 2 0x1.daaaaaaaaaaadp6 -0x1.4p2 +REG epsg:8017 3 0x1.b2aaaaaaaaaadp6 0x1.4p2 +REG epsg:8017 4 0x1.daaaaaaaaaaadp6 0x1.4p2 +REG epsg:8018 0 0x1.a68p6 0x0.0p0 +REG epsg:8018 1 0x1.928p6 -0x1.4p2 +REG epsg:8018 2 0x1.ba8p6 -0x1.4p2 +REG epsg:8018 3 0x1.928p6 0x1.4p2 +REG epsg:8018 4 0x1.ba8p6 0x1.4p2 +REG epsg:8019 0 0x1.838p6 0x0.0p0 +REG epsg:8019 1 0x1.6f8p6 -0x1.4p2 +REG epsg:8019 2 0x1.978p6 -0x1.4p2 +REG epsg:8019 3 0x1.6f8p6 0x1.4p2 +REG epsg:8019 4 0x1.978p6 0x1.4p2 +REG epsg:8020 0 0x1.cfbbbbbbbbbb9p6 0x0.0p0 +REG epsg:8020 1 0x1.bbbbbbbbbbbb9p6 -0x1.4p2 +REG epsg:8020 2 0x1.e3bbbbbbbbbb9p6 -0x1.4p2 +REG epsg:8020 3 0x1.bbbbbbbbbbbb9p6 0x1.4p2 +REG epsg:8020 4 0x1.e3bbbbbbbbbb9p6 0x1.4p2 +REG epsg:8021 0 0x1.e788888888886p6 0x0.0p0 +REG epsg:8021 1 0x1.d388888888886p6 -0x1.4p2 +REG epsg:8021 2 0x1.fb88888888886p6 -0x1.4p2 +REG epsg:8021 3 0x1.d388888888886p6 0x1.4p2 +REG epsg:8021 4 0x1.fb88888888886p6 0x1.4p2 +REG epsg:8022 0 0x1.c844444444447p6 0x0.0p0 +REG epsg:8022 1 0x1.b444444444447p6 -0x1.4p2 +REG epsg:8022 2 0x1.dc44444444447p6 -0x1.4p2 +REG epsg:8022 3 0x1.b444444444447p6 0x1.4p2 +REG epsg:8022 4 0x1.dc44444444447p6 0x1.4p2 +REG epsg:8023 0 0x1.ca55555555553p6 0x0.0p0 +REG epsg:8023 1 0x1.b655555555553p6 -0x1.4p2 +REG epsg:8023 2 0x1.de55555555553p6 -0x1.4p2 +REG epsg:8023 3 0x1.b655555555553p6 0x1.4p2 +REG epsg:8023 4 0x1.de55555555553p6 0x1.4p2 +REG epsg:8024 0 0x1.e6p6 0x0.0p0 +REG epsg:8024 1 0x1.d2p6 -0x1.4p2 +REG epsg:8024 2 0x1.fap6 -0x1.4p2 +REG epsg:8024 3 0x1.d2p6 0x1.4p2 +REG epsg:8024 4 0x1.fap6 0x1.4p2 +REG epsg:8025 0 0x1.cbeeeeeeeeeedp6 0x0.0p0 +REG epsg:8025 1 0x1.b7eeeeeeeeeedp6 -0x1.4p2 +REG epsg:8025 2 0x1.dfeeeeeeeeeedp6 -0x1.4p2 +REG epsg:8025 3 0x1.b7eeeeeeeeeedp6 0x1.4p2 +REG epsg:8025 4 0x1.dfeeeeeeeeeedp6 0x1.4p2 +REG epsg:8026 0 0x1.c942d82d82d84p6 0x0.0p0 +REG epsg:8026 1 0x1.b542d82d82d84p6 -0x1.4p2 +REG epsg:8026 2 0x1.dd42d82d82d84p6 -0x1.4p2 +REG epsg:8026 3 0x1.b542d82d82d84p6 0x1.4p2 +REG epsg:8026 4 0x1.dd42d82d82d84p6 0x1.4p2 +REG epsg:8027 0 0x1.d3bbbbbbbbbb9p6 0x0.0p0 +REG epsg:8027 1 0x1.bfbbbbbbbbbb9p6 -0x1.4p2 +REG epsg:8027 2 0x1.e7bbbbbbbbbb9p6 -0x1.4p2 +REG epsg:8027 3 0x1.bfbbbbbbbbbb9p6 0x1.4p2 +REG epsg:8027 4 0x1.e7bbbbbbbbbb9p6 0x1.4p2 +REG epsg:8028 0 0x1.018p7 0x0.0p0 +REG epsg:8028 1 0x1.efp6 -0x1.4p2 +REG epsg:8028 2 0x1.0b8p7 -0x1.4p2 +REG epsg:8028 3 0x1.efp6 0x1.4p2 +REG epsg:8028 4 0x1.0b8p7 0x1.4p2 +REG epsg:8029 0 0x1.cd7777777777ap6 0x0.0p0 +REG epsg:8029 1 0x1.b97777777777ap6 -0x1.4p2 +REG epsg:8029 2 0x1.e17777777777ap6 -0x1.4p2 +REG epsg:8029 3 0x1.b97777777777ap6 0x1.4p2 +REG epsg:8029 4 0x1.e17777777777ap6 0x1.4p2 +REG epsg:8030 0 0x1.ccaaaaaaaaaadp6 0x0.0p0 +REG epsg:8030 1 0x1.b8aaaaaaaaaadp6 -0x1.4p2 +REG epsg:8030 2 0x1.e0aaaaaaaaaadp6 -0x1.4p2 +REG epsg:8030 3 0x1.b8aaaaaaaaaadp6 0x1.4p2 +REG epsg:8030 4 0x1.e0aaaaaaaaaadp6 0x1.4p2 +REG epsg:8031 0 0x1.cf44444444447p6 0x0.0p0 +REG epsg:8031 1 0x1.bb44444444447p6 -0x1.4p2 +REG epsg:8031 2 0x1.e344444444447p6 -0x1.4p2 +REG epsg:8031 3 0x1.bb44444444447p6 0x1.4p2 +REG epsg:8031 4 0x1.e344444444447p6 0x1.4p2 +REG epsg:8032 0 0x1.da66666666666p6 0x0.0p0 +REG epsg:8032 1 0x1.c666666666666p6 -0x1.4p2 +REG epsg:8032 2 0x1.ee66666666666p6 -0x1.4p2 +REG epsg:8032 3 0x1.c666666666666p6 0x1.4p2 +REG epsg:8032 4 0x1.ee66666666666p6 0x1.4p2 +REG epsg:8035 0 -0x1.f8p5 0x0.0p0 +REG epsg:8035 1 -0x1.1p6 -0x1.4p2 +REG epsg:8035 2 -0x1.dp5 -0x1.4p2 +REG epsg:8035 3 -0x1.1p6 0x1.4p2 +REG epsg:8035 4 -0x1.dp5 0x1.4p2 +REG epsg:8036 0 -0x1.c8p5 0x0.0p0 +REG epsg:8036 1 -0x1.fp5 -0x1.4p2 +REG epsg:8036 2 -0x1.ap5 -0x1.4p2 +REG epsg:8036 3 -0x1.fp5 0x1.4p2 +REG epsg:8036 4 -0x1.ap5 0x1.4p2 +REG epsg:8042 0 0x0.0p0 0x0.0p0 +REG epsg:8042 1 -0x1.4p2 -0x1.4p2 +REG epsg:8042 2 0x1.4p2 -0x1.4p2 +REG epsg:8042 3 -0x1.4p2 0x1.4p2 +REG epsg:8042 4 0x1.4p2 0x1.4p2 +REG epsg:8043 0 0x0.0p0 0x0.0p0 +REG epsg:8043 1 -0x1.4p2 -0x1.4p2 +REG epsg:8043 2 0x1.4p2 -0x1.4p2 +REG epsg:8043 3 -0x1.4p2 0x1.4p2 +REG epsg:8043 4 0x1.4p2 0x1.4p2 +REG epsg:8044 0 0x1.fcddec6e230b4p4 0x1.804ec627c6d67p5 +REG epsg:8044 1 0x1.8538333766d2ap4 0x1.584ec627c6d67p5 +REG epsg:8044 2 0x1.3a41d2d26fa1fp5 0x1.584ec627c6d67p5 +REG epsg:8044 3 0x1.8538333766d2ap4 0x1.a84ec627c6d67p5 +REG epsg:8044 4 0x1.3a41d2d26fa1fp5 0x1.a84ec627c6d67p5 +REG epsg:8045 0 0x1.1053cf07b0fe2p5 0x1.81ab8af20730fp5 +REG epsg:8045 1 0x1.a89c2d2412d02p4 0x1.59ab8af20730fp5 +REG epsg:8045 2 0x1.4c59877d58943p5 0x1.59ab8af20730fp5 +REG epsg:8045 3 0x1.a89c2d2412d02p4 0x1.a9ab8af20730fp5 +REG epsg:8045 4 0x1.4c59877d58943p5 0x1.a9ab8af20730fp5 +REG epsg:8058 0 0x1.26p7 -0x1.0ap5 +REG epsg:8058 1 0x1.1a0ad8cb2ee1cp7 -0x1.32p5 +REG epsg:8058 2 0x1.31f52734d11e4p7 -0x1.32p5 +REG epsg:8058 3 0x1.1a0ad8cb2ee1cp7 -0x1.c4p4 +REG epsg:8058 4 0x1.31f52734d11e4p7 -0x1.c4p4 +REG epsg:8059 0 0x1.0ep7 -0x1.0p5 +REG epsg:8059 1 0x1.f6442ba72d213p6 -0x1.4p5 +REG epsg:8059 2 0x1.20ddea2c696f7p7 -0x1.4p5 +REG epsg:8059 3 0x1.f6442ba72d213p6 -0x1.8p4 +REG epsg:8059 4 0x1.20ddea2c696f7p7 -0x1.8p4 +REG epsg:8065 0 -0x1.bd9999999999ap6 0x1.02p5 +REG epsg:8065 1 -0x1.d53f8ea1e99c1p6 0x1.b4p4 +REG epsg:8065 2 -0x1.a5f3a49149973p6 0x1.b4p4 +REG epsg:8065 3 -0x1.d53f8ea1e99c1p6 0x1.2ap5 +REG epsg:8065 4 -0x1.a5f3a49149973p6 0x1.2ap5 +REG epsg:8066 0 -0x1.c0aaaaaaaaaadp6 0x1.f4p4 +REG epsg:8066 1 -0x1.d80f968bbcc38p6 0x1.a4p4 +REG epsg:8066 2 -0x1.a945bec998922p6 0x1.a4p4 +REG epsg:8066 3 -0x1.d80f968bbcc38p6 0x1.22p5 +REG epsg:8066 4 -0x1.a945bec998922p6 0x1.22p5 +REG epsg:8067 0 -0x1.c4aaaaaaaaaadp6 0x1.f8p4 +REG epsg:8067 1 -0x1.dc1f8b629aabcp6 0x1.a8p4 +REG epsg:8067 2 -0x1.ad35c9f2baa9ep6 0x1.a8p4 +REG epsg:8067 3 -0x1.dc1f8b629aabcp6 0x1.24p5 +REG epsg:8067 4 -0x1.ad35c9f2baa9ep6 0x1.24p5 +REG epsg:8068 0 -0x1.bbp6 0x1.e8p4 +REG epsg:8068 1 -0x1.d2363b48431d6p6 0x1.98p4 +REG epsg:8068 2 -0x1.a3c9c4b7bce2ap6 0x1.98p4 +REG epsg:8068 3 -0x1.d2363b48431d6p6 0x1.1cp5 +REG epsg:8068 4 -0x1.a3c9c4b7bce2ap6 0x1.1cp5 +REG epsg:8082 0 -0x1.ecp5 0x0.0p0 +REG epsg:8082 1 -0x1.0ap6 -0x1.4p2 +REG epsg:8082 2 -0x1.c4p5 -0x1.4p2 +REG epsg:8082 3 -0x1.0ap6 0x1.4p2 +REG epsg:8082 4 -0x1.c4p5 0x1.4p2 +REG epsg:8083 0 -0x1.02p6 0x0.0p0 +REG epsg:8083 1 -0x1.16p6 -0x1.4p2 +REG epsg:8083 2 -0x1.dcp5 -0x1.4p2 +REG epsg:8083 3 -0x1.16p6 0x1.4p2 +REG epsg:8083 4 -0x1.dcp5 0x1.4p2 +REG epsg:8084 0 0x0.0p0 0x0.0p0 +REG epsg:8084 1 -0x1.4p2 -0x1.4p2 +REG epsg:8084 2 0x1.4p2 -0x1.4p2 +REG epsg:8084 3 -0x1.4p2 0x1.4p2 +REG epsg:8084 4 0x1.4p2 0x1.4p2 +REG epsg:8086 0 0x0.0p0 0x0.0p0 +REG epsg:8086 1 -0x1.4p2 -0x1.4p2 +REG epsg:8086 2 0x1.4p2 -0x1.4p2 +REG epsg:8086 3 -0x1.4p2 0x1.4p2 +REG epsg:8086 4 0x1.4p2 0x1.4p2 +REG epsg:8088 0 -0x1.3p4 0x1.04p6 +REG epsg:8088 1 -0x1.68c9f1497133ap4 0x1.fcp5 +REG epsg:8088 2 -0x1.ee6c1d6d1d98cp3 0x1.fcp5 +REG epsg:8088 3 -0x1.68c9f1497133ap4 0x1.0ap6 +REG epsg:8088 4 -0x1.ee6c1d6d1d98cp3 0x1.0ap6 +REG epsg:8090 0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 +REG epsg:8090 1 -0x1.7d11f2ba7b1c1p6 0x1.4382d82d82d82p5 +REG epsg:8090 2 -0x1.44102f67a7063p6 0x1.4382d82d82d82p5 +REG epsg:8090 3 -0x1.7d11f2ba7b1c1p6 0x1.9382d82d82d82p5 +REG epsg:8090 4 -0x1.44102f67a7063p6 0x1.9382d82d82d82p5 +REG epsg:8091 0 -0x1.6091111111112p6 0x1.6b82d82d82d82p5 +REG epsg:8091 1 -0x1.7d11f2ba7b1c1p6 0x1.4382d82d82d82p5 +REG epsg:8091 2 -0x1.44102f67a7063p6 0x1.4382d82d82d82p5 +REG epsg:8091 3 -0x1.7d11f2ba7b1c1p6 0x1.9382d82d82d82p5 +REG epsg:8091 4 -0x1.44102f67a7063p6 0x1.9382d82d82d82p5 +REG epsg:8092 0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6111p5 +REG epsg:8092 1 -0x1.8960824bb7f0ap6 0x1.3efa6e86f6111p5 +REG epsg:8092 2 -0x1.50ef22ae97b46p6 0x1.3efa6e86f6111p5 +REG epsg:8092 3 -0x1.8960824bb7f0ap6 0x1.8efa6e86f6111p5 +REG epsg:8092 4 -0x1.50ef22ae97b46p6 0x1.8efa6e86f6111p5 +REG epsg:8093 0 -0x1.6d27d27d27d28p6 0x1.66fa6e86f6111p5 +REG epsg:8093 1 -0x1.8960824bb7f0ap6 0x1.3efa6e86f6111p5 +REG epsg:8093 2 -0x1.50ef22ae97b46p6 0x1.3efa6e86f6111p5 +REG epsg:8093 3 -0x1.8960824bb7f0ap6 0x1.8efa6e86f6111p5 +REG epsg:8093 4 -0x1.50ef22ae97b46p6 0x1.8efa6e86f6111p5 +REG epsg:8095 0 -0x1.68p6 0x1.62e6987417888p5 +REG epsg:8095 1 -0x1.83f98c2283b1ap6 0x1.3ae6987417888p5 +REG epsg:8095 2 -0x1.4c0673dd7c4e6p6 0x1.3ae6987417888p5 +REG epsg:8095 3 -0x1.83f98c2283b1ap6 0x1.8ae6987417888p5 +REG epsg:8095 4 -0x1.4c0673dd7c4e6p6 0x1.8ae6987417888p5 +REG epsg:8096 0 -0x1.68p6 0x1.62e6987417888p5 +REG epsg:8096 1 -0x1.83f98c2283b1ap6 0x1.3ae6987417888p5 +REG epsg:8096 2 -0x1.4c0673dd7c4e6p6 0x1.3ae6987417888p5 +REG epsg:8096 3 -0x1.83f98c2283b1ap6 0x1.8ae6987417888p5 +REG epsg:8096 4 -0x1.4c0673dd7c4e6p6 0x1.8ae6987417888p5 +REG epsg:8097 0 -0x1.64f7777777778p6 0x1.60e95b7ef36cdp5 +REG epsg:8097 1 -0x1.80d2d057ececp6 0x1.38e95b7ef36cdp5 +REG epsg:8097 2 -0x1.491c1e970203p6 0x1.38e95b7ef36cdp5 +REG epsg:8097 3 -0x1.80d2d057ececp6 0x1.88e95b7ef36cdp5 +REG epsg:8097 4 -0x1.491c1e970203p6 0x1.88e95b7ef36cdp5 +REG epsg:8098 0 -0x1.64f7777777778p6 0x1.60e95b7ef36cdp5 +REG epsg:8098 1 -0x1.80d2d057ececp6 0x1.38e95b7ef36cdp5 +REG epsg:8098 2 -0x1.491c1e970203p6 0x1.38e95b7ef36cdp5 +REG epsg:8098 3 -0x1.80d2d057ececp6 0x1.88e95b7ef36cdp5 +REG epsg:8098 4 -0x1.491c1e970203p6 0x1.88e95b7ef36cdp5 +REG epsg:8099 0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 +REG epsg:8099 1 -0x1.7ecd63d604231p6 0x1.335cba9876543p5 +REG epsg:8099 2 -0x1.47bb24b284657p6 0x1.335cba9876543p5 +REG epsg:8099 3 -0x1.7ecd63d604231p6 0x1.835cba9876543p5 +REG epsg:8099 4 -0x1.47bb24b284657p6 0x1.835cba9876543p5 +REG epsg:8100 0 -0x1.6344444444444p6 0x1.5b5cba9876543p5 +REG epsg:8100 1 -0x1.7ecd63d604231p6 0x1.335cba9876543p5 +REG epsg:8100 2 -0x1.47bb24b284657p6 0x1.335cba9876543p5 +REG epsg:8100 3 -0x1.7ecd63d604231p6 0x1.835cba9876543p5 +REG epsg:8100 4 -0x1.47bb24b284657p6 0x1.835cba9876543p5 +REG epsg:8101 0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 +REG epsg:8101 1 -0x1.7c0e988dd8825p6 0x1.2c8e38e38e38fp5 +REG epsg:8101 2 -0x1.45be343ef44a7p6 0x1.2c8e38e38e38fp5 +REG epsg:8101 3 -0x1.7c0e988dd8825p6 0x1.7c8e38e38e38fp5 +REG epsg:8101 4 -0x1.45be343ef44a7p6 0x1.7c8e38e38e38fp5 +REG epsg:8102 0 -0x1.60e6666666666p6 0x1.548e38e38e38fp5 +REG epsg:8102 1 -0x1.7c0e988dd8825p6 0x1.2c8e38e38e38fp5 +REG epsg:8102 2 -0x1.45be343ef44a7p6 0x1.2c8e38e38e38fp5 +REG epsg:8102 3 -0x1.7c0e988dd8825p6 0x1.7c8e38e38e38fp5 +REG epsg:8102 4 -0x1.45be343ef44a7p6 0x1.7c8e38e38e38fp5 +REG epsg:8103 0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 +REG epsg:8103 1 -0x1.7b90d25883c9ep6 0x1.2f582d82d82d7p5 +REG epsg:8103 2 -0x1.44f205d4ff0e4p6 0x1.2f582d82d82d7p5 +REG epsg:8103 3 -0x1.7b90d25883c9ep6 0x1.7f582d82d82d7p5 +REG epsg:8103 4 -0x1.44f205d4ff0e4p6 0x1.7f582d82d82d7p5 +REG epsg:8104 0 -0x1.60416c16c16c1p6 0x1.57582d82d82d7p5 +REG epsg:8104 1 -0x1.7b90d25883c9ep6 0x1.2f582d82d82d7p5 +REG epsg:8104 2 -0x1.44f205d4ff0e4p6 0x1.2f582d82d82d7p5 +REG epsg:8104 3 -0x1.7b90d25883c9ep6 0x1.7f582d82d82d7p5 +REG epsg:8104 4 -0x1.44f205d4ff0e4p6 0x1.7f582d82d82d7p5 +REG epsg:8105 0 -0x1.6f22222222222p6 0x1.6fb0940623775p5 +REG epsg:8105 1 -0x1.8be7808f8d268p6 0x1.47b0940623775p5 +REG epsg:8105 2 -0x1.525cc3b4b71dcp6 0x1.47b0940623775p5 +REG epsg:8105 3 -0x1.8be7808f8d268p6 0x1.97b0940623775p5 +REG epsg:8105 4 -0x1.525cc3b4b71dcp6 0x1.97b0940623775p5 +REG epsg:8106 0 -0x1.6f22222222222p6 0x1.6fb0940623775p5 +REG epsg:8106 1 -0x1.8be7808f8d268p6 0x1.47b0940623775p5 +REG epsg:8106 2 -0x1.525cc3b4b71dcp6 0x1.47b0940623775p5 +REG epsg:8106 3 -0x1.8be7808f8d268p6 0x1.97b0940623775p5 +REG epsg:8106 4 -0x1.525cc3b4b71dcp6 0x1.97b0940623775p5 +REG epsg:8107 0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24dcp5 +REG epsg:8107 1 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24dcp5 +REG epsg:8107 2 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24dcp5 +REG epsg:8107 3 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a24dcp5 +REG epsg:8107 4 -0x1.46f74b6659832p6 0x1.7d5b0ef1a24dcp5 +REG epsg:8108 0 -0x1.622aaaaaaaaabp6 0x1.555b0ef1a24dcp5 +REG epsg:8108 1 -0x1.7d5e09eefbd24p6 0x1.2d5b0ef1a24dcp5 +REG epsg:8108 2 -0x1.46f74b6659832p6 0x1.2d5b0ef1a24dcp5 +REG epsg:8108 3 -0x1.7d5e09eefbd24p6 0x1.7d5b0ef1a24dcp5 +REG epsg:8108 4 -0x1.46f74b6659832p6 0x1.7d5b0ef1a24dcp5 +REG epsg:8109 0 -0x1.65f49f49f49f5p6 0x1.709f6cb8f8fbep5 +REG epsg:8109 1 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fbep5 +REG epsg:8109 2 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fbep5 +REG epsg:8109 3 -0x1.82c98af483fbdp6 0x1.989f6cb8f8fbep5 +REG epsg:8109 4 -0x1.491fb39f6542dp6 0x1.989f6cb8f8fbep5 +REG epsg:8110 0 -0x1.65f49f49f49f5p6 0x1.709f6cb8f8fbep5 +REG epsg:8110 1 -0x1.82c98af483fbdp6 0x1.489f6cb8f8fbep5 +REG epsg:8110 2 -0x1.491fb39f6542dp6 0x1.489f6cb8f8fbep5 +REG epsg:8110 3 -0x1.82c98af483fbdp6 0x1.989f6cb8f8fbep5 +REG epsg:8110 4 -0x1.491fb39f6542dp6 0x1.989f6cb8f8fbep5 +REG epsg:8111 0 -0x1.6b22222222222p6 0x1.5c99aadeb1d67p5 +REG epsg:8111 1 -0x1.86bd58a47e612p6 0x1.3499aadeb1d67p5 +REG epsg:8111 2 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d67p5 +REG epsg:8111 3 -0x1.86bd58a47e612p6 0x1.8499aadeb1d67p5 +REG epsg:8111 4 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1d67p5 +REG epsg:8112 0 -0x1.6b22222222222p6 0x1.5c99aadeb1d67p5 +REG epsg:8112 1 -0x1.86bd58a47e612p6 0x1.3499aadeb1d67p5 +REG epsg:8112 2 -0x1.4f86eb9fc5e32p6 0x1.3499aadeb1d67p5 +REG epsg:8112 3 -0x1.86bd58a47e612p6 0x1.8499aadeb1d67p5 +REG epsg:8112 4 -0x1.4f86eb9fc5e32p6 0x1.8499aadeb1d67p5 +REG epsg:8113 0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 +REG epsg:8113 1 -0x1.88e29dc64a41dp6 0x1.3149f49f49f4ap5 +REG epsg:8113 2 -0x1.520c5128a4ad1p6 0x1.3149f49f49f4ap5 +REG epsg:8113 3 -0x1.88e29dc64a41dp6 0x1.8149f49f49f4ap5 +REG epsg:8113 4 -0x1.520c5128a4ad1p6 0x1.8149f49f49f4ap5 +REG epsg:8114 0 -0x1.6d77777777777p6 0x1.5949f49f49f4ap5 +REG epsg:8114 1 -0x1.88e29dc64a41dp6 0x1.3149f49f49f4ap5 +REG epsg:8114 2 -0x1.520c5128a4ad1p6 0x1.3149f49f49f4ap5 +REG epsg:8114 3 -0x1.88e29dc64a41dp6 0x1.8149f49f49f4ap5 +REG epsg:8114 4 -0x1.520c5128a4ad1p6 0x1.8149f49f49f4ap5 +REG epsg:8115 0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc5949p5 +REG epsg:8115 1 -0x1.864e48bbb4894p6 0x1.416c2dfc5949p5 +REG epsg:8115 2 -0x1.4d8f95222954ap6 0x1.416c2dfc5949p5 +REG epsg:8115 3 -0x1.864e48bbb4894p6 0x1.916c2dfc5949p5 +REG epsg:8115 4 -0x1.4d8f95222954ap6 0x1.916c2dfc5949p5 +REG epsg:8116 0 -0x1.69eeeeeeeeeefp6 0x1.696c2dfc5949p5 +REG epsg:8116 1 -0x1.864e48bbb4894p6 0x1.416c2dfc5949p5 +REG epsg:8116 2 -0x1.4d8f95222954ap6 0x1.416c2dfc5949p5 +REG epsg:8116 3 -0x1.864e48bbb4894p6 0x1.916c2dfc5949p5 +REG epsg:8116 4 -0x1.4d8f95222954ap6 0x1.916c2dfc5949p5 +REG epsg:8117 0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 +REG epsg:8117 1 -0x1.8e5a81cace66cp6 0x1.3849f49f49f4ap5 +REG epsg:8117 2 -0x1.56b68f4642aa6p6 0x1.3849f49f49f4ap5 +REG epsg:8117 3 -0x1.8e5a81cace66cp6 0x1.8849f49f49f4ap5 +REG epsg:8117 4 -0x1.56b68f4642aa6p6 0x1.8849f49f49f4ap5 +REG epsg:8118 0 -0x1.7288888888889p6 0x1.6049f49f49f4ap5 +REG epsg:8118 1 -0x1.8e5a81cace66cp6 0x1.3849f49f49f4ap5 +REG epsg:8118 2 -0x1.56b68f4642aa6p6 0x1.3849f49f49f4ap5 +REG epsg:8118 3 -0x1.8e5a81cace66cp6 0x1.8849f49f49f4ap5 +REG epsg:8118 4 -0x1.56b68f4642aa6p6 0x1.8849f49f49f4ap5 +REG epsg:8119 0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 +REG epsg:8119 1 -0x1.7e3e1003b1f4fp6 0x1.3849f49f49f4ap5 +REG epsg:8119 2 -0x1.469a1d7f26389p6 0x1.3849f49f49f4ap5 +REG epsg:8119 3 -0x1.7e3e1003b1f4fp6 0x1.8849f49f49f4ap5 +REG epsg:8119 4 -0x1.469a1d7f26389p6 0x1.8849f49f49f4ap5 +REG epsg:8120 0 -0x1.626c16c16c16cp6 0x1.6049f49f49f4ap5 +REG epsg:8120 1 -0x1.7e3e1003b1f4fp6 0x1.3849f49f49f4ap5 +REG epsg:8120 2 -0x1.469a1d7f26389p6 0x1.3849f49f49f4ap5 +REG epsg:8120 3 -0x1.7e3e1003b1f4fp6 0x1.8849f49f49f4ap5 +REG epsg:8120 4 -0x1.469a1d7f26389p6 0x1.8849f49f49f4ap5 +REG epsg:8121 0 -0x1.6c77777777777p6 0x1.6f33672c63c93p5 +REG epsg:8121 1 -0x1.8934b933d2a2cp6 0x1.4733672c63c93p5 +REG epsg:8121 2 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c93p5 +REG epsg:8121 3 -0x1.8934b933d2a2cp6 0x1.9733672c63c93p5 +REG epsg:8121 4 -0x1.4fba35bb1c4c2p6 0x1.9733672c63c93p5 +REG epsg:8122 0 -0x1.6c77777777777p6 0x1.6f33672c63c93p5 +REG epsg:8122 1 -0x1.8934b933d2a2cp6 0x1.4733672c63c93p5 +REG epsg:8122 2 -0x1.4fba35bb1c4c2p6 0x1.4733672c63c93p5 +REG epsg:8122 3 -0x1.8934b933d2a2cp6 0x1.9733672c63c93p5 +REG epsg:8122 4 -0x1.4fba35bb1c4c2p6 0x1.9733672c63c93p5 +REG epsg:8123 0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 +REG epsg:8123 1 -0x1.82ddd6c83a2abp6 0x1.2e8e38e38e38fp5 +REG epsg:8123 2 -0x1.4c555c6af9089p6 0x1.2e8e38e38e38fp5 +REG epsg:8123 3 -0x1.82ddd6c83a2abp6 0x1.7e8e38e38e38fp5 +REG epsg:8123 4 -0x1.4c555c6af9089p6 0x1.7e8e38e38e38fp5 +REG epsg:8124 0 -0x1.679999999999ap6 0x1.568e38e38e38fp5 +REG epsg:8124 1 -0x1.82ddd6c83a2abp6 0x1.2e8e38e38e38fp5 +REG epsg:8124 2 -0x1.4c555c6af9089p6 0x1.2e8e38e38e38fp5 +REG epsg:8124 3 -0x1.82ddd6c83a2abp6 0x1.7e8e38e38e38fp5 +REG epsg:8124 4 -0x1.4c555c6af9089p6 0x1.7e8e38e38e38fp5 +REG epsg:8125 0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 +REG epsg:8125 1 -0x1.880842b7f221p6 0x1.375b05b05b05ap5 +REG epsg:8125 2 -0x1.508045d096678p6 0x1.375b05b05b05ap5 +REG epsg:8125 3 -0x1.880842b7f221p6 0x1.875b05b05b05ap5 +REG epsg:8125 4 -0x1.508045d096678p6 0x1.875b05b05b05ap5 +REG epsg:8126 0 -0x1.6c44444444444p6 0x1.5f5b05b05b05ap5 +REG epsg:8126 1 -0x1.880842b7f221p6 0x1.375b05b05b05ap5 +REG epsg:8126 2 -0x1.508045d096678p6 0x1.375b05b05b05ap5 +REG epsg:8126 3 -0x1.880842b7f221p6 0x1.875b05b05b05ap5 +REG epsg:8126 4 -0x1.508045d096678p6 0x1.875b05b05b05ap5 +REG epsg:8127 0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 +REG epsg:8127 1 -0x1.7f2d96ac67099p6 0x1.278e38e38e38ep5 +REG epsg:8127 2 -0x1.496652922cdfbp6 0x1.278e38e38e38ep5 +REG epsg:8127 3 -0x1.7f2d96ac67099p6 0x1.778e38e38e38ep5 +REG epsg:8127 4 -0x1.496652922cdfbp6 0x1.778e38e38e38ep5 +REG epsg:8128 0 -0x1.6449f49f49f4ap6 0x1.4f8e38e38e38ep5 +REG epsg:8128 1 -0x1.7f2d96ac67099p6 0x1.278e38e38e38ep5 +REG epsg:8128 2 -0x1.496652922cdfbp6 0x1.278e38e38e38ep5 +REG epsg:8128 3 -0x1.7f2d96ac67099p6 0x1.778e38e38e38ep5 +REG epsg:8128 4 -0x1.496652922cdfbp6 0x1.778e38e38e38ep5 +REG epsg:8129 0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5863p5 +REG epsg:8129 1 -0x1.8536a29c21962p6 0x1.329418ccd5863p5 +REG epsg:8129 2 -0x1.4e3b24805031p6 0x1.329418ccd5863p5 +REG epsg:8129 3 -0x1.8536a29c21962p6 0x1.829418ccd5863p5 +REG epsg:8129 4 -0x1.4e3b24805031p6 0x1.829418ccd5863p5 +REG epsg:8130 0 -0x1.69b8e38e38e39p6 0x1.5a9418ccd5863p5 +REG epsg:8130 1 -0x1.8536a29c21962p6 0x1.329418ccd5863p5 +REG epsg:8130 2 -0x1.4e3b24805031p6 0x1.329418ccd5863p5 +REG epsg:8130 3 -0x1.8536a29c21962p6 0x1.829418ccd5863p5 +REG epsg:8130 4 -0x1.4e3b24805031p6 0x1.829418ccd5863p5 +REG epsg:8131 0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 +REG epsg:8131 1 -0x1.8605e0515b85cp6 0x1.3c71c71c71c71p5 +REG epsg:8131 2 -0x1.4de35e428db8ep6 0x1.3c71c71c71c71p5 +REG epsg:8131 3 -0x1.8605e0515b85cp6 0x1.8c71c71c71c71p5 +REG epsg:8131 4 -0x1.4de35e428db8ep6 0x1.8c71c71c71c71p5 +REG epsg:8132 0 -0x1.69f49f49f49f5p6 0x1.6471c71c71c71p5 +REG epsg:8132 1 -0x1.8605e0515b85cp6 0x1.3c71c71c71c71p5 +REG epsg:8132 2 -0x1.4de35e428db8ep6 0x1.3c71c71c71c71p5 +REG epsg:8132 3 -0x1.8605e0515b85cp6 0x1.8c71c71c71c71p5 +REG epsg:8132 4 -0x1.4de35e428db8ep6 0x1.8c71c71c71c71p5 +REG epsg:8133 0 -0x1.66p6 0x1.6355a7cef00ddp5 +REG epsg:8133 1 -0x1.82002f8de16p6 0x1.3b55a7cef00ddp5 +REG epsg:8133 2 -0x1.49ffd0721eap6 0x1.3b55a7cef00ddp5 +REG epsg:8133 3 -0x1.82002f8de16p6 0x1.8b55a7cef00ddp5 +REG epsg:8133 4 -0x1.49ffd0721eap6 0x1.8b55a7cef00ddp5 +REG epsg:8134 0 -0x1.66p6 0x1.6355a7cef00ddp5 +REG epsg:8134 1 -0x1.82002f8de16p6 0x1.3b55a7cef00ddp5 +REG epsg:8134 2 -0x1.49ffd0721eap6 0x1.3b55a7cef00ddp5 +REG epsg:8134 3 -0x1.82002f8de16p6 0x1.8b55a7cef00ddp5 +REG epsg:8134 4 -0x1.49ffd0721eap6 0x1.8b55a7cef00ddp5 +REG epsg:8135 0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 +REG epsg:8135 1 -0x1.8ea6db584b498p6 0x1.3d49f49f49f4ap5 +REG epsg:8135 2 -0x1.566a35b8c5c7ap6 0x1.3d49f49f49f4ap5 +REG epsg:8135 3 -0x1.8ea6db584b498p6 0x1.8d49f49f49f4ap5 +REG epsg:8135 4 -0x1.566a35b8c5c7ap6 0x1.8d49f49f49f4ap5 +REG epsg:8136 0 -0x1.7288888888889p6 0x1.6549f49f49f4ap5 +REG epsg:8136 1 -0x1.8ea6db584b498p6 0x1.3d49f49f49f4ap5 +REG epsg:8136 2 -0x1.566a35b8c5c7ap6 0x1.3d49f49f49f4ap5 +REG epsg:8136 3 -0x1.8ea6db584b498p6 0x1.8d49f49f49f4ap5 +REG epsg:8136 4 -0x1.566a35b8c5c7ap6 0x1.8d49f49f49f4ap5 +REG epsg:8137 0 -0x1.70e93e93e93e9p6 0x1.6516d538431cp5 +REG epsg:8137 1 -0x1.8d04788047198p6 0x1.3d16d538431cp5 +REG epsg:8137 2 -0x1.54ce04a78b63ap6 0x1.3d16d538431cp5 +REG epsg:8137 3 -0x1.8d04788047198p6 0x1.8d16d538431cp5 +REG epsg:8137 4 -0x1.54ce04a78b63ap6 0x1.8d16d538431cp5 +REG epsg:8138 0 -0x1.70e93e93e93e9p6 0x1.6516d538431cp5 +REG epsg:8138 1 -0x1.8d04788047198p6 0x1.3d16d538431cp5 +REG epsg:8138 2 -0x1.54ce04a78b63ap6 0x1.3d16d538431cp5 +REG epsg:8138 3 -0x1.8d04788047198p6 0x1.8d16d538431cp5 +REG epsg:8138 4 -0x1.54ce04a78b63ap6 0x1.8d16d538431cp5 +REG epsg:8139 0 -0x1.662d82d82d82dp6 0x1.6da2401273456p5 +REG epsg:8139 1 -0x1.82d0f2681f152p6 0x1.45a2401273456p5 +REG epsg:8139 2 -0x1.498a13483bf08p6 0x1.45a2401273456p5 +REG epsg:8139 3 -0x1.82d0f2681f152p6 0x1.95a2401273456p5 +REG epsg:8139 4 -0x1.498a13483bf08p6 0x1.95a2401273456p5 +REG epsg:8140 0 -0x1.662d82d82d82dp6 0x1.6da2401273456p5 +REG epsg:8140 1 -0x1.82d0f2681f152p6 0x1.45a2401273456p5 +REG epsg:8140 2 -0x1.498a13483bf08p6 0x1.45a2401273456p5 +REG epsg:8140 3 -0x1.82d0f2681f152p6 0x1.95a2401273456p5 +REG epsg:8140 4 -0x1.498a13483bf08p6 0x1.95a2401273456p5 +REG epsg:8141 0 -0x1.5fa2222222223p6 0x1.632d82d82d82dp5 +REG epsg:8141 1 -0x1.7b9feada33b6fp6 0x1.3b2d82d82d82dp5 +REG epsg:8141 2 -0x1.43a4596a108d7p6 0x1.3b2d82d82d82dp5 +REG epsg:8141 3 -0x1.7b9feada33b6fp6 0x1.8b2d82d82d82dp5 +REG epsg:8141 4 -0x1.43a4596a108d7p6 0x1.8b2d82d82d82dp5 +REG epsg:8142 0 -0x1.5fa2222222223p6 0x1.632d82d82d82dp5 +REG epsg:8142 1 -0x1.7b9feada33b6fp6 0x1.3b2d82d82d82dp5 +REG epsg:8142 2 -0x1.43a4596a108d7p6 0x1.3b2d82d82d82dp5 +REG epsg:8142 3 -0x1.7b9feada33b6fp6 0x1.8b2d82d82d82dp5 +REG epsg:8142 4 -0x1.43a4596a108d7p6 0x1.8b2d82d82d82dp5 +REG epsg:8143 0 -0x1.6a91111111112p6 0x1.600026c287bc5p5 +REG epsg:8143 1 -0x1.865eb68f209b9p6 0x1.380026c287bc5p5 +REG epsg:8143 2 -0x1.4ec36b930186bp6 0x1.380026c287bc5p5 +REG epsg:8143 3 -0x1.865eb68f209b9p6 0x1.880026c287bc5p5 +REG epsg:8143 4 -0x1.4ec36b930186bp6 0x1.880026c287bc5p5 +REG epsg:8144 0 -0x1.6a91111111112p6 0x1.600026c287bc5p5 +REG epsg:8144 1 -0x1.865eb68f209b9p6 0x1.380026c287bc5p5 +REG epsg:8144 2 -0x1.4ec36b930186bp6 0x1.380026c287bc5p5 +REG epsg:8144 3 -0x1.865eb68f209b9p6 0x1.880026c287bc5p5 +REG epsg:8144 4 -0x1.4ec36b930186bp6 0x1.880026c287bc5p5 +REG epsg:8145 0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 +REG epsg:8145 1 -0x1.7dcfe5d3e3702p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:8145 2 -0x1.45856f8171e54p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:8145 3 -0x1.7dcfe5d3e3702p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:8145 4 -0x1.45856f8171e54p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:8146 0 -0x1.61aaaaaaaaaabp6 0x1.65bbbbbbbbbbcp5 +REG epsg:8146 1 -0x1.7dcfe5d3e3702p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:8146 2 -0x1.45856f8171e54p6 0x1.3dbbbbbbbbbbcp5 +REG epsg:8146 3 -0x1.7dcfe5d3e3702p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:8146 4 -0x1.45856f8171e54p6 0x1.8dbbbbbbbbbbcp5 +REG epsg:8147 0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 +REG epsg:8147 1 -0x1.7afa4c47d1f55p6 0x1.3d88888888888p5 +REG epsg:8147 2 -0x1.42b60ebdde65bp6 0x1.3d88888888888p5 +REG epsg:8147 3 -0x1.7afa4c47d1f55p6 0x1.8d88888888888p5 +REG epsg:8147 4 -0x1.42b60ebdde65bp6 0x1.8d88888888888p5 +REG epsg:8148 0 -0x1.5ed82d82d82d8p6 0x1.6588888888888p5 +REG epsg:8148 1 -0x1.7afa4c47d1f55p6 0x1.3d88888888888p5 +REG epsg:8148 2 -0x1.42b60ebdde65bp6 0x1.3d88888888888p5 +REG epsg:8148 3 -0x1.7afa4c47d1f55p6 0x1.8d88888888888p5 +REG epsg:8148 4 -0x1.42b60ebdde65bp6 0x1.8d88888888888p5 +REG epsg:8149 0 -0x1.67147ae147ae1p6 0x1.67350d60e1dap5 +REG epsg:8149 1 -0x1.8350c33b464acp6 0x1.3f350d60e1dap5 +REG epsg:8149 2 -0x1.4ad8328749116p6 0x1.3f350d60e1dap5 +REG epsg:8149 3 -0x1.8350c33b464acp6 0x1.8f350d60e1dap5 +REG epsg:8149 4 -0x1.4ad8328749116p6 0x1.8f350d60e1dap5 +REG epsg:8150 0 -0x1.67147ae147ae1p6 0x1.67350d60e1dap5 +REG epsg:8150 1 -0x1.8350c33b464acp6 0x1.3f350d60e1dap5 +REG epsg:8150 2 -0x1.4ad8328749116p6 0x1.3f350d60e1dap5 +REG epsg:8150 3 -0x1.8350c33b464acp6 0x1.8f350d60e1dap5 +REG epsg:8150 4 -0x1.4ad8328749116p6 0x1.8f350d60e1dap5 +REG epsg:8151 0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 +REG epsg:8151 1 -0x1.832420d062cc2p6 0x1.3ec16c16c16c2p5 +REG epsg:8151 2 -0x1.4ab9bd0d7b11cp6 0x1.3ec16c16c16c2p5 +REG epsg:8151 3 -0x1.832420d062cc2p6 0x1.8ec16c16c16c2p5 +REG epsg:8151 4 -0x1.4ab9bd0d7b11cp6 0x1.8ec16c16c16c2p5 +REG epsg:8152 0 -0x1.66eeeeeeeeeefp6 0x1.66c16c16c16c2p5 +REG epsg:8152 1 -0x1.832420d062cc2p6 0x1.3ec16c16c16c2p5 +REG epsg:8152 2 -0x1.4ab9bd0d7b11cp6 0x1.3ec16c16c16c2p5 +REG epsg:8152 3 -0x1.832420d062cc2p6 0x1.8ec16c16c16c2p5 +REG epsg:8152 4 -0x1.4ab9bd0d7b11cp6 0x1.8ec16c16c16c2p5 +REG epsg:8153 0 -0x1.6422222222222p6 0x1.693be0a9d7fb7p5 +REG epsg:8153 1 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7fb7p5 +REG epsg:8153 2 -0x1.47c5ca068267bp6 0x1.413be0a9d7fb7p5 +REG epsg:8153 3 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d7fb7p5 +REG epsg:8153 4 -0x1.47c5ca068267bp6 0x1.913be0a9d7fb7p5 +REG epsg:8154 0 -0x1.6422222222222p6 0x1.693be0a9d7fb7p5 +REG epsg:8154 1 -0x1.807e7a3dc1dc9p6 0x1.413be0a9d7fb7p5 +REG epsg:8154 2 -0x1.47c5ca068267bp6 0x1.413be0a9d7fb7p5 +REG epsg:8154 3 -0x1.807e7a3dc1dc9p6 0x1.913be0a9d7fb7p5 +REG epsg:8154 4 -0x1.47c5ca068267bp6 0x1.913be0a9d7fb7p5 +REG epsg:8155 0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 +REG epsg:8155 1 -0x1.88d0fb8f423f5p6 0x1.339be02468acfp5 +REG epsg:8155 2 -0x1.51b78cf946493p6 0x1.339be02468acfp5 +REG epsg:8155 3 -0x1.88d0fb8f423f5p6 0x1.839be02468acfp5 +REG epsg:8155 4 -0x1.51b78cf946493p6 0x1.839be02468acfp5 +REG epsg:8156 0 -0x1.6d44444444444p6 0x1.5b9be02468acfp5 +REG epsg:8156 1 -0x1.88d0fb8f423f5p6 0x1.339be02468acfp5 +REG epsg:8156 2 -0x1.51b78cf946493p6 0x1.339be02468acfp5 +REG epsg:8156 3 -0x1.88d0fb8f423f5p6 0x1.839be02468acfp5 +REG epsg:8156 4 -0x1.51b78cf946493p6 0x1.839be02468acfp5 +REG epsg:8157 0 -0x1.5e33333333333p6 0x1.5a22222222223p5 +REG epsg:8157 1 -0x1.79aa8267421e7p6 0x1.3222222222223p5 +REG epsg:8157 2 -0x1.42bbe3ff2447fp6 0x1.3222222222223p5 +REG epsg:8157 3 -0x1.79aa8267421e7p6 0x1.8222222222223p5 +REG epsg:8157 4 -0x1.42bbe3ff2447fp6 0x1.8222222222223p5 +REG epsg:8158 0 -0x1.5e33333333333p6 0x1.5a22222222223p5 +REG epsg:8158 1 -0x1.79aa8267421e7p6 0x1.3222222222223p5 +REG epsg:8158 2 -0x1.42bbe3ff2447fp6 0x1.3222222222223p5 +REG epsg:8158 3 -0x1.79aa8267421e7p6 0x1.8222222222223p5 +REG epsg:8158 4 -0x1.42bbe3ff2447fp6 0x1.8222222222223p5 +REG epsg:8159 0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 +REG epsg:8159 1 -0x1.7a952398a9928p6 0x1.29bbbbbbbbbbcp5 +REG epsg:8159 2 -0x1.4492aee47e4p6 0x1.29bbbbbbbbbbcp5 +REG epsg:8159 3 -0x1.7a952398a9928p6 0x1.79bbbbbbbbbbcp5 +REG epsg:8159 4 -0x1.4492aee47e4p6 0x1.79bbbbbbbbbbcp5 +REG epsg:8160 0 -0x1.5f93e93e93e94p6 0x1.51bbbbbbbbbbcp5 +REG epsg:8160 1 -0x1.7a952398a9928p6 0x1.29bbbbbbbbbbcp5 +REG epsg:8160 2 -0x1.4492aee47e4p6 0x1.29bbbbbbbbbbcp5 +REG epsg:8160 3 -0x1.7a952398a9928p6 0x1.79bbbbbbbbbbcp5 +REG epsg:8160 4 -0x1.4492aee47e4p6 0x1.79bbbbbbbbbbcp5 +REG epsg:8161 0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 +REG epsg:8161 1 -0x1.874cc9e6a0a8bp6 0x1.3a06d49145de5p5 +REG epsg:8161 2 -0x1.4f7454a1f8771p6 0x1.3a06d49145de5p5 +REG epsg:8161 3 -0x1.874cc9e6a0a8bp6 0x1.8a06d49145de5p5 +REG epsg:8161 4 -0x1.4f7454a1f8771p6 0x1.8a06d49145de5p5 +REG epsg:8162 0 -0x1.6b608f444c8fep6 0x1.6206d49145de5p5 +REG epsg:8162 1 -0x1.874cc9e6a0a8bp6 0x1.3a06d49145de5p5 +REG epsg:8162 2 -0x1.4f7454a1f8771p6 0x1.3a06d49145de5p5 +REG epsg:8162 3 -0x1.874cc9e6a0a8bp6 0x1.8a06d49145de5p5 +REG epsg:8162 4 -0x1.4f7454a1f8771p6 0x1.8a06d49145de5p5 +REG epsg:8163 0 -0x1.6905b05b05b06p6 0x1.6b77777777777p5 +REG epsg:8163 1 -0x1.8585da1f0e343p6 0x1.4377777777777p5 +REG epsg:8163 2 -0x1.4c858696fd2c9p6 0x1.4377777777777p5 +REG epsg:8163 3 -0x1.8585da1f0e343p6 0x1.9377777777777p5 +REG epsg:8163 4 -0x1.4c858696fd2c9p6 0x1.9377777777777p5 +REG epsg:8164 0 -0x1.6905b05b05b06p6 0x1.6b77777777777p5 +REG epsg:8164 1 -0x1.8585da1f0e343p6 0x1.4377777777777p5 +REG epsg:8164 2 -0x1.4c858696fd2c9p6 0x1.4377777777777p5 +REG epsg:8164 3 -0x1.8585da1f0e343p6 0x1.9377777777777p5 +REG epsg:8164 4 -0x1.4c858696fd2c9p6 0x1.9377777777777p5 +REG epsg:8165 0 -0x1.68a4fa4fa4fa5p6 0x1.544fa4fa4fa4ep5 +REG epsg:8165 1 -0x1.83c9c54d1c8e2p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:8165 2 -0x1.4d802f522d668p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:8165 3 -0x1.83c9c54d1c8e2p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:8165 4 -0x1.4d802f522d668p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:8166 0 -0x1.68a4fa4fa4fa5p6 0x1.544fa4fa4fa4ep5 +REG epsg:8166 1 -0x1.83c9c54d1c8e2p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:8166 2 -0x1.4d802f522d668p6 0x1.2c4fa4fa4fa4ep5 +REG epsg:8166 3 -0x1.83c9c54d1c8e2p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:8166 4 -0x1.4d802f522d668p6 0x1.7c4fa4fa4fa4ep5 +REG epsg:8167 0 -0x1.64f7777777778p6 0x1.5e74bc7a4dca3p5 +REG epsg:8167 1 -0x1.80ae11048e154p6 0x1.3674bc7a4dca3p5 +REG epsg:8167 2 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dca3p5 +REG epsg:8167 3 -0x1.80ae11048e154p6 0x1.8674bc7a4dca3p5 +REG epsg:8167 4 -0x1.4940ddea60d9cp6 0x1.8674bc7a4dca3p5 +REG epsg:8168 0 -0x1.64f7777777778p6 0x1.5e74bc7a4dca3p5 +REG epsg:8168 1 -0x1.80ae11048e154p6 0x1.3674bc7a4dca3p5 +REG epsg:8168 2 -0x1.4940ddea60d9cp6 0x1.3674bc7a4dca3p5 +REG epsg:8168 3 -0x1.80ae11048e154p6 0x1.8674bc7a4dca3p5 +REG epsg:8168 4 -0x1.4940ddea60d9cp6 0x1.8674bc7a4dca3p5 +REG epsg:8169 0 -0x1.675b05b05b05bp6 0x1.5519ba40451e1p5 +REG epsg:8169 1 -0x1.828ad2d6b1988p6 0x1.2d19ba40451e1p5 +REG epsg:8169 2 -0x1.4c2b388a0472ep6 0x1.2d19ba40451e1p5 +REG epsg:8169 3 -0x1.828ad2d6b1988p6 0x1.7d19ba40451e1p5 +REG epsg:8169 4 -0x1.4c2b388a0472ep6 0x1.7d19ba40451e1p5 +REG epsg:8170 0 -0x1.675b05b05b05bp6 0x1.5519ba40451e1p5 +REG epsg:8170 1 -0x1.828ad2d6b1988p6 0x1.2d19ba40451e1p5 +REG epsg:8170 2 -0x1.4c2b388a0472ep6 0x1.2d19ba40451e1p5 +REG epsg:8170 3 -0x1.828ad2d6b1988p6 0x1.7d19ba40451e1p5 +REG epsg:8170 4 -0x1.4c2b388a0472ep6 0x1.7d19ba40451e1p5 +REG epsg:8171 0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 +REG epsg:8171 1 -0x1.85de05ec269ccp6 0x1.2349f49f49f4ap5 +REG epsg:8171 2 -0x1.5088607a3fc9ap6 0x1.2349f49f49f4ap5 +REG epsg:8171 3 -0x1.85de05ec269ccp6 0x1.7349f49f49f4ap5 +REG epsg:8171 4 -0x1.5088607a3fc9ap6 0x1.7349f49f49f4ap5 +REG epsg:8172 0 -0x1.6b33333333333p6 0x1.4b49f49f49f4ap5 +REG epsg:8172 1 -0x1.85de05ec269ccp6 0x1.2349f49f49f4ap5 +REG epsg:8172 2 -0x1.5088607a3fc9ap6 0x1.2349f49f49f4ap5 +REG epsg:8172 3 -0x1.85de05ec269ccp6 0x1.7349f49f49f4ap5 +REG epsg:8172 4 -0x1.5088607a3fc9ap6 0x1.7349f49f49f4ap5 +REG epsg:8173 0 -0x1.6288888888889p6 0x1.600b60b60b60bp5 +REG epsg:8173 1 -0x1.7e56d665291cfp6 0x1.380b60b60b60bp5 +REG epsg:8173 2 -0x1.46ba3aabe7f43p6 0x1.380b60b60b60bp5 +REG epsg:8173 3 -0x1.7e56d665291cfp6 0x1.880b60b60b60bp5 +REG epsg:8173 4 -0x1.46ba3aabe7f43p6 0x1.880b60b60b60bp5 +REG epsg:8177 0 -0x1.6288888888889p6 0x1.600b60b60b60bp5 +REG epsg:8177 1 -0x1.7e56d665291cfp6 0x1.380b60b60b60bp5 +REG epsg:8177 2 -0x1.46ba3aabe7f43p6 0x1.380b60b60b60bp5 +REG epsg:8177 3 -0x1.7e56d665291cfp6 0x1.880b60b60b60bp5 +REG epsg:8177 4 -0x1.46ba3aabe7f43p6 0x1.880b60b60b60bp5 +REG epsg:8179 0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 +REG epsg:8179 1 -0x1.8b930e66c0335p6 0x1.3b44444444444p5 +REG epsg:8179 2 -0x1.5394c416679f3p6 0x1.3b44444444444p5 +REG epsg:8179 3 -0x1.8b930e66c0335p6 0x1.8b44444444444p5 +REG epsg:8179 4 -0x1.5394c416679f3p6 0x1.8b44444444444p5 +REG epsg:8180 0 -0x1.6f93e93e93e94p6 0x1.6344444444444p5 +REG epsg:8180 1 -0x1.8b930e66c0335p6 0x1.3b44444444444p5 +REG epsg:8180 2 -0x1.5394c416679f3p6 0x1.3b44444444444p5 +REG epsg:8180 3 -0x1.8b930e66c0335p6 0x1.8b44444444444p5 +REG epsg:8180 4 -0x1.5394c416679f3p6 0x1.8b44444444444p5 +REG epsg:8181 0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 +REG epsg:8181 1 -0x1.8c65b3ed1c49dp6 0x1.4711111111111p5 +REG epsg:8181 2 -0x1.52efa168390b9p6 0x1.4711111111111p5 +REG epsg:8181 3 -0x1.8c65b3ed1c49dp6 0x1.9711111111111p5 +REG epsg:8181 4 -0x1.52efa168390b9p6 0x1.9711111111111p5 +REG epsg:8182 0 -0x1.6faaaaaaaaaabp6 0x1.6f11111111111p5 +REG epsg:8182 1 -0x1.8c65b3ed1c49dp6 0x1.4711111111111p5 +REG epsg:8182 2 -0x1.52efa168390b9p6 0x1.4711111111111p5 +REG epsg:8182 3 -0x1.8c65b3ed1c49dp6 0x1.9711111111111p5 +REG epsg:8182 4 -0x1.52efa168390b9p6 0x1.9711111111111p5 +REG epsg:8184 0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 +REG epsg:8184 1 -0x1.7914e13b5a00cp6 0x1.3b33333333333p5 +REG epsg:8184 2 -0x1.4118a19cd3822p6 0x1.3b33333333333p5 +REG epsg:8184 3 -0x1.7914e13b5a00cp6 0x1.8b33333333333p5 +REG epsg:8184 4 -0x1.4118a19cd3822p6 0x1.8b33333333333p5 +REG epsg:8185 0 -0x1.5d16c16c16c17p6 0x1.6333333333333p5 +REG epsg:8185 1 -0x1.7914e13b5a00cp6 0x1.3b33333333333p5 +REG epsg:8185 2 -0x1.4118a19cd3822p6 0x1.3b33333333333p5 +REG epsg:8185 3 -0x1.7914e13b5a00cp6 0x1.8b33333333333p5 +REG epsg:8185 4 -0x1.4118a19cd3822p6 0x1.8b33333333333p5 +REG epsg:8187 0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 +REG epsg:8187 1 -0x1.7dcadae26f519p6 0x1.23c71c71c71c7p5 +REG epsg:8187 2 -0x1.48685850c3e1bp6 0x1.23c71c71c71c7p5 +REG epsg:8187 3 -0x1.7dcadae26f519p6 0x1.73c71c71c71c7p5 +REG epsg:8187 4 -0x1.48685850c3e1bp6 0x1.73c71c71c71c7p5 +REG epsg:8189 0 -0x1.631999999999ap6 0x1.4bc71c71c71c7p5 +REG epsg:8189 1 -0x1.7dcadae26f519p6 0x1.23c71c71c71c7p5 +REG epsg:8189 2 -0x1.48685850c3e1bp6 0x1.23c71c71c71c7p5 +REG epsg:8189 3 -0x1.7dcadae26f519p6 0x1.73c71c71c71c7p5 +REG epsg:8189 4 -0x1.48685850c3e1bp6 0x1.73c71c71c71c7p5 +REG epsg:8191 0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce15p5 +REG epsg:8191 1 -0x1.811101c6c033dp6 0x1.308e5e6c9ce15p5 +REG epsg:8191 2 -0x1.4a4fb444a0825p6 0x1.308e5e6c9ce15p5 +REG epsg:8191 3 -0x1.811101c6c033dp6 0x1.808e5e6c9ce15p5 +REG epsg:8191 4 -0x1.4a4fb444a0825p6 0x1.808e5e6c9ce15p5 +REG epsg:8193 0 -0x1.65b05b05b05b1p6 0x1.588e5e6c9ce15p5 +REG epsg:8193 1 -0x1.811101c6c033dp6 0x1.308e5e6c9ce15p5 +REG epsg:8193 2 -0x1.4a4fb444a0825p6 0x1.308e5e6c9ce15p5 +REG epsg:8193 3 -0x1.811101c6c033dp6 0x1.808e5e6c9ce15p5 +REG epsg:8193 4 -0x1.4a4fb444a0825p6 0x1.808e5e6c9ce15p5 +REG epsg:8196 0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6da2p5 +REG epsg:8196 1 -0x1.87310ceda75f3p6 0x1.3199b6c0c6da2p5 +REG epsg:8196 2 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6da2p5 +REG epsg:8196 3 -0x1.87310ceda75f3p6 0x1.8199b6c0c6da2p5 +REG epsg:8196 4 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6da2p5 +REG epsg:8197 0 -0x1.6bc16c16c16c2p6 0x1.5999b6c0c6da2p5 +REG epsg:8197 1 -0x1.87310ceda75f3p6 0x1.3199b6c0c6da2p5 +REG epsg:8197 2 -0x1.5051cb3fdb791p6 0x1.3199b6c0c6da2p5 +REG epsg:8197 3 -0x1.87310ceda75f3p6 0x1.8199b6c0c6da2p5 +REG epsg:8197 4 -0x1.5051cb3fdb791p6 0x1.8199b6c0c6da2p5 +REG epsg:8198 0 -0x1.6593e93e93e94p6 0x1.5bb34ba7e5d44p5 +REG epsg:8198 1 -0x1.8121f60492aacp6 0x1.33b34ba7e5d44p5 +REG epsg:8198 2 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d44p5 +REG epsg:8198 3 -0x1.8121f60492aacp6 0x1.83b34ba7e5d44p5 +REG epsg:8198 4 -0x1.4a05dc789527cp6 0x1.83b34ba7e5d44p5 +REG epsg:8200 0 -0x1.6593e93e93e94p6 0x1.5bb34ba7e5d44p5 +REG epsg:8200 1 -0x1.8121f60492aacp6 0x1.33b34ba7e5d44p5 +REG epsg:8200 2 -0x1.4a05dc789527cp6 0x1.33b34ba7e5d44p5 +REG epsg:8200 3 -0x1.8121f60492aacp6 0x1.83b34ba7e5d44p5 +REG epsg:8200 4 -0x1.4a05dc789527cp6 0x1.83b34ba7e5d44p5 +REG epsg:8201 0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 +REG epsg:8201 1 -0x1.86737a6e2537ap6 0x1.34ccccccccccdp5 +REG epsg:8201 2 -0x1.4f37303c85732p6 0x1.34ccccccccccdp5 +REG epsg:8201 3 -0x1.86737a6e2537ap6 0x1.84ccccccccccdp5 +REG epsg:8201 4 -0x1.4f37303c85732p6 0x1.84ccccccccccdp5 +REG epsg:8202 0 -0x1.6ad5555555556p6 0x1.5cccccccccccdp5 +REG epsg:8202 1 -0x1.86737a6e2537ap6 0x1.34ccccccccccdp5 +REG epsg:8202 2 -0x1.4f37303c85732p6 0x1.34ccccccccccdp5 +REG epsg:8202 3 -0x1.86737a6e2537ap6 0x1.84ccccccccccdp5 +REG epsg:8202 4 -0x1.4f37303c85732p6 0x1.84ccccccccccdp5 +REG epsg:8203 0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9f4p5 +REG epsg:8203 1 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9f4p5 +REG epsg:8203 2 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9f4p5 +REG epsg:8203 3 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d9f4p5 +REG epsg:8203 4 -0x1.50e788cded91ep6 0x1.8fd2a6a33d9f4p5 +REG epsg:8204 0 -0x1.6d2d82d82d82dp6 0x1.67d2a6a33d9f4p5 +REG epsg:8204 1 -0x1.89737ce26d73cp6 0x1.3fd2a6a33d9f4p5 +REG epsg:8204 2 -0x1.50e788cded91ep6 0x1.3fd2a6a33d9f4p5 +REG epsg:8204 3 -0x1.89737ce26d73cp6 0x1.8fd2a6a33d9f4p5 +REG epsg:8204 4 -0x1.50e788cded91ep6 0x1.8fd2a6a33d9f4p5 +REG epsg:8205 0 -0x1.62p6 0x1.55c16c16c16c2p5 +REG epsg:8205 1 -0x1.7d38fa8e1f219p6 0x1.2dc16c16c16c2p5 +REG epsg:8205 2 -0x1.46c70571e0de7p6 0x1.2dc16c16c16c2p5 +REG epsg:8205 3 -0x1.7d38fa8e1f219p6 0x1.7dc16c16c16c2p5 +REG epsg:8205 4 -0x1.46c70571e0de7p6 0x1.7dc16c16c16c2p5 +REG epsg:8206 0 -0x1.62p6 0x1.55c16c16c16c2p5 +REG epsg:8206 1 -0x1.7d38fa8e1f219p6 0x1.2dc16c16c16c2p5 +REG epsg:8206 2 -0x1.46c70571e0de7p6 0x1.2dc16c16c16c2p5 +REG epsg:8206 3 -0x1.7d38fa8e1f219p6 0x1.7dc16c16c16c2p5 +REG epsg:8206 4 -0x1.46c70571e0de7p6 0x1.7dc16c16c16c2p5 +REG epsg:8207 0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69772p5 +REG epsg:8207 1 -0x1.8e91d67a70bdbp6 0x1.4730916b69772p5 +REG epsg:8207 2 -0x1.5517b0ead2635p6 0x1.4730916b69772p5 +REG epsg:8207 3 -0x1.8e91d67a70bdbp6 0x1.9730916b69772p5 +REG epsg:8207 4 -0x1.5517b0ead2635p6 0x1.9730916b69772p5 +REG epsg:8208 0 -0x1.71d4c3b2a1908p6 0x1.6f30916b69772p5 +REG epsg:8208 1 -0x1.8e91d67a70bdbp6 0x1.4730916b69772p5 +REG epsg:8208 2 -0x1.5517b0ead2635p6 0x1.4730916b69772p5 +REG epsg:8208 3 -0x1.8e91d67a70bdbp6 0x1.9730916b69772p5 +REG epsg:8208 4 -0x1.5517b0ead2635p6 0x1.9730916b69772p5 +REG epsg:8209 0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 +REG epsg:8209 1 -0x1.8ac09ae3a710ap6 0x1.33d9e26af37cp5 +REG epsg:8209 2 -0x1.53a01b27b9a56p6 0x1.33d9e26af37cp5 +REG epsg:8209 3 -0x1.8ac09ae3a710ap6 0x1.83d9e26af37cp5 +REG epsg:8209 4 -0x1.53a01b27b9a56p6 0x1.83d9e26af37cp5 +REG epsg:8210 0 -0x1.6f305b05b05bp6 0x1.5bd9e26af37cp5 +REG epsg:8210 1 -0x1.8ac09ae3a710ap6 0x1.33d9e26af37cp5 +REG epsg:8210 2 -0x1.53a01b27b9a56p6 0x1.33d9e26af37cp5 +REG epsg:8210 3 -0x1.8ac09ae3a710ap6 0x1.83d9e26af37cp5 +REG epsg:8210 4 -0x1.53a01b27b9a56p6 0x1.83d9e26af37cp5 +REG epsg:8212 0 -0x1.6p6 0x1.58p5 +REG epsg:8212 1 -0x1.7b58b77326d2dp6 0x1.3p5 +REG epsg:8212 2 -0x1.44a7488cd92d3p6 0x1.3p5 +REG epsg:8212 3 -0x1.7b58b77326d2dp6 0x1.8p5 +REG epsg:8212 4 -0x1.44a7488cd92d3p6 0x1.8p5 +REG epsg:8213 0 -0x1.6p6 0x1.58p5 +REG epsg:8213 1 -0x1.7b58b77326d2dp6 0x1.3p5 +REG epsg:8213 2 -0x1.44a7488cd92d3p6 0x1.3p5 +REG epsg:8213 3 -0x1.7b58b77326d2dp6 0x1.8p5 +REG epsg:8213 4 -0x1.44a7488cd92d3p6 0x1.8p5 +REG epsg:8214 0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe94p5 +REG epsg:8214 1 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe94p5 +REG epsg:8214 2 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe94p5 +REG epsg:8214 3 -0x1.89c1c8ea11967p6 0x1.9d5b709bbfe94p5 +REG epsg:8214 4 -0x1.4f771aa4274d3p6 0x1.9d5b709bbfe94p5 +REG epsg:8216 0 -0x1.6c9c71c71c71dp6 0x1.755b709bbfe94p5 +REG epsg:8216 1 -0x1.89c1c8ea11967p6 0x1.4d5b709bbfe94p5 +REG epsg:8216 2 -0x1.4f771aa4274d3p6 0x1.4d5b709bbfe94p5 +REG epsg:8216 3 -0x1.89c1c8ea11967p6 0x1.9d5b709bbfe94p5 +REG epsg:8216 4 -0x1.4f771aa4274d3p6 0x1.9d5b709bbfe94p5 +REG epsg:8218 0 -0x1.6f66666666666p6 0x1.6911111111111p5 +REG epsg:8218 1 -0x1.8bc0151cbe023p6 0x1.4111111111111p5 +REG epsg:8218 2 -0x1.530cb7b00eca9p6 0x1.4111111111111p5 +REG epsg:8218 3 -0x1.8bc0151cbe023p6 0x1.9111111111111p5 +REG epsg:8218 4 -0x1.530cb7b00eca9p6 0x1.9111111111111p5 +REG epsg:8220 0 -0x1.6f66666666666p6 0x1.6911111111111p5 +REG epsg:8220 1 -0x1.8bc0151cbe023p6 0x1.4111111111111p5 +REG epsg:8220 2 -0x1.530cb7b00eca9p6 0x1.4111111111111p5 +REG epsg:8220 3 -0x1.8bc0151cbe023p6 0x1.9111111111111p5 +REG epsg:8220 4 -0x1.530cb7b00eca9p6 0x1.9111111111111p5 +REG epsg:8222 0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 +REG epsg:8222 1 -0x1.8720d6c0171b2p6 0x1.45a61d950c84p5 +REG epsg:8222 2 -0x1.4dd978e4e3348p6 0x1.45a61d950c84p5 +REG epsg:8222 3 -0x1.8720d6c0171b2p6 0x1.95a61d950c84p5 +REG epsg:8222 4 -0x1.4dd978e4e3348p6 0x1.95a61d950c84p5 +REG epsg:8224 0 -0x1.6a7d27d27d27dp6 0x1.6da61d950c84p5 +REG epsg:8224 1 -0x1.8720d6c0171b2p6 0x1.45a61d950c84p5 +REG epsg:8224 2 -0x1.4dd978e4e3348p6 0x1.45a61d950c84p5 +REG epsg:8224 3 -0x1.8720d6c0171b2p6 0x1.95a61d950c84p5 +REG epsg:8224 4 -0x1.4dd978e4e3348p6 0x1.95a61d950c84p5 +REG epsg:8225 0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 +REG epsg:8225 1 -0x1.8382e3e1aefcap6 0x1.32eeeeeeeeeefp5 +REG epsg:8225 2 -0x1.4c7d1c1e51036p6 0x1.32eeeeeeeeeefp5 +REG epsg:8225 3 -0x1.8382e3e1aefcap6 0x1.82eeeeeeeeeefp5 +REG epsg:8225 4 -0x1.4c7d1c1e51036p6 0x1.82eeeeeeeeeefp5 +REG epsg:8226 0 -0x1.68p6 0x1.5aeeeeeeeeeefp5 +REG epsg:8226 1 -0x1.8382e3e1aefcap6 0x1.32eeeeeeeeeefp5 +REG epsg:8226 2 -0x1.4c7d1c1e51036p6 0x1.32eeeeeeeeeefp5 +REG epsg:8226 3 -0x1.8382e3e1aefcap6 0x1.82eeeeeeeeeefp5 +REG epsg:8226 4 -0x1.4c7d1c1e51036p6 0x1.82eeeeeeeeeefp5 +REG epsg:8227 0 0x0.0p0 0x0.0p0 +REG epsg:8227 1 -0x1.4p2 -0x1.4p2 +REG epsg:8227 2 0x1.4p2 -0x1.4p2 +REG epsg:8227 3 -0x1.4p2 0x1.4p2 +REG epsg:8227 4 0x1.4p2 0x1.4p2 +REG epsg:8230 0 0x0.0p0 0x0.0p0 +REG epsg:8230 1 -0x1.4p2 -0x1.4p2 +REG epsg:8230 2 0x1.4p2 -0x1.4p2 +REG epsg:8230 3 -0x1.4p2 0x1.4p2 +REG epsg:8230 4 0x1.4p2 0x1.4p2 +REG epsg:8232 0 0x0.0p0 0x0.0p0 +REG epsg:8232 1 -0x1.4p2 -0x1.4p2 +REG epsg:8232 2 0x1.4p2 -0x1.4p2 +REG epsg:8232 3 -0x1.4p2 0x1.4p2 +REG epsg:8232 4 0x1.4p2 0x1.4p2 +REG epsg:8233 0 0x0.0p0 0x0.0p0 +REG epsg:8233 1 -0x1.4p2 -0x1.4p2 +REG epsg:8233 2 0x1.4p2 -0x1.4p2 +REG epsg:8233 3 -0x1.4p2 0x1.4p2 +REG epsg:8233 4 0x1.4p2 0x1.4p2 +REG epsg:8237 0 0x0.0p0 0x0.0p0 +REG epsg:8237 1 -0x1.4p2 -0x1.4p2 +REG epsg:8237 2 0x1.4p2 -0x1.4p2 +REG epsg:8237 3 -0x1.4p2 0x1.4p2 +REG epsg:8237 4 0x1.4p2 0x1.4p2 +REG epsg:8238 0 0x0.0p0 0x0.0p0 +REG epsg:8238 1 -0x1.4p2 -0x1.4p2 +REG epsg:8238 2 0x1.4p2 -0x1.4p2 +REG epsg:8238 3 -0x1.4p2 0x1.4p2 +REG epsg:8238 4 0x1.4p2 0x1.4p2 +REG epsg:8240 0 0x0.0p0 0x0.0p0 +REG epsg:8240 1 -0x1.4p2 -0x1.4p2 +REG epsg:8240 2 0x1.4p2 -0x1.4p2 +REG epsg:8240 3 -0x1.4p2 0x1.4p2 +REG epsg:8240 4 0x1.4p2 0x1.4p2 +REG epsg:8242 0 0x0.0p0 0x0.0p0 +REG epsg:8242 1 -0x1.4p2 -0x1.4p2 +REG epsg:8242 2 0x1.4p2 -0x1.4p2 +REG epsg:8242 3 -0x1.4p2 0x1.4p2 +REG epsg:8242 4 0x1.4p2 0x1.4p2 +REG epsg:8246 0 0x0.0p0 0x0.0p0 +REG epsg:8246 1 -0x1.4p2 -0x1.4p2 +REG epsg:8246 2 0x1.4p2 -0x1.4p2 +REG epsg:8246 3 -0x1.4p2 0x1.4p2 +REG epsg:8246 4 0x1.4p2 0x1.4p2 +REG epsg:8247 0 0x0.0p0 0x0.0p0 +REG epsg:8247 1 -0x1.4p2 -0x1.4p2 +REG epsg:8247 2 0x1.4p2 -0x1.4p2 +REG epsg:8247 3 -0x1.4p2 0x1.4p2 +REG epsg:8247 4 0x1.4p2 0x1.4p2 +REG epsg:8249 0 0x0.0p0 0x0.0p0 +REG epsg:8249 1 -0x1.4p2 -0x1.4p2 +REG epsg:8249 2 0x1.4p2 -0x1.4p2 +REG epsg:8249 3 -0x1.4p2 0x1.4p2 +REG epsg:8249 4 0x1.4p2 0x1.4p2 +REG epsg:8250 0 0x0.0p0 0x0.0p0 +REG epsg:8250 1 -0x1.4p2 -0x1.4p2 +REG epsg:8250 2 0x1.4p2 -0x1.4p2 +REG epsg:8250 3 -0x1.4p2 0x1.4p2 +REG epsg:8250 4 0x1.4p2 0x1.4p2 +REG epsg:8252 0 0x0.0p0 0x0.0p0 +REG epsg:8252 1 -0x1.4p2 -0x1.4p2 +REG epsg:8252 2 0x1.4p2 -0x1.4p2 +REG epsg:8252 3 -0x1.4p2 0x1.4p2 +REG epsg:8252 4 0x1.4p2 0x1.4p2 +REG epsg:8253 0 0x0.0p0 0x0.0p0 +REG epsg:8253 1 -0x1.4p2 -0x1.4p2 +REG epsg:8253 2 0x1.4p2 -0x1.4p2 +REG epsg:8253 3 -0x1.4p2 0x1.4p2 +REG epsg:8253 4 0x1.4p2 0x1.4p2 +REG epsg:8255 0 0x0.0p0 0x0.0p0 +REG epsg:8255 1 -0x1.4p2 -0x1.4p2 +REG epsg:8255 2 0x1.4p2 -0x1.4p2 +REG epsg:8255 3 -0x1.4p2 0x1.4p2 +REG epsg:8255 4 0x1.4p2 0x1.4p2 +REG epsg:8311 0 -0x1.d6aaaaaaaaaadp6 0x1.5cp5 +REG epsg:8311 1 -0x1.f23d1741bc567p6 0x1.34p5 +REG epsg:8311 2 -0x1.bb183e1398ff3p6 0x1.34p5 +REG epsg:8311 3 -0x1.f23d1741bc567p6 0x1.84p5 +REG epsg:8311 4 -0x1.bb183e1398ff3p6 0x1.84p5 +REG epsg:8312 0 -0x1.d6aaaaaaaaaadp6 0x1.5cp5 +REG epsg:8312 1 -0x1.f23d1741bc567p6 0x1.34p5 +REG epsg:8312 2 -0x1.bb183e1398ff3p6 0x1.34p5 +REG epsg:8312 3 -0x1.f23d1741bc567p6 0x1.84p5 +REG epsg:8312 4 -0x1.bb183e1398ff3p6 0x1.84p5 +REG epsg:8313 0 -0x1.dcp6 0x1.5cp5 +REG epsg:8313 1 -0x1.f7926c9711abap6 0x1.34p5 +REG epsg:8313 2 -0x1.c06d9368ee546p6 0x1.34p5 +REG epsg:8313 3 -0x1.f7926c9711abap6 0x1.84p5 +REG epsg:8313 4 -0x1.c06d9368ee546p6 0x1.84p5 +REG epsg:8314 0 -0x1.dcp6 0x1.5cp5 +REG epsg:8314 1 -0x1.f7926c9711abap6 0x1.34p5 +REG epsg:8314 2 -0x1.c06d9368ee546p6 0x1.34p5 +REG epsg:8314 3 -0x1.f7926c9711abap6 0x1.84p5 +REG epsg:8314 4 -0x1.c06d9368ee546p6 0x1.84p5 +REG epsg:8315 0 -0x1.edaaaaaaaaaadp6 0x1.6caaaaaaaaaacp5 +REG epsg:8315 1 -0x1.051f264782b5bp7 0x1.44aaaaaaaaaacp5 +REG epsg:8315 2 -0x1.d11708c64fea4p6 0x1.44aaaaaaaaaacp5 +REG epsg:8315 3 -0x1.051f264782b5bp7 0x1.94aaaaaaaaaacp5 +REG epsg:8315 4 -0x1.d11708c64fea4p6 0x1.94aaaaaaaaaacp5 +REG epsg:8316 0 -0x1.edaaaaaaaaaadp6 0x1.6caaaaaaaaaacp5 +REG epsg:8316 1 -0x1.051f264782b5bp7 0x1.44aaaaaaaaaacp5 +REG epsg:8316 2 -0x1.d11708c64fea4p6 0x1.44aaaaaaaaaacp5 +REG epsg:8316 3 -0x1.051f264782b5bp7 0x1.94aaaaaaaaaacp5 +REG epsg:8316 4 -0x1.d11708c64fea4p6 0x1.94aaaaaaaaaacp5 +REG epsg:8317 0 -0x1.de88888888886p6 0x1.62p5 +REG epsg:8317 1 -0x1.fa745b65d81f5p6 0x1.3ap5 +REG epsg:8317 2 -0x1.c29cb5ab38f17p6 0x1.3ap5 +REG epsg:8317 3 -0x1.fa745b65d81f5p6 0x1.8ap5 +REG epsg:8317 4 -0x1.c29cb5ab38f17p6 0x1.8ap5 +REG epsg:8318 0 -0x1.de88888888886p6 0x1.62p5 +REG epsg:8318 1 -0x1.fa745b65d81f5p6 0x1.3ap5 +REG epsg:8318 2 -0x1.c29cb5ab38f17p6 0x1.3ap5 +REG epsg:8318 3 -0x1.fa745b65d81f5p6 0x1.8ap5 +REG epsg:8318 4 -0x1.c29cb5ab38f17p6 0x1.8ap5 +REG epsg:8319 0 -0x1.d9aaaaaaaaaadp6 0x1.4ep5 +REG epsg:8319 1 -0x1.f47968dd6dae5p6 0x1.26p5 +REG epsg:8319 2 -0x1.bedbec77e7a75p6 0x1.26p5 +REG epsg:8319 3 -0x1.f47968dd6dae5p6 0x1.76p5 +REG epsg:8319 4 -0x1.bedbec77e7a75p6 0x1.76p5 +REG epsg:8320 0 -0x1.d9aaaaaaaaaadp6 0x1.4ep5 +REG epsg:8320 1 -0x1.f47968dd6dae5p6 0x1.26p5 +REG epsg:8320 2 -0x1.bedbec77e7a75p6 0x1.26p5 +REG epsg:8320 3 -0x1.f47968dd6dae5p6 0x1.76p5 +REG epsg:8320 4 -0x1.bedbec77e7a75p6 0x1.76p5 +REG epsg:8321 0 -0x1.d5p6 0x1.6ap5 +REG epsg:8321 1 -0x1.f168933deea43p6 0x1.42p5 +REG epsg:8321 2 -0x1.b8976cc2115bdp6 0x1.42p5 +REG epsg:8321 3 -0x1.f168933deea43p6 0x1.92p5 +REG epsg:8321 4 -0x1.b8976cc2115bdp6 0x1.92p5 +REG epsg:8322 0 -0x1.d5p6 0x1.6ap5 +REG epsg:8322 1 -0x1.f168933deea43p6 0x1.42p5 +REG epsg:8322 2 -0x1.b8976cc2115bdp6 0x1.42p5 +REG epsg:8322 3 -0x1.f168933deea43p6 0x1.92p5 +REG epsg:8322 4 -0x1.b8976cc2115bdp6 0x1.92p5 +REG epsg:8323 0 -0x1.e9p6 0x1.5p5 +REG epsg:8323 1 -0x1.01f4d1dd9cddbp7 0x1.28p5 +REG epsg:8323 2 -0x1.ce165c44c644ap6 0x1.28p5 +REG epsg:8323 3 -0x1.01f4d1dd9cddbp7 0x1.78p5 +REG epsg:8323 4 -0x1.ce165c44c644ap6 0x1.78p5 +REG epsg:8324 0 -0x1.e9p6 0x1.5p5 +REG epsg:8324 1 -0x1.01f4d1dd9cddbp7 0x1.28p5 +REG epsg:8324 2 -0x1.ce165c44c644ap6 0x1.28p5 +REG epsg:8324 3 -0x1.01f4d1dd9cddbp7 0x1.78p5 +REG epsg:8324 4 -0x1.ce165c44c644ap6 0x1.78p5 +REG epsg:8325 0 -0x1.e1p6 0x1.78p5 +REG epsg:8325 1 -0x1.fe535974468ddp6 0x1.5p5 +REG epsg:8325 2 -0x1.c3aca68bb9723p6 0x1.5p5 +REG epsg:8325 3 -0x1.fe535974468ddp6 0x1.ap5 +REG epsg:8325 4 -0x1.c3aca68bb9723p6 0x1.ap5 +REG epsg:8326 0 -0x1.e1p6 0x1.78p5 +REG epsg:8326 1 -0x1.fe535974468ddp6 0x1.5p5 +REG epsg:8326 2 -0x1.c3aca68bb9723p6 0x1.5p5 +REG epsg:8326 3 -0x1.fe535974468ddp6 0x1.ap5 +REG epsg:8326 4 -0x1.c3aca68bb9723p6 0x1.ap5 +REG epsg:8327 0 -0x1.e2p6 0x1.7155555555554p5 +REG epsg:8327 1 -0x1.fee0d4657d382p6 0x1.4955555555554p5 +REG epsg:8327 2 -0x1.c51f2b9a82c7ep6 0x1.4955555555554p5 +REG epsg:8327 3 -0x1.fee0d4657d382p6 0x1.9955555555554p5 +REG epsg:8327 4 -0x1.c51f2b9a82c7ep6 0x1.9955555555554p5 +REG epsg:8328 0 -0x1.e2p6 0x1.7155555555554p5 +REG epsg:8328 1 -0x1.fee0d4657d382p6 0x1.4955555555554p5 +REG epsg:8328 2 -0x1.c51f2b9a82c7ep6 0x1.4955555555554p5 +REG epsg:8328 3 -0x1.fee0d4657d382p6 0x1.9955555555554p5 +REG epsg:8328 4 -0x1.c51f2b9a82c7ep6 0x1.9955555555554p5 +REG epsg:8329 0 -0x1.e2p6 0x1.5cp5 +REG epsg:8329 1 -0x1.fd926c9711abap6 0x1.34p5 +REG epsg:8329 2 -0x1.c66d9368ee546p6 0x1.34p5 +REG epsg:8329 3 -0x1.fd926c9711abap6 0x1.84p5 +REG epsg:8329 4 -0x1.c66d9368ee546p6 0x1.84p5 +REG epsg:8330 0 -0x1.e2p6 0x1.5cp5 +REG epsg:8330 1 -0x1.fd926c9711abap6 0x1.34p5 +REG epsg:8330 2 -0x1.c66d9368ee546p6 0x1.34p5 +REG epsg:8330 3 -0x1.fd926c9711abap6 0x1.84p5 +REG epsg:8330 4 -0x1.c66d9368ee546p6 0x1.84p5 +REG epsg:8331 0 -0x1.d655555555553p6 0x1.4ep5 +REG epsg:8331 1 -0x1.f12413881858bp6 0x1.26p5 +REG epsg:8331 2 -0x1.bb8697229251bp6 0x1.26p5 +REG epsg:8331 3 -0x1.f12413881858bp6 0x1.76p5 +REG epsg:8331 4 -0x1.bb8697229251bp6 0x1.76p5 +REG epsg:8332 0 -0x1.d655555555553p6 0x1.4ep5 +REG epsg:8332 1 -0x1.f12413881858bp6 0x1.26p5 +REG epsg:8332 2 -0x1.bb8697229251bp6 0x1.26p5 +REG epsg:8332 3 -0x1.f12413881858bp6 0x1.76p5 +REG epsg:8332 4 -0x1.bb8697229251bp6 0x1.76p5 +REG epsg:8333 0 -0x1.dcp6 0x1.7155555555554p5 +REG epsg:8333 1 -0x1.f8e0d4657d382p6 0x1.4955555555554p5 +REG epsg:8333 2 -0x1.bf1f2b9a82c7ep6 0x1.4955555555554p5 +REG epsg:8333 3 -0x1.f8e0d4657d382p6 0x1.9955555555554p5 +REG epsg:8333 4 -0x1.bf1f2b9a82c7ep6 0x1.9955555555554p5 +REG epsg:8334 0 -0x1.dcp6 0x1.7155555555554p5 +REG epsg:8334 1 -0x1.f8e0d4657d382p6 0x1.4955555555554p5 +REG epsg:8334 2 -0x1.bf1f2b9a82c7ep6 0x1.4955555555554p5 +REG epsg:8334 3 -0x1.f8e0d4657d382p6 0x1.9955555555554p5 +REG epsg:8334 4 -0x1.bf1f2b9a82c7ep6 0x1.9955555555554p5 +REG epsg:8335 0 -0x1.d8p6 0x1.6p5 +REG epsg:8335 1 -0x1.f3cda338d6219p6 0x1.38p5 +REG epsg:8335 2 -0x1.bc325cc729de7p6 0x1.38p5 +REG epsg:8335 3 -0x1.f3cda338d6219p6 0x1.88p5 +REG epsg:8335 4 -0x1.bc325cc729de7p6 0x1.88p5 +REG epsg:8336 0 -0x1.d8p6 0x1.6p5 +REG epsg:8336 1 -0x1.f3cda338d6219p6 0x1.38p5 +REG epsg:8336 2 -0x1.bc325cc729de7p6 0x1.38p5 +REG epsg:8336 3 -0x1.f3cda338d6219p6 0x1.88p5 +REG epsg:8336 4 -0x1.bc325cc729de7p6 0x1.88p5 +REG epsg:8337 0 -0x1.e155555555553p6 0x1.4ep5 +REG epsg:8337 1 -0x1.fc2413881858bp6 0x1.26p5 +REG epsg:8337 2 -0x1.c68697229251bp6 0x1.26p5 +REG epsg:8337 3 -0x1.fc2413881858bp6 0x1.76p5 +REG epsg:8337 4 -0x1.c68697229251bp6 0x1.76p5 +REG epsg:8338 0 -0x1.e155555555553p6 0x1.4ep5 +REG epsg:8338 1 -0x1.fc2413881858bp6 0x1.26p5 +REG epsg:8338 2 -0x1.c68697229251bp6 0x1.26p5 +REG epsg:8338 3 -0x1.fc2413881858bp6 0x1.76p5 +REG epsg:8338 4 -0x1.c68697229251bp6 0x1.76p5 +REG epsg:8339 0 -0x1.ea55555555553p6 0x1.54p5 +REG epsg:8339 1 -0x1.02bae6c432872p7 0x1.2cp5 +REG epsg:8339 2 -0x1.cf34dd22459c2p6 0x1.2cp5 +REG epsg:8339 3 -0x1.02bae6c432872p7 0x1.7cp5 +REG epsg:8339 4 -0x1.cf34dd22459c2p6 0x1.7cp5 +REG epsg:8340 0 -0x1.ea55555555553p6 0x1.54p5 +REG epsg:8340 1 -0x1.02bae6c432872p7 0x1.2cp5 +REG epsg:8340 2 -0x1.cf34dd22459c2p6 0x1.2cp5 +REG epsg:8340 3 -0x1.02bae6c432872p7 0x1.7cp5 +REG epsg:8340 4 -0x1.cf34dd22459c2p6 0x1.7cp5 +REG epsg:8341 0 -0x1.dcp6 0x1.6ap5 +REG epsg:8341 1 -0x1.f868933deea43p6 0x1.42p5 +REG epsg:8341 2 -0x1.bf976cc2115bdp6 0x1.42p5 +REG epsg:8341 3 -0x1.f868933deea43p6 0x1.92p5 +REG epsg:8341 4 -0x1.bf976cc2115bdp6 0x1.92p5 +REG epsg:8342 0 -0x1.dcp6 0x1.6ap5 +REG epsg:8342 1 -0x1.f868933deea43p6 0x1.42p5 +REG epsg:8342 2 -0x1.bf976cc2115bdp6 0x1.42p5 +REG epsg:8342 3 -0x1.f868933deea43p6 0x1.92p5 +REG epsg:8342 4 -0x1.bf976cc2115bdp6 0x1.92p5 +REG epsg:8343 0 -0x1.d6p6 0x1.6ap5 +REG epsg:8343 1 -0x1.f268933deea43p6 0x1.42p5 +REG epsg:8343 2 -0x1.b9976cc2115bdp6 0x1.42p5 +REG epsg:8343 3 -0x1.f268933deea43p6 0x1.92p5 +REG epsg:8343 4 -0x1.b9976cc2115bdp6 0x1.92p5 +REG epsg:8344 0 -0x1.d6p6 0x1.6ap5 +REG epsg:8344 1 -0x1.f268933deea43p6 0x1.42p5 +REG epsg:8344 2 -0x1.b9976cc2115bdp6 0x1.42p5 +REG epsg:8344 3 -0x1.f268933deea43p6 0x1.92p5 +REG epsg:8344 4 -0x1.b9976cc2115bdp6 0x1.92p5 +REG epsg:8345 0 -0x1.ep6 0x1.54p5 +REG epsg:8345 1 -0x1.fb2078330fb91p6 0x1.2cp5 +REG epsg:8345 2 -0x1.c4df87ccf046fp6 0x1.2cp5 +REG epsg:8345 3 -0x1.fb2078330fb91p6 0x1.7cp5 +REG epsg:8345 4 -0x1.c4df87ccf046fp6 0x1.7cp5 +REG epsg:8346 0 -0x1.ep6 0x1.54p5 +REG epsg:8346 1 -0x1.fb2078330fb91p6 0x1.2cp5 +REG epsg:8346 2 -0x1.c4df87ccf046fp6 0x1.2cp5 +REG epsg:8346 3 -0x1.fb2078330fb91p6 0x1.7cp5 +REG epsg:8346 4 -0x1.c4df87ccf046fp6 0x1.7cp5 +REG epsg:8347 0 -0x1.e8p6 0x1.58p5 +REG epsg:8347 1 -0x1.01ac5bb993697p7 0x1.3p5 +REG epsg:8347 2 -0x1.cca7488cd92d3p6 0x1.3p5 +REG epsg:8347 3 -0x1.01ac5bb993697p7 0x1.8p5 +REG epsg:8347 4 -0x1.cca7488cd92d3p6 0x1.8p5 +REG epsg:8348 0 -0x1.e8p6 0x1.58p5 +REG epsg:8348 1 -0x1.01ac5bb993697p7 0x1.3p5 +REG epsg:8348 2 -0x1.cca7488cd92d3p6 0x1.3p5 +REG epsg:8348 3 -0x1.01ac5bb993697p7 0x1.8p5 +REG epsg:8348 4 -0x1.cca7488cd92d3p6 0x1.8p5 +REG epsg:8349 0 0x0.0p0 0x0.0p0 +REG epsg:8349 1 -0x1.4p2 -0x1.4p2 +REG epsg:8349 2 0x1.4p2 -0x1.4p2 +REG epsg:8349 3 -0x1.4p2 0x1.4p2 +REG epsg:8349 4 0x1.4p2 0x1.4p2 +REG epsg:8350 0 0x0.0p0 0x0.0p0 +REG epsg:8350 1 -0x1.4p2 -0x1.4p2 +REG epsg:8350 2 0x1.4p2 -0x1.4p2 +REG epsg:8350 3 -0x1.4p2 0x1.4p2 +REG epsg:8350 4 0x1.4p2 0x1.4p2 +REG epsg:9054 0 0x0.0p0 0x0.0p0 +REG epsg:9054 1 -0x1.4p2 -0x1.4p2 +REG epsg:9054 2 0x1.4p2 -0x1.4p2 +REG epsg:9054 3 -0x1.4p2 0x1.4p2 +REG epsg:9054 4 0x1.4p2 0x1.4p2 +REG esri:102001 0 -0x1.8p6 0x1.b8p5 +REG esri:102001 1 -0x1.e89b57c07a845p6 0x1.4p5 +REG esri:102001 2 -0x1.1764a83f857bbp6 0x1.4p5 +REG esri:102001 3 -0x1.e89b57c07a845p6 0x1.18p6 +REG esri:102001 4 -0x1.1764a83f857bbp6 0x1.18p6 +REG esri:102002 0 -0x1.8p6 0x1.b8p5 +REG esri:102002 1 -0x1.e89b57c07a845p6 0x1.4p5 +REG esri:102002 2 -0x1.1764a83f857bbp6 0x1.4p5 +REG esri:102002 3 -0x1.e89b57c07a845p6 0x1.18p6 +REG esri:102002 4 -0x1.1764a83f857bbp6 0x1.18p6 +REG esri:102003 0 -0x1.8p6 0x1.2cp5 +REG esri:102003 1 -0x1.cba0db351d0e3p6 0x1.68p4 +REG esri:102003 2 -0x1.345f24cae2f1dp6 0x1.68p4 +REG esri:102003 3 -0x1.cba0db351d0e3p6 0x1.a4p5 +REG esri:102003 4 -0x1.345f24cae2f1dp6 0x1.a4p5 +REG esri:102004 0 -0x1.8p6 0x1.38p5 +REG esri:102004 1 -0x1.bdc3b3987fa9bp6 0x1.bp4 +REG esri:102004 2 -0x1.423c4c6780565p6 0x1.bp4 +REG esri:102004 3 -0x1.bdc3b3987fa9bp6 0x1.98p5 +REG esri:102004 4 -0x1.423c4c6780565p6 0x1.98p5 +REG esri:102005 0 0x0.0p0 0x1.68p4 +REG esri:102005 1 -0x1.03c62d41d850cp4 0x1.ep2 +REG esri:102005 2 0x1.03c62d41d850cp4 0x1.ep2 +REG esri:102005 3 -0x1.03c62d41d850cp4 0x1.2cp5 +REG esri:102005 4 0x1.03c62d41d850cp4 0x1.2cp5 +REG esri:102006 0 -0x1.34p7 0x1.ccp5 +REG esri:102006 1 0x1.642a4c850f0f1p7 0x1.54p5 +REG esri:102006 2 -0x1.f854990a1e1e2p6 0x1.54p5 +REG esri:102006 3 0x1.642a4c850f0f1p7 0x1.22p6 +REG esri:102006 4 -0x1.f854990a1e1e2p6 0x1.22p6 +REG esri:102007 0 -0x1.3ap7 0x1.ap3 +REG esri:102007 1 -0x1.4e86ad51f6762p7 0x1.8p1 +REG esri:102007 2 -0x1.257952ae0989ep7 0x1.8p1 +REG esri:102007 3 -0x1.4e86ad51f6762p7 0x1.7p4 +REG esri:102007 4 -0x1.257952ae0989ep7 0x1.7p4 +REG esri:102008 0 -0x1.8p6 0x1.4p5 +REG esri:102008 1 -0x1.ce530e53aa876p6 0x1.9p4 +REG esri:102008 2 -0x1.31acf1ac5578ap6 0x1.9p4 +REG esri:102008 3 -0x1.ce530e53aa876p6 0x1.b8p5 +REG esri:102008 4 -0x1.31acf1ac5578ap6 0x1.b8p5 +REG esri:102009 0 -0x1.8p6 0x1.4p5 +REG esri:102009 1 -0x1.ce530e53aa876p6 0x1.9p4 +REG esri:102009 2 -0x1.31acf1ac5578ap6 0x1.9p4 +REG esri:102009 3 -0x1.ce530e53aa876p6 0x1.b8p5 +REG esri:102009 4 -0x1.31acf1ac5578ap6 0x1.b8p5 +REG esri:102010 0 0x0.0p0 0x1.ep4 +REG esri:102010 1 -0x1.1520cd1372feap4 0x1.ep3 +REG esri:102010 2 0x1.1520cd1372feap4 0x1.ep3 +REG esri:102010 3 -0x1.1520cd1372feap4 0x1.68p5 +REG esri:102010 4 0x1.1520cd1372feap4 0x1.68p5 +REG esri:102011 0 0x0.0p0 0x0.0p0 +REG esri:102011 1 -0x1.4p2 -0x1.4p2 +REG esri:102011 2 0x1.4p2 -0x1.4p2 +REG esri:102011 3 -0x1.4p2 0x1.4p2 +REG esri:102011 4 0x1.4p2 0x1.4p2 +REG esri:102012 0 0x1.a4p6 0x1.fp4 +REG esri:102012 1 0x1.5e0082d22053ap6 0x1.0p4 +REG esri:102012 2 0x1.e9ff7d2ddfac6p6 0x1.0p4 +REG esri:102012 3 0x1.5e0082d22053ap6 0x1.7p5 +REG esri:102012 4 0x1.e9ff7d2ddfac6p6 0x1.7p5 +REG esri:102013 0 0x1.4p3 0x1.7p5 +REG esri:102013 1 -0x1.72fcb5249100cp3 0x1.fp4 +REG esri:102013 2 0x1.f97e5a9248806p4 0x1.fp4 +REG esri:102013 3 -0x1.72fcb5249100cp3 0x1.e8p5 +REG esri:102013 4 0x1.f97e5a9248806p4 0x1.e8p5 +REG esri:102014 0 0x1.4p3 0x1.7p5 +REG esri:102014 1 -0x1.72fcb5249100cp3 0x1.fp4 +REG esri:102014 2 0x1.f97e5a9248806p4 0x1.fp4 +REG esri:102014 3 -0x1.72fcb5249100cp3 0x1.e8p5 +REG esri:102014 4 0x1.f97e5a9248806p4 0x1.e8p5 +REG esri:102015 0 -0x1.ep5 -0x1.78p4 +REG esri:102015 1 -0x1.316d2ce448965p6 -0x1.34p5 +REG esri:102015 2 -0x1.5d25a6376ed36p5 -0x1.34p5 +REG esri:102015 3 -0x1.316d2ce448965p6 -0x1.1p3 +REG esri:102015 4 -0x1.5d25a6376ed36p5 -0x1.1p3 +REG esri:102016 0 0x0.0p0 0x1.64p6 +REG esri:102016 1 -0x1.ep5 0x1.54p6 +REG esri:102016 2 0x1.ep5 0x1.54p6 +REG esri:102016 3 -0x1.ep5 0x1.64p6 +REG esri:102016 4 0x1.ep5 0x1.64p6 +REG esri:102017 0 0x0.0p0 0x1.64p6 +REG esri:102017 1 -0x1.ep5 0x1.54p6 +REG esri:102017 2 0x1.ep5 0x1.54p6 +REG esri:102017 3 -0x1.ep5 0x1.64p6 +REG esri:102017 4 0x1.ep5 0x1.64p6 +REG esri:102018 0 0x0.0p0 0x1.64p6 +REG esri:102018 1 -0x1.ep5 0x1.54p6 +REG esri:102018 2 0x1.ep5 0x1.54p6 +REG esri:102018 3 -0x1.ep5 0x1.64p6 +REG esri:102018 4 0x1.ep5 0x1.64p6 +REG esri:102019 0 0x0.0p0 -0x1.64p6 +REG esri:102019 1 -0x1.ep5 -0x1.64p6 +REG esri:102019 2 0x1.ep5 -0x1.64p6 +REG esri:102019 3 -0x1.ep5 -0x1.54p6 +REG esri:102019 4 0x1.ep5 -0x1.54p6 +REG esri:102020 0 0x0.0p0 -0x1.64p6 +REG esri:102020 1 -0x1.ep5 -0x1.64p6 +REG esri:102020 2 0x1.ep5 -0x1.64p6 +REG esri:102020 3 -0x1.ep5 -0x1.54p6 +REG esri:102020 4 0x1.ep5 -0x1.54p6 +REG esri:102021 0 0x0.0p0 -0x1.64p6 +REG esri:102021 1 -0x1.ep5 -0x1.64p6 +REG esri:102021 2 0x1.ep5 -0x1.64p6 +REG esri:102021 3 -0x1.ep5 -0x1.54p6 +REG esri:102021 4 0x1.ep5 -0x1.54p6 +REG esri:102022 0 0x1.9p4 -0x1.8p0 +REG esri:102022 1 0x1.3fd5e0ae3df4bp3 -0x1.08p4 +REG esri:102022 2 0x1.400a87d47082dp5 -0x1.08p4 +REG esri:102022 3 0x1.3fd5e0ae3df4bp3 0x1.bp3 +REG esri:102022 4 0x1.400a87d47082dp5 0x1.bp3 +REG esri:102023 0 0x0.0p0 -0x1.8p0 +REG esri:102023 1 -0x1.e02a1f51c20b5p3 -0x1.08p4 +REG esri:102023 2 0x1.e02a1f51c20b5p3 -0x1.08p4 +REG esri:102023 3 -0x1.e02a1f51c20b5p3 0x1.bp3 +REG esri:102023 4 0x1.e02a1f51c20b5p3 0x1.bp3 +REG esri:102024 0 0x1.9p4 -0x1.8p0 +REG esri:102024 1 0x1.3fd5e0ae3df4bp3 -0x1.08p4 +REG esri:102024 2 0x1.400a87d47082dp5 -0x1.08p4 +REG esri:102024 3 0x1.3fd5e0ae3df4bp3 0x1.bp3 +REG esri:102024 4 0x1.400a87d47082dp5 0x1.bp3 +REG esri:102025 0 0x1.7cp6 0x1.4p5 +REG esri:102025 1 0x1.2dacf1ac5578ap6 0x1.9p4 +REG esri:102025 2 0x1.ca530e53aa876p6 0x1.9p4 +REG esri:102025 3 0x1.2dacf1ac5578ap6 0x1.b8p5 +REG esri:102025 4 0x1.ca530e53aa876p6 0x1.b8p5 +REG esri:102026 0 0x0.0p0 0x1.04p5 +REG esri:102026 1 -0x1.1c90bc2dd53a2p4 0x1.18p4 +REG esri:102026 2 0x1.1c90bc2dd53a2p4 0x1.18p4 +REG esri:102026 3 -0x1.1c90bc2dd53a2p4 0x1.7cp5 +REG esri:102026 4 0x1.1c90bc2dd53a2p4 0x1.7cp5 +REG esri:102027 0 0x1.7cp6 0x1.4p5 +REG esri:102027 1 0x1.2dacf1ac5578ap6 0x1.9p4 +REG esri:102027 2 0x1.ca530e53aa876p6 0x1.9p4 +REG esri:102027 3 0x1.2dacf1ac5578ap6 0x1.b8p5 +REG esri:102027 4 0x1.ca530e53aa876p6 0x1.b8p5 +REG esri:102028 0 0x1.f4p6 -0x1.9p3 +REG esri:102028 1 0x1.b68b1110a362ap6 -0x1.b8p4 +REG esri:102028 2 0x1.18ba7777ae4ebp7 -0x1.b8p4 +REG esri:102028 3 0x1.b68b1110a362ap6 0x1.4p1 +REG esri:102028 4 0x1.18ba7777ae4ebp7 0x1.4p1 +REG esri:102029 0 0x0.0p0 -0x1.9p3 +REG esri:102029 1 -0x1.eba7777ae4eb4p3 -0x1.b8p4 +REG esri:102029 2 0x1.eba7777ae4eb4p3 -0x1.b8p4 +REG esri:102029 3 -0x1.eba7777ae4eb4p3 0x1.4p1 +REG esri:102029 4 0x1.eba7777ae4eb4p3 0x1.4p1 +REG esri:102030 0 0x1.f4p6 -0x1.9p3 +REG esri:102030 1 0x1.b68b1110a362ap6 -0x1.b8p4 +REG esri:102030 2 0x1.18ba7777ae4ebp7 -0x1.b8p4 +REG esri:102030 3 0x1.b68b1110a362ap6 0x1.4p1 +REG esri:102030 4 0x1.18ba7777ae4ebp7 0x1.4p1 +REG esri:102031 0 0x0.0p0 0x1.fp4 +REG esri:102031 1 -0x1.17fdf4b77eb17p4 0x1.0p4 +REG esri:102031 2 0x1.17fdf4b77eb17p4 0x1.0p4 +REG esri:102031 3 -0x1.17fdf4b77eb17p4 0x1.7p5 +REG esri:102031 4 0x1.17fdf4b77eb17p4 0x1.7p5 +REG esri:102032 0 0x0.0p0 -0x1.5p4 +REG esri:102032 1 -0x1.011325fe22d72p4 -0x1.2p5 +REG esri:102032 2 0x1.011325fe22d72p4 -0x1.2p5 +REG esri:102032 3 -0x1.011325fe22d72p4 -0x1.8p2 +REG esri:102032 4 0x1.011325fe22d72p4 -0x1.8p2 +REG esri:102033 0 -0x1.ep5 -0x1.78p4 +REG esri:102033 1 -0x1.316d2ce448965p6 -0x1.34p5 +REG esri:102033 2 -0x1.5d25a6376ed36p5 -0x1.34p5 +REG esri:102033 3 -0x1.316d2ce448965p6 -0x1.1p3 +REG esri:102033 4 -0x1.5d25a6376ed36p5 -0x1.1p3 +REG esri:102065 0 0x1.8d55555555554p4 0x1.8cp5 +REG esri:102065 1 0x1.1226dd0312abdp4 0x1.64p5 +REG esri:102065 2 0x1.0441e6d3cbff6p5 0x1.64p5 +REG esri:102065 3 0x1.1226dd0312abdp4 0x1.b4p5 +REG esri:102065 4 0x1.0441e6d3cbff6p5 0x1.b4p5 +REG esri:102066 0 0x1.8d55555555554p4 0x1.8cp5 +REG esri:102066 1 0x1.1226dd0312abdp4 0x1.64p5 +REG esri:102066 2 0x1.0441e6d3cbff6p5 0x1.64p5 +REG esri:102066 3 0x1.1226dd0312abdp4 0x1.b4p5 +REG esri:102066 4 0x1.0441e6d3cbff6p5 0x1.b4p5 +REG esri:102067 0 0x1.8d55555555554p4 0x1.8cp5 +REG esri:102067 1 0x1.1226dd0312abdp4 0x1.64p5 +REG esri:102067 2 0x1.0441e6d3cbff6p5 0x1.64p5 +REG esri:102067 3 0x1.1226dd0312abdp4 0x1.b4p5 +REG esri:102067 4 0x1.0441e6d3cbff6p5 0x1.b4p5 +REG esri:102091 0 0x1.2p3 0x0.0p0 +REG esri:102091 1 0x1.0p2 -0x1.4p2 +REG esri:102091 2 0x1.cp3 -0x1.4p2 +REG esri:102091 3 0x1.0p2 0x1.4p2 +REG esri:102091 4 0x1.cp3 0x1.4p2 +REG esri:102092 0 0x1.ep3 0x0.0p0 +REG esri:102092 1 0x1.4p3 -0x1.4p2 +REG esri:102092 2 0x1.4p4 -0x1.4p2 +REG esri:102092 3 0x1.4p3 0x1.4p2 +REG esri:102092 4 0x1.4p4 0x1.4p2 +REG esri:102101 0 0x1.839999999999ap2 0x1.dp5 +REG esri:102101 1 -0x1.b087f9264f45p1 0x1.a8p5 +REG esri:102101 2 0x1.efbb97e32d6aep3 0x1.a8p5 +REG esri:102101 3 -0x1.b087f9264f45p1 0x1.f8p5 +REG esri:102101 4 0x1.efbb97e32d6aep3 0x1.f8p5 +REG esri:102102 0 0x1.0c77777777777p3 0x1.dp5 +REG esri:102102 1 -0x1.0bba9cf74935p0 0x1.a8p5 +REG esri:102102 2 0x1.1d332146ec0acp4 0x1.a8p5 +REG esri:102102 3 -0x1.0bba9cf74935p0 0x1.f8p5 +REG esri:102102 4 0x1.1d332146ec0acp4 0x1.f8p5 +REG esri:102103 0 0x1.5722222222224p3 0x1.dp5 +REG esri:102103 1 0x1.499ab85e0c218p0 0x1.a8p5 +REG esri:102103 2 0x1.4288769c41602p4 0x1.a8p5 +REG esri:102103 3 0x1.499ab85e0c218p0 0x1.f8p5 +REG esri:102103 4 0x1.4288769c41602p4 0x1.f8p5 +REG esri:102104 0 0x1.a722222222224p3 0x1.dp5 +REG esri:102104 1 0x1.e4cd5c2f0610cp1 0x1.a8p5 +REG esri:102104 2 0x1.6a88769c41602p4 0x1.a8p5 +REG esri:102104 3 0x1.e4cd5c2f0610cp1 0x1.f8p5 +REG esri:102104 4 0x1.6a88769c41602p4 0x1.f8p5 +REG esri:102105 0 0x1.0e3bbbbbbbbbbp4 0x1.dp5 +REG esri:102105 1 0x1.dd1158c22db2ap2 0x1.a8p5 +REG esri:102105 2 0x1.a5332146ec0acp4 0x1.a8p5 +REG esri:102105 3 0x1.dd1158c22db2ap2 0x1.f8p5 +REG esri:102105 4 0x1.a5332146ec0acp4 0x1.f8p5 +REG esri:102106 0 0x1.4e3bbbbbbbbbbp4 0x1.dp5 +REG esri:102106 1 0x1.6e88ac6116d95p3 0x1.a8p5 +REG esri:102106 2 0x1.e5332146ec0acp4 0x1.a8p5 +REG esri:102106 3 0x1.6e88ac6116d95p3 0x1.f8p5 +REG esri:102106 4 0x1.e5332146ec0acp4 0x1.f8p5 +REG esri:102107 0 0x1.8e3bbbbbbbbbbp4 0x1.dp5 +REG esri:102107 1 0x1.ee88ac6116d95p3 0x1.a8p5 +REG esri:102107 2 0x1.129990a376056p5 0x1.a8p5 +REG esri:102107 3 0x1.ee88ac6116d95p3 0x1.f8p5 +REG esri:102107 4 0x1.129990a376056p5 0x1.f8p5 +REG esri:102108 0 0x1.d0e6666666666p4 0x1.dp5 +REG esri:102108 1 0x1.39ef00db36176p4 0x1.a8p5 +REG esri:102108 2 0x1.33eee5f8cb5abp5 0x1.a8p5 +REG esri:102108 3 0x1.39ef00db36176p4 0x1.f8p5 +REG esri:102108 4 0x1.33eee5f8cb5abp5 0x1.f8p5 +REG esri:102110 0 0x1.8p1 0x1.74p5 +REG esri:102110 1 -0x1.10e06f120d02p2 0x1.4cp5 +REG esri:102110 2 0x1.487037890681p3 0x1.4cp5 +REG esri:102110 3 -0x1.10e06f120d02p2 0x1.9cp5 +REG esri:102110 4 0x1.487037890681p3 0x1.9cp5 +REG esri:102114 0 -0x1.3ep7 0x0.0p0 +REG esri:102114 1 -0x1.48p7 -0x1.4p2 +REG esri:102114 2 -0x1.34p7 -0x1.4p2 +REG esri:102114 3 -0x1.48p7 0x1.4p2 +REG esri:102114 4 -0x1.34p7 0x1.4p2 +REG esri:102115 0 -0x1.32p7 0x0.0p0 +REG esri:102115 1 -0x1.3cp7 -0x1.4p2 +REG esri:102115 2 -0x1.28p7 -0x1.4p2 +REG esri:102115 3 -0x1.3cp7 0x1.4p2 +REG esri:102115 4 -0x1.28p7 0x1.4p2 +REG esri:102120 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG esri:102120 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG esri:102120 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG esri:102120 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG esri:102120 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG esri:102121 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG esri:102121 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG esri:102121 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG esri:102121 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG esri:102121 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG esri:102122 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG esri:102122 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG esri:102122 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG esri:102122 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG esri:102122 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG esri:102123 0 -0x1.58p6 0x1.6a792c5f92c5fp5 +REG esri:102123 1 -0x1.747029aea2078p6 0x1.42792c5f92c5fp5 +REG esri:102123 2 -0x1.3b8fd6515df88p6 0x1.42792c5f92c5fp5 +REG esri:102123 3 -0x1.747029aea2078p6 0x1.92792c5f92c5fp5 +REG esri:102123 4 -0x1.3b8fd6515df88p6 0x1.92792c5f92c5fp5 +REG esri:102132 0 0x1.2p3 0x0.0p0 +REG esri:102132 1 0x1.0p2 -0x1.4p2 +REG esri:102132 2 0x1.cp3 -0x1.4p2 +REG esri:102132 3 0x1.0p2 0x1.4p2 +REG esri:102132 4 0x1.cp3 0x1.4p2 +REG esri:102133 0 0x1.ep3 0x0.0p0 +REG esri:102133 1 0x1.4p3 -0x1.4p2 +REG esri:102133 2 0x1.4p4 -0x1.4p2 +REG esri:102133 3 0x1.4p3 0x1.4p2 +REG esri:102133 4 0x1.4p4 0x1.4p2 +REG esri:102134 0 0x1.5p4 0x0.0p0 +REG esri:102134 1 0x1.0p4 -0x1.4p2 +REG esri:102134 2 0x1.ap4 -0x1.4p2 +REG esri:102134 3 0x1.0p4 0x1.4p2 +REG esri:102134 4 0x1.ap4 0x1.4p2 +REG esri:102135 0 0x1.bp4 0x0.0p0 +REG esri:102135 1 0x1.6p4 -0x1.4p2 +REG esri:102135 2 0x1.0p5 -0x1.4p2 +REG esri:102135 3 0x1.6p4 0x1.4p2 +REG esri:102135 4 0x1.0p5 0x1.4p2 +REG esri:102140 0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 +REG esri:102140 1 0x1.b3187ac81cd3bp6 0x1.14fe7f85aa87dp4 +REG esri:102140 2 0x1.de5533c0e0377p6 0x1.14fe7f85aa87dp4 +REG esri:102140 3 0x1.b3187ac81cd3bp6 0x1.b4fe7f85aa87dp4 +REG esri:102140 4 0x1.de5533c0e0377p6 0x1.b4fe7f85aa87dp4 +REG esri:102141 0 0x1.bcp6 0x0.0p0 +REG esri:102141 1 0x1.a8p6 -0x1.4p2 +REG esri:102141 2 0x1.dp6 -0x1.4p2 +REG esri:102141 3 0x1.a8p6 0x1.4p2 +REG esri:102141 4 0x1.dp6 0x1.4p2 +REG esri:102142 0 0x1.d4p6 0x0.0p0 +REG esri:102142 1 0x1.cp6 -0x1.4p2 +REG esri:102142 2 0x1.e8p6 -0x1.4p2 +REG esri:102142 3 0x1.cp6 0x1.4p2 +REG esri:102142 4 0x1.e8p6 0x1.4p2 +REG esri:102151 0 0x1.ecp6 0x0.0p0 +REG esri:102151 1 0x1.d8p6 -0x1.4p2 +REG esri:102151 2 0x1.0p7 -0x1.4p2 +REG esri:102151 3 0x1.d8p6 0x1.4p2 +REG esri:102151 4 0x1.0p7 0x1.4p2 +REG esri:102152 0 0x1.02p7 0x0.0p0 +REG esri:102152 1 0x1.fp6 -0x1.4p2 +REG esri:102152 2 0x1.0cp7 -0x1.4p2 +REG esri:102152 3 0x1.fp6 0x1.4p2 +REG esri:102152 4 0x1.0cp7 0x1.4p2 +REG esri:102153 0 0x1.0ep7 0x0.0p0 +REG esri:102153 1 0x1.04p7 -0x1.4p2 +REG esri:102153 2 0x1.18p7 -0x1.4p2 +REG esri:102153 3 0x1.04p7 0x1.4p2 +REG esri:102153 4 0x1.18p7 0x1.4p2 +REG esri:102154 0 0x1.1ap7 0x0.0p0 +REG esri:102154 1 0x1.1p7 -0x1.4p2 +REG esri:102154 2 0x1.24p7 -0x1.4p2 +REG esri:102154 3 0x1.1p7 0x1.4p2 +REG esri:102154 4 0x1.24p7 0x1.4p2 +REG esri:102155 0 0x1.26p7 0x0.0p0 +REG esri:102155 1 0x1.1cp7 -0x1.4p2 +REG esri:102155 2 0x1.3p7 -0x1.4p2 +REG esri:102155 3 0x1.1cp7 0x1.4p2 +REG esri:102155 4 0x1.3p7 0x1.4p2 +REG esri:102156 0 0x1.32p7 0x0.0p0 +REG esri:102156 1 0x1.28p7 -0x1.4p2 +REG esri:102156 2 0x1.3cp7 -0x1.4p2 +REG esri:102156 3 0x1.28p7 0x1.4p2 +REG esri:102156 4 0x1.3cp7 0x1.4p2 +REG esri:102160 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:102160 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:102160 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:102160 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:102160 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:102161 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:102161 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:102161 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:102161 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:102161 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:102162 0 -0x1.bp4 0x0.0p0 +REG esri:102162 1 -0x1.0p5 -0x1.4p2 +REG esri:102162 2 -0x1.6p4 -0x1.4p2 +REG esri:102162 3 -0x1.0p5 0x1.4p2 +REG esri:102162 4 -0x1.6p4 0x1.4p2 +REG esri:102163 0 0x0.0p0 0x0.0p0 +REG esri:102163 1 -0x1.4p2 -0x1.4p2 +REG esri:102163 2 0x1.4p2 -0x1.4p2 +REG esri:102163 3 -0x1.4p2 0x1.4p2 +REG esri:102163 4 0x1.4p2 0x1.4p2 +REG esri:102164 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:102164 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:102164 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:102164 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:102164 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:102165 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:102165 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:102165 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:102165 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:102165 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:102166 0 -0x1.08p5 0x0.0p0 +REG esri:102166 1 -0x1.3p5 -0x1.4p2 +REG esri:102166 2 -0x1.cp4 -0x1.4p2 +REG esri:102166 3 -0x1.3p5 0x1.4p2 +REG esri:102166 4 -0x1.cp4 0x1.4p2 +REG esri:102167 0 -0x1.ep3 0x0.0p0 +REG esri:102167 1 -0x1.4p4 -0x1.4p2 +REG esri:102167 2 -0x1.4p3 -0x1.4p2 +REG esri:102167 3 -0x1.4p4 0x1.4p2 +REG esri:102167 4 -0x1.4p3 0x1.4p2 +REG esri:102168 0 -0x1.bp4 0x0.0p0 +REG esri:102168 1 -0x1.0p5 -0x1.4p2 +REG esri:102168 2 -0x1.6p4 -0x1.4p2 +REG esri:102168 3 -0x1.0p5 0x1.4p2 +REG esri:102168 4 -0x1.6p4 0x1.4p2 +REG esri:102169 0 -0x1.ep3 0x0.0p0 +REG esri:102169 1 -0x1.4p4 -0x1.4p2 +REG esri:102169 2 -0x1.4p3 -0x1.4p2 +REG esri:102169 3 -0x1.4p4 0x1.4p2 +REG esri:102169 4 -0x1.4p3 0x1.4p2 +REG esri:102191 0 -0x1.599999999999ap2 0x1.0a66666666666p5 +REG esri:102191 1 -0x1.6c3b4ece0123bp3 0x1.c4cccccccccccp4 +REG esri:102191 2 0x1.2a1b534678a1p-1 0x1.c4cccccccccccp4 +REG esri:102191 3 -0x1.6c3b4ece0123bp3 0x1.3266666666666p5 +REG esri:102191 4 0x1.2a1b534678a1p-1 0x1.3266666666666p5 +REG esri:102192 0 -0x1.599999999999ap2 0x1.db33333333333p4 +REG esri:102192 1 -0x1.64ff6ec44c13ap3 0x1.8b33333333333p4 +REG esri:102192 2 0x1.6cbaa5564f4p-2 0x1.8b33333333333p4 +REG esri:102192 3 -0x1.64ff6ec44c13ap3 0x1.159999999999ap5 +REG esri:102192 4 0x1.6cbaa5564f4p-2 0x1.159999999999ap5 +REG esri:102193 0 -0x1.599999999999ap2 0x1.a19999999999ap4 +REG esri:102193 1 -0x1.5ef7df1d0876ap3 0x1.519999999999ap4 +REG esri:102193 2 0x1.579160dbb73ep-3 0x1.519999999999ap4 +REG esri:102193 3 -0x1.5ef7df1d0876ap3 0x1.f19999999999ap4 +REG esri:102193 4 0x1.579160dbb73ep-3 0x1.f19999999999ap4 +REG esri:102229 0 -0x1.5755555555555p6 0x1.e8p4 +REG esri:102229 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG esri:102229 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG esri:102229 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG esri:102229 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG esri:102230 0 -0x1.5ep6 0x1.ep4 +REG esri:102230 1 -0x1.75181116f43fep6 0x1.9p4 +REG esri:102230 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG esri:102230 3 -0x1.75181116f43fep6 0x1.18p5 +REG esri:102230 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG esri:102241 0 -0x1.e8p6 0x1.44p5 +REG esri:102241 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:102241 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:102241 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:102241 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:102242 0 -0x1.e8p6 0x1.36p5 +REG esri:102242 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:102242 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:102242 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:102242 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:102243 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:102243 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:102243 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:102243 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:102243 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:102244 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:102244 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:102244 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:102244 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:102244 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:102245 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:102245 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:102245 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:102245 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:102245 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:102246 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:102246 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:102246 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:102246 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:102246 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:102248 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:102248 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:102248 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:102248 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:102248 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:102249 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:102249 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:102249 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:102249 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:102249 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:102250 0 -0x1.c7p6 0x1.fp4 +REG esri:102250 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:102250 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:102250 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:102250 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:102251 0 -0x1.7p6 0x1.1a44444444444p5 +REG esri:102251 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG esri:102251 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG esri:102251 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG esri:102251 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG esri:102252 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG esri:102252 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG esri:102252 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG esri:102252 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG esri:102252 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG esri:102253 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:102253 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:102253 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:102253 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:102253 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:102254 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:102254 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:102254 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:102254 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:102254 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:102255 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:102255 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:102255 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:102255 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:102255 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:102256 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:102256 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:102256 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:102256 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:102256 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:102257 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:102257 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:102257 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:102257 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:102257 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:102258 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:102258 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:102258 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:102258 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:102258 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:102259 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:102259 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:102259 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:102259 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:102259 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:102260 0 -0x1.52p6 0x1.dep4 +REG esri:102260 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:102260 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:102260 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:102260 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:102261 0 -0x1.37p7 0x1.2d55555555554p4 +REG esri:102261 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG esri:102261 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG esri:102261 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG esri:102261 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG esri:102262 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG esri:102262 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG esri:102262 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG esri:102262 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG esri:102262 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG esri:102263 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG esri:102263 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG esri:102263 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG esri:102263 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG esri:102263 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG esri:102264 0 -0x1.3fp7 0x1.5d55555555554p4 +REG esri:102264 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG esri:102264 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG esri:102264 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG esri:102264 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG esri:102265 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG esri:102265 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG esri:102265 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG esri:102265 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG esri:102265 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG esri:102266 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:102266 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:102266 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:102266 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:102266 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:102267 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:102267 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:102267 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:102267 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:102267 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:102268 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:102268 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:102268 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:102268 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:102268 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:102269 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:102269 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:102269 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:102269 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:102269 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:102270 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:102270 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:102270 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:102270 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:102270 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:102271 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG esri:102271 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG esri:102271 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG esri:102271 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG esri:102271 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG esri:102272 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG esri:102272 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG esri:102272 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG esri:102272 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG esri:102272 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG esri:102273 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:102273 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:102273 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:102273 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:102273 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:102274 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:102274 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:102274 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:102274 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:102274 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:102277 0 -0x1.88p6 0x1.3877777777778p5 +REG esri:102277 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG esri:102277 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG esri:102277 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG esri:102277 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG esri:102278 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG esri:102278 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG esri:102278 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG esri:102278 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG esri:102278 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG esri:102279 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:102279 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:102279 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:102279 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:102279 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:102280 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:102280 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:102280 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:102280 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:102280 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:102281 0 -0x1.72p6 0x1.f955555555554p4 +REG esri:102281 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG esri:102281 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG esri:102281 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG esri:102281 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG esri:102282 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG esri:102282 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG esri:102282 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG esri:102282 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG esri:102282 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG esri:102283 0 -0x1.12p6 0x1.5d55555555554p5 +REG esri:102283 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG esri:102283 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG esri:102283 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG esri:102283 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG esri:102284 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG esri:102284 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG esri:102284 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG esri:102284 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG esri:102284 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG esri:102285 0 -0x1.34p6 0x1.3477777777777p5 +REG esri:102285 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG esri:102285 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG esri:102285 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG esri:102285 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG esri:102286 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:102286 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:102286 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:102286 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:102286 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:102287 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:102287 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:102287 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:102287 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:102287 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:102288 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:102288 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:102288 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:102288 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:102288 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:102289 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG esri:102289 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG esri:102289 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG esri:102289 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG esri:102289 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG esri:102290 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG esri:102290 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG esri:102290 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG esri:102290 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG esri:102290 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG esri:102291 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG esri:102291 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG esri:102291 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG esri:102291 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG esri:102291 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG esri:102292 0 -0x1.79p6 0x1.7033333333333p5 +REG esri:102292 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG esri:102292 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG esri:102292 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG esri:102292 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG esri:102293 0 -0x1.78p6 0x1.60ddddddddddep5 +REG esri:102293 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG esri:102293 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG esri:102293 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG esri:102293 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG esri:102294 0 -0x1.6355555555555p6 0x1.d8p4 +REG esri:102294 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG esri:102294 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG esri:102294 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG esri:102294 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG esri:102295 0 -0x1.6955555555555p6 0x1.d8p4 +REG esri:102295 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG esri:102295 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG esri:102295 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG esri:102295 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG esri:102296 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG esri:102296 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:102296 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG esri:102296 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:102296 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:102297 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG esri:102297 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:102297 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG esri:102297 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:102297 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:102298 0 -0x1.7ap6 0x1.2155555555554p5 +REG esri:102298 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG esri:102298 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG esri:102298 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG esri:102298 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG esri:102300 0 -0x1.b6p6 0x1.75p5 +REG esri:102300 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG esri:102300 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG esri:102300 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG esri:102300 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG esri:102304 0 -0x1.9p6 0x1.4b55555555556p5 +REG esri:102304 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG esri:102304 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG esri:102304 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG esri:102304 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG esri:102307 0 -0x1.ce55555555553p6 0x1.16p5 +REG esri:102307 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG esri:102307 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG esri:102307 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG esri:102307 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG esri:102308 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG esri:102308 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG esri:102308 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG esri:102308 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG esri:102308 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG esri:102309 0 -0x1.da55555555553p6 0x1.16p5 +REG esri:102309 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG esri:102309 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG esri:102309 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG esri:102309 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG esri:102310 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG esri:102310 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG esri:102310 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG esri:102310 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG esri:102310 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG esri:102311 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:102311 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:102311 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:102311 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:102311 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:102312 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:102312 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:102312 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:102312 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:102312 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:102313 0 -0x1.a9p6 0x1.fp4 +REG esri:102313 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:102313 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:102313 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:102313 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:102314 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:102314 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:102314 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:102314 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:102314 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:102315 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:102315 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:102315 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:102315 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:102315 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:102316 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:102316 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:102316 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:102316 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:102316 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:102317 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:102317 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:102317 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:102317 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:102317 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:102318 0 -0x1.28p6 0x1.44cccccccccccp5 +REG esri:102318 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG esri:102318 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG esri:102318 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG esri:102318 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG esri:102320 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:102320 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:102320 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:102320 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:102320 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:102321 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:102321 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:102321 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:102321 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:102321 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:102322 0 -0x1.4ap6 0x1.4577777777777p5 +REG esri:102322 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG esri:102322 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG esri:102322 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG esri:102322 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG esri:102323 0 -0x1.4ap6 0x1.3822222222222p5 +REG esri:102323 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG esri:102323 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG esri:102323 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG esri:102323 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG esri:102324 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:102324 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:102324 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:102324 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:102324 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:102325 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:102325 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:102325 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:102325 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:102325 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:102326 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:102326 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:102326 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:102326 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:102326 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:102327 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:102327 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:102327 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:102327 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:102327 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:102330 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG esri:102330 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG esri:102330 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG esri:102330 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG esri:102330 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG esri:102334 0 -0x1.9p6 0x1.6611111111112p5 +REG esri:102334 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG esri:102334 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG esri:102334 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG esri:102334 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG esri:102335 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG esri:102335 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG esri:102335 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG esri:102335 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG esri:102335 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG esri:102336 0 -0x1.58p6 0x1.1bp5 +REG esri:102336 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG esri:102336 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG esri:102336 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG esri:102336 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG esri:102337 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:102337 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:102337 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:102337 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:102337 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:102338 0 -0x1.8ap6 0x1.0688888888889p5 +REG esri:102338 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG esri:102338 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG esri:102338 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:102338 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:102339 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:102339 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:102339 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:102339 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:102339 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:102340 0 -0x1.8cp6 0x1.d0eeeeeeeeeefp4 +REG esri:102340 1 -0x1.97361161034aep6 0x1.a9bbbbbbbbbb9p4 +REG esri:102340 2 -0x1.80c9ee9efcb52p6 0x1.a9bbbbbbbbbb9p4 +REG esri:102340 3 -0x1.97361161034aep6 0x1.f822222222225p4 +REG esri:102340 4 -0x1.80c9ee9efcb52p6 0x1.f822222222225p4 +REG esri:102341 0 -0x1.8ap6 0x1.acp4 +REG esri:102341 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:102341 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:102341 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:102341 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:102342 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:102342 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:102342 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:102342 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:102342 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:102343 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:102343 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:102343 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:102343 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:102343 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:102344 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:102344 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:102344 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:102344 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:102344 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:102345 0 -0x1.22p6 0x1.54p5 +REG esri:102345 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG esri:102345 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG esri:102345 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG esri:102345 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG esri:102346 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:102346 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:102346 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:102346 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:102346 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:102347 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:102347 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:102347 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:102347 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:102347 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:102348 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:102348 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:102348 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:102348 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:102348 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:102349 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:102349 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:102349 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:102349 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:102349 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:102350 0 -0x1.3ep6 0x1.3bp5 +REG esri:102350 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG esri:102350 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG esri:102350 3 -0x1.470e3592d233ap6 0x1.49p5 +REG esri:102350 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG esri:102351 0 -0x1.44p6 0x1.2f88888888888p5 +REG esri:102351 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG esri:102351 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG esri:102351 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG esri:102351 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG esri:102352 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:102352 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:102352 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:102352 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:102352 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:102353 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:102353 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:102353 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:102353 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:102353 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:102354 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:102354 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:102354 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:102354 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:102354 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:102355 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG esri:102355 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG esri:102355 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG esri:102355 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG esri:102355 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG esri:102356 0 -0x1.ad55555555553p6 0x1.44p5 +REG esri:102356 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG esri:102356 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG esri:102356 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG esri:102356 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG esri:102357 0 -0x1.b3p6 0x1.44p5 +REG esri:102357 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG esri:102357 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG esri:102357 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG esri:102357 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG esri:102358 0 -0x1.b855555555553p6 0x1.44p5 +REG esri:102358 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG esri:102358 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG esri:102358 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG esri:102358 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG esri:102361 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:102361 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:102361 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:102361 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:102361 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:102491 0 0x1.599999999999ap1 0x1.2p5 +REG esri:102491 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG esri:102491 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG esri:102491 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG esri:102491 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG esri:102492 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG esri:102492 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG esri:102492 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG esri:102492 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG esri:102492 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG esri:102581 0 0x1.2b2a53490b9bp1 0x1.8cp5 +REG esri:102581 1 -0x1.5724b7a484d85p2 0x1.64p5 +REG esri:102581 2 0x1.41278576c839ap3 0x1.64p5 +REG esri:102581 3 -0x1.5724b7a484d85p2 0x1.b4p5 +REG esri:102581 4 0x1.41278576c839ap3 0x1.b4p5 +REG esri:102582 0 0x1.2b2a53490b9bp1 0x1.7666666666666p5 +REG esri:102582 1 -0x1.3de1330a236dbp2 0x1.4e66666666666p5 +REG esri:102582 2 0x1.3485c32997846p3 0x1.4e66666666666p5 +REG esri:102582 3 -0x1.3de1330a236dbp2 0x1.9e66666666666p5 +REG esri:102582 4 0x1.3485c32997846p3 0x1.9e66666666666p5 +REG esri:102583 0 0x1.2b2a53490b9bp1 0x1.60ccccccccccdp5 +REG esri:102583 1 -0x1.28057a97a524ap2 0x1.38ccccccccccdp5 +REG esri:102583 2 0x1.2997e6f0585fdp3 0x1.38ccccccccccdp5 +REG esri:102583 3 -0x1.28057a97a524ap2 0x1.88ccccccccccdp5 +REG esri:102583 4 0x1.2997e6f0585fdp3 0x1.88ccccccccccdp5 +REG esri:102584 0 0x1.2b2a53490b9bp1 0x1.5151eb851eb85p5 +REG esri:102584 1 -0x1.1a241b8bc91ddp2 0x1.2951eb851eb85p5 +REG esri:102584 2 0x1.22a7376a6a5c6p3 0x1.2951eb851eb85p5 +REG esri:102584 3 -0x1.1a241b8bc91ddp2 0x1.7951eb851eb85p5 +REG esri:102584 4 0x1.22a7376a6a5c6p3 0x1.7951eb851eb85p5 +REG esri:102591 0 0x1.599999999999ap1 0x1.2p5 +REG esri:102591 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG esri:102591 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG esri:102591 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG esri:102591 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG esri:102592 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG esri:102592 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG esri:102592 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG esri:102592 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG esri:102592 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG esri:102629 0 -0x1.5755555555555p6 0x1.e8p4 +REG esri:102629 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG esri:102629 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG esri:102629 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG esri:102629 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG esri:102630 0 -0x1.5ep6 0x1.ep4 +REG esri:102630 1 -0x1.75181116f43fep6 0x1.9p4 +REG esri:102630 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG esri:102630 3 -0x1.75181116f43fep6 0x1.18p5 +REG esri:102630 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG esri:102631 0 -0x1.0b55555555557p7 0x1.c8p5 +REG esri:102631 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG esri:102631 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG esri:102631 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG esri:102631 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG esri:102632 0 -0x1.1cp7 0x1.bp5 +REG esri:102632 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG esri:102632 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG esri:102632 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG esri:102632 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG esri:102633 0 -0x1.24p7 0x1.bp5 +REG esri:102633 1 -0x1.350355070bc27p7 0x1.88p5 +REG esri:102633 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG esri:102633 3 -0x1.350355070bc27p7 0x1.d8p5 +REG esri:102633 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG esri:102634 0 -0x1.2cp7 0x1.bp5 +REG esri:102634 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG esri:102634 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG esri:102634 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG esri:102634 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG esri:102635 0 -0x1.34p7 0x1.bp5 +REG esri:102635 1 -0x1.450355070bc27p7 0x1.88p5 +REG esri:102635 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG esri:102635 3 -0x1.450355070bc27p7 0x1.d8p5 +REG esri:102635 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG esri:102636 0 -0x1.3cp7 0x1.bp5 +REG esri:102636 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG esri:102636 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG esri:102636 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG esri:102636 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG esri:102637 0 -0x1.44p7 0x1.bp5 +REG esri:102637 1 -0x1.550355070bc27p7 0x1.88p5 +REG esri:102637 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG esri:102637 3 -0x1.550355070bc27p7 0x1.d8p5 +REG esri:102637 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG esri:102638 0 -0x1.4cp7 0x1.bp5 +REG esri:102638 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG esri:102638 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG esri:102638 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG esri:102638 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG esri:102639 0 -0x1.54p7 0x1.bp5 +REG esri:102639 1 -0x1.650355070bc27p7 0x1.88p5 +REG esri:102639 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG esri:102639 3 -0x1.650355070bc27p7 0x1.d8p5 +REG esri:102639 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG esri:102640 0 -0x1.6p7 0x1.a355555555556p5 +REG esri:102640 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG esri:102640 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG esri:102640 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG esri:102640 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG esri:102641 0 -0x1.e8p6 0x1.44p5 +REG esri:102641 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:102641 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:102641 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:102641 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:102642 0 -0x1.e8p6 0x1.36p5 +REG esri:102642 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:102642 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:102642 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:102642 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:102643 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:102643 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:102643 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:102643 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:102643 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:102644 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:102644 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:102644 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:102644 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:102644 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:102645 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:102645 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:102645 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:102645 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:102645 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:102646 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:102646 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:102646 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:102646 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:102646 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:102648 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:102648 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:102648 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:102648 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:102648 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:102649 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:102649 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:102649 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:102649 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:102649 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:102650 0 -0x1.c7p6 0x1.fp4 +REG esri:102650 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:102650 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:102650 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:102650 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:102651 0 -0x1.7p6 0x1.1a44444444444p5 +REG esri:102651 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG esri:102651 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG esri:102651 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG esri:102651 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG esri:102652 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG esri:102652 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG esri:102652 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG esri:102652 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG esri:102652 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG esri:102653 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:102653 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:102653 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:102653 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:102653 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:102654 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:102654 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:102654 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:102654 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:102654 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:102655 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:102655 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:102655 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:102655 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:102655 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:102656 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:102656 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:102656 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:102656 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:102656 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:102657 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:102657 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:102657 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:102657 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:102657 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:102658 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:102658 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:102658 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:102658 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:102658 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:102659 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:102659 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:102659 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:102659 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:102659 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:102660 0 -0x1.52p6 0x1.dep4 +REG esri:102660 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:102660 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:102660 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:102660 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:102661 0 -0x1.37p7 0x1.2d55555555554p4 +REG esri:102661 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG esri:102661 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG esri:102661 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG esri:102661 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG esri:102662 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG esri:102662 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG esri:102662 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG esri:102662 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG esri:102662 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG esri:102663 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG esri:102663 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG esri:102663 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG esri:102663 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG esri:102663 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG esri:102664 0 -0x1.3fp7 0x1.5d55555555554p4 +REG esri:102664 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG esri:102664 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG esri:102664 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG esri:102664 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG esri:102665 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG esri:102665 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG esri:102665 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG esri:102665 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG esri:102665 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG esri:102666 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:102666 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:102666 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:102666 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:102666 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:102667 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:102667 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:102667 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:102667 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:102667 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:102668 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:102668 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:102668 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:102668 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:102668 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:102669 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:102669 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:102669 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:102669 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:102669 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:102670 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:102670 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:102670 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:102670 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:102670 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:102671 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG esri:102671 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG esri:102671 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG esri:102671 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG esri:102671 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG esri:102672 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG esri:102672 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG esri:102672 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG esri:102672 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG esri:102672 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG esri:102673 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:102673 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:102673 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:102673 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:102673 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:102674 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:102674 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:102674 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:102674 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:102674 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:102675 0 -0x1.76p6 0x1.5311111111112p5 +REG esri:102675 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG esri:102675 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG esri:102675 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG esri:102675 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG esri:102676 0 -0x1.76p6 0x1.4722222222222p5 +REG esri:102676 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG esri:102676 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG esri:102676 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG esri:102676 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG esri:102677 0 -0x1.88p6 0x1.3877777777778p5 +REG esri:102677 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG esri:102677 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG esri:102677 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG esri:102677 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG esri:102678 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG esri:102678 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG esri:102678 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG esri:102678 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG esri:102678 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG esri:102679 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:102679 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:102679 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:102679 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:102679 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:102680 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:102680 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:102680 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:102680 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:102680 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:102681 0 -0x1.72p6 0x1.f955555555554p4 +REG esri:102681 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG esri:102681 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG esri:102681 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG esri:102681 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG esri:102682 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG esri:102682 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG esri:102682 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG esri:102682 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG esri:102682 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG esri:102683 0 -0x1.12p6 0x1.5d55555555554p5 +REG esri:102683 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG esri:102683 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG esri:102683 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG esri:102683 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG esri:102684 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG esri:102684 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG esri:102684 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG esri:102684 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG esri:102684 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG esri:102685 0 -0x1.34p6 0x1.3477777777777p5 +REG esri:102685 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG esri:102685 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG esri:102685 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG esri:102685 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG esri:102686 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:102686 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:102686 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:102686 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:102686 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:102687 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:102687 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:102687 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:102687 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:102687 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:102688 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:102688 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:102688 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:102688 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:102688 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:102689 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG esri:102689 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG esri:102689 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG esri:102689 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG esri:102689 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG esri:102690 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG esri:102690 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG esri:102690 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG esri:102690 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG esri:102690 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG esri:102691 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG esri:102691 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG esri:102691 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG esri:102691 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG esri:102691 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG esri:102692 0 -0x1.79p6 0x1.7033333333333p5 +REG esri:102692 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG esri:102692 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG esri:102692 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG esri:102692 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG esri:102693 0 -0x1.78p6 0x1.60ddddddddddep5 +REG esri:102693 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG esri:102693 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG esri:102693 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG esri:102693 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG esri:102694 0 -0x1.6355555555555p6 0x1.d8p4 +REG esri:102694 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG esri:102694 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG esri:102694 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG esri:102694 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG esri:102695 0 -0x1.6955555555555p6 0x1.d8p4 +REG esri:102695 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG esri:102695 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG esri:102695 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG esri:102695 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG esri:102696 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG esri:102696 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:102696 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG esri:102696 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:102696 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:102697 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG esri:102697 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:102697 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG esri:102697 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:102697 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:102698 0 -0x1.7ap6 0x1.2155555555554p5 +REG esri:102698 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG esri:102698 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG esri:102698 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG esri:102698 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG esri:102700 0 -0x1.b6p6 0x1.75p5 +REG esri:102700 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG esri:102700 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG esri:102700 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG esri:102700 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG esri:102704 0 -0x1.9p6 0x1.4b55555555556p5 +REG esri:102704 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG esri:102704 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG esri:102704 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG esri:102704 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG esri:102707 0 -0x1.ce55555555553p6 0x1.16p5 +REG esri:102707 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG esri:102707 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG esri:102707 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG esri:102707 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG esri:102708 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG esri:102708 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG esri:102708 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG esri:102708 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG esri:102708 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG esri:102709 0 -0x1.da55555555553p6 0x1.16p5 +REG esri:102709 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG esri:102709 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG esri:102709 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG esri:102709 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG esri:102710 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG esri:102710 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG esri:102710 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG esri:102710 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG esri:102710 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG esri:102711 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:102711 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:102711 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:102711 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:102711 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:102712 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:102712 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:102712 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:102712 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:102712 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:102713 0 -0x1.a9p6 0x1.fp4 +REG esri:102713 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:102713 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:102713 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:102713 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:102714 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:102714 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:102714 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:102714 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:102714 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:102715 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:102715 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:102715 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:102715 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:102715 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:102716 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:102716 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:102716 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:102716 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:102716 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:102717 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:102717 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:102717 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:102717 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:102717 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:102718 0 -0x1.28p6 0x1.44cccccccccccp5 +REG esri:102718 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG esri:102718 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG esri:102718 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG esri:102718 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG esri:102719 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG esri:102719 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG esri:102719 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG esri:102719 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG esri:102719 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG esri:102720 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:102720 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:102720 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:102720 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:102720 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:102721 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:102721 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:102721 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:102721 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:102721 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:102722 0 -0x1.4ap6 0x1.4577777777777p5 +REG esri:102722 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG esri:102722 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG esri:102722 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG esri:102722 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG esri:102723 0 -0x1.4ap6 0x1.3822222222222p5 +REG esri:102723 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG esri:102723 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG esri:102723 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG esri:102723 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG esri:102724 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:102724 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:102724 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:102724 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:102724 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:102725 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:102725 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:102725 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:102725 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:102725 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:102726 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:102726 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:102726 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:102726 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:102726 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:102727 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:102727 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:102727 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:102727 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:102727 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:102728 0 -0x1.37p6 0x1.4877777777777p5 +REG esri:102728 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG esri:102728 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG esri:102728 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG esri:102728 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG esri:102729 0 -0x1.37p6 0x1.4133333333334p5 +REG esri:102729 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG esri:102729 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG esri:102729 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG esri:102729 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG esri:102730 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG esri:102730 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG esri:102730 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG esri:102730 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG esri:102730 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG esri:102733 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG esri:102733 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG esri:102733 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG esri:102733 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG esri:102733 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG esri:102734 0 -0x1.9p6 0x1.6611111111112p5 +REG esri:102734 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG esri:102734 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG esri:102734 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG esri:102734 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG esri:102735 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG esri:102735 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG esri:102735 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG esri:102735 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG esri:102735 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG esri:102736 0 -0x1.58p6 0x1.1bp5 +REG esri:102736 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG esri:102736 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG esri:102736 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG esri:102736 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG esri:102737 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:102737 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:102737 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:102737 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:102737 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:102738 0 -0x1.8ap6 0x1.0688888888889p5 +REG esri:102738 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG esri:102738 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG esri:102738 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:102738 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:102739 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:102739 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:102739 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:102739 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:102739 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:102740 0 -0x1.8cp6 0x1.d0eeeeeeeeeefp4 +REG esri:102740 1 -0x1.97361161034aep6 0x1.a9bbbbbbbbbb9p4 +REG esri:102740 2 -0x1.80c9ee9efcb52p6 0x1.a9bbbbbbbbbb9p4 +REG esri:102740 3 -0x1.97361161034aep6 0x1.f822222222225p4 +REG esri:102740 4 -0x1.80c9ee9efcb52p6 0x1.f822222222225p4 +REG esri:102741 0 -0x1.8ap6 0x1.acp4 +REG esri:102741 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:102741 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:102741 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:102741 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:102742 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:102742 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:102742 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:102742 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:102742 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:102743 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:102743 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:102743 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:102743 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:102743 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:102744 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:102744 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:102744 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:102744 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:102744 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:102745 0 -0x1.22p6 0x1.54p5 +REG esri:102745 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG esri:102745 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG esri:102745 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG esri:102745 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG esri:102746 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:102746 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:102746 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:102746 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:102746 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:102747 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:102747 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:102747 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:102747 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:102747 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:102748 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:102748 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:102748 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:102748 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:102748 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:102749 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:102749 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:102749 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:102749 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:102749 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:102750 0 -0x1.3ep6 0x1.3bp5 +REG esri:102750 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG esri:102750 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG esri:102750 3 -0x1.470e3592d233ap6 0x1.49p5 +REG esri:102750 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG esri:102751 0 -0x1.44p6 0x1.2f88888888888p5 +REG esri:102751 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG esri:102751 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG esri:102751 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG esri:102751 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG esri:102752 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:102752 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:102752 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:102752 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:102752 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:102753 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:102753 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:102753 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:102753 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:102753 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:102754 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:102754 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:102754 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:102754 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:102754 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:102755 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG esri:102755 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG esri:102755 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG esri:102755 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG esri:102755 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG esri:102756 0 -0x1.ad55555555553p6 0x1.44p5 +REG esri:102756 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG esri:102756 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG esri:102756 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG esri:102756 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG esri:102757 0 -0x1.b3p6 0x1.44p5 +REG esri:102757 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG esri:102757 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG esri:102757 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG esri:102757 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG esri:102758 0 -0x1.b855555555553p6 0x1.44p5 +REG esri:102758 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG esri:102758 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG esri:102758 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG esri:102758 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG esri:102761 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:102761 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:102761 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:102761 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:102761 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:102766 0 -0x1.217f5c40a26fcp7 0x1.af1e71c1b482cp3 +REG esri:102766 1 -0x1.2bc7ccc34d7d4p7 0x1.0f1e71c1b482cp3 +REG esri:102766 2 -0x1.1736ebbdf7624p7 0x1.0f1e71c1b482cp3 +REG esri:102766 3 -0x1.2bc7ccc34d7d4p7 0x1.278f38e0da416p4 +REG esri:102766 4 -0x1.1736ebbdf7624p7 0x1.278f38e0da416p4 +REG esri:103300 0 0x1.1784e6cbc3292p2 0x1.17aaaabdae4bep6 +REG esri:103300 1 -0x1.3a8542c83e86dp5 0x1.b755557b5c97cp5 +REG esri:103300 2 0x1.80667c7b2f511p5 0x1.b755557b5c97cp5 +REG esri:103300 3 -0x1.3a8542c83e86dp5 0x1.53aaaabdae4bep6 +REG esri:103300 4 0x1.80667c7b2f511p5 0x1.53aaaabdae4bep6 +REG esri:104000 0 -0x1.9p6 0x1.68p5 +REG esri:104000 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG esri:104000 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG esri:104000 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG esri:104000 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG esri:104101 0 0x0.0p0 0x0.0p0 +REG esri:104101 1 -0x1.4p2 -0x1.4p2 +REG esri:104101 2 0x1.4p2 -0x1.4p2 +REG esri:104101 3 -0x1.4p2 0x1.4p2 +REG esri:104101 4 0x1.4p2 0x1.4p2 +REG esri:104102 0 0x0.0p0 0x0.0p0 +REG esri:104102 1 -0x1.4p2 -0x1.4p2 +REG esri:104102 2 0x1.4p2 -0x1.4p2 +REG esri:104102 3 -0x1.4p2 0x1.4p2 +REG esri:104102 4 0x1.4p2 0x1.4p2 +REG esri:104103 0 0x0.0p0 0x0.0p0 +REG esri:104103 1 -0x1.4p2 -0x1.4p2 +REG esri:104103 2 0x1.4p2 -0x1.4p2 +REG esri:104103 3 -0x1.4p2 0x1.4p2 +REG esri:104103 4 0x1.4p2 0x1.4p2 +REG esri:104104 0 0x0.0p0 0x0.0p0 +REG esri:104104 1 -0x1.4p2 -0x1.4p2 +REG esri:104104 2 0x1.4p2 -0x1.4p2 +REG esri:104104 3 -0x1.4p2 0x1.4p2 +REG esri:104104 4 0x1.4p2 0x1.4p2 +REG esri:104105 0 0x0.0p0 0x0.0p0 +REG esri:104105 1 -0x1.4p2 -0x1.4p2 +REG esri:104105 2 0x1.4p2 -0x1.4p2 +REG esri:104105 3 -0x1.4p2 0x1.4p2 +REG esri:104105 4 0x1.4p2 0x1.4p2 +REG esri:104106 0 0x0.0p0 0x0.0p0 +REG esri:104106 1 -0x1.4p2 -0x1.4p2 +REG esri:104106 2 0x1.4p2 -0x1.4p2 +REG esri:104106 3 -0x1.4p2 0x1.4p2 +REG esri:104106 4 0x1.4p2 0x1.4p2 +REG esri:104107 0 0x0.0p0 0x0.0p0 +REG esri:104107 1 -0x1.4p2 -0x1.4p2 +REG esri:104107 2 0x1.4p2 -0x1.4p2 +REG esri:104107 3 -0x1.4p2 0x1.4p2 +REG esri:104107 4 0x1.4p2 0x1.4p2 +REG esri:104108 0 0x0.0p0 0x0.0p0 +REG esri:104108 1 -0x1.4p2 -0x1.4p2 +REG esri:104108 2 0x1.4p2 -0x1.4p2 +REG esri:104108 3 -0x1.4p2 0x1.4p2 +REG esri:104108 4 0x1.4p2 0x1.4p2 +REG esri:104261 0 0x0.0p0 0x0.0p0 +REG esri:104261 1 -0x1.4p2 -0x1.4p2 +REG esri:104261 2 0x1.4p2 -0x1.4p2 +REG esri:104261 3 -0x1.4p2 0x1.4p2 +REG esri:104261 4 0x1.4p2 0x1.4p2 +REG esri:104304 0 0x0.0p0 0x0.0p0 +REG esri:104304 1 -0x1.4p2 -0x1.4p2 +REG esri:104304 2 0x1.4p2 -0x1.4p2 +REG esri:104304 3 -0x1.4p2 0x1.4p2 +REG esri:104304 4 0x1.4p2 0x1.4p2 +REG esri:104305 0 0x0.0p0 0x0.0p0 +REG esri:104305 1 -0x1.4p2 -0x1.4p2 +REG esri:104305 2 0x1.4p2 -0x1.4p2 +REG esri:104305 3 -0x1.4p2 0x1.4p2 +REG esri:104305 4 0x1.4p2 0x1.4p2 +REG esri:2000 0 -0x1.fp5 0x0.0p0 +REG esri:2000 1 -0x1.0cp6 -0x1.4p2 +REG esri:2000 2 -0x1.c8p5 -0x1.4p2 +REG esri:2000 3 -0x1.0cp6 0x1.4p2 +REG esri:2000 4 -0x1.c8p5 0x1.4p2 +REG esri:20002 0 0x1.2p3 0x0.0p0 +REG esri:20002 1 0x1.0p2 -0x1.4p2 +REG esri:20002 2 0x1.cp3 -0x1.4p2 +REG esri:20002 3 0x1.0p2 0x1.4p2 +REG esri:20002 4 0x1.cp3 0x1.4p2 +REG esri:20003 0 0x1.ep3 0x0.0p0 +REG esri:20003 1 0x1.4p3 -0x1.4p2 +REG esri:20003 2 0x1.4p4 -0x1.4p2 +REG esri:20003 3 0x1.4p3 0x1.4p2 +REG esri:20003 4 0x1.4p4 0x1.4p2 +REG esri:20004 0 0x1.5p4 0x0.0p0 +REG esri:20004 1 0x1.0p4 -0x1.4p2 +REG esri:20004 2 0x1.ap4 -0x1.4p2 +REG esri:20004 3 0x1.0p4 0x1.4p2 +REG esri:20004 4 0x1.ap4 0x1.4p2 +REG esri:20005 0 0x1.bp4 0x0.0p0 +REG esri:20005 1 0x1.6p4 -0x1.4p2 +REG esri:20005 2 0x1.0p5 -0x1.4p2 +REG esri:20005 3 0x1.6p4 0x1.4p2 +REG esri:20005 4 0x1.0p5 0x1.4p2 +REG esri:20006 0 0x1.08p5 0x0.0p0 +REG esri:20006 1 0x1.cp4 -0x1.4p2 +REG esri:20006 2 0x1.3p5 -0x1.4p2 +REG esri:20006 3 0x1.cp4 0x1.4p2 +REG esri:20006 4 0x1.3p5 0x1.4p2 +REG esri:20007 0 0x1.38p5 0x0.0p0 +REG esri:20007 1 0x1.1p5 -0x1.4p2 +REG esri:20007 2 0x1.6p5 -0x1.4p2 +REG esri:20007 3 0x1.1p5 0x1.4p2 +REG esri:20007 4 0x1.6p5 0x1.4p2 +REG esri:20008 0 0x1.68p5 0x0.0p0 +REG esri:20008 1 0x1.4p5 -0x1.4p2 +REG esri:20008 2 0x1.9p5 -0x1.4p2 +REG esri:20008 3 0x1.4p5 0x1.4p2 +REG esri:20008 4 0x1.9p5 0x1.4p2 +REG esri:20009 0 0x1.98p5 0x0.0p0 +REG esri:20009 1 0x1.7p5 -0x1.4p2 +REG esri:20009 2 0x1.cp5 -0x1.4p2 +REG esri:20009 3 0x1.7p5 0x1.4p2 +REG esri:20009 4 0x1.cp5 0x1.4p2 +REG esri:2001 0 -0x1.fp5 0x0.0p0 +REG esri:2001 1 -0x1.0cp6 -0x1.4p2 +REG esri:2001 2 -0x1.c8p5 -0x1.4p2 +REG esri:2001 3 -0x1.0cp6 0x1.4p2 +REG esri:2001 4 -0x1.c8p5 0x1.4p2 +REG esri:20010 0 0x1.c8p5 0x0.0p0 +REG esri:20010 1 0x1.ap5 -0x1.4p2 +REG esri:20010 2 0x1.fp5 -0x1.4p2 +REG esri:20010 3 0x1.ap5 0x1.4p2 +REG esri:20010 4 0x1.fp5 0x1.4p2 +REG esri:20011 0 0x1.f8p5 0x0.0p0 +REG esri:20011 1 0x1.dp5 -0x1.4p2 +REG esri:20011 2 0x1.1p6 -0x1.4p2 +REG esri:20011 3 0x1.dp5 0x1.4p2 +REG esri:20011 4 0x1.1p6 0x1.4p2 +REG esri:20012 0 0x1.14p6 0x0.0p0 +REG esri:20012 1 0x1.0p6 -0x1.4p2 +REG esri:20012 2 0x1.28p6 -0x1.4p2 +REG esri:20012 3 0x1.0p6 0x1.4p2 +REG esri:20012 4 0x1.28p6 0x1.4p2 +REG esri:20013 0 0x1.2cp6 0x0.0p0 +REG esri:20013 1 0x1.18p6 -0x1.4p2 +REG esri:20013 2 0x1.4p6 -0x1.4p2 +REG esri:20013 3 0x1.18p6 0x1.4p2 +REG esri:20013 4 0x1.4p6 0x1.4p2 +REG esri:20014 0 0x1.44p6 0x0.0p0 +REG esri:20014 1 0x1.3p6 -0x1.4p2 +REG esri:20014 2 0x1.58p6 -0x1.4p2 +REG esri:20014 3 0x1.3p6 0x1.4p2 +REG esri:20014 4 0x1.58p6 0x1.4p2 +REG esri:20015 0 0x1.5cp6 0x0.0p0 +REG esri:20015 1 0x1.48p6 -0x1.4p2 +REG esri:20015 2 0x1.7p6 -0x1.4p2 +REG esri:20015 3 0x1.48p6 0x1.4p2 +REG esri:20015 4 0x1.7p6 0x1.4p2 +REG esri:20016 0 0x1.74p6 0x0.0p0 +REG esri:20016 1 0x1.6p6 -0x1.4p2 +REG esri:20016 2 0x1.88p6 -0x1.4p2 +REG esri:20016 3 0x1.6p6 0x1.4p2 +REG esri:20016 4 0x1.88p6 0x1.4p2 +REG esri:20017 0 0x1.8cp6 0x0.0p0 +REG esri:20017 1 0x1.78p6 -0x1.4p2 +REG esri:20017 2 0x1.ap6 -0x1.4p2 +REG esri:20017 3 0x1.78p6 0x1.4p2 +REG esri:20017 4 0x1.ap6 0x1.4p2 +REG esri:20018 0 0x1.a4p6 0x0.0p0 +REG esri:20018 1 0x1.9p6 -0x1.4p2 +REG esri:20018 2 0x1.b8p6 -0x1.4p2 +REG esri:20018 3 0x1.9p6 0x1.4p2 +REG esri:20018 4 0x1.b8p6 0x1.4p2 +REG esri:20019 0 0x1.bcp6 0x0.0p0 +REG esri:20019 1 0x1.a8p6 -0x1.4p2 +REG esri:20019 2 0x1.dp6 -0x1.4p2 +REG esri:20019 3 0x1.a8p6 0x1.4p2 +REG esri:20019 4 0x1.dp6 0x1.4p2 +REG esri:2002 0 -0x1.fp5 0x0.0p0 +REG esri:2002 1 -0x1.0cp6 -0x1.4p2 +REG esri:2002 2 -0x1.c8p5 -0x1.4p2 +REG esri:2002 3 -0x1.0cp6 0x1.4p2 +REG esri:2002 4 -0x1.c8p5 0x1.4p2 +REG esri:20020 0 0x1.d4p6 0x0.0p0 +REG esri:20020 1 0x1.cp6 -0x1.4p2 +REG esri:20020 2 0x1.e8p6 -0x1.4p2 +REG esri:20020 3 0x1.cp6 0x1.4p2 +REG esri:20020 4 0x1.e8p6 0x1.4p2 +REG esri:20021 0 0x1.ecp6 0x0.0p0 +REG esri:20021 1 0x1.d8p6 -0x1.4p2 +REG esri:20021 2 0x1.0p7 -0x1.4p2 +REG esri:20021 3 0x1.d8p6 0x1.4p2 +REG esri:20021 4 0x1.0p7 0x1.4p2 +REG esri:20022 0 0x1.02p7 0x0.0p0 +REG esri:20022 1 0x1.fp6 -0x1.4p2 +REG esri:20022 2 0x1.0cp7 -0x1.4p2 +REG esri:20022 3 0x1.fp6 0x1.4p2 +REG esri:20022 4 0x1.0cp7 0x1.4p2 +REG esri:20023 0 0x1.0ep7 0x0.0p0 +REG esri:20023 1 0x1.04p7 -0x1.4p2 +REG esri:20023 2 0x1.18p7 -0x1.4p2 +REG esri:20023 3 0x1.04p7 0x1.4p2 +REG esri:20023 4 0x1.18p7 0x1.4p2 +REG esri:20024 0 0x1.1ap7 0x0.0p0 +REG esri:20024 1 0x1.1p7 -0x1.4p2 +REG esri:20024 2 0x1.24p7 -0x1.4p2 +REG esri:20024 3 0x1.1p7 0x1.4p2 +REG esri:20024 4 0x1.24p7 0x1.4p2 +REG esri:20025 0 0x1.26p7 0x0.0p0 +REG esri:20025 1 0x1.1cp7 -0x1.4p2 +REG esri:20025 2 0x1.3p7 -0x1.4p2 +REG esri:20025 3 0x1.1cp7 0x1.4p2 +REG esri:20025 4 0x1.3p7 0x1.4p2 +REG esri:20026 0 0x1.32p7 0x0.0p0 +REG esri:20026 1 0x1.28p7 -0x1.4p2 +REG esri:20026 2 0x1.3cp7 -0x1.4p2 +REG esri:20026 3 0x1.28p7 0x1.4p2 +REG esri:20026 4 0x1.3cp7 0x1.4p2 +REG esri:20027 0 0x1.3ep7 0x0.0p0 +REG esri:20027 1 0x1.34p7 -0x1.4p2 +REG esri:20027 2 0x1.48p7 -0x1.4p2 +REG esri:20027 3 0x1.34p7 0x1.4p2 +REG esri:20027 4 0x1.48p7 0x1.4p2 +REG esri:20028 0 0x1.4ap7 0x0.0p0 +REG esri:20028 1 0x1.4p7 -0x1.4p2 +REG esri:20028 2 0x1.54p7 -0x1.4p2 +REG esri:20028 3 0x1.4p7 0x1.4p2 +REG esri:20028 4 0x1.54p7 0x1.4p2 +REG esri:20029 0 0x1.56p7 0x0.0p0 +REG esri:20029 1 0x1.4cp7 -0x1.4p2 +REG esri:20029 2 0x1.6p7 -0x1.4p2 +REG esri:20029 3 0x1.4cp7 0x1.4p2 +REG esri:20029 4 0x1.6p7 0x1.4p2 +REG esri:2003 0 -0x1.fp5 0x0.0p0 +REG esri:2003 1 -0x1.0cp6 -0x1.4p2 +REG esri:2003 2 -0x1.c8p5 -0x1.4p2 +REG esri:2003 3 -0x1.0cp6 0x1.4p2 +REG esri:2003 4 -0x1.c8p5 0x1.4p2 +REG esri:20030 0 0x1.62p7 0x0.0p0 +REG esri:20030 1 0x1.58p7 -0x1.4p2 +REG esri:20030 2 -0x1.64p7 -0x1.4p2 +REG esri:20030 3 0x1.58p7 0x1.4p2 +REG esri:20030 4 -0x1.64p7 0x1.4p2 +REG esri:20031 0 -0x1.62p7 0x0.0p0 +REG esri:20031 1 0x1.64p7 -0x1.4p2 +REG esri:20031 2 -0x1.58p7 -0x1.4p2 +REG esri:20031 3 0x1.64p7 0x1.4p2 +REG esri:20031 4 -0x1.58p7 0x1.4p2 +REG esri:20032 0 -0x1.56p7 0x0.0p0 +REG esri:20032 1 -0x1.6p7 -0x1.4p2 +REG esri:20032 2 -0x1.4cp7 -0x1.4p2 +REG esri:20032 3 -0x1.6p7 0x1.4p2 +REG esri:20032 4 -0x1.4cp7 0x1.4p2 +REG esri:2004 0 -0x1.fp5 0x0.0p0 +REG esri:2004 1 -0x1.0cp6 -0x1.4p2 +REG esri:2004 2 -0x1.c8p5 -0x1.4p2 +REG esri:2004 3 -0x1.0cp6 0x1.4p2 +REG esri:2004 4 -0x1.c8p5 0x1.4p2 +REG esri:2005 0 -0x1.fp5 0x0.0p0 +REG esri:2005 1 -0x1.0cp6 -0x1.4p2 +REG esri:2005 2 -0x1.c8p5 -0x1.4p2 +REG esri:2005 3 -0x1.0cp6 0x1.4p2 +REG esri:2005 4 -0x1.c8p5 0x1.4p2 +REG esri:2006 0 -0x1.fp5 0x0.0p0 +REG esri:2006 1 -0x1.0cp6 -0x1.4p2 +REG esri:2006 2 -0x1.c8p5 -0x1.4p2 +REG esri:2006 3 -0x1.0cp6 0x1.4p2 +REG esri:2006 4 -0x1.c8p5 0x1.4p2 +REG esri:20062 0 0x1.2p3 0x0.0p0 +REG esri:20062 1 0x1.0p2 -0x1.4p2 +REG esri:20062 2 0x1.cp3 -0x1.4p2 +REG esri:20062 3 0x1.0p2 0x1.4p2 +REG esri:20062 4 0x1.cp3 0x1.4p2 +REG esri:20063 0 0x1.ep3 0x0.0p0 +REG esri:20063 1 0x1.4p3 -0x1.4p2 +REG esri:20063 2 0x1.4p4 -0x1.4p2 +REG esri:20063 3 0x1.4p3 0x1.4p2 +REG esri:20063 4 0x1.4p4 0x1.4p2 +REG esri:20064 0 0x1.5p4 0x0.0p0 +REG esri:20064 1 0x1.0p4 -0x1.4p2 +REG esri:20064 2 0x1.ap4 -0x1.4p2 +REG esri:20064 3 0x1.0p4 0x1.4p2 +REG esri:20064 4 0x1.ap4 0x1.4p2 +REG esri:20065 0 0x1.bp4 0x0.0p0 +REG esri:20065 1 0x1.6p4 -0x1.4p2 +REG esri:20065 2 0x1.0p5 -0x1.4p2 +REG esri:20065 3 0x1.6p4 0x1.4p2 +REG esri:20065 4 0x1.0p5 0x1.4p2 +REG esri:20066 0 0x1.08p5 0x0.0p0 +REG esri:20066 1 0x1.cp4 -0x1.4p2 +REG esri:20066 2 0x1.3p5 -0x1.4p2 +REG esri:20066 3 0x1.cp4 0x1.4p2 +REG esri:20066 4 0x1.3p5 0x1.4p2 +REG esri:20067 0 0x1.38p5 0x0.0p0 +REG esri:20067 1 0x1.1p5 -0x1.4p2 +REG esri:20067 2 0x1.6p5 -0x1.4p2 +REG esri:20067 3 0x1.1p5 0x1.4p2 +REG esri:20067 4 0x1.6p5 0x1.4p2 +REG esri:20068 0 0x1.68p5 0x0.0p0 +REG esri:20068 1 0x1.4p5 -0x1.4p2 +REG esri:20068 2 0x1.9p5 -0x1.4p2 +REG esri:20068 3 0x1.4p5 0x1.4p2 +REG esri:20068 4 0x1.9p5 0x1.4p2 +REG esri:20069 0 0x1.98p5 0x0.0p0 +REG esri:20069 1 0x1.7p5 -0x1.4p2 +REG esri:20069 2 0x1.cp5 -0x1.4p2 +REG esri:20069 3 0x1.7p5 0x1.4p2 +REG esri:20069 4 0x1.cp5 0x1.4p2 +REG esri:2007 0 -0x1.fp5 0x0.0p0 +REG esri:2007 1 -0x1.0cp6 -0x1.4p2 +REG esri:2007 2 -0x1.c8p5 -0x1.4p2 +REG esri:2007 3 -0x1.0cp6 0x1.4p2 +REG esri:2007 4 -0x1.c8p5 0x1.4p2 +REG esri:20070 0 0x1.c8p5 0x0.0p0 +REG esri:20070 1 0x1.ap5 -0x1.4p2 +REG esri:20070 2 0x1.fp5 -0x1.4p2 +REG esri:20070 3 0x1.ap5 0x1.4p2 +REG esri:20070 4 0x1.fp5 0x1.4p2 +REG esri:20071 0 0x1.f8p5 0x0.0p0 +REG esri:20071 1 0x1.dp5 -0x1.4p2 +REG esri:20071 2 0x1.1p6 -0x1.4p2 +REG esri:20071 3 0x1.dp5 0x1.4p2 +REG esri:20071 4 0x1.1p6 0x1.4p2 +REG esri:20072 0 0x1.14p6 0x0.0p0 +REG esri:20072 1 0x1.0p6 -0x1.4p2 +REG esri:20072 2 0x1.28p6 -0x1.4p2 +REG esri:20072 3 0x1.0p6 0x1.4p2 +REG esri:20072 4 0x1.28p6 0x1.4p2 +REG esri:20073 0 0x1.2cp6 0x0.0p0 +REG esri:20073 1 0x1.18p6 -0x1.4p2 +REG esri:20073 2 0x1.4p6 -0x1.4p2 +REG esri:20073 3 0x1.18p6 0x1.4p2 +REG esri:20073 4 0x1.4p6 0x1.4p2 +REG esri:20074 0 0x1.44p6 0x0.0p0 +REG esri:20074 1 0x1.3p6 -0x1.4p2 +REG esri:20074 2 0x1.58p6 -0x1.4p2 +REG esri:20074 3 0x1.3p6 0x1.4p2 +REG esri:20074 4 0x1.58p6 0x1.4p2 +REG esri:20075 0 0x1.5cp6 0x0.0p0 +REG esri:20075 1 0x1.48p6 -0x1.4p2 +REG esri:20075 2 0x1.7p6 -0x1.4p2 +REG esri:20075 3 0x1.48p6 0x1.4p2 +REG esri:20075 4 0x1.7p6 0x1.4p2 +REG esri:20076 0 0x1.74p6 0x0.0p0 +REG esri:20076 1 0x1.6p6 -0x1.4p2 +REG esri:20076 2 0x1.88p6 -0x1.4p2 +REG esri:20076 3 0x1.6p6 0x1.4p2 +REG esri:20076 4 0x1.88p6 0x1.4p2 +REG esri:20077 0 0x1.8cp6 0x0.0p0 +REG esri:20077 1 0x1.78p6 -0x1.4p2 +REG esri:20077 2 0x1.ap6 -0x1.4p2 +REG esri:20077 3 0x1.78p6 0x1.4p2 +REG esri:20077 4 0x1.ap6 0x1.4p2 +REG esri:20078 0 0x1.a4p6 0x0.0p0 +REG esri:20078 1 0x1.9p6 -0x1.4p2 +REG esri:20078 2 0x1.b8p6 -0x1.4p2 +REG esri:20078 3 0x1.9p6 0x1.4p2 +REG esri:20078 4 0x1.b8p6 0x1.4p2 +REG esri:20079 0 0x1.bcp6 0x0.0p0 +REG esri:20079 1 0x1.a8p6 -0x1.4p2 +REG esri:20079 2 0x1.dp6 -0x1.4p2 +REG esri:20079 3 0x1.a8p6 0x1.4p2 +REG esri:20079 4 0x1.dp6 0x1.4p2 +REG esri:2008 0 -0x1.bcp5 0x0.0p0 +REG esri:2008 1 -0x1.e4p5 -0x1.4p2 +REG esri:2008 2 -0x1.94p5 -0x1.4p2 +REG esri:2008 3 -0x1.e4p5 0x1.4p2 +REG esri:2008 4 -0x1.94p5 0x1.4p2 +REG esri:20080 0 0x1.d4p6 0x0.0p0 +REG esri:20080 1 0x1.cp6 -0x1.4p2 +REG esri:20080 2 0x1.e8p6 -0x1.4p2 +REG esri:20080 3 0x1.cp6 0x1.4p2 +REG esri:20080 4 0x1.e8p6 0x1.4p2 +REG esri:20081 0 0x1.ecp6 0x0.0p0 +REG esri:20081 1 0x1.d8p6 -0x1.4p2 +REG esri:20081 2 0x1.0p7 -0x1.4p2 +REG esri:20081 3 0x1.d8p6 0x1.4p2 +REG esri:20081 4 0x1.0p7 0x1.4p2 +REG esri:20082 0 0x1.02p7 0x0.0p0 +REG esri:20082 1 0x1.fp6 -0x1.4p2 +REG esri:20082 2 0x1.0cp7 -0x1.4p2 +REG esri:20082 3 0x1.fp6 0x1.4p2 +REG esri:20082 4 0x1.0cp7 0x1.4p2 +REG esri:20083 0 0x1.0ep7 0x0.0p0 +REG esri:20083 1 0x1.04p7 -0x1.4p2 +REG esri:20083 2 0x1.18p7 -0x1.4p2 +REG esri:20083 3 0x1.04p7 0x1.4p2 +REG esri:20083 4 0x1.18p7 0x1.4p2 +REG esri:20084 0 0x1.1ap7 0x0.0p0 +REG esri:20084 1 0x1.1p7 -0x1.4p2 +REG esri:20084 2 0x1.24p7 -0x1.4p2 +REG esri:20084 3 0x1.1p7 0x1.4p2 +REG esri:20084 4 0x1.24p7 0x1.4p2 +REG esri:20085 0 0x1.26p7 0x0.0p0 +REG esri:20085 1 0x1.1cp7 -0x1.4p2 +REG esri:20085 2 0x1.3p7 -0x1.4p2 +REG esri:20085 3 0x1.1cp7 0x1.4p2 +REG esri:20085 4 0x1.3p7 0x1.4p2 +REG esri:20086 0 0x1.32p7 0x0.0p0 +REG esri:20086 1 0x1.28p7 -0x1.4p2 +REG esri:20086 2 0x1.3cp7 -0x1.4p2 +REG esri:20086 3 0x1.28p7 0x1.4p2 +REG esri:20086 4 0x1.3cp7 0x1.4p2 +REG esri:20087 0 0x1.3ep7 0x0.0p0 +REG esri:20087 1 0x1.34p7 -0x1.4p2 +REG esri:20087 2 0x1.48p7 -0x1.4p2 +REG esri:20087 3 0x1.34p7 0x1.4p2 +REG esri:20087 4 0x1.48p7 0x1.4p2 +REG esri:20088 0 0x1.4ap7 0x0.0p0 +REG esri:20088 1 0x1.4p7 -0x1.4p2 +REG esri:20088 2 0x1.54p7 -0x1.4p2 +REG esri:20088 3 0x1.4p7 0x1.4p2 +REG esri:20088 4 0x1.54p7 0x1.4p2 +REG esri:20089 0 0x1.56p7 0x0.0p0 +REG esri:20089 1 0x1.4cp7 -0x1.4p2 +REG esri:20089 2 0x1.6p7 -0x1.4p2 +REG esri:20089 3 0x1.4cp7 0x1.4p2 +REG esri:20089 4 0x1.6p7 0x1.4p2 +REG esri:2009 0 -0x1.d4p5 0x0.0p0 +REG esri:2009 1 -0x1.fcp5 -0x1.4p2 +REG esri:2009 2 -0x1.acp5 -0x1.4p2 +REG esri:2009 3 -0x1.fcp5 0x1.4p2 +REG esri:2009 4 -0x1.acp5 0x1.4p2 +REG esri:20090 0 0x1.62p7 0x0.0p0 +REG esri:20090 1 0x1.58p7 -0x1.4p2 +REG esri:20090 2 -0x1.64p7 -0x1.4p2 +REG esri:20090 3 0x1.58p7 0x1.4p2 +REG esri:20090 4 -0x1.64p7 0x1.4p2 +REG esri:20091 0 -0x1.62p7 0x0.0p0 +REG esri:20091 1 0x1.64p7 -0x1.4p2 +REG esri:20091 2 -0x1.58p7 -0x1.4p2 +REG esri:20091 3 0x1.64p7 0x1.4p2 +REG esri:20091 4 -0x1.58p7 0x1.4p2 +REG esri:20092 0 -0x1.56p7 0x0.0p0 +REG esri:20092 1 -0x1.6p7 -0x1.4p2 +REG esri:20092 2 -0x1.4cp7 -0x1.4p2 +REG esri:20092 3 -0x1.6p7 0x1.4p2 +REG esri:20092 4 -0x1.4cp7 0x1.4p2 +REG esri:2010 0 -0x1.ecp5 0x0.0p0 +REG esri:2010 1 -0x1.0ap6 -0x1.4p2 +REG esri:2010 2 -0x1.c4p5 -0x1.4p2 +REG esri:2010 3 -0x1.0ap6 0x1.4p2 +REG esri:2010 4 -0x1.c4p5 0x1.4p2 +REG esri:2011 0 -0x1.02p6 0x0.0p0 +REG esri:2011 1 -0x1.16p6 -0x1.4p2 +REG esri:2011 2 -0x1.dcp5 -0x1.4p2 +REG esri:2011 3 -0x1.16p6 0x1.4p2 +REG esri:2011 4 -0x1.dcp5 0x1.4p2 +REG esri:2012 0 -0x1.0ep6 0x0.0p0 +REG esri:2012 1 -0x1.22p6 -0x1.4p2 +REG esri:2012 2 -0x1.f4p5 -0x1.4p2 +REG esri:2012 3 -0x1.22p6 0x1.4p2 +REG esri:2012 4 -0x1.f4p5 0x1.4p2 +REG esri:2013 0 -0x1.1ap6 0x0.0p0 +REG esri:2013 1 -0x1.2ep6 -0x1.4p2 +REG esri:2013 2 -0x1.06p6 -0x1.4p2 +REG esri:2013 3 -0x1.2ep6 0x1.4p2 +REG esri:2013 4 -0x1.06p6 0x1.4p2 +REG esri:20137 0 0x1.38p5 0x0.0p0 +REG esri:20137 1 0x1.1p5 -0x1.4p2 +REG esri:20137 2 0x1.6p5 -0x1.4p2 +REG esri:20137 3 0x1.1p5 0x1.4p2 +REG esri:20137 4 0x1.6p5 0x1.4p2 +REG esri:20138 0 0x1.68p5 0x0.0p0 +REG esri:20138 1 0x1.4p5 -0x1.4p2 +REG esri:20138 2 0x1.9p5 -0x1.4p2 +REG esri:20138 3 0x1.4p5 0x1.4p2 +REG esri:20138 4 0x1.9p5 0x1.4p2 +REG esri:2014 0 -0x1.26p6 0x0.0p0 +REG esri:2014 1 -0x1.3ap6 -0x1.4p2 +REG esri:2014 2 -0x1.12p6 -0x1.4p2 +REG esri:2014 3 -0x1.3ap6 0x1.4p2 +REG esri:2014 4 -0x1.12p6 0x1.4p2 +REG esri:2015 0 -0x1.32p6 0x0.0p0 +REG esri:2015 1 -0x1.46p6 -0x1.4p2 +REG esri:2015 2 -0x1.1ep6 -0x1.4p2 +REG esri:2015 3 -0x1.46p6 0x1.4p2 +REG esri:2015 4 -0x1.1ep6 0x1.4p2 +REG esri:2016 0 -0x1.3ep6 0x0.0p0 +REG esri:2016 1 -0x1.52p6 -0x1.4p2 +REG esri:2016 2 -0x1.2ap6 -0x1.4p2 +REG esri:2016 3 -0x1.52p6 0x1.4p2 +REG esri:2016 4 -0x1.2ap6 0x1.4p2 +REG esri:2017 0 -0x1.26p6 0x0.0p0 +REG esri:2017 1 -0x1.3ap6 -0x1.4p2 +REG esri:2017 2 -0x1.12p6 -0x1.4p2 +REG esri:2017 3 -0x1.3ap6 0x1.4p2 +REG esri:2017 4 -0x1.12p6 0x1.4p2 +REG esri:2018 0 -0x1.32p6 0x0.0p0 +REG esri:2018 1 -0x1.46p6 -0x1.4p2 +REG esri:2018 2 -0x1.1ep6 -0x1.4p2 +REG esri:2018 3 -0x1.46p6 0x1.4p2 +REG esri:2018 4 -0x1.1ep6 0x1.4p2 +REG esri:2019 0 -0x1.3ep6 0x0.0p0 +REG esri:2019 1 -0x1.52p6 -0x1.4p2 +REG esri:2019 2 -0x1.2ap6 -0x1.4p2 +REG esri:2019 3 -0x1.52p6 0x1.4p2 +REG esri:2019 4 -0x1.2ap6 0x1.4p2 +REG esri:2020 0 -0x1.4ap6 0x0.0p0 +REG esri:2020 1 -0x1.5ep6 -0x1.4p2 +REG esri:2020 2 -0x1.36p6 -0x1.4p2 +REG esri:2020 3 -0x1.5ep6 0x1.4p2 +REG esri:2020 4 -0x1.36p6 0x1.4p2 +REG esri:2021 0 -0x1.44p6 0x0.0p0 +REG esri:2021 1 -0x1.58p6 -0x1.4p2 +REG esri:2021 2 -0x1.3p6 -0x1.4p2 +REG esri:2021 3 -0x1.58p6 0x1.4p2 +REG esri:2021 4 -0x1.3p6 0x1.4p2 +REG esri:2022 0 -0x1.5p6 0x0.0p0 +REG esri:2022 1 -0x1.64p6 -0x1.4p2 +REG esri:2022 2 -0x1.3cp6 -0x1.4p2 +REG esri:2022 3 -0x1.64p6 0x1.4p2 +REG esri:2022 4 -0x1.3cp6 0x1.4p2 +REG esri:2023 0 -0x1.5cp6 0x0.0p0 +REG esri:2023 1 -0x1.7p6 -0x1.4p2 +REG esri:2023 2 -0x1.48p6 -0x1.4p2 +REG esri:2023 3 -0x1.7p6 0x1.4p2 +REG esri:2023 4 -0x1.48p6 0x1.4p2 +REG esri:2024 0 -0x1.68p6 0x0.0p0 +REG esri:2024 1 -0x1.7cp6 -0x1.4p2 +REG esri:2024 2 -0x1.54p6 -0x1.4p2 +REG esri:2024 3 -0x1.7cp6 0x1.4p2 +REG esri:2024 4 -0x1.54p6 0x1.4p2 +REG esri:20248 0 0x1.a4p6 -0x1.9p4 +REG esri:20248 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:20248 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:20248 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:20248 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:20249 0 0x1.bcp6 -0x1.9p4 +REG esri:20249 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:20249 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:20249 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:20249 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:2025 0 -0x1.74p6 0x0.0p0 +REG esri:2025 1 -0x1.88p6 -0x1.4p2 +REG esri:2025 2 -0x1.6p6 -0x1.4p2 +REG esri:2025 3 -0x1.88p6 0x1.4p2 +REG esri:2025 4 -0x1.6p6 0x1.4p2 +REG esri:20250 0 0x1.d4p6 -0x1.9p4 +REG esri:20250 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:20250 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:20250 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:20250 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:20251 0 0x1.ecp6 -0x1.9p4 +REG esri:20251 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:20251 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:20251 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:20251 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:20252 0 0x1.02p7 -0x1.9p4 +REG esri:20252 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:20252 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:20252 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:20252 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:20253 0 0x1.0ep7 -0x1.9p4 +REG esri:20253 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:20253 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:20253 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:20253 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:20254 0 0x1.1ap7 -0x1.9p4 +REG esri:20254 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:20254 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:20254 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:20254 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:20255 0 0x1.26p7 -0x1.9p4 +REG esri:20255 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:20255 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:20255 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:20255 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:20256 0 0x1.32p7 -0x1.9p4 +REG esri:20256 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:20256 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:20256 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:20256 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:20257 0 0x1.3ep7 -0x1.9p4 +REG esri:20257 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:20257 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:20257 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:20257 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:20258 0 0x1.4ap7 -0x1.9p4 +REG esri:20258 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:20258 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:20258 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:20258 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:2026 0 -0x1.8p6 0x0.0p0 +REG esri:2026 1 -0x1.94p6 -0x1.4p2 +REG esri:2026 2 -0x1.6cp6 -0x1.4p2 +REG esri:2026 3 -0x1.94p6 0x1.4p2 +REG esri:2026 4 -0x1.6cp6 0x1.4p2 +REG esri:2027 0 -0x1.74p6 0x0.0p0 +REG esri:2027 1 -0x1.88p6 -0x1.4p2 +REG esri:2027 2 -0x1.6p6 -0x1.4p2 +REG esri:2027 3 -0x1.88p6 0x1.4p2 +REG esri:2027 4 -0x1.6p6 0x1.4p2 +REG esri:2028 0 -0x1.5cp6 0x0.0p0 +REG esri:2028 1 -0x1.7p6 -0x1.4p2 +REG esri:2028 2 -0x1.48p6 -0x1.4p2 +REG esri:2028 3 -0x1.7p6 0x1.4p2 +REG esri:2028 4 -0x1.48p6 0x1.4p2 +REG esri:2029 0 -0x1.44p6 0x0.0p0 +REG esri:2029 1 -0x1.58p6 -0x1.4p2 +REG esri:2029 2 -0x1.3p6 -0x1.4p2 +REG esri:2029 3 -0x1.58p6 0x1.4p2 +REG esri:2029 4 -0x1.3p6 0x1.4p2 +REG esri:2030 0 -0x1.2cp6 0x0.0p0 +REG esri:2030 1 -0x1.4p6 -0x1.4p2 +REG esri:2030 2 -0x1.18p6 -0x1.4p2 +REG esri:2030 3 -0x1.4p6 0x1.4p2 +REG esri:2030 4 -0x1.18p6 0x1.4p2 +REG esri:2031 0 -0x1.44p6 0x0.0p0 +REG esri:2031 1 -0x1.58p6 -0x1.4p2 +REG esri:2031 2 -0x1.3p6 -0x1.4p2 +REG esri:2031 3 -0x1.58p6 0x1.4p2 +REG esri:2031 4 -0x1.3p6 0x1.4p2 +REG esri:2032 0 -0x1.2cp6 0x0.0p0 +REG esri:2032 1 -0x1.4p6 -0x1.4p2 +REG esri:2032 2 -0x1.18p6 -0x1.4p2 +REG esri:2032 3 -0x1.4p6 0x1.4p2 +REG esri:2032 4 -0x1.18p6 0x1.4p2 +REG esri:2033 0 -0x1.14p6 0x0.0p0 +REG esri:2033 1 -0x1.28p6 -0x1.4p2 +REG esri:2033 2 -0x1.0p6 -0x1.4p2 +REG esri:2033 3 -0x1.28p6 0x1.4p2 +REG esri:2033 4 -0x1.0p6 0x1.4p2 +REG esri:2034 0 -0x1.f8p5 0x0.0p0 +REG esri:2034 1 -0x1.1p6 -0x1.4p2 +REG esri:2034 2 -0x1.dp5 -0x1.4p2 +REG esri:2034 3 -0x1.1p6 0x1.4p2 +REG esri:2034 4 -0x1.dp5 0x1.4p2 +REG esri:20348 0 0x1.a4p6 -0x1.9p4 +REG esri:20348 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:20348 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:20348 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:20348 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:20349 0 0x1.bcp6 -0x1.9p4 +REG esri:20349 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:20349 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:20349 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:20349 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:2035 0 -0x1.c8p5 0x0.0p0 +REG esri:2035 1 -0x1.fp5 -0x1.4p2 +REG esri:2035 2 -0x1.ap5 -0x1.4p2 +REG esri:2035 3 -0x1.fp5 0x1.4p2 +REG esri:2035 4 -0x1.ap5 0x1.4p2 +REG esri:20350 0 0x1.d4p6 -0x1.9p4 +REG esri:20350 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:20350 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:20350 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:20350 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:20351 0 0x1.ecp6 -0x1.9p4 +REG esri:20351 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:20351 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:20351 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:20351 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:20352 0 0x1.02p7 -0x1.9p4 +REG esri:20352 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:20352 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:20352 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:20352 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:20353 0 0x1.0ep7 -0x1.9p4 +REG esri:20353 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:20353 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:20353 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:20353 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:20354 0 0x1.1ap7 -0x1.9p4 +REG esri:20354 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:20354 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:20354 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:20354 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:20355 0 0x1.26p7 -0x1.9p4 +REG esri:20355 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:20355 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:20355 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:20355 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:20356 0 0x1.32p7 -0x1.9p4 +REG esri:20356 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:20356 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:20356 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:20356 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:20357 0 0x1.3ep7 -0x1.9p4 +REG esri:20357 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:20357 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:20357 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:20357 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:20358 0 0x1.4ap7 -0x1.9p4 +REG esri:20358 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:20358 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:20358 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:20358 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:2036 0 -0x1.0ap6 0x1.74p5 +REG esri:2036 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG esri:2036 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG esri:2036 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG esri:2036 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG esri:2037 0 -0x1.14p6 0x0.0p0 +REG esri:2037 1 -0x1.28p6 -0x1.4p2 +REG esri:2037 2 -0x1.0p6 -0x1.4p2 +REG esri:2037 3 -0x1.28p6 0x1.4p2 +REG esri:2037 4 -0x1.0p6 0x1.4p2 +REG esri:2038 0 -0x1.f8p5 0x0.0p0 +REG esri:2038 1 -0x1.1p6 -0x1.4p2 +REG esri:2038 2 -0x1.dp5 -0x1.4p2 +REG esri:2038 3 -0x1.1p6 0x1.4p2 +REG esri:2038 4 -0x1.dp5 0x1.4p2 +REG esri:2039 0 0x1.19a2d9c79eef2p5 0x1.fbc01383e1d12p4 +REG esri:2039 1 0x1.d5359f2a43a52p4 0x1.abc01383e1d12p4 +REG esri:2039 2 0x1.48aae3fa1c0bbp5 0x1.abc01383e1d12p4 +REG esri:2039 3 0x1.d5359f2a43a52p4 0x1.25e009c1f0e89p5 +REG esri:2039 4 0x1.48aae3fa1c0bbp5 0x1.25e009c1f0e89p5 +REG esri:2040 0 -0x1.8p1 0x0.0p0 +REG esri:2040 1 -0x1.0p3 -0x1.4p2 +REG esri:2040 2 0x1.0p1 -0x1.4p2 +REG esri:2040 3 -0x1.0p3 0x1.4p2 +REG esri:2040 4 0x1.0p1 0x1.4p2 +REG esri:2041 0 -0x1.8p1 0x0.0p0 +REG esri:2041 1 -0x1.0p3 -0x1.4p2 +REG esri:2041 2 0x1.0p1 -0x1.4p2 +REG esri:2041 3 -0x1.0p3 0x1.4p2 +REG esri:2041 4 0x1.0p1 0x1.4p2 +REG esri:2042 0 -0x1.2p3 0x0.0p0 +REG esri:2042 1 -0x1.cp3 -0x1.4p2 +REG esri:2042 2 -0x1.0p2 -0x1.4p2 +REG esri:2042 3 -0x1.cp3 0x1.4p2 +REG esri:2042 4 -0x1.0p2 0x1.4p2 +REG esri:2043 0 -0x1.2p3 0x0.0p0 +REG esri:2043 1 -0x1.cp3 -0x1.4p2 +REG esri:2043 2 -0x1.0p2 -0x1.4p2 +REG esri:2043 3 -0x1.cp3 0x1.4p2 +REG esri:2043 4 -0x1.0p2 0x1.4p2 +REG esri:20437 0 0x1.38p5 0x0.0p0 +REG esri:20437 1 0x1.1p5 -0x1.4p2 +REG esri:20437 2 0x1.6p5 -0x1.4p2 +REG esri:20437 3 0x1.1p5 0x1.4p2 +REG esri:20437 4 0x1.6p5 0x1.4p2 +REG esri:20438 0 0x1.68p5 0x0.0p0 +REG esri:20438 1 0x1.4p5 -0x1.4p2 +REG esri:20438 2 0x1.9p5 -0x1.4p2 +REG esri:20438 3 0x1.4p5 0x1.4p2 +REG esri:20438 4 0x1.9p5 0x1.4p2 +REG esri:20439 0 0x1.98p5 0x0.0p0 +REG esri:20439 1 0x1.7p5 -0x1.4p2 +REG esri:20439 2 0x1.cp5 -0x1.4p2 +REG esri:20439 3 0x1.7p5 0x1.4p2 +REG esri:20439 4 0x1.cp5 0x1.4p2 +REG esri:2044 0 0x1.a4p6 0x0.0p0 +REG esri:2044 1 0x1.9p6 -0x1.4p2 +REG esri:2044 2 0x1.b8p6 -0x1.4p2 +REG esri:2044 3 0x1.9p6 0x1.4p2 +REG esri:2044 4 0x1.b8p6 0x1.4p2 +REG esri:2045 0 0x1.bcp6 0x0.0p0 +REG esri:2045 1 0x1.a8p6 -0x1.4p2 +REG esri:2045 2 0x1.dp6 -0x1.4p2 +REG esri:2045 3 0x1.a8p6 0x1.4p2 +REG esri:2045 4 0x1.dp6 0x1.4p2 +REG esri:20499 0 0x1.98p5 0x0.0p0 +REG esri:20499 1 0x1.7p5 -0x1.4p2 +REG esri:20499 2 0x1.cp5 -0x1.4p2 +REG esri:20499 3 0x1.7p5 0x1.4p2 +REG esri:20499 4 0x1.cp5 0x1.4p2 +REG esri:20538 0 0x1.68p5 0x0.0p0 +REG esri:20538 1 0x1.4p5 -0x1.4p2 +REG esri:20538 2 0x1.9p5 -0x1.4p2 +REG esri:20538 3 0x1.4p5 0x1.4p2 +REG esri:20538 4 0x1.9p5 0x1.4p2 +REG esri:20539 0 0x1.98p5 0x0.0p0 +REG esri:20539 1 0x1.7p5 -0x1.4p2 +REG esri:20539 2 0x1.cp5 -0x1.4p2 +REG esri:20539 3 0x1.7p5 0x1.4p2 +REG esri:20539 4 0x1.cp5 0x1.4p2 +REG esri:2056 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG esri:2056 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG esri:2056 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG esri:2056 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG esri:2056 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG esri:2057 0 0x1.a4d40c57b581fp5 0x1.b84d1f6f01576p4 +REG esri:2057 1 0x1.77b9ae635ab67p5 0x1.684d1f6f01576p4 +REG esri:2057 2 0x1.d1ee6a4c104d7p5 0x1.684d1f6f01576p4 +REG esri:2057 3 0x1.77b9ae635ab67p5 0x1.04268fb780abbp5 +REG esri:2057 4 0x1.d1ee6a4c104d7p5 0x1.04268fb780abbp5 +REG esri:2058 0 0x1.68p5 0x0.0p0 +REG esri:2058 1 0x1.4p5 -0x1.4p2 +REG esri:2058 2 0x1.9p5 -0x1.4p2 +REG esri:2058 3 0x1.4p5 0x1.4p2 +REG esri:2058 4 0x1.9p5 0x1.4p2 +REG esri:2059 0 0x1.98p5 0x0.0p0 +REG esri:2059 1 0x1.7p5 -0x1.4p2 +REG esri:2059 2 0x1.cp5 -0x1.4p2 +REG esri:2059 3 0x1.7p5 0x1.4p2 +REG esri:2059 4 0x1.cp5 0x1.4p2 +REG esri:2060 0 0x1.c8p5 0x0.0p0 +REG esri:2060 1 0x1.ap5 -0x1.4p2 +REG esri:2060 2 0x1.fp5 -0x1.4p2 +REG esri:2060 3 0x1.ap5 0x1.4p2 +REG esri:2060 4 0x1.fp5 0x1.4p2 +REG esri:2061 0 0x1.f8p5 0x0.0p0 +REG esri:2061 1 0x1.dp5 -0x1.4p2 +REG esri:2061 2 0x1.1p6 -0x1.4p2 +REG esri:2061 3 0x1.dp5 0x1.4p2 +REG esri:2061 4 0x1.1p6 0x1.4p2 +REG esri:2062 0 -0x1.d80e61aab6515p1 0x1.4p5 +REG esri:2062 1 -0x1.46e113f47452ap3 0x1.18p5 +REG esri:2062 2 0x1.6b678c7c64a7fp1 0x1.18p5 +REG esri:2062 3 -0x1.46e113f47452ap3 0x1.68p5 +REG esri:2062 4 0x1.6b678c7c64a7fp1 0x1.68p5 +REG esri:2063 0 -0x1.ep3 0x0.0p0 +REG esri:2063 1 -0x1.4p4 -0x1.4p2 +REG esri:2063 2 -0x1.4p3 -0x1.4p2 +REG esri:2063 3 -0x1.4p4 0x1.4p2 +REG esri:2063 4 -0x1.4p3 0x1.4p2 +REG esri:2064 0 -0x1.2p3 0x0.0p0 +REG esri:2064 1 -0x1.cp3 -0x1.4p2 +REG esri:2064 2 -0x1.0p2 -0x1.4p2 +REG esri:2064 3 -0x1.cp3 0x1.4p2 +REG esri:2064 4 -0x1.0p2 0x1.4p2 +REG esri:2065 0 0x1.8d55555555554p4 0x1.8cp5 +REG esri:2065 1 0x1.1226dd0312abdp4 0x1.64p5 +REG esri:2065 2 0x1.0441e6d3cbff6p5 0x1.64p5 +REG esri:2065 3 0x1.1226dd0312abdp4 0x1.b4p5 +REG esri:2065 4 0x1.0441e6d3cbff6p5 0x1.b4p5 +REG esri:2066 0 -0x1.e57cf23a74584p5 0x1.6811d8e0ef223p3 +REG esri:2066 1 -0x1.0722d1bef0772p6 0x1.9023b1c1de446p2 +REG esri:2066 2 -0x1.bcb440f707c24p5 0x1.9023b1c1de446p2 +REG esri:2066 3 -0x1.0722d1bef0772p6 0x1.0408ec7077912p4 +REG esri:2066 4 -0x1.bcb440f707c24p5 0x1.0408ec7077912p4 +REG esri:2067 0 -0x1.f8p5 0x0.0p0 +REG esri:2067 1 -0x1.1p6 -0x1.4p2 +REG esri:2067 2 -0x1.dp5 -0x1.4p2 +REG esri:2067 3 -0x1.1p6 0x1.4p2 +REG esri:2067 4 -0x1.dp5 0x1.4p2 +REG esri:2068 0 0x1.2p3 0x0.0p0 +REG esri:2068 1 0x1.0p2 -0x1.4p2 +REG esri:2068 2 0x1.cp3 -0x1.4p2 +REG esri:2068 3 0x1.0p2 0x1.4p2 +REG esri:2068 4 0x1.cp3 0x1.4p2 +REG esri:2069 0 0x1.6p3 0x0.0p0 +REG esri:2069 1 0x1.8p2 -0x1.4p2 +REG esri:2069 2 0x1.0p4 -0x1.4p2 +REG esri:2069 3 0x1.8p2 0x1.4p2 +REG esri:2069 4 0x1.0p4 0x1.4p2 +REG esri:2070 0 0x1.ap3 0x0.0p0 +REG esri:2070 1 0x1.0p3 -0x1.4p2 +REG esri:2070 2 0x1.2p4 -0x1.4p2 +REG esri:2070 3 0x1.0p3 0x1.4p2 +REG esri:2070 4 0x1.2p4 0x1.4p2 +REG esri:2071 0 0x1.ep3 0x0.0p0 +REG esri:2071 1 0x1.4p3 -0x1.4p2 +REG esri:2071 2 0x1.4p4 -0x1.4p2 +REG esri:2071 3 0x1.4p3 0x1.4p2 +REG esri:2071 4 0x1.4p4 0x1.4p2 +REG esri:2072 0 0x1.1p4 0x0.0p0 +REG esri:2072 1 0x1.8p3 -0x1.4p2 +REG esri:2072 2 0x1.6p4 -0x1.4p2 +REG esri:2072 3 0x1.8p3 0x1.4p2 +REG esri:2072 4 0x1.6p4 0x1.4p2 +REG esri:2073 0 0x1.3p4 0x0.0p0 +REG esri:2073 1 0x1.cp3 -0x1.4p2 +REG esri:2073 2 0x1.8p4 -0x1.4p2 +REG esri:2073 3 0x1.cp3 0x1.4p2 +REG esri:2073 4 0x1.8p4 0x1.4p2 +REG esri:2074 0 0x1.5p4 0x0.0p0 +REG esri:2074 1 0x1.0p4 -0x1.4p2 +REG esri:2074 2 0x1.ap4 -0x1.4p2 +REG esri:2074 3 0x1.0p4 0x1.4p2 +REG esri:2074 4 0x1.ap4 0x1.4p2 +REG esri:2075 0 0x1.7p4 0x0.0p0 +REG esri:2075 1 0x1.2p4 -0x1.4p2 +REG esri:2075 2 0x1.cp4 -0x1.4p2 +REG esri:2075 3 0x1.2p4 0x1.4p2 +REG esri:2075 4 0x1.cp4 0x1.4p2 +REG esri:2076 0 0x1.9p4 0x0.0p0 +REG esri:2076 1 0x1.4p4 -0x1.4p2 +REG esri:2076 2 0x1.ep4 -0x1.4p2 +REG esri:2076 3 0x1.4p4 0x1.4p2 +REG esri:2076 4 0x1.ep4 0x1.4p2 +REG esri:2077 0 0x1.2p3 0x0.0p0 +REG esri:2077 1 0x1.0p2 -0x1.4p2 +REG esri:2077 2 0x1.cp3 -0x1.4p2 +REG esri:2077 3 0x1.0p2 0x1.4p2 +REG esri:2077 4 0x1.cp3 0x1.4p2 +REG esri:2078 0 0x1.ep3 0x0.0p0 +REG esri:2078 1 0x1.4p3 -0x1.4p2 +REG esri:2078 2 0x1.4p4 -0x1.4p2 +REG esri:2078 3 0x1.4p3 0x1.4p2 +REG esri:2078 4 0x1.4p4 0x1.4p2 +REG esri:2079 0 0x1.5p4 0x0.0p0 +REG esri:2079 1 0x1.0p4 -0x1.4p2 +REG esri:2079 2 0x1.ap4 -0x1.4p2 +REG esri:2079 3 0x1.0p4 0x1.4p2 +REG esri:2079 4 0x1.ap4 0x1.4p2 +REG esri:20790 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:20790 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:20790 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:20790 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:20790 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:20791 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:20791 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:20791 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:20791 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:20791 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:2080 0 0x1.bp4 0x0.0p0 +REG esri:2080 1 0x1.6p4 -0x1.4p2 +REG esri:2080 2 0x1.0p5 -0x1.4p2 +REG esri:2080 3 0x1.6p4 0x1.4p2 +REG esri:2080 4 0x1.0p5 0x1.4p2 +REG esri:2081 0 -0x1.14p6 -0x1.64p6 +REG esri:2081 1 -0x1.02p7 -0x1.64p6 +REG esri:2081 2 -0x1.2p3 -0x1.64p6 +REG esri:2081 3 -0x1.02p7 -0x1.54p6 +REG esri:2081 4 -0x1.2p3 -0x1.54p6 +REG esri:2082 0 -0x1.14p6 -0x1.64p6 +REG esri:2082 1 -0x1.02p7 -0x1.64p6 +REG esri:2082 2 -0x1.2p3 -0x1.64p6 +REG esri:2082 3 -0x1.02p7 -0x1.54p6 +REG esri:2082 4 -0x1.2p3 -0x1.54p6 +REG esri:20822 0 -0x1.98p5 -0x1.9p4 +REG esri:20822 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:20822 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:20822 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:20822 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:20823 0 -0x1.68p5 -0x1.9p4 +REG esri:20823 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:20823 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:20823 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:20823 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:20824 0 -0x1.38p5 -0x1.9p4 +REG esri:20824 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:20824 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:20824 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:20824 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:2083 0 -0x1.14p6 -0x1.64p6 +REG esri:2083 1 -0x1.02p7 -0x1.64p6 +REG esri:2083 2 -0x1.2p3 -0x1.64p6 +REG esri:2083 3 -0x1.02p7 -0x1.54p6 +REG esri:2083 4 -0x1.2p3 -0x1.54p6 +REG esri:2084 0 -0x1.14p6 -0x1.9p4 +REG esri:2084 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:2084 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:2084 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:2084 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:2085 0 -0x1.44p6 0x1.659999999999ap4 +REG esri:2085 1 -0x1.599fdd28e3eaap6 0x1.159999999999ap4 +REG esri:2085 2 -0x1.2e6022d71c156p6 0x1.159999999999ap4 +REG esri:2085 3 -0x1.599fdd28e3eaap6 0x1.b59999999999ap4 +REG esri:2085 4 -0x1.2e6022d71c156p6 0x1.b59999999999ap4 +REG esri:2086 0 -0x1.3355555555555p6 0x1.4b77777777778p4 +REG esri:2086 1 -0x1.48b745942595bp6 0x1.f6eeeeeeeeefp3 +REG esri:2086 2 -0x1.1df365168514fp6 0x1.f6eeeeeeeeefp3 +REG esri:2086 3 -0x1.48b745942595bp6 0x1.9b77777777778p4 +REG esri:2086 4 -0x1.1df365168514fp6 0x1.9b77777777778p4 +REG esri:2087 0 0x1.8p3 0x0.0p0 +REG esri:2087 1 0x1.cp2 -0x1.4p2 +REG esri:2087 2 0x1.1p4 -0x1.4p2 +REG esri:2087 3 0x1.cp2 0x1.4p2 +REG esri:2087 4 0x1.1p4 0x1.4p2 +REG esri:2088 0 0x1.6p3 0x0.0p0 +REG esri:2088 1 0x1.8p2 -0x1.4p2 +REG esri:2088 2 0x1.0p4 -0x1.4p2 +REG esri:2088 3 0x1.8p2 0x1.4p2 +REG esri:2088 4 0x1.0p4 0x1.4p2 +REG esri:2089 0 0x1.68p5 0x0.0p0 +REG esri:2089 1 0x1.4p5 -0x1.4p2 +REG esri:2089 2 0x1.9p5 -0x1.4p2 +REG esri:2089 3 0x1.4p5 0x1.4p2 +REG esri:2089 4 0x1.9p5 0x1.4p2 +REG esri:2090 0 0x1.98p5 0x0.0p0 +REG esri:2090 1 0x1.7p5 -0x1.4p2 +REG esri:2090 2 0x1.cp5 -0x1.4p2 +REG esri:2090 3 0x1.7p5 0x1.4p2 +REG esri:2090 4 0x1.cp5 0x1.4p2 +REG esri:2091 0 0x1.68p5 0x0.0p0 +REG esri:2091 1 0x1.4p5 -0x1.4p2 +REG esri:2091 2 0x1.9p5 -0x1.4p2 +REG esri:2091 3 0x1.4p5 0x1.4p2 +REG esri:2091 4 0x1.9p5 0x1.4p2 +REG esri:2092 0 0x1.98p5 0x0.0p0 +REG esri:2092 1 0x1.7p5 -0x1.4p2 +REG esri:2092 2 0x1.cp5 -0x1.4p2 +REG esri:2092 3 0x1.7p5 0x1.4p2 +REG esri:2092 4 0x1.cp5 0x1.4p2 +REG esri:2093 0 0x1.a8p6 0x0.0p0 +REG esri:2093 1 0x1.94p6 -0x1.4p2 +REG esri:2093 2 0x1.bcp6 -0x1.4p2 +REG esri:2093 3 0x1.94p6 0x1.4p2 +REG esri:2093 4 0x1.bcp6 0x1.4p2 +REG esri:20934 0 0x1.5p4 -0x1.9p4 +REG esri:20934 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:20934 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:20934 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:20934 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:20935 0 0x1.bp4 -0x1.9p4 +REG esri:20935 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:20935 2 0x1.042297030ae5dp5 -0x1.ep4 +REG esri:20935 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:20935 4 0x1.042297030ae5dp5 -0x1.4p4 +REG esri:20936 0 0x1.08p5 -0x1.9p4 +REG esri:20936 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:20936 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:20936 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:20936 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:2094 0 0x1.a8p6 0x0.0p0 +REG esri:2094 1 0x1.94p6 -0x1.4p2 +REG esri:2094 2 0x1.bcp6 -0x1.4p2 +REG esri:2094 3 0x1.94p6 0x1.4p2 +REG esri:2094 4 0x1.bcp6 0x1.4p2 +REG esri:2095 0 -0x1.ep3 0x0.0p0 +REG esri:2095 1 -0x1.4p4 -0x1.4p2 +REG esri:2095 2 -0x1.4p3 -0x1.4p2 +REG esri:2095 3 -0x1.4p4 0x1.4p2 +REG esri:2095 4 -0x1.4p3 0x1.4p2 +REG esri:2096 0 0x1.02p7 0x1.3p5 +REG esri:2096 1 0x1.ea9ea071f4b32p6 0x1.08p5 +REG esri:2096 2 0x1.0eb0afc705a67p7 0x1.08p5 +REG esri:2096 3 0x1.ea9ea071f4b32p6 0x1.58p5 +REG esri:2096 4 0x1.0eb0afc705a67p7 0x1.58p5 +REG esri:2097 0 0x1.fcp6 0x1.3p5 +REG esri:2097 1 0x1.e29ea071f4b32p6 0x1.08p5 +REG esri:2097 2 0x1.0ab0afc705a67p7 0x1.08p5 +REG esri:2097 3 0x1.e29ea071f4b32p6 0x1.58p5 +REG esri:2097 4 0x1.0ab0afc705a67p7 0x1.58p5 +REG esri:2098 0 0x1.f4p6 0x1.3p5 +REG esri:2098 1 0x1.da9ea071f4b32p6 0x1.08p5 +REG esri:2098 2 0x1.06b0afc705a67p7 0x1.08p5 +REG esri:2098 3 0x1.da9ea071f4b32p6 0x1.58p5 +REG esri:2098 4 0x1.06b0afc705a67p7 0x1.58p5 +REG esri:2099 0 0x1.9617530eca864p5 0x1.961e26af37c04p4 +REG esri:2099 1 0x1.69d13643d0049p5 0x1.461e26af37c04p4 +REG esri:2099 2 0x1.c25d6fd9c507fp5 0x1.461e26af37c04p4 +REG esri:2099 3 0x1.69d13643d0049p5 0x1.e61e26af37c04p4 +REG esri:2099 4 0x1.c25d6fd9c507fp5 0x1.e61e26af37c04p4 +REG esri:2100 0 0x1.8p4 0x0.0p0 +REG esri:2100 1 0x1.3p4 -0x1.4p2 +REG esri:2100 2 0x1.dp4 -0x1.4p2 +REG esri:2100 3 0x1.3p4 0x1.4p2 +REG esri:2100 4 0x1.dp4 0x1.4p2 +REG esri:2101 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG esri:2101 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG esri:2101 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG esri:2101 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG esri:2101 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG esri:2102 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG esri:2102 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG esri:2102 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG esri:2102 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG esri:2102 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG esri:2103 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG esri:2103 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG esri:2103 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG esri:2103 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG esri:2103 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG esri:21035 0 0x1.bp4 -0x1.9p4 +REG esri:21035 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:21035 2 0x1.042297030ae5dp5 -0x1.ep4 +REG esri:21035 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:21035 4 0x1.042297030ae5dp5 -0x1.4p4 +REG esri:21036 0 0x1.08p5 -0x1.9p4 +REG esri:21036 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:21036 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:21036 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:21036 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:21037 0 0x1.38p5 -0x1.9p4 +REG esri:21037 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:21037 2 0x1.642297030ae5dp5 -0x1.ep4 +REG esri:21037 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:21037 4 0x1.642297030ae5dp5 -0x1.4p4 +REG esri:2104 0 -0x1.1e6c271115ba1p6 0x1.4555555555557p3 +REG esri:2104 1 -0x1.32bdd3ae09d7ap6 0x1.4aaaaaaaaaaaep2 +REG esri:2104 2 -0x1.0a1a7a74219c8p6 0x1.4aaaaaaaaaaaep2 +REG esri:2104 3 -0x1.32bdd3ae09d7ap6 0x1.e555555555557p3 +REG esri:2104 4 -0x1.0a1a7a74219c8p6 0x1.e555555555557p3 +REG esri:2105 0 0x1.5d8740da740dcp7 -0x1.2709abcdf0123p5 +REG esri:2105 1 0x1.5106d779cfe6ep7 -0x1.4f09abcdf0123p5 +REG esri:2105 2 -0x1.65f855c4e7cb6p7 -0x1.4f09abcdf0123p5 +REG esri:2105 3 0x1.5106d779cfe6ep7 -0x1.fe13579be0246p4 +REG esri:2105 4 -0x1.65f855c4e7cb6p7 -0x1.fe13579be0246p4 +REG esri:2106 0 0x1.60eea61d950c8p7 -0x1.2e16c16c16c17p5 +REG esri:2106 1 0x1.54487b7d25e61p7 -0x1.5616c16c16c17p5 +REG esri:2106 2 -0x1.626b2f41fbcd1p7 -0x1.5616c16c16c17p5 +REG esri:2106 3 0x1.54487b7d25e61p7 -0x1.0616c16c16c17p5 +REG esri:2106 4 -0x1.626b2f41fbcd1p7 -0x1.0616c16c16c17p5 +REG esri:2107 0 0x1.63c56789abce1p7 -0x1.34fedcba98765p5 +REG esri:2107 1 0x1.56f89f4816851p7 -0x1.5cfedcba98765p5 +REG esri:2107 2 -0x1.5f6dd034bee8fp7 -0x1.5cfedcba98765p5 +REG esri:2107 3 0x1.56f89f4816851p7 -0x1.0cfedcba98765p5 +REG esri:2107 4 -0x1.5f6dd034bee8fp7 -0x1.0cfedcba98765p5 +REG esri:2108 0 0x1.6158e38e38e38p7 -0x1.3d34e81b4e81bp5 +REG esri:2108 1 0x1.545bfc8a29cdcp7 -0x1.6534e81b4e81bp5 +REG esri:2108 2 -0x1.61aa356db806cp7 -0x1.6534e81b4e81bp5 +REG esri:2108 3 0x1.545bfc8a29cdcp7 -0x1.1534e81b4e81bp5 +REG esri:2108 4 -0x1.61aa356db806cp7 -0x1.1534e81b4e81bp5 +REG esri:2109 0 0x1.5c749f49f49f5p7 -0x1.39159e26af37dp5 +REG esri:2109 1 0x1.4f902f717eb17p7 -0x1.61159e26af37dp5 +REG esri:2109 2 -0x1.66a6f0dd9572dp7 -0x1.61159e26af37dp5 +REG esri:2109 3 0x1.4f902f717eb17p7 -0x1.11159e26af37dp5 +REG esri:2109 4 -0x1.66a6f0dd9572dp7 -0x1.11159e26af37dp5 +REG esri:21095 0 0x1.bp4 0x0.0p0 +REG esri:21095 1 0x1.6p4 -0x1.4p2 +REG esri:21095 2 0x1.0p5 -0x1.4p2 +REG esri:21095 3 0x1.6p4 0x1.4p2 +REG esri:21095 4 0x1.0p5 0x1.4p2 +REG esri:21096 0 0x1.08p5 0x0.0p0 +REG esri:21096 1 0x1.cp4 -0x1.4p2 +REG esri:21096 2 0x1.3p5 -0x1.4p2 +REG esri:21096 3 0x1.cp4 0x1.4p2 +REG esri:21096 4 0x1.3p5 0x1.4p2 +REG esri:21097 0 0x1.38p5 0x0.0p0 +REG esri:21097 1 0x1.1p5 -0x1.4p2 +REG esri:21097 2 0x1.6p5 -0x1.4p2 +REG esri:21097 3 0x1.1p5 0x1.4p2 +REG esri:21097 4 0x1.6p5 0x1.4p2 +REG esri:2110 0 0x1.5f47ae147ae14p7 -0x1.3c1907f6e5d4cp5 +REG esri:2110 1 0x1.52516bbf80187p7 -0x1.641907f6e5d4cp5 +REG esri:2110 2 -0x1.63c20f968a55fp7 -0x1.641907f6e5d4cp5 +REG esri:2110 3 0x1.52516bbf80187p7 -0x1.141907f6e5d4cp5 +REG esri:2110 4 -0x1.63c20f968a55fp7 -0x1.141907f6e5d4cp5 +REG esri:21100 0 -0x1.1e627298d3894p7 0x0.0p0 +REG esri:21100 1 -0x1.28627298d3894p7 -0x1.4p2 +REG esri:21100 2 -0x1.14627298d3894p7 -0x1.4p2 +REG esri:21100 3 -0x1.28627298d3894p7 0x1.4p2 +REG esri:21100 4 -0x1.14627298d3894p7 0x1.4p2 +REG esri:2111 0 0x1.5ef9e26af37bep7 -0x1.41ef8091a2b3cp5 +REG esri:2111 1 0x1.51e020eb6ef11p7 -0x1.69ef8091a2b3cp5 +REG esri:2111 2 -0x1.63ec5c1587f95p7 -0x1.69ef8091a2b3cp5 +REG esri:2111 3 0x1.51e020eb6ef11p7 -0x1.19ef8091a2b3cp5 +REG esri:2111 4 -0x1.63ec5c1587f95p7 -0x1.19ef8091a2b3cp5 +REG esri:2112 0 0x1.5f4b60b60b60bp7 -0x1.4766f8091a2b3p5 +REG esri:2112 1 0x1.520f2ec947ea3p7 -0x1.6f66f8091a2b3p5 +REG esri:2112 2 -0x1.63786d5d3128dp7 -0x1.6f66f8091a2b3p5 +REG esri:2112 3 0x1.520f2ec947ea3p7 -0x1.1f66f8091a2b3p5 +REG esri:2112 4 -0x1.63786d5d3128dp7 -0x1.1f66f8091a2b3p5 +REG esri:2113 0 0x1.5d8d82d82d82ep7 -0x1.4a68acf13579ap5 +REG esri:2113 1 0x1.503ddcfe274ap7 -0x1.7268acf13579ap5 +REG esri:2113 2 -0x1.6522d74dcc444p7 -0x1.7268acf13579ap5 +REG esri:2113 3 0x1.503ddcfe274ap7 -0x1.2268acf13579ap5 +REG esri:2113 4 -0x1.6522d74dcc444p7 -0x1.2268acf13579ap5 +REG esri:2114 0 0x1.5958091a2b3c3p7 -0x1.45b7c048d159fp5 +REG esri:2114 1 0x1.4c2694266a63ap7 -0x1.6db7c048d159fp5 +REG esri:2114 2 0x1.66897e0dec14cp7 -0x1.6db7c048d159fp5 +REG esri:2114 3 0x1.4c2694266a63ap7 -0x1.1db7c048d159fp5 +REG esri:2114 4 0x1.66897e0dec14cp7 -0x1.1db7c048d159fp5 +REG esri:21148 0 0x1.a4p6 -0x1.9p4 +REG esri:21148 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:21148 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:21148 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:21148 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:21149 0 0x1.bcp6 -0x1.9p4 +REG esri:21149 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:21149 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:21149 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:21149 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:2115 0 0x1.5a992c5f92c61p7 -0x1.4a320fedcba98p5 +REG esri:2115 1 0x1.4d4aeafcbb3e9p7 -0x1.72320fedcba98p5 +REG esri:2115 2 0x1.67e76dc26a4d9p7 -0x1.72320fedcba98p5 +REG esri:2115 3 0x1.4d4aeafcbb3e9p7 -0x1.22320fedcba98p5 +REG esri:2115 4 0x1.67e76dc26a4d9p7 -0x1.22320fedcba98p5 +REG esri:21150 0 0x1.d4p6 -0x1.9p4 +REG esri:21150 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:21150 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:21150 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:21150 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:2116 0 0x1.5837c048d159fp7 -0x1.4a5159e26af37p5 +REG esri:2116 1 0x1.4ae8b2bb678e3p7 -0x1.725159e26af37p5 +REG esri:2116 2 0x1.6586cdd63b25bp7 -0x1.725159e26af37p5 +REG esri:2116 3 0x1.4ae8b2bb678e3p7 -0x1.225159e26af37p5 +REG esri:2116 4 0x1.6586cdd63b25bp7 -0x1.225159e26af37p5 +REG esri:2117 0 0x1.572987654321p7 -0x1.4e7c048d159e2p5 +REG esri:2117 1 0x1.49beea62edbe8p7 -0x1.767c048d159e2p5 +REG esri:2117 2 0x1.6494246798838p7 -0x1.767c048d159e2p5 +REG esri:2117 3 0x1.49beea62edbe8p7 -0x1.267c048d159e2p5 +REG esri:2117 4 0x1.6494246798838p7 -0x1.267c048d159e2p5 +REG esri:2118 0 0x1.57197530eca85p7 -0x1.52ab3c4d5e6f8p5 +REG esri:2118 1 0x1.49926c7972044p7 -0x1.7aab3c4d5e6f8p5 +REG esri:2118 2 0x1.64a07de8674c6p7 -0x1.7aab3c4d5e6f8p5 +REG esri:2118 3 0x1.49926c7972044p7 -0x1.2aab3c4d5e6f8p5 +REG esri:2118 4 0x1.64a07de8674c6p7 -0x1.2aab3c4d5e6f8p5 +REG esri:2119 0 0x1.5a051eb851eb8p7 -0x1.5582d82d82d82p5 +REG esri:2119 1 0x1.4c6a58601d754p7 -0x1.7d82d82d82d82p5 +REG esri:2119 2 0x1.679fe5108661cp7 -0x1.7d82d82d82d82p5 +REG esri:2119 3 0x1.4c6a58601d754p7 -0x1.2d82d82d82d82p5 +REG esri:2119 4 0x1.679fe5108661cp7 -0x1.2d82d82d82d82p5 +REG esri:2120 0 0x1.5b9a98765431fp7 -0x1.4c5b05b05b05ap5 +REG esri:2120 1 0x1.4e3e279047cb1p7 -0x1.745b05b05b05ap5 +REG esri:2120 2 -0x1.6708f6a39f673p7 -0x1.745b05b05b05ap5 +REG esri:2120 3 0x1.4e3e279047cb1p7 -0x1.245b05b05b05ap5 +REG esri:2120 4 -0x1.6708f6a39f673p7 -0x1.245b05b05b05ap5 +REG esri:2121 0 0x1.55f59e26af37bp7 -0x1.5716c16c16c17p5 +REG esri:2121 1 0x1.484fba9414005p7 -0x1.7f16c16c16c17p5 +REG esri:2121 2 0x1.639b81b94a6f1p7 -0x1.7f16c16c16c17p5 +REG esri:2121 3 0x1.484fba9414005p7 -0x1.2f16c16c16c17p5 +REG esri:2121 4 0x1.639b81b94a6f1p7 -0x1.2f16c16c16c17p5 +REG esri:2122 0 0x1.54858bf258bf1p7 -0x1.58e147ae147aep5 +REG esri:2122 1 0x1.46d2e76a28bfp7 -0x1.80e147ae147aep5 +REG esri:2122 2 0x1.6238307a88bf2p7 -0x1.80e147ae147aep5 +REG esri:2122 3 0x1.46d2e76a28bfp7 -0x1.30e147ae147aep5 +REG esri:2122 4 0x1.6238307a88bf2p7 -0x1.30e147ae147aep5 +REG esri:2123 0 0x1.513654320fedcp7 -0x1.5fd27d27d27d3p5 +REG esri:2123 1 0x1.4350d79e6bf7dp7 -0x1.87d27d27d27d3p5 +REG esri:2123 2 0x1.5f1bd0c5b3e3bp7 -0x1.87d27d27d27d3p5 +REG esri:2123 3 0x1.4350d79e6bf7dp7 -0x1.37d27d27d27d3p5 +REG esri:2123 4 0x1.5f1bd0c5b3e3bp7 -0x1.37d27d27d27d3p5 +REG esri:2124 0 0x1.5974320fedcbdp7 -0x1.5cb97530eca87p5 +REG esri:2124 1 0x1.4ba5ad8909d04p7 -0x1.84b97530eca87p5 +REG esri:2124 2 0x1.6742b696d1c76p7 -0x1.84b97530eca87p5 +REG esri:2124 3 0x1.4ba5ad8909d04p7 -0x1.34b97530eca87p5 +REG esri:2124 4 0x1.6742b696d1c76p7 -0x1.34b97530eca87p5 +REG esri:2125 0 0x1.56b89abcdf01p7 -0x1.5dfd27d27d27dp5 +REG esri:2125 1 0x1.48e0c44d7fc1ep7 -0x1.85fd27d27d27dp5 +REG esri:2125 2 0x1.6490712c3e402p7 -0x1.85fd27d27d27dp5 +REG esri:2125 3 0x1.48e0c44d7fc1ep7 -0x1.35fd27d27d27dp5 +REG esri:2125 4 0x1.6490712c3e402p7 -0x1.35fd27d27d27dp5 +REG esri:2126 0 0x1.561d4c3b2a19p7 -0x1.63372ea61d952p5 +REG esri:2126 1 0x1.481e1dd741c88p7 -0x1.8b372ea61d952p5 +REG esri:2126 2 0x1.641c7a9f12698p7 -0x1.8b372ea61d952p5 +REG esri:2126 3 0x1.481e1dd741c88p7 -0x1.3b372ea61d952p5 +REG esri:2126 4 0x1.641c7a9f12698p7 -0x1.3b372ea61d952p5 +REG esri:2127 0 0x1.52ef5c28f5c29p7 -0x1.65e147ae147aep5 +REG esri:2127 1 0x1.44db9a3d26beap7 -0x1.8de147ae147aep5 +REG esri:2127 2 0x1.61031e14c4c68p7 -0x1.8de147ae147aep5 +REG esri:2127 3 0x1.44db9a3d26beap7 -0x1.3de147ae147aep5 +REG esri:2127 4 0x1.61031e14c4c68p7 -0x1.3de147ae147aep5 +REG esri:2128 0 0x1.50cc16c16c16cp7 -0x1.690fedcba9877p5 +REG esri:2128 1 0x1.429f4872f0ac6p7 -0x1.910fedcba9877p5 +REG esri:2128 2 0x1.5ef8e50fe7812p7 -0x1.910fedcba9877p5 +REG esri:2128 3 0x1.429f4872f0ac6p7 -0x1.410fedcba9877p5 +REG esri:2128 4 0x1.5ef8e50fe7812p7 -0x1.410fedcba9877p5 +REG esri:2129 0 0x1.4f7a2b3c4d5e7p7 -0x1.6c82468acf135p5 +REG esri:2129 1 0x1.4131a3134ba3dp7 -0x1.9482468acf135p5 +REG esri:2129 2 0x1.5dc2b3654f191p7 -0x1.9482468acf135p5 +REG esri:2129 3 0x1.4131a3134ba3dp7 -0x1.4482468acf135p5 +REG esri:2129 4 0x1.5dc2b3654f191p7 -0x1.4482468acf135p5 +REG esri:21291 0 -0x1.fp5 0x0.0p0 +REG esri:21291 1 -0x1.0cp6 -0x1.4p2 +REG esri:21291 2 -0x1.c8p5 -0x1.4p2 +REG esri:21291 3 -0x1.0cp6 0x1.4p2 +REG esri:21291 4 -0x1.c8p5 0x1.4p2 +REG esri:21292 0 -0x1.dc7a4fa4fa4fap5 0x1.a5a4fa4fa4fa6p3 +REG esri:21292 1 -0x1.02c7984b5d8bp6 0x1.05a4fa4fa4fa6p3 +REG esri:21292 2 -0x1.b3656eb339893p5 0x1.05a4fa4fa4fa6p3 +REG esri:21292 3 -0x1.02c7984b5d8bp6 0x1.22d27d27d27d3p4 +REG esri:21292 4 -0x1.b3656eb339893p5 0x1.22d27d27d27d3p4 +REG esri:2130 0 0x1.5541b4e81b4e7p7 -0x1.6e87654320feep5 +REG esri:2130 1 0x1.46e8a165832fap7 -0x1.9687654320feep5 +REG esri:2130 2 0x1.639ac86ab36d4p7 -0x1.9687654320feep5 +REG esri:2130 3 0x1.46e8a165832fap7 -0x1.4687654320feep5 +REG esri:2130 4 0x1.639ac86ab36d4p7 -0x1.4687654320feep5 +REG esri:2131 0 0x1.5490a3d70a3d7p7 -0x1.6ee41fdb97531p5 +REG esri:2131 1 0x1.463492dd06991p7 -0x1.96e41fdb97531p5 +REG esri:2131 2 0x1.62ecb4d10de1dp7 -0x1.96e41fdb97531p5 +REG esri:2131 3 0x1.463492dd06991p7 -0x1.46e41fdb97531p5 +REG esri:2131 4 0x1.62ecb4d10de1dp7 -0x1.46e41fdb97531p5 +REG esri:2132 0 0x1.50af8091a2b3dp7 -0x1.74ccccccccccdp5 +REG esri:2132 1 0x1.4221a16181064p7 -0x1.9cccccccccccdp5 +REG esri:2132 2 0x1.5f3d5fc1c4616p7 -0x1.9cccccccccccdp5 +REG esri:2132 3 0x1.4221a16181064p7 -0x1.4cccccccccccdp5 +REG esri:2132 4 0x1.5f3d5fc1c4616p7 -0x1.4cccccccccccdp5 +REG esri:2133 0 0x1.4ap7 -0x1.9p4 +REG esri:2133 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:2133 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:2133 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:2133 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:2134 0 0x1.56p7 -0x1.9p4 +REG esri:2134 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:2134 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:2134 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:2134 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:2135 0 0x1.62p7 -0x1.9p4 +REG esri:2135 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:2135 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:2135 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:2135 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:2136 0 -0x1.0p0 0x1.2aaaaaaaaaaabp2 +REG esri:2136 1 -0x1.81107a2df9b6ep2 -0x1.555555555555p-2 +REG esri:2136 2 0x1.01107a2df9b6ep2 -0x1.555555555555p-2 +REG esri:2136 3 -0x1.81107a2df9b6ep2 0x1.3555555555556p3 +REG esri:2136 4 0x1.01107a2df9b6ep2 0x1.3555555555556p3 +REG esri:2137 0 -0x1.0p0 0x0.0p0 +REG esri:2137 1 -0x1.8p2 -0x1.4p2 +REG esri:2137 2 0x1.0p2 -0x1.4p2 +REG esri:2137 3 -0x1.8p2 0x1.4p2 +REG esri:2137 4 0x1.0p2 0x1.4p2 +REG esri:2138 0 -0x1.12p6 0x1.ap5 +REG esri:2138 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG esri:2138 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG esri:2138 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG esri:2138 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG esri:2139 0 -0x1.bcp5 0x0.0p0 +REG esri:2139 1 -0x1.e4p5 -0x1.4p2 +REG esri:2139 2 -0x1.94p5 -0x1.4p2 +REG esri:2139 3 -0x1.e4p5 0x1.4p2 +REG esri:2139 4 -0x1.94p5 0x1.4p2 +REG esri:2140 0 -0x1.d4p5 0x0.0p0 +REG esri:2140 1 -0x1.fcp5 -0x1.4p2 +REG esri:2140 2 -0x1.acp5 -0x1.4p2 +REG esri:2140 3 -0x1.fcp5 0x1.4p2 +REG esri:2140 4 -0x1.acp5 0x1.4p2 +REG esri:2141 0 -0x1.ecp5 0x0.0p0 +REG esri:2141 1 -0x1.0ap6 -0x1.4p2 +REG esri:2141 2 -0x1.c4p5 -0x1.4p2 +REG esri:2141 3 -0x1.0ap6 0x1.4p2 +REG esri:2141 4 -0x1.c4p5 0x1.4p2 +REG esri:21413 0 0x1.2cp6 0x0.0p0 +REG esri:21413 1 0x1.18p6 -0x1.4p2 +REG esri:21413 2 0x1.4p6 -0x1.4p2 +REG esri:21413 3 0x1.18p6 0x1.4p2 +REG esri:21413 4 0x1.4p6 0x1.4p2 +REG esri:21414 0 0x1.44p6 0x0.0p0 +REG esri:21414 1 0x1.3p6 -0x1.4p2 +REG esri:21414 2 0x1.58p6 -0x1.4p2 +REG esri:21414 3 0x1.3p6 0x1.4p2 +REG esri:21414 4 0x1.58p6 0x1.4p2 +REG esri:21415 0 0x1.5cp6 0x0.0p0 +REG esri:21415 1 0x1.48p6 -0x1.4p2 +REG esri:21415 2 0x1.7p6 -0x1.4p2 +REG esri:21415 3 0x1.48p6 0x1.4p2 +REG esri:21415 4 0x1.7p6 0x1.4p2 +REG esri:21416 0 0x1.74p6 0x0.0p0 +REG esri:21416 1 0x1.6p6 -0x1.4p2 +REG esri:21416 2 0x1.88p6 -0x1.4p2 +REG esri:21416 3 0x1.6p6 0x1.4p2 +REG esri:21416 4 0x1.88p6 0x1.4p2 +REG esri:21417 0 0x1.8cp6 0x0.0p0 +REG esri:21417 1 0x1.78p6 -0x1.4p2 +REG esri:21417 2 0x1.ap6 -0x1.4p2 +REG esri:21417 3 0x1.78p6 0x1.4p2 +REG esri:21417 4 0x1.ap6 0x1.4p2 +REG esri:21418 0 0x1.a4p6 0x0.0p0 +REG esri:21418 1 0x1.9p6 -0x1.4p2 +REG esri:21418 2 0x1.b8p6 -0x1.4p2 +REG esri:21418 3 0x1.9p6 0x1.4p2 +REG esri:21418 4 0x1.b8p6 0x1.4p2 +REG esri:21419 0 0x1.bcp6 0x0.0p0 +REG esri:21419 1 0x1.a8p6 -0x1.4p2 +REG esri:21419 2 0x1.dp6 -0x1.4p2 +REG esri:21419 3 0x1.a8p6 0x1.4p2 +REG esri:21419 4 0x1.dp6 0x1.4p2 +REG esri:2142 0 -0x1.02p6 0x0.0p0 +REG esri:2142 1 -0x1.16p6 -0x1.4p2 +REG esri:2142 2 -0x1.dcp5 -0x1.4p2 +REG esri:2142 3 -0x1.16p6 0x1.4p2 +REG esri:2142 4 -0x1.dcp5 0x1.4p2 +REG esri:21420 0 0x1.d4p6 0x0.0p0 +REG esri:21420 1 0x1.cp6 -0x1.4p2 +REG esri:21420 2 0x1.e8p6 -0x1.4p2 +REG esri:21420 3 0x1.cp6 0x1.4p2 +REG esri:21420 4 0x1.e8p6 0x1.4p2 +REG esri:21421 0 0x1.ecp6 0x0.0p0 +REG esri:21421 1 0x1.d8p6 -0x1.4p2 +REG esri:21421 2 0x1.0p7 -0x1.4p2 +REG esri:21421 3 0x1.d8p6 0x1.4p2 +REG esri:21421 4 0x1.0p7 0x1.4p2 +REG esri:21422 0 0x1.02p7 0x0.0p0 +REG esri:21422 1 0x1.fp6 -0x1.4p2 +REG esri:21422 2 0x1.0cp7 -0x1.4p2 +REG esri:21422 3 0x1.fp6 0x1.4p2 +REG esri:21422 4 0x1.0cp7 0x1.4p2 +REG esri:21423 0 0x1.0ep7 0x0.0p0 +REG esri:21423 1 0x1.04p7 -0x1.4p2 +REG esri:21423 2 0x1.18p7 -0x1.4p2 +REG esri:21423 3 0x1.04p7 0x1.4p2 +REG esri:21423 4 0x1.18p7 0x1.4p2 +REG esri:2143 0 -0x1.0ep6 0x0.0p0 +REG esri:2143 1 -0x1.22p6 -0x1.4p2 +REG esri:2143 2 -0x1.f4p5 -0x1.4p2 +REG esri:2143 3 -0x1.22p6 0x1.4p2 +REG esri:2143 4 -0x1.f4p5 0x1.4p2 +REG esri:2144 0 -0x1.1ap6 0x0.0p0 +REG esri:2144 1 -0x1.2ep6 -0x1.4p2 +REG esri:2144 2 -0x1.06p6 -0x1.4p2 +REG esri:2144 3 -0x1.2ep6 0x1.4p2 +REG esri:2144 4 -0x1.06p6 0x1.4p2 +REG esri:2145 0 -0x1.26p6 0x0.0p0 +REG esri:2145 1 -0x1.3ap6 -0x1.4p2 +REG esri:2145 2 -0x1.12p6 -0x1.4p2 +REG esri:2145 3 -0x1.3ap6 0x1.4p2 +REG esri:2145 4 -0x1.12p6 0x1.4p2 +REG esri:21453 0 0x1.2cp6 0x0.0p0 +REG esri:21453 1 0x1.18p6 -0x1.4p2 +REG esri:21453 2 0x1.4p6 -0x1.4p2 +REG esri:21453 3 0x1.18p6 0x1.4p2 +REG esri:21453 4 0x1.4p6 0x1.4p2 +REG esri:21454 0 0x1.44p6 0x0.0p0 +REG esri:21454 1 0x1.3p6 -0x1.4p2 +REG esri:21454 2 0x1.58p6 -0x1.4p2 +REG esri:21454 3 0x1.3p6 0x1.4p2 +REG esri:21454 4 0x1.58p6 0x1.4p2 +REG esri:21455 0 0x1.5cp6 0x0.0p0 +REG esri:21455 1 0x1.48p6 -0x1.4p2 +REG esri:21455 2 0x1.7p6 -0x1.4p2 +REG esri:21455 3 0x1.48p6 0x1.4p2 +REG esri:21455 4 0x1.7p6 0x1.4p2 +REG esri:21456 0 0x1.74p6 0x0.0p0 +REG esri:21456 1 0x1.6p6 -0x1.4p2 +REG esri:21456 2 0x1.88p6 -0x1.4p2 +REG esri:21456 3 0x1.6p6 0x1.4p2 +REG esri:21456 4 0x1.88p6 0x1.4p2 +REG esri:21457 0 0x1.8cp6 0x0.0p0 +REG esri:21457 1 0x1.78p6 -0x1.4p2 +REG esri:21457 2 0x1.ap6 -0x1.4p2 +REG esri:21457 3 0x1.78p6 0x1.4p2 +REG esri:21457 4 0x1.ap6 0x1.4p2 +REG esri:21458 0 0x1.a4p6 0x0.0p0 +REG esri:21458 1 0x1.9p6 -0x1.4p2 +REG esri:21458 2 0x1.b8p6 -0x1.4p2 +REG esri:21458 3 0x1.9p6 0x1.4p2 +REG esri:21458 4 0x1.b8p6 0x1.4p2 +REG esri:21459 0 0x1.bcp6 0x0.0p0 +REG esri:21459 1 0x1.a8p6 -0x1.4p2 +REG esri:21459 2 0x1.dp6 -0x1.4p2 +REG esri:21459 3 0x1.a8p6 0x1.4p2 +REG esri:21459 4 0x1.dp6 0x1.4p2 +REG esri:2146 0 -0x1.32p6 0x0.0p0 +REG esri:2146 1 -0x1.46p6 -0x1.4p2 +REG esri:2146 2 -0x1.1ep6 -0x1.4p2 +REG esri:2146 3 -0x1.46p6 0x1.4p2 +REG esri:2146 4 -0x1.1ep6 0x1.4p2 +REG esri:21460 0 0x1.d4p6 0x0.0p0 +REG esri:21460 1 0x1.cp6 -0x1.4p2 +REG esri:21460 2 0x1.e8p6 -0x1.4p2 +REG esri:21460 3 0x1.cp6 0x1.4p2 +REG esri:21460 4 0x1.e8p6 0x1.4p2 +REG esri:21461 0 0x1.ecp6 0x0.0p0 +REG esri:21461 1 0x1.d8p6 -0x1.4p2 +REG esri:21461 2 0x1.0p7 -0x1.4p2 +REG esri:21461 3 0x1.d8p6 0x1.4p2 +REG esri:21461 4 0x1.0p7 0x1.4p2 +REG esri:21462 0 0x1.02p7 0x0.0p0 +REG esri:21462 1 0x1.fp6 -0x1.4p2 +REG esri:21462 2 0x1.0cp7 -0x1.4p2 +REG esri:21462 3 0x1.fp6 0x1.4p2 +REG esri:21462 4 0x1.0cp7 0x1.4p2 +REG esri:21463 0 0x1.0ep7 0x0.0p0 +REG esri:21463 1 0x1.04p7 -0x1.4p2 +REG esri:21463 2 0x1.18p7 -0x1.4p2 +REG esri:21463 3 0x1.04p7 0x1.4p2 +REG esri:21463 4 0x1.18p7 0x1.4p2 +REG esri:2147 0 -0x1.3ep6 0x0.0p0 +REG esri:2147 1 -0x1.52p6 -0x1.4p2 +REG esri:2147 2 -0x1.2ap6 -0x1.4p2 +REG esri:2147 3 -0x1.52p6 0x1.4p2 +REG esri:2147 4 -0x1.2ap6 0x1.4p2 +REG esri:21473 0 0x1.2cp6 0x0.0p0 +REG esri:21473 1 0x1.18p6 -0x1.4p2 +REG esri:21473 2 0x1.4p6 -0x1.4p2 +REG esri:21473 3 0x1.18p6 0x1.4p2 +REG esri:21473 4 0x1.4p6 0x1.4p2 +REG esri:21474 0 0x1.44p6 0x0.0p0 +REG esri:21474 1 0x1.3p6 -0x1.4p2 +REG esri:21474 2 0x1.58p6 -0x1.4p2 +REG esri:21474 3 0x1.3p6 0x1.4p2 +REG esri:21474 4 0x1.58p6 0x1.4p2 +REG esri:21475 0 0x1.5cp6 0x0.0p0 +REG esri:21475 1 0x1.48p6 -0x1.4p2 +REG esri:21475 2 0x1.7p6 -0x1.4p2 +REG esri:21475 3 0x1.48p6 0x1.4p2 +REG esri:21475 4 0x1.7p6 0x1.4p2 +REG esri:21476 0 0x1.74p6 0x0.0p0 +REG esri:21476 1 0x1.6p6 -0x1.4p2 +REG esri:21476 2 0x1.88p6 -0x1.4p2 +REG esri:21476 3 0x1.6p6 0x1.4p2 +REG esri:21476 4 0x1.88p6 0x1.4p2 +REG esri:21477 0 0x1.8cp6 0x0.0p0 +REG esri:21477 1 0x1.78p6 -0x1.4p2 +REG esri:21477 2 0x1.ap6 -0x1.4p2 +REG esri:21477 3 0x1.78p6 0x1.4p2 +REG esri:21477 4 0x1.ap6 0x1.4p2 +REG esri:21478 0 0x1.a4p6 0x0.0p0 +REG esri:21478 1 0x1.9p6 -0x1.4p2 +REG esri:21478 2 0x1.b8p6 -0x1.4p2 +REG esri:21478 3 0x1.9p6 0x1.4p2 +REG esri:21478 4 0x1.b8p6 0x1.4p2 +REG esri:21479 0 0x1.bcp6 0x0.0p0 +REG esri:21479 1 0x1.a8p6 -0x1.4p2 +REG esri:21479 2 0x1.dp6 -0x1.4p2 +REG esri:21479 3 0x1.a8p6 0x1.4p2 +REG esri:21479 4 0x1.dp6 0x1.4p2 +REG esri:2148 0 -0x1.c8p5 0x0.0p0 +REG esri:2148 1 -0x1.fp5 -0x1.4p2 +REG esri:2148 2 -0x1.ap5 -0x1.4p2 +REG esri:2148 3 -0x1.fp5 0x1.4p2 +REG esri:2148 4 -0x1.ap5 0x1.4p2 +REG esri:21480 0 0x1.d4p6 0x0.0p0 +REG esri:21480 1 0x1.cp6 -0x1.4p2 +REG esri:21480 2 0x1.e8p6 -0x1.4p2 +REG esri:21480 3 0x1.cp6 0x1.4p2 +REG esri:21480 4 0x1.e8p6 0x1.4p2 +REG esri:21481 0 0x1.ecp6 0x0.0p0 +REG esri:21481 1 0x1.d8p6 -0x1.4p2 +REG esri:21481 2 0x1.0p7 -0x1.4p2 +REG esri:21481 3 0x1.d8p6 0x1.4p2 +REG esri:21481 4 0x1.0p7 0x1.4p2 +REG esri:21482 0 0x1.02p7 0x0.0p0 +REG esri:21482 1 0x1.fp6 -0x1.4p2 +REG esri:21482 2 0x1.0cp7 -0x1.4p2 +REG esri:21482 3 0x1.fp6 0x1.4p2 +REG esri:21482 4 0x1.0cp7 0x1.4p2 +REG esri:21483 0 0x1.0ep7 0x0.0p0 +REG esri:21483 1 0x1.04p7 -0x1.4p2 +REG esri:21483 2 0x1.18p7 -0x1.4p2 +REG esri:21483 3 0x1.04p7 0x1.4p2 +REG esri:21483 4 0x1.18p7 0x1.4p2 +REG esri:2149 0 -0x1.2cp6 0x0.0p0 +REG esri:2149 1 -0x1.4p6 -0x1.4p2 +REG esri:2149 2 -0x1.18p6 -0x1.4p2 +REG esri:2149 3 -0x1.4p6 0x1.4p2 +REG esri:2149 4 -0x1.18p6 0x1.4p2 +REG esri:2150 0 -0x1.44p6 0x0.0p0 +REG esri:2150 1 -0x1.58p6 -0x1.4p2 +REG esri:2150 2 -0x1.3p6 -0x1.4p2 +REG esri:2150 3 -0x1.58p6 0x1.4p2 +REG esri:2150 4 -0x1.3p6 0x1.4p2 +REG esri:21500 0 0x1.178ce703afb7fp2 0x1.17aaaaaaaaaabp6 +REG esri:21500 1 -0x1.3a844271f488bp5 0x1.b755555555556p5 +REG esri:21500 2 0x1.80677c32e076bp5 0x1.b755555555556p5 +REG esri:21500 3 -0x1.3a844271f488bp5 0x1.53aaaaaaaaaabp6 +REG esri:21500 4 0x1.80677c32e076bp5 0x1.53aaaaaaaaaabp6 +REG esri:2151 0 -0x1.a4p6 0x0.0p0 +REG esri:2151 1 -0x1.b8p6 -0x1.4p2 +REG esri:2151 2 -0x1.9p6 -0x1.4p2 +REG esri:2151 3 -0x1.b8p6 0x1.4p2 +REG esri:2151 4 -0x1.9p6 0x1.4p2 +REG esri:2152 0 -0x1.bcp6 0x0.0p0 +REG esri:2152 1 -0x1.dp6 -0x1.4p2 +REG esri:2152 2 -0x1.a8p6 -0x1.4p2 +REG esri:2152 3 -0x1.dp6 0x1.4p2 +REG esri:2152 4 -0x1.a8p6 0x1.4p2 +REG esri:2153 0 -0x1.d4p6 0x0.0p0 +REG esri:2153 1 -0x1.e8p6 -0x1.4p2 +REG esri:2153 2 -0x1.cp6 -0x1.4p2 +REG esri:2153 3 -0x1.e8p6 0x1.4p2 +REG esri:2153 4 -0x1.cp6 0x1.4p2 +REG esri:2154 0 0x1.8p1 0x1.74p5 +REG esri:2154 1 -0x1.10e06f120d02p2 0x1.4cp5 +REG esri:2154 2 0x1.487037890681p3 0x1.4cp5 +REG esri:2154 3 -0x1.10e06f120d02p2 0x1.9cp5 +REG esri:2154 4 0x1.487037890681p3 0x1.9cp5 +REG esri:2155 0 0x1.54p7 -0x1.c88888888888ap3 +REG esri:2155 1 0x1.49ae8908a9a94p7 -0x1.3444444444445p4 +REG esri:2155 2 0x1.5e5176f75656cp7 -0x1.3444444444445p4 +REG esri:2155 3 0x1.49ae8908a9a94p7 -0x1.288888888888ap3 +REG esri:2155 4 0x1.5e5176f75656cp7 -0x1.288888888888ap3 +REG esri:2156 0 0x1.56p7 -0x1.9p4 +REG esri:2156 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:2156 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:2156 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:2156 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:2157 0 -0x1.0p3 0x1.acp5 +REG esri:2157 1 -0x1.067e6c3855169p4 0x1.84p5 +REG esri:2157 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG esri:2157 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG esri:2157 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG esri:2158 0 -0x1.2p3 0x0.0p0 +REG esri:2158 1 -0x1.cp3 -0x1.4p2 +REG esri:2158 2 -0x1.0p2 -0x1.4p2 +REG esri:2158 3 -0x1.cp3 0x1.4p2 +REG esri:2158 4 -0x1.0p2 0x1.4p2 +REG esri:2159 0 -0x1.8p3 0x1.aaaaaaaaaaaabp2 +REG esri:2159 1 -0x1.108b6bd0721f4p4 0x1.aaaaaaaaaaaacp0 +REG esri:2159 2 -0x1.bdd250be37832p2 0x1.aaaaaaaaaaaacp0 +REG esri:2159 3 -0x1.108b6bd0721f4p4 0x1.7555555555556p3 +REG esri:2159 4 -0x1.bdd250be37832p2 0x1.7555555555556p3 +REG esri:2160 0 -0x1.8p3 0x1.aaaaaaaaaaaabp2 +REG esri:2160 1 -0x1.108b6bd0721f4p4 0x1.aaaaaaaaaaaacp0 +REG esri:2160 2 -0x1.bdd250be37832p2 0x1.aaaaaaaaaaaacp0 +REG esri:2160 3 -0x1.108b6bd0721f4p4 0x1.7555555555556p3 +REG esri:2160 4 -0x1.bdd250be37832p2 0x1.7555555555556p3 +REG esri:2161 0 -0x1.ep3 0x0.0p0 +REG esri:2161 1 -0x1.4p4 -0x1.4p2 +REG esri:2161 2 -0x1.4p3 -0x1.4p2 +REG esri:2161 3 -0x1.4p4 0x1.4p2 +REG esri:2161 4 -0x1.4p3 0x1.4p2 +REG esri:2162 0 -0x1.2p3 0x0.0p0 +REG esri:2162 1 -0x1.cp3 -0x1.4p2 +REG esri:2162 2 -0x1.0p2 -0x1.4p2 +REG esri:2162 3 -0x1.cp3 0x1.4p2 +REG esri:2162 4 -0x1.0p2 0x1.4p2 +REG esri:2163 0 -0x1.9p6 0x1.68p5 +REG esri:2163 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG esri:2163 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG esri:2163 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG esri:2163 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG esri:2164 0 -0x1.4p2 0x0.0p0 +REG esri:2164 1 -0x1.4p3 -0x1.4p2 +REG esri:2164 2 0x0.0p0 -0x1.4p2 +REG esri:2164 3 -0x1.4p3 0x1.4p2 +REG esri:2164 4 0x0.0p0 0x1.4p2 +REG esri:2165 0 -0x1.4p2 0x0.0p0 +REG esri:2165 1 -0x1.4p3 -0x1.4p2 +REG esri:2165 2 0x0.0p0 -0x1.4p2 +REG esri:2165 3 -0x1.4p3 0x1.4p2 +REG esri:2165 4 0x0.0p0 0x1.4p2 +REG esri:2166 0 0x1.2p3 0x0.0p0 +REG esri:2166 1 0x1.0p2 -0x1.4p2 +REG esri:2166 2 0x1.cp3 -0x1.4p2 +REG esri:2166 3 0x1.0p2 0x1.4p2 +REG esri:2166 4 0x1.cp3 0x1.4p2 +REG esri:2167 0 0x1.8p3 0x0.0p0 +REG esri:2167 1 0x1.cp2 -0x1.4p2 +REG esri:2167 2 0x1.1p4 -0x1.4p2 +REG esri:2167 3 0x1.cp2 0x1.4p2 +REG esri:2167 4 0x1.1p4 0x1.4p2 +REG esri:2168 0 0x1.ep3 0x0.0p0 +REG esri:2168 1 0x1.4p3 -0x1.4p2 +REG esri:2168 2 0x1.4p4 -0x1.4p2 +REG esri:2168 3 0x1.4p3 0x1.4p2 +REG esri:2168 4 0x1.4p4 0x1.4p2 +REG esri:2169 0 0x1.8aaaaaaaaaaabp2 0x1.8eaaaaaaaaaacp5 +REG esri:2169 1 -0x1.95c9edbad79ap0 0x1.66aaaaaaaaaacp5 +REG esri:2169 2 0x1.bd63e862059dfp3 0x1.66aaaaaaaaaacp5 +REG esri:2169 3 -0x1.95c9edbad79ap0 0x1.b6aaaaaaaaaacp5 +REG esri:2169 4 0x1.bd63e862059dfp3 0x1.b6aaaaaaaaaacp5 +REG esri:2170 0 0x1.ep3 0x0.0p0 +REG esri:2170 1 0x1.4p3 -0x1.4p2 +REG esri:2170 2 0x1.4p4 -0x1.4p2 +REG esri:2170 3 0x1.4p3 0x1.4p2 +REG esri:2170 4 0x1.4p4 0x1.4p2 +REG esri:2171 0 0x1.5155555555554p4 0x1.95p5 +REG esri:2171 1 0x1.a6750a37c615ep3 0x1.6dp5 +REG esri:2171 2 0x1.cf70258ec79f9p4 0x1.6dp5 +REG esri:2171 3 0x1.a6750a37c615ep3 0x1.bdp5 +REG esri:2171 4 0x1.cf70258ec79f9p4 0x1.bdp5 +REG esri:2172 0 0x1.580b60b60b60cp4 0x1.a803fb72ea61ep5 +REG esri:2172 1 0x1.a636e8f731edcp3 0x1.8003fb72ea61ep5 +REG esri:2172 2 0x1.dcfb4cf07dcaap4 0x1.8003fb72ea61ep5 +REG esri:2172 3 0x1.a636e8f731edcp3 0x1.d003fb72ea61ep5 +REG esri:2172 4 0x1.dcfb4cf07dcaap4 0x1.d003fb72ea61ep5 +REG esri:2173 0 0x1.1022222222221p4 0x1.acaaaaaaaaaacp5 +REG esri:2173 1 0x1.12bfbb2c37748p3 0x1.84aaaaaaaaaacp5 +REG esri:2173 2 0x1.96e466ae2889ep4 0x1.84aaaaaaaaaacp5 +REG esri:2173 3 0x1.12bfbb2c37748p3 0x1.d4aaaaaaaaaacp5 +REG esri:2173 4 0x1.96e466ae2889ep4 0x1.d4aaaaaaaaaacp5 +REG esri:2174 0 0x1.0ac16c16c16c1p4 0x1.9d5ddddddddddp5 +REG esri:2174 1 0x1.13855653052adp3 0x1.755ddddddddddp5 +REG esri:2174 2 0x1.8bc02d040042cp4 0x1.755ddddddddddp5 +REG esri:2174 3 0x1.13855653052adp3 0x1.c55ddddddddddp5 +REG esri:2174 4 0x1.8bc02d040042cp4 0x1.c55ddddddddddp5 +REG esri:2175 0 0x1.2f55555555554p4 0x0.0p0 +REG esri:2175 1 0x1.beaaaaaaaaaa8p3 -0x1.4p2 +REG esri:2175 2 0x1.7f55555555554p4 -0x1.4p2 +REG esri:2175 3 0x1.beaaaaaaaaaa8p3 0x1.4p2 +REG esri:2175 4 0x1.7f55555555554p4 0x1.4p2 +REG esri:2176 0 0x1.ep3 0x0.0p0 +REG esri:2176 1 0x1.4p3 -0x1.4p2 +REG esri:2176 2 0x1.4p4 -0x1.4p2 +REG esri:2176 3 0x1.4p3 0x1.4p2 +REG esri:2176 4 0x1.4p4 0x1.4p2 +REG esri:2177 0 0x1.2p4 0x0.0p0 +REG esri:2177 1 0x1.ap3 -0x1.4p2 +REG esri:2177 2 0x1.7p4 -0x1.4p2 +REG esri:2177 3 0x1.ap3 0x1.4p2 +REG esri:2177 4 0x1.7p4 0x1.4p2 +REG esri:2178 0 0x1.5p4 0x0.0p0 +REG esri:2178 1 0x1.0p4 -0x1.4p2 +REG esri:2178 2 0x1.ap4 -0x1.4p2 +REG esri:2178 3 0x1.0p4 0x1.4p2 +REG esri:2178 4 0x1.ap4 0x1.4p2 +REG esri:21780 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG esri:21780 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG esri:21780 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG esri:21780 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG esri:21780 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG esri:21781 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG esri:21781 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG esri:21781 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG esri:21781 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG esri:21781 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG esri:2179 0 0x1.8p4 0x0.0p0 +REG esri:2179 1 0x1.3p4 -0x1.4p2 +REG esri:2179 2 0x1.dp4 -0x1.4p2 +REG esri:2179 3 0x1.3p4 0x1.4p2 +REG esri:2179 4 0x1.dp4 0x1.4p2 +REG esri:2180 0 0x1.3p4 0x0.0p0 +REG esri:2180 1 0x1.cp3 -0x1.4p2 +REG esri:2180 2 0x1.8p4 -0x1.4p2 +REG esri:2180 3 0x1.cp3 0x1.4p2 +REG esri:2180 4 0x1.8p4 0x1.4p2 +REG esri:21817 0 -0x1.44p6 0x0.0p0 +REG esri:21817 1 -0x1.58p6 -0x1.4p2 +REG esri:21817 2 -0x1.3p6 -0x1.4p2 +REG esri:21817 3 -0x1.58p6 0x1.4p2 +REG esri:21817 4 -0x1.3p6 0x1.4p2 +REG esri:21818 0 -0x1.2cp6 0x0.0p0 +REG esri:21818 1 -0x1.4p6 -0x1.4p2 +REG esri:21818 2 -0x1.18p6 -0x1.4p2 +REG esri:21818 3 -0x1.4p6 0x1.4p2 +REG esri:21818 4 -0x1.18p6 0x1.4p2 +REG esri:2188 0 -0x1.08p5 0x0.0p0 +REG esri:2188 1 -0x1.3p5 -0x1.4p2 +REG esri:2188 2 -0x1.cp4 -0x1.4p2 +REG esri:2188 3 -0x1.3p5 0x1.4p2 +REG esri:2188 4 -0x1.cp4 0x1.4p2 +REG esri:2189 0 -0x1.bp4 0x0.0p0 +REG esri:2189 1 -0x1.0p5 -0x1.4p2 +REG esri:2189 2 -0x1.6p4 -0x1.4p2 +REG esri:2189 3 -0x1.0p5 0x1.4p2 +REG esri:2189 4 -0x1.6p4 0x1.4p2 +REG esri:21891 0 -0x1.3452dbd194238p6 0x1.2656ca290d0fcp2 +REG esri:21891 1 -0x1.486365b101477p6 -0x1.9a935d6f2f04p-2 +REG esri:21891 2 -0x1.204251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG esri:21891 3 -0x1.486365b101477p6 0x1.332b65148687ep3 +REG esri:21891 4 -0x1.204251f226ff9p6 0x1.332b65148687ep3 +REG esri:21892 0 -0x1.2852dbd194238p6 0x1.2656ca290d0fcp2 +REG esri:21892 1 -0x1.3c6365b101477p6 -0x1.9a935d6f2f04p-2 +REG esri:21892 2 -0x1.144251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG esri:21892 3 -0x1.3c6365b101477p6 0x1.332b65148687ep3 +REG esri:21892 4 -0x1.144251f226ff9p6 0x1.332b65148687ep3 +REG esri:21893 0 -0x1.1c52dbd194238p6 0x1.2656ca290d0fcp2 +REG esri:21893 1 -0x1.306365b101477p6 -0x1.9a935d6f2f04p-2 +REG esri:21893 2 -0x1.084251f226ff9p6 -0x1.9a935d6f2f04p-2 +REG esri:21893 3 -0x1.306365b101477p6 0x1.332b65148687ep3 +REG esri:21893 4 -0x1.084251f226ff9p6 0x1.332b65148687ep3 +REG esri:21894 0 -0x1.1052dbd194238p6 0x1.2656ca290d0fcp2 +REG esri:21894 1 -0x1.246365b101477p6 -0x1.9a935d6f2f04p-2 +REG esri:21894 2 -0x1.f884a3e44dff2p5 -0x1.9a935d6f2f04p-2 +REG esri:21894 3 -0x1.246365b101477p6 0x1.332b65148687ep3 +REG esri:21894 4 -0x1.f884a3e44dff2p5 0x1.332b65148687ep3 +REG esri:2190 0 -0x1.bp4 0x0.0p0 +REG esri:2190 1 -0x1.0p5 -0x1.4p2 +REG esri:2190 2 -0x1.6p4 -0x1.4p2 +REG esri:2190 3 -0x1.0p5 0x1.4p2 +REG esri:2190 4 -0x1.6p4 0x1.4p2 +REG esri:2191 0 -0x1.ep3 0x0.0p0 +REG esri:2191 1 -0x1.4p4 -0x1.4p2 +REG esri:2191 2 -0x1.4p3 -0x1.4p2 +REG esri:2191 3 -0x1.4p4 0x1.4p2 +REG esri:2191 4 -0x1.4p3 0x1.4p2 +REG esri:2192 0 0x1.2b2a53490b9bp1 0x1.7666666666666p5 +REG esri:2192 1 -0x1.3de1330a236dbp2 0x1.4e66666666666p5 +REG esri:2192 2 0x1.3485c32997846p3 0x1.4e66666666666p5 +REG esri:2192 3 -0x1.3de1330a236dbp2 0x1.9e66666666666p5 +REG esri:2192 4 0x1.3485c32997846p3 0x1.9e66666666666p5 +REG esri:2193 0 0x1.5ap7 0x0.0p0 +REG esri:2193 1 0x1.5p7 -0x1.4p2 +REG esri:2193 2 0x1.64p7 -0x1.4p2 +REG esri:2193 3 0x1.5p7 0x1.4p2 +REG esri:2193 4 0x1.64p7 0x1.4p2 +REG esri:2194 0 -0x1.54p7 -0x1.c88888888888ap3 +REG esri:2194 1 -0x1.5e5176f75656cp7 -0x1.3444444444445p4 +REG esri:2194 2 -0x1.49ae8908a9a94p7 -0x1.3444444444445p4 +REG esri:2194 3 -0x1.5e5176f75656cp7 -0x1.288888888888ap3 +REG esri:2194 4 -0x1.49ae8908a9a94p7 -0x1.288888888888ap3 +REG esri:2195 0 -0x1.56p7 -0x1.9p4 +REG esri:2195 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:2195 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:2195 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:2195 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:2196 0 0x1.3p3 0x0.0p0 +REG esri:2196 1 0x1.2p2 -0x1.4p2 +REG esri:2196 2 0x1.dp3 -0x1.4p2 +REG esri:2196 3 0x1.2p2 0x1.4p2 +REG esri:2196 4 0x1.dp3 0x1.4p2 +REG esri:2197 0 0x1.8p3 0x0.0p0 +REG esri:2197 1 0x1.cp2 -0x1.4p2 +REG esri:2197 2 0x1.1p4 -0x1.4p2 +REG esri:2197 3 0x1.cp2 0x1.4p2 +REG esri:2197 4 0x1.1p4 0x1.4p2 +REG esri:2198 0 0x1.ep3 0x0.0p0 +REG esri:2198 1 0x1.4p3 -0x1.4p2 +REG esri:2198 2 0x1.4p4 -0x1.4p2 +REG esri:2198 3 0x1.4p3 0x1.4p2 +REG esri:2198 4 0x1.4p4 0x1.4p2 +REG esri:2199 0 0x1.5p4 0x0.0p0 +REG esri:2199 1 0x1.0p4 -0x1.4p2 +REG esri:2199 2 0x1.ap4 -0x1.4p2 +REG esri:2199 3 0x1.0p4 0x1.4p2 +REG esri:2199 4 0x1.ap4 0x1.4p2 +REG esri:2200 0 -0x1.0ap6 0x1.74p5 +REG esri:2200 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG esri:2200 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG esri:2200 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG esri:2200 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG esri:2201 0 -0x1.2cp6 0x0.0p0 +REG esri:2201 1 -0x1.4p6 -0x1.4p2 +REG esri:2201 2 -0x1.18p6 -0x1.4p2 +REG esri:2201 3 -0x1.4p6 0x1.4p2 +REG esri:2201 4 -0x1.18p6 0x1.4p2 +REG esri:2202 0 -0x1.14p6 0x0.0p0 +REG esri:2202 1 -0x1.28p6 -0x1.4p2 +REG esri:2202 2 -0x1.0p6 -0x1.4p2 +REG esri:2202 3 -0x1.28p6 0x1.4p2 +REG esri:2202 4 -0x1.0p6 0x1.4p2 +REG esri:2203 0 -0x1.f8p5 0x0.0p0 +REG esri:2203 1 -0x1.1p6 -0x1.4p2 +REG esri:2203 2 -0x1.dp5 -0x1.4p2 +REG esri:2203 3 -0x1.1p6 0x1.4p2 +REG esri:2203 4 -0x1.dp5 0x1.4p2 +REG esri:22032 0 0x1.2p3 -0x1.9p4 +REG esri:22032 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:22032 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:22032 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:22032 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:22033 0 0x1.ep3 -0x1.9p4 +REG esri:22033 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:22033 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:22033 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:22033 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:2204 0 -0x1.58p6 0x1.1c55555555554p5 +REG esri:2204 1 -0x1.609a4e06b0d59p6 0x1.0e55555555554p5 +REG esri:2204 2 -0x1.4f65b1f94f2a7p6 0x1.0e55555555554p5 +REG esri:2204 3 -0x1.609a4e06b0d59p6 0x1.2a55555555554p5 +REG esri:2204 4 -0x1.4f65b1f94f2a7p6 0x1.2a55555555554p5 +REG esri:2205 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:2205 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:2205 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:2205 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:2205 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:2206 0 0x1.bp4 0x0.0p0 +REG esri:2206 1 0x1.6p4 -0x1.4p2 +REG esri:2206 2 0x1.0p5 -0x1.4p2 +REG esri:2206 3 0x1.6p4 0x1.4p2 +REG esri:2206 4 0x1.0p5 0x1.4p2 +REG esri:2207 0 0x1.ep4 0x0.0p0 +REG esri:2207 1 0x1.9p4 -0x1.4p2 +REG esri:2207 2 0x1.18p5 -0x1.4p2 +REG esri:2207 3 0x1.9p4 0x1.4p2 +REG esri:2207 4 0x1.18p5 0x1.4p2 +REG esri:2208 0 0x1.08p5 0x0.0p0 +REG esri:2208 1 0x1.cp4 -0x1.4p2 +REG esri:2208 2 0x1.3p5 -0x1.4p2 +REG esri:2208 3 0x1.cp4 0x1.4p2 +REG esri:2208 4 0x1.3p5 0x1.4p2 +REG esri:2209 0 0x1.2p5 0x0.0p0 +REG esri:2209 1 0x1.fp4 -0x1.4p2 +REG esri:2209 2 0x1.48p5 -0x1.4p2 +REG esri:2209 3 0x1.fp4 0x1.4p2 +REG esri:2209 4 0x1.48p5 0x1.4p2 +REG esri:22091 0 0x1.7p3 0x0.0p0 +REG esri:22091 1 0x1.ap2 -0x1.4p2 +REG esri:22091 2 0x1.08p4 -0x1.4p2 +REG esri:22091 3 0x1.ap2 0x1.4p2 +REG esri:22091 4 0x1.08p4 0x1.4p2 +REG esri:22092 0 0x1.8p3 0x0.0p0 +REG esri:22092 1 0x1.cp2 -0x1.4p2 +REG esri:22092 2 0x1.1p4 -0x1.4p2 +REG esri:22092 3 0x1.cp2 0x1.4p2 +REG esri:22092 4 0x1.1p4 0x1.4p2 +REG esri:2210 0 0x1.38p5 0x0.0p0 +REG esri:2210 1 0x1.1p5 -0x1.4p2 +REG esri:2210 2 0x1.6p5 -0x1.4p2 +REG esri:2210 3 0x1.1p5 0x1.4p2 +REG esri:2210 4 0x1.6p5 0x1.4p2 +REG esri:2211 0 0x1.5p5 0x0.0p0 +REG esri:2211 1 0x1.28p5 -0x1.4p2 +REG esri:2211 2 0x1.78p5 -0x1.4p2 +REG esri:2211 3 0x1.28p5 0x1.4p2 +REG esri:2211 4 0x1.78p5 0x1.4p2 +REG esri:2212 0 0x1.68p5 0x0.0p0 +REG esri:2212 1 0x1.4p5 -0x1.4p2 +REG esri:2212 2 0x1.9p5 -0x1.4p2 +REG esri:2212 3 0x1.4p5 0x1.4p2 +REG esri:2212 4 0x1.9p5 0x1.4p2 +REG esri:2213 0 0x1.ep4 0x0.0p0 +REG esri:2213 1 0x1.9p4 -0x1.4p2 +REG esri:2213 2 0x1.18p5 -0x1.4p2 +REG esri:2213 3 0x1.9p4 0x1.4p2 +REG esri:2213 4 0x1.18p5 0x1.4p2 +REG esri:2214 0 0x1.5p3 0x0.0p0 +REG esri:2214 1 0x1.6p2 -0x1.4p2 +REG esri:2214 2 0x1.fp3 -0x1.4p2 +REG esri:2214 3 0x1.6p2 0x1.4p2 +REG esri:2214 4 0x1.fp3 0x1.4p2 +REG esri:2215 0 0x1.2p3 0x0.0p0 +REG esri:2215 1 0x1.0p2 -0x1.4p2 +REG esri:2215 2 0x1.cp3 -0x1.4p2 +REG esri:2215 3 0x1.0p2 0x1.4p2 +REG esri:2215 4 0x1.cp3 0x1.4p2 +REG esri:2216 0 -0x1.98p5 0x0.0p0 +REG esri:2216 1 -0x1.cp5 -0x1.4p2 +REG esri:2216 2 -0x1.7p5 -0x1.4p2 +REG esri:2216 3 -0x1.cp5 0x1.4p2 +REG esri:2216 4 -0x1.7p5 0x1.4p2 +REG esri:2217 0 -0x1.68p5 0x0.0p0 +REG esri:2217 1 -0x1.9p5 -0x1.4p2 +REG esri:2217 2 -0x1.4p5 -0x1.4p2 +REG esri:2217 3 -0x1.9p5 0x1.4p2 +REG esri:2217 4 -0x1.4p5 0x1.4p2 +REG esri:2219 0 -0x1.14p6 0x0.0p0 +REG esri:2219 1 -0x1.28p6 -0x1.4p2 +REG esri:2219 2 -0x1.0p6 -0x1.4p2 +REG esri:2219 3 -0x1.28p6 0x1.4p2 +REG esri:2219 4 -0x1.0p6 0x1.4p2 +REG esri:22191 0 -0x1.2p6 -0x1.64p6 +REG esri:22191 1 -0x1.08p7 -0x1.64p6 +REG esri:22191 2 -0x1.8p3 -0x1.64p6 +REG esri:22191 3 -0x1.08p7 -0x1.54p6 +REG esri:22191 4 -0x1.8p3 -0x1.54p6 +REG esri:22192 0 -0x1.14p6 -0x1.64p6 +REG esri:22192 1 -0x1.02p7 -0x1.64p6 +REG esri:22192 2 -0x1.2p3 -0x1.64p6 +REG esri:22192 3 -0x1.02p7 -0x1.54p6 +REG esri:22192 4 -0x1.2p3 -0x1.54p6 +REG esri:22193 0 -0x1.08p6 -0x1.64p6 +REG esri:22193 1 -0x1.f8p6 -0x1.64p6 +REG esri:22193 2 -0x1.8p2 -0x1.64p6 +REG esri:22193 3 -0x1.f8p6 -0x1.54p6 +REG esri:22193 4 -0x1.8p2 -0x1.54p6 +REG esri:22194 0 -0x1.f8p5 -0x1.64p6 +REG esri:22194 1 -0x1.ecp6 -0x1.64p6 +REG esri:22194 2 -0x1.8p1 -0x1.64p6 +REG esri:22194 3 -0x1.ecp6 -0x1.54p6 +REG esri:22194 4 -0x1.8p1 -0x1.54p6 +REG esri:22195 0 -0x1.ep5 -0x1.64p6 +REG esri:22195 1 -0x1.ep6 -0x1.64p6 +REG esri:22195 2 0x0.0p0 -0x1.64p6 +REG esri:22195 3 -0x1.ep6 -0x1.54p6 +REG esri:22195 4 0x0.0p0 -0x1.54p6 +REG esri:22196 0 -0x1.c8p5 -0x1.64p6 +REG esri:22196 1 -0x1.d4p6 -0x1.64p6 +REG esri:22196 2 0x1.8p1 -0x1.64p6 +REG esri:22196 3 -0x1.d4p6 -0x1.54p6 +REG esri:22196 4 0x1.8p1 -0x1.54p6 +REG esri:22197 0 -0x1.bp5 -0x1.64p6 +REG esri:22197 1 -0x1.c8p6 -0x1.64p6 +REG esri:22197 2 0x1.8p2 -0x1.64p6 +REG esri:22197 3 -0x1.c8p6 -0x1.54p6 +REG esri:22197 4 0x1.8p2 -0x1.54p6 +REG esri:2220 0 -0x1.f8p5 0x0.0p0 +REG esri:2220 1 -0x1.1p6 -0x1.4p2 +REG esri:2220 2 -0x1.dp5 -0x1.4p2 +REG esri:2220 3 -0x1.1p6 0x1.4p2 +REG esri:2220 4 -0x1.dp5 0x1.4p2 +REG esri:2222 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:2222 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:2222 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:2222 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:2222 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:2223 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:2223 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:2223 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:2223 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:2223 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:22234 0 0x1.5p4 -0x1.9p4 +REG esri:22234 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:22234 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:22234 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:22234 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:22235 0 0x1.bp4 -0x1.9p4 +REG esri:22235 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:22235 2 0x1.042297030ae5dp5 -0x1.ep4 +REG esri:22235 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:22235 4 0x1.042297030ae5dp5 -0x1.4p4 +REG esri:22236 0 0x1.08p5 -0x1.9p4 +REG esri:22236 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:22236 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:22236 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:22236 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:2224 0 -0x1.c7p6 0x1.fp4 +REG esri:2224 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:2224 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:2224 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:2224 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:2225 0 -0x1.e8p6 0x1.44p5 +REG esri:2225 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:2225 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:2225 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:2225 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:2226 0 -0x1.e8p6 0x1.36p5 +REG esri:2226 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:2226 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:2226 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:2226 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:2227 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:2227 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:2227 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:2227 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:2227 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:2228 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:2228 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:2228 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:2228 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:2228 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:2229 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:2229 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:2229 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:2229 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:2229 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:2230 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:2230 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:2230 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:2230 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:2230 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:2231 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:2231 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:2231 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:2231 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:2231 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:2232 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:2232 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:2232 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:2232 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:2232 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:2233 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:2233 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:2233 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:2233 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:2233 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:22332 0 0x1.2p3 0x0.0p0 +REG esri:22332 1 0x1.0p2 -0x1.4p2 +REG esri:22332 2 0x1.cp3 -0x1.4p2 +REG esri:22332 3 0x1.0p2 0x1.4p2 +REG esri:22332 4 0x1.cp3 0x1.4p2 +REG esri:2234 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:2234 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:2234 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:2234 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:2234 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:2235 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:2235 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:2235 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:2235 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:2235 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:2236 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:2236 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:2236 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:2236 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:2236 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2237 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:2237 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:2237 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:2237 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:2237 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2238 0 -0x1.52p6 0x1.dep4 +REG esri:2238 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:2238 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:2238 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:2238 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:2239 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:2239 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:2239 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:2239 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:2239 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:22391 0 0x1.3cccccccccccdp3 0x1.2p5 +REG esri:22391 1 0x1.dc1dd293b6beep1 0x1.fp4 +REG esri:22391 2 0x1.0149127a55f4fp4 0x1.fp4 +REG esri:22391 3 0x1.dc1dd293b6beep1 0x1.48p5 +REG esri:22391 4 0x1.0149127a55f4fp4 0x1.48p5 +REG esri:22392 0 0x1.3cccccccccccdp3 0x1.0a66666666666p5 +REG esri:22392 1 0x1.f5792b2e61d7cp1 0x1.c4cccccccccccp4 +REG esri:22392 2 0x1.fc3b4ece0123bp3 0x1.c4cccccccccccp4 +REG esri:22392 3 0x1.f5792b2e61d7cp1 0x1.3266666666666p5 +REG esri:22392 4 0x1.fc3b4ece0123bp3 0x1.3266666666666p5 +REG esri:2240 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:2240 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:2240 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:2240 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:2240 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:2241 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:2241 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:2241 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:2241 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:2241 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:2242 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:2242 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:2242 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:2242 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:2242 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:2243 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:2243 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:2243 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:2243 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:2243 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:2244 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:2244 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:2244 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:2244 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:2244 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:2245 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:2245 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:2245 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:2245 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:2245 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:2246 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:2246 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:2246 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:2246 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:2246 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:2247 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:2247 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:2247 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:2247 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:2247 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:2248 0 -0x1.34p6 0x1.3477777777777p5 +REG esri:2248 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG esri:2248 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG esri:2248 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG esri:2248 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG esri:2249 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:2249 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:2249 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:2249 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:2249 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:2250 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:2250 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:2250 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:2250 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:2250 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:2251 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:2251 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:2251 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:2251 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:2251 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:2252 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG esri:2252 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG esri:2252 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG esri:2252 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG esri:2252 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG esri:22523 0 -0x1.68p5 -0x1.9p4 +REG esri:22523 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:22523 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:22523 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:22523 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:22524 0 -0x1.38p5 -0x1.9p4 +REG esri:22524 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:22524 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:22524 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:22524 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:2253 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG esri:2253 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG esri:2253 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG esri:2253 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG esri:2253 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG esri:2254 0 -0x1.6355555555555p6 0x1.d8p4 +REG esri:2254 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG esri:2254 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG esri:2254 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG esri:2254 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG esri:2255 0 -0x1.6955555555555p6 0x1.d8p4 +REG esri:2255 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG esri:2255 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG esri:2255 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG esri:2255 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG esri:2256 0 -0x1.b6p6 0x1.75p5 +REG esri:2256 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG esri:2256 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG esri:2256 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG esri:2256 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG esri:2257 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:2257 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:2257 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:2257 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:2257 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:2258 0 -0x1.a9p6 0x1.fp4 +REG esri:2258 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:2258 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:2258 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:2258 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:2259 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:2259 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:2259 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:2259 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:2259 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:2260 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:2260 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:2260 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:2260 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:2260 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:2261 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:2261 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:2261 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:2261 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:2261 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:2262 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:2262 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:2262 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:2262 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:2262 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:2263 0 -0x1.28p6 0x1.44cccccccccccp5 +REG esri:2263 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG esri:2263 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG esri:2263 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG esri:2263 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG esri:2264 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG esri:2264 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG esri:2264 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG esri:2264 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG esri:2264 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG esri:2265 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:2265 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:2265 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:2265 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:2265 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:2266 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:2266 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:2266 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:2266 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:2266 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:2267 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:2267 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:2267 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:2267 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:2267 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:2268 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:2268 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:2268 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:2268 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:2268 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:2269 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:2269 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:2269 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:2269 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:2269 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:2270 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:2270 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:2270 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:2270 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:2270 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:22700 0 0x1.2accccccccccdp5 0x1.1533333333333p5 +REG esri:22700 1 0x1.f45a283b2e20bp4 0x1.da66666666666p4 +REG esri:22700 2 0x1.5b6c857c02894p5 0x1.da66666666666p4 +REG esri:22700 3 0x1.f45a283b2e20bp4 0x1.3d33333333333p5 +REG esri:22700 4 0x1.5b6c857c02894p5 0x1.3d33333333333p5 +REG esri:2271 0 -0x1.37p6 0x1.4877777777777p5 +REG esri:2271 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG esri:2271 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG esri:2271 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG esri:2271 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG esri:2272 0 -0x1.37p6 0x1.4133333333334p5 +REG esri:2272 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG esri:2272 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG esri:2272 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG esri:2272 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG esri:2273 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG esri:2273 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG esri:2273 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG esri:2273 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG esri:2273 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG esri:2274 0 -0x1.58p6 0x1.1bp5 +REG esri:2274 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG esri:2274 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG esri:2274 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG esri:2274 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG esri:2275 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:2275 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:2275 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:2275 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:2275 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:2276 0 -0x1.8ap6 0x1.0688888888889p5 +REG esri:2276 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG esri:2276 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG esri:2276 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:2276 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:2277 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:2277 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:2277 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:2277 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:2277 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:22770 0 0x1.2accccccccccdp5 0x1.1533333333333p5 +REG esri:22770 1 0x1.f45a283b2e20bp4 0x1.da66666666666p4 +REG esri:22770 2 0x1.5b6c857c02894p5 0x1.da66666666666p4 +REG esri:22770 3 0x1.f45a283b2e20bp4 0x1.3d33333333333p5 +REG esri:22770 4 0x1.5b6c857c02894p5 0x1.3d33333333333p5 +REG esri:2278 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG esri:2278 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG esri:2278 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG esri:2278 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG esri:2278 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG esri:22780 0 0x1.3933333333333p5 0x1.119999999999ap5 +REG esri:22780 1 0x1.08d64d61eda3fp5 0x1.d333333333334p4 +REG esri:22780 2 0x1.6990190478c27p5 0x1.d333333333334p4 +REG esri:22780 3 0x1.08d64d61eda3fp5 0x1.399999999999ap5 +REG esri:22780 4 0x1.6990190478c27p5 0x1.399999999999ap5 +REG esri:2279 0 -0x1.8ap6 0x1.acp4 +REG esri:2279 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:2279 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:2279 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:2279 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:2280 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:2280 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:2280 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:2280 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:2280 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:2281 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:2281 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:2281 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:2281 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:2281 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:2282 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:2282 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:2282 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:2282 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:2282 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:2283 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:2283 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:2283 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:2283 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:2283 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:22832 0 0x1.2p3 0x0.0p0 +REG esri:22832 1 0x1.0p2 -0x1.4p2 +REG esri:22832 2 0x1.cp3 -0x1.4p2 +REG esri:22832 3 0x1.0p2 0x1.4p2 +REG esri:22832 4 0x1.cp3 0x1.4p2 +REG esri:2284 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:2284 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:2284 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:2284 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:2284 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:2285 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:2285 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:2285 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:2285 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:2285 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:2286 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:2286 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:2286 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:2286 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:2286 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:2287 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:2287 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:2287 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:2287 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:2287 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:2288 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:2288 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:2288 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:2288 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:2288 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:2289 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:2289 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:2289 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:2289 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:2289 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:2290 0 -0x1.f8p5 0x1.7ap5 +REG esri:2290 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG esri:2290 2 -0x1.bd129258af178p5 0x1.52p5 +REG esri:2290 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG esri:2290 4 -0x1.bd129258af178p5 0x1.a2p5 +REG esri:2291 0 -0x1.f8p5 0x1.7ap5 +REG esri:2291 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG esri:2291 2 -0x1.bd129258af178p5 0x1.52p5 +REG esri:2291 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG esri:2291 4 -0x1.bd129258af178p5 0x1.a2p5 +REG esri:2292 0 -0x1.f8p5 0x1.7ap5 +REG esri:2292 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG esri:2292 2 -0x1.bd129258af178p5 0x1.52p5 +REG esri:2292 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG esri:2292 4 -0x1.bd129258af178p5 0x1.a2p5 +REG esri:2294 0 -0x1.ecp5 0x0.0p0 +REG esri:2294 1 -0x1.0ap6 -0x1.4p2 +REG esri:2294 2 -0x1.c4p5 -0x1.4p2 +REG esri:2294 3 -0x1.0ap6 0x1.4p2 +REG esri:2294 4 -0x1.c4p5 0x1.4p2 +REG esri:2295 0 -0x1.02p6 0x0.0p0 +REG esri:2295 1 -0x1.16p6 -0x1.4p2 +REG esri:2295 2 -0x1.dcp5 -0x1.4p2 +REG esri:2295 3 -0x1.16p6 0x1.4p2 +REG esri:2295 4 -0x1.dcp5 0x1.4p2 +REG esri:22991 0 0x1.18p5 0x1.ep4 +REG esri:22991 1 0x1.d39fbba42f007p4 0x1.9p4 +REG esri:22991 2 0x1.4630222de87fcp5 0x1.9p4 +REG esri:22991 3 0x1.d39fbba42f007p4 0x1.18p5 +REG esri:22991 4 0x1.4630222de87fcp5 0x1.18p5 +REG esri:22992 0 0x1.fp4 0x1.ep4 +REG esri:22992 1 0x1.939fbba42f007p4 0x1.9p4 +REG esri:22992 2 0x1.2630222de87fcp5 0x1.9p4 +REG esri:22992 3 0x1.939fbba42f007p4 0x1.18p5 +REG esri:22992 4 0x1.2630222de87fcp5 0x1.18p5 +REG esri:22993 0 0x1.bp4 0x1.ep4 +REG esri:22993 1 0x1.539fbba42f007p4 0x1.9p4 +REG esri:22993 2 0x1.0630222de87fcp5 0x1.9p4 +REG esri:22993 3 0x1.539fbba42f007p4 0x1.18p5 +REG esri:22993 4 0x1.0630222de87fcp5 0x1.18p5 +REG esri:22994 0 0x1.bp4 0x1.ep4 +REG esri:22994 1 0x1.539fbba42f007p4 0x1.9p4 +REG esri:22994 2 0x1.0630222de87fcp5 0x1.9p4 +REG esri:22994 3 0x1.539fbba42f007p4 0x1.18p5 +REG esri:22994 4 0x1.0630222de87fcp5 0x1.18p5 +REG esri:23028 0 -0x1.ep3 0x0.0p0 +REG esri:23028 1 -0x1.4p4 -0x1.4p2 +REG esri:23028 2 -0x1.4p3 -0x1.4p2 +REG esri:23028 3 -0x1.4p4 0x1.4p2 +REG esri:23028 4 -0x1.4p3 0x1.4p2 +REG esri:23029 0 -0x1.2p3 0x0.0p0 +REG esri:23029 1 -0x1.cp3 -0x1.4p2 +REG esri:23029 2 -0x1.0p2 -0x1.4p2 +REG esri:23029 3 -0x1.cp3 0x1.4p2 +REG esri:23029 4 -0x1.0p2 0x1.4p2 +REG esri:23030 0 -0x1.8p1 0x0.0p0 +REG esri:23030 1 -0x1.0p3 -0x1.4p2 +REG esri:23030 2 0x1.0p1 -0x1.4p2 +REG esri:23030 3 -0x1.0p3 0x1.4p2 +REG esri:23030 4 0x1.0p1 0x1.4p2 +REG esri:23031 0 0x1.8p1 0x0.0p0 +REG esri:23031 1 -0x1.0p1 -0x1.4p2 +REG esri:23031 2 0x1.0p3 -0x1.4p2 +REG esri:23031 3 -0x1.0p1 0x1.4p2 +REG esri:23031 4 0x1.0p3 0x1.4p2 +REG esri:23032 0 0x1.2p3 0x0.0p0 +REG esri:23032 1 0x1.0p2 -0x1.4p2 +REG esri:23032 2 0x1.cp3 -0x1.4p2 +REG esri:23032 3 0x1.0p2 0x1.4p2 +REG esri:23032 4 0x1.cp3 0x1.4p2 +REG esri:23033 0 0x1.ep3 0x0.0p0 +REG esri:23033 1 0x1.4p3 -0x1.4p2 +REG esri:23033 2 0x1.4p4 -0x1.4p2 +REG esri:23033 3 0x1.4p3 0x1.4p2 +REG esri:23033 4 0x1.4p4 0x1.4p2 +REG esri:23034 0 0x1.5p4 0x0.0p0 +REG esri:23034 1 0x1.0p4 -0x1.4p2 +REG esri:23034 2 0x1.ap4 -0x1.4p2 +REG esri:23034 3 0x1.0p4 0x1.4p2 +REG esri:23034 4 0x1.ap4 0x1.4p2 +REG esri:23035 0 0x1.bp4 0x0.0p0 +REG esri:23035 1 0x1.6p4 -0x1.4p2 +REG esri:23035 2 0x1.0p5 -0x1.4p2 +REG esri:23035 3 0x1.6p4 0x1.4p2 +REG esri:23035 4 0x1.0p5 0x1.4p2 +REG esri:23036 0 0x1.08p5 0x0.0p0 +REG esri:23036 1 0x1.cp4 -0x1.4p2 +REG esri:23036 2 0x1.3p5 -0x1.4p2 +REG esri:23036 3 0x1.cp4 0x1.4p2 +REG esri:23036 4 0x1.3p5 0x1.4p2 +REG esri:23037 0 0x1.38p5 0x0.0p0 +REG esri:23037 1 0x1.1p5 -0x1.4p2 +REG esri:23037 2 0x1.6p5 -0x1.4p2 +REG esri:23037 3 0x1.1p5 0x1.4p2 +REG esri:23037 4 0x1.6p5 0x1.4p2 +REG esri:23038 0 0x1.68p5 0x0.0p0 +REG esri:23038 1 0x1.4p5 -0x1.4p2 +REG esri:23038 2 0x1.9p5 -0x1.4p2 +REG esri:23038 3 0x1.4p5 0x1.4p2 +REG esri:23038 4 0x1.9p5 0x1.4p2 +REG esri:2308 0 0x1.b4p6 0x0.0p0 +REG esri:2308 1 0x1.ap6 -0x1.4p2 +REG esri:2308 2 0x1.c8p6 -0x1.4p2 +REG esri:2308 3 0x1.ap6 0x1.4p2 +REG esri:2308 4 0x1.c8p6 0x1.4p2 +REG esri:2309 0 0x1.dp6 0x0.0p0 +REG esri:2309 1 0x1.bcp6 -0x1.4p2 +REG esri:2309 2 0x1.e4p6 -0x1.4p2 +REG esri:2309 3 0x1.bcp6 0x1.4p2 +REG esri:2309 4 0x1.e4p6 0x1.4p2 +REG esri:23090 0 0x0.0p0 0x0.0p0 +REG esri:23090 1 -0x1.4p2 -0x1.4p2 +REG esri:23090 2 0x1.4p2 -0x1.4p2 +REG esri:23090 3 -0x1.4p2 0x1.4p2 +REG esri:23090 4 0x1.4p2 0x1.4p2 +REG esri:23095 0 0x1.4p2 0x0.0p0 +REG esri:23095 1 0x0.0p0 -0x1.4p2 +REG esri:23095 2 0x1.4p3 -0x1.4p2 +REG esri:23095 3 0x0.0p0 0x1.4p2 +REG esri:23095 4 0x1.4p3 0x1.4p2 +REG esri:2310 0 0x1.08p7 0x0.0p0 +REG esri:2310 1 0x1.fcp6 -0x1.4p2 +REG esri:2310 2 0x1.12p7 -0x1.4p2 +REG esri:2310 3 0x1.fcp6 0x1.4p2 +REG esri:2310 4 0x1.12p7 0x1.4p2 +REG esri:2311 0 0x1.8p2 0x0.0p0 +REG esri:2311 1 0x1.0p0 -0x1.4p2 +REG esri:2311 2 0x1.6p3 -0x1.4p2 +REG esri:2311 3 0x1.0p0 0x1.4p2 +REG esri:2311 4 0x1.6p3 0x1.4p2 +REG esri:2312 0 0x1.ep3 0x0.0p0 +REG esri:2312 1 0x1.4p3 -0x1.4p2 +REG esri:2312 2 0x1.4p4 -0x1.4p2 +REG esri:2312 3 0x1.4p3 0x1.4p2 +REG esri:2312 4 0x1.4p4 0x1.4p2 +REG esri:2313 0 0x1.ep3 0x0.0p0 +REG esri:2313 1 0x1.4p3 -0x1.4p2 +REG esri:2313 2 0x1.4p4 -0x1.4p2 +REG esri:2313 3 0x1.4p3 0x1.4p2 +REG esri:2313 4 0x1.4p4 0x1.4p2 +REG esri:2314 0 -0x1.eaaaaaaaaaaacp5 0x1.4e22222222224p3 +REG esri:2314 1 -0x1.09ab8c7155973p6 0x1.5c44444444448p2 +REG esri:2314 2 -0x1.c1fe3c72aa271p5 0x1.5c44444444448p2 +REG esri:2314 3 -0x1.09ab8c7155973p6 0x1.ee22222222224p3 +REG esri:2314 4 -0x1.c1fe3c72aa271p5 0x1.ee22222222224p3 +REG esri:2315 0 -0x1.14p6 -0x1.9p4 +REG esri:2315 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:2315 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:2315 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:2315 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:2316 0 -0x1.f8p5 -0x1.9p4 +REG esri:2316 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:2316 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:2316 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:2316 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:2317 0 -0x1.08p6 0x1.8p2 +REG esri:2317 1 -0x1.2021d7c64dfb1p6 0x0.0p0 +REG esri:2317 2 -0x1.dfbc50736409ep5 0x0.0p0 +REG esri:2317 3 -0x1.2021d7c64dfb1p6 0x1.8p3 +REG esri:2317 4 -0x1.dfbc50736409ep5 0x1.8p3 +REG esri:2318 0 0x1.8p5 0x1.9p4 +REG esri:2318 1 0x1.f73075edbe9d4p4 0x1.4p3 +REG esri:2318 2 0x1.0233e2849058bp6 0x1.4p3 +REG esri:2318 3 0x1.f73075edbe9d4p4 0x1.4p5 +REG esri:2318 4 0x1.0233e2849058bp6 0x1.4p5 +REG esri:2319 0 0x1.bp4 0x0.0p0 +REG esri:2319 1 0x1.6p4 -0x1.4p2 +REG esri:2319 2 0x1.0p5 -0x1.4p2 +REG esri:2319 3 0x1.6p4 0x1.4p2 +REG esri:2319 4 0x1.0p5 0x1.4p2 +REG esri:2320 0 0x1.ep4 0x0.0p0 +REG esri:2320 1 0x1.9p4 -0x1.4p2 +REG esri:2320 2 0x1.18p5 -0x1.4p2 +REG esri:2320 3 0x1.9p4 0x1.4p2 +REG esri:2320 4 0x1.18p5 0x1.4p2 +REG esri:2321 0 0x1.08p5 0x0.0p0 +REG esri:2321 1 0x1.cp4 -0x1.4p2 +REG esri:2321 2 0x1.3p5 -0x1.4p2 +REG esri:2321 3 0x1.cp4 0x1.4p2 +REG esri:2321 4 0x1.3p5 0x1.4p2 +REG esri:2322 0 0x1.2p5 0x0.0p0 +REG esri:2322 1 0x1.fp4 -0x1.4p2 +REG esri:2322 2 0x1.48p5 -0x1.4p2 +REG esri:2322 3 0x1.fp4 0x1.4p2 +REG esri:2322 4 0x1.48p5 0x1.4p2 +REG esri:2323 0 0x1.38p5 0x0.0p0 +REG esri:2323 1 0x1.1p5 -0x1.4p2 +REG esri:2323 2 0x1.6p5 -0x1.4p2 +REG esri:2323 3 0x1.1p5 0x1.4p2 +REG esri:2323 4 0x1.6p5 0x1.4p2 +REG esri:23239 0 0x1.98p5 0x0.0p0 +REG esri:23239 1 0x1.7p5 -0x1.4p2 +REG esri:23239 2 0x1.cp5 -0x1.4p2 +REG esri:23239 3 0x1.7p5 0x1.4p2 +REG esri:23239 4 0x1.cp5 0x1.4p2 +REG esri:2324 0 0x1.5p5 0x0.0p0 +REG esri:2324 1 0x1.28p5 -0x1.4p2 +REG esri:2324 2 0x1.78p5 -0x1.4p2 +REG esri:2324 3 0x1.28p5 0x1.4p2 +REG esri:2324 4 0x1.78p5 0x1.4p2 +REG esri:23240 0 0x1.c8p5 0x0.0p0 +REG esri:23240 1 0x1.ap5 -0x1.4p2 +REG esri:23240 2 0x1.fp5 -0x1.4p2 +REG esri:23240 3 0x1.ap5 0x1.4p2 +REG esri:23240 4 0x1.fp5 0x1.4p2 +REG esri:2325 0 0x1.68p5 0x0.0p0 +REG esri:2325 1 0x1.4p5 -0x1.4p2 +REG esri:2325 2 0x1.9p5 -0x1.4p2 +REG esri:2325 3 0x1.4p5 0x1.4p2 +REG esri:2325 4 0x1.9p5 0x1.4p2 +REG esri:2326 0 0x1.c8b6d7447e859p6 0x1.64fe7f85aa87dp4 +REG esri:2326 1 0x1.b3187ac81cd3bp6 0x1.14fe7f85aa87dp4 +REG esri:2326 2 0x1.de5533c0e0377p6 0x1.14fe7f85aa87dp4 +REG esri:2326 3 0x1.b3187ac81cd3bp6 0x1.b4fe7f85aa87dp4 +REG esri:2326 4 0x1.de5533c0e0377p6 0x1.b4fe7f85aa87dp4 +REG esri:2327 0 0x1.2cp6 0x0.0p0 +REG esri:2327 1 0x1.18p6 -0x1.4p2 +REG esri:2327 2 0x1.4p6 -0x1.4p2 +REG esri:2327 3 0x1.18p6 0x1.4p2 +REG esri:2327 4 0x1.4p6 0x1.4p2 +REG esri:2328 0 0x1.44p6 0x0.0p0 +REG esri:2328 1 0x1.3p6 -0x1.4p2 +REG esri:2328 2 0x1.58p6 -0x1.4p2 +REG esri:2328 3 0x1.3p6 0x1.4p2 +REG esri:2328 4 0x1.58p6 0x1.4p2 +REG esri:2329 0 0x1.5cp6 0x0.0p0 +REG esri:2329 1 0x1.48p6 -0x1.4p2 +REG esri:2329 2 0x1.7p6 -0x1.4p2 +REG esri:2329 3 0x1.48p6 0x1.4p2 +REG esri:2329 4 0x1.7p6 0x1.4p2 +REG esri:2330 0 0x1.74p6 0x0.0p0 +REG esri:2330 1 0x1.6p6 -0x1.4p2 +REG esri:2330 2 0x1.88p6 -0x1.4p2 +REG esri:2330 3 0x1.6p6 0x1.4p2 +REG esri:2330 4 0x1.88p6 0x1.4p2 +REG esri:2331 0 0x1.8cp6 0x0.0p0 +REG esri:2331 1 0x1.78p6 -0x1.4p2 +REG esri:2331 2 0x1.ap6 -0x1.4p2 +REG esri:2331 3 0x1.78p6 0x1.4p2 +REG esri:2331 4 0x1.ap6 0x1.4p2 +REG esri:2332 0 0x1.a4p6 0x0.0p0 +REG esri:2332 1 0x1.9p6 -0x1.4p2 +REG esri:2332 2 0x1.b8p6 -0x1.4p2 +REG esri:2332 3 0x1.9p6 0x1.4p2 +REG esri:2332 4 0x1.b8p6 0x1.4p2 +REG esri:2333 0 0x1.bcp6 0x0.0p0 +REG esri:2333 1 0x1.a8p6 -0x1.4p2 +REG esri:2333 2 0x1.dp6 -0x1.4p2 +REG esri:2333 3 0x1.a8p6 0x1.4p2 +REG esri:2333 4 0x1.dp6 0x1.4p2 +REG esri:2334 0 0x1.d4p6 0x0.0p0 +REG esri:2334 1 0x1.cp6 -0x1.4p2 +REG esri:2334 2 0x1.e8p6 -0x1.4p2 +REG esri:2334 3 0x1.cp6 0x1.4p2 +REG esri:2334 4 0x1.e8p6 0x1.4p2 +REG esri:2335 0 0x1.ecp6 0x0.0p0 +REG esri:2335 1 0x1.d8p6 -0x1.4p2 +REG esri:2335 2 0x1.0p7 -0x1.4p2 +REG esri:2335 3 0x1.d8p6 0x1.4p2 +REG esri:2335 4 0x1.0p7 0x1.4p2 +REG esri:2336 0 0x1.02p7 0x0.0p0 +REG esri:2336 1 0x1.fp6 -0x1.4p2 +REG esri:2336 2 0x1.0cp7 -0x1.4p2 +REG esri:2336 3 0x1.fp6 0x1.4p2 +REG esri:2336 4 0x1.0cp7 0x1.4p2 +REG esri:2337 0 0x1.0ep7 0x0.0p0 +REG esri:2337 1 0x1.04p7 -0x1.4p2 +REG esri:2337 2 0x1.18p7 -0x1.4p2 +REG esri:2337 3 0x1.04p7 0x1.4p2 +REG esri:2337 4 0x1.18p7 0x1.4p2 +REG esri:2338 0 0x1.2cp6 0x0.0p0 +REG esri:2338 1 0x1.18p6 -0x1.4p2 +REG esri:2338 2 0x1.4p6 -0x1.4p2 +REG esri:2338 3 0x1.18p6 0x1.4p2 +REG esri:2338 4 0x1.4p6 0x1.4p2 +REG esri:2339 0 0x1.44p6 0x0.0p0 +REG esri:2339 1 0x1.3p6 -0x1.4p2 +REG esri:2339 2 0x1.58p6 -0x1.4p2 +REG esri:2339 3 0x1.3p6 0x1.4p2 +REG esri:2339 4 0x1.58p6 0x1.4p2 +REG esri:2340 0 0x1.5cp6 0x0.0p0 +REG esri:2340 1 0x1.48p6 -0x1.4p2 +REG esri:2340 2 0x1.7p6 -0x1.4p2 +REG esri:2340 3 0x1.48p6 0x1.4p2 +REG esri:2340 4 0x1.7p6 0x1.4p2 +REG esri:2341 0 0x1.74p6 0x0.0p0 +REG esri:2341 1 0x1.6p6 -0x1.4p2 +REG esri:2341 2 0x1.88p6 -0x1.4p2 +REG esri:2341 3 0x1.6p6 0x1.4p2 +REG esri:2341 4 0x1.88p6 0x1.4p2 +REG esri:2342 0 0x1.8cp6 0x0.0p0 +REG esri:2342 1 0x1.78p6 -0x1.4p2 +REG esri:2342 2 0x1.ap6 -0x1.4p2 +REG esri:2342 3 0x1.78p6 0x1.4p2 +REG esri:2342 4 0x1.ap6 0x1.4p2 +REG esri:2343 0 0x1.a4p6 0x0.0p0 +REG esri:2343 1 0x1.9p6 -0x1.4p2 +REG esri:2343 2 0x1.b8p6 -0x1.4p2 +REG esri:2343 3 0x1.9p6 0x1.4p2 +REG esri:2343 4 0x1.b8p6 0x1.4p2 +REG esri:23433 0 0x1.ep3 0x0.0p0 +REG esri:23433 1 0x1.4p3 -0x1.4p2 +REG esri:23433 2 0x1.4p4 -0x1.4p2 +REG esri:23433 3 0x1.4p3 0x1.4p2 +REG esri:23433 4 0x1.4p4 0x1.4p2 +REG esri:2344 0 0x1.bcp6 0x0.0p0 +REG esri:2344 1 0x1.a8p6 -0x1.4p2 +REG esri:2344 2 0x1.dp6 -0x1.4p2 +REG esri:2344 3 0x1.a8p6 0x1.4p2 +REG esri:2344 4 0x1.dp6 0x1.4p2 +REG esri:2345 0 0x1.d4p6 0x0.0p0 +REG esri:2345 1 0x1.cp6 -0x1.4p2 +REG esri:2345 2 0x1.e8p6 -0x1.4p2 +REG esri:2345 3 0x1.cp6 0x1.4p2 +REG esri:2345 4 0x1.e8p6 0x1.4p2 +REG esri:2346 0 0x1.ecp6 0x0.0p0 +REG esri:2346 1 0x1.d8p6 -0x1.4p2 +REG esri:2346 2 0x1.0p7 -0x1.4p2 +REG esri:2346 3 0x1.d8p6 0x1.4p2 +REG esri:2346 4 0x1.0p7 0x1.4p2 +REG esri:2347 0 0x1.02p7 0x0.0p0 +REG esri:2347 1 0x1.fp6 -0x1.4p2 +REG esri:2347 2 0x1.0cp7 -0x1.4p2 +REG esri:2347 3 0x1.fp6 0x1.4p2 +REG esri:2347 4 0x1.0cp7 0x1.4p2 +REG esri:2348 0 0x1.0ep7 0x0.0p0 +REG esri:2348 1 0x1.04p7 -0x1.4p2 +REG esri:2348 2 0x1.18p7 -0x1.4p2 +REG esri:2348 3 0x1.04p7 0x1.4p2 +REG esri:2348 4 0x1.18p7 0x1.4p2 +REG esri:2349 0 0x1.2cp6 0x0.0p0 +REG esri:2349 1 0x1.18p6 -0x1.4p2 +REG esri:2349 2 0x1.4p6 -0x1.4p2 +REG esri:2349 3 0x1.18p6 0x1.4p2 +REG esri:2349 4 0x1.4p6 0x1.4p2 +REG esri:2350 0 0x1.38p6 0x0.0p0 +REG esri:2350 1 0x1.24p6 -0x1.4p2 +REG esri:2350 2 0x1.4cp6 -0x1.4p2 +REG esri:2350 3 0x1.24p6 0x1.4p2 +REG esri:2350 4 0x1.4cp6 0x1.4p2 +REG esri:2351 0 0x1.44p6 0x0.0p0 +REG esri:2351 1 0x1.3p6 -0x1.4p2 +REG esri:2351 2 0x1.58p6 -0x1.4p2 +REG esri:2351 3 0x1.3p6 0x1.4p2 +REG esri:2351 4 0x1.58p6 0x1.4p2 +REG esri:2352 0 0x1.5p6 0x0.0p0 +REG esri:2352 1 0x1.3cp6 -0x1.4p2 +REG esri:2352 2 0x1.64p6 -0x1.4p2 +REG esri:2352 3 0x1.3cp6 0x1.4p2 +REG esri:2352 4 0x1.64p6 0x1.4p2 +REG esri:2353 0 0x1.5cp6 0x0.0p0 +REG esri:2353 1 0x1.48p6 -0x1.4p2 +REG esri:2353 2 0x1.7p6 -0x1.4p2 +REG esri:2353 3 0x1.48p6 0x1.4p2 +REG esri:2353 4 0x1.7p6 0x1.4p2 +REG esri:2354 0 0x1.68p6 0x0.0p0 +REG esri:2354 1 0x1.54p6 -0x1.4p2 +REG esri:2354 2 0x1.7cp6 -0x1.4p2 +REG esri:2354 3 0x1.54p6 0x1.4p2 +REG esri:2354 4 0x1.7cp6 0x1.4p2 +REG esri:2355 0 0x1.74p6 0x0.0p0 +REG esri:2355 1 0x1.6p6 -0x1.4p2 +REG esri:2355 2 0x1.88p6 -0x1.4p2 +REG esri:2355 3 0x1.6p6 0x1.4p2 +REG esri:2355 4 0x1.88p6 0x1.4p2 +REG esri:2356 0 0x1.8p6 0x0.0p0 +REG esri:2356 1 0x1.6cp6 -0x1.4p2 +REG esri:2356 2 0x1.94p6 -0x1.4p2 +REG esri:2356 3 0x1.6cp6 0x1.4p2 +REG esri:2356 4 0x1.94p6 0x1.4p2 +REG esri:2357 0 0x1.8cp6 0x0.0p0 +REG esri:2357 1 0x1.78p6 -0x1.4p2 +REG esri:2357 2 0x1.ap6 -0x1.4p2 +REG esri:2357 3 0x1.78p6 0x1.4p2 +REG esri:2357 4 0x1.ap6 0x1.4p2 +REG esri:2358 0 0x1.98p6 0x0.0p0 +REG esri:2358 1 0x1.84p6 -0x1.4p2 +REG esri:2358 2 0x1.acp6 -0x1.4p2 +REG esri:2358 3 0x1.84p6 0x1.4p2 +REG esri:2358 4 0x1.acp6 0x1.4p2 +REG esri:2359 0 0x1.a4p6 0x0.0p0 +REG esri:2359 1 0x1.9p6 -0x1.4p2 +REG esri:2359 2 0x1.b8p6 -0x1.4p2 +REG esri:2359 3 0x1.9p6 0x1.4p2 +REG esri:2359 4 0x1.b8p6 0x1.4p2 +REG esri:2360 0 0x1.bp6 0x0.0p0 +REG esri:2360 1 0x1.9cp6 -0x1.4p2 +REG esri:2360 2 0x1.c4p6 -0x1.4p2 +REG esri:2360 3 0x1.9cp6 0x1.4p2 +REG esri:2360 4 0x1.c4p6 0x1.4p2 +REG esri:2361 0 0x1.bcp6 0x0.0p0 +REG esri:2361 1 0x1.a8p6 -0x1.4p2 +REG esri:2361 2 0x1.dp6 -0x1.4p2 +REG esri:2361 3 0x1.a8p6 0x1.4p2 +REG esri:2361 4 0x1.dp6 0x1.4p2 +REG esri:2362 0 0x1.c8p6 0x0.0p0 +REG esri:2362 1 0x1.b4p6 -0x1.4p2 +REG esri:2362 2 0x1.dcp6 -0x1.4p2 +REG esri:2362 3 0x1.b4p6 0x1.4p2 +REG esri:2362 4 0x1.dcp6 0x1.4p2 +REG esri:2363 0 0x1.d4p6 0x0.0p0 +REG esri:2363 1 0x1.cp6 -0x1.4p2 +REG esri:2363 2 0x1.e8p6 -0x1.4p2 +REG esri:2363 3 0x1.cp6 0x1.4p2 +REG esri:2363 4 0x1.e8p6 0x1.4p2 +REG esri:2364 0 0x1.ep6 0x0.0p0 +REG esri:2364 1 0x1.ccp6 -0x1.4p2 +REG esri:2364 2 0x1.f4p6 -0x1.4p2 +REG esri:2364 3 0x1.ccp6 0x1.4p2 +REG esri:2364 4 0x1.f4p6 0x1.4p2 +REG esri:2365 0 0x1.ecp6 0x0.0p0 +REG esri:2365 1 0x1.d8p6 -0x1.4p2 +REG esri:2365 2 0x1.0p7 -0x1.4p2 +REG esri:2365 3 0x1.d8p6 0x1.4p2 +REG esri:2365 4 0x1.0p7 0x1.4p2 +REG esri:2366 0 0x1.f8p6 0x0.0p0 +REG esri:2366 1 0x1.e4p6 -0x1.4p2 +REG esri:2366 2 0x1.06p7 -0x1.4p2 +REG esri:2366 3 0x1.e4p6 0x1.4p2 +REG esri:2366 4 0x1.06p7 0x1.4p2 +REG esri:2367 0 0x1.02p7 0x0.0p0 +REG esri:2367 1 0x1.fp6 -0x1.4p2 +REG esri:2367 2 0x1.0cp7 -0x1.4p2 +REG esri:2367 3 0x1.fp6 0x1.4p2 +REG esri:2367 4 0x1.0cp7 0x1.4p2 +REG esri:2368 0 0x1.08p7 0x0.0p0 +REG esri:2368 1 0x1.fcp6 -0x1.4p2 +REG esri:2368 2 0x1.12p7 -0x1.4p2 +REG esri:2368 3 0x1.fcp6 0x1.4p2 +REG esri:2368 4 0x1.12p7 0x1.4p2 +REG esri:2369 0 0x1.0ep7 0x0.0p0 +REG esri:2369 1 0x1.04p7 -0x1.4p2 +REG esri:2369 2 0x1.18p7 -0x1.4p2 +REG esri:2369 3 0x1.04p7 0x1.4p2 +REG esri:2369 4 0x1.18p7 0x1.4p2 +REG esri:2370 0 0x1.2cp6 0x0.0p0 +REG esri:2370 1 0x1.18p6 -0x1.4p2 +REG esri:2370 2 0x1.4p6 -0x1.4p2 +REG esri:2370 3 0x1.18p6 0x1.4p2 +REG esri:2370 4 0x1.4p6 0x1.4p2 +REG esri:23700 0 0x1.30c6f3335106cp4 0x1.7927b7e555898p5 +REG esri:23700 1 0x1.765029a744904p3 0x1.5127b7e555898p5 +REG esri:23700 2 0x1.a665d192ffc56p4 0x1.5127b7e555898p5 +REG esri:23700 3 0x1.765029a744904p3 0x1.a127b7e555898p5 +REG esri:23700 4 0x1.a665d192ffc56p4 0x1.a127b7e555898p5 +REG esri:2371 0 0x1.38p6 0x0.0p0 +REG esri:2371 1 0x1.24p6 -0x1.4p2 +REG esri:2371 2 0x1.4cp6 -0x1.4p2 +REG esri:2371 3 0x1.24p6 0x1.4p2 +REG esri:2371 4 0x1.4cp6 0x1.4p2 +REG esri:2372 0 0x1.44p6 0x0.0p0 +REG esri:2372 1 0x1.3p6 -0x1.4p2 +REG esri:2372 2 0x1.58p6 -0x1.4p2 +REG esri:2372 3 0x1.3p6 0x1.4p2 +REG esri:2372 4 0x1.58p6 0x1.4p2 +REG esri:2373 0 0x1.5p6 0x0.0p0 +REG esri:2373 1 0x1.3cp6 -0x1.4p2 +REG esri:2373 2 0x1.64p6 -0x1.4p2 +REG esri:2373 3 0x1.3cp6 0x1.4p2 +REG esri:2373 4 0x1.64p6 0x1.4p2 +REG esri:2374 0 0x1.5cp6 0x0.0p0 +REG esri:2374 1 0x1.48p6 -0x1.4p2 +REG esri:2374 2 0x1.7p6 -0x1.4p2 +REG esri:2374 3 0x1.48p6 0x1.4p2 +REG esri:2374 4 0x1.7p6 0x1.4p2 +REG esri:2375 0 0x1.68p6 0x0.0p0 +REG esri:2375 1 0x1.54p6 -0x1.4p2 +REG esri:2375 2 0x1.7cp6 -0x1.4p2 +REG esri:2375 3 0x1.54p6 0x1.4p2 +REG esri:2375 4 0x1.7cp6 0x1.4p2 +REG esri:2376 0 0x1.74p6 0x0.0p0 +REG esri:2376 1 0x1.6p6 -0x1.4p2 +REG esri:2376 2 0x1.88p6 -0x1.4p2 +REG esri:2376 3 0x1.6p6 0x1.4p2 +REG esri:2376 4 0x1.88p6 0x1.4p2 +REG esri:2377 0 0x1.8p6 0x0.0p0 +REG esri:2377 1 0x1.6cp6 -0x1.4p2 +REG esri:2377 2 0x1.94p6 -0x1.4p2 +REG esri:2377 3 0x1.6cp6 0x1.4p2 +REG esri:2377 4 0x1.94p6 0x1.4p2 +REG esri:2378 0 0x1.8cp6 0x0.0p0 +REG esri:2378 1 0x1.78p6 -0x1.4p2 +REG esri:2378 2 0x1.ap6 -0x1.4p2 +REG esri:2378 3 0x1.78p6 0x1.4p2 +REG esri:2378 4 0x1.ap6 0x1.4p2 +REG esri:2379 0 0x1.98p6 0x0.0p0 +REG esri:2379 1 0x1.84p6 -0x1.4p2 +REG esri:2379 2 0x1.acp6 -0x1.4p2 +REG esri:2379 3 0x1.84p6 0x1.4p2 +REG esri:2379 4 0x1.acp6 0x1.4p2 +REG esri:2380 0 0x1.a4p6 0x0.0p0 +REG esri:2380 1 0x1.9p6 -0x1.4p2 +REG esri:2380 2 0x1.b8p6 -0x1.4p2 +REG esri:2380 3 0x1.9p6 0x1.4p2 +REG esri:2380 4 0x1.b8p6 0x1.4p2 +REG esri:2381 0 0x1.bp6 0x0.0p0 +REG esri:2381 1 0x1.9cp6 -0x1.4p2 +REG esri:2381 2 0x1.c4p6 -0x1.4p2 +REG esri:2381 3 0x1.9cp6 0x1.4p2 +REG esri:2381 4 0x1.c4p6 0x1.4p2 +REG esri:2382 0 0x1.bcp6 0x0.0p0 +REG esri:2382 1 0x1.a8p6 -0x1.4p2 +REG esri:2382 2 0x1.dp6 -0x1.4p2 +REG esri:2382 3 0x1.a8p6 0x1.4p2 +REG esri:2382 4 0x1.dp6 0x1.4p2 +REG esri:2383 0 0x1.c8p6 0x0.0p0 +REG esri:2383 1 0x1.b4p6 -0x1.4p2 +REG esri:2383 2 0x1.dcp6 -0x1.4p2 +REG esri:2383 3 0x1.b4p6 0x1.4p2 +REG esri:2383 4 0x1.dcp6 0x1.4p2 +REG esri:2384 0 0x1.d4p6 0x0.0p0 +REG esri:2384 1 0x1.cp6 -0x1.4p2 +REG esri:2384 2 0x1.e8p6 -0x1.4p2 +REG esri:2384 3 0x1.cp6 0x1.4p2 +REG esri:2384 4 0x1.e8p6 0x1.4p2 +REG esri:23846 0 0x1.74p6 0x0.0p0 +REG esri:23846 1 0x1.6p6 -0x1.4p2 +REG esri:23846 2 0x1.88p6 -0x1.4p2 +REG esri:23846 3 0x1.6p6 0x1.4p2 +REG esri:23846 4 0x1.88p6 0x1.4p2 +REG esri:23847 0 0x1.8cp6 0x0.0p0 +REG esri:23847 1 0x1.78p6 -0x1.4p2 +REG esri:23847 2 0x1.ap6 -0x1.4p2 +REG esri:23847 3 0x1.78p6 0x1.4p2 +REG esri:23847 4 0x1.ap6 0x1.4p2 +REG esri:23848 0 0x1.a4p6 0x0.0p0 +REG esri:23848 1 0x1.9p6 -0x1.4p2 +REG esri:23848 2 0x1.b8p6 -0x1.4p2 +REG esri:23848 3 0x1.9p6 0x1.4p2 +REG esri:23848 4 0x1.b8p6 0x1.4p2 +REG esri:23849 0 0x1.bcp6 0x0.0p0 +REG esri:23849 1 0x1.a8p6 -0x1.4p2 +REG esri:23849 2 0x1.dp6 -0x1.4p2 +REG esri:23849 3 0x1.a8p6 0x1.4p2 +REG esri:23849 4 0x1.dp6 0x1.4p2 +REG esri:2385 0 0x1.ep6 0x0.0p0 +REG esri:2385 1 0x1.ccp6 -0x1.4p2 +REG esri:2385 2 0x1.f4p6 -0x1.4p2 +REG esri:2385 3 0x1.ccp6 0x1.4p2 +REG esri:2385 4 0x1.f4p6 0x1.4p2 +REG esri:23850 0 0x1.d4p6 0x0.0p0 +REG esri:23850 1 0x1.cp6 -0x1.4p2 +REG esri:23850 2 0x1.e8p6 -0x1.4p2 +REG esri:23850 3 0x1.cp6 0x1.4p2 +REG esri:23850 4 0x1.e8p6 0x1.4p2 +REG esri:23851 0 0x1.ecp6 0x0.0p0 +REG esri:23851 1 0x1.d8p6 -0x1.4p2 +REG esri:23851 2 0x1.0p7 -0x1.4p2 +REG esri:23851 3 0x1.d8p6 0x1.4p2 +REG esri:23851 4 0x1.0p7 0x1.4p2 +REG esri:23852 0 0x1.02p7 0x0.0p0 +REG esri:23852 1 0x1.fp6 -0x1.4p2 +REG esri:23852 2 0x1.0cp7 -0x1.4p2 +REG esri:23852 3 0x1.fp6 0x1.4p2 +REG esri:23852 4 0x1.0cp7 0x1.4p2 +REG esri:23853 0 0x1.0ep7 0x0.0p0 +REG esri:23853 1 0x1.04p7 -0x1.4p2 +REG esri:23853 2 0x1.18p7 -0x1.4p2 +REG esri:23853 3 0x1.04p7 0x1.4p2 +REG esri:23853 4 0x1.18p7 0x1.4p2 +REG esri:2386 0 0x1.ecp6 0x0.0p0 +REG esri:2386 1 0x1.d8p6 -0x1.4p2 +REG esri:2386 2 0x1.0p7 -0x1.4p2 +REG esri:2386 3 0x1.d8p6 0x1.4p2 +REG esri:2386 4 0x1.0p7 0x1.4p2 +REG esri:2387 0 0x1.f8p6 0x0.0p0 +REG esri:2387 1 0x1.e4p6 -0x1.4p2 +REG esri:2387 2 0x1.06p7 -0x1.4p2 +REG esri:2387 3 0x1.e4p6 0x1.4p2 +REG esri:2387 4 0x1.06p7 0x1.4p2 +REG esri:2388 0 0x1.02p7 0x0.0p0 +REG esri:2388 1 0x1.fp6 -0x1.4p2 +REG esri:2388 2 0x1.0cp7 -0x1.4p2 +REG esri:2388 3 0x1.fp6 0x1.4p2 +REG esri:2388 4 0x1.0cp7 0x1.4p2 +REG esri:23886 0 0x1.74p6 -0x1.9p4 +REG esri:23886 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:23886 2 0x1.8a114b818572ep6 -0x1.ep4 +REG esri:23886 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:23886 4 0x1.8a114b818572ep6 -0x1.4p4 +REG esri:23887 0 0x1.8cp6 -0x1.9p4 +REG esri:23887 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:23887 2 0x1.a2114b818572ep6 -0x1.ep4 +REG esri:23887 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:23887 4 0x1.a2114b818572ep6 -0x1.4p4 +REG esri:23888 0 0x1.a4p6 -0x1.9p4 +REG esri:23888 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:23888 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:23888 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:23888 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:23889 0 0x1.bcp6 -0x1.9p4 +REG esri:23889 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:23889 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:23889 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:23889 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:2389 0 0x1.08p7 0x0.0p0 +REG esri:2389 1 0x1.fcp6 -0x1.4p2 +REG esri:2389 2 0x1.12p7 -0x1.4p2 +REG esri:2389 3 0x1.fcp6 0x1.4p2 +REG esri:2389 4 0x1.12p7 0x1.4p2 +REG esri:23890 0 0x1.d4p6 -0x1.9p4 +REG esri:23890 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:23890 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:23890 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:23890 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:23891 0 0x1.ecp6 -0x1.9p4 +REG esri:23891 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:23891 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:23891 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:23891 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:23892 0 0x1.02p7 -0x1.9p4 +REG esri:23892 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:23892 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:23892 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:23892 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:23893 0 0x1.0ep7 -0x1.9p4 +REG esri:23893 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:23893 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:23893 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:23893 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:23894 0 0x1.1ap7 -0x1.9p4 +REG esri:23894 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:23894 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:23894 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:23894 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:2390 0 0x1.0ep7 0x0.0p0 +REG esri:2390 1 0x1.04p7 -0x1.4p2 +REG esri:2390 2 0x1.18p7 -0x1.4p2 +REG esri:2390 3 0x1.04p7 0x1.4p2 +REG esri:2390 4 0x1.18p7 0x1.4p2 +REG esri:2391 0 0x1.5p4 0x0.0p0 +REG esri:2391 1 0x1.0p4 -0x1.4p2 +REG esri:2391 2 0x1.ap4 -0x1.4p2 +REG esri:2391 3 0x1.0p4 0x1.4p2 +REG esri:2391 4 0x1.ap4 0x1.4p2 +REG esri:2392 0 0x1.8p4 0x0.0p0 +REG esri:2392 1 0x1.3p4 -0x1.4p2 +REG esri:2392 2 0x1.dp4 -0x1.4p2 +REG esri:2392 3 0x1.3p4 0x1.4p2 +REG esri:2392 4 0x1.dp4 0x1.4p2 +REG esri:2393 0 0x1.bp4 0x0.0p0 +REG esri:2393 1 0x1.6p4 -0x1.4p2 +REG esri:2393 2 0x1.0p5 -0x1.4p2 +REG esri:2393 3 0x1.6p4 0x1.4p2 +REG esri:2393 4 0x1.0p5 0x1.4p2 +REG esri:2394 0 0x1.ep4 0x0.0p0 +REG esri:2394 1 0x1.9p4 -0x1.4p2 +REG esri:2394 2 0x1.18p5 -0x1.4p2 +REG esri:2394 3 0x1.9p4 0x1.4p2 +REG esri:2394 4 0x1.18p5 0x1.4p2 +REG esri:23946 0 0x1.74p6 0x0.0p0 +REG esri:23946 1 0x1.6p6 -0x1.4p2 +REG esri:23946 2 0x1.88p6 -0x1.4p2 +REG esri:23946 3 0x1.6p6 0x1.4p2 +REG esri:23946 4 0x1.88p6 0x1.4p2 +REG esri:23947 0 0x1.8cp6 0x0.0p0 +REG esri:23947 1 0x1.78p6 -0x1.4p2 +REG esri:23947 2 0x1.ap6 -0x1.4p2 +REG esri:23947 3 0x1.78p6 0x1.4p2 +REG esri:23947 4 0x1.ap6 0x1.4p2 +REG esri:23948 0 0x1.a4p6 0x0.0p0 +REG esri:23948 1 0x1.9p6 -0x1.4p2 +REG esri:23948 2 0x1.b8p6 -0x1.4p2 +REG esri:23948 3 0x1.9p6 0x1.4p2 +REG esri:23948 4 0x1.b8p6 0x1.4p2 +REG esri:2395 0 0x1.68p5 0x0.0p0 +REG esri:2395 1 0x1.4p5 -0x1.4p2 +REG esri:2395 2 0x1.9p5 -0x1.4p2 +REG esri:2395 3 0x1.4p5 0x1.4p2 +REG esri:2395 4 0x1.9p5 0x1.4p2 +REG esri:2396 0 0x1.98p5 0x0.0p0 +REG esri:2396 1 0x1.7p5 -0x1.4p2 +REG esri:2396 2 0x1.cp5 -0x1.4p2 +REG esri:2396 3 0x1.7p5 0x1.4p2 +REG esri:2396 4 0x1.cp5 0x1.4p2 +REG esri:2397 0 0x1.2p3 0x0.0p0 +REG esri:2397 1 0x1.0p2 -0x1.4p2 +REG esri:2397 2 0x1.cp3 -0x1.4p2 +REG esri:2397 3 0x1.0p2 0x1.4p2 +REG esri:2397 4 0x1.cp3 0x1.4p2 +REG esri:2398 0 0x1.8p3 0x0.0p0 +REG esri:2398 1 0x1.cp2 -0x1.4p2 +REG esri:2398 2 0x1.1p4 -0x1.4p2 +REG esri:2398 3 0x1.cp2 0x1.4p2 +REG esri:2398 4 0x1.1p4 0x1.4p2 +REG esri:2399 0 0x1.ep3 0x0.0p0 +REG esri:2399 1 0x1.4p3 -0x1.4p2 +REG esri:2399 2 0x1.4p4 -0x1.4p2 +REG esri:2399 3 0x1.4p3 0x1.4p2 +REG esri:2399 4 0x1.4p4 0x1.4p2 +REG esri:2400 0 0x1.f9dd695bb473bp3 0x0.0p0 +REG esri:2400 1 0x1.59dd695bb473bp3 -0x1.4p2 +REG esri:2400 2 0x1.4ceeb4adda39ep4 -0x1.4p2 +REG esri:2400 3 0x1.59dd695bb473bp3 0x1.4p2 +REG esri:2400 4 0x1.4ceeb4adda39ep4 0x1.4p2 +REG esri:2401 0 0x1.2cp6 0x0.0p0 +REG esri:2401 1 0x1.18p6 -0x1.4p2 +REG esri:2401 2 0x1.4p6 -0x1.4p2 +REG esri:2401 3 0x1.18p6 0x1.4p2 +REG esri:2401 4 0x1.4p6 0x1.4p2 +REG esri:2402 0 0x1.38p6 0x0.0p0 +REG esri:2402 1 0x1.24p6 -0x1.4p2 +REG esri:2402 2 0x1.4cp6 -0x1.4p2 +REG esri:2402 3 0x1.24p6 0x1.4p2 +REG esri:2402 4 0x1.4cp6 0x1.4p2 +REG esri:2403 0 0x1.44p6 0x0.0p0 +REG esri:2403 1 0x1.3p6 -0x1.4p2 +REG esri:2403 2 0x1.58p6 -0x1.4p2 +REG esri:2403 3 0x1.3p6 0x1.4p2 +REG esri:2403 4 0x1.58p6 0x1.4p2 +REG esri:2404 0 0x1.5p6 0x0.0p0 +REG esri:2404 1 0x1.3cp6 -0x1.4p2 +REG esri:2404 2 0x1.64p6 -0x1.4p2 +REG esri:2404 3 0x1.3cp6 0x1.4p2 +REG esri:2404 4 0x1.64p6 0x1.4p2 +REG esri:24047 0 0x1.8cp6 0x0.0p0 +REG esri:24047 1 0x1.78p6 -0x1.4p2 +REG esri:24047 2 0x1.ap6 -0x1.4p2 +REG esri:24047 3 0x1.78p6 0x1.4p2 +REG esri:24047 4 0x1.ap6 0x1.4p2 +REG esri:24048 0 0x1.a4p6 0x0.0p0 +REG esri:24048 1 0x1.9p6 -0x1.4p2 +REG esri:24048 2 0x1.b8p6 -0x1.4p2 +REG esri:24048 3 0x1.9p6 0x1.4p2 +REG esri:24048 4 0x1.b8p6 0x1.4p2 +REG esri:2405 0 0x1.5cp6 0x0.0p0 +REG esri:2405 1 0x1.48p6 -0x1.4p2 +REG esri:2405 2 0x1.7p6 -0x1.4p2 +REG esri:2405 3 0x1.48p6 0x1.4p2 +REG esri:2405 4 0x1.7p6 0x1.4p2 +REG esri:2406 0 0x1.68p6 0x0.0p0 +REG esri:2406 1 0x1.54p6 -0x1.4p2 +REG esri:2406 2 0x1.7cp6 -0x1.4p2 +REG esri:2406 3 0x1.54p6 0x1.4p2 +REG esri:2406 4 0x1.7cp6 0x1.4p2 +REG esri:2407 0 0x1.74p6 0x0.0p0 +REG esri:2407 1 0x1.6p6 -0x1.4p2 +REG esri:2407 2 0x1.88p6 -0x1.4p2 +REG esri:2407 3 0x1.6p6 0x1.4p2 +REG esri:2407 4 0x1.88p6 0x1.4p2 +REG esri:2408 0 0x1.8p6 0x0.0p0 +REG esri:2408 1 0x1.6cp6 -0x1.4p2 +REG esri:2408 2 0x1.94p6 -0x1.4p2 +REG esri:2408 3 0x1.6cp6 0x1.4p2 +REG esri:2408 4 0x1.94p6 0x1.4p2 +REG esri:2409 0 0x1.8cp6 0x0.0p0 +REG esri:2409 1 0x1.78p6 -0x1.4p2 +REG esri:2409 2 0x1.ap6 -0x1.4p2 +REG esri:2409 3 0x1.78p6 0x1.4p2 +REG esri:2409 4 0x1.ap6 0x1.4p2 +REG esri:2410 0 0x1.98p6 0x0.0p0 +REG esri:2410 1 0x1.84p6 -0x1.4p2 +REG esri:2410 2 0x1.acp6 -0x1.4p2 +REG esri:2410 3 0x1.84p6 0x1.4p2 +REG esri:2410 4 0x1.acp6 0x1.4p2 +REG esri:24100 0 -0x1.34p6 0x1.2p4 +REG esri:24100 1 -0x1.49077c9109a7dp6 0x1.ap3 +REG esri:24100 2 -0x1.1ef8836ef6583p6 0x1.ap3 +REG esri:24100 3 -0x1.49077c9109a7dp6 0x1.7p4 +REG esri:24100 4 -0x1.1ef8836ef6583p6 0x1.7p4 +REG esri:2411 0 0x1.a4p6 0x0.0p0 +REG esri:2411 1 0x1.9p6 -0x1.4p2 +REG esri:2411 2 0x1.b8p6 -0x1.4p2 +REG esri:2411 3 0x1.9p6 0x1.4p2 +REG esri:2411 4 0x1.b8p6 0x1.4p2 +REG esri:2412 0 0x1.bp6 0x0.0p0 +REG esri:2412 1 0x1.9cp6 -0x1.4p2 +REG esri:2412 2 0x1.c4p6 -0x1.4p2 +REG esri:2412 3 0x1.9cp6 0x1.4p2 +REG esri:2412 4 0x1.c4p6 0x1.4p2 +REG esri:2413 0 0x1.bcp6 0x0.0p0 +REG esri:2413 1 0x1.a8p6 -0x1.4p2 +REG esri:2413 2 0x1.dp6 -0x1.4p2 +REG esri:2413 3 0x1.a8p6 0x1.4p2 +REG esri:2413 4 0x1.dp6 0x1.4p2 +REG esri:2414 0 0x1.c8p6 0x0.0p0 +REG esri:2414 1 0x1.b4p6 -0x1.4p2 +REG esri:2414 2 0x1.dcp6 -0x1.4p2 +REG esri:2414 3 0x1.b4p6 0x1.4p2 +REG esri:2414 4 0x1.dcp6 0x1.4p2 +REG esri:2415 0 0x1.d4p6 0x0.0p0 +REG esri:2415 1 0x1.cp6 -0x1.4p2 +REG esri:2415 2 0x1.e8p6 -0x1.4p2 +REG esri:2415 3 0x1.cp6 0x1.4p2 +REG esri:2415 4 0x1.e8p6 0x1.4p2 +REG esri:2416 0 0x1.ep6 0x0.0p0 +REG esri:2416 1 0x1.ccp6 -0x1.4p2 +REG esri:2416 2 0x1.f4p6 -0x1.4p2 +REG esri:2416 3 0x1.ccp6 0x1.4p2 +REG esri:2416 4 0x1.f4p6 0x1.4p2 +REG esri:2417 0 0x1.ecp6 0x0.0p0 +REG esri:2417 1 0x1.d8p6 -0x1.4p2 +REG esri:2417 2 0x1.0p7 -0x1.4p2 +REG esri:2417 3 0x1.d8p6 0x1.4p2 +REG esri:2417 4 0x1.0p7 0x1.4p2 +REG esri:2418 0 0x1.f8p6 0x0.0p0 +REG esri:2418 1 0x1.e4p6 -0x1.4p2 +REG esri:2418 2 0x1.06p7 -0x1.4p2 +REG esri:2418 3 0x1.e4p6 0x1.4p2 +REG esri:2418 4 0x1.06p7 0x1.4p2 +REG esri:2419 0 0x1.02p7 0x0.0p0 +REG esri:2419 1 0x1.fp6 -0x1.4p2 +REG esri:2419 2 0x1.0cp7 -0x1.4p2 +REG esri:2419 3 0x1.fp6 0x1.4p2 +REG esri:2419 4 0x1.0cp7 0x1.4p2 +REG esri:2420 0 0x1.08p7 0x0.0p0 +REG esri:2420 1 0x1.fcp6 -0x1.4p2 +REG esri:2420 2 0x1.12p7 -0x1.4p2 +REG esri:2420 3 0x1.fcp6 0x1.4p2 +REG esri:2420 4 0x1.12p7 0x1.4p2 +REG esri:24200 0 -0x1.34p6 0x1.2p4 +REG esri:24200 1 -0x1.49077c9109a7dp6 0x1.ap3 +REG esri:24200 2 -0x1.1ef8836ef6583p6 0x1.ap3 +REG esri:24200 3 -0x1.49077c9109a7dp6 0x1.7p4 +REG esri:24200 4 -0x1.1ef8836ef6583p6 0x1.7p4 +REG esri:2421 0 0x1.0ep7 0x0.0p0 +REG esri:2421 1 0x1.04p7 -0x1.4p2 +REG esri:2421 2 0x1.18p7 -0x1.4p2 +REG esri:2421 3 0x1.04p7 0x1.4p2 +REG esri:2421 4 0x1.18p7 0x1.4p2 +REG esri:2422 0 0x1.2cp6 0x0.0p0 +REG esri:2422 1 0x1.18p6 -0x1.4p2 +REG esri:2422 2 0x1.4p6 -0x1.4p2 +REG esri:2422 3 0x1.18p6 0x1.4p2 +REG esri:2422 4 0x1.4p6 0x1.4p2 +REG esri:2423 0 0x1.38p6 0x0.0p0 +REG esri:2423 1 0x1.24p6 -0x1.4p2 +REG esri:2423 2 0x1.4cp6 -0x1.4p2 +REG esri:2423 3 0x1.24p6 0x1.4p2 +REG esri:2423 4 0x1.4cp6 0x1.4p2 +REG esri:2424 0 0x1.44p6 0x0.0p0 +REG esri:2424 1 0x1.3p6 -0x1.4p2 +REG esri:2424 2 0x1.58p6 -0x1.4p2 +REG esri:2424 3 0x1.3p6 0x1.4p2 +REG esri:2424 4 0x1.58p6 0x1.4p2 +REG esri:2425 0 0x1.5p6 0x0.0p0 +REG esri:2425 1 0x1.3cp6 -0x1.4p2 +REG esri:2425 2 0x1.64p6 -0x1.4p2 +REG esri:2425 3 0x1.3cp6 0x1.4p2 +REG esri:2425 4 0x1.64p6 0x1.4p2 +REG esri:2426 0 0x1.5cp6 0x0.0p0 +REG esri:2426 1 0x1.48p6 -0x1.4p2 +REG esri:2426 2 0x1.7p6 -0x1.4p2 +REG esri:2426 3 0x1.48p6 0x1.4p2 +REG esri:2426 4 0x1.7p6 0x1.4p2 +REG esri:2427 0 0x1.68p6 0x0.0p0 +REG esri:2427 1 0x1.54p6 -0x1.4p2 +REG esri:2427 2 0x1.7cp6 -0x1.4p2 +REG esri:2427 3 0x1.54p6 0x1.4p2 +REG esri:2427 4 0x1.7cp6 0x1.4p2 +REG esri:2428 0 0x1.74p6 0x0.0p0 +REG esri:2428 1 0x1.6p6 -0x1.4p2 +REG esri:2428 2 0x1.88p6 -0x1.4p2 +REG esri:2428 3 0x1.6p6 0x1.4p2 +REG esri:2428 4 0x1.88p6 0x1.4p2 +REG esri:2429 0 0x1.8p6 0x0.0p0 +REG esri:2429 1 0x1.6cp6 -0x1.4p2 +REG esri:2429 2 0x1.94p6 -0x1.4p2 +REG esri:2429 3 0x1.6cp6 0x1.4p2 +REG esri:2429 4 0x1.94p6 0x1.4p2 +REG esri:2430 0 0x1.8cp6 0x0.0p0 +REG esri:2430 1 0x1.78p6 -0x1.4p2 +REG esri:2430 2 0x1.ap6 -0x1.4p2 +REG esri:2430 3 0x1.78p6 0x1.4p2 +REG esri:2430 4 0x1.ap6 0x1.4p2 +REG esri:24305 0 0x1.5cp6 0x0.0p0 +REG esri:24305 1 0x1.48p6 -0x1.4p2 +REG esri:24305 2 0x1.7p6 -0x1.4p2 +REG esri:24305 3 0x1.48p6 0x1.4p2 +REG esri:24305 4 0x1.7p6 0x1.4p2 +REG esri:24306 0 0x1.74p6 0x0.0p0 +REG esri:24306 1 0x1.6p6 -0x1.4p2 +REG esri:24306 2 0x1.88p6 -0x1.4p2 +REG esri:24306 3 0x1.6p6 0x1.4p2 +REG esri:24306 4 0x1.88p6 0x1.4p2 +REG esri:2431 0 0x1.98p6 0x0.0p0 +REG esri:2431 1 0x1.84p6 -0x1.4p2 +REG esri:2431 2 0x1.acp6 -0x1.4p2 +REG esri:2431 3 0x1.84p6 0x1.4p2 +REG esri:2431 4 0x1.acp6 0x1.4p2 +REG esri:24311 0 0x1.f8p5 0x0.0p0 +REG esri:24311 1 0x1.dp5 -0x1.4p2 +REG esri:24311 2 0x1.1p6 -0x1.4p2 +REG esri:24311 3 0x1.dp5 0x1.4p2 +REG esri:24311 4 0x1.1p6 0x1.4p2 +REG esri:24312 0 0x1.14p6 0x0.0p0 +REG esri:24312 1 0x1.0p6 -0x1.4p2 +REG esri:24312 2 0x1.28p6 -0x1.4p2 +REG esri:24312 3 0x1.0p6 0x1.4p2 +REG esri:24312 4 0x1.28p6 0x1.4p2 +REG esri:24313 0 0x1.2cp6 0x0.0p0 +REG esri:24313 1 0x1.18p6 -0x1.4p2 +REG esri:24313 2 0x1.4p6 -0x1.4p2 +REG esri:24313 3 0x1.18p6 0x1.4p2 +REG esri:24313 4 0x1.4p6 0x1.4p2 +REG esri:2432 0 0x1.a4p6 0x0.0p0 +REG esri:2432 1 0x1.9p6 -0x1.4p2 +REG esri:2432 2 0x1.b8p6 -0x1.4p2 +REG esri:2432 3 0x1.9p6 0x1.4p2 +REG esri:2432 4 0x1.b8p6 0x1.4p2 +REG esri:2433 0 0x1.bp6 0x0.0p0 +REG esri:2433 1 0x1.9cp6 -0x1.4p2 +REG esri:2433 2 0x1.c4p6 -0x1.4p2 +REG esri:2433 3 0x1.9cp6 0x1.4p2 +REG esri:2433 4 0x1.c4p6 0x1.4p2 +REG esri:2434 0 0x1.bcp6 0x0.0p0 +REG esri:2434 1 0x1.a8p6 -0x1.4p2 +REG esri:2434 2 0x1.dp6 -0x1.4p2 +REG esri:2434 3 0x1.a8p6 0x1.4p2 +REG esri:2434 4 0x1.dp6 0x1.4p2 +REG esri:24342 0 0x1.14p6 0x0.0p0 +REG esri:24342 1 0x1.0p6 -0x1.4p2 +REG esri:24342 2 0x1.28p6 -0x1.4p2 +REG esri:24342 3 0x1.0p6 0x1.4p2 +REG esri:24342 4 0x1.28p6 0x1.4p2 +REG esri:24343 0 0x1.2cp6 0x0.0p0 +REG esri:24343 1 0x1.18p6 -0x1.4p2 +REG esri:24343 2 0x1.4p6 -0x1.4p2 +REG esri:24343 3 0x1.18p6 0x1.4p2 +REG esri:24343 4 0x1.4p6 0x1.4p2 +REG esri:24344 0 0x1.44p6 0x0.0p0 +REG esri:24344 1 0x1.3p6 -0x1.4p2 +REG esri:24344 2 0x1.58p6 -0x1.4p2 +REG esri:24344 3 0x1.3p6 0x1.4p2 +REG esri:24344 4 0x1.58p6 0x1.4p2 +REG esri:24345 0 0x1.5cp6 0x0.0p0 +REG esri:24345 1 0x1.48p6 -0x1.4p2 +REG esri:24345 2 0x1.7p6 -0x1.4p2 +REG esri:24345 3 0x1.48p6 0x1.4p2 +REG esri:24345 4 0x1.7p6 0x1.4p2 +REG esri:24346 0 0x1.74p6 0x0.0p0 +REG esri:24346 1 0x1.6p6 -0x1.4p2 +REG esri:24346 2 0x1.88p6 -0x1.4p2 +REG esri:24346 3 0x1.6p6 0x1.4p2 +REG esri:24346 4 0x1.88p6 0x1.4p2 +REG esri:24347 0 0x1.8cp6 0x0.0p0 +REG esri:24347 1 0x1.78p6 -0x1.4p2 +REG esri:24347 2 0x1.ap6 -0x1.4p2 +REG esri:24347 3 0x1.78p6 0x1.4p2 +REG esri:24347 4 0x1.ap6 0x1.4p2 +REG esri:2435 0 0x1.c8p6 0x0.0p0 +REG esri:2435 1 0x1.b4p6 -0x1.4p2 +REG esri:2435 2 0x1.dcp6 -0x1.4p2 +REG esri:2435 3 0x1.b4p6 0x1.4p2 +REG esri:2435 4 0x1.dcp6 0x1.4p2 +REG esri:2436 0 0x1.d4p6 0x0.0p0 +REG esri:2436 1 0x1.cp6 -0x1.4p2 +REG esri:2436 2 0x1.e8p6 -0x1.4p2 +REG esri:2436 3 0x1.cp6 0x1.4p2 +REG esri:2436 4 0x1.e8p6 0x1.4p2 +REG esri:2437 0 0x1.ep6 0x0.0p0 +REG esri:2437 1 0x1.ccp6 -0x1.4p2 +REG esri:2437 2 0x1.f4p6 -0x1.4p2 +REG esri:2437 3 0x1.ccp6 0x1.4p2 +REG esri:2437 4 0x1.f4p6 0x1.4p2 +REG esri:24370 0 0x1.1p6 0x1.3cp5 +REG esri:24370 1 0x1.ec294c4167dafp5 0x1.14p5 +REG esri:24370 2 0x1.29eb59df4c129p6 0x1.14p5 +REG esri:24370 3 0x1.ec294c4167dafp5 0x1.64p5 +REG esri:24370 4 0x1.29eb59df4c129p6 0x1.64p5 +REG esri:24371 0 0x1.1p6 0x1.04p5 +REG esri:24371 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG esri:24371 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG esri:24371 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG esri:24371 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG esri:24372 0 0x1.28p6 0x1.ap4 +REG esri:24372 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG esri:24372 2 0x1.3e40859d8c244p6 0x1.5p4 +REG esri:24372 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG esri:24372 4 0x1.3e40859d8c244p6 0x1.fp4 +REG esri:24373 0 0x1.4p6 0x1.3p4 +REG esri:24373 1 0x1.2ad8fb6bb699ap6 0x1.cp3 +REG esri:24373 2 0x1.5527049449666p6 0x1.cp3 +REG esri:24373 3 0x1.2ad8fb6bb699ap6 0x1.8p4 +REG esri:24373 4 0x1.5527049449666p6 0x1.8p4 +REG esri:24374 0 0x1.4p6 0x1.8p3 +REG esri:24374 1 0x1.2b8d9dbc49a16p6 0x1.cp2 +REG esri:24374 2 0x1.54726243b65eap6 0x1.cp2 +REG esri:24374 3 0x1.2b8d9dbc49a16p6 0x1.1p4 +REG esri:24374 4 0x1.54726243b65eap6 0x1.1p4 +REG esri:24375 0 0x1.68p6 0x1.ap4 +REG esri:24375 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG esri:24375 2 0x1.7e40859d8c244p6 0x1.5p4 +REG esri:24375 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG esri:24375 4 0x1.7e40859d8c244p6 0x1.fp4 +REG esri:24376 0 0x1.1p6 0x1.04p5 +REG esri:24376 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG esri:24376 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG esri:24376 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG esri:24376 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG esri:24377 0 0x1.28p6 0x1.ap4 +REG esri:24377 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG esri:24377 2 0x1.3e40859d8c244p6 0x1.5p4 +REG esri:24377 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG esri:24377 4 0x1.3e40859d8c244p6 0x1.fp4 +REG esri:24378 0 0x1.1p6 0x1.04p5 +REG esri:24378 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG esri:24378 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG esri:24378 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG esri:24378 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG esri:24379 0 0x1.28p6 0x1.ap4 +REG esri:24379 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG esri:24379 2 0x1.3e40859d8c244p6 0x1.5p4 +REG esri:24379 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG esri:24379 4 0x1.3e40859d8c244p6 0x1.fp4 +REG esri:2438 0 0x1.ecp6 0x0.0p0 +REG esri:2438 1 0x1.d8p6 -0x1.4p2 +REG esri:2438 2 0x1.0p7 -0x1.4p2 +REG esri:2438 3 0x1.d8p6 0x1.4p2 +REG esri:2438 4 0x1.0p7 0x1.4p2 +REG esri:24380 0 0x1.68p6 0x1.ap4 +REG esri:24380 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG esri:24380 2 0x1.7e40859d8c244p6 0x1.5p4 +REG esri:24380 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG esri:24380 4 0x1.7e40859d8c244p6 0x1.fp4 +REG esri:24381 0 0x1.4p6 0x1.3p4 +REG esri:24381 1 0x1.2ad8fb6bb699ap6 0x1.cp3 +REG esri:24381 2 0x1.5527049449666p6 0x1.cp3 +REG esri:24381 3 0x1.2ad8fb6bb699ap6 0x1.8p4 +REG esri:24381 4 0x1.5527049449666p6 0x1.8p4 +REG esri:24382 0 0x1.68p6 0x1.ap4 +REG esri:24382 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG esri:24382 2 0x1.7e40859d8c244p6 0x1.5p4 +REG esri:24382 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG esri:24382 4 0x1.7e40859d8c244p6 0x1.fp4 +REG esri:24383 0 0x1.4p6 0x1.8p3 +REG esri:24383 1 0x1.2b8d9dbc49a16p6 0x1.cp2 +REG esri:24383 2 0x1.54726243b65eap6 0x1.cp2 +REG esri:24383 3 0x1.2b8d9dbc49a16p6 0x1.1p4 +REG esri:24383 4 0x1.54726243b65eap6 0x1.1p4 +REG esri:2439 0 0x1.f8p6 0x0.0p0 +REG esri:2439 1 0x1.e4p6 -0x1.4p2 +REG esri:2439 2 0x1.06p7 -0x1.4p2 +REG esri:2439 3 0x1.e4p6 0x1.4p2 +REG esri:2439 4 0x1.06p7 0x1.4p2 +REG esri:2440 0 0x1.02p7 0x0.0p0 +REG esri:2440 1 0x1.fp6 -0x1.4p2 +REG esri:2440 2 0x1.0cp7 -0x1.4p2 +REG esri:2440 3 0x1.fp6 0x1.4p2 +REG esri:2440 4 0x1.0cp7 0x1.4p2 +REG esri:2441 0 0x1.08p7 0x0.0p0 +REG esri:2441 1 0x1.fcp6 -0x1.4p2 +REG esri:2441 2 0x1.12p7 -0x1.4p2 +REG esri:2441 3 0x1.fcp6 0x1.4p2 +REG esri:2441 4 0x1.12p7 0x1.4p2 +REG esri:2442 0 0x1.0ep7 0x0.0p0 +REG esri:2442 1 0x1.04p7 -0x1.4p2 +REG esri:2442 2 0x1.18p7 -0x1.4p2 +REG esri:2442 3 0x1.04p7 0x1.4p2 +REG esri:2442 4 0x1.18p7 0x1.4p2 +REG esri:2443 0 0x1.03p7 0x1.08p5 +REG esri:2443 1 0x1.ee271995b65ffp6 0x1.cp4 +REG esri:2443 2 0x1.0eec733524d01p7 0x1.cp4 +REG esri:2443 3 0x1.ee271995b65ffp6 0x1.3p5 +REG esri:2443 4 0x1.0eec733524d01p7 0x1.3p5 +REG esri:2444 0 0x1.06p7 0x1.08p5 +REG esri:2444 1 0x1.f4271995b65ffp6 0x1.cp4 +REG esri:2444 2 0x1.11ec733524d01p7 0x1.cp4 +REG esri:2444 3 0x1.f4271995b65ffp6 0x1.3p5 +REG esri:2444 4 0x1.11ec733524d01p7 0x1.3p5 +REG esri:2445 0 0x1.0855555555557p7 0x1.2p5 +REG esri:2445 1 0x1.f7f1ffa5aec74p6 0x1.fp4 +REG esri:2445 2 0x1.14b1aad7d3474p7 0x1.fp4 +REG esri:2445 3 0x1.f7f1ffa5aec74p6 0x1.48p5 +REG esri:2445 4 0x1.14b1aad7d3474p7 0x1.48p5 +REG esri:2446 0 0x1.0bp7 0x1.08p5 +REG esri:2446 1 0x1.fe271995b65ffp6 0x1.cp4 +REG esri:2446 2 0x1.16ec733524d01p7 0x1.cp4 +REG esri:2446 3 0x1.fe271995b65ffp6 0x1.3p5 +REG esri:2446 4 0x1.16ec733524d01p7 0x1.3p5 +REG esri:2447 0 0x1.0caaaaaaaaaa9p7 0x1.2p5 +REG esri:2447 1 0x1.004e55282cb8cp7 0x1.fp4 +REG esri:2447 2 0x1.1907002d289c6p7 0x1.fp4 +REG esri:2447 3 0x1.004e55282cb8cp7 0x1.48p5 +REG esri:2447 4 0x1.1907002d289c6p7 0x1.48p5 +REG esri:2448 0 0x1.1p7 0x1.2p5 +REG esri:2448 1 0x1.03a3aa7d820e3p7 0x1.fp4 +REG esri:2448 2 0x1.1c5c55827df1dp7 0x1.fp4 +REG esri:2448 3 0x1.03a3aa7d820e3p7 0x1.48p5 +REG esri:2448 4 0x1.1c5c55827df1dp7 0x1.48p5 +REG esri:2449 0 0x1.1255555555557p7 0x1.2p5 +REG esri:2449 1 0x1.05f8ffd2d763ap7 0x1.fp4 +REG esri:2449 2 0x1.1eb1aad7d3474p7 0x1.fp4 +REG esri:2449 3 0x1.05f8ffd2d763ap7 0x1.48p5 +REG esri:2449 4 0x1.1eb1aad7d3474p7 0x1.48p5 +REG esri:2450 0 0x1.15p7 0x1.2p5 +REG esri:2450 1 0x1.08a3aa7d820e3p7 0x1.fp4 +REG esri:2450 2 0x1.215c55827df1dp7 0x1.fp4 +REG esri:2450 3 0x1.08a3aa7d820e3p7 0x1.48p5 +REG esri:2450 4 0x1.215c55827df1dp7 0x1.48p5 +REG esri:24500 0 0x1.9f69796a1f705p6 0x1.49a336422301fp0 +REG esri:24500 1 0x1.8b682e5845117p6 -0x1.db2e64deee7fp1 +REG esri:24500 2 0x1.b36ac47bf9cf3p6 -0x1.db2e64deee7fp1 +REG esri:24500 3 0x1.8b682e5845117p6 0x1.9268cd9088c08p2 +REG esri:24500 4 0x1.b36ac47bf9cf3p6 0x1.9268cd9088c08p2 +REG esri:2451 0 0x1.17aaaaaaaaaa9p7 0x1.2p5 +REG esri:2451 1 0x1.0b4e55282cb8cp7 0x1.fp4 +REG esri:2451 2 0x1.2407002d289c6p7 0x1.fp4 +REG esri:2451 3 0x1.0b4e55282cb8cp7 0x1.48p5 +REG esri:2451 4 0x1.2407002d289c6p7 0x1.48p5 +REG esri:2452 0 0x1.19aaaaaaaaaa9p7 0x1.4p5 +REG esri:2452 1 0x1.0c9cd2f20e3ebp7 0x1.18p5 +REG esri:2452 2 0x1.26b8826347167p7 0x1.18p5 +REG esri:2452 3 0x1.0c9cd2f20e3ebp7 0x1.68p5 +REG esri:2452 4 0x1.26b8826347167p7 0x1.68p5 +REG esri:2453 0 0x1.188p7 0x1.6p5 +REG esri:2453 1 0x1.0a992e6394ef4p7 0x1.38p5 +REG esri:2453 2 0x1.2666d19c6b10cp7 0x1.38p5 +REG esri:2453 3 0x1.0a992e6394ef4p7 0x1.88p5 +REG esri:2453 4 0x1.2666d19c6b10cp7 0x1.88p5 +REG esri:2454 0 0x1.1c8p7 0x1.6p5 +REG esri:2454 1 0x1.0e992e6394ef4p7 0x1.38p5 +REG esri:2454 2 0x1.2a66d19c6b10cp7 0x1.38p5 +REG esri:2454 3 0x1.0e992e6394ef4p7 0x1.88p5 +REG esri:2454 4 0x1.2a66d19c6b10cp7 0x1.88p5 +REG esri:24547 0 0x1.8cp6 0x0.0p0 +REG esri:24547 1 0x1.78p6 -0x1.4p2 +REG esri:24547 2 0x1.ap6 -0x1.4p2 +REG esri:24547 3 0x1.78p6 0x1.4p2 +REG esri:24547 4 0x1.ap6 0x1.4p2 +REG esri:24548 0 0x1.a4p6 0x0.0p0 +REG esri:24548 1 0x1.9p6 -0x1.4p2 +REG esri:24548 2 0x1.b8p6 -0x1.4p2 +REG esri:24548 3 0x1.9p6 0x1.4p2 +REG esri:24548 4 0x1.b8p6 0x1.4p2 +REG esri:2455 0 0x1.208p7 0x1.6p5 +REG esri:2455 1 0x1.12992e6394ef4p7 0x1.38p5 +REG esri:2455 2 0x1.2e66d19c6b10cp7 0x1.38p5 +REG esri:2455 3 0x1.12992e6394ef4p7 0x1.88p5 +REG esri:2455 4 0x1.2e66d19c6b10cp7 0x1.88p5 +REG esri:2456 0 0x1.1cp7 0x1.ap4 +REG esri:2456 1 0x1.10dfbd3139edep7 0x1.5p4 +REG esri:2456 2 0x1.272042cec6122p7 0x1.5p4 +REG esri:2456 3 0x1.10dfbd3139edep7 0x1.fp4 +REG esri:2456 4 0x1.272042cec6122p7 0x1.fp4 +REG esri:2457 0 0x1.fep6 0x1.ap4 +REG esri:2457 1 0x1.e7bf7a6273dbcp6 0x1.5p4 +REG esri:2457 2 0x1.0a2042cec6122p7 0x1.5p4 +REG esri:2457 3 0x1.e7bf7a6273dbcp6 0x1.fp4 +REG esri:2457 4 0x1.0a2042cec6122p7 0x1.fp4 +REG esri:24571 0 0x1.99p6 0x1.0p2 +REG esri:24571 1 0x1.84f37f5af8062p6 -0x1.0p0 +REG esri:24571 2 0x1.ad0c80a507f9ep6 -0x1.0p0 +REG esri:24571 3 0x1.84f37f5af8062p6 0x1.2p3 +REG esri:24571 4 0x1.ad0c80a507f9ep6 0x1.2p3 +REG esri:2458 0 0x1.fp6 0x1.ap4 +REG esri:2458 1 0x1.d9bf7a6273dbcp6 0x1.5p4 +REG esri:2458 2 0x1.032042cec6122p7 0x1.5p4 +REG esri:2458 3 0x1.d9bf7a6273dbcp6 0x1.fp4 +REG esri:2458 4 0x1.032042cec6122p7 0x1.fp4 +REG esri:2459 0 0x1.06p7 0x1.ap4 +REG esri:2459 1 0x1.f5bf7a6273dbcp6 0x1.5p4 +REG esri:2459 2 0x1.112042cec6122p7 0x1.5p4 +REG esri:2459 3 0x1.f5bf7a6273dbcp6 0x1.fp4 +REG esri:2459 4 0x1.112042cec6122p7 0x1.fp4 +REG esri:2460 0 0x1.1p7 0x1.4p4 +REG esri:2460 1 0x1.055bb4747cdbcp7 0x1.ep3 +REG esri:2460 2 0x1.1aa44b8b83244p7 0x1.ep3 +REG esri:2460 3 0x1.055bb4747cdbcp7 0x1.9p4 +REG esri:2460 4 0x1.1aa44b8b83244p7 0x1.9p4 +REG esri:24600 0 0x1.68p5 0x1.04p5 +REG esri:24600 1 0x1.38928b4db1cbap5 0x1.b8p4 +REG esri:24600 2 0x1.976d74b24e346p5 0x1.b8p4 +REG esri:24600 3 0x1.38928b4db1cbap5 0x1.2cp5 +REG esri:24600 4 0x1.976d74b24e346p5 0x1.2cp5 +REG esri:2461 0 0x1.34p7 0x1.ap4 +REG esri:2461 1 0x1.28dfbd3139edep7 0x1.5p4 +REG esri:2461 2 0x1.3f2042cec6122p7 0x1.5p4 +REG esri:2461 3 0x1.28dfbd3139edep7 0x1.fp4 +REG esri:2461 4 0x1.3f2042cec6122p7 0x1.fp4 +REG esri:2462 0 0x1.5p4 0x0.0p0 +REG esri:2462 1 0x1.0p4 -0x1.4p2 +REG esri:2462 2 0x1.ap4 -0x1.4p2 +REG esri:2462 3 0x1.0p4 0x1.4p2 +REG esri:2462 4 0x1.ap4 0x1.4p2 +REG esri:2463 0 0x1.5p4 0x0.0p0 +REG esri:2463 1 0x1.0p4 -0x1.4p2 +REG esri:2463 2 0x1.ap4 -0x1.4p2 +REG esri:2463 3 0x1.0p4 0x1.4p2 +REG esri:2463 4 0x1.ap4 0x1.4p2 +REG esri:2464 0 0x1.bp4 0x0.0p0 +REG esri:2464 1 0x1.6p4 -0x1.4p2 +REG esri:2464 2 0x1.0p5 -0x1.4p2 +REG esri:2464 3 0x1.6p4 0x1.4p2 +REG esri:2464 4 0x1.0p5 0x1.4p2 +REG esri:2465 0 0x1.08p5 0x0.0p0 +REG esri:2465 1 0x1.cp4 -0x1.4p2 +REG esri:2465 2 0x1.3p5 -0x1.4p2 +REG esri:2465 3 0x1.cp4 0x1.4p2 +REG esri:2465 4 0x1.3p5 0x1.4p2 +REG esri:2466 0 0x1.38p5 0x0.0p0 +REG esri:2466 1 0x1.1p5 -0x1.4p2 +REG esri:2466 2 0x1.6p5 -0x1.4p2 +REG esri:2466 3 0x1.1p5 0x1.4p2 +REG esri:2466 4 0x1.6p5 0x1.4p2 +REG esri:2467 0 0x1.68p5 0x0.0p0 +REG esri:2467 1 0x1.4p5 -0x1.4p2 +REG esri:2467 2 0x1.9p5 -0x1.4p2 +REG esri:2467 3 0x1.4p5 0x1.4p2 +REG esri:2467 4 0x1.9p5 0x1.4p2 +REG esri:2468 0 0x1.98p5 0x0.0p0 +REG esri:2468 1 0x1.7p5 -0x1.4p2 +REG esri:2468 2 0x1.cp5 -0x1.4p2 +REG esri:2468 3 0x1.7p5 0x1.4p2 +REG esri:2468 4 0x1.cp5 0x1.4p2 +REG esri:2469 0 0x1.c8p5 0x0.0p0 +REG esri:2469 1 0x1.ap5 -0x1.4p2 +REG esri:2469 2 0x1.fp5 -0x1.4p2 +REG esri:2469 3 0x1.ap5 0x1.4p2 +REG esri:2469 4 0x1.fp5 0x1.4p2 +REG esri:2470 0 0x1.f8p5 0x0.0p0 +REG esri:2470 1 0x1.dp5 -0x1.4p2 +REG esri:2470 2 0x1.1p6 -0x1.4p2 +REG esri:2470 3 0x1.dp5 0x1.4p2 +REG esri:2470 4 0x1.1p6 0x1.4p2 +REG esri:2471 0 0x1.14p6 0x0.0p0 +REG esri:2471 1 0x1.0p6 -0x1.4p2 +REG esri:2471 2 0x1.28p6 -0x1.4p2 +REG esri:2471 3 0x1.0p6 0x1.4p2 +REG esri:2471 4 0x1.28p6 0x1.4p2 +REG esri:24718 0 -0x1.2cp6 0x0.0p0 +REG esri:24718 1 -0x1.4p6 -0x1.4p2 +REG esri:24718 2 -0x1.18p6 -0x1.4p2 +REG esri:24718 3 -0x1.4p6 0x1.4p2 +REG esri:24718 4 -0x1.18p6 0x1.4p2 +REG esri:24719 0 -0x1.14p6 0x0.0p0 +REG esri:24719 1 -0x1.28p6 -0x1.4p2 +REG esri:24719 2 -0x1.0p6 -0x1.4p2 +REG esri:24719 3 -0x1.28p6 0x1.4p2 +REG esri:24719 4 -0x1.0p6 0x1.4p2 +REG esri:2472 0 0x1.2cp6 0x0.0p0 +REG esri:2472 1 0x1.18p6 -0x1.4p2 +REG esri:2472 2 0x1.4p6 -0x1.4p2 +REG esri:2472 3 0x1.18p6 0x1.4p2 +REG esri:2472 4 0x1.4p6 0x1.4p2 +REG esri:24720 0 -0x1.f8p5 0x0.0p0 +REG esri:24720 1 -0x1.1p6 -0x1.4p2 +REG esri:24720 2 -0x1.dp5 -0x1.4p2 +REG esri:24720 3 -0x1.1p6 0x1.4p2 +REG esri:24720 4 -0x1.dp5 0x1.4p2 +REG esri:24721 0 -0x1.c8p5 0x0.0p0 +REG esri:24721 1 -0x1.fp5 -0x1.4p2 +REG esri:24721 2 -0x1.ap5 -0x1.4p2 +REG esri:24721 3 -0x1.fp5 0x1.4p2 +REG esri:24721 4 -0x1.ap5 0x1.4p2 +REG esri:2473 0 0x1.44p6 0x0.0p0 +REG esri:2473 1 0x1.3p6 -0x1.4p2 +REG esri:2473 2 0x1.58p6 -0x1.4p2 +REG esri:2473 3 0x1.3p6 0x1.4p2 +REG esri:2473 4 0x1.58p6 0x1.4p2 +REG esri:2474 0 0x1.5cp6 0x0.0p0 +REG esri:2474 1 0x1.48p6 -0x1.4p2 +REG esri:2474 2 0x1.7p6 -0x1.4p2 +REG esri:2474 3 0x1.48p6 0x1.4p2 +REG esri:2474 4 0x1.7p6 0x1.4p2 +REG esri:2475 0 0x1.74p6 0x0.0p0 +REG esri:2475 1 0x1.6p6 -0x1.4p2 +REG esri:2475 2 0x1.88p6 -0x1.4p2 +REG esri:2475 3 0x1.6p6 0x1.4p2 +REG esri:2475 4 0x1.88p6 0x1.4p2 +REG esri:2476 0 0x1.8cp6 0x0.0p0 +REG esri:2476 1 0x1.78p6 -0x1.4p2 +REG esri:2476 2 0x1.ap6 -0x1.4p2 +REG esri:2476 3 0x1.78p6 0x1.4p2 +REG esri:2476 4 0x1.ap6 0x1.4p2 +REG esri:2477 0 0x1.a4p6 0x0.0p0 +REG esri:2477 1 0x1.9p6 -0x1.4p2 +REG esri:2477 2 0x1.b8p6 -0x1.4p2 +REG esri:2477 3 0x1.9p6 0x1.4p2 +REG esri:2477 4 0x1.b8p6 0x1.4p2 +REG esri:2478 0 0x1.bcp6 0x0.0p0 +REG esri:2478 1 0x1.a8p6 -0x1.4p2 +REG esri:2478 2 0x1.dp6 -0x1.4p2 +REG esri:2478 3 0x1.a8p6 0x1.4p2 +REG esri:2478 4 0x1.dp6 0x1.4p2 +REG esri:2479 0 0x1.d4p6 0x0.0p0 +REG esri:2479 1 0x1.cp6 -0x1.4p2 +REG esri:2479 2 0x1.e8p6 -0x1.4p2 +REG esri:2479 3 0x1.cp6 0x1.4p2 +REG esri:2479 4 0x1.e8p6 0x1.4p2 +REG esri:2480 0 0x1.ecp6 0x0.0p0 +REG esri:2480 1 0x1.d8p6 -0x1.4p2 +REG esri:2480 2 0x1.0p7 -0x1.4p2 +REG esri:2480 3 0x1.d8p6 0x1.4p2 +REG esri:2480 4 0x1.0p7 0x1.4p2 +REG esri:2481 0 0x1.02p7 0x0.0p0 +REG esri:2481 1 0x1.fp6 -0x1.4p2 +REG esri:2481 2 0x1.0cp7 -0x1.4p2 +REG esri:2481 3 0x1.fp6 0x1.4p2 +REG esri:2481 4 0x1.0cp7 0x1.4p2 +REG esri:24818 0 -0x1.2cp6 0x0.0p0 +REG esri:24818 1 -0x1.4p6 -0x1.4p2 +REG esri:24818 2 -0x1.18p6 -0x1.4p2 +REG esri:24818 3 -0x1.4p6 0x1.4p2 +REG esri:24818 4 -0x1.18p6 0x1.4p2 +REG esri:24819 0 -0x1.14p6 0x0.0p0 +REG esri:24819 1 -0x1.28p6 -0x1.4p2 +REG esri:24819 2 -0x1.0p6 -0x1.4p2 +REG esri:24819 3 -0x1.28p6 0x1.4p2 +REG esri:24819 4 -0x1.0p6 0x1.4p2 +REG esri:2482 0 0x1.0ep7 0x0.0p0 +REG esri:2482 1 0x1.04p7 -0x1.4p2 +REG esri:2482 2 0x1.18p7 -0x1.4p2 +REG esri:2482 3 0x1.04p7 0x1.4p2 +REG esri:2482 4 0x1.18p7 0x1.4p2 +REG esri:24820 0 -0x1.f8p5 0x0.0p0 +REG esri:24820 1 -0x1.1p6 -0x1.4p2 +REG esri:24820 2 -0x1.dp5 -0x1.4p2 +REG esri:24820 3 -0x1.1p6 0x1.4p2 +REG esri:24820 4 -0x1.dp5 0x1.4p2 +REG esri:24821 0 -0x1.c8p5 0x0.0p0 +REG esri:24821 1 -0x1.fp5 -0x1.4p2 +REG esri:24821 2 -0x1.ap5 -0x1.4p2 +REG esri:24821 3 -0x1.fp5 0x1.4p2 +REG esri:24821 4 -0x1.ap5 0x1.4p2 +REG esri:2483 0 0x1.1ap7 0x0.0p0 +REG esri:2483 1 0x1.1p7 -0x1.4p2 +REG esri:2483 2 0x1.24p7 -0x1.4p2 +REG esri:2483 3 0x1.1p7 0x1.4p2 +REG esri:2483 4 0x1.24p7 0x1.4p2 +REG esri:2484 0 0x1.26p7 0x0.0p0 +REG esri:2484 1 0x1.1cp7 -0x1.4p2 +REG esri:2484 2 0x1.3p7 -0x1.4p2 +REG esri:2484 3 0x1.1cp7 0x1.4p2 +REG esri:2484 4 0x1.3p7 0x1.4p2 +REG esri:2485 0 0x1.32p7 0x0.0p0 +REG esri:2485 1 0x1.28p7 -0x1.4p2 +REG esri:2485 2 0x1.3cp7 -0x1.4p2 +REG esri:2485 3 0x1.28p7 0x1.4p2 +REG esri:2485 4 0x1.3cp7 0x1.4p2 +REG esri:2486 0 0x1.3ep7 0x0.0p0 +REG esri:2486 1 0x1.34p7 -0x1.4p2 +REG esri:2486 2 0x1.48p7 -0x1.4p2 +REG esri:2486 3 0x1.34p7 0x1.4p2 +REG esri:2486 4 0x1.48p7 0x1.4p2 +REG esri:2487 0 0x1.4ap7 0x0.0p0 +REG esri:2487 1 0x1.4p7 -0x1.4p2 +REG esri:2487 2 0x1.54p7 -0x1.4p2 +REG esri:2487 3 0x1.4p7 0x1.4p2 +REG esri:2487 4 0x1.54p7 0x1.4p2 +REG esri:24877 0 -0x1.44p6 -0x1.9p4 +REG esri:24877 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG esri:24877 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:24877 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG esri:24877 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:24878 0 -0x1.2cp6 -0x1.9p4 +REG esri:24878 1 -0x1.42114b818572ep6 -0x1.ep4 +REG esri:24878 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:24878 3 -0x1.42114b818572ep6 -0x1.4p4 +REG esri:24878 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:24879 0 -0x1.14p6 -0x1.9p4 +REG esri:24879 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:24879 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:24879 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:24879 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:2488 0 0x1.56p7 0x0.0p0 +REG esri:2488 1 0x1.4cp7 -0x1.4p2 +REG esri:2488 2 0x1.6p7 -0x1.4p2 +REG esri:2488 3 0x1.4cp7 0x1.4p2 +REG esri:2488 4 0x1.6p7 0x1.4p2 +REG esri:24880 0 -0x1.f8p5 -0x1.9p4 +REG esri:24880 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:24880 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:24880 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:24880 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:24882 0 -0x1.98p5 -0x1.9p4 +REG esri:24882 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:24882 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:24882 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:24882 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:2489 0 0x1.62p7 0x0.0p0 +REG esri:2489 1 0x1.58p7 -0x1.4p2 +REG esri:2489 2 -0x1.64p7 -0x1.4p2 +REG esri:2489 3 0x1.58p7 0x1.4p2 +REG esri:2489 4 -0x1.64p7 0x1.4p2 +REG esri:24891 0 -0x1.42p6 -0x1.8p2 +REG esri:24891 1 -0x1.561c33cfeba69p6 -0x1.6p3 +REG esri:24891 2 -0x1.2de3cc3014597p6 -0x1.6p3 +REG esri:24891 3 -0x1.561c33cfeba69p6 -0x1.0p0 +REG esri:24891 4 -0x1.2de3cc3014597p6 -0x1.0p0 +REG esri:24892 0 -0x1.3p6 -0x1.3p3 +REG esri:24892 1 -0x1.444731b0d4376p6 -0x1.dp3 +REG esri:24892 2 -0x1.1bb8ce4f2bc8ap6 -0x1.dp3 +REG esri:24892 3 -0x1.444731b0d4376p6 -0x1.2p2 +REG esri:24892 4 -0x1.1bb8ce4f2bc8ap6 -0x1.2p2 +REG esri:24893 0 -0x1.1ap6 -0x1.3p3 +REG esri:24893 1 -0x1.2e4731b0d4376p6 -0x1.dp3 +REG esri:24893 2 -0x1.05b8ce4f2bc8ap6 -0x1.dp3 +REG esri:24893 3 -0x1.2e4731b0d4376p6 -0x1.2p2 +REG esri:24893 4 -0x1.05b8ce4f2bc8ap6 -0x1.2p2 +REG esri:2490 0 -0x1.62p7 0x0.0p0 +REG esri:2490 1 0x1.64p7 -0x1.4p2 +REG esri:2490 2 -0x1.58p7 -0x1.4p2 +REG esri:2490 3 0x1.64p7 0x1.4p2 +REG esri:2490 4 -0x1.58p7 0x1.4p2 +REG esri:2491 0 -0x1.56p7 0x0.0p0 +REG esri:2491 1 -0x1.6p7 -0x1.4p2 +REG esri:2491 2 -0x1.4cp7 -0x1.4p2 +REG esri:2491 3 -0x1.6p7 0x1.4p2 +REG esri:2491 4 -0x1.4cp7 0x1.4p2 +REG esri:2492 0 0x1.2p3 0x0.0p0 +REG esri:2492 1 0x1.0p2 -0x1.4p2 +REG esri:2492 2 0x1.cp3 -0x1.4p2 +REG esri:2492 3 0x1.0p2 0x1.4p2 +REG esri:2492 4 0x1.cp3 0x1.4p2 +REG esri:2493 0 0x1.ep3 0x0.0p0 +REG esri:2493 1 0x1.4p3 -0x1.4p2 +REG esri:2493 2 0x1.4p4 -0x1.4p2 +REG esri:2493 3 0x1.4p3 0x1.4p2 +REG esri:2493 4 0x1.4p4 0x1.4p2 +REG esri:2494 0 0x1.5p4 0x0.0p0 +REG esri:2494 1 0x1.0p4 -0x1.4p2 +REG esri:2494 2 0x1.ap4 -0x1.4p2 +REG esri:2494 3 0x1.0p4 0x1.4p2 +REG esri:2494 4 0x1.ap4 0x1.4p2 +REG esri:2495 0 0x1.bp4 0x0.0p0 +REG esri:2495 1 0x1.6p4 -0x1.4p2 +REG esri:2495 2 0x1.0p5 -0x1.4p2 +REG esri:2495 3 0x1.6p4 0x1.4p2 +REG esri:2495 4 0x1.0p5 0x1.4p2 +REG esri:2496 0 0x1.08p5 0x0.0p0 +REG esri:2496 1 0x1.cp4 -0x1.4p2 +REG esri:2496 2 0x1.3p5 -0x1.4p2 +REG esri:2496 3 0x1.cp4 0x1.4p2 +REG esri:2496 4 0x1.3p5 0x1.4p2 +REG esri:2497 0 0x1.38p5 0x0.0p0 +REG esri:2497 1 0x1.1p5 -0x1.4p2 +REG esri:2497 2 0x1.6p5 -0x1.4p2 +REG esri:2497 3 0x1.1p5 0x1.4p2 +REG esri:2497 4 0x1.6p5 0x1.4p2 +REG esri:2498 0 0x1.68p5 0x0.0p0 +REG esri:2498 1 0x1.4p5 -0x1.4p2 +REG esri:2498 2 0x1.9p5 -0x1.4p2 +REG esri:2498 3 0x1.4p5 0x1.4p2 +REG esri:2498 4 0x1.9p5 0x1.4p2 +REG esri:2499 0 0x1.98p5 0x0.0p0 +REG esri:2499 1 0x1.7p5 -0x1.4p2 +REG esri:2499 2 0x1.cp5 -0x1.4p2 +REG esri:2499 3 0x1.7p5 0x1.4p2 +REG esri:2499 4 0x1.cp5 0x1.4p2 +REG esri:2500 0 0x1.c8p5 0x0.0p0 +REG esri:2500 1 0x1.ap5 -0x1.4p2 +REG esri:2500 2 0x1.fp5 -0x1.4p2 +REG esri:2500 3 0x1.ap5 0x1.4p2 +REG esri:2500 4 0x1.fp5 0x1.4p2 +REG esri:25000 0 -0x1.0p0 0x1.2aaaaaaaaaaabp2 +REG esri:25000 1 -0x1.81107a2df9b6ep2 -0x1.555555555555p-2 +REG esri:25000 2 0x1.01107a2df9b6ep2 -0x1.555555555555p-2 +REG esri:25000 3 -0x1.81107a2df9b6ep2 0x1.3555555555556p3 +REG esri:25000 4 0x1.01107a2df9b6ep2 0x1.3555555555556p3 +REG esri:2501 0 0x1.f8p5 0x0.0p0 +REG esri:2501 1 0x1.dp5 -0x1.4p2 +REG esri:2501 2 0x1.1p6 -0x1.4p2 +REG esri:2501 3 0x1.dp5 0x1.4p2 +REG esri:2501 4 0x1.1p6 0x1.4p2 +REG esri:2502 0 0x1.14p6 0x0.0p0 +REG esri:2502 1 0x1.0p6 -0x1.4p2 +REG esri:2502 2 0x1.28p6 -0x1.4p2 +REG esri:2502 3 0x1.0p6 0x1.4p2 +REG esri:2502 4 0x1.28p6 0x1.4p2 +REG esri:2503 0 0x1.2cp6 0x0.0p0 +REG esri:2503 1 0x1.18p6 -0x1.4p2 +REG esri:2503 2 0x1.4p6 -0x1.4p2 +REG esri:2503 3 0x1.18p6 0x1.4p2 +REG esri:2503 4 0x1.4p6 0x1.4p2 +REG esri:2504 0 0x1.44p6 0x0.0p0 +REG esri:2504 1 0x1.3p6 -0x1.4p2 +REG esri:2504 2 0x1.58p6 -0x1.4p2 +REG esri:2504 3 0x1.3p6 0x1.4p2 +REG esri:2504 4 0x1.58p6 0x1.4p2 +REG esri:2505 0 0x1.5cp6 0x0.0p0 +REG esri:2505 1 0x1.48p6 -0x1.4p2 +REG esri:2505 2 0x1.7p6 -0x1.4p2 +REG esri:2505 3 0x1.48p6 0x1.4p2 +REG esri:2505 4 0x1.7p6 0x1.4p2 +REG esri:2506 0 0x1.74p6 0x0.0p0 +REG esri:2506 1 0x1.6p6 -0x1.4p2 +REG esri:2506 2 0x1.88p6 -0x1.4p2 +REG esri:2506 3 0x1.6p6 0x1.4p2 +REG esri:2506 4 0x1.88p6 0x1.4p2 +REG esri:2507 0 0x1.8cp6 0x0.0p0 +REG esri:2507 1 0x1.78p6 -0x1.4p2 +REG esri:2507 2 0x1.ap6 -0x1.4p2 +REG esri:2507 3 0x1.78p6 0x1.4p2 +REG esri:2507 4 0x1.ap6 0x1.4p2 +REG esri:2508 0 0x1.a4p6 0x0.0p0 +REG esri:2508 1 0x1.9p6 -0x1.4p2 +REG esri:2508 2 0x1.b8p6 -0x1.4p2 +REG esri:2508 3 0x1.9p6 0x1.4p2 +REG esri:2508 4 0x1.b8p6 0x1.4p2 +REG esri:2509 0 0x1.bcp6 0x0.0p0 +REG esri:2509 1 0x1.a8p6 -0x1.4p2 +REG esri:2509 2 0x1.dp6 -0x1.4p2 +REG esri:2509 3 0x1.a8p6 0x1.4p2 +REG esri:2509 4 0x1.dp6 0x1.4p2 +REG esri:2510 0 0x1.d4p6 0x0.0p0 +REG esri:2510 1 0x1.cp6 -0x1.4p2 +REG esri:2510 2 0x1.e8p6 -0x1.4p2 +REG esri:2510 3 0x1.cp6 0x1.4p2 +REG esri:2510 4 0x1.e8p6 0x1.4p2 +REG esri:2511 0 0x1.ecp6 0x0.0p0 +REG esri:2511 1 0x1.d8p6 -0x1.4p2 +REG esri:2511 2 0x1.0p7 -0x1.4p2 +REG esri:2511 3 0x1.d8p6 0x1.4p2 +REG esri:2511 4 0x1.0p7 0x1.4p2 +REG esri:2512 0 0x1.02p7 0x0.0p0 +REG esri:2512 1 0x1.fp6 -0x1.4p2 +REG esri:2512 2 0x1.0cp7 -0x1.4p2 +REG esri:2512 3 0x1.fp6 0x1.4p2 +REG esri:2512 4 0x1.0cp7 0x1.4p2 +REG esri:2513 0 0x1.0ep7 0x0.0p0 +REG esri:2513 1 0x1.04p7 -0x1.4p2 +REG esri:2513 2 0x1.18p7 -0x1.4p2 +REG esri:2513 3 0x1.04p7 0x1.4p2 +REG esri:2513 4 0x1.18p7 0x1.4p2 +REG esri:2514 0 0x1.1ap7 0x0.0p0 +REG esri:2514 1 0x1.1p7 -0x1.4p2 +REG esri:2514 2 0x1.24p7 -0x1.4p2 +REG esri:2514 3 0x1.1p7 0x1.4p2 +REG esri:2514 4 0x1.24p7 0x1.4p2 +REG esri:2515 0 0x1.26p7 0x0.0p0 +REG esri:2515 1 0x1.1cp7 -0x1.4p2 +REG esri:2515 2 0x1.3p7 -0x1.4p2 +REG esri:2515 3 0x1.1cp7 0x1.4p2 +REG esri:2515 4 0x1.3p7 0x1.4p2 +REG esri:2516 0 0x1.32p7 0x0.0p0 +REG esri:2516 1 0x1.28p7 -0x1.4p2 +REG esri:2516 2 0x1.3cp7 -0x1.4p2 +REG esri:2516 3 0x1.28p7 0x1.4p2 +REG esri:2516 4 0x1.3cp7 0x1.4p2 +REG esri:2517 0 0x1.3ep7 0x0.0p0 +REG esri:2517 1 0x1.34p7 -0x1.4p2 +REG esri:2517 2 0x1.48p7 -0x1.4p2 +REG esri:2517 3 0x1.34p7 0x1.4p2 +REG esri:2517 4 0x1.48p7 0x1.4p2 +REG esri:2518 0 0x1.4ap7 0x0.0p0 +REG esri:2518 1 0x1.4p7 -0x1.4p2 +REG esri:2518 2 0x1.54p7 -0x1.4p2 +REG esri:2518 3 0x1.4p7 0x1.4p2 +REG esri:2518 4 0x1.54p7 0x1.4p2 +REG esri:2519 0 0x1.56p7 0x0.0p0 +REG esri:2519 1 0x1.4cp7 -0x1.4p2 +REG esri:2519 2 0x1.6p7 -0x1.4p2 +REG esri:2519 3 0x1.4cp7 0x1.4p2 +REG esri:2519 4 0x1.6p7 0x1.4p2 +REG esri:2520 0 0x1.62p7 0x0.0p0 +REG esri:2520 1 0x1.58p7 -0x1.4p2 +REG esri:2520 2 -0x1.64p7 -0x1.4p2 +REG esri:2520 3 0x1.58p7 0x1.4p2 +REG esri:2520 4 -0x1.64p7 0x1.4p2 +REG esri:2521 0 -0x1.62p7 0x0.0p0 +REG esri:2521 1 0x1.64p7 -0x1.4p2 +REG esri:2521 2 -0x1.58p7 -0x1.4p2 +REG esri:2521 3 0x1.64p7 0x1.4p2 +REG esri:2521 4 -0x1.58p7 0x1.4p2 +REG esri:2522 0 -0x1.56p7 0x0.0p0 +REG esri:2522 1 -0x1.6p7 -0x1.4p2 +REG esri:2522 2 -0x1.4cp7 -0x1.4p2 +REG esri:2522 3 -0x1.6p7 0x1.4p2 +REG esri:2522 4 -0x1.4cp7 0x1.4p2 +REG esri:2523 0 0x1.5p4 0x0.0p0 +REG esri:2523 1 0x1.0p4 -0x1.4p2 +REG esri:2523 2 0x1.ap4 -0x1.4p2 +REG esri:2523 3 0x1.0p4 0x1.4p2 +REG esri:2523 4 0x1.ap4 0x1.4p2 +REG esri:25231 0 0x1.8p1 0x0.0p0 +REG esri:25231 1 -0x1.0p1 -0x1.4p2 +REG esri:25231 2 0x1.0p3 -0x1.4p2 +REG esri:25231 3 -0x1.0p1 0x1.4p2 +REG esri:25231 4 0x1.0p3 0x1.4p2 +REG esri:2524 0 0x1.8p4 0x0.0p0 +REG esri:2524 1 0x1.3p4 -0x1.4p2 +REG esri:2524 2 0x1.dp4 -0x1.4p2 +REG esri:2524 3 0x1.3p4 0x1.4p2 +REG esri:2524 4 0x1.dp4 0x1.4p2 +REG esri:2525 0 0x1.bp4 0x0.0p0 +REG esri:2525 1 0x1.6p4 -0x1.4p2 +REG esri:2525 2 0x1.0p5 -0x1.4p2 +REG esri:2525 3 0x1.6p4 0x1.4p2 +REG esri:2525 4 0x1.0p5 0x1.4p2 +REG esri:2526 0 0x1.ep4 0x0.0p0 +REG esri:2526 1 0x1.9p4 -0x1.4p2 +REG esri:2526 2 0x1.18p5 -0x1.4p2 +REG esri:2526 3 0x1.9p4 0x1.4p2 +REG esri:2526 4 0x1.18p5 0x1.4p2 +REG esri:2527 0 0x1.08p5 0x0.0p0 +REG esri:2527 1 0x1.cp4 -0x1.4p2 +REG esri:2527 2 0x1.3p5 -0x1.4p2 +REG esri:2527 3 0x1.cp4 0x1.4p2 +REG esri:2527 4 0x1.3p5 0x1.4p2 +REG esri:2528 0 0x1.2p5 0x0.0p0 +REG esri:2528 1 0x1.fp4 -0x1.4p2 +REG esri:2528 2 0x1.48p5 -0x1.4p2 +REG esri:2528 3 0x1.fp4 0x1.4p2 +REG esri:2528 4 0x1.48p5 0x1.4p2 +REG esri:2529 0 0x1.38p5 0x0.0p0 +REG esri:2529 1 0x1.1p5 -0x1.4p2 +REG esri:2529 2 0x1.6p5 -0x1.4p2 +REG esri:2529 3 0x1.1p5 0x1.4p2 +REG esri:2529 4 0x1.6p5 0x1.4p2 +REG esri:2530 0 0x1.5p5 0x0.0p0 +REG esri:2530 1 0x1.28p5 -0x1.4p2 +REG esri:2530 2 0x1.78p5 -0x1.4p2 +REG esri:2530 3 0x1.28p5 0x1.4p2 +REG esri:2530 4 0x1.78p5 0x1.4p2 +REG esri:2531 0 0x1.68p5 0x0.0p0 +REG esri:2531 1 0x1.4p5 -0x1.4p2 +REG esri:2531 2 0x1.9p5 -0x1.4p2 +REG esri:2531 3 0x1.4p5 0x1.4p2 +REG esri:2531 4 0x1.9p5 0x1.4p2 +REG esri:2532 0 0x1.8p5 0x0.0p0 +REG esri:2532 1 0x1.58p5 -0x1.4p2 +REG esri:2532 2 0x1.a8p5 -0x1.4p2 +REG esri:2532 3 0x1.58p5 0x1.4p2 +REG esri:2532 4 0x1.a8p5 0x1.4p2 +REG esri:2533 0 0x1.98p5 0x0.0p0 +REG esri:2533 1 0x1.7p5 -0x1.4p2 +REG esri:2533 2 0x1.cp5 -0x1.4p2 +REG esri:2533 3 0x1.7p5 0x1.4p2 +REG esri:2533 4 0x1.cp5 0x1.4p2 +REG esri:2534 0 0x1.bp5 0x0.0p0 +REG esri:2534 1 0x1.88p5 -0x1.4p2 +REG esri:2534 2 0x1.d8p5 -0x1.4p2 +REG esri:2534 3 0x1.88p5 0x1.4p2 +REG esri:2534 4 0x1.d8p5 0x1.4p2 +REG esri:2535 0 0x1.c8p5 0x0.0p0 +REG esri:2535 1 0x1.ap5 -0x1.4p2 +REG esri:2535 2 0x1.fp5 -0x1.4p2 +REG esri:2535 3 0x1.ap5 0x1.4p2 +REG esri:2535 4 0x1.fp5 0x1.4p2 +REG esri:2536 0 0x1.ep5 0x0.0p0 +REG esri:2536 1 0x1.b8p5 -0x1.4p2 +REG esri:2536 2 0x1.04p6 -0x1.4p2 +REG esri:2536 3 0x1.b8p5 0x1.4p2 +REG esri:2536 4 0x1.04p6 0x1.4p2 +REG esri:2537 0 0x1.f8p5 0x0.0p0 +REG esri:2537 1 0x1.dp5 -0x1.4p2 +REG esri:2537 2 0x1.1p6 -0x1.4p2 +REG esri:2537 3 0x1.dp5 0x1.4p2 +REG esri:2537 4 0x1.1p6 0x1.4p2 +REG esri:2538 0 0x1.08p6 0x0.0p0 +REG esri:2538 1 0x1.e8p5 -0x1.4p2 +REG esri:2538 2 0x1.1cp6 -0x1.4p2 +REG esri:2538 3 0x1.e8p5 0x1.4p2 +REG esri:2538 4 0x1.1cp6 0x1.4p2 +REG esri:2539 0 0x1.14p6 0x0.0p0 +REG esri:2539 1 0x1.0p6 -0x1.4p2 +REG esri:2539 2 0x1.28p6 -0x1.4p2 +REG esri:2539 3 0x1.0p6 0x1.4p2 +REG esri:2539 4 0x1.28p6 0x1.4p2 +REG esri:25391 0 0x1.d4p6 0x0.0p0 +REG esri:25391 1 0x1.cp6 -0x1.4p2 +REG esri:25391 2 0x1.e8p6 -0x1.4p2 +REG esri:25391 3 0x1.cp6 0x1.4p2 +REG esri:25391 4 0x1.e8p6 0x1.4p2 +REG esri:25392 0 0x1.dcp6 0x0.0p0 +REG esri:25392 1 0x1.c8p6 -0x1.4p2 +REG esri:25392 2 0x1.fp6 -0x1.4p2 +REG esri:25392 3 0x1.c8p6 0x1.4p2 +REG esri:25392 4 0x1.fp6 0x1.4p2 +REG esri:25393 0 0x1.e4p6 0x0.0p0 +REG esri:25393 1 0x1.dp6 -0x1.4p2 +REG esri:25393 2 0x1.f8p6 -0x1.4p2 +REG esri:25393 3 0x1.dp6 0x1.4p2 +REG esri:25393 4 0x1.f8p6 0x1.4p2 +REG esri:25394 0 0x1.ecp6 0x0.0p0 +REG esri:25394 1 0x1.d8p6 -0x1.4p2 +REG esri:25394 2 0x1.0p7 -0x1.4p2 +REG esri:25394 3 0x1.d8p6 0x1.4p2 +REG esri:25394 4 0x1.0p7 0x1.4p2 +REG esri:25395 0 0x1.f4p6 0x0.0p0 +REG esri:25395 1 0x1.ep6 -0x1.4p2 +REG esri:25395 2 0x1.04p7 -0x1.4p2 +REG esri:25395 3 0x1.ep6 0x1.4p2 +REG esri:25395 4 0x1.04p7 0x1.4p2 +REG esri:2540 0 0x1.2p6 0x0.0p0 +REG esri:2540 1 0x1.0cp6 -0x1.4p2 +REG esri:2540 2 0x1.34p6 -0x1.4p2 +REG esri:2540 3 0x1.0cp6 0x1.4p2 +REG esri:2540 4 0x1.34p6 0x1.4p2 +REG esri:2541 0 0x1.2cp6 0x0.0p0 +REG esri:2541 1 0x1.18p6 -0x1.4p2 +REG esri:2541 2 0x1.4p6 -0x1.4p2 +REG esri:2541 3 0x1.18p6 0x1.4p2 +REG esri:2541 4 0x1.4p6 0x1.4p2 +REG esri:2542 0 0x1.38p6 0x0.0p0 +REG esri:2542 1 0x1.24p6 -0x1.4p2 +REG esri:2542 2 0x1.4cp6 -0x1.4p2 +REG esri:2542 3 0x1.24p6 0x1.4p2 +REG esri:2542 4 0x1.4cp6 0x1.4p2 +REG esri:2543 0 0x1.44p6 0x0.0p0 +REG esri:2543 1 0x1.3p6 -0x1.4p2 +REG esri:2543 2 0x1.58p6 -0x1.4p2 +REG esri:2543 3 0x1.3p6 0x1.4p2 +REG esri:2543 4 0x1.58p6 0x1.4p2 +REG esri:2544 0 0x1.5p6 0x0.0p0 +REG esri:2544 1 0x1.3cp6 -0x1.4p2 +REG esri:2544 2 0x1.64p6 -0x1.4p2 +REG esri:2544 3 0x1.3cp6 0x1.4p2 +REG esri:2544 4 0x1.64p6 0x1.4p2 +REG esri:2545 0 0x1.5cp6 0x0.0p0 +REG esri:2545 1 0x1.48p6 -0x1.4p2 +REG esri:2545 2 0x1.7p6 -0x1.4p2 +REG esri:2545 3 0x1.48p6 0x1.4p2 +REG esri:2545 4 0x1.7p6 0x1.4p2 +REG esri:2546 0 0x1.68p6 0x0.0p0 +REG esri:2546 1 0x1.54p6 -0x1.4p2 +REG esri:2546 2 0x1.7cp6 -0x1.4p2 +REG esri:2546 3 0x1.54p6 0x1.4p2 +REG esri:2546 4 0x1.7cp6 0x1.4p2 +REG esri:2547 0 0x1.74p6 0x0.0p0 +REG esri:2547 1 0x1.6p6 -0x1.4p2 +REG esri:2547 2 0x1.88p6 -0x1.4p2 +REG esri:2547 3 0x1.6p6 0x1.4p2 +REG esri:2547 4 0x1.88p6 0x1.4p2 +REG esri:2548 0 0x1.8p6 0x0.0p0 +REG esri:2548 1 0x1.6cp6 -0x1.4p2 +REG esri:2548 2 0x1.94p6 -0x1.4p2 +REG esri:2548 3 0x1.6cp6 0x1.4p2 +REG esri:2548 4 0x1.94p6 0x1.4p2 +REG esri:2549 0 0x1.8cp6 0x0.0p0 +REG esri:2549 1 0x1.78p6 -0x1.4p2 +REG esri:2549 2 0x1.ap6 -0x1.4p2 +REG esri:2549 3 0x1.78p6 0x1.4p2 +REG esri:2549 4 0x1.ap6 0x1.4p2 +REG esri:2550 0 0x1.d4p6 -0x1.9p4 +REG esri:2550 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:2550 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:2550 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:2550 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:2551 0 0x1.98p6 0x0.0p0 +REG esri:2551 1 0x1.84p6 -0x1.4p2 +REG esri:2551 2 0x1.acp6 -0x1.4p2 +REG esri:2551 3 0x1.84p6 0x1.4p2 +REG esri:2551 4 0x1.acp6 0x1.4p2 +REG esri:2552 0 0x1.a4p6 0x0.0p0 +REG esri:2552 1 0x1.9p6 -0x1.4p2 +REG esri:2552 2 0x1.b8p6 -0x1.4p2 +REG esri:2552 3 0x1.9p6 0x1.4p2 +REG esri:2552 4 0x1.b8p6 0x1.4p2 +REG esri:2553 0 0x1.bp6 0x0.0p0 +REG esri:2553 1 0x1.9cp6 -0x1.4p2 +REG esri:2553 2 0x1.c4p6 -0x1.4p2 +REG esri:2553 3 0x1.9cp6 0x1.4p2 +REG esri:2553 4 0x1.c4p6 0x1.4p2 +REG esri:2554 0 0x1.bcp6 0x0.0p0 +REG esri:2554 1 0x1.a8p6 -0x1.4p2 +REG esri:2554 2 0x1.dp6 -0x1.4p2 +REG esri:2554 3 0x1.a8p6 0x1.4p2 +REG esri:2554 4 0x1.dp6 0x1.4p2 +REG esri:2555 0 0x1.c8p6 0x0.0p0 +REG esri:2555 1 0x1.b4p6 -0x1.4p2 +REG esri:2555 2 0x1.dcp6 -0x1.4p2 +REG esri:2555 3 0x1.b4p6 0x1.4p2 +REG esri:2555 4 0x1.dcp6 0x1.4p2 +REG esri:2556 0 0x1.d4p6 0x0.0p0 +REG esri:2556 1 0x1.cp6 -0x1.4p2 +REG esri:2556 2 0x1.e8p6 -0x1.4p2 +REG esri:2556 3 0x1.cp6 0x1.4p2 +REG esri:2556 4 0x1.e8p6 0x1.4p2 +REG esri:2557 0 0x1.ep6 0x0.0p0 +REG esri:2557 1 0x1.ccp6 -0x1.4p2 +REG esri:2557 2 0x1.f4p6 -0x1.4p2 +REG esri:2557 3 0x1.ccp6 0x1.4p2 +REG esri:2557 4 0x1.f4p6 0x1.4p2 +REG esri:2558 0 0x1.ecp6 0x0.0p0 +REG esri:2558 1 0x1.d8p6 -0x1.4p2 +REG esri:2558 2 0x1.0p7 -0x1.4p2 +REG esri:2558 3 0x1.d8p6 0x1.4p2 +REG esri:2558 4 0x1.0p7 0x1.4p2 +REG esri:2559 0 0x1.f8p6 0x0.0p0 +REG esri:2559 1 0x1.e4p6 -0x1.4p2 +REG esri:2559 2 0x1.06p7 -0x1.4p2 +REG esri:2559 3 0x1.e4p6 0x1.4p2 +REG esri:2559 4 0x1.06p7 0x1.4p2 +REG esri:2560 0 0x1.02p7 0x0.0p0 +REG esri:2560 1 0x1.fp6 -0x1.4p2 +REG esri:2560 2 0x1.0cp7 -0x1.4p2 +REG esri:2560 3 0x1.fp6 0x1.4p2 +REG esri:2560 4 0x1.0cp7 0x1.4p2 +REG esri:2561 0 0x1.08p7 0x0.0p0 +REG esri:2561 1 0x1.fcp6 -0x1.4p2 +REG esri:2561 2 0x1.12p7 -0x1.4p2 +REG esri:2561 3 0x1.fcp6 0x1.4p2 +REG esri:2561 4 0x1.12p7 0x1.4p2 +REG esri:2562 0 0x1.0ep7 0x0.0p0 +REG esri:2562 1 0x1.04p7 -0x1.4p2 +REG esri:2562 2 0x1.18p7 -0x1.4p2 +REG esri:2562 3 0x1.04p7 0x1.4p2 +REG esri:2562 4 0x1.18p7 0x1.4p2 +REG esri:2563 0 0x1.14p7 0x0.0p0 +REG esri:2563 1 0x1.0ap7 -0x1.4p2 +REG esri:2563 2 0x1.1ep7 -0x1.4p2 +REG esri:2563 3 0x1.0ap7 0x1.4p2 +REG esri:2563 4 0x1.1ep7 0x1.4p2 +REG esri:2564 0 0x1.1ap7 0x0.0p0 +REG esri:2564 1 0x1.1p7 -0x1.4p2 +REG esri:2564 2 0x1.24p7 -0x1.4p2 +REG esri:2564 3 0x1.1p7 0x1.4p2 +REG esri:2564 4 0x1.24p7 0x1.4p2 +REG esri:2565 0 0x1.2p7 0x0.0p0 +REG esri:2565 1 0x1.16p7 -0x1.4p2 +REG esri:2565 2 0x1.2ap7 -0x1.4p2 +REG esri:2565 3 0x1.16p7 0x1.4p2 +REG esri:2565 4 0x1.2ap7 0x1.4p2 +REG esri:2566 0 0x1.26p7 0x0.0p0 +REG esri:2566 1 0x1.1cp7 -0x1.4p2 +REG esri:2566 2 0x1.3p7 -0x1.4p2 +REG esri:2566 3 0x1.1cp7 0x1.4p2 +REG esri:2566 4 0x1.3p7 0x1.4p2 +REG esri:2567 0 0x1.2cp7 0x0.0p0 +REG esri:2567 1 0x1.22p7 -0x1.4p2 +REG esri:2567 2 0x1.36p7 -0x1.4p2 +REG esri:2567 3 0x1.22p7 0x1.4p2 +REG esri:2567 4 0x1.36p7 0x1.4p2 +REG esri:2568 0 0x1.32p7 0x0.0p0 +REG esri:2568 1 0x1.28p7 -0x1.4p2 +REG esri:2568 2 0x1.3cp7 -0x1.4p2 +REG esri:2568 3 0x1.28p7 0x1.4p2 +REG esri:2568 4 0x1.3cp7 0x1.4p2 +REG esri:2569 0 0x1.38p7 0x0.0p0 +REG esri:2569 1 0x1.2ep7 -0x1.4p2 +REG esri:2569 2 0x1.42p7 -0x1.4p2 +REG esri:2569 3 0x1.2ep7 0x1.4p2 +REG esri:2569 4 0x1.42p7 0x1.4p2 +REG esri:2570 0 0x1.3ep7 0x0.0p0 +REG esri:2570 1 0x1.34p7 -0x1.4p2 +REG esri:2570 2 0x1.48p7 -0x1.4p2 +REG esri:2570 3 0x1.34p7 0x1.4p2 +REG esri:2570 4 0x1.48p7 0x1.4p2 +REG esri:25700 0 -0x1.1e627298d3894p7 0x0.0p0 +REG esri:25700 1 -0x1.28627298d3894p7 -0x1.4p2 +REG esri:25700 2 -0x1.14627298d3894p7 -0x1.4p2 +REG esri:25700 3 -0x1.28627298d3894p7 0x1.4p2 +REG esri:25700 4 -0x1.14627298d3894p7 0x1.4p2 +REG esri:2571 0 0x1.44p7 0x0.0p0 +REG esri:2571 1 0x1.3ap7 -0x1.4p2 +REG esri:2571 2 0x1.4ep7 -0x1.4p2 +REG esri:2571 3 0x1.3ap7 0x1.4p2 +REG esri:2571 4 0x1.4ep7 0x1.4p2 +REG esri:2572 0 0x1.4ap7 0x0.0p0 +REG esri:2572 1 0x1.4p7 -0x1.4p2 +REG esri:2572 2 0x1.54p7 -0x1.4p2 +REG esri:2572 3 0x1.4p7 0x1.4p2 +REG esri:2572 4 0x1.54p7 0x1.4p2 +REG esri:2573 0 0x1.5p7 0x0.0p0 +REG esri:2573 1 0x1.46p7 -0x1.4p2 +REG esri:2573 2 0x1.5ap7 -0x1.4p2 +REG esri:2573 3 0x1.46p7 0x1.4p2 +REG esri:2573 4 0x1.5ap7 0x1.4p2 +REG esri:2574 0 0x1.56p7 0x0.0p0 +REG esri:2574 1 0x1.4cp7 -0x1.4p2 +REG esri:2574 2 0x1.6p7 -0x1.4p2 +REG esri:2574 3 0x1.4cp7 0x1.4p2 +REG esri:2574 4 0x1.6p7 0x1.4p2 +REG esri:2575 0 0x1.5cp7 0x0.0p0 +REG esri:2575 1 0x1.52p7 -0x1.4p2 +REG esri:2575 2 0x1.66p7 -0x1.4p2 +REG esri:2575 3 0x1.52p7 0x1.4p2 +REG esri:2575 4 0x1.66p7 0x1.4p2 +REG esri:2576 0 0x1.62p7 0x0.0p0 +REG esri:2576 1 0x1.58p7 -0x1.4p2 +REG esri:2576 2 -0x1.64p7 -0x1.4p2 +REG esri:2576 3 0x1.58p7 0x1.4p2 +REG esri:2576 4 -0x1.64p7 0x1.4p2 +REG esri:2577 0 -0x1.68p7 0x0.0p0 +REG esri:2577 1 0x1.5ep7 -0x1.4p2 +REG esri:2577 2 -0x1.5ep7 -0x1.4p2 +REG esri:2577 3 0x1.5ep7 0x1.4p2 +REG esri:2577 4 -0x1.5ep7 0x1.4p2 +REG esri:2578 0 -0x1.62p7 0x0.0p0 +REG esri:2578 1 0x1.64p7 -0x1.4p2 +REG esri:2578 2 -0x1.58p7 -0x1.4p2 +REG esri:2578 3 0x1.64p7 0x1.4p2 +REG esri:2578 4 -0x1.58p7 0x1.4p2 +REG esri:2579 0 -0x1.5cp7 0x0.0p0 +REG esri:2579 1 -0x1.66p7 -0x1.4p2 +REG esri:2579 2 -0x1.52p7 -0x1.4p2 +REG esri:2579 3 -0x1.66p7 0x1.4p2 +REG esri:2579 4 -0x1.52p7 0x1.4p2 +REG esri:2580 0 -0x1.56p7 0x0.0p0 +REG esri:2580 1 -0x1.6p7 -0x1.4p2 +REG esri:2580 2 -0x1.4cp7 -0x1.4p2 +REG esri:2580 3 -0x1.6p7 0x1.4p2 +REG esri:2580 4 -0x1.4cp7 0x1.4p2 +REG esri:2581 0 -0x1.5p7 0x0.0p0 +REG esri:2581 1 -0x1.5ap7 -0x1.4p2 +REG esri:2581 2 -0x1.46p7 -0x1.4p2 +REG esri:2581 3 -0x1.5ap7 0x1.4p2 +REG esri:2581 4 -0x1.46p7 0x1.4p2 +REG esri:2582 0 0x1.5p4 0x0.0p0 +REG esri:2582 1 0x1.0p4 -0x1.4p2 +REG esri:2582 2 0x1.ap4 -0x1.4p2 +REG esri:2582 3 0x1.0p4 0x1.4p2 +REG esri:2582 4 0x1.ap4 0x1.4p2 +REG esri:25828 0 -0x1.ep3 0x0.0p0 +REG esri:25828 1 -0x1.4p4 -0x1.4p2 +REG esri:25828 2 -0x1.4p3 -0x1.4p2 +REG esri:25828 3 -0x1.4p4 0x1.4p2 +REG esri:25828 4 -0x1.4p3 0x1.4p2 +REG esri:25829 0 -0x1.2p3 0x0.0p0 +REG esri:25829 1 -0x1.cp3 -0x1.4p2 +REG esri:25829 2 -0x1.0p2 -0x1.4p2 +REG esri:25829 3 -0x1.cp3 0x1.4p2 +REG esri:25829 4 -0x1.0p2 0x1.4p2 +REG esri:2583 0 0x1.8p4 0x0.0p0 +REG esri:2583 1 0x1.3p4 -0x1.4p2 +REG esri:2583 2 0x1.dp4 -0x1.4p2 +REG esri:2583 3 0x1.3p4 0x1.4p2 +REG esri:2583 4 0x1.dp4 0x1.4p2 +REG esri:25830 0 -0x1.8p1 0x0.0p0 +REG esri:25830 1 -0x1.0p3 -0x1.4p2 +REG esri:25830 2 0x1.0p1 -0x1.4p2 +REG esri:25830 3 -0x1.0p3 0x1.4p2 +REG esri:25830 4 0x1.0p1 0x1.4p2 +REG esri:25831 0 0x1.8p1 0x0.0p0 +REG esri:25831 1 -0x1.0p1 -0x1.4p2 +REG esri:25831 2 0x1.0p3 -0x1.4p2 +REG esri:25831 3 -0x1.0p1 0x1.4p2 +REG esri:25831 4 0x1.0p3 0x1.4p2 +REG esri:25832 0 0x1.2p3 0x0.0p0 +REG esri:25832 1 0x1.0p2 -0x1.4p2 +REG esri:25832 2 0x1.cp3 -0x1.4p2 +REG esri:25832 3 0x1.0p2 0x1.4p2 +REG esri:25832 4 0x1.cp3 0x1.4p2 +REG esri:25833 0 0x1.ep3 0x0.0p0 +REG esri:25833 1 0x1.4p3 -0x1.4p2 +REG esri:25833 2 0x1.4p4 -0x1.4p2 +REG esri:25833 3 0x1.4p3 0x1.4p2 +REG esri:25833 4 0x1.4p4 0x1.4p2 +REG esri:25834 0 0x1.5p4 0x0.0p0 +REG esri:25834 1 0x1.0p4 -0x1.4p2 +REG esri:25834 2 0x1.ap4 -0x1.4p2 +REG esri:25834 3 0x1.0p4 0x1.4p2 +REG esri:25834 4 0x1.ap4 0x1.4p2 +REG esri:25835 0 0x1.bp4 0x0.0p0 +REG esri:25835 1 0x1.6p4 -0x1.4p2 +REG esri:25835 2 0x1.0p5 -0x1.4p2 +REG esri:25835 3 0x1.6p4 0x1.4p2 +REG esri:25835 4 0x1.0p5 0x1.4p2 +REG esri:25836 0 0x1.08p5 0x0.0p0 +REG esri:25836 1 0x1.cp4 -0x1.4p2 +REG esri:25836 2 0x1.3p5 -0x1.4p2 +REG esri:25836 3 0x1.cp4 0x1.4p2 +REG esri:25836 4 0x1.3p5 0x1.4p2 +REG esri:25837 0 0x1.38p5 0x0.0p0 +REG esri:25837 1 0x1.1p5 -0x1.4p2 +REG esri:25837 2 0x1.6p5 -0x1.4p2 +REG esri:25837 3 0x1.1p5 0x1.4p2 +REG esri:25837 4 0x1.6p5 0x1.4p2 +REG esri:25838 0 0x1.68p5 0x0.0p0 +REG esri:25838 1 0x1.4p5 -0x1.4p2 +REG esri:25838 2 0x1.9p5 -0x1.4p2 +REG esri:25838 3 0x1.4p5 0x1.4p2 +REG esri:25838 4 0x1.9p5 0x1.4p2 +REG esri:2584 0 0x1.bp4 0x0.0p0 +REG esri:2584 1 0x1.6p4 -0x1.4p2 +REG esri:2584 2 0x1.0p5 -0x1.4p2 +REG esri:2584 3 0x1.6p4 0x1.4p2 +REG esri:2584 4 0x1.0p5 0x1.4p2 +REG esri:2585 0 0x1.ep4 0x0.0p0 +REG esri:2585 1 0x1.9p4 -0x1.4p2 +REG esri:2585 2 0x1.18p5 -0x1.4p2 +REG esri:2585 3 0x1.9p4 0x1.4p2 +REG esri:2585 4 0x1.18p5 0x1.4p2 +REG esri:2586 0 0x1.08p5 0x0.0p0 +REG esri:2586 1 0x1.cp4 -0x1.4p2 +REG esri:2586 2 0x1.3p5 -0x1.4p2 +REG esri:2586 3 0x1.cp4 0x1.4p2 +REG esri:2586 4 0x1.3p5 0x1.4p2 +REG esri:2587 0 0x1.2p5 0x0.0p0 +REG esri:2587 1 0x1.fp4 -0x1.4p2 +REG esri:2587 2 0x1.48p5 -0x1.4p2 +REG esri:2587 3 0x1.fp4 0x1.4p2 +REG esri:2587 4 0x1.48p5 0x1.4p2 +REG esri:2588 0 0x1.38p5 0x0.0p0 +REG esri:2588 1 0x1.1p5 -0x1.4p2 +REG esri:2588 2 0x1.6p5 -0x1.4p2 +REG esri:2588 3 0x1.1p5 0x1.4p2 +REG esri:2588 4 0x1.6p5 0x1.4p2 +REG esri:25884 0 0x1.8p4 0x0.0p0 +REG esri:25884 1 0x1.3p4 -0x1.4p2 +REG esri:25884 2 0x1.dp4 -0x1.4p2 +REG esri:25884 3 0x1.3p4 0x1.4p2 +REG esri:25884 4 0x1.dp4 0x1.4p2 +REG esri:2589 0 0x1.5p5 0x0.0p0 +REG esri:2589 1 0x1.28p5 -0x1.4p2 +REG esri:2589 2 0x1.78p5 -0x1.4p2 +REG esri:2589 3 0x1.28p5 0x1.4p2 +REG esri:2589 4 0x1.78p5 0x1.4p2 +REG esri:2590 0 0x1.68p5 0x0.0p0 +REG esri:2590 1 0x1.4p5 -0x1.4p2 +REG esri:2590 2 0x1.9p5 -0x1.4p2 +REG esri:2590 3 0x1.4p5 0x1.4p2 +REG esri:2590 4 0x1.9p5 0x1.4p2 +REG esri:2591 0 0x1.8p5 0x0.0p0 +REG esri:2591 1 0x1.58p5 -0x1.4p2 +REG esri:2591 2 0x1.a8p5 -0x1.4p2 +REG esri:2591 3 0x1.58p5 0x1.4p2 +REG esri:2591 4 0x1.a8p5 0x1.4p2 +REG esri:2592 0 0x1.98p5 0x0.0p0 +REG esri:2592 1 0x1.7p5 -0x1.4p2 +REG esri:2592 2 0x1.cp5 -0x1.4p2 +REG esri:2592 3 0x1.7p5 0x1.4p2 +REG esri:2592 4 0x1.cp5 0x1.4p2 +REG esri:2593 0 0x1.bp5 0x0.0p0 +REG esri:2593 1 0x1.88p5 -0x1.4p2 +REG esri:2593 2 0x1.d8p5 -0x1.4p2 +REG esri:2593 3 0x1.88p5 0x1.4p2 +REG esri:2593 4 0x1.d8p5 0x1.4p2 +REG esri:25932 0 0x1.2p3 -0x1.9p4 +REG esri:25932 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:25932 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:25932 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:25932 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:2594 0 0x1.c8p5 0x0.0p0 +REG esri:2594 1 0x1.ap5 -0x1.4p2 +REG esri:2594 2 0x1.fp5 -0x1.4p2 +REG esri:2594 3 0x1.ap5 0x1.4p2 +REG esri:2594 4 0x1.fp5 0x1.4p2 +REG esri:2595 0 0x1.ep5 0x0.0p0 +REG esri:2595 1 0x1.b8p5 -0x1.4p2 +REG esri:2595 2 0x1.04p6 -0x1.4p2 +REG esri:2595 3 0x1.b8p5 0x1.4p2 +REG esri:2595 4 0x1.04p6 0x1.4p2 +REG esri:2596 0 0x1.f8p5 0x0.0p0 +REG esri:2596 1 0x1.dp5 -0x1.4p2 +REG esri:2596 2 0x1.1p6 -0x1.4p2 +REG esri:2596 3 0x1.dp5 0x1.4p2 +REG esri:2596 4 0x1.1p6 0x1.4p2 +REG esri:2597 0 0x1.08p6 0x0.0p0 +REG esri:2597 1 0x1.e8p5 -0x1.4p2 +REG esri:2597 2 0x1.1cp6 -0x1.4p2 +REG esri:2597 3 0x1.e8p5 0x1.4p2 +REG esri:2597 4 0x1.1cp6 0x1.4p2 +REG esri:2598 0 0x1.14p6 0x0.0p0 +REG esri:2598 1 0x1.0p6 -0x1.4p2 +REG esri:2598 2 0x1.28p6 -0x1.4p2 +REG esri:2598 3 0x1.0p6 0x1.4p2 +REG esri:2598 4 0x1.28p6 0x1.4p2 +REG esri:2599 0 0x1.2p6 0x0.0p0 +REG esri:2599 1 0x1.0cp6 -0x1.4p2 +REG esri:2599 2 0x1.34p6 -0x1.4p2 +REG esri:2599 3 0x1.0cp6 0x1.4p2 +REG esri:2599 4 0x1.34p6 0x1.4p2 +REG esri:2600 0 0x1.8p4 0x0.0p0 +REG esri:2600 1 0x1.3p4 -0x1.4p2 +REG esri:2600 2 0x1.dp4 -0x1.4p2 +REG esri:2600 3 0x1.3p4 0x1.4p2 +REG esri:2600 4 0x1.dp4 0x1.4p2 +REG esri:2601 0 0x1.2cp6 0x0.0p0 +REG esri:2601 1 0x1.18p6 -0x1.4p2 +REG esri:2601 2 0x1.4p6 -0x1.4p2 +REG esri:2601 3 0x1.18p6 0x1.4p2 +REG esri:2601 4 0x1.4p6 0x1.4p2 +REG esri:2602 0 0x1.38p6 0x0.0p0 +REG esri:2602 1 0x1.24p6 -0x1.4p2 +REG esri:2602 2 0x1.4cp6 -0x1.4p2 +REG esri:2602 3 0x1.24p6 0x1.4p2 +REG esri:2602 4 0x1.4cp6 0x1.4p2 +REG esri:2603 0 0x1.44p6 0x0.0p0 +REG esri:2603 1 0x1.3p6 -0x1.4p2 +REG esri:2603 2 0x1.58p6 -0x1.4p2 +REG esri:2603 3 0x1.3p6 0x1.4p2 +REG esri:2603 4 0x1.58p6 0x1.4p2 +REG esri:2604 0 0x1.5p6 0x0.0p0 +REG esri:2604 1 0x1.3cp6 -0x1.4p2 +REG esri:2604 2 0x1.64p6 -0x1.4p2 +REG esri:2604 3 0x1.3cp6 0x1.4p2 +REG esri:2604 4 0x1.64p6 0x1.4p2 +REG esri:2605 0 0x1.5cp6 0x0.0p0 +REG esri:2605 1 0x1.48p6 -0x1.4p2 +REG esri:2605 2 0x1.7p6 -0x1.4p2 +REG esri:2605 3 0x1.48p6 0x1.4p2 +REG esri:2605 4 0x1.7p6 0x1.4p2 +REG esri:2606 0 0x1.68p6 0x0.0p0 +REG esri:2606 1 0x1.54p6 -0x1.4p2 +REG esri:2606 2 0x1.7cp6 -0x1.4p2 +REG esri:2606 3 0x1.54p6 0x1.4p2 +REG esri:2606 4 0x1.7cp6 0x1.4p2 +REG esri:2607 0 0x1.74p6 0x0.0p0 +REG esri:2607 1 0x1.6p6 -0x1.4p2 +REG esri:2607 2 0x1.88p6 -0x1.4p2 +REG esri:2607 3 0x1.6p6 0x1.4p2 +REG esri:2607 4 0x1.88p6 0x1.4p2 +REG esri:2608 0 0x1.8p6 0x0.0p0 +REG esri:2608 1 0x1.6cp6 -0x1.4p2 +REG esri:2608 2 0x1.94p6 -0x1.4p2 +REG esri:2608 3 0x1.6cp6 0x1.4p2 +REG esri:2608 4 0x1.94p6 0x1.4p2 +REG esri:2609 0 0x1.8cp6 0x0.0p0 +REG esri:2609 1 0x1.78p6 -0x1.4p2 +REG esri:2609 2 0x1.ap6 -0x1.4p2 +REG esri:2609 3 0x1.78p6 0x1.4p2 +REG esri:2609 4 0x1.ap6 0x1.4p2 +REG esri:2610 0 0x1.98p6 0x0.0p0 +REG esri:2610 1 0x1.84p6 -0x1.4p2 +REG esri:2610 2 0x1.acp6 -0x1.4p2 +REG esri:2610 3 0x1.84p6 0x1.4p2 +REG esri:2610 4 0x1.acp6 0x1.4p2 +REG esri:2611 0 0x1.a4p6 0x0.0p0 +REG esri:2611 1 0x1.9p6 -0x1.4p2 +REG esri:2611 2 0x1.b8p6 -0x1.4p2 +REG esri:2611 3 0x1.9p6 0x1.4p2 +REG esri:2611 4 0x1.b8p6 0x1.4p2 +REG esri:2612 0 0x1.bp6 0x0.0p0 +REG esri:2612 1 0x1.9cp6 -0x1.4p2 +REG esri:2612 2 0x1.c4p6 -0x1.4p2 +REG esri:2612 3 0x1.9cp6 0x1.4p2 +REG esri:2612 4 0x1.c4p6 0x1.4p2 +REG esri:2613 0 0x1.bcp6 0x0.0p0 +REG esri:2613 1 0x1.a8p6 -0x1.4p2 +REG esri:2613 2 0x1.dp6 -0x1.4p2 +REG esri:2613 3 0x1.a8p6 0x1.4p2 +REG esri:2613 4 0x1.dp6 0x1.4p2 +REG esri:2614 0 0x1.c8p6 0x0.0p0 +REG esri:2614 1 0x1.b4p6 -0x1.4p2 +REG esri:2614 2 0x1.dcp6 -0x1.4p2 +REG esri:2614 3 0x1.b4p6 0x1.4p2 +REG esri:2614 4 0x1.dcp6 0x1.4p2 +REG esri:2615 0 0x1.d4p6 0x0.0p0 +REG esri:2615 1 0x1.cp6 -0x1.4p2 +REG esri:2615 2 0x1.e8p6 -0x1.4p2 +REG esri:2615 3 0x1.cp6 0x1.4p2 +REG esri:2615 4 0x1.e8p6 0x1.4p2 +REG esri:2616 0 0x1.ep6 0x0.0p0 +REG esri:2616 1 0x1.ccp6 -0x1.4p2 +REG esri:2616 2 0x1.f4p6 -0x1.4p2 +REG esri:2616 3 0x1.ccp6 0x1.4p2 +REG esri:2616 4 0x1.f4p6 0x1.4p2 +REG esri:2617 0 0x1.ecp6 0x0.0p0 +REG esri:2617 1 0x1.d8p6 -0x1.4p2 +REG esri:2617 2 0x1.0p7 -0x1.4p2 +REG esri:2617 3 0x1.d8p6 0x1.4p2 +REG esri:2617 4 0x1.0p7 0x1.4p2 +REG esri:2618 0 0x1.f8p6 0x0.0p0 +REG esri:2618 1 0x1.e4p6 -0x1.4p2 +REG esri:2618 2 0x1.06p7 -0x1.4p2 +REG esri:2618 3 0x1.e4p6 0x1.4p2 +REG esri:2618 4 0x1.06p7 0x1.4p2 +REG esri:2619 0 0x1.02p7 0x0.0p0 +REG esri:2619 1 0x1.fp6 -0x1.4p2 +REG esri:2619 2 0x1.0cp7 -0x1.4p2 +REG esri:2619 3 0x1.fp6 0x1.4p2 +REG esri:2619 4 0x1.0cp7 0x1.4p2 +REG esri:26191 0 -0x1.599999999999ap2 0x1.0a66666666666p5 +REG esri:26191 1 -0x1.6c3b4ece0123bp3 0x1.c4cccccccccccp4 +REG esri:26191 2 0x1.2a1b534678a1p-1 0x1.c4cccccccccccp4 +REG esri:26191 3 -0x1.6c3b4ece0123bp3 0x1.3266666666666p5 +REG esri:26191 4 0x1.2a1b534678a1p-1 0x1.3266666666666p5 +REG esri:26192 0 -0x1.599999999999ap2 0x1.db33333333333p4 +REG esri:26192 1 -0x1.64ff6ec44c13ap3 0x1.8b33333333333p4 +REG esri:26192 2 0x1.6cbaa5564f4p-2 0x1.8b33333333333p4 +REG esri:26192 3 -0x1.64ff6ec44c13ap3 0x1.159999999999ap5 +REG esri:26192 4 0x1.6cbaa5564f4p-2 0x1.159999999999ap5 +REG esri:26193 0 -0x1.599999999999ap2 0x1.a19999999999ap4 +REG esri:26193 1 -0x1.5ef7df1d0876ap3 0x1.519999999999ap4 +REG esri:26193 2 0x1.579160dbb73ep-3 0x1.519999999999ap4 +REG esri:26193 3 -0x1.5ef7df1d0876ap3 0x1.f19999999999ap4 +REG esri:26193 4 0x1.579160dbb73ep-3 0x1.f19999999999ap4 +REG esri:2620 0 0x1.08p7 0x0.0p0 +REG esri:2620 1 0x1.fcp6 -0x1.4p2 +REG esri:2620 2 0x1.12p7 -0x1.4p2 +REG esri:2620 3 0x1.fcp6 0x1.4p2 +REG esri:2620 4 0x1.12p7 0x1.4p2 +REG esri:2621 0 0x1.0ep7 0x0.0p0 +REG esri:2621 1 0x1.04p7 -0x1.4p2 +REG esri:2621 2 0x1.18p7 -0x1.4p2 +REG esri:2621 3 0x1.04p7 0x1.4p2 +REG esri:2621 4 0x1.18p7 0x1.4p2 +REG esri:2622 0 0x1.14p7 0x0.0p0 +REG esri:2622 1 0x1.0ap7 -0x1.4p2 +REG esri:2622 2 0x1.1ep7 -0x1.4p2 +REG esri:2622 3 0x1.0ap7 0x1.4p2 +REG esri:2622 4 0x1.1ep7 0x1.4p2 +REG esri:2623 0 0x1.1ap7 0x0.0p0 +REG esri:2623 1 0x1.1p7 -0x1.4p2 +REG esri:2623 2 0x1.24p7 -0x1.4p2 +REG esri:2623 3 0x1.1p7 0x1.4p2 +REG esri:2623 4 0x1.24p7 0x1.4p2 +REG esri:26237 0 0x1.38p5 0x0.0p0 +REG esri:26237 1 0x1.1p5 -0x1.4p2 +REG esri:26237 2 0x1.6p5 -0x1.4p2 +REG esri:26237 3 0x1.1p5 0x1.4p2 +REG esri:26237 4 0x1.6p5 0x1.4p2 +REG esri:2624 0 0x1.2p7 0x0.0p0 +REG esri:2624 1 0x1.16p7 -0x1.4p2 +REG esri:2624 2 0x1.2ap7 -0x1.4p2 +REG esri:2624 3 0x1.16p7 0x1.4p2 +REG esri:2624 4 0x1.2ap7 0x1.4p2 +REG esri:2625 0 0x1.26p7 0x0.0p0 +REG esri:2625 1 0x1.1cp7 -0x1.4p2 +REG esri:2625 2 0x1.3p7 -0x1.4p2 +REG esri:2625 3 0x1.1cp7 0x1.4p2 +REG esri:2625 4 0x1.3p7 0x1.4p2 +REG esri:2626 0 0x1.2cp7 0x0.0p0 +REG esri:2626 1 0x1.22p7 -0x1.4p2 +REG esri:2626 2 0x1.36p7 -0x1.4p2 +REG esri:2626 3 0x1.22p7 0x1.4p2 +REG esri:2626 4 0x1.36p7 0x1.4p2 +REG esri:2627 0 0x1.32p7 0x0.0p0 +REG esri:2627 1 0x1.28p7 -0x1.4p2 +REG esri:2627 2 0x1.3cp7 -0x1.4p2 +REG esri:2627 3 0x1.28p7 0x1.4p2 +REG esri:2627 4 0x1.3cp7 0x1.4p2 +REG esri:2628 0 0x1.38p7 0x0.0p0 +REG esri:2628 1 0x1.2ep7 -0x1.4p2 +REG esri:2628 2 0x1.42p7 -0x1.4p2 +REG esri:2628 3 0x1.2ep7 0x1.4p2 +REG esri:2628 4 0x1.42p7 0x1.4p2 +REG esri:2629 0 0x1.3ep7 0x0.0p0 +REG esri:2629 1 0x1.34p7 -0x1.4p2 +REG esri:2629 2 0x1.48p7 -0x1.4p2 +REG esri:2629 3 0x1.34p7 0x1.4p2 +REG esri:2629 4 0x1.48p7 0x1.4p2 +REG esri:2630 0 0x1.44p7 0x0.0p0 +REG esri:2630 1 0x1.3ap7 -0x1.4p2 +REG esri:2630 2 0x1.4ep7 -0x1.4p2 +REG esri:2630 3 0x1.3ap7 0x1.4p2 +REG esri:2630 4 0x1.4ep7 0x1.4p2 +REG esri:2631 0 0x1.4ap7 0x0.0p0 +REG esri:2631 1 0x1.4p7 -0x1.4p2 +REG esri:2631 2 0x1.54p7 -0x1.4p2 +REG esri:2631 3 0x1.4p7 0x1.4p2 +REG esri:2631 4 0x1.54p7 0x1.4p2 +REG esri:2632 0 0x1.5p7 0x0.0p0 +REG esri:2632 1 0x1.46p7 -0x1.4p2 +REG esri:2632 2 0x1.5ap7 -0x1.4p2 +REG esri:2632 3 0x1.46p7 0x1.4p2 +REG esri:2632 4 0x1.5ap7 0x1.4p2 +REG esri:2633 0 0x1.56p7 0x0.0p0 +REG esri:2633 1 0x1.4cp7 -0x1.4p2 +REG esri:2633 2 0x1.6p7 -0x1.4p2 +REG esri:2633 3 0x1.4cp7 0x1.4p2 +REG esri:2633 4 0x1.6p7 0x1.4p2 +REG esri:26331 0 0x1.8p1 0x0.0p0 +REG esri:26331 1 -0x1.0p1 -0x1.4p2 +REG esri:26331 2 0x1.0p3 -0x1.4p2 +REG esri:26331 3 -0x1.0p1 0x1.4p2 +REG esri:26331 4 0x1.0p3 0x1.4p2 +REG esri:26332 0 0x1.2p3 0x0.0p0 +REG esri:26332 1 0x1.0p2 -0x1.4p2 +REG esri:26332 2 0x1.cp3 -0x1.4p2 +REG esri:26332 3 0x1.0p2 0x1.4p2 +REG esri:26332 4 0x1.cp3 0x1.4p2 +REG esri:2634 0 0x1.5cp7 0x0.0p0 +REG esri:2634 1 0x1.52p7 -0x1.4p2 +REG esri:2634 2 0x1.66p7 -0x1.4p2 +REG esri:2634 3 0x1.52p7 0x1.4p2 +REG esri:2634 4 0x1.66p7 0x1.4p2 +REG esri:2635 0 0x1.62p7 0x0.0p0 +REG esri:2635 1 0x1.58p7 -0x1.4p2 +REG esri:2635 2 -0x1.64p7 -0x1.4p2 +REG esri:2635 3 0x1.58p7 0x1.4p2 +REG esri:2635 4 -0x1.64p7 0x1.4p2 +REG esri:2636 0 -0x1.68p7 0x0.0p0 +REG esri:2636 1 0x1.5ep7 -0x1.4p2 +REG esri:2636 2 -0x1.5ep7 -0x1.4p2 +REG esri:2636 3 0x1.5ep7 0x1.4p2 +REG esri:2636 4 -0x1.5ep7 0x1.4p2 +REG esri:2637 0 -0x1.62p7 0x0.0p0 +REG esri:2637 1 0x1.64p7 -0x1.4p2 +REG esri:2637 2 -0x1.58p7 -0x1.4p2 +REG esri:2637 3 0x1.64p7 0x1.4p2 +REG esri:2637 4 -0x1.58p7 0x1.4p2 +REG esri:2638 0 -0x1.5cp7 0x0.0p0 +REG esri:2638 1 -0x1.66p7 -0x1.4p2 +REG esri:2638 2 -0x1.52p7 -0x1.4p2 +REG esri:2638 3 -0x1.66p7 0x1.4p2 +REG esri:2638 4 -0x1.52p7 0x1.4p2 +REG esri:2639 0 -0x1.56p7 0x0.0p0 +REG esri:2639 1 -0x1.6p7 -0x1.4p2 +REG esri:2639 2 -0x1.4cp7 -0x1.4p2 +REG esri:2639 3 -0x1.6p7 0x1.4p2 +REG esri:2639 4 -0x1.4cp7 0x1.4p2 +REG esri:26391 0 0x1.2p2 0x1.0p2 +REG esri:26391 1 -0x1.06405283fced8p-1 -0x1.0p0 +REG esri:26391 2 0x1.306405283fceep3 -0x1.0p0 +REG esri:26391 3 -0x1.06405283fced8p-1 0x1.2p3 +REG esri:26391 4 0x1.306405283fceep3 0x1.2p3 +REG esri:26392 0 0x1.1p3 0x1.0p2 +REG esri:26392 1 0x1.be6feb5f00c4ap1 -0x1.0p0 +REG esri:26392 2 0x1.b06405283fceep3 -0x1.0p0 +REG esri:26392 3 0x1.be6feb5f00c4ap1 0x1.2p3 +REG esri:26392 4 0x1.b06405283fceep3 0x1.2p3 +REG esri:26393 0 0x1.9p3 0x1.0p2 +REG esri:26393 1 0x1.df37f5af80625p2 -0x1.0p0 +REG esri:26393 2 0x1.183202941fe77p4 -0x1.0p0 +REG esri:26393 3 0x1.df37f5af80625p2 0x1.2p3 +REG esri:26393 4 0x1.183202941fe77p4 0x1.2p3 +REG esri:2640 0 -0x1.5p7 0x0.0p0 +REG esri:2640 1 -0x1.5ap7 -0x1.4p2 +REG esri:2640 2 -0x1.46p7 -0x1.4p2 +REG esri:2640 3 -0x1.5ap7 0x1.4p2 +REG esri:2640 4 -0x1.46p7 0x1.4p2 +REG esri:2641 0 0x1.5p4 0x0.0p0 +REG esri:2641 1 0x1.0p4 -0x1.4p2 +REG esri:2641 2 0x1.ap4 -0x1.4p2 +REG esri:2641 3 0x1.0p4 0x1.4p2 +REG esri:2641 4 0x1.ap4 0x1.4p2 +REG esri:2642 0 0x1.8p4 0x0.0p0 +REG esri:2642 1 0x1.3p4 -0x1.4p2 +REG esri:2642 2 0x1.dp4 -0x1.4p2 +REG esri:2642 3 0x1.3p4 0x1.4p2 +REG esri:2642 4 0x1.dp4 0x1.4p2 +REG esri:2643 0 0x1.bp4 0x0.0p0 +REG esri:2643 1 0x1.6p4 -0x1.4p2 +REG esri:2643 2 0x1.0p5 -0x1.4p2 +REG esri:2643 3 0x1.6p4 0x1.4p2 +REG esri:2643 4 0x1.0p5 0x1.4p2 +REG esri:26432 0 0x1.2p3 -0x1.9p4 +REG esri:26432 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:26432 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:26432 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:26432 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:2644 0 0x1.ep4 0x0.0p0 +REG esri:2644 1 0x1.9p4 -0x1.4p2 +REG esri:2644 2 0x1.18p5 -0x1.4p2 +REG esri:2644 3 0x1.9p4 0x1.4p2 +REG esri:2644 4 0x1.18p5 0x1.4p2 +REG esri:2645 0 0x1.08p5 0x0.0p0 +REG esri:2645 1 0x1.cp4 -0x1.4p2 +REG esri:2645 2 0x1.3p5 -0x1.4p2 +REG esri:2645 3 0x1.cp4 0x1.4p2 +REG esri:2645 4 0x1.3p5 0x1.4p2 +REG esri:2646 0 0x1.2p5 0x0.0p0 +REG esri:2646 1 0x1.fp4 -0x1.4p2 +REG esri:2646 2 0x1.48p5 -0x1.4p2 +REG esri:2646 3 0x1.fp4 0x1.4p2 +REG esri:2646 4 0x1.48p5 0x1.4p2 +REG esri:2647 0 0x1.38p5 0x0.0p0 +REG esri:2647 1 0x1.1p5 -0x1.4p2 +REG esri:2647 2 0x1.6p5 -0x1.4p2 +REG esri:2647 3 0x1.1p5 0x1.4p2 +REG esri:2647 4 0x1.6p5 0x1.4p2 +REG esri:2648 0 0x1.5p5 0x0.0p0 +REG esri:2648 1 0x1.28p5 -0x1.4p2 +REG esri:2648 2 0x1.78p5 -0x1.4p2 +REG esri:2648 3 0x1.28p5 0x1.4p2 +REG esri:2648 4 0x1.78p5 0x1.4p2 +REG esri:2649 0 0x1.68p5 0x0.0p0 +REG esri:2649 1 0x1.4p5 -0x1.4p2 +REG esri:2649 2 0x1.9p5 -0x1.4p2 +REG esri:2649 3 0x1.4p5 0x1.4p2 +REG esri:2649 4 0x1.9p5 0x1.4p2 +REG esri:2650 0 0x1.8p5 0x0.0p0 +REG esri:2650 1 0x1.58p5 -0x1.4p2 +REG esri:2650 2 0x1.a8p5 -0x1.4p2 +REG esri:2650 3 0x1.58p5 0x1.4p2 +REG esri:2650 4 0x1.a8p5 0x1.4p2 +REG esri:2651 0 0x1.98p5 0x0.0p0 +REG esri:2651 1 0x1.7p5 -0x1.4p2 +REG esri:2651 2 0x1.cp5 -0x1.4p2 +REG esri:2651 3 0x1.7p5 0x1.4p2 +REG esri:2651 4 0x1.cp5 0x1.4p2 +REG esri:2652 0 0x1.bp5 0x0.0p0 +REG esri:2652 1 0x1.88p5 -0x1.4p2 +REG esri:2652 2 0x1.d8p5 -0x1.4p2 +REG esri:2652 3 0x1.88p5 0x1.4p2 +REG esri:2652 4 0x1.d8p5 0x1.4p2 +REG esri:2653 0 0x1.c8p5 0x0.0p0 +REG esri:2653 1 0x1.ap5 -0x1.4p2 +REG esri:2653 2 0x1.fp5 -0x1.4p2 +REG esri:2653 3 0x1.ap5 0x1.4p2 +REG esri:2653 4 0x1.fp5 0x1.4p2 +REG esri:2654 0 0x1.ep5 0x0.0p0 +REG esri:2654 1 0x1.b8p5 -0x1.4p2 +REG esri:2654 2 0x1.04p6 -0x1.4p2 +REG esri:2654 3 0x1.b8p5 0x1.4p2 +REG esri:2654 4 0x1.04p6 0x1.4p2 +REG esri:2655 0 0x1.f8p5 0x0.0p0 +REG esri:2655 1 0x1.dp5 -0x1.4p2 +REG esri:2655 2 0x1.1p6 -0x1.4p2 +REG esri:2655 3 0x1.dp5 0x1.4p2 +REG esri:2655 4 0x1.1p6 0x1.4p2 +REG esri:2656 0 0x1.08p6 0x0.0p0 +REG esri:2656 1 0x1.e8p5 -0x1.4p2 +REG esri:2656 2 0x1.1cp6 -0x1.4p2 +REG esri:2656 3 0x1.e8p5 0x1.4p2 +REG esri:2656 4 0x1.1cp6 0x1.4p2 +REG esri:2657 0 0x1.14p6 0x0.0p0 +REG esri:2657 1 0x1.0p6 -0x1.4p2 +REG esri:2657 2 0x1.28p6 -0x1.4p2 +REG esri:2657 3 0x1.0p6 0x1.4p2 +REG esri:2657 4 0x1.28p6 0x1.4p2 +REG esri:2658 0 0x1.2p6 0x0.0p0 +REG esri:2658 1 0x1.0cp6 -0x1.4p2 +REG esri:2658 2 0x1.34p6 -0x1.4p2 +REG esri:2658 3 0x1.0cp6 0x1.4p2 +REG esri:2658 4 0x1.34p6 0x1.4p2 +REG esri:2659 0 0x1.2cp6 0x0.0p0 +REG esri:2659 1 0x1.18p6 -0x1.4p2 +REG esri:2659 2 0x1.4p6 -0x1.4p2 +REG esri:2659 3 0x1.18p6 0x1.4p2 +REG esri:2659 4 0x1.4p6 0x1.4p2 +REG esri:26591 0 0x1.573cc1e098eacp4 0x0.0p0 +REG esri:26591 1 0x1.073cc1e098eacp4 -0x1.4p2 +REG esri:26591 2 0x1.a73cc1e098eacp4 -0x1.4p2 +REG esri:26591 3 0x1.073cc1e098eacp4 0x1.4p2 +REG esri:26591 4 0x1.a73cc1e098eacp4 0x1.4p2 +REG esri:26592 0 0x1.b73cc1e098eacp4 0x0.0p0 +REG esri:26592 1 0x1.673cc1e098eacp4 -0x1.4p2 +REG esri:26592 2 0x1.039e60f04c756p5 -0x1.4p2 +REG esri:26592 3 0x1.673cc1e098eacp4 0x1.4p2 +REG esri:26592 4 0x1.039e60f04c756p5 0x1.4p2 +REG esri:2660 0 0x1.38p6 0x0.0p0 +REG esri:2660 1 0x1.24p6 -0x1.4p2 +REG esri:2660 2 0x1.4cp6 -0x1.4p2 +REG esri:2660 3 0x1.24p6 0x1.4p2 +REG esri:2660 4 0x1.4cp6 0x1.4p2 +REG esri:2661 0 0x1.44p6 0x0.0p0 +REG esri:2661 1 0x1.3p6 -0x1.4p2 +REG esri:2661 2 0x1.58p6 -0x1.4p2 +REG esri:2661 3 0x1.3p6 0x1.4p2 +REG esri:2661 4 0x1.58p6 0x1.4p2 +REG esri:2662 0 0x1.5p6 0x0.0p0 +REG esri:2662 1 0x1.3cp6 -0x1.4p2 +REG esri:2662 2 0x1.64p6 -0x1.4p2 +REG esri:2662 3 0x1.3cp6 0x1.4p2 +REG esri:2662 4 0x1.64p6 0x1.4p2 +REG esri:2663 0 0x1.5cp6 0x0.0p0 +REG esri:2663 1 0x1.48p6 -0x1.4p2 +REG esri:2663 2 0x1.7p6 -0x1.4p2 +REG esri:2663 3 0x1.48p6 0x1.4p2 +REG esri:2663 4 0x1.7p6 0x1.4p2 +REG esri:26632 0 0x1.2p3 0x0.0p0 +REG esri:26632 1 0x1.0p2 -0x1.4p2 +REG esri:26632 2 0x1.cp3 -0x1.4p2 +REG esri:26632 3 0x1.0p2 0x1.4p2 +REG esri:26632 4 0x1.cp3 0x1.4p2 +REG esri:2664 0 0x1.68p6 0x0.0p0 +REG esri:2664 1 0x1.54p6 -0x1.4p2 +REG esri:2664 2 0x1.7cp6 -0x1.4p2 +REG esri:2664 3 0x1.54p6 0x1.4p2 +REG esri:2664 4 0x1.7cp6 0x1.4p2 +REG esri:2665 0 0x1.74p6 0x0.0p0 +REG esri:2665 1 0x1.6p6 -0x1.4p2 +REG esri:2665 2 0x1.88p6 -0x1.4p2 +REG esri:2665 3 0x1.6p6 0x1.4p2 +REG esri:2665 4 0x1.88p6 0x1.4p2 +REG esri:2666 0 0x1.8p6 0x0.0p0 +REG esri:2666 1 0x1.6cp6 -0x1.4p2 +REG esri:2666 2 0x1.94p6 -0x1.4p2 +REG esri:2666 3 0x1.6cp6 0x1.4p2 +REG esri:2666 4 0x1.94p6 0x1.4p2 +REG esri:2667 0 0x1.8cp6 0x0.0p0 +REG esri:2667 1 0x1.78p6 -0x1.4p2 +REG esri:2667 2 0x1.ap6 -0x1.4p2 +REG esri:2667 3 0x1.78p6 0x1.4p2 +REG esri:2667 4 0x1.ap6 0x1.4p2 +REG esri:2668 0 0x1.98p6 0x0.0p0 +REG esri:2668 1 0x1.84p6 -0x1.4p2 +REG esri:2668 2 0x1.acp6 -0x1.4p2 +REG esri:2668 3 0x1.84p6 0x1.4p2 +REG esri:2668 4 0x1.acp6 0x1.4p2 +REG esri:2669 0 0x1.a4p6 0x0.0p0 +REG esri:2669 1 0x1.9p6 -0x1.4p2 +REG esri:2669 2 0x1.b8p6 -0x1.4p2 +REG esri:2669 3 0x1.9p6 0x1.4p2 +REG esri:2669 4 0x1.b8p6 0x1.4p2 +REG esri:26692 0 0x1.2p3 -0x1.9p4 +REG esri:26692 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:26692 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:26692 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:26692 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:2670 0 0x1.bp6 0x0.0p0 +REG esri:2670 1 0x1.9cp6 -0x1.4p2 +REG esri:2670 2 0x1.c4p6 -0x1.4p2 +REG esri:2670 3 0x1.9cp6 0x1.4p2 +REG esri:2670 4 0x1.c4p6 0x1.4p2 +REG esri:26703 0 -0x1.4ap7 0x1.68p5 +REG esri:26703 1 -0x1.582463000f856p7 0x1.4p5 +REG esri:26703 2 -0x1.3bdb9cfff07aap7 0x1.4p5 +REG esri:26703 3 -0x1.582463000f856p7 0x1.9p5 +REG esri:26703 4 -0x1.3bdb9cfff07aap7 0x1.9p5 +REG esri:26704 0 -0x1.3ep7 0x1.68p5 +REG esri:26704 1 -0x1.4c2463000f856p7 0x1.4p5 +REG esri:26704 2 -0x1.2fdb9cfff07aap7 0x1.4p5 +REG esri:26704 3 -0x1.4c2463000f856p7 0x1.9p5 +REG esri:26704 4 -0x1.2fdb9cfff07aap7 0x1.9p5 +REG esri:26705 0 -0x1.32p7 0x1.68p5 +REG esri:26705 1 -0x1.402463000f856p7 0x1.4p5 +REG esri:26705 2 -0x1.23db9cfff07aap7 0x1.4p5 +REG esri:26705 3 -0x1.402463000f856p7 0x1.9p5 +REG esri:26705 4 -0x1.23db9cfff07aap7 0x1.9p5 +REG esri:26706 0 -0x1.26p7 0x1.68p5 +REG esri:26706 1 -0x1.342463000f856p7 0x1.4p5 +REG esri:26706 2 -0x1.17db9cfff07aap7 0x1.4p5 +REG esri:26706 3 -0x1.342463000f856p7 0x1.9p5 +REG esri:26706 4 -0x1.17db9cfff07aap7 0x1.9p5 +REG esri:26707 0 -0x1.1ap7 0x1.68p5 +REG esri:26707 1 -0x1.282463000f856p7 0x1.4p5 +REG esri:26707 2 -0x1.0bdb9cfff07aap7 0x1.4p5 +REG esri:26707 3 -0x1.282463000f856p7 0x1.9p5 +REG esri:26707 4 -0x1.0bdb9cfff07aap7 0x1.9p5 +REG esri:26708 0 -0x1.0ep7 0x1.68p5 +REG esri:26708 1 -0x1.1c2463000f856p7 0x1.4p5 +REG esri:26708 2 -0x1.ffb739ffe0f54p6 0x1.4p5 +REG esri:26708 3 -0x1.1c2463000f856p7 0x1.9p5 +REG esri:26708 4 -0x1.ffb739ffe0f54p6 0x1.9p5 +REG esri:26709 0 -0x1.02p7 0x1.68p5 +REG esri:26709 1 -0x1.102463000f856p7 0x1.4p5 +REG esri:26709 2 -0x1.e7b739ffe0f54p6 0x1.4p5 +REG esri:26709 3 -0x1.102463000f856p7 0x1.9p5 +REG esri:26709 4 -0x1.e7b739ffe0f54p6 0x1.9p5 +REG esri:2671 0 0x1.bcp6 0x0.0p0 +REG esri:2671 1 0x1.a8p6 -0x1.4p2 +REG esri:2671 2 0x1.dp6 -0x1.4p2 +REG esri:2671 3 0x1.a8p6 0x1.4p2 +REG esri:2671 4 0x1.dp6 0x1.4p2 +REG esri:26710 0 -0x1.ecp6 0x1.68p5 +REG esri:26710 1 -0x1.042463000f856p7 0x1.4p5 +REG esri:26710 2 -0x1.cfb739ffe0f54p6 0x1.4p5 +REG esri:26710 3 -0x1.042463000f856p7 0x1.9p5 +REG esri:26710 4 -0x1.cfb739ffe0f54p6 0x1.9p5 +REG esri:26711 0 -0x1.d4p6 0x1.68p5 +REG esri:26711 1 -0x1.f048c6001f0acp6 0x1.4p5 +REG esri:26711 2 -0x1.b7b739ffe0f54p6 0x1.4p5 +REG esri:26711 3 -0x1.f048c6001f0acp6 0x1.9p5 +REG esri:26711 4 -0x1.b7b739ffe0f54p6 0x1.9p5 +REG esri:26712 0 -0x1.bcp6 0x1.68p5 +REG esri:26712 1 -0x1.d848c6001f0acp6 0x1.4p5 +REG esri:26712 2 -0x1.9fb739ffe0f54p6 0x1.4p5 +REG esri:26712 3 -0x1.d848c6001f0acp6 0x1.9p5 +REG esri:26712 4 -0x1.9fb739ffe0f54p6 0x1.9p5 +REG esri:26713 0 -0x1.a4p6 0x1.68p5 +REG esri:26713 1 -0x1.c048c6001f0acp6 0x1.4p5 +REG esri:26713 2 -0x1.87b739ffe0f54p6 0x1.4p5 +REG esri:26713 3 -0x1.c048c6001f0acp6 0x1.9p5 +REG esri:26713 4 -0x1.87b739ffe0f54p6 0x1.9p5 +REG esri:26714 0 -0x1.8cp6 0x1.68p5 +REG esri:26714 1 -0x1.a848c6001f0acp6 0x1.4p5 +REG esri:26714 2 -0x1.6fb739ffe0f54p6 0x1.4p5 +REG esri:26714 3 -0x1.a848c6001f0acp6 0x1.9p5 +REG esri:26714 4 -0x1.6fb739ffe0f54p6 0x1.9p5 +REG esri:26715 0 -0x1.74p6 0x1.68p5 +REG esri:26715 1 -0x1.9048c6001f0acp6 0x1.4p5 +REG esri:26715 2 -0x1.57b739ffe0f54p6 0x1.4p5 +REG esri:26715 3 -0x1.9048c6001f0acp6 0x1.9p5 +REG esri:26715 4 -0x1.57b739ffe0f54p6 0x1.9p5 +REG esri:26716 0 -0x1.5cp6 0x1.68p5 +REG esri:26716 1 -0x1.7848c6001f0acp6 0x1.4p5 +REG esri:26716 2 -0x1.3fb739ffe0f54p6 0x1.4p5 +REG esri:26716 3 -0x1.7848c6001f0acp6 0x1.9p5 +REG esri:26716 4 -0x1.3fb739ffe0f54p6 0x1.9p5 +REG esri:26717 0 -0x1.44p6 0x1.68p5 +REG esri:26717 1 -0x1.6048c6001f0acp6 0x1.4p5 +REG esri:26717 2 -0x1.27b739ffe0f54p6 0x1.4p5 +REG esri:26717 3 -0x1.6048c6001f0acp6 0x1.9p5 +REG esri:26717 4 -0x1.27b739ffe0f54p6 0x1.9p5 +REG esri:26718 0 -0x1.2cp6 0x1.68p5 +REG esri:26718 1 -0x1.4848c6001f0acp6 0x1.4p5 +REG esri:26718 2 -0x1.0fb739ffe0f54p6 0x1.4p5 +REG esri:26718 3 -0x1.4848c6001f0acp6 0x1.9p5 +REG esri:26718 4 -0x1.0fb739ffe0f54p6 0x1.9p5 +REG esri:26719 0 -0x1.14p6 0x1.68p5 +REG esri:26719 1 -0x1.3048c6001f0acp6 0x1.4p5 +REG esri:26719 2 -0x1.ef6e73ffc1ea8p5 0x1.4p5 +REG esri:26719 3 -0x1.3048c6001f0acp6 0x1.9p5 +REG esri:26719 4 -0x1.ef6e73ffc1ea8p5 0x1.9p5 +REG esri:2672 0 0x1.c8p6 0x0.0p0 +REG esri:2672 1 0x1.b4p6 -0x1.4p2 +REG esri:2672 2 0x1.dcp6 -0x1.4p2 +REG esri:2672 3 0x1.b4p6 0x1.4p2 +REG esri:2672 4 0x1.dcp6 0x1.4p2 +REG esri:26720 0 -0x1.f8p5 0x1.68p5 +REG esri:26720 1 -0x1.1848c6001f0acp6 0x1.4p5 +REG esri:26720 2 -0x1.bf6e73ffc1ea8p5 0x1.4p5 +REG esri:26720 3 -0x1.1848c6001f0acp6 0x1.9p5 +REG esri:26720 4 -0x1.bf6e73ffc1ea8p5 0x1.9p5 +REG esri:26721 0 -0x1.c8p5 0x1.68p5 +REG esri:26721 1 -0x1.0048c6001f0acp6 0x1.4p5 +REG esri:26721 2 -0x1.8f6e73ffc1ea8p5 0x1.4p5 +REG esri:26721 3 -0x1.0048c6001f0acp6 0x1.9p5 +REG esri:26721 4 -0x1.8f6e73ffc1ea8p5 0x1.9p5 +REG esri:26722 0 -0x1.98p5 0x1.68p5 +REG esri:26722 1 -0x1.d0918c003e158p5 0x1.4p5 +REG esri:26722 2 -0x1.5f6e73ffc1ea8p5 0x1.4p5 +REG esri:26722 3 -0x1.d0918c003e158p5 0x1.9p5 +REG esri:26722 4 -0x1.5f6e73ffc1ea8p5 0x1.9p5 +REG esri:26729 0 -0x1.5755555555555p6 0x1.e8p4 +REG esri:26729 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG esri:26729 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG esri:26729 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG esri:26729 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG esri:2673 0 0x1.d4p6 0x0.0p0 +REG esri:2673 1 0x1.cp6 -0x1.4p2 +REG esri:2673 2 0x1.e8p6 -0x1.4p2 +REG esri:2673 3 0x1.cp6 0x1.4p2 +REG esri:2673 4 0x1.e8p6 0x1.4p2 +REG esri:26730 0 -0x1.5ep6 0x1.ep4 +REG esri:26730 1 -0x1.75181116f43fep6 0x1.9p4 +REG esri:26730 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG esri:26730 3 -0x1.75181116f43fep6 0x1.18p5 +REG esri:26730 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG esri:26731 0 -0x1.0b55555555557p7 0x1.c8p5 +REG esri:26731 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG esri:26731 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG esri:26731 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG esri:26731 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG esri:26732 0 -0x1.1cp7 0x1.bp5 +REG esri:26732 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG esri:26732 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG esri:26732 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG esri:26732 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG esri:26733 0 -0x1.24p7 0x1.bp5 +REG esri:26733 1 -0x1.350355070bc27p7 0x1.88p5 +REG esri:26733 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG esri:26733 3 -0x1.350355070bc27p7 0x1.d8p5 +REG esri:26733 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG esri:26734 0 -0x1.2cp7 0x1.bp5 +REG esri:26734 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG esri:26734 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG esri:26734 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG esri:26734 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG esri:26735 0 -0x1.34p7 0x1.bp5 +REG esri:26735 1 -0x1.450355070bc27p7 0x1.88p5 +REG esri:26735 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG esri:26735 3 -0x1.450355070bc27p7 0x1.d8p5 +REG esri:26735 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG esri:26736 0 -0x1.3cp7 0x1.bp5 +REG esri:26736 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG esri:26736 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG esri:26736 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG esri:26736 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG esri:26737 0 -0x1.44p7 0x1.bp5 +REG esri:26737 1 -0x1.550355070bc27p7 0x1.88p5 +REG esri:26737 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG esri:26737 3 -0x1.550355070bc27p7 0x1.d8p5 +REG esri:26737 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG esri:26738 0 -0x1.4cp7 0x1.bp5 +REG esri:26738 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG esri:26738 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG esri:26738 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG esri:26738 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG esri:26739 0 -0x1.54p7 0x1.bp5 +REG esri:26739 1 -0x1.650355070bc27p7 0x1.88p5 +REG esri:26739 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG esri:26739 3 -0x1.650355070bc27p7 0x1.d8p5 +REG esri:26739 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG esri:2674 0 0x1.ep6 0x0.0p0 +REG esri:2674 1 0x1.ccp6 -0x1.4p2 +REG esri:2674 2 0x1.f4p6 -0x1.4p2 +REG esri:2674 3 0x1.ccp6 0x1.4p2 +REG esri:2674 4 0x1.f4p6 0x1.4p2 +REG esri:26740 0 -0x1.6p7 0x1.a355555555556p5 +REG esri:26740 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG esri:26740 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG esri:26740 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG esri:26740 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG esri:26741 0 -0x1.e8p6 0x1.44p5 +REG esri:26741 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:26741 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:26741 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:26741 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:26742 0 -0x1.e8p6 0x1.36p5 +REG esri:26742 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:26742 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:26742 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:26742 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:26743 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:26743 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:26743 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:26743 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:26743 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:26744 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:26744 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:26744 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:26744 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:26744 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:26745 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:26745 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:26745 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:26745 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:26745 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:26746 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:26746 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:26746 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:26746 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:26746 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:26747 0 -0x1.d955555555553p6 0x1.1122222222222p5 +REG esri:26747 1 -0x1.de2a91549c3cfp6 0x1.0922222222222p5 +REG esri:26747 2 -0x1.d48019560e6d7p6 0x1.0922222222222p5 +REG esri:26747 3 -0x1.de2a91549c3cfp6 0x1.1922222222222p5 +REG esri:26747 4 -0x1.d48019560e6d7p6 0x1.1922222222222p5 +REG esri:26748 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:26748 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:26748 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:26748 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:26748 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:26749 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:26749 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:26749 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:26749 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:26749 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:2675 0 0x1.ecp6 0x0.0p0 +REG esri:2675 1 0x1.d8p6 -0x1.4p2 +REG esri:2675 2 0x1.0p7 -0x1.4p2 +REG esri:2675 3 0x1.d8p6 0x1.4p2 +REG esri:2675 4 0x1.0p7 0x1.4p2 +REG esri:26750 0 -0x1.c7p6 0x1.fp4 +REG esri:26750 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:26750 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:26750 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:26750 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:26751 0 -0x1.7p6 0x1.1a44444444444p5 +REG esri:26751 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG esri:26751 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG esri:26751 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG esri:26751 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG esri:26752 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG esri:26752 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG esri:26752 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG esri:26752 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG esri:26752 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG esri:26753 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:26753 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:26753 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:26753 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:26753 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:26754 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:26754 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:26754 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:26754 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:26754 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:26755 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:26755 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:26755 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:26755 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:26755 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:26756 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:26756 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:26756 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:26756 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:26756 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:26757 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:26757 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:26757 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:26757 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:26757 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:26758 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:26758 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:26758 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:26758 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:26758 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:26759 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:26759 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:26759 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:26759 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:26759 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2676 0 0x1.f8p6 0x0.0p0 +REG esri:2676 1 0x1.e4p6 -0x1.4p2 +REG esri:2676 2 0x1.06p7 -0x1.4p2 +REG esri:2676 3 0x1.e4p6 0x1.4p2 +REG esri:2676 4 0x1.06p7 0x1.4p2 +REG esri:26760 0 -0x1.52p6 0x1.dep4 +REG esri:26760 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:26760 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:26760 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:26760 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:26761 0 -0x1.37p7 0x1.2d55555555554p4 +REG esri:26761 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG esri:26761 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG esri:26761 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG esri:26761 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG esri:26762 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG esri:26762 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG esri:26762 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG esri:26762 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG esri:26762 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG esri:26763 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG esri:26763 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG esri:26763 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG esri:26763 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG esri:26763 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG esri:26764 0 -0x1.3fp7 0x1.5d55555555554p4 +REG esri:26764 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG esri:26764 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG esri:26764 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG esri:26764 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG esri:26765 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG esri:26765 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG esri:26765 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG esri:26765 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG esri:26765 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG esri:26766 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:26766 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:26766 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:26766 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:26766 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:26767 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:26767 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:26767 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:26767 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:26767 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:26768 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:26768 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:26768 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:26768 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:26768 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:26769 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:26769 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:26769 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:26769 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:26769 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:2677 0 0x1.02p7 0x0.0p0 +REG esri:2677 1 0x1.fp6 -0x1.4p2 +REG esri:2677 2 0x1.0cp7 -0x1.4p2 +REG esri:2677 3 0x1.fp6 0x1.4p2 +REG esri:2677 4 0x1.0cp7 0x1.4p2 +REG esri:26770 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:26770 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:26770 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:26770 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:26770 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:26771 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG esri:26771 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG esri:26771 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG esri:26771 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG esri:26771 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG esri:26772 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG esri:26772 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG esri:26772 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG esri:26772 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG esri:26772 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG esri:26773 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:26773 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:26773 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:26773 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:26773 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:26774 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:26774 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:26774 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:26774 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:26774 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:26775 0 -0x1.76p6 0x1.5311111111112p5 +REG esri:26775 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG esri:26775 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG esri:26775 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG esri:26775 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG esri:26776 0 -0x1.76p6 0x1.4722222222222p5 +REG esri:26776 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG esri:26776 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG esri:26776 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG esri:26776 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG esri:26777 0 -0x1.88p6 0x1.3877777777778p5 +REG esri:26777 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG esri:26777 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG esri:26777 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG esri:26777 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG esri:26778 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG esri:26778 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG esri:26778 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG esri:26778 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG esri:26778 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG esri:26779 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:26779 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:26779 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:26779 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:26779 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:2678 0 0x1.08p7 0x0.0p0 +REG esri:2678 1 0x1.fcp6 -0x1.4p2 +REG esri:2678 2 0x1.12p7 -0x1.4p2 +REG esri:2678 3 0x1.fcp6 0x1.4p2 +REG esri:2678 4 0x1.12p7 0x1.4p2 +REG esri:26780 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:26780 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:26780 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:26780 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:26780 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:26781 0 -0x1.72p6 0x1.faaaaaaaaaaaap4 +REG esri:26781 1 -0x1.7b66402708f87p6 0x1.daaaaaaaaaaaep4 +REG esri:26781 2 -0x1.6899bfd8f7079p6 0x1.daaaaaaaaaaaep4 +REG esri:26781 3 -0x1.7b66402708f87p6 0x1.0d55555555553p5 +REG esri:26781 4 -0x1.6899bfd8f7079p6 0x1.0d55555555553p5 +REG esri:26782 0 -0x1.6d55555555555p6 0x1.daeeeeeeeeefp4 +REG esri:26782 1 -0x1.76b1f683c31b1p6 0x1.ba66666666669p4 +REG esri:26782 2 -0x1.63f8b426e78f9p6 0x1.ba66666666669p4 +REG esri:26782 3 -0x1.76b1f683c31b1p6 0x1.fb77777777777p4 +REG esri:26782 4 -0x1.63f8b426e78f9p6 0x1.fb77777777777p4 +REG esri:26783 0 -0x1.12p6 0x1.5eaaaaaaaaaacp5 +REG esri:26783 1 -0x1.2db9bac668c18p6 0x1.36aaaaaaaaaacp5 +REG esri:26783 2 -0x1.ec8c8a732e7dp5 0x1.36aaaaaaaaaacp5 +REG esri:26783 3 -0x1.2db9bac668c18p6 0x1.86aaaaaaaaaacp5 +REG esri:26783 4 -0x1.ec8c8a732e7dp5 0x1.86aaaaaaaaaacp5 +REG esri:26784 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG esri:26784 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG esri:26784 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG esri:26784 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG esri:26784 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG esri:26785 0 -0x1.34p6 0x1.3522222222223p5 +REG esri:26785 1 -0x1.3c477eb6c7662p6 0x1.2833333333335p5 +REG esri:26785 2 -0x1.2bb881493899ep6 0x1.2833333333335p5 +REG esri:26785 3 -0x1.3c477eb6c7662p6 0x1.4211111111111p5 +REG esri:26785 4 -0x1.2bb881493899ep6 0x1.4211111111111p5 +REG esri:26786 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:26786 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:26786 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:26786 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:26786 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:26787 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:26787 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:26787 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:26787 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:26787 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:26788 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:26788 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:26788 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:26788 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:26788 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:26789 0 -0x1.5155555555555p6 0x1.6411111111112p5 +REG esri:26789 1 -0x1.5eb3874abc71ap6 0x1.5100000000001p5 +REG esri:26789 2 -0x1.43f7235fee39p6 0x1.5100000000001p5 +REG esri:26789 3 -0x1.5eb3874abc71ap6 0x1.7722222222223p5 +REG esri:26789 4 -0x1.43f7235fee39p6 0x1.7722222222223p5 +REG esri:2679 0 0x1.0ep7 0x0.0p0 +REG esri:2679 1 0x1.04p7 -0x1.4p2 +REG esri:2679 2 0x1.18p7 -0x1.4p2 +REG esri:2679 3 0x1.04p7 0x1.4p2 +REG esri:2679 4 0x1.18p7 0x1.4p2 +REG esri:26790 0 -0x1.5155555555555p6 0x1.54aaaaaaaaaaap5 +REG esri:26790 1 -0x1.5d1a9f6347bf8p6 0x1.4355555555556p5 +REG esri:26790 2 -0x1.45900b4762eb2p6 0x1.4355555555556p5 +REG esri:26790 3 -0x1.5d1a9f6347bf8p6 0x1.65ffffffffffep5 +REG esri:26790 4 -0x1.45900b4762eb2p6 0x1.65ffffffffffep5 +REG esri:26791 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG esri:26791 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG esri:26791 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG esri:26791 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG esri:26791 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG esri:26792 0 -0x1.79p6 0x1.7033333333333p5 +REG esri:26792 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG esri:26792 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG esri:26792 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG esri:26792 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG esri:26793 0 -0x1.78p6 0x1.60ddddddddddep5 +REG esri:26793 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG esri:26793 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG esri:26793 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG esri:26793 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG esri:26794 0 -0x1.6355555555555p6 0x1.daaaaaaaaaaacp4 +REG esri:26794 1 -0x1.7a59b545a2bp6 0x1.8aaaaaaaaaaacp4 +REG esri:26794 2 -0x1.4c50f56507faap6 0x1.8aaaaaaaaaaacp4 +REG esri:26794 3 -0x1.7a59b545a2bp6 0x1.1555555555556p5 +REG esri:26794 4 -0x1.4c50f56507faap6 0x1.1555555555556p5 +REG esri:26795 0 -0x1.6955555555555p6 0x1.e8p4 +REG esri:26795 1 -0x1.808b909d9872bp6 0x1.98p4 +REG esri:26795 2 -0x1.521f1a0d1237fp6 0x1.98p4 +REG esri:26795 3 -0x1.808b909d9872bp6 0x1.1cp5 +REG esri:26795 4 -0x1.521f1a0d1237fp6 0x1.1cp5 +REG esri:26796 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG esri:26796 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:26796 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG esri:26796 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:26796 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:26797 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG esri:26797 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:26797 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG esri:26797 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:26797 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:26798 0 -0x1.7ap6 0x1.2155555555554p5 +REG esri:26798 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG esri:26798 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG esri:26798 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG esri:26798 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG esri:2680 0 0x1.14p7 0x0.0p0 +REG esri:2680 1 0x1.0ap7 -0x1.4p2 +REG esri:2680 2 0x1.1ep7 -0x1.4p2 +REG esri:2680 3 0x1.0ap7 0x1.4p2 +REG esri:2680 4 0x1.1ep7 0x1.4p2 +REG esri:26801 0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 +REG esri:26801 1 -0x1.695eda12b767bp6 0x1.24p5 +REG esri:26801 2 -0x1.33f67b429dedbp6 0x1.24p5 +REG esri:26801 3 -0x1.695eda12b767bp6 0x1.74p5 +REG esri:26801 4 -0x1.33f67b429dedbp6 0x1.74p5 +REG esri:26802 0 -0x1.57p6 0x1.4cp5 +REG esri:26802 1 -0x1.71b42f680cbdp6 0x1.24p5 +REG esri:26802 2 -0x1.3c4bd097f343p6 0x1.24p5 +REG esri:26802 3 -0x1.71b42f680cbdp6 0x1.74p5 +REG esri:26802 4 -0x1.3c4bd097f343p6 0x1.74p5 +REG esri:26803 0 -0x1.63p6 0x1.4cp5 +REG esri:26803 1 -0x1.7db42f680cbdp6 0x1.24p5 +REG esri:26803 2 -0x1.484bd097f343p6 0x1.24p5 +REG esri:26803 3 -0x1.7db42f680cbdp6 0x1.74p5 +REG esri:26803 4 -0x1.484bd097f343p6 0x1.74p5 +REG esri:2681 0 0x1.1ap7 0x0.0p0 +REG esri:2681 1 0x1.1p7 -0x1.4p2 +REG esri:2681 2 0x1.24p7 -0x1.4p2 +REG esri:2681 3 0x1.1p7 0x1.4p2 +REG esri:2681 4 0x1.24p7 0x1.4p2 +REG esri:26811 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:26811 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:26811 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:26811 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:26811 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:26812 0 -0x1.5155555555555p6 0x1.6411111111112p5 +REG esri:26812 1 -0x1.5eb3874abc71ap6 0x1.5100000000001p5 +REG esri:26812 2 -0x1.43f7235fee39p6 0x1.5100000000001p5 +REG esri:26812 3 -0x1.5eb3874abc71ap6 0x1.7722222222223p5 +REG esri:26812 4 -0x1.43f7235fee39p6 0x1.7722222222223p5 +REG esri:26813 0 -0x1.5155555555555p6 0x1.54aaaaaaaaaaap5 +REG esri:26813 1 -0x1.5d1a9f6347bf8p6 0x1.4355555555556p5 +REG esri:26813 2 -0x1.45900b4762eb2p6 0x1.4355555555556p5 +REG esri:26813 3 -0x1.5d1a9f6347bf8p6 0x1.65ffffffffffep5 +REG esri:26813 4 -0x1.45900b4762eb2p6 0x1.65ffffffffffep5 +REG esri:2682 0 0x1.2p7 0x0.0p0 +REG esri:2682 1 0x1.16p7 -0x1.4p2 +REG esri:2682 2 0x1.2ap7 -0x1.4p2 +REG esri:2682 3 0x1.16p7 0x1.4p2 +REG esri:2682 4 0x1.2ap7 0x1.4p2 +REG esri:2683 0 0x1.26p7 0x0.0p0 +REG esri:2683 1 0x1.1cp7 -0x1.4p2 +REG esri:2683 2 0x1.3p7 -0x1.4p2 +REG esri:2683 3 0x1.1cp7 0x1.4p2 +REG esri:2683 4 0x1.3p7 0x1.4p2 +REG esri:2684 0 0x1.2cp7 0x0.0p0 +REG esri:2684 1 0x1.22p7 -0x1.4p2 +REG esri:2684 2 0x1.36p7 -0x1.4p2 +REG esri:2684 3 0x1.22p7 0x1.4p2 +REG esri:2684 4 0x1.36p7 0x1.4p2 +REG esri:2685 0 0x1.32p7 0x0.0p0 +REG esri:2685 1 0x1.28p7 -0x1.4p2 +REG esri:2685 2 0x1.3cp7 -0x1.4p2 +REG esri:2685 3 0x1.28p7 0x1.4p2 +REG esri:2685 4 0x1.3cp7 0x1.4p2 +REG esri:2686 0 0x1.38p7 0x0.0p0 +REG esri:2686 1 0x1.2ep7 -0x1.4p2 +REG esri:2686 2 0x1.42p7 -0x1.4p2 +REG esri:2686 3 0x1.2ep7 0x1.4p2 +REG esri:2686 4 0x1.42p7 0x1.4p2 +REG esri:2687 0 0x1.3ep7 0x0.0p0 +REG esri:2687 1 0x1.34p7 -0x1.4p2 +REG esri:2687 2 0x1.48p7 -0x1.4p2 +REG esri:2687 3 0x1.34p7 0x1.4p2 +REG esri:2687 4 0x1.48p7 0x1.4p2 +REG esri:2688 0 0x1.44p7 0x0.0p0 +REG esri:2688 1 0x1.3ap7 -0x1.4p2 +REG esri:2688 2 0x1.4ep7 -0x1.4p2 +REG esri:2688 3 0x1.3ap7 0x1.4p2 +REG esri:2688 4 0x1.4ep7 0x1.4p2 +REG esri:2689 0 0x1.4ap7 0x0.0p0 +REG esri:2689 1 0x1.4p7 -0x1.4p2 +REG esri:2689 2 0x1.54p7 -0x1.4p2 +REG esri:2689 3 0x1.4p7 0x1.4p2 +REG esri:2689 4 0x1.54p7 0x1.4p2 +REG esri:2690 0 0x1.5p7 0x0.0p0 +REG esri:2690 1 0x1.46p7 -0x1.4p2 +REG esri:2690 2 0x1.5ap7 -0x1.4p2 +REG esri:2690 3 0x1.46p7 0x1.4p2 +REG esri:2690 4 0x1.5ap7 0x1.4p2 +REG esri:26903 0 -0x1.4ap7 0x1.68p5 +REG esri:26903 1 -0x1.582463000f856p7 0x1.4p5 +REG esri:26903 2 -0x1.3bdb9cfff07aap7 0x1.4p5 +REG esri:26903 3 -0x1.582463000f856p7 0x1.9p5 +REG esri:26903 4 -0x1.3bdb9cfff07aap7 0x1.9p5 +REG esri:26904 0 -0x1.3ep7 0x1.68p5 +REG esri:26904 1 -0x1.4c2463000f856p7 0x1.4p5 +REG esri:26904 2 -0x1.2fdb9cfff07aap7 0x1.4p5 +REG esri:26904 3 -0x1.4c2463000f856p7 0x1.9p5 +REG esri:26904 4 -0x1.2fdb9cfff07aap7 0x1.9p5 +REG esri:26905 0 -0x1.32p7 0x1.68p5 +REG esri:26905 1 -0x1.402463000f856p7 0x1.4p5 +REG esri:26905 2 -0x1.23db9cfff07aap7 0x1.4p5 +REG esri:26905 3 -0x1.402463000f856p7 0x1.9p5 +REG esri:26905 4 -0x1.23db9cfff07aap7 0x1.9p5 +REG esri:26906 0 -0x1.26p7 0x1.68p5 +REG esri:26906 1 -0x1.342463000f856p7 0x1.4p5 +REG esri:26906 2 -0x1.17db9cfff07aap7 0x1.4p5 +REG esri:26906 3 -0x1.342463000f856p7 0x1.9p5 +REG esri:26906 4 -0x1.17db9cfff07aap7 0x1.9p5 +REG esri:26907 0 -0x1.1ap7 0x1.68p5 +REG esri:26907 1 -0x1.282463000f856p7 0x1.4p5 +REG esri:26907 2 -0x1.0bdb9cfff07aap7 0x1.4p5 +REG esri:26907 3 -0x1.282463000f856p7 0x1.9p5 +REG esri:26907 4 -0x1.0bdb9cfff07aap7 0x1.9p5 +REG esri:26908 0 -0x1.0ep7 0x1.68p5 +REG esri:26908 1 -0x1.1c2463000f856p7 0x1.4p5 +REG esri:26908 2 -0x1.ffb739ffe0f54p6 0x1.4p5 +REG esri:26908 3 -0x1.1c2463000f856p7 0x1.9p5 +REG esri:26908 4 -0x1.ffb739ffe0f54p6 0x1.9p5 +REG esri:26909 0 -0x1.02p7 0x1.68p5 +REG esri:26909 1 -0x1.102463000f856p7 0x1.4p5 +REG esri:26909 2 -0x1.e7b739ffe0f54p6 0x1.4p5 +REG esri:26909 3 -0x1.102463000f856p7 0x1.9p5 +REG esri:26909 4 -0x1.e7b739ffe0f54p6 0x1.9p5 +REG esri:2691 0 0x1.56p7 0x0.0p0 +REG esri:2691 1 0x1.4cp7 -0x1.4p2 +REG esri:2691 2 0x1.6p7 -0x1.4p2 +REG esri:2691 3 0x1.4cp7 0x1.4p2 +REG esri:2691 4 0x1.6p7 0x1.4p2 +REG esri:26910 0 -0x1.ecp6 0x1.68p5 +REG esri:26910 1 -0x1.042463000f856p7 0x1.4p5 +REG esri:26910 2 -0x1.cfb739ffe0f54p6 0x1.4p5 +REG esri:26910 3 -0x1.042463000f856p7 0x1.9p5 +REG esri:26910 4 -0x1.cfb739ffe0f54p6 0x1.9p5 +REG esri:26911 0 -0x1.d4p6 0x1.68p5 +REG esri:26911 1 -0x1.f048c6001f0acp6 0x1.4p5 +REG esri:26911 2 -0x1.b7b739ffe0f54p6 0x1.4p5 +REG esri:26911 3 -0x1.f048c6001f0acp6 0x1.9p5 +REG esri:26911 4 -0x1.b7b739ffe0f54p6 0x1.9p5 +REG esri:26912 0 -0x1.bcp6 0x1.68p5 +REG esri:26912 1 -0x1.d848c6001f0acp6 0x1.4p5 +REG esri:26912 2 -0x1.9fb739ffe0f54p6 0x1.4p5 +REG esri:26912 3 -0x1.d848c6001f0acp6 0x1.9p5 +REG esri:26912 4 -0x1.9fb739ffe0f54p6 0x1.9p5 +REG esri:26913 0 -0x1.a4p6 0x1.68p5 +REG esri:26913 1 -0x1.c048c6001f0acp6 0x1.4p5 +REG esri:26913 2 -0x1.87b739ffe0f54p6 0x1.4p5 +REG esri:26913 3 -0x1.c048c6001f0acp6 0x1.9p5 +REG esri:26913 4 -0x1.87b739ffe0f54p6 0x1.9p5 +REG esri:26914 0 -0x1.8cp6 0x1.68p5 +REG esri:26914 1 -0x1.a848c6001f0acp6 0x1.4p5 +REG esri:26914 2 -0x1.6fb739ffe0f54p6 0x1.4p5 +REG esri:26914 3 -0x1.a848c6001f0acp6 0x1.9p5 +REG esri:26914 4 -0x1.6fb739ffe0f54p6 0x1.9p5 +REG esri:26915 0 -0x1.74p6 0x1.68p5 +REG esri:26915 1 -0x1.9048c6001f0acp6 0x1.4p5 +REG esri:26915 2 -0x1.57b739ffe0f54p6 0x1.4p5 +REG esri:26915 3 -0x1.9048c6001f0acp6 0x1.9p5 +REG esri:26915 4 -0x1.57b739ffe0f54p6 0x1.9p5 +REG esri:26916 0 -0x1.5cp6 0x1.68p5 +REG esri:26916 1 -0x1.7848c6001f0acp6 0x1.4p5 +REG esri:26916 2 -0x1.3fb739ffe0f54p6 0x1.4p5 +REG esri:26916 3 -0x1.7848c6001f0acp6 0x1.9p5 +REG esri:26916 4 -0x1.3fb739ffe0f54p6 0x1.9p5 +REG esri:26917 0 -0x1.44p6 0x1.68p5 +REG esri:26917 1 -0x1.6048c6001f0acp6 0x1.4p5 +REG esri:26917 2 -0x1.27b739ffe0f54p6 0x1.4p5 +REG esri:26917 3 -0x1.6048c6001f0acp6 0x1.9p5 +REG esri:26917 4 -0x1.27b739ffe0f54p6 0x1.9p5 +REG esri:26918 0 -0x1.2cp6 0x1.68p5 +REG esri:26918 1 -0x1.4848c6001f0acp6 0x1.4p5 +REG esri:26918 2 -0x1.0fb739ffe0f54p6 0x1.4p5 +REG esri:26918 3 -0x1.4848c6001f0acp6 0x1.9p5 +REG esri:26918 4 -0x1.0fb739ffe0f54p6 0x1.9p5 +REG esri:26919 0 -0x1.14p6 0x1.68p5 +REG esri:26919 1 -0x1.3048c6001f0acp6 0x1.4p5 +REG esri:26919 2 -0x1.ef6e73ffc1ea8p5 0x1.4p5 +REG esri:26919 3 -0x1.3048c6001f0acp6 0x1.9p5 +REG esri:26919 4 -0x1.ef6e73ffc1ea8p5 0x1.9p5 +REG esri:2692 0 0x1.5cp7 0x0.0p0 +REG esri:2692 1 0x1.52p7 -0x1.4p2 +REG esri:2692 2 0x1.66p7 -0x1.4p2 +REG esri:2692 3 0x1.52p7 0x1.4p2 +REG esri:2692 4 0x1.66p7 0x1.4p2 +REG esri:26920 0 -0x1.f8p5 0x1.68p5 +REG esri:26920 1 -0x1.1848c6001f0acp6 0x1.4p5 +REG esri:26920 2 -0x1.bf6e73ffc1ea8p5 0x1.4p5 +REG esri:26920 3 -0x1.1848c6001f0acp6 0x1.9p5 +REG esri:26920 4 -0x1.bf6e73ffc1ea8p5 0x1.9p5 +REG esri:26921 0 -0x1.c8p5 0x1.68p5 +REG esri:26921 1 -0x1.0048c6001f0acp6 0x1.4p5 +REG esri:26921 2 -0x1.8f6e73ffc1ea8p5 0x1.4p5 +REG esri:26921 3 -0x1.0048c6001f0acp6 0x1.9p5 +REG esri:26921 4 -0x1.8f6e73ffc1ea8p5 0x1.9p5 +REG esri:26922 0 -0x1.98p5 0x1.68p5 +REG esri:26922 1 -0x1.d0918c003e158p5 0x1.4p5 +REG esri:26922 2 -0x1.5f6e73ffc1ea8p5 0x1.4p5 +REG esri:26922 3 -0x1.d0918c003e158p5 0x1.9p5 +REG esri:26922 4 -0x1.5f6e73ffc1ea8p5 0x1.9p5 +REG esri:26923 0 -0x1.68p5 0x1.68p5 +REG esri:26923 1 -0x1.a0918c003e158p5 0x1.4p5 +REG esri:26923 2 -0x1.2f6e73ffc1ea8p5 0x1.4p5 +REG esri:26923 3 -0x1.a0918c003e158p5 0x1.9p5 +REG esri:26923 4 -0x1.2f6e73ffc1ea8p5 0x1.9p5 +REG esri:26929 0 -0x1.5755555555555p6 0x1.e8p4 +REG esri:26929 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG esri:26929 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG esri:26929 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG esri:26929 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG esri:2693 0 0x1.62p7 0x0.0p0 +REG esri:2693 1 0x1.58p7 -0x1.4p2 +REG esri:2693 2 -0x1.64p7 -0x1.4p2 +REG esri:2693 3 0x1.58p7 0x1.4p2 +REG esri:2693 4 -0x1.64p7 0x1.4p2 +REG esri:26930 0 -0x1.5ep6 0x1.ep4 +REG esri:26930 1 -0x1.75181116f43fep6 0x1.9p4 +REG esri:26930 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG esri:26930 3 -0x1.75181116f43fep6 0x1.18p5 +REG esri:26930 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG esri:26931 0 -0x1.0b55555555557p7 0x1.c8p5 +REG esri:26931 1 -0x1.1db1b1b64ab14p7 0x1.ap5 +REG esri:26931 2 -0x1.f1f1f1e8bff35p6 0x1.ap5 +REG esri:26931 3 -0x1.1db1b1b64ab14p7 0x1.fp5 +REG esri:26931 4 -0x1.f1f1f1e8bff35p6 0x1.fp5 +REG esri:26932 0 -0x1.1cp7 0x1.bp5 +REG esri:26932 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG esri:26932 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG esri:26932 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG esri:26932 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG esri:26933 0 -0x1.24p7 0x1.bp5 +REG esri:26933 1 -0x1.350355070bc27p7 0x1.88p5 +REG esri:26933 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG esri:26933 3 -0x1.350355070bc27p7 0x1.d8p5 +REG esri:26933 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG esri:26934 0 -0x1.2cp7 0x1.bp5 +REG esri:26934 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG esri:26934 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG esri:26934 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG esri:26934 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG esri:26935 0 -0x1.34p7 0x1.bp5 +REG esri:26935 1 -0x1.450355070bc27p7 0x1.88p5 +REG esri:26935 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG esri:26935 3 -0x1.450355070bc27p7 0x1.d8p5 +REG esri:26935 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG esri:26936 0 -0x1.3cp7 0x1.bp5 +REG esri:26936 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG esri:26936 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG esri:26936 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG esri:26936 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG esri:26937 0 -0x1.44p7 0x1.bp5 +REG esri:26937 1 -0x1.550355070bc27p7 0x1.88p5 +REG esri:26937 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG esri:26937 3 -0x1.550355070bc27p7 0x1.d8p5 +REG esri:26937 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG esri:26938 0 -0x1.4cp7 0x1.bp5 +REG esri:26938 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG esri:26938 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG esri:26938 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG esri:26938 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG esri:26939 0 -0x1.54p7 0x1.bp5 +REG esri:26939 1 -0x1.650355070bc27p7 0x1.88p5 +REG esri:26939 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG esri:26939 3 -0x1.650355070bc27p7 0x1.d8p5 +REG esri:26939 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG esri:2694 0 -0x1.68p7 0x0.0p0 +REG esri:2694 1 0x1.5ep7 -0x1.4p2 +REG esri:2694 2 -0x1.5ep7 -0x1.4p2 +REG esri:2694 3 0x1.5ep7 0x1.4p2 +REG esri:2694 4 -0x1.5ep7 0x1.4p2 +REG esri:26940 0 -0x1.6p7 0x1.a355555555556p5 +REG esri:26940 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG esri:26940 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaaap5 +REG esri:26940 3 0x1.66b58674419cfp7 0x1.ba00000000002p5 +REG esri:26940 4 -0x1.56b58674419cfp7 0x1.ba00000000002p5 +REG esri:26941 0 -0x1.e8p6 0x1.44p5 +REG esri:26941 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:26941 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:26941 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:26941 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:26942 0 -0x1.e8p6 0x1.36p5 +REG esri:26942 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:26942 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:26942 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:26942 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:26943 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:26943 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:26943 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:26943 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:26943 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:26944 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:26944 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:26944 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:26944 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:26944 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:26945 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:26945 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:26945 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:26945 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:26945 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:26946 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:26946 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:26946 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:26946 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:26946 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:26948 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:26948 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:26948 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:26948 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:26948 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:26949 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:26949 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:26949 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:26949 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:26949 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:2695 0 -0x1.62p7 0x0.0p0 +REG esri:2695 1 0x1.64p7 -0x1.4p2 +REG esri:2695 2 -0x1.58p7 -0x1.4p2 +REG esri:2695 3 0x1.64p7 0x1.4p2 +REG esri:2695 4 -0x1.58p7 0x1.4p2 +REG esri:26950 0 -0x1.c7p6 0x1.fp4 +REG esri:26950 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:26950 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:26950 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:26950 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:26951 0 -0x1.7p6 0x1.1a44444444444p5 +REG esri:26951 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG esri:26951 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG esri:26951 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG esri:26951 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG esri:26952 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG esri:26952 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG esri:26952 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG esri:26952 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG esri:26952 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG esri:26953 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:26953 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:26953 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:26953 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:26953 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:26954 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:26954 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:26954 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:26954 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:26954 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:26955 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:26955 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:26955 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:26955 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:26955 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:26956 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:26956 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:26956 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:26956 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:26956 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:26957 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:26957 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:26957 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:26957 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:26957 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:26958 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:26958 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:26958 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:26958 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:26958 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:26959 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:26959 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:26959 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:26959 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:26959 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2696 0 -0x1.5cp7 0x0.0p0 +REG esri:2696 1 -0x1.66p7 -0x1.4p2 +REG esri:2696 2 -0x1.52p7 -0x1.4p2 +REG esri:2696 3 -0x1.66p7 0x1.4p2 +REG esri:2696 4 -0x1.52p7 0x1.4p2 +REG esri:26960 0 -0x1.52p6 0x1.dep4 +REG esri:26960 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:26960 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:26960 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:26960 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:26961 0 -0x1.37p7 0x1.2d55555555554p4 +REG esri:26961 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG esri:26961 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG esri:26961 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG esri:26961 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG esri:26962 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG esri:26962 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG esri:26962 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG esri:26962 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG esri:26962 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG esri:26963 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG esri:26963 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG esri:26963 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG esri:26963 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG esri:26963 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG esri:26964 0 -0x1.3fp7 0x1.5d55555555554p4 +REG esri:26964 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG esri:26964 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG esri:26964 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG esri:26964 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG esri:26965 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG esri:26965 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG esri:26965 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG esri:26965 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG esri:26965 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG esri:26966 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:26966 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:26966 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:26966 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:26966 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:26967 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:26967 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:26967 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:26967 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:26967 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:26968 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:26968 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:26968 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:26968 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:26968 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:26969 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:26969 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:26969 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:26969 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:26969 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:2697 0 -0x1.56p7 0x0.0p0 +REG esri:2697 1 -0x1.6p7 -0x1.4p2 +REG esri:2697 2 -0x1.4cp7 -0x1.4p2 +REG esri:2697 3 -0x1.6p7 0x1.4p2 +REG esri:2697 4 -0x1.4cp7 0x1.4p2 +REG esri:26970 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:26970 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:26970 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:26970 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:26970 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:26971 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG esri:26971 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG esri:26971 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG esri:26971 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG esri:26971 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG esri:26972 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG esri:26972 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG esri:26972 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG esri:26972 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG esri:26972 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG esri:26973 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:26973 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:26973 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:26973 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:26973 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:26974 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:26974 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:26974 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:26974 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:26974 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:26975 0 -0x1.76p6 0x1.5311111111112p5 +REG esri:26975 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG esri:26975 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG esri:26975 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG esri:26975 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG esri:26976 0 -0x1.76p6 0x1.4722222222222p5 +REG esri:26976 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG esri:26976 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG esri:26976 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG esri:26976 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG esri:26977 0 -0x1.88p6 0x1.3877777777778p5 +REG esri:26977 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG esri:26977 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG esri:26977 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG esri:26977 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG esri:26978 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG esri:26978 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG esri:26978 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG esri:26978 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG esri:26978 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG esri:26979 0 -0x1.51p6 0x1.2dddddddddddep5 +REG esri:26979 1 -0x1.560ec7d05efd7p6 0x1.25ddddddddddep5 +REG esri:26979 2 -0x1.4bf1382fa1029p6 0x1.25ddddddddddep5 +REG esri:26979 3 -0x1.560ec7d05efd7p6 0x1.35ddddddddddep5 +REG esri:26979 4 -0x1.4bf1382fa1029p6 0x1.35ddddddddddep5 +REG esri:2698 0 -0x1.5p7 0x0.0p0 +REG esri:2698 1 -0x1.5ap7 -0x1.4p2 +REG esri:2698 2 -0x1.46p7 -0x1.4p2 +REG esri:2698 3 -0x1.5ap7 0x1.4p2 +REG esri:2698 4 -0x1.46p7 0x1.4p2 +REG esri:26980 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:26980 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:26980 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:26980 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:26980 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:26981 0 -0x1.72p6 0x1.f955555555554p4 +REG esri:26981 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG esri:26981 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG esri:26981 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG esri:26981 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG esri:26982 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG esri:26982 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG esri:26982 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG esri:26982 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG esri:26982 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG esri:26983 0 -0x1.12p6 0x1.5d55555555554p5 +REG esri:26983 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG esri:26983 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG esri:26983 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG esri:26983 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG esri:26984 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG esri:26984 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG esri:26984 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG esri:26984 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG esri:26984 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG esri:26985 0 -0x1.34p6 0x1.3477777777777p5 +REG esri:26985 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG esri:26985 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG esri:26985 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG esri:26985 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG esri:26986 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:26986 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:26986 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:26986 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:26986 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:26987 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:26987 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:26987 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:26987 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:26987 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:26988 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:26988 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:26988 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:26988 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:26988 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:26989 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG esri:26989 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG esri:26989 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG esri:26989 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG esri:26989 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG esri:2699 0 0x1.5p4 0x0.0p0 +REG esri:2699 1 0x1.0p4 -0x1.4p2 +REG esri:2699 2 0x1.ap4 -0x1.4p2 +REG esri:2699 3 0x1.0p4 0x1.4p2 +REG esri:2699 4 0x1.ap4 0x1.4p2 +REG esri:26990 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG esri:26990 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG esri:26990 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG esri:26990 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG esri:26990 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG esri:26991 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG esri:26991 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG esri:26991 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG esri:26991 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG esri:26991 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG esri:26992 0 -0x1.79p6 0x1.7033333333333p5 +REG esri:26992 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG esri:26992 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG esri:26992 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG esri:26992 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG esri:26993 0 -0x1.78p6 0x1.60ddddddddddep5 +REG esri:26993 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG esri:26993 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG esri:26993 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG esri:26993 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG esri:26994 0 -0x1.6355555555555p6 0x1.d8p4 +REG esri:26994 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG esri:26994 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG esri:26994 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG esri:26994 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG esri:26995 0 -0x1.6955555555555p6 0x1.d8p4 +REG esri:26995 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG esri:26995 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG esri:26995 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG esri:26995 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG esri:26996 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG esri:26996 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:26996 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG esri:26996 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:26996 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:26997 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG esri:26997 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:26997 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG esri:26997 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:26997 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:26998 0 -0x1.7ap6 0x1.2155555555554p5 +REG esri:26998 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG esri:26998 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG esri:26998 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG esri:26998 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG esri:2700 0 0x1.8p4 0x0.0p0 +REG esri:2700 1 0x1.3p4 -0x1.4p2 +REG esri:2700 2 0x1.dp4 -0x1.4p2 +REG esri:2700 3 0x1.3p4 0x1.4p2 +REG esri:2700 4 0x1.dp4 0x1.4p2 +REG esri:2701 0 0x1.bp4 0x0.0p0 +REG esri:2701 1 0x1.6p4 -0x1.4p2 +REG esri:2701 2 0x1.0p5 -0x1.4p2 +REG esri:2701 3 0x1.6p4 0x1.4p2 +REG esri:2701 4 0x1.0p5 0x1.4p2 +REG esri:2702 0 0x1.ep4 0x0.0p0 +REG esri:2702 1 0x1.9p4 -0x1.4p2 +REG esri:2702 2 0x1.18p5 -0x1.4p2 +REG esri:2702 3 0x1.9p4 0x1.4p2 +REG esri:2702 4 0x1.18p5 0x1.4p2 +REG esri:2703 0 0x1.08p5 0x0.0p0 +REG esri:2703 1 0x1.cp4 -0x1.4p2 +REG esri:2703 2 0x1.3p5 -0x1.4p2 +REG esri:2703 3 0x1.cp4 0x1.4p2 +REG esri:2703 4 0x1.3p5 0x1.4p2 +REG esri:27038 0 0x1.68p5 0x0.0p0 +REG esri:27038 1 0x1.4p5 -0x1.4p2 +REG esri:27038 2 0x1.9p5 -0x1.4p2 +REG esri:27038 3 0x1.4p5 0x1.4p2 +REG esri:27038 4 0x1.9p5 0x1.4p2 +REG esri:27039 0 0x1.98p5 0x0.0p0 +REG esri:27039 1 0x1.7p5 -0x1.4p2 +REG esri:27039 2 0x1.cp5 -0x1.4p2 +REG esri:27039 3 0x1.7p5 0x1.4p2 +REG esri:27039 4 0x1.cp5 0x1.4p2 +REG esri:2704 0 0x1.2p5 0x0.0p0 +REG esri:2704 1 0x1.fp4 -0x1.4p2 +REG esri:2704 2 0x1.48p5 -0x1.4p2 +REG esri:2704 3 0x1.fp4 0x1.4p2 +REG esri:2704 4 0x1.48p5 0x1.4p2 +REG esri:27040 0 0x1.c8p5 0x0.0p0 +REG esri:27040 1 0x1.ap5 -0x1.4p2 +REG esri:27040 2 0x1.fp5 -0x1.4p2 +REG esri:27040 3 0x1.ap5 0x1.4p2 +REG esri:27040 4 0x1.fp5 0x1.4p2 +REG esri:2705 0 0x1.38p5 0x0.0p0 +REG esri:2705 1 0x1.1p5 -0x1.4p2 +REG esri:2705 2 0x1.6p5 -0x1.4p2 +REG esri:2705 3 0x1.1p5 0x1.4p2 +REG esri:2705 4 0x1.6p5 0x1.4p2 +REG esri:2706 0 0x1.5p5 0x0.0p0 +REG esri:2706 1 0x1.28p5 -0x1.4p2 +REG esri:2706 2 0x1.78p5 -0x1.4p2 +REG esri:2706 3 0x1.28p5 0x1.4p2 +REG esri:2706 4 0x1.78p5 0x1.4p2 +REG esri:2707 0 0x1.68p5 0x0.0p0 +REG esri:2707 1 0x1.4p5 -0x1.4p2 +REG esri:2707 2 0x1.9p5 -0x1.4p2 +REG esri:2707 3 0x1.4p5 0x1.4p2 +REG esri:2707 4 0x1.9p5 0x1.4p2 +REG esri:2708 0 0x1.8p5 0x0.0p0 +REG esri:2708 1 0x1.58p5 -0x1.4p2 +REG esri:2708 2 0x1.a8p5 -0x1.4p2 +REG esri:2708 3 0x1.58p5 0x1.4p2 +REG esri:2708 4 0x1.a8p5 0x1.4p2 +REG esri:2709 0 0x1.98p5 0x0.0p0 +REG esri:2709 1 0x1.7p5 -0x1.4p2 +REG esri:2709 2 0x1.cp5 -0x1.4p2 +REG esri:2709 3 0x1.7p5 0x1.4p2 +REG esri:2709 4 0x1.cp5 0x1.4p2 +REG esri:2710 0 0x1.bp5 0x0.0p0 +REG esri:2710 1 0x1.88p5 -0x1.4p2 +REG esri:2710 2 0x1.d8p5 -0x1.4p2 +REG esri:2710 3 0x1.88p5 0x1.4p2 +REG esri:2710 4 0x1.d8p5 0x1.4p2 +REG esri:2711 0 0x1.c8p5 0x0.0p0 +REG esri:2711 1 0x1.ap5 -0x1.4p2 +REG esri:2711 2 0x1.fp5 -0x1.4p2 +REG esri:2711 3 0x1.ap5 0x1.4p2 +REG esri:2711 4 0x1.fp5 0x1.4p2 +REG esri:2712 0 0x1.ep5 0x0.0p0 +REG esri:2712 1 0x1.b8p5 -0x1.4p2 +REG esri:2712 2 0x1.04p6 -0x1.4p2 +REG esri:2712 3 0x1.b8p5 0x1.4p2 +REG esri:2712 4 0x1.04p6 0x1.4p2 +REG esri:27120 0 -0x1.f8p5 0x0.0p0 +REG esri:27120 1 -0x1.1p6 -0x1.4p2 +REG esri:27120 2 -0x1.dp5 -0x1.4p2 +REG esri:27120 3 -0x1.1p6 0x1.4p2 +REG esri:27120 4 -0x1.dp5 0x1.4p2 +REG esri:2713 0 0x1.f8p5 0x0.0p0 +REG esri:2713 1 0x1.dp5 -0x1.4p2 +REG esri:2713 2 0x1.1p6 -0x1.4p2 +REG esri:2713 3 0x1.dp5 0x1.4p2 +REG esri:2713 4 0x1.1p6 0x1.4p2 +REG esri:2714 0 0x1.08p6 0x0.0p0 +REG esri:2714 1 0x1.e8p5 -0x1.4p2 +REG esri:2714 2 0x1.1cp6 -0x1.4p2 +REG esri:2714 3 0x1.e8p5 0x1.4p2 +REG esri:2714 4 0x1.1cp6 0x1.4p2 +REG esri:2715 0 0x1.14p6 0x0.0p0 +REG esri:2715 1 0x1.0p6 -0x1.4p2 +REG esri:2715 2 0x1.28p6 -0x1.4p2 +REG esri:2715 3 0x1.0p6 0x1.4p2 +REG esri:2715 4 0x1.28p6 0x1.4p2 +REG esri:2716 0 0x1.2p6 0x0.0p0 +REG esri:2716 1 0x1.0cp6 -0x1.4p2 +REG esri:2716 2 0x1.34p6 -0x1.4p2 +REG esri:2716 3 0x1.0cp6 0x1.4p2 +REG esri:2716 4 0x1.34p6 0x1.4p2 +REG esri:2717 0 0x1.2cp6 0x0.0p0 +REG esri:2717 1 0x1.18p6 -0x1.4p2 +REG esri:2717 2 0x1.4p6 -0x1.4p2 +REG esri:2717 3 0x1.18p6 0x1.4p2 +REG esri:2717 4 0x1.4p6 0x1.4p2 +REG esri:2718 0 0x1.38p6 0x0.0p0 +REG esri:2718 1 0x1.24p6 -0x1.4p2 +REG esri:2718 2 0x1.4cp6 -0x1.4p2 +REG esri:2718 3 0x1.24p6 0x1.4p2 +REG esri:2718 4 0x1.4cp6 0x1.4p2 +REG esri:2719 0 0x1.44p6 0x0.0p0 +REG esri:2719 1 0x1.3p6 -0x1.4p2 +REG esri:2719 2 0x1.58p6 -0x1.4p2 +REG esri:2719 3 0x1.3p6 0x1.4p2 +REG esri:2719 4 0x1.58p6 0x1.4p2 +REG esri:2720 0 0x1.5p6 0x0.0p0 +REG esri:2720 1 0x1.3cp6 -0x1.4p2 +REG esri:2720 2 0x1.64p6 -0x1.4p2 +REG esri:2720 3 0x1.3cp6 0x1.4p2 +REG esri:2720 4 0x1.64p6 0x1.4p2 +REG esri:27200 0 0x1.5ap7 -0x1.48p5 +REG esri:27200 1 0x1.4cbff77c13ebp7 -0x1.7p5 +REG esri:27200 2 0x1.67400883ec15p7 -0x1.7p5 +REG esri:27200 3 0x1.4cbff77c13ebp7 -0x1.2p5 +REG esri:27200 4 0x1.67400883ec15p7 -0x1.2p5 +REG esri:27205 0 0x1.5d87577d1e091p7 -0x1.2709f6ce87884p5 +REG esri:27205 1 0x1.5106ec93929c2p7 -0x1.4f09f6ce87884p5 +REG esri:27205 2 -0x1.65f83d99568ap7 -0x1.4f09f6ce87884p5 +REG esri:27205 3 0x1.5106ec93929c2p7 -0x1.fe13ed9d0f108p4 +REG esri:27205 4 -0x1.65f83d99568ap7 -0x1.fe13ed9d0f108p4 +REG esri:27206 0 0x1.60eeb167ec786p7 -0x1.2e170a2357947p5 +REG esri:27206 1 0x1.5448853993046p7 -0x1.56170a2357947p5 +REG esri:27206 2 -0x1.626b2269ba13ap7 -0x1.56170a2357947p5 +REG esri:27206 3 0x1.5448853993046p7 -0x1.06170a2357947p5 +REG esri:27206 4 -0x1.626b2269ba13ap7 -0x1.06170a2357947p5 +REG esri:27207 0 0x1.63c5721e4269ep7 -0x1.34ff642b82351p5 +REG esri:27207 1 0x1.56f8a6d70e078p7 -0x1.5cff642b82351p5 +REG esri:27207 2 -0x1.5f6dc29a8933cp7 -0x1.5cff642b82351p5 +REG esri:27207 3 0x1.56f8a6d70e078p7 -0x1.0cff642b82351p5 +REG esri:27207 4 -0x1.5f6dc29a8933cp7 -0x1.0cff642b82351p5 +REG esri:27208 0 0x1.6158eca77583fp7 -0x1.3d351a6c7af3fp5 +REG esri:27208 1 0x1.545c0474e8326p7 -0x1.65351a6c7af3fp5 +REG esri:27208 2 -0x1.61aa2b25fd2a8p7 -0x1.65351a6c7af3fp5 +REG esri:27208 3 0x1.545c0474e8326p7 -0x1.15351a6c7af3fp5 +REG esri:27208 4 -0x1.61aa2b25fd2a8p7 -0x1.15351a6c7af3fp5 +REG esri:27209 0 0x1.5c74bdf4c2b52p7 -0x1.39160873542c1p5 +REG esri:27209 1 0x1.4f904bad7b7bcp7 -0x1.61160873542c1p5 +REG esri:27209 2 -0x1.66a6cfc3f6118p7 -0x1.61160873542c1p5 +REG esri:27209 3 0x1.4f904bad7b7bcp7 -0x1.11160873542c1p5 +REG esri:27209 4 -0x1.66a6cfc3f6118p7 -0x1.11160873542c1p5 +REG esri:2721 0 0x1.5cp6 0x0.0p0 +REG esri:2721 1 0x1.48p6 -0x1.4p2 +REG esri:2721 2 0x1.7p6 -0x1.4p2 +REG esri:2721 3 0x1.48p6 0x1.4p2 +REG esri:2721 4 0x1.7p6 0x1.4p2 +REG esri:27210 0 0x1.5f47b2e77832p7 -0x1.3c198a134391dp5 +REG esri:27210 1 0x1.52516d89b1a66p7 -0x1.64198a134391dp5 +REG esri:27210 2 -0x1.63c207bac1426p7 -0x1.64198a134391dp5 +REG esri:27210 3 0x1.52516d89b1a66p7 -0x1.14198a134391dp5 +REG esri:27210 4 -0x1.63c207bac1426p7 -0x1.14198a134391dp5 +REG esri:27211 0 0x1.5ef9e83135d33p7 -0x1.41ef81fb471bcp5 +REG esri:27211 1 0x1.51e026a8f1ep7 -0x1.69ef81fb471bcp5 +REG esri:27211 2 -0x1.63ec56468639ap7 -0x1.69ef81fb471bcp5 +REG esri:27211 3 0x1.51e026a8f1ep7 -0x1.19ef81fb471bcp5 +REG esri:27211 4 -0x1.63ec56468639ap7 -0x1.19ef81fb471bcp5 +REG esri:27212 0 0x1.5f4b716a5ed1fp7 -0x1.47677da7fb445p5 +REG esri:27212 1 0x1.520f3c2541e8ep7 -0x1.6f677da7fb445p5 +REG esri:27212 2 -0x1.637859508445p7 -0x1.6f677da7fb445p5 +REG esri:27212 3 0x1.520f3c2541e8ep7 -0x1.1f677da7fb445p5 +REG esri:27212 4 -0x1.637859508445p7 -0x1.1f677da7fb445p5 +REG esri:27213 0 0x1.5d8da18b5f147p7 -0x1.4a691a45555cbp5 +REG esri:27213 1 0x1.503df8e74414dp7 -0x1.72691a45555cbp5 +REG esri:27213 2 -0x1.6522b5d085ebfp7 -0x1.72691a45555cbp5 +REG esri:27213 3 0x1.503df8e74414dp7 -0x1.22691a45555cbp5 +REG esri:27213 4 -0x1.6522b5d085ebfp7 -0x1.22691a45555cbp5 +REG esri:27214 0 0x1.5958167a95c85p7 -0x1.45b7d398810c4p5 +REG esri:27214 1 0x1.4c26a10c601e2p7 -0x1.6db7d398810c4p5 +REG esri:27214 2 0x1.66898be8cb728p7 -0x1.6db7d398810c4p5 +REG esri:27214 3 0x1.4c26a10c601e2p7 -0x1.1db7d398810c4p5 +REG esri:27214 4 0x1.66898be8cb728p7 -0x1.1db7d398810c4p5 +REG esri:27215 0 0x1.5a99400d66021p7 -0x1.4a324480d9deep5 +REG esri:27215 1 0x1.4d4afd53a11a7p7 -0x1.72324480d9deep5 +REG esri:27215 2 0x1.67e782c72ae9bp7 -0x1.72324480d9deep5 +REG esri:27215 3 0x1.4d4afd53a11a7p7 -0x1.22324480d9deep5 +REG esri:27215 4 0x1.67e782c72ae9bp7 -0x1.22324480d9deep5 +REG esri:27216 0 0x1.5837d28b22f61p7 -0x1.4a51bd22944fdp5 +REG esri:27216 1 0x1.4ae8c275d701cp7 -0x1.7251bd22944fdp5 +REG esri:27216 2 0x1.6586e2a06eea6p7 -0x1.7251bd22944fdp5 +REG esri:27216 3 0x1.4ae8c275d701cp7 -0x1.2251bd22944fdp5 +REG esri:27216 4 0x1.6586e2a06eea6p7 -0x1.2251bd22944fdp5 +REG esri:27217 0 0x1.57299aeb022a3p7 -0x1.4e7c8635dfcdbp5 +REG esri:27217 1 0x1.49befa83ac74bp7 -0x1.767c8635dfcdbp5 +REG esri:27217 2 0x1.64943b5257dfbp7 -0x1.767c8635dfcdbp5 +REG esri:27217 3 0x1.49befa83ac74bp7 -0x1.267c8635dfcdbp5 +REG esri:27217 4 0x1.64943b5257dfbp7 -0x1.267c8635dfcdbp5 +REG esri:27218 0 0x1.57197b9fe347fp7 -0x1.52ab67e7cf57ep5 +REG esri:27218 1 0x1.499271bc4bd97p7 -0x1.7aab67e7cf57ep5 +REG esri:27218 2 0x1.64a085837ab67p7 -0x1.7aab67e7cf57ep5 +REG esri:27218 3 0x1.499271bc4bd97p7 -0x1.2aab67e7cf57ep5 +REG esri:27218 4 0x1.64a085837ab67p7 -0x1.2aab67e7cf57ep5 +REG esri:27219 0 0x1.5a0530341bc04p7 -0x1.55834f8e24622p5 +REG esri:27219 1 0x1.4c6a6697370eep7 -0x1.7d834f8e24622p5 +REG esri:27219 2 0x1.679ff9d10071ap7 -0x1.7d834f8e24622p5 +REG esri:27219 3 0x1.4c6a6697370eep7 -0x1.2d834f8e24622p5 +REG esri:27219 4 0x1.679ff9d10071ap7 -0x1.2d834f8e24622p5 +REG esri:2722 0 0x1.68p6 0x0.0p0 +REG esri:2722 1 0x1.54p6 -0x1.4p2 +REG esri:2722 2 0x1.7cp6 -0x1.4p2 +REG esri:2722 3 0x1.54p6 0x1.4p2 +REG esri:2722 4 0x1.7cp6 0x1.4p2 +REG esri:27220 0 0x1.5b9aa97538618p7 -0x1.4c5b1bd35387ep5 +REG esri:27220 1 0x1.4e3e37fccbdf4p7 -0x1.745b1bd35387ep5 +REG esri:27220 2 -0x1.6708e5125b1c4p7 -0x1.745b1bd35387ep5 +REG esri:27220 3 0x1.4e3e37fccbdf4p7 -0x1.245b1bd35387ep5 +REG esri:27220 4 -0x1.6708e5125b1c4p7 -0x1.245b1bd35387ep5 +REG esri:27221 0 0x1.55f5c1b54195dp7 -0x1.5717302d957c6p5 +REG esri:27221 1 0x1.484fdb128409dp7 -0x1.7f17302d957c6p5 +REG esri:27221 2 0x1.639ba857ff21dp7 -0x1.7f17302d957c6p5 +REG esri:27221 3 0x1.484fdb128409dp7 -0x1.2f17302d957c6p5 +REG esri:27221 4 0x1.639ba857ff21dp7 -0x1.2f17302d957c6p5 +REG esri:27222 0 0x1.5485981221b23p7 -0x1.58e18adc972d5p5 +REG esri:27222 1 0x1.46d2f1a8d1894p7 -0x1.80e18adc972d5p5 +REG esri:27222 2 0x1.62383e7b71db2p7 -0x1.80e18adc972d5p5 +REG esri:27222 3 0x1.46d2f1a8d1894p7 -0x1.30e18adc972d5p5 +REG esri:27222 4 0x1.62383e7b71db2p7 -0x1.30e18adc972d5p5 +REG esri:27223 0 0x1.513668a0d349cp7 -0x1.5fd28a522db26p5 +REG esri:27223 1 0x1.4350ebaa964f9p7 -0x1.87d28a522db26p5 +REG esri:27223 2 0x1.5f1be5971043fp7 -0x1.87d28a522db26p5 +REG esri:27223 3 0x1.4350ebaa964f9p7 -0x1.37d28a522db26p5 +REG esri:27223 4 0x1.5f1be5971043fp7 -0x1.37d28a522db26p5 +REG esri:27224 0 0x1.597452b7a48e2p7 -0x1.5cb9a03281a42p5 +REG esri:27224 1 0x1.4ba5ccf50d806p7 -0x1.84b9a03281a42p5 +REG esri:27224 2 0x1.6742d87a3b9bep7 -0x1.84b9a03281a42p5 +REG esri:27224 3 0x1.4ba5ccf50d806p7 -0x1.34b9a03281a42p5 +REG esri:27224 4 0x1.6742d87a3b9bep7 -0x1.34b9a03281a42p5 +REG esri:27225 0 0x1.56b8b406148d8p7 -0x1.5dfd5c7be9fccp5 +REG esri:27225 1 0x1.48e0dc10f6644p7 -0x1.85fd5c7be9fccp5 +REG esri:27225 2 0x1.64908bfb32b6cp7 -0x1.85fd5c7be9fccp5 +REG esri:27225 3 0x1.48e0dc10f6644p7 -0x1.35fd5c7be9fccp5 +REG esri:27225 4 0x1.64908bfb32b6cp7 -0x1.35fd5c7be9fccp5 +REG esri:27226 0 0x1.561d4ffb31abbp7 -0x1.6337bf4f060f7p5 +REG esri:27226 1 0x1.481e1d43cbbb2p7 -0x1.8b37bf4f060f7p5 +REG esri:27226 2 0x1.641c82b2979c4p7 -0x1.8b37bf4f060f7p5 +REG esri:27226 3 0x1.481e1d43cbbb2p7 -0x1.3b37bf4f060f7p5 +REG esri:27226 4 0x1.641c82b2979c4p7 -0x1.3b37bf4f060f7p5 +REG esri:27227 0 0x1.52ef7d9822e89p7 -0x1.65e1d42cb3ecep5 +REG esri:27227 1 0x1.44dbb765e59f3p7 -0x1.8de1d42cb3ecep5 +REG esri:27227 2 0x1.610343ca6031fp7 -0x1.8de1d42cb3ecep5 +REG esri:27227 3 0x1.44dbb765e59f3p7 -0x1.3de1d42cb3ecep5 +REG esri:27227 4 0x1.610343ca6031fp7 -0x1.3de1d42cb3ecep5 +REG esri:27228 0 0x1.50cc1ab2d9f44p7 -0x1.69102f3ac7c3cp5 +REG esri:27228 1 0x1.429f4a5bee54dp7 -0x1.91102f3ac7c3cp5 +REG esri:27228 2 0x1.5ef8eb09c593bp7 -0x1.91102f3ac7c3cp5 +REG esri:27228 3 0x1.429f4a5bee54dp7 -0x1.41102f3ac7c3cp5 +REG esri:27228 4 0x1.5ef8eb09c593bp7 -0x1.41102f3ac7c3cp5 +REG esri:27229 0 0x1.4f7a4c1747a3ep7 -0x1.6c8282dd4ddcbp5 +REG esri:27229 1 0x1.4131c203801f3p7 -0x1.948282dd4ddcbp5 +REG esri:27229 2 0x1.5dc2d62b0f289p7 -0x1.948282dd4ddcbp5 +REG esri:27229 3 0x1.4131c203801f3p7 -0x1.448282dd4ddcbp5 +REG esri:27229 4 0x1.5dc2d62b0f289p7 -0x1.448282dd4ddcbp5 +REG esri:2723 0 0x1.74p6 0x0.0p0 +REG esri:2723 1 0x1.6p6 -0x1.4p2 +REG esri:2723 2 0x1.88p6 -0x1.4p2 +REG esri:2723 3 0x1.6p6 0x1.4p2 +REG esri:2723 4 0x1.88p6 0x1.4p2 +REG esri:27230 0 0x1.5541d739c683bp7 -0x1.6e879216bea04p5 +REG esri:27230 1 0x1.46e8c24595a63p7 -0x1.96879216bea04p5 +REG esri:27230 2 0x1.639aec2df7613p7 -0x1.96879216bea04p5 +REG esri:27230 3 0x1.46e8c24595a63p7 -0x1.46879216bea04p5 +REG esri:27230 4 0x1.639aec2df7613p7 -0x1.46879216bea04p5 +REG esri:27231 0 0x1.5490af851cdb1p7 -0x1.6ee4611df8506p5 +REG esri:27231 1 0x1.46349c6fbe456p7 -0x1.96e4611df8506p5 +REG esri:27231 2 0x1.62ecc29a7b70cp7 -0x1.96e4611df8506p5 +REG esri:27231 3 0x1.46349c6fbe456p7 -0x1.46e4611df8506p5 +REG esri:27231 4 0x1.62ecc29a7b70cp7 -0x1.46e4611df8506p5 +REG esri:27232 0 0x1.50af8ceb356dap7 -0x1.74ccd1d6c8103p5 +REG esri:27232 1 0x1.4221ad8fc3657p7 -0x1.9cccd1d6c8103p5 +REG esri:27232 2 0x1.5f3d6c46a775dp7 -0x1.9cccd1d6c8103p5 +REG esri:27232 3 0x1.4221ad8fc3657p7 -0x1.4cccd1d6c8103p5 +REG esri:27232 4 0x1.5f3d6c46a775dp7 -0x1.4cccd1d6c8103p5 +REG esri:2724 0 0x1.8p6 0x0.0p0 +REG esri:2724 1 0x1.6cp6 -0x1.4p2 +REG esri:2724 2 0x1.94p6 -0x1.4p2 +REG esri:2724 3 0x1.6cp6 0x1.4p2 +REG esri:2724 4 0x1.94p6 0x1.4p2 +REG esri:2725 0 0x1.8cp6 0x0.0p0 +REG esri:2725 1 0x1.78p6 -0x1.4p2 +REG esri:2725 2 0x1.ap6 -0x1.4p2 +REG esri:2725 3 0x1.78p6 0x1.4p2 +REG esri:2725 4 0x1.ap6 0x1.4p2 +REG esri:27258 0 0x1.4ap7 -0x1.9p4 +REG esri:27258 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:27258 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:27258 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:27258 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:27259 0 0x1.56p7 -0x1.9p4 +REG esri:27259 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:27259 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:27259 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:27259 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:2726 0 0x1.98p6 0x0.0p0 +REG esri:2726 1 0x1.84p6 -0x1.4p2 +REG esri:2726 2 0x1.acp6 -0x1.4p2 +REG esri:2726 3 0x1.84p6 0x1.4p2 +REG esri:2726 4 0x1.acp6 0x1.4p2 +REG esri:27260 0 0x1.62p7 -0x1.9p4 +REG esri:27260 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:27260 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:27260 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:27260 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:2727 0 0x1.a4p6 0x0.0p0 +REG esri:2727 1 0x1.9p6 -0x1.4p2 +REG esri:2727 2 0x1.b8p6 -0x1.4p2 +REG esri:2727 3 0x1.9p6 0x1.4p2 +REG esri:2727 4 0x1.b8p6 0x1.4p2 +REG esri:2728 0 0x1.bp6 0x0.0p0 +REG esri:2728 1 0x1.9cp6 -0x1.4p2 +REG esri:2728 2 0x1.c4p6 -0x1.4p2 +REG esri:2728 3 0x1.9cp6 0x1.4p2 +REG esri:2728 4 0x1.c4p6 0x1.4p2 +REG esri:2729 0 0x1.bcp6 0x0.0p0 +REG esri:2729 1 0x1.a8p6 -0x1.4p2 +REG esri:2729 2 0x1.dp6 -0x1.4p2 +REG esri:2729 3 0x1.a8p6 0x1.4p2 +REG esri:2729 4 0x1.dp6 0x1.4p2 +REG esri:27291 0 0x1.5fp7 -0x1.38p5 +REG esri:27291 1 0x1.5221e5403abcap7 -0x1.6p5 +REG esri:27291 2 -0x1.6421e5403abcap7 -0x1.6p5 +REG esri:27291 3 0x1.5221e5403abcap7 -0x1.1p5 +REG esri:27291 4 -0x1.6421e5403abcap7 -0x1.1p5 +REG esri:27292 0 0x1.57p7 -0x1.6p5 +REG esri:27292 1 0x1.49192e6394ef4p7 -0x1.88p5 +REG esri:27292 2 0x1.64e6d19c6b10cp7 -0x1.88p5 +REG esri:27292 3 0x1.49192e6394ef4p7 -0x1.38p5 +REG esri:27292 4 0x1.64e6d19c6b10cp7 -0x1.38p5 +REG esri:2730 0 0x1.c8p6 0x0.0p0 +REG esri:2730 1 0x1.b4p6 -0x1.4p2 +REG esri:2730 2 0x1.dcp6 -0x1.4p2 +REG esri:2730 3 0x1.b4p6 0x1.4p2 +REG esri:2730 4 0x1.dcp6 0x1.4p2 +REG esri:2731 0 0x1.d4p6 0x0.0p0 +REG esri:2731 1 0x1.cp6 -0x1.4p2 +REG esri:2731 2 0x1.e8p6 -0x1.4p2 +REG esri:2731 3 0x1.cp6 0x1.4p2 +REG esri:2731 4 0x1.e8p6 0x1.4p2 +REG esri:2732 0 0x1.ep6 0x0.0p0 +REG esri:2732 1 0x1.ccp6 -0x1.4p2 +REG esri:2732 2 0x1.f4p6 -0x1.4p2 +REG esri:2732 3 0x1.ccp6 0x1.4p2 +REG esri:2732 4 0x1.f4p6 0x1.4p2 +REG esri:2733 0 0x1.ecp6 0x0.0p0 +REG esri:2733 1 0x1.d8p6 -0x1.4p2 +REG esri:2733 2 0x1.0p7 -0x1.4p2 +REG esri:2733 3 0x1.d8p6 0x1.4p2 +REG esri:2733 4 0x1.0p7 0x1.4p2 +REG esri:2734 0 0x1.f8p6 0x0.0p0 +REG esri:2734 1 0x1.e4p6 -0x1.4p2 +REG esri:2734 2 0x1.06p7 -0x1.4p2 +REG esri:2734 3 0x1.e4p6 0x1.4p2 +REG esri:2734 4 0x1.06p7 0x1.4p2 +REG esri:2735 0 0x1.02p7 0x0.0p0 +REG esri:2735 1 0x1.fp6 -0x1.4p2 +REG esri:2735 2 0x1.0cp7 -0x1.4p2 +REG esri:2735 3 0x1.fp6 0x1.4p2 +REG esri:2735 4 0x1.0cp7 0x1.4p2 +REG esri:2736 0 0x1.08p5 -0x1.9p4 +REG esri:2736 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:2736 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:2736 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:2736 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:2737 0 0x1.38p5 -0x1.9p4 +REG esri:2737 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:2737 2 0x1.642297030ae5dp5 -0x1.ep4 +REG esri:2737 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:2737 4 0x1.642297030ae5dp5 -0x1.4p4 +REG esri:2738 0 0x1.08p7 0x0.0p0 +REG esri:2738 1 0x1.fcp6 -0x1.4p2 +REG esri:2738 2 0x1.12p7 -0x1.4p2 +REG esri:2738 3 0x1.fcp6 0x1.4p2 +REG esri:2738 4 0x1.12p7 0x1.4p2 +REG esri:2739 0 0x1.0ep7 0x0.0p0 +REG esri:2739 1 0x1.04p7 -0x1.4p2 +REG esri:2739 2 0x1.18p7 -0x1.4p2 +REG esri:2739 3 0x1.04p7 0x1.4p2 +REG esri:2739 4 0x1.18p7 0x1.4p2 +REG esri:27391 0 0x1.839999999999dp2 0x1.dp5 +REG esri:27391 1 -0x1.b087f9264f44ap1 0x1.a8p5 +REG esri:27391 2 0x1.efbb97e32d6bp3 0x1.a8p5 +REG esri:27391 3 -0x1.b087f9264f44ap1 0x1.f8p5 +REG esri:27391 4 0x1.efbb97e32d6bp3 0x1.f8p5 +REG esri:27392 0 0x1.0c77777777779p3 0x1.dp5 +REG esri:27392 1 -0x1.0bba9cf74934p0 0x1.a8p5 +REG esri:27392 2 0x1.1d332146ec0adp4 0x1.a8p5 +REG esri:27392 3 -0x1.0bba9cf74934p0 0x1.f8p5 +REG esri:27392 4 0x1.1d332146ec0adp4 0x1.f8p5 +REG esri:27393 0 0x1.5722222222224p3 0x1.dp5 +REG esri:27393 1 0x1.499ab85e0c218p0 0x1.a8p5 +REG esri:27393 2 0x1.4288769c41602p4 0x1.a8p5 +REG esri:27393 3 0x1.499ab85e0c218p0 0x1.f8p5 +REG esri:27393 4 0x1.4288769c41602p4 0x1.f8p5 +REG esri:27394 0 0x1.a722222222224p3 0x1.dp5 +REG esri:27394 1 0x1.e4cd5c2f0610cp1 0x1.a8p5 +REG esri:27394 2 0x1.6a88769c41602p4 0x1.a8p5 +REG esri:27394 3 0x1.e4cd5c2f0610cp1 0x1.f8p5 +REG esri:27394 4 0x1.6a88769c41602p4 0x1.f8p5 +REG esri:27395 0 0x1.0e3bbbbbbbbbep4 0x1.dp5 +REG esri:27395 1 0x1.dd1158c22db36p2 0x1.a8p5 +REG esri:27395 2 0x1.a5332146ec0aep4 0x1.a8p5 +REG esri:27395 3 0x1.dd1158c22db36p2 0x1.f8p5 +REG esri:27395 4 0x1.a5332146ec0aep4 0x1.f8p5 +REG esri:27396 0 0x1.4e3bbbbbbbbbbp4 0x1.dp5 +REG esri:27396 1 0x1.6e88ac6116d95p3 0x1.a8p5 +REG esri:27396 2 0x1.e5332146ec0acp4 0x1.a8p5 +REG esri:27396 3 0x1.6e88ac6116d95p3 0x1.f8p5 +REG esri:27396 4 0x1.e5332146ec0acp4 0x1.f8p5 +REG esri:27397 0 0x1.8e3bbbbbbbbbbp4 0x1.dp5 +REG esri:27397 1 0x1.ee88ac6116d95p3 0x1.a8p5 +REG esri:27397 2 0x1.129990a376056p5 0x1.a8p5 +REG esri:27397 3 0x1.ee88ac6116d95p3 0x1.f8p5 +REG esri:27397 4 0x1.129990a376056p5 0x1.f8p5 +REG esri:27398 0 0x1.d0e6666666666p4 0x1.dp5 +REG esri:27398 1 0x1.39ef00db36176p4 0x1.a8p5 +REG esri:27398 2 0x1.33eee5f8cb5abp5 0x1.a8p5 +REG esri:27398 3 0x1.39ef00db36176p4 0x1.f8p5 +REG esri:27398 4 0x1.33eee5f8cb5abp5 0x1.f8p5 +REG esri:2740 0 0x1.14p7 0x0.0p0 +REG esri:2740 1 0x1.0ap7 -0x1.4p2 +REG esri:2740 2 0x1.1ep7 -0x1.4p2 +REG esri:2740 3 0x1.0ap7 0x1.4p2 +REG esri:2740 4 0x1.1ep7 0x1.4p2 +REG esri:2741 0 0x1.1ap7 0x0.0p0 +REG esri:2741 1 0x1.1p7 -0x1.4p2 +REG esri:2741 2 0x1.24p7 -0x1.4p2 +REG esri:2741 3 0x1.1p7 0x1.4p2 +REG esri:2741 4 0x1.24p7 0x1.4p2 +REG esri:2742 0 0x1.2p7 0x0.0p0 +REG esri:2742 1 0x1.16p7 -0x1.4p2 +REG esri:2742 2 0x1.2ap7 -0x1.4p2 +REG esri:2742 3 0x1.16p7 0x1.4p2 +REG esri:2742 4 0x1.2ap7 0x1.4p2 +REG esri:27429 0 -0x1.2p3 0x0.0p0 +REG esri:27429 1 -0x1.cp3 -0x1.4p2 +REG esri:27429 2 -0x1.0p2 -0x1.4p2 +REG esri:27429 3 -0x1.cp3 0x1.4p2 +REG esri:27429 4 -0x1.0p2 0x1.4p2 +REG esri:2743 0 0x1.26p7 0x0.0p0 +REG esri:2743 1 0x1.1cp7 -0x1.4p2 +REG esri:2743 2 0x1.3p7 -0x1.4p2 +REG esri:2743 3 0x1.1cp7 0x1.4p2 +REG esri:2743 4 0x1.3p7 0x1.4p2 +REG esri:2744 0 0x1.2cp7 0x0.0p0 +REG esri:2744 1 0x1.22p7 -0x1.4p2 +REG esri:2744 2 0x1.36p7 -0x1.4p2 +REG esri:2744 3 0x1.22p7 0x1.4p2 +REG esri:2744 4 0x1.36p7 0x1.4p2 +REG esri:2745 0 0x1.32p7 0x0.0p0 +REG esri:2745 1 0x1.28p7 -0x1.4p2 +REG esri:2745 2 0x1.3cp7 -0x1.4p2 +REG esri:2745 3 0x1.28p7 0x1.4p2 +REG esri:2745 4 0x1.3cp7 0x1.4p2 +REG esri:2746 0 0x1.38p7 0x0.0p0 +REG esri:2746 1 0x1.2ep7 -0x1.4p2 +REG esri:2746 2 0x1.42p7 -0x1.4p2 +REG esri:2746 3 0x1.2ep7 0x1.4p2 +REG esri:2746 4 0x1.42p7 0x1.4p2 +REG esri:2747 0 0x1.3ep7 0x0.0p0 +REG esri:2747 1 0x1.34p7 -0x1.4p2 +REG esri:2747 2 0x1.48p7 -0x1.4p2 +REG esri:2747 3 0x1.34p7 0x1.4p2 +REG esri:2747 4 0x1.48p7 0x1.4p2 +REG esri:2748 0 0x1.44p7 0x0.0p0 +REG esri:2748 1 0x1.3ap7 -0x1.4p2 +REG esri:2748 2 0x1.4ep7 -0x1.4p2 +REG esri:2748 3 0x1.3ap7 0x1.4p2 +REG esri:2748 4 0x1.4ep7 0x1.4p2 +REG esri:2749 0 0x1.4ap7 0x0.0p0 +REG esri:2749 1 0x1.4p7 -0x1.4p2 +REG esri:2749 2 0x1.54p7 -0x1.4p2 +REG esri:2749 3 0x1.4p7 0x1.4p2 +REG esri:2749 4 0x1.54p7 0x1.4p2 +REG esri:27492 0 -0x1.0438932a2bac3p3 0x1.3d55555555554p5 +REG esri:27492 1 -0x1.d41333b201868p3 0x1.1555555555554p5 +REG esri:27492 2 -0x1.a2ef9512ae8fp0 0x1.1555555555554p5 +REG esri:27492 3 -0x1.d41333b201868p3 0x1.6555555555554p5 +REG esri:27492 4 -0x1.a2ef9512ae8fp0 0x1.6555555555554p5 +REG esri:2750 0 0x1.5p7 0x0.0p0 +REG esri:2750 1 0x1.46p7 -0x1.4p2 +REG esri:2750 2 0x1.5ap7 -0x1.4p2 +REG esri:2750 3 0x1.46p7 0x1.4p2 +REG esri:2750 4 0x1.5ap7 0x1.4p2 +REG esri:27500 0 0x1.ef2ec341b3a9ap2 0x1.8c00000000001p5 +REG esri:27500 1 0x1.3a70fc5481ep-5 0x1.6400000000001p5 +REG esri:27500 2 0x1.edf452455f27cp3 0x1.6400000000001p5 +REG esri:27500 3 0x1.3a70fc5481ep-5 0x1.b400000000001p5 +REG esri:27500 4 0x1.edf452455f27cp3 0x1.b400000000001p5 +REG esri:2751 0 0x1.56p7 0x0.0p0 +REG esri:2751 1 0x1.4cp7 -0x1.4p2 +REG esri:2751 2 0x1.6p7 -0x1.4p2 +REG esri:2751 3 0x1.4cp7 0x1.4p2 +REG esri:2751 4 0x1.6p7 0x1.4p2 +REG esri:2752 0 0x1.5cp7 0x0.0p0 +REG esri:2752 1 0x1.52p7 -0x1.4p2 +REG esri:2752 2 0x1.66p7 -0x1.4p2 +REG esri:2752 3 0x1.52p7 0x1.4p2 +REG esri:2752 4 0x1.66p7 0x1.4p2 +REG esri:2753 0 0x1.62p7 0x0.0p0 +REG esri:2753 1 0x1.58p7 -0x1.4p2 +REG esri:2753 2 -0x1.64p7 -0x1.4p2 +REG esri:2753 3 0x1.58p7 0x1.4p2 +REG esri:2753 4 -0x1.64p7 0x1.4p2 +REG esri:2754 0 -0x1.68p7 0x0.0p0 +REG esri:2754 1 0x1.5ep7 -0x1.4p2 +REG esri:2754 2 -0x1.5ep7 -0x1.4p2 +REG esri:2754 3 0x1.5ep7 0x1.4p2 +REG esri:2754 4 -0x1.5ep7 0x1.4p2 +REG esri:2755 0 -0x1.62p7 0x0.0p0 +REG esri:2755 1 0x1.64p7 -0x1.4p2 +REG esri:2755 2 -0x1.58p7 -0x1.4p2 +REG esri:2755 3 0x1.64p7 0x1.4p2 +REG esri:2755 4 -0x1.58p7 0x1.4p2 +REG esri:2756 0 -0x1.5cp7 0x0.0p0 +REG esri:2756 1 -0x1.66p7 -0x1.4p2 +REG esri:2756 2 -0x1.52p7 -0x1.4p2 +REG esri:2756 3 -0x1.66p7 0x1.4p2 +REG esri:2756 4 -0x1.52p7 0x1.4p2 +REG esri:27561 0 0x1.2b2a5350341ffp1 0x1.8c00000000001p5 +REG esri:27561 1 -0x1.5724b7a0f095ep2 0x1.6400000000001p5 +REG esri:27561 2 0x1.41278578925afp3 0x1.6400000000001p5 +REG esri:27561 3 -0x1.5724b7a0f095ep2 0x1.b400000000001p5 +REG esri:27561 4 0x1.41278578925afp3 0x1.b400000000001p5 +REG esri:27562 0 0x1.2b2a5350341ffp1 0x1.7666666666666p5 +REG esri:27562 1 -0x1.3de133068f2b4p2 0x1.4e66666666666p5 +REG esri:27562 2 0x1.3485c32b61a59p3 0x1.4e66666666666p5 +REG esri:27562 3 -0x1.3de133068f2b4p2 0x1.9e66666666666p5 +REG esri:27562 4 0x1.3485c32b61a59p3 0x1.9e66666666666p5 +REG esri:27563 0 0x1.2b2a5350341ffp1 0x1.60ccccccccccep5 +REG esri:27563 1 -0x1.28057a9410e24p2 0x1.38ccccccccccep5 +REG esri:27563 2 0x1.2997e6f222811p3 0x1.38ccccccccccep5 +REG esri:27563 3 -0x1.28057a9410e24p2 0x1.88ccccccccccep5 +REG esri:27563 4 0x1.2997e6f222811p3 0x1.88ccccccccccep5 +REG esri:27564 0 0x1.2b2a5350341ffp1 0x1.5151eb851eb87p5 +REG esri:27564 1 -0x1.1a241b8834db8p2 0x1.2951eb851eb87p5 +REG esri:27564 2 0x1.22a7376c347dbp3 0x1.2951eb851eb87p5 +REG esri:27564 3 -0x1.1a241b8834db8p2 0x1.7951eb851eb87p5 +REG esri:27564 4 0x1.22a7376c347dbp3 0x1.7951eb851eb87p5 +REG esri:2757 0 -0x1.56p7 0x0.0p0 +REG esri:2757 1 -0x1.6p7 -0x1.4p2 +REG esri:2757 2 -0x1.4cp7 -0x1.4p2 +REG esri:2757 3 -0x1.6p7 0x1.4p2 +REG esri:2757 4 -0x1.4cp7 0x1.4p2 +REG esri:27571 0 0x1.2b2a5350341ffp1 0x1.8c00000000001p5 +REG esri:27571 1 -0x1.5724b7a0f095ep2 0x1.6400000000001p5 +REG esri:27571 2 0x1.41278578925afp3 0x1.6400000000001p5 +REG esri:27571 3 -0x1.5724b7a0f095ep2 0x1.b400000000001p5 +REG esri:27571 4 0x1.41278578925afp3 0x1.b400000000001p5 +REG esri:27572 0 0x1.2b2a5350341ffp1 0x1.7666666666666p5 +REG esri:27572 1 -0x1.3de133068f2b4p2 0x1.4e66666666666p5 +REG esri:27572 2 0x1.3485c32b61a59p3 0x1.4e66666666666p5 +REG esri:27572 3 -0x1.3de133068f2b4p2 0x1.9e66666666666p5 +REG esri:27572 4 0x1.3485c32b61a59p3 0x1.9e66666666666p5 +REG esri:27573 0 0x1.2b2a5350341ffp1 0x1.60ccccccccccep5 +REG esri:27573 1 -0x1.28057a9410e24p2 0x1.38ccccccccccep5 +REG esri:27573 2 0x1.2997e6f222811p3 0x1.38ccccccccccep5 +REG esri:27573 3 -0x1.28057a9410e24p2 0x1.88ccccccccccep5 +REG esri:27573 4 0x1.2997e6f222811p3 0x1.88ccccccccccep5 +REG esri:27574 0 0x1.2b2a5350341ffp1 0x1.5151eb851eb87p5 +REG esri:27574 1 -0x1.1a241b8834db8p2 0x1.2951eb851eb87p5 +REG esri:27574 2 0x1.22a7376c347dbp3 0x1.2951eb851eb87p5 +REG esri:27574 3 -0x1.1a241b8834db8p2 0x1.7951eb851eb87p5 +REG esri:27574 4 0x1.22a7376c347dbp3 0x1.7951eb851eb87p5 +REG esri:2758 0 -0x1.5p7 0x0.0p0 +REG esri:2758 1 -0x1.5ap7 -0x1.4p2 +REG esri:2758 2 -0x1.46p7 -0x1.4p2 +REG esri:2758 3 -0x1.5ap7 0x1.4p2 +REG esri:2758 4 -0x1.46p7 0x1.4p2 +REG esri:27581 0 0x1.2b2a5350341ffp1 0x1.8c00000000001p5 +REG esri:27581 1 -0x1.5724b7a0f095ep2 0x1.6400000000001p5 +REG esri:27581 2 0x1.41278578925afp3 0x1.6400000000001p5 +REG esri:27581 3 -0x1.5724b7a0f095ep2 0x1.b400000000001p5 +REG esri:27581 4 0x1.41278578925afp3 0x1.b400000000001p5 +REG esri:27582 0 0x1.2b2a5350341ffp1 0x1.7666666666666p5 +REG esri:27582 1 -0x1.3de133068f2b4p2 0x1.4e66666666666p5 +REG esri:27582 2 0x1.3485c32b61a59p3 0x1.4e66666666666p5 +REG esri:27582 3 -0x1.3de133068f2b4p2 0x1.9e66666666666p5 +REG esri:27582 4 0x1.3485c32b61a59p3 0x1.9e66666666666p5 +REG esri:27583 0 0x1.2b2a5350341ffp1 0x1.60ccccccccccep5 +REG esri:27583 1 -0x1.28057a9410e24p2 0x1.38ccccccccccep5 +REG esri:27583 2 0x1.2997e6f222811p3 0x1.38ccccccccccep5 +REG esri:27583 3 -0x1.28057a9410e24p2 0x1.88ccccccccccep5 +REG esri:27583 4 0x1.2997e6f222811p3 0x1.88ccccccccccep5 +REG esri:27584 0 0x1.2b2a5350341ffp1 0x1.5151eb851eb87p5 +REG esri:27584 1 -0x1.1a241b8834db8p2 0x1.2951eb851eb87p5 +REG esri:27584 2 0x1.22a7376c347dbp3 0x1.2951eb851eb87p5 +REG esri:27584 3 -0x1.1a241b8834db8p2 0x1.7951eb851eb87p5 +REG esri:27584 4 0x1.22a7376c347dbp3 0x1.7951eb851eb87p5 +REG esri:2759 0 -0x1.5755555555555p6 0x1.e8p4 +REG esri:2759 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG esri:2759 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG esri:2759 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG esri:2759 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG esri:27591 0 0x1.2b2a5350341ffp1 0x1.8c00000000001p5 +REG esri:27591 1 -0x1.5724b7a0f095ep2 0x1.6400000000001p5 +REG esri:27591 2 0x1.41278578925afp3 0x1.6400000000001p5 +REG esri:27591 3 -0x1.5724b7a0f095ep2 0x1.b400000000001p5 +REG esri:27591 4 0x1.41278578925afp3 0x1.b400000000001p5 +REG esri:27592 0 0x1.2b2a5350341ffp1 0x1.7666666666666p5 +REG esri:27592 1 -0x1.3de133068f2b4p2 0x1.4e66666666666p5 +REG esri:27592 2 0x1.3485c32b61a59p3 0x1.4e66666666666p5 +REG esri:27592 3 -0x1.3de133068f2b4p2 0x1.9e66666666666p5 +REG esri:27592 4 0x1.3485c32b61a59p3 0x1.9e66666666666p5 +REG esri:27593 0 0x1.2b2a5350341ffp1 0x1.60ccccccccccep5 +REG esri:27593 1 -0x1.28057a9410e24p2 0x1.38ccccccccccep5 +REG esri:27593 2 0x1.2997e6f222811p3 0x1.38ccccccccccep5 +REG esri:27593 3 -0x1.28057a9410e24p2 0x1.88ccccccccccep5 +REG esri:27593 4 0x1.2997e6f222811p3 0x1.88ccccccccccep5 +REG esri:27594 0 0x1.2b2a5350341ffp1 0x1.5151eb851eb87p5 +REG esri:27594 1 -0x1.1a241b8834db8p2 0x1.2951eb851eb87p5 +REG esri:27594 2 0x1.22a7376c347dbp3 0x1.2951eb851eb87p5 +REG esri:27594 3 -0x1.1a241b8834db8p2 0x1.7951eb851eb87p5 +REG esri:27594 4 0x1.22a7376c347dbp3 0x1.7951eb851eb87p5 +REG esri:2760 0 -0x1.5ep6 0x1.ep4 +REG esri:2760 1 -0x1.75181116f43fep6 0x1.9p4 +REG esri:2760 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG esri:2760 3 -0x1.75181116f43fep6 0x1.18p5 +REG esri:2760 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG esri:2761 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:2761 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:2761 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:2761 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:2761 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:2762 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:2762 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:2762 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:2762 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:2762 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:2763 0 -0x1.c7p6 0x1.fp4 +REG esri:2763 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:2763 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:2763 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:2763 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:2764 0 -0x1.7p6 0x1.1a44444444444p5 +REG esri:2764 1 -0x1.794f6bc4d5214p6 0x1.0b11111111113p5 +REG esri:2764 2 -0x1.66b0943b2adecp6 0x1.0b11111111113p5 +REG esri:2764 3 -0x1.794f6bc4d5214p6 0x1.2977777777775p5 +REG esri:2764 4 -0x1.66b0943b2adecp6 0x1.2977777777775p5 +REG esri:2765 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG esri:2765 1 -0x1.7a1942726255dp6 0x1.f9ddddddddddap4 +REG esri:2765 2 -0x1.65e6bd8d9daa3p6 0x1.f9ddddddddddap4 +REG esri:2765 3 -0x1.7a1942726255dp6 0x1.1e8888888888bp5 +REG esri:2765 4 -0x1.65e6bd8d9daa3p6 0x1.1e8888888888bp5 +REG esri:2766 0 -0x1.e8p6 0x1.44p5 +REG esri:2766 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:2766 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:2766 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:2766 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:2767 0 -0x1.e8p6 0x1.36p5 +REG esri:2767 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:2767 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:2767 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:2767 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:2768 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:2768 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:2768 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:2768 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:2768 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:2769 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:2769 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:2769 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:2769 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:2769 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:2770 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:2770 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:2770 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:2770 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:2770 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:27700 0 -0x1.0p1 0x1.88p5 +REG esri:27700 1 -0x1.33e1680be4906p3 0x1.6p5 +REG esri:27700 2 0x1.67c2d017c920cp2 0x1.6p5 +REG esri:27700 3 -0x1.33e1680be4906p3 0x1.bp5 +REG esri:27700 4 0x1.67c2d017c920cp2 0x1.bp5 +REG esri:2771 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:2771 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:2771 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:2771 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:2771 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:2772 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:2772 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:2772 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:2772 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:2772 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:2773 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:2773 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:2773 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:2773 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:2773 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:2774 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:2774 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:2774 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:2774 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:2774 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:2775 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:2775 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:2775 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:2775 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:2775 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:2776 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:2776 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:2776 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:2776 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:2776 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:2777 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:2777 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:2777 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:2777 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:2777 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2778 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:2778 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:2778 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:2778 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:2778 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2779 0 -0x1.52p6 0x1.dep4 +REG esri:2779 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:2779 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:2779 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:2779 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:2780 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:2780 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:2780 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:2780 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:2780 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:2781 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:2781 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:2781 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:2781 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:2781 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:2782 0 -0x1.37p7 0x1.2d55555555554p4 +REG esri:2782 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG esri:2782 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG esri:2782 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG esri:2782 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG esri:2783 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG esri:2783 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG esri:2783 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG esri:2783 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG esri:2783 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG esri:2784 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG esri:2784 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG esri:2784 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG esri:2784 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG esri:2784 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG esri:2785 0 -0x1.3fp7 0x1.5d55555555554p4 +REG esri:2785 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG esri:2785 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG esri:2785 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG esri:2785 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG esri:2786 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG esri:2786 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG esri:2786 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG esri:2786 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG esri:2786 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG esri:2787 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:2787 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:2787 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:2787 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:2787 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:2788 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:2788 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:2788 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:2788 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:2788 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:2789 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:2789 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:2789 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:2789 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:2789 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:2790 0 -0x1.6155555555555p6 0x1.2555555555554p5 +REG esri:2790 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaa8p4 +REG esri:2790 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaa8p4 +REG esri:2790 3 -0x1.7a44648b5bcfp6 0x1.4d55555555554p5 +REG esri:2790 4 -0x1.4866461f4edbap6 0x1.4d55555555554p5 +REG esri:2791 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555554p5 +REG esri:2791 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaa8p4 +REG esri:2791 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaa8p4 +REG esri:2791 3 -0x1.8199b9e0b1246p6 0x1.4d55555555554p5 +REG esri:2791 4 -0x1.4fbb9b74a431p6 0x1.4d55555555554p5 +REG esri:2792 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:2792 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:2792 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:2792 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:2792 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:2793 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:2793 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:2793 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:2793 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:2793 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:2794 0 -0x1.76p6 0x1.5311111111112p5 +REG esri:2794 1 -0x1.7f9125dd29e13p6 0x1.44eeeeeeeeeefp5 +REG esri:2794 2 -0x1.6c6eda22d61edp6 0x1.44eeeeeeeeeefp5 +REG esri:2794 3 -0x1.7f9125dd29e13p6 0x1.6133333333335p5 +REG esri:2794 4 -0x1.6c6eda22d61edp6 0x1.6133333333335p5 +REG esri:2795 0 -0x1.76p6 0x1.4722222222222p5 +REG esri:2795 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG esri:2795 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG esri:2795 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG esri:2795 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG esri:2796 0 -0x1.88p6 0x1.3877777777778p5 +REG esri:2796 1 -0x1.8f7828773d56p6 0x1.2cdddddddddep5 +REG esri:2796 2 -0x1.8087d788c2aap6 0x1.2cdddddddddep5 +REG esri:2796 3 -0x1.8f7828773d56p6 0x1.441111111111p5 +REG esri:2796 4 -0x1.8087d788c2aap6 0x1.441111111111p5 +REG esri:2797 0 -0x1.8ap6 0x1.2ceeeeeeeeeeep5 +REG esri:2797 1 -0x1.939837c9c43e8p6 0x1.1dbbbbbbbbbb9p5 +REG esri:2797 2 -0x1.8067c8363bc18p6 0x1.1dbbbbbbbbbb9p5 +REG esri:2797 3 -0x1.939837c9c43e8p6 0x1.3c22222222223p5 +REG esri:2797 4 -0x1.8067c8363bc18p6 0x1.3c22222222223p5 +REG esri:2798 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:2798 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:2798 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:2798 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:2798 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:2799 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:2799 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:2799 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:2799 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:2799 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:2800 0 -0x1.72p6 0x1.f955555555554p4 +REG esri:2800 1 -0x1.7c2c70110dbebp6 0x1.d6aaaaaaaaaacp4 +REG esri:2800 2 -0x1.67d38feef2415p6 0x1.d6aaaaaaaaaacp4 +REG esri:2800 3 -0x1.7c2c70110dbebp6 0x1.0dffffffffffep5 +REG esri:2800 4 -0x1.67d38feef2415p6 0x1.0dffffffffffep5 +REG esri:2801 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG esri:2801 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG esri:2801 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG esri:2801 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG esri:2801 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG esri:2802 0 -0x1.12p6 0x1.5d55555555554p5 +REG esri:2802 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555554p5 +REG esri:2802 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555554p5 +REG esri:2802 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555554p5 +REG esri:2802 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555554p5 +REG esri:2803 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaacp5 +REG esri:2803 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaacp5 +REG esri:2803 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaacp5 +REG esri:2803 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaacp5 +REG esri:2803 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaacp5 +REG esri:2804 0 -0x1.34p6 0x1.3477777777777p5 +REG esri:2804 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG esri:2804 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG esri:2804 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG esri:2804 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG esri:2805 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:2805 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:2805 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:2805 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:2805 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:2806 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:2806 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:2806 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:2806 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:2806 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:2807 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:2807 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:2807 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:2807 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:2807 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:2808 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG esri:2808 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG esri:2808 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG esri:2808 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG esri:2808 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG esri:2809 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG esri:2809 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG esri:2809 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG esri:2809 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG esri:2809 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG esri:2810 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG esri:2810 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG esri:2810 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG esri:2810 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG esri:2810 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG esri:2811 0 -0x1.79p6 0x1.7033333333333p5 +REG esri:2811 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG esri:2811 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG esri:2811 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG esri:2811 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG esri:2812 0 -0x1.78p6 0x1.60ddddddddddep5 +REG esri:2812 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG esri:2812 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG esri:2812 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG esri:2812 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG esri:2813 0 -0x1.6355555555555p6 0x1.d8p4 +REG esri:2813 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG esri:2813 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG esri:2813 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG esri:2813 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG esri:2814 0 -0x1.6955555555555p6 0x1.d8p4 +REG esri:2814 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG esri:2814 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG esri:2814 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG esri:2814 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG esri:2815 0 -0x1.6ap6 0x1.1eaaaaaaaaaacp5 +REG esri:2815 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:2815 2 -0x1.5154a6f944b4fp6 0x1.ed55555555558p4 +REG esri:2815 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:2815 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:2816 0 -0x1.72p6 0x1.1eaaaaaaaaaacp5 +REG esri:2816 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555558p4 +REG esri:2816 2 -0x1.5954a6f944b4fp6 0x1.ed55555555558p4 +REG esri:2816 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaacp5 +REG esri:2816 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaacp5 +REG esri:2817 0 -0x1.7ap6 0x1.2155555555554p5 +REG esri:2817 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaa8p4 +REG esri:2817 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaa8p4 +REG esri:2817 3 -0x1.92c61931dde5cp6 0x1.4955555555554p5 +REG esri:2817 4 -0x1.6139e6ce221a4p6 0x1.4955555555554p5 +REG esri:2818 0 -0x1.b6p6 0x1.75p5 +REG esri:2818 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG esri:2818 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG esri:2818 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG esri:2818 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG esri:2819 0 -0x1.9p6 0x1.4b55555555556p5 +REG esri:2819 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG esri:2819 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG esri:2819 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG esri:2819 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG esri:28191 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG esri:28191 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG esri:28191 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG esri:28191 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG esri:28191 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG esri:28192 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG esri:28192 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG esri:28192 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG esri:28192 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG esri:28192 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG esri:28193 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b81p4 +REG esri:28193 1 0x1.d554aded046b3p4 0x1.abbedc7007b81p4 +REG esri:28193 2 0x1.48ba579e2172ep5 0x1.abbedc7007b81p4 +REG esri:28193 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG esri:28193 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG esri:2820 0 -0x1.ce55555555553p6 0x1.16p5 +REG esri:2820 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG esri:2820 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG esri:2820 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG esri:2820 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG esri:2821 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG esri:2821 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG esri:2821 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG esri:2821 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG esri:2821 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG esri:2822 0 -0x1.da55555555553p6 0x1.16p5 +REG esri:2822 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG esri:2822 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG esri:2822 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG esri:2822 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG esri:2823 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG esri:2823 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG esri:2823 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG esri:2823 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG esri:2823 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG esri:28232 0 0x1.2p3 -0x1.9p4 +REG esri:28232 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:28232 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:28232 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:28232 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:2824 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:2824 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:2824 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:2824 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:2824 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:2825 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:2825 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:2825 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:2825 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:2825 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:2826 0 -0x1.a9p6 0x1.fp4 +REG esri:2826 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:2826 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:2826 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:2826 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:2827 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:2827 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:2827 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:2827 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:2827 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:2828 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:2828 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:2828 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:2828 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:2828 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:2829 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:2829 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:2829 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:2829 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:2829 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:2830 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:2830 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:2830 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:2830 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:2830 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:2831 0 -0x1.28p6 0x1.44cccccccccccp5 +REG esri:2831 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG esri:2831 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG esri:2831 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG esri:2831 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG esri:2832 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:2832 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:2832 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:2832 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:2832 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:2833 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:2833 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:2833 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:2833 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:2833 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:2834 0 -0x1.4ap6 0x1.4577777777777p5 +REG esri:2834 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG esri:2834 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG esri:2834 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG esri:2834 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG esri:28348 0 0x1.a4p6 -0x1.9p4 +REG esri:28348 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:28348 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:28348 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:28348 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:28349 0 0x1.bcp6 -0x1.9p4 +REG esri:28349 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:28349 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:28349 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:28349 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:2835 0 -0x1.4ap6 0x1.3822222222222p5 +REG esri:2835 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG esri:2835 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG esri:2835 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG esri:2835 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG esri:28350 0 0x1.d4p6 -0x1.9p4 +REG esri:28350 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:28350 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:28350 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:28350 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:28351 0 0x1.ecp6 -0x1.9p4 +REG esri:28351 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:28351 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:28351 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:28351 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:28352 0 0x1.02p7 -0x1.9p4 +REG esri:28352 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:28352 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:28352 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:28352 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:28353 0 0x1.0ep7 -0x1.9p4 +REG esri:28353 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:28353 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:28353 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:28353 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:28354 0 0x1.1ap7 -0x1.9p4 +REG esri:28354 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:28354 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:28354 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:28354 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:28355 0 0x1.26p7 -0x1.9p4 +REG esri:28355 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:28355 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:28355 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:28355 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:28356 0 0x1.32p7 -0x1.9p4 +REG esri:28356 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:28356 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:28356 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:28356 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:28357 0 0x1.3ep7 -0x1.9p4 +REG esri:28357 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:28357 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:28357 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:28357 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:28358 0 0x1.4ap7 -0x1.9p4 +REG esri:28358 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:28358 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:28358 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:28358 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:2836 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:2836 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:2836 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:2836 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:2836 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:2837 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:2837 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:2837 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:2837 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:2837 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:2838 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:2838 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:2838 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:2838 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:2838 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:2839 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:2839 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:2839 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:2839 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:2839 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:2840 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG esri:2840 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG esri:2840 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG esri:2840 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG esri:2840 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG esri:28402 0 0x1.2p3 0x0.0p0 +REG esri:28402 1 0x1.0p2 -0x1.4p2 +REG esri:28402 2 0x1.cp3 -0x1.4p2 +REG esri:28402 3 0x1.0p2 0x1.4p2 +REG esri:28402 4 0x1.cp3 0x1.4p2 +REG esri:28403 0 0x1.ep3 0x0.0p0 +REG esri:28403 1 0x1.4p3 -0x1.4p2 +REG esri:28403 2 0x1.4p4 -0x1.4p2 +REG esri:28403 3 0x1.4p3 0x1.4p2 +REG esri:28403 4 0x1.4p4 0x1.4p2 +REG esri:28404 0 0x1.5p4 0x0.0p0 +REG esri:28404 1 0x1.0p4 -0x1.4p2 +REG esri:28404 2 0x1.ap4 -0x1.4p2 +REG esri:28404 3 0x1.0p4 0x1.4p2 +REG esri:28404 4 0x1.ap4 0x1.4p2 +REG esri:28405 0 0x1.bp4 0x0.0p0 +REG esri:28405 1 0x1.6p4 -0x1.4p2 +REG esri:28405 2 0x1.0p5 -0x1.4p2 +REG esri:28405 3 0x1.6p4 0x1.4p2 +REG esri:28405 4 0x1.0p5 0x1.4p2 +REG esri:28406 0 0x1.08p5 0x0.0p0 +REG esri:28406 1 0x1.cp4 -0x1.4p2 +REG esri:28406 2 0x1.3p5 -0x1.4p2 +REG esri:28406 3 0x1.cp4 0x1.4p2 +REG esri:28406 4 0x1.3p5 0x1.4p2 +REG esri:28407 0 0x1.38p5 0x0.0p0 +REG esri:28407 1 0x1.1p5 -0x1.4p2 +REG esri:28407 2 0x1.6p5 -0x1.4p2 +REG esri:28407 3 0x1.1p5 0x1.4p2 +REG esri:28407 4 0x1.6p5 0x1.4p2 +REG esri:28408 0 0x1.68p5 0x0.0p0 +REG esri:28408 1 0x1.4p5 -0x1.4p2 +REG esri:28408 2 0x1.9p5 -0x1.4p2 +REG esri:28408 3 0x1.4p5 0x1.4p2 +REG esri:28408 4 0x1.9p5 0x1.4p2 +REG esri:28409 0 0x1.98p5 0x0.0p0 +REG esri:28409 1 0x1.7p5 -0x1.4p2 +REG esri:28409 2 0x1.cp5 -0x1.4p2 +REG esri:28409 3 0x1.7p5 0x1.4p2 +REG esri:28409 4 0x1.cp5 0x1.4p2 +REG esri:2841 0 -0x1.9p6 0x1.6611111111112p5 +REG esri:2841 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG esri:2841 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG esri:2841 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG esri:2841 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG esri:28410 0 0x1.c8p5 0x0.0p0 +REG esri:28410 1 0x1.ap5 -0x1.4p2 +REG esri:28410 2 0x1.fp5 -0x1.4p2 +REG esri:28410 3 0x1.ap5 0x1.4p2 +REG esri:28410 4 0x1.fp5 0x1.4p2 +REG esri:28411 0 0x1.f8p5 0x0.0p0 +REG esri:28411 1 0x1.dp5 -0x1.4p2 +REG esri:28411 2 0x1.1p6 -0x1.4p2 +REG esri:28411 3 0x1.dp5 0x1.4p2 +REG esri:28411 4 0x1.1p6 0x1.4p2 +REG esri:28412 0 0x1.14p6 0x0.0p0 +REG esri:28412 1 0x1.0p6 -0x1.4p2 +REG esri:28412 2 0x1.28p6 -0x1.4p2 +REG esri:28412 3 0x1.0p6 0x1.4p2 +REG esri:28412 4 0x1.28p6 0x1.4p2 +REG esri:28413 0 0x1.2cp6 0x0.0p0 +REG esri:28413 1 0x1.18p6 -0x1.4p2 +REG esri:28413 2 0x1.4p6 -0x1.4p2 +REG esri:28413 3 0x1.18p6 0x1.4p2 +REG esri:28413 4 0x1.4p6 0x1.4p2 +REG esri:28414 0 0x1.44p6 0x0.0p0 +REG esri:28414 1 0x1.3p6 -0x1.4p2 +REG esri:28414 2 0x1.58p6 -0x1.4p2 +REG esri:28414 3 0x1.3p6 0x1.4p2 +REG esri:28414 4 0x1.58p6 0x1.4p2 +REG esri:28415 0 0x1.5cp6 0x0.0p0 +REG esri:28415 1 0x1.48p6 -0x1.4p2 +REG esri:28415 2 0x1.7p6 -0x1.4p2 +REG esri:28415 3 0x1.48p6 0x1.4p2 +REG esri:28415 4 0x1.7p6 0x1.4p2 +REG esri:28416 0 0x1.74p6 0x0.0p0 +REG esri:28416 1 0x1.6p6 -0x1.4p2 +REG esri:28416 2 0x1.88p6 -0x1.4p2 +REG esri:28416 3 0x1.6p6 0x1.4p2 +REG esri:28416 4 0x1.88p6 0x1.4p2 +REG esri:28417 0 0x1.8cp6 0x0.0p0 +REG esri:28417 1 0x1.78p6 -0x1.4p2 +REG esri:28417 2 0x1.ap6 -0x1.4p2 +REG esri:28417 3 0x1.78p6 0x1.4p2 +REG esri:28417 4 0x1.ap6 0x1.4p2 +REG esri:28418 0 0x1.a4p6 0x0.0p0 +REG esri:28418 1 0x1.9p6 -0x1.4p2 +REG esri:28418 2 0x1.b8p6 -0x1.4p2 +REG esri:28418 3 0x1.9p6 0x1.4p2 +REG esri:28418 4 0x1.b8p6 0x1.4p2 +REG esri:28419 0 0x1.bcp6 0x0.0p0 +REG esri:28419 1 0x1.a8p6 -0x1.4p2 +REG esri:28419 2 0x1.dp6 -0x1.4p2 +REG esri:28419 3 0x1.a8p6 0x1.4p2 +REG esri:28419 4 0x1.dp6 0x1.4p2 +REG esri:2842 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG esri:2842 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG esri:2842 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG esri:2842 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG esri:2842 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG esri:28420 0 0x1.d4p6 0x0.0p0 +REG esri:28420 1 0x1.cp6 -0x1.4p2 +REG esri:28420 2 0x1.e8p6 -0x1.4p2 +REG esri:28420 3 0x1.cp6 0x1.4p2 +REG esri:28420 4 0x1.e8p6 0x1.4p2 +REG esri:28421 0 0x1.ecp6 0x0.0p0 +REG esri:28421 1 0x1.d8p6 -0x1.4p2 +REG esri:28421 2 0x1.0p7 -0x1.4p2 +REG esri:28421 3 0x1.d8p6 0x1.4p2 +REG esri:28421 4 0x1.0p7 0x1.4p2 +REG esri:28422 0 0x1.02p7 0x0.0p0 +REG esri:28422 1 0x1.fp6 -0x1.4p2 +REG esri:28422 2 0x1.0cp7 -0x1.4p2 +REG esri:28422 3 0x1.fp6 0x1.4p2 +REG esri:28422 4 0x1.0cp7 0x1.4p2 +REG esri:28423 0 0x1.0ep7 0x0.0p0 +REG esri:28423 1 0x1.04p7 -0x1.4p2 +REG esri:28423 2 0x1.18p7 -0x1.4p2 +REG esri:28423 3 0x1.04p7 0x1.4p2 +REG esri:28423 4 0x1.18p7 0x1.4p2 +REG esri:28424 0 0x1.1ap7 0x0.0p0 +REG esri:28424 1 0x1.1p7 -0x1.4p2 +REG esri:28424 2 0x1.24p7 -0x1.4p2 +REG esri:28424 3 0x1.1p7 0x1.4p2 +REG esri:28424 4 0x1.24p7 0x1.4p2 +REG esri:28425 0 0x1.26p7 0x0.0p0 +REG esri:28425 1 0x1.1cp7 -0x1.4p2 +REG esri:28425 2 0x1.3p7 -0x1.4p2 +REG esri:28425 3 0x1.1cp7 0x1.4p2 +REG esri:28425 4 0x1.3p7 0x1.4p2 +REG esri:28426 0 0x1.32p7 0x0.0p0 +REG esri:28426 1 0x1.28p7 -0x1.4p2 +REG esri:28426 2 0x1.3cp7 -0x1.4p2 +REG esri:28426 3 0x1.28p7 0x1.4p2 +REG esri:28426 4 0x1.3cp7 0x1.4p2 +REG esri:28427 0 0x1.3ep7 0x0.0p0 +REG esri:28427 1 0x1.34p7 -0x1.4p2 +REG esri:28427 2 0x1.48p7 -0x1.4p2 +REG esri:28427 3 0x1.34p7 0x1.4p2 +REG esri:28427 4 0x1.48p7 0x1.4p2 +REG esri:28428 0 0x1.4ap7 0x0.0p0 +REG esri:28428 1 0x1.4p7 -0x1.4p2 +REG esri:28428 2 0x1.54p7 -0x1.4p2 +REG esri:28428 3 0x1.4p7 0x1.4p2 +REG esri:28428 4 0x1.54p7 0x1.4p2 +REG esri:28429 0 0x1.56p7 0x0.0p0 +REG esri:28429 1 0x1.4cp7 -0x1.4p2 +REG esri:28429 2 0x1.6p7 -0x1.4p2 +REG esri:28429 3 0x1.4cp7 0x1.4p2 +REG esri:28429 4 0x1.6p7 0x1.4p2 +REG esri:2843 0 -0x1.58p6 0x1.1bp5 +REG esri:2843 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG esri:2843 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG esri:2843 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG esri:2843 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG esri:28430 0 0x1.62p7 0x0.0p0 +REG esri:28430 1 0x1.58p7 -0x1.4p2 +REG esri:28430 2 -0x1.64p7 -0x1.4p2 +REG esri:28430 3 0x1.58p7 0x1.4p2 +REG esri:28430 4 -0x1.64p7 0x1.4p2 +REG esri:28431 0 -0x1.62p7 0x0.0p0 +REG esri:28431 1 0x1.64p7 -0x1.4p2 +REG esri:28431 2 -0x1.58p7 -0x1.4p2 +REG esri:28431 3 0x1.64p7 0x1.4p2 +REG esri:28431 4 -0x1.58p7 0x1.4p2 +REG esri:28432 0 -0x1.56p7 0x0.0p0 +REG esri:28432 1 -0x1.6p7 -0x1.4p2 +REG esri:28432 2 -0x1.4cp7 -0x1.4p2 +REG esri:28432 3 -0x1.6p7 0x1.4p2 +REG esri:28432 4 -0x1.4cp7 0x1.4p2 +REG esri:2844 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:2844 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:2844 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:2844 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:2844 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:2845 0 -0x1.8ap6 0x1.0688888888889p5 +REG esri:2845 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG esri:2845 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG esri:2845 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:2845 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:2846 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:2846 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:2846 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:2846 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:2846 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:28462 0 0x1.2p3 0x0.0p0 +REG esri:28462 1 0x1.0p2 -0x1.4p2 +REG esri:28462 2 0x1.cp3 -0x1.4p2 +REG esri:28462 3 0x1.0p2 0x1.4p2 +REG esri:28462 4 0x1.cp3 0x1.4p2 +REG esri:28463 0 0x1.ep3 0x0.0p0 +REG esri:28463 1 0x1.4p3 -0x1.4p2 +REG esri:28463 2 0x1.4p4 -0x1.4p2 +REG esri:28463 3 0x1.4p3 0x1.4p2 +REG esri:28463 4 0x1.4p4 0x1.4p2 +REG esri:28464 0 0x1.5p4 0x0.0p0 +REG esri:28464 1 0x1.0p4 -0x1.4p2 +REG esri:28464 2 0x1.ap4 -0x1.4p2 +REG esri:28464 3 0x1.0p4 0x1.4p2 +REG esri:28464 4 0x1.ap4 0x1.4p2 +REG esri:28465 0 0x1.bp4 0x0.0p0 +REG esri:28465 1 0x1.6p4 -0x1.4p2 +REG esri:28465 2 0x1.0p5 -0x1.4p2 +REG esri:28465 3 0x1.6p4 0x1.4p2 +REG esri:28465 4 0x1.0p5 0x1.4p2 +REG esri:28466 0 0x1.08p5 0x0.0p0 +REG esri:28466 1 0x1.cp4 -0x1.4p2 +REG esri:28466 2 0x1.3p5 -0x1.4p2 +REG esri:28466 3 0x1.cp4 0x1.4p2 +REG esri:28466 4 0x1.3p5 0x1.4p2 +REG esri:28467 0 0x1.38p5 0x0.0p0 +REG esri:28467 1 0x1.1p5 -0x1.4p2 +REG esri:28467 2 0x1.6p5 -0x1.4p2 +REG esri:28467 3 0x1.1p5 0x1.4p2 +REG esri:28467 4 0x1.6p5 0x1.4p2 +REG esri:28468 0 0x1.68p5 0x0.0p0 +REG esri:28468 1 0x1.4p5 -0x1.4p2 +REG esri:28468 2 0x1.9p5 -0x1.4p2 +REG esri:28468 3 0x1.4p5 0x1.4p2 +REG esri:28468 4 0x1.9p5 0x1.4p2 +REG esri:28469 0 0x1.98p5 0x0.0p0 +REG esri:28469 1 0x1.7p5 -0x1.4p2 +REG esri:28469 2 0x1.cp5 -0x1.4p2 +REG esri:28469 3 0x1.7p5 0x1.4p2 +REG esri:28469 4 0x1.cp5 0x1.4p2 +REG esri:2847 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG esri:2847 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG esri:2847 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG esri:2847 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG esri:2847 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG esri:28470 0 0x1.c8p5 0x0.0p0 +REG esri:28470 1 0x1.ap5 -0x1.4p2 +REG esri:28470 2 0x1.fp5 -0x1.4p2 +REG esri:28470 3 0x1.ap5 0x1.4p2 +REG esri:28470 4 0x1.fp5 0x1.4p2 +REG esri:28471 0 0x1.f8p5 0x0.0p0 +REG esri:28471 1 0x1.dp5 -0x1.4p2 +REG esri:28471 2 0x1.1p6 -0x1.4p2 +REG esri:28471 3 0x1.dp5 0x1.4p2 +REG esri:28471 4 0x1.1p6 0x1.4p2 +REG esri:28472 0 0x1.14p6 0x0.0p0 +REG esri:28472 1 0x1.0p6 -0x1.4p2 +REG esri:28472 2 0x1.28p6 -0x1.4p2 +REG esri:28472 3 0x1.0p6 0x1.4p2 +REG esri:28472 4 0x1.28p6 0x1.4p2 +REG esri:28473 0 0x1.2cp6 0x0.0p0 +REG esri:28473 1 0x1.18p6 -0x1.4p2 +REG esri:28473 2 0x1.4p6 -0x1.4p2 +REG esri:28473 3 0x1.18p6 0x1.4p2 +REG esri:28473 4 0x1.4p6 0x1.4p2 +REG esri:28474 0 0x1.44p6 0x0.0p0 +REG esri:28474 1 0x1.3p6 -0x1.4p2 +REG esri:28474 2 0x1.58p6 -0x1.4p2 +REG esri:28474 3 0x1.3p6 0x1.4p2 +REG esri:28474 4 0x1.58p6 0x1.4p2 +REG esri:28475 0 0x1.5cp6 0x0.0p0 +REG esri:28475 1 0x1.48p6 -0x1.4p2 +REG esri:28475 2 0x1.7p6 -0x1.4p2 +REG esri:28475 3 0x1.48p6 0x1.4p2 +REG esri:28475 4 0x1.7p6 0x1.4p2 +REG esri:28476 0 0x1.74p6 0x0.0p0 +REG esri:28476 1 0x1.6p6 -0x1.4p2 +REG esri:28476 2 0x1.88p6 -0x1.4p2 +REG esri:28476 3 0x1.6p6 0x1.4p2 +REG esri:28476 4 0x1.88p6 0x1.4p2 +REG esri:28477 0 0x1.8cp6 0x0.0p0 +REG esri:28477 1 0x1.78p6 -0x1.4p2 +REG esri:28477 2 0x1.ap6 -0x1.4p2 +REG esri:28477 3 0x1.78p6 0x1.4p2 +REG esri:28477 4 0x1.ap6 0x1.4p2 +REG esri:28478 0 0x1.a4p6 0x0.0p0 +REG esri:28478 1 0x1.9p6 -0x1.4p2 +REG esri:28478 2 0x1.b8p6 -0x1.4p2 +REG esri:28478 3 0x1.9p6 0x1.4p2 +REG esri:28478 4 0x1.b8p6 0x1.4p2 +REG esri:28479 0 0x1.bcp6 0x0.0p0 +REG esri:28479 1 0x1.a8p6 -0x1.4p2 +REG esri:28479 2 0x1.dp6 -0x1.4p2 +REG esri:28479 3 0x1.a8p6 0x1.4p2 +REG esri:28479 4 0x1.dp6 0x1.4p2 +REG esri:2848 0 -0x1.8ap6 0x1.acp4 +REG esri:2848 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:2848 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:2848 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:2848 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:28480 0 0x1.d4p6 0x0.0p0 +REG esri:28480 1 0x1.cp6 -0x1.4p2 +REG esri:28480 2 0x1.e8p6 -0x1.4p2 +REG esri:28480 3 0x1.cp6 0x1.4p2 +REG esri:28480 4 0x1.e8p6 0x1.4p2 +REG esri:28481 0 0x1.ecp6 0x0.0p0 +REG esri:28481 1 0x1.d8p6 -0x1.4p2 +REG esri:28481 2 0x1.0p7 -0x1.4p2 +REG esri:28481 3 0x1.d8p6 0x1.4p2 +REG esri:28481 4 0x1.0p7 0x1.4p2 +REG esri:28482 0 0x1.02p7 0x0.0p0 +REG esri:28482 1 0x1.fp6 -0x1.4p2 +REG esri:28482 2 0x1.0cp7 -0x1.4p2 +REG esri:28482 3 0x1.fp6 0x1.4p2 +REG esri:28482 4 0x1.0cp7 0x1.4p2 +REG esri:28483 0 0x1.0ep7 0x0.0p0 +REG esri:28483 1 0x1.04p7 -0x1.4p2 +REG esri:28483 2 0x1.18p7 -0x1.4p2 +REG esri:28483 3 0x1.04p7 0x1.4p2 +REG esri:28483 4 0x1.18p7 0x1.4p2 +REG esri:28484 0 0x1.1ap7 0x0.0p0 +REG esri:28484 1 0x1.1p7 -0x1.4p2 +REG esri:28484 2 0x1.24p7 -0x1.4p2 +REG esri:28484 3 0x1.1p7 0x1.4p2 +REG esri:28484 4 0x1.24p7 0x1.4p2 +REG esri:28485 0 0x1.26p7 0x0.0p0 +REG esri:28485 1 0x1.1cp7 -0x1.4p2 +REG esri:28485 2 0x1.3p7 -0x1.4p2 +REG esri:28485 3 0x1.1cp7 0x1.4p2 +REG esri:28485 4 0x1.3p7 0x1.4p2 +REG esri:28486 0 0x1.32p7 0x0.0p0 +REG esri:28486 1 0x1.28p7 -0x1.4p2 +REG esri:28486 2 0x1.3cp7 -0x1.4p2 +REG esri:28486 3 0x1.28p7 0x1.4p2 +REG esri:28486 4 0x1.3cp7 0x1.4p2 +REG esri:28487 0 0x1.3ep7 0x0.0p0 +REG esri:28487 1 0x1.34p7 -0x1.4p2 +REG esri:28487 2 0x1.48p7 -0x1.4p2 +REG esri:28487 3 0x1.34p7 0x1.4p2 +REG esri:28487 4 0x1.48p7 0x1.4p2 +REG esri:28488 0 0x1.4ap7 0x0.0p0 +REG esri:28488 1 0x1.4p7 -0x1.4p2 +REG esri:28488 2 0x1.54p7 -0x1.4p2 +REG esri:28488 3 0x1.4p7 0x1.4p2 +REG esri:28488 4 0x1.54p7 0x1.4p2 +REG esri:28489 0 0x1.56p7 0x0.0p0 +REG esri:28489 1 0x1.4cp7 -0x1.4p2 +REG esri:28489 2 0x1.6p7 -0x1.4p2 +REG esri:28489 3 0x1.4cp7 0x1.4p2 +REG esri:28489 4 0x1.6p7 0x1.4p2 +REG esri:2849 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:2849 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:2849 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:2849 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:2849 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:28490 0 0x1.62p7 0x0.0p0 +REG esri:28490 1 0x1.58p7 -0x1.4p2 +REG esri:28490 2 -0x1.64p7 -0x1.4p2 +REG esri:28490 3 0x1.58p7 0x1.4p2 +REG esri:28490 4 -0x1.64p7 0x1.4p2 +REG esri:28491 0 -0x1.62p7 0x0.0p0 +REG esri:28491 1 0x1.64p7 -0x1.4p2 +REG esri:28491 2 -0x1.58p7 -0x1.4p2 +REG esri:28491 3 0x1.64p7 0x1.4p2 +REG esri:28491 4 -0x1.58p7 0x1.4p2 +REG esri:28492 0 -0x1.56p7 0x0.0p0 +REG esri:28492 1 -0x1.6p7 -0x1.4p2 +REG esri:28492 2 -0x1.4cp7 -0x1.4p2 +REG esri:28492 3 -0x1.6p7 0x1.4p2 +REG esri:28492 4 -0x1.4cp7 0x1.4p2 +REG esri:2850 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:2850 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:2850 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:2850 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:2850 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:2851 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:2851 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:2851 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:2851 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:2851 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:2852 0 -0x1.22p6 0x1.54p5 +REG esri:2852 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG esri:2852 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG esri:2852 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG esri:2852 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG esri:2853 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:2853 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:2853 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:2853 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:2853 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:2854 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:2854 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:2854 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:2854 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:2854 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:2855 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:2855 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:2855 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:2855 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:2855 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:2856 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:2856 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:2856 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:2856 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:2856 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:2857 0 -0x1.3ep6 0x1.3bp5 +REG esri:2857 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG esri:2857 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG esri:2857 3 -0x1.470e3592d233ap6 0x1.49p5 +REG esri:2857 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG esri:2858 0 -0x1.44p6 0x1.2f88888888888p5 +REG esri:2858 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG esri:2858 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG esri:2858 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG esri:2858 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG esri:2859 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:2859 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:2859 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:2859 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:2859 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:2860 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:2860 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:2860 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:2860 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:2860 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:28600 0 0x1.99bbbbbbbbbbcp5 0x1.8733333333333p4 +REG esri:28600 1 0x1.6dcaf9f8d3f58p5 0x1.3733333333333p4 +REG esri:28600 2 0x1.c5ac7d7ea382p5 0x1.3733333333333p4 +REG esri:28600 3 0x1.6dcaf9f8d3f58p5 0x1.d733333333333p4 +REG esri:28600 4 0x1.c5ac7d7ea382p5 0x1.d733333333333p4 +REG esri:2861 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:2861 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:2861 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:2861 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:2861 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:2862 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG esri:2862 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG esri:2862 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG esri:2862 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG esri:2862 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG esri:2863 0 -0x1.ad55555555553p6 0x1.44p5 +REG esri:2863 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG esri:2863 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG esri:2863 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG esri:2863 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG esri:2864 0 -0x1.b3p6 0x1.44p5 +REG esri:2864 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG esri:2864 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG esri:2864 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG esri:2864 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG esri:2865 0 -0x1.b855555555553p6 0x1.44p5 +REG esri:2865 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG esri:2865 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG esri:2865 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG esri:2865 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG esri:2866 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:2866 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:2866 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:2866 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:2866 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:2867 0 -0x1.b8aaaaaaaaaadp6 0x1.fp4 +REG esri:2867 1 -0x1.cfffd4649fe44p6 0x1.ap4 +REG esri:2867 2 -0x1.a15580f0b5716p6 0x1.ap4 +REG esri:2867 3 -0x1.cfffd4649fe44p6 0x1.2p5 +REG esri:2867 4 -0x1.a15580f0b5716p6 0x1.2p5 +REG esri:2868 0 -0x1.bfaaaaaaaaaadp6 0x1.fp4 +REG esri:2868 1 -0x1.d6ffd4649fe44p6 0x1.ap4 +REG esri:2868 2 -0x1.a85580f0b5716p6 0x1.ap4 +REG esri:2868 3 -0x1.d6ffd4649fe44p6 0x1.2p5 +REG esri:2868 4 -0x1.a85580f0b5716p6 0x1.2p5 +REG esri:2869 0 -0x1.c7p6 0x1.fp4 +REG esri:2869 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG esri:2869 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG esri:2869 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG esri:2869 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG esri:2870 0 -0x1.e8p6 0x1.44p5 +REG esri:2870 1 -0x1.f4462e6374a3ap6 0x1.3155555555558p5 +REG esri:2870 2 -0x1.dbb9d19c8b5c6p6 0x1.3155555555558p5 +REG esri:2870 3 -0x1.f4462e6374a3ap6 0x1.56aaaaaaaaaa8p5 +REG esri:2870 4 -0x1.dbb9d19c8b5c6p6 0x1.56aaaaaaaaaa8p5 +REG esri:2871 0 -0x1.e8p6 0x1.36p5 +REG esri:2871 1 -0x1.f31cdda2c7b92p6 0x1.24aaaaaaaaaa8p5 +REG esri:2871 2 -0x1.dce3225d3846ep6 0x1.24aaaaaaaaaa8p5 +REG esri:2871 3 -0x1.f31cdda2c7b92p6 0x1.4755555555558p5 +REG esri:2871 4 -0x1.dce3225d3846ep6 0x1.4755555555558p5 +REG esri:2872 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG esri:2872 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG esri:2872 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG esri:2872 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG esri:2872 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG esri:2873 0 -0x1.dcp6 0x1.2255555555556p5 +REG esri:2873 1 -0x1.e58306e0bb625p6 0x1.1300000000002p5 +REG esri:2873 2 -0x1.d27cf91f449dbp6 0x1.1300000000002p5 +REG esri:2873 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaaap5 +REG esri:2873 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaaap5 +REG esri:2874 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG esri:2874 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG esri:2874 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG esri:2874 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG esri:2874 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG esri:2875 0 -0x1.d1p6 0x1.0833333333332p5 +REG esri:2875 1 -0x1.d9309c27706f8p6 0x1.f4eeeeeeeeeeap4 +REG esri:2875 2 -0x1.c8cf63d88f908p6 0x1.f4eeeeeeeeeeap4 +REG esri:2875 3 -0x1.d9309c27706f8p6 0x1.15eeeeeeeeeefp5 +REG esri:2875 4 -0x1.c8cf63d88f908p6 0x1.15eeeeeeeeeefp5 +REG esri:2876 0 -0x1.a6p6 0x1.4077777777778p5 +REG esri:2876 1 -0x1.ad93ed5106ce2p6 0x1.34dddddddddep5 +REG esri:2876 2 -0x1.9e6c12aef931ep6 0x1.34dddddddddep5 +REG esri:2876 3 -0x1.ad93ed5106ce2p6 0x1.4c1111111111p5 +REG esri:2876 4 -0x1.9e6c12aef931ep6 0x1.4c1111111111p5 +REG esri:2877 0 -0x1.a6p6 0x1.3655555555556p5 +REG esri:2877 1 -0x1.afd615170d5c8p6 0x1.2700000000002p5 +REG esri:2877 2 -0x1.9c29eae8f2a38p6 0x1.2700000000002p5 +REG esri:2877 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaaap5 +REG esri:2877 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaaap5 +REG esri:2878 0 -0x1.a6p6 0x1.2c66666666666p5 +REG esri:2878 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444443p5 +REG esri:2878 2 -0x1.9d16314badd4bp6 0x1.1e44444444443p5 +REG esri:2878 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888889p5 +REG esri:2878 4 -0x1.9d16314badd4bp6 0x1.3a88888888889p5 +REG esri:2879 0 -0x1.23p6 0x1.4accccccccccep5 +REG esri:2879 1 -0x1.28818d3773553p6 0x1.428888888888bp5 +REG esri:2879 2 -0x1.1d7e72c88caadp6 0x1.428888888888bp5 +REG esri:2879 3 -0x1.28818d3773553p6 0x1.5311111111111p5 +REG esri:2879 4 -0x1.1d7e72c88caadp6 0x1.5311111111111p5 +REG esri:2880 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG esri:2880 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG esri:2880 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG esri:2880 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG esri:2880 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG esri:2881 0 -0x1.44p6 0x1.8555555555554p4 +REG esri:2881 1 -0x1.59f33012348e1p6 0x1.3555555555554p4 +REG esri:2881 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555554p4 +REG esri:2881 3 -0x1.59f33012348e1p6 0x1.d555555555554p4 +REG esri:2881 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2882 0 -0x1.48p6 0x1.8555555555554p4 +REG esri:2882 1 -0x1.5df33012348e1p6 0x1.3555555555554p4 +REG esri:2882 2 -0x1.320ccfedcb71fp6 0x1.3555555555554p4 +REG esri:2882 3 -0x1.5df33012348e1p6 0x1.d555555555554p4 +REG esri:2882 4 -0x1.320ccfedcb71fp6 0x1.d555555555554p4 +REG esri:2883 0 -0x1.52p6 0x1.dep4 +REG esri:2883 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG esri:2883 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG esri:2883 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG esri:2883 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG esri:2884 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG esri:2884 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG esri:2884 2 -0x1.31929993b66adp6 0x1.9p4 +REG esri:2884 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG esri:2884 4 -0x1.31929993b66adp6 0x1.18p5 +REG esri:2885 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG esri:2885 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG esri:2885 2 -0x1.39929993b66adp6 0x1.9p4 +REG esri:2885 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG esri:2885 4 -0x1.39929993b66adp6 0x1.18p5 +REG esri:2886 0 -0x1.c0aaaaaaaaaadp6 0x1.4d55555555554p5 +REG esri:2886 1 -0x1.db708506a0f72p6 0x1.2555555555554p5 +REG esri:2886 2 -0x1.a5e4d04eb45e8p6 0x1.2555555555554p5 +REG esri:2886 3 -0x1.db708506a0f72p6 0x1.7555555555554p5 +REG esri:2886 4 -0x1.a5e4d04eb45e8p6 0x1.7555555555554p5 +REG esri:2887 0 -0x1.c8p6 0x1.4d55555555554p5 +REG esri:2887 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:2887 2 -0x1.ad3a25a409b3bp6 0x1.2555555555554p5 +REG esri:2887 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:2887 4 -0x1.ad3a25a409b3bp6 0x1.7555555555554p5 +REG esri:2888 0 -0x1.cfp6 0x1.4d55555555554p5 +REG esri:2888 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555554p5 +REG esri:2888 2 -0x1.b43a25a409b3bp6 0x1.2555555555554p5 +REG esri:2888 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555554p5 +REG esri:2888 4 -0x1.b43a25a409b3bp6 0x1.7555555555554p5 +REG esri:2889 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG esri:2889 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG esri:2889 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG esri:2889 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG esri:2889 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG esri:2890 0 -0x1.5c55555555555p6 0x1.2cp5 +REG esri:2890 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG esri:2890 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG esri:2890 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG esri:2890 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG esri:2891 0 -0x1.51p6 0x1.31ddddddddddep5 +REG esri:2891 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG esri:2891 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG esri:2891 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG esri:2891 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG esri:2892 0 -0x1.57p6 0x1.2911111111112p5 +REG esri:2892 1 -0x1.5f071bc4256ebp6 0x1.1c44444444447p5 +REG esri:2892 2 -0x1.4ef8e43bda915p6 0x1.1c44444444447p5 +REG esri:2892 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG esri:2892 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG esri:2893 0 -0x1.34p6 0x1.3477777777777p5 +REG esri:2893 1 -0x1.3d1f495fce8b1p6 0x1.2633333333331p5 +REG esri:2893 2 -0x1.2ae0b6a03174fp6 0x1.2633333333331p5 +REG esri:2893 3 -0x1.3d1f495fce8b1p6 0x1.42bbbbbbbbbbdp5 +REG esri:2893 4 -0x1.2ae0b6a03174fp6 0x1.42bbbbbbbbbbdp5 +REG esri:2894 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG esri:2894 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG esri:2894 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG esri:2894 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG esri:2894 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG esri:2895 0 -0x1.1ap6 0x1.49eeeeeeeeeeep5 +REG esri:2895 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeeep5 +REG esri:2895 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeeep5 +REG esri:2895 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeeep5 +REG esri:2895 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeeep5 +REG esri:2896 0 -0x1.5cp6 0x1.6f77777777778p5 +REG esri:2896 1 -0x1.693a5d9ac6986p6 0x1.5d1111111111p5 +REG esri:2896 2 -0x1.4ec5a2653967ap6 0x1.5d1111111111p5 +REG esri:2896 3 -0x1.693a5d9ac6986p6 0x1.81dddddddddep5 +REG esri:2896 4 -0x1.4ec5a2653967ap6 0x1.81dddddddddep5 +REG esri:2897 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG esri:2897 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG esri:2897 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG esri:2897 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG esri:2897 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG esri:2898 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG esri:2898 1 -0x1.5d3cc18569e1ap6 0x1.4355555555556p5 +REG esri:2898 2 -0x1.45b22d69850d4p6 0x1.4355555555556p5 +REG esri:2898 3 -0x1.5d3cc18569e1ap6 0x1.65ffffffffffep5 +REG esri:2898 4 -0x1.45b22d69850d4p6 0x1.65ffffffffffep5 +REG esri:2899 0 -0x1.6355555555555p6 0x1.d8p4 +REG esri:2899 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG esri:2899 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG esri:2899 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG esri:2899 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG esri:28991 0 0x1.58cf13579be04p2 0x1.a13fd11af84a5p5 +REG esri:28991 1 -0x1.618eba230a3e8p1 0x1.793fd11af84a5p5 +REG esri:28991 2 0x1.b132c1e05e6fep3 0x1.793fd11af84a5p5 +REG esri:28991 3 -0x1.618eba230a3e8p1 0x1.c93fd11af84a5p5 +REG esri:28991 4 0x1.b132c1e05e6fep3 0x1.c93fd11af84a5p5 +REG esri:28992 0 0x1.58cf13579be04p2 0x1.a13fd11af84a5p5 +REG esri:28992 1 -0x1.618eba230a3e8p1 0x1.793fd11af84a5p5 +REG esri:28992 2 0x1.b132c1e05e6fep3 0x1.793fd11af84a5p5 +REG esri:28992 3 -0x1.618eba230a3e8p1 0x1.c93fd11af84a5p5 +REG esri:28992 4 0x1.b132c1e05e6fep3 0x1.c93fd11af84a5p5 +REG esri:2900 0 -0x1.6955555555555p6 0x1.d8p4 +REG esri:2900 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG esri:2900 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG esri:2900 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG esri:2900 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG esri:2901 0 -0x1.b6p6 0x1.75p5 +REG esri:2901 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG esri:2901 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG esri:2901 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG esri:2901 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG esri:2902 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:2902 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:2902 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:2902 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:2902 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:2903 0 -0x1.a9p6 0x1.fp4 +REG esri:2903 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:2903 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:2903 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:2903 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:2904 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:2904 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:2904 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:2904 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:2904 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:2905 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:2905 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:2905 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:2905 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:2905 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:2906 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:2906 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:2906 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:2906 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:2906 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:2907 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:2907 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:2907 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:2907 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:2907 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:2908 0 -0x1.28p6 0x1.44cccccccccccp5 +REG esri:2908 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG esri:2908 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG esri:2908 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG esri:2908 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG esri:2909 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:2909 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:2909 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:2909 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:2909 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:2910 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:2910 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:2910 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:2910 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:2910 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:29100 0 -0x1.bp5 0x0.0p0 +REG esri:29100 1 -0x1.d8p5 -0x1.4p2 +REG esri:29100 2 -0x1.88p5 -0x1.4p2 +REG esri:29100 3 -0x1.d8p5 0x1.4p2 +REG esri:29100 4 -0x1.88p5 0x1.4p2 +REG esri:2911 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:2911 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:2911 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:2911 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:2911 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:29118 0 -0x1.2cp6 0x0.0p0 +REG esri:29118 1 -0x1.4p6 -0x1.4p2 +REG esri:29118 2 -0x1.18p6 -0x1.4p2 +REG esri:29118 3 -0x1.4p6 0x1.4p2 +REG esri:29118 4 -0x1.18p6 0x1.4p2 +REG esri:29119 0 -0x1.14p6 0x0.0p0 +REG esri:29119 1 -0x1.28p6 -0x1.4p2 +REG esri:29119 2 -0x1.0p6 -0x1.4p2 +REG esri:29119 3 -0x1.28p6 0x1.4p2 +REG esri:29119 4 -0x1.0p6 0x1.4p2 +REG esri:2912 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:2912 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:2912 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:2912 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:2912 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:29120 0 -0x1.f8p5 0x0.0p0 +REG esri:29120 1 -0x1.1p6 -0x1.4p2 +REG esri:29120 2 -0x1.dp5 -0x1.4p2 +REG esri:29120 3 -0x1.1p6 0x1.4p2 +REG esri:29120 4 -0x1.dp5 0x1.4p2 +REG esri:29121 0 -0x1.c8p5 0x0.0p0 +REG esri:29121 1 -0x1.fp5 -0x1.4p2 +REG esri:29121 2 -0x1.ap5 -0x1.4p2 +REG esri:29121 3 -0x1.fp5 0x1.4p2 +REG esri:29121 4 -0x1.ap5 0x1.4p2 +REG esri:29122 0 -0x1.98p5 0x0.0p0 +REG esri:29122 1 -0x1.cp5 -0x1.4p2 +REG esri:29122 2 -0x1.7p5 -0x1.4p2 +REG esri:29122 3 -0x1.cp5 0x1.4p2 +REG esri:29122 4 -0x1.7p5 0x1.4p2 +REG esri:2913 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:2913 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:2913 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:2913 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:2913 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:2914 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:2914 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:2914 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:2914 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:2914 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:2915 0 -0x1.58p6 0x1.1bp5 +REG esri:2915 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG esri:2915 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG esri:2915 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG esri:2915 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG esri:2916 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:2916 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:2916 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:2916 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:2916 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:2917 0 -0x1.8ap6 0x1.0688888888889p5 +REG esri:2917 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG esri:2917 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG esri:2917 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:2917 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:29177 0 -0x1.44p6 -0x1.9p4 +REG esri:29177 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG esri:29177 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:29177 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG esri:29177 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:29178 0 -0x1.2cp6 -0x1.9p4 +REG esri:29178 1 -0x1.42114b818572ep6 -0x1.ep4 +REG esri:29178 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:29178 3 -0x1.42114b818572ep6 -0x1.4p4 +REG esri:29178 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:29179 0 -0x1.14p6 -0x1.9p4 +REG esri:29179 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:29179 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:29179 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:29179 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:2918 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:2918 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:2918 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:2918 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:2918 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:29180 0 -0x1.f8p5 -0x1.9p4 +REG esri:29180 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:29180 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:29180 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:29180 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:29181 0 -0x1.c8p5 -0x1.9p4 +REG esri:29181 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:29181 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:29181 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:29181 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:29182 0 -0x1.98p5 -0x1.9p4 +REG esri:29182 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:29182 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:29182 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:29182 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:29183 0 -0x1.68p5 -0x1.9p4 +REG esri:29183 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:29183 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:29183 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:29183 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:29184 0 -0x1.38p5 -0x1.9p4 +REG esri:29184 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:29184 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:29184 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:29184 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:29185 0 -0x1.08p5 -0x1.9p4 +REG esri:29185 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG esri:29185 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:29185 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG esri:29185 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:2919 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG esri:2919 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG esri:2919 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG esri:2919 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG esri:2919 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG esri:2920 0 -0x1.8ap6 0x1.acp4 +REG esri:2920 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:2920 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:2920 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:2920 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:2921 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:2921 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:2921 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:2921 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:2921 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:2922 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:2922 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:2922 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:2922 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:2922 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:29220 0 -0x1.f8p5 -0x1.9p4 +REG esri:29220 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:29220 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:29220 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:29220 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:29221 0 -0x1.c8p5 -0x1.9p4 +REG esri:29221 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:29221 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:29221 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:29221 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:2923 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:2923 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:2923 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:2923 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:2923 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:2924 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:2924 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:2924 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:2924 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:2924 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:2925 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:2925 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:2925 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:2925 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:2925 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:2926 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:2926 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:2926 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:2926 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:2926 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:2927 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:2927 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:2927 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:2927 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:2927 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:2928 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:2928 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:2928 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:2928 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:2928 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:2929 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:2929 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:2929 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:2929 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:2929 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:2930 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:2930 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:2930 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:2930 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:2930 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:2931 0 0x1.ap3 0x0.0p0 +REG esri:2931 1 0x1.0p3 -0x1.4p2 +REG esri:2931 2 0x1.2p4 -0x1.4p2 +REG esri:2931 3 0x1.0p3 0x1.4p2 +REG esri:2931 4 0x1.2p4 0x1.4p2 +REG esri:2932 0 0x1.99bbbbbbbbbbcp5 0x1.8733333333333p4 +REG esri:2932 1 0x1.6dcaf9f8d3f58p5 0x1.3733333333333p4 +REG esri:2932 2 0x1.c5ac7d7ea382p5 0x1.3733333333333p4 +REG esri:2932 3 0x1.6dcaf9f8d3f58p5 0x1.d733333333333p4 +REG esri:2932 4 0x1.c5ac7d7ea382p5 0x1.d733333333333p4 +REG esri:2933 0 0x1.d4p6 -0x1.9p4 +REG esri:2933 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:2933 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:2933 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:2933 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:29333 0 0x1.ep3 -0x1.9p4 +REG esri:29333 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:29333 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:29333 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:29333 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:2934 0 -0x1.1e627298d3894p7 0x0.0p0 +REG esri:2934 1 -0x1.28627298d3894p7 -0x1.4p2 +REG esri:2934 2 -0x1.14627298d3894p7 -0x1.4p2 +REG esri:2934 3 -0x1.28627298d3894p7 0x1.4p2 +REG esri:2934 4 -0x1.14627298d3894p7 0x1.4p2 +REG esri:2935 0 0x1.4c44444444444p5 0x1.dddddddddddep-4 +REG esri:2935 1 0x1.24443ed5095e5p5 -0x1.3888888888888p2 +REG esri:2935 2 0x1.744449b37f2a3p5 -0x1.3888888888888p2 +REG esri:2935 3 0x1.24443ed5095e5p5 0x1.4777777777778p2 +REG esri:2935 4 0x1.744449b37f2a3p5 0x1.4777777777778p2 +REG esri:2936 0 0x1.6444444444444p5 0x1.dddddddddddep-4 +REG esri:2936 1 0x1.3c443ed5095e5p5 -0x1.3888888888888p2 +REG esri:2936 2 0x1.8c4449b37f2a3p5 -0x1.3888888888888p2 +REG esri:2936 3 0x1.3c443ed5095e5p5 0x1.4777777777778p2 +REG esri:2936 4 0x1.8c4449b37f2a3p5 0x1.4777777777778p2 +REG esri:2937 0 0x1.7c44444444444p5 0x1.dddddddddddep-4 +REG esri:2937 1 0x1.54443ed5095e5p5 -0x1.3888888888888p2 +REG esri:2937 2 0x1.a44449b37f2a3p5 -0x1.3888888888888p2 +REG esri:2937 3 0x1.54443ed5095e5p5 0x1.4777777777778p2 +REG esri:2937 4 0x1.a44449b37f2a3p5 0x1.4777777777778p2 +REG esri:2938 0 0x1.9444444444444p5 0x1.dddddddddddep-4 +REG esri:2938 1 0x1.6c443ed5095e5p5 -0x1.3888888888888p2 +REG esri:2938 2 0x1.bc4449b37f2a3p5 -0x1.3888888888888p2 +REG esri:2938 3 0x1.6c443ed5095e5p5 0x1.4777777777778p2 +REG esri:2938 4 0x1.bc4449b37f2a3p5 0x1.4777777777778p2 +REG esri:2939 0 0x1.9622222222223p5 0x1.111111111111p-3 +REG esri:2939 1 0x1.6e221b0903facp5 -0x1.3777777777778p2 +REG esri:2939 2 0x1.be22293b4049ap5 -0x1.3777777777778p2 +REG esri:2939 3 0x1.6e221b0903facp5 0x1.4888888888888p2 +REG esri:2939 4 0x1.be22293b4049ap5 0x1.4888888888888p2 +REG esri:2940 0 0x1.ae22222222223p5 0x1.111111111111p-3 +REG esri:2940 1 0x1.86221b0903facp5 -0x1.3777777777778p2 +REG esri:2940 2 0x1.d622293b4049ap5 -0x1.3777777777778p2 +REG esri:2940 3 0x1.86221b0903facp5 0x1.4888888888888p2 +REG esri:2940 4 0x1.d622293b4049ap5 0x1.4888888888888p2 +REG esri:2941 0 0x1.c622222222223p5 0x1.111111111111p-3 +REG esri:2941 1 0x1.9e221b0903facp5 -0x1.3777777777778p2 +REG esri:2941 2 0x1.ee22293b4049ap5 -0x1.3777777777778p2 +REG esri:2941 3 0x1.9e221b0903facp5 0x1.4888888888888p2 +REG esri:2941 4 0x1.ee22293b4049ap5 0x1.4888888888888p2 +REG esri:2942 0 -0x1.ep3 0x0.0p0 +REG esri:2942 1 -0x1.4p4 -0x1.4p2 +REG esri:2942 2 -0x1.4p3 -0x1.4p2 +REG esri:2942 3 -0x1.4p4 0x1.4p2 +REG esri:2942 4 -0x1.4p3 0x1.4p2 +REG esri:2943 0 -0x1.ep3 0x0.0p0 +REG esri:2943 1 -0x1.4p4 -0x1.4p2 +REG esri:2943 2 -0x1.4p3 -0x1.4p2 +REG esri:2943 3 -0x1.4p4 0x1.4p2 +REG esri:2943 4 -0x1.4p3 0x1.4p2 +REG esri:2944 0 -0x1.bcp5 0x0.0p0 +REG esri:2944 1 -0x1.e4p5 -0x1.4p2 +REG esri:2944 2 -0x1.94p5 -0x1.4p2 +REG esri:2944 3 -0x1.e4p5 0x1.4p2 +REG esri:2944 4 -0x1.94p5 0x1.4p2 +REG esri:2945 0 -0x1.d4p5 0x0.0p0 +REG esri:2945 1 -0x1.fcp5 -0x1.4p2 +REG esri:2945 2 -0x1.acp5 -0x1.4p2 +REG esri:2945 3 -0x1.fcp5 0x1.4p2 +REG esri:2945 4 -0x1.acp5 0x1.4p2 +REG esri:2946 0 -0x1.ecp5 0x0.0p0 +REG esri:2946 1 -0x1.0ap6 -0x1.4p2 +REG esri:2946 2 -0x1.c4p5 -0x1.4p2 +REG esri:2946 3 -0x1.0ap6 0x1.4p2 +REG esri:2946 4 -0x1.c4p5 0x1.4p2 +REG esri:2947 0 -0x1.02p6 0x0.0p0 +REG esri:2947 1 -0x1.16p6 -0x1.4p2 +REG esri:2947 2 -0x1.dcp5 -0x1.4p2 +REG esri:2947 3 -0x1.16p6 0x1.4p2 +REG esri:2947 4 -0x1.dcp5 0x1.4p2 +REG esri:2948 0 -0x1.0ep6 0x0.0p0 +REG esri:2948 1 -0x1.22p6 -0x1.4p2 +REG esri:2948 2 -0x1.f4p5 -0x1.4p2 +REG esri:2948 3 -0x1.22p6 0x1.4p2 +REG esri:2948 4 -0x1.f4p5 0x1.4p2 +REG esri:2949 0 -0x1.1ap6 0x0.0p0 +REG esri:2949 1 -0x1.2ep6 -0x1.4p2 +REG esri:2949 2 -0x1.06p6 -0x1.4p2 +REG esri:2949 3 -0x1.2ep6 0x1.4p2 +REG esri:2949 4 -0x1.06p6 0x1.4p2 +REG esri:2950 0 -0x1.26p6 0x0.0p0 +REG esri:2950 1 -0x1.3ap6 -0x1.4p2 +REG esri:2950 2 -0x1.12p6 -0x1.4p2 +REG esri:2950 3 -0x1.3ap6 0x1.4p2 +REG esri:2950 4 -0x1.12p6 0x1.4p2 +REG esri:2951 0 -0x1.32p6 0x0.0p0 +REG esri:2951 1 -0x1.46p6 -0x1.4p2 +REG esri:2951 2 -0x1.1ep6 -0x1.4p2 +REG esri:2951 3 -0x1.46p6 0x1.4p2 +REG esri:2951 4 -0x1.1ep6 0x1.4p2 +REG esri:2952 0 -0x1.3ep6 0x0.0p0 +REG esri:2952 1 -0x1.52p6 -0x1.4p2 +REG esri:2952 2 -0x1.2ap6 -0x1.4p2 +REG esri:2952 3 -0x1.52p6 0x1.4p2 +REG esri:2952 4 -0x1.2ap6 0x1.4p2 +REG esri:2953 0 -0x1.0ap6 0x1.74p5 +REG esri:2953 1 -0x1.270e06f120d02p6 0x1.4cp5 +REG esri:2953 2 -0x1.d9e3f21dbe5fcp5 0x1.4cp5 +REG esri:2953 3 -0x1.270e06f120d02p6 0x1.9cp5 +REG esri:2953 4 -0x1.d9e3f21dbe5fcp5 0x1.9cp5 +REG esri:2954 0 -0x1.f8p5 0x1.7ap5 +REG esri:2954 1 -0x1.1976b6d3a8744p6 0x1.52p5 +REG esri:2954 2 -0x1.bd129258af178p5 0x1.52p5 +REG esri:2954 3 -0x1.1976b6d3a8744p6 0x1.a2p5 +REG esri:2954 4 -0x1.bd129258af178p5 0x1.a2p5 +REG esri:2955 0 -0x1.d4p6 0x0.0p0 +REG esri:2955 1 -0x1.e8p6 -0x1.4p2 +REG esri:2955 2 -0x1.cp6 -0x1.4p2 +REG esri:2955 3 -0x1.e8p6 0x1.4p2 +REG esri:2955 4 -0x1.cp6 0x1.4p2 +REG esri:2956 0 -0x1.bcp6 0x0.0p0 +REG esri:2956 1 -0x1.dp6 -0x1.4p2 +REG esri:2956 2 -0x1.a8p6 -0x1.4p2 +REG esri:2956 3 -0x1.dp6 0x1.4p2 +REG esri:2956 4 -0x1.a8p6 0x1.4p2 +REG esri:2957 0 -0x1.a4p6 0x0.0p0 +REG esri:2957 1 -0x1.b8p6 -0x1.4p2 +REG esri:2957 2 -0x1.9p6 -0x1.4p2 +REG esri:2957 3 -0x1.b8p6 0x1.4p2 +REG esri:2957 4 -0x1.9p6 0x1.4p2 +REG esri:2958 0 -0x1.44p6 0x0.0p0 +REG esri:2958 1 -0x1.58p6 -0x1.4p2 +REG esri:2958 2 -0x1.3p6 -0x1.4p2 +REG esri:2958 3 -0x1.58p6 0x1.4p2 +REG esri:2958 4 -0x1.3p6 0x1.4p2 +REG esri:2959 0 -0x1.2cp6 0x0.0p0 +REG esri:2959 1 -0x1.4p6 -0x1.4p2 +REG esri:2959 2 -0x1.18p6 -0x1.4p2 +REG esri:2959 3 -0x1.4p6 0x1.4p2 +REG esri:2959 4 -0x1.18p6 0x1.4p2 +REG esri:2960 0 -0x1.14p6 0x0.0p0 +REG esri:2960 1 -0x1.28p6 -0x1.4p2 +REG esri:2960 2 -0x1.0p6 -0x1.4p2 +REG esri:2960 3 -0x1.28p6 0x1.4p2 +REG esri:2960 4 -0x1.0p6 0x1.4p2 +REG esri:2961 0 -0x1.f8p5 0x0.0p0 +REG esri:2961 1 -0x1.1p6 -0x1.4p2 +REG esri:2961 2 -0x1.dp5 -0x1.4p2 +REG esri:2961 3 -0x1.1p6 0x1.4p2 +REG esri:2961 4 -0x1.dp5 0x1.4p2 +REG esri:2962 0 -0x1.c8p5 0x0.0p0 +REG esri:2962 1 -0x1.fp5 -0x1.4p2 +REG esri:2962 2 -0x1.ap5 -0x1.4p2 +REG esri:2962 3 -0x1.fp5 0x1.4p2 +REG esri:2962 4 -0x1.ap5 0x1.4p2 +REG esri:29635 0 0x1.bp4 0x0.0p0 +REG esri:29635 1 0x1.6p4 -0x1.4p2 +REG esri:29635 2 0x1.0p5 -0x1.4p2 +REG esri:29635 3 0x1.6p4 0x1.4p2 +REG esri:29635 4 0x1.0p5 0x1.4p2 +REG esri:29636 0 0x1.08p5 0x0.0p0 +REG esri:29636 1 0x1.cp4 -0x1.4p2 +REG esri:29636 2 0x1.3p5 -0x1.4p2 +REG esri:29636 3 0x1.cp4 0x1.4p2 +REG esri:29636 4 0x1.3p5 0x1.4p2 +REG esri:29700 0 0x1.737f7201d00eep5 -0x1.2e66666666666p4 +REG esri:29700 1 0x1.4937e5cc680eep5 -0x1.7e66666666666p4 +REG esri:29700 2 0x1.9dc6fe37380eep5 -0x1.7e66666666666p4 +REG esri:29700 3 0x1.4937e5cc680eep5 -0x1.bccccccccccccp3 +REG esri:29700 4 0x1.9dc6fe37380eep5 -0x1.bccccccccccccp3 +REG esri:29738 0 0x1.68p5 -0x1.9p4 +REG esri:29738 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:29738 2 0x1.942297030ae5dp5 -0x1.ep4 +REG esri:29738 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:29738 4 0x1.942297030ae5dp5 -0x1.4p4 +REG esri:29739 0 0x1.98p5 -0x1.9p4 +REG esri:29739 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:29739 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:29739 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:29739 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:29849 0 0x1.bcp6 0x0.0p0 +REG esri:29849 1 0x1.a8p6 -0x1.4p2 +REG esri:29849 2 0x1.dp6 -0x1.4p2 +REG esri:29849 3 0x1.a8p6 0x1.4p2 +REG esri:29849 4 0x1.dp6 0x1.4p2 +REG esri:29850 0 0x1.d4p6 0x0.0p0 +REG esri:29850 1 0x1.cp6 -0x1.4p2 +REG esri:29850 2 0x1.e8p6 -0x1.4p2 +REG esri:29850 3 0x1.cp6 0x1.4p2 +REG esri:29850 4 0x1.e8p6 0x1.4p2 +REG esri:29871 0 0x1.ccp6 0x1.0p2 +REG esri:29871 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG esri:29871 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG esri:29871 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG esri:29871 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG esri:29872 0 0x1.ccp6 0x1.0p2 +REG esri:29872 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG esri:29872 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG esri:29872 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG esri:29872 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG esri:29873 0 0x1.ccp6 0x1.0p2 +REG esri:29873 1 0x1.b7f37f5af8062p6 -0x1.0p0 +REG esri:29873 2 0x1.e00c80a507f9ep6 -0x1.0p0 +REG esri:29873 3 0x1.b7f37f5af8062p6 0x1.2p3 +REG esri:29873 4 0x1.e00c80a507f9ep6 0x1.2p3 +REG esri:29900 0 -0x1.0p3 0x1.acp5 +REG esri:29900 1 -0x1.067e6c3855169p4 0x1.84p5 +REG esri:29900 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG esri:29900 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG esri:29900 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG esri:29901 0 -0x1.0p3 0x1.acp5 +REG esri:29901 1 -0x1.067e6c3855169p4 0x1.84p5 +REG esri:29901 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG esri:29901 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG esri:29901 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG esri:29902 0 -0x1.0p3 0x1.acp5 +REG esri:29902 1 -0x1.067e6c3855169p4 0x1.84p5 +REG esri:29902 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG esri:29902 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG esri:29902 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG esri:29903 0 -0x1.0p3 0x1.acp5 +REG esri:29903 1 -0x1.067e6c3855169p4 0x1.84p5 +REG esri:29903 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG esri:29903 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG esri:29903 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG esri:30161 0 0x1.03p7 0x1.08p5 +REG esri:30161 1 0x1.ee271995b65ffp6 0x1.cp4 +REG esri:30161 2 0x1.0eec733524d01p7 0x1.cp4 +REG esri:30161 3 0x1.ee271995b65ffp6 0x1.3p5 +REG esri:30161 4 0x1.0eec733524d01p7 0x1.3p5 +REG esri:30162 0 0x1.06p7 0x1.08p5 +REG esri:30162 1 0x1.f4271995b65ffp6 0x1.cp4 +REG esri:30162 2 0x1.11ec733524d01p7 0x1.cp4 +REG esri:30162 3 0x1.f4271995b65ffp6 0x1.3p5 +REG esri:30162 4 0x1.11ec733524d01p7 0x1.3p5 +REG esri:30163 0 0x1.0855555555557p7 0x1.2p5 +REG esri:30163 1 0x1.f7f1ffa5aec74p6 0x1.fp4 +REG esri:30163 2 0x1.14b1aad7d3474p7 0x1.fp4 +REG esri:30163 3 0x1.f7f1ffa5aec74p6 0x1.48p5 +REG esri:30163 4 0x1.14b1aad7d3474p7 0x1.48p5 +REG esri:30164 0 0x1.0bp7 0x1.08p5 +REG esri:30164 1 0x1.fe271995b65ffp6 0x1.cp4 +REG esri:30164 2 0x1.16ec733524d01p7 0x1.cp4 +REG esri:30164 3 0x1.fe271995b65ffp6 0x1.3p5 +REG esri:30164 4 0x1.16ec733524d01p7 0x1.3p5 +REG esri:30165 0 0x1.0caaaaaaaaaa9p7 0x1.2p5 +REG esri:30165 1 0x1.004e55282cb8cp7 0x1.fp4 +REG esri:30165 2 0x1.1907002d289c6p7 0x1.fp4 +REG esri:30165 3 0x1.004e55282cb8cp7 0x1.48p5 +REG esri:30165 4 0x1.1907002d289c6p7 0x1.48p5 +REG esri:30166 0 0x1.1p7 0x1.2p5 +REG esri:30166 1 0x1.03a3aa7d820e3p7 0x1.fp4 +REG esri:30166 2 0x1.1c5c55827df1dp7 0x1.fp4 +REG esri:30166 3 0x1.03a3aa7d820e3p7 0x1.48p5 +REG esri:30166 4 0x1.1c5c55827df1dp7 0x1.48p5 +REG esri:30167 0 0x1.1255555555557p7 0x1.2p5 +REG esri:30167 1 0x1.05f8ffd2d763ap7 0x1.fp4 +REG esri:30167 2 0x1.1eb1aad7d3474p7 0x1.fp4 +REG esri:30167 3 0x1.05f8ffd2d763ap7 0x1.48p5 +REG esri:30167 4 0x1.1eb1aad7d3474p7 0x1.48p5 +REG esri:30168 0 0x1.15p7 0x1.2p5 +REG esri:30168 1 0x1.08a3aa7d820e3p7 0x1.fp4 +REG esri:30168 2 0x1.215c55827df1dp7 0x1.fp4 +REG esri:30168 3 0x1.08a3aa7d820e3p7 0x1.48p5 +REG esri:30168 4 0x1.215c55827df1dp7 0x1.48p5 +REG esri:30169 0 0x1.17aaaaaaaaaa9p7 0x1.2p5 +REG esri:30169 1 0x1.0b4e55282cb8cp7 0x1.fp4 +REG esri:30169 2 0x1.2407002d289c6p7 0x1.fp4 +REG esri:30169 3 0x1.0b4e55282cb8cp7 0x1.48p5 +REG esri:30169 4 0x1.2407002d289c6p7 0x1.48p5 +REG esri:30170 0 0x1.19aaaaaaaaaa9p7 0x1.4p5 +REG esri:30170 1 0x1.0c9cd2f20e3ebp7 0x1.18p5 +REG esri:30170 2 0x1.26b8826347167p7 0x1.18p5 +REG esri:30170 3 0x1.0c9cd2f20e3ebp7 0x1.68p5 +REG esri:30170 4 0x1.26b8826347167p7 0x1.68p5 +REG esri:30171 0 0x1.188p7 0x1.6p5 +REG esri:30171 1 0x1.0a992e6394ef4p7 0x1.38p5 +REG esri:30171 2 0x1.2666d19c6b10cp7 0x1.38p5 +REG esri:30171 3 0x1.0a992e6394ef4p7 0x1.88p5 +REG esri:30171 4 0x1.2666d19c6b10cp7 0x1.88p5 +REG esri:30172 0 0x1.1c8p7 0x1.6p5 +REG esri:30172 1 0x1.0e992e6394ef4p7 0x1.38p5 +REG esri:30172 2 0x1.2a66d19c6b10cp7 0x1.38p5 +REG esri:30172 3 0x1.0e992e6394ef4p7 0x1.88p5 +REG esri:30172 4 0x1.2a66d19c6b10cp7 0x1.88p5 +REG esri:30173 0 0x1.208p7 0x1.6p5 +REG esri:30173 1 0x1.12992e6394ef4p7 0x1.38p5 +REG esri:30173 2 0x1.2e66d19c6b10cp7 0x1.38p5 +REG esri:30173 3 0x1.12992e6394ef4p7 0x1.88p5 +REG esri:30173 4 0x1.2e66d19c6b10cp7 0x1.88p5 +REG esri:30174 0 0x1.1cp7 0x1.ap4 +REG esri:30174 1 0x1.10dfbd3139edep7 0x1.5p4 +REG esri:30174 2 0x1.272042cec6122p7 0x1.5p4 +REG esri:30174 3 0x1.10dfbd3139edep7 0x1.fp4 +REG esri:30174 4 0x1.272042cec6122p7 0x1.fp4 +REG esri:30175 0 0x1.fep6 0x1.ap4 +REG esri:30175 1 0x1.e7bf7a6273dbcp6 0x1.5p4 +REG esri:30175 2 0x1.0a2042cec6122p7 0x1.5p4 +REG esri:30175 3 0x1.e7bf7a6273dbcp6 0x1.fp4 +REG esri:30175 4 0x1.0a2042cec6122p7 0x1.fp4 +REG esri:30176 0 0x1.fp6 0x1.ap4 +REG esri:30176 1 0x1.d9bf7a6273dbcp6 0x1.5p4 +REG esri:30176 2 0x1.032042cec6122p7 0x1.5p4 +REG esri:30176 3 0x1.d9bf7a6273dbcp6 0x1.fp4 +REG esri:30176 4 0x1.032042cec6122p7 0x1.fp4 +REG esri:30177 0 0x1.06p7 0x1.ap4 +REG esri:30177 1 0x1.f5bf7a6273dbcp6 0x1.5p4 +REG esri:30177 2 0x1.112042cec6122p7 0x1.5p4 +REG esri:30177 3 0x1.f5bf7a6273dbcp6 0x1.fp4 +REG esri:30177 4 0x1.112042cec6122p7 0x1.fp4 +REG esri:30178 0 0x1.1p7 0x1.4p4 +REG esri:30178 1 0x1.055bb4747cdbcp7 0x1.ep3 +REG esri:30178 2 0x1.1aa44b8b83244p7 0x1.ep3 +REG esri:30178 3 0x1.055bb4747cdbcp7 0x1.9p4 +REG esri:30178 4 0x1.1aa44b8b83244p7 0x1.9p4 +REG esri:30179 0 0x1.34p7 0x1.ap4 +REG esri:30179 1 0x1.28dfbd3139edep7 0x1.5p4 +REG esri:30179 2 0x1.3f2042cec6122p7 0x1.5p4 +REG esri:30179 3 0x1.28dfbd3139edep7 0x1.fp4 +REG esri:30179 4 0x1.3f2042cec6122p7 0x1.fp4 +REG esri:30200 0 -0x1.eaaaaaaaaaaacp5 0x1.4e22222222224p3 +REG esri:30200 1 -0x1.09ab8c7155973p6 0x1.5c44444444448p2 +REG esri:30200 2 -0x1.c1fe3c72aa271p5 0x1.5c44444444448p2 +REG esri:30200 3 -0x1.09ab8c7155973p6 0x1.ee22222222224p3 +REG esri:30200 4 -0x1.c1fe3c72aa271p5 0x1.ee22222222224p3 +REG esri:30339 0 0x1.98p5 0x0.0p0 +REG esri:30339 1 0x1.7p5 -0x1.4p2 +REG esri:30339 2 0x1.cp5 -0x1.4p2 +REG esri:30339 3 0x1.7p5 0x1.4p2 +REG esri:30339 4 0x1.cp5 0x1.4p2 +REG esri:30340 0 0x1.c8p5 0x0.0p0 +REG esri:30340 1 0x1.ap5 -0x1.4p2 +REG esri:30340 2 0x1.fp5 -0x1.4p2 +REG esri:30340 3 0x1.ap5 0x1.4p2 +REG esri:30340 4 0x1.fp5 0x1.4p2 +REG esri:3036 0 0x1.08p5 -0x1.9p4 +REG esri:3036 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:3036 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:3036 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:3036 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:3037 0 0x1.38p5 -0x1.9p4 +REG esri:3037 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:3037 2 0x1.642297030ae5dp5 -0x1.ep4 +REG esri:3037 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:3037 4 0x1.642297030ae5dp5 -0x1.4p4 +REG esri:30491 0 0x1.599999999999ap1 0x1.2p5 +REG esri:30491 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG esri:30491 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG esri:30491 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG esri:30491 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG esri:30492 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG esri:30492 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG esri:30492 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG esri:30492 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG esri:30492 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG esri:30591 0 0x1.599999999999ap1 0x1.2p5 +REG esri:30591 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG esri:30591 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG esri:30591 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG esri:30591 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG esri:30592 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG esri:30592 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG esri:30592 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG esri:30592 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG esri:30592 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG esri:30729 0 -0x1.2p3 0x0.0p0 +REG esri:30729 1 -0x1.cp3 -0x1.4p2 +REG esri:30729 2 -0x1.0p2 -0x1.4p2 +REG esri:30729 3 -0x1.cp3 0x1.4p2 +REG esri:30729 4 -0x1.0p2 0x1.4p2 +REG esri:30730 0 -0x1.8p1 0x0.0p0 +REG esri:30730 1 -0x1.0p3 -0x1.4p2 +REG esri:30730 2 0x1.0p1 -0x1.4p2 +REG esri:30730 3 -0x1.0p3 0x1.4p2 +REG esri:30730 4 0x1.0p1 0x1.4p2 +REG esri:30731 0 0x1.8p1 0x0.0p0 +REG esri:30731 1 -0x1.0p1 -0x1.4p2 +REG esri:30731 2 0x1.0p3 -0x1.4p2 +REG esri:30731 3 -0x1.0p1 0x1.4p2 +REG esri:30731 4 0x1.0p3 0x1.4p2 +REG esri:30732 0 0x1.2p3 0x0.0p0 +REG esri:30732 1 0x1.0p2 -0x1.4p2 +REG esri:30732 2 0x1.cp3 -0x1.4p2 +REG esri:30732 3 0x1.0p2 0x1.4p2 +REG esri:30732 4 0x1.cp3 0x1.4p2 +REG esri:30791 0 0x1.599999999999ap1 0x1.2p5 +REG esri:30791 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG esri:30791 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG esri:30791 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG esri:30791 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG esri:30792 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG esri:30792 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG esri:30792 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG esri:30792 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG esri:30792 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG esri:30800 0 0x1.f9dd695bb473bp3 0x0.0p0 +REG esri:30800 1 0x1.59dd695bb473bp3 -0x1.4p2 +REG esri:30800 2 0x1.4ceeb4adda39ep4 -0x1.4p2 +REG esri:30800 3 0x1.59dd695bb473bp3 0x1.4p2 +REG esri:30800 4 0x1.4ceeb4adda39ep4 0x1.4p2 +REG esri:31028 0 -0x1.ep3 0x0.0p0 +REG esri:31028 1 -0x1.4p4 -0x1.4p2 +REG esri:31028 2 -0x1.4p3 -0x1.4p2 +REG esri:31028 3 -0x1.4p4 0x1.4p2 +REG esri:31028 4 -0x1.4p3 0x1.4p2 +REG esri:31121 0 -0x1.c8p5 0x0.0p0 +REG esri:31121 1 -0x1.fp5 -0x1.4p2 +REG esri:31121 2 -0x1.ap5 -0x1.4p2 +REG esri:31121 3 -0x1.fp5 0x1.4p2 +REG esri:31121 4 -0x1.ap5 0x1.4p2 +REG esri:31154 0 -0x1.bp5 0x0.0p0 +REG esri:31154 1 -0x1.d8p5 -0x1.4p2 +REG esri:31154 2 -0x1.88p5 -0x1.4p2 +REG esri:31154 3 -0x1.d8p5 0x1.4p2 +REG esri:31154 4 -0x1.88p5 0x1.4p2 +REG esri:31170 0 -0x1.bd77777777777p5 0x0.0p0 +REG esri:31170 1 -0x1.e577777777777p5 -0x1.4p2 +REG esri:31170 2 -0x1.9577777777777p5 -0x1.4p2 +REG esri:31170 3 -0x1.e577777777777p5 0x1.4p2 +REG esri:31170 4 -0x1.9577777777777p5 0x1.4p2 +REG esri:31171 0 -0x1.bd77777777777p5 0x0.0p0 +REG esri:31171 1 -0x1.e577777777777p5 -0x1.4p2 +REG esri:31171 2 -0x1.9577777777777p5 -0x1.4p2 +REG esri:31171 3 -0x1.e577777777777p5 0x1.4p2 +REG esri:31171 4 -0x1.9577777777777p5 0x1.4p2 +REG esri:31265 0 0x1.ep3 0x0.0p0 +REG esri:31265 1 0x1.4p3 -0x1.4p2 +REG esri:31265 2 0x1.4p4 -0x1.4p2 +REG esri:31265 3 0x1.4p3 0x1.4p2 +REG esri:31265 4 0x1.4p4 0x1.4p2 +REG esri:31266 0 0x1.2p4 0x0.0p0 +REG esri:31266 1 0x1.ap3 -0x1.4p2 +REG esri:31266 2 0x1.7p4 -0x1.4p2 +REG esri:31266 3 0x1.ap3 0x1.4p2 +REG esri:31266 4 0x1.7p4 0x1.4p2 +REG esri:31267 0 0x1.5p4 0x0.0p0 +REG esri:31267 1 0x1.0p4 -0x1.4p2 +REG esri:31267 2 0x1.ap4 -0x1.4p2 +REG esri:31267 3 0x1.0p4 0x1.4p2 +REG esri:31267 4 0x1.ap4 0x1.4p2 +REG esri:31268 0 0x1.8p4 0x0.0p0 +REG esri:31268 1 0x1.3p4 -0x1.4p2 +REG esri:31268 2 0x1.dp4 -0x1.4p2 +REG esri:31268 3 0x1.3p4 0x1.4p2 +REG esri:31268 4 0x1.dp4 0x1.4p2 +REG esri:31275 0 0x1.ep3 0x0.0p0 +REG esri:31275 1 0x1.4p3 -0x1.4p2 +REG esri:31275 2 0x1.4p4 -0x1.4p2 +REG esri:31275 3 0x1.4p3 0x1.4p2 +REG esri:31275 4 0x1.4p4 0x1.4p2 +REG esri:31276 0 0x1.2p4 0x0.0p0 +REG esri:31276 1 0x1.ap3 -0x1.4p2 +REG esri:31276 2 0x1.7p4 -0x1.4p2 +REG esri:31276 3 0x1.ap3 0x1.4p2 +REG esri:31276 4 0x1.7p4 0x1.4p2 +REG esri:31277 0 0x1.5p4 0x0.0p0 +REG esri:31277 1 0x1.0p4 -0x1.4p2 +REG esri:31277 2 0x1.ap4 -0x1.4p2 +REG esri:31277 3 0x1.0p4 0x1.4p2 +REG esri:31277 4 0x1.ap4 0x1.4p2 +REG esri:31278 0 0x1.5p4 0x0.0p0 +REG esri:31278 1 0x1.0p4 -0x1.4p2 +REG esri:31278 2 0x1.ap4 -0x1.4p2 +REG esri:31278 3 0x1.0p4 0x1.4p2 +REG esri:31278 4 0x1.ap4 0x1.4p2 +REG esri:31279 0 0x1.8p4 0x0.0p0 +REG esri:31279 1 0x1.3p4 -0x1.4p2 +REG esri:31279 2 0x1.dp4 -0x1.4p2 +REG esri:31279 3 0x1.3p4 0x1.4p2 +REG esri:31279 4 0x1.dp4 0x1.4p2 +REG esri:31281 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG esri:31281 1 0x1.5555555555552p2 -0x1.4p2 +REG esri:31281 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31281 3 0x1.5555555555552p2 0x1.4p2 +REG esri:31281 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG esri:31282 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG esri:31282 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31282 2 0x1.2555555555554p4 -0x1.4p2 +REG esri:31282 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG esri:31282 4 0x1.2555555555554p4 0x1.4p2 +REG esri:31283 0 0x1.0555555555554p4 0x0.0p0 +REG esri:31283 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG esri:31283 2 0x1.5555555555554p4 -0x1.4p2 +REG esri:31283 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG esri:31283 4 0x1.5555555555554p4 0x1.4p2 +REG esri:31284 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG esri:31284 1 0x1.5555555555552p2 -0x1.4p2 +REG esri:31284 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31284 3 0x1.5555555555552p2 0x1.4p2 +REG esri:31284 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG esri:31285 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG esri:31285 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31285 2 0x1.2555555555554p4 -0x1.4p2 +REG esri:31285 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG esri:31285 4 0x1.2555555555554p4 0x1.4p2 +REG esri:31286 0 0x1.0555555555554p4 0x0.0p0 +REG esri:31286 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG esri:31286 2 0x1.5555555555554p4 -0x1.4p2 +REG esri:31286 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG esri:31286 4 0x1.5555555555554p4 0x1.4p2 +REG esri:31287 0 0x1.aaaaaaaaaaaa9p3 0x1.7cp5 +REG esri:31287 1 0x1.1c9195d1a8502p3 0x1.64p5 +REG esri:31287 2 0x1.1c61dfc1d6828p4 0x1.64p5 +REG esri:31287 3 0x1.1c9195d1a8502p3 0x1.94p5 +REG esri:31287 4 0x1.1c61dfc1d6828p4 0x1.94p5 +REG esri:31291 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG esri:31291 1 0x1.5555555555552p2 -0x1.4p2 +REG esri:31291 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31291 3 0x1.5555555555552p2 0x1.4p2 +REG esri:31291 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG esri:31292 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG esri:31292 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31292 2 0x1.2555555555554p4 -0x1.4p2 +REG esri:31292 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG esri:31292 4 0x1.2555555555554p4 0x1.4p2 +REG esri:31293 0 0x1.0555555555554p4 0x0.0p0 +REG esri:31293 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG esri:31293 2 0x1.5555555555554p4 -0x1.4p2 +REG esri:31293 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG esri:31293 4 0x1.5555555555554p4 0x1.4p2 +REG esri:31294 0 0x1.4aaaaaaaaaaa9p3 0x0.0p0 +REG esri:31294 1 0x1.5555555555552p2 -0x1.4p2 +REG esri:31294 2 0x1.eaaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31294 3 0x1.5555555555552p2 0x1.4p2 +REG esri:31294 4 0x1.eaaaaaaaaaaa9p3 0x1.4p2 +REG esri:31295 0 0x1.aaaaaaaaaaaa9p3 0x0.0p0 +REG esri:31295 1 0x1.0aaaaaaaaaaa9p3 -0x1.4p2 +REG esri:31295 2 0x1.2555555555554p4 -0x1.4p2 +REG esri:31295 3 0x1.0aaaaaaaaaaa9p3 0x1.4p2 +REG esri:31295 4 0x1.2555555555554p4 0x1.4p2 +REG esri:31296 0 0x1.0555555555554p4 0x0.0p0 +REG esri:31296 1 0x1.6aaaaaaaaaaa8p3 -0x1.4p2 +REG esri:31296 2 0x1.5555555555554p4 -0x1.4p2 +REG esri:31296 3 0x1.6aaaaaaaaaaa8p3 0x1.4p2 +REG esri:31296 4 0x1.5555555555554p4 0x1.4p2 +REG esri:31297 0 0x1.aaaaaaaaaaaa9p3 0x1.7cp5 +REG esri:31297 1 0x1.1c9195d1a8502p3 0x1.64p5 +REG esri:31297 2 0x1.1c61dfc1d6828p4 0x1.64p5 +REG esri:31297 3 0x1.1c9195d1a8502p3 0x1.94p5 +REG esri:31297 4 0x1.1c61dfc1d6828p4 0x1.94p5 +REG esri:31300 0 0x1.16d819b4659ep2 0x1.17aaaaaaaaaabp6 +REG esri:31300 1 -0x1.3a9adc1bddcbfp5 0x1.b755555555556p5 +REG esri:31300 2 0x1.8050e288f7337p5 0x1.b755555555556p5 +REG esri:31300 3 -0x1.3a9adc1bddcbfp5 0x1.53aaaaaaaaaabp6 +REG esri:31300 4 0x1.8050e288f7337p5 0x1.53aaaaaaaaaabp6 +REG esri:31370 0 0x1.1784e6cbc3292p2 0x1.17aaaabdae4bep6 +REG esri:31370 1 -0x1.3a8542c83e86dp5 0x1.b755557b5c97cp5 +REG esri:31370 2 0x1.80667c7b2f511p5 0x1.b755557b5c97cp5 +REG esri:31370 3 -0x1.3a8542c83e86dp5 0x1.53aaaabdae4bep6 +REG esri:31370 4 0x1.80667c7b2f511p5 0x1.53aaaabdae4bep6 +REG esri:31461 0 0x1.8p1 0x0.0p0 +REG esri:31461 1 -0x1.0p1 -0x1.4p2 +REG esri:31461 2 0x1.0p3 -0x1.4p2 +REG esri:31461 3 -0x1.0p1 0x1.4p2 +REG esri:31461 4 0x1.0p3 0x1.4p2 +REG esri:31462 0 0x1.8p2 0x0.0p0 +REG esri:31462 1 0x1.0p0 -0x1.4p2 +REG esri:31462 2 0x1.6p3 -0x1.4p2 +REG esri:31462 3 0x1.0p0 0x1.4p2 +REG esri:31462 4 0x1.6p3 0x1.4p2 +REG esri:31463 0 0x1.2p3 0x0.0p0 +REG esri:31463 1 0x1.0p2 -0x1.4p2 +REG esri:31463 2 0x1.cp3 -0x1.4p2 +REG esri:31463 3 0x1.0p2 0x1.4p2 +REG esri:31463 4 0x1.cp3 0x1.4p2 +REG esri:31464 0 0x1.8p3 0x0.0p0 +REG esri:31464 1 0x1.cp2 -0x1.4p2 +REG esri:31464 2 0x1.1p4 -0x1.4p2 +REG esri:31464 3 0x1.cp2 0x1.4p2 +REG esri:31464 4 0x1.1p4 0x1.4p2 +REG esri:31465 0 0x1.ep3 0x0.0p0 +REG esri:31465 1 0x1.4p3 -0x1.4p2 +REG esri:31465 2 0x1.4p4 -0x1.4p2 +REG esri:31465 3 0x1.4p3 0x1.4p2 +REG esri:31465 4 0x1.4p4 0x1.4p2 +REG esri:31466 0 0x1.8p2 0x0.0p0 +REG esri:31466 1 0x1.0p0 -0x1.4p2 +REG esri:31466 2 0x1.6p3 -0x1.4p2 +REG esri:31466 3 0x1.0p0 0x1.4p2 +REG esri:31466 4 0x1.6p3 0x1.4p2 +REG esri:31467 0 0x1.2p3 0x0.0p0 +REG esri:31467 1 0x1.0p2 -0x1.4p2 +REG esri:31467 2 0x1.cp3 -0x1.4p2 +REG esri:31467 3 0x1.0p2 0x1.4p2 +REG esri:31467 4 0x1.cp3 0x1.4p2 +REG esri:31468 0 0x1.8p3 0x0.0p0 +REG esri:31468 1 0x1.cp2 -0x1.4p2 +REG esri:31468 2 0x1.1p4 -0x1.4p2 +REG esri:31468 3 0x1.cp2 0x1.4p2 +REG esri:31468 4 0x1.1p4 0x1.4p2 +REG esri:31469 0 0x1.ep3 0x0.0p0 +REG esri:31469 1 0x1.4p3 -0x1.4p2 +REG esri:31469 2 0x1.4p4 -0x1.4p2 +REG esri:31469 3 0x1.4p3 0x1.4p2 +REG esri:31469 4 0x1.4p4 0x1.4p2 +REG esri:3148 0 0x1.a4p6 0x0.0p0 +REG esri:3148 1 0x1.9p6 -0x1.4p2 +REG esri:3148 2 0x1.b8p6 -0x1.4p2 +REG esri:3148 3 0x1.9p6 0x1.4p2 +REG esri:3148 4 0x1.b8p6 0x1.4p2 +REG esri:3149 0 0x1.bcp6 0x0.0p0 +REG esri:3149 1 0x1.a8p6 -0x1.4p2 +REG esri:3149 2 0x1.dp6 -0x1.4p2 +REG esri:3149 3 0x1.a8p6 0x1.4p2 +REG esri:3149 4 0x1.dp6 0x1.4p2 +REG esri:31491 0 0x1.8p1 0x0.0p0 +REG esri:31491 1 -0x1.0p1 -0x1.4p2 +REG esri:31491 2 0x1.0p3 -0x1.4p2 +REG esri:31491 3 -0x1.0p1 0x1.4p2 +REG esri:31491 4 0x1.0p3 0x1.4p2 +REG esri:31492 0 0x1.8p2 0x0.0p0 +REG esri:31492 1 0x1.0p0 -0x1.4p2 +REG esri:31492 2 0x1.6p3 -0x1.4p2 +REG esri:31492 3 0x1.0p0 0x1.4p2 +REG esri:31492 4 0x1.6p3 0x1.4p2 +REG esri:31493 0 0x1.2p3 0x0.0p0 +REG esri:31493 1 0x1.0p2 -0x1.4p2 +REG esri:31493 2 0x1.cp3 -0x1.4p2 +REG esri:31493 3 0x1.0p2 0x1.4p2 +REG esri:31493 4 0x1.cp3 0x1.4p2 +REG esri:31494 0 0x1.8p3 0x0.0p0 +REG esri:31494 1 0x1.cp2 -0x1.4p2 +REG esri:31494 2 0x1.1p4 -0x1.4p2 +REG esri:31494 3 0x1.cp2 0x1.4p2 +REG esri:31494 4 0x1.1p4 0x1.4p2 +REG esri:31495 0 0x1.ep3 0x0.0p0 +REG esri:31495 1 0x1.4p3 -0x1.4p2 +REG esri:31495 2 0x1.4p4 -0x1.4p2 +REG esri:31495 3 0x1.4p3 0x1.4p2 +REG esri:31495 4 0x1.4p4 0x1.4p2 +REG esri:31528 0 -0x1.ep3 0x0.0p0 +REG esri:31528 1 -0x1.4p4 -0x1.4p2 +REG esri:31528 2 -0x1.4p3 -0x1.4p2 +REG esri:31528 3 -0x1.4p4 0x1.4p2 +REG esri:31528 4 -0x1.4p3 0x1.4p2 +REG esri:31529 0 -0x1.2p3 0x0.0p0 +REG esri:31529 1 -0x1.cp3 -0x1.4p2 +REG esri:31529 2 -0x1.0p2 -0x1.4p2 +REG esri:31529 3 -0x1.cp3 0x1.4p2 +REG esri:31529 4 -0x1.0p2 0x1.4p2 +REG esri:31600 0 0x1.96478a4fd92c7p4 0x1.6f33333333333p5 +REG esri:31600 1 0x1.235290d1d9941p4 0x1.4733333333333p5 +REG esri:31600 2 0x1.049e41e6ec626p5 0x1.4733333333333p5 +REG esri:31600 3 0x1.235290d1d9941p4 0x1.9733333333333p5 +REG esri:31600 4 0x1.049e41e6ec626p5 0x1.9733333333333p5 +REG esri:31700 0 0x1.9p4 0x1.7p5 +REG esri:31700 1 0x1.1cd5e1cf3d2a8p4 0x1.48p5 +REG esri:31700 2 0x1.01950f18616acp5 0x1.48p5 +REG esri:31700 3 0x1.1cd5e1cf3d2a8p4 0x1.98p5 +REG esri:31700 4 0x1.01950f18616acp5 0x1.98p5 +REG esri:3176 0 0x1.a8p6 0x0.0p0 +REG esri:3176 1 0x1.94p6 -0x1.4p2 +REG esri:3176 2 0x1.bcp6 -0x1.4p2 +REG esri:3176 3 0x1.94p6 0x1.4p2 +REG esri:3176 4 0x1.bcp6 0x1.4p2 +REG esri:31838 0 0x1.68p5 0x0.0p0 +REG esri:31838 1 0x1.4p5 -0x1.4p2 +REG esri:31838 2 0x1.9p5 -0x1.4p2 +REG esri:31838 3 0x1.4p5 0x1.4p2 +REG esri:31838 4 0x1.9p5 0x1.4p2 +REG esri:31839 0 0x1.98p5 0x0.0p0 +REG esri:31839 1 0x1.7p5 -0x1.4p2 +REG esri:31839 2 0x1.cp5 -0x1.4p2 +REG esri:31839 3 0x1.7p5 0x1.4p2 +REG esri:31839 4 0x1.cp5 0x1.4p2 +REG esri:31900 0 0x1.8p5 0x0.0p0 +REG esri:31900 1 0x1.58p5 -0x1.4p2 +REG esri:31900 2 0x1.a8p5 -0x1.4p2 +REG esri:31900 3 0x1.58p5 0x1.4p2 +REG esri:31900 4 0x1.a8p5 0x1.4p2 +REG esri:31986 0 -0x1.44p6 0x0.0p0 +REG esri:31986 1 -0x1.58p6 -0x1.4p2 +REG esri:31986 2 -0x1.3p6 -0x1.4p2 +REG esri:31986 3 -0x1.58p6 0x1.4p2 +REG esri:31986 4 -0x1.3p6 0x1.4p2 +REG esri:31987 0 -0x1.2cp6 0x0.0p0 +REG esri:31987 1 -0x1.4p6 -0x1.4p2 +REG esri:31987 2 -0x1.18p6 -0x1.4p2 +REG esri:31987 3 -0x1.4p6 0x1.4p2 +REG esri:31987 4 -0x1.18p6 0x1.4p2 +REG esri:31988 0 -0x1.14p6 0x0.0p0 +REG esri:31988 1 -0x1.28p6 -0x1.4p2 +REG esri:31988 2 -0x1.0p6 -0x1.4p2 +REG esri:31988 3 -0x1.28p6 0x1.4p2 +REG esri:31988 4 -0x1.0p6 0x1.4p2 +REG esri:31989 0 -0x1.f8p5 0x0.0p0 +REG esri:31989 1 -0x1.1p6 -0x1.4p2 +REG esri:31989 2 -0x1.dp5 -0x1.4p2 +REG esri:31989 3 -0x1.1p6 0x1.4p2 +REG esri:31989 4 -0x1.dp5 0x1.4p2 +REG esri:31990 0 -0x1.c8p5 0x0.0p0 +REG esri:31990 1 -0x1.fp5 -0x1.4p2 +REG esri:31990 2 -0x1.ap5 -0x1.4p2 +REG esri:31990 3 -0x1.fp5 0x1.4p2 +REG esri:31990 4 -0x1.ap5 0x1.4p2 +REG esri:31991 0 -0x1.98p5 0x0.0p0 +REG esri:31991 1 -0x1.cp5 -0x1.4p2 +REG esri:31991 2 -0x1.7p5 -0x1.4p2 +REG esri:31991 3 -0x1.cp5 0x1.4p2 +REG esri:31991 4 -0x1.7p5 0x1.4p2 +REG esri:31992 0 -0x1.44p6 -0x1.9p4 +REG esri:31992 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG esri:31992 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:31992 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG esri:31992 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:31993 0 -0x1.2cp6 -0x1.9p4 +REG esri:31993 1 -0x1.42114b818572ep6 -0x1.ep4 +REG esri:31993 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:31993 3 -0x1.42114b818572ep6 -0x1.4p4 +REG esri:31993 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:31994 0 -0x1.14p6 -0x1.9p4 +REG esri:31994 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:31994 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:31994 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:31994 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:31995 0 -0x1.f8p5 -0x1.9p4 +REG esri:31995 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:31995 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:31995 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:31995 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:31996 0 -0x1.c8p5 -0x1.9p4 +REG esri:31996 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:31996 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:31996 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:31996 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:31997 0 -0x1.98p5 -0x1.9p4 +REG esri:31997 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:31997 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:31997 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:31997 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:31998 0 -0x1.68p5 -0x1.9p4 +REG esri:31998 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:31998 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:31998 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:31998 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:31999 0 -0x1.38p5 -0x1.9p4 +REG esri:31999 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:31999 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:31999 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:31999 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:3200 0 0x1.68p5 0x1.04p5 +REG esri:3200 1 0x1.38928b4db1cbap5 0x1.b8p4 +REG esri:3200 2 0x1.976d74b24e346p5 0x1.b8p4 +REG esri:3200 3 0x1.38928b4db1cbap5 0x1.2cp5 +REG esri:3200 4 0x1.976d74b24e346p5 0x1.2cp5 +REG esri:32000 0 -0x1.08p5 -0x1.9p4 +REG esri:32000 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32000 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32000 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32000 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32001 0 -0x1.b6p6 0x1.7eddddddddddep5 +REG esri:32001 1 -0x1.c03be7769007bp6 0x1.7122222222222p5 +REG esri:32001 2 -0x1.abc418896ff85p6 0x1.7122222222222p5 +REG esri:32001 3 -0x1.c03be7769007bp6 0x1.8c9999999999ap5 +REG esri:32001 4 -0x1.abc418896ff85p6 0x1.8c9999999999ap5 +REG esri:32002 0 -0x1.b6p6 0x1.76ddddddddddep5 +REG esri:32002 1 -0x1.c1fde20665f2fp6 0x1.6677777777779p5 +REG esri:32002 2 -0x1.aa021df99a0d1p6 0x1.6677777777779p5 +REG esri:32002 3 -0x1.c1fde20665f2fp6 0x1.8744444444443p5 +REG esri:32002 4 -0x1.aa021df99a0d1p6 0x1.8744444444443p5 +REG esri:32003 0 -0x1.b6p6 0x1.699999999999ap5 +REG esri:32003 1 -0x1.c39fc45f44299p6 0x1.5666666666667p5 +REG esri:32003 2 -0x1.a8603ba0bbd67p6 0x1.5666666666667p5 +REG esri:32003 3 -0x1.c39fc45f44299p6 0x1.7cccccccccccdp5 +REG esri:32003 4 -0x1.a8603ba0bbd67p6 0x1.7cccccccccccdp5 +REG esri:32005 0 -0x1.9p6 0x1.509999999999ap5 +REG esri:32005 1 -0x1.97fe570c30a39p6 0x1.44bbbbbbbbbbdp5 +REG esri:32005 2 -0x1.8801a8f3cf5c7p6 0x1.44bbbbbbbbbbdp5 +REG esri:32005 3 -0x1.97fe570c30a39p6 0x1.5c77777777777p5 +REG esri:32005 4 -0x1.8801a8f3cf5c7p6 0x1.5c77777777777p5 +REG esri:32006 0 -0x1.8ep6 0x1.4588888888888p5 +REG esri:32006 1 -0x1.98d08e5c9d95fp6 0x1.352222222222p5 +REG esri:32006 2 -0x1.832f71a3626a1p6 0x1.352222222222p5 +REG esri:32006 3 -0x1.98d08e5c9d95fp6 0x1.55eeeeeeeeefp5 +REG esri:32006 4 -0x1.832f71a3626a1p6 0x1.55eeeeeeeeefp5 +REG esri:32007 0 -0x1.ce55555555553p6 0x1.16p5 +REG esri:32007 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG esri:32007 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG esri:32007 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG esri:32007 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG esri:32008 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG esri:32008 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG esri:32008 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG esri:32008 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG esri:32008 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG esri:32009 0 -0x1.da55555555553p6 0x1.16p5 +REG esri:32009 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG esri:32009 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG esri:32009 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG esri:32009 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG esri:32010 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG esri:32010 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG esri:32010 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG esri:32010 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG esri:32010 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG esri:32011 0 -0x1.2aaaaaaaaaaabp6 0x1.36aaaaaaaaaacp5 +REG esri:32011 1 -0x1.44576bc120c12p6 0x1.0eaaaaaaaaaacp5 +REG esri:32011 2 -0x1.10fde99434944p6 0x1.0eaaaaaaaaaacp5 +REG esri:32011 3 -0x1.44576bc120c12p6 0x1.5eaaaaaaaaaacp5 +REG esri:32011 4 -0x1.10fde99434944p6 0x1.5eaaaaaaaaaacp5 +REG esri:32012 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:32012 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:32012 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:32012 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:32012 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:32013 0 -0x1.a9p6 0x1.fp4 +REG esri:32013 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:32013 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:32013 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:32013 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:32014 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:32014 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:32014 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:32014 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:32014 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:32015 0 -0x1.2955555555555p6 0x1.4p5 +REG esri:32015 1 -0x1.437104c68e2d2p6 0x1.18p5 +REG esri:32015 2 -0x1.0f39a5e41c7d8p6 0x1.18p5 +REG esri:32015 3 -0x1.437104c68e2d2p6 0x1.68p5 +REG esri:32015 4 -0x1.0f39a5e41c7d8p6 0x1.68p5 +REG esri:32016 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:32016 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:32016 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:32016 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:32016 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:32017 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:32017 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:32017 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:32017 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:32017 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:32018 0 -0x1.28p6 0x1.4622222222222p5 +REG esri:32018 1 -0x1.2d4809c4ef0d8p6 0x1.3e22222222222p5 +REG esri:32018 2 -0x1.22b7f63b10f28p6 0x1.3e22222222222p5 +REG esri:32018 3 -0x1.2d4809c4ef0d8p6 0x1.4e22222222222p5 +REG esri:32018 4 -0x1.22b7f63b10f28p6 0x1.4e22222222222p5 +REG esri:32019 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG esri:32019 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG esri:32019 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG esri:32019 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG esri:32019 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG esri:32020 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:32020 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:32020 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:32020 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:32020 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:32021 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:32021 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:32021 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:32021 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:32021 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:32022 0 -0x1.4ap6 0x1.4577777777777p5 +REG esri:32022 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG esri:32022 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG esri:32022 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG esri:32022 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG esri:32023 0 -0x1.4ap6 0x1.3822222222222p5 +REG esri:32023 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG esri:32023 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG esri:32023 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG esri:32023 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG esri:32024 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:32024 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:32024 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:32024 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:32024 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:32025 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:32025 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:32025 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:32025 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:32025 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:32026 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:32026 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:32026 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:32026 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:32026 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:32027 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:32027 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:32027 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:32027 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:32027 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:32028 0 -0x1.37p6 0x1.4877777777777p5 +REG esri:32028 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG esri:32028 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG esri:32028 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG esri:32028 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG esri:32029 0 -0x1.37p6 0x1.4088888888889p5 +REG esri:32029 1 -0x1.3eaa770d743d9p6 0x1.34ccccccccccfp5 +REG esri:32029 2 -0x1.2f5588f28bc27p6 0x1.34ccccccccccfp5 +REG esri:32029 3 -0x1.3eaa770d743d9p6 0x1.4c44444444443p5 +REG esri:32029 4 -0x1.2f5588f28bc27p6 0x1.4c44444444443p5 +REG esri:32030 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG esri:32030 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG esri:32030 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG esri:32030 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG esri:32030 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG esri:32031 0 -0x1.44p6 0x1.0fddddddddddep5 +REG esri:32031 1 -0x1.4d7caf89e58b4p6 0x1.0022222222222p5 +REG esri:32031 2 -0x1.3a8350761a74cp6 0x1.0022222222222p5 +REG esri:32031 3 -0x1.4d7caf89e58b4p6 0x1.1f9999999999ap5 +REG esri:32031 4 -0x1.3a8350761a74cp6 0x1.1f9999999999ap5 +REG esri:32033 0 -0x1.44p6 0x1.05fffffffffffp5 +REG esri:32033 1 -0x1.4cb828dd9db44p6 0x1.eeaaaaaaaaaaap4 +REG esri:32033 2 -0x1.3b47d722624bcp6 0x1.eeaaaaaaaaaaap4 +REG esri:32033 3 -0x1.4cb828dd9db44p6 0x1.14aaaaaaaaaa9p5 +REG esri:32033 4 -0x1.3b47d722624bcp6 0x1.14aaaaaaaaaa9p5 +REG esri:32034 0 -0x1.9p6 0x1.6611111111112p5 +REG esri:32034 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG esri:32034 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG esri:32034 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG esri:32034 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG esri:32035 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG esri:32035 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG esri:32035 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG esri:32035 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG esri:32035 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG esri:32036 0 -0x1.58p6 0x1.1c55555555554p5 +REG esri:32036 1 -0x1.609a4e06b0d59p6 0x1.0e55555555554p5 +REG esri:32036 2 -0x1.4f65b1f94f2a7p6 0x1.0e55555555554p5 +REG esri:32036 3 -0x1.609a4e06b0d59p6 0x1.2a55555555554p5 +REG esri:32036 4 -0x1.4f65b1f94f2a7p6 0x1.2a55555555554p5 +REG esri:32037 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:32037 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:32037 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:32037 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:32037 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:32038 0 -0x1.86p6 0x1.0688888888889p5 +REG esri:32038 1 -0x1.90f271ed65e92p6 0x1.e844444444446p4 +REG esri:32038 2 -0x1.7b0d8e129a16ep6 0x1.e844444444446p4 +REG esri:32038 3 -0x1.90f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:32038 4 -0x1.7b0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:32039 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:32039 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:32039 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:32039 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:32039 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:32040 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG esri:32040 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG esri:32040 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG esri:32040 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG esri:32040 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG esri:32041 0 -0x1.8ap6 0x1.acp4 +REG esri:32041 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:32041 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:32041 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:32041 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:32042 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:32042 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:32042 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:32042 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:32042 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:32043 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:32043 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:32043 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:32043 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:32043 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:32044 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:32044 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:32044 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:32044 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:32044 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:32045 0 -0x1.22p6 0x1.54p5 +REG esri:32045 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG esri:32045 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG esri:32045 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG esri:32045 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG esri:32046 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:32046 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:32046 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:32046 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:32046 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:32047 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:32047 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:32047 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:32047 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:32047 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:32048 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:32048 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:32048 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:32048 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:32048 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:32049 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:32049 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:32049 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:32049 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:32049 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:32050 0 -0x1.3ep6 0x1.3bp5 +REG esri:32050 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG esri:32050 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG esri:32050 3 -0x1.470e3592d233ap6 0x1.49p5 +REG esri:32050 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG esri:32051 0 -0x1.44p6 0x1.2f88888888888p5 +REG esri:32051 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG esri:32051 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG esri:32051 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG esri:32051 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG esri:32052 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:32052 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:32052 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:32052 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:32052 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:32053 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:32053 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:32053 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:32053 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:32053 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:32054 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:32054 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:32054 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:32054 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:32054 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:32055 0 -0x1.a4aaaaaaaaaadp6 0x1.4555555555554p5 +REG esri:32055 1 -0x1.bf08b5e8e0578p6 0x1.1d55555555554p5 +REG esri:32055 2 -0x1.8a4c9f6c74fe2p6 0x1.1d55555555554p5 +REG esri:32055 3 -0x1.bf08b5e8e0578p6 0x1.6d55555555554p5 +REG esri:32055 4 -0x1.8a4c9f6c74fe2p6 0x1.6d55555555554p5 +REG esri:32056 0 -0x1.ad55555555553p6 0x1.4555555555554p5 +REG esri:32056 1 -0x1.c7b360938b01ep6 0x1.1d55555555554p5 +REG esri:32056 2 -0x1.92f74a171fa88p6 0x1.1d55555555554p5 +REG esri:32056 3 -0x1.c7b360938b01ep6 0x1.6d55555555554p5 +REG esri:32056 4 -0x1.92f74a171fa88p6 0x1.6d55555555554p5 +REG esri:32057 0 -0x1.b3p6 0x1.4555555555554p5 +REG esri:32057 1 -0x1.cd5e0b3e35acbp6 0x1.1d55555555554p5 +REG esri:32057 2 -0x1.98a1f4c1ca535p6 0x1.1d55555555554p5 +REG esri:32057 3 -0x1.cd5e0b3e35acbp6 0x1.6d55555555554p5 +REG esri:32057 4 -0x1.98a1f4c1ca535p6 0x1.6d55555555554p5 +REG esri:32058 0 -0x1.b855555555553p6 0x1.4555555555554p5 +REG esri:32058 1 -0x1.d2b360938b01ep6 0x1.1d55555555554p5 +REG esri:32058 2 -0x1.9df74a171fa88p6 0x1.1d55555555554p5 +REG esri:32058 3 -0x1.d2b360938b01ep6 0x1.6d55555555554p5 +REG esri:32058 4 -0x1.9df74a171fa88p6 0x1.6d55555555554p5 +REG esri:32059 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:32059 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:32059 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:32059 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:32059 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:32060 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:32060 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:32060 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:32060 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:32060 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:32061 0 -0x1.6955555555555p6 0x1.0d11111111112p4 +REG esri:32061 1 -0x1.7e3a11ecca027p6 0x1.7a22222222224p3 +REG esri:32061 2 -0x1.547098bde0a83p6 0x1.7a22222222224p3 +REG esri:32061 3 -0x1.7e3a11ecca027p6 0x1.5d11111111112p4 +REG esri:32061 4 -0x1.547098bde0a83p6 0x1.5d11111111112p4 +REG esri:32062 0 -0x1.6955555555555p6 0x1.dcccccccccccdp3 +REG esri:32062 1 -0x1.7e077a4bda7ebp6 0x1.3cccccccccccdp3 +REG esri:32062 2 -0x1.54a3305ed02bfp6 0x1.3cccccccccccdp3 +REG esri:32062 3 -0x1.7e077a4bda7ebp6 0x1.3e66666666666p4 +REG esri:32062 4 -0x1.54a3305ed02bfp6 0x1.3e66666666666p4 +REG esri:32064 0 -0x1.8cp6 0x0.0p0 +REG esri:32064 1 -0x1.ap6 -0x1.4p2 +REG esri:32064 2 -0x1.78p6 -0x1.4p2 +REG esri:32064 3 -0x1.ap6 0x1.4p2 +REG esri:32064 4 -0x1.78p6 0x1.4p2 +REG esri:32065 0 -0x1.74p6 0x0.0p0 +REG esri:32065 1 -0x1.88p6 -0x1.4p2 +REG esri:32065 2 -0x1.6p6 -0x1.4p2 +REG esri:32065 3 -0x1.88p6 0x1.4p2 +REG esri:32065 4 -0x1.6p6 0x1.4p2 +REG esri:32066 0 -0x1.5cp6 0x0.0p0 +REG esri:32066 1 -0x1.7p6 -0x1.4p2 +REG esri:32066 2 -0x1.48p6 -0x1.4p2 +REG esri:32066 3 -0x1.7p6 0x1.4p2 +REG esri:32066 4 -0x1.48p6 0x1.4p2 +REG esri:32067 0 -0x1.44p6 0x0.0p0 +REG esri:32067 1 -0x1.58p6 -0x1.4p2 +REG esri:32067 2 -0x1.3p6 -0x1.4p2 +REG esri:32067 3 -0x1.58p6 0x1.4p2 +REG esri:32067 4 -0x1.3p6 0x1.4p2 +REG esri:32074 0 -0x1.8cp6 0x0.0p0 +REG esri:32074 1 -0x1.ap6 -0x1.4p2 +REG esri:32074 2 -0x1.78p6 -0x1.4p2 +REG esri:32074 3 -0x1.ap6 0x1.4p2 +REG esri:32074 4 -0x1.78p6 0x1.4p2 +REG esri:32075 0 -0x1.74p6 0x0.0p0 +REG esri:32075 1 -0x1.88p6 -0x1.4p2 +REG esri:32075 2 -0x1.6p6 -0x1.4p2 +REG esri:32075 3 -0x1.88p6 0x1.4p2 +REG esri:32075 4 -0x1.6p6 0x1.4p2 +REG esri:32076 0 -0x1.5cp6 0x0.0p0 +REG esri:32076 1 -0x1.7p6 -0x1.4p2 +REG esri:32076 2 -0x1.48p6 -0x1.4p2 +REG esri:32076 3 -0x1.7p6 0x1.4p2 +REG esri:32076 4 -0x1.48p6 0x1.4p2 +REG esri:32077 0 -0x1.44p6 0x0.0p0 +REG esri:32077 1 -0x1.58p6 -0x1.4p2 +REG esri:32077 2 -0x1.3p6 -0x1.4p2 +REG esri:32077 3 -0x1.58p6 0x1.4p2 +REG esri:32077 4 -0x1.3p6 0x1.4p2 +REG esri:32081 0 -0x1.a8p5 0x0.0p0 +REG esri:32081 1 -0x1.dp5 -0x1.4p2 +REG esri:32081 2 -0x1.8p5 -0x1.4p2 +REG esri:32081 3 -0x1.dp5 0x1.4p2 +REG esri:32081 4 -0x1.8p5 0x1.4p2 +REG esri:32082 0 -0x1.cp5 0x0.0p0 +REG esri:32082 1 -0x1.e8p5 -0x1.4p2 +REG esri:32082 2 -0x1.98p5 -0x1.4p2 +REG esri:32082 3 -0x1.e8p5 0x1.4p2 +REG esri:32082 4 -0x1.98p5 0x1.4p2 +REG esri:32083 0 -0x1.d4p5 0x0.0p0 +REG esri:32083 1 -0x1.fcp5 -0x1.4p2 +REG esri:32083 2 -0x1.acp5 -0x1.4p2 +REG esri:32083 3 -0x1.fcp5 0x1.4p2 +REG esri:32083 4 -0x1.acp5 0x1.4p2 +REG esri:32084 0 -0x1.ecp5 0x0.0p0 +REG esri:32084 1 -0x1.0ap6 -0x1.4p2 +REG esri:32084 2 -0x1.c4p5 -0x1.4p2 +REG esri:32084 3 -0x1.0ap6 0x1.4p2 +REG esri:32084 4 -0x1.c4p5 0x1.4p2 +REG esri:32085 0 -0x1.02p6 0x0.0p0 +REG esri:32085 1 -0x1.16p6 -0x1.4p2 +REG esri:32085 2 -0x1.dcp5 -0x1.4p2 +REG esri:32085 3 -0x1.16p6 0x1.4p2 +REG esri:32085 4 -0x1.dcp5 0x1.4p2 +REG esri:32086 0 -0x1.0ep6 0x0.0p0 +REG esri:32086 1 -0x1.22p6 -0x1.4p2 +REG esri:32086 2 -0x1.f4p5 -0x1.4p2 +REG esri:32086 3 -0x1.22p6 0x1.4p2 +REG esri:32086 4 -0x1.f4p5 0x1.4p2 +REG esri:32098 0 -0x1.12p6 0x1.ap5 +REG esri:32098 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG esri:32098 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG esri:32098 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG esri:32098 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG esri:32100 0 -0x1.b6p6 0x1.75p5 +REG esri:32100 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG esri:32100 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG esri:32100 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG esri:32100 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG esri:32104 0 -0x1.9p6 0x1.4b55555555556p5 +REG esri:32104 1 -0x1.a0e40642823c4p6 0x1.3200000000002p5 +REG esri:32104 2 -0x1.7f1bf9bd7dc3cp6 0x1.3200000000002p5 +REG esri:32104 3 -0x1.a0e40642823c4p6 0x1.64aaaaaaaaaaap5 +REG esri:32104 4 -0x1.7f1bf9bd7dc3cp6 0x1.64aaaaaaaaaaap5 +REG esri:32107 0 -0x1.ce55555555553p6 0x1.16p5 +REG esri:32107 1 -0x1.e6acb863f64b1p6 0x1.dcp4 +REG esri:32107 2 -0x1.b5fdf246b45f5p6 0x1.dcp4 +REG esri:32107 3 -0x1.e6acb863f64b1p6 0x1.3ep5 +REG esri:32107 4 -0x1.b5fdf246b45f5p6 0x1.3ep5 +REG esri:32108 0 -0x1.d2aaaaaaaaaadp6 0x1.16p5 +REG esri:32108 1 -0x1.eb020db94ba0bp6 0x1.dcp4 +REG esri:32108 2 -0x1.ba53479c09b4fp6 0x1.dcp4 +REG esri:32108 3 -0x1.eb020db94ba0bp6 0x1.3ep5 +REG esri:32108 4 -0x1.ba53479c09b4fp6 0x1.3ep5 +REG esri:32109 0 -0x1.da55555555553p6 0x1.16p5 +REG esri:32109 1 -0x1.f2acb863f64b1p6 0x1.dcp4 +REG esri:32109 2 -0x1.c1fdf246b45f5p6 0x1.dcp4 +REG esri:32109 3 -0x1.f2acb863f64b1p6 0x1.3ep5 +REG esri:32109 4 -0x1.c1fdf246b45f5p6 0x1.3ep5 +REG esri:32110 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG esri:32110 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG esri:32110 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG esri:32110 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG esri:32110 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG esri:32111 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:32111 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:32111 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:32111 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:32111 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:32112 0 -0x1.a155555555553p6 0x1.fp4 +REG esri:32112 1 -0x1.b8aa7f0f4a8eap6 0x1.ap4 +REG esri:32112 2 -0x1.8a002b9b601bcp6 0x1.ap4 +REG esri:32112 3 -0x1.b8aa7f0f4a8eap6 0x1.2p5 +REG esri:32112 4 -0x1.8a002b9b601bcp6 0x1.2p5 +REG esri:32113 0 -0x1.a9p6 0x1.fp4 +REG esri:32113 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG esri:32113 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG esri:32113 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG esri:32113 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG esri:32114 0 -0x1.af55555555553p6 0x1.fp4 +REG esri:32114 1 -0x1.c6aa7f0f4a8eap6 0x1.ap4 +REG esri:32114 2 -0x1.98002b9b601bcp6 0x1.ap4 +REG esri:32114 3 -0x1.c6aa7f0f4a8eap6 0x1.2p5 +REG esri:32114 4 -0x1.98002b9b601bcp6 0x1.2p5 +REG esri:32115 0 -0x1.2ap6 0x1.36aaaaaaaaaacp5 +REG esri:32115 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaacp5 +REG esri:32115 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaacp5 +REG esri:32115 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaacp5 +REG esri:32115 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaacp5 +REG esri:32116 0 -0x1.3255555555555p6 0x1.4p5 +REG esri:32116 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG esri:32116 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG esri:32116 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG esri:32116 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG esri:32117 0 -0x1.3a55555555555p6 0x1.4p5 +REG esri:32117 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG esri:32117 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG esri:32117 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG esri:32117 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG esri:32118 0 -0x1.28p6 0x1.44cccccccccccp5 +REG esri:32118 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG esri:32118 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG esri:32118 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG esri:32118 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG esri:32119 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG esri:32119 1 -0x1.47cb7933f48a9p6 0x1.0455555555556p5 +REG esri:32119 2 -0x1.303486cc0b757p6 0x1.0455555555556p5 +REG esri:32119 3 -0x1.47cb7933f48a9p6 0x1.2affffffffffep5 +REG esri:32119 4 -0x1.303486cc0b757p6 0x1.2affffffffffep5 +REG esri:32120 0 -0x1.92p6 0x1.7eeeeeeeeeeeep5 +REG esri:32120 1 -0x1.9c55c3f143a7p6 0x1.7111111111111p5 +REG esri:32120 2 -0x1.87aa3c0ebc59p6 0x1.7111111111111p5 +REG esri:32120 3 -0x1.9c55c3f143a7p6 0x1.8cccccccccccbp5 +REG esri:32120 4 -0x1.87aa3c0ebc59p6 0x1.8cccccccccccbp5 +REG esri:32121 0 -0x1.92p6 0x1.7499999999998p5 +REG esri:32121 1 -0x1.9c9237ec29bb1p6 0x1.661111111110fp5 +REG esri:32121 2 -0x1.876dc813d644fp6 0x1.661111111110fp5 +REG esri:32121 3 -0x1.9c9237ec29bb1p6 0x1.8322222222221p5 +REG esri:32121 4 -0x1.876dc813d644fp6 0x1.8322222222221p5 +REG esri:32122 0 -0x1.4ap6 0x1.4577777777777p5 +REG esri:32122 1 -0x1.54b9b443558bbp6 0x1.3533333333331p5 +REG esri:32122 2 -0x1.3f464bbcaa745p6 0x1.3533333333331p5 +REG esri:32122 3 -0x1.54b9b443558bbp6 0x1.55bbbbbbbbbbdp5 +REG esri:32122 4 -0x1.3f464bbcaa745p6 0x1.55bbbbbbbbbbdp5 +REG esri:32123 0 -0x1.4ap6 0x1.3822222222222p5 +REG esri:32123 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG esri:32123 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG esri:32123 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG esri:32123 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG esri:32124 0 -0x1.88p6 0x1.1f11111111112p5 +REG esri:32124 1 -0x1.90b8d4acb5309p6 0x1.10eeeeeeeeeefp5 +REG esri:32124 2 -0x1.7f472b534acf7p6 0x1.10eeeeeeeeeefp5 +REG esri:32124 3 -0x1.90b8d4acb5309p6 0x1.2d33333333335p5 +REG esri:32124 4 -0x1.7f472b534acf7p6 0x1.2d33333333335p5 +REG esri:32125 0 -0x1.88p6 0x1.1244444444444p5 +REG esri:32125 1 -0x1.9132b355fc5d1p6 0x1.0311111111113p5 +REG esri:32125 2 -0x1.7ecd4caa03a2fp6 0x1.0311111111113p5 +REG esri:32125 3 -0x1.9132b355fc5d1p6 0x1.2177777777775p5 +REG esri:32125 4 -0x1.7ecd4caa03a2fp6 0x1.2177777777775p5 +REG esri:32126 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG esri:32126 1 -0x1.ef293dbbe364p6 0x1.53ffffffffffep5 +REG esri:32126 2 -0x1.d4d6c2441c9cp6 0x1.53ffffffffffep5 +REG esri:32126 3 -0x1.ef293dbbe364p6 0x1.7955555555556p5 +REG esri:32126 4 -0x1.d4d6c2441c9cp6 0x1.7955555555556p5 +REG esri:32127 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG esri:32127 1 -0x1.eeba2d4454414p6 0x1.43ffffffffffep5 +REG esri:32127 2 -0x1.d545d2bbabbecp6 0x1.43ffffffffffep5 +REG esri:32127 3 -0x1.eeba2d4454414p6 0x1.6955555555556p5 +REG esri:32127 4 -0x1.d545d2bbabbecp6 0x1.6955555555556p5 +REG esri:32128 0 -0x1.37p6 0x1.4877777777777p5 +REG esri:32128 1 -0x1.4075cb858aac9p6 0x1.3a33333333331p5 +REG esri:32128 2 -0x1.2d8a347a75537p6 0x1.3a33333333331p5 +REG esri:32128 3 -0x1.4075cb858aac9p6 0x1.56bbbbbbbbbbdp5 +REG esri:32128 4 -0x1.2d8a347a75537p6 0x1.56bbbbbbbbbbdp5 +REG esri:32129 0 -0x1.37p6 0x1.4133333333334p5 +REG esri:32129 1 -0x1.3f8c26cb1f465p6 0x1.3422222222224p5 +REG esri:32129 2 -0x1.2e73d934e0b9bp6 0x1.3422222222224p5 +REG esri:32129 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444444p5 +REG esri:32129 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444444p5 +REG esri:32130 0 -0x1.1ep6 0x1.48aaaaaaaaaacp5 +REG esri:32130 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaacp5 +REG esri:32130 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaacp5 +REG esri:32130 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaacp5 +REG esri:32130 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaacp5 +REG esri:32133 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG esri:32133 1 -0x1.525ce4d3b432ep6 0x1.e555555555552p4 +REG esri:32133 2 -0x1.35a31b2c4bcd2p6 0x1.e555555555552p4 +REG esri:32133 3 -0x1.525ce4d3b432ep6 0x1.22aaaaaaaaaadp5 +REG esri:32133 4 -0x1.35a31b2c4bcd2p6 0x1.22aaaaaaaaaadp5 +REG esri:32134 0 -0x1.9p6 0x1.6611111111112p5 +REG esri:32134 1 -0x1.9a6bdb73f4275p6 0x1.5744444444447p5 +REG esri:32134 2 -0x1.8594248c0bd8bp6 0x1.5744444444447p5 +REG esri:32134 3 -0x1.9a6bdb73f4275p6 0x1.74dddddddddddp5 +REG esri:32134 4 -0x1.8594248c0bd8bp6 0x1.74dddddddddddp5 +REG esri:32135 0 -0x1.9155555555553p6 0x1.5aeeeeeeeeefp5 +REG esri:32135 1 -0x1.9cb46504892e3p6 0x1.4a66666666669p5 +REG esri:32135 2 -0x1.85f645a6217c3p6 0x1.4a66666666669p5 +REG esri:32135 3 -0x1.9cb46504892e3p6 0x1.6b77777777777p5 +REG esri:32135 4 -0x1.85f645a6217c3p6 0x1.6b77777777777p5 +REG esri:32136 0 -0x1.58p6 0x1.1bp5 +REG esri:32136 1 -0x1.62385d901218cp6 0x1.0a55555555558p5 +REG esri:32136 2 -0x1.4dc7a26fede74p6 0x1.0a55555555558p5 +REG esri:32136 3 -0x1.62385d901218cp6 0x1.2baaaaaaaaaa8p5 +REG esri:32136 4 -0x1.4dc7a26fede74p6 0x1.2baaaaaaaaaa8p5 +REG esri:32137 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG esri:32137 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG esri:32137 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG esri:32137 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG esri:32137 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG esri:32138 0 -0x1.8ap6 0x1.0688888888889p5 +REG esri:32138 1 -0x1.94f271ed65e92p6 0x1.e844444444446p4 +REG esri:32138 2 -0x1.7f0d8e129a16ep6 0x1.e844444444446p4 +REG esri:32138 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeeefp5 +REG esri:32138 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeeefp5 +REG esri:32139 0 -0x1.9155555555553p6 0x1.ec66666666666p4 +REG esri:32139 1 -0x1.9ba738e53ac9dp6 0x1.c8eeeeeeeeef1p4 +REG esri:32139 2 -0x1.870371c56fe09p6 0x1.c8eeeeeeeeef1p4 +REG esri:32139 3 -0x1.9ba738e53ac9dp6 0x1.07eeeeeeeeeeep5 +REG esri:32139 4 -0x1.870371c56fe09p6 0x1.07eeeeeeeeeeep5 +REG esri:32140 0 -0x1.8cp6 0x1.d0eeeeeeeeeeep4 +REG esri:32140 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbap4 +REG esri:32140 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbap4 +REG esri:32140 3 -0x1.97361161034adp6 0x1.f822222222222p4 +REG esri:32140 4 -0x1.80c9ee9efcb53p6 0x1.f822222222222p4 +REG esri:32141 0 -0x1.8ap6 0x1.acp4 +REG esri:32141 1 -0x1.93b49156c66f8p6 0x1.8955555555558p4 +REG esri:32141 2 -0x1.804b6ea939908p6 0x1.8955555555558p4 +REG esri:32141 3 -0x1.93b49156c66f8p6 0x1.ceaaaaaaaaaa8p4 +REG esri:32141 4 -0x1.804b6ea939908p6 0x1.ceaaaaaaaaaa8p4 +REG esri:32142 0 -0x1.bep6 0x1.4877777777778p5 +REG esri:32142 1 -0x1.c5b11f7fb8876p6 0x1.3cdddddddddep5 +REG esri:32142 2 -0x1.b64ee0804778ap6 0x1.3cdddddddddep5 +REG esri:32142 3 -0x1.c5b11f7fb8876p6 0x1.541111111111p5 +REG esri:32142 4 -0x1.b64ee0804778ap6 0x1.541111111111p5 +REG esri:32143 0 -0x1.bep6 0x1.3beeeeeeeeefp5 +REG esri:32143 1 -0x1.ca0202c3d20c6p6 0x1.2966666666669p5 +REG esri:32143 2 -0x1.b1fdfd3c2df3ap6 0x1.2966666666669p5 +REG esri:32143 3 -0x1.ca0202c3d20c6p6 0x1.4e77777777777p5 +REG esri:32143 4 -0x1.b1fdfd3c2df3ap6 0x1.4e77777777777p5 +REG esri:32144 0 -0x1.bep6 0x1.2c1111111111p5 +REG esri:32144 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999997p5 +REG esri:32144 2 -0x1.b5830a05dba62p6 0x1.1e99999999997p5 +REG esri:32144 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG esri:32144 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG esri:32145 0 -0x1.22p6 0x1.54p5 +REG esri:32145 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG esri:32145 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG esri:32145 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG esri:32145 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG esri:32146 0 -0x1.3ap6 0x1.3377777777777p5 +REG esri:32146 1 -0x1.41d46dd6b3ca9p6 0x1.2733333333331p5 +REG esri:32146 2 -0x1.322b92294c357p6 0x1.2733333333331p5 +REG esri:32146 3 -0x1.41d46dd6b3ca9p6 0x1.3fbbbbbbbbbbdp5 +REG esri:32146 4 -0x1.322b92294c357p6 0x1.3fbbbbbbbbbbdp5 +REG esri:32147 0 -0x1.3ap6 0x1.2933333333334p5 +REG esri:32147 1 -0x1.423262b0988dfp6 0x1.1c22222222224p5 +REG esri:32147 2 -0x1.31cd9d4f67721p6 0x1.1c22222222224p5 +REG esri:32147 3 -0x1.423262b0988dfp6 0x1.3644444444444p5 +REG esri:32147 4 -0x1.31cd9d4f67721p6 0x1.3644444444444p5 +REG esri:32148 0 -0x1.e355555555553p6 0x1.7eeeeeeeeeeeep5 +REG esri:32148 1 -0x1.edab194698fc3p6 0x1.7111111111111p5 +REG esri:32148 2 -0x1.d8ff916411ae3p6 0x1.7111111111111p5 +REG esri:32148 3 -0x1.edab194698fc3p6 0x1.8cccccccccccbp5 +REG esri:32148 4 -0x1.d8ff916411ae3p6 0x1.8cccccccccccbp5 +REG esri:32149 0 -0x1.e2p6 0x1.72aaaaaaaaaacp5 +REG esri:32149 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaacp5 +REG esri:32149 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaacp5 +REG esri:32149 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaacp5 +REG esri:32149 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaacp5 +REG esri:32150 0 -0x1.3ep6 0x1.3bp5 +REG esri:32150 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG esri:32150 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG esri:32150 3 -0x1.470e3592d233ap6 0x1.49p5 +REG esri:32150 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG esri:32151 0 -0x1.44p6 0x1.2f88888888888p5 +REG esri:32151 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG esri:32151 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG esri:32151 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG esri:32151 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG esri:32152 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG esri:32152 1 -0x1.71352657aea27p6 0x1.62eeeeeeeeeedp5 +REG esri:32152 2 -0x1.5ecad9a8515d9p6 0x1.62eeeeeeeeeedp5 +REG esri:32152 3 -0x1.71352657aea27p6 0x1.7c8888888888bp5 +REG esri:32152 4 -0x1.5ecad9a8515d9p6 0x1.7c8888888888bp5 +REG esri:32153 0 -0x1.68p6 0x1.6555555555556p5 +REG esri:32153 1 -0x1.715fabce299d5p6 0x1.5800000000002p5 +REG esri:32153 2 -0x1.5ea05431d662bp6 0x1.5800000000002p5 +REG esri:32153 3 -0x1.715fabce299d5p6 0x1.72aaaaaaaaaaap5 +REG esri:32153 4 -0x1.5ea05431d662bp6 0x1.72aaaaaaaaaaap5 +REG esri:32154 0 -0x1.68p6 0x1.5844444444444p5 +REG esri:32154 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG esri:32154 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG esri:32154 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG esri:32154 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG esri:32155 0 -0x1.a4aaaaaaaaaadp6 0x1.44p5 +REG esri:32155 1 -0x1.bef7e97fc92e4p6 0x1.1cp5 +REG esri:32155 2 -0x1.8a5d6bd58c276p6 0x1.1cp5 +REG esri:32155 3 -0x1.bef7e97fc92e4p6 0x1.6cp5 +REG esri:32155 4 -0x1.8a5d6bd58c276p6 0x1.6cp5 +REG esri:32156 0 -0x1.ad55555555553p6 0x1.44p5 +REG esri:32156 1 -0x1.c7a2942a73d8ap6 0x1.1cp5 +REG esri:32156 2 -0x1.9308168036d1cp6 0x1.1cp5 +REG esri:32156 3 -0x1.c7a2942a73d8ap6 0x1.6cp5 +REG esri:32156 4 -0x1.9308168036d1cp6 0x1.6cp5 +REG esri:32157 0 -0x1.b3p6 0x1.44p5 +REG esri:32157 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG esri:32157 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG esri:32157 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG esri:32157 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG esri:32158 0 -0x1.b855555555553p6 0x1.44p5 +REG esri:32158 1 -0x1.d2a2942a73d8ap6 0x1.1cp5 +REG esri:32158 2 -0x1.9e08168036d1cp6 0x1.1cp5 +REG esri:32158 3 -0x1.d2a2942a73d8ap6 0x1.6cp5 +REG esri:32158 4 -0x1.9e08168036d1cp6 0x1.6cp5 +REG esri:32161 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:32161 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:32161 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:32161 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:32161 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:32180 0 -0x1.bcp5 0x0.0p0 +REG esri:32180 1 -0x1.e4p5 -0x1.4p2 +REG esri:32180 2 -0x1.94p5 -0x1.4p2 +REG esri:32180 3 -0x1.e4p5 0x1.4p2 +REG esri:32180 4 -0x1.94p5 0x1.4p2 +REG esri:32181 0 -0x1.a8p5 0x0.0p0 +REG esri:32181 1 -0x1.dp5 -0x1.4p2 +REG esri:32181 2 -0x1.8p5 -0x1.4p2 +REG esri:32181 3 -0x1.dp5 0x1.4p2 +REG esri:32181 4 -0x1.8p5 0x1.4p2 +REG esri:32182 0 -0x1.cp5 0x0.0p0 +REG esri:32182 1 -0x1.e8p5 -0x1.4p2 +REG esri:32182 2 -0x1.98p5 -0x1.4p2 +REG esri:32182 3 -0x1.e8p5 0x1.4p2 +REG esri:32182 4 -0x1.98p5 0x1.4p2 +REG esri:32183 0 -0x1.d4p5 0x0.0p0 +REG esri:32183 1 -0x1.fcp5 -0x1.4p2 +REG esri:32183 2 -0x1.acp5 -0x1.4p2 +REG esri:32183 3 -0x1.fcp5 0x1.4p2 +REG esri:32183 4 -0x1.acp5 0x1.4p2 +REG esri:32184 0 -0x1.ecp5 0x0.0p0 +REG esri:32184 1 -0x1.0ap6 -0x1.4p2 +REG esri:32184 2 -0x1.c4p5 -0x1.4p2 +REG esri:32184 3 -0x1.0ap6 0x1.4p2 +REG esri:32184 4 -0x1.c4p5 0x1.4p2 +REG esri:32185 0 -0x1.02p6 0x0.0p0 +REG esri:32185 1 -0x1.16p6 -0x1.4p2 +REG esri:32185 2 -0x1.dcp5 -0x1.4p2 +REG esri:32185 3 -0x1.16p6 0x1.4p2 +REG esri:32185 4 -0x1.dcp5 0x1.4p2 +REG esri:32186 0 -0x1.0ep6 0x0.0p0 +REG esri:32186 1 -0x1.22p6 -0x1.4p2 +REG esri:32186 2 -0x1.f4p5 -0x1.4p2 +REG esri:32186 3 -0x1.22p6 0x1.4p2 +REG esri:32186 4 -0x1.f4p5 0x1.4p2 +REG esri:32187 0 -0x1.1ap6 0x0.0p0 +REG esri:32187 1 -0x1.2ep6 -0x1.4p2 +REG esri:32187 2 -0x1.06p6 -0x1.4p2 +REG esri:32187 3 -0x1.2ep6 0x1.4p2 +REG esri:32187 4 -0x1.06p6 0x1.4p2 +REG esri:32188 0 -0x1.26p6 0x0.0p0 +REG esri:32188 1 -0x1.3ap6 -0x1.4p2 +REG esri:32188 2 -0x1.12p6 -0x1.4p2 +REG esri:32188 3 -0x1.3ap6 0x1.4p2 +REG esri:32188 4 -0x1.12p6 0x1.4p2 +REG esri:32189 0 -0x1.32p6 0x0.0p0 +REG esri:32189 1 -0x1.46p6 -0x1.4p2 +REG esri:32189 2 -0x1.1ep6 -0x1.4p2 +REG esri:32189 3 -0x1.46p6 0x1.4p2 +REG esri:32189 4 -0x1.1ep6 0x1.4p2 +REG esri:32190 0 -0x1.3ep6 0x0.0p0 +REG esri:32190 1 -0x1.52p6 -0x1.4p2 +REG esri:32190 2 -0x1.2ap6 -0x1.4p2 +REG esri:32190 3 -0x1.52p6 0x1.4p2 +REG esri:32190 4 -0x1.2ap6 0x1.4p2 +REG esri:32191 0 -0x1.4ap6 0x0.0p0 +REG esri:32191 1 -0x1.5ep6 -0x1.4p2 +REG esri:32191 2 -0x1.36p6 -0x1.4p2 +REG esri:32191 3 -0x1.5ep6 0x1.4p2 +REG esri:32191 4 -0x1.36p6 0x1.4p2 +REG esri:32192 0 -0x1.44p6 0x0.0p0 +REG esri:32192 1 -0x1.58p6 -0x1.4p2 +REG esri:32192 2 -0x1.3p6 -0x1.4p2 +REG esri:32192 3 -0x1.58p6 0x1.4p2 +REG esri:32192 4 -0x1.3p6 0x1.4p2 +REG esri:32193 0 -0x1.5p6 0x0.0p0 +REG esri:32193 1 -0x1.64p6 -0x1.4p2 +REG esri:32193 2 -0x1.3cp6 -0x1.4p2 +REG esri:32193 3 -0x1.64p6 0x1.4p2 +REG esri:32193 4 -0x1.3cp6 0x1.4p2 +REG esri:32194 0 -0x1.5cp6 0x0.0p0 +REG esri:32194 1 -0x1.7p6 -0x1.4p2 +REG esri:32194 2 -0x1.48p6 -0x1.4p2 +REG esri:32194 3 -0x1.7p6 0x1.4p2 +REG esri:32194 4 -0x1.48p6 0x1.4p2 +REG esri:32195 0 -0x1.68p6 0x0.0p0 +REG esri:32195 1 -0x1.7cp6 -0x1.4p2 +REG esri:32195 2 -0x1.54p6 -0x1.4p2 +REG esri:32195 3 -0x1.7cp6 0x1.4p2 +REG esri:32195 4 -0x1.54p6 0x1.4p2 +REG esri:32196 0 -0x1.74p6 0x0.0p0 +REG esri:32196 1 -0x1.88p6 -0x1.4p2 +REG esri:32196 2 -0x1.6p6 -0x1.4p2 +REG esri:32196 3 -0x1.88p6 0x1.4p2 +REG esri:32196 4 -0x1.6p6 0x1.4p2 +REG esri:32197 0 -0x1.8p6 0x0.0p0 +REG esri:32197 1 -0x1.94p6 -0x1.4p2 +REG esri:32197 2 -0x1.6cp6 -0x1.4p2 +REG esri:32197 3 -0x1.94p6 0x1.4p2 +REG esri:32197 4 -0x1.6cp6 0x1.4p2 +REG esri:32198 0 -0x1.12p6 0x1.ap5 +REG esri:32198 1 -0x1.7374c68e6ad1ap6 0x1.28p5 +REG esri:32198 2 -0x1.611672e32a5ccp5 0x1.28p5 +REG esri:32198 3 -0x1.7374c68e6ad1ap6 0x1.0cp6 +REG esri:32198 4 -0x1.611672e32a5ccp5 0x1.0cp6 +REG esri:32201 0 -0x1.62p7 0x0.0p0 +REG esri:32201 1 0x1.64p7 -0x1.4p2 +REG esri:32201 2 -0x1.58p7 -0x1.4p2 +REG esri:32201 3 0x1.64p7 0x1.4p2 +REG esri:32201 4 -0x1.58p7 0x1.4p2 +REG esri:32202 0 -0x1.56p7 0x0.0p0 +REG esri:32202 1 -0x1.6p7 -0x1.4p2 +REG esri:32202 2 -0x1.4cp7 -0x1.4p2 +REG esri:32202 3 -0x1.6p7 0x1.4p2 +REG esri:32202 4 -0x1.4cp7 0x1.4p2 +REG esri:32203 0 -0x1.4ap7 0x0.0p0 +REG esri:32203 1 -0x1.54p7 -0x1.4p2 +REG esri:32203 2 -0x1.4p7 -0x1.4p2 +REG esri:32203 3 -0x1.54p7 0x1.4p2 +REG esri:32203 4 -0x1.4p7 0x1.4p2 +REG esri:32204 0 -0x1.3ep7 0x0.0p0 +REG esri:32204 1 -0x1.48p7 -0x1.4p2 +REG esri:32204 2 -0x1.34p7 -0x1.4p2 +REG esri:32204 3 -0x1.48p7 0x1.4p2 +REG esri:32204 4 -0x1.34p7 0x1.4p2 +REG esri:32205 0 -0x1.32p7 0x0.0p0 +REG esri:32205 1 -0x1.3cp7 -0x1.4p2 +REG esri:32205 2 -0x1.28p7 -0x1.4p2 +REG esri:32205 3 -0x1.3cp7 0x1.4p2 +REG esri:32205 4 -0x1.28p7 0x1.4p2 +REG esri:32206 0 -0x1.26p7 0x0.0p0 +REG esri:32206 1 -0x1.3p7 -0x1.4p2 +REG esri:32206 2 -0x1.1cp7 -0x1.4p2 +REG esri:32206 3 -0x1.3p7 0x1.4p2 +REG esri:32206 4 -0x1.1cp7 0x1.4p2 +REG esri:32207 0 -0x1.1ap7 0x0.0p0 +REG esri:32207 1 -0x1.24p7 -0x1.4p2 +REG esri:32207 2 -0x1.1p7 -0x1.4p2 +REG esri:32207 3 -0x1.24p7 0x1.4p2 +REG esri:32207 4 -0x1.1p7 0x1.4p2 +REG esri:32208 0 -0x1.0ep7 0x0.0p0 +REG esri:32208 1 -0x1.18p7 -0x1.4p2 +REG esri:32208 2 -0x1.04p7 -0x1.4p2 +REG esri:32208 3 -0x1.18p7 0x1.4p2 +REG esri:32208 4 -0x1.04p7 0x1.4p2 +REG esri:32209 0 -0x1.02p7 0x0.0p0 +REG esri:32209 1 -0x1.0cp7 -0x1.4p2 +REG esri:32209 2 -0x1.fp6 -0x1.4p2 +REG esri:32209 3 -0x1.0cp7 0x1.4p2 +REG esri:32209 4 -0x1.fp6 0x1.4p2 +REG esri:32210 0 -0x1.ecp6 0x0.0p0 +REG esri:32210 1 -0x1.0p7 -0x1.4p2 +REG esri:32210 2 -0x1.d8p6 -0x1.4p2 +REG esri:32210 3 -0x1.0p7 0x1.4p2 +REG esri:32210 4 -0x1.d8p6 0x1.4p2 +REG esri:32211 0 -0x1.d4p6 0x0.0p0 +REG esri:32211 1 -0x1.e8p6 -0x1.4p2 +REG esri:32211 2 -0x1.cp6 -0x1.4p2 +REG esri:32211 3 -0x1.e8p6 0x1.4p2 +REG esri:32211 4 -0x1.cp6 0x1.4p2 +REG esri:32212 0 -0x1.bcp6 0x0.0p0 +REG esri:32212 1 -0x1.dp6 -0x1.4p2 +REG esri:32212 2 -0x1.a8p6 -0x1.4p2 +REG esri:32212 3 -0x1.dp6 0x1.4p2 +REG esri:32212 4 -0x1.a8p6 0x1.4p2 +REG esri:32213 0 -0x1.a4p6 0x0.0p0 +REG esri:32213 1 -0x1.b8p6 -0x1.4p2 +REG esri:32213 2 -0x1.9p6 -0x1.4p2 +REG esri:32213 3 -0x1.b8p6 0x1.4p2 +REG esri:32213 4 -0x1.9p6 0x1.4p2 +REG esri:32214 0 -0x1.8cp6 0x0.0p0 +REG esri:32214 1 -0x1.ap6 -0x1.4p2 +REG esri:32214 2 -0x1.78p6 -0x1.4p2 +REG esri:32214 3 -0x1.ap6 0x1.4p2 +REG esri:32214 4 -0x1.78p6 0x1.4p2 +REG esri:32215 0 -0x1.74p6 0x0.0p0 +REG esri:32215 1 -0x1.88p6 -0x1.4p2 +REG esri:32215 2 -0x1.6p6 -0x1.4p2 +REG esri:32215 3 -0x1.88p6 0x1.4p2 +REG esri:32215 4 -0x1.6p6 0x1.4p2 +REG esri:32216 0 -0x1.5cp6 0x0.0p0 +REG esri:32216 1 -0x1.7p6 -0x1.4p2 +REG esri:32216 2 -0x1.48p6 -0x1.4p2 +REG esri:32216 3 -0x1.7p6 0x1.4p2 +REG esri:32216 4 -0x1.48p6 0x1.4p2 +REG esri:32217 0 -0x1.44p6 0x0.0p0 +REG esri:32217 1 -0x1.58p6 -0x1.4p2 +REG esri:32217 2 -0x1.3p6 -0x1.4p2 +REG esri:32217 3 -0x1.58p6 0x1.4p2 +REG esri:32217 4 -0x1.3p6 0x1.4p2 +REG esri:32218 0 -0x1.2cp6 0x0.0p0 +REG esri:32218 1 -0x1.4p6 -0x1.4p2 +REG esri:32218 2 -0x1.18p6 -0x1.4p2 +REG esri:32218 3 -0x1.4p6 0x1.4p2 +REG esri:32218 4 -0x1.18p6 0x1.4p2 +REG esri:32219 0 -0x1.14p6 0x0.0p0 +REG esri:32219 1 -0x1.28p6 -0x1.4p2 +REG esri:32219 2 -0x1.0p6 -0x1.4p2 +REG esri:32219 3 -0x1.28p6 0x1.4p2 +REG esri:32219 4 -0x1.0p6 0x1.4p2 +REG esri:32220 0 -0x1.f8p5 0x0.0p0 +REG esri:32220 1 -0x1.1p6 -0x1.4p2 +REG esri:32220 2 -0x1.dp5 -0x1.4p2 +REG esri:32220 3 -0x1.1p6 0x1.4p2 +REG esri:32220 4 -0x1.dp5 0x1.4p2 +REG esri:32221 0 -0x1.c8p5 0x0.0p0 +REG esri:32221 1 -0x1.fp5 -0x1.4p2 +REG esri:32221 2 -0x1.ap5 -0x1.4p2 +REG esri:32221 3 -0x1.fp5 0x1.4p2 +REG esri:32221 4 -0x1.ap5 0x1.4p2 +REG esri:32222 0 -0x1.98p5 0x0.0p0 +REG esri:32222 1 -0x1.cp5 -0x1.4p2 +REG esri:32222 2 -0x1.7p5 -0x1.4p2 +REG esri:32222 3 -0x1.cp5 0x1.4p2 +REG esri:32222 4 -0x1.7p5 0x1.4p2 +REG esri:32223 0 -0x1.68p5 0x0.0p0 +REG esri:32223 1 -0x1.9p5 -0x1.4p2 +REG esri:32223 2 -0x1.4p5 -0x1.4p2 +REG esri:32223 3 -0x1.9p5 0x1.4p2 +REG esri:32223 4 -0x1.4p5 0x1.4p2 +REG esri:32224 0 -0x1.38p5 0x0.0p0 +REG esri:32224 1 -0x1.6p5 -0x1.4p2 +REG esri:32224 2 -0x1.1p5 -0x1.4p2 +REG esri:32224 3 -0x1.6p5 0x1.4p2 +REG esri:32224 4 -0x1.1p5 0x1.4p2 +REG esri:32225 0 -0x1.08p5 0x0.0p0 +REG esri:32225 1 -0x1.3p5 -0x1.4p2 +REG esri:32225 2 -0x1.cp4 -0x1.4p2 +REG esri:32225 3 -0x1.3p5 0x1.4p2 +REG esri:32225 4 -0x1.cp4 0x1.4p2 +REG esri:32226 0 -0x1.bp4 0x0.0p0 +REG esri:32226 1 -0x1.0p5 -0x1.4p2 +REG esri:32226 2 -0x1.6p4 -0x1.4p2 +REG esri:32226 3 -0x1.0p5 0x1.4p2 +REG esri:32226 4 -0x1.6p4 0x1.4p2 +REG esri:32227 0 -0x1.5p4 0x0.0p0 +REG esri:32227 1 -0x1.ap4 -0x1.4p2 +REG esri:32227 2 -0x1.0p4 -0x1.4p2 +REG esri:32227 3 -0x1.ap4 0x1.4p2 +REG esri:32227 4 -0x1.0p4 0x1.4p2 +REG esri:32228 0 -0x1.ep3 0x0.0p0 +REG esri:32228 1 -0x1.4p4 -0x1.4p2 +REG esri:32228 2 -0x1.4p3 -0x1.4p2 +REG esri:32228 3 -0x1.4p4 0x1.4p2 +REG esri:32228 4 -0x1.4p3 0x1.4p2 +REG esri:32229 0 -0x1.2p3 0x0.0p0 +REG esri:32229 1 -0x1.cp3 -0x1.4p2 +REG esri:32229 2 -0x1.0p2 -0x1.4p2 +REG esri:32229 3 -0x1.cp3 0x1.4p2 +REG esri:32229 4 -0x1.0p2 0x1.4p2 +REG esri:32230 0 -0x1.8p1 0x0.0p0 +REG esri:32230 1 -0x1.0p3 -0x1.4p2 +REG esri:32230 2 0x1.0p1 -0x1.4p2 +REG esri:32230 3 -0x1.0p3 0x1.4p2 +REG esri:32230 4 0x1.0p1 0x1.4p2 +REG esri:32231 0 0x1.8p1 0x0.0p0 +REG esri:32231 1 -0x1.0p1 -0x1.4p2 +REG esri:32231 2 0x1.0p3 -0x1.4p2 +REG esri:32231 3 -0x1.0p1 0x1.4p2 +REG esri:32231 4 0x1.0p3 0x1.4p2 +REG esri:32232 0 0x1.2p3 0x0.0p0 +REG esri:32232 1 0x1.0p2 -0x1.4p2 +REG esri:32232 2 0x1.cp3 -0x1.4p2 +REG esri:32232 3 0x1.0p2 0x1.4p2 +REG esri:32232 4 0x1.cp3 0x1.4p2 +REG esri:32233 0 0x1.ep3 0x0.0p0 +REG esri:32233 1 0x1.4p3 -0x1.4p2 +REG esri:32233 2 0x1.4p4 -0x1.4p2 +REG esri:32233 3 0x1.4p3 0x1.4p2 +REG esri:32233 4 0x1.4p4 0x1.4p2 +REG esri:32234 0 0x1.5p4 0x0.0p0 +REG esri:32234 1 0x1.0p4 -0x1.4p2 +REG esri:32234 2 0x1.ap4 -0x1.4p2 +REG esri:32234 3 0x1.0p4 0x1.4p2 +REG esri:32234 4 0x1.ap4 0x1.4p2 +REG esri:32235 0 0x1.bp4 0x0.0p0 +REG esri:32235 1 0x1.6p4 -0x1.4p2 +REG esri:32235 2 0x1.0p5 -0x1.4p2 +REG esri:32235 3 0x1.6p4 0x1.4p2 +REG esri:32235 4 0x1.0p5 0x1.4p2 +REG esri:32236 0 0x1.08p5 0x0.0p0 +REG esri:32236 1 0x1.cp4 -0x1.4p2 +REG esri:32236 2 0x1.3p5 -0x1.4p2 +REG esri:32236 3 0x1.cp4 0x1.4p2 +REG esri:32236 4 0x1.3p5 0x1.4p2 +REG esri:32237 0 0x1.38p5 0x0.0p0 +REG esri:32237 1 0x1.1p5 -0x1.4p2 +REG esri:32237 2 0x1.6p5 -0x1.4p2 +REG esri:32237 3 0x1.1p5 0x1.4p2 +REG esri:32237 4 0x1.6p5 0x1.4p2 +REG esri:32238 0 0x1.68p5 0x0.0p0 +REG esri:32238 1 0x1.4p5 -0x1.4p2 +REG esri:32238 2 0x1.9p5 -0x1.4p2 +REG esri:32238 3 0x1.4p5 0x1.4p2 +REG esri:32238 4 0x1.9p5 0x1.4p2 +REG esri:32239 0 0x1.98p5 0x0.0p0 +REG esri:32239 1 0x1.7p5 -0x1.4p2 +REG esri:32239 2 0x1.cp5 -0x1.4p2 +REG esri:32239 3 0x1.7p5 0x1.4p2 +REG esri:32239 4 0x1.cp5 0x1.4p2 +REG esri:32240 0 0x1.c8p5 0x0.0p0 +REG esri:32240 1 0x1.ap5 -0x1.4p2 +REG esri:32240 2 0x1.fp5 -0x1.4p2 +REG esri:32240 3 0x1.ap5 0x1.4p2 +REG esri:32240 4 0x1.fp5 0x1.4p2 +REG esri:32241 0 0x1.f8p5 0x0.0p0 +REG esri:32241 1 0x1.dp5 -0x1.4p2 +REG esri:32241 2 0x1.1p6 -0x1.4p2 +REG esri:32241 3 0x1.dp5 0x1.4p2 +REG esri:32241 4 0x1.1p6 0x1.4p2 +REG esri:32242 0 0x1.14p6 0x0.0p0 +REG esri:32242 1 0x1.0p6 -0x1.4p2 +REG esri:32242 2 0x1.28p6 -0x1.4p2 +REG esri:32242 3 0x1.0p6 0x1.4p2 +REG esri:32242 4 0x1.28p6 0x1.4p2 +REG esri:32243 0 0x1.2cp6 0x0.0p0 +REG esri:32243 1 0x1.18p6 -0x1.4p2 +REG esri:32243 2 0x1.4p6 -0x1.4p2 +REG esri:32243 3 0x1.18p6 0x1.4p2 +REG esri:32243 4 0x1.4p6 0x1.4p2 +REG esri:32244 0 0x1.44p6 0x0.0p0 +REG esri:32244 1 0x1.3p6 -0x1.4p2 +REG esri:32244 2 0x1.58p6 -0x1.4p2 +REG esri:32244 3 0x1.3p6 0x1.4p2 +REG esri:32244 4 0x1.58p6 0x1.4p2 +REG esri:32245 0 0x1.5cp6 0x0.0p0 +REG esri:32245 1 0x1.48p6 -0x1.4p2 +REG esri:32245 2 0x1.7p6 -0x1.4p2 +REG esri:32245 3 0x1.48p6 0x1.4p2 +REG esri:32245 4 0x1.7p6 0x1.4p2 +REG esri:32246 0 0x1.74p6 0x0.0p0 +REG esri:32246 1 0x1.6p6 -0x1.4p2 +REG esri:32246 2 0x1.88p6 -0x1.4p2 +REG esri:32246 3 0x1.6p6 0x1.4p2 +REG esri:32246 4 0x1.88p6 0x1.4p2 +REG esri:32247 0 0x1.8cp6 0x0.0p0 +REG esri:32247 1 0x1.78p6 -0x1.4p2 +REG esri:32247 2 0x1.ap6 -0x1.4p2 +REG esri:32247 3 0x1.78p6 0x1.4p2 +REG esri:32247 4 0x1.ap6 0x1.4p2 +REG esri:32248 0 0x1.a4p6 0x0.0p0 +REG esri:32248 1 0x1.9p6 -0x1.4p2 +REG esri:32248 2 0x1.b8p6 -0x1.4p2 +REG esri:32248 3 0x1.9p6 0x1.4p2 +REG esri:32248 4 0x1.b8p6 0x1.4p2 +REG esri:32249 0 0x1.bcp6 0x0.0p0 +REG esri:32249 1 0x1.a8p6 -0x1.4p2 +REG esri:32249 2 0x1.dp6 -0x1.4p2 +REG esri:32249 3 0x1.a8p6 0x1.4p2 +REG esri:32249 4 0x1.dp6 0x1.4p2 +REG esri:32250 0 0x1.d4p6 0x0.0p0 +REG esri:32250 1 0x1.cp6 -0x1.4p2 +REG esri:32250 2 0x1.e8p6 -0x1.4p2 +REG esri:32250 3 0x1.cp6 0x1.4p2 +REG esri:32250 4 0x1.e8p6 0x1.4p2 +REG esri:32251 0 0x1.ecp6 0x0.0p0 +REG esri:32251 1 0x1.d8p6 -0x1.4p2 +REG esri:32251 2 0x1.0p7 -0x1.4p2 +REG esri:32251 3 0x1.d8p6 0x1.4p2 +REG esri:32251 4 0x1.0p7 0x1.4p2 +REG esri:32252 0 0x1.02p7 0x0.0p0 +REG esri:32252 1 0x1.fp6 -0x1.4p2 +REG esri:32252 2 0x1.0cp7 -0x1.4p2 +REG esri:32252 3 0x1.fp6 0x1.4p2 +REG esri:32252 4 0x1.0cp7 0x1.4p2 +REG esri:32253 0 0x1.0ep7 0x0.0p0 +REG esri:32253 1 0x1.04p7 -0x1.4p2 +REG esri:32253 2 0x1.18p7 -0x1.4p2 +REG esri:32253 3 0x1.04p7 0x1.4p2 +REG esri:32253 4 0x1.18p7 0x1.4p2 +REG esri:32254 0 0x1.1ap7 0x0.0p0 +REG esri:32254 1 0x1.1p7 -0x1.4p2 +REG esri:32254 2 0x1.24p7 -0x1.4p2 +REG esri:32254 3 0x1.1p7 0x1.4p2 +REG esri:32254 4 0x1.24p7 0x1.4p2 +REG esri:32255 0 0x1.26p7 0x0.0p0 +REG esri:32255 1 0x1.1cp7 -0x1.4p2 +REG esri:32255 2 0x1.3p7 -0x1.4p2 +REG esri:32255 3 0x1.1cp7 0x1.4p2 +REG esri:32255 4 0x1.3p7 0x1.4p2 +REG esri:32256 0 0x1.32p7 0x0.0p0 +REG esri:32256 1 0x1.28p7 -0x1.4p2 +REG esri:32256 2 0x1.3cp7 -0x1.4p2 +REG esri:32256 3 0x1.28p7 0x1.4p2 +REG esri:32256 4 0x1.3cp7 0x1.4p2 +REG esri:32257 0 0x1.3ep7 0x0.0p0 +REG esri:32257 1 0x1.34p7 -0x1.4p2 +REG esri:32257 2 0x1.48p7 -0x1.4p2 +REG esri:32257 3 0x1.34p7 0x1.4p2 +REG esri:32257 4 0x1.48p7 0x1.4p2 +REG esri:32258 0 0x1.4ap7 0x0.0p0 +REG esri:32258 1 0x1.4p7 -0x1.4p2 +REG esri:32258 2 0x1.54p7 -0x1.4p2 +REG esri:32258 3 0x1.4p7 0x1.4p2 +REG esri:32258 4 0x1.54p7 0x1.4p2 +REG esri:32259 0 0x1.56p7 0x0.0p0 +REG esri:32259 1 0x1.4cp7 -0x1.4p2 +REG esri:32259 2 0x1.6p7 -0x1.4p2 +REG esri:32259 3 0x1.4cp7 0x1.4p2 +REG esri:32259 4 0x1.6p7 0x1.4p2 +REG esri:32260 0 0x1.62p7 0x0.0p0 +REG esri:32260 1 0x1.58p7 -0x1.4p2 +REG esri:32260 2 -0x1.64p7 -0x1.4p2 +REG esri:32260 3 0x1.58p7 0x1.4p2 +REG esri:32260 4 -0x1.64p7 0x1.4p2 +REG esri:32301 0 -0x1.62p7 -0x1.9p4 +REG esri:32301 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:32301 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:32301 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:32301 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:32302 0 -0x1.56p7 -0x1.9p4 +REG esri:32302 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:32302 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:32302 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:32302 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:32303 0 -0x1.4ap7 -0x1.9p4 +REG esri:32303 1 -0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:32303 2 -0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:32303 3 -0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:32303 4 -0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:32304 0 -0x1.3ep7 -0x1.9p4 +REG esri:32304 1 -0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:32304 2 -0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:32304 3 -0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:32304 4 -0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:32305 0 -0x1.32p7 -0x1.9p4 +REG esri:32305 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:32305 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:32305 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:32305 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:32306 0 -0x1.26p7 -0x1.9p4 +REG esri:32306 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:32306 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:32306 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:32306 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:32307 0 -0x1.1ap7 -0x1.9p4 +REG esri:32307 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:32307 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:32307 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:32307 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:32308 0 -0x1.0ep7 -0x1.9p4 +REG esri:32308 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:32308 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:32308 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:32308 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:32309 0 -0x1.02p7 -0x1.9p4 +REG esri:32309 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:32309 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:32309 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:32309 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:32310 0 -0x1.ecp6 -0x1.9p4 +REG esri:32310 1 -0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:32310 2 -0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32310 3 -0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:32310 4 -0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32311 0 -0x1.d4p6 -0x1.9p4 +REG esri:32311 1 -0x1.ea114b818572ep6 -0x1.ep4 +REG esri:32311 2 -0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:32311 3 -0x1.ea114b818572ep6 -0x1.4p4 +REG esri:32311 4 -0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:32312 0 -0x1.bcp6 -0x1.9p4 +REG esri:32312 1 -0x1.d2114b818572ep6 -0x1.ep4 +REG esri:32312 2 -0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32312 3 -0x1.d2114b818572ep6 -0x1.4p4 +REG esri:32312 4 -0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32313 0 -0x1.a4p6 -0x1.9p4 +REG esri:32313 1 -0x1.ba114b818572ep6 -0x1.ep4 +REG esri:32313 2 -0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:32313 3 -0x1.ba114b818572ep6 -0x1.4p4 +REG esri:32313 4 -0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:32314 0 -0x1.8cp6 -0x1.9p4 +REG esri:32314 1 -0x1.a2114b818572ep6 -0x1.ep4 +REG esri:32314 2 -0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:32314 3 -0x1.a2114b818572ep6 -0x1.4p4 +REG esri:32314 4 -0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:32315 0 -0x1.74p6 -0x1.9p4 +REG esri:32315 1 -0x1.8a114b818572ep6 -0x1.ep4 +REG esri:32315 2 -0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:32315 3 -0x1.8a114b818572ep6 -0x1.4p4 +REG esri:32315 4 -0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:32316 0 -0x1.5cp6 -0x1.9p4 +REG esri:32316 1 -0x1.72114b818572ep6 -0x1.ep4 +REG esri:32316 2 -0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG esri:32316 3 -0x1.72114b818572ep6 -0x1.4p4 +REG esri:32316 4 -0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG esri:32317 0 -0x1.44p6 -0x1.9p4 +REG esri:32317 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG esri:32317 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:32317 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG esri:32317 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:32318 0 -0x1.2cp6 -0x1.9p4 +REG esri:32318 1 -0x1.42114b818572ep6 -0x1.ep4 +REG esri:32318 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:32318 3 -0x1.42114b818572ep6 -0x1.4p4 +REG esri:32318 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:32319 0 -0x1.14p6 -0x1.9p4 +REG esri:32319 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:32319 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:32319 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:32319 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:32320 0 -0x1.f8p5 -0x1.9p4 +REG esri:32320 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:32320 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:32320 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:32320 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:32321 0 -0x1.c8p5 -0x1.9p4 +REG esri:32321 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:32321 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:32321 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:32321 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:32322 0 -0x1.98p5 -0x1.9p4 +REG esri:32322 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:32322 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:32322 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:32322 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:32323 0 -0x1.68p5 -0x1.9p4 +REG esri:32323 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:32323 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:32323 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:32323 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:32324 0 -0x1.38p5 -0x1.9p4 +REG esri:32324 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:32324 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:32324 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:32324 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:32325 0 -0x1.08p5 -0x1.9p4 +REG esri:32325 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32325 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32325 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32325 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32326 0 -0x1.bp4 -0x1.9p4 +REG esri:32326 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG esri:32326 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:32326 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG esri:32326 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:32327 0 -0x1.5p4 -0x1.9p4 +REG esri:32327 1 -0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:32327 2 -0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:32327 3 -0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:32327 4 -0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:32328 0 -0x1.ep3 -0x1.9p4 +REG esri:32328 1 -0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:32328 2 -0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:32328 3 -0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:32328 4 -0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:32329 0 -0x1.2p3 -0x1.9p4 +REG esri:32329 1 -0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:32329 2 -0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:32329 3 -0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:32329 4 -0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:32330 0 -0x1.8p1 -0x1.9p4 +REG esri:32330 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG esri:32330 2 0x1.42297030ae5cap1 -0x1.ep4 +REG esri:32330 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG esri:32330 4 0x1.42297030ae5cap1 -0x1.4p4 +REG esri:32331 0 0x1.8p1 -0x1.9p4 +REG esri:32331 1 -0x1.42297030ae5cap1 -0x1.ep4 +REG esri:32331 2 0x1.108a5c0c2b972p3 -0x1.ep4 +REG esri:32331 3 -0x1.42297030ae5cap1 -0x1.4p4 +REG esri:32331 4 0x1.108a5c0c2b972p3 -0x1.4p4 +REG esri:32332 0 0x1.2p3 -0x1.9p4 +REG esri:32332 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:32332 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:32332 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:32332 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:32333 0 0x1.ep3 -0x1.9p4 +REG esri:32333 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:32333 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:32333 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:32333 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:32334 0 0x1.5p4 -0x1.9p4 +REG esri:32334 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:32334 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:32334 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:32334 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:32335 0 0x1.bp4 -0x1.9p4 +REG esri:32335 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:32335 2 0x1.042297030ae5dp5 -0x1.ep4 +REG esri:32335 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:32335 4 0x1.042297030ae5dp5 -0x1.4p4 +REG esri:32336 0 0x1.08p5 -0x1.9p4 +REG esri:32336 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32336 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32336 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32336 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32337 0 0x1.38p5 -0x1.9p4 +REG esri:32337 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:32337 2 0x1.642297030ae5dp5 -0x1.ep4 +REG esri:32337 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:32337 4 0x1.642297030ae5dp5 -0x1.4p4 +REG esri:32338 0 0x1.68p5 -0x1.9p4 +REG esri:32338 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:32338 2 0x1.942297030ae5dp5 -0x1.ep4 +REG esri:32338 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:32338 4 0x1.942297030ae5dp5 -0x1.4p4 +REG esri:32339 0 0x1.98p5 -0x1.9p4 +REG esri:32339 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:32339 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:32339 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:32339 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:32340 0 0x1.c8p5 -0x1.9p4 +REG esri:32340 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:32340 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:32340 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:32340 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:32341 0 0x1.f8p5 -0x1.9p4 +REG esri:32341 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:32341 2 0x1.12114b818572ep6 -0x1.ep4 +REG esri:32341 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:32341 4 0x1.12114b818572ep6 -0x1.4p4 +REG esri:32342 0 0x1.14p6 -0x1.9p4 +REG esri:32342 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:32342 2 0x1.2a114b818572ep6 -0x1.ep4 +REG esri:32342 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:32342 4 0x1.2a114b818572ep6 -0x1.4p4 +REG esri:32343 0 0x1.2cp6 -0x1.9p4 +REG esri:32343 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:32343 2 0x1.42114b818572ep6 -0x1.ep4 +REG esri:32343 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:32343 4 0x1.42114b818572ep6 -0x1.4p4 +REG esri:32344 0 0x1.44p6 -0x1.9p4 +REG esri:32344 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:32344 2 0x1.5a114b818572ep6 -0x1.ep4 +REG esri:32344 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:32344 4 0x1.5a114b818572ep6 -0x1.4p4 +REG esri:32345 0 0x1.5cp6 -0x1.9p4 +REG esri:32345 1 0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG esri:32345 2 0x1.72114b818572ep6 -0x1.ep4 +REG esri:32345 3 0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG esri:32345 4 0x1.72114b818572ep6 -0x1.4p4 +REG esri:32346 0 0x1.74p6 -0x1.9p4 +REG esri:32346 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:32346 2 0x1.8a114b818572ep6 -0x1.ep4 +REG esri:32346 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:32346 4 0x1.8a114b818572ep6 -0x1.4p4 +REG esri:32347 0 0x1.8cp6 -0x1.9p4 +REG esri:32347 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:32347 2 0x1.a2114b818572ep6 -0x1.ep4 +REG esri:32347 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:32347 4 0x1.a2114b818572ep6 -0x1.4p4 +REG esri:32348 0 0x1.a4p6 -0x1.9p4 +REG esri:32348 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:32348 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:32348 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:32348 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:32349 0 0x1.bcp6 -0x1.9p4 +REG esri:32349 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32349 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:32349 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32349 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:32350 0 0x1.d4p6 -0x1.9p4 +REG esri:32350 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:32350 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:32350 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:32350 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:32351 0 0x1.ecp6 -0x1.9p4 +REG esri:32351 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32351 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:32351 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32351 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:32352 0 0x1.02p7 -0x1.9p4 +REG esri:32352 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:32352 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:32352 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:32352 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:32353 0 0x1.0ep7 -0x1.9p4 +REG esri:32353 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:32353 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:32353 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:32353 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:32354 0 0x1.1ap7 -0x1.9p4 +REG esri:32354 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:32354 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:32354 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:32354 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:32355 0 0x1.26p7 -0x1.9p4 +REG esri:32355 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:32355 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:32355 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:32355 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:32356 0 0x1.32p7 -0x1.9p4 +REG esri:32356 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:32356 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:32356 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:32356 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:32357 0 0x1.3ep7 -0x1.9p4 +REG esri:32357 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:32357 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:32357 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:32357 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:32358 0 0x1.4ap7 -0x1.9p4 +REG esri:32358 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:32358 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:32358 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:32358 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:32359 0 0x1.56p7 -0x1.9p4 +REG esri:32359 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:32359 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:32359 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:32359 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:32360 0 0x1.62p7 -0x1.9p4 +REG esri:32360 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:32360 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:32360 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:32360 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:32401 0 -0x1.62p7 0x0.0p0 +REG esri:32401 1 0x1.64p7 -0x1.4p2 +REG esri:32401 2 -0x1.58p7 -0x1.4p2 +REG esri:32401 3 0x1.64p7 0x1.4p2 +REG esri:32401 4 -0x1.58p7 0x1.4p2 +REG esri:32402 0 -0x1.56p7 0x0.0p0 +REG esri:32402 1 -0x1.6p7 -0x1.4p2 +REG esri:32402 2 -0x1.4cp7 -0x1.4p2 +REG esri:32402 3 -0x1.6p7 0x1.4p2 +REG esri:32402 4 -0x1.4cp7 0x1.4p2 +REG esri:32403 0 -0x1.4ap7 0x0.0p0 +REG esri:32403 1 -0x1.54p7 -0x1.4p2 +REG esri:32403 2 -0x1.4p7 -0x1.4p2 +REG esri:32403 3 -0x1.54p7 0x1.4p2 +REG esri:32403 4 -0x1.4p7 0x1.4p2 +REG esri:32404 0 -0x1.3ep7 0x0.0p0 +REG esri:32404 1 -0x1.48p7 -0x1.4p2 +REG esri:32404 2 -0x1.34p7 -0x1.4p2 +REG esri:32404 3 -0x1.48p7 0x1.4p2 +REG esri:32404 4 -0x1.34p7 0x1.4p2 +REG esri:32405 0 -0x1.32p7 0x0.0p0 +REG esri:32405 1 -0x1.3cp7 -0x1.4p2 +REG esri:32405 2 -0x1.28p7 -0x1.4p2 +REG esri:32405 3 -0x1.3cp7 0x1.4p2 +REG esri:32405 4 -0x1.28p7 0x1.4p2 +REG esri:32406 0 -0x1.26p7 0x0.0p0 +REG esri:32406 1 -0x1.3p7 -0x1.4p2 +REG esri:32406 2 -0x1.1cp7 -0x1.4p2 +REG esri:32406 3 -0x1.3p7 0x1.4p2 +REG esri:32406 4 -0x1.1cp7 0x1.4p2 +REG esri:32407 0 -0x1.1ap7 0x0.0p0 +REG esri:32407 1 -0x1.24p7 -0x1.4p2 +REG esri:32407 2 -0x1.1p7 -0x1.4p2 +REG esri:32407 3 -0x1.24p7 0x1.4p2 +REG esri:32407 4 -0x1.1p7 0x1.4p2 +REG esri:32408 0 -0x1.0ep7 0x0.0p0 +REG esri:32408 1 -0x1.18p7 -0x1.4p2 +REG esri:32408 2 -0x1.04p7 -0x1.4p2 +REG esri:32408 3 -0x1.18p7 0x1.4p2 +REG esri:32408 4 -0x1.04p7 0x1.4p2 +REG esri:32409 0 -0x1.02p7 0x0.0p0 +REG esri:32409 1 -0x1.0cp7 -0x1.4p2 +REG esri:32409 2 -0x1.fp6 -0x1.4p2 +REG esri:32409 3 -0x1.0cp7 0x1.4p2 +REG esri:32409 4 -0x1.fp6 0x1.4p2 +REG esri:32410 0 -0x1.ecp6 0x0.0p0 +REG esri:32410 1 -0x1.0p7 -0x1.4p2 +REG esri:32410 2 -0x1.d8p6 -0x1.4p2 +REG esri:32410 3 -0x1.0p7 0x1.4p2 +REG esri:32410 4 -0x1.d8p6 0x1.4p2 +REG esri:32411 0 -0x1.d4p6 0x0.0p0 +REG esri:32411 1 -0x1.e8p6 -0x1.4p2 +REG esri:32411 2 -0x1.cp6 -0x1.4p2 +REG esri:32411 3 -0x1.e8p6 0x1.4p2 +REG esri:32411 4 -0x1.cp6 0x1.4p2 +REG esri:32412 0 -0x1.bcp6 0x0.0p0 +REG esri:32412 1 -0x1.dp6 -0x1.4p2 +REG esri:32412 2 -0x1.a8p6 -0x1.4p2 +REG esri:32412 3 -0x1.dp6 0x1.4p2 +REG esri:32412 4 -0x1.a8p6 0x1.4p2 +REG esri:32413 0 -0x1.a4p6 0x0.0p0 +REG esri:32413 1 -0x1.b8p6 -0x1.4p2 +REG esri:32413 2 -0x1.9p6 -0x1.4p2 +REG esri:32413 3 -0x1.b8p6 0x1.4p2 +REG esri:32413 4 -0x1.9p6 0x1.4p2 +REG esri:32414 0 -0x1.8cp6 0x0.0p0 +REG esri:32414 1 -0x1.ap6 -0x1.4p2 +REG esri:32414 2 -0x1.78p6 -0x1.4p2 +REG esri:32414 3 -0x1.ap6 0x1.4p2 +REG esri:32414 4 -0x1.78p6 0x1.4p2 +REG esri:32415 0 -0x1.74p6 0x0.0p0 +REG esri:32415 1 -0x1.88p6 -0x1.4p2 +REG esri:32415 2 -0x1.6p6 -0x1.4p2 +REG esri:32415 3 -0x1.88p6 0x1.4p2 +REG esri:32415 4 -0x1.6p6 0x1.4p2 +REG esri:32416 0 -0x1.5cp6 0x0.0p0 +REG esri:32416 1 -0x1.7p6 -0x1.4p2 +REG esri:32416 2 -0x1.48p6 -0x1.4p2 +REG esri:32416 3 -0x1.7p6 0x1.4p2 +REG esri:32416 4 -0x1.48p6 0x1.4p2 +REG esri:32417 0 -0x1.44p6 0x0.0p0 +REG esri:32417 1 -0x1.58p6 -0x1.4p2 +REG esri:32417 2 -0x1.3p6 -0x1.4p2 +REG esri:32417 3 -0x1.58p6 0x1.4p2 +REG esri:32417 4 -0x1.3p6 0x1.4p2 +REG esri:32418 0 -0x1.2cp6 0x0.0p0 +REG esri:32418 1 -0x1.4p6 -0x1.4p2 +REG esri:32418 2 -0x1.18p6 -0x1.4p2 +REG esri:32418 3 -0x1.4p6 0x1.4p2 +REG esri:32418 4 -0x1.18p6 0x1.4p2 +REG esri:32419 0 -0x1.14p6 0x0.0p0 +REG esri:32419 1 -0x1.28p6 -0x1.4p2 +REG esri:32419 2 -0x1.0p6 -0x1.4p2 +REG esri:32419 3 -0x1.28p6 0x1.4p2 +REG esri:32419 4 -0x1.0p6 0x1.4p2 +REG esri:32420 0 -0x1.f8p5 0x0.0p0 +REG esri:32420 1 -0x1.1p6 -0x1.4p2 +REG esri:32420 2 -0x1.dp5 -0x1.4p2 +REG esri:32420 3 -0x1.1p6 0x1.4p2 +REG esri:32420 4 -0x1.dp5 0x1.4p2 +REG esri:32421 0 -0x1.c8p5 0x0.0p0 +REG esri:32421 1 -0x1.fp5 -0x1.4p2 +REG esri:32421 2 -0x1.ap5 -0x1.4p2 +REG esri:32421 3 -0x1.fp5 0x1.4p2 +REG esri:32421 4 -0x1.ap5 0x1.4p2 +REG esri:32422 0 -0x1.98p5 0x0.0p0 +REG esri:32422 1 -0x1.cp5 -0x1.4p2 +REG esri:32422 2 -0x1.7p5 -0x1.4p2 +REG esri:32422 3 -0x1.cp5 0x1.4p2 +REG esri:32422 4 -0x1.7p5 0x1.4p2 +REG esri:32423 0 -0x1.68p5 0x0.0p0 +REG esri:32423 1 -0x1.9p5 -0x1.4p2 +REG esri:32423 2 -0x1.4p5 -0x1.4p2 +REG esri:32423 3 -0x1.9p5 0x1.4p2 +REG esri:32423 4 -0x1.4p5 0x1.4p2 +REG esri:32424 0 -0x1.38p5 0x0.0p0 +REG esri:32424 1 -0x1.6p5 -0x1.4p2 +REG esri:32424 2 -0x1.1p5 -0x1.4p2 +REG esri:32424 3 -0x1.6p5 0x1.4p2 +REG esri:32424 4 -0x1.1p5 0x1.4p2 +REG esri:32425 0 -0x1.08p5 0x0.0p0 +REG esri:32425 1 -0x1.3p5 -0x1.4p2 +REG esri:32425 2 -0x1.cp4 -0x1.4p2 +REG esri:32425 3 -0x1.3p5 0x1.4p2 +REG esri:32425 4 -0x1.cp4 0x1.4p2 +REG esri:32426 0 -0x1.bp4 0x0.0p0 +REG esri:32426 1 -0x1.0p5 -0x1.4p2 +REG esri:32426 2 -0x1.6p4 -0x1.4p2 +REG esri:32426 3 -0x1.0p5 0x1.4p2 +REG esri:32426 4 -0x1.6p4 0x1.4p2 +REG esri:32427 0 -0x1.5p4 0x0.0p0 +REG esri:32427 1 -0x1.ap4 -0x1.4p2 +REG esri:32427 2 -0x1.0p4 -0x1.4p2 +REG esri:32427 3 -0x1.ap4 0x1.4p2 +REG esri:32427 4 -0x1.0p4 0x1.4p2 +REG esri:32428 0 -0x1.ep3 0x0.0p0 +REG esri:32428 1 -0x1.4p4 -0x1.4p2 +REG esri:32428 2 -0x1.4p3 -0x1.4p2 +REG esri:32428 3 -0x1.4p4 0x1.4p2 +REG esri:32428 4 -0x1.4p3 0x1.4p2 +REG esri:32429 0 -0x1.2p3 0x0.0p0 +REG esri:32429 1 -0x1.cp3 -0x1.4p2 +REG esri:32429 2 -0x1.0p2 -0x1.4p2 +REG esri:32429 3 -0x1.cp3 0x1.4p2 +REG esri:32429 4 -0x1.0p2 0x1.4p2 +REG esri:32430 0 -0x1.8p1 0x0.0p0 +REG esri:32430 1 -0x1.0p3 -0x1.4p2 +REG esri:32430 2 0x1.0p1 -0x1.4p2 +REG esri:32430 3 -0x1.0p3 0x1.4p2 +REG esri:32430 4 0x1.0p1 0x1.4p2 +REG esri:32431 0 0x1.8p1 0x0.0p0 +REG esri:32431 1 -0x1.0p1 -0x1.4p2 +REG esri:32431 2 0x1.0p3 -0x1.4p2 +REG esri:32431 3 -0x1.0p1 0x1.4p2 +REG esri:32431 4 0x1.0p3 0x1.4p2 +REG esri:32432 0 0x1.2p3 0x0.0p0 +REG esri:32432 1 0x1.0p2 -0x1.4p2 +REG esri:32432 2 0x1.cp3 -0x1.4p2 +REG esri:32432 3 0x1.0p2 0x1.4p2 +REG esri:32432 4 0x1.cp3 0x1.4p2 +REG esri:32433 0 0x1.ep3 0x0.0p0 +REG esri:32433 1 0x1.4p3 -0x1.4p2 +REG esri:32433 2 0x1.4p4 -0x1.4p2 +REG esri:32433 3 0x1.4p3 0x1.4p2 +REG esri:32433 4 0x1.4p4 0x1.4p2 +REG esri:32434 0 0x1.5p4 0x0.0p0 +REG esri:32434 1 0x1.0p4 -0x1.4p2 +REG esri:32434 2 0x1.ap4 -0x1.4p2 +REG esri:32434 3 0x1.0p4 0x1.4p2 +REG esri:32434 4 0x1.ap4 0x1.4p2 +REG esri:32435 0 0x1.bp4 0x0.0p0 +REG esri:32435 1 0x1.6p4 -0x1.4p2 +REG esri:32435 2 0x1.0p5 -0x1.4p2 +REG esri:32435 3 0x1.6p4 0x1.4p2 +REG esri:32435 4 0x1.0p5 0x1.4p2 +REG esri:32436 0 0x1.08p5 0x0.0p0 +REG esri:32436 1 0x1.cp4 -0x1.4p2 +REG esri:32436 2 0x1.3p5 -0x1.4p2 +REG esri:32436 3 0x1.cp4 0x1.4p2 +REG esri:32436 4 0x1.3p5 0x1.4p2 +REG esri:32437 0 0x1.38p5 0x0.0p0 +REG esri:32437 1 0x1.1p5 -0x1.4p2 +REG esri:32437 2 0x1.6p5 -0x1.4p2 +REG esri:32437 3 0x1.1p5 0x1.4p2 +REG esri:32437 4 0x1.6p5 0x1.4p2 +REG esri:32438 0 0x1.68p5 0x0.0p0 +REG esri:32438 1 0x1.4p5 -0x1.4p2 +REG esri:32438 2 0x1.9p5 -0x1.4p2 +REG esri:32438 3 0x1.4p5 0x1.4p2 +REG esri:32438 4 0x1.9p5 0x1.4p2 +REG esri:32439 0 0x1.98p5 0x0.0p0 +REG esri:32439 1 0x1.7p5 -0x1.4p2 +REG esri:32439 2 0x1.cp5 -0x1.4p2 +REG esri:32439 3 0x1.7p5 0x1.4p2 +REG esri:32439 4 0x1.cp5 0x1.4p2 +REG esri:32440 0 0x1.c8p5 0x0.0p0 +REG esri:32440 1 0x1.ap5 -0x1.4p2 +REG esri:32440 2 0x1.fp5 -0x1.4p2 +REG esri:32440 3 0x1.ap5 0x1.4p2 +REG esri:32440 4 0x1.fp5 0x1.4p2 +REG esri:32441 0 0x1.f8p5 0x0.0p0 +REG esri:32441 1 0x1.dp5 -0x1.4p2 +REG esri:32441 2 0x1.1p6 -0x1.4p2 +REG esri:32441 3 0x1.dp5 0x1.4p2 +REG esri:32441 4 0x1.1p6 0x1.4p2 +REG esri:32442 0 0x1.14p6 0x0.0p0 +REG esri:32442 1 0x1.0p6 -0x1.4p2 +REG esri:32442 2 0x1.28p6 -0x1.4p2 +REG esri:32442 3 0x1.0p6 0x1.4p2 +REG esri:32442 4 0x1.28p6 0x1.4p2 +REG esri:32443 0 0x1.2cp6 0x0.0p0 +REG esri:32443 1 0x1.18p6 -0x1.4p2 +REG esri:32443 2 0x1.4p6 -0x1.4p2 +REG esri:32443 3 0x1.18p6 0x1.4p2 +REG esri:32443 4 0x1.4p6 0x1.4p2 +REG esri:32444 0 0x1.44p6 0x0.0p0 +REG esri:32444 1 0x1.3p6 -0x1.4p2 +REG esri:32444 2 0x1.58p6 -0x1.4p2 +REG esri:32444 3 0x1.3p6 0x1.4p2 +REG esri:32444 4 0x1.58p6 0x1.4p2 +REG esri:32445 0 0x1.5cp6 0x0.0p0 +REG esri:32445 1 0x1.48p6 -0x1.4p2 +REG esri:32445 2 0x1.7p6 -0x1.4p2 +REG esri:32445 3 0x1.48p6 0x1.4p2 +REG esri:32445 4 0x1.7p6 0x1.4p2 +REG esri:32446 0 0x1.74p6 0x0.0p0 +REG esri:32446 1 0x1.6p6 -0x1.4p2 +REG esri:32446 2 0x1.88p6 -0x1.4p2 +REG esri:32446 3 0x1.6p6 0x1.4p2 +REG esri:32446 4 0x1.88p6 0x1.4p2 +REG esri:32447 0 0x1.8cp6 0x0.0p0 +REG esri:32447 1 0x1.78p6 -0x1.4p2 +REG esri:32447 2 0x1.ap6 -0x1.4p2 +REG esri:32447 3 0x1.78p6 0x1.4p2 +REG esri:32447 4 0x1.ap6 0x1.4p2 +REG esri:32448 0 0x1.a4p6 0x0.0p0 +REG esri:32448 1 0x1.9p6 -0x1.4p2 +REG esri:32448 2 0x1.b8p6 -0x1.4p2 +REG esri:32448 3 0x1.9p6 0x1.4p2 +REG esri:32448 4 0x1.b8p6 0x1.4p2 +REG esri:32449 0 0x1.bcp6 0x0.0p0 +REG esri:32449 1 0x1.a8p6 -0x1.4p2 +REG esri:32449 2 0x1.dp6 -0x1.4p2 +REG esri:32449 3 0x1.a8p6 0x1.4p2 +REG esri:32449 4 0x1.dp6 0x1.4p2 +REG esri:32450 0 0x1.d4p6 0x0.0p0 +REG esri:32450 1 0x1.cp6 -0x1.4p2 +REG esri:32450 2 0x1.e8p6 -0x1.4p2 +REG esri:32450 3 0x1.cp6 0x1.4p2 +REG esri:32450 4 0x1.e8p6 0x1.4p2 +REG esri:32451 0 0x1.ecp6 0x0.0p0 +REG esri:32451 1 0x1.d8p6 -0x1.4p2 +REG esri:32451 2 0x1.0p7 -0x1.4p2 +REG esri:32451 3 0x1.d8p6 0x1.4p2 +REG esri:32451 4 0x1.0p7 0x1.4p2 +REG esri:32452 0 0x1.02p7 0x0.0p0 +REG esri:32452 1 0x1.fp6 -0x1.4p2 +REG esri:32452 2 0x1.0cp7 -0x1.4p2 +REG esri:32452 3 0x1.fp6 0x1.4p2 +REG esri:32452 4 0x1.0cp7 0x1.4p2 +REG esri:32453 0 0x1.0ep7 0x0.0p0 +REG esri:32453 1 0x1.04p7 -0x1.4p2 +REG esri:32453 2 0x1.18p7 -0x1.4p2 +REG esri:32453 3 0x1.04p7 0x1.4p2 +REG esri:32453 4 0x1.18p7 0x1.4p2 +REG esri:32454 0 0x1.1ap7 0x0.0p0 +REG esri:32454 1 0x1.1p7 -0x1.4p2 +REG esri:32454 2 0x1.24p7 -0x1.4p2 +REG esri:32454 3 0x1.1p7 0x1.4p2 +REG esri:32454 4 0x1.24p7 0x1.4p2 +REG esri:32455 0 0x1.26p7 0x0.0p0 +REG esri:32455 1 0x1.1cp7 -0x1.4p2 +REG esri:32455 2 0x1.3p7 -0x1.4p2 +REG esri:32455 3 0x1.1cp7 0x1.4p2 +REG esri:32455 4 0x1.3p7 0x1.4p2 +REG esri:32456 0 0x1.32p7 0x0.0p0 +REG esri:32456 1 0x1.28p7 -0x1.4p2 +REG esri:32456 2 0x1.3cp7 -0x1.4p2 +REG esri:32456 3 0x1.28p7 0x1.4p2 +REG esri:32456 4 0x1.3cp7 0x1.4p2 +REG esri:32457 0 0x1.3ep7 0x0.0p0 +REG esri:32457 1 0x1.34p7 -0x1.4p2 +REG esri:32457 2 0x1.48p7 -0x1.4p2 +REG esri:32457 3 0x1.34p7 0x1.4p2 +REG esri:32457 4 0x1.48p7 0x1.4p2 +REG esri:32458 0 0x1.4ap7 0x0.0p0 +REG esri:32458 1 0x1.4p7 -0x1.4p2 +REG esri:32458 2 0x1.54p7 -0x1.4p2 +REG esri:32458 3 0x1.4p7 0x1.4p2 +REG esri:32458 4 0x1.54p7 0x1.4p2 +REG esri:32459 0 0x1.56p7 0x0.0p0 +REG esri:32459 1 0x1.4cp7 -0x1.4p2 +REG esri:32459 2 0x1.6p7 -0x1.4p2 +REG esri:32459 3 0x1.4cp7 0x1.4p2 +REG esri:32459 4 0x1.6p7 0x1.4p2 +REG esri:32460 0 0x1.62p7 0x0.0p0 +REG esri:32460 1 0x1.58p7 -0x1.4p2 +REG esri:32460 2 -0x1.64p7 -0x1.4p2 +REG esri:32460 3 0x1.58p7 0x1.4p2 +REG esri:32460 4 -0x1.64p7 0x1.4p2 +REG esri:32501 0 -0x1.62p7 -0x1.9p4 +REG esri:32501 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:32501 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:32501 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:32501 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:32502 0 -0x1.56p7 -0x1.9p4 +REG esri:32502 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:32502 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:32502 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:32502 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:32503 0 -0x1.4ap7 -0x1.9p4 +REG esri:32503 1 -0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:32503 2 -0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:32503 3 -0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:32503 4 -0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:32504 0 -0x1.3ep7 -0x1.9p4 +REG esri:32504 1 -0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:32504 2 -0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:32504 3 -0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:32504 4 -0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:32505 0 -0x1.32p7 -0x1.9p4 +REG esri:32505 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:32505 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:32505 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:32505 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:32506 0 -0x1.26p7 -0x1.9p4 +REG esri:32506 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:32506 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:32506 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:32506 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:32507 0 -0x1.1ap7 -0x1.9p4 +REG esri:32507 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:32507 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:32507 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:32507 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:32508 0 -0x1.0ep7 -0x1.9p4 +REG esri:32508 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:32508 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:32508 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:32508 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:32509 0 -0x1.02p7 -0x1.9p4 +REG esri:32509 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:32509 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:32509 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:32509 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:32510 0 -0x1.ecp6 -0x1.9p4 +REG esri:32510 1 -0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:32510 2 -0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32510 3 -0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:32510 4 -0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32511 0 -0x1.d4p6 -0x1.9p4 +REG esri:32511 1 -0x1.ea114b818572ep6 -0x1.ep4 +REG esri:32511 2 -0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:32511 3 -0x1.ea114b818572ep6 -0x1.4p4 +REG esri:32511 4 -0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:32512 0 -0x1.bcp6 -0x1.9p4 +REG esri:32512 1 -0x1.d2114b818572ep6 -0x1.ep4 +REG esri:32512 2 -0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32512 3 -0x1.d2114b818572ep6 -0x1.4p4 +REG esri:32512 4 -0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32513 0 -0x1.a4p6 -0x1.9p4 +REG esri:32513 1 -0x1.ba114b818572ep6 -0x1.ep4 +REG esri:32513 2 -0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:32513 3 -0x1.ba114b818572ep6 -0x1.4p4 +REG esri:32513 4 -0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:32514 0 -0x1.8cp6 -0x1.9p4 +REG esri:32514 1 -0x1.a2114b818572ep6 -0x1.ep4 +REG esri:32514 2 -0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:32514 3 -0x1.a2114b818572ep6 -0x1.4p4 +REG esri:32514 4 -0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:32515 0 -0x1.74p6 -0x1.9p4 +REG esri:32515 1 -0x1.8a114b818572ep6 -0x1.ep4 +REG esri:32515 2 -0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:32515 3 -0x1.8a114b818572ep6 -0x1.4p4 +REG esri:32515 4 -0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:32516 0 -0x1.5cp6 -0x1.9p4 +REG esri:32516 1 -0x1.72114b818572ep6 -0x1.ep4 +REG esri:32516 2 -0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG esri:32516 3 -0x1.72114b818572ep6 -0x1.4p4 +REG esri:32516 4 -0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG esri:32517 0 -0x1.44p6 -0x1.9p4 +REG esri:32517 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG esri:32517 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:32517 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG esri:32517 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:32518 0 -0x1.2cp6 -0x1.9p4 +REG esri:32518 1 -0x1.42114b818572ep6 -0x1.ep4 +REG esri:32518 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:32518 3 -0x1.42114b818572ep6 -0x1.4p4 +REG esri:32518 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:32519 0 -0x1.14p6 -0x1.9p4 +REG esri:32519 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:32519 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:32519 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:32519 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:32520 0 -0x1.f8p5 -0x1.9p4 +REG esri:32520 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:32520 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:32520 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:32520 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:32521 0 -0x1.c8p5 -0x1.9p4 +REG esri:32521 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:32521 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:32521 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:32521 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:32522 0 -0x1.98p5 -0x1.9p4 +REG esri:32522 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:32522 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:32522 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:32522 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:32523 0 -0x1.68p5 -0x1.9p4 +REG esri:32523 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:32523 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:32523 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:32523 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:32524 0 -0x1.38p5 -0x1.9p4 +REG esri:32524 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:32524 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:32524 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:32524 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:32525 0 -0x1.08p5 -0x1.9p4 +REG esri:32525 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32525 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32525 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32525 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32526 0 -0x1.bp4 -0x1.9p4 +REG esri:32526 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG esri:32526 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:32526 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG esri:32526 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:32527 0 -0x1.5p4 -0x1.9p4 +REG esri:32527 1 -0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:32527 2 -0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:32527 3 -0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:32527 4 -0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:32528 0 -0x1.ep3 -0x1.9p4 +REG esri:32528 1 -0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:32528 2 -0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:32528 3 -0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:32528 4 -0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:32529 0 -0x1.2p3 -0x1.9p4 +REG esri:32529 1 -0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:32529 2 -0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:32529 3 -0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:32529 4 -0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:32530 0 -0x1.8p1 -0x1.9p4 +REG esri:32530 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG esri:32530 2 0x1.42297030ae5cap1 -0x1.ep4 +REG esri:32530 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG esri:32530 4 0x1.42297030ae5cap1 -0x1.4p4 +REG esri:32531 0 0x1.8p1 -0x1.9p4 +REG esri:32531 1 -0x1.42297030ae5cap1 -0x1.ep4 +REG esri:32531 2 0x1.108a5c0c2b972p3 -0x1.ep4 +REG esri:32531 3 -0x1.42297030ae5cap1 -0x1.4p4 +REG esri:32531 4 0x1.108a5c0c2b972p3 -0x1.4p4 +REG esri:32532 0 0x1.2p3 -0x1.9p4 +REG esri:32532 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:32532 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:32532 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:32532 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:32533 0 0x1.ep3 -0x1.9p4 +REG esri:32533 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:32533 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:32533 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:32533 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:32534 0 0x1.5p4 -0x1.9p4 +REG esri:32534 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:32534 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:32534 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:32534 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:32535 0 0x1.bp4 -0x1.9p4 +REG esri:32535 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:32535 2 0x1.042297030ae5dp5 -0x1.ep4 +REG esri:32535 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:32535 4 0x1.042297030ae5dp5 -0x1.4p4 +REG esri:32536 0 0x1.08p5 -0x1.9p4 +REG esri:32536 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32536 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32536 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32536 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32537 0 0x1.38p5 -0x1.9p4 +REG esri:32537 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:32537 2 0x1.642297030ae5dp5 -0x1.ep4 +REG esri:32537 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:32537 4 0x1.642297030ae5dp5 -0x1.4p4 +REG esri:32538 0 0x1.68p5 -0x1.9p4 +REG esri:32538 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:32538 2 0x1.942297030ae5dp5 -0x1.ep4 +REG esri:32538 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:32538 4 0x1.942297030ae5dp5 -0x1.4p4 +REG esri:32539 0 0x1.98p5 -0x1.9p4 +REG esri:32539 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:32539 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:32539 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:32539 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:32540 0 0x1.c8p5 -0x1.9p4 +REG esri:32540 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:32540 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:32540 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:32540 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:32541 0 0x1.f8p5 -0x1.9p4 +REG esri:32541 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:32541 2 0x1.12114b818572ep6 -0x1.ep4 +REG esri:32541 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:32541 4 0x1.12114b818572ep6 -0x1.4p4 +REG esri:32542 0 0x1.14p6 -0x1.9p4 +REG esri:32542 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:32542 2 0x1.2a114b818572ep6 -0x1.ep4 +REG esri:32542 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:32542 4 0x1.2a114b818572ep6 -0x1.4p4 +REG esri:32543 0 0x1.2cp6 -0x1.9p4 +REG esri:32543 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:32543 2 0x1.42114b818572ep6 -0x1.ep4 +REG esri:32543 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:32543 4 0x1.42114b818572ep6 -0x1.4p4 +REG esri:32544 0 0x1.44p6 -0x1.9p4 +REG esri:32544 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:32544 2 0x1.5a114b818572ep6 -0x1.ep4 +REG esri:32544 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:32544 4 0x1.5a114b818572ep6 -0x1.4p4 +REG esri:32545 0 0x1.5cp6 -0x1.9p4 +REG esri:32545 1 0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG esri:32545 2 0x1.72114b818572ep6 -0x1.ep4 +REG esri:32545 3 0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG esri:32545 4 0x1.72114b818572ep6 -0x1.4p4 +REG esri:32546 0 0x1.74p6 -0x1.9p4 +REG esri:32546 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:32546 2 0x1.8a114b818572ep6 -0x1.ep4 +REG esri:32546 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:32546 4 0x1.8a114b818572ep6 -0x1.4p4 +REG esri:32547 0 0x1.8cp6 -0x1.9p4 +REG esri:32547 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:32547 2 0x1.a2114b818572ep6 -0x1.ep4 +REG esri:32547 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:32547 4 0x1.a2114b818572ep6 -0x1.4p4 +REG esri:32548 0 0x1.a4p6 -0x1.9p4 +REG esri:32548 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:32548 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:32548 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:32548 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:32549 0 0x1.bcp6 -0x1.9p4 +REG esri:32549 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32549 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:32549 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32549 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:32550 0 0x1.d4p6 -0x1.9p4 +REG esri:32550 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:32550 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:32550 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:32550 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:32551 0 0x1.ecp6 -0x1.9p4 +REG esri:32551 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32551 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:32551 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32551 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:32552 0 0x1.02p7 -0x1.9p4 +REG esri:32552 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:32552 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:32552 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:32552 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:32553 0 0x1.0ep7 -0x1.9p4 +REG esri:32553 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:32553 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:32553 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:32553 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:32554 0 0x1.1ap7 -0x1.9p4 +REG esri:32554 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:32554 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:32554 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:32554 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:32555 0 0x1.26p7 -0x1.9p4 +REG esri:32555 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:32555 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:32555 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:32555 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:32556 0 0x1.32p7 -0x1.9p4 +REG esri:32556 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:32556 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:32556 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:32556 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:32557 0 0x1.3ep7 -0x1.9p4 +REG esri:32557 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:32557 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:32557 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:32557 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:32558 0 0x1.4ap7 -0x1.9p4 +REG esri:32558 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:32558 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:32558 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:32558 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:32559 0 0x1.56p7 -0x1.9p4 +REG esri:32559 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:32559 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:32559 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:32559 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:32560 0 0x1.62p7 -0x1.9p4 +REG esri:32560 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:32560 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:32560 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:32560 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:32601 0 -0x1.62p7 0x0.0p0 +REG esri:32601 1 0x1.64p7 -0x1.4p2 +REG esri:32601 2 -0x1.58p7 -0x1.4p2 +REG esri:32601 3 0x1.64p7 0x1.4p2 +REG esri:32601 4 -0x1.58p7 0x1.4p2 +REG esri:32602 0 -0x1.56p7 0x0.0p0 +REG esri:32602 1 -0x1.6p7 -0x1.4p2 +REG esri:32602 2 -0x1.4cp7 -0x1.4p2 +REG esri:32602 3 -0x1.6p7 0x1.4p2 +REG esri:32602 4 -0x1.4cp7 0x1.4p2 +REG esri:32603 0 -0x1.4ap7 0x0.0p0 +REG esri:32603 1 -0x1.54p7 -0x1.4p2 +REG esri:32603 2 -0x1.4p7 -0x1.4p2 +REG esri:32603 3 -0x1.54p7 0x1.4p2 +REG esri:32603 4 -0x1.4p7 0x1.4p2 +REG esri:32604 0 -0x1.3ep7 0x0.0p0 +REG esri:32604 1 -0x1.48p7 -0x1.4p2 +REG esri:32604 2 -0x1.34p7 -0x1.4p2 +REG esri:32604 3 -0x1.48p7 0x1.4p2 +REG esri:32604 4 -0x1.34p7 0x1.4p2 +REG esri:32605 0 -0x1.32p7 0x0.0p0 +REG esri:32605 1 -0x1.3cp7 -0x1.4p2 +REG esri:32605 2 -0x1.28p7 -0x1.4p2 +REG esri:32605 3 -0x1.3cp7 0x1.4p2 +REG esri:32605 4 -0x1.28p7 0x1.4p2 +REG esri:32606 0 -0x1.26p7 0x0.0p0 +REG esri:32606 1 -0x1.3p7 -0x1.4p2 +REG esri:32606 2 -0x1.1cp7 -0x1.4p2 +REG esri:32606 3 -0x1.3p7 0x1.4p2 +REG esri:32606 4 -0x1.1cp7 0x1.4p2 +REG esri:32607 0 -0x1.1ap7 0x0.0p0 +REG esri:32607 1 -0x1.24p7 -0x1.4p2 +REG esri:32607 2 -0x1.1p7 -0x1.4p2 +REG esri:32607 3 -0x1.24p7 0x1.4p2 +REG esri:32607 4 -0x1.1p7 0x1.4p2 +REG esri:32608 0 -0x1.0ep7 0x0.0p0 +REG esri:32608 1 -0x1.18p7 -0x1.4p2 +REG esri:32608 2 -0x1.04p7 -0x1.4p2 +REG esri:32608 3 -0x1.18p7 0x1.4p2 +REG esri:32608 4 -0x1.04p7 0x1.4p2 +REG esri:32609 0 -0x1.02p7 0x0.0p0 +REG esri:32609 1 -0x1.0cp7 -0x1.4p2 +REG esri:32609 2 -0x1.fp6 -0x1.4p2 +REG esri:32609 3 -0x1.0cp7 0x1.4p2 +REG esri:32609 4 -0x1.fp6 0x1.4p2 +REG esri:32610 0 -0x1.ecp6 0x0.0p0 +REG esri:32610 1 -0x1.0p7 -0x1.4p2 +REG esri:32610 2 -0x1.d8p6 -0x1.4p2 +REG esri:32610 3 -0x1.0p7 0x1.4p2 +REG esri:32610 4 -0x1.d8p6 0x1.4p2 +REG esri:32611 0 -0x1.d4p6 0x0.0p0 +REG esri:32611 1 -0x1.e8p6 -0x1.4p2 +REG esri:32611 2 -0x1.cp6 -0x1.4p2 +REG esri:32611 3 -0x1.e8p6 0x1.4p2 +REG esri:32611 4 -0x1.cp6 0x1.4p2 +REG esri:32612 0 -0x1.bcp6 0x0.0p0 +REG esri:32612 1 -0x1.dp6 -0x1.4p2 +REG esri:32612 2 -0x1.a8p6 -0x1.4p2 +REG esri:32612 3 -0x1.dp6 0x1.4p2 +REG esri:32612 4 -0x1.a8p6 0x1.4p2 +REG esri:32613 0 -0x1.a4p6 0x0.0p0 +REG esri:32613 1 -0x1.b8p6 -0x1.4p2 +REG esri:32613 2 -0x1.9p6 -0x1.4p2 +REG esri:32613 3 -0x1.b8p6 0x1.4p2 +REG esri:32613 4 -0x1.9p6 0x1.4p2 +REG esri:32614 0 -0x1.8cp6 0x0.0p0 +REG esri:32614 1 -0x1.ap6 -0x1.4p2 +REG esri:32614 2 -0x1.78p6 -0x1.4p2 +REG esri:32614 3 -0x1.ap6 0x1.4p2 +REG esri:32614 4 -0x1.78p6 0x1.4p2 +REG esri:32615 0 -0x1.74p6 0x0.0p0 +REG esri:32615 1 -0x1.88p6 -0x1.4p2 +REG esri:32615 2 -0x1.6p6 -0x1.4p2 +REG esri:32615 3 -0x1.88p6 0x1.4p2 +REG esri:32615 4 -0x1.6p6 0x1.4p2 +REG esri:32616 0 -0x1.5cp6 0x0.0p0 +REG esri:32616 1 -0x1.7p6 -0x1.4p2 +REG esri:32616 2 -0x1.48p6 -0x1.4p2 +REG esri:32616 3 -0x1.7p6 0x1.4p2 +REG esri:32616 4 -0x1.48p6 0x1.4p2 +REG esri:32617 0 -0x1.44p6 0x0.0p0 +REG esri:32617 1 -0x1.58p6 -0x1.4p2 +REG esri:32617 2 -0x1.3p6 -0x1.4p2 +REG esri:32617 3 -0x1.58p6 0x1.4p2 +REG esri:32617 4 -0x1.3p6 0x1.4p2 +REG esri:32618 0 -0x1.2cp6 0x0.0p0 +REG esri:32618 1 -0x1.4p6 -0x1.4p2 +REG esri:32618 2 -0x1.18p6 -0x1.4p2 +REG esri:32618 3 -0x1.4p6 0x1.4p2 +REG esri:32618 4 -0x1.18p6 0x1.4p2 +REG esri:32619 0 -0x1.14p6 0x0.0p0 +REG esri:32619 1 -0x1.28p6 -0x1.4p2 +REG esri:32619 2 -0x1.0p6 -0x1.4p2 +REG esri:32619 3 -0x1.28p6 0x1.4p2 +REG esri:32619 4 -0x1.0p6 0x1.4p2 +REG esri:32620 0 -0x1.f8p5 0x0.0p0 +REG esri:32620 1 -0x1.1p6 -0x1.4p2 +REG esri:32620 2 -0x1.dp5 -0x1.4p2 +REG esri:32620 3 -0x1.1p6 0x1.4p2 +REG esri:32620 4 -0x1.dp5 0x1.4p2 +REG esri:32621 0 -0x1.c8p5 0x0.0p0 +REG esri:32621 1 -0x1.fp5 -0x1.4p2 +REG esri:32621 2 -0x1.ap5 -0x1.4p2 +REG esri:32621 3 -0x1.fp5 0x1.4p2 +REG esri:32621 4 -0x1.ap5 0x1.4p2 +REG esri:32622 0 -0x1.98p5 0x0.0p0 +REG esri:32622 1 -0x1.cp5 -0x1.4p2 +REG esri:32622 2 -0x1.7p5 -0x1.4p2 +REG esri:32622 3 -0x1.cp5 0x1.4p2 +REG esri:32622 4 -0x1.7p5 0x1.4p2 +REG esri:32623 0 -0x1.68p5 0x0.0p0 +REG esri:32623 1 -0x1.9p5 -0x1.4p2 +REG esri:32623 2 -0x1.4p5 -0x1.4p2 +REG esri:32623 3 -0x1.9p5 0x1.4p2 +REG esri:32623 4 -0x1.4p5 0x1.4p2 +REG esri:32624 0 -0x1.38p5 0x0.0p0 +REG esri:32624 1 -0x1.6p5 -0x1.4p2 +REG esri:32624 2 -0x1.1p5 -0x1.4p2 +REG esri:32624 3 -0x1.6p5 0x1.4p2 +REG esri:32624 4 -0x1.1p5 0x1.4p2 +REG esri:32625 0 -0x1.08p5 0x0.0p0 +REG esri:32625 1 -0x1.3p5 -0x1.4p2 +REG esri:32625 2 -0x1.cp4 -0x1.4p2 +REG esri:32625 3 -0x1.3p5 0x1.4p2 +REG esri:32625 4 -0x1.cp4 0x1.4p2 +REG esri:32626 0 -0x1.bp4 0x0.0p0 +REG esri:32626 1 -0x1.0p5 -0x1.4p2 +REG esri:32626 2 -0x1.6p4 -0x1.4p2 +REG esri:32626 3 -0x1.0p5 0x1.4p2 +REG esri:32626 4 -0x1.6p4 0x1.4p2 +REG esri:32627 0 -0x1.5p4 0x0.0p0 +REG esri:32627 1 -0x1.ap4 -0x1.4p2 +REG esri:32627 2 -0x1.0p4 -0x1.4p2 +REG esri:32627 3 -0x1.ap4 0x1.4p2 +REG esri:32627 4 -0x1.0p4 0x1.4p2 +REG esri:32628 0 -0x1.ep3 0x0.0p0 +REG esri:32628 1 -0x1.4p4 -0x1.4p2 +REG esri:32628 2 -0x1.4p3 -0x1.4p2 +REG esri:32628 3 -0x1.4p4 0x1.4p2 +REG esri:32628 4 -0x1.4p3 0x1.4p2 +REG esri:32629 0 -0x1.2p3 0x0.0p0 +REG esri:32629 1 -0x1.cp3 -0x1.4p2 +REG esri:32629 2 -0x1.0p2 -0x1.4p2 +REG esri:32629 3 -0x1.cp3 0x1.4p2 +REG esri:32629 4 -0x1.0p2 0x1.4p2 +REG esri:32630 0 -0x1.8p1 0x0.0p0 +REG esri:32630 1 -0x1.0p3 -0x1.4p2 +REG esri:32630 2 0x1.0p1 -0x1.4p2 +REG esri:32630 3 -0x1.0p3 0x1.4p2 +REG esri:32630 4 0x1.0p1 0x1.4p2 +REG esri:32631 0 0x1.8p1 0x0.0p0 +REG esri:32631 1 -0x1.0p1 -0x1.4p2 +REG esri:32631 2 0x1.0p3 -0x1.4p2 +REG esri:32631 3 -0x1.0p1 0x1.4p2 +REG esri:32631 4 0x1.0p3 0x1.4p2 +REG esri:32632 0 0x1.2p3 0x0.0p0 +REG esri:32632 1 0x1.0p2 -0x1.4p2 +REG esri:32632 2 0x1.cp3 -0x1.4p2 +REG esri:32632 3 0x1.0p2 0x1.4p2 +REG esri:32632 4 0x1.cp3 0x1.4p2 +REG esri:32633 0 0x1.ep3 0x0.0p0 +REG esri:32633 1 0x1.4p3 -0x1.4p2 +REG esri:32633 2 0x1.4p4 -0x1.4p2 +REG esri:32633 3 0x1.4p3 0x1.4p2 +REG esri:32633 4 0x1.4p4 0x1.4p2 +REG esri:32634 0 0x1.5p4 0x0.0p0 +REG esri:32634 1 0x1.0p4 -0x1.4p2 +REG esri:32634 2 0x1.ap4 -0x1.4p2 +REG esri:32634 3 0x1.0p4 0x1.4p2 +REG esri:32634 4 0x1.ap4 0x1.4p2 +REG esri:32635 0 0x1.bp4 0x0.0p0 +REG esri:32635 1 0x1.6p4 -0x1.4p2 +REG esri:32635 2 0x1.0p5 -0x1.4p2 +REG esri:32635 3 0x1.6p4 0x1.4p2 +REG esri:32635 4 0x1.0p5 0x1.4p2 +REG esri:32636 0 0x1.08p5 0x0.0p0 +REG esri:32636 1 0x1.cp4 -0x1.4p2 +REG esri:32636 2 0x1.3p5 -0x1.4p2 +REG esri:32636 3 0x1.cp4 0x1.4p2 +REG esri:32636 4 0x1.3p5 0x1.4p2 +REG esri:32637 0 0x1.38p5 0x0.0p0 +REG esri:32637 1 0x1.1p5 -0x1.4p2 +REG esri:32637 2 0x1.6p5 -0x1.4p2 +REG esri:32637 3 0x1.1p5 0x1.4p2 +REG esri:32637 4 0x1.6p5 0x1.4p2 +REG esri:32638 0 0x1.68p5 0x0.0p0 +REG esri:32638 1 0x1.4p5 -0x1.4p2 +REG esri:32638 2 0x1.9p5 -0x1.4p2 +REG esri:32638 3 0x1.4p5 0x1.4p2 +REG esri:32638 4 0x1.9p5 0x1.4p2 +REG esri:32639 0 0x1.98p5 0x0.0p0 +REG esri:32639 1 0x1.7p5 -0x1.4p2 +REG esri:32639 2 0x1.cp5 -0x1.4p2 +REG esri:32639 3 0x1.7p5 0x1.4p2 +REG esri:32639 4 0x1.cp5 0x1.4p2 +REG esri:32640 0 0x1.c8p5 0x0.0p0 +REG esri:32640 1 0x1.ap5 -0x1.4p2 +REG esri:32640 2 0x1.fp5 -0x1.4p2 +REG esri:32640 3 0x1.ap5 0x1.4p2 +REG esri:32640 4 0x1.fp5 0x1.4p2 +REG esri:32641 0 0x1.f8p5 0x0.0p0 +REG esri:32641 1 0x1.dp5 -0x1.4p2 +REG esri:32641 2 0x1.1p6 -0x1.4p2 +REG esri:32641 3 0x1.dp5 0x1.4p2 +REG esri:32641 4 0x1.1p6 0x1.4p2 +REG esri:32642 0 0x1.14p6 0x0.0p0 +REG esri:32642 1 0x1.0p6 -0x1.4p2 +REG esri:32642 2 0x1.28p6 -0x1.4p2 +REG esri:32642 3 0x1.0p6 0x1.4p2 +REG esri:32642 4 0x1.28p6 0x1.4p2 +REG esri:32643 0 0x1.2cp6 0x0.0p0 +REG esri:32643 1 0x1.18p6 -0x1.4p2 +REG esri:32643 2 0x1.4p6 -0x1.4p2 +REG esri:32643 3 0x1.18p6 0x1.4p2 +REG esri:32643 4 0x1.4p6 0x1.4p2 +REG esri:32644 0 0x1.44p6 0x0.0p0 +REG esri:32644 1 0x1.3p6 -0x1.4p2 +REG esri:32644 2 0x1.58p6 -0x1.4p2 +REG esri:32644 3 0x1.3p6 0x1.4p2 +REG esri:32644 4 0x1.58p6 0x1.4p2 +REG esri:32645 0 0x1.5cp6 0x0.0p0 +REG esri:32645 1 0x1.48p6 -0x1.4p2 +REG esri:32645 2 0x1.7p6 -0x1.4p2 +REG esri:32645 3 0x1.48p6 0x1.4p2 +REG esri:32645 4 0x1.7p6 0x1.4p2 +REG esri:32646 0 0x1.74p6 0x0.0p0 +REG esri:32646 1 0x1.6p6 -0x1.4p2 +REG esri:32646 2 0x1.88p6 -0x1.4p2 +REG esri:32646 3 0x1.6p6 0x1.4p2 +REG esri:32646 4 0x1.88p6 0x1.4p2 +REG esri:32647 0 0x1.8cp6 0x0.0p0 +REG esri:32647 1 0x1.78p6 -0x1.4p2 +REG esri:32647 2 0x1.ap6 -0x1.4p2 +REG esri:32647 3 0x1.78p6 0x1.4p2 +REG esri:32647 4 0x1.ap6 0x1.4p2 +REG esri:32648 0 0x1.a4p6 0x0.0p0 +REG esri:32648 1 0x1.9p6 -0x1.4p2 +REG esri:32648 2 0x1.b8p6 -0x1.4p2 +REG esri:32648 3 0x1.9p6 0x1.4p2 +REG esri:32648 4 0x1.b8p6 0x1.4p2 +REG esri:32649 0 0x1.bcp6 0x0.0p0 +REG esri:32649 1 0x1.a8p6 -0x1.4p2 +REG esri:32649 2 0x1.dp6 -0x1.4p2 +REG esri:32649 3 0x1.a8p6 0x1.4p2 +REG esri:32649 4 0x1.dp6 0x1.4p2 +REG esri:32650 0 0x1.d4p6 0x0.0p0 +REG esri:32650 1 0x1.cp6 -0x1.4p2 +REG esri:32650 2 0x1.e8p6 -0x1.4p2 +REG esri:32650 3 0x1.cp6 0x1.4p2 +REG esri:32650 4 0x1.e8p6 0x1.4p2 +REG esri:32651 0 0x1.ecp6 0x0.0p0 +REG esri:32651 1 0x1.d8p6 -0x1.4p2 +REG esri:32651 2 0x1.0p7 -0x1.4p2 +REG esri:32651 3 0x1.d8p6 0x1.4p2 +REG esri:32651 4 0x1.0p7 0x1.4p2 +REG esri:32652 0 0x1.02p7 0x0.0p0 +REG esri:32652 1 0x1.fp6 -0x1.4p2 +REG esri:32652 2 0x1.0cp7 -0x1.4p2 +REG esri:32652 3 0x1.fp6 0x1.4p2 +REG esri:32652 4 0x1.0cp7 0x1.4p2 +REG esri:32653 0 0x1.0ep7 0x0.0p0 +REG esri:32653 1 0x1.04p7 -0x1.4p2 +REG esri:32653 2 0x1.18p7 -0x1.4p2 +REG esri:32653 3 0x1.04p7 0x1.4p2 +REG esri:32653 4 0x1.18p7 0x1.4p2 +REG esri:32654 0 0x1.1ap7 0x0.0p0 +REG esri:32654 1 0x1.1p7 -0x1.4p2 +REG esri:32654 2 0x1.24p7 -0x1.4p2 +REG esri:32654 3 0x1.1p7 0x1.4p2 +REG esri:32654 4 0x1.24p7 0x1.4p2 +REG esri:32655 0 0x1.26p7 0x0.0p0 +REG esri:32655 1 0x1.1cp7 -0x1.4p2 +REG esri:32655 2 0x1.3p7 -0x1.4p2 +REG esri:32655 3 0x1.1cp7 0x1.4p2 +REG esri:32655 4 0x1.3p7 0x1.4p2 +REG esri:32656 0 0x1.32p7 0x0.0p0 +REG esri:32656 1 0x1.28p7 -0x1.4p2 +REG esri:32656 2 0x1.3cp7 -0x1.4p2 +REG esri:32656 3 0x1.28p7 0x1.4p2 +REG esri:32656 4 0x1.3cp7 0x1.4p2 +REG esri:32657 0 0x1.3ep7 0x0.0p0 +REG esri:32657 1 0x1.34p7 -0x1.4p2 +REG esri:32657 2 0x1.48p7 -0x1.4p2 +REG esri:32657 3 0x1.34p7 0x1.4p2 +REG esri:32657 4 0x1.48p7 0x1.4p2 +REG esri:32658 0 0x1.4ap7 0x0.0p0 +REG esri:32658 1 0x1.4p7 -0x1.4p2 +REG esri:32658 2 0x1.54p7 -0x1.4p2 +REG esri:32658 3 0x1.4p7 0x1.4p2 +REG esri:32658 4 0x1.54p7 0x1.4p2 +REG esri:32659 0 0x1.56p7 0x0.0p0 +REG esri:32659 1 0x1.4cp7 -0x1.4p2 +REG esri:32659 2 0x1.6p7 -0x1.4p2 +REG esri:32659 3 0x1.4cp7 0x1.4p2 +REG esri:32659 4 0x1.6p7 0x1.4p2 +REG esri:32660 0 0x1.62p7 0x0.0p0 +REG esri:32660 1 0x1.58p7 -0x1.4p2 +REG esri:32660 2 -0x1.64p7 -0x1.4p2 +REG esri:32660 3 0x1.58p7 0x1.4p2 +REG esri:32660 4 -0x1.64p7 0x1.4p2 +REG esri:32661 0 0x0.0p0 0x1.64p6 +REG esri:32661 1 -0x1.ep5 0x1.54p6 +REG esri:32661 2 0x1.ep5 0x1.54p6 +REG esri:32661 3 -0x1.ep5 0x1.64p6 +REG esri:32661 4 0x1.ep5 0x1.64p6 +REG esri:32701 0 -0x1.62p7 -0x1.9p4 +REG esri:32701 1 0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:32701 2 -0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:32701 3 0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:32701 4 -0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:32702 0 -0x1.56p7 -0x1.9p4 +REG esri:32702 1 -0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:32702 2 -0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:32702 3 -0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:32702 4 -0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:32703 0 -0x1.4ap7 -0x1.9p4 +REG esri:32703 1 -0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:32703 2 -0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:32703 3 -0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:32703 4 -0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:32704 0 -0x1.3ep7 -0x1.9p4 +REG esri:32704 1 -0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:32704 2 -0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:32704 3 -0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:32704 4 -0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:32705 0 -0x1.32p7 -0x1.9p4 +REG esri:32705 1 -0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:32705 2 -0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:32705 3 -0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:32705 4 -0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:32706 0 -0x1.26p7 -0x1.9p4 +REG esri:32706 1 -0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:32706 2 -0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:32706 3 -0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:32706 4 -0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:32707 0 -0x1.1ap7 -0x1.9p4 +REG esri:32707 1 -0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:32707 2 -0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:32707 3 -0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:32707 4 -0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:32708 0 -0x1.0ep7 -0x1.9p4 +REG esri:32708 1 -0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:32708 2 -0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:32708 3 -0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:32708 4 -0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:32709 0 -0x1.02p7 -0x1.9p4 +REG esri:32709 1 -0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:32709 2 -0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:32709 3 -0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:32709 4 -0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:32710 0 -0x1.ecp6 -0x1.9p4 +REG esri:32710 1 -0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:32710 2 -0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32710 3 -0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:32710 4 -0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32711 0 -0x1.d4p6 -0x1.9p4 +REG esri:32711 1 -0x1.ea114b818572ep6 -0x1.ep4 +REG esri:32711 2 -0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:32711 3 -0x1.ea114b818572ep6 -0x1.4p4 +REG esri:32711 4 -0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:32712 0 -0x1.bcp6 -0x1.9p4 +REG esri:32712 1 -0x1.d2114b818572ep6 -0x1.ep4 +REG esri:32712 2 -0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32712 3 -0x1.d2114b818572ep6 -0x1.4p4 +REG esri:32712 4 -0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32713 0 -0x1.a4p6 -0x1.9p4 +REG esri:32713 1 -0x1.ba114b818572ep6 -0x1.ep4 +REG esri:32713 2 -0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:32713 3 -0x1.ba114b818572ep6 -0x1.4p4 +REG esri:32713 4 -0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:32714 0 -0x1.8cp6 -0x1.9p4 +REG esri:32714 1 -0x1.a2114b818572ep6 -0x1.ep4 +REG esri:32714 2 -0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:32714 3 -0x1.a2114b818572ep6 -0x1.4p4 +REG esri:32714 4 -0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:32715 0 -0x1.74p6 -0x1.9p4 +REG esri:32715 1 -0x1.8a114b818572ep6 -0x1.ep4 +REG esri:32715 2 -0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:32715 3 -0x1.8a114b818572ep6 -0x1.4p4 +REG esri:32715 4 -0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:32716 0 -0x1.5cp6 -0x1.9p4 +REG esri:32716 1 -0x1.72114b818572ep6 -0x1.ep4 +REG esri:32716 2 -0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG esri:32716 3 -0x1.72114b818572ep6 -0x1.4p4 +REG esri:32716 4 -0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG esri:32717 0 -0x1.44p6 -0x1.9p4 +REG esri:32717 1 -0x1.5a114b818572ep6 -0x1.ep4 +REG esri:32717 2 -0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:32717 3 -0x1.5a114b818572ep6 -0x1.4p4 +REG esri:32717 4 -0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:32718 0 -0x1.2cp6 -0x1.9p4 +REG esri:32718 1 -0x1.42114b818572ep6 -0x1.ep4 +REG esri:32718 2 -0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:32718 3 -0x1.42114b818572ep6 -0x1.4p4 +REG esri:32718 4 -0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:32719 0 -0x1.14p6 -0x1.9p4 +REG esri:32719 1 -0x1.2a114b818572ep6 -0x1.ep4 +REG esri:32719 2 -0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:32719 3 -0x1.2a114b818572ep6 -0x1.4p4 +REG esri:32719 4 -0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:32720 0 -0x1.f8p5 -0x1.9p4 +REG esri:32720 1 -0x1.12114b818572ep6 -0x1.ep4 +REG esri:32720 2 -0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:32720 3 -0x1.12114b818572ep6 -0x1.4p4 +REG esri:32720 4 -0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:32721 0 -0x1.c8p5 -0x1.9p4 +REG esri:32721 1 -0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:32721 2 -0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:32721 3 -0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:32721 4 -0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:32722 0 -0x1.98p5 -0x1.9p4 +REG esri:32722 1 -0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:32722 2 -0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:32722 3 -0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:32722 4 -0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:32723 0 -0x1.68p5 -0x1.9p4 +REG esri:32723 1 -0x1.942297030ae5dp5 -0x1.ep4 +REG esri:32723 2 -0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:32723 3 -0x1.942297030ae5dp5 -0x1.4p4 +REG esri:32723 4 -0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:32724 0 -0x1.38p5 -0x1.9p4 +REG esri:32724 1 -0x1.642297030ae5dp5 -0x1.ep4 +REG esri:32724 2 -0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:32724 3 -0x1.642297030ae5dp5 -0x1.4p4 +REG esri:32724 4 -0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:32725 0 -0x1.08p5 -0x1.9p4 +REG esri:32725 1 -0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32725 2 -0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32725 3 -0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32725 4 -0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32726 0 -0x1.bp4 -0x1.9p4 +REG esri:32726 1 -0x1.042297030ae5dp5 -0x1.ep4 +REG esri:32726 2 -0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:32726 3 -0x1.042297030ae5dp5 -0x1.4p4 +REG esri:32726 4 -0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:32727 0 -0x1.5p4 -0x1.9p4 +REG esri:32727 1 -0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:32727 2 -0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:32727 3 -0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:32727 4 -0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:32728 0 -0x1.ep3 -0x1.9p4 +REG esri:32728 1 -0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:32728 2 -0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:32728 3 -0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:32728 4 -0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:32729 0 -0x1.2p3 -0x1.9p4 +REG esri:32729 1 -0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:32729 2 -0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:32729 3 -0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:32729 4 -0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:32730 0 -0x1.8p1 -0x1.9p4 +REG esri:32730 1 -0x1.108a5c0c2b972p3 -0x1.ep4 +REG esri:32730 2 0x1.42297030ae5cap1 -0x1.ep4 +REG esri:32730 3 -0x1.108a5c0c2b972p3 -0x1.4p4 +REG esri:32730 4 0x1.42297030ae5cap1 -0x1.4p4 +REG esri:32731 0 0x1.8p1 -0x1.9p4 +REG esri:32731 1 -0x1.42297030ae5cap1 -0x1.ep4 +REG esri:32731 2 0x1.108a5c0c2b972p3 -0x1.ep4 +REG esri:32731 3 -0x1.42297030ae5cap1 -0x1.4p4 +REG esri:32731 4 0x1.108a5c0c2b972p3 -0x1.4p4 +REG esri:32732 0 0x1.2p3 -0x1.9p4 +REG esri:32732 1 0x1.bdd68fcf51a36p1 -0x1.ep4 +REG esri:32732 2 0x1.d08a5c0c2b972p3 -0x1.ep4 +REG esri:32732 3 0x1.bdd68fcf51a36p1 -0x1.4p4 +REG esri:32732 4 0x1.d08a5c0c2b972p3 -0x1.4p4 +REG esri:32733 0 0x1.ep3 -0x1.9p4 +REG esri:32733 1 0x1.2f75a3f3d468ep3 -0x1.ep4 +REG esri:32733 2 0x1.48452e0615cb9p4 -0x1.ep4 +REG esri:32733 3 0x1.2f75a3f3d468ep3 -0x1.4p4 +REG esri:32733 4 0x1.48452e0615cb9p4 -0x1.4p4 +REG esri:32734 0 0x1.5p4 -0x1.9p4 +REG esri:32734 1 0x1.ef75a3f3d468ep3 -0x1.ep4 +REG esri:32734 2 0x1.a8452e0615cb9p4 -0x1.ep4 +REG esri:32734 3 0x1.ef75a3f3d468ep3 -0x1.4p4 +REG esri:32734 4 0x1.a8452e0615cb9p4 -0x1.4p4 +REG esri:32735 0 0x1.bp4 -0x1.9p4 +REG esri:32735 1 0x1.57bad1f9ea347p4 -0x1.ep4 +REG esri:32735 2 0x1.042297030ae5dp5 -0x1.ep4 +REG esri:32735 3 0x1.57bad1f9ea347p4 -0x1.4p4 +REG esri:32735 4 0x1.042297030ae5dp5 -0x1.4p4 +REG esri:32736 0 0x1.08p5 -0x1.9p4 +REG esri:32736 1 0x1.b7bad1f9ea347p4 -0x1.ep4 +REG esri:32736 2 0x1.342297030ae5dp5 -0x1.ep4 +REG esri:32736 3 0x1.b7bad1f9ea347p4 -0x1.4p4 +REG esri:32736 4 0x1.342297030ae5dp5 -0x1.4p4 +REG esri:32737 0 0x1.38p5 -0x1.9p4 +REG esri:32737 1 0x1.0bdd68fcf51a3p5 -0x1.ep4 +REG esri:32737 2 0x1.642297030ae5dp5 -0x1.ep4 +REG esri:32737 3 0x1.0bdd68fcf51a3p5 -0x1.4p4 +REG esri:32737 4 0x1.642297030ae5dp5 -0x1.4p4 +REG esri:32738 0 0x1.68p5 -0x1.9p4 +REG esri:32738 1 0x1.3bdd68fcf51a3p5 -0x1.ep4 +REG esri:32738 2 0x1.942297030ae5dp5 -0x1.ep4 +REG esri:32738 3 0x1.3bdd68fcf51a3p5 -0x1.4p4 +REG esri:32738 4 0x1.942297030ae5dp5 -0x1.4p4 +REG esri:32739 0 0x1.98p5 -0x1.9p4 +REG esri:32739 1 0x1.6bdd68fcf51a3p5 -0x1.ep4 +REG esri:32739 2 0x1.c42297030ae5dp5 -0x1.ep4 +REG esri:32739 3 0x1.6bdd68fcf51a3p5 -0x1.4p4 +REG esri:32739 4 0x1.c42297030ae5dp5 -0x1.4p4 +REG esri:32740 0 0x1.c8p5 -0x1.9p4 +REG esri:32740 1 0x1.9bdd68fcf51a3p5 -0x1.ep4 +REG esri:32740 2 0x1.f42297030ae5dp5 -0x1.ep4 +REG esri:32740 3 0x1.9bdd68fcf51a3p5 -0x1.4p4 +REG esri:32740 4 0x1.f42297030ae5dp5 -0x1.4p4 +REG esri:32741 0 0x1.f8p5 -0x1.9p4 +REG esri:32741 1 0x1.cbdd68fcf51a3p5 -0x1.ep4 +REG esri:32741 2 0x1.12114b818572ep6 -0x1.ep4 +REG esri:32741 3 0x1.cbdd68fcf51a3p5 -0x1.4p4 +REG esri:32741 4 0x1.12114b818572ep6 -0x1.4p4 +REG esri:32742 0 0x1.14p6 -0x1.9p4 +REG esri:32742 1 0x1.fbdd68fcf51a3p5 -0x1.ep4 +REG esri:32742 2 0x1.2a114b818572ep6 -0x1.ep4 +REG esri:32742 3 0x1.fbdd68fcf51a3p5 -0x1.4p4 +REG esri:32742 4 0x1.2a114b818572ep6 -0x1.4p4 +REG esri:32743 0 0x1.2cp6 -0x1.9p4 +REG esri:32743 1 0x1.15eeb47e7a8d2p6 -0x1.ep4 +REG esri:32743 2 0x1.42114b818572ep6 -0x1.ep4 +REG esri:32743 3 0x1.15eeb47e7a8d2p6 -0x1.4p4 +REG esri:32743 4 0x1.42114b818572ep6 -0x1.4p4 +REG esri:32744 0 0x1.44p6 -0x1.9p4 +REG esri:32744 1 0x1.2deeb47e7a8d2p6 -0x1.ep4 +REG esri:32744 2 0x1.5a114b818572ep6 -0x1.ep4 +REG esri:32744 3 0x1.2deeb47e7a8d2p6 -0x1.4p4 +REG esri:32744 4 0x1.5a114b818572ep6 -0x1.4p4 +REG esri:32745 0 0x1.5cp6 -0x1.9p4 +REG esri:32745 1 0x1.45eeb47e7a8d2p6 -0x1.ep4 +REG esri:32745 2 0x1.72114b818572ep6 -0x1.ep4 +REG esri:32745 3 0x1.45eeb47e7a8d2p6 -0x1.4p4 +REG esri:32745 4 0x1.72114b818572ep6 -0x1.4p4 +REG esri:32746 0 0x1.74p6 -0x1.9p4 +REG esri:32746 1 0x1.5deeb47e7a8d2p6 -0x1.ep4 +REG esri:32746 2 0x1.8a114b818572ep6 -0x1.ep4 +REG esri:32746 3 0x1.5deeb47e7a8d2p6 -0x1.4p4 +REG esri:32746 4 0x1.8a114b818572ep6 -0x1.4p4 +REG esri:32747 0 0x1.8cp6 -0x1.9p4 +REG esri:32747 1 0x1.75eeb47e7a8d2p6 -0x1.ep4 +REG esri:32747 2 0x1.a2114b818572ep6 -0x1.ep4 +REG esri:32747 3 0x1.75eeb47e7a8d2p6 -0x1.4p4 +REG esri:32747 4 0x1.a2114b818572ep6 -0x1.4p4 +REG esri:32748 0 0x1.a4p6 -0x1.9p4 +REG esri:32748 1 0x1.8deeb47e7a8d2p6 -0x1.ep4 +REG esri:32748 2 0x1.ba114b818572ep6 -0x1.ep4 +REG esri:32748 3 0x1.8deeb47e7a8d2p6 -0x1.4p4 +REG esri:32748 4 0x1.ba114b818572ep6 -0x1.4p4 +REG esri:32749 0 0x1.bcp6 -0x1.9p4 +REG esri:32749 1 0x1.a5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32749 2 0x1.d2114b818572ep6 -0x1.ep4 +REG esri:32749 3 0x1.a5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32749 4 0x1.d2114b818572ep6 -0x1.4p4 +REG esri:32750 0 0x1.d4p6 -0x1.9p4 +REG esri:32750 1 0x1.bdeeb47e7a8d2p6 -0x1.ep4 +REG esri:32750 2 0x1.ea114b818572ep6 -0x1.ep4 +REG esri:32750 3 0x1.bdeeb47e7a8d2p6 -0x1.4p4 +REG esri:32750 4 0x1.ea114b818572ep6 -0x1.4p4 +REG esri:32751 0 0x1.ecp6 -0x1.9p4 +REG esri:32751 1 0x1.d5eeb47e7a8d2p6 -0x1.ep4 +REG esri:32751 2 0x1.0108a5c0c2b97p7 -0x1.ep4 +REG esri:32751 3 0x1.d5eeb47e7a8d2p6 -0x1.4p4 +REG esri:32751 4 0x1.0108a5c0c2b97p7 -0x1.4p4 +REG esri:32752 0 0x1.02p7 -0x1.9p4 +REG esri:32752 1 0x1.edeeb47e7a8d2p6 -0x1.ep4 +REG esri:32752 2 0x1.0d08a5c0c2b97p7 -0x1.ep4 +REG esri:32752 3 0x1.edeeb47e7a8d2p6 -0x1.4p4 +REG esri:32752 4 0x1.0d08a5c0c2b97p7 -0x1.4p4 +REG esri:32753 0 0x1.0ep7 -0x1.9p4 +REG esri:32753 1 0x1.02f75a3f3d469p7 -0x1.ep4 +REG esri:32753 2 0x1.1908a5c0c2b97p7 -0x1.ep4 +REG esri:32753 3 0x1.02f75a3f3d469p7 -0x1.4p4 +REG esri:32753 4 0x1.1908a5c0c2b97p7 -0x1.4p4 +REG esri:32754 0 0x1.1ap7 -0x1.9p4 +REG esri:32754 1 0x1.0ef75a3f3d469p7 -0x1.ep4 +REG esri:32754 2 0x1.2508a5c0c2b97p7 -0x1.ep4 +REG esri:32754 3 0x1.0ef75a3f3d469p7 -0x1.4p4 +REG esri:32754 4 0x1.2508a5c0c2b97p7 -0x1.4p4 +REG esri:32755 0 0x1.26p7 -0x1.9p4 +REG esri:32755 1 0x1.1af75a3f3d469p7 -0x1.ep4 +REG esri:32755 2 0x1.3108a5c0c2b97p7 -0x1.ep4 +REG esri:32755 3 0x1.1af75a3f3d469p7 -0x1.4p4 +REG esri:32755 4 0x1.3108a5c0c2b97p7 -0x1.4p4 +REG esri:32756 0 0x1.32p7 -0x1.9p4 +REG esri:32756 1 0x1.26f75a3f3d469p7 -0x1.ep4 +REG esri:32756 2 0x1.3d08a5c0c2b97p7 -0x1.ep4 +REG esri:32756 3 0x1.26f75a3f3d469p7 -0x1.4p4 +REG esri:32756 4 0x1.3d08a5c0c2b97p7 -0x1.4p4 +REG esri:32757 0 0x1.3ep7 -0x1.9p4 +REG esri:32757 1 0x1.32f75a3f3d469p7 -0x1.ep4 +REG esri:32757 2 0x1.4908a5c0c2b97p7 -0x1.ep4 +REG esri:32757 3 0x1.32f75a3f3d469p7 -0x1.4p4 +REG esri:32757 4 0x1.4908a5c0c2b97p7 -0x1.4p4 +REG esri:32758 0 0x1.4ap7 -0x1.9p4 +REG esri:32758 1 0x1.3ef75a3f3d469p7 -0x1.ep4 +REG esri:32758 2 0x1.5508a5c0c2b97p7 -0x1.ep4 +REG esri:32758 3 0x1.3ef75a3f3d469p7 -0x1.4p4 +REG esri:32758 4 0x1.5508a5c0c2b97p7 -0x1.4p4 +REG esri:32759 0 0x1.56p7 -0x1.9p4 +REG esri:32759 1 0x1.4af75a3f3d469p7 -0x1.ep4 +REG esri:32759 2 0x1.6108a5c0c2b97p7 -0x1.ep4 +REG esri:32759 3 0x1.4af75a3f3d469p7 -0x1.4p4 +REG esri:32759 4 0x1.6108a5c0c2b97p7 -0x1.4p4 +REG esri:32760 0 0x1.62p7 -0x1.9p4 +REG esri:32760 1 0x1.56f75a3f3d469p7 -0x1.ep4 +REG esri:32760 2 -0x1.62f75a3f3d469p7 -0x1.ep4 +REG esri:32760 3 0x1.56f75a3f3d469p7 -0x1.4p4 +REG esri:32760 4 -0x1.62f75a3f3d469p7 -0x1.4p4 +REG esri:32761 0 0x0.0p0 -0x1.64p6 +REG esri:32761 1 -0x1.ep5 -0x1.64p6 +REG esri:32761 2 0x1.ep5 -0x1.64p6 +REG esri:32761 3 -0x1.ep5 -0x1.54p6 +REG esri:32761 4 0x1.ep5 -0x1.54p6 +REG esri:32766 0 0x1.2p5 0x0.0p0 +REG esri:32766 1 0x1.fp4 -0x1.4p2 +REG esri:32766 2 0x1.48p5 -0x1.4p2 +REG esri:32766 3 0x1.fp4 0x1.4p2 +REG esri:32766 4 0x1.48p5 0x1.4p2 +REG esri:3300 0 0x1.8p4 0x1.d3674efdabf16p5 +REG esri:3300 1 0x1.4883ca579082p4 0x1.c4e097a3ae7ebp5 +REG esri:3300 2 0x1.b77c35a86f7ep4 0x1.c4e097a3ae7ebp5 +REG esri:3300 3 0x1.4883ca579082p4 0x1.e1ee0657a9641p5 +REG esri:3300 4 0x1.b77c35a86f7ep4 0x1.e1ee0657a9641p5 +REG esri:3301 0 0x1.8p4 0x1.d3674efdabf16p5 +REG esri:3301 1 0x1.4883ca579082p4 0x1.c4e097a3ae7ebp5 +REG esri:3301 2 0x1.b77c35a86f7ep4 0x1.c4e097a3ae7ebp5 +REG esri:3301 3 0x1.4883ca579082p4 0x1.e1ee0657a9641p5 +REG esri:3301 4 0x1.b77c35a86f7ep4 0x1.e1ee0657a9641p5 +REG esri:3439 0 0x1.98p5 0x0.0p0 +REG esri:3439 1 0x1.7p5 -0x1.4p2 +REG esri:3439 2 0x1.cp5 -0x1.4p2 +REG esri:3439 3 0x1.7p5 0x1.4p2 +REG esri:3439 4 0x1.cp5 0x1.4p2 +REG esri:3440 0 0x1.c8p5 0x0.0p0 +REG esri:3440 1 0x1.ap5 -0x1.4p2 +REG esri:3440 2 0x1.fp5 -0x1.4p2 +REG esri:3440 3 0x1.ap5 0x1.4p2 +REG esri:3440 4 0x1.fp5 0x1.4p2 +REG esri:3561 0 -0x1.37p7 0x1.2d55555555554p4 +REG esri:3561 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaa8p3 +REG esri:3561 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaa8p3 +REG esri:3561 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555554p4 +REG esri:3561 4 -0x1.2c6f30534474bp7 0x1.7d55555555554p4 +REG esri:3562 0 -0x1.3955555555557p7 0x1.4555555555554p4 +REG esri:3562 1 -0x1.43ff74a3344c2p7 0x1.eaaaaaaaaaaa8p3 +REG esri:3562 2 -0x1.2eab3607765ecp7 0x1.eaaaaaaaaaaa8p3 +REG esri:3562 3 -0x1.43ff74a3344c2p7 0x1.9555555555554p4 +REG esri:3562 4 -0x1.2eab3607765ecp7 0x1.9555555555554p4 +REG esri:3563 0 -0x1.3cp7 0x1.52aaaaaaaaaacp4 +REG esri:3563 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaacp4 +REG esri:3563 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaacp4 +REG esri:3563 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaacp4 +REG esri:3563 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaacp4 +REG esri:3564 0 -0x1.3fp7 0x1.5d55555555554p4 +REG esri:3564 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555554p4 +REG esri:3564 2 -0x1.343a2e38cb648p7 0x1.0d55555555554p4 +REG esri:3564 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555554p4 +REG esri:3564 4 -0x1.343a2e38cb648p7 0x1.ad55555555554p4 +REG esri:3565 0 -0x1.4055555555557p7 0x1.5aaaaaaaaaaacp4 +REG esri:3565 1 -0x1.4b17f4409ffdcp7 0x1.0aaaaaaaaaaacp4 +REG esri:3565 2 -0x1.3592b66a0aad2p7 0x1.0aaaaaaaaaaacp4 +REG esri:3565 3 -0x1.4b17f4409ffdcp7 0x1.aaaaaaaaaaaacp4 +REG esri:3565 4 -0x1.3592b66a0aad2p7 0x1.aaaaaaaaaaaacp4 +REG esri:37001 0 0x0.0p0 0x0.0p0 +REG esri:37001 1 -0x1.4p2 -0x1.4p2 +REG esri:37001 2 0x1.4p2 -0x1.4p2 +REG esri:37001 3 -0x1.4p2 0x1.4p2 +REG esri:37001 4 0x1.4p2 0x1.4p2 +REG esri:37002 0 0x0.0p0 0x0.0p0 +REG esri:37002 1 -0x1.4p2 -0x1.4p2 +REG esri:37002 2 0x1.4p2 -0x1.4p2 +REG esri:37002 3 -0x1.4p2 0x1.4p2 +REG esri:37002 4 0x1.4p2 0x1.4p2 +REG esri:37003 0 0x0.0p0 0x0.0p0 +REG esri:37003 1 -0x1.4p2 -0x1.4p2 +REG esri:37003 2 0x1.4p2 -0x1.4p2 +REG esri:37003 3 -0x1.4p2 0x1.4p2 +REG esri:37003 4 0x1.4p2 0x1.4p2 +REG esri:37004 0 0x0.0p0 0x0.0p0 +REG esri:37004 1 -0x1.4p2 -0x1.4p2 +REG esri:37004 2 0x1.4p2 -0x1.4p2 +REG esri:37004 3 -0x1.4p2 0x1.4p2 +REG esri:37004 4 0x1.4p2 0x1.4p2 +REG esri:37005 0 0x0.0p0 0x0.0p0 +REG esri:37005 1 -0x1.4p2 -0x1.4p2 +REG esri:37005 2 0x1.4p2 -0x1.4p2 +REG esri:37005 3 -0x1.4p2 0x1.4p2 +REG esri:37005 4 0x1.4p2 0x1.4p2 +REG esri:37006 0 0x0.0p0 0x0.0p0 +REG esri:37006 1 -0x1.4p2 -0x1.4p2 +REG esri:37006 2 0x1.4p2 -0x1.4p2 +REG esri:37006 3 -0x1.4p2 0x1.4p2 +REG esri:37006 4 0x1.4p2 0x1.4p2 +REG esri:37007 0 0x0.0p0 0x0.0p0 +REG esri:37007 1 -0x1.4p2 -0x1.4p2 +REG esri:37007 2 0x1.4p2 -0x1.4p2 +REG esri:37007 3 -0x1.4p2 0x1.4p2 +REG esri:37007 4 0x1.4p2 0x1.4p2 +REG esri:37008 0 0x0.0p0 0x0.0p0 +REG esri:37008 1 -0x1.4p2 -0x1.4p2 +REG esri:37008 2 0x1.4p2 -0x1.4p2 +REG esri:37008 3 -0x1.4p2 0x1.4p2 +REG esri:37008 4 0x1.4p2 0x1.4p2 +REG esri:37201 0 0x0.0p0 0x0.0p0 +REG esri:37201 1 -0x1.4p2 -0x1.4p2 +REG esri:37201 2 0x1.4p2 -0x1.4p2 +REG esri:37201 3 -0x1.4p2 0x1.4p2 +REG esri:37201 4 0x1.4p2 0x1.4p2 +REG esri:37202 0 0x0.0p0 0x0.0p0 +REG esri:37202 1 -0x1.4p2 -0x1.4p2 +REG esri:37202 2 0x1.4p2 -0x1.4p2 +REG esri:37202 3 -0x1.4p2 0x1.4p2 +REG esri:37202 4 0x1.4p2 0x1.4p2 +REG esri:37203 0 0x0.0p0 0x0.0p0 +REG esri:37203 1 -0x1.4p2 -0x1.4p2 +REG esri:37203 2 0x1.4p2 -0x1.4p2 +REG esri:37203 3 -0x1.4p2 0x1.4p2 +REG esri:37203 4 0x1.4p2 0x1.4p2 +REG esri:37204 0 0x0.0p0 0x0.0p0 +REG esri:37204 1 -0x1.4p2 -0x1.4p2 +REG esri:37204 2 0x1.4p2 -0x1.4p2 +REG esri:37204 3 -0x1.4p2 0x1.4p2 +REG esri:37204 4 0x1.4p2 0x1.4p2 +REG esri:37205 0 0x0.0p0 0x0.0p0 +REG esri:37205 1 -0x1.4p2 -0x1.4p2 +REG esri:37205 2 0x1.4p2 -0x1.4p2 +REG esri:37205 3 -0x1.4p2 0x1.4p2 +REG esri:37205 4 0x1.4p2 0x1.4p2 +REG esri:37206 0 0x0.0p0 0x0.0p0 +REG esri:37206 1 -0x1.4p2 -0x1.4p2 +REG esri:37206 2 0x1.4p2 -0x1.4p2 +REG esri:37206 3 -0x1.4p2 0x1.4p2 +REG esri:37206 4 0x1.4p2 0x1.4p2 +REG esri:37207 0 0x0.0p0 0x0.0p0 +REG esri:37207 1 -0x1.4p2 -0x1.4p2 +REG esri:37207 2 0x1.4p2 -0x1.4p2 +REG esri:37207 3 -0x1.4p2 0x1.4p2 +REG esri:37207 4 0x1.4p2 0x1.4p2 +REG esri:37208 0 0x0.0p0 0x0.0p0 +REG esri:37208 1 -0x1.4p2 -0x1.4p2 +REG esri:37208 2 0x1.4p2 -0x1.4p2 +REG esri:37208 3 -0x1.4p2 0x1.4p2 +REG esri:37208 4 0x1.4p2 0x1.4p2 +REG esri:37211 0 0x0.0p0 0x0.0p0 +REG esri:37211 1 -0x1.4p2 -0x1.4p2 +REG esri:37211 2 0x1.4p2 -0x1.4p2 +REG esri:37211 3 -0x1.4p2 0x1.4p2 +REG esri:37211 4 0x1.4p2 0x1.4p2 +REG esri:37212 0 0x0.0p0 0x0.0p0 +REG esri:37212 1 -0x1.4p2 -0x1.4p2 +REG esri:37212 2 0x1.4p2 -0x1.4p2 +REG esri:37212 3 -0x1.4p2 0x1.4p2 +REG esri:37212 4 0x1.4p2 0x1.4p2 +REG esri:37213 0 0x0.0p0 0x0.0p0 +REG esri:37213 1 -0x1.4p2 -0x1.4p2 +REG esri:37213 2 0x1.4p2 -0x1.4p2 +REG esri:37213 3 -0x1.4p2 0x1.4p2 +REG esri:37213 4 0x1.4p2 0x1.4p2 +REG esri:37214 0 0x0.0p0 0x0.0p0 +REG esri:37214 1 -0x1.4p2 -0x1.4p2 +REG esri:37214 2 0x1.4p2 -0x1.4p2 +REG esri:37214 3 -0x1.4p2 0x1.4p2 +REG esri:37214 4 0x1.4p2 0x1.4p2 +REG esri:37215 0 0x0.0p0 0x0.0p0 +REG esri:37215 1 -0x1.4p2 -0x1.4p2 +REG esri:37215 2 0x1.4p2 -0x1.4p2 +REG esri:37215 3 -0x1.4p2 0x1.4p2 +REG esri:37215 4 0x1.4p2 0x1.4p2 +REG esri:37216 0 0x0.0p0 0x0.0p0 +REG esri:37216 1 -0x1.4p2 -0x1.4p2 +REG esri:37216 2 0x1.4p2 -0x1.4p2 +REG esri:37216 3 -0x1.4p2 0x1.4p2 +REG esri:37216 4 0x1.4p2 0x1.4p2 +REG esri:37217 0 0x0.0p0 0x0.0p0 +REG esri:37217 1 -0x1.4p2 -0x1.4p2 +REG esri:37217 2 0x1.4p2 -0x1.4p2 +REG esri:37217 3 -0x1.4p2 0x1.4p2 +REG esri:37217 4 0x1.4p2 0x1.4p2 +REG esri:37218 0 0x0.0p0 0x0.0p0 +REG esri:37218 1 -0x1.4p2 -0x1.4p2 +REG esri:37218 2 0x1.4p2 -0x1.4p2 +REG esri:37218 3 -0x1.4p2 0x1.4p2 +REG esri:37218 4 0x1.4p2 0x1.4p2 +REG esri:37219 0 0x0.0p0 0x0.0p0 +REG esri:37219 1 -0x1.4p2 -0x1.4p2 +REG esri:37219 2 0x1.4p2 -0x1.4p2 +REG esri:37219 3 -0x1.4p2 0x1.4p2 +REG esri:37219 4 0x1.4p2 0x1.4p2 +REG esri:37220 0 0x0.0p0 0x0.0p0 +REG esri:37220 1 -0x1.4p2 -0x1.4p2 +REG esri:37220 2 0x1.4p2 -0x1.4p2 +REG esri:37220 3 -0x1.4p2 0x1.4p2 +REG esri:37220 4 0x1.4p2 0x1.4p2 +REG esri:37221 0 0x0.0p0 0x0.0p0 +REG esri:37221 1 -0x1.4p2 -0x1.4p2 +REG esri:37221 2 0x1.4p2 -0x1.4p2 +REG esri:37221 3 -0x1.4p2 0x1.4p2 +REG esri:37221 4 0x1.4p2 0x1.4p2 +REG esri:37222 0 0x0.0p0 0x0.0p0 +REG esri:37222 1 -0x1.4p2 -0x1.4p2 +REG esri:37222 2 0x1.4p2 -0x1.4p2 +REG esri:37222 3 -0x1.4p2 0x1.4p2 +REG esri:37222 4 0x1.4p2 0x1.4p2 +REG esri:37223 0 0x0.0p0 0x0.0p0 +REG esri:37223 1 -0x1.4p2 -0x1.4p2 +REG esri:37223 2 0x1.4p2 -0x1.4p2 +REG esri:37223 3 -0x1.4p2 0x1.4p2 +REG esri:37223 4 0x1.4p2 0x1.4p2 +REG esri:37224 0 0x0.0p0 0x0.0p0 +REG esri:37224 1 -0x1.4p2 -0x1.4p2 +REG esri:37224 2 0x1.4p2 -0x1.4p2 +REG esri:37224 3 -0x1.4p2 0x1.4p2 +REG esri:37224 4 0x1.4p2 0x1.4p2 +REG esri:37226 0 0x0.0p0 0x0.0p0 +REG esri:37226 1 -0x1.4p2 -0x1.4p2 +REG esri:37226 2 0x1.4p2 -0x1.4p2 +REG esri:37226 3 -0x1.4p2 0x1.4p2 +REG esri:37226 4 0x1.4p2 0x1.4p2 +REG esri:37227 0 0x0.0p0 0x0.0p0 +REG esri:37227 1 -0x1.4p2 -0x1.4p2 +REG esri:37227 2 0x1.4p2 -0x1.4p2 +REG esri:37227 3 -0x1.4p2 0x1.4p2 +REG esri:37227 4 0x1.4p2 0x1.4p2 +REG esri:37228 0 0x0.0p0 0x0.0p0 +REG esri:37228 1 -0x1.4p2 -0x1.4p2 +REG esri:37228 2 0x1.4p2 -0x1.4p2 +REG esri:37228 3 -0x1.4p2 0x1.4p2 +REG esri:37228 4 0x1.4p2 0x1.4p2 +REG esri:37229 0 0x0.0p0 0x0.0p0 +REG esri:37229 1 -0x1.4p2 -0x1.4p2 +REG esri:37229 2 0x1.4p2 -0x1.4p2 +REG esri:37229 3 -0x1.4p2 0x1.4p2 +REG esri:37229 4 0x1.4p2 0x1.4p2 +REG esri:37230 0 0x0.0p0 0x0.0p0 +REG esri:37230 1 -0x1.4p2 -0x1.4p2 +REG esri:37230 2 0x1.4p2 -0x1.4p2 +REG esri:37230 3 -0x1.4p2 0x1.4p2 +REG esri:37230 4 0x1.4p2 0x1.4p2 +REG esri:37231 0 0x0.0p0 0x0.0p0 +REG esri:37231 1 -0x1.4p2 -0x1.4p2 +REG esri:37231 2 0x1.4p2 -0x1.4p2 +REG esri:37231 3 -0x1.4p2 0x1.4p2 +REG esri:37231 4 0x1.4p2 0x1.4p2 +REG esri:37232 0 0x0.0p0 0x0.0p0 +REG esri:37232 1 -0x1.4p2 -0x1.4p2 +REG esri:37232 2 0x1.4p2 -0x1.4p2 +REG esri:37232 3 -0x1.4p2 0x1.4p2 +REG esri:37232 4 0x1.4p2 0x1.4p2 +REG esri:37233 0 0x0.0p0 0x0.0p0 +REG esri:37233 1 -0x1.4p2 -0x1.4p2 +REG esri:37233 2 0x1.4p2 -0x1.4p2 +REG esri:37233 3 -0x1.4p2 0x1.4p2 +REG esri:37233 4 0x1.4p2 0x1.4p2 +REG esri:37234 0 0x0.0p0 0x0.0p0 +REG esri:37234 1 -0x1.4p2 -0x1.4p2 +REG esri:37234 2 0x1.4p2 -0x1.4p2 +REG esri:37234 3 -0x1.4p2 0x1.4p2 +REG esri:37234 4 0x1.4p2 0x1.4p2 +REG esri:37235 0 0x0.0p0 0x0.0p0 +REG esri:37235 1 -0x1.4p2 -0x1.4p2 +REG esri:37235 2 0x1.4p2 -0x1.4p2 +REG esri:37235 3 -0x1.4p2 0x1.4p2 +REG esri:37235 4 0x1.4p2 0x1.4p2 +REG esri:37237 0 0x0.0p0 0x0.0p0 +REG esri:37237 1 -0x1.4p2 -0x1.4p2 +REG esri:37237 2 0x1.4p2 -0x1.4p2 +REG esri:37237 3 -0x1.4p2 0x1.4p2 +REG esri:37237 4 0x1.4p2 0x1.4p2 +REG esri:37238 0 0x0.0p0 0x0.0p0 +REG esri:37238 1 -0x1.4p2 -0x1.4p2 +REG esri:37238 2 0x1.4p2 -0x1.4p2 +REG esri:37238 3 -0x1.4p2 0x1.4p2 +REG esri:37238 4 0x1.4p2 0x1.4p2 +REG esri:37239 0 0x0.0p0 0x0.0p0 +REG esri:37239 1 -0x1.4p2 -0x1.4p2 +REG esri:37239 2 0x1.4p2 -0x1.4p2 +REG esri:37239 3 -0x1.4p2 0x1.4p2 +REG esri:37239 4 0x1.4p2 0x1.4p2 +REG esri:37240 0 0x0.0p0 0x0.0p0 +REG esri:37240 1 -0x1.4p2 -0x1.4p2 +REG esri:37240 2 0x1.4p2 -0x1.4p2 +REG esri:37240 3 -0x1.4p2 0x1.4p2 +REG esri:37240 4 0x1.4p2 0x1.4p2 +REG esri:37241 0 0x0.0p0 0x0.0p0 +REG esri:37241 1 -0x1.4p2 -0x1.4p2 +REG esri:37241 2 0x1.4p2 -0x1.4p2 +REG esri:37241 3 -0x1.4p2 0x1.4p2 +REG esri:37241 4 0x1.4p2 0x1.4p2 +REG esri:37242 0 0x0.0p0 0x0.0p0 +REG esri:37242 1 -0x1.4p2 -0x1.4p2 +REG esri:37242 2 0x1.4p2 -0x1.4p2 +REG esri:37242 3 -0x1.4p2 0x1.4p2 +REG esri:37242 4 0x1.4p2 0x1.4p2 +REG esri:37243 0 0x0.0p0 0x0.0p0 +REG esri:37243 1 -0x1.4p2 -0x1.4p2 +REG esri:37243 2 0x1.4p2 -0x1.4p2 +REG esri:37243 3 -0x1.4p2 0x1.4p2 +REG esri:37243 4 0x1.4p2 0x1.4p2 +REG esri:37245 0 0x0.0p0 0x0.0p0 +REG esri:37245 1 -0x1.4p2 -0x1.4p2 +REG esri:37245 2 0x1.4p2 -0x1.4p2 +REG esri:37245 3 -0x1.4p2 0x1.4p2 +REG esri:37245 4 0x1.4p2 0x1.4p2 +REG esri:37246 0 0x0.0p0 0x0.0p0 +REG esri:37246 1 -0x1.4p2 -0x1.4p2 +REG esri:37246 2 0x1.4p2 -0x1.4p2 +REG esri:37246 3 -0x1.4p2 0x1.4p2 +REG esri:37246 4 0x1.4p2 0x1.4p2 +REG esri:37247 0 0x0.0p0 0x0.0p0 +REG esri:37247 1 -0x1.4p2 -0x1.4p2 +REG esri:37247 2 0x1.4p2 -0x1.4p2 +REG esri:37247 3 -0x1.4p2 0x1.4p2 +REG esri:37247 4 0x1.4p2 0x1.4p2 +REG esri:37249 0 0x0.0p0 0x0.0p0 +REG esri:37249 1 -0x1.4p2 -0x1.4p2 +REG esri:37249 2 0x1.4p2 -0x1.4p2 +REG esri:37249 3 -0x1.4p2 0x1.4p2 +REG esri:37249 4 0x1.4p2 0x1.4p2 +REG esri:37250 0 0x0.0p0 0x0.0p0 +REG esri:37250 1 -0x1.4p2 -0x1.4p2 +REG esri:37250 2 0x1.4p2 -0x1.4p2 +REG esri:37250 3 -0x1.4p2 0x1.4p2 +REG esri:37250 4 0x1.4p2 0x1.4p2 +REG esri:37251 0 0x0.0p0 0x0.0p0 +REG esri:37251 1 -0x1.4p2 -0x1.4p2 +REG esri:37251 2 0x1.4p2 -0x1.4p2 +REG esri:37251 3 -0x1.4p2 0x1.4p2 +REG esri:37251 4 0x1.4p2 0x1.4p2 +REG esri:37252 0 0x0.0p0 0x0.0p0 +REG esri:37252 1 -0x1.4p2 -0x1.4p2 +REG esri:37252 2 0x1.4p2 -0x1.4p2 +REG esri:37252 3 -0x1.4p2 0x1.4p2 +REG esri:37252 4 0x1.4p2 0x1.4p2 +REG esri:37253 0 0x0.0p0 0x0.0p0 +REG esri:37253 1 -0x1.4p2 -0x1.4p2 +REG esri:37253 2 0x1.4p2 -0x1.4p2 +REG esri:37253 3 -0x1.4p2 0x1.4p2 +REG esri:37253 4 0x1.4p2 0x1.4p2 +REG esri:37254 0 0x0.0p0 0x0.0p0 +REG esri:37254 1 -0x1.4p2 -0x1.4p2 +REG esri:37254 2 0x1.4p2 -0x1.4p2 +REG esri:37254 3 -0x1.4p2 0x1.4p2 +REG esri:37254 4 0x1.4p2 0x1.4p2 +REG esri:37255 0 0x0.0p0 0x0.0p0 +REG esri:37255 1 -0x1.4p2 -0x1.4p2 +REG esri:37255 2 0x1.4p2 -0x1.4p2 +REG esri:37255 3 -0x1.4p2 0x1.4p2 +REG esri:37255 4 0x1.4p2 0x1.4p2 +REG esri:37257 0 0x0.0p0 0x0.0p0 +REG esri:37257 1 -0x1.4p2 -0x1.4p2 +REG esri:37257 2 0x1.4p2 -0x1.4p2 +REG esri:37257 3 -0x1.4p2 0x1.4p2 +REG esri:37257 4 0x1.4p2 0x1.4p2 +REG esri:37259 0 0x0.0p0 0x0.0p0 +REG esri:37259 1 -0x1.4p2 -0x1.4p2 +REG esri:37259 2 0x1.4p2 -0x1.4p2 +REG esri:37259 3 -0x1.4p2 0x1.4p2 +REG esri:37259 4 0x1.4p2 0x1.4p2 +REG esri:37260 0 0x0.0p0 0x0.0p0 +REG esri:37260 1 -0x1.4p2 -0x1.4p2 +REG esri:37260 2 0x1.4p2 -0x1.4p2 +REG esri:37260 3 -0x1.4p2 0x1.4p2 +REG esri:37260 4 0x1.4p2 0x1.4p2 +REG esri:3920 0 -0x1.f8p5 0x0.0p0 +REG esri:3920 1 -0x1.1p6 -0x1.4p2 +REG esri:3920 2 -0x1.dp5 -0x1.4p2 +REG esri:3920 3 -0x1.1p6 0x1.4p2 +REG esri:3920 4 -0x1.dp5 0x1.4p2 +REG esri:3991 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:3991 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:3991 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:3991 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:3991 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:3992 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222221p4 +REG esri:3992 1 -0x1.0df13f90a9095p6 0x1.1222222222221p4 +REG esri:3992 2 -0x1.058637e6ce6e3p6 0x1.1222222222221p4 +REG esri:3992 3 -0x1.0df13f90a9095p6 0x1.3222222222221p4 +REG esri:3992 4 -0x1.058637e6ce6e3p6 0x1.3222222222221p4 +REG esri:4001 0 0x0.0p0 0x0.0p0 +REG esri:4001 1 -0x1.4p2 -0x1.4p2 +REG esri:4001 2 0x1.4p2 -0x1.4p2 +REG esri:4001 3 -0x1.4p2 0x1.4p2 +REG esri:4001 4 0x1.4p2 0x1.4p2 +REG esri:4002 0 0x0.0p0 0x0.0p0 +REG esri:4002 1 -0x1.4p2 -0x1.4p2 +REG esri:4002 2 0x1.4p2 -0x1.4p2 +REG esri:4002 3 -0x1.4p2 0x1.4p2 +REG esri:4002 4 0x1.4p2 0x1.4p2 +REG esri:4003 0 0x0.0p0 0x0.0p0 +REG esri:4003 1 -0x1.4p2 -0x1.4p2 +REG esri:4003 2 0x1.4p2 -0x1.4p2 +REG esri:4003 3 -0x1.4p2 0x1.4p2 +REG esri:4003 4 0x1.4p2 0x1.4p2 +REG esri:4004 0 0x0.0p0 0x0.0p0 +REG esri:4004 1 -0x1.4p2 -0x1.4p2 +REG esri:4004 2 0x1.4p2 -0x1.4p2 +REG esri:4004 3 -0x1.4p2 0x1.4p2 +REG esri:4004 4 0x1.4p2 0x1.4p2 +REG esri:4005 0 0x0.0p0 0x0.0p0 +REG esri:4005 1 -0x1.4p2 -0x1.4p2 +REG esri:4005 2 0x1.4p2 -0x1.4p2 +REG esri:4005 3 -0x1.4p2 0x1.4p2 +REG esri:4005 4 0x1.4p2 0x1.4p2 +REG esri:4006 0 0x0.0p0 0x0.0p0 +REG esri:4006 1 -0x1.4p2 -0x1.4p2 +REG esri:4006 2 0x1.4p2 -0x1.4p2 +REG esri:4006 3 -0x1.4p2 0x1.4p2 +REG esri:4006 4 0x1.4p2 0x1.4p2 +REG esri:4007 0 0x0.0p0 0x0.0p0 +REG esri:4007 1 -0x1.4p2 -0x1.4p2 +REG esri:4007 2 0x1.4p2 -0x1.4p2 +REG esri:4007 3 -0x1.4p2 0x1.4p2 +REG esri:4007 4 0x1.4p2 0x1.4p2 +REG esri:4008 0 0x0.0p0 0x0.0p0 +REG esri:4008 1 -0x1.4p2 -0x1.4p2 +REG esri:4008 2 0x1.4p2 -0x1.4p2 +REG esri:4008 3 -0x1.4p2 0x1.4p2 +REG esri:4008 4 0x1.4p2 0x1.4p2 +REG esri:4009 0 0x0.0p0 0x0.0p0 +REG esri:4009 1 -0x1.4p2 -0x1.4p2 +REG esri:4009 2 0x1.4p2 -0x1.4p2 +REG esri:4009 3 -0x1.4p2 0x1.4p2 +REG esri:4009 4 0x1.4p2 0x1.4p2 +REG esri:4010 0 0x0.0p0 0x0.0p0 +REG esri:4010 1 -0x1.4p2 -0x1.4p2 +REG esri:4010 2 0x1.4p2 -0x1.4p2 +REG esri:4010 3 -0x1.4p2 0x1.4p2 +REG esri:4010 4 0x1.4p2 0x1.4p2 +REG esri:4011 0 0x0.0p0 0x0.0p0 +REG esri:4011 1 -0x1.4p2 -0x1.4p2 +REG esri:4011 2 0x1.4p2 -0x1.4p2 +REG esri:4011 3 -0x1.4p2 0x1.4p2 +REG esri:4011 4 0x1.4p2 0x1.4p2 +REG esri:4012 0 0x0.0p0 0x0.0p0 +REG esri:4012 1 -0x1.4p2 -0x1.4p2 +REG esri:4012 2 0x1.4p2 -0x1.4p2 +REG esri:4012 3 -0x1.4p2 0x1.4p2 +REG esri:4012 4 0x1.4p2 0x1.4p2 +REG esri:4013 0 0x0.0p0 0x0.0p0 +REG esri:4013 1 -0x1.4p2 -0x1.4p2 +REG esri:4013 2 0x1.4p2 -0x1.4p2 +REG esri:4013 3 -0x1.4p2 0x1.4p2 +REG esri:4013 4 0x1.4p2 0x1.4p2 +REG esri:4014 0 0x0.0p0 0x0.0p0 +REG esri:4014 1 -0x1.4p2 -0x1.4p2 +REG esri:4014 2 0x1.4p2 -0x1.4p2 +REG esri:4014 3 -0x1.4p2 0x1.4p2 +REG esri:4014 4 0x1.4p2 0x1.4p2 +REG esri:4015 0 0x0.0p0 0x0.0p0 +REG esri:4015 1 -0x1.4p2 -0x1.4p2 +REG esri:4015 2 0x1.4p2 -0x1.4p2 +REG esri:4015 3 -0x1.4p2 0x1.4p2 +REG esri:4015 4 0x1.4p2 0x1.4p2 +REG esri:4016 0 0x0.0p0 0x0.0p0 +REG esri:4016 1 -0x1.4p2 -0x1.4p2 +REG esri:4016 2 0x1.4p2 -0x1.4p2 +REG esri:4016 3 -0x1.4p2 0x1.4p2 +REG esri:4016 4 0x1.4p2 0x1.4p2 +REG esri:4018 0 0x0.0p0 0x0.0p0 +REG esri:4018 1 -0x1.4p2 -0x1.4p2 +REG esri:4018 2 0x1.4p2 -0x1.4p2 +REG esri:4018 3 -0x1.4p2 0x1.4p2 +REG esri:4018 4 0x1.4p2 0x1.4p2 +REG esri:4019 0 0x0.0p0 0x0.0p0 +REG esri:4019 1 -0x1.4p2 -0x1.4p2 +REG esri:4019 2 0x1.4p2 -0x1.4p2 +REG esri:4019 3 -0x1.4p2 0x1.4p2 +REG esri:4019 4 0x1.4p2 0x1.4p2 +REG esri:4020 0 0x0.0p0 0x0.0p0 +REG esri:4020 1 -0x1.4p2 -0x1.4p2 +REG esri:4020 2 0x1.4p2 -0x1.4p2 +REG esri:4020 3 -0x1.4p2 0x1.4p2 +REG esri:4020 4 0x1.4p2 0x1.4p2 +REG esri:4021 0 0x0.0p0 0x0.0p0 +REG esri:4021 1 -0x1.4p2 -0x1.4p2 +REG esri:4021 2 0x1.4p2 -0x1.4p2 +REG esri:4021 3 -0x1.4p2 0x1.4p2 +REG esri:4021 4 0x1.4p2 0x1.4p2 +REG esri:4022 0 0x0.0p0 0x0.0p0 +REG esri:4022 1 -0x1.4p2 -0x1.4p2 +REG esri:4022 2 0x1.4p2 -0x1.4p2 +REG esri:4022 3 -0x1.4p2 0x1.4p2 +REG esri:4022 4 0x1.4p2 0x1.4p2 +REG esri:4023 0 0x0.0p0 0x0.0p0 +REG esri:4023 1 -0x1.4p2 -0x1.4p2 +REG esri:4023 2 0x1.4p2 -0x1.4p2 +REG esri:4023 3 -0x1.4p2 0x1.4p2 +REG esri:4023 4 0x1.4p2 0x1.4p2 +REG esri:4024 0 0x0.0p0 0x0.0p0 +REG esri:4024 1 -0x1.4p2 -0x1.4p2 +REG esri:4024 2 0x1.4p2 -0x1.4p2 +REG esri:4024 3 -0x1.4p2 0x1.4p2 +REG esri:4024 4 0x1.4p2 0x1.4p2 +REG esri:4025 0 0x0.0p0 0x0.0p0 +REG esri:4025 1 -0x1.4p2 -0x1.4p2 +REG esri:4025 2 0x1.4p2 -0x1.4p2 +REG esri:4025 3 -0x1.4p2 0x1.4p2 +REG esri:4025 4 0x1.4p2 0x1.4p2 +REG esri:4027 0 0x0.0p0 0x0.0p0 +REG esri:4027 1 -0x1.4p2 -0x1.4p2 +REG esri:4027 2 0x1.4p2 -0x1.4p2 +REG esri:4027 3 -0x1.4p2 0x1.4p2 +REG esri:4027 4 0x1.4p2 0x1.4p2 +REG esri:4028 0 0x0.0p0 0x0.0p0 +REG esri:4028 1 -0x1.4p2 -0x1.4p2 +REG esri:4028 2 0x1.4p2 -0x1.4p2 +REG esri:4028 3 -0x1.4p2 0x1.4p2 +REG esri:4028 4 0x1.4p2 0x1.4p2 +REG esri:4029 0 0x0.0p0 0x0.0p0 +REG esri:4029 1 -0x1.4p2 -0x1.4p2 +REG esri:4029 2 0x1.4p2 -0x1.4p2 +REG esri:4029 3 -0x1.4p2 0x1.4p2 +REG esri:4029 4 0x1.4p2 0x1.4p2 +REG esri:4030 0 0x0.0p0 0x0.0p0 +REG esri:4030 1 -0x1.4p2 -0x1.4p2 +REG esri:4030 2 0x1.4p2 -0x1.4p2 +REG esri:4030 3 -0x1.4p2 0x1.4p2 +REG esri:4030 4 0x1.4p2 0x1.4p2 +REG esri:4031 0 0x0.0p0 0x0.0p0 +REG esri:4031 1 -0x1.4p2 -0x1.4p2 +REG esri:4031 2 0x1.4p2 -0x1.4p2 +REG esri:4031 3 -0x1.4p2 0x1.4p2 +REG esri:4031 4 0x1.4p2 0x1.4p2 +REG esri:4032 0 0x0.0p0 0x0.0p0 +REG esri:4032 1 -0x1.4p2 -0x1.4p2 +REG esri:4032 2 0x1.4p2 -0x1.4p2 +REG esri:4032 3 -0x1.4p2 0x1.4p2 +REG esri:4032 4 0x1.4p2 0x1.4p2 +REG esri:4033 0 0x0.0p0 0x0.0p0 +REG esri:4033 1 -0x1.4p2 -0x1.4p2 +REG esri:4033 2 0x1.4p2 -0x1.4p2 +REG esri:4033 3 -0x1.4p2 0x1.4p2 +REG esri:4033 4 0x1.4p2 0x1.4p2 +REG esri:4034 0 0x0.0p0 0x0.0p0 +REG esri:4034 1 -0x1.4p2 -0x1.4p2 +REG esri:4034 2 0x1.4p2 -0x1.4p2 +REG esri:4034 3 -0x1.4p2 0x1.4p2 +REG esri:4034 4 0x1.4p2 0x1.4p2 +REG esri:4035 0 0x0.0p0 0x0.0p0 +REG esri:4035 1 -0x1.4p2 -0x1.4p2 +REG esri:4035 2 0x1.4p2 -0x1.4p2 +REG esri:4035 3 -0x1.4p2 0x1.4p2 +REG esri:4035 4 0x1.4p2 0x1.4p2 +REG esri:4036 0 0x0.0p0 0x0.0p0 +REG esri:4036 1 -0x1.4p2 -0x1.4p2 +REG esri:4036 2 0x1.4p2 -0x1.4p2 +REG esri:4036 3 -0x1.4p2 0x1.4p2 +REG esri:4036 4 0x1.4p2 0x1.4p2 +REG esri:4041 0 0x0.0p0 0x0.0p0 +REG esri:4041 1 -0x1.4p2 -0x1.4p2 +REG esri:4041 2 0x1.4p2 -0x1.4p2 +REG esri:4041 3 -0x1.4p2 0x1.4p2 +REG esri:4041 4 0x1.4p2 0x1.4p2 +REG esri:4042 0 0x0.0p0 0x0.0p0 +REG esri:4042 1 -0x1.4p2 -0x1.4p2 +REG esri:4042 2 0x1.4p2 -0x1.4p2 +REG esri:4042 3 -0x1.4p2 0x1.4p2 +REG esri:4042 4 0x1.4p2 0x1.4p2 +REG esri:4043 0 0x0.0p0 0x0.0p0 +REG esri:4043 1 -0x1.4p2 -0x1.4p2 +REG esri:4043 2 0x1.4p2 -0x1.4p2 +REG esri:4043 3 -0x1.4p2 0x1.4p2 +REG esri:4043 4 0x1.4p2 0x1.4p2 +REG esri:4044 0 0x0.0p0 0x0.0p0 +REG esri:4044 1 -0x1.4p2 -0x1.4p2 +REG esri:4044 2 0x1.4p2 -0x1.4p2 +REG esri:4044 3 -0x1.4p2 0x1.4p2 +REG esri:4044 4 0x1.4p2 0x1.4p2 +REG esri:4045 0 0x0.0p0 0x0.0p0 +REG esri:4045 1 -0x1.4p2 -0x1.4p2 +REG esri:4045 2 0x1.4p2 -0x1.4p2 +REG esri:4045 3 -0x1.4p2 0x1.4p2 +REG esri:4045 4 0x1.4p2 0x1.4p2 +REG esri:4047 0 0x0.0p0 0x0.0p0 +REG esri:4047 1 -0x1.4p2 -0x1.4p2 +REG esri:4047 2 0x1.4p2 -0x1.4p2 +REG esri:4047 3 -0x1.4p2 0x1.4p2 +REG esri:4047 4 0x1.4p2 0x1.4p2 +REG esri:4120 0 0x0.0p0 0x0.0p0 +REG esri:4120 1 -0x1.4p2 -0x1.4p2 +REG esri:4120 2 0x1.4p2 -0x1.4p2 +REG esri:4120 3 -0x1.4p2 0x1.4p2 +REG esri:4120 4 0x1.4p2 0x1.4p2 +REG esri:4121 0 0x0.0p0 0x0.0p0 +REG esri:4121 1 -0x1.4p2 -0x1.4p2 +REG esri:4121 2 0x1.4p2 -0x1.4p2 +REG esri:4121 3 -0x1.4p2 0x1.4p2 +REG esri:4121 4 0x1.4p2 0x1.4p2 +REG esri:4122 0 0x0.0p0 0x0.0p0 +REG esri:4122 1 -0x1.4p2 -0x1.4p2 +REG esri:4122 2 0x1.4p2 -0x1.4p2 +REG esri:4122 3 -0x1.4p2 0x1.4p2 +REG esri:4122 4 0x1.4p2 0x1.4p2 +REG esri:4123 0 0x0.0p0 0x0.0p0 +REG esri:4123 1 -0x1.4p2 -0x1.4p2 +REG esri:4123 2 0x1.4p2 -0x1.4p2 +REG esri:4123 3 -0x1.4p2 0x1.4p2 +REG esri:4123 4 0x1.4p2 0x1.4p2 +REG esri:4124 0 0x0.0p0 0x0.0p0 +REG esri:4124 1 -0x1.4p2 -0x1.4p2 +REG esri:4124 2 0x1.4p2 -0x1.4p2 +REG esri:4124 3 -0x1.4p2 0x1.4p2 +REG esri:4124 4 0x1.4p2 0x1.4p2 +REG esri:4125 0 0x0.0p0 0x0.0p0 +REG esri:4125 1 -0x1.4p2 -0x1.4p2 +REG esri:4125 2 0x1.4p2 -0x1.4p2 +REG esri:4125 3 -0x1.4p2 0x1.4p2 +REG esri:4125 4 0x1.4p2 0x1.4p2 +REG esri:4126 0 0x0.0p0 0x0.0p0 +REG esri:4126 1 -0x1.4p2 -0x1.4p2 +REG esri:4126 2 0x1.4p2 -0x1.4p2 +REG esri:4126 3 -0x1.4p2 0x1.4p2 +REG esri:4126 4 0x1.4p2 0x1.4p2 +REG esri:4127 0 0x0.0p0 0x0.0p0 +REG esri:4127 1 -0x1.4p2 -0x1.4p2 +REG esri:4127 2 0x1.4p2 -0x1.4p2 +REG esri:4127 3 -0x1.4p2 0x1.4p2 +REG esri:4127 4 0x1.4p2 0x1.4p2 +REG esri:4128 0 0x0.0p0 0x0.0p0 +REG esri:4128 1 -0x1.4p2 -0x1.4p2 +REG esri:4128 2 0x1.4p2 -0x1.4p2 +REG esri:4128 3 -0x1.4p2 0x1.4p2 +REG esri:4128 4 0x1.4p2 0x1.4p2 +REG esri:4129 0 0x0.0p0 0x0.0p0 +REG esri:4129 1 -0x1.4p2 -0x1.4p2 +REG esri:4129 2 0x1.4p2 -0x1.4p2 +REG esri:4129 3 -0x1.4p2 0x1.4p2 +REG esri:4129 4 0x1.4p2 0x1.4p2 +REG esri:4130 0 0x0.0p0 0x0.0p0 +REG esri:4130 1 -0x1.4p2 -0x1.4p2 +REG esri:4130 2 0x1.4p2 -0x1.4p2 +REG esri:4130 3 -0x1.4p2 0x1.4p2 +REG esri:4130 4 0x1.4p2 0x1.4p2 +REG esri:4131 0 0x0.0p0 0x0.0p0 +REG esri:4131 1 -0x1.4p2 -0x1.4p2 +REG esri:4131 2 0x1.4p2 -0x1.4p2 +REG esri:4131 3 -0x1.4p2 0x1.4p2 +REG esri:4131 4 0x1.4p2 0x1.4p2 +REG esri:4132 0 0x0.0p0 0x0.0p0 +REG esri:4132 1 -0x1.4p2 -0x1.4p2 +REG esri:4132 2 0x1.4p2 -0x1.4p2 +REG esri:4132 3 -0x1.4p2 0x1.4p2 +REG esri:4132 4 0x1.4p2 0x1.4p2 +REG esri:4133 0 0x0.0p0 0x0.0p0 +REG esri:4133 1 -0x1.4p2 -0x1.4p2 +REG esri:4133 2 0x1.4p2 -0x1.4p2 +REG esri:4133 3 -0x1.4p2 0x1.4p2 +REG esri:4133 4 0x1.4p2 0x1.4p2 +REG esri:4134 0 0x0.0p0 0x0.0p0 +REG esri:4134 1 -0x1.4p2 -0x1.4p2 +REG esri:4134 2 0x1.4p2 -0x1.4p2 +REG esri:4134 3 -0x1.4p2 0x1.4p2 +REG esri:4134 4 0x1.4p2 0x1.4p2 +REG esri:4135 0 0x0.0p0 0x0.0p0 +REG esri:4135 1 -0x1.4p2 -0x1.4p2 +REG esri:4135 2 0x1.4p2 -0x1.4p2 +REG esri:4135 3 -0x1.4p2 0x1.4p2 +REG esri:4135 4 0x1.4p2 0x1.4p2 +REG esri:4136 0 0x0.0p0 0x0.0p0 +REG esri:4136 1 -0x1.4p2 -0x1.4p2 +REG esri:4136 2 0x1.4p2 -0x1.4p2 +REG esri:4136 3 -0x1.4p2 0x1.4p2 +REG esri:4136 4 0x1.4p2 0x1.4p2 +REG esri:4137 0 0x0.0p0 0x0.0p0 +REG esri:4137 1 -0x1.4p2 -0x1.4p2 +REG esri:4137 2 0x1.4p2 -0x1.4p2 +REG esri:4137 3 -0x1.4p2 0x1.4p2 +REG esri:4137 4 0x1.4p2 0x1.4p2 +REG esri:4138 0 0x0.0p0 0x0.0p0 +REG esri:4138 1 -0x1.4p2 -0x1.4p2 +REG esri:4138 2 0x1.4p2 -0x1.4p2 +REG esri:4138 3 -0x1.4p2 0x1.4p2 +REG esri:4138 4 0x1.4p2 0x1.4p2 +REG esri:4139 0 0x0.0p0 0x0.0p0 +REG esri:4139 1 -0x1.4p2 -0x1.4p2 +REG esri:4139 2 0x1.4p2 -0x1.4p2 +REG esri:4139 3 -0x1.4p2 0x1.4p2 +REG esri:4139 4 0x1.4p2 0x1.4p2 +REG esri:4140 0 0x0.0p0 0x0.0p0 +REG esri:4140 1 -0x1.4p2 -0x1.4p2 +REG esri:4140 2 0x1.4p2 -0x1.4p2 +REG esri:4140 3 -0x1.4p2 0x1.4p2 +REG esri:4140 4 0x1.4p2 0x1.4p2 +REG esri:4141 0 0x0.0p0 0x0.0p0 +REG esri:4141 1 -0x1.4p2 -0x1.4p2 +REG esri:4141 2 0x1.4p2 -0x1.4p2 +REG esri:4141 3 -0x1.4p2 0x1.4p2 +REG esri:4141 4 0x1.4p2 0x1.4p2 +REG esri:4142 0 0x0.0p0 0x0.0p0 +REG esri:4142 1 -0x1.4p2 -0x1.4p2 +REG esri:4142 2 0x1.4p2 -0x1.4p2 +REG esri:4142 3 -0x1.4p2 0x1.4p2 +REG esri:4142 4 0x1.4p2 0x1.4p2 +REG esri:4143 0 0x0.0p0 0x0.0p0 +REG esri:4143 1 -0x1.4p2 -0x1.4p2 +REG esri:4143 2 0x1.4p2 -0x1.4p2 +REG esri:4143 3 -0x1.4p2 0x1.4p2 +REG esri:4143 4 0x1.4p2 0x1.4p2 +REG esri:4144 0 0x0.0p0 0x0.0p0 +REG esri:4144 1 -0x1.4p2 -0x1.4p2 +REG esri:4144 2 0x1.4p2 -0x1.4p2 +REG esri:4144 3 -0x1.4p2 0x1.4p2 +REG esri:4144 4 0x1.4p2 0x1.4p2 +REG esri:4145 0 0x0.0p0 0x0.0p0 +REG esri:4145 1 -0x1.4p2 -0x1.4p2 +REG esri:4145 2 0x1.4p2 -0x1.4p2 +REG esri:4145 3 -0x1.4p2 0x1.4p2 +REG esri:4145 4 0x1.4p2 0x1.4p2 +REG esri:4146 0 0x0.0p0 0x0.0p0 +REG esri:4146 1 -0x1.4p2 -0x1.4p2 +REG esri:4146 2 0x1.4p2 -0x1.4p2 +REG esri:4146 3 -0x1.4p2 0x1.4p2 +REG esri:4146 4 0x1.4p2 0x1.4p2 +REG esri:4147 0 0x0.0p0 0x0.0p0 +REG esri:4147 1 -0x1.4p2 -0x1.4p2 +REG esri:4147 2 0x1.4p2 -0x1.4p2 +REG esri:4147 3 -0x1.4p2 0x1.4p2 +REG esri:4147 4 0x1.4p2 0x1.4p2 +REG esri:4148 0 0x0.0p0 0x0.0p0 +REG esri:4148 1 -0x1.4p2 -0x1.4p2 +REG esri:4148 2 0x1.4p2 -0x1.4p2 +REG esri:4148 3 -0x1.4p2 0x1.4p2 +REG esri:4148 4 0x1.4p2 0x1.4p2 +REG esri:4149 0 0x0.0p0 0x0.0p0 +REG esri:4149 1 -0x1.4p2 -0x1.4p2 +REG esri:4149 2 0x1.4p2 -0x1.4p2 +REG esri:4149 3 -0x1.4p2 0x1.4p2 +REG esri:4149 4 0x1.4p2 0x1.4p2 +REG esri:4150 0 0x0.0p0 0x0.0p0 +REG esri:4150 1 -0x1.4p2 -0x1.4p2 +REG esri:4150 2 0x1.4p2 -0x1.4p2 +REG esri:4150 3 -0x1.4p2 0x1.4p2 +REG esri:4150 4 0x1.4p2 0x1.4p2 +REG esri:4151 0 0x0.0p0 0x0.0p0 +REG esri:4151 1 -0x1.4p2 -0x1.4p2 +REG esri:4151 2 0x1.4p2 -0x1.4p2 +REG esri:4151 3 -0x1.4p2 0x1.4p2 +REG esri:4151 4 0x1.4p2 0x1.4p2 +REG esri:4152 0 0x0.0p0 0x0.0p0 +REG esri:4152 1 -0x1.4p2 -0x1.4p2 +REG esri:4152 2 0x1.4p2 -0x1.4p2 +REG esri:4152 3 -0x1.4p2 0x1.4p2 +REG esri:4152 4 0x1.4p2 0x1.4p2 +REG esri:4153 0 0x0.0p0 0x0.0p0 +REG esri:4153 1 -0x1.4p2 -0x1.4p2 +REG esri:4153 2 0x1.4p2 -0x1.4p2 +REG esri:4153 3 -0x1.4p2 0x1.4p2 +REG esri:4153 4 0x1.4p2 0x1.4p2 +REG esri:4154 0 0x0.0p0 0x0.0p0 +REG esri:4154 1 -0x1.4p2 -0x1.4p2 +REG esri:4154 2 0x1.4p2 -0x1.4p2 +REG esri:4154 3 -0x1.4p2 0x1.4p2 +REG esri:4154 4 0x1.4p2 0x1.4p2 +REG esri:4155 0 0x0.0p0 0x0.0p0 +REG esri:4155 1 -0x1.4p2 -0x1.4p2 +REG esri:4155 2 0x1.4p2 -0x1.4p2 +REG esri:4155 3 -0x1.4p2 0x1.4p2 +REG esri:4155 4 0x1.4p2 0x1.4p2 +REG esri:4156 0 0x0.0p0 0x0.0p0 +REG esri:4156 1 -0x1.4p2 -0x1.4p2 +REG esri:4156 2 0x1.4p2 -0x1.4p2 +REG esri:4156 3 -0x1.4p2 0x1.4p2 +REG esri:4156 4 0x1.4p2 0x1.4p2 +REG esri:4157 0 0x0.0p0 0x0.0p0 +REG esri:4157 1 -0x1.4p2 -0x1.4p2 +REG esri:4157 2 0x1.4p2 -0x1.4p2 +REG esri:4157 3 -0x1.4p2 0x1.4p2 +REG esri:4157 4 0x1.4p2 0x1.4p2 +REG esri:4158 0 0x0.0p0 0x0.0p0 +REG esri:4158 1 -0x1.4p2 -0x1.4p2 +REG esri:4158 2 0x1.4p2 -0x1.4p2 +REG esri:4158 3 -0x1.4p2 0x1.4p2 +REG esri:4158 4 0x1.4p2 0x1.4p2 +REG esri:4159 0 0x0.0p0 0x0.0p0 +REG esri:4159 1 -0x1.4p2 -0x1.4p2 +REG esri:4159 2 0x1.4p2 -0x1.4p2 +REG esri:4159 3 -0x1.4p2 0x1.4p2 +REG esri:4159 4 0x1.4p2 0x1.4p2 +REG esri:4160 0 0x0.0p0 0x0.0p0 +REG esri:4160 1 -0x1.4p2 -0x1.4p2 +REG esri:4160 2 0x1.4p2 -0x1.4p2 +REG esri:4160 3 -0x1.4p2 0x1.4p2 +REG esri:4160 4 0x1.4p2 0x1.4p2 +REG esri:4161 0 0x0.0p0 0x0.0p0 +REG esri:4161 1 -0x1.4p2 -0x1.4p2 +REG esri:4161 2 0x1.4p2 -0x1.4p2 +REG esri:4161 3 -0x1.4p2 0x1.4p2 +REG esri:4161 4 0x1.4p2 0x1.4p2 +REG esri:4162 0 0x0.0p0 0x0.0p0 +REG esri:4162 1 -0x1.4p2 -0x1.4p2 +REG esri:4162 2 0x1.4p2 -0x1.4p2 +REG esri:4162 3 -0x1.4p2 0x1.4p2 +REG esri:4162 4 0x1.4p2 0x1.4p2 +REG esri:4163 0 0x0.0p0 0x0.0p0 +REG esri:4163 1 -0x1.4p2 -0x1.4p2 +REG esri:4163 2 0x1.4p2 -0x1.4p2 +REG esri:4163 3 -0x1.4p2 0x1.4p2 +REG esri:4163 4 0x1.4p2 0x1.4p2 +REG esri:4164 0 0x0.0p0 0x0.0p0 +REG esri:4164 1 -0x1.4p2 -0x1.4p2 +REG esri:4164 2 0x1.4p2 -0x1.4p2 +REG esri:4164 3 -0x1.4p2 0x1.4p2 +REG esri:4164 4 0x1.4p2 0x1.4p2 +REG esri:4165 0 0x0.0p0 0x0.0p0 +REG esri:4165 1 -0x1.4p2 -0x1.4p2 +REG esri:4165 2 0x1.4p2 -0x1.4p2 +REG esri:4165 3 -0x1.4p2 0x1.4p2 +REG esri:4165 4 0x1.4p2 0x1.4p2 +REG esri:4166 0 0x0.0p0 0x0.0p0 +REG esri:4166 1 -0x1.4p2 -0x1.4p2 +REG esri:4166 2 0x1.4p2 -0x1.4p2 +REG esri:4166 3 -0x1.4p2 0x1.4p2 +REG esri:4166 4 0x1.4p2 0x1.4p2 +REG esri:4167 0 0x0.0p0 0x0.0p0 +REG esri:4167 1 -0x1.4p2 -0x1.4p2 +REG esri:4167 2 0x1.4p2 -0x1.4p2 +REG esri:4167 3 -0x1.4p2 0x1.4p2 +REG esri:4167 4 0x1.4p2 0x1.4p2 +REG esri:4168 0 0x0.0p0 0x0.0p0 +REG esri:4168 1 -0x1.4p2 -0x1.4p2 +REG esri:4168 2 0x1.4p2 -0x1.4p2 +REG esri:4168 3 -0x1.4p2 0x1.4p2 +REG esri:4168 4 0x1.4p2 0x1.4p2 +REG esri:4169 0 0x0.0p0 0x0.0p0 +REG esri:4169 1 -0x1.4p2 -0x1.4p2 +REG esri:4169 2 0x1.4p2 -0x1.4p2 +REG esri:4169 3 -0x1.4p2 0x1.4p2 +REG esri:4169 4 0x1.4p2 0x1.4p2 +REG esri:4170 0 0x0.0p0 0x0.0p0 +REG esri:4170 1 -0x1.4p2 -0x1.4p2 +REG esri:4170 2 0x1.4p2 -0x1.4p2 +REG esri:4170 3 -0x1.4p2 0x1.4p2 +REG esri:4170 4 0x1.4p2 0x1.4p2 +REG esri:4171 0 0x0.0p0 0x0.0p0 +REG esri:4171 1 -0x1.4p2 -0x1.4p2 +REG esri:4171 2 0x1.4p2 -0x1.4p2 +REG esri:4171 3 -0x1.4p2 0x1.4p2 +REG esri:4171 4 0x1.4p2 0x1.4p2 +REG esri:4172 0 0x0.0p0 0x0.0p0 +REG esri:4172 1 -0x1.4p2 -0x1.4p2 +REG esri:4172 2 0x1.4p2 -0x1.4p2 +REG esri:4172 3 -0x1.4p2 0x1.4p2 +REG esri:4172 4 0x1.4p2 0x1.4p2 +REG esri:4173 0 0x0.0p0 0x0.0p0 +REG esri:4173 1 -0x1.4p2 -0x1.4p2 +REG esri:4173 2 0x1.4p2 -0x1.4p2 +REG esri:4173 3 -0x1.4p2 0x1.4p2 +REG esri:4173 4 0x1.4p2 0x1.4p2 +REG esri:4174 0 0x0.0p0 0x0.0p0 +REG esri:4174 1 -0x1.4p2 -0x1.4p2 +REG esri:4174 2 0x1.4p2 -0x1.4p2 +REG esri:4174 3 -0x1.4p2 0x1.4p2 +REG esri:4174 4 0x1.4p2 0x1.4p2 +REG esri:4175 0 0x0.0p0 0x0.0p0 +REG esri:4175 1 -0x1.4p2 -0x1.4p2 +REG esri:4175 2 0x1.4p2 -0x1.4p2 +REG esri:4175 3 -0x1.4p2 0x1.4p2 +REG esri:4175 4 0x1.4p2 0x1.4p2 +REG esri:4176 0 0x0.0p0 0x0.0p0 +REG esri:4176 1 -0x1.4p2 -0x1.4p2 +REG esri:4176 2 0x1.4p2 -0x1.4p2 +REG esri:4176 3 -0x1.4p2 0x1.4p2 +REG esri:4176 4 0x1.4p2 0x1.4p2 +REG esri:4178 0 0x0.0p0 0x0.0p0 +REG esri:4178 1 -0x1.4p2 -0x1.4p2 +REG esri:4178 2 0x1.4p2 -0x1.4p2 +REG esri:4178 3 -0x1.4p2 0x1.4p2 +REG esri:4178 4 0x1.4p2 0x1.4p2 +REG esri:4179 0 0x0.0p0 0x0.0p0 +REG esri:4179 1 -0x1.4p2 -0x1.4p2 +REG esri:4179 2 0x1.4p2 -0x1.4p2 +REG esri:4179 3 -0x1.4p2 0x1.4p2 +REG esri:4179 4 0x1.4p2 0x1.4p2 +REG esri:4180 0 0x0.0p0 0x0.0p0 +REG esri:4180 1 -0x1.4p2 -0x1.4p2 +REG esri:4180 2 0x1.4p2 -0x1.4p2 +REG esri:4180 3 -0x1.4p2 0x1.4p2 +REG esri:4180 4 0x1.4p2 0x1.4p2 +REG esri:4181 0 0x0.0p0 0x0.0p0 +REG esri:4181 1 -0x1.4p2 -0x1.4p2 +REG esri:4181 2 0x1.4p2 -0x1.4p2 +REG esri:4181 3 -0x1.4p2 0x1.4p2 +REG esri:4181 4 0x1.4p2 0x1.4p2 +REG esri:4182 0 0x0.0p0 0x0.0p0 +REG esri:4182 1 -0x1.4p2 -0x1.4p2 +REG esri:4182 2 0x1.4p2 -0x1.4p2 +REG esri:4182 3 -0x1.4p2 0x1.4p2 +REG esri:4182 4 0x1.4p2 0x1.4p2 +REG esri:4183 0 0x0.0p0 0x0.0p0 +REG esri:4183 1 -0x1.4p2 -0x1.4p2 +REG esri:4183 2 0x1.4p2 -0x1.4p2 +REG esri:4183 3 -0x1.4p2 0x1.4p2 +REG esri:4183 4 0x1.4p2 0x1.4p2 +REG esri:4184 0 0x0.0p0 0x0.0p0 +REG esri:4184 1 -0x1.4p2 -0x1.4p2 +REG esri:4184 2 0x1.4p2 -0x1.4p2 +REG esri:4184 3 -0x1.4p2 0x1.4p2 +REG esri:4184 4 0x1.4p2 0x1.4p2 +REG esri:4185 0 0x0.0p0 0x0.0p0 +REG esri:4185 1 -0x1.4p2 -0x1.4p2 +REG esri:4185 2 0x1.4p2 -0x1.4p2 +REG esri:4185 3 -0x1.4p2 0x1.4p2 +REG esri:4185 4 0x1.4p2 0x1.4p2 +REG esri:4188 0 0x0.0p0 0x0.0p0 +REG esri:4188 1 -0x1.4p2 -0x1.4p2 +REG esri:4188 2 0x1.4p2 -0x1.4p2 +REG esri:4188 3 -0x1.4p2 0x1.4p2 +REG esri:4188 4 0x1.4p2 0x1.4p2 +REG esri:4189 0 0x0.0p0 0x0.0p0 +REG esri:4189 1 -0x1.4p2 -0x1.4p2 +REG esri:4189 2 0x1.4p2 -0x1.4p2 +REG esri:4189 3 -0x1.4p2 0x1.4p2 +REG esri:4189 4 0x1.4p2 0x1.4p2 +REG esri:4190 0 0x0.0p0 0x0.0p0 +REG esri:4190 1 -0x1.4p2 -0x1.4p2 +REG esri:4190 2 0x1.4p2 -0x1.4p2 +REG esri:4190 3 -0x1.4p2 0x1.4p2 +REG esri:4190 4 0x1.4p2 0x1.4p2 +REG esri:4191 0 0x0.0p0 0x0.0p0 +REG esri:4191 1 -0x1.4p2 -0x1.4p2 +REG esri:4191 2 0x1.4p2 -0x1.4p2 +REG esri:4191 3 -0x1.4p2 0x1.4p2 +REG esri:4191 4 0x1.4p2 0x1.4p2 +REG esri:4192 0 0x0.0p0 0x0.0p0 +REG esri:4192 1 -0x1.4p2 -0x1.4p2 +REG esri:4192 2 0x1.4p2 -0x1.4p2 +REG esri:4192 3 -0x1.4p2 0x1.4p2 +REG esri:4192 4 0x1.4p2 0x1.4p2 +REG esri:4193 0 0x0.0p0 0x0.0p0 +REG esri:4193 1 -0x1.4p2 -0x1.4p2 +REG esri:4193 2 0x1.4p2 -0x1.4p2 +REG esri:4193 3 -0x1.4p2 0x1.4p2 +REG esri:4193 4 0x1.4p2 0x1.4p2 +REG esri:4194 0 0x0.0p0 0x0.0p0 +REG esri:4194 1 -0x1.4p2 -0x1.4p2 +REG esri:4194 2 0x1.4p2 -0x1.4p2 +REG esri:4194 3 -0x1.4p2 0x1.4p2 +REG esri:4194 4 0x1.4p2 0x1.4p2 +REG esri:4195 0 0x0.0p0 0x0.0p0 +REG esri:4195 1 -0x1.4p2 -0x1.4p2 +REG esri:4195 2 0x1.4p2 -0x1.4p2 +REG esri:4195 3 -0x1.4p2 0x1.4p2 +REG esri:4195 4 0x1.4p2 0x1.4p2 +REG esri:4196 0 0x0.0p0 0x0.0p0 +REG esri:4196 1 -0x1.4p2 -0x1.4p2 +REG esri:4196 2 0x1.4p2 -0x1.4p2 +REG esri:4196 3 -0x1.4p2 0x1.4p2 +REG esri:4196 4 0x1.4p2 0x1.4p2 +REG esri:4197 0 0x0.0p0 0x0.0p0 +REG esri:4197 1 -0x1.4p2 -0x1.4p2 +REG esri:4197 2 0x1.4p2 -0x1.4p2 +REG esri:4197 3 -0x1.4p2 0x1.4p2 +REG esri:4197 4 0x1.4p2 0x1.4p2 +REG esri:4198 0 0x0.0p0 0x0.0p0 +REG esri:4198 1 -0x1.4p2 -0x1.4p2 +REG esri:4198 2 0x1.4p2 -0x1.4p2 +REG esri:4198 3 -0x1.4p2 0x1.4p2 +REG esri:4198 4 0x1.4p2 0x1.4p2 +REG esri:4199 0 0x0.0p0 0x0.0p0 +REG esri:4199 1 -0x1.4p2 -0x1.4p2 +REG esri:4199 2 0x1.4p2 -0x1.4p2 +REG esri:4199 3 -0x1.4p2 0x1.4p2 +REG esri:4199 4 0x1.4p2 0x1.4p2 +REG esri:4200 0 0x0.0p0 0x0.0p0 +REG esri:4200 1 -0x1.4p2 -0x1.4p2 +REG esri:4200 2 0x1.4p2 -0x1.4p2 +REG esri:4200 3 -0x1.4p2 0x1.4p2 +REG esri:4200 4 0x1.4p2 0x1.4p2 +REG esri:4201 0 0x0.0p0 0x0.0p0 +REG esri:4201 1 -0x1.4p2 -0x1.4p2 +REG esri:4201 2 0x1.4p2 -0x1.4p2 +REG esri:4201 3 -0x1.4p2 0x1.4p2 +REG esri:4201 4 0x1.4p2 0x1.4p2 +REG esri:4202 0 0x0.0p0 0x0.0p0 +REG esri:4202 1 -0x1.4p2 -0x1.4p2 +REG esri:4202 2 0x1.4p2 -0x1.4p2 +REG esri:4202 3 -0x1.4p2 0x1.4p2 +REG esri:4202 4 0x1.4p2 0x1.4p2 +REG esri:4203 0 0x0.0p0 0x0.0p0 +REG esri:4203 1 -0x1.4p2 -0x1.4p2 +REG esri:4203 2 0x1.4p2 -0x1.4p2 +REG esri:4203 3 -0x1.4p2 0x1.4p2 +REG esri:4203 4 0x1.4p2 0x1.4p2 +REG esri:4204 0 0x0.0p0 0x0.0p0 +REG esri:4204 1 -0x1.4p2 -0x1.4p2 +REG esri:4204 2 0x1.4p2 -0x1.4p2 +REG esri:4204 3 -0x1.4p2 0x1.4p2 +REG esri:4204 4 0x1.4p2 0x1.4p2 +REG esri:4205 0 0x0.0p0 0x0.0p0 +REG esri:4205 1 -0x1.4p2 -0x1.4p2 +REG esri:4205 2 0x1.4p2 -0x1.4p2 +REG esri:4205 3 -0x1.4p2 0x1.4p2 +REG esri:4205 4 0x1.4p2 0x1.4p2 +REG esri:4206 0 0x0.0p0 0x0.0p0 +REG esri:4206 1 -0x1.4p2 -0x1.4p2 +REG esri:4206 2 0x1.4p2 -0x1.4p2 +REG esri:4206 3 -0x1.4p2 0x1.4p2 +REG esri:4206 4 0x1.4p2 0x1.4p2 +REG esri:4207 0 0x0.0p0 0x0.0p0 +REG esri:4207 1 -0x1.4p2 -0x1.4p2 +REG esri:4207 2 0x1.4p2 -0x1.4p2 +REG esri:4207 3 -0x1.4p2 0x1.4p2 +REG esri:4207 4 0x1.4p2 0x1.4p2 +REG esri:4208 0 0x0.0p0 0x0.0p0 +REG esri:4208 1 -0x1.4p2 -0x1.4p2 +REG esri:4208 2 0x1.4p2 -0x1.4p2 +REG esri:4208 3 -0x1.4p2 0x1.4p2 +REG esri:4208 4 0x1.4p2 0x1.4p2 +REG esri:4209 0 0x0.0p0 0x0.0p0 +REG esri:4209 1 -0x1.4p2 -0x1.4p2 +REG esri:4209 2 0x1.4p2 -0x1.4p2 +REG esri:4209 3 -0x1.4p2 0x1.4p2 +REG esri:4209 4 0x1.4p2 0x1.4p2 +REG esri:4210 0 0x0.0p0 0x0.0p0 +REG esri:4210 1 -0x1.4p2 -0x1.4p2 +REG esri:4210 2 0x1.4p2 -0x1.4p2 +REG esri:4210 3 -0x1.4p2 0x1.4p2 +REG esri:4210 4 0x1.4p2 0x1.4p2 +REG esri:4211 0 0x0.0p0 0x0.0p0 +REG esri:4211 1 -0x1.4p2 -0x1.4p2 +REG esri:4211 2 0x1.4p2 -0x1.4p2 +REG esri:4211 3 -0x1.4p2 0x1.4p2 +REG esri:4211 4 0x1.4p2 0x1.4p2 +REG esri:4212 0 0x0.0p0 0x0.0p0 +REG esri:4212 1 -0x1.4p2 -0x1.4p2 +REG esri:4212 2 0x1.4p2 -0x1.4p2 +REG esri:4212 3 -0x1.4p2 0x1.4p2 +REG esri:4212 4 0x1.4p2 0x1.4p2 +REG esri:4213 0 0x0.0p0 0x0.0p0 +REG esri:4213 1 -0x1.4p2 -0x1.4p2 +REG esri:4213 2 0x1.4p2 -0x1.4p2 +REG esri:4213 3 -0x1.4p2 0x1.4p2 +REG esri:4213 4 0x1.4p2 0x1.4p2 +REG esri:4214 0 0x0.0p0 0x0.0p0 +REG esri:4214 1 -0x1.4p2 -0x1.4p2 +REG esri:4214 2 0x1.4p2 -0x1.4p2 +REG esri:4214 3 -0x1.4p2 0x1.4p2 +REG esri:4214 4 0x1.4p2 0x1.4p2 +REG esri:4215 0 0x0.0p0 0x0.0p0 +REG esri:4215 1 -0x1.4p2 -0x1.4p2 +REG esri:4215 2 0x1.4p2 -0x1.4p2 +REG esri:4215 3 -0x1.4p2 0x1.4p2 +REG esri:4215 4 0x1.4p2 0x1.4p2 +REG esri:4216 0 0x0.0p0 0x0.0p0 +REG esri:4216 1 -0x1.4p2 -0x1.4p2 +REG esri:4216 2 0x1.4p2 -0x1.4p2 +REG esri:4216 3 -0x1.4p2 0x1.4p2 +REG esri:4216 4 0x1.4p2 0x1.4p2 +REG esri:4217 0 0x0.0p0 0x0.0p0 +REG esri:4217 1 -0x1.4p2 -0x1.4p2 +REG esri:4217 2 0x1.4p2 -0x1.4p2 +REG esri:4217 3 -0x1.4p2 0x1.4p2 +REG esri:4217 4 0x1.4p2 0x1.4p2 +REG esri:4218 0 0x0.0p0 0x0.0p0 +REG esri:4218 1 -0x1.4p2 -0x1.4p2 +REG esri:4218 2 0x1.4p2 -0x1.4p2 +REG esri:4218 3 -0x1.4p2 0x1.4p2 +REG esri:4218 4 0x1.4p2 0x1.4p2 +REG esri:4219 0 0x0.0p0 0x0.0p0 +REG esri:4219 1 -0x1.4p2 -0x1.4p2 +REG esri:4219 2 0x1.4p2 -0x1.4p2 +REG esri:4219 3 -0x1.4p2 0x1.4p2 +REG esri:4219 4 0x1.4p2 0x1.4p2 +REG esri:4220 0 0x0.0p0 0x0.0p0 +REG esri:4220 1 -0x1.4p2 -0x1.4p2 +REG esri:4220 2 0x1.4p2 -0x1.4p2 +REG esri:4220 3 -0x1.4p2 0x1.4p2 +REG esri:4220 4 0x1.4p2 0x1.4p2 +REG esri:4221 0 0x0.0p0 0x0.0p0 +REG esri:4221 1 -0x1.4p2 -0x1.4p2 +REG esri:4221 2 0x1.4p2 -0x1.4p2 +REG esri:4221 3 -0x1.4p2 0x1.4p2 +REG esri:4221 4 0x1.4p2 0x1.4p2 +REG esri:4222 0 0x0.0p0 0x0.0p0 +REG esri:4222 1 -0x1.4p2 -0x1.4p2 +REG esri:4222 2 0x1.4p2 -0x1.4p2 +REG esri:4222 3 -0x1.4p2 0x1.4p2 +REG esri:4222 4 0x1.4p2 0x1.4p2 +REG esri:4223 0 0x0.0p0 0x0.0p0 +REG esri:4223 1 -0x1.4p2 -0x1.4p2 +REG esri:4223 2 0x1.4p2 -0x1.4p2 +REG esri:4223 3 -0x1.4p2 0x1.4p2 +REG esri:4223 4 0x1.4p2 0x1.4p2 +REG esri:4224 0 0x0.0p0 0x0.0p0 +REG esri:4224 1 -0x1.4p2 -0x1.4p2 +REG esri:4224 2 0x1.4p2 -0x1.4p2 +REG esri:4224 3 -0x1.4p2 0x1.4p2 +REG esri:4224 4 0x1.4p2 0x1.4p2 +REG esri:4225 0 0x0.0p0 0x0.0p0 +REG esri:4225 1 -0x1.4p2 -0x1.4p2 +REG esri:4225 2 0x1.4p2 -0x1.4p2 +REG esri:4225 3 -0x1.4p2 0x1.4p2 +REG esri:4225 4 0x1.4p2 0x1.4p2 +REG esri:4226 0 0x0.0p0 0x0.0p0 +REG esri:4226 1 -0x1.4p2 -0x1.4p2 +REG esri:4226 2 0x1.4p2 -0x1.4p2 +REG esri:4226 3 -0x1.4p2 0x1.4p2 +REG esri:4226 4 0x1.4p2 0x1.4p2 +REG esri:4227 0 0x0.0p0 0x0.0p0 +REG esri:4227 1 -0x1.4p2 -0x1.4p2 +REG esri:4227 2 0x1.4p2 -0x1.4p2 +REG esri:4227 3 -0x1.4p2 0x1.4p2 +REG esri:4227 4 0x1.4p2 0x1.4p2 +REG esri:4228 0 0x0.0p0 0x0.0p0 +REG esri:4228 1 -0x1.4p2 -0x1.4p2 +REG esri:4228 2 0x1.4p2 -0x1.4p2 +REG esri:4228 3 -0x1.4p2 0x1.4p2 +REG esri:4228 4 0x1.4p2 0x1.4p2 +REG esri:4229 0 0x0.0p0 0x0.0p0 +REG esri:4229 1 -0x1.4p2 -0x1.4p2 +REG esri:4229 2 0x1.4p2 -0x1.4p2 +REG esri:4229 3 -0x1.4p2 0x1.4p2 +REG esri:4229 4 0x1.4p2 0x1.4p2 +REG esri:4230 0 0x0.0p0 0x0.0p0 +REG esri:4230 1 -0x1.4p2 -0x1.4p2 +REG esri:4230 2 0x1.4p2 -0x1.4p2 +REG esri:4230 3 -0x1.4p2 0x1.4p2 +REG esri:4230 4 0x1.4p2 0x1.4p2 +REG esri:4231 0 0x0.0p0 0x0.0p0 +REG esri:4231 1 -0x1.4p2 -0x1.4p2 +REG esri:4231 2 0x1.4p2 -0x1.4p2 +REG esri:4231 3 -0x1.4p2 0x1.4p2 +REG esri:4231 4 0x1.4p2 0x1.4p2 +REG esri:4232 0 0x0.0p0 0x0.0p0 +REG esri:4232 1 -0x1.4p2 -0x1.4p2 +REG esri:4232 2 0x1.4p2 -0x1.4p2 +REG esri:4232 3 -0x1.4p2 0x1.4p2 +REG esri:4232 4 0x1.4p2 0x1.4p2 +REG esri:4233 0 0x0.0p0 0x0.0p0 +REG esri:4233 1 -0x1.4p2 -0x1.4p2 +REG esri:4233 2 0x1.4p2 -0x1.4p2 +REG esri:4233 3 -0x1.4p2 0x1.4p2 +REG esri:4233 4 0x1.4p2 0x1.4p2 +REG esri:4234 0 0x0.0p0 0x0.0p0 +REG esri:4234 1 -0x1.4p2 -0x1.4p2 +REG esri:4234 2 0x1.4p2 -0x1.4p2 +REG esri:4234 3 -0x1.4p2 0x1.4p2 +REG esri:4234 4 0x1.4p2 0x1.4p2 +REG esri:4235 0 0x0.0p0 0x0.0p0 +REG esri:4235 1 -0x1.4p2 -0x1.4p2 +REG esri:4235 2 0x1.4p2 -0x1.4p2 +REG esri:4235 3 -0x1.4p2 0x1.4p2 +REG esri:4235 4 0x1.4p2 0x1.4p2 +REG esri:4236 0 0x0.0p0 0x0.0p0 +REG esri:4236 1 -0x1.4p2 -0x1.4p2 +REG esri:4236 2 0x1.4p2 -0x1.4p2 +REG esri:4236 3 -0x1.4p2 0x1.4p2 +REG esri:4236 4 0x1.4p2 0x1.4p2 +REG esri:4237 0 0x0.0p0 0x0.0p0 +REG esri:4237 1 -0x1.4p2 -0x1.4p2 +REG esri:4237 2 0x1.4p2 -0x1.4p2 +REG esri:4237 3 -0x1.4p2 0x1.4p2 +REG esri:4237 4 0x1.4p2 0x1.4p2 +REG esri:4238 0 0x0.0p0 0x0.0p0 +REG esri:4238 1 -0x1.4p2 -0x1.4p2 +REG esri:4238 2 0x1.4p2 -0x1.4p2 +REG esri:4238 3 -0x1.4p2 0x1.4p2 +REG esri:4238 4 0x1.4p2 0x1.4p2 +REG esri:4239 0 0x0.0p0 0x0.0p0 +REG esri:4239 1 -0x1.4p2 -0x1.4p2 +REG esri:4239 2 0x1.4p2 -0x1.4p2 +REG esri:4239 3 -0x1.4p2 0x1.4p2 +REG esri:4239 4 0x1.4p2 0x1.4p2 +REG esri:4240 0 0x0.0p0 0x0.0p0 +REG esri:4240 1 -0x1.4p2 -0x1.4p2 +REG esri:4240 2 0x1.4p2 -0x1.4p2 +REG esri:4240 3 -0x1.4p2 0x1.4p2 +REG esri:4240 4 0x1.4p2 0x1.4p2 +REG esri:4241 0 0x0.0p0 0x0.0p0 +REG esri:4241 1 -0x1.4p2 -0x1.4p2 +REG esri:4241 2 0x1.4p2 -0x1.4p2 +REG esri:4241 3 -0x1.4p2 0x1.4p2 +REG esri:4241 4 0x1.4p2 0x1.4p2 +REG esri:4242 0 0x0.0p0 0x0.0p0 +REG esri:4242 1 -0x1.4p2 -0x1.4p2 +REG esri:4242 2 0x1.4p2 -0x1.4p2 +REG esri:4242 3 -0x1.4p2 0x1.4p2 +REG esri:4242 4 0x1.4p2 0x1.4p2 +REG esri:4243 0 0x0.0p0 0x0.0p0 +REG esri:4243 1 -0x1.4p2 -0x1.4p2 +REG esri:4243 2 0x1.4p2 -0x1.4p2 +REG esri:4243 3 -0x1.4p2 0x1.4p2 +REG esri:4243 4 0x1.4p2 0x1.4p2 +REG esri:4244 0 0x0.0p0 0x0.0p0 +REG esri:4244 1 -0x1.4p2 -0x1.4p2 +REG esri:4244 2 0x1.4p2 -0x1.4p2 +REG esri:4244 3 -0x1.4p2 0x1.4p2 +REG esri:4244 4 0x1.4p2 0x1.4p2 +REG esri:4245 0 0x0.0p0 0x0.0p0 +REG esri:4245 1 -0x1.4p2 -0x1.4p2 +REG esri:4245 2 0x1.4p2 -0x1.4p2 +REG esri:4245 3 -0x1.4p2 0x1.4p2 +REG esri:4245 4 0x1.4p2 0x1.4p2 +REG esri:4246 0 0x0.0p0 0x0.0p0 +REG esri:4246 1 -0x1.4p2 -0x1.4p2 +REG esri:4246 2 0x1.4p2 -0x1.4p2 +REG esri:4246 3 -0x1.4p2 0x1.4p2 +REG esri:4246 4 0x1.4p2 0x1.4p2 +REG esri:4247 0 0x0.0p0 0x0.0p0 +REG esri:4247 1 -0x1.4p2 -0x1.4p2 +REG esri:4247 2 0x1.4p2 -0x1.4p2 +REG esri:4247 3 -0x1.4p2 0x1.4p2 +REG esri:4247 4 0x1.4p2 0x1.4p2 +REG esri:4248 0 0x0.0p0 0x0.0p0 +REG esri:4248 1 -0x1.4p2 -0x1.4p2 +REG esri:4248 2 0x1.4p2 -0x1.4p2 +REG esri:4248 3 -0x1.4p2 0x1.4p2 +REG esri:4248 4 0x1.4p2 0x1.4p2 +REG esri:4249 0 0x0.0p0 0x0.0p0 +REG esri:4249 1 -0x1.4p2 -0x1.4p2 +REG esri:4249 2 0x1.4p2 -0x1.4p2 +REG esri:4249 3 -0x1.4p2 0x1.4p2 +REG esri:4249 4 0x1.4p2 0x1.4p2 +REG esri:4250 0 0x0.0p0 0x0.0p0 +REG esri:4250 1 -0x1.4p2 -0x1.4p2 +REG esri:4250 2 0x1.4p2 -0x1.4p2 +REG esri:4250 3 -0x1.4p2 0x1.4p2 +REG esri:4250 4 0x1.4p2 0x1.4p2 +REG esri:4251 0 0x0.0p0 0x0.0p0 +REG esri:4251 1 -0x1.4p2 -0x1.4p2 +REG esri:4251 2 0x1.4p2 -0x1.4p2 +REG esri:4251 3 -0x1.4p2 0x1.4p2 +REG esri:4251 4 0x1.4p2 0x1.4p2 +REG esri:4252 0 0x0.0p0 0x0.0p0 +REG esri:4252 1 -0x1.4p2 -0x1.4p2 +REG esri:4252 2 0x1.4p2 -0x1.4p2 +REG esri:4252 3 -0x1.4p2 0x1.4p2 +REG esri:4252 4 0x1.4p2 0x1.4p2 +REG esri:4253 0 0x0.0p0 0x0.0p0 +REG esri:4253 1 -0x1.4p2 -0x1.4p2 +REG esri:4253 2 0x1.4p2 -0x1.4p2 +REG esri:4253 3 -0x1.4p2 0x1.4p2 +REG esri:4253 4 0x1.4p2 0x1.4p2 +REG esri:4254 0 0x0.0p0 0x0.0p0 +REG esri:4254 1 -0x1.4p2 -0x1.4p2 +REG esri:4254 2 0x1.4p2 -0x1.4p2 +REG esri:4254 3 -0x1.4p2 0x1.4p2 +REG esri:4254 4 0x1.4p2 0x1.4p2 +REG esri:4255 0 0x0.0p0 0x0.0p0 +REG esri:4255 1 -0x1.4p2 -0x1.4p2 +REG esri:4255 2 0x1.4p2 -0x1.4p2 +REG esri:4255 3 -0x1.4p2 0x1.4p2 +REG esri:4255 4 0x1.4p2 0x1.4p2 +REG esri:4256 0 0x0.0p0 0x0.0p0 +REG esri:4256 1 -0x1.4p2 -0x1.4p2 +REG esri:4256 2 0x1.4p2 -0x1.4p2 +REG esri:4256 3 -0x1.4p2 0x1.4p2 +REG esri:4256 4 0x1.4p2 0x1.4p2 +REG esri:4257 0 0x0.0p0 0x0.0p0 +REG esri:4257 1 -0x1.4p2 -0x1.4p2 +REG esri:4257 2 0x1.4p2 -0x1.4p2 +REG esri:4257 3 -0x1.4p2 0x1.4p2 +REG esri:4257 4 0x1.4p2 0x1.4p2 +REG esri:4258 0 0x0.0p0 0x0.0p0 +REG esri:4258 1 -0x1.4p2 -0x1.4p2 +REG esri:4258 2 0x1.4p2 -0x1.4p2 +REG esri:4258 3 -0x1.4p2 0x1.4p2 +REG esri:4258 4 0x1.4p2 0x1.4p2 +REG esri:4259 0 0x0.0p0 0x0.0p0 +REG esri:4259 1 -0x1.4p2 -0x1.4p2 +REG esri:4259 2 0x1.4p2 -0x1.4p2 +REG esri:4259 3 -0x1.4p2 0x1.4p2 +REG esri:4259 4 0x1.4p2 0x1.4p2 +REG esri:4260 0 0x0.0p0 0x0.0p0 +REG esri:4260 1 -0x1.4p2 -0x1.4p2 +REG esri:4260 2 0x1.4p2 -0x1.4p2 +REG esri:4260 3 -0x1.4p2 0x1.4p2 +REG esri:4260 4 0x1.4p2 0x1.4p2 +REG esri:4261 0 0x0.0p0 0x0.0p0 +REG esri:4261 1 -0x1.4p2 -0x1.4p2 +REG esri:4261 2 0x1.4p2 -0x1.4p2 +REG esri:4261 3 -0x1.4p2 0x1.4p2 +REG esri:4261 4 0x1.4p2 0x1.4p2 +REG esri:4262 0 0x0.0p0 0x0.0p0 +REG esri:4262 1 -0x1.4p2 -0x1.4p2 +REG esri:4262 2 0x1.4p2 -0x1.4p2 +REG esri:4262 3 -0x1.4p2 0x1.4p2 +REG esri:4262 4 0x1.4p2 0x1.4p2 +REG esri:4263 0 0x0.0p0 0x0.0p0 +REG esri:4263 1 -0x1.4p2 -0x1.4p2 +REG esri:4263 2 0x1.4p2 -0x1.4p2 +REG esri:4263 3 -0x1.4p2 0x1.4p2 +REG esri:4263 4 0x1.4p2 0x1.4p2 +REG esri:4264 0 0x0.0p0 0x0.0p0 +REG esri:4264 1 -0x1.4p2 -0x1.4p2 +REG esri:4264 2 0x1.4p2 -0x1.4p2 +REG esri:4264 3 -0x1.4p2 0x1.4p2 +REG esri:4264 4 0x1.4p2 0x1.4p2 +REG esri:4265 0 0x0.0p0 0x0.0p0 +REG esri:4265 1 -0x1.4p2 -0x1.4p2 +REG esri:4265 2 0x1.4p2 -0x1.4p2 +REG esri:4265 3 -0x1.4p2 0x1.4p2 +REG esri:4265 4 0x1.4p2 0x1.4p2 +REG esri:4266 0 0x0.0p0 0x0.0p0 +REG esri:4266 1 -0x1.4p2 -0x1.4p2 +REG esri:4266 2 0x1.4p2 -0x1.4p2 +REG esri:4266 3 -0x1.4p2 0x1.4p2 +REG esri:4266 4 0x1.4p2 0x1.4p2 +REG esri:4267 0 -0x1.9p6 0x1.68p5 +REG esri:4267 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG esri:4267 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG esri:4267 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG esri:4267 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG esri:4268 0 0x0.0p0 0x0.0p0 +REG esri:4268 1 -0x1.4p2 -0x1.4p2 +REG esri:4268 2 0x1.4p2 -0x1.4p2 +REG esri:4268 3 -0x1.4p2 0x1.4p2 +REG esri:4268 4 0x1.4p2 0x1.4p2 +REG esri:4269 0 -0x1.9p6 0x1.68p5 +REG esri:4269 1 -0x1.ac48c6001f0acp6 0x1.4p5 +REG esri:4269 2 -0x1.73b739ffe0f54p6 0x1.4p5 +REG esri:4269 3 -0x1.ac48c6001f0acp6 0x1.9p5 +REG esri:4269 4 -0x1.73b739ffe0f54p6 0x1.9p5 +REG esri:4270 0 0x0.0p0 0x0.0p0 +REG esri:4270 1 -0x1.4p2 -0x1.4p2 +REG esri:4270 2 0x1.4p2 -0x1.4p2 +REG esri:4270 3 -0x1.4p2 0x1.4p2 +REG esri:4270 4 0x1.4p2 0x1.4p2 +REG esri:4271 0 0x0.0p0 0x0.0p0 +REG esri:4271 1 -0x1.4p2 -0x1.4p2 +REG esri:4271 2 0x1.4p2 -0x1.4p2 +REG esri:4271 3 -0x1.4p2 0x1.4p2 +REG esri:4271 4 0x1.4p2 0x1.4p2 +REG esri:4272 0 0x0.0p0 0x0.0p0 +REG esri:4272 1 -0x1.4p2 -0x1.4p2 +REG esri:4272 2 0x1.4p2 -0x1.4p2 +REG esri:4272 3 -0x1.4p2 0x1.4p2 +REG esri:4272 4 0x1.4p2 0x1.4p2 +REG esri:4273 0 0x0.0p0 0x0.0p0 +REG esri:4273 1 -0x1.4p2 -0x1.4p2 +REG esri:4273 2 0x1.4p2 -0x1.4p2 +REG esri:4273 3 -0x1.4p2 0x1.4p2 +REG esri:4273 4 0x1.4p2 0x1.4p2 +REG esri:4274 0 0x0.0p0 0x0.0p0 +REG esri:4274 1 -0x1.4p2 -0x1.4p2 +REG esri:4274 2 0x1.4p2 -0x1.4p2 +REG esri:4274 3 -0x1.4p2 0x1.4p2 +REG esri:4274 4 0x1.4p2 0x1.4p2 +REG esri:4275 0 0x0.0p0 0x0.0p0 +REG esri:4275 1 -0x1.4p2 -0x1.4p2 +REG esri:4275 2 0x1.4p2 -0x1.4p2 +REG esri:4275 3 -0x1.4p2 0x1.4p2 +REG esri:4275 4 0x1.4p2 0x1.4p2 +REG esri:4276 0 0x0.0p0 0x0.0p0 +REG esri:4276 1 -0x1.4p2 -0x1.4p2 +REG esri:4276 2 0x1.4p2 -0x1.4p2 +REG esri:4276 3 -0x1.4p2 0x1.4p2 +REG esri:4276 4 0x1.4p2 0x1.4p2 +REG esri:4277 0 0x0.0p0 0x0.0p0 +REG esri:4277 1 -0x1.4p2 -0x1.4p2 +REG esri:4277 2 0x1.4p2 -0x1.4p2 +REG esri:4277 3 -0x1.4p2 0x1.4p2 +REG esri:4277 4 0x1.4p2 0x1.4p2 +REG esri:4278 0 0x0.0p0 0x0.0p0 +REG esri:4278 1 -0x1.4p2 -0x1.4p2 +REG esri:4278 2 0x1.4p2 -0x1.4p2 +REG esri:4278 3 -0x1.4p2 0x1.4p2 +REG esri:4278 4 0x1.4p2 0x1.4p2 +REG esri:4279 0 0x0.0p0 0x0.0p0 +REG esri:4279 1 -0x1.4p2 -0x1.4p2 +REG esri:4279 2 0x1.4p2 -0x1.4p2 +REG esri:4279 3 -0x1.4p2 0x1.4p2 +REG esri:4279 4 0x1.4p2 0x1.4p2 +REG esri:4280 0 0x0.0p0 0x0.0p0 +REG esri:4280 1 -0x1.4p2 -0x1.4p2 +REG esri:4280 2 0x1.4p2 -0x1.4p2 +REG esri:4280 3 -0x1.4p2 0x1.4p2 +REG esri:4280 4 0x1.4p2 0x1.4p2 +REG esri:4281 0 0x0.0p0 0x0.0p0 +REG esri:4281 1 -0x1.4p2 -0x1.4p2 +REG esri:4281 2 0x1.4p2 -0x1.4p2 +REG esri:4281 3 -0x1.4p2 0x1.4p2 +REG esri:4281 4 0x1.4p2 0x1.4p2 +REG esri:4282 0 0x0.0p0 0x0.0p0 +REG esri:4282 1 -0x1.4p2 -0x1.4p2 +REG esri:4282 2 0x1.4p2 -0x1.4p2 +REG esri:4282 3 -0x1.4p2 0x1.4p2 +REG esri:4282 4 0x1.4p2 0x1.4p2 +REG esri:4283 0 0x0.0p0 0x0.0p0 +REG esri:4283 1 -0x1.4p2 -0x1.4p2 +REG esri:4283 2 0x1.4p2 -0x1.4p2 +REG esri:4283 3 -0x1.4p2 0x1.4p2 +REG esri:4283 4 0x1.4p2 0x1.4p2 +REG esri:4284 0 0x0.0p0 0x0.0p0 +REG esri:4284 1 -0x1.4p2 -0x1.4p2 +REG esri:4284 2 0x1.4p2 -0x1.4p2 +REG esri:4284 3 -0x1.4p2 0x1.4p2 +REG esri:4284 4 0x1.4p2 0x1.4p2 +REG esri:4285 0 0x0.0p0 0x0.0p0 +REG esri:4285 1 -0x1.4p2 -0x1.4p2 +REG esri:4285 2 0x1.4p2 -0x1.4p2 +REG esri:4285 3 -0x1.4p2 0x1.4p2 +REG esri:4285 4 0x1.4p2 0x1.4p2 +REG esri:4286 0 0x0.0p0 0x0.0p0 +REG esri:4286 1 -0x1.4p2 -0x1.4p2 +REG esri:4286 2 0x1.4p2 -0x1.4p2 +REG esri:4286 3 -0x1.4p2 0x1.4p2 +REG esri:4286 4 0x1.4p2 0x1.4p2 +REG esri:4287 0 0x0.0p0 0x0.0p0 +REG esri:4287 1 -0x1.4p2 -0x1.4p2 +REG esri:4287 2 0x1.4p2 -0x1.4p2 +REG esri:4287 3 -0x1.4p2 0x1.4p2 +REG esri:4287 4 0x1.4p2 0x1.4p2 +REG esri:4288 0 0x0.0p0 0x0.0p0 +REG esri:4288 1 -0x1.4p2 -0x1.4p2 +REG esri:4288 2 0x1.4p2 -0x1.4p2 +REG esri:4288 3 -0x1.4p2 0x1.4p2 +REG esri:4288 4 0x1.4p2 0x1.4p2 +REG esri:4289 0 0x0.0p0 0x0.0p0 +REG esri:4289 1 -0x1.4p2 -0x1.4p2 +REG esri:4289 2 0x1.4p2 -0x1.4p2 +REG esri:4289 3 -0x1.4p2 0x1.4p2 +REG esri:4289 4 0x1.4p2 0x1.4p2 +REG esri:4291 0 0x0.0p0 0x0.0p0 +REG esri:4291 1 -0x1.4p2 -0x1.4p2 +REG esri:4291 2 0x1.4p2 -0x1.4p2 +REG esri:4291 3 -0x1.4p2 0x1.4p2 +REG esri:4291 4 0x1.4p2 0x1.4p2 +REG esri:4292 0 0x0.0p0 0x0.0p0 +REG esri:4292 1 -0x1.4p2 -0x1.4p2 +REG esri:4292 2 0x1.4p2 -0x1.4p2 +REG esri:4292 3 -0x1.4p2 0x1.4p2 +REG esri:4292 4 0x1.4p2 0x1.4p2 +REG esri:4293 0 0x0.0p0 0x0.0p0 +REG esri:4293 1 -0x1.4p2 -0x1.4p2 +REG esri:4293 2 0x1.4p2 -0x1.4p2 +REG esri:4293 3 -0x1.4p2 0x1.4p2 +REG esri:4293 4 0x1.4p2 0x1.4p2 +REG esri:4294 0 0x0.0p0 0x0.0p0 +REG esri:4294 1 -0x1.4p2 -0x1.4p2 +REG esri:4294 2 0x1.4p2 -0x1.4p2 +REG esri:4294 3 -0x1.4p2 0x1.4p2 +REG esri:4294 4 0x1.4p2 0x1.4p2 +REG esri:4295 0 0x0.0p0 0x0.0p0 +REG esri:4295 1 -0x1.4p2 -0x1.4p2 +REG esri:4295 2 0x1.4p2 -0x1.4p2 +REG esri:4295 3 -0x1.4p2 0x1.4p2 +REG esri:4295 4 0x1.4p2 0x1.4p2 +REG esri:4296 0 0x0.0p0 0x0.0p0 +REG esri:4296 1 -0x1.4p2 -0x1.4p2 +REG esri:4296 2 0x1.4p2 -0x1.4p2 +REG esri:4296 3 -0x1.4p2 0x1.4p2 +REG esri:4296 4 0x1.4p2 0x1.4p2 +REG esri:4297 0 0x0.0p0 0x0.0p0 +REG esri:4297 1 -0x1.4p2 -0x1.4p2 +REG esri:4297 2 0x1.4p2 -0x1.4p2 +REG esri:4297 3 -0x1.4p2 0x1.4p2 +REG esri:4297 4 0x1.4p2 0x1.4p2 +REG esri:4298 0 0x0.0p0 0x0.0p0 +REG esri:4298 1 -0x1.4p2 -0x1.4p2 +REG esri:4298 2 0x1.4p2 -0x1.4p2 +REG esri:4298 3 -0x1.4p2 0x1.4p2 +REG esri:4298 4 0x1.4p2 0x1.4p2 +REG esri:4299 0 0x0.0p0 0x0.0p0 +REG esri:4299 1 -0x1.4p2 -0x1.4p2 +REG esri:4299 2 0x1.4p2 -0x1.4p2 +REG esri:4299 3 -0x1.4p2 0x1.4p2 +REG esri:4299 4 0x1.4p2 0x1.4p2 +REG esri:4300 0 0x0.0p0 0x0.0p0 +REG esri:4300 1 -0x1.4p2 -0x1.4p2 +REG esri:4300 2 0x1.4p2 -0x1.4p2 +REG esri:4300 3 -0x1.4p2 0x1.4p2 +REG esri:4300 4 0x1.4p2 0x1.4p2 +REG esri:4301 0 0x0.0p0 0x0.0p0 +REG esri:4301 1 -0x1.4p2 -0x1.4p2 +REG esri:4301 2 0x1.4p2 -0x1.4p2 +REG esri:4301 3 -0x1.4p2 0x1.4p2 +REG esri:4301 4 0x1.4p2 0x1.4p2 +REG esri:4302 0 0x0.0p0 0x0.0p0 +REG esri:4302 1 -0x1.4p2 -0x1.4p2 +REG esri:4302 2 0x1.4p2 -0x1.4p2 +REG esri:4302 3 -0x1.4p2 0x1.4p2 +REG esri:4302 4 0x1.4p2 0x1.4p2 +REG esri:4303 0 0x0.0p0 0x0.0p0 +REG esri:4303 1 -0x1.4p2 -0x1.4p2 +REG esri:4303 2 0x1.4p2 -0x1.4p2 +REG esri:4303 3 -0x1.4p2 0x1.4p2 +REG esri:4303 4 0x1.4p2 0x1.4p2 +REG esri:4304 0 0x0.0p0 0x0.0p0 +REG esri:4304 1 -0x1.4p2 -0x1.4p2 +REG esri:4304 2 0x1.4p2 -0x1.4p2 +REG esri:4304 3 -0x1.4p2 0x1.4p2 +REG esri:4304 4 0x1.4p2 0x1.4p2 +REG esri:4305 0 0x0.0p0 0x0.0p0 +REG esri:4305 1 -0x1.4p2 -0x1.4p2 +REG esri:4305 2 0x1.4p2 -0x1.4p2 +REG esri:4305 3 -0x1.4p2 0x1.4p2 +REG esri:4305 4 0x1.4p2 0x1.4p2 +REG esri:4306 0 0x0.0p0 0x0.0p0 +REG esri:4306 1 -0x1.4p2 -0x1.4p2 +REG esri:4306 2 0x1.4p2 -0x1.4p2 +REG esri:4306 3 -0x1.4p2 0x1.4p2 +REG esri:4306 4 0x1.4p2 0x1.4p2 +REG esri:4307 0 0x0.0p0 0x0.0p0 +REG esri:4307 1 -0x1.4p2 -0x1.4p2 +REG esri:4307 2 0x1.4p2 -0x1.4p2 +REG esri:4307 3 -0x1.4p2 0x1.4p2 +REG esri:4307 4 0x1.4p2 0x1.4p2 +REG esri:4308 0 0x0.0p0 0x0.0p0 +REG esri:4308 1 -0x1.4p2 -0x1.4p2 +REG esri:4308 2 0x1.4p2 -0x1.4p2 +REG esri:4308 3 -0x1.4p2 0x1.4p2 +REG esri:4308 4 0x1.4p2 0x1.4p2 +REG esri:4309 0 0x0.0p0 0x0.0p0 +REG esri:4309 1 -0x1.4p2 -0x1.4p2 +REG esri:4309 2 0x1.4p2 -0x1.4p2 +REG esri:4309 3 -0x1.4p2 0x1.4p2 +REG esri:4309 4 0x1.4p2 0x1.4p2 +REG esri:4310 0 0x0.0p0 0x0.0p0 +REG esri:4310 1 -0x1.4p2 -0x1.4p2 +REG esri:4310 2 0x1.4p2 -0x1.4p2 +REG esri:4310 3 -0x1.4p2 0x1.4p2 +REG esri:4310 4 0x1.4p2 0x1.4p2 +REG esri:4311 0 0x0.0p0 0x0.0p0 +REG esri:4311 1 -0x1.4p2 -0x1.4p2 +REG esri:4311 2 0x1.4p2 -0x1.4p2 +REG esri:4311 3 -0x1.4p2 0x1.4p2 +REG esri:4311 4 0x1.4p2 0x1.4p2 +REG esri:4312 0 0x0.0p0 0x0.0p0 +REG esri:4312 1 -0x1.4p2 -0x1.4p2 +REG esri:4312 2 0x1.4p2 -0x1.4p2 +REG esri:4312 3 -0x1.4p2 0x1.4p2 +REG esri:4312 4 0x1.4p2 0x1.4p2 +REG esri:4313 0 0x0.0p0 0x0.0p0 +REG esri:4313 1 -0x1.4p2 -0x1.4p2 +REG esri:4313 2 0x1.4p2 -0x1.4p2 +REG esri:4313 3 -0x1.4p2 0x1.4p2 +REG esri:4313 4 0x1.4p2 0x1.4p2 +REG esri:4314 0 0x0.0p0 0x0.0p0 +REG esri:4314 1 -0x1.4p2 -0x1.4p2 +REG esri:4314 2 0x1.4p2 -0x1.4p2 +REG esri:4314 3 -0x1.4p2 0x1.4p2 +REG esri:4314 4 0x1.4p2 0x1.4p2 +REG esri:4315 0 0x0.0p0 0x0.0p0 +REG esri:4315 1 -0x1.4p2 -0x1.4p2 +REG esri:4315 2 0x1.4p2 -0x1.4p2 +REG esri:4315 3 -0x1.4p2 0x1.4p2 +REG esri:4315 4 0x1.4p2 0x1.4p2 +REG esri:4316 0 0x0.0p0 0x0.0p0 +REG esri:4316 1 -0x1.4p2 -0x1.4p2 +REG esri:4316 2 0x1.4p2 -0x1.4p2 +REG esri:4316 3 -0x1.4p2 0x1.4p2 +REG esri:4316 4 0x1.4p2 0x1.4p2 +REG esri:4317 0 0x0.0p0 0x0.0p0 +REG esri:4317 1 -0x1.4p2 -0x1.4p2 +REG esri:4317 2 0x1.4p2 -0x1.4p2 +REG esri:4317 3 -0x1.4p2 0x1.4p2 +REG esri:4317 4 0x1.4p2 0x1.4p2 +REG esri:4318 0 0x0.0p0 0x0.0p0 +REG esri:4318 1 -0x1.4p2 -0x1.4p2 +REG esri:4318 2 0x1.4p2 -0x1.4p2 +REG esri:4318 3 -0x1.4p2 0x1.4p2 +REG esri:4318 4 0x1.4p2 0x1.4p2 +REG esri:4319 0 0x0.0p0 0x0.0p0 +REG esri:4319 1 -0x1.4p2 -0x1.4p2 +REG esri:4319 2 0x1.4p2 -0x1.4p2 +REG esri:4319 3 -0x1.4p2 0x1.4p2 +REG esri:4319 4 0x1.4p2 0x1.4p2 +REG esri:4322 0 0x0.0p0 0x0.0p0 +REG esri:4322 1 -0x1.4p2 -0x1.4p2 +REG esri:4322 2 0x1.4p2 -0x1.4p2 +REG esri:4322 3 -0x1.4p2 0x1.4p2 +REG esri:4322 4 0x1.4p2 0x1.4p2 +REG esri:4324 0 0x0.0p0 0x0.0p0 +REG esri:4324 1 -0x1.4p2 -0x1.4p2 +REG esri:4324 2 0x1.4p2 -0x1.4p2 +REG esri:4324 3 -0x1.4p2 0x1.4p2 +REG esri:4324 4 0x1.4p2 0x1.4p2 +REG esri:4326 0 0x0.0p0 0x0.0p0 +REG esri:4326 1 -0x1.4p2 -0x1.4p2 +REG esri:4326 2 0x1.4p2 -0x1.4p2 +REG esri:4326 3 -0x1.4p2 0x1.4p2 +REG esri:4326 4 0x1.4p2 0x1.4p2 +REG esri:4404 0 0x0.0p0 0x0.0p0 +REG esri:4404 1 -0x1.4p2 -0x1.4p2 +REG esri:4404 2 0x1.4p2 -0x1.4p2 +REG esri:4404 3 -0x1.4p2 0x1.4p2 +REG esri:4404 4 0x1.4p2 0x1.4p2 +REG esri:4600 0 0x0.0p0 0x0.0p0 +REG esri:4600 1 -0x1.4p2 -0x1.4p2 +REG esri:4600 2 0x1.4p2 -0x1.4p2 +REG esri:4600 3 -0x1.4p2 0x1.4p2 +REG esri:4600 4 0x1.4p2 0x1.4p2 +REG esri:4601 0 0x0.0p0 0x0.0p0 +REG esri:4601 1 -0x1.4p2 -0x1.4p2 +REG esri:4601 2 0x1.4p2 -0x1.4p2 +REG esri:4601 3 -0x1.4p2 0x1.4p2 +REG esri:4601 4 0x1.4p2 0x1.4p2 +REG esri:4602 0 0x0.0p0 0x0.0p0 +REG esri:4602 1 -0x1.4p2 -0x1.4p2 +REG esri:4602 2 0x1.4p2 -0x1.4p2 +REG esri:4602 3 -0x1.4p2 0x1.4p2 +REG esri:4602 4 0x1.4p2 0x1.4p2 +REG esri:4603 0 0x0.0p0 0x0.0p0 +REG esri:4603 1 -0x1.4p2 -0x1.4p2 +REG esri:4603 2 0x1.4p2 -0x1.4p2 +REG esri:4603 3 -0x1.4p2 0x1.4p2 +REG esri:4603 4 0x1.4p2 0x1.4p2 +REG esri:4604 0 0x0.0p0 0x0.0p0 +REG esri:4604 1 -0x1.4p2 -0x1.4p2 +REG esri:4604 2 0x1.4p2 -0x1.4p2 +REG esri:4604 3 -0x1.4p2 0x1.4p2 +REG esri:4604 4 0x1.4p2 0x1.4p2 +REG esri:4605 0 0x0.0p0 0x0.0p0 +REG esri:4605 1 -0x1.4p2 -0x1.4p2 +REG esri:4605 2 0x1.4p2 -0x1.4p2 +REG esri:4605 3 -0x1.4p2 0x1.4p2 +REG esri:4605 4 0x1.4p2 0x1.4p2 +REG esri:4606 0 0x0.0p0 0x0.0p0 +REG esri:4606 1 -0x1.4p2 -0x1.4p2 +REG esri:4606 2 0x1.4p2 -0x1.4p2 +REG esri:4606 3 -0x1.4p2 0x1.4p2 +REG esri:4606 4 0x1.4p2 0x1.4p2 +REG esri:4607 0 0x0.0p0 0x0.0p0 +REG esri:4607 1 -0x1.4p2 -0x1.4p2 +REG esri:4607 2 0x1.4p2 -0x1.4p2 +REG esri:4607 3 -0x1.4p2 0x1.4p2 +REG esri:4607 4 0x1.4p2 0x1.4p2 +REG esri:4608 0 0x0.0p0 0x0.0p0 +REG esri:4608 1 -0x1.4p2 -0x1.4p2 +REG esri:4608 2 0x1.4p2 -0x1.4p2 +REG esri:4608 3 -0x1.4p2 0x1.4p2 +REG esri:4608 4 0x1.4p2 0x1.4p2 +REG esri:4609 0 0x0.0p0 0x0.0p0 +REG esri:4609 1 -0x1.4p2 -0x1.4p2 +REG esri:4609 2 0x1.4p2 -0x1.4p2 +REG esri:4609 3 -0x1.4p2 0x1.4p2 +REG esri:4609 4 0x1.4p2 0x1.4p2 +REG esri:4610 0 0x0.0p0 0x0.0p0 +REG esri:4610 1 -0x1.4p2 -0x1.4p2 +REG esri:4610 2 0x1.4p2 -0x1.4p2 +REG esri:4610 3 -0x1.4p2 0x1.4p2 +REG esri:4610 4 0x1.4p2 0x1.4p2 +REG esri:4611 0 0x0.0p0 0x0.0p0 +REG esri:4611 1 -0x1.4p2 -0x1.4p2 +REG esri:4611 2 0x1.4p2 -0x1.4p2 +REG esri:4611 3 -0x1.4p2 0x1.4p2 +REG esri:4611 4 0x1.4p2 0x1.4p2 +REG esri:4612 0 0x0.0p0 0x0.0p0 +REG esri:4612 1 -0x1.4p2 -0x1.4p2 +REG esri:4612 2 0x1.4p2 -0x1.4p2 +REG esri:4612 3 -0x1.4p2 0x1.4p2 +REG esri:4612 4 0x1.4p2 0x1.4p2 +REG esri:4613 0 0x0.0p0 0x0.0p0 +REG esri:4613 1 -0x1.4p2 -0x1.4p2 +REG esri:4613 2 0x1.4p2 -0x1.4p2 +REG esri:4613 3 -0x1.4p2 0x1.4p2 +REG esri:4613 4 0x1.4p2 0x1.4p2 +REG esri:4614 0 0x0.0p0 0x0.0p0 +REG esri:4614 1 -0x1.4p2 -0x1.4p2 +REG esri:4614 2 0x1.4p2 -0x1.4p2 +REG esri:4614 3 -0x1.4p2 0x1.4p2 +REG esri:4614 4 0x1.4p2 0x1.4p2 +REG esri:4615 0 0x0.0p0 0x0.0p0 +REG esri:4615 1 -0x1.4p2 -0x1.4p2 +REG esri:4615 2 0x1.4p2 -0x1.4p2 +REG esri:4615 3 -0x1.4p2 0x1.4p2 +REG esri:4615 4 0x1.4p2 0x1.4p2 +REG esri:4616 0 0x0.0p0 0x0.0p0 +REG esri:4616 1 -0x1.4p2 -0x1.4p2 +REG esri:4616 2 0x1.4p2 -0x1.4p2 +REG esri:4616 3 -0x1.4p2 0x1.4p2 +REG esri:4616 4 0x1.4p2 0x1.4p2 +REG esri:4617 0 0x0.0p0 0x0.0p0 +REG esri:4617 1 -0x1.4p2 -0x1.4p2 +REG esri:4617 2 0x1.4p2 -0x1.4p2 +REG esri:4617 3 -0x1.4p2 0x1.4p2 +REG esri:4617 4 0x1.4p2 0x1.4p2 +REG esri:4801 0 0x0.0p0 0x0.0p0 +REG esri:4801 1 -0x1.4p2 -0x1.4p2 +REG esri:4801 2 0x1.4p2 -0x1.4p2 +REG esri:4801 3 -0x1.4p2 0x1.4p2 +REG esri:4801 4 0x1.4p2 0x1.4p2 +REG esri:4802 0 0x0.0p0 0x0.0p0 +REG esri:4802 1 -0x1.4p2 -0x1.4p2 +REG esri:4802 2 0x1.4p2 -0x1.4p2 +REG esri:4802 3 -0x1.4p2 0x1.4p2 +REG esri:4802 4 0x1.4p2 0x1.4p2 +REG esri:4803 0 0x0.0p0 0x0.0p0 +REG esri:4803 1 -0x1.4p2 -0x1.4p2 +REG esri:4803 2 0x1.4p2 -0x1.4p2 +REG esri:4803 3 -0x1.4p2 0x1.4p2 +REG esri:4803 4 0x1.4p2 0x1.4p2 +REG esri:4804 0 0x0.0p0 0x0.0p0 +REG esri:4804 1 -0x1.4p2 -0x1.4p2 +REG esri:4804 2 0x1.4p2 -0x1.4p2 +REG esri:4804 3 -0x1.4p2 0x1.4p2 +REG esri:4804 4 0x1.4p2 0x1.4p2 +REG esri:4805 0 0x0.0p0 0x0.0p0 +REG esri:4805 1 -0x1.4p2 -0x1.4p2 +REG esri:4805 2 0x1.4p2 -0x1.4p2 +REG esri:4805 3 -0x1.4p2 0x1.4p2 +REG esri:4805 4 0x1.4p2 0x1.4p2 +REG esri:4806 0 0x0.0p0 0x0.0p0 +REG esri:4806 1 -0x1.4p2 -0x1.4p2 +REG esri:4806 2 0x1.4p2 -0x1.4p2 +REG esri:4806 3 -0x1.4p2 0x1.4p2 +REG esri:4806 4 0x1.4p2 0x1.4p2 +REG esri:4807 0 0x0.0p0 0x0.0p0 +REG esri:4807 1 -0x1.4p2 -0x1.4p2 +REG esri:4807 2 0x1.4p2 -0x1.4p2 +REG esri:4807 3 -0x1.4p2 0x1.4p2 +REG esri:4807 4 0x1.4p2 0x1.4p2 +REG esri:4808 0 0x0.0p0 0x0.0p0 +REG esri:4808 1 -0x1.4p2 -0x1.4p2 +REG esri:4808 2 0x1.4p2 -0x1.4p2 +REG esri:4808 3 -0x1.4p2 0x1.4p2 +REG esri:4808 4 0x1.4p2 0x1.4p2 +REG esri:4809 0 0x0.0p0 0x0.0p0 +REG esri:4809 1 -0x1.4p2 -0x1.4p2 +REG esri:4809 2 0x1.4p2 -0x1.4p2 +REG esri:4809 3 -0x1.4p2 0x1.4p2 +REG esri:4809 4 0x1.4p2 0x1.4p2 +REG esri:4810 0 0x0.0p0 0x0.0p0 +REG esri:4810 1 -0x1.4p2 -0x1.4p2 +REG esri:4810 2 0x1.4p2 -0x1.4p2 +REG esri:4810 3 -0x1.4p2 0x1.4p2 +REG esri:4810 4 0x1.4p2 0x1.4p2 +REG esri:4811 0 0x0.0p0 0x0.0p0 +REG esri:4811 1 -0x1.4p2 -0x1.4p2 +REG esri:4811 2 0x1.4p2 -0x1.4p2 +REG esri:4811 3 -0x1.4p2 0x1.4p2 +REG esri:4811 4 0x1.4p2 0x1.4p2 +REG esri:4812 0 0x0.0p0 0x0.0p0 +REG esri:4812 1 -0x1.4p2 -0x1.4p2 +REG esri:4812 2 0x1.4p2 -0x1.4p2 +REG esri:4812 3 -0x1.4p2 0x1.4p2 +REG esri:4812 4 0x1.4p2 0x1.4p2 +REG esri:4813 0 0x0.0p0 0x0.0p0 +REG esri:4813 1 -0x1.4p2 -0x1.4p2 +REG esri:4813 2 0x1.4p2 -0x1.4p2 +REG esri:4813 3 -0x1.4p2 0x1.4p2 +REG esri:4813 4 0x1.4p2 0x1.4p2 +REG esri:4814 0 0x0.0p0 0x0.0p0 +REG esri:4814 1 -0x1.4p2 -0x1.4p2 +REG esri:4814 2 0x1.4p2 -0x1.4p2 +REG esri:4814 3 -0x1.4p2 0x1.4p2 +REG esri:4814 4 0x1.4p2 0x1.4p2 +REG esri:4815 0 0x0.0p0 0x0.0p0 +REG esri:4815 1 -0x1.4p2 -0x1.4p2 +REG esri:4815 2 0x1.4p2 -0x1.4p2 +REG esri:4815 3 -0x1.4p2 0x1.4p2 +REG esri:4815 4 0x1.4p2 0x1.4p2 +REG esri:4816 0 0x0.0p0 0x0.0p0 +REG esri:4816 1 -0x1.4p2 -0x1.4p2 +REG esri:4816 2 0x1.4p2 -0x1.4p2 +REG esri:4816 3 -0x1.4p2 0x1.4p2 +REG esri:4816 4 0x1.4p2 0x1.4p2 +REG esri:4817 0 0x0.0p0 0x0.0p0 +REG esri:4817 1 -0x1.4p2 -0x1.4p2 +REG esri:4817 2 0x1.4p2 -0x1.4p2 +REG esri:4817 3 -0x1.4p2 0x1.4p2 +REG esri:4817 4 0x1.4p2 0x1.4p2 +REG esri:4818 0 0x0.0p0 0x0.0p0 +REG esri:4818 1 -0x1.4p2 -0x1.4p2 +REG esri:4818 2 0x1.4p2 -0x1.4p2 +REG esri:4818 3 -0x1.4p2 0x1.4p2 +REG esri:4818 4 0x1.4p2 0x1.4p2 +REG esri:4819 0 0x0.0p0 0x0.0p0 +REG esri:4819 1 -0x1.4p2 -0x1.4p2 +REG esri:4819 2 0x1.4p2 -0x1.4p2 +REG esri:4819 3 -0x1.4p2 0x1.4p2 +REG esri:4819 4 0x1.4p2 0x1.4p2 +REG esri:4820 0 0x0.0p0 0x0.0p0 +REG esri:4820 1 -0x1.4p2 -0x1.4p2 +REG esri:4820 2 0x1.4p2 -0x1.4p2 +REG esri:4820 3 -0x1.4p2 0x1.4p2 +REG esri:4820 4 0x1.4p2 0x1.4p2 +REG esri:4901 0 0x0.0p0 0x0.0p0 +REG esri:4901 1 -0x1.4p2 -0x1.4p2 +REG esri:4901 2 0x1.4p2 -0x1.4p2 +REG esri:4901 3 -0x1.4p2 0x1.4p2 +REG esri:4901 4 0x1.4p2 0x1.4p2 +REG esri:4902 0 0x0.0p0 0x0.0p0 +REG esri:4902 1 -0x1.4p2 -0x1.4p2 +REG esri:4902 2 0x1.4p2 -0x1.4p2 +REG esri:4902 3 -0x1.4p2 0x1.4p2 +REG esri:4902 4 0x1.4p2 0x1.4p2 +REG esri:4903 0 0x0.0p0 0x0.0p0 +REG esri:4903 1 -0x1.4p2 -0x1.4p2 +REG esri:4903 2 0x1.4p2 -0x1.4p2 +REG esri:4903 3 -0x1.4p2 0x1.4p2 +REG esri:4903 4 0x1.4p2 0x1.4p2 +REG esri:4904 0 0x0.0p0 0x0.0p0 +REG esri:4904 1 -0x1.4p2 -0x1.4p2 +REG esri:4904 2 0x1.4p2 -0x1.4p2 +REG esri:4904 3 -0x1.4p2 0x1.4p2 +REG esri:4904 4 0x1.4p2 0x1.4p2 +REG esri:53001 0 0x0.0p0 0x0.0p0 +REG esri:53001 1 -0x1.4p2 -0x1.4p2 +REG esri:53001 2 0x1.4p2 -0x1.4p2 +REG esri:53001 3 -0x1.4p2 0x1.4p2 +REG esri:53001 4 0x1.4p2 0x1.4p2 +REG esri:53002 0 0x0.0p0 0x0.0p0 +REG esri:53002 1 -0x1.4p2 -0x1.4p2 +REG esri:53002 2 0x1.4p2 -0x1.4p2 +REG esri:53002 3 -0x1.4p2 0x1.4p2 +REG esri:53002 4 0x1.4p2 0x1.4p2 +REG esri:53003 0 0x0.0p0 0x0.0p0 +REG esri:53003 1 -0x1.4p2 -0x1.4p2 +REG esri:53003 2 0x1.4p2 -0x1.4p2 +REG esri:53003 3 -0x1.4p2 0x1.4p2 +REG esri:53003 4 0x1.4p2 0x1.4p2 +REG esri:53004 0 0x0.0p0 0x0.0p0 +REG esri:53004 1 -0x1.4p2 -0x1.4p2 +REG esri:53004 2 0x1.4p2 -0x1.4p2 +REG esri:53004 3 -0x1.4p2 0x1.4p2 +REG esri:53004 4 0x1.4p2 0x1.4p2 +REG esri:53008 0 0x0.0p0 0x0.0p0 +REG esri:53008 1 -0x1.4p2 -0x1.4p2 +REG esri:53008 2 0x1.4p2 -0x1.4p2 +REG esri:53008 3 -0x1.4p2 0x1.4p2 +REG esri:53008 4 0x1.4p2 0x1.4p2 +REG esri:53009 0 0x0.0p0 0x0.0p0 +REG esri:53009 1 -0x1.4p2 -0x1.4p2 +REG esri:53009 2 0x1.4p2 -0x1.4p2 +REG esri:53009 3 -0x1.4p2 0x1.4p2 +REG esri:53009 4 0x1.4p2 0x1.4p2 +REG esri:53010 0 0x0.0p0 0x0.0p0 +REG esri:53010 1 -0x1.4p2 -0x1.4p2 +REG esri:53010 2 0x1.4p2 -0x1.4p2 +REG esri:53010 3 -0x1.4p2 0x1.4p2 +REG esri:53010 4 0x1.4p2 0x1.4p2 +REG esri:53011 0 0x0.0p0 0x0.0p0 +REG esri:53011 1 -0x1.4p2 -0x1.4p2 +REG esri:53011 2 0x1.4p2 -0x1.4p2 +REG esri:53011 3 -0x1.4p2 0x1.4p2 +REG esri:53011 4 0x1.4p2 0x1.4p2 +REG esri:53012 0 0x0.0p0 0x0.0p0 +REG esri:53012 1 -0x1.4p2 -0x1.4p2 +REG esri:53012 2 0x1.4p2 -0x1.4p2 +REG esri:53012 3 -0x1.4p2 0x1.4p2 +REG esri:53012 4 0x1.4p2 0x1.4p2 +REG esri:53013 0 0x0.0p0 0x0.0p0 +REG esri:53013 1 -0x1.4p2 -0x1.4p2 +REG esri:53013 2 0x1.4p2 -0x1.4p2 +REG esri:53013 3 -0x1.4p2 0x1.4p2 +REG esri:53013 4 0x1.4p2 0x1.4p2 +REG esri:53014 0 0x0.0p0 0x0.0p0 +REG esri:53014 1 -0x1.4p2 -0x1.4p2 +REG esri:53014 2 0x1.4p2 -0x1.4p2 +REG esri:53014 3 -0x1.4p2 0x1.4p2 +REG esri:53014 4 0x1.4p2 0x1.4p2 +REG esri:53015 0 0x0.0p0 0x0.0p0 +REG esri:53015 1 -0x1.4p2 -0x1.4p2 +REG esri:53015 2 0x1.4p2 -0x1.4p2 +REG esri:53015 3 -0x1.4p2 0x1.4p2 +REG esri:53015 4 0x1.4p2 0x1.4p2 +REG esri:53016 0 0x0.0p0 0x0.0p0 +REG esri:53016 1 -0x1.4p2 -0x1.4p2 +REG esri:53016 2 0x1.4p2 -0x1.4p2 +REG esri:53016 3 -0x1.4p2 0x1.4p2 +REG esri:53016 4 0x1.4p2 0x1.4p2 +REG esri:53017 0 0x0.0p0 0x0.0p0 +REG esri:53017 1 -0x1.4p2 -0x1.4p2 +REG esri:53017 2 0x1.4p2 -0x1.4p2 +REG esri:53017 3 -0x1.4p2 0x1.4p2 +REG esri:53017 4 0x1.4p2 0x1.4p2 +REG esri:53018 0 0x0.0p0 0x0.0p0 +REG esri:53018 1 -0x1.4p2 -0x1.4p2 +REG esri:53018 2 0x1.4p2 -0x1.4p2 +REG esri:53018 3 -0x1.4p2 0x1.4p2 +REG esri:53018 4 0x1.4p2 0x1.4p2 +REG esri:53019 0 0x0.0p0 0x0.0p0 +REG esri:53019 1 -0x1.4p2 -0x1.4p2 +REG esri:53019 2 0x1.4p2 -0x1.4p2 +REG esri:53019 3 -0x1.4p2 0x1.4p2 +REG esri:53019 4 0x1.4p2 0x1.4p2 +REG esri:53021 0 0x0.0p0 0x0.0p0 +REG esri:53021 1 -0x1.4p2 -0x1.4p2 +REG esri:53021 2 0x1.4p2 -0x1.4p2 +REG esri:53021 3 -0x1.4p2 0x1.4p2 +REG esri:53021 4 0x1.4p2 0x1.4p2 +REG esri:53022 0 0x0.0p0 0x0.0p0 +REG esri:53022 1 -0x1.4p2 -0x1.4p2 +REG esri:53022 2 0x1.4p2 -0x1.4p2 +REG esri:53022 3 -0x1.4p2 0x1.4p2 +REG esri:53022 4 0x1.4p2 0x1.4p2 +REG esri:53023 0 0x0.0p0 0x0.0p0 +REG esri:53023 1 -0x1.4p2 -0x1.4p2 +REG esri:53023 2 0x1.4p2 -0x1.4p2 +REG esri:53023 3 -0x1.4p2 0x1.4p2 +REG esri:53023 4 0x1.4p2 0x1.4p2 +REG esri:53024 0 0x0.0p0 0x0.0p0 +REG esri:53024 1 -0x1.4p2 -0x1.4p2 +REG esri:53024 2 0x1.4p2 -0x1.4p2 +REG esri:53024 3 -0x1.4p2 0x1.4p2 +REG esri:53024 4 0x1.4p2 0x1.4p2 +REG esri:53025 0 0x0.0p0 0x0.0p0 +REG esri:53025 1 -0x1.4p2 -0x1.4p2 +REG esri:53025 2 0x1.4p2 -0x1.4p2 +REG esri:53025 3 -0x1.4p2 0x1.4p2 +REG esri:53025 4 0x1.4p2 0x1.4p2 +REG esri:53026 0 0x0.0p0 0x0.0p0 +REG esri:53026 1 -0x1.4p2 -0x1.4p2 +REG esri:53026 2 0x1.4p2 -0x1.4p2 +REG esri:53026 3 -0x1.4p2 0x1.4p2 +REG esri:53026 4 0x1.4p2 0x1.4p2 +REG esri:53027 0 0x0.0p0 0x1.ep4 +REG esri:53027 1 -0x1.1520cd1372feap4 0x1.ep3 +REG esri:53027 2 0x1.1520cd1372feap4 0x1.ep3 +REG esri:53027 3 -0x1.1520cd1372feap4 0x1.68p5 +REG esri:53027 4 0x1.1520cd1372feap4 0x1.68p5 +REG esri:53028 0 0x0.0p0 0x0.0p0 +REG esri:53028 1 -0x1.4p2 -0x1.4p2 +REG esri:53028 2 0x1.4p2 -0x1.4p2 +REG esri:53028 3 -0x1.4p2 0x1.4p2 +REG esri:53028 4 0x1.4p2 0x1.4p2 +REG esri:53029 0 0x0.0p0 0x0.0p0 +REG esri:53029 1 -0x1.4p2 -0x1.4p2 +REG esri:53029 2 0x1.4p2 -0x1.4p2 +REG esri:53029 3 -0x1.4p2 0x1.4p2 +REG esri:53029 4 0x1.4p2 0x1.4p2 +REG esri:53030 0 0x0.0p0 0x0.0p0 +REG esri:53030 1 -0x1.4p2 -0x1.4p2 +REG esri:53030 2 0x1.4p2 -0x1.4p2 +REG esri:53030 3 -0x1.4p2 0x1.4p2 +REG esri:53030 4 0x1.4p2 0x1.4p2 +REG esri:53031 0 0x0.0p0 0x0.0p0 +REG esri:53031 1 -0x1.4p2 -0x1.4p2 +REG esri:53031 2 0x1.4p2 -0x1.4p2 +REG esri:53031 3 -0x1.4p2 0x1.4p2 +REG esri:53031 4 0x1.4p2 0x1.4p2 +REG esri:53032 0 0x0.0p0 0x0.0p0 +REG esri:53032 1 -0x1.4p2 -0x1.4p2 +REG esri:53032 2 0x1.4p2 -0x1.4p2 +REG esri:53032 3 -0x1.4p2 0x1.4p2 +REG esri:53032 4 0x1.4p2 0x1.4p2 +REG esri:54001 0 0x0.0p0 0x0.0p0 +REG esri:54001 1 -0x1.4p2 -0x1.4p2 +REG esri:54001 2 0x1.4p2 -0x1.4p2 +REG esri:54001 3 -0x1.4p2 0x1.4p2 +REG esri:54001 4 0x1.4p2 0x1.4p2 +REG esri:54002 0 0x0.0p0 0x0.0p0 +REG esri:54002 1 -0x1.4p2 -0x1.4p2 +REG esri:54002 2 0x1.4p2 -0x1.4p2 +REG esri:54002 3 -0x1.4p2 0x1.4p2 +REG esri:54002 4 0x1.4p2 0x1.4p2 +REG esri:54003 0 0x0.0p0 0x0.0p0 +REG esri:54003 1 -0x1.4p2 -0x1.4p2 +REG esri:54003 2 0x1.4p2 -0x1.4p2 +REG esri:54003 3 -0x1.4p2 0x1.4p2 +REG esri:54003 4 0x1.4p2 0x1.4p2 +REG esri:54004 0 0x0.0p0 0x0.0p0 +REG esri:54004 1 -0x1.4p2 -0x1.4p2 +REG esri:54004 2 0x1.4p2 -0x1.4p2 +REG esri:54004 3 -0x1.4p2 0x1.4p2 +REG esri:54004 4 0x1.4p2 0x1.4p2 +REG esri:54008 0 0x0.0p0 0x0.0p0 +REG esri:54008 1 -0x1.4p2 -0x1.4p2 +REG esri:54008 2 0x1.4p2 -0x1.4p2 +REG esri:54008 3 -0x1.4p2 0x1.4p2 +REG esri:54008 4 0x1.4p2 0x1.4p2 +REG esri:54009 0 0x0.0p0 0x0.0p0 +REG esri:54009 1 -0x1.4p2 -0x1.4p2 +REG esri:54009 2 0x1.4p2 -0x1.4p2 +REG esri:54009 3 -0x1.4p2 0x1.4p2 +REG esri:54009 4 0x1.4p2 0x1.4p2 +REG esri:54010 0 0x0.0p0 0x0.0p0 +REG esri:54010 1 -0x1.4p2 -0x1.4p2 +REG esri:54010 2 0x1.4p2 -0x1.4p2 +REG esri:54010 3 -0x1.4p2 0x1.4p2 +REG esri:54010 4 0x1.4p2 0x1.4p2 +REG esri:54011 0 0x0.0p0 0x0.0p0 +REG esri:54011 1 -0x1.4p2 -0x1.4p2 +REG esri:54011 2 0x1.4p2 -0x1.4p2 +REG esri:54011 3 -0x1.4p2 0x1.4p2 +REG esri:54011 4 0x1.4p2 0x1.4p2 +REG esri:54012 0 0x0.0p0 0x0.0p0 +REG esri:54012 1 -0x1.4p2 -0x1.4p2 +REG esri:54012 2 0x1.4p2 -0x1.4p2 +REG esri:54012 3 -0x1.4p2 0x1.4p2 +REG esri:54012 4 0x1.4p2 0x1.4p2 +REG esri:54013 0 0x0.0p0 0x0.0p0 +REG esri:54013 1 -0x1.4p2 -0x1.4p2 +REG esri:54013 2 0x1.4p2 -0x1.4p2 +REG esri:54013 3 -0x1.4p2 0x1.4p2 +REG esri:54013 4 0x1.4p2 0x1.4p2 +REG esri:54014 0 0x0.0p0 0x0.0p0 +REG esri:54014 1 -0x1.4p2 -0x1.4p2 +REG esri:54014 2 0x1.4p2 -0x1.4p2 +REG esri:54014 3 -0x1.4p2 0x1.4p2 +REG esri:54014 4 0x1.4p2 0x1.4p2 +REG esri:54015 0 0x0.0p0 0x0.0p0 +REG esri:54015 1 -0x1.4p2 -0x1.4p2 +REG esri:54015 2 0x1.4p2 -0x1.4p2 +REG esri:54015 3 -0x1.4p2 0x1.4p2 +REG esri:54015 4 0x1.4p2 0x1.4p2 +REG esri:54016 0 0x0.0p0 0x0.0p0 +REG esri:54016 1 -0x1.4p2 -0x1.4p2 +REG esri:54016 2 0x1.4p2 -0x1.4p2 +REG esri:54016 3 -0x1.4p2 0x1.4p2 +REG esri:54016 4 0x1.4p2 0x1.4p2 +REG esri:54017 0 0x0.0p0 0x0.0p0 +REG esri:54017 1 -0x1.4p2 -0x1.4p2 +REG esri:54017 2 0x1.4p2 -0x1.4p2 +REG esri:54017 3 -0x1.4p2 0x1.4p2 +REG esri:54017 4 0x1.4p2 0x1.4p2 +REG esri:54018 0 0x0.0p0 0x0.0p0 +REG esri:54018 1 -0x1.4p2 -0x1.4p2 +REG esri:54018 2 0x1.4p2 -0x1.4p2 +REG esri:54018 3 -0x1.4p2 0x1.4p2 +REG esri:54018 4 0x1.4p2 0x1.4p2 +REG esri:54019 0 0x0.0p0 0x0.0p0 +REG esri:54019 1 -0x1.4p2 -0x1.4p2 +REG esri:54019 2 0x1.4p2 -0x1.4p2 +REG esri:54019 3 -0x1.4p2 0x1.4p2 +REG esri:54019 4 0x1.4p2 0x1.4p2 +REG esri:54021 0 0x0.0p0 0x0.0p0 +REG esri:54021 1 -0x1.4p2 -0x1.4p2 +REG esri:54021 2 0x1.4p2 -0x1.4p2 +REG esri:54021 3 -0x1.4p2 0x1.4p2 +REG esri:54021 4 0x1.4p2 0x1.4p2 +REG esri:54022 0 0x0.0p0 0x0.0p0 +REG esri:54022 1 -0x1.4p2 -0x1.4p2 +REG esri:54022 2 0x1.4p2 -0x1.4p2 +REG esri:54022 3 -0x1.4p2 0x1.4p2 +REG esri:54022 4 0x1.4p2 0x1.4p2 +REG esri:54023 0 0x0.0p0 0x0.0p0 +REG esri:54023 1 -0x1.4p2 -0x1.4p2 +REG esri:54023 2 0x1.4p2 -0x1.4p2 +REG esri:54023 3 -0x1.4p2 0x1.4p2 +REG esri:54023 4 0x1.4p2 0x1.4p2 +REG esri:54024 0 0x0.0p0 0x0.0p0 +REG esri:54024 1 -0x1.4p2 -0x1.4p2 +REG esri:54024 2 0x1.4p2 -0x1.4p2 +REG esri:54024 3 -0x1.4p2 0x1.4p2 +REG esri:54024 4 0x1.4p2 0x1.4p2 +REG esri:54025 0 0x0.0p0 0x0.0p0 +REG esri:54025 1 -0x1.4p2 -0x1.4p2 +REG esri:54025 2 0x1.4p2 -0x1.4p2 +REG esri:54025 3 -0x1.4p2 0x1.4p2 +REG esri:54025 4 0x1.4p2 0x1.4p2 +REG esri:54026 0 0x0.0p0 0x0.0p0 +REG esri:54026 1 -0x1.4p2 -0x1.4p2 +REG esri:54026 2 0x1.4p2 -0x1.4p2 +REG esri:54026 3 -0x1.4p2 0x1.4p2 +REG esri:54026 4 0x1.4p2 0x1.4p2 +REG esri:54027 0 0x0.0p0 0x1.ep4 +REG esri:54027 1 -0x1.1520cd1372feap4 0x1.ep3 +REG esri:54027 2 0x1.1520cd1372feap4 0x1.ep3 +REG esri:54027 3 -0x1.1520cd1372feap4 0x1.68p5 +REG esri:54027 4 0x1.1520cd1372feap4 0x1.68p5 +REG esri:54028 0 0x0.0p0 0x0.0p0 +REG esri:54028 1 -0x1.4p2 -0x1.4p2 +REG esri:54028 2 0x1.4p2 -0x1.4p2 +REG esri:54028 3 -0x1.4p2 0x1.4p2 +REG esri:54028 4 0x1.4p2 0x1.4p2 +REG esri:54029 0 0x0.0p0 0x0.0p0 +REG esri:54029 1 -0x1.4p2 -0x1.4p2 +REG esri:54029 2 0x1.4p2 -0x1.4p2 +REG esri:54029 3 -0x1.4p2 0x1.4p2 +REG esri:54029 4 0x1.4p2 0x1.4p2 +REG esri:54030 0 0x0.0p0 0x0.0p0 +REG esri:54030 1 -0x1.4p2 -0x1.4p2 +REG esri:54030 2 0x1.4p2 -0x1.4p2 +REG esri:54030 3 -0x1.4p2 0x1.4p2 +REG esri:54030 4 0x1.4p2 0x1.4p2 +REG esri:54031 0 0x0.0p0 0x0.0p0 +REG esri:54031 1 -0x1.4p2 -0x1.4p2 +REG esri:54031 2 0x1.4p2 -0x1.4p2 +REG esri:54031 3 -0x1.4p2 0x1.4p2 +REG esri:54031 4 0x1.4p2 0x1.4p2 +REG esri:54032 0 0x0.0p0 0x0.0p0 +REG esri:54032 1 -0x1.4p2 -0x1.4p2 +REG esri:54032 2 0x1.4p2 -0x1.4p2 +REG esri:54032 3 -0x1.4p2 0x1.4p2 +REG esri:54032 4 0x1.4p2 0x1.4p2 +REG esri:65061 0 -0x1.217f5c40a26fcp7 0x1.af1e71c1b482cp3 +REG esri:65061 1 -0x1.2bc7ccc34d7d4p7 0x1.0f1e71c1b482cp3 +REG esri:65061 2 -0x1.1736ebbdf7624p7 0x1.0f1e71c1b482cp3 +REG esri:65061 3 -0x1.2bc7ccc34d7d4p7 0x1.278f38e0da416p4 +REG esri:65061 4 -0x1.1736ebbdf7624p7 0x1.278f38e0da416p4 +REG esri:65161 0 -0x1.217f5c40a26fcp7 0x1.af1e71c1b482cp3 +REG esri:65161 1 -0x1.2bc7ccc34d7d4p7 0x1.0f1e71c1b482cp3 +REG esri:65161 2 -0x1.1736ebbdf7624p7 0x1.0f1e71c1b482cp3 +REG esri:65161 3 -0x1.2bc7ccc34d7d4p7 0x1.278f38e0da416p4 +REG esri:65161 4 -0x1.1736ebbdf7624p7 0x1.278f38e0da416p4 +REG nad27:1001 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG nad27:1001 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG nad27:1001 2 -0x1.31929993b66adp6 0x1.9p4 +REG nad27:1001 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG nad27:1001 4 -0x1.31929993b66adp6 0x1.18p5 +REG nad27:1002 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG nad27:1002 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG nad27:1002 2 -0x1.39929993b66adp6 0x1.9p4 +REG nad27:1002 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG nad27:1002 4 -0x1.39929993b66adp6 0x1.18p5 +REG nad27:101 0 -0x1.5755555555555p6 0x1.e8p4 +REG nad27:101 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG nad27:101 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG nad27:101 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG nad27:101 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG nad27:102 0 -0x1.5ep6 0x1.ep4 +REG nad27:102 1 -0x1.75181116f43fep6 0x1.9p4 +REG nad27:102 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG nad27:102 3 -0x1.75181116f43fep6 0x1.18p5 +REG nad27:102 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG nad27:1101 0 -0x1.c0aaaaaaaaaabp6 0x1.4d55555555555p5 +REG nad27:1101 1 -0x1.db708506a0f7p6 0x1.2555555555555p5 +REG nad27:1101 2 -0x1.a5e4d04eb45e6p6 0x1.2555555555555p5 +REG nad27:1101 3 -0x1.db708506a0f7p6 0x1.7555555555555p5 +REG nad27:1101 4 -0x1.a5e4d04eb45e6p6 0x1.7555555555555p5 +REG nad27:1102 0 -0x1.c8p6 0x1.4d55555555555p5 +REG nad27:1102 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555555p5 +REG nad27:1102 2 -0x1.ad3a25a409b3bp6 0x1.2555555555555p5 +REG nad27:1102 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555555p5 +REG nad27:1102 4 -0x1.ad3a25a409b3bp6 0x1.7555555555555p5 +REG nad27:1103 0 -0x1.cfp6 0x1.4d55555555555p5 +REG nad27:1103 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555555p5 +REG nad27:1103 2 -0x1.b43a25a409b3bp6 0x1.2555555555555p5 +REG nad27:1103 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555555p5 +REG nad27:1103 4 -0x1.b43a25a409b3bp6 0x1.7555555555555p5 +REG nad27:1201 0 -0x1.6155555555555p6 0x1.2555555555555p5 +REG nad27:1201 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaaap4 +REG nad27:1201 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaaap4 +REG nad27:1201 3 -0x1.7a44648b5bcfp6 0x1.4d55555555555p5 +REG nad27:1201 4 -0x1.4866461f4edbap6 0x1.4d55555555555p5 +REG nad27:1202 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555555p5 +REG nad27:1202 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaaap4 +REG nad27:1202 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaaap4 +REG nad27:1202 3 -0x1.8199b9e0b1246p6 0x1.4d55555555555p5 +REG nad27:1202 4 -0x1.4fbb9b74a431p6 0x1.4d55555555555p5 +REG nad27:1301 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG nad27:1301 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG nad27:1301 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG nad27:1301 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG nad27:1301 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG nad27:1302 0 -0x1.5c55555555555p6 0x1.2cp5 +REG nad27:1302 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG nad27:1302 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG nad27:1302 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG nad27:1302 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG nad27:1401 0 -0x1.76p6 0x1.5311111111111p5 +REG nad27:1401 1 -0x1.7f9125dd29e12p6 0x1.44eeeeeeeeeefp5 +REG nad27:1401 2 -0x1.6c6eda22d61eep6 0x1.44eeeeeeeeeefp5 +REG nad27:1401 3 -0x1.7f9125dd29e12p6 0x1.6133333333333p5 +REG nad27:1401 4 -0x1.6c6eda22d61eep6 0x1.6133333333333p5 +REG nad27:1402 0 -0x1.76p6 0x1.4722222222222p5 +REG nad27:1402 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG nad27:1402 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG nad27:1402 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG nad27:1402 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG nad27:1501 0 -0x1.88p6 0x1.3877777777778p5 +REG nad27:1501 1 -0x1.8f7828773d561p6 0x1.2cddddddddddfp5 +REG nad27:1501 2 -0x1.8087d788c2a9fp6 0x1.2cddddddddddfp5 +REG nad27:1501 3 -0x1.8f7828773d561p6 0x1.4411111111111p5 +REG nad27:1501 4 -0x1.8087d788c2a9fp6 0x1.4411111111111p5 +REG nad27:1502 0 -0x1.8ap6 0x1.2ceeeeeeeeeefp5 +REG nad27:1502 1 -0x1.939837c9c43e7p6 0x1.1dbbbbbbbbbbbp5 +REG nad27:1502 2 -0x1.8067c8363bc19p6 0x1.1dbbbbbbbbbbbp5 +REG nad27:1502 3 -0x1.939837c9c43e7p6 0x1.3c22222222223p5 +REG nad27:1502 4 -0x1.8067c8363bc19p6 0x1.3c22222222223p5 +REG nad27:1601 0 -0x1.51p6 0x1.31ddddddddddep5 +REG nad27:1601 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG nad27:1601 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG nad27:1601 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG nad27:1601 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG nad27:1602 0 -0x1.57p6 0x1.2911111111111p5 +REG nad27:1602 1 -0x1.5f071bc4256ebp6 0x1.1c44444444445p5 +REG nad27:1602 2 -0x1.4ef8e43bda915p6 0x1.1c44444444445p5 +REG nad27:1602 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG nad27:1602 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG nad27:1701 0 -0x1.72p6 0x1.faaaaaaaaaaaap4 +REG nad27:1701 1 -0x1.7b66402708f88p6 0x1.daaaaaaaaaaabp4 +REG nad27:1701 2 -0x1.6899bfd8f7078p6 0x1.daaaaaaaaaaabp4 +REG nad27:1701 3 -0x1.7b66402708f88p6 0x1.0d55555555554p5 +REG nad27:1701 4 -0x1.6899bfd8f7078p6 0x1.0d55555555554p5 +REG nad27:1702 0 -0x1.6d55555555555p6 0x1.daeeeeeeeeeefp4 +REG nad27:1702 1 -0x1.76b1f683c31b2p6 0x1.ba66666666667p4 +REG nad27:1702 2 -0x1.63f8b426e78f8p6 0x1.ba66666666667p4 +REG nad27:1702 3 -0x1.76b1f683c31b2p6 0x1.fb77777777777p4 +REG nad27:1702 4 -0x1.63f8b426e78f8p6 0x1.fb77777777777p4 +REG nad27:1703 0 -0x1.6d55555555555p6 0x1.acp4 +REG nad27:1703 1 -0x1.7709e6ac1bc4ep6 0x1.8955555555556p4 +REG nad27:1703 2 -0x1.63a0c3fe8ee5cp6 0x1.8955555555556p4 +REG nad27:1703 3 -0x1.7709e6ac1bc4ep6 0x1.ceaaaaaaaaaaap4 +REG nad27:1703 4 -0x1.63a0c3fe8ee5cp6 0x1.ceaaaaaaaaaaap4 +REG nad27:1801 0 -0x1.12p6 0x1.5eaaaaaaaaaabp5 +REG nad27:1801 1 -0x1.2db9bac668c18p6 0x1.36aaaaaaaaaabp5 +REG nad27:1801 2 -0x1.ec8c8a732e7dp5 0x1.36aaaaaaaaaabp5 +REG nad27:1801 3 -0x1.2db9bac668c18p6 0x1.86aaaaaaaaaabp5 +REG nad27:1801 4 -0x1.ec8c8a732e7dp5 0x1.86aaaaaaaaaabp5 +REG nad27:1802 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaabp5 +REG nad27:1802 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaabp5 +REG nad27:1802 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaabp5 +REG nad27:1802 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaabp5 +REG nad27:1802 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaabp5 +REG nad27:1900 0 -0x1.34p6 0x1.3522222222222p5 +REG nad27:1900 1 -0x1.3c477eb6c7663p6 0x1.2833333333333p5 +REG nad27:1900 2 -0x1.2bb881493899dp6 0x1.2833333333333p5 +REG nad27:1900 3 -0x1.3c477eb6c7663p6 0x1.4211111111111p5 +REG nad27:1900 4 -0x1.2bb881493899dp6 0x1.4211111111111p5 +REG nad27:2001 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG nad27:2001 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG nad27:2001 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG nad27:2001 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG nad27:2001 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG nad27:2002 0 -0x1.1ap6 0x1.49eeeeeeeeeefp5 +REG nad27:2002 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeefp5 +REG nad27:2002 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeefp5 +REG nad27:2002 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeefp5 +REG nad27:2002 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeefp5 +REG nad27:201 0 -0x1.b8aaaaaaaaaabp6 0x1.fp4 +REG nad27:201 1 -0x1.cfffd4649fe42p6 0x1.ap4 +REG nad27:201 2 -0x1.a15580f0b5714p6 0x1.ap4 +REG nad27:201 3 -0x1.cfffd4649fe42p6 0x1.2p5 +REG nad27:201 4 -0x1.a15580f0b5714p6 0x1.2p5 +REG nad27:202 0 -0x1.bfaaaaaaaaaabp6 0x1.fp4 +REG nad27:202 1 -0x1.d6ffd4649fe42p6 0x1.ap4 +REG nad27:202 2 -0x1.a85580f0b5714p6 0x1.ap4 +REG nad27:202 3 -0x1.d6ffd4649fe42p6 0x1.2p5 +REG nad27:202 4 -0x1.a85580f0b5714p6 0x1.2p5 +REG nad27:203 0 -0x1.c7p6 0x1.fp4 +REG nad27:203 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG nad27:203 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG nad27:203 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG nad27:203 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG nad27:2101 0 -0x1.4eaaaaaaaaaabp6 0x1.4cp5 +REG nad27:2101 1 -0x1.695eda12b767bp6 0x1.24p5 +REG nad27:2101 2 -0x1.33f67b429dedbp6 0x1.24p5 +REG nad27:2101 3 -0x1.695eda12b767bp6 0x1.74p5 +REG nad27:2101 4 -0x1.33f67b429dedbp6 0x1.74p5 +REG nad27:2102 0 -0x1.57p6 0x1.4cp5 +REG nad27:2102 1 -0x1.71b42f680cbdp6 0x1.24p5 +REG nad27:2102 2 -0x1.3c4bd097f343p6 0x1.24p5 +REG nad27:2102 3 -0x1.71b42f680cbdp6 0x1.74p5 +REG nad27:2102 4 -0x1.3c4bd097f343p6 0x1.74p5 +REG nad27:2103 0 -0x1.63p6 0x1.4cp5 +REG nad27:2103 1 -0x1.7db42f680cbdp6 0x1.24p5 +REG nad27:2103 2 -0x1.484bd097f343p6 0x1.24p5 +REG nad27:2103 3 -0x1.7db42f680cbdp6 0x1.74p5 +REG nad27:2103 4 -0x1.484bd097f343p6 0x1.74p5 +REG nad27:2111 0 -0x1.5cp6 0x1.6f77777777778p5 +REG nad27:2111 1 -0x1.693a5d9ac6985p6 0x1.5d11111111111p5 +REG nad27:2111 2 -0x1.4ec5a2653967bp6 0x1.5d11111111111p5 +REG nad27:2111 3 -0x1.693a5d9ac6985p6 0x1.81ddddddddddfp5 +REG nad27:2111 4 -0x1.4ec5a2653967bp6 0x1.81ddddddddddfp5 +REG nad27:2112 0 -0x1.5155555555555p6 0x1.6411111111112p5 +REG nad27:2112 1 -0x1.5eb3874abc71ap6 0x1.5100000000001p5 +REG nad27:2112 2 -0x1.43f7235fee39p6 0x1.5100000000001p5 +REG nad27:2112 3 -0x1.5eb3874abc71ap6 0x1.7722222222223p5 +REG nad27:2112 4 -0x1.43f7235fee39p6 0x1.7722222222223p5 +REG nad27:2113 0 -0x1.5155555555555p6 0x1.54aaaaaaaaaaap5 +REG nad27:2113 1 -0x1.5d1a9f6347bf9p6 0x1.4355555555555p5 +REG nad27:2113 2 -0x1.45900b4762eb1p6 0x1.4355555555555p5 +REG nad27:2113 3 -0x1.5d1a9f6347bf9p6 0x1.65fffffffffffp5 +REG nad27:2113 4 -0x1.45900b4762eb1p6 0x1.65fffffffffffp5 +REG nad27:2201 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG nad27:2201 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG nad27:2201 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG nad27:2201 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG nad27:2201 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG nad27:2202 0 -0x1.79p6 0x1.7033333333333p5 +REG nad27:2202 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG nad27:2202 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG nad27:2202 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG nad27:2202 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG nad27:2203 0 -0x1.78p6 0x1.60ddddddddddep5 +REG nad27:2203 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG nad27:2203 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG nad27:2203 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG nad27:2203 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG nad27:2301 0 -0x1.6355555555555p6 0x1.daaaaaaaaaaabp4 +REG nad27:2301 1 -0x1.7a59b545a2bp6 0x1.8aaaaaaaaaaabp4 +REG nad27:2301 2 -0x1.4c50f56507faap6 0x1.8aaaaaaaaaaabp4 +REG nad27:2301 3 -0x1.7a59b545a2bp6 0x1.1555555555556p5 +REG nad27:2301 4 -0x1.4c50f56507faap6 0x1.1555555555556p5 +REG nad27:2302 0 -0x1.6955555555555p6 0x1.e8p4 +REG nad27:2302 1 -0x1.808b909d9872bp6 0x1.98p4 +REG nad27:2302 2 -0x1.521f1a0d1237fp6 0x1.98p4 +REG nad27:2302 3 -0x1.808b909d9872bp6 0x1.1cp5 +REG nad27:2302 4 -0x1.521f1a0d1237fp6 0x1.1cp5 +REG nad27:2401 0 -0x1.6ap6 0x1.1eaaaaaaaaaabp5 +REG nad27:2401 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555556p4 +REG nad27:2401 2 -0x1.5154a6f944b4fp6 0x1.ed55555555556p4 +REG nad27:2401 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaabp5 +REG nad27:2401 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaabp5 +REG nad27:2402 0 -0x1.72p6 0x1.1eaaaaaaaaaabp5 +REG nad27:2402 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555556p4 +REG nad27:2402 2 -0x1.5954a6f944b4fp6 0x1.ed55555555556p4 +REG nad27:2402 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaabp5 +REG nad27:2402 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaabp5 +REG nad27:2403 0 -0x1.7ap6 0x1.2155555555555p5 +REG nad27:2403 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaaap4 +REG nad27:2403 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaaap4 +REG nad27:2403 3 -0x1.92c61931dde5cp6 0x1.4955555555555p5 +REG nad27:2403 4 -0x1.6139e6ce221a4p6 0x1.4955555555555p5 +REG nad27:2501 0 -0x1.b6p6 0x1.7eddddddddddep5 +REG nad27:2501 1 -0x1.c03be7769007bp6 0x1.7122222222222p5 +REG nad27:2501 2 -0x1.abc418896ff85p6 0x1.7122222222222p5 +REG nad27:2501 3 -0x1.c03be7769007bp6 0x1.8c9999999999ap5 +REG nad27:2501 4 -0x1.abc418896ff85p6 0x1.8c9999999999ap5 +REG nad27:2502 0 -0x1.b6p6 0x1.76ddddddddddep5 +REG nad27:2502 1 -0x1.c1fde20665f3p6 0x1.6677777777778p5 +REG nad27:2502 2 -0x1.aa021df99a0dp6 0x1.6677777777778p5 +REG nad27:2502 3 -0x1.c1fde20665f3p6 0x1.8744444444444p5 +REG nad27:2502 4 -0x1.aa021df99a0dp6 0x1.8744444444444p5 +REG nad27:2503 0 -0x1.b6p6 0x1.699999999999ap5 +REG nad27:2503 1 -0x1.c39fc45f44299p6 0x1.5666666666667p5 +REG nad27:2503 2 -0x1.a8603ba0bbd67p6 0x1.5666666666667p5 +REG nad27:2503 3 -0x1.c39fc45f44299p6 0x1.7cccccccccccdp5 +REG nad27:2503 4 -0x1.a8603ba0bbd67p6 0x1.7cccccccccccdp5 +REG nad27:2601 0 -0x1.9p6 0x1.509999999999ap5 +REG nad27:2601 1 -0x1.97fe570c30a3ap6 0x1.44bbbbbbbbbbcp5 +REG nad27:2601 2 -0x1.8801a8f3cf5c6p6 0x1.44bbbbbbbbbbcp5 +REG nad27:2601 3 -0x1.97fe570c30a3ap6 0x1.5c77777777778p5 +REG nad27:2601 4 -0x1.8801a8f3cf5c6p6 0x1.5c77777777778p5 +REG nad27:2602 0 -0x1.8ep6 0x1.4588888888888p5 +REG nad27:2602 1 -0x1.98d08e5c9d95ep6 0x1.3522222222221p5 +REG nad27:2602 2 -0x1.832f71a3626a2p6 0x1.3522222222221p5 +REG nad27:2602 3 -0x1.98d08e5c9d95ep6 0x1.55eeeeeeeeeefp5 +REG nad27:2602 4 -0x1.832f71a3626a2p6 0x1.55eeeeeeeeeefp5 +REG nad27:2701 0 -0x1.ce55555555555p6 0x1.16p5 +REG nad27:2701 1 -0x1.e6acb863f64b3p6 0x1.dcp4 +REG nad27:2701 2 -0x1.b5fdf246b45f7p6 0x1.dcp4 +REG nad27:2701 3 -0x1.e6acb863f64b3p6 0x1.3ep5 +REG nad27:2701 4 -0x1.b5fdf246b45f7p6 0x1.3ep5 +REG nad27:2702 0 -0x1.d2aaaaaaaaaabp6 0x1.16p5 +REG nad27:2702 1 -0x1.eb020db94ba09p6 0x1.dcp4 +REG nad27:2702 2 -0x1.ba53479c09b4dp6 0x1.dcp4 +REG nad27:2702 3 -0x1.eb020db94ba09p6 0x1.3ep5 +REG nad27:2702 4 -0x1.ba53479c09b4dp6 0x1.3ep5 +REG nad27:2703 0 -0x1.da55555555555p6 0x1.16p5 +REG nad27:2703 1 -0x1.f2acb863f64b3p6 0x1.dcp4 +REG nad27:2703 2 -0x1.c1fdf246b45f7p6 0x1.dcp4 +REG nad27:2703 3 -0x1.f2acb863f64b3p6 0x1.3ep5 +REG nad27:2703 4 -0x1.c1fdf246b45f7p6 0x1.3ep5 +REG nad27:2800 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG nad27:2800 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG nad27:2800 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG nad27:2800 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG nad27:2800 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG nad27:2900 0 -0x1.2aaaaaaaaaaabp6 0x1.36aaaaaaaaaabp5 +REG nad27:2900 1 -0x1.44576bc120c12p6 0x1.0eaaaaaaaaaabp5 +REG nad27:2900 2 -0x1.10fde99434944p6 0x1.0eaaaaaaaaaabp5 +REG nad27:2900 3 -0x1.44576bc120c12p6 0x1.5eaaaaaaaaaabp5 +REG nad27:2900 4 -0x1.10fde99434944p6 0x1.5eaaaaaaaaaabp5 +REG nad27:3001 0 -0x1.a155555555555p6 0x1.fp4 +REG nad27:3001 1 -0x1.b8aa7f0f4a8ecp6 0x1.ap4 +REG nad27:3001 2 -0x1.8a002b9b601bep6 0x1.ap4 +REG nad27:3001 3 -0x1.b8aa7f0f4a8ecp6 0x1.2p5 +REG nad27:3001 4 -0x1.8a002b9b601bep6 0x1.2p5 +REG nad27:3002 0 -0x1.a9p6 0x1.fp4 +REG nad27:3002 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG nad27:3002 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG nad27:3002 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG nad27:3002 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG nad27:3003 0 -0x1.af55555555555p6 0x1.fp4 +REG nad27:3003 1 -0x1.c6aa7f0f4a8ecp6 0x1.ap4 +REG nad27:3003 2 -0x1.98002b9b601bep6 0x1.ap4 +REG nad27:3003 3 -0x1.c6aa7f0f4a8ecp6 0x1.2p5 +REG nad27:3003 4 -0x1.98002b9b601bep6 0x1.2p5 +REG nad27:301 0 -0x1.7p6 0x1.1a44444444444p5 +REG nad27:301 1 -0x1.794f6bc4d5215p6 0x1.0b11111111111p5 +REG nad27:301 2 -0x1.66b0943b2adebp6 0x1.0b11111111111p5 +REG nad27:301 3 -0x1.794f6bc4d5215p6 0x1.2977777777777p5 +REG nad27:301 4 -0x1.66b0943b2adebp6 0x1.2977777777777p5 +REG nad27:302 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG nad27:302 1 -0x1.7a1942726255cp6 0x1.f9ddddddddddep4 +REG nad27:302 2 -0x1.65e6bd8d9daa4p6 0x1.f9ddddddddddep4 +REG nad27:302 3 -0x1.7a1942726255cp6 0x1.1e88888888889p5 +REG nad27:302 4 -0x1.65e6bd8d9daa4p6 0x1.1e88888888889p5 +REG nad27:3101 0 -0x1.2955555555555p6 0x1.4p5 +REG nad27:3101 1 -0x1.437104c68e2d2p6 0x1.18p5 +REG nad27:3101 2 -0x1.0f39a5e41c7d8p6 0x1.18p5 +REG nad27:3101 3 -0x1.437104c68e2d2p6 0x1.68p5 +REG nad27:3101 4 -0x1.0f39a5e41c7d8p6 0x1.68p5 +REG nad27:3102 0 -0x1.3255555555555p6 0x1.4p5 +REG nad27:3102 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG nad27:3102 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG nad27:3102 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG nad27:3102 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG nad27:3103 0 -0x1.3a55555555555p6 0x1.4p5 +REG nad27:3103 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG nad27:3103 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG nad27:3103 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG nad27:3103 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG nad27:3104 0 -0x1.28p6 0x1.4622222222222p5 +REG nad27:3104 1 -0x1.2d4809c4ef0d8p6 0x1.3e22222222222p5 +REG nad27:3104 2 -0x1.22b7f63b10f28p6 0x1.3e22222222222p5 +REG nad27:3104 3 -0x1.2d4809c4ef0d8p6 0x1.4e22222222222p5 +REG nad27:3104 4 -0x1.22b7f63b10f28p6 0x1.4e22222222222p5 +REG nad27:3200 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG nad27:3200 1 -0x1.47cb7933f48aap6 0x1.0455555555555p5 +REG nad27:3200 2 -0x1.303486cc0b756p6 0x1.0455555555555p5 +REG nad27:3200 3 -0x1.47cb7933f48aap6 0x1.2afffffffffffp5 +REG nad27:3200 4 -0x1.303486cc0b756p6 0x1.2afffffffffffp5 +REG nad27:3301 0 -0x1.92p6 0x1.7eeeeeeeeeeefp5 +REG nad27:3301 1 -0x1.9c55c3f143a71p6 0x1.7111111111111p5 +REG nad27:3301 2 -0x1.87aa3c0ebc58fp6 0x1.7111111111111p5 +REG nad27:3301 3 -0x1.9c55c3f143a71p6 0x1.8cccccccccccdp5 +REG nad27:3301 4 -0x1.87aa3c0ebc58fp6 0x1.8cccccccccccdp5 +REG nad27:3302 0 -0x1.92p6 0x1.749999999999ap5 +REG nad27:3302 1 -0x1.9c9237ec29bb1p6 0x1.6611111111111p5 +REG nad27:3302 2 -0x1.876dc813d644fp6 0x1.6611111111111p5 +REG nad27:3302 3 -0x1.9c9237ec29bb1p6 0x1.8322222222223p5 +REG nad27:3302 4 -0x1.876dc813d644fp6 0x1.8322222222223p5 +REG nad27:3401 0 -0x1.4ap6 0x1.4577777777778p5 +REG nad27:3401 1 -0x1.54b9b443558bap6 0x1.3533333333333p5 +REG nad27:3401 2 -0x1.3f464bbcaa746p6 0x1.3533333333333p5 +REG nad27:3401 3 -0x1.54b9b443558bap6 0x1.55bbbbbbbbbbdp5 +REG nad27:3401 4 -0x1.3f464bbcaa746p6 0x1.55bbbbbbbbbbdp5 +REG nad27:3402 0 -0x1.4ap6 0x1.3822222222222p5 +REG nad27:3402 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG nad27:3402 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG nad27:3402 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG nad27:3402 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG nad27:3501 0 -0x1.88p6 0x1.1f11111111111p5 +REG nad27:3501 1 -0x1.90b8d4acb5308p6 0x1.10eeeeeeeeeefp5 +REG nad27:3501 2 -0x1.7f472b534acf8p6 0x1.10eeeeeeeeeefp5 +REG nad27:3501 3 -0x1.90b8d4acb5308p6 0x1.2d33333333333p5 +REG nad27:3501 4 -0x1.7f472b534acf8p6 0x1.2d33333333333p5 +REG nad27:3502 0 -0x1.88p6 0x1.1244444444444p5 +REG nad27:3502 1 -0x1.9132b355fc5d2p6 0x1.0311111111111p5 +REG nad27:3502 2 -0x1.7ecd4caa03a2ep6 0x1.0311111111111p5 +REG nad27:3502 3 -0x1.9132b355fc5d2p6 0x1.2177777777777p5 +REG nad27:3502 4 -0x1.7ecd4caa03a2ep6 0x1.2177777777777p5 +REG nad27:3601 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG nad27:3601 1 -0x1.ef293dbbe364p6 0x1.53fffffffffffp5 +REG nad27:3601 2 -0x1.d4d6c2441c9cp6 0x1.53fffffffffffp5 +REG nad27:3601 3 -0x1.ef293dbbe364p6 0x1.7955555555555p5 +REG nad27:3601 4 -0x1.d4d6c2441c9cp6 0x1.7955555555555p5 +REG nad27:3602 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG nad27:3602 1 -0x1.eeba2d4454414p6 0x1.43fffffffffffp5 +REG nad27:3602 2 -0x1.d545d2bbabbecp6 0x1.43fffffffffffp5 +REG nad27:3602 3 -0x1.eeba2d4454414p6 0x1.6955555555555p5 +REG nad27:3602 4 -0x1.d545d2bbabbecp6 0x1.6955555555555p5 +REG nad27:3701 0 -0x1.37p6 0x1.4877777777778p5 +REG nad27:3701 1 -0x1.4075cb858aac8p6 0x1.3a33333333333p5 +REG nad27:3701 2 -0x1.2d8a347a75538p6 0x1.3a33333333333p5 +REG nad27:3701 3 -0x1.4075cb858aac8p6 0x1.56bbbbbbbbbbdp5 +REG nad27:3701 4 -0x1.2d8a347a75538p6 0x1.56bbbbbbbbbbdp5 +REG nad27:3702 0 -0x1.37p6 0x1.4133333333334p5 +REG nad27:3702 1 -0x1.3f8c26cb1f465p6 0x1.3422222222223p5 +REG nad27:3702 2 -0x1.2e73d934e0b9bp6 0x1.3422222222223p5 +REG nad27:3702 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444445p5 +REG nad27:3702 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444445p5 +REG nad27:3800 0 -0x1.1ep6 0x1.48aaaaaaaaaabp5 +REG nad27:3800 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaabp5 +REG nad27:3800 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaabp5 +REG nad27:3800 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaabp5 +REG nad27:3800 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaabp5 +REG nad27:3901 0 -0x1.44p6 0x1.0fddddddddddep5 +REG nad27:3901 1 -0x1.4d7caf89e58b4p6 0x1.0022222222222p5 +REG nad27:3901 2 -0x1.3a8350761a74cp6 0x1.0022222222222p5 +REG nad27:3901 3 -0x1.4d7caf89e58b4p6 0x1.1f9999999999ap5 +REG nad27:3901 4 -0x1.3a8350761a74cp6 0x1.1f9999999999ap5 +REG nad27:3902 0 -0x1.44p6 0x1.06p5 +REG nad27:3902 1 -0x1.4cb828dd9db44p6 0x1.eeaaaaaaaaaabp4 +REG nad27:3902 2 -0x1.3b47d722624bcp6 0x1.eeaaaaaaaaaabp4 +REG nad27:3902 3 -0x1.4cb828dd9db44p6 0x1.14aaaaaaaaaaap5 +REG nad27:3902 4 -0x1.3b47d722624bcp6 0x1.14aaaaaaaaaaap5 +REG nad27:4001 0 -0x1.9p6 0x1.6611111111111p5 +REG nad27:4001 1 -0x1.9a6bdb73f4276p6 0x1.5744444444445p5 +REG nad27:4001 2 -0x1.8594248c0bd8ap6 0x1.5744444444445p5 +REG nad27:4001 3 -0x1.9a6bdb73f4276p6 0x1.74dddddddddddp5 +REG nad27:4001 4 -0x1.8594248c0bd8ap6 0x1.74dddddddddddp5 +REG nad27:4002 0 -0x1.9155555555555p6 0x1.5aeeeeeeeeeefp5 +REG nad27:4002 1 -0x1.9cb46504892e6p6 0x1.4a66666666667p5 +REG nad27:4002 2 -0x1.85f645a6217c4p6 0x1.4a66666666667p5 +REG nad27:4002 3 -0x1.9cb46504892e6p6 0x1.6b77777777777p5 +REG nad27:4002 4 -0x1.85f645a6217c4p6 0x1.6b77777777777p5 +REG nad27:401 0 -0x1.e8p6 0x1.44p5 +REG nad27:401 1 -0x1.f4462e6374a3cp6 0x1.3155555555556p5 +REG nad27:401 2 -0x1.dbb9d19c8b5c4p6 0x1.3155555555556p5 +REG nad27:401 3 -0x1.f4462e6374a3cp6 0x1.56aaaaaaaaaaap5 +REG nad27:401 4 -0x1.dbb9d19c8b5c4p6 0x1.56aaaaaaaaaaap5 +REG nad27:402 0 -0x1.e8p6 0x1.36p5 +REG nad27:402 1 -0x1.f31cdda2c7b9p6 0x1.24aaaaaaaaaaap5 +REG nad27:402 2 -0x1.dce3225d3847p6 0x1.24aaaaaaaaaaap5 +REG nad27:402 3 -0x1.f31cdda2c7b9p6 0x1.4755555555556p5 +REG nad27:402 4 -0x1.dce3225d3847p6 0x1.4755555555556p5 +REG nad27:403 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG nad27:403 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG nad27:403 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG nad27:403 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG nad27:403 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG nad27:404 0 -0x1.dcp6 0x1.2255555555556p5 +REG nad27:404 1 -0x1.e58306e0bb625p6 0x1.1300000000001p5 +REG nad27:404 2 -0x1.d27cf91f449dbp6 0x1.1300000000001p5 +REG nad27:404 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaabp5 +REG nad27:404 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaabp5 +REG nad27:405 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG nad27:405 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG nad27:405 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG nad27:405 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG nad27:405 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG nad27:406 0 -0x1.d1p6 0x1.0833333333333p5 +REG nad27:406 1 -0x1.d9309c27706f7p6 0x1.f4eeeeeeeeeeep4 +REG nad27:406 2 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeeeeep4 +REG nad27:406 3 -0x1.d9309c27706f7p6 0x1.15eeeeeeeeeefp5 +REG nad27:406 4 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeeefp5 +REG nad27:407 0 -0x1.d955555555555p6 0x1.1122222222222p5 +REG nad27:407 1 -0x1.de2a91549c3d1p6 0x1.0922222222222p5 +REG nad27:407 2 -0x1.d48019560e6d9p6 0x1.0922222222222p5 +REG nad27:407 3 -0x1.de2a91549c3d1p6 0x1.1922222222222p5 +REG nad27:407 4 -0x1.d48019560e6d9p6 0x1.1922222222222p5 +REG nad27:4100 0 -0x1.58p6 0x1.1c55555555555p5 +REG nad27:4100 1 -0x1.609a4e06b0d59p6 0x1.0e55555555555p5 +REG nad27:4100 2 -0x1.4f65b1f94f2a7p6 0x1.0e55555555555p5 +REG nad27:4100 3 -0x1.609a4e06b0d59p6 0x1.2a55555555555p5 +REG nad27:4100 4 -0x1.4f65b1f94f2a7p6 0x1.2a55555555555p5 +REG nad27:4201 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG nad27:4201 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG nad27:4201 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG nad27:4201 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG nad27:4201 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG nad27:4202 0 -0x1.86p6 0x1.0688888888889p5 +REG nad27:4202 1 -0x1.90f271ed65e92p6 0x1.e844444444445p4 +REG nad27:4202 2 -0x1.7b0d8e129a16ep6 0x1.e844444444445p4 +REG nad27:4202 3 -0x1.90f271ed65e92p6 0x1.18eeeeeeeeefp5 +REG nad27:4202 4 -0x1.7b0d8e129a16ep6 0x1.18eeeeeeeeefp5 +REG nad27:4203 0 -0x1.9155555555555p6 0x1.ec66666666666p4 +REG nad27:4203 1 -0x1.9ba738e53ac9fp6 0x1.c8eeeeeeeeeefp4 +REG nad27:4203 2 -0x1.870371c56fe0bp6 0x1.c8eeeeeeeeeefp4 +REG nad27:4203 3 -0x1.9ba738e53ac9fp6 0x1.07eeeeeeeeeeep5 +REG nad27:4203 4 -0x1.870371c56fe0bp6 0x1.07eeeeeeeeeeep5 +REG nad27:4204 0 -0x1.8cp6 0x1.d0eeeeeeeeeefp4 +REG nad27:4204 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbbp4 +REG nad27:4204 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbbp4 +REG nad27:4204 3 -0x1.97361161034adp6 0x1.f822222222223p4 +REG nad27:4204 4 -0x1.80c9ee9efcb53p6 0x1.f822222222223p4 +REG nad27:4205 0 -0x1.8ap6 0x1.acp4 +REG nad27:4205 1 -0x1.93b49156c66f9p6 0x1.8955555555556p4 +REG nad27:4205 2 -0x1.804b6ea939907p6 0x1.8955555555556p4 +REG nad27:4205 3 -0x1.93b49156c66f9p6 0x1.ceaaaaaaaaaaap4 +REG nad27:4205 4 -0x1.804b6ea939907p6 0x1.ceaaaaaaaaaaap4 +REG nad27:4301 0 -0x1.bep6 0x1.4877777777778p5 +REG nad27:4301 1 -0x1.c5b11f7fb8877p6 0x1.3cddddddddddfp5 +REG nad27:4301 2 -0x1.b64ee08047789p6 0x1.3cddddddddddfp5 +REG nad27:4301 3 -0x1.c5b11f7fb8877p6 0x1.5411111111111p5 +REG nad27:4301 4 -0x1.b64ee08047789p6 0x1.5411111111111p5 +REG nad27:4302 0 -0x1.bep6 0x1.3beeeeeeeeeefp5 +REG nad27:4302 1 -0x1.ca0202c3d20c7p6 0x1.2966666666667p5 +REG nad27:4302 2 -0x1.b1fdfd3c2df39p6 0x1.2966666666667p5 +REG nad27:4302 3 -0x1.ca0202c3d20c7p6 0x1.4e77777777777p5 +REG nad27:4302 4 -0x1.b1fdfd3c2df39p6 0x1.4e77777777777p5 +REG nad27:4303 0 -0x1.bep6 0x1.2c11111111111p5 +REG nad27:4303 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999999p5 +REG nad27:4303 2 -0x1.b5830a05dba62p6 0x1.1e99999999999p5 +REG nad27:4303 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG nad27:4303 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG nad27:4400 0 -0x1.22p6 0x1.54p5 +REG nad27:4400 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG nad27:4400 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG nad27:4400 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG nad27:4400 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG nad27:4501 0 -0x1.3ap6 0x1.3377777777778p5 +REG nad27:4501 1 -0x1.41d46dd6b3ca8p6 0x1.2733333333333p5 +REG nad27:4501 2 -0x1.322b92294c358p6 0x1.2733333333333p5 +REG nad27:4501 3 -0x1.41d46dd6b3ca8p6 0x1.3fbbbbbbbbbbdp5 +REG nad27:4501 4 -0x1.322b92294c358p6 0x1.3fbbbbbbbbbbdp5 +REG nad27:4502 0 -0x1.3ap6 0x1.2933333333334p5 +REG nad27:4502 1 -0x1.423262b0988ep6 0x1.1c22222222223p5 +REG nad27:4502 2 -0x1.31cd9d4f6772p6 0x1.1c22222222223p5 +REG nad27:4502 3 -0x1.423262b0988ep6 0x1.3644444444445p5 +REG nad27:4502 4 -0x1.31cd9d4f6772p6 0x1.3644444444445p5 +REG nad27:4601 0 -0x1.e355555555555p6 0x1.7eeeeeeeeeeefp5 +REG nad27:4601 1 -0x1.edab194698fc6p6 0x1.7111111111111p5 +REG nad27:4601 2 -0x1.d8ff916411ae4p6 0x1.7111111111111p5 +REG nad27:4601 3 -0x1.edab194698fc6p6 0x1.8cccccccccccdp5 +REG nad27:4601 4 -0x1.d8ff916411ae4p6 0x1.8cccccccccccdp5 +REG nad27:4602 0 -0x1.e2p6 0x1.72aaaaaaaaaabp5 +REG nad27:4602 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaabp5 +REG nad27:4602 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaabp5 +REG nad27:4602 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaabp5 +REG nad27:4602 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaabp5 +REG nad27:4701 0 -0x1.3ep6 0x1.3bp5 +REG nad27:4701 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG nad27:4701 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG nad27:4701 3 -0x1.470e3592d233ap6 0x1.49p5 +REG nad27:4701 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG nad27:4702 0 -0x1.44p6 0x1.2f88888888888p5 +REG nad27:4702 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG nad27:4702 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG nad27:4702 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG nad27:4702 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG nad27:4801 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG nad27:4801 1 -0x1.71352657aea25p6 0x1.62eeeeeeeeeefp5 +REG nad27:4801 2 -0x1.5ecad9a8515dbp6 0x1.62eeeeeeeeeefp5 +REG nad27:4801 3 -0x1.71352657aea25p6 0x1.7c88888888889p5 +REG nad27:4801 4 -0x1.5ecad9a8515dbp6 0x1.7c88888888889p5 +REG nad27:4802 0 -0x1.68p6 0x1.6555555555556p5 +REG nad27:4802 1 -0x1.715fabce299d6p6 0x1.5800000000001p5 +REG nad27:4802 2 -0x1.5ea05431d662ap6 0x1.5800000000001p5 +REG nad27:4802 3 -0x1.715fabce299d6p6 0x1.72aaaaaaaaaabp5 +REG nad27:4802 4 -0x1.5ea05431d662ap6 0x1.72aaaaaaaaaabp5 +REG nad27:4803 0 -0x1.68p6 0x1.5844444444444p5 +REG nad27:4803 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG nad27:4803 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG nad27:4803 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG nad27:4803 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG nad27:4901 0 -0x1.a4aaaaaaaaaabp6 0x1.4555555555555p5 +REG nad27:4901 1 -0x1.bf08b5e8e0576p6 0x1.1d55555555555p5 +REG nad27:4901 2 -0x1.8a4c9f6c74fep6 0x1.1d55555555555p5 +REG nad27:4901 3 -0x1.bf08b5e8e0576p6 0x1.6d55555555555p5 +REG nad27:4901 4 -0x1.8a4c9f6c74fep6 0x1.6d55555555555p5 +REG nad27:4902 0 -0x1.ad55555555555p6 0x1.4555555555555p5 +REG nad27:4902 1 -0x1.c7b360938b02p6 0x1.1d55555555555p5 +REG nad27:4902 2 -0x1.92f74a171fa8ap6 0x1.1d55555555555p5 +REG nad27:4902 3 -0x1.c7b360938b02p6 0x1.6d55555555555p5 +REG nad27:4902 4 -0x1.92f74a171fa8ap6 0x1.6d55555555555p5 +REG nad27:4903 0 -0x1.b3p6 0x1.4555555555555p5 +REG nad27:4903 1 -0x1.cd5e0b3e35acbp6 0x1.1d55555555555p5 +REG nad27:4903 2 -0x1.98a1f4c1ca535p6 0x1.1d55555555555p5 +REG nad27:4903 3 -0x1.cd5e0b3e35acbp6 0x1.6d55555555555p5 +REG nad27:4903 4 -0x1.98a1f4c1ca535p6 0x1.6d55555555555p5 +REG nad27:4904 0 -0x1.b855555555555p6 0x1.4555555555555p5 +REG nad27:4904 1 -0x1.d2b360938b02p6 0x1.1d55555555555p5 +REG nad27:4904 2 -0x1.9df74a171fa8ap6 0x1.1d55555555555p5 +REG nad27:4904 3 -0x1.d2b360938b02p6 0x1.6d55555555555p5 +REG nad27:4904 4 -0x1.9df74a171fa8ap6 0x1.6d55555555555p5 +REG nad27:5001 0 -0x1.0b55555555555p7 0x1.c8p5 +REG nad27:5001 1 -0x1.1db1b1b64ab12p7 0x1.ap5 +REG nad27:5001 2 -0x1.f1f1f1e8bff31p6 0x1.ap5 +REG nad27:5001 3 -0x1.1db1b1b64ab12p7 0x1.fp5 +REG nad27:5001 4 -0x1.f1f1f1e8bff31p6 0x1.fp5 +REG nad27:5002 0 -0x1.1cp7 0x1.bp5 +REG nad27:5002 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG nad27:5002 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG nad27:5002 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG nad27:5002 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG nad27:5003 0 -0x1.24p7 0x1.bp5 +REG nad27:5003 1 -0x1.350355070bc27p7 0x1.88p5 +REG nad27:5003 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG nad27:5003 3 -0x1.350355070bc27p7 0x1.d8p5 +REG nad27:5003 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG nad27:5004 0 -0x1.2cp7 0x1.bp5 +REG nad27:5004 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG nad27:5004 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG nad27:5004 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG nad27:5004 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG nad27:5005 0 -0x1.34p7 0x1.bp5 +REG nad27:5005 1 -0x1.450355070bc27p7 0x1.88p5 +REG nad27:5005 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG nad27:5005 3 -0x1.450355070bc27p7 0x1.d8p5 +REG nad27:5005 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG nad27:5006 0 -0x1.3cp7 0x1.bp5 +REG nad27:5006 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG nad27:5006 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG nad27:5006 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG nad27:5006 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG nad27:5007 0 -0x1.44p7 0x1.bp5 +REG nad27:5007 1 -0x1.550355070bc27p7 0x1.88p5 +REG nad27:5007 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG nad27:5007 3 -0x1.550355070bc27p7 0x1.d8p5 +REG nad27:5007 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG nad27:5008 0 -0x1.4cp7 0x1.bp5 +REG nad27:5008 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG nad27:5008 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG nad27:5008 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG nad27:5008 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG nad27:5009 0 -0x1.54p7 0x1.bp5 +REG nad27:5009 1 -0x1.650355070bc27p7 0x1.88p5 +REG nad27:5009 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG nad27:5009 3 -0x1.650355070bc27p7 0x1.d8p5 +REG nad27:5009 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG nad27:501 0 -0x1.a6p6 0x1.4077777777778p5 +REG nad27:501 1 -0x1.ad93ed5106ce2p6 0x1.34ddddddddddfp5 +REG nad27:501 2 -0x1.9e6c12aef931ep6 0x1.34ddddddddddfp5 +REG nad27:501 3 -0x1.ad93ed5106ce2p6 0x1.4c11111111111p5 +REG nad27:501 4 -0x1.9e6c12aef931ep6 0x1.4c11111111111p5 +REG nad27:5010 0 -0x1.6p7 0x1.a355555555556p5 +REG nad27:5010 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaabp5 +REG nad27:5010 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaabp5 +REG nad27:5010 3 0x1.66b58674419cfp7 0x1.ba00000000001p5 +REG nad27:5010 4 -0x1.56b58674419cfp7 0x1.ba00000000001p5 +REG nad27:502 0 -0x1.a6p6 0x1.3655555555556p5 +REG nad27:502 1 -0x1.afd615170d5c8p6 0x1.2700000000001p5 +REG nad27:502 2 -0x1.9c29eae8f2a38p6 0x1.2700000000001p5 +REG nad27:502 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaabp5 +REG nad27:502 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaabp5 +REG nad27:503 0 -0x1.a6p6 0x1.2c66666666666p5 +REG nad27:503 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444444p5 +REG nad27:503 2 -0x1.9d16314badd4bp6 0x1.1e44444444444p5 +REG nad27:503 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888888p5 +REG nad27:503 4 -0x1.9d16314badd4bp6 0x1.3a88888888888p5 +REG nad27:5101 0 -0x1.37p7 0x1.2d55555555555p4 +REG nad27:5101 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaaap3 +REG nad27:5101 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaaap3 +REG nad27:5101 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555555p4 +REG nad27:5101 4 -0x1.2c6f30534474bp7 0x1.7d55555555555p4 +REG nad27:5102 0 -0x1.3955555555555p7 0x1.4555555555555p4 +REG nad27:5102 1 -0x1.43ff74a3344cp7 0x1.eaaaaaaaaaaaap3 +REG nad27:5102 2 -0x1.2eab3607765eap7 0x1.eaaaaaaaaaaaap3 +REG nad27:5102 3 -0x1.43ff74a3344cp7 0x1.9555555555555p4 +REG nad27:5102 4 -0x1.2eab3607765eap7 0x1.9555555555555p4 +REG nad27:5103 0 -0x1.3cp7 0x1.52aaaaaaaaaabp4 +REG nad27:5103 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaabp4 +REG nad27:5103 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaabp4 +REG nad27:5103 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaabp4 +REG nad27:5103 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaabp4 +REG nad27:5104 0 -0x1.3fp7 0x1.5d55555555555p4 +REG nad27:5104 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555555p4 +REG nad27:5104 2 -0x1.343a2e38cb648p7 0x1.0d55555555555p4 +REG nad27:5104 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555555p4 +REG nad27:5104 4 -0x1.343a2e38cb648p7 0x1.ad55555555555p4 +REG nad27:5105 0 -0x1.4055555555555p7 0x1.5aaaaaaaaaaabp4 +REG nad27:5105 1 -0x1.4b17f4409ffdap7 0x1.0aaaaaaaaaaabp4 +REG nad27:5105 2 -0x1.3592b66a0aadp7 0x1.0aaaaaaaaaaabp4 +REG nad27:5105 3 -0x1.4b17f4409ffdap7 0x1.aaaaaaaaaaaabp4 +REG nad27:5105 4 -0x1.3592b66a0aadp7 0x1.aaaaaaaaaaaabp4 +REG nad27:5201 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222222p4 +REG nad27:5201 1 -0x1.0df13f90a9095p6 0x1.1222222222222p4 +REG nad27:5201 2 -0x1.058637e6ce6e3p6 0x1.1222222222222p4 +REG nad27:5201 3 -0x1.0df13f90a9095p6 0x1.3222222222222p4 +REG nad27:5201 4 -0x1.058637e6ce6e3p6 0x1.3222222222222p4 +REG nad27:5202 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222222p4 +REG nad27:5202 1 -0x1.0df13f90a9095p6 0x1.1222222222222p4 +REG nad27:5202 2 -0x1.058637e6ce6e3p6 0x1.1222222222222p4 +REG nad27:5202 3 -0x1.0df13f90a9095p6 0x1.3222222222222p4 +REG nad27:5202 4 -0x1.058637e6ce6e3p6 0x1.3222222222222p4 +REG nad27:5300 0 -0x1.54p7 -0x1.c888888888889p3 +REG nad27:5300 1 -0x1.5e5176f75656cp7 -0x1.3444444444444p4 +REG nad27:5300 2 -0x1.49ae8908a9a94p7 -0x1.3444444444444p4 +REG nad27:5300 3 -0x1.5e5176f75656cp7 -0x1.2888888888889p3 +REG nad27:5300 4 -0x1.49ae8908a9a94p7 -0x1.2888888888889p3 +REG nad27:5400 0 0x1.217f5c40a26fap7 0x1.af1e71c1b482bp3 +REG nad27:5400 1 0x1.1736ebbdf7622p7 0x1.0f1e71c1b482bp3 +REG nad27:5400 2 0x1.2bc7ccc34d7d2p7 0x1.0f1e71c1b482bp3 +REG nad27:5400 3 0x1.1736ebbdf7622p7 0x1.278f38e0da416p4 +REG nad27:5400 4 0x1.2bc7ccc34d7d2p7 0x1.278f38e0da416p4 +REG nad27:600 0 -0x1.23p6 0x1.4accccccccccdp5 +REG nad27:600 1 -0x1.28818d3773554p6 0x1.4288888888889p5 +REG nad27:600 2 -0x1.1d7e72c88caacp6 0x1.4288888888889p5 +REG nad27:600 3 -0x1.28818d3773554p6 0x1.5311111111111p5 +REG nad27:600 4 -0x1.1d7e72c88caacp6 0x1.5311111111111p5 +REG nad27:700 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG nad27:700 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG nad27:700 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG nad27:700 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG nad27:700 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG nad27:901 0 -0x1.44p6 0x1.8555555555555p4 +REG nad27:901 1 -0x1.59f33012348e1p6 0x1.3555555555555p4 +REG nad27:901 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555555p4 +REG nad27:901 3 -0x1.59f33012348e1p6 0x1.d555555555555p4 +REG nad27:901 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555555p4 +REG nad27:902 0 -0x1.48p6 0x1.8555555555555p4 +REG nad27:902 1 -0x1.5df33012348e1p6 0x1.3555555555555p4 +REG nad27:902 2 -0x1.320ccfedcb71fp6 0x1.3555555555555p4 +REG nad27:902 3 -0x1.5df33012348e1p6 0x1.d555555555555p4 +REG nad27:902 4 -0x1.320ccfedcb71fp6 0x1.d555555555555p4 +REG nad27:903 0 -0x1.52p6 0x1.dep4 +REG nad27:903 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG nad27:903 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG nad27:903 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG nad27:903 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG nad83:1001 0 -0x1.48aaaaaaaaaabp6 0x1.ep4 +REG nad83:1001 1 -0x1.5fc2bbc19eea9p6 0x1.9p4 +REG nad83:1001 2 -0x1.31929993b66adp6 0x1.9p4 +REG nad83:1001 3 -0x1.5fc2bbc19eea9p6 0x1.18p5 +REG nad83:1001 4 -0x1.31929993b66adp6 0x1.18p5 +REG nad83:1002 0 -0x1.50aaaaaaaaaabp6 0x1.ep4 +REG nad83:1002 1 -0x1.67c2bbc19eea9p6 0x1.9p4 +REG nad83:1002 2 -0x1.39929993b66adp6 0x1.9p4 +REG nad83:1002 3 -0x1.67c2bbc19eea9p6 0x1.18p5 +REG nad83:1002 4 -0x1.39929993b66adp6 0x1.18p5 +REG nad83:101 0 -0x1.5755555555555p6 0x1.e8p4 +REG nad83:101 1 -0x1.6e8b909d9872bp6 0x1.98p4 +REG nad83:101 2 -0x1.401f1a0d1237fp6 0x1.98p4 +REG nad83:101 3 -0x1.6e8b909d9872bp6 0x1.1cp5 +REG nad83:101 4 -0x1.401f1a0d1237fp6 0x1.1cp5 +REG nad83:102 0 -0x1.5ep6 0x1.ep4 +REG nad83:102 1 -0x1.75181116f43fep6 0x1.9p4 +REG nad83:102 2 -0x1.46e7eee90bc02p6 0x1.9p4 +REG nad83:102 3 -0x1.75181116f43fep6 0x1.18p5 +REG nad83:102 4 -0x1.46e7eee90bc02p6 0x1.18p5 +REG nad83:1101 0 -0x1.c0aaaaaaaaaabp6 0x1.4d55555555555p5 +REG nad83:1101 1 -0x1.db708506a0f7p6 0x1.2555555555555p5 +REG nad83:1101 2 -0x1.a5e4d04eb45e6p6 0x1.2555555555555p5 +REG nad83:1101 3 -0x1.db708506a0f7p6 0x1.7555555555555p5 +REG nad83:1101 4 -0x1.a5e4d04eb45e6p6 0x1.7555555555555p5 +REG nad83:1102 0 -0x1.c8p6 0x1.4d55555555555p5 +REG nad83:1102 1 -0x1.e2c5da5bf64c5p6 0x1.2555555555555p5 +REG nad83:1102 2 -0x1.ad3a25a409b3bp6 0x1.2555555555555p5 +REG nad83:1102 3 -0x1.e2c5da5bf64c5p6 0x1.7555555555555p5 +REG nad83:1102 4 -0x1.ad3a25a409b3bp6 0x1.7555555555555p5 +REG nad83:1103 0 -0x1.cfp6 0x1.4d55555555555p5 +REG nad83:1103 1 -0x1.e9c5da5bf64c5p6 0x1.2555555555555p5 +REG nad83:1103 2 -0x1.b43a25a409b3bp6 0x1.2555555555555p5 +REG nad83:1103 3 -0x1.e9c5da5bf64c5p6 0x1.7555555555555p5 +REG nad83:1103 4 -0x1.b43a25a409b3bp6 0x1.7555555555555p5 +REG nad83:1201 0 -0x1.6155555555555p6 0x1.2555555555555p5 +REG nad83:1201 1 -0x1.7a44648b5bcfp6 0x1.faaaaaaaaaaaap4 +REG nad83:1201 2 -0x1.4866461f4edbap6 0x1.faaaaaaaaaaaap4 +REG nad83:1201 3 -0x1.7a44648b5bcfp6 0x1.4d55555555555p5 +REG nad83:1201 4 -0x1.4866461f4edbap6 0x1.4d55555555555p5 +REG nad83:1202 0 -0x1.68aaaaaaaaaabp6 0x1.2555555555555p5 +REG nad83:1202 1 -0x1.8199b9e0b1246p6 0x1.faaaaaaaaaaaap4 +REG nad83:1202 2 -0x1.4fbb9b74a431p6 0x1.faaaaaaaaaaaap4 +REG nad83:1202 3 -0x1.8199b9e0b1246p6 0x1.4d55555555555p5 +REG nad83:1202 4 -0x1.4fbb9b74a431p6 0x1.4d55555555555p5 +REG nad83:1301 0 -0x1.56aaaaaaaaaabp6 0x1.2cp5 +REG nad83:1301 1 -0x1.6fe04911b45a1p6 0x1.04p5 +REG nad83:1301 2 -0x1.3d750c43a0fb5p6 0x1.04p5 +REG nad83:1301 3 -0x1.6fe04911b45a1p6 0x1.54p5 +REG nad83:1301 4 -0x1.3d750c43a0fb5p6 0x1.54p5 +REG nad83:1302 0 -0x1.5c55555555555p6 0x1.2cp5 +REG nad83:1302 1 -0x1.758af3bc5f04bp6 0x1.04p5 +REG nad83:1302 2 -0x1.431fb6ee4ba5fp6 0x1.04p5 +REG nad83:1302 3 -0x1.758af3bc5f04bp6 0x1.54p5 +REG nad83:1302 4 -0x1.431fb6ee4ba5fp6 0x1.54p5 +REG nad83:1401 0 -0x1.76p6 0x1.5311111111111p5 +REG nad83:1401 1 -0x1.7f9125dd29e12p6 0x1.44eeeeeeeeeefp5 +REG nad83:1401 2 -0x1.6c6eda22d61eep6 0x1.44eeeeeeeeeefp5 +REG nad83:1401 3 -0x1.7f9125dd29e12p6 0x1.6133333333333p5 +REG nad83:1401 4 -0x1.6c6eda22d61eep6 0x1.6133333333333p5 +REG nad83:1402 0 -0x1.76p6 0x1.4722222222222p5 +REG nad83:1402 1 -0x1.7f6faf2a3211dp6 0x1.38ddddddddddep5 +REG nad83:1402 2 -0x1.6c9050d5cdee3p6 0x1.38ddddddddddep5 +REG nad83:1402 3 -0x1.7f6faf2a3211dp6 0x1.5566666666666p5 +REG nad83:1402 4 -0x1.6c9050d5cdee3p6 0x1.5566666666666p5 +REG nad83:1501 0 -0x1.88p6 0x1.3877777777778p5 +REG nad83:1501 1 -0x1.8f7828773d561p6 0x1.2cddddddddddfp5 +REG nad83:1501 2 -0x1.8087d788c2a9fp6 0x1.2cddddddddddfp5 +REG nad83:1501 3 -0x1.8f7828773d561p6 0x1.4411111111111p5 +REG nad83:1501 4 -0x1.8087d788c2a9fp6 0x1.4411111111111p5 +REG nad83:1502 0 -0x1.8ap6 0x1.2ceeeeeeeeeefp5 +REG nad83:1502 1 -0x1.939837c9c43e7p6 0x1.1dbbbbbbbbbbbp5 +REG nad83:1502 2 -0x1.8067c8363bc19p6 0x1.1dbbbbbbbbbbbp5 +REG nad83:1502 3 -0x1.939837c9c43e7p6 0x1.3c22222222223p5 +REG nad83:1502 4 -0x1.8067c8363bc19p6 0x1.3c22222222223p5 +REG nad83:1601 0 -0x1.51p6 0x1.31ddddddddddep5 +REG nad83:1601 1 -0x1.5877fed64af86p6 0x1.2622222222222p5 +REG nad83:1601 2 -0x1.49880129b507ap6 0x1.2622222222222p5 +REG nad83:1601 3 -0x1.5877fed64af86p6 0x1.3d9999999999ap5 +REG nad83:1601 4 -0x1.49880129b507ap6 0x1.3d9999999999ap5 +REG nad83:1602 0 -0x1.57p6 0x1.2911111111111p5 +REG nad83:1602 1 -0x1.5f071bc4256ebp6 0x1.1c44444444445p5 +REG nad83:1602 2 -0x1.4ef8e43bda915p6 0x1.1c44444444445p5 +REG nad83:1602 3 -0x1.5f071bc4256ebp6 0x1.35dddddddddddp5 +REG nad83:1602 4 -0x1.4ef8e43bda915p6 0x1.35dddddddddddp5 +REG nad83:1701 0 -0x1.72p6 0x1.f955555555555p4 +REG nad83:1701 1 -0x1.7c2c70110dbecp6 0x1.d6aaaaaaaaaabp4 +REG nad83:1701 2 -0x1.67d38feef2414p6 0x1.d6aaaaaaaaaabp4 +REG nad83:1701 3 -0x1.7c2c70110dbecp6 0x1.0ep5 +REG nad83:1701 4 -0x1.67d38feef2414p6 0x1.0ep5 +REG nad83:1702 0 -0x1.6d55555555555p6 0x1.d99999999999ap4 +REG nad83:1702 1 -0x1.777443444cdb4p6 0x1.b666666666667p4 +REG nad83:1702 2 -0x1.633667665dcf6p6 0x1.b666666666667p4 +REG nad83:1702 3 -0x1.777443444cdb4p6 0x1.fcccccccccccdp4 +REG nad83:1702 4 -0x1.633667665dcf6p6 0x1.fcccccccccccdp4 +REG nad83:1703 0 -0x1.6d55555555555p6 0x1.aaaaaaaaaaaaap4 +REG nad83:1703 1 -0x1.77c7107b1a9e2p6 0x1.8555555555555p4 +REG nad83:1703 2 -0x1.62e39a2f900c8p6 0x1.8555555555555p4 +REG nad83:1703 3 -0x1.77c7107b1a9e2p6 0x1.cffffffffffffp4 +REG nad83:1703 4 -0x1.62e39a2f900c8p6 0x1.cffffffffffffp4 +REG nad83:1801 0 -0x1.12p6 0x1.5d55555555555p5 +REG nad83:1801 1 -0x1.2da5fe0c1f8adp6 0x1.3555555555555p5 +REG nad83:1801 2 -0x1.ecb403e7c0ea6p5 0x1.3555555555555p5 +REG nad83:1801 3 -0x1.2da5fe0c1f8adp6 0x1.8555555555555p5 +REG nad83:1801 4 -0x1.ecb403e7c0ea6p5 0x1.8555555555555p5 +REG nad83:1802 0 -0x1.18aaaaaaaaaabp6 0x1.56aaaaaaaaaabp5 +REG nad83:1802 1 -0x1.33f07961a85bp6 0x1.2eaaaaaaaaaabp5 +REG nad83:1802 2 -0x1.fac9b7e759f4bp5 0x1.2eaaaaaaaaaabp5 +REG nad83:1802 3 -0x1.33f07961a85bp6 0x1.7eaaaaaaaaaabp5 +REG nad83:1802 4 -0x1.fac9b7e759f4bp5 0x1.7eaaaaaaaaaabp5 +REG nad83:1900 0 -0x1.34p6 0x1.3477777777778p5 +REG nad83:1900 1 -0x1.3d1f495fce8bp6 0x1.2633333333333p5 +REG nad83:1900 2 -0x1.2ae0b6a03175p6 0x1.2633333333333p5 +REG nad83:1900 3 -0x1.3d1f495fce8bp6 0x1.42bbbbbbbbbbdp5 +REG nad83:1900 4 -0x1.2ae0b6a03175p6 0x1.42bbbbbbbbbbdp5 +REG nad83:2001 0 -0x1.1ep6 0x1.4ebbbbbbbbbbcp5 +REG nad83:2001 1 -0x1.2709c381e3f4bp6 0x1.4144444444445p5 +REG nad83:2001 2 -0x1.14f63c7e1c0b5p6 0x1.4144444444445p5 +REG nad83:2001 3 -0x1.2709c381e3f4bp6 0x1.5c33333333333p5 +REG nad83:2001 4 -0x1.14f63c7e1c0b5p6 0x1.5c33333333333p5 +REG nad83:2002 0 -0x1.1ap6 0x1.49eeeeeeeeeefp5 +REG nad83:2002 1 -0x1.1f51d18e20972p6 0x1.41eeeeeeeeeefp5 +REG nad83:2002 2 -0x1.14ae2e71df68ep6 0x1.41eeeeeeeeeefp5 +REG nad83:2002 3 -0x1.1f51d18e20972p6 0x1.51eeeeeeeeeefp5 +REG nad83:2002 4 -0x1.14ae2e71df68ep6 0x1.51eeeeeeeeeefp5 +REG nad83:201 0 -0x1.b8aaaaaaaaaabp6 0x1.fp4 +REG nad83:201 1 -0x1.cfffd4649fe42p6 0x1.ap4 +REG nad83:201 2 -0x1.a15580f0b5714p6 0x1.ap4 +REG nad83:201 3 -0x1.cfffd4649fe42p6 0x1.2p5 +REG nad83:201 4 -0x1.a15580f0b5714p6 0x1.2p5 +REG nad83:202 0 -0x1.bfaaaaaaaaaabp6 0x1.fp4 +REG nad83:202 1 -0x1.d6ffd4649fe42p6 0x1.ap4 +REG nad83:202 2 -0x1.a85580f0b5714p6 0x1.ap4 +REG nad83:202 3 -0x1.d6ffd4649fe42p6 0x1.2p5 +REG nad83:202 4 -0x1.a85580f0b5714p6 0x1.2p5 +REG nad83:203 0 -0x1.c7p6 0x1.fp4 +REG nad83:203 1 -0x1.de5529b9f5397p6 0x1.ap4 +REG nad83:203 2 -0x1.afaad6460ac69p6 0x1.ap4 +REG nad83:203 3 -0x1.de5529b9f5397p6 0x1.2p5 +REG nad83:203 4 -0x1.afaad6460ac69p6 0x1.2p5 +REG nad83:2111 0 -0x1.5cp6 0x1.6f77777777778p5 +REG nad83:2111 1 -0x1.693a5d9ac6985p6 0x1.5d11111111111p5 +REG nad83:2111 2 -0x1.4ec5a2653967bp6 0x1.5d11111111111p5 +REG nad83:2111 3 -0x1.693a5d9ac6985p6 0x1.81ddddddddddfp5 +REG nad83:2111 4 -0x1.4ec5a2653967bp6 0x1.81ddddddddddfp5 +REG nad83:2112 0 -0x1.5177777777777p6 0x1.6411111111112p5 +REG nad83:2112 1 -0x1.5ed5a96cde93cp6 0x1.5100000000001p5 +REG nad83:2112 2 -0x1.44194582105b2p6 0x1.5100000000001p5 +REG nad83:2112 3 -0x1.5ed5a96cde93cp6 0x1.7722222222223p5 +REG nad83:2112 4 -0x1.44194582105b2p6 0x1.7722222222223p5 +REG nad83:2113 0 -0x1.5177777777777p6 0x1.54aaaaaaaaaaap5 +REG nad83:2113 1 -0x1.5d3cc18569e1bp6 0x1.4355555555555p5 +REG nad83:2113 2 -0x1.45b22d69850d3p6 0x1.4355555555555p5 +REG nad83:2113 3 -0x1.5d3cc18569e1bp6 0x1.65fffffffffffp5 +REG nad83:2113 4 -0x1.45b22d69850d3p6 0x1.65fffffffffffp5 +REG nad83:2201 0 -0x1.7466666666666p6 0x1.7c88888888888p5 +REG nad83:2201 1 -0x1.810c081b7cfa8p6 0x1.6b77777777777p5 +REG nad83:2201 2 -0x1.67c0c4b14fd24p6 0x1.6b77777777777p5 +REG nad83:2201 3 -0x1.810c081b7cfa8p6 0x1.8d99999999999p5 +REG nad83:2201 4 -0x1.67c0c4b14fd24p6 0x1.8d99999999999p5 +REG nad83:2202 0 -0x1.79p6 0x1.7033333333333p5 +REG nad83:2202 1 -0x1.84cf488d08b84p6 0x1.5fccccccccccdp5 +REG nad83:2202 2 -0x1.6d30b772f747cp6 0x1.5fccccccccccdp5 +REG nad83:2202 3 -0x1.84cf488d08b84p6 0x1.8099999999999p5 +REG nad83:2202 4 -0x1.6d30b772f747cp6 0x1.8099999999999p5 +REG nad83:2203 0 -0x1.78p6 0x1.60ddddddddddep5 +REG nad83:2203 1 -0x1.84594387ce089p6 0x1.4f22222222222p5 +REG nad83:2203 2 -0x1.6ba6bc7831f77p6 0x1.4f22222222222p5 +REG nad83:2203 3 -0x1.84594387ce089p6 0x1.729999999999ap5 +REG nad83:2203 4 -0x1.6ba6bc7831f77p6 0x1.729999999999ap5 +REG nad83:2301 0 -0x1.6355555555555p6 0x1.d8p4 +REG nad83:2301 1 -0x1.7a4ffc573e9f7p6 0x1.88p4 +REG nad83:2301 2 -0x1.4c5aae536c0b3p6 0x1.88p4 +REG nad83:2301 3 -0x1.7a4ffc573e9f7p6 0x1.14p5 +REG nad83:2301 4 -0x1.4c5aae536c0b3p6 0x1.14p5 +REG nad83:2302 0 -0x1.6955555555555p6 0x1.d8p4 +REG nad83:2302 1 -0x1.804ffc573e9f7p6 0x1.88p4 +REG nad83:2302 2 -0x1.525aae536c0b3p6 0x1.88p4 +REG nad83:2302 3 -0x1.804ffc573e9f7p6 0x1.14p5 +REG nad83:2302 4 -0x1.525aae536c0b3p6 0x1.14p5 +REG nad83:2401 0 -0x1.6ap6 0x1.1eaaaaaaaaaabp5 +REG nad83:2401 1 -0x1.82ab5906bb4b1p6 0x1.ed55555555556p4 +REG nad83:2401 2 -0x1.5154a6f944b4fp6 0x1.ed55555555556p4 +REG nad83:2401 3 -0x1.82ab5906bb4b1p6 0x1.46aaaaaaaaaabp5 +REG nad83:2401 4 -0x1.5154a6f944b4fp6 0x1.46aaaaaaaaaabp5 +REG nad83:2402 0 -0x1.72p6 0x1.1eaaaaaaaaaabp5 +REG nad83:2402 1 -0x1.8aab5906bb4b1p6 0x1.ed55555555556p4 +REG nad83:2402 2 -0x1.5954a6f944b4fp6 0x1.ed55555555556p4 +REG nad83:2402 3 -0x1.8aab5906bb4b1p6 0x1.46aaaaaaaaaabp5 +REG nad83:2402 4 -0x1.5954a6f944b4fp6 0x1.46aaaaaaaaaabp5 +REG nad83:2403 0 -0x1.7ap6 0x1.2155555555555p5 +REG nad83:2403 1 -0x1.92c61931dde5cp6 0x1.f2aaaaaaaaaaap4 +REG nad83:2403 2 -0x1.6139e6ce221a4p6 0x1.f2aaaaaaaaaaap4 +REG nad83:2403 3 -0x1.92c61931dde5cp6 0x1.4955555555555p5 +REG nad83:2403 4 -0x1.6139e6ce221a4p6 0x1.4955555555555p5 +REG nad83:2500 0 -0x1.b6p6 0x1.75p5 +REG nad83:2500 1 -0x1.d1aa6ccf54f8ap6 0x1.4fp5 +REG nad83:2500 2 -0x1.9a559330ab076p6 0x1.4fp5 +REG nad83:2500 3 -0x1.d1aa6ccf54f8ap6 0x1.9bp5 +REG nad83:2500 4 -0x1.9a559330ab076p6 0x1.9bp5 +REG nad83:2600 0 -0x1.9p6 0x1.4b55555555556p5 +REG nad83:2600 1 -0x1.a0e40642823c5p6 0x1.3200000000001p5 +REG nad83:2600 2 -0x1.7f1bf9bd7dc3bp6 0x1.3200000000001p5 +REG nad83:2600 3 -0x1.a0e40642823c5p6 0x1.64aaaaaaaaaabp5 +REG nad83:2600 4 -0x1.7f1bf9bd7dc3bp6 0x1.64aaaaaaaaaabp5 +REG nad83:2701 0 -0x1.ce55555555555p6 0x1.16p5 +REG nad83:2701 1 -0x1.e6acb863f64b3p6 0x1.dcp4 +REG nad83:2701 2 -0x1.b5fdf246b45f7p6 0x1.dcp4 +REG nad83:2701 3 -0x1.e6acb863f64b3p6 0x1.3ep5 +REG nad83:2701 4 -0x1.b5fdf246b45f7p6 0x1.3ep5 +REG nad83:2702 0 -0x1.d2aaaaaaaaaabp6 0x1.16p5 +REG nad83:2702 1 -0x1.eb020db94ba09p6 0x1.dcp4 +REG nad83:2702 2 -0x1.ba53479c09b4dp6 0x1.dcp4 +REG nad83:2702 3 -0x1.eb020db94ba09p6 0x1.3ep5 +REG nad83:2702 4 -0x1.ba53479c09b4dp6 0x1.3ep5 +REG nad83:2703 0 -0x1.da55555555555p6 0x1.16p5 +REG nad83:2703 1 -0x1.f2acb863f64b3p6 0x1.dcp4 +REG nad83:2703 2 -0x1.c1fdf246b45f7p6 0x1.dcp4 +REG nad83:2703 3 -0x1.f2acb863f64b3p6 0x1.3ep5 +REG nad83:2703 4 -0x1.c1fdf246b45f7p6 0x1.3ep5 +REG nad83:2800 0 -0x1.1eaaaaaaaaaabp6 0x1.54p5 +REG nad83:2800 1 -0x1.39cb22ddba63cp6 0x1.2cp5 +REG nad83:2800 2 -0x1.038a32779af1ap6 0x1.2cp5 +REG nad83:2800 3 -0x1.39cb22ddba63cp6 0x1.7cp5 +REG nad83:2800 4 -0x1.038a32779af1ap6 0x1.7cp5 +REG nad83:2900 0 -0x1.2ap6 0x1.36aaaaaaaaaabp5 +REG nad83:2900 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaabp5 +REG nad83:2900 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaabp5 +REG nad83:2900 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaabp5 +REG nad83:2900 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaabp5 +REG nad83:3001 0 -0x1.a155555555555p6 0x1.fp4 +REG nad83:3001 1 -0x1.b8aa7f0f4a8ecp6 0x1.ap4 +REG nad83:3001 2 -0x1.8a002b9b601bep6 0x1.ap4 +REG nad83:3001 3 -0x1.b8aa7f0f4a8ecp6 0x1.2p5 +REG nad83:3001 4 -0x1.8a002b9b601bep6 0x1.2p5 +REG nad83:3002 0 -0x1.a9p6 0x1.fp4 +REG nad83:3002 1 -0x1.c05529b9f5397p6 0x1.ap4 +REG nad83:3002 2 -0x1.91aad6460ac69p6 0x1.ap4 +REG nad83:3002 3 -0x1.c05529b9f5397p6 0x1.2p5 +REG nad83:3002 4 -0x1.91aad6460ac69p6 0x1.2p5 +REG nad83:3003 0 -0x1.af55555555555p6 0x1.fp4 +REG nad83:3003 1 -0x1.c6aa7f0f4a8ecp6 0x1.ap4 +REG nad83:3003 2 -0x1.98002b9b601bep6 0x1.ap4 +REG nad83:3003 3 -0x1.c6aa7f0f4a8ecp6 0x1.2p5 +REG nad83:3003 4 -0x1.98002b9b601bep6 0x1.2p5 +REG nad83:301 0 -0x1.7p6 0x1.1a44444444444p5 +REG nad83:301 1 -0x1.794f6bc4d5215p6 0x1.0b11111111111p5 +REG nad83:301 2 -0x1.66b0943b2adebp6 0x1.0b11111111111p5 +REG nad83:301 3 -0x1.794f6bc4d5215p6 0x1.2977777777777p5 +REG nad83:301 4 -0x1.66b0943b2adebp6 0x1.2977777777777p5 +REG nad83:302 0 -0x1.7p6 0x1.0dbbbbbbbbbbcp5 +REG nad83:302 1 -0x1.7a1942726255cp6 0x1.f9ddddddddddep4 +REG nad83:302 2 -0x1.65e6bd8d9daa4p6 0x1.f9ddddddddddep4 +REG nad83:302 3 -0x1.7a1942726255cp6 0x1.1e88888888889p5 +REG nad83:302 4 -0x1.65e6bd8d9daa4p6 0x1.1e88888888889p5 +REG nad83:3101 0 -0x1.2ap6 0x1.36aaaaaaaaaabp5 +REG nad83:3101 1 -0x1.43acc11676167p6 0x1.0eaaaaaaaaaabp5 +REG nad83:3101 2 -0x1.10533ee989e99p6 0x1.0eaaaaaaaaaabp5 +REG nad83:3101 3 -0x1.43acc11676167p6 0x1.5eaaaaaaaaaabp5 +REG nad83:3101 4 -0x1.10533ee989e99p6 0x1.5eaaaaaaaaaabp5 +REG nad83:3102 0 -0x1.3255555555555p6 0x1.4p5 +REG nad83:3102 1 -0x1.4c7104c68e2d2p6 0x1.18p5 +REG nad83:3102 2 -0x1.1839a5e41c7d8p6 0x1.18p5 +REG nad83:3102 3 -0x1.4c7104c68e2d2p6 0x1.68p5 +REG nad83:3102 4 -0x1.1839a5e41c7d8p6 0x1.68p5 +REG nad83:3103 0 -0x1.3a55555555555p6 0x1.4p5 +REG nad83:3103 1 -0x1.547104c68e2d2p6 0x1.18p5 +REG nad83:3103 2 -0x1.2039a5e41c7d8p6 0x1.18p5 +REG nad83:3103 3 -0x1.547104c68e2d2p6 0x1.68p5 +REG nad83:3103 4 -0x1.2039a5e41c7d8p6 0x1.68p5 +REG nad83:3104 0 -0x1.28p6 0x1.44cccccccccccp5 +REG nad83:3104 1 -0x1.2d44a959c4a13p6 0x1.3ccccccccccccp5 +REG nad83:3104 2 -0x1.22bb56a63b5edp6 0x1.3ccccccccccccp5 +REG nad83:3104 3 -0x1.2d44a959c4a13p6 0x1.4ccccccccccccp5 +REG nad83:3104 4 -0x1.22bb56a63b5edp6 0x1.4ccccccccccccp5 +REG nad83:3200 0 -0x1.3cp6 0x1.17aaaaaaaaaaap5 +REG nad83:3200 1 -0x1.47cb7933f48aap6 0x1.0455555555555p5 +REG nad83:3200 2 -0x1.303486cc0b756p6 0x1.0455555555555p5 +REG nad83:3200 3 -0x1.47cb7933f48aap6 0x1.2afffffffffffp5 +REG nad83:3200 4 -0x1.303486cc0b756p6 0x1.2afffffffffffp5 +REG nad83:3301 0 -0x1.92p6 0x1.7eeeeeeeeeeefp5 +REG nad83:3301 1 -0x1.9c55c3f143a71p6 0x1.7111111111111p5 +REG nad83:3301 2 -0x1.87aa3c0ebc58fp6 0x1.7111111111111p5 +REG nad83:3301 3 -0x1.9c55c3f143a71p6 0x1.8cccccccccccdp5 +REG nad83:3301 4 -0x1.87aa3c0ebc58fp6 0x1.8cccccccccccdp5 +REG nad83:3302 0 -0x1.92p6 0x1.749999999999ap5 +REG nad83:3302 1 -0x1.9c9237ec29bb1p6 0x1.6611111111111p5 +REG nad83:3302 2 -0x1.876dc813d644fp6 0x1.6611111111111p5 +REG nad83:3302 3 -0x1.9c9237ec29bb1p6 0x1.8322222222223p5 +REG nad83:3302 4 -0x1.876dc813d644fp6 0x1.8322222222223p5 +REG nad83:3401 0 -0x1.4ap6 0x1.4577777777778p5 +REG nad83:3401 1 -0x1.54b9b443558bap6 0x1.3533333333333p5 +REG nad83:3401 2 -0x1.3f464bbcaa746p6 0x1.3533333333333p5 +REG nad83:3401 3 -0x1.54b9b443558bap6 0x1.55bbbbbbbbbbdp5 +REG nad83:3401 4 -0x1.3f464bbcaa746p6 0x1.55bbbbbbbbbbdp5 +REG nad83:3402 0 -0x1.4ap6 0x1.3822222222222p5 +REG nad83:3402 1 -0x1.5477d61b148dfp6 0x1.27ddddddddddep5 +REG nad83:3402 2 -0x1.3f8829e4eb721p6 0x1.27ddddddddddep5 +REG nad83:3402 3 -0x1.5477d61b148dfp6 0x1.4866666666666p5 +REG nad83:3402 4 -0x1.3f8829e4eb721p6 0x1.4866666666666p5 +REG nad83:3501 0 -0x1.88p6 0x1.1f11111111111p5 +REG nad83:3501 1 -0x1.90b8d4acb5308p6 0x1.10eeeeeeeeeefp5 +REG nad83:3501 2 -0x1.7f472b534acf8p6 0x1.10eeeeeeeeeefp5 +REG nad83:3501 3 -0x1.90b8d4acb5308p6 0x1.2d33333333333p5 +REG nad83:3501 4 -0x1.7f472b534acf8p6 0x1.2d33333333333p5 +REG nad83:3502 0 -0x1.88p6 0x1.1244444444444p5 +REG nad83:3502 1 -0x1.9132b355fc5d2p6 0x1.0311111111111p5 +REG nad83:3502 2 -0x1.7ecd4caa03a2ep6 0x1.0311111111111p5 +REG nad83:3502 3 -0x1.9132b355fc5d2p6 0x1.2177777777777p5 +REG nad83:3502 4 -0x1.7ecd4caa03a2ep6 0x1.2177777777777p5 +REG nad83:3601 0 -0x1.e2p6 0x1.66aaaaaaaaaaap5 +REG nad83:3601 1 -0x1.ef293dbbe364p6 0x1.53fffffffffffp5 +REG nad83:3601 2 -0x1.d4d6c2441c9cp6 0x1.53fffffffffffp5 +REG nad83:3601 3 -0x1.ef293dbbe364p6 0x1.7955555555555p5 +REG nad83:3601 4 -0x1.d4d6c2441c9cp6 0x1.7955555555555p5 +REG nad83:3602 0 -0x1.e2p6 0x1.56aaaaaaaaaaap5 +REG nad83:3602 1 -0x1.eeba2d4454414p6 0x1.43fffffffffffp5 +REG nad83:3602 2 -0x1.d545d2bbabbecp6 0x1.43fffffffffffp5 +REG nad83:3602 3 -0x1.eeba2d4454414p6 0x1.6955555555555p5 +REG nad83:3602 4 -0x1.d545d2bbabbecp6 0x1.6955555555555p5 +REG nad83:3701 0 -0x1.37p6 0x1.4877777777778p5 +REG nad83:3701 1 -0x1.4075cb858aac8p6 0x1.3a33333333333p5 +REG nad83:3701 2 -0x1.2d8a347a75538p6 0x1.3a33333333333p5 +REG nad83:3701 3 -0x1.4075cb858aac8p6 0x1.56bbbbbbbbbbdp5 +REG nad83:3701 4 -0x1.2d8a347a75538p6 0x1.56bbbbbbbbbbdp5 +REG nad83:3702 0 -0x1.37p6 0x1.4133333333334p5 +REG nad83:3702 1 -0x1.3f8c26cb1f465p6 0x1.3422222222223p5 +REG nad83:3702 2 -0x1.2e73d934e0b9bp6 0x1.3422222222223p5 +REG nad83:3702 3 -0x1.3f8c26cb1f465p6 0x1.4e44444444445p5 +REG nad83:3702 4 -0x1.2e73d934e0b9bp6 0x1.4e44444444445p5 +REG nad83:3800 0 -0x1.1ep6 0x1.48aaaaaaaaaabp5 +REG nad83:3800 1 -0x1.3888a96ee8ed9p6 0x1.20aaaaaaaaaabp5 +REG nad83:3800 2 -0x1.0377569117127p6 0x1.20aaaaaaaaaabp5 +REG nad83:3800 3 -0x1.3888a96ee8ed9p6 0x1.70aaaaaaaaaabp5 +REG nad83:3800 4 -0x1.0377569117127p6 0x1.70aaaaaaaaaabp5 +REG nad83:3900 0 -0x1.44p6 0x1.0aaaaaaaaaaabp5 +REG nad83:3900 1 -0x1.525ce4d3b432dp6 0x1.e555555555555p4 +REG nad83:3900 2 -0x1.35a31b2c4bcd3p6 0x1.e555555555555p4 +REG nad83:3900 3 -0x1.525ce4d3b432dp6 0x1.22aaaaaaaaaacp5 +REG nad83:3900 4 -0x1.35a31b2c4bcd3p6 0x1.22aaaaaaaaaacp5 +REG nad83:4001 0 -0x1.9p6 0x1.6611111111111p5 +REG nad83:4001 1 -0x1.9a6bdb73f4276p6 0x1.5744444444445p5 +REG nad83:4001 2 -0x1.8594248c0bd8ap6 0x1.5744444444445p5 +REG nad83:4001 3 -0x1.9a6bdb73f4276p6 0x1.74dddddddddddp5 +REG nad83:4001 4 -0x1.8594248c0bd8ap6 0x1.74dddddddddddp5 +REG nad83:4002 0 -0x1.9155555555555p6 0x1.5aeeeeeeeeeefp5 +REG nad83:4002 1 -0x1.9cb46504892e6p6 0x1.4a66666666667p5 +REG nad83:4002 2 -0x1.85f645a6217c4p6 0x1.4a66666666667p5 +REG nad83:4002 3 -0x1.9cb46504892e6p6 0x1.6b77777777777p5 +REG nad83:4002 4 -0x1.85f645a6217c4p6 0x1.6b77777777777p5 +REG nad83:401 0 -0x1.e8p6 0x1.44p5 +REG nad83:401 1 -0x1.f4462e6374a3cp6 0x1.3155555555556p5 +REG nad83:401 2 -0x1.dbb9d19c8b5c4p6 0x1.3155555555556p5 +REG nad83:401 3 -0x1.f4462e6374a3cp6 0x1.56aaaaaaaaaaap5 +REG nad83:401 4 -0x1.dbb9d19c8b5c4p6 0x1.56aaaaaaaaaaap5 +REG nad83:402 0 -0x1.e8p6 0x1.36p5 +REG nad83:402 1 -0x1.f31cdda2c7b9p6 0x1.24aaaaaaaaaaap5 +REG nad83:402 2 -0x1.dce3225d3847p6 0x1.24aaaaaaaaaaap5 +REG nad83:402 3 -0x1.f31cdda2c7b9p6 0x1.4755555555556p5 +REG nad83:402 4 -0x1.dce3225d3847p6 0x1.4755555555556p5 +REG nad83:403 0 -0x1.e2p6 0x1.2bbbbbbbbbbbcp5 +REG nad83:403 1 -0x1.ebbe49440fcc8p6 0x1.1c44444444445p5 +REG nad83:403 2 -0x1.d841b6bbf0338p6 0x1.1c44444444445p5 +REG nad83:403 3 -0x1.ebbe49440fcc8p6 0x1.3b33333333333p5 +REG nad83:403 4 -0x1.d841b6bbf0338p6 0x1.3b33333333333p5 +REG nad83:404 0 -0x1.dcp6 0x1.2255555555556p5 +REG nad83:404 1 -0x1.e58306e0bb625p6 0x1.1300000000001p5 +REG nad83:404 2 -0x1.d27cf91f449dbp6 0x1.1300000000001p5 +REG nad83:404 3 -0x1.e58306e0bb625p6 0x1.31aaaaaaaaaabp5 +REG nad83:404 4 -0x1.d27cf91f449dbp6 0x1.31aaaaaaaaaabp5 +REG nad83:405 0 -0x1.d8p6 0x1.13ddddddddddep5 +REG nad83:405 1 -0x1.e18b267fb9e31p6 0x1.0422222222222p5 +REG nad83:405 2 -0x1.ce74d980461cfp6 0x1.0422222222222p5 +REG nad83:405 3 -0x1.e18b267fb9e31p6 0x1.239999999999ap5 +REG nad83:405 4 -0x1.ce74d980461cfp6 0x1.239999999999ap5 +REG nad83:406 0 -0x1.d1p6 0x1.0833333333333p5 +REG nad83:406 1 -0x1.d9309c27706f7p6 0x1.f4eeeeeeeeeeep4 +REG nad83:406 2 -0x1.c8cf63d88f909p6 0x1.f4eeeeeeeeeeep4 +REG nad83:406 3 -0x1.d9309c27706f7p6 0x1.15eeeeeeeeeefp5 +REG nad83:406 4 -0x1.c8cf63d88f909p6 0x1.15eeeeeeeeeefp5 +REG nad83:4100 0 -0x1.58p6 0x1.1bp5 +REG nad83:4100 1 -0x1.62385d901218dp6 0x1.0a55555555556p5 +REG nad83:4100 2 -0x1.4dc7a26fede73p6 0x1.0a55555555556p5 +REG nad83:4100 3 -0x1.62385d901218dp6 0x1.2baaaaaaaaaaap5 +REG nad83:4100 4 -0x1.4dc7a26fede73p6 0x1.2baaaaaaaaaaap5 +REG nad83:4201 0 -0x1.96p6 0x1.18bbbbbbbbbbcp5 +REG nad83:4201 1 -0x1.a0ac641220f45p6 0x1.0744444444445p5 +REG nad83:4201 2 -0x1.8b539beddf0bbp6 0x1.0744444444445p5 +REG nad83:4201 3 -0x1.a0ac641220f45p6 0x1.2a33333333333p5 +REG nad83:4201 4 -0x1.8b539beddf0bbp6 0x1.2a33333333333p5 +REG nad83:4202 0 -0x1.8ap6 0x1.0688888888889p5 +REG nad83:4202 1 -0x1.94f271ed65e92p6 0x1.e844444444445p4 +REG nad83:4202 2 -0x1.7f0d8e129a16ep6 0x1.e844444444445p4 +REG nad83:4202 3 -0x1.94f271ed65e92p6 0x1.18eeeeeeeeefp5 +REG nad83:4202 4 -0x1.7f0d8e129a16ep6 0x1.18eeeeeeeeefp5 +REG nad83:4203 0 -0x1.9155555555555p6 0x1.ec66666666666p4 +REG nad83:4203 1 -0x1.9ba738e53ac9fp6 0x1.c8eeeeeeeeeefp4 +REG nad83:4203 2 -0x1.870371c56fe0bp6 0x1.c8eeeeeeeeeefp4 +REG nad83:4203 3 -0x1.9ba738e53ac9fp6 0x1.07eeeeeeeeeeep5 +REG nad83:4203 4 -0x1.870371c56fe0bp6 0x1.07eeeeeeeeeeep5 +REG nad83:4204 0 -0x1.8cp6 0x1.d0eeeeeeeeeefp4 +REG nad83:4204 1 -0x1.97361161034adp6 0x1.a9bbbbbbbbbbbp4 +REG nad83:4204 2 -0x1.80c9ee9efcb53p6 0x1.a9bbbbbbbbbbbp4 +REG nad83:4204 3 -0x1.97361161034adp6 0x1.f822222222223p4 +REG nad83:4204 4 -0x1.80c9ee9efcb53p6 0x1.f822222222223p4 +REG nad83:4205 0 -0x1.8ap6 0x1.acp4 +REG nad83:4205 1 -0x1.93b49156c66f9p6 0x1.8955555555556p4 +REG nad83:4205 2 -0x1.804b6ea939907p6 0x1.8955555555556p4 +REG nad83:4205 3 -0x1.93b49156c66f9p6 0x1.ceaaaaaaaaaaap4 +REG nad83:4205 4 -0x1.804b6ea939907p6 0x1.ceaaaaaaaaaaap4 +REG nad83:4301 0 -0x1.bep6 0x1.4877777777778p5 +REG nad83:4301 1 -0x1.c5b11f7fb8877p6 0x1.3cddddddddddfp5 +REG nad83:4301 2 -0x1.b64ee08047789p6 0x1.3cddddddddddfp5 +REG nad83:4301 3 -0x1.c5b11f7fb8877p6 0x1.5411111111111p5 +REG nad83:4301 4 -0x1.b64ee08047789p6 0x1.5411111111111p5 +REG nad83:4302 0 -0x1.bep6 0x1.3beeeeeeeeeefp5 +REG nad83:4302 1 -0x1.ca0202c3d20c7p6 0x1.2966666666667p5 +REG nad83:4302 2 -0x1.b1fdfd3c2df39p6 0x1.2966666666667p5 +REG nad83:4302 3 -0x1.ca0202c3d20c7p6 0x1.4e77777777777p5 +REG nad83:4302 4 -0x1.b1fdfd3c2df39p6 0x1.4e77777777777p5 +REG nad83:4303 0 -0x1.bep6 0x1.2c11111111111p5 +REG nad83:4303 1 -0x1.c67cf5fa2459ep6 0x1.1e99999999999p5 +REG nad83:4303 2 -0x1.b5830a05dba62p6 0x1.1e99999999999p5 +REG nad83:4303 3 -0x1.c67cf5fa2459ep6 0x1.3988888888889p5 +REG nad83:4303 4 -0x1.b5830a05dba62p6 0x1.3988888888889p5 +REG nad83:4400 0 -0x1.22p6 0x1.54p5 +REG nad83:4400 1 -0x1.3d2078330fb91p6 0x1.2cp5 +REG nad83:4400 2 -0x1.06df87ccf046fp6 0x1.2cp5 +REG nad83:4400 3 -0x1.3d2078330fb91p6 0x1.7cp5 +REG nad83:4400 4 -0x1.06df87ccf046fp6 0x1.7cp5 +REG nad83:4501 0 -0x1.3ap6 0x1.3377777777778p5 +REG nad83:4501 1 -0x1.41d46dd6b3ca8p6 0x1.2733333333333p5 +REG nad83:4501 2 -0x1.322b92294c358p6 0x1.2733333333333p5 +REG nad83:4501 3 -0x1.41d46dd6b3ca8p6 0x1.3fbbbbbbbbbbdp5 +REG nad83:4501 4 -0x1.322b92294c358p6 0x1.3fbbbbbbbbbbdp5 +REG nad83:4502 0 -0x1.3ap6 0x1.2933333333334p5 +REG nad83:4502 1 -0x1.423262b0988ep6 0x1.1c22222222223p5 +REG nad83:4502 2 -0x1.31cd9d4f6772p6 0x1.1c22222222223p5 +REG nad83:4502 3 -0x1.423262b0988ep6 0x1.3644444444445p5 +REG nad83:4502 4 -0x1.31cd9d4f6772p6 0x1.3644444444445p5 +REG nad83:4601 0 -0x1.e355555555555p6 0x1.7eeeeeeeeeeefp5 +REG nad83:4601 1 -0x1.edab194698fc6p6 0x1.7111111111111p5 +REG nad83:4601 2 -0x1.d8ff916411ae4p6 0x1.7111111111111p5 +REG nad83:4601 3 -0x1.edab194698fc6p6 0x1.8cccccccccccdp5 +REG nad83:4601 4 -0x1.d8ff916411ae4p6 0x1.8cccccccccccdp5 +REG nad83:4602 0 -0x1.e2p6 0x1.72aaaaaaaaaabp5 +REG nad83:4602 1 -0x1.ed96219a4fa34p6 0x1.62aaaaaaaaaabp5 +REG nad83:4602 2 -0x1.d669de65b05ccp6 0x1.62aaaaaaaaaabp5 +REG nad83:4602 3 -0x1.ed96219a4fa34p6 0x1.82aaaaaaaaaabp5 +REG nad83:4602 4 -0x1.d669de65b05ccp6 0x1.82aaaaaaaaaabp5 +REG nad83:4701 0 -0x1.3ep6 0x1.3bp5 +REG nad83:4701 1 -0x1.470e3592d233ap6 0x1.2dp5 +REG nad83:4701 2 -0x1.34f1ca6d2dcc6p6 0x1.2dp5 +REG nad83:4701 3 -0x1.470e3592d233ap6 0x1.49p5 +REG nad83:4701 4 -0x1.34f1ca6d2dcc6p6 0x1.49p5 +REG nad83:4702 0 -0x1.44p6 0x1.2f88888888888p5 +REG nad83:4702 1 -0x1.4d8d66692e927p6 0x1.2077777777777p5 +REG nad83:4702 2 -0x1.3a729996d16d9p6 0x1.2077777777777p5 +REG nad83:4702 3 -0x1.4d8d66692e927p6 0x1.3e99999999999p5 +REG nad83:4702 4 -0x1.3a729996d16d9p6 0x1.3e99999999999p5 +REG nad83:4801 0 -0x1.68p6 0x1.6fbbbbbbbbbbcp5 +REG nad83:4801 1 -0x1.71352657aea25p6 0x1.62eeeeeeeeeefp5 +REG nad83:4801 2 -0x1.5ecad9a8515dbp6 0x1.62eeeeeeeeeefp5 +REG nad83:4801 3 -0x1.71352657aea25p6 0x1.7c88888888889p5 +REG nad83:4801 4 -0x1.5ecad9a8515dbp6 0x1.7c88888888889p5 +REG nad83:4802 0 -0x1.68p6 0x1.6555555555556p5 +REG nad83:4802 1 -0x1.715fabce299d6p6 0x1.5800000000001p5 +REG nad83:4802 2 -0x1.5ea05431d662ap6 0x1.5800000000001p5 +REG nad83:4802 3 -0x1.715fabce299d6p6 0x1.72aaaaaaaaaabp5 +REG nad83:4802 4 -0x1.5ea05431d662ap6 0x1.72aaaaaaaaaabp5 +REG nad83:4803 0 -0x1.68p6 0x1.5844444444444p5 +REG nad83:4803 1 -0x1.734f3361a7c79p6 0x1.47bbbbbbbbbbbp5 +REG nad83:4803 2 -0x1.5cb0cc9e58387p6 0x1.47bbbbbbbbbbbp5 +REG nad83:4803 3 -0x1.734f3361a7c79p6 0x1.68ccccccccccdp5 +REG nad83:4803 4 -0x1.5cb0cc9e58387p6 0x1.68ccccccccccdp5 +REG nad83:4901 0 -0x1.a4aaaaaaaaaabp6 0x1.44p5 +REG nad83:4901 1 -0x1.bef7e97fc92e2p6 0x1.1cp5 +REG nad83:4901 2 -0x1.8a5d6bd58c274p6 0x1.1cp5 +REG nad83:4901 3 -0x1.bef7e97fc92e2p6 0x1.6cp5 +REG nad83:4901 4 -0x1.8a5d6bd58c274p6 0x1.6cp5 +REG nad83:4902 0 -0x1.ad55555555555p6 0x1.44p5 +REG nad83:4902 1 -0x1.c7a2942a73d8cp6 0x1.1cp5 +REG nad83:4902 2 -0x1.9308168036d1ep6 0x1.1cp5 +REG nad83:4902 3 -0x1.c7a2942a73d8cp6 0x1.6cp5 +REG nad83:4902 4 -0x1.9308168036d1ep6 0x1.6cp5 +REG nad83:4903 0 -0x1.b3p6 0x1.44p5 +REG nad83:4903 1 -0x1.cd4d3ed51e837p6 0x1.1cp5 +REG nad83:4903 2 -0x1.98b2c12ae17c9p6 0x1.1cp5 +REG nad83:4903 3 -0x1.cd4d3ed51e837p6 0x1.6cp5 +REG nad83:4903 4 -0x1.98b2c12ae17c9p6 0x1.6cp5 +REG nad83:4904 0 -0x1.b855555555555p6 0x1.44p5 +REG nad83:4904 1 -0x1.d2a2942a73d8cp6 0x1.1cp5 +REG nad83:4904 2 -0x1.9e08168036d1ep6 0x1.1cp5 +REG nad83:4904 3 -0x1.d2a2942a73d8cp6 0x1.6cp5 +REG nad83:4904 4 -0x1.9e08168036d1ep6 0x1.6cp5 +REG nad83:5001 0 -0x1.0b55555555555p7 0x1.c8p5 +REG nad83:5001 1 -0x1.1db1b1b64ab12p7 0x1.ap5 +REG nad83:5001 2 -0x1.f1f1f1e8bff31p6 0x1.ap5 +REG nad83:5001 3 -0x1.1db1b1b64ab12p7 0x1.fp5 +REG nad83:5001 4 -0x1.f1f1f1e8bff31p6 0x1.fp5 +REG nad83:5002 0 -0x1.1cp7 0x1.bp5 +REG nad83:5002 1 -0x1.2d0355070bc27p7 0x1.88p5 +REG nad83:5002 2 -0x1.0afcaaf8f43d9p7 0x1.88p5 +REG nad83:5002 3 -0x1.2d0355070bc27p7 0x1.d8p5 +REG nad83:5002 4 -0x1.0afcaaf8f43d9p7 0x1.d8p5 +REG nad83:5003 0 -0x1.24p7 0x1.bp5 +REG nad83:5003 1 -0x1.350355070bc27p7 0x1.88p5 +REG nad83:5003 2 -0x1.12fcaaf8f43d9p7 0x1.88p5 +REG nad83:5003 3 -0x1.350355070bc27p7 0x1.d8p5 +REG nad83:5003 4 -0x1.12fcaaf8f43d9p7 0x1.d8p5 +REG nad83:5004 0 -0x1.2cp7 0x1.bp5 +REG nad83:5004 1 -0x1.3d0355070bc27p7 0x1.88p5 +REG nad83:5004 2 -0x1.1afcaaf8f43d9p7 0x1.88p5 +REG nad83:5004 3 -0x1.3d0355070bc27p7 0x1.d8p5 +REG nad83:5004 4 -0x1.1afcaaf8f43d9p7 0x1.d8p5 +REG nad83:5005 0 -0x1.34p7 0x1.bp5 +REG nad83:5005 1 -0x1.450355070bc27p7 0x1.88p5 +REG nad83:5005 2 -0x1.22fcaaf8f43d9p7 0x1.88p5 +REG nad83:5005 3 -0x1.450355070bc27p7 0x1.d8p5 +REG nad83:5005 4 -0x1.22fcaaf8f43d9p7 0x1.d8p5 +REG nad83:5006 0 -0x1.3cp7 0x1.bp5 +REG nad83:5006 1 -0x1.4d0355070bc27p7 0x1.88p5 +REG nad83:5006 2 -0x1.2afcaaf8f43d9p7 0x1.88p5 +REG nad83:5006 3 -0x1.4d0355070bc27p7 0x1.d8p5 +REG nad83:5006 4 -0x1.2afcaaf8f43d9p7 0x1.d8p5 +REG nad83:5007 0 -0x1.44p7 0x1.bp5 +REG nad83:5007 1 -0x1.550355070bc27p7 0x1.88p5 +REG nad83:5007 2 -0x1.32fcaaf8f43d9p7 0x1.88p5 +REG nad83:5007 3 -0x1.550355070bc27p7 0x1.d8p5 +REG nad83:5007 4 -0x1.32fcaaf8f43d9p7 0x1.d8p5 +REG nad83:5008 0 -0x1.4cp7 0x1.bp5 +REG nad83:5008 1 -0x1.5d0355070bc27p7 0x1.88p5 +REG nad83:5008 2 -0x1.3afcaaf8f43d9p7 0x1.88p5 +REG nad83:5008 3 -0x1.5d0355070bc27p7 0x1.d8p5 +REG nad83:5008 4 -0x1.3afcaaf8f43d9p7 0x1.d8p5 +REG nad83:5009 0 -0x1.54p7 0x1.bp5 +REG nad83:5009 1 -0x1.650355070bc27p7 0x1.88p5 +REG nad83:5009 2 -0x1.42fcaaf8f43d9p7 0x1.88p5 +REG nad83:5009 3 -0x1.650355070bc27p7 0x1.d8p5 +REG nad83:5009 4 -0x1.42fcaaf8f43d9p7 0x1.d8p5 +REG nad83:501 0 -0x1.a6p6 0x1.4077777777778p5 +REG nad83:501 1 -0x1.ad93ed5106ce2p6 0x1.34ddddddddddfp5 +REG nad83:501 2 -0x1.9e6c12aef931ep6 0x1.34ddddddddddfp5 +REG nad83:501 3 -0x1.ad93ed5106ce2p6 0x1.4c11111111111p5 +REG nad83:501 4 -0x1.9e6c12aef931ep6 0x1.4c11111111111p5 +REG nad83:5010 0 -0x1.6p7 0x1.a355555555556p5 +REG nad83:5010 1 0x1.66b58674419cfp7 0x1.8caaaaaaaaaabp5 +REG nad83:5010 2 -0x1.56b58674419cfp7 0x1.8caaaaaaaaaabp5 +REG nad83:5010 3 0x1.66b58674419cfp7 0x1.ba00000000001p5 +REG nad83:5010 4 -0x1.56b58674419cfp7 0x1.ba00000000001p5 +REG nad83:502 0 -0x1.a6p6 0x1.3655555555556p5 +REG nad83:502 1 -0x1.afd615170d5c8p6 0x1.2700000000001p5 +REG nad83:502 2 -0x1.9c29eae8f2a38p6 0x1.2700000000001p5 +REG nad83:502 3 -0x1.afd615170d5c8p6 0x1.45aaaaaaaaaabp5 +REG nad83:502 4 -0x1.9c29eae8f2a38p6 0x1.45aaaaaaaaaabp5 +REG nad83:503 0 -0x1.a6p6 0x1.2c66666666666p5 +REG nad83:503 1 -0x1.aee9ceb4522b5p6 0x1.1e44444444444p5 +REG nad83:503 2 -0x1.9d16314badd4bp6 0x1.1e44444444444p5 +REG nad83:503 3 -0x1.aee9ceb4522b5p6 0x1.3a88888888888p5 +REG nad83:503 4 -0x1.9d16314badd4bp6 0x1.3a88888888888p5 +REG nad83:5101 0 -0x1.37p7 0x1.2d55555555555p4 +REG nad83:5101 1 -0x1.4190cfacbb8b5p7 0x1.baaaaaaaaaaaap3 +REG nad83:5101 2 -0x1.2c6f30534474bp7 0x1.baaaaaaaaaaaap3 +REG nad83:5101 3 -0x1.4190cfacbb8b5p7 0x1.7d55555555555p4 +REG nad83:5101 4 -0x1.2c6f30534474bp7 0x1.7d55555555555p4 +REG nad83:5102 0 -0x1.3955555555555p7 0x1.4555555555555p4 +REG nad83:5102 1 -0x1.43ff74a3344cp7 0x1.eaaaaaaaaaaaap3 +REG nad83:5102 2 -0x1.2eab3607765eap7 0x1.eaaaaaaaaaaaap3 +REG nad83:5102 3 -0x1.43ff74a3344cp7 0x1.9555555555555p4 +REG nad83:5102 4 -0x1.2eab3607765eap7 0x1.9555555555555p4 +REG nad83:5103 0 -0x1.3cp7 0x1.52aaaaaaaaaabp4 +REG nad83:5103 1 -0x1.46b9354855613p7 0x1.02aaaaaaaaaabp4 +REG nad83:5103 2 -0x1.3146cab7aa9edp7 0x1.02aaaaaaaaaabp4 +REG nad83:5103 3 -0x1.46b9354855613p7 0x1.a2aaaaaaaaaabp4 +REG nad83:5103 4 -0x1.3146cab7aa9edp7 0x1.a2aaaaaaaaaabp4 +REG nad83:5104 0 -0x1.3fp7 0x1.5d55555555555p4 +REG nad83:5104 1 -0x1.49c5d1c7349b8p7 0x1.0d55555555555p4 +REG nad83:5104 2 -0x1.343a2e38cb648p7 0x1.0d55555555555p4 +REG nad83:5104 3 -0x1.49c5d1c7349b8p7 0x1.ad55555555555p4 +REG nad83:5104 4 -0x1.343a2e38cb648p7 0x1.ad55555555555p4 +REG nad83:5105 0 -0x1.4055555555555p7 0x1.5aaaaaaaaaaabp4 +REG nad83:5105 1 -0x1.4b17f4409ffdap7 0x1.0aaaaaaaaaaabp4 +REG nad83:5105 2 -0x1.3592b66a0aadp7 0x1.0aaaaaaaaaaabp4 +REG nad83:5105 3 -0x1.4b17f4409ffdap7 0x1.aaaaaaaaaaaabp4 +REG nad83:5105 4 -0x1.3592b66a0aadp7 0x1.aaaaaaaaaaaabp4 +REG nad83:5200 0 -0x1.09bbbbbbbbbbcp6 0x1.2222222222222p4 +REG nad83:5200 1 -0x1.0df13f90a9095p6 0x1.1222222222222p4 +REG nad83:5200 2 -0x1.058637e6ce6e3p6 0x1.1222222222222p4 +REG nad83:5200 3 -0x1.0df13f90a9095p6 0x1.3222222222222p4 +REG nad83:5200 4 -0x1.058637e6ce6e3p6 0x1.3222222222222p4 +REG nad83:600 0 -0x1.23p6 0x1.4accccccccccdp5 +REG nad83:600 1 -0x1.28818d3773554p6 0x1.4288888888889p5 +REG nad83:600 2 -0x1.1d7e72c88caacp6 0x1.4288888888889p5 +REG nad83:600 3 -0x1.28818d3773554p6 0x1.5311111111111p5 +REG nad83:600 4 -0x1.1d7e72c88caacp6 0x1.5311111111111p5 +REG nad83:700 0 -0x1.2daaaaaaaaaabp6 0x1.3p5 +REG nad83:700 1 -0x1.470c0a38b5f7ap6 0x1.08p5 +REG nad83:700 2 -0x1.14494b1c9f5dcp6 0x1.08p5 +REG nad83:700 3 -0x1.470c0a38b5f7ap6 0x1.58p5 +REG nad83:700 4 -0x1.14494b1c9f5dcp6 0x1.58p5 +REG nad83:901 0 -0x1.44p6 0x1.8555555555555p4 +REG nad83:901 1 -0x1.59f33012348e1p6 0x1.3555555555555p4 +REG nad83:901 2 -0x1.2e0ccfedcb71fp6 0x1.3555555555555p4 +REG nad83:901 3 -0x1.59f33012348e1p6 0x1.d555555555555p4 +REG nad83:901 4 -0x1.2e0ccfedcb71fp6 0x1.d555555555555p4 +REG nad83:902 0 -0x1.48p6 0x1.8555555555555p4 +REG nad83:902 1 -0x1.5df33012348e1p6 0x1.3555555555555p4 +REG nad83:902 2 -0x1.320ccfedcb71fp6 0x1.3555555555555p4 +REG nad83:902 3 -0x1.5df33012348e1p6 0x1.d555555555555p4 +REG nad83:902 4 -0x1.320ccfedcb71fp6 0x1.d555555555555p4 +REG nad83:903 0 -0x1.52p6 0x1.dep4 +REG nad83:903 1 -0x1.5a12a00d0fa6ep6 0x1.c2p4 +REG nad83:903 2 -0x1.49ed5ff2f0592p6 0x1.c2p4 +REG nad83:903 3 -0x1.5a12a00d0fa6ep6 0x1.fap4 +REG nad83:903 4 -0x1.49ed5ff2f0592p6 0x1.fap4 +REG world:CH1903 0 0x1.dc22222222222p2 0x1.779e86cdcd1e6p5 +REG world:CH1903 1 0x1.d5d9fb9bcp-4 0x1.4f9e86cdcd1e6p5 +REG world:CH1903 2 0x1.d8766e2aeaa22p3 0x1.4f9e86cdcd1e6p5 +REG world:CH1903 3 0x1.d5d9fb9bcp-4 0x1.9f9e86cdcd1e6p5 +REG world:CH1903 4 0x1.d8766e2aeaa22p3 0x1.9f9e86cdcd1e6p5 +REG world:bng 0 -0x1.0p1 0x1.88p5 +REG world:bng 1 -0x1.33e1680be4906p3 0x1.6p5 +REG world:bng 2 0x1.67c2d017c920cp2 0x1.6p5 +REG world:bng 3 -0x1.33e1680be4906p3 0x1.bp5 +REG world:bng 4 0x1.67c2d017c920cp2 0x1.bp5 +REG world:bwi 0 -0x1.fp5 0x0.0p0 +REG world:bwi 1 -0x1.0cp6 -0x1.4p2 +REG world:bwi 2 -0x1.c8p5 -0x1.4p2 +REG world:bwi 3 -0x1.0cp6 0x1.4p2 +REG world:bwi 4 -0x1.c8p5 0x1.4p2 +REG world:ceylon 0 0x1.43163b7000ba7p6 0x1.c007de6e564ebp2 +REG world:ceylon 1 0x1.2eefc6ccc455fp6 0x1.000fbcdcac9d6p1 +REG world:ceylon 2 0x1.573cb0133d1efp6 0x1.000fbcdcac9d6p1 +REG world:ceylon 3 0x1.2eefc6ccc455fp6 0x1.8003ef372b276p3 +REG world:ceylon 4 0x1.573cb0133d1efp6 0x1.8003ef372b276p3 +REG world:costa-n 0 -0x1.5155555555555p6 0x1.4eeeeeeeeeeefp3 +REG world:costa-n 1 -0x1.65abf7bf7a7a1p6 0x1.5dddddddddddep2 +REG world:costa-n 2 -0x1.3cfeb2eb30309p6 0x1.5dddddddddddep2 +REG world:costa-n 3 -0x1.65abf7bf7a7a1p6 0x1.eeeeeeeeeeeefp3 +REG world:costa-n 4 -0x1.3cfeb2eb30309p6 0x1.eeeeeeeeeeeefp3 +REG world:costa-s 0 -0x1.4eaaaaaaaaaabp6 0x1.2p3 +REG world:costa-s 1 -0x1.62ea7cf4d2aabp6 0x1.0p2 +REG world:costa-s 2 -0x1.3a6ad86082aabp6 0x1.0p2 +REG world:costa-s 3 -0x1.62ea7cf4d2aabp6 0x1.cp3 +REG world:costa-s 4 -0x1.3a6ad86082aabp6 0x1.cp3 +REG world:cuba-n 0 -0x1.44p6 0x1.659999999999ap4 +REG world:cuba-n 1 -0x1.599fdd28e3eaap6 0x1.159999999999ap4 +REG world:cuba-n 2 -0x1.2e6022d71c156p6 0x1.159999999999ap4 +REG world:cuba-n 3 -0x1.599fdd28e3eaap6 0x1.b59999999999ap4 +REG world:cuba-n 4 -0x1.2e6022d71c156p6 0x1.b59999999999ap4 +REG world:cuba-s 0 -0x1.3355555555555p6 0x1.4b77777777777p4 +REG world:cuba-s 1 -0x1.48b745942595bp6 0x1.f6eeeeeeeeeeep3 +REG world:cuba-s 2 -0x1.1df365168514fp6 0x1.f6eeeeeeeeeeep3 +REG world:cuba-s 3 -0x1.48b745942595bp6 0x1.9b77777777777p4 +REG world:cuba-s 4 -0x1.1df365168514fp6 0x1.9b77777777777p4 +REG world:domin_rep 0 -0x1.1ep6 0x1.2d11111111111p4 +REG world:domin_rep 1 -0x1.33211605a4bbbp6 0x1.ba22222222222p3 +REG world:domin_rep 2 -0x1.08dee9fa5b445p6 0x1.ba22222222222p3 +REG world:domin_rep 3 -0x1.33211605a4bbbp6 0x1.7d11111111111p4 +REG world:domin_rep 4 -0x1.08dee9fa5b445p6 0x1.7d11111111111p4 +REG world:egypt-1 0 0x1.98p4 0x0.0p0 +REG world:egypt-1 1 0x1.48p4 -0x1.4p2 +REG world:egypt-1 2 0x1.e8p4 -0x1.4p2 +REG world:egypt-1 3 0x1.48p4 0x1.4p2 +REG world:egypt-1 4 0x1.e8p4 0x1.4p2 +REG world:egypt-2 0 0x1.c8p4 0x0.0p0 +REG world:egypt-2 1 0x1.78p4 -0x1.4p2 +REG world:egypt-2 2 0x1.0cp5 -0x1.4p2 +REG world:egypt-2 3 0x1.78p4 0x1.4p2 +REG world:egypt-2 4 0x1.0cp5 0x1.4p2 +REG world:egypt-3 0 0x1.f8p4 0x0.0p0 +REG world:egypt-3 1 0x1.a8p4 -0x1.4p2 +REG world:egypt-3 2 0x1.24p5 -0x1.4p2 +REG world:egypt-3 3 0x1.a8p4 0x1.4p2 +REG world:egypt-3 4 0x1.24p5 0x1.4p2 +REG world:egypt-4 0 0x1.14p5 0x0.0p0 +REG world:egypt-4 1 0x1.d8p4 -0x1.4p2 +REG world:egypt-4 2 0x1.3cp5 -0x1.4p2 +REG world:egypt-4 3 0x1.d8p4 0x1.4p2 +REG world:egypt-4 4 0x1.3cp5 0x1.4p2 +REG world:egypt-5 0 0x1.2cp5 0x0.0p0 +REG world:egypt-5 1 0x1.04p5 -0x1.4p2 +REG world:egypt-5 2 0x1.54p5 -0x1.4p2 +REG world:egypt-5 3 0x1.04p5 0x1.4p2 +REG world:egypt-5 4 0x1.54p5 0x1.4p2 +REG world:el_sal 0 -0x1.64p6 0x1.b911111111111p3 +REG world:el_sal 1 -0x1.7897cf19bc277p6 0x1.1911111111111p3 +REG world:el_sal 2 -0x1.4f6830e643d89p6 0x1.1911111111111p3 +REG world:el_sal 3 -0x1.7897cf19bc277p6 0x1.2c88888888888p4 +REG world:el_sal 4 -0x1.4f6830e643d89p6 0x1.2c88888888888p4 +REG world:gk2-d 0 0x1.8p2 0x0.0p0 +REG world:gk2-d 1 0x1.0p0 -0x1.4p2 +REG world:gk2-d 2 0x1.6p3 -0x1.4p2 +REG world:gk2-d 3 0x1.0p0 0x1.4p2 +REG world:gk2-d 4 0x1.6p3 0x1.4p2 +REG world:gk3-d 0 0x1.2p3 0x0.0p0 +REG world:gk3-d 1 0x1.0p2 -0x1.4p2 +REG world:gk3-d 2 0x1.cp3 -0x1.4p2 +REG world:gk3-d 3 0x1.0p2 0x1.4p2 +REG world:gk3-d 4 0x1.cp3 0x1.4p2 +REG world:gk4-d 0 0x1.8p3 0x0.0p0 +REG world:gk4-d 1 0x1.cp2 -0x1.4p2 +REG world:gk4-d 2 0x1.1p4 -0x1.4p2 +REG world:gk4-d 3 0x1.cp2 0x1.4p2 +REG world:gk4-d 4 0x1.1p4 0x1.4p2 +REG world:guat-n 0 -0x1.6955555555555p6 0x1.0d11111111111p4 +REG world:guat-n 1 -0x1.7e3a11ecca027p6 0x1.7a22222222222p3 +REG world:guat-n 2 -0x1.547098bde0a83p6 0x1.7a22222222222p3 +REG world:guat-n 3 -0x1.7e3a11ecca027p6 0x1.5d11111111111p4 +REG world:guat-n 4 -0x1.547098bde0a83p6 0x1.5d11111111111p4 +REG world:guat-s 0 -0x1.6955555555555p6 0x1.dcccccccccccdp3 +REG world:guat-s 1 -0x1.7e077a4bda7ebp6 0x1.3cccccccccccdp3 +REG world:guat-s 2 -0x1.54a3305ed02bfp6 0x1.3cccccccccccdp3 +REG world:guat-s 3 -0x1.7e077a4bda7ebp6 0x1.3e66666666666p4 +REG world:guat-s 4 -0x1.54a3305ed02bfp6 0x1.3e66666666666p4 +REG world:haiti 0 -0x1.1ep6 0x1.2d11111111111p4 +REG world:haiti 1 -0x1.33211605a4bbbp6 0x1.ba22222222222p3 +REG world:haiti 2 -0x1.08dee9fa5b445p6 0x1.ba22222222222p3 +REG world:haiti 3 -0x1.33211605a4bbbp6 0x1.7d11111111111p4 +REG world:haiti 4 -0x1.08dee9fa5b445p6 0x1.7d11111111111p4 +REG world:hond-n 0 -0x1.58aaaaaaaaaabp6 0x1.fp3 +REG world:hond-n 1 -0x1.6d6be82433aecp6 0x1.5p3 +REG world:hond-n 2 -0x1.43e96d3121a6ap6 0x1.5p3 +REG world:hond-n 3 -0x1.6d6be82433aecp6 0x1.48p4 +REG world:hond-n 4 -0x1.43e96d3121a6ap6 0x1.48p4 +REG world:hond-s 0 -0x1.5caaaaaaaaaabp6 0x1.b911111111111p3 +REG world:hond-s 1 -0x1.714279c466d22p6 0x1.1911111111111p3 +REG world:hond-s 2 -0x1.4812db90ee834p6 0x1.1911111111111p3 +REG world:hond-s 3 -0x1.714279c466d22p6 0x1.2c88888888888p4 +REG world:hond-s 4 -0x1.4812db90ee834p6 0x1.2c88888888888p4 +REG world:india-I 0 0x1.1p6 0x1.04p5 +REG world:india-I 1 0x1.f0928b4db1cbap5 0x1.b8p4 +REG world:india-I 2 0x1.27b6ba59271a3p6 0x1.b8p4 +REG world:india-I 3 0x1.f0928b4db1cbap5 0x1.2cp5 +REG world:india-I 4 0x1.27b6ba59271a3p6 0x1.2cp5 +REG world:india-IIA 0 0x1.28p6 0x1.ap4 +REG world:india-IIA 1 0x1.11bf7a6273dbcp6 0x1.5p4 +REG world:india-IIA 2 0x1.3e40859d8c244p6 0x1.5p4 +REG world:india-IIA 3 0x1.11bf7a6273dbcp6 0x1.fp4 +REG world:india-IIA 4 0x1.3e40859d8c244p6 0x1.fp4 +REG world:india-IIB 0 0x1.68p6 0x1.ap4 +REG world:india-IIB 1 0x1.51bf7a6273dbcp6 0x1.5p4 +REG world:india-IIB 2 0x1.7e40859d8c244p6 0x1.5p4 +REG world:india-IIB 3 0x1.51bf7a6273dbcp6 0x1.fp4 +REG world:india-IIB 4 0x1.7e40859d8c244p6 0x1.fp4 +REG world:india-IIIA 0 0x1.4p6 0x1.3p4 +REG world:india-IIIA 1 0x1.2ad8fb6bb699ap6 0x1.cp3 +REG world:india-IIIA 2 0x1.5527049449666p6 0x1.cp3 +REG world:india-IIIA 3 0x1.2ad8fb6bb699ap6 0x1.8p4 +REG world:india-IIIA 4 0x1.5527049449666p6 0x1.8p4 +REG world:india-IIIB 0 0x1.9p6 0x1.3p4 +REG world:india-IIIB 1 0x1.7ad8fb6bb699ap6 0x1.cp3 +REG world:india-IIIB 2 0x1.a527049449666p6 0x1.cp3 +REG world:india-IIIB 3 0x1.7ad8fb6bb699ap6 0x1.8p4 +REG world:india-IIIB 4 0x1.a527049449666p6 0x1.8p4 +REG world:india-IVA 0 0x1.4p6 0x1.8p3 +REG world:india-IVA 1 0x1.2b8d9dbc49a16p6 0x1.cp2 +REG world:india-IVA 2 0x1.54726243b65eap6 0x1.cp2 +REG world:india-IVA 3 0x1.2b8d9dbc49a16p6 0x1.1p4 +REG world:india-IVA 4 0x1.54726243b65eap6 0x1.1p4 +REG world:india-IVB 0 0x1.ap6 0x1.8p3 +REG world:india-IVB 1 0x1.8b8d9dbc49a16p6 0x1.cp2 +REG world:india-IVB 2 0x1.b4726243b65eap6 0x1.cp2 +REG world:india-IVB 3 0x1.8b8d9dbc49a16p6 0x1.1p4 +REG world:india-IVB 4 0x1.b4726243b65eap6 0x1.1p4 +REG world:irish 0 -0x1.0p3 0x1.acp5 +REG world:irish 1 -0x1.067e6c3855169p4 0x1.84p5 +REG world:irish 2 0x1.9f9b0e1545a4p-2 0x1.84p5 +REG world:irish 3 -0x1.067e6c3855169p4 0x1.d4p5 +REG world:irish 4 0x1.9f9b0e1545a4p-2 0x1.d4p5 +REG world:levant 0 0x1.2accccccccccdp5 0x1.1533333333333p5 +REG world:levant 1 0x1.f45a283b2e20bp4 0x1.da66666666666p4 +REG world:levant 2 0x1.5b6c857c02894p5 0x1.da66666666666p4 +REG world:levant 3 0x1.f45a283b2e20bp4 0x1.3d33333333333p5 +REG world:levant 4 0x1.5b6c857c02894p5 0x1.3d33333333333p5 +REG world:madagascar 0 0x1.737f671529a48p5 -0x1.2e66666666666p4 +REG world:madagascar 1 0x1.4937dadfc1a48p5 -0x1.7e66666666666p4 +REG world:madagascar 2 0x1.9dc6f34a91a48p5 -0x1.7e66666666666p4 +REG world:madagascar 3 0x1.4937dadfc1a48p5 -0x1.bccccccccccccp3 +REG world:madagascar 4 0x1.9dc6f34a91a48p5 -0x1.bccccccccccccp3 +REG world:malay 0 0x1.99p6 0x1.0p2 +REG world:malay 1 0x1.84f37f5af8062p6 -0x1.0p0 +REG world:malay 2 0x1.ad0c80a507f9ep6 -0x1.0p0 +REG world:malay 3 0x1.84f37f5af8062p6 0x1.2p3 +REG world:malay 4 0x1.ad0c80a507f9ep6 0x1.2p3 +REG world:n-alger 0 0x1.599999999999ap1 0x1.2p5 +REG world:n-alger 1 -0x1.bd7bc705e2dacp1 0x1.fp4 +REG world:n-alger 2 0x1.1c2bbe8e45838p3 0x1.fp4 +REG world:n-alger 3 -0x1.bd7bc705e2dacp1 0x1.48p5 +REG world:n-alger 4 0x1.1c2bbe8e45838p3 0x1.48p5 +REG world:n-maroc 0 -0x1.599999999999ap2 0x1.0a66666666666p5 +REG world:n-maroc 1 -0x1.6c3b4ece0123bp3 0x1.c4cccccccccccp4 +REG world:n-maroc 2 0x1.2a1b534678a1p-1 0x1.c4cccccccccccp4 +REG world:n-maroc 3 -0x1.6c3b4ece0123bp3 0x1.3266666666666p5 +REG world:n-maroc 4 0x1.2a1b534678a1p-1 0x1.3266666666666p5 +REG world:n-tunis 0 0x1.3cccccccccccdp3 0x1.2p5 +REG world:n-tunis 1 0x1.dc1dd293b6beep1 0x1.fp4 +REG world:n-tunis 2 0x1.0149127a55f4fp4 0x1.fp4 +REG world:n-tunis 3 0x1.dc1dd293b6beep1 0x1.48p5 +REG world:n-tunis 4 0x1.0149127a55f4fp4 0x1.48p5 +REG world:neiez 0 0x1.b8p6 0x0.0p0 +REG world:neiez 1 0x1.a4p6 -0x1.4p2 +REG world:neiez 2 0x1.ccp6 -0x1.4p2 +REG world:neiez 3 0x1.a4p6 0x1.4p2 +REG world:neiez 4 0x1.ccp6 0x1.4p2 +REG world:new_zealand 0 0x0.0p0 0x0.0p0 +REG world:new_zealand 1 -0x1.4p2 -0x1.4p2 +REG world:new_zealand 2 0x1.4p2 -0x1.4p2 +REG world:new_zealand 3 -0x1.4p2 0x1.4p2 +REG world:new_zealand 4 0x1.4p2 0x1.4p2 +REG world:nica-n 0 -0x1.56p6 0x1.bbbbbbbbbbbbcp3 +REG world:nica-n 1 -0x1.6a99b23a23b5p6 0x1.1bbbbbbbbbbbcp3 +REG world:nica-n 2 -0x1.41664dc5dc4bp6 0x1.1bbbbbbbbbbbcp3 +REG world:nica-n 3 -0x1.6a99b23a23b5p6 0x1.2dddddddddddep4 +REG world:nica-n 4 -0x1.41664dc5dc4bp6 0x1.2dddddddddddep4 +REG world:nica-s 0 -0x1.56p6 0x1.7555555555555p3 +REG world:nica-s 1 -0x1.6a6c01e3c7fd9p6 0x1.aaaaaaaaaaaaap2 +REG world:nica-s 2 -0x1.4193fe1c38027p6 0x1.aaaaaaaaaaaaap2 +REG world:nica-s 3 -0x1.6a6c01e3c7fd9p6 0x1.0aaaaaaaaaaaap4 +REG world:nica-s 4 -0x1.4193fe1c38027p6 0x1.0aaaaaaaaaaaap4 +REG world:nw-africa 0 0x0.0p0 0x1.1p5 +REG world:nw-africa 1 -0x1.81fd5fd4d7321p2 0x1.dp4 +REG world:nw-africa 2 0x1.81fd5fd4d7321p2 0x1.dp4 +REG world:nw-africa 3 -0x1.81fd5fd4d7321p2 0x1.38p5 +REG world:nw-africa 4 0x1.81fd5fd4d7321p2 0x1.38p5 +REG world:palestine 0 0x1.19b2574a51d44p5 0x1.fbbedc7007b8p4 +REG world:palestine 1 0x1.d554aded046b3p4 0x1.abbedc7007b8p4 +REG world:palestine 2 0x1.48ba579e2172ep5 0x1.abbedc7007b8p4 +REG world:palestine 3 0x1.d554aded046b3p4 0x1.25df6e3803dcp5 +REG world:palestine 4 0x1.48ba579e2172ep5 0x1.25df6e3803dcp5 +REG world:panama 0 -0x1.4p6 0x1.0d55555555555p3 +REG world:panama 1 -0x1.5437be6a5625ep6 0x1.b555555555554p1 +REG world:panama 2 -0x1.2bc84195a9da2p6 0x1.b555555555554p1 +REG world:panama 3 -0x1.5437be6a5625ep6 0x1.ad55555555555p3 +REG world:panama 4 -0x1.2bc84195a9da2p6 0x1.ad55555555555p3 +REG world:s-alger 0 0x1.599999999999ap1 0x1.0a66666666666p5 +REG world:s-alger 1 -0x1.a4206e6b37c1ep1 0x1.c4cccccccccccp4 +REG world:s-alger 2 0x1.15d4e8679abd4p3 0x1.c4cccccccccccp4 +REG world:s-alger 3 -0x1.a4206e6b37c1ep1 0x1.3266666666666p5 +REG world:s-alger 4 0x1.15d4e8679abd4p3 0x1.3266666666666p5 +REG world:s-maroc 0 -0x1.599999999999ap2 0x1.db33333333333p4 +REG world:s-maroc 1 -0x1.64ff6ec44c13ap3 0x1.8b33333333333p4 +REG world:s-maroc 2 0x1.6cbaa5564f4p-2 0x1.8b33333333333p4 +REG world:s-maroc 3 -0x1.64ff6ec44c13ap3 0x1.159999999999ap5 +REG world:s-maroc 4 0x1.6cbaa5564f4p-2 0x1.159999999999ap5 +REG world:s-tunis 0 0x1.3cccccccccccdp3 0x1.0a66666666666p5 +REG world:s-tunis 1 0x1.f5792b2e61d7cp1 0x1.c4cccccccccccp4 +REG world:s-tunis 2 0x1.fc3b4ece0123bp3 0x1.c4cccccccccccp4 +REG world:s-tunis 3 0x1.f5792b2e61d7cp1 0x1.3266666666666p5 +REG world:s-tunis 4 0x1.fc3b4ece0123bp3 0x1.3266666666666p5 +SYN ellps/APL4.9 0 0x1.4p3 0x1.68p5 +SYN ellps/APL4.9 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/APL4.9 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/APL4.9 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/APL4.9 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/CPM 0 0x1.4p3 0x1.68p5 +SYN ellps/CPM 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/CPM 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/CPM 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/CPM 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/GRS67 0 0x1.4p3 0x1.68p5 +SYN ellps/GRS67 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/GRS67 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/GRS67 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/GRS67 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/GRS80 0 0x1.4p3 0x1.68p5 +SYN ellps/GRS80 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/GRS80 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/GRS80 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/GRS80 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/GSK2011 0 0x1.4p3 0x1.68p5 +SYN ellps/GSK2011 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/GSK2011 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/GSK2011 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/GSK2011 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/IAU76 0 0x1.4p3 0x1.68p5 +SYN ellps/IAU76 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/IAU76 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/IAU76 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/IAU76 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/MERIT 0 0x1.4p3 0x1.68p5 +SYN ellps/MERIT 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/MERIT 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/MERIT 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/MERIT 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/NAD27 0 0x1.4p3 0x1.68p5 +SYN ellps/NAD27 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/NAD27 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/NAD27 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/NAD27 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/NAD83 0 0x1.4p3 0x1.68p5 +SYN ellps/NAD83 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/NAD83 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/NAD83 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/NAD83 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/NWL9D 0 0x1.4p3 0x1.68p5 +SYN ellps/NWL9D 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/NWL9D 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/NWL9D 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/NWL9D 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/PZ90 0 0x1.4p3 0x1.68p5 +SYN ellps/PZ90 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/PZ90 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/PZ90 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/PZ90 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/SEasia 0 0x1.4p3 0x1.68p5 +SYN ellps/SEasia 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/SEasia 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/SEasia 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/SEasia 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/SGS85 0 0x1.4p3 0x1.68p5 +SYN ellps/SGS85 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/SGS85 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/SGS85 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/SGS85 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/WGS60 0 0x1.4p3 0x1.68p5 +SYN ellps/WGS60 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/WGS60 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/WGS60 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/WGS60 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/WGS66 0 0x1.4p3 0x1.68p5 +SYN ellps/WGS66 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/WGS66 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/WGS66 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/WGS66 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/WGS72 0 0x1.4p3 0x1.68p5 +SYN ellps/WGS72 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/WGS72 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/WGS72 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/WGS72 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/WGS84 0 0x1.4p3 0x1.68p5 +SYN ellps/WGS84 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/WGS84 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/WGS84 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/WGS84 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/airy 0 0x1.4p3 0x1.68p5 +SYN ellps/airy 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/airy 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/airy 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/airy 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/andrae 0 0x1.4p3 0x1.68p5 +SYN ellps/andrae 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/andrae 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/andrae 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/andrae 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/aust_SA 0 0x1.4p3 0x1.68p5 +SYN ellps/aust_SA 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/aust_SA 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/aust_SA 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/aust_SA 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/australian 0 0x1.4p3 0x1.68p5 +SYN ellps/australian 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/australian 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/australian 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/australian 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/bess_nam 0 0x1.4p3 0x1.68p5 +SYN ellps/bess_nam 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/bess_nam 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/bess_nam 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/bess_nam 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/bessel 0 0x1.4p3 0x1.68p5 +SYN ellps/bessel 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/bessel 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/bessel 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/bessel 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/clrk66 0 0x1.4p3 0x1.68p5 +SYN ellps/clrk66 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/clrk66 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/clrk66 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/clrk66 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/clrk80 0 0x1.4p3 0x1.68p5 +SYN ellps/clrk80 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/clrk80 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/clrk80 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/clrk80 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/clrk80ign 0 0x1.4p3 0x1.68p5 +SYN ellps/clrk80ign 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/clrk80ign 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/clrk80ign 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/clrk80ign 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/danish 0 0x1.4p3 0x1.68p5 +SYN ellps/danish 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/danish 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/danish 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/danish 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/delmbr 0 0x1.4p3 0x1.68p5 +SYN ellps/delmbr 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/delmbr 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/delmbr 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/delmbr 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/engelis 0 0x1.4p3 0x1.68p5 +SYN ellps/engelis 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/engelis 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/engelis 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/engelis 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/evrst30 0 0x1.4p3 0x1.68p5 +SYN ellps/evrst30 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/evrst30 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/evrst30 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/evrst30 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/evrst48 0 0x1.4p3 0x1.68p5 +SYN ellps/evrst48 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/evrst48 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/evrst48 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/evrst48 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/evrst56 0 0x1.4p3 0x1.68p5 +SYN ellps/evrst56 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/evrst56 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/evrst56 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/evrst56 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/evrst69 0 0x1.4p3 0x1.68p5 +SYN ellps/evrst69 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/evrst69 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/evrst69 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/evrst69 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/evrstSS 0 0x1.4p3 0x1.68p5 +SYN ellps/evrstSS 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/evrstSS 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/evrstSS 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/evrstSS 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/fschr60 0 0x1.4p3 0x1.68p5 +SYN ellps/fschr60 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/fschr60 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/fschr60 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/fschr60 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/fschr60m 0 0x1.4p3 0x1.68p5 +SYN ellps/fschr60m 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/fschr60m 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/fschr60m 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/fschr60m 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/fschr68 0 0x1.4p3 0x1.68p5 +SYN ellps/fschr68 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/fschr68 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/fschr68 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/fschr68 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/helmert 0 0x1.4p3 0x1.68p5 +SYN ellps/helmert 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/helmert 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/helmert 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/helmert 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/hough 0 0x1.4p3 0x1.68p5 +SYN ellps/hough 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/hough 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/hough 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/hough 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/intl 0 0x1.4p3 0x1.68p5 +SYN ellps/intl 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/intl 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/intl 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/intl 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/kaula 0 0x1.4p3 0x1.68p5 +SYN ellps/kaula 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/kaula 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/kaula 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/kaula 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/krass 0 0x1.4p3 0x1.68p5 +SYN ellps/krass 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/krass 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/krass 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/krass 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/lerch 0 0x1.4p3 0x1.68p5 +SYN ellps/lerch 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/lerch 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/lerch 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/lerch 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/mod_airy 0 0x1.4p3 0x1.68p5 +SYN ellps/mod_airy 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/mod_airy 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/mod_airy 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/mod_airy 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/mprts 0 0x1.4p3 0x1.68p5 +SYN ellps/mprts 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/mprts 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/mprts 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/mprts 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/new_intl 0 0x1.4p3 0x1.68p5 +SYN ellps/new_intl 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/new_intl 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/new_intl 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/new_intl 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/plessis 0 0x1.4p3 0x1.68p5 +SYN ellps/plessis 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/plessis 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/plessis 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/plessis 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/sphere 0 0x1.4p3 0x1.68p5 +SYN ellps/sphere 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/sphere 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/sphere 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/sphere 4 0x1.112318007c2bp4 0x1.9p5 +SYN ellps/walbeck 0 0x1.4p3 0x1.68p5 +SYN ellps/walbeck 1 0x1.76e73ffc1ea82p1 0x1.4p5 +SYN ellps/walbeck 2 0x1.112318007c2bp4 0x1.4p5 +SYN ellps/walbeck 3 0x1.76e73ffc1ea82p1 0x1.9p5 +SYN ellps/walbeck 4 0x1.112318007c2bp4 0x1.9p5 +SYN mod/aea/R 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_A 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_A 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_A 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_A 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_A 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_C 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_C 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_C 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_C 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_C 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_V 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_V 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_V 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_V 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_V 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_a 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_g 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_h 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_lat_a 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_lat_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_lat_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_lat_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_lat_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/R_lat_g 0 0x1.4p3 0x1.68p5 +SYN mod/aea/R_lat_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/R_lat_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/R_lat_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/R_lat_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/a 0 0x1.4p3 0x1.68p5 +SYN mod/aea/a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/alpha 0 0x1.4p3 0x1.68p5 +SYN mod/aea/alpha 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/alpha 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/alpha 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/alpha 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/axis_neu 0 0x1.4p3 0x1.68p5 +SYN mod/aea/axis_neu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/axis_neu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/axis_neu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/axis_neu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/axis_wsu 0 0x1.4p3 0x1.68p5 +SYN mod/aea/axis_wsu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/axis_wsu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/axis_wsu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/axis_wsu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/b 0 0x1.4p3 0x1.68p5 +SYN mod/aea/b 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/b 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/b 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/b 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/datum_NAD27 0 0x1.4p3 0x1.68p5 +SYN mod/aea/datum_NAD27 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/datum_NAD27 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/datum_NAD27 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/datum_NAD27 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/datum_NAD83 0 0x1.4p3 0x1.68p5 +SYN mod/aea/datum_NAD83 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/datum_NAD83 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/datum_NAD83 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/datum_NAD83 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/datum_WGS84 0 0x1.4p3 0x1.68p5 +SYN mod/aea/datum_WGS84 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/datum_WGS84 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/datum_WGS84 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/datum_WGS84 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/datum_nad83_lower 0 0x1.4p3 0x1.68p5 +SYN mod/aea/datum_nad83_lower 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/datum_nad83_lower 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/datum_nad83_lower 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/datum_nad83_lower 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/datum_potsdam 0 0x1.4p3 0x1.68p5 +SYN mod/aea/datum_potsdam 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/datum_potsdam 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/datum_potsdam 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/datum_potsdam 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/e 0 0x1.4p3 0x1.68p5 +SYN mod/aea/e 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/e 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/e 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/e 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/ellps_clrk66 0 0x1.4p3 0x1.68p5 +SYN mod/aea/ellps_clrk66 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/ellps_clrk66 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/ellps_clrk66 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/ellps_clrk66 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/es 0 0x1.4p3 0x1.68p5 +SYN mod/aea/es 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/es 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/es 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/es 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/f 0 0x1.4p3 0x1.68p5 +SYN mod/aea/f 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/f 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/f 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/f 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/gamma 0 0x1.4p3 0x1.68p5 +SYN mod/aea/gamma 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/gamma 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/gamma 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/gamma 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/h 0 0x1.4p3 0x1.68p5 +SYN mod/aea/h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/k 0 0x1.4p3 0x1.68p5 +SYN mod/aea/k 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/k 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/k 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/k 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/k_0 0 0x1.4p3 0x1.68p5 +SYN mod/aea/k_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/k_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/k_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/k_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/lat_ts 0 0x1.4p3 0x1.68p5 +SYN mod/aea/lat_ts 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/lat_ts 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/lat_ts 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/lat_ts 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/lonc 0 0x1.4p3 0x1.68p5 +SYN mod/aea/lonc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/lonc 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/lonc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/lonc 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/nadgrids_conus 0 0x1.4p3 0x1.68p5 +SYN mod/aea/nadgrids_conus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/nadgrids_conus 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/nadgrids_conus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/nadgrids_conus 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/nadgrids_null 0 0x1.4p3 0x1.68p5 +SYN mod/aea/nadgrids_null 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/nadgrids_null 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/nadgrids_null 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/nadgrids_null 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/no_uoff 0 0x1.4p3 0x1.68p5 +SYN mod/aea/no_uoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/no_uoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/no_uoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/no_uoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/pm_numeric 0 0x1.4p3 0x1.68p5 +SYN mod/aea/pm_numeric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/pm_numeric 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/pm_numeric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/pm_numeric 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/pm_paris 0 0x1.4p3 0x1.68p5 +SYN mod/aea/pm_paris 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/pm_paris 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/pm_paris 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/pm_paris 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/rf 0 0x1.4p3 0x1.68p5 +SYN mod/aea/rf 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/rf 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/rf 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/rf 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/south 0 0x1.4p3 0x1.68p5 +SYN mod/aea/south 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/south 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/south 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/south 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/to_meter 0 0x1.4p3 0x1.68p5 +SYN mod/aea/to_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/to_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/to_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/to_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/towgs84_3 0 0x1.4p3 0x1.68p5 +SYN mod/aea/towgs84_3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/towgs84_3 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/towgs84_3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/towgs84_3 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/towgs84_7 0 0x1.4p3 0x1.68p5 +SYN mod/aea/towgs84_7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/towgs84_7 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/towgs84_7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/towgs84_7 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/towgs84_zero 0 0x1.4p3 0x1.68p5 +SYN mod/aea/towgs84_zero 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/towgs84_zero 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/towgs84_zero 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/towgs84_zero 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/units_km 0 0x1.4p3 0x1.68p5 +SYN mod/aea/units_km 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/units_km 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/units_km 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/units_km 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/units_us_ft 0 0x1.4p3 0x1.68p5 +SYN mod/aea/units_us_ft 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/units_us_ft 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/units_us_ft 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/units_us_ft 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/unknown_keyword 0 0x1.4p3 0x1.68p5 +SYN mod/aea/unknown_keyword 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/unknown_keyword 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/unknown_keyword 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/unknown_keyword 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/vto_meter 0 0x1.4p3 0x1.68p5 +SYN mod/aea/vto_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/vto_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/vto_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/vto_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/vunits_m 0 0x1.4p3 0x1.68p5 +SYN mod/aea/vunits_m 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/vunits_m 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/vunits_m 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/vunits_m 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/x_0_y_0 0 0x1.4p3 0x1.68p5 +SYN mod/aea/x_0_y_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/x_0_y_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/x_0_y_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/x_0_y_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/aea/zone 0 0x1.4p3 0x1.68p5 +SYN mod/aea/zone 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/aea/zone 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/aea/zone 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/aea/zone 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_A 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_A 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_A 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_A 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_A 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_C 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_C 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_C 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_C 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_C 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_V 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_V 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_V 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_V 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_V 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_a 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_g 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_h 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_lat_a 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_lat_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_lat_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_lat_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_lat_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/R_lat_g 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/R_lat_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/R_lat_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/R_lat_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/R_lat_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/a 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/alpha 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/alpha 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/alpha 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/alpha 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/alpha 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/axis_neu 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/axis_neu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/axis_neu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/axis_neu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/axis_neu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/axis_wsu 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/axis_wsu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/axis_wsu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/axis_wsu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/axis_wsu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/b 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/b 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/b 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/b 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/b 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/datum_NAD27 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/datum_NAD27 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/datum_NAD27 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/datum_NAD27 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/datum_NAD27 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/datum_NAD83 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/datum_NAD83 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/datum_NAD83 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/datum_NAD83 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/datum_NAD83 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/datum_WGS84 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/datum_WGS84 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/datum_WGS84 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/datum_WGS84 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/datum_WGS84 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/datum_nad83_lower 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/datum_nad83_lower 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/datum_nad83_lower 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/datum_nad83_lower 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/datum_nad83_lower 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/datum_potsdam 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/datum_potsdam 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/datum_potsdam 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/datum_potsdam 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/datum_potsdam 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/e 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/e 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/e 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/e 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/e 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/ellps_clrk66 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/ellps_clrk66 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/ellps_clrk66 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/ellps_clrk66 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/ellps_clrk66 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/es 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/es 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/es 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/es 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/es 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/f 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/f 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/f 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/f 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/f 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/gamma 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/gamma 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/gamma 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/gamma 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/gamma 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/h 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/k 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/k 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/k 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/k 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/k 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/k_0 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/k_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/k_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/k_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/k_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/lat_ts 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/lat_ts 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/lat_ts 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/lat_ts 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/lat_ts 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/lonc 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/lonc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/lonc 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/lonc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/lonc 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/nadgrids_conus 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/nadgrids_conus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/nadgrids_conus 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/nadgrids_conus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/nadgrids_conus 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/nadgrids_null 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/nadgrids_null 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/nadgrids_null 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/nadgrids_null 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/nadgrids_null 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/no_uoff 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/no_uoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/no_uoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/no_uoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/no_uoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/pm_numeric 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/pm_numeric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/pm_numeric 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/pm_numeric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/pm_numeric 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/pm_paris 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/pm_paris 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/pm_paris 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/pm_paris 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/pm_paris 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/rf 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/rf 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/rf 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/rf 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/rf 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/south 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/south 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/south 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/south 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/south 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/to_meter 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/to_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/to_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/to_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/to_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/towgs84_3 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/towgs84_3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/towgs84_3 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/towgs84_3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/towgs84_3 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/towgs84_7 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/towgs84_7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/towgs84_7 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/towgs84_7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/towgs84_7 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/towgs84_zero 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/towgs84_zero 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/towgs84_zero 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/towgs84_zero 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/towgs84_zero 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/units_km 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/units_km 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/units_km 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/units_km 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/units_km 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/units_us_ft 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/units_us_ft 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/units_us_ft 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/units_us_ft 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/units_us_ft 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/unknown_keyword 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/unknown_keyword 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/unknown_keyword 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/unknown_keyword 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/unknown_keyword 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/vto_meter 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/vto_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/vto_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/vto_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/vto_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/vunits_m 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/vunits_m 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/vunits_m 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/vunits_m 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/vunits_m 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/x_0_y_0 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/x_0_y_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/x_0_y_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/x_0_y_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/x_0_y_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/lcc/zone 0 0x1.4p3 0x1.68p5 +SYN mod/lcc/zone 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/lcc/zone 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/lcc/zone 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/lcc/zone 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_A 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_A 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_A 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_A 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_A 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_C 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_C 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_C 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_C 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_C 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_V 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_V 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_V 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_V 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_V 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_a 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_g 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_h 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_lat_a 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_lat_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_lat_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_lat_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_lat_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/R_lat_g 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/R_lat_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/R_lat_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/R_lat_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/R_lat_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/a 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/alpha 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/alpha 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/alpha 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/alpha 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/alpha 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/axis_neu 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/axis_neu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/axis_neu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/axis_neu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/axis_neu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/axis_wsu 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/axis_wsu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/axis_wsu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/axis_wsu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/axis_wsu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/b 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/b 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/b 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/b 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/b 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/datum_NAD27 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/datum_NAD27 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/datum_NAD27 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/datum_NAD27 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/datum_NAD27 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/datum_NAD83 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/datum_NAD83 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/datum_NAD83 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/datum_NAD83 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/datum_NAD83 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/datum_WGS84 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/datum_WGS84 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/datum_WGS84 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/datum_WGS84 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/datum_WGS84 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/datum_nad83_lower 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/datum_nad83_lower 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/datum_nad83_lower 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/datum_nad83_lower 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/datum_nad83_lower 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/datum_potsdam 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/datum_potsdam 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/datum_potsdam 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/datum_potsdam 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/datum_potsdam 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/e 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/e 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/e 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/e 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/e 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/ellps_clrk66 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/ellps_clrk66 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/ellps_clrk66 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/ellps_clrk66 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/ellps_clrk66 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/es 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/es 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/es 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/es 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/es 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/f 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/f 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/f 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/f 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/f 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/gamma 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/gamma 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/gamma 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/gamma 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/gamma 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/h 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/k 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/k 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/k 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/k 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/k 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/k_0 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/k_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/k_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/k_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/k_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/lat_ts 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/lat_ts 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/lat_ts 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/lat_ts 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/lat_ts 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/lonc 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/lonc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/lonc 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/lonc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/lonc 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/nadgrids_conus 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/nadgrids_conus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/nadgrids_conus 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/nadgrids_conus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/nadgrids_conus 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/nadgrids_null 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/nadgrids_null 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/nadgrids_null 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/nadgrids_null 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/nadgrids_null 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/no_uoff 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/no_uoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/no_uoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/no_uoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/no_uoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/pm_numeric 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/pm_numeric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/pm_numeric 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/pm_numeric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/pm_numeric 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/pm_paris 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/pm_paris 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/pm_paris 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/pm_paris 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/pm_paris 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/rf 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/rf 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/rf 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/rf 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/rf 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/south 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/south 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/south 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/south 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/south 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/to_meter 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/to_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/to_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/to_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/to_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/towgs84_3 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/towgs84_3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/towgs84_3 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/towgs84_3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/towgs84_3 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/towgs84_7 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/towgs84_7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/towgs84_7 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/towgs84_7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/towgs84_7 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/towgs84_zero 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/towgs84_zero 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/towgs84_zero 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/towgs84_zero 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/towgs84_zero 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/units_km 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/units_km 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/units_km 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/units_km 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/units_km 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/units_us_ft 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/units_us_ft 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/units_us_ft 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/units_us_ft 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/units_us_ft 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/unknown_keyword 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/unknown_keyword 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/unknown_keyword 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/unknown_keyword 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/unknown_keyword 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/vto_meter 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/vto_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/vto_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/vto_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/vto_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/vunits_m 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/vunits_m 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/vunits_m 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/vunits_m 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/vunits_m 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/x_0_y_0 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/x_0_y_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/x_0_y_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/x_0_y_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/x_0_y_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/longlat/zone 0 0x1.4p3 0x1.68p5 +SYN mod/longlat/zone 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/longlat/zone 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/longlat/zone 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/longlat/zone 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_A 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_A 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_A 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_A 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_A 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_C 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_C 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_C 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_C 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_C 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_V 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_V 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_V 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_V 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_V 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_a 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_g 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_h 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_lat_a 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_lat_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_lat_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_lat_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_lat_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/R_lat_g 0 0x1.4p3 0x1.68p5 +SYN mod/merc/R_lat_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/R_lat_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/R_lat_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/R_lat_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/a 0 0x1.4p3 0x1.68p5 +SYN mod/merc/a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/alpha 0 0x1.4p3 0x1.68p5 +SYN mod/merc/alpha 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/alpha 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/alpha 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/alpha 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/axis_neu 0 0x1.4p3 0x1.68p5 +SYN mod/merc/axis_neu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/axis_neu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/axis_neu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/axis_neu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/axis_wsu 0 0x1.4p3 0x1.68p5 +SYN mod/merc/axis_wsu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/axis_wsu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/axis_wsu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/axis_wsu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/b 0 0x1.4p3 0x1.68p5 +SYN mod/merc/b 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/b 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/b 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/b 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/datum_NAD27 0 0x1.4p3 0x1.68p5 +SYN mod/merc/datum_NAD27 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/datum_NAD27 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/datum_NAD27 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/datum_NAD27 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/datum_NAD83 0 0x1.4p3 0x1.68p5 +SYN mod/merc/datum_NAD83 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/datum_NAD83 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/datum_NAD83 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/datum_NAD83 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/datum_WGS84 0 0x1.4p3 0x1.68p5 +SYN mod/merc/datum_WGS84 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/datum_WGS84 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/datum_WGS84 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/datum_WGS84 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/datum_nad83_lower 0 0x1.4p3 0x1.68p5 +SYN mod/merc/datum_nad83_lower 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/datum_nad83_lower 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/datum_nad83_lower 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/datum_nad83_lower 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/datum_potsdam 0 0x1.4p3 0x1.68p5 +SYN mod/merc/datum_potsdam 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/datum_potsdam 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/datum_potsdam 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/datum_potsdam 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/e 0 0x1.4p3 0x1.68p5 +SYN mod/merc/e 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/e 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/e 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/e 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/ellps_clrk66 0 0x1.4p3 0x1.68p5 +SYN mod/merc/ellps_clrk66 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/ellps_clrk66 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/ellps_clrk66 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/ellps_clrk66 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/es 0 0x1.4p3 0x1.68p5 +SYN mod/merc/es 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/es 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/es 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/es 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/f 0 0x1.4p3 0x1.68p5 +SYN mod/merc/f 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/f 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/f 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/f 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/gamma 0 0x1.4p3 0x1.68p5 +SYN mod/merc/gamma 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/gamma 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/gamma 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/gamma 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/h 0 0x1.4p3 0x1.68p5 +SYN mod/merc/h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/k 0 0x1.4p3 0x1.68p5 +SYN mod/merc/k 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/k 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/k 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/k 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/k_0 0 0x1.4p3 0x1.68p5 +SYN mod/merc/k_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/k_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/k_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/k_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/lat_ts 0 0x1.4p3 0x1.68p5 +SYN mod/merc/lat_ts 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/lat_ts 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/lat_ts 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/lat_ts 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/lonc 0 0x1.4p3 0x1.68p5 +SYN mod/merc/lonc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/lonc 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/lonc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/lonc 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/nadgrids_conus 0 0x1.4p3 0x1.68p5 +SYN mod/merc/nadgrids_conus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/nadgrids_conus 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/nadgrids_conus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/nadgrids_conus 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/nadgrids_null 0 0x1.4p3 0x1.68p5 +SYN mod/merc/nadgrids_null 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/nadgrids_null 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/nadgrids_null 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/nadgrids_null 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/no_uoff 0 0x1.4p3 0x1.68p5 +SYN mod/merc/no_uoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/no_uoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/no_uoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/no_uoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/pm_numeric 0 0x1.4p3 0x1.68p5 +SYN mod/merc/pm_numeric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/pm_numeric 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/pm_numeric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/pm_numeric 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/pm_paris 0 0x1.4p3 0x1.68p5 +SYN mod/merc/pm_paris 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/pm_paris 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/pm_paris 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/pm_paris 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/rf 0 0x1.4p3 0x1.68p5 +SYN mod/merc/rf 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/rf 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/rf 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/rf 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/south 0 0x1.4p3 0x1.68p5 +SYN mod/merc/south 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/south 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/south 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/south 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/to_meter 0 0x1.4p3 0x1.68p5 +SYN mod/merc/to_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/to_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/to_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/to_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/towgs84_3 0 0x1.4p3 0x1.68p5 +SYN mod/merc/towgs84_3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/towgs84_3 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/towgs84_3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/towgs84_3 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/towgs84_7 0 0x1.4p3 0x1.68p5 +SYN mod/merc/towgs84_7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/towgs84_7 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/towgs84_7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/towgs84_7 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/towgs84_zero 0 0x1.4p3 0x1.68p5 +SYN mod/merc/towgs84_zero 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/towgs84_zero 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/towgs84_zero 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/towgs84_zero 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/units_km 0 0x1.4p3 0x1.68p5 +SYN mod/merc/units_km 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/units_km 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/units_km 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/units_km 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/units_us_ft 0 0x1.4p3 0x1.68p5 +SYN mod/merc/units_us_ft 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/units_us_ft 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/units_us_ft 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/units_us_ft 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/unknown_keyword 0 0x1.4p3 0x1.68p5 +SYN mod/merc/unknown_keyword 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/unknown_keyword 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/unknown_keyword 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/unknown_keyword 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/vto_meter 0 0x1.4p3 0x1.68p5 +SYN mod/merc/vto_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/vto_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/vto_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/vto_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/vunits_m 0 0x1.4p3 0x1.68p5 +SYN mod/merc/vunits_m 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/vunits_m 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/vunits_m 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/vunits_m 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/x_0_y_0 0 0x1.4p3 0x1.68p5 +SYN mod/merc/x_0_y_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/x_0_y_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/x_0_y_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/x_0_y_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/merc/zone 0 0x1.4p3 0x1.68p5 +SYN mod/merc/zone 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/merc/zone 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/merc/zone 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/merc/zone 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_A 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_A 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_A 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_A 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_A 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_C 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_C 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_C 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_C 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_C 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_V 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_V 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_V 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_V 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_V 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_a 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_g 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_h 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_lat_a 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_lat_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_lat_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_lat_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_lat_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/R_lat_g 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/R_lat_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/R_lat_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/R_lat_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/R_lat_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/a 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/alpha 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/alpha 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/alpha 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/alpha 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/alpha 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/axis_neu 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/axis_neu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/axis_neu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/axis_neu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/axis_neu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/axis_wsu 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/axis_wsu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/axis_wsu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/axis_wsu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/axis_wsu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/b 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/b 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/b 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/b 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/b 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/datum_NAD27 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/datum_NAD27 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/datum_NAD27 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/datum_NAD27 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/datum_NAD27 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/datum_NAD83 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/datum_NAD83 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/datum_NAD83 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/datum_NAD83 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/datum_NAD83 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/datum_WGS84 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/datum_WGS84 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/datum_WGS84 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/datum_WGS84 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/datum_WGS84 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/datum_nad83_lower 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/datum_nad83_lower 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/datum_nad83_lower 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/datum_nad83_lower 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/datum_nad83_lower 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/datum_potsdam 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/datum_potsdam 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/datum_potsdam 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/datum_potsdam 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/datum_potsdam 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/e 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/e 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/e 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/e 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/e 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/ellps_clrk66 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/ellps_clrk66 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/ellps_clrk66 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/ellps_clrk66 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/ellps_clrk66 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/es 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/es 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/es 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/es 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/es 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/f 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/f 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/f 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/f 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/f 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/gamma 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/gamma 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/gamma 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/gamma 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/gamma 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/h 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/k 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/k 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/k 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/k 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/k 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/k_0 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/k_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/k_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/k_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/k_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/lat_ts 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/lat_ts 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/lat_ts 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/lat_ts 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/lat_ts 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/lonc 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/lonc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/lonc 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/lonc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/lonc 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/nadgrids_conus 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/nadgrids_conus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/nadgrids_conus 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/nadgrids_conus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/nadgrids_conus 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/nadgrids_null 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/nadgrids_null 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/nadgrids_null 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/nadgrids_null 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/nadgrids_null 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/no_uoff 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/no_uoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/no_uoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/no_uoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/no_uoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/pm_numeric 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/pm_numeric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/pm_numeric 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/pm_numeric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/pm_numeric 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/pm_paris 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/pm_paris 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/pm_paris 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/pm_paris 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/pm_paris 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/rf 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/rf 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/rf 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/rf 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/rf 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/south 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/south 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/south 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/south 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/south 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/to_meter 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/to_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/to_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/to_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/to_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/towgs84_3 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/towgs84_3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/towgs84_3 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/towgs84_3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/towgs84_3 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/towgs84_7 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/towgs84_7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/towgs84_7 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/towgs84_7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/towgs84_7 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/towgs84_zero 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/towgs84_zero 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/towgs84_zero 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/towgs84_zero 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/towgs84_zero 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/units_km 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/units_km 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/units_km 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/units_km 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/units_km 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/units_us_ft 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/units_us_ft 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/units_us_ft 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/units_us_ft 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/units_us_ft 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/unknown_keyword 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/unknown_keyword 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/unknown_keyword 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/unknown_keyword 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/unknown_keyword 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/vto_meter 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/vto_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/vto_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/vto_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/vto_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/vunits_m 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/vunits_m 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/vunits_m 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/vunits_m 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/vunits_m 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/x_0_y_0 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/x_0_y_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/x_0_y_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/x_0_y_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/x_0_y_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/tmerc/zone 0 0x1.4p3 0x1.68p5 +SYN mod/tmerc/zone 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/tmerc/zone 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/tmerc/zone 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/tmerc/zone 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_A 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_A 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_A 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_A 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_A 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_C 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_C 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_C 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_C 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_C 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_V 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_V 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_V 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_V 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_V 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_a 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_g 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_h 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_lat_a 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_lat_a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_lat_a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_lat_a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_lat_a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/R_lat_g 0 0x1.4p3 0x1.68p5 +SYN mod/utm/R_lat_g 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/R_lat_g 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/R_lat_g 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/R_lat_g 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/a 0 0x1.4p3 0x1.68p5 +SYN mod/utm/a 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/a 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/a 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/a 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/alpha 0 0x1.4p3 0x1.68p5 +SYN mod/utm/alpha 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/alpha 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/alpha 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/alpha 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/axis_neu 0 0x1.4p3 0x1.68p5 +SYN mod/utm/axis_neu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/axis_neu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/axis_neu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/axis_neu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/axis_wsu 0 0x1.4p3 0x1.68p5 +SYN mod/utm/axis_wsu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/axis_wsu 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/axis_wsu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/axis_wsu 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/b 0 0x1.4p3 0x1.68p5 +SYN mod/utm/b 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/b 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/b 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/b 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/datum_NAD27 0 0x1.4p3 0x1.68p5 +SYN mod/utm/datum_NAD27 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/datum_NAD27 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/datum_NAD27 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/datum_NAD27 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/datum_NAD83 0 0x1.4p3 0x1.68p5 +SYN mod/utm/datum_NAD83 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/datum_NAD83 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/datum_NAD83 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/datum_NAD83 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/datum_WGS84 0 0x1.4p3 0x1.68p5 +SYN mod/utm/datum_WGS84 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/datum_WGS84 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/datum_WGS84 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/datum_WGS84 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/datum_nad83_lower 0 0x1.4p3 0x1.68p5 +SYN mod/utm/datum_nad83_lower 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/datum_nad83_lower 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/datum_nad83_lower 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/datum_nad83_lower 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/datum_potsdam 0 0x1.4p3 0x1.68p5 +SYN mod/utm/datum_potsdam 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/datum_potsdam 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/datum_potsdam 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/datum_potsdam 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/e 0 0x1.4p3 0x1.68p5 +SYN mod/utm/e 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/e 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/e 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/e 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/ellps_clrk66 0 0x1.4p3 0x1.68p5 +SYN mod/utm/ellps_clrk66 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/ellps_clrk66 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/ellps_clrk66 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/ellps_clrk66 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/es 0 0x1.4p3 0x1.68p5 +SYN mod/utm/es 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/es 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/es 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/es 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/f 0 0x1.4p3 0x1.68p5 +SYN mod/utm/f 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/f 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/f 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/f 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/gamma 0 0x1.4p3 0x1.68p5 +SYN mod/utm/gamma 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/gamma 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/gamma 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/gamma 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/h 0 0x1.4p3 0x1.68p5 +SYN mod/utm/h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/h 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/h 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/k 0 0x1.4p3 0x1.68p5 +SYN mod/utm/k 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/k 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/k 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/k 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/k_0 0 0x1.4p3 0x1.68p5 +SYN mod/utm/k_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/k_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/k_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/k_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/lat_ts 0 0x1.4p3 0x1.68p5 +SYN mod/utm/lat_ts 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/lat_ts 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/lat_ts 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/lat_ts 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/lonc 0 0x1.4p3 0x1.68p5 +SYN mod/utm/lonc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/lonc 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/lonc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/lonc 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/nadgrids_conus 0 0x1.4p3 0x1.68p5 +SYN mod/utm/nadgrids_conus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/nadgrids_conus 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/nadgrids_conus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/nadgrids_conus 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/nadgrids_null 0 0x1.4p3 0x1.68p5 +SYN mod/utm/nadgrids_null 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/nadgrids_null 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/nadgrids_null 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/nadgrids_null 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/no_uoff 0 0x1.4p3 0x1.68p5 +SYN mod/utm/no_uoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/no_uoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/no_uoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/no_uoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/pm_numeric 0 0x1.4p3 0x1.68p5 +SYN mod/utm/pm_numeric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/pm_numeric 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/pm_numeric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/pm_numeric 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/pm_paris 0 0x1.4p3 0x1.68p5 +SYN mod/utm/pm_paris 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/pm_paris 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/pm_paris 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/pm_paris 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/rf 0 0x1.4p3 0x1.68p5 +SYN mod/utm/rf 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/rf 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/rf 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/rf 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/south 0 0x1.4p3 0x1.68p5 +SYN mod/utm/south 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/south 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/south 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/south 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/to_meter 0 0x1.4p3 0x1.68p5 +SYN mod/utm/to_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/to_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/to_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/to_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/towgs84_3 0 0x1.4p3 0x1.68p5 +SYN mod/utm/towgs84_3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/towgs84_3 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/towgs84_3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/towgs84_3 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/towgs84_7 0 0x1.4p3 0x1.68p5 +SYN mod/utm/towgs84_7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/towgs84_7 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/towgs84_7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/towgs84_7 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/towgs84_zero 0 0x1.4p3 0x1.68p5 +SYN mod/utm/towgs84_zero 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/towgs84_zero 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/towgs84_zero 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/towgs84_zero 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/units_km 0 0x1.4p3 0x1.68p5 +SYN mod/utm/units_km 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/units_km 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/units_km 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/units_km 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/units_us_ft 0 0x1.4p3 0x1.68p5 +SYN mod/utm/units_us_ft 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/units_us_ft 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/units_us_ft 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/units_us_ft 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/unknown_keyword 0 0x1.4p3 0x1.68p5 +SYN mod/utm/unknown_keyword 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/unknown_keyword 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/unknown_keyword 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/unknown_keyword 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/vto_meter 0 0x1.4p3 0x1.68p5 +SYN mod/utm/vto_meter 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/vto_meter 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/vto_meter 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/vto_meter 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/vunits_m 0 0x1.4p3 0x1.68p5 +SYN mod/utm/vunits_m 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/vunits_m 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/vunits_m 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/vunits_m 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/x_0_y_0 0 0x1.4p3 0x1.68p5 +SYN mod/utm/x_0_y_0 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/x_0_y_0 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/x_0_y_0 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/x_0_y_0 4 0x1.f36948017480fp4 0x1.ep5 +SYN mod/utm/zone 0 0x1.4p3 0x1.68p5 +SYN mod/utm/zone 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN mod/utm/zone 2 0x1.f36948017480fp4 0x1.ep4 +SYN mod/utm/zone 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN mod/utm/zone 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/adams_hemi 0 0x1.4p3 0x1.68p5 +SYN proj/adams_hemi 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/adams_hemi 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/adams_hemi 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/adams_hemi 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/adams_ws1 0 0x1.4p3 0x1.68p5 +SYN proj/adams_ws1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/adams_ws1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/adams_ws1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/adams_ws1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/adams_ws2 0 0x1.4p3 0x1.68p5 +SYN proj/adams_ws2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/adams_ws2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/adams_ws2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/adams_ws2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/aea 0 0x1.4p3 0x1.68p5 +SYN proj/aea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/aea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/aea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/aea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/aeqd 0 0x1.4p3 0x1.68p5 +SYN proj/aeqd 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/aeqd 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/aeqd 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/aeqd 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/affine 0 0x1.4p3 0x1.68p5 +SYN proj/affine 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/affine 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/affine 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/affine 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/airocean 0 0x1.4p3 0x1.68p5 +SYN proj/airocean 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/airocean 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/airocean 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/airocean 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/airy 0 0x1.4p3 0x1.68p5 +SYN proj/airy 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/airy 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/airy 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/airy 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/aitoff 0 0x1.4p3 0x1.68p5 +SYN proj/aitoff 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/aitoff 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/aitoff 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/aitoff 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/alsk 0 0x1.4p3 0x1.68p5 +SYN proj/alsk 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/alsk 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/alsk 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/alsk 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/apian 0 0x1.4p3 0x1.68p5 +SYN proj/apian 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/apian 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/apian 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/apian 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/august 0 0x1.4p3 0x1.68p5 +SYN proj/august 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/august 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/august 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/august 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/axisswap 0 0x1.4p3 0x1.68p5 +SYN proj/axisswap 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/axisswap 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/axisswap 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/axisswap 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/bacon 0 0x1.4p3 0x1.68p5 +SYN proj/bacon 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/bacon 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/bacon 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/bacon 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/bertin1953 0 0x1.4p3 0x1.68p5 +SYN proj/bertin1953 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/bertin1953 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/bertin1953 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/bertin1953 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/bipc 0 0x1.4p3 0x1.68p5 +SYN proj/bipc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/bipc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/bipc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/bipc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/boggs 0 0x1.4p3 0x1.68p5 +SYN proj/boggs 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/boggs 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/boggs 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/boggs 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/bonne 0 0x1.4p3 0x1.68p5 +SYN proj/bonne 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/bonne 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/bonne 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/bonne 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/calcofi 0 0x1.4p3 0x1.68p5 +SYN proj/calcofi 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/calcofi 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/calcofi 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/calcofi 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/cart 0 0x1.4p3 0x1.68p5 +SYN proj/cart 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/cart 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/cart 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/cart 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/cass 0 0x1.4p3 0x1.68p5 +SYN proj/cass 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/cass 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/cass 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/cass 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/cc 0 0x1.4p3 0x1.68p5 +SYN proj/cc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/cc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/cc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/cc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/ccon 0 0x1.4p3 0x1.68p5 +SYN proj/ccon 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/ccon 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/ccon 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/ccon 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/cea 0 0x1.4p3 0x1.68p5 +SYN proj/cea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/cea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/cea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/cea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/chamb 0 0x1.4p3 0x1.68p5 +SYN proj/chamb 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/chamb 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/chamb 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/chamb 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/col_urban 0 0x1.4p3 0x1.68p5 +SYN proj/col_urban 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/col_urban 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/col_urban 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/col_urban 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/collg 0 0x1.4p3 0x1.68p5 +SYN proj/collg 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/collg 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/collg 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/collg 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/comill 0 0x1.4p3 0x1.68p5 +SYN proj/comill 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/comill 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/comill 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/comill 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/crast 0 0x1.4p3 0x1.68p5 +SYN proj/crast 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/crast 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/crast 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/crast 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/defmodel 0 0x1.4p3 0x1.68p5 +SYN proj/defmodel 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/defmodel 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/defmodel 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/defmodel 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/deformation 0 0x1.4p3 0x1.68p5 +SYN proj/deformation 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/deformation 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/deformation 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/deformation 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/denoy 0 0x1.4p3 0x1.68p5 +SYN proj/denoy 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/denoy 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/denoy 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/denoy 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eck1 0 0x1.4p3 0x1.68p5 +SYN proj/eck1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eck1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eck1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eck1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eck2 0 0x1.4p3 0x1.68p5 +SYN proj/eck2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eck2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eck2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eck2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eck3 0 0x1.4p3 0x1.68p5 +SYN proj/eck3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eck3 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eck3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eck3 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eck4 0 0x1.4p3 0x1.68p5 +SYN proj/eck4 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eck4 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eck4 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eck4 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eck5 0 0x1.4p3 0x1.68p5 +SYN proj/eck5 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eck5 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eck5 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eck5 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eck6 0 0x1.4p3 0x1.68p5 +SYN proj/eck6 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eck6 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eck6 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eck6 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eqc 0 0x1.4p3 0x1.68p5 +SYN proj/eqc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eqc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eqc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eqc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eqdc 0 0x1.4p3 0x1.68p5 +SYN proj/eqdc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eqdc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eqdc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eqdc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/eqearth 0 0x1.4p3 0x1.68p5 +SYN proj/eqearth 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/eqearth 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/eqearth 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/eqearth 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/etmerc 0 0x1.4p3 0x1.68p5 +SYN proj/etmerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/etmerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/etmerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/etmerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/euler 0 0x1.4p3 0x1.68p5 +SYN proj/euler 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/euler 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/euler 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/euler 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/fahey 0 0x1.4p3 0x1.68p5 +SYN proj/fahey 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/fahey 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/fahey 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/fahey 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/fouc 0 0x1.4p3 0x1.68p5 +SYN proj/fouc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/fouc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/fouc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/fouc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/fouc_s 0 0x1.4p3 0x1.68p5 +SYN proj/fouc_s 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/fouc_s 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/fouc_s 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/fouc_s 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gall 0 0x1.4p3 0x1.68p5 +SYN proj/gall 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gall 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gall 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gall 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/geoc 0 0x1.4p3 0x1.68p5 +SYN proj/geoc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/geoc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/geoc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/geoc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/geocent 0 0x1.4p3 0x1.68p5 +SYN proj/geocent 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/geocent 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/geocent 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/geocent 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/geogoffset 0 0x1.4p3 0x1.68p5 +SYN proj/geogoffset 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/geogoffset 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/geogoffset 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/geogoffset 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/geos 0 0x1.4p3 0x1.68p5 +SYN proj/geos 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/geos 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/geos 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/geos 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gins8 0 0x1.4p3 0x1.68p5 +SYN proj/gins8 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gins8 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gins8 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gins8 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gn_sinu 0 0x1.4p3 0x1.68p5 +SYN proj/gn_sinu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gn_sinu 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gn_sinu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gn_sinu 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gnom 0 0x1.4p3 0x1.68p5 +SYN proj/gnom 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gnom 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gnom 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gnom 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/goode 0 0x1.4p3 0x1.68p5 +SYN proj/goode 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/goode 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/goode 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/goode 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gridshift 0 0x1.4p3 0x1.68p5 +SYN proj/gridshift 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gridshift 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gridshift 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gridshift 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gs48 0 0x1.4p3 0x1.68p5 +SYN proj/gs48 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gs48 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gs48 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gs48 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gs50 0 0x1.4p3 0x1.68p5 +SYN proj/gs50 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gs50 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gs50 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gs50 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/gstmerc 0 0x1.4p3 0x1.68p5 +SYN proj/gstmerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/gstmerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/gstmerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/gstmerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/guyou 0 0x1.4p3 0x1.68p5 +SYN proj/guyou 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/guyou 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/guyou 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/guyou 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/hammer 0 0x1.4p3 0x1.68p5 +SYN proj/hammer 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/hammer 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/hammer 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/hammer 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/hatano 0 0x1.4p3 0x1.68p5 +SYN proj/hatano 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/hatano 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/hatano 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/hatano 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/healpix 0 0x1.4p3 0x1.68p5 +SYN proj/healpix 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/healpix 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/healpix 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/healpix 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/helmert 0 0x1.4p3 0x1.68p5 +SYN proj/helmert 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/helmert 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/helmert 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/helmert 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/hgridshift 0 0x1.4p3 0x1.68p5 +SYN proj/hgridshift 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/hgridshift 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/hgridshift 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/hgridshift 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/horner 0 0x1.4p3 0x1.68p5 +SYN proj/horner 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/horner 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/horner 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/horner 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/id 0 0x1.4p3 0x1.68p5 +SYN proj/id 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/id 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/id 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/id 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/igh 0 0x1.4p3 0x1.68p5 +SYN proj/igh 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/igh 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/igh 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/igh 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/igh_o 0 0x1.4p3 0x1.68p5 +SYN proj/igh_o 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/igh_o 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/igh_o 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/igh_o 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/imoll 0 0x1.4p3 0x1.68p5 +SYN proj/imoll 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/imoll 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/imoll 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/imoll 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/imoll_o 0 0x1.4p3 0x1.68p5 +SYN proj/imoll_o 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/imoll_o 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/imoll_o 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/imoll_o 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/imw_p 0 0x1.4p3 0x1.68p5 +SYN proj/imw_p 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/imw_p 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/imw_p 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/imw_p 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/isea 0 0x1.4p3 0x1.68p5 +SYN proj/isea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/isea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/isea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/isea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/kav5 0 0x1.4p3 0x1.68p5 +SYN proj/kav5 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/kav5 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/kav5 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/kav5 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/kav7 0 0x1.4p3 0x1.68p5 +SYN proj/kav7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/kav7 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/kav7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/kav7 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/krovak 0 0x1.4p3 0x1.68p5 +SYN proj/krovak 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/krovak 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/krovak 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/krovak 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/labrd 0 0x1.4p3 0x1.68p5 +SYN proj/labrd 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/labrd 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/labrd 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/labrd 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/laea 0 0x1.4p3 0x1.68p5 +SYN proj/laea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/laea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/laea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/laea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lagrng 0 0x1.4p3 0x1.68p5 +SYN proj/lagrng 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lagrng 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lagrng 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lagrng 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/larr 0 0x1.4p3 0x1.68p5 +SYN proj/larr 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/larr 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/larr 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/larr 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lask 0 0x1.4p3 0x1.68p5 +SYN proj/lask 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lask 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lask 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lask 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/latlon 0 0x1.4p3 0x1.68p5 +SYN proj/latlon 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/latlon 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/latlon 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/latlon 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/latlong 0 0x1.4p3 0x1.68p5 +SYN proj/latlong 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/latlong 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/latlong 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/latlong 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lcc 0 0x1.4p3 0x1.68p5 +SYN proj/lcc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lcc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lcc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lcc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lcca 0 0x1.4p3 0x1.68p5 +SYN proj/lcca 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lcca 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lcca 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lcca 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/leac 0 0x1.4p3 0x1.68p5 +SYN proj/leac 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/leac 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/leac 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/leac 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lee_os 0 0x1.4p3 0x1.68p5 +SYN proj/lee_os 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lee_os 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lee_os 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lee_os 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/longlat 0 0x1.4p3 0x1.68p5 +SYN proj/longlat 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/longlat 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/longlat 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/longlat 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lonlat 0 0x1.4p3 0x1.68p5 +SYN proj/lonlat 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lonlat 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lonlat 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lonlat 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/loxim 0 0x1.4p3 0x1.68p5 +SYN proj/loxim 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/loxim 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/loxim 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/loxim 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/lsat 0 0x1.4p3 0x1.68p5 +SYN proj/lsat 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/lsat 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/lsat 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/lsat 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mbt_fps 0 0x1.4p3 0x1.68p5 +SYN proj/mbt_fps 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mbt_fps 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mbt_fps 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mbt_fps 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mbt_s 0 0x1.4p3 0x1.68p5 +SYN proj/mbt_s 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mbt_s 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mbt_s 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mbt_s 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mbtfpp 0 0x1.4p3 0x1.68p5 +SYN proj/mbtfpp 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mbtfpp 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mbtfpp 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mbtfpp 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mbtfpq 0 0x1.4p3 0x1.68p5 +SYN proj/mbtfpq 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mbtfpq 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mbtfpq 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mbtfpq 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mbtfps 0 0x1.4p3 0x1.68p5 +SYN proj/mbtfps 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mbtfps 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mbtfps 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mbtfps 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/merc 0 0x1.4p3 0x1.68p5 +SYN proj/merc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/merc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/merc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/merc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mil_os 0 0x1.4p3 0x1.68p5 +SYN proj/mil_os 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mil_os 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mil_os 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mil_os 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mill 0 0x1.4p3 0x1.68p5 +SYN proj/mill 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mill 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mill 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mill 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/misrsom 0 0x1.4p3 0x1.68p5 +SYN proj/misrsom 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/misrsom 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/misrsom 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/misrsom 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/mod_krovak 0 0x1.4p3 0x1.68p5 +SYN proj/mod_krovak 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/mod_krovak 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/mod_krovak 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/mod_krovak 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/moll 0 0x1.4p3 0x1.68p5 +SYN proj/moll 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/moll 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/moll 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/moll 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/molobadekas 0 0x1.4p3 0x1.68p5 +SYN proj/molobadekas 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/molobadekas 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/molobadekas 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/molobadekas 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/molodensky 0 0x1.4p3 0x1.68p5 +SYN proj/molodensky 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/molodensky 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/molodensky 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/molodensky 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/murd1 0 0x1.4p3 0x1.68p5 +SYN proj/murd1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/murd1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/murd1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/murd1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/murd2 0 0x1.4p3 0x1.68p5 +SYN proj/murd2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/murd2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/murd2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/murd2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/murd3 0 0x1.4p3 0x1.68p5 +SYN proj/murd3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/murd3 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/murd3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/murd3 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/name 0 0x1.4p3 0x1.68p5 +SYN proj/name 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/name 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/name 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/name 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/natearth 0 0x1.4p3 0x1.68p5 +SYN proj/natearth 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/natearth 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/natearth 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/natearth 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/natearth2 0 0x1.4p3 0x1.68p5 +SYN proj/natearth2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/natearth2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/natearth2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/natearth2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/nell 0 0x1.4p3 0x1.68p5 +SYN proj/nell 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/nell 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/nell 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/nell 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/nell_h 0 0x1.4p3 0x1.68p5 +SYN proj/nell_h 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/nell_h 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/nell_h 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/nell_h 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/nicol 0 0x1.4p3 0x1.68p5 +SYN proj/nicol 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/nicol 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/nicol 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/nicol 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/noop 0 0x1.4p3 0x1.68p5 +SYN proj/noop 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/noop 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/noop 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/noop 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/nsper 0 0x1.4p3 0x1.68p5 +SYN proj/nsper 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/nsper 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/nsper 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/nsper 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/nzmg 0 0x1.4p3 0x1.68p5 +SYN proj/nzmg 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/nzmg 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/nzmg 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/nzmg 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/ob_tran 0 0x1.4p3 0x1.68p5 +SYN proj/ob_tran 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/ob_tran 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/ob_tran 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/ob_tran 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/ocea 0 0x1.4p3 0x1.68p5 +SYN proj/ocea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/ocea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/ocea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/ocea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/oea 0 0x1.4p3 0x1.68p5 +SYN proj/oea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/oea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/oea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/oea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/omerc 0 0x1.4p3 0x1.68p5 +SYN proj/omerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/omerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/omerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/omerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/ortel 0 0x1.4p3 0x1.68p5 +SYN proj/ortel 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/ortel 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/ortel 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/ortel 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/ortho 0 0x1.4p3 0x1.68p5 +SYN proj/ortho 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/ortho 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/ortho 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/ortho 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/patterson 0 0x1.4p3 0x1.68p5 +SYN proj/patterson 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/patterson 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/patterson 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/patterson 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/pconic 0 0x1.4p3 0x1.68p5 +SYN proj/pconic 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/pconic 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/pconic 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/pconic 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/peirce_q 0 0x1.4p3 0x1.68p5 +SYN proj/peirce_q 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/peirce_q 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/peirce_q 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/peirce_q 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/pipeline 0 0x1.4p3 0x1.68p5 +SYN proj/pipeline 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/pipeline 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/pipeline 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/pipeline 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/poly 0 0x1.4p3 0x1.68p5 +SYN proj/poly 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/poly 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/poly 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/poly 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/pop 0 0x1.4p3 0x1.68p5 +SYN proj/pop 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/pop 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/pop 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/pop 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/push 0 0x1.4p3 0x1.68p5 +SYN proj/push 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/push 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/push 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/push 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp1 0 0x1.4p3 0x1.68p5 +SYN proj/putp1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp2 0 0x1.4p3 0x1.68p5 +SYN proj/putp2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp3 0 0x1.4p3 0x1.68p5 +SYN proj/putp3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp3 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp3 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp3p 0 0x1.4p3 0x1.68p5 +SYN proj/putp3p 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp3p 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp3p 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp3p 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp4p 0 0x1.4p3 0x1.68p5 +SYN proj/putp4p 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp4p 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp4p 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp4p 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp5 0 0x1.4p3 0x1.68p5 +SYN proj/putp5 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp5 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp5 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp5 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp5p 0 0x1.4p3 0x1.68p5 +SYN proj/putp5p 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp5p 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp5p 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp5p 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp6 0 0x1.4p3 0x1.68p5 +SYN proj/putp6 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp6 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp6 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp6 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/putp6p 0 0x1.4p3 0x1.68p5 +SYN proj/putp6p 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/putp6p 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/putp6p 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/putp6p 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/qsc 0 0x1.4p3 0x1.68p5 +SYN proj/qsc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/qsc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/qsc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/qsc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/qua_aut 0 0x1.4p3 0x1.68p5 +SYN proj/qua_aut 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/qua_aut 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/qua_aut 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/qua_aut 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/rhealpix 0 0x1.4p3 0x1.68p5 +SYN proj/rhealpix 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/rhealpix 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/rhealpix 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/rhealpix 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/robin 0 0x1.4p3 0x1.68p5 +SYN proj/robin 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/robin 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/robin 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/robin 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/rouss 0 0x1.4p3 0x1.68p5 +SYN proj/rouss 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/rouss 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/rouss 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/rouss 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/rpoly 0 0x1.4p3 0x1.68p5 +SYN proj/rpoly 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/rpoly 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/rpoly 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/rpoly 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/s2 0 0x1.4p3 0x1.68p5 +SYN proj/s2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/s2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/s2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/s2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/sch 0 0x1.4p3 0x1.68p5 +SYN proj/sch 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/sch 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/sch 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/sch 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/set 0 0x1.4p3 0x1.68p5 +SYN proj/set 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/set 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/set 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/set 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/sinu 0 0x1.4p3 0x1.68p5 +SYN proj/sinu 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/sinu 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/sinu 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/sinu 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/som 0 0x1.4p3 0x1.68p5 +SYN proj/som 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/som 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/som 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/som 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/somerc 0 0x1.4p3 0x1.68p5 +SYN proj/somerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/somerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/somerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/somerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/spilhaus 0 0x1.4p3 0x1.68p5 +SYN proj/spilhaus 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/spilhaus 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/spilhaus 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/spilhaus 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/stere 0 0x1.4p3 0x1.68p5 +SYN proj/stere 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/stere 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/stere 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/stere 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/sterea 0 0x1.4p3 0x1.68p5 +SYN proj/sterea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/sterea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/sterea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/sterea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tcc 0 0x1.4p3 0x1.68p5 +SYN proj/tcc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tcc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tcc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tcc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tcea 0 0x1.4p3 0x1.68p5 +SYN proj/tcea 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tcea 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tcea 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tcea 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/times 0 0x1.4p3 0x1.68p5 +SYN proj/times 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/times 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/times 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/times 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tinshift 0 0x1.4p3 0x1.68p5 +SYN proj/tinshift 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tinshift 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tinshift 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tinshift 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tissot 0 0x1.4p3 0x1.68p5 +SYN proj/tissot 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tissot 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tissot 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tissot 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tmerc 0 0x1.4p3 0x1.68p5 +SYN proj/tmerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tmerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tmerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tmerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tobmerc 0 0x1.4p3 0x1.68p5 +SYN proj/tobmerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tobmerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tobmerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tobmerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/topocentric 0 0x1.4p3 0x1.68p5 +SYN proj/topocentric 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/topocentric 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/topocentric 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/topocentric 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tpeqd 0 0x1.4p3 0x1.68p5 +SYN proj/tpeqd 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tpeqd 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tpeqd 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tpeqd 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/tpers 0 0x1.4p3 0x1.68p5 +SYN proj/tpers 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/tpers 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/tpers 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/tpers 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/unitconvert 0 0x1.4p3 0x1.68p5 +SYN proj/unitconvert 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/unitconvert 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/unitconvert 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/unitconvert 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/ups 0 0x1.4p3 0x1.68p5 +SYN proj/ups 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/ups 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/ups 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/ups 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/urm5 0 0x1.4p3 0x1.68p5 +SYN proj/urm5 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/urm5 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/urm5 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/urm5 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/urmfps 0 0x1.4p3 0x1.68p5 +SYN proj/urmfps 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/urmfps 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/urmfps 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/urmfps 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/utm 0 0x1.4p3 0x1.68p5 +SYN proj/utm 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/utm 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/utm 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/utm 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vandg 0 0x1.4p3 0x1.68p5 +SYN proj/vandg 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vandg 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vandg 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vandg 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vandg2 0 0x1.4p3 0x1.68p5 +SYN proj/vandg2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vandg2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vandg2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vandg2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vandg3 0 0x1.4p3 0x1.68p5 +SYN proj/vandg3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vandg3 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vandg3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vandg3 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vandg4 0 0x1.4p3 0x1.68p5 +SYN proj/vandg4 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vandg4 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vandg4 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vandg4 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vertoffset 0 0x1.4p3 0x1.68p5 +SYN proj/vertoffset 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vertoffset 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vertoffset 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vertoffset 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vgridshift 0 0x1.4p3 0x1.68p5 +SYN proj/vgridshift 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vgridshift 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vgridshift 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vgridshift 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/vitk1 0 0x1.4p3 0x1.68p5 +SYN proj/vitk1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/vitk1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/vitk1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/vitk1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag1 0 0x1.4p3 0x1.68p5 +SYN proj/wag1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag2 0 0x1.4p3 0x1.68p5 +SYN proj/wag2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag3 0 0x1.4p3 0x1.68p5 +SYN proj/wag3 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag3 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag3 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag3 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag4 0 0x1.4p3 0x1.68p5 +SYN proj/wag4 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag4 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag4 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag4 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag5 0 0x1.4p3 0x1.68p5 +SYN proj/wag5 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag5 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag5 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag5 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag6 0 0x1.4p3 0x1.68p5 +SYN proj/wag6 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag6 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag6 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag6 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wag7 0 0x1.4p3 0x1.68p5 +SYN proj/wag7 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wag7 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wag7 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wag7 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/webmerc 0 0x1.4p3 0x1.68p5 +SYN proj/webmerc 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/webmerc 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/webmerc 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/webmerc 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/weren 0 0x1.4p3 0x1.68p5 +SYN proj/weren 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/weren 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/weren 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/weren 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wink1 0 0x1.4p3 0x1.68p5 +SYN proj/wink1 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wink1 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wink1 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wink1 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wink2 0 0x1.4p3 0x1.68p5 +SYN proj/wink2 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wink2 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wink2 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wink2 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/wintri 0 0x1.4p3 0x1.68p5 +SYN proj/wintri 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/wintri 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/wintri 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/wintri 4 0x1.f36948017480fp4 0x1.ep5 +SYN proj/xyzgridshift 0 0x1.4p3 0x1.68p5 +SYN proj/xyzgridshift 1 -0x1.66d29002e901ep3 0x1.ep4 +SYN proj/xyzgridshift 2 0x1.f36948017480fp4 0x1.ep4 +SYN proj/xyzgridshift 3 -0x1.66d29002e901ep3 0x1.ep5 +SYN proj/xyzgridshift 4 0x1.f36948017480fp4 0x1.ep5 diff --git a/golden/rules.yaml b/golden/rules.yaml new file mode 100644 index 0000000..d51a6c8 --- /dev/null +++ b/golden/rules.yaml @@ -0,0 +1,2407 @@ +# Golden-master change declarations. +# +# Every row of the golden table that differs from the pinned 1.4.3 baseline must be claimed by exactly +# one rule here, or the build fails. Rules are evaluated in FILE ORDER and the first one that both +# matches and expects a row wins, so order them most-specific first. +# +# THE POLICY THAT OVERRIDES EVERYTHING IN THIS FILE: gie wins. This suite has no opinion about whether +# a change is correct -- only about whether it was declared. A rule here is never evidence that an +# output is right, and a rule must never be written to make a gie failure go away. See golden/README.md, +# "Policy". +# +# Schema, and the four things that keep a rule from becoming a rubber stamp, are documented in +# golden/src/test/java/org/locationtech/proj4j/golden/GoldenRules.java. In brief: +# * expected_rows is EXACT and TWO-SIDED. Fewer rows than declared fails too. +# * status: active -> must match >= 1 row, else DEAD_RULE +# status: pending -> must match EXACTLY 0 rows; matching one fails with PENDING_RULE_FIRED +# * expires is mandatory. Past it, the build fails until the rule is folded into a new baseline. +# * a failing `expect` clause makes the rule DECLINE the row; it does not claim it. +# +# UNITS WARNING. `magnitude` is |current - baseline| in the RAW UNITS OF THE COLUMN, and those units +# differ by row: fx/fy/fz are in the target CRS's units (metres for a projected target, degrees for a +# geographic one) and ix/iy/iz are always WGS84 degrees, because the inverse column is the round trip +# back to the lon/lat hub. There is deliberately NO unit normalisation here. Normalising would mean +# choosing a metric branch per row, which is exactly the decision that inflated a downstream team's +# entire worklist by ~111,319x. Choose the band with the section's units in mind and say which you +# meant in `reason`. + +version: 1 + +rules: + + # --------------------------------------------------------------------------------------------- + # ORDERED FIRST, DELIBERATELY. See the note at the end of this rule's `reason`: placed anywhere + # after FAILCLOSED-UNCHECKED-ISE-REPLACED it hands that rule 34 of these rows, which would record + # "1.4.3 threw an unchecked IllegalStateException and we now throw a Proj4jException" for a change + # that is actually a grid-coverage refusal. That is the laundering PARSE-NO-KEYWORD-ALLOWLIST + # committed against PARSE-R-DECLARES-SPHERE, and this file exists partly to prevent it. + - id: FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED + status: active + expires: 2027-06-30 + # PINNED. Measured 2026-08-01 on a frozen /tmp A/B whose two trees differed in exactly the 14 + # files this stream touched, of which Grid.java is the only one in core/src/main. The predicate + # was measured on the frozen report BEFORE the rule was written, not pasted from the gate's own + # count afterwards. + # RE-PINNED 2026-08-01 by the GRIDS-EPSG-SHIP-CONUS stream: proj4j-epsg now ships PROJ + # 9.8.1's `conus` at proj4/nad/conus, so the golden run resolves that grid for the first + # time (golden depends on proj4j-epsg and, unlike core's own tests and the conformance + # module, has no other copy on its classpath). Measured on a frozen /tmp A/B whose two + # trees differ in exactly one byte-bearing file, the grid itself. 1,104 rows that had no grid to be outside OF now find one and are shifted instead; they move to + # DATUM-NAD27-NADCON-SHIFT-APPLIED below. + expected_rows: 891 + reason: | + datum/Grid.java's `shift` no longer returns the input coordinate when no grid in a non-empty + list can supply a value for it. It raises + CrsTransformException(ErrorCause.COORDINATE_OUTSIDE_GRID), which is the signal that method's + own comment already named and never sent. + + THE DEFECT. The `else` branch was empty. The coordinate came back bit-identical to the input, + which is indistinguishable from "the shift was zero", and the transform reported success. That + is non-negotiable 3 -- a failure expressed as a plausible coordinate -- at 30 m to 110 m. + + UPSTREAM, MEASURED, not inferred from the source. PROJ 9.8.1 (Rel. 9.8.1, April 10th, 2026) + reading the same ntv1_can.dat bytes proj4j-epsg ships, with PROJ_DATA pointed at a directory + holding only those files: + + echo "1 -1" | cs2cs -f "%.10f" +proj=longlat +datum=WGS84 \ + +to +proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat + * * inf + + That is the exact +datum=NAD27 grid list, with EVERY grid present, refusing a point outside all + of them. proj4j answered `1, -1`. In source terms it is pj_hgrid_apply (grids.cpp:3517-3520): + findGrid returns nullptr and PROJ_ERR_COORD_TRANSFM_OUTSIDE_GRID is set. The second shape -- + a grid contains the point but the interpolation cannot produce a value -- lands on the same + errno at :3534-3536. + + WHY EVERY ROW IS NAD27, AND WHY THE PREDICATE IS `datums` RATHER THAN A STATUS GLOB. All 1,995 + rows report the grid list `[ntv1_can.dat]`: proj4j-epsg ships exactly one of NAD27's four + @-optional grids, so outside 40N-84N / 142W-44W there is no coverage at all. `+datum=potsdam` + is the negative control and it did NOT move -- 17 proj4-epsg.csv rows reference a + datum=potsdam def, BETA2007.gsb is absent, its grid list therefore resolves EMPTY, and an + empty list is a no-op. "The grid file is not there" stays silent; only "outside a grid that + loaded" errors. Those are different questions and only the first is legitimately silent, which + is also why PROJ's @-optional wart is untouched by this change. + + Scoping by `status_to` alone would have swept in 105 rows belonging to + FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY (65) and FAILCLOSED-NO-INVERSE-FOR-NEW-FORWARD-ONLY + (40), which raise the same exception type for an entirely different reason. `datums: [NAD27]` + separates them completely: measured on the frozen tree, exactly 1,995 changed rows carry both + predicates and exactly 105 carry the status without the datum. + + THE ROW SET, measured: REG 1,673 / CSV 148 / PAIR 144 / SYN 30. Baseline side: 1,949 OK, 34 + java.lang.IllegalStateException, 8 UnsupportedParameterException, 2 InvalidValueException, + 2 NumberFormatException. 202 of them were bit-identical to 1.4.3 before this change -- that + is, 1.4.3 and the current tree fail-opened in exactly the same way, which is why the golden + regime could not see them until now. + + WHERE THESE ROWS CAME FROM, so the drop in five other rules' counts is accounted for rather + than merely noticed. 1,614 of them were claimed by another rule before this change and no + longer are, because a row that throws has no numeric movement left to attribute: + PROJ-TMERC-PODER-ENGSAGER-DEFAULT 14,724 -> 14,038 (-686), NUM-KARNEY-LATITUDE-CORE + 20,191 -> 19,336 (-855), DATUM-ISEQUAL-SELF-COMPARISON 332 -> 284 (-48), + PARSE-VUNITS-ACCEPTED 964 -> 956 (-8), PROJ-POLYCONIC-KERNEL-CORRECTED 51 -> 43 (-8), + PROJ-AEA-SPHERICAL-INVERSE 164 -> 159 (-5), PROJ-POLYCONIC-INVERSE-CONVERGES 6 -> 4 (-2), + PARSE-DMS-PARAMETER-VALUE 10 -> 8 (-2). The four pinned ones are re-pinned in place with the + same note. The remaining 381 were already UNEXPLAINED. + + FAILCLOSED-UNCHECKED-ISE-REPLACED is the one that moves the other way and it is why this rule + is ordered first: it would GROW from 55 to 71 by absorbing rows of this mechanism behind a + reason that says nothing about grids. With this rule ahead of it, it gives up all 34 of its + NAD27 grid rows and lands at 37. It is TBD-pinned, so that movement would otherwise have been + silent. + + THE DELIBERATE DIVERGENCE IS KEPT. Grid.shift still falls through to the NEXT grid when the + grid it selected refuses to interpolate, where PROJ commits to findGrid's choice. That was a + recorded conscious decision and reversing it is a separate behavioural change with its own row + set; it is not smuggled in here. It is also orthogonal: the fall-through can only ever return a + value that some grid the caller listed produced for this point, whereas the `else` branch + invented one. Keeping it makes this change as small as it can be. Pinned by + grids/OutsideGridFailsClosedTest#interpolationFailureStillFallsThroughToTheNextGrid. + + NOT A CORRECTNESS CLAIM, per this file's policy. At the CRS level with proj.db present, + cs2cs +to +proj=longlat +datum=NAD27 at (1, -1) returns the point unchanged, because PROJ's + operation factory sees the coordinate is outside NADCON's area of use and selects "Ballpark + geographic offset" (verified with PROJ_DEBUG=2) -- a DECLARED no-op, not a silent one. + proj4j's legacy +datum= path has no such factory; it is the operator path, and the operator + path errors. Reproducing the ballpark selection belongs to db/ and the strict API, and until + it exists this change is a behavioural break for any caller currently receiving a silent + no-op. + match: + datums: [NAD27] + status_to: "EXC:org.locationtech.proj4j.CrsTransformException" + expect: + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-GEOCENT-LON0-APPLIED + status: active + expires: 2027-06-30 + # PINNED, and pinnable because this change is complete and its row set is a committed input: + # `proj/geocent` is one SYN key and SYN carries 5 probes. Measured 2026-08-01 from a frozen + # A/B in which GeocentProjection.java was the ONLY file that differed between the two trees. + expected_rows: 5 + reason: | + proj/GeocentProjection.java overrode projectRadians(src, dst) and inverseProjectRadians(src, + dst) without the +lon_0 handling that Projection's own implementations of those two methods + perform for every other projection, so a `+proj=geocent +lon_0=10` definition produced the + same (X, Y, Z) as `+lon_0=0`. + + Upstream applies it. 9.8.1:src/conversions/geocent.cpp:56-57 declares + `P->left = PJ_IO_UNITS_RADIANS` and `P->right = PJ_IO_UNITS_CARTESIAN`, so the generic + wrappers run: fwd_prepare's angular branch ends with + `lam = (lam - from_greenwich) - lam0` followed by adjlon (fwd.cpp:105-112), and + inv_finalize's PJ_IO_UNITS_RADIANS branch adds lam0 back and adjlons again + (inv.cpp:110-118). proj4j's own pipeline engine already ports exactly that -- see + pipeline/Cs2csOperator.java:449-462 and :510-518, where the lam0 term is applied for every + kernel EXCEPT Kernel.PROJECTION, precisely because for a projection it is + Projection.projectRadians that does it. GeocentProjection is the one place where neither + side did. + + Both sides of the new code are guarded on `projectionLongitude != 0`, exactly as + Projection.projectRadians and Projection.inverseProjectRadians guard theirs, so a definition + without +lon_0 is bit-for-bit unchanged -- `x + 0.0` is not the identity on -0.0. That + guard is why this rule claims 5 rows and not 1,058: the 181 epsg `+proj=geocent` defs, the + 148 CSV cases that reference them and the one `mod/` sweep row all carry no +lon_0 and + returned to the baseline value exactly (1,045 of them UNCHANGED; 8 more moved by 1e-9 m in + the height ordinate from OTHER streams' datum-stage drift and are claimed by + NUM-KARNEY-LATITUDE-CORE, which is correct attribution -- those 8 rows were previously + unobservable because the whole row was an exception). + + The magnitude band is the physics of the change, not an observation: rotating a point at + Earth radius by 10 degrees of longitude moves it by at most + 2 * 6.378e6 * sin(5 deg) = 1.11e6 m, so the ceiling is 2e6 metres. The observed spread over + the five probes is 4.98e5 .. 9.23e5 m in fx/fy. Anything outside that band is not a + longitude rotation and this rule must not explain it. Units: fx/fy/fz are metres here (a + cartesian target); ix/iy are the always-degrees inverse columns and move only by round-trip + residue. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/geocent"] + tgt_proj: [geocent] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-12, max: 2.0e6} + + # --------------------------------------------------------------------------------------------- + - id: PARSE-VUNITS-ACCEPTED + status: active + expires: 2027-06-30 + # MEASURED, not estimated: 964 rows, from a diff of baseline/1.4.3 against the working tree on + # 2026-07-31. It decomposes as 790 REG (= 158 registry defs carrying +vunits, x 5 probes) + # + 144 CSV rows (whose source or target def carries +vunits) + 30 SYN (the mod//vunits_m + # sweep, 6 hosts x 5 probes). + # + # NOTE FOR THE RECORD: the plan and the task brief both quote a smaller number -- "943 rows: + # 158 registry defs x 5 probes + 143 CSV rows" (which is 933, not 943) and "expected_rows: 944". + # Neither matches, for two reasons that are properties of THIS input set rather than errors in + # theirs: the CSV side is 144 rows here, not 143, and neither figure includes the synthetic + # +vunits modifier sweep, which did not exist when those numbers were written. 964 is what the + # suite measures; if a future run disagrees, that is a COUNT_MISMATCH to investigate, not a + # number to relax. + # RE-PINNED 2026-08-01 by the FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED stream, which is + # ordered first in this file. 8 of this rule's rows are +datum=NAD27 CRS whose transform + # now raises COORDINATE_OUTSIDE_GRID instead of returning a coordinate, so they have no + # numeric movement left for this rule to describe and that rule claims them. The mechanism + # this rule states is unchanged and is still true of the 956 that remain; only the + # population it applies to shrank. Verified on a frozen A/B, and the arithmetic is + # itemised in that rule's reason. + # RE-PINNED 2026-08-01 by the GRIDS-EPSG-SHIP-CONUS stream: proj4j-epsg now ships PROJ + # 9.8.1's `conus` at proj4/nad/conus, so the golden run resolves that grid for the first + # time (golden depends on proj4j-epsg and, unlike core's own tests and the conformance + # module, has no other copy on its classpath). Measured on a frozen /tmp A/B whose two + # trees differ in exactly one byte-bearing file, the grid itself. +6, the same mechanism: rows whose transform now completes have movement to attribute. + expected_rows: 962 + reason: | + Proj4Keyword has no `vunits`, so Proj4Parser rejected the ENTIRE definition of any CRS carrying + it with UnsupportedParameterException -- 158 registry defs, all of them unreachable. PROJ has no + parameter allow-list at all (src/init.cpp retains every token in a paralist and recognition is + pull-based via pj_param), and test/gie/builtins.gie relies on that: it feeds a literal + `unknown_keyword` token and expects it to be ignored. Accepting +vunits is a step toward + ParseMode.PROJ_COMPATIBLE. Every one of these rows moves from "exception" to "a coordinate", + which is why the rule allows a status change and non-finite baseline values: the baseline row is + all-NaN by construction. + match: + classifications: [CHANGED] + params_present: [vunits] + status_from: "EXC:org.locationtech.proj4j.UnsupportedParameterException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PARSE-NO-KEYWORD-ALLOWLIST + status: active + expires: 2027-06-30 + # PINNED at 100 on 2026-08-01 (late triage) = 18 SYN keys x 5 probes + world:malay x 5 + + # world:madagascar x 5. It was TBD at 95 while the parser stream was landing; that stream + # has landed (Proj4Keyword and ParseMode.PROJ_COMPATIBLE are unchanged across two frozen + # snapshots taken hours apart) and this count is now a tripwire on it: every further token + # that stops being rejected adds 5 or 10 rows here and the gate will say so. + expected_rows: 100 + reason: | + The generalisation of PARSE-VUNITS-ACCEPTED, which is above and claims the +vunits subset + first. parser/Proj4Parser.java:79 now consults Proj4Keyword's allow-list only in + ParseMode.STRICT, and :62 makes ParseMode.PROJ_COMPATIBLE the default, so an unrecognised + token no longer rejects the whole definition. + + That is upstream's behaviour and not a relaxation: PROJ has no parameter allow-list at all. + 9.8.1:src/init.cpp retains every token in a paralist and recognition is pull-based through + pj_param, and test/gie/builtins.gie depends on it -- it feeds a literal `unknown_keyword` + token and asserts the coordinate is unaffected. The synthetic matrix probes that same token + on purpose (`mod//unknown_keyword`), which is why this rule's row set is dominated by + three modifiers rather than by real CRS: `e`, `vto_meter` and `unknown_keyword`, each over + the 6 hosts aea/lcc/longlat/merc/tmerc/utm. The one registry def is world:malay, whose + baseline message is `rot_conv parameter is not supported`. + + Every claimed row moves from "the definition was rejected" to "a coordinate", so the + baseline side is all-NaN by construction and the rule cannot hide a numeric regression; + that is also why it allows a status change, an inside change and non-finite endpoints, with + no magnitude band (there is no meaningful band against NaN). + + WHY THIS RULE IS SCOPED BY KEY AND NOT BY status_from ALONE. It was first written as just + `status_from: UnsupportedParameterException, status_to: OK`, and the gate caught it + immediately: it claimed 270 rows instead of 95 and PARSE-R-DECLARES-SPHERE dropped from 250 + to 75. The 175 rows it had taken were `mod//R*`, where 1.4.3 rejected `+R_A` and its + siblings as unsupported parameters, so the row moves from an exception to a coordinate AND + that coordinate is the one the +R sphere-declaration fix changed. A rule shaped like that + would have absorbed the entire +R numeric change behind a parse-acceptance reason, which is + precisely the laundering this file's expect clauses and ordering rules exist to prevent. + Naming the three tokens instead makes the rule say what it means, and makes a fourth + accepted token show up as UNEXPLAINED rather than be swallowed. + + world:madagascar, ADDED 2026-08-01 (late triage), AND WHY IT WAS RIGHT TO REFUSE IT + BEFORE. This rule previously said, in this paragraph: "world:madagascar (5 rows), whose + +rot_conv is now accepted but which then fails with `Unknown projection: labrd` -- an + UnsupportedParameterException became an InvalidValueException. It is still broken, for a + different reason, and calling that 'intended' would launder an unimplemented projection + into a declared change." That was correct at the time and is now spent: labrd is + implemented (see PROJ-NEW-PROJECTIONS-REGISTERED, whose 44-name list now carries it), so + the row set is `EXC:UnsupportedParameterException: crs-tgt: azi parameter is not + supported` -> `OK`, which is precisely this rule's predicate. The definition is + `proj=labrd lat_0=-18d54 lon_0=46d26'13.95" azi=18d54 k_0=0.9995 x_0=400000 y_0=800000`; + `azi` is a real 9.8.1 parameter (`src/projections/labrd.cpp` reads `+azi`) that + Proj4Keyword did not list, which is the same defect as `+vunits`. + + Note that TWO changes had to land for these five rows to move, and this rule only speaks + for one of them -- it says the definition is no longer rejected at parse time. It makes no + claim about the Laborde coordinates now produced; that is gie's question and + PROJ-NEW-PROJECTIONS-REGISTERED's paragraph on the same point applies verbatim. The same + split already exists in this file for world:malay, whose +rf dependency is noted under + PARSE-RF-IN-WORLD-DICTIONARY. + + ONE ROW SET IT STILL DOES NOT CLAIM: + * SYN proj/alsk, proj/apian, proj/bacon (15 rows), which moved the other way, + InvalidValueException -> UnsupportedParameterException. They belong to whoever owns + the parse-error taxonomy. (proj/alsk has since been claimed by + PROJ-NEW-PROJECTIONS-REGISTERED and proj/apian and proj/bacon by + FAILCLOSED-NO-INVERSE-FOR-NEW-FORWARD-ONLY, each on its own mechanism -- which is what + leaving them here rather than absorbing them made possible.) + match: + classifications: [CHANGED] + keys: ["mod/*/e", "mod/*/unknown_keyword", "mod/*/vto_meter", "world:malay", + "world:madagascar"] + status_from: "EXC:org.locationtech.proj4j.UnsupportedParameterException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PARSE-DMS-PARAMETER-VALUE + status: active + expires: 2027-06-30 + # PINNED at 8, measured 2026-08-01 on a frozen /tmp snapshot (rsync of the working tree, so no + # other stream could move under the run). Two independent sources agree, which is why 8 is + # trusted: the gate's own `rows claimed per rule`, and FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED's + # separately written arithmetic, which predicts "PARSE-DMS-PARAMETER-VALUE 10 -> 8 (-2)". + # + # 8 AND NOT THE STRUCTURAL 10, and the two missing rows are attribution rather than theft. + # nad27:5001 probes 1 and 3 now end at EXC:CrsTransformException -- the DMS fix let them parse, + # and the transform then found them outside every NAD27 grid. This rule's `status_to: "OK"` + # excludes that outcome deliberately, so reordering the rules would NOT bring them here; the + # predicate declines them whatever the order. Verified on the frozen report: nad83:5001 x5 plus + # nad27:5001 probes 0, 2, 4. + expected_rows: 8 + reason: | + 1.4.3 read angular parameter values with Double.parseDouble and let the resulting + java.lang.NumberFormatException escape -- NOT a Proj4jException, so it went through every + `catch (Proj4jException)` in the library and in every caller. Two registry defs trip it: + nad27:5001 and nad83:5001 (Alaska zone 1, +proj=omerc) carry + `alpha=-36d52'11.6315`, DMS with the seconds mark omitted. The baseline message is the raw + `For input string: "-36d52'11.6315"`. + + parser/Proj4Parser.java:574-587 now routes angular values through Angle.parse plus PROJ's + r/R radian suffix and wraps any NumberFormatException in an InvalidValueException, which is + both what upstream accepts (dmstor, 9.8.1:src/dmstor.cpp, is applied to every angular + parameter) and what the error taxonomy requires. These two defs consequently parse and + transform for the first time. + + Scoped by key rather than by status_from alone: `EXC:java.lang.NumberFormatException` is a + status that could in principle appear from a completely unrelated raw parse escape, and this + rule should not be the thing that explains the next one. Baseline is all-NaN by + construction, hence the status/inside/non-finite allowances and no magnitude band. + match: + classifications: [CHANGED] + sections: [REG] + keys: ["nad27:5001", "nad83:5001"] + status_from: "EXC:java.lang.NumberFormatException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: FAILCLOSED-NO-SUCH-ELEMENT-REPLACED + status: active + expires: 2027-06-30 + # PINNED at 50, and structural rather than incidental: 6 hosts x 5 probes for `h` plus 4 hosts + # x 5 probes for `south`. `mod/tmerc/south` and `mod/utm/south` are absent because + # TransverseMercatorProjection overrides setSouthernHemisphere; if a fifth or sixth host + # acquires the override, or a host loses it, the count moves and the gate says so. Measured + # 2026-08-01 on a frozen tree. + expected_rows: 50 + reason: | + THIS IS THE DEFECT THIS REGIME COULD NOT SEE, NOW MADE VISIBLE. golden/README.md's + "non-Proj4jException escapes" section records these 50 rows as throwing + `java.util.NoSuchElementException` in the baseline AND in the current run, and draws the + correct conclusion: "this regime reports changes, so a defect that predates the baseline is + exactly what it cannot see." Projection.setSouthernHemisphere and + Projection.setHeightOfOrbit threw a bare NoSuchElementException -- not a Proj4jException, + and with no message at all -- for any projection that does not implement them, so `+south` + or `+h` on such a projection escaped every `catch (Proj4jException)` in the library and in + every caller, and it had done so since before 1.4.3. + + The current side is now UnsupportedParameterException, a Proj4jException, with a message + naming the parameter, the projection name and the implementing class: + `+h=3.5785831E7 is not supported by projection aea + (org.locationtech.proj4j.proj.AlbersProjection): it does not ...`. That is what makes the + row change and therefore what makes it appear here for the first time. + + Both endpoints are exception rows, so both sides are all-NaN by construction and there is no + numeric value for this rule to absorb. The `inside` column is `-` on both sides. + + ORDERED BEFORE PROJ-AEA-SPHERICAL-INVERSE ON PURPOSE. That rule matches `mod/aea/*` and + would match `mod/aea/h` and `mod/aea/south` on section and key; today it declines them only + because it does not set allow_status_change. golden/README.md already names relying on + another rule's expect clause to decline as a silent coupling, so this rule claims its 10 aea + rows first and says why, exactly as FAILCLOSED-UNCHECKED-ISE-REPLACED does for the two PAIR + datum rules. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["mod/aea/h", "mod/lcc/h", "mod/longlat/h", "mod/merc/h", "mod/tmerc/h", "mod/utm/h", + "mod/aea/south", "mod/lcc/south", "mod/longlat/south", "mod/merc/south"] + status_from: "EXC:java.util.NoSuchElementException" + status_to: "EXC:org.locationtech.proj4j.UnsupportedParameterException" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-AEA-SPHERICAL-INVERSE + status: active + expires: 2027-06-30 + # PINNED at 159, measured 2026-08-01 on a frozen /tmp snapshot. Corroborated independently by + # FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED's reason, which predicts "PROJ-AEA-SPHERICAL-INVERSE + # 164 -> 159 (-5)": five aea rows now throw on grid coverage and so have no numeric movement + # left for this rule to attribute. golden/README.md's 164 is the pre-grid-rule figure and is + # superseded, not contradicted. + # RE-PINNED 2026-08-01 by the GRIDS-EPSG-SHIP-CONUS stream: proj4j-epsg now ships PROJ + # 9.8.1's `conus` at proj4/nad/conus, so the golden run resolves that grid for the first + # time (golden depends on proj4j-epsg and, unlike core's own tests and the conformance + # module, has no other copy on its classpath). Measured on a frozen /tmp A/B whose two + # trees differ in exactly one byte-bearing file, the grid itself. -5, and they are enumerable: the five `SYN mod/aea/nadgrids_conus` probes, all of which lie in + # Europe or Africa and now report COORDINATE_OUTSIDE_GRID. Claimed by GRIDS-EPSG-CONUS-SYN-REFUSED. + expected_rows: 154 + reason: | + AlbersProjection.java:95-106 computes the authalic quantity into `out.y` as a scratch temporary + and then takes asin(lpphi) where lpphi is still rho/dd -- the RADIUS, not sin(phi). PROJ names + that intermediate qs_div_2 as a local. The :106 sign test is also on lpphi, which is >= 0 by + construction, so the pole fallback can only ever return +90 degrees. For + +proj=aea +R=6400000 +lat_1=0 +lat_2=2, the inverse of (200, 100) m gives latitude + 89.957690088 where PROJ gives 0.000895246 -- an 89.9568 degree error -- and NaN wherever + rho/dd > 1. + + This is ordered BEFORE the +R rule on purpose. The two are one release: the defect is dormant + today only because the +R defect leaves `spherical == false`, so fixing +R alone turns a + 6e-06 degree source-side error into 89.96 degrees. Keeping them as separate rules, with this + one first, means the aea rows are attributed to the projection fix and the remaining +R rows to + the parser fix, instead of one rule silently absorbing both. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["mod/aea/*"] + tgt_proj: [aea] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PARSE-RF-F-TRANSPOSED + status: active + expires: 2027-06-30 + # PINNED at 40, measured 2026-08-01 on a frozen /tmp snapshot, and structural rather than + # data-driven: 4 modifier slugs (mod/*/rf and mod/*/f over the hosts that reach the ellipsoid) + # x 5 probes. It also matches golden/README.md's independent "40 -- the only rows in the suite + # this fix can move". Note the count is over the SYN section only, on purpose: world:palestine's + # 5 REG rows are PARSE-RF-IN-WORLD-DICTIONARY's, and that split is the whole point of having two + # rules. If this number moves, a host gained or lost the parameter, or that split broke. + expected_rows: 40 + reason: | + parser/DatumParameters.java:119-133 has the two ellipsoid-shape setters exactly transposed: + proj4j's setRF(rf) computes es = rf*(2-rf) (treating rf as if it were f) and setF(f) computes + rf = 1/f then es = rf*(2-rf) (treating f as if it were rf), where PROJ's ell_set.cpp + ellps_shape cases 0 and 1 are rf -> f = 1/rf; es = 2f - f^2 and f -> es = 2f - f^2. So proj4j's + +f IS PROJ's +rf, and +rf is unusable: +ellps=GRS80 +rf=300 derives es = 300*(2-300) = -89400, + b = a*sqrt(1-es) ~ 1.9 million km. + + There are two distinct downstream fates in the baseline depending on whether the projection + reads `e` or `es`, and both appear in these rows: reading `e` gives e = sqrt(negative) = NaN so + the northing is NaN and the easting is exactly correct; reading only `es` keeps everything finite + and collapses the latitude inside GeocentricConverter, which for UTM 31 puts the easting exactly + on +x_0 and the northing 500 km out. Hence allow_nonfinite and no magnitude band -- a band would + have to span NaN and 5e5 at once. + + +rf= appears in NO registry dictionary and NO test CSV (zero occurrences, verified by grep), so + these synthetic rows are the ONLY baseline rows this fix can move. That is why the synthetic + parameter matrix exists. + + ^^ THE SENTENCE ABOVE IS HALF WRONG AND IS KEPT FOR THE RECORD. The CSV half holds; the + dictionary half does not. The dictionaries write parameters WITHOUT the leading `+`, so + `grep '+rf='` finds nothing while `grep 'rf='` finds world:palestine and world:malay. See + PARSE-RF-IN-WORLD-DICTIONARY below, which claims world:palestine's 5 rows -- they were + UNEXPLAINED for as long as this rule's `sections: [SYN]` was believed to be exhaustive. The + conclusion that the synthetic matrix is necessary is unaffected: it is what puts +rf in front + of six different host projections, and world:malay is unreachable in 1.4.3 for an unrelated + reason. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["mod/*/rf", "mod/*/f"] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PARSE-R-DECLARES-SPHERE + status: active + expires: 2027-06-30 + # PINNED at 250, measured 2026-08-01 on a frozen /tmp snapshot, and it agrees with + # golden/README.md's independently recorded 250. Structural: 9 `R*` modifier slugs are + # enumerated in `keys` below and, at 5 probes over the hosts that move, they come to 250. + # THE ENUMERATION IS LOAD-BEARING -- do not collapse it to "mod/*/R*". A glob would also swallow + # any future R-prefixed slug and this count would stop meaning anything. + expected_rows: 250 + reason: | + parser/Proj4Parser.java:162-165 routes +R through Projection.setRadius, which sets `a` ONLY -- + es, e and ellipsoid are untouched -- and +R never reaches DatumParameters at all + (Proj4Parser.java:247-250 is the dead handler). So the ELLIPSOIDAL formula runs on a declared + sphere: the easting is exact and the northing is wrong by ~1,495 m at latitude 2 and ~35,000 m + at 55. PROJ's +R short-circuits the entire ellipsoid pipeline (size only, es = f = e = rf = 0, + b = a) and ignores every shape and spherification parameter. + + Magnitude is unbounded because the affected rows span metres to tens of kilometres, and because + the same tokens reach both projected targets (metres) and the longlat host (degrees). See the + units warning at the top of this file. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["mod/*/R", "mod/*/R_A", "mod/*/R_V", "mod/*/R_a", "mod/*/R_g", "mod/*/R_h", + "mod/*/R_C", "mod/*/R_lat_a", "mod/*/R_lat_g"] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PARSE-RF-IN-WORLD-DICTIONARY + status: active + expires: 2027-06-30 + # PINNED at 5 -- world:palestine's five probes -- measured 2026-08-01 on a frozen /tmp + # snapshot, matching the 5 previously observed here. The tmerc kernel is still being rewritten, + # which is what the 1e3 magnitude FLOOR below is for: it makes this rule decline, rather than + # absorb, any sub-kilometre tmerc movement on these rows. The floor is what makes the count safe + # to pin now instead of waiting for that stream; the observed movements are 6.6e23..5.7e205. + expected_rows: 5 + reason: | + CORRECTION TO A LOAD-BEARING CLAIM. PARSE-RF-F-TRANSPOSED above, and golden/README.md's + "The synthetic matrix is not optional" section, both state that `+rf=` appears in NO registry + dictionary and NO test CSV -- "zero occurrences, verified by grep" -- and conclude that the + synthetic rows are "the ONLY baseline rows this fix can move". The CSV half is right. The + dictionary half is wrong, and the reason is instructive: the dictionaries write parameters + WITHOUT the leading `+`, so a grep for `+rf=` finds nothing while a grep for `rf=` finds two: + + epsg/src/main/resources/proj4/nad/world:96 proj=tmerc a=6378300.79 rf=293.488307656 + epsg/src/main/resources/proj4/nad/world:110 proj=omerc a=6377295.66402 rf=300.8017 + + The synthetic matrix is still not optional -- it is what puts `+rf` in front of six different + host projections, and world:malay is unreachable in 1.4.3 for an unrelated reason -- but + PARSE-RF-F-TRANSPOSED is scoped `sections: [SYN]` and therefore left world:palestine's 5 rows + unexplained. This rule claims them. + + 1.4.3's setRF(293.488307656) computed es = rf * (2 - rf) = -85,540, so `e` was NaN. The + damage is on the scale that number implies: probe 0 (the CRS origin, lat_0=31d44'2.749"N + lon_0=35d12'43.490"E) round-tripped to latitude -3.3e205 degrees where the definition's own + origin latitude is 31.734; probes 3 and 4 had eastings and northings around 1.3e24 m. The + current values are ordinary Palestine Grid coordinates. + + world:malay is claimed earlier, by PARSE-NO-KEYWORD-ALLOWLIST, because its 1.4.3 status was + an UnsupportedParameterException on +rot_conv -- so it never got as far as the ellipsoid and + its baseline row is all-NaN. That rule makes no claim about the value it now produces; this + note is here so the +rf dependency is not lost. + + MAGNITUDE FLOOR OF 1e3, AND WHY IT MATTERS. world:palestine is a tmerc, and the transverse + Mercator kernel is being rewritten concurrently. A rule with no floor would silently absorb + any future sub-kilometre tmerc movement on these five rows. The observed movements are + 6.6e23 .. 5.7e205 in the raw column units (metres for fx/fy, degrees for the always-degrees + ix/iy), i.e. 20 orders of magnitude clear of the floor, so the floor costs nothing and buys a + rule that declines -- and re-reports -- anything that is not this defect. + match: + classifications: [CHANGED] + sections: [REG] + keys: ["world:palestine"] + params_present: [rf] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_nonfinite: true + magnitude: {min: 1.0e3, max: 1.0e250} + + # --------------------------------------------------------------------------------------------- + - id: PARSE-FIRST-MATCH-WINS + status: active + expires: 2027-06-30 + # PINNED at 71, measured 2026-08-01 on a frozen /tmp snapshot, matching the 71 previously + # observed. The row set is the four duplicate-key modifier slugs (ellps_clrk66, units_us_ft, + # units_km, x_0_y_0) over the six hosts, LESS the `mod/aea/*` share claimed earlier by + # PROJ-AEA-SPHERICAL-INVERSE -- that cross-rule dependency is by design and is why this number + # is not 4 x 6 x 5. If PROJ-AEA-SPHERICAL-INVERSE is ever reordered after this rule, this count + # rises and that one falls; fix the ORDER, never the predicates. + expected_rows: 71 + reason: | + parser/Proj4Parser.java:560-562 now keeps the FIRST occurrence of a duplicated parameter -- + `if (!params.containsKey(key)) params.put(key, value)`. 1.4.3 put every token into a HashMap + unconditionally and so kept the LAST. PROJ keeps the first: 9.8.1:src/init.cpp appends tokens + to a paralist in order and pj_param's lookup returns the first match, which is why upstream + documents later duplicates as inert. + + The synthetic matrix probes this on purpose. Its canonical parameter set is + `+ellps=GRS80 +lat_0=45 +lon_0=10 +lat_1=30 +lat_2=60 +x_0=0 +y_0=0 +units=m` and the + modifier is APPENDED, so exactly four of the 47 modifiers collide with a canonical key: + ellps_clrk66, units_us_ft, units_km and x_0_y_0. Those four, over the six hosts, are this + rule's entire row set. + + THE MECHANISM IS CONFIRMED BY EXACT ARITHMETIC, not by inspection: + * mod/*/units_km -- fx and fy are current = baseline * 1000 EXACTLY on every row. + * mod/*/units_us_ft -- current = baseline * 0.304800609601219 exactly, which is + 1200/3937, the US survey foot. 1.4.3 emitted feet, having taken the appended + `+units=us-ft`; the current build emits metres, taking the canonical `+units=m`. + * mod/*/x_0_y_0 -- fx moves by exactly -500000 and fy by exactly -1000000 on every + row: the canonical `+x_0=0 +y_0=0` now wins over the appended + `+x_0=500000 +y_0=1000000`. + * mod/*/ellps_clrk66 -- 18 .. 321 m, and the current values equal the corresponding + GRS80 rows of the other modifiers to the last digit, so the ellipsoid in force changed + from clrk66 to the canonical GRS80. + + WHAT THIS RULE DOES NOT VOUCH FOR. On the tmerc and utm hosts a second, much smaller + movement is superimposed: the ratios come out as 999.999999999522 rather than 1000 and the + inverse latitude moves by ~1e-7 degrees. That is the transverse-Mercator kernel rewrite, it + is eight significant digits below the structural change, and it is the same drift + NUM-KARNEY-LATITUDE-CORE claims on rows where nothing structural happened. This rule + explains the unit and offset flip; it says nothing about that residue, and the residue is + small enough that it cannot be what makes a row match. + + Units: fx/fy are the target CRS's units, which for these rows is the whole point -- the + baseline is in feet or kilometres and the current row is in metres. See the units warning at + the top of this file. The floor of 1.0 excludes pure-drift rows so they stay with the + numerical-core rule where they belong. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["mod/*/ellps_clrk66", "mod/*/units_us_ft", "mod/*/units_km", "mod/*/x_0_y_0"] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0, max: 1.0e8} + + # --------------------------------------------------------------------------------------------- + - id: FAILCLOSED-UNCHECKED-ISE-REPLACED + status: active + expires: 2027-06-30 + # PINNED at 37 -- 24 PAIR + 13 CSV -- measured 2026-08-01 on a frozen /tmp snapshot. + # + # THIS IS THE RULE THAT MOST NEEDED PINNING, and its history is the argument for the + # GoldenRulesTest assertion that now forbids `status: active` + `expected_rows: TBD`. While + # unpinned it went 55 -> 71 by absorbing 16 NAD27 out-of-grid rows behind a reason that says + # nothing about grids, and the theft was invisible precisely because there was no count to + # violate. FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED is now ordered first and predicts, in its own + # reason, that this rule "gives up all 34 of its NAD27 grid rows and lands at 37". It does. Two + # independent sources, one number. + # + # 16 of the 24 PAIR rows also satisfy DATUM-TYPE-UNKNOWN-HOISTED's `t0*/*` / `t*0/*` key globs. + # That is not this rule taking them: all 16 are status changes + # (IllegalStateException -> ProjectionException) and that rule does not set + # allow_status_change, so it declines them at any position in the file. Verified on the frozen + # report, not assumed from the ordering. + # + # The stream that owns this is still live, and the direction of any future move is predictable: + # a guard added upstream of GeocentricConverter moves a row between exception buckets without + # changing this total, while a guard that turns a throw back into a coordinate removes one. + # Either way the gate now says so instead of absorbing it. + expected_rows: 37 + reason: | + The BASELINE side of these rows is `EXC:java.lang.IllegalStateException`, which in 1.4.3 had + exactly one source in this whole suite: datum/GeocentricConverter's out-of-range latitude + guard, whose message is `Latitude is out of range: ` (205 rows) or + `Latitude is out of range: Infinity` (12 rows). It was an unchecked, non-Proj4jException + throw, so it escaped every `catch (Proj4jException)` in the library and in every caller -- + the failure mode the fail-closed work exists to remove. + + GeocentricConverter.java:131-134 now raises CrsTransformException(INVALID_COORDINATE) at the + same site and with a message that states the rounding allowance it exceeded. The other two + current statuses are the SAME mechanism observed one stage earlier, because the fail-closed + guards now catch the bad value before it reaches the geocentric converter at all: 46 rows + end in `LongLat: invalid latitude ... exceeds PJ_EPS_LAT` from + Projection.checkForwardDomain, and 12 in `Extended Transverse Mercator: forward projection + ... returned a non-finite coordinate; refusing to apply totalScale/false easting to it` from + the Projection.projectRadians output check. All three are "1.4.3 threw java.lang.* and + proj4j now throws org.locationtech.proj4j.*", which is what status_to bounds. + + WHAT THIS RULE CANNOT LAUNDER. Both endpoints are exception rows and an exception row is + all-NaN by construction, so there is no numeric value on either side for the rule to absorb; + that is the entire reason it is safe to write while the stream is still moving. It changes + no `inside` flag (verified: no claimed row lists `inside` among its moved columns). + + SIX ROWS IT DELIBERATELY DOES NOT CLAIM. `EXC:java.lang.IllegalStateException -> OK`: + t03/epsg:4007>epsg:20022, t03/epsg:4034>epsg:20092, t20/epsg:4214>epsg:2366, + t24/epsg:4155>epsg:26748 probe 4, t30/epsg:4817>epsg:2366, t34/epsg:4289>epsg:26748 probe 4. + Those are a different mechanism -- a numerical change moved the latitude back inside the + domain -- and the row now carries a real coordinate that nobody in this rule's chain of + reasoning has vouched for. Claiming them would mean writing "1.4.3 crashed and we now return + X" with no statement about X. They stay UNEXPLAINED and belong to whoever owns the + projection that moved. + + Ordered BEFORE the two PAIR datum rules on purpose. 163 of these rows are in PAIR and both + of those rules would match them on section and key; each declines them today only because + neither sets allow_status_change. Relying on another rule's expect clause to decline is a + silent coupling, so this rule claims them first and says why. + match: + classifications: [CHANGED] + status_from: "EXC:java.lang.IllegalStateException" + status_to: "EXC:org.locationtech.proj4j.*" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY + status: active + expires: 2027-06-30 + # PINNED at 65 = 13 forward-only projections x 5 probes. Was 85 = 17 x 5, and 90 = 18 x 5 + # before that. + # + # THE TRIPWIRE FIRED A SECOND TIME, AND WAS RIGHT A SECOND TIME. On the 2026-08-01 late + # triage this rule reported `COUNT_MISMATCH expected_rows=85 but matched 65`, and the four + # missing keys were `proj/aitoff`, `proj/hammer`, `proj/nsper` and `proj/wintri`. All four + # acquired a `projectInverse(double, double, ProjCoordinate)` this release and UPSTREAM + # AGREES with all four, verified by reading 9.8.1 one file at a time rather than by + # inference: + # * `src/projections/aitoff.cpp:200-201` -- `pj_aitoff_setup` assigns BOTH + # `P->inv = aitoff_s_inverse` and `P->fwd = aitoff_s_forward`, and it is the shared + # setup for `PJ_PROJECTION(aitoff)`:206 AND `PJ_PROJECTION(wintri)`:217, so the two + # names stand or fall together. That is why they left this list in the same run. + # * `src/projections/hammer.cpp:86-87` -- `P->fwd` then `P->inv = hammer_s_inverse`. + # * `src/projections/nsper.cpp:167-168` -- `P->inv = nsper_s_inverse`. + # `aitoff`, `hammer` and `wintri` are now OK -> OK and are claimed by + # PROJ-AITOFF-HAMMER-WINTRI-INVERSES-LANDED below; `nsper` is now refused for a completely + # different reason (`+h` is absent from the canonical synthetic set) and is claimed by + # PROJ-NSPER-REQUIRES-A-POSITIVE-H-RATIO. + # + # THE SHAPE OF THIS RULE'S HISTORY IS THE POINT. It has now shed five of its original + # eighteen names -- lagrng, aitoff, hammer, nsper, wintri -- and every one of the five left + # because upstream turned out to have an inverse that 1.4.3 did not. A rule written as + # `keys: ["proj/*"]` would have absorbed all five silently and this file would still be + # asserting that Aitoff is one-way. The enumeration is doing exactly the work it was + # enumerated for. + # + # THE EARLIER TRIPWIRE, KEPT FOR THE RECORD. On 2026-08-01 this rule reported + # `COUNT_MISMATCH expected_rows=90 but matched 85`, and the missing key was `proj/lagrng`: + # LagrangeProjection acquired a `projectInverse(double, double, ProjCoordinate)` and its five + # rows are now OK -> OK (claimed by PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO + # below, where the inverse returns the committed probe to nine digits). That is CORRECT: 9.8.1 + # src/projections/lagrng.cpp:101-102 assigns BOTH `P->inv = lagrng_s_inverse` and + # `P->fwd = lagrng_s_forward`, so Lagrange is invertible upstream and the 1.4.3-era belief that + # it was forward-only was simply wrong. The name is removed from the list rather than the count + # relaxed. + # + # ROUTE THIS, IT IS NOT ONLY A GOLDEN CONCERN: core's own + # `NoInverseGateTest.baseProjectInverseRaisesForForwardOnlyProjections:96` asserts "Lagrange + # must declare no inverse for this test to mean anything" and fails on the frozen tree. Two + # streams disagree about lagrng; upstream sides with the one that gave it an inverse. + expected_rows: 65 + reason: | + THIS RULE RECORDS A FIX, NOT AN ADDED EXCEPTION, AND THE NUMBER THAT PROVES IT IS 75. + + Of the 90 rows this rule claimed when it was first written, **75 were `OK` in the 1.4.3 + baseline** (the row set is now 65; the argument is unchanged and the 75 is kept because it + is the measurement that made it). That is direct + measured proof of the defect: `Projection.projectInverse` was an unconditional identity + (`dst.x = x; dst.y = y;`), `hasInverse()` was declared 66 times across 102 classes and read + NOWHERE in `core/src/main` before 1.5.0, so a forward-only projection used as a + transformation SOURCE handed the projected metres straight back as lon/lat radians -- which + were then datum-shifted and re-projected as if they were geographic. **75 silently wrong + answers became errors.** A future reader who sees 90 rows turn into an exception should be + able to tell in one line that this was a fix; that is what the 75 is for. + + The other 15 rows were `EXC:InvalidValueException: Unknown projection` in 1.4.3 -- adams_hemi, + adams_ws1 and guyou did not exist -- so they were never wrong, merely absent. Hence the rule + keys on status_to and leaves status_from open: the two histories converge on the same correct + current behaviour. + + The 13 projections, each `SYN proj/` and each 5 probes: + airy august boggs denoy larr lask nicol rpoly tcc wag7 + adams_hemi adams_ws1 guyou + (`lagrng`, `aitoff`, `hammer`, `nsper` and `wintri` were on this list and are no longer + forward-only -- see the expected_rows note, which names the upstream line for each.) + + WHY THE KEYS ARE ENUMERATED RATHER THAN GLOBBED, AND WHY NO CRS CODE IS IN THE LIST. The gate + that produces these errors (`BasicCoordinateTransform.inverseAvailable`) deliberately does NOT + key on `hasInverse()`, because the implementing stream measured that doing so was wrong in + both directions: `KrovakProjection` and `NewZealandMapGridProjection` implement + `projectInverse` and never declare `hasInverse()`, so a `hasInverse()`-only gate rejected + EPSG:2065, EPSG:5514 and EPSG:27200 -- three working CRS -- and `LandsatProjection` declares + it while overriding nothing. The gate now interrogates the class hierarchy for a declared + `projectInverse(double, double, ProjCoordinate)` instead. **EPSG:2065, EPSG:5514 and + EPSG:27200 must never appear in this rule**, and an explicit 18-name list is the only scoping + that makes that structurally impossible: `keys: ["proj/*"]` would have swallowed them the + moment anything else about those rows moved. The same reasoning excludes `+proj=geocent`, + which is invertible and declares so (see PROJ-GEOCENT-LON0-APPLIED and + proj/GeocentProjection.java). + + Every claimed row's current side is all-NaN in the inverse columns by construction, so + allow_nonfinite and allow_status_change are required and no magnitude band is meaningful. The + 75 rows whose baseline side carried a value are exactly the rows this rule says were wrong: + the rule does not vouch for those baseline numbers, it records that they are gone. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/airy", "proj/august", "proj/boggs", "proj/denoy", + "proj/larr", "proj/lask", "proj/nicol", + "proj/rpoly", "proj/tcc", "proj/wag7", + "proj/adams_hemi", "proj/adams_ws1", "proj/guyou"] + status_to: "EXC:org.locationtech.proj4j.CrsTransformException" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # FAILCLOSED-POLE-OVERSHOOT-REJECTED WAS HERE AND HAS BEEN DELETED, 2026-08-01. + # + # It claimed 2 rows -- `SYN proj/wag2` probes 3 and 4, whose 1.4.3 inverse round-tripped to + # latitude 90.0015835811672 degrees (176 m past the north pole) and which + # Projection.checkForwardDomain then refused. Its own reason said: "If the wag2 inverse is later + # fixed so that it stops overshooting, this rule becomes a DEAD_RULE and the gate will say so, + # which is the correct outcome." + # + # That is exactly what happened. On 2026-08-01 the gate reported + # `DEAD_RULE FAILCLOSED-POLE-OVERSHOOT-REJECTED matched 0 rows`. The Wagner II forward AND + # inverse have both been rewritten: probe 3's fy moves 9,265,677.82 -> 6,912,649.14 m and its + # `iy` now returns 60 exactly -- the committed probe latitude -- instead of 90.0015835811672. So + # there is no longer a pole overshoot to reject, the rows are OK -> OK, and they are claimed by + # PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO below. + # + # The rule is deleted rather than left as a `status: pending` stub, because pending means "this + # change has not landed yet" and this change has landed and then been superseded. The record of + # what it asserted lives here and in golden/README.md; the guard itself is unaffected and is + # still exercised by FAILCLOSED-UNCHECKED-ISE-REPLACED's 46 `exceeds PJ_EPS_LAT` rows. + + # --------------------------------------------------------------------------------------------- + - id: DATUM-TYPE-UNKNOWN-HOISTED + status: active + expires: 2027-06-30 + # PINNED at 251, measured 2026-08-01 on a frozen /tmp snapshot. golden/README.md's 253 is an + # earlier snapshot and is superseded. + # + # THE ARITHMETIC, because this is the one TBD rule with no predicted count written anywhere and + # so the one whose pin needed its own derivation. 347 changed PAIR rows carry a `t0*/*` or + # `t*0/*` key: 251 land here, 16 are claimed earlier by FAILCLOSED-UNCHECKED-ISE-REPLACED, and + # 80 are UNEXPLAINED. The 16 are NOT lost to an ordering accident -- every one is a status + # change (IllegalStateException -> ProjectionException) and the `expect` clause below does not + # set allow_status_change, so this rule declines them wherever it sits in the file. Checked on + # the frozen report rather than inferred. + expected_rows: 251 + reason: | + BasicCoordinateTransform.java:198-205 nests the TYPE_UNKNOWN early-return INSIDE an + ellipsoid-equality guard, so it is only consulted when the ellipsoids already match. The file + itself cites PROJ 5.2.0:src/pj_transform.c, which checks it unconditionally and BEFORE the + identical-datums short cut: + + if (src->datum_type == PJD_UNKNOWN || dst->datum_type == PJD_UNKNOWN) return 0; + + Consequence in 1.4.3: for a bare-+ellps pair with differing ellipsoids and TYPE_UNKNOWN datums, + proj4j falls through to a geocentric round trip that PROJ skips entirely. Hoisting the check + restores PROJ's answer for every such pair. + + The PAIR key encodes the two datum types (`t/`), so this rule is scoped by key glob to + pairs with TYPE_UNKNOWN (type 0) on either end -- which is exactly the predicate the upstream + OR-guard tests. It is ordered before the isEqual rule because the hoist changes whether + isEqual is even reached. + + Note this defect was MASKED by the Datum.isEqual self-comparison bug: fixing that made + Proj4VariousTest.testRawEllipse start failing more accurately (latitude moved ~292 m and a + spurious z = 699 m appeared). proj4j was getting PROJ's answer here by accident, via one bug + cancelling another -- so expect these two rules' counts to move together. + match: + classifications: [CHANGED] + sections: [PAIR] + keys: ["t0*/*", "t*0/*"] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: DATUM-ISEQUAL-SELF-COMPARISON + status: active + expires: 2027-06-30 + # PINNED at 284, measured 2026-08-01 on a frozen /tmp snapshot, and corroborated independently + # by FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED's reason, which predicts + # "DATUM-ISEQUAL-SELF-COMPARISON 332 -> 284 (-48)". golden/README.md's 431 is two snapshots old. + # This rule and DATUM-TYPE-UNKNOWN-HOISTED above are expected to move TOGETHER -- the hoist + # decides whether isEqual is reached at all -- so a change in one count alone is itself a signal. + # RE-PINNED 2026-08-01 by the GRIDS-EPSG-SHIP-CONUS stream: proj4j-epsg now ships PROJ + # 9.8.1's `conus` at proj4/nad/conus, so the golden run resolves that grid for the first + # time (golden depends on proj4j-epsg and, unlike core's own tests and the conformance + # module, has no other copy on its classpath). Measured on a frozen /tmp A/B whose two + # trees differ in exactly one byte-bearing file, the grid itself. +12 PAIR rows that previously threw on grid coverage now produce a coordinate, so they have + # numeric movement for this rule to describe again. + expected_rows: 296 + reason: | + datum/Datum.java:189 compares the equator radius TO ITSELF, so the eccentricity guard is dead + code and unequal ellipsoids can be declared equal -- which short-circuits the datum transform + at BasicCoordinateTransform.java:194 and decides whether a datum shift happens at all. There is + a second, residual divergence in the same method: upstream pj_compare_datums is an OR + (`if (a != a || fabs(es_a - es_b) > 5e-11) return 0;`) where proj4j nests the eccentricity check + inside the radius check, so "radius differs, eccentricity within 5e-11" still compares equal. + + Scoped to the PAIR section, which exists precisely to exercise the 25 combinations of source and + target Datum.TYPE_*. Two constraints keep this from being a blanket licence over 1,000 rows: + allow_status_change is NOT set, so the 23 rows that turn from OK into + java.lang.IllegalStateException stay UNEXPLAINED (a new non-Proj4jException escape is its own + change and belongs to the fail-closed work, not here); and the magnitude is capped at 1e6, so a + movement larger than 1,000 km / 1e6 degrees is not explained by a datum-comparison fix. + match: + classifications: [CHANGED] + sections: [PAIR] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_nonfinite: true + magnitude: {min: 0.0, max: 1.0e6} + + # --------------------------------------------------------------------------------------------- + - id: FAILCLOSED-NO-INVERSE-FOR-NEW-FORWARD-ONLY + status: active + expires: 2027-06-30 + # PINNED at 40 = 8 forward-only projections x 5 probes, structural for the same reason + # FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY is: if one of the 8 acquires an inverse the count drops + # and the gate makes somebody say so. Measured 2026-08-01 on a frozen tree. + expected_rows: 40 + reason: | + The sibling of FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY for eight projections that did not + exist in 1.4.3 at all. Every row moves + `EXC:InvalidValueException: Unknown projection: ` -> + `EXC:CrsTransformException: source CRS +proj= ... uses projection ..., which has no + inverse`, so unlike its sibling it records no fix to a wrong answer: these were never wrong, + merely absent, and they are now present and honest about being one-way. + + VERIFIED AGAINST UPSTREAM AT 9.8.1, one file at a time, because "it has no inverse" is + exactly the claim that must not be taken on trust. None of the eight assigns `P->inv`: + * `src/projections/bacon.cpp` -- PJ_PROJECTION(bacon):43, (apian):57, (ortel):70, all three + assign only `P->fwd = bacon_s_forward`. `apian` and `ortel` have no file of their own, + which is why a per-name file search finds nothing for them; look in bacon.cpp. + * `src/projections/vandg2.cpp` -- PJ_PROJECTION(vandg2):55 and (vandg3):68, `P->fwd` only. + `vandg3` likewise has no file of its own. + * `src/projections/vandg4.cpp:53`, `src/projections/bertin1953.cpp:90` -- `P->fwd` only. + * `src/projections/gins8.cpp:27-28` -- assigns `P->inv = nullptr;` EXPLICITLY, one line + above `P->fwd`. A grep for `P->inv` finds a hit here and it means the opposite of what a + hit usually means; that is worth writing down. + + The eight, each `SYN proj/` and each 5 probes: + apian bacon bertin1953 gins8 ortel vandg2 vandg3 vandg4 + + Enumerated, never globbed, for the reason the sibling rule spells out at length: `proj/*` + would sweep in EPSG:2065, EPSG:5514 and EPSG:27200, whose projections implement + `projectInverse` without declaring `hasInverse()`. Both endpoints are exception rows and + therefore all-NaN, so there is nothing numeric here to launder. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/apian", "proj/bacon", "proj/bertin1953", "proj/gins8", "proj/ortel", + "proj/vandg2", "proj/vandg3", "proj/vandg4"] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "EXC:org.locationtech.proj4j.CrsTransformException" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-NEW-PROJECTIONS-REGISTERED + status: active + expires: 2027-06-30 + # PINNED at 220 = 44 projection names x 5 probes. Was 180 = 36 x 5. + # + # THE TRIPWIRE DID ITS OTHER JOB. The pin at 180 did not fail -- it held at exactly 180 -- + # and the 8 names that landed after it showed up as 40 UNEXPLAINED rows carrying the + # baseline message `crs-tgt: Unknown projection: ` rather than being absorbed. That + # is the enumerated-key discipline paying off in the arrival direction as well as the + # departure one: a rule scoped `status_from: InvalidValueException, status_to: OK` with no + # key list would have swallowed all 40 and nobody would have had to name them. + # + # The 8 added on 2026-08-01 (late triage): calcofi ccon gstmerc imw_p labrd lcca ocea tpeqd. + # `labrd` is worth flagging: golden/README.md's first triage recorded `world:madagascar` as + # "+rot_conv now accepted, labrd still unimplemented" and refused to claim it for exactly + # that reason. labrd is now implemented, world:madagascar builds, and those 5 REG rows are + # claimed by PARSE-NO-KEYWORD-ALLOWLIST above -- the prediction and its resolution are both + # on the record. + expected_rows: 220 + reason: | + The synthetic matrix carries all 188 of 9.8.1's PROJ_HEAD names precisely so that a projection + arriving is visible as a status transition rather than as nothing at all -- golden/README.md, + "The synthetic matrix is not optional". This rule is that transition, for the 36 names the + Tier A / Tier B / mod_ster / interrupted / `ups` / `builtins` port batches added. Every + claimed row moves from `EXC:InvalidValueException` with the baseline message + `crs-tgt: Unknown projection: ` to `OK`. + + The 44 names, each `SYN proj/` and each 5 probes: + adams_ws2 alsk calcofi ccon col_urban comill eck3 eqearth gs48 gstmerc igh igh_o imoll + imoll_o imw_p kav7 labrd lcca lee_os mbt_s mbtfps mil_os natearth natearth2 nell_h ocea + patterson peirce_q putp1 putp3 putp3p putp6 putp6p som spilhaus times tissot tobmerc + tpeqd ups wag6 webmerc wink1 wink2 + + WHAT THIS RULE DOES AND DOES NOT VOUCH FOR. The baseline side is all-NaN by construction -- + the CRS could not be built -- so there is no baseline number for this rule to absorb and no + numeric regression can hide behind it. Equally, it makes NO claim that the coordinate now + produced is right. That question belongs to gie, per this file's opening policy: 22 of these + 36 names have `.gie` coverage and the conformance module is where their values are judged. All + this rule records is that the name resolves where it previously did not, which is a change + somebody intended. + + SCOPED BY AN EXPLICIT 36-NAME LIST, not by `status_from`/`status_to` alone, and the reason is + the one PARSE-NO-KEYWORD-ALLOWLIST learned the hard way: an `InvalidValueException -> OK` + predicate with nothing else on it would also have claimed `SYN proj/omerc` (5 rows, baseline + message `fwd: Infinite longitude`, a projection that DID exist in 1.4.3 and whose kernel was + rewritten), the four `SYN ellps/*` keys (20 rows, `Unknown ellipsoid`), and the six + `inv: Infinite longitude` rows on `epsg:5472`, `esri:102766`, `esri:65061`, `esri:65161`, + `nad27:5400` and `proj/poly` -- all four of which are different mechanisms with different + owners. Naming the 36 keeps them apart and makes a 37th arrival show up as a COUNT_MISMATCH + rather than be swallowed. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/adams_ws2", "proj/alsk", "proj/calcofi", "proj/ccon", "proj/col_urban", + "proj/comill", "proj/eck3", + "proj/eqearth", "proj/gs48", "proj/gstmerc", "proj/igh", "proj/igh_o", + "proj/imoll", "proj/imoll_o", "proj/imw_p", + "proj/kav7", "proj/labrd", "proj/lcca", "proj/lee_os", "proj/mbt_s", + "proj/mbtfps", "proj/mil_os", + "proj/natearth", "proj/natearth2", "proj/nell_h", "proj/ocea", "proj/patterson", + "proj/peirce_q", + "proj/putp1", "proj/putp3", "proj/putp3p", "proj/putp6", "proj/putp6p", "proj/som", + "proj/spilhaus", "proj/times", "proj/tissot", "proj/tobmerc", "proj/tpeqd", + "proj/ups", "proj/wag6", "proj/webmerc", "proj/wink1", "proj/wink2"] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-MOD-STER-GS50-DOMAIN-REFUSED + status: active + expires: 2027-06-30 + # PINNED at 5 = one key x 5 probes. + expected_rows: 5 + reason: | + `SYN proj/gs50` is the one member of the modified-stereographic family whose arrival is NOT a + transition to `OK`, which is why PROJ-NEW-PROJECTIONS-REGISTERED's 36-name list excludes it + and this rule exists separately. Baseline: `crs-tgt: Unknown projection: gs50`. Current: + `EXC:ProjectionException`, `inv: Mod. Stereographic of 50 U.S.: modified-stereographic + inverse of (, ): ...` at all five probes. + + That is the correct answer, not a half-finished port. `+proj=gs50` is the 50-state US + modified stereographic, and the synthetic matrix evaluates every `proj/` key on the + SAME canonical parameter set -- `+ellps=GRS80 +lat_0=45 +lon_0=10 +lat_1=30 +lat_2=60 +x_0=0 + +y_0=0 +units=m` -- whose probes are therefore at longitude 10 East, in central Europe, + several thousand kilometres outside the polynomial's region of validity. 9.8.1's + `src/projections/mod_ster.cpp` inverse is a Newton iteration on a complex Chebyshev-style + polynomial and does not converge out there either; refusing is what "a failure must never be + expressed as a plausible coordinate" requires. + + Both endpoints are exception rows, all-NaN on both sides. This rule says the name now + resolves and the out-of-domain refusal is intended; it says nothing about any gs50 coordinate, + because it has never seen one. + + `allow_inside_change` IS SET, AND ONLY BECAUSE THE GATE MADE ME NOTICE. Written without it, + this rule matched all five rows and DECLINED all five, reporting + `inside changed (- -> F) and allow_inside_change is not set` -- so it was a DEAD_RULE on its + first run. The flag moves `-` -> `F` for a reason worth recording: `-` is what + `GoldenGenerator` writes when the CRS could not be built at all, so `Projection.inside` was + never called, and `F` is a real answer from a real `ModifiedStereographicProjection`. The + `inside` flag going from "not asked" to "asked, and no" is part of this change, not an + independent one; `Projection.inside` has zero callers in `core` (golden/README.md, "File + format") so nothing depends on it either way. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/gs50"] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "EXC:org.locationtech.proj4j.ProjectionException" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-OMERC-ALPHA-90-NO-LONGER-REJECTED + status: active + expires: 2027-06-30 + # PINNED at 20 = 4 registry defs x 5 probes. Structural: these are the only four defs in all + # five dictionaries that carry `+proj=omerc +alpha=90`. Measured 2026-08-01 on a frozen tree. + expected_rows: 20 + reason: | + FOUR REAL, HEAVILY USED CRS THAT 1.4.3 COULD NOT CONSTRUCT AT ALL, and the count is small + only because the guard was so specific. + + `ObliqueMercatorProjection.initialize()` in 1.4.3 rejected the azimuth form whenever + `|alpha| - pi/2 <= TOL`, throwing `ProjectionException("Obl 1")` -- message text `Obl 1`, + nothing more. `+alpha=90` is exactly that case, and it is what the Swiss and Hungarian + oblique Mercators use: + + esri:2056 CH1903+ / LV95 +proj=omerc +lat_0=46.95240555555556 +alpha=90 +ellps=bessel + esri:21780 CH1903 / LV03 ... +pm=bern + esri:21781 CH1903 / LV03 ... +x_0=600000 +y_0=200000 + esri:23700 HD72 / EOV +lat_0=47.14439372222222 +alpha=90 +ellps=GRS67 +k=0.99993 + + UPSTREAM HAS NO SUCH GUARD, verified by reading the file rather than the docs. + 9.8.1:src/projections/omerc.cpp:134-146 takes the azimuth branch as soon as `+alpha` or + `+gamma` is present and validates NOTHING in it: the only rejections in `omerc_setup` are in + the two-point branch (`|lat_1| > 90 - TOL` at :158, `|lat_2| > 90 - TOL` at :164, + `|lat_1 - lat_2| <= TOL` at :170) plus the shared `|lat_0| = 90` test. `alpha = 90 deg` is a + perfectly well-posed Hotine oblique Mercator; the 1.4.3 guard was a transcription of the + two-point preconditions onto the wrong branch. + + Every claimed row is `EXC:ProjectionException -> OK` with the baseline message `crs-tgt: Obl + 1` and an all-NaN baseline side, so no numeric value is being absorbed. What the coordinates + are now worth is gie's question, and the omerc kernel is being rewritten concurrently -- + hence `status_from`/`status_to` are both pinned, so the moment one of these four stops + producing a coordinate this rule declines it and the row returns to UNEXPLAINED instead of + being quietly covered. + match: + classifications: [CHANGED] + sections: [REG] + keys: ["esri:2056", "esri:21780", "esri:21781", "esri:23700"] + status_from: "EXC:org.locationtech.proj4j.ProjectionException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-OMERC-TWO-POINT-FORM-REWRITTEN + status: active + expires: 2027-06-30 + # PINNED at 5 = one key x 5 probes. + expected_rows: 5 + reason: | + `SYN proj/omerc` alone: the canonical synthetic parameter set gives `+lat_1=30 +lat_2=60` and + no `+alpha`, i.e. upstream's TWO-POINT form, and 1.4.3 answered + `EXC:ProjectionException: fwd: Infinite longitude` at all five probes -- a forward that + produced a non-finite longitude and was caught downstream rather than at the source. + + Kept out of PROJ-OMERC-ALPHA-90-NO-LONGER-REJECTED because it is a different defect on a + different branch of the same `initialize()`, and out of PROJ-NEW-PROJECTIONS-REGISTERED + because omerc was never missing. The rewrite's own account of what changed is in + `proj/ObliqueMercatorProjection.java`'s class javadoc, which enumerates the defects with + upstream line references -- notably `u_0` computed with `cos(gamma)` where `omerc.cpp:296` + uses `cos(alpha_c)` (the two coincide except on RSO Borneo, which is why every other in-repo + omerc hid it), and the dead `gamma = alpha` default that made an `+alpha`-only definition + lose its rotation. + + Baseline is all-NaN, so nothing numeric is absorbed. This rule claims the status transition + on ONE synthetic key; the 102 REG and CSV `omerc` rows are deliberately NOT claimed here -- + see golden/README.md's triage section, they are the omerc owner's and their magnitudes run to + 3.6e6 m. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/omerc"] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-NZMG-NONCONVERGENCE-TYPED + status: active + expires: 2027-06-30 + # PINNED at 11 = `world:new_zealand` x 5 + `SYN proj/nzmg` x 5 + `proj4-epsg.csv:03288` x 1. + # The CSV file carries exactly one NZMG case at one pinned coordinate, hence the odd total. + expected_rows: 11 + reason: | + A pure error-taxonomy change: `EXC:InvalidValueException: inv: Infinite longitude` -> + `EXC:ConvergenceFailureException: inv: New Zealand Map Grid: inverse complex-polynomial + iteration did not converge to 1.0E-10 within 20 trips for ...`. + + 1.4.3's NZMG inverse ran its complex-polynomial fixed-point iteration, took whatever it had + when it stopped, and let the resulting non-finite longitude be discovered by a downstream + finiteness test that reported it as an INVALID VALUE -- i.e. as if the input had been bad. + The input was fine; the iteration failed. `ConvergenceFailureException` says so, and it is + the type 9.8.1 reserves for this (`PROJ_ERR_COORD_TRANSFM_NO_CONVERGENCE`). + + That all three keys are far outside New Zealand is the reason they do not converge and is not + a defect: `world:new_zealand`'s own probes come from its `+lat_0`/`+lon_0`, but `SYN + proj/nzmg` inherits the canonical `+lon_0=10 +lat_0=45` (central Europe) and + `proj4-epsg.csv:03288` probes the file's single fixed point `(1.0, -1.0)` in the Gulf of + Guinea -- golden/README.md, "Probe derivation". + + Both endpoints are exception rows, all-NaN both sides, so no coordinate is vouched for. NOTE + FOR THE NZMG OWNER, and the reason this rule stops where it does: `SYN proj/nzmg`'s FORWARD + returns `fx = -3.52e18 m` at probe 4 in BOTH trees, and the change from `-3.52038367e18` to + `-3.52052221e18` is why those rows appear elsewhere in the report with magnitudes of 1e14. + A number like that is a failure expressed as a coordinate; it predates the baseline, this + rule does not claim it, and it is not fixed. + match: + classifications: [CHANGED] + keys: ["world:new_zealand", "proj/nzmg", "proj4-epsg.csv:03288"] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "EXC:org.locationtech.proj4j.ConvergenceFailureException" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: NUM-PHI2-CONVERGES-ON-EXTREME-ELLIPSOIDS + status: active + expires: 2027-06-30 + # PINNED at 6, measured 2026-08-01 on a frozen /tmp snapshot: `ellps/NWL9D` probes 1..4 and + # `ellps/andrae` probes 3..4. The split is 4 + 2 rather than 5 + 5 because the other probes of + # those two keys converged in 1.4.3 too. + # + # THE COUNT IS DATA-DRIVEN, NOT STRUCTURAL -- it depends on where the iteration happened to fall + # short, so any further change to the auxiliary-latitude core moves it. That was the stated + # reason for leaving it TBD, and it is exactly backwards: a count that moves for reasons nobody + # predicted is the count most worth pinning. When the numerical core next changes this rule will + # fail with a COUNT_MISMATCH naming itself, which is a two-line re-pin and a sentence of + # explanation -- against a TBD, which would have said nothing at all. + expected_rows: 6 + reason: | + `EXC:ConvergenceFailureException: inv: Computation of phi2 failed to converage after 15 + iterations` -> `OK`. (The baseline message's spelling is upstream-of-us and reproduced + verbatim, as this suite reproduces every baseline string.) + + 1.4.3's `phi2` was a fixed-point iteration capped at 15 trips with no error-term acceleration, + and on the two most eccentric entries of `ellps.cpp` it ran out of trips. 9.8.1's rewritten + `src/phi2.cpp` -- the Karney formulation this project ports, measured at 4,145 nm -> 2.1 nm at + GRS80, see NUM-KARNEY-LATITUDE-CORE -- converges there. + + WHY THIS IS A SEPARATE RULE FROM NUM-KARNEY-LATITUDE-CORE, which is the rule that would + otherwise own the phi2 work: that rule refuses status changes and non-finite endpoints on + purpose, so it cannot claim a row whose baseline side is an exception, and it should not be + loosened to do so -- its whole value is that it can only absorb sub-microscopic drift. These + six rows are the same code change observed at its most visible, and they need their own + statement. + + Kept off `NUM-` band semantics for the same reason: the baseline is all-NaN, so a magnitude + band would be meaningless. Scoped to the two keys because a convergence failure disappearing + is exactly the kind of good news that should not silently license the next one. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["ellps/NWL9D", "ellps/andrae"] + status_from: "EXC:org.locationtech.proj4j.ConvergenceFailureException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT + status: active + expires: 2027-06-30 + # PINNED at 48, measured 2026-08-01 on a frozen /tmp snapshot, across 11 keys: + # SYN proj/bipc 5 · collg 5 · fahey 5 · lsat 5 · euler 4 · murd1 4 · murd2 4 · murd3 4 + # · pconic 4 · vitk1 4 · REG esri:54026 4 + # Data-driven, not structural: six keys contribute 4 rows and not 5 because their probe 0 sits + # at the CRS origin, where the broken inverse happened to be right. `core/proj/**` is still + # live, so this number is expected to move -- and that is the argument FOR the pin, not against + # it. A projection stream that changes it gets a COUNT_MISMATCH naming this rule; a TBD would + # have let the row set change size in silence. + expected_rows: 48 + reason: | + THE STRONGEST EVIDENCE THIS REGIME CAN PRODUCE SHORT OF A ROW RETURNING TO BASELINE, and the + `expect.dimensions` clause is what makes it safe. + + Every claimed row moves ONLY in the inverse columns -- `dimensions: [ix, iy, iz]` -- so the + forward output is bit-identical to 1.4.3 on all 48. A rule that cannot touch `fx`, `fy` or + `fz` cannot hide a forward regression; if a future change moves a forward ordinate on any of + these rows the rule DECLINES it and the row reappears as UNEXPLAINED. That is the entire + reason this cluster can be ruled while its files are still being written. + + And what the inverse columns move TO is checkable rather than asserted: the committed probe + coordinate, to nine digits. `probes.tsv` puts the canonical synthetic probes at longitude + 10 / -11.2132034 / 31.2132034 and latitude 45 / 30 / 60, and that is precisely what `ix`/`iy` + now return. Before, they returned something else entirely: + + SYN proj/lsat probe 0 ix 136.758446215 -> 10.000000230, iy -56.0683414 -> 45 + probes 1 and 3 also recorded ix = 136.758446215 -- the SAME value at two + different probes, which is the tell: it is the +-pi longitude clamp, not a + coordinate. LandsatProjection.projectInverse was ENTIRELY INSIDE A BLOCK + COMMENT, so Projection.projectInverse's unconditional identity ran instead, + and Projection.inverseProjectRadians CLAMPED longitude to +-pi where + 9.8.1 WRAPS with adjlon (src/inv.cpp, via pj_adjlon). + SYN proj/collg iy -31.0082524 -> 45, -40.5142342 -> 30, -20.9717108 -> 60 + SYN proj/fahey iy 24.7638938 -> 45, 43.6824137 -> 30, -5.90746223 -> 60 + SYN proj/euler ix -167.926368 -> -11.2132034 (a 156-degree error) + SYN proj/murd1 ix -165.517234 -> -11.2132034 + SYN proj/murd2, murd3, pconic, vitk1: the same shape, 149..168 degrees out + SYN proj/bipc ix 16.3737802 -> 10, iy -20.6736053 -> 45 + REG esri:54026 ix 0 -> -5 and iy 0 -> -5 at a probe of (-5, -5): the inverse returned the + ORIGIN for all four corners, a sentinel wearing a coordinate's clothes. + + Six of the eleven keys are the `SimpleConicProjection` family (euler, murd1, murd2, murd3, + pconic, vitk1) and their three shared defects; `lsat` is the Landsat/SOM fix above; `collg`, + `fahey`, `bipc` and `esri:54026` are the `builtins` numerical batch. + + Note that four keys contribute 4 rows rather than 5, and the missing row is probe 0 in every + case -- the CRS centre, where an inverse that is 156 degrees wrong in longitude still returns + the right answer because the longitude offset from centre is zero. That asymmetry is a + property of the defect and is why the count is data-driven; see the expected_rows note. + + Units: `ix`/`iy` are always WGS84 degrees (golden/README.md's units warning), so the + magnitudes here -- 1e-4 .. 665 -- are degrees. The floor of 1e-6 exists only to keep this + rule from reaching into NUM-KARNEY-LATITUDE-CORE's band; nothing observed is near it. + match: + classifications: [CHANGED] + keys: ["proj/bipc", "proj/collg", "proj/euler", "proj/fahey", "proj/lsat", "proj/murd1", + "proj/murd2", "proj/murd3", "proj/pconic", "proj/vitk1", "esri:54026"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [ix, iy, iz] + magnitude: {min: 1.0e-6, max: 1.0e4} + + # --------------------------------------------------------------------------------------------- + - id: PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO + status: active + expires: 2027-06-30 + # PINNED at 45, measured 2026-08-01 on a frozen /tmp snapshot = 9 keys x 5 probes. That looks + # structural and is not: it is 9 of the ~30 keys in this shape, chosen because each one's + # forward change is individually accounted for in the reason below. The other ~21 are + # deliberately left UNEXPLAINED -- see golden/README.md's 2026-08-01 triage -- and the pin is + # what keeps them out: if a tenth key's rows ever start landing here, the count says so instead + # of the rule quietly growing to 50. + expected_rows: 45 + reason: | + The same proof as PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT above -- `ix`/`iy` now return + the committed probe exactly -- for eight keys whose FORWARD also moved, so + `dimensions: [ix, iy, iz]` cannot be the guard and each forward change has to be named + individually instead. All eight are named, with the arithmetic: + + SYN proj/eqc probe 0 `fy` 5,009,377.09 -> 0 at latitude 45 with `+lat_0=45`. + 9.8.1:src/projections/eqc.cpp:22 is `y = P->phi0 ? lp.phi - P->phi0 : + lp.phi`; 1.4.3 dropped the `phi0` subtraction, so the equidistant + cylindrical ignored its own latitude of origin. 5,009,377.09 = + 6,378,137 * 45 deg in radians, i.e. exactly the un-subtracted value. + SYN proj/eqdc probe 0 `fy` 5,009,377.09 -> 0 at the CRS centre. The missing `rho0` + subtraction (`eqdc.cpp`: `y = Q->rho0 - rho * cos(lp.lam)`), the same + 5,009,377.09 for the same reason. + SYN proj/sinu probe 0 `fy` 5,009,377.09 -> 4,984,944.38. The second number is the GRS80 + MERIDIAN ARC to 45 degrees; the first is `a * phi`, the spherical form. + 1.4.3 ran the spherical sinusoidal on an ellipsoid. + SYN proj/loxim probe 0 `fy` 556,597.454 -> 1,669,792.36. Ratio exactly 3, and + 1,669,792.36 = `a * (45 - 30) deg` with `+lat_1=30`: upstream's loximuthal + measures from `phi1` (`loxim.cpp`), 1.4.3 measured 5 degrees from + somewhere else. + SYN proj/nell probe 0 `fy` 5,009,377.09 -> 4,719,548.61, and `iy` 48.2667899 -> 45. + SYN proj/urmfps probe 0 `fy` 6,592,711 -> 5,532,199.29, `iy` 54.7356103 -> 45. + SYN proj/wag1 identical numbers to urmfps at every probe, in both trees -- `wag1` IS + `urmfps` with `+n=0.8660254037844386` fixed (`urmfps.cpp` hosts both), so + the two keys agreeing digit-for-digit is a consistency check on the fix. + SYN proj/wag2 probe 3 `fy` 9,265,677.82 -> 6,912,649.14 and `iy` 90.0015835811672 -> 60. + This is the cluster the deleted FAILCLOSED-POLE-OVERSHOOT-REJECTED + claimed: 1.4.3 round-tripped 176 m past the north pole and returned it as + a coordinate. The overshoot is gone because the inverse is right, not + because a guard caught it. + SYN proj/lagrng probe 0 `fy` 1,505,783.93 -> 1,056,559.74 and `iy` 13.5266872 -> 45. + LagrangeProjection GAINED an inverse in this release, which is why + FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY dropped from 90 rows to 85 and + reported a COUNT_MISMATCH -- see that rule's expected_rows note. Upstream + has one (9.8.1:src/projections/lagrng.cpp:101 assigns + `P->inv = lagrng_s_inverse`), so 1.4.3's belief that Lagrange was + forward-only was simply wrong, and the `ix` -5.24121984 -> -11.2132034 + movement is the identity-inverse being replaced by a real one. NOTE FOR + THE FAIL-CLOSED OWNER: core's own `NoInverseGateTest:96` still asserts + "Lagrange must declare no inverse" and fails. + + In every one of the 45 rows `ix` and `iy` end at the committed probe, so the forward and + inverse are now mutually consistent as well as individually changed. Whether the forward is + RIGHT is gie's question, and six of these eight have `.gie` coverage. + + Magnitude floor of 1.0 (metres for `fx`/`fy`, degrees for `ix`/`iy`; see the units warning) + keeps this rule out of NUM-KARNEY-LATITUDE-CORE's band and out of the sub-millimetre + transverse-Mercator drift that sits on top of everything in this suite. Ceiling 1e8 because + nothing here exceeds 7e6 and a rule for a 1e12 movement is not this rule. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/eqc", "proj/eqdc", "proj/sinu", "proj/loxim", "proj/nell", "proj/urmfps", + "proj/wag1", "proj/wag2", "proj/lagrng"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0, max: 1.0e8} + + # --------------------------------------------------------------------------------------------- + - id: PROJ-EQC-EQDC-SINU-REGISTRY-ROWS + status: active + expires: 2027-06-30 + # PINNED at 67, measured 2026-08-01 on a frozen /tmp snapshot. The arithmetic is worth spelling + # out because it is a cross-rule dependency: the three projections account for 82 rows in total + # (eqdc 49, eqc 20, sinu 13), of which 15 are the three `SYN proj/` keys claimed EARLIER + # by PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO, leaving 82 - 15 = 67 here. + # + # If that rule is ever reordered after this one, this count becomes 82 and that one becomes 25. + # BOTH counts are now pinned, so such a reorder fails with two COUNT_MISMATCHes naming both + # rules -- which is the whole reason a cross-rule dependency has to be pinned on both sides + # rather than described in a comment. + expected_rows: 67 + reason: | + The registry and CSV consequences of the three forward defects named in + PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT-FWD-ALSO above, which is where the arithmetic + is. Scoped by `tgt_proj` rather than by key because the mechanism is a property of the + PROJECTION, not of any dictionary entry: every `+proj=eqdc`, `+proj=eqc` and `+proj=sinu` + target in the suite is affected and no other target is. + + eqdc 49 rows over 10 keys (esri:102005 102010 102023 102026 102029 102031 102032 53027 + 54027, SYN proj/eqdc). `esri:102023` at probe 0 moves `fy` -166,979.236 -> + -165,861.794 -- 1,117 m, the `rho0` residue at 1.5 degrees south of a `+lat_1=20 + +lat_2=-23` cone -- and up to 7.7e5 m at the box corners. + eqc 20 rows over 7 keys (epsg:4087 32662 32663, SYN proj/eqc, proj4-epsg.csv:01884 + 03928 03929). All three EPSG keys are `+lat_ts=0` world equidistant cylindrical, so + their movement comes from the `phi0` subtraction alone. + sinu 13 rows over 3 keys (esri:102011, esri:54008, SYN proj/sinu). Every REG row moves by + EXACTLY 3,712 m, which is `a * 45 deg - meridianArc(45 deg)` for GRS80 -- the + spherical-to-ellipsoidal correction, constant because all these defs share + `+lat_0=0` and the probes share a latitude. + + THE 3,712 m IS THE STRONGEST PART OF THIS RULE AND IS WHY THE BAND IS WHERE IT IS. It is not + an observation to be tolerated, it is a predicted constant: 8 of the 13 sinu rows and 12 of + the 20 eqc rows land on it to the last digit, and `REG poly WGS84` and `REG mill/vandg + WGS84` rows land on 3,712 m and 622.7 m respectively for the same reason -- those are NOT + claimed here, because `poly`, `mill` and `vandg` are separate projections with separate + owners and this rule must not become "everything that moved by 3,712 m". + + Floor of 1.0 to stay clear of NUM-KARNEY-LATITUDE-CORE and of the sub-millimetre tmerc + drift; ceiling 1e7 because the largest observed is 5.01e6 m and the section's units are + metres for all of these (all three are projected targets). + match: + classifications: [CHANGED] + tgt_proj: [eqc, eqdc, sinu] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0, max: 1.0e7} + + # --------------------------------------------------------------------------------------------- + - id: PARSE-UNITS-PRECEDES-TO-METER + status: active + expires: 2027-06-30 + # PINNED at 17, measured 2026-08-01 on a frozen /tmp snapshot: mod/merc/to_meter 5, + # mod/lcc/to_meter 4, mod/tmerc/to_meter 4, mod/utm/to_meter 4. The three 4s are probe 0 landing + # exactly on the false origin in both trees, where a scale factor is invisible. + # `mod/aea/to_meter` is claimed earlier by PROJ-AEA-SPHERICAL-INVERSE and `mod/longlat/to_meter` + # does not move (a geographic target does not apply `to_meter`). Every term of 5 + 4 + 4 + 4 is + # therefore accounted for, which is what makes 17 safe to pin while the parser stream is live. + expected_rows: 17 + reason: | + A CORRECTION TO PARSE-FIRST-MATCH-WINS' REASON, WHICH SAYS "EXACTLY FOUR OF THE 47 MODIFIERS + COLLIDE WITH A CANONICAL KEY". Four collide by KEY. A fifth collides by MEANING, and it is + `to_meter` against the canonical set's `+units=m`. + + 9.8.1:src/init.cpp:681-691, and the short circuit is the whole mechanism: + + if ((name = pj_param(ctx, start, "sunits").s) != nullptr) { /* :681 */ + ... + s = units[i].to_meter; /* :689 */ + } + if (s || (s = pj_param(ctx, start, "sto_meter").s)) { /* :691 */ + + Because `s` is already non-null when `+units` was given, the `||` never evaluates its right + operand and `+to_meter` is NOT CONSULTED AT ALL. `+units=m` therefore wins over any + `+to_meter`, whichever order they appear in -- this is not first-match-wins on a paralist, it + is one parameter shadowing another, and the two mechanisms deserve separate rules even though + one stream fixed both. + + MEASURED EXACTLY, not inferred. `SYN mod/merc/to_meter` probe 0: `fy` 18,344,146.7 -> + 5,591,295.92, and 18,344,146.7 / 5,591,295.92 = 3.280839895... = 1 / 0.3048 on every one of + the 17 rows. So 1.4.3 divided by the appended `+to_meter=0.3048` (emitting feet) and the + current build ignores it (emitting metres, per the canonical `+units=m`). The direction is + the one upstream specifies. + + Units: `fx`/`fy` are the target's units and that is the point of the row -- the baseline is + in feet and the current value is in metres. The 1e6 floor is ten orders of magnitude above + the sub-millimetre transverse-Mercator drift that also touches `mod/tmerc/to_meter` and + `mod/utm/to_meter`, so this rule explains the unit flip and vouches for nothing else. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["mod/lcc/to_meter", "mod/merc/to_meter", "mod/tmerc/to_meter", "mod/utm/to_meter"] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e6, max: 1.0e8} + + # --------------------------------------------------------------------------------------------- + - id: NUM-ELLIPSOID-SPHERE-IS-NORMAL-SPHERE + status: active + expires: 2027-06-30 + # PINNED at 5 = one key x 5 probes. `ellps/sphere` is the only key in the suite that names this + # ellipsoid: no registry def and no test CSV uses `+ellps=sphere`, which is the synthetic + # matrix earning its keep for the second time in this file. + expected_rows: 5 + reason: | + `Ellipsoid.SPHERE`'s equator radius changes 6,371,008.7714 -> 6,370,997.0 m. + + 6,371,008.7714 is the GRS80 AUTHALIC radius -- the radius of the sphere with the same surface + area as GRS80 -- which is a real quantity but not the one upstream binds. 9.8.1:src/ellps.cpp + defines `{"sphere", "a=6370997.0", "b=6370997.0", "Normal Sphere (r=6370997)"}`, the classical + "normal sphere" of the US Coast and Geodetic Survey. Two different spheres, both defensible, + and PROJ compatibility decides. + + THE SIZE OF THE CHANGE, stated so that the magnitude band is physics and not an observation: + 11.7714 / 6,371,008.7714 = 1.848 ppm, which is 0.41 m at 222 km from the origin and 11.8 m at + a quarter of the way round the world. The observed spread over the five probes is 8.98 .. 11.90 + m in `fx`/`fy` (metres -- the host projection for the `ellps/` sweep is `merc`, a + projected target), so the band is 1 .. 100 m: comfortably around what a 1.848 ppm scale can + produce at these probes and comfortably below anything structural. + + Unambiguously intended, and one of the very few changes in this suite whose entire effect is a + single scale factor. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["ellps/sphere"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0, max: 1.0e2} + + # --------------------------------------------------------------------------------------------- + - id: NUM-ELLIPSOID-AIRY-EXACT-INVERSE-FLATTENING + status: active + expires: 2027-06-30 + # PINNED at 5 = one key x 5 probes. + expected_rows: 5 + reason: | + `Ellipsoid.AIRY` was defined by a ROUNDED semi-minor axis; it is now defined by the exact + inverse flattening, per 9.8.1:src/ellps.cpp's `{"airy", "a=6377563.396", "b=6356256.910", + ...}` read together with how upstream derives the shape. The numerical effect is 0.76 mm at + the ellipsoid's own scale, and the observed movement over the five probes is + 9.79e-4 .. 1.17e-3 m in `fy` -- about 1 mm, which is that 0.76 mm carried through a Mercator + northing at latitudes 40..50. + + Recorded separately from NUM-ELLIPSOID-SPHERE-IS-NORMAL-SPHERE, and pinned rather than left + to NUM-KARNEY-LATITUDE-CORE, for one reason worth stating: a millimetre is ABOVE that rule's + 1e-6 band, so without this rule these five rows would be UNEXPLAINED, and a reader would have + to rediscover that a 1 mm move on `ellps/airy` is a definition change rather than drift. + `Ellipsoid.AIRY` is also the ellipsoid behind `Datum.OSGB36`, whose own correction is claimed + by DATUM-LEGACY-OSGB36-PRECISION below at a comparable 3 mm; the two are independent changes + to the same CRS family and are kept apart on purpose. + + Band 1e-4 .. 1e-2 metres: two orders either side of the observed millimetre, which excludes + both the Karney band below it and anything structural above it. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["ellps/airy"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-4, max: 1.0e-2} + + # --------------------------------------------------------------------------------------------- + - id: DATUM-LEGACY-CARTHAGE-ELLIPSOID + status: active + expires: 2027-06-30 + # PINNED at 25 = 5 registry defs x 5 probes. Structural: these are every def in all five + # dictionaries carrying `datum=carthage` -- epsg:2088, epsg:22332, epsg:22391, epsg:22392, + # epsg:4223 -- and the count is 5 x 5 with no probe exceptions. Measured 2026-08-01. + expected_rows: 25 + reason: | + `Datum.CARTHAGE` bound `Ellipsoid.CLARKE_1880` where 9.8.1:src/datums.cpp:51-52 says + `clrk80ign`: + + {"carthage", "towgs84=-263.0,6.0,431.0", "clrk80ign", "Carthage 1934 Tunisia"} + + `clrk80ign` is `a = 6378249.2, rf = 293.4660212936269`; `clrk80` is + `a = 6378249.145, rf = 293.4663`. Different ellipsoids -- 55 mm of equatorial radius -- and + the account of it, with the cs2cs measurements, is in `datum/Datum.java`'s CARTHAGE + declaration and in `LegacyDatumTableTest`. + + THE BAND IS THE DEFECT'S OWN SIZE, WHICH IS WHY IT IS THIS TIGHT. 55 mm of `a` propagates to + the observed 46.1 .. 55.0 mm across all 25 rows -- on the two `lcc` defs it shows up mostly in + `fz` (`epsg:22391` probe 0: -36.2298657 -> -36.2776862 m), on `epsg:4223` (longlat) in the + geographic ordinates, on the `tmerc` and `utm` defs in `fx`. Band 1e-2 .. 1e-1 metres. + + WHAT THAT BAND PROTECTS. Two of the five defs are `tmerc` and one is `utm`, and the + transverse-Mercator kernel is being rewritten concurrently with a sub-millimetre residue + visible on 16,000 other rows in this suite. At 1e-2 the floor is two orders above that + residue, so this rule cannot absorb it; and at 1e-1 the ceiling is two orders below anything + a projection change would produce, so it cannot absorb that either. If a tmerc change ever + moves one of these rows by more than 100 mm, the rule declines it and the row is reported. + match: + classifications: [CHANGED] + sections: [REG] + keys: ["epsg:2088", "epsg:22332", "epsg:22391", "epsg:22392", "epsg:4223"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-2, max: 1.0e-1} + + # --------------------------------------------------------------------------------------------- + - id: DATUM-LEGACY-OSGB36-PRECISION + status: active + expires: 2027-06-30 + # PINNED at 10 = 2 registry defs x 5 probes: epsg:4277 (OSGB 1936 geographic) and epsg:27700 + # (British National Grid). Every def in the five dictionaries carrying `datum=OSGB36`. + expected_rows: 10 + reason: | + Four of `Datum.OSGB36`'s seven Helmert terms were truncated. 9.8.1:src/datums.cpp:59-60: + + {"OSGB36", "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", + "airy", "Airy 1830"}, + + proj4j carried `542.06, 0.15, 0.247, 0.842, -20.489`, which is EPSG:1314 -- *OSGB36 to WGS 84 + (6)* -- a real but coarser transformation, so the numbers looked plausible rather than wrong. + The full account, including why a `cs2cs +datum=OSGB36` comparison shows 1.78 m rather than + this (it promotes to the OSTN15 grid) is in `datum/Datum.java`'s OSGB36 javadoc and + `datum/audit/LegacyDatumAreaOfUseTest`. + + Observed 2.55 .. 3.26 mm over the ten rows, which matches that javadoc's independently + derived "about 3 mm across Great Britain, largest observed 3.5 mm of easting at 7.5 W". Band + 1e-3 .. 1e-2 metres, i.e. one order either side. + + NOTE THE COUPLING, because it is the kind that produces a puzzling COUNT_MISMATCH later: + OSGB36's ellipsoid is `Ellipsoid.AIRY`, which changed in the same release and is claimed by + NUM-ELLIPSOID-AIRY-EXACT-INVERSE-FLATTENING at a comparable 1 mm. These ten rows therefore + carry BOTH changes superimposed, and the 2.55 .. 3.26 mm is the sum. That is stated rather + than separated because the golden regime cannot separate them -- one release, one row -- and + pretending otherwise would be a fiction. `epsg:27700` is also a `tmerc`, so the same + floor-of-1e-3 argument as DATUM-LEGACY-CARTHAGE-ELLIPSOID applies: it is an order above the + concurrent sub-millimetre tmerc residue. + match: + classifications: [CHANGED] + sections: [REG] + keys: ["epsg:4277", "epsg:27700"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-3, max: 1.0e-2} + + # --------------------------------------------------------------------------------------------- + - id: NUM-ELLIPSOID-FOUR-NAMES-ADDED + status: active + expires: 2027-06-30 + # PINNED at 20 = 4 ellipsoid names x 5 probes. Structural. + # + # THIS RULE WAS DELIBERATELY NOT WRITTEN IN THE PREVIOUS TRIAGE, AND THE REASON IT IS + # WRITTEN NOW IS THE ONLY THING THAT CHANGED. golden/README.md's "Left unexplained on + # purpose: the four new ellipsoids" section refused it because the same four entries added + # to `Ellipsoid.ellipsoids` were the suspected cause of four failing `core` tests + # (`ProjJsonTest` x2, `Wkt1ReaderTest`, `Wkt2ReaderTest`) via `io/wkt/WktNames.java:276`, + # which matches ellipsoids NUMERICALLY against that array -- so a fifth entry with the same + # axes changes which name is emitted. The open question was whether to re-pin those tests or + # revert the array, and "if it is reverted a rule here becomes a DEAD_RULE within the hour". + # + # It was not reverted. On the frozen tree of 2026-08-01 (late triage) `core`'s 8 remaining + # test failures are `CoordinateTransformTest` x2, `InventedHeightTest` x4, `MetaCRSTest` and + # `Proj4JSTest` -- NO `ProjJsonTest`, NO `Wkt1ReaderTest`, NO `Wkt2ReaderTest`. The emission + # side was resolved, the array stands, and the parse side can now be declared. + expected_rows: 20 + reason: | + `SYN ellps/{GSK2011, PZ90, clrk80ign, danish}`, all five probes each: + `EXC:InvalidValueException: crs-tgt: Unknown ellipsoid: ` -> `OK`. + + All four ship in 9.8.1:src/ellps.cpp, read verbatim from the table rather than from any + summary of it: + + {"danish", "a=6377019.2563", "rf=300.0", "Andrae 1876 (Denmark, Iceland)"} :18 + {"GSK2011", "a=6378136.5", "rf=298.2564151", "GSK-2011"} :21 + {"clrk80ign", "a=6378249.2", "rf=293.4660212936269", "Clarke 1880 (IGN)."} :26 + {"PZ90", "a=6378136.0", "rf=298.25784", "PZ-90"} :48 + + `clrk80ign` is the same ellipsoid DATUM-LEGACY-CARTHAGE-ELLIPSOID above binds to + `Datum.CARTHAGE`; that rule claims the 25 registry rows where the BINDING changed, this + one claims the 5 synthetic rows where the NAME became resolvable. Two changes, one + ellipsoid, kept apart because a future revert of either must show up as a distinct + COUNT_MISMATCH. + + The baseline side is all-NaN by construction -- the CRS could not be built -- so nothing + numeric is absorbed and no regression can hide here. `inside` moves `-` -> `F` for the + reason PROJ-MOD-STER-GS50-DOMAIN-REFUSED spells out: `-` means `Projection.inside` was + never called because there was no CRS, `F` is a real answer from a real Mercator (the + host projection of the `ellps/` sweep). Whether the coordinates are right is gie's + question; all this rule records is that four names upstream has resolve here too. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["ellps/GSK2011", "ellps/PZ90", "ellps/clrk80ign", "ellps/danish"] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-AITOFF-HAMMER-WINTRI-INVERSES-LANDED + status: active + expires: 2027-06-30 + # PINNED at 13, and the 13 rather than 15 is the shape of the defect, not a shortfall: + # `proj/hammer` contributes 5, `proj/aitoff` and `proj/wintri` 4 each, because probe 0 sits + # at the canonical `+lon_0=10 +lat_0=45` origin where an inverse that is 20 degrees wrong in + # longitude still returns the right longitude -- the offset from centre is zero. Those two + # probe-0 rows do move, by 1.4e-14 and 7.1e-15 degrees, and are claimed by + # NUM-KARNEY-LATITUDE-CORE. If either ever exceeds this rule's 1e-6 floor the count goes to + # 14 or 15 and the gate asks why, which is the correct behaviour. + expected_rows: 13 + reason: | + THE THREE PROJECTIONS THAT LEFT FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY'S LIST BY GAINING + AN INVERSE. That rule's `expected_rows` note has the upstream citations + (`aitoff.cpp:200-201` is the shared setup for both `aitoff` and `wintri`; + `hammer.cpp:86-87`); this rule is what happens to their rows instead. + + All three are `OK -> OK`, and what moved is checkable rather than asserted: `ix`/`iy` now + return the COMMITTED PROBE, which `probes.tsv` puts at longitude + 10 / -11.2132034 / 31.2132034 and latitude 45 / 30 / 60. Before, 1.4.3's + `Projection.projectInverse` identity ran instead of a real inverse and handed the + projected metres back as radians: + + proj/aitoff probe 1 ix -9.22985069 -> -11.2132034, iy 30.1588659 -> 30 + proj/hammer probe 3 ix -2.21244256 -> -11.2132034, iy 57.4596376 -> 60 + proj/wintri probe 3 ix -3.15241418 -> -11.2132034, iy 60.1122467 -> 60 + + AITOFF AND HAMMER MOVE ONLY IN THE INVERSE. Their forwards are unchanged to the last + digit at every probe except a 1-ULP flicker on `fx` at probe 2 (2140657.19 and + 2113536.36, same to nine digits), so on those two keys this rule is as safe as + PROJ-INVERSE-CORRECTED-ROUND-TRIP-NOW-EXACT's `dimensions: [ix, iy, iz]` clause. + + WINKEL TRIPEL'S FORWARD ALSO MOVED, AND THE ARITHMETIC IS EXACT, WHICH IS WHY IT IS IN + THIS RULE RATHER THAN LEFT UNEXPLAINED. `proj/wintri` probe 1 moves `fx` + -1,821,999.25 -> -2,092,863.41 m. Upstream's Winkel Tripel is the mean of the Aitoff and + an equirectangular on the standard parallel, `x = (x_aitoff + lam * cos(phi_1)) / 2`, and + 9.8.1:src/projections/aitoff.cpp:217-234 -- `PJ_PROJECTION(wintri)` -- reads `+lat_1` + when it is present and only falls back to `cosphi1 = 0.636619772367581343` (which is + 2/pi, i.e. phi_1 = 50d28', Bartholomew's parallel) when it is ABSENT. 1.4.3 hard-coded + the 2/pi and ignored `+lat_1` entirely. The canonical synthetic set carries `+lat_1=30`, + so: + + lam = -21.2132034 deg = -0.370246 rad ; a = 6378137 + x_aitoff = -2,140,657.19 (unchanged, and observable in the + proj/aitoff row above) + a * lam * cos(30 deg) = -2,045,069.6 <- the current build + a * lam * (2/pi) = -1,503,347 <- what 1.4.3 used + (x_aitoff + -2,045,069.6)/2 = -2,092,863.4 = the current fx, to the digit + (x_aitoff + -1,503,347)/2 = -1,822,002 = the baseline fx, to the digit + + Both halves of that check reproduce a MEASURED value from a formula, in both directions, + so the mechanism is confirmed rather than plausible. + + Band 1e-6 .. 1e6: the floor keeps this rule out of NUM-KARNEY-LATITUDE-CORE's band (and + is what leaves the two probe-0 rows there), the ceiling is above the largest observed + movement of 2.71e5 (metres on `fx`; the `ix`/`iy` movements are degrees -- see the units + warning at the top of this file -- and the largest of those is 8.4 degrees). + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/aitoff", "proj/hammer", "proj/wintri"] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-6, max: 1.0e6} + + # --------------------------------------------------------------------------------------------- + - id: PROJ-NSPER-REQUIRES-A-POSITIVE-H-RATIO + status: active + expires: 2027-06-30 + # PINNED at 5 = one key x 5 probes. + expected_rows: 5 + reason: | + THE FOURTH NAME THAT LEFT FAILCLOSED-NO-INVERSE-FOR-FORWARD-ONLY, AND THE ONLY ONE OF THE + FOUR THAT LEFT BY GETTING STRICTER RATHER THAN BY GAINING AN INVERSE. `SYN proj/nsper` + moves `OK` -> `EXC:InvalidValueException` at all five probes, with the message + + crs-tgt: +h=0.0 gives h/a = 0.0, which nsper rejects: upstream requires 0 < h/a <= 1e10 + (nsper.cpp:155-159). The bound is on the ratio, not on h. + + This is the only `OK -> ProjectionException`-family transition in the whole unexplained + set that is not the reserved ETM domain cluster, so it is worth being explicit that it is + a fail-closed improvement and not a capability loss. + + UPSTREAM, READ RATHER THAN RECALLED. 9.8.1:src/projections/nsper.cpp, `nsper_setup`: + + Q->height = pj_param(P->ctx, P->params, "dh").f; + ... + Q->pn1 = Q->height / P->a; /* normalize by radius */ + if (Q->pn1 <= 0 || Q->pn1 > 1e10) { + proj_log_error(P, _("Invalid value for h")); + return pj_default_destructor(P, PROJ_ERR_INVALID_OP_ILLEGAL_ARG_VALUE); + } + + `+h` has no default, so an absent `+h` is `0.0`, `pn1` is `0.0`, and upstream refuses to + build the operation. The canonical synthetic parameter set is + `+ellps=GRS80 +lat_0=45 +lon_0=10 +lat_1=30 +lat_2=60 +x_0=0 +y_0=0 +units=m` and carries + no `+h`, so every `proj/nsper` probe is that case. 1.4.3 built the projection anyway with + a satellite at the centre of the Earth and returned five coordinates for it. + + A NOTE FOR THE PROJECTION'S OWNER, NOT A REASON TO DECLINE THE ROWS: the message cites + `nsper.cpp:155-159` and the guard is at `:159-161` in 9.8.1 (`:158` is the `pn1` + assignment). Three lines off, in a message this suite reproduces verbatim. Cosmetic, in + `core/**`, and out of this module's scope. + + Baseline is a coordinate and the current side is all-NaN, which is the opposite direction + from most of this file: the rule therefore vouches for nothing numeric, it records that + five plausible-looking coordinates for an impossible satellite altitude are now an error. + `inside` moves because the CRS no longer builds. + match: + classifications: [CHANGED] + sections: [SYN] + keys: ["proj/nsper"] + status_from: "OK" + status_to: "EXC:org.locationtech.proj4j.InvalidValueException" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-POLYCONIC-INVERSE-CONVERGES + status: active + expires: 2027-06-30 + # PINNED at 6 = five REG keys at probe 0 plus SYN proj/poly at probe 0. Probe 0 only, on + # every one of the six, and that is the defect's own shape rather than a coincidence: see + # the reason. + # RE-PINNED 2026-08-01 by the FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED stream, which is + # ordered first in this file. 2 of this rule's rows are +datum=NAD27 CRS whose transform + # now raises COORDINATE_OUTSIDE_GRID instead of returning a coordinate, so they have no + # numeric movement left for this rule to describe and that rule claims them. The mechanism + # this rule states is unchanged and is still true of the 4 that remain; only the + # population it applies to shrank. Verified on a frozen A/B, and the arithmetic is + # itemised in that rule's reason. + expected_rows: 4 + reason: | + `EXC:InvalidValueException: inv: Infinite longitude` -> `OK` on + `epsg:5472`, `esri:102766`, `esri:65061`, `esri:65161`, `nad27:5400` and `SYN proj/poly`. + golden/README.md's second triage lists exactly these six and leaves them unexplained + pending an owner; the owner has landed and the mechanism is in the source. + + THE DEFECT WAS A FACTOR OF 150 IN THE NEWTON DENOMINATOR. + `proj/PolyconicProjection.projectInverse`'s ellipsoidal branch now reads + + // 9.8.1:poly.cpp:88 is one_es / (mlp^3), i.e. (1 - es); proj4j had + // (1 / es), which for GRS80 is 149 -- off by a factor of 150. + mlp = one_es / (mlp * mlp * mlp); + + `one_es` is `1 - es` = 0.99331 for GRS80 and `1/es` is 149.0, so the derivative term the + iteration divides by was wrong by 150x and the iteration diverged instead of converging; + the resulting non-finite longitude was then reported by a downstream finiteness test as + `Infinite longitude`, i.e. as if the INPUT had been bad. It was not; the iteration was. + + WHY PROBE 0 AND ONLY PROBE 0, WHICH IS THE PART THAT MAKES THIS A MECHANISM RATHER THAN A + ROW LIST. A diverging Newton iteration on the polyconic fails first where the correction + term is largest relative to the seed, and for these six the probe-0 easting is the one + that put `dPhi` outside the basin. The other four probes of each key converged in 1.4.3 + as well -- to the WRONG place, by 1.6 to 11.7 km -- and those rows are `OK -> OK` and are + claimed by PROJ-POLYCONIC-KERNEL-CORRECTED immediately below, not here. One defect, two + row shapes, two rules, because a single rule would need both a magnitude band and + all-NaN endpoints and cannot have both. + + Both endpoints of these six rows are an exception on the baseline side, so there is no + baseline number to absorb. + match: + classifications: [CHANGED] + tgt_proj: [poly] + status_from: "EXC:org.locationtech.proj4j.InvalidValueException" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + # --------------------------------------------------------------------------------------------- + - id: PROJ-POLYCONIC-KERNEL-CORRECTED + status: active + expires: 2027-06-30 + # PINNED at 51 = the `OK -> OK` remainder of the polyconic set on REG and SYN: 11 registry + # keys (epsg:29100 29101 5472 5530 5880, esri:102766 29100 54021 65061 65161, nad27:5400) + # and `SYN proj/poly`, at the probes that converged in 1.4.3. Six further rows are the + # probe-0 status transitions claimed by PROJ-POLYCONIC-INVERSE-CONVERGES above. + # + # SECTION CSV IS DELIBERATELY EXCLUDED and the 5 `proj4-epsg.csv` polyconic rows are left + # UNEXPLAINED. That file is inside the reserved 1,163-row re-pin (golden/README.md, + # "Reserved for the transverse-Mercator stream"), which is still awaiting a user decision, + # so its rows are still moving and nothing in this pass claims any of them. + # RE-PINNED 2026-08-01 by the FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED stream, which is + # ordered first in this file. 8 of this rule's rows are +datum=NAD27 CRS whose transform + # now raises COORDINATE_OUTSIDE_GRID instead of returning a coordinate, so they have no + # numeric movement left for this rule to describe and that rule claims them. The mechanism + # this rule states is unchanged and is still true of the 43 that remain; only the + # population it applies to shrank. Verified on a frozen A/B, and the arithmetic is + # itemised in that rule's reason. + expected_rows: 43 + reason: | + The `OK -> OK` half of the polyconic fix whose inverse half is + PROJ-POLYCONIC-INVERSE-CONVERGES above. Three defects, each carrying its own upstream + line reference in `proj/PolyconicProjection.java`: + + * FORWARD, `9.8.1:poly.cpp:37-40` -- `lam` is scaled by `sin(phi)` FIRST and both the + easting and the northing are then built from the scaled value. + * INVERSE, spherical, `9.8.1:poly.cpp:112` -- upstream MUTATES `xy.y` to + `phi0 + xy.y` and uses the mutated value both as the iteration seed and inside `B`. + proj4j tested the sum and then reverted to the raw northing, so the spherical inverse + ignored `+lat_0` entirely. + * INVERSE, ellipsoidal, `9.8.1:poly.cpp:88` -- the `one_es / mlp^3` term, quoted in + full under PROJ-POLYCONIC-INVERSE-CONVERGES. + + Observed movement 0.258 m .. 1.17e4 m, in metres (`poly` is a projected target + throughout; the `ix`/`iy` columns of these rows also move, in degrees, and by up to 43 + degrees on the synthetic key where the inverse was simply wrong). `SYN proj/poly` probe 1 + is the clearest single row: `fx` -2,033,409.06 -> -2,035,112.75 and + `iy` -12.65005 -> 30 -- the committed probe latitude, exactly, where 1.4.3 answered 42 + degrees away. + + SCOPED BY `tgt_proj: [poly]` RATHER THAN BY KEY, deliberately, because the mechanism is a + property of the projection and every `+proj=poly` target in REG and SYN is affected -- + the same argument PROJ-EQC-EQDC-SINU-REGISTRY-ROWS makes. Band 1e-1 .. 1e5: the floor is + three orders above the sub-millimetre residue that sits on everything in this suite, so + this rule cannot absorb drift, and the ceiling is one order above the largest observed + movement. + + IT VOUCHES FOR NO COORDINATE. Whether the polyconic is now RIGHT is gie's question, per + this file's opening policy. + match: + classifications: [CHANGED] + sections: [REG, SYN] + tgt_proj: [poly] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-1, max: 1.0e5} + + # --------------------------------------------------------------------------------------------- + - id: PROJ-TMERC-PODER-ENGSAGER-DEFAULT + status: active + expires: 2027-06-30 + # PINNED at 14724, and this is the largest claim in the file by two orders of magnitude, so + # the pin matters more here than anywhere else. It decomposes as 14,723 REG + 1 SYN. It is + # NOT structural -- it is every REG/SYN transverse-Mercator row whose movement lands in the + # band, and which rows those are depends on how far each CRS's probes fall from its own + # central meridian. Two things will move it and both should be looked at rather than + # re-pinned reflexively: + # * a further change to the transverse-Mercator kernel, which is the point of the pin; + # * anything that moves a datum-shifted tmerc/utm row ACROSS the 1 cm ceiling, in either + # direction. 380 REG tmerc/utm rows carrying `datum=NAD27` already sit ABOVE the + # ceiling, on the NADCON grid shift, and are deliberately not claimed here. + # + # Measured 2026-08-01 (late triage) on a frozen /tmp snapshot with one live stream + # (`BasicCoordinateTransform` plus three test files) excluded by the freeze. That stream's + # open `InventedHeightTest` work keys on `Double.isNaN(src.z)`, and `GoldenGenerator.java:273` + # sets `in.z = 0.0` unconditionally, so it cannot reach these rows -- checked, because a pin + # this large deserves to know what can invalidate it. + # RE-PINNED 2026-08-01 by the FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED stream, which is + # ordered first in this file. 686 of this rule's rows are +datum=NAD27 CRS whose transform + # now raises COORDINATE_OUTSIDE_GRID instead of returning a coordinate, so they have no + # numeric movement left for this rule to describe and that rule claims them. The mechanism + # this rule states is unchanged and is still true of the 14038 that remain; only the + # population it applies to shrank. Verified on a frozen A/B, and the arithmetic is + # itemised in that rule's reason. + expected_rows: 14038 + reason: | + PROJ 9.8.1 RUNS PODER/ENGSAGER FOR `+proj=tmerc` AND `+proj=utm`; PROJ4J UP TO 1.4.3 ALWAYS + RAN EVENDEN/SNYDER. This is the single largest behavioural change in the release and the + largest cluster this regime has ever reported. `proj/TransverseMercatorProjection.java`'s + class javadoc states it as a deliberate breaking change -- "Every existing Proj4J user's + UTM and State-Plane output moves. That is the fix, not an accident" -- with upstream's own + selection at `proj_internal.h:840-841` and `data/proj.ini`'s + `tmerc_default_algo = poder_engsager`. + + THE MECHANISM PREDICTS WHICH ROWS MOVE AND BY HOW MUCH, WHICH IS THE STANDARD THIS FILE + SETS (golden/README.md: "A mechanism that predicts which rows move *and* which do not is + the standard; a row list is not"). The two series differ as a function of distance from + the central meridian, and that javadoc tabulates it independently of this suite: + + 2 deg about 2 micrometres + 6 deg about 0.9 mm + 20 deg metres + 45 deg kilometres + + MEASURED AGAINST THAT PREDICTION, on this suite's own rows. Every REG transverse-Mercator + probe was bucketed by its angular distance from its own definition's `lon_0` (or `lonc`, + or the `zone` central meridian): + + bucket rows median movement + 0-5 deg 112 37 m <- NOT this mechanism; see below + 5-10 deg 14,748 2.53e-4 m <- this mechanism, and 0.25 mm at 5-10 deg is + exactly the javadoc's 0.9 mm at 6 deg + 60-65 deg 164 120 m <- NOT this mechanism; see below + + The 5-10 degree bucket is where the registry dictionaries put almost every UTM zone and + State Plane zone, and its median is the predicted sub-millimetre. The 0-5 and 60-65 + buckets are dominated by something else entirely -- 37 m and 120 m at 0-5 degrees from the + central meridian is impossible for a series-truncation difference, which is smallest + there -- and that something else is the NADCON grid shift now being applied to + `datum=NAD27` definitions. THE BAND IS WHAT SEPARATES THEM, and it does so cleanly: the + NAD27 population is 3.7 m to 378 m and this rule stops at 1 cm. + + WHAT THE 1e-2 CEILING GUARANTEES, STATED PRECISELY, BECAUSE `magnitude` IS THE MAXIMUM + OVER THE MOVED COLUMNS AND THOSE COLUMNS HAVE DIFFERENT UNITS. No claimed row moves by + more than 1e-2 in ANY column -- 10 mm for `fx`/`fy`/`fz` on a projected target, and 0.01 + degrees on the always-degrees `ix`/`iy`/`iz`, which would be 1.1 km and is the loose end + of the bound. So it was measured directly over all 14,724 claimed rows: + + fx max 3.502e-3 m (REG epsg:20790 probe 0) + fy max 7.301e-4 m (REG epsg:29901 probe 0) + fz max 5.540e-4 m (REG epsg:29901 probe 3) + ix max 1.214e-6 deg (REG epsg:27391 probe 0) = 13 cm + iy max 1.018e-7 deg (REG epsg:27391 probe 0) = 1.1 cm + iz max 1.166e-6 m + + The degree-valued columns are four orders of magnitude below the ceiling, so in practice + the band is a 3.5 mm bound and the maximum is always driven by `fx`. If a future change + ever pushes an inverse column up towards 0.01 degrees this rule would still claim the row, + which is the one hole in it and is why it is written down here rather than left implied. + + THE INVERSE GETTING **BETTER** IS VISIBLE IN THESE ROWS AND IS PART OF THE CHANGE. + `REG epsg:2000` (Antigua, `+proj=tmerc +lon_0=-62`, probes 5 degrees out) moves `fx` by + 2.60e-4 m and its round trip moves from `ix = -66.99999999825083` to `-67.0` EXACTLY, and + `iy` from `-4.999999999921043` to `-5.0` exactly -- the committed probe, to the bit. The + Evenden/Snyder round trip was 1.7e-9 degrees short; Poder/Engsager is exact. That is the + 1 nm accuracy the javadoc claims, observed. + + FOUR THINGS THIS RULE DELIBERATELY DOES NOT CLAIM, each left UNEXPLAINED with an owner: + * The 332-row `Extended Transverse Mercator: longitude ... outside the projection + domain` cluster (`OK -> ProjectionException`). Reserved by golden/README.md; a rule + here would be a rule for a bug. It is excluded structurally, by `status_from: OK` and + `status_to: OK`. + * Section `CSV` in its entirety -- 1,248 unexplained `proj4-epsg.csv` transverse-Mercator + rows, inside the reserved 1,163-row re-pin that is still awaiting a user decision. + 157 of them are below this rule's ceiling and would have been claimed; they are not, + because "still moving" beats "would have matched". + * Section `PAIR` in its entirety -- 346 rows, all of them ABOVE the ceiling anyway + (1e3 .. 1.8e12 metres), which are transverse-Mercator targets probed thousands of + kilometres outside their own zone, where BOTH series are meaningless. A change from + one meaningless number to another is not something this rule should dignify. + * Everything at or above 1 cm on REG and SYN -- 686 REG rows (380 of them `datum=NAD27`) + and 104 SYN rows. + + Floor 1e-6 so that NUM-KARNEY-LATITUDE-CORE keeps the sub-micrometre drift it exists for; + the smallest movement claimed here is 1.373e-6. + + ORDERED AFTER DATUM-LEGACY-OSGB36-PRECISION AND DATUM-LEGACY-CARTHAGE-ELLIPSOID ON + PURPOSE, AND IT MATTERS. `epsg:27700` is a `tmerc` whose rows move 2.55 .. 3.26 mm, which + is INSIDE this rule's band; placed earlier, this rule would have taken all ten OSGB36 rows + and turned a pinned datum-precision rule into a COUNT_MISMATCH -- the same laundering + PARSE-NO-KEYWORD-ALLOWLIST committed against PARSE-R-DECLARES-SPHERE and that this file's + ordering discipline exists to prevent. Verified on the frozen tree: neither `epsg:27700` + nor `epsg:4277` appears among the 14,724 rows this rule claims. `DATUM-LEGACY-CARTHAGE`'s + four transverse-Mercator keys are above the ceiling at 46 .. 55 mm and so are safe in + either order, but they are ordered first for the same reason. + match: + classifications: [CHANGED] + sections: [REG, SYN] + tgt_proj: [tmerc, utm] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + magnitude: {min: 1.0e-6, max: 1.0e-2} + + # --------------------------------------------------------------------------------------------- + # ORDERED IMMEDIATELY BEFORE NUM-KARNEY-LATITUDE-CORE, and that placement is the whole point. + # NUM-KARNEY-LATITUDE-CORE matches EVERY changed row under 1e-6 and is pinned at 19,324; without + # this rule ahead of it the two rows below are absorbed there and it reads 19,326, which is + # exactly the COUNT_MISMATCH that found them. The big provisional rule keeps its count and this + # change owns its own rows, by name. + - id: NUM-LAEA-HYPOT-TO-NORM2 + status: active + expires: 2027-06-30 + # PINNED at 2, and the two keys are ENUMERATED rather than globbed. Measured 2026-08-03 on a + # frozen A/B: two full golden runs from one tree differing in exactly one file, + # proj/LambertAzimuthalEqualAreaProjection.java, nothing else touched between them. Without the + # change: 41,416 CHANGED / 39,125 INTENDED / 2,291 UNEXPLAINED and no COUNT_MISMATCH. With it: + # 41,418 / 39,127 / 2,291 and NUM-KARNEY-LATITUDE-CORE 19,324 -> 19,326. The delta is +2 in + # CHANGED and +2 in INTENDED and ZERO in UNEXPLAINED, so these two rows are the entire blast + # radius and they were UNCHANGED before. + # + # The two rows, by diff of the two runs' golden-report.tsv: + # proj4-epsg.csv:00619 probe 0 EPSG:4326 -> EPSG:2163 moved ix,iy mag 0x1.dp-47 + # proj4-epsg.csv:01495 probe 0 EPSG:4326 -> EPSG:3409 moved iy mag 0x1.ccp-47 + expected_rows: 2 + reason: | + Math.hypot replaced by MathHelpers.norm2 at LambertAzimuthalEqualAreaProjection:274 and :314, + the two sites in laea's INVERSE. Both compute sqrt(a*a + b*b); hypot adds fdlibm's overflow + scaling, costs roughly ten times a sqrt, and is what MathHelpers' own javadoc says not to use + when the operands are bounded -- which these are, being the projected coordinate already + divided by the semi-major axis. The same substitution was made in etmerc earlier and + SolverBenchmark measures the pair head to head. + + WHY EXACTLY TWO ROWS, when the dictionary holds far more laea definitions. Both changed sites + are in projectInverse; the forward is untouched, and both moved rows moved ONLY in ix/iy, the + inverse columns. That is the signature and it is why `dimensions` below excludes fx/fy/fz. + EPSG:2163 (+proj=laea +lat_0=45 +lon_0=-100 +a=+b=6370997) and EPSG:3409 (+proj=laea + +lat_0=-90 +a=+b=6371228) are both SPHERICAL, so both take projectInverse_s and site :274. + Every other laea row either round-trips to the same double anyway or takes a path where the + last-bit difference is absorbed before it reaches a printed column -- population is not blast + radius, and the measured count is 2 out of the whole laea family. Note EPSG:3408, the north + polar twin of 3409 one line earlier in the same file, did NOT move. + + THE BAND IS AN ULP ARGUMENT, not a round number. The two magnitudes are 0x1.dp-47 = + 1.279e-14 and 0x1.ccp-47 = 1.270e-14, in the always-degrees inverse columns. ulp(45.0) is + 7.11e-15 and ulp(90.0) is 1.42e-14, so both moves are one to two ulp of a latitude of that + size -- i.e. the last bit of the inverse, which is precisely what swapping one correctly + rounded sqrt formulation for another can do and all it can do. The ceiling of 1e-13 is about + seven ulp at 45 degrees; anything larger is not a last-bit difference and must stay + UNEXPLAINED rather than being dignified by this rule. It is also seven orders of magnitude + below the 1e-6 that NUM-KARNEY-LATITUDE-CORE would have allowed it. + + CONFORMANCE DID NOT MOVE: 7,441/7,900, regressed 0, measured on the same tree. + match: + classifications: [CHANGED] + sections: [CSV] + keys: ["proj4-epsg.csv:00619", "proj4-epsg.csv:01495"] + probes: [0] + expect: + dimensions: [ix, iy] + allow_status_change: false + allow_inside_change: false + allow_nonfinite: false + magnitude: {min: 0.0, max: 1.0e-13} + + # --------------------------------------------------------------------------------------------- + - id: NUM-KARNEY-LATITUDE-CORE + status: active + expires: 2026-12-31 + # PINNED at 19336, measured 2026-08-01 on a frozen /tmp snapshot, and corroborated independently + # by FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED's reason, which predicts "NUM-KARNEY-LATITUDE-CORE + # 20,191 -> 19,336 (-855)". golden/README.md's 16,202 is an earlier snapshot. + # + # THIS IS THE LARGEST RULE IN THE FILE AND THEREFORE THE ONE A TBD COST MOST. Nineteen thousand + # rows of sub-micron drift, with the band below as the only other constraint, is the single + # easiest place in this suite for an unrelated change to hide -- and while the count was TBD + # nothing was watching its size at all. The rule is still PROVISIONAL and still owned by the + # numerical-core stream (see the reason below); pinning does not adopt it, it makes handing it + # over an event rather than a silence. When that stream lands, this fails with a COUNT_MISMATCH + # naming itself and the owner re-pins it with a band justified per section. + # RE-PINNED 2026-08-01 by the GRIDS-EPSG-SHIP-CONUS stream: proj4j-epsg now ships PROJ + # 9.8.1's `conus` at proj4/nad/conus, so the golden run resolves that grid for the first + # time (golden depends on proj4j-epsg and, unlike core's own tests and the conformance + # module, has no other copy on its classpath). Measured on a frozen /tmp A/B whose two + # trees differ in exactly one byte-bearing file, the grid itself. -12, likewise enumerable: `SYN mod/{lcc,longlat}/nadgrids_conus`, 5 probes each, plus 2 more of + # the same family. Claimed by GRIDS-EPSG-CONUS-SYN-REFUSED. + expected_rows: 19324 + reason: | + PROVISIONAL AND NOT OWNED BY THIS MODULE. Placeholder for the sub-microscopic movement caused by + wiring in PROJ 9.4-9.6's Karney auxiliary-latitude core (9.8.1:src/latitudes.cpp, and the + rewritten mlfn.cpp / phi2.cpp / tsfn.cpp). Measured improvements at GRS80: authlat 1.58 mm -> + 0.7 nm, mlfn 4,920 nm -> < 1 nm, phi2 4,145 nm -> 2.1 nm, tsfn(0) 0.9999999999999999 -> + exactly 1.0. + + The numerical-core owner must replace this rule with one carrying a pinned expected_rows and a + band justified per section. It exists now only so that ~18,000 rows of genuine sub-micron drift + do not bury the ~1,700 rows of structural change underneath them. + + The band is deliberately tight -- 1e-6 in raw column units, i.e. 1 micrometre for a projected + target and ~0.1 m for the always-degrees inverse columns -- because the measured magnitude + distribution is bimodal with an empty valley between 1e-5 and 1e-3. Everything above the band + stays UNEXPLAINED on purpose: that is the backlog. It also refuses status changes, inside + changes and non-finite endpoints, so it cannot absorb anything structural. + + Note the short expiry. This is a migration-window rule, not a specification. + match: + classifications: [CHANGED] + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: false + allow_inside_change: false + allow_nonfinite: false + magnitude: {min: 0.0, max: 1.0e-6} + + # --------------------------------------------------------------------------------------------- + # ORDERED LAST, DELIBERATELY. Its magnitude band (1e-4 .. 1e4) overlaps the top of + # PROJ-TMERC-PODER-ENGSAGER-DEFAULT's (1e-6 .. 1e-2), so placed before that rule it would take its + # NAD27 tmerc rows and turn a pinned count into a COUNT_MISMATCH -- the same hazard that made the + # tmerc rule have to follow DATUM-LEGACY-OSGB36-PRECISION. Verified on the frozen tree that all 852 + # rows this claims were UNEXPLAINED beforehand and that it takes nothing from any other rule. + - id: DATUM-NAD27-NADCON-SHIFT-APPLIED + status: active + expires: 2027-06-30 + # PINNED. Measured 2026-08-01 on the same frozen A/B as + # FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED, with the predicate evaluated against the report before + # the rule was written. 865 REG rows carry datum=NAD27 and are OK -> OK; 852 of them are inside + # the band and 13 are not -- see the last paragraph. + # RE-PINNED 2026-08-01 by the GRIDS-EPSG-SHIP-CONUS stream: proj4j-epsg now ships PROJ + # 9.8.1's `conus` at proj4/nad/conus, so the golden run resolves that grid for the first + # time (golden depends on proj4j-epsg and, unlike core's own tests and the conformance + # module, has no other copy on its classpath). Measured on a frozen /tmp A/B whose two + # trees differ in exactly one byte-bearing file, the grid itself. +1,074, the other side of FAILCLOSED-NAD27-OUTSIDE-GRID-REPORTED's -1,104. The two are one + # migration; the 30-row difference is the rows that land in the three GRIDS-EPSG-CONUS-* rules. + expected_rows: 1926 + reason: | + NAD27 registry CRS now receive the NADCON grid shift. In the 1.4.3 baseline they receive none + at all, so every one of these rows moves by the whole shift. + + THE MECHANISM, and it is a parser fix rather than anything in this module's territory. + parser/Proj4Parser used to call setGrids(null) on the SHARED STATIC Datum.NAD27 singleton + while parsing any +datum=NAD27 definition carrying no +nadgrids token. EPSG:4267 is + `+proj=longlat +datum=NAD27 +no_defs`, so the first NAD27 CRS parsed destroyed the grid list + process-wide -- including its own -- and Datum.getTransformType() flipped + TYPE_GRIDSHIFT -> TYPE_UNKNOWN for all 205 codes on that datum. Every NAD27 row in the 1.4.3 + baseline is therefore unshifted. The parser now copies into a DatumParameters instead, and + Datum.setGrids refuses on NAD27 and POTSDAM outright. This matches PROJ, whose +datum=NAD27 + is nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat. + + WHAT IDENTIFIES IT AS THE DATUM AND NOT A KERNEL. Twelve of these rows have a `longlat` + target -- no projection in the path at all -- and they move 1.71e-4 to 7.18e-4 DEGREES, i.e. + 19 m to 80 m. A projection kernel cannot move a row that runs no projection. epsg:4267 probe 0 + is the cleanest single instance: fx goes from -100.0, the input ECHOED BACK, to -99.99949894. + + THIS RULE COULD NOT BE WRITTEN BEFORE, AND THAT IS WHY THE `datums` COLUMN EXISTS. rules.yaml + had no predicate for a parameter's VALUE: params_present matches KEYS, and `datum` is a key + 1,962 dictionary lines carry. Scoping this cluster by key meant enumerating ~205 keys, which + would also have swept in ~1,066 rows belonging to a live stream -- exactly the shape of rule + this file exists to prevent. golden-index.tsv now carries a sixth column holding the sorted + set of +datum= values on either side, and `datums:` matches ANY-of over it. Five lines of + rule, and the honest UNEXPLAINED paragraph in golden/README.md that stood in for it since the + second triage can go. + + THE BAND, in the raw units this file warns about. 840 of the 852 have a projected target and + move 1.0 m to ~1e3 m; 12 have a geographic target and move 1.71e-4 to 7.18e-4 degrees. One + band has to span both because magnitude is not unit-normalised here, so it is stated as + measured rather than as a round number: floor 1e-4 (below the smallest degree-column move, + above nothing this rule wants), ceiling 1e4. Per-column maxima over the 852: fx 1.43e6 is + EXCLUDED by the ceiling, and within the band fx/fy stay under 1e4 m and ix/iy under + 1.6e-7 deg. The floor also keeps this rule clear of the two sub-millimetre bands + (NUM-KARNEY-LATITUDE-CORE at <=1e-6, PROJ-TMERC-PODER-ENGSAGER-DEFAULT at 1e-6..1e-2), both of + which are ordered ahead of it in any case. + + THE THIRTEEN ROWS THIS DELIBERATELY DOES NOT CLAIM. `esri:26731` and `esri:102120` are omerc + and move 6.1e5 to 2.03e6 metres -- 610 km to 2,030 km. That is not a datum shift by three + orders of magnitude; it is the omerc far field, the same shape this module already declines to + rule for the PAIR residue, where "both series are meaningless out there and a change from one + meaningless number to another is not something a rule should dignify". They stay UNEXPLAINED + and the report will record this rule DECLINING them on magnitude. -> omerc owner. + + NOT CLAIMED EITHER, on the sections' own reserved grounds: the 10 CSV and 29 PAIR NAD27 + OK -> OK rows. CSV is inside the reserved proj4-epsg.csv re-pin and PAIR's residue is + explicitly not to be ruled. `sections: [REG]` is what keeps this rule out of both. + match: + sections: [REG] + datums: [NAD27] + status_from: "OK" + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: false + allow_inside_change: true + allow_nonfinite: false + magnitude: {min: 1.0e-4, max: 1.0e4} + + # --------------------------------------------------------------------------------------------- + # proj4j-epsg now ships PROJ 9.8.1's `conus` (264,424 B, CTABLE V2, blob 44b4900f) at + # proj4/nad/conus. The three rules below claim the 38 rows that move because of it and nothing + # else. They are ordered LAST on purpose: every row they claim was UNEXPLAINED in the measured + # run, so no earlier rule can lose a row to them and the six counts re-pinned above are exactly + # what the frozen A/B measured. + # + # KEYS AND PROBES ARE ENUMERATED, NEVER GLOBBED, and the probe filters are load bearing rather + # than decorative: + # * `mod/tmerc/nadgrids_conus` probes 1-4 were ALREADY UNEXPLAINED before this change (they + # belong to the transverse-Mercator stream, which rules.yaml states is awaiting a user + # decision and whose rows nothing in this pass may claim). Only probe 0 is newly changed, so + # GRIDS-EPSG-CONUS-SYN-TMERC-REFUSED takes probe 0 and leaves the other four where they are. + # * The twelve PAIR keys have all five probes UNEXPLAINED, but only probe 1 is NEW -- the other + # 48 are pre-existing residue. A key-only rule would absorb 48 rows behind this reason, which + # is the exact failure this file was built to prevent. + # Together they take UNEXPLAINED from 2,329 back to 2,291, the pre-change figure -- this stream + # adds no residue and removes none. + + - id: GRIDS-EPSG-CONUS-SYN-REFUSED + status: active + expires: 2027-06-30 + # PINNED at 25 = 5 keys x 5 probes, measured on the frozen A/B before the rule was written. + expected_rows: 25 + reason: | + A CRS that declares `+nadgrids=conus` and is then handed a point in Europe or Africa now + REFUSES instead of quietly returning the point unshifted. + + THE MECHANISM, and it is packaging rather than arithmetic. These synthetic definitions carry + `+nadgrids=conus`. Until now no `conus` existed anywhere on golden's classpath -- golden + depends on proj4j-epsg, which shipped only ntv1_can.dat -- so Grid.fromNadGrids resolved the + token to NOTHING and left the grid list EMPTY. Grid.shift's fail-closed throw fires when a + NON-empty list covers no grid for the point; an empty list is not that case, so the transform + returned the input coordinate and reported success. proj4j-epsg now ships conus, the list is + non-empty, and the refusal path is reachable for the first time. + + WHY REFUSING IS THE CORRECT ANSWER HERE, and it is checkable from the probe file rather than + asserted. conus covers 131W-63W, 20N-50N. The five SYN probe points, decoded from + probes.tsv's hex, are (10, 45), (-11.21, 30), (31.21, 30), (-11.21, 60) and (31.21, 60) -- + every one of them in Europe, Africa or the North Atlantic, between about 4,700 and 12,000 km + outside the grid. A definition that names a US grid and is then asked about Cairo has no + answer, and non-negotiable 3 says the failure must not be expressed as a plausible + coordinate. The old behaviour returned the input unchanged, which is precisely that. + + NOT A REGRESSION AND NOT A WIDENING. The same run shows the CONUS points that ought to shift + now shifting to PROJ 9.8.1's values -- see core's ConusShipsInEpsgArtifactTest, which pins + San Francisco and Kansas against `cct +proj=hgridshift +grids=conus` and keeps Honolulu, + San Juan, Anchorage and the Gulf of Guinea throwing. + + WHERE THESE ROWS CAME FROM. All 25 were INTENDED before this change, attributed to rules that + describe projection and latitude arithmetic -- PROJ-AEA-SPHERICAL-INVERSE (the 5 aea rows) + and NUM-KARNEY-LATITUDE-CORE (the lcc and longlat rows and their family). Those rules + described the numeric drift of a coordinate that should never have been produced. With the + coordinate withdrawn there is no drift left for them to describe, which is why both re-pin + downward by exactly 5 and 12 and why that arithmetic is quoted at each of them. + match: + sections: [SYN] + keys: + - "mod/aea/nadgrids_conus" + - "mod/lcc/nadgrids_conus" + - "mod/longlat/nadgrids_conus" + - "mod/merc/nadgrids_conus" + - "mod/utm/nadgrids_conus" + classifications: [CHANGED] + status_from: "OK" + status_to: "EXC:org.locationtech.proj4j.CrsTransformException" + expect: + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + - id: GRIDS-EPSG-CONUS-SYN-TMERC-REFUSED + status: active + expires: 2027-06-30 + # PINNED at 1. `mod/tmerc/nadgrids_conus` probes 1-4 were UNEXPLAINED before this change and + # stay UNEXPLAINED: they are the transverse-Mercator stream's rows and this file says nothing + # in this pass claims any of them. Probe 0 was UNCHANGED before and is newly CHANGED, so it is + # this stream's row and only it is claimed. Separating one row into its own rule is deliberate: + # folding it into the rule above would have needed a key glob that also swept up the four. + expected_rows: 1 + reason: | + The `+proj=tmerc` member of the GRIDS-EPSG-CONUS-SYN-REFUSED family, split out so that the + four probes belonging to another stream are not absorbed by this one. Same mechanism, same + evidence: `+nadgrids=conus` now resolves, the probe point is outside the grid, and the + transform reports COORDINATE_OUTSIDE_GRID instead of echoing the input back as a success. + + Probe 0 is (10, 45) -- central Europe, roughly 4,700 km east of conus's eastern edge at 63W. + match: + sections: [SYN] + keys: ["mod/tmerc/nadgrids_conus"] + probes: [0] + classifications: [CHANGED] + status_from: "OK" + status_to: "EXC:org.locationtech.proj4j.CrsTransformException" + expect: + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + + - id: GRIDS-EPSG-CONUS-PAIR-NAD27-SHIFTED + status: active + expires: 2027-06-30 + # PINNED at 12 = 12 enumerated keys x probe 1 only. All five probes of these keys are + # UNEXPLAINED, but the other 48 were UNEXPLAINED before this change too and belong to the PAIR + # residue this file explicitly declines to rule. `probes: [1]` is what keeps this rule from + # absorbing them; without it the rule would claim 60 and quietly retire 48 rows of somebody + # else's backlog behind a grid reason. + expected_rows: 12 + reason: | + The positive half, in the PAIR section: NAD27-source pairs whose probe 1 falls INSIDE conus + and which therefore receive a real NADCON shift for the first time. + + Every source here is a NAD27 geographic CRS -- epsg:4267, esri:4267 and esri:104000, which is + ESRI's own NAD27 code -- and the targets are projected CRS in the epsg:2000-21418 range. In + the 1.4.3 baseline these rows received no datum shift at all, because no grid covering the + point existed on the classpath. They now move by the grid shift propagated through the target + projection, 1.88e4 to 4.66e7 in raw column units (projected metres, so the magnitude band is + wide by construction; the enumeration of keys and the single probe are what make this rule + tight, not the band). + + ONE ROW ALSO CHANGES STATUS, which is why allow_status_change is set: + `t43/esri:104000>epsg:20092` probe 1 goes EXC:java.lang.IllegalStateException -> OK. That + exception is datum/GeocentricConverter's out-of-range latitude guard; with the shift applied + the latitude handed to it is in range. The remaining eleven are OK -> OK. + + WHY PROBE 1 AND NO OTHER PROBE. conus covers 131W-63W, 20N-50N and probe 1 is the only one of + the five probe points these pairs use that lands inside it. That the other four are untouched + is the evidence that this is grid coverage and not something applied indiscriminately -- a + change that moved all five would not be a datum shift. + match: + sections: [PAIR] + keys: + - "t41/epsg:4267>epsg:2048" + - "t42/esri:104000>epsg:21418" + - "t42/esri:4267>epsg:2044" + - "t42/esri:4267>epsg:2092" + - "t43/epsg:4267>epsg:20009" + - "t43/epsg:4267>epsg:20079" + - "t43/epsg:4267>epsg:2392" + - "t43/esri:104000>epsg:20022" + - "t43/esri:104000>epsg:20092" + - "t43/esri:104000>epsg:2468" + - "t43/esri:4267>epsg:20066" + - "t43/esri:4267>epsg:2094" + probes: [1] + classifications: [CHANGED] + status_to: "OK" + expect: + dimensions: [fx, fy, fz, ix, iy, iz] + allow_status_change: true + allow_inside_change: true + allow_nonfinite: true + magnitude: {min: 1.0e4, max: 1.0e8} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/Angles.java b/golden/src/main/java/org/locationtech/proj4j/golden/Angles.java new file mode 100644 index 0000000..a14f43e --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/Angles.java @@ -0,0 +1,158 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +/** + * A self-contained DMS-capable angle parser, used only to derive probe points from the text of a + * PROJ.4 definition string. + * + *

This deliberately does not call into proj4j. Probe derivation reads the definition + * text — {@code +lat_0}, {@code +lat_1}, {@code +lat_2}, {@code +lat_ts}, {@code +lon_0}, + * {@code +lonc}, {@code +south}, {@code +zone} — rather than the parsed {@code Projection}'s getters, + * for one reason: probes are checked in, and if they were derived through proj4j's own parser then a + * change to {@code Proj4Parser}, to a getter, or to the DMS handling would move every probe and make + * every row of the golden table differ for a reason that has nothing to do with the change under + * review. Reading the text keeps the input set an input. + * + *

It has to be DMS-capable because the {@code world}, {@code nad27} and {@code nad83} + * dictionaries are full of forms like {@code -85d50}, {@code 46d57'8.660"N} and {@code 6d0E}. A + * plain {@code Double.parseDouble} on those yields NaN, and a NaN latitude candidate treated as + * "absent" would put every US State Plane zone on a default box. + * + *

Returns {@link Double#NaN} for anything it cannot parse, and callers must treat NaN as + * "absent". Note the distinction {@code ProjectionGridRoundTripper.updateLat} fails to make: + * {@code 0.0} is a perfectly good, explicitly-specified latitude and is not absent. + */ +public final class Angles { + + private Angles() { + } + + /** + * Parses a PROJ.4 angle in degrees, minutes and seconds, with an optional trailing cardinal + * direction and an optional radian suffix. + * + *

Accepted: {@code 30.5}, {@code -85d50}, {@code 30d30}, {@code 46d57'8.660"N}, + * {@code 7d26'22.500"E}, {@code 6d0E}, {@code 0.5R} (radians), {@code 12°30'}. + * + * @return the angle in degrees, or {@link Double#NaN} + */ + public static double parseDegrees(String raw) { + if (raw == null) return Double.NaN; + String s = raw.trim(); + if (s.isEmpty()) return Double.NaN; + + // Trailing cardinal direction sets the sign and is stripped first: "6d0E", "-14d16", + // "83d10'W". PROJ accepts N/E/S/W in either case. + double cardinal = 1.0; + char last = s.charAt(s.length() - 1); + if (last == 'N' || last == 'n' || last == 'E' || last == 'e') { + s = s.substring(0, s.length() - 1); + } else if (last == 'S' || last == 's' || last == 'W' || last == 'w') { + cardinal = -1.0; + s = s.substring(0, s.length() - 1); + } + if (s.isEmpty()) return Double.NaN; + + // Radian suffix. PROJ's dmstor accepts it; proj4j does not, which is itself a divergence, + // but here we only need to read what the dictionaries contain. + boolean radians = false; + last = s.charAt(s.length() - 1); + if (last == 'r' || last == 'R') { + radians = true; + s = s.substring(0, s.length() - 1); + if (s.isEmpty()) return Double.NaN; + } + + double sign = 1.0; + if (s.charAt(0) == '-') { + sign = -1.0; + s = s.substring(1); + } else if (s.charAt(0) == '+') { + s = s.substring(1); + } + if (s.isEmpty()) return Double.NaN; + + double deg = 0.0; + double min = 0.0; + double sec = 0.0; + boolean sawAny = false; + + int i = 0; + StringBuilder tok = new StringBuilder(); + int stage = 0; // 0 = degrees, 1 = minutes, 2 = seconds + for (; i < s.length(); i++) { + char ch = s.charAt(i); + if (ch == 'd' || ch == 'D' || ch == '°') { + double v = num(tok); + if (Double.isNaN(v)) return Double.NaN; + deg = v; + sawAny = true; + tok.setLength(0); + stage = 1; + } else if (ch == '\'') { + double v = num(tok); + if (Double.isNaN(v)) return Double.NaN; + min = v; + sawAny = true; + tok.setLength(0); + stage = 2; + } else if (ch == '"') { + double v = num(tok); + if (Double.isNaN(v)) return Double.NaN; + sec = v; + sawAny = true; + tok.setLength(0); + stage = 3; + } else { + tok.append(ch); + } + } + if (tok.length() > 0) { + double v = num(tok); + if (Double.isNaN(v)) return Double.NaN; + switch (stage) { + case 0: deg = v; break; + case 1: min = v; break; + case 2: sec = v; break; + default: return Double.NaN; // trailing junk after the seconds mark + } + sawAny = true; + } + if (!sawAny) return Double.NaN; + + double v = deg + min / 60.0 + sec / 3600.0; + if (radians) v = Math.toDegrees(v); + return sign * cardinal * v; + } + + private static double num(CharSequence cs) { + if (cs.length() == 0) return 0.0; + String s = cs.toString(); + // Double.parseDouble is far too permissive for this: it accepts "d", "0x1p3", "NaN", + // "Infinity", a leading "+", and surrounding whitespace, all of which would silently + // succeed here and yield a nonsense probe. + boolean dot = false; + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + if (ch == '.') { + if (dot) return Double.NaN; + dot = true; + } else if (ch < '0' || ch > '9') { + return Double.NaN; + } + } + try { + return Double.parseDouble(s); + } catch (NumberFormatException e) { + return Double.NaN; + } + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/GoldenFormat.java b/golden/src/main/java/org/locationtech/proj4j/golden/GoldenFormat.java new file mode 100644 index 0000000..5d63be8 --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/GoldenFormat.java @@ -0,0 +1,299 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; + +/** + * The on-disk format of a golden table, and the total order every file in it is sorted by. + * + *

Why {@code Double.toHexString} and not {@code %.17g}

+ * + * Every float in every golden file is written with {@link Double#toHexString(double)}. This is not a + * stylistic preference; four separate properties are load-bearing, and decimal formatting fails all + * four: + * + *
    + *
  1. It is bijective on bit patterns. Each of the 2^64 double bit patterns has exactly one + * hex-significand rendering, and {@link Double#parseDouble} inverts it exactly. So a diff of two + * golden files is a diff of raw bits, and — crucially — a change to the formatting code + * cannot make every row differ. There is no rounding decision to change. With {@code %.17g} + * a future tweak from 17 to 16 significant digits rewrites all ~53,000 rows and buries whatever + * real change was in there.
  2. + *
  3. It distinguishes {@code +0.0} from {@code -0.0}. {@code %.17g} of {@code -0.0} is + * {@code "-0.00000000000000000"} in some locales and {@code "0.00000000000000000"} after a + * {@code Math.abs} slips in; more importantly {@code Double.compare} and {@code ==} disagree + * about them. The distinction is real proj4j behaviour, not noise: it is the difference between + * approaching the equator from the north and from the south, and between the two sides of the + * antimeridian, and it flips on sign-handling changes in exactly the code this project is + * rewriting. {@code toHexString(-0.0)} is {@code "-0x0.0p0"}.
  4. + *
  5. It is locale-immune. proj4j itself has live locale-dependent formatting defects — + * {@code ProjCoordinate.DECIMAL_FORMAT} is a public mutable static {@code DecimalFormat} with no + * {@code Locale} (so {@code 1,5} under {@code de_DE}), and {@code units/Unit} and + * {@code units/AngleFormat} use {@code NumberFormat.getNumberInstance()}. A golden suite that + * built its own formatting on {@code String.format} would inherit the same class of bug and its + * baseline would be unreproducible on a colleague's machine. {@code toHexString} consults no + * {@code Locale}.
  6. + *
  7. It makes a 1-ULP difference exact by construction. The whole point of the suite is to + * see small movements. Two doubles one ULP apart differ in the last hex digit and nowhere else, + * so the diff is trivially readable; at 17 significant decimal digits they differ in a way that + * requires arithmetic to interpret.
  8. + *
+ * + * {@code NaN}, {@code Infinity} and {@code -Infinity} render as those three literals, which are + * US-ASCII, canonical, and parse back. NaN payloads are not preserved — {@code toHexString} + * collapses every NaN to {@code "NaN"} — which is deliberate: proj4j mints NaNs from many places and + * the payload is a JVM implementation detail, not behaviour. + * + *

The file format

+ * + * TSV, LF line endings, US-ASCII, no quoting and no escaping of any kind. Tab and newline cannot + * occur in any field: keys are drawn from registry codes and proj-string tokens, statuses are class + * names, and floats are hex. {@link #assertClean} enforces that rather than trusting it. + * + * Three files per table: + *
    + *
  • {@code golden.tsv} — the numbers. Columns: {@code section, key, probe, status, fx, fy, fz, ix, + * iy, iz, inside}. {@code f*} is the forward transform's output; {@code i*} is the inverse + * applied to that forward output; {@code inside} is the advisory + * {@code Projection.inside(lon,lat)} boolean ({@code T}/{@code F}, or {@code E} when it throws — + * it can, because it routes through {@code normalizeLongitude}).
  • + *
  • {@code golden-index.tsv} — one row per {@code (section, key)} carrying the metadata the rules + * engine matches on: source and target {@code +proj=} names, the sorted parameter key set, and + * the sorted set of {@code +datum=} values. + * Kept out of {@code golden.tsv} so that a def-text edit does not rewrite numeric rows. + *

    The {@code datums} column exists because {@code params_present} matches parameter + * keys only, and the single largest honest {@code UNEXPLAINED} cluster this suite has + * had — 907 {@code REG} rows on {@code datum=NAD27} — could not be scoped without it. The + * alternative was enumerating ~205 keys, which would also have swept in ~1,066 rows belonging + * to a live stream. It is a set rather than a scalar because {@code CSV} and {@code PAIR} cases + * have two sides; see {@code InputSet.datumsOf}.

  • + *
  • {@code golden-messages.tsv} — exception messages, keyed by {@code (section, key, probe)}. + * Separate file so message text (which is churn-prone, long, and frequently reworded for reasons + * that are not behavioural) never bloats or perturbs the numeric table.
  • + *
+ * + *

The total order

+ * + * {@code (section, key, probe)}, each compared as raw US-ASCII bytes via {@link String#compareTo}. + * Since every field is ASCII, that is byte order, which is the order {@code sort} and {@code git + * diff} use, and it is the order the streaming merge join in {@code GoldenDiff} depends on. + * {@code probe} is a single digit 0-4 so lexicographic and numeric order coincide. The order is not + * numeric on the code ({@code epsg:10000} sorts before {@code epsg:2000}); that is fine — a total + * order only has to be total and stable, and rules that need numeric code ranges parse the code. + */ +public final class GoldenFormat { + + private GoldenFormat() { + } + + /** US-ASCII, not UTF-8: a non-ASCII byte in a golden file is a bug, and this makes it loud. */ + public static final Charset ASCII = Charset.forName("US-ASCII"); + + public static final String GOLDEN_FILE = "golden.tsv"; + public static final String INDEX_FILE = "golden-index.tsv"; + public static final String MESSAGES_FILE = "golden-messages.tsv"; + + public static final String HEADER_GOLDEN = + "section\tkey\tprobe\tstatus\tfx\tfy\tfz\tix\tiy\tiz\tinside"; + public static final String HEADER_INDEX = + "section\tkey\tsrcproj\ttgtproj\tparams\tdatums"; + + /** + * The header this file wrote before the {@code datums} column existed. + * + *

{@code baseline/1.4.3/golden-index.tsv} is a committed baseline artefact and is not + * rewritten by a normal run, so the reader has to accept it. It is read only as a fallback for + * a {@code (section, key)} the current run did not produce — i.e. for {@code REMOVED} rows — + * and a legacy row supplies an empty {@code datums} set, which no {@code datums:} predicate can + * match. That is the safe direction: a rule under-claims rather than over-claims, and + * {@code expected_rows} makes under-claiming loud. + */ + public static final String HEADER_INDEX_V1 = + "section\tkey\tsrcproj\ttgtproj\tparams"; + public static final String HEADER_MESSAGES = + "section\tkey\tprobe\tmessage"; + + /** Status of a row whose forward transform completed. */ + public static final String OK = "OK"; + /** Status prefix for a row that threw; the remainder is the fully-qualified class name. */ + public static final String EXC = "EXC:"; + /** + * Status of a row whose probe is absent from {@code probes.tsv}. Not an error and not a + * transform outcome: it is how a CRS added to the registry dictionaries after the last probe + * regeneration announces itself, instead of silently acquiring a made-up probe. + */ + public static final String NO_PROBE = "NO_PROBE"; + + public static final int COL_SECTION = 0; + public static final int COL_KEY = 1; + public static final int COL_PROBE = 2; + public static final int COL_STATUS = 3; + public static final int COL_FX = 4; + public static final int COL_FY = 5; + public static final int COL_FZ = 6; + public static final int COL_IX = 7; + public static final int COL_IY = 8; + public static final int COL_IZ = 9; + public static final int COL_INSIDE = 10; + public static final int GOLDEN_COLUMNS = 11; + + /** The six numeric dimensions, in column order. Rule {@code expect.dimensions} names these. */ + public static final String[] DIMENSIONS = {"fx", "fy", "fz", "ix", "iy", "iz"}; + + public static final String SECTION_CSV = "CSV"; + public static final String SECTION_PAIR = "PAIR"; + public static final String SECTION_REG = "REG"; + public static final String SECTION_SYN = "SYN"; + + // ---------------------------------------------------------------- floats + + /** See the class javadoc for why this is {@code toHexString} and not a decimal format. */ + public static String hex(double d) { + return Double.toHexString(d); + } + + /** Exact inverse of {@link #hex} for every finite double, plus the three non-finite literals. */ + public static double unhex(String s) { + return Double.parseDouble(s); + } + + // ----------------------------------------------------------------- order + + /** + * The total order. Operates on already-split rows so the merge join never re-splits. + * + * @param a a row with at least {@link #COL_PROBE}+1 fields + * @param b likewise + */ + public static int compareRows(String[] a, String[] b) { + int c = a[COL_SECTION].compareTo(b[COL_SECTION]); + if (c != 0) return c; + c = a[COL_KEY].compareTo(b[COL_KEY]); + if (c != 0) return c; + return a[COL_PROBE].compareTo(b[COL_PROBE]); + } + + /** The same order restricted to {@code (section, key)}, for the index files. */ + public static int compareKeys(String[] a, String[] b) { + int c = a[COL_SECTION].compareTo(b[COL_SECTION]); + if (c != 0) return c; + return a[COL_KEY].compareTo(b[COL_KEY]); + } + + // ------------------------------------------------------------------- I/O + + /** + * Rejects anything that would need quoting, an escape, or a charset decision. Called on every + * field of every row on the way out. The suite's contract is "no quoting"; the only honest way to + * offer that is to fail rather than emit a field that violates it. + */ + public static String assertClean(String field) { + if (field == null) throw new IllegalArgumentException("null field"); + for (int i = 0; i < field.length(); i++) { + char ch = field.charAt(i); + if (ch < 0x20 || ch > 0x7e) { + throw new IllegalArgumentException( + "field is not printable US-ASCII at index " + i + " (0x" + + Integer.toHexString(ch) + "): " + describe(field)); + } + } + return field; + } + + private static String describe(String s) { + StringBuilder sb = new StringBuilder(s.length() + 8); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + if (ch >= 0x20 && ch <= 0x7e) sb.append(ch); + else sb.append("\\u").append(String.format("%04x", (int) ch)); + } + return sb.toString(); + } + + /** + * Sanitises a field for use in a key or an index column: replaces any character that cannot + * appear in the format with {@code '_'}. Used only on text originating in the registry + * dictionaries (a handful of {@code world} entries carry Latin-1 bytes) and on exception + * messages. + */ + public static String sanitise(String s) { + if (s == null) return ""; + StringBuilder sb = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + if (ch >= 0x20 && ch <= 0x7e) sb.append(ch); + else sb.append('_'); + } + return sb.toString(); + } + + /** LF only, US-ASCII, no BOM. */ + public static Writer writer(File f) throws IOException { + File parent = f.getParentFile(); + if (parent != null && !parent.isDirectory() && !parent.mkdirs()) { + throw new IOException("cannot create " + parent); + } + final OutputStream out = new java.io.FileOutputStream(f); + return new BufferedWriter(new OutputStreamWriter(out, ASCII), 1 << 16); + } + + public static void writeRow(Writer w, String... fields) throws IOException { + for (int i = 0; i < fields.length; i++) { + if (i > 0) w.write('\t'); + w.write(assertClean(fields[i])); + } + // Explicit '\n', never println() and never System.lineSeparator(): a CRLF golden file + // generated on Windows would diff against every single row of an LF baseline. + w.write('\n'); + } + + public static BufferedReader reader(File f) throws IOException { + return new BufferedReader(new InputStreamReader(new java.io.FileInputStream(f), ASCII), 1 << 16); + } + + public static BufferedReader reader(InputStream in) { + return new BufferedReader(new InputStreamReader(in, ASCII), 1 << 16); + } + + /** + * Splits on tab without regex and without dropping trailing empty fields, which + * {@code String.split("\t")} does. + */ + public static String[] split(String line, int expected) { + String[] out = new String[expected]; + int field = 0; + int start = 0; + for (int i = 0; i <= line.length(); i++) { + if (i == line.length() || line.charAt(i) == '\t') { + if (field >= expected) { + throw new IllegalArgumentException( + "expected " + expected + " fields, found more: " + line); + } + out[field++] = line.substring(start, i); + start = i + 1; + } + } + if (field != expected) { + throw new IllegalArgumentException( + "expected " + expected + " fields, found " + field + ": " + line); + } + return out; + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/GoldenGenerator.java b/golden/src/main/java/org/locationtech/proj4j/golden/GoldenGenerator.java new file mode 100644 index 0000000..e8a1a6c --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/GoldenGenerator.java @@ -0,0 +1,448 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.locationtech.proj4j.CoordinateTransform; +import org.locationtech.proj4j.CoordinateTransformFactory; +import org.locationtech.proj4j.ProjCoordinate; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Writes a golden table: for every input case, the forward transform's output, the inverse applied to + * that output, and the advisory {@code Projection.inside} flag. + * + *

The 1.4.3 API constraint

+ * + * This class must compile and run unchanged against released proj4j 1.4.3 and against the working + * tree. That is the entire reason the module exists: a baseline generated by different code than + * the comparison run is not a baseline. So it touches only API that shipped in 1.4.3 — + * {@link CRSFactory}, {@link CoordinateReferenceSystem}, {@link CoordinateTransform}, + * {@link CoordinateTransformFactory}, {@link ProjCoordinate}, + * {@code org.locationtech.proj4j.Proj4jException}, and {@code proj.Projection.inside(double,double)} + * (present and unchanged in 1.4.3; the {@code inside} column is required by the plan and there is no + * other way to read it). No reflection, no {@code Registry} enumeration, nothing added this week. If + * a change to {@code core} breaks the default-profile compile of this file, that is a signal. + * + *

What is deliberately NOT done

+ * + *
    + *
  • No destination poisoning. The stale-{@code dst} family of defects (six projections whose + * {@code projectInverse} reads the unmutated parameter instead of the output struct) would be + * caught by pre-filling the destination with {@code 1e300}, and the defect notes recommend exactly + * that. It cannot work from this API: {@code BasicCoordinateTransform.transform} opens with + * {@code tgt.setValue(src)}, so the caller's destination contents are unobservable. That probe + * belongs in a unit test in {@code core}, not here.
  • + *
  • No tolerance, no expected value, no pass/fail. A golden row is an observation. This + * suite has no opinion about whether {@code 89.9568} degrees of latitude error is correct — see + * README.md, "Policy": gie always wins over a golden rule.
  • + *
+ * + *

Determinism

+ * + * The output depends on the order of generation, because + * {@code parser/Proj4Parser.java:53} mutates process-global static {@code Datum} singletons + * ({@code Datum.NAD27.setGrids(null)} and friends) as a side effect of parsing. The order is therefore + * fixed and total — {@code (section, key)} in US-ASCII order — and both sides of a comparison walk it + * identically. Parsed CRS are cached per run, which changes how many times each idempotent global + * write happens but not the order in which distinct writes first occur. + */ +public final class GoldenGenerator { + + /** Exit code when generation completed. */ + public static final int OK = 0; + + private final CRSFactory crsFactory = new CRSFactory(); + private final CoordinateTransformFactory ctFactory = new CoordinateTransformFactory(); + + /** + * Cache of parsed CRS, keyed by name-or-proj-string. Purely a speed measure: + * {@code io/Proj4FileReader.readParametersFromFile} re-opens and re-{@code StreamTokenizer}-scans + * the 888 KB {@code epsg} resource on every call, and the CSV section asks for the same + * few hundred codes ~5,000 times. + */ + private final Map crsCache = new HashMap(); + + private final Counters counters = new Counters(); + + /** Tallies written to {@code golden-summary.txt} and printed at the end of a run. */ + public static final class Counters { + public int cases; + public int rows; + public int ok; + public int exceptions; + public int noProbe; + public int nonFinite; + } + + public Counters counters() { + return counters; + } + + // ------------------------------------------------------------------------------- main + + /** + * Usage: {@code GoldenGenerator [goldenDir] [csvDir]}. + * + *

{@code goldenDir} holds the committed inputs ({@code probes.tsv}, {@code pairs.tsv}) and + * defaults to the {@code golden.dir} system property. {@code csvDir} holds the MetaCRS CSVs and + * defaults to {@code /../core/src/test/resources}. + */ + public static void main(String[] args) throws IOException { + if (args.length < 1) { + System.err.println("usage: GoldenGenerator [goldenDir] [csvDir]"); + System.exit(2); + } + File out = new File(args[0]); + File goldenDir = args.length > 1 ? new File(args[1]) + : new File(System.getProperty("golden.dir", ".")); + File csvDir = args.length > 2 ? new File(args[2]) + : defaultCsvDir(goldenDir); + + Counters c = new GoldenGenerator().generate(out, goldenDir, csvDir); + System.out.println("golden: " + c.cases + " cases, " + c.rows + " rows, " + + c.ok + " OK, " + c.exceptions + " EXC, " + c.noProbe + " NO_PROBE, " + + c.nonFinite + " rows with a non-finite ordinate"); + System.exit(OK); + } + + public static File defaultCsvDir(File goldenDir) { + return new File(goldenDir.getParentFile() == null ? new File("..") : goldenDir.getParentFile(), + "core/src/test/resources"); + } + + // --------------------------------------------------------------------------- generation + + public Counters generate(File outDir, File goldenDir, File csvDir) throws IOException { + List defs = RegistryDict.readAll(); + Map byKey = InputSet.index(defs); + + List cases = new ArrayList(60000); + cases.addAll(InputSet.csv(MetaCrsCsv.readAll(csvDir), byKey)); + cases.addAll(InputSet.pairs(new File(goldenDir, "pairs.tsv"), byKey)); + cases.addAll(InputSet.registry(defs)); + cases.addAll(InputSet.synthetic()); + Collections.sort(cases, new Comparator() { + public int compare(InputSet.Case a, InputSet.Case b) { + int r = a.section.compareTo(b.section); + if (r != 0) return r; + return a.key.compareTo(b.key); + } + }); + + Probes.Table probes = Probes.read(new File(goldenDir, "probes.tsv")); + + Writer golden = GoldenFormat.writer(new File(outDir, GoldenFormat.GOLDEN_FILE)); + Writer index = GoldenFormat.writer(new File(outDir, GoldenFormat.INDEX_FILE)); + Writer messages = GoldenFormat.writer(new File(outDir, GoldenFormat.MESSAGES_FILE)); + try { + golden.write(GoldenFormat.HEADER_GOLDEN); + golden.write('\n'); + index.write(GoldenFormat.HEADER_INDEX); + index.write('\n'); + messages.write(GoldenFormat.HEADER_MESSAGES); + messages.write('\n'); + + String prevSection = null; + String prevKey = null; + for (int i = 0; i < cases.size(); i++) { + InputSet.Case c = cases.get(i); + if (prevSection != null) { + int cmp = prevSection.compareTo(c.section); + if (cmp == 0) cmp = prevKey.compareTo(c.key); + if (cmp > 0) { + throw new IllegalStateException("cases out of order: " + + prevSection + "/" + prevKey + " then " + c.section + "/" + c.key); + } + if (cmp == 0) { + throw new IllegalStateException("duplicate case key: " + c.section + "/" + c.key); + } + } + prevSection = c.section; + prevKey = c.key; + + counters.cases++; + GoldenFormat.writeRow(index, c.section, c.key, + c.srcProj, c.tgtProj, c.paramKeys, c.datums); + emit(golden, messages, c, probes); + } + } finally { + golden.close(); + index.close(); + messages.close(); + } + + Writer summary = GoldenFormat.writer(new File(outDir, "golden-summary.txt")); + try { + summary.write("cases=" + counters.cases + "\n"); + summary.write("rows=" + counters.rows + "\n"); + summary.write("ok=" + counters.ok + "\n"); + summary.write("exceptions=" + counters.exceptions + "\n"); + summary.write("no_probe=" + counters.noProbe + "\n"); + summary.write("non_finite_rows=" + counters.nonFinite + "\n"); + } finally { + summary.close(); + } + return counters; + } + + private void emit(Writer golden, Writer messages, InputSet.Case c, Probes.Table probes) + throws IOException { + double[][] coords = c.coords; + int n; + if (coords == null) { + double[][] p = probes.get(c.section, c.key); + if (p == null) { + // A key present in the input set but absent from the committed probe table. Not an + // error: it is how a def added to the dictionaries after the last probe regeneration + // announces itself, instead of silently acquiring a made-up probe. + for (int i = 0; i < Probes.PROBE_COUNT; i++) { + writeRow(golden, c, i, GoldenFormat.NO_PROBE, + Double.NaN, Double.NaN, Double.NaN, + Double.NaN, Double.NaN, Double.NaN, "-"); + counters.noProbe++; + } + return; + } + n = Probes.PROBE_COUNT; + coords = new double[n][3]; + for (int i = 0; i < n; i++) { + coords[i][0] = p[i][0]; + coords[i][1] = p[i][1]; + coords[i][2] = 0.0; + } + } else { + n = coords.length; + } + + Object src = crs(c.srcName, c.srcParams); + Object tgt = crs(c.tgtName, c.tgtParams); + if (src instanceof Failure || tgt instanceof Failure) { + Failure f = (Failure) (src instanceof Failure ? src : tgt); + String stage = src instanceof Failure ? "crs-src" : "crs-tgt"; + for (int i = 0; i < n; i++) { + writeRow(golden, c, i, GoldenFormat.EXC + f.type, + Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, "-"); + message(messages, c, i, stage, f.message); + counters.exceptions++; + } + return; + } + CoordinateReferenceSystem srcCrs = (CoordinateReferenceSystem) src; + CoordinateReferenceSystem tgtCrs = (CoordinateReferenceSystem) tgt; + + Object fwd = transform(srcCrs, tgtCrs); + Object inv = transform(tgtCrs, srcCrs); + if (fwd instanceof Failure) { + Failure f = (Failure) fwd; + for (int i = 0; i < n; i++) { + writeRow(golden, c, i, GoldenFormat.EXC + f.type, + Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, "-"); + message(messages, c, i, "transform-fwd", f.message); + counters.exceptions++; + } + return; + } + CoordinateTransform fwdT = (CoordinateTransform) fwd; + CoordinateTransform invT = inv instanceof Failure ? null : (CoordinateTransform) inv; + + ProjCoordinate in = new ProjCoordinate(); + ProjCoordinate f1 = new ProjCoordinate(); + ProjCoordinate f2 = new ProjCoordinate(); + + for (int i = 0; i < n; i++) { + in.x = coords[i][0]; + in.y = coords[i][1]; + in.z = coords[i].length > 2 ? coords[i][2] : 0.0; + + String status = GoldenFormat.OK; + String stage = null; + String msg = null; + String type = null; + + f1.x = Double.NaN; + f1.y = Double.NaN; + f1.z = Double.NaN; + f2.x = Double.NaN; + f2.y = Double.NaN; + f2.z = Double.NaN; + + try { + fwdT.transform(in, f1); + } catch (Throwable t) { + rethrowFatal(t); + type = t.getClass().getName(); + stage = "fwd"; + msg = t.getMessage(); + f1.x = Double.NaN; + f1.y = Double.NaN; + f1.z = Double.NaN; + } + + if (type == null) { + if (invT == null) { + Failure f = (Failure) inv; + type = f.type; + stage = "transform-inv"; + msg = f.message; + } else { + try { + invT.transform(f1, f2); + } catch (Throwable t) { + rethrowFatal(t); + type = t.getClass().getName(); + stage = "inv"; + msg = t.getMessage(); + f2.x = Double.NaN; + f2.y = Double.NaN; + f2.z = Double.NaN; + } + } + } + + if (type != null) { + status = GoldenFormat.EXC + type; + counters.exceptions++; + message(messages, c, i, stage, msg); + } else { + counters.ok++; + } + + String inside = "-"; + if (c.geographicInput) { + inside = inside(tgtCrs, in.x, in.y); + } + writeRow(golden, c, i, status, f1.x, f1.y, f1.z, f2.x, f2.y, f2.z, inside); + if (!isFinite(f1.x) || !isFinite(f1.y) || !isFinite(f1.z) + || !isFinite(f2.x) || !isFinite(f2.y) || !isFinite(f2.z)) { + counters.nonFinite++; + } + } + } + + /** {@code Double.isFinite} is Java 8; spelled out so the source level can drop if it must. */ + private static boolean isFinite(double d) { + return !Double.isNaN(d) && !Double.isInfinite(d); + } + + /** + * The advisory domain flag. {@code Projection.inside} has zero callers in {@code core} — + * it is dead code — so recording it here is the only place its value is observed. It is + * advisory: proj4j does not consult it before transforming, so a {@code F} row is not a + * failure and an {@code OK}/{@code F} combination is the normal case for anything probed near the + * edge of its box. + * + *

It can throw: it routes through {@code ProjectionMath.normalizeLongitude}, which raises + * {@code InvalidValueException} on a NaN or infinite argument. Hence three values, not two. + */ + private static String inside(CoordinateReferenceSystem crs, double lon, double lat) { + try { + org.locationtech.proj4j.proj.Projection p = crs.getProjection(); + if (p == null) return "-"; + return p.inside(lon, lat) ? "T" : "F"; + } catch (Throwable t) { + rethrowFatal(t); + return "E"; + } + } + + private void writeRow(Writer w, InputSet.Case c, int probe, String status, + double fx, double fy, double fz, + double ix, double iy, double iz, String inside) throws IOException { + GoldenFormat.writeRow(w, c.section, c.key, Integer.toString(probe), status, + GoldenFormat.hex(fx), GoldenFormat.hex(fy), GoldenFormat.hex(fz), + GoldenFormat.hex(ix), GoldenFormat.hex(iy), GoldenFormat.hex(iz), inside); + counters.rows++; + } + + private void message(Writer w, InputSet.Case c, int probe, String stage, String msg) + throws IOException { + String text = stage + ": " + (msg == null ? "" : msg); + GoldenFormat.writeRow(w, c.section, c.key, Integer.toString(probe), + GoldenFormat.sanitise(text)); + } + + // ------------------------------------------------------------------ CRS and transforms + + private static final class Failure { + final String type; + final String message; + + Failure(Throwable t) { + this.type = t.getClass().getName(); + this.message = t.getMessage(); + } + } + + /** Returns a {@link CoordinateReferenceSystem} or a {@link Failure}; never throws. */ + private Object crs(String name, String[] params) { + String cacheKey = params == null ? "N" + name : "P" + join(params); + Object hit = crsCache.get(cacheKey); + if (hit != null) return hit; + Object result; + try { + CoordinateReferenceSystem c = params == null + ? crsFactory.createFromName(name) + : crsFactory.createFromParameters(name, params); + // createFromParameters returns null for a null parameter array; createFromName throws + // UnknownAuthorityCodeException. Neither should produce a null here, but a null CRS + // would NPE deep inside CoordinateTransformFactory and lose the key, so it is recorded + // as its own failure shape. + result = c == null ? new Failure(new NullPointerException("null CRS for " + name)) : c; + } catch (Throwable t) { + rethrowFatal(t); + result = new Failure(t); + } + crsCache.put(cacheKey, result); + return result; + } + + /** Returns a {@link CoordinateTransform} or a {@link Failure}; never throws. */ + private Object transform(CoordinateReferenceSystem src, CoordinateReferenceSystem tgt) { + try { + return ctFactory.createTransform(src, tgt); + } catch (Throwable t) { + rethrowFatal(t); + return new Failure(t); + } + } + + /** + * Catching {@link Throwable} is normally wrong, and here it is necessary: proj4j throws + * {@code NoSuchElementException} from {@code Projection.setSouthernHemisphere} and + * {@code setHeightOfOrbit}, {@code IllegalStateException} from {@code GeocentricConverter}, and a + * bare {@code new Error()} from {@code datum/AxisOrder.fromString} — none of which are + * {@code Proj4jException}. Recording them as rows is the point. A genuine VM error is rethrown so + * an OOM does not masquerade as 45,000 identical {@code EXC:} rows. + */ + private static void rethrowFatal(Throwable t) { + if (t instanceof VirtualMachineError) throw (VirtualMachineError) t; + if (t instanceof ThreadDeath) throw (ThreadDeath) t; + } + + private static String join(String[] params) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < params.length; i++) { + if (i > 0) sb.append(' '); + sb.append(params[i]); + } + return sb.toString(); + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/GoldenInputs.java b/golden/src/main/java/org/locationtech/proj4j/golden/GoldenInputs.java new file mode 100644 index 0000000..a2cce56 --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/GoldenInputs.java @@ -0,0 +1,224 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.locationtech.proj4j.CRSFactory; +import org.locationtech.proj4j.CoordinateReferenceSystem; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Regenerates the two committed input files, {@code probes.tsv} and {@code pairs.tsv}. + * + *

Run this deliberately and rarely. Regenerating the probes moves every probe point, so + * every one of the ~53,000 golden rows differs and the diff carries no information. The whole reason + * the probes are a committed file rather than a computation is that a change to + * {@link Probes#derive} — or to a {@code Projection} getter, had the derivation gone through + * proj4j — must not be able to silently move them. + * + *

Regenerate, then immediately regenerate the 1.4.3 baseline from the same inputs, in one + * commit. A probe file and a baseline that were generated from different probes describe nothing. + * + *

Pair curation

+ * + * {@code pairs.tsv} holds ~200 CRS→CRS pairs chosen to hit every one of the 25 combinations of + * {@code Datum.TYPE_UNKNOWN}, {@code TYPE_WGS84}, {@code TYPE_3PARAM}, {@code TYPE_7PARAM} and + * {@code TYPE_GRIDSHIFT} across source and target. That matters because the datum-transform decision + * in {@code BasicCoordinateTransform} is a function of exactly this pair of types, and three separate + * confirmed defects live in it: + *
    + *
  • {@code TYPE_UNKNOWN} is tested inside an ellipsoid-equality guard + * ({@code BasicCoordinateTransform.java:198-205}), where {@code PROJ 5.2.0:src/pj_transform.c: + * 835-843} tests it unconditionally and before the identical-datums short cut;
  • + *
  • {@code Datum.isEqual:189} compares the equator radius to itself, so the eccentricity + * guard is dead code and unequal ellipsoids can be declared equal;
  • + *
  • {@code Datum.isEqual} nests the eccentricity check inside the radius check where upstream + * {@code pj_compare_datums} is an {@code ||}.
  • + *
+ * None of those is reachable from a WGS84-hub pair, which is why every curated pair excludes + * {@code EPSG:4326}. The sources are all geographic CRS so that the probe is a lon/lat pair and the + * inputs need no separate pinning — they come from {@code probes.tsv} like every other probe, derived + * from the source CRS's own parameters. + * + *

Selection is deterministic: candidates are enumerated in the golden total order and picked by a + * fixed coprime stride, so re-running on unchanged dictionaries reproduces the file byte for byte. + * It is not random and there is no seed to lose. + */ +public final class GoldenInputs { + + /** Pairs per {@code (srcType, tgtType)} combination. 5 x 5 x 8 = 200 at most. */ + public static final int PER_COMBINATION = 8; + + /** Coprime strides through the candidate lists, so the picks are spread rather than adjacent. */ + private static final int SRC_STRIDE = 7; + private static final int TGT_STRIDE = 13; + + /** CRS excluded from either end of a pair: the WGS84 geographic hub itself. */ + private static final String[] HUB_CODES = {"epsg:4326", "esri:4326", "epsg:4979", "epsg:4978"}; + + private GoldenInputs() { + } + + /** Usage: {@code GoldenInputs }. Overwrites {@code probes.tsv} and {@code pairs.tsv}. */ + public static void main(String[] args) throws IOException { + File goldenDir = new File(args.length > 0 ? args[0] : System.getProperty("golden.dir", ".")); + regenerate(goldenDir); + } + + public static void regenerate(File goldenDir) throws IOException { + List defs = RegistryDict.readAll(); + Map byKey = InputSet.index(defs); + + File pairsFile = new File(goldenDir, "pairs.tsv"); + int pairCount = curatePairs(defs, pairsFile); + + List entries = new ArrayList(); + entries.addAll(InputSet.registryProbes(defs)); + entries.addAll(InputSet.syntheticProbes()); + entries.addAll(InputSet.pairProbes(InputSet.pairs(pairsFile, byKey), byKey)); + + File probesFile = new File(goldenDir, "probes.tsv"); + Probes.write(probesFile, entries); + + System.out.println("wrote " + pairsFile + " (" + pairCount + " pairs)"); + System.out.println("wrote " + probesFile + " (" + entries.size() + " keys, " + + (entries.size() * Probes.PROBE_COUNT) + " probes)"); + } + + // ------------------------------------------------------------------------ pair curation + + private static final class Candidate { + final String key; + final int type; + final boolean geographic; + + Candidate(String key, int type, boolean geographic) { + this.key = key; + this.type = type; + this.geographic = geographic; + } + } + + private static int curatePairs(List defs, File out) throws IOException { + CRSFactory f = new CRSFactory(); + + // Five datum types, 0..4. Spelled as literals rather than referencing Datum.TYPE_* so this + // file needs no import of datum internals; the names are in the javadoc above. + List> geoByType = newBuckets(); + List> projByType = newBuckets(); + + for (int i = 0; i < defs.size(); i++) { + RegistryDict.Def d = defs.get(i); + if (isHub(d.key())) continue; + int type; + try { + CoordinateReferenceSystem crs = f.createFromName(d.crsName()); + if (crs == null || crs.getDatum() == null) continue; + type = crs.getDatum().getTransformType(); + } catch (Throwable t) { + if (t instanceof VirtualMachineError) throw (VirtualMachineError) t; + continue; // a def proj4j cannot even parse is no use as a curated endpoint + } + if (type < 0 || type > 4) continue; + type = correctErasedGridshift(d, type); + boolean geo = InputSet.isGeographic(d.proj()); + Candidate c = new Candidate(d.key(), type, geo); + (geo ? geoByType : projByType).get(type).add(c); + } + + TreeMap rows = new TreeMap(); + for (int st = 0; st <= 4; st++) { + List srcs = geoByType.get(st); + if (srcs.isEmpty()) continue; + for (int tt = 0; tt <= 4; tt++) { + List tgts = projByType.get(tt); + // Fall back to geographic targets for a type with no projected member, so a sparse + // combination is still represented rather than silently absent. + if (tgts.isEmpty()) tgts = geoByType.get(tt); + if (tgts.isEmpty()) continue; + int taken = 0; + for (int j = 0; taken < PER_COMBINATION && j < PER_COMBINATION * 4; j++) { + Candidate s = srcs.get((j * SRC_STRIDE) % srcs.size()); + Candidate t = tgts.get((j * TGT_STRIDE + 5) % tgts.size()); + if (s.key.equals(t.key)) continue; + String key = "t" + st + tt + "/" + s.key + ">" + t.key; + if (rows.containsKey(key)) continue; + rows.put(key, new String[]{key, s.key, t.key, + Integer.toString(st), Integer.toString(tt)}); + taken++; + } + } + } + + Writer w = GoldenFormat.writer(out); + try { + w.write(InputSet.PAIRS_HEADER); + w.write('\n'); + for (String[] r : rows.values()) { + GoldenFormat.writeRow(w, r[0], r[1], r[2], r[3], r[4]); + } + } finally { + w.close(); + } + return rows.size(); + } + + /** + * Restores the {@code TYPE_GRIDSHIFT} classification that {@code parser/Proj4Parser.java:53} + * erases. + * + *

Measured while curating this file, and it is the reason this method exists: across all + * 9,013 defs there is not one geographic CRS that proj4j reports as {@code TYPE_GRIDSHIFT}, + * so five of the twenty-five source/target type combinations were unreachable. The cause is the + * confirmed defect at {@code Proj4Parser.java:53}: + *

+     *   Datum datum = datumParam.getDatum();      // the STATIC Datum.NAD27 singleton
+     *   datum.setGrids(datumParam.getGrids());    // mutates it, process-wide
+     * 
+ * {@code EPSG:4267} is {@code +proj=longlat +datum=NAD27 +no_defs} with no {@code +nadgrids} + * token, so {@code getGrids()} is null and the first parse of it executes + * {@code Datum.NAD27.setGrids(null)} permanently, JVM-wide, flipping + * {@code TYPE_GRIDSHIFT -> TYPE_UNKNOWN} for all 205 EPSG codes on that datum. + * + *

So the type recorded in {@code pairs.tsv} is the declared type: observed wherever + * proj4j reports something other than {@code TYPE_UNKNOWN}, and corrected to + * {@code TYPE_GRIDSHIFT} where the definition declares a grid-shifted datum. Curating on the + * observed value would have selected pairs that cannot exercise the grid-shift path at all — and + * would then have had nothing to say when the defect is fixed, which is the single change most + * likely to move this section. + */ + private static int correctErasedGridshift(RegistryDict.Def d, int observed) { + if (observed != 0) return observed; // 0 == Datum.TYPE_UNKNOWN + String datum = d.value("datum"); + if ("NAD27".equals(datum)) return 4; // 4 == Datum.TYPE_GRIDSHIFT + String grids = d.value("nadgrids"); + if (grids != null && !grids.isEmpty()) return 4; + return observed; + } + + private static List> newBuckets() { + List> b = new ArrayList>(5); + for (int i = 0; i < 5; i++) b.add(new ArrayList()); + return b; + } + + private static boolean isHub(String key) { + for (int i = 0; i < HUB_CODES.length; i++) { + if (HUB_CODES[i].equals(key)) return true; + } + return false; + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/InputSet.java b/golden/src/main/java/org/locationtech/proj4j/golden/InputSet.java new file mode 100644 index 0000000..c3af434 --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/InputSet.java @@ -0,0 +1,520 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; + +/** + * The golden input set: what gets transformed, in what order, in what units. + * + *

Four sections

+ * + * + * + * + * + * + * + * + * + * + *
sectionkeysrowswhat it is
{@code CSV}~4,9961 probe eachthe existing MetaCRS CSV rows, at their own pinned coordinates
{@code PAIR}~2005 probes eachcurated non-WGS84-hub CRS→CRS pairs, one group per {@code Datum.TYPE_*} pair
{@code REG}9,0135 probes eachevery def in every registry dictionary, WGS84 lon/lat → CRS
{@code SYN}~5005 probes eachthe synthetic parameter matrix
+ * + *

Why the synthetic matrix is not optional

+ * + * {@code +rf=} appears in no registry dictionary and in no test CSV — zero occurrences across all + * five dictionaries and all five CSVs, verified by grep. The single largest behavioural fix in + * this project is the {@code +rf}/{@code +f} transposition in + * {@code parser/DatumParameters.java:119-133}, where the two setters are exactly swapped so that + * proj4j's {@code +f} is PROJ's {@code +rf} and {@code +rf} is unusable + * ({@code +ellps=GRS80 +rf=300} derives {@code es = -89400}). Without a synthetic matrix that fix has + * no baseline rows to move, and the golden regime would report it as a no-op. The same + * argument applies to {@code +R}, {@code +R_A}, {@code +es}, {@code +e}, {@code +pm}, {@code +axis}, + * {@code +no_uoff} and {@code +vunits}, none of which the registry data exercises meaningfully. + * + *

The matrix has three parts: + *

    + *
  1. {@code proj/} — every one of PROJ 9.8.1's 188 {@code PROJ_HEAD} names plus + * {@code pipeline}, at one canonical parameter set. Names proj4j does not implement produce + * {@code EXC:...} rows, which is the point: when a projection is added, its rows change status + * from {@code EXC:} to {@code OK}, and the rules file declares that intended. A name list + * restricted to what proj4j implements today could not see a new projection arrive.
  2. + *
  3. {@code mod//} — 44 modifier parameters appended to each of 6 host + * projections. Appended, not merged: {@code +ellps=clrk66} and {@code +units=us-ft} therefore + * appear twice in some rows, which deliberately probes the duplicate-key precedence + * defect ({@code Proj4Parser.createParameterMap} uses a {@code HashMap} and keeps the + * last occurrence; PROJ keeps the first).
  4. + *
  5. {@code ellps/} — all 46 of PROJ 9.8.1's {@code ellps.cpp} names plus + * {@code NAD27}, {@code NAD83} and {@code australian}. {@code australian} throws today although + * {@code Ellipsoid.AUSTRALIAN} exists, and {@code NWL9D}/{@code andrae} are silently degenerate + * ({@code Registry.java:71-72} passes the flattening in the {@code poleRadius} slot, giving + * {@code e} ≈ 1); all three have a row here.
  6. + *
+ */ +public final class InputSet { + + /** + * The geographic hub every {@code REG} and {@code SYN} probe starts from. Spelled as a literal + * proj string rather than {@code createFromName("epsg:4326")} so the hub does not move if the + * dictionaries do. Byte-identical to {@code epsg:4326}'s definition. + */ + public static final String WGS84 = "+proj=longlat +datum=WGS84 +no_defs"; + + /** The canonical parameter set the {@code proj/} and {@code mod/} sweeps build on. */ + public static final String CANONICAL = + "+ellps=GRS80 +lat_0=45 +lon_0=10 +lat_1=30 +lat_2=60 +x_0=0 +y_0=0 +units=m"; + + /** Host projections for the modifier sweep. */ + public static final String[] HOSTS = {"aea", "lcc", "longlat", "merc", "tmerc", "utm"}; + + /** + * All 188 of PROJ 9.8.1's {@code PROJ_HEAD} names, extracted at rev {@code 9.8.1} with + * {@code git grep -o 'PROJ_HEAD\([a-zA-Z0-9_]+'}. Asserted to be exactly 188 by the self-tests. + * + *

Deliberately the whole set, including the operation-only entries ({@code helmert}, + * {@code cart}, {@code axisswap}, {@code unitconvert}, {@code noop}, {@code pipeline}, + * {@code push}/{@code pop}/{@code set}/{@code id}/{@code name}) and the 93 projections proj4j does + * not implement. Names proj4j rejects produce {@code EXC:} rows, and that is the point: when a + * projection or operation lands, its five rows change status from {@code EXC:} to {@code OK} and + * the rules engine can match the transition. A list restricted to what proj4j implements today + * could not see a new projection arrive at all. + */ + public static final String[] PROJ_NAMES = { + "adams_hemi", "adams_ws1", "adams_ws2", "aea", "aeqd", "affine", "airocean", "airy", + "aitoff", "alsk", "apian", "august", "axisswap", "bacon", "bertin1953", "bipc", "boggs", + "bonne", "calcofi", "cart", "cass", "cc", "ccon", "cea", "chamb", "col_urban", "collg", + "comill", "crast", "defmodel", "deformation", "denoy", "eck1", "eck2", "eck3", "eck4", + "eck5", "eck6", "eqc", "eqdc", "eqearth", "etmerc", "euler", "fahey", "fouc", "fouc_s", + "gall", "geoc", "geocent", "geogoffset", "geos", "gins8", "gn_sinu", "gnom", "goode", + "gridshift", "gs48", "gs50", "gstmerc", "guyou", "hammer", "hatano", "healpix", "helmert", + "hgridshift", "horner", "id", "igh", "igh_o", "imoll", "imoll_o", "imw_p", "isea", "kav5", + "kav7", "krovak", "labrd", "laea", "lagrng", "larr", "lask", "latlon", "latlong", "lcc", + "lcca", "leac", "lee_os", "longlat", "lonlat", "loxim", "lsat", "mbt_fps", "mbt_s", + "mbtfpp", "mbtfpq", "mbtfps", "merc", "mil_os", "mill", "misrsom", "mod_krovak", "moll", + "molobadekas", "molodensky", "murd1", "murd2", "murd3", "name", "natearth", "natearth2", + "nell", + "nell_h", "nicol", "noop", "nsper", "nzmg", "ob_tran", "ocea", "oea", "omerc", "ortel", + "ortho", "patterson", "pconic", "peirce_q", "pipeline", "poly", "putp1", "putp2", "putp3", + "pop", "push", "putp3p", "putp4p", "putp5", "putp5p", "putp6", "putp6p", "qsc", "qua_aut", + "rhealpix", + "robin", "rouss", "rpoly", "s2", "sch", "set", "sinu", "som", "somerc", "spilhaus", + "stere", "sterea", "tcc", "tcea", "times", "tinshift", "tissot", "tmerc", "tobmerc", + "topocentric", "tpeqd", "tpers", "unitconvert", "ups", "urm5", "urmfps", "utm", "vandg", + "vandg2", "vandg3", "vandg4", "vertoffset", "vgridshift", "vitk1", "wag1", "wag2", "wag3", + "wag4", "wag5", "wag6", "wag7", "webmerc", "weren", "wink1", "wink2", "wintri", + "xyzgridshift", + }; + + /** + * PROJ 9.8.1's {@code src/ellps.cpp} names (46), plus the three proj4j-only or proj4j-broken + * ones. Probed as {@code +proj=merc +ellps= ...}. + */ + public static final String[] ELLIPSOIDS = { + "APL4.9", "CPM", "GRS67", "GRS80", "GSK2011", "IAU76", "MERIT", "NAD27", "NAD83", + "NWL9D", "PZ90", "SEasia", "SGS85", "WGS60", "WGS66", "WGS72", "WGS84", "airy", "andrae", + "aust_SA", "australian", "bess_nam", "bessel", "clrk66", "clrk80", "clrk80ign", "danish", + "delmbr", "engelis", "evrst30", "evrst48", "evrst56", "evrst69", "evrstSS", "fschr60", + "fschr60m", "fschr68", "helmert", "hough", "intl", "kaula", "krass", "lerch", "mod_airy", + "mprts", "new_intl", "plessis", "sphere", "walbeck", + }; + + /** + * The modifier sweep: 44 parameters, each appended to each host. {@code slug} must be filesystem- + * and TSV-safe and must be stable, because it is half the row key. + */ + public static final String[][] MODIFIERS = { + // -- ellipsoid shape. The whole reason this section exists. ----------------------------- + {"rf", "+rf=300"}, + {"f", "+f=0.003352810681182"}, + {"es", "+es=0.006694380022901"}, + {"e", "+e=0.081819191042816"}, + {"b", "+b=6356752.314140356"}, + {"a", "+a=6400000"}, + {"R", "+R=6370997"}, + // -- spherification. proj4j has R_A only, and it scales a without clearing es. --------- + {"R_A", "+R_A"}, + {"R_V", "+R_V"}, + {"R_a", "+R_a"}, + {"R_g", "+R_g"}, + {"R_h", "+R_h"}, + {"R_lat_a", "+R_lat_a=45"}, + {"R_lat_g", "+R_lat_g=45"}, + {"R_C", "+R_C"}, + // -- datum. +datum= swallows every other datum parameter in proj4j. -------------------- + {"ellps_clrk66", "+ellps=clrk66"}, + {"datum_WGS84", "+datum=WGS84"}, + {"datum_NAD27", "+datum=NAD27"}, + {"datum_NAD83", "+datum=NAD83"}, + {"datum_potsdam", "+datum=potsdam"}, + {"datum_nad83_lower", "+datum=nad83"}, + {"towgs84_3", "+towgs84=1,2,3"}, + {"towgs84_7", "+towgs84=1,2,3,4,5,6,7"}, + {"towgs84_zero", "+towgs84=0,0,0,0,0,0,0"}, + {"nadgrids_null", "+nadgrids=@null"}, + {"nadgrids_conus", "+nadgrids=@conus,@alaska"}, + // -- prime meridian and axes ------------------------------------------------------------ + {"pm_paris", "+pm=paris"}, + {"pm_numeric", "+pm=1.5"}, + {"axis_neu", "+axis=neu"}, + {"axis_wsu", "+axis=wsu"}, + // -- units. +vunits is rejected outright today, which kills 158 whole registry defs. ---- + {"units_us_ft", "+units=us-ft"}, + {"units_km", "+units=km"}, + {"vunits_m", "+vunits=m"}, + {"to_meter", "+to_meter=0.3048"}, + {"vto_meter", "+vto_meter=1"}, + // -- projection parameters with known precedence or hard-coding defects ----------------- + {"k", "+k=0.9996"}, + {"k_0", "+k_0=0.9996"}, + {"lat_ts", "+lat_ts=45"}, + {"alpha", "+alpha=-45"}, + {"gamma", "+gamma=10"}, + {"lonc", "+lonc=10"}, + {"no_uoff", "+no_uoff"}, + {"south", "+south"}, + {"zone", "+zone=31"}, + {"h", "+h=35785831"}, + {"x_0_y_0", "+x_0=500000 +y_0=1000000"}, + {"unknown_keyword", "+unknown_keyword=1"}, + }; + + /** One transform to evaluate, at one or more probe points. */ + public static final class Case { + public final String section; + public final String key; + /** Diagnostic name of the source CRS. */ + public final String srcName; + /** Diagnostic name of the target CRS. */ + public final String tgtName; + /** Parameters of the source CRS, or {@code null} to use {@code createFromName(srcName)}. */ + public final String[] srcParams; + /** Parameters of the target CRS, or {@code null} to use {@code createFromName(tgtName)}. */ + public final String[] tgtParams; + /** + * Pinned input coordinates in source-CRS units, {@code [probe][x, y, z]}, or {@code null} to + * take the probes from {@code probes.tsv}. + */ + public final double[][] coords; + /** {@code +proj=} of the source, for the index file and rule matching. */ + public final String srcProj; + /** {@code +proj=} of the target. */ + public final String tgtProj; + /** Sorted union of both sides' parameter key names, for {@code params_present}. */ + public final String paramKeys; + /** Sorted union of both sides' {@code +datum=} values, for {@code datums}. */ + public final String datums; + /** True when the input coordinates are lon/lat degrees, so {@code inside} is meaningful. */ + public final boolean geographicInput; + + Case(String section, String key, String srcName, String[] srcParams, String tgtName, + String[] tgtParams, double[][] coords, String srcProj, String tgtProj, + String paramKeys, String datums, boolean geographicInput) { + this.section = section; + this.key = key; + this.srcName = srcName; + this.srcParams = srcParams; + this.tgtName = tgtName; + this.tgtParams = tgtParams; + this.coords = coords; + this.srcProj = srcProj; + this.tgtProj = tgtProj; + this.paramKeys = paramKeys; + this.datums = datums == null ? "" : datums; + this.geographicInput = geographicInput; + } + } + + private InputSet() { + } + + // ------------------------------------------------------------------------------ helpers + + public static String[] split(String projString) { + List out = new ArrayList(); + int start = 0; + for (int i = 0; i <= projString.length(); i++) { + if (i == projString.length() || projString.charAt(i) == ' ') { + if (i > start) out.add(projString.substring(start, i)); + start = i + 1; + } + } + return out.toArray(new String[0]); + } + + static String keysOf(String[]... groups) { + TreeSet keys = new TreeSet(); + for (int g = 0; g < groups.length; g++) { + String[] params = groups[g]; + if (params == null) continue; + for (int i = 0; i < params.length; i++) { + String p = params[i]; + if (p.isEmpty()) continue; + if (p.charAt(0) == '+') p = p.substring(1); + int eq = p.indexOf('='); + keys.add(eq < 0 ? p : p.substring(0, eq)); + } + } + StringBuilder sb = new StringBuilder(); + for (String k : keys) { + if (sb.length() > 0) sb.append(','); + sb.append(k); + } + return sb.toString(); + } + + /** + * The {@code +datum=} values carried by either side, sorted, de-duplicated and + * comma-joined — the {@code datums} column of {@code golden-index.tsv} and what a + * {@code datums:} rule predicate matches against. + * + *

Why a set and not a scalar

+ * + *

{@code REG} and {@code SYN} cases have a WGS84 source and one interesting target, but a + * {@code CSV} or {@code PAIR} case has two real CRS and either side can be the one a rule means. + * A single column holding {@code "NAD27"} for {@code epsg:4267>epsg:26731} and {@code "WGS84"} + * for the reverse would make the predicate depend on which way the pair happened to be written. + * The union is direction-independent, and it matches ANY-of, exactly like + * {@code params_present}. + * + *

The consequence, stated rather than hidden: {@code datums: [NAD27]} also matches a pair + * whose source is NAD27. Combine it with {@code src_proj}/{@code tgt_proj} or + * {@code sections} when that matters — and pin {@code expected_rows}, which is what catches it + * if it does. + * + *

Values are taken verbatim from the definition text

+ * + *

No case folding, no aliasing: {@code +datum=nad83} and {@code +datum=NAD83} are different + * strings here, because they are different strings in the dictionaries and + * {@code SYN mod/*/datum_nad83_lower} exists precisely to probe that. A rule that means both + * must list both. + */ + static String datumsOf(String[]... groups) { + TreeSet values = new TreeSet(); + for (int g = 0; g < groups.length; g++) { + String[] params = groups[g]; + if (params == null) continue; + for (int i = 0; i < params.length; i++) { + String p = params[i]; + if (p.isEmpty()) continue; + if (p.charAt(0) == '+') p = p.substring(1); + if (p.startsWith("datum=") && p.length() > "datum=".length()) { + values.add(p.substring("datum=".length())); + } + } + } + StringBuilder sb = new StringBuilder(); + for (String v : values) { + if (sb.length() > 0) sb.append(','); + sb.append(v); + } + return sb.toString(); + } + + /** {@link #datumsOf(String[][])} over a def's parameter list, for the {@code REG} section. */ + static String datumsOf(RegistryDict.Def d) { + String v = d == null ? null : d.value("datum"); + return v == null ? "" : v; + } + + static boolean isGeographic(String proj) { + return "longlat".equals(proj) || "latlong".equals(proj) + || "latlon".equals(proj) || "lonlat".equals(proj); + } + + private static final String[] WGS84_PARAMS = split(WGS84); + + // ---------------------------------------------------------------------------- REG section + + /** Every registry def, probed from WGS84 lon/lat. */ + public static List registry(List defs) { + List out = new ArrayList(defs.size()); + for (int i = 0; i < defs.size(); i++) { + RegistryDict.Def d = defs.get(i); + out.add(new Case(GoldenFormat.SECTION_REG, d.key(), + "wgs84", WGS84_PARAMS, + d.crsName(), null, + null, + "longlat", d.proj(), d.paramKeys(), + // The REG source is the WGS84 hub, whose own +datum=WGS84 would appear in every + // one of the 9,013 rows and make the column useless. Only the def's datum is + // recorded, which is the one a rule about a registry entry means. + datumsOf(d), true)); + } + return out; + } + + /** The parameter list every REG key's probes are derived from. */ + public static List registryProbes(List defs) { + List out = new ArrayList(defs.size()); + for (int i = 0; i < defs.size(); i++) { + RegistryDict.Def d = defs.get(i); + out.add(new Probes.Entry(GoldenFormat.SECTION_REG, d.key(), Probes.derive(d.params))); + } + return out; + } + + // ---------------------------------------------------------------------------- SYN section + + /** {@code (key, proj string)} for every synthetic case, in key order. */ + public static List syntheticSpecs() { + List out = new ArrayList(); + for (int i = 0; i < ELLIPSOIDS.length; i++) { + out.add(new String[]{"ellps/" + ELLIPSOIDS[i], + "+proj=merc +ellps=" + ELLIPSOIDS[i] + " +lat_0=45 +lon_0=10 +x_0=0 +y_0=0 +units=m"}); + } + for (int h = 0; h < HOSTS.length; h++) { + for (int m = 0; m < MODIFIERS.length; m++) { + out.add(new String[]{"mod/" + HOSTS[h] + "/" + MODIFIERS[m][0], + "+proj=" + HOSTS[h] + " " + CANONICAL + " " + MODIFIERS[m][1]}); + } + } + for (int i = 0; i < PROJ_NAMES.length; i++) { + out.add(new String[]{"proj/" + PROJ_NAMES[i], "+proj=" + PROJ_NAMES[i] + " " + CANONICAL}); + } + Collections.sort(out, new Comparator() { + public int compare(String[] a, String[] b) { + return a[0].compareTo(b[0]); + } + }); + return out; + } + + public static List synthetic() { + List specs = syntheticSpecs(); + List out = new ArrayList(specs.size()); + for (int i = 0; i < specs.size(); i++) { + String key = specs.get(i)[0]; + String[] params = split(specs.get(i)[1]); + String proj = valueOf(params, "proj"); + out.add(new Case(GoldenFormat.SECTION_SYN, key, + "wgs84", WGS84_PARAMS, + specs.get(i)[1], params, + null, + "longlat", proj, keysOf(params), datumsOf(params), true)); + } + return out; + } + + public static List syntheticProbes() { + List specs = syntheticSpecs(); + List out = new ArrayList(specs.size()); + for (int i = 0; i < specs.size(); i++) { + List params = java.util.Arrays.asList(split(specs.get(i)[1])); + out.add(new Probes.Entry(GoldenFormat.SECTION_SYN, specs.get(i)[0], Probes.derive(params))); + } + return out; + } + + static String valueOf(String[] params, String key) { + String prefix = "+" + key + "="; + for (int i = 0; i < params.length; i++) { + if (params[i].startsWith(prefix)) return params[i].substring(prefix.length()); + } + return ""; + } + + // ---------------------------------------------------------------------------- CSV section + + /** One case per CSV data row, at the row's own pinned coordinate. */ + public static List csv(List rows, Map byKey) { + List out = new ArrayList(rows.size()); + for (int i = 0; i < rows.size(); i++) { + MetaCrsCsv.Row r = rows.get(i); + RegistryDict.Def src = byKey.get(r.srcName()); + RegistryDict.Def tgt = byKey.get(r.tgtName()); + String srcProj = src == null ? "" : src.proj(); + String tgtProj = tgt == null ? "" : tgt.proj(); + String keys = InputSet.keysOf( + src == null ? null : src.paramArray(), + tgt == null ? null : tgt.paramArray()); + out.add(new Case(GoldenFormat.SECTION_CSV, r.key(), + r.srcName(), null, + r.tgtName(), null, + new double[][]{{r.srcX, r.srcY, r.srcZ}}, + srcProj, tgtProj, keys, + datumsOf(src == null ? null : src.paramArray(), + tgt == null ? null : tgt.paramArray()), + isGeographic(srcProj))); + } + return out; + } + + // --------------------------------------------------------------------------- PAIR section + + public static final String PAIRS_HEADER = "key\tsrc\ttgt\tsrctype\ttgttype"; + + /** + * Reads the curated CRS→CRS pairs. Probes are lon/lat, so every curated source is a + * geographic CRS and the input coordinates live in {@code probes.tsv} like every other geographic + * probe — nothing about the pair needs pinning beyond the two CRS names. + */ + public static List pairs(File pairsFile, Map byKey) + throws IOException { + List out = new ArrayList(); + if (!pairsFile.isFile()) return out; + BufferedReader r = GoldenFormat.reader(pairsFile); + try { + String line = r.readLine(); + if (line == null || !line.equals(PAIRS_HEADER)) { + throw new IOException(pairsFile + ": unexpected header: " + line); + } + while ((line = r.readLine()) != null) { + if (line.isEmpty() || line.charAt(0) == '#') continue; + String[] c = GoldenFormat.split(line, 5); + RegistryDict.Def src = byKey.get(c[1]); + RegistryDict.Def tgt = byKey.get(c[2]); + String srcProj = src == null ? "" : src.proj(); + String tgtProj = tgt == null ? "" : tgt.proj(); + out.add(new Case(GoldenFormat.SECTION_PAIR, c[0], + c[1], null, c[2], null, null, + srcProj, tgtProj, + InputSet.keysOf(src == null ? null : src.paramArray(), + tgt == null ? null : tgt.paramArray()), + datumsOf(src == null ? null : src.paramArray(), + tgt == null ? null : tgt.paramArray()), + isGeographic(srcProj))); + } + } finally { + r.close(); + } + return out; + } + + /** Probes for the PAIR section are derived from the source CRS's definition. */ + public static List pairProbes(List pairs, Map byKey) { + List out = new ArrayList(pairs.size()); + for (int i = 0; i < pairs.size(); i++) { + Case c = pairs.get(i); + RegistryDict.Def src = byKey.get(c.srcName); + List params = src == null + ? java.util.Arrays.asList(WGS84_PARAMS) : src.params; + out.add(new Probes.Entry(GoldenFormat.SECTION_PAIR, c.key, Probes.derive(params))); + } + return out; + } + + /** {@code key -> def} over every dictionary, for the CSV and PAIR sections' index columns. */ + public static Map index(List defs) { + Map m = new HashMap(defs.size() * 2); + for (int i = 0; i < defs.size(); i++) { + m.put(defs.get(i).key(), defs.get(i)); + } + return m; + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/MetaCrsCsv.java b/golden/src/main/java/org/locationtech/proj4j/golden/MetaCrsCsv.java new file mode 100644 index 0000000..ce91d0d --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/MetaCrsCsv.java @@ -0,0 +1,219 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +/** + * Reads the MetaCRS-format CSV test files that live in {@code core/src/test/resources}. + * + *

Five files, 4,996 data rows in total as of this commit: + * + * + * + * + * + * + * + * + * + * + *
{@code proj4-epsg.csv}4,280every row probes the single point (1.0, -1.0)
{@code PROJ4_SPCS_EPSG_nad83.csv}225220 live plus 5 commented-out {@code ESRI:102631} {@code omerc} rows
{@code PROJ4_SPCS_nad27.csv}265orphaned; NAD27 SPCS coverage that exists nowhere else
{@code PROJ4_SPCS_ESRI_nad83.csv}225orphaned; byte-identical to the EPSG file bar retargeting
{@code TestData.csv}1
+ * + *

Commented rows are included. A leading {@code '#'} is stripped and the row is read + * normally. Five rows in {@code PROJ4_SPCS_EPSG_nad83.csv} are commented out, four of them tagged + * "Bug in Proj4J Obl Merc", and they are among the few in-repo witnesses for the {@code omerc} + * defect. Hiding a known-bad case behind {@code '#'} is how it stops being tracked; the golden suite + * takes no view on whether a row is right, only on whether it moved, so a + * known-broken row is a perfectly good baseline row. + * + *

These files are read from the working tree, not from the classpath. They are + * {@code core}'s test resources and {@code core} publishes no test jar. That means the input set + * floats with the tree while the code under baseline is pinned at 1.4.3 — a deliberate + * choice, documented in README.md: a change to the input set shows up as ADDED/REMOVED rows, which + * the rules file can declare, rather than being invisible. + */ +public final class MetaCrsCsv { + + /** The files read, in the order the CSV section walks them. Keys sort within a file by line. */ + public static final String[] FILES = { + "PROJ4_SPCS_EPSG_nad83.csv", + "PROJ4_SPCS_ESRI_nad83.csv", + "PROJ4_SPCS_nad27.csv", + "TestData.csv", + "proj4-epsg.csv", + }; + + /** One data row. Only the columns the golden suite uses are retained. */ + public static final class Row { + public final String file; + public final int line; + public final boolean commented; + public final String srcAuth; + public final String srcCode; + public final String tgtAuth; + public final String tgtCode; + public final double srcX; + public final double srcY; + public final double srcZ; + + Row(String file, int line, boolean commented, String srcAuth, String srcCode, + String tgtAuth, String tgtCode, double srcX, double srcY, double srcZ) { + this.file = file; + this.line = line; + this.commented = commented; + this.srcAuth = srcAuth; + this.srcCode = srcCode; + this.tgtAuth = tgtAuth; + this.tgtCode = tgtCode; + this.srcX = srcX; + this.srcY = srcY; + this.srcZ = srcZ; + } + + /** + * The golden key: {@code "proj4-epsg.csv:00042"}. The line number is zero-padded to five + * digits so that the US-ASCII total order coincides with line order — without the padding + * line 100 would sort before line 20 and a reviewer reading a diff would have to reorder it + * mentally. + */ + public String key() { + return file + ":" + pad(line); + } + + public String srcName() { + return srcAuth.toLowerCase(java.util.Locale.ROOT) + ":" + srcCode; + } + + public String tgtName() { + return tgtAuth.toLowerCase(java.util.Locale.ROOT) + ":" + tgtCode; + } + } + + static String pad(int n) { + String s = Integer.toString(n); + StringBuilder sb = new StringBuilder(5); + for (int i = s.length(); i < 5; i++) sb.append('0'); + return sb.append(s).toString(); + } + + private MetaCrsCsv() { + } + + /** Reads all five files from {@code dir}. A missing file is skipped, not an error. */ + public static List readAll(File dir) throws IOException { + List out = new ArrayList(5000); + for (int i = 0; i < FILES.length; i++) { + File f = new File(dir, FILES[i]); + if (!f.isFile()) continue; + read(f, FILES[i], out); + } + return out; + } + + private static void read(File f, String name, List out) throws IOException { + BufferedReader r = new BufferedReader( + new InputStreamReader(new FileInputStream(f), "ISO-8859-1"), 1 << 16); + try { + String line; + int lineNo = 0; + while ((line = r.readLine()) != null) { + lineNo++; + String s = line; + boolean commented = false; + // A leading '#' is either a file-level comment (the MetaCRS licence banner in + // TestData.csv) or a disabled data row. Distinguish by whether what follows parses. + if (s.startsWith("#")) { + commented = true; + s = s.substring(1); + } + if (s.trim().isEmpty()) continue; + String[] c = splitCsv(s); + if (c.length < 12) continue; + if ("testName".equals(c[0])) continue; // header + double x = parse(c[6]); + double y = parse(c[7]); + if (Double.isNaN(x) || Double.isNaN(y)) continue; // banner / prose line + if (c[2].isEmpty() || c[3].isEmpty() || c[4].isEmpty() || c[5].isEmpty()) continue; + double z = parse(c[8]); + if (Double.isNaN(z)) z = 0.0; + out.add(new Row(name, lineNo, commented, c[2], c[3], c[4], c[5], x, y, z)); + } + } finally { + r.close(); + } + } + + private static double parse(String s) { + String t = s.trim(); + if (t.isEmpty()) return Double.NaN; + // Deliberately strict: no hex, no "NaN", no "Infinity", no leading '+'. Double.parseDouble + // accepts all of those and a prose column that happened to start with a digit would sail + // through. + int i = 0; + if (t.charAt(0) == '-') i = 1; + boolean digit = false; + boolean dot = false; + for (; i < t.length(); i++) { + char ch = t.charAt(i); + if (ch >= '0' && ch <= '9') digit = true; + else if (ch == '.' && !dot) dot = true; + else return Double.NaN; + } + if (!digit) return Double.NaN; + try { + return Double.parseDouble(t); + } catch (NumberFormatException e) { + return Double.NaN; + } + } + + /** + * Minimal RFC-4180 field splitter. Necessary rather than {@code split(",")} because the + * {@code dataCmnts} and {@code maintenanceCmnts} columns hold free prose containing commas, and + * because most rows quote every field while {@code PROJ4_SPCS_nad27.csv} leaves the empty + * {@code srcOrd3} unquoted. + */ + static String[] splitCsv(String line) { + List out = new ArrayList(20); + StringBuilder cur = new StringBuilder(); + boolean inQuote = false; + for (int i = 0; i < line.length(); i++) { + char ch = line.charAt(i); + if (inQuote) { + if (ch == '"') { + if (i + 1 < line.length() && line.charAt(i + 1) == '"') { + cur.append('"'); + i++; + } else { + inQuote = false; + } + } else { + cur.append(ch); + } + } else if (ch == '"') { + inQuote = true; + } else if (ch == ',') { + out.add(cur.toString()); + cur.setLength(0); + } else { + cur.append(ch); + } + } + out.add(cur.toString()); + return out.toArray(new String[0]); + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/Probes.java b/golden/src/main/java/org/locationtech/proj4j/golden/Probes.java new file mode 100644 index 0000000..8c019bb --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/Probes.java @@ -0,0 +1,360 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Domain-derived probe points, and the checked-in table of them. + * + *

Why probes are derived from parameters

+ * + * There is no area-of-use database in proj4j (that arrives with {@code proj4j-db}, several stages + * away), so a CRS's plausible domain has to be inferred from the CRS's own definition. The existing + * in-repo attempt at this is {@code core/src/test/java/org/locationtech/proj4j/proj/ + * ProjectionGridRoundTripper.gridExtent}, and the alternative — the one + * {@code core/src/test/resources/proj4-epsg.csv} takes — is worse: all 4,280 of its rows probe the + * single point (1.0, -1.0), in the Gulf of Guinea, so a Malaysian {@code omerc} is evaluated at + * {@code x = -1.24e7} and every row in the file is far outside its CRS's domain. + * + *

The four defects in {@code gridExtent} that are NOT reproduced here

+ * + *
    + *
  1. {@code Double.MIN_VALUE} as a max-tracker seed. {@code gridExtent:123} writes + * {@code new double[] {Double.MAX_VALUE, Double.MIN_VALUE}}. {@code Double.MIN_VALUE} is + * {@code +4.9e-324} — the smallest positive subnormal, not the most negative double. So + * for a CRS whose latitudes are all negative, {@code latExtent[1]} never moves, the guard at + * {@code :132} ({@code latExtent[1] > Double.MIN_VALUE}) is false, and the method silently falls + * back to a 10° box centred on the equator. Every southern-hemisphere CRS is probed in the + * wrong hemisphere. Here there is no sentinel at all: {@link #candidates} counts what it + * found.
  2. + *
  3. {@code lat == 0.0} conflated with "absent". {@code updateLat:150} is + * {@code if (lat == 0.0) return;}. {@code +lat_0=0} is explicit, legal and extremely common — + * every UTM zone and every equatorial Mercator has it — and it is not the same as an absent + * {@code +lat_0}. Here presence is decided by whether the token is in the definition + * text and parses, so {@code 0} is a value.
  4. + *
  5. Unbounded box height. {@code gridExtent:136} is {@code gridWidth = 2 * dlat} with no + * cap, so {@code +lat_1=-70 +lat_2=70} yields a 280°-tall box whose corners are past both + * poles. Here the half-height is clamped to {@link #MAX_LAT_HALF} and the resulting latitudes to + * ±{@link #LAT_LIMIT}.
  6. + *
  7. No {@code cos(lat)} scaling on the longitude half-width. {@code gridExtent:140-143} + * uses the same {@code gridWidth/2} for both axes, so a 5°-wide box at 70°N spans 190 km + * of longitude and 555 km of latitude. Here the longitude half-width is divided by + * {@code cos(latC)} so the box is roughly square on the ground, with a floor on the cosine + * ({@link #COS_FLOOR}) so it stays finite at the poles.
  8. + *
+ * + *

Why the result is checked in

+ * + * {@code probes.tsv} is a committed input, written once by {@code GoldenInputs} and read by + * {@code GoldenGenerator}, which never recomputes. Two reasons: + *
    + *
  • The derivation reads the definition text, not a parsed {@code Projection}, so it does + * not go through the code under test — but even so, a change to this file would move + * every probe and make all ~53,000 rows differ at once, hiding whatever real change was under + * review. Freezing the probes makes the input set an input.
  • + *
  • A run against released 1.4.3 and a run against the working tree must use bit-identical probes, + * or the comparison means nothing. Hex doubles in a file guarantee that; agreeing derivation code + * across two classpaths does not.
  • + *
+ * Regenerate deliberately, and expect the whole table to move: + * {@code mvn -Pgolden -pl golden -am test -Dtest=GoldenInputsTest -Dgolden.regenerate.inputs=true}. + */ +public final class Probes { + + /** Probes per key. Fixed at 5 by the plan: the centre plus the four corners. */ + public static final int PROBE_COUNT = 5; + + /** Half-height when the definition carries no usable latitude parameter, in degrees. */ + public static final double DEFAULT_LAT_HALF = 5.0; + /** Floor on the half-height, so a degenerate span still produces five distinct points. */ + public static final double MIN_LAT_HALF = 1.0; + /** Cap on the half-height. Fixes {@code gridExtent}'s unbounded {@code 2 * dlat}. */ + public static final double MAX_LAT_HALF = 15.0; + /** Cap on the half-width, after cosine scaling. */ + public static final double MAX_LON_HALF = 60.0; + /** Floor on {@code cos(latC)}, so a polar CRS does not get an infinite half-width. */ + public static final double COS_FLOOR = 0.05; + /** + * Latitudes are clamped here rather than to exactly ±90. Not for numerical safety — + * proj4j is entitled to be asked for a pole — but because a probe exactly at a pole makes a large + * family of projections degenerate to the same singular answer, so the row stops distinguishing + * anything. The poles are covered explicitly by the synthetic matrix instead. + */ + public static final double LAT_LIMIT = 89.0; + + /** + * The angular parameters consulted, in precedence order for the longitude centre and as a set for + * the latitude span. These are the eight the plan names. + */ + public static final String[] LAT_KEYS = {"lat_0", "lat_1", "lat_2", "lat_ts"}; + + private Probes() { + } + + /** One key's five probe points; {@code [i][0]} is longitude, {@code [i][1]} latitude, degrees. */ + public static double[][] derive(List params) { + Def d = new Def(params); + + // ---- latitude centre and half-height, from however many of the four we found ------------ + int found = 0; + double lo = 0.0; + double hi = 0.0; + for (int i = 0; i < LAT_KEYS.length; i++) { + double v = d.angle(LAT_KEYS[i]); + if (Double.isNaN(v)) continue; // absent or unparseable -- NOT "is zero" + if (v < -90.0 || v > 90.0) continue; // nonsense in the def; ignore rather than propagate + if (found == 0) { + lo = v; + hi = v; + } else { + if (v < lo) lo = v; + if (v > hi) hi = v; + } + found++; + } + + double latC; + double latHalf; + if (found == 0) { + // No latitude information in the definition at all. This is the honest answer for a + // geographic CRS, which has no domain to declare. Two parameter-derived hints still + // apply, both of them properties of the declared datum rather than guesses: + // +south -> the southern hemisphere, which is the entire point of the flag + // +datum=NAD27/83 -> North America, which is where those datums are defined, and which + // is the difference between exercising the grid-shift path and not. + String datum = d.value("datum"); + if ("NAD27".equals(datum) || "NAD83".equals(datum)) { + latC = 45.0; + latHalf = DEFAULT_LAT_HALF; + } else if (d.has("south")) { + latC = -25.0; + latHalf = DEFAULT_LAT_HALF; + } else { + latC = 0.0; + latHalf = DEFAULT_LAT_HALF; + } + } else { + latC = (lo + hi) / 2.0; + double span = hi - lo; + latHalf = span > 0.0 ? clamp(span, MIN_LAT_HALF, MAX_LAT_HALF) : DEFAULT_LAT_HALF; + } + + // ---- longitude centre ------------------------------------------------------------------- + // +lonc beats +lon_0 in omerc, so it is consulted first; +zone is a last resort and is the + // only place a longitude can come from an integer. TransverseMercatorProjection.setUTMZone + // overwrites lon_0 from the zone anyway, so a def carrying both is probed on the zone's + // meridian either way -- but +lon_0 is what the text says, so the text wins here. + double lonC = d.angle("lon_0"); + if (Double.isNaN(lonC)) lonC = d.angle("lonc"); + if (Double.isNaN(lonC)) { + int zone = d.integer("zone"); + // PROJ's zone->central-meridian relation. Range-checked, because + // TransverseMercatorProjection.setUTMZone does not check it and +zone=0 or +zone=99 must + // not silently produce a probe on a meridian that does not exist. + if (zone >= 1 && zone <= 60) lonC = -183.0 + 6.0 * zone; + } + if (Double.isNaN(lonC)) { + String datum = d.value("datum"); + lonC = ("NAD27".equals(datum) || "NAD83".equals(datum)) ? -100.0 : 0.0; + } + if (lonC < -360.0 || lonC > 360.0) lonC = 0.0; + + // ---- the box ---------------------------------------------------------------------------- + double cos = Math.cos(Math.toRadians(latC)); + if (cos < COS_FLOOR) cos = COS_FLOOR; + double lonHalf = clamp(latHalf / cos, MIN_LAT_HALF, MAX_LON_HALF); + + double latLo = Math.max(latC - latHalf, -LAT_LIMIT); + double latHi = Math.min(latC + latHalf, LAT_LIMIT); + double latMid = clamp(latC, -LAT_LIMIT, LAT_LIMIT); + double lonLo = wrapLon(lonC - lonHalf); + double lonHi = wrapLon(lonC + lonHalf); + double lonMid = wrapLon(lonC); + + double[][] p = new double[PROBE_COUNT][2]; + p[0][0] = lonMid; p[0][1] = latMid; // centre + p[1][0] = lonLo; p[1][1] = latLo; // SW + p[2][0] = lonHi; p[2][1] = latLo; // SE + p[3][0] = lonLo; p[3][1] = latHi; // NW + p[4][0] = lonHi; p[4][1] = latHi; // NE + return p; + } + + private static double clamp(double v, double lo, double hi) { + return v < lo ? lo : (v > hi ? hi : v); + } + + /** + * Wraps into {@code [-180, 180)}. Uses {@code floor} rather than a {@code while} loop: proj4j's + * own {@code ProjectionMath.normalizeLongitude} is an unbounded {@code while} that runs ~1.6e17 + * iterations for 1e18 radians, and there is no reason for the golden suite to import that shape. + */ + static double wrapLon(double lon) { + double w = lon - 360.0 * Math.floor((lon + 180.0) / 360.0); + // floor() can leave exactly +180.0 for inputs a hair below a multiple of 360 due to the + // division; normalise so the wrap is total. + if (w >= 180.0) w -= 360.0; + if (w < -180.0) w += 360.0; + return w; + } + + /** Read-only view of a parameter list, for the derivation only. */ + static final class Def { + private final List params; + + Def(List params) { + this.params = params; + } + + String value(String key) { + String prefix = "+" + key + "="; + for (int i = 0; i < params.size(); i++) { + String p = params.get(i); + // PROJ takes the FIRST occurrence of a duplicated key; proj4j's HashMap takes the + // last. The probe derivation follows PROJ, because the probe is a property of the + // definition, not of whichever parser is being tested. + if (p.startsWith(prefix)) return p.substring(prefix.length()); + } + return null; + } + + boolean has(String key) { + String bare = "+" + key; + String prefix = bare + "="; + for (int i = 0; i < params.size(); i++) { + String p = params.get(i); + if (p.equals(bare) || p.startsWith(prefix)) return true; + } + return false; + } + + double angle(String key) { + String v = value(key); + return v == null ? Double.NaN : Angles.parseDegrees(v); + } + + int integer(String key) { + String v = value(key); + if (v == null) return -1; + for (int i = 0; i < v.length(); i++) { + if (v.charAt(i) < '0' || v.charAt(i) > '9') return -1; + } + try { + return Integer.parseInt(v); + } catch (NumberFormatException e) { + return -1; + } + } + } + + // ----------------------------------------------------------------- the table + + /** The checked-in probe table: {@code (section, key)} to five {@code (lon, lat)} pairs. */ + public static final class Table { + private final Map byKey = new HashMap(); + + public boolean has(String section, String key) { + return byKey.containsKey(section + '\t' + key); + } + + public double[][] get(String section, String key) { + return byKey.get(section + '\t' + key); + } + + public int size() { + return byKey.size(); + } + + void put(String section, String key, double[][] p) { + byKey.put(section + '\t' + key, p); + } + } + + public static final String HEADER = "section\tkey\tprobe\tlon\tlat"; + + public static Table read(File f) throws IOException { + Table t = new Table(); + BufferedReader r = GoldenFormat.reader(f); + try { + String line = r.readLine(); + if (line == null) throw new IOException(f + " is empty"); + if (!line.equals(HEADER)) throw new IOException(f + ": unexpected header: " + line); + while ((line = r.readLine()) != null) { + if (line.isEmpty()) continue; + String[] c = GoldenFormat.split(line, 5); + int idx = Integer.parseInt(c[2]); + if (idx < 0 || idx >= PROBE_COUNT) { + throw new IOException(f + ": probe index out of range: " + line); + } + double[][] p = t.get(c[0], c[1]); + if (p == null) { + p = new double[PROBE_COUNT][2]; + for (int i = 0; i < PROBE_COUNT; i++) { + p[i][0] = Double.NaN; + p[i][1] = Double.NaN; + } + t.put(c[0], c[1], p); + } + p[idx][0] = GoldenFormat.unhex(c[3]); + p[idx][1] = GoldenFormat.unhex(c[4]); + } + } finally { + r.close(); + } + return t; + } + + /** Writes the table in the golden total order. */ + public static void write(File f, List entries) throws IOException { + List sorted = new ArrayList(entries); + Collections.sort(sorted, new java.util.Comparator() { + public int compare(Entry a, Entry b) { + int c = a.section.compareTo(b.section); + if (c != 0) return c; + return a.key.compareTo(b.key); + } + }); + Writer w = GoldenFormat.writer(f); + try { + w.write(HEADER); + w.write('\n'); + for (int i = 0; i < sorted.size(); i++) { + Entry e = sorted.get(i); + for (int p = 0; p < PROBE_COUNT; p++) { + GoldenFormat.writeRow(w, e.section, e.key, Integer.toString(p), + GoldenFormat.hex(e.probes[p][0]), GoldenFormat.hex(e.probes[p][1])); + } + } + } finally { + w.close(); + } + } + + public static final class Entry { + public final String section; + public final String key; + public final double[][] probes; + + public Entry(String section, String key, double[][] probes) { + this.section = section; + this.key = key; + this.probes = probes; + } + } +} diff --git a/golden/src/main/java/org/locationtech/proj4j/golden/RegistryDict.java b/golden/src/main/java/org/locationtech/proj4j/golden/RegistryDict.java new file mode 100644 index 0000000..efc971d --- /dev/null +++ b/golden/src/main/java/org/locationtech/proj4j/golden/RegistryDict.java @@ -0,0 +1,259 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeMap; + +/** + * Reads the five PROJ.4 init dictionaries that {@code proj4j-epsg} ships, straight off the + * classpath, and hands back an ordered list of {@code (code, definition text)}. + * + *

Measured at the pinned 1.4.3 data (byte-identical to the working tree's as of this commit): + * {@code epsg} 5,755 · {@code esri} 2,954 · {@code world} 47 · {@code nad83} 123 + * · {@code nad27} 134 = 9,013 CRS. Those five numbers are asserted by the self-tests, + * so a dictionary edit is visible immediately rather than as an unexplained mass of ADDED/REMOVED + * rows two hours later. + * + *

This is a second, independent parser for a format proj4j already parses + * ({@code io/Proj4FileReader} uses a {@code StreamTokenizer}). That duplication is intentional: the + * golden suite must be able to enumerate the input set without depending on the code under test to + * agree about what the input set is. If proj4j's reader starts skipping a def, this reader + * still emits its key and the row becomes a visible {@code EXC:} / status transition rather than + * silently vanishing. + * + *

The format, as it actually appears in the files

+ *
+ * # a comment, running to end of line, and legal anywhere including after <code>
+ * <3819> +proj=longlat +ellps=bessel +no_defs  <>
+ *
+ * <101> proj=tmerc  datum=NAD27          # leading '+' is optional
+ * lon_0=-85d50 lat_0=30d30 k=.99996      # and definitions span lines
+ * no_defs <>
+ *
+ * <gk2-d> # Gauss Krueger Grid for Germany
+ *         proj=tmerc ellps=bessel lon_0=6d0E lat_0=0
+ *         no_defs<>                      # and '<>' need not be whitespace-separated
+ * 
+ * A def starts at {@code } and ends at the empty element {@code <>}. + */ +public final class RegistryDict { + + /** The five dictionaries, in the order the golden table's REG section walks them. */ + public static final String[] AUTHORITIES = {"epsg", "esri", "nad27", "nad83", "world"}; + + /** Expected def counts, asserted by the self-tests. */ + public static final int[] EXPECTED_COUNTS = {5755, 2954, 134, 123, 47}; + + public static final int EXPECTED_TOTAL = 9013; + + /** One definition: its code within its authority, and its parameter tokens. */ + public static final class Def { + public final String authority; + public final String code; + /** Parameter tokens, each normalised to start with {@code '+'}, in file order. */ + public final List params; + + Def(String authority, String code, List params) { + this.authority = authority; + this.code = code; + this.params = Collections.unmodifiableList(params); + } + + /** The golden-table key: {@code "epsg:4326"}. Lower-case authority, verbatim code. */ + public String key() { + return authority + ":" + code; + } + + /** The name to hand {@code CRSFactory.createFromName}. Identical to {@link #key()}. */ + public String crsName() { + return key(); + } + + /** The value of {@code +proj=}, or {@code ""} if the def does not carry one. */ + public String proj() { + String v = value("proj"); + return v == null ? "" : v; + } + + /** The value of parameter {@code key} (without the {@code '+'}), or null. */ + public String value(String key) { + String prefix = "+" + key + "="; + for (int i = 0; i < params.size(); i++) { + String p = params.get(i); + if (p.startsWith(prefix)) return p.substring(prefix.length()); + } + return null; + } + + public boolean has(String key) { + String bare = "+" + key; + String prefix = bare + "="; + for (int i = 0; i < params.size(); i++) { + String p = params.get(i); + if (p.equals(bare) || p.startsWith(prefix)) return true; + } + return false; + } + + /** Sorted, de-duplicated parameter key names, for the index file's {@code params} column. */ + public String paramKeys() { + Set keys = new java.util.TreeSet(); + for (int i = 0; i < params.size(); i++) { + String p = params.get(i); + int eq = p.indexOf('='); + keys.add(eq < 0 ? p.substring(1) : p.substring(1, eq)); + } + StringBuilder sb = new StringBuilder(); + for (String k : keys) { + if (sb.length() > 0) sb.append(','); + sb.append(k); + } + return sb.toString(); + } + + public String[] paramArray() { + return params.toArray(new String[0]); + } + } + + private RegistryDict() { + } + + /** + * Reads every def in every dictionary, in a fixed total order: authority in + * {@link #AUTHORITIES} order, then code in US-ASCII order. + */ + public static List readAll() throws IOException { + List all = new ArrayList(EXPECTED_TOTAL); + for (int i = 0; i < AUTHORITIES.length; i++) { + all.addAll(read(AUTHORITIES[i])); + } + return all; + } + + /** Reads one dictionary, sorted by code in US-ASCII order. */ + public static List read(String authority) throws IOException { + String resource = "proj4/nad/" + authority; + InputStream in = RegistryDict.class.getClassLoader().getResourceAsStream(resource); + if (in == null) { + throw new IOException("cannot find " + resource + " on the classpath; is proj4j-epsg a dependency?"); + } + String text; + try { + text = slurpLatin1(in); + } finally { + in.close(); + } + + // A TreeMap gives the US-ASCII sort and, incidentally, tells us about duplicate codes: + // Proj4FileReader returns the FIRST match, so we keep the first too. + TreeMap byCode = new TreeMap(); + parse(authority, text, byCode); + return new ArrayList(byCode.values()); + } + + /** + * Reads bytes as Latin-1 rather than UTF-8. A few {@code world} entries carry high bytes in + * their comments ("Gauss Krueger" attributions with German names). Latin-1 is a total function + * from bytes to chars, so this cannot throw or insert U+FFFD; the comments are stripped anyway, + * and any high byte that survives into a key is replaced by {@link GoldenFormat#sanitise}. + */ + private static String slurpLatin1(InputStream in) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(1 << 20); + byte[] buf = new byte[1 << 16]; + int n; + while ((n = in.read(buf)) > 0) bos.write(buf, 0, n); + return new String(bos.toByteArray(), "ISO-8859-1"); + } + + private static void parse(String authority, String text, TreeMap out) { + String current = null; + List params = new ArrayList(); + StringBuilder tok = new StringBuilder(); + + int i = 0; + int n = text.length(); + while (i < n) { + char ch = text.charAt(i); + + if (ch == '#') { + // Comment to end of line. Terminates the token in progress. + flush(tok, params); + while (i < n && text.charAt(i) != '\n') i++; + continue; + } + + if (ch == '<') { + flush(tok, params); + int close = text.indexOf('>', i + 1); + if (close < 0) break; // truncated file; nothing sane to do + String name = text.substring(i + 1, close).trim(); + i = close + 1; + if (name.isEmpty()) { + // "<>" closes the current def. + if (current != null && !out.containsKey(current)) { + out.put(current, new Def(authority, current, new ArrayList(params))); + } + current = null; + params = new ArrayList(); + } else { + // A new "" without an intervening "<>" would be malformed; treat it as + // closing the previous def so one bad entry cannot swallow the rest of the file. + if (current != null && !out.containsKey(current)) { + out.put(current, new Def(authority, current, new ArrayList(params))); + } + current = GoldenFormat.sanitise(name); + params = new ArrayList(); + } + continue; + } + + if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n') { + flush(tok, params); + i++; + continue; + } + + tok.append(ch); + i++; + } + flush(tok, params); + if (current != null && !out.containsKey(current)) { + out.put(current, new Def(authority, current, new ArrayList(params))); + } + } + + private static void flush(StringBuilder tok, List params) { + if (tok.length() == 0) return; + String t = tok.toString(); + tok.setLength(0); + // Leading '+' is optional in the nad27/nad83/world dictionaries; normalise so downstream + // code has exactly one shape to handle. + params.add(t.charAt(0) == '+' ? t : "+" + t); + } + + /** Every distinct {@code +proj=} value present across all five dictionaries, sorted. */ + public static Set projNames(List defs) { + Set s = new java.util.TreeSet(); + for (int i = 0; i < defs.size(); i++) { + String p = defs.get(i).proj(); + if (!p.isEmpty()) s.add(p); + } + return new LinkedHashSet(s); + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/GoldenDiff.java b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenDiff.java new file mode 100644 index 0000000..af47016 --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenDiff.java @@ -0,0 +1,621 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Diffs a fresh golden table against a pinned baseline and decides whether every difference was + * declared. + * + *

Mechanism

+ * + * A streaming merge join on {@code (section, key, probe)}, in the total order + * {@link GoldenFormat#compareRows} defines. Streaming rather than "load both into a + * {@code HashMap}" for two reasons: it is O(1) in memory over the ~53,000-row tables (which will grow + * as the dictionaries do), and — more importantly — it verifies the sort order as it goes. An + * out-of-order row is a hard error, not a silently-missed join: a hash-map diff would happily report a + * mis-sorted file as thousands of ADDED plus thousands of REMOVED and the reviewer would blame the + * code under test. + * + *

Each joined row is classified: + * + * + * + * + * + *
{@code UNCHANGED}present both sides, all eleven columns byte-identical
{@code CHANGED}present both sides, at least one column differs
{@code ADDED}current only
{@code REMOVED}baseline only
+ * Byte-identity is exact bit-identity because the columns are {@link Double#toHexString} output. There + * is no epsilon here and there must not be: this suite measures change, and gie measures + * correctness. + * + *

Non-{@code UNCHANGED} rows are then offered to each rule in {@code rules.yaml} in file order. + * The first rule that both matches and expects the row tags it {@code INTENDED[]}. Anything + * unclaimed is {@code UNEXPLAINED}. + * + *

Exit code

+ * + * Non-zero on any of: an {@code UNEXPLAINED} row, a {@code DEAD_RULE} (matched nothing), an + * {@code EXPIRED_RULE}, or a {@code COUNT_MISMATCH} against a pinned {@code expected_rows}. A run with + * no changes at all and no rules is the steady state and exits zero. + */ +public final class GoldenDiff { + + public static final String UNCHANGED = "UNCHANGED"; + public static final String CHANGED = "CHANGED"; + public static final String ADDED = "ADDED"; + public static final String REMOVED = "REMOVED"; + + private GoldenDiff() { + } + + /** One difference, with everything a rule can match on. */ + static final class Change { + final String classification; + final String section; + final String key; + final int probe; + /** Baseline row's 11 columns, or {@code null} for {@code ADDED}. */ + final String[] base; + /** Current row's 11 columns, or {@code null} for {@code REMOVED}. */ + final String[] cur; + String srcProj = ""; + String tgtProj = ""; + String params = ""; + /** Comma-separated, sorted {@code +datum=} values from the index file; may be empty. */ + String datums = ""; + /** Numeric dimensions that moved, in {@link GoldenFormat#DIMENSIONS} order. */ + final List moved = new ArrayList(6); + boolean statusMoved; + boolean insideMoved; + /** Max {@code |current - baseline|} over the moved dimensions; NaN when not computable. */ + double magnitude = Double.NaN; + boolean nonFinite; + + Change(String classification, String section, String key, int probe, + String[] base, String[] cur) { + this.classification = classification; + this.section = section; + this.key = key; + this.probe = probe; + this.base = base; + this.cur = cur; + if (base != null && cur != null) { + for (int i = 0; i < GoldenFormat.DIMENSIONS.length; i++) { + int col = GoldenFormat.COL_FX + i; + if (!base[col].equals(cur[col])) { + moved.add(GoldenFormat.DIMENSIONS[i]); + double b = GoldenFormat.unhex(base[col]); + double c = GoldenFormat.unhex(cur[col]); + if (isFinite(b) && isFinite(c)) { + double d = Math.abs(c - b); + if (Double.isNaN(magnitude) || d > magnitude) magnitude = d; + } else { + nonFinite = true; + } + } + } + statusMoved = !base[GoldenFormat.COL_STATUS].equals(cur[GoldenFormat.COL_STATUS]); + insideMoved = !base[GoldenFormat.COL_INSIDE].equals(cur[GoldenFormat.COL_INSIDE]); + } + } + + String statusBase() { + return base == null ? "" : base[GoldenFormat.COL_STATUS]; + } + + String statusCur() { + return cur == null ? "" : cur[GoldenFormat.COL_STATUS]; + } + + String movedText() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < moved.size(); i++) { + if (sb.length() > 0) sb.append(','); + sb.append(moved.get(i)); + } + if (statusMoved) sb.append(sb.length() > 0 ? ",status" : "status"); + if (insideMoved) sb.append(sb.length() > 0 ? ",inside" : "inside"); + return sb.length() == 0 ? "-" : sb.toString(); + } + } + + private static boolean isFinite(double d) { + return !Double.isNaN(d) && !Double.isInfinite(d); + } + + /** Outcome of a run. */ + public static final class Result { + public int unchanged; + public int changed; + public int added; + public int removed; + public int intended; + public int unexplained; + public int baselineRows; + public int currentRows; + /** Hard failures, each already formatted for a human. */ + public final List failures = new ArrayList(); + /** Up to {@link #SAMPLE} unexplained rows, for the failure message. */ + public final List unexplainedSample = new ArrayList(); + public final Map perRule = new LinkedHashMap(); + + public static final int SAMPLE = 25; + + public boolean ok() { + return failures.isEmpty(); + } + + public int exitCode() { + return failures.isEmpty() ? 0 : 1; + } + + public String summary() { + return "golden diff: " + unchanged + " UNCHANGED, " + changed + " CHANGED, " + + added + " ADDED, " + removed + " REMOVED; " + + intended + " INTENDED, " + unexplained + " UNEXPLAINED" + + " (baseline " + baselineRows + " rows, current " + currentRows + " rows)"; + } + } + + // ------------------------------------------------------------------------------------ main + + /** + * Usage: {@code GoldenDiff [reportFile]}. + */ + public static void main(String[] args) throws IOException { + if (args.length < 3) { + System.err.println("usage: GoldenDiff [reportFile]"); + System.exit(2); + } + File report = args.length > 3 ? new File(args[3]) : new File(args[1], "golden-report.tsv"); + Result r = run(new File(args[0]), new File(args[1]), new File(args[2]), report, new Date()); + System.out.println(r.summary()); + for (int i = 0; i < r.failures.size(); i++) System.out.println("FAIL " + r.failures.get(i)); + System.out.println("report: " + report); + System.exit(r.exitCode()); + } + + // ------------------------------------------------------------------------------------- run + + public static Result run(File baselineDir, File currentDir, File rulesFile, File reportFile, + Date today) throws IOException { + GoldenRules rules = GoldenRules.load(rulesFile); + Result result = new Result(); + + File baseGolden = new File(baselineDir, GoldenFormat.GOLDEN_FILE); + File curGolden = new File(currentDir, GoldenFormat.GOLDEN_FILE); + if (!baseGolden.isFile()) { + throw new IOException("no baseline at " + baseGolden + + " -- generate one with -Pgolden,golden-baseline (see golden/README.md)"); + } + if (!curGolden.isFile()) { + throw new IOException("no current table at " + curGolden); + } + + Map baseIndex = readIndex(new File(baselineDir, GoldenFormat.INDEX_FILE)); + Map curIndex = readIndex(new File(currentDir, GoldenFormat.INDEX_FILE)); + + List changes = new ArrayList(); + + RowReader a = new RowReader(baseGolden); + RowReader b = new RowReader(curGolden); + try { + String[] ra = a.next(); + String[] rb = b.next(); + while (ra != null || rb != null) { + int cmp; + if (ra == null) cmp = 1; + else if (rb == null) cmp = -1; + else cmp = GoldenFormat.compareRows(ra, rb); + + if (cmp == 0) { + if (equalRows(ra, rb)) { + result.unchanged++; + } else { + result.changed++; + changes.add(new Change(CHANGED, ra[GoldenFormat.COL_SECTION], + ra[GoldenFormat.COL_KEY], probe(ra), ra, rb)); + } + ra = a.next(); + rb = b.next(); + } else if (cmp < 0) { + result.removed++; + changes.add(new Change(REMOVED, ra[GoldenFormat.COL_SECTION], + ra[GoldenFormat.COL_KEY], probe(ra), ra, null)); + ra = a.next(); + } else { + result.added++; + changes.add(new Change(ADDED, rb[GoldenFormat.COL_SECTION], + rb[GoldenFormat.COL_KEY], probe(rb), null, rb)); + rb = b.next(); + } + } + } finally { + a.close(); + b.close(); + } + result.baselineRows = a.count; + result.currentRows = b.count; + + for (int i = 0; i < changes.size(); i++) { + Change c = changes.get(i); + String[] idx = curIndex.get(c.section + '\t' + c.key); + if (idx == null) idx = baseIndex.get(c.section + '\t' + c.key); + if (idx != null) { + c.srcProj = idx[0]; + c.tgtProj = idx[1]; + c.params = idx[2]; + c.datums = idx[3]; + } + } + + Writer report = GoldenFormat.writer(reportFile); + try { + GoldenFormat.writeRow(report, "classification", "section", "key", "probe", + "verdict", "rule", "moved", "magnitude", "status_from", "status_to"); + for (int i = 0; i < changes.size(); i++) { + Change c = changes.get(i); + GoldenRules.Rule winner = null; + for (int j = 0; j < rules.rules().size(); j++) { + GoldenRules.Rule rule = rules.rules().get(j); + if (!matches(rule, c)) continue; + String decline = declines(rule, c); + if (decline != null) { + // Recorded, not fatal on its own: the row falls through. If nothing else + // claims it, this text is what tells the reviewer which rule nearly fit. + if (rule.declined.size() < 10) { + rule.declined.add(c.section + "/" + c.key + "#" + c.probe + ": " + decline); + } + continue; + } + winner = rule; + break; + } + String verdict; + String ruleId; + if (winner == null) { + verdict = "UNEXPLAINED"; + ruleId = "-"; + result.unexplained++; + if (result.unexplainedSample.size() < Result.SAMPLE) { + result.unexplainedSample.add(c.classification + " " + c.section + "/" + + c.key + "#" + c.probe + " moved=" + c.movedText() + + " mag=" + (Double.isNaN(c.magnitude) ? "n/a" + : Double.toString(c.magnitude)) + + " status " + c.statusBase() + " -> " + c.statusCur()); + } + } else { + verdict = "INTENDED"; + ruleId = winner.id; + winner.matched++; + result.intended++; + } + GoldenFormat.writeRow(report, c.classification, c.section, c.key, + Integer.toString(c.probe), verdict, ruleId, c.movedText(), + Double.isNaN(c.magnitude) ? "-" : GoldenFormat.hex(c.magnitude), + c.statusBase().isEmpty() ? "-" : c.statusBase(), + c.statusCur().isEmpty() ? "-" : c.statusCur()); + } + } finally { + report.close(); + } + + // ---- rule-level gates ------------------------------------------------------------------ + for (int j = 0; j < rules.rules().size(); j++) { + GoldenRules.Rule rule = rules.rules().get(j); + result.perRule.put(rule.id, Integer.valueOf(rule.matched)); + if (rule.expired(today)) { + result.failures.add("EXPIRED_RULE " + rule.id + " expired " + rule.expiresText + + " -- fold it into a new baseline and delete it, or extend it deliberately"); + } + if (GoldenRules.PENDING.equals(rule.status)) { + if (rule.matched > 0) { + result.failures.add("PENDING_RULE_FIRED " + rule.id + " matched " + rule.matched + + " row(s) while marked pending -- the change has landed: set status: active" + + " and pin expected_rows: " + rule.matched); + } + continue; + } + if (rule.matched == 0) { + StringBuilder sb = new StringBuilder("DEAD_RULE " + rule.id + + " matched 0 rows -- delete it, or find out why the change it describes is not" + + " happening (if the change has not landed yet, mark the rule status: pending)"); + for (int k = 0; k < rule.declined.size(); k++) { + sb.append("\n declined: ").append(rule.declined.get(k)); + } + result.failures.add(sb.toString()); + } else if (rule.countPinned && rule.matched != rule.expectedRows) { + result.failures.add("COUNT_MISMATCH " + rule.id + " expected_rows=" + + rule.expectedRows + " but matched " + rule.matched + + " -- the count is exact and two-sided on purpose; " + (rule.matched + > rule.expectedRows + ? "something else moved with it" + : "part of the change is not happening, possibly masked by another defect")); + } + } + if (result.unexplained > 0) { + StringBuilder sb = new StringBuilder("UNEXPLAINED " + result.unexplained + + " row(s) changed with no rule claiming them. First " + + result.unexplainedSample.size() + ":"); + for (int i = 0; i < result.unexplainedSample.size(); i++) { + sb.append("\n ").append(result.unexplainedSample.get(i)); + } + result.failures.add(sb.toString()); + } + return result; + } + + private static int probe(String[] row) { + return Integer.parseInt(row[GoldenFormat.COL_PROBE]); + } + + private static boolean equalRows(String[] a, String[] b) { + for (int i = 0; i < GoldenFormat.GOLDEN_COLUMNS; i++) { + if (!a[i].equals(b[i])) return false; + } + return true; + } + + // -------------------------------------------------------------------------------- matching + + /** The {@code match} predicates. All present must hold. */ + static boolean matches(GoldenRules.Rule r, Change c) { + if (r.classifications != null && !r.classifications.contains(c.classification)) return false; + if (r.sections != null && !r.sections.contains(c.section)) return false; + if (r.probes != null && !r.probes.contains(Integer.valueOf(c.probe))) return false; + if (r.keyGlobs != null) { + boolean any = false; + for (int i = 0; i < r.keyGlobs.size(); i++) { + if (GoldenRules.glob(r.keyGlobs.get(i), c.key)) { + any = true; + break; + } + } + if (!any) return false; + } + if (r.authorities != null && !r.authorities.contains(authorityOf(c.key))) return false; + if (r.codeMin != Long.MIN_VALUE || r.codeMax != Long.MAX_VALUE) { + long code = codeOf(c.key); + // A non-numeric code (world:CH1903, SYN keys) never satisfies a numeric range. Silently + // treating it as 0 would sweep 47 world entries into every "code_min: 0" rule. + if (code == Long.MIN_VALUE) return false; + if (code < r.codeMin || code > r.codeMax) return false; + } + if (r.srcProj != null && !r.srcProj.contains(c.srcProj)) return false; + if (r.tgtProj != null && !r.tgtProj.contains(c.tgtProj)) return false; + if (r.paramsPresent != null) { + boolean any = false; + for (int i = 0; i < r.paramsPresent.size(); i++) { + if (hasParam(c.params, r.paramsPresent.get(i))) { + any = true; + break; + } + } + if (!any) return false; + } + if (r.paramsAbsent != null) { + for (int i = 0; i < r.paramsAbsent.size(); i++) { + if (hasParam(c.params, r.paramsAbsent.get(i))) return false; + } + } + if (r.datums != null) { + // ANY-of, like params_present -- but on the parameter's VALUE, which is the whole point: + // params_present matches keys, so "the defs whose datum is NAD27" was previously + // expressible only by enumerating several hundred keys. + boolean any = false; + for (int i = 0; i < r.datums.size(); i++) { + if (hasParam(c.datums, r.datums.get(i))) { + any = true; + break; + } + } + if (!any) return false; + } + if (r.datumsAbsent != null) { + for (int i = 0; i < r.datumsAbsent.size(); i++) { + if (hasParam(c.datums, r.datumsAbsent.get(i))) return false; + } + } + if (r.statusFrom != null && !GoldenRules.glob(r.statusFrom, c.statusBase())) return false; + if (r.statusTo != null && !GoldenRules.glob(r.statusTo, c.statusCur())) return false; + return true; + } + + /** + * The {@code expect} constraints. Returns {@code null} when the rule accepts the row, else a + * human-readable reason for declining it. + */ + static String declines(GoldenRules.Rule r, Change c) { + if (!CHANGED.equals(c.classification)) { + // ADDED/REMOVED rows have no counterpart, so there is nothing to constrain the movement + // of. The match predicates are the whole test for them. + return null; + } + if (r.dimensions != null) { + for (int i = 0; i < c.moved.size(); i++) { + if (!r.dimensions.contains(c.moved.get(i))) { + return "moved in dimension '" + c.moved.get(i) + + "' which the rule does not sanction (allows " + r.dimensions + ")"; + } + } + } + if (c.statusMoved && !r.allowStatusChange) { + return "status changed (" + c.statusBase() + " -> " + c.statusCur() + + ") and allow_status_change is not set"; + } + if (c.insideMoved && !r.allowInsideChange) { + return "inside changed (" + c.base[GoldenFormat.COL_INSIDE] + " -> " + + c.cur[GoldenFormat.COL_INSIDE] + ") and allow_inside_change is not set"; + } + if (c.nonFinite && !r.allowNonFinite) { + return "a moved ordinate is NaN or Infinity on one side and allow_nonfinite is not set"; + } + if (r.magnitudeGiven) { + if (Double.isNaN(c.magnitude)) { + // Every moved dimension was non-finite, so there is no magnitude to band. Only + // reachable with allow_nonfinite, and a rule that declares a band must not be + // satisfied by "the magnitude is unknowable". + return "magnitude band declared but no finite movement to measure"; + } + if (c.magnitude < r.magMin || c.magnitude > r.magMax) { + return "magnitude " + c.magnitude + " outside declared band [" + + r.magMin + ", " + r.magMax + "]"; + } + } + return null; + } + + static String authorityOf(String key) { + int i = key.indexOf(':'); + return i < 0 ? "" : key.substring(0, i); + } + + /** The numeric part after the colon, or {@link Long#MIN_VALUE} when there is not one. */ + static long codeOf(String key) { + int i = key.indexOf(':'); + if (i < 0) return Long.MIN_VALUE; + String s = key.substring(i + 1); + if (s.isEmpty()) return Long.MIN_VALUE; + for (int j = 0; j < s.length(); j++) { + if (s.charAt(j) < '0' || s.charAt(j) > '9') return Long.MIN_VALUE; + } + try { + return Long.parseLong(s); + } catch (NumberFormatException e) { + return Long.MIN_VALUE; + } + } + + /** + * Exact membership in a comma-separated, sorted, non-quoted set. Used for both the + * {@code params} (key names) and {@code datums} (parameter values) columns; both are written by + * {@code InputSet} with the same joining rules, and neither can contain a comma because + * {@code GoldenFormat.assertClean} would have refused the row. + */ + static boolean hasParam(String params, String key) { + if (params.isEmpty()) return false; + int from = 0; + while (from <= params.length()) { + int comma = params.indexOf(',', from); + int end = comma < 0 ? params.length() : comma; + if (end - from == key.length() && params.regionMatches(from, key, 0, key.length())) { + return true; + } + if (comma < 0) break; + from = comma + 1; + } + return false; + } + + // ------------------------------------------------------------------------------------- I/O + + /** Streams a golden file, verifying the header, the column count and the sort order. */ + static final class RowReader { + private final BufferedReader r; + private final File f; + private String[] prev; + int count; + + RowReader(File f) throws IOException { + this.f = f; + this.r = GoldenFormat.reader(f); + String header = r.readLine(); + if (!GoldenFormat.HEADER_GOLDEN.equals(header)) { + throw new IOException(f + ": unexpected header: " + header); + } + } + + String[] next() throws IOException { + String line; + while ((line = r.readLine()) != null) { + if (line.isEmpty()) continue; + String[] row = GoldenFormat.split(line, GoldenFormat.GOLDEN_COLUMNS); + if (prev != null) { + int cmp = GoldenFormat.compareRows(prev, row); + if (cmp > 0) { + throw new IOException(f + ": rows out of order at line " + (count + 2) + + " -- the merge join requires the golden total order (section, key, probe)" + + " compared as US-ASCII bytes; got " + prev[0] + "/" + prev[1] + "#" + + prev[2] + " then " + row[0] + "/" + row[1] + "#" + row[2]); + } + if (cmp == 0) { + throw new IOException(f + ": duplicate row key at line " + (count + 2) + + ": " + row[0] + "/" + row[1] + "#" + row[2]); + } + } + prev = row; + count++; + return row; + } + return null; + } + + void close() { + try { + r.close(); + } catch (IOException ignored) { + // closing a reader we have finished with + } + } + } + + /** + * Reads {@code golden-index.tsv}, in either the current six-column form or the five-column form + * that predates the {@code datums} column. + * + *

The legacy form has to be accepted because {@code baseline/1.4.3/golden-index.tsv} is a + * committed artefact of a released build and is not rewritten by a normal run. It is consulted + * only for a {@code (section, key)} the current run did not emit — which today is nothing, since + * the diff reports 0 {@code ADDED} and 0 {@code REMOVED} — and a legacy row yields an empty + * {@code datums} set, so a {@code datums:} predicate declines it. A rule can therefore + * under-claim on a {@code REMOVED} row and never over-claim, and {@code expected_rows} makes + * under-claiming a build failure rather than a silence. + * + *

Anything else is still rejected outright: a header this reader does not recognise means the + * file was written by code that disagrees with it about column meanings, and guessing is how a + * rules engine starts matching the wrong column. + */ + static Map readIndex(File f) throws IOException { + Map out = new HashMap(); + if (!f.isFile()) return out; + BufferedReader r = GoldenFormat.reader(f); + try { + String header = r.readLine(); + final int columns; + if (GoldenFormat.HEADER_INDEX.equals(header)) { + columns = 6; + } else if (GoldenFormat.HEADER_INDEX_V1.equals(header)) { + columns = 5; + } else { + throw new IOException(f + ": unexpected header: " + header); + } + String line; + while ((line = r.readLine()) != null) { + if (line.isEmpty()) continue; + String[] c = GoldenFormat.split(line, columns); + out.put(c[0] + '\t' + c[1], + new String[]{c[2], c[3], c[4], columns == 6 ? c[5] : ""}); + } + } finally { + r.close(); + } + return out; + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/GoldenDiffTest.java b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenDiffTest.java new file mode 100644 index 0000000..b78fbce --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenDiffTest.java @@ -0,0 +1,492 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.Date; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Self-tests for the merge join and the rules engine, on hand-built two-row tables. + * + *

Every one of these asserts a gate that the suite's usefulness depends on. If the rules engine can + * be made to say "explained" when it should not, the whole regime is decoration — so the tests that + * matter most here are the ones proving a rule cannot claim a row it did not describe. + */ +public class GoldenDiffTest { + + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + + // ---------------------------------------------------------------------------- fixtures + + /** {@code status,fx,fy,fz,ix,iy,iz,inside} for one row, defaulting to a plain OK zero row. */ + private static String row(String key, int probe, String status, double fy, String inside) { + return "REG\t" + key + "\t" + probe + "\t" + status + + "\t" + GoldenFormat.hex(1.0) + + "\t" + GoldenFormat.hex(fy) + + "\t" + GoldenFormat.hex(0.0) + + "\t" + GoldenFormat.hex(2.0) + + "\t" + GoldenFormat.hex(3.0) + + "\t" + GoldenFormat.hex(0.0) + + "\t" + inside; + } + + private File table(String name, String... rows) throws IOException { + File dir = tmp.newFolder(name); + Writer w = GoldenFormat.writer(new File(dir, GoldenFormat.GOLDEN_FILE)); + try { + w.write(GoldenFormat.HEADER_GOLDEN); + w.write('\n'); + for (int i = 0; i < rows.length; i++) { + w.write(rows[i]); + w.write('\n'); + } + } finally { + w.close(); + } + Writer idx = GoldenFormat.writer(new File(dir, GoldenFormat.INDEX_FILE)); + try { + idx.write(GoldenFormat.HEADER_INDEX); + idx.write('\n'); + GoldenFormat.writeRow(idx, "REG", "epsg:1000", "longlat", "merc", "ellps,proj,rf", ""); + GoldenFormat.writeRow(idx, "REG", "epsg:2000", "longlat", "tmerc", + "datum,lat_0,proj", "NAD27"); + } finally { + idx.close(); + } + return dir; + } + + private File rules(String body) throws IOException { + File f = tmp.newFile("rules-" + System.nanoTime() + ".yaml"); + Writer w = new java.io.OutputStreamWriter(new java.io.FileOutputStream(f), "UTF-8"); + try { + w.write(body); + } finally { + w.close(); + } + return f; + } + + private GoldenDiff.Result diff(File base, File cur, File rulesFile) throws IOException { + return GoldenDiff.run(base, cur, rulesFile, + new File(tmp.getRoot(), "report-" + System.nanoTime() + ".tsv"), new Date()); + } + + private static final String NO_RULES = "version: 1\nrules: []\n"; + + // ------------------------------------------------------------------------ classification + + @Test + public void classifiesUnchangedChangedAddedRemoved() throws Exception { + File base = table("b", + row("epsg:1000", 0, "OK", 10.0, "T"), + row("epsg:2000", 0, "OK", 20.0, "T"), + row("epsg:3000", 0, "OK", 30.0, "T")); + File cur = table("c", + row("epsg:1000", 0, "OK", 10.0, "T"), // UNCHANGED + row("epsg:2000", 0, "OK", 20.5, "T"), // CHANGED + row("epsg:4000", 0, "OK", 40.0, "T")); // ADDED (and epsg:3000 REMOVED) + GoldenDiff.Result r = diff(base, cur, rules(NO_RULES)); + assertEquals(1, r.unchanged); + assertEquals(1, r.changed); + assertEquals(1, r.added); + assertEquals(1, r.removed); + assertEquals(3, r.unexplained); + assertFalse(r.ok()); + } + + /** + * A one-ULP move is a change. There is deliberately no epsilon anywhere in this comparison: the + * suite measures change, and gie measures correctness. + */ + @Test + public void oneUlpIsAChange() throws Exception { + File base = table("b", row("epsg:1000", 0, "OK", 1234.5, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", Math.nextUp(1234.5), "T")); + GoldenDiff.Result r = diff(base, cur, rules(NO_RULES)); + assertEquals(1, r.changed); + assertEquals(0, r.unchanged); + } + + @Test + public void signedZeroIsAChange() throws Exception { + File base = table("b", row("epsg:1000", 0, "OK", 0.0, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", -0.0, "T")); + assertEquals(1, diff(base, cur, rules(NO_RULES)).changed); + } + + @Test + public void noChangesAndNoRulesIsGreen() throws Exception { + File base = table("b", row("epsg:1000", 0, "OK", 10.0, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", 10.0, "T")); + GoldenDiff.Result r = diff(base, cur, rules(NO_RULES)); + assertTrue(r.summary(), r.ok()); + assertEquals(0, r.exitCode()); + } + + /** A mis-sorted table must be a hard error, not thousands of phantom ADDED plus REMOVED. */ + @Test + public void outOfOrderRowsAreRejected() throws Exception { + File base = table("b", + row("epsg:2000", 0, "OK", 10.0, "T"), + row("epsg:1000", 0, "OK", 10.0, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", 10.0, "T")); + try { + diff(base, cur, rules(NO_RULES)); + fail("expected an out-of-order failure"); + } catch (IOException e) { + assertTrue(e.getMessage(), e.getMessage().contains("out of order")); + } + } + + @Test + public void duplicateRowKeysAreRejected() throws Exception { + File base = table("b", + row("epsg:1000", 0, "OK", 10.0, "T"), + row("epsg:1000", 0, "OK", 11.0, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", 10.0, "T")); + try { + diff(base, cur, rules(NO_RULES)); + fail("expected a duplicate-key failure"); + } catch (IOException e) { + assertTrue(e.getMessage(), e.getMessage().contains("duplicate")); + } + } + + // ------------------------------------------------------------------------- rule gating + + private static String rule(String extra) { + return "version: 1\nrules:\n" + + " - id: TEST-RULE\n" + + " reason: a test\n" + + " expires: 2099-01-01\n" + + extra; + } + + @Test + public void aMatchingRuleExplainsTheRow() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", 20.5, "T")); + GoldenDiff.Result r = diff(base, cur, rules(rule( + " expected_rows: 1\n" + + " match:\n" + + " sections: [REG]\n" + + " expect:\n" + + " dimensions: [fy]\n"))); + assertTrue(r.summary() + " " + r.failures, r.ok()); + assertEquals(1, r.intended); + assertEquals(0, r.unexplained); + } + + @Test + public void aRuleMatchingNothingIsADeadRule() throws Exception { + File base = table("b", row("epsg:1000", 0, "OK", 10.0, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", 10.0, "T")); + GoldenDiff.Result r = diff(base, cur, rules(rule( + " expected_rows: TBD\n match:\n sections: [REG]\n"))); + assertFalse(r.ok()); + assertTrue(r.failures.toString(), r.failures.get(0).startsWith("DEAD_RULE TEST-RULE")); + } + + /** {@code status: pending} exempts a not-yet-landed change from DEAD_RULE, and nothing else. */ + @Test + public void pendingRuleMayMatchNothing() throws Exception { + File base = table("b", row("epsg:1000", 0, "OK", 10.0, "T")); + File cur = table("c", row("epsg:1000", 0, "OK", 10.0, "T")); + GoldenDiff.Result r = diff(base, cur, rules(rule( + " status: pending\n expected_rows: TBD\n match:\n sections: [REG]\n"))); + assertTrue(r.failures.toString(), r.ok()); + } + + @Test + public void pendingRuleThatFiresIsAFailure() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", 20.5, "T")); + GoldenDiff.Result r = diff(base, cur, rules(rule( + " status: pending\n expected_rows: TBD\n match:\n sections: [REG]\n"))); + assertFalse(r.ok()); + assertTrue(r.failures.toString(), r.failures.get(0).startsWith("PENDING_RULE_FIRED")); + } + + /** The count is two-sided: too few is as much a failure as too many. */ + @Test + public void countMismatchFailsInBothDirections() throws Exception { + File base = table("b", + row("epsg:1000", 0, "OK", 10.0, "T"), + row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", + row("epsg:1000", 0, "OK", 10.5, "T"), + row("epsg:2000", 0, "OK", 20.5, "T")); + String body = " expected_rows: %d\n match:\n sections: [REG]\n"; + GoldenDiff.Result tooFew = diff(base, cur, rules(rule(String.format(body, 1)))); + assertFalse(tooFew.ok()); + assertTrue(tooFew.failures.toString(), + tooFew.failures.get(0).startsWith("COUNT_MISMATCH TEST-RULE expected_rows=1 but matched 2")); + + GoldenDiff.Result tooMany = diff(base, cur, rules(rule(String.format(body, 3)))); + assertFalse(tooMany.ok()); + assertTrue(tooMany.failures.toString(), + tooMany.failures.get(0).startsWith("COUNT_MISMATCH TEST-RULE expected_rows=3 but matched 2")); + + GoldenDiff.Result exact = diff(base, cur, rules(rule(String.format(body, 2)))); + assertTrue(exact.failures.toString(), exact.ok()); + } + + @Test + public void expiredRuleFails() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", 20.5, "T")); + File f = rules("version: 1\nrules:\n" + + " - id: OLD\n reason: r\n expires: 2020-01-01\n" + + " expected_rows: 1\n match:\n sections: [REG]\n"); + GoldenDiff.Result r = GoldenDiff.run(base, cur, f, + new File(tmp.getRoot(), "rep.tsv"), new Date()); + assertFalse(r.ok()); + assertTrue(r.failures.toString(), r.failures.get(0).startsWith("EXPIRED_RULE OLD")); + } + + // -------------------------------------------- the crux: a rule cannot hide something else + + @Test + public void aRowMovingInAnUnsanctionedDimensionIsNotExplained() throws Exception { + // The rule sanctions fy. The row moved fy AND ix. + File base = table("b", "REG\tepsg:2000\t0\tOK\t" + + GoldenFormat.hex(1.0) + "\t" + GoldenFormat.hex(20.0) + "\t" + GoldenFormat.hex(0.0) + + "\t" + GoldenFormat.hex(2.0) + "\t" + GoldenFormat.hex(3.0) + "\t" + + GoldenFormat.hex(0.0) + "\tT"); + File cur = table("c", "REG\tepsg:2000\t0\tOK\t" + + GoldenFormat.hex(1.0) + "\t" + GoldenFormat.hex(20.5) + "\t" + GoldenFormat.hex(0.0) + + "\t" + GoldenFormat.hex(99.0) + "\t" + GoldenFormat.hex(3.0) + "\t" + + GoldenFormat.hex(0.0) + "\tT"); + GoldenDiff.Result r = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n sections: [REG]\n" + + " expect:\n dimensions: [fy]\n"))); + assertFalse("the rule must decline, not claim, this row", r.ok()); + assertEquals(1, r.unexplained); + assertEquals(0, r.intended); + // and the DEAD_RULE message must carry the decline reason, so the reviewer can see why + boolean explained = false; + for (int i = 0; i < r.failures.size(); i++) { + if (r.failures.get(i).contains("declined:") && r.failures.get(i).contains("'ix'")) { + explained = true; + } + } + assertTrue(r.failures.toString(), explained); + } + + @Test + public void aStatusChangeNeedsExplicitPermission() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "EXC:java.lang.NullPointerException", 20.0, "T")); + String match = " expected_rows: 1\n match:\n sections: [REG]\n"; + assertFalse(diff(base, cur, rules(rule(match))).ok()); + assertTrue(diff(base, cur, rules(rule(match + + " expect:\n allow_status_change: true\n"))).ok()); + } + + @Test + public void anInsideChangeNeedsExplicitPermission() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", 20.0, "F")); + String match = " expected_rows: 1\n match:\n sections: [REG]\n"; + assertFalse(diff(base, cur, rules(rule(match))).ok()); + assertTrue(diff(base, cur, rules(rule(match + + " expect:\n allow_inside_change: true\n"))).ok()); + } + + @Test + public void aNonFiniteEndpointNeedsExplicitPermission() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", Double.NaN, "T")); + String match = " expected_rows: 1\n match:\n sections: [REG]\n"; + assertFalse(diff(base, cur, rules(rule(match))).ok()); + assertTrue(diff(base, cur, rules(rule(match + + " expect:\n allow_nonfinite: true\n"))).ok()); + } + + @Test + public void magnitudeBandIsEnforcedAtBothEnds() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", 20.5, "T")); + String match = " expected_rows: 1\n match:\n sections: [REG]\n expect:\n" + + " dimensions: [fy]\n magnitude: {min: %s, max: %s}\n"; + assertTrue(diff(base, cur, rules(rule(String.format(match, "0.1", "1.0")))).ok()); + assertFalse("0.5 is below min 1.0", + diff(base, cur, rules(rule(String.format(match, "1.0", "10.0")))).ok()); + assertFalse("0.5 is above max 0.1", + diff(base, cur, rules(rule(String.format(match, "0.0", "0.1")))).ok()); + } + + @Test + public void firstMatchingRuleWins() throws Exception { + File base = table("b", row("epsg:2000", 0, "OK", 20.0, "T")); + File cur = table("c", row("epsg:2000", 0, "OK", 20.5, "T")); + File f = rules("version: 1\nrules:\n" + + " - id: FIRST\n reason: r\n expires: 2099-01-01\n" + + " expected_rows: 1\n match:\n sections: [REG]\n" + + " - id: SECOND\n reason: r\n expires: 2099-01-01\n" + + " status: pending\n expected_rows: TBD\n match:\n sections: [REG]\n"); + GoldenDiff.Result r = diff(base, cur, f); + assertTrue(r.failures.toString(), r.ok()); + assertEquals(Integer.valueOf(1), r.perRule.get("FIRST")); + assertEquals(Integer.valueOf(0), r.perRule.get("SECOND")); + } + + // ----------------------------------------------------------------------- match predicates + + @Test + public void matchPredicatesSelectPrecisely() throws Exception { + File base = table("b", + row("epsg:1000", 0, "OK", 10.0, "T"), + row("epsg:2000", 1, "OK", 20.0, "T")); + File cur = table("c", + row("epsg:1000", 0, "OK", 10.5, "T"), + row("epsg:2000", 1, "OK", 20.5, "T")); + // params_present picks out the one whose index row declares +rf + GoldenDiff.Result byParam = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n params_present: [rf]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals(1, byParam.intended); + // tgt_proj + GoldenDiff.Result byProj = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n tgt_proj: [tmerc]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals(1, byProj.intended); + // probe index + GoldenDiff.Result byProbe = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n probes: [1]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals(1, byProbe.intended); + // code range + GoldenDiff.Result byCode = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n code_min: 1500\n code_max: 2500\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals(1, byCode.intended); + // params_absent + GoldenDiff.Result byAbsent = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n params_absent: [rf]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals(1, byAbsent.intended); + } + + /** + * The {@code datums} predicate, which matches a parameter's value rather than its key. + * + *

Both index rows in the fixture carry a {@code datum} key in {@code params} — so + * {@code params_present: [datum]} cannot separate them, which is exactly why this predicate had + * to exist. Only {@code epsg:2000} has the value {@code NAD27}. + * + *

The three negatives matter as much as the positive: an unlisted value must not match, a + * value that is a prefix of the listed one must not match (the column is a set, not a substring + * search), and {@code datums_absent} must be the complement. + */ + @Test + public void datumsMatchesTheValueAndNotTheKey() throws Exception { + File base = table("b", + row("epsg:1000", 0, "OK", 10.0, "T"), + row("epsg:2000", 1, "OK", 20.0, "T")); + File cur = table("c", + row("epsg:1000", 0, "OK", 10.5, "T"), + row("epsg:2000", 1, "OK", 20.5, "T")); + + GoldenDiff.Result byDatum = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n datums: [NAD27]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals("only epsg:2000 has datum=NAD27", 1, byDatum.intended); + + GoldenDiff.Result absent = diff(base, cur, rules(rule( + " expected_rows: 1\n match:\n datums_absent: [NAD27]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals("and exactly the other one does not", 1, absent.intended); + + GoldenDiff.Result unlisted = diff(base, cur, rules(rule( + " expected_rows: 0\n match:\n datums: [OSGB36]\n" + + " expect:\n dimensions: [fy]\n"))); + assertEquals(0, unlisted.intended); + + // A prefix of the stored value must not match: the column is a comma-separated SET. + assertFalse(GoldenDiff.hasParam("NAD27", "NAD2")); + assertFalse(GoldenDiff.hasParam("NAD27,WGS84", "AD27")); + assertTrue(GoldenDiff.hasParam("NAD27,WGS84", "WGS84")); + assertFalse(GoldenDiff.hasParam("", "NAD27")); + } + + /** + * {@code baseline/1.4.3/golden-index.tsv} was written before the {@code datums} column existed + * and is a committed artefact that a normal run does not rewrite, so the reader has to accept + * its five-column header — and must report an empty datum set for it rather than shifting the + * columns left, which would silently make {@code params} answer {@code datums:} queries. + */ + @Test + public void theIndexReaderAcceptsTheHeaderThatPredatesTheDatumsColumn() throws Exception { + File dir = tmp.newFolder("legacy-index"); + Writer idx = GoldenFormat.writer(new File(dir, GoldenFormat.INDEX_FILE)); + try { + idx.write(GoldenFormat.HEADER_INDEX_V1); + idx.write('\n'); + GoldenFormat.writeRow(idx, "REG", "epsg:2000", "longlat", "tmerc", "datum,proj"); + } finally { + idx.close(); + } + String[] row = GoldenDiff.readIndex(new File(dir, GoldenFormat.INDEX_FILE)) + .get("REG\tepsg:2000"); + assertEquals("longlat", row[0]); + assertEquals("tmerc", row[1]); + assertEquals("datum,proj", row[2]); + assertEquals("a legacy row must yield NO datums, not the params column", "", row[3]); + } + + /** A non-numeric code must never satisfy a numeric range; 47 {@code world} entries depend on it. */ + @Test + public void nonNumericCodesNeverSatisfyACodeRange() { + assertEquals(Long.MIN_VALUE, GoldenDiff.codeOf("world:CH1903")); + assertEquals(Long.MIN_VALUE, GoldenDiff.codeOf("proj/merc")); + assertEquals(4326L, GoldenDiff.codeOf("epsg:4326")); + assertEquals("epsg", GoldenDiff.authorityOf("epsg:4326")); + assertEquals("", GoldenDiff.authorityOf("proj/merc")); + } + + @Test + public void paramMatchingIsWholeTokenNotSubstring() { + assertTrue(GoldenDiff.hasParam("ellps,proj,rf", "rf")); + assertTrue(GoldenDiff.hasParam("ellps,proj,rf", "proj")); + assertTrue(GoldenDiff.hasParam("ellps,proj,rf", "ellps")); + assertFalse("'f' must not match 'rf'", GoldenDiff.hasParam("ellps,proj,rf", "f")); + assertFalse("'ell' must not match 'ellps'", GoldenDiff.hasParam("ellps,proj,rf", "ell")); + assertFalse(GoldenDiff.hasParam("", "rf")); + } + + @Test + public void globIsStarOnly() { + assertTrue(GoldenRules.glob("mod/*/rf", "mod/merc/rf")); + assertFalse("must anchor at the end", GoldenRules.glob("mod/*/f", "mod/merc/rf")); + assertTrue(GoldenRules.glob("mod/*/f", "mod/merc/f")); + assertTrue(GoldenRules.glob("*", "anything")); + assertTrue(GoldenRules.glob("EXC:*", "EXC:java.lang.Error")); + assertFalse(GoldenRules.glob("EXC:*", "OK")); + assertTrue(GoldenRules.glob("t0*/*", "t04/epsg:4267>epsg:26731")); + assertFalse(GoldenRules.glob("t0*/*", "t14/epsg:4267>epsg:26731")); + // '.' and other regex metacharacters are literal + assertFalse(GoldenRules.glob("a.c", "abc")); + assertTrue(GoldenRules.glob("a.c", "a.c")); + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/GoldenFormatTest.java b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenFormatTest.java new file mode 100644 index 0000000..541d210 --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenFormatTest.java @@ -0,0 +1,151 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Random; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Self-tests for the format's four load-bearing properties. Each of these would have caught a real + * class of golden-suite failure — a whole-table false diff, a lost sign, an unreproducible baseline. + */ +public class GoldenFormatTest { + + /** Property 1: bijective on bit patterns, over a large random sample plus every special case. */ + @Test + public void hexRoundTripsEveryBitPattern() { + Random r = new Random(20260731L); + for (int i = 0; i < 200000; i++) { + double d = Double.longBitsToDouble(r.nextLong()); + String s = GoldenFormat.hex(d); + double back = GoldenFormat.unhex(s); + if (Double.isNaN(d)) { + assertTrue("NaN must render as NaN, got " + s, Double.isNaN(back)); + } else { + assertEquals("round trip failed for " + s, + Double.doubleToRawLongBits(d), Double.doubleToRawLongBits(back)); + } + } + double[] special = { + 0.0, -0.0, 1.0, -1.0, Double.MIN_VALUE, -Double.MIN_VALUE, + Double.MIN_NORMAL, Double.MAX_VALUE, -Double.MAX_VALUE, + Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, + Math.PI, 500000.0, 6378137.0, 1e-300, 1e300, + }; + for (int i = 0; i < special.length; i++) { + assertEquals(Double.doubleToRawLongBits(special[i]), + Double.doubleToRawLongBits(GoldenFormat.unhex(GoldenFormat.hex(special[i])))); + } + } + + /** + * Property 2: {@code +0.0} and {@code -0.0} are distinguishable. This is not pedantry — it is the + * difference between the two sides of the equator and of the antimeridian, and sign handling in + * the inverse projections is under active change. + */ + @Test + public void signedZeroIsPreserved() { + assertEquals("0x0.0p0", GoldenFormat.hex(0.0)); + assertEquals("-0x0.0p0", GoldenFormat.hex(-0.0)); + assertFalse("+0.0 and -0.0 must not render identically", + GoldenFormat.hex(0.0).equals(GoldenFormat.hex(-0.0))); + assertEquals(Double.doubleToRawLongBits(-0.0), + Double.doubleToRawLongBits(GoldenFormat.unhex("-0x0.0p0"))); + // And for contrast, what a decimal format would have done to it: + assertEquals("0.00000000000000000", String.format(java.util.Locale.ROOT, "%.17f", 0.0)); + } + + /** Property 4: one ULP differs in one character, so the diff is readable without arithmetic. */ + @Test + public void oneUlpIsOneCharacter() { + // A value with a full 13-digit hex significand, so toHexString does not trim trailing + // zeros and change the string length as well. + double a = Math.PI; + double b = Math.nextUp(a); + String sa = GoldenFormat.hex(a); + String sb = GoldenFormat.hex(b); + assertEquals("same length", sa.length(), sb.length()); + int diffs = 0; + for (int i = 0; i < sa.length(); i++) { + if (sa.charAt(i) != sb.charAt(i)) diffs++; + } + assertEquals("1 ULP should differ in exactly one hex digit: " + sa + " vs " + sb, 1, diffs); + } + + /** Property 3: locale-immune. A German locale must not put a comma in a golden file. */ + @Test + public void hexIsLocaleImmune() { + java.util.Locale saved = java.util.Locale.getDefault(); + try { + java.util.Locale.setDefault(java.util.Locale.GERMANY); + assertEquals("0x1.91eb851eb851fp1", GoldenFormat.hex(3.14)); + assertEquals(3.14, GoldenFormat.unhex("0x1.91eb851eb851fp1"), 0.0); + } finally { + java.util.Locale.setDefault(saved); + } + } + + @Test + public void writeRowEmitsLfAndNothingElse() throws Exception { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + Writer w = new OutputStreamWriter(bos, GoldenFormat.ASCII); + GoldenFormat.writeRow(w, "REG", "epsg:4326", "0"); + w.flush(); + assertArrayEquals(new byte[]{'R', 'E', 'G', '\t', 'e', 'p', 's', 'g', ':', '4', '3', '2', '6', + '\t', '0', '\n'}, bos.toByteArray()); + } + + @Test + public void assertCleanRejectsAnythingNeedingQuoting() { + // A space is legal (0x20 is printable ASCII); tab, the line terminators, NUL and any byte + // outside 0x20-0x7e are not. + String[] bad = {"a\tb", "a\nb", "a\rb", "caf\u00e9", "\u0000"}; + for (int i = 0; i < bad.length; i++) { + try { + GoldenFormat.assertClean(bad[i]); + fail("should have rejected: " + bad[i]); + } catch (IllegalArgumentException expected) { + // the format promises no quoting; the only honest way to promise that is to refuse + } + } + assertEquals("ok", GoldenFormat.assertClean("ok")); + } + + /** {@code String.split} drops trailing empty fields; a golden row's last column may be empty. */ + @Test + public void splitKeepsTrailingEmptyFields() { + assertArrayEquals(new String[]{"a", "b", ""}, GoldenFormat.split("a\tb\t", 3)); + assertArrayEquals(new String[]{"", "", ""}, GoldenFormat.split("\t\t", 3)); + // Documents the trap this method exists to avoid: split() reports 2 fields, not 3. + assertEquals(2, "a\tb\t".split("\t").length); + } + + @Test + public void totalOrderIsSectionThenKeyThenProbe() { + assertTrue(cmp("CSV", "z", "9", "PAIR", "a", "0") < 0); + assertTrue(cmp("REG", "epsg:4326", "0", "REG", "epsg:4326", "1") < 0); + assertTrue(cmp("REG", "epsg:10000", "0", "REG", "epsg:2000", "0") < 0); // ASCII, not numeric + assertEquals(0, cmp("SYN", "proj/merc", "3", "SYN", "proj/merc", "3")); + } + + private static int cmp(String s1, String k1, String p1, String s2, String k2, String p2) { + return GoldenFormat.compareRows(new String[]{s1, k1, p1}, new String[]{s2, k2, p2}); + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/GoldenMasterTest.java b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenMasterTest.java new file mode 100644 index 0000000..c7d4c8a --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenMasterTest.java @@ -0,0 +1,87 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.junit.Assume; +import org.junit.Test; + +import java.io.File; +import java.util.Date; +import java.util.Iterator; +import java.util.Map; + +import static org.junit.Assert.fail; + +/** + * The gate. Generates a golden table from whatever proj4j is on the classpath and diffs it against the + * pinned baseline. + * + *

Modes

+ *
+ * mvn -Pgolden -pl golden -am verify
+ *     Generate from the working tree into target/golden and diff against baseline/1.4.3.
+ *     Fails on any UNEXPLAINED row, DEAD_RULE, PENDING_RULE_FIRED, EXPIRED_RULE or COUNT_MISMATCH.
+ *
+ * mvn -Pgolden,golden-baseline -pl golden verify -Dgolden.regenerate=true
+ *     Generate from RELEASED 1.4.3 and overwrite baseline/1.4.3. No diff. Note: no -am, so the
+ *     working tree's code cannot leak into the baseline.
+ * 
+ * Without {@code -Pgolden} the whole thing is skipped and only the fast self-tests run, so a plain + * {@code mvn install} stays fast. + */ +public class GoldenMasterTest { + + @Test + public void goldenMasterMatchesBaselineOrIsDeclared() throws Exception { + Assume.assumeFalse("golden sweep is opt-in: run with -Pgolden", + Boolean.parseBoolean(System.getProperty("golden.skip", "true"))); + + File goldenDir = new File(System.getProperty("golden.dir", ".")); + File outDir = new File(System.getProperty("golden.out", + new File(goldenDir, "target/golden").getPath())); + String baselineName = System.getProperty("golden.baseline", "1.4.3"); + File baselineDir = new File(new File(goldenDir, "baseline"), baselineName); + boolean regenerate = Boolean.parseBoolean(System.getProperty("golden.regenerate", "false")); + + File target = regenerate ? baselineDir : outDir; + GoldenGenerator.Counters counters = new GoldenGenerator() + .generate(target, goldenDir, GoldenGenerator.defaultCsvDir(goldenDir)); + System.out.println("golden: " + counters.cases + " cases, " + counters.rows + " rows, " + + counters.ok + " OK, " + counters.exceptions + " EXC, " + + counters.noProbe + " NO_PROBE, " + counters.nonFinite + " non-finite"); + + if (regenerate) { + System.out.println("baseline rewritten at " + baselineDir + + " -- commit it together with probes.tsv and pairs.tsv, in one commit"); + return; + } + + File report = new File(outDir, "golden-report.tsv"); + GoldenDiff.Result r = GoldenDiff.run(baselineDir, outDir, + new File(goldenDir, "rules.yaml"), report, new Date()); + + System.out.println(r.summary()); + System.out.println("rows claimed per rule (paste these into expected_rows to pin them):"); + for (Iterator> it = r.perRule.entrySet().iterator(); it.hasNext(); ) { + Map.Entry e = it.next(); + System.out.println(" " + e.getKey() + ": " + e.getValue()); + } + System.out.println("full report: " + report); + + if (!r.ok()) { + StringBuilder sb = new StringBuilder(r.summary()); + sb.append("\nsee ").append(report); + for (int i = 0; i < r.failures.size(); i++) { + sb.append("\n\n").append(r.failures.get(i)); + } + fail(sb.toString()); + } + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/GoldenRules.java b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenRules.java new file mode 100644 index 0000000..0838827 --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenRules.java @@ -0,0 +1,435 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.yaml.snakeyaml.Yaml; + +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * {@code rules.yaml}: the declarations that turn a row change from {@code UNEXPLAINED} into + * {@code INTENDED}. + * + *

The design constraint that shapes everything here

+ * + * A rule must not be able to hide an unrelated regression. A golden-master suite whose rules + * are broad predicates degenerates into a rubber stamp within a month: someone writes + * {@code sections: [REG]} to get a release out, and from then on the suite is silent about 45,065 + * rows. Four mechanisms prevent that, and none of them is optional: + * + *
    + *
  1. {@code expected_rows} is exact and two-sided. Not a maximum. If a rule was written for + * 943 rows and matches 942 or 944, the build fails. A fix that moves fewer rows than expected is + * as interesting as one that moves more — usually it means a second defect is masking part of it, + * which is exactly how the {@code +R} / Albers-spherical-inverse coupling was found.
  2. + *
  3. A rule matching zero rows is a {@code DEAD_RULE} failure. Otherwise stale rules + * accumulate, and each one is a live licence to change behaviour that nobody is watching any more. + * Deleting a dead rule is a one-line commit; leaving it is a permanent hole.
  4. + *
  5. {@code expires} is mandatory. A rule is a statement that a change is intended right + * now, during this piece of work. Past the release it should be folded into a new baseline + * and deleted. The expiry is what forces that conversation instead of letting the rules file + * become the specification.
  6. + *
  7. A failing {@code expect} clause does not make the rule match. If the match predicates + * select a row but the row moved in a dimension the rule did not sanction, or by a magnitude + * outside the declared band, the rule declines the row and it falls through to the next + * rule and ultimately to {@code UNEXPLAINED}. The diagnostic records which rules declined and + * why. This is the only safe direction: the alternative — treating a matched-but-unexpected row as + * explained — is precisely the rubber stamp.
  8. + *
+ * + *

Schema

+ *
+ * version: 1
+ * rules:
+ *   - id: SOME-ID                  # required, unique, [A-Za-z0-9._-]+
+ *     reason: |                    # required, free text; why this change is intended
+ *       ...
+ *     expires: 2027-06-30          # required, ISO-8601 date
+ *     expected_rows: 943           # required: an integer, or the literal TBD
+ *     match:                       # all predicates present must hold (AND)
+ *       sections: [REG, SYN]       #   golden section
+ *       keys: ["mod/*/rf"]           #   glob on the row key
+ *       authorities: [epsg, esri]  #   for REG/CSV/PAIR keys: the authority prefix
+ *       code_min: 2000             #   numeric code range, inclusive; non-numeric codes never match
+ *       code_max: 32766
+ *       src_proj: [longlat]        #   +proj= of the source CRS
+ *       tgt_proj: [merc, tmerc]    #   +proj= of the target CRS
+ *       params_present: [rf, f]    #   ANY of these parameter keys present (OR within the list)
+ *       params_absent: [datum]     #   ALL of these absent
+ *       datums: [NAD27]            #   ANY of these +datum= VALUES on either side (OR)
+ *       datums_absent: [WGS84]     #   ALL of these values absent
+ *       probes: [0, 1, 2, 3, 4]    #   probe index
+ *       classifications: [CHANGED] #   CHANGED / ADDED / REMOVED
+ *       status_from: "OK"          #   glob on the baseline status
+ *       status_to: "EXC:*"          #   glob on the current status
+ *     expect:                      # constraints; failing one makes the rule DECLINE the row
+ *       dimensions: [fy, iy]       #   only these numeric columns may move
+ *       allow_status_change: true  #   default false
+ *       allow_inside_change: false #   default false
+ *       allow_nonfinite: true      #   default false; needed if either side is NaN/Infinity
+ *       magnitude: {min: 1.0, max: 1.0e9}   # band on max |current - baseline| over moved dimensions
+ * 
+ * + *

An empty {@code match} matches every changed row. That is legal and occasionally correct (a + * whole-table rebaseline in progress), but combined with an exact {@code expected_rows} it is not a + * licence: it still has to name the total. + */ +public final class GoldenRules { + + public static final String TBD = "TBD"; + + /** A rule expected to be claiming rows now. Must match at least one, or it is a {@code DEAD_RULE}. */ + public static final String ACTIVE = "active"; + /** + * A rule for a change that has not landed yet. Must match exactly zero rows; the moment it + * matches one, the build fails with {@code PENDING_RULE_FIRED} telling you to flip it to + * {@code active} and pin {@code expected_rows}. + * + *

This exists because six streams are changing numerical behaviour concurrently and their rules + * have to be written before their code lands — otherwise the first person to land a change meets an + * {@code UNEXPLAINED} wall with no rule to point at. It cannot be used to hide anything: a pending + * rule that absorbs a row is a failure, not a pass, so the only thing {@code pending} buys is + * silence about a change that is not happening yet. + */ + public static final String PENDING = "pending"; + + /** One rule. Immutable once parsed. */ + public static final class Rule { + public final String id; + public final String reason; + public final java.util.Date expires; + public final String expiresText; + /** {@code -1} when {@code expected_rows} is {@code TBD}. */ + public final int expectedRows; + public final boolean countPinned; + /** {@link #ACTIVE} or {@link #PENDING}. */ + public final String status; + + // match + public final Set sections; + public final List keyGlobs; + public final Set authorities; + public final long codeMin; + public final long codeMax; + public final Set srcProj; + public final Set tgtProj; + public final List paramsPresent; + public final List paramsAbsent; + /** ANY-of over the {@code datums} index column, i.e. over a parameter's value. */ + public final List datums; + /** ALL-absent over the same column. */ + public final List datumsAbsent; + public final Set probes; + public final Set classifications; + public final String statusFrom; + public final String statusTo; + + // expect + public final Set dimensions; + public final boolean allowStatusChange; + public final boolean allowInsideChange; + public final boolean allowNonFinite; + public final double magMin; + public final double magMax; + public final boolean magnitudeGiven; + + /** Mutable tallies, filled in by the diff. */ + public int matched; + public final List declined = new ArrayList(); + + @SuppressWarnings("unchecked") + Rule(Map m, int index) { + id = req(m, "id", index).toString(); + if (!id.matches("[A-Za-z0-9._-]+")) { + throw new IllegalArgumentException("rule " + id + ": id must match [A-Za-z0-9._-]+"); + } + reason = req(m, "reason", index).toString().trim(); + if (reason.isEmpty()) { + throw new IllegalArgumentException("rule " + id + ": reason must not be empty"); + } + Object exp = req(m, "expires", index); + expiresText = exp.toString(); + expires = parseDate(id, exp); + + Object rows = req(m, "expected_rows", index); + if (TBD.equals(rows.toString())) { + expectedRows = -1; + countPinned = false; + } else if (rows instanceof Number) { + expectedRows = ((Number) rows).intValue(); + countPinned = true; + if (expectedRows < 0) { + throw new IllegalArgumentException("rule " + id + ": expected_rows must be >= 0"); + } + } else { + throw new IllegalArgumentException( + "rule " + id + ": expected_rows must be an integer or the literal TBD, was: " + rows); + } + + Object st = m.get("status"); + status = st == null ? ACTIVE : st.toString(); + if (!ACTIVE.equals(status) && !PENDING.equals(status)) { + throw new IllegalArgumentException( + "rule " + id + ": status must be '" + ACTIVE + "' or '" + PENDING + "'"); + } + if (PENDING.equals(status) && countPinned && expectedRows != 0) { + throw new IllegalArgumentException("rule " + id + + ": a pending rule must not pin a non-zero expected_rows; use TBD"); + } + + Map match = sub(m, "match"); + sections = strSet(match, "sections"); + keyGlobs = strList(match, "keys"); + authorities = strSet(match, "authorities"); + codeMin = num(match, "code_min", Long.MIN_VALUE); + codeMax = num(match, "code_max", Long.MAX_VALUE); + srcProj = strSet(match, "src_proj"); + tgtProj = strSet(match, "tgt_proj"); + paramsPresent = strList(match, "params_present"); + paramsAbsent = strList(match, "params_absent"); + datums = strList(match, "datums"); + datumsAbsent = strList(match, "datums_absent"); + probes = intSet(match, "probes"); + classifications = strSet(match, "classifications"); + statusFrom = str(match, "status_from"); + statusTo = str(match, "status_to"); + checkKeys(id, "match", match, new String[]{"sections", "keys", "authorities", "code_min", + "code_max", "src_proj", "tgt_proj", "params_present", "params_absent", + "datums", "datums_absent", "probes", + "classifications", "status_from", "status_to"}); + + Map expect = sub(m, "expect"); + dimensions = strSet(expect, "dimensions"); + if (dimensions != null) { + for (String d : dimensions) { + if (!Arrays.asList(GoldenFormat.DIMENSIONS).contains(d)) { + throw new IllegalArgumentException("rule " + id + + ": unknown dimension '" + d + "'; expected one of " + + Arrays.toString(GoldenFormat.DIMENSIONS)); + } + } + } + allowStatusChange = bool(expect, "allow_status_change"); + allowInsideChange = bool(expect, "allow_inside_change"); + allowNonFinite = bool(expect, "allow_nonfinite"); + Map mag = sub(expect, "magnitude"); + magnitudeGiven = !mag.isEmpty(); + magMin = dbl(mag, "min", 0.0); + magMax = dbl(mag, "max", Double.POSITIVE_INFINITY); + checkKeys(id, "expect", expect, new String[]{"dimensions", "allow_status_change", + "allow_inside_change", "allow_nonfinite", "magnitude"}); + checkKeys(id, "rule", m, new String[]{"id", "reason", "expires", "expected_rows", + "status", "match", "expect"}); + } + + public boolean expired(java.util.Date today) { + return expires.before(today); + } + } + + private final List rules; + + public GoldenRules(List rules) { + this.rules = Collections.unmodifiableList(rules); + } + + public List rules() { + return rules; + } + + @SuppressWarnings("unchecked") + public static GoldenRules load(File f) throws IOException { + Reader r = new InputStreamReader(new java.io.FileInputStream(f), "UTF-8"); + try { + Object root = new Yaml().load(r); + if (root == null) return new GoldenRules(new ArrayList()); + if (!(root instanceof Map)) { + throw new IllegalArgumentException(f + ": top level must be a mapping"); + } + Map m = (Map) root; + Object version = m.get("version"); + if (version == null || !"1".equals(version.toString())) { + throw new IllegalArgumentException(f + ": unsupported or missing version: " + version); + } + Object rawRules = m.get("rules"); + List out = new ArrayList(); + if (rawRules != null) { + if (!(rawRules instanceof List)) { + throw new IllegalArgumentException(f + ": 'rules' must be a sequence"); + } + List list = (List) rawRules; + Set ids = new LinkedHashSet(); + for (int i = 0; i < list.size(); i++) { + Object o = list.get(i); + if (!(o instanceof Map)) { + throw new IllegalArgumentException(f + ": rules[" + i + "] must be a mapping"); + } + Rule rule = new Rule((Map) o, i); + if (!ids.add(rule.id)) { + throw new IllegalArgumentException(f + ": duplicate rule id '" + rule.id + "'"); + } + out.add(rule); + } + } + return new GoldenRules(out); + } finally { + r.close(); + } + } + + // --------------------------------------------------------------------------- yaml helpers + + private static Object req(Map m, String key, int index) { + Object v = m.get(key); + if (v == null) { + throw new IllegalArgumentException("rules[" + index + "]: missing required key '" + key + "'"); + } + return v; + } + + @SuppressWarnings("unchecked") + private static Map sub(Map m, String key) { + Object v = m.get(key); + if (v == null) return Collections.emptyMap(); + if (!(v instanceof Map)) { + throw new IllegalArgumentException("'" + key + "' must be a mapping"); + } + return (Map) v; + } + + /** + * Rejects unknown keys rather than ignoring them. A typo in a rule ({@code param_present} for + * {@code params_present}) would otherwise widen the rule to "everything" silently, which is the + * single easiest way to turn this suite into a rubber stamp. + */ + private static void checkKeys(String id, String where, Map m, String[] allowed) { + for (String k : m.keySet()) { + boolean ok = false; + for (int i = 0; i < allowed.length; i++) { + if (allowed[i].equals(k)) { + ok = true; + break; + } + } + if (!ok) { + throw new IllegalArgumentException("rule " + id + ": unknown key '" + k + "' in " + + where + "; allowed: " + Arrays.toString(allowed)); + } + } + } + + @SuppressWarnings("unchecked") + private static List strList(Map m, String key) { + Object v = m.get(key); + if (v == null) return null; + List out = new ArrayList(); + if (v instanceof List) { + for (Object o : (List) v) out.add(String.valueOf(o)); + } else { + out.add(String.valueOf(v)); + } + return out; + } + + private static Set strSet(Map m, String key) { + List l = strList(m, key); + return l == null ? null : new LinkedHashSet(l); + } + + @SuppressWarnings("unchecked") + private static Set intSet(Map m, String key) { + Object v = m.get(key); + if (v == null) return null; + Set out = new LinkedHashSet(); + if (v instanceof List) { + for (Object o : (List) v) out.add(Integer.valueOf(o.toString())); + } else { + out.add(Integer.valueOf(v.toString())); + } + return out; + } + + private static String str(Map m, String key) { + Object v = m.get(key); + return v == null ? null : v.toString(); + } + + private static long num(Map m, String key, long dflt) { + Object v = m.get(key); + return v == null ? dflt : Long.parseLong(v.toString()); + } + + private static double dbl(Map m, String key, double dflt) { + Object v = m.get(key); + return v == null ? dflt : Double.parseDouble(v.toString()); + } + + private static boolean bool(Map m, String key) { + Object v = m.get(key); + if (v == null) return false; + if (v instanceof Boolean) return ((Boolean) v).booleanValue(); + return Boolean.parseBoolean(v.toString()); + } + + private static java.util.Date parseDate(String id, Object v) { + // snakeyaml resolves an unquoted ISO date to java.util.Date already; a quoted one arrives as + // a String. Accept both, and nothing else -- "next release" is not a date. + if (v instanceof java.util.Date) return (java.util.Date) v; + String s = v.toString().trim(); + if (!s.matches("\\d{4}-\\d{2}-\\d{2}")) { + throw new IllegalArgumentException( + "rule " + id + ": expires must be an ISO-8601 date (yyyy-MM-dd), was: " + s); + } + java.text.SimpleDateFormat fmt = new java.text.SimpleDateFormat("yyyy-MM-dd"); + fmt.setTimeZone(java.util.TimeZone.getTimeZone("UTC")); + fmt.setLenient(false); + try { + return fmt.parse(s); + } catch (java.text.ParseException e) { + throw new IllegalArgumentException("rule " + id + ": unparseable expires: " + s); + } + } + + // -------------------------------------------------------------------------------- globbing + + /** {@code *} matches any run of characters; everything else is literal. No other metacharacter. */ + public static boolean glob(String pattern, String value) { + return globAt(pattern, 0, value, 0); + } + + private static boolean globAt(String p, int pi, String v, int vi) { + while (pi < p.length()) { + char pc = p.charAt(pi); + if (pc == '*') { + // Collapse runs of '*', then try every split point. + while (pi < p.length() && p.charAt(pi) == '*') pi++; + if (pi == p.length()) return true; + for (int k = vi; k <= v.length(); k++) { + if (globAt(p, pi, v, k)) return true; + } + return false; + } + if (vi >= v.length() || v.charAt(vi) != pc) return false; + pi++; + vi++; + } + return vi == v.length(); + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/GoldenRulesTest.java b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenRulesTest.java new file mode 100644 index 0000000..04897cd --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/GoldenRulesTest.java @@ -0,0 +1,333 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Schema validation for {@code rules.yaml}, and a load of the real committed file. + * + *

The real-file test runs in the fast build too, not just under {@code -Pgolden}. A malformed rules + * file must break the build that introduced it, not the nightly golden sweep three days later. + */ +public class GoldenRulesTest { + + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + + private File yaml(String body) throws IOException { + File f = tmp.newFile("r" + System.nanoTime() + ".yaml"); + Writer w = new java.io.OutputStreamWriter(new java.io.FileOutputStream(f), "UTF-8"); + try { + w.write(body); + } finally { + w.close(); + } + return f; + } + + private void rejects(String body, String expectedFragment) throws IOException { + try { + GoldenRules.load(yaml(body)); + fail("should have rejected: " + body); + } catch (IllegalArgumentException e) { + assertTrue("wrong message: " + e.getMessage(), + e.getMessage().contains(expectedFragment)); + } + } + + private static final String OK_RULE = "version: 1\nrules:\n" + + " - id: A-B_1.2\n reason: because\n expires: 2099-01-01\n" + + " expected_rows: 5\n match:\n sections: [REG]\n"; + + @Test + public void acceptsAWellFormedRule() throws Exception { + List rules = GoldenRules.load(yaml(OK_RULE)).rules(); + assertEquals(1, rules.size()); + GoldenRules.Rule r = rules.get(0); + assertEquals("A-B_1.2", r.id); + assertEquals(5, r.expectedRows); + assertTrue(r.countPinned); + assertEquals(GoldenRules.ACTIVE, r.status); + assertNotNull(r.expires); + } + + @Test + public void acceptsTbdAsAnUnpinnedCount() throws Exception { + GoldenRules.Rule r = GoldenRules.load(yaml( + OK_RULE.replace("expected_rows: 5", "expected_rows: TBD"))).rules().get(0); + assertEquals(-1, r.expectedRows); + assertTrue(!r.countPinned); + } + + /** + * The single most important schema check. A typo like {@code param_present} for + * {@code params_present} would otherwise be ignored, widening the rule to "everything" — which is + * how a golden suite becomes a rubber stamp without anyone deciding to make it one. + */ + @Test + public void rejectsUnknownKeys() throws Exception { + rejects(OK_RULE.replace(" sections: [REG]", " section: [REG]"), + "unknown key 'section' in match"); + rejects(OK_RULE + " expect:\n dimension: [fy]\n", + "unknown key 'dimension' in expect"); + rejects(OK_RULE.replace(" reason: because", " reasons: because"), + "missing required key 'reason'"); + rejects(OK_RULE + " owner: someone\n", "unknown key 'owner' in rule"); + } + + @Test + public void requiresAnExplicitIsoExpiry() throws Exception { + rejects("version: 1\nrules:\n - id: A\n reason: r\n expected_rows: 1\n", + "missing required key 'expires'"); + rejects(OK_RULE.replace("expires: 2099-01-01", "expires: \"next release\""), + "expires must be an ISO-8601 date"); + rejects(OK_RULE.replace("expires: 2099-01-01", "expires: \"2099-13-45\""), + "unparseable expires"); + } + + @Test + public void rejectsBadDimensionNames() throws Exception { + rejects(OK_RULE + " expect:\n dimensions: [northing]\n", + "unknown dimension 'northing'"); + } + + @Test + public void rejectsDuplicateIdsAndBadIdCharacters() throws Exception { + rejects("version: 1\nrules:\n" + + " - id: A\n reason: r\n expires: 2099-01-01\n expected_rows: 1\n" + + " - id: A\n reason: r\n expires: 2099-01-01\n expected_rows: 1\n", + "duplicate rule id 'A'"); + rejects(OK_RULE.replace("id: A-B_1.2", "id: \"has space\""), + "id must match"); + } + + @Test + public void rejectsAnEmptyReason() throws Exception { + rejects(OK_RULE.replace("reason: because", "reason: \" \""), "reason must not be empty"); + } + + @Test + public void rejectsAPendingRuleWithANonZeroCount() throws Exception { + rejects(OK_RULE.replace(" expected_rows: 5", " status: pending\n expected_rows: 5"), + "pending rule must not pin a non-zero expected_rows"); + } + + @Test + public void rejectsAnUnknownStatus() throws Exception { + rejects(OK_RULE.replace(" expected_rows: 5", " status: maybe\n expected_rows: 5"), + "status must be"); + } + + @Test + public void rejectsAnUnsupportedVersion() throws Exception { + rejects("version: 2\nrules: []\n", "unsupported or missing version"); + rejects("rules: []\n", "unsupported or missing version"); + } + + /** The committed file must parse, and every rule in it must carry a future expiry. */ + @Test + public void committedRulesFileIsValid() throws Exception { + File f = committedRulesFile(); + List rules = GoldenRules.load(f).rules(); + assertTrue("rules.yaml should carry the seeded declarations", rules.size() >= 6); + java.util.Date now = new java.util.Date(); + for (int i = 0; i < rules.size(); i++) { + GoldenRules.Rule r = rules.get(i); + assertTrue("rule " + r.id + " expired on " + r.expiresText + + " -- fold it into a new baseline and delete it", !r.expired(now)); + assertTrue("rule " + r.id + " needs a substantive reason", + r.reason.length() > 40); + } + } + + // ================================================================================================ + // expected_rows pinning: the control that stops a rule silently absorbing another rule's rows + // ================================================================================================ + + /** + * Locates {@code rules.yaml} and fails — rather than skipping — when it is not there. + * + *

This used to be an {@code Assume}, which is a hole of exactly the kind this class exists to + * close: a mistyped {@code -Dgolden.dir} would have turned every assertion below into a silent + * green. {@code golden.dir} is set unconditionally by {@code golden/pom.xml}'s surefire + * configuration and defaults to {@code .}, which is the module directory when the test is run + * from an IDE, so there is no legitimate way for this file to be absent. + */ + private static File committedRulesFile() { + File f = new File(System.getProperty("golden.dir", "."), "rules.yaml"); + assertTrue("no rules.yaml at " + f.getAbsolutePath() + + " -- golden.dir is wrong, and a skipped check is not a passed check", f.isFile()); + return f; + } + + /** + * The predicate under test, factored out so the committed-file assertion and its positive control + * exercise the same code. A control that runs a different implementation from the check + * proves nothing about the check. + * + * @return the ids of every {@code status: active} rule whose {@code expected_rows} is {@code TBD} + */ + static List unpinnedActiveRuleIds(List rules) { + List out = new java.util.ArrayList(); + for (int i = 0; i < rules.size(); i++) { + GoldenRules.Rule r = rules.get(i); + if (GoldenRules.ACTIVE.equals(r.status) && !r.countPinned) { + out.add(r.id); + } + } + return out; + } + + /** + * No {@code status: active} rule may carry {@code expected_rows: TBD}. + * + *

{@code expected_rows} is the only mechanism in this suite that notices a rule quietly + * changing size. It is exact and two-sided, and it has already earned its keep twice: it caught a + * rule claiming 270 rows when it should have claimed 95 — the extra 175 being another rule's, + * silently absorbed — and it caught {@code FAILCLOSED-UNCHECKED-ISE-REPLACED} growing from 55 to + * 71 by swallowing 16 grid rows. That second one was unpinned at the time, so the theft + * was invisible until the count was pinned; it is the reason this assertion exists rather than + * being left to review. + * + *

A {@code TBD} on an active rule is therefore not a to-do, it is a disabled control: the rule + * goes on claiming rows and nothing checks how many. {@code TBD} is legitimate only on a + * {@code status: pending} rule, which must match exactly zero rows and so has no count to pin. + * + *

Pin the count, do not widen the rule. If pinning exposes a rule taking rows that + * belong to another, the fix is the file order (rules are first-match-wins, most specific first), + * not a broader predicate that absorbs the difference. + */ + @Test + public void noActiveRuleMayLeaveItsExpectedRowsUnpinned() throws Exception { + List rules = GoldenRules.load(committedRulesFile()).rules(); + assertTrue("rules.yaml should carry the seeded declarations", rules.size() >= 6); + List unpinned = unpinnedActiveRuleIds(rules); + if (!unpinned.isEmpty()) { + fail(unpinned.size() + " of " + rules.size() + " rules are `status: active` with" + + " `expected_rows: TBD`, which switches off the only control that notices a rule" + + " changing size:\n " + join(unpinned, "\n ") + + "\n\nPin each one from a run you did yourself -- `mvn -Pgolden -pl golden -am" + + " verify` prints `rows claimed per rule`. If a count is not knowable yet because" + + " the change has not landed, the rule is `status: pending`, not `active`." + + " Never widen a rule's predicates to make a pinned count come out right."); + } + } + + /** + * The positive control for the assertion above, and the reason it can be believed. + * + *

A check that has never been observed rejecting anything is a claim, not a measurement. This + * drives {@link #unpinnedActiveRuleIds} — the same method the committed-file test uses — over + * three synthetic rules whose only difference is the thing being detected, and asserts that it + * flags the one that should be flagged and neither of the two that should not. So it discriminates + * rather than merely alarming, in both directions: + * + *

    + *
  • {@code active} + {@code TBD} — must be reported;
  • + *
  • {@code active} + a pinned integer — must not be;
  • + *
  • {@code pending} + {@code TBD} — must not be, because a pending rule matches zero rows by + * definition and has no count to pin.
  • + *
+ */ + @Test + public void theUnpinnedActiveRuleCheckIsDiscriminating() throws Exception { + String body = "version: 1\nrules:\n" + + " - id: ACTIVE-TBD\n status: active\n reason: the offender\n" + + " expires: 2099-01-01\n expected_rows: TBD\n" + + " match:\n sections: [REG]\n" + + " - id: ACTIVE-PINNED\n status: active\n reason: correctly pinned\n" + + " expires: 2099-01-01\n expected_rows: 7\n" + + " match:\n sections: [REG]\n" + + " - id: PENDING-TBD\n status: pending\n reason: not landed yet\n" + + " expires: 2099-01-01\n expected_rows: TBD\n" + + " match:\n sections: [REG]\n"; + List rules = GoldenRules.load(yaml(body)).rules(); + assertEquals("the fixture itself must parse as three rules", 3, rules.size()); + + List flagged = unpinnedActiveRuleIds(rules); + assertEquals("expected exactly the active+TBD rule to be flagged, got " + flagged, + 1, flagged.size()); + assertEquals("ACTIVE-TBD", flagged.get(0)); + } + + /** + * And the end-to-end half of the control: the committed-file assertion itself must fail when a + * rule in a real rules file is flipped to {@code active} + {@code TBD}. + * + *

{@link #theUnpinnedActiveRuleCheckIsDiscriminating} proves the predicate discriminates; + * this proves the test built on it actually fails, with a message that names the rule. + * The distinction is not academic — the retracted {@code NoGeoApiInCoreTest} precedent in this + * project was a check whose predicate was fine and whose surrounding assertion could never fire. + * It is not academic here either: the first version of this control failed on + * {@code "rules.yaml should carry the seeded declarations"}, because a one-rule fixture tripped + * the size guard before the TBD assertion was ever reached. The fixture below therefore carries + * six rules — five correctly pinned and one offender — so the offender has to be found + * among compliant siblings rather than by being the only rule present. + */ + @Test + public void theCommittedFileAssertionFailsOnAnInjectedTbd() throws Exception { + StringBuilder body = new StringBuilder("version: 1\nrules:\n"); + for (int i = 0; i < 5; i++) { + body.append(" - id: PINNED-SIBLING-").append(i).append("\n status: active\n") + .append(" reason: a correctly pinned neighbour, so the offender is not the") + .append(" only rule in the file\n") + .append(" expires: 2099-01-01\n expected_rows: ").append(i + 1).append("\n") + .append(" match:\n sections: [REG]\n"); + } + body.append(" - id: INJECTED-CONTROL\n status: active\n") + .append(" reason: a deliberately unpinned active rule, injected by the positive") + .append(" control\n") + .append(" expires: 2099-01-01\n expected_rows: TBD\n") + .append(" match:\n sections: [REG]\n"); + File injected = yaml(body.toString()); + String previous = System.getProperty("golden.dir"); + System.setProperty("golden.dir", injected.getParentFile().getAbsolutePath()); + File renamed = new File(injected.getParentFile(), "rules.yaml"); + assertTrue("could not stage the injected rules.yaml", injected.renameTo(renamed)); + try { + noActiveRuleMayLeaveItsExpectedRowsUnpinned(); + fail("the committed-file assertion passed on a rules.yaml containing an active TBD rule" + + " -- it cannot detect the thing it exists to detect"); + } catch (AssertionError expected) { + assertTrue("the failure must name the offending rule, was: " + expected.getMessage(), + expected.getMessage().contains("INJECTED-CONTROL")); + } finally { + if (previous == null) { + System.clearProperty("golden.dir"); + } else { + System.setProperty("golden.dir", previous); + } + } + } + + private static String join(List parts, String sep) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < parts.size(); i++) { + if (i > 0) { + sb.append(sep); + } + sb.append(parts.get(i)); + } + return sb.toString(); + } +} diff --git a/golden/src/test/java/org/locationtech/proj4j/golden/ProbesTest.java b/golden/src/test/java/org/locationtech/proj4j/golden/ProbesTest.java new file mode 100644 index 0000000..4ef6dbe --- /dev/null +++ b/golden/src/test/java/org/locationtech/proj4j/golden/ProbesTest.java @@ -0,0 +1,238 @@ +/* + * Copyright 2026 the Proj4J contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.locationtech.proj4j.golden; + +import org.junit.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Regression tests for the four defects in + * {@code core/src/test/java/org/locationtech/proj4j/proj/ProjectionGridRoundTripper.gridExtent} that + * this probe derivation must not reproduce, plus the DMS parsing the registry dictionaries need. + * + *

Every test here names the defect it guards, because the point of the file is that these four + * mistakes are easy to re-introduce and each one silently degrades the entire suite rather than + * failing. + */ +public class ProbesTest { + + private static List p(String projString) { + return Arrays.asList(InputSet.split(projString)); + } + + /** + * Defect 1. {@code gridExtent:123} seeds the maximum-latitude tracker with + * {@code Double.MIN_VALUE}, which is {@code +4.9e-324} — the smallest positive subnormal, NOT the + * most negative double. The guard at {@code :132} then fails for any all-negative-latitude CRS and + * it falls back to a 10-degree box on the equator. + */ + @Test + public void doubleMinValueIsPositive() { + // The trap itself, asserted so nobody "simplifies" the derivation back into it. + assertTrue("Double.MIN_VALUE is +4.9e-324, not negative", Double.MIN_VALUE > 0.0); + assertTrue(Double.MIN_VALUE < 1e-300); + } + + @Test + public void southernHemisphereCrsIsProbedInTheSouthernHemisphere() { + // American Samoa, nad27:5300 -- lat_1 = lat_2 = lat_0 = -14d16, all negative. + double[][] probes = Probes.derive(p("+proj=lcc +datum=NAD27 +lon_0=-170 " + + "+lat_1=-14d16 +lat_2=-14d16 +lat_0=-14d16")); + assertEquals(-14.0 - 16.0 / 60.0, probes[0][1], 1e-12); + for (int i = 0; i < probes.length; i++) { + assertTrue("probe " + i + " must be south of the equator, was " + probes[i][1], + probes[i][1] < 0.0); + } + + // UTM zone 1 South: no latitude parameter at all, only the +south flag. + double[][] utm = Probes.derive(p("+proj=utm +zone=1 +south +datum=WGS84 +units=m")); + assertEquals("zone 1's central meridian", -177.0, utm[0][0], 1e-12); + for (int i = 0; i < utm.length; i++) { + assertTrue("+south must not be probed on the equator, was " + utm[i][1], + utm[i][1] < 0.0); + } + } + + /** + * Defect 2. {@code updateLat:150} is {@code if (lat == 0.0) return;}, conflating an explicit + * {@code +lat_0=0} with an absent one. Every UTM zone and every equatorial Mercator carries + * {@code +lat_0=0}. + */ + @Test + public void explicitZeroLatitudeIsAValueNotAnAbsence() { + // lat_0=0 present, lat_1/lat_2 absent: the span is zero, so the default half-height applies, + // and the centre is 0 because that is what the definition says -- not because it defaulted. + double[][] a = Probes.derive(p("+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996")); + assertEquals(0.0, a[0][1], 0.0); + + // And a definition with lat_0=0 AND lat_1=60 must centre at 30, which the "0 means absent" + // reading would put at 60. + double[][] b = Probes.derive(p("+proj=lcc +lat_0=0 +lat_1=60 +lon_0=0")); + assertEquals(30.0, b[0][1], 1e-12); + } + + /** + * Defect 3. {@code gridExtent:136} is {@code gridWidth = 2 * dlat} with no cap, so + * {@code +lat_1=-70 +lat_2=70} produces a 280-degree-tall box whose corners are past both poles. + */ + @Test + public void boxHeightIsBounded() { + double[][] wide = Probes.derive(p("+proj=lcc +lat_1=-70 +lat_2=70 +lon_0=0")); + for (int i = 0; i < wide.length; i++) { + assertTrue("latitude must stay inside +/-" + Probes.LAT_LIMIT + ", was " + wide[i][1], + Math.abs(wide[i][1]) <= Probes.LAT_LIMIT); + } + double span = wide[3][1] - wide[1][1]; + assertTrue("half-height must be capped at " + Probes.MAX_LAT_HALF + ", box was " + span, + span <= 2 * Probes.MAX_LAT_HALF + 1e-9); + } + + /** + * Defect 4. {@code gridExtent:140-143} uses the same half-width on both axes, so a box that is + * 555 km tall is 190 km wide at 70 degrees north. Equal ground distance needs a + * {@code 1/cos(lat)} factor. + */ + @Test + public void longitudeHalfWidthIsCosineScaled() { + double[][] equator = Probes.derive(p("+proj=merc +lat_0=0 +lon_0=0")); + double[][] high = Probes.derive(p("+proj=tmerc +lat_0=70 +lon_0=0")); + double wEq = equator[2][0] - equator[1][0]; + double wHigh = high[2][0] - high[1][0]; + assertTrue("the high-latitude box must be wider in longitude (" + wHigh + " vs " + wEq + ")", + wHigh > wEq * 2.0); + // And bounded, so a polar CRS does not get an infinite width. + double[][] polar = Probes.derive(p("+proj=stere +lat_0=90 +lon_0=0")); + assertTrue(Math.abs(polar[2][0] - polar[1][0]) <= 2 * Probes.MAX_LON_HALF + 1e-9); + for (int i = 0; i < polar.length; i++) { + assertTrue(polar[i][0] >= -180.0 && polar[i][0] < 180.0); + } + } + + @Test + public void dmsFormsFromTheDictionariesParse() { + assertEquals(-85.0 - 50.0 / 60.0, Angles.parseDegrees("-85d50"), 1e-12); + assertEquals(30.5, Angles.parseDegrees("30d30"), 1e-12); + assertEquals(46.0 + 57.0 / 60.0 + 8.660 / 3600.0, Angles.parseDegrees("46d57'8.660\"N"), 1e-12); + assertEquals(7.0 + 26.0 / 60.0 + 22.5 / 3600.0, Angles.parseDegrees("7d26'22.500\"E"), 1e-12); + assertEquals(6.0, Angles.parseDegrees("6d0E"), 1e-12); + assertEquals(-14.0 - 16.0 / 60.0, Angles.parseDegrees("-14d16"), 1e-12); + assertEquals(-83.0 - 10.0 / 60.0, Angles.parseDegrees("83d10'W"), 1e-12); + assertEquals(30.0, Angles.parseDegrees("0.5235987755982988R"), 1e-9); + assertEquals(51.0, Angles.parseDegrees("51"), 0.0); + assertEquals(-0.5, Angles.parseDegrees("-.5"), 0.0); + // Rejected, so a nonsense token cannot become a probe: + assertTrue(Double.isNaN(Angles.parseDegrees(""))); + assertTrue(Double.isNaN(Angles.parseDegrees("abc"))); + assertTrue(Double.isNaN(Angles.parseDegrees("NaN"))); + assertTrue(Double.isNaN(Angles.parseDegrees("Infinity"))); + assertTrue(Double.isNaN(Angles.parseDegrees("0x1p3"))); + assertTrue(Double.isNaN(Angles.parseDegrees("1e5"))); + } + + @Test + public void longitudeWrapIsTotalAndUsesFloorNotALoop() { + assertEquals(0.0, Probes.wrapLon(360.0), 0.0); + assertEquals(-179.0, Probes.wrapLon(181.0), 0.0); + assertEquals(179.0, Probes.wrapLon(-181.0), 0.0); + assertEquals(-180.0, Probes.wrapLon(180.0), 0.0); + // 1e18 radians is the input that makes ProjectionMath.normalizeLongitude spin ~1.6e17 times. + double w = Probes.wrapLon(1e18); + assertTrue(w >= -180.0 && w < 180.0); + } + + /** + * The synthetic matrix's shape is part of the key set, so a change to it must be a deliberate, + * reviewed act followed by a probe and baseline regeneration -- not something that drifts. + */ + @Test + public void syntheticMatrixShapeIsPinned() { + assertEquals("all 188 PROJ 9.8.1 PROJ_HEAD names", 188, InputSet.PROJ_NAMES.length); + assertEquals("no duplicate +proj= candidates", + 188, new java.util.TreeSet(Arrays.asList(InputSet.PROJ_NAMES)).size()); + assertEquals(47, InputSet.MODIFIERS.length); + assertEquals(49, InputSet.ELLIPSOIDS.length); + assertEquals(6, InputSet.HOSTS.length); + // 188 proj names + 47 modifiers x 6 hosts + 49 ellipsoids + assertEquals(188 + 47 * 6 + 49, InputSet.syntheticSpecs().size()); + // and every key must be unique, or the generator's duplicate check would abort the run + java.util.Set keys = new java.util.TreeSet(); + List specs = InputSet.syntheticSpecs(); + for (int i = 0; i < specs.size(); i++) { + assertTrue("duplicate synthetic key " + specs.get(i)[0], keys.add(specs.get(i)[0])); + } + } + + /** The dictionaries are the input set; a change to their size must be noticed immediately. */ + @Test + public void registryDictionaryCountsAreUnchanged() throws Exception { + int total = 0; + for (int i = 0; i < RegistryDict.AUTHORITIES.length; i++) { + List defs = RegistryDict.read(RegistryDict.AUTHORITIES[i]); + assertEquals(RegistryDict.AUTHORITIES[i] + " def count", + RegistryDict.EXPECTED_COUNTS[i], defs.size()); + total += defs.size(); + } + assertEquals(RegistryDict.EXPECTED_TOTAL, total); + } + + @Test + public void committedProbeFileCoversEveryInputKey() throws Exception { + File goldenDir = new File(System.getProperty("golden.dir", ".")); + File probesFile = new File(goldenDir, "probes.tsv"); + org.junit.Assume.assumeTrue("no probes.tsv at " + probesFile, probesFile.isFile()); + Probes.Table t = Probes.read(probesFile); + + List defs = RegistryDict.readAll(); + for (int i = 0; i < defs.size(); i++) { + assertTrue("no probe for REG/" + defs.get(i).key(), + t.has(GoldenFormat.SECTION_REG, defs.get(i).key())); + } + List syn = InputSet.synthetic(); + for (int i = 0; i < syn.size(); i++) { + assertTrue("no probe for SYN/" + syn.get(i).key, + t.has(GoldenFormat.SECTION_SYN, syn.get(i).key)); + } + List pairs = InputSet.pairs(new File(goldenDir, "pairs.tsv"), + InputSet.index(defs)); + assertEquals("curated pair count", 200, pairs.size()); + for (int i = 0; i < pairs.size(); i++) { + assertTrue("no probe for PAIR/" + pairs.get(i).key, + t.has(GoldenFormat.SECTION_PAIR, pairs.get(i).key)); + } + } + + /** All 25 source/target {@code Datum.TYPE_*} combinations must be represented. */ + @Test + public void curatedPairsCoverEveryDatumTypeCombination() throws Exception { + File goldenDir = new File(System.getProperty("golden.dir", ".")); + File pairsFile = new File(goldenDir, "pairs.tsv"); + org.junit.Assume.assumeTrue("no pairs.tsv at " + pairsFile, pairsFile.isFile()); + java.util.Set combos = new java.util.TreeSet(); + java.io.BufferedReader r = GoldenFormat.reader(pairsFile); + try { + r.readLine(); + String line; + while ((line = r.readLine()) != null) { + if (line.isEmpty()) continue; + String[] c = GoldenFormat.split(line, 5); + combos.add(c[3] + "-" + c[4]); + } + } finally { + r.close(); + } + assertEquals("expected all 5x5 datum type combinations, got " + combos, 25, combos.size()); + } +} diff --git a/grids-us-legacy/README.md b/grids-us-legacy/README.md new file mode 100644 index 0000000..7e4325c --- /dev/null +++ b/grids-us-legacy/README.md @@ -0,0 +1,98 @@ +# proj4j-grids-us-legacy + +The interim US datum-shift grid pack. **1,318,352 bytes unpacked**, ~1.13 MiB as a jar. Resources only: +no code, no dependencies, nothing to compile. + +> ## ⚠️ This pack now adds only `alaska` +> +> **`conus` ships in `proj4j-epsg` as of 2026-08-01**, at `proj4/nad/conus`. The conterminous United +> States is therefore covered by `proj4j` + `proj4j-epsg` alone, with no opt-in artifact and no +> configuration — which is what retires the headline defect for a *default* deployment rather than for +> the subset of users who knew to add a grid pack. +> +> **What this pack still buys you is `alaska`, and nothing else.** Both copies of `conus` are the same +> upstream blob (`44b4900f`, SHA-256 `504d184f…`), so adding this pack changes no CONUS answer; it +> costs 1,053,928 further bytes to extend coverage to Alaska. Decide on that basis. +> +> The two copies live at **different resource paths on purpose** — `proj4/nad/conus` here, +> `proj4j-data/grids/conus` there — so the two jars never collide. That matters most for `INDEX`: +> `ClasspathResourceResolver.loadIndex()` reads it with `ClassLoader.getResource`, which returns the +> **first** match only, so two artifacts publishing `/proj4j-data/grids/INDEX` would make +> `Proj.availableGrids()` depend on classpath order. This pack keeps sole ownership of that prefix. + +Adding this artifact to a classpath extends real datum-shift coverage to **Alaska**. Its `conus` is +redundant with `proj4j-epsg`'s (identical bytes) but harmless. + +| resource | bytes | format | extent | nodes | also in `proj4j-epsg`? | +|---|---:|---|---|---:|---| +| `proj4j-data/grids/conus` | 264,424 | CTABLE V2 | 131°W–63°W, 20°N–50°N, 0.25° | 273 × 121 | **yes**, as `proj4/nad/conus` | +| `proj4j-data/grids/alaska` | 1,053,928 | CTABLE V2 | 194°W–128°W, 46°N–77°N, 0.125° | 529 × 249 | no — **the reason to add this pack** | +| `proj4j-data/grids/INDEX` | 13 | manifest | — | — | no | + +## Why these files, and why "legacy" + +`conus` and `alaska` are PROJ 9.8.1's own in-tree grids (`data/tests/conus`, `data/tests/alaska`) in +**CTABLE V2** format — bytes 0–10 are `CTABLE V2.0`, verified by reading the header, not by trusting the +directory name. `org.locationtech.proj4j.datum.CTABLEV2` **already reads that format**, so this pack costs +**zero new parsing code**. + +The modern equivalents are GeoTIFF (`us_noaa_conus.tif`, 173,029 B; `us_noaa_hawaii.tif`; +`us_noaa_prvi.tif`; …), which are smaller and cover more regions, but need a GeoTIFF reader that Proj4J +does not have yet. Hence *legacy*: this pack is the cheap interim, to be superseded by +`proj4j-grids-us` once the GeoTIFF reader lands. + +**`hawaii`, `prvi`, `stgeorge`, `stlrnc` and `stpaul` are not here**, and not because they were forgotten: +PROJ 9.8.1's tree contains no CTABLE V2 form of them. `git ls-tree 9.8.1:data/tests/` holds exactly two of +the seven US grids. The other five exist only as GeoTIFF in `PROJ-data`, so they arrive with the reader, +not before it. + +## The `INDEX` manifest + +`ClasspathResourceResolver` cannot enumerate a classpath prefix — the JDK offers no way to list resources +under a package. `INDEX` is a newline-delimited manifest, one resource name per line, that makes the +resolver `isEnumerable()`. Without it `Proj.availableGrids()` returns an empty list, and an empty list is +routinely misread as *"nothing installed"* rather than *"cannot enumerate"*. + +Keep `INDEX` sorted and in step with the directory when adding a grid. + +## Provenance + +| | | +|---|---| +| PROJ tag | `9.8.1` = `f08fa86c478c4bbbf003b1ec751dd84aa6eca486` | +| `conus` blob | `44b4900f3168a5b87794f41d201d03d5aea0b964` | +| `alaska` blob | `bb6be2ffbd55cb96416fd77cc07845f832883549` | + +Both are reproducible with `git -C cat-file blob `, which is the check to run if these bytes +are ever in doubt. + +## Licensing + +PROJ's `COPYING` at 9.8.1 states that "all source, **data files** and other contents of the PROJ package" +are available under its MIT licence, so these two grids are MIT, not Apache 2.0. MIT requires the notice +to travel with the file, so the repository-root **`LICENSE.PROJ`** is embedded in this jar at +`META-INF/LICENSE.PROJ` and declared in `pom.xml`'s ``. The same file covers `proj4j-epsg`'s +copy of `conus`. + +## Size budget + +`maven-enforcer-plugin` fails the build if the packaged jar exceeds `${grid.pack.max.bytes}` +(1,400,000 B). A data bump that blows the budget is a build failure here rather than a surprise in a +downstream container image. + +## Not in the reactor + +This module is deliberately **not** listed in the root `pom.xml` `` yet. Add it with: + +```xml + + core + epsg + geoapi + grids-us-legacy + conformance + +``` + +Note the root pom sets `maven.install.skip=true`, so inter-module dependencies resolve from the reactor +and builds must always pass `-am`. diff --git a/grids-us-legacy/pom.xml b/grids-us-legacy/pom.xml new file mode 100644 index 0000000..dc85309 --- /dev/null +++ b/grids-us-legacy/pom.xml @@ -0,0 +1,148 @@ + + 4.0.0 + + + io.github.emilevictor.neoproj4j + neoproj4j-modules + 1.3.1-SNAPSHOT + + + io.github.emilevictor.neoproj4j + neoproj4j-grids-us-legacy + jar + neoProj4J US grids (legacy CTABLE V2) + + Opt-in US datum-shift grid pack: PROJ 9.8.1's in-tree CTABLE V2 grids `conus` and `alaska`, + published under /proj4j-data/grids/ for the neoProj4J resolver chain. Resources only, no code, + no dependencies. Adding this artifact to a classpath retires the NAD27 -> NAD83 no-op defect + in the conterminous United States and Alaska with no reader work at all, because + org.locationtech.proj4j.datum.CTABLEV2 already reads the format. + + + + https://github.com/emilevictor/neoProj4J + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + + + MIT License (PROJ) + https://raw.githubusercontent.com/emilevictor/neoProj4J/develop/LICENSE.PROJ + + + + + https://github.com/emilevictor/neoProj4J + scm:git:https://github.com/emilevictor/neoProj4J.git + scm:git:git@github.com:emilevictor/neoProj4J.git + HEAD + + + + + true + true + + + false + false + + + 9.8.1 + f08fa86c478c4bbbf003b1ec751dd84aa6eca486 + 44b4900f3168a5b87794f41d201d03d5aea0b964 + bb6be2ffbd55cb96416fd77cc07845f832883549 + 264424 + 1053928 + + + 1400000 + + + + + + + maven-resources-plugin + 3.5.0 + + + embed-proj-license + process-resources + + copy-resources + + + ${project.build.outputDirectory}/META-INF + + + ${project.basedir}/.. + + LICENSE.PROJ + + false + + + + + + + + + maven-jar-plugin + + + + + org.locationtech.proj4j.grids.us.legacy + org.locationtech.proj4j.grids.us.legacy + ${proj.rev} + ${proj.rev.sha} + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + grid-pack-size-budget + verify + + enforce + + + + + ${grid.pack.max.bytes} + + ${project.build.directory}/${project.build.finalName}.jar + + + + + + + + + + + diff --git a/grids-us-legacy/src/main/resources/proj4j-data/grids/INDEX b/grids-us-legacy/src/main/resources/proj4j-data/grids/INDEX new file mode 100644 index 0000000..2073488 --- /dev/null +++ b/grids-us-legacy/src/main/resources/proj4j-data/grids/INDEX @@ -0,0 +1,2 @@ +alaska +conus diff --git a/grids-us-legacy/src/main/resources/proj4j-data/grids/alaska b/grids-us-legacy/src/main/resources/proj4j-data/grids/alaska new file mode 100644 index 0000000..bb6be2f Binary files /dev/null and b/grids-us-legacy/src/main/resources/proj4j-data/grids/alaska differ diff --git a/grids-us-legacy/src/main/resources/proj4j-data/grids/conus b/grids-us-legacy/src/main/resources/proj4j-data/grids/conus new file mode 100644 index 0000000..44b4900 Binary files /dev/null and b/grids-us-legacy/src/main/resources/proj4j-data/grids/conus differ diff --git a/locationtech_mark.png b/locationtech_mark.png deleted file mode 100644 index 57c4f9b..0000000 Binary files a/locationtech_mark.png and /dev/null differ diff --git a/notice.md b/notice.md deleted file mode 100644 index 82a2bb3..0000000 --- a/notice.md +++ /dev/null @@ -1,108 +0,0 @@ -## Eclipse Foundation Software User Agreement - -April 9, 2014 - -### Usage Of Content - -THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE -PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR -THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE -THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE -AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT -AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY -NOT USE THE CONTENT. - -### Applicable Licenses - -Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and -conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is -also available at [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html). For purposes -of the EPL, "Program" will mean the Content. - -Content includes, but is not limited to, source code, object code, documentation and other files maintained in the -Eclipse Foundation source code repository ("Repository") in software modules ("Modules") and made available as -downloadable archives ("Downloads"). - -* Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. - Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features"). -* Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins". -* A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged - as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list - of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature. -* Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may - contain a list of the names and version numbers of Included Features. - -The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). -The terms and conditions governing Features and Included Features should be contained in files named "license.html" -("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but -not limited to the following locations: - -* The top-level (root) directory -* Plug-in and Fragment directories -* Inside Plug-ins and Fragments packaged as JARs -* Sub-directories of the directory named "src" of certain Plug-ins -* Feature directories - -Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined -below), you must agree to a license ("Feature Update License") during the installation process. If the Feature contains -Included Features, the Feature Update License should either provide you with the terms and conditions governing the -Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" -property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update -Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the -associated Content in that directory. - -THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR -TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO): - -* Eclipse Distribution License Version 1.0 (available at - [http://www.eclipse.org/licenses/edl-v1.0.html](http://www.eclipse.org/licenses/edl-v10.html)) -* Common Public License Version 1.0 (available at - [http://www.eclipse.org/legal/cpl-v10.html](http://www.eclipse.org/legal/cpl-v10.html)) -* Apache Software License 1.1 (available at - [http://www.apache.org/licenses/LICENSE](http://www.apache.org/licenses/LICENSE)) -* Apache Software License 2.0 (available at - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)) -* Mozilla Public License Version 1.1 (available at - [http://www.mozilla.org/MPL/MPL-1.1.html](http://www.mozilla.org/MPL/MPL-1.1.html)) - -IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature -License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and -conditions govern that particular Content. - -### Use of Provisioning Technology - -The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and -the Eclipse Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, -documentation, information and/or other materials (collectively "Installable Software"). This capability is provided -with the intent of allowing such users to install, extend and update Eclipse-based products. Information about packaging -Installable Software is available at -[http://eclipse.org/equinox/p2/repository_packaging.html](http://eclipse.org/equinox/p2/repository_packaging.html) -("Specification"). - -You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for -enabling the applicable license agreements relating to the Installable Software to be presented to, and accepted by, the -users of the Provisioning Technology in accordance with the Specification. By using Provisioning Technology in such a -manner and making it available in accordance with the Specification, you further acknowledge your agreement to, and the -acquisition of all necessary rights to permit the following: - -1. A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology on a - machine ("Target Machine") with the intent of installing, extending or updating the functionality of an - Eclipse-based product. -2. During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion - thereof to be accessed and copied to the Target Machine. -3. Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the - Installable Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed - from the Target Machine in accordance with the Specification. Such Installable Software Agreement must inform the - user of the terms and conditions that govern the Installable Software and must solicit acceptance by the end user in - the manner prescribed in such Installable Software Agreement. Upon such indication of agreement by the user, the - provisioning Technology will complete installation of the Installable Software. - -### Cryptography - -Content may contain encryption software. The country in which you are currently may have restrictions on the import, -possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, -please check the country's laws, regulations and policies concerning the import, possession, or use, and re-export of -encryption software, to see if this is permitted. - -Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, -or both. diff --git a/pom.xml b/pom.xml index 0fead49..58cd278 100644 --- a/pom.xml +++ b/pom.xml @@ -1,18 +1,38 @@ 4.0.0 - org.locationtech.proj4j - proj4j-modules + io.github.emilevictor.neoproj4j + neoproj4j-modules + jgitver plugin always overrides the version set here. + + NOTE: this literal is DEAD in any normal build - jgitver rewrites it from the git tag. It is + live only when jgitver is bypassed (`-Djgitver.skip=true`, which every scratch-repo build + needs), and a build that publishes under it would publish 1.3.1-SNAPSHOT. See + HOWTORELEASE.txt, "Tag first". --> 1.3.1-SNAPSHOT pom - Proj4J Root - https://github.com/locationtech/proj4j - Java port of the Proj.4 library for coordinate reprojection + neoProj4J Root + + https://github.com/emilevictor/neoProj4J + neoProj4J - a fork of LocationTech Proj4J brought to PROJ 9.8.1 parity. Java port of + the PROJ library for coordinate reprojection. @@ -21,12 +41,19 @@ + - https://github.com/locationtech/proj4j.git - scm:git:https://github.com/locationtech/proj4j.git + https://github.com/emilevictor/neoProj4J + scm:git:https://github.com/emilevictor/neoProj4J.git + scm:git:git@github.com:emilevictor/neoProj4J.git HEAD + echeipesh @@ -43,6 +70,14 @@ Grigory Pomadchin https://github.com/pomadchin + + emilevictor + Emile Victor + https://github.com/emilevictor + + neoProj4J fork maintainer + + @@ -139,21 +174,6 @@ - - eclipse - - - repo.eclipse.org - Proj4J Repository - Releases - https://repo.eclipse.org/content/repositories/proj4j-releases/ - - - repo.eclipse.org - Proj4J Repository - Snapshots - https://repo.eclipse.org/content/repositories/proj4j-snapshots/ - - - central @@ -185,17 +205,85 @@ + + + golden + + golden + + + + + bench + + benchmark + + + + + bench-ab + + benchmark-ab + + core epsg geoapi + + grids-us-legacy + + db + + conformance - true + + false true - true